ZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmggYi9jb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oCmluZGV4IGY4MjA5OTkuLmUzYjIxYzUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmgKKysrIGIvY29yZS9pbmNsdWRlL2Zkcm0vZnhfY3J5cHQuaApAQCAtMTMsMTMgKzEzLDI2IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi12b2lkIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUsIGNvbnN0IHVpbnQ4X3QqIGtleSwgRlhfRFdPUkQga2V5bGVuKTsKK3ZvaWQgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2sodWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBrZXlsZW4pOwogdm9pZCBDUllQVF9BcmNGb3VyU2V0dXAodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCoga2V5LCBGWF9EV09SRCBsZW5ndGgpOwogdm9pZCBDUllQVF9BcmNGb3VyQ3J5cHQodm9pZCogY29udGV4dCwgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSk7Ci12b2lkIENSWVBUX0FFU1NldEtleSh2b2lkKiBjb250ZXh0LCBGWF9EV09SRCBibG9ja2xlbiwgY29uc3QgdWludDhfdCoga2V5LCBGWF9EV09SRCBrZXlsZW4sIEZYX0JPT0wgYkVuY3J5cHQpOwordm9pZCBDUllQVF9BRVNTZXRLZXkodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJsb2NrbGVuLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoga2V5LAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQga2V5bGVuLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5jcnlwdCk7CiB2b2lkIENSWVBUX0FFU1NldElWKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGl2KTsKLXZvaWQgQ1JZUFRfQUVTRGVjcnlwdCh2b2lkKiBjb250ZXh0LCB1aW50OF90KiBkZXN0LCBjb25zdCB1aW50OF90KiBzcmMsIEZYX0RXT1JEIHNpemUpOwotdm9pZCBDUllQVF9BRVNFbmNyeXB0KHZvaWQqIGNvbnRleHQsIHVpbnQ4X3QqIGRlc3QsIGNvbnN0IHVpbnQ4X3QqIHNyYywgRlhfRFdPUkQgc2l6ZSk7Cit2b2lkIENSWVBUX0FFU0RlY3J5cHQodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplKTsKK3ZvaWQgQ1JZUFRfQUVTRW5jcnlwdCh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUpOwogdm9pZCBDUllQVF9NRDVHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90IGRpZ2VzdFsxNl0pOwogdm9pZCBDUllQVF9NRDVTdGFydCh2b2lkKiBjb250ZXh0KTsKIHZvaWQgQ1JZUFRfTUQ1VXBkYXRlKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUpOwpAQCAtMjgsMTkgKzQxLDI4IEBACiB2b2lkIENSWVBUX1NIQTFTdGFydCh2b2lkKiBjb250ZXh0KTsKIHZvaWQgQ1JZUFRfU0hBMVVwZGF0ZSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKTsKIHZvaWQgQ1JZUFRfU0hBMUZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFsyMF0pOwotdm9pZCBDUllQVF9TSEEyNTZHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90IGRpZ2VzdFszMl0pOwordm9pZCBDUllQVF9TSEEyNTZHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpZ2VzdFszMl0pOwogdm9pZCBDUllQVF9TSEEyNTZTdGFydCh2b2lkKiBjb250ZXh0KTsKIHZvaWQgQ1JZUFRfU0hBMjU2VXBkYXRlKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUpOwogdm9pZCBDUllQVF9TSEEyNTZGaW5pc2godm9pZCogY29udGV4dCwgdWludDhfdCBkaWdlc3RbMzJdKTsKIHZvaWQgQ1JZUFRfU0hBMzg0U3RhcnQodm9pZCogY29udGV4dCk7CiB2b2lkIENSWVBUX1NIQTM4NFVwZGF0ZSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKTsKIHZvaWQgQ1JZUFRfU0hBMzg0RmluaXNoKHZvaWQqIGNvbnRleHQsIHVpbnQ4X3QgZGlnZXN0WzQ4XSk7Ci12b2lkIENSWVBUX1NIQTM4NEdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUsIHVpbnQ4X3QgZGlnZXN0WzQ4XSk7Cit2b2lkIENSWVBUX1NIQTM4NEdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlnZXN0WzQ4XSk7CiB2b2lkIENSWVBUX1NIQTUxMlN0YXJ0KHZvaWQqIGNvbnRleHQpOwogdm9pZCBDUllQVF9TSEE1MTJVcGRhdGUodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSk7CiB2b2lkIENSWVBUX1NIQTUxMkZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFs2NF0pOwotdm9pZCBDUllQVF9TSEE1MTJHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90IGRpZ2VzdFs2NF0pOwotdm9pZCBDUllQVF9TZXRQdWJLZXlEZWNyeXB0b3IoRlhfQk9PTCAoKmZ1bmMpKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90KiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfbGVuKSk7Cit2b2lkIENSWVBUX1NIQTUxMkdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlnZXN0WzY0XSk7Cit2b2lkIENSWVBUX1NldFB1YktleURlY3J5cHRvcihGWF9CT09MICgqZnVuYykoY29uc3QgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGF0YV9sZW4pKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgKaW5kZXggNTg3N2UxMS4uYmZhMDUxZSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oCkBAIC0zOSwxMTAgKzM5LDk1IEBACiBjbGFzcyBJUERGX1BhZ2VNb2R1bGU7CiBjbGFzcyBJUERGX1JlbmRlck1vZHVsZTsKIAotY2xhc3MgQ1BERl9Nb2R1bGVNZ3IKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgQ1BERl9Nb2R1bGVNZ3IqIEdldCgpOwotICAgIHN0YXRpYyB2b2lkIENyZWF0ZSgpOwotICAgIHN0YXRpYyB2b2lkIERlc3Ryb3koKTsKLSAgICBzdGF0aWMgY29uc3QgaW50IGtGaWxlQnVmU2l6ZSA9IDUxMjsKK2NsYXNzIENQREZfTW9kdWxlTWdyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDUERGX01vZHVsZU1nciogR2V0KCk7CisgIHN0YXRpYyB2b2lkIENyZWF0ZSgpOworICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0ZpbGVCdWZTaXplID0gNTEyOwogCi0gICAgdm9pZCBTZXRDb2RlY01vZHVsZShDQ29kZWNfTW9kdWxlTWdyKiBwTW9kdWxlKQotICAgIHsKLSAgICAgICAgbV9wQ29kZWNNb2R1bGUgPSBwTW9kdWxlOwotICAgIH0KLSAgICBDQ29kZWNfTW9kdWxlTWdyKiBHZXRDb2RlY01vZHVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wQ29kZWNNb2R1bGU7Ci0gICAgfQorICB2b2lkIFNldENvZGVjTW9kdWxlKENDb2RlY19Nb2R1bGVNZ3IqIHBNb2R1bGUpIHsgbV9wQ29kZWNNb2R1bGUgPSBwTW9kdWxlOyB9CisgIENDb2RlY19Nb2R1bGVNZ3IqIEdldENvZGVjTW9kdWxlKCkgeyByZXR1cm4gbV9wQ29kZWNNb2R1bGU7IH0KIAotICAgIHZvaWQgSW5pdFBhZ2VNb2R1bGUoKTsKKyAgdm9pZCBJbml0UGFnZU1vZHVsZSgpOwogCi0gICAgdm9pZCBJbml0UmVuZGVyTW9kdWxlKCk7CisgIHZvaWQgSW5pdFJlbmRlck1vZHVsZSgpOwogCi0gICAgdm9pZCBTZXREb3dubG9hZENhbGxiYWNrKEZYX0JPT0wgKCpjYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpKTsKKyAgdm9pZCBTZXREb3dubG9hZENhbGxiYWNrKEZYX0JPT0wgKCpjYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpKTsKIAotICAgIEZYX0JPT0wgRG93bmxvYWRNb2R1bGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOworICBGWF9CT09MIERvd25sb2FkTW9kdWxlKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKTsKIAotICAgIHZvaWQgTm90aWZ5TW9kdWxlQXZhaWxhYmxlKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKTsKKyAgdm9pZCBOb3RpZnlNb2R1bGVBdmFpbGFibGUoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOwogCi0gICAgSVBERl9SZW5kZXJNb2R1bGUqIEdldFJlbmRlck1vZHVsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wUmVuZGVyTW9kdWxlLmdldCgpOwotICAgIH0KKyAgSVBERl9SZW5kZXJNb2R1bGUqIEdldFJlbmRlck1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFJlbmRlck1vZHVsZS5nZXQoKTsgfQogCi0gICAgSVBERl9QYWdlTW9kdWxlKiBHZXRQYWdlTW9kdWxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYWdlTW9kdWxlLmdldCgpOwotICAgIH0KKyAgSVBERl9QYWdlTW9kdWxlKiBHZXRQYWdlTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wUGFnZU1vZHVsZS5nZXQoKTsgfQogCi0gICAgdm9pZCBMb2FkRW1iZWRkZWRHQjFDTWFwcygpOwotICAgIHZvaWQgTG9hZEVtYmVkZGVkQ05TMUNNYXBzKCk7Ci0gICAgdm9pZCBMb2FkRW1iZWRkZWRKYXBhbjFDTWFwcygpOwotICAgIHZvaWQgTG9hZEVtYmVkZGVkS29yZWExQ01hcHMoKTsKKyAgdm9pZCBMb2FkRW1iZWRkZWRHQjFDTWFwcygpOworICB2b2lkIExvYWRFbWJlZGRlZENOUzFDTWFwcygpOworICB2b2lkIExvYWRFbWJlZGRlZEphcGFuMUNNYXBzKCk7CisgIHZvaWQgTG9hZEVtYmVkZGVkS29yZWExQ01hcHMoKTsKIAotICAgIElDb2RlY19GYXhNb2R1bGUqIEdldEZheE1vZHVsZSgpOwotICAgIElDb2RlY19KcGVnTW9kdWxlKiBHZXRKcGVnTW9kdWxlKCk7Ci0gICAgSUNvZGVjX0pweE1vZHVsZSogR2V0SnB4TW9kdWxlKCk7Ci0gICAgSUNvZGVjX0piaWcyTW9kdWxlKiBHZXRKYmlnMk1vZHVsZSgpOwotICAgIElDb2RlY19JY2NNb2R1bGUqIEdldEljY01vZHVsZSgpOwotICAgIElDb2RlY19GbGF0ZU1vZHVsZSogR2V0RmxhdGVNb2R1bGUoKTsKKyAgSUNvZGVjX0ZheE1vZHVsZSogR2V0RmF4TW9kdWxlKCk7CisgIElDb2RlY19KcGVnTW9kdWxlKiBHZXRKcGVnTW9kdWxlKCk7CisgIElDb2RlY19KcHhNb2R1bGUqIEdldEpweE1vZHVsZSgpOworICBJQ29kZWNfSmJpZzJNb2R1bGUqIEdldEpiaWcyTW9kdWxlKCk7CisgIElDb2RlY19JY2NNb2R1bGUqIEdldEljY01vZHVsZSgpOworICBJQ29kZWNfRmxhdGVNb2R1bGUqIEdldEZsYXRlTW9kdWxlKCk7CiAKLSAgICB2b2lkIFJlZ2lzdGVyU2VjdXJpdHlIYW5kbGVyKAotICAgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lLAotICAgICAgICBDUERGX1NlY3VyaXR5SGFuZGxlciogKCpDcmVhdGVIYW5kbGVyKSh2b2lkKiBwYXJhbSksCi0gICAgICAgIHZvaWQqIHBhcmFtKTsKKyAgdm9pZCBSZWdpc3RlclNlY3VyaXR5SGFuZGxlcigKKyAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUsCisgICAgICBDUERGX1NlY3VyaXR5SGFuZGxlciogKCpDcmVhdGVIYW5kbGVyKSh2b2lkKiBwYXJhbSksCisgICAgICB2b2lkKiBwYXJhbSk7CiAKLSAgICBDUERGX1NlY3VyaXR5SGFuZGxlciogQ3JlYXRlU2VjdXJpdHlIYW5kbGVyKGNvbnN0IEZYX0NIQVIqIG5hbWUpOworICBDUERGX1NlY3VyaXR5SGFuZGxlciogQ3JlYXRlU2VjdXJpdHlIYW5kbGVyKGNvbnN0IEZYX0NIQVIqIG5hbWUpOwogCi0gICAgdm9pZCBTZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKTsKKyAgdm9pZCBTZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spOwogCi0gICAgdm9pZCogR2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsKKyAgdm9pZCogR2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsKIAotcHJpdmF0ZToKLSAgICBDUERGX01vZHVsZU1ncigpOwotICAgIH5DUERGX01vZHVsZU1ncigpOworIHByaXZhdGU6CisgIENQREZfTW9kdWxlTWdyKCk7CisgIH5DUERGX01vZHVsZU1ncigpOwogCi0gICAgQ0NvZGVjX01vZHVsZU1nciogbV9wQ29kZWNNb2R1bGU7CisgIENDb2RlY19Nb2R1bGVNZ3IqIG1fcENvZGVjTW9kdWxlOwogCi0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPElQREZfUmVuZGVyTW9kdWxlPiBtX3BSZW5kZXJNb2R1bGU7Ci0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPElQREZfUGFnZU1vZHVsZT4gbV9wUGFnZU1vZHVsZTsKKyAgbm9uc3RkOjp1bmlxdWVfcHRyPElQREZfUmVuZGVyTW9kdWxlPiBtX3BSZW5kZXJNb2R1bGU7CisgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJUERGX1BhZ2VNb2R1bGU+IG1fcFBhZ2VNb2R1bGU7CiAKLSAgICBGWF9CT09MICgqbV9wRG93bmxvYWRDYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOworICBGWF9CT09MICgqbV9wRG93bmxvYWRDYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpOwogCi0gICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX1NlY3VyaXR5SGFuZGxlck1hcDsKKyAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX1NlY3VyaXR5SGFuZGxlck1hcDsKIAotICAgIENGWF9Qcml2YXRlRGF0YSBtX3ByaXZhdGVEYXRhOworICBDRlhfUHJpdmF0ZURhdGEgbV9wcml2YXRlRGF0YTsKIH07CiAKLWNsYXNzIElQREZfUGFnZU1vZHVsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgfklQREZfUGFnZU1vZHVsZSgpIHt9CitjbGFzcyBJUERGX1BhZ2VNb2R1bGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBERl9QYWdlTW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgQ1BERl9Eb2NQYWdlRGF0YSogQ3JlYXRlRG9jRGF0YShDUERGX0RvY3VtZW50KiBwRG9jKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIFJlbGVhc2VEb2MoQ1BERl9Eb2N1bWVudCopID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgQ2xlYXJEb2MoQ1BERl9Eb2N1bWVudCopID0gMDsKLSAgICB2aXJ0dWFsIENQREZfRm9udEdsb2JhbHMqIEdldEZvbnRHbG9iYWxzKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBDbGVhclN0b2NrRm9udChDUERGX0RvY3VtZW50KiBwRG9jKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIE5vdGlmeUNKS0F2YWlsYWJsZSgpID0gMDsKLSAgICB2aXJ0dWFsIENQREZfQ29sb3JTcGFjZSogR2V0U3RvY2tDUyhpbnQgZmFtaWx5KSA9IDA7CisgIHZpcnR1YWwgQ1BERl9Eb2NQYWdlRGF0YSogQ3JlYXRlRG9jRGF0YShDUERGX0RvY3VtZW50KiBwRG9jKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlRG9jKENQREZfRG9jdW1lbnQqKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBDbGVhckRvYyhDUERGX0RvY3VtZW50KikgPSAwOworICB2aXJ0dWFsIENQREZfRm9udEdsb2JhbHMqIEdldEZvbnRHbG9iYWxzKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgQ2xlYXJTdG9ja0ZvbnQoQ1BERl9Eb2N1bWVudCogcERvYykgPSAwOworICB2aXJ0dWFsIHZvaWQgTm90aWZ5Q0pLQXZhaWxhYmxlKCkgPSAwOworICB2aXJ0dWFsIENQREZfQ29sb3JTcGFjZSogR2V0U3RvY2tDUyhpbnQgZmFtaWx5KSA9IDA7CiB9OwogCi1jbGFzcyBJUERGX1JlbmRlck1vZHVsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgfklQREZfUmVuZGVyTW9kdWxlKCkge30KK2NsYXNzIElQREZfUmVuZGVyTW9kdWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklQREZfUmVuZGVyTW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgQ1BERl9Eb2NSZW5kZXJEYXRhKiBDcmVhdGVEb2NEYXRhKENQREZfRG9jdW1lbnQqIHBEb2MpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgRGVzdHJveURvY0RhdGEoQ1BERl9Eb2NSZW5kZXJEYXRhKikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBDbGVhckRvY0RhdGEoQ1BERl9Eb2NSZW5kZXJEYXRhKikgPSAwOwotICAgIHZpcnR1YWwgQ1BERl9Eb2NSZW5kZXJEYXRhKiBHZXRSZW5kZXJEYXRhKCkgPSAwOwotICAgIHZpcnR1YWwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIENyZWF0ZVBhZ2VDYWNoZShDUERGX1BhZ2UqIHBQYWdlKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIERlc3Ryb3lQYWdlQ2FjaGUoQ1BERl9QYWdlUmVuZGVyQ2FjaGUqKSAgPSAwOwotICAgIHZpcnR1YWwgQ1BERl9SZW5kZXJDb25maWcqIEdldENvbmZpZygpID0gMDsKKyAgdmlydHVhbCBDUERGX0RvY1JlbmRlckRhdGEqIENyZWF0ZURvY0RhdGEoQ1BERl9Eb2N1bWVudCogcERvYykgPSAwOworICB2aXJ0dWFsIHZvaWQgRGVzdHJveURvY0RhdGEoQ1BERl9Eb2NSZW5kZXJEYXRhKikgPSAwOworICB2aXJ0dWFsIHZvaWQgQ2xlYXJEb2NEYXRhKENQREZfRG9jUmVuZGVyRGF0YSopID0gMDsKKyAgdmlydHVhbCBDUERGX0RvY1JlbmRlckRhdGEqIEdldFJlbmRlckRhdGEoKSA9IDA7CisgIHZpcnR1YWwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIENyZWF0ZVBhZ2VDYWNoZShDUERGX1BhZ2UqIHBQYWdlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBEZXN0cm95UGFnZUNhY2hlKENQREZfUGFnZVJlbmRlckNhY2hlKikgPSAwOworICB2aXJ0dWFsIENQREZfUmVuZGVyQ29uZmlnKiBHZXRDb25maWcoKSA9IDA7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZfTU9EVUxFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfb2JqZWN0cy5oCmluZGV4IGU2MzM2ZjYuLjkyNWYzZWYgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfb2JqZWN0cy5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfb2JqZWN0cy5oCkBAIC0yNiw3MjQgKzI2LDU5MCBAQAogY2xhc3MgQ1BERl9TdHJpbmc7CiBjbGFzcyBJRlhfRmlsZVJlYWQ7CiAKLSNkZWZpbmUgUERGT0JKX0lOVkFMSUQJCTAKLSNkZWZpbmUJUERGT0JKX0JPT0xFQU4JCTEKLSNkZWZpbmUgUERGT0JKX05VTUJFUgkJMgotI2RlZmluZSBQREZPQkpfU1RSSU5HCQkzCi0jZGVmaW5lIFBERk9CSl9OQU1FCQkJNAotI2RlZmluZSBQREZPQkpfQVJSQVkJCTUKLSNkZWZpbmUgUERGT0JKX0RJQ1RJT05BUlkJNgotI2RlZmluZSBQREZPQkpfU1RSRUFNCQk3Ci0jZGVmaW5lIFBERk9CSl9OVUxMCQkJOAotI2RlZmluZSBQREZPQkpfUkVGRVJFTkNFCTkKKyNkZWZpbmUgUERGT0JKX0lOVkFMSUQgMAorI2RlZmluZSBQREZPQkpfQk9PTEVBTiAxCisjZGVmaW5lIFBERk9CSl9OVU1CRVIgMgorI2RlZmluZSBQREZPQkpfU1RSSU5HIDMKKyNkZWZpbmUgUERGT0JKX05BTUUgNAorI2RlZmluZSBQREZPQkpfQVJSQVkgNQorI2RlZmluZSBQREZPQkpfRElDVElPTkFSWSA2CisjZGVmaW5lIFBERk9CSl9TVFJFQU0gNworI2RlZmluZSBQREZPQkpfTlVMTCA4CisjZGVmaW5lIFBERk9CSl9SRUZFUkVOQ0UgOQogCi10eXBlZGVmIElGWF9GaWxlU3RyZWFtKiAoKkZQREZfTFBGQ2xvbmVTdHJlYW1DYWxsYmFjaykoQ1BERl9TdHJlYW0gKnBTdHJlYW0sIHZvaWQqIHBVc2VyRGF0YSk7Ci1jbGFzcyBDUERGX09iamVjdAotewotcHVibGljOgordHlwZWRlZiBJRlhfRmlsZVN0cmVhbSogKCpGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2spKENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSk7CitjbGFzcyBDUERGX09iamVjdCB7CisgcHVibGljOgorICBpbnQgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fVHlwZTsgfQogCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VHlwZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9UeXBlOwotICAgIH0KKyAgRlhfRFdPUkQgR2V0T2JqTnVtKCkgY29uc3QgeyByZXR1cm4gbV9PYmpOdW07IH0KIAotICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE9iak51bSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9PYmpOdW07Ci0gICAgfQorICBGWF9EV09SRCBHZXRHZW5OdW0oKSBjb25zdCB7IHJldHVybiBtX0dlbk51bTsgfQogCi0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0R2VuTnVtKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0dlbk51bTsKLSAgICB9CisgIEZYX0JPT0wgSXNJZGVudGljYWwoQ1BERl9PYmplY3QqIHBPYmopIGNvbnN0OwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNJZGVudGljYWwoQ1BERl9PYmplY3QqIHBPYmopIGNvbnN0OworICBDUERGX09iamVjdCogQ2xvbmUoRlhfQk9PTCBiRGlyZWN0ID0gRkFMU0UpIGNvbnN0OwogCi0gICAgQ1BERl9PYmplY3QqICAgICAgICAgICAgICAgICAgICAgICAgQ2xvbmUoRlhfQk9PTCBiRGlyZWN0ID0gRkFMU0UpIGNvbnN0OworICBDUERGX09iamVjdCogQ2xvbmVSZWYoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpzKSBjb25zdDsKIAotICAgIENQREZfT2JqZWN0KiAgICAgICAgICAgICAgICAgICAgICAgIENsb25lUmVmKENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqcykgY29uc3Q7CisgIENQREZfT2JqZWN0KiBHZXREaXJlY3QoKSBjb25zdDsKIAotICAgIENQREZfT2JqZWN0KiAgICAgICAgICAgICAgICAgICAgICAgIEdldERpcmVjdCgpIGNvbnN0OworICB2b2lkIFJlbGVhc2UoKTsKIAotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2UoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3RyaW5nKCkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICBHZXRTdHJpbmcoKSBjb25zdDsKKyAgQ0ZYX0J5dGVTdHJpbmdDIEdldENvbnN0U3RyaW5nKCkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MgICAgICAgICAgICAgICAgICAgICBHZXRDb25zdFN0cmluZygpIGNvbnN0OworICBDRlhfV2lkZVN0cmluZyBHZXRVbmljb2RlVGV4dChDRlhfQ2hhck1hcCogcENoYXJNYXAgPSBOVUxMKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0TnVtYmVyKCkgY29uc3Q7CiAKLSAgICBDRlhfV2lkZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICBHZXRVbmljb2RlVGV4dChDRlhfQ2hhck1hcCogcENoYXJNYXAgPSBOVUxMKSBjb25zdDsKLSAgICBGWF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXROdW1iZXIoKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0TnVtYmVyMTYoKSBjb25zdDsKIAotICAgIEZYX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE51bWJlcjE2KCkgY29uc3Q7CisgIGludCBHZXRJbnRlZ2VyKCkgY29uc3Q7CiAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRJbnRlZ2VyKCkgY29uc3Q7CisgIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0OwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiAgICAgICAgICAgICAgICAgICAgR2V0RGljdCgpIGNvbnN0OworICBDUERGX0FycmF5KiBHZXRBcnJheSgpIGNvbnN0OwogCi0gICAgQ1BERl9BcnJheSogICAgICAgICAgICAgICAgICAgICAgICAgR2V0QXJyYXkoKSBjb25zdDsKKyAgdm9pZCBTZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CiAKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CisgIHZvaWQgU2V0VW5pY29kZVRleHQoY29uc3QgRlhfV0NIQVIqIHBVbmljb2RlcywgaW50IGxlbiA9IC0xKTsKIAotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldFVuaWNvZGVUZXh0KGNvbnN0IEZYX1dDSEFSKiBwVW5pY29kZXMsIGludCBsZW4gPSAtMSk7CisgIGludCBHZXREaXJlY3RUeXBlKCkgY29uc3Q7CiAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXREaXJlY3RUeXBlKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNNb2RpZmllZCgpIGNvbnN0IHsgcmV0dXJuIEZBTFNFOyB9CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc01vZGlmaWVkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgQ1BERl9PYmplY3QoRlhfRFdPUkQgdHlwZSkgOiBtX1R5cGUodHlwZSksIG1fT2JqTnVtKDApLCBtX0dlbk51bSgwKSB7IH0KLSAgICB+Q1BERl9PYmplY3QoKSB7IH0KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0cm95KCk7CisgcHJvdGVjdGVkOgorICBDUERGX09iamVjdChGWF9EV09SRCB0eXBlKSA6IG1fVHlwZSh0eXBlKSwgbV9PYmpOdW0oMCksIG1fR2VuTnVtKDApIHt9CisgIH5DUERGX09iamVjdCgpIHt9CisgIHZvaWQgRGVzdHJveSgpOwogCi0gICAgc3RhdGljIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAgT0JKRUNUX1JFRl9NQVhfREVQVEggPSAxMjg7Ci0gICAgc3RhdGljIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgc19uQ3VyUmVmRGVwdGg7Ci0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UeXBlOwotICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fT2JqTnVtOwotICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fR2VuTnVtOworICBzdGF0aWMgY29uc3QgaW50IE9CSkVDVF9SRUZfTUFYX0RFUFRIID0gMTI4OworICBzdGF0aWMgaW50IHNfbkN1clJlZkRlcHRoOworICBGWF9EV09SRCBtX1R5cGU7CisgIEZYX0RXT1JEIG1fT2JqTnVtOworICBGWF9EV09SRCBtX0dlbk51bTsKIAotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfSW5kaXJlY3RPYmplY3RzOwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfUGFyc2VyOwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfU3ludGF4UGFyc2VyOwotcHJpdmF0ZToKLSAgICBDUERGX09iamVjdChjb25zdCBDUERGX09iamVjdCYgc3JjKSB7fQotICAgIENQREZfT2JqZWN0KiBDbG9uZUludGVybmFsKEZYX0JPT0wgYkRpcmVjdCwgQ0ZYX01hcFB0clRvUHRyKiB2aXNpdGVkKSBjb25zdDsKKyAgZnJpZW5kIGNsYXNzIENQREZfSW5kaXJlY3RPYmplY3RzOworICBmcmllbmQgY2xhc3MgQ1BERl9QYXJzZXI7CisgIGZyaWVuZCBjbGFzcyBDUERGX1N5bnRheFBhcnNlcjsKKworIHByaXZhdGU6CisgIENQREZfT2JqZWN0KGNvbnN0IENQREZfT2JqZWN0JiBzcmMpIHt9CisgIENQREZfT2JqZWN0KiBDbG9uZUludGVybmFsKEZYX0JPT0wgYkRpcmVjdCwgQ0ZYX01hcFB0clRvUHRyKiB2aXNpdGVkKSBjb25zdDsKIH07Ci1jbGFzcyBDUERGX0Jvb2xlYW4gOiBwdWJsaWMgQ1BERl9PYmplY3QKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfQm9vbGVhbiA6IHB1YmxpYyBDUERGX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgQ1BERl9Cb29sZWFuKiBDcmVhdGUoRlhfQk9PTCB2YWx1ZSkgeworICAgIHJldHVybiBGWF9ORVcgQ1BERl9Cb29sZWFuKHZhbHVlKTsKKyAgfQogCi0gICAgc3RhdGljIENQREZfQm9vbGVhbioJQ3JlYXRlKEZYX0JPT0wgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gRlhfTkVXIENQREZfQm9vbGVhbih2YWx1ZSk7Ci0gICAgfQorICBDUERGX0Jvb2xlYW4oKSA6IENQREZfT2JqZWN0KFBERk9CSl9CT09MRUFOKSwgbV9iVmFsdWUoZmFsc2UpIHt9CisgIENQREZfQm9vbGVhbihGWF9CT09MIHZhbHVlKSA6IENQREZfT2JqZWN0KFBERk9CSl9CT09MRUFOKSwgbV9iVmFsdWUodmFsdWUpIHt9CiAKLSAgICBDUERGX0Jvb2xlYW4oKSA6IENQREZfT2JqZWN0KFBERk9CSl9CT09MRUFOKSwgbV9iVmFsdWUoZmFsc2UpIHsgfQotICAgIENQREZfQm9vbGVhbihGWF9CT09MIHZhbHVlKSA6IENQREZfT2JqZWN0KFBERk9CSl9CT09MRUFOKSwgbV9iVmFsdWUodmFsdWUpIHsgfQorICBGWF9CT09MIElkZW50aWNhbChDUERGX0Jvb2xlYW4qIHBPdGhlcikgY29uc3QgeworICAgIHJldHVybiBtX2JWYWx1ZSA9PSBwT3RoZXItPm1fYlZhbHVlOworICB9CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9Cb29sZWFuKiBwT3RoZXIpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iVmFsdWUgPT0gcE90aGVyLT5tX2JWYWx1ZTsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBGWF9CT09MCQkJCQltX2JWYWx1ZTsKLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX09iamVjdDsKKyBwcm90ZWN0ZWQ6CisgIEZYX0JPT0wgbV9iVmFsdWU7CisgIGZyaWVuZCBjbGFzcyBDUERGX09iamVjdDsKIH07Ci1jbGFzcyBDUERGX051bWJlciA6IHB1YmxpYyBDUERGX09iamVjdAotewotcHVibGljOgorY2xhc3MgQ1BERl9OdW1iZXIgOiBwdWJsaWMgQ1BERl9PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIENQREZfTnVtYmVyKiBDcmVhdGUoaW50IHZhbHVlKSB7IHJldHVybiBGWF9ORVcgQ1BERl9OdW1iZXIodmFsdWUpOyB9CiAKLSAgICBzdGF0aWMgQ1BERl9OdW1iZXIqCQlDcmVhdGUoaW50IHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYX05FVyBDUERGX051bWJlcih2YWx1ZSk7Ci0gICAgfQorICBzdGF0aWMgQ1BERl9OdW1iZXIqIENyZWF0ZShGWF9GTE9BVCB2YWx1ZSkgeworICAgIHJldHVybiBGWF9ORVcgQ1BERl9OdW1iZXIodmFsdWUpOworICB9CiAKLSAgICBzdGF0aWMgQ1BERl9OdW1iZXIqCQlDcmVhdGUoRlhfRkxPQVQgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gRlhfTkVXIENQREZfTnVtYmVyKHZhbHVlKTsKLSAgICB9CisgIHN0YXRpYyBDUERGX051bWJlciogQ3JlYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7CisgICAgcmV0dXJuIEZYX05FVyBDUERGX051bWJlcihzdHIpOworICB9CiAKLSAgICBzdGF0aWMgQ1BERl9OdW1iZXIqCQlDcmVhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpCi0gICAgewotICAgICAgICByZXR1cm4gRlhfTkVXIENQREZfTnVtYmVyKHN0cik7Ci0gICAgfQorICBzdGF0aWMgQ1BERl9OdW1iZXIqIENyZWF0ZShGWF9CT09MIGJJbnRlZ2VyLCB2b2lkKiBwRGF0YSkgeworICAgIHJldHVybiBGWF9ORVcgQ1BERl9OdW1iZXIoYkludGVnZXIsIHBEYXRhKTsKKyAgfQogCi0gICAgc3RhdGljIENQREZfTnVtYmVyKgkJQ3JlYXRlKEZYX0JPT0wgYkludGVnZXIsIHZvaWQqIHBEYXRhKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYX05FVyBDUERGX051bWJlcihiSW50ZWdlciwgcERhdGEpOwotICAgIH0KKyAgQ1BERl9OdW1iZXIoKSA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKGZhbHNlKSwgbV9JbnRlZ2VyKDApIHt9CiAKLSAgICBDUERGX051bWJlcigpIDogQ1BERl9PYmplY3QoUERGT0JKX05VTUJFUiksIG1fYkludGVnZXIoZmFsc2UpLCBtX0ludGVnZXIoMCkgeyB9CisgIENQREZfTnVtYmVyKEZYX0JPT0wgYkludGVnZXIsIHZvaWQqIHBEYXRhKTsKIAotICAgIENQREZfTnVtYmVyKEZYX0JPT0wgYkludGVnZXIsIHZvaWQqIHBEYXRhKTsKKyAgQ1BERl9OdW1iZXIoaW50IHZhbHVlKTsKIAotICAgIENQREZfTnVtYmVyKGludCB2YWx1ZSk7CisgIENQREZfTnVtYmVyKEZYX0ZMT0FUIHZhbHVlKTsKIAotICAgIENQREZfTnVtYmVyKEZYX0ZMT0FUIHZhbHVlKTsKKyAgQ1BERl9OdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOwogCi0gICAgQ1BERl9OdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOworICBGWF9CT09MIElkZW50aWNhbChDUERGX051bWJlciogcE90aGVyKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJCUlkZW50aWNhbChDUERGX051bWJlciogcE90aGVyKSBjb25zdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3RyaW5nKCkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCUdldFN0cmluZygpIGNvbnN0OworICB2b2lkIFNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiAKLSAgICB2b2lkCQkJCQlTZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOworICBGWF9CT09MIElzSW50ZWdlcigpIGNvbnN0IHsgcmV0dXJuIG1fYkludGVnZXI7IH0KIAotICAgIEZYX0JPT0wJCQkJCUlzSW50ZWdlcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iSW50ZWdlcjsKLSAgICB9CisgIGludCBHZXRJbnRlZ2VyKCkgY29uc3QgeyByZXR1cm4gbV9iSW50ZWdlciA/IG1fSW50ZWdlciA6IChpbnQpbV9GbG9hdDsgfQogCi0gICAgaW50CQkJCQkJR2V0SW50ZWdlcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iSW50ZWdlciA/IG1fSW50ZWdlciA6IChpbnQpbV9GbG9hdDsKLSAgICB9CisgIEZYX0ZMT0FUIEdldE51bWJlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9iSW50ZWdlciA/IChGWF9GTE9BVCltX0ludGVnZXIgOiBtX0Zsb2F0OworICB9CiAKLSAgICBGWF9GTE9BVAkJCQlHZXROdW1iZXIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYkludGVnZXIgPyAoRlhfRkxPQVQpbV9JbnRlZ2VyIDogbV9GbG9hdDsKLSAgICB9CisgIHZvaWQgU2V0TnVtYmVyKEZYX0ZMT0FUIHZhbHVlKTsKIAotICAgIHZvaWQJCQkJCVNldE51bWJlcihGWF9GTE9BVCB2YWx1ZSk7CisgIEZYX0ZMT0FUIEdldE51bWJlcjE2KCkgY29uc3QgeyByZXR1cm4gR2V0TnVtYmVyKCk7IH0KIAotICAgIEZYX0ZMT0FUCQkJR2V0TnVtYmVyMTYoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldE51bWJlcigpOwotICAgIH0KKyAgRlhfRkxPQVQgR2V0RmxvYXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fYkludGVnZXIgPyAoRlhfRkxPQVQpbV9JbnRlZ2VyIDogbV9GbG9hdDsKKyAgfQogCi0gICAgRlhfRkxPQVQJCQkJR2V0RmxvYXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYkludGVnZXIgPyAoRlhfRkxPQVQpbV9JbnRlZ2VyIDogbV9GbG9hdDsKLSAgICB9Ci1wcm90ZWN0ZWQ6CisgcHJvdGVjdGVkOgorICBGWF9CT09MIG1fYkludGVnZXI7CiAKLSAgICBGWF9CT09MCQkJCQltX2JJbnRlZ2VyOworICB1bmlvbiB7CisgICAgaW50IG1fSW50ZWdlcjsKIAotICAgIHVuaW9uIHsKLQotICAgICAgICBpbnQJCQkJCW1fSW50ZWdlcjsKLQotICAgICAgICBGWF9GTE9BVAkJCW1fRmxvYXQ7Ci0gICAgfTsKLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX09iamVjdDsKKyAgICBGWF9GTE9BVCBtX0Zsb2F0OworICB9OworICBmcmllbmQgY2xhc3MgQ1BERl9PYmplY3Q7CiB9OwotY2xhc3MgQ1BERl9TdHJpbmcgOiBwdWJsaWMgQ1BERl9PYmplY3QKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfU3RyaW5nIDogcHVibGljIENQREZfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDUERGX1N0cmluZyogQ3JlYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsIEZYX0JPT0wgYkhleCA9IEZBTFNFKSB7CisgICAgcmV0dXJuIEZYX05FVyBDUERGX1N0cmluZyhzdHIsIGJIZXgpOworICB9CiAKLSAgICBzdGF0aWMgQ1BERl9TdHJpbmcqCQlDcmVhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgRlhfQk9PTCBiSGV4ID0gRkFMU0UpCi0gICAgewotICAgICAgICByZXR1cm4gRlhfTkVXIENQREZfU3RyaW5nKHN0ciwgYkhleCk7Ci0gICAgfQorICBzdGF0aWMgQ1BERl9TdHJpbmcqIENyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSB7CisgICAgcmV0dXJuIEZYX05FVyBDUERGX1N0cmluZyhzdHIpOworICB9CiAKLSAgICBzdGF0aWMgQ1BERl9TdHJpbmcqCQlDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLSAgICB7Ci0gICAgICAgIHJldHVybiBGWF9ORVcgQ1BERl9TdHJpbmcoc3RyKTsKLSAgICB9CisgIENQREZfU3RyaW5nKCkgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9iSGV4KEZBTFNFKSB7fQogCi0gICAgQ1BERl9TdHJpbmcoKSA6IENQREZfT2JqZWN0KFBERk9CSl9TVFJJTkcpLCBtX2JIZXgoRkFMU0UpIHsgfQorICBDUERGX1N0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBGWF9CT09MIGJIZXggPSBGQUxTRSkKKyAgICAgIDogQ1BERl9PYmplY3QoUERGT0JKX1NUUklORyksIG1fU3RyaW5nKHN0ciksIG1fYkhleChiSGV4KSB7fQogCi0gICAgQ1BERl9TdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgRlhfQk9PTCBiSGV4ID0gRkFMU0UpCi0gICAgICAgIDogQ1BERl9PYmplY3QoUERGT0JKX1NUUklORyksIG1fU3RyaW5nKHN0ciksIG1fYkhleChiSGV4KSB7Ci0gICAgfQorICBDUERGX1N0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKIAotICAgIENQREZfU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOworICBDRlhfQnl0ZVN0cmluZyYgR2V0U3RyaW5nKCkgeyByZXR1cm4gbV9TdHJpbmc7IH0KIAotICAgIENGWF9CeXRlU3RyaW5nJgkJCUdldFN0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9TdHJpbmc7Ci0gICAgfQorICBGWF9CT09MIElkZW50aWNhbChDUERGX1N0cmluZyogcE90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG1fU3RyaW5nID09IHBPdGhlci0+bV9TdHJpbmc7CisgIH0KIAotICAgIEZYX0JPT0wJCQkJCUlkZW50aWNhbChDUERGX1N0cmluZyogcE90aGVyKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU3RyaW5nID09IHBPdGhlci0+bV9TdHJpbmc7Ci0gICAgfQorICBGWF9CT09MIElzSGV4KCkgY29uc3QgeyByZXR1cm4gbV9iSGV4OyB9CiAKLSAgICBGWF9CT09MCQkJCQlJc0hleCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iSGV4OwotICAgIH0KLXByb3RlY3RlZDoKKyBwcm90ZWN0ZWQ6CisgIENGWF9CeXRlU3RyaW5nIG1fU3RyaW5nOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQltX1N0cmluZzsKLQotICAgIEZYX0JPT0wJCQkJCW1fYkhleDsKLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX09iamVjdDsKKyAgRlhfQk9PTCBtX2JIZXg7CisgIGZyaWVuZCBjbGFzcyBDUERGX09iamVjdDsKIH07Ci1jbGFzcyBDUERGX05hbWUgOiBwdWJsaWMgQ1BERl9PYmplY3QKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfTmFtZSA6IHB1YmxpYyBDUERGX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgQ1BERl9OYW1lKiBDcmVhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgeworICAgIHJldHVybiBGWF9ORVcgQ1BERl9OYW1lKHN0cik7CisgIH0KIAotICAgIHN0YXRpYyBDUERGX05hbWUqCQlDcmVhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikKLSAgICB7Ci0gICAgICAgIHJldHVybiBGWF9ORVcgQ1BERl9OYW1lKHN0cik7Ci0gICAgfQorICBzdGF0aWMgQ1BERl9OYW1lKiBDcmVhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIHsKKyAgICByZXR1cm4gRlhfTkVXIENQREZfTmFtZShzdHIpOworICB9CiAKLSAgICBzdGF0aWMgQ1BERl9OYW1lKgkJQ3JlYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYX05FVyBDUERGX05hbWUoc3RyKTsKLSAgICB9CisgIHN0YXRpYyBDUERGX05hbWUqIENyZWF0ZShjb25zdCBGWF9DSEFSKiBzdHIpIHsgcmV0dXJuIEZYX05FVyBDUERGX05hbWUoc3RyKTsgfQogCi0gICAgc3RhdGljIENQREZfTmFtZSoJCUNyZWF0ZShjb25zdCBGWF9DSEFSKiBzdHIpCi0gICAgewotICAgICAgICByZXR1cm4gRlhfTkVXIENQREZfTmFtZShzdHIpOwotICAgIH0KKyAgQ1BERl9OYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpCisgICAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OQU1FKSwgbV9OYW1lKHN0cikge30KKyAgQ1BERl9OYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKQorICAgICAgOiBDUERGX09iamVjdChQREZPQkpfTkFNRSksIG1fTmFtZShzdHIpIHt9CisgIENQREZfTmFtZShjb25zdCBGWF9DSEFSKiBzdHIpIDogQ1BERl9PYmplY3QoUERGT0JKX05BTUUpLCBtX05hbWUoc3RyKSB7fQogCi0gICAgQ1BERl9OYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIDogQ1BERl9PYmplY3QoUERGT0JKX05BTUUpLCBtX05hbWUoc3RyKSB7IH0KLSAgICBDUERGX05hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIDogQ1BERl9PYmplY3QoUERGT0JKX05BTUUpLCBtX05hbWUoc3RyKSB7IH0KLSAgICBDUERGX05hbWUoY29uc3QgRlhfQ0hBUiogc3RyKSA6IENQREZfT2JqZWN0KFBERk9CSl9OQU1FKSwgbV9OYW1lKHN0cikgeyB9CisgIENGWF9CeXRlU3RyaW5nJiBHZXRTdHJpbmcoKSB7IHJldHVybiBtX05hbWU7IH0KIAotICAgIENGWF9CeXRlU3RyaW5nJgkJCUdldFN0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9OYW1lOwotICAgIH0KKyAgRlhfQk9PTCBJZGVudGljYWwoQ1BERl9OYW1lKiBwT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9OYW1lID09IHBPdGhlci0+bV9OYW1lOworICB9CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9OYW1lKiBwT3RoZXIpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9OYW1lID09IHBPdGhlci0+bV9OYW1lOwotICAgIH0KLXByb3RlY3RlZDoKLQotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9OYW1lOwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfT2JqZWN0OworIHByb3RlY3RlZDoKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9OYW1lOworICBmcmllbmQgY2xhc3MgQ1BERl9PYmplY3Q7CiB9OwotY2xhc3MgQ1BERl9BcnJheSA6IHB1YmxpYyBDUERGX09iamVjdAotewotcHVibGljOgorY2xhc3MgQ1BERl9BcnJheSA6IHB1YmxpYyBDUERGX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgQ1BERl9BcnJheSogQ3JlYXRlKCkgeyByZXR1cm4gRlhfTkVXIENQREZfQXJyYXkoKTsgfQogCi0gICAgc3RhdGljIENQREZfQXJyYXkqCQlDcmVhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYX05FVyBDUERGX0FycmF5KCk7Ci0gICAgfQorICBDUERGX0FycmF5KCkgOiBDUERGX09iamVjdChQREZPQkpfQVJSQVkpIHt9CiAKLSAgICBDUERGX0FycmF5KCkgOiBDUERGX09iamVjdChQREZPQkpfQVJSQVkpIHsgfQorICBGWF9EV09SRCBHZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fT2JqZWN0cy5HZXRTaXplKCk7IH0KIAotICAgIEZYX0RXT1JECQkJCUdldENvdW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX09iamVjdHMuR2V0U2l6ZSgpOwotICAgIH0KKyAgQ1BERl9PYmplY3QqIEdldEVsZW1lbnQoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCi0gICAgQ1BERl9PYmplY3QqCQkJR2V0RWxlbWVudChGWF9EV09SRCBpbmRleCkgY29uc3Q7CisgIENQREZfT2JqZWN0KiBHZXRFbGVtZW50VmFsdWUoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCi0gICAgQ1BERl9PYmplY3QqCQkJR2V0RWxlbWVudFZhbHVlKEZYX0RXT1JEIGluZGV4KSBjb25zdDsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBHZXRNYXRyaXgoKTsKIAorICBDRlhfRmxvYXRSZWN0IEdldFJlY3QoKTsKIAorICBDRlhfQnl0ZVN0cmluZyBHZXRTdHJpbmcoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCi0gICAgQ0ZYX0FmZmluZU1hdHJpeAkJR2V0TWF0cml4KCk7CisgIENGWF9CeXRlU3RyaW5nQyBHZXRDb25zdFN0cmluZyhGWF9EV09SRCBpbmRleCkgY29uc3Q7CiAKLSAgICBDRlhfRmxvYXRSZWN0CQkJR2V0UmVjdCgpOworICBpbnQgR2V0SW50ZWdlcihGWF9EV09SRCBpbmRleCkgY29uc3Q7CiAKKyAgRlhfRkxPQVQgR2V0TnVtYmVyKEZYX0RXT1JEIGluZGV4KSBjb25zdDsKIAorICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCisgIENQREZfU3RyZWFtKiBHZXRTdHJlYW0oRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXRTdHJpbmcoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OworICBDUERGX0FycmF5KiBHZXRBcnJheShGWF9EV09SRCBpbmRleCkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MJCQlHZXRDb25zdFN0cmluZyhGWF9EV09SRCBpbmRleCkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldEZsb2F0KEZYX0RXT1JEIGluZGV4KSBjb25zdCB7IHJldHVybiBHZXROdW1iZXIoaW5kZXgpOyB9CiAKLSAgICBpbnQJCQkJCQlHZXRJbnRlZ2VyKEZYX0RXT1JEIGluZGV4KSBjb25zdDsKKyAgdm9pZCBTZXRBdChGWF9EV09SRCBpbmRleCwKKyAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMgPSBOVUxMKTsKIAotICAgIEZYX0ZMT0FUCQkJCUdldE51bWJlcihGWF9EV09SRCBpbmRleCkgY29uc3Q7CisgIHZvaWQgSW5zZXJ0QXQoRlhfRFdPUkQgaW5kZXgsCisgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpzID0gTlVMTCk7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXREaWN0KEZYX0RXT1JEIGluZGV4KSBjb25zdDsKKyAgdm9pZCBSZW1vdmVBdChGWF9EV09SRCBpbmRleCk7CiAKLSAgICBDUERGX1N0cmVhbSoJCQlHZXRTdHJlYW0oRlhfRFdPUkQgaW5kZXgpIGNvbnN0OworICB2b2lkIEFkZChDUERGX09iamVjdCogcE9iaiwgQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpzID0gTlVMTCk7CiAKLSAgICBDUERGX0FycmF5KgkJCQlHZXRBcnJheShGWF9EV09SRCBpbmRleCkgY29uc3Q7CisgIHZvaWQgQWRkTnVtYmVyKEZYX0ZMT0FUIGYpOwogCi0gICAgRlhfRkxPQVQJCQkJR2V0RmxvYXQoRlhfRFdPUkQgaW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gR2V0TnVtYmVyKGluZGV4KTsKLSAgICB9CisgIHZvaWQgQWRkSW50ZWdlcihpbnQgaSk7CiAKKyAgdm9pZCBBZGRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CiAKKyAgdm9pZCBBZGROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpOwogCisgIHZvaWQgQWRkUmVmZXJlbmNlKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pOwogCi0gICAgdm9pZAkJCQkJU2V0QXQoRlhfRFdPUkQgaW5kZXgsIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMgPSBOVUxMKTsKKyAgdm9pZCBBZGRSZWZlcmVuY2UoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MsIENQREZfT2JqZWN0KiBvYmopIHsKKyAgICBBZGRSZWZlcmVuY2UocERvYywgb2JqLT5HZXRPYmpOdW0oKSk7CisgIH0KIAorICBGWF9GTE9BVCBHZXROdW1iZXIxNihGWF9EV09SRCBpbmRleCkgY29uc3QgeyByZXR1cm4gR2V0TnVtYmVyKGluZGV4KTsgfQogCi0gICAgdm9pZAkJCQkJSW5zZXJ0QXQoRlhfRFdPUkQgaW5kZXgsIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMgPSBOVUxMKTsKKyAgdm9pZCBBZGROdW1iZXIxNihGWF9GTE9BVCB2YWx1ZSkgeyBBZGROdW1iZXIodmFsdWUpOyB9CiAKLSAgICB2b2lkCQkJCQlSZW1vdmVBdChGWF9EV09SRCBpbmRleCk7CisgIEZYX0JPT0wgSWRlbnRpY2FsKENQREZfQXJyYXkqIHBPdGhlcikgY29uc3Q7CiAKKyBwcm90ZWN0ZWQ6CisgIH5DUERGX0FycmF5KCk7CiAKLSAgICB2b2lkCQkJCQlBZGQoQ1BERl9PYmplY3QqIHBPYmosIENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqcyA9IE5VTEwpOwotCi0KLQotICAgIHZvaWQJCQkJCUFkZE51bWJlcihGWF9GTE9BVCBmKTsKLQotICAgIHZvaWQJCQkJCUFkZEludGVnZXIoaW50IGkpOwotCi0gICAgdm9pZAkJCQkJQWRkU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpOwotCi0gICAgdm9pZAkJCQkJQWRkTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKLQotICAgIHZvaWQJCQkJCUFkZFJlZmVyZW5jZShDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgRlhfRFdPUkQgb2JqbnVtKTsKLQotICAgIHZvaWQJCQkJCUFkZFJlZmVyZW5jZShDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgQ1BERl9PYmplY3QqIG9iaikKLSAgICB7Ci0gICAgICAgIEFkZFJlZmVyZW5jZShwRG9jLCBvYmotPkdldE9iak51bSgpKTsKLSAgICB9Ci0KLQotICAgIEZYX0ZMT0FUCQkJR2V0TnVtYmVyMTYoRlhfRFdPUkQgaW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gR2V0TnVtYmVyKGluZGV4KTsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCQlBZGROdW1iZXIxNihGWF9GTE9BVCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIEFkZE51bWJlcih2YWx1ZSk7Ci0gICAgfQotCi0gICAgRlhfQk9PTAkJCQkJSWRlbnRpY2FsKENQREZfQXJyYXkqIHBPdGhlcikgY29uc3Q7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICB+Q1BERl9BcnJheSgpOwotCi0gICAgQ0ZYX1B0ckFycmF5CQkJbV9PYmplY3RzOwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfT2JqZWN0OworICBDRlhfUHRyQXJyYXkgbV9PYmplY3RzOworICBmcmllbmQgY2xhc3MgQ1BERl9PYmplY3Q7CiB9OwotY2xhc3MgQ1BERl9EaWN0aW9uYXJ5IDogcHVibGljIENQREZfT2JqZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0RpY3Rpb25hcnkgOiBwdWJsaWMgQ1BERl9PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIENQREZfRGljdGlvbmFyeSogQ3JlYXRlKCkgeyByZXR1cm4gRlhfTkVXIENQREZfRGljdGlvbmFyeSgpOyB9CiAKLSAgICBzdGF0aWMgQ1BERl9EaWN0aW9uYXJ5KglDcmVhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYX05FVyBDUERGX0RpY3Rpb25hcnkoKTsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSgpIDogQ1BERl9PYmplY3QoUERGT0JKX0RJQ1RJT05BUlkpIHt9CiAKLSAgICBDUERGX0RpY3Rpb25hcnkoKSA6IENQREZfT2JqZWN0KFBERk9CSl9ESUNUSU9OQVJZKSB7IH0KKyAgQ1BERl9PYmplY3QqIEdldEVsZW1lbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCi0gICAgQ1BERl9PYmplY3QqCQkJR2V0RWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3Q7CisgIENQREZfT2JqZWN0KiBHZXRFbGVtZW50VmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCi0gICAgQ1BERl9PYmplY3QqCQkJR2V0RWxlbWVudFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKIAorICBDRlhfQnl0ZVN0cmluZ0MgR2V0Q29uc3RTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCisgIENGWF9CeXRlU3RyaW5nIEdldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF9zdHIpIGNvbnN0OwogCisgIENGWF9CeXRlU3RyaW5nQyBHZXRDb25zdFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF9zdHIpIGNvbnN0OwogCisgIENGWF9XaWRlU3RyaW5nIEdldFVuaWNvZGVUZXh0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ2hhck1hcCogcENoYXJNYXAgPSBOVUxMKSBjb25zdDsKIAotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKKyAgaW50IEdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDCQkJR2V0Q29uc3RTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OworICBpbnQgR2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgaW50IGRlZmF1bHRfaW50KSBjb25zdDsKIAotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfc3RyKSBjb25zdDsKKyAgRlhfQk9PTCBHZXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVmYXVsdCA9IEZBTFNFKSBjb25zdDsKIAotICAgIENGWF9CeXRlU3RyaW5nQwkJCUdldENvbnN0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfc3RyKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKIAotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0VW5pY29kZVRleHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpIGNvbnN0OworICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCi0gICAgaW50CQkJCQkJR2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3Q7CisgIENQREZfU3RyZWFtKiBHZXRTdHJlYW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCi0gICAgaW50CQkJCQkJR2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgaW50IGRlZmF1bHRfaW50KSBjb25zdDsKKyAgQ1BERl9BcnJheSogR2V0QXJyYXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJR2V0Qm9vbGVhbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgRlhfQk9PTCBiRGVmYXVsdCA9IEZBTFNFKSBjb25zdDsKKyAgQ0ZYX0Zsb2F0UmVjdCBHZXRSZWN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKIAotICAgIEZYX0ZMT0FUCQkJCUdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3Q7CisgIENGWF9BZmZpbmVNYXRyaXggR2V0TWF0cml4KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKIAotICAgIENQREZfRGljdGlvbmFyeSoJCUdldERpY3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OworICBGWF9GTE9BVCBHZXRGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QgeyByZXR1cm4gR2V0TnVtYmVyKGtleSk7IH0KIAotICAgIENQREZfU3RyZWFtKgkJCUdldFN0cmVhbShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3Q7CisgIEZYX0JPT0wgS2V5RXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCi0gICAgQ1BERl9BcnJheSoJCQkJR2V0QXJyYXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OworICBGWF9QT1NJVElPTiBHZXRTdGFydFBvcygpIGNvbnN0OwogCi0gICAgQ0ZYX0Zsb2F0UmVjdAkJCUdldFJlY3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OworICBDUERGX09iamVjdCogR2V0TmV4dEVsZW1lbnQoRlhfUE9TSVRJT04mIHBvcywgQ0ZYX0J5dGVTdHJpbmcmIGtleSkgY29uc3Q7CiAKLSAgICBDRlhfQWZmaW5lTWF0cml4CQlHZXRNYXRyaXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OworICB2b2lkIFNldEF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgIENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqcyA9IE5VTEwpOwogCi0gICAgRlhfRkxPQVQJCQkJR2V0RmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gR2V0TnVtYmVyKGtleSk7Ci0gICAgfQorICB2b2lkIFNldEF0TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwogCisgIHZvaWQgU2V0QXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOwogCi0gICAgRlhfQk9PTAkJCQkJS2V5RXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OworICB2b2lkIFNldEF0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgaW50IGkpOwogCi0gICAgRlhfUE9TSVRJT04JCQkJR2V0U3RhcnRQb3MoKSBjb25zdDsKKyAgdm9pZCBTZXRBdE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgRlhfRkxPQVQgZik7CiAKLSAgICBDUERGX09iamVjdCoJCQlHZXROZXh0RWxlbWVudChGWF9QT1NJVElPTiYgcG9zLCBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKKyAgdm9pZCBTZXRBdFJlZmVyZW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0pOwogCi0gICAgdm9pZAkJCQkJU2V0QXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMgPSBOVUxMKTsKKyAgdm9pZCBTZXRBdFJlZmVyZW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogb2JqKSB7CisgICAgU2V0QXRSZWZlcmVuY2Uoa2V5LCBwRG9jLCBvYmotPkdldE9iak51bSgpKTsKKyAgfQogCisgIHZvaWQgQWRkUmVmZXJlbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywKKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtKTsKIAorICB2b2lkIEFkZFJlZmVyZW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBvYmopIHsKKyAgICBBZGRSZWZlcmVuY2Uoa2V5LCBwRG9jLCBvYmotPkdldE9iak51bSgpKTsKKyAgfQogCi0gICAgdm9pZAkJCQkJU2V0QXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CisgIHZvaWQgU2V0QXRSZWN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KTsKIAorICB2b2lkIFNldEF0TWF0cml4KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOwogCi0gICAgdm9pZAkJCQkJU2V0QXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOworICB2b2lkIFNldEF0Qm9vbGVhbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgRlhfQk9PTCBiVmFsdWUpOwogCisgIHZvaWQgUmVtb3ZlQXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpOwogCi0gICAgdm9pZAkJCQkJU2V0QXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBpbnQgaSk7CisgIHZvaWQgUmVwbGFjZUtleShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG9sZGtleSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuZXdrZXkpOwogCisgIEZYX0JPT0wgSWRlbnRpY2FsKENQREZfRGljdGlvbmFyeSogcERpY3QpIGNvbnN0OwogCi0gICAgdm9pZAkJCQkJU2V0QXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIEZYX0ZMT0FUIGYpOworICBpbnQgR2V0Q291bnQoKSBjb25zdCB7IHJldHVybiBtX01hcC5HZXRDb3VudCgpOyB9CiAKLSAgICB2b2lkCQkJCQlTZXRBdFJlZmVyZW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MsIEZYX0RXT1JEIG9iam51bSk7CisgIHZvaWQgQWRkVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIENQREZfT2JqZWN0KiBwT2JqKTsKIAotICAgIHZvaWQJCQkJCVNldEF0UmVmZXJlbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgQ1BERl9PYmplY3QqIG9iaikKLSAgICB7Ci0gICAgICAgIFNldEF0UmVmZXJlbmNlKGtleSwgcERvYywgb2JqLT5HZXRPYmpOdW0oKSk7Ci0gICAgfQorIHByb3RlY3RlZDoKKyAgfkNQREZfRGljdGlvbmFyeSgpOwogCi0gICAgdm9pZAkJCQkJQWRkUmVmZXJlbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgRlhfRFdPUkQgb2JqbnVtKTsKKyAgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIgbV9NYXA7CiAKLSAgICB2b2lkCQkJCQlBZGRSZWZlcmVuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBDUERGX09iamVjdCogb2JqKQotICAgIHsKLSAgICAgICAgQWRkUmVmZXJlbmNlKGtleSwgcERvYywgb2JqLT5HZXRPYmpOdW0oKSk7Ci0gICAgfQotCi0gICAgdm9pZAkJCQkJU2V0QXRSZWN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KTsKLQotICAgIHZvaWQJCQkJCVNldEF0TWF0cml4KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOwotCi0gICAgdm9pZAkJCQkJU2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJWYWx1ZSk7Ci0KLQotCi0gICAgdm9pZAkJCQkJUmVtb3ZlQXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpOwotCi0KLSAgICB2b2lkCQkJCQlSZXBsYWNlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb2xka2V5LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5ld2tleSk7Ci0KLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgY29uc3Q7Ci0KLSAgICBpbnQJCQkJCQlHZXRDb3VudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9NYXAuR2V0Q291bnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCQlBZGRWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgQ1BERl9PYmplY3QqIHBPYmopOwotcHJvdGVjdGVkOgotCi0gICAgfkNQREZfRGljdGlvbmFyeSgpOwotCi0gICAgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIJbV9NYXA7Ci0KLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX09iamVjdDsKKyAgZnJpZW5kIGNsYXNzIENQREZfT2JqZWN0OwogfTsKLWNsYXNzIENQREZfU3RyZWFtIDogcHVibGljIENQREZfT2JqZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1N0cmVhbSA6IHB1YmxpYyBDUERGX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgQ1BERl9TdHJlYW0qIENyZWF0ZSh1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgeworICAgIHJldHVybiBGWF9ORVcgQ1BERl9TdHJlYW0ocERhdGEsIHNpemUsIHBEaWN0KTsKKyAgfQogCi0gICAgc3RhdGljIENQREZfU3RyZWFtKgkJQ3JlYXRlKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYX05FVyBDUERGX1N0cmVhbShwRGF0YSwgc2l6ZSwgcERpY3QpOwotICAgIH0KKyAgQ1BERl9TdHJlYW0odWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIENQREZfRGljdGlvbmFyeSogcERpY3QpOwogCi0gICAgQ1BERl9TdHJlYW0odWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIENQREZfRGljdGlvbmFyeSogcERpY3QpOworICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0OyB9CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXREaWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0OwotICAgIH0KKyAgdm9pZCBTZXREYXRhKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbXByZXNzZWQsCisgICAgICAgICAgICAgICBGWF9CT09MIGJLZWVwQnVmKTsKIAotICAgIHZvaWQJCQkJCVNldERhdGEoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYkNvbXByZXNzZWQsIEZYX0JPT0wgYktlZXBCdWYpOworICB2b2lkIEluaXRTdHJlYW0odWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIENQREZfRGljdGlvbmFyeSogcERpY3QpOwogCi0gICAgdm9pZAkJCQkJSW5pdFN0cmVhbSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisgIHZvaWQgSW5pdFN0cmVhbShJRlhfRmlsZVJlYWQqIHBGaWxlLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKIAotICAgIHZvaWQJCQkJCUluaXRTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisgIEZYX0JPT0wgSWRlbnRpY2FsKENQREZfU3RyZWFtKiBwT3RoZXIpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJSWRlbnRpY2FsKENQREZfU3RyZWFtKiBwT3RoZXIpIGNvbnN0OworICBDUERGX1N0cmVhbUZpbHRlciogR2V0U3RyZWFtRmlsdGVyKEZYX0JPT0wgYlJhdyA9IEZBTFNFKSBjb25zdDsKIAotICAgIENQREZfU3RyZWFtRmlsdGVyKgkJR2V0U3RyZWFtRmlsdGVyKEZYX0JPT0wgYlJhdyA9IEZBTFNFKSBjb25zdDsKKyAgRlhfRFdPUkQgR2V0UmF3U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZHdTaXplOyB9CiAKKyAgRlhfQk9PTCBSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBzdGFydF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBidWZfc2l6ZSkgY29uc3Q7CiAKKyAgRlhfQk9PTCBJc01lbW9yeUJhc2VkKCkgY29uc3QgeyByZXR1cm4gbV9HZW5OdW0gPT0gKEZYX0RXT1JEKS0xOyB9CiAKLSAgICBGWF9EV09SRAkJCQlHZXRSYXdTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2R3U2l6ZTsKLSAgICB9CisgIENQREZfU3RyZWFtKiBDbG9uZShGWF9CT09MIGJEaXJlY3QsCisgICAgICAgICAgICAgICAgICAgICBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJUmVhZFJhd0RhdGEoRlhfRklMRVNJWkUgc3RhcnRfcG9zLCB1aW50OF90KiBwQnVmLCBGWF9EV09SRCBidWZfc2l6ZSkgY29uc3Q7CisgcHJvdGVjdGVkOgorICB+Q1BERl9TdHJlYW0oKTsKIAorICBDUERGX0RpY3Rpb25hcnkqIG1fcERpY3Q7CiAKLSAgICBGWF9CT09MCQkJCQlJc01lbW9yeUJhc2VkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0dlbk51bSA9PSAoRlhfRFdPUkQpIC0gMTsKLSAgICB9CisgIEZYX0RXT1JEIG1fZHdTaXplOwogCi0gICAgQ1BERl9TdHJlYW0qCQkJQ2xvbmUoRlhfQk9PTCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIHZvaWQqIHBVc2VyRGF0YSkgY29uc3Q7Ci1wcm90ZWN0ZWQ6CisgIEZYX0RXT1JEIG1fR2VuTnVtOwogCi0gICAgfkNQREZfU3RyZWFtKCk7CisgIHVuaW9uIHsKKyAgICB1aW50OF90KiBtX3BEYXRhQnVmOwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wRGljdDsKKyAgICBJRlhfRmlsZVJlYWQqIG1fcEZpbGU7CisgIH07CiAKLSAgICBGWF9EV09SRAkJCQltX2R3U2l6ZTsKKyAgRlhfRklMRVNJWkUgbV9GaWxlT2Zmc2V0OwogCi0gICAgRlhfRFdPUkQJCQkJbV9HZW5OdW07CisgIENQREZfQ3J5cHRvSGFuZGxlciogbV9wQ3J5cHRvSGFuZGxlcjsKIAotICAgIHVuaW9uIHsKLQotICAgICAgICB1aW50OF90KgkJCW1fcERhdGFCdWY7Ci0KLSAgICAgICAgSUZYX0ZpbGVSZWFkKgkJbV9wRmlsZTsKLSAgICB9OwotCi0gICAgRlhfRklMRVNJWkUJCQkJbV9GaWxlT2Zmc2V0OwotCi0gICAgQ1BERl9DcnlwdG9IYW5kbGVyKgkJbV9wQ3J5cHRvSGFuZGxlcjsKLQotICAgIHZvaWQJCQkJCUluaXRTdHJlYW0oQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9PYmplY3Q7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9TdHJlYW1BY2M7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9BdHRhY2htZW50QWNjOworICB2b2lkIEluaXRTdHJlYW0oQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisgIGZyaWVuZCBjbGFzcyBDUERGX09iamVjdDsKKyAgZnJpZW5kIGNsYXNzIENQREZfU3RyZWFtQWNjOworICBmcmllbmQgY2xhc3MgQ1BERl9BdHRhY2htZW50QWNjOwogfTsKLWNsYXNzIENQREZfU3RyZWFtQWNjCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1N0cmVhbUFjYyB7CisgcHVibGljOgorICBDUERGX1N0cmVhbUFjYygpOwogCi0gICAgQ1BERl9TdHJlYW1BY2MoKTsKKyAgfkNQREZfU3RyZWFtQWNjKCk7CiAKLSAgICB+Q1BERl9TdHJlYW1BY2MoKTsKKyAgdm9pZCBMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSYXdBY2Nlc3MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1hZ2VBY2MgPSBGQUxTRSk7CiAKLSAgICB2b2lkCQkJCQlMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiUmF3QWNjZXNzID0gRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUgPSAwLCBGWF9CT09MIGJJbWFnZUFjYyA9IEZBTFNFKTsKKyAgY29uc3QgQ1BERl9TdHJlYW0qIEdldFN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1fcFN0cmVhbTsgfQogCi0gICAgY29uc3QgQ1BERl9TdHJlYW0qCQlHZXRTdHJlYW0oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFN0cmVhbTsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wU3RyZWFtID8gbV9wU3RyZWFtLT5HZXREaWN0KCkgOiBOVUxMOworICB9CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXREaWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BTdHJlYW0/IG1fcFN0cmVhbS0+R2V0RGljdCgpIDogTlVMTDsKLSAgICB9CisgIGNvbnN0IHVpbnQ4X3QqIEdldERhdGEoKSBjb25zdDsKIAotICAgIGNvbnN0IHVpbnQ4X3QqCQkJCUdldERhdGEoKSBjb25zdDsKKyAgRlhfRFdPUkQgR2V0U2l6ZSgpIGNvbnN0OwogCi0gICAgRlhfRFdPUkQJCQkJR2V0U2l6ZSgpIGNvbnN0OworICB1aW50OF90KiBEZXRhY2hEYXRhKCk7CiAKLSAgICB1aW50OF90KgkJCQlEZXRhY2hEYXRhKCk7CisgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBHZXRJbWFnZURlY29kZXIoKSB7IHJldHVybiBtX0ltYWdlRGVjb2RlcjsgfQogCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCUdldEltYWdlRGVjb2RlcigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9JbWFnZURlY29kZXI7Ci0gICAgfQorICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIEdldEltYWdlUGFyYW0oKSB7IHJldHVybiBtX3BJbWFnZVBhcmFtOyB9CiAKLSAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqCUdldEltYWdlUGFyYW0oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEltYWdlUGFyYW07Ci0gICAgfQotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgdWludDhfdCogbV9wRGF0YTsKIAotICAgIHVpbnQ4X3QqCQkJCW1fcERhdGE7CisgIEZYX0RXT1JEIG1fZHdTaXplOwogCi0gICAgRlhfRFdPUkQJCQkJbV9kd1NpemU7CisgIEZYX0JPT0wgbV9iTmV3QnVmOwogCi0gICAgRlhfQk9PTAkJCQkJbV9iTmV3QnVmOworICBDRlhfQnl0ZVN0cmluZyBtX0ltYWdlRGVjb2RlcjsKIAotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9JbWFnZURlY29kZXI7CisgIENQREZfRGljdGlvbmFyeSogbV9wSW1hZ2VQYXJhbTsKIAotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcEltYWdlUGFyYW07CisgIGNvbnN0IENQREZfU3RyZWFtKiBtX3BTdHJlYW07CiAKLSAgICBjb25zdCBDUERGX1N0cmVhbSoJCW1fcFN0cmVhbTsKLQotICAgIHVpbnQ4X3QqCQkJCW1fcFNyY0RhdGE7CisgIHVpbnQ4X3QqIG1fcFNyY0RhdGE7CiB9OwotQ0ZYX0RhdGFGaWx0ZXIqIEZQREZfQ3JlYXRlRmlsdGVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW0sIGludCB3aWR0aCA9IDAsIGludCBoZWlnaHQgPSAwKTsKLSNkZWZpbmUgRlBERl9GSUxURVJfQlVGRkVSX1NJWkUJCTIwNDgwCi1jbGFzcyBDUERGX1N0cmVhbUZpbHRlcgotewotcHVibGljOgorQ0ZYX0RhdGFGaWx0ZXIqIEZQREZfQ3JlYXRlRmlsdGVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSAwKTsKKyNkZWZpbmUgRlBERl9GSUxURVJfQlVGRkVSX1NJWkUgMjA0ODAKK2NsYXNzIENQREZfU3RyZWFtRmlsdGVyIHsKKyBwdWJsaWM6CisgIH5DUERGX1N0cmVhbUZpbHRlcigpOwogCi0gICAgfkNQREZfU3RyZWFtRmlsdGVyKCk7CisgIEZYX0RXT1JEIFJlYWRCbG9jayh1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpOwogCi0gICAgRlhfRFdPUkQJCQlSZWFkQmxvY2sodWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBzaXplKTsKKyAgRlhfRFdPUkQgR2V0U3JjUG9zKCkgeyByZXR1cm4gbV9TcmNPZmZzZXQ7IH0KIAotICAgIEZYX0RXT1JECQkJR2V0U3JjUG9zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1NyY09mZnNldDsKLSAgICB9CisgIGNvbnN0IENQREZfU3RyZWFtKiBHZXRTdHJlYW0oKSB7IHJldHVybiBtX3BTdHJlYW07IH0KIAotICAgIGNvbnN0IENQREZfU3RyZWFtKglHZXRTdHJlYW0oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFN0cmVhbTsKLSAgICB9Ci1wcm90ZWN0ZWQ6CisgcHJvdGVjdGVkOgorICBDUERGX1N0cmVhbUZpbHRlcigpIHt9CiAKLSAgICBDUERGX1N0cmVhbUZpbHRlcigpIHt9CisgIEZYX0RXT1JEIFJlYWRMZWZ0T3Zlcih1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIGJ1Zl9zaXplKTsKIAotICAgIEZYX0RXT1JECQkJUmVhZExlZnRPdmVyKHVpbnQ4X3QqIGJ1ZmZlciwgRlhfRFdPUkQgYnVmX3NpemUpOworICBjb25zdCBDUERGX1N0cmVhbSogbV9wU3RyZWFtOwogCi0gICAgY29uc3QgQ1BERl9TdHJlYW0qCW1fcFN0cmVhbTsKKyAgQ0ZYX0RhdGFGaWx0ZXIqIG1fcEZpbHRlcjsKIAotICAgIENGWF9EYXRhRmlsdGVyKgkJbV9wRmlsdGVyOworICBDRlhfQmluYXJ5QnVmKiBtX3BCdWZmZXI7CiAKLSAgICBDRlhfQmluYXJ5QnVmKgkJbV9wQnVmZmVyOworICBGWF9EV09SRCBtX0J1Zk9mZnNldDsKIAotICAgIEZYX0RXT1JECQkJbV9CdWZPZmZzZXQ7CisgIEZYX0RXT1JEIG1fU3JjT2Zmc2V0OwogCi0gICAgRlhfRFdPUkQJCQltX1NyY09mZnNldDsKLQotICAgIHVpbnQ4X3QJCQkJbV9TcmNCdWZmZXJbRlBERl9GSUxURVJfQlVGRkVSX1NJWkVdOwotICAgIGZyaWVuZCBjbGFzcyBDUERGX1N0cmVhbTsKKyAgdWludDhfdCBtX1NyY0J1ZmZlcltGUERGX0ZJTFRFUl9CVUZGRVJfU0laRV07CisgIGZyaWVuZCBjbGFzcyBDUERGX1N0cmVhbTsKIH07Ci1jbGFzcyBDUERGX051bGwgOiBwdWJsaWMgQ1BERl9PYmplY3QKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfTnVsbCA6IHB1YmxpYyBDUERGX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgQ1BERl9OdWxsKiBDcmVhdGUoKSB7IHJldHVybiBGWF9ORVcgQ1BERl9OdWxsKCk7IH0KIAotICAgIHN0YXRpYyBDUERGX051bGwqCQlDcmVhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYX05FVyBDUERGX051bGwoKTsKLSAgICB9Ci0KLSAgICBDUERGX051bGwoKSA6IENQREZfT2JqZWN0KFBERk9CSl9OVUxMKSB7IH0KKyAgQ1BERl9OdWxsKCkgOiBDUERGX09iamVjdChQREZPQkpfTlVMTCkge30KIH07Ci1jbGFzcyBDUERGX1JlZmVyZW5jZSA6IHB1YmxpYyBDUERGX09iamVjdAotewotcHVibGljOgorY2xhc3MgQ1BERl9SZWZlcmVuY2UgOiBwdWJsaWMgQ1BERl9PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIENQREZfUmVmZXJlbmNlKiBDcmVhdGUoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MsIGludCBvYmpudW0pIHsKKyAgICByZXR1cm4gRlhfTkVXIENQREZfUmVmZXJlbmNlKHBEb2MsIG9iam51bSk7CisgIH0KIAotICAgIHN0YXRpYyBDUERGX1JlZmVyZW5jZSoJQ3JlYXRlKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBpbnQgb2JqbnVtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYX05FVyBDUERGX1JlZmVyZW5jZShwRG9jLCBvYmpudW0pOwotICAgIH0KKyAgQ1BERl9SZWZlcmVuY2UoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MsIGludCBvYmpudW0pCisgICAgICA6IENQREZfT2JqZWN0KFBERk9CSl9SRUZFUkVOQ0UpLCBtX3BPYmpMaXN0KHBEb2MpLCBtX1JlZk9iak51bShvYmpudW0pIHt9CiAKLSAgICBDUERGX1JlZmVyZW5jZShDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgaW50IG9iam51bSkKLSAgICAgICAgOiBDUERGX09iamVjdChQREZPQkpfUkVGRVJFTkNFKSwgbV9wT2JqTGlzdChwRG9jKSwgbV9SZWZPYmpOdW0ob2JqbnVtKSB7Ci0gICAgfQorICBDUERGX0luZGlyZWN0T2JqZWN0cyogR2V0T2JqTGlzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iakxpc3Q7IH0KIAotICAgIENQREZfSW5kaXJlY3RPYmplY3RzKglHZXRPYmpMaXN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmpMaXN0OwotICAgIH0KKyAgRlhfRFdPUkQgR2V0UmVmT2JqTnVtKCkgY29uc3QgeyByZXR1cm4gbV9SZWZPYmpOdW07IH0KIAotICAgIEZYX0RXT1JECQkJCUdldFJlZk9iak51bSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9SZWZPYmpOdW07Ci0gICAgfQorICB2b2lkIFNldFJlZihDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgRlhfRFdPUkQgb2JqbnVtKTsKIAotICAgIHZvaWQJCQkJCVNldFJlZihDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgRlhfRFdPUkQgb2JqbnVtKTsKKyAgRlhfQk9PTCBJZGVudGljYWwoQ1BERl9SZWZlcmVuY2UqIHBPdGhlcikgY29uc3QgeworICAgIHJldHVybiBtX1JlZk9iak51bSA9PSBwT3RoZXItPm1fUmVmT2JqTnVtOworICB9CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9SZWZlcmVuY2UqIHBPdGhlcikgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1JlZk9iak51bSA9PSBwT3RoZXItPm1fUmVmT2JqTnVtOwotICAgIH0KLXByb3RlY3RlZDoKKyBwcm90ZWN0ZWQ6CisgIENQREZfSW5kaXJlY3RPYmplY3RzKiBtX3BPYmpMaXN0OwogCi0gICAgQ1BERl9JbmRpcmVjdE9iamVjdHMqCW1fcE9iakxpc3Q7Ci0KLSAgICBGWF9EV09SRAkJCQltX1JlZk9iak51bTsKLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX09iamVjdDsKKyAgRlhfRFdPUkQgbV9SZWZPYmpOdW07CisgIGZyaWVuZCBjbGFzcyBDUERGX09iamVjdDsKIH07Ci1jbGFzcyBDUERGX0luZGlyZWN0T2JqZWN0cwotewotcHVibGljOgorY2xhc3MgQ1BERl9JbmRpcmVjdE9iamVjdHMgeworIHB1YmxpYzoKKyAgQ1BERl9JbmRpcmVjdE9iamVjdHMoQ1BERl9QYXJzZXIqIHBQYXJzZXIpOwogCi0gICAgQ1BERl9JbmRpcmVjdE9iamVjdHMoQ1BERl9QYXJzZXIqIHBQYXJzZXIpOworICB+Q1BERl9JbmRpcmVjdE9iamVjdHMoKTsKIAotICAgIH5DUERGX0luZGlyZWN0T2JqZWN0cygpOworICBDUERGX09iamVjdCogR2V0SW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0ID0gTlVMTCk7CiAKLSAgICBDUERGX09iamVjdCoJCQlHZXRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0sIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCA9IE5VTEwpOworICBpbnQgR2V0SW5kaXJlY3RUeXBlKEZYX0RXT1JEIG9iam51bSk7CiAKLSAgICBpbnQJCQkJCQlHZXRJbmRpcmVjdFR5cGUoRlhfRFdPUkQgb2JqbnVtKTsKKyAgRlhfRFdPUkQgQWRkSW5kaXJlY3RPYmplY3QoQ1BERl9PYmplY3QqIHBPYmopOwogCi0gICAgRlhfRFdPUkQJCQkJQWRkSW5kaXJlY3RPYmplY3QoQ1BERl9PYmplY3QqIHBPYmopOworICB2b2lkIFJlbGVhc2VJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0pOwogCi0gICAgdm9pZAkJCQkJUmVsZWFzZUluZGlyZWN0T2JqZWN0KEZYX0RXT1JEIG9iam51bSk7CisgIHZvaWQgSW5zZXJ0SW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgb2JqbnVtLCBDUERGX09iamVjdCogcE9iaik7CiAKLSAgICB2b2lkCQkJCQlJbnNlcnRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0sIENQREZfT2JqZWN0KiBwT2JqKTsKKyAgRlhfRFdPUkQgR2V0TGFzdE9iak51bSgpIGNvbnN0OwogCi0gICAgRlhfRFdPUkQJCQkJR2V0TGFzdE9iak51bSgpIGNvbnN0OworICBGWF9QT1NJVElPTiBHZXRTdGFydFBvc2l0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtX0luZGlyZWN0T2Jqcy5HZXRTdGFydFBvc2l0aW9uKCk7CisgIH0KIAotICAgIEZYX1BPU0lUSU9OCQkJCUdldFN0YXJ0UG9zaXRpb24oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fSW5kaXJlY3RPYmpzLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB9CisgIHZvaWQgR2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiByUG9zLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdComIHBPYmplY3QpIGNvbnN0IHsKKyAgICBtX0luZGlyZWN0T2Jqcy5HZXROZXh0QXNzb2MoclBvcywgKHZvaWQqJilvYmpudW0sICh2b2lkKiYpcE9iamVjdCk7CisgIH0KIAotICAgIHZvaWQJCQkJCUdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgclBvcywgRlhfRFdPUkQmIG9iam51bSwgQ1BERl9PYmplY3QqJiBwT2JqZWN0KSBjb25zdAotICAgIHsKLSAgICAgICAgbV9JbmRpcmVjdE9ianMuR2V0TmV4dEFzc29jKHJQb3MsICh2b2lkKiYpb2JqbnVtLCAodm9pZComKXBPYmplY3QpOwotICAgIH0KLXByb3RlY3RlZDoKKyBwcm90ZWN0ZWQ6CisgIENGWF9NYXBQdHJUb1B0ciBtX0luZGlyZWN0T2JqczsKIAotICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fSW5kaXJlY3RPYmpzOworICBDUERGX1BhcnNlciogbV9wUGFyc2VyOwogCi0gICAgQ1BERl9QYXJzZXIqCQkJbV9wUGFyc2VyOwotCi0gICAgRlhfRFdPUkQJCQkJbV9MYXN0T2JqTnVtOworICBGWF9EV09SRCBtX0xhc3RPYmpOdW07CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZfT0JKRUNUU19IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaAppbmRleCBiZDhiNWM5Li41ZjcxNmIyIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaApAQCAtMjEsMjAyICsyMSwxODIgQEAKIGNsYXNzIENQREZfQWxsU3RhdGVzOwogY2xhc3MgQ1BERl9Db250ZW50UGFyc2VyOwogY2xhc3MgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOwotI2RlZmluZSBQREZUUkFOU19HUk9VUAkJCTB4MDEwMAotI2RlZmluZSBQREZUUkFOU19JU09MQVRFRAkJMHgwMjAwCi0jZGVmaW5lIFBERlRSQU5TX0tOT0NLT1VUCQkweDA0MDAKKyNkZWZpbmUgUERGVFJBTlNfR1JPVVAgMHgwMTAwCisjZGVmaW5lIFBERlRSQU5TX0lTT0xBVEVEIDB4MDIwMAorI2RlZmluZSBQREZUUkFOU19LTk9DS09VVCAweDA0MDAKIAotY2xhc3MgQ1BERl9QYWdlT2JqZWN0cwotewotcHVibGljOgotICAgIENQREZfUGFnZU9iamVjdHMoRlhfQk9PTCBiUmVsZWFzZU1lbWJlcnMgPSBUUlVFKTsKLSAgICB+Q1BERl9QYWdlT2JqZWN0cygpOworY2xhc3MgQ1BERl9QYWdlT2JqZWN0cyB7CisgcHVibGljOgorICBDUERGX1BhZ2VPYmplY3RzKEZYX0JPT0wgYlJlbGVhc2VNZW1iZXJzID0gVFJVRSk7CisgIH5DUERGX1BhZ2VPYmplY3RzKCk7CiAKLSAgICB2b2lkCQkJCUNvbnRpbnVlUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UpOworICB2b2lkIENvbnRpbnVlUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgRlhfQk9PTAkJCQlJc1BhcnNlZCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0VEOwotICAgIH0KKyAgRlhfQk9PTCBJc1BhcnNlZCgpIGNvbnN0IHsgcmV0dXJuIG1fUGFyc2VTdGF0ZSA9PSBDT05URU5UX1BBUlNFRDsgfQogCi0gICAgRlhfUE9TSVRJT04JCQlHZXRGaXJzdE9iamVjdFBvc2l0aW9uKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX09iamVjdExpc3QuR2V0SGVhZFBvc2l0aW9uKCk7Ci0gICAgfQorICBGWF9QT1NJVElPTiBHZXRGaXJzdE9iamVjdFBvc2l0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtX09iamVjdExpc3QuR2V0SGVhZFBvc2l0aW9uKCk7CisgIH0KIAotICAgIEZYX1BPU0lUSU9OCQkJR2V0TGFzdE9iamVjdFBvc2l0aW9uKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX09iamVjdExpc3QuR2V0VGFpbFBvc2l0aW9uKCk7Ci0gICAgfQorICBGWF9QT1NJVElPTiBHZXRMYXN0T2JqZWN0UG9zaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIG1fT2JqZWN0TGlzdC5HZXRUYWlsUG9zaXRpb24oKTsKKyAgfQogCi0gICAgQ1BERl9QYWdlT2JqZWN0KglHZXROZXh0T2JqZWN0KEZYX1BPU0lUSU9OJiBwb3MpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKENQREZfUGFnZU9iamVjdCopbV9PYmplY3RMaXN0LkdldE5leHQocG9zKTsKLSAgICB9CisgIENQREZfUGFnZU9iamVjdCogR2V0TmV4dE9iamVjdChGWF9QT1NJVElPTiYgcG9zKSBjb25zdCB7CisgICAgcmV0dXJuIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7CisgIH0KIAotICAgIENQREZfUGFnZU9iamVjdCoJR2V0UHJldk9iamVjdChGWF9QT1NJVElPTiYgcG9zKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXRQcmV2KHBvcyk7Ci0gICAgfQorICBDUERGX1BhZ2VPYmplY3QqIEdldFByZXZPYmplY3QoRlhfUE9TSVRJT04mIHBvcykgY29uc3QgeworICAgIHJldHVybiAoQ1BERl9QYWdlT2JqZWN0KiltX09iamVjdExpc3QuR2V0UHJldihwb3MpOworICB9CiAKLSAgICBDUERGX1BhZ2VPYmplY3QqCUdldE9iamVjdEF0KEZYX1BPU0lUSU9OIHBvcykgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAoQ1BERl9QYWdlT2JqZWN0KiltX09iamVjdExpc3QuR2V0QXQocG9zKTsKLSAgICB9CisgIENQREZfUGFnZU9iamVjdCogR2V0T2JqZWN0QXQoRlhfUE9TSVRJT04gcG9zKSBjb25zdCB7CisgICAgcmV0dXJuIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXRBdChwb3MpOworICB9CiAKLSAgICBGWF9EV09SRAkJCUNvdW50T2JqZWN0cygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9PYmplY3RMaXN0LkdldENvdW50KCk7Ci0gICAgfQorICBGWF9EV09SRCBDb3VudE9iamVjdHMoKSBjb25zdCB7IHJldHVybiBtX09iamVjdExpc3QuR2V0Q291bnQoKTsgfQogCi0gICAgaW50CQkJCQlHZXRPYmplY3RJbmRleChDUERGX1BhZ2VPYmplY3QqIHBPYmopIGNvbnN0OworICBpbnQgR2V0T2JqZWN0SW5kZXgoQ1BERl9QYWdlT2JqZWN0KiBwT2JqKSBjb25zdDsKIAotICAgIENQREZfUGFnZU9iamVjdCoJR2V0T2JqZWN0QnlJbmRleChpbnQgaW5kZXgpIGNvbnN0OworICBDUERGX1BhZ2VPYmplY3QqIEdldE9iamVjdEJ5SW5kZXgoaW50IGluZGV4KSBjb25zdDsKIAotICAgIEZYX1BPU0lUSU9OCQkJSW5zZXJ0T2JqZWN0KEZYX1BPU0lUSU9OIHBvc0luc2VydEFmdGVyLCBDUERGX1BhZ2VPYmplY3QqIHBOZXdPYmplY3QpOworICBGWF9QT1NJVElPTiBJbnNlcnRPYmplY3QoRlhfUE9TSVRJT04gcG9zSW5zZXJ0QWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBOZXdPYmplY3QpOwogCi0gICAgdm9pZAkJCQlUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KTsKKyAgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KTsKIAotICAgIEZYX0JPT0wJCQkJQmFja2dyb3VuZEFscGhhTmVlZGVkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQ7Ci0gICAgfQorICBGWF9CT09MIEJhY2tncm91bmRBbHBoYU5lZWRlZCgpIGNvbnN0IHsgcmV0dXJuIG1fYkJhY2tncm91bmRBbHBoYU5lZWRlZDsgfQogCi0gICAgQ0ZYX0Zsb2F0UmVjdAkJQ2FsY0JvdW5kaW5nQm94KCkgY29uc3Q7CisgIENGWF9GbG9hdFJlY3QgQ2FsY0JvdW5kaW5nQm94KCkgY29uc3Q7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcEZvcm1EaWN0OwotICAgIENQREZfU3RyZWFtKgkJbV9wRm9ybVN0cmVhbTsKLSAgICBDUERGX0RvY3VtZW50KgkJbV9wRG9jdW1lbnQ7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BQYWdlUmVzb3VyY2VzOwotICAgIENQREZfRGljdGlvbmFyeSoJbV9wUmVzb3VyY2VzOwotICAgIENGWF9GbG9hdFJlY3QJCW1fQkJveDsKLSAgICBpbnQJCQkJCW1fVHJhbnNwYXJlbmN5OworICBDUERGX0RpY3Rpb25hcnkqIG1fcEZvcm1EaWN0OworICBDUERGX1N0cmVhbSogbV9wRm9ybVN0cmVhbTsKKyAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CisgIENQREZfRGljdGlvbmFyeSogbV9wUGFnZVJlc291cmNlczsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BSZXNvdXJjZXM7CisgIENGWF9GbG9hdFJlY3QgbV9CQm94OworICBpbnQgbV9UcmFuc3BhcmVuY3k7CiAKLXByb3RlY3RlZDoKLSAgICBmcmllbmQgY2xhc3MJCUNQREZfQ29udGVudFBhcnNlcjsKLSAgICBmcmllbmQgY2xhc3MJCUNQREZfU3RyZWFtQ29udGVudFBhcnNlcjsKLSAgICBmcmllbmQgY2xhc3MJCUNQREZfQWxsU3RhdGVzOworIHByb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIENQREZfQ29udGVudFBhcnNlcjsKKyAgZnJpZW5kIGNsYXNzIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjsKKyAgZnJpZW5kIGNsYXNzIENQREZfQWxsU3RhdGVzOwogCi0gICAgZW51bSBQYXJzZVN0YXRlIHsKLSAgICAgICAgQ09OVEVOVF9OT1RfUEFSU0VELAotICAgICAgICBDT05URU5UX1BBUlNJTkcsCi0gICAgICAgIENPTlRFTlRfUEFSU0VECi0gICAgfTsKKyAgZW51bSBQYXJzZVN0YXRlIHsgQ09OVEVOVF9OT1RfUEFSU0VELCBDT05URU5UX1BBUlNJTkcsIENPTlRFTlRfUEFSU0VEIH07CiAKLSAgICB2b2lkCQkJCUxvYWRUcmFuc0luZm8oKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIENsZWFyQ2FjaGVPYmplY3RzKCk7CisgIHZvaWQgTG9hZFRyYW5zSW5mbygpOworICB2b2lkIENsZWFyQ2FjaGVPYmplY3RzKCk7CiAKLSAgICBDRlhfUHRyTGlzdAkJCW1fT2JqZWN0TGlzdDsKLSAgICBGWF9CT09MCQkJCW1fYkJhY2tncm91bmRBbHBoYU5lZWRlZDsKLSAgICBGWF9CT09MCQkJCW1fYlJlbGVhc2VNZW1iZXJzOwotICAgIENQREZfQ29udGVudFBhcnNlcioJbV9wUGFyc2VyOwotICAgIFBhcnNlU3RhdGUJCQltX1BhcnNlU3RhdGU7CisgIENGWF9QdHJMaXN0IG1fT2JqZWN0TGlzdDsKKyAgRlhfQk9PTCBtX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQ7CisgIEZYX0JPT0wgbV9iUmVsZWFzZU1lbWJlcnM7CisgIENQREZfQ29udGVudFBhcnNlciogbV9wUGFyc2VyOworICBQYXJzZVN0YXRlIG1fUGFyc2VTdGF0ZTsKIH07CiAKLWNsYXNzIENQREZfUGFnZSA6IHB1YmxpYyBDUERGX1BhZ2VPYmplY3RzLCBwdWJsaWMgQ0ZYX1ByaXZhdGVEYXRhCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1BhZ2UgOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0cywgcHVibGljIENGWF9Qcml2YXRlRGF0YSB7CisgcHVibGljOgorICBDUERGX1BhZ2UoKTsKIAotICAgIENQREZfUGFnZSgpOworICB+Q1BERl9QYWdlKCk7CiAKLSAgICB+Q1BERl9QYWdlKCk7CisgIHZvaWQgTG9hZChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwKKyAgICAgICAgICAgIEZYX0JPT0wgYlBhZ2VDYWNoZSA9IFRSVUUpOwogCi0gICAgdm9pZAkJCQlMb2FkKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIEZYX0JPT0wgYlBhZ2VDYWNoZSA9IFRSVUUpOworICB2b2lkIFN0YXJ0UGFyc2UoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zID0gTlVMTCwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFKTsKIAotICAgIHZvaWQJCQkJU3RhcnRQYXJzZShDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOworICB2b2lkIFBhcnNlQ29udGVudChDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCQlQYXJzZUNvbnRlbnQoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zID0gTlVMTCwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFKTsKKyAgdm9pZCBHZXREaXNwbGF5TWF0cml4KENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVJvdGF0ZSkgY29uc3Q7CiAKLSAgICB2b2lkCQkJCUdldERpc3BsYXlNYXRyaXgoQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4LCBpbnQgeFBvcywgaW50IHlQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4U2l6ZSwgaW50IHlTaXplLCBpbnQgaVJvdGF0ZSkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldFBhZ2VXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fUGFnZVdpZHRoOyB9CiAKLSAgICBGWF9GTE9BVAkJCUdldFBhZ2VXaWR0aCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9QYWdlV2lkdGg7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRQYWdlSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9QYWdlSGVpZ2h0OyB9CiAKLSAgICBGWF9GTE9BVAkJCUdldFBhZ2VIZWlnaHQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUGFnZUhlaWdodDsKLSAgICB9CisgIENGWF9GbG9hdFJlY3QgR2V0UGFnZUJCb3goKSBjb25zdCB7IHJldHVybiBtX0JCb3g7IH0KIAotICAgIENGWF9GbG9hdFJlY3QJCUdldFBhZ2VCQm94KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0JCb3g7Ci0gICAgfQorICBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBHZXRQYWdlTWF0cml4KCkgY29uc3QgeyByZXR1cm4gbV9QYWdlTWF0cml4OyB9CiAKLSAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4JglHZXRQYWdlTWF0cml4KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1BhZ2VNYXRyaXg7Ci0gICAgfQorICBDUERGX09iamVjdCogR2V0UGFnZUF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdDsKIAotICAgIENQREZfT2JqZWN0KgkJR2V0UGFnZUF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdDsKKyAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIEdldFJlbmRlckNhY2hlKCkgY29uc3QgeyByZXR1cm4gbV9wUGFnZVJlbmRlcjsgfQogCisgIHZvaWQgQ2xlYXJSZW5kZXJDYWNoZSgpOwogCisgcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQ1BERl9Db250ZW50UGFyc2VyOwogCi0gICAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqCUdldFJlbmRlckNhY2hlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYWdlUmVuZGVyOwotICAgIH0KKyAgRlhfRkxPQVQgbV9QYWdlV2lkdGg7CiAKLSAgICB2b2lkCQkJCUNsZWFyUmVuZGVyQ2FjaGUoKTsKKyAgRlhfRkxPQVQgbV9QYWdlSGVpZ2h0OwogCi1wcm90ZWN0ZWQ6Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX0NvbnRlbnRQYXJzZXI7CisgIENGWF9BZmZpbmVNYXRyaXggbV9QYWdlTWF0cml4OwogCi0gICAgRlhfRkxPQVQJCQltX1BhZ2VXaWR0aDsKLQotICAgIEZYX0ZMT0FUCQkJbV9QYWdlSGVpZ2h0OwotCi0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX1BhZ2VNYXRyaXg7Ci0KLSAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSoJbV9wUGFnZVJlbmRlcjsKKyAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIG1fcFBhZ2VSZW5kZXI7CiB9OwotY2xhc3MgQ1BERl9QYXJzZU9wdGlvbnMKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfUGFyc2VPcHRpb25zIHsKKyBwdWJsaWM6CisgIENQREZfUGFyc2VPcHRpb25zKCk7CiAKLSAgICBDUERGX1BhcnNlT3B0aW9ucygpOworICBGWF9CT09MIG1fYlRleHRPbmx5OwogCi0gICAgRlhfQk9PTAkJCQltX2JUZXh0T25seTsKKyAgRlhfQk9PTCBtX2JNYXJrZWRDb250ZW50OwogCi0gICAgRlhfQk9PTAkJCQltX2JNYXJrZWRDb250ZW50OworICBGWF9CT09MIG1fYlNlcGFyYXRlRm9ybTsKIAotICAgIEZYX0JPT0wJCQkJbV9iU2VwYXJhdGVGb3JtOwotCi0gICAgRlhfQk9PTAkJCQltX2JEZWNvZGVJbmxpbmVJbWFnZTsKKyAgRlhfQk9PTCBtX2JEZWNvZGVJbmxpbmVJbWFnZTsKIH07Ci1jbGFzcyBDUERGX0Zvcm0gOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0cwotewotcHVibGljOgorY2xhc3MgQ1BERl9Gb3JtIDogcHVibGljIENQREZfUGFnZU9iamVjdHMgeworIHB1YmxpYzoKKyAgQ1BERl9Gb3JtKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCisgICAgICAgICAgICBDUERGX1N0cmVhbSogcEZvcm1TdHJlYW0sCisgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnRSZXNvdXJjZXMgPSBOVUxMKTsKIAotICAgIENQREZfRm9ybShDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsIENQREZfU3RyZWFtKiBwRm9ybVN0cmVhbSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50UmVzb3VyY2VzID0gTlVMTCk7CisgIH5DUERGX0Zvcm0oKTsKIAotICAgIH5DUERGX0Zvcm0oKTsKKyAgdm9pZCBTdGFydFBhcnNlKENQREZfQWxsU3RhdGVzKiBwR3JhcGhpY1N0YXRlcywKKyAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgsCisgICAgICAgICAgICAgICAgICBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciwKKyAgICAgICAgICAgICAgICAgIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IDApOwogCi0gICAgdm9pZAkJCQlTdGFydFBhcnNlKENQREZfQWxsU3RhdGVzKiBwR3JhcGhpY1N0YXRlcywgIENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLCBDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMsIGludCBsZXZlbCA9IDApOworICB2b2lkIFBhcnNlQ29udGVudChDUERGX0FsbFN0YXRlcyogcEdyYXBoaWNTdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgICBDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IDApOwogCi0gICAgdm9pZAkJCQlQYXJzZUNvbnRlbnQoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLCBDRlhfQWZmaW5lTWF0cml4KiBwUGFyZW50TWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLCBDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMsIGludCBsZXZlbCA9IDApOwotCi0gICAgQ1BERl9Gb3JtKgkJCUNsb25lKCkgY29uc3Q7CisgIENQREZfRm9ybSogQ2xvbmUoKSBjb25zdDsKIH07Ci1jbGFzcyBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGUKLXsKLXB1YmxpYzoKLSAgICBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGUoQ1BERl9QYWdlKiBwUGFnZSk7Ci0gICAgfkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZSgpOwotICAgIEZYX0JPT0wgSW5zZXJ0UGFnZU9iamVjdChDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0KTsKLSAgICB2b2lkIEdlbmVyYXRlQ29udGVudCgpOwotICAgIHZvaWQgVHJhbnNmb3JtQ29udGVudChDRlhfTWF0cml4JiBtYXRyaXgpOwotcHJvdGVjdGVkOgotICAgIHZvaWQgICAgICAgICAgICBQcm9jZXNzSW1hZ2UoQ0ZYX0J5dGVUZXh0QnVmJiBidWYsIENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaik7Ci0gICAgdm9pZCAgICAgICAgICAgIFByb2Nlc3NGb3JtKENGWF9CeXRlVGV4dEJ1ZiYgYnVmLCBjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCBDRlhfTWF0cml4JiBtYXRyaXgpOwotICAgIENGWF9CeXRlU3RyaW5nICBSZWFsaXplUmVzb3VyY2UoQ1BERl9PYmplY3QqIHBSZXNvdXJjZU9iaiwgY29uc3QgRlhfQ0hBUiogc3pUeXBlKTsKLXByaXZhdGU6Ci0gICAgQ1BERl9QYWdlKiAgICAgIG1fcFBhZ2U7Ci0gICAgQ1BERl9Eb2N1bWVudCogIG1fcERvY3VtZW50OwotICAgIENGWF9QdHJBcnJheSAgICBtX3BhZ2VPYmplY3RzOworY2xhc3MgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlIHsKKyBwdWJsaWM6CisgIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZShDUERGX1BhZ2UqIHBQYWdlKTsKKyAgfkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZSgpOworICBGWF9CT09MIEluc2VydFBhZ2VPYmplY3QoQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iamVjdCk7CisgIHZvaWQgR2VuZXJhdGVDb250ZW50KCk7CisgIHZvaWQgVHJhbnNmb3JtQ29udGVudChDRlhfTWF0cml4JiBtYXRyaXgpOworCisgcHJvdGVjdGVkOgorICB2b2lkIFByb2Nlc3NJbWFnZShDRlhfQnl0ZVRleHRCdWYmIGJ1ZiwgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqKTsKKyAgdm9pZCBQcm9jZXNzRm9ybShDRlhfQnl0ZVRleHRCdWYmIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCYgbWF0cml4KTsKKyAgQ0ZYX0J5dGVTdHJpbmcgUmVhbGl6ZVJlc291cmNlKENQREZfT2JqZWN0KiBwUmVzb3VyY2VPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBzelR5cGUpOworCisgcHJpdmF0ZToKKyAgQ1BERl9QYWdlKiBtX3BQYWdlOworICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKKyAgQ0ZYX1B0ckFycmF5IG1fcGFnZU9iamVjdHM7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZfUEFHRV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaAppbmRleCA3MzU0MGEzLi5iZTgxMjQ0IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaApAQCAtMzEsNjcyICszMSw1NDAgQEAKIGNsYXNzIENQREZfRm9ybU9iamVjdDsKIHR5cGVkZWYgQ0ZYX1BhdGhEYXRhIENQREZfUGF0aERhdGE7CiAKLWNsYXNzIENQREZfUGF0aCA6IHB1YmxpYyBDRlhfQ291bnRSZWY8Q0ZYX1BhdGhEYXRhPgotewotcHVibGljOgotICAgIGludAkJCQkJR2V0UG9pbnRDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0LT5tX1BvaW50Q291bnQ7Ci0gICAgfQorY2xhc3MgQ1BERl9QYXRoIDogcHVibGljIENGWF9Db3VudFJlZjxDRlhfUGF0aERhdGE+IHsKKyBwdWJsaWM6CisgIGludCBHZXRQb2ludENvdW50KCkgeyByZXR1cm4gbV9wT2JqZWN0LT5tX1BvaW50Q291bnQ7IH0KIAotICAgIGludAkJCQkJR2V0RmxhZyhpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0LT5tX3BQb2ludHNbaW5kZXhdLm1fRmxhZzsKLSAgICB9CisgIGludCBHZXRGbGFnKGludCBpbmRleCkgeyByZXR1cm4gbV9wT2JqZWN0LT5tX3BQb2ludHNbaW5kZXhdLm1fRmxhZzsgfQogCi0gICAgRlhfRkxPQVQJCQlHZXRQb2ludFgoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+bV9wUG9pbnRzW2luZGV4XS5tX1BvaW50WDsKLSAgICB9CisgIEZYX0ZMT0FUIEdldFBvaW50WChpbnQgaW5kZXgpIHsgcmV0dXJuIG1fcE9iamVjdC0+bV9wUG9pbnRzW2luZGV4XS5tX1BvaW50WDsgfQogCi0gICAgRlhfRkxPQVQJCQlHZXRQb2ludFkoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+bV9wUG9pbnRzW2luZGV4XS5tX1BvaW50WTsKLSAgICB9CisgIEZYX0ZMT0FUIEdldFBvaW50WShpbnQgaW5kZXgpIHsgcmV0dXJuIG1fcE9iamVjdC0+bV9wUG9pbnRzW2luZGV4XS5tX1BvaW50WTsgfQogCisgIEZYX1BBVEhQT0lOVCogR2V0UG9pbnRzKCkgeyByZXR1cm4gbV9wT2JqZWN0LT5tX3BQb2ludHM7IH0KIAorICBDRlhfRmxvYXRSZWN0IEdldEJvdW5kaW5nQm94KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0LT5HZXRCb3VuZGluZ0JveCgpOyB9CiAKKyAgQ0ZYX0Zsb2F0UmVjdCBHZXRCb3VuZGluZ0JveChGWF9GTE9BVCBsaW5lX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1pdGVyX2xpbWl0KSBjb25zdCB7CisgICAgcmV0dXJuIG1fcE9iamVjdC0+R2V0Qm91bmRpbmdCb3gobGluZV93aWR0aCwgbWl0ZXJfbGltaXQpOworICB9CiAKLSAgICBGWF9QQVRIUE9JTlQqCQlHZXRQb2ludHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+bV9wUG9pbnRzOwotICAgIH0KKyAgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkgeworICAgIEdldE1vZGlmeSgpLT5UcmFuc2Zvcm0ocE1hdHJpeCk7CisgIH0KIAorICB2b2lkIEFwcGVuZChDUERGX1BhdGggc3JjLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KSB7CisgICAgbV9wT2JqZWN0LT5BcHBlbmQoc3JjLm1fcE9iamVjdCwgcE1hdHJpeCk7CisgIH0KIAotICAgIENGWF9GbG9hdFJlY3QJCUdldEJvdW5kaW5nQm94KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QtPkdldEJvdW5kaW5nQm94KCk7Ci0gICAgfQorICB2b2lkIEFwcGVuZFJlY3QoRlhfRkxPQVQgbGVmdCwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wKSB7CisgICAgbV9wT2JqZWN0LT5BcHBlbmRSZWN0KGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7CisgIH0KIAotICAgIENGWF9GbG9hdFJlY3QJCUdldEJvdW5kaW5nQm94KEZYX0ZMT0FUIGxpbmVfd2lkdGgsIEZYX0ZMT0FUIG1pdGVyX2xpbWl0KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+R2V0Qm91bmRpbmdCb3gobGluZV93aWR0aCwgbWl0ZXJfbGltaXQpOwotICAgIH0KLQotICAgIHZvaWQJCQkJVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpCi0gICAgewotICAgICAgICBHZXRNb2RpZnkoKS0+VHJhbnNmb3JtKHBNYXRyaXgpOwotICAgIH0KLQotICAgIHZvaWQJCQkJQXBwZW5kKENQREZfUGF0aCBzcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpCi0gICAgewotICAgICAgICBtX3BPYmplY3QtPkFwcGVuZChzcmMubV9wT2JqZWN0LCBwTWF0cml4KTsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCUFwcGVuZFJlY3QoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgYm90dG9tLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgdG9wKQotICAgIHsKLSAgICAgICAgbV9wT2JqZWN0LT5BcHBlbmRSZWN0KGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7Ci0gICAgfQotCi0gICAgRlhfQk9PTAkJCQlJc1JlY3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+SXNSZWN0KCk7Ci0gICAgfQorICBGWF9CT09MIElzUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iamVjdC0+SXNSZWN0KCk7IH0KIH07Ci1jbGFzcyBDUERGX0NsaXBQYXRoRGF0YQotewotcHVibGljOgorY2xhc3MgQ1BERl9DbGlwUGF0aERhdGEgeworIHB1YmxpYzoKKyAgQ1BERl9DbGlwUGF0aERhdGEoKTsKIAotICAgIENQREZfQ2xpcFBhdGhEYXRhKCk7CisgIENQREZfQ2xpcFBhdGhEYXRhKGNvbnN0IENQREZfQ2xpcFBhdGhEYXRhJik7CiAKLSAgICBDUERGX0NsaXBQYXRoRGF0YShjb25zdCBDUERGX0NsaXBQYXRoRGF0YSYpOworICB+Q1BERl9DbGlwUGF0aERhdGEoKTsKIAotICAgIH5DUERGX0NsaXBQYXRoRGF0YSgpOworICB2b2lkIFNldENvdW50KGludCBwYXRoX2NvdW50LCBpbnQgdGV4dF9jb3VudCk7CiAKLSAgICB2b2lkCQkJCVNldENvdW50KGludCBwYXRoX2NvdW50LCBpbnQgdGV4dF9jb3VudCk7Ci1wdWJsaWM6CisgcHVibGljOgorICBpbnQgbV9QYXRoQ291bnQ7CiAKLSAgICBpbnQJCQkJCW1fUGF0aENvdW50OworICBDUERGX1BhdGgqIG1fcFBhdGhMaXN0OwogCi0gICAgQ1BERl9QYXRoKgkJCW1fcFBhdGhMaXN0OworICB1aW50OF90KiBtX3BUeXBlTGlzdDsKIAotICAgIHVpbnQ4X3QqCQkJbV9wVHlwZUxpc3Q7CisgIGludCBtX1RleHRDb3VudDsKIAotICAgIGludAkJCQkJbV9UZXh0Q291bnQ7Ci0KLSAgICBDUERGX1RleHRPYmplY3QqKgltX3BUZXh0TGlzdDsKKyAgQ1BERl9UZXh0T2JqZWN0KiogbV9wVGV4dExpc3Q7CiB9OwotY2xhc3MgQ1BERl9DbGlwUGF0aCA6IHB1YmxpYyBDRlhfQ291bnRSZWY8Q1BERl9DbGlwUGF0aERhdGE+Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0NsaXBQYXRoIDogcHVibGljIENGWF9Db3VudFJlZjxDUERGX0NsaXBQYXRoRGF0YT4geworIHB1YmxpYzoKKyAgRlhfRFdPUkQgR2V0UGF0aENvdW50KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0LT5tX1BhdGhDb3VudDsgfQogCi0gICAgRlhfRFdPUkQJCQlHZXRQYXRoQ291bnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+bV9QYXRoQ291bnQ7Ci0gICAgfQorICBDUERGX1BhdGggR2V0UGF0aChpbnQgaSkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0LT5tX3BQYXRoTGlzdFtpXTsgfQogCi0gICAgQ1BERl9QYXRoCQkJR2V0UGF0aChpbnQgaSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QtPm1fcFBhdGhMaXN0W2ldOwotICAgIH0KKyAgaW50IEdldENsaXBUeXBlKGludCBpKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3QtPm1fcFR5cGVMaXN0W2ldOyB9CiAKLSAgICBpbnQJCQkJCUdldENsaXBUeXBlKGludCBpKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+bV9wVHlwZUxpc3RbaV07Ci0gICAgfQorICBGWF9EV09SRCBHZXRUZXh0Q291bnQoKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3QtPm1fVGV4dENvdW50OyB9CiAKLSAgICBGWF9EV09SRAkJCUdldFRleHRDb3VudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0LT5tX1RleHRDb3VudDsKLSAgICB9CisgIENQREZfVGV4dE9iamVjdCogR2V0VGV4dChpbnQgaSkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0LT5tX3BUZXh0TGlzdFtpXTsgfQogCi0gICAgQ1BERl9UZXh0T2JqZWN0KglHZXRUZXh0KGludCBpKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+bV9wVGV4dExpc3RbaV07Ci0gICAgfQorICBDRlhfRmxvYXRSZWN0IEdldENsaXBCb3goKSBjb25zdDsKIAotICAgIENGWF9GbG9hdFJlY3QJCUdldENsaXBCb3goKSBjb25zdDsKKyAgdm9pZCBBcHBlbmRQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgRlhfQk9PTCBiQXV0b01lcmdlKTsKIAotICAgIHZvaWQJCQkJQXBwZW5kUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIEZYX0JPT0wgYkF1dG9NZXJnZSk7CisgIHZvaWQgRGVsZXRlUGF0aChpbnQgbGF5ZXJfaW5kZXgpOwogCi0gICAgdm9pZAkJCQlEZWxldGVQYXRoKGludCBsYXllcl9pbmRleCk7CisgIHZvaWQgQXBwZW5kVGV4dHMoQ1BERl9UZXh0T2JqZWN0KiogcFRleHRzLCBpbnQgY291bnQpOwogCi0gICAgdm9pZAkJCQlBcHBlbmRUZXh0cyhDUERGX1RleHRPYmplY3QqKiBwVGV4dHMsIGludCBjb3VudCk7Ci0KLSAgICB2b2lkCQkJCVRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOworICB2b2lkIFRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOwogfTsKLWNsYXNzIENQREZfQ29sb3JTdGF0ZURhdGEKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfQ29sb3JTdGF0ZURhdGEgeworIHB1YmxpYzoKKyAgQ1BERl9Db2xvclN0YXRlRGF0YSgpIDogbV9GaWxsUkdCKDApLCBtX1N0cm9rZVJHQigwKSB7fQogCi0gICAgQ1BERl9Db2xvclN0YXRlRGF0YSgpOiBtX0ZpbGxSR0IoMCksIG1fU3Ryb2tlUkdCKDApIHt9CisgIENQREZfQ29sb3JTdGF0ZURhdGEoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSYgc3JjKTsKIAotICAgIENQREZfQ29sb3JTdGF0ZURhdGEoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSYgc3JjKTsKKyAgdm9pZCBEZWZhdWx0KCk7CiAKLSAgICB2b2lkCQkJCURlZmF1bHQoKTsKKyAgQ1BERl9Db2xvciBtX0ZpbGxDb2xvcjsKIAotICAgIENQREZfQ29sb3IJCQltX0ZpbGxDb2xvcjsKKyAgRlhfRFdPUkQgbV9GaWxsUkdCOwogCi0gICAgRlhfRFdPUkQJCQltX0ZpbGxSR0I7CisgIENQREZfQ29sb3IgbV9TdHJva2VDb2xvcjsKIAotICAgIENQREZfQ29sb3IJCQltX1N0cm9rZUNvbG9yOwotCi0gICAgRlhfRFdPUkQJCQltX1N0cm9rZVJHQjsKKyAgRlhfRFdPUkQgbV9TdHJva2VSR0I7CiB9OwotY2xhc3MgQ1BERl9Db2xvclN0YXRlIDogcHVibGljIENGWF9Db3VudFJlZjxDUERGX0NvbG9yU3RhdGVEYXRhPgotewotcHVibGljOgorY2xhc3MgQ1BERl9Db2xvclN0YXRlIDogcHVibGljIENGWF9Db3VudFJlZjxDUERGX0NvbG9yU3RhdGVEYXRhPiB7CisgcHVibGljOgorICBDUERGX0NvbG9yKiBHZXRGaWxsQ29sb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcE9iamVjdCA/ICZtX3BPYmplY3QtPm1fRmlsbENvbG9yIDogTlVMTDsKKyAgfQogCi0gICAgQ1BERl9Db2xvcioJCQlHZXRGaWxsQ29sb3IoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdCA/ICZtX3BPYmplY3QtPm1fRmlsbENvbG9yIDogTlVMTDsKLSAgICB9CisgIENQREZfQ29sb3IqIEdldFN0cm9rZUNvbG9yKCkgY29uc3QgeworICAgIHJldHVybiBtX3BPYmplY3QgPyAmbV9wT2JqZWN0LT5tX1N0cm9rZUNvbG9yIDogTlVMTDsKKyAgfQogCi0gICAgQ1BERl9Db2xvcioJCQlHZXRTdHJva2VDb2xvcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID8gJm1fcE9iamVjdC0+bV9TdHJva2VDb2xvciA6IE5VTEw7Ci0gICAgfQorICB2b2lkIFNldEZpbGxDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOwogCi0gICAgdm9pZAkJCQlTZXRGaWxsQ29sb3IoQ1BERl9Db2xvclNwYWNlKiBwQ1MsIEZYX0ZMT0FUKiBwVmFsdWUsIGludCBuVmFsdWVzKTsKKyAgdm9pZCBTZXRTdHJva2VDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOwogCi0gICAgdm9pZAkJCQlTZXRTdHJva2VDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOworICB2b2lkIFNldEZpbGxQYXR0ZXJuKENQREZfUGF0dGVybiogcGF0dGVybiwgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOwogCi0gICAgdm9pZAkJCQlTZXRGaWxsUGF0dGVybihDUERGX1BhdHRlcm4qIHBhdHRlcm4sIEZYX0ZMT0FUKiBwVmFsdWUsIGludCBuVmFsdWVzKTsKKyAgdm9pZCBTZXRTdHJva2VQYXR0ZXJuKENQREZfUGF0dGVybiogcGF0dGVybiwgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOwogCi0gICAgdm9pZAkJCQlTZXRTdHJva2VQYXR0ZXJuKENQREZfUGF0dGVybiogcGF0dGVybiwgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOwotcHJpdmF0ZToKLSAgICB2b2lkCQkJCVNldENvbG9yKENQREZfQ29sb3ImIGNvbG9yLCBGWF9EV09SRCYgcmdiLCBDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOworIHByaXZhdGU6CisgIHZvaWQgU2V0Q29sb3IoQ1BERl9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHJnYiwKKyAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUywKKyAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFZhbHVlLAorICAgICAgICAgICAgICAgIGludCBuVmFsdWVzKTsKIH07CiB0eXBlZGVmIENGWF9HcmFwaFN0YXRlRGF0YSBDUERGX0dyYXBoU3RhdGVEYXRhOwotY2xhc3MgQ1BERl9HcmFwaFN0YXRlIDogcHVibGljIENGWF9Db3VudFJlZjxDRlhfR3JhcGhTdGF0ZURhdGE+Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0dyYXBoU3RhdGUgOiBwdWJsaWMgQ0ZYX0NvdW50UmVmPENGWF9HcmFwaFN0YXRlRGF0YT4geworIHB1YmxpYzoKIH07Ci1jbGFzcyBDUERGX1RleHRTdGF0ZURhdGEKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfVGV4dFN0YXRlRGF0YSB7CisgcHVibGljOgorICBDUERGX1RleHRTdGF0ZURhdGEoKTsKIAotICAgIENQREZfVGV4dFN0YXRlRGF0YSgpOworICBDUERGX1RleHRTdGF0ZURhdGEoY29uc3QgQ1BERl9UZXh0U3RhdGVEYXRhJiBzcmMpOwogCi0gICAgQ1BERl9UZXh0U3RhdGVEYXRhKGNvbnN0IENQREZfVGV4dFN0YXRlRGF0YSYgc3JjKTsKKyAgfkNQREZfVGV4dFN0YXRlRGF0YSgpOwogCi0gICAgfkNQREZfVGV4dFN0YXRlRGF0YSgpOworICBDUERGX0ZvbnQqIG1fcEZvbnQ7CiAKLSAgICBDUERGX0ZvbnQqCQkJbV9wRm9udDsKKyAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CiAKLSAgICBDUERGX0RvY3VtZW50KgkJbV9wRG9jdW1lbnQ7CisgIEZYX0ZMT0FUIG1fRm9udFNpemU7CiAKLSAgICBGWF9GTE9BVAkJCW1fRm9udFNpemU7CisgIEZYX0ZMT0FUIG1fQ2hhclNwYWNlOwogCi0gICAgRlhfRkxPQVQJCQltX0NoYXJTcGFjZTsKKyAgRlhfRkxPQVQgbV9Xb3JkU3BhY2U7CiAKLSAgICBGWF9GTE9BVAkJCW1fV29yZFNwYWNlOworICBGWF9GTE9BVCBtX01hdHJpeFs0XTsKIAotICAgIEZYX0ZMT0FUCQltX01hdHJpeFs0XTsKKyAgaW50IG1fVGV4dE1vZGU7CiAKLSAgICBpbnQJCQkJCW1fVGV4dE1vZGU7Ci0KLSAgICBGWF9GTE9BVAkJbV9DVE1bNF07CisgIEZYX0ZMT0FUIG1fQ1RNWzRdOwogfTsKLWNsYXNzIENQREZfVGV4dFN0YXRlIDogcHVibGljIENGWF9Db3VudFJlZjxDUERGX1RleHRTdGF0ZURhdGE+Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1RleHRTdGF0ZSA6IHB1YmxpYyBDRlhfQ291bnRSZWY8Q1BERl9UZXh0U3RhdGVEYXRhPiB7CisgcHVibGljOgorICBDUERGX0ZvbnQqIEdldEZvbnQoKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3QtPm1fcEZvbnQ7IH0KIAotICAgIENQREZfRm9udCoJCQlHZXRGb250KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QtPm1fcEZvbnQ7Ci0gICAgfQorICB2b2lkIFNldEZvbnQoQ1BERl9Gb250KiBwRm9udCk7CiAKLSAgICB2b2lkCQkJCVNldEZvbnQoQ1BERl9Gb250KiBwRm9udCk7CisgIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0LT5tX0ZvbnRTaXplOyB9CiAKLSAgICBGWF9GTE9BVAkJCUdldEZvbnRTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QtPm1fRm9udFNpemU7Ci0gICAgfQorICBGWF9GTE9BVCogR2V0TWF0cml4KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0LT5tX01hdHJpeDsgfQogCi0gICAgRlhfRkxPQVQqCQkJR2V0TWF0cml4KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QtPm1fTWF0cml4OwotICAgIH0KKyAgRlhfRkxPQVQgR2V0Rm9udFNpemVWKCkgY29uc3Q7CiAKKyAgRlhfRkxPQVQgR2V0Rm9udFNpemVIKCkgY29uc3Q7CiAKKyAgRlhfRkxPQVQgR2V0QmFzZWxpbmVBbmdsZSgpIGNvbnN0OwogCi0gICAgRlhfRkxPQVQJCQlHZXRGb250U2l6ZVYoKSBjb25zdDsKLQotICAgIEZYX0ZMT0FUCQkJR2V0Rm9udFNpemVIKCkgY29uc3Q7Ci0KLSAgICBGWF9GTE9BVAkJCUdldEJhc2VsaW5lQW5nbGUoKSBjb25zdDsKLQotICAgIEZYX0ZMT0FUCQkJR2V0U2hlYXJBbmdsZSgpIGNvbnN0OwotCisgIEZYX0ZMT0FUIEdldFNoZWFyQW5nbGUoKSBjb25zdDsKIH07CiBjbGFzcyBDUERGX1RyYW5zZmVyRnVuYzsKLWNsYXNzIENQREZfR2VuZXJhbFN0YXRlRGF0YQotewotcHVibGljOgorY2xhc3MgQ1BERl9HZW5lcmFsU3RhdGVEYXRhIHsKKyBwdWJsaWM6CisgIENQREZfR2VuZXJhbFN0YXRlRGF0YSgpOwogCi0gICAgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKCk7CisgIENQREZfR2VuZXJhbFN0YXRlRGF0YShjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEmIHNyYyk7CisgIH5DUERGX0dlbmVyYWxTdGF0ZURhdGEoKTsKIAotICAgIENQREZfR2VuZXJhbFN0YXRlRGF0YShjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEmIHNyYyk7Ci0gICAgfkNQREZfR2VuZXJhbFN0YXRlRGF0YSgpOworICB2b2lkIFNldEJsZW5kTW9kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJsZW5kX21vZGUpOwogCi0gICAgdm9pZAkJCQlTZXRCbGVuZE1vZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBibGVuZF9tb2RlKTsKKyAgY2hhciBtX0JsZW5kTW9kZVsxNl07CiAKLSAgICBjaGFyCQkJCW1fQmxlbmRNb2RlWzE2XTsKKyAgaW50IG1fQmxlbmRUeXBlOwogCi0gICAgaW50CQkJCQltX0JsZW5kVHlwZTsKKyAgQ1BERl9PYmplY3QqIG1fcFNvZnRNYXNrOwogCi0gICAgQ1BERl9PYmplY3QqCQltX3BTb2Z0TWFzazsKKyAgRlhfRkxPQVQgbV9TTWFza01hdHJpeFs2XTsKIAotICAgIEZYX0ZMT0FUCQkJbV9TTWFza01hdHJpeFs2XTsKKyAgRlhfRkxPQVQgbV9TdHJva2VBbHBoYTsKIAotICAgIEZYX0ZMT0FUCQkJbV9TdHJva2VBbHBoYTsKKyAgRlhfRkxPQVQgbV9GaWxsQWxwaGE7CiAKLSAgICBGWF9GTE9BVAkJCW1fRmlsbEFscGhhOworICBDUERGX09iamVjdCogbV9wVFI7CiAKLSAgICBDUERGX09iamVjdCoJCW1fcFRSOworICBDUERGX1RyYW5zZmVyRnVuYyogbV9wVHJhbnNmZXJGdW5jOwogCi0gICAgQ1BERl9UcmFuc2ZlckZ1bmMqCW1fcFRyYW5zZmVyRnVuYzsKKyAgQ0ZYX01hdHJpeCBtX01hdHJpeDsKIAotICAgIENGWF9NYXRyaXgJCQltX01hdHJpeDsKKyAgaW50IG1fUmVuZGVySW50ZW50OwogCi0gICAgaW50CQkJCQltX1JlbmRlckludGVudDsKKyAgRlhfQk9PTCBtX1N0cm9rZUFkanVzdDsKIAotICAgIEZYX0JPT0wJCQkJbV9TdHJva2VBZGp1c3Q7CisgIEZYX0JPT0wgbV9BbHBoYVNvdXJjZTsKIAotICAgIEZYX0JPT0wJCQkJbV9BbHBoYVNvdXJjZTsKKyAgRlhfQk9PTCBtX1RleHRLbm9ja291dDsKIAotICAgIEZYX0JPT0wJCQkJbV9UZXh0S25vY2tvdXQ7CisgIEZYX0JPT0wgbV9TdHJva2VPUDsKIAotICAgIEZYX0JPT0wJCQkJbV9TdHJva2VPUDsKKyAgRlhfQk9PTCBtX0ZpbGxPUDsKIAotICAgIEZYX0JPT0wJCQkJbV9GaWxsT1A7CisgIGludCBtX09QTW9kZTsKIAotICAgIGludAkJCQkJbV9PUE1vZGU7CisgIENQREZfT2JqZWN0KiBtX3BCRzsKIAotICAgIENQREZfT2JqZWN0KgkJbV9wQkc7CisgIENQREZfT2JqZWN0KiBtX3BVQ1I7CiAKLSAgICBDUERGX09iamVjdCoJCW1fcFVDUjsKKyAgQ1BERl9PYmplY3QqIG1fcEhUOwogCi0gICAgQ1BERl9PYmplY3QqCQltX3BIVDsKKyAgRlhfRkxPQVQgbV9GbGF0bmVzczsKIAotICAgIEZYX0ZMT0FUCQkJbV9GbGF0bmVzczsKLQotICAgIEZYX0ZMT0FUCQkJbV9TbW9vdGhuZXNzOworICBGWF9GTE9BVCBtX1Ntb290aG5lc3M7CiB9OwotY2xhc3MgQ1BERl9HZW5lcmFsU3RhdGUgOiBwdWJsaWMgQ0ZYX0NvdW50UmVmPENQREZfR2VuZXJhbFN0YXRlRGF0YT4KLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfR2VuZXJhbFN0YXRlIDogcHVibGljIENGWF9Db3VudFJlZjxDUERGX0dlbmVyYWxTdGF0ZURhdGE+IHsKKyBwdWJsaWM6CisgIHZvaWQgU2V0UmVuZGVySW50ZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaSk7CiAKLSAgICB2b2lkCQkJCVNldFJlbmRlckludGVudChjb25zdCBDRlhfQnl0ZVN0cmluZyYgcmkpOworICBpbnQgR2V0QmxlbmRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBtX3BPYmplY3QgPyBtX3BPYmplY3QtPm1fQmxlbmRUeXBlIDogRlhESUJfQkxFTkRfTk9STUFMOworICB9CiAKLSAgICBpbnQJCQkJCUdldEJsZW5kVHlwZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID8gbV9wT2JqZWN0LT5tX0JsZW5kVHlwZSA6IEZYRElCX0JMRU5EX05PUk1BTDsKLSAgICB9Ci0KLSAgICBpbnQJCQkJCUdldEFscGhhKEZYX0JPT0wgYlN0cm9rZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QgPyBGWFNZU19yb3VuZCgoYlN0cm9rZSA/IG1fcE9iamVjdC0+bV9TdHJva2VBbHBoYSA6IG1fcE9iamVjdC0+bV9GaWxsQWxwaGEpICogMjU1KSA6IDI1NTsKLSAgICB9CisgIGludCBHZXRBbHBoYShGWF9CT09MIGJTdHJva2UpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wT2JqZWN0ID8gRlhTWVNfcm91bmQoKGJTdHJva2UgPyBtX3BPYmplY3QtPm1fU3Ryb2tlQWxwaGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX3BPYmplY3QtPm1fRmlsbEFscGhhKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSkKKyAgICAgICAgICAgICAgICAgICAgIDogMjU1OworICB9CiB9OwotY2xhc3MgQ1BERl9Db250ZW50TWFya0l0ZW0KLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfQ29udGVudE1hcmtJdGVtIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgZW51bSB7IE5vbmUsIFByb3BlcnRpZXNEaWN0LCBEaXJlY3REaWN0LCBNQ0lEIH0gUGFyYW1UeXBlOwogCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgTm9uZSwKLSAgICAgICAgUHJvcGVydGllc0RpY3QsCi0gICAgICAgIERpcmVjdERpY3QsCi0gICAgICAgIE1DSUQKLSAgICB9IFBhcmFtVHlwZTsKKyAgQ1BERl9Db250ZW50TWFya0l0ZW0oKTsKIAotICAgIENQREZfQ29udGVudE1hcmtJdGVtKCk7CisgIENQREZfQ29udGVudE1hcmtJdGVtKGNvbnN0IENQREZfQ29udGVudE1hcmtJdGVtJiBzcmMpOwogCi0gICAgQ1BERl9Db250ZW50TWFya0l0ZW0oY29uc3QgQ1BERl9Db250ZW50TWFya0l0ZW0mIHNyYyk7CisgIH5DUERGX0NvbnRlbnRNYXJrSXRlbSgpOwogCi0gICAgfkNQREZfQ29udGVudE1hcmtJdGVtKCk7CisgIGlubGluZSBjb25zdCBDRlhfQnl0ZVN0cmluZyYgR2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fTWFya05hbWU7IH0KIAotICAgIGlubGluZSBjb25zdCBDRlhfQnl0ZVN0cmluZyYJR2V0TmFtZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9NYXJrTmFtZTsKLSAgICB9CisgIGlubGluZSBQYXJhbVR5cGUgR2V0UGFyYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gbV9QYXJhbVR5cGU7IH0KIAotICAgIGlubGluZSBQYXJhbVR5cGUJR2V0UGFyYW1UeXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1BhcmFtVHlwZTsKLSAgICB9CisgIGlubGluZSB2b2lkKiBHZXRQYXJhbSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhcmFtOyB9CiAKLSAgICBpbmxpbmUgdm9pZCoJCUdldFBhcmFtKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYXJhbTsKLSAgICB9CisgIGlubGluZSBGWF9CT09MIEhhc01DSUQoKSBjb25zdDsKIAotICAgIGlubGluZSBGWF9CT09MCQlIYXNNQ0lEKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIFNldE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsgbV9NYXJrTmFtZSA9IG5hbWU7IH0KIAotICAgIGlubGluZSB2b2lkCQkJU2V0TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKLSAgICB7Ci0gICAgICAgIG1fTWFya05hbWUgPSBuYW1lOwotICAgIH0KKyAgaW5saW5lIHZvaWQgU2V0UGFyYW0oUGFyYW1UeXBlIHR5cGUsIHZvaWQqIHBhcmFtKSB7CisgICAgbV9QYXJhbVR5cGUgPSB0eXBlOworICAgIG1fcFBhcmFtID0gcGFyYW07CisgIH0KIAotICAgIGlubGluZSB2b2lkCQkJU2V0UGFyYW0oUGFyYW1UeXBlIHR5cGUsIHZvaWQqIHBhcmFtKQotICAgIHsKLSAgICAgICAgbV9QYXJhbVR5cGUgPSB0eXBlOwotICAgICAgICBtX3BQYXJhbSA9IHBhcmFtOwotICAgIH0KLXByaXZhdGU6CisgcHJpdmF0ZToKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9NYXJrTmFtZTsKIAotICAgIENGWF9CeXRlU3RyaW5nCQltX01hcmtOYW1lOworICBQYXJhbVR5cGUgbV9QYXJhbVR5cGU7CiAKLSAgICBQYXJhbVR5cGUJCQltX1BhcmFtVHlwZTsKLQotICAgIHZvaWQqCQkJCW1fcFBhcmFtOworICB2b2lkKiBtX3BQYXJhbTsKIH07Ci1jbGFzcyBDUERGX0NvbnRlbnRNYXJrRGF0YQotewotcHVibGljOgorY2xhc3MgQ1BERl9Db250ZW50TWFya0RhdGEgeworIHB1YmxpYzoKKyAgQ1BERl9Db250ZW50TWFya0RhdGEoKSB7fQogCi0gICAgQ1BERl9Db250ZW50TWFya0RhdGEoKSB7IH0KKyAgQ1BERl9Db250ZW50TWFya0RhdGEoY29uc3QgQ1BERl9Db250ZW50TWFya0RhdGEmIHNyYyk7CiAKLSAgICBDUERGX0NvbnRlbnRNYXJrRGF0YShjb25zdCBDUERGX0NvbnRlbnRNYXJrRGF0YSYgc3JjKTsKKyAgaW5saW5lIGludCBDb3VudEl0ZW1zKCkgY29uc3QgeyByZXR1cm4gbV9NYXJrcy5HZXRTaXplKCk7IH0KIAotICAgIGlubGluZSBpbnQJCQlDb3VudEl0ZW1zKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX01hcmtzLkdldFNpemUoKTsKLSAgICB9CisgIGlubGluZSBDUERGX0NvbnRlbnRNYXJrSXRlbSYgR2V0SXRlbShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9NYXJrc1tpbmRleF07CisgIH0KIAotICAgIGlubGluZSBDUERGX0NvbnRlbnRNYXJrSXRlbSYJR2V0SXRlbShpbnQgaW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9NYXJrc1tpbmRleF07Ci0gICAgfQorICBpbnQgR2V0TUNJRCgpIGNvbnN0OwogCi0gICAgaW50CQkJCQlHZXRNQ0lEKCkgY29uc3Q7CisgIHZvaWQgQWRkTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICBGWF9CT09MIGJEaWN0TmVlZENsb25lKTsKIAotICAgIHZvaWQJCQkJQWRkTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgRlhfQk9PTCBiRGljdE5lZWRDbG9uZSk7CisgIHZvaWQgRGVsZXRlTGFzdE1hcmsoKTsKIAotICAgIHZvaWQJCQkJRGVsZXRlTGFzdE1hcmsoKTsKLXByaXZhdGU6Ci0KLSAgICBDRlhfT2JqZWN0QXJyYXk8Q1BERl9Db250ZW50TWFya0l0ZW0+CW1fTWFya3M7CisgcHJpdmF0ZToKKyAgQ0ZYX09iamVjdEFycmF5PENQREZfQ29udGVudE1hcmtJdGVtPiBtX01hcmtzOwogfTsKLWNsYXNzIENQREZfQ29udGVudE1hcmsgOiBwdWJsaWMgQ0ZYX0NvdW50UmVmPENQREZfQ29udGVudE1hcmtEYXRhPgotewotcHVibGljOgorY2xhc3MgQ1BERl9Db250ZW50TWFyayA6IHB1YmxpYyBDRlhfQ291bnRSZWY8Q1BERl9Db250ZW50TWFya0RhdGE+IHsKKyBwdWJsaWM6CisgIGludCBHZXRNQ0lEKCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0ID8gbV9wT2JqZWN0LT5HZXRNQ0lEKCkgOiAtMTsgfQogCi0gICAgaW50CQkJCQlHZXRNQ0lEKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QgPyBtX3BPYmplY3QtPkdldE1DSUQoKSA6IC0xOwotICAgIH0KKyAgRlhfQk9PTCBIYXNNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaykgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCUhhc01hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBtYXJrKSBjb25zdDsKLQotICAgIEZYX0JPT0wJCQkJTG9va3VwTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmssIENQREZfRGljdGlvbmFyeSomIHBEaWN0KSBjb25zdDsKKyAgRlhfQk9PTCBMb29rdXBNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaywKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSomIHBEaWN0KSBjb25zdDsKIH07CiAKLSNkZWZpbmUgUERGUEFHRV9URVhUICAgICAxCi0jZGVmaW5lIFBERlBBR0VfUEFUSCAgICAgMgotI2RlZmluZSBQREZQQUdFX0lNQUdFICAgIDMKLSNkZWZpbmUgUERGUEFHRV9TSEFESU5HICA0Ci0jZGVmaW5lIFBERlBBR0VfRk9STSAgICAgNQorI2RlZmluZSBQREZQQUdFX1RFWFQgMQorI2RlZmluZSBQREZQQUdFX1BBVEggMgorI2RlZmluZSBQREZQQUdFX0lNQUdFIDMKKyNkZWZpbmUgUERGUEFHRV9TSEFESU5HIDQKKyNkZWZpbmUgUERGUEFHRV9GT1JNIDUKIAotY2xhc3MgQ1BERl9HcmFwaGljU3RhdGVzCi17Ci1wdWJsaWM6Ci0gICAgdm9pZAkJCQlDb3B5U3RhdGVzKGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyYgc3JjKTsKK2NsYXNzIENQREZfR3JhcGhpY1N0YXRlcyB7CisgcHVibGljOgorICB2b2lkIENvcHlTdGF0ZXMoY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzJiBzcmMpOwogCi0gICAgdm9pZAkJCQlEZWZhdWx0U3RhdGVzKCk7CisgIHZvaWQgRGVmYXVsdFN0YXRlcygpOwogCi0gICAgQ1BERl9DbGlwUGF0aAkJbV9DbGlwUGF0aDsKKyAgQ1BERl9DbGlwUGF0aCBtX0NsaXBQYXRoOwogCi0gICAgQ1BERl9HcmFwaFN0YXRlCQltX0dyYXBoU3RhdGU7CisgIENQREZfR3JhcGhTdGF0ZSBtX0dyYXBoU3RhdGU7CiAKLSAgICBDUERGX0NvbG9yU3RhdGUJCW1fQ29sb3JTdGF0ZTsKKyAgQ1BERl9Db2xvclN0YXRlIG1fQ29sb3JTdGF0ZTsKIAotICAgIENQREZfVGV4dFN0YXRlCQltX1RleHRTdGF0ZTsKKyAgQ1BERl9UZXh0U3RhdGUgbV9UZXh0U3RhdGU7CiAKLSAgICBDUERGX0dlbmVyYWxTdGF0ZQltX0dlbmVyYWxTdGF0ZTsKKyAgQ1BERl9HZW5lcmFsU3RhdGUgbV9HZW5lcmFsU3RhdGU7CiB9OwogCi1jbGFzcyBDUERGX1BhZ2VPYmplY3QgOiBwdWJsaWMgQ1BERl9HcmFwaGljU3RhdGVzCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIENQREZfUGFnZU9iamVjdCogQ3JlYXRlKGludCB0eXBlKTsKLSAgICB2aXJ0dWFsIH5DUERGX1BhZ2VPYmplY3QoKTsKK2NsYXNzIENQREZfUGFnZU9iamVjdCA6IHB1YmxpYyBDUERGX0dyYXBoaWNTdGF0ZXMgeworIHB1YmxpYzoKKyAgc3RhdGljIENQREZfUGFnZU9iamVjdCogQ3JlYXRlKGludCB0eXBlKTsKKyAgdmlydHVhbCB+Q1BERl9QYWdlT2JqZWN0KCk7CiAKLSAgICBDUERGX1BhZ2VPYmplY3QqCUNsb25lKCkgY29uc3Q7CisgIENQREZfUGFnZU9iamVjdCogQ2xvbmUoKSBjb25zdDsKIAotICAgIHZvaWQJCQkJQ29weShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmplY3QpOworICB2b2lkIENvcHkoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjT2JqZWN0KTsKIAotICAgIHZpcnR1YWwgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KSA9IDA7CiAKLSAgICB2b2lkCQkJCVJlbW92ZUNsaXBQYXRoKCk7CisgIHZvaWQgUmVtb3ZlQ2xpcFBhdGgoKTsKIAotICAgIHZvaWQJCQkJQXBwZW5kQ2xpcFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBGWF9CT09MIGJBdXRvTWVyZ2UpOworICB2b2lkIEFwcGVuZENsaXBQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgRlhfQk9PTCBiQXV0b01lcmdlKTsKIAotICAgIHZvaWQJCQkJQ29weUNsaXBQYXRoKENQREZfUGFnZU9iamVjdCogcE9iaik7CisgIHZvaWQgQ29weUNsaXBQYXRoKENQREZfUGFnZU9iamVjdCogcE9iaik7CiAKLSAgICB2b2lkCQkJCVRyYW5zZm9ybUNsaXBQYXRoKENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7CisgIHZvaWQgVHJhbnNmb3JtQ2xpcFBhdGgoQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KTsKIAotICAgIHZvaWQJCQkJVHJhbnNmb3JtR2VuZXJhbFN0YXRlKENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7CisgIHZvaWQgVHJhbnNmb3JtR2VuZXJhbFN0YXRlKENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7CiAKLSAgICB2b2lkCQkJCVNldENvbG9yU3RhdGUoQ1BERl9Db2xvclN0YXRlIHN0YXRlKQotICAgIHsKLSAgICAgICAgbV9Db2xvclN0YXRlID0gc3RhdGU7Ci0gICAgfQorICB2b2lkIFNldENvbG9yU3RhdGUoQ1BERl9Db2xvclN0YXRlIHN0YXRlKSB7IG1fQ29sb3JTdGF0ZSA9IHN0YXRlOyB9CiAKLSAgICBGWF9SRUNUCQkJCUdldEJCb3goY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkgY29uc3Q7CisgIEZYX1JFQ1QgR2V0QkJveChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KSBjb25zdDsKIAotICAgIGludAkJCQkJbV9UeXBlOworICBpbnQgbV9UeXBlOwogCi0gICAgRlhfRkxPQVQJCQltX0xlZnQ7CisgIEZYX0ZMT0FUIG1fTGVmdDsKIAotICAgIEZYX0ZMT0FUCQkJbV9SaWdodDsKKyAgRlhfRkxPQVQgbV9SaWdodDsKIAotICAgIEZYX0ZMT0FUCQkJbV9Ub3A7CisgIEZYX0ZMT0FUIG1fVG9wOwogCi0gICAgRlhfRkxPQVQJCQltX0JvdHRvbTsKKyAgRlhfRkxPQVQgbV9Cb3R0b207CiAKLSAgICBDUERGX0NvbnRlbnRNYXJrCW1fQ29udGVudE1hcms7CisgIENQREZfQ29udGVudE1hcmsgbV9Db250ZW50TWFyazsKIAotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmplY3QpID0gMDsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmplY3QpID0gMDsKIAotICAgIHZvaWQJCQkJUmVjYWxjQkJveCgpOworICB2b2lkIFJlY2FsY0JCb3goKTsKIAotICAgIENQREZfUGFnZU9iamVjdCgpIHt9Ci0KKyAgQ1BERl9QYWdlT2JqZWN0KCkge30KIH07CiAKIHN0cnVjdCBDUERGX1RleHRPYmplY3RJdGVtIHsKLSAgICBGWF9EV09SRCBtX0NoYXJDb2RlOwotICAgIEZYX0ZMT0FUIG1fT3JpZ2luWDsKLSAgICBGWF9GTE9BVCBtX09yaWdpblk7CisgIEZYX0RXT1JEIG1fQ2hhckNvZGU7CisgIEZYX0ZMT0FUIG1fT3JpZ2luWDsKKyAgRlhfRkxPQVQgbV9PcmlnaW5ZOwogfTsKIAotY2xhc3MgQ1BERl9UZXh0T2JqZWN0IDogcHVibGljIENQREZfUGFnZU9iamVjdAotewotcHVibGljOgotICAgIENQREZfVGV4dE9iamVjdCgpOwotICAgIH5DUERGX1RleHRPYmplY3QoKSBvdmVycmlkZTsKK2NsYXNzIENQREZfVGV4dE9iamVjdCA6IHB1YmxpYyBDUERGX1BhZ2VPYmplY3QgeworIHB1YmxpYzoKKyAgQ1BERl9UZXh0T2JqZWN0KCk7CisgIH5DUERGX1RleHRPYmplY3QoKSBvdmVycmlkZTsKIAotICAgIGludCBDb3VudEl0ZW1zKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25DaGFyczsKLSAgICB9CisgIGludCBDb3VudEl0ZW1zKCkgY29uc3QgeyByZXR1cm4gbV9uQ2hhcnM7IH0KIAotICAgIHZvaWQgR2V0SXRlbUluZm8oaW50IGluZGV4LCBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3Q7CisgIHZvaWQgR2V0SXRlbUluZm8oaW50IGluZGV4LCBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3Q7CiAKLSAgICBpbnQgQ291bnRDaGFycygpIGNvbnN0OworICBpbnQgQ291bnRDaGFycygpIGNvbnN0OwogCi0gICAgdm9pZCBHZXRDaGFySW5mbyhpbnQgaW5kZXgsIEZYX0RXT1JEJiBjaGFyY29kZSwgRlhfRkxPQVQmIGtlcm5pbmcpIGNvbnN0OwotICAgIHZvaWQgR2V0Q2hhckluZm8oaW50IGluZGV4LCBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3Q7CisgIHZvaWQgR2V0Q2hhckluZm8oaW50IGluZGV4LCBGWF9EV09SRCYgY2hhcmNvZGUsIEZYX0ZMT0FUJiBrZXJuaW5nKSBjb25zdDsKKyAgdm9pZCBHZXRDaGFySW5mbyhpbnQgaW5kZXgsIENQREZfVGV4dE9iamVjdEl0ZW0qIHBJbmZvKSBjb25zdDsKIAotICAgIHZvaWQgR2V0Q2hhclJlY3QoaW50IGluZGV4LCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdDsKKyAgdm9pZCBHZXRDaGFyUmVjdChpbnQgaW5kZXgsIENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0OwogCi0gICAgRlhfRkxPQVQgR2V0Q2hhcldpZHRoKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKLSAgICBGWF9GTE9BVCBHZXRTcGFjZUNoYXJXaWR0aCgpIGNvbnN0OworICBGWF9GTE9BVCBHZXRDaGFyV2lkdGgoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OworICBGWF9GTE9BVCBHZXRTcGFjZUNoYXJXaWR0aCgpIGNvbnN0OwogCi0gICAgRlhfRkxPQVQgR2V0UG9zWCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Qb3NYOwotICAgIH0KKyAgRlhfRkxPQVQgR2V0UG9zWCgpIGNvbnN0IHsgcmV0dXJuIG1fUG9zWDsgfQogCi0gICAgRlhfRkxPQVQgR2V0UG9zWSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Qb3NZOwotICAgIH0KKyAgRlhfRkxPQVQgR2V0UG9zWSgpIGNvbnN0IHsgcmV0dXJuIG1fUG9zWTsgfQogCi0gICAgdm9pZCBHZXRUZXh0TWF0cml4KENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpIGNvbnN0OworICB2b2lkIEdldFRleHRNYXRyaXgoQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkgY29uc3Q7CiAKLSAgICBDUERGX0ZvbnQqIEdldEZvbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICB9CisgIENQREZfRm9udCogR2V0Rm9udCgpIGNvbnN0IHsgcmV0dXJuIG1fVGV4dFN0YXRlLkdldEZvbnQoKTsgfQogCi0gICAgRlhfRkxPQVQgR2V0Rm9udFNpemUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCk7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCk7IH0KIAotICAgIHZvaWQgU2V0RW1wdHkoKTsKKyAgdm9pZCBTZXRFbXB0eSgpOwogCi0gICAgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiB0ZXh0KTsKKyAgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiB0ZXh0KTsKIAotICAgIHZvaWQgU2V0VGV4dChDRlhfQnl0ZVN0cmluZyogcFN0cnMsIEZYX0ZMT0FUKiBwS2VybmluZywgaW50IG5TZWdzKTsKKyAgdm9pZCBTZXRUZXh0KENGWF9CeXRlU3RyaW5nKiBwU3RycywgRlhfRkxPQVQqIHBLZXJuaW5nLCBpbnQgblNlZ3MpOwogCi0gICAgdm9pZCBTZXRUZXh0KGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcEtlcm5pbmdzKTsKKyAgdm9pZCBTZXRUZXh0KGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcEtlcm5pbmdzKTsKIAotICAgIHZvaWQgU2V0UG9zaXRpb24oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7CisgIHZvaWQgU2V0UG9zaXRpb24oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7CiAKLSAgICB2b2lkIFNldFRleHRTdGF0ZShDUERGX1RleHRTdGF0ZSBUZXh0U3RhdGUpOworICB2b2lkIFNldFRleHRTdGF0ZShDUERGX1RleHRTdGF0ZSBUZXh0U3RhdGUpOwogCi0gICAgLy8gQ1BERl9QYWdlT2JqZWN0OgotICAgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CisgIC8vIENQREZfUGFnZU9iamVjdDoKKyAgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKIAotICAgIHZvaWQgQ2FsY0NoYXJQb3MoRlhfRkxPQVQqIHBQb3NBcnJheSkgY29uc3Q7CisgIHZvaWQgQ2FsY0NoYXJQb3MoRlhfRkxPQVQqIHBQb3NBcnJheSkgY29uc3Q7CiAKLSAgICB2b2lkIFNldERhdGEoaW50IG5DaGFycywKLSAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBDaGFyQ29kZXMsCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeCwKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSk7CisgIHZvaWQgU2V0RGF0YShpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBDaGFyQ29kZXMsCisgICAgICAgICAgICAgICBGWF9GTE9BVCogcENoYXJQb3MsCisgICAgICAgICAgICAgICBGWF9GTE9BVCB4LAorICAgICAgICAgICAgICAgRlhfRkxPQVQgeSk7CiAKLSAgICB2b2lkIEdldERhdGEoaW50JiBuQ2hhcnMsIEZYX0RXT1JEKiYgcENoYXJDb2RlcywgRlhfRkxPQVQqJiBwQ2hhclBvcykKLSAgICB7Ci0gICAgICAgIG5DaGFycyA9IG1fbkNoYXJzOwotICAgICAgICBwQ2hhckNvZGVzID0gbV9wQ2hhckNvZGVzOwotICAgICAgICBwQ2hhclBvcyA9IG1fcENoYXJQb3M7Ci0gICAgfQorICB2b2lkIEdldERhdGEoaW50JiBuQ2hhcnMsIEZYX0RXT1JEKiYgcENoYXJDb2RlcywgRlhfRkxPQVQqJiBwQ2hhclBvcykgeworICAgIG5DaGFycyA9IG1fbkNoYXJzOworICAgIHBDaGFyQ29kZXMgPSBtX3BDaGFyQ29kZXM7CisgICAgcENoYXJQb3MgPSBtX3BDaGFyUG9zOworICB9CiAKKyAgdm9pZCBSZWNhbGNQb3NpdGlvbkRhdGEoKSB7IENhbGNQb3NpdGlvbkRhdGEobnVsbHB0ciwgbnVsbHB0ciwgMSk7IH0KIAotICAgIHZvaWQgUmVjYWxjUG9zaXRpb25EYXRhKCkKLSAgICB7Ci0gICAgICAgIENhbGNQb3NpdGlvbkRhdGEobnVsbHB0ciwgbnVsbHB0ciwgMSk7Ci0gICAgfQorIHByb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIENQREZfUmVuZGVyU3RhdHVzOworICBmcmllbmQgY2xhc3MgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOworICBmcmllbmQgY2xhc3MgQ1BERl9UZXh0UmVuZGVyZXI7CisgIGZyaWVuZCBjbGFzcyBDVGV4dFBhZ2U7CiAKLXByb3RlY3RlZDoKLSAgICBmcmllbmQgY2xhc3MgQ1BERl9SZW5kZXJTdGF0dXM7Ci0gICAgZnJpZW5kIGNsYXNzIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjsKLSAgICBmcmllbmQgY2xhc3MgQ1BERl9UZXh0UmVuZGVyZXI7Ci0gICAgZnJpZW5kIGNsYXNzIENUZXh0UGFnZTsKKyAgLy8gQ1BERl9QYWdlT2JqZWN0OgorICB2b2lkIENvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyY09iamVjdCkgb3ZlcnJpZGU7CiAKLSAgICAvLyBDUERGX1BhZ2VPYmplY3Q6Ci0gICAgdm9pZCBDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmplY3QpIG92ZXJyaWRlOworICB2b2lkIFNldFNlZ21lbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nKiBwU3RycywgRlhfRkxPQVQqIHBLZXJuaW5nLCBpbnQgblNlZ3MpOwogCi0gICAgdm9pZCBTZXRTZWdtZW50cyhjb25zdCBDRlhfQnl0ZVN0cmluZyogcFN0cnMsCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcEtlcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgblNlZ3MpOworICB2b2lkIENhbGNQb3NpdGlvbkRhdGEoRlhfRkxPQVQqIHBUZXh0QWR2YW5jZVgsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFRleHRBZHZhbmNlWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhvcnpfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSAwKTsKIAotICAgIHZvaWQgQ2FsY1Bvc2l0aW9uRGF0YShGWF9GTE9BVCogcFRleHRBZHZhbmNlWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBUZXh0QWR2YW5jZVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhvcnpfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IDApOworICBGWF9GTE9BVCBtX1Bvc1g7CisgIEZYX0ZMT0FUIG1fUG9zWTsKIAotICAgIEZYX0ZMT0FUIG1fUG9zWDsKLSAgICBGWF9GTE9BVCBtX1Bvc1k7CisgIGludCBtX25DaGFyczsKIAotICAgIGludCBtX25DaGFyczsKKyAgRlhfRFdPUkQqIG1fcENoYXJDb2RlczsKIAotICAgIEZYX0RXT1JEKiBtX3BDaGFyQ29kZXM7Ci0KLSAgICBGWF9GTE9BVCogbV9wQ2hhclBvczsKKyAgRlhfRkxPQVQqIG1fcENoYXJQb3M7CiB9OwogCi1jbGFzcyBDUERGX1BhdGhPYmplY3QgOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0Ci17Ci1wdWJsaWM6Ci0gICAgQ1BERl9QYXRoT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIG1fVHlwZSA9IFBERlBBR0VfUEFUSDsKLSAgICB9CitjbGFzcyBDUERGX1BhdGhPYmplY3QgOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0IHsKKyBwdWJsaWM6CisgIENQREZfUGF0aE9iamVjdCgpIHsgbV9UeXBlID0gUERGUEFHRV9QQVRIOyB9CiAKLSAgICB2aXJ0dWFsIH5DUERGX1BhdGhPYmplY3QoKSB7fQotICAgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1heHRyaXgpIG92ZXJyaWRlOworICB2aXJ0dWFsIH5DUERGX1BhdGhPYmplY3QoKSB7fQorICB2b2lkIFRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXh0cml4KSBvdmVycmlkZTsKIAotICAgIHZvaWQJCQkJU2V0R3JhcGhTdGF0ZShDUERGX0dyYXBoU3RhdGUgR3JhcGhTdGF0ZSk7CisgIHZvaWQgU2V0R3JhcGhTdGF0ZShDUERGX0dyYXBoU3RhdGUgR3JhcGhTdGF0ZSk7CiAKLSAgICBDUERGX1BhdGgJCQltX1BhdGg7CisgIENQREZfUGF0aCBtX1BhdGg7CiAKLSAgICBpbnQJCQkJCW1fRmlsbFR5cGU7CisgIGludCBtX0ZpbGxUeXBlOwogCi0gICAgRlhfQk9PTAkJCQltX2JTdHJva2U7CisgIEZYX0JPT0wgbV9iU3Ryb2tlOwogCi0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX01hdHJpeDsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtX01hdHJpeDsKIAorICB2b2lkIENhbGNCb3VuZGluZ0JveCgpOwogCi0gICAgdm9pZAkJCQlDYWxjQm91bmRpbmdCb3goKTsKLQotcHJvdGVjdGVkOgotICAgIHZvaWQgQ29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjT2JqZWN0KSBvdmVycmlkZTsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgQ29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjT2JqZWN0KSBvdmVycmlkZTsKIH07CiAKLWNsYXNzIENQREZfSW1hZ2VPYmplY3QgOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0Ci17Ci1wdWJsaWM6Ci0gICAgQ1BERl9JbWFnZU9iamVjdCgpOworY2xhc3MgQ1BERl9JbWFnZU9iamVjdCA6IHB1YmxpYyBDUERGX1BhZ2VPYmplY3QgeworIHB1YmxpYzoKKyAgQ1BERl9JbWFnZU9iamVjdCgpOwogCi0gICAgdmlydHVhbCB+Q1BERl9JbWFnZU9iamVjdCgpOwotICAgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgfkNQREZfSW1hZ2VPYmplY3QoKTsKKyAgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKIAotICAgIENQREZfSW1hZ2UqCQkJbV9wSW1hZ2U7CisgIENQREZfSW1hZ2UqIG1fcEltYWdlOwogCi0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX01hdHJpeDsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtX01hdHJpeDsKIAotICAgIHZvaWQJCQkJQ2FsY0JvdW5kaW5nQm94KCk7CisgIHZvaWQgQ2FsY0JvdW5kaW5nQm94KCk7CiAKLXByaXZhdGU6Ci0gICAgdm9pZCBDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmplY3QpIG92ZXJyaWRlOworIHByaXZhdGU6CisgIHZvaWQgQ29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjT2JqZWN0KSBvdmVycmlkZTsKIH07CiAKLWNsYXNzIENQREZfU2hhZGluZ09iamVjdCA6IHB1YmxpYyBDUERGX1BhZ2VPYmplY3QKLXsKLXB1YmxpYzoKLSAgICBDUERGX1NoYWRpbmdPYmplY3QoKTsKK2NsYXNzIENQREZfU2hhZGluZ09iamVjdCA6IHB1YmxpYyBDUERGX1BhZ2VPYmplY3QgeworIHB1YmxpYzoKKyAgQ1BERl9TaGFkaW5nT2JqZWN0KCk7CiAKLSAgICB2aXJ0dWFsIH5DUERGX1NoYWRpbmdPYmplY3QoKTsKKyAgdmlydHVhbCB+Q1BERl9TaGFkaW5nT2JqZWN0KCk7CiAKLSAgICBDUERGX1NoYWRpbmdQYXR0ZXJuKgltX3BTaGFkaW5nOworICBDUERGX1NoYWRpbmdQYXR0ZXJuKiBtX3BTaGFkaW5nOwogCi0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX01hdHJpeDsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtX01hdHJpeDsKIAotICAgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CisgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAKLSAgICB2b2lkCQkJCUNhbGNCb3VuZGluZ0JveCgpOworICB2b2lkIENhbGNCb3VuZGluZ0JveCgpOwogCi1wcm90ZWN0ZWQ6Ci0gICAgdm9pZCBDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmplY3QpIG92ZXJyaWRlOworIHByb3RlY3RlZDoKKyAgdm9pZCBDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmplY3QpIG92ZXJyaWRlOwogfTsKIAotY2xhc3MgQ1BERl9Gb3JtT2JqZWN0IDogcHVibGljIENQREZfUGFnZU9iamVjdAotewotcHVibGljOgotICAgIENQREZfRm9ybU9iamVjdCgpCi0gICAgewotICAgICAgICBtX1R5cGUgPSBQREZQQUdFX0ZPUk07Ci0gICAgICAgIG1fcEZvcm0gPSBOVUxMOwotICAgIH0KK2NsYXNzIENQREZfRm9ybU9iamVjdCA6IHB1YmxpYyBDUERGX1BhZ2VPYmplY3QgeworIHB1YmxpYzoKKyAgQ1BERl9Gb3JtT2JqZWN0KCkgeworICAgIG1fVHlwZSA9IFBERlBBR0VfRk9STTsKKyAgICBtX3BGb3JtID0gTlVMTDsKKyAgfQogCi0gICAgdmlydHVhbCB+Q1BERl9Gb3JtT2JqZWN0KCk7Ci0gICAgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKKyAgdmlydHVhbCB+Q1BERl9Gb3JtT2JqZWN0KCk7CisgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAKLSAgICBDUERGX0Zvcm0qCQkJbV9wRm9ybTsKKyAgQ1BERl9Gb3JtKiBtX3BGb3JtOwogCi0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX0Zvcm1NYXRyaXg7CisgIENGWF9BZmZpbmVNYXRyaXggbV9Gb3JtTWF0cml4OwogCi0gICAgdm9pZAkJCQlDYWxjQm91bmRpbmdCb3goKTsKKyAgdm9pZCBDYWxjQm91bmRpbmdCb3goKTsKIAotcHJvdGVjdGVkOgotICAgIHZvaWQgQ29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjT2JqZWN0KSBvdmVycmlkZTsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgQ29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjT2JqZWN0KSBvdmVycmlkZTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9QQUdFT0JKX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaAppbmRleCA5NTEwODViLi5mODBiYjI0IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgKQEAgLTM0LDE1ICszNCwxNSBAQAogY2xhc3MgQ1BERl9Gb250RW5jb2Rpbmc7CiBjbGFzcyBDUERGX0ljY1Byb2ZpbGU7CiBjbGFzcyBDRlhfUHJpdmF0ZURhdGE7Ci0jZGVmaW5lIEZQREZQRVJNX1BSSU5UCQkJMHgwMDA0Ci0jZGVmaW5lIEZQREZQRVJNX01PRElGWQkJCTB4MDAwOAotI2RlZmluZSBGUERGUEVSTV9FWFRSQUNUCQkweDAwMTAKLSNkZWZpbmUgRlBERlBFUk1fQU5OT1RfRk9STQkJMHgwMDIwCi0jZGVmaW5lIEZQREZQRVJNX0ZJTExfRk9STQkJMHgwMTAwCi0jZGVmaW5lIEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTCTB4MDIwMAotI2RlZmluZSBGUERGUEVSTV9BU1NFTUJMRQkJMHgwNDAwCi0jZGVmaW5lIEZQREZQRVJNX1BSSU5UX0hJR0gJCTB4MDgwMAotI2RlZmluZSBGUERGX1BBR0VfTUFYX05VTQkJMHhGRkZGRgorI2RlZmluZSBGUERGUEVSTV9QUklOVCAweDAwMDQKKyNkZWZpbmUgRlBERlBFUk1fTU9ESUZZIDB4MDAwOAorI2RlZmluZSBGUERGUEVSTV9FWFRSQUNUIDB4MDAxMAorI2RlZmluZSBGUERGUEVSTV9BTk5PVF9GT1JNIDB4MDAyMAorI2RlZmluZSBGUERGUEVSTV9GSUxMX0ZPUk0gMHgwMTAwCisjZGVmaW5lIEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTIDB4MDIwMAorI2RlZmluZSBGUERGUEVSTV9BU1NFTUJMRSAweDA0MDAKKyNkZWZpbmUgRlBERlBFUk1fUFJJTlRfSElHSCAweDA4MDAKKyNkZWZpbmUgRlBERl9QQUdFX01BWF9OVU0gMHhGRkZGRgogCiAvLyBJbmRleGVkIGJ5IDgtYml0IGNoYXJhY3RlciBjb2RlLCBjb250YWlucyBlaXRoZXI6CiAvLyAgICdXJyAtIGZvciB3aGl0ZXNwYWNlOiBOVUwsIFRBQiwgQ1IsIExGLCBGRiwgMHg4MCwgMHhmZgpAQCAtNTEsODU5ICs1MSw4NjIgQEAKIC8vICAgJ1InIC0gb3RoZXJ3aXNlLgogZXh0ZXJuIGNvbnN0IGNoYXIgUERGX0NoYXJUeXBlWzI1Nl07CiAKLWNsYXNzIENQREZfRG9jdW1lbnQgOiBwdWJsaWMgQ0ZYX1ByaXZhdGVEYXRhLCBwdWJsaWMgQ1BERl9JbmRpcmVjdE9iamVjdHMKLXsKLXB1YmxpYzoKLSAgICBDUERGX0RvY3VtZW50KCk7Ci0gICAgZXhwbGljaXQgQ1BERl9Eb2N1bWVudChDUERGX1BhcnNlciogcFBhcnNlcik7CitjbGFzcyBDUERGX0RvY3VtZW50IDogcHVibGljIENGWF9Qcml2YXRlRGF0YSwgcHVibGljIENQREZfSW5kaXJlY3RPYmplY3RzIHsKKyBwdWJsaWM6CisgIENQREZfRG9jdW1lbnQoKTsKKyAgZXhwbGljaXQgQ1BERl9Eb2N1bWVudChDUERGX1BhcnNlciogcFBhcnNlcik7CiAKLSAgICB+Q1BERl9Eb2N1bWVudCgpOworICB+Q1BERl9Eb2N1bWVudCgpOwogCi0gICAgQ1BERl9QYXJzZXIqCQkJR2V0UGFyc2VyKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYXJzZXI7Ci0gICAgfQorICBDUERGX1BhcnNlciogR2V0UGFyc2VyKCkgY29uc3QgeyByZXR1cm4gbV9wUGFyc2VyOyB9CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXRSb290KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BSb290RGljdDsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSogR2V0Um9vdCgpIGNvbnN0IHsgcmV0dXJuIG1fcFJvb3REaWN0OyB9CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXRJbmZvKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BJbmZvRGljdDsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSogR2V0SW5mbygpIGNvbnN0IHsgcmV0dXJuIG1fcEluZm9EaWN0OyB9CiAKLSAgICB2b2lkCQkJCQlHZXRJRChDRlhfQnl0ZVN0cmluZyYgaWQxLCBDRlhfQnl0ZVN0cmluZyYgaWQyKSBjb25zdAotICAgIHsKLSAgICAgICAgaWQxID0gbV9JRDE7Ci0gICAgICAgIGlkMiA9IG1fSUQyOwotICAgIH0KKyAgdm9pZCBHZXRJRChDRlhfQnl0ZVN0cmluZyYgaWQxLCBDRlhfQnl0ZVN0cmluZyYgaWQyKSBjb25zdCB7CisgICAgaWQxID0gbV9JRDE7CisgICAgaWQyID0gbV9JRDI7CisgIH0KIAotICAgIGludAkJCQkJCUdldFBhZ2VDb3VudCgpIGNvbnN0OworICBpbnQgR2V0UGFnZUNvdW50KCkgY29uc3Q7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXRQYWdlKGludCBpUGFnZSk7CisgIENQREZfRGljdGlvbmFyeSogR2V0UGFnZShpbnQgaVBhZ2UpOwogCi0gICAgaW50CQkJCQkJR2V0UGFnZUluZGV4KEZYX0RXT1JEIG9iam51bSk7CisgIGludCBHZXRQYWdlSW5kZXgoRlhfRFdPUkQgb2JqbnVtKTsKIAotICAgIEZYX0RXT1JECQkJCUdldFVzZXJQZXJtaXNzaW9ucyhGWF9CT09MIGJDaGVja1JldmlzaW9uID0gRkFMU0UpIGNvbnN0OworICBGWF9EV09SRCBHZXRVc2VyUGVybWlzc2lvbnMoRlhfQk9PTCBiQ2hlY2tSZXZpc2lvbiA9IEZBTFNFKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJCUlzT3duZXIoKSBjb25zdDsKKyAgRlhfQk9PTCBJc093bmVyKCkgY29uc3Q7CiAKKyAgQ1BERl9Eb2NQYWdlRGF0YSogR2V0UGFnZURhdGEoKSB7IHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCk7IH0KIAorICB2b2lkIENsZWFyUGFnZURhdGEoKTsKIAotICAgIENQREZfRG9jUGFnZURhdGEqCQlHZXRQYWdlRGF0YSgpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpOwotICAgIH0KKyAgdm9pZCBSZW1vdmVDb2xvclNwYWNlRnJvbVBhZ2VEYXRhKENQREZfT2JqZWN0KiBwT2JqZWN0KTsKIAotICAgIHZvaWQJCQkJCUNsZWFyUGFnZURhdGEoKTsKKyAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBHZXRSZW5kZXJEYXRhKCkgeyByZXR1cm4gR2V0VmFsaWRhdGVSZW5kZXJEYXRhKCk7IH0KIAotICAgIHZvaWQJCQkJCVJlbW92ZUNvbG9yU3BhY2VGcm9tUGFnZURhdGEoQ1BERl9PYmplY3QqIHBPYmplY3QpOworICB2b2lkIENsZWFyUmVuZGVyRGF0YSgpOwogCisgIHZvaWQgQ2xlYXJSZW5kZXJGb250KCk7CiAKLSAgICBDUERGX0RvY1JlbmRlckRhdGEqCQlHZXRSZW5kZXJEYXRhKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRWYWxpZGF0ZVJlbmRlckRhdGEoKTsKLSAgICB9CisgIEZYX0JPT0wgSXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgRlhfQk9PTCYgYkZvcm0pIGNvbnN0OwogCi0gICAgdm9pZAkJCQkJQ2xlYXJSZW5kZXJEYXRhKCk7CisgIC8vIHxwRm9udERpY3R8IG11c3Qgbm90IGJlIG51bGwuCisgIENQREZfRm9udCogTG9hZEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpOwogCi0gICAgdm9pZAkJCQkJQ2xlYXJSZW5kZXJGb250KCk7CisgIENQREZfQ29sb3JTcGFjZSogTG9hZENvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDU09iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMgPSBOVUxMKTsKIAorICBDUERGX1BhdHRlcm4qIExvYWRQYXR0ZXJuKENQREZfT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4ID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJCQlJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBGWF9CT09MJiBiRm9ybSkgY29uc3Q7CisgIENQREZfSW1hZ2UqIExvYWRJbWFnZUYoQ1BERl9PYmplY3QqIHBPYmopOwogCi0gICAgLy8gfHBGb250RGljdHwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICBDUERGX0ZvbnQqIExvYWRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0KTsKKyAgQ1BERl9TdHJlYW1BY2MqIExvYWRGb250RmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSk7CiAKLSAgICBDUERGX0NvbG9yU3BhY2UqCQlMb2FkQ29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqLCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMgPSBOVUxMKTsKLQotICAgIENQREZfUGF0dGVybioJCQlMb2FkUGF0dGVybihDUERGX09iamVjdCogcE9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4ID0gTlVMTCk7Ci0KLSAgICBDUERGX0ltYWdlKgkJCQlMb2FkSW1hZ2VGKENQREZfT2JqZWN0KiBwT2JqKTsKLQotICAgIENQREZfU3RyZWFtQWNjKgkJCUxvYWRGb250RmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSk7Ci0KLSAgICBDUERGX0ljY1Byb2ZpbGUqCQlMb2FkSWNjUHJvZmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSk7CisgIENQREZfSWNjUHJvZmlsZSogTG9hZEljY1Byb2ZpbGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pOwogCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogCi0gICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UQSogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUgPSBGQUxTRSk7Ci0gICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUgPSBGQUxTRSk7CisgIENQREZfRm9udCogQWRkV2luZG93c0ZvbnQoTE9HRk9OVEEqIHBMb2dGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSA9IEZBTFNFKTsKKyAgQ1BERl9Gb250KiBBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc2xhdGVOYW1lID0gRkFMU0UpOwogI2VuZGlmCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBDUERGX0ZvbnQqICAgICAgICAgICAgICBBZGRNYWNGb250KENURm9udFJlZiBwRm9udCwgRlhfQk9PTCBiVmVydCwgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSA9IEZBTFNFKTsKKyAgQ1BERl9Gb250KiBBZGRNYWNGb250KENURm9udFJlZiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc2xhdGVOYW1lID0gRkFMU0UpOwogI2VuZGlmCiAKLSAgICBDUERGX0ZvbnQqCQkJCUFkZFN0YW5kYXJkRm9udChjb25zdCBGWF9DSEFSKiBmb250LCBDUERGX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nKTsKKyAgQ1BERl9Gb250KiBBZGRTdGFuZGFyZEZvbnQoY29uc3QgRlhfQ0hBUiogZm9udCwgQ1BERl9Gb250RW5jb2RpbmcqIHBFbmNvZGluZyk7CiAKKyAgQ1BERl9Gb250KiBBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlZlcnQpOwogCi0gICAgQ1BERl9Gb250KgkJCQlBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlZlcnQpOworICB2b2lkIENyZWF0ZU5ld0RvYygpOwogCi0gICAgdm9pZAkJCQkJQ3JlYXRlTmV3RG9jKCk7CisgIENQREZfRGljdGlvbmFyeSogQ3JlYXRlTmV3UGFnZShpbnQgaVBhZ2UpOwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJQ3JlYXRlTmV3UGFnZShpbnQgaVBhZ2UpOworICB2b2lkIERlbGV0ZVBhZ2UoaW50IGlQYWdlKTsKIAotICAgIHZvaWQJCQkJCURlbGV0ZVBhZ2UoaW50IGlQYWdlKTsKKyAgdm9pZCBMb2FkRG9jKCk7CisgIHZvaWQgTG9hZEFzeW5Eb2MoQ1BERl9EaWN0aW9uYXJ5KiBwTGluZWFyaXplZCk7CisgIHZvaWQgTG9hZFBhZ2VzKCk7CiAKLSAgICB2b2lkCQkJCQlMb2FkRG9jKCk7Ci0gICAgdm9pZAkJCQkJTG9hZEFzeW5Eb2MoQ1BERl9EaWN0aW9uYXJ5ICpwTGluZWFyaXplZCk7Ci0gICAgdm9pZAkJCQkJTG9hZFBhZ2VzKCk7Ci1wcm90ZWN0ZWQ6CisgcHJvdGVjdGVkOgorICBDUERGX0RpY3Rpb25hcnkqIG1fcFJvb3REaWN0OwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wUm9vdERpY3Q7CisgIENQREZfRGljdGlvbmFyeSogbV9wSW5mb0RpY3Q7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BJbmZvRGljdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9JRDE7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCW1fSUQxOworICBDRlhfQnl0ZVN0cmluZyBtX0lEMjsKIAotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9JRDI7CisgIEZYX0JPT0wgbV9iTGluZWFyaXplZDsKIAorICBGWF9EV09SRCBtX2R3Rmlyc3RQYWdlTm87CiAKLSAgICBGWF9CT09MCQkJCQltX2JMaW5lYXJpemVkOworICBGWF9EV09SRCBtX2R3Rmlyc3RQYWdlT2JqTnVtOwogCi0gICAgRlhfRFdPUkQJCQkJbV9kd0ZpcnN0UGFnZU5vOworICBDRlhfRFdvcmRBcnJheSBtX1BhZ2VMaXN0OwogCi0gICAgRlhfRFdPUkQJCQkJbV9kd0ZpcnN0UGFnZU9iak51bTsKKyAgaW50IF9HZXRQYWdlQ291bnQoKSBjb25zdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBfRmluZFBERlBhZ2UoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYWdlc1RvR28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCk7CisgIGludCBfRmluZFBhZ2VJbmRleChDUERGX0RpY3Rpb25hcnkqIHBOb2RlLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHNraXBfY291bnQsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICBpbnQmIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsID0gMCk7CisgIEZYX0JPT0wgSXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKKyAgRlhfQk9PTCBDaGVja09DR1Zpc2libGUoQ1BERl9EaWN0aW9uYXJ5KiBwT0NHLCBGWF9CT09MIGJQcmludGluZyk7CisgIENQREZfRG9jUGFnZURhdGEqIEdldFZhbGlkYXRlUGFnZURhdGEoKTsKKyAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBHZXRWYWxpZGF0ZVJlbmRlckRhdGEoKTsKKyAgZnJpZW5kIGNsYXNzIENQREZfQ3JlYXRvcjsKKyAgZnJpZW5kIGNsYXNzIENQREZfUGFyc2VyOworICBmcmllbmQgY2xhc3MgQ1BERl9EYXRhQXZhaWw7CisgIGZyaWVuZCBjbGFzcyBDUERGX09DQ29udGV4dDsKIAotICAgIENGWF9EV29yZEFycmF5CQkJbV9QYWdlTGlzdDsKKyAgQ1BERl9Eb2NQYWdlRGF0YSogbV9wRG9jUGFnZTsKIAotICAgIGludAkJCQkJCV9HZXRQYWdlQ291bnQoKSBjb25zdDsKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlfRmluZFBERlBhZ2UoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMsIGludCBpUGFnZSwgaW50IG5QYWdlc1RvR28sIGludCBsZXZlbCk7Ci0gICAgaW50CQkJCQkJX0ZpbmRQYWdlSW5kZXgoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwgRlhfRFdPUkQmIHNraXBfY291bnQsIEZYX0RXT1JEIG9iam51bSwgaW50JiBpbmRleCwgaW50IGxldmVsID0gMCk7Ci0gICAgRlhfQk9PTAkJCQkJSXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKLSAgICBGWF9CT09MCQkJCQlDaGVja09DR1Zpc2libGUoQ1BERl9EaWN0aW9uYXJ5KiBwT0NHLCBGWF9CT09MIGJQcmludGluZyk7Ci0gICAgQ1BERl9Eb2NQYWdlRGF0YSoJCUdldFZhbGlkYXRlUGFnZURhdGEoKTsKLSAgICBDUERGX0RvY1JlbmRlckRhdGEqCQlHZXRWYWxpZGF0ZVJlbmRlckRhdGEoKTsKLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX0NyZWF0b3I7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9QYXJzZXI7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9EYXRhQXZhaWw7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9PQ0NvbnRleHQ7Ci0KLQotCi0gICAgQ1BERl9Eb2NQYWdlRGF0YSoJCW1fcERvY1BhZ2U7Ci0KLSAgICBDUERGX0RvY1JlbmRlckRhdGEqCQltX3BEb2NSZW5kZXI7Ci0KKyAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBtX3BEb2NSZW5kZXI7CiB9OwogCi0jZGVmaW5lIFBERldPUkRfRU9GCQkJMAotI2RlZmluZSBQREZXT1JEX05VTUJFUgkJMQotI2RlZmluZSBQREZXT1JEX1RFWFQJCTIKLSNkZWZpbmUgUERGV09SRF9ERUxJTUlURVIJMwotI2RlZmluZSBQREZXT1JEX05BTUUJCTQKLWNsYXNzIENQREZfU2ltcGxlUGFyc2VyCi17Ci1wdWJsaWM6CisjZGVmaW5lIFBERldPUkRfRU9GIDAKKyNkZWZpbmUgUERGV09SRF9OVU1CRVIgMQorI2RlZmluZSBQREZXT1JEX1RFWFQgMgorI2RlZmluZSBQREZXT1JEX0RFTElNSVRFUiAzCisjZGVmaW5lIFBERldPUkRfTkFNRSA0CitjbGFzcyBDUERGX1NpbXBsZVBhcnNlciB7CisgcHVibGljOgorICBDUERGX1NpbXBsZVBhcnNlcihjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKIAotICAgIENQREZfU2ltcGxlUGFyc2VyKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOworICBDUERGX1NpbXBsZVBhcnNlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiAKLSAgICBDUERGX1NpbXBsZVBhcnNlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CisgIENGWF9CeXRlU3RyaW5nQyBHZXRXb3JkKCk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MJCUdldFdvcmQoKTsKKyAgRlhfQk9PTCBTZWFyY2hUb2tlbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuKTsKIAotICAgIEZYX0JPT0wJCQkJU2VhcmNoVG9rZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbik7CisgIEZYX0JPT0wgU2tpcFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbik7CiAKLSAgICBGWF9CT09MCQkJCVNraXBXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pOworICBGWF9CT09MIEZpbmRUYWdQYWlyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RhcnRfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBlbmRfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZW5kX3Bvcyk7CiAKLSAgICBGWF9CT09MCQkJCUZpbmRUYWdQYWlyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RhcnRfdG9rZW4sIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZW5kX3Rva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHN0YXJ0X3BvcywgRlhfRFdPUkQmIGVuZF9wb3MpOworICBGWF9CT09MIEZpbmRUYWdQYXJhbShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuLCBpbnQgblBhcmFtcyk7CiAKLSAgICBGWF9CT09MCQkJCUZpbmRUYWdQYXJhbShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuLCBpbnQgblBhcmFtcyk7CisgIEZYX0RXT1JEIEdldFBvcygpIHsgcmV0dXJuIG1fZHdDdXJQb3M7IH0KIAotICAgIEZYX0RXT1JECQkJR2V0UG9zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2R3Q3VyUG9zOwotICAgIH0KKyAgdm9pZCBTZXRQb3MoRlhfRFdPUkQgcG9zKSB7CisgICAgQVNTRVJUKHBvcyA8PSBtX2R3U2l6ZSk7CisgICAgbV9kd0N1clBvcyA9IHBvczsKKyAgfQogCi0gICAgdm9pZAkJCQlTZXRQb3MoRlhfRFdPUkQgcG9zKQotICAgIHsKLSAgICAgICAgQVNTRVJUKHBvcyA8PSBtX2R3U2l6ZSk7Ci0gICAgICAgIG1fZHdDdXJQb3MgPSBwb3M7Ci0gICAgfQotcHJpdmF0ZToKKyBwcml2YXRlOgorICB2b2lkIFBhcnNlV29yZChjb25zdCB1aW50OF90KiYgcFN0YXJ0LCBGWF9EV09SRCYgZHdTaXplLCBpbnQmIHR5cGUpOwogCi0gICAgdm9pZAkJCQlQYXJzZVdvcmQoY29uc3QgdWludDhfdComIHBTdGFydCwgRlhfRFdPUkQmIGR3U2l6ZSwgaW50JiB0eXBlKTsKKyAgY29uc3QgdWludDhfdCogbV9wRGF0YTsKIAotICAgIGNvbnN0IHVpbnQ4X3QqCQkJbV9wRGF0YTsKKyAgRlhfRFdPUkQgbV9kd1NpemU7CiAKLSAgICBGWF9EV09SRAkJCW1fZHdTaXplOwotCi0gICAgRlhfRFdPUkQJCQltX2R3Q3VyUG9zOworICBGWF9EV09SRCBtX2R3Q3VyUG9zOwogfTsKLWNsYXNzIENQREZfU3ludGF4UGFyc2VyCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1N5bnRheFBhcnNlciB7CisgcHVibGljOgorICBDUERGX1N5bnRheFBhcnNlcigpOworICB2aXJ0dWFsIH5DUERGX1N5bnRheFBhcnNlcigpOwogCi0gICAgQ1BERl9TeW50YXhQYXJzZXIoKTsKLSAgICB2aXJ0dWFsIH5DUERGX1N5bnRheFBhcnNlcigpOworICB2b2lkIEluaXRQYXJzZXIoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfRFdPUkQgSGVhZGVyT2Zmc2V0KTsKIAotICAgIHZvaWQJCQkJSW5pdFBhcnNlcihJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBIZWFkZXJPZmZzZXQpOworICBGWF9GSUxFU0laRSBTYXZlUG9zKCkgeyByZXR1cm4gbV9Qb3M7IH0KIAotICAgIEZYX0ZJTEVTSVpFCQkJU2F2ZVBvcygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9Qb3M7Ci0gICAgfQorICB2b2lkIFJlc3RvcmVQb3MoRlhfRklMRVNJWkUgcG9zKSB7IG1fUG9zID0gcG9zOyB9CiAKLSAgICB2b2lkCQkJCVJlc3RvcmVQb3MoRlhfRklMRVNJWkUgcG9zKQotICAgIHsKLSAgICAgICAgbV9Qb3MgPSBwb3M7Ci0gICAgfQorICBDUERGX09iamVjdCogR2V0T2JqZWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2VubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVjcnlwdCA9IFRSVUUpOwogCi0gICAgQ1BERl9PYmplY3QqCQlHZXRPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0ID0gTlVMTCwgRlhfQk9PTCBiRGVjcnlwdCA9IFRSVUUpOworICBDUERGX09iamVjdCogR2V0T2JqZWN0QnlTdHJpY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2VubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0ID0gTlVMTCk7CiAKKyAgaW50IEdldERpcmVjdE51bSgpOwogCi0gICAgQ1BERl9PYmplY3QqCQlHZXRPYmplY3RCeVN0cmljdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCogcENvbnRleHQgPSBOVUxMKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3RyaW5nKEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtKTsKIAotICAgIGludAkJCQkJR2V0RGlyZWN0TnVtKCk7CisgIENGWF9CeXRlU3RyaW5nIEdldE5hbWUoKTsKIAotICAgIENGWF9CeXRlU3RyaW5nCQlHZXRTdHJpbmcoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pOworICBDRlhfQnl0ZVN0cmluZyBHZXRLZXl3b3JkKCk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0TmFtZSgpOworICB2b2lkIEdldEJpbmFyeSh1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldEtleXdvcmQoKTsKKyAgdm9pZCBUb05leHRMaW5lKCk7CiAKLSAgICB2b2lkCQkJCUdldEJpbmFyeSh1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpOworICB2b2lkIFRvTmV4dFdvcmQoKTsKIAotICAgIHZvaWQJCQkJVG9OZXh0TGluZSgpOworICBGWF9CT09MIFNlYXJjaFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2hvbGVXb3JkLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9yd2FyZCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGxpbWl0KTsKIAotICAgIHZvaWQJCQkJVG9OZXh0V29yZCgpOworICBpbnQgU2VhcmNoTXVsdGlXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgd29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2hvbGVXb3JkLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGxpbWl0KTsKIAotICAgIEZYX0JPT0wJCQkJU2VhcmNoV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQsIEZYX0JPT0wgYldob2xlV29yZCwgRlhfQk9PTCBiRm9yd2FyZCwgRlhfRklMRVNJWkUgbGltaXQpOworICBGWF9GSUxFU0laRSBGaW5kVGFnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnLCBGWF9GSUxFU0laRSBsaW1pdCk7CiAKLSAgICBpbnQJCQkJCVNlYXJjaE11bHRpV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmRzLCBGWF9CT09MIGJXaG9sZVdvcmQsIEZYX0ZJTEVTSVpFIGxpbWl0KTsKKyAgdm9pZCBTZXRFbmNyeXB0KENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0b0hhbmRsZXIpIHsKKyAgICBtX3BDcnlwdG9IYW5kbGVyID0gcENyeXB0b0hhbmRsZXI7CisgIH0KIAotICAgIEZYX0ZJTEVTSVpFCQkJRmluZFRhZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZywgRlhfRklMRVNJWkUgbGltaXQpOworICBGWF9CT09MIElzRW5jcnlwdGVkKCkgeyByZXR1cm4gbV9wQ3J5cHRvSGFuZGxlciAhPSBOVUxMOyB9CiAKLSAgICB2b2lkCQkJCVNldEVuY3J5cHQoQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvSGFuZGxlcikKLSAgICB7Ci0gICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBwQ3J5cHRvSGFuZGxlcjsKLSAgICB9CisgIEZYX0JPT0wgR2V0Q2hhckF0KEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpOwogCi0gICAgRlhfQk9PTAkJCQlJc0VuY3J5cHRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wQ3J5cHRvSGFuZGxlciAhPSBOVUxMOwotICAgIH0KKyAgRlhfQk9PTCBSZWFkQmxvY2sodWludDhfdCogcEJ1ZiwgRlhfRFdPUkQgc2l6ZSk7CiAKLSAgICBGWF9CT09MCQkJCUdldENoYXJBdChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmV4dFdvcmQoRlhfQk9PTCYgYklzTnVtYmVyKTsKIAotICAgIEZYX0JPT0wJCQkJUmVhZEJsb2NrKHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIHNpemUpOworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGludCBrUGFyc2VyTWF4UmVjdXJzaW9uRGVwdGggPSA2NDsKKyAgc3RhdGljIGludCBzX0N1cnJlbnRSZWN1cnNpb25EZXB0aDsKIAotICAgIENGWF9CeXRlU3RyaW5nCQlHZXROZXh0V29yZChGWF9CT09MJiBiSXNOdW1iZXIpOwotcHJvdGVjdGVkOgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BhcnNlck1heFJlY3Vyc2lvbkRlcHRoID0gNjQ7Ci0gICAgc3RhdGljIGludCBzX0N1cnJlbnRSZWN1cnNpb25EZXB0aDsKKyAgdmlydHVhbCBGWF9CT09MIEdldE5leHRDaGFyKHVpbnQ4X3QmIGNoKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlHZXROZXh0Q2hhcih1aW50OF90JiBjaCk7CisgIEZYX0JPT0wgR2V0Q2hhckF0QmFja3dhcmQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCk7CiAKLSAgICBGWF9CT09MCQkJCUdldENoYXJBdEJhY2t3YXJkKEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpOworICB2b2lkIEdldE5leHRXb3JkKCk7CiAKLSAgICB2b2lkCQkJCUdldE5leHRXb3JkKCk7CisgIEZYX0JPT0wgSXNXaG9sZVdvcmQoRlhfRklMRVNJWkUgc3RhcnRwb3MsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdGFnLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRhZ2xlbik7CiAKLSAgICBGWF9CT09MCQkJCUlzV2hvbGVXb3JkKEZYX0ZJTEVTSVpFIHN0YXJ0cG9zLCBGWF9GSUxFU0laRSBsaW1pdCwgY29uc3QgdWludDhfdCogdGFnLCBGWF9EV09SRCB0YWdsZW4pOworICBDRlhfQnl0ZVN0cmluZyBSZWFkU3RyaW5nKCk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJUmVhZFN0cmluZygpOworICBDRlhfQnl0ZVN0cmluZyBSZWFkSGV4U3RyaW5nKCk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJUmVhZEhleFN0cmluZygpOworICBDUERGX1N0cmVhbSogUmVhZFN0cmVhbShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnZW5udW0pOwogCi0gICAgQ1BERl9TdHJlYW0qCQlSZWFkU3RyZWFtKENQREZfRGljdGlvbmFyeSogcERpY3QsIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSk7CisgIEZYX0ZJTEVTSVpFIG1fUG9zOwogCi0gICAgRlhfRklMRVNJWkUJCQltX1BvczsKKyAgRlhfQk9PTCBtX2JGaWxlU3RyZWFtOwogCi0gICAgRlhfQk9PTAkJCQltX2JGaWxlU3RyZWFtOworICBpbnQgbV9NZXRhZGF0YU9iam51bTsKIAotICAgIGludAkJCQkJbV9NZXRhZGF0YU9iam51bTsKKyAgSUZYX0ZpbGVSZWFkKiBtX3BGaWxlQWNjZXNzOwogCi0gICAgSUZYX0ZpbGVSZWFkKgkJbV9wRmlsZUFjY2VzczsKKyAgRlhfRFdPUkQgbV9IZWFkZXJPZmZzZXQ7CiAKLSAgICBGWF9EV09SRAkJCW1fSGVhZGVyT2Zmc2V0OworICBGWF9GSUxFU0laRSBtX0ZpbGVMZW47CiAKLSAgICBGWF9GSUxFU0laRQkJCW1fRmlsZUxlbjsKKyAgdWludDhfdCogbV9wRmlsZUJ1ZjsKIAotICAgIHVpbnQ4X3QqCQkJbV9wRmlsZUJ1ZjsKKyAgRlhfRFdPUkQgbV9CdWZTaXplOwogCi0gICAgRlhfRFdPUkQJCQltX0J1ZlNpemU7CisgIEZYX0ZJTEVTSVpFIG1fQnVmT2Zmc2V0OwogCi0gICAgRlhfRklMRVNJWkUJCQltX0J1Zk9mZnNldDsKKyAgQ1BERl9DcnlwdG9IYW5kbGVyKiBtX3BDcnlwdG9IYW5kbGVyOwogCi0gICAgQ1BERl9DcnlwdG9IYW5kbGVyKgltX3BDcnlwdG9IYW5kbGVyOworICB1aW50OF90IG1fV29yZEJ1ZmZlclsyNTddOwogCi0gICAgdWludDhfdAkJCQltX1dvcmRCdWZmZXJbMjU3XTsKKyAgRlhfRFdPUkQgbV9Xb3JkU2l6ZTsKIAotICAgIEZYX0RXT1JECQkJbV9Xb3JkU2l6ZTsKKyAgRlhfQk9PTCBtX2JJc051bWJlcjsKIAotICAgIEZYX0JPT0wJCQkJbV9iSXNOdW1iZXI7Ci0KLSAgICBGWF9GSUxFU0laRQkJCW1fZHdXb3JkUG9zOwotICAgIGZyaWVuZCBjbGFzcwkJQ1BERl9QYXJzZXI7Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX0RhdGFBdmFpbDsKKyAgRlhfRklMRVNJWkUgbV9kd1dvcmRQb3M7CisgIGZyaWVuZCBjbGFzcyBDUERGX1BhcnNlcjsKKyAgZnJpZW5kIGNsYXNzIENQREZfRGF0YUF2YWlsOwogfTsKIAotI2RlZmluZSBQREZQQVJTRV9UWVBFT05MWQkxCi0jZGVmaW5lIFBERlBBUlNFX05PU1RSRUFNCTIKKyNkZWZpbmUgUERGUEFSU0VfVFlQRU9OTFkgMQorI2RlZmluZSBQREZQQVJTRV9OT1NUUkVBTSAyCiBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCB7Ci0gICAgdWludDMyX3QgbV9GbGFnczsKLSAgICBGWF9GSUxFU0laRSBtX0RpY3RTdGFydDsKLSAgICBGWF9GSUxFU0laRSBtX0RpY3RFbmQ7Ci0gICAgRlhfRklMRVNJWkUgbV9EYXRhU3RhcnQ7Ci0gICAgRlhfRklMRVNJWkUgbV9EYXRhRW5kOworICB1aW50MzJfdCBtX0ZsYWdzOworICBGWF9GSUxFU0laRSBtX0RpY3RTdGFydDsKKyAgRlhfRklMRVNJWkUgbV9EaWN0RW5kOworICBGWF9GSUxFU0laRSBtX0RhdGFTdGFydDsKKyAgRlhfRklMRVNJWkUgbV9EYXRhRW5kOwogfTsKIAotI2RlZmluZSBQREZQQVJTRV9FUlJPUl9TVUNDRVNTCQkwCi0jZGVmaW5lIFBERlBBUlNFX0VSUk9SX0ZJTEUJCQkxCi0jZGVmaW5lIFBERlBBUlNFX0VSUk9SX0ZPUk1BVAkJMgotI2RlZmluZSBQREZQQVJTRV9FUlJPUl9QQVNTV09SRAkJMwotI2RlZmluZSBQREZQQVJTRV9FUlJPUl9IQU5ETEVSCQk0Ci0jZGVmaW5lIFBERlBBUlNFX0VSUk9SX0NFUlQJCQk1CisjZGVmaW5lIFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MgMAorI2RlZmluZSBQREZQQVJTRV9FUlJPUl9GSUxFIDEKKyNkZWZpbmUgUERGUEFSU0VfRVJST1JfRk9STUFUIDIKKyNkZWZpbmUgUERGUEFSU0VfRVJST1JfUEFTU1dPUkQgMworI2RlZmluZSBQREZQQVJTRV9FUlJPUl9IQU5ETEVSIDQKKyNkZWZpbmUgUERGUEFSU0VfRVJST1JfQ0VSVCA1CiAKLWNsYXNzIENQREZfUGFyc2VyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9QYXJzZXIoKTsKLSAgICB+Q1BERl9QYXJzZXIoKTsKK2NsYXNzIENQREZfUGFyc2VyIHsKKyBwdWJsaWM6CisgIENQREZfUGFyc2VyKCk7CisgIH5DUERGX1BhcnNlcigpOwogCi0gICAgRlhfRFdPUkQJCQlTdGFydFBhcnNlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOwotICAgIEZYX0RXT1JECQkJU3RhcnRQYXJzZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0JPT0wgYlJlUGFyc2UgPSBGQUxTRSk7Ci0gICAgRlhfRFdPUkQJCQlTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGUsIEZYX0JPT0wgYlJlUGFyc2UgPSBGQUxTRSwgRlhfQk9PTCBiT3duRmlsZVJlYWQgPSBUUlVFKTsKKyAgRlhfRFdPUkQgU3RhcnRQYXJzZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFKTsKKyAgRlhfRFdPUkQgU3RhcnRQYXJzZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0JPT0wgYlJlUGFyc2UgPSBGQUxTRSk7CisgIEZYX0RXT1JEIFN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT3duRmlsZVJlYWQgPSBUUlVFKTsKIAotICAgIHZvaWQJCQkJQ2xvc2VQYXJzZXIoRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFKTsKKyAgdm9pZCBDbG9zZVBhcnNlcihGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOwogCi0gICAgRlhfRFdPUkQJR2V0UGVybWlzc2lvbnMoRlhfQk9PTCBiQ2hlY2tSZXZpc2lvbiA9IEZBTFNFKTsKKyAgRlhfRFdPUkQgR2V0UGVybWlzc2lvbnMoRlhfQk9PTCBiQ2hlY2tSZXZpc2lvbiA9IEZBTFNFKTsKIAotICAgIEZYX0JPT0wJCUlzT3duZXIoKTsKKyAgRlhfQk9PTCBJc093bmVyKCk7CiAKLSAgICB2b2lkCQkJCVNldFBhc3N3b3JkKGNvbnN0IEZYX0NIQVIqIHBhc3N3b3JkKQotICAgIHsKLSAgICAgICAgbV9QYXNzd29yZCA9IHBhc3N3b3JkOwotICAgIH0KKyAgdm9pZCBTZXRQYXNzd29yZChjb25zdCBGWF9DSEFSKiBwYXNzd29yZCkgeyBtX1Bhc3N3b3JkID0gcGFzc3dvcmQ7IH0KIAotICAgIENGWF9CeXRlU3RyaW5nCQlHZXRQYXNzd29yZCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9QYXNzd29yZDsKLSAgICB9CisgIENGWF9CeXRlU3RyaW5nIEdldFBhc3N3b3JkKCkgeyByZXR1cm4gbV9QYXNzd29yZDsgfQogCi0gICAgQ1BERl9TZWN1cml0eUhhbmRsZXIqIEdldFNlY3VyaXR5SGFuZGxlcigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wU2VjdXJpdHlIYW5kbGVyOwotICAgIH0KKyAgQ1BERl9TZWN1cml0eUhhbmRsZXIqIEdldFNlY3VyaXR5SGFuZGxlcigpIHsgcmV0dXJuIG1fcFNlY3VyaXR5SGFuZGxlcjsgfQogCi0gICAgQ1BERl9DcnlwdG9IYW5kbGVyKglHZXRDcnlwdG9IYW5kbGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1N5bnRheC5tX3BDcnlwdG9IYW5kbGVyOwotICAgIH0KKyAgQ1BERl9DcnlwdG9IYW5kbGVyKiBHZXRDcnlwdG9IYW5kbGVyKCkgeyByZXR1cm4gbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlcjsgfQogCi0gICAgdm9pZAkJCQlTZXRTZWN1cml0eUhhbmRsZXIoQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIsIEZYX0JPT0wgYkZvcmNlZCA9IEZBTFNFKTsKKyAgdm9pZCBTZXRTZWN1cml0eUhhbmRsZXIoQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvcmNlZCA9IEZBTFNFKTsKIAotICAgIENGWF9CeXRlU3RyaW5nCQlHZXRSZWNpcGllbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYnNSZWNpcGllbnQ7Ci0gICAgfQorICBDRlhfQnl0ZVN0cmluZyBHZXRSZWNpcGllbnQoKSB7IHJldHVybiBtX2JzUmVjaXBpZW50OyB9CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCUdldFRyYWlsZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFRyYWlsZXI7Ci0gICAgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldFRyYWlsZXIoKSB7IHJldHVybiBtX3BUcmFpbGVyOyB9CiAKLSAgICBGWF9GSUxFU0laRQkJCUdldExhc3RYUmVmT2Zmc2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0xhc3RYUmVmT2Zmc2V0OwotICAgIH0KKyAgRlhfRklMRVNJWkUgR2V0TGFzdFhSZWZPZmZzZXQoKSB7IHJldHVybiBtX0xhc3RYUmVmT2Zmc2V0OyB9CiAKLSAgICBDUERGX0RvY3VtZW50KgkJR2V0RG9jdW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERvY3VtZW50OwotICAgIH0KKyAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSB7IHJldHVybiBtX3BEb2N1bWVudDsgfQogCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9EaWN0aW9uYXJ5Kj4qIEdldE90aGVyVHJhaWxlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICZtX1RyYWlsZXJzOwotICAgIH0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9EaWN0aW9uYXJ5Kj4qIEdldE90aGVyVHJhaWxlcnMoKSB7CisgICAgcmV0dXJuICZtX1RyYWlsZXJzOworICB9CiAKLSAgICBGWF9EV09SRAlHZXRSb290T2JqTnVtKCk7Ci0gICAgRlhfRFdPUkQJR2V0SW5mb09iak51bSgpIDsKLSAgICBDUERGX0FycmF5KglHZXRJREFycmF5KCkgOworICBGWF9EV09SRCBHZXRSb290T2JqTnVtKCk7CisgIEZYX0RXT1JEIEdldEluZm9PYmpOdW0oKTsKKyAgQ1BERl9BcnJheSogR2V0SURBcnJheSgpOwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KglHZXRFbmNyeXB0RGljdCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRW5jcnlwdERpY3Q7Ci0gICAgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldEVuY3J5cHREaWN0KCkgeyByZXR1cm4gbV9wRW5jcnlwdERpY3Q7IH0KIAotICAgIEZYX0JPT0wJCQkJSXNFbmNyeXB0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldEVuY3J5cHREaWN0KCkgIT0gTlVMTDsKLSAgICB9CisgIEZYX0JPT0wgSXNFbmNyeXB0ZWQoKSB7IHJldHVybiBHZXRFbmNyeXB0RGljdCgpICE9IE5VTEw7IH0KIAorICBDUERGX09iamVjdCogUGFyc2VJbmRpcmVjdE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSU0VfQ09OVEVYVCogcENvbnRleHQgPSBOVUxMKTsKKyAgRlhfRFdPUkQgR2V0TGFzdE9iak51bSgpOworICBGWF9CT09MIElzRm9ybVN0cmVhbShGWF9EV09SRCBvYmpudW0sIEZYX0JPT0wmIGJGb3JtKTsKIAotICAgIENQREZfT2JqZWN0KgkJUGFyc2VJbmRpcmVjdE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgUEFSU0VfQ09OVEVYVCogcENvbnRleHQgPSBOVUxMKSA7Ci0gICAgRlhfRFdPUkQJCQlHZXRMYXN0T2JqTnVtKCk7Ci0gICAgRlhfQk9PTAkJCQlJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBGWF9CT09MJiBiRm9ybSk7CisgIEZYX0ZJTEVTSVpFIEdldE9iamVjdE9mZnNldChGWF9EV09SRCBvYmpudW0pOwogCi0gICAgRlhfRklMRVNJWkUJCQlHZXRPYmplY3RPZmZzZXQoRlhfRFdPUkQgb2JqbnVtKTsKKyAgRlhfRklMRVNJWkUgR2V0T2JqZWN0U2l6ZShGWF9EV09SRCBvYmpudW0pOwogCi0gICAgRlhfRklMRVNJWkUJCQlHZXRPYmplY3RTaXplKEZYX0RXT1JEIG9iam51bSk7CisgIGludCBHZXRPYmplY3RWZXJzaW9uKEZYX0RXT1JEIG9iam51bSkgeyByZXR1cm4gbV9PYmpWZXJzaW9uW29iam51bV07IH0KIAotICAgIGludAkJCQkJR2V0T2JqZWN0VmVyc2lvbihGWF9EV09SRCBvYmpudW0pCi0gICAgewotICAgICAgICByZXR1cm4gbV9PYmpWZXJzaW9uW29iam51bV07Ci0gICAgfQorICB2b2lkIEdldEluZGlyZWN0QmluYXJ5KEZYX0RXT1JEIG9iam51bSwgdWludDhfdComIHBCdWZmZXIsIEZYX0RXT1JEJiBzaXplKTsKIAotICAgIHZvaWQJCQkJR2V0SW5kaXJlY3RCaW5hcnkoRlhfRFdPUkQgb2JqbnVtLCB1aW50OF90KiYgcEJ1ZmZlciwgRlhfRFdPUkQmIHNpemUpOworICBGWF9CT09MIEdldEZpbGVTdHJlYW1PcHRpb24oKSB7IHJldHVybiBtX1N5bnRheC5tX2JGaWxlU3RyZWFtOyB9CiAKLSAgICBGWF9CT09MCQkJCUdldEZpbGVTdHJlYW1PcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU3ludGF4Lm1fYkZpbGVTdHJlYW07Ci0gICAgfQorICB2b2lkIFNldEZpbGVTdHJlYW1PcHRpb24oRlhfQk9PTCBiKSB7IG1fU3ludGF4Lm1fYkZpbGVTdHJlYW0gPSBiOyB9CiAKLSAgICB2b2lkCQkJCVNldEZpbGVTdHJlYW1PcHRpb24oRlhfQk9PTCBiKQotICAgIHsKLSAgICAgICAgbV9TeW50YXgubV9iRmlsZVN0cmVhbSA9IGI7Ci0gICAgfQotCi0gICAgSUZYX0ZpbGVSZWFkKgkJR2V0RmlsZUFjY2VzcygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9TeW50YXgubV9wRmlsZUFjY2VzczsKLSAgICB9Ci0KLSAgICBpbnQJCQkJCUdldEZpbGVWZXJzaW9uKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0ZpbGVWZXJzaW9uOwotICAgIH0KLQotICAgIEZYX0JPT0wJCQkJSXNYUmVmU3RyZWFtKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JYUmVmU3RyZWFtOwotICAgIH0KLSAgICBDUERGX09iamVjdCoJCVBhcnNlSW5kaXJlY3RPYmplY3RBdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgb2JqbnVtLAotICAgICAgICAgICAgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KTsKKyAgSUZYX0ZpbGVSZWFkKiBHZXRGaWxlQWNjZXNzKCkgY29uc3QgeyByZXR1cm4gbV9TeW50YXgubV9wRmlsZUFjY2VzczsgfQogCi0gICAgQ1BERl9PYmplY3QqCQlQYXJzZUluZGlyZWN0T2JqZWN0QXRCeVN0cmljdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgb2JqbnVtLAotICAgICAgICAgICAgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0LCBGWF9GSUxFU0laRSAqcFJlc3VsdFBvcyk7CisgIGludCBHZXRGaWxlVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fRmlsZVZlcnNpb247IH0KIAotICAgIEZYX0RXT1JECQkJU3RhcnRBc3luUGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFLCBGWF9CT09MIGJPd25GaWxlUmVhZCA9IFRSVUUpOworICBGWF9CT09MIElzWFJlZlN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1fYlhSZWZTdHJlYW07IH0KKyAgQ1BERl9PYmplY3QqIFBhcnNlSW5kaXJlY3RPYmplY3RBdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCogcENvbnRleHQpOwogCi0gICAgRlhfRFdPUkQJCQlHZXRGaXJzdFBhZ2VObygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9kd0ZpcnN0UGFnZU5vOwotICAgIH0KLXByb3RlY3RlZDoKLSAgICBDUERGX0RvY3VtZW50KgkJbV9wRG9jdW1lbnQ7CisgIENQREZfT2JqZWN0KiBQYXJzZUluZGlyZWN0T2JqZWN0QXRCeVN0cmljdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSogcFJlc3VsdFBvcyk7CiAKLSAgICBDUERGX1N5bnRheFBhcnNlcgltX1N5bnRheDsKLSAgICBGWF9CT09MCQkJCW1fYk93bkZpbGVSZWFkOwotICAgIENQREZfT2JqZWN0KgkJUGFyc2VEaXJlY3QoQ1BERl9PYmplY3QqIHBPYmopOworICBGWF9EV09SRCBTdGFydEFzeW5QYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk93bkZpbGVSZWFkID0gVFJVRSk7CiAKLSAgICBGWF9CT09MCQkJCUxvYWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcyk7CisgIEZYX0RXT1JEIEdldEZpcnN0UGFnZU5vKCkgeyByZXR1cm4gbV9kd0ZpcnN0UGFnZU5vOyB9CiAKLSAgICBGWF9CT09MCQkJCUxvYWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcyk7CisgcHJvdGVjdGVkOgorICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKIAotICAgIEZYX0JPT0wJCQkJTG9hZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSBzdHJlYW1wb3MsIEZYX0JPT0wgYlNraXAsIEZYX0JPT0wgYkZpcnN0KTsKKyAgQ1BERl9TeW50YXhQYXJzZXIgbV9TeW50YXg7CisgIEZYX0JPT0wgbV9iT3duRmlsZVJlYWQ7CisgIENQREZfT2JqZWN0KiBQYXJzZURpcmVjdChDUERGX09iamVjdCogcE9iaik7CiAKLSAgICBGWF9CT09MCQkJCUxvYWRDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUmIHByZXYsIEZYX0JPT0wgYk1haW5YUmVmKTsKKyAgRlhfQk9PTCBMb2FkQWxsQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MpOwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KglMb2FkVHJhaWxlclY0KCk7CisgIEZYX0JPT0wgTG9hZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zKTsKIAotICAgIEZYX0JPT0wJCQkJUmVidWlsZENyb3NzUmVmKCk7CisgIEZYX0JPT0wgTG9hZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHN0cmVhbXBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTa2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpcnN0KTsKIAotICAgIEZYX0RXT1JECQkJU2V0RW5jcnlwdEhhbmRsZXIoKTsKKyAgRlhfQk9PTCBMb2FkQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSBwb3MsIEZYX0ZJTEVTSVpFJiBwcmV2LCBGWF9CT09MIGJNYWluWFJlZik7CiAKLSAgICB2b2lkCQkJCVJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOworICBDUERGX0RpY3Rpb25hcnkqIExvYWRUcmFpbGVyVjQoKTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCk7CisgIEZYX0JPT0wgUmVidWlsZENyb3NzUmVmKCk7CiAKLSAgICBGWF9CT09MCQkJCUxvYWRMaW5lYXJpemVkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIGR3T2JqQ291bnQpOworICBGWF9EV09SRCBTZXRFbmNyeXB0SGFuZGxlcigpOwogCi0gICAgRlhfQk9PTAkJCQlMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zKTsKKyAgdm9pZCBSZWxlYXNlRW5jcnlwdEhhbmRsZXIoKTsKIAotICAgIEZYX0RXT1JECQkJTG9hZExpbmVhcml6ZWRNYWluWFJlZlRhYmxlKCk7CisgIEZYX0JPT0wgTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCk7CiAKLSAgICBDRlhfTWFwUHRyVG9QdHIJCW1fT2JqZWN0U3RyZWFtTWFwOworICBGWF9CT09MIExvYWRMaW5lYXJpemVkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIGR3T2JqQ291bnQpOwogCi0gICAgQ1BERl9TdHJlYW1BY2MqCQlHZXRPYmplY3RTdHJlYW0oRlhfRFdPUkQgbnVtYmVyKTsKKyAgRlhfQk9PTCBMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zKTsKIAotICAgIEZYX0JPT0wJCQkJSXNMaW5lYXJpemVkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBvZmZzZXQpOworICBGWF9EV09SRCBMb2FkTGluZWFyaXplZE1haW5YUmVmVGFibGUoKTsKIAorICBDRlhfTWFwUHRyVG9QdHIgbV9PYmplY3RTdHJlYW1NYXA7CiAKKyAgQ1BERl9TdHJlYW1BY2MqIEdldE9iamVjdFN0cmVhbShGWF9EV09SRCBudW1iZXIpOwogCi0gICAgaW50CQkJCQltX0ZpbGVWZXJzaW9uOworICBGWF9CT09MIElzTGluZWFyaXplZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfRFdPUkQgb2Zmc2V0KTsKIAotICAgIENQREZfRGljdGlvbmFyeSoJbV9wVHJhaWxlcjsKKyAgaW50IG1fRmlsZVZlcnNpb247CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcEVuY3J5cHREaWN0OwotICAgIHZvaWQgU2V0RW5jcnlwdERpY3Rpb25hcnkoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisgIENQREZfRGljdGlvbmFyeSogbV9wVHJhaWxlcjsKIAotICAgIEZYX0ZJTEVTSVpFCQkJbV9MYXN0WFJlZk9mZnNldDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BFbmNyeXB0RGljdDsKKyAgdm9pZCBTZXRFbmNyeXB0RGljdGlvbmFyeShDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKIAotICAgIEZYX0JPT0wJCQkJbV9iWFJlZlN0cmVhbTsKKyAgRlhfRklMRVNJWkUgbV9MYXN0WFJlZk9mZnNldDsKIAorICBGWF9CT09MIG1fYlhSZWZTdHJlYW07CiAKLSAgICBDUERGX1NlY3VyaXR5SGFuZGxlcioJbV9wU2VjdXJpdHlIYW5kbGVyOworICBDUERGX1NlY3VyaXR5SGFuZGxlciogbV9wU2VjdXJpdHlIYW5kbGVyOwogCi0gICAgRlhfQk9PTAkJCQkJbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXI7CisgIEZYX0JPT0wgbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXI7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCW1fYnNSZWNpcGllbnQ7CisgIENGWF9CeXRlU3RyaW5nIG1fYnNSZWNpcGllbnQ7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJbV9GaWxlUGF0aDsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9GaWxlUGF0aDsKIAotICAgIENGWF9CeXRlU3RyaW5nCQltX1Bhc3N3b3JkOworICBDRlhfQnl0ZVN0cmluZyBtX1Bhc3N3b3JkOwogCi0gICAgQ0ZYX0ZpbGVTaXplQXJyYXkJbV9Dcm9zc1JlZjsKKyAgQ0ZYX0ZpbGVTaXplQXJyYXkgbV9Dcm9zc1JlZjsKIAotICAgIENGWF9CeXRlQXJyYXkJCW1fVjVUeXBlOworICBDRlhfQnl0ZUFycmF5IG1fVjVUeXBlOwogCi0gICAgQ0ZYX0ZpbGVTaXplQXJyYXkJbV9Tb3J0ZWRPZmZzZXQ7CisgIENGWF9GaWxlU2l6ZUFycmF5IG1fU29ydGVkT2Zmc2V0OwogCi0gICAgQ0ZYX1dvcmRBcnJheQkJbV9PYmpWZXJzaW9uOwotICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfRGljdGlvbmFyeSAqPgltX1RyYWlsZXJzOworICBDRlhfV29yZEFycmF5IG1fT2JqVmVyc2lvbjsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9EaWN0aW9uYXJ5Kj4gbV9UcmFpbGVyczsKIAotICAgIEZYX0JPT0wJCQkJbV9iVmVyc2lvblVwZGF0ZWQ7CisgIEZYX0JPT0wgbV9iVmVyc2lvblVwZGF0ZWQ7CiAKLSAgICBDUERGX09iamVjdCoJCW1fcExpbmVhcml6ZWQ7CisgIENQREZfT2JqZWN0KiBtX3BMaW5lYXJpemVkOwogCi0gICAgRlhfRFdPUkQJCQltX2R3Rmlyc3RQYWdlTm87CisgIEZYX0RXT1JEIG1fZHdGaXJzdFBhZ2VObzsKIAotICAgIEZYX0RXT1JECQkJbV9kd1hyZWZTdGFydE9iak51bTsKLSAgICBmcmllbmQgY2xhc3MJCUNQREZfQ3JlYXRvcjsKLSAgICBmcmllbmQgY2xhc3MJCUNQREZfRGF0YUF2YWlsOworICBGWF9EV09SRCBtX2R3WHJlZlN0YXJ0T2JqTnVtOworICBmcmllbmQgY2xhc3MgQ1BERl9DcmVhdG9yOworICBmcmllbmQgY2xhc3MgQ1BERl9EYXRhQXZhaWw7CiB9OwotI2RlZmluZSBGWENJUEhFUl9OT05FCTAKLSNkZWZpbmUgRlhDSVBIRVJfUkM0CTEKLSNkZWZpbmUgRlhDSVBIRVJfQUVTCTIKLSNkZWZpbmUgRlhDSVBIRVJfQUVTMiAgIDMKLWNsYXNzIENQREZfU2VjdXJpdHlIYW5kbGVyCi17Ci1wdWJsaWM6CisjZGVmaW5lIEZYQ0lQSEVSX05PTkUgMAorI2RlZmluZSBGWENJUEhFUl9SQzQgMQorI2RlZmluZSBGWENJUEhFUl9BRVMgMgorI2RlZmluZSBGWENJUEhFUl9BRVMyIDMKK2NsYXNzIENQREZfU2VjdXJpdHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNQREZfU2VjdXJpdHlIYW5kbGVyKCkge30KIAotICAgIHZpcnR1YWwgfkNQREZfU2VjdXJpdHlIYW5kbGVyKCkge30KKyAgdmlydHVhbCBGWF9CT09MIE9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbkluaXQoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KSA9IDA7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0UGVybWlzc2lvbnMoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFBlcm1pc3Npb25zKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNPd25lcigpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNPd25lcigpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEdldENyeXB0SW5mbyhpbnQmIGNpcGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYga2V5bGVuKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldENyeXB0SW5mbyhpbnQmIGNpcGhlciwgY29uc3QgdWludDhfdComIGJ1ZmZlciwgaW50JiBrZXlsZW4pID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzTWV0YWRhdGFFbmNyeXB0ZWQoKSB7IHJldHVybiBUUlVFOyB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzTWV0YWRhdGFFbmNyeXB0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQorICB2aXJ0dWFsIENQREZfQ3J5cHRvSGFuZGxlciogQ3JlYXRlQ3J5cHRvSGFuZGxlcigpID0gMDsKIAotICAgIHZpcnR1YWwgQ1BERl9DcnlwdG9IYW5kbGVyKglDcmVhdGVDcnlwdG9IYW5kbGVyKCkgPSAwOwotCi0gICAgdmlydHVhbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKiBHZXRTdGFuZGFyZEhhbmRsZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICB2aXJ0dWFsIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIqIEdldFN0YW5kYXJkSGFuZGxlcigpIHsgcmV0dXJuIE5VTEw7IH0KIH07Ci0jZGVmaW5lIFBERl9FTkNSWVBUX0NPTlRFTlQJCQkJMAotY2xhc3MgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlciA6IHB1YmxpYyBDUERGX1NlY3VyaXR5SGFuZGxlcgotewotcHVibGljOgotICAgIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKTsKKyNkZWZpbmUgUERGX0VOQ1JZUFRfQ09OVEVOVCAwCitjbGFzcyBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyIDogcHVibGljIENQREZfU2VjdXJpdHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKTsKIAotICAgIHZpcnR1YWwgfkNQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0UGVybWlzc2lvbnMoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzT3duZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYk93bmVyOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldENyeXB0SW5mbyhpbnQmIGNpcGhlciwgY29uc3QgdWludDhfdComIGJ1ZmZlciwgaW50JiBrZXlsZW4pOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNNZXRhZGF0YUVuY3J5cHRlZCgpOwotICAgIHZpcnR1YWwgQ1BERl9DcnlwdG9IYW5kbGVyKglDcmVhdGVDcnlwdG9IYW5kbGVyKCk7Ci0gICAgdmlydHVhbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKiBHZXRTdGFuZGFyZEhhbmRsZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQorICB2aXJ0dWFsIH5DUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkluaXQoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KTsKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRQZXJtaXNzaW9ucygpOworICB2aXJ0dWFsIEZYX0JPT0wgSXNPd25lcigpIHsgcmV0dXJuIG1fYk93bmVyOyB9CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdComIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGtleWxlbik7CisgIHZpcnR1YWwgRlhfQk9PTCBJc01ldGFkYXRhRW5jcnlwdGVkKCk7CisgIHZpcnR1YWwgQ1BERl9DcnlwdG9IYW5kbGVyKiBDcmVhdGVDcnlwdG9IYW5kbGVyKCk7CisgIHZpcnR1YWwgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlciogR2V0U3RhbmRhcmRIYW5kbGVyKCkgeyByZXR1cm4gdGhpczsgfQogCi0gICAgdm9pZAkJCQlPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9BcnJheSogcElkQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1c2VyX3Bhc3MsIEZYX0RXT1JEIHVzZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsIEZYX0RXT1JEIG93bmVyX3NpemUsIEZYX0RXT1JEIHR5cGUgPSBQREZfRU5DUllQVF9DT05URU5UKTsKKyAgdm9pZCBPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwSWRBcnJheSwKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1c2VyX3Bhc3MsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgdXNlcl9zaXplLAorICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgb3duZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICBGWF9EV09SRCB0eXBlID0gUERGX0VOQ1JZUFRfQ09OVEVOVCk7CiAKLSAgICB2b2lkCQkJCU9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBDUERGX0FycmF5KiBwSWRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVzZXJfcGFzcywgRlhfRFdPUkQgdXNlcl9zaXplLCBGWF9EV09SRCB0eXBlID0gUERGX0VOQ1JZUFRfQ09OVEVOVCk7CisgIHZvaWQgT25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCisgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElkQXJyYXksCisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLAorICAgICAgICAgICAgICAgIEZYX0RXT1JEIHVzZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICBGWF9EV09SRCB0eXBlID0gUERGX0VOQ1JZUFRfQ09OVEVOVCk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0VXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsIEZYX0RXT1JEIHBhc3Nfc2l6ZSk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldFVzZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLCBGWF9EV09SRCBwYXNzX3NpemUsIGludDMyX3Qga2V5X2xlbik7Ci0gICAgaW50CQkJCQlHZXRWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1ZlcnNpb247Ci0gICAgfQotICAgIGludAkJCQkJR2V0UmV2aXNpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUmV2aXNpb247Ci0gICAgfQorICBDRlhfQnl0ZVN0cmluZyBHZXRVc2VyUGFzc3dvcmQoY29uc3QgdWludDhfdCogb3duZXJfcGFzcywgRlhfRFdPUkQgcGFzc19zaXplKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0VXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGtleV9sZW4pOworICBpbnQgR2V0VmVyc2lvbigpIHsgcmV0dXJuIG1fVmVyc2lvbjsgfQorICBpbnQgR2V0UmV2aXNpb24oKSB7IHJldHVybiBtX1JldmlzaW9uOyB9CiAKLSAgICBpbnQJCQkJCUNoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgRlhfQk9PTCBiT3duZXIsIHVpbnQ4X3QqIGtleSk7Ci0gICAgaW50CQkJCQlDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIEZYX0JPT0wgYk93bmVyLCB1aW50OF90KiBrZXksIGludCBrZXlfbGVuKTsKLXByaXZhdGU6CisgIGludCBDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk93bmVyLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXkpOworICBpbnQgQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcGFzc19zaXplLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPd25lciwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5LAorICAgICAgICAgICAgICAgICAgICBpbnQga2V5X2xlbik7CiAKLSAgICBpbnQJCQkJCW1fVmVyc2lvbjsKKyBwcml2YXRlOgorICBpbnQgbV9WZXJzaW9uOwogCi0gICAgaW50CQkJCQltX1JldmlzaW9uOworICBpbnQgbV9SZXZpc2lvbjsKIAotICAgIENQREZfUGFyc2VyKgkJbV9wUGFyc2VyOworICBDUERGX1BhcnNlciogbV9wUGFyc2VyOwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BFbmNyeXB0RGljdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BFbmNyeXB0RGljdDsKIAotICAgIEZYX0JPT0wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpOwotICAgIEZYX0JPT0wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIEZYX0RXT1JEIHR5cGUsIGludCYgY2lwaGVyLCBpbnQmIGtleV9sZW4pOworICBGWF9CT09MIExvYWREaWN0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KTsKKyAgRlhfQk9PTCBMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0eXBlLAorICAgICAgICAgICAgICAgICAgIGludCYgY2lwaGVyLAorICAgICAgICAgICAgICAgICAgIGludCYga2V5X2xlbik7CiAKLSAgICBGWF9CT09MCQkJCUNoZWNrVXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVFbmNyeXB0TWV0YSwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pOworICBGWF9CT09MIENoZWNrVXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVFbmNyeXB0TWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBrZXlfbGVuKTsKIAotICAgIEZYX0JPT0wJCQkJQ2hlY2tPd25lclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIHVpbnQ4X3QqIGtleSwgaW50MzJfdCBrZXlfbGVuKTsKLSAgICBGWF9CT09MCQkJCUFFUzI1Nl9DaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJPd25lciwgdWludDhfdCoga2V5KTsKLSAgICB2b2lkCQkJCUFFUzI1Nl9TZXRQYXNzd29yZChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYk93bmVyLCBjb25zdCB1aW50OF90KiBrZXkpOwotICAgIHZvaWQJCQkJQUVTMjU2X1NldFBlcm1zKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9EV09SRCBwZXJtaXNzaW9uLCBGWF9CT09MIGJFbmNyeXB0TWV0YWRhdGEsIGNvbnN0IHVpbnQ4X3QqIGtleSk7Ci0gICAgdm9pZAkJCQlPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9BcnJheSogcElkQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1c2VyX3Bhc3MsIEZYX0RXT1JEIHVzZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsIEZYX0RXT1JEIG93bmVyX3NpemUsIEZYX0JPT0wgYkRlZmF1bHQsIEZYX0RXT1JEIHR5cGUpOwotICAgIEZYX0JPT0wJCQkJQ2hlY2tTZWN1cml0eShpbnQzMl90IGtleV9sZW4pOworICBGWF9CT09MIENoZWNrT3duZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcGFzc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qga2V5X2xlbik7CisgIEZYX0JPT0wgQUVTMjU2X0NoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXkpOworICB2b2lkIEFFUzI1Nl9TZXRQYXNzd29yZChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXkpOworICB2b2lkIEFFUzI1Nl9TZXRQZXJtcyhDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5jcnlwdE1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXkpOworICB2b2lkIE9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAorICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBJZEFycmF5LAorICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVzZXJfcGFzcywKKyAgICAgICAgICAgICAgICBGWF9EV09SRCB1c2VyX3NpemUsCisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogb3duZXJfcGFzcywKKyAgICAgICAgICAgICAgICBGWF9EV09SRCBvd25lcl9zaXplLAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRlZmF1bHQsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgdHlwZSk7CisgIEZYX0JPT0wgQ2hlY2tTZWN1cml0eShpbnQzMl90IGtleV9sZW4pOwogCi0gICAgRlhfQk9PTAkJCQltX2JPd25lcjsKKyAgRlhfQk9PTCBtX2JPd25lcjsKIAotICAgIEZYX0RXT1JECQkJbV9QZXJtaXNzaW9uczsKKyAgRlhfRFdPUkQgbV9QZXJtaXNzaW9uczsKIAotICAgIGludAkJCQkJbV9DaXBoZXI7CisgIGludCBtX0NpcGhlcjsKIAotICAgIHVpbnQ4X3QJCQkJbV9FbmNyeXB0S2V5WzMyXTsKKyAgdWludDhfdCBtX0VuY3J5cHRLZXlbMzJdOwogCi0gICAgaW50CQkJCQltX0tleUxlbjsKKyAgaW50IG1fS2V5TGVuOwogfTsKLWNsYXNzIENQREZfQ3J5cHRvSGFuZGxlcgotewotcHVibGljOgorY2xhc3MgQ1BERl9DcnlwdG9IYW5kbGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNQREZfQ3J5cHRvSGFuZGxlcigpIHt9CiAKLSAgICB2aXJ0dWFsIH5DUERGX0NyeXB0b0hhbmRsZXIoKSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpID0gMDsKKyAgdmlydHVhbCBGWF9EV09SRCBEZWNyeXB0R2V0U2l6ZShGWF9EV09SRCBzcmNfc2l6ZSkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9EV09SRAlEZWNyeXB0R2V0U2l6ZShGWF9EV09SRCBzcmNfc2l6ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQqIERlY3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkKglEZWNyeXB0U3RhcnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIERlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBEZWNyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY3J5cHRGaW5pc2godm9pZCogY29udGV4dCwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpID0gMDsKKyAgdmlydHVhbCBGWF9EV09SRCBFbmNyeXB0R2V0U2l6ZShGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKSA9IDA7CiAKKyAgdmlydHVhbCBGWF9CT09MIEVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfRFdPUkQJRW5jcnlwdEdldFNpemUoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9CT09MCQlFbmNyeXB0Q29udGVudChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIHZlcnNpb24sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKLQotICAgIHZvaWQJCQkJRGVjcnlwdChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIHZlcnNpb24sIENGWF9CeXRlU3RyaW5nJiBzdHIpOworICB2b2lkIERlY3J5cHQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKIH07Ci1jbGFzcyBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlciA6IHB1YmxpYyBDUERGX0NyeXB0b0hhbmRsZXIKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyIDogcHVibGljIENQREZfQ3J5cHRvSGFuZGxlciB7CisgcHVibGljOgorICBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcigpOwogCi0gICAgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXIoKTsKKyAgdmlydHVhbCB+Q1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXIoKTsKIAotICAgIHZpcnR1YWwgfkNQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyKCk7CisgIEZYX0JPT0wgSW5pdChpbnQgY2lwaGVyLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlsZW4pOworICB2aXJ0dWFsIEZYX0JPT0wgSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpOworICB2aXJ0dWFsIEZYX0RXT1JEIERlY3J5cHRHZXRTaXplKEZYX0RXT1JEIHNyY19zaXplKTsKKyAgdmlydHVhbCB2b2lkKiBEZWNyeXB0U3RhcnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pOworICB2aXJ0dWFsIEZYX0JPT0wgRGVjcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOworICB2aXJ0dWFsIEZYX0JPT0wgRGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIHZpcnR1YWwgRlhfRFdPUkQgRW5jcnlwdEdldFNpemUoRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBFbmNyeXB0Q29udGVudChGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKIAotICAgIEZYX0JPT0wJCQkJSW5pdChpbnQgY2lwaGVyLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlsZW4pOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJRGVjcnlwdEdldFNpemUoRlhfRFdPUkQgc3JjX3NpemUpOwotICAgIHZpcnR1YWwgdm9pZCoJRGVjcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY3J5cHRGaW5pc2godm9pZCogY29udGV4dCwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJRW5jcnlwdEdldFNpemUoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlFbmNyeXB0Q29udGVudChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIHZlcnNpb24sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIENyeXB0QmxvY2soRlhfQk9PTCBiRW5jcnlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnZW5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CisgIHZpcnR1YWwgdm9pZCogQ3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgRlhfQk9PTCBiRW5jcnlwdCk7CisgIHZpcnR1YWwgRlhfQk9PTCBDcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmNyeXB0KTsKKyAgdmlydHVhbCBGWF9CT09MIENyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuY3J5cHQpOwogCi0gICAgdmlydHVhbCB2b2lkCQlDcnlwdEJsb2NrKEZYX0JPT0wgYkVuY3J5cHQsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotICAgIHZpcnR1YWwgdm9pZCoJQ3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgRlhfQk9PTCBiRW5jcnlwdCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlDcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYsIEZYX0JPT0wgYkVuY3J5cHQpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ3J5cHRGaW5pc2godm9pZCogY29udGV4dCwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYsIEZYX0JPT0wgYkVuY3J5cHQpOworICB1aW50OF90IG1fRW5jcnlwdEtleVszMl07CiAKLSAgICB1aW50OF90CQkJCW1fRW5jcnlwdEtleVszMl07CisgIGludCBtX0tleUxlbjsKIAotICAgIGludAkJCQkJbV9LZXlMZW47CisgIGludCBtX0NpcGhlcjsKIAotICAgIGludAkJCQkJbV9DaXBoZXI7Ci0KLSAgICB1aW50OF90KgkJCW1fcEFFU0NvbnRleHQ7CisgIHVpbnQ4X3QqIG1fcEFFU0NvbnRleHQ7CiB9OwotY2xhc3MgQ1BERl9Qb2ludAotewotcHVibGljOgorY2xhc3MgQ1BERl9Qb2ludCB7CisgcHVibGljOgorICBDUERGX1BvaW50KEZYX0ZMT0FUIHh4LCBGWF9GTE9BVCB5eSkgeworICAgIHggPSB4eDsKKyAgICB5ID0geXk7CisgIH0KIAotICAgIENQREZfUG9pbnQoRlhfRkxPQVQgeHgsIEZYX0ZMT0FUIHl5KQotICAgIHsKLSAgICAgICAgeCA9IHh4OwotICAgICAgICB5ID0geXk7Ci0gICAgfQorICBGWF9GTE9BVCB4OwogCi0gICAgRlhfRkxPQVQJCQl4OwotCi0gICAgRlhfRkxPQVQJCQl5OworICBGWF9GTE9BVCB5OwogfTsKIAotI2RlZmluZSBDUERGX1JlY3QJCUNGWF9GbG9hdFJlY3QKLSNkZWZpbmUgQ1BERl9NYXRyaXgJCUNGWF9BZmZpbmVNYXRyaXgKKyNkZWZpbmUgQ1BERl9SZWN0IENGWF9GbG9hdFJlY3QKKyNkZWZpbmUgQ1BERl9NYXRyaXggQ0ZYX0FmZmluZU1hdHJpeAogQ0ZYX0J5dGVTdHJpbmcgUERGX05hbWVEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvcmlnKTsKIENGWF9CeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKTsKIENGWF9CeXRlU3RyaW5nIFBERl9OYW1lRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKTsKLUNGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYywgRlhfQk9PTCBiSGV4ID0gRkFMU0UpOwotQ0ZYX1dpZGVTdHJpbmcgUERGX0RlY29kZVRleHQoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpOwotaW5saW5lIENGWF9XaWRlU3RyaW5nIFBERl9EZWNvZGVUZXh0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic3RyLCBDRlhfQ2hhck1hcCogcENoYXJNYXAgPSBOVUxMKSB7Ci0gICAgcmV0dXJuIFBERl9EZWNvZGVUZXh0KChjb25zdCB1aW50OF90Kilic3RyLmNfc3RyKCksIGJzdHIuR2V0TGVuZ3RoKCksIHBDaGFyTWFwKTsKK0NGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSGV4ID0gRkFMU0UpOworQ0ZYX1dpZGVTdHJpbmcgUERGX0RlY29kZVRleHQoY29uc3QgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCk7CitpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgUERGX0RlY29kZVRleHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCkgeworICByZXR1cm4gUERGX0RlY29kZVRleHQoKGNvbnN0IHVpbnQ4X3QqKWJzdHIuY19zdHIoKSwgYnN0ci5HZXRMZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyTWFwKTsKIH0KLUNGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVUZXh0KGNvbnN0IEZYX1dDSEFSKiBwU3RyaW5nLCBpbnQgbGVuID0gLTEsIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpOwotaW5saW5lIENGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIsIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpIHsKLSAgICByZXR1cm4gUERGX0VuY29kZVRleHQoc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSwgcENoYXJNYXApOworQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVRleHQoY29uc3QgRlhfV0NIQVIqIHBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ2hhck1hcCogcENoYXJNYXAgPSBOVUxMKTsKK2lubGluZSBDRlhfQnl0ZVN0cmluZyBQREZfRW5jb2RlVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpIHsKKyAgcmV0dXJuIFBERl9FbmNvZGVUZXh0KHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCksIHBDaGFyTWFwKTsKIH0KIEZYX0ZMT0FUIFBERl9DbGlwRmxvYXQoRlhfRkxPQVQgZik7Ci1jbGFzcyBDRkRGX0RvY3VtZW50IDogcHVibGljIENQREZfSW5kaXJlY3RPYmplY3RzCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIENGREZfRG9jdW1lbnQqIENyZWF0ZU5ld0RvYygpOwotICAgIHN0YXRpYyBDRkRGX0RvY3VtZW50KiBQYXJzZUZpbGUoSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSA9IEZBTFNFKTsKLSAgICBzdGF0aWMgQ0ZERl9Eb2N1bWVudCogUGFyc2VNZW1vcnkoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUpOworY2xhc3MgQ0ZERl9Eb2N1bWVudCA6IHB1YmxpYyBDUERGX0luZGlyZWN0T2JqZWN0cyB7CisgcHVibGljOgorICBzdGF0aWMgQ0ZERl9Eb2N1bWVudCogQ3JlYXRlTmV3RG9jKCk7CisgIHN0YXRpYyBDRkRGX0RvY3VtZW50KiBQYXJzZUZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPd25GaWxlID0gRkFMU0UpOworICBzdGF0aWMgQ0ZERl9Eb2N1bWVudCogUGFyc2VNZW1vcnkoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUpOwogCi0gICAgfkNGREZfRG9jdW1lbnQoKTsKKyAgfkNGREZfRG9jdW1lbnQoKTsKIAotICAgIEZYX0JPT0wJCQkJCVdyaXRlQnVmKENGWF9CeXRlVGV4dEJ1ZiYgYnVmKSBjb25zdDsKKyAgRlhfQk9PTCBXcml0ZUJ1ZihDRlhfQnl0ZVRleHRCdWYmIGJ1ZikgY29uc3Q7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXRSb290KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BSb290RGljdDsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSogR2V0Um9vdCgpIGNvbnN0IHsgcmV0dXJuIG1fcFJvb3REaWN0OyB9CiAKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldFdpbjMyUGF0aCgpIGNvbnN0OwotcHJvdGVjdGVkOgorICBDRlhfV2lkZVN0cmluZyBHZXRXaW4zMlBhdGgoKSBjb25zdDsKIAotICAgIENGREZfRG9jdW1lbnQoKTsKLSAgICB2b2lkCVBhcnNlU3RyZWFtKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0JPT0wgYk93bkZpbGUpOwotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcFJvb3REaWN0OwotICAgIElGWF9GaWxlUmVhZCoJCQltX3BGaWxlOwotICAgIEZYX0JPT0wJCQkJCW1fYk93bkZpbGU7CisgcHJvdGVjdGVkOgorICBDRkRGX0RvY3VtZW50KCk7CisgIHZvaWQgUGFyc2VTdHJlYW0oSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSk7CisgIENQREZfRGljdGlvbmFyeSogbV9wUm9vdERpY3Q7CisgIElGWF9GaWxlUmVhZCogbV9wRmlsZTsKKyAgRlhfQk9PTCBtX2JPd25GaWxlOwogfTsKIAotQ0ZYX1dpZGVTdHJpbmcJRlBERl9GaWxlU3BlY19HZXRXaW4zMlBhdGgoY29uc3QgQ1BERl9PYmplY3QqIHBGaWxlU3BlYyk7Ci12b2lkCQkJRlBERl9GaWxlU3BlY19TZXRXaW4zMlBhdGgoQ1BERl9PYmplY3QqIHBGaWxlU3BlYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxwYXRoKTsKK0NGWF9XaWRlU3RyaW5nIEZQREZfRmlsZVNwZWNfR2V0V2luMzJQYXRoKGNvbnN0IENQREZfT2JqZWN0KiBwRmlsZVNwZWMpOwordm9pZCBGUERGX0ZpbGVTcGVjX1NldFdpbjMyUGF0aChDUERGX09iamVjdCogcEZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgZnVsbHBhdGgpOwogCi12b2lkIEZsYXRlRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotRlhfRFdPUkQgRmxhdGVEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci1GWF9EV09SRCBSdW5MZW5ndGhEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci1jbGFzcyBDUERGX051bWJlclRyZWUKLXsKLXB1YmxpYzoKK3ZvaWQgRmxhdGVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CitGWF9EV09SRCBGbGF0ZURlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKK0ZYX0RXT1JEIFJ1bkxlbmd0aERlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKK2NsYXNzIENQREZfTnVtYmVyVHJlZSB7CisgcHVibGljOgorICBDUERGX051bWJlclRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCkgeyBtX3BSb290ID0gcFJvb3Q7IH0KIAotICAgIENQREZfTnVtYmVyVHJlZShDUERGX0RpY3Rpb25hcnkqIHBSb290KQotICAgIHsKLSAgICAgICAgbV9wUm9vdCA9IHBSb290OwotICAgIH0KKyAgQ1BERl9PYmplY3QqIExvb2t1cFZhbHVlKGludCBudW0pOwogCi0gICAgQ1BERl9PYmplY3QqCQlMb29rdXBWYWx1ZShpbnQgbnVtKTsKLXByb3RlY3RlZDoKLQotICAgIENQREZfRGljdGlvbmFyeSoJbV9wUm9vdDsKKyBwcm90ZWN0ZWQ6CisgIENQREZfRGljdGlvbmFyeSogbV9wUm9vdDsKIH07CiAKLWNsYXNzIElGWF9GaWxlQXZhaWwKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JRlhfRmlsZUF2YWlsKCkgeyB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNEYXRhQXZhaWwoIEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkgPSAwOworY2xhc3MgSUZYX0ZpbGVBdmFpbCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfRmlsZUF2YWlsKCkge30KKyAgdmlydHVhbCBGWF9CT09MIElzRGF0YUF2YWlsKEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkgPSAwOwogfTsKLWNsYXNzIElGWF9Eb3dubG9hZEhpbnRzCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYX0Rvd25sb2FkSGludHMoKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQJCQlBZGRTZWdtZW50KEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkgPSAwOworY2xhc3MgSUZYX0Rvd25sb2FkSGludHMgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX0Rvd25sb2FkSGludHMoKSB7fQorICB2aXJ0dWFsIHZvaWQgQWRkU2VnbWVudChGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0RXT1JEIHNpemUpID0gMDsKIH07Ci0jZGVmaW5lIFBERl9JU19MSU5FQVJJWkVECQkJMQotI2RlZmluZSBQREZfTk9UX0xJTkVBUklaRUQJCQkwCi0jZGVmaW5lIFBERl9VTktOT1dfTElORUFSSVpFRAkJLTEKLSNkZWZpbmUgUERGRk9STV9OT1RBVkFJTAkJMAotI2RlZmluZSBQREZGT1JNX0FWQUlMCQkJMQotI2RlZmluZSBQREZGT1JNX05PVEVYSVNUCQkyCi1jbGFzcyBJUERGX0RhdGFBdmFpbAotewotcHVibGljOgotICAgIHN0YXRpYyBJUERGX0RhdGFBdmFpbCogQ3JlYXRlKElGWF9GaWxlQXZhaWwqIHBGaWxlQXZhaWwsIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKTsKLSAgICB2aXJ0dWFsIH5JUERGX0RhdGFBdmFpbCgpIHsgfQorI2RlZmluZSBQREZfSVNfTElORUFSSVpFRCAxCisjZGVmaW5lIFBERl9OT1RfTElORUFSSVpFRCAwCisjZGVmaW5lIFBERl9VTktOT1dfTElORUFSSVpFRCAtMQorI2RlZmluZSBQREZGT1JNX05PVEFWQUlMIDAKKyNkZWZpbmUgUERGRk9STV9BVkFJTCAxCisjZGVmaW5lIFBERkZPUk1fTk9URVhJU1QgMgorY2xhc3MgSVBERl9EYXRhQXZhaWwgeworIHB1YmxpYzoKKyAgc3RhdGljIElQREZfRGF0YUF2YWlsKiBDcmVhdGUoSUZYX0ZpbGVBdmFpbCogcEZpbGVBdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQpOworICB2aXJ0dWFsIH5JUERGX0RhdGFBdmFpbCgpIHt9CiAKLSAgICBJRlhfRmlsZUF2YWlsKiBHZXRGaWxlQXZhaWwoKSBjb25zdCB7IHJldHVybiBtX3BGaWxlQXZhaWw7IH0KLSAgICBJRlhfRmlsZVJlYWQqIEdldEZpbGVSZWFkKCkgY29uc3QgeyByZXR1cm4gbV9wRmlsZVJlYWQ7IH0KKyAgSUZYX0ZpbGVBdmFpbCogR2V0RmlsZUF2YWlsKCkgY29uc3QgeyByZXR1cm4gbV9wRmlsZUF2YWlsOyB9CisgIElGWF9GaWxlUmVhZCogR2V0RmlsZVJlYWQoKSBjb25zdCB7IHJldHVybiBtX3BGaWxlUmVhZDsgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkCQkJU2V0RG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYykgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzUGFnZUF2YWlsKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzTGluZWFyaXplZCgpID0gMDsKLSAgICB2aXJ0dWFsIGludDMyX3QJCUlzRm9ybUF2YWlsKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpID0gMDsKLSAgICB2aXJ0dWFsIGludDMyX3QJCUlzTGluZWFyaXplZFBERigpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQJCQkJR2V0TGluZWFyaXplZE1haW5YUmVmSW5mbyhGWF9GSUxFU0laRSAqcFBvcywgRlhfRFdPUkQgKnBTaXplKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBJc0RvY0F2YWlsKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldERvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzUGFnZUF2YWlsKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNMaW5lYXJpemVkKCkgPSAwOworICB2aXJ0dWFsIGludDMyX3QgSXNGb3JtQXZhaWwoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgPSAwOworICB2aXJ0dWFsIGludDMyX3QgSXNMaW5lYXJpemVkUERGKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgR2V0TGluZWFyaXplZE1haW5YUmVmSW5mbyhGWF9GSUxFU0laRSogcFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBTaXplKSA9IDA7CiAKLXByb3RlY3RlZDoKLSAgICBJUERGX0RhdGFBdmFpbChJRlhfRmlsZUF2YWlsKiBwRmlsZUF2YWlsLCBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCk7CisgcHJvdGVjdGVkOgorICBJUERGX0RhdGFBdmFpbChJRlhfRmlsZUF2YWlsKiBwRmlsZUF2YWlsLCBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCk7CiAKLSAgICBJRlhfRmlsZUF2YWlsKiBtX3BGaWxlQXZhaWw7Ci0gICAgSUZYX0ZpbGVSZWFkKiBtX3BGaWxlUmVhZDsKKyAgSUZYX0ZpbGVBdmFpbCogbV9wRmlsZUF2YWlsOworICBJRlhfRmlsZVJlYWQqIG1fcEZpbGVSZWFkOwogfTsKLWNsYXNzIENQREZfU29ydE9iak51bUFycmF5Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1NvcnRPYmpOdW1BcnJheSB7CisgcHVibGljOgorICB2b2lkIEFkZE9iak51bShGWF9EV09SRCBkd09iak51bSk7CiAKLSAgICB2b2lkIEFkZE9iak51bShGWF9EV09SRCBkd09iak51bSk7CisgIEZYX0JPT0wgRmluZChGWF9EV09SRCBkd09iak51bSk7CiAKLSAgICBGWF9CT09MIEZpbmQoRlhfRFdPUkQgZHdPYmpOdW0pOworICB2b2lkIFJlbW92ZUFsbCgpIHsgbV9udW1iZXJfYXJyYXkuUmVtb3ZlQWxsKCk7IH0KIAotICAgIHZvaWQgUmVtb3ZlQWxsKCkKLSAgICB7Ci0gICAgICAgIG1fbnVtYmVyX2FycmF5LlJlbW92ZUFsbCgpOwotICAgIH0KLXByb3RlY3RlZDoKKyBwcm90ZWN0ZWQ6CisgIEZYX0JPT0wgQmluYXJ5U2VhcmNoKEZYX0RXT1JEIHZhbHVlLCBpbnQmIGlOZXh0KTsKIAotICAgIEZYX0JPT0wgQmluYXJ5U2VhcmNoKEZYX0RXT1JEIHZhbHVlLCBpbnQgJmlOZXh0KTsKLXByb3RlY3RlZDoKLQotICAgIENGWF9EV29yZEFycmF5CQkJbV9udW1iZXJfYXJyYXk7CisgcHJvdGVjdGVkOgorICBDRlhfRFdvcmRBcnJheSBtX251bWJlcl9hcnJheTsKIH07CiBlbnVtIFBERl9QQUdFTk9ERV9UWVBFIHsKLSAgICBQREZfUEFHRU5PREVfVU5LT1dOID0gMCwKLSAgICBQREZfUEFHRU5PREVfUEFHRSwKLSAgICBQREZfUEFHRU5PREVfUEFHRVMsCi0gICAgUERGX1BBR0VOT0RFX0FSUkFZLAorICBQREZfUEFHRU5PREVfVU5LT1dOID0gMCwKKyAgUERGX1BBR0VOT0RFX1BBR0UsCisgIFBERl9QQUdFTk9ERV9QQUdFUywKKyAgUERGX1BBR0VOT0RFX0FSUkFZLAogfTsKLWNsYXNzIENQREZfUGFnZU5vZGUKLXsKLXB1YmxpYzoKLSAgICBDUERGX1BhZ2VOb2RlKCkgOiBtX3R5cGUoUERGX1BBR0VOT0RFX1VOS09XTikge30KLSAgICB+Q1BERl9QYWdlTm9kZSgpOwotICAgIFBERl9QQUdFTk9ERV9UWVBFCW1fdHlwZTsKLSAgICBGWF9EV09SRAkJCW1fZHdQYWdlTm87Ci0gICAgQ0ZYX1B0ckFycmF5CQltX2NoaWxkTm9kZTsKK2NsYXNzIENQREZfUGFnZU5vZGUgeworIHB1YmxpYzoKKyAgQ1BERl9QYWdlTm9kZSgpIDogbV90eXBlKFBERl9QQUdFTk9ERV9VTktPV04pIHt9CisgIH5DUERGX1BhZ2VOb2RlKCk7CisgIFBERl9QQUdFTk9ERV9UWVBFIG1fdHlwZTsKKyAgRlhfRFdPUkQgbV9kd1BhZ2VObzsKKyAgQ0ZYX1B0ckFycmF5IG1fY2hpbGROb2RlOwogfTsKIGVudW0gUERGX0RBVEFBVkFJTF9TVEFUVVMgewotICAgIFBERl9EQVRBQVZBSUxfSEVBREVSID0gMCwKLSAgICBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRSwKLSAgICBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRV9QUkVQQVJFLAotICAgIFBERl9EQVRBQVZBSUxfRU5ELAotICAgIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUYsCi0gICAgUERGX0RBVEFBVkFJTF9DUk9TU1JFRl9JVEVNLAotICAgIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUZfU1RSRUFNLAotICAgIFBERl9EQVRBQVZBSUxfVFJBSUxFUiwKLSAgICBQREZfREFUQUFWQUlMX0xPQURBTExDUlNPU1NSRUYsCi0gICAgUERGX0RBVEFBVkFJTF9ST09ULAotICAgIFBERl9EQVRBQVZBSUxfSU5GTywKLSAgICBQREZfREFUQUFWQUlMX0FDUk9GT1JNLAotICAgIFBERl9EQVRBQVZBSUxfQUNST0ZPUk1fU1VCT0JKRUNULAotICAgIFBERl9EQVRBQVZBSUxfUEFHRVRSRUUsCi0gICAgUERGX0RBVEFBVkFJTF9QQUdFLAotICAgIFBERl9EQVRBQVZBSUxfUEFHRV9MQVRFUkxPQUQsCi0gICAgUERGX0RBVEFBVkFJTF9SRVNPVVJDRVMsCi0gICAgUERGX0RBVEFBVkFJTF9ET05FLAotICAgIFBERl9EQVRBQVZBSUxfRVJST1IsCi0gICAgUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRSwKLSAgICBQREZfREFUQUFWQUlMX1RSQUlMRVJfQVBQRU5ECisgIFBERl9EQVRBQVZBSUxfSEVBREVSID0gMCwKKyAgUERGX0RBVEFBVkFJTF9GSVJTVFBBR0UsCisgIFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkUsCisgIFBERl9EQVRBQVZBSUxfRU5ELAorICBQREZfREFUQUFWQUlMX0NST1NTUkVGLAorICBQREZfREFUQUFWQUlMX0NST1NTUkVGX0lURU0sCisgIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUZfU1RSRUFNLAorICBQREZfREFUQUFWQUlMX1RSQUlMRVIsCisgIFBERl9EQVRBQVZBSUxfTE9BREFMTENSU09TU1JFRiwKKyAgUERGX0RBVEFBVkFJTF9ST09ULAorICBQREZfREFUQUFWQUlMX0lORk8sCisgIFBERl9EQVRBQVZBSUxfQUNST0ZPUk0sCisgIFBERl9EQVRBQVZBSUxfQUNST0ZPUk1fU1VCT0JKRUNULAorICBQREZfREFUQUFWQUlMX1BBR0VUUkVFLAorICBQREZfREFUQUFWQUlMX1BBR0UsCisgIFBERl9EQVRBQVZBSUxfUEFHRV9MQVRFUkxPQUQsCisgIFBERl9EQVRBQVZBSUxfUkVTT1VSQ0VTLAorICBQREZfREFUQUFWQUlMX0RPTkUsCisgIFBERl9EQVRBQVZBSUxfRVJST1IsCisgIFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEUsCisgIFBERl9EQVRBQVZBSUxfVFJBSUxFUl9BUFBFTkQKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oCmluZGV4IGMwNzkyY2YuLmIwMzAyY2QgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaApAQCAtMjMsMjY5ICsyMywyNzUgQEAKIGNsYXNzIENQREZfSW1hZ2VPYmplY3Q7CiBjbGFzcyBDUERGX1NoYWRpbmdPYmplY3Q7CiBjbGFzcyBDUERGX0Zvcm1PYmplY3Q7Ci1jbGFzcyBJUERGX09DQ29udGV4dAotewotcHVibGljOgorY2xhc3MgSVBERl9PQ0NvbnRleHQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBERl9PQ0NvbnRleHQoKSB7fQogCi0gICAgdmlydHVhbCB+SVBERl9PQ0NvbnRleHQoKSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DRykgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCUNoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0cpID0gMDsKLQotICAgIEZYX0JPT0wgQ2hlY2tPYmplY3RWaXNpYmxlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaik7CisgIEZYX0JPT0wgQ2hlY2tPYmplY3RWaXNpYmxlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaik7CiB9OwotI2RlZmluZSBSRU5ERVJfQ09MT1JfTk9STUFMCQkwCi0jZGVmaW5lIFJFTkRFUl9DT0xPUl9HUkFZCQkxCi0jZGVmaW5lIFJFTkRFUl9DT0xPUl9UV09DT0xPUgkyCi0jZGVmaW5lIFJFTkRFUl9DT0xPUl9BTFBIQQkJMwotI2RlZmluZSBSRU5ERVJfQ0xFQVJUWVBFCQkJMHgwMDAwMDAwMQotI2RlZmluZSBSRU5ERVJfUFJJTlRHUkFQSElDVEVYVAkJMHgwMDAwMDAwMgotI2RlZmluZSBSRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRQkJMHgwMDAwMDAwNAotI2RlZmluZSBSRU5ERVJfUFJJTlRQUkVWSUVXCQkJMHgwMDAwMDAwOAotI2RlZmluZSBSRU5ERVJfQkdSX1NUUklQRQkJCTB4MDAwMDAwMTAKLSNkZWZpbmUgUkVOREVSX05PX05BVElWRVRFWFQJCTB4MDAwMDAwMjAKLSNkZWZpbmUgUkVOREVSX0ZPUkNFX0hBTEZUT05FCQkweDAwMDAwMDQwCi0jZGVmaW5lIFJFTkRFUl9SRUNUX0FBCQkJCTB4MDAwMDAwODAKLSNkZWZpbmUgUkVOREVSX0ZJTExfRlVMTENPVkVSCQkweDAwMDAwMTAwCi0jZGVmaW5lIFJFTkRFUl9QUklOVElNQUdFVEVYVCAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFJFTkRFUl9PVkVSUFJJTlQgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIFJFTkRFUl9USElOTElORSAgICAgICAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIFJFTkRFUl9OT1RFWFRTTU9PVEgJCQkweDEwMDAwMDAwCi0jZGVmaW5lIFJFTkRFUl9OT1BBVEhTTU9PVEgJCQkweDIwMDAwMDAwCi0jZGVmaW5lIFJFTkRFUl9OT0lNQUdFU01PT1RICQkweDQwMDAwMDAwCi0jZGVmaW5lIFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRQkweDgwMDAwMDAwCi1jbGFzcyBDUERGX1JlbmRlck9wdGlvbnMKLXsKLXB1YmxpYzoKKyNkZWZpbmUgUkVOREVSX0NPTE9SX05PUk1BTCAwCisjZGVmaW5lIFJFTkRFUl9DT0xPUl9HUkFZIDEKKyNkZWZpbmUgUkVOREVSX0NPTE9SX1RXT0NPTE9SIDIKKyNkZWZpbmUgUkVOREVSX0NPTE9SX0FMUEhBIDMKKyNkZWZpbmUgUkVOREVSX0NMRUFSVFlQRSAweDAwMDAwMDAxCisjZGVmaW5lIFJFTkRFUl9QUklOVEdSQVBISUNURVhUIDB4MDAwMDAwMDIKKyNkZWZpbmUgUkVOREVSX0ZPUkNFX0RPV05TQU1QTEUgMHgwMDAwMDAwNAorI2RlZmluZSBSRU5ERVJfUFJJTlRQUkVWSUVXIDB4MDAwMDAwMDgKKyNkZWZpbmUgUkVOREVSX0JHUl9TVFJJUEUgMHgwMDAwMDAxMAorI2RlZmluZSBSRU5ERVJfTk9fTkFUSVZFVEVYVCAweDAwMDAwMDIwCisjZGVmaW5lIFJFTkRFUl9GT1JDRV9IQUxGVE9ORSAweDAwMDAwMDQwCisjZGVmaW5lIFJFTkRFUl9SRUNUX0FBIDB4MDAwMDAwODAKKyNkZWZpbmUgUkVOREVSX0ZJTExfRlVMTENPVkVSIDB4MDAwMDAxMDAKKyNkZWZpbmUgUkVOREVSX1BSSU5USU1BR0VURVhUIDB4MDAwMDAyMDAKKyNkZWZpbmUgUkVOREVSX09WRVJQUklOVCAweDAwMDAwNDAwCisjZGVmaW5lIFJFTkRFUl9USElOTElORSAweDAwMDAwODAwCisjZGVmaW5lIFJFTkRFUl9OT1RFWFRTTU9PVEggMHgxMDAwMDAwMAorI2RlZmluZSBSRU5ERVJfTk9QQVRIU01PT1RIIDB4MjAwMDAwMDAKKyNkZWZpbmUgUkVOREVSX05PSU1BR0VTTU9PVEggMHg0MDAwMDAwMAorI2RlZmluZSBSRU5ERVJfTElNSVRFRElNQUdFQ0FDSEUgMHg4MDAwMDAwMAorY2xhc3MgQ1BERl9SZW5kZXJPcHRpb25zIHsKKyBwdWJsaWM6CisgIENQREZfUmVuZGVyT3B0aW9ucygpOwogCi0gICAgQ1BERl9SZW5kZXJPcHRpb25zKCk7CisgIGludCBtX0NvbG9yTW9kZTsKIAotICAgIGludAkJCQltX0NvbG9yTW9kZTsKKyAgRlhfQ09MT1JSRUYgbV9CYWNrQ29sb3I7CiAKLSAgICBGWF9DT0xPUlJFRgkJbV9CYWNrQ29sb3I7CisgIEZYX0NPTE9SUkVGIG1fRm9yZUNvbG9yOwogCi0gICAgRlhfQ09MT1JSRUYJCW1fRm9yZUNvbG9yOworICBGWF9EV09SRCBtX0ZsYWdzOwogCi0gICAgRlhfRFdPUkQJCW1fRmxhZ3M7CisgIGludCBtX0ludGVycG9sYXRpb247CiAKLSAgICBpbnQJCQkJbV9JbnRlcnBvbGF0aW9uOworICBGWF9EV09SRCBtX0FkZEZsYWdzOwogCi0gICAgRlhfRFdPUkQJCW1fQWRkRmxhZ3M7CisgIElQREZfT0NDb250ZXh0KiBtX3BPQ0NvbnRleHQ7CiAKLSAgICBJUERGX09DQ29udGV4dCoJbV9wT0NDb250ZXh0OworICBGWF9EV09SRCBtX2R3TGltaXRDYWNoZVNpemU7CiAKLSAgICBGWF9EV09SRAkJbV9kd0xpbWl0Q2FjaGVTaXplOworICBpbnQgbV9IYWxmdG9uZUxpbWl0OwogCi0gICAgaW50CQkJCW1fSGFsZnRvbmVMaW1pdDsKLQotICAgIEZYX0FSR0IJCQlUcmFuc2xhdGVDb2xvcihGWF9BUkdCIGFyZ2IpIGNvbnN0OworICBGWF9BUkdCIFRyYW5zbGF0ZUNvbG9yKEZYX0FSR0IgYXJnYikgY29uc3Q7CiB9OwotY2xhc3MgQ1BERl9SZW5kZXJDb250ZXh0Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1JlbmRlckNvbnRleHQgeworIHB1YmxpYzoKKyAgQ1BERl9SZW5kZXJDb250ZXh0KCk7CiAKLSAgICBDUERGX1JlbmRlckNvbnRleHQoKTsKKyAgdm9pZCBDcmVhdGUoQ1BERl9QYWdlKiBwUGFnZSwgRlhfQk9PTCBiRmlyc3RMYXllciA9IFRSVUUpOwogCi0gICAgdm9pZAkJCUNyZWF0ZShDUERGX1BhZ2UqIHBQYWdlLCBGWF9CT09MIGJGaXJzdExheWVyID0gVFJVRSk7CisgIHZvaWQgQ3JlYXRlKENQREZfRG9jdW1lbnQqIHBEb2MgPSBOVUxMLAorICAgICAgICAgICAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcFBhZ2VDYWNoZSA9IE5VTEwsCisgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMgPSBOVUxMLAorICAgICAgICAgICAgICBGWF9CT09MIGJGaXJzdExheWVyID0gVFJVRSk7CiAKLSAgICB2b2lkCQkJQ3JlYXRlKENQREZfRG9jdW1lbnQqIHBEb2MgPSBOVUxMLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcFBhZ2VDYWNoZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzID0gTlVMTCwgRlhfQk9PTCBiRmlyc3RMYXllciA9IFRSVUUpOworICB+Q1BERl9SZW5kZXJDb250ZXh0KCk7CiAKLSAgICB+Q1BERl9SZW5kZXJDb250ZXh0KCk7CisgIHZvaWQgQ2xlYXIoKTsKIAotICAgIHZvaWQJCQlDbGVhcigpOworICB2b2lkIEFwcGVuZE9iamVjdExpc3QoQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSk7CiAKLSAgICB2b2lkCQkJQXBwZW5kT2JqZWN0TGlzdChDUERGX1BhZ2VPYmplY3RzKiBwT2JqcywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UpOworICB2b2lkIFJlbmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zID0gTlVMTCwKKyAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEZpbmFsTWF0cml4ID0gTlVMTCk7CiAKLSAgICB2b2lkCQkJUmVuZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEZpbmFsTWF0cml4ID0gTlVMTCk7CisgIHZvaWQgRHJhd09iamVjdExpc3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3RzKiBwT2JqcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKIAotICAgIHZvaWQJCQlEcmF3T2JqZWN0TGlzdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX1BhZ2VPYmplY3RzKiBwT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOworICB2b2lkIEdldEJhY2tncm91bmQoQ0ZYX0RJQml0bWFwKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBGaW5hbE1hdHJpeCk7CiAKLSAgICB2b2lkCQkJR2V0QmFja2dyb3VuZChDRlhfRElCaXRtYXAqIHBCdWZmZXIsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBDRlhfQWZmaW5lTWF0cml4KiBwRmluYWxNYXRyaXgpOworICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogR2V0UGFnZUNhY2hlKCkgY29uc3QgeyByZXR1cm4gbV9wUGFnZUNhY2hlOyB9CiAKLSAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSoJR2V0UGFnZUNhY2hlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYWdlQ2FjaGU7Ci0gICAgfQorICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKIAorICBDUERGX0RpY3Rpb25hcnkqIG1fcFBhZ2VSZXNvdXJjZXM7CiAKKyAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIG1fcFBhZ2VDYWNoZTsKIAotICAgIENQREZfRG9jdW1lbnQqCQkJbV9wRG9jdW1lbnQ7CisgcHJvdGVjdGVkOgorICBDRlhfQXJyYXlUZW1wbGF0ZTxzdHJ1Y3QgX1BERl9SZW5kZXJJdGVtPiBtX0NvbnRlbnRMaXN0OwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wUGFnZVJlc291cmNlczsKKyAgRlhfQk9PTCBtX2JGaXJzdExheWVyOwogCi0gICAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqCW1fcFBhZ2VDYWNoZTsKLQotcHJvdGVjdGVkOgotCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8c3RydWN0IF9QREZfUmVuZGVySXRlbT4JbV9Db250ZW50TGlzdDsKLQotICAgIEZYX0JPT0wJCQkJCW1fYkZpcnN0TGF5ZXI7Ci0KLSAgICB2b2lkCQkJUmVuZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcFN0b3BPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRmluYWxNYXRyaXgpOwotICAgIGZyaWVuZCBjbGFzcyBDUERGX1JlbmRlclN0YXR1czsKLSAgICBmcmllbmQgY2xhc3MgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOworICB2b2lkIFJlbmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTdG9wT2JqLAorICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRmluYWxNYXRyaXgpOworICBmcmllbmQgY2xhc3MgQ1BERl9SZW5kZXJTdGF0dXM7CisgIGZyaWVuZCBjbGFzcyBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI7CiB9OwotY2xhc3MgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIgeworIHB1YmxpYzoKKyAgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyKCk7CiAKLSAgICBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIoKTsKKyAgfkNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcigpOwogCi0gICAgfkNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcigpOworICB0eXBlZGVmIGVudW0geyBSZWFkeSwgVG9CZUNvbnRpbnVlZCwgRG9uZSwgRmFpbGVkIH0gUmVuZGVyU3RhdHVzOwogCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgUmVhZHksCi0gICAgICAgIFRvQmVDb250aW51ZWQsCi0gICAgICAgIERvbmUsCi0gICAgICAgIEZhaWxlZAotICAgIH0gUmVuZGVyU3RhdHVzOworICBSZW5kZXJTdGF0dXMgR2V0U3RhdHVzKCkgeyByZXR1cm4gbV9TdGF0dXM7IH0KIAotICAgIFJlbmRlclN0YXR1cwkJR2V0U3RhdHVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1N0YXR1czsKLSAgICB9CisgIHZvaWQgU3RhcnQoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgY2xhc3MgSUZYX1BhdXNlKiBwUGF1c2UsCisgICAgICAgICAgICAgRlhfQk9PTCBiRHJvcE9iamVjdHMgPSBGQUxTRSk7CiAKKyAgdm9pZCBDb250aW51ZShjbGFzcyBJRlhfUGF1c2UqIHBQYXVzZSk7CiAKKyAgaW50IEVzdGltYXRlUHJvZ3Jlc3MoKTsKIAotICAgIHZvaWQJCQkJU3RhcnQoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIGNsYXNzIElGWF9QYXVzZSogcFBhdXNlLCBGWF9CT09MIGJEcm9wT2JqZWN0cyA9IEZBTFNFKTsKKyAgdm9pZCBDbGVhcigpOwogCi0gICAgdm9pZAkJCQlDb250aW51ZShjbGFzcyBJRlhfUGF1c2UqIHBQYXVzZSk7CisgcHJvdGVjdGVkOgorICBSZW5kZXJTdGF0dXMgbV9TdGF0dXM7CiAKKyAgQ1BERl9SZW5kZXJDb250ZXh0KiBtX3BDb250ZXh0OwogCi0gICAgaW50CQkJCQlFc3RpbWF0ZVByb2dyZXNzKCk7CisgIENGWF9SZW5kZXJEZXZpY2UqIG1fcERldmljZTsKIAotICAgIHZvaWQJCQkJQ2xlYXIoKTsKLXByb3RlY3RlZDoKKyAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBtX3BPcHRpb25zOwogCi0gICAgUmVuZGVyU3RhdHVzCQltX1N0YXR1czsKKyAgRlhfQk9PTCBtX2JEcm9wT2JqZWN0czsKIAotICAgIENQREZfUmVuZGVyQ29udGV4dCoJbV9wQ29udGV4dDsKKyAgY2xhc3MgQ1BERl9SZW5kZXJTdGF0dXMqIG1fcFJlbmRlcmVyOwogCi0gICAgQ0ZYX1JlbmRlckRldmljZSoJbV9wRGV2aWNlOworICBDRlhfRmxvYXRSZWN0IG1fQ2xpcFJlY3Q7CiAKLSAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqCW1fcE9wdGlvbnM7CisgIEZYX0RXT1JEIG1fTGF5ZXJJbmRleDsKIAotICAgIEZYX0JPT0wJCQkJbV9iRHJvcE9iamVjdHM7CisgIEZYX0RXT1JEIG1fT2JqZWN0SW5kZXg7CiAKLSAgICBjbGFzcyBDUERGX1JlbmRlclN0YXR1cyoJbV9wUmVuZGVyZXI7CisgIEZYX1BPU0lUSU9OIG1fT2JqZWN0UG9zOwogCi0gICAgQ0ZYX0Zsb2F0UmVjdAkJbV9DbGlwUmVjdDsKKyAgRlhfUE9TSVRJT04gbV9QcmV2TGFzdFBvczsKIAotICAgIEZYX0RXT1JECQkJbV9MYXllckluZGV4OwotCi0gICAgRlhfRFdPUkQJCQltX09iamVjdEluZGV4OwotCi0gICAgRlhfUE9TSVRJT04JCQltX09iamVjdFBvczsKLQotICAgIEZYX1BPU0lUSU9OCQkJbV9QcmV2TGFzdFBvczsKLQotICAgIHZvaWQJCQkJUmVuZGVyU3RlcCgpOworICB2b2lkIFJlbmRlclN0ZXAoKTsKIH07Ci1jbGFzcyBDUERGX1RleHRSZW5kZXJlcgotewotcHVibGljOgorY2xhc3MgQ1BERl9UZXh0UmVuZGVyZXIgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgRHJhd1RleHRTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYik7CiAKLSAgICBzdGF0aWMgdm9pZAkJRHJhd1RleHRTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IGxlZnQsIGludCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYik7CisgIHN0YXRpYyB2b2lkIERyYXdUZXh0U3RyaW5nKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG9yaWdpbl94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBvcmlnaW5feSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIHN0cm9rZV9hcmdiID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMKTsKIAotICAgIHN0YXRpYyB2b2lkCQlEcmF3VGV4dFN0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9GTE9BVCBvcmlnaW5feCwgRlhfRkxPQVQgb3JpZ2luX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBzdHJva2VfYXJnYiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zID0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgIHN0YXRpYyBGWF9CT09MIERyYXdUZXh0UGF0aChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwQ2hhckNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MlVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIHN0cm9rZV9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GbGFnID0gMCk7CiAKLSAgICBzdGF0aWMgRlhfQk9PTAlEcmF3VGV4dFBhdGgoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MlVzZXIsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwgRlhfQVJHQiBzdHJva2VfYXJnYiwgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoLCBpbnQgbkZsYWcgPSAwKTsKKyAgc3RhdGljIEZYX0JPT0wgRHJhd05vcm1hbFRleHQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBDaGFyQ29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKIAotICAgIHN0YXRpYyBGWF9CT09MCURyYXdOb3JtYWxUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7Ci0KLSAgICBzdGF0aWMgRlhfQk9PTAlEcmF3VHlwZTNUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IpOworICBzdGF0aWMgRlhfQk9PTCBEcmF3VHlwZTNUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcENoYXJDb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiKTsKIH07Ci1jbGFzcyBDUERGX1BhZ2VSZW5kZXJDYWNoZQotewotcHVibGljOgotICAgIENQREZfUGFnZVJlbmRlckNhY2hlKENQREZfUGFnZSogcFBhZ2UpCi0gICAgewotICAgICAgICBtX3BQYWdlID0gcFBhZ2U7Ci0gICAgICAgIG1fblRpbWVDb3VudCA9IDA7Ci0gICAgICAgIG1fbkNhY2hlU2l6ZSA9IDA7Ci0gICAgICAgIG1fcEN1ckltYWdlQ2FjaGUgPSBOVUxMOwotICAgICAgICBtX2JDdXJGaW5kQ2FjaGUgPSBGQUxTRTsKLSAgICAgICAgbV9wQ3VySW1hZ2VDYWNoZXMgPSBOVUxMOwotICAgIH0KLSAgICB+Q1BERl9QYWdlUmVuZGVyQ2FjaGUoKQotICAgIHsKLSAgICAgICAgQ2xlYXJBbGwoKTsKLSAgICB9Ci0gICAgdm9pZAkJCQlDbGVhckFsbCgpOwotICAgIHZvaWQJCQkJQ2xlYXJJbWFnZURhdGEoKTsKK2NsYXNzIENQREZfUGFnZVJlbmRlckNhY2hlIHsKKyBwdWJsaWM6CisgIENQREZfUGFnZVJlbmRlckNhY2hlKENQREZfUGFnZSogcFBhZ2UpIHsKKyAgICBtX3BQYWdlID0gcFBhZ2U7CisgICAgbV9uVGltZUNvdW50ID0gMDsKKyAgICBtX25DYWNoZVNpemUgPSAwOworICAgIG1fcEN1ckltYWdlQ2FjaGUgPSBOVUxMOworICAgIG1fYkN1ckZpbmRDYWNoZSA9IEZBTFNFOworICAgIG1fcEN1ckltYWdlQ2FjaGVzID0gTlVMTDsKKyAgfQorICB+Q1BERl9QYWdlUmVuZGVyQ2FjaGUoKSB7IENsZWFyQWxsKCk7IH0KKyAgdm9pZCBDbGVhckFsbCgpOworICB2b2lkIENsZWFySW1hZ2VEYXRhKCk7CiAKLSAgICBGWF9EV09SRAkJCUVzdGltYXRlU2l6ZSgpOwotICAgIHZvaWQJCQkJQ2FjaGVPcHRpbWl6YXRpb24oaW50MzJfdCBkd0xpbWl0Q2FjaGVTaXplKTsKLSAgICBGWF9EV09SRAkJCUdldENhY2hlZFNpemUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pIGNvbnN0OwotICAgIEZYX0RXT1JECQkJR2V0VGltZUNvdW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25UaW1lQ291bnQ7Ci0gICAgfQotICAgIHZvaWQJCQkJU2V0VGltZUNvdW50KEZYX0RXT1JEIGR3VGltZUNvdW50KQotICAgIHsKLSAgICAgICAgbV9uVGltZUNvdW50ID0gZHdUaW1lQ291bnQ7Ci0gICAgfQorICBGWF9EV09SRCBFc3RpbWF0ZVNpemUoKTsKKyAgdm9pZCBDYWNoZU9wdGltaXphdGlvbihpbnQzMl90IGR3TGltaXRDYWNoZVNpemUpOworICBGWF9EV09SRCBHZXRDYWNoZWRTaXplKENQREZfU3RyZWFtKiBwU3RyZWFtKSBjb25zdDsKKyAgRlhfRFdPUkQgR2V0VGltZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9uVGltZUNvdW50OyB9CisgIHZvaWQgU2V0VGltZUNvdW50KEZYX0RXT1JEIGR3VGltZUNvdW50KSB7IG1fblRpbWVDb3VudCA9IGR3VGltZUNvdW50OyB9CiAKLSAgICB2b2lkCQkJCUdldENhY2hlZEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgQ0ZYX0RJQlNvdXJjZSomIHBCaXRtYXAsIENGWF9ESUJTb3VyY2UqJiBwTWFzaywgRlhfRFdPUkQmIE1hdHRlQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwgaW50MzJfdCBkb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKKyAgdm9pZCBHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCU291cmNlKiYgcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlV2lkdGggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKIAotICAgIHZvaWQJCQkJUmVzZXRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCk7Ci0gICAgdm9pZAkJCQlDbGVhckltYWdlQ2FjaGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pOwotICAgIENQREZfUGFnZSoJCQlHZXRQYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYWdlOwotICAgIH0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCW1fSW1hZ2VDYWNoZXM7Ci1wdWJsaWM6Ci0gICAgRlhfQk9PTAkJCQlTdGFydEdldENhY2hlZEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAotICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLAotICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKKyAgdm9pZCBSZXNldEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsKKyAgdm9pZCBDbGVhckltYWdlQ2FjaGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pOworICBDUERGX1BhZ2UqIEdldFBhZ2UoKSB7IHJldHVybiBtX3BQYWdlOyB9CisgIENGWF9NYXBQdHJUb1B0ciBtX0ltYWdlQ2FjaGVzOwogCi0gICAgRlhfQk9PTAkJCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgQ1BERl9JbWFnZUNhY2hlKgltX3BDdXJJbWFnZUNhY2hlOwotICAgIENGWF9QdHJBcnJheSogICAgICAgbV9wQ3VySW1hZ2VDYWNoZXM7Ci1wcm90ZWN0ZWQ6Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX1BhZ2U7Ci0gICAgQ1BERl9QYWdlKgkJCW1fcFBhZ2U7CisgcHVibGljOgorICBGWF9CT09MIFN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKIAotICAgIEZYX0RXT1JECQkJbV9uVGltZUNvdW50OwotICAgIEZYX0RXT1JECQkJbV9uQ2FjaGVTaXplOwotICAgIEZYX0JPT0wJCQkJbV9iQ3VyRmluZENhY2hlOworICBGWF9CT09MIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgQ1BERl9JbWFnZUNhY2hlKiBtX3BDdXJJbWFnZUNhY2hlOworICBDRlhfUHRyQXJyYXkqIG1fcEN1ckltYWdlQ2FjaGVzOworCisgcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQ1BERl9QYWdlOworICBDUERGX1BhZ2UqIG1fcFBhZ2U7CisKKyAgRlhfRFdPUkQgbV9uVGltZUNvdW50OworICBGWF9EV09SRCBtX25DYWNoZVNpemU7CisgIEZYX0JPT0wgbV9iQ3VyRmluZENhY2hlOwogfTsKLWNsYXNzIENQREZfUmVuZGVyQ29uZmlnCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9SZW5kZXJDb25maWcoKTsKLSAgICB+Q1BERl9SZW5kZXJDb25maWcoKTsKLSAgICBpbnQJCQkJCW1fSGFsZnRvbmVMaW1pdDsKLSAgICBpbnQJCQkJCW1fUmVuZGVyU3RlcExpbWl0OworY2xhc3MgQ1BERl9SZW5kZXJDb25maWcgeworIHB1YmxpYzoKKyAgQ1BERl9SZW5kZXJDb25maWcoKTsKKyAgfkNQREZfUmVuZGVyQ29uZmlnKCk7CisgIGludCBtX0hhbGZ0b25lTGltaXQ7CisgIGludCBtX1JlbmRlclN0ZXBMaW1pdDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9SRU5ERVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVzb3VyY2UuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVzb3VyY2UuaAppbmRleCA1YzhjYzg1Li5jNDFhMzA2IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oCkBAIC01MSw5MTEgKzUxLDc5MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyogcENoYXJOYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJjb2RlKTsKIAotdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIENQREZfQ291bnRlZE9iamVjdAotewotcHVibGljOgotICAgIGV4cGxpY2l0IENQREZfQ291bnRlZE9iamVjdChUKiBwdHIpIDogbV9uQ291bnQoMSksIG1fcE9iaihwdHIpIHsgfQotICAgIHZvaWQgcmVzZXQoVCogcHRyKSB7ICAvLyBDQVVUSU9OOiB0b3NzZXMgcHJpb3IgcmVmIGNvdW50cy4KLSAgICAgICAgbV9uQ291bnQgPSAxOwotICAgICAgICBtX3BPYmogPSBwdHI7Ci0gICAgfQotICAgIHZvaWQgY2xlYXIoKSB7ICAvLyBOb3cgeW91J3JlIGFsbCB3ZWFrIHB0cnMgLi4uCi0gICAgICAgIGRlbGV0ZSBtX3BPYmo7Ci0gICAgICAgIG1fcE9iaiA9IG51bGxwdHI7Ci0gICAgfQotICAgIFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iajsgfQotICAgIFQqIEFkZFJlZigpIHsgRlhTWVNfYXNzZXJ0KG1fcE9iaik7ICsrbV9uQ291bnQ7IHJldHVybiBtX3BPYmo7IH0KLSAgICB2b2lkIFJlbW92ZVJlZigpIHsgaWYgKG1fbkNvdW50KSAtLW1fbkNvdW50OyB9Ci0gICAgc2l6ZV90IHVzZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fbkNvdW50OyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIENQREZfQ291bnRlZE9iamVjdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX0NvdW50ZWRPYmplY3QoVCogcHRyKSA6IG1fbkNvdW50KDEpLCBtX3BPYmoocHRyKSB7fQorICB2b2lkIHJlc2V0KFQqIHB0cikgeyAgLy8gQ0FVVElPTjogdG9zc2VzIHByaW9yIHJlZiBjb3VudHMuCisgICAgbV9uQ291bnQgPSAxOworICAgIG1fcE9iaiA9IHB0cjsKKyAgfQorICB2b2lkIGNsZWFyKCkgeyAgLy8gTm93IHlvdSdyZSBhbGwgd2VhayBwdHJzIC4uLgorICAgIGRlbGV0ZSBtX3BPYmo7CisgICAgbV9wT2JqID0gbnVsbHB0cjsKKyAgfQorICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiBtX3BPYmo7IH0KKyAgVCogQWRkUmVmKCkgeworICAgIEZYU1lTX2Fzc2VydChtX3BPYmopOworICAgICsrbV9uQ291bnQ7CisgICAgcmV0dXJuIG1fcE9iajsKKyAgfQorICB2b2lkIFJlbW92ZVJlZigpIHsKKyAgICBpZiAobV9uQ291bnQpCisgICAgICAtLW1fbkNvdW50OworICB9CisgIHNpemVfdCB1c2VfY291bnQoKSBjb25zdCB7IHJldHVybiBtX25Db3VudDsgfQogCi1wcm90ZWN0ZWQ6Ci0gICAgc2l6ZV90IG1fbkNvdW50OwotICAgIFQqIG1fcE9iajsKKyBwcm90ZWN0ZWQ6CisgIHNpemVfdCBtX25Db3VudDsKKyAgVCogbV9wT2JqOwogfTsKIHVzaW5nIENQREZfQ291bnRlZENvbG9yU3BhY2UgPSBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9Db2xvclNwYWNlPjsKIHVzaW5nIENQREZfQ291bnRlZFBhdHRlcm4gPSBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9QYXR0ZXJuPjsKLSNkZWZpbmUgUERGRk9OVF9UWVBFMQkJCTEKLSNkZWZpbmUgUERGRk9OVF9UUlVFVFlQRQkJMgotI2RlZmluZSBQREZGT05UX1RZUEUzCQkJMwotI2RlZmluZSBQREZGT05UX0NJREZPTlQJCQk0Ci0jZGVmaW5lIFBERkZPTlRfRklYRURQSVRDSAkJMQotI2RlZmluZSBQREZGT05UX1NFUklGCQkJMgotI2RlZmluZSBQREZGT05UX1NZTUJPTElDCQk0Ci0jZGVmaW5lIFBERkZPTlRfU0NSSVBUCQkJOAotI2RlZmluZSBQREZGT05UX05PTlNZTUJPTElDCQkzMgotI2RlZmluZSBQREZGT05UX0lUQUxJQwkJCTY0Ci0jZGVmaW5lIFBERkZPTlRfQUxMQ0FQCQkJMHgxMDAwMAotI2RlZmluZSBQREZGT05UX1NNQUxMQ0FQCQkweDIwMDAwCi0jZGVmaW5lIFBERkZPTlRfRk9SQ0VCT0xECQkweDQwMDAwCi0jZGVmaW5lIFBERkZPTlRfVVNFRVhURVJOQVRUUgkweDgwMDAwCi1jbGFzcyBDUERGX0ZvbnQKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgQ1BERl9Gb250KgkJQ3JlYXRlRm9udEYoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpOwotICAgIHN0YXRpYyBDUERGX0ZvbnQqCQlHZXRTdG9ja0ZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmb250bmFtZSk7CisjZGVmaW5lIFBERkZPTlRfVFlQRTEgMQorI2RlZmluZSBQREZGT05UX1RSVUVUWVBFIDIKKyNkZWZpbmUgUERGRk9OVF9UWVBFMyAzCisjZGVmaW5lIFBERkZPTlRfQ0lERk9OVCA0CisjZGVmaW5lIFBERkZPTlRfRklYRURQSVRDSCAxCisjZGVmaW5lIFBERkZPTlRfU0VSSUYgMgorI2RlZmluZSBQREZGT05UX1NZTUJPTElDIDQKKyNkZWZpbmUgUERGRk9OVF9TQ1JJUFQgOAorI2RlZmluZSBQREZGT05UX05PTlNZTUJPTElDIDMyCisjZGVmaW5lIFBERkZPTlRfSVRBTElDIDY0CisjZGVmaW5lIFBERkZPTlRfQUxMQ0FQIDB4MTAwMDAKKyNkZWZpbmUgUERGRk9OVF9TTUFMTENBUCAweDIwMDAwCisjZGVmaW5lIFBERkZPTlRfRk9SQ0VCT0xEIDB4NDAwMDAKKyNkZWZpbmUgUERGRk9OVF9VU0VFWFRFUk5BVFRSIDB4ODAwMDAKK2NsYXNzIENQREZfRm9udCB7CisgcHVibGljOgorICBzdGF0aWMgQ1BERl9Gb250KiBDcmVhdGVGb250RihDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCk7CisgIHN0YXRpYyBDUERGX0ZvbnQqIEdldFN0b2NrRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmb250bmFtZSk7CiAKLSAgICB2aXJ0dWFsIH5DUERGX0ZvbnQoKTsKKyAgdmlydHVhbCB+Q1BERl9Gb250KCk7CiAKLSAgICBib29sIElzRm9udFR5cGUoaW50IGZvbnR0eXBlKSBjb25zdCB7IHJldHVybiBmb250dHlwZSA9PSBtX0ZvbnRUeXBlOyB9Ci0gICAgaW50CUdldEZvbnRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9Gb250VHlwZTsgIH0KKyAgYm9vbCBJc0ZvbnRUeXBlKGludCBmb250dHlwZSkgY29uc3QgeyByZXR1cm4gZm9udHR5cGUgPT0gbV9Gb250VHlwZTsgfQorICBpbnQgR2V0Rm9udFR5cGUoKSBjb25zdCB7IHJldHVybiBtX0ZvbnRUeXBlOyB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCUdldEZvbnRUeXBlTmFtZSgpIGNvbnN0OworICBDRlhfQnl0ZVN0cmluZyBHZXRGb250VHlwZU5hbWUoKSBjb25zdDsKIAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJglHZXRCYXNlRm9udCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9CYXNlRm9udDsKKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIEdldEJhc2VGb250KCkgY29uc3QgeyByZXR1cm4gbV9CYXNlRm9udDsgfQorCisgIGNvbnN0IENGWF9TdWJzdEZvbnQqIEdldFN1YnN0Rm9udCgpIGNvbnN0IHsgcmV0dXJuIG1fRm9udC5HZXRTdWJzdEZvbnQoKTsgfQorCisgIEZYX0RXT1JEIEdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbV9GbGFnczsgfQorCisgIHZpcnR1YWwgRlhfQk9PTCBJc1ZlcnRXcml0aW5nKCkgY29uc3Q7CisKKyAgQ1BERl9UeXBlMUZvbnQqIEdldFR5cGUxRm9udCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9Gb250VHlwZSA9PSBQREZGT05UX1RZUEUxID8gKENQREZfVHlwZTFGb250Kikodm9pZCopdGhpcyA6IE5VTEw7CisgIH0KKworICBDUERGX1RydWVUeXBlRm9udCogR2V0VHJ1ZVR5cGVGb250KCkgY29uc3QgeworICAgIHJldHVybiBtX0ZvbnRUeXBlID09IFBERkZPTlRfVFJVRVRZUEUgPyAoQ1BERl9UcnVlVHlwZUZvbnQqKSh2b2lkKil0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgIH0KKworICBDUERGX0NJREZvbnQqIEdldENJREZvbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIChtX0ZvbnRUeXBlID09IFBERkZPTlRfQ0lERk9OVCkgPyAoQ1BERl9DSURGb250Kikodm9pZCopdGhpcyA6IE5VTEw7CisgIH0KKworICBDUERGX1R5cGUzRm9udCogR2V0VHlwZTNGb250KCkgY29uc3QgeworICAgIHJldHVybiAobV9Gb250VHlwZSA9PSBQREZGT05UX1RZUEUzKSA/IChDUERGX1R5cGUzRm9udCopKHZvaWQqKXRoaXMgOiBOVUxMOworICB9CisKKyAgRlhfQk9PTCBJc0VtYmVkZGVkKCkgY29uc3QgeworICAgIHJldHVybiBtX0ZvbnRUeXBlID09IFBERkZPTlRfVFlQRTMgfHwgbV9wRm9udEZpbGUgIT0gTlVMTDsKKyAgfQorCisgIHZpcnR1YWwgRlhfQk9PTCBJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QgeyByZXR1cm4gRkFMU0U7IH0KKworICBDUERGX1N0cmVhbUFjYyogR2V0Rm9udEZpbGUoKSBjb25zdCB7IHJldHVybiBtX3BGb250RmlsZTsgfQorCisgIENQREZfRGljdGlvbmFyeSogR2V0Rm9udERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BGb250RGljdDsgfQorCisgIEZYX0JPT0wgSXNTdGFuZGFyZEZvbnQoKSBjb25zdDsKKworICBGWEZUX0ZhY2UgR2V0RmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fRm9udC5HZXRGYWNlKCk7IH0KKworICB2aXJ0dWFsIEZYX0RXT1JEIEdldE5leHRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdHJMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBvZmZzZXQpIGNvbnN0IHsKKyAgICBpZiAob2Zmc2V0IDwgMCB8fCBuU3RyTGVuIDwgMSkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIHVpbnQ4X3QgY2ggPSBvZmZzZXQgPCBuU3RyTGVuID8gcFN0cmluZ1tvZmZzZXQrK10gOiBwU3RyaW5nW25TdHJMZW4gLSAxXTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfRFdPUkQ+KGNoKTsKKyAgfQogCi0gICAgY29uc3QgQ0ZYX1N1YnN0Rm9udCoJR2V0U3Vic3RGb250KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0ZvbnQuR2V0U3Vic3RGb250KCk7Ci0gICAgfQorICB2aXJ0dWFsIGludCBDb3VudENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywgaW50IHNpemUpIGNvbnN0IHsgcmV0dXJuIHNpemU7IH0KIAotICAgIEZYX0RXT1JECQkJCUdldEZsYWdzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0ZsYWdzOwotICAgIH0KKyAgdm9pZCBBcHBlbmRDaGFyKENGWF9CeXRlU3RyaW5nJiBzdHIsIEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzVmVydFdyaXRpbmcoKWNvbnN0OworICB2aXJ0dWFsIGludCBBcHBlbmRDaGFyKEZYX0NIQVIqIGJ1ZiwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsKKyAgICAqYnVmID0gKEZYX0NIQVIpY2hhcmNvZGU7CisgICAgcmV0dXJuIDE7CisgIH0KIAorICB2aXJ0dWFsIGludCBHZXRDaGFyU2l6ZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QgeyByZXR1cm4gMTsgfQogCisgIHZpcnR1YWwgaW50IEdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MKiBwVmVydEdseXBoID0gTlVMTCkgPSAwOworICB2aXJ0dWFsIGludCBHbHlwaEZyb21DaGFyQ29kZUV4dChGWF9EV09SRCBjaGFyY29kZSkgeworICAgIHJldHVybiBHbHlwaEZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgIH0KIAorICBDRlhfV2lkZVN0cmluZyBVbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKIAotICAgIENQREZfVHlwZTFGb250KgkJCUdldFR5cGUxRm9udCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Gb250VHlwZSA9PSBQREZGT05UX1RZUEUxID8gKENQREZfVHlwZTFGb250Kikodm9pZCopdGhpcyA6IE5VTEw7Ci0gICAgfQorICBGWF9EV09SRCBDaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIFVuaWNvZGUpIGNvbnN0OwogCi0gICAgQ1BERl9UcnVlVHlwZUZvbnQqCQlHZXRUcnVlVHlwZUZvbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fRm9udFR5cGUgPT0gUERGRk9OVF9UUlVFVFlQRSA/IChDUERGX1RydWVUeXBlRm9udCopKHZvaWQqKXRoaXMgOiBOVUxMOwotICAgIH0KKyAgQ0ZYX0NoYXJNYXAqIEdldENoYXJNYXAoKSB7IHJldHVybiBtX3BDaGFyTWFwOyB9CiAKLSAgICBDUERGX0NJREZvbnQqCQkJR2V0Q0lERm9udCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKG1fRm9udFR5cGUgPT0gUERGRk9OVF9DSURGT05UKSA/IChDUERGX0NJREZvbnQqKSh2b2lkKil0aGlzIDogTlVMTDsKLSAgICB9CisgIENGWF9CeXRlU3RyaW5nIEVuY29kZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSBjb25zdDsKIAotICAgIENQREZfVHlwZTNGb250KgkJCUdldFR5cGUzRm9udCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKG1fRm9udFR5cGUgPT0gUERGRk9OVF9UWVBFMykgPyAoQ1BERl9UeXBlM0ZvbnQqKSh2b2lkKil0aGlzIDogTlVMTDsKLSAgICB9CisgIENGWF9XaWRlU3RyaW5nIERlY29kZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSBjb25zdDsKIAorICB2b2lkIEdldEZvbnRCQm94KEZYX1JFQ1QmIHJlY3QpIGNvbnN0IHsgcmVjdCA9IG1fRm9udEJCb3g7IH0KIAotICAgIEZYX0JPT0wJCQkJCUlzRW1iZWRkZWQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fRm9udFR5cGUgPT0gUERGRk9OVF9UWVBFMyB8fCBtX3BGb250RmlsZSAhPSBOVUxMOwotICAgIH0KKyAgaW50IEdldFR5cGVBc2NlbnQoKSBjb25zdCB7IHJldHVybiBtX0FzY2VudDsgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorICBpbnQgR2V0VHlwZURlc2NlbnQoKSBjb25zdCB7IHJldHVybiBtX0Rlc2NlbnQ7IH0KIAotICAgIENQREZfU3RyZWFtQWNjKgkJCUdldEZvbnRGaWxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BGb250RmlsZTsKLSAgICB9CisgIGludCBHZXRJdGFsaWNBbmdsZSgpIGNvbnN0IHsgcmV0dXJuIG1fSXRhbGljQW5nbGU7IH0KIAotICAgIENQREZfRGljdGlvbmFyeSoJCUdldEZvbnREaWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BGb250RGljdDsKLSAgICB9CisgIGludCBHZXRTdGVtVigpIGNvbnN0IHsgcmV0dXJuIG1fU3RlbVY7IH0KIAotICAgIEZYX0JPT0wJCQkJCUlzU3RhbmRhcmRGb250KCkgY29uc3Q7CisgIGludCBHZXRTdHJpbmdXaWR0aChjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgc2l6ZSk7CiAKLSAgICBGWEZUX0ZhY2UJCQkJR2V0RmFjZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Gb250LkdldEZhY2UoKTsKLSAgICB9CisgIHZpcnR1YWwgaW50IEdldENoYXJXaWR0aEYoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBsZXZlbCA9IDApID0gMDsKIAotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldE5leHRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBuU3RyTGVuLCBpbnQmIG9mZnNldCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG5TdHJMZW4gPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGNoID0gb2Zmc2V0IDwgblN0ckxlbiA/IHBTdHJpbmdbb2Zmc2V0KytdIDogcFN0cmluZ1tuU3RyTGVuLTFdOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfRFdPUkQ+KGNoKTsKLSAgICB9CisgIHZpcnR1YWwgaW50IEdldENoYXJUeXBlV2lkdGgoRlhfRFdPUkQgY2hhcmNvZGUpOwogCi0gICAgdmlydHVhbCBpbnQJCQkJQ291bnRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBzaXplKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQorICB2aXJ0dWFsIHZvaWQgR2V0Q2hhckJCb3goRlhfRFdPUkQgY2hhcmNvZGUsIEZYX1JFQ1QmIHJlY3QsIGludCBsZXZlbCA9IDApID0gMDsKIAotICAgIHZvaWQJCQkJCUFwcGVuZENoYXIoQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OworICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKIAotICAgIHZpcnR1YWwgaW50CQkJCUFwcGVuZENoYXIoRlhfQ0hBUiogYnVmLCBGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKLSAgICB7Ci0gICAgICAgICpidWYgPSAoRlhfQ0hBUiljaGFyY29kZTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQorICBjbGFzcyBDRlhfUGF0aERhdGEqIExvYWRHbHlwaFBhdGgoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBkZXN0X3dpZHRoID0gMCk7CiAKLSAgICB2aXJ0dWFsIGludAkJCQlHZXRDaGFyU2l6ZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KKyAgQ0ZYX0ZvbnQgbV9Gb250OwogCisgcHJvdGVjdGVkOgorICBleHBsaWNpdCBDUERGX0ZvbnQoaW50IGZvbnR0eXBlKTsKIAorICBGWF9CT09MIEluaXRpYWxpemUoKTsKIAorICBGWF9CT09MIExvYWQoKTsKIAotICAgIHZpcnR1YWwgaW50CQkJCUdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9CT09MICpwVmVydEdseXBoID0gTlVMTCkgPSAwOwotICAgIHZpcnR1YWwgaW50CQkJCUdseXBoRnJvbUNoYXJDb2RlRXh0KEZYX0RXT1JEIGNoYXJjb2RlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICB9CisgIHZpcnR1YWwgRlhfQk9PTCBfTG9hZCgpID0gMDsKIAotICAgIENGWF9XaWRlU3RyaW5nCQkJVW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7CisgIHZpcnR1YWwgRlhfV0NIQVIgX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0ID0gMDsKIAotICAgIEZYX0RXT1JECQkJCUNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3Q7Ci0KLSAgICBDRlhfQ2hhck1hcCoJCQlHZXRDaGFyTWFwKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BDaGFyTWFwOwotICAgIH0KLQotICAgIENGWF9CeXRlU3RyaW5nCQkJRW5jb2RlU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIGNvbnN0OwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlEZWNvZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgY29uc3Q7Ci0KLQotCi0KLSAgICB2b2lkCQkJCQlHZXRGb250QkJveChGWF9SRUNUJiByZWN0KSBjb25zdAotICAgIHsKLSAgICAgICAgcmVjdCA9IG1fRm9udEJCb3g7Ci0gICAgfQotCi0gICAgaW50CQkJCQkJR2V0VHlwZUFzY2VudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Bc2NlbnQ7Ci0gICAgfQotCi0gICAgaW50CQkJCQkJR2V0VHlwZURlc2NlbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fRGVzY2VudDsKLSAgICB9Ci0KLSAgICBpbnQJCQkJCQlHZXRJdGFsaWNBbmdsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9JdGFsaWNBbmdsZTsKLSAgICB9Ci0KLSAgICBpbnQJCQkJCQlHZXRTdGVtVigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9TdGVtVjsKLSAgICB9Ci0KLSAgICBpbnQJCQkJCQlHZXRTdHJpbmdXaWR0aChjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIGludAkJCQlHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludAkJCQlHZXRDaGFyVHlwZVdpZHRoKEZYX0RXT1JEIGNoYXJjb2RlKTsKLQotICAgIHZpcnR1YWwgdm9pZAkJCUdldENoYXJCQm94KEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9SRUNUJiByZWN0LCBpbnQgbGV2ZWwgPSAwKSA9IDA7Ci0KLQotCi0gICAgQ1BERl9Eb2N1bWVudCoJCQltX3BEb2N1bWVudDsKLQotICAgIGNsYXNzIENGWF9QYXRoRGF0YSoJCUxvYWRHbHlwaFBhdGgoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBkZXN0X3dpZHRoID0gMCk7Ci0KLSAgICBDRlhfRm9udAkJCQltX0ZvbnQ7Ci0KLXByb3RlY3RlZDoKLSAgICBleHBsaWNpdCBDUERGX0ZvbnQoaW50IGZvbnR0eXBlKTsKLQotICAgIEZYX0JPT0wJCQkJCUluaXRpYWxpemUoKTsKLQotICAgIEZYX0JPT0wJCQkJCUxvYWQoKTsKLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCV9Mb2FkKCkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9XQ0hBUgkJX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCV9DaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIFVuaWNvZGUpIGNvbnN0ID0gMDsKLQotICAgIHZvaWQJCQkJCUxvYWRVbmljb2RlTWFwKCk7Ci0KLSAgICB2b2lkCQkJCQlMb2FkUERGRW5jb2RpbmcoQ1BERl9PYmplY3QqIHBFbmNvZGluZywgaW50JiBpQmFzZUVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyomIHBDaGFyTmFtZXMsIEZYX0JPT0wgYkVtYmVkZGVkLCBGWF9CT09MIGJUcnVlVHlwZSk7Ci0KLSAgICB2b2lkCQkJCQlMb2FkRm9udERlc2NyaXB0b3IoQ1BERl9EaWN0aW9uYXJ5Kik7Ci0KLSAgICB2b2lkCQkJCQlMb2FkQ2hhcldpZHRocyhGWF9XT1JEKiBwV2lkdGhzKTsKLQotICAgIHZvaWQJCQkJCUNoZWNrRm9udE1ldHJpY3MoKTsKKyAgdmlydHVhbCBGWF9EV09SRCBfQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdCA9IDA7CiAKLSAgICBDRlhfQ2hhck1hcCoJCQltX3BDaGFyTWFwOworICB2b2lkIExvYWRVbmljb2RlTWFwKCk7CiAKKyAgdm9pZCBMb2FkUERGRW5jb2RpbmcoQ1BERl9PYmplY3QqIHBFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpQmFzZUVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyomIHBDaGFyTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVtYmVkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcnVlVHlwZSk7CiAKKyAgdm9pZCBMb2FkRm9udERlc2NyaXB0b3IoQ1BERl9EaWN0aW9uYXJ5Kik7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCW1fQmFzZUZvbnQ7CisgIHZvaWQgTG9hZENoYXJXaWR0aHMoRlhfV09SRCogcFdpZHRocyk7CiAKLSAgICBDUERGX1N0cmVhbUFjYyoJCQltX3BGb250RmlsZTsKKyAgdm9pZCBDaGVja0ZvbnRNZXRyaWNzKCk7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BGb250RGljdDsKKyAgQ0ZYX0NoYXJNYXAqIG1fcENoYXJNYXA7CiAKLSAgICBDUERGX1RvVW5pY29kZU1hcCoJCW1fcFRvVW5pY29kZU1hcDsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9CYXNlRm9udDsKIAotICAgIEZYX0JPT0wJCQkJCW1fYlRvVW5pY29kZUxvYWRlZDsKKyAgQ1BERl9TdHJlYW1BY2MqIG1fcEZvbnRGaWxlOwogCisgIENQREZfRGljdGlvbmFyeSogbV9wRm9udERpY3Q7CiAKKyAgQ1BERl9Ub1VuaWNvZGVNYXAqIG1fcFRvVW5pY29kZU1hcDsKIAorICBGWF9CT09MIG1fYlRvVW5pY29kZUxvYWRlZDsKIAotICAgIGludAkJCQkJCW1fRmxhZ3M7CisgIGludCBtX0ZsYWdzOwogCi0gICAgRlhfUkVDVAkJCQkJbV9Gb250QkJveDsKKyAgRlhfUkVDVCBtX0ZvbnRCQm94OwogCi0gICAgaW50CQkJCQkJbV9TdGVtVjsKKyAgaW50IG1fU3RlbVY7CiAKLSAgICBpbnQJCQkJCQltX0FzY2VudDsKKyAgaW50IG1fQXNjZW50OwogCi0gICAgaW50CQkJCQkJbV9EZXNjZW50OworICBpbnQgbV9EZXNjZW50OwogCi0gICAgaW50CQkJCQkJbV9JdGFsaWNBbmdsZTsKKyAgaW50IG1fSXRhbGljQW5nbGU7CiAKLXByaXZhdGU6Ci0gICAgY29uc3QgaW50CQkJCW1fRm9udFR5cGU7CisgcHJpdmF0ZToKKyAgY29uc3QgaW50IG1fRm9udFR5cGU7CiB9OwotI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX0JVSUxUSU4JCTAKLSNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19XSU5BTlNJCQkxCi0jZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4JCTIKLSNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19NQUNFWFBFUlQJCTMKLSNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19TVEFOREFSRAkJNAotI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX0FET0JFX1NZTUJPTAk1Ci0jZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTCTYKLSNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19QREZET0MJCQk3Ci0jZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfTVNfU1lNQk9MCQk4Ci0jZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfVU5JQ09ERQkJOQotY2xhc3MgQ1BERl9Gb250RW5jb2RpbmcKLXsKLXB1YmxpYzoKKyNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19CVUlMVElOIDAKKyNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19XSU5BTlNJIDEKKyNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19NQUNST01BTiAyCisjZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfTUFDRVhQRVJUIDMKKyNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19TVEFOREFSRCA0CisjZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MIDUKKyNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19aQVBGRElOR0JBVFMgNgorI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX1BERkRPQyA3CisjZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfTVNfU1lNQk9MIDgKKyNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19VTklDT0RFIDkKK2NsYXNzIENQREZfRm9udEVuY29kaW5nIHsKKyBwdWJsaWM6CisgIENQREZfRm9udEVuY29kaW5nKCk7CiAKLSAgICBDUERGX0ZvbnRFbmNvZGluZygpOworICBDUERGX0ZvbnRFbmNvZGluZyhpbnQgUHJlZGVmaW5lZEVuY29kaW5nKTsKIAotICAgIENQREZfRm9udEVuY29kaW5nKGludCBQcmVkZWZpbmVkRW5jb2RpbmcpOworICB2b2lkIExvYWRFbmNvZGluZyhDUERGX09iamVjdCogcEVuY29kaW5nKTsKIAotICAgIHZvaWQJCQkJCUxvYWRFbmNvZGluZyhDUERGX09iamVjdCogcEVuY29kaW5nKTsKKyAgRlhfQk9PTCBJc0lkZW50aWNhbChDUERGX0ZvbnRFbmNvZGluZyogcEFub3RoZXIpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJSXNJZGVudGljYWwoQ1BERl9Gb250RW5jb2RpbmcqIHBBbm90aGVyKSBjb25zdDsKKyAgRlhfV0NIQVIgVW5pY29kZUZyb21DaGFyQ29kZSh1aW50OF90IGNoYXJjb2RlKSBjb25zdCB7CisgICAgcmV0dXJuIG1fVW5pY29kZXNbY2hhcmNvZGVdOworICB9CiAKLSAgICBGWF9XQ0hBUgkJCQlVbmljb2RlRnJvbUNoYXJDb2RlKHVpbnQ4X3QgY2hhcmNvZGUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Vbmljb2Rlc1tjaGFyY29kZV07Ci0gICAgfQorICBpbnQgQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKSBjb25zdDsKIAotICAgIGludAkJCQkJCUNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgdW5pY29kZSkgY29uc3Q7CisgIHZvaWQgU2V0VW5pY29kZSh1aW50OF90IGNoYXJjb2RlLCBGWF9XQ0hBUiB1bmljb2RlKSB7CisgICAgbV9Vbmljb2Rlc1tjaGFyY29kZV0gPSB1bmljb2RlOworICB9CiAKLSAgICB2b2lkCQkJCQlTZXRVbmljb2RlKHVpbnQ4X3QgY2hhcmNvZGUsIEZYX1dDSEFSIHVuaWNvZGUpCi0gICAgewotICAgICAgICBtX1VuaWNvZGVzW2NoYXJjb2RlXSA9IHVuaWNvZGU7Ci0gICAgfQorICBDUERGX09iamVjdCogUmVhbGl6ZSgpOwogCi0gICAgQ1BERl9PYmplY3QqCQkJUmVhbGl6ZSgpOwotcHVibGljOgotCi0gICAgRlhfV0NIQVIJCQkJbV9Vbmljb2Rlc1syNTZdOworIHB1YmxpYzoKKyAgRlhfV0NIQVIgbV9Vbmljb2Rlc1syNTZdOwogfTsKIAotY2xhc3MgQ1BERl9TaW1wbGVGb250IDogcHVibGljIENQREZfRm9udAotewotcHVibGljOgotICAgIGV4cGxpY2l0IENQREZfU2ltcGxlRm9udChpbnQgZm9udHR5cGUpOwotICAgIH5DUERGX1NpbXBsZUZvbnQoKSBvdmVycmlkZTsKK2NsYXNzIENQREZfU2ltcGxlRm9udCA6IHB1YmxpYyBDUERGX0ZvbnQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9TaW1wbGVGb250KGludCBmb250dHlwZSk7CisgIH5DUERGX1NpbXBsZUZvbnQoKSBvdmVycmlkZTsKIAotICAgIENQREZfRm9udEVuY29kaW5nKiBHZXRFbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gJm1fRW5jb2Rpbmc7Ci0gICAgfQotICAgIGludCBHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKLSAgICB2b2lkIEdldENoYXJCQm94KEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9SRUNUJiByZWN0LCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKLSAgICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGggPSBOVUxMKSBvdmVycmlkZTsKLSAgICBGWF9CT09MIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BERl9Gb250RW5jb2RpbmcqIEdldEVuY29kaW5nKCkgeyByZXR1cm4gJm1fRW5jb2Rpbmc7IH0KKyAgaW50IEdldENoYXJXaWR0aEYoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBsZXZlbCA9IDApIG92ZXJyaWRlOworICB2b2lkIEdldENoYXJCQm94KEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9SRUNUJiByZWN0LCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKKyAgaW50IEdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9CT09MKiBwVmVydEdseXBoID0gTlVMTCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOwogCi1wcm90ZWN0ZWQ6Ci0gICAgRlhfQk9PTCBMb2FkQ29tbW9uKCk7CisgcHJvdGVjdGVkOgorICBGWF9CT09MIExvYWRDb21tb24oKTsKIAotICAgIHZvaWQgTG9hZFN1YnN0Rm9udCgpOworICB2b2lkIExvYWRTdWJzdEZvbnQoKTsKIAotICAgIHZvaWQgTG9hZEZhY2VNZXRyaWNzKCk7CisgIHZvaWQgTG9hZEZhY2VNZXRyaWNzKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgTG9hZEdseXBoTWFwKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgTG9hZEdseXBoTWFwKCkgPSAwOwogCi0gICAgRlhfV0NIQVIgX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IG92ZXJyaWRlCi0gICAgewotICAgICAgICByZXR1cm4gbV9FbmNvZGluZy5Vbmljb2RlRnJvbUNoYXJDb2RlKCh1aW50OF90KWNoYXJjb2RlKTsKLSAgICB9CisgIEZYX1dDSEFSIF9Vbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1fRW5jb2RpbmcuVW5pY29kZUZyb21DaGFyQ29kZSgodWludDhfdCljaGFyY29kZSk7CisgIH0KIAotICAgIEZYX0RXT1JEIF9DaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIFVuaWNvZGUpIGNvbnN0IG92ZXJyaWRlCi0gICAgewotICAgICAgICByZXR1cm4gbV9FbmNvZGluZy5DaGFyQ29kZUZyb21Vbmljb2RlKFVuaWNvZGUpOwotICAgIH0KKyAgRlhfRFdPUkQgX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBtX0VuY29kaW5nLkNoYXJDb2RlRnJvbVVuaWNvZGUoVW5pY29kZSk7CisgIH0KIAotICAgIHZvaWQgTG9hZENoYXJNZXRyaWNzKGludCBjaGFyY29kZSk7CisgIHZvaWQgTG9hZENoYXJNZXRyaWNzKGludCBjaGFyY29kZSk7CiAKLSAgICBDUERGX0ZvbnRFbmNvZGluZyBtX0VuY29kaW5nOwotICAgIEZYX1dPUkQgbV9HbHlwaEluZGV4WzI1Nl07Ci0gICAgRlhfV09SRCBtX0V4dEdJRFsyNTZdOwotICAgIENGWF9CeXRlU3RyaW5nKiBtX3BDaGFyTmFtZXM7Ci0gICAgaW50IG1fQmFzZUVuY29kaW5nOwotICAgIEZYX1dPUkQgbV9DaGFyV2lkdGhbMjU2XTsKLSAgICBGWF9TTUFMTF9SRUNUIG1fQ2hhckJCb3hbMjU2XTsKLSAgICBGWF9CT09MIG1fYlVzZUZvbnRXaWR0aDsKKyAgQ1BERl9Gb250RW5jb2RpbmcgbV9FbmNvZGluZzsKKyAgRlhfV09SRCBtX0dseXBoSW5kZXhbMjU2XTsKKyAgRlhfV09SRCBtX0V4dEdJRFsyNTZdOworICBDRlhfQnl0ZVN0cmluZyogbV9wQ2hhck5hbWVzOworICBpbnQgbV9CYXNlRW5jb2Rpbmc7CisgIEZYX1dPUkQgbV9DaGFyV2lkdGhbMjU2XTsKKyAgRlhfU01BTExfUkVDVCBtX0NoYXJCQm94WzI1Nl07CisgIEZYX0JPT0wgbV9iVXNlRm9udFdpZHRoOwogfTsKIAotY2xhc3MgQ1BERl9UeXBlMUZvbnQgOiBwdWJsaWMgQ1BERl9TaW1wbGVGb250Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1R5cGUxRm9udCA6IHB1YmxpYyBDUERGX1NpbXBsZUZvbnQgeworIHB1YmxpYzoKKyAgQ1BERl9UeXBlMUZvbnQoKTsKIAotICAgIENQREZfVHlwZTFGb250KCk7CisgIGludCBHZXRCYXNlMTRGb250KCkgeyByZXR1cm4gbV9CYXNlMTRGb250OyB9CisgIHZpcnR1YWwgaW50IEdseXBoRnJvbUNoYXJDb2RlRXh0KEZYX0RXT1JEIGNoYXJjb2RlKTsKIAotICAgIGludAkJCQkJCUdldEJhc2UxNEZvbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQmFzZTE0Rm9udDsKLSAgICB9Ci0gICAgdmlydHVhbCBpbnQJCQkJR2x5cGhGcm9tQ2hhckNvZGVFeHQoRlhfRFdPUkQgY2hhcmNvZGUpOwotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgRlhfQk9PTAkJCV9Mb2FkKCk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIEZYX0JPT0wgX0xvYWQoKTsKIAotICAgIGludAkJCQkJCW1fQmFzZTE0Rm9udDsKLSAgICB2aXJ0dWFsIHZvaWQJCQlMb2FkR2x5cGhNYXAoKTsKKyAgaW50IG1fQmFzZTE0Rm9udDsKKyAgdmlydHVhbCB2b2lkIExvYWRHbHlwaE1hcCgpOwogfTsKLWNsYXNzIENQREZfVHJ1ZVR5cGVGb250IDogcHVibGljIENQREZfU2ltcGxlRm9udAotewotcHVibGljOgorY2xhc3MgQ1BERl9UcnVlVHlwZUZvbnQgOiBwdWJsaWMgQ1BERl9TaW1wbGVGb250IHsKKyBwdWJsaWM6CisgIENQREZfVHJ1ZVR5cGVGb250KCk7CiAKLSAgICBDUERGX1RydWVUeXBlRm9udCgpOwotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgRlhfQk9PTAkJCV9Mb2FkKCk7Ci0gICAgdmlydHVhbCB2b2lkCQkJTG9hZEdseXBoTWFwKCk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIEZYX0JPT0wgX0xvYWQoKTsKKyAgdmlydHVhbCB2b2lkIExvYWRHbHlwaE1hcCgpOwogfTsKLWNsYXNzIENQREZfVHlwZTNDaGFyCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1R5cGUzQ2hhciB7CisgcHVibGljOgorICBDUERGX1R5cGUzQ2hhcigpOwogCi0gICAgQ1BERl9UeXBlM0NoYXIoKTsKKyAgfkNQREZfVHlwZTNDaGFyKCk7CiAKLSAgICB+Q1BERl9UeXBlM0NoYXIoKTsKKyAgRlhfQk9PTCBMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpOwogCi0gICAgRlhfQk9PTCBMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpOworICBGWF9CT09MIG1fYkNvbG9yZWQ7CiAKLSAgICBGWF9CT09MCQkJCQltX2JDb2xvcmVkOworICBGWF9CT09MIG1fYlBhZ2VSZXF1aXJlZDsKIAotICAgIEZYX0JPT0wJCQkJCW1fYlBhZ2VSZXF1aXJlZDsKKyAgQ1BERl9Gb3JtKiBtX3BGb3JtOwogCisgIENGWF9BZmZpbmVNYXRyaXggbV9JbWFnZU1hdHJpeDsKIAorICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKIAotICAgIENQREZfRm9ybSoJCQkJbV9wRm9ybTsKKyAgaW50IG1fV2lkdGg7CiAKLSAgICBDRlhfQWZmaW5lTWF0cml4CQltX0ltYWdlTWF0cml4OwotCi0gICAgQ0ZYX0RJQml0bWFwKgkJCW1fcEJpdG1hcDsKLQotCi0gICAgaW50CQkJCQkJbV9XaWR0aDsKLQotICAgIEZYX1JFQ1QJCQkJCW1fQkJveDsKKyAgRlhfUkVDVCBtX0JCb3g7CiB9OwotY2xhc3MgQ1BERl9UeXBlM0ZvbnQgOiBwdWJsaWMgQ1BERl9TaW1wbGVGb250Ci17Ci1wdWJsaWM6Ci0gICAgQ1BERl9UeXBlM0ZvbnQoKTsKLSAgICB+Q1BERl9UeXBlM0ZvbnQoKSBvdmVycmlkZTsKK2NsYXNzIENQREZfVHlwZTNGb250IDogcHVibGljIENQREZfU2ltcGxlRm9udCB7CisgcHVibGljOgorICBDUERGX1R5cGUzRm9udCgpOworICB+Q1BERl9UeXBlM0ZvbnQoKSBvdmVycmlkZTsKIAotICAgIHZvaWQgU2V0UGFnZVJlc291cmNlcyhDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMpCi0gICAgewotICAgICAgICBtX3BQYWdlUmVzb3VyY2VzID0gcFJlc291cmNlczsKLSAgICB9Ci0gICAgQ1BERl9UeXBlM0NoYXIqIExvYWRDaGFyKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKTsKLSAgICBpbnQgR2V0Q2hhcldpZHRoRihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsID0gMCkgb3ZlcnJpZGU7Ci0gICAgaW50IEdldENoYXJUeXBlV2lkdGgoRlhfRFdPUkQgY2hhcmNvZGUpIG92ZXJyaWRlCi0gICAgewotICAgICAgICByZXR1cm4gR2V0Q2hhcldpZHRoRihjaGFyY29kZSk7Ci0gICAgfQotICAgIHZvaWQgR2V0Q2hhckJCb3goRlhfRFdPUkQgY2hhcmNvZGUsIEZYX1JFQ1QmIHJlY3QsIGludCBsZXZlbCA9IDApIG92ZXJyaWRlOwotICAgIENGWF9BZmZpbmVNYXRyaXgmIEdldEZvbnRNYXRyaXgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fRm9udE1hdHJpeDsKLSAgICB9Ci0gICAgdm9pZCBDaGVja1R5cGUzRm9udE1ldHJpY3MoKTsKKyAgdm9pZCBTZXRQYWdlUmVzb3VyY2VzKENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcykgeworICAgIG1fcFBhZ2VSZXNvdXJjZXMgPSBwUmVzb3VyY2VzOworICB9CisgIENQREZfVHlwZTNDaGFyKiBMb2FkQ2hhcihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsID0gMCk7CisgIGludCBHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKKyAgaW50IEdldENoYXJUeXBlV2lkdGgoRlhfRFdPUkQgY2hhcmNvZGUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gR2V0Q2hhcldpZHRoRihjaGFyY29kZSk7CisgIH0KKyAgdm9pZCBHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsID0gMCkgb3ZlcnJpZGU7CisgIENGWF9BZmZpbmVNYXRyaXgmIEdldEZvbnRNYXRyaXgoKSB7IHJldHVybiBtX0ZvbnRNYXRyaXg7IH0KKyAgdm9pZCBDaGVja1R5cGUzRm9udE1ldHJpY3MoKTsKIAotcHJvdGVjdGVkOgotICAgIENGWF9BZmZpbmVNYXRyaXggbV9Gb250TWF0cml4OworIHByb3RlY3RlZDoKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtX0ZvbnRNYXRyaXg7CiAKLXByaXZhdGU6Ci0gICAgRlhfQk9PTCBfTG9hZCgpIG92ZXJyaWRlOwotICAgIHZvaWQgTG9hZEdseXBoTWFwKCkgb3ZlcnJpZGUge30KKyBwcml2YXRlOgorICBGWF9CT09MIF9Mb2FkKCkgb3ZlcnJpZGU7CisgIHZvaWQgTG9hZEdseXBoTWFwKCkgb3ZlcnJpZGUge30KIAotICAgIGludCBtX0NoYXJXaWR0aExbMjU2XTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIG1fcENoYXJQcm9jczsKLSAgICBDUERGX0RpY3Rpb25hcnkqIG1fcFBhZ2VSZXNvdXJjZXM7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BGb250UmVzb3VyY2VzOwotICAgIENGWF9NYXBQdHJUb1B0ciBtX0NhY2hlTWFwOwotICAgIENGWF9NYXBQdHJUb1B0ciBtX0RlbGV0ZWRNYXA7CisgIGludCBtX0NoYXJXaWR0aExbMjU2XTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BDaGFyUHJvY3M7CisgIENQREZfRGljdGlvbmFyeSogbV9wUGFnZVJlc291cmNlczsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BGb250UmVzb3VyY2VzOworICBDRlhfTWFwUHRyVG9QdHIgbV9DYWNoZU1hcDsKKyAgQ0ZYX01hcFB0clRvUHRyIG1fRGVsZXRlZE1hcDsKIH07CiAKLSNkZWZpbmUgQ0lEU0VUX1VOS05PV04JCTAKLSNkZWZpbmUgQ0lEU0VUX0dCMQkJCTEKLSNkZWZpbmUgQ0lEU0VUX0NOUzEJCQkyCi0jZGVmaW5lIENJRFNFVF9KQVBBTjEJCTMKLSNkZWZpbmUgQ0lEU0VUX0tPUkVBMQkJNAotI2RlZmluZSBDSURTRVRfVU5JQ09ERQkJNQotI2RlZmluZSBOVU1CRVJfT0ZfQ0lEU0VUUyAgIDYKKyNkZWZpbmUgQ0lEU0VUX1VOS05PV04gMAorI2RlZmluZSBDSURTRVRfR0IxIDEKKyNkZWZpbmUgQ0lEU0VUX0NOUzEgMgorI2RlZmluZSBDSURTRVRfSkFQQU4xIDMKKyNkZWZpbmUgQ0lEU0VUX0tPUkVBMSA0CisjZGVmaW5lIENJRFNFVF9VTklDT0RFIDUKKyNkZWZpbmUgTlVNQkVSX09GX0NJRFNFVFMgNgogCi1jbGFzcyBDUERGX0NJREZvbnQgOiBwdWJsaWMgQ1BERl9Gb250Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0NJREZvbnQgOiBwdWJsaWMgQ1BERl9Gb250IHsKKyBwdWJsaWM6CisgIENQREZfQ0lERm9udCgpOwogCi0gICAgQ1BERl9DSURGb250KCk7CisgIH5DUERGX0NJREZvbnQoKSBvdmVycmlkZTsKIAotICAgIH5DUERGX0NJREZvbnQoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBMb2FkR0IyMzEyKCk7CisgIGludCBHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgRlhfQk9PTCogcFZlcnRHbHlwaCA9IE5VTEwpIG92ZXJyaWRlOworICBpbnQgR2V0Q2hhcldpZHRoRihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsID0gMCkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0Q2hhckJCb3goRlhfRFdPUkQgY2hhcmNvZGUsIEZYX1JFQ1QmIHJlY3QsIGludCBsZXZlbCA9IDApIG92ZXJyaWRlOworICBGWF9XT1JEIENJREZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7CiAKLSAgICBGWF9CT09MIExvYWRHQjIzMTIoKTsKLSAgICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGggPSBOVUxMKSBvdmVycmlkZTsKLSAgICBpbnQgR2V0Q2hhcldpZHRoRihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsID0gMCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsID0gMCkgb3ZlcnJpZGU7Ci0gICAgRlhfV09SRCBDSURGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OworICBGWF9CT09MIElzVHJ1ZVR5cGUoKSBjb25zdCB7IHJldHVybiAhbV9iVHlwZTE7IH0KIAotICAgIEZYX0JPT0wgSXNUcnVlVHlwZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gIW1fYlR5cGUxOwotICAgIH0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXROZXh0Q2hhcihjb25zdCBGWF9DSEFSKiBwU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU3RyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKKyAgaW50IENvdW50Q2hhcihjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgc2l6ZSkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBBcHBlbmRDaGFyKEZYX0NIQVIqIHN0ciwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IG92ZXJyaWRlOworICBpbnQgR2V0Q2hhclNpemUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBGWF9EV09SRCBHZXROZXh0Q2hhcihjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgblN0ckxlbiwgaW50JiBvZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotICAgIGludCBDb3VudENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywgaW50IHNpemUpIGNvbnN0IG92ZXJyaWRlOwotICAgIGludCBBcHBlbmRDaGFyKEZYX0NIQVIqIHN0ciwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IG92ZXJyaWRlOwotICAgIGludCBHZXRDaGFyU2l6ZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBHZXRDaGFyc2V0KCkgY29uc3QgeyByZXR1cm4gbV9DaGFyc2V0OyB9CiAKLSAgICBpbnQgR2V0Q2hhcnNldCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9DaGFyc2V0OwotICAgIH0KKyAgY29uc3QgdWludDhfdCogR2V0Q0lEVHJhbnNmb3JtKEZYX1dPUkQgQ0lEKSBjb25zdDsKKyAgRlhfQk9PTCBJc1ZlcnRXcml0aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHNob3J0IEdldFZlcnRXaWR0aChGWF9XT1JEIENJRCkgY29uc3Q7CisgIHZvaWQgR2V0VmVydE9yaWdpbihGWF9XT1JEIENJRCwgc2hvcnQmIHZ4LCBzaG9ydCYgdnkpIGNvbnN0OworICBGWF9CT09MIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdmlydHVhbCBGWF9CT09MIElzRm9udFN0eWxlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKIAotICAgIGNvbnN0IHVpbnQ4X3QqIEdldENJRFRyYW5zZm9ybShGWF9XT1JEIENJRCkgY29uc3Q7Ci0gICAgRlhfQk9PTCBJc1ZlcnRXcml0aW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc2hvcnQgR2V0VmVydFdpZHRoKEZYX1dPUkQgQ0lEKSBjb25zdDsKLSAgICB2b2lkIEdldFZlcnRPcmlnaW4oRlhfV09SRCBDSUQsIHNob3J0JiB2eCwgc2hvcnQmIHZ5KSBjb25zdDsKLSAgICBGWF9CT09MIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgSXNGb250U3R5bGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OworIHByb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIENQREZfRm9udDsKIAotcHJvdGVjdGVkOgotICAgIGZyaWVuZCBjbGFzcyBDUERGX0ZvbnQ7CisgIEZYX0JPT0wgX0xvYWQoKSBvdmVycmlkZTsKKyAgRlhfV0NIQVIgX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IG92ZXJyaWRlOworICBGWF9EV09SRCBfQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdCBvdmVycmlkZTsKKyAgaW50IEdldEdseXBoSW5kZXgoRlhfRFdPUkQgdW5pY29kZWIsIEZYX0JPT0wqIHBWZXJ0R2x5cGgpOworICB2b2lkIExvYWRNZXRyaWNzQXJyYXkoQ1BERl9BcnJheSogcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RXb3JkQXJyYXkmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRWxlbWVudHMpOworICB2b2lkIExvYWRTdWJzdEZvbnQoKTsKIAotICAgIEZYX0JPT0wgX0xvYWQoKSBvdmVycmlkZTsKLSAgICBGWF9XQ0hBUiBfVW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfRFdPUkQgX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgaW50IEdldEdseXBoSW5kZXgoRlhfRFdPUkQgdW5pY29kZWIsIEZYX0JPT0wgKnBWZXJ0R2x5cGgpOwotICAgIHZvaWQgTG9hZE1ldHJpY3NBcnJheShDUERGX0FycmF5KiBwQXJyYXksIENGWF9EV29yZEFycmF5JiByZXN1bHQsIGludCBuRWxlbWVudHMpOwotICAgIHZvaWQgTG9hZFN1YnN0Rm9udCgpOwotCi0gICAgQ1BERl9DTWFwKiBtX3BDTWFwOwotICAgIENQREZfQ01hcCogbV9wQWxsb2NhdGVkQ01hcDsKLSAgICBDUERGX0NJRDJVbmljb2RlTWFwKiBtX3BDSUQyVW5pY29kZU1hcDsKLSAgICBpbnQgbV9DaGFyc2V0OwotICAgIEZYX0JPT0wgbV9iVHlwZTE7Ci0gICAgQ1BERl9TdHJlYW1BY2MqIG1fcENJRFRvR0lETWFwOwotICAgIEZYX0JPT0wgbV9iQ0lESXNHSUQ7Ci0gICAgRlhfV09SRCBtX0RlZmF1bHRXaWR0aDsKLSAgICBGWF9XT1JEKiBtX3BBbnNpV2lkdGhzOwotICAgIEZYX1NNQUxMX1JFQ1QgbV9DaGFyQkJveFsyNTZdOwotICAgIENGWF9EV29yZEFycmF5IG1fV2lkdGhMaXN0OwotICAgIHNob3J0IG1fRGVmYXVsdFZZOwotICAgIHNob3J0IG1fRGVmYXVsdFcxOwotICAgIENGWF9EV29yZEFycmF5IG1fVmVydE1ldHJpY3M7Ci0gICAgRlhfQk9PTCBtX2JBZG9iZUNvdXJpZXJTdGQ7Ci0gICAgQ0ZYX0NUVEdTVUJUYWJsZSogbV9wVFRHU1VCVGFibGU7CisgIENQREZfQ01hcCogbV9wQ01hcDsKKyAgQ1BERl9DTWFwKiBtX3BBbGxvY2F0ZWRDTWFwOworICBDUERGX0NJRDJVbmljb2RlTWFwKiBtX3BDSUQyVW5pY29kZU1hcDsKKyAgaW50IG1fQ2hhcnNldDsKKyAgRlhfQk9PTCBtX2JUeXBlMTsKKyAgQ1BERl9TdHJlYW1BY2MqIG1fcENJRFRvR0lETWFwOworICBGWF9CT09MIG1fYkNJRElzR0lEOworICBGWF9XT1JEIG1fRGVmYXVsdFdpZHRoOworICBGWF9XT1JEKiBtX3BBbnNpV2lkdGhzOworICBGWF9TTUFMTF9SRUNUIG1fQ2hhckJCb3hbMjU2XTsKKyAgQ0ZYX0RXb3JkQXJyYXkgbV9XaWR0aExpc3Q7CisgIHNob3J0IG1fRGVmYXVsdFZZOworICBzaG9ydCBtX0RlZmF1bHRXMTsKKyAgQ0ZYX0RXb3JkQXJyYXkgbV9WZXJ0TWV0cmljczsKKyAgRlhfQk9PTCBtX2JBZG9iZUNvdXJpZXJTdGQ7CisgIENGWF9DVFRHU1VCVGFibGUqIG1fcFRUR1NVQlRhYmxlOwogfTsKIAotI2RlZmluZSBQREZDU19ERVZJQ0VHUkFZICAgICAgICAxCi0jZGVmaW5lIFBERkNTX0RFVklDRVJHQiAgICAgICAgIDIKLSNkZWZpbmUgUERGQ1NfREVWSUNFQ01ZSyAgICAgICAgMwotI2RlZmluZSBQREZDU19DQUxHUkFZICAgICAgICAgICA0Ci0jZGVmaW5lIFBERkNTX0NBTFJHQiAgICAgICAgICAgIDUKLSNkZWZpbmUgUERGQ1NfTEFCICAgICAgICAgICAgICAgNgotI2RlZmluZSBQREZDU19JQ0NCQVNFRCAgICAgICAgICA3Ci0jZGVmaW5lIFBERkNTX1NFUEFSQVRJT04gICAgICAgIDgKLSNkZWZpbmUgUERGQ1NfREVWSUNFTiAgICAgICAgICAgOQotI2RlZmluZSBQREZDU19JTkRFWEVEICAgICAgICAgICAxMAotI2RlZmluZSBQREZDU19QQVRURVJOICAgICAgICAgICAxMQorI2RlZmluZSBQREZDU19ERVZJQ0VHUkFZIDEKKyNkZWZpbmUgUERGQ1NfREVWSUNFUkdCIDIKKyNkZWZpbmUgUERGQ1NfREVWSUNFQ01ZSyAzCisjZGVmaW5lIFBERkNTX0NBTEdSQVkgNAorI2RlZmluZSBQREZDU19DQUxSR0IgNQorI2RlZmluZSBQREZDU19MQUIgNgorI2RlZmluZSBQREZDU19JQ0NCQVNFRCA3CisjZGVmaW5lIFBERkNTX1NFUEFSQVRJT04gOAorI2RlZmluZSBQREZDU19ERVZJQ0VOIDkKKyNkZWZpbmUgUERGQ1NfSU5ERVhFRCAxMAorI2RlZmluZSBQREZDU19QQVRURVJOIDExCiAKLWNsYXNzIENQREZfQ29sb3JTcGFjZQotewotcHVibGljOgorY2xhc3MgQ1BERl9Db2xvclNwYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDUERGX0NvbG9yU3BhY2UqIEdldFN0b2NrQ1MoaW50IEZhbWlseSk7CiAKLSAgICBzdGF0aWMgQ1BERl9Db2xvclNwYWNlKiBHZXRTdG9ja0NTKGludCBGYW1pbHkpOworICBzdGF0aWMgQ1BERl9Db2xvclNwYWNlKiBMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwQ1NPYmopOwogCi0gICAgc3RhdGljIENQREZfQ29sb3JTcGFjZSoJTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX09iamVjdCogcENTT2JqKTsKKyAgdm9pZCBSZWxlYXNlQ1MoKTsKIAotICAgIHZvaWQJCQkJCVJlbGVhc2VDUygpOworICBpbnQgR2V0QnVmU2l6ZSgpIGNvbnN0OwogCi0gICAgaW50CQkJCQkJR2V0QnVmU2l6ZSgpIGNvbnN0OworICBGWF9GTE9BVCogQ3JlYXRlQnVmKCk7CiAKLSAgICBGWF9GTE9BVCoJCQlDcmVhdGVCdWYoKTsKKyAgdm9pZCBHZXREZWZhdWx0Q29sb3IoRlhfRkxPQVQqIGJ1ZikgY29uc3Q7CiAKLSAgICB2b2lkCQkJCQlHZXREZWZhdWx0Q29sb3IoRlhfRkxPQVQqIGJ1ZikgY29uc3Q7CisgIGludCBDb3VudENvbXBvbmVudHMoKSBjb25zdCB7IHJldHVybiBtX25Db21wb25lbnRzOyB9CiAKLSAgICBpbnQJCQkJCQlDb3VudENvbXBvbmVudHMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkNvbXBvbmVudHM7Ci0gICAgfQorICBpbnQgR2V0RmFtaWx5KCkgY29uc3QgeyByZXR1cm4gbV9GYW1pbHk7IH0KIAotICAgIGludAkJCQkJCUdldEZhbWlseSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9GYW1pbHk7Ci0gICAgfQorICB2aXJ0dWFsIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IHsKKyAgICB2YWx1ZSA9IDA7CisgICAgbWluID0gMDsKKyAgICBtYXggPSAxLjBmOworICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXREZWZhdWx0VmFsdWUoaW50IGlDb21wb25lbnQsIEZYX0ZMT0FUJiB2YWx1ZSwgRlhfRkxPQVQmIG1pbiwgRlhfRkxPQVQmIG1heCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgbWluID0gMDsKLSAgICAgICAgbWF4ID0gMS4wZjsKLSAgICB9CisgIEZYX0JPT0wgc1JHQigpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJc1JHQigpIGNvbnN0OworICB2aXJ0dWFsIEZYX0JPT0wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCA9IDA7CiAKKyAgdmlydHVhbCBGWF9CT09MIFNldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgQikgY29uc3QgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCisgIEZYX0JPT0wgR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjLAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG0sCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrKSBjb25zdDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QgPSAwOworICBGWF9CT09MIFNldENNWUsoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjLAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbSwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBrKSBjb25zdDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdDsKIAorICBDUERGX0FycmF5KiYgR2V0QXJyYXkoKSB7IHJldHVybiBtX3BBcnJheTsgfQogCisgIGludCBHZXRNYXhJbmRleCgpIGNvbnN0OwogCisgIHZpcnR1YWwgQ1BERl9Db2xvclNwYWNlKiBHZXRCYXNlQ1MoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CiAKLSAgICBGWF9CT09MCQkJCQlHZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpOwogCi0gICAgRlhfQk9PTAkJCQkJU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3Q7CisgIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcERvY3VtZW50OwogCisgcHJvdGVjdGVkOgorICBDUERGX0NvbG9yU3BhY2UoQ1BERl9Eb2N1bWVudCogcERvYywgaW50IGZhbWlseSwgaW50IG5Db21wb25lbnRzKQorICAgICAgOiBtX3BEb2N1bWVudChwRG9jKSwKKyAgICAgICAgbV9GYW1pbHkoZmFtaWx5KSwKKyAgICAgICAgbV9uQ29tcG9uZW50cyhuQ29tcG9uZW50cyksCisgICAgICAgIG1fcEFycmF5KG51bGxwdHIpLAorICAgICAgICBtX2R3U3RkQ29udmVyc2lvbigwKSB7fQorICB2aXJ0dWFsIH5DUERGX0NvbG9yU3BhY2UoKSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHZpcnR1YWwgRlhfQk9PTCB2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGspIGNvbnN0IHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdmlydHVhbCBGWF9CT09MIHZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBrKSBjb25zdCB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogZGVzdF9idWYsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBwaXhlbHMsCi0gICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdDsKKyAgaW50IG1fRmFtaWx5OwogCi0gICAgQ1BERl9BcnJheSomCQkJR2V0QXJyYXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEFycmF5OwotICAgIH0KKyAgaW50IG1fbkNvbXBvbmVudHM7CiAKLSAgICBpbnQJCQkJCQlHZXRNYXhJbmRleCgpIGNvbnN0OworICBDUERGX0FycmF5KiBtX3BBcnJheTsKIAotICAgIHZpcnR1YWwgQ1BERl9Db2xvclNwYWNlKglHZXRCYXNlQ1MoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkCQkJRW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKTsKLQotICAgIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcERvY3VtZW50OwotCi1wcm90ZWN0ZWQ6Ci0gICAgQ1BERl9Db2xvclNwYWNlKENQREZfRG9jdW1lbnQqIHBEb2MsIGludCBmYW1pbHksIGludCBuQ29tcG9uZW50cykKLSAgICAgICAgOiBtX3BEb2N1bWVudChwRG9jKSwKLSAgICAgICAgICBtX0ZhbWlseShmYW1pbHkpLAotICAgICAgICAgIG1fbkNvbXBvbmVudHMobkNvbXBvbmVudHMpLAotICAgICAgICAgIG1fcEFycmF5KG51bGxwdHIpLAotICAgICAgICAgIG1fZHdTdGRDb252ZXJzaW9uKDApIHsKLSAgICB9Ci0gICAgdmlydHVhbCB+Q1BERl9Db2xvclNwYWNlKCkge30KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQl2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCXZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCXZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpbnQJCQkJCQltX0ZhbWlseTsKLQotICAgIGludAkJCQkJCW1fbkNvbXBvbmVudHM7Ci0KLSAgICBDUERGX0FycmF5KgkJCQltX3BBcnJheTsKLQotICAgIEZYX0RXT1JECQkJCW1fZHdTdGRDb252ZXJzaW9uOworICBGWF9EV09SRCBtX2R3U3RkQ29udmVyc2lvbjsKIH07Ci1jbGFzcyBDUERGX0NvbG9yCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0NvbG9yIHsKKyBwdWJsaWM6CisgIENQREZfQ29sb3IoKSA6IG1fcENTKE5VTEwpLCBtX3BCdWZmZXIoTlVMTCkge30KIAotICAgIENQREZfQ29sb3IoKSA6bV9wQ1MoTlVMTCksIG1fcEJ1ZmZlcihOVUxMKQotICAgIHsKLSAgICB9CisgIENQREZfQ29sb3IoaW50IGZhbWlseSk7CiAKLSAgICBDUERGX0NvbG9yKGludCBmYW1pbHkpOworICB+Q1BERl9Db2xvcigpOwogCi0gICAgfkNQREZfQ29sb3IoKTsKKyAgRlhfQk9PTCBJc051bGwoKSBjb25zdCB7IHJldHVybiBtX3BCdWZmZXIgPT0gTlVMTDsgfQogCi0gICAgRlhfQk9PTAkJCQkJSXNOdWxsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BCdWZmZXIgPT0gTlVMTDsKLSAgICB9CisgIEZYX0JPT0wgSXNFcXVhbChjb25zdCBDUERGX0NvbG9yJiBvdGhlcikgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCQlJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdDsKKyAgRlhfQk9PTCBJc1BhdHRlcm4oKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcENTICYmIG1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOOworICB9CiAKLSAgICBGWF9CT09MCQkJCQlJc1BhdHRlcm4oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcENTICYmIG1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOOwotICAgIH0KKyAgdm9pZCBDb3B5KGNvbnN0IENQREZfQ29sb3IqIHBTcmMpOwogCi0gICAgdm9pZAkJCQkJQ29weShjb25zdCBDUERGX0NvbG9yKiBwU3JjKTsKKyAgdm9pZCBTZXRDb2xvclNwYWNlKENQREZfQ29sb3JTcGFjZSogcENTKTsKIAotICAgIHZvaWQJCQkJCVNldENvbG9yU3BhY2UoQ1BERl9Db2xvclNwYWNlKiBwQ1MpOworICB2b2lkIFNldFZhbHVlKEZYX0ZMT0FUKiBjb21wKTsKIAotICAgIHZvaWQJCQkJCVNldFZhbHVlKEZYX0ZMT0FUKiBjb21wKTsKKyAgdm9pZCBTZXRWYWx1ZShDUERGX1BhdHRlcm4qIHBQYXR0ZXJuLCBGWF9GTE9BVCogY29tcCwgaW50IG5jb21wcyk7CiAKLSAgICB2b2lkCQkJCQlTZXRWYWx1ZShDUERGX1BhdHRlcm4qIHBQYXR0ZXJuLCBGWF9GTE9BVCogY29tcCwgaW50IG5jb21wcyk7CisgIEZYX0JPT0wgR2V0UkdCKGludCYgUiwgaW50JiBHLCBpbnQmIEIpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJR2V0UkdCKGludCYgUiwgaW50JiBHLCBpbnQmIEIpIGNvbnN0OworICBDUERGX1BhdHRlcm4qIEdldFBhdHRlcm4oKSBjb25zdDsKIAotICAgIENQREZfUGF0dGVybioJCQlHZXRQYXR0ZXJuKCkgY29uc3Q7CisgIENQREZfQ29sb3JTcGFjZSogR2V0UGF0dGVybkNTKCkgY29uc3Q7CiAKLSAgICBDUERGX0NvbG9yU3BhY2UqCQlHZXRQYXR0ZXJuQ1MoKSBjb25zdDsKKyAgRlhfRkxPQVQqIEdldFBhdHRlcm5Db2xvcigpIGNvbnN0OwogCi0gICAgRlhfRkxPQVQqCQkJR2V0UGF0dGVybkNvbG9yKCkgY29uc3Q7CisgIENQREZfQ29sb3JTcGFjZSogbV9wQ1M7CiAKLSAgICBDUERGX0NvbG9yU3BhY2UqCQltX3BDUzsKLQotcHJvdGVjdGVkOgotICAgIHZvaWQJUmVsZWFzZUJ1ZmZlcigpOwotICAgIHZvaWQJUmVsZWFzZUNvbG9yU3BhY2UoKTsKLSAgICBGWF9GTE9BVCoJCQkgICAgbV9wQnVmZmVyOworIHByb3RlY3RlZDoKKyAgdm9pZCBSZWxlYXNlQnVmZmVyKCk7CisgIHZvaWQgUmVsZWFzZUNvbG9yU3BhY2UoKTsKKyAgRlhfRkxPQVQqIG1fcEJ1ZmZlcjsKIH07Ci0jZGVmaW5lIFBBVFRFUk5fVElMSU5HCQkxCi0jZGVmaW5lIFBBVFRFUk5fU0hBRElORwkJMgotY2xhc3MgQ1BERl9QYXR0ZXJuCi17Ci1wdWJsaWM6CisjZGVmaW5lIFBBVFRFUk5fVElMSU5HIDEKKyNkZWZpbmUgUEFUVEVSTl9TSEFESU5HIDIKK2NsYXNzIENQREZfUGF0dGVybiB7CisgcHVibGljOgorICB2aXJ0dWFsIH5DUERGX1BhdHRlcm4oKTsKKyAgdm9pZCBTZXRGb3JjZUNsZWFyKEZYX0JPT0wgYkZvcmNlQ2xlYXIpIHsgbV9iRm9yY2VDbGVhciA9IGJGb3JjZUNsZWFyOyB9CiAKLSAgICB2aXJ0dWFsIH5DUERGX1BhdHRlcm4oKTsKLSAgICB2b2lkICAgIFNldEZvcmNlQ2xlYXIoRlhfQk9PTCBiRm9yY2VDbGVhcikgeyBtX2JGb3JjZUNsZWFyID0gYkZvcmNlQ2xlYXI7IH0KKyAgQ1BERl9PYmplY3QqIG1fcFBhdHRlcm5PYmo7CiAKLSAgICBDUERGX09iamVjdCogICAgICAgICAgICAgICAgbV9wUGF0dGVybk9iajsKKyAgaW50IG1fUGF0dGVyblR5cGU7CiAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbV9QYXR0ZXJuVHlwZTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtX1BhdHRlcm4yRm9ybTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtX1BhcmVudE1hdHJpeDsKIAotICAgIENGWF9BZmZpbmVNYXRyaXggICAgICAgICAgICBtX1BhdHRlcm4yRm9ybTsKLSAgICBDRlhfQWZmaW5lTWF0cml4ICAgICAgICAgICAgbV9QYXJlbnRNYXRyaXg7CisgIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OwogCi0gICAgQ1BERl9Eb2N1bWVudCogICAgICAgICAgICAgIG1fcERvY3VtZW50OwotCi1wcm90ZWN0ZWQ6Ci0gICAgQ1BERl9QYXR0ZXJuKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgpOwotICAgIEZYX0JPT0wgICAgIG1fYkZvcmNlQ2xlYXI7CisgcHJvdGVjdGVkOgorICBDUERGX1BhdHRlcm4oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFBhcmVudE1hdHJpeCk7CisgIEZYX0JPT0wgbV9iRm9yY2VDbGVhcjsKIH07CiAKLWNsYXNzIENQREZfVGlsaW5nUGF0dGVybiA6IHB1YmxpYyBDUERGX1BhdHRlcm4KLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfVGlsaW5nUGF0dGVybiA6IHB1YmxpYyBDUERGX1BhdHRlcm4geworIHB1YmxpYzoKKyAgQ1BERl9UaWxpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFBhdHRlcm5PYmosCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwYXJlbnRNYXRyaXgpOwogCi0gICAgQ1BERl9UaWxpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KTsKKyAgdmlydHVhbCB+Q1BERl9UaWxpbmdQYXR0ZXJuKCk7CiAKLSAgICB2aXJ0dWFsIH5DUERGX1RpbGluZ1BhdHRlcm4oKTsKKyAgRlhfQk9PTCBMb2FkKCk7CiAKLSAgICBGWF9CT09MCQkJCUxvYWQoKTsKKyAgRlhfQk9PTCBtX2JDb2xvcmVkOwogCisgIENGWF9GbG9hdFJlY3QgbV9CQm94OwogCisgIEZYX0ZMT0FUIG1fWFN0ZXA7CiAKLSAgICBGWF9CT09MCQkJCW1fYkNvbG9yZWQ7CisgIEZYX0ZMT0FUIG1fWVN0ZXA7CiAKLSAgICBDRlhfRmxvYXRSZWN0CQltX0JCb3g7Ci0KLSAgICBGWF9GTE9BVAkJCW1fWFN0ZXA7Ci0KLSAgICBGWF9GTE9BVAkJCW1fWVN0ZXA7Ci0KLQotCi0gICAgQ1BERl9Gb3JtKgkJCW1fcEZvcm07CisgIENQREZfRm9ybSogbV9wRm9ybTsKIH07Ci1jbGFzcyBDUERGX1NoYWRpbmdQYXR0ZXJuIDogcHVibGljIENQREZfUGF0dGVybgotewotcHVibGljOgorY2xhc3MgQ1BERl9TaGFkaW5nUGF0dGVybiA6IHB1YmxpYyBDUERGX1BhdHRlcm4geworIHB1YmxpYzoKKyAgQ1BERl9TaGFkaW5nUGF0dGVybihDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGFkaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBhcmVudE1hdHJpeCk7CiAKLSAgICBDUERGX1NoYWRpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KTsKKyAgdmlydHVhbCB+Q1BERl9TaGFkaW5nUGF0dGVybigpOwogCi0gICAgdmlydHVhbCB+Q1BERl9TaGFkaW5nUGF0dGVybigpOworICBDUERGX09iamVjdCogbV9wU2hhZGluZ09iajsKIAotICAgIENQREZfT2JqZWN0KgkJbV9wU2hhZGluZ09iajsKKyAgRlhfQk9PTCBtX2JTaGFkaW5nT2JqOwogCi0gICAgRlhfQk9PTAkJCQltX2JTaGFkaW5nT2JqOworICBGWF9CT09MIExvYWQoKTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZCgpOworICBGWF9CT09MIFJlbG9hZCgpOwogCi0gICAgRlhfQk9PTAkJCQlSZWxvYWQoKTsKKyAgaW50IG1fU2hhZGluZ1R5cGU7CiAKLSAgICBpbnQJCQkJCW1fU2hhZGluZ1R5cGU7CisgIENQREZfQ29sb3JTcGFjZSogbV9wQ1M7ICAvLyBTdGlsbCBrZWVwIG1fcENTIGFzIHNvbWUgQ1BERl9Db2xvclNwYWNlIChuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QpIGFyZSBub3QgbWFuYWdlZCBhcyBjb3VudGVkIG9iamVjdHMuIFJlZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBDUERGX0RvY1BhZ2VEYXRhOjpHZXRDb2xvclNwYWNlLgogCi0gICAgQ1BERl9Db2xvclNwYWNlKgltX3BDUzsgLy8gU3RpbGwga2VlcCBtX3BDUyBhcyBzb21lIENQREZfQ29sb3JTcGFjZSAobmFtZSBvYmplY3QpIGFyZSBub3QgbWFuYWdlZCBhcyBjb3VudGVkIG9iamVjdHMuIFJlZmVyIHRvIENQREZfRG9jUGFnZURhdGE6OkdldENvbG9yU3BhY2UuCisgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIG1fcENvdW50ZWRDUzsKIAotICAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqCW1fcENvdW50ZWRDUzsKKyAgQ1BERl9GdW5jdGlvbiogbV9wRnVuY3Rpb25zWzRdOwogCi0gICAgQ1BERl9GdW5jdGlvbioJCW1fcEZ1bmN0aW9uc1s0XTsKKyAgaW50IG1fbkZ1bmNzOwogCi0gICAgaW50CQkJCQltX25GdW5jczsKLXByb3RlY3RlZDoKLSAgICB2b2lkCUNsZWFyKCk7CisgcHJvdGVjdGVkOgorICB2b2lkIENsZWFyKCk7CiB9Owogc3RydWN0IENQREZfTWVzaFZlcnRleCB7Ci0gICAgRlhfRkxPQVQgeCwgeTsKLSAgICBGWF9GTE9BVCByLCBnLCBiOworICBGWF9GTE9BVCB4LCB5OworICBGWF9GTE9BVCByLCBnLCBiOwogfTsKLWNsYXNzIENQREZfTWVzaFN0cmVhbQotewotcHVibGljOgorY2xhc3MgQ1BERl9NZXNoU3RyZWFtIHsKKyBwdWJsaWM6CisgIEZYX0JPT0wgTG9hZChDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sCisgICAgICAgICAgICAgICBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLAorICAgICAgICAgICAgICAgaW50IG5GdW5jcywKKyAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTKTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZChDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsIGludCBuRnVuY3MsIENQREZfQ29sb3JTcGFjZSogcENTKTsKKyAgRlhfRFdPUkQgR2V0RmxhZygpOwogCi0gICAgRlhfRFdPUkQJCQlHZXRGbGFnKCk7CisgIHZvaWQgR2V0Q29vcmRzKEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSk7CiAKLSAgICB2b2lkCQkJCUdldENvb3JkcyhGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpOworICB2b2lkIEdldENvbG9yKEZYX0ZMT0FUJiByLCBGWF9GTE9BVCYgZywgRlhfRkxPQVQmIGIpOwogCi0gICAgdm9pZAkJCQlHZXRDb2xvcihGWF9GTE9BVCYgciwgRlhfRkxPQVQmIGcsIEZYX0ZMT0FUJiBiKTsKKyAgRlhfRFdPUkQgR2V0VmVydGV4KENQREZfTWVzaFZlcnRleCYgdmVydGV4LCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCk7CiAKLSAgICBGWF9EV09SRCAJCQlHZXRWZXJ0ZXgoQ1BERl9NZXNoVmVydGV4JiB2ZXJ0ZXgsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwKTsKLQotICAgIEZYX0JPT0wJCQkJR2V0VmVydGV4Um93KENQREZfTWVzaFZlcnRleCogdmVydGV4LCBpbnQgY291bnQsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwKTsKLSAgICBDUERGX0Z1bmN0aW9uKioJbV9wRnVuY3M7Ci0gICAgQ1BERl9Db2xvclNwYWNlKgltX3BDUzsKLSAgICBGWF9EV09SRAkJCW1fbkZ1bmNzLCBtX25Db29yZEJpdHMsIG1fbkNvbXBCaXRzLCBtX25GbGFnQml0cywgbV9uQ29tcHM7Ci0gICAgRlhfRFdPUkQJCQltX0Nvb3JkTWF4LCBtX0NvbXBNYXg7Ci0gICAgRlhfRkxPQVQJCQltX3htaW4sIG1feG1heCwgbV95bWluLCBtX3ltYXg7Ci0gICAgRlhfRkxPQVQJCQltX0NvbG9yTWluWzhdLCBtX0NvbG9yTWF4WzhdOwotICAgIENQREZfU3RyZWFtQWNjCQltX1N0cmVhbTsKLSAgICBDRlhfQml0U3RyZWFtCQltX0JpdFN0cmVhbTsKKyAgRlhfQk9PTCBHZXRWZXJ0ZXhSb3coQ1BERl9NZXNoVmVydGV4KiB2ZXJ0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJCaXRtYXApOworICBDUERGX0Z1bmN0aW9uKiogbV9wRnVuY3M7CisgIENQREZfQ29sb3JTcGFjZSogbV9wQ1M7CisgIEZYX0RXT1JEIG1fbkZ1bmNzLCBtX25Db29yZEJpdHMsIG1fbkNvbXBCaXRzLCBtX25GbGFnQml0cywgbV9uQ29tcHM7CisgIEZYX0RXT1JEIG1fQ29vcmRNYXgsIG1fQ29tcE1heDsKKyAgRlhfRkxPQVQgbV94bWluLCBtX3htYXgsIG1feW1pbiwgbV95bWF4OworICBGWF9GTE9BVCBtX0NvbG9yTWluWzhdLCBtX0NvbG9yTWF4WzhdOworICBDUERGX1N0cmVhbUFjYyBtX1N0cmVhbTsKKyAgQ0ZYX0JpdFN0cmVhbSBtX0JpdFN0cmVhbTsKIH07Ci0jZGVmaW5lIFBERl9JTUFHRV9OT19DT01QUkVTUwkJCQkweDAwMDAKLSNkZWZpbmUgUERGX0lNQUdFX0xPU1NZX0NPTVBSRVNTCQkJMHgwMDAxCi0jZGVmaW5lIFBERl9JTUFHRV9MT1NTTEVTU19DT01QUkVTUwkJCTB4MDAwMgotI2RlZmluZSBQREZfSU1BR0VfTUFTS19MT1NTWV9DT01QUkVTUwkJMHgwMDA0Ci0jZGVmaW5lIFBERl9JTUFHRV9NQVNLX0xPU1NMRVNTX0NPTVBSRVNTCTB4MDAwOAotY2xhc3MgQ1BERl9JbWFnZVNldFBhcmFtCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9JbWFnZVNldFBhcmFtKCkKLSAgICAgICAgOiBwTWF0dGVDb2xvcihOVUxMKQotICAgICAgICAsIG5RdWFsaXR5KDgwKQotICAgIHsKLSAgICB9Ci0gICAgRlhfQVJHQiogcE1hdHRlQ29sb3I7Ci0gICAgaW50MzJfdCBuUXVhbGl0eTsKKyNkZWZpbmUgUERGX0lNQUdFX05PX0NPTVBSRVNTIDB4MDAwMAorI2RlZmluZSBQREZfSU1BR0VfTE9TU1lfQ09NUFJFU1MgMHgwMDAxCisjZGVmaW5lIFBERl9JTUFHRV9MT1NTTEVTU19DT01QUkVTUyAweDAwMDIKKyNkZWZpbmUgUERGX0lNQUdFX01BU0tfTE9TU1lfQ09NUFJFU1MgMHgwMDA0CisjZGVmaW5lIFBERl9JTUFHRV9NQVNLX0xPU1NMRVNTX0NPTVBSRVNTIDB4MDAwOAorY2xhc3MgQ1BERl9JbWFnZVNldFBhcmFtIHsKKyBwdWJsaWM6CisgIENQREZfSW1hZ2VTZXRQYXJhbSgpIDogcE1hdHRlQ29sb3IoTlVMTCksIG5RdWFsaXR5KDgwKSB7fQorICBGWF9BUkdCKiBwTWF0dGVDb2xvcjsKKyAgaW50MzJfdCBuUXVhbGl0eTsKIH07Ci1jbGFzcyBDUERGX0ltYWdlCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0ltYWdlIHsKKyBwdWJsaWM6CisgIENQREZfSW1hZ2UoQ1BERl9Eb2N1bWVudCogcERvYyk7CiAKLSAgICBDUERGX0ltYWdlKENQREZfRG9jdW1lbnQqIHBEb2MpOworICB+Q1BERl9JbWFnZSgpOwogCi0gICAgfkNQREZfSW1hZ2UoKTsKKyAgRlhfQk9PTCBMb2FkSW1hZ2VGKENQREZfU3RyZWFtKiBwSW1hZ2VTdHJlYW0sIEZYX0JPT0wgYklubGluZSk7CiAKLSAgICBGWF9CT09MCQkJCQlMb2FkSW1hZ2VGKENQREZfU3RyZWFtKiBwSW1hZ2VTdHJlYW0sIEZYX0JPT0wgYklubGluZSk7CisgIHZvaWQgUmVsZWFzZSgpOwogCi0gICAgdm9pZAkJCQkJUmVsZWFzZSgpOworICBDUERGX0ltYWdlKiBDbG9uZSgpOwogCi0gICAgQ1BERl9JbWFnZSoJCQkJQ2xvbmUoKTsKKyAgRlhfQk9PTCBJc0lubGluZSgpIHsgcmV0dXJuIG1fYklubGluZTsgfQogCi0gICAgRlhfQk9PTAkJCQkJSXNJbmxpbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYklubGluZTsKLSAgICB9CisgIHZvaWQgU2V0SW5saW5lRGljdChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7IG1fcElubGluZURpY3QgPSBwRGljdDsgfQogCi0gICAgdm9pZAkJCQkJU2V0SW5saW5lRGljdChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQotICAgIHsKLSAgICAgICAgbV9wSW5saW5lRGljdCA9IHBEaWN0OwotICAgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRJbmxpbmVEaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wSW5saW5lRGljdDsgfQogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJR2V0SW5saW5lRGljdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wSW5saW5lRGljdDsKLSAgICB9CisgIENQREZfU3RyZWFtKiBHZXRTdHJlYW0oKSBjb25zdCB7IHJldHVybiBtX3BTdHJlYW07IH0KIAotICAgIENQREZfU3RyZWFtKgkJCUdldFN0cmVhbSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wU3RyZWFtOwotICAgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3QgeworICAgIHJldHVybiBtX3BTdHJlYW0gPyBtX3BTdHJlYW0tPkdldERpY3QoKSA6IE5VTEw7CisgIH0KIAotICAgIENQREZfRGljdGlvbmFyeSoJCUdldERpY3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFN0cmVhbT8gbV9wU3RyZWFtLT5HZXREaWN0KCk6IE5VTEw7Ci0gICAgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldE9DKCkgY29uc3QgeyByZXR1cm4gbV9wT0M7IH0KIAotICAgIENQREZfRGljdGlvbmFyeSoJCUdldE9DKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPQzsKLSAgICB9CisgIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KIAotICAgIENQREZfRG9jdW1lbnQqCQkJR2V0RG9jdW1lbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERvY3VtZW50OwotICAgIH0KKyAgaW50MzJfdCBHZXRQaXhlbEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fSGVpZ2h0OyB9CiAKKyAgaW50MzJfdCBHZXRQaXhlbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9XaWR0aDsgfQogCisgIEZYX0JPT0wgSXNNYXNrKCkgY29uc3QgeyByZXR1cm4gbV9iSXNNYXNrOyB9CiAKLSAgICBpbnQzMl90CQkJCUdldFBpeGVsSGVpZ2h0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0hlaWdodDsKLSAgICB9CisgIEZYX0JPT0wgSXNJbnRlcnBvbCgpIGNvbnN0IHsgcmV0dXJuIG1fYkludGVycG9sYXRlOyB9CiAKLSAgICBpbnQzMl90CQkJCUdldFBpeGVsV2lkdGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fV2lkdGg7Ci0gICAgfQorICBDRlhfRElCU291cmNlKiBMb2FkRElCU291cmNlKENGWF9ESUJTb3VyY2UqKiBwcE1hc2sgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwTWF0dGVDb2xvciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSkgY29uc3Q7CiAKKyAgdm9pZCBTZXRJbWFnZShjb25zdCBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IGlDb21wcmVzcywKKyAgICAgICAgICAgICAgICBJRlhfRmlsZVdyaXRlKiBwRmlsZVdyaXRlID0gTlVMTCwKKyAgICAgICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCA9IE5VTEwsCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IE5VTEwsCisgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9JbWFnZVNldFBhcmFtKiBwUGFyYW0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQkJCUlzTWFzaygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iSXNNYXNrOwotICAgIH0KKyAgdm9pZCBTZXRKcGVnSW1hZ2UodWludDhfdCogcEltYWdlRGF0YSwgRlhfRFdPUkQgc2l6ZSk7CiAKLSAgICBGWF9CT09MCQkJCQlJc0ludGVycG9sKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JJbnRlcnBvbGF0ZTsKLSAgICB9CisgIHZvaWQgU2V0SnBlZ0ltYWdlKElGWF9GaWxlUmVhZCogcEZpbGUpOwogCi0gICAgQ0ZYX0RJQlNvdXJjZSoJCQlMb2FkRElCU291cmNlKENGWF9ESUJTb3VyY2UqKiBwcE1hc2sgPSBOVUxMLCBGWF9EV09SRCogcE1hdHRlQ29sb3IgPSBOVUxMLCBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpIGNvbnN0OworICB2b2lkIFJlc2V0Q2FjaGUoQ1BERl9QYWdlKiBwUGFnZSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApOwogCisgcHVibGljOgorICBGWF9CT09MIFN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFKTsKKyAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgIENGWF9ESUJTb3VyY2UqIERldGFjaEJpdG1hcCgpOworICBDRlhfRElCU291cmNlKiBEZXRhY2hNYXNrKCk7CisgIENGWF9ESUJTb3VyY2UqIG1fcERJQlNvdXJjZTsKKyAgQ0ZYX0RJQlNvdXJjZSogbV9wTWFzazsKKyAgRlhfRFdPUkQgbV9NYXR0ZUNvbG9yOwogCisgcHJpdmF0ZToKKyAgQ1BERl9TdHJlYW0qIG1fcFN0cmVhbTsKKyAgRlhfQk9PTCBtX2JJbmxpbmU7CisgIENQREZfRGljdGlvbmFyeSogbV9wSW5saW5lRGljdDsKIAotICAgIHZvaWQJCQkJCVNldEltYWdlKGNvbnN0IENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBpbnQzMl90IGlDb21wcmVzcywgSUZYX0ZpbGVXcml0ZSAqcEZpbGVXcml0ZSA9IE5VTEwsIElGWF9GaWxlUmVhZCAqcEZpbGVSZWFkID0gTlVMTCwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IE5VTEwsIGNvbnN0IENQREZfSW1hZ2VTZXRQYXJhbSogcFBhcmFtID0gTlVMTCk7CisgIGludDMyX3QgbV9IZWlnaHQ7CiAKLSAgICB2b2lkCQkJCQlTZXRKcGVnSW1hZ2UodWludDhfdCogcEltYWdlRGF0YSwgRlhfRFdPUkQgc2l6ZSk7CisgIGludDMyX3QgbV9XaWR0aDsKIAotICAgIHZvaWQJCQkJCVNldEpwZWdJbWFnZShJRlhfRmlsZVJlYWQgKnBGaWxlKTsKKyAgRlhfQk9PTCBtX2JJc01hc2s7CiAKLSAgICB2b2lkCQkJCQlSZXNldENhY2hlKENQREZfUGFnZSogcFBhZ2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcERJQml0bWFwKTsKKyAgRlhfQk9PTCBtX2JJbnRlcnBvbGF0ZTsKIAotcHVibGljOgotICAgIEZYX0JPT0wJCQkJCVN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZSwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFKTsKLSAgICBGWF9CT09MCQkJCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgQ0ZYX0RJQlNvdXJjZSoJCQlEZXRhY2hCaXRtYXAoKTsKLSAgICBDRlhfRElCU291cmNlKgkJCURldGFjaE1hc2soKTsKLSAgICBDRlhfRElCU291cmNlKgkJCW1fcERJQlNvdXJjZTsKLSAgICBDRlhfRElCU291cmNlKgkJCW1fcE1hc2s7Ci0gICAgRlhfRFdPUkQJCQkJbV9NYXR0ZUNvbG9yOwotcHJpdmF0ZToKKyAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CiAKLSAgICBDUERGX1N0cmVhbSoJCQltX3BTdHJlYW07Ci0gICAgRlhfQk9PTAkJCQkJbV9iSW5saW5lOwotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcElubGluZURpY3Q7Ci0KLSAgICBpbnQzMl90CQkJCW1fSGVpZ2h0OwotCi0gICAgaW50MzJfdAkJCQltX1dpZHRoOwotCi0gICAgRlhfQk9PTAkJCQkJbV9iSXNNYXNrOwotCi0gICAgRlhfQk9PTAkJCQkJbV9iSW50ZXJwb2xhdGU7Ci0KLSAgICBDUERGX0RvY3VtZW50KgkJCW1fcERvY3VtZW50OwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wT0M7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KglJbml0SlBFRyh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSk7CisgIENQREZfRGljdGlvbmFyeSogbV9wT0M7CisgIENQREZfRGljdGlvbmFyeSogSW5pdEpQRUcodWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUpOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlBERkFQSV9GUERGX1JFU09VUkNFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3NlcmlhbC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaAppbmRleCAxODc3ZWY4Li5lZmEzMGY2IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3NlcmlhbC5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgKQEAgLTEyLDE4OSArMTIsMTk2IEBACiAKIGNsYXNzIENQREZfT2JqZWN0U3RyZWFtOwogY2xhc3MgQ1BERl9YUmVmU3RyZWFtOwotQ0ZYX0J5dGVUZXh0QnVmJiBvcGVyYXRvciA8PCAoQ0ZYX0J5dGVUZXh0QnVmJiBidWYsIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKLWNsYXNzIENQREZfT2JqQXJjaGl2ZVNhdmVyIDogcHVibGljIENGWF9BcmNoaXZlU2F2ZXIKLXsKLXB1YmxpYzoKK0NGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChDRlhfQnl0ZVRleHRCdWYmIGJ1ZiwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmopOworY2xhc3MgQ1BERl9PYmpBcmNoaXZlU2F2ZXIgOiBwdWJsaWMgQ0ZYX0FyY2hpdmVTYXZlciB7CisgcHVibGljOgorICBmcmllbmQgQ1BERl9PYmpBcmNoaXZlU2F2ZXImIG9wZXJhdG9yPDwoQ1BERl9PYmpBcmNoaXZlU2F2ZXImIGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9PYmplY3QqIHBPYmopOwogCi0gICAgZnJpZW5kIENQREZfT2JqQXJjaGl2ZVNhdmVyJglvcGVyYXRvciA8PCAoQ1BERl9PYmpBcmNoaXZlU2F2ZXImIGFyLCBjb25zdCBDUERGX09iamVjdCogcE9iaik7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCQltX09iamVjdE1hcDsKKyBwcm90ZWN0ZWQ6CisgIENGWF9NYXBQdHJUb1B0ciBtX09iamVjdE1hcDsKIH07Ci1jbGFzcyBDUERGX09iakFyY2hpdmVMb2FkZXIgOiBwdWJsaWMgQ0ZYX0FyY2hpdmVMb2FkZXIKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfT2JqQXJjaGl2ZUxvYWRlciA6IHB1YmxpYyBDRlhfQXJjaGl2ZUxvYWRlciB7CisgcHVibGljOgorICBDUERGX09iakFyY2hpdmVMb2FkZXIoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSkKKyAgICAgIDogQ0ZYX0FyY2hpdmVMb2FkZXIocERhdGEsIGR3U2l6ZSksIG1fSW5kaXJlY3RPYmplY3RzKE5VTEwpIHt9CiAKLSAgICBDUERGX09iakFyY2hpdmVMb2FkZXIoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSkgOiBDRlhfQXJjaGl2ZUxvYWRlcihwRGF0YSwgZHdTaXplKSwKLSAgICAgICAgbV9JbmRpcmVjdE9iamVjdHMoTlVMTCkge30KKyAgZnJpZW5kIENQREZfT2JqQXJjaGl2ZUxvYWRlciYgb3BlcmF0b3I+PihDUERGX09iakFyY2hpdmVMb2FkZXImIGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiYgcE9iaik7CiAKLSAgICBmcmllbmQgQ1BERl9PYmpBcmNoaXZlTG9hZGVyJglvcGVyYXRvciA+PiAoQ1BERl9PYmpBcmNoaXZlTG9hZGVyJiBhciwgQ1BERl9PYmplY3QqJiBwT2JqKTsKLXByb3RlY3RlZDoKLQotICAgIENQREZfSW5kaXJlY3RPYmplY3RzCQltX0luZGlyZWN0T2JqZWN0czsKKyBwcm90ZWN0ZWQ6CisgIENQREZfSW5kaXJlY3RPYmplY3RzIG1fSW5kaXJlY3RPYmplY3RzOwogfTsKLWNsYXNzIENQREZfUGFnZUFyY2hpdmVTYXZlciA6IHB1YmxpYyBDUERGX09iakFyY2hpdmVTYXZlcgotewotcHVibGljOgorY2xhc3MgQ1BERl9QYWdlQXJjaGl2ZVNhdmVyIDogcHVibGljIENQREZfT2JqQXJjaGl2ZVNhdmVyIHsKKyBwdWJsaWM6CisgIENQREZfUGFnZUFyY2hpdmVTYXZlcihDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9ianMpOwogCi0gICAgQ1BERl9QYWdlQXJjaGl2ZVNhdmVyKENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2Jqcyk7CisgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlU2F2ZXImIG9wZXJhdG9yPDwoQ1BERl9QYWdlQXJjaGl2ZVNhdmVyJiBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmopOwogCi0gICAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVTYXZlciYJb3BlcmF0b3IgPDwgKENQREZfUGFnZUFyY2hpdmVTYXZlciYgYXIsIENQREZfUGFnZU9iamVjdCogcE9iaik7CisgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlU2F2ZXImIG9wZXJhdG9yPDwoQ1BERl9QYWdlQXJjaGl2ZVNhdmVyJiBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NsaXBQYXRoIGNsaXBfcGF0aCk7CiAKKyAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVTYXZlciYgb3BlcmF0b3I8PChDUERGX1BhZ2VBcmNoaXZlU2F2ZXImIGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfR3JhcGhTdGF0ZSBncmFwaF9zdGF0ZSk7CiAKKyAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVTYXZlciYgb3BlcmF0b3I8PChDUERGX1BhZ2VBcmNoaXZlU2F2ZXImIGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVGV4dFN0YXRlIHRleHRfc3RhdGUpOwogCi0gICAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVTYXZlciYJb3BlcmF0b3IgPDwgKENQREZfUGFnZUFyY2hpdmVTYXZlciYgYXIsIENQREZfQ2xpcFBhdGggY2xpcF9wYXRoKTsKKyAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVTYXZlciYgb3BlcmF0b3I8PChDUERGX1BhZ2VBcmNoaXZlU2F2ZXImIGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTdGF0ZSBjb2xvcl9zdGF0ZSk7CiAKLSAgICBmcmllbmQgQ1BERl9QYWdlQXJjaGl2ZVNhdmVyJglvcGVyYXRvciA8PCAoQ1BERl9QYWdlQXJjaGl2ZVNhdmVyJiBhciwgQ1BERl9HcmFwaFN0YXRlIGdyYXBoX3N0YXRlKTsKKyAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVTYXZlciYgb3BlcmF0b3I8PChDUERGX1BhZ2VBcmNoaXZlU2F2ZXImIGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfR2VuZXJhbFN0YXRlIGdlbmVyYWxfc3RhdGUpOwogCi0gICAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVTYXZlciYJb3BlcmF0b3IgPDwgKENQREZfUGFnZUFyY2hpdmVTYXZlciYgYXIsIENQREZfVGV4dFN0YXRlIHRleHRfc3RhdGUpOworIHByb3RlY3RlZDoKKyAgQ1BERl9DbGlwUGF0aCBtX0xhc3RDbGlwUGF0aDsKIAotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlU2F2ZXImCW9wZXJhdG9yIDw8IChDUERGX1BhZ2VBcmNoaXZlU2F2ZXImIGFyLCBDUERGX0NvbG9yU3RhdGUgY29sb3Jfc3RhdGUpOworICBDUERGX0dyYXBoU3RhdGUgbV9MYXN0R3JhcGhTdGF0ZTsKIAotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlU2F2ZXImCW9wZXJhdG9yIDw8IChDUERGX1BhZ2VBcmNoaXZlU2F2ZXImIGFyLCBDUERGX0dlbmVyYWxTdGF0ZSBnZW5lcmFsX3N0YXRlKTsKKyAgQ1BERl9Db2xvclN0YXRlIG1fTGFzdENvbG9yU3RhdGU7CiAKLXByb3RlY3RlZDoKKyAgQ1BERl9UZXh0U3RhdGUgbV9MYXN0VGV4dFN0YXRlOwogCi0gICAgQ1BERl9DbGlwUGF0aAkJbV9MYXN0Q2xpcFBhdGg7Ci0KLSAgICBDUERGX0dyYXBoU3RhdGUJCW1fTGFzdEdyYXBoU3RhdGU7Ci0KLSAgICBDUERGX0NvbG9yU3RhdGUJCW1fTGFzdENvbG9yU3RhdGU7Ci0KLSAgICBDUERGX1RleHRTdGF0ZQkJbV9MYXN0VGV4dFN0YXRlOwotCi0gICAgQ1BERl9HZW5lcmFsU3RhdGUJbV9MYXN0R2VuZXJhbFN0YXRlOworICBDUERGX0dlbmVyYWxTdGF0ZSBtX0xhc3RHZW5lcmFsU3RhdGU7CiB9OwotY2xhc3MgQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciA6IHB1YmxpYyBDUERGX09iakFyY2hpdmVMb2FkZXIKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfUGFnZUFyY2hpdmVMb2FkZXIgOiBwdWJsaWMgQ1BERl9PYmpBcmNoaXZlTG9hZGVyIHsKKyBwdWJsaWM6CisgIENQREZfUGFnZUFyY2hpdmVMb2FkZXIoQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmpzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZSk7CiAKLSAgICBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyKENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqcywgY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSk7CisgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJiBvcGVyYXRvcj4+KENQREZfUGFnZUFyY2hpdmVMb2FkZXImIGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3QqJiBwT2JqKTsKIAotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJglvcGVyYXRvciA+PiAoQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgYXIsIENQREZfUGFnZU9iamVjdComIHBPYmopOworICBmcmllbmQgQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgb3BlcmF0b3I+PihDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJiBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9DbGlwUGF0aCYgY2xpcF9wYXRoKTsKIAorICBmcmllbmQgQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgb3BlcmF0b3I+PihDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJiBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9HcmFwaFN0YXRlJiBncmFwaF9zdGF0ZSk7CiAKKyAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVMb2FkZXImIG9wZXJhdG9yPj4oQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVGV4dFN0YXRlJiB0ZXh0X3N0YXRlKTsKIAotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJglvcGVyYXRvciA+PiAoQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgYXIsIENQREZfQ2xpcFBhdGgmIGNsaXBfcGF0aCk7CisgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJiBvcGVyYXRvcj4+KENQREZfUGFnZUFyY2hpdmVMb2FkZXImIGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3RhdGUmIGNvbG9yX3N0YXRlKTsKIAotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJglvcGVyYXRvciA+PiAoQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgYXIsIENQREZfR3JhcGhTdGF0ZSYgZ3JhcGhfc3RhdGUpOworICBmcmllbmQgQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgb3BlcmF0b3I+PihDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJiBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9HZW5lcmFsU3RhdGUmIGdlbmVyYWxfc3RhdGUpOwogCi0gICAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVMb2FkZXImCW9wZXJhdG9yID4+IChDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJiBhciwgQ1BERl9UZXh0U3RhdGUmIHRleHRfc3RhdGUpOworIHByb3RlY3RlZDoKKyAgdm9pZCBQb3N0UHJvY0NvbG9yKENQREZfQ29sb3ImIGNvbG9yKTsKIAotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJglvcGVyYXRvciA+PiAoQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgYXIsIENQREZfQ29sb3JTdGF0ZSYgY29sb3Jfc3RhdGUpOworICBDUERGX09iamVjdCogQWRkUmVzb3VyY2UoQ1BERl9PYmplY3QqIHBTcmNPYmosIGNvbnN0IEZYX0NIQVIqIHR5cGUpOwogCi0gICAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVMb2FkZXImCW9wZXJhdG9yID4+IChDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJiBhciwgQ1BERl9HZW5lcmFsU3RhdGUmIGdlbmVyYWxfc3RhdGUpOworICBDUERGX0NsaXBQYXRoIG1fTGFzdENsaXBQYXRoOwogCi1wcm90ZWN0ZWQ6Ci0gICAgdm9pZAkJCQlQb3N0UHJvY0NvbG9yKENQREZfQ29sb3ImIGNvbG9yKTsKKyAgQ1BERl9HcmFwaFN0YXRlIG1fTGFzdEdyYXBoU3RhdGU7CiAKLSAgICBDUERGX09iamVjdCoJCUFkZFJlc291cmNlKENQREZfT2JqZWN0KiBwU3JjT2JqLCBjb25zdCBGWF9DSEFSKiB0eXBlKTsKKyAgQ1BERl9Db2xvclN0YXRlIG1fTGFzdENvbG9yU3RhdGU7CiAKLSAgICBDUERGX0NsaXBQYXRoCQltX0xhc3RDbGlwUGF0aDsKKyAgQ1BERl9UZXh0U3RhdGUgbV9MYXN0VGV4dFN0YXRlOwogCi0gICAgQ1BERl9HcmFwaFN0YXRlCQltX0xhc3RHcmFwaFN0YXRlOworICBDUERGX0dlbmVyYWxTdGF0ZSBtX0xhc3RHZW5lcmFsU3RhdGU7CiAKLSAgICBDUERGX0NvbG9yU3RhdGUJCW1fTGFzdENvbG9yU3RhdGU7Ci0KLSAgICBDUERGX1RleHRTdGF0ZQkJbV9MYXN0VGV4dFN0YXRlOwotCi0gICAgQ1BERl9HZW5lcmFsU3RhdGUJbV9MYXN0R2VuZXJhbFN0YXRlOwotCi0gICAgQ0ZYX01hcFB0clRvUHRyCQltX09iamVjdE1hcDsKKyAgQ0ZYX01hcFB0clRvUHRyIG1fT2JqZWN0TWFwOwogfTsKLSNkZWZpbmUgRlBERkNSRUFURV9JTkNSRU1FTlRBTAkJMQotI2RlZmluZSBGUERGQ1JFQVRFX05PX09SSUdJTkFMCQkyCi0jZGVmaW5lIEZQREZDUkVBVEVfUFJPR1JFU1NJVkUJCTQKLSNkZWZpbmUgRlBERkNSRUFURV9PQkpFQ1RTVFJFQU0JCTgKLWNsYXNzIENQREZfQ3JlYXRvcgotewotcHVibGljOgorI2RlZmluZSBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMIDEKKyNkZWZpbmUgRlBERkNSRUFURV9OT19PUklHSU5BTCAyCisjZGVmaW5lIEZQREZDUkVBVEVfUFJPR1JFU1NJVkUgNAorI2RlZmluZSBGUERGQ1JFQVRFX09CSkVDVFNUUkVBTSA4CitjbGFzcyBDUERGX0NyZWF0b3IgeworIHB1YmxpYzoKKyAgQ1BERl9DcmVhdG9yKENQREZfRG9jdW1lbnQqIHBEb2MpOwogCi0gICAgQ1BERl9DcmVhdG9yKENQREZfRG9jdW1lbnQqIHBEb2MpOworICB+Q1BERl9DcmVhdG9yKCk7CiAKLSAgICB+Q1BERl9DcmVhdG9yKCk7CisgIHZvaWQgUmVtb3ZlU2VjdXJpdHkoKTsKIAotICAgIHZvaWQJCQkJUmVtb3ZlU2VjdXJpdHkoKTsKKyAgRlhfQk9PTCBDcmVhdGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBmbGFncyA9IDApOwogCi0gICAgRlhfQk9PTAkJCQlDcmVhdGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBmbGFncyA9IDApOworICBGWF9CT09MIENyZWF0ZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgRlhfRFdPUkQgZmxhZ3MgPSAwKTsKIAotICAgIEZYX0JPT0wJCQkJQ3JlYXRlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBmbGFncyA9IDApOworICBGWF9CT09MIENyZWF0ZShJRlhfU3RyZWFtV3JpdGUqIHBGaWxlLCBGWF9EV09SRCBmbGFncyA9IDApOwogCi0gICAgRlhfQk9PTAkJCQlDcmVhdGUoSUZYX1N0cmVhbVdyaXRlKiBwRmlsZSwgRlhfRFdPUkQgZmxhZ3MgPSAwKTsKKyAgaW50MzJfdCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOwogCi0gICAgaW50MzJfdAkJCUNvbnRpbnVlKElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCk7CisgIEZYX0JPT0wgU2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbiA9IDE3KTsKIAotICAgIEZYX0JPT0wJCQkJU2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbiA9IDE3KTsKLXByb3RlY3RlZDoKKyBwcm90ZWN0ZWQ6CisgIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OwogCi0gICAgQ1BERl9Eb2N1bWVudCoJCW1fcERvY3VtZW50OworICBDUERGX1BhcnNlciogbV9wUGFyc2VyOwogCi0gICAgQ1BERl9QYXJzZXIqCQltX3BQYXJzZXI7CisgIEZYX0JPT0wgbV9iQ29tcHJlc3M7CiAKLSAgICBGWF9CT09MCQkJCW1fYkNvbXByZXNzOworICBGWF9CT09MIG1fYlNlY3VyaXR5Q2hhbmdlZDsKIAotICAgIEZYX0JPT0wJCQkJbV9iU2VjdXJpdHlDaGFuZ2VkOworICBDUERGX0RpY3Rpb25hcnkqIG1fcEVuY3J5cHREaWN0OworICBGWF9EV09SRCBtX2R3RW5yeXB0T2JqTnVtOworICBGWF9CT09MIG1fYkVuY3J5cHRDbG9uZWQ7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcEVuY3J5cHREaWN0OwotICAgIEZYX0RXT1JECQkJbV9kd0VucnlwdE9iak51bTsKLSAgICBGWF9CT09MCQkJCW1fYkVuY3J5cHRDbG9uZWQ7CisgIEZYX0JPT0wgbV9iU3RhbmRhcmRTZWN1cml0eTsKIAotICAgIEZYX0JPT0wJCQkJbV9iU3RhbmRhcmRTZWN1cml0eTsKKyAgQ1BERl9DcnlwdG9IYW5kbGVyKiBtX3BDcnlwdG9IYW5kbGVyOworICBGWF9CT09MIG1fYk5ld0NyeXB0bzsKIAotICAgIENQREZfQ3J5cHRvSGFuZGxlcioJbV9wQ3J5cHRvSGFuZGxlcjsKLSAgICBGWF9CT09MCQkJCW1fYk5ld0NyeXB0bzsKKyAgRlhfQk9PTCBtX2JFbmNyeXB0TWV0YWRhdGE7CiAKLSAgICBGWF9CT09MCQkJCW1fYkVuY3J5cHRNZXRhZGF0YTsKKyAgQ1BERl9PYmplY3QqIG1fcE1ldGFkYXRhOwogCi0gICAgQ1BERl9PYmplY3QqCQltX3BNZXRhZGF0YTsKKyAgQ1BERl9YUmVmU3RyZWFtKiBtX3BYUmVmU3RyZWFtOwogCi0gICAgQ1BERl9YUmVmU3RyZWFtKgltX3BYUmVmU3RyZWFtOworICBpbnQzMl90IG1fT2JqZWN0U3RyZWFtU2l6ZTsKIAotICAgIGludDMyX3QJCQltX09iamVjdFN0cmVhbVNpemU7CisgIEZYX0RXT1JEIG1fZHdMYXN0T2JqTnVtOworICBGWF9CT09MIENyZWF0ZShGWF9EV09SRCBmbGFncyk7CisgIHZvaWQgUmVzZXRTdGFuZGFyZFNlY3VyaXR5KCk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgaW50MzJfdCBXcml0ZURvY19TdGFnZTEoSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IFdyaXRlRG9jX1N0YWdlMihJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgV3JpdGVEb2NfU3RhZ2UzKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBXcml0ZURvY19TdGFnZTQoSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgRlhfRFdPUkQJCQltX2R3TGFzdE9iak51bTsKLSAgICBGWF9CT09MCQkJCUNyZWF0ZShGWF9EV09SRCBmbGFncyk7Ci0gICAgdm9pZAkJCQlSZXNldFN0YW5kYXJkU2VjdXJpdHkoKTsKLSAgICB2b2lkCQkJCUNsZWFyKCk7Ci0gICAgaW50MzJfdAkJCVdyaXRlRG9jX1N0YWdlMShJRlhfUGF1c2UgKnBQYXVzZSk7Ci0gICAgaW50MzJfdAkJCVdyaXRlRG9jX1N0YWdlMihJRlhfUGF1c2UgKnBQYXVzZSk7Ci0gICAgaW50MzJfdAkJCVdyaXRlRG9jX1N0YWdlMyhJRlhfUGF1c2UgKnBQYXVzZSk7Ci0gICAgaW50MzJfdAkJCVdyaXRlRG9jX1N0YWdlNChJRlhfUGF1c2UgKnBQYXVzZSk7CisgIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSBtX0ZpbGU7CiAKLSAgICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUJbV9GaWxlOworICBGWF9GSUxFU0laRSBtX09mZnNldDsKKyAgdm9pZCBJbml0T2xkT2JqTnVtT2Zmc2V0cygpOworICB2b2lkIEluaXROZXdPYmpOdW1PZmZzZXRzKCk7CisgIHZvaWQgQXBwZW5kTmV3T2JqTnVtKEZYX0RXT1JEIG9iamJ1bSk7CisgIGludDMyX3QgV3JpdGVPbGRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0pOworICBpbnQzMl90IFdyaXRlT2xkT2JqcyhJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgV3JpdGVOZXdPYmpzKEZYX0JPT0wgYkluY3JlbWVudGFsLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgV3JpdGVJbmRpcmVjdE9iaihjb25zdCBDUERGX09iamVjdCogcE9iaik7CisgIGludDMyX3QgV3JpdGVEaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuY3J5cHQgPSBUUlVFKTsKKyAgaW50MzJfdCBXcml0ZUluZGlyZWN0T2JqZWN0VG9TdHJlYW0oY29uc3QgQ1BERl9PYmplY3QqIHBPYmopOworICBpbnQzMl90IFdyaXRlSW5kaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaik7CisgIGludDMyX3QgV3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTaXplKTsKKyAgaW50MzJfdCBBcHBlbmRPYmplY3ROdW1iZXJUb1hSZWYoRlhfRFdPUkQgb2JqbnVtKTsKKyAgdm9pZCBJbml0SUQoRlhfQk9PTCBiRGVmYXVsdCA9IFRSVUUpOworICBpbnQzMl90IFdyaXRlU3RyZWFtKGNvbnN0IENQREZfT2JqZWN0KiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX0NyeXB0b0hhbmRsZXIqIHBDcnlwdG8pOwogCi0gICAgRlhfRklMRVNJWkUJCQltX09mZnNldDsKLSAgICB2b2lkCQkJCUluaXRPbGRPYmpOdW1PZmZzZXRzKCk7Ci0gICAgdm9pZAkJCQlJbml0TmV3T2JqTnVtT2Zmc2V0cygpOwotICAgIHZvaWQJCQkJQXBwZW5kTmV3T2JqTnVtKEZYX0RXT1JEIG9iamJ1bSk7Ci0gICAgaW50MzJfdAkJCVdyaXRlT2xkSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgb2JqbnVtKTsKLSAgICBpbnQzMl90CQkJV3JpdGVPbGRPYmpzKElGWF9QYXVzZSAqcFBhdXNlKTsKLSAgICBpbnQzMl90CQkJV3JpdGVOZXdPYmpzKEZYX0JPT0wgYkluY3JlbWVudGFsLCBJRlhfUGF1c2UgKnBQYXVzZSk7Ci0gICAgaW50MzJfdAkJCVdyaXRlSW5kaXJlY3RPYmooY29uc3QgQ1BERl9PYmplY3QqIHBPYmopOwotICAgIGludDMyX3QJCQlXcml0ZURpcmVjdE9iaihGWF9EV09SRCBvYmpudW0sIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLCBGWF9CT09MIGJFbmNyeXB0ID0gVFJVRSk7Ci0gICAgaW50MzJfdAkJCVdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShjb25zdCBDUERGX09iamVjdCogcE9iaik7Ci0gICAgaW50MzJfdAkJCVdyaXRlSW5kaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaik7Ci0gICAgaW50MzJfdAkJCVdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShGWF9EV09SRCBvYmpudW0sIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSk7Ci0gICAgaW50MzJfdAkJCUFwcGVuZE9iamVjdE51bWJlclRvWFJlZihGWF9EV09SRCBvYmpudW0pOwotICAgIHZvaWQJCQkJSW5pdElEKEZYX0JPT0wgYkRlZmF1bHQgPSBUUlVFKTsKLSAgICBpbnQzMl90CQkJV3JpdGVTdHJlYW0oY29uc3QgQ1BERl9PYmplY3QqIHBTdHJlYW0sIEZYX0RXT1JEIG9iam51bSwgQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvKTsKKyAgaW50MzJfdCBtX2lTdGFnZTsKKyAgRlhfRFdPUkQgbV9kd0ZsYWdzOworICBGWF9QT1NJVElPTiBtX1BvczsKKyAgRlhfRklMRVNJWkUgbV9YcmVmU3RhcnQ7CiAKLSAgICBpbnQzMl90CQkJbV9pU3RhZ2U7Ci0gICAgRlhfRFdPUkQJCQltX2R3RmxhZ3M7Ci0gICAgRlhfUE9TSVRJT04JCQltX1BvczsKLSAgICBGWF9GSUxFU0laRQkJCW1fWHJlZlN0YXJ0OworICBDRlhfRmlsZVNpemVMaXN0QXJyYXkgbV9PYmplY3RPZmZzZXQ7CiAKLSAgICBDRlhfRmlsZVNpemVMaXN0QXJyYXkJbV9PYmplY3RPZmZzZXQ7CisgIENGWF9EV29yZExpc3RBcnJheSBtX09iamVjdFNpemU7CisgIENGWF9EV29yZEFycmF5IG1fTmV3T2JqTnVtQXJyYXk7CiAKLSAgICBDRlhfRFdvcmRMaXN0QXJyYXkJCW1fT2JqZWN0U2l6ZTsKLSAgICBDRlhfRFdvcmRBcnJheQkJbV9OZXdPYmpOdW1BcnJheTsKKyAgQ1BERl9BcnJheSogbV9wSURBcnJheTsKIAotICAgIENQREZfQXJyYXkqCQkJbV9wSURBcnJheTsKLQotICAgIGludDMyX3QJCQltX0ZpbGVWZXJzaW9uOwotICAgIGZyaWVuZCBjbGFzcyBDUERGX09iamVjdFN0cmVhbTsKLSAgICBmcmllbmQgY2xhc3MgQ1BERl9YUmVmU3RyZWFtOworICBpbnQzMl90IG1fRmlsZVZlcnNpb247CisgIGZyaWVuZCBjbGFzcyBDUERGX09iamVjdFN0cmVhbTsKKyAgZnJpZW5kIGNsYXNzIENQREZfWFJlZlN0cmVhbTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9TRVJJQUxfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfYXAuaCBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfYXAuaAppbmRleCA3Y2ZhZWQ0Li40MzQ1MmZkIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2FwLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9hcC5oCkBAIC0xMCw4NiArMTAsOTggQEAKICNpbmNsdWRlICIuLi9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCiAjaW5jbHVkZSAiZnBkZl92dC5oIgogCi1jbGFzcyBJUFZUX0ZvbnRNYXAKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JUFZUX0ZvbnRNYXAoKSB7IH0KLSAgICB2aXJ0dWFsIENQREZfRm9udCoJCQkJCQlHZXRQREZGb250KGludDMyX3QgbkZvbnRJbmRleCkgPSAwOwotICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFBERkZvbnRBbGlhcyhpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKK2NsYXNzIElQVlRfRm9udE1hcCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUFZUX0ZvbnRNYXAoKSB7fQorICB2aXJ0dWFsIENQREZfRm9udCogR2V0UERGRm9udChpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CiB9Owogc3RydWN0IENQVlRfRGFzaCB7CisgIENQVlRfRGFzaChpbnQzMl90IGRhc2gsIGludDMyX3QgZ2FwLCBpbnQzMl90IHBoYXNlKQorICAgICAgOiBuRGFzaChkYXNoKSwgbkdhcChnYXApLCBuUGhhc2UocGhhc2UpIHt9CiAKLSAgICBDUFZUX0Rhc2goaW50MzJfdCBkYXNoLCBpbnQzMl90IGdhcCwgaW50MzJfdCBwaGFzZSkgOiBuRGFzaChkYXNoKSwgbkdhcChnYXApLCBuUGhhc2UocGhhc2UpCi0gICAge30KKyAgaW50MzJfdCBuRGFzaDsKIAotICAgIGludDMyX3QJCQluRGFzaDsKKyAgaW50MzJfdCBuR2FwOwogCi0gICAgaW50MzJfdAkJCW5HYXA7Ci0KLSAgICBpbnQzMl90CQkJblBoYXNlOworICBpbnQzMl90IG5QaGFzZTsKIH07Ci0jZGVmaW5lIENUX1RSQU5TUEFSRU5UCQkwCi0jZGVmaW5lCUNUX0dSQVkJCQkJMQotI2RlZmluZQlDVF9SR0IJCQkJMgotI2RlZmluZQlDVF9DTVlLCQkJCTMKKyNkZWZpbmUgQ1RfVFJBTlNQQVJFTlQgMAorI2RlZmluZSBDVF9HUkFZIDEKKyNkZWZpbmUgQ1RfUkdCIDIKKyNkZWZpbmUgQ1RfQ01ZSyAzCiBzdHJ1Y3QgQ1BWVF9Db2xvciB7CisgIENQVlRfQ29sb3IoaW50MzJfdCB0eXBlID0gMCwKKyAgICAgICAgICAgICBGWF9GTE9BVCBjb2xvcjEgPSAwLjBmLAorICAgICAgICAgICAgIEZYX0ZMT0FUIGNvbG9yMiA9IDAuMGYsCisgICAgICAgICAgICAgRlhfRkxPQVQgY29sb3IzID0gMC4wZiwKKyAgICAgICAgICAgICBGWF9GTE9BVCBjb2xvcjQgPSAwLjBmKQorICAgICAgOiBuQ29sb3JUeXBlKHR5cGUpLAorICAgICAgICBmQ29sb3IxKGNvbG9yMSksCisgICAgICAgIGZDb2xvcjIoY29sb3IyKSwKKyAgICAgICAgZkNvbG9yMyhjb2xvcjMpLAorICAgICAgICBmQ29sb3I0KGNvbG9yNCkge30KIAotICAgIENQVlRfQ29sb3IoaW50MzJfdCB0eXBlID0gMCwgRlhfRkxPQVQgY29sb3IxID0gMC4wZiwgRlhfRkxPQVQgY29sb3IyID0gMC4wZiwgRlhfRkxPQVQgY29sb3IzID0gMC4wZiwgRlhfRkxPQVQgY29sb3I0ID0gMC4wZikKLSAgICAgICAgOiBuQ29sb3JUeXBlKHR5cGUpLCBmQ29sb3IxKGNvbG9yMSksIGZDb2xvcjIoY29sb3IyKSwgZkNvbG9yMyhjb2xvcjMpLCBmQ29sb3I0KGNvbG9yNCkKLSAgICB7fQotCi0gICAgaW50MzJfdAkJCW5Db2xvclR5cGU7Ci0gICAgRlhfRkxPQVQJCQlmQ29sb3IxOwotICAgIEZYX0ZMT0FUCQkJZkNvbG9yMjsKLSAgICBGWF9GTE9BVAkJCWZDb2xvcjM7Ci0gICAgRlhfRkxPQVQJCQlmQ29sb3I0OworICBpbnQzMl90IG5Db2xvclR5cGU7CisgIEZYX0ZMT0FUIGZDb2xvcjE7CisgIEZYX0ZMT0FUIGZDb2xvcjI7CisgIEZYX0ZMT0FUIGZDb2xvcjM7CisgIEZYX0ZMT0FUIGZDb2xvcjQ7CiB9OwotY2xhc3MgQ1BWVF9Qcm92aWRlciA6IHB1YmxpYyBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlcgotewotcHVibGljOgorY2xhc3MgQ1BWVF9Qcm92aWRlciA6IHB1YmxpYyBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciB7CisgcHVibGljOgorICBDUFZUX1Byb3ZpZGVyKElQVlRfRm9udE1hcCogcEZvbnRNYXApOwogCi0gICAgQ1BWVF9Qcm92aWRlcihJUFZUX0ZvbnRNYXAgKiBwRm9udE1hcCk7CisgIHZpcnR1YWwgfkNQVlRfUHJvdmlkZXIoKTsKIAotICAgIHZpcnR1YWwgfkNQVlRfUHJvdmlkZXIoKTsKKyAgaW50MzJfdCBHZXRDaGFyV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQsIGludDMyX3QgbldvcmRTdHlsZSk7CiAKLSAgICBpbnQzMl90CQkJCQkJR2V0Q2hhcldpZHRoKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkLCBpbnQzMl90IG5Xb3JkU3R5bGUpOworICBpbnQzMl90IEdldFR5cGVBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KTsKIAotICAgIGludDMyX3QJCQkJCQlHZXRUeXBlQXNjZW50KGludDMyX3QgbkZvbnRJbmRleCk7CisgIGludDMyX3QgR2V0VHlwZURlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KTsKIAotICAgIGludDMyX3QJCQkJCQlHZXRUeXBlRGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgpOworICBpbnQzMl90IEdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCk7CiAKLSAgICBpbnQzMl90CQkJCQkJR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgaW50MzJfdCBuRm9udEluZGV4KTsKKyAgRlhfQk9PTCBJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpOwogCi0gICAgRlhfQk9PTAkJCQkJCQlJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpOworICBpbnQzMl90IEdldERlZmF1bHRGb250SW5kZXgoKTsKIAotICAgIGludDMyX3QJCQkJCQlHZXREZWZhdWx0Rm9udEluZGV4KCk7Ci1wcml2YXRlOgotCi0gICAgSVBWVF9Gb250TWFwICoJbV9wRm9udE1hcDsKKyBwcml2YXRlOgorICBJUFZUX0ZvbnRNYXAqIG1fcEZvbnRNYXA7CiB9OwotI2RlZmluZSBQQlNfU09MSUQJCQkwCi0jZGVmaW5lIFBCU19EQVNICQkJMQotI2RlZmluZSBQQlNfQkVWRUxFRAkJCTIKLSNkZWZpbmUgUEJTX0lOU0VUCQkJMwotI2RlZmluZSBQQlNfVU5ERVJMSU5FRAkJNAotY2xhc3MgQ1BWVF9HZW5lcmF0ZUFQCi17Ci1wdWJsaWM6CisjZGVmaW5lIFBCU19TT0xJRCAwCisjZGVmaW5lIFBCU19EQVNIIDEKKyNkZWZpbmUgUEJTX0JFVkVMRUQgMgorI2RlZmluZSBQQlNfSU5TRVQgMworI2RlZmluZSBQQlNfVU5ERVJMSU5FRCA0CitjbGFzcyBDUFZUX0dlbmVyYXRlQVAgeworIHB1YmxpYzoKKyAgc3RhdGljIEZYX0JPT0wgR2VuZXJhdGVUZXh0RmllbGRBUChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7CiAKLSAgICBzdGF0aWMgRlhfQk9PTAkJCQkJCQlHZW5lcmF0ZVRleHRGaWVsZEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7CisgIHN0YXRpYyBGWF9CT09MIEdlbmVyYXRlQ29tYm9Cb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKIAotICAgIHN0YXRpYyBGWF9CT09MCQkJCQkJCUdlbmVyYXRlQ29tYm9Cb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOworICBzdGF0aWMgRlhfQk9PTCBHZW5lcmF0ZUxpc3RCb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOwogCi0gICAgc3RhdGljIEZYX0JPT0wJCQkJCQkJR2VuZXJhdGVMaXN0Qm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdlbmVyYXRlRWRpdEFQKElQVlRfRm9udE1hcCogcEZvbnRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb250aW51b3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBTdWJXb3JkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwVmlzaWJsZSA9IE5VTEwpOwogCi0gICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZW5lcmF0ZUVkaXRBUChJUFZUX0ZvbnRNYXAgKiBwRm9udE1hcCwgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IsCi0gICAgICAgICAgICBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIEZYX0JPT0wgYkNvbnRpbnVvdXMsIEZYX1dPUkQgU3ViV29yZCA9IDAsIGNvbnN0IENQVlRfV29yZFJhbmdlICogcFZpc2libGUgPSBOVUxMKTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdlbmVyYXRlQm9yZGVyQVAoY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX0NvbG9yJiBjckxlZnRUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfQ29sb3ImIGNyUmlnaHRCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX0Rhc2gmIGRhc2gpOwogCi0gICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZW5lcmF0ZUJvcmRlckFQKGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0ZMT0FUIGZXaWR0aCwKLSAgICAgICAgICAgIGNvbnN0IENQVlRfQ29sb3IgJiBjb2xvciwgY29uc3QgQ1BWVF9Db2xvciAmIGNyTGVmdFRvcCwgY29uc3QgQ1BWVF9Db2xvciAmIGNyUmlnaHRCb3R0b20sCi0gICAgICAgICAgICBpbnQzMl90IG5TdHlsZSwgY29uc3QgQ1BWVF9EYXNoICYgZGFzaCk7Ci0KLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdlbmVyYXRlQ29sb3JBUChjb25zdCBDUFZUX0NvbG9yICYgY29sb3IsIGNvbnN0IEZYX0JPT0wgJiBiRmlsbE9yU3Ryb2tlKTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdlbmVyYXRlQ29sb3JBUChjb25zdCBDUFZUX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9CT09MJiBiRmlsbE9yU3Ryb2tlKTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZET0NfRlBERl9BUF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgKaW5kZXggNTdkMTc5MC4uMjJmZGY1NCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oCkBAIC00MiwxNjY0ICs0MiwxMjI2IEBACiBjbGFzcyBDUERGX1ZpZXdlclByZWZlcmVuY2VzOwogY2xhc3MgQ1hNTF9FbGVtZW50OwogCi1jbGFzcyBDUERGX05hbWVUcmVlCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX05hbWVUcmVlIHsKKyBwdWJsaWM6CisgIENQREZfTmFtZVRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCkgeyBtX3BSb290ID0gcFJvb3Q7IH0KIAotICAgIENQREZfTmFtZVRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCkKLSAgICB7Ci0gICAgICAgIG1fcFJvb3QgPSBwUm9vdDsKLSAgICB9CisgIENQREZfTmFtZVRyZWUoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjYXRlZ29yeSk7CiAKLSAgICBDUERGX05hbWVUcmVlKENQREZfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY2F0ZWdvcnkpOworICBDUERGX09iamVjdCogTG9va3VwVmFsdWUoaW50IG5JbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CiAKLSAgICBDUERGX09iamVjdCoJCUxvb2t1cFZhbHVlKGludCBuSW5kZXgsIENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OworICBDUERGX09iamVjdCogTG9va3VwVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CiAKLSAgICBDUERGX09iamVjdCoJCUxvb2t1cFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OworICBDUERGX0FycmF5KiBMb29rdXBOYW1lZERlc3QoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc05hbWUpOwogCi0gICAgQ1BERl9BcnJheSoJCQlMb29rdXBOYW1lZERlc3QoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzTmFtZSk7CisgIGludCBHZXRJbmRleChjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdDsKIAotICAgIGludAkJCQkJR2V0SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CisgIGludCBHZXRDb3VudCgpIGNvbnN0OwogCi0gICAgaW50CQkJCQlHZXRDb3VudCgpIGNvbnN0OworICBDUERGX0RpY3Rpb25hcnkqIEdldFJvb3QoKSBjb25zdCB7IHJldHVybiBtX3BSb290OyB9CiAKLQotICAgIENQREZfRGljdGlvbmFyeSoJR2V0Um9vdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wUm9vdDsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLQotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcFJvb3Q7CisgcHJvdGVjdGVkOgorICBDUERGX0RpY3Rpb25hcnkqIG1fcFJvb3Q7CiB9OwotY2xhc3MgQ1BERl9Cb29rbWFya1RyZWUKLXsKLXB1YmxpYzoKLSAgICBDUERGX0Jvb2ttYXJrVHJlZShDUERGX0RvY3VtZW50KiBwRG9jKSA6IG1fcERvY3VtZW50KHBEb2MpIHt9CitjbGFzcyBDUERGX0Jvb2ttYXJrVHJlZSB7CisgcHVibGljOgorICBDUERGX0Jvb2ttYXJrVHJlZShDUERGX0RvY3VtZW50KiBwRG9jKSA6IG1fcERvY3VtZW50KHBEb2MpIHt9CiAKLSAgICBDUERGX0Jvb2ttYXJrCQlHZXRGaXJzdENoaWxkKGNvbnN0IENQREZfQm9va21hcmsmIHBhcmVudCkgY29uc3Q7CisgIENQREZfQm9va21hcmsgR2V0Rmlyc3RDaGlsZChjb25zdCBDUERGX0Jvb2ttYXJrJiBwYXJlbnQpIGNvbnN0OwogCi0gICAgQ1BERl9Cb29rbWFyawkJR2V0TmV4dFNpYmxpbmcoY29uc3QgQ1BERl9Cb29rbWFyayYgYm9va21hcmspIGNvbnN0OworICBDUERGX0Jvb2ttYXJrIEdldE5leHRTaWJsaW5nKGNvbnN0IENQREZfQm9va21hcmsmIGJvb2ttYXJrKSBjb25zdDsKIAotICAgIENQREZfRG9jdW1lbnQqCQlHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50OyB9CisgIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KIAotcHJvdGVjdGVkOgotICAgIENQREZfRG9jdW1lbnQqCQltX3BEb2N1bWVudDsKKyBwcm90ZWN0ZWQ6CisgIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OwogfTsKLSNkZWZpbmUgUERGQk9PS01BUktfSVRBTElDCQkJMQotI2RlZmluZSBQREZCT09LTUFSS19CT0xECQkJMgotY2xhc3MgQ1BERl9Cb29rbWFyawotewotcHVibGljOgorI2RlZmluZSBQREZCT09LTUFSS19JVEFMSUMgMQorI2RlZmluZSBQREZCT09LTUFSS19CT0xEIDIKK2NsYXNzIENQREZfQm9va21hcmsgeworIHB1YmxpYzoKKyAgQ1BERl9Cb29rbWFyaygpIDogbV9wRGljdChOVUxMKSB7fQogCi0gICAgQ1BERl9Cb29rbWFyaygpIDogbV9wRGljdChOVUxMKSB7fQorICBleHBsaWNpdCBDUERGX0Jvb2ttYXJrKENQREZfRGljdGlvbmFyeSogcERpY3QpIDogbV9wRGljdChwRGljdCkge30KIAotICAgIGV4cGxpY2l0IENQREZfQm9va21hcmsoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7fQorICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0OyB9CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0OyB9CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX3BEaWN0ICE9IE5VTEw7IH0KIAotICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX3BEaWN0ICE9IE5VTEw7IH0KKyAgRlhfRFdPUkQgR2V0Q29sb3JSZWYoKSBjb25zdDsKIAotICAgIEZYX0RXT1JECQkJR2V0Q29sb3JSZWYoKSBjb25zdDsKKyAgRlhfRFdPUkQgR2V0Rm9udFN0eWxlKCkgY29uc3Q7CiAKLSAgICBGWF9EV09SRAkJCUdldEZvbnRTdHlsZSgpIGNvbnN0OworICBDRlhfV2lkZVN0cmluZyBHZXRUaXRsZSgpIGNvbnN0OwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCUdldFRpdGxlKCkgY29uc3Q7CisgIENQREZfRGVzdCBHZXREZXN0KENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkgY29uc3Q7CiAKLSAgICBDUERGX0Rlc3QJCQlHZXREZXN0KENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkgY29uc3Q7CisgIENQREZfQWN0aW9uIEdldEFjdGlvbigpIGNvbnN0OwogCi0gICAgQ1BERl9BY3Rpb24JCQlHZXRBY3Rpb24oKSBjb25zdDsKLQotICAgIENQREZfRGljdGlvbmFyeSoJbV9wRGljdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BEaWN0OwogfTsKLSNkZWZpbmUgUERGWk9PTV9YWVoJCQkJCTEKLSNkZWZpbmUgUERGWk9PTV9GSVRQQUdFCQkJCTIKLSNkZWZpbmUgUERGWk9PTV9GSVRIT1JaCQkJCTMKLSNkZWZpbmUgUERGWk9PTV9GSVRWRVJUCQkJCTQKLSNkZWZpbmUgUERGWk9PTV9GSVRSRUNUCQkJCTUKLSNkZWZpbmUgUERGWk9PTV9GSVRCQk9YCQkJCTYKLSNkZWZpbmUgUERGWk9PTV9GSVRCSE9SWgkJCTcKLSNkZWZpbmUgUERGWk9PTV9GSVRCVkVSVAkJCTgKLWNsYXNzIENQREZfRGVzdAotewotcHVibGljOgotICAgIENQREZfRGVzdCgpIDogbV9wT2JqKG51bGxwdHIpIHsgfQotICAgIGV4cGxpY2l0IENQREZfRGVzdChDUERGX09iamVjdCogcE9iaikgOiBtX3BPYmoocE9iaikgeyB9CisjZGVmaW5lIFBERlpPT01fWFlaIDEKKyNkZWZpbmUgUERGWk9PTV9GSVRQQUdFIDIKKyNkZWZpbmUgUERGWk9PTV9GSVRIT1JaIDMKKyNkZWZpbmUgUERGWk9PTV9GSVRWRVJUIDQKKyNkZWZpbmUgUERGWk9PTV9GSVRSRUNUIDUKKyNkZWZpbmUgUERGWk9PTV9GSVRCQk9YIDYKKyNkZWZpbmUgUERGWk9PTV9GSVRCSE9SWiA3CisjZGVmaW5lIFBERlpPT01fRklUQlZFUlQgOAorY2xhc3MgQ1BERl9EZXN0IHsKKyBwdWJsaWM6CisgIENQREZfRGVzdCgpIDogbV9wT2JqKG51bGxwdHIpIHt9CisgIGV4cGxpY2l0IENQREZfRGVzdChDUERGX09iamVjdCogcE9iaikgOiBtX3BPYmoocE9iaikge30KIAotICAgIG9wZXJhdG9yIGJvb2wgKCkgY29uc3QgeyByZXR1cm4gbV9wT2JqICE9IE5VTEw7IH0KLSAgICBDUERGX09iamVjdCogR2V0T2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqOyB9CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX3BPYmogIT0gTlVMTDsgfQorICBDUERGX09iamVjdCogR2V0T2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqOyB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0UmVtb3RlTmFtZSgpOwotICAgIGludAkJCQkJR2V0UGFnZUluZGV4KENQREZfRG9jdW1lbnQqIHBEb2MpOwotICAgIEZYX0RXT1JECQkJR2V0UGFnZU9iak51bSgpOwotICAgIGludAkJCQkJR2V0Wm9vbU1vZGUoKTsKLSAgICBGWF9GTE9BVAkJCUdldFBhcmFtKGludCBpbmRleCk7CisgIENGWF9CeXRlU3RyaW5nIEdldFJlbW90ZU5hbWUoKTsKKyAgaW50IEdldFBhZ2VJbmRleChDUERGX0RvY3VtZW50KiBwRG9jKTsKKyAgRlhfRFdPUkQgR2V0UGFnZU9iak51bSgpOworICBpbnQgR2V0Wm9vbU1vZGUoKTsKKyAgRlhfRkxPQVQgR2V0UGFyYW0oaW50IGluZGV4KTsKIAotcHJvdGVjdGVkOgotICAgIENQREZfT2JqZWN0KgkJbV9wT2JqOworIHByb3RlY3RlZDoKKyAgQ1BERl9PYmplY3QqIG1fcE9iajsKIH07Ci1jbGFzcyBDUERGX09DQ29udGV4dCA6IHB1YmxpYyBJUERGX09DQ29udGV4dAotewotcHVibGljOgorY2xhc3MgQ1BERl9PQ0NvbnRleHQgOiBwdWJsaWMgSVBERl9PQ0NvbnRleHQgeworIHB1YmxpYzoKKyAgZW51bSBVc2FnZVR5cGUgeyBWaWV3ID0gMCwgRGVzaWduLCBQcmludCwgRXhwb3J0IH07CiAKLSAgICBlbnVtIFVzYWdlVHlwZSB7Ci0gICAgICAgIFZpZXcgPSAwLAotICAgICAgICBEZXNpZ24sCi0gICAgICAgIFByaW50LAotICAgICAgICBFeHBvcnQKLSAgICB9OworICBDUERGX09DQ29udGV4dChDUERGX0RvY3VtZW50KiBwRG9jLCBVc2FnZVR5cGUgZVVzYWdlVHlwZSA9IFZpZXcpOwogCi0gICAgQ1BERl9PQ0NvbnRleHQoQ1BERl9Eb2N1bWVudCAqcERvYywgVXNhZ2VUeXBlIGVVc2FnZVR5cGUgPSBWaWV3KTsKKyAgdmlydHVhbCB+Q1BERl9PQ0NvbnRleHQoKTsKIAotICAgIHZpcnR1YWwgfkNQREZfT0NDb250ZXh0KCk7CisgIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KIAotICAgIENQREZfRG9jdW1lbnQqCUdldERvY3VtZW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEb2N1bWVudDsKLSAgICB9CisgIFVzYWdlVHlwZSBHZXRVc2FnZVR5cGUoKSBjb25zdCB7IHJldHVybiBtX2VVc2FnZVR5cGU7IH0KIAotICAgIFVzYWdlVHlwZQkJR2V0VXNhZ2VUeXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2VVc2FnZVR5cGU7Ci0gICAgfQorICBGWF9CT09MIENoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0dEaWN0KTsKIAotICAgIEZYX0JPT0wJCQlDaGVja09DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCk7CisgIHZvaWQgUmVzZXRPQ0NvbnRleHQoKTsKIAotICAgIHZvaWQJCQlSZXNldE9DQ29udGV4dCgpOwotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgRlhfQk9PTCBMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0dEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlZhbGlkQ29uZmlnKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQlMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NDb25maWcsIGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QsIEZYX0JPT0wgJmJWYWxpZENvbmZpZykgY29uc3Q7CisgIEZYX0JPT0wgTG9hZE9DR1N0YXRlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCUxvYWRPQ0dTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KSBjb25zdDsKKyAgRlhfQk9PTCBHZXRPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QpOwogCi0gICAgRlhfQk9PTAkJCUdldE9DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCk7CisgIEZYX0JPT0wgR2V0T0NHVkUoQ1BERl9BcnJheSogcEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRnJvbUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICBpbnQgbkxldmVsID0gMCk7CiAKLSAgICBGWF9CT09MCQkJR2V0T0NHVkUoQ1BERl9BcnJheSAqcEV4cHJlc3Npb24sIEZYX0JPT0wgYkZyb21Db25maWcsIGludCBuTGV2ZWwgPSAwKTsKKyAgRlhfQk9PTCBMb2FkT0NNRFN0YXRlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DTUREaWN0LCBGWF9CT09MIGJGcm9tQ29uZmlnKTsKIAotICAgIEZYX0JPT0wJCQlMb2FkT0NNRFN0YXRlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DTUREaWN0LCBGWF9CT09MIGJGcm9tQ29uZmlnKTsKKyAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CiAKLSAgICBDUERGX0RvY3VtZW50CQkqbV9wRG9jdW1lbnQ7CisgIFVzYWdlVHlwZSBtX2VVc2FnZVR5cGU7CiAKLSAgICBVc2FnZVR5cGUJCQltX2VVc2FnZVR5cGU7Ci0KLSAgICBzdGQ6Om1hcDxjb25zdCBDUERGX0RpY3Rpb25hcnkqLCBGWF9CT09MPiBtX09DR1N0YXRlczsKKyAgc3RkOjptYXA8Y29uc3QgQ1BERl9EaWN0aW9uYXJ5KiwgRlhfQk9PTD4gbV9PQ0dTdGF0ZXM7CiB9OwotY2xhc3MgQ1BERl9MV2luUGFyYW0KLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfTFdpblBhcmFtIHsKKyBwdWJsaWM6CisgIENQREZfTFdpblBhcmFtKENQREZfRGljdGlvbmFyeSogcERpY3QpIHsgbV9wRGljdCA9IHBEaWN0OyB9CiAKLSAgICBDUERGX0xXaW5QYXJhbShDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQotICAgIHsKLSAgICAgICAgbV9wRGljdCA9IHBEaWN0OwotICAgIH0KKyAgb3BlcmF0b3IgQ1BERl9EaWN0aW9uYXJ5KigpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3Q7IH0KIAotICAgIG9wZXJhdG9yIENQREZfRGljdGlvbmFyeSogKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0OwotICAgIH0KKyAgaW5saW5lIENGWF9CeXRlU3RyaW5nIEdldEZpbGVOYW1lKCkgeyByZXR1cm4gbV9wRGljdC0+R2V0U3RyaW5nKCJGIik7IH0KIAotICAgIGlubGluZSBDRlhfQnl0ZVN0cmluZwlHZXRGaWxlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0U3RyaW5nKCJGIik7Ci0gICAgfQorICBpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgR2V0RGVmYXVsdERpcmVjdG9yeSgpIHsKKyAgICByZXR1cm4gbV9wRGljdC0+R2V0U3RyaW5nKCJEIik7CisgIH0KIAorICBpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgR2V0T3BlcmF0aW9uKCkgeyByZXR1cm4gbV9wRGljdC0+R2V0U3RyaW5nKCJPIik7IH0KIAotICAgIGlubGluZSBDRlhfQnl0ZVN0cmluZwlHZXREZWZhdWx0RGlyZWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRTdHJpbmcoIkQiKTsKLSAgICB9CisgIGlubGluZSBDRlhfQnl0ZVN0cmluZyBHZXRQYXJhbWV0ZXIoKSB7IHJldHVybiBtX3BEaWN0LT5HZXRTdHJpbmcoIlAiKTsgfQogCi0KLSAgICBpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcJR2V0T3BlcmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRTdHJpbmcoIk8iKTsKLSAgICB9Ci0KLQotICAgIGlubGluZSBDRlhfQnl0ZVN0cmluZwlHZXRQYXJhbWV0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldFN0cmluZygiUCIpOwotICAgIH0KLQotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcERpY3Q7CisgIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKIH07Ci1jbGFzcyBDUERGX0FjdGlvbkZpZWxkcwotewotcHVibGljOgorY2xhc3MgQ1BERl9BY3Rpb25GaWVsZHMgeworIHB1YmxpYzoKKyAgQ1BERl9BY3Rpb25GaWVsZHMoY29uc3QgQ1BERl9BY3Rpb24qIHBBY3Rpb24pIHsKKyAgICBtX3BBY3Rpb24gPSAoQ1BERl9BY3Rpb24qKXBBY3Rpb247CisgIH0KIAotICAgIENQREZfQWN0aW9uRmllbGRzKGNvbnN0IENQREZfQWN0aW9uKiBwQWN0aW9uKQotICAgIHsKLSAgICAgICAgbV9wQWN0aW9uID0gKENQREZfQWN0aW9uKilwQWN0aW9uOwotICAgIH0KKyAgb3BlcmF0b3IgQ1BERl9BY3Rpb24qKCkgY29uc3QgeyByZXR1cm4gbV9wQWN0aW9uOyB9CiAKLSAgICBvcGVyYXRvciBDUERGX0FjdGlvbiooKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEFjdGlvbjsKLSAgICB9CisgIEZYX0RXT1JEIEdldEZpZWxkc0NvdW50KCkgY29uc3Q7CiAKLSAgICBGWF9EV09SRAkJCQlHZXRGaWVsZHNDb3VudCgpIGNvbnN0OworICB2b2lkIEdldEFsbEZpZWxkcyhDRlhfUHRyQXJyYXkmIGZpZWxkT2JqZWN0cykgY29uc3Q7CiAKLSAgICB2b2lkCQkJCQlHZXRBbGxGaWVsZHMoQ0ZYX1B0ckFycmF5JiBmaWVsZE9iamVjdHMpIGNvbnN0OworICBDUERGX09iamVjdCogR2V0RmllbGQoRlhfRFdPUkQgaUluZGV4KSBjb25zdDsKIAotICAgIENQREZfT2JqZWN0KgkJCUdldEZpZWxkKEZYX0RXT1JEIGlJbmRleCkgY29uc3Q7Ci0KLSAgICBDUERGX0FjdGlvbioJCQltX3BBY3Rpb247CisgIENQREZfQWN0aW9uKiBtX3BBY3Rpb247CiB9OwogCi0jZGVmaW5lIFBERk5BTUVEX05FWFRQQUdFCQkxCi0jZGVmaW5lIFBERk5BTUVEX1BSRVZQQUdFCQkyCi0jZGVmaW5lIFBERk5BTUVEX0ZJUlNUUEFHRQkJMwotI2RlZmluZSBQREZOQU1FRF9MQVNUUEFHRQkJNAotI2RlZmluZSBQREZKU19NQVhMRU5HVEgJCQk2NAotY2xhc3MgQ1BERl9BY3Rpb24KLXsKLXB1YmxpYzoKLSAgICBlbnVtIEFjdGlvblR5cGUgewotICAgICAgICBVbmtub3duID0gMCwKLSAgICAgICAgR29UbywKLSAgICAgICAgR29Ub1IsCi0gICAgICAgIEdvVG9FLAotICAgICAgICBMYXVuY2gsCi0gICAgICAgIFRocmVhZCwKLSAgICAgICAgVVJJLAotICAgICAgICBTb3VuZCwKLSAgICAgICAgTW92aWUsCi0gICAgICAgIEhpZGUsCi0gICAgICAgIE5hbWVkLAotICAgICAgICBTdWJtaXRGb3JtLAotICAgICAgICBSZXNldEZvcm0sCi0gICAgICAgIEltcG9ydERhdGEsCi0gICAgICAgIEphdmFTY3JpcHQsCi0gICAgICAgIFNldE9DR1N0YXRlLAotICAgICAgICBSZW5kaXRpb24sCi0gICAgICAgIFRyYW5zLAotICAgICAgICBHb1RvM0RWaWV3Ci0gICAgfTsKKyNkZWZpbmUgUERGTkFNRURfTkVYVFBBR0UgMQorI2RlZmluZSBQREZOQU1FRF9QUkVWUEFHRSAyCisjZGVmaW5lIFBERk5BTUVEX0ZJUlNUUEFHRSAzCisjZGVmaW5lIFBERk5BTUVEX0xBU1RQQUdFIDQKKyNkZWZpbmUgUERGSlNfTUFYTEVOR1RIIDY0CitjbGFzcyBDUERGX0FjdGlvbiB7CisgcHVibGljOgorICBlbnVtIEFjdGlvblR5cGUgeworICAgIFVua25vd24gPSAwLAorICAgIEdvVG8sCisgICAgR29Ub1IsCisgICAgR29Ub0UsCisgICAgTGF1bmNoLAorICAgIFRocmVhZCwKKyAgICBVUkksCisgICAgU291bmQsCisgICAgTW92aWUsCisgICAgSGlkZSwKKyAgICBOYW1lZCwKKyAgICBTdWJtaXRGb3JtLAorICAgIFJlc2V0Rm9ybSwKKyAgICBJbXBvcnREYXRhLAorICAgIEphdmFTY3JpcHQsCisgICAgU2V0T0NHU3RhdGUsCisgICAgUmVuZGl0aW9uLAorICAgIFRyYW5zLAorICAgIEdvVG8zRFZpZXcKKyAgfTsKIAotICAgIENQREZfQWN0aW9uKCkgOiBtX3BEaWN0KG51bGxwdHIpIHsgfQotICAgIGV4cGxpY2l0IENQREZfQWN0aW9uKENQREZfRGljdGlvbmFyeSogcERpY3QpIDogbV9wRGljdChwRGljdCkgeyB9CisgIENQREZfQWN0aW9uKCkgOiBtX3BEaWN0KG51bGxwdHIpIHt9CisgIGV4cGxpY2l0IENQREZfQWN0aW9uKENQREZfRGljdGlvbmFyeSogcERpY3QpIDogbV9wRGljdChwRGljdCkge30KIAotICAgIG9wZXJhdG9yIGJvb2wgKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdCAhPSBOVUxMOyB9CisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX3BEaWN0ICE9IE5VTEw7IH0KIAotICAgIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3Q7IH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdDsgfQogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldFR5cGVOYW1lKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRTdHJpbmcoIlMiKTsKLSAgICB9CisgIENGWF9CeXRlU3RyaW5nIEdldFR5cGVOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0U3RyaW5nKCJTIik7IH0KIAotICAgIEFjdGlvblR5cGUJCQlHZXRUeXBlKCkgY29uc3Q7CisgIEFjdGlvblR5cGUgR2V0VHlwZSgpIGNvbnN0OwogCi0gICAgQ1BERl9EZXN0CQkJR2V0RGVzdChDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdDsKKyAgQ1BERl9EZXN0IEdldERlc3QoQ1BERl9Eb2N1bWVudCogcERvYykgY29uc3Q7CiAKLSAgICBDRlhfV2lkZVN0cmluZwkJR2V0RmlsZVBhdGgoKSBjb25zdDsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0RmlsZVBhdGgoKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJR2V0TmV3V2luZG93KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJOZXdXaW5kb3ciKTsKLSAgICB9CisgIEZYX0JPT0wgR2V0TmV3V2luZG93KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiTmV3V2luZG93Iik7IH0KIAotICAgIENQREZfTFdpblBhcmFtCQlHZXRXaW5QYXJhbSgpIGNvbnN0OworICBDUERGX0xXaW5QYXJhbSBHZXRXaW5QYXJhbSgpIGNvbnN0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldFVSSShDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0VVJJKENQREZfRG9jdW1lbnQqIHBEb2MpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQlHZXRNb3VzZU1hcCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiSXNNYXAiKTsKLSAgICB9CisgIEZYX0JPT0wgR2V0TW91c2VNYXAoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJJc01hcCIpOyB9CiAKLSAgICBDUERGX0FjdGlvbkZpZWxkcwlHZXRXaWRnZXRzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KKyAgQ1BERl9BY3Rpb25GaWVsZHMgR2V0V2lkZ2V0cygpIGNvbnN0IHsgcmV0dXJuIHRoaXM7IH0KIAotICAgIEZYX0JPT0wJCQkJR2V0SGlkZVN0YXR1cygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiSCIsIFRSVUUpOwotICAgIH0KKyAgRlhfQk9PTCBHZXRIaWRlU3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiSCIsIFRSVUUpOyB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0TmFtZWRBY3Rpb24oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldFN0cmluZygiTiIpOwotICAgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZWRBY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3BEaWN0LT5HZXRTdHJpbmcoIk4iKTsgfQogCi0gICAgRlhfRFdPUkQJCQlHZXRGbGFncygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0SW50ZWdlcigiRmxhZ3MiKTsKLSAgICB9CisgIEZYX0RXT1JEIEdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0SW50ZWdlcigiRmxhZ3MiKTsgfQogCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCUdldEphdmFTY3JpcHQoKSBjb25zdDsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0SmF2YVNjcmlwdCgpIGNvbnN0OwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KglHZXRBbm5vdCgpIGNvbnN0OworICBDUERGX0RpY3Rpb25hcnkqIEdldEFubm90KCkgY29uc3Q7CiAKLSAgICBpbnQzMl90CQkJCUdldE9wZXJhdGlvblR5cGUoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRPcGVyYXRpb25UeXBlKCkgY29uc3Q7CiAKLSAgICBDUERGX1N0cmVhbSoJCUdldFNvdW5kU3RyZWFtKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRTdHJlYW0oIlNvdW5kIik7Ci0gICAgfQorICBDUERGX1N0cmVhbSogR2V0U291bmRTdHJlYW0oKSBjb25zdCB7IHJldHVybiBtX3BEaWN0LT5HZXRTdHJlYW0oIlNvdW5kIik7IH0KIAotICAgIEZYX0ZMT0FUCQkJR2V0Vm9sdW1lKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXROdW1iZXIoIlZvbHVtZSIpOwotICAgIH0KKyAgRlhfRkxPQVQgR2V0Vm9sdW1lKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0TnVtYmVyKCJWb2x1bWUiKTsgfQogCi0gICAgRlhfQk9PTAkJCQlJc1N5bmNocm9ub3VzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJTeW5jaHJvbm91cyIpOwotICAgIH0KKyAgRlhfQk9PTCBJc1N5bmNocm9ub3VzKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiU3luY2hyb25vdXMiKTsgfQogCi0gICAgRlhfQk9PTAkJCQlJc1JlcGVhdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiUmVwZWF0Iik7Ci0gICAgfQorICBGWF9CT09MIElzUmVwZWF0KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiUmVwZWF0Iik7IH0KIAotICAgIEZYX0JPT0wJCQkJSXNNaXhQbGF5KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJNaXgiKTsKLSAgICB9CisgIEZYX0JPT0wgSXNNaXhQbGF5KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiTWl4Iik7IH0KIAotICAgIEZYX0RXT1JECQkJR2V0U3ViQWN0aW9uc0NvdW50KCkgY29uc3Q7CisgIEZYX0RXT1JEIEdldFN1YkFjdGlvbnNDb3VudCgpIGNvbnN0OwogCi0gICAgQ1BERl9BY3Rpb24JCQlHZXRTdWJBY3Rpb24oRlhfRFdPUkQgaUluZGV4KSBjb25zdDsKKyAgQ1BERl9BY3Rpb24gR2V0U3ViQWN0aW9uKEZYX0RXT1JEIGlJbmRleCkgY29uc3Q7CiAKLXByb3RlY3RlZDoKLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcERpY3Q7CisgcHJvdGVjdGVkOgorICBDUERGX0RpY3Rpb25hcnkqIG1fcERpY3Q7CiB9OwotY2xhc3MgQ1BERl9BQWN0aW9uCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0FBY3Rpb24geworIHB1YmxpYzoKKyAgQ1BERl9BQWN0aW9uKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMKSB7IG1fcERpY3QgPSBwRGljdDsgfQogCi0gICAgQ1BERl9BQWN0aW9uKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMKQotICAgIHsKLSAgICAgICAgbV9wRGljdCA9IHBEaWN0OwotICAgIH0KKyAgb3BlcmF0b3IgQ1BERl9EaWN0aW9uYXJ5KigpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3Q7IH0KIAotICAgIG9wZXJhdG9yIENQREZfRGljdGlvbmFyeSooKQljb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3Q7Ci0gICAgfQorICBlbnVtIEFBY3Rpb25UeXBlIHsKKyAgICBDdXJzb3JFbnRlciA9IDAsCisgICAgQ3Vyc29yRXhpdCwKKyAgICBCdXR0b25Eb3duLAorICAgIEJ1dHRvblVwLAorICAgIEdldEZvY3VzLAorICAgIExvc2VGb2N1cywKKyAgICBQYWdlT3BlbiwKKyAgICBQYWdlQ2xvc2UsCisgICAgUGFnZVZpc2libGUsCisgICAgUGFnZUludmlzaWJsZSwKKyAgICBPcGVuUGFnZSwKKyAgICBDbG9zZVBhZ2UsCisgICAgS2V5U3Ryb2tlLAorICAgIEZvcm1hdCwKKyAgICBWYWxpZGF0ZSwKKyAgICBDYWxjdWxhdGUsCisgICAgQ2xvc2VEb2N1bWVudCwKKyAgICBTYXZlRG9jdW1lbnQsCisgICAgRG9jdW1lbnRTYXZlZCwKKyAgICBQcmludERvY3VtZW50LAorICAgIERvY3VtZW50UHJpbnRlZAorICB9OwogCi0gICAgZW51bSBBQWN0aW9uVHlwZSB7Ci0gICAgICAgIEN1cnNvckVudGVyID0gMCwKLSAgICAgICAgQ3Vyc29yRXhpdCwKLSAgICAgICAgQnV0dG9uRG93biwKLSAgICAgICAgQnV0dG9uVXAsCi0gICAgICAgIEdldEZvY3VzLAotICAgICAgICBMb3NlRm9jdXMsCi0gICAgICAgIFBhZ2VPcGVuLAotICAgICAgICBQYWdlQ2xvc2UsCi0gICAgICAgIFBhZ2VWaXNpYmxlLAotICAgICAgICBQYWdlSW52aXNpYmxlLAotICAgICAgICBPcGVuUGFnZSwKLSAgICAgICAgQ2xvc2VQYWdlLAotICAgICAgICBLZXlTdHJva2UsCi0gICAgICAgIEZvcm1hdCwKLSAgICAgICAgVmFsaWRhdGUsCi0gICAgICAgIENhbGN1bGF0ZSwKLSAgICAgICAgQ2xvc2VEb2N1bWVudCwKLSAgICAgICAgU2F2ZURvY3VtZW50LAotICAgICAgICBEb2N1bWVudFNhdmVkLAotICAgICAgICBQcmludERvY3VtZW50LAotICAgICAgICBEb2N1bWVudFByaW50ZWQKLSAgICB9OworICBGWF9CT09MIEFjdGlvbkV4aXN0KEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJQWN0aW9uRXhpc3QoQUFjdGlvblR5cGUgZVR5cGUpIGNvbnN0OworICBDUERGX0FjdGlvbiBHZXRBY3Rpb24oQUFjdGlvblR5cGUgZVR5cGUpIGNvbnN0OwogCi0gICAgQ1BERl9BY3Rpb24JCQlHZXRBY3Rpb24oQUFjdGlvblR5cGUgZVR5cGUpIGNvbnN0OworICBGWF9QT1NJVElPTiBHZXRTdGFydFBvcygpIGNvbnN0OwogCi0gICAgRlhfUE9TSVRJT04JCQlHZXRTdGFydFBvcygpIGNvbnN0OworICBDUERGX0FjdGlvbiBHZXROZXh0QWN0aW9uKEZYX1BPU0lUSU9OJiBwb3MsIEFBY3Rpb25UeXBlJiBlVHlwZSkgY29uc3Q7CiAKLSAgICBDUERGX0FjdGlvbgkJCUdldE5leHRBY3Rpb24oRlhfUE9TSVRJT04mIHBvcywgQUFjdGlvblR5cGUmIGVUeXBlKSBjb25zdDsKLQotICAgIENQREZfRGljdGlvbmFyeSoJbV9wRGljdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BEaWN0OwogfTsKLWNsYXNzIENQREZfRG9jSlNBY3Rpb25zCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9Eb2NKU0FjdGlvbnMoQ1BERl9Eb2N1bWVudCogcERvYyk7CitjbGFzcyBDUERGX0RvY0pTQWN0aW9ucyB7CisgcHVibGljOgorICBDUERGX0RvY0pTQWN0aW9ucyhDUERGX0RvY3VtZW50KiBwRG9jKTsKIAorICBpbnQgQ291bnRKU0FjdGlvbnMoKSBjb25zdDsKIAotICAgIGludAkJCQkJQ291bnRKU0FjdGlvbnMoKSBjb25zdDsKKyAgQ1BERl9BY3Rpb24gR2V0SlNBY3Rpb24oaW50IGluZGV4LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdDsKIAotICAgIENQREZfQWN0aW9uCQkJR2V0SlNBY3Rpb24oaW50IGluZGV4LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdDsKKyAgQ1BERl9BY3Rpb24gR2V0SlNBY3Rpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CiAKLSAgICBDUERGX0FjdGlvbgkJCUdldEpTQWN0aW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OworICBpbnQgRmluZEpTQWN0aW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OwogCi0gICAgaW50CQkJCQlGaW5kSlNBY3Rpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CisgIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KIAotCi0gICAgQ1BERl9Eb2N1bWVudCoJCUdldERvY3VtZW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEb2N1bWVudDsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLQotICAgIENQREZfRG9jdW1lbnQqCQltX3BEb2N1bWVudDsKKyBwcm90ZWN0ZWQ6CisgIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OwogfTsKLWNsYXNzIENQREZfRmlsZVNwZWMKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfRmlsZVNwZWMgeworIHB1YmxpYzoKKyAgQ1BERl9GaWxlU3BlYygpOwogCi0gICAgQ1BERl9GaWxlU3BlYygpOworICBDUERGX0ZpbGVTcGVjKENQREZfT2JqZWN0KiBwT2JqKSB7IG1fcE9iaiA9IHBPYmo7IH0KIAotICAgIENQREZfRmlsZVNwZWMoQ1BERl9PYmplY3QgKnBPYmopCi0gICAgewotICAgICAgICBtX3BPYmogPSBwT2JqOwotICAgIH0KKyAgb3BlcmF0b3IgQ1BERl9PYmplY3QqKCkgY29uc3QgeyByZXR1cm4gbV9wT2JqOyB9CiAKLSAgICBvcGVyYXRvciBDUERGX09iamVjdCooKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iajsKLSAgICB9CisgIEZYX0JPT0wgSXNVUkwoKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQlJc1VSTCgpIGNvbnN0OworICBGWF9CT09MIEdldEZpbGVOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0ZpbGVOYW1lKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQlHZXRGaWxlTmFtZShDRlhfV2lkZVN0cmluZyAmd3NGaWxlTmFtZSkgY29uc3Q7CisgIENQREZfU3RyZWFtKiBHZXRGaWxlU3RyZWFtKCkgY29uc3Q7CiAKLSAgICBDUERGX1N0cmVhbSoJR2V0RmlsZVN0cmVhbSgpIGNvbnN0OworICB2b2lkIFNldEZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlTmFtZSwgRlhfQk9PTCBiVVJMID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCVNldEZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlTmFtZSwgRlhfQk9PTCBiVVJMID0gRkFMU0UpOwotcHJvdGVjdGVkOgotCi0gICAgQ1BERl9PYmplY3QJCSptX3BPYmo7CisgcHJvdGVjdGVkOgorICBDUERGX09iamVjdCogbV9wT2JqOwogfTsKLWNsYXNzIENQREZfTGlua0xpc3QKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfTGlua0xpc3QgeworIHB1YmxpYzoKKyAgQ1BERl9MaW5rTGlzdChDUERGX0RvY3VtZW50KiBwRG9jKSB7IG1fcERvY3VtZW50ID0gcERvYzsgfQogCi0gICAgQ1BERl9MaW5rTGlzdChDUERGX0RvY3VtZW50KiBwRG9jKQotICAgIHsKLSAgICAgICAgbV9wRG9jdW1lbnQgPSBwRG9jOwotICAgIH0KKyAgfkNQREZfTGlua0xpc3QoKTsKIAotICAgIH5DUERGX0xpbmtMaXN0KCk7CisgIENQREZfTGluayBHZXRMaW5rQXRQb2ludChDUERGX1BhZ2UqIHBQYWdlLCBGWF9GTE9BVCBwZGZfeCwgRlhfRkxPQVQgcGRmX3kpOwogCi0gICAgQ1BERl9MaW5rCQkJR2V0TGlua0F0UG9pbnQoQ1BERl9QYWdlKiBwUGFnZSwgRlhfRkxPQVQgcGRmX3gsIEZYX0ZMT0FUIHBkZl95KTsKKyAgaW50IENvdW50TGlua3MoQ1BERl9QYWdlKiBwUGFnZSk7CiAKLSAgICBpbnQJCQkJCUNvdW50TGlua3MoQ1BERl9QYWdlKiBwUGFnZSk7CisgIENQREZfTGluayBHZXRMaW5rKENQREZfUGFnZSogcFBhZ2UsIGludCBpbmRleCk7CiAKLSAgICBDUERGX0xpbmsJCQlHZXRMaW5rKENQREZfUGFnZSogcFBhZ2UsIGludCBpbmRleCk7CisgIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KIAotICAgIENQREZfRG9jdW1lbnQqCQlHZXREb2N1bWVudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRG9jdW1lbnQ7Ci0gICAgfQotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CiAKLSAgICBDUERGX0RvY3VtZW50KgkJbV9wRG9jdW1lbnQ7CisgIENGWF9NYXBQdHJUb1B0ciBtX1BhZ2VNYXA7CiAKLSAgICBDRlhfTWFwUHRyVG9QdHIJCW1fUGFnZU1hcDsKKyAgQ0ZYX1B0ckFycmF5KiBHZXRQYWdlTGlua3MoQ1BERl9QYWdlKiBwUGFnZSk7CiAKLSAgICBDRlhfUHRyQXJyYXkqCQlHZXRQYWdlTGlua3MoQ1BERl9QYWdlKiBwUGFnZSk7Ci0KLSAgICB2b2lkCQkJCUxvYWRQYWdlTGlua3MoQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1B0ckFycmF5KiBwTGlzdCk7CisgIHZvaWQgTG9hZFBhZ2VMaW5rcyhDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUHRyQXJyYXkqIHBMaXN0KTsKIH07Ci1jbGFzcyBDUERGX0xpbmsKLXsKLXB1YmxpYzoKLSAgICBDUERGX0xpbmsoKSA6IG1fcERpY3QobnVsbHB0cikgeyB9Ci0gICAgZXhwbGljaXQgQ1BERl9MaW5rKENQREZfRGljdGlvbmFyeSogcERpY3QpIDogbV9wRGljdChwRGljdCkgeyB9CitjbGFzcyBDUERGX0xpbmsgeworIHB1YmxpYzoKKyAgQ1BERl9MaW5rKCkgOiBtX3BEaWN0KG51bGxwdHIpIHt9CisgIGV4cGxpY2l0IENQREZfTGluayhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSA6IG1fcERpY3QocERpY3QpIHt9CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0OyB9CisgIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3Q7IH0KIAotICAgIENGWF9GbG9hdFJlY3QJCUdldFJlY3QoKTsKLSAgICBDUERGX0Rlc3QJCQlHZXREZXN0KENQREZfRG9jdW1lbnQqIHBEb2MpOwotICAgIENQREZfQWN0aW9uCQkJR2V0QWN0aW9uKCk7CisgIENGWF9GbG9hdFJlY3QgR2V0UmVjdCgpOworICBDUERGX0Rlc3QgR2V0RGVzdChDUERGX0RvY3VtZW50KiBwRG9jKTsKKyAgQ1BERl9BY3Rpb24gR2V0QWN0aW9uKCk7CiAKLXByb3RlY3RlZDoKLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcERpY3Q7CisgcHJvdGVjdGVkOgorICBDUERGX0RpY3Rpb25hcnkqIG1fcERpY3Q7CiB9OwogCi0jZGVmaW5lIEFOTk9URkxBR19JTlZJU0lCTEUgICAgIDB4MDAwMQotI2RlZmluZSBBTk5PVEZMQUdfSElEREVOICAgICAgICAweDAwMDIKLSNkZWZpbmUgQU5OT1RGTEFHX1BSSU5UICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIEFOTk9URkxBR19OT1pPT00gICAgICAgIDB4MDAwOAotI2RlZmluZSBBTk5PVEZMQUdfTk9ST1RBVEUgICAgICAweDAwMTAKLSNkZWZpbmUgQU5OT1RGTEFHX05PVklFVyAgICAgICAgMHgwMDIwCi0jZGVmaW5lIEFOTk9URkxBR19SRUFET05MWSAgICAgIDB4MDA0MAotI2RlZmluZSBBTk5PVEZMQUdfTE9DS0VEICAgICAgICAweDAwODAKLSNkZWZpbmUgQU5OT1RGTEFHX1RPR0dMRU5PVklFVyAgMHgwMTAwCisjZGVmaW5lIEFOTk9URkxBR19JTlZJU0lCTEUgMHgwMDAxCisjZGVmaW5lIEFOTk9URkxBR19ISURERU4gMHgwMDAyCisjZGVmaW5lIEFOTk9URkxBR19QUklOVCAweDAwMDQKKyNkZWZpbmUgQU5OT1RGTEFHX05PWk9PTSAweDAwMDgKKyNkZWZpbmUgQU5OT1RGTEFHX05PUk9UQVRFIDB4MDAxMAorI2RlZmluZSBBTk5PVEZMQUdfTk9WSUVXIDB4MDAyMAorI2RlZmluZSBBTk5PVEZMQUdfUkVBRE9OTFkgMHgwMDQwCisjZGVmaW5lIEFOTk9URkxBR19MT0NLRUQgMHgwMDgwCisjZGVmaW5lIEFOTk9URkxBR19UT0dHTEVOT1ZJRVcgMHgwMTAwCiAKLWNsYXNzIENQREZfQW5ub3QgOiBwdWJsaWMgQ0ZYX1ByaXZhdGVEYXRhCi17Ci0gIHB1YmxpYzoKLSAgICBlbnVtIEFwcGVhcmFuY2VNb2RlIHsKLSAgICAgICAgTm9ybWFsLAotICAgICAgICBSb2xsb3ZlciwKLSAgICAgICAgRG93bgotICAgIH07CitjbGFzcyBDUERGX0Fubm90IDogcHVibGljIENGWF9Qcml2YXRlRGF0YSB7CisgcHVibGljOgorICBlbnVtIEFwcGVhcmFuY2VNb2RlIHsgTm9ybWFsLCBSb2xsb3ZlciwgRG93biB9OwogCi0gICAgQ1BERl9Bbm5vdChDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX0Fubm90TGlzdCogcExpc3QpOwotICAgIH5DUERGX0Fubm90KCk7CisgIENQREZfQW5ub3QoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9Bbm5vdExpc3QqIHBMaXN0KTsKKyAgfkNQREZfQW5ub3QoKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIEdldFN1YlR5cGUoKSBjb25zdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3ViVHlwZSgpIGNvbnN0OwogCi0gICAgRlhfRFdPUkQgR2V0RmxhZ3MoKSBjb25zdDsKKyAgRlhfRFdPUkQgR2V0RmxhZ3MoKSBjb25zdDsKIAotICAgIHZvaWQgR2V0UmVjdChDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdDsKKyAgdm9pZCBHZXRSZWN0KENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0OwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRBbm5vdERpY3QoKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRBbm5vdERpY3QoKTsKIAotICAgIEZYX0JPT0wgRHJhd0FwcGVhcmFuY2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBlYXJhbmNlTW9kZSBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CisgIEZYX0JPT0wgRHJhd0FwcGVhcmFuY2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcHBlYXJhbmNlTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwogCi0gICAgRlhfQk9PTCBEcmF3SW5Db250ZXh0KGNvbnN0IENQREZfUGFnZSogcFBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZWFyYW5jZU1vZGUgbW9kZSk7CisgIEZYX0JPT0wgRHJhd0luQ29udGV4dChjb25zdCBDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVhcmFuY2VNb2RlIG1vZGUpOwogCi0gICAgdm9pZCBDbGVhckNhY2hlZEFQKCk7CisgIHZvaWQgQ2xlYXJDYWNoZWRBUCgpOwogCi0gICAgdm9pZCBEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CisgIHZvaWQgRHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CiAKLSAgICBDUERGX0Zvcm0qIEdldEFQRm9ybShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBBcHBlYXJhbmNlTW9kZSBtb2RlKTsKKyAgQ1BERl9Gb3JtKiBHZXRBUEZvcm0oY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQXBwZWFyYW5jZU1vZGUgbW9kZSk7CiAKLSAgcHJpdmF0ZToKLSAgICBDUERGX0RpY3Rpb25hcnkqIGNvbnN0IG1fcEFubm90RGljdDsKKyBwcml2YXRlOgorICBDUERGX0RpY3Rpb25hcnkqIGNvbnN0IG1fcEFubm90RGljdDsKIAotICAgIENQREZfQW5ub3RMaXN0KiBjb25zdCBtX3BMaXN0OworICBDUERGX0Fubm90TGlzdCogY29uc3QgbV9wTGlzdDsKIAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nIG1fc1N1YnR5cGU7CisgIGNvbnN0IENGWF9CeXRlU3RyaW5nIG1fc1N1YnR5cGU7CiAKLSAgICBDRlhfTWFwUHRyVG9QdHIgbV9BUE1hcDsKKyAgQ0ZYX01hcFB0clRvUHRyIG1fQVBNYXA7CiB9OwogCi1jbGFzcyBDUERGX0Fubm90TGlzdAotewotcHVibGljOgorY2xhc3MgQ1BERl9Bbm5vdExpc3QgeworIHB1YmxpYzoKKyAgQ1BERl9Bbm5vdExpc3QoQ1BERl9QYWdlKiBwUGFnZSk7CiAKLSAgICBDUERGX0Fubm90TGlzdChDUERGX1BhZ2UqIHBQYWdlKTsKKyAgfkNQREZfQW5ub3RMaXN0KCk7CiAKLSAgICB+Q1BERl9Bbm5vdExpc3QoKTsKKyAgdm9pZCBHZXRBbm5vdE1hdHJpeChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgmIG1hdHJpeCkgY29uc3Q7CiAKLSAgICB2b2lkCUdldEFubm90TWF0cml4KGNvbnN0IENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLCBDRlhfTWF0cml4ICZtYXRyaXgpIGNvbnN0OworICB2b2lkIEdldEFubm90UmVjdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0JiBydEFubm90KSBjb25zdDsKIAotICAgIHZvaWQJR2V0QW5ub3RSZWN0KGNvbnN0IENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLCBDUERGX1JlY3QgJnJ0QW5ub3QpIGNvbnN0OworICB2b2lkIERpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hvd1dpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwogCi0gICAgdm9pZAkJCQlEaXNwbGF5QW5ub3RzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0JPT0wgYlNob3dXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOworICB2b2lkIERpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmludGluZywKKyAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaG93V2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworICAgIERpc3BsYXlBbm5vdHMocFBhZ2UsIE5VTEwsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICBiU2hvd1dpZGdldCA/IDMgOiAxLCBwT3B0aW9ucywgTlVMTCk7CisgIH0KIAotICAgIHZvaWQJCQkJRGlzcGxheUFubm90cyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfQk9PTCBiU2hvd1dpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKLSAgICB7Ci0gICAgICAgIERpc3BsYXlBbm5vdHMocFBhZ2UsIE5VTEwsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBNYXRyaXgsIGJTaG93V2lkZ2V0ID8gMyA6IDEsIHBPcHRpb25zLCBOVUxMKTsKLSAgICB9CisgIHZvaWQgRGlzcGxheUFubm90cyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByaW50aW5nLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNob3dXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCogcENsaXBSZWN0KSB7CisgICAgRGlzcGxheUFubm90cyhwUGFnZSwgTlVMTCwgcENvbnRleHQsIGJQcmludGluZywgcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgIGJTaG93V2lkZ2V0ID8gMyA6IDEsIHBPcHRpb25zLCBwQ2xpcFJlY3QpOworICB9CiAKLSAgICB2b2lkCQkJCURpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0JPT0wgYlNob3dXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QgKnBDbGlwUmVjdCkKLSAgICB7Ci0gICAgICAgIERpc3BsYXlBbm5vdHMocFBhZ2UsIE5VTEwsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBNYXRyaXgsIGJTaG93V2lkZ2V0ID8gMyA6IDEsIHBPcHRpb25zLCBwQ2xpcFJlY3QpOwotICAgIH0KKyAgdm9pZCBEaXNwbGF5QW5ub3RzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByaW50aW5nLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QW5ub3RGbGFncywKKyAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUKiBwQ2xpcFJlY3QpOwogCi0gICAgdm9pZAkJCQlEaXNwbGF5QW5ub3RzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBkd0Fubm90RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QqIHBDbGlwUmVjdCk7CisgIENQREZfQW5ub3QqIEdldEF0KGludCBpbmRleCkgeyByZXR1cm4gKENQREZfQW5ub3QqKW1fQW5ub3RMaXN0LkdldEF0KGluZGV4KTsgfQogCisgIGludCBDb3VudCgpIHsgcmV0dXJuIG1fQW5ub3RMaXN0LkdldFNpemUoKTsgfQogCisgIGludCBHZXRJbmRleChDUERGX0Fubm90KiBwQW5ub3QpOwogCi0gICAgQ1BERl9Bbm5vdCoJCQlHZXRBdChpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gKENQREZfQW5ub3QqKW1fQW5ub3RMaXN0LkdldEF0KGluZGV4KTsKLSAgICB9CisgIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KIAotICAgIGludAkJCQkJQ291bnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQW5ub3RMaXN0LkdldFNpemUoKTsKLSAgICB9CisgcHJvdGVjdGVkOgorICBDRlhfUHRyQXJyYXkgbV9Bbm5vdExpc3Q7CiAKLSAgICBpbnQJCQkJCUdldEluZGV4KENQREZfQW5ub3QqIHBBbm5vdCk7CisgIENQREZfRGljdGlvbmFyeSogbV9wUGFnZURpY3Q7CiAKKyAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CiAKLSAgICBDUERGX0RvY3VtZW50KgkJR2V0RG9jdW1lbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERvY3VtZW50OwotICAgIH0KLXByb3RlY3RlZDoKKyAgQ0ZYX1B0ckFycmF5IG1fQm9yZGVyczsKIAotICAgIENGWF9QdHJBcnJheQkJbV9Bbm5vdExpc3Q7Ci0KLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcFBhZ2VEaWN0OwotCi0gICAgQ1BERl9Eb2N1bWVudCoJCW1fcERvY3VtZW50OwotCi0gICAgQ0ZYX1B0ckFycmF5CQltX0JvcmRlcnM7Ci0KLSAgICB2b2lkCQkJCURpc3BsYXlQYXNzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBGWF9CT09MIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpZGdldCwgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgRlhfUkVDVCogY2xpcF9yZWN0KTsKLSAgICBmcmllbmQgY2xhc3MJCUNQREZfQW5ub3Q7CisgIHZvaWQgRGlzcGxheVBhc3MoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsCisgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBGWF9SRUNUKiBjbGlwX3JlY3QpOworICBmcmllbmQgY2xhc3MgQ1BERl9Bbm5vdDsKIH07Ci0jZGVmaW5lIENPTE9SVFlQRV9UUkFOU1BBUkVOVAkwCi0jZGVmaW5lIENPTE9SVFlQRV9HUkFZCQkJMQotI2RlZmluZSBDT0xPUlRZUEVfUkdCCQkJMgotI2RlZmluZSBDT0xPUlRZUEVfQ01ZSwkJCTMKLWNsYXNzIENQREZfRGVmYXVsdEFwcGVhcmFuY2UKLXsKLXB1YmxpYzoKKyNkZWZpbmUgQ09MT1JUWVBFX1RSQU5TUEFSRU5UIDAKKyNkZWZpbmUgQ09MT1JUWVBFX0dSQVkgMQorI2RlZmluZSBDT0xPUlRZUEVfUkdCIDIKKyNkZWZpbmUgQ09MT1JUWVBFX0NNWUsgMworY2xhc3MgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSB7CisgcHVibGljOgorICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0RBID0gIiIpIHsgbV9jc0RBID0gY3NEQTsgfQogCi0gICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NEQSA9ICIiKQotICAgIHsKLSAgICAgICAgbV9jc0RBID0gY3NEQTsKLSAgICB9CisgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UoY29uc3QgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSYgY0RBKSB7CisgICAgbV9jc0RBID0gKENGWF9CeXRlU3RyaW5nKShDUERGX0RlZmF1bHRBcHBlYXJhbmNlJiljREE7CisgIH0KIAotICAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UoY29uc3QgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSYgY0RBKQotICAgIHsKLSAgICAgICAgbV9jc0RBID0gKENGWF9CeXRlU3RyaW5nKShDUERGX0RlZmF1bHRBcHBlYXJhbmNlJiljREE7Ci0gICAgfQorICBvcGVyYXRvciBDRlhfQnl0ZVN0cmluZygpIGNvbnN0IHsgcmV0dXJuIG1fY3NEQTsgfQogCisgIGNvbnN0IENQREZfRGVmYXVsdEFwcGVhcmFuY2UmIG9wZXJhdG9yPShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NEQSkgeworICAgIG1fY3NEQSA9IGNzREE7CisgICAgcmV0dXJuICp0aGlzOworICB9CiAKLSAgICBvcGVyYXRvciBDRlhfQnl0ZVN0cmluZygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9jc0RBOwotICAgIH0KKyAgY29uc3QgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSYgb3BlcmF0b3I9KGNvbnN0IENQREZfRGVmYXVsdEFwcGVhcmFuY2UmIGNEQSkgeworICAgIG1fY3NEQSA9IChDRlhfQnl0ZVN0cmluZykoQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSYpY0RBOworICAgIHJldHVybiAqdGhpczsKKyAgfQogCi0gICAgY29uc3QgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSYgb3BlcmF0b3IgPShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NEQSkKLSAgICB7Ci0gICAgICAgIG1fY3NEQSA9IGNzREE7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9CisgIEZYX0JPT0wgSGFzRm9udCgpOwogCi0gICAgY29uc3QgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSYgb3BlcmF0b3IgPShjb25zdCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlJiBjREEpCi0gICAgewotICAgICAgICBtX2NzREEgPSAoQ0ZYX0J5dGVTdHJpbmcpKENQREZfRGVmYXVsdEFwcGVhcmFuY2UmKWNEQTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Rm9udFN0cmluZygpOwogCisgIHZvaWQgR2V0Rm9udChDRlhfQnl0ZVN0cmluZyYgY3NGb250TmFtZVRhZywgRlhfRkxPQVQmIGZGb250U2l6ZSk7CiAKKyAgRlhfQk9PTCBIYXNDb2xvcihGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbiA9IEZBTFNFKTsKIAotICAgIEZYX0JPT0wJCQkJSGFzRm9udCgpOworICBDRlhfQnl0ZVN0cmluZyBHZXRDb2xvclN0cmluZyhGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbiA9IEZBTFNFKTsKIAotICAgIENGWF9CeXRlU3RyaW5nCQlHZXRGb250U3RyaW5nKCk7CisgIHZvaWQgR2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLAorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZjWzRdLAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCQlHZXRGb250KENGWF9CeXRlU3RyaW5nJiBjc0ZvbnROYW1lVGFnLCBGWF9GTE9BVCYgZkZvbnRTaXplKTsKKyAgdm9pZCBHZXRDb2xvcihGWF9BUkdCJiBjb2xvciwKKyAgICAgICAgICAgICAgICBpbnQmIGlDb2xvclR5cGUsCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24gPSBGQUxTRSk7CiAKKyAgRlhfQk9PTCBIYXNUZXh0TWF0cml4KCk7CiAKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0VGV4dE1hdHJpeFN0cmluZygpOwogCisgIENGWF9BZmZpbmVNYXRyaXggR2V0VGV4dE1hdHJpeCgpOwogCi0gICAgRlhfQk9PTAkJCQlIYXNDb2xvcihGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbiA9IEZBTFNFKTsKLQotICAgIENGWF9CeXRlU3RyaW5nCQlHZXRDb2xvclN0cmluZyhGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbiA9IEZBTFNFKTsKLQotICAgIHZvaWQJCQkJR2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSwgRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24gPSBGQUxTRSk7Ci0KLSAgICB2b2lkCQkJCUdldENvbG9yKEZYX0FSR0ImIGNvbG9yLCBpbnQmIGlDb2xvclR5cGUsIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOwotCi0KLQotCi0gICAgRlhfQk9PTAkJCQlIYXNUZXh0TWF0cml4KCk7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0VGV4dE1hdHJpeFN0cmluZygpOwotCi0gICAgQ0ZYX0FmZmluZU1hdHJpeAlHZXRUZXh0TWF0cml4KCk7Ci0KLXByb3RlY3RlZDoKLQotICAgIENGWF9CeXRlU3RyaW5nCQltX2NzREE7CisgcHJvdGVjdGVkOgorICBDRlhfQnl0ZVN0cmluZyBtX2NzREE7CiB9OwotI2RlZmluZSBGSUVMRFRZUEVfVU5LTk9XTgkJCTAKLSNkZWZpbmUgRklFTERUWVBFX1BVU0hCVVRUT04JCTEKLSNkZWZpbmUgRklFTERUWVBFX0NIRUNLQk9YCQkJMgotI2RlZmluZSBGSUVMRFRZUEVfUkFESU9CVVRUT04JCTMKLSNkZWZpbmUgRklFTERUWVBFX0NPTUJPQk9YCQkJNAotI2RlZmluZSBGSUVMRFRZUEVfTElTVEJPWAkJCTUKLSNkZWZpbmUgRklFTERUWVBFX1RFWFRGSUVMRAkJCTYKLSNkZWZpbmUgRklFTERUWVBFX1NJR05BVFVSRQkJCTcKLWNsYXNzIENQREZfSW50ZXJGb3JtIDogcHVibGljIENGWF9Qcml2YXRlRGF0YQotewotcHVibGljOgorI2RlZmluZSBGSUVMRFRZUEVfVU5LTk9XTiAwCisjZGVmaW5lIEZJRUxEVFlQRV9QVVNIQlVUVE9OIDEKKyNkZWZpbmUgRklFTERUWVBFX0NIRUNLQk9YIDIKKyNkZWZpbmUgRklFTERUWVBFX1JBRElPQlVUVE9OIDMKKyNkZWZpbmUgRklFTERUWVBFX0NPTUJPQk9YIDQKKyNkZWZpbmUgRklFTERUWVBFX0xJU1RCT1ggNQorI2RlZmluZSBGSUVMRFRZUEVfVEVYVEZJRUxEIDYKKyNkZWZpbmUgRklFTERUWVBFX1NJR05BVFVSRSA3CitjbGFzcyBDUERGX0ludGVyRm9ybSA6IHB1YmxpYyBDRlhfUHJpdmF0ZURhdGEgeworIHB1YmxpYzoKKyAgQ1BERl9JbnRlckZvcm0oQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9CT09MIGJVcGRhdGVBUCk7CiAKLSAgICBDUERGX0ludGVyRm9ybShDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIEZYX0JPT0wgYlVwZGF0ZUFQKTsKKyAgfkNQREZfSW50ZXJGb3JtKCk7CiAKLSAgICB+Q1BERl9JbnRlckZvcm0oKTsKKyAgc3RhdGljIHZvaWQgRW5hYmxlVXBkYXRlQVAoRlhfQk9PTCBiVXBkYXRlQVApOwogCisgIHN0YXRpYyBGWF9CT09MIFVwZGF0aW5nQVBFbmFibGVkKCk7CiAKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdlbmVyYXRlTmV3UmVzb3VyY2VOYW1lKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBjc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbkxlbiA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBjc1ByZWZpeCA9ICIiKTsKIAotICAgIHN0YXRpYyB2b2lkCQkJCUVuYWJsZVVwZGF0ZUFQKEZYX0JPT0wgYlVwZGF0ZUFQKTsKKyAgc3RhdGljIENQREZfRm9udCogQWRkU3lzdGVtRGVmYXVsdEZvbnQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KTsKIAotICAgIHN0YXRpYyBGWF9CT09MCQkJVXBkYXRpbmdBUEVuYWJsZWQoKTsKKyAgc3RhdGljIENQREZfRm9udCogQWRkU3lzdGVtRm9udChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGlDaGFyU2V0ID0gMSk7CiAKKyAgc3RhdGljIENQREZfRm9udCogQWRkU3lzdGVtRm9udChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGlDaGFyU2V0ID0gMSk7CiAKLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJR2VuZXJhdGVOZXdSZXNvdXJjZU5hbWUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwgY29uc3QgRlhfQ0hBUiogY3NUeXBlLCBpbnQgaU1pbkxlbiA9IDIsIGNvbnN0IEZYX0NIQVIqIGNzUHJlZml4ID0gIiIpOworICBzdGF0aWMgQ1BERl9Gb250KiBBZGRTdGFuZGFyZEZvbnQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSk7CiAKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldE5hdGl2ZUZvbnQodWludDhfdCBpQ2hhclNldCwgdm9pZCogcExvZ0ZvbnQgPSBOVUxMKTsKIAorICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0TmF0aXZlRm9udCh2b2lkKiBwTG9nRm9udCA9IE5VTEwpOwogCi0gICAgc3RhdGljIENQREZfRm9udCoJCUFkZFN5c3RlbURlZmF1bHRGb250KGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIHN0YXRpYyB1aW50OF90IEdldE5hdGl2ZUNoYXJTZXQoKTsKIAotICAgIHN0YXRpYyBDUERGX0ZvbnQqCQlBZGRTeXN0ZW1Gb250KGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgdWludDhfdCBpQ2hhclNldCA9IDEpOworICBzdGF0aWMgQ1BERl9Gb250KiBBZGROYXRpdmVGb250KHVpbnQ4X3QgaUNoYXJTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KTsKIAotICAgIHN0YXRpYyBDUERGX0ZvbnQqCQlBZGRTeXN0ZW1Gb250KGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX1dpZGVTdHJpbmcgY3NGb250TmFtZSwgdWludDhfdCBpQ2hhclNldCA9IDEpOworICBzdGF0aWMgQ1BERl9Gb250KiBBZGROYXRpdmVGb250KGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAKLSAgICBzdGF0aWMgQ1BERl9Gb250KgkJQWRkU3RhbmRhcmRGb250KGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSk7CisgIEZYX0JPT0wgVmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUpOwogCi0gICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCUdldE5hdGl2ZUZvbnQodWludDhfdCBpQ2hhclNldCwgdm9pZCogcExvZ0ZvbnQgPSBOVUxMKTsKKyAgRlhfQk9PTCBWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSk7CiAKLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJR2V0TmF0aXZlRm9udCh2b2lkKiBwTG9nRm9udCA9IE5VTEwpOworICBGWF9CT09MIFZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSk7CiAKLSAgICBzdGF0aWMgdWludDhfdAkJCUdldE5hdGl2ZUNoYXJTZXQoKTsKKyAgRlhfRFdPUkQgQ291bnRGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lID0gTCIiKTsKIAotICAgIHN0YXRpYyBDUERGX0ZvbnQqCQlBZGROYXRpdmVGb250KHVpbnQ4X3QgaUNoYXJTZXQsIGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIENQREZfRm9ybUZpZWxkKiBHZXRGaWVsZChGWF9EV09SRCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSA9IEwiIik7CiAKLSAgICBzdGF0aWMgQ1BERl9Gb250KgkJQWRkTmF0aXZlRm9udChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB2b2lkIEdldEFsbEZpZWxkTmFtZXMoQ0ZYX1dpZGVTdHJpbmdBcnJheSYgYWxsRmllbGROYW1lcyk7CiAKKyAgRlhfQk9PTCBJc1ZhbGlkRm9ybUZpZWxkKGNvbnN0IHZvaWQqIHBGaWVsZCk7CiAKKyAgQ1BERl9Gb3JtRmllbGQqIEdldEZpZWxkQnlEaWN0KENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCkgY29uc3Q7CiAKKyAgRlhfRFdPUkQgQ291bnRDb250cm9scyhDRlhfV2lkZVN0cmluZyBjc0ZpZWxkTmFtZSA9IEwiIik7CiAKLSAgICBGWF9CT09MCQkJCQlWYWxpZGF0ZUZpZWxkTmFtZShDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUsIGludCBpVHlwZSk7CisgIENQREZfRm9ybUNvbnRyb2wqIEdldENvbnRyb2woRlhfRFdPUkQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NGaWVsZE5hbWUgPSBMIiIpOwogCi0gICAgRlhfQk9PTAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lKTsKKyAgRlhfQk9PTCBJc1ZhbGlkRm9ybUNvbnRyb2woY29uc3Qgdm9pZCogcENvbnRyb2wpOwogCi0gICAgRlhfQk9PTAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wsIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSk7CisgIGludCBDb3VudFBhZ2VDb250cm9scyhDUERGX1BhZ2UqIHBQYWdlKSBjb25zdDsKIAorICBDUERGX0Zvcm1Db250cm9sKiBHZXRQYWdlQ29udHJvbChDUERGX1BhZ2UqIHBQYWdlLCBpbnQgaW5kZXgpIGNvbnN0OwogCisgIENQREZfRm9ybUNvbnRyb2wqIEdldENvbnRyb2xBdFBvaW50KENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHBkZl94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwZGZfeSkgY29uc3Q7CiAKKyAgQ1BERl9Gb3JtQ29udHJvbCogR2V0Q29udHJvbEJ5RGljdChDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KSBjb25zdDsKIAotICAgIEZYX0RXT1JECQkJCUNvdW50RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nICZjc0ZpZWxkTmFtZSA9IEwiIik7CisgIEZYX0RXT1JEIENvdW50SW50ZXJuYWxGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lID0gTCIiKSBjb25zdDsKIAotICAgIENQREZfRm9ybUZpZWxkKgkJCUdldEZpZWxkKEZYX0RXT1JEIGluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmY3NGaWVsZE5hbWUgPSBMIiIpOworICBDUERGX0RpY3Rpb25hcnkqIEdldEludGVybmFsRmllbGQoCisgICAgICBGWF9EV09SRCBpbmRleCwKKyAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSA9IEwiIikgY29uc3Q7CiAKLSAgICB2b2lkCQkJCQlHZXRBbGxGaWVsZE5hbWVzKENGWF9XaWRlU3RyaW5nQXJyYXkmIGFsbEZpZWxkTmFtZXMpOworICBDUERGX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50OyB9CiAKLSAgICBGWF9CT09MCQkJCQlJc1ZhbGlkRm9ybUZpZWxkKGNvbnN0IHZvaWQqIHBGaWVsZCk7CisgIENQREZfRGljdGlvbmFyeSogR2V0Rm9ybURpY3QoKSBjb25zdCB7IHJldHVybiBtX3BGb3JtRGljdDsgfQogCi0gICAgQ1BERl9Gb3JtRmllbGQqCQkJR2V0RmllbGRCeURpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KSBjb25zdDsKKyAgRlhfQk9PTCBOZWVkQ29uc3RydWN0QVAoKTsKIAorICB2b2lkIE5lZWRDb25zdHJ1Y3RBUChGWF9CT09MIGJOZWVkQVApOwogCisgIGludCBDb3VudEZpZWxkc0luQ2FsY3VsYXRpb25PcmRlcigpOwogCisgIENQREZfRm9ybUZpZWxkKiBHZXRGaWVsZEluQ2FsY3VsYXRpb25PcmRlcihpbnQgaW5kZXgpOwogCi0gICAgRlhfRFdPUkQJCQkJQ291bnRDb250cm9scyhDRlhfV2lkZVN0cmluZyBjc0ZpZWxkTmFtZSA9IEwiIik7CisgIGludCBGaW5kRmllbGRJbkNhbGN1bGF0aW9uT3JkZXIoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCk7CiAKLSAgICBDUERGX0Zvcm1Db250cm9sKgkJR2V0Q29udHJvbChGWF9EV09SRCBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcgY3NGaWVsZE5hbWUgPSBMIiIpOworICBGWF9EV09SRCBDb3VudEZvcm1Gb250cygpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNWYWxpZEZvcm1Db250cm9sKGNvbnN0IHZvaWQqIHBDb250cm9sKTsKKyAgQ1BERl9Gb250KiBHZXRGb3JtRm9udChGWF9EV09SRCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CiAKLSAgICBpbnQJCQkJCQlDb3VudFBhZ2VDb250cm9scyhDUERGX1BhZ2UqIHBQYWdlKSBjb25zdDsKKyAgQ1BERl9Gb250KiBHZXRGb3JtRm9udChDRlhfQnl0ZVN0cmluZyBjc05hbWVUYWcpOwogCi0gICAgQ1BERl9Gb3JtQ29udHJvbCoJCUdldFBhZ2VDb250cm9sKENQREZfUGFnZSogcFBhZ2UsIGludCBpbmRleCkgY29uc3Q7CisgIENQREZfRm9udCogR2V0Rm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CiAKKyAgQ1BERl9Gb250KiBHZXROYXRpdmVGb3JtRm9udCh1aW50OF90IGlDaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKIAotICAgIENQREZfRm9ybUNvbnRyb2wqCQlHZXRDb250cm9sQXRQb2ludChDUERGX1BhZ2UqIHBQYWdlLCBGWF9GTE9BVCBwZGZfeCwgRlhfRkxPQVQgcGRmX3kpIGNvbnN0OworICBDUERGX0ZvbnQqIEdldE5hdGl2ZUZvcm1Gb250KENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogCi0gICAgQ1BERl9Gb3JtQ29udHJvbCoJCUdldENvbnRyb2xCeURpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCkgY29uc3Q7CisgIEZYX0JPT0wgRmluZEZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwogCisgIEZYX0JPT0wgRmluZEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udComIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKIAorICBpbmxpbmUgRlhfQk9PTCBGaW5kRm9ybUZvbnQoQ0ZYX1dpZGVTdHJpbmcgY3NGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udComIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICAgIHJldHVybiBGaW5kRm9ybUZvbnQoUERGX0VuY29kZVRleHQoY3NGb250TmFtZSksIHBGb250LCBjc05hbWVUYWcpOworICB9CiAKKyAgdm9pZCBBZGRGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKIAotICAgIEZYX0RXT1JECQkJCUNvdW50SW50ZXJuYWxGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lID0gTCIiKSBjb25zdDsKKyAgQ1BERl9Gb250KiBBZGROYXRpdmVGb3JtRm9udCh1aW50OF90IGlDaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKIAotICAgIENQREZfRGljdGlvbmFyeSoJCUdldEludGVybmFsRmllbGQoRlhfRFdPUkQgaW5kZXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSA9IEwiIikgY29uc3Q7CisgIENQREZfRm9udCogQWRkTmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CiAKKyAgdm9pZCBSZW1vdmVGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250KTsKIAorICB2b2lkIFJlbW92ZUZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7CiAKKyAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBHZXREZWZhdWx0QXBwZWFyYW5jZSgpOwogCisgIENQREZfRm9udCogR2V0RGVmYXVsdEZvcm1Gb250KCk7CiAKLSAgICBDUERGX0RvY3VtZW50KgkJCUdldERvY3VtZW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEb2N1bWVudDsKLSAgICB9CisgIGludCBHZXRGb3JtQWxpZ25tZW50KCk7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXRGb3JtRGljdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRm9ybURpY3Q7Ci0gICAgfQorICBDUERGX0Zvcm1GaWVsZCogQ2hlY2tSZXF1aXJlZEZpZWxkcyhjb25zdCBDRlhfUHRyQXJyYXkqIGZpZWxkcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUgPSBUUlVFKSBjb25zdDsKIAorICBDRkRGX0RvY3VtZW50KiBFeHBvcnRUb0ZERihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYyA9IEZBTFNFKSBjb25zdDsKIAorICBDRkRGX0RvY3VtZW50KiBFeHBvcnRUb0ZERihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkmIGZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSA9IFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNpbXBsZUZpbGVTcGVjID0gRkFMU0UpIGNvbnN0OwogCisgIEZYX0JPT0wgSW1wb3J0RnJvbUZERihjb25zdCBDRkRGX0RvY3VtZW50KiBwRkRGRG9jLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CiAKLSAgICBGWF9CT09MCQkJCQlOZWVkQ29uc3RydWN0QVAoKTsKKyAgRlhfQk9PTCBSZXNldEZvcm0oY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUgPSBUUlVFLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CiAKLSAgICB2b2lkCQkJCQlOZWVkQ29uc3RydWN0QVAoRlhfQk9PTCBiTmVlZEFQKTsKKyAgRlhfQk9PTCBSZXNldEZvcm0oRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwogCi0KLQotCi0gICAgaW50CQkJCQkJQ291bnRGaWVsZHNJbkNhbGN1bGF0aW9uT3JkZXIoKTsKLQotICAgIENQREZfRm9ybUZpZWxkKgkJCUdldEZpZWxkSW5DYWxjdWxhdGlvbk9yZGVyKGludCBpbmRleCk7Ci0KLSAgICBpbnQJCQkJCQlGaW5kRmllbGRJbkNhbGN1bGF0aW9uT3JkZXIoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCk7Ci0KLQotCi0KLSAgICBGWF9EV09SRAkJCQlDb3VudEZvcm1Gb250cygpOwotCi0gICAgQ1BERl9Gb250KgkJCQlHZXRGb3JtRm9udChGWF9EV09SRCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci0KLSAgICBDUERGX0ZvbnQqCQkJCUdldEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7Ci0KLSAgICBDUERGX0ZvbnQqCQkJCUdldEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotCi0gICAgQ1BERl9Gb250KgkJCQlHZXROYXRpdmVGb3JtRm9udCh1aW50OF90IGlDaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKLQotICAgIENQREZfRm9udCoJCQkJR2V0TmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci0KLSAgICBGWF9CT09MCQkJCQlGaW5kRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci0KLSAgICBGWF9CT09MCQkJCQlGaW5kRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotCi0gICAgaW5saW5lIEZYX0JPT0wJCQlGaW5kRm9ybUZvbnQoQ0ZYX1dpZGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi0gICAgewotICAgICAgICByZXR1cm4gRmluZEZvcm1Gb250KFBERl9FbmNvZGVUZXh0KGNzRm9udE5hbWUpLCBwRm9udCwgY3NOYW1lVGFnKTsKLSAgICB9Ci0KLQotCi0KLQotICAgIHZvaWQJCQkJCUFkZEZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotCi0gICAgQ1BERl9Gb250KgkJCQlBZGROYXRpdmVGb3JtRm9udCh1aW50OF90IGlDaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKLQotICAgIENQREZfRm9udCoJCQkJQWRkTmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci0KLSAgICB2b2lkCQkJCQlSZW1vdmVGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250KTsKLQotICAgIHZvaWQJCQkJCVJlbW92ZUZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7Ci0KLQotCi0KLSAgICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlCUdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0KLSAgICBDUERGX0ZvbnQqCQkJCUdldERlZmF1bHRGb3JtRm9udCgpOwotCi0KLQotICAgIGludAkJCQkJCUdldEZvcm1BbGlnbm1lbnQoKTsKLQotCi0KLQotICAgIENQREZfRm9ybUZpZWxkKgkJCUNoZWNrUmVxdWlyZWRGaWVsZHMoY29uc3QgQ0ZYX1B0ckFycmF5ICpmaWVsZHMgPSBOVUxMLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlID0gVFJVRSkgY29uc3Q7Ci0KLSAgICBDRkRGX0RvY3VtZW50KiAJCQlFeHBvcnRUb0ZERihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLCBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYyA9IEZBTFNFKSBjb25zdDsKLQotICAgIENGREZfRG9jdW1lbnQqCQkJRXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUgPSBUUlVFLCBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYyA9IEZBTFNFKSBjb25zdDsKLQotICAgIEZYX0JPT0wJCQkJCUltcG9ydEZyb21GREYoY29uc3QgQ0ZERl9Eb2N1bWVudCogcEZERkRvYywgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwotCi0KLQotCi0gICAgRlhfQk9PTAkJCQkJUmVzZXRGb3JtKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlID0gVFJVRSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwotCi0gICAgRlhfQk9PTAkJCQkJUmVzZXRGb3JtKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKLQotICAgIHZvaWQJCQkJCVJlbG9hZEZvcm0oKTsKLQotICAgIENQREZfRm9ybU5vdGlmeSoJCUdldEZvcm1Ob3RpZnkoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEZvcm1Ob3RpZnk7Ci0gICAgfQotCi0gICAgdm9pZAkJCQkJU2V0Rm9ybU5vdGlmeShjb25zdCBDUERGX0Zvcm1Ob3RpZnkqIHBOb3RpZnkpOwotCi0KLSAgICBpbnQJCQkJCQlHZXRQYWdlV2l0aFdpZGdldChpbnQgaUN1clBhZ2UsIEZYX0JPT0wgYk5leHQpOworICB2b2lkIFJlbG9hZEZvcm0oKTsKIAorICBDUERGX0Zvcm1Ob3RpZnkqIEdldEZvcm1Ob3RpZnkoKSBjb25zdCB7IHJldHVybiBtX3BGb3JtTm90aWZ5OyB9CiAKKyAgdm9pZCBTZXRGb3JtTm90aWZ5KGNvbnN0IENQREZfRm9ybU5vdGlmeSogcE5vdGlmeSk7CiAKLSAgICBGWF9CT09MCQkJCQlJc1VwZGF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYlVwZGF0ZWQ7Ci0gICAgfQorICBpbnQgR2V0UGFnZVdpdGhXaWRnZXQoaW50IGlDdXJQYWdlLCBGWF9CT09MIGJOZXh0KTsKIAotICAgIHZvaWQJCQkJCUNsZWFyVXBkYXRlZEZsYWcoKQotICAgIHsKLSAgICAgICAgbV9iVXBkYXRlZCA9IEZBTFNFOwotICAgIH0KKyAgRlhfQk9PTCBJc1VwZGF0ZWQoKSB7IHJldHVybiBtX2JVcGRhdGVkOyB9CiAKKyAgdm9pZCBDbGVhclVwZGF0ZWRGbGFnKCkgeyBtX2JVcGRhdGVkID0gRkFMU0U7IH0KIAotICAgIEZYX0JPT0wJCQkJCUhhc1hGQUZvcm0oKSBjb25zdDsKKyAgRlhfQk9PTCBIYXNYRkFGb3JtKCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJCQlGaXhQYWdlRmllbGRzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UpOwotcHJvdGVjdGVkOgorICB2b2lkIEZpeFBhZ2VGaWVsZHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSk7CiAKLSAgICBzdGF0aWMgRlhfQk9PTAkJCW1fYlVwZGF0ZUFQOworIHByb3RlY3RlZDoKKyAgc3RhdGljIEZYX0JPT0wgbV9iVXBkYXRlQVA7CiAKLSAgICB2b2lkCQkJCQlMb2FkRmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBpbnQgbkxldmVsID0gMCk7CisgIHZvaWQgTG9hZEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgaW50IG5MZXZlbCA9IDApOwogCi0gICAgQ1BERl9PYmplY3QqCQkJR2V0RmllbGRBdHRyKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgY29uc3QgRlhfQ0hBUiogbmFtZSk7CisgIENQREZfT2JqZWN0KiBHZXRGaWVsZEF0dHIoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBjb25zdCBGWF9DSEFSKiBuYW1lKTsKIAotICAgIENQREZfRm9ybUZpZWxkKgkJCUFkZFRlcm1pbmFsRmllbGQoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KTsKKyAgQ1BERl9Gb3JtRmllbGQqIEFkZFRlcm1pbmFsRmllbGQoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KTsKIAotICAgIENQREZfRm9ybUNvbnRyb2wqCQlBZGRDb250cm9sKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFdpZGdldERpY3QpOworICBDUERGX0Zvcm1Db250cm9sKiBBZGRDb250cm9sKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCk7CiAKLSAgICB2b2lkCQkJCQlGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBwYXJlbnRfbmFtZSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UsIGludCBuTGV2ZWwgPSAwKTsKKyAgdm9pZCBGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBwYXJlbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGV2ZWwgPSAwKTsKIAotICAgIEZYX0JPT0wJCQkJCVZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlLCBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsIGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBFeGNsdWRlZENvbnRyb2wpOworICBGWF9CT09MIFZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBFeGNsdWRlZEZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBFeGNsdWRlZENvbnRyb2wpOwogCi0gICAgaW50CQkJCQkJQ29tcGFyZUZpZWxkTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgbmFtZTEsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lMik7CisgIGludCBDb21wYXJlRmllbGROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG5hbWUyKTsKIAotICAgIGludAkJCQkJCUNvbXBhcmVGaWVsZE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUxLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZTIpOworICBpbnQgQ29tcGFyZUZpZWxkTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZTEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lMik7CiAKLSAgICBDUERGX0RvY3VtZW50KgkJCW1fcERvY3VtZW50OworICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKIAotICAgIEZYX0JPT0wJCQkJCW1fYkdlbmVyYXRlQVA7CisgIEZYX0JPT0wgbV9iR2VuZXJhdGVBUDsKIAotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcEZvcm1EaWN0OworICBDUERGX0RpY3Rpb25hcnkqIG1fcEZvcm1EaWN0OwogCi0gICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9Db250cm9sTWFwOworICBDRlhfTWFwUHRyVG9QdHIgbV9Db250cm9sTWFwOwogCi0gICAgQ0ZpZWxkVHJlZSAqbV9wRmllbGRUcmVlOworICBDRmllbGRUcmVlKiBtX3BGaWVsZFRyZWU7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCW1fYnNFbmNvZGluZzsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9ic0VuY29kaW5nOwogCi0gICAgQ1BERl9Gb3JtTm90aWZ5KgkJbV9wRm9ybU5vdGlmeTsKKyAgQ1BERl9Gb3JtTm90aWZ5KiBtX3BGb3JtTm90aWZ5OwogCi0gICAgRlhfQk9PTAkJCQkJbV9iVXBkYXRlZDsKLSAgICBmcmllbmQgY2xhc3MgQ1BERl9Gb3JtQ29udHJvbDsKLSAgICBmcmllbmQgY2xhc3MgQ1BERl9Gb3JtRmllbGQ7CisgIEZYX0JPT0wgbV9iVXBkYXRlZDsKKyAgZnJpZW5kIGNsYXNzIENQREZfRm9ybUNvbnRyb2w7CisgIGZyaWVuZCBjbGFzcyBDUERGX0Zvcm1GaWVsZDsKIH07Ci0jZGVmaW5lIEZPUk1GSUVMRF9SRUFET05MWQkJMHgwMQotI2RlZmluZSBGT1JNRklFTERfUkVRVUlSRUQJCTB4MDIKLSNkZWZpbmUgRk9STUZJRUxEX05PRVhQT1JUCQkweDA0Ci0jZGVmaW5lIEZPUk1SQURJT19OT1RPR0dMRU9GRgkweDEwMAotI2RlZmluZSBGT1JNUkFESU9fVU5JU09OCQkweDIwMAotI2RlZmluZSBGT1JNVEVYVF9NVUxUSUxJTkUJCTB4MTAwCi0jZGVmaW5lIEZPUk1URVhUX1BBU1NXT1JECQkweDIwMAotI2RlZmluZSBGT1JNVEVYVF9OT1NDUk9MTAkJMHg0MDAKLSNkZWZpbmUgRk9STVRFWFRfQ09NQgkJCTB4ODAwCi0jZGVmaW5lIEZPUk1DT01CT19FRElUCQkJMHgxMDAKLSNkZWZpbmUgRk9STUxJU1RfTVVMVElTRUxFQ1QJMHgxMDAKLWNsYXNzIENQREZfRm9ybUZpZWxkCi17Ci1wdWJsaWM6CisjZGVmaW5lIEZPUk1GSUVMRF9SRUFET05MWSAweDAxCisjZGVmaW5lIEZPUk1GSUVMRF9SRVFVSVJFRCAweDAyCisjZGVmaW5lIEZPUk1GSUVMRF9OT0VYUE9SVCAweDA0CisjZGVmaW5lIEZPUk1SQURJT19OT1RPR0dMRU9GRiAweDEwMAorI2RlZmluZSBGT1JNUkFESU9fVU5JU09OIDB4MjAwCisjZGVmaW5lIEZPUk1URVhUX01VTFRJTElORSAweDEwMAorI2RlZmluZSBGT1JNVEVYVF9QQVNTV09SRCAweDIwMAorI2RlZmluZSBGT1JNVEVYVF9OT1NDUk9MTCAweDQwMAorI2RlZmluZSBGT1JNVEVYVF9DT01CIDB4ODAwCisjZGVmaW5lIEZPUk1DT01CT19FRElUIDB4MTAwCisjZGVmaW5lIEZPUk1MSVNUX01VTFRJU0VMRUNUIDB4MTAwCitjbGFzcyBDUERGX0Zvcm1GaWVsZCB7CisgcHVibGljOgorICBlbnVtIFR5cGUgeworICAgIFVua25vd24sCisgICAgUHVzaEJ1dHRvbiwKKyAgICBSYWRpb0J1dHRvbiwKKyAgICBDaGVja0JveCwKKyAgICBUZXh0LAorICAgIFJpY2hUZXh0LAorICAgIEZpbGUsCisgICAgTGlzdEJveCwKKyAgICBDb21ib0JveCwKKyAgICBTaWduCisgIH07CiAKLSAgICBlbnVtIFR5cGUgewotICAgICAgICBVbmtub3duLAotICAgICAgICBQdXNoQnV0dG9uLAotICAgICAgICBSYWRpb0J1dHRvbiwKLSAgICAgICAgQ2hlY2tCb3gsCi0gICAgICAgIFRleHQsCi0gICAgICAgIFJpY2hUZXh0LAotICAgICAgICBGaWxlLAotICAgICAgICBMaXN0Qm94LAotICAgICAgICBDb21ib0JveCwKLSAgICAgICAgU2lnbgotICAgIH07CisgIENGWF9XaWRlU3RyaW5nIEdldEZ1bGxOYW1lKCk7CiAKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldEZ1bGxOYW1lKCk7CisgIFR5cGUgR2V0VHlwZSgpIHsgcmV0dXJuIG1fVHlwZTsgfQogCi0gICAgVHlwZQkJCQkJR2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9UeXBlOwotICAgIH0KKyAgRlhfRFdPUkQgR2V0RmxhZ3MoKSB7IHJldHVybiBtX0ZsYWdzOyB9CiAKLSAgICBGWF9EV09SRAkJCQlHZXRGbGFncygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9GbGFnczsKLSAgICB9CisgIENQREZfSW50ZXJGb3JtKiBHZXRJbnRlckZvcm0oKSBjb25zdCB7IHJldHVybiBtX3BGb3JtOyB9CiAKLSAgICBDUERGX0ludGVyRm9ybSoJCQlHZXRJbnRlckZvcm0oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEZvcm07Ci0gICAgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldEZpZWxkRGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3Q7IH0KIAotICAgIENQREZfRGljdGlvbmFyeSoJCUdldEZpZWxkRGljdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdDsKLSAgICB9CisgIHZvaWQgU2V0RmllbGREaWN0KENQREZfRGljdGlvbmFyeSogcERpY3QpIHsgbV9wRGljdCA9IHBEaWN0OyB9CiAKLSAgICB2b2lkCQkJCQlTZXRGaWVsZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLSAgICB7Ci0gICAgICAgIG1fcERpY3QgPSBwRGljdDsKLSAgICB9CisgIEZYX0JPT0wgUmVzZXRGaWVsZChGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CiAKLSAgICBGWF9CT09MCQkJCQlSZXNldEZpZWxkKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKKyAgaW50IENvdW50Q29udHJvbHMoKSB7IHJldHVybiBtX0NvbnRyb2xMaXN0LkdldFNpemUoKTsgfQogCisgIENQREZfRm9ybUNvbnRyb2wqIEdldENvbnRyb2woaW50IGluZGV4KSB7CisgICAgcmV0dXJuIChDUERGX0Zvcm1Db250cm9sKiltX0NvbnRyb2xMaXN0LkdldEF0KGluZGV4KTsKKyAgfQogCisgIGludCBHZXRDb250cm9sSW5kZXgoY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpOwogCi0gICAgaW50CQkJCQkJQ291bnRDb250cm9scygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9Db250cm9sTGlzdC5HZXRTaXplKCk7Ci0gICAgfQorICBpbnQgR2V0RmllbGRUeXBlKCk7CiAKLSAgICBDUERGX0Zvcm1Db250cm9sKgkJR2V0Q29udHJvbChpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gKENQREZfRm9ybUNvbnRyb2wqKW1fQ29udHJvbExpc3QuR2V0QXQoaW5kZXgpOwotICAgIH0KKyAgQ1BERl9BQWN0aW9uIEdldEFkZGl0aW9uYWxBY3Rpb24oKTsKIAotICAgIGludAkJCQkJCUdldENvbnRyb2xJbmRleChjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCk7CisgIENGWF9XaWRlU3RyaW5nIEdldEFsdGVybmF0ZU5hbWUoKTsKIAorICBDRlhfV2lkZVN0cmluZyBHZXRNYXBwaW5nTmFtZSgpOwogCisgIEZYX0RXT1JEIEdldEZpZWxkRmxhZ3MoKTsKIAorICBDRlhfQnl0ZVN0cmluZyBHZXREZWZhdWx0U3R5bGUoKTsKIAotICAgIGludAkJCQkJCUdldEZpZWxkVHlwZSgpOworICBDRlhfV2lkZVN0cmluZyBHZXRSaWNoVGV4dFN0cmluZygpOwogCisgIENGWF9XaWRlU3RyaW5nIEdldFZhbHVlKCk7CiAKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0RGVmYXVsdFZhbHVlKCk7CiAKKyAgRlhfQk9PTCBTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKIAotICAgIENQREZfQUFjdGlvbgkJCUdldEFkZGl0aW9uYWxBY3Rpb24oKTsKKyAgaW50IEdldE1heExlbigpOwogCisgIGludCBDb3VudFNlbGVjdGVkSXRlbXMoKTsKIAorICBpbnQgR2V0U2VsZWN0ZWRJbmRleChpbnQgaW5kZXgpOwogCisgIEZYX0JPT0wgQ2xlYXJTZWxlY3Rpb24oRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRBbHRlcm5hdGVOYW1lKCk7CisgIEZYX0JPT0wgSXNJdGVtU2VsZWN0ZWQoaW50IGluZGV4KTsKIAorICBGWF9CT09MIFNldEl0ZW1TZWxlY3Rpb24oaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CiAKKyAgRlhfQk9PTCBJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KTsKIAorICBpbnQgR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRNYXBwaW5nTmFtZSgpOworICBpbnQgQ291bnRPcHRpb25zKCk7CiAKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0T3B0aW9uTGFiZWwoaW50IGluZGV4KTsKIAorICBDRlhfV2lkZVN0cmluZyBHZXRPcHRpb25WYWx1ZShpbnQgaW5kZXgpOwogCisgIGludCBGaW5kT3B0aW9uKENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpOwogCi0gICAgRlhfRFdPUkQJCQkJR2V0RmllbGRGbGFncygpOworICBpbnQgRmluZE9wdGlvblZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc09wdFZhbHVlLCBpbnQgaVN0YXJ0SW5kZXggPSAwKTsKIAorICBGWF9CT09MIENoZWNrQ29udHJvbChpbnQgaUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hlY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwogCisgIGludCBHZXRUb3BWaXNpYmxlSW5kZXgoKTsKIAorICBpbnQgQ291bnRTZWxlY3RlZE9wdGlvbnMoKTsKIAotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0RGVmYXVsdFN0eWxlKCk7CisgIGludCBHZXRTZWxlY3RlZE9wdGlvbkluZGV4KGludCBpbmRleCk7CiAKKyAgRlhfQk9PTCBJc09wdGlvblNlbGVjdGVkKGludCBpT3B0SW5kZXgpOwogCisgIEZYX0JPT0wgU2VsZWN0T3B0aW9uKGludCBpT3B0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CiAKKyAgRlhfQk9PTCBDbGVhclNlbGVjdGVkT3B0aW9ucyhGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CiAKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldFJpY2hUZXh0U3RyaW5nKCk7Ci0KLQotCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRWYWx1ZSgpOwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXREZWZhdWx0VmFsdWUoKTsKLQotICAgIEZYX0JPT0wJCQkJCVNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwotCi0KLQotCi0KLSAgICBpbnQJCQkJCQlHZXRNYXhMZW4oKTsKLQotCi0KLQotICAgIGludAkJCQkJCUNvdW50U2VsZWN0ZWRJdGVtcygpOwotCi0gICAgaW50CQkJCQkJR2V0U2VsZWN0ZWRJbmRleChpbnQgaW5kZXgpOwotCi0gICAgRlhfQk9PTAkJCQkJQ2xlYXJTZWxlY3Rpb24oRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwotCi0gICAgRlhfQk9PTAkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50IGluZGV4KTsKLQotICAgIEZYX0JPT0wJCQkJCVNldEl0ZW1TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwotCi0gICAgRlhfQk9PTAkJCQkJSXNJdGVtRGVmYXVsdFNlbGVjdGVkKGludCBpbmRleCk7Ci0KLSAgICBpbnQJCQkJCQlHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCk7Ci0KLQotCi0KLSAgICBpbnQJCQkJCQlDb3VudE9wdGlvbnMoKTsKLQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0T3B0aW9uTGFiZWwoaW50IGluZGV4KTsKLQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0T3B0aW9uVmFsdWUoaW50IGluZGV4KTsKLQotICAgIGludAkJCQkJCUZpbmRPcHRpb24oQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCk7Ci0KLSAgICBpbnQJCQkJCQlGaW5kT3B0aW9uVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzT3B0VmFsdWUsIGludCBpU3RhcnRJbmRleCA9IDApOwotCi0KLQotCi0gICAgRlhfQk9PTAkJCQkJQ2hlY2tDb250cm9sKGludCBpQ29udHJvbEluZGV4LCBGWF9CT09MIGJDaGVja2VkLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7Ci0KLQotCi0KLSAgICBpbnQJCQkJCQlHZXRUb3BWaXNpYmxlSW5kZXgoKTsKLQotCi0KLQotICAgIGludAkJCQkJCUNvdW50U2VsZWN0ZWRPcHRpb25zKCk7Ci0KLSAgICBpbnQJCQkJCQlHZXRTZWxlY3RlZE9wdGlvbkluZGV4KGludCBpbmRleCk7Ci0KLSAgICBGWF9CT09MCQkJCQlJc09wdGlvblNlbGVjdGVkKGludCBpT3B0SW5kZXgpOwotCi0gICAgRlhfQk9PTAkJCQkJU2VsZWN0T3B0aW9uKGludCBpT3B0SW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7Ci0KLSAgICBGWF9CT09MCQkJCQlDbGVhclNlbGVjdGVkT3B0aW9ucyhGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7Ci0KLSAgICBGWF9CT09MCQkJCQlDbGVhck9wdGlvbnMoRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOw0KLQotICAgIGludAkJCQkJCUluc2VydE9wdGlvbihDRlhfV2lkZVN0cmluZyBjc09wdExhYmVsLCBpbnQgaW5kZXggPSAtMSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOw0KLQotICAgIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0ZvbnRTaXplOwotICAgIH0KLQotICAgIENQREZfRm9udCoJCQkJR2V0Rm9udCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRm9udDsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLQotICAgIENQREZfRm9ybUZpZWxkKENQREZfSW50ZXJGb3JtKiBwRm9ybSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7Ci0KLSAgICB+Q1BERl9Gb3JtRmllbGQoKTsKLQotICAgIENQREZfRm9ybUZpZWxkOjpUeXBlCW1fVHlwZTsKKyAgRlhfQk9PTCBDbGVhck9wdGlvbnMoRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwogCi0gICAgRlhfRFdPUkQJCQkJbV9GbGFnczsKKyAgaW50IEluc2VydE9wdGlvbihDRlhfV2lkZVN0cmluZyBjc09wdExhYmVsLAorICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC0xLAorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKIAotICAgIENQREZfSW50ZXJGb3JtKgkJCW1fcEZvcm07CisgIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgeyByZXR1cm4gbV9Gb250U2l6ZTsgfQogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wRGljdDsKKyAgQ1BERl9Gb250KiBHZXRGb250KCkgeyByZXR1cm4gbV9wRm9udDsgfQogCi0gICAgQ0ZYX1B0ckFycmF5CQkJbV9Db250cm9sTGlzdDsKLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX0ludGVyRm9ybTsKLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX0Zvcm1Db250cm9sOworIHByb3RlY3RlZDoKKyAgQ1BERl9Gb3JtRmllbGQoQ1BERl9JbnRlckZvcm0qIHBGb3JtLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKIAorICB+Q1BERl9Gb3JtRmllbGQoKTsKIAorICBDUERGX0Zvcm1GaWVsZDo6VHlwZSBtX1R5cGU7CiAKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldFZhbHVlKEZYX0JPT0wgYkRlZmF1bHQpOworICBGWF9EV09SRCBtX0ZsYWdzOwogCi0gICAgRlhfQk9PTAkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9CT09MIGJOb3RpZnkpOworICBDUERGX0ludGVyRm9ybSogbV9wRm9ybTsKIAorICBDUERGX0RpY3Rpb25hcnkqIG1fcERpY3Q7CiAKLSAgICB2b2lkCQkJCQlTeW5jRmllbGRGbGFncygpOworICBDRlhfUHRyQXJyYXkgbV9Db250cm9sTGlzdDsKKyAgZnJpZW5kIGNsYXNzIENQREZfSW50ZXJGb3JtOworICBmcmllbmQgY2xhc3MgQ1BERl9Gb3JtQ29udHJvbDsKIAotICAgIGludAkJCQkJCUZpbmRMaXN0U2VsKENQREZfU3RyaW5nKiBzdHIpOworICBDRlhfV2lkZVN0cmluZyBHZXRWYWx1ZShGWF9CT09MIGJEZWZhdWx0KTsKIAotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0T3B0aW9uVGV4dChpbnQgaW5kZXgsIGludCBzdWJfaW5kZXgpOworICBGWF9CT09MIFNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSk7CiAKLSAgICB2b2lkCQkJCQlMb2FkREEoKTsKKyAgdm9pZCBTeW5jRmllbGRGbGFncygpOwogCi0gICAgdm9pZAkJCQkJVXBkYXRlQVAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpOworICBpbnQgRmluZExpc3RTZWwoQ1BERl9TdHJpbmcqIHN0cik7CiAKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0T3B0aW9uVGV4dChpbnQgaW5kZXgsIGludCBzdWJfaW5kZXgpOwogCisgIHZvaWQgTG9hZERBKCk7CiAKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldENoZWNrVmFsdWUoRlhfQk9PTCBiRGVmYXVsdCk7CisgIHZvaWQgVXBkYXRlQVAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpOwogCi0gICAgRlhfQk9PTAkJCQkJU2V0Q2hlY2tWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIEZYX0JPT0wgYkRlZmF1bHQsIEZYX0JPT0wgYk5vdGlmeSk7CisgIENGWF9XaWRlU3RyaW5nIEdldENoZWNrVmFsdWUoRlhfQk9PTCBiRGVmYXVsdCk7CiAKKyAgRlhfQk9PTCBTZXRDaGVja1ZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpOwogCi0gICAgRlhfRkxPQVQJCQkJbV9Gb250U2l6ZTsKKyAgRlhfRkxPQVQgbV9Gb250U2l6ZTsKIAotICAgIENQREZfRm9udCoJCQkJbV9wRm9udDsKKyAgQ1BERl9Gb250KiBtX3BGb250OwogfTsKLUNQREZfT2JqZWN0KglGUERGX0dldEZpZWxkQXR0cihDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGNvbnN0IEZYX0NIQVIqIG5hbWUsIGludCBuTGV2ZWwgPSAwKTsKLWNsYXNzIENQREZfSWNvbkZpdAotewotcHVibGljOgorQ1BERl9PYmplY3QqIEZQREZfR2V0RmllbGRBdHRyKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGV2ZWwgPSAwKTsKK2NsYXNzIENQREZfSWNvbkZpdCB7CisgcHVibGljOgorICBDUERGX0ljb25GaXQoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IE5VTEwpIHsgbV9wRGljdCA9IHBEaWN0OyB9CiAKLSAgICBDUERGX0ljb25GaXQoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IE5VTEwpCi0gICAgewotICAgICAgICBtX3BEaWN0ID0gcERpY3Q7Ci0gICAgfQorICBvcGVyYXRvciBDUERGX0RpY3Rpb25hcnkqKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdDsgfQogCi0gICAgb3BlcmF0b3IgQ1BERl9EaWN0aW9uYXJ5KigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdDsKLSAgICB9CisgIGVudW0gU2NhbGVNZXRob2QgeyBBbHdheXMgPSAwLCBCaWdnZXIsIFNtYWxsZXIsIE5ldmVyIH07CiAKKyAgU2NhbGVNZXRob2QgR2V0U2NhbGVNZXRob2QoKTsKIAorICBGWF9CT09MIElzUHJvcG9ydGlvbmFsU2NhbGUoKTsKIAorICB2b2lkIEdldEljb25Qb3NpdGlvbihGWF9GTE9BVCYgZkxlZnQsIEZYX0ZMT0FUJiBmQm90dG9tKTsKIAotICAgIGVudW0gU2NhbGVNZXRob2QgewotICAgICAgICBBbHdheXMgPSAwLAotICAgICAgICBCaWdnZXIsCi0gICAgICAgIFNtYWxsZXIsCi0gICAgICAgIE5ldmVyCi0gICAgfTsKKyAgRlhfQk9PTCBHZXRGaXR0aW5nQm91bmRzKCk7CiAKLSAgICBTY2FsZU1ldGhvZAkJCQlHZXRTY2FsZU1ldGhvZCgpOwotCi0KLQotCi0gICAgRlhfQk9PTAkJCQkJSXNQcm9wb3J0aW9uYWxTY2FsZSgpOwotCi0KLQotCi0gICAgdm9pZAkJCQkJR2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUJiBmTGVmdCwgRlhfRkxPQVQmIGZCb3R0b20pOwotCi0KLQotCi0gICAgRlhfQk9PTAkJCQkJR2V0Rml0dGluZ0JvdW5kcygpOwotCi0KLSAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BEaWN0OworICBDUERGX0RpY3Rpb25hcnkqIG1fcERpY3Q7CiB9OwogCi0jZGVmaW5lIFRFWFRQT1NfQ0FQVElPTgkJMAotI2RlZmluZSBURVhUUE9TX0lDT04JCTEKLSNkZWZpbmUgVEVYVFBPU19CRUxPVwkJMgotI2RlZmluZSBURVhUUE9TX0FCT1ZFCQkzCi0jZGVmaW5lIFRFWFRQT1NfUklHSFQJCTQKLSNkZWZpbmUgVEVYVFBPU19MRUZUCQk1Ci0jZGVmaW5lIFRFWFRQT1NfT1ZFUkxBSUQJNgotY2xhc3MgQ1BERl9Gb3JtQ29udHJvbAotewotcHVibGljOgorI2RlZmluZSBURVhUUE9TX0NBUFRJT04gMAorI2RlZmluZSBURVhUUE9TX0lDT04gMQorI2RlZmluZSBURVhUUE9TX0JFTE9XIDIKKyNkZWZpbmUgVEVYVFBPU19BQk9WRSAzCisjZGVmaW5lIFRFWFRQT1NfUklHSFQgNAorI2RlZmluZSBURVhUUE9TX0xFRlQgNQorI2RlZmluZSBURVhUUE9TX09WRVJMQUlEIDYKK2NsYXNzIENQREZfRm9ybUNvbnRyb2wgeworIHB1YmxpYzoKKyAgQ1BERl9Gb3JtRmllbGQ6OlR5cGUgR2V0VHlwZSgpIHsgcmV0dXJuIG1fcEZpZWxkLT5HZXRUeXBlKCk7IH0KIAotICAgIENQREZfRm9ybUZpZWxkOjpUeXBlCUdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEZpZWxkLT5HZXRUeXBlKCk7Ci0gICAgfQorICBDUERGX0ludGVyRm9ybSogR2V0SW50ZXJGb3JtKCkgY29uc3QgeyByZXR1cm4gbV9wRm9ybTsgfQogCi0gICAgQ1BERl9JbnRlckZvcm0qCQkJR2V0SW50ZXJGb3JtKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BGb3JtOwotICAgIH0KKyAgQ1BERl9Gb3JtRmllbGQqIEdldEZpZWxkKCkgY29uc3QgeyByZXR1cm4gbV9wRmllbGQ7IH0KIAotICAgIENQREZfRm9ybUZpZWxkKgkJCUdldEZpZWxkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BGaWVsZDsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSogR2V0V2lkZ2V0KCkgY29uc3QgeyByZXR1cm4gbV9wV2lkZ2V0RGljdDsgfQogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJR2V0V2lkZ2V0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BXaWRnZXREaWN0OwotICAgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCBHZXRSZWN0KCk7CiAKLSAgICBDRlhfRmxvYXRSZWN0CQkJR2V0UmVjdCgpOworICB2b2lkIERyYXdDb250cm9sKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyA9IE5VTEwpOwogCi0gICAgdm9pZAkJCQkJRHJhd0NvbnRyb2woQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2UqIHBQYWdlLCBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zID0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIEdldENoZWNrZWRBUFN0YXRlKCk7CiAKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0RXhwb3J0VmFsdWUoKTsKIAorICBGWF9CT09MIElzQ2hlY2tlZCgpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXRDaGVja2VkQVBTdGF0ZSgpOworICBGWF9CT09MIElzRGVmYXVsdENoZWNrZWQoKTsKIAotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0RXhwb3J0VmFsdWUoKTsKKyAgZW51bSBIaWdobGlnaHRpbmdNb2RlIHsgTm9uZSA9IDAsIEludmVydCwgT3V0bGluZSwgUHVzaCwgVG9nZ2xlIH07CiAKLSAgICBGWF9CT09MCQkJCQlJc0NoZWNrZWQoKTsKKyAgSGlnaGxpZ2h0aW5nTW9kZSBHZXRIaWdobGlnaHRpbmdNb2RlKCk7CiAKLSAgICBGWF9CT09MCQkJCQlJc0RlZmF1bHRDaGVja2VkKCk7CisgIEZYX0JPT0wgSGFzTUtFbnRyeShDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KTsKIAorICBpbnQgR2V0Um90YXRpb24oKTsKIAorICBpbmxpbmUgRlhfQVJHQiBHZXRCb3JkZXJDb2xvcihpbnQmIGlDb2xvclR5cGUpIHsKKyAgICByZXR1cm4gR2V0Q29sb3IoaUNvbG9yVHlwZSwgIkJDIik7CisgIH0KIAorICBpbmxpbmUgRlhfRkxPQVQgR2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gR2V0T3JpZ2luYWxDb2xvcihpbmRleCwgIkJDIik7CisgIH0KIAotICAgIGVudW0gSGlnaGxpZ2h0aW5nTW9kZQl7Ci0gICAgICAgIE5vbmUgPSAwLAotICAgICAgICBJbnZlcnQsCi0gICAgICAgIE91dGxpbmUsCi0gICAgICAgIFB1c2gsCi0gICAgICAgIFRvZ2dsZQotICAgIH07CisgIGlubGluZSB2b2lkIEdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSkgeworICAgIEdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsICJCQyIpOworICB9CiAKLSAgICBIaWdobGlnaHRpbmdNb2RlCQlHZXRIaWdobGlnaHRpbmdNb2RlKCk7CisgIGlubGluZSBGWF9BUkdCIEdldEJhY2tncm91bmRDb2xvcihpbnQmIGlDb2xvclR5cGUpIHsKKyAgICByZXR1cm4gR2V0Q29sb3IoaUNvbG9yVHlwZSwgIkJHIik7CisgIH0KIAorICBpbmxpbmUgRlhfRkxPQVQgR2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaW50IGluZGV4KSB7CisgICAgcmV0dXJuIEdldE9yaWdpbmFsQ29sb3IoaW5kZXgsICJCRyIpOworICB9CiAKKyAgaW5saW5lIHZvaWQgR2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSkgeworICAgIEdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsICJCRyIpOworICB9CiAKKyAgaW5saW5lIENGWF9XaWRlU3RyaW5nIEdldE5vcm1hbENhcHRpb24oKSB7IHJldHVybiBHZXRDYXB0aW9uKCJDQSIpOyB9CiAKLSAgICBGWF9CT09MCQkJCQlIYXNNS0VudHJ5KENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOworICBpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgR2V0Um9sbG92ZXJDYXB0aW9uKCkgeyByZXR1cm4gR2V0Q2FwdGlvbigiUkMiKTsgfQogCisgIGlubGluZSBDRlhfV2lkZVN0cmluZyBHZXREb3duQ2FwdGlvbigpIHsgcmV0dXJuIEdldENhcHRpb24oIkFDIik7IH0KIAorICBpbmxpbmUgQ1BERl9TdHJlYW0qIEdldE5vcm1hbEljb24oKSB7IHJldHVybiBHZXRJY29uKCJJIik7IH0KIAorICBpbmxpbmUgQ1BERl9TdHJlYW0qIEdldFJvbGxvdmVySWNvbigpIHsgcmV0dXJuIEdldEljb24oIlJJIik7IH0KIAotICAgIGludAkJCQkJCUdldFJvdGF0aW9uKCk7CisgIGlubGluZSBDUERGX1N0cmVhbSogR2V0RG93bkljb24oKSB7IHJldHVybiBHZXRJY29uKCJJWCIpOyB9CiAKKyAgQ1BERl9JY29uRml0IEdldEljb25GaXQoKTsKIAorICBpbnQgR2V0VGV4dFBvc2l0aW9uKCk7CiAKKyAgQ1BERl9BY3Rpb24gR2V0QWN0aW9uKCk7CiAKLSAgICBpbmxpbmUgRlhfQVJHQgkJCUdldEJvcmRlckNvbG9yKGludCYgaUNvbG9yVHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRDb2xvcihpQ29sb3JUeXBlLCAiQkMiKTsKLSAgICB9CisgIENQREZfQUFjdGlvbiBHZXRBZGRpdGlvbmFsQWN0aW9uKCk7CiAKLSAgICBpbmxpbmUgRlhfRkxPQVQJCQlHZXRPcmlnaW5hbEJvcmRlckNvbG9yKGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRPcmlnaW5hbENvbG9yKGluZGV4LCAiQkMiKTsKLSAgICB9CisgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgR2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKIAotICAgIGlubGluZSB2b2lkCQkJCUdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSkKLSAgICB7Ci0gICAgICAgIEdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsICJCQyIpOwotICAgIH0KKyAgQ1BERl9Gb250KiBHZXREZWZhdWx0Q29udHJvbEZvbnQoKTsKIAorICBpbnQgR2V0Q29udHJvbEFsaWdubWVudCgpOwogCisgcHJvdGVjdGVkOgorICBDUERGX0Zvcm1Db250cm9sKENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENQREZfRGljdGlvbmFyeSogcFdpZGdldERpY3QpOwogCisgIENGWF9CeXRlU3RyaW5nIEdldE9uU3RhdGVOYW1lKCk7CiAKLSAgICBpbmxpbmUgRlhfQVJHQgkJCUdldEJhY2tncm91bmRDb2xvcihpbnQmIGlDb2xvclR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0Q29sb3IoaUNvbG9yVHlwZSwgIkJHIik7Ci0gICAgfQorICB2b2lkIFNldE9uU3RhdGVOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc09uKTsKIAotICAgIGlubGluZSBGWF9GTE9BVAkJCUdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRPcmlnaW5hbENvbG9yKGluZGV4LCAiQkciKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgdm9pZAkJCQlHZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdKQotICAgIHsKLSAgICAgICAgR2V0T3JpZ2luYWxDb2xvcihpQ29sb3JUeXBlLCBmYywgIkJHIik7Ci0gICAgfQotCi0KLQotCi0gICAgaW5saW5lIENGWF9XaWRlU3RyaW5nCUdldE5vcm1hbENhcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldENhcHRpb24oIkNBIik7Ci0gICAgfQotCi0KLQotCi0gICAgaW5saW5lIENGWF9XaWRlU3RyaW5nCUdldFJvbGxvdmVyQ2FwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0Q2FwdGlvbigiUkMiKTsKLSAgICB9Ci0KLQotCi0KLSAgICBpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcJR2V0RG93bkNhcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldENhcHRpb24oIkFDIik7Ci0gICAgfQotCi0KLQotCi0gICAgaW5saW5lIENQREZfU3RyZWFtKgkJR2V0Tm9ybWFsSWNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0SWNvbigiSSIpOwotICAgIH0KLQotCi0KLQotICAgIGlubGluZSBDUERGX1N0cmVhbSoJCUdldFJvbGxvdmVySWNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0SWNvbigiUkkiKTsKLSAgICB9Ci0KLQotCi0KLSAgICBpbmxpbmUgQ1BERl9TdHJlYW0qCQlHZXREb3duSWNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0SWNvbigiSVgiKTsKLSAgICB9Ci0KLQotCi0KLSAgICBDUERGX0ljb25GaXQJCQlHZXRJY29uRml0KCk7Ci0KLQotCi0KLSAgICBpbnQJCQkJCQlHZXRUZXh0UG9zaXRpb24oKTsKLQotCi0KLQotICAgIENQREZfQWN0aW9uCQkJCUdldEFjdGlvbigpOwotCi0KLQotCi0gICAgQ1BERl9BQWN0aW9uCQkJR2V0QWRkaXRpb25hbEFjdGlvbigpOwotCi0KLQotCi0gICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZQlHZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotCi0gICAgQ1BERl9Gb250KgkJCQlHZXREZWZhdWx0Q29udHJvbEZvbnQoKTsKLQotCi0KLQotICAgIGludAkJCQkJCUdldENvbnRyb2xBbGlnbm1lbnQoKTsKLQotcHJvdGVjdGVkOgotCi0gICAgQ1BERl9Gb3JtQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KTsKLQotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0T25TdGF0ZU5hbWUoKTsKLQotICAgIHZvaWQJCQkJCVNldE9uU3RhdGVOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc09uKTsKLQotICAgIHZvaWQJCQkJCUNoZWNrQ29udHJvbChGWF9CT09MIGJDaGVja2VkKTsKKyAgdm9pZCBDaGVja0NvbnRyb2woRlhfQk9PTCBiQ2hlY2tlZCk7CiAKLSAgICBGWF9BUkdCCQkJCQlHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOworICBGWF9BUkdCIEdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSk7CiAKLSAgICBGWF9GTE9BVAkJCQlHZXRPcmlnaW5hbENvbG9yKGludCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSk7CisgIEZYX0ZMT0FUIEdldE9yaWdpbmFsQ29sb3IoaW50IGluZGV4LCBDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KTsKIAotICAgIHZvaWQJCQkJCUdldE9yaWdpbmFsQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSwgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSk7CisgIHZvaWQgR2V0T3JpZ2luYWxDb2xvcihpbnQmIGlDb2xvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRDYXB0aW9uKENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOworICBDRlhfV2lkZVN0cmluZyBHZXRDYXB0aW9uKENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOwogCi0gICAgQ1BERl9TdHJlYW0qCQkJR2V0SWNvbihDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KTsKKyAgQ1BERl9TdHJlYW0qIEdldEljb24oQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSk7CiAKLSAgICBDUERGX0FwU2V0dGluZ3MJCQlHZXRNSyhGWF9CT09MIGJDcmVhdGUpOworICBDUERGX0FwU2V0dGluZ3MgR2V0TUsoRlhfQk9PTCBiQ3JlYXRlKTsKIAotICAgIENQREZfSW50ZXJGb3JtKgkJCW1fcEZvcm07CisgIENQREZfSW50ZXJGb3JtKiBtX3BGb3JtOwogCi0gICAgQ1BERl9Gb3JtRmllbGQqCQkJbV9wRmllbGQ7CisgIENQREZfRm9ybUZpZWxkKiBtX3BGaWVsZDsKIAotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcFdpZGdldERpY3Q7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9JbnRlckZvcm07Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9Gb3JtRmllbGQ7CisgIENQREZfRGljdGlvbmFyeSogbV9wV2lkZ2V0RGljdDsKKyAgZnJpZW5kIGNsYXNzIENQREZfSW50ZXJGb3JtOworICBmcmllbmQgY2xhc3MgQ1BERl9Gb3JtRmllbGQ7CiB9OwotY2xhc3MgQ1BERl9Gb3JtTm90aWZ5Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0Zvcm1Ob3RpZnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q1BERl9Gb3JtTm90aWZ5KCkge30KIAotICAgIHZpcnR1YWwgfkNQREZfRm9ybU5vdGlmeSgpIHt9CisgIHZpcnR1YWwgaW50IEJlZm9yZVZhbHVlQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KIAotICAgIHZpcnR1YWwgaW50CQlCZWZvcmVWYWx1ZUNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgdmlydHVhbCBpbnQgQWZ0ZXJWYWx1ZUNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKSB7IHJldHVybiAwOyB9CiAKLSAgICB2aXJ0dWFsIGludAkJQWZ0ZXJWYWx1ZUNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICB2aXJ0dWFsIGludCBCZWZvcmVTZWxlY3Rpb25DaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KIAotICAgIHZpcnR1YWwgaW50CQlCZWZvcmVTZWxlY3Rpb25DaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgIHZpcnR1YWwgaW50IEFmdGVyU2VsZWN0aW9uQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpIHsgcmV0dXJuIDA7IH0KIAotICAgIHZpcnR1YWwgaW50CQlBZnRlclNlbGVjdGlvbkNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICB2aXJ0dWFsIGludCBBZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlQXJyYXkmIHN0YXR1c0FycmF5KSB7CisgICAgcmV0dXJuIDA7CisgIH0KIAotICAgIHZpcnR1YWwgaW50CQlBZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgY29uc3QgQ0ZYX0J5dGVBcnJheSYgc3RhdHVzQXJyYXkpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgIHZpcnR1YWwgaW50IEJlZm9yZUZvcm1SZXNldChjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pIHsgcmV0dXJuIDA7IH0KIAotICAgIHZpcnR1YWwgaW50CQlCZWZvcmVGb3JtUmVzZXQoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICB2aXJ0dWFsIGludCBBZnRlckZvcm1SZXNldChjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pIHsgcmV0dXJuIDA7IH0KIAotICAgIHZpcnR1YWwgaW50CQlBZnRlckZvcm1SZXNldChjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgIHZpcnR1YWwgaW50IEJlZm9yZUZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkgeyByZXR1cm4gMDsgfQogCi0gICAgdmlydHVhbCBpbnQJCUJlZm9yZUZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50CQlBZnRlckZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgdmlydHVhbCBpbnQgQWZ0ZXJGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pIHsgcmV0dXJuIDA7IH0KIH07Ci1GWF9CT09MCQlGUERGX0dlbmVyYXRlQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKLWNsYXNzIENQREZfUGFnZUxhYmVsCi17Ci1wdWJsaWM6CitGWF9CT09MIEZQREZfR2VuZXJhdGVBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOworY2xhc3MgQ1BERl9QYWdlTGFiZWwgeworIHB1YmxpYzoKKyAgQ1BERl9QYWdlTGFiZWwoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KSB7IG1fcERvY3VtZW50ID0gcERvY3VtZW50OyB9CiAKLSAgICBDUERGX1BhZ2VMYWJlbChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpCi0gICAgewotICAgICAgICBtX3BEb2N1bWVudCA9IHBEb2N1bWVudDsKLSAgICB9CisgIENGWF9XaWRlU3RyaW5nIEdldExhYmVsKGludCBuUGFnZSkgY29uc3Q7CiAKKyAgaW50MzJfdCBHZXRQYWdlQnlMYWJlbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzTGFiZWwpIGNvbnN0OwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldExhYmVsKGludCBuUGFnZSkgY29uc3Q7CisgIGludDMyX3QgR2V0UGFnZUJ5TGFiZWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsKSBjb25zdDsKIAotICAgIGludDMyX3QJCQkJCQlHZXRQYWdlQnlMYWJlbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzTGFiZWwpIGNvbnN0OwotCi0KLSAgICBpbnQzMl90CQkJCQkJR2V0UGFnZUJ5TGFiZWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIENQREZfRG9jdW1lbnQqCQkJCQltX3BEb2N1bWVudDsKKyBwcm90ZWN0ZWQ6CisgIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OwogfTsKLWNsYXNzIENQREZfTWV0YWRhdGEKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfTWV0YWRhdGEgeworIHB1YmxpYzoKKyAgQ1BERl9NZXRhZGF0YSgpOwogCi0gICAgQ1BERl9NZXRhZGF0YSgpOworICB+Q1BERl9NZXRhZGF0YSgpOwogCisgIHZvaWQgTG9hZERvYyhDUERGX0RvY3VtZW50KiBwRG9jKTsKIAotICAgIH5DUERGX01ldGFkYXRhKCk7CisgIGludDMyX3QgR2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNJdGVtLCBDRlhfV2lkZVN0cmluZyYgd3NTdHIpOwogCi0gICAgdm9pZAkJCQlMb2FkRG9jKENQREZfRG9jdW1lbnQgKnBEb2MpOworICBDWE1MX0VsZW1lbnQqIEdldFJvb3QoKSBjb25zdDsKIAorICBDWE1MX0VsZW1lbnQqIEdldFJERigpIGNvbnN0OwogCi0gICAgaW50MzJfdAkJCUdldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzSXRlbSwgQ0ZYX1dpZGVTdHJpbmcgJndzU3RyKTsKLQotICAgIENYTUxfRWxlbWVudCoJCUdldFJvb3QoKSBjb25zdDsKLQotICAgIENYTUxfRWxlbWVudCoJCUdldFJERigpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdm9pZCoJbV9wRGF0YTsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQqIG1fcERhdGE7CiB9OwotY2xhc3MgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcwotewotcHVibGljOgorY2xhc3MgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB7CisgcHVibGljOgorICBDUERGX1ZpZXdlclByZWZlcmVuY2VzKENQREZfRG9jdW1lbnQqIHBEb2MpOwogCi0gICAgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyhDUERGX0RvY3VtZW50ICpwRG9jKTsKKyAgfkNQREZfVmlld2VyUHJlZmVyZW5jZXMoKTsKIAorICBGWF9CT09MIElzRGlyZWN0aW9uUjJMKCkgY29uc3Q7CiAKLSAgICB+Q1BERl9WaWV3ZXJQcmVmZXJlbmNlcygpOworICBGWF9CT09MIFByaW50U2NhbGluZygpIGNvbnN0OwogCisgIGludDMyX3QgTnVtQ29waWVzKCkgY29uc3Q7CiAKLSAgICBGWF9CT09MIElzRGlyZWN0aW9uUjJMKCkgY29uc3Q7CisgIENQREZfQXJyYXkqIFByaW50UGFnZVJhbmdlKCkgY29uc3Q7CiAKLSAgICBGWF9CT09MIFByaW50U2NhbGluZygpIGNvbnN0OworICBDRlhfQnl0ZVN0cmluZyBEdXBsZXgoKSBjb25zdDsKIAotICAgIGludDMyX3QgTnVtQ29waWVzKCkgY29uc3Q7Ci0KLSAgICBDUERGX0FycmF5KiBQcmludFBhZ2VSYW5nZSgpIGNvbnN0OwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgRHVwbGV4KCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICBDUERGX0RvY3VtZW50KgltX3BEb2M7CisgcHJvdGVjdGVkOgorICBDUERGX0RvY3VtZW50KiBtX3BEb2M7CiB9OwotY2xhc3MgQ1BERl9BcFNldHRpbmdzCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0FwU2V0dGluZ3MgeworIHB1YmxpYzoKKyAgQ1BERl9BcFNldHRpbmdzKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMKSB7IG1fcERpY3QgPSBwRGljdDsgfQogCi0gICAgQ1BERl9BcFNldHRpbmdzKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMKQotICAgIHsKLSAgICAgICAgbV9wRGljdCA9IHBEaWN0OwotICAgIH0KKyAgb3BlcmF0b3IgQ1BERl9EaWN0aW9uYXJ5KigpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3Q7IH0KIAotICAgIG9wZXJhdG9yIENQREZfRGljdGlvbmFyeSogKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0OwotICAgIH0KKyAgRlhfQk9PTCBIYXNNS0VudHJ5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSk7CiAKLSAgICBGWF9CT09MCQkJCQlIYXNNS0VudHJ5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSk7CisgIGludCBHZXRSb3RhdGlvbigpOwogCisgIGlubGluZSBGWF9BUkdCIEdldEJvcmRlckNvbG9yKGludCYgaUNvbG9yVHlwZSkgeworICAgIHJldHVybiBHZXRDb2xvcihpQ29sb3JUeXBlLCBGWF9CU1RSQygiQkMiKSk7CisgIH0KIAorICBpbmxpbmUgRlhfRkxPQVQgR2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gR2V0T3JpZ2luYWxDb2xvcihpbmRleCwgRlhfQlNUUkMoIkJDIikpOworICB9CiAKLSAgICBpbnQJCQkJCQlHZXRSb3RhdGlvbigpOworICBpbmxpbmUgdm9pZCBHZXRPcmlnaW5hbEJvcmRlckNvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0pIHsKKyAgICBHZXRPcmlnaW5hbENvbG9yKGlDb2xvclR5cGUsIGZjLCBGWF9CU1RSQygiQkMiKSk7CisgIH0KIAorICBpbmxpbmUgRlhfQVJHQiBHZXRCYWNrZ3JvdW5kQ29sb3IoaW50JiBpQ29sb3JUeXBlKSB7CisgICAgcmV0dXJuIEdldENvbG9yKGlDb2xvclR5cGUsIEZYX0JTVFJDKCJCRyIpKTsKKyAgfQogCisgIGlubGluZSBGWF9GTE9BVCBHZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gR2V0T3JpZ2luYWxDb2xvcihpbmRleCwgRlhfQlNUUkMoIkJHIikpOworICB9CiAKKyAgaW5saW5lIHZvaWQgR2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSkgeworICAgIEdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsIEZYX0JTVFJDKCJCRyIpKTsKKyAgfQogCi0gICAgaW5saW5lIEZYX0FSR0IJCQlHZXRCb3JkZXJDb2xvcihpbnQmIGlDb2xvclR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0Q29sb3IoaUNvbG9yVHlwZSwgRlhfQlNUUkMoIkJDIikpOwotICAgIH0KKyAgaW5saW5lIENGWF9XaWRlU3RyaW5nIEdldE5vcm1hbENhcHRpb24oKSB7CisgICAgcmV0dXJuIEdldENhcHRpb24oRlhfQlNUUkMoIkNBIikpOworICB9CiAKLSAgICBpbmxpbmUgRlhfRkxPQVQJCQlHZXRPcmlnaW5hbEJvcmRlckNvbG9yKGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRPcmlnaW5hbENvbG9yKGluZGV4LCBGWF9CU1RSQygiQkMiKSk7Ci0gICAgfQorICBpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgR2V0Um9sbG92ZXJDYXB0aW9uKCkgeworICAgIHJldHVybiBHZXRDYXB0aW9uKEZYX0JTVFJDKCJSQyIpKTsKKyAgfQogCi0gICAgaW5saW5lIHZvaWQJCQkJR2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdKQotICAgIHsKLSAgICAgICAgR2V0T3JpZ2luYWxDb2xvcihpQ29sb3JUeXBlLCBmYywgRlhfQlNUUkMoIkJDIikpOwotICAgIH0KKyAgaW5saW5lIENGWF9XaWRlU3RyaW5nIEdldERvd25DYXB0aW9uKCkgeyByZXR1cm4gR2V0Q2FwdGlvbihGWF9CU1RSQygiQUMiKSk7IH0KIAorICBpbmxpbmUgQ1BERl9TdHJlYW0qIEdldE5vcm1hbEljb24oKSB7IHJldHVybiBHZXRJY29uKEZYX0JTVFJDKCJJIikpOyB9CiAKKyAgaW5saW5lIENQREZfU3RyZWFtKiBHZXRSb2xsb3Zlckljb24oKSB7IHJldHVybiBHZXRJY29uKEZYX0JTVFJDKCJSSSIpKTsgfQogCisgIGlubGluZSBDUERGX1N0cmVhbSogR2V0RG93bkljb24oKSB7IHJldHVybiBHZXRJY29uKEZYX0JTVFJDKCJJWCIpKTsgfQogCi0gICAgaW5saW5lIEZYX0FSR0IJCQlHZXRCYWNrZ3JvdW5kQ29sb3IoaW50JiBpQ29sb3JUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldENvbG9yKGlDb2xvclR5cGUsIEZYX0JTVFJDKCJCRyIpKTsKLSAgICB9CisgIENQREZfSWNvbkZpdCBHZXRJY29uRml0KCk7CiAKLSAgICBpbmxpbmUgRlhfRkxPQVQJCQlHZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0T3JpZ2luYWxDb2xvcihpbmRleCwgRlhfQlNUUkMoIkJHIikpOwotICAgIH0KKyAgaW50IEdldFRleHRQb3NpdGlvbigpOwogCi0gICAgaW5saW5lIHZvaWQJCQkJR2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSkKLSAgICB7Ci0gICAgICAgIEdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsIEZYX0JTVFJDKCJCRyIpKTsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKIAorIHByb3RlY3RlZDoKKyAgRlhfQVJHQiBHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSk7CiAKKyAgRlhfRkxPQVQgR2V0T3JpZ2luYWxDb2xvcihpbnQgaW5kZXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSk7CiAKKyAgdm9pZCBHZXRPcmlnaW5hbENvbG9yKGludCYgaUNvbG9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KTsKIAotICAgIGlubGluZSBDRlhfV2lkZVN0cmluZwlHZXROb3JtYWxDYXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRDYXB0aW9uKEZYX0JTVFJDKCJDQSIpKTsKLSAgICB9CisgIENGWF9XaWRlU3RyaW5nIEdldENhcHRpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KTsKIAotCi0KLQotICAgIGlubGluZSBDRlhfV2lkZVN0cmluZwlHZXRSb2xsb3ZlckNhcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldENhcHRpb24oRlhfQlNUUkMoIlJDIikpOwotICAgIH0KLQotCi0KLQotICAgIGlubGluZSBDRlhfV2lkZVN0cmluZwlHZXREb3duQ2FwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0Q2FwdGlvbihGWF9CU1RSQygiQUMiKSk7Ci0gICAgfQotCi0KLQotCi0gICAgaW5saW5lIENQREZfU3RyZWFtKgkJR2V0Tm9ybWFsSWNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0SWNvbihGWF9CU1RSQygiSSIpKTsKLSAgICB9Ci0KLQotCi0KLSAgICBpbmxpbmUgQ1BERl9TdHJlYW0qCQlHZXRSb2xsb3Zlckljb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldEljb24oRlhfQlNUUkMoIlJJIikpOwotICAgIH0KLQotCi0KLQotICAgIGlubGluZSBDUERGX1N0cmVhbSoJCUdldERvd25JY29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRJY29uKEZYX0JTVFJDKCJJWCIpKTsKLSAgICB9Ci0KLQotCi0KLSAgICBDUERGX0ljb25GaXQJCQlHZXRJY29uRml0KCk7Ci0KLQotCi0KLSAgICBpbnQJCQkJCQlHZXRUZXh0UG9zaXRpb24oKTsKLQotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcERpY3Q7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBGWF9BUkdCCQkJCQlHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSk7Ci0KLSAgICBGWF9GTE9BVAkJCQlHZXRPcmlnaW5hbENvbG9yKGludCBpbmRleCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KTsKLQotICAgIHZvaWQJCQkJCUdldE9yaWdpbmFsQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KTsKLQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0Q2FwdGlvbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpOwotCi0gICAgQ1BERl9TdHJlYW0qCQkJR2V0SWNvbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpOwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfRm9ybUNvbnRyb2w7CisgIENQREZfU3RyZWFtKiBHZXRJY29uKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSk7CisgIGZyaWVuZCBjbGFzcyBDUERGX0Zvcm1Db250cm9sOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlBERkRPQ19GUERGX0RPQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaCBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdGFnZ2VkLmgKaW5kZXggNzA2ZjVjMC4uM2RlNjA0MSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oCkBAIC0xNCw4OSArMTQsOTMgQEAKIGNsYXNzIElQREZfUmVmbG93ZWRQYWdlOwogc3RydWN0IENQREZfU3RydWN0S2lkOwogCi1jbGFzcyBDUERGX1N0cnVjdFRyZWUKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfU3RydWN0VHJlZSB7CisgcHVibGljOgorICBzdGF0aWMgQ1BERl9TdHJ1Y3RUcmVlKiBMb2FkRG9jKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpOwogCi0gICAgc3RhdGljIENQREZfU3RydWN0VHJlZSogTG9hZERvYyhjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKTsKKyAgc3RhdGljIENQREZfU3RydWN0VHJlZSogTG9hZFBhZ2UoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpOwogCi0gICAgc3RhdGljIENQREZfU3RydWN0VHJlZSogTG9hZFBhZ2UoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpOworICB2aXJ0dWFsIH5DUERGX1N0cnVjdFRyZWUoKSB7fQogCi0gICAgdmlydHVhbCB+Q1BERl9TdHJ1Y3RUcmVlKCkge30KKyAgdmlydHVhbCBpbnQgQ291bnRUb3BFbGVtZW50cygpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgaW50CQkJQ291bnRUb3BFbGVtZW50cygpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgQ1BERl9TdHJ1Y3RFbGVtZW50KglHZXRUb3BFbGVtZW50KGludCBpKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ1BERl9TdHJ1Y3RFbGVtZW50KiBHZXRUb3BFbGVtZW50KGludCBpKSBjb25zdCA9IDA7CiB9Owogc3RydWN0IENQREZfU3RydWN0S2lkIHsKLSAgICBlbnVtIHsKLSAgICAgICAgSW52YWxpZCwKLSAgICAgICAgRWxlbWVudCwKLSAgICAgICAgUGFnZUNvbnRlbnQsCi0gICAgICAgIFN0cmVhbUNvbnRlbnQsCi0gICAgICAgIE9iamVjdAotICAgIH0gbV9UeXBlOworICBlbnVtIHsgSW52YWxpZCwgRWxlbWVudCwgUGFnZUNvbnRlbnQsIFN0cmVhbUNvbnRlbnQsIE9iamVjdCB9IG1fVHlwZTsKIAotICAgIHVuaW9uIHsKLSAgICAgICAgc3RydWN0IHsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBDUERGX1N0cnVjdEVsZW1lbnQqIG1fcEVsZW1lbnQ7CiAKLSAgICAgICAgICAgIENQREZfU3RydWN0RWxlbWVudCoJbV9wRWxlbWVudDsKKyAgICAgIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKKyAgICB9IG1fRWxlbWVudDsKKyAgICBzdHJ1Y3QgeworICAgICAgRlhfRFdPUkQgbV9QYWdlT2JqTnVtOwogCi0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqCW1fcERpY3Q7Ci0gICAgICAgIH0gbV9FbGVtZW50OwotICAgICAgICBzdHJ1Y3QgeworICAgICAgRlhfRFdPUkQgbV9Db250ZW50SWQ7CisgICAgfSBtX1BhZ2VDb250ZW50OworICAgIHN0cnVjdCB7CisgICAgICBGWF9EV09SRCBtX1BhZ2VPYmpOdW07CiAKLSAgICAgICAgICAgIEZYX0RXT1JECQkJbV9QYWdlT2JqTnVtOworICAgICAgRlhfRFdPUkQgbV9Db250ZW50SWQ7CiAKLSAgICAgICAgICAgIEZYX0RXT1JECQkJbV9Db250ZW50SWQ7Ci0gICAgICAgIH0gbV9QYWdlQ29udGVudDsKLSAgICAgICAgc3RydWN0IHsKKyAgICAgIEZYX0RXT1JEIG1fUmVmT2JqTnVtOworICAgIH0gbV9TdHJlYW1Db250ZW50OworICAgIHN0cnVjdCB7CisgICAgICBGWF9EV09SRCBtX1BhZ2VPYmpOdW07CiAKLSAgICAgICAgICAgIEZYX0RXT1JECQkJbV9QYWdlT2JqTnVtOwotCi0gICAgICAgICAgICBGWF9EV09SRAkJCW1fQ29udGVudElkOwotCi0gICAgICAgICAgICBGWF9EV09SRAkJCW1fUmVmT2JqTnVtOwotICAgICAgICB9IG1fU3RyZWFtQ29udGVudDsKLSAgICAgICAgc3RydWN0IHsKLQotICAgICAgICAgICAgRlhfRFdPUkQJCQltX1BhZ2VPYmpOdW07Ci0KLSAgICAgICAgICAgIEZYX0RXT1JECQkJbV9SZWZPYmpOdW07Ci0gICAgICAgIH0gbV9PYmplY3Q7Ci0gICAgfTsKKyAgICAgIEZYX0RXT1JEIG1fUmVmT2JqTnVtOworICAgIH0gbV9PYmplY3Q7CisgIH07CiB9OwotY2xhc3MgQ1BERl9TdHJ1Y3RFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+Q1BERl9TdHJ1Y3RFbGVtZW50KCkgeyB9CitjbGFzcyBDUERGX1N0cnVjdEVsZW1lbnQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q1BERl9TdHJ1Y3RFbGVtZW50KCkge30KIAotICAgIHZpcnR1YWwgQ1BERl9TdHJ1Y3RUcmVlKglHZXRUcmVlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQREZfU3RydWN0VHJlZSogR2V0VHJlZSgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCUdldFR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIEdldFR5cGUoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIENQREZfU3RydWN0RWxlbWVudCoJR2V0UGFyZW50KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQREZfU3RydWN0RWxlbWVudCogR2V0UGFyZW50KCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBDUERGX0RpY3Rpb25hcnkgKglHZXREaWN0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgaW50CQkJCQlDb3VudEtpZHMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50IENvdW50S2lkcygpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgY29uc3QgQ1BERl9TdHJ1Y3RLaWQmCUdldEtpZChpbnQgaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBjb25zdCBDUERGX1N0cnVjdEtpZCYgR2V0S2lkKGludCBpbmRleCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBDRlhfUHRyQXJyYXkqCQlHZXRPYmplY3RBcnJheSgpID0gMDsKKyAgdmlydHVhbCBDRlhfUHRyQXJyYXkqIEdldE9iamVjdEFycmF5KCkgPSAwOwogCi0gICAgdmlydHVhbCBDUERGX09iamVjdCoJCUdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBGWF9GTE9BVCBmTGV2ZWwgPSAwLjBGKSA9IDA7CisgIHZpcnR1YWwgQ1BERl9PYmplY3QqIEdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGV2ZWwgPSAwLjBGKSA9IDA7CiAKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKIAorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Q29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwogCi0gICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCUdldENvbG9yKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfQVJHQiBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9GTE9BVAkJCUdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludAkJCQkJR2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwotCisgIHZpcnR1YWwgaW50IEdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlBERkRPQ19GUERGX1RBR0dFRF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl92dC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl92dC5oCmluZGV4IDRiYWJhNDEuLjYyYTYwMTkgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgKQEAgLTIwLDQzNCArMjAsNDQzIEBACiBzdHJ1Y3QgQ1BWVF9Xb3JkUmFuZ2U7CiAKIHN0cnVjdCBDUFZUX1dvcmRQbGFjZSB7CisgIENQVlRfV29yZFBsYWNlKCkgOiBuU2VjSW5kZXgoLTEpLCBuTGluZUluZGV4KC0xKSwgbldvcmRJbmRleCgtMSkge30KIAotICAgIENQVlRfV29yZFBsYWNlKCkgOiBuU2VjSW5kZXgoLTEpLCBuTGluZUluZGV4KC0xKSwgbldvcmRJbmRleCgtMSkKLSAgICB7CisgIENQVlRfV29yZFBsYWNlKGludDMyX3Qgb3RoZXJfblNlY0luZGV4LAorICAgICAgICAgICAgICAgICBpbnQzMl90IG90aGVyX25MaW5lSW5kZXgsCisgICAgICAgICAgICAgICAgIGludDMyX3Qgb3RoZXJfbldvcmRJbmRleCkgeworICAgIG5TZWNJbmRleCA9IG90aGVyX25TZWNJbmRleDsKKyAgICBuTGluZUluZGV4ID0gb3RoZXJfbkxpbmVJbmRleDsKKyAgICBuV29yZEluZGV4ID0gb3RoZXJfbldvcmRJbmRleDsKKyAgfQorCisgIHZvaWQgRGVmYXVsdCgpIHsgblNlY0luZGV4ID0gbkxpbmVJbmRleCA9IG5Xb3JkSW5kZXggPSAtMTsgfQorCisgIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3ApIGNvbnN0IHsKKyAgICByZXR1cm4gd3AublNlY0luZGV4ID09IG5TZWNJbmRleCAmJiB3cC5uTGluZUluZGV4ID09IG5MaW5lSW5kZXggJiYKKyAgICAgICAgICAgd3AubldvcmRJbmRleCA9PSBuV29yZEluZGV4OworICB9CisKKyAgRlhfQk9PTCBvcGVyYXRvciE9KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cCkgY29uc3QgeworICAgIHJldHVybiB3cC5uU2VjSW5kZXggIT0gblNlY0luZGV4IHx8IHdwLm5MaW5lSW5kZXggIT0gbkxpbmVJbmRleCB8fAorICAgICAgICAgICB3cC5uV29yZEluZGV4ICE9IG5Xb3JkSW5kZXg7CisgIH0KKworICBpbmxpbmUgaW50MzJfdCBXb3JkQ21wKGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cCkgY29uc3QgeworICAgIGlmIChuU2VjSW5kZXggPiB3cC5uU2VjSW5kZXgpIHsKKyAgICAgIHJldHVybiAxOwogICAgIH0KLQotICAgIENQVlRfV29yZFBsYWNlKGludDMyX3Qgb3RoZXJfblNlY0luZGV4LAotICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3RoZXJfbkxpbmVJbmRleCwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IG90aGVyX25Xb3JkSW5kZXgpCi0gICAgewotICAgICAgICBuU2VjSW5kZXggPSBvdGhlcl9uU2VjSW5kZXg7Ci0gICAgICAgIG5MaW5lSW5kZXggPSBvdGhlcl9uTGluZUluZGV4OwotICAgICAgICBuV29yZEluZGV4ID0gb3RoZXJfbldvcmRJbmRleDsKKyAgICBpZiAoblNlY0luZGV4IDwgd3AublNlY0luZGV4KSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQotCi0gICAgdm9pZCBEZWZhdWx0KCkKLSAgICB7Ci0gICAgICAgIG5TZWNJbmRleCA9IG5MaW5lSW5kZXggPSBuV29yZEluZGV4ID0gLTE7CisgICAgaWYgKG5MaW5lSW5kZXggPiB3cC5uTGluZUluZGV4KSB7CisgICAgICByZXR1cm4gMTsKICAgICB9Ci0KLSAgICBGWF9CT09MIG9wZXJhdG9yID09IChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHdwLm5TZWNJbmRleCA9PSBuU2VjSW5kZXggJiYgd3AubkxpbmVJbmRleCA9PSBuTGluZUluZGV4ICYmIHdwLm5Xb3JkSW5kZXggPT0gbldvcmRJbmRleDsKKyAgICBpZiAobkxpbmVJbmRleCA8IHdwLm5MaW5lSW5kZXgpIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9Ci0KLSAgICBGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHdwLm5TZWNJbmRleCAhPSBuU2VjSW5kZXggfHwgd3AubkxpbmVJbmRleCAhPSBuTGluZUluZGV4IHx8IHdwLm5Xb3JkSW5kZXggIT0gbldvcmRJbmRleDsKKyAgICBpZiAobldvcmRJbmRleCA+IHdwLm5Xb3JkSW5kZXgpIHsKKyAgICAgIHJldHVybiAxOwogICAgIH0KLQotICAgIGlubGluZSBpbnQzMl90IFdvcmRDbXAoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChuU2VjSW5kZXggPiB3cC5uU2VjSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuU2VjSW5kZXggPCB3cC5uU2VjSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobkxpbmVJbmRleCA+IHdwLm5MaW5lSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuTGluZUluZGV4IDwgd3AubkxpbmVJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuV29yZEluZGV4ID4gd3AubldvcmRJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5Xb3JkSW5kZXggPCB3cC5uV29yZEluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKG5Xb3JkSW5kZXggPCB3cC5uV29yZEluZGV4KSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQorICAgIHJldHVybiAwOworICB9CiAKLSAgICBpbmxpbmUgaW50MzJfdCBMaW5lQ21wKGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3ApIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoblNlY0luZGV4ID4gd3AublNlY0luZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoblNlY0luZGV4IDwgd3AublNlY0luZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5MaW5lSW5kZXggPiB3cC5uTGluZUluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobkxpbmVJbmRleCA8IHdwLm5MaW5lSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgaW5saW5lIGludDMyX3QgTGluZUNtcChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3ApIGNvbnN0IHsKKyAgICBpZiAoblNlY0luZGV4ID4gd3AublNlY0luZGV4KSB7CisgICAgICByZXR1cm4gMTsKICAgICB9Ci0KLSAgICBpbmxpbmUgaW50MzJfdCBTZWNDbXAoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChuU2VjSW5kZXggPiB3cC5uU2VjSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuU2VjSW5kZXggPCB3cC5uU2VjSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoblNlY0luZGV4IDwgd3AublNlY0luZGV4KSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQorICAgIGlmIChuTGluZUluZGV4ID4gd3AubkxpbmVJbmRleCkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChuTGluZUluZGV4IDwgd3AubkxpbmVJbmRleCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogCi0gICAgaW50MzJfdAkJCQkJCQluU2VjSW5kZXg7CisgIGlubGluZSBpbnQzMl90IFNlY0NtcChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3ApIGNvbnN0IHsKKyAgICBpZiAoblNlY0luZGV4ID4gd3AublNlY0luZGV4KSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKG5TZWNJbmRleCA8IHdwLm5TZWNJbmRleCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogCi0gICAgaW50MzJfdAkJCQkJCQluTGluZUluZGV4OworICBpbnQzMl90IG5TZWNJbmRleDsKIAotICAgIGludDMyX3QJCQkJCQkJbldvcmRJbmRleDsKKyAgaW50MzJfdCBuTGluZUluZGV4OworCisgIGludDMyX3QgbldvcmRJbmRleDsKIH07CiBzdHJ1Y3QgQ1BWVF9Xb3JkUmFuZ2UgeworICBDUFZUX1dvcmRSYW5nZSgpIHt9CiAKLSAgICBDUFZUX1dvcmRSYW5nZSgpCi0gICAgeworICBDUFZUX1dvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgYmVnaW4sIGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpIHsKKyAgICBTZXQoYmVnaW4sIGVuZCk7CisgIH0KKworICB2b2lkIERlZmF1bHQoKSB7CisgICAgQmVnaW5Qb3MuRGVmYXVsdCgpOworICAgIEVuZFBvcy5EZWZhdWx0KCk7CisgIH0KKworICB2b2lkIFNldChjb25zdCBDUFZUX1dvcmRQbGFjZSYgYmVnaW4sIGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpIHsKKyAgICBCZWdpblBvcyA9IGJlZ2luOworICAgIEVuZFBvcyA9IGVuZDsKKyAgICBTd2FwV29yZFBsYWNlKCk7CisgIH0KKworICB2b2lkIFNldEJlZ2luUG9zKGNvbnN0IENQVlRfV29yZFBsYWNlJiBiZWdpbikgeworICAgIEJlZ2luUG9zID0gYmVnaW47CisgICAgU3dhcFdvcmRQbGFjZSgpOworICB9CisKKyAgdm9pZCBTZXRFbmRQb3MoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGVuZCkgeworICAgIEVuZFBvcyA9IGVuZDsKKyAgICBTd2FwV29yZFBsYWNlKCk7CisgIH0KKworICBGWF9CT09MIElzRXhpc3QoKSBjb25zdCB7IHJldHVybiBCZWdpblBvcyAhPSBFbmRQb3M7IH0KKworICBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyKSBjb25zdCB7CisgICAgcmV0dXJuIHdyLkJlZ2luUG9zICE9IEJlZ2luUG9zIHx8IHdyLkVuZFBvcyAhPSBFbmRQb3M7CisgIH0KKworICB2b2lkIFN3YXBXb3JkUGxhY2UoKSB7CisgICAgaWYgKEJlZ2luUG9zLldvcmRDbXAoRW5kUG9zKSA+IDApIHsKKyAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gRW5kUG9zOworICAgICAgRW5kUG9zID0gQmVnaW5Qb3M7CisgICAgICBCZWdpblBvcyA9IHBsYWNlOwogICAgIH0KKyAgfQogCi0gICAgQ1BWVF9Xb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBiZWdpbiwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBlbmQpCi0gICAgewotICAgICAgICBTZXQoYmVnaW4sIGVuZCk7Ci0gICAgfQorICBDUFZUX1dvcmRQbGFjZSBCZWdpblBvczsKIAotICAgIHZvaWQgRGVmYXVsdCgpCi0gICAgewotICAgICAgICBCZWdpblBvcy5EZWZhdWx0KCk7Ci0gICAgICAgIEVuZFBvcy5EZWZhdWx0KCk7Ci0gICAgfQotCi0gICAgdm9pZCBTZXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBiZWdpbiwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBlbmQpCi0gICAgewotICAgICAgICBCZWdpblBvcyA9IGJlZ2luOwotICAgICAgICBFbmRQb3MgPSBlbmQ7Ci0gICAgICAgIFN3YXBXb3JkUGxhY2UoKTsKLSAgICB9Ci0KLSAgICB2b2lkIFNldEJlZ2luUG9zKGNvbnN0IENQVlRfV29yZFBsYWNlICYgYmVnaW4pCi0gICAgewotICAgICAgICBCZWdpblBvcyA9IGJlZ2luOwotICAgICAgICBTd2FwV29yZFBsYWNlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBTZXRFbmRQb3MoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBlbmQpCi0gICAgewotICAgICAgICBFbmRQb3MgPSBlbmQ7Ci0gICAgICAgIFN3YXBXb3JkUGxhY2UoKTsKLSAgICB9Ci0KLSAgICBGWF9CT09MIElzRXhpc3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEJlZ2luUG9zICE9IEVuZFBvczsKLSAgICB9Ci0KLSAgICBGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyLkJlZ2luUG9zICE9IEJlZ2luUG9zIHx8IHdyLkVuZFBvcyAhPSBFbmRQb3M7Ci0gICAgfQotCi0gICAgdm9pZCBTd2FwV29yZFBsYWNlKCkKLSAgICB7Ci0gICAgICAgIGlmIChCZWdpblBvcy5Xb3JkQ21wKEVuZFBvcykgPiAwKSB7Ci0gICAgICAgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IEVuZFBvczsKLSAgICAgICAgICAgIEVuZFBvcyA9IEJlZ2luUG9zOwotICAgICAgICAgICAgQmVnaW5Qb3MgPSBwbGFjZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENQVlRfV29yZFBsYWNlIEJlZ2luUG9zOwotCi0gICAgQ1BWVF9Xb3JkUGxhY2UgRW5kUG9zOworICBDUFZUX1dvcmRQbGFjZSBFbmRQb3M7CiB9Owotc3RydWN0IENQVlRfU2VjUHJvcHMgIHsKK3N0cnVjdCBDUFZUX1NlY1Byb3BzIHsKKyAgQ1BWVF9TZWNQcm9wcygpIDogZkxpbmVMZWFkaW5nKDAuMGYpLCBmTGluZUluZGVudCgwLjBmKSwgbkFsaWdubWVudCgwKSB7fQogCi0gICAgQ1BWVF9TZWNQcm9wcygpIDogZkxpbmVMZWFkaW5nKDAuMGYpLCBmTGluZUluZGVudCgwLjBmKSwgbkFsaWdubWVudCgwKQotICAgIHsKLSAgICB9CisgIENQVlRfU2VjUHJvcHMoRlhfRkxPQVQgbGluZUxlYWRpbmcsIEZYX0ZMT0FUIGxpbmVJbmRlbnQsIGludDMyX3QgYWxpZ25tZW50KQorICAgICAgOiBmTGluZUxlYWRpbmcobGluZUxlYWRpbmcpLAorICAgICAgICBmTGluZUluZGVudChsaW5lSW5kZW50KSwKKyAgICAgICAgbkFsaWdubWVudChhbGlnbm1lbnQpIHt9CiAKLSAgICBDUFZUX1NlY1Byb3BzKEZYX0ZMT0FUIGxpbmVMZWFkaW5nLCBGWF9GTE9BVCBsaW5lSW5kZW50LCBpbnQzMl90IGFsaWdubWVudCkgOgotICAgICAgICBmTGluZUxlYWRpbmcobGluZUxlYWRpbmcpLCBmTGluZUluZGVudChsaW5lSW5kZW50KSwgbkFsaWdubWVudChhbGlnbm1lbnQpCi0gICAgewotICAgIH0KKyAgQ1BWVF9TZWNQcm9wcyhjb25zdCBDUFZUX1NlY1Byb3BzJiBvdGhlcikKKyAgICAgIDogZkxpbmVMZWFkaW5nKG90aGVyLmZMaW5lTGVhZGluZyksCisgICAgICAgIGZMaW5lSW5kZW50KG90aGVyLmZMaW5lSW5kZW50KSwKKyAgICAgICAgbkFsaWdubWVudChvdGhlci5uQWxpZ25tZW50KSB7fQogCi0gICAgQ1BWVF9TZWNQcm9wcyhjb25zdCBDUFZUX1NlY1Byb3BzICYgb3RoZXIpIDoKLSAgICAgICAgZkxpbmVMZWFkaW5nKG90aGVyLmZMaW5lTGVhZGluZyksIGZMaW5lSW5kZW50KG90aGVyLmZMaW5lSW5kZW50KSwgbkFsaWdubWVudChvdGhlci5uQWxpZ25tZW50KQotICAgIHsKLSAgICB9CisgIEZYX0ZMT0FUIGZMaW5lTGVhZGluZzsKIAotICAgIEZYX0ZMT0FUCQkJZkxpbmVMZWFkaW5nOworICBGWF9GTE9BVCBmTGluZUluZGVudDsKIAotICAgIEZYX0ZMT0FUCQkJZkxpbmVJbmRlbnQ7Ci0KLSAgICBpbnQzMl90CQkJbkFsaWdubWVudDsKKyAgaW50MzJfdCBuQWxpZ25tZW50OwogfTsKLXN0cnVjdCBDUFZUX1dvcmRQcm9wcyAgeworc3RydWN0IENQVlRfV29yZFByb3BzIHsKKyAgQ1BWVF9Xb3JkUHJvcHMoKQorICAgICAgOiBuRm9udEluZGV4KC0xKSwKKyAgICAgICAgZkZvbnRTaXplKDAuMGYpLAorICAgICAgICBkd1dvcmRDb2xvcigwKSwKKyAgICAgICAgblNjcmlwdFR5cGUoMCksCisgICAgICAgIG5Xb3JkU3R5bGUoMCksCisgICAgICAgIGZDaGFyU3BhY2UoMC4wZiksCisgICAgICAgIG5Ib3J6U2NhbGUoMCkge30KIAotICAgIENQVlRfV29yZFByb3BzKCkgOiBuRm9udEluZGV4KC0xKSwgZkZvbnRTaXplKDAuMGYpLCBkd1dvcmRDb2xvcigwKSwgblNjcmlwdFR5cGUoMCksIG5Xb3JkU3R5bGUoMCksCi0gICAgICAgIGZDaGFyU3BhY2UoMC4wZiksIG5Ib3J6U2NhbGUoMCkKLSAgICB7Ci0gICAgfQorICBDUFZUX1dvcmRQcm9wcyhpbnQzMl90IGZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udFNpemUsCisgICAgICAgICAgICAgICAgIEZYX0NPTE9SUkVGIHdvcmRDb2xvciA9IDAsCisgICAgICAgICAgICAgICAgIGludDMyX3Qgc2NyaXB0VHlwZSA9IDAsCisgICAgICAgICAgICAgICAgIGludDMyX3Qgd29yZFN0eWxlID0gMCwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY2hhclNwYWNlID0gMCwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBob3J6U2NhbGUgPSAxMDApCisgICAgICA6IG5Gb250SW5kZXgoZm9udEluZGV4KSwKKyAgICAgICAgZkZvbnRTaXplKGZvbnRTaXplKSwKKyAgICAgICAgZHdXb3JkQ29sb3Iod29yZENvbG9yKSwKKyAgICAgICAgblNjcmlwdFR5cGUoc2NyaXB0VHlwZSksCisgICAgICAgIG5Xb3JkU3R5bGUod29yZFN0eWxlKSwKKyAgICAgICAgZkNoYXJTcGFjZShjaGFyU3BhY2UpLAorICAgICAgICBuSG9yelNjYWxlKGhvcnpTY2FsZSkge30KIAotICAgIENQVlRfV29yZFByb3BzKGludDMyX3QJZm9udEluZGV4LCBGWF9GTE9BVCBmb250U2l6ZSwgRlhfQ09MT1JSRUYgd29yZENvbG9yID0gMCwgaW50MzJfdCBzY3JpcHRUeXBlID0gMCwgaW50MzJfdCB3b3JkU3R5bGUgPSAwLAotICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGNoYXJTcGFjZSA9IDAsIGludDMyX3QgaG9yelNjYWxlID0gMTAwKSA6Ci0gICAgICAgIG5Gb250SW5kZXgoZm9udEluZGV4KSwgZkZvbnRTaXplKGZvbnRTaXplKSwgZHdXb3JkQ29sb3Iod29yZENvbG9yKSwgblNjcmlwdFR5cGUoc2NyaXB0VHlwZSksCi0gICAgICAgIG5Xb3JkU3R5bGUod29yZFN0eWxlKSwgZkNoYXJTcGFjZShjaGFyU3BhY2UpLCBuSG9yelNjYWxlKGhvcnpTY2FsZSkKLSAgICB7Ci0gICAgfQorICBDUFZUX1dvcmRQcm9wcyhjb25zdCBDUFZUX1dvcmRQcm9wcyYgb3RoZXIpCisgICAgICA6IG5Gb250SW5kZXgob3RoZXIubkZvbnRJbmRleCksCisgICAgICAgIGZGb250U2l6ZShvdGhlci5mRm9udFNpemUpLAorICAgICAgICBkd1dvcmRDb2xvcihvdGhlci5kd1dvcmRDb2xvciksCisgICAgICAgIG5TY3JpcHRUeXBlKG90aGVyLm5TY3JpcHRUeXBlKSwKKyAgICAgICAgbldvcmRTdHlsZShvdGhlci5uV29yZFN0eWxlKSwKKyAgICAgICAgZkNoYXJTcGFjZShvdGhlci5mQ2hhclNwYWNlKSwKKyAgICAgICAgbkhvcnpTY2FsZShvdGhlci5uSG9yelNjYWxlKSB7fQogCi0gICAgQ1BWVF9Xb3JkUHJvcHMoY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiBvdGhlcikgOgotICAgICAgICBuRm9udEluZGV4KG90aGVyLm5Gb250SW5kZXgpLCBmRm9udFNpemUob3RoZXIuZkZvbnRTaXplKSwgZHdXb3JkQ29sb3Iob3RoZXIuZHdXb3JkQ29sb3IpLAotICAgICAgICBuU2NyaXB0VHlwZShvdGhlci5uU2NyaXB0VHlwZSksIG5Xb3JkU3R5bGUob3RoZXIubldvcmRTdHlsZSksIGZDaGFyU3BhY2Uob3RoZXIuZkNoYXJTcGFjZSksCi0gICAgICAgIG5Ib3J6U2NhbGUob3RoZXIubkhvcnpTY2FsZSkKLSAgICB7Ci0gICAgfQorICBpbnQzMl90IG5Gb250SW5kZXg7CiAKLSAgICBpbnQzMl90CQkJCQluRm9udEluZGV4OworICBGWF9GTE9BVCBmRm9udFNpemU7CiAKLSAgICBGWF9GTE9BVAkJCQkJZkZvbnRTaXplOworICBGWF9DT0xPUlJFRiBkd1dvcmRDb2xvcjsKIAotICAgIEZYX0NPTE9SUkVGCQkJCQlkd1dvcmRDb2xvcjsKKyAgaW50MzJfdCBuU2NyaXB0VHlwZTsKIAotICAgIGludDMyX3QJCQkJCW5TY3JpcHRUeXBlOworICBpbnQzMl90IG5Xb3JkU3R5bGU7CiAKLSAgICBpbnQzMl90CQkJCQluV29yZFN0eWxlOworICBGWF9GTE9BVCBmQ2hhclNwYWNlOwogCi0gICAgRlhfRkxPQVQJCQkJCWZDaGFyU3BhY2U7Ci0KLSAgICBpbnQzMl90CQkJCQluSG9yelNjYWxlOworICBpbnQzMl90IG5Ib3J6U2NhbGU7CiB9Owogc3RydWN0IENQVlRfV29yZCB7CisgIENQVlRfV29yZCgpCisgICAgICA6IFdvcmQoMCksCisgICAgICAgIG5DaGFyc2V0KDApLAorICAgICAgICBwdFdvcmQoMCwgMCksCisgICAgICAgIGZBc2NlbnQoMC4wZiksCisgICAgICAgIGZEZXNjZW50KDAuMGYpLAorICAgICAgICBmV2lkdGgoMC4wZiksCisgICAgICAgIGZGb250U2l6ZSgwKSwKKyAgICAgICAgV29yZFByb3BzKCkge30KIAotICAgIENQVlRfV29yZCgpIDogV29yZCgwKSwgbkNoYXJzZXQoMCksIHB0V29yZCgwLCAwKSwgZkFzY2VudCgwLjBmKSwgZkRlc2NlbnQoMC4wZiksIGZXaWR0aCgwLjBmKSwKLSAgICAgICAgZkZvbnRTaXplKDApLCBXb3JkUHJvcHMoKQotICAgIHsKLSAgICB9CisgIEZYX1dPUkQgV29yZDsKIAotICAgIEZYX1dPUkQJCQkJCQlXb3JkOworICBpbnQzMl90IG5DaGFyc2V0OwogCi0gICAgaW50MzJfdAkJCQkJbkNoYXJzZXQ7CisgIENQVlRfV29yZFBsYWNlIFdvcmRQbGFjZTsKIAotICAgIENQVlRfV29yZFBsYWNlCQkJCVdvcmRQbGFjZTsKKyAgQ1BERl9Qb2ludCBwdFdvcmQ7CiAKLSAgICBDUERGX1BvaW50CQkJCQlwdFdvcmQ7CisgIEZYX0ZMT0FUIGZBc2NlbnQ7CiAKLSAgICBGWF9GTE9BVAkJCQkJZkFzY2VudDsKKyAgRlhfRkxPQVQgZkRlc2NlbnQ7CiAKLSAgICBGWF9GTE9BVAkJCQkJZkRlc2NlbnQ7CisgIEZYX0ZMT0FUIGZXaWR0aDsKIAotICAgIEZYX0ZMT0FUCQkJCQlmV2lkdGg7CisgIGludDMyX3QgbkZvbnRJbmRleDsKIAotICAgIGludDMyX3QJCQkJCW5Gb250SW5kZXg7CisgIEZYX0ZMT0FUIGZGb250U2l6ZTsKIAotICAgIEZYX0ZMT0FUCQkJCQlmRm9udFNpemU7Ci0KLSAgICBDUFZUX1dvcmRQcm9wcwkJCQlXb3JkUHJvcHM7CisgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKIH07CiBzdHJ1Y3QgQ1BWVF9MaW5lIHsKKyAgQ1BWVF9MaW5lKCkKKyAgICAgIDogcHRMaW5lKDAsIDApLCBmTGluZVdpZHRoKDAuMGYpLCBmTGluZUFzY2VudCgwLjBmKSwgZkxpbmVEZXNjZW50KDAuMGYpIHt9CiAKLSAgICBDUFZUX0xpbmUoKSA6IHB0TGluZSgwLCAwKSwgZkxpbmVXaWR0aCgwLjBmKSwgZkxpbmVBc2NlbnQoMC4wZiksIGZMaW5lRGVzY2VudCgwLjBmKQotICAgIHsKLSAgICB9CisgIENQVlRfV29yZFBsYWNlIGxpbmVwbGFjZTsKIAotICAgIENQVlRfV29yZFBsYWNlCQkJCWxpbmVwbGFjZTsKKyAgQ1BWVF9Xb3JkUGxhY2UgbGluZUVuZDsKIAotICAgIENQVlRfV29yZFBsYWNlCQkJCWxpbmVFbmQ7CisgIENQREZfUG9pbnQgcHRMaW5lOwogCi0gICAgQ1BERl9Qb2ludAkJCQkJcHRMaW5lOworICBGWF9GTE9BVCBmTGluZVdpZHRoOwogCi0gICAgRlhfRkxPQVQJCQkJCWZMaW5lV2lkdGg7CisgIEZYX0ZMT0FUIGZMaW5lQXNjZW50OwogCi0gICAgRlhfRkxPQVQJCQkJCWZMaW5lQXNjZW50OwotCi0gICAgRlhfRkxPQVQJCQkJCWZMaW5lRGVzY2VudDsKKyAgRlhfRkxPQVQgZkxpbmVEZXNjZW50OwogfTsKIHN0cnVjdCBDUFZUX1NlY3Rpb24geworICBDUFZUX1dvcmRQbGFjZSBzZWNwbGFjZTsKIAotICAgIENQVlRfV29yZFBsYWNlCQkJCXNlY3BsYWNlOworICBDUERGX1JlY3QgcmNTZWN0aW9uOwogCi0gICAgQ1BERl9SZWN0CQkJCQlyY1NlY3Rpb247CisgIENQVlRfU2VjUHJvcHMgU2VjUHJvcHM7CiAKLSAgICBDUFZUX1NlY1Byb3BzCQkJCVNlY1Byb3BzOwotCi0gICAgQ1BWVF9Xb3JkUHJvcHMJCQkJV29yZFByb3BzOworICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CiB9OwotY2xhc3MgSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlcigpIHsgfQorY2xhc3MgSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIoKSB7fQogCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCQkJR2V0Q2hhcldpZHRoKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkLCBpbnQzMl90IG5Xb3JkU3R5bGUpID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldENoYXJXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbldvcmRTdHlsZSkgPSAwOwogCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCQkJR2V0VHlwZUFzY2VudChpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldFR5cGVBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CiAKLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRUeXBlRGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgPSAwOwogCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCQkJR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkgPSAwOwogCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCQkJR2V0RGVmYXVsdEZvbnRJbmRleCgpID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldERlZmF1bHRGb250SW5kZXgoKSA9IDA7CiB9OwotY2xhc3MgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcigpIHsgfQorY2xhc3MgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IoKSB7fQogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCU5leHRXb3JkKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgTmV4dFdvcmQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJUHJldldvcmQoKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBQcmV2V29yZCgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlOZXh0TGluZSgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIE5leHRMaW5lKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCVByZXZMaW5lKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgUHJldkxpbmUoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJTmV4dFNlY3Rpb24oKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBOZXh0U2VjdGlvbigpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlQcmV2U2VjdGlvbigpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFByZXZTZWN0aW9uKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0V29yZChDUFZUX1dvcmQmIHdvcmQpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFNldFdvcmQoY29uc3QgQ1BWVF9Xb3JkJiB3b3JkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRMaW5lKENQVlRfTGluZSYgbGluZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24mIHNlY3Rpb24pIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQkJCQlTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFNldFNlY3Rpb24oY29uc3QgQ1BWVF9TZWN0aW9uJiBzZWN0aW9uKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpID0gMDsKIAotICAgIHZpcnR1YWwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJgkJCUdldEF0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBHZXRBdCgpIGNvbnN0ID0gMDsKIH07Ci1jbGFzcyBJUERGX1ZhcmlhYmxlVGV4dAotewotcHVibGljOgotICAgIHN0YXRpYyBJUERGX1ZhcmlhYmxlVGV4dCoJCQlOZXdWYXJpYWJsZVRleHQoKTsKK2NsYXNzIElQREZfVmFyaWFibGVUZXh0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBJUERGX1ZhcmlhYmxlVGV4dCogTmV3VmFyaWFibGVUZXh0KCk7CiAKLSAgICBzdGF0aWMgdm9pZAkJCQkJCQlEZWxWYXJpYWJsZVRleHQoSVBERl9WYXJpYWJsZVRleHQqIHBWVCk7CisgIHN0YXRpYyB2b2lkIERlbFZhcmlhYmxlVGV4dChJUERGX1ZhcmlhYmxlVGV4dCogcFZUKTsKIAotICAgIHZpcnR1YWwgSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIqCQlTZXRQcm92aWRlcihJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciAqIHBQcm92aWRlcikgPSAwOworICB2aXJ0dWFsIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBTZXRQcm92aWRlcigKKyAgICAgIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBwUHJvdmlkZXIpID0gMDsKIAotICAgIHZpcnR1YWwgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqCQlHZXRJdGVyYXRvcigpID0gMDsKKyAgdmlydHVhbCBJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogR2V0SXRlcmF0b3IoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBbGlnbm1lbnQoaW50MzJfdCBuRm9ybWF0ID0gMCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0QWxpZ25tZW50KGludDMyX3QgbkZvcm1hdCA9IDApID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJykgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQgPSAnKicpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyID0gMCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhciA9IDApID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5ID0gMCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0Q2hhckFycmF5KGludDMyX3QgbkNoYXJBcnJheSA9IDApID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSA9IDAuMGYpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZikgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRNdWx0aUxpbmUoRlhfQk9PTCBiTXVsdGlMaW5lID0gVFJVRSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0TXVsdGlMaW5lKEZYX0JPT0wgYk11bHRpTGluZSA9IFRSVUUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8gPSBUUlVFKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8gPSBUUlVFKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8gPSBUUlVFKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRBdXRvRm9udFNpemUoRlhfQk9PTCBiQXV0byA9IFRSVUUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZykgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFJpY2hUZXh0KEZYX0JPT0wgYlJpY2hUZXh0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJSW5pdGlhbGl6ZSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNWYWxpZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWQoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNSaWNoVGV4dCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzUmljaFRleHQoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJUmVhcnJhbmdlQWxsKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgUmVhcnJhbmdlQWxsKCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVJlYXJyYW5nZVBhcnQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZWFycmFuZ2VQYXJ0KGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJUmVzZXRBbGwoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZXNldEFsbCgpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQgPSAxLCBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCwKLSAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJSW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCA9IDEsCi0gICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgSW5zZXJ0V29yZCgKKyAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgIGludDMyX3QgY2hhcnNldCA9IDEsCisgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUluc2VydFNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsCi0gICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgSW5zZXJ0U2VjdGlvbigKKyAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcyA9IE5VTEwsCisgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCA9IDEsCi0gICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCwJY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEluc2VydFRleHQoCisgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICBjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgIGludDMyX3QgY2hhcnNldCA9IDEsCisgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMgPSBOVUxMLAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlEZWxldGVXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBEZWxldGVXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgUGxhY2VSYW5nZSkgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJRGVsZXRlV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSA9IDA7CisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgRGVsZXRlV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUJhY2tTcGFjZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEJhY2tTcGFjZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGNvbnN0IENQREZfUmVjdCAmCQkJCUdldFBsYXRlUmVjdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBjb25zdCBDUERGX1JlY3QmIEdldFBsYXRlUmVjdCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BERl9SZWN0CQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCQkJR2V0VG90YWxXb3JkcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldFRvdGFsV29yZHMoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCQkJR2V0Rm9udFNpemUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0Rm9udFNpemUoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRBbGlnbm1lbnQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRBbGlnbm1lbnQoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX1dPUkQJCQkJCQkJR2V0UGFzc3dvcmRDaGFyKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX1dPUkQgR2V0UGFzc3dvcmRDaGFyKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCQkJR2V0Q2hhckFycmF5KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhckFycmF5KCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCQkJR2V0TGltaXRDaGFyKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0TGltaXRDaGFyKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzTXVsdGlMaW5lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNNdWx0aUxpbmUoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRIb3J6U2NhbGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRIb3J6U2NhbGUoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCQkJR2V0Q2hhclNwYWNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0ZMT0FUIEdldENoYXJTcGFjZSgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJR2V0RW5kV29yZFBsYWNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldEVuZFdvcmRQbGFjZSgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldFByZXZXb3JkUGxhY2UoCisgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldE5leHRXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldE5leHRXb3JkUGxhY2UoCisgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCVNlYXJjaFdvcmRQbGFjZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBTZWFyY2hXb3JkUGxhY2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldFVwV29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldFVwV29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJR2V0RG93bldvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBHZXREb3duV29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgR2V0TGluZUJlZ2luUGxhY2UoCisgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldExpbmVFbmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgR2V0TGluZUVuZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJR2V0U2VjdGlvbkJlZ2luUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldFNlY3Rpb25CZWdpblBsYWNlKAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlHZXRTZWN0aW9uRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldFNlY3Rpb25FbmRQbGFjZSgKKyAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVVwZGF0ZVdvcmRQbGFjZShDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBVcGRhdGVXb3JkUGxhY2UoQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiUHJldk9yTmV4dCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEFqdXN0TGluZUhlYWRlcihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByZXZPck5leHQpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgaW50MzJfdAkJCQkJCVdvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IFdvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJV29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIFdvcmRJbmRleFRvV29yZFBsYWNlKGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsKIAotcHJvdGVjdGVkOgotICAgIH5JUERGX1ZhcmlhYmxlVGV4dCgpIHsgfQorIHByb3RlY3RlZDoKKyAgfklQREZfVmFyaWFibGVUZXh0KCkge30KIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZET0NfRlBERl9WVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oCmluZGV4IDA0OTIyYzQuLmViMTZjYTkgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZnRleHQvZnBkZl90ZXh0LmgKQEAgLTE3LDE1MyArMTcsMTY4IEBACiBjbGFzcyBJUERGX1RleHRQYWdlOwogY2xhc3MgSVBERl9UZXh0UGFnZUZpbmQ7CiAKLSNkZWZpbmUgUERGMlRYVF9BVVRPX1JPVEFURQkJMQotI2RlZmluZSBQREYyVFhUX0FVVE9fV0lEVEgJCTIKLSNkZWZpbmUgUERGMlRYVF9LRUVQX0NPTFVNTgkJNAotI2RlZmluZSBQREYyVFhUX1VTRV9PQ1IJCQk4Ci0jZGVmaW5lIFBERjJUWFRfSU5DTFVERV9JTlZJU0lCTEUJMTYKLXZvaWQgUERGX0dldFBhZ2VUZXh0KENGWF9CeXRlU3RyaW5nQXJyYXkmIGxpbmVzLCBDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAotICAgICAgICAgICAgICAgICAgICAgaW50IGlNaW5XaWR0aCwgRlhfRFdPUkQgZmxhZ3MpOwotdm9pZCBQREZfR2V0UGFnZVRleHRfVW5pY29kZShDRlhfV2lkZVN0cmluZ0FycmF5JiBsaW5lcywgQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlNaW5XaWR0aCwgRlhfRFdPUkQgZmxhZ3MpOwotdm9pZCBQREZfR2V0VGV4dFN0cmVhbV9Vbmljb2RlKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLCBDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAorI2RlZmluZSBQREYyVFhUX0FVVE9fUk9UQVRFIDEKKyNkZWZpbmUgUERGMlRYVF9BVVRPX1dJRFRIIDIKKyNkZWZpbmUgUERGMlRYVF9LRUVQX0NPTFVNTiA0CisjZGVmaW5lIFBERjJUWFRfVVNFX09DUiA4CisjZGVmaW5lIFBERjJUWFRfSU5DTFVERV9JTlZJU0lCTEUgMTYKK3ZvaWQgUERGX0dldFBhZ2VUZXh0KENGWF9CeXRlU3RyaW5nQXJyYXkmIGxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MpOwordm9pZCBQREZfR2V0UGFnZVRleHRfVW5pY29kZShDRlhfV2lkZVN0cmluZ0FycmF5JiBsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlNaW5XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MpOwordm9pZCBQREZfR2V0VGV4dFN0cmVhbV9Vbmljb2RlKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncyk7Ci1DRlhfV2lkZVN0cmluZyBQREZfR2V0Rmlyc3RUZXh0TGluZV9Vbmljb2RlKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2UpOwotI2RlZmluZSBDSEFSX0VSUk9SCQkJLTEKLSNkZWZpbmUgQ0hBUl9OT1JNQUwJCQkwCi0jZGVmaW5lIENIQVJfR0VORVJBVEVECQkxCi0jZGVmaW5lIENIQVJfVU5VTklDT0RFCQkyCitDRlhfV2lkZVN0cmluZyBQREZfR2V0Rmlyc3RUZXh0TGluZV9Vbmljb2RlKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2UpOworI2RlZmluZSBDSEFSX0VSUk9SIC0xCisjZGVmaW5lIENIQVJfTk9STUFMIDAKKyNkZWZpbmUgQ0hBUl9HRU5FUkFURUQgMQorI2RlZmluZSBDSEFSX1VOVU5JQ09ERSAyCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgRlhfV0NIQVIJCQltX1VuaWNvZGU7Ci0gICAgRlhfV0NIQVIJCQltX0NoYXJjb2RlOwotICAgIGludDMyX3QJCQltX0ZsYWc7Ci0gICAgRlhfRkxPQVQJCQltX0ZvbnRTaXplOwotICAgIEZYX0ZMT0FUCQkJbV9PcmlnaW5YOwotICAgIEZYX0ZMT0FUCQkJbV9PcmlnaW5ZOwotICAgIENGWF9GbG9hdFJlY3QJCW1fQ2hhckJveDsKLSAgICBDUERGX1RleHRPYmplY3QqCW1fcFRleHRPYmo7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX01hdHJpeDsKKyAgRlhfV0NIQVIgbV9Vbmljb2RlOworICBGWF9XQ0hBUiBtX0NoYXJjb2RlOworICBpbnQzMl90IG1fRmxhZzsKKyAgRlhfRkxPQVQgbV9Gb250U2l6ZTsKKyAgRlhfRkxPQVQgbV9PcmlnaW5YOworICBGWF9GTE9BVCBtX09yaWdpblk7CisgIENGWF9GbG9hdFJlY3QgbV9DaGFyQm94OworICBDUERGX1RleHRPYmplY3QqIG1fcFRleHRPYmo7CisgIENGWF9BZmZpbmVNYXRyaXggbV9NYXRyaXg7CiB9IEZQREZfQ0hBUl9JTkZPOwotdHlwZWRlZglDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfRmxvYXRSZWN0PiBDRlhfUmVjdEFycmF5OwotI2RlZmluZSBGUERGVEVYVF9MUlRCCTAKLSNkZWZpbmUgRlBERlRFWFRfUkxUQgkxCi0jZGVmaW5lIEZQREZURVhUX1RCUkwJMgotI2RlZmluZSBGUERGVEVYVF9MRUZUCQkJLTEKLSNkZWZpbmUgRlBERlRFWFRfUklHSFQJCQkxCi0jZGVmaW5lIEZQREZURVhUX1VQCQkJCS0yCi0jZGVmaW5lIEZQREZURVhUX0RPV04JCQkyCi0jZGVmaW5lIEZQREZURVhUX1dSSVRJTkdNT0RFX1VOS05PVwkwCi0jZGVmaW5lIEZQREZURVhUX1dSSVRJTkdNT0RFX0xSVEIJMQotI2RlZmluZSBGUERGVEVYVF9XUklUSU5HTU9ERV9STFRCCTIKLSNkZWZpbmUgRlBERlRFWFRfV1JJVElOR01PREVfVEJSTAkzCi1jbGFzcyBDUERGVGV4dF9QYXJzZU9wdGlvbnMKLXsKLXB1YmxpYzoKLQotICAgIENQREZUZXh0X1BhcnNlT3B0aW9ucygpOwotICAgIEZYX0JPT0wJCQltX2JHZXRDaGFyQ29kZU9ubHk7Ci0gICAgRlhfQk9PTAkJCW1fYk5vcm1hbGl6ZU9ianM7Ci0gICAgRlhfQk9PTAkJCW1fYk91dHB1dEh5cGhlbjsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX0Zsb2F0UmVjdD4gQ0ZYX1JlY3RBcnJheTsKKyNkZWZpbmUgRlBERlRFWFRfTFJUQiAwCisjZGVmaW5lIEZQREZURVhUX1JMVEIgMQorI2RlZmluZSBGUERGVEVYVF9UQlJMIDIKKyNkZWZpbmUgRlBERlRFWFRfTEVGVCAtMQorI2RlZmluZSBGUERGVEVYVF9SSUdIVCAxCisjZGVmaW5lIEZQREZURVhUX1VQIC0yCisjZGVmaW5lIEZQREZURVhUX0RPV04gMgorI2RlZmluZSBGUERGVEVYVF9XUklUSU5HTU9ERV9VTktOT1cgMAorI2RlZmluZSBGUERGVEVYVF9XUklUSU5HTU9ERV9MUlRCIDEKKyNkZWZpbmUgRlBERlRFWFRfV1JJVElOR01PREVfUkxUQiAyCisjZGVmaW5lIEZQREZURVhUX1dSSVRJTkdNT0RFX1RCUkwgMworY2xhc3MgQ1BERlRleHRfUGFyc2VPcHRpb25zIHsKKyBwdWJsaWM6CisgIENQREZUZXh0X1BhcnNlT3B0aW9ucygpOworICBGWF9CT09MIG1fYkdldENoYXJDb2RlT25seTsKKyAgRlhfQk9PTCBtX2JOb3JtYWxpemVPYmpzOworICBGWF9CT09MIG1fYk91dHB1dEh5cGhlbjsKIH07Ci1jbGFzcyBJUERGX1RleHRQYWdlCi17Ci1wdWJsaWM6CitjbGFzcyBJUERGX1RleHRQYWdlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklQREZfVGV4dFBhZ2UoKSB7fQorICBzdGF0aWMgSVBERl9UZXh0UGFnZSogQ3JlYXRlVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZUZXh0X1BhcnNlT3B0aW9ucyBQYXJzZXJPcHRpb25zKTsKKyAgc3RhdGljIElQREZfVGV4dFBhZ2UqIENyZWF0ZVRleHRQYWdlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIGludCBmbGFncyA9IDApOworICBzdGF0aWMgSVBERl9UZXh0UGFnZSogQ3JlYXRlVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSAwKTsKKyAgc3RhdGljIElQREZfVGV4dFBhZ2UqIENyZWF0ZVJlZmxvd1RleHRQYWdlKElQREZfUmVmbG93ZWRQYWdlKiBwUmVmUGFnZSk7CiAKLSAgICB2aXJ0dWFsIH5JUERGX1RleHRQYWdlKCkge30KLSAgICBzdGF0aWMgSVBERl9UZXh0UGFnZSoJQ3JlYXRlVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERlRleHRfUGFyc2VPcHRpb25zIFBhcnNlck9wdGlvbnMpOwotICAgIHN0YXRpYyBJUERGX1RleHRQYWdlKglDcmVhdGVUZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBpbnQgZmxhZ3MgPSAwKTsKLSAgICBzdGF0aWMgSVBERl9UZXh0UGFnZSoJQ3JlYXRlVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsIGludCBmbGFncyA9IDApOwotICAgIHN0YXRpYyBJUERGX1RleHRQYWdlKglDcmVhdGVSZWZsb3dUZXh0UGFnZShJUERGX1JlZmxvd2VkUGFnZSogcFJlZlBhZ2UpOworICB2aXJ0dWFsIHZvaWQgTm9ybWFsaXplT2JqZWN0cyhGWF9CT09MIGJOb3JtYWxpemUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCU5vcm1hbGl6ZU9iamVjdHMoRlhfQk9PTCBiTm9ybWFsaXplKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZVRleHRQYWdlKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJUGFyc2VUZXh0UGFnZSgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzUGFyc2VyZWQoKSBjb25zdCA9IDA7CiAKKyBwdWJsaWM6CisgIHZpcnR1YWwgaW50IENoYXJJbmRleEZyb21UZXh0SW5kZXgoaW50IFRleHRJbmRleCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNQYXJzZXJlZCgpIGNvbnN0ID0gMDsKLXB1YmxpYzoKKyAgdmlydHVhbCBpbnQgVGV4dEluZGV4RnJvbUNoYXJJbmRleChpbnQgQ2hhckluZGV4KSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGludCBDaGFySW5kZXhGcm9tVGV4dEluZGV4KGludCBUZXh0SW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQgQ291bnRDaGFycygpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgaW50IFRleHRJbmRleEZyb21DaGFySW5kZXgoaW50IENoYXJJbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2V0Q2hhckluZm8oaW50IGluZGV4LCBGUERGX0NIQVJfSU5GTyYgaW5mbykgY29uc3QgPSAwOwogCisgIHZpcnR1YWwgdm9pZCBHZXRSZWN0QXJyYXkoaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RBcnJheSYgcmVjdEFycmF5KSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGludAkJCQlDb3VudENoYXJzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludCBHZXRJbmRleEF0UG9zKENQREZfUG9pbnQgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeFRvcmVsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5VG9yZWxhbmNlKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsCXZvaWQJCQlHZXRDaGFySW5mbyhpbnQgaW5kZXgsIEZQREZfQ0hBUl9JTkZPICYgaW5mbykgY29uc3QgPSAwOworICB2aXJ0dWFsIGludCBHZXRJbmRleEF0UG9zKEZYX0ZMT0FUIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4VG9yZWxhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHlUb3JlbGFuY2UpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCUdldFJlY3RBcnJheShpbnQgc3RhcnQsIGludCBuQ291bnQsIENGWF9SZWN0QXJyYXkmIHJlY3RBcnJheSkgY29uc3QgPSAwOworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldFRleHRCeVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QgPSAwOwogCisgIHZpcnR1YWwgdm9pZCBHZXRSZWN0c0FycmF5QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0QXJyYXkmIHJlc1JlY3RBcnJheSkgY29uc3QgPSAwOwogCisgIHZpcnR1YWwgaW50IENvdW50UmVjdHMoaW50IHN0YXJ0LCBpbnQgbkNvdW50KSA9IDA7CiAKLSAgICB2aXJ0dWFsIGludAkJCQlHZXRJbmRleEF0UG9zKENQREZfUG9pbnQgcG9pbnQsIEZYX0ZMT0FUIHhUb3JlbGFuY2UsIEZYX0ZMT0FUIHlUb3JlbGFuY2UpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdldFJlY3QoaW50IHJlY3RJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGJvdHRvbSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBpbnQJCQkJR2V0SW5kZXhBdFBvcyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB4VG9yZWxhbmNlLCBGWF9GTE9BVCB5VG9yZWxhbmNlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSkgPSAwOwogCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlHZXRUZXh0QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEdldEJhc2VsaW5lUm90YXRlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsIGludCYgUm90YXRlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRSZWN0c0FycmF5QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsIENGWF9SZWN0QXJyYXkmIHJlc1JlY3RBcnJheSkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludCBDb3VudEJvdW5kZWRTZWdtZW50cyhGWF9GTE9BVCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbnRhaW5zID0gRkFMU0UpID0gMDsKIAorICB2aXJ0dWFsIHZvaWQgR2V0Qm91bmRlZFNlZ21lbnQoaW50IGluZGV4LCBpbnQmIHN0YXJ0LCBpbnQmIGNvdW50KSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGludAkJCQlDb3VudFJlY3RzKGludCBzdGFydCwgaW50IG5Db3VudCkgPSAwOworICB2aXJ0dWFsIGludCBHZXRXb3JkQnJlYWsoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsCXZvaWQJCQlHZXRSZWN0KGludCByZWN0SW5kZXgsIEZYX0ZMT0FUJiBsZWZ0LCBGWF9GTE9BVCYgdG9wLCBGWF9GTE9BVCYgcmlnaHQsIEZYX0ZMT0FUICZib3R0b20pIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEJhc2VsaW5lUm90YXRlKGludCByZWN0SW5kZXgsIGludCYgUm90YXRlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LCBpbnQmIFJvdGF0ZSkgPSAwOwotCi0gICAgdmlydHVhbAlpbnQJCQkJQ291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBGWF9CT09MIGJDb250YWlucyA9IEZBTFNFKSA9IDA7Ci0KLSAgICB2aXJ0dWFsCXZvaWQJCQlHZXRCb3VuZGVkU2VnbWVudChpbnQgaW5kZXgsIGludCYgc3RhcnQsIGludCYgY291bnQpIGNvbnN0ID0gMDsKLQotCi0gICAgdmlydHVhbCBpbnQJCQkJR2V0V29yZEJyZWFrKGludCBpbmRleCwgaW50IGRpcmVjdGlvbikgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlHZXRQYWdlVGV4dChpbnQgc3RhcnQgPSAwLCBpbnQgbkNvdW50ID0gLTEgKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0UGFnZVRleHQoaW50IHN0YXJ0ID0gMCwgaW50IG5Db3VudCA9IC0xKSBjb25zdCA9IDA7CiB9OwotI2RlZmluZSBGUERGVEVYVF9NQVRDSENBU0UgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEZQREZURVhUX01BVENIQ0FTRSAweDAwMDAwMDAxCiAjZGVmaW5lIEZQREZURVhUX01BVENIV0hPTEVXT1JEIDB4MDAwMDAwMDIKLSNkZWZpbmUgRlBERlRFWFRfQ09OU0VDVVRJVkUJMHgwMDAwMDAwNAotY2xhc3MgSVBERl9UZXh0UGFnZUZpbmQKLXsKLXB1YmxpYzoKKyNkZWZpbmUgRlBERlRFWFRfQ09OU0VDVVRJVkUgMHgwMDAwMDAwNAorY2xhc3MgSVBERl9UZXh0UGFnZUZpbmQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBERl9UZXh0UGFnZUZpbmQoKSB7fQogCi0gICAgdmlydHVhbAl+SVBERl9UZXh0UGFnZUZpbmQoKSB7fQorICBzdGF0aWMgSVBERl9UZXh0UGFnZUZpbmQqIENyZWF0ZVBhZ2VGaW5kKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSk7CiAKLSAgICBzdGF0aWMJSVBERl9UZXh0UGFnZUZpbmQqCUNyZWF0ZVBhZ2VGaW5kKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSk7Ci1wdWJsaWM6CisgcHVibGljOgorICB2aXJ0dWFsIEZYX0JPT0wgRmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0UG9zID0gMCkgPSAwOwogCi0gICAgdmlydHVhbAlGWF9CT09MCQkJCUZpbmRGaXJzdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQsIGludCBmbGFncywgaW50IHN0YXJ0UG9zID0gMCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgRmluZE5leHQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJRmluZE5leHQoKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBGaW5kUHJldigpID0gMDsKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlGaW5kUHJldigpID0gMDsKKyAgdmlydHVhbCB2b2lkIEdldFJlY3RBcnJheShDRlhfUmVjdEFycmF5JiByZWN0cykgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCUdldFJlY3RBcnJheShDRlhfUmVjdEFycmF5JiByZWN0cykgY29uc3QgPSAwOworICB2aXJ0dWFsIGludCBHZXRDdXJPcmRlcigpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgaW50CQkJCQlHZXRDdXJPcmRlcigpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgaW50CQkJCQlHZXRNYXRjaGVkQ291bnQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50IEdldE1hdGNoZWRDb3VudCgpIGNvbnN0ID0gMDsKIH07Ci1jbGFzcyBJUERGX0xpbmtFeHRyYWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBJUERGX0xpbmtFeHRyYWN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklQREZfTGlua0V4dHJhY3QoKSB7fQogCi0gICAgdmlydHVhbAl+SVBERl9MaW5rRXh0cmFjdCgpIHt9CisgIHN0YXRpYyBJUERGX0xpbmtFeHRyYWN0KiBDcmVhdGVMaW5rRXh0cmFjdCgpOwogCi0gICAgc3RhdGljCUlQREZfTGlua0V4dHJhY3QqCUNyZWF0ZUxpbmtFeHRyYWN0KCk7CisgIHZpcnR1YWwgRlhfQk9PTCBFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRXh0cmFjdExpbmtzKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkgPSAwOwotcHVibGljOgorIHB1YmxpYzoKKyAgdmlydHVhbCBpbnQgQ291bnRMaW5rcygpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgaW50CQkJCQlDb3VudExpbmtzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldFVSTChpbnQgaW5kZXgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCUdldFVSTChpbnQgaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbAl2b2lkCQkJCUdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkCQkJCUdldFJlY3RzKGludCBpbmRleCwgQ0ZYX1JlY3RBcnJheSYgcmVjdHMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdldFJlY3RzKGludCBpbmRleCwgQ0ZYX1JlY3RBcnJheSYgcmVjdHMpIGNvbnN0ID0gMDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZURVhUX0ZQREZfVEVYVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgKaW5kZXggNWIwMDkyYS4uOWZjMTllZCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oCkBAIC0zMSwzOTYgKzMxLDUyMyBAQAogY2xhc3MgQ0ZYX0RJQkF0dHJpYnV0ZTsKIGNsYXNzIElDb2RlY19TY2FubGluZURlY29kZXI7CiAKLWNsYXNzIENDb2RlY19Nb2R1bGVNZ3IKLXsKLXB1YmxpYzoKLSAgICBDQ29kZWNfTW9kdWxlTWdyKCk7Ci0gICAgSUNvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogQ3JlYXRlUHJvZ3Jlc3NpdmVEZWNvZGVyKCk7Ci0gICAgSUNvZGVjX0piaWcyRW5jb2RlciogQ3JlYXRlSmJpZzJFbmNvZGVyKCk7Ci0gICAgSUNvZGVjX0Jhc2ljTW9kdWxlKiBHZXRCYXNpY01vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEJhc2ljTW9kdWxlLmdldCgpOyB9Ci0gICAgSUNvZGVjX0ZheE1vZHVsZSogR2V0RmF4TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wRmF4TW9kdWxlLmdldCgpOyB9Ci0gICAgSUNvZGVjX0pwZWdNb2R1bGUqIEdldEpwZWdNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BKcGVnTW9kdWxlLmdldCgpOyB9Ci0gICAgSUNvZGVjX0pweE1vZHVsZSogR2V0SnB4TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wSnB4TW9kdWxlLmdldCgpOyB9Ci0gICAgSUNvZGVjX0piaWcyTW9kdWxlKiBHZXRKYmlnMk1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEpiaWcyTW9kdWxlLmdldCgpOyB9Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogR2V0SWNjTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wSWNjTW9kdWxlLmdldCgpOyB9Ci0gICAgSUNvZGVjX0ZsYXRlTW9kdWxlKiBHZXRGbGF0ZU1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEZsYXRlTW9kdWxlLmdldCgpOyB9Ci0gICAgSUNvZGVjX1BuZ01vZHVsZSogR2V0UG5nTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wUG5nTW9kdWxlLmdldCgpOyB9Ci0gICAgSUNvZGVjX0dpZk1vZHVsZSogR2V0R2lmTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wR2lmTW9kdWxlLmdldCgpOyB9Ci0gICAgSUNvZGVjX0JtcE1vZHVsZSogR2V0Qm1wTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wQm1wTW9kdWxlLmdldCgpOyB9Ci0gICAgSUNvZGVjX1RpZmZNb2R1bGUqIEdldFRpZmZNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BUaWZmTW9kdWxlLmdldCgpOyB9CitjbGFzcyBDQ29kZWNfTW9kdWxlTWdyIHsKKyBwdWJsaWM6CisgIENDb2RlY19Nb2R1bGVNZ3IoKTsKKyAgSUNvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogQ3JlYXRlUHJvZ3Jlc3NpdmVEZWNvZGVyKCk7CisgIElDb2RlY19KYmlnMkVuY29kZXIqIENyZWF0ZUpiaWcyRW5jb2RlcigpOworICBJQ29kZWNfQmFzaWNNb2R1bGUqIEdldEJhc2ljTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wQmFzaWNNb2R1bGUuZ2V0KCk7IH0KKyAgSUNvZGVjX0ZheE1vZHVsZSogR2V0RmF4TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wRmF4TW9kdWxlLmdldCgpOyB9CisgIElDb2RlY19KcGVnTW9kdWxlKiBHZXRKcGVnTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wSnBlZ01vZHVsZS5nZXQoKTsgfQorICBJQ29kZWNfSnB4TW9kdWxlKiBHZXRKcHhNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BKcHhNb2R1bGUuZ2V0KCk7IH0KKyAgSUNvZGVjX0piaWcyTW9kdWxlKiBHZXRKYmlnMk1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEpiaWcyTW9kdWxlLmdldCgpOyB9CisgIElDb2RlY19JY2NNb2R1bGUqIEdldEljY01vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEljY01vZHVsZS5nZXQoKTsgfQorICBJQ29kZWNfRmxhdGVNb2R1bGUqIEdldEZsYXRlTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wRmxhdGVNb2R1bGUuZ2V0KCk7IH0KKyAgSUNvZGVjX1BuZ01vZHVsZSogR2V0UG5nTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wUG5nTW9kdWxlLmdldCgpOyB9CisgIElDb2RlY19HaWZNb2R1bGUqIEdldEdpZk1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEdpZk1vZHVsZS5nZXQoKTsgfQorICBJQ29kZWNfQm1wTW9kdWxlKiBHZXRCbXBNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BCbXBNb2R1bGUuZ2V0KCk7IH0KKyAgSUNvZGVjX1RpZmZNb2R1bGUqIEdldFRpZmZNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BUaWZmTW9kdWxlLmdldCgpOyB9CiAKLXByb3RlY3RlZDoKLSAgICBub25zdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX0Jhc2ljTW9kdWxlPiBtX3BCYXNpY01vZHVsZTsKLSAgICBub25zdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX0ZheE1vZHVsZT4gbV9wRmF4TW9kdWxlOwotICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfSnBlZ01vZHVsZT4gbV9wSnBlZ01vZHVsZTsKLSAgICBub25zdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX0pweE1vZHVsZT4gbV9wSnB4TW9kdWxlOwotICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfSmJpZzJNb2R1bGU+IG1fcEpiaWcyTW9kdWxlOwotICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfSWNjTW9kdWxlPiBtX3BJY2NNb2R1bGU7Ci0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPElDb2RlY19GbGF0ZU1vZHVsZT4gbV9wRmxhdGVNb2R1bGU7Ci0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPElDb2RlY19QbmdNb2R1bGU+IG1fcFBuZ01vZHVsZTsKLSAgICBub25zdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX0dpZk1vZHVsZT4gbV9wR2lmTW9kdWxlOwotICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfQm1wTW9kdWxlPiBtX3BCbXBNb2R1bGU7Ci0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPElDb2RlY19UaWZmTW9kdWxlPiBtX3BUaWZmTW9kdWxlOworIHByb3RlY3RlZDoKKyAgbm9uc3RkOjp1bmlxdWVfcHRyPElDb2RlY19CYXNpY01vZHVsZT4gbV9wQmFzaWNNb2R1bGU7CisgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfRmF4TW9kdWxlPiBtX3BGYXhNb2R1bGU7CisgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfSnBlZ01vZHVsZT4gbV9wSnBlZ01vZHVsZTsKKyAgbm9uc3RkOjp1bmlxdWVfcHRyPElDb2RlY19KcHhNb2R1bGU+IG1fcEpweE1vZHVsZTsKKyAgbm9uc3RkOjp1bmlxdWVfcHRyPElDb2RlY19KYmlnMk1vZHVsZT4gbV9wSmJpZzJNb2R1bGU7CisgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfSWNjTW9kdWxlPiBtX3BJY2NNb2R1bGU7CisgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfRmxhdGVNb2R1bGU+IG1fcEZsYXRlTW9kdWxlOworICBub25zdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX1BuZ01vZHVsZT4gbV9wUG5nTW9kdWxlOworICBub25zdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX0dpZk1vZHVsZT4gbV9wR2lmTW9kdWxlOworICBub25zdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX0JtcE1vZHVsZT4gbV9wQm1wTW9kdWxlOworICBub25zdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX1RpZmZNb2R1bGU+IG1fcFRpZmZNb2R1bGU7CiB9OwotY2xhc3MgSUNvZGVjX0Jhc2ljTW9kdWxlCi17Ci1wdWJsaWM6CitjbGFzcyBJQ29kZWNfQmFzaWNNb2R1bGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUNvZGVjX0Jhc2ljTW9kdWxlKCkge30KKyAgdmlydHVhbCBGWF9CT09MIFJ1bkxlbmd0aEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBBODVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOworICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqIENyZWF0ZVJ1bkxlbmd0aERlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBjKSA9IDA7Cit9OworY2xhc3MgSUNvZGVjX1NjYW5saW5lRGVjb2RlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JQ29kZWNfU2NhbmxpbmVEZWNvZGVyKCkge30KIAotICAgIHZpcnR1YWwgfklDb2RlY19CYXNpY01vZHVsZSgpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MCVJ1bkxlbmd0aEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAorICB2aXJ0dWFsIEZYX0RXT1JEIEdldFNyY09mZnNldCgpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpID0gMDsKKworICB2aXJ0dWFsIHVpbnQ4X3QqIEdldFNjYW5saW5lKGludCBsaW5lKSA9IDA7CisKKyAgdmlydHVhbCBGWF9CT09MIFNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOworCisgIHZpcnR1YWwgaW50IEdldFdpZHRoKCkgPSAwOworCisgIHZpcnR1YWwgaW50IEdldEhlaWdodCgpID0gMDsKKworICB2aXJ0dWFsIGludCBDb3VudENvbXBzKCkgPSAwOworCisgIHZpcnR1YWwgaW50IEdldEJQQygpID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgSXNDb2xvclRyYW5zZm9ybWVkKCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBDbGVhckltYWdlRGF0YSgpID0gMDsKK307CitjbGFzcyBJQ29kZWNfRmxhdGVNb2R1bGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUNvZGVjX0ZsYXRlTW9kdWxlKCkge30KKyAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucykgPSAwOworICB2aXJ0dWFsIEZYX0RXT1JEIEZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRWFybHlDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJQTg1RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7Ci0gICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVSdW5MZW5ndGhEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7CiB9OwotY2xhc3MgSUNvZGVjX1NjYW5saW5lRGVjb2RlcgotewotcHVibGljOgorY2xhc3MgSUNvZGVjX0ZheE1vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JQ29kZWNfRmF4TW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgfklDb2RlY19TY2FubGluZURlY29kZXIoKSB7fQorICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqIENyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBFbmRPZkxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEJsYWNrSXMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgUm93cykgPSAwOwogCi0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRTcmNPZmZzZXQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCURvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHVpbnQ4X3QqCUdldFNjYW5saW5lKGludCBsaW5lKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQJCQlHZXRXaWR0aCgpID0gMDsKLQotICAgIHZpcnR1YWwgaW50CQkJR2V0SGVpZ2h0KCkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQJCQlDb3VudENvbXBzKCkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQJCQlHZXRCUEMoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzQ29sb3JUcmFuc2Zvcm1lZCgpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZAkJQ2xlYXJJbWFnZURhdGEoKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKIH07Ci1jbGFzcyBJQ29kZWNfRmxhdGVNb2R1bGUKLXsKLXB1YmxpYzoKK2NsYXNzIElDb2RlY19KcGVnTW9kdWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklDb2RlY19KcGVnTW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgfklDb2RlY19GbGF0ZU1vZHVsZSgpIHt9Ci0gICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjLCBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0RXT1JECUZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfQk9PTCBiRWFybHlDaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRQb3ZpZGVyKElGWF9KcGVnUHJvdmlkZXIqIHBKUCkgPSAwOworCisgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlciogQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgYml0c19wZXJfY29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBpY2NfYnVmX3B0ciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogaWNjX2xlbmd0aCA9IE5VTEwpID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgRW5jb2RlKGNvbnN0IGNsYXNzIENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSA9IDc1LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGljY19idWYgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGljY19sZW5ndGggPSAwKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkKiBTdGFydCgpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgRmluaXNoKHZvaWQqIHBDb250ZXh0KSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKSA9IDA7CisKKyAgdmlydHVhbCBpbnQgUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKSA9IDA7CisKKyAgdmlydHVhbCBpbnQgU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1ZikgPSAwOworCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyID0gTlVMTCkgPSAwOwogfTsKLWNsYXNzIElDb2RlY19GYXhNb2R1bGUKLXsKLXB1YmxpYzoKK2NsYXNzIElDb2RlY19KcHhNb2R1bGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUNvZGVjX0pweE1vZHVsZSgpIHt9CiAKLSAgICB2aXJ0dWFsIH5JQ29kZWNfRmF4TW9kdWxlKCkge30KKyAgdmlydHVhbCB2b2lkKiBDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgdXNlQ29sb3JTcGFjZSA9IEZBTFNFKSA9IDA7CiAKLSAgICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgIGludCBLLCBGWF9CT09MIEVuZE9mTGluZSwgRlhfQk9PTCBFbmNvZGVkQnl0ZUFsaWduLCBGWF9CT09MIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpID0gMDsKKyAgdmlydHVhbCB2b2lkIEdldEltYWdlSW5mbyh2b2lkKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBvdXRwdXRfbkNvbXBzKSA9IDA7CiAKKyAgdmlydHVhbCBGWF9CT09MIERlY29kZSh2b2lkKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvZmZzZXRzKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKKyAgdmlydHVhbCB2b2lkIERlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCkgPSAwOwogfTsKLWNsYXNzIElDb2RlY19KcGVnTW9kdWxlCi17Ci1wdWJsaWM6CitjbGFzcyBJQ29kZWNfUG5nTW9kdWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklDb2RlY19QbmdNb2R1bGUoKSB7fQogCi0gICAgdmlydHVhbCB+SUNvZGVjX0pwZWdNb2R1bGUoKSB7fQorICB2aXJ0dWFsIHZvaWQqIFN0YXJ0KHZvaWQqIHBNb2R1bGUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJU2V0UG92aWRlcihJRlhfSnBlZ1Byb3ZpZGVyKiBwSlApID0gMDsKKyAgdmlydHVhbCB2b2lkIEZpbmlzaCh2b2lkKiBwQ29udGV4dCkgPSAwOwogCi0gICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBGWF9CT09MIENvbG9yVHJhbnNmb3JtKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBJbnB1dCh2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyID0gTlVMTCwgRlhfRFdPUkQqIGljY19sZW5ndGggPSBOVUxMKSA9IDA7CisgIEZYX0JPT0wJCQkJKCpSZWFkSGVhZGVyQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwYywgaW50IHBhc3MsIGludCogY29sb3JfdHlwZSwgZG91YmxlKiBnYW1tYSk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCBjbGFzcyBDRlhfRElCU291cmNlKiBwU291cmNlLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwgaW50IHF1YWxpdHkgPSA3NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpY2NfYnVmID0gTlVMTCwgRlhfRFdPUkQgaWNjX2xlbmd0aCA9IDApID0gMDsKKyAgRlhfQk9PTCAoKkFza1NjYW5saW5lQnVmQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIGludCBsaW5lLCB1aW50OF90KiYgc3JjX2J1Zik7CiAKLSAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCgpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZAkJRmluaXNoKHZvaWQqIHBDb250ZXh0KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCUlucHV0KHZvaWQqIHBDb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQJCQlSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBuQ29tcHMsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKSA9IDA7DQotCi0KLSAgICB2aXJ0dWFsIGludAkJCVN0YXJ0U2NhbmxpbmUodm9pZCogcENvbnRleHQsIGludCBkb3duX3NjYWxlKSA9IDA7Ci0KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1ZikgPSAwOwotCi0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyID0gTlVMTCkgPSAwOworICB2b2lkICgqRmlsbFNjYW5saW5lQnVmQ29tcGxldGVkQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIGludCBwYXNzLCBpbnQgbGluZSk7CiB9OwotY2xhc3MgSUNvZGVjX0pweE1vZHVsZQotewotcHVibGljOgorY2xhc3MgSUNvZGVjX0dpZk1vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JQ29kZWNfR2lmTW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgfklDb2RlY19KcHhNb2R1bGUoKSB7fQorICB2aXJ0dWFsIHZvaWQqIFN0YXJ0KHZvaWQqIHBNb2R1bGUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCogCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgdXNlQ29sb3JTcGFjZSA9IEZBTFNFKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBGaW5pc2godm9pZCogcENvbnRleHQpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJR2V0SW1hZ2VJbmZvKHZvaWQqIGN0eCwgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb2Rlc3RyZWFtX25Db21wcywgRlhfRFdPUkQmIG91dHB1dF9uQ29tcHMpID0gMDsKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIgPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY29kZSh2b2lkKiBjdHgsIHVpbnQ4X3QqIGRlc3RfZGF0YSwgaW50IHBpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yLCB1aW50OF90KiBvZmZzZXRzKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBJbnB1dCh2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQlEZXN0cm95RGVjb2Rlcih2b2lkKiBjdHgpID0gMDsKLX07Ci1jbGFzcyBJQ29kZWNfUG5nTW9kdWxlCi17DQotcHVibGljOg0KLQ0KLSAgICB2aXJ0dWFsIH5JQ29kZWNfUG5nTW9kdWxlKCkge30NCi0NCi0gICAgdmlydHVhbCB2b2lkKgkJU3RhcnQodm9pZCogcE1vZHVsZSkgPSAwOw0KLQ0KLSAgICB2aXJ0dWFsIHZvaWQJCUZpbmlzaCh2b2lkKiBwQ29udGV4dCkgPSAwOw0KLQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlucHV0KHZvaWQqIHBDb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSA9IE5VTEwpID0gMDsNCi0NCi0gICAgRlhfQk9PTAkJCQkoKlJlYWRIZWFkZXJDYWxsYmFjaykodm9pZCogcE1vZHVsZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBjLCBpbnQgcGFzcywgaW50KiBjb2xvcl90eXBlLCBkb3VibGUqIGdhbW1hKTsNCi0NCi0gICAgRlhfQk9PTAkJCQkoKkFza1NjYW5saW5lQnVmQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIGludCBsaW5lLCB1aW50OF90KiYgc3JjX2J1Zik7DQotDQotICAgIHZvaWQJCQkJKCpGaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWRDYWxsYmFjaykodm9pZCogcE1vZHVsZSwgaW50IHBhc3MsIGludCBsaW5lKTsNCi19Ow0KLWNsYXNzIElDb2RlY19HaWZNb2R1bGUKLXsNCi1wdWJsaWM6DQotDQotICAgIHZpcnR1YWwgfklDb2RlY19HaWZNb2R1bGUoKSB7fQ0KLQ0KLSAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCh2b2lkKiBwTW9kdWxlKSA9IDA7DQotDQotICAgIHZpcnR1YWwgdm9pZAkJRmluaXNoKHZvaWQqIHBDb250ZXh0KSA9IDA7DQotDQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIgPSBOVUxMKSA9IDA7DQotDQotICAgIHZpcnR1YWwgdm9pZAkJSW5wdXQodm9pZCogcENvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKSA9IDA7DQotDQotICAgIHZpcnR1YWwgaW50MzJfdAlSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcGFsX251bSwgdm9pZCoqIHBhbF9wcCwgaW50KiBiZ19pbmRleCwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSA9IE5VTEwpID0gMDsNCi0NCi0gICAgdmlydHVhbCBpbnQzMl90CUxvYWRGcmFtZUluZm8odm9pZCogcENvbnRleHQsIGludCogZnJhbWVfbnVtKSA9IDA7DQotDQotICAgIHZvaWQJCQkJKCpSZWNvcmRDdXJyZW50UG9zaXRpb25DYWxsYmFjaykodm9pZCogcE1vZHVsZSwgRlhfRFdPUkQmIGN1cl9wb3MpOw0KLQ0KLSAgICB1aW50OF90KgkJCSgqQXNrTG9jYWxQYWxldHRlQnVmQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIGludDMyX3QgZnJhbWVfbnVtLCBpbnQzMl90IHBhbF9zaXplKTsNCi0NCi0gICAgdmlydHVhbCBpbnQzMl90CUxvYWRGcmFtZSh2b2lkKiBwQ29udGV4dCwgaW50IGZyYW1lX251bSwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSA9IE5VTEwpID0gMDsNCi0NCi0gICAgRlhfQk9PTAkJCQkoKklucHV0UmVjb3JkUG9zaXRpb25CdWZDYWxsYmFjaykodm9pZCogcE1vZHVsZSwgRlhfRFdPUkQgcmNkX3BvcywgY29uc3QgRlhfUkVDVCYgaW1nX3JjLA0KKyAgdmlydHVhbCBpbnQzMl90IFJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhbF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwYWxfcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYmdfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKSA9IDA7CisKKyAgdmlydHVhbCBpbnQzMl90IExvYWRGcmFtZUluZm8odm9pZCogcENvbnRleHQsIGludCogZnJhbWVfbnVtKSA9IDA7CisKKyAgdm9pZCAoKlJlY29yZEN1cnJlbnRQb3NpdGlvbkNhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLCBGWF9EV09SRCYgY3VyX3Bvcyk7CisKKyAgdWludDhfdCogKCpBc2tMb2NhbFBhbGV0dGVCdWZDYWxsYmFjaykodm9pZCogcE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZV9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGFsX3NpemUpOworCisgIHZpcnR1YWwgaW50MzJfdCBMb2FkRnJhbWUodm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlID0gTlVMTCkgPSAwOworCisgIEZYX0JPT0wJCQkJKCpJbnB1dFJlY29yZFBvc2l0aW9uQnVmQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIEZYX0RXT1JEIHJjZF9wb3MsIGNvbnN0IEZYX1JFQ1QmIGltZ19yYywNCiAgICAgICAgICAgICBpbnQzMl90IHBhbF9udW0sIHZvaWQqIHBhbF9wdHIsDQogICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLCBGWF9CT09MIHVzZXJfaW5wdXQsDQotICAgICAgICAgICAgaW50MzJfdCB0cmFuc19pbmRleCwgaW50MzJfdCBkaXNwb3NhbF9tZXRob2QsIEZYX0JPT0wgaW50ZXJsYWNlKTsNCi0NCi0gICAgdm9pZAkJCQkoKlJlYWRTY2FubGluZUNhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLCBpbnQzMl90IHJvd19udW0sIHVpbnQ4X3QqIHJvd19idWYpOw0KLX07DQotY2xhc3MgSUNvZGVjX0JtcE1vZHVsZQotew0KLXB1YmxpYzoNCi0NCi0gICAgdmlydHVhbCB+SUNvZGVjX0JtcE1vZHVsZSgpIHt9DQotDQotICAgIHZpcnR1YWwgdm9pZCoJCVN0YXJ0KHZvaWQqIHBNb2R1bGUpID0gMDsNCi0NCi0gICAgdmlydHVhbCB2b2lkCQlGaW5pc2godm9pZCogcENvbnRleHQpID0gMDsNCi0NCi0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiogYXZhaWxfYnVmX3B0ciA9IE5VTEwpID0gMDsNCi0NCi0gICAgdmlydHVhbCB2b2lkCQlJbnB1dCh2b2lkKiBwQ29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpID0gMDsNCi0NCi0gICAgdmlydHVhbCBpbnQzMl90CVJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsIGludDMyX3QqIHdpZHRoLCBpbnQzMl90KiBoZWlnaHQsIEZYX0JPT0wqIHRiX2ZsYWcsIGludDMyX3QqIGNvbXBvbmVudHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhbF9udW0sIEZYX0RXT1JEKiogcGFsX3BwLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlID0gTlVMTCkgPSAwOw0KLQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJTG9hZEltYWdlKHZvaWQqIHBDb250ZXh0KSA9IDA7DQotDQotICAgIEZYX0JPT0wJCQkJKCpJbnB1dEltYWdlUG9zaXRpb25CdWZDYWxsYmFjaykodm9pZCogcE1vZHVsZSwgRlhfRFdPUkQgcmNkX3Bvcyk7DQotDQotICAgIHZvaWQJCQkJKCpSZWFkU2NhbmxpbmVDYWxsYmFjaykodm9pZCogcE1vZHVsZSwgaW50MzJfdCByb3dfbnVtLCB1aW50OF90KiByb3dfYnVmKTsNCi19Ow0KLWNsYXNzIElDb2RlY19UaWZmTW9kdWxlCi17DQotcHVibGljOg0KLQ0KLSAgICB2aXJ0dWFsIH5JQ29kZWNfVGlmZk1vZHVsZSgpIHt9DQotDQotICAgIHZpcnR1YWwgdm9pZCogCUNyZWF0ZURlY29kZXIoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0cikgPSAwOw0KLQ0KLQ0KLSAgICB2aXJ0dWFsIHZvaWQJCUdldEZyYW1lcyh2b2lkKiBjdHgsIGludDMyX3QmIGZyYW1lcykgPSAwOw0KLQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUxvYWRGcmFtZUluZm8odm9pZCogY3R4LCBpbnQzMl90IGZyYW1lLCBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsIEZYX0RXT1JEJiBjb21wcywgRlhfRFdPUkQmIGJwYywgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSA9IE5VTEwpID0gMDsNCi0NCi0NCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZWNvZGUodm9pZCogY3R4LCBjbGFzcyBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCkgPSAwOw0KLQ0KLSAgICB2aXJ0dWFsIHZvaWQJCURlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCkgPSAwOw0KLX07DQotY2xhc3MgSUNvZGVjX0piaWcyTW9kdWxlCi17Ci1wdWJsaWM6CisgICAgICAgICAgICBpbnQzMl90IHRyYW5zX2luZGV4LCBpbnQzMl90IGRpc3Bvc2FsX21ldGhvZCwgRlhfQk9PTCBpbnRlcmxhY2UpOwogCi0gICAgdmlydHVhbCB+SUNvZGVjX0piaWcyTW9kdWxlKCkge30KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjb2RlKEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGdsb2JhbF9kYXRhLCBGWF9EV09SRCBnbG9iYWxfc2l6ZSwgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEIGRlc3RfcGl0Y2gpICA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY29kZShJRlhfRmlsZVJlYWQqIGZpbGVfcHRyLCBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHBpdGNoLCB1aW50OF90KiYgZGVzdF9idWYpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQqCQkJCUNyZWF0ZUpiaWcyQ29udGV4dCgpID0gMDsKLQotICAgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMJCVN0YXJ0RGVjb2RlKHZvaWQqIHBKYmlnMkNvbnRleHQsIEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnbG9iYWxfZGF0YSwgRlhfRFdPUkQgZ2xvYmFsX3NpemUsIHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCBkZXN0X3BpdGNoLCBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOwotCi0gICAgdmlydHVhbCBGWENPREVDX1NUQVRVUwkJU3RhcnREZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwgSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LCBGWF9EV09SRCYgcGl0Y2gsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgSUZYX1BhdXNlKiBwUGF1c2UpID0gMDsKLSAgICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTCQlDb250aW51ZURlY29kZSh2b2lkKiBwSmJpZzJDb250ZW50LCBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZAkJCQlEZXN0cm95SmJpZzJDb250ZXh0KHZvaWQqIHBKYmlnMkNvbnRlbnQpID0gMDsKKyAgdm9pZCAoKlJlYWRTY2FubGluZUNhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93X251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKTsKIH07Ci1jbGFzcyBJQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyCi17DQotcHVibGljOg0KLQ0KLSAgICB2aXJ0dWFsIH5JQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKCkge30NCi0NCi0gICAgdmlydHVhbCBGWENPREVDX1NUQVRVUwkJTG9hZEltYWdlSW5mbyhJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWENPREVDX0lNQUdFX1RZUEUgaW1hZ2VUeXBlID0gRlhDT0RFQ19JTUFHRV9VTktOT1dOLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlID0gTlVMTCkgPSAwOw0KLQ0KLSAgICB2aXJ0dWFsIEZYQ09ERUNfSU1BR0VfVFlQRQlHZXRUeXBlKCkgPSAwOw0KLQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRXaWR0aCgpID0gMDsNCi0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0SGVpZ2h0KCkgPSAwOw0KLQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXROdW1Db21wb25lbnRzKCkgPSAwOw0KLQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRCUEMoKSA9IDA7DQotDQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRDbGlwQm94KEZYX1JFQ1QqIGNsaXApID0gMDsNCi0NCi0gICAgdmlydHVhbCBGWENPREVDX1NUQVRVUwkJR2V0RnJhbWVzKGludDMyX3QmIGZyYW1lcywgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKSA9IDA7DQotDQotICAgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMJCVN0YXJ0RGVjb2RlKGNsYXNzIENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydF94LCBpbnQzMl90IHN0YXJ0X3ksIGludDMyX3Qgc2l6ZV94LCBpbnQzMl90IHNpemVfeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzID0gMCwgRlhfQk9PTCBiSW50ZXJwb2wgPSBUUlVFKSA9IDA7DQotDQotICAgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMJCUNvbnRpbnVlRGVjb2RlKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KLX07DQotY2xhc3MgSUNvZGVjX0piaWcyRW5jb2RlcgotewotcHVibGljOgorY2xhc3MgSUNvZGVjX0JtcE1vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JQ29kZWNfQm1wTW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgfklDb2RlY19KYmlnMkVuY29kZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQqIFN0YXJ0KHZvaWQqIHBNb2R1bGUpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgRmluaXNoKHZvaWQqIHBDb250ZXh0KSA9IDA7CisKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIgPSBOVUxMKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKSA9IDA7CisKKyAgdmlydHVhbCBpbnQzMl90IFJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wqIHRiX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGNvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcGFsX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqKiBwYWxfcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKSA9IDA7CisKKyAgdmlydHVhbCBpbnQzMl90IExvYWRJbWFnZSh2b2lkKiBwQ29udGV4dCkgPSAwOworCisgIEZYX0JPT0wgKCpJbnB1dEltYWdlUG9zaXRpb25CdWZDYWxsYmFjaykodm9pZCogcE1vZHVsZSwgRlhfRFdPUkQgcmNkX3Bvcyk7CisKKyAgdm9pZCAoKlJlYWRTY2FubGluZUNhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93X251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKTsKIH07Ci1jbGFzcyBJQ29kZWNfSWNjTW9kdWxlCi17Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgSWNjQ1NfVW5rbm93biA9IDAsCi0gICAgICAgIEljY0NTX1hZWiwKLSAgICAgICAgSWNjQ1NfTGFiLAotICAgICAgICBJY2NDU19MdXYsCi0gICAgICAgIEljY0NTX1lDYkNyLAotICAgICAgICBJY2NDU19ZeHksCi0gICAgICAgIEljY0NTX0hzdiwKLSAgICAgICAgSWNjQ1NfSGxzLAotICAgICAgICBJY2NDU19HcmF5LAotICAgICAgICBJY2NDU19SZ2IsCi0gICAgICAgIEljY0NTX0NteWssCi0gICAgICAgIEljY0NTX0NteQotICAgIH0gSWNjQ1M7Ci0gICAgdHlwZWRlZiBzdHJ1Y3QgX0ljY1BhcmFtIHsKLSAgICAgICAgRlhfRFdPUkQJVmVyc2lvbjsKLSAgICAgICAgSWNjQ1MJCUNvbG9yU3BhY2U7Ci0gICAgICAgIEZYX0RXT1JECWR3UHJvZmlsZVR5cGU7Ci0gICAgICAgIEZYX0RXT1JECWR3Rm9ybWF0OwotICAgICAgICB1aW50OF90KglwUHJvZmlsZURhdGE7Ci0gICAgICAgIEZYX0RXT1JECWR3UHJvZmlsZVNpemU7Ci0gICAgICAgIGRvdWJsZQkJR2FtbWE7Ci0gICAgfSBJY2NQYXJhbTsKK2NsYXNzIElDb2RlY19UaWZmTW9kdWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklDb2RlY19UaWZmTW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgfklDb2RlY19JY2NNb2R1bGUoKSB7fQorICB2aXJ0dWFsIHZvaWQqIENyZWF0ZURlY29kZXIoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0cikgPSAwOwogCi0gICAgdmlydHVhbCBJY2NDUwkJCUdldFByb2ZpbGVDUyhjb25zdCB1aW50OF90KiBwUHJvZmlsZURhdGEsIHVuc2lnbmVkIGludCBkd1Byb2ZpbGVTaXplKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZXRGcmFtZXModm9pZCogY3R4LCBpbnQzMl90JiBmcmFtZXMpID0gMDsKIAotICAgIHZpcnR1YWwgSWNjQ1MJCQlHZXRQcm9maWxlQ1MoSUZYX0ZpbGVSZWFkKiBwRmlsZSkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgTG9hZEZyYW1lSW5mbyh2b2lkKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgYnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlID0gTlVMTCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkKglDcmVhdGVUcmFuc2Zvcm0oSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBJbnB1dFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb2RlY19JY2NNb2R1bGU6OkljY1BhcmFtKiBwT3V0cHV0UGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBQcm9vZlBhcmFtID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ludGVudCA9IEljY19JTlRFTlRfUEVSQ0VQVFVBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBJY2NfRkxBR1NfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1ByZkludGVudCA9IEljY19JTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UHJmRmxhZyA9IEljY19GTEFHU19TT0ZUUFJPT0ZJTkcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIERlY29kZSh2b2lkKiBjdHgsIGNsYXNzIENGWF9ESUJpdG1hcCogcERJQml0bWFwKSA9IDA7CiAKKyAgdmlydHVhbCB2b2lkIERlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCkgPSAwOworfTsKK2NsYXNzIElDb2RlY19KYmlnMk1vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JQ29kZWNfSmJpZzJNb2R1bGUoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkKglDcmVhdGVUcmFuc2Zvcm1fc1JHQihjb25zdCB1aW50OF90KiBwUHJvZmlsZURhdGEsIEZYX0RXT1JEIGR3UHJvZmlsZVNpemUsIGludDMyX3QmIG5Db21wb25lbnRzLCBpbnQzMl90IGludGVudCA9IDAsCi0gICAgICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgRGVjb2RlKEZYX0RXT1JEIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGdsb2JhbF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdsb2JhbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc3RfcGl0Y2gpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCoJQ3JlYXRlVHJhbnNmb3JtX0NNWUsoY29uc3QgdWludDhfdCogcFNyY1Byb2ZpbGVEYXRhLCBGWF9EV09SRCBkd1NyY1Byb2ZpbGVTaXplLCBpbnQzMl90JiBuU3JjQ29tcG9uZW50cywKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBEc3RQcm9maWxlRGF0YSwgRlhfRFdPUkQgZHdEc3RQcm9maWxlU2l6ZSwgaW50MzJfdCBpbnRlbnQgPSAwLAotICAgICAgICAgICAgRlhfRFdPUkQgZHdTcmNGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICBGWF9EV09SRCBkd0RzdEZvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBEZWNvZGUoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmKSA9IDA7CisgIHZpcnR1YWwgdm9pZCogQ3JlYXRlSmJpZzJDb250ZXh0KCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJRGVzdHJveVRyYW5zZm9ybSh2b2lkKiBwVHJhbnNmb3JtKSA9IDA7CisgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMgU3RhcnREZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnbG9iYWxfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnbG9iYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlUcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwgRlhfRkxPQVQqIHBTcmNWYWx1ZXMsIEZYX0ZMT0FUKiBwRGVzdFZhbHVlcykgPSAwOworICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTIFN0YXJ0RGVjb2RlKHZvaWQqIHBKYmlnMkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSA9IDA7CisgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMgQ29udGludWVEZWNvZGUodm9pZCogcEpiaWcyQ29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgRGVzdHJveUpiaWcyQ29udGV4dCh2b2lkKiBwSmJpZzJDb250ZW50KSA9IDA7Cit9OworY2xhc3MgSUNvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKCkge30KIAotICAgIHZpcnR1YWwgdm9pZAkJCVRyYW5zbGF0ZVNjYW5saW5lKHZvaWQqIHBUcmFuc2Zvcm0sIHVpbnQ4X3QqIHBEZXN0LCBjb25zdCB1aW50OF90KiBwU3JjLCBpbnQgcGl4ZWxzKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q29tcG9uZW50cyhGWF9EV09SRCBuQ29tcG9uZW50cykgPSAwOworICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTIExvYWRJbWFnZUluZm8oCisgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlLAorICAgICAgRlhDT0RFQ19JTUFHRV9UWVBFIGltYWdlVHlwZSA9IEZYQ09ERUNfSU1BR0VfVU5LTk9XTiwKKyAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKSA9IDA7CisKKyAgdmlydHVhbCBGWENPREVDX0lNQUdFX1RZUEUgR2V0VHlwZSgpID0gMDsKKworICB2aXJ0dWFsIGludDMyX3QgR2V0V2lkdGgoKSA9IDA7CisKKyAgdmlydHVhbCBpbnQzMl90IEdldEhlaWdodCgpID0gMDsKKworICB2aXJ0dWFsIGludDMyX3QgR2V0TnVtQ29tcG9uZW50cygpID0gMDsKKworICB2aXJ0dWFsIGludDMyX3QgR2V0QlBDKCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBTZXRDbGlwQm94KEZYX1JFQ1QqIGNsaXApID0gMDsKKworICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTIEdldEZyYW1lcyhpbnQzMl90JiBmcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOworCisgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMgU3RhcnREZWNvZGUoY2xhc3MgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW50ZXJwb2wgPSBUUlVFKSA9IDA7CisKKyAgdmlydHVhbCBGWENPREVDX1NUQVRVUyBDb250aW51ZURlY29kZShJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsKK307CitjbGFzcyBJQ29kZWNfSmJpZzJFbmNvZGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklDb2RlY19KYmlnMkVuY29kZXIoKSB7fQorfTsKK2NsYXNzIElDb2RlY19JY2NNb2R1bGUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBlbnVtIHsKKyAgICBJY2NDU19Vbmtub3duID0gMCwKKyAgICBJY2NDU19YWVosCisgICAgSWNjQ1NfTGFiLAorICAgIEljY0NTX0x1diwKKyAgICBJY2NDU19ZQ2JDciwKKyAgICBJY2NDU19ZeHksCisgICAgSWNjQ1NfSHN2LAorICAgIEljY0NTX0hscywKKyAgICBJY2NDU19HcmF5LAorICAgIEljY0NTX1JnYiwKKyAgICBJY2NDU19DbXlrLAorICAgIEljY0NTX0NteQorICB9IEljY0NTOworICB0eXBlZGVmIHN0cnVjdCBfSWNjUGFyYW0geworICAgIEZYX0RXT1JEIFZlcnNpb247CisgICAgSWNjQ1MgQ29sb3JTcGFjZTsKKyAgICBGWF9EV09SRCBkd1Byb2ZpbGVUeXBlOworICAgIEZYX0RXT1JEIGR3Rm9ybWF0OworICAgIHVpbnQ4X3QqIHBQcm9maWxlRGF0YTsKKyAgICBGWF9EV09SRCBkd1Byb2ZpbGVTaXplOworICAgIGRvdWJsZSBHYW1tYTsKKyAgfSBJY2NQYXJhbTsKKworICB2aXJ0dWFsIH5JQ29kZWNfSWNjTW9kdWxlKCkge30KKworICB2aXJ0dWFsIEljY0NTIEdldFByb2ZpbGVDUyhjb25zdCB1aW50OF90KiBwUHJvZmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkd1Byb2ZpbGVTaXplKSA9IDA7CisKKyAgdmlydHVhbCBJY2NDUyBHZXRQcm9maWxlQ1MoSUZYX0ZpbGVSZWFkKiBwRmlsZSkgPSAwOworCisgIHZpcnR1YWwgdm9pZCogQ3JlYXRlVHJhbnNmb3JtKAorICAgICAgSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBJbnB1dFBhcmFtLAorICAgICAgSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBPdXRwdXRQYXJhbSwKKyAgICAgIElDb2RlY19JY2NNb2R1bGU6OkljY1BhcmFtKiBwUHJvb2ZQYXJhbSA9IE5VTEwsCisgICAgICBGWF9EV09SRCBkd0ludGVudCA9IEljY19JTlRFTlRfUEVSQ0VQVFVBTCwKKyAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IEljY19GTEFHU19ERUZBVUxULAorICAgICAgRlhfRFdPUkQgZHdQcmZJbnRlbnQgPSBJY2NfSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQywKKyAgICAgIEZYX0RXT1JEIGR3UHJmRmxhZyA9IEljY19GTEFHU19TT0ZUUFJPT0ZJTkcpID0gMDsKKworICB2aXJ0dWFsIHZvaWQqIENyZWF0ZVRyYW5zZm9ybV9zUkdCKAorICAgICAgY29uc3QgdWludDhfdCogcFByb2ZpbGVEYXRhLAorICAgICAgRlhfRFdPUkQgZHdQcm9maWxlU2l6ZSwKKyAgICAgIGludDMyX3QmIG5Db21wb25lbnRzLAorICAgICAgaW50MzJfdCBpbnRlbnQgPSAwLAorICAgICAgRlhfRFdPUkQgZHdTcmNGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQpID0gMDsKKworICB2aXJ0dWFsIHZvaWQqIENyZWF0ZVRyYW5zZm9ybV9DTVlLKAorICAgICAgY29uc3QgdWludDhfdCogcFNyY1Byb2ZpbGVEYXRhLAorICAgICAgRlhfRFdPUkQgZHdTcmNQcm9maWxlU2l6ZSwKKyAgICAgIGludDMyX3QmIG5TcmNDb21wb25lbnRzLAorICAgICAgY29uc3QgdWludDhfdCogcERzdFByb2ZpbGVEYXRhLAorICAgICAgRlhfRFdPUkQgZHdEc3RQcm9maWxlU2l6ZSwKKyAgICAgIGludDMyX3QgaW50ZW50ID0gMCwKKyAgICAgIEZYX0RXT1JEIGR3U3JjRm9ybWF0ID0gSWNjX0ZPUk1BVF9ERUZBVUxULAorICAgICAgRlhfRFdPUkQgZHdEc3RGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgRGVzdHJveVRyYW5zZm9ybSh2b2lkKiBwVHJhbnNmb3JtKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIFRyYW5zbGF0ZSh2b2lkKiBwVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwU3JjVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwRGVzdFZhbHVlcykgPSAwOworCisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVTY2FubGluZSh2b2lkKiBwVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscykgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0Q29tcG9uZW50cyhGWF9EV09SRCBuQ29tcG9uZW50cykgPSAwOwogfTsKIAotdm9pZCBBZG9iZUNNWUtfdG9fc1JHQihGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKTsKLXZvaWQgQWRvYmVDTVlLX3RvX3NSR0IxKHVpbnQ4X3QgYywgdWludDhfdCBtLCB1aW50OF90IHksIHVpbnQ4X3QgaywgdWludDhfdCYgUiwgdWludDhfdCYgRywgdWludDhfdCYgQik7Cit2b2lkIEFkb2JlQ01ZS190b19zUkdCKEZYX0ZMT0FUIGMsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG0sCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGssCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpOwordm9pZCBBZG9iZUNNWUtfdG9fc1JHQjEodWludDhfdCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBCKTsKIEZYX0JPT0wgTUQ1Q29tcHV0ZUlEKGNvbnN0IHZvaWQqIGJ1ZiwgRlhfRFdPUkQgZHdTaXplLCB1aW50OF90IElEWzE2XSk7Ci1jbGFzcyBDRlhfRElCQXR0cmlidXRlCi17DQotcHVibGljOg0KLSAgICBDRlhfRElCQXR0cmlidXRlKCk7DQotICAgIH5DRlhfRElCQXR0cmlidXRlKCk7DQotDQotICAgIGludDMyX3QJCW1fblhEUEk7DQotDQotICAgIGludDMyX3QJCW1fbllEUEk7DQotDQotICAgIEZYX0ZMT0FUCQltX2ZBc3BlY3RSYXRpbzsNCi0NCi0gICAgRlhfV09SRAkJCW1fd0RQSVVuaXQ7DQotDQotICAgIENGWF9CeXRlU3RyaW5nCW1fc3RyQXV0aG9yOw0KLQ0KLSAgICB1aW50OF90CQkJbV9zdHJUaW1lWzIwXTsNCi0NCi0gICAgaW50MzJfdAkJbV9uR2lmTGVmdDsNCi0gICAgaW50MzJfdAkJbV9uR2lmVG9wOw0KLQ0KLSAgICBGWF9EV09SRCoJCW1fcEdpZkxvY2FsUGFsZXR0ZTsNCi0NCi0gICAgRlhfRFdPUkQJCW1fbkdpZkxvY2FsUGFsTnVtOw0KLQ0KLSAgICBpbnQzMl90CQltX25CbXBDb21wcmVzc1R5cGU7DQotICAgIGNsYXNzIElGWF9ESUJBdHRyaWJ1dGVFeGlmKiBtX3BFeGlmOw0KLX07DQotY2xhc3MgSUZYX0RJQkF0dHJpYnV0ZUV4aWYKLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGWF9ESUJBdHRyaWJ1dGVFeGlmKCkge307DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0SW5mbyhGWF9XT1JEIHRhZywgdm9pZCogdmFsKSA9IDA7DQotfTsNCitjbGFzcyBDRlhfRElCQXR0cmlidXRlIHsKKyBwdWJsaWM6CisgIENGWF9ESUJBdHRyaWJ1dGUoKTsKKyAgfkNGWF9ESUJBdHRyaWJ1dGUoKTsKKworICBpbnQzMl90IG1fblhEUEk7CisKKyAgaW50MzJfdCBtX25ZRFBJOworCisgIEZYX0ZMT0FUIG1fZkFzcGVjdFJhdGlvOworCisgIEZYX1dPUkQgbV93RFBJVW5pdDsKKworICBDRlhfQnl0ZVN0cmluZyBtX3N0ckF1dGhvcjsKKworICB1aW50OF90IG1fc3RyVGltZVsyMF07CisKKyAgaW50MzJfdCBtX25HaWZMZWZ0OworICBpbnQzMl90IG1fbkdpZlRvcDsKKworICBGWF9EV09SRCogbV9wR2lmTG9jYWxQYWxldHRlOworCisgIEZYX0RXT1JEIG1fbkdpZkxvY2FsUGFsTnVtOworCisgIGludDMyX3QgbV9uQm1wQ29tcHJlc3NUeXBlOworICBjbGFzcyBJRlhfRElCQXR0cmlidXRlRXhpZiogbV9wRXhpZjsKK307CitjbGFzcyBJRlhfRElCQXR0cmlidXRlRXhpZiB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfRElCQXR0cmlidXRlRXhpZigpe307CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRJbmZvKEZYX1dPUkQgdGFnLCB2b2lkKiB2YWwpID0gMDsKK307CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZYQ09ERUNfRlhfQ09ERUNfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX2RlZi5oIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgKaW5kZXggMzZhNWUwZC4uMWNiNTkwOSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgKQEAgLTgsODEgKzgsODEgQEAKICNkZWZpbmUgQ09SRV9JTkNMVURFX0ZYQ09ERUNfRlhfQ09ERUNfREVGX0hfCiAKIGVudW0gRlhDT0RFQ19JTUFHRV9UWVBFIHsKLSAgICBGWENPREVDX0lNQUdFX1VOS05PV04gPSAwLAotICAgIEZYQ09ERUNfSU1BR0VfQk1QLAotICAgIEZYQ09ERUNfSU1BR0VfSlBHLAotICAgIEZYQ09ERUNfSU1BR0VfUE5HLAotICAgIEZYQ09ERUNfSU1BR0VfR0lGLAotICAgIEZYQ09ERUNfSU1BR0VfVElGLAotICAgIEZYQ09ERUNfSU1BR0VfTUFYCisgIEZYQ09ERUNfSU1BR0VfVU5LTk9XTiA9IDAsCisgIEZYQ09ERUNfSU1BR0VfQk1QLAorICBGWENPREVDX0lNQUdFX0pQRywKKyAgRlhDT0RFQ19JTUFHRV9QTkcsCisgIEZYQ09ERUNfSU1BR0VfR0lGLAorICBGWENPREVDX0lNQUdFX1RJRiwKKyAgRlhDT0RFQ19JTUFHRV9NQVgKIH07CiBlbnVtIEZYQ09ERUNfU1RBVFVTIHsKLSAgICBGWENPREVDX1NUQVRVU19FUlJPUiA9IC0xLAotICAgIEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZLAotICAgIEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1RPQkVDT05USU5VRSwKLSAgICBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFksCi0gICAgRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSwKLSAgICBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNILAotICAgIEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlksCi0gICAgRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQsCi0gICAgRlhDT0RFQ19TVEFUVVNfRVJSX0ZMVVNILAotICAgIEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQsCi0gICAgRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUworICBGWENPREVDX1NUQVRVU19FUlJPUiA9IC0xLAorICBGWENPREVDX1NUQVRVU19GUkFNRV9SRUFEWSwKKyAgRlhDT0RFQ19TVEFUVVNfRlJBTUVfVE9CRUNPTlRJTlVFLAorICBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFksCisgIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUsCisgIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0gsCisgIEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlksCisgIEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFELAorICBGWENPREVDX1NUQVRVU19FUlJfRkxVU0gsCisgIEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQsCisgIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVMKIH07Ci0jZGVmaW5lIEpQMl9TUEFDRV9JTlZBTElECS0xCi0jZGVmaW5lIEpQWF9TUEFDRV9JTlZBTElECS0xCi0jZGVmaW5lIEpQMl9TUEFDRV9iaWxldmVsMQkwCi0jZGVmaW5lIEpQMl9TUEFDRV9ZQ2JDcjEJMQotI2RlZmluZSBKUDJfU1BBQ0VfWUNiQ3IyCTMKLSNkZWZpbmUgSlAyX1NQQUNFX1lDYkNyMwk0Ci0jZGVmaW5lIEpQMl9TUEFDRV9QaG90b1lDQwk5Ci0jZGVmaW5lIEpQMl9TUEFDRV9DTVkJCTExCi0jZGVmaW5lIEpQMl9TUEFDRV9DTVlLCQkxMgotI2RlZmluZSBKUDJfU1BBQ0VfWUNDSwkJMTMKLSNkZWZpbmUgSlAyX1NQQUNFX0NJRUxhYgkxNAotI2RlZmluZSBKUDJfU1BBQ0VfYmlsZXZlbDIJMTUKLSNkZWZpbmUgSlAyX1NQQUNFX3NSR0IJCTE2Ci0jZGVmaW5lIEpQMl9TUEFDRV9zTFVNCQkxNwotI2RlZmluZSBKUDJfU1BBQ0Vfc1lDQwkJMTgKLSNkZWZpbmUgSlAyX1NQQUNFX0NJRUphYgkxOQotI2RlZmluZSBKUDJfU1BBQ0VfZXNSR0IJCTIwCi0jZGVmaW5lIEpQMl9TUEFDRV9ST01NUkdCCTIxCi0jZGVmaW5lIEpQMl9TUEFDRV9ZUGJQcjYwCTIyCi0jZGVmaW5lIEpQMl9TUEFDRV9ZUGJQcjUwCTIzCi0jZGVmaW5lIEpQMl9TUEFDRV9lc1lDQwkJMjQKLSNkZWZpbmUgSlAyX1NQQUNFX2ljY0xVTQkxMDAKLSNkZWZpbmUgSlAyX1NQQUNFX2ljY1JHQgkxMDEKLSNkZWZpbmUgSWNjX0lOVEVOVF9QRVJDRVBUVUFMCQkJCTAKLSNkZWZpbmUgSWNjX0lOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMJMQotI2RlZmluZSBJY2NfSU5URU5UX1NBVFVSQVRJT04JCQkJMgotI2RlZmluZSBJY2NfSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQwkzCi0jZGVmaW5lIEljY19GT1JNQVRfREVGQVVMVAkJCQkJMAotI2RlZmluZSBJY2NfRk9STUFUX1NXQVAJCQkJCQkoMTw8MTApCi0jZGVmaW5lIEljY19GTEFHU19ERUZBVUxUCQkJCQkweDAwMDAKLSNkZWZpbmUgSWNjX0ZMQUdTX0JMQUNLUE9JTlRDT01QRU5TQVRJT04JMHgyMDAwCi0jZGVmaW5lIEljY19GTEFHU19OT1dISVRFT05XSElURUZJWFVQCQkweDAwMDQKLSNkZWZpbmUgSWNjX0ZMQUdTX0hJR0hSRVNQUkVDQUxDCQkJMHgwNDAwCi0jZGVmaW5lIEljY19GTEFHU19MT1dSRVNQUkVDQUxDCQkJCTB4MDgwMAotI2RlZmluZSBJY2NfRkxBR1NfR0FNVVRDSEVDSwkJCQkweDEwMDAKLSNkZWZpbmUgSWNjX0ZMQUdTX1NPRlRQUk9PRklORwkJCQkweDQwMDAKLSNkZWZpbmUgSWNjX1BBUkFNVFlQRV9OT05FCQkJCQkwCi0jZGVmaW5lIEljY19QQVJBTVRZUEVfQlVGRkVSCQkJCTEKLSNkZWZpbmUgSWNjX1BBUkFNVFlQRV9QQVJBTQkJCQkJMgorI2RlZmluZSBKUDJfU1BBQ0VfSU5WQUxJRCAtMQorI2RlZmluZSBKUFhfU1BBQ0VfSU5WQUxJRCAtMQorI2RlZmluZSBKUDJfU1BBQ0VfYmlsZXZlbDEgMAorI2RlZmluZSBKUDJfU1BBQ0VfWUNiQ3IxIDEKKyNkZWZpbmUgSlAyX1NQQUNFX1lDYkNyMiAzCisjZGVmaW5lIEpQMl9TUEFDRV9ZQ2JDcjMgNAorI2RlZmluZSBKUDJfU1BBQ0VfUGhvdG9ZQ0MgOQorI2RlZmluZSBKUDJfU1BBQ0VfQ01ZIDExCisjZGVmaW5lIEpQMl9TUEFDRV9DTVlLIDEyCisjZGVmaW5lIEpQMl9TUEFDRV9ZQ0NLIDEzCisjZGVmaW5lIEpQMl9TUEFDRV9DSUVMYWIgMTQKKyNkZWZpbmUgSlAyX1NQQUNFX2JpbGV2ZWwyIDE1CisjZGVmaW5lIEpQMl9TUEFDRV9zUkdCIDE2CisjZGVmaW5lIEpQMl9TUEFDRV9zTFVNIDE3CisjZGVmaW5lIEpQMl9TUEFDRV9zWUNDIDE4CisjZGVmaW5lIEpQMl9TUEFDRV9DSUVKYWIgMTkKKyNkZWZpbmUgSlAyX1NQQUNFX2VzUkdCIDIwCisjZGVmaW5lIEpQMl9TUEFDRV9ST01NUkdCIDIxCisjZGVmaW5lIEpQMl9TUEFDRV9ZUGJQcjYwIDIyCisjZGVmaW5lIEpQMl9TUEFDRV9ZUGJQcjUwIDIzCisjZGVmaW5lIEpQMl9TUEFDRV9lc1lDQyAyNAorI2RlZmluZSBKUDJfU1BBQ0VfaWNjTFVNIDEwMAorI2RlZmluZSBKUDJfU1BBQ0VfaWNjUkdCIDEwMQorI2RlZmluZSBJY2NfSU5URU5UX1BFUkNFUFRVQUwgMAorI2RlZmluZSBJY2NfSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQyAxCisjZGVmaW5lIEljY19JTlRFTlRfU0FUVVJBVElPTiAyCisjZGVmaW5lIEljY19JTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDIDMKKyNkZWZpbmUgSWNjX0ZPUk1BVF9ERUZBVUxUIDAKKyNkZWZpbmUgSWNjX0ZPUk1BVF9TV0FQICgxIDw8IDEwKQorI2RlZmluZSBJY2NfRkxBR1NfREVGQVVMVCAweDAwMDAKKyNkZWZpbmUgSWNjX0ZMQUdTX0JMQUNLUE9JTlRDT01QRU5TQVRJT04gMHgyMDAwCisjZGVmaW5lIEljY19GTEFHU19OT1dISVRFT05XSElURUZJWFVQIDB4MDAwNAorI2RlZmluZSBJY2NfRkxBR1NfSElHSFJFU1BSRUNBTEMgMHgwNDAwCisjZGVmaW5lIEljY19GTEFHU19MT1dSRVNQUkVDQUxDIDB4MDgwMAorI2RlZmluZSBJY2NfRkxBR1NfR0FNVVRDSEVDSyAweDEwMDAKKyNkZWZpbmUgSWNjX0ZMQUdTX1NPRlRQUk9PRklORyAweDQwMDAKKyNkZWZpbmUgSWNjX1BBUkFNVFlQRV9OT05FIDAKKyNkZWZpbmUgSWNjX1BBUkFNVFlQRV9CVUZGRVIgMQorI2RlZmluZSBJY2NfUEFSQU1UWVBFX1BBUkFNIDIKIGVudW0gRlhDT0RFQ19SRVNVTklUIHsKLSAgICBGWENPREVDX1JFU1VOSVRfTk9ORSA9IDAsCi0gICAgRlhDT0RFQ19SRVNVTklUX0lOQ0gsCi0gICAgRlhDT0RFQ19SRVNVTklUX0NFTlRJTUVURVIsCi0gICAgRlhDT0RFQ19SRVNVTklUX01FVEVSCisgIEZYQ09ERUNfUkVTVU5JVF9OT05FID0gMCwKKyAgRlhDT0RFQ19SRVNVTklUX0lOQ0gsCisgIEZYQ09ERUNfUkVTVU5JVF9DRU5USU1FVEVSLAorICBGWENPREVDX1JFU1VOSVRfTUVURVIKIH07Ci0jZGVmaW5lIEVYSUZUQUdfVVNIT1JUX1JFU1VOSVQJCQkJMjk2Ci0jZGVmaW5lIEVYSUZUQUdfRkxPQVRfRFBJWAkJCQkJMjgyCi0jZGVmaW5lIEVYSUZUQUdfRkxPQVRfRFBJWQkJCQkJMjgzCi0jZGVmaW5lIEVYSUZUQUdfVVNIT1JUX09SSUVOVEFUSU9OCQkJMjc0Ci0jZGVmaW5lIEVYSUZUQUdfU1RSSU5HX01BTlVGQUNUVVJFUgkJCTI3MQotI2RlZmluZSBFWElGVEFHX1NUUklOR19NT0RVTEUJCQkJMjcyCi0jZGVmaW5lIEVYSUZUQUdfU1RSSU5HX1NPRlRXQVJFCQkJCTMwNQotI2RlZmluZSBFWElGVEFHX1NUUklOR19JQU1HRURFU0NSSVBUSU9OCQkyNzAKLSNkZWZpbmUgRVhJRlRBR19TVFJJTkdfREFURVRJTUUJCQkJMzA2Ci0jZGVmaW5lIEVYSUZUQUdfU1RSSU5HX0NPUFlSSUdIVAkJCTMzNDMyCisjZGVmaW5lIEVYSUZUQUdfVVNIT1JUX1JFU1VOSVQgMjk2CisjZGVmaW5lIEVYSUZUQUdfRkxPQVRfRFBJWCAyODIKKyNkZWZpbmUgRVhJRlRBR19GTE9BVF9EUElZIDI4MworI2RlZmluZSBFWElGVEFHX1VTSE9SVF9PUklFTlRBVElPTiAyNzQKKyNkZWZpbmUgRVhJRlRBR19TVFJJTkdfTUFOVUZBQ1RVUkVSIDI3MQorI2RlZmluZSBFWElGVEFHX1NUUklOR19NT0RVTEUgMjcyCisjZGVmaW5lIEVYSUZUQUdfU1RSSU5HX1NPRlRXQVJFIDMwNQorI2RlZmluZSBFWElGVEFHX1NUUklOR19JQU1HRURFU0NSSVBUSU9OIDI3MAorI2RlZmluZSBFWElGVEFHX1NUUklOR19EQVRFVElNRSAzMDYKKyNkZWZpbmUgRVhJRlRBR19TVFJJTkdfQ09QWVJJR0hUIDMzNDMyCiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZYQ09ERUNfRlhfQ09ERUNfREVGX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19mbGF0ZS5oIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZmxhdGUuaAppbmRleCA4NDk1YTM3Li43ZDAxMDYxIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19mbGF0ZS5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX2ZsYXRlLmgKQEAgLTEzLDkgKzEzLDExIEBACiAvLyBOb3RlOiBTb21lIG9mIHRoZXNlIHJldHVybiBaXyogc3RhdHVzIGNvZGVzIGZyb20gemxpYi5oLgogdm9pZCogRlBERkFQSV9GbGF0ZUluaXQodm9pZCogKCphbGxvY19mdW5jKSh2b2lkKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZyZWVfZnVuYykodm9pZCosIHZvaWQqKSk7Ci12b2lkIEZQREZBUElfRmxhdGVJbnB1dCh2b2lkKiBjb250ZXh0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfYnVmLAordm9pZCBGUERGQVBJX0ZsYXRlSW5wdXQodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3JjX3NpemUpOwotaW50IEZQREZBUElfRmxhdGVPdXRwdXQodm9pZCogY29udGV4dCwgdW5zaWduZWQgY2hhciogZGVzdF9idWYsCitpbnQgRlBERkFQSV9GbGF0ZU91dHB1dCh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZGVzdF9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9zaXplKTsKIGludCBGUERGQVBJX0ZsYXRlR2V0QXZhaWxJbih2b2lkKiBjb250ZXh0KTsKIGludCBGUERGQVBJX0ZsYXRlR2V0QXZhaWxPdXQodm9pZCogY29udGV4dCk7CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19wcm92aWRlci5oIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfcHJvdmlkZXIuaAppbmRleCBhNDY1ZmUyLi5iZDRkYjQ0IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19wcm92aWRlci5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX3Byb3ZpZGVyLmgKQEAgLTExLDUwICsxMSw2NyBAQAogCiBjbGFzcyBDRlhfRElCQXR0cmlidXRlOwogCi1jbGFzcyBJRlhfSnBlZ1Byb3ZpZGVyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOworY2xhc3MgSUZYX0pwZWdQcm92aWRlciB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCoJCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSkgPSAwOworICB2aXJ0dWFsIHZvaWQqIENyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIENvbG9yVHJhbnNmb3JtKSA9IDA7CiAKKyAgdmlydHVhbCB2b2lkIERlc3Ryb3lEZWNvZGVyKHZvaWQqIHBEZWNvZGVyKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCURlc3Ryb3lEZWNvZGVyKHZvaWQqIHBEZWNvZGVyKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBEb3duU2NhbGUodm9pZCogcERlY29kZXIsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJRG93blNjYWxlKHZvaWQqIHBEZWNvZGVyLCBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBSZXdpbmQodm9pZCogcERlY29kZXIpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmV3aW5kKHZvaWQqIHBEZWNvZGVyKSA9IDA7CisgIHZpcnR1YWwgdWludDhfdCogR2V0TmV4dExpbmUodm9pZCogcERlY29kZXIpID0gMDsKIAotICAgIHZpcnR1YWwgdWludDhfdCoJR2V0TmV4dExpbmUodm9pZCogcERlY29kZXIpID0gMDsKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRTcmNPZmZzZXQodm9pZCogcERlY29kZXIpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3JjT2Zmc2V0KHZvaWQqIHBEZWNvZGVyKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBpY2NfbGVuZ3RoID0gTlVMTCkgPSAwOwogCisgIHZpcnR1YWwgRlhfQk9PTCBFbmNvZGUoY29uc3QgY2xhc3MgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSYgZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5ID0gNzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogaWNjX2J1ZiA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgaWNjX2xlbmd0aCA9IDApID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBGWF9CT09MJiBjb2xvcl90cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogaWNjX2J1Zl9wdHIgPSBOVUxMLCBGWF9EV09SRCogaWNjX2xlbmd0aCA9IE5VTEwpID0gMDsKKyAgdmlydHVhbCB2b2lkKiBTdGFydCgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJRW5jb2RlKGNvbnN0IGNsYXNzIENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfU1RSU0laRSYgZGVzdF9zaXplLCBpbnQgcXVhbGl0eSA9IDc1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGljY19idWYgPSBOVUxMLCBGWF9EV09SRCBpY2NfbGVuZ3RoID0gMCkgPSAwOworICB2aXJ0dWFsIHZvaWQgRmluaXNoKHZvaWQqIHBDb250ZXh0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCUZpbmlzaCh2b2lkKiBwQ29udGV4dCkgPSAwOworICB2aXJ0dWFsIGludCBSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJSW5wdXQodm9pZCogcENvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKSA9IDA7CisgIHZpcnR1YWwgaW50IFN0YXJ0U2NhbmxpbmUodm9pZCogcENvbnRleHQsIGludCBkb3duX3NjYWxlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGludAkJCVJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsIGludCogd2lkdGgsIGludCogaGVpZ2h0LCBpbnQqIG5Db21wcywgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSA9IE5VTEwpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgdWludDhfdCogZGVzdF9idWYpID0gMDsKIAotICAgIHZpcnR1YWwgaW50CQkJU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpID0gMDsKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIgPSBOVUxMKSA9IDA7CiAKLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1ZikgPSAwOwotCi0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyID0gTlVMTCkgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgfklGWF9KcGVnUHJvdmlkZXIoKSB7IH0KKyBwcm90ZWN0ZWQ6CisgIH5JRlhfSnBlZ1Byb3ZpZGVyKCkge30KIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZYQ09ERUNfRlhfQ09ERUNfUFJPVklERVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9hcmIuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9hcmIuaAppbmRleCAzODg2YWMzLi5kMzYxMmRiIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYXJiLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2FyYi5oCkBAIC0xMywyNiArMTMsMjUgQEAKIGNsYXNzIElGWF9BcmFiaWNDaGFyOwogY2xhc3MgSUZYX0JpZGlDaGFyOwogI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17CitleHRlcm4gIkMiIHsKICNlbmRpZgogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0FSQkZPUk1UQUJMRSB7Ci0gICAgRlhfV0NIQVIJd0lzb2xhdGVkOwotICAgIEZYX1dDSEFSCXdGaW5hbDsKLSAgICBGWF9XQ0hBUgl3SW5pdGlhbDsKLSAgICBGWF9XQ0hBUgl3TWVkaWFsOwotfSBGWF9BUkJGT1JNVEFCTEUsICogRlhfTFBBUkJGT1JNVEFCTEU7Ci10eXBlZGVmIEZYX0FSQkZPUk1UQUJMRSBjb25zdCAqIEZYX0xQQ0FSQkZPUk1UQUJMRTsKKyAgRlhfV0NIQVIgd0lzb2xhdGVkOworICBGWF9XQ0hBUiB3RmluYWw7CisgIEZYX1dDSEFSIHdJbml0aWFsOworICBGWF9XQ0hBUiB3TWVkaWFsOworfSBGWF9BUkJGT1JNVEFCTEUsICpGWF9MUEFSQkZPUk1UQUJMRTsKK3R5cGVkZWYgRlhfQVJCRk9STVRBQkxFIGNvbnN0KiBGWF9MUENBUkJGT1JNVEFCTEU7CiB0eXBlZGVmIHN0cnVjdCBfRlhfQVJBQUxFRiB7Ci0gICAgRlhfV0NIQVIJd0FsZWY7Ci0gICAgRlhfV0NIQVIJd0lzb2xhdGVkOwotfSBGWF9BUkFBTEVGLCAqIEZYX0xQQVJBQUxFRjsKLXR5cGVkZWYgRlhfQVJBQUxFRiBjb25zdCAqIEZYX0xQQ0FSQUFMRUY7CisgIEZYX1dDSEFSIHdBbGVmOworICBGWF9XQ0hBUiB3SXNvbGF0ZWQ7Cit9IEZYX0FSQUFMRUYsICpGWF9MUEFSQUFMRUY7Cit0eXBlZGVmIEZYX0FSQUFMRUYgY29uc3QqIEZYX0xQQ0FSQUFMRUY7CiB0eXBlZGVmIHN0cnVjdCBfRlhfQVJBU0hBRERBIHsKLSAgICBGWF9XQ0hBUgl3U2hhZGRhOwotICAgIEZYX1dDSEFSCXdJc29sYXRlZDsKLX0gRlhfQVJBU0hBRERBLCAqIEZYX0xQQVJBU0hBRERBOwotdHlwZWRlZiBGWF9BUkFTSEFEREEgY29uc3QgKiBGWF9MUENBUkFTSEFEREE7CisgIEZYX1dDSEFSIHdTaGFkZGE7CisgIEZYX1dDSEFSIHdJc29sYXRlZDsKK30gRlhfQVJBU0hBRERBLCAqRlhfTFBBUkFTSEFEREE7Cit0eXBlZGVmIEZYX0FSQVNIQUREQSBjb25zdCogRlhfTFBDQVJBU0hBRERBOwogRlhfTFBDQVJCRk9STVRBQkxFIEZYX0dldEFyYWJpY0Zvcm1UYWJsZShGWF9XQ0hBUiB1bmljb2RlKTsKIEZYX1dDSEFSIEZYX0dldEFyYWJpY0Zyb21BbGVmVGFibGUoRlhfV0NIQVIgYWxlZik7CiBGWF9XQ0hBUiBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUoRlhfV0NIQVIgc2hhZGRhKTsKQEAgLTQwLDM2ICszOSw0MiBAQAogfTsKICNlbmRpZgogZW51bSBGWF9BUkJQT1NJVElPTiB7Ci0gICAgRlhfQVJCUE9TSVRJT05fSXNvbGF0ZWQgPSAwLAotICAgIEZYX0FSQlBPU0lUSU9OX0ZpbmFsLAotICAgIEZYX0FSQlBPU0lUSU9OX0luaXRpYWwsCi0gICAgRlhfQVJCUE9TSVRJT05fTWVkaWFsLAorICBGWF9BUkJQT1NJVElPTl9Jc29sYXRlZCA9IDAsCisgIEZYX0FSQlBPU0lUSU9OX0ZpbmFsLAorICBGWF9BUkJQT1NJVElPTl9Jbml0aWFsLAorICBGWF9BUkJQT1NJVElPTl9NZWRpYWwsCiB9OwotY2xhc3MgSUZYX0FyYWJpY0NoYXIKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgSUZYX0FyYWJpY0NoYXIqCQlDcmVhdGUoKTsKLSAgICB2aXJ0dWFsIH5JRlhfQXJhYmljQ2hhcigpIHt9Ci0gICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCUlzQXJhYmljQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSXNBcmFiaWNGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIEZYX1dDSEFSCQkJR2V0Rm9ybUNoYXIoRlhfV0NIQVIgd2NoLCBGWF9XQ0hBUiBwcmV2ID0gMCwgRlhfV0NIQVIgbmV4dCA9IDApIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIEZYX1dDSEFSCQkJR2V0Rm9ybUNoYXIoY29uc3QgQ0ZYX0NoYXIgKmN1ciwgY29uc3QgQ0ZYX0NoYXIgKnByZXYsIGNvbnN0IENGWF9DaGFyICpuZXh0KSBjb25zdCA9IDA7CitjbGFzcyBJRlhfQXJhYmljQ2hhciB7CisgcHVibGljOgorICBzdGF0aWMgSUZYX0FyYWJpY0NoYXIqIENyZWF0ZSgpOworICB2aXJ0dWFsIH5JRlhfQXJhYmljQ2hhcigpIHt9CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNBcmFiaWNDaGFyKEZYX1dDSEFSIHdjaCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNBcmFiaWNGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9XQ0hBUiBHZXRGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgcHJldiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgbmV4dCA9IDApIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9XQ0hBUiBHZXRGb3JtQ2hhcihjb25zdCBDRlhfQ2hhciogY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DaGFyKiBwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DaGFyKiBuZXh0KSBjb25zdCA9IDA7CiB9Owotdm9pZCBGWF9CaWRpTGluZShDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBpbnQzMl90IGlCYXNlTGV2ZWwgPSAwKTsKLXZvaWQgRlhfQmlkaUxpbmUoQ0ZYX1R4dENoYXJBcnJheSAmY2hhcnMsIGludDMyX3QgaUNvdW50LCBpbnQzMl90IGlCYXNlTGV2ZWwgPSAwKTsKLXZvaWQgRlhfQmlkaUxpbmUoQ0ZYX1JURkNoYXJBcnJheSAmY2hhcnMsIGludDMyX3QgaUNvdW50LCBpbnQzMl90IGlCYXNlTGV2ZWwgPSAwKTsKLWNsYXNzIElGWF9CaWRpQ2hhcgotewotcHVibGljOgotICAgIHN0YXRpYyBJRlhfQmlkaUNoYXIqIENyZWF0ZSgpOwotICAgIHZpcnR1YWwgfklGWF9CaWRpQ2hhcigpIHt9Cit2b2lkIEZYX0JpZGlMaW5lKENGWF9XaWRlU3RyaW5nJiB3c1RleHQsIGludDMyX3QgaUJhc2VMZXZlbCA9IDApOwordm9pZCBGWF9CaWRpTGluZShDRlhfVHh0Q2hhckFycmF5JiBjaGFycywKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCisgICAgICAgICAgICAgICAgIGludDMyX3QgaUJhc2VMZXZlbCA9IDApOwordm9pZCBGWF9CaWRpTGluZShDRlhfUlRGQ2hhckFycmF5JiBjaGFycywKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCisgICAgICAgICAgICAgICAgIGludDMyX3QgaUJhc2VMZXZlbCA9IDApOworY2xhc3MgSUZYX0JpZGlDaGFyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBJRlhfQmlkaUNoYXIqIENyZWF0ZSgpOworICB2aXJ0dWFsIH5JRlhfQmlkaUNoYXIoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIFNldFBvbGljeShGWF9CT09MIGJTZXBhcmF0ZU5ldXRyYWwgPSBUUlVFKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MIEVuZENoYXIoKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQzMl90IEdldEJpZGlJbmZvKGludDMyX3QgJmlTdGFydCwgaW50MzJfdCAmaUNvdW50KSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIFJlc2V0KCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0UG9saWN5KEZYX0JPT0wgYlNlcGFyYXRlTmV1dHJhbCA9IFRSVUUpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBFbmRDaGFyKCkgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0QmlkaUluZm8oaW50MzJfdCYgaVN0YXJ0LCBpbnQzMl90JiBpQ291bnQpID0gMDsKKyAgdmlydHVhbCB2b2lkIFJlc2V0KCkgPSAwOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlhDUlRfRlhfQVJCX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oCmluZGV4IGRjYzEwODEuLjAwNzlhY2QgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oCkBAIC0yNSwxNjA5ICsyNSwxMzc1IEBACiAvLyBOb3RlIHRoYXQgdGhlIGZ1bmN0aW9uIGRvZXNuJ3QgbmVlZCBhbiBpbXBsZW1lbnRhdGlvbiwgYXMgd2Ugb25seQogLy8gdXNlIGl0cyB0eXBlLgogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY2hhciAoJkFycmF5U2l6ZUhlbHBlcihUICgmYXJyYXkpW05dKSlbTl07CitjaGFyKCZBcnJheVNpemVIZWxwZXIoVCgmYXJyYXkpW05dKSlbTl07CiAKLWNsYXNzIENGWF9CaW5hcnlCdWYKLXsKLXB1YmxpYzoKLSAgICBDRlhfQmluYXJ5QnVmKCk7Ci0gICAgQ0ZYX0JpbmFyeUJ1ZihGWF9TVFJTSVpFIHNpemUpOworY2xhc3MgQ0ZYX0JpbmFyeUJ1ZiB7CisgcHVibGljOgorICBDRlhfQmluYXJ5QnVmKCk7CisgIENGWF9CaW5hcnlCdWYoRlhfU1RSU0laRSBzaXplKTsKIAotICAgIH5DRlhfQmluYXJ5QnVmKCk7CisgIH5DRlhfQmluYXJ5QnVmKCk7CiAKLSAgICB2b2lkCQkJCQlDbGVhcigpOworICB2b2lkIENsZWFyKCk7CiAKLSAgICB2b2lkCQkJCQlFc3RpbWF0ZVNpemUoRlhfU1RSU0laRSBzaXplLCBGWF9TVFJTSVpFIGFsbG9jX3N0ZXAgPSAwKTsKKyAgdm9pZCBFc3RpbWF0ZVNpemUoRlhfU1RSU0laRSBzaXplLCBGWF9TVFJTSVpFIGFsbG9jX3N0ZXAgPSAwKTsKIAotICAgIHZvaWQJCQkJCUFwcGVuZEJsb2NrKGNvbnN0IHZvaWQqIHBCdWYsIEZYX1NUUlNJWkUgc2l6ZSk7CisgIHZvaWQgQXBwZW5kQmxvY2soY29uc3Qgdm9pZCogcEJ1ZiwgRlhfU1RSU0laRSBzaXplKTsKIAotICAgIHZvaWQJCQkJCUFwcGVuZEZpbGwodWludDhfdCBieXRlLCBGWF9TVFJTSVpFIGNvdW50KTsKKyAgdm9pZCBBcHBlbmRGaWxsKHVpbnQ4X3QgYnl0ZSwgRlhfU1RSU0laRSBjb3VudCk7CiAKLSAgICB2b2lkCQkJCQlBcHBlbmRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpCi0gICAgewotICAgICAgICBBcHBlbmRCbG9jayhzdHIuR2V0UHRyKCksIHN0ci5HZXRMZW5ndGgoKSk7CisgIHZvaWQgQXBwZW5kU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7CisgICAgQXBwZW5kQmxvY2soc3RyLkdldFB0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOworICB9CisKKyAgaW5saW5lIHZvaWQgQXBwZW5kQnl0ZSh1aW50OF90IGJ5dGUpIHsKKyAgICBpZiAobV9BbGxvY1NpemUgPD0gbV9EYXRhU2l6ZSkgeworICAgICAgRXhwYW5kQnVmKDEpOwogICAgIH0KKyAgICBtX3BCdWZmZXJbbV9EYXRhU2l6ZSsrXSA9IGJ5dGU7CisgIH0KIAotICAgIGlubGluZSB2b2lkCQkJCUFwcGVuZEJ5dGUodWludDhfdCBieXRlKQotICAgIHsKLSAgICAgICAgaWYgKG1fQWxsb2NTaXplIDw9IG1fRGF0YVNpemUpIHsKLSAgICAgICAgICAgIEV4cGFuZEJ1ZigxKTsKLSAgICAgICAgfQotICAgICAgICBtX3BCdWZmZXJbbV9EYXRhU2l6ZSsrXSA9IGJ5dGU7Ci0gICAgfQorICB2b2lkIEluc2VydEJsb2NrKEZYX1NUUlNJWkUgcG9zLCBjb25zdCB2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpOwogCi0gICAgdm9pZAkJCQkJSW5zZXJ0QmxvY2soRlhfU1RSU0laRSBwb3MsIGNvbnN0IHZvaWQqIHBCdWYsIEZYX1NUUlNJWkUgc2l6ZSk7CisgIHZvaWQgQXR0YWNoRGF0YSh2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpOwogCi0gICAgdm9pZAkJCQkJQXR0YWNoRGF0YSh2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpOworICB2b2lkIENvcHlEYXRhKGNvbnN0IHZvaWQqIHBCdWYsIEZYX1NUUlNJWkUgc2l6ZSk7CiAKLSAgICB2b2lkCQkJCQlDb3B5RGF0YShjb25zdCB2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpOworICB2b2lkIFRha2VPdmVyKENGWF9CaW5hcnlCdWYmIG90aGVyKTsKIAotICAgIHZvaWQJCQkJCVRha2VPdmVyKENGWF9CaW5hcnlCdWYmIG90aGVyKTsKKyAgdm9pZCBEZWxldGUoaW50IHN0YXJ0X2luZGV4LCBpbnQgY291bnQpOwogCi0gICAgdm9pZAkJCQkJRGVsZXRlKGludCBzdGFydF9pbmRleCwgaW50IGNvdW50KTsKKyAgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9wQnVmZmVyOyB9CiAKLSAgICB1aW50OF90KgkJCQlHZXRCdWZmZXIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEJ1ZmZlcjsKLSAgICB9CisgIEZYX1NUUlNJWkUgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fRGF0YVNpemU7IH0KIAotICAgIEZYX1NUUlNJWkUJCQkJR2V0U2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9EYXRhU2l6ZTsKLSAgICB9CisgIENGWF9CeXRlU3RyaW5nQyBHZXRCeXRlU3RyaW5nKCkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MJCQlHZXRCeXRlU3RyaW5nKCkgY29uc3Q7CisgIHZvaWQgRGV0YWNoQnVmZmVyKCk7CiAKLSAgICB2b2lkCQkJCQlEZXRhY2hCdWZmZXIoKTsKLXByb3RlY3RlZDoKKyBwcm90ZWN0ZWQ6CisgIEZYX1NUUlNJWkUgbV9BbGxvY1N0ZXA7CiAKLSAgICBGWF9TVFJTSVpFCQkJCW1fQWxsb2NTdGVwOworICB1aW50OF90KiBtX3BCdWZmZXI7CiAKLSAgICB1aW50OF90KgkJCQltX3BCdWZmZXI7CisgIEZYX1NUUlNJWkUgbV9EYXRhU2l6ZTsKIAotICAgIEZYX1NUUlNJWkUJCQkJbV9EYXRhU2l6ZTsKKyAgRlhfU1RSU0laRSBtX0FsbG9jU2l6ZTsKIAotICAgIEZYX1NUUlNJWkUJCQkJbV9BbGxvY1NpemU7Ci0KLSAgICB2b2lkCQkJCQlFeHBhbmRCdWYoRlhfU1RSU0laRSBzaXplKTsKKyAgdm9pZCBFeHBhbmRCdWYoRlhfU1RSU0laRSBzaXplKTsKIH07Ci1jbGFzcyBDRlhfQnl0ZVRleHRCdWYgOiBwdWJsaWMgQ0ZYX0JpbmFyeUJ1ZgotewotcHVibGljOgorY2xhc3MgQ0ZYX0J5dGVUZXh0QnVmIDogcHVibGljIENGWF9CaW5hcnlCdWYgeworIHB1YmxpYzoKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOwogCi0gICAgdm9pZAkJCQkJb3BlcmF0b3IgPSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOworICB2b2lkIEFwcGVuZENoYXIoaW50IGNoKSB7IEFwcGVuZEJ5dGUoKHVpbnQ4X3QpY2gpOyB9CiAKLSAgICB2b2lkCQkJCQlBcHBlbmRDaGFyKGludCBjaCkKLSAgICB7Ci0gICAgICAgIEFwcGVuZEJ5dGUoKHVpbnQ4X3QpY2gpOwotICAgIH0KKyAgQ0ZYX0J5dGVUZXh0QnVmJiBvcGVyYXRvcjw8KGludCBpKTsKIAotICAgIENGWF9CeXRlVGV4dEJ1ZiYJCW9wZXJhdG9yIDw8IChpbnQgaSk7CisgIENGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChGWF9EV09SRCBpKTsKIAotICAgIENGWF9CeXRlVGV4dEJ1ZiYJCW9wZXJhdG9yIDw8IChGWF9EV09SRCBpKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmJiBvcGVyYXRvcjw8KGRvdWJsZSBmKTsKIAotICAgIENGWF9CeXRlVGV4dEJ1ZiYJCW9wZXJhdG9yIDw8IChkb3VibGUgZik7CisgIENGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3opOwogCi0gICAgQ0ZYX0J5dGVUZXh0QnVmJgkJb3BlcmF0b3IgPDwgKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzeik7CisgIENGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChjb25zdCBDRlhfQnl0ZVRleHRCdWYmIGJ1Zik7CiAKLSAgICBDRlhfQnl0ZVRleHRCdWYmCQlvcGVyYXRvciA8PCAoY29uc3QgQ0ZYX0J5dGVUZXh0QnVmJiBidWYpOwotCi0gICAgRlhfU1RSU0laRQkJCQlHZXRMZW5ndGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fRGF0YVNpemU7Ci0gICAgfQorICBGWF9TVFJTSVpFIEdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fRGF0YVNpemU7IH0KIH07Ci1jbGFzcyBDRlhfV2lkZVRleHRCdWYgOiBwdWJsaWMgQ0ZYX0JpbmFyeUJ1ZgotewotcHVibGljOgorY2xhc3MgQ0ZYX1dpZGVUZXh0QnVmIDogcHVibGljIENGWF9CaW5hcnlCdWYgeworIHB1YmxpYzoKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRlhfV0NIQVIqIGxwc3opOwogCi0gICAgdm9pZAkJCQkJb3BlcmF0b3IgPSAoY29uc3QgRlhfV0NIQVIqIGxwc3opOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cik7CiAKLSAgICB2b2lkCQkJCQlvcGVyYXRvciA9IChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cik7CisgIHZvaWQgQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOwogCi0gICAgdm9pZAkJCQkJQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOworICBDRlhfV2lkZVRleHRCdWYmIG9wZXJhdG9yPDwoaW50IGkpOwogCi0gICAgQ0ZYX1dpZGVUZXh0QnVmJgkJb3BlcmF0b3IgPDwgKGludCBpKTsKKyAgQ0ZYX1dpZGVUZXh0QnVmJiBvcGVyYXRvcjw8KGRvdWJsZSBmKTsKIAotICAgIENGWF9XaWRlVGV4dEJ1ZiYJCW9wZXJhdG9yIDw8IChkb3VibGUgZik7CisgIENGWF9XaWRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChjb25zdCBGWF9XQ0hBUiogbHBzeik7CiAKLSAgICBDRlhfV2lkZVRleHRCdWYmCQlvcGVyYXRvciA8PCAoY29uc3QgRlhfV0NIQVIqIGxwc3opOworICBDRlhfV2lkZVRleHRCdWYmIG9wZXJhdG9yPDwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpOworICBDRlhfV2lkZVRleHRCdWYmIG9wZXJhdG9yPDwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CiAKLSAgICBDRlhfV2lkZVRleHRCdWYmCQlvcGVyYXRvciA8PCAoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpOwotICAgIENGWF9XaWRlVGV4dEJ1ZiYJCW9wZXJhdG9yIDw8IChjb25zdCBDRlhfV2lkZVN0cmluZyAmc3RyKTsKKyAgQ0ZYX1dpZGVUZXh0QnVmJiBvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlVGV4dEJ1ZiYgYnVmKTsKIAotICAgIENGWF9XaWRlVGV4dEJ1ZiYJCW9wZXJhdG9yIDw8IChjb25zdCBDRlhfV2lkZVRleHRCdWYmIGJ1Zik7CisgIEZYX1NUUlNJWkUgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9EYXRhU2l6ZSAvIHNpemVvZihGWF9XQ0hBUik7IH0KIAotICAgIEZYX1NUUlNJWkUJCQkJR2V0TGVuZ3RoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0RhdGFTaXplIC8gc2l6ZW9mKEZYX1dDSEFSKTsKLSAgICB9CisgIEZYX1dDSEFSKiBHZXRCdWZmZXIoKSBjb25zdCB7IHJldHVybiAoRlhfV0NIQVIqKW1fcEJ1ZmZlcjsgfQogCi0gICAgRlhfV0NIQVIqCQkJCUdldEJ1ZmZlcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKEZYX1dDSEFSKiltX3BCdWZmZXI7Ci0gICAgfQorICB2b2lkIERlbGV0ZShpbnQgc3RhcnRfaW5kZXgsIGludCBjb3VudCkgeworICAgIENGWF9CaW5hcnlCdWY6OkRlbGV0ZShzdGFydF9pbmRleCAqIHNpemVvZihGWF9XQ0hBUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgIH0KIAotICAgIHZvaWQJCQkJCURlbGV0ZShpbnQgc3RhcnRfaW5kZXgsIGludCBjb3VudCkKLSAgICB7Ci0gICAgICAgIENGWF9CaW5hcnlCdWY6OkRlbGV0ZShzdGFydF9pbmRleCAqIHNpemVvZihGWF9XQ0hBUiksIGNvdW50ICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgfQotCi0gICAgQ0ZYX1dpZGVTdHJpbmdDCQkJR2V0V2lkZVN0cmluZygpIGNvbnN0OworICBDRlhfV2lkZVN0cmluZ0MgR2V0V2lkZVN0cmluZygpIGNvbnN0OwogfTsKLWNsYXNzIENGWF9BcmNoaXZlU2F2ZXIKLXsKLXB1YmxpYzoKLSAgICBDRlhfQXJjaGl2ZVNhdmVyKCkgOiBtX3BTdHJlYW0oTlVMTCkge30KK2NsYXNzIENGWF9BcmNoaXZlU2F2ZXIgeworIHB1YmxpYzoKKyAgQ0ZYX0FyY2hpdmVTYXZlcigpIDogbV9wU3RyZWFtKE5VTEwpIHt9CiAKLSAgICBDRlhfQXJjaGl2ZVNhdmVyJgkJb3BlcmF0b3IgPDwgKHVpbnQ4X3QgaSk7CisgIENGWF9BcmNoaXZlU2F2ZXImIG9wZXJhdG9yPDwodWludDhfdCBpKTsKIAotICAgIENGWF9BcmNoaXZlU2F2ZXImCQlvcGVyYXRvciA8PCAoaW50IGkpOworICBDRlhfQXJjaGl2ZVNhdmVyJiBvcGVyYXRvcjw8KGludCBpKTsKIAotICAgIENGWF9BcmNoaXZlU2F2ZXImCQlvcGVyYXRvciA8PCAoRlhfRFdPUkQgaSk7CisgIENGWF9BcmNoaXZlU2F2ZXImIG9wZXJhdG9yPDwoRlhfRFdPUkQgaSk7CiAKLSAgICBDRlhfQXJjaGl2ZVNhdmVyJgkJb3BlcmF0b3IgPDwgKEZYX0ZMT0FUIGkpOworICBDRlhfQXJjaGl2ZVNhdmVyJiBvcGVyYXRvcjw8KEZYX0ZMT0FUIGkpOwogCi0gICAgQ0ZYX0FyY2hpdmVTYXZlciYJCW9wZXJhdG9yIDw8IChkb3VibGUgaSk7CisgIENGWF9BcmNoaXZlU2F2ZXImIG9wZXJhdG9yPDwoZG91YmxlIGkpOwogCi0gICAgQ0ZYX0FyY2hpdmVTYXZlciYJCW9wZXJhdG9yIDw8IChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzdHIpOworICBDRlhfQXJjaGl2ZVNhdmVyJiBvcGVyYXRvcjw8KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnN0cik7CiAKLSAgICBDRlhfQXJjaGl2ZVNhdmVyJgkJb3BlcmF0b3IgPDwgKGNvbnN0IEZYX1dDSEFSKiBic3RyKTsKKyAgQ0ZYX0FyY2hpdmVTYXZlciYgb3BlcmF0b3I8PChjb25zdCBGWF9XQ0hBUiogYnN0cik7CiAKLSAgICBDRlhfQXJjaGl2ZVNhdmVyJgkJb3BlcmF0b3IgPDwgKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c3RyKTsKKyAgQ0ZYX0FyY2hpdmVTYXZlciYgb3BlcmF0b3I8PChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3N0cik7CiAKLSAgICB2b2lkCQkJCQlXcml0ZShjb25zdCB2b2lkKiBwRGF0YSwgRlhfU1RSU0laRSBkd1NpemUpOworICB2b2lkIFdyaXRlKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9TVFJTSVpFIGR3U2l6ZSk7CiAKLSAgICBpbnRwdHJfdAkJCQlHZXRMZW5ndGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU2F2aW5nQnVmLkdldFNpemUoKTsKLSAgICB9CisgIGludHB0cl90IEdldExlbmd0aCgpIHsgcmV0dXJuIG1fU2F2aW5nQnVmLkdldFNpemUoKTsgfQogCi0gICAgY29uc3QgdWludDhfdCoJCQkJR2V0QnVmZmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1NhdmluZ0J1Zi5HZXRCdWZmZXIoKTsKLSAgICB9CisgIGNvbnN0IHVpbnQ4X3QqIEdldEJ1ZmZlcigpIHsgcmV0dXJuIG1fU2F2aW5nQnVmLkdldEJ1ZmZlcigpOyB9CiAKLSAgICB2b2lkCQkJCQlTZXRTdHJlYW0oSUZYX0ZpbGVTdHJlYW0qIHBTdHJlYW0pCi0gICAgewotICAgICAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOwotICAgIH0KLXByb3RlY3RlZDoKKyAgdm9pZCBTZXRTdHJlYW0oSUZYX0ZpbGVTdHJlYW0qIHBTdHJlYW0pIHsgbV9wU3RyZWFtID0gcFN0cmVhbTsgfQogCi0gICAgQ0ZYX0JpbmFyeUJ1ZgkJCW1fU2F2aW5nQnVmOworIHByb3RlY3RlZDoKKyAgQ0ZYX0JpbmFyeUJ1ZiBtX1NhdmluZ0J1ZjsKIAotICAgIElGWF9GaWxlU3RyZWFtKgkJCW1fcFN0cmVhbTsKKyAgSUZYX0ZpbGVTdHJlYW0qIG1fcFN0cmVhbTsKIH07Ci1jbGFzcyBDRlhfQXJjaGl2ZUxvYWRlcgotewotcHVibGljOgorY2xhc3MgQ0ZYX0FyY2hpdmVMb2FkZXIgeworIHB1YmxpYzoKKyAgQ0ZYX0FyY2hpdmVMb2FkZXIoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSk7CiAKLSAgICBDRlhfQXJjaGl2ZUxvYWRlcihjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKKyAgQ0ZYX0FyY2hpdmVMb2FkZXImIG9wZXJhdG9yPj4odWludDhfdCYgaSk7CiAKLSAgICBDRlhfQXJjaGl2ZUxvYWRlciYJCW9wZXJhdG9yID4+ICh1aW50OF90JiBpKTsKKyAgQ0ZYX0FyY2hpdmVMb2FkZXImIG9wZXJhdG9yPj4oaW50JiBpKTsKIAotICAgIENGWF9BcmNoaXZlTG9hZGVyJgkJb3BlcmF0b3IgPj4gKGludCYgaSk7CisgIENGWF9BcmNoaXZlTG9hZGVyJiBvcGVyYXRvcj4+KEZYX0RXT1JEJiBpKTsKIAotICAgIENGWF9BcmNoaXZlTG9hZGVyJgkJb3BlcmF0b3IgPj4gKEZYX0RXT1JEJiBpKTsKKyAgQ0ZYX0FyY2hpdmVMb2FkZXImIG9wZXJhdG9yPj4oRlhfRkxPQVQmIGkpOwogCi0gICAgQ0ZYX0FyY2hpdmVMb2FkZXImCQlvcGVyYXRvciA+PiAoRlhfRkxPQVQmIGkpOworICBDRlhfQXJjaGl2ZUxvYWRlciYgb3BlcmF0b3I+Pihkb3VibGUmIGkpOwogCi0gICAgQ0ZYX0FyY2hpdmVMb2FkZXImCQlvcGVyYXRvciA+PiAoZG91YmxlJiBpKTsKKyAgQ0ZYX0FyY2hpdmVMb2FkZXImIG9wZXJhdG9yPj4oQ0ZYX0J5dGVTdHJpbmcmIGJzdHIpOwogCi0gICAgQ0ZYX0FyY2hpdmVMb2FkZXImCQlvcGVyYXRvciA+PiAoQ0ZYX0J5dGVTdHJpbmcmIGJzdHIpOworICBDRlhfQXJjaGl2ZUxvYWRlciYgb3BlcmF0b3I+PihDRlhfV2lkZVN0cmluZyYgd3N0cik7CiAKLSAgICBDRlhfQXJjaGl2ZUxvYWRlciYJCW9wZXJhdG9yID4+IChDRlhfV2lkZVN0cmluZyYgd3N0cik7CisgIEZYX0JPT0wgSXNFT0YoKTsKIAotICAgIEZYX0JPT0wJCQkJCUlzRU9GKCk7CisgIEZYX0JPT0wgUmVhZCh2b2lkKiBwQnVmLCBGWF9EV09SRCBkd1NpemUpOwogCi0gICAgRlhfQk9PTAkJCQkJUmVhZCh2b2lkKiBwQnVmLCBGWF9EV09SRCBkd1NpemUpOwotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgRlhfRFdPUkQgbV9Mb2FkaW5nUG9zOwogCi0gICAgRlhfRFdPUkQJCQkJbV9Mb2FkaW5nUG9zOworICBjb25zdCB1aW50OF90KiBtX3BMb2FkaW5nQnVmOwogCi0gICAgY29uc3QgdWludDhfdCoJCQkJbV9wTG9hZGluZ0J1ZjsKLQotICAgIEZYX0RXT1JECQkJCW1fTG9hZGluZ1NpemU7Ci0KKyAgRlhfRFdPUkQgbV9Mb2FkaW5nU2l6ZTsKIH07CiAKLWNsYXNzIElGWF9CdWZmZXJBcmNoaXZlCi17Ci1wdWJsaWM6Ci0gICAgSUZYX0J1ZmZlckFyY2hpdmUoRlhfU1RSU0laRSBzaXplKTsKLSAgICB2aXJ0dWFsIH5JRlhfQnVmZmVyQXJjaGl2ZSgpIHt9CitjbGFzcyBJRlhfQnVmZmVyQXJjaGl2ZSB7CisgcHVibGljOgorICBJRlhfQnVmZmVyQXJjaGl2ZShGWF9TVFJTSVpFIHNpemUpOworICB2aXJ0dWFsIH5JRlhfQnVmZmVyQXJjaGl2ZSgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKTsKKyAgdmlydHVhbCB2b2lkIENsZWFyKCk7CiAKLSAgICBGWF9CT09MIEZsdXNoKCk7CisgIEZYX0JPT0wgRmx1c2goKTsKIAotICAgIGludDMyX3QgQXBwZW5kQmxvY2soY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpOworICBpbnQzMl90IEFwcGVuZEJsb2NrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKTsKIAotICAgIGludDMyX3QgQXBwZW5kQnl0ZSh1aW50OF90IGJ5dGUpOworICBpbnQzMl90IEFwcGVuZEJ5dGUodWludDhfdCBieXRlKTsKIAotICAgIGludDMyX3QgQXBwZW5kRFdvcmQoRlhfRFdPUkQgaSk7CisgIGludDMyX3QgQXBwZW5kRFdvcmQoRlhfRFdPUkQgaSk7CiAKKyAgaW50MzJfdCBBcHBlbmRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6KTsKIAotICAgIGludDMyX3QgQXBwZW5kU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzeik7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIEZYX0JPT0wgRG9Xb3JrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKSA9IDA7CiAKLXByb3RlY3RlZDoKKyAgRlhfU1RSU0laRSBtX0J1ZlNpemU7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgRG9Xb3JrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKSA9IDA7CisgIHVpbnQ4X3QqIG1fcEJ1ZmZlcjsKIAotICAgIEZYX1NUUlNJWkUgbV9CdWZTaXplOwotCi0gICAgdWludDhfdCogbV9wQnVmZmVyOwotCi0gICAgRlhfU1RSU0laRSBtX0xlbmd0aDsKKyAgRlhfU1RSU0laRSBtX0xlbmd0aDsKIH07CiAKLWNsYXNzIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSA6IHB1YmxpYyBJRlhfQnVmZmVyQXJjaGl2ZQotewotcHVibGljOgotICAgIENGWF9GaWxlQnVmZmVyQXJjaGl2ZShGWF9TVFJTSVpFIHNpemUgPSAzMjc2OCk7Ci0gICAgfkNGWF9GaWxlQnVmZmVyQXJjaGl2ZSgpIG92ZXJyaWRlOworY2xhc3MgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlIDogcHVibGljIElGWF9CdWZmZXJBcmNoaXZlIHsKKyBwdWJsaWM6CisgIENGWF9GaWxlQnVmZmVyQXJjaGl2ZShGWF9TVFJTSVpFIHNpemUgPSAzMjc2OCk7CisgIH5DRlhfRmlsZUJ1ZmZlckFyY2hpdmUoKSBvdmVycmlkZTsKIAotICAgIHZvaWQgQ2xlYXIoKSBvdmVycmlkZTsKKyAgdm9pZCBDbGVhcigpIG92ZXJyaWRlOwogCi0gICAgRlhfQk9PTCBBdHRhY2hGaWxlKElGWF9TdHJlYW1Xcml0ZSAqcEZpbGUsIEZYX0JPT0wgYlRha2VvdmVyID0gRkFMU0UpOworICBGWF9CT09MIEF0dGFjaEZpbGUoSUZYX1N0cmVhbVdyaXRlKiBwRmlsZSwgRlhfQk9PTCBiVGFrZW92ZXIgPSBGQUxTRSk7CiAKLSAgICBGWF9CT09MIEF0dGFjaEZpbGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lKTsKKyAgRlhfQk9PTCBBdHRhY2hGaWxlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSk7CiAKLSAgICBGWF9CT09MIEF0dGFjaEZpbGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpOworICBGWF9CT09MIEF0dGFjaEZpbGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpOwogCi1wcml2YXRlOgotICAgIEZYX0JPT0wgRG9Xb3JrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICBGWF9CT09MIERvV29yayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CiAKLSAgICBJRlhfU3RyZWFtV3JpdGUqIG1fcEZpbGU7CisgIElGWF9TdHJlYW1Xcml0ZSogbV9wRmlsZTsKIAotICAgIEZYX0JPT0wgbV9iVGFrZW92ZXI7CisgIEZYX0JPT0wgbV9iVGFrZW92ZXI7CiB9OwogCiBzdHJ1Y3QgQ0ZYX0NoYXJNYXAgeworICBzdGF0aWMgQ0ZYX0NoYXJNYXAqIEdldERlZmF1bHRNYXBwZXIoaW50MzJfdCBjb2RlcGFnZSA9IDApOwogCi0gICAgc3RhdGljIENGWF9DaGFyTWFwKgkJR2V0RGVmYXVsdE1hcHBlcihpbnQzMl90IGNvZGVwYWdlID0gMCk7CisgIENGWF9XaWRlU3RyaW5nICgqbV9HZXRXaWRlU3RyaW5nKShDRlhfQ2hhck1hcCogcE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic3RyKTsKIAorICBDRlhfQnl0ZVN0cmluZyAoKm1fR2V0Qnl0ZVN0cmluZykoQ0ZYX0NoYXJNYXAqIHBNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3N0cik7CiAKLSAgICBDRlhfV2lkZVN0cmluZwkoKm1fR2V0V2lkZVN0cmluZykoQ0ZYX0NoYXJNYXAqIHBNYXAsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic3RyKTsKLQotICAgIENGWF9CeXRlU3RyaW5nCSgqbV9HZXRCeXRlU3RyaW5nKShDRlhfQ2hhck1hcCogcE1hcCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzdHIpOwotCi0gICAgaW50MzJfdAkJKCptX0dldENvZGVQYWdlKSgpOworICBpbnQzMl90ICgqbV9HZXRDb2RlUGFnZSkoKTsKIH07Ci1jbGFzcyBDRlhfVVRGOERlY29kZXIKLXsKLXB1YmxpYzoKLSAgICBDRlhfVVRGOERlY29kZXIoKQotICAgIHsKLSAgICAgICAgbV9QZW5kaW5nQnl0ZXMgPSAwOwotICAgIH0KK2NsYXNzIENGWF9VVEY4RGVjb2RlciB7CisgcHVibGljOgorICBDRlhfVVRGOERlY29kZXIoKSB7IG1fUGVuZGluZ0J5dGVzID0gMDsgfQogCi0gICAgdm9pZAkJCUNsZWFyKCk7CisgIHZvaWQgQ2xlYXIoKTsKIAotICAgIHZvaWQJCQlJbnB1dCh1aW50OF90IGJ5dGUpOworICB2b2lkIElucHV0KHVpbnQ4X3QgYnl0ZSk7CiAKLSAgICB2b2lkCQkJQXBwZW5kQ2hhcihGWF9EV09SRCBjaCk7CisgIHZvaWQgQXBwZW5kQ2hhcihGWF9EV09SRCBjaCk7CiAKLSAgICB2b2lkCQkJQ2xlYXJTdGF0dXMoKQotICAgIHsKLSAgICAgICAgbV9QZW5kaW5nQnl0ZXMgPSAwOwotICAgIH0KKyAgdm9pZCBDbGVhclN0YXR1cygpIHsgbV9QZW5kaW5nQnl0ZXMgPSAwOyB9CiAKLSAgICBDRlhfV2lkZVN0cmluZ0MJR2V0UmVzdWx0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0J1ZmZlci5HZXRXaWRlU3RyaW5nKCk7Ci0gICAgfQotcHJvdGVjdGVkOgorICBDRlhfV2lkZVN0cmluZ0MgR2V0UmVzdWx0KCkgY29uc3QgeyByZXR1cm4gbV9CdWZmZXIuR2V0V2lkZVN0cmluZygpOyB9CiAKLSAgICBpbnQJCQkJbV9QZW5kaW5nQnl0ZXM7CisgcHJvdGVjdGVkOgorICBpbnQgbV9QZW5kaW5nQnl0ZXM7CiAKLSAgICBGWF9EV09SRAkJbV9QZW5kaW5nQ2hhcjsKKyAgRlhfRFdPUkQgbV9QZW5kaW5nQ2hhcjsKIAotICAgIENGWF9XaWRlVGV4dEJ1ZgltX0J1ZmZlcjsKKyAgQ0ZYX1dpZGVUZXh0QnVmIG1fQnVmZmVyOwogfTsKLWNsYXNzIENGWF9VVEY4RW5jb2RlcgotewotcHVibGljOgotICAgIENGWF9VVEY4RW5jb2RlcigpCi0gICAgewotICAgICAgICBtX1VURjE2Rmlyc3QgPSAwOwotICAgIH0KK2NsYXNzIENGWF9VVEY4RW5jb2RlciB7CisgcHVibGljOgorICBDRlhfVVRGOEVuY29kZXIoKSB7IG1fVVRGMTZGaXJzdCA9IDA7IH0KIAotICAgIHZvaWQJCQlJbnB1dChGWF9XQ0hBUiB1bmljb2RlKTsKKyAgdm9pZCBJbnB1dChGWF9XQ0hBUiB1bmljb2RlKTsKIAotICAgIHZvaWQJCQlBcHBlbmRTdHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpCi0gICAgewotICAgICAgICBtX1VURjE2Rmlyc3QgPSAwOwotICAgICAgICBtX0J1ZmZlciA8PCBzdHI7Ci0gICAgfQorICB2b2lkIEFwcGVuZFN0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgeworICAgIG1fVVRGMTZGaXJzdCA9IDA7CisgICAgbV9CdWZmZXIgPDwgc3RyOworICB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MJR2V0UmVzdWx0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0J1ZmZlci5HZXRCeXRlU3RyaW5nKCk7Ci0gICAgfQotcHJvdGVjdGVkOgorICBDRlhfQnl0ZVN0cmluZ0MgR2V0UmVzdWx0KCkgY29uc3QgeyByZXR1cm4gbV9CdWZmZXIuR2V0Qnl0ZVN0cmluZygpOyB9CiAKLSAgICBDRlhfQnl0ZVRleHRCdWYJbV9CdWZmZXI7CisgcHJvdGVjdGVkOgorICBDRlhfQnl0ZVRleHRCdWYgbV9CdWZmZXI7CiAKLSAgICBGWF9EV09SRAkJbV9VVEYxNkZpcnN0OworICBGWF9EV09SRCBtX1VURjE2Rmlyc3Q7CiB9OwogQ0ZYX0J5dGVTdHJpbmcgRlhfVXJsRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1VybCk7CiBDRlhfV2lkZVN0cmluZyBGWF9VcmxEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzVXJsKTsKIENGWF9CeXRlU3RyaW5nIEZYX0VuY29kZVVSSShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NVUkkpOwogQ0ZYX1dpZGVTdHJpbmcgRlhfRGVjb2RlVVJJKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic1VSSSk7Ci1jbGFzcyBDRlhfQmFzaWNBcnJheQotewotcHJvdGVjdGVkOgotICAgIENGWF9CYXNpY0FycmF5KGludCB1bml0X3NpemUpOworY2xhc3MgQ0ZYX0Jhc2ljQXJyYXkgeworIHByb3RlY3RlZDoKKyAgQ0ZYX0Jhc2ljQXJyYXkoaW50IHVuaXRfc2l6ZSk7CiAKLSAgICB+Q0ZYX0Jhc2ljQXJyYXkoKTsKKyAgfkNGWF9CYXNpY0FycmF5KCk7CiAKLSAgICBGWF9CT09MCQkJU2V0U2l6ZShpbnQgbk5ld1NpemUpOworICBGWF9CT09MIFNldFNpemUoaW50IG5OZXdTaXplKTsKIAotICAgIEZYX0JPT0wJCQlBcHBlbmQoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYyk7CisgIEZYX0JPT0wgQXBwZW5kKGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpOwogCi0gICAgRlhfQk9PTAkJCUNvcHkoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYyk7CisgIEZYX0JPT0wgQ29weShjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKTsKIAotICAgIHVpbnQ4X3QqCQlJbnNlcnRTcGFjZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpOworICB1aW50OF90KiBJbnNlcnRTcGFjZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpOwogCi0gICAgRlhfQk9PTAkJCVJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpOworICBGWF9CT09MIFJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpOwogCi0gICAgRlhfQk9PTAkJCUluc2VydEF0KGludCBuU3RhcnRJbmRleCwgY29uc3QgQ0ZYX0Jhc2ljQXJyYXkqIHBOZXdBcnJheSk7CisgIEZYX0JPT0wgSW5zZXJ0QXQoaW50IG5TdGFydEluZGV4LCBjb25zdCBDRlhfQmFzaWNBcnJheSogcE5ld0FycmF5KTsKIAotICAgIGNvbnN0IHZvaWQqCQlHZXREYXRhUHRyKGludCBpbmRleCkgY29uc3Q7Ci1wcm90ZWN0ZWQ6CisgIGNvbnN0IHZvaWQqIEdldERhdGFQdHIoaW50IGluZGV4KSBjb25zdDsKIAotICAgIHVpbnQ4X3QqCQltX3BEYXRhOworIHByb3RlY3RlZDoKKyAgdWludDhfdCogbV9wRGF0YTsKIAotICAgIGludAkJCQltX25TaXplOworICBpbnQgbV9uU2l6ZTsKIAotICAgIGludAkJCQltX25NYXhTaXplOworICBpbnQgbV9uTWF4U2l6ZTsKIAotICAgIGludAkJCQltX25Vbml0U2l6ZTsKKyAgaW50IG1fblVuaXRTaXplOwogfTsKLXRlbXBsYXRlPGNsYXNzIFRZUEU+Ci1jbGFzcyBDRlhfQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQmFzaWNBcnJheQotewotcHVibGljOgotICAgIENGWF9BcnJheVRlbXBsYXRlKCkgOiBDRlhfQmFzaWNBcnJheShzaXplb2YoVFlQRSkpIHt9Cit0ZW1wbGF0ZSA8Y2xhc3MgVFlQRT4KK2NsYXNzIENGWF9BcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9CYXNpY0FycmF5IHsKKyBwdWJsaWM6CisgIENGWF9BcnJheVRlbXBsYXRlKCkgOiBDRlhfQmFzaWNBcnJheShzaXplb2YoVFlQRSkpIHt9CiAKLSAgICBpbnQJCQlHZXRTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25TaXplOwotICAgIH0KKyAgaW50IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBtX25TaXplOyB9CiAKLSAgICBpbnQJCQlHZXRVcHBlckJvdW5kKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25TaXplIC0gMTsKLSAgICB9CisgIGludCBHZXRVcHBlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gbV9uU2l6ZSAtIDE7IH0KIAotICAgIEZYX0JPT0wJCVNldFNpemUoaW50IG5OZXdTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENGWF9CYXNpY0FycmF5OjpTZXRTaXplKG5OZXdTaXplKTsKLSAgICB9CisgIEZYX0JPT0wgU2V0U2l6ZShpbnQgbk5ld1NpemUpIHsgcmV0dXJuIENGWF9CYXNpY0FycmF5OjpTZXRTaXplKG5OZXdTaXplKTsgfQogCi0gICAgdm9pZAkJUmVtb3ZlQWxsKCkKLSAgICB7Ci0gICAgICAgIFNldFNpemUoMCk7Ci0gICAgfQorICB2b2lkIFJlbW92ZUFsbCgpIHsgU2V0U2l6ZSgwKTsgfQogCi0gICAgY29uc3QgVFlQRQlHZXRBdChpbnQgbkluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fblNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAoY29uc3QgVFlQRSYpKCoodm9sYXRpbGUgY29uc3QgVFlQRSopTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoY29uc3QgVFlQRSopbV9wRGF0YSlbbkluZGV4XTsKKyAgY29uc3QgVFlQRSBHZXRBdChpbnQgbkluZGV4KSBjb25zdCB7CisgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fblNpemUpIHsKKyAgICAgIHJldHVybiAoY29uc3QgVFlQRSYpKCoodm9sYXRpbGUgY29uc3QgVFlQRSopTlVMTCk7CiAgICAgfQorICAgIHJldHVybiAoKGNvbnN0IFRZUEUqKW1fcERhdGEpW25JbmRleF07CisgIH0KIAotICAgIEZYX0JPT0wJCVNldEF0KGludCBuSW5kZXgsIFRZUEUgbmV3RWxlbWVudCkKLSAgICB7Ci0gICAgICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX25TaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgKChUWVBFKiltX3BEYXRhKVtuSW5kZXhdID0gbmV3RWxlbWVudDsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgIEZYX0JPT0wgU2V0QXQoaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50KSB7CisgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fblNpemUpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgICAgKChUWVBFKiltX3BEYXRhKVtuSW5kZXhdID0gbmV3RWxlbWVudDsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0gICAgVFlQRSYJCUVsZW1lbnRBdChpbnQgbkluZGV4KQotICAgIHsKLSAgICAgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fblNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAqKFRZUEUqKU5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoVFlQRSopbV9wRGF0YSlbbkluZGV4XTsKKyAgVFlQRSYgRWxlbWVudEF0KGludCBuSW5kZXgpIHsKKyAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9uU2l6ZSkgeworICAgICAgcmV0dXJuICooVFlQRSopTlVMTDsKICAgICB9CisgICAgcmV0dXJuICgoVFlQRSopbV9wRGF0YSlbbkluZGV4XTsKKyAgfQogCi0gICAgY29uc3QgVFlQRSoJR2V0RGF0YSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKGNvbnN0IFRZUEUqKW1fcERhdGE7Ci0gICAgfQorICBjb25zdCBUWVBFKiBHZXREYXRhKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IFRZUEUqKW1fcERhdGE7IH0KIAotICAgIFRZUEUqCQlHZXREYXRhKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVFlQRSopbV9wRGF0YTsKLSAgICB9CisgIFRZUEUqIEdldERhdGEoKSB7IHJldHVybiAoVFlQRSopbV9wRGF0YTsgfQogCi0gICAgRlhfQk9PTAkJU2V0QXRHcm93KGludCBuSW5kZXgsIFRZUEUgbmV3RWxlbWVudCkKLSAgICB7Ci0gICAgICAgIGlmIChuSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5JbmRleCA+PSBtX25TaXplKQotICAgICAgICAgICAgaWYgKCFTZXRTaXplKG5JbmRleCArIDEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAoKFRZUEUqKW1fcERhdGEpW25JbmRleF0gPSBuZXdFbGVtZW50OwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgRlhfQk9PTCBTZXRBdEdyb3coaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50KSB7CisgICAgaWYgKG5JbmRleCA8IDApIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgICAgaWYgKG5JbmRleCA+PSBtX25TaXplKQorICAgICAgaWYgKCFTZXRTaXplKG5JbmRleCArIDEpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAoKFRZUEUqKW1fcERhdGEpW25JbmRleF0gPSBuZXdFbGVtZW50OworICAgIHJldHVybiBUUlVFOworICB9CiAKLSAgICBGWF9CT09MCQlBZGQoVFlQRSBuZXdFbGVtZW50KQotICAgIHsKLSAgICAgICAgaWYgKG1fblNpemUgPCBtX25NYXhTaXplKSB7Ci0gICAgICAgICAgICBtX25TaXplICsrOwotICAgICAgICB9IGVsc2UgaWYgKCFTZXRTaXplKG1fblNpemUgKyAxKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgICgoVFlQRSopbV9wRGF0YSlbbV9uU2l6ZSAtIDFdID0gbmV3RWxlbWVudDsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgIEZYX0JPT0wgQWRkKFRZUEUgbmV3RWxlbWVudCkgeworICAgIGlmIChtX25TaXplIDwgbV9uTWF4U2l6ZSkgeworICAgICAgbV9uU2l6ZSsrOworICAgIH0gZWxzZSBpZiAoIVNldFNpemUobV9uU2l6ZSArIDEpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQorICAgICgoVFlQRSopbV9wRGF0YSlbbV9uU2l6ZSAtIDFdID0gbmV3RWxlbWVudDsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0gICAgRlhfQk9PTAkJQXBwZW5kKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlJiBzcmMpCi0gICAgewotICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OkFwcGVuZChzcmMpOwotICAgIH0KKyAgRlhfQk9PTCBBcHBlbmQoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGUmIHNyYykgeworICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6QXBwZW5kKHNyYyk7CisgIH0KIAotICAgIEZYX0JPT0wJCUNvcHkoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGUmIHNyYykKLSAgICB7Ci0gICAgICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6Q29weShzcmMpOwotICAgIH0KKyAgRlhfQk9PTCBDb3B5KGNvbnN0IENGWF9BcnJheVRlbXBsYXRlJiBzcmMpIHsKKyAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OkNvcHkoc3JjKTsKKyAgfQogCi0gICAgVFlQRSoJCUdldERhdGFQdHIoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUWVBFKilDRlhfQmFzaWNBcnJheTo6R2V0RGF0YVB0cihpbmRleCk7Ci0gICAgfQorICBUWVBFKiBHZXREYXRhUHRyKGludCBpbmRleCkgeworICAgIHJldHVybiAoVFlQRSopQ0ZYX0Jhc2ljQXJyYXk6OkdldERhdGFQdHIoaW5kZXgpOworICB9CiAKLSAgICBUWVBFKgkJQWRkU3BhY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUWVBFKilDRlhfQmFzaWNBcnJheTo6SW5zZXJ0U3BhY2VBdChtX25TaXplLCAxKTsKLSAgICB9CisgIFRZUEUqIEFkZFNwYWNlKCkgeyByZXR1cm4gKFRZUEUqKUNGWF9CYXNpY0FycmF5OjpJbnNlcnRTcGFjZUF0KG1fblNpemUsIDEpOyB9CiAKLSAgICBUWVBFKgkJSW5zZXJ0U3BhY2VBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUWVBFKilDRlhfQmFzaWNBcnJheTo6SW5zZXJ0U3BhY2VBdChuSW5kZXgsIG5Db3VudCk7Ci0gICAgfQorICBUWVBFKiBJbnNlcnRTcGFjZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpIHsKKyAgICByZXR1cm4gKFRZUEUqKUNGWF9CYXNpY0FycmF5OjpJbnNlcnRTcGFjZUF0KG5JbmRleCwgbkNvdW50KTsKKyAgfQogCi0gICAgY29uc3QgVFlQRQlvcGVyYXRvcltdKGludCBuSW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9uU2l6ZSkgewotICAgICAgICAgICAgKih2b2xhdGlsZSBjaGFyKikwID0gJ1wwJzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKChjb25zdCBUWVBFKiltX3BEYXRhKVtuSW5kZXhdOworICBjb25zdCBUWVBFIG9wZXJhdG9yW10oaW50IG5JbmRleCkgY29uc3QgeworICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX25TaXplKSB7CisgICAgICAqKHZvbGF0aWxlIGNoYXIqKTAgPSAnXDAnOwogICAgIH0KKyAgICByZXR1cm4gKChjb25zdCBUWVBFKiltX3BEYXRhKVtuSW5kZXhdOworICB9CiAKLSAgICBUWVBFJgkJb3BlcmF0b3JbXShpbnQgbkluZGV4KQotICAgIHsKLSAgICAgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fblNpemUpIHsKLSAgICAgICAgICAgICoodm9sYXRpbGUgY2hhciopMCA9ICdcMCc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoVFlQRSopbV9wRGF0YSlbbkluZGV4XTsKKyAgVFlQRSYgb3BlcmF0b3JbXShpbnQgbkluZGV4KSB7CisgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fblNpemUpIHsKKyAgICAgICoodm9sYXRpbGUgY2hhciopMCA9ICdcMCc7CiAgICAgfQorICAgIHJldHVybiAoKFRZUEUqKW1fcERhdGEpW25JbmRleF07CisgIH0KIAotICAgIEZYX0JPT0wJCUluc2VydEF0KGludCBuSW5kZXgsIFRZUEUgbmV3RWxlbWVudCwgaW50IG5Db3VudCA9IDEpCi0gICAgewotICAgICAgICBpZiAoIUluc2VydFNwYWNlQXQobkluZGV4LCBuQ291bnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKG5Db3VudC0tKSB7Ci0gICAgICAgICAgICAoKFRZUEUqKW1fcERhdGEpW25JbmRleCsrXSA9IG5ld0VsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgIEZYX0JPT0wgSW5zZXJ0QXQoaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50LCBpbnQgbkNvdW50ID0gMSkgeworICAgIGlmICghSW5zZXJ0U3BhY2VBdChuSW5kZXgsIG5Db3VudCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgICAgd2hpbGUgKG5Db3VudC0tKSB7CisgICAgICAoKFRZUEUqKW1fcERhdGEpW25JbmRleCsrXSA9IG5ld0VsZW1lbnQ7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CiAKLSAgICBGWF9CT09MCQlSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50ID0gMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6UmVtb3ZlQXQobkluZGV4LCBuQ291bnQpOwotICAgIH0KKyAgRlhfQk9PTCBSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50ID0gMSkgeworICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6UmVtb3ZlQXQobkluZGV4LCBuQ291bnQpOworICB9CiAKLSAgICBGWF9CT09MCQlJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpCi0gICAgewotICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6Okluc2VydEF0KG5TdGFydEluZGV4LCBwTmV3QXJyYXkpOwotICAgIH0KKyAgRlhfQk9PTCBJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpIHsKKyAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6Okluc2VydEF0KG5TdGFydEluZGV4LCBwTmV3QXJyYXkpOworICB9CiAKLSAgICBpbnQJCQlGaW5kKFRZUEUgZGF0YSwgaW50IGlTdGFydCA9IDApIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoaVN0YXJ0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoOyBpU3RhcnQgPCAoaW50KW1fblNpemU7IGlTdGFydCArKykKLSAgICAgICAgICAgIGlmICgoKFRZUEUqKW1fcERhdGEpW2lTdGFydF0gPT0gZGF0YSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpU3RhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKKyAgaW50IEZpbmQoVFlQRSBkYXRhLCBpbnQgaVN0YXJ0ID0gMCkgY29uc3QgeworICAgIGlmIChpU3RhcnQgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQorICAgIGZvciAoOyBpU3RhcnQgPCAoaW50KW1fblNpemU7IGlTdGFydCsrKQorICAgICAgaWYgKCgoVFlQRSopbV9wRGF0YSlbaVN0YXJ0XSA9PSBkYXRhKSB7CisgICAgICAgIHJldHVybiBpU3RhcnQ7CisgICAgICB9CisgICAgcmV0dXJuIC0xOworICB9CiB9OwotdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PgkJQ0ZYX0J5dGVBcnJheTsKLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfV09SRD4JCUNGWF9Xb3JkQXJyYXk7Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPEZYX0RXT1JEPgkJQ0ZYX0RXb3JkQXJyYXk7Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPHZvaWQqPgkJQ0ZYX1B0ckFycmF5OwotdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9GSUxFU0laRT4JQ0ZYX0ZpbGVTaXplQXJyYXk7Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPgkJQ0ZYX0Zsb2F0QXJyYXk7Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+CQlDRlhfSW50MzJBcnJheTsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4gQ0ZYX0J5dGVBcnJheTsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfV09SRD4gQ0ZYX1dvcmRBcnJheTsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRFdPUkQ+IENGWF9EV29yZEFycmF5OwordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTx2b2lkKj4gQ0ZYX1B0ckFycmF5OwordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9GSUxFU0laRT4gQ0ZYX0ZpbGVTaXplQXJyYXk7Cit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiBDRlhfRmxvYXRBcnJheTsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gQ0ZYX0ludDMyQXJyYXk7CiB0ZW1wbGF0ZSA8Y2xhc3MgT2JqZWN0Q2xhc3M+Ci1jbGFzcyBDRlhfT2JqZWN0QXJyYXkgOiBwdWJsaWMgQ0ZYX0Jhc2ljQXJyYXkKLXsKLXB1YmxpYzoKLSAgICBDRlhfT2JqZWN0QXJyYXkoKSA6IENGWF9CYXNpY0FycmF5KHNpemVvZihPYmplY3RDbGFzcykpIHt9CitjbGFzcyBDRlhfT2JqZWN0QXJyYXkgOiBwdWJsaWMgQ0ZYX0Jhc2ljQXJyYXkgeworIHB1YmxpYzoKKyAgQ0ZYX09iamVjdEFycmF5KCkgOiBDRlhfQmFzaWNBcnJheShzaXplb2YoT2JqZWN0Q2xhc3MpKSB7fQogCi0gICAgfkNGWF9PYmplY3RBcnJheSgpCi0gICAgewotICAgICAgICBSZW1vdmVBbGwoKTsKLSAgICB9CisgIH5DRlhfT2JqZWN0QXJyYXkoKSB7IFJlbW92ZUFsbCgpOyB9CiAKLSAgICB2b2lkCQkJQWRkKGNvbnN0IE9iamVjdENsYXNzJiBkYXRhKQotICAgIHsKLSAgICAgICAgbmV3ICgodm9pZCopSW5zZXJ0U3BhY2VBdChtX25TaXplLCAxKSkgT2JqZWN0Q2xhc3MoZGF0YSk7Ci0gICAgfQorICB2b2lkIEFkZChjb25zdCBPYmplY3RDbGFzcyYgZGF0YSkgeworICAgIG5ldyAoKHZvaWQqKUluc2VydFNwYWNlQXQobV9uU2l6ZSwgMSkpIE9iamVjdENsYXNzKGRhdGEpOworICB9CiAKLSAgICBPYmplY3RDbGFzcyYJQWRkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAqKE9iamVjdENsYXNzKikgbmV3ICgodm9pZCopSW5zZXJ0U3BhY2VBdChtX25TaXplLCAxKSkgT2JqZWN0Q2xhc3MoKTsKLSAgICB9CisgIE9iamVjdENsYXNzJiBBZGQoKSB7CisgICAgcmV0dXJuICooT2JqZWN0Q2xhc3MqKW5ldyAoKHZvaWQqKUluc2VydFNwYWNlQXQobV9uU2l6ZSwgMSkpIE9iamVjdENsYXNzKCk7CisgIH0KIAotICAgIHZvaWQqCQkJQWRkU3BhY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEluc2VydFNwYWNlQXQobV9uU2l6ZSwgMSk7Ci0gICAgfQorICB2b2lkKiBBZGRTcGFjZSgpIHsgcmV0dXJuIEluc2VydFNwYWNlQXQobV9uU2l6ZSwgMSk7IH0KIAotICAgIGludDMyX3QJCUFwcGVuZChjb25zdCBDRlhfT2JqZWN0QXJyYXkmIHNyYywgaW50MzJfdCBuU3RhcnQgPSAwLCBpbnQzMl90IG5Db3VudCA9IC0xKQotICAgIHsKLSAgICAgICAgaWYgKG5Db3VudCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IG5TaXplID0gc3JjLkdldFNpemUoKTsKLSAgICAgICAgaWYgKCFuU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KG5TdGFydCA+IC0xICYmIG5TdGFydCA8IG5TaXplKTsKLSAgICAgICAgaWYgKG5Db3VudCA8IDApIHsKLSAgICAgICAgICAgIG5Db3VudCA9IG5TaXplOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuU3RhcnQgKyBuQ291bnQgPiBuU2l6ZSkgewotICAgICAgICAgICAgbkNvdW50ID0gblNpemUgLSBuU3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5Db3VudCA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIG5TaXplID0gbV9uU2l6ZTsKLSAgICAgICAgSW5zZXJ0U3BhY2VBdChtX25TaXplLCBuQ291bnQpOwotICAgICAgICBPYmplY3RDbGFzcyogcFN0YXJ0T2JqID0gKE9iamVjdENsYXNzKilHZXREYXRhUHRyKG5TaXplKTsKLSAgICAgICAgblNpemUgPSBuU3RhcnQgKyBuQ291bnQ7Ci0gICAgICAgIGZvciAoaW50MzJfdCBpID0gblN0YXJ0OyBpIDwgblNpemU7IGkgKyssIHBTdGFydE9iaisrKSB7Ci0gICAgICAgICAgICBuZXcgKCh2b2lkKilwU3RhcnRPYmopIE9iamVjdENsYXNzKHNyY1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5Db3VudDsKKyAgaW50MzJfdCBBcHBlbmQoY29uc3QgQ0ZYX09iamVjdEFycmF5JiBzcmMsCisgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0ID0gMCwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgeworICAgIGlmIChuQ291bnQgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIGludDMyX3QgblNpemUgPSBzcmMuR2V0U2l6ZSgpOworICAgIGlmICghblNpemUpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBGWFNZU19hc3NlcnQoblN0YXJ0ID4gLTEgJiYgblN0YXJ0IDwgblNpemUpOworICAgIGlmIChuQ291bnQgPCAwKSB7CisgICAgICBuQ291bnQgPSBuU2l6ZTsKKyAgICB9CisgICAgaWYgKG5TdGFydCArIG5Db3VudCA+IG5TaXplKSB7CisgICAgICBuQ291bnQgPSBuU2l6ZSAtIG5TdGFydDsKKyAgICB9CisgICAgaWYgKG5Db3VudCA8IDEpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBuU2l6ZSA9IG1fblNpemU7CisgICAgSW5zZXJ0U3BhY2VBdChtX25TaXplLCBuQ291bnQpOworICAgIE9iamVjdENsYXNzKiBwU3RhcnRPYmogPSAoT2JqZWN0Q2xhc3MqKUdldERhdGFQdHIoblNpemUpOworICAgIG5TaXplID0gblN0YXJ0ICsgbkNvdW50OworICAgIGZvciAoaW50MzJfdCBpID0gblN0YXJ0OyBpIDwgblNpemU7IGkrKywgcFN0YXJ0T2JqKyspIHsKKyAgICAgIG5ldyAoKHZvaWQqKXBTdGFydE9iaikgT2JqZWN0Q2xhc3Moc3JjW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIG5Db3VudDsKKyAgfQogCi0gICAgaW50MzJfdAkJQ29weShjb25zdCBDRlhfT2JqZWN0QXJyYXkmIHNyYywgaW50MzJfdCBuU3RhcnQgPSAwLCBpbnQzMl90IG5Db3VudCA9IC0xKQotICAgIHsKLSAgICAgICAgaWYgKG5Db3VudCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IG5TaXplID0gc3JjLkdldFNpemUoKTsKLSAgICAgICAgaWYgKCFuU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KG5TdGFydCA+IC0xICYmIG5TdGFydCA8IG5TaXplKTsKLSAgICAgICAgaWYgKG5Db3VudCA8IDApIHsKLSAgICAgICAgICAgIG5Db3VudCA9IG5TaXplOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuU3RhcnQgKyBuQ291bnQgPiBuU2l6ZSkgewotICAgICAgICAgICAgbkNvdW50ID0gblNpemUgLSBuU3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5Db3VudCA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIFJlbW92ZUFsbCgpOwotICAgICAgICBTZXRTaXplKG5Db3VudCk7Ci0gICAgICAgIE9iamVjdENsYXNzKiBwU3RhcnRPYmogPSAoT2JqZWN0Q2xhc3MqKW1fcERhdGE7Ci0gICAgICAgIG5TaXplID0gblN0YXJ0ICsgbkNvdW50OwotICAgICAgICBmb3IgKGludDMyX3QgaSA9IG5TdGFydDsgaSA8IG5TaXplOyBpICsrLCBwU3RhcnRPYmorKykgewotICAgICAgICAgICAgbmV3ICgodm9pZCopcFN0YXJ0T2JqKSBPYmplY3RDbGFzcyhzcmNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuQ291bnQ7CisgIGludDMyX3QgQ29weShjb25zdCBDRlhfT2JqZWN0QXJyYXkmIHNyYywKKyAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0ID0gMCwKKyAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50ID0gLTEpIHsKKyAgICBpZiAobkNvdW50ID09IDApIHsKKyAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBpbnQzMl90IG5TaXplID0gc3JjLkdldFNpemUoKTsKKyAgICBpZiAoIW5TaXplKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgRlhTWVNfYXNzZXJ0KG5TdGFydCA+IC0xICYmIG5TdGFydCA8IG5TaXplKTsKKyAgICBpZiAobkNvdW50IDwgMCkgeworICAgICAgbkNvdW50ID0gblNpemU7CisgICAgfQorICAgIGlmIChuU3RhcnQgKyBuQ291bnQgPiBuU2l6ZSkgeworICAgICAgbkNvdW50ID0gblNpemUgLSBuU3RhcnQ7CisgICAgfQorICAgIGlmIChuQ291bnQgPCAxKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUmVtb3ZlQWxsKCk7CisgICAgU2V0U2l6ZShuQ291bnQpOworICAgIE9iamVjdENsYXNzKiBwU3RhcnRPYmogPSAoT2JqZWN0Q2xhc3MqKW1fcERhdGE7CisgICAgblNpemUgPSBuU3RhcnQgKyBuQ291bnQ7CisgICAgZm9yIChpbnQzMl90IGkgPSBuU3RhcnQ7IGkgPCBuU2l6ZTsgaSsrLCBwU3RhcnRPYmorKykgeworICAgICAgbmV3ICgodm9pZCopcFN0YXJ0T2JqKSBPYmplY3RDbGFzcyhzcmNbaV0pOworICAgIH0KKyAgICByZXR1cm4gbkNvdW50OworICB9CiAKLSAgICBpbnQJCQkJR2V0U2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9uU2l6ZTsKLSAgICB9CisgIGludCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9uU2l6ZTsgfQogCi0gICAgT2JqZWN0Q2xhc3MmCW9wZXJhdG9yW10gKGludCBpbmRleCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChpbmRleCA8IG1fblNpemUpOwotICAgICAgICByZXR1cm4gKihPYmplY3RDbGFzcyopQ0ZYX0Jhc2ljQXJyYXk6OkdldERhdGFQdHIoaW5kZXgpOwotICAgIH0KKyAgT2JqZWN0Q2xhc3MmIG9wZXJhdG9yW10oaW50IGluZGV4KSBjb25zdCB7CisgICAgRlhTWVNfYXNzZXJ0KGluZGV4IDwgbV9uU2l6ZSk7CisgICAgcmV0dXJuICooT2JqZWN0Q2xhc3MqKUNGWF9CYXNpY0FycmF5OjpHZXREYXRhUHRyKGluZGV4KTsKKyAgfQogCi0gICAgT2JqZWN0Q2xhc3MqCUdldERhdGFQdHIoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPYmplY3RDbGFzcyopQ0ZYX0Jhc2ljQXJyYXk6OkdldERhdGFQdHIoaW5kZXgpOwotICAgIH0KKyAgT2JqZWN0Q2xhc3MqIEdldERhdGFQdHIoaW50IGluZGV4KSB7CisgICAgcmV0dXJuIChPYmplY3RDbGFzcyopQ0ZYX0Jhc2ljQXJyYXk6OkdldERhdGFQdHIoaW5kZXgpOworICB9CiAKLSAgICB2b2lkCQkJUmVtb3ZlQXQoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KGluZGV4IDwgbV9uU2l6ZSk7Ci0gICAgICAgICgoT2JqZWN0Q2xhc3MqKUdldERhdGFQdHIoaW5kZXgpKS0+fk9iamVjdENsYXNzKCk7Ci0gICAgICAgIENGWF9CYXNpY0FycmF5OjpSZW1vdmVBdChpbmRleCwgMSk7Ci0gICAgfQorICB2b2lkIFJlbW92ZUF0KGludCBpbmRleCkgeworICAgIEZYU1lTX2Fzc2VydChpbmRleCA8IG1fblNpemUpOworICAgICgoT2JqZWN0Q2xhc3MqKUdldERhdGFQdHIoaW5kZXgpKS0+fk9iamVjdENsYXNzKCk7CisgICAgQ0ZYX0Jhc2ljQXJyYXk6OlJlbW92ZUF0KGluZGV4LCAxKTsKKyAgfQogCi0gICAgdm9pZAkJCVJlbW92ZUFsbCgpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fblNpemU7IGkgKyspIHsKLSAgICAgICAgICAgICgoT2JqZWN0Q2xhc3MqKUdldERhdGFQdHIoaSkpLT5+T2JqZWN0Q2xhc3MoKTsKLSAgICAgICAgfQotICAgICAgICBDRlhfQmFzaWNBcnJheTo6U2V0U2l6ZSgwKTsKKyAgdm9pZCBSZW1vdmVBbGwoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25TaXplOyBpKyspIHsKKyAgICAgICgoT2JqZWN0Q2xhc3MqKUdldERhdGFQdHIoaSkpLT5+T2JqZWN0Q2xhc3MoKTsKICAgICB9CisgICAgQ0ZYX0Jhc2ljQXJyYXk6OlNldFNpemUoMCk7CisgIH0KIH07CiB0eXBlZGVmIENGWF9PYmplY3RBcnJheTxDRlhfQnl0ZVN0cmluZz4gQ0ZYX0J5dGVTdHJpbmdBcnJheTsKIHR5cGVkZWYgQ0ZYX09iamVjdEFycmF5PENGWF9XaWRlU3RyaW5nPiBDRlhfV2lkZVN0cmluZ0FycmF5OwotY2xhc3MgQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheQotewotcHVibGljOgotICAgIENGWF9CYXNlU2VnbWVudGVkQXJyYXkoaW50IHVuaXRfc2l6ZSA9IDEsIGludCBzZWdtZW50X3VuaXRzID0gNTEyLCBpbnQgaW5kZXhfc2l6ZSA9IDgpOworY2xhc3MgQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheSB7CisgcHVibGljOgorICBDRlhfQmFzZVNlZ21lbnRlZEFycmF5KGludCB1bml0X3NpemUgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWdtZW50X3VuaXRzID0gNTEyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleF9zaXplID0gOCk7CiAKLSAgICB+Q0ZYX0Jhc2VTZWdtZW50ZWRBcnJheSgpOworICB+Q0ZYX0Jhc2VTZWdtZW50ZWRBcnJheSgpOwogCi0gICAgdm9pZAlTZXRVbml0U2l6ZShpbnQgdW5pdF9zaXplLCBpbnQgc2VnbWVudF91bml0cywgaW50IGluZGV4X3NpemUgPSA4KTsKKyAgdm9pZCBTZXRVbml0U2l6ZShpbnQgdW5pdF9zaXplLCBpbnQgc2VnbWVudF91bml0cywgaW50IGluZGV4X3NpemUgPSA4KTsKIAotICAgIHZvaWQqCUFkZCgpOworICB2b2lkKiBBZGQoKTsKIAotICAgIHZvaWQqCUdldEF0KGludCBpbmRleCkgY29uc3Q7CisgIHZvaWQqIEdldEF0KGludCBpbmRleCkgY29uc3Q7CiAKLSAgICB2b2lkCVJlbW92ZUFsbCgpOworICB2b2lkIFJlbW92ZUFsbCgpOwogCi0gICAgdm9pZAlEZWxldGUoaW50IGluZGV4LCBpbnQgY291bnQgPSAxKTsKKyAgdm9pZCBEZWxldGUoaW50IGluZGV4LCBpbnQgY291bnQgPSAxKTsKIAotICAgIGludAkJR2V0U2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9EYXRhU2l6ZTsKLSAgICB9CisgIGludCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9EYXRhU2l6ZTsgfQogCi0gICAgaW50CQlHZXRTZWdtZW50U2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9TZWdtZW50U2l6ZTsKLSAgICB9CisgIGludCBHZXRTZWdtZW50U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fU2VnbWVudFNpemU7IH0KIAotICAgIGludAkJR2V0VW5pdFNpemUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fVW5pdFNpemU7Ci0gICAgfQorICBpbnQgR2V0VW5pdFNpemUoKSBjb25zdCB7IHJldHVybiBtX1VuaXRTaXplOyB9CiAKLSAgICB2b2lkKglJdGVyYXRlKEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OwotcHJpdmF0ZToKKyAgdm9pZCogSXRlcmF0ZShGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksCisgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0pIGNvbnN0OwogCi0gICAgaW50CQkJCW1fVW5pdFNpemU7CisgcHJpdmF0ZToKKyAgaW50IG1fVW5pdFNpemU7CiAKLSAgICBzaG9ydAkJCW1fU2VnbWVudFNpemU7CisgIHNob3J0IG1fU2VnbWVudFNpemU7CiAKLSAgICB1aW50OF90CQkJbV9JbmRleFNpemU7CisgIHVpbnQ4X3QgbV9JbmRleFNpemU7CiAKLSAgICB1aW50OF90CQkJbV9JbmRleERlcHRoOworICB1aW50OF90IG1fSW5kZXhEZXB0aDsKIAotICAgIGludAkJCQltX0RhdGFTaXplOworICBpbnQgbV9EYXRhU2l6ZTsKIAotICAgIHZvaWQqCQkJbV9wSW5kZXg7Ci0gICAgdm9pZCoqCUdldEluZGV4KGludCBzZWdfaW5kZXgpIGNvbnN0OwotICAgIHZvaWQqCUl0ZXJhdGVJbmRleChpbnQgbGV2ZWwsIGludCYgc3RhcnQsIHZvaWQqKiBwSW5kZXgsIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OwotICAgIHZvaWQqCUl0ZXJhdGVTZWdtZW50KGNvbnN0IHVpbnQ4X3QqIHBTZWdtZW50LCBpbnQgY291bnQsIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OworICB2b2lkKiBtX3BJbmRleDsKKyAgdm9pZCoqIEdldEluZGV4KGludCBzZWdfaW5kZXgpIGNvbnN0OworICB2b2lkKiBJdGVyYXRlSW5kZXgoaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgaW50JiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSkgY29uc3Q7CisgIHZvaWQqIEl0ZXJhdGVTZWdtZW50KGNvbnN0IHVpbnQ4X3QqIHBTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0pIGNvbnN0OwogfTsKIHRlbXBsYXRlIDxjbGFzcyBFbGVtZW50VHlwZT4KLWNsYXNzIENGWF9TZWdtZW50ZWRBcnJheSA6IHB1YmxpYyBDRlhfQmFzZVNlZ21lbnRlZEFycmF5Ci17Ci1wdWJsaWM6Ci0gICAgQ0ZYX1NlZ21lbnRlZEFycmF5KGludCBzZWdtZW50X3VuaXRzLCBpbnQgaW5kZXhfc2l6ZSA9IDgpCi0gICAgICAgIDogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheShzaXplb2YoRWxlbWVudFR5cGUpLCBzZWdtZW50X3VuaXRzLCBpbmRleF9zaXplKQotICAgIHt9CitjbGFzcyBDRlhfU2VnbWVudGVkQXJyYXkgOiBwdWJsaWMgQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheSB7CisgcHVibGljOgorICBDRlhfU2VnbWVudGVkQXJyYXkoaW50IHNlZ21lbnRfdW5pdHMsIGludCBpbmRleF9zaXplID0gOCkKKyAgICAgIDogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheShzaXplb2YoRWxlbWVudFR5cGUpLCBzZWdtZW50X3VuaXRzLCBpbmRleF9zaXplKSB7CisgIH0KIAotICAgIHZvaWQJQWRkKEVsZW1lbnRUeXBlIGRhdGEpCi0gICAgewotICAgICAgICAqKEVsZW1lbnRUeXBlKilDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpBZGQoKSA9IGRhdGE7Ci0gICAgfQorICB2b2lkIEFkZChFbGVtZW50VHlwZSBkYXRhKSB7CisgICAgKihFbGVtZW50VHlwZSopQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6QWRkKCkgPSBkYXRhOworICB9CiAKLSAgICBFbGVtZW50VHlwZSYgb3BlcmF0b3IgW10gKGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAqKEVsZW1lbnRUeXBlKilDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpHZXRBdChpbmRleCk7Ci0gICAgfQorICBFbGVtZW50VHlwZSYgb3BlcmF0b3JbXShpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gKihFbGVtZW50VHlwZSopQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6R2V0QXQoaW5kZXgpOworICB9CiB9OwogdGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlLCBpbnQgRml4ZWRTaXplPgotY2xhc3MgQ0ZYX0ZpeGVkQnVmR3JvdwotewotcHVibGljOgotICAgIENGWF9GaXhlZEJ1Zkdyb3coKSA6IG1fcERhdGEoTlVMTCkKLSAgICB7fQotICAgIENGWF9GaXhlZEJ1Zkdyb3coaW50IGRhdGFfc2l6ZSkgOiBtX3BEYXRhKE5VTEwpCi0gICAgewotICAgICAgICBpZiAoZGF0YV9zaXplID4gRml4ZWRTaXplKSB7Ci0gICAgICAgICAgICBtX3BEYXRhID0gRlhfQWxsb2MoRGF0YVR5cGUsIGRhdGFfc2l6ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQobV9EYXRhLCAwLCBzaXplb2YoRGF0YVR5cGUpKkZpeGVkU2l6ZSk7Ci0gICAgICAgIH0KK2NsYXNzIENGWF9GaXhlZEJ1Zkdyb3cgeworIHB1YmxpYzoKKyAgQ0ZYX0ZpeGVkQnVmR3JvdygpIDogbV9wRGF0YShOVUxMKSB7fQorICBDRlhfRml4ZWRCdWZHcm93KGludCBkYXRhX3NpemUpIDogbV9wRGF0YShOVUxMKSB7CisgICAgaWYgKGRhdGFfc2l6ZSA+IEZpeGVkU2l6ZSkgeworICAgICAgbV9wRGF0YSA9IEZYX0FsbG9jKERhdGFUeXBlLCBkYXRhX3NpemUpOworICAgIH0gZWxzZSB7CisgICAgICBGWFNZU19tZW1zZXQobV9EYXRhLCAwLCBzaXplb2YoRGF0YVR5cGUpICogRml4ZWRTaXplKTsKICAgICB9Ci0gICAgdm9pZCBTZXREYXRhU2l6ZShpbnQgZGF0YV9zaXplKQotICAgIHsKLSAgICAgICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9wRGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgICAgIGlmIChkYXRhX3NpemUgPiBGaXhlZFNpemUpIHsKLSAgICAgICAgICAgIG1fcERhdGEgPSBGWF9BbGxvYyhEYXRhVHlwZSwgZGF0YV9zaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChtX0RhdGEsIDAsIHNpemVvZihEYXRhVHlwZSkqRml4ZWRTaXplKTsKLSAgICAgICAgfQorICB9CisgIHZvaWQgU2V0RGF0YVNpemUoaW50IGRhdGFfc2l6ZSkgeworICAgIGlmIChtX3BEYXRhKSB7CisgICAgICBGWF9GcmVlKG1fcERhdGEpOwogICAgIH0KLSAgICB+Q0ZYX0ZpeGVkQnVmR3JvdygpCi0gICAgewotICAgICAgICBpZiAobV9wRGF0YSkgewotICAgICAgICAgICAgRlhfRnJlZShtX3BEYXRhKTsKLSAgICAgICAgfQorICAgIG1fcERhdGEgPSBOVUxMOworICAgIGlmIChkYXRhX3NpemUgPiBGaXhlZFNpemUpIHsKKyAgICAgIG1fcERhdGEgPSBGWF9BbGxvYyhEYXRhVHlwZSwgZGF0YV9zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgRlhTWVNfbWVtc2V0KG1fRGF0YSwgMCwgc2l6ZW9mKERhdGFUeXBlKSAqIEZpeGVkU2l6ZSk7CiAgICAgfQotICAgIG9wZXJhdG9yIERhdGFUeXBlKigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEgOiBtX0RhdGE7CisgIH0KKyAgfkNGWF9GaXhlZEJ1Zkdyb3coKSB7CisgICAgaWYgKG1fcERhdGEpIHsKKyAgICAgIEZYX0ZyZWUobV9wRGF0YSk7CiAgICAgfQotcHJpdmF0ZToKLSAgICBEYXRhVHlwZQkJbV9EYXRhW0ZpeGVkU2l6ZV07Ci0gICAgRGF0YVR5cGUqCQltX3BEYXRhOworICB9CisgIG9wZXJhdG9yIERhdGFUeXBlKigpIHsgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhIDogbV9EYXRhOyB9CisKKyBwcml2YXRlOgorICBEYXRhVHlwZSBtX0RhdGFbRml4ZWRTaXplXTsKKyAgRGF0YVR5cGUqIG1fcERhdGE7CiB9OwotY2xhc3MgQ0ZYX01hcFB0clRvUHRyCi17Ci1wcm90ZWN0ZWQ6CitjbGFzcyBDRlhfTWFwUHRyVG9QdHIgeworIHByb3RlY3RlZDoKKyAgc3RydWN0IENBc3NvYyB7CisgICAgQ0Fzc29jKiBwTmV4dDsKIAotICAgIHN0cnVjdCBDQXNzb2MgeworICAgIHZvaWQqIGtleTsKIAotICAgICAgICBDQXNzb2MqIHBOZXh0OworICAgIHZvaWQqIHZhbHVlOworICB9OwogCi0gICAgICAgIHZvaWQqIGtleTsKKyBwdWJsaWM6CisgIENGWF9NYXBQdHJUb1B0cihpbnQgbkJsb2NrU2l6ZSA9IDEwKTsKIAotICAgICAgICB2b2lkKiB2YWx1ZTsKLSAgICB9OwotcHVibGljOgotICAgIENGWF9NYXBQdHJUb1B0cihpbnQgbkJsb2NrU2l6ZSA9IDEwKTsKKyAgfkNGWF9NYXBQdHJUb1B0cigpOwogCi0gICAgfkNGWF9NYXBQdHJUb1B0cigpOworICBpbnQgR2V0Q291bnQoKSBjb25zdCB7IHJldHVybiBtX25Db3VudDsgfQogCi0gICAgaW50IEdldENvdW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25Db3VudDsKLSAgICB9CisgIEZYX0JPT0wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fbkNvdW50ID09IDA7IH0KIAotICAgIEZYX0JPT0wgSXNFbXB0eSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9uQ291bnQgPT0gMDsKLSAgICB9CisgIEZYX0JPT0wgTG9va3VwKHZvaWQqIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3Q7CiAKLSAgICBGWF9CT09MIExvb2t1cCh2b2lkKiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0OworICB2b2lkKiBHZXRWYWx1ZUF0KHZvaWQqIGtleSkgY29uc3Q7CiAKLSAgICB2b2lkKiBHZXRWYWx1ZUF0KHZvaWQqIGtleSkgY29uc3Q7CisgIHZvaWQqJiBvcGVyYXRvcltdKHZvaWQqIGtleSk7CiAKLSAgICB2b2lkKiYgb3BlcmF0b3JbXSh2b2lkKiBrZXkpOworICB2b2lkIFNldEF0KHZvaWQqIGtleSwgdm9pZCogbmV3VmFsdWUpIHsgKCp0aGlzKVtrZXldID0gbmV3VmFsdWU7IH0KIAotICAgIHZvaWQgU2V0QXQodm9pZCoga2V5LCB2b2lkKiBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgICgqdGhpcylba2V5XSA9IG5ld1ZhbHVlOwotICAgIH0KKyAgRlhfQk9PTCBSZW1vdmVLZXkodm9pZCoga2V5KTsKIAotICAgIEZYX0JPT0wgUmVtb3ZlS2V5KHZvaWQqIGtleSk7CisgIHZvaWQgUmVtb3ZlQWxsKCk7CiAKLSAgICB2b2lkIFJlbW92ZUFsbCgpOworICBGWF9QT1NJVElPTiBHZXRTdGFydFBvc2l0aW9uKCkgY29uc3QgeworICAgIHJldHVybiAobV9uQ291bnQgPT0gMCkgPyBOVUxMIDogKEZYX1BPU0lUSU9OKS0xOworICB9CiAKLSAgICBGWF9QT1NJVElPTiBHZXRTdGFydFBvc2l0aW9uKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAobV9uQ291bnQgPT0gMCkgPyBOVUxMIDogKEZYX1BPU0lUSU9OKSAtIDE7Ci0gICAgfQorICB2b2lkIEdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgdm9pZComIHJLZXksCisgICAgICAgICAgICAgICAgICAgIHZvaWQqJiByVmFsdWUpIGNvbnN0OwogCi0gICAgdm9pZCBHZXROZXh0QXNzb2MoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24sIHZvaWQqJiByS2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKKyAgRlhfRFdPUkQgR2V0SGFzaFRhYmxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbkhhc2hUYWJsZVNpemU7IH0KIAotICAgIEZYX0RXT1JEIEdldEhhc2hUYWJsZVNpemUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkhhc2hUYWJsZVNpemU7Ci0gICAgfQorICB2b2lkIEluaXRIYXNoVGFibGUoRlhfRFdPUkQgaGFzaFNpemUsIEZYX0JPT0wgYkFsbG9jTm93ID0gVFJVRSk7CiAKLSAgICB2b2lkIEluaXRIYXNoVGFibGUoRlhfRFdPUkQgaGFzaFNpemUsIEZYX0JPT0wgYkFsbG9jTm93ID0gVFJVRSk7Ci1wcm90ZWN0ZWQ6CisgcHJvdGVjdGVkOgorICBDQXNzb2MqKiBtX3BIYXNoVGFibGU7CiAKLSAgICBDQXNzb2MqKiBtX3BIYXNoVGFibGU7CisgIEZYX0RXT1JEIG1fbkhhc2hUYWJsZVNpemU7CiAKLSAgICBGWF9EV09SRCBtX25IYXNoVGFibGVTaXplOworICBpbnQgbV9uQ291bnQ7CiAKLSAgICBpbnQgbV9uQ291bnQ7CisgIENBc3NvYyogbV9wRnJlZUxpc3Q7CiAKLSAgICBDQXNzb2MqIG1fcEZyZWVMaXN0OworICBzdHJ1Y3QgQ0ZYX1BsZXgqIG1fcEJsb2NrczsKIAotICAgIHN0cnVjdCBDRlhfUGxleCogbV9wQmxvY2tzOworICBpbnQgbV9uQmxvY2tTaXplOwogCi0gICAgaW50IG1fbkJsb2NrU2l6ZTsKKyAgRlhfRFdPUkQgSGFzaEtleSh2b2lkKiBrZXkpIGNvbnN0OwogCi0gICAgRlhfRFdPUkQgSGFzaEtleSh2b2lkKiBrZXkpIGNvbnN0OworICBDQXNzb2MqIE5ld0Fzc29jKCk7CiAKLSAgICBDQXNzb2MqIE5ld0Fzc29jKCk7CisgIHZvaWQgRnJlZUFzc29jKENBc3NvYyogcEFzc29jKTsKIAotICAgIHZvaWQgRnJlZUFzc29jKENBc3NvYyogcEFzc29jKTsKLQotICAgIENBc3NvYyogR2V0QXNzb2NBdCh2b2lkKiBrZXksIEZYX0RXT1JEJiBoYXNoKSBjb25zdDsKKyAgQ0Fzc29jKiBHZXRBc3NvY0F0KHZvaWQqIGtleSwgRlhfRFdPUkQmIGhhc2gpIGNvbnN0OwogfTsKIHRlbXBsYXRlIDxjbGFzcyBLZXlUeXBlLCBjbGFzcyBWYWx1ZVR5cGU+Ci1jbGFzcyBDRlhfTWFwUHRyVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX01hcFB0clRvUHRyCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX01hcFB0clRlbXBsYXRlKCkgOiBDRlhfTWFwUHRyVG9QdHIoMTApIHt9CitjbGFzcyBDRlhfTWFwUHRyVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX01hcFB0clRvUHRyIHsKKyBwdWJsaWM6CisgIENGWF9NYXBQdHJUZW1wbGF0ZSgpIDogQ0ZYX01hcFB0clRvUHRyKDEwKSB7fQogCi0gICAgRlhfQk9PTAlMb29rdXAoS2V5VHlwZSBrZXksIFZhbHVlVHlwZSYgclZhbHVlKSBjb25zdAotICAgIHsKLSAgICAgICAgdm9pZCogcFZhbHVlID0gTlVMTDsKLSAgICAgICAgaWYgKCFDRlhfTWFwUHRyVG9QdHI6Okxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClrZXksIHBWYWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICByVmFsdWUgPSAoVmFsdWVUeXBlKSh1aW50cHRyX3QpcFZhbHVlOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgRlhfQk9PTCBMb29rdXAoS2V5VHlwZSBrZXksIFZhbHVlVHlwZSYgclZhbHVlKSBjb25zdCB7CisgICAgdm9pZCogcFZhbHVlID0gTlVMTDsKKyAgICBpZiAoIUNGWF9NYXBQdHJUb1B0cjo6TG9va3VwKCh2b2lkKikodWludHB0cl90KWtleSwgcFZhbHVlKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgICByVmFsdWUgPSAoVmFsdWVUeXBlKSh1aW50cHRyX3QpcFZhbHVlOworICAgIHJldHVybiBUUlVFOworICB9CiAKLSAgICBWYWx1ZVR5cGUmIG9wZXJhdG9yW10oS2V5VHlwZSBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gKFZhbHVlVHlwZSYpQ0ZYX01hcFB0clRvUHRyOjpvcGVyYXRvciBbXSgodm9pZCopKHVpbnRwdHJfdClrZXkpOwotICAgIH0KKyAgVmFsdWVUeXBlJiBvcGVyYXRvcltdKEtleVR5cGUga2V5KSB7CisgICAgcmV0dXJuIChWYWx1ZVR5cGUmKUNGWF9NYXBQdHJUb1B0cjo6b3BlcmF0b3JbXSgodm9pZCopKHVpbnRwdHJfdClrZXkpOworICB9CiAKLSAgICB2b2lkIFNldEF0KEtleVR5cGUga2V5LCBWYWx1ZVR5cGUgbmV3VmFsdWUpCi0gICAgewotICAgICAgICBDRlhfTWFwUHRyVG9QdHI6OlNldEF0KCh2b2lkKikodWludHB0cl90KWtleSwgKHZvaWQqKSh1aW50cHRyX3QpbmV3VmFsdWUpOwotICAgIH0KKyAgdm9pZCBTZXRBdChLZXlUeXBlIGtleSwgVmFsdWVUeXBlIG5ld1ZhbHVlKSB7CisgICAgQ0ZYX01hcFB0clRvUHRyOjpTZXRBdCgodm9pZCopKHVpbnRwdHJfdClrZXksICh2b2lkKikodWludHB0cl90KW5ld1ZhbHVlKTsKKyAgfQogCi0gICAgRlhfQk9PTAlSZW1vdmVLZXkoS2V5VHlwZSBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gQ0ZYX01hcFB0clRvUHRyOjpSZW1vdmVLZXkoKHZvaWQqKSh1aW50cHRyX3Qpa2V5KTsKLSAgICB9CisgIEZYX0JPT0wgUmVtb3ZlS2V5KEtleVR5cGUga2V5KSB7CisgICAgcmV0dXJuIENGWF9NYXBQdHJUb1B0cjo6UmVtb3ZlS2V5KCh2b2lkKikodWludHB0cl90KWtleSk7CisgIH0KIAotICAgIHZvaWQgR2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uLCBLZXlUeXBlJiByS2V5LCBWYWx1ZVR5cGUmIHJWYWx1ZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHZvaWQqIHBLZXkgPSBOVUxMOwotICAgICAgICB2b2lkKiBwVmFsdWUgPSBOVUxMOwotICAgICAgICBDRlhfTWFwUHRyVG9QdHI6OkdldE5leHRBc3NvYyhyTmV4dFBvc2l0aW9uLCBwS2V5LCBwVmFsdWUpOwotICAgICAgICByS2V5ID0gKEtleVR5cGUpKHVpbnRwdHJfdClwS2V5OwotICAgICAgICByVmFsdWUgPSAoVmFsdWVUeXBlKSh1aW50cHRyX3QpcFZhbHVlOwotICAgIH0KKyAgdm9pZCBHZXROZXh0QXNzb2MoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIEtleVR5cGUmIHJLZXksCisgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZSYgclZhbHVlKSBjb25zdCB7CisgICAgdm9pZCogcEtleSA9IE5VTEw7CisgICAgdm9pZCogcFZhbHVlID0gTlVMTDsKKyAgICBDRlhfTWFwUHRyVG9QdHI6OkdldE5leHRBc3NvYyhyTmV4dFBvc2l0aW9uLCBwS2V5LCBwVmFsdWUpOworICAgIHJLZXkgPSAoS2V5VHlwZSkodWludHB0cl90KXBLZXk7CisgICAgclZhbHVlID0gKFZhbHVlVHlwZSkodWludHB0cl90KXBWYWx1ZTsKKyAgfQogfTsKLWNsYXNzIENGWF9DTWFwRFdvcmRUb0RXb3JkCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfQ01hcERXb3JkVG9EV29yZCB7CisgcHVibGljOgorICBGWF9CT09MIExvb2t1cChGWF9EV09SRCBrZXksIEZYX0RXT1JEJiB2YWx1ZSkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJTG9va3VwKEZYX0RXT1JEIGtleSwgRlhfRFdPUkQmIHZhbHVlKSBjb25zdDsKKyAgdm9pZCBTZXRBdChGWF9EV09SRCBrZXksIEZYX0RXT1JEIHZhbHVlKTsKIAotICAgIHZvaWQJCQlTZXRBdChGWF9EV09SRCBrZXksIEZYX0RXT1JEIHZhbHVlKTsKKyAgdm9pZCBFc3RpbWF0ZVNpemUoRlhfRFdPUkQgc2l6ZSwgRlhfRFdPUkQgZ3Jvd19ieSk7CiAKLSAgICB2b2lkCQkJRXN0aW1hdGVTaXplKEZYX0RXT1JEIHNpemUsIEZYX0RXT1JEIGdyb3dfYnkpOworICBGWF9QT1NJVElPTiBHZXRTdGFydFBvc2l0aW9uKCkgY29uc3Q7CiAKLSAgICBGWF9QT1NJVElPTgkJR2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0OworICB2b2lkIEdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgcG9zLCBGWF9EV09SRCYga2V5LCBGWF9EV09SRCYgdmFsdWUpIGNvbnN0OwogCi0gICAgdm9pZAkJCUdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgcG9zLCBGWF9EV09SRCYga2V5LCBGWF9EV09SRCYgdmFsdWUpIGNvbnN0OwotcHJvdGVjdGVkOgotCi0gICAgQ0ZYX0JpbmFyeUJ1ZgltX0J1ZmZlcjsKKyBwcm90ZWN0ZWQ6CisgIENGWF9CaW5hcnlCdWYgbV9CdWZmZXI7CiB9OwotY2xhc3MgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgotewotcHJvdGVjdGVkOgorY2xhc3MgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciB7CisgcHJvdGVjdGVkOgorICBzdHJ1Y3QgQ0Fzc29jIHsKKyAgICBDQXNzb2MqIHBOZXh0OwogCi0gICAgc3RydWN0IENBc3NvYyB7CisgICAgRlhfRFdPUkQgbkhhc2hWYWx1ZTsKIAotICAgICAgICBDQXNzb2MqIHBOZXh0OworICAgIENGWF9CeXRlU3RyaW5nIGtleTsKIAotICAgICAgICBGWF9EV09SRCBuSGFzaFZhbHVlOworICAgIHZvaWQqIHZhbHVlOworICB9OwogCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKKyBwdWJsaWM6CisgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIoaW50IG5CbG9ja1NpemUgPSAxMCk7CiAKLSAgICAgICAgdm9pZCogdmFsdWU7Ci0gICAgfTsKLXB1YmxpYzoKLSAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyKGludCBuQmxvY2tTaXplID0gMTApOworICBpbnQgR2V0Q291bnQoKSBjb25zdCB7IHJldHVybiBtX25Db3VudDsgfQogCi0gICAgaW50IEdldENvdW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25Db3VudDsKLSAgICB9CisgIEZYX0JPT0wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fbkNvdW50ID09IDA7IH0KIAotICAgIEZYX0JPT0wgSXNFbXB0eSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9uQ291bnQgPT0gMDsKLSAgICB9CisgIEZYX0JPT0wgTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKIAotICAgIEZYX0JPT0wgTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKKyAgdm9pZComIG9wZXJhdG9yW10oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpOwogCi0gICAgdm9pZComIG9wZXJhdG9yW10oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpOworICB2b2lkIFNldEF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiBuZXdWYWx1ZSkgeworICAgICgqdGhpcylba2V5XSA9IG5ld1ZhbHVlOworICB9CiAKLSAgICB2b2lkIFNldEF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiBuZXdWYWx1ZSkKLSAgICB7Ci0gICAgICAgICgqdGhpcylba2V5XSA9IG5ld1ZhbHVlOwotICAgIH0KKyAgRlhfQk9PTCBSZW1vdmVLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpOwogCi0gICAgRlhfQk9PTCBSZW1vdmVLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpOworICB2b2lkIFJlbW92ZUFsbCgpOwogCi0gICAgdm9pZCBSZW1vdmVBbGwoKTsKKyAgRlhfUE9TSVRJT04gR2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1fbkNvdW50ID09IDApID8gTlVMTCA6IChGWF9QT1NJVElPTiktMTsKKyAgfQogCi0gICAgRlhfUE9TSVRJT04gR2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKG1fbkNvdW50ID09IDApID8gTlVMTCA6IChGWF9QT1NJVElPTikgLSAxOwotICAgIH0KKyAgdm9pZCBHZXROZXh0QXNzb2MoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByS2V5LAorICAgICAgICAgICAgICAgICAgICB2b2lkKiYgclZhbHVlKSBjb25zdDsKIAotICAgIHZvaWQgR2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uLCBDRlhfQnl0ZVN0cmluZyYgcktleSwgdm9pZComIHJWYWx1ZSkgY29uc3Q7CisgIHZvaWQqIEdldE5leHRWYWx1ZShGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbikgY29uc3Q7CiAKLSAgICB2b2lkKgkJR2V0TmV4dFZhbHVlKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uKSBjb25zdDsKKyAgRlhfRFdPUkQgR2V0SGFzaFRhYmxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbkhhc2hUYWJsZVNpemU7IH0KIAotICAgIEZYX0RXT1JEIEdldEhhc2hUYWJsZVNpemUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkhhc2hUYWJsZVNpemU7Ci0gICAgfQorICB2b2lkIEluaXRIYXNoVGFibGUoRlhfRFdPUkQgaGFzaFNpemUsIEZYX0JPT0wgYkFsbG9jTm93ID0gVFJVRSk7CiAKLSAgICB2b2lkIEluaXRIYXNoVGFibGUoRlhfRFdPUkQgaGFzaFNpemUsIEZYX0JPT0wgYkFsbG9jTm93ID0gVFJVRSk7CisgIEZYX0RXT1JEIEhhc2hLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCi0gICAgRlhfRFdPUkQgSGFzaEtleShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3Q7Ci1wcm90ZWN0ZWQ6CisgcHJvdGVjdGVkOgorICBDQXNzb2MqKiBtX3BIYXNoVGFibGU7CiAKLSAgICBDQXNzb2MqKiBtX3BIYXNoVGFibGU7CisgIEZYX0RXT1JEIG1fbkhhc2hUYWJsZVNpemU7CiAKLSAgICBGWF9EV09SRCBtX25IYXNoVGFibGVTaXplOworICBpbnQgbV9uQ291bnQ7CiAKLSAgICBpbnQgbV9uQ291bnQ7CisgIENBc3NvYyogbV9wRnJlZUxpc3Q7CiAKLSAgICBDQXNzb2MqIG1fcEZyZWVMaXN0OworICBzdHJ1Y3QgQ0ZYX1BsZXgqIG1fcEJsb2NrczsKIAotICAgIHN0cnVjdCBDRlhfUGxleCogbV9wQmxvY2tzOworICBpbnQgbV9uQmxvY2tTaXplOwogCi0gICAgaW50IG1fbkJsb2NrU2l6ZTsKKyAgQ0Fzc29jKiBOZXdBc3NvYygpOwogCi0gICAgQ0Fzc29jKiBOZXdBc3NvYygpOworICB2b2lkIEZyZWVBc3NvYyhDQXNzb2MqIHBBc3NvYyk7CiAKLSAgICB2b2lkIEZyZWVBc3NvYyhDQXNzb2MqIHBBc3NvYyk7CisgIENBc3NvYyogR2V0QXNzb2NBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgRlhfRFdPUkQmIGhhc2gpIGNvbnN0OwogCi0gICAgQ0Fzc29jKiBHZXRBc3NvY0F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9EV09SRCYgaGFzaCkgY29uc3Q7Ci1wdWJsaWM6Ci0KLSAgICB+Q0ZYX01hcEJ5dGVTdHJpbmdUb1B0cigpOworIHB1YmxpYzoKKyAgfkNGWF9NYXBCeXRlU3RyaW5nVG9QdHIoKTsKIH07Ci1jbGFzcyBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cgotewotcHVibGljOgotICAgIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyKCk7CitjbGFzcyBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0ciB7CisgcHVibGljOgorICBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cigpOwogCi0gICAgfkNGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyKCk7CisgIH5DRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cigpOwogCi0gICAgdm9pZAkJCVJlbW92ZUFsbCgpOworICB2b2lkIFJlbW92ZUFsbCgpOwogCi0gICAgRlhfUE9TSVRJT04JCUdldFN0YXJ0UG9zaXRpb24oKSBjb25zdDsKKyAgRlhfUE9TSVRJT04gR2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0OwogCi0gICAgdm9pZAkJCUdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbiwgQ0ZYX0J5dGVTdHJpbmcmIHJLZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0OworICB2b2lkIEdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJLZXksCisgICAgICAgICAgICAgICAgICAgIHZvaWQqJiByVmFsdWUpIGNvbnN0OwogCi0gICAgdm9pZCoJCUdldE5leHRWYWx1ZShGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbikgY29uc3Q7CisgIHZvaWQqIEdldE5leHRWYWx1ZShGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbikgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKKyAgRlhfQk9PTCBMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0OwogCi0gICAgdm9pZAkJCVNldEF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiB2YWx1ZSk7CisgIHZvaWQgU2V0QXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIHZvaWQqIHZhbHVlKTsKIAotICAgIHZvaWQJCQlSZW1vdmVLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpOworICB2b2lkIFJlbW92ZUtleShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSk7CiAKLSAgICBpbnQJCQkJR2V0Q291bnQoKSBjb25zdDsKKyAgaW50IEdldENvdW50KCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJQWRkVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIHZvaWQqIHBWYWx1ZSk7Ci1wcml2YXRlOgorICB2b2lkIEFkZFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiBwVmFsdWUpOwogCi0gICAgQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheQkJCW1fQnVmZmVyOworIHByaXZhdGU6CisgIENGWF9CYXNlU2VnbWVudGVkQXJyYXkgbV9CdWZmZXI7CiB9OwotY2xhc3MgQ0ZYX1B0ckxpc3QKLXsKLXByb3RlY3RlZDoKK2NsYXNzIENGWF9QdHJMaXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0cnVjdCBDTm9kZSB7CisgICAgQ05vZGUqIHBOZXh0OwogCi0gICAgc3RydWN0IENOb2RlIHsKKyAgICBDTm9kZSogcFByZXY7CiAKLSAgICAgICAgQ05vZGUqIHBOZXh0OworICAgIHZvaWQqIGRhdGE7CisgIH07CiAKLSAgICAgICAgQ05vZGUqIHBQcmV2OworIHB1YmxpYzoKKyAgQ0ZYX1B0ckxpc3QoaW50IG5CbG9ja1NpemUgPSAxMCk7CiAKLSAgICAgICAgdm9pZCogZGF0YTsKLSAgICB9OwotcHVibGljOgotICAgIENGWF9QdHJMaXN0KGludCBuQmxvY2tTaXplID0gMTApOworICBGWF9QT1NJVElPTiBHZXRIZWFkUG9zaXRpb24oKSBjb25zdCB7IHJldHVybiAoRlhfUE9TSVRJT04pbV9wTm9kZUhlYWQ7IH0KIAotICAgIEZYX1BPU0lUSU9OIEdldEhlYWRQb3NpdGlvbigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKEZYX1BPU0lUSU9OKW1fcE5vZGVIZWFkOwotICAgIH0KKyAgRlhfUE9TSVRJT04gR2V0VGFpbFBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gKEZYX1BPU0lUSU9OKW1fcE5vZGVUYWlsOyB9CiAKLSAgICBGWF9QT1NJVElPTiBHZXRUYWlsUG9zaXRpb24oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChGWF9QT1NJVElPTiltX3BOb2RlVGFpbDsKLSAgICB9CisgIHZvaWQqIEdldE5leHQoRlhfUE9TSVRJT04mIHJQb3NpdGlvbikgY29uc3QgeworICAgIENOb2RlKiBwTm9kZSA9IChDTm9kZSopclBvc2l0aW9uOworICAgIHJQb3NpdGlvbiA9IChGWF9QT1NJVElPTilwTm9kZS0+cE5leHQ7CisgICAgcmV0dXJuIHBOb2RlLT5kYXRhOworICB9CiAKLSAgICB2b2lkKglHZXROZXh0KEZYX1BPU0lUSU9OJiByUG9zaXRpb24pIGNvbnN0Ci0gICAgewotICAgICAgICBDTm9kZSogcE5vZGUgPSAoQ05vZGUqKSByUG9zaXRpb247Ci0gICAgICAgIHJQb3NpdGlvbiA9IChGWF9QT1NJVElPTikgcE5vZGUtPnBOZXh0OwotICAgICAgICByZXR1cm4gcE5vZGUtPmRhdGE7Ci0gICAgfQorICB2b2lkKiBHZXRQcmV2KEZYX1BPU0lUSU9OJiByUG9zaXRpb24pIGNvbnN0IHsKKyAgICBDTm9kZSogcE5vZGUgPSAoQ05vZGUqKXJQb3NpdGlvbjsKKyAgICByUG9zaXRpb24gPSAoRlhfUE9TSVRJT04pcE5vZGUtPnBQcmV2OworICAgIHJldHVybiBwTm9kZS0+ZGF0YTsKKyAgfQogCi0gICAgdm9pZCoJR2V0UHJldihGWF9QT1NJVElPTiYgclBvc2l0aW9uKSBjb25zdAotICAgIHsKLSAgICAgICAgQ05vZGUqIHBOb2RlID0gKENOb2RlKikgclBvc2l0aW9uOwotICAgICAgICByUG9zaXRpb24gPSAoRlhfUE9TSVRJT04pIHBOb2RlLT5wUHJldjsKLSAgICAgICAgcmV0dXJuIHBOb2RlLT5kYXRhOwotICAgIH0KKyAgRlhfUE9TSVRJT04gR2V0TmV4dFBvc2l0aW9uKEZYX1BPU0lUSU9OIHBvcykgY29uc3QgeworICAgIHJldHVybiAoKENOb2RlKilwb3MpLT5wTmV4dDsKKyAgfQogCi0gICAgRlhfUE9TSVRJT04JR2V0TmV4dFBvc2l0aW9uKEZYX1BPU0lUSU9OIHBvcykgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKENOb2RlKilwb3MpLT5wTmV4dDsKLSAgICB9CisgIEZYX1BPU0lUSU9OIEdldFByZXZQb3NpdGlvbihGWF9QT1NJVElPTiBwb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gKChDTm9kZSopcG9zKS0+cFByZXY7CisgIH0KIAotICAgIEZYX1BPU0lUSU9OCUdldFByZXZQb3NpdGlvbihGWF9QT1NJVElPTiBwb3MpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKChDTm9kZSopcG9zKS0+cFByZXY7Ci0gICAgfQorICB2b2lkKiBHZXRBdChGWF9QT1NJVElPTiByUG9zaXRpb24pIGNvbnN0IHsKKyAgICBDTm9kZSogcE5vZGUgPSAoQ05vZGUqKXJQb3NpdGlvbjsKKyAgICByZXR1cm4gcE5vZGUtPmRhdGE7CisgIH0KIAotICAgIHZvaWQqCUdldEF0KEZYX1BPU0lUSU9OIHJQb3NpdGlvbikgY29uc3QKLSAgICB7Ci0gICAgICAgIENOb2RlKiBwTm9kZSA9IChDTm9kZSopIHJQb3NpdGlvbjsKLSAgICAgICAgcmV0dXJuIHBOb2RlLT5kYXRhOwotICAgIH0KKyAgaW50IEdldENvdW50KCkgY29uc3QgeyByZXR1cm4gbV9uQ291bnQ7IH0KIAotICAgIGludAkJR2V0Q291bnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkNvdW50OwotICAgIH0KKyAgRlhfUE9TSVRJT04gQWRkVGFpbCh2b2lkKiBuZXdFbGVtZW50KTsKIAotICAgIEZYX1BPU0lUSU9OCUFkZFRhaWwodm9pZCogbmV3RWxlbWVudCk7CisgIEZYX1BPU0lUSU9OIEFkZEhlYWQodm9pZCogbmV3RWxlbWVudCk7CiAKLSAgICBGWF9QT1NJVElPTiBBZGRIZWFkKHZvaWQqIG5ld0VsZW1lbnQpOworICB2b2lkIFNldEF0KEZYX1BPU0lUSU9OIHBvcywgdm9pZCogbmV3RWxlbWVudCkgeworICAgIENOb2RlKiBwTm9kZSA9IChDTm9kZSopcG9zOworICAgIHBOb2RlLT5kYXRhID0gbmV3RWxlbWVudDsKKyAgfQogCi0gICAgdm9pZAlTZXRBdChGWF9QT1NJVElPTiBwb3MsIHZvaWQqIG5ld0VsZW1lbnQpCi0gICAgewotICAgICAgICBDTm9kZSogcE5vZGUgPSAoQ05vZGUqKSBwb3M7Ci0gICAgICAgIHBOb2RlLT5kYXRhID0gbmV3RWxlbWVudDsKLSAgICB9CisgIEZYX1BPU0lUSU9OIEluc2VydEFmdGVyKEZYX1BPU0lUSU9OIHBvcywgdm9pZCogbmV3RWxlbWVudCk7CiAKLSAgICBGWF9QT1NJVElPTiBJbnNlcnRBZnRlcihGWF9QT1NJVElPTiBwb3MsIHZvaWQqIG5ld0VsZW1lbnQpOworICBGWF9QT1NJVElPTiBGaW5kKHZvaWQqIHNlYXJjaFZhbHVlLCBGWF9QT1NJVElPTiBzdGFydEFmdGVyID0gTlVMTCkgY29uc3Q7CiAKLSAgICBGWF9QT1NJVElPTiBGaW5kKHZvaWQqIHNlYXJjaFZhbHVlLCBGWF9QT1NJVElPTiBzdGFydEFmdGVyID0gTlVMTCApIGNvbnN0OworICBGWF9QT1NJVElPTiBGaW5kSW5kZXgoaW50IGluZGV4KSBjb25zdDsKIAotICAgIEZYX1BPU0lUSU9OIEZpbmRJbmRleChpbnQgaW5kZXgpIGNvbnN0OworICB2b2lkIFJlbW92ZUF0KEZYX1BPU0lUSU9OIHBvcyk7CiAKLSAgICB2b2lkCVJlbW92ZUF0KEZYX1BPU0lUSU9OIHBvcyk7CisgIHZvaWQgUmVtb3ZlQWxsKCk7CiAKLSAgICB2b2lkCVJlbW92ZUFsbCgpOwotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgQ05vZGUqIG1fcE5vZGVIZWFkOwogCi0gICAgQ05vZGUqIG1fcE5vZGVIZWFkOworICBDTm9kZSogbV9wTm9kZVRhaWw7CiAKLSAgICBDTm9kZSogbV9wTm9kZVRhaWw7CisgIGludCBtX25Db3VudDsKIAotICAgIGludCBtX25Db3VudDsKKyAgQ05vZGUqIG1fcE5vZGVGcmVlOwogCi0gICAgQ05vZGUqIG1fcE5vZGVGcmVlOworICBzdHJ1Y3QgQ0ZYX1BsZXgqIG1fcEJsb2NrczsKIAotICAgIHN0cnVjdCBDRlhfUGxleCogbV9wQmxvY2tzOworICBpbnQgbV9uQmxvY2tTaXplOwogCi0gICAgaW50IG1fbkJsb2NrU2l6ZTsKKyAgQ05vZGUqIE5ld05vZGUoQ05vZGUqIHBQcmV2LCBDTm9kZSogcE5leHQpOwogCi0gICAgQ05vZGUqIE5ld05vZGUoQ05vZGUqIHBQcmV2LCBDTm9kZSogcE5leHQpOworICB2b2lkIEZyZWVOb2RlKENOb2RlKiBwTm9kZSk7CiAKLSAgICB2b2lkIEZyZWVOb2RlKENOb2RlKiBwTm9kZSk7Ci1wdWJsaWM6Ci0KLSAgICB+Q0ZYX1B0ckxpc3QoKTsKKyBwdWJsaWM6CisgIH5DRlhfUHRyTGlzdCgpOwogfTsKIHR5cGVkZWYgdm9pZCAoKlBEX0NBTExCQUNLX0ZSRUVEQVRBKSh2b2lkKiBwRGF0YSk7CiBzdHJ1Y3QgRlhfUFJJVkFURURBVEEgeworICB2b2lkIEZyZWVEYXRhKCk7CiAKLSAgICB2b2lkCQkJCQlGcmVlRGF0YSgpOworICB2b2lkKiBtX3BNb2R1bGVJZDsKIAotICAgIHZvaWQqCQkJCW1fcE1vZHVsZUlkOworICB2b2lkKiBtX3BEYXRhOwogCi0gICAgdm9pZCoJCQkJbV9wRGF0YTsKKyAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgbV9wQ2FsbGJhY2s7CiAKLSAgICBQRF9DQUxMQkFDS19GUkVFREFUQQltX3BDYWxsYmFjazsKLQotICAgIEZYX0JPT0wJCQkJCW1fYlNlbGZEZXN0cnVjdDsKKyAgRlhfQk9PTCBtX2JTZWxmRGVzdHJ1Y3Q7CiB9OwotY2xhc3MgQ0ZYX1ByaXZhdGVEYXRhCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfUHJpdmF0ZURhdGEgeworIHB1YmxpYzoKKyAgfkNGWF9Qcml2YXRlRGF0YSgpOwogCi0gICAgfkNGWF9Qcml2YXRlRGF0YSgpOworICB2b2lkIENsZWFyQWxsKCk7CiAKLSAgICB2b2lkCQkJCQlDbGVhckFsbCgpOworICB2b2lkIFNldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjayk7CiAKLSAgICB2b2lkCQkJCQlTZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQsIHZvaWQqIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjayk7CisgIHZvaWQgU2V0UHJpdmF0ZU9iaih2b2lkKiBtb2R1bGVfaWQsIENGWF9EZXN0cnVjdE9iamVjdCogcE9iaik7CiAKLSAgICB2b2lkCQkJCQlTZXRQcml2YXRlT2JqKHZvaWQqIG1vZHVsZV9pZCwgQ0ZYX0Rlc3RydWN0T2JqZWN0KiBwT2JqKTsKKyAgdm9pZCogR2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsKIAotICAgIHZvaWQqCQkJCUdldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCk7Ci0KLSAgICBGWF9CT09MCQkJCQlMb29rdXBQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQsIHZvaWQqICZwRGF0YSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmICghbW9kdWxlX2lkKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgbkNvdW50ID0gbV9EYXRhTGlzdC5HZXRTaXplKCk7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgbiA9IDA7IG4gPCBuQ291bnQ7IG4gKyspIHsKLSAgICAgICAgICAgIGlmIChtX0RhdGFMaXN0W25dLm1fcE1vZHVsZUlkID09IG1vZHVsZV9pZCkgewotICAgICAgICAgICAgICAgIHBEYXRhID0gbV9EYXRhTGlzdFtuXS5tX3BEYXRhOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgRlhfQk9PTCBMb29rdXBQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQsIHZvaWQqJiBwRGF0YSkgY29uc3QgeworICAgIGlmICghbW9kdWxlX2lkKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQorICAgIEZYX0RXT1JEIG5Db3VudCA9IG1fRGF0YUxpc3QuR2V0U2l6ZSgpOworICAgIGZvciAoRlhfRFdPUkQgbiA9IDA7IG4gPCBuQ291bnQ7IG4rKykgeworICAgICAgaWYgKG1fRGF0YUxpc3Rbbl0ubV9wTW9kdWxlSWQgPT0gbW9kdWxlX2lkKSB7CisgICAgICAgIHBEYXRhID0gbV9EYXRhTGlzdFtuXS5tX3BEYXRhOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLSAgICBGWF9CT09MCQkJCQlSZW1vdmVQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpOwotcHJvdGVjdGVkOgorICBGWF9CT09MIFJlbW92ZVByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCk7CiAKLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9QUklWQVRFREFUQT4JbV9EYXRhTGlzdDsKKyBwcm90ZWN0ZWQ6CisgIENGWF9BcnJheVRlbXBsYXRlPEZYX1BSSVZBVEVEQVRBPiBtX0RhdGFMaXN0OwogCi0gICAgdm9pZAkJCQkJQWRkRGF0YSh2b2lkKiBtb2R1bGVfaWQsIHZvaWQqIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaywgRlhfQk9PTCBiU2VsZkRlc3RydWN0KTsKKyAgdm9pZCBBZGREYXRhKHZvaWQqIG1vZHVsZV9pZCwKKyAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLAorICAgICAgICAgICAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2ssCisgICAgICAgICAgICAgICBGWF9CT09MIGJTZWxmRGVzdHJ1Y3QpOwogfTsKLWNsYXNzIENGWF9CaXRTdHJlYW0KLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9CaXRTdHJlYW0geworIHB1YmxpYzoKKyAgdm9pZCBJbml0KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOwogCi0gICAgdm9pZAkJCQlJbml0KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOworICBGWF9EV09SRCBHZXRCaXRzKEZYX0RXT1JEIG5CaXRzKTsKIAorICB2b2lkIEJ5dGVBbGlnbigpOwogCi0gICAgRlhfRFdPUkQJCQlHZXRCaXRzKEZYX0RXT1JEIG5CaXRzKTsKKyAgRlhfQk9PTCBJc0VPRigpIHsgcmV0dXJuIG1fQml0UG9zID49IG1fQml0U2l6ZTsgfQogCi0gICAgdm9pZAkJCQlCeXRlQWxpZ24oKTsKKyAgdm9pZCBTa2lwQml0cyhGWF9EV09SRCBuQml0cykgeyBtX0JpdFBvcyArPSBuQml0czsgfQogCi0gICAgRlhfQk9PTAkJCQlJc0VPRigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9CaXRQb3MgPj0gbV9CaXRTaXplOwotICAgIH0KKyAgdm9pZCBSZXdpbmQoKSB7IG1fQml0UG9zID0gMDsgfQogCi0gICAgdm9pZAkJCQlTa2lwQml0cyhGWF9EV09SRCBuQml0cykKLSAgICB7Ci0gICAgICAgIG1fQml0UG9zICs9IG5CaXRzOwotICAgIH0KKyBwcm90ZWN0ZWQ6CisgIEZYX0RXT1JEIG1fQml0UG9zOwogCi0gICAgdm9pZAkJCQlSZXdpbmQoKQotICAgIHsKLSAgICAgICAgbV9CaXRQb3MgPSAwOwotICAgIH0KLXByb3RlY3RlZDoKKyAgRlhfRFdPUkQgbV9CaXRTaXplOwogCi0gICAgRlhfRFdPUkQJCQltX0JpdFBvczsKLQotICAgIEZYX0RXT1JECQkJbV9CaXRTaXplOwotCi0gICAgY29uc3QgdWludDhfdCoJCQltX3BEYXRhOworICBjb25zdCB1aW50OF90KiBtX3BEYXRhOwogfTsKLXRlbXBsYXRlIDxjbGFzcyBPYmpDbGFzcz4gY2xhc3MgQ0ZYX0NvdW50UmVmCi17Ci1wdWJsaWM6Cit0ZW1wbGF0ZSA8Y2xhc3MgT2JqQ2xhc3M+CitjbGFzcyBDRlhfQ291bnRSZWYgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBDRlhfQ291bnRSZWY8T2JqQ2xhc3M+IFJlZjsKIAotICAgIHR5cGVkZWYgQ0ZYX0NvdW50UmVmPE9iakNsYXNzPiBSZWY7CisgIGNsYXNzIENvdW50ZWRPYmogOiBwdWJsaWMgT2JqQ2xhc3MgeworICAgcHVibGljOgorICAgIENvdW50ZWRPYmooKSB7fQogCi0gICAgY2xhc3MgQ291bnRlZE9iaiA6IHB1YmxpYyBPYmpDbGFzcwotICAgIHsKLSAgICBwdWJsaWM6CisgICAgQ291bnRlZE9iaihjb25zdCBDb3VudGVkT2JqJiBzcmMpIDogT2JqQ2xhc3Moc3JjKSB7fQogCi0gICAgICAgIENvdW50ZWRPYmooKSB7fQorICAgIGludCBtX1JlZkNvdW50OworICB9OwogCi0gICAgICAgIENvdW50ZWRPYmooY29uc3QgQ291bnRlZE9iaiYgc3JjKSA6IE9iakNsYXNzKHNyYykge30KKyAgQ0ZYX0NvdW50UmVmKCkgeyBtX3BPYmplY3QgPSBOVUxMOyB9CiAKLSAgICAgICAgaW50CQkJbV9SZWZDb3VudDsKLSAgICB9OwotCi0gICAgQ0ZYX0NvdW50UmVmKCkKLSAgICB7Ci0gICAgICAgIG1fcE9iamVjdCA9IE5VTEw7CisgIENGWF9Db3VudFJlZihjb25zdCBSZWYmIHJlZikgeworICAgIG1fcE9iamVjdCA9IHJlZi5tX3BPYmplY3Q7CisgICAgaWYgKG1fcE9iamVjdCkgeworICAgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50Kys7CiAgICAgfQorICB9CiAKLSAgICBDRlhfQ291bnRSZWYoY29uc3QgUmVmJiByZWYpCi0gICAgewotICAgICAgICBtX3BPYmplY3QgPSByZWYubV9wT2JqZWN0OwotICAgICAgICBpZiAobV9wT2JqZWN0KSB7Ci0gICAgICAgICAgICBtX3BPYmplY3QtPm1fUmVmQ291bnQgKys7Ci0gICAgICAgIH0KKyAgfkNGWF9Db3VudFJlZigpIHsKKyAgICBpZiAoIW1fcE9iamVjdCkgeworICAgICAgcmV0dXJuOwogICAgIH0KLQotICAgIH5DRlhfQ291bnRSZWYoKQotICAgIHsKLSAgICAgICAgaWYgKCFtX3BPYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtX3BPYmplY3QtPm1fUmVmQ291bnQgLS07Ci0gICAgICAgIGlmIChtX3BPYmplY3QtPm1fUmVmQ291bnQgPD0gMCkgewotICAgICAgICAgICAgZGVsZXRlIG1fcE9iamVjdDsKLSAgICAgICAgfQorICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudC0tOworICAgIGlmIChtX3BPYmplY3QtPm1fUmVmQ291bnQgPD0gMCkgeworICAgICAgZGVsZXRlIG1fcE9iamVjdDsKICAgICB9CisgIH0KIAotICAgIE9iakNsYXNzKgkJCU5ldygpCi0gICAgewotICAgICAgICBpZiAobV9wT2JqZWN0KSB7Ci0gICAgICAgICAgICBtX3BPYmplY3QtPm1fUmVmQ291bnQgLS07Ci0gICAgICAgICAgICBpZiAobV9wT2JqZWN0LT5tX1JlZkNvdW50IDw9IDApIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgbV9wT2JqZWN0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wT2JqZWN0ID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBtX3BPYmplY3QgPSBGWF9ORVcgQ291bnRlZE9iajsKLSAgICAgICAgaWYgKCFtX3BPYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgIE9iakNsYXNzKiBOZXcoKSB7CisgICAgaWYgKG1fcE9iamVjdCkgeworICAgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50LS07CisgICAgICBpZiAobV9wT2JqZWN0LT5tX1JlZkNvdW50IDw9IDApIHsKKyAgICAgICAgZGVsZXRlIG1fcE9iamVjdDsKKyAgICAgIH0KKyAgICAgIG1fcE9iamVjdCA9IE5VTEw7CisgICAgfQorICAgIG1fcE9iamVjdCA9IEZYX05FVyBDb3VudGVkT2JqOworICAgIGlmICghbV9wT2JqZWN0KSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50ID0gMTsKKyAgICByZXR1cm4gbV9wT2JqZWN0OworICB9CisKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUmVmJiByZWYpIHsKKyAgICBpZiAocmVmLm1fcE9iamVjdCkgeworICAgICAgcmVmLm1fcE9iamVjdC0+bV9SZWZDb3VudCsrOworICAgIH0KKyAgICBpZiAobV9wT2JqZWN0KSB7CisgICAgICBtX3BPYmplY3QtPm1fUmVmQ291bnQtLTsKKyAgICAgIGlmIChtX3BPYmplY3QtPm1fUmVmQ291bnQgPD0gMCkgeworICAgICAgICBkZWxldGUgbV9wT2JqZWN0OworICAgICAgfQorICAgIH0KKyAgICBtX3BPYmplY3QgPSByZWYubV9wT2JqZWN0OworICB9CisKKyAgdm9pZCBvcGVyYXRvcj0odm9pZCogcCkgeworICAgIEZYU1lTX2Fzc2VydChwID09IDApOworICAgIGlmIChtX3BPYmplY3QgPT0gTlVMTCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX3BPYmplY3QtPm1fUmVmQ291bnQtLTsKKyAgICBpZiAobV9wT2JqZWN0LT5tX1JlZkNvdW50IDw9IDApIHsKKyAgICAgIGRlbGV0ZSBtX3BPYmplY3Q7CisgICAgfQorICAgIG1fcE9iamVjdCA9IE5VTEw7CisgIH0KKworICBjb25zdCBPYmpDbGFzcyogR2V0T2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0OyB9CisKKyAgb3BlcmF0b3IgY29uc3QgT2JqQ2xhc3MqKCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0OyB9CisKKyAgRlhfQk9PTCBJc051bGwoKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3QgPT0gTlVMTDsgfQorCisgIEZYX0JPT0wgTm90TnVsbCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iamVjdCAhPSBOVUxMOyB9CisKKyAgT2JqQ2xhc3MqIEdldE1vZGlmeSgpIHsKKyAgICBpZiAobV9wT2JqZWN0ID09IE5VTEwpIHsKKyAgICAgIG1fcE9iamVjdCA9IEZYX05FVyBDb3VudGVkT2JqOworICAgICAgaWYgKG1fcE9iamVjdCkgewogICAgICAgICBtX3BPYmplY3QtPm1fUmVmQ291bnQgPSAxOwotICAgICAgICByZXR1cm4gbV9wT2JqZWN0OworICAgICAgfQorICAgIH0gZWxzZSBpZiAobV9wT2JqZWN0LT5tX1JlZkNvdW50ID4gMSkgeworICAgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50LS07CisgICAgICBDb3VudGVkT2JqKiBwT2xkT2JqZWN0ID0gbV9wT2JqZWN0OworICAgICAgbV9wT2JqZWN0ID0gTlVMTDsKKyAgICAgIG1fcE9iamVjdCA9IEZYX05FVyBDb3VudGVkT2JqKCpwT2xkT2JqZWN0KTsKKyAgICAgIGlmIChtX3BPYmplY3QpIHsKKyAgICAgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50ID0gMTsKKyAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIG1fcE9iamVjdDsKKyAgfQogCi0gICAgdm9pZAkJCQlvcGVyYXRvciA9IChjb25zdCBSZWYmIHJlZikKLSAgICB7Ci0gICAgICAgIGlmIChyZWYubV9wT2JqZWN0KSB7Ci0gICAgICAgICAgICByZWYubV9wT2JqZWN0LT5tX1JlZkNvdW50ICsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BPYmplY3QpIHsKLSAgICAgICAgICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudCAtLTsKLSAgICAgICAgICAgIGlmIChtX3BPYmplY3QtPm1fUmVmQ291bnQgPD0gMCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBtX3BPYmplY3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9wT2JqZWN0ID0gcmVmLm1fcE9iamVjdDsKKyAgdm9pZCBTZXROdWxsKCkgeworICAgIGlmIChtX3BPYmplY3QgPT0gTlVMTCkgeworICAgICAgcmV0dXJuOwogICAgIH0KLQotICAgIHZvaWQJCQkJb3BlcmF0b3IgPSAodm9pZCogcCkKLSAgICB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChwID09IDApOwotICAgICAgICBpZiAobV9wT2JqZWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtX3BPYmplY3QtPm1fUmVmQ291bnQgLS07Ci0gICAgICAgIGlmIChtX3BPYmplY3QtPm1fUmVmQ291bnQgPD0gMCkgewotICAgICAgICAgICAgZGVsZXRlIG1fcE9iamVjdDsKLSAgICAgICAgfQotICAgICAgICBtX3BPYmplY3QgPSBOVUxMOworICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudC0tOworICAgIGlmIChtX3BPYmplY3QtPm1fUmVmQ291bnQgPD0gMCkgeworICAgICAgZGVsZXRlIG1fcE9iamVjdDsKICAgICB9CisgICAgbV9wT2JqZWN0ID0gTlVMTDsKKyAgfQogCi0gICAgY29uc3QgT2JqQ2xhc3MqCQlHZXRPYmplY3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdDsKLSAgICB9CisgIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBSZWYmIHJlZikgY29uc3QgeworICAgIHJldHVybiBtX3BPYmplY3QgPT0gcmVmLm1fcE9iamVjdDsKKyAgfQogCi0gICAgb3BlcmF0b3IJCQljb25zdCBPYmpDbGFzcyooKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdDsKLSAgICB9Ci0KLSAgICBGWF9CT09MCQkJCUlzTnVsbCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID09IE5VTEw7Ci0gICAgfQotCi0gICAgRlhfQk9PTAkJCQlOb3ROdWxsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QgIT0gTlVMTDsKLSAgICB9Ci0KLSAgICBPYmpDbGFzcyoJCQlHZXRNb2RpZnkoKQotICAgIHsKLSAgICAgICAgaWYgKG1fcE9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtX3BPYmplY3QgPSBGWF9ORVcgQ291bnRlZE9iajsKLSAgICAgICAgICAgIGlmIChtX3BPYmplY3QpIHsKLSAgICAgICAgICAgICAgICBtX3BPYmplY3QtPm1fUmVmQ291bnQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1fcE9iamVjdC0+bV9SZWZDb3VudCA+IDEpIHsKLSAgICAgICAgICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudCAtLTsKLSAgICAgICAgICAgIENvdW50ZWRPYmoqIHBPbGRPYmplY3QgPSBtX3BPYmplY3Q7Ci0gICAgICAgICAgICBtX3BPYmplY3QgPSBOVUxMOwotICAgICAgICAgICAgbV9wT2JqZWN0ID0gRlhfTkVXIENvdW50ZWRPYmooKnBPbGRPYmplY3QpOwotICAgICAgICAgICAgaWYgKG1fcE9iamVjdCkgewotICAgICAgICAgICAgICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdDsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCVNldE51bGwoKQotICAgIHsKLSAgICAgICAgaWYgKG1fcE9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50IC0tOwotICAgICAgICBpZiAobV9wT2JqZWN0LT5tX1JlZkNvdW50IDw9IDApIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BPYmplY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wT2JqZWN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBGWF9CT09MCQkJCW9wZXJhdG9yID09IChjb25zdCBSZWYmIHJlZikgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QgPT0gcmVmLm1fcE9iamVjdDsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBDb3VudGVkT2JqKgkJCW1fcE9iamVjdDsKKyBwcm90ZWN0ZWQ6CisgIENvdW50ZWRPYmoqIG1fcE9iamVjdDsKIH07Ci1jbGFzcyBJRlhfUGF1c2UKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JRlhfUGF1c2UoKSB7IH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJTmVlZFRvUGF1c2VOb3coKSA9IDA7CitjbGFzcyBJRlhfUGF1c2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX1BhdXNlKCkge30KKyAgdmlydHVhbCBGWF9CT09MIE5lZWRUb1BhdXNlTm93KCkgPSAwOwogfTsKLWNsYXNzIENGWF9EYXRhRmlsdGVyCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfRGF0YUZpbHRlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5DRlhfRGF0YUZpbHRlcigpOwogCi0gICAgdmlydHVhbCB+Q0ZYX0RhdGFGaWx0ZXIoKTsKKyAgdm9pZCBTZXREZXN0RmlsdGVyKENGWF9EYXRhRmlsdGVyKiBwRmlsdGVyKTsKIAotICAgIHZvaWQJCQlTZXREZXN0RmlsdGVyKENGWF9EYXRhRmlsdGVyKiBwRmlsdGVyKTsKKyAgRlhfQk9PTCBJc0VPRigpIGNvbnN0IHsgcmV0dXJuIG1fYkVPRjsgfQogCi0gICAgRlhfQk9PTAkJCUlzRU9GKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JFT0Y7Ci0gICAgfQorICBGWF9EV09SRCBHZXRTcmNQb3MoKSB7IHJldHVybiBtX1NyY1BvczsgfQogCi0gICAgRlhfRFdPUkQJCUdldFNyY1BvcygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9TcmNQb3M7Ci0gICAgfQorICB2b2lkIEZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwogCi0gICAgdm9pZAkJCUZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIHZvaWQgRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKIAotICAgIHZvaWQJCQlGaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgQ0ZYX0RhdGFGaWx0ZXIoKTsKKyAgdmlydHVhbCB2b2lkIHZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgPSAwOworICB2b2lkIFJlcG9ydEVPRihGWF9EV09SRCBsZWZ0X2lucHV0KTsKIAotICAgIENGWF9EYXRhRmlsdGVyKCk7Ci0gICAgdmlydHVhbCB2b2lkCXZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7Ci0gICAgdm9pZAkJCVJlcG9ydEVPRihGWF9EV09SRCBsZWZ0X2lucHV0KTsKKyAgRlhfQk9PTCBtX2JFT0Y7CiAKLSAgICBGWF9CT09MCQkJbV9iRU9GOworICBGWF9EV09SRCBtX1NyY1BvczsKIAotICAgIEZYX0RXT1JECQltX1NyY1BvczsKLQotICAgIENGWF9EYXRhRmlsdGVyKgltX3BEZXN0RmlsdGVyOworICBDRlhfRGF0YUZpbHRlciogbV9wRGVzdEZpbHRlcjsKIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIGNsYXNzIENGWF9BdXRvUmVzdG9yZXIgewotcHVibGljOgotICAgIGV4cGxpY2l0IENGWF9BdXRvUmVzdG9yZXIoVCogbG9jYXRpb24pIHsKLSAgICAgIG1fTG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICAgIG1fT2xkVmFsdWUgPSAqbG9jYXRpb247Ci0gICAgfQotICAgIH5DRlhfQXV0b1Jlc3RvcmVyKCkgeyAqbV9Mb2NhdGlvbiA9IG1fT2xkVmFsdWU7IH0KKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWF9BdXRvUmVzdG9yZXIoVCogbG9jYXRpb24pIHsKKyAgICBtX0xvY2F0aW9uID0gbG9jYXRpb247CisgICAgbV9PbGRWYWx1ZSA9ICpsb2NhdGlvbjsKKyAgfQorICB+Q0ZYX0F1dG9SZXN0b3JlcigpIHsgKm1fTG9jYXRpb24gPSBtX09sZFZhbHVlOyB9CiAKLXByaXZhdGU6CisgcHJpdmF0ZToKICAgVCogbV9Mb2NhdGlvbjsKICAgVCBtX09sZFZhbHVlOwogfTsKIAogdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jbGFzcyBDRlhfU21hcnRQb2ludGVyCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX1NtYXJ0UG9pbnRlcihUICpwT2JqKSA6IG1fcE9iaihwT2JqKSB7fQotICAgIH5DRlhfU21hcnRQb2ludGVyKCkKLSAgICB7Ci0gICAgICAgIG1fcE9iai0+UmVsZWFzZSgpOwotICAgIH0KLSAgICBUKiBHZXQodm9pZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmo7Ci0gICAgfQotICAgIFQmCQlvcGVyYXRvciAqKHZvaWQpCi0gICAgewotICAgICAgICByZXR1cm4gKm1fcE9iajsKLSAgICB9Ci0gICAgVCoJCW9wZXJhdG9yIC0+KHZvaWQpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqOwotICAgIH0KLXByb3RlY3RlZDoKLSAgICBUICptX3BPYmo7CitjbGFzcyBDRlhfU21hcnRQb2ludGVyIHsKKyBwdWJsaWM6CisgIENGWF9TbWFydFBvaW50ZXIoVCogcE9iaikgOiBtX3BPYmoocE9iaikge30KKyAgfkNGWF9TbWFydFBvaW50ZXIoKSB7IG1fcE9iai0+UmVsZWFzZSgpOyB9CisgIFQqIEdldCh2b2lkKSB7IHJldHVybiBtX3BPYmo7IH0KKyAgVCYgb3BlcmF0b3IqKHZvaWQpIHsgcmV0dXJuICptX3BPYmo7IH0KKyAgVCogb3BlcmF0b3ItPih2b2lkKSB7IHJldHVybiBtX3BPYmo7IH0KKworIHByb3RlY3RlZDoKKyAgVCogbV9wT2JqOwogfTsKLSNkZWZpbmUgRlhfREFUQUxJU1RfTEVOR1RICTEwMjQKLXRlbXBsYXRlPHNpemVfdCB1bml0PgotY2xhc3MgQ0ZYX1NvcnRMaXN0QXJyYXkKLXsKLXByb3RlY3RlZDoKKyNkZWZpbmUgRlhfREFUQUxJU1RfTEVOR1RIIDEwMjQKK3RlbXBsYXRlIDxzaXplX3QgdW5pdD4KK2NsYXNzIENGWF9Tb3J0TGlzdEFycmF5IHsKKyBwcm90ZWN0ZWQ6CisgIHN0cnVjdCBEYXRhTGlzdCB7CisgICAgaW50MzJfdCBzdGFydDsKIAotICAgIHN0cnVjdCBEYXRhTGlzdCB7CisgICAgaW50MzJfdCBjb3VudDsKKyAgICB1aW50OF90KiBkYXRhOworICB9OwogCi0gICAgICAgIGludDMyX3QJc3RhcnQ7CisgcHVibGljOgorICBDRlhfU29ydExpc3RBcnJheSgpIDogbV9DdXJMaXN0KDApIHt9CiAKLSAgICAgICAgaW50MzJfdAljb3VudDsKLSAgICAgICAgdWludDhfdCoJZGF0YTsKLSAgICB9OwotcHVibGljOgorICB+Q0ZYX1NvcnRMaXN0QXJyYXkoKSB7IENsZWFyKCk7IH0KIAotICAgIENGWF9Tb3J0TGlzdEFycmF5KCkgOiBtX0N1ckxpc3QoMCkge30KLQotICAgIH5DRlhfU29ydExpc3RBcnJheSgpCi0gICAgewotICAgICAgICBDbGVhcigpOworICB2b2lkIENsZWFyKCkgeworICAgIGZvciAoaW50MzJfdCBpID0gbV9EYXRhTGlzdHMuR2V0VXBwZXJCb3VuZCgpOyBpID49IDA7IGktLSkgeworICAgICAgRGF0YUxpc3QgbGlzdCA9IG1fRGF0YUxpc3RzLkVsZW1lbnRBdChpKTsKKyAgICAgIGlmIChsaXN0LmRhdGEpIHsKKyAgICAgICAgRlhfRnJlZShsaXN0LmRhdGEpOworICAgICAgfQogICAgIH0KKyAgICBtX0RhdGFMaXN0cy5SZW1vdmVBbGwoKTsKKyAgICBtX0N1ckxpc3QgPSAwOworICB9CiAKKyAgdm9pZCBBcHBlbmQoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSB7CisgICAgaWYgKG5TdGFydCA8IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hpbGUgKG5Db3VudCA+IDApIHsKKyAgICAgIGludDMyX3QgdGVtcF9jb3VudCA9IEZYX01JTihuQ291bnQsIEZYX0RBVEFMSVNUX0xFTkdUSCk7CisgICAgICBEYXRhTGlzdCBsaXN0OworICAgICAgbGlzdC5kYXRhID0gRlhfQWxsb2MyRCh1aW50OF90LCB0ZW1wX2NvdW50LCB1bml0KTsKKyAgICAgIGxpc3Quc3RhcnQgPSBuU3RhcnQ7CisgICAgICBsaXN0LmNvdW50ID0gdGVtcF9jb3VudDsKKyAgICAgIEFwcGVuZChsaXN0KTsKKyAgICAgIG5Db3VudCAtPSB0ZW1wX2NvdW50OworICAgICAgblN0YXJ0ICs9IHRlbXBfY291bnQ7CisgICAgfQorICB9CiAKLSAgICB2b2lkCQkJQ2xlYXIoKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSBtX0RhdGFMaXN0cy5HZXRVcHBlckJvdW5kKCk7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBEYXRhTGlzdCBsaXN0ID0gbV9EYXRhTGlzdHMuRWxlbWVudEF0KGkpOwotICAgICAgICAgICAgaWYgKGxpc3QuZGF0YSkgewotICAgICAgICAgICAgICAgIEZYX0ZyZWUobGlzdC5kYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX0RhdGFMaXN0cy5SZW1vdmVBbGwoKTsKLSAgICAgICAgbV9DdXJMaXN0ID0gMDsKKyAgdWludDhfdCogR2V0QXQoaW50MzJfdCBuSW5kZXgpIHsKKyAgICBpZiAobkluZGV4IDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICAgIGlmIChtX0N1ckxpc3QgPCAwIHx8IG1fQ3VyTGlzdCA+PSBtX0RhdGFMaXN0cy5HZXRTaXplKCkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBEYXRhTGlzdCogcEN1ckxpc3QgPSBtX0RhdGFMaXN0cy5HZXREYXRhUHRyKG1fQ3VyTGlzdCk7CisgICAgaWYgKCFwQ3VyTGlzdCB8fCBuSW5kZXggPCBwQ3VyTGlzdC0+c3RhcnQgfHwKKyAgICAgICAgbkluZGV4ID49IHBDdXJMaXN0LT5zdGFydCArIHBDdXJMaXN0LT5jb3VudCkgeworICAgICAgcEN1ckxpc3QgPSBOVUxMOworICAgICAgaW50MzJfdCBpU3RhcnQgPSAwOworICAgICAgaW50MzJfdCBpRW5kID0gbV9EYXRhTGlzdHMuR2V0VXBwZXJCb3VuZCgpOworICAgICAgaW50MzJfdCBpTWlkID0gMDsKKyAgICAgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgeworICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKKyAgICAgICAgRGF0YUxpc3QqIGxpc3QgPSBtX0RhdGFMaXN0cy5HZXREYXRhUHRyKGlNaWQpOworICAgICAgICBpZiAobkluZGV4IDwgbGlzdC0+c3RhcnQpIHsKKyAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7CisgICAgICAgIH0gZWxzZSBpZiAobkluZGV4ID49IGxpc3QtPnN0YXJ0ICsgbGlzdC0+Y291bnQpIHsKKyAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwQ3VyTGlzdCA9IGxpc3Q7CisgICAgICAgICAgbV9DdXJMaXN0ID0gaU1pZDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcEN1ckxpc3QgPyBwQ3VyTGlzdC0+ZGF0YSArIChuSW5kZXggLSBwQ3VyTGlzdC0+c3RhcnQpICogdW5pdCA6IE5VTEw7CisgIH0KIAotICAgIHZvaWQJCQlBcHBlbmQoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KQotICAgIHsKLSAgICAgICAgaWYgKG5TdGFydCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgQXBwZW5kKGNvbnN0IERhdGFMaXN0JiBsaXN0KSB7CisgICAgaW50MzJfdCBpU3RhcnQgPSAwOworICAgIGludDMyX3QgaUVuZCA9IG1fRGF0YUxpc3RzLkdldFVwcGVyQm91bmQoKTsKKyAgICBpbnQzMl90IGlGaW5kID0gMDsKKyAgICB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpIHsKKyAgICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7CisgICAgICBEYXRhTGlzdCogY3VyX2xpc3QgPSBtX0RhdGFMaXN0cy5HZXREYXRhUHRyKGlNaWQpOworICAgICAgaWYgKGxpc3Quc3RhcnQgPCBjdXJfbGlzdC0+c3RhcnQgKyBjdXJfbGlzdC0+Y291bnQpIHsKKyAgICAgICAgaUVuZCA9IGlNaWQgLSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlNaWQgPT0gaUVuZCkgeworICAgICAgICAgIGlGaW5kID0gaU1pZCArIDE7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKG5Db3VudCA+IDApIHsKLSAgICAgICAgICAgIGludDMyX3QgdGVtcF9jb3VudCA9IEZYX01JTihuQ291bnQsIEZYX0RBVEFMSVNUX0xFTkdUSCk7Ci0gICAgICAgICAgICBEYXRhTGlzdCBsaXN0OwotICAgICAgICAgICAgbGlzdC5kYXRhID0gRlhfQWxsb2MyRCh1aW50OF90LCB0ZW1wX2NvdW50LCB1bml0KTsKLSAgICAgICAgICAgIGxpc3Quc3RhcnQgPSBuU3RhcnQ7Ci0gICAgICAgICAgICBsaXN0LmNvdW50ID0gdGVtcF9jb3VudDsKLSAgICAgICAgICAgIEFwcGVuZChsaXN0KTsKLSAgICAgICAgICAgIG5Db3VudCAtPSB0ZW1wX2NvdW50OwotICAgICAgICAgICAgblN0YXJ0ICs9IHRlbXBfY291bnQ7CisgICAgICAgIERhdGFMaXN0KiBuZXh0X2xpc3QgPSBtX0RhdGFMaXN0cy5HZXREYXRhUHRyKGlNaWQgKyAxKTsKKyAgICAgICAgaWYgKGxpc3Quc3RhcnQgPCBuZXh0X2xpc3QtPnN0YXJ0KSB7CisgICAgICAgICAgaUZpbmQgPSBpTWlkICsgMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLQotICAgIHVpbnQ4X3QqCQlHZXRBdChpbnQzMl90IG5JbmRleCkKLSAgICB7Ci0gICAgICAgIGlmIChuSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9DdXJMaXN0IDwgMCB8fCBtX0N1ckxpc3QgPj0gbV9EYXRhTGlzdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBEYXRhTGlzdCAqcEN1ckxpc3QgPSBtX0RhdGFMaXN0cy5HZXREYXRhUHRyKG1fQ3VyTGlzdCk7Ci0gICAgICAgIGlmICghcEN1ckxpc3QgfHwgbkluZGV4IDwgcEN1ckxpc3QtPnN0YXJ0IHx8IG5JbmRleCA+PSBwQ3VyTGlzdC0+c3RhcnQgKyBwQ3VyTGlzdC0+Y291bnQpIHsKLSAgICAgICAgICAgIHBDdXJMaXN0ID0gTlVMTDsKLSAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMDsKLSAgICAgICAgICAgIGludDMyX3QgaUVuZCA9IG1fRGF0YUxpc3RzLkdldFVwcGVyQm91bmQoKTsKLSAgICAgICAgICAgIGludDMyX3QgaU1pZCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpIHsKLSAgICAgICAgICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKLSAgICAgICAgICAgICAgICBEYXRhTGlzdCogbGlzdCA9IG1fRGF0YUxpc3RzLkdldERhdGFQdHIoaU1pZCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5JbmRleCA8IGxpc3QtPnN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5JbmRleCA+PSBsaXN0LT5zdGFydCArIGxpc3QtPmNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDdXJMaXN0ID0gbGlzdDsKLSAgICAgICAgICAgICAgICAgICAgbV9DdXJMaXN0ID0gaU1pZDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwQ3VyTGlzdCA/IHBDdXJMaXN0LT5kYXRhICsgKG5JbmRleCAtIHBDdXJMaXN0LT5zdGFydCkgKiB1bml0IDogTlVMTDsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgdm9pZAkJCUFwcGVuZChjb25zdCBEYXRhTGlzdCYgbGlzdCkKLSAgICB7Ci0gICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMDsKLSAgICAgICAgaW50MzJfdCBpRW5kID0gbV9EYXRhTGlzdHMuR2V0VXBwZXJCb3VuZCgpOwotICAgICAgICBpbnQzMl90IGlGaW5kID0gMDsKLSAgICAgICAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7Ci0gICAgICAgICAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgICAgICAgICAgRGF0YUxpc3QqIGN1cl9saXN0ID0gbV9EYXRhTGlzdHMuR2V0RGF0YVB0cihpTWlkKTsKLSAgICAgICAgICAgIGlmIChsaXN0LnN0YXJ0IDwgY3VyX2xpc3QtPnN0YXJ0ICsgY3VyX2xpc3QtPmNvdW50KSB7Ci0gICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaU1pZCA9PSBpRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlGaW5kID0gaU1pZCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEYXRhTGlzdCogbmV4dF9saXN0ID0gbV9EYXRhTGlzdHMuR2V0RGF0YVB0cihpTWlkICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpc3Quc3RhcnQgPCBuZXh0X2xpc3QtPnN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlGaW5kID0gaU1pZCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX0RhdGFMaXN0cy5JbnNlcnRBdChpRmluZCwgbGlzdCk7Ci0gICAgfQotICAgIGludDMyX3QJCW1fQ3VyTGlzdDsKLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxEYXRhTGlzdD4JbV9EYXRhTGlzdHM7CisgICAgbV9EYXRhTGlzdHMuSW5zZXJ0QXQoaUZpbmQsIGxpc3QpOworICB9CisgIGludDMyX3QgbV9DdXJMaXN0OworICBDRlhfQXJyYXlUZW1wbGF0ZTxEYXRhTGlzdD4gbV9EYXRhTGlzdHM7CiB9OwotdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotY2xhc3MgQ0ZYX0xpc3RBcnJheVRlbXBsYXRlCi17Ci1wdWJsaWM6Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorY2xhc3MgQ0ZYX0xpc3RBcnJheVRlbXBsYXRlIHsKKyBwdWJsaWM6CisgIHZvaWQgQ2xlYXIoKSB7IG1fRGF0YS5DbGVhcigpOyB9CiAKLSAgICB2b2lkCQkJQ2xlYXIoKQotICAgIHsKLSAgICAgICAgbV9EYXRhLkNsZWFyKCk7Ci0gICAgfQorICB2b2lkIEFkZChpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIHsgbV9EYXRhLkFwcGVuZChuU3RhcnQsIG5Db3VudCk7IH0KIAotICAgIHZvaWQJCQlBZGQoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KQotICAgIHsKLSAgICAgICAgbV9EYXRhLkFwcGVuZChuU3RhcnQsIG5Db3VudCk7Ci0gICAgfQorICBUMiYgb3BlcmF0b3JbXShpbnQzMl90IG5JbmRleCkgeworICAgIHVpbnQ4X3QqIGRhdGEgPSBtX0RhdGEuR2V0QXQobkluZGV4KTsKKyAgICBGWFNZU19hc3NlcnQoZGF0YSAhPSBOVUxMKTsKKyAgICByZXR1cm4gKFQyJikoKih2b2xhdGlsZSBUMiopZGF0YSk7CisgIH0KIAotICAgIFQyJgkJCQlvcGVyYXRvciBbXSAoaW50MzJfdCBuSW5kZXgpCi0gICAgewotICAgICAgICB1aW50OF90KiBkYXRhID0gbV9EYXRhLkdldEF0KG5JbmRleCk7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChkYXRhICE9IE5VTEwpOwotICAgICAgICByZXR1cm4gKFQyJikoKih2b2xhdGlsZSBUMiopZGF0YSk7Ci0gICAgfQorICBUMiogR2V0UHRyQXQoaW50MzJfdCBuSW5kZXgpIHsgcmV0dXJuIChUMiopbV9EYXRhLkdldEF0KG5JbmRleCk7IH0KIAotICAgIFQyKgkJCQlHZXRQdHJBdChpbnQzMl90IG5JbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVDIqKW1fRGF0YS5HZXRBdChuSW5kZXgpOwotICAgIH0KLXByb3RlY3RlZDoKLSAgICBUMQkJCW1fRGF0YTsKKyBwcm90ZWN0ZWQ6CisgIFQxIG1fRGF0YTsKIH07Ci10eXBlZGVmIENGWF9MaXN0QXJyYXlUZW1wbGF0ZTxDRlhfU29ydExpc3RBcnJheTxzaXplb2YoRlhfRklMRVNJWkUpPiwgRlhfRklMRVNJWkU+CUNGWF9GaWxlU2l6ZUxpc3RBcnJheTsKLXR5cGVkZWYgQ0ZYX0xpc3RBcnJheVRlbXBsYXRlPENGWF9Tb3J0TGlzdEFycmF5PHNpemVvZihGWF9EV09SRCk+LCBGWF9EV09SRD4JCUNGWF9EV29yZExpc3RBcnJheTsKK3R5cGVkZWYgQ0ZYX0xpc3RBcnJheVRlbXBsYXRlPENGWF9Tb3J0TGlzdEFycmF5PHNpemVvZihGWF9GSUxFU0laRSk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkU+IENGWF9GaWxlU2l6ZUxpc3RBcnJheTsKK3R5cGVkZWYgQ0ZYX0xpc3RBcnJheVRlbXBsYXRlPENGWF9Tb3J0TGlzdEFycmF5PHNpemVvZihGWF9EV09SRCk+LCBGWF9EV09SRD4KKyAgICBDRlhfRFdvcmRMaXN0QXJyYXk7CiB0eXBlZGVmIGVudW0gewotICAgIFJlYWR5LAotICAgIFRvQmVDb250aW51ZWQsCi0gICAgRm91bmQsCi0gICAgTm90Rm91bmQsCi0gICAgRmFpbGVkLAotICAgIERvbmUKKyAgUmVhZHksCisgIFRvQmVDb250aW51ZWQsCisgIEZvdW5kLAorICBOb3RGb3VuZCwKKyAgRmFpbGVkLAorICBEb25lCiB9IEZYX1Byb2dyZXNzaXZlU3RhdHVzOwotI2RlZmluZSBQcm9ncmVzc2l2ZVN0YXR1cwlGWF9Qcm9ncmVzc2l2ZVN0YXR1cwotI2RlZmluZSBGWF9OQU1FU1BBQ0VfREVDTEFSRShuYW1lc3BhY2UsIHR5cGUpICAgICAgIG5hbWVzcGFjZTo6dHlwZQotY2xhc3MgSUZYX1Vua25vd24KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JRlhfVW5rbm93bigpIHt9Ci0gICAgdmlydHVhbCBGWF9EV09SRAlSZWxlYXNlKCkgPSAwOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJQWRkUmVmKCkgPSAwOworI2RlZmluZSBQcm9ncmVzc2l2ZVN0YXR1cyBGWF9Qcm9ncmVzc2l2ZVN0YXR1cworI2RlZmluZSBGWF9OQU1FU1BBQ0VfREVDTEFSRShuYW1lc3BhY2UsIHR5cGUpIG5hbWVzcGFjZSA6OnR5cGUKK2NsYXNzIElGWF9Vbmtub3duIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGWF9Vbmtub3duKCkge30KKyAgdmlydHVhbCBGWF9EV09SRCBSZWxlYXNlKCkgPSAwOworICB2aXJ0dWFsIEZYX0RXT1JEIEFkZFJlZigpID0gMDsKIH07Ci0jZGVmaW5lIEZYX0lzT2RkKGEpCSgoYSkgJiAxKQorI2RlZmluZSBGWF9Jc09kZChhKSAoKGEpJjEpCiAKLWNsYXNzIENGWF9WZWN0b3JfM2J5MQotewotcHVibGljOgorY2xhc3MgQ0ZYX1ZlY3Rvcl8zYnkxIHsKKyBwdWJsaWM6CisgIENGWF9WZWN0b3JfM2J5MSgpIDogYSgwLjBmKSwgYigwLjBmKSwgYygwLjBmKSB7fQogCi0gICAgQ0ZYX1ZlY3Rvcl8zYnkxKCkgOgotICAgICAgICBhKDAuMGYpLCBiKDAuMGYpLCBjKDAuMGYpCi0gICAge30KKyAgQ0ZYX1ZlY3Rvcl8zYnkxKEZYX0ZMT0FUIGExLCBGWF9GTE9BVCBiMSwgRlhfRkxPQVQgYzEpCisgICAgICA6IGEoYTEpLCBiKGIxKSwgYyhjMSkge30KIAotICAgIENGWF9WZWN0b3JfM2J5MShGWF9GTE9BVCBhMSwgRlhfRkxPQVQgYjEsIEZYX0ZMT0FUIGMxKToKLSAgICAgICAgYShhMSksIGIoYjEpLCBjKGMxKQotICAgIHt9Ci0KLSAgICBGWF9GTE9BVCBhOwotICAgIEZYX0ZMT0FUIGI7Ci0gICAgRlhfRkxPQVQgYzsKKyAgRlhfRkxPQVQgYTsKKyAgRlhfRkxPQVQgYjsKKyAgRlhfRkxPQVQgYzsKIH07Ci1jbGFzcyBDRlhfTWF0cml4XzNieTMKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9NYXRyaXhfM2J5MyB7CisgcHVibGljOgorICBDRlhfTWF0cml4XzNieTMoKQorICAgICAgOiBhKDAuMGYpLAorICAgICAgICBiKDAuMGYpLAorICAgICAgICBjKDAuMGYpLAorICAgICAgICBkKDAuMGYpLAorICAgICAgICBlKDAuMGYpLAorICAgICAgICBmKDAuMGYpLAorICAgICAgICBnKDAuMGYpLAorICAgICAgICBoKDAuMGYpLAorICAgICAgICBpKDAuMGYpIHt9CiAKLSAgICBDRlhfTWF0cml4XzNieTMoKToKLSAgICAgICAgYSgwLjBmKSwgYigwLjBmKSwgYygwLjBmKSwgZCgwLjBmKSwgZSgwLjBmKSwgZigwLjBmKSwgZygwLjBmKSwgaCgwLjBmKSwgaSgwLjBmKQotICAgIHt9CisgIENGWF9NYXRyaXhfM2J5MyhGWF9GTE9BVCBhMSwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGIxLAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYzEsCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkMSwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGUxLAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZjEsCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBnMSwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGgxLAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaTEpCisgICAgICA6IGEoYTEpLCBiKGIxKSwgYyhjMSksIGQoZDEpLCBlKGUxKSwgZihmMSksIGcoZzEpLCBoKGgxKSwgaShpMSkge30KIAotICAgIENGWF9NYXRyaXhfM2J5MyhGWF9GTE9BVCBhMSwgRlhfRkxPQVQgYjEsIEZYX0ZMT0FUIGMxLCBGWF9GTE9BVCBkMSwgRlhfRkxPQVQgZTEsIEZYX0ZMT0FUIGYxLCBGWF9GTE9BVCBnMSwgRlhfRkxPQVQgaDEsIEZYX0ZMT0FUIGkxKSA6Ci0gICAgICAgIGEoYTEpLCBiKGIxKSwgYyhjMSksIGQoZDEpLCBlKGUxKSwgZihmMSksIGcoZzEpLCBoKGgxKSwgaShpMSkKLSAgICB7fQorICBDRlhfTWF0cml4XzNieTMgSW52ZXJzZSgpOwogCi0gICAgQ0ZYX01hdHJpeF8zYnkzIEludmVyc2UoKTsKKyAgQ0ZYX01hdHJpeF8zYnkzIE11bHRpcGx5KGNvbnN0IENGWF9NYXRyaXhfM2J5MyYgbSk7CiAKLSAgICBDRlhfTWF0cml4XzNieTMgTXVsdGlwbHkoY29uc3QgQ0ZYX01hdHJpeF8zYnkzICZtKTsKKyAgQ0ZYX1ZlY3Rvcl8zYnkxIFRyYW5zZm9ybVZlY3Rvcihjb25zdCBDRlhfVmVjdG9yXzNieTEmIHYpOwogCi0gICAgQ0ZYX1ZlY3Rvcl8zYnkxIFRyYW5zZm9ybVZlY3Rvcihjb25zdCBDRlhfVmVjdG9yXzNieTEgJnYpOwotCi0gICAgRlhfRkxPQVQgYTsKLSAgICBGWF9GTE9BVCBiOwotICAgIEZYX0ZMT0FUIGM7Ci0gICAgRlhfRkxPQVQgZDsKLSAgICBGWF9GTE9BVCBlOwotICAgIEZYX0ZMT0FUIGY7Ci0gICAgRlhfRkxPQVQgZzsKLSAgICBGWF9GTE9BVCBoOwotICAgIEZYX0ZMT0FUIGk7CisgIEZYX0ZMT0FUIGE7CisgIEZYX0ZMT0FUIGI7CisgIEZYX0ZMT0FUIGM7CisgIEZYX0ZMT0FUIGQ7CisgIEZYX0ZMT0FUIGU7CisgIEZYX0ZMT0FUIGY7CisgIEZYX0ZMT0FUIGc7CisgIEZYX0ZMT0FUIGg7CisgIEZYX0ZMT0FUIGk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9CQVNJQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaAppbmRleCAzNjg5YTRiLi5kZGQwZjU3IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaApAQCAtOSw5MDUgKzksNzQ0IEBACiAKICNpbmNsdWRlICJmeF9iYXNpYy5oIgogCi10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX1BTVlRlbXBsYXRlOwotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+IGNsYXNzIENGWF9WVGVtcGxhdGU7Ci10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX1BSTFRlbXBsYXRlOwotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+IGNsYXNzIENGWF9SVGVtcGxhdGU7Ci10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX0VUZW1wbGF0ZTsKLXRlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPiBjbGFzcyBDRlhfQVRlbXBsYXRlOwotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+IGNsYXNzIENGWF9SUlRlbXBsYXRlOwordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgorY2xhc3MgQ0ZYX1BTVlRlbXBsYXRlOwordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgorY2xhc3MgQ0ZYX1ZUZW1wbGF0ZTsKK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4KK2NsYXNzIENGWF9QUkxUZW1wbGF0ZTsKK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4KK2NsYXNzIENGWF9SVGVtcGxhdGU7Cit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+CitjbGFzcyBDRlhfRVRlbXBsYXRlOwordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgorY2xhc3MgQ0ZYX0FUZW1wbGF0ZTsKK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4KK2NsYXNzIENGWF9SUlRlbXBsYXRlOwogY2xhc3MgQ0ZYX01hdHJpeDsKLXRlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPgotY2xhc3MgQ0ZYX1BTVlRlbXBsYXRlCi17Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8YmFzZVR5cGU+CUZYVF9QU1Y7Ci0gICAgdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8YmFzZVR5cGU+CUZYVF9QT0lOVDsKLSAgICB0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4JRlhUX1NJWkU7Ci0gICAgdm9pZAkJU2V0KGJhc2VUeXBlIHgsIGJhc2VUeXBlIHkpCi0gICAgewotICAgICAgICBGWFRfUFNWOjp4ID0geCwgRlhUX1BTVjo6eSA9IHk7Ci0gICAgfQotICAgIHZvaWQJCVNldChjb25zdCBGWFRfUFNWICZwc3YpCi0gICAgewotICAgICAgICBGWFRfUFNWOjp4ID0gcHN2LngsIEZYVF9QU1Y6OnkgPSBwc3YueTsKLSAgICB9Ci0gICAgdm9pZAkJQWRkKGJhc2VUeXBlIHgsIGJhc2VUeXBlIHkpCi0gICAgewotICAgICAgICBGWFRfUFNWOjp4ICs9IHgsIEZYVF9QU1Y6OnkgKz0geTsKLSAgICB9Ci0gICAgdm9pZAkJU3VidHJhY3QoYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkKLSAgICB7Ci0gICAgICAgIEZYVF9QU1Y6OnggLT0geCwgRlhUX1BTVjo6eSAtPSB5OwotICAgIH0KLSAgICB2b2lkCQlSZXNldCgpCi0gICAgewotICAgICAgICBGWFRfUFNWOjp4ID0gRlhUX1BTVjo6eSA9IDA7Ci0gICAgfQotICAgIEZYVF9QU1YmCW9wZXJhdG9yICs9IChjb25zdCBGWFRfUFNWICZvYmopCi0gICAgewotICAgICAgICB4ICs9IG9iai54OwotICAgICAgICB5ICs9IG9iai55OwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIEZYVF9QU1YmCW9wZXJhdG9yIC09IChjb25zdCBGWFRfUFNWICZvYmopCi0gICAgewotICAgICAgICB4IC09IG9iai54OwotICAgICAgICB5IC09IG9iai55OwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIEZYVF9QU1YmCW9wZXJhdG9yICo9IChiYXNlVHlwZSBsYW1kYSkKLSAgICB7Ci0gICAgICAgIHggKj0gbGFtZGE7Ci0gICAgICAgIHkgKj0gbGFtZGE7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgRlhUX1BTViYJb3BlcmF0b3IgLz0gKGJhc2VUeXBlIGxhbWRhKQotICAgIHsKLSAgICAgICAgeCAvPSBsYW1kYTsKLSAgICAgICAgeSAvPSBsYW1kYTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBmcmllbmQJRlhfQk9PTAkJb3BlcmF0b3IgPT0gKGNvbnN0IEZYVF9QU1YgJm9iajEsIGNvbnN0IEZYVF9QU1YgJm9iajIpCi0gICAgewotICAgICAgICByZXR1cm4gb2JqMS54ID09IG9iajIueCAmJiBvYmoxLnkgPT0gb2JqMi55OwotICAgIH0KLSAgICBmcmllbmQJRlhfQk9PTAkJb3BlcmF0b3IgIT0gKGNvbnN0IEZYVF9QU1YgJm9iajEsIGNvbnN0IEZYVF9QU1YgJm9iajIpCi0gICAgewotICAgICAgICByZXR1cm4gb2JqMS54ICE9IG9iajIueCB8fCBvYmoxLnkgIT0gb2JqMi55OwotICAgIH0KLSAgICBmcmllbmQJRlhUX1BTVgkJb3BlcmF0b3IgKyAoY29uc3QgRlhUX1BTViAmb2JqMSwgY29uc3QgRlhUX1BTViAmb2JqMikKLSAgICB7Ci0gICAgICAgIENGWF9QU1ZUZW1wbGF0ZSBvYmo7Ci0gICAgICAgIG9iai54ID0gb2JqMS54ICsgb2JqMi54OwotICAgICAgICBvYmoueSA9IG9iajEueSArIG9iajIueTsKLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0gICAgZnJpZW5kCUZYVF9QU1YJCW9wZXJhdG9yIC0gKGNvbnN0IEZYVF9QU1YgJm9iajEsIGNvbnN0IEZYVF9QU1YgJm9iajIpCi0gICAgewotICAgICAgICBDRlhfUFNWVGVtcGxhdGUgb2JqOwotICAgICAgICBvYmoueCA9IG9iajEueCAtIG9iajIueDsKLSAgICAgICAgb2JqLnkgPSBvYmoxLnkgLSBvYmoyLnk7Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotICAgIGZyaWVuZAlGWFRfUFNWCQlvcGVyYXRvciAqIChjb25zdCBGWFRfUFNWICZvYmosIGJhc2VUeXBlIGxhbWRhKQotICAgIHsKLSAgICAgICAgQ0ZYX1BTVlRlbXBsYXRlIHQ7Ci0gICAgICAgIHQueCA9IG9iai54ICogbGFtZGE7Ci0gICAgICAgIHQueSA9IG9iai55ICogbGFtZGE7Ci0gICAgICAgIHJldHVybiB0OwotICAgIH0KLSAgICBmcmllbmQJRlhUX1BTVgkJb3BlcmF0b3IgKiAoYmFzZVR5cGUgbGFtZGEsIGNvbnN0IEZYVF9QU1YgJm9iaikKLSAgICB7Ci0gICAgICAgIENGWF9QU1ZUZW1wbGF0ZSB0OwotICAgICAgICB0LnggPSBsYW1kYSAqIG9iai54OwotICAgICAgICB0LnkgPSBsYW1kYSAqIG9iai55OwotICAgICAgICByZXR1cm4gdDsKLSAgICB9Ci0gICAgZnJpZW5kCUZYVF9QU1YJCW9wZXJhdG9yIC8gKGNvbnN0IEZYVF9QU1YgJm9iaiwgYmFzZVR5cGUgbGFtZGEpCi0gICAgewotICAgICAgICBDRlhfUFNWVGVtcGxhdGUgdDsKLSAgICAgICAgdC54ID0gb2JqLnggLyBsYW1kYTsKLSAgICAgICAgdC55ID0gb2JqLnkgLyBsYW1kYTsKLSAgICAgICAgcmV0dXJuIHQ7Ci0gICAgfQotICAgIGJhc2VUeXBlIHgsIHk7Cit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+CitjbGFzcyBDRlhfUFNWVGVtcGxhdGUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8YmFzZVR5cGU+IEZYVF9QU1Y7CisgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPiBGWFRfUE9JTlQ7CisgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPiBGWFRfU0laRTsKKyAgdm9pZCBTZXQoYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkgeyBGWFRfUFNWOjp4ID0geCwgRlhUX1BTVjo6eSA9IHk7IH0KKyAgdm9pZCBTZXQoY29uc3QgRlhUX1BTViYgcHN2KSB7IEZYVF9QU1Y6OnggPSBwc3YueCwgRlhUX1BTVjo6eSA9IHBzdi55OyB9CisgIHZvaWQgQWRkKGJhc2VUeXBlIHgsIGJhc2VUeXBlIHkpIHsgRlhUX1BTVjo6eCArPSB4LCBGWFRfUFNWOjp5ICs9IHk7IH0KKyAgdm9pZCBTdWJ0cmFjdChiYXNlVHlwZSB4LCBiYXNlVHlwZSB5KSB7IEZYVF9QU1Y6OnggLT0geCwgRlhUX1BTVjo6eSAtPSB5OyB9CisgIHZvaWQgUmVzZXQoKSB7IEZYVF9QU1Y6OnggPSBGWFRfUFNWOjp5ID0gMDsgfQorICBGWFRfUFNWJiBvcGVyYXRvcis9KGNvbnN0IEZYVF9QU1YmIG9iaikgeworICAgIHggKz0gb2JqLng7CisgICAgeSArPSBvYmoueTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgRlhUX1BTViYgb3BlcmF0b3ItPShjb25zdCBGWFRfUFNWJiBvYmopIHsKKyAgICB4IC09IG9iai54OworICAgIHkgLT0gb2JqLnk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEZYVF9QU1YmIG9wZXJhdG9yKj0oYmFzZVR5cGUgbGFtZGEpIHsKKyAgICB4ICo9IGxhbWRhOworICAgIHkgKj0gbGFtZGE7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEZYVF9QU1YmIG9wZXJhdG9yLz0oYmFzZVR5cGUgbGFtZGEpIHsKKyAgICB4IC89IGxhbWRhOworICAgIHkgLz0gbGFtZGE7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPT0oY29uc3QgRlhUX1BTViYgb2JqMSwgY29uc3QgRlhUX1BTViYgb2JqMikgeworICAgIHJldHVybiBvYmoxLnggPT0gb2JqMi54ICYmIG9iajEueSA9PSBvYmoyLnk7CisgIH0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3IhPShjb25zdCBGWFRfUFNWJiBvYmoxLCBjb25zdCBGWFRfUFNWJiBvYmoyKSB7CisgICAgcmV0dXJuIG9iajEueCAhPSBvYmoyLnggfHwgb2JqMS55ICE9IG9iajIueTsKKyAgfQorICBmcmllbmQgRlhUX1BTViBvcGVyYXRvcisoY29uc3QgRlhUX1BTViYgb2JqMSwgY29uc3QgRlhUX1BTViYgb2JqMikgeworICAgIENGWF9QU1ZUZW1wbGF0ZSBvYmo7CisgICAgb2JqLnggPSBvYmoxLnggKyBvYmoyLng7CisgICAgb2JqLnkgPSBvYmoxLnkgKyBvYmoyLnk7CisgICAgcmV0dXJuIG9iajsKKyAgfQorICBmcmllbmQgRlhUX1BTViBvcGVyYXRvci0oY29uc3QgRlhUX1BTViYgb2JqMSwgY29uc3QgRlhUX1BTViYgb2JqMikgeworICAgIENGWF9QU1ZUZW1wbGF0ZSBvYmo7CisgICAgb2JqLnggPSBvYmoxLnggLSBvYmoyLng7CisgICAgb2JqLnkgPSBvYmoxLnkgLSBvYmoyLnk7CisgICAgcmV0dXJuIG9iajsKKyAgfQorICBmcmllbmQgRlhUX1BTViBvcGVyYXRvciooY29uc3QgRlhUX1BTViYgb2JqLCBiYXNlVHlwZSBsYW1kYSkgeworICAgIENGWF9QU1ZUZW1wbGF0ZSB0OworICAgIHQueCA9IG9iai54ICogbGFtZGE7CisgICAgdC55ID0gb2JqLnkgKiBsYW1kYTsKKyAgICByZXR1cm4gdDsKKyAgfQorICBmcmllbmQgRlhUX1BTViBvcGVyYXRvciooYmFzZVR5cGUgbGFtZGEsIGNvbnN0IEZYVF9QU1YmIG9iaikgeworICAgIENGWF9QU1ZUZW1wbGF0ZSB0OworICAgIHQueCA9IGxhbWRhICogb2JqLng7CisgICAgdC55ID0gbGFtZGEgKiBvYmoueTsKKyAgICByZXR1cm4gdDsKKyAgfQorICBmcmllbmQgRlhUX1BTViBvcGVyYXRvci8oY29uc3QgRlhUX1BTViYgb2JqLCBiYXNlVHlwZSBsYW1kYSkgeworICAgIENGWF9QU1ZUZW1wbGF0ZSB0OworICAgIHQueCA9IG9iai54IC8gbGFtZGE7CisgICAgdC55ID0gb2JqLnkgLyBsYW1kYTsKKyAgICByZXR1cm4gdDsKKyAgfQorICBiYXNlVHlwZSB4LCB5OwogfTsKLXR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGludDMyX3Q+CQkJQ0ZYX1BvaW50OwotdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8RlhfRkxPQVQ+CQkJQ0ZYX1BvaW50RjsKLXR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGludDMyX3Q+CQkJQ0ZYX1NpemU7Ci10eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxGWF9GTE9BVD4JCQlDRlhfU2l6ZUY7Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9Qb2ludD4JCUNGWF9Qb2ludHM7Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9Qb2ludEY+CQlDRlhfUG9pbnRzRjsKLXR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGludDMyX3Q+ICoJCQlGWF9MUFBPSU5UOwotdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8RlhfRkxPQVQ+ICoJCQlGWF9MUFBPSU5URjsKLXR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGludDMyX3Q+IGNvbnN0ICoJRlhfTFBDUE9JTlQ7Ci10eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxGWF9GTE9BVD4gY29uc3QgKglGWF9MUENQT0lOVEY7Ci0jZGVmaW5lIENGWF9GbG9hdFBvaW50CUNGWF9Qb2ludEYKLXRlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPgotY2xhc3MgQ0ZYX1ZUZW1wbGF0ZTogcHVibGljIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4KLXsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4JRlhUX1BTVjsKLSAgICB0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4JRlhUX1BPSU5UOwotICAgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPglGWFRfU0laRTsKLSAgICB0eXBlZGVmIENGWF9WVGVtcGxhdGU8YmFzZVR5cGU+CQlGWFRfVkVDVE9SOwotICAgIHZvaWQJCVNldChiYXNlVHlwZSBuZXd4LCBiYXNlVHlwZSBuZXd5KQotICAgIHsKLSAgICAgICAgRlhUX1BTVjo6eCA9IG5ld3g7Ci0gICAgICAgIEZYVF9QU1Y6OnkgPSBuZXd5OwordHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8aW50MzJfdD4gQ0ZYX1BvaW50OwordHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8RlhfRkxPQVQ+IENGWF9Qb2ludEY7Cit0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxpbnQzMl90PiBDRlhfU2l6ZTsKK3R5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPEZYX0ZMT0FUPiBDRlhfU2l6ZUY7Cit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9Qb2ludD4gQ0ZYX1BvaW50czsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX1BvaW50Rj4gQ0ZYX1BvaW50c0Y7Cit0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxpbnQzMl90PiogRlhfTFBQT0lOVDsKK3R5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPEZYX0ZMT0FUPiogRlhfTFBQT0lOVEY7Cit0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxpbnQzMl90PiBjb25zdCogRlhfTFBDUE9JTlQ7Cit0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxGWF9GTE9BVD4gY29uc3QqIEZYX0xQQ1BPSU5URjsKKyNkZWZpbmUgQ0ZYX0Zsb2F0UG9pbnQgQ0ZYX1BvaW50RgordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgorY2xhc3MgQ0ZYX1ZUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfUFNWVGVtcGxhdGU8YmFzZVR5cGU+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPiBGWFRfUFNWOworICB0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4gRlhUX1BPSU5UOworICB0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4gRlhUX1NJWkU7CisgIHR5cGVkZWYgQ0ZYX1ZUZW1wbGF0ZTxiYXNlVHlwZT4gRlhUX1ZFQ1RPUjsKKyAgdm9pZCBTZXQoYmFzZVR5cGUgbmV3eCwgYmFzZVR5cGUgbmV3eSkgeworICAgIEZYVF9QU1Y6OnggPSBuZXd4OworICAgIEZYVF9QU1Y6OnkgPSBuZXd5OworICB9CisgIHZvaWQgU2V0KGNvbnN0IEZYVF9QU1YmIHBzdikgeyBGWFRfUFNWOjp4ID0gcHN2LngsIEZYVF9QU1Y6OnkgPSBwc3YueTsgfQorICB2b2lkIFNldChjb25zdCBGWFRfUE9JTlQmIHAxLCBjb25zdCBGWFRfUE9JTlQmIHAyKSB7CisgICAgRlhUX1BTVjo6eCA9IHAyLnggLSBwMS54LCBGWFRfUFNWOjp5ID0gcDIueSAtIHAxLnk7CisgIH0KKyAgdm9pZCBSZXNldCgpIHsgRlhUX1BTVjo6eCA9IEZYVF9QU1Y6OnkgPSAwOyB9CisgIGJhc2VUeXBlIFNxdWFyZUxlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRlhUX1BTVjo6eCAqIEZYVF9QU1Y6OnggKyBGWFRfUFNWOjp5ICogRlhUX1BTVjo6eTsKKyAgfQorICBiYXNlVHlwZSBMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIEZYU1lTX3NxcnQoRlhUX1BTVjo6eCAqIEZYVF9QU1Y6OnggKyBGWFRfUFNWOjp5ICogRlhUX1BTVjo6eSk7CisgIH0KKyAgdm9pZCBOb3JtYWxpemUoKSB7CisgICAgRlhfRkxPQVQgZkxlbiA9CisgICAgICAgIEZYU1lTX3NxcnQoRlhUX1BTVjo6eCAqIEZYVF9QU1Y6OnggKyBGWFRfUFNWOjp5ICogRlhUX1BTVjo6eSk7CisgICAgaWYgKGZMZW4gPCAwLjAwMDFmKSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIHZvaWQJCVNldChjb25zdCBGWFRfUFNWICZwc3YpCi0gICAgewotICAgICAgICBGWFRfUFNWOjp4ID0gcHN2LngsIEZYVF9QU1Y6OnkgPSBwc3YueTsKLSAgICB9Ci0gICAgdm9pZAkJU2V0KGNvbnN0IEZYVF9QT0lOVCAmcDEsIGNvbnN0IEZYVF9QT0lOVCAmcDIpCi0gICAgewotICAgICAgICBGWFRfUFNWOjp4ID0gcDIueCAtIHAxLngsIEZYVF9QU1Y6OnkgPSBwMi55IC0gcDEueTsKLSAgICB9Ci0gICAgdm9pZAkJUmVzZXQoKQotICAgIHsKLSAgICAgICAgRlhUX1BTVjo6eCA9IEZYVF9QU1Y6OnkgPSAwOwotICAgIH0KLSAgICBiYXNlVHlwZQlTcXVhcmVMZW5ndGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYVF9QU1Y6OnggKiBGWFRfUFNWOjp4ICsgRlhUX1BTVjo6eSAqIEZYVF9QU1Y6Onk7Ci0gICAgfQotICAgIGJhc2VUeXBlCUxlbmd0aCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gRlhTWVNfc3FydChGWFRfUFNWOjp4ICogRlhUX1BTVjo6eCArIEZYVF9QU1Y6OnkgKiBGWFRfUFNWOjp5KTsKLSAgICB9Ci0gICAgdm9pZAkJTm9ybWFsaXplKCkKLSAgICB7Ci0gICAgICAgIEZYX0ZMT0FUIGZMZW4gPSBGWFNZU19zcXJ0KEZYVF9QU1Y6OnggKiBGWFRfUFNWOjp4ICsgRlhUX1BTVjo6eSAqIEZYVF9QU1Y6OnkpOwotICAgICAgICBpZiAoZkxlbiA8IDAuMDAwMWYpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWFRfUFNWOjp4ID0gKChiYXNlVHlwZSlGWFRfUFNWOjp4KSAvIGZMZW47Ci0gICAgICAgIEZYVF9QU1Y6OnkgPSAoKGJhc2VUeXBlKUZYVF9QU1Y6OnkpIC8gZkxlbjsKLSAgICB9Ci0gICAgYmFzZVR5cGUJRG90UHJvZHVjdChiYXNlVHlwZSBvdGhlcngsIGJhc2VUeXBlIG90aGVyeSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGWFRfUFNWOjp4ICogb3RoZXJ4ICsgRlhUX1BTVjo6eSAqIG90aGVyeTsKLSAgICB9Ci0gICAgYmFzZVR5cGUJRG90UHJvZHVjdChjb25zdCBGWFRfVkVDVE9SICZ2KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYVF9QU1Y6OnggKiB2LnggKyBGWFRfUFNWOjp5ICogdi55OwotICAgIH0KLSAgICBGWF9CT09MCQlJc1BhcmFsbGVsKGJhc2VUeXBlIG90aGVyeCwgYmFzZVR5cGUgb3RoZXJ5KSBjb25zdAotICAgIHsKLSAgICAgICAgYmFzZVR5cGUgdCA9IEZYVF9QU1Y6OnggKiBvdGhlcnkgLSBGWFRfUFNWOjp5ICogb3RoZXJ4OwotICAgICAgICByZXR1cm4gRlhTWVNfZmFicyh0KSA8IDB4MDAwMWY7Ci0gICAgfQotICAgIEZYX0JPT0wJCUlzUGFyYWxsZWwoY29uc3QgRlhUX1ZFQ1RPUiAmdikgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBJc1BhcmFsbGVsKHYueCwgdi55KTsKLSAgICB9Ci0gICAgRlhfQk9PTAkJSXNQZXJwZW5kaWN1bGFyKGJhc2VUeXBlIG90aGVyeCwgYmFzZVR5cGUgb3RoZXJ5KSBjb25zdAotICAgIHsKLSAgICAgICAgYmFzZVR5cGUgdCA9IERvdFByb2R1Y3Qob3RoZXJ4LCBvdGhlcnkpOwotICAgICAgICByZXR1cm4gRlhTWVNfZmFicyh0KSA8IDB4MDAwMWY7Ci0gICAgfQotICAgIEZYX0JPT0wJCUlzUGVycGVuZGljdWxhcihjb25zdCBGWFRfVkVDVE9SICZ2KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIElzUGVycGVuZGljdWxhcih2LngsIHYueSk7Ci0gICAgfQotICAgIHZvaWQJCVRyYW5zbGF0ZShiYXNlVHlwZSBkeCwgYmFzZVR5cGUgZHkpCi0gICAgewotICAgICAgICBGWFRfUFNWOjp4ICs9IGR4LCBGWFRfUFNWOjp5ICs9IGR5OwotICAgIH0KLSAgICB2b2lkCQlTY2FsZShiYXNlVHlwZSBzeCwgYmFzZVR5cGUgc3kpCi0gICAgewotICAgICAgICBGWFRfUFNWOjp4ICo9IHN4LCBGWFRfUFNWOjp5ICo9IHN5OwotICAgIH0KLSAgICB2b2lkCQlSb3RhdGUoRlhfRkxPQVQgZlJhZGlhbikKLSAgICB7Ci0gICAgICAgIEZYX0ZMT0FUIHh4ID0gKEZYX0ZMT0FUKUZYVF9QU1Y6Ong7Ci0gICAgICAgIEZYX0ZMT0FUIHl5ID0gKEZYX0ZMT0FUKUZYVF9QU1Y6Onk7Ci0gICAgICAgIEZYX0ZMT0FUIGNvc1ZhbHVlID0gRlhTWVNfY29zKGZSYWRpYW4pOwotICAgICAgICBGWF9GTE9BVCBzaW5WYWx1ZSA9IEZYU1lTX3NpbihmUmFkaWFuKTsKLSAgICAgICAgRlhUX1BTVjo6eCA9IHh4ICogY29zVmFsdWUgLSB5eSAqIHNpblZhbHVlOwotICAgICAgICBGWFRfUFNWOjp5ID0geHggKiBzaW5WYWx1ZSArIHl5ICogY29zVmFsdWU7Ci0gICAgfQotICAgIGZyaWVuZAlGWF9GTE9BVAlDb3NpbmUoY29uc3QgRlhUX1ZFQ1RPUiAmdjEsIGNvbnN0IEZYVF9WRUNUT1IgJnYyKQotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KHYxLlNxdWFyZUxlbmd0aCgpICE9IDAgJiYgdjIuU3F1YXJlTGVuZ3RoKCkgIT0gMCk7Ci0gICAgICAgIEZYX0ZMT0FUIGRvdFByb2R1Y3QgPSB2MS5Eb3RQcm9kdWN0KHYyKTsKLSAgICAgICAgcmV0dXJuIGRvdFByb2R1Y3QgLyAoRlhfRkxPQVQpRlhTWVNfc3FydCh2MS5TcXVhcmVMZW5ndGgoKSAqIHYyLlNxdWFyZUxlbmd0aCgpKTsKLSAgICB9Ci0gICAgZnJpZW5kCUZYX0ZMT0FUCUFyY0Nvc2luZShjb25zdCBGWFRfVkVDVE9SICZ2MSwgY29uc3QgRlhUX1ZFQ1RPUiAmdjIpCi0gICAgewotICAgICAgICByZXR1cm4gKEZYX0ZMT0FUKUZYU1lTX2Fjb3MoQ29zaW5lKHYxLCB2MikpOwotICAgIH0KLSAgICBmcmllbmQJRlhfRkxPQVQJU2xvcGVBbmdsZShjb25zdCBGWFRfVkVDVE9SICZ2KQotICAgIHsKLSAgICAgICAgQ0ZYX1ZUZW1wbGF0ZSB2eDsKLSAgICAgICAgdnguU2V0KDEsIDApOwotICAgICAgICBGWF9GTE9BVCBmU2xvcGUgPSBBcmNDb3NpbmUodiwgdngpOwotICAgICAgICByZXR1cm4gdi55IDwgMCA/IC1mU2xvcGUgOiBmU2xvcGU7Ci0gICAgfQorICAgIEZYVF9QU1Y6OnggPSAoKGJhc2VUeXBlKUZYVF9QU1Y6OngpIC8gZkxlbjsKKyAgICBGWFRfUFNWOjp5ID0gKChiYXNlVHlwZSlGWFRfUFNWOjp5KSAvIGZMZW47CisgIH0KKyAgYmFzZVR5cGUgRG90UHJvZHVjdChiYXNlVHlwZSBvdGhlcngsIGJhc2VUeXBlIG90aGVyeSkgY29uc3QgeworICAgIHJldHVybiBGWFRfUFNWOjp4ICogb3RoZXJ4ICsgRlhUX1BTVjo6eSAqIG90aGVyeTsKKyAgfQorICBiYXNlVHlwZSBEb3RQcm9kdWN0KGNvbnN0IEZYVF9WRUNUT1ImIHYpIGNvbnN0IHsKKyAgICByZXR1cm4gRlhUX1BTVjo6eCAqIHYueCArIEZYVF9QU1Y6OnkgKiB2Lnk7CisgIH0KKyAgRlhfQk9PTCBJc1BhcmFsbGVsKGJhc2VUeXBlIG90aGVyeCwgYmFzZVR5cGUgb3RoZXJ5KSBjb25zdCB7CisgICAgYmFzZVR5cGUgdCA9IEZYVF9QU1Y6OnggKiBvdGhlcnkgLSBGWFRfUFNWOjp5ICogb3RoZXJ4OworICAgIHJldHVybiBGWFNZU19mYWJzKHQpIDwgMHgwMDAxZjsKKyAgfQorICBGWF9CT09MIElzUGFyYWxsZWwoY29uc3QgRlhUX1ZFQ1RPUiYgdikgY29uc3QgeyByZXR1cm4gSXNQYXJhbGxlbCh2LngsIHYueSk7IH0KKyAgRlhfQk9PTCBJc1BlcnBlbmRpY3VsYXIoYmFzZVR5cGUgb3RoZXJ4LCBiYXNlVHlwZSBvdGhlcnkpIGNvbnN0IHsKKyAgICBiYXNlVHlwZSB0ID0gRG90UHJvZHVjdChvdGhlcngsIG90aGVyeSk7CisgICAgcmV0dXJuIEZYU1lTX2ZhYnModCkgPCAweDAwMDFmOworICB9CisgIEZYX0JPT0wgSXNQZXJwZW5kaWN1bGFyKGNvbnN0IEZYVF9WRUNUT1ImIHYpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNQZXJwZW5kaWN1bGFyKHYueCwgdi55KTsKKyAgfQorICB2b2lkIFRyYW5zbGF0ZShiYXNlVHlwZSBkeCwgYmFzZVR5cGUgZHkpIHsKKyAgICBGWFRfUFNWOjp4ICs9IGR4LCBGWFRfUFNWOjp5ICs9IGR5OworICB9CisgIHZvaWQgU2NhbGUoYmFzZVR5cGUgc3gsIGJhc2VUeXBlIHN5KSB7IEZYVF9QU1Y6OnggKj0gc3gsIEZYVF9QU1Y6OnkgKj0gc3k7IH0KKyAgdm9pZCBSb3RhdGUoRlhfRkxPQVQgZlJhZGlhbikgeworICAgIEZYX0ZMT0FUIHh4ID0gKEZYX0ZMT0FUKUZYVF9QU1Y6Ong7CisgICAgRlhfRkxPQVQgeXkgPSAoRlhfRkxPQVQpRlhUX1BTVjo6eTsKKyAgICBGWF9GTE9BVCBjb3NWYWx1ZSA9IEZYU1lTX2NvcyhmUmFkaWFuKTsKKyAgICBGWF9GTE9BVCBzaW5WYWx1ZSA9IEZYU1lTX3NpbihmUmFkaWFuKTsKKyAgICBGWFRfUFNWOjp4ID0geHggKiBjb3NWYWx1ZSAtIHl5ICogc2luVmFsdWU7CisgICAgRlhUX1BTVjo6eSA9IHh4ICogc2luVmFsdWUgKyB5eSAqIGNvc1ZhbHVlOworICB9CisgIGZyaWVuZCBGWF9GTE9BVCBDb3NpbmUoY29uc3QgRlhUX1ZFQ1RPUiYgdjEsIGNvbnN0IEZYVF9WRUNUT1ImIHYyKSB7CisgICAgRlhTWVNfYXNzZXJ0KHYxLlNxdWFyZUxlbmd0aCgpICE9IDAgJiYgdjIuU3F1YXJlTGVuZ3RoKCkgIT0gMCk7CisgICAgRlhfRkxPQVQgZG90UHJvZHVjdCA9IHYxLkRvdFByb2R1Y3QodjIpOworICAgIHJldHVybiBkb3RQcm9kdWN0IC8KKyAgICAgICAgICAgKEZYX0ZMT0FUKUZYU1lTX3NxcnQodjEuU3F1YXJlTGVuZ3RoKCkgKiB2Mi5TcXVhcmVMZW5ndGgoKSk7CisgIH0KKyAgZnJpZW5kIEZYX0ZMT0FUIEFyY0Nvc2luZShjb25zdCBGWFRfVkVDVE9SJiB2MSwgY29uc3QgRlhUX1ZFQ1RPUiYgdjIpIHsKKyAgICByZXR1cm4gKEZYX0ZMT0FUKUZYU1lTX2Fjb3MoQ29zaW5lKHYxLCB2MikpOworICB9CisgIGZyaWVuZCBGWF9GTE9BVCBTbG9wZUFuZ2xlKGNvbnN0IEZYVF9WRUNUT1ImIHYpIHsKKyAgICBDRlhfVlRlbXBsYXRlIHZ4OworICAgIHZ4LlNldCgxLCAwKTsKKyAgICBGWF9GTE9BVCBmU2xvcGUgPSBBcmNDb3NpbmUodiwgdngpOworICAgIHJldHVybiB2LnkgPCAwID8gLWZTbG9wZSA6IGZTbG9wZTsKKyAgfQogfTsKIHR5cGVkZWYgQ0ZYX1ZUZW1wbGF0ZTxpbnQzMl90PiBDRlhfVmVjdG9yOwogdHlwZWRlZiBDRlhfVlRlbXBsYXRlPEZYX0ZMT0FUPiBDRlhfVmVjdG9yRjsKLXRlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPgotY2xhc3MgQ0ZYX1JUZW1wbGF0ZQotewotcHVibGljOgotICAgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPglGWFRfUE9JTlQ7Ci0gICAgdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8YmFzZVR5cGU+CUZYVF9TSVpFOwotICAgIHR5cGVkZWYgQ0ZYX1ZUZW1wbGF0ZTxiYXNlVHlwZT4JCUZYVF9WRUNUT1I7Ci0gICAgdHlwZWRlZiBDRlhfUFJMVGVtcGxhdGU8YmFzZVR5cGU+CUZYVF9QQVJBTDsKLSAgICB0eXBlZGVmIENGWF9SVGVtcGxhdGU8YmFzZVR5cGU+CQlGWFRfUkVDVDsKLSAgICB2b2lkCQlTZXQoYmFzZVR5cGUgbGVmdCwgYmFzZVR5cGUgdG9wLCBiYXNlVHlwZSB3aWR0aCwgYmFzZVR5cGUgaGVpZ2h0KQotICAgIHsKLSAgICAgICAgRlhUX1JFQ1Q6OmxlZnQgPSBsZWZ0LCBGWFRfUkVDVDo6dG9wID0gdG9wLCBGWFRfUkVDVDo6d2lkdGggPSB3aWR0aCwgRlhUX1JFQ1Q6OmhlaWdodCA9IGhlaWdodDsKK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4KK2NsYXNzIENGWF9SVGVtcGxhdGUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8YmFzZVR5cGU+IEZYVF9QT0lOVDsKKyAgdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8YmFzZVR5cGU+IEZYVF9TSVpFOworICB0eXBlZGVmIENGWF9WVGVtcGxhdGU8YmFzZVR5cGU+IEZYVF9WRUNUT1I7CisgIHR5cGVkZWYgQ0ZYX1BSTFRlbXBsYXRlPGJhc2VUeXBlPiBGWFRfUEFSQUw7CisgIHR5cGVkZWYgQ0ZYX1JUZW1wbGF0ZTxiYXNlVHlwZT4gRlhUX1JFQ1Q7CisgIHZvaWQgU2V0KGJhc2VUeXBlIGxlZnQsIGJhc2VUeXBlIHRvcCwgYmFzZVR5cGUgd2lkdGgsIGJhc2VUeXBlIGhlaWdodCkgeworICAgIEZYVF9SRUNUOjpsZWZ0ID0gbGVmdCwgRlhUX1JFQ1Q6OnRvcCA9IHRvcCwgRlhUX1JFQ1Q6OndpZHRoID0gd2lkdGgsCisgICAgRlhUX1JFQ1Q6OmhlaWdodCA9IGhlaWdodDsKKyAgfQorICB2b2lkIFNldChiYXNlVHlwZSBsZWZ0LCBiYXNlVHlwZSB0b3AsIGNvbnN0IEZYVF9TSVpFJiBzaXplKSB7CisgICAgRlhUX1JFQ1Q6OmxlZnQgPSBsZWZ0LCBGWFRfUkVDVDo6dG9wID0gdG9wLCBGWFRfUkVDVDo6U2l6ZShzaXplKTsKKyAgfQorICB2b2lkIFNldChjb25zdCBGWFRfUE9JTlQmIHAsIGJhc2VUeXBlIHdpZHRoLCBiYXNlVHlwZSBoZWlnaHQpIHsKKyAgICBUb3BMZWZ0KHApLCBGWFRfUkVDVDo6d2lkdGggPSB3aWR0aCwgRlhUX1JFQ1Q6OmhlaWdodCA9IGhlaWdodDsKKyAgfQorICB2b2lkIFNldChjb25zdCBGWFRfUE9JTlQmIHAxLCBjb25zdCBGWFRfUE9JTlQmIHAyKSB7CisgICAgVG9wTGVmdChwMSksIEZYVF9SRUNUOjp3aWR0aCA9IHAyLnggLSBwMS54LCBGWFRfUkVDVDo6aGVpZ2h0ID0gcDIueSAtIHAxLnksCisgICAgICAgICAgICAgICAgIEZYVF9SRUNUOjpOb3JtYWxpemUoKTsKKyAgfQorICB2b2lkIFNldChjb25zdCBGWFRfUE9JTlQmIHAsIGNvbnN0IEZYVF9WRUNUT1ImIHYpIHsKKyAgICBUb3BMZWZ0KHApLCBGWFRfUkVDVDo6d2lkdGggPSB2LngsIEZYVF9SRUNUOjpoZWlnaHQgPSB2LnksCisgICAgICAgICAgICAgICAgRlhUX1JFQ1Q6Ok5vcm1hbGl6ZSgpOworICB9CisgIHZvaWQgUmVzZXQoKSB7CisgICAgRlhUX1JFQ1Q6OmxlZnQgPSBGWFRfUkVDVDo6dG9wID0gRlhUX1JFQ1Q6OndpZHRoID0gRlhUX1JFQ1Q6OmhlaWdodCA9IDA7CisgIH0KKyAgRlhUX1JFQ1QmIG9wZXJhdG9yKz0oY29uc3QgRlhUX1BPSU5UJiBwKSB7CisgICAgbGVmdCArPSBwLngsIHRvcCArPSBwLnk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEZYVF9SRUNUJiBvcGVyYXRvci09KGNvbnN0IEZYVF9QT0lOVCYgcCkgeworICAgIGxlZnQgLT0gcC54LCB0b3AgLT0gcC55OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBiYXNlVHlwZSByaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxlZnQgKyB3aWR0aDsgfQorICBiYXNlVHlwZSBib3R0b20oKSBjb25zdCB7IHJldHVybiB0b3AgKyBoZWlnaHQ7IH0KKyAgdm9pZCBOb3JtYWxpemUoKSB7CisgICAgaWYgKHdpZHRoIDwgMCkgeworICAgICAgbGVmdCArPSB3aWR0aDsKKyAgICAgIHdpZHRoID0gLXdpZHRoOwogICAgIH0KLSAgICB2b2lkCQlTZXQoYmFzZVR5cGUgbGVmdCwgYmFzZVR5cGUgdG9wLCBjb25zdCBGWFRfU0laRSAmc2l6ZSkKLSAgICB7Ci0gICAgICAgIEZYVF9SRUNUOjpsZWZ0ID0gbGVmdCwgRlhUX1JFQ1Q6OnRvcCA9IHRvcCwgRlhUX1JFQ1Q6OlNpemUoc2l6ZSk7CisgICAgaWYgKGhlaWdodCA8IDApIHsKKyAgICAgIHRvcCArPSBoZWlnaHQ7CisgICAgICBoZWlnaHQgPSAtaGVpZ2h0OwogICAgIH0KLSAgICB2b2lkCQlTZXQoY29uc3QgRlhUX1BPSU5UICZwLCBiYXNlVHlwZSB3aWR0aCwgYmFzZVR5cGUgaGVpZ2h0KQotICAgIHsKLSAgICAgICAgVG9wTGVmdChwKSwgRlhUX1JFQ1Q6OndpZHRoID0gd2lkdGgsIEZYVF9SRUNUOjpoZWlnaHQgPSBoZWlnaHQ7CisgIH0KKyAgdm9pZCBPZmZzZXQoYmFzZVR5cGUgZHgsIGJhc2VUeXBlIGR5KSB7CisgICAgbGVmdCArPSBkeDsKKyAgICB0b3AgKz0gZHk7CisgIH0KKyAgdm9pZCBJbmZsYXRlKGJhc2VUeXBlIHgsIGJhc2VUeXBlIHkpIHsKKyAgICBsZWZ0IC09IHg7CisgICAgd2lkdGggKz0geCAqIDI7CisgICAgdG9wIC09IHk7CisgICAgaGVpZ2h0ICs9IHkgKiAyOworICB9CisgIHZvaWQgSW5mbGF0ZShjb25zdCBGWFRfUE9JTlQmIHApIHsgSW5mbGF0ZShwLngsIHAueSk7IH0KKyAgdm9pZCBJbmZsYXRlKGJhc2VUeXBlIGxlZnQsIGJhc2VUeXBlIHRvcCwgYmFzZVR5cGUgcmlnaHQsIGJhc2VUeXBlIGJvdHRvbSkgeworICAgIEZYVF9SRUNUOjpsZWZ0IC09IGxlZnQ7CisgICAgRlhUX1JFQ1Q6OnRvcCAtPSB0b3A7CisgICAgRlhUX1JFQ1Q6OndpZHRoICs9IGxlZnQgKyByaWdodDsKKyAgICBGWFRfUkVDVDo6aGVpZ2h0ICs9IHRvcCArIGJvdHRvbTsKKyAgfQorICB2b2lkIEluZmxhdGUoY29uc3QgRlhUX1JFQ1QmIHJ0KSB7CisgICAgSW5mbGF0ZShydC5sZWZ0LCBydC50b3AsIHJ0LmxlZnQgKyBydC53aWR0aCwgcnQudG9wICsgcnQuaGVpZ2h0KTsKKyAgfQorICB2b2lkIERlZmxhdGUoYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkgeworICAgIGxlZnQgKz0geDsKKyAgICB3aWR0aCAtPSB4ICogMjsKKyAgICB0b3AgKz0geTsKKyAgICBoZWlnaHQgLT0geSAqIDI7CisgIH0KKyAgdm9pZCBEZWZsYXRlKGNvbnN0IEZYVF9QT0lOVCYgcCkgeyBEZWZsYXRlKHAueCwgcC55KTsgfQorICB2b2lkIERlZmxhdGUoYmFzZVR5cGUgbGVmdCwgYmFzZVR5cGUgdG9wLCBiYXNlVHlwZSByaWdodCwgYmFzZVR5cGUgYm90dG9tKSB7CisgICAgRlhUX1JFQ1Q6OmxlZnQgKz0gbGVmdDsKKyAgICBGWFRfUkVDVDo6dG9wICs9IHRvcDsKKyAgICBGWFRfUkVDVDo6d2lkdGggLT0gbGVmdCArIHJpZ2h0OworICAgIEZYVF9SRUNUOjpoZWlnaHQgLT0gdG9wICsgYm90dG9tOworICB9CisgIHZvaWQgRGVmbGF0ZShjb25zdCBGWFRfUkVDVCYgcnQpIHsKKyAgICBEZWZsYXRlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQudG9wICsgcnQud2lkdGgsIHJ0LnRvcCArIHJ0LmhlaWdodCk7CisgIH0KKyAgRlhfQk9PTCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gd2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMDsgfQorICBGWF9CT09MIElzRW1wdHkoRlhfRkxPQVQgZkVwc2lsb24pIGNvbnN0IHsKKyAgICByZXR1cm4gd2lkdGggPD0gZkVwc2lsb24gfHwgaGVpZ2h0IDw9IGZFcHNpbG9uOworICB9CisgIHZvaWQgRW1wdHkoKSB7IHdpZHRoID0gaGVpZ2h0ID0gMDsgfQorICBGWF9CT09MIENvbnRhaW5zKGJhc2VUeXBlIHgsIGJhc2VUeXBlIHkpIGNvbnN0IHsKKyAgICByZXR1cm4geCA+PSBsZWZ0ICYmIHggPCBsZWZ0ICsgd2lkdGggJiYgeSA+PSB0b3AgJiYgeSA8IHRvcCArIGhlaWdodDsKKyAgfQorICBGWF9CT09MIENvbnRhaW5zKGNvbnN0IEZYVF9QT0lOVCYgcCkgY29uc3QgeyByZXR1cm4gQ29udGFpbnMocC54LCBwLnkpOyB9CisgIEZYX0JPT0wgQ29udGFpbnMoY29uc3QgRlhUX1JFQ1QmIHJ0KSBjb25zdCB7CisgICAgcmV0dXJuIHJ0LmxlZnQgPj0gbGVmdCAmJiBydC5yaWdodCgpIDw9IHJpZ2h0KCkgJiYgcnQudG9wID49IHRvcCAmJgorICAgICAgICAgICBydC5ib3R0b20oKSA8PSBib3R0b20oKTsKKyAgfQorICBiYXNlVHlwZSBXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIHdpZHRoOyB9CisgIGJhc2VUeXBlIEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIGhlaWdodDsgfQorICBGWFRfU0laRSBTaXplKCkgY29uc3QgeworICAgIEZYVF9TSVpFIHNpemU7CisgICAgc2l6ZS5TZXQod2lkdGgsIGhlaWdodCk7CisgICAgcmV0dXJuIHNpemU7CisgIH0KKyAgdm9pZCBTaXplKEZYVF9TSVpFIHMpIHsgd2lkdGggPSBzLngsIGhlaWdodCA9IHMueTsgfQorICBGWFRfUE9JTlQgVG9wTGVmdCgpIGNvbnN0IHsKKyAgICBGWFRfUE9JTlQgcDsKKyAgICBwLnggPSBsZWZ0OworICAgIHAueSA9IHRvcDsKKyAgICByZXR1cm4gcDsKKyAgfQorICBGWFRfUE9JTlQgVG9wUmlnaHQoKSBjb25zdCB7CisgICAgRlhUX1BPSU5UIHA7CisgICAgcC54ID0gbGVmdCArIHdpZHRoOworICAgIHAueSA9IHRvcDsKKyAgICByZXR1cm4gcDsKKyAgfQorICBGWFRfUE9JTlQgQm90dG9tTGVmdCgpIGNvbnN0IHsKKyAgICBGWFRfUE9JTlQgcDsKKyAgICBwLnggPSBsZWZ0OworICAgIHAueSA9IHRvcCArIGhlaWdodDsKKyAgICByZXR1cm4gcDsKKyAgfQorICBGWFRfUE9JTlQgQm90dG9tUmlnaHQoKSBjb25zdCB7CisgICAgRlhUX1BPSU5UIHA7CisgICAgcC54ID0gbGVmdCArIHdpZHRoOworICAgIHAueSA9IHRvcCArIGhlaWdodDsKKyAgICByZXR1cm4gcDsKKyAgfQorICB2b2lkIFRvcExlZnQoRlhUX1BPSU5UIHRsKSB7CisgICAgbGVmdCA9IHRsLng7CisgICAgdG9wID0gdGwueTsKKyAgfQorICB2b2lkIFRvcFJpZ2h0KEZYVF9QT0lOVCB0cikgeworICAgIHdpZHRoID0gdHIueCAtIGxlZnQ7CisgICAgdG9wID0gdHIueTsKKyAgfQorICB2b2lkIEJvdHRvbUxlZnQoRlhUX1BPSU5UIGJsKSB7CisgICAgbGVmdCA9IGJsLng7CisgICAgaGVpZ2h0ID0gYmwueSAtIHRvcDsKKyAgfQorICB2b2lkIEJvdHRvbVJpZ2h0KEZYVF9QT0lOVCBicikgeworICAgIHdpZHRoID0gYnIueCAtIGxlZnQ7CisgICAgaGVpZ2h0ID0gYnIueSAtIHRvcDsKKyAgfQorICBGWFRfUE9JTlQgQ2VudGVyKCkgY29uc3QgeworICAgIEZYVF9QT0lOVCBwOworICAgIHAueCA9IGxlZnQgKyB3aWR0aCAvIDI7CisgICAgcC55ID0gdG9wICsgaGVpZ2h0IC8gMjsKKyAgICByZXR1cm4gcDsKKyAgfQorICB2b2lkIEdldFBhcmFsbGVsb2dyYW0oRlhUX1BBUkFMJiBwZykgY29uc3QgeworICAgIHBnLnggPSBsZWZ0LCBwZy55ID0gdG9wOworICAgIHBnLngxID0gd2lkdGgsIHBnLnkxID0gMDsKKyAgICBwZy54MiA9IDAsIHBnLnkyID0gaGVpZ2h0OworICB9CisgIHZvaWQgVW5pb24oYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkgeworICAgIGJhc2VUeXBlIHIgPSByaWdodCgpLCBiID0gYm90dG9tKCk7CisgICAgaWYgKGxlZnQgPiB4KSB7CisgICAgICBsZWZ0ID0geDsKICAgICB9Ci0gICAgdm9pZAkJU2V0KGNvbnN0IEZYVF9QT0lOVCAmcDEsIGNvbnN0IEZYVF9QT0lOVCAmcDIpCi0gICAgewotICAgICAgICBUb3BMZWZ0KHAxKSwgRlhUX1JFQ1Q6OndpZHRoID0gcDIueCAtIHAxLngsIEZYVF9SRUNUOjpoZWlnaHQgPSBwMi55IC0gcDEueSwgRlhUX1JFQ1Q6Ok5vcm1hbGl6ZSgpOworICAgIGlmIChyIDwgeCkgeworICAgICAgciA9IHg7CiAgICAgfQotICAgIHZvaWQJCVNldChjb25zdCBGWFRfUE9JTlQgJnAsIGNvbnN0IEZYVF9WRUNUT1IgJnYpCi0gICAgewotICAgICAgICBUb3BMZWZ0KHApLCBGWFRfUkVDVDo6d2lkdGggPSB2LngsIEZYVF9SRUNUOjpoZWlnaHQgPSB2LnksIEZYVF9SRUNUOjpOb3JtYWxpemUoKTsKKyAgICBpZiAodG9wID4geSkgeworICAgICAgdG9wID0geTsKICAgICB9Ci0gICAgdm9pZAkJUmVzZXQoKQotICAgIHsKLSAgICAgICAgRlhUX1JFQ1Q6OmxlZnQgPSBGWFRfUkVDVDo6dG9wID0gRlhUX1JFQ1Q6OndpZHRoID0gRlhUX1JFQ1Q6OmhlaWdodCA9IDA7CisgICAgaWYgKGIgPCB5KSB7CisgICAgICBiID0geTsKICAgICB9Ci0gICAgRlhUX1JFQ1QmCW9wZXJhdG9yICs9IChjb25zdCBGWFRfUE9JTlQgJnApCi0gICAgewotICAgICAgICBsZWZ0ICs9IHAueCwgdG9wICs9IHAueTsKLSAgICAgICAgcmV0dXJuICp0aGlzOworICAgIHdpZHRoID0gciAtIGxlZnQ7CisgICAgaGVpZ2h0ID0gYiAtIHRvcDsKKyAgfQorICB2b2lkIFVuaW9uKGNvbnN0IEZYVF9QT0lOVCYgcCkgeyBVbmlvbihwLngsIHAueSk7IH0KKyAgdm9pZCBVbmlvbihjb25zdCBGWFRfUkVDVCYgcnQpIHsKKyAgICBiYXNlVHlwZSByID0gcmlnaHQoKSwgYiA9IGJvdHRvbSgpOworICAgIGlmIChsZWZ0ID4gcnQubGVmdCkgeworICAgICAgbGVmdCA9IHJ0LmxlZnQ7CiAgICAgfQotICAgIEZYVF9SRUNUJglvcGVyYXRvciAtPSAoY29uc3QgRlhUX1BPSU5UICZwKQotICAgIHsKLSAgICAgICAgbGVmdCAtPSBwLngsIHRvcCAtPSBwLnk7Ci0gICAgICAgIHJldHVybiAqdGhpczsKKyAgICBpZiAociA8IHJ0LnJpZ2h0KCkpIHsKKyAgICAgIHIgPSBydC5yaWdodCgpOwogICAgIH0KLSAgICBiYXNlVHlwZQlyaWdodCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbGVmdCArIHdpZHRoOworICAgIGlmICh0b3AgPiBydC50b3ApIHsKKyAgICAgIHRvcCA9IHJ0LnRvcDsKICAgICB9Ci0gICAgYmFzZVR5cGUJYm90dG9tKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0b3AgKyBoZWlnaHQ7CisgICAgaWYgKGIgPCBydC5ib3R0b20oKSkgeworICAgICAgYiA9IHJ0LmJvdHRvbSgpOwogICAgIH0KLSAgICB2b2lkCQlOb3JtYWxpemUoKQotICAgIHsKLSAgICAgICAgaWYgKHdpZHRoIDwgMCkgewotICAgICAgICAgICAgbGVmdCArPSB3aWR0aDsKLSAgICAgICAgICAgIHdpZHRoID0gLXdpZHRoOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoZWlnaHQgPCAwKSB7Ci0gICAgICAgICAgICB0b3AgKz0gaGVpZ2h0OwotICAgICAgICAgICAgaGVpZ2h0ID0gLWhlaWdodDsKLSAgICAgICAgfQorICAgIHdpZHRoID0gciAtIGxlZnQ7CisgICAgaGVpZ2h0ID0gYiAtIHRvcDsKKyAgfQorICB2b2lkIEludGVyc2VjdChjb25zdCBGWFRfUkVDVCYgcnQpIHsKKyAgICBiYXNlVHlwZSByID0gcmlnaHQoKSwgYiA9IGJvdHRvbSgpOworICAgIGlmIChsZWZ0IDwgcnQubGVmdCkgeworICAgICAgbGVmdCA9IHJ0LmxlZnQ7CiAgICAgfQotICAgIHZvaWQJCU9mZnNldChiYXNlVHlwZSBkeCwgYmFzZVR5cGUgZHkpCi0gICAgewotICAgICAgICBsZWZ0ICs9IGR4OwotICAgICAgICB0b3AgKz0gZHk7CisgICAgaWYgKHIgPiBydC5yaWdodCgpKSB7CisgICAgICByID0gcnQucmlnaHQoKTsKICAgICB9Ci0gICAgdm9pZAkJSW5mbGF0ZShiYXNlVHlwZSB4LCBiYXNlVHlwZSB5KQotICAgIHsKLSAgICAgICAgbGVmdCAtPSB4OwotICAgICAgICB3aWR0aCArPSB4ICogMjsKLSAgICAgICAgdG9wIC09IHk7Ci0gICAgICAgIGhlaWdodCArPSB5ICogMjsKKyAgICBpZiAodG9wIDwgcnQudG9wKSB7CisgICAgICB0b3AgPSBydC50b3A7CiAgICAgfQotICAgIHZvaWQJCUluZmxhdGUoY29uc3QgRlhUX1BPSU5UICZwKQotICAgIHsKLSAgICAgICAgSW5mbGF0ZShwLngsIHAueSk7CisgICAgaWYgKGIgPiBydC5ib3R0b20oKSkgeworICAgICAgYiA9IHJ0LmJvdHRvbSgpOwogICAgIH0KLSAgICB2b2lkCQlJbmZsYXRlKGJhc2VUeXBlIGxlZnQsIGJhc2VUeXBlIHRvcCwgYmFzZVR5cGUgcmlnaHQsIGJhc2VUeXBlIGJvdHRvbSkKLSAgICB7Ci0gICAgICAgIEZYVF9SRUNUOjpsZWZ0IC09IGxlZnQ7Ci0gICAgICAgIEZYVF9SRUNUOjp0b3AgLT0gdG9wOwotICAgICAgICBGWFRfUkVDVDo6d2lkdGggKz0gbGVmdCArIHJpZ2h0OwotICAgICAgICBGWFRfUkVDVDo6aGVpZ2h0ICs9IHRvcCArIGJvdHRvbTsKLSAgICB9Ci0gICAgdm9pZAkJSW5mbGF0ZShjb25zdCBGWFRfUkVDVCAmcnQpCi0gICAgewotICAgICAgICBJbmZsYXRlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQubGVmdCArIHJ0LndpZHRoLCBydC50b3AgKyBydC5oZWlnaHQpOwotICAgIH0KLSAgICB2b2lkCQlEZWZsYXRlKGJhc2VUeXBlIHgsIGJhc2VUeXBlIHkpCi0gICAgewotICAgICAgICBsZWZ0ICs9IHg7Ci0gICAgICAgIHdpZHRoIC09IHggKiAyOwotICAgICAgICB0b3AgKz0geTsKLSAgICAgICAgaGVpZ2h0IC09IHkgKiAyOwotICAgIH0KLSAgICB2b2lkCQlEZWZsYXRlKGNvbnN0IEZYVF9QT0lOVCAmcCkKLSAgICB7Ci0gICAgICAgIERlZmxhdGUocC54LCBwLnkpOwotICAgIH0KLSAgICB2b2lkCQlEZWZsYXRlKGJhc2VUeXBlIGxlZnQsIGJhc2VUeXBlIHRvcCwgYmFzZVR5cGUgcmlnaHQsIGJhc2VUeXBlIGJvdHRvbSkKLSAgICB7Ci0gICAgICAgIEZYVF9SRUNUOjpsZWZ0ICs9IGxlZnQ7Ci0gICAgICAgIEZYVF9SRUNUOjp0b3AgKz0gdG9wOwotICAgICAgICBGWFRfUkVDVDo6d2lkdGggLT0gbGVmdCArIHJpZ2h0OwotICAgICAgICBGWFRfUkVDVDo6aGVpZ2h0IC09IHRvcCArIGJvdHRvbTsKLSAgICB9Ci0gICAgdm9pZAkJRGVmbGF0ZShjb25zdCBGWFRfUkVDVCAmcnQpCi0gICAgewotICAgICAgICBEZWZsYXRlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQudG9wICsgcnQud2lkdGgsIHJ0LnRvcCArIHJ0LmhlaWdodCk7Ci0gICAgfQotICAgIEZYX0JPT0wJCUlzRW1wdHkoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDA7Ci0gICAgfQotICAgIEZYX0JPT0wJCUlzRW1wdHkoRlhfRkxPQVQgZkVwc2lsb24pIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gd2lkdGggPD0gZkVwc2lsb24gfHwgaGVpZ2h0IDw9IGZFcHNpbG9uOwotICAgIH0KLSAgICB2b2lkCQlFbXB0eSgpCi0gICAgewotICAgICAgICB3aWR0aCA9IGhlaWdodCA9IDA7Ci0gICAgfQotICAgIEZYX0JPT0wJCUNvbnRhaW5zKGJhc2VUeXBlIHgsIGJhc2VUeXBlIHkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4geCA+PSBsZWZ0ICYmIHggPCBsZWZ0ICsgd2lkdGggJiYgeSA+PSB0b3AgJiYgeSA8IHRvcCArIGhlaWdodDsKLSAgICB9Ci0gICAgRlhfQk9PTAkJQ29udGFpbnMoY29uc3QgRlhUX1BPSU5UICZwKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbnRhaW5zKHAueCwgcC55KTsKLSAgICB9Ci0gICAgRlhfQk9PTAkJQ29udGFpbnMoY29uc3QgRlhUX1JFQ1QgJnJ0KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHJ0LmxlZnQgPj0gbGVmdCAmJiBydC5yaWdodCgpIDw9IHJpZ2h0KCkgJiYgcnQudG9wID49IHRvcCAmJiBydC5ib3R0b20oKSA8PSBib3R0b20oKTsKLSAgICB9Ci0gICAgYmFzZVR5cGUJV2lkdGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHdpZHRoOwotICAgIH0KLSAgICBiYXNlVHlwZQlIZWlnaHQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGhlaWdodDsKLSAgICB9Ci0gICAgRlhUX1NJWkUJU2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBGWFRfU0laRSBzaXplOwotICAgICAgICBzaXplLlNldCh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotICAgIHZvaWQJCVNpemUoRlhUX1NJWkUgcykKLSAgICB7Ci0gICAgICAgIHdpZHRoID0gcy54LCBoZWlnaHQgPSBzLnk7Ci0gICAgfQotICAgIEZYVF9QT0lOVAlUb3BMZWZ0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZYVF9QT0lOVCBwOwotICAgICAgICBwLnggPSBsZWZ0OwotICAgICAgICBwLnkgPSB0b3A7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLSAgICBGWFRfUE9JTlQJVG9wUmlnaHQoKSBjb25zdAotICAgIHsKLSAgICAgICAgRlhUX1BPSU5UIHA7Ci0gICAgICAgIHAueCA9IGxlZnQgKyB3aWR0aDsKLSAgICAgICAgcC55ID0gdG9wOwotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0gICAgRlhUX1BPSU5UCUJvdHRvbUxlZnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgRlhUX1BPSU5UIHA7Ci0gICAgICAgIHAueCA9IGxlZnQ7Ci0gICAgICAgIHAueSA9IHRvcCArIGhlaWdodDsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotICAgIEZYVF9QT0lOVAlCb3R0b21SaWdodCgpIGNvbnN0Ci0gICAgewotICAgICAgICBGWFRfUE9JTlQgcDsKLSAgICAgICAgcC54ID0gbGVmdCArIHdpZHRoOwotICAgICAgICBwLnkgPSB0b3AgKyBoZWlnaHQ7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLSAgICB2b2lkCQlUb3BMZWZ0KEZYVF9QT0lOVCB0bCkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSB0bC54OwotICAgICAgICB0b3AgPSB0bC55OwotICAgIH0KLSAgICB2b2lkCQlUb3BSaWdodChGWFRfUE9JTlQgdHIpCi0gICAgewotICAgICAgICB3aWR0aCA9IHRyLnggLSBsZWZ0OwotICAgICAgICB0b3AgPSB0ci55OwotICAgIH0KLSAgICB2b2lkCQlCb3R0b21MZWZ0KEZYVF9QT0lOVCBibCkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSBibC54OwotICAgICAgICBoZWlnaHQgPSBibC55IC0gdG9wOwotICAgIH0KLSAgICB2b2lkCQlCb3R0b21SaWdodChGWFRfUE9JTlQgYnIpCi0gICAgewotICAgICAgICB3aWR0aCA9IGJyLnggLSBsZWZ0OwotICAgICAgICBoZWlnaHQgPSBici55IC0gdG9wOwotICAgIH0KLSAgICBGWFRfUE9JTlQJQ2VudGVyKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZYVF9QT0lOVCBwOwotICAgICAgICBwLnggPSBsZWZ0ICsgd2lkdGggLyAyOwotICAgICAgICBwLnkgPSB0b3AgKyBoZWlnaHQgLyAyOwotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0gICAgdm9pZAkJR2V0UGFyYWxsZWxvZ3JhbShGWFRfUEFSQUwgJnBnKSBjb25zdAotICAgIHsKLSAgICAgICAgcGcueCA9IGxlZnQsIHBnLnkgPSB0b3A7Ci0gICAgICAgIHBnLngxID0gd2lkdGgsIHBnLnkxID0gMDsKLSAgICAgICAgcGcueDIgPSAwLCBwZy55MiA9IGhlaWdodDsKLSAgICB9Ci0gICAgdm9pZAkJVW5pb24oYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkKLSAgICB7Ci0gICAgICAgIGJhc2VUeXBlIHIgPSByaWdodCgpLCBiID0gYm90dG9tKCk7Ci0gICAgICAgIGlmIChsZWZ0ID4geCkgewotICAgICAgICAgICAgbGVmdCA9IHg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHIgPCB4KSB7Ci0gICAgICAgICAgICByID0geDsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9wID4geSkgewotICAgICAgICAgICAgdG9wID0geTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYiA8IHkpIHsKLSAgICAgICAgICAgIGIgPSB5OwotICAgICAgICB9Ci0gICAgICAgIHdpZHRoID0gciAtIGxlZnQ7Ci0gICAgICAgIGhlaWdodCA9IGIgLSB0b3A7Ci0gICAgfQotICAgIHZvaWQJCVVuaW9uKGNvbnN0IEZYVF9QT0lOVCAmcCkKLSAgICB7Ci0gICAgICAgIFVuaW9uKHAueCwgcC55KTsKLSAgICB9Ci0gICAgdm9pZAkJVW5pb24oY29uc3QgRlhUX1JFQ1QgJnJ0KQotICAgIHsKLSAgICAgICAgYmFzZVR5cGUgciA9IHJpZ2h0KCksIGIgPSBib3R0b20oKTsKLSAgICAgICAgaWYgKGxlZnQgPiBydC5sZWZ0KSB7Ci0gICAgICAgICAgICBsZWZ0ID0gcnQubGVmdDsKLSAgICAgICAgfQotICAgICAgICBpZiAociA8IHJ0LnJpZ2h0KCkpIHsKLSAgICAgICAgICAgIHIgPSBydC5yaWdodCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0b3AgPiBydC50b3ApIHsKLSAgICAgICAgICAgIHRvcCA9IHJ0LnRvcDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYiA8IHJ0LmJvdHRvbSgpKSB7Ci0gICAgICAgICAgICBiID0gcnQuYm90dG9tKCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2lkdGggPSByIC0gbGVmdDsKLSAgICAgICAgaGVpZ2h0ID0gYiAtIHRvcDsKLSAgICB9Ci0gICAgdm9pZAkJSW50ZXJzZWN0KGNvbnN0IEZYVF9SRUNUICZydCkKLSAgICB7Ci0gICAgICAgIGJhc2VUeXBlIHIgPSByaWdodCgpLCBiID0gYm90dG9tKCk7Ci0gICAgICAgIGlmIChsZWZ0IDwgcnQubGVmdCkgewotICAgICAgICAgICAgbGVmdCA9IHJ0LmxlZnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHIgPiBydC5yaWdodCgpKSB7Ci0gICAgICAgICAgICByID0gcnQucmlnaHQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9wIDwgcnQudG9wKSB7Ci0gICAgICAgICAgICB0b3AgPSBydC50b3A7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGIgPiBydC5ib3R0b20oKSkgewotICAgICAgICAgICAgYiA9IHJ0LmJvdHRvbSgpOwotICAgICAgICB9Ci0gICAgICAgIHdpZHRoID0gciAtIGxlZnQ7Ci0gICAgICAgIGhlaWdodCA9IGIgLSB0b3A7Ci0gICAgfQotICAgIEZYX0JPT0wJCUludGVyc2VjdFdpdGgoY29uc3QgRlhUX1JFQ1QgJnJ0KSBjb25zdAotICAgIHsKLSAgICAgICAgRlhUX1JFQ1QgcmVjdCA9IHJ0OwotICAgICAgICByZWN0LkludGVyc2VjdCgqdGhpcyk7Ci0gICAgICAgIHJldHVybiAhcmVjdC5Jc0VtcHR5KCk7Ci0gICAgfQotICAgIEZYX0JPT0wJCUludGVyc2VjdFdpdGgoY29uc3QgRlhUX1JFQ1QgJnJ0LCBGWF9GTE9BVCBmRXBzaWxvbikgY29uc3QKLSAgICB7Ci0gICAgICAgIEZYVF9SRUNUIHJlY3QgPSBydDsKLSAgICAgICAgcmVjdC5JbnRlcnNlY3QoKnRoaXMpOwotICAgICAgICByZXR1cm4gIXJlY3QuSXNFbXB0eShmRXBzaWxvbik7Ci0gICAgfQotICAgIGZyaWVuZAlGWF9CT09MCW9wZXJhdG9yID09IChjb25zdCBGWFRfUkVDVCAmcmMxLCBjb25zdCBGWFRfUkVDVCAmcmMyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJjMS5sZWZ0ID09IHJjMi5sZWZ0ICYmIHJjMS50b3AgPT0gcmMyLnRvcCAmJiByYzEud2lkdGggPT0gcmMyLndpZHRoICYmIHJjMS5oZWlnaHQgPT0gcmMyLmhlaWdodDsKLSAgICB9Ci0gICAgZnJpZW5kCUZYX0JPT0wJb3BlcmF0b3IgIT0gKGNvbnN0IEZYVF9SRUNUICZyYzEsIGNvbnN0IEZYVF9SRUNUICZyYzIpCi0gICAgewotICAgICAgICByZXR1cm4gcmMxLmxlZnQgIT0gcmMyLmxlZnQgfHwgcmMxLnRvcCAhPSByYzIudG9wIHx8IHJjMS53aWR0aCAhPSByYzIud2lkdGggfHwgcmMxLmhlaWdodCAhPSByYzIuaGVpZ2h0OwotICAgIH0KLSAgICBiYXNlVHlwZSBsZWZ0LCB0b3A7Ci0gICAgYmFzZVR5cGUgd2lkdGgsIGhlaWdodDsKKyAgICB3aWR0aCA9IHIgLSBsZWZ0OworICAgIGhlaWdodCA9IGIgLSB0b3A7CisgIH0KKyAgRlhfQk9PTCBJbnRlcnNlY3RXaXRoKGNvbnN0IEZYVF9SRUNUJiBydCkgY29uc3QgeworICAgIEZYVF9SRUNUIHJlY3QgPSBydDsKKyAgICByZWN0LkludGVyc2VjdCgqdGhpcyk7CisgICAgcmV0dXJuICFyZWN0LklzRW1wdHkoKTsKKyAgfQorICBGWF9CT09MIEludGVyc2VjdFdpdGgoY29uc3QgRlhUX1JFQ1QmIHJ0LCBGWF9GTE9BVCBmRXBzaWxvbikgY29uc3QgeworICAgIEZYVF9SRUNUIHJlY3QgPSBydDsKKyAgICByZWN0LkludGVyc2VjdCgqdGhpcyk7CisgICAgcmV0dXJuICFyZWN0LklzRW1wdHkoZkVwc2lsb24pOworICB9CisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPT0oY29uc3QgRlhUX1JFQ1QmIHJjMSwgY29uc3QgRlhUX1JFQ1QmIHJjMikgeworICAgIHJldHVybiByYzEubGVmdCA9PSByYzIubGVmdCAmJiByYzEudG9wID09IHJjMi50b3AgJiYKKyAgICAgICAgICAgcmMxLndpZHRoID09IHJjMi53aWR0aCAmJiByYzEuaGVpZ2h0ID09IHJjMi5oZWlnaHQ7CisgIH0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3IhPShjb25zdCBGWFRfUkVDVCYgcmMxLCBjb25zdCBGWFRfUkVDVCYgcmMyKSB7CisgICAgcmV0dXJuIHJjMS5sZWZ0ICE9IHJjMi5sZWZ0IHx8IHJjMS50b3AgIT0gcmMyLnRvcCB8fAorICAgICAgICAgICByYzEud2lkdGggIT0gcmMyLndpZHRoIHx8IHJjMS5oZWlnaHQgIT0gcmMyLmhlaWdodDsKKyAgfQorICBiYXNlVHlwZSBsZWZ0LCB0b3A7CisgIGJhc2VUeXBlIHdpZHRoLCBoZWlnaHQ7CiB9OwotdHlwZWRlZiBDRlhfUlRlbXBsYXRlPGludDMyX3Q+CQkJQ0ZYX1JlY3Q7Ci10eXBlZGVmIENGWF9SVGVtcGxhdGU8RlhfRkxPQVQ+CQkJQ0ZYX1JlY3RGOwotdHlwZWRlZiBDRlhfUlRlbXBsYXRlPGludDMyX3Q+ICoJCUZYX0xQUkVDVDsKLXR5cGVkZWYgQ0ZYX1JUZW1wbGF0ZTxGWF9GTE9BVD4gKgkJRlhfTFBSRUNURjsKLXR5cGVkZWYgQ0ZYX1JUZW1wbGF0ZTxpbnQzMl90PiBjb25zdCAqCUZYX0xQQ1JFQ1Q7Ci10eXBlZGVmIENGWF9SVGVtcGxhdGU8RlhfRkxPQVQ+IGNvbnN0ICoJRlhfTFBDUkVDVEY7Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9SZWN0Rj4JQ0ZYX1JlY3RGQXJyYXk7Cit0eXBlZGVmIENGWF9SVGVtcGxhdGU8aW50MzJfdD4gQ0ZYX1JlY3Q7Cit0eXBlZGVmIENGWF9SVGVtcGxhdGU8RlhfRkxPQVQ+IENGWF9SZWN0RjsKK3R5cGVkZWYgQ0ZYX1JUZW1wbGF0ZTxpbnQzMl90PiogRlhfTFBSRUNUOwordHlwZWRlZiBDRlhfUlRlbXBsYXRlPEZYX0ZMT0FUPiogRlhfTFBSRUNURjsKK3R5cGVkZWYgQ0ZYX1JUZW1wbGF0ZTxpbnQzMl90PiBjb25zdCogRlhfTFBDUkVDVDsKK3R5cGVkZWYgQ0ZYX1JUZW1wbGF0ZTxGWF9GTE9BVD4gY29uc3QqIEZYX0xQQ1JFQ1RGOwordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfUmVjdEY+IENGWF9SZWN0RkFycmF5Owogc3RydWN0IEZYX1JFQ1QgeworICBpbnQgbGVmdDsKIAotICAgIGludAkJCWxlZnQ7CisgIGludCB0b3A7CiAKLSAgICBpbnQJCQl0b3A7CisgIGludCByaWdodDsKIAotICAgIGludAkJCXJpZ2h0OworICBpbnQgYm90dG9tOwogCi0gICAgaW50CQkJYm90dG9tOworICBGWF9SRUNUKCkgOiBsZWZ0KDApLCB0b3AoMCksIHJpZ2h0KDApLCBib3R0b20oMCkge30KIAotICAgIEZYX1JFQ1QoKTogbGVmdCgwKSwgdG9wKDApLCByaWdodCgwKSwgYm90dG9tKDApIHsgfQorICBGWF9SRUNUKGludCBsZWZ0MSwgaW50IHRvcDEsIGludCByaWdodDEsIGludCBib3R0b20xKSB7CisgICAgbGVmdCA9IGxlZnQxOworICAgIHRvcCA9IHRvcDE7CisgICAgcmlnaHQgPSByaWdodDE7CisgICAgYm90dG9tID0gYm90dG9tMTsKKyAgfQogCi0gICAgRlhfUkVDVChpbnQgbGVmdDEsIGludCB0b3AxLCBpbnQgcmlnaHQxLCBpbnQgYm90dG9tMSkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSBsZWZ0MTsKLSAgICAgICAgdG9wID0gdG9wMTsKLSAgICAgICAgcmlnaHQgPSByaWdodDE7Ci0gICAgICAgIGJvdHRvbSA9IGJvdHRvbTE7Ci0gICAgfQorICBpbnQgV2lkdGgoKSBjb25zdCB7IHJldHVybiByaWdodCAtIGxlZnQ7IH0KIAotICAgIGludAkJCVdpZHRoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiByaWdodCAtIGxlZnQ7Ci0gICAgfQorICBpbnQgSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gYm90dG9tIC0gdG9wOyB9CiAKLSAgICBpbnQJCQlIZWlnaHQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGJvdHRvbSAtIHRvcDsKLSAgICB9CisgIEZYX0JPT0wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHJpZ2h0IDw9IGxlZnQgfHwgYm90dG9tIDw9IHRvcDsgfQogCi0gICAgRlhfQk9PTAkJSXNFbXB0eSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gcmlnaHQgPD0gbGVmdCB8fCBib3R0b20gPD0gdG9wOwotICAgIH0KKyAgdm9pZCBOb3JtYWxpemUoKTsKIAotICAgIHZvaWQJCU5vcm1hbGl6ZSgpOworICB2b2lkIEludGVyc2VjdChjb25zdCBGWF9SRUNUJiBzcmMpOwogCi0gICAgdm9pZAkJSW50ZXJzZWN0KGNvbnN0IEZYX1JFQ1QmIHNyYyk7CisgIHZvaWQgSW50ZXJzZWN0KGludCBsZWZ0MSwgaW50IHRvcDEsIGludCByaWdodDEsIGludCBib3R0b20xKSB7CisgICAgSW50ZXJzZWN0KEZYX1JFQ1QobGVmdDEsIHRvcDEsIHJpZ2h0MSwgYm90dG9tMSkpOworICB9CiAKLSAgICB2b2lkCQlJbnRlcnNlY3QoaW50IGxlZnQxLCBpbnQgdG9wMSwgaW50IHJpZ2h0MSwgaW50IGJvdHRvbTEpCi0gICAgewotICAgICAgICBJbnRlcnNlY3QoRlhfUkVDVChsZWZ0MSwgdG9wMSwgcmlnaHQxLCBib3R0b20xKSk7Ci0gICAgfQorICB2b2lkIFVuaW9uKGNvbnN0IEZYX1JFQ1QmIG90aGVyX3JlY3QpOwogCi0gICAgdm9pZAkJVW5pb24oY29uc3QgRlhfUkVDVCYgb3RoZXJfcmVjdCk7CisgIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBGWF9SRUNUJiBzcmMpIGNvbnN0IHsKKyAgICByZXR1cm4gbGVmdCA9PSBzcmMubGVmdCAmJiByaWdodCA9PSBzcmMucmlnaHQgJiYgdG9wID09IHNyYy50b3AgJiYKKyAgICAgICAgICAgYm90dG9tID09IHNyYy5ib3R0b207CisgIH0KIAotICAgIEZYX0JPT0wJCW9wZXJhdG9yID09IChjb25zdCBGWF9SRUNUJiBzcmMpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbGVmdCA9PSBzcmMubGVmdCAmJiByaWdodCA9PSBzcmMucmlnaHQgJiYgdG9wID09IHNyYy50b3AgJiYgYm90dG9tID09IHNyYy5ib3R0b207Ci0gICAgfQorICB2b2lkIE9mZnNldChpbnQgZHgsIGludCBkeSkgeworICAgIGxlZnQgKz0gZHg7CisgICAgcmlnaHQgKz0gZHg7CisgICAgdG9wICs9IGR5OworICAgIGJvdHRvbSArPSBkeTsKKyAgfQogCi0gICAgdm9pZAkJT2Zmc2V0KGludCBkeCwgaW50IGR5KQotICAgIHsKLSAgICAgICAgbGVmdCArPSBkeDsKLSAgICAgICAgcmlnaHQgKz0gZHg7Ci0gICAgICAgIHRvcCArPSBkeTsKLSAgICAgICAgYm90dG9tICs9IGR5OwotICAgIH0KKyAgRlhfQk9PTCBDb250YWlucyhjb25zdCBGWF9SRUNUJiBvdGhlcl9yZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIG90aGVyX3JlY3QubGVmdCA+PSBsZWZ0ICYmIG90aGVyX3JlY3QucmlnaHQgPD0gcmlnaHQgJiYKKyAgICAgICAgICAgb3RoZXJfcmVjdC50b3AgPj0gdG9wICYmIG90aGVyX3JlY3QuYm90dG9tIDw9IGJvdHRvbTsKKyAgfQogCi0gICAgRlhfQk9PTAkJQ29udGFpbnMoY29uc3QgRlhfUkVDVCYgb3RoZXJfcmVjdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBvdGhlcl9yZWN0LmxlZnQgPj0gbGVmdCAmJiBvdGhlcl9yZWN0LnJpZ2h0IDw9IHJpZ2h0ICYmIG90aGVyX3JlY3QudG9wID49IHRvcCAmJiBvdGhlcl9yZWN0LmJvdHRvbSA8PSBib3R0b207Ci0gICAgfQotCi0gICAgRlhfQk9PTAkJQ29udGFpbnMoaW50IHgsIGludCB5KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHggPj0gbGVmdCAmJiB4IDwgcmlnaHQgJiYgeSA+PSB0b3AgJiYgeSA8IGJvdHRvbTsKLSAgICB9CisgIEZYX0JPT0wgQ29udGFpbnMoaW50IHgsIGludCB5KSBjb25zdCB7CisgICAgcmV0dXJuIHggPj0gbGVmdCAmJiB4IDwgcmlnaHQgJiYgeSA+PSB0b3AgJiYgeSA8IGJvdHRvbTsKKyAgfQogfTsKIHN0cnVjdCBGWF9TTUFMTF9SRUNUIHsKKyAgaW50MTZfdCBMZWZ0OwogCi0gICAgaW50MTZfdAlMZWZ0OworICBpbnQxNl90IFRvcDsKIAotICAgIGludDE2X3QJVG9wOworICBpbnQxNl90IFJpZ2h0OwogCi0gICAgaW50MTZfdAlSaWdodDsKLQotICAgIGludDE2X3QJQm90dG9tOworICBpbnQxNl90IEJvdHRvbTsKIH07Ci1jbGFzcyBDRlhfRmxvYXRSZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDRlhfRmxvYXRSZWN0IHsKKyBwdWJsaWM6CisgIENGWF9GbG9hdFJlY3QoKSB7IGxlZnQgPSByaWdodCA9IGJvdHRvbSA9IHRvcCA9IDA7IH0KIAotICAgIENGWF9GbG9hdFJlY3QoKQotICAgIHsKLSAgICAgICAgbGVmdCA9IHJpZ2h0ID0gYm90dG9tID0gdG9wID0gMDsKLSAgICB9CisgIENGWF9GbG9hdFJlY3QoRlhfRkxPQVQgbGVmdDEsCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgYm90dG9tMSwKKyAgICAgICAgICAgICAgICBGWF9GTE9BVCByaWdodDEsCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wMSkgeworICAgIGxlZnQgPSBsZWZ0MTsKKyAgICBib3R0b20gPSBib3R0b20xOworICAgIHJpZ2h0ID0gcmlnaHQxOworICAgIHRvcCA9IHRvcDE7CisgIH0KIAotICAgIENGWF9GbG9hdFJlY3QoRlhfRkxPQVQgbGVmdDEsIEZYX0ZMT0FUIGJvdHRvbTEsIEZYX0ZMT0FUIHJpZ2h0MSwgRlhfRkxPQVQgdG9wMSkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSBsZWZ0MTsKLSAgICAgICAgYm90dG9tID0gYm90dG9tMTsKLSAgICAgICAgcmlnaHQgPSByaWdodDE7Ci0gICAgICAgIHRvcCA9IHRvcDE7Ci0gICAgfQorICBDRlhfRmxvYXRSZWN0KGNvbnN0IEZYX0ZMT0FUKiBwQXJyYXkpIHsKKyAgICBsZWZ0ID0gcEFycmF5WzBdOworICAgIGJvdHRvbSA9IHBBcnJheVsxXTsKKyAgICByaWdodCA9IHBBcnJheVsyXTsKKyAgICB0b3AgPSBwQXJyYXlbM107CisgIH0KIAotICAgIENGWF9GbG9hdFJlY3QoY29uc3QgRlhfRkxPQVQqIHBBcnJheSkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSBwQXJyYXlbMF07Ci0gICAgICAgIGJvdHRvbSA9IHBBcnJheVsxXTsKLSAgICAgICAgcmlnaHQgPSBwQXJyYXlbMl07Ci0gICAgICAgIHRvcCA9IHBBcnJheVszXTsKLSAgICB9CisgIENGWF9GbG9hdFJlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCk7CiAKLSAgICBDRlhfRmxvYXRSZWN0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpOworICBGWF9CT09MIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBsZWZ0ID49IHJpZ2h0IHx8IGJvdHRvbSA+PSB0b3A7IH0KIAotICAgIEZYX0JPT0wJCQkJSXNFbXB0eSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbGVmdCA+PSByaWdodCB8fCBib3R0b20gPj0gdG9wOwotICAgIH0KKyAgdm9pZCBOb3JtYWxpemUoKTsKIAotICAgIHZvaWQJCQkJTm9ybWFsaXplKCk7CisgIHZvaWQgUmVzZXQoKSB7IGxlZnQgPSByaWdodCA9IGJvdHRvbSA9IHRvcCA9IDA7IH0KIAotICAgIHZvaWQJCQkJUmVzZXQoKQotICAgIHsKLSAgICAgICAgbGVmdCA9IHJpZ2h0ID0gYm90dG9tID0gdG9wID0gMDsKLSAgICB9CisgIEZYX0JPT0wgQ29udGFpbnMoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCUNvbnRhaW5zKGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpIGNvbnN0OworICBGWF9CT09MIENvbnRhaW5zKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQlDb250YWlucyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSBjb25zdDsKKyAgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7CiAKLSAgICB2b2lkCQkJCVRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKKyAgdm9pZCBJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCk7CiAKLSAgICB2b2lkCQkJCUludGVyc2VjdChjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KTsKKyAgdm9pZCBVbmlvbihjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KTsKIAotICAgIHZvaWQJCQkJVW5pb24oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCk7CisgIEZYX1JFQ1QgR2V0SW5uZXJSZWN0KCkgY29uc3Q7CiAKLSAgICBGWF9SRUNUCQkJCUdldElubmVyUmVjdCgpIGNvbnN0OworICBGWF9SRUNUIEdldE91dHRlclJlY3QoKSBjb25zdDsKIAotICAgIEZYX1JFQ1QJCQkJR2V0T3V0dGVyUmVjdCgpIGNvbnN0OworICBGWF9SRUNUIEdldENsb3Nlc3RSZWN0KCkgY29uc3Q7CiAKLSAgICBGWF9SRUNUCQkJCUdldENsb3Nlc3RSZWN0KCkgY29uc3Q7CisgIGludCBTdWJzdHJhY3Q0KENGWF9GbG9hdFJlY3QmIHN1YnN0cmFjdF9yZWN0LCBDRlhfRmxvYXRSZWN0KiBwUmVjdHMpOwogCi0gICAgaW50CQkJCQlTdWJzdHJhY3Q0KENGWF9GbG9hdFJlY3QmIHN1YnN0cmFjdF9yZWN0LCBDRlhfRmxvYXRSZWN0KiBwUmVjdHMpOworICB2b2lkIEluaXRSZWN0KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIHsKKyAgICBsZWZ0ID0gcmlnaHQgPSB4OworICAgIGJvdHRvbSA9IHRvcCA9IHk7CisgIH0KIAotICAgIHZvaWQJCQkJSW5pdFJlY3QoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSByaWdodCA9IHg7Ci0gICAgICAgIGJvdHRvbSA9IHRvcCA9IHk7Ci0gICAgfQorICB2b2lkIFVwZGF0ZVJlY3QoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7CiAKLSAgICB2b2lkCQkJCVVwZGF0ZVJlY3QoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7CisgIEZYX0ZMT0FUIFdpZHRoKCkgY29uc3QgeyByZXR1cm4gcmlnaHQgLSBsZWZ0OyB9CiAKLSAgICBGWF9GTE9BVAkJCVdpZHRoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiByaWdodCAtIGxlZnQ7Ci0gICAgfQorICBGWF9GTE9BVCBIZWlnaHQoKSBjb25zdCB7IHJldHVybiB0b3AgLSBib3R0b207IH0KIAotICAgIEZYX0ZMT0FUCQkJSGVpZ2h0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0b3AgLSBib3R0b207Ci0gICAgfQorICB2b2lkIEluZmxhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgeworICAgIE5vcm1hbGl6ZSgpOworICAgIGxlZnQgLT0geDsKKyAgICByaWdodCArPSB4OworICAgIGJvdHRvbSAtPSB5OworICAgIHRvcCArPSB5OworICB9CiAKLSAgICB2b2lkCQkJCUluZmxhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkKLSAgICB7Ci0gICAgICAgIE5vcm1hbGl6ZSgpOwotICAgICAgICBsZWZ0IC09IHg7Ci0gICAgICAgIHJpZ2h0ICs9IHg7Ci0gICAgICAgIGJvdHRvbSAtPSB5OwotICAgICAgICB0b3AgKz0geTsKLSAgICB9CisgIHZvaWQgSW5mbGF0ZShGWF9GTE9BVCBvdGhlcl9sZWZ0LAorICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfYm90dG9tLAorICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfcmlnaHQsCisgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl90b3ApIHsKKyAgICBOb3JtYWxpemUoKTsKKyAgICBsZWZ0IC09IG90aGVyX2xlZnQ7CisgICAgYm90dG9tIC09IG90aGVyX2JvdHRvbTsKKyAgICByaWdodCArPSBvdGhlcl9yaWdodDsKKyAgICB0b3AgKz0gb3RoZXJfdG9wOworICB9CiAKLSAgICB2b2lkIEluZmxhdGUoRlhfRkxPQVQgb3RoZXJfbGVmdCwKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfYm90dG9tLAotICAgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl9yaWdodCwKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfdG9wKQotICAgIHsKLSAgICAgICAgTm9ybWFsaXplKCk7Ci0gICAgICAgIGxlZnQgLT0gb3RoZXJfbGVmdDsKLSAgICAgICAgYm90dG9tIC09IG90aGVyX2JvdHRvbTsKLSAgICAgICAgcmlnaHQgKz0gb3RoZXJfcmlnaHQ7Ci0gICAgICAgIHRvcCArPSBvdGhlcl90b3A7Ci0gICAgfQorICB2b2lkIEluZmxhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcnQpIHsKKyAgICBJbmZsYXRlKHJ0LmxlZnQsIHJ0LmJvdHRvbSwgcnQucmlnaHQsIHJ0LnRvcCk7CisgIH0KIAotICAgIHZvaWQgSW5mbGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0ICZydCkKLSAgICB7Ci0gICAgICAgIEluZmxhdGUocnQubGVmdCwgcnQuYm90dG9tLCBydC5yaWdodCwgcnQudG9wKTsKLSAgICB9CisgIHZvaWQgRGVmbGF0ZShGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSB7CisgICAgTm9ybWFsaXplKCk7CisgICAgbGVmdCArPSB4OworICAgIHJpZ2h0IC09IHg7CisgICAgYm90dG9tICs9IHk7CisgICAgdG9wIC09IHk7CisgIH0KIAotICAgIHZvaWQgRGVmbGF0ZShGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KQotICAgIHsKLSAgICAgICAgTm9ybWFsaXplKCk7Ci0gICAgICAgIGxlZnQgKz0geDsKLSAgICAgICAgcmlnaHQgLT0geDsKLSAgICAgICAgYm90dG9tICs9IHk7Ci0gICAgICAgIHRvcCAtPSB5OwotICAgIH0KKyAgdm9pZCBEZWZsYXRlKEZYX0ZMT0FUIG90aGVyX2xlZnQsCisgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl9ib3R0b20sCisgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl9yaWdodCwKKyAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3RvcCkgeworICAgIE5vcm1hbGl6ZSgpOworICAgIGxlZnQgKz0gb3RoZXJfbGVmdDsKKyAgICBib3R0b20gKz0gb3RoZXJfYm90dG9tOworICAgIHJpZ2h0IC09IG90aGVyX3JpZ2h0OworICAgIHRvcCAtPSBvdGhlcl90b3A7CisgIH0KIAotICAgIHZvaWQgRGVmbGF0ZShGWF9GTE9BVCBvdGhlcl9sZWZ0LAotICAgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl9ib3R0b20sCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3JpZ2h0LAotICAgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl90b3ApCi0gICAgewotICAgICAgICBOb3JtYWxpemUoKTsKLSAgICAgICAgbGVmdCArPSBvdGhlcl9sZWZ0OwotICAgICAgICBib3R0b20gKz0gb3RoZXJfYm90dG9tOwotICAgICAgICByaWdodCAtPSBvdGhlcl9yaWdodDsKLSAgICAgICAgdG9wIC09IG90aGVyX3RvcDsKLSAgICB9CisgIHZvaWQgRGVmbGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiBydCkgeworICAgIERlZmxhdGUocnQubGVmdCwgcnQuYm90dG9tLCBydC5yaWdodCwgcnQudG9wKTsKKyAgfQogCi0gICAgdm9pZCBEZWZsYXRlKGNvbnN0IENGWF9GbG9hdFJlY3QgJnJ0KQotICAgIHsKLSAgICAgICAgRGVmbGF0ZShydC5sZWZ0LCBydC5ib3R0b20sIHJ0LnJpZ2h0LCBydC50b3ApOwotICAgIH0KKyAgdm9pZCBUcmFuc2xhdGUoRlhfRkxPQVQgZSwgRlhfRkxPQVQgZikgeworICAgIGxlZnQgKz0gZTsKKyAgICByaWdodCArPSBlOworICAgIHRvcCArPSBmOworICAgIGJvdHRvbSArPSBmOworICB9CiAKLSAgICB2b2lkIFRyYW5zbGF0ZShGWF9GTE9BVCBlLCBGWF9GTE9BVCBmKQotICAgIHsKLSAgICAgICAgbGVmdCArPSBlOwotICAgICAgICByaWdodCArPSBlOwotICAgICAgICB0b3AgKz0gZjsKLSAgICAgICAgYm90dG9tICs9IGY7Ci0gICAgfQorICBzdGF0aWMgQ0ZYX0Zsb2F0UmVjdCBHZXRCQm94KGNvbnN0IENGWF9GbG9hdFBvaW50KiBwUG9pbnRzLCBpbnQgblBvaW50cyk7CiAKLSAgICBzdGF0aWMgQ0ZYX0Zsb2F0UmVjdAlHZXRCQm94KGNvbnN0IENGWF9GbG9hdFBvaW50KiBwUG9pbnRzLCBpbnQgblBvaW50cyk7CisgIEZYX0ZMT0FUIGxlZnQ7CiAKLSAgICBGWF9GTE9BVAkJCWxlZnQ7CisgIEZYX0ZMT0FUIHJpZ2h0OwogCi0gICAgRlhfRkxPQVQJCQlyaWdodDsKKyAgRlhfRkxPQVQgYm90dG9tOwogCi0gICAgRlhfRkxPQVQJCQlib3R0b207Ci0KLSAgICBGWF9GTE9BVAkJCXRvcDsKKyAgRlhfRkxPQVQgdG9wOwogfTsKLWNsYXNzIENGWF9NYXRyaXgKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9NYXRyaXggeworIHB1YmxpYzoKKyAgQ0ZYX01hdHJpeCgpIHsKKyAgICBhID0gZCA9IDE7CisgICAgYiA9IGMgPSBlID0gZiA9IDA7CisgIH0KIAotICAgIENGWF9NYXRyaXgoKQotICAgIHsKLSAgICAgICAgYSA9IGQgPSAxOwotICAgICAgICBiID0gYyA9IGUgPSBmID0gMDsKLSAgICB9CisgIENGWF9NYXRyaXgoRlhfRkxPQVQgYTEsCisgICAgICAgICAgICAgRlhfRkxPQVQgYjEsCisgICAgICAgICAgICAgRlhfRkxPQVQgYzEsCisgICAgICAgICAgICAgRlhfRkxPQVQgZDEsCisgICAgICAgICAgICAgRlhfRkxPQVQgZTEsCisgICAgICAgICAgICAgRlhfRkxPQVQgZjEpIHsKKyAgICBhID0gYTE7CisgICAgYiA9IGIxOworICAgIGMgPSBjMTsKKyAgICBkID0gZDE7CisgICAgZSA9IGUxOworICAgIGYgPSBmMTsKKyAgfQogCi0gICAgQ0ZYX01hdHJpeChGWF9GTE9BVCBhMSwgRlhfRkxPQVQgYjEsIEZYX0ZMT0FUIGMxLCBGWF9GTE9BVCBkMSwgRlhfRkxPQVQgZTEsIEZYX0ZMT0FUIGYxKQotICAgIHsKLSAgICAgICAgYSA9IGExOwotICAgICAgICBiID0gYjE7Ci0gICAgICAgIGMgPSBjMTsKLSAgICAgICAgZCA9IGQxOwotICAgICAgICBlID0gZTE7Ci0gICAgICAgIGYgPSBmMTsKLSAgICB9CisgIHZvaWQgU2V0KEZYX0ZMT0FUIGEsCisgICAgICAgICAgIEZYX0ZMT0FUIGIsCisgICAgICAgICAgIEZYX0ZMT0FUIGMsCisgICAgICAgICAgIEZYX0ZMT0FUIGQsCisgICAgICAgICAgIEZYX0ZMT0FUIGUsCisgICAgICAgICAgIEZYX0ZMT0FUIGYpOworICB2b2lkIFNldChjb25zdCBGWF9GTE9BVCBuWzZdKTsKIAotICAgIHZvaWQJCQlTZXQoRlhfRkxPQVQgYSwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgZCwgRlhfRkxPQVQgZSwgRlhfRkxPQVQgZik7Ci0gICAgdm9pZAkJCVNldChjb25zdCBGWF9GTE9BVCBuWzZdKTsKKyAgdm9pZCBTZXRJZGVudGl0eSgpIHsKKyAgICBhID0gZCA9IDE7CisgICAgYiA9IGMgPSBlID0gZiA9IDA7CisgIH0KIAotICAgIHZvaWQJCQlTZXRJZGVudGl0eSgpCi0gICAgewotICAgICAgICBhID0gZCA9IDE7Ci0gICAgICAgIGIgPSBjID0gZSA9IGYgPSAwOwotICAgIH0KKyAgdm9pZCBTZXRSZXZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIG0pOwogCi0gICAgdm9pZAkJCVNldFJldmVyc2UoY29uc3QgQ0ZYX01hdHJpeCAmbSk7CisgIHZvaWQgQ29uY2F0KEZYX0ZMT0FUIGEsCisgICAgICAgICAgICAgIEZYX0ZMT0FUIGIsCisgICAgICAgICAgICAgIEZYX0ZMT0FUIGMsCisgICAgICAgICAgICAgIEZYX0ZMT0FUIGQsCisgICAgICAgICAgICAgIEZYX0ZMT0FUIGUsCisgICAgICAgICAgICAgIEZYX0ZMT0FUIGYsCisgICAgICAgICAgICAgIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKIAotICAgIHZvaWQJCQlDb25jYXQoRlhfRkxPQVQgYSwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgZCwgRlhfRkxPQVQgZSwgRlhfRkxPQVQgZiwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICB2b2lkIENvbmNhdChjb25zdCBDRlhfTWF0cml4JiBtLCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CiAKLSAgICB2b2lkCQkJQ29uY2F0KGNvbnN0IENGWF9NYXRyaXggJm0sIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgdm9pZCBDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIG0sIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgdm9pZCBSZXNldCgpIHsgU2V0SWRlbnRpdHkoKTsgfQogCi0gICAgdm9pZAkJCUNvbmNhdEludmVyc2UoY29uc3QgQ0ZYX01hdHJpeCYgbSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOwotICAgIHZvaWQJCQlSZXNldCgpCi0gICAgewotICAgICAgICBTZXRJZGVudGl0eSgpOwotICAgIH0KKyAgdm9pZCBDb3B5KGNvbnN0IENGWF9NYXRyaXgmIG0pIHsgKnRoaXMgPSBtOyB9CiAKLSAgICB2b2lkCQkJQ29weShjb25zdCBDRlhfTWF0cml4JiBtKQotICAgIHsKLSAgICAgICAgKnRoaXMgPSBtOwotICAgIH0KKyAgRlhfQk9PTCBJc0lkZW50aXR5KCkgY29uc3QgeworICAgIHJldHVybiBhID09IDEgJiYgYiA9PSAwICYmIGMgPT0gMCAmJiBkID09IDEgJiYgZSA9PSAwICYmIGYgPT0gMDsKKyAgfQorICBGWF9CT09MIElzSW52ZXJ0aWJsZSgpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCUlzSWRlbnRpdHkoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGEgPT0gMSAmJiBiID09IDAgJiYgYyA9PSAwICYmIGQgPT0gMSAmJiBlID09IDAgJiYgZiA9PSAwOwotICAgIH0KLSAgICBGWF9CT09MCQkJSXNJbnZlcnRpYmxlKCkgY29uc3Q7CisgIEZYX0JPT0wgSXM5MFJvdGF0ZWQoKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQlJczkwUm90YXRlZCgpIGNvbnN0OworICBGWF9CT09MIElzU2NhbGVkKCkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJSXNTY2FsZWQoKSBjb25zdDsKKyAgdm9pZCBUcmFuc2xhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCVRyYW5zbGF0ZShGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CisgIHZvaWQgVHJhbnNsYXRlSShpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpIHsKKyAgICBUcmFuc2xhdGUoKEZYX0ZMT0FUKXgsIChGWF9GTE9BVCl5LCBiUHJlcGVuZGVkKTsKKyAgfQogCi0gICAgdm9pZAkJCVRyYW5zbGF0ZUkoaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKQotICAgIHsKLSAgICAgICAgVHJhbnNsYXRlKChGWF9GTE9BVCl4LCAoRlhfRkxPQVQpeSwgYlByZXBlbmRlZCk7Ci0gICAgfQorICB2b2lkIFNjYWxlKEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCVNjYWxlKEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICB2b2lkIFJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CiAKLSAgICB2b2lkCQkJUm90YXRlKEZYX0ZMT0FUIGZSYWRpYW4sIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgdm9pZCBSb3RhdGVBdChGWF9GTE9BVCBmUmFkaWFuLAorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CiAKLSAgICB2b2lkCQkJUm90YXRlQXQoRlhfRkxPQVQgZlJhZGlhbiwgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICB2b2lkIFNoZWFyKEZYX0ZMT0FUIGZBbHBoYVJhZGlhbiwKKyAgICAgICAgICAgICBGWF9GTE9BVCBmQmV0YVJhZGlhbiwKKyAgICAgICAgICAgICBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CiAKLSAgICB2b2lkCQkJU2hlYXIoRlhfRkxPQVQgZkFscGhhUmFkaWFuLCBGWF9GTE9BVCBmQmV0YVJhZGlhbiwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICB2b2lkIE1hdGNoUmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiBkZXN0LCBjb25zdCBDRlhfRmxvYXRSZWN0JiBzcmMpOwogCi0gICAgdm9pZAkJCU1hdGNoUmVjdChjb25zdCBDRlhfRmxvYXRSZWN0ICZkZXN0LCBjb25zdCBDRlhfRmxvYXRSZWN0ICZzcmMpOworICBGWF9GTE9BVCBHZXRYVW5pdCgpIGNvbnN0OwogCi0gICAgRlhfRkxPQVQJCUdldFhVbml0KCkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldFlVbml0KCkgY29uc3Q7CisgIHZvaWQgR2V0VW5pdFJlY3QoQ0ZYX1JlY3RGJiByZWN0KSBjb25zdDsKIAotICAgIEZYX0ZMT0FUCQlHZXRZVW5pdCgpIGNvbnN0OwotICAgIHZvaWQJCQlHZXRVbml0UmVjdChDRlhfUmVjdEYgJnJlY3QpIGNvbnN0OworICBDRlhfRmxvYXRSZWN0IEdldFVuaXRSZWN0KCkgY29uc3Q7CiAKLSAgICBDRlhfRmxvYXRSZWN0CUdldFVuaXRSZWN0KCkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldFVuaXRBcmVhKCkgY29uc3Q7CisgIEZYX0ZMT0FUIFRyYW5zZm9ybVhEaXN0YW5jZShGWF9GTE9BVCBkeCkgY29uc3Q7CisgIGludDMyX3QgVHJhbnNmb3JtWERpc3RhbmNlKGludDMyX3QgZHgpIGNvbnN0OworICBGWF9GTE9BVCBUcmFuc2Zvcm1ZRGlzdGFuY2UoRlhfRkxPQVQgZHkpIGNvbnN0OworICBpbnQzMl90IFRyYW5zZm9ybVlEaXN0YW5jZShpbnQzMl90IGR5KSBjb25zdDsKKyAgRlhfRkxPQVQgVHJhbnNmb3JtRGlzdGFuY2UoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KSBjb25zdDsKKyAgaW50MzJfdCBUcmFuc2Zvcm1EaXN0YW5jZShpbnQzMl90IGR4LCBpbnQzMl90IGR5KSBjb25zdDsKIAotICAgIEZYX0ZMT0FUCQlHZXRVbml0QXJlYSgpIGNvbnN0OwotICAgIEZYX0ZMT0FUCQlUcmFuc2Zvcm1YRGlzdGFuY2UoRlhfRkxPQVQgZHgpIGNvbnN0OwotICAgIGludDMyX3QJCVRyYW5zZm9ybVhEaXN0YW5jZShpbnQzMl90IGR4KSBjb25zdDsKLSAgICBGWF9GTE9BVAkJVHJhbnNmb3JtWURpc3RhbmNlKEZYX0ZMT0FUIGR5KSBjb25zdDsKLSAgICBpbnQzMl90CQlUcmFuc2Zvcm1ZRGlzdGFuY2UoaW50MzJfdCBkeSkgY29uc3Q7Ci0gICAgRlhfRkxPQVQJCVRyYW5zZm9ybURpc3RhbmNlKEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSkgY29uc3Q7Ci0gICAgaW50MzJfdAkJVHJhbnNmb3JtRGlzdGFuY2UoaW50MzJfdCBkeCwgaW50MzJfdCBkeSkgY29uc3Q7CisgIEZYX0ZMT0FUIFRyYW5zZm9ybURpc3RhbmNlKEZYX0ZMT0FUIGRpc3RhbmNlKSBjb25zdDsKKyAgdm9pZCBUcmFuc2Zvcm1Qb2ludChGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpIGNvbnN0OworICB2b2lkIFRyYW5zZm9ybVBvaW50KGludDMyX3QmIHgsIGludDMyX3QmIHkpIGNvbnN0OworICB2b2lkIFRyYW5zZm9ybVBvaW50cyhDRlhfUG9pbnRGKiBwb2ludHMsIGludDMyX3QgaUNvdW50KSBjb25zdDsKKyAgdm9pZCBUcmFuc2Zvcm1Qb2ludHMoQ0ZYX1BvaW50KiBwb2ludHMsIGludDMyX3QgaUNvdW50KSBjb25zdDsKIAotICAgIEZYX0ZMT0FUCQlUcmFuc2Zvcm1EaXN0YW5jZShGWF9GTE9BVCBkaXN0YW5jZSkgY29uc3Q7Ci0gICAgdm9pZAkJCVRyYW5zZm9ybVBvaW50KEZYX0ZMT0FUICZ4LCBGWF9GTE9BVCAmeSkgY29uc3Q7Ci0gICAgdm9pZAkJCVRyYW5zZm9ybVBvaW50KGludDMyX3QgJngsIGludDMyX3QgJnkpIGNvbnN0OwotICAgIHZvaWQJCQlUcmFuc2Zvcm1Qb2ludHMoQ0ZYX1BvaW50RiAqcG9pbnRzLCBpbnQzMl90IGlDb3VudCkgY29uc3Q7Ci0gICAgdm9pZAkJCVRyYW5zZm9ybVBvaW50cyhDRlhfUG9pbnQgKnBvaW50cywgaW50MzJfdCBpQ291bnQpIGNvbnN0OworICB2b2lkIFRyYW5zZm9ybShGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpIGNvbnN0IHsgVHJhbnNmb3JtUG9pbnQoeCwgeSk7IH0KIAotICAgIHZvaWQJCQlUcmFuc2Zvcm0oRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KSBjb25zdAotICAgIHsKLSAgICAgICAgVHJhbnNmb3JtUG9pbnQoeCwgeSk7Ci0gICAgfQorICB2b2lkIFRyYW5zZm9ybShGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCYgeDEsIEZYX0ZMT0FUJiB5MSkgY29uc3QgeworICAgIHgxID0geCwgeTEgPSB5OworICAgIFRyYW5zZm9ybVBvaW50KHgxLCB5MSk7CisgIH0KKyAgdm9pZCBUcmFuc2Zvcm1WZWN0b3IoQ0ZYX1ZlY3RvckYmIHYpIGNvbnN0OworICB2b2lkIFRyYW5zZm9ybVZlY3RvcihDRlhfVmVjdG9yJiB2KSBjb25zdDsKKyAgdm9pZCBUcmFuc2Zvcm1SZWN0KENGWF9SZWN0RiYgcmVjdCkgY29uc3Q7CisgIHZvaWQgVHJhbnNmb3JtUmVjdChDRlhfUmVjdCYgcmVjdCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJVHJhbnNmb3JtKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUJiB4MSwgRlhfRkxPQVQmIHkxKSBjb25zdAotICAgIHsKLSAgICAgICAgeDEgPSB4LCB5MSA9IHk7Ci0gICAgICAgIFRyYW5zZm9ybVBvaW50KHgxLCB5MSk7Ci0gICAgfQotICAgIHZvaWQJCQlUcmFuc2Zvcm1WZWN0b3IoQ0ZYX1ZlY3RvckYgJnYpIGNvbnN0OwotICAgIHZvaWQJCQlUcmFuc2Zvcm1WZWN0b3IoQ0ZYX1ZlY3RvciAmdikgY29uc3Q7Ci0gICAgdm9pZAkJCVRyYW5zZm9ybVJlY3QoQ0ZYX1JlY3RGICZyZWN0KSBjb25zdDsKLSAgICB2b2lkCQkJVHJhbnNmb3JtUmVjdChDRlhfUmVjdCAmcmVjdCkgY29uc3Q7CisgIHZvaWQgVHJhbnNmb3JtUmVjdChGWF9GTE9BVCYgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB0b3AsCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYm90dG9tKSBjb25zdDsKIAotICAgIHZvaWQJCQlUcmFuc2Zvcm1SZWN0KEZYX0ZMT0FUJiBsZWZ0LCBGWF9GTE9BVCYgcmlnaHQsIEZYX0ZMT0FUJiB0b3AsIEZYX0ZMT0FUJiBib3R0b20pIGNvbnN0OworICB2b2lkIFRyYW5zZm9ybVJlY3QoQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QgeworICAgIFRyYW5zZm9ybVJlY3QocmVjdC5sZWZ0LCByZWN0LnJpZ2h0LCByZWN0LnRvcCwgcmVjdC5ib3R0b20pOworICB9CiAKLSAgICB2b2lkCQkJVHJhbnNmb3JtUmVjdChDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdAotICAgIHsKLSAgICAgICAgVHJhbnNmb3JtUmVjdChyZWN0LmxlZnQsIHJlY3QucmlnaHQsIHJlY3QudG9wLCByZWN0LmJvdHRvbSk7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRBKCkgY29uc3QgeyByZXR1cm4gYTsgfQogCi0gICAgRlhfRkxPQVQJCUdldEEoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGE7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRCKCkgY29uc3QgeyByZXR1cm4gYjsgfQogCi0gICAgRlhfRkxPQVQJCUdldEIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRDKCkgY29uc3QgeyByZXR1cm4gYzsgfQogCi0gICAgRlhfRkxPQVQJCUdldEMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQorICBGWF9GTE9BVCBHZXREKCkgY29uc3QgeyByZXR1cm4gZDsgfQogCi0gICAgRlhfRkxPQVQJCUdldEQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRFKCkgY29uc3QgeyByZXR1cm4gZTsgfQogCi0gICAgRlhfRkxPQVQJCUdldEUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRGKCkgY29uc3QgeyByZXR1cm4gZjsgfQogCi0gICAgRlhfRkxPQVQJCUdldEYoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGY7Ci0gICAgfQotcHVibGljOgotICAgIEZYX0ZMT0FUIGE7Ci0gICAgRlhfRkxPQVQgYjsKLSAgICBGWF9GTE9BVCBjOwotICAgIEZYX0ZMT0FUIGQ7Ci0gICAgRlhfRkxPQVQgZTsKLSAgICBGWF9GTE9BVCBmOworIHB1YmxpYzoKKyAgRlhfRkxPQVQgYTsKKyAgRlhfRkxPQVQgYjsKKyAgRlhfRkxPQVQgYzsKKyAgRlhfRkxPQVQgZDsKKyAgRlhfRkxPQVQgZTsKKyAgRlhfRkxPQVQgZjsKIH07Ci0jZGVmaW5lIENGWF9BZmZpbmVNYXRyaXgJQ0ZYX01hdHJpeAorI2RlZmluZSBDRlhfQWZmaW5lTWF0cml4IENGWF9NYXRyaXgKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlhDUlRfRlhfQ09PUkRJTkFURVNfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaAppbmRleCA1NWU1MjJhLi4wODUzYzg5IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oCkBAIC0xNCwzMyArMTQsMzcgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLUZYX0ZMT0FUCQlGWFNZU190YW4oRlhfRkxPQVQgYSk7Ci1GWF9GTE9BVAkJRlhTWVNfbG9nYihGWF9GTE9BVCBiLCBGWF9GTE9BVCB4KTsKLUZYX0ZMT0FUCQlGWFNZU19zdHJ0b2YoY29uc3QgRlhfQ0hBUiogcGNzU3RyLCBpbnQzMl90IGlMZW5ndGggPSAtMSwgaW50MzJfdCAqcFVzZWRMZW4gPSBOVUxMKTsKLUZYX0ZMT0FUCQlGWFNZU193Y3N0b2YoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoID0gLTEsIGludDMyX3QgKnBVc2VkTGVuID0gTlVMTCk7Ci1GWF9XQ0hBUioJCUZYU1lTX3djc25jcHkoRlhfV0NIQVIqIGRzdFN0ciwgY29uc3QgRlhfV0NIQVIqIHNyY1N0ciwgc2l6ZV90IGNvdW50KTsKLWludDMyX3QJCUZYU1lTX3djc25pY21wKGNvbnN0IEZYX1dDSEFSKiBzMSwgY29uc3QgRlhfV0NIQVIqIHMyLCBzaXplX3QgY291bnQpOwotaW50MzJfdAkJRlhTWVNfc3RybmljbXAoY29uc3QgRlhfQ0hBUiogczEsIGNvbnN0IEZYX0NIQVIqIHMyLCBzaXplX3QgY291bnQpOworRlhfRkxPQVQgRlhTWVNfdGFuKEZYX0ZMT0FUIGEpOworRlhfRkxPQVQgRlhTWVNfbG9nYihGWF9GTE9BVCBiLCBGWF9GTE9BVCB4KTsKK0ZYX0ZMT0FUIEZYU1lTX3N0cnRvZihjb25zdCBGWF9DSEFSKiBwY3NTdHIsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFVzZWRMZW4gPSBOVUxMKTsKK0ZYX0ZMT0FUIEZYU1lTX3djc3RvZihjb25zdCBGWF9XQ0hBUiogcHdzU3RyLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBVc2VkTGVuID0gTlVMTCk7CitGWF9XQ0hBUiogRlhTWVNfd2NzbmNweShGWF9XQ0hBUiogZHN0U3RyLCBjb25zdCBGWF9XQ0hBUiogc3JjU3RyLCBzaXplX3QgY291bnQpOworaW50MzJfdCBGWFNZU193Y3NuaWNtcChjb25zdCBGWF9XQ0hBUiogczEsIGNvbnN0IEZYX1dDSEFSKiBzMiwgc2l6ZV90IGNvdW50KTsKK2ludDMyX3QgRlhTWVNfc3RybmljbXAoY29uc3QgRlhfQ0hBUiogczEsIGNvbnN0IEZYX0NIQVIqIHMyLCBzaXplX3QgY291bnQpOwogCi1pbmxpbmUgRlhfQk9PTAlGWFNZU19pc2xvd2VyKGludDMyX3QgY2gpCi17Ci0gICAgcmV0dXJuIGNoID49ICdhJyAmJiBjaCA8PSAneic7CitpbmxpbmUgRlhfQk9PTCBGWFNZU19pc2xvd2VyKGludDMyX3QgY2gpIHsKKyAgcmV0dXJuIGNoID49ICdhJyAmJiBjaCA8PSAneic7CiB9Ci1pbmxpbmUgRlhfQk9PTAlGWFNZU19pc3VwcGVyKGludDMyX3QgY2gpCi17Ci0gICAgcmV0dXJuIGNoID49ICdBJyAmJiBjaCA8PSAnWic7CitpbmxpbmUgRlhfQk9PTCBGWFNZU19pc3VwcGVyKGludDMyX3QgY2gpIHsKKyAgcmV0dXJuIGNoID49ICdBJyAmJiBjaCA8PSAnWic7CiB9Ci1pbmxpbmUgaW50MzJfdAlGWFNZU190b2xvd2VyKGludDMyX3QgY2gpCi17Ci0gICAgcmV0dXJuIGNoIDwgJ0EnIHx8IGNoID4gJ1onID8gY2ggOiAoY2ggKyAweDIwKTsKK2lubGluZSBpbnQzMl90IEZYU1lTX3RvbG93ZXIoaW50MzJfdCBjaCkgeworICByZXR1cm4gY2ggPCAnQScgfHwgY2ggPiAnWicgPyBjaCA6IChjaCArIDB4MjApOwogfQotaW5saW5lIGludDMyX3QgRlhTWVNfdG91cHBlcihpbnQzMl90IGNoKQotewotICAgIHJldHVybiBjaCA8ICdhJyB8fCBjaCA+ICd6JyA/IGNoIDogKGNoIC0gMHgyMCk7CitpbmxpbmUgaW50MzJfdCBGWFNZU190b3VwcGVyKGludDMyX3QgY2gpIHsKKyAgcmV0dXJuIGNoIDwgJ2EnIHx8IGNoID4gJ3onID8gY2ggOiAoY2ggLSAweDIwKTsKIH0KIAotRlhfRFdPUkQJRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBGWF9CT09MIGJJZ25vcmVDYXNlID0gRkFMU0UpOwotRlhfRFdPUkQJRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCwgRlhfQk9PTCBiSWdub3JlQ2FzZSA9IEZBTFNFKTsKK0ZYX0RXT1JEIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKGNvbnN0IEZYX0NIQVIqIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVDYXNlID0gRkFMU0UpOworRlhfRFdPUkQgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoY29uc3QgRlhfV0NIQVIqIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVDYXNlID0gRkFMU0UpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KQEAgLTQ5LDE3ICs1MywxNyBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotdm9pZCoJRlhfUmFuZG9tX01UX1N0YXJ0KEZYX0RXT1JEIGR3U2VlZCk7Cit2b2lkKiBGWF9SYW5kb21fTVRfU3RhcnQoRlhfRFdPUkQgZHdTZWVkKTsKIAotRlhfRFdPUkQJRlhfUmFuZG9tX01UX0dlbmVyYXRlKHZvaWQqIHBDb250ZXh0KTsKK0ZYX0RXT1JEIEZYX1JhbmRvbV9NVF9HZW5lcmF0ZSh2b2lkKiBwQ29udGV4dCk7CiAKLXZvaWQJCUZYX1JhbmRvbV9NVF9DbG9zZSh2b2lkKiBwQ29udGV4dCk7Cit2b2lkIEZYX1JhbmRvbV9NVF9DbG9zZSh2b2lkKiBwQ29udGV4dCk7CiAKLXZvaWQJCUZYX1JhbmRvbV9HZW5lcmF0ZUJhc2UoRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KTsKK3ZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlQmFzZShGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpOwogCi12b2lkCQlGWF9SYW5kb21fR2VuZXJhdGVNVChGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpOwordm9pZCBGWF9SYW5kb21fR2VuZXJhdGVNVChGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpOwogCi12b2lkCQlGWF9SYW5kb21fR2VuZXJhdGVDcnlwdG8oRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KTsKK3ZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlQ3J5cHRvKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCk7CiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpAQCAtNjgsNDIgKzcyLDQyIEBACiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgRlhfR1VJRCB7Ci0gICAgRlhfRFdPUkQJZGF0YTE7Ci0gICAgRlhfV09SRAkJZGF0YTI7Ci0gICAgRlhfV09SRAkJZGF0YTM7Ci0gICAgdWludDhfdAkJZGF0YTRbOF07Ci19IEZYX0dVSUQsICogRlhfTFBHVUlEOwotdHlwZWRlZiBGWF9HVUlEIGNvbnN0ICogRlhfTFBDR1VJRDsKKyAgRlhfRFdPUkQgZGF0YTE7CisgIEZYX1dPUkQgZGF0YTI7CisgIEZYX1dPUkQgZGF0YTM7CisgIHVpbnQ4X3QgZGF0YTRbOF07Cit9IEZYX0dVSUQsICpGWF9MUEdVSUQ7Cit0eXBlZGVmIEZYX0dVSUQgY29uc3QqIEZYX0xQQ0dVSUQ7CiAKLXZvaWQJRlhfR1VJRF9DcmVhdGVWNChGWF9MUEdVSUQgcEdVSUQpOwordm9pZCBGWF9HVUlEX0NyZWF0ZVY0KEZYX0xQR1VJRCBwR1VJRCk7CiAKLXZvaWQJRlhfR1VJRF9Ub1N0cmluZyhGWF9MUENHVUlEIHBHVUlELCBDRlhfQnl0ZVN0cmluZyAmYnNTdHIsIEZYX0JPT0wgYlNlcGFyYXRvciA9IFRSVUUpOwordm9pZCBGWF9HVUlEX1RvU3RyaW5nKEZYX0xQQ0dVSUQgcEdVSUQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGJzU3RyLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlcGFyYXRvciA9IFRSVUUpOwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKLXRlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPgotY2xhc3MgQ0ZYX1NTb3J0VGVtcGxhdGUKLXsKLXB1YmxpYzoKLSAgICB2b2lkIFNoZWxsU29ydChiYXNlVHlwZSAqcEFycmF5LCBpbnQzMl90IGlDb3VudCkKLSAgICB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChwQXJyYXkgIT0gTlVMTCAmJiBpQ291bnQgPiAwKTsKLSAgICAgICAgaW50MzJfdCBpLCBqLCBnYXA7Ci0gICAgICAgIGJhc2VUeXBlIHYxLCB2MjsKLSAgICAgICAgZ2FwID0gaUNvdW50ID4+IDE7Ci0gICAgICAgIHdoaWxlIChnYXAgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBnYXA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBqID0gaSAtIGdhcDsKLSAgICAgICAgICAgICAgICB2MSA9IHBBcnJheVtpXTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaiA+IC0xICYmICh2MiA9IHBBcnJheVtqXSkgPiB2MSkgewotICAgICAgICAgICAgICAgICAgICBwQXJyYXlbaiArIGdhcF0gPSB2MjsKLSAgICAgICAgICAgICAgICAgICAgaiAtPSBnYXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBBcnJheVtqICsgZ2FwXSA9IHYxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2FwID4+PSAxOwordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgorY2xhc3MgQ0ZYX1NTb3J0VGVtcGxhdGUgeworIHB1YmxpYzoKKyAgdm9pZCBTaGVsbFNvcnQoYmFzZVR5cGUqIHBBcnJheSwgaW50MzJfdCBpQ291bnQpIHsKKyAgICBGWFNZU19hc3NlcnQocEFycmF5ICE9IE5VTEwgJiYgaUNvdW50ID4gMCk7CisgICAgaW50MzJfdCBpLCBqLCBnYXA7CisgICAgYmFzZVR5cGUgdjEsIHYyOworICAgIGdhcCA9IGlDb3VudCA+PiAxOworICAgIHdoaWxlIChnYXAgPiAwKSB7CisgICAgICBmb3IgKGkgPSBnYXA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgICBqID0gaSAtIGdhcDsKKyAgICAgICAgdjEgPSBwQXJyYXlbaV07CisgICAgICAgIHdoaWxlIChqID4gLTEgJiYgKHYyID0gcEFycmF5W2pdKSA+IHYxKSB7CisgICAgICAgICAgcEFycmF5W2ogKyBnYXBdID0gdjI7CisgICAgICAgICAgaiAtPSBnYXA7CiAgICAgICAgIH0KKyAgICAgICAgcEFycmF5W2ogKyBnYXBdID0gdjE7CisgICAgICB9CisgICAgICBnYXAgPj49IDE7CiAgICAgfQorICB9CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9FWFRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9tZW1vcnkuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9tZW1vcnkuaAppbmRleCBkMTlhM2IzLi5lMjRhYTNlIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfbWVtb3J5LmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X21lbW9yeS5oCkBAIC0xMyw5ICsxMyw5IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogLy8gRm9yIGV4dGVybmFsIEMgbGlicmFyaWVzIHRvIG1hbGxvYyB0aHJvdWdoIFBERml1bS4gVGhlc2UgbWF5IHJldHVybiBOVUxMLgotdm9pZCoJRlhNRU1fRGVmYXVsdEFsbG9jKHNpemVfdCBieXRlX3NpemUsIGludCBmbGFncyk7Ci12b2lkKglGWE1FTV9EZWZhdWx0UmVhbGxvYyh2b2lkKiBwb2ludGVyLCBzaXplX3QgbmV3X3NpemUsIGludCBmbGFncyk7Ci12b2lkCUZYTUVNX0RlZmF1bHRGcmVlKHZvaWQqIHBvaW50ZXIsIGludCBmbGFncyk7Cit2b2lkKiBGWE1FTV9EZWZhdWx0QWxsb2Moc2l6ZV90IGJ5dGVfc2l6ZSwgaW50IGZsYWdzKTsKK3ZvaWQqIEZYTUVNX0RlZmF1bHRSZWFsbG9jKHZvaWQqIHBvaW50ZXIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGZsYWdzKTsKK3ZvaWQgRlhNRU1fRGVmYXVsdEZyZWUodm9pZCogcG9pbnRlciwgaW50IGZsYWdzKTsKICNpZmRlZiBfX2NwbHVzcGx1cwogfSAgLy8gZXh0ZXJuICJDIgogCkBAIC0yOCw5NCArMjgsODQgQEAKIE5FVkVSX0lOTElORSB2b2lkIEZYX091dE9mTWVtb3J5VGVybWluYXRlKCk7CiAKIGlubGluZSB2b2lkKiBGWF9TYWZlUmVhbGxvYyh2b2lkKiBwdHIsIHNpemVfdCBudW1fbWVtYmVycywgc2l6ZV90IG1lbWJlcl9zaXplKSB7Ci0gICAgaWYgKG51bV9tZW1iZXJzIDwgc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSAvIG1lbWJlcl9zaXplKSB7Ci0gICAgICAgIHJldHVybiByZWFsbG9jKHB0ciwgbnVtX21lbWJlcnMgKiBtZW1iZXJfc2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiBudWxscHRyOworICBpZiAobnVtX21lbWJlcnMgPCBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC8gbWVtYmVyX3NpemUpIHsKKyAgICByZXR1cm4gcmVhbGxvYyhwdHIsIG51bV9tZW1iZXJzICogbWVtYmVyX3NpemUpOworICB9CisgIHJldHVybiBudWxscHRyOwogfQogCiBpbmxpbmUgdm9pZCogRlhfQWxsb2NPckRpZShzaXplX3QgbnVtX21lbWJlcnMsIHNpemVfdCBtZW1iZXJfc2l6ZSkgewotICAgIC8vIFRPRE8odHNlcGV6KTogU2VlIGlmIHdlIGNhbiBhdm9pZCB0aGUgaW1wbGljaXQgbWVtc2V0KDApLgotICAgIGlmICh2b2lkKiByZXN1bHQgPSBjYWxsb2MobnVtX21lbWJlcnMsIG1lbWJlcl9zaXplKSkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBGWF9PdXRPZk1lbW9yeVRlcm1pbmF0ZSgpOyAgLy8gTmV2ZXIgcmV0dXJucy4KLSAgICByZXR1cm4gbnVsbHB0cjsgIC8vIFN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcuCisgIC8vIFRPRE8odHNlcGV6KTogU2VlIGlmIHdlIGNhbiBhdm9pZCB0aGUgaW1wbGljaXQgbWVtc2V0KDApLgorICBpZiAodm9pZCogcmVzdWx0ID0gY2FsbG9jKG51bV9tZW1iZXJzLCBtZW1iZXJfc2l6ZSkpIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIEZYX091dE9mTWVtb3J5VGVybWluYXRlKCk7ICAvLyBOZXZlciByZXR1cm5zLgorICByZXR1cm4gbnVsbHB0cjsgICAgICAgICAgICAgLy8gU3VwcHJlc3MgY29tcGlsZXIgd2FybmluZy4KIH0KIAogaW5saW5lIHZvaWQqIEZYX0FsbG9jT3JEaWUyRChzaXplX3Qgdywgc2l6ZV90IGgsIHNpemVfdCBtZW1iZXJfc2l6ZSkgewotICAgIGlmICh3IDwgc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSAvIGgpIHsKLSAgICAgICAgcmV0dXJuIEZYX0FsbG9jT3JEaWUodyAqIGgsIG1lbWJlcl9zaXplKTsKLSAgICB9Ci0gICAgRlhfT3V0T2ZNZW1vcnlUZXJtaW5hdGUoKTsgIC8vIE5ldmVyIHJldHVybnMuCi0gICAgcmV0dXJuIG51bGxwdHI7ICAvLyBTdXBwcmVzcyBjb21waWxlciB3YXJuaW5nLgorICBpZiAodyA8IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLyBoKSB7CisgICAgcmV0dXJuIEZYX0FsbG9jT3JEaWUodyAqIGgsIG1lbWJlcl9zaXplKTsKKyAgfQorICBGWF9PdXRPZk1lbW9yeVRlcm1pbmF0ZSgpOyAgLy8gTmV2ZXIgcmV0dXJucy4KKyAgcmV0dXJuIG51bGxwdHI7ICAgICAgICAgICAgIC8vIFN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcuCiB9CiAKLWlubGluZSB2b2lkKiBGWF9SZWFsbG9jT3JEaWUodm9pZCogcHRyLCBzaXplX3QgbnVtX21lbWJlcnMsIHNpemVfdCBtZW1iZXJfc2l6ZSkgewotICAgIGlmICh2b2lkKiByZXN1bHQgPSBGWF9TYWZlUmVhbGxvYyhwdHIsIG51bV9tZW1iZXJzLCBtZW1iZXJfc2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgRlhfT3V0T2ZNZW1vcnlUZXJtaW5hdGUoKTsgIC8vIE5ldmVyIHJldHVybnMuCi0gICAgcmV0dXJuIG51bGxwdHI7ICAvLyBTdXBwcmVzcyBjb21waWxlciB3YXJuaW5nLgoraW5saW5lIHZvaWQqIEZYX1JlYWxsb2NPckRpZSh2b2lkKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fbWVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1lbWJlcl9zaXplKSB7CisgIGlmICh2b2lkKiByZXN1bHQgPSBGWF9TYWZlUmVhbGxvYyhwdHIsIG51bV9tZW1iZXJzLCBtZW1iZXJfc2l6ZSkpIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIEZYX091dE9mTWVtb3J5VGVybWluYXRlKCk7ICAvLyBOZXZlciByZXR1cm5zLgorICByZXR1cm4gbnVsbHB0cjsgICAgICAgICAgICAgLy8gU3VwcHJlc3MgY29tcGlsZXIgd2FybmluZy4KIH0KIAogLy8gTmV2ZXIgcmV0dXJucyBOVUxMLgotI2RlZmluZSBGWF9BbGxvYyh0eXBlLCBzaXplKSAodHlwZSopRlhfQWxsb2NPckRpZShzaXplLCBzaXplb2YodHlwZSkpCi0jZGVmaW5lIEZYX0FsbG9jMkQodHlwZSwgdywgaCkgKHR5cGUqKUZYX0FsbG9jT3JEaWUyRCh3LCBoLCBzaXplb2YodHlwZSkpCisjZGVmaW5lIEZYX0FsbG9jKHR5cGUsIHNpemUpICh0eXBlKikgRlhfQWxsb2NPckRpZShzaXplLCBzaXplb2YodHlwZSkpCisjZGVmaW5lIEZYX0FsbG9jMkQodHlwZSwgdywgaCkgKHR5cGUqKSBGWF9BbGxvY09yRGllMkQodywgaCwgc2l6ZW9mKHR5cGUpKQogI2RlZmluZSBGWF9SZWFsbG9jKHR5cGUsIHB0ciwgc2l6ZSkgXAotICAgICh0eXBlKilGWF9SZWFsbG9jT3JEaWUocHRyLCBzaXplLCBzaXplb2YodHlwZSkpCisgICh0eXBlKikgRlhfUmVhbGxvY09yRGllKHB0ciwgc2l6ZSwgc2l6ZW9mKHR5cGUpKQogCiAvLyBNYXkgcmV0dXJuIE5VTEwuCi0jZGVmaW5lIEZYX1RyeUFsbG9jKHR5cGUsIHNpemUpICh0eXBlKiljYWxsb2Moc2l6ZSwgc2l6ZW9mKHR5cGUpKQorI2RlZmluZSBGWF9UcnlBbGxvYyh0eXBlLCBzaXplKSAodHlwZSopIGNhbGxvYyhzaXplLCBzaXplb2YodHlwZSkpCiAjZGVmaW5lIEZYX1RyeVJlYWxsb2ModHlwZSwgcHRyLCBzaXplKSBcCi0gICAgKHR5cGUqKUZYX1NhZmVSZWFsbG9jKHB0ciwgc2l6ZSwgc2l6ZW9mKHR5cGUpKQorICAodHlwZSopIEZYX1NhZmVSZWFsbG9jKHB0ciwgc2l6ZSwgc2l6ZW9mKHR5cGUpKQogCiAjZGVmaW5lIEZYX0ZyZWUocHRyKSBmcmVlKHB0cikKIAotY2xhc3MgQ0ZYX0Rlc3RydWN0T2JqZWN0Ci17Ci1wdWJsaWM6Ci0KLSAgICB2aXJ0dWFsIH5DRlhfRGVzdHJ1Y3RPYmplY3QoKSB7fQorY2xhc3MgQ0ZYX0Rlc3RydWN0T2JqZWN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNGWF9EZXN0cnVjdE9iamVjdCgpIHt9CiB9OwotY2xhc3MgQ0ZYX0dyb3dPbmx5UG9vbAotewotcHVibGljOgorY2xhc3MgQ0ZYX0dyb3dPbmx5UG9vbCB7CisgcHVibGljOgorICBDRlhfR3Jvd09ubHlQb29sKHNpemVfdCB0cnVua19zaXplID0gMTYzODQpOwogCi0gICAgQ0ZYX0dyb3dPbmx5UG9vbChzaXplX3QgdHJ1bmtfc2l6ZSA9IDE2Mzg0KTsKKyAgfkNGWF9Hcm93T25seVBvb2woKTsKIAotICAgIH5DRlhfR3Jvd09ubHlQb29sKCk7CisgIHZvaWQgU2V0VHJ1bmtTaXplKHNpemVfdCB0cnVua19zaXplKSB7IG1fVHJ1bmtTaXplID0gdHJ1bmtfc2l6ZTsgfQogCi0gICAgdm9pZAlTZXRUcnVua1NpemUoc2l6ZV90IHRydW5rX3NpemUpCi0gICAgewotICAgICAgICBtX1RydW5rU2l6ZSA9IHRydW5rX3NpemU7Ci0gICAgfQorICB2b2lkKiBBbGxvY0RlYnVnKHNpemVfdCBzaXplLCBjb25zdCBGWF9DSEFSKiBmaWxlLCBpbnQgbGluZSkgeworICAgIHJldHVybiBBbGxvYyhzaXplKTsKKyAgfQogCi0gICAgdm9pZCoJQWxsb2NEZWJ1ZyhzaXplX3Qgc2l6ZSwgY29uc3QgRlhfQ0hBUiogZmlsZSwgaW50IGxpbmUpCi0gICAgewotICAgICAgICByZXR1cm4gQWxsb2Moc2l6ZSk7Ci0gICAgfQorICB2b2lkKiBBbGxvYyhzaXplX3Qgc2l6ZSk7CiAKLSAgICB2b2lkKglBbGxvYyhzaXplX3Qgc2l6ZSk7CisgIHZvaWQqIFJlYWxsb2NEZWJ1Zyh2b2lkKiBwLCBzaXplX3QgbmV3X3NpemUsIGNvbnN0IEZYX0NIQVIqIGZpbGUsIGludCBsaW5lKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KIAotICAgIHZvaWQqCVJlYWxsb2NEZWJ1Zyh2b2lkKiBwLCBzaXplX3QgbmV3X3NpemUsIGNvbnN0IEZYX0NIQVIqIGZpbGUsIGludCBsaW5lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICB2b2lkKiBSZWFsbG9jKHZvaWQqIHAsIHNpemVfdCBuZXdfc2l6ZSkgeyByZXR1cm4gTlVMTDsgfQogCi0gICAgdm9pZCoJUmVhbGxvYyh2b2lkKiBwLCBzaXplX3QgbmV3X3NpemUpCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisgIHZvaWQgRnJlZSh2b2lkKikge30KIAotICAgIHZvaWQJRnJlZSh2b2lkKikge30KKyAgdm9pZCBGcmVlQWxsKCk7CiAKLSAgICB2b2lkCUZyZWVBbGwoKTsKLXByaXZhdGU6CisgcHJpdmF0ZToKKyAgc2l6ZV90IG1fVHJ1bmtTaXplOwogCi0gICAgc2l6ZV90CW1fVHJ1bmtTaXplOwotCi0gICAgdm9pZCoJbV9wRmlyc3RUcnVuazsKKyAgdm9pZCogbV9wRmlyc3RUcnVuazsKIH07CiAjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJlYW0uaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJlYW0uaAppbmRleCBiNmZkY2ZjLi5lNTFjMmJkIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyZWFtLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmVhbS5oCkBAIC0xMSwxODcgKzExLDE3OSBAQAogCiB2b2lkKiBGWF9PcGVuRm9sZGVyKGNvbnN0IEZYX0NIQVIqIHBhdGgpOwogdm9pZCogRlhfT3BlbkZvbGRlcihjb25zdCBGWF9XQ0hBUiogcGF0aCk7Ci1GWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX0J5dGVTdHJpbmcmIGZpbGVuYW1lLCBGWF9CT09MJiBiRm9sZGVyKTsKLUZYX0JPT0wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLCBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUsIEZYX0JPT0wmIGJGb2xkZXIpOworRlhfQk9PTCBGWF9HZXROZXh0RmlsZSh2b2lkKiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkZvbGRlcik7CitGWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRm9sZGVyKTsKIHZvaWQgRlhfQ2xvc2VGb2xkZXIodm9pZCogaGFuZGxlKTsKIEZYX1dDSEFSIEZYX0dldEZvbGRlclNlcGFyYXRvcigpOwogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSNkZWZpbmUgRlhfRklMRVNJWkUJCQlpbnQzMl90CisjZGVmaW5lIEZYX0ZJTEVTSVpFIGludDMyX3QKICNlbHNlCiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2lmbmRlZiBPX0JJTkFSWQotI2RlZmluZSBPX0JJTkFSWSAJCTAKKyNkZWZpbmUgT19CSU5BUlkgMAogI2VuZGlmCiAjaWZuZGVmIE9fTEFSR0VGSUxFCi0jZGVmaW5lIE9fTEFSR0VGSUxFCQkwCisjZGVmaW5lIE9fTEFSR0VGSUxFIDAKICNlbmRpZgotI2RlZmluZSBGWF9GSUxFU0laRQkJCW9mZl90CisjZGVmaW5lIEZYX0ZJTEVTSVpFIG9mZl90CiAjZW5kaWYKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDMyKGEpCTAKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDQwKGEpCTAKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDQ4KGEpCTAKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDU2KGEpCTAKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDI0KGEpICAoKHVpbnQ4X3QpKGE+PjI0KSkKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDE2KGEpICAoKHVpbnQ4X3QpKGE+PjE2KSkKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDgoYSkgICAoKHVpbnQ4X3QpKGE+PjgpKQotI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUMChhKSAgICgodWludDhfdCkoYSkpCi0jZGVmaW5lIEZYX0ZJTEVNT0RFX1dyaXRlCQkwCi0jZGVmaW5lIEZYX0ZJTEVNT0RFX1JlYWRPbmx5CTEKLSNkZWZpbmUgRlhfRklMRU1PREVfVHJ1bmNhdGUJMgotRlhfQk9PTAkJRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKTsKLUZYX0JPT0wJCUZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSk7Ci1GWF9CT09MCQlGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKTsKLUZYX0JPT0wJCUZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpOwotRlhfQk9PTAkJRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOwotRlhfQk9PTAkJRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOwotRlhfQk9PTAkJRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOwotRlhfQk9PTAkJRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOwotY2xhc3MgSUZYX1N0cmVhbVdyaXRlCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYX1N0cmVhbVdyaXRlKCkge30KLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7Ci0gICAgdmlydHVhbAlGWF9CT09MCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOworI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUMzIoYSkgMAorI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUNDAoYSkgMAorI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUNDgoYSkgMAorI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUNTYoYSkgMAorI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUMjQoYSkgKCh1aW50OF90KShhID4+IDI0KSkKKyNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDE2KGEpICgodWludDhfdCkoYSA+PiAxNikpCisjZGVmaW5lIEZYX0dFVEJZVEVPRkZTRVQ4KGEpICgodWludDhfdCkoYSA+PiA4KSkKKyNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDAoYSkgKCh1aW50OF90KShhKSkKKyNkZWZpbmUgRlhfRklMRU1PREVfV3JpdGUgMAorI2RlZmluZSBGWF9GSUxFTU9ERV9SZWFkT25seSAxCisjZGVmaW5lIEZYX0ZJTEVNT0RFX1RydW5jYXRlIDIKK0ZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKTsKK0ZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKTsKK0ZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSk7CitGWF9CT09MIEZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpOworRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOworRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOworRlhfQk9PTCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOworRlhfQk9PTCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpOworY2xhc3MgSUZYX1N0cmVhbVdyaXRlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGWF9TdHJlYW1Xcml0ZSgpIHt9CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpID0gMDsKIH07Ci1jbGFzcyBJRlhfRmlsZVdyaXRlIDogcHVibGljIElGWF9TdHJlYW1Xcml0ZQotewotcHVibGljOgorY2xhc3MgSUZYX0ZpbGVXcml0ZSA6IHB1YmxpYyBJRlhfU3RyZWFtV3JpdGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOworICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFNpemUoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRTaXplKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgRmx1c2goKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlGbHVzaCgpID0gMDsKLQotICAgIHZpcnR1YWwJRlhfQk9PTAkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBXcml0ZUJsb2NrKHBEYXRhLCBHZXRTaXplKCksIHNpemUpOwotICAgIH0KKyAgdmlydHVhbCBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIFdyaXRlQmxvY2socERhdGEsIEdldFNpemUoKSwgc2l6ZSk7CisgIH0KIH07CiBJRlhfRmlsZVdyaXRlKiBGWF9DcmVhdGVGaWxlV3JpdGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpOwogSUZYX0ZpbGVXcml0ZSogRlhfQ3JlYXRlRmlsZVdyaXRlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSk7Ci1jbGFzcyBJRlhfU3RyZWFtUmVhZAotewotcHVibGljOgotICAgIHZpcnR1YWwgfklGWF9TdHJlYW1SZWFkKCkgeyB9CitjbGFzcyBJRlhfU3RyZWFtUmVhZCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfU3RyZWFtUmVhZCgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRQb3NpdGlvbigpID0gMDsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpID0gMDsKIAotICAgIHZpcnR1YWwgc2l6ZV90CQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKKyAgdmlydHVhbCBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKIH07Ci1jbGFzcyBJRlhfRmlsZVJlYWQgOiBJRlhfU3RyZWFtUmVhZAotewotcHVibGljOgotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7CitjbGFzcyBJRlhfRmlsZVJlYWQgOiBJRlhfU3RyZWFtUmVhZCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFNpemUoKSA9IDA7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0U2l6ZSgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRigpIHsgcmV0dXJuIEZBTFNFOyB9CiAKLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRQb3NpdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSB7IHJldHVybiAwOyB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRSYW5nZShGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0ZJTEVTSVpFIHNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlDbGVhclJhbmdlKCkge30KKyAgdmlydHVhbCB2b2lkIENsZWFyUmFuZ2UoKSB7fQogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOwogCi0gICAgdmlydHVhbCBzaXplX3QJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgdmlydHVhbCBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsgcmV0dXJuIDA7IH0KIH07CiBJRlhfRmlsZVJlYWQqIEZYX0NyZWF0ZUZpbGVSZWFkKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lKTsKIElGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lKTsKLWNsYXNzIElGWF9GaWxlU3RyZWFtIDogcHVibGljIElGWF9GaWxlUmVhZCwgcHVibGljIElGWF9GaWxlV3JpdGUKLXsKLXB1YmxpYzoKK2NsYXNzIElGWF9GaWxlU3RyZWFtIDogcHVibGljIElGWF9GaWxlUmVhZCwgcHVibGljIElGWF9GaWxlV3JpdGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCBJRlhfRmlsZVN0cmVhbSogUmV0YWluKCkgPSAwOwogCi0gICAgdmlydHVhbCBJRlhfRmlsZVN0cmVhbSoJCVJldGFpbigpID0gMDsKKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpID0gMDsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRTaXplKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJCUdldFNpemUoKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRigpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0VPRigpID0gMDsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCQlHZXRQb3NpdGlvbigpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7CisgIHZpcnR1YWwgc2l6ZV90IFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHNpemVfdAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBXcml0ZUJsb2NrKGJ1ZmZlciwgR2V0U2l6ZSgpLCBzaXplKTsKKyAgfQogCi0gICAgdmlydHVhbAlGWF9CT09MCQkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7Ci0gICAgdmlydHVhbAlGWF9CT09MCQkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBXcml0ZUJsb2NrKGJ1ZmZlciwgR2V0U2l6ZSgpLCBzaXplKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmx1c2goKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBGbHVzaCgpID0gMDsKIH07Ci1JRlhfRmlsZVN0cmVhbSoJCUZYX0NyZWF0ZUZpbGVTdHJlYW0oY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGR3TW9kZXMpOwotSUZYX0ZpbGVTdHJlYW0qCQlGWF9DcmVhdGVGaWxlU3RyZWFtKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSwgRlhfRFdPUkQgZHdNb2Rlcyk7Ci1jbGFzcyBJRlhfRmlsZUFjY2VzcwotewotcHVibGljOgotICAgIHZpcnR1YWwgfklGWF9GaWxlQWNjZXNzKCkge30KLSAgICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsKLSAgICB2aXJ0dWFsIElGWF9GaWxlQWNjZXNzKiBSZXRhaW4oKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIEdldFBhdGgoQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0aCkgPSAwOwotICAgIHZpcnR1YWwgSUZYX0ZpbGVTdHJlYW0qIENyZWF0ZUZpbGVTdHJlYW0oRlhfRFdPUkQgZHdNb2RlcykgPSAwOworSUZYX0ZpbGVTdHJlYW0qIEZYX0NyZWF0ZUZpbGVTdHJlYW0oY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGR3TW9kZXMpOworSUZYX0ZpbGVTdHJlYW0qIEZYX0NyZWF0ZUZpbGVTdHJlYW0oY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBkd01vZGVzKTsKK2NsYXNzIElGWF9GaWxlQWNjZXNzIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGWF9GaWxlQWNjZXNzKCkge30KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7CisgIHZpcnR1YWwgSUZYX0ZpbGVBY2Nlc3MqIFJldGFpbigpID0gMDsKKyAgdmlydHVhbCB2b2lkIEdldFBhdGgoQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0aCkgPSAwOworICB2aXJ0dWFsIElGWF9GaWxlU3RyZWFtKiBDcmVhdGVGaWxlU3RyZWFtKEZYX0RXT1JEIGR3TW9kZXMpID0gMDsKIH07CiBJRlhfRmlsZUFjY2VzcyogRlhfQ3JlYXRlRGVmYXVsdEZpbGVBY2Nlc3MoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhdGgpOwotY2xhc3MgSUZYX01lbW9yeVN0cmVhbSA6IHB1YmxpYyBJRlhfRmlsZVN0cmVhbQotewotcHVibGljOgorY2xhc3MgSUZYX01lbW9yeVN0cmVhbSA6IHB1YmxpYyBJRlhfRmlsZVN0cmVhbSB7CisgcHVibGljOgorICB2aXJ0dWFsIEZYX0JPT0wgSXNDb25zZWN1dGl2ZSgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzQ29uc2VjdXRpdmUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBFc3RpbWF0ZVNpemUoc2l6ZV90IG5Jbml0U2l6ZSwgc2l6ZV90IG5Hcm93U2l6ZSkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJRXN0aW1hdGVTaXplKHNpemVfdCBuSW5pdFNpemUsIHNpemVfdCBuR3Jvd1NpemUpID0gMDsKKyAgdmlydHVhbCB1aW50OF90KiBHZXRCdWZmZXIoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIHVpbnQ4X3QqCQlHZXRCdWZmZXIoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBBdHRhY2hCdWZmZXIodWludDhfdCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVGFrZU92ZXIgPSBGQUxTRSkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJQXR0YWNoQnVmZmVyKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgRlhfQk9PTCBiVGFrZU92ZXIgPSBGQUxTRSkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkCQkJRGV0YWNoQnVmZmVyKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgRGV0YWNoQnVmZmVyKCkgPSAwOwogfTsKLUlGWF9NZW1vcnlTdHJlYW0qCUZYX0NyZWF0ZU1lbW9yeVN0cmVhbSh1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIEZYX0JPT0wgYlRha2VPdmVyID0gRkFMU0UpOwotSUZYX01lbW9yeVN0cmVhbSoJRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKEZYX0JPT0wgYkNvbnNlY3V0aXZlID0gRkFMU0UpOwotY2xhc3MgSUZYX0J1ZmZlclJlYWQgOiBwdWJsaWMgSUZYX1N0cmVhbVJlYWQKLXsKLXB1YmxpYzoKK0lGWF9NZW1vcnlTdHJlYW0qIEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSh1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKTsKK0lGWF9NZW1vcnlTdHJlYW0qIEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShGWF9CT09MIGJDb25zZWN1dGl2ZSA9IEZBTFNFKTsKK2NsYXNzIElGWF9CdWZmZXJSZWFkIDogcHVibGljIElGWF9TdHJlYW1SZWFkIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKSA9IDA7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRQb3NpdGlvbigpID0gMDsKKyAgdmlydHVhbCBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKIAotICAgIHZpcnR1YWwgc2l6ZV90CQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFJlYWROZXh0QmxvY2soRlhfQk9PTCBiUmVzdGFydCA9IEZBTFNFKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlSZWFkTmV4dEJsb2NrKEZYX0JPT0wgYlJlc3RhcnQgPSBGQUxTRSkgPSAwOworICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIEdldEJsb2NrQnVmZmVyKCkgPSAwOwogCi0gICAgdmlydHVhbCBjb25zdCB1aW50OF90KgkJR2V0QmxvY2tCdWZmZXIoKSA9IDA7CisgIHZpcnR1YWwgc2l6ZV90IEdldEJsb2NrU2l6ZSgpID0gMDsKIAotICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0QmxvY2tTaXplKCkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0QmxvY2tPZmZzZXQoKSA9IDA7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0QmxvY2tPZmZzZXQoKSA9IDA7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9TVFJFQU1fSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaAppbmRleCA4ZDczNTU1Li5mNDkzYzUzIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oCkBAIC0yMCw4OTEgKzIwLDc5MCBAQAogCiAvLyBBbiBpbW11dGFibGUgc3RyaW5nIHdpdGggY2FsbGVyLXByb3ZpZGVkIHN0b3JhZ2Ugd2hpY2ggbXVzdCBvdXRsaXZlIHRoZQogLy8gc3RyaW5nIGl0c2VsZi4KLWNsYXNzIENGWF9CeXRlU3RyaW5nQwotewotcHVibGljOgotICAgIHR5cGVkZWYgRlhfQ0hBUiB2YWx1ZV90eXBlOworY2xhc3MgQ0ZYX0J5dGVTdHJpbmdDIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgRlhfQ0hBUiB2YWx1ZV90eXBlOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDKCkKLSAgICB7Ci0gICAgICAgIG1fUHRyID0gTlVMTDsKLSAgICAgICAgbV9MZW5ndGggPSAwOworICBDRlhfQnl0ZVN0cmluZ0MoKSB7CisgICAgbV9QdHIgPSBOVUxMOworICAgIG1fTGVuZ3RoID0gMDsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nQyhjb25zdCB1aW50OF90KiBwdHIsIEZYX1NUUlNJWkUgc2l6ZSkgeworICAgIG1fUHRyID0gcHRyOworICAgIG1fTGVuZ3RoID0gc2l6ZTsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nQyhjb25zdCBGWF9DSEFSKiBwdHIpIHsKKyAgICBtX1B0ciA9IChjb25zdCB1aW50OF90KilwdHI7CisgICAgbV9MZW5ndGggPSBwdHIgPyBGWFNZU19zdHJsZW4ocHRyKSA6IDA7CisgIH0KKworICAvLyB8Y2h8IG11c3QgYmUgYW4gbHZhbHVlIHRoYXQgb3V0bGl2ZXMgdGhlIHRoZSBDRlhfQnl0ZVN0cmluZ0MuIEhvd2V2ZXIsCisgIC8vIHRoZSB1c2Ugb2YgY2hhciBydmFsdWVzIGFyZSBub3QgY2F1Z2h0IGF0IGNvbXBpbGUgdGltZS4gIFRoZXkgYXJlCisgIC8vIGltcGxpY2l0bHkgcHJvbW90ZWQgdG8gQ0ZYX0J5dGVTdHJpbmcgKHNlZSBiZWxvdykgYW5kIHRoZW4gdGhlCisgIC8vIENGWF9CeXRlU3RyaW5nQyBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBDRlhfQnl0ZVN0cmluZyB2aWEgdGhlIGFsdGVybmF0ZQorICAvLyBjb25zdHJ1Y3RvciBiZWxvdy4gVGhlIENGWF9CeXRlU3RyaW5nIHRoZW4gdHlwaWNhbGx5IGdvZXMgb3V0IG9mIHNjb3BlCisgIC8vIGFuZCB8bV9QdHJ8IG1heSBiZSBsZWZ0IHBvaW50aW5nIHRvIGludmFsaWQgbWVtb3J5LiBCZXdhcmUuCisgIC8vIFRPRE8odHNlcGV6KTogTWFyayBzaW5nbGUtYXJndW1lbnQgc3RyaW5nIGNvbnN0cnVjdG9ycyBhcyBleHBsaWNpdC4KKyAgQ0ZYX0J5dGVTdHJpbmdDKEZYX0NIQVImIGNoKSB7CisgICAgbV9QdHIgPSAoY29uc3QgdWludDhfdCopJmNoOworICAgIG1fTGVuZ3RoID0gMTsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nQyhjb25zdCBGWF9DSEFSKiBwdHIsIEZYX1NUUlNJWkUgbGVuKSB7CisgICAgbV9QdHIgPSAoY29uc3QgdWludDhfdCopcHRyOworICAgIG1fTGVuZ3RoID0gKGxlbiA9PSAtMSkgPyBGWFNZU19zdHJsZW4ocHRyKSA6IGxlbjsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nQyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNyYykgeworICAgIG1fUHRyID0gc3JjLm1fUHRyOworICAgIG1fTGVuZ3RoID0gc3JjLm1fTGVuZ3RoOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmdDKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMpOworCisgIENGWF9CeXRlU3RyaW5nQyYgb3BlcmF0b3I9KGNvbnN0IEZYX0NIQVIqIHNyYykgeworICAgIG1fUHRyID0gKGNvbnN0IHVpbnQ4X3QqKXNyYzsKKyAgICBtX0xlbmd0aCA9IG1fUHRyID8gRlhTWVNfc3RybGVuKHNyYykgOiAwOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nQyYgb3BlcmF0b3I9KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3JjKSB7CisgICAgbV9QdHIgPSBzcmMubV9QdHI7CisgICAgbV9MZW5ndGggPSBzcmMubV9MZW5ndGg7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmdDJiBvcGVyYXRvcj0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYyk7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNoYXIqIHB0cikgY29uc3QgeworICAgIHJldHVybiBGWFNZU19zdHJsZW4ocHRyKSA9PSBtX0xlbmd0aCAmJgorICAgICAgICAgICBGWFNZU19tZW1jbXAocHRyLCBtX1B0ciwgbV9MZW5ndGgpID09IDA7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gb3RoZXIubV9MZW5ndGggPT0gbV9MZW5ndGggJiYKKyAgICAgICAgICAgRlhTWVNfbWVtY21wKG90aGVyLm1fUHRyLCBtX1B0ciwgbV9MZW5ndGgpID09IDA7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNoYXIqIHB0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBwdHIpOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICB9CisKKyAgRlhfRFdPUkQgR2V0SUQoRlhfU1RSU0laRSBzdGFydF9wb3MgPSAwKSBjb25zdDsKKworICBjb25zdCB1aW50OF90KiBHZXRQdHIoKSBjb25zdCB7IHJldHVybiBtX1B0cjsgfQorCisgIGNvbnN0IEZYX0NIQVIqIEdldENTdHIoKSBjb25zdCB7IHJldHVybiAoY29uc3QgRlhfQ0hBUiopbV9QdHI7IH0KKworICBGWF9TVFJTSVpFIEdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fTGVuZ3RoOyB9CisKKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9MZW5ndGggPT0gMDsgfQorCisgIHVpbnQ4X3QgR2V0QXQoRlhfU1RSU0laRSBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9QdHJbaW5kZXhdOyB9CisKKyAgQ0ZYX0J5dGVTdHJpbmdDIE1pZChGWF9TVFJTSVpFIGluZGV4LCBGWF9TVFJTSVpFIGNvdW50ID0gLTEpIGNvbnN0IHsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICBpbmRleCA9IDA7CiAgICAgfQotCi0gICAgQ0ZYX0J5dGVTdHJpbmdDKGNvbnN0IHVpbnQ4X3QqIHB0ciwgRlhfU1RSU0laRSBzaXplKQotICAgIHsKLSAgICAgICAgbV9QdHIgPSBwdHI7Ci0gICAgICAgIG1fTGVuZ3RoID0gc2l6ZTsKKyAgICBpZiAoaW5kZXggPiBtX0xlbmd0aCkgeworICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOwogICAgIH0KLQotICAgIENGWF9CeXRlU3RyaW5nQyhjb25zdCBGWF9DSEFSKiBwdHIpCi0gICAgewotICAgICAgICBtX1B0ciA9IChjb25zdCB1aW50OF90KilwdHI7Ci0gICAgICAgIG1fTGVuZ3RoID0gcHRyID8gRlhTWVNfc3RybGVuKHB0cikgOiAwOworICAgIGlmIChjb3VudCA8IDAgfHwgY291bnQgPiBtX0xlbmd0aCAtIGluZGV4KSB7CisgICAgICBjb3VudCA9IG1fTGVuZ3RoIC0gaW5kZXg7CiAgICAgfQorICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MobV9QdHIgKyBpbmRleCwgY291bnQpOworICB9CiAKLSAgICAvLyB8Y2h8IG11c3QgYmUgYW4gbHZhbHVlIHRoYXQgb3V0bGl2ZXMgdGhlIHRoZSBDRlhfQnl0ZVN0cmluZ0MuIEhvd2V2ZXIsCi0gICAgLy8gdGhlIHVzZSBvZiBjaGFyIHJ2YWx1ZXMgYXJlIG5vdCBjYXVnaHQgYXQgY29tcGlsZSB0aW1lLiAgVGhleSBhcmUKLSAgICAvLyBpbXBsaWNpdGx5IHByb21vdGVkIHRvIENGWF9CeXRlU3RyaW5nIChzZWUgYmVsb3cpIGFuZCB0aGVuIHRoZQotICAgIC8vIENGWF9CeXRlU3RyaW5nQyBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBDRlhfQnl0ZVN0cmluZyB2aWEgdGhlIGFsdGVybmF0ZQotICAgIC8vIGNvbnN0cnVjdG9yIGJlbG93LiBUaGUgQ0ZYX0J5dGVTdHJpbmcgdGhlbiB0eXBpY2FsbHkgZ29lcyBvdXQgb2Ygc2NvcGUKLSAgICAvLyBhbmQgfG1fUHRyfCBtYXkgYmUgbGVmdCBwb2ludGluZyB0byBpbnZhbGlkIG1lbW9yeS4gQmV3YXJlLgotICAgIC8vIFRPRE8odHNlcGV6KTogTWFyayBzaW5nbGUtYXJndW1lbnQgc3RyaW5nIGNvbnN0cnVjdG9ycyBhcyBleHBsaWNpdC4KLSAgICBDRlhfQnl0ZVN0cmluZ0MoRlhfQ0hBUiYgY2gpCi0gICAgewotICAgICAgICBtX1B0ciA9IChjb25zdCB1aW50OF90KikmY2g7Ci0gICAgICAgIG1fTGVuZ3RoID0gMTsKLSAgICB9CisgIGNvbnN0IHVpbnQ4X3QmIG9wZXJhdG9yW10oc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX1B0cltpbmRleF07IH0KIAotICAgIENGWF9CeXRlU3RyaW5nQyhjb25zdCBGWF9DSEFSKiBwdHIsIEZYX1NUUlNJWkUgbGVuKQotICAgIHsKLSAgICAgICAgbV9QdHIgPSAoY29uc3QgdWludDhfdCopcHRyOwotICAgICAgICBtX0xlbmd0aCA9IChsZW4gPT0gLTEpID8gRlhTWVNfc3RybGVuKHB0cikgOiBsZW47Ci0gICAgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRoYXQpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0gbWVtY21wKG1fUHRyLCB0aGF0Lm1fUHRyLCBzdGQ6Om1pbihtX0xlbmd0aCwgdGhhdC5tX0xlbmd0aCkpOworICAgIHJldHVybiByZXN1bHQgPCAwIHx8IChyZXN1bHQgPT0gMCAmJiBtX0xlbmd0aCA8IHRoYXQubV9MZW5ndGgpOworICB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcmMpCi0gICAgewotICAgICAgICBtX1B0ciA9IHNyYy5tX1B0cjsKLSAgICAgICAgbV9MZW5ndGggPSBzcmMubV9MZW5ndGg7Ci0gICAgfQorIHByb3RlY3RlZDoKKyAgY29uc3QgdWludDhfdCogbV9QdHI7CisgIEZYX1NUUlNJWkUgbV9MZW5ndGg7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYyk7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZ0MmIG9wZXJhdG9yID0gKGNvbnN0IEZYX0NIQVIqIHNyYykKLSAgICB7Ci0gICAgICAgIG1fUHRyID0gKGNvbnN0IHVpbnQ4X3QqKXNyYzsKLSAgICAgICAgbV9MZW5ndGggPSBtX1B0ciA/IEZYU1lTX3N0cmxlbihzcmMpIDogMDsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIENGWF9CeXRlU3RyaW5nQyYgb3BlcmF0b3IgPSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcmMpCi0gICAgewotICAgICAgICBtX1B0ciA9IHNyYy5tX1B0cjsKLSAgICAgICAgbV9MZW5ndGggPSBzcmMubV9MZW5ndGg7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZ0MmIG9wZXJhdG9yID0gKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMpOwotCi0gICAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBjaGFyKiBwdHIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEZYU1lTX3N0cmxlbihwdHIpID09IG1fTGVuZ3RoICYmCi0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY21wKHB0ciwgbV9QdHIsIG1fTGVuZ3RoKSA9PSAwOwotICAgIH0KLSAgICBib29sIG9wZXJhdG9yPT0gKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG90aGVyLm1fTGVuZ3RoID09IG1fTGVuZ3RoICYmCi0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY21wKG90aGVyLm1fUHRyLCBtX1B0ciwgbV9MZW5ndGgpID09IDA7Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgY2hhciogcHRyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHB0cik7IH0KLSAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotICAgIH0KLQotICAgIEZYX0RXT1JECQlHZXRJRChGWF9TVFJTSVpFIHN0YXJ0X3BvcyA9IDApIGNvbnN0OwotCi0gICAgY29uc3QgdWludDhfdCoJCUdldFB0cigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9QdHI7Ci0gICAgfQotCi0gICAgY29uc3QgRlhfQ0hBUioJCUdldENTdHIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChjb25zdCBGWF9DSEFSKiltX1B0cjsKLSAgICB9Ci0KLSAgICBGWF9TVFJTSVpFCQlHZXRMZW5ndGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fTGVuZ3RoOwotICAgIH0KLQotICAgIGJvb2wJCQlJc0VtcHR5KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0xlbmd0aCA9PSAwOwotICAgIH0KLQotICAgIHVpbnQ4X3QJCQlHZXRBdChGWF9TVFJTSVpFIGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUHRyW2luZGV4XTsKLSAgICB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZ0MJTWlkKEZYX1NUUlNJWkUgaW5kZXgsIEZYX1NUUlNJWkUgY291bnQgPSAtMSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5kZXggPiBtX0xlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb3VudCA8IDAgfHwgY291bnQgPiBtX0xlbmd0aCAtIGluZGV4KSB7Ci0gICAgICAgICAgICBjb3VudCA9IG1fTGVuZ3RoIC0gaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhtX1B0ciArIGluZGV4LCBjb3VudCk7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCYgb3BlcmF0b3JbXSAoc2l6ZV90IGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUHRyW2luZGV4XTsKLSAgICB9Ci0KLSAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0aGF0KSBjb25zdAotICAgIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IG1lbWNtcChtX1B0ciwgdGhhdC5tX1B0ciwgc3RkOjptaW4obV9MZW5ndGgsIHRoYXQubV9MZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdCA8IDAgfHwgKHJlc3VsdCA9PSAwICYmIG1fTGVuZ3RoIDwgdGhhdC5tX0xlbmd0aCk7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgY29uc3QgdWludDhfdCoJCW1fUHRyOwotICAgIEZYX1NUUlNJWkUJCW1fTGVuZ3RoOwotCi1wcml2YXRlOgotICAgIHZvaWQqCQkJb3BlcmF0b3IgbmV3IChzaXplX3QpIHRocm93KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyBwcml2YXRlOgorICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90KSB0aHJvdygpIHsgcmV0dXJuIE5VTEw7IH0KIH07Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcj09IChjb25zdCBjaGFyKiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyA9PSBsaHM7CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNoYXIqIGxocywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiByaHMpIHsKKyAgcmV0dXJuIHJocyA9PSBsaHM7CiB9Ci1pbmxpbmUgYm9vbCBvcGVyYXRvciE9IChjb25zdCBjaGFyKiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyAhPSBsaHM7CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNoYXIqIGxocywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiByaHMpIHsKKyAgcmV0dXJuIHJocyAhPSBsaHM7CiB9Ci0jZGVmaW5lIEZYX0JTVFJDKHN0cikgQ0ZYX0J5dGVTdHJpbmdDKHN0ciwgc2l6ZW9mIHN0ci0xKQorI2RlZmluZSBGWF9CU1RSQyhzdHIpIENGWF9CeXRlU3RyaW5nQyhzdHIsIHNpemVvZiBzdHIgLSAxKQogI2RlZmluZSBGWEJTVFJfSUQoYzEsIGMyLCBjMywgYzQpICgoYzEgPDwgMjQpIHwgKGMyIDw8IDE2KSB8IChjMyA8PCA4KSB8IChjNCkpCiAKIC8vIEEgbXV0YWJsZSBzdHJpbmcgd2l0aCBzaGFyZWQgYnVmZmVycyB1c2luZyBjb3B5LW9uLXdyaXRlIHNlbWFudGljcyB0aGF0CiAvLyBhdm9pZHMgdGhlIGNvc3Qgb2Ygc3RkOjpzdHJpbmcncyBpdGVyYXRvciBzdGFiaWxpdHkgZ3VhcmFudGVlcy4KLWNsYXNzIENGWF9CeXRlU3RyaW5nCi17Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBGWF9DSEFSIHZhbHVlX3R5cGU7CitjbGFzcyBDRlhfQnl0ZVN0cmluZyB7CisgcHVibGljOgorICB0eXBlZGVmIEZYX0NIQVIgdmFsdWVfdHlwZTsKIAotICAgIENGWF9CeXRlU3RyaW5nKCkgOiBtX3BEYXRhKG51bGxwdHIpIHsgfQorICBDRlhfQnl0ZVN0cmluZygpIDogbV9wRGF0YShudWxscHRyKSB7fQogCi0gICAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KLSAgICBDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgQ0ZYX0J5dGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CiAKLSAgICAvLyBNb3ZlIGNvbnN0cnVjdG9yLgotICAgIGlubGluZSBDRlhfQnl0ZVN0cmluZyhDRlhfQnl0ZVN0cmluZyYmIG90aGVyKSB7Ci0gICAgICAgIG1fcERhdGEgPSBvdGhlci5tX3BEYXRhOwotICAgICAgICBvdGhlci5tX3BEYXRhID0gbnVsbHB0cjsKKyAgLy8gTW92ZSBjb25zdHJ1Y3Rvci4KKyAgaW5saW5lIENGWF9CeXRlU3RyaW5nKENGWF9CeXRlU3RyaW5nJiYgb3RoZXIpIHsKKyAgICBtX3BEYXRhID0gb3RoZXIubV9wRGF0YTsKKyAgICBvdGhlci5tX3BEYXRhID0gbnVsbHB0cjsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nKGNoYXIgY2gpOworICBDRlhfQnl0ZVN0cmluZyhjb25zdCBGWF9DSEFSKiBwdHIpCisgICAgICA6IENGWF9CeXRlU3RyaW5nKHB0ciwgcHRyID8gRlhTWVNfc3RybGVuKHB0cikgOiAwKSB7fQorCisgIENGWF9CeXRlU3RyaW5nKGNvbnN0IEZYX0NIQVIqIHB0ciwgRlhfU1RSU0laRSBsZW4pOworICBDRlhfQnl0ZVN0cmluZyhjb25zdCB1aW50OF90KiBwdHIsIEZYX1NUUlNJWkUgbGVuKTsKKworICBDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzdHJjKTsKKyAgQ0ZYX0J5dGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyYzEsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnN0cmMyKTsKKworICB+Q0ZYX0J5dGVTdHJpbmcoKTsKKworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgRnJvbVVuaWNvZGUoY29uc3QgRlhfV0NIQVIqIHB0ciwgRlhfU1RSU0laRSBsZW4gPSAtMSk7CisKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEZyb21Vbmljb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOworCisgIC8vIEV4cGxpY2l0IGNvbnZlcnNpb24gdG8gcmF3IHN0cmluZworICBjb25zdCBGWF9DSEFSKiBjX3N0cigpIGNvbnN0IHsgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX1N0cmluZyA6ICIiOyB9CisKKyAgLy8gSW1wbGljaXQgY29udmVyc2lvbiB0byBDLXN0eWxlIHN0cmluZyAtLSBkZXByZWNhdGVkCisgIG9wZXJhdG9yIGNvbnN0IEZYX0NIQVIqKCkgY29uc3QgeyByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nIDogIiI7IH0KKworICBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wRGF0YSA/IChjb25zdCB1aW50OF90KiltX3BEYXRhLT5tX1N0cmluZyA6IE5VTEw7CisgIH0KKworICBGWF9TVFJTSVpFIEdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIDogMDsgfQorCisgIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFHZXRMZW5ndGgoKTsgfQorCisgIGludCBDb21wYXJlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdDsKKworICBib29sIEVxdWFsKGNvbnN0IGNoYXIqIHB0cikgY29uc3Q7CisgIGJvb2wgRXF1YWwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIGNvbnN0OworICBib29sIEVxdWFsKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvdGhlcikgY29uc3Q7CisKKyAgYm9vbCBFcXVhbE5vQ2FzZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3Q7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNoYXIqIHB0cikgY29uc3QgeyByZXR1cm4gRXF1YWwocHRyKTsgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIGNvbnN0IHsgcmV0dXJuIEVxdWFsKHN0cik7IH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvdGhlcikgY29uc3QgeyByZXR1cm4gRXF1YWwob3RoZXIpOyB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNoYXIqIHB0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBwdHIpOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBzdHIpOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgIH0KKworICBib29sIG9wZXJhdG9yPChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSBjb25zdCB7CisgICAgaW50IHJlc3VsdCA9IEZYU1lTX21lbWNtcChjX3N0cigpLCBzdHIuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKEdldExlbmd0aCgpLCBzdHIuR2V0TGVuZ3RoKCkpKTsKKyAgICByZXR1cm4gcmVzdWx0IDwgMCB8fCAocmVzdWx0ID09IDAgJiYgR2V0TGVuZ3RoKCkgPCBzdHIuR2V0TGVuZ3RoKCkpOworICB9CisKKyAgdm9pZCBFbXB0eSgpOworCisgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgRlhfQ0hBUiogc3RyKTsKKworICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnN0cmMpOworCisgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZ1NyYyk7CisKKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBDRlhfQmluYXJ5QnVmJiBidWYpOworCisgIHZvaWQgTG9hZChjb25zdCB1aW50OF90KiBzdHIsIEZYX1NUUlNJWkUgbGVuKTsKKworICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3BlcmF0b3IrPShGWF9DSEFSIGNoKTsKKworICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3BlcmF0b3IrPShjb25zdCBGWF9DSEFSKiBzdHIpOworCisgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpOworCisgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnN0cmMpOworCisgIHVpbnQ4X3QgR2V0QXQoRlhfU1RSU0laRSBuSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nW25JbmRleF0gOiAwOworICB9CisKKyAgdWludDhfdCBvcGVyYXRvcltdKEZYX1NUUlNJWkUgbkluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdIDogMDsKKyAgfQorCisgIHZvaWQgU2V0QXQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX0NIQVIgY2gpOworCisgIEZYX1NUUlNJWkUgSW5zZXJ0KEZYX1NUUlNJWkUgaW5kZXgsIEZYX0NIQVIgY2gpOworCisgIEZYX1NUUlNJWkUgRGVsZXRlKEZYX1NUUlNJWkUgaW5kZXgsIEZYX1NUUlNJWkUgY291bnQgPSAxKTsKKworICB2b2lkIEZvcm1hdChjb25zdCBGWF9DSEFSKiBscHN6Rm9ybWF0LCAuLi4pOworCisgIHZvaWQgRm9ybWF0Vihjb25zdCBGWF9DSEFSKiBscHN6Rm9ybWF0LCB2YV9saXN0IGFyZ0xpc3QpOworCisgIHZvaWQgUmVzZXJ2ZShGWF9TVFJTSVpFIGxlbik7CisKKyAgRlhfQ0hBUiogR2V0QnVmZmVyKEZYX1NUUlNJWkUgbGVuKTsKKworICB2b2lkIFJlbGVhc2VCdWZmZXIoRlhfU1RSU0laRSBsZW4gPSAtMSk7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgTWlkKEZYX1NUUlNJWkUgZmlyc3QpIGNvbnN0OworCisgIENGWF9CeXRlU3RyaW5nIE1pZChGWF9TVFJTSVpFIGZpcnN0LCBGWF9TVFJTSVpFIGNvdW50KSBjb25zdDsKKworICBDRlhfQnl0ZVN0cmluZyBMZWZ0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OworCisgIENGWF9CeXRlU3RyaW5nIFJpZ2h0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OworCisgIEZYX1NUUlNJWkUgRmluZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pTdWIsIEZYX1NUUlNJWkUgc3RhcnQgPSAwKSBjb25zdDsKKworICBGWF9TVFJTSVpFIEZpbmQoRlhfQ0hBUiBjaCwgRlhfU1RSU0laRSBzdGFydCA9IDApIGNvbnN0OworCisgIEZYX1NUUlNJWkUgUmV2ZXJzZUZpbmQoRlhfQ0hBUiBjaCkgY29uc3Q7CisKKyAgdm9pZCBNYWtlTG93ZXIoKTsKKworICB2b2lkIE1ha2VVcHBlcigpOworCisgIHZvaWQgVHJpbVJpZ2h0KCk7CisKKyAgdm9pZCBUcmltUmlnaHQoRlhfQ0hBUiBjaFRhcmdldCk7CisKKyAgdm9pZCBUcmltUmlnaHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6VGFyZ2V0cyk7CisKKyAgdm9pZCBUcmltTGVmdCgpOworCisgIHZvaWQgVHJpbUxlZnQoRlhfQ0hBUiBjaFRhcmdldCk7CisKKyAgdm9pZCBUcmltTGVmdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pUYXJnZXRzKTsKKworICBGWF9TVFJTSVpFIFJlcGxhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6T2xkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6TmV3KTsKKworICBGWF9TVFJTSVpFIFJlbW92ZShGWF9DSEFSIGNoKTsKKworICBDRlhfV2lkZVN0cmluZyBVVEY4RGVjb2RlKCkgY29uc3Q7CisKKyAgdm9pZCBDb252ZXJ0RnJvbShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyLCBDRlhfQ2hhck1hcCogcENoYXJNYXAgPSBOVUxMKTsKKworICBGWF9EV09SRCBHZXRJRChGWF9TVFJTSVpFIHN0YXJ0X3BvcyA9IDApIGNvbnN0OworCisjZGVmaW5lIEZYRk9STUFUX1NJR05FRCAxCisjZGVmaW5lIEZYRk9STUFUX0hFWCAyCisjZGVmaW5lIEZYRk9STUFUX0NBUElUQUwgNAorCisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBGb3JtYXRJbnRlZ2VyKGludCBpLCBGWF9EV09SRCBmbGFncyA9IDApOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgRm9ybWF0RmxvYXQoRlhfRkxPQVQgZiwgaW50IHByZWNpc2lvbiA9IDApOworCisgcHJvdGVjdGVkOgorICAvLyBUbyBlbnN1cmUgcmVmIGNvdW50cyBkbyBub3Qgb3ZlcmZsb3csIGNvbnNpZGVyIHRoZSB3b3JzdCBwb3NzaWJsZSBjYXNlOgorICAvLyB0aGUgZW50aXJlIGFkZHJlc3Mgc3BhY2UgY29udGFpbnMgbm90aGluZyBidXQgcG9pbnRlcnMgdG8gdGhpcyBvYmplY3QuCisgIC8vIFNpbmNlIHRoZSBjb3VudCBpbmNyZW1lbnRzIHdpdGggZWFjaCBuZXcgcG9pbnRlciwgdGhlIGxhcmdlc3QgdmFsdWUgaXMKKyAgLy8gdGhlIG51bWJlciBvZiBwb2ludGVycyB0aGF0IGNhbiBmaXQgaW50byB0aGUgYWRkcmVzcyBzcGFjZS4gVGhlIHNpemUgb2YKKyAgLy8gdGhlIGFkZHJlc3Mgc3BhY2UgaXRzZWxmIGlzIGEgZ29vZCB1cHBlciBib3VuZCBvbiBpdDsgd2UgbmVlZCBub3QgZ28KKyAgLy8gbGFyZ2VyLgorICBjbGFzcyBTdHJpbmdEYXRhIHsKKyAgIHB1YmxpYzoKKyAgICBzdGF0aWMgU3RyaW5nRGF0YSogQ3JlYXRlKGludCBuTGVuKTsKKyAgICB2b2lkIFJldGFpbigpIHsgKyttX25SZWZzOyB9CisgICAgdm9pZCBSZWxlYXNlKCkgeworICAgICAgaWYgKC0tbV9uUmVmcyA8PSAwKQorICAgICAgICBGWF9GcmVlKHRoaXMpOwogICAgIH0KIAotICAgIENGWF9CeXRlU3RyaW5nKGNoYXIgY2gpOwotICAgIENGWF9CeXRlU3RyaW5nKGNvbnN0IEZYX0NIQVIqIHB0cikKLSAgICAgICAgICAgIDogQ0ZYX0J5dGVTdHJpbmcocHRyLCBwdHIgPyBGWFNZU19zdHJsZW4ocHRyKSA6IDApIHsgfQorICAgIGludHB0cl90IG1fblJlZnM7ICAvLyBXb3VsZCBwcmVmZXIgc3NpemVfdCwgYnV0IG5vIHdpbmRvd3Mgc3VwcG9ydC4KKyAgICBGWF9TVFJTSVpFIG1fbkRhdGFMZW5ndGg7CisgICAgRlhfU1RSU0laRSBtX25BbGxvY0xlbmd0aDsKKyAgICBGWF9DSEFSIG1fU3RyaW5nWzFdOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcoY29uc3QgRlhfQ0hBUiogcHRyLCBGWF9TVFJTSVpFIGxlbik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcoY29uc3QgdWludDhfdCogcHRyLCBGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzdHJjKTsKLSAgICBDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzdHJjMSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyYzIpOwotCi0gICAgfkNGWF9CeXRlU3RyaW5nKCk7Ci0KLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJRnJvbVVuaWNvZGUoY29uc3QgRlhfV0NIQVIqIHB0ciwgRlhfU1RSU0laRSBsZW4gPSAtMSk7Ci0KLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJRnJvbVVuaWNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0KLSAgICAvLyBFeHBsaWNpdCBjb252ZXJzaW9uIHRvIHJhdyBzdHJpbmcKLSAgICBjb25zdCBGWF9DSEFSKiBjX3N0cigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nIDogIiI7CisgICBwcml2YXRlOgorICAgIFN0cmluZ0RhdGEoRlhfU1RSU0laRSBkYXRhTGVuLCBGWF9TVFJTSVpFIGFsbG9jTGVuKQorICAgICAgICA6IG1fblJlZnMoMSksIG1fbkRhdGFMZW5ndGgoZGF0YUxlbiksIG1fbkFsbG9jTGVuZ3RoKGFsbG9jTGVuKSB7CisgICAgICBGWFNZU19hc3NlcnQoZGF0YUxlbiA+PSAwKTsKKyAgICAgIEZYU1lTX2Fzc2VydChhbGxvY0xlbiA+PSAwKTsKKyAgICAgIEZYU1lTX2Fzc2VydChkYXRhTGVuIDw9IGFsbG9jTGVuKTsKKyAgICAgIG1fU3RyaW5nW2RhdGFMZW5dID0gMDsKICAgICB9CisgICAgflN0cmluZ0RhdGEoKSA9IGRlbGV0ZTsKKyAgfTsKIAotICAgIC8vIEltcGxpY2l0IGNvbnZlcnNpb24gdG8gQy1zdHlsZSBzdHJpbmcgLS0gZGVwcmVjYXRlZAotICAgIG9wZXJhdG9yCQkJCWNvbnN0IEZYX0NIQVIqKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmcgOiAiIjsKLSAgICB9CisgIHZvaWQgQWxsb2NDb3B5KENGWF9CeXRlU3RyaW5nJiBkZXN0LAorICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3B5TGVuLAorICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3B5SW5kZXgpIGNvbnN0OworICB2b2lkIEFzc2lnbkNvcHkoRlhfU1RSU0laRSBuU3JjTGVuLCBjb25zdCBGWF9DSEFSKiBscHN6U3JjRGF0YSk7CisgIHZvaWQgQ29uY2F0Q29weShGWF9TVFJTSVpFIG5TcmMxTGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbHBzelNyYzFEYXRhLAorICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuU3JjMkxlbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGxwc3pTcmMyRGF0YSk7CisgIHZvaWQgQ29uY2F0SW5QbGFjZShGWF9TVFJTSVpFIG5TcmNMZW4sIGNvbnN0IEZYX0NIQVIqIGxwc3pTcmNEYXRhKTsKKyAgdm9pZCBDb3B5QmVmb3JlV3JpdGUoKTsKKyAgdm9pZCBBbGxvY0JlZm9yZVdyaXRlKEZYX1NUUlNJWkUgbkxlbik7CiAKLSAgICBvcGVyYXRvcgkJCQljb25zdCB1aW50OF90KigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGF0YSA/IChjb25zdCB1aW50OF90KiltX3BEYXRhLT5tX1N0cmluZyA6IE5VTEw7Ci0gICAgfQotCi0gICAgRlhfU1RSU0laRQkJCQlHZXRMZW5ndGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIDogMDsKLSAgICB9Ci0KLSAgICBib29sCQkJCQlJc0VtcHR5KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAhR2V0TGVuZ3RoKCk7Ci0gICAgfQotCi0gICAgaW50CQkJCQkJQ29tcGFyZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3Q7Ci0KLQotICAgIGJvb2wgRXF1YWwoY29uc3QgY2hhciogcHRyKSBjb25zdDsKLSAgICBib29sIEVxdWFsKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdDsKLSAgICBib29sIEVxdWFsKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvdGhlcikgY29uc3Q7Ci0KLSAgICBib29sIEVxdWFsTm9DYXNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdDsKLQotICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgY2hhciogcHRyKSBjb25zdCB7IHJldHVybiBFcXVhbChwdHIpOyB9Ci0gICAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3QgeyByZXR1cm4gRXF1YWwoc3RyKTsgfQotICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG90aGVyKSBjb25zdCB7IHJldHVybiBFcXVhbChvdGhlcik7IH0KLQotICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgY2hhciogcHRyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHB0cik7IH0KLSAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhKCp0aGlzID09IHN0cik7Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLSAgICB9Ci0KLSAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgY29uc3QKLSAgICB7Ci0gICAgICAgIGludCByZXN1bHQgPSBGWFNZU19tZW1jbXAoY19zdHIoKSwgc3RyLmNfc3RyKCksIHN0ZDo6bWluKEdldExlbmd0aCgpLCBzdHIuR2V0TGVuZ3RoKCkpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdCA8IDAgfHwgKHJlc3VsdCA9PSAwICYmIEdldExlbmd0aCgpIDwgc3RyLkdldExlbmd0aCgpKTsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCQlFbXB0eSgpOwotCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCW9wZXJhdG9yID0gKGNvbnN0IEZYX0NIQVIqIHN0cik7Ci0KLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYJb3BlcmF0b3IgPSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyYyk7Ci0KLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYJb3BlcmF0b3IgPSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZ1NyYyk7Ci0KLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYJb3BlcmF0b3IgPSAoY29uc3QgQ0ZYX0JpbmFyeUJ1ZiYgYnVmKTsKLQotICAgIHZvaWQJCQkJCUxvYWQoY29uc3QgdWludDhfdCogc3RyLCBGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYJb3BlcmF0b3IgKz0gKEZYX0NIQVIgY2gpOwotCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCW9wZXJhdG9yICs9IChjb25zdCBGWF9DSEFSKiBzdHIpOwotCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCW9wZXJhdG9yICs9IChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKLQotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJglvcGVyYXRvciArPSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyYyk7Ci0KLSAgICB1aW50OF90CQkJCQlHZXRBdChGWF9TVFJTSVpFIG5JbmRleCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA6IDA7Ci0gICAgfQotCi0gICAgdWludDhfdAkJCQkJb3BlcmF0b3JbXShGWF9TVFJTSVpFIG5JbmRleCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA6IDA7Ci0gICAgfQotCi0gICAgdm9pZAkJCQkJU2V0QXQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX0NIQVIgY2gpOwotCi0gICAgRlhfU1RSU0laRQkJCQlJbnNlcnQoRlhfU1RSU0laRSBpbmRleCwgRlhfQ0hBUiBjaCk7Ci0KLSAgICBGWF9TVFJTSVpFCQkJCURlbGV0ZShGWF9TVFJTSVpFIGluZGV4LCBGWF9TVFJTSVpFIGNvdW50ID0gMSk7Ci0KLQotICAgIHZvaWQJCQkJCUZvcm1hdChjb25zdCBGWF9DSEFSKiBscHN6Rm9ybWF0LCAuLi4gKTsKLQotICAgIHZvaWQJCQkJCUZvcm1hdFYoY29uc3QgRlhfQ0hBUiogbHBzekZvcm1hdCwgdmFfbGlzdCBhcmdMaXN0KTsKLQotCi0gICAgdm9pZAkJCQkJUmVzZXJ2ZShGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICBGWF9DSEFSKgkJCQlHZXRCdWZmZXIoRlhfU1RSU0laRSBsZW4pOwotCi0gICAgdm9pZAkJCQkJUmVsZWFzZUJ1ZmZlcihGWF9TVFJTSVpFIGxlbiA9IC0xKTsKLQotICAgIENGWF9CeXRlU3RyaW5nCQkJTWlkKEZYX1NUUlNJWkUgZmlyc3QpIGNvbnN0OwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlNaWQoRlhfU1RSU0laRSBmaXJzdCwgRlhfU1RSU0laRSBjb3VudCkgY29uc3Q7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZwkJCUxlZnQoRlhfU1RSU0laRSBjb3VudCkgY29uc3Q7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZwkJCVJpZ2h0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OwotCi0gICAgRlhfU1RSU0laRQkJCQlGaW5kKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzelN1YiwgRlhfU1RSU0laRSBzdGFydCA9IDApIGNvbnN0OwotCi0gICAgRlhfU1RSU0laRQkJCQlGaW5kKEZYX0NIQVIgY2gsIEZYX1NUUlNJWkUgc3RhcnQgPSAwKSBjb25zdDsKLQotICAgIEZYX1NUUlNJWkUJCQkJUmV2ZXJzZUZpbmQoRlhfQ0hBUiBjaCkgY29uc3Q7Ci0KLSAgICB2b2lkCQkJCQlNYWtlTG93ZXIoKTsKLQotICAgIHZvaWQJCQkJCU1ha2VVcHBlcigpOwotCi0gICAgdm9pZAkJCQkJVHJpbVJpZ2h0KCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltUmlnaHQoRlhfQ0hBUiBjaFRhcmdldCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltUmlnaHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6VGFyZ2V0cyk7Ci0KLSAgICB2b2lkCQkJCQlUcmltTGVmdCgpOwotCi0gICAgdm9pZAkJCQkJVHJpbUxlZnQoRlhfQ0hBUiBjaFRhcmdldCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltTGVmdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pUYXJnZXRzKTsKLQotICAgIEZYX1NUUlNJWkUJCQkJUmVwbGFjZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pPbGQsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzek5ldyk7Ci0KLSAgICBGWF9TVFJTSVpFCQkJCVJlbW92ZShGWF9DSEFSIGNoKTsKLQotICAgIENGWF9XaWRlU3RyaW5nCQkJVVRGOERlY29kZSgpIGNvbnN0OwotCi0gICAgdm9pZAkJCQkJQ29udmVydEZyb20oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ciwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCk7Ci0KLSAgICBGWF9EV09SRAkJCQlHZXRJRChGWF9TVFJTSVpFIHN0YXJ0X3BvcyA9IDApIGNvbnN0OwotCi0jZGVmaW5lIEZYRk9STUFUX1NJR05FRAkJCTEKLSNkZWZpbmUgRlhGT1JNQVRfSEVYCQkJMgotI2RlZmluZSBGWEZPUk1BVF9DQVBJVEFMCQk0Ci0KLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJRm9ybWF0SW50ZWdlcihpbnQgaSwgRlhfRFdPUkQgZmxhZ3MgPSAwKTsKLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJRm9ybWF0RmxvYXQoRlhfRkxPQVQgZiwgaW50IHByZWNpc2lvbiA9IDApOwotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gVG8gZW5zdXJlIHJlZiBjb3VudHMgZG8gbm90IG92ZXJmbG93LCBjb25zaWRlciB0aGUgd29yc3QgcG9zc2libGUgY2FzZToKLSAgICAvLyB0aGUgZW50aXJlIGFkZHJlc3Mgc3BhY2UgY29udGFpbnMgbm90aGluZyBidXQgcG9pbnRlcnMgdG8gdGhpcyBvYmplY3QuCi0gICAgLy8gU2luY2UgdGhlIGNvdW50IGluY3JlbWVudHMgd2l0aCBlYWNoIG5ldyBwb2ludGVyLCB0aGUgbGFyZ2VzdCB2YWx1ZSBpcwotICAgIC8vIHRoZSBudW1iZXIgb2YgcG9pbnRlcnMgdGhhdCBjYW4gZml0IGludG8gdGhlIGFkZHJlc3Mgc3BhY2UuIFRoZSBzaXplIG9mCi0gICAgLy8gdGhlIGFkZHJlc3Mgc3BhY2UgaXRzZWxmIGlzIGEgZ29vZCB1cHBlciBib3VuZCBvbiBpdDsgd2UgbmVlZCBub3QgZ28KLSAgICAvLyBsYXJnZXIuCi0gICAgY2xhc3MgU3RyaW5nRGF0YSB7Ci0gICAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXRpYyBTdHJpbmdEYXRhKiBDcmVhdGUoaW50IG5MZW4pOwotICAgICAgICB2b2lkIFJldGFpbigpIHsgKyttX25SZWZzOyB9Ci0gICAgICAgIHZvaWQgUmVsZWFzZSgpIHsgaWYgKC0tbV9uUmVmcyA8PSAwKSBGWF9GcmVlKHRoaXMpOyB9Ci0KLSAgICAgICAgaW50cHRyX3QgICAgbV9uUmVmczsgIC8vIFdvdWxkIHByZWZlciBzc2l6ZV90LCBidXQgbm8gd2luZG93cyBzdXBwb3J0LgotICAgICAgICBGWF9TVFJTSVpFICBtX25EYXRhTGVuZ3RoOwotICAgICAgICBGWF9TVFJTSVpFICBtX25BbGxvY0xlbmd0aDsKLSAgICAgICAgRlhfQ0hBUiAgICAgbV9TdHJpbmdbMV07Ci0KLSAgICAgIHByaXZhdGU6Ci0gICAgICAgIFN0cmluZ0RhdGEoRlhfU1RSU0laRSBkYXRhTGVuLCBGWF9TVFJTSVpFIGFsbG9jTGVuKQotICAgICAgICAgICAgICAgIDogbV9uUmVmcygxKSwgbV9uRGF0YUxlbmd0aChkYXRhTGVuKSwgbV9uQWxsb2NMZW5ndGgoYWxsb2NMZW4pIHsKLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChkYXRhTGVuID49IDApOwotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGFsbG9jTGVuID49IDApOwotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGRhdGFMZW4gPD0gYWxsb2NMZW4pOwotICAgICAgICAgICAgbV9TdHJpbmdbZGF0YUxlbl0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIH5TdHJpbmdEYXRhKCkgPSBkZWxldGU7Ci0gICAgfTsKLQotICAgIHZvaWQJCQkJCUFsbG9jQ29weShDRlhfQnl0ZVN0cmluZyYgZGVzdCwgRlhfU1RSU0laRSBuQ29weUxlbiwgRlhfU1RSU0laRSBuQ29weUluZGV4KSBjb25zdDsKLSAgICB2b2lkCQkJCQlBc3NpZ25Db3B5KEZYX1NUUlNJWkUgblNyY0xlbiwgY29uc3QgRlhfQ0hBUiogbHBzelNyY0RhdGEpOwotICAgIHZvaWQJCQkJCUNvbmNhdENvcHkoRlhfU1RSU0laRSBuU3JjMUxlbiwgY29uc3QgRlhfQ0hBUiogbHBzelNyYzFEYXRhLCBGWF9TVFJTSVpFIG5TcmMyTGVuLCBjb25zdCBGWF9DSEFSKiBscHN6U3JjMkRhdGEpOwotICAgIHZvaWQJCQkJCUNvbmNhdEluUGxhY2UoRlhfU1RSU0laRSBuU3JjTGVuLCBjb25zdCBGWF9DSEFSKiBscHN6U3JjRGF0YSk7Ci0gICAgdm9pZAkJCQkJQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgdm9pZAkJCQkJQWxsb2NCZWZvcmVXcml0ZShGWF9TVFJTSVpFIG5MZW4pOwotCi0gICAgU3RyaW5nRGF0YSogbV9wRGF0YTsKLSAgICBmcmllbmQgY2xhc3MgZnhjcnRfQnl0ZVN0cmluZ0NvbmNhdEluUGxhY2VfVGVzdDsKKyAgU3RyaW5nRGF0YSogbV9wRGF0YTsKKyAgZnJpZW5kIGNsYXNzIGZ4Y3J0X0J5dGVTdHJpbmdDb25jYXRJblBsYWNlX1Rlc3Q7CiB9OwotaW5saW5lIENGWF9CeXRlU3RyaW5nQzo6Q0ZYX0J5dGVTdHJpbmdDKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMpCi17Ci0gICAgbV9QdHIgPSAoY29uc3QgdWludDhfdCopc3JjOwotICAgIG1fTGVuZ3RoID0gc3JjLkdldExlbmd0aCgpOworaW5saW5lIENGWF9CeXRlU3RyaW5nQzo6Q0ZYX0J5dGVTdHJpbmdDKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMpIHsKKyAgbV9QdHIgPSAoY29uc3QgdWludDhfdCopc3JjOworICBtX0xlbmd0aCA9IHNyYy5HZXRMZW5ndGgoKTsKIH0KLWlubGluZSBDRlhfQnl0ZVN0cmluZ0MmIENGWF9CeXRlU3RyaW5nQzo6b3BlcmF0b3IgPSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYykKLXsKLSAgICBtX1B0ciA9IChjb25zdCB1aW50OF90KilzcmM7Ci0gICAgbV9MZW5ndGggPSBzcmMuR2V0TGVuZ3RoKCk7CitpbmxpbmUgQ0ZYX0J5dGVTdHJpbmdDJiBDRlhfQnl0ZVN0cmluZ0M6Om9wZXJhdG9yPShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjKSB7CisgIG1fUHRyID0gKGNvbnN0IHVpbnQ4X3QqKXNyYzsKKyAgbV9MZW5ndGggPSBzcmMuR2V0TGVuZ3RoKCk7CisgIHJldHVybiAqdGhpczsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjaGFyKiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaHMpIHsKKyAgcmV0dXJuIHJocyA9PSBsaHM7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgcmhzKSB7CisgIHJldHVybiByaHMgPT0gbGhzOworfQoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjaGFyKiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaHMpIHsKKyAgcmV0dXJuIHJocyAhPSBsaHM7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgcmhzKSB7CisgIHJldHVybiByaHMgIT0gbGhzOworfQorCitpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIyKSB7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKK30KK2lubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBzdHIyKSB7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKK30KK2lubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgRlhfQ0hBUiogc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIyKSB7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKK30KK2lubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIxLCBGWF9DSEFSIGNoKSB7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBDRlhfQnl0ZVN0cmluZ0MoY2gpKTsKK30KK2lubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoRlhfQ0hBUiBjaCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIyKSB7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhjaCwgc3RyMik7Cit9CitpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyMikgeworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyMSwgc3RyMik7Cit9CitpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIxLCBGWF9DSEFSIGNoKSB7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBDRlhfQnl0ZVN0cmluZ0MoY2gpKTsKK30KK2lubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoRlhfQ0hBUiBjaCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGNoLCBzdHIyKTsKK30KK2lubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQoraW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBGWF9DSEFSKiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyMikgeworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyMSwgc3RyMik7Cit9CitpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQoraW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIyKSB7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKK30KK2NsYXNzIENGWF9XaWRlU3RyaW5nQyB7CisgcHVibGljOgorICB0eXBlZGVmIEZYX1dDSEFSIHZhbHVlX3R5cGU7CisKKyAgQ0ZYX1dpZGVTdHJpbmdDKCkgeworICAgIG1fUHRyID0gTlVMTDsKKyAgICBtX0xlbmd0aCA9IDA7CisgIH0KKworICBDRlhfV2lkZVN0cmluZ0MoY29uc3QgRlhfV0NIQVIqIHB0cikgeworICAgIG1fUHRyID0gcHRyOworICAgIG1fTGVuZ3RoID0gcHRyID8gRlhTWVNfd2NzbGVuKHB0cikgOiAwOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmdDKEZYX1dDSEFSJiBjaCkgeworICAgIG1fUHRyID0gJmNoOworICAgIG1fTGVuZ3RoID0gMTsKKyAgfQorCisgIENGWF9XaWRlU3RyaW5nQyhjb25zdCBGWF9XQ0hBUiogcHRyLCBGWF9TVFJTSVpFIGxlbikgeworICAgIG1fUHRyID0gcHRyOworICAgIG1fTGVuZ3RoID0gKGxlbiA9PSAtMSkgPyBGWFNZU193Y3NsZW4ocHRyKSA6IGxlbjsKKyAgfQorCisgIENGWF9XaWRlU3RyaW5nQyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHNyYykgeworICAgIG1fUHRyID0gc3JjLm1fUHRyOworICAgIG1fTGVuZ3RoID0gc3JjLm1fTGVuZ3RoOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmdDKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzcmMpOworCisgIENGWF9XaWRlU3RyaW5nQyYgb3BlcmF0b3I9KGNvbnN0IEZYX1dDSEFSKiBzcmMpIHsKKyAgICBtX1B0ciA9IHNyYzsKKyAgICBtX0xlbmd0aCA9IEZYU1lTX3djc2xlbihzcmMpOwogICAgIHJldHVybiAqdGhpczsKLX0KKyAgfQogCi1pbmxpbmUgYm9vbCBvcGVyYXRvcj09IChjb25zdCBjaGFyKiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaHMpIHsKLSAgICByZXR1cm4gcmhzID09IGxoczsKLX0KLWlubGluZSBib29sIG9wZXJhdG9yPT0gKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyA9PSBsaHM7Ci19Ci1pbmxpbmUgYm9vbCBvcGVyYXRvciE9IChjb25zdCBjaGFyKiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaHMpIHsKLSAgICByZXR1cm4gcmhzICE9IGxoczsKLX0KLWlubGluZSBib29sIG9wZXJhdG9yIT0gKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyAhPSBsaHM7Ci19CisgIENGWF9XaWRlU3RyaW5nQyYgb3BlcmF0b3I9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3JjKSB7CisgICAgbV9QdHIgPSBzcmMubV9QdHI7CisgICAgbV9MZW5ndGggPSBzcmMubV9MZW5ndGg7CisgICAgcmV0dXJuICp0aGlzOworICB9CiAKLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjEsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyMikKLXsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyMSwgc3RyMik7Ci19Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IgKyAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIxLCBjb25zdCBGWF9DSEFSKiBzdHIyKQotewotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBGWF9DSEFSKiBzdHIxLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjIpCi17Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOwotfQotaW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yICsgKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyMSwgRlhfQ0hBUiBjaCkKLXsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyMSwgQ0ZYX0J5dGVTdHJpbmdDKGNoKSk7Ci19Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IgKyAoRlhfQ0hBUiBjaCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIyKQotewotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhjaCwgc3RyMik7Ci19Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IgKyAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjEsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIyKQotewotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyMSwgRlhfQ0hBUiBjaCkKLXsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyMSwgQ0ZYX0J5dGVTdHJpbmdDKGNoKSk7Ci19Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IgKyAoRlhfQ0hBUiBjaCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjIpCi17Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGNoLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyMSwgY29uc3QgRlhfQ0hBUiogc3RyMikKLXsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyMSwgc3RyMik7Ci19Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IgKyAoY29uc3QgRlhfQ0hBUiogc3RyMSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjIpCi17Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOwotfQotaW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yICsgKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIxLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjIpCi17Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOwotfQotaW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yICsgKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyMSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjIpCi17Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOwotfQotY2xhc3MgQ0ZYX1dpZGVTdHJpbmdDCi17Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBGWF9XQ0hBUiB2YWx1ZV90eXBlOworICBDRlhfV2lkZVN0cmluZ0MmIG9wZXJhdG9yPShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3JjKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQygpCi0gICAgewotICAgICAgICBtX1B0ciA9IE5VTEw7Ci0gICAgICAgIG1fTGVuZ3RoID0gMDsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHdjaGFyX3QqIHB0cikgY29uc3QgeworICAgIHJldHVybiBGWFNZU193Y3NsZW4ocHRyKSA9PSBtX0xlbmd0aCAmJiB3bWVtY21wKHB0ciwgbV9QdHIsIG1fTGVuZ3RoKSA9PSAwOworICB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgY29uc3QgeworICAgIHJldHVybiBzdHIubV9MZW5ndGggPT0gbV9MZW5ndGggJiYgd21lbWNtcChzdHIubV9QdHIsIG1fUHRyLCBtX0xlbmd0aCkgPT0gMDsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHB0cik7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHN0cik7IH0KKworICBjb25zdCBGWF9XQ0hBUiogR2V0UHRyKCkgY29uc3QgeyByZXR1cm4gbV9QdHI7IH0KKworICBGWF9TVFJTSVpFIEdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fTGVuZ3RoOyB9CisKKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9MZW5ndGggPT0gMDsgfQorCisgIEZYX1dDSEFSIEdldEF0KEZYX1NUUlNJWkUgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fUHRyW2luZGV4XTsgfQorCisgIENGWF9XaWRlU3RyaW5nQyBMZWZ0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0IHsKKyAgICBpZiAoY291bnQgPCAxKSB7CisgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmdDKCk7CiAgICAgfQotCi0gICAgQ0ZYX1dpZGVTdHJpbmdDKGNvbnN0IEZYX1dDSEFSKiBwdHIpCi0gICAgewotICAgICAgICBtX1B0ciA9IHB0cjsKLSAgICAgICAgbV9MZW5ndGggPSBwdHIgPyBGWFNZU193Y3NsZW4ocHRyKSA6IDA7CisgICAgaWYgKGNvdW50ID4gbV9MZW5ndGgpIHsKKyAgICAgIGNvdW50ID0gbV9MZW5ndGg7CiAgICAgfQorICAgIHJldHVybiBDRlhfV2lkZVN0cmluZ0MobV9QdHIsIGNvdW50KTsKKyAgfQogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDKEZYX1dDSEFSJiBjaCkKLSAgICB7Ci0gICAgICAgIG1fUHRyID0gJmNoOwotICAgICAgICBtX0xlbmd0aCA9IDE7CisgIENGWF9XaWRlU3RyaW5nQyBNaWQoRlhfU1RSU0laRSBpbmRleCwgRlhfU1RSU0laRSBjb3VudCA9IC0xKSBjb25zdCB7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgaW5kZXggPSAwOwogICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nQyhjb25zdCBGWF9XQ0hBUiogcHRyLCBGWF9TVFJTSVpFIGxlbikKLSAgICB7Ci0gICAgICAgIG1fUHRyID0gcHRyOwotICAgICAgICBtX0xlbmd0aCA9IChsZW4gPT0gLTEpID8gRlhTWVNfd2NzbGVuKHB0cikgOiBsZW47CisgICAgaWYgKGluZGV4ID4gbV9MZW5ndGgpIHsKKyAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZ0MoKTsKICAgICB9Ci0KLSAgICBDRlhfV2lkZVN0cmluZ0MoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzcmMpCi0gICAgewotICAgICAgICBtX1B0ciA9IHNyYy5tX1B0cjsKLSAgICAgICAgbV9MZW5ndGggPSBzcmMubV9MZW5ndGg7CisgICAgaWYgKGNvdW50IDwgMCB8fCBjb3VudCA+IG1fTGVuZ3RoIC0gaW5kZXgpIHsKKyAgICAgIGNvdW50ID0gbV9MZW5ndGggLSBpbmRleDsKICAgICB9CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQyhtX1B0ciArIGluZGV4LCBjb3VudCk7CisgIH0KIAotICAgIENGWF9XaWRlU3RyaW5nQyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3JjKTsKLQotICAgIENGWF9XaWRlU3RyaW5nQyYgb3BlcmF0b3IgPSAoY29uc3QgRlhfV0NIQVIqIHNyYykKLSAgICB7Ci0gICAgICAgIG1fUHRyID0gc3JjOwotICAgICAgICBtX0xlbmd0aCA9IEZYU1lTX3djc2xlbihzcmMpOwotICAgICAgICByZXR1cm4gKnRoaXM7CisgIENGWF9XaWRlU3RyaW5nQyBSaWdodChGWF9TVFJTSVpFIGNvdW50KSBjb25zdCB7CisgICAgaWYgKGNvdW50IDwgMSkgeworICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQygpOwogICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nQyYgb3BlcmF0b3IgPSAoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzcmMpCi0gICAgewotICAgICAgICBtX1B0ciA9IHNyYy5tX1B0cjsKLSAgICAgICAgbV9MZW5ndGggPSBzcmMubV9MZW5ndGg7Ci0gICAgICAgIHJldHVybiAqdGhpczsKKyAgICBpZiAoY291bnQgPiBtX0xlbmd0aCkgeworICAgICAgY291bnQgPSBtX0xlbmd0aDsKICAgICB9CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQyhtX1B0ciArIG1fTGVuZ3RoIC0gY291bnQsIGNvdW50KTsKKyAgfQogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDJiBvcGVyYXRvciA9IChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3JjKTsKKyAgY29uc3QgRlhfV0NIQVImIG9wZXJhdG9yW10oc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX1B0cltpbmRleF07IH0KIAotICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCAgewotICAgICAgICByZXR1cm4gRlhTWVNfd2NzbGVuKHB0cikgPT0gbV9MZW5ndGggJiYKLSAgICAgICAgICAgIHdtZW1jbXAocHRyLCBtX1B0ciwgbV9MZW5ndGgpID09IDA7Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIGNvbnN0ICB7Ci0gICAgICAgIHJldHVybiBzdHIubV9MZW5ndGggPT0gbV9MZW5ndGggJiYKLSAgICAgICAgICAgIHdtZW1jbXAoc3RyLm1fUHRyLCBtX1B0ciwgbV9MZW5ndGgpID09IDA7Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHB0cik7IH0KLSAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhKCp0aGlzID09IHN0cik7Ci0gICAgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHRoYXQpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0gd21lbWNtcChtX1B0ciwgdGhhdC5tX1B0ciwgc3RkOjptaW4obV9MZW5ndGgsIHRoYXQubV9MZW5ndGgpKTsKKyAgICByZXR1cm4gcmVzdWx0IDwgMCB8fCAocmVzdWx0ID09IDAgJiYgbV9MZW5ndGggPCB0aGF0Lm1fTGVuZ3RoKTsKKyAgfQogCi0gICAgY29uc3QgRlhfV0NIQVIqCQlHZXRQdHIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUHRyOwotICAgIH0KKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IEZYX1dDSEFSKiBtX1B0cjsKKyAgRlhfU1RSU0laRSBtX0xlbmd0aDsKIAotICAgIEZYX1NUUlNJWkUJCUdldExlbmd0aCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9MZW5ndGg7Ci0gICAgfQotCi0gICAgYm9vbAkJCUlzRW1wdHkoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fTGVuZ3RoID09IDA7Ci0gICAgfQotCi0gICAgRlhfV0NIQVIJCUdldEF0KEZYX1NUUlNJWkUgaW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9QdHJbaW5kZXhdOwotICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nQwlMZWZ0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoY291bnQgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmdDKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvdW50ID4gbV9MZW5ndGgpIHsKLSAgICAgICAgICAgIGNvdW50ID0gbV9MZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQyhtX1B0ciwgY291bnQpOwotICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nQwlNaWQoRlhfU1RSU0laRSBpbmRleCwgRlhfU1RSU0laRSBjb3VudCA9IC0xKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgaW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmRleCA+IG1fTGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmdDKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvdW50IDwgMCB8fCBjb3VudCA+IG1fTGVuZ3RoIC0gaW5kZXgpIHsKLSAgICAgICAgICAgIGNvdW50ID0gbV9MZW5ndGggLSBpbmRleDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmdDKG1fUHRyICsgaW5kZXgsIGNvdW50KTsKLSAgICB9Ci0KLSAgICBDRlhfV2lkZVN0cmluZ0MJUmlnaHQoRlhfU1RSU0laRSBjb3VudCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChjb3VudCA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZ0MoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY291bnQgPiBtX0xlbmd0aCkgewotICAgICAgICAgICAgY291bnQgPSBtX0xlbmd0aDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmdDKG1fUHRyICsgbV9MZW5ndGggLSBjb3VudCwgY291bnQpOwotICAgIH0KLQotICAgIGNvbnN0IEZYX1dDSEFSJiBvcGVyYXRvcltdIChzaXplX3QgaW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9QdHJbaW5kZXhdOwotICAgIH0KLQotICAgIGJvb2wgb3BlcmF0b3I8IChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHRoYXQpIGNvbnN0Ci0gICAgewotICAgICAgICBpbnQgcmVzdWx0ID0gd21lbWNtcChtX1B0ciwgdGhhdC5tX1B0ciwgc3RkOjptaW4obV9MZW5ndGgsIHRoYXQubV9MZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdCA8IDAgfHwgKHJlc3VsdCA9PSAwICYmIG1fTGVuZ3RoIDwgdGhhdC5tX0xlbmd0aCk7Ci0gICAgIH0KLQotcHJvdGVjdGVkOgotICAgIGNvbnN0IEZYX1dDSEFSKgkJbV9QdHI7Ci0gICAgRlhfU1RSU0laRQkJbV9MZW5ndGg7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCoJCQlvcGVyYXRvciBuZXcgKHNpemVfdCkgdGhyb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorIHByaXZhdGU6CisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QpIHRocm93KCkgeyByZXR1cm4gTlVMTDsgfQogfTsKLWlubGluZSBib29sIG9wZXJhdG9yPT0gKGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiByaHMpIHsKLSAgICByZXR1cm4gcmhzID09IGxoczsKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHJocykgeworICByZXR1cm4gcmhzID09IGxoczsKIH0KLWlubGluZSBib29sIG9wZXJhdG9yIT0gKGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiByaHMpIHsKLSAgICByZXR1cm4gcmhzICE9IGxoczsKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHJocykgeworICByZXR1cm4gcmhzICE9IGxoczsKIH0KICNkZWZpbmUgRlhfV1NUUkMod3N0cikgQ0ZYX1dpZGVTdHJpbmdDKHdzdHIsIEZYX0FycmF5U2l6ZSh3c3RyKSAtIDEpCiAKIC8vIEEgbXV0YWJsZSBzdHJpbmcgd2l0aCBzaGFyZWQgYnVmZmVycyB1c2luZyBjb3B5LW9uLXdyaXRlIHNlbWFudGljcyB0aGF0CiAvLyBhdm9pZHMgdGhlIGNvc3Qgb2Ygc3RkOjpzdHJpbmcncyBpdGVyYXRvciBzdGFiaWxpdHkgZ3VhcmFudGVlcy4KLWNsYXNzIENGWF9XaWRlU3RyaW5nCi17Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBGWF9XQ0hBUiB2YWx1ZV90eXBlOworY2xhc3MgQ0ZYX1dpZGVTdHJpbmcgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBGWF9XQ0hBUiB2YWx1ZV90eXBlOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcoKSA6IG1fcERhdGEobnVsbHB0cikgeyB9CisgIENGWF9XaWRlU3RyaW5nKCkgOiBtX3BEYXRhKG51bGxwdHIpIHt9CiAKLSAgICAvLyBDb3B5IGNvbnN0cnVjdG9yLgotICAgIENGWF9XaWRlU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKIAotICAgIC8vIE1vdmUgY29uc3RydWN0b3IuCi0gICAgaW5saW5lIENGWF9XaWRlU3RyaW5nKENGWF9XaWRlU3RyaW5nJiYgb3RoZXIpIHsKLSAgICAgICAgbV9wRGF0YSA9IG90aGVyLm1fcERhdGE7Ci0gICAgICAgIG90aGVyLm1fcERhdGEgPSBudWxscHRyOworICAvLyBNb3ZlIGNvbnN0cnVjdG9yLgorICBpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmJiBvdGhlcikgeworICAgIG1fcERhdGEgPSBvdGhlci5tX3BEYXRhOworICAgIG90aGVyLm1fcERhdGEgPSBudWxscHRyOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHB0cikKKyAgICAgIDogQ0ZYX1dpZGVTdHJpbmcocHRyLCBwdHIgPyBGWFNZU193Y3NsZW4ocHRyKSA6IDApIHt9CisKKyAgQ0ZYX1dpZGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHB0ciwgRlhfU1RSU0laRSBsZW4pOworCisgIENGWF9XaWRlU3RyaW5nKEZYX1dDSEFSIGNoKTsKKworICBDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cik7CisKKyAgQ0ZYX1dpZGVTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIxLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjIpOworCisgIH5DRlhfV2lkZVN0cmluZygpOworCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBGcm9tTG9jYWwoY29uc3QgY2hhciogc3RyLCBGWF9TVFJTSVpFIGxlbiA9IC0xKTsKKworICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgRnJvbVVURjgoY29uc3QgY2hhciogc3RyLCBGWF9TVFJTSVpFIGxlbik7CisKKyAgc3RhdGljIENGWF9XaWRlU3RyaW5nIEZyb21VVEYxNkxFKGNvbnN0IHVuc2lnbmVkIHNob3J0KiBzdHIsIEZYX1NUUlNJWkUgbGVuKTsKKworICBzdGF0aWMgRlhfU1RSU0laRSBXU3RyaW5nTGVuZ3RoKGNvbnN0IHVuc2lnbmVkIHNob3J0KiBzdHIpOworCisgIC8vIEV4cGxpY2l0IGNvbnZlcnNpb24gdG8gcmF3IHN0cmluZworICBjb25zdCBGWF9XQ0hBUiogY19zdHIoKSBjb25zdCB7IHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmcgOiBMIiI7IH0KKworICAvLyBJbXBsaWNpdCBjb252ZXJzaW9uIHRvIEMtc3R5bGUgd2lkZSBzdHJpbmcgLS0gZGVwcmVjYXRlZAorICBvcGVyYXRvciBjb25zdCBGWF9XQ0hBUiooKSBjb25zdCB7IHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmcgOiBMIiI7IH0KKworICB2b2lkIEVtcHR5KCk7CisKKyAgRlhfQk9PTCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIUdldExlbmd0aCgpOyB9CisKKyAgRlhfU1RSU0laRSBHZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA6IDA7IH0KKworICBjb25zdCBDRlhfV2lkZVN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IEZYX1dDSEFSKiBzdHIpOworCisgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZ1NyYyk7CisKKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cmluZ1NyYyk7CisKKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgRlhfV0NIQVIqIHN0cik7CisKKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9wZXJhdG9yKz0oRlhfV0NIQVIgY2gpOworCisgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOworCisgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCB7IHJldHVybiBFcXVhbChwdHIpOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgY29uc3QgeyByZXR1cm4gRXF1YWwoc3RyKTsgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG90aGVyKSBjb25zdCB7IHJldHVybiBFcXVhbChvdGhlcik7IH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHB0cik7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHN0cik7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0KKyAgICAgICAgd21lbWNtcChjX3N0cigpLCBzdHIuY19zdHIoKSwgc3RkOjptaW4oR2V0TGVuZ3RoKCksIHN0ci5HZXRMZW5ndGgoKSkpOworICAgIHJldHVybiByZXN1bHQgPCAwIHx8IChyZXN1bHQgPT0gMCAmJiBHZXRMZW5ndGgoKSA8IHN0ci5HZXRMZW5ndGgoKSk7CisgIH0KKworICBGWF9XQ0hBUiBHZXRBdChGWF9TVFJTSVpFIG5JbmRleCkgY29uc3QgeworICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA6IDA7CisgIH0KKworICBGWF9XQ0hBUiBvcGVyYXRvcltdKEZYX1NUUlNJWkUgbkluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdIDogMDsKKyAgfQorCisgIHZvaWQgU2V0QXQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX1dDSEFSIGNoKTsKKworICBpbnQgQ29tcGFyZShjb25zdCBGWF9XQ0hBUiogc3RyKSBjb25zdDsKKworICBpbnQgQ29tcGFyZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSBjb25zdDsKKworICBpbnQgQ29tcGFyZU5vQ2FzZShjb25zdCBGWF9XQ0hBUiogc3RyKSBjb25zdDsKKworICBib29sIEVxdWFsKGNvbnN0IHdjaGFyX3QqIHB0cikgY29uc3Q7CisgIGJvb2wgRXF1YWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIGNvbnN0OworICBib29sIEVxdWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvdGhlcikgY29uc3Q7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgTWlkKEZYX1NUUlNJWkUgZmlyc3QpIGNvbnN0OworCisgIENGWF9XaWRlU3RyaW5nIE1pZChGWF9TVFJTSVpFIGZpcnN0LCBGWF9TVFJTSVpFIGNvdW50KSBjb25zdDsKKworICBDRlhfV2lkZVN0cmluZyBMZWZ0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OworCisgIENGWF9XaWRlU3RyaW5nIFJpZ2h0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OworCisgIEZYX1NUUlNJWkUgSW5zZXJ0KEZYX1NUUlNJWkUgaW5kZXgsIEZYX1dDSEFSIGNoKTsKKworICBGWF9TVFJTSVpFIERlbGV0ZShGWF9TVFJTSVpFIGluZGV4LCBGWF9TVFJTSVpFIGNvdW50ID0gMSk7CisKKyAgdm9pZCBGb3JtYXQoY29uc3QgRlhfV0NIQVIqIGxwc3pGb3JtYXQsIC4uLik7CisKKyAgdm9pZCBGb3JtYXRWKGNvbnN0IEZYX1dDSEFSKiBscHN6Rm9ybWF0LCB2YV9saXN0IGFyZ0xpc3QpOworCisgIHZvaWQgTWFrZUxvd2VyKCk7CisKKyAgdm9pZCBNYWtlVXBwZXIoKTsKKworICB2b2lkIFRyaW1SaWdodCgpOworCisgIHZvaWQgVHJpbVJpZ2h0KEZYX1dDSEFSIGNoVGFyZ2V0KTsKKworICB2b2lkIFRyaW1SaWdodChjb25zdCBGWF9XQ0hBUiogbHBzelRhcmdldHMpOworCisgIHZvaWQgVHJpbUxlZnQoKTsKKworICB2b2lkIFRyaW1MZWZ0KEZYX1dDSEFSIGNoVGFyZ2V0KTsKKworICB2b2lkIFRyaW1MZWZ0KGNvbnN0IEZYX1dDSEFSKiBscHN6VGFyZ2V0cyk7CisKKyAgdm9pZCBSZXNlcnZlKEZYX1NUUlNJWkUgbGVuKTsKKworICBGWF9XQ0hBUiogR2V0QnVmZmVyKEZYX1NUUlNJWkUgbGVuKTsKKworICB2b2lkIFJlbGVhc2VCdWZmZXIoRlhfU1RSU0laRSBsZW4gPSAtMSk7CisKKyAgaW50IEdldEludGVnZXIoKSBjb25zdDsKKworICBGWF9GTE9BVCBHZXRGbG9hdCgpIGNvbnN0OworCisgIEZYX1NUUlNJWkUgRmluZChjb25zdCBGWF9XQ0hBUiogbHBzelN1YiwgRlhfU1RSU0laRSBzdGFydCA9IDApIGNvbnN0OworCisgIEZYX1NUUlNJWkUgRmluZChGWF9XQ0hBUiBjaCwgRlhfU1RSU0laRSBzdGFydCA9IDApIGNvbnN0OworCisgIEZYX1NUUlNJWkUgUmVwbGFjZShjb25zdCBGWF9XQ0hBUiogbHBzek9sZCwgY29uc3QgRlhfV0NIQVIqIGxwc3pOZXcpOworCisgIEZYX1NUUlNJWkUgUmVtb3ZlKEZYX1dDSEFSIGNoKTsKKworICBDRlhfQnl0ZVN0cmluZyBVVEY4RW5jb2RlKCkgY29uc3Q7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgVVRGMTZMRV9FbmNvZGUoKSBjb25zdDsKKworICB2b2lkIENvbnZlcnRGcm9tKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpOworCisgcHJvdGVjdGVkOgorICBjbGFzcyBTdHJpbmdEYXRhIHsKKyAgIHB1YmxpYzoKKyAgICBzdGF0aWMgU3RyaW5nRGF0YSogQ3JlYXRlKGludCBuTGVuKTsKKyAgICB2b2lkIFJldGFpbigpIHsgKyttX25SZWZzOyB9CisgICAgdm9pZCBSZWxlYXNlKCkgeworICAgICAgaWYgKC0tbV9uUmVmcyA8PSAwKQorICAgICAgICBGWF9GcmVlKHRoaXMpOwogICAgIH0KIAotICAgIENGWF9XaWRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwdHIpCi0gICAgICAgICAgICA6IENGWF9XaWRlU3RyaW5nKHB0ciwgcHRyID8gRlhTWVNfd2NzbGVuKHB0cikgOiAwKSB7IH0KKyAgICBpbnRwdHJfdCBtX25SZWZzOyAgLy8gV291bGQgcHJlZmVyIHNzaXplX3QsIGJ1dCBubyB3aW5kb3dzIHN1cHBvcnQuCisgICAgRlhfU1RSU0laRSBtX25EYXRhTGVuZ3RoOworICAgIEZYX1NUUlNJWkUgbV9uQWxsb2NMZW5ndGg7CisgICAgRlhfV0NIQVIgbV9TdHJpbmdbMV07CiAKLSAgICBDRlhfV2lkZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHRyLCBGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyhGWF9XQ0hBUiBjaCk7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cik7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMik7Ci0KLSAgICB+Q0ZYX1dpZGVTdHJpbmcoKTsKLQotICAgIHN0YXRpYyBDRlhfV2lkZVN0cmluZwlGcm9tTG9jYWwoY29uc3QgY2hhciogc3RyLCBGWF9TVFJTSVpFIGxlbiA9IC0xKTsKLQotICAgIHN0YXRpYyBDRlhfV2lkZVN0cmluZwlGcm9tVVRGOChjb25zdCBjaGFyKiBzdHIsIEZYX1NUUlNJWkUgbGVuKTsKLQotICAgIHN0YXRpYyBDRlhfV2lkZVN0cmluZwlGcm9tVVRGMTZMRShjb25zdCB1bnNpZ25lZCBzaG9ydCogc3RyLCBGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICBzdGF0aWMgRlhfU1RSU0laRSAgICAgICBXU3RyaW5nTGVuZ3RoKGNvbnN0IHVuc2lnbmVkIHNob3J0KiBzdHIpOwotCi0gICAgLy8gRXhwbGljaXQgY29udmVyc2lvbiB0byByYXcgc3RyaW5nCi0gICAgY29uc3QgRlhfV0NIQVIqIGNfc3RyKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmcgOiBMIiI7CisgICBwcml2YXRlOgorICAgIFN0cmluZ0RhdGEoRlhfU1RSU0laRSBkYXRhTGVuLCBGWF9TVFJTSVpFIGFsbG9jTGVuKQorICAgICAgICA6IG1fblJlZnMoMSksIG1fbkRhdGFMZW5ndGgoZGF0YUxlbiksIG1fbkFsbG9jTGVuZ3RoKGFsbG9jTGVuKSB7CisgICAgICBGWFNZU19hc3NlcnQoZGF0YUxlbiA+PSAwKTsKKyAgICAgIEZYU1lTX2Fzc2VydChhbGxvY0xlbiA+PSAwKTsKKyAgICAgIEZYU1lTX2Fzc2VydChkYXRhTGVuIDw9IGFsbG9jTGVuKTsKKyAgICAgIG1fU3RyaW5nW2RhdGFMZW5dID0gMDsKICAgICB9CisgICAgflN0cmluZ0RhdGEoKSA9IGRlbGV0ZTsKKyAgfTsKIAotICAgIC8vIEltcGxpY2l0IGNvbnZlcnNpb24gdG8gQy1zdHlsZSB3aWRlIHN0cmluZyAtLSBkZXByZWNhdGVkCi0gICAgb3BlcmF0b3IgY29uc3QgRlhfV0NIQVIqKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmcgOiBMIiI7Ci0gICAgfQorICB2b2lkIENvcHlCZWZvcmVXcml0ZSgpOworICB2b2lkIEFsbG9jQmVmb3JlV3JpdGUoRlhfU1RSU0laRSBuTGVuKTsKKyAgdm9pZCBDb25jYXRJblBsYWNlKEZYX1NUUlNJWkUgblNyY0xlbiwgY29uc3QgRlhfV0NIQVIqIGxwc3pTcmNEYXRhKTsKKyAgdm9pZCBDb25jYXRDb3B5KEZYX1NUUlNJWkUgblNyYzFMZW4sCisgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBzelNyYzFEYXRhLAorICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuU3JjMkxlbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscHN6U3JjMkRhdGEpOworICB2b2lkIEFzc2lnbkNvcHkoRlhfU1RSU0laRSBuU3JjTGVuLCBjb25zdCBGWF9XQ0hBUiogbHBzelNyY0RhdGEpOworICB2b2lkIEFsbG9jQ29weShDRlhfV2lkZVN0cmluZyYgZGVzdCwKKyAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuQ29weUxlbiwKKyAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuQ29weUluZGV4KSBjb25zdDsKIAotICAgIHZvaWQJCQkJCUVtcHR5KCk7Ci0KLQotICAgIEZYX0JPT0wJCQkJCUlzRW1wdHkoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuICFHZXRMZW5ndGgoKTsKLSAgICB9Ci0KLSAgICBGWF9TVFJTSVpFCQkJCUdldExlbmd0aCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggOiAwOwotICAgIH0KLQotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJglvcGVyYXRvciA9IChjb25zdCBGWF9XQ0hBUiogc3RyKTsKLQotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJglvcGVyYXRvciA9KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmdTcmMpOwotCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmCW9wZXJhdG9yID0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHJpbmdTcmMpOwotCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmCW9wZXJhdG9yICs9IChjb25zdCBGWF9XQ0hBUiogc3RyKTsKLQotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJglvcGVyYXRvciArPSAoRlhfV0NIQVIgY2gpOwotCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmCW9wZXJhdG9yICs9IChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKLQotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJglvcGVyYXRvciArPSAoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpOwotCi0gICAgYm9vbCBvcGVyYXRvcj09IChjb25zdCB3Y2hhcl90KiBwdHIpIGNvbnN0IHsgcmV0dXJuIEVxdWFsKHB0cik7IH0KLSAgICBib29sIG9wZXJhdG9yPT0gKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSBjb25zdCB7IHJldHVybiBFcXVhbChzdHIpOyB9Ci0gICAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBDRlhfV2lkZVN0cmluZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIEVxdWFsKG90aGVyKTsgfQotCi0gICAgYm9vbCBvcGVyYXRvciE9IChjb25zdCB3Y2hhcl90KiBwdHIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcHRyKTsgfQotICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gc3RyKTsKLSAgICB9Ci0gICAgYm9vbCBvcGVyYXRvciE9IChjb25zdCBDRlhfV2lkZVN0cmluZyYgb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotICAgIH0KLQotICAgIGJvb2wgb3BlcmF0b3I8IChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSBjb25zdCB7Ci0gICAgICAgIGludCByZXN1bHQgPSB3bWVtY21wKGNfc3RyKCksIHN0ci5jX3N0cigpLCBzdGQ6Om1pbihHZXRMZW5ndGgoKSwgc3RyLkdldExlbmd0aCgpKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQgPCAwIHx8IChyZXN1bHQgPT0gMCAmJiBHZXRMZW5ndGgoKSA8IHN0ci5HZXRMZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgRlhfV0NIQVIJCQkJR2V0QXQoRlhfU1RSU0laRSBuSW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nW25JbmRleF0gOiAwOwotICAgIH0KLQotICAgIEZYX1dDSEFSCQkJCW9wZXJhdG9yW10oRlhfU1RSU0laRSBuSW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nW25JbmRleF0gOiAwOwotICAgIH0KLQotICAgIHZvaWQJCQkJCVNldEF0KEZYX1NUUlNJWkUgbkluZGV4LCBGWF9XQ0hBUiBjaCk7Ci0KLSAgICBpbnQJCQkJCQlDb21wYXJlKGNvbnN0IEZYX1dDSEFSKiBzdHIpIGNvbnN0OwotCi0gICAgaW50CQkJCQkJQ29tcGFyZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSBjb25zdDsKLQotICAgIGludAkJCQkJCUNvbXBhcmVOb0Nhc2UoY29uc3QgRlhfV0NIQVIqIHN0cikgY29uc3Q7Ci0KLSAgICBib29sIEVxdWFsKGNvbnN0IHdjaGFyX3QqIHB0cikgY29uc3Q7Ci0gICAgYm9vbCBFcXVhbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgY29uc3Q7Ci0gICAgYm9vbCBFcXVhbChjb25zdCBDRlhfV2lkZVN0cmluZyYgb3RoZXIpIGNvbnN0OwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlNaWQoRlhfU1RSU0laRSBmaXJzdCkgY29uc3Q7Ci0KLSAgICBDRlhfV2lkZVN0cmluZwkJCU1pZChGWF9TVFJTSVpFIGZpcnN0LCBGWF9TVFJTSVpFIGNvdW50KSBjb25zdDsKLQotICAgIENGWF9XaWRlU3RyaW5nCQkJTGVmdChGWF9TVFJTSVpFIGNvdW50KSBjb25zdDsKLQotICAgIENGWF9XaWRlU3RyaW5nCQkJUmlnaHQoRlhfU1RSU0laRSBjb3VudCkgY29uc3Q7Ci0KLSAgICBGWF9TVFJTSVpFCQkJCUluc2VydChGWF9TVFJTSVpFIGluZGV4LCBGWF9XQ0hBUiBjaCk7Ci0KLSAgICBGWF9TVFJTSVpFCQkJCURlbGV0ZShGWF9TVFJTSVpFIGluZGV4LCBGWF9TVFJTSVpFIGNvdW50ID0gMSk7Ci0KLSAgICB2b2lkCQkJCQlGb3JtYXQoY29uc3QgRlhfV0NIQVIqIGxwc3pGb3JtYXQsIC4uLiApOwotCi0gICAgdm9pZAkJCQkJRm9ybWF0Vihjb25zdCBGWF9XQ0hBUiogbHBzekZvcm1hdCwgdmFfbGlzdCBhcmdMaXN0KTsKLQotICAgIHZvaWQJCQkJCU1ha2VMb3dlcigpOwotCi0gICAgdm9pZAkJCQkJTWFrZVVwcGVyKCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltUmlnaHQoKTsKLQotICAgIHZvaWQJCQkJCVRyaW1SaWdodChGWF9XQ0hBUiBjaFRhcmdldCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltUmlnaHQoY29uc3QgRlhfV0NIQVIqIGxwc3pUYXJnZXRzKTsKLQotICAgIHZvaWQJCQkJCVRyaW1MZWZ0KCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltTGVmdChGWF9XQ0hBUiBjaFRhcmdldCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltTGVmdChjb25zdCBGWF9XQ0hBUiogbHBzelRhcmdldHMpOwotCi0gICAgdm9pZAkJCQkJUmVzZXJ2ZShGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICBGWF9XQ0hBUioJCQkJR2V0QnVmZmVyKEZYX1NUUlNJWkUgbGVuKTsKLQotICAgIHZvaWQJCQkJCVJlbGVhc2VCdWZmZXIoRlhfU1RSU0laRSBsZW4gPSAtMSk7Ci0KLSAgICBpbnQJCQkJCQlHZXRJbnRlZ2VyKCkgY29uc3Q7Ci0KLSAgICBGWF9GTE9BVAkJCQlHZXRGbG9hdCgpIGNvbnN0OwotCi0gICAgRlhfU1RSU0laRQkJCQlGaW5kKGNvbnN0IEZYX1dDSEFSKiBscHN6U3ViLCBGWF9TVFJTSVpFIHN0YXJ0ID0gMCkgY29uc3Q7Ci0KLSAgICBGWF9TVFJTSVpFCQkJCUZpbmQoRlhfV0NIQVIgY2gsIEZYX1NUUlNJWkUgc3RhcnQgPSAwKSBjb25zdDsKLQotICAgIEZYX1NUUlNJWkUJCQkJUmVwbGFjZShjb25zdCBGWF9XQ0hBUiogbHBzek9sZCwgY29uc3QgRlhfV0NIQVIqIGxwc3pOZXcpOwotCi0gICAgRlhfU1RSU0laRQkJCQlSZW1vdmUoRlhfV0NIQVIgY2gpOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlVVEY4RW5jb2RlKCkgY29uc3Q7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZwkJCVVURjE2TEVfRW5jb2RlKCkgY29uc3Q7Ci0KLSAgICB2b2lkCQkJCQlDb252ZXJ0RnJvbShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBDRlhfQ2hhck1hcCogcENoYXJNYXAgPSBOVUxMKTsKLQotcHJvdGVjdGVkOgotICAgIGNsYXNzIFN0cmluZ0RhdGEgewotICAgICAgcHVibGljOgotICAgICAgICBzdGF0aWMgU3RyaW5nRGF0YSogQ3JlYXRlKGludCBuTGVuKTsKLSAgICAgICAgdm9pZCBSZXRhaW4oKSB7ICsrbV9uUmVmczsgfQotICAgICAgICB2b2lkIFJlbGVhc2UoKSB7IGlmICgtLW1fblJlZnMgPD0gMCkgRlhfRnJlZSh0aGlzKTsgfQotCi0gICAgICAgIGludHB0cl90ICAgIG1fblJlZnM7ICAvLyBXb3VsZCBwcmVmZXIgc3NpemVfdCwgYnV0IG5vIHdpbmRvd3Mgc3VwcG9ydC4KLSAgICAgICAgRlhfU1RSU0laRSAgbV9uRGF0YUxlbmd0aDsKLSAgICAgICAgRlhfU1RSU0laRSAgbV9uQWxsb2NMZW5ndGg7Ci0gICAgICAgIEZYX1dDSEFSICAgIG1fU3RyaW5nWzFdOwotCi0gICAgICBwcml2YXRlOgotICAgICAgICBTdHJpbmdEYXRhKEZYX1NUUlNJWkUgZGF0YUxlbiwgRlhfU1RSU0laRSBhbGxvY0xlbikKLSAgICAgICAgICAgICAgICA6IG1fblJlZnMoMSksIG1fbkRhdGFMZW5ndGgoZGF0YUxlbiksIG1fbkFsbG9jTGVuZ3RoKGFsbG9jTGVuKSB7Ci0gICAgICAgICAgICBGWFNZU19hc3NlcnQoZGF0YUxlbiA+PSAwKTsKLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChhbGxvY0xlbiA+PSAwKTsKLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChkYXRhTGVuIDw9IGFsbG9jTGVuKTsKLSAgICAgICAgICAgIG1fU3RyaW5nW2RhdGFMZW5dID0gMDsKLSAgICAgICAgfQotICAgICAgICB+U3RyaW5nRGF0YSgpID0gZGVsZXRlOwotICAgIH07Ci0KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBBbGxvY0JlZm9yZVdyaXRlKEZYX1NUUlNJWkUgbkxlbik7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgQ29uY2F0SW5QbGFjZShGWF9TVFJTSVpFIG5TcmNMZW4sIGNvbnN0IEZYX1dDSEFSKiBscHN6U3JjRGF0YSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgQ29uY2F0Q29weShGWF9TVFJTSVpFIG5TcmMxTGVuLCBjb25zdCBGWF9XQ0hBUiogbHBzelNyYzFEYXRhLCBGWF9TVFJTSVpFIG5TcmMyTGVuLCBjb25zdCBGWF9XQ0hBUiogbHBzelNyYzJEYXRhKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBBc3NpZ25Db3B5KEZYX1NUUlNJWkUgblNyY0xlbiwgY29uc3QgRlhfV0NIQVIqIGxwc3pTcmNEYXRhKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBBbGxvY0NvcHkoQ0ZYX1dpZGVTdHJpbmcmIGRlc3QsIEZYX1NUUlNJWkUgbkNvcHlMZW4sIEZYX1NUUlNJWkUgbkNvcHlJbmRleCkgY29uc3Q7Ci0KLSAgICBTdHJpbmdEYXRhKiBtX3BEYXRhOwotICAgIGZyaWVuZCBjbGFzcyBmeGNydF9XaWRlU3RyaW5nQ29uY2F0SW5QbGFjZV9UZXN0OworICBTdHJpbmdEYXRhKiBtX3BEYXRhOworICBmcmllbmQgY2xhc3MgZnhjcnRfV2lkZVN0cmluZ0NvbmNhdEluUGxhY2VfVGVzdDsKIH07Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmdDOjpDRlhfV2lkZVN0cmluZ0MoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNyYykKLXsKLSAgICBtX1B0ciA9IHNyYy5jX3N0cigpOwotICAgIG1fTGVuZ3RoID0gc3JjLkdldExlbmd0aCgpOworaW5saW5lIENGWF9XaWRlU3RyaW5nQzo6Q0ZYX1dpZGVTdHJpbmdDKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzcmMpIHsKKyAgbV9QdHIgPSBzcmMuY19zdHIoKTsKKyAgbV9MZW5ndGggPSBzcmMuR2V0TGVuZ3RoKCk7CiB9Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmdDJiBDRlhfV2lkZVN0cmluZ0M6Om9wZXJhdG9yID0gKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzcmMpCi17Ci0gICAgbV9QdHIgPSBzcmMuY19zdHIoKTsKLSAgICBtX0xlbmd0aCA9IHNyYy5HZXRMZW5ndGgoKTsKLSAgICByZXR1cm4gKnRoaXM7CitpbmxpbmUgQ0ZYX1dpZGVTdHJpbmdDJiBDRlhfV2lkZVN0cmluZ0M6Om9wZXJhdG9yPShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3JjKSB7CisgIG1fUHRyID0gc3JjLmNfc3RyKCk7CisgIG1fTGVuZ3RoID0gc3JjLkdldExlbmd0aCgpOworICByZXR1cm4gKnRoaXM7CiB9CiAKLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMikKLXsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMik7CitpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIyKSB7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKIH0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjEsIGNvbnN0IEZYX1dDSEFSKiBzdHIyKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKK2lubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3RyMikgeworICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMik7CiB9Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IgKyAoY29uc3QgRlhfV0NIQVIqIHN0cjEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMikKLXsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMik7CitpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEZYX1dDSEFSKiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIHN0cjIpOwogfQotaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yICsgKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMSwgRlhfV0NIQVIgY2gpCi17Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIENGWF9XaWRlU3RyaW5nQyhjaCkpOworaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjEsIEZYX1dDSEFSIGNoKSB7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBDRlhfV2lkZVN0cmluZ0MoY2gpKTsKIH0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvciArIChGWF9XQ0hBUiBjaCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIyKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhjaCwgc3RyMik7CitpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKEZYX1dDSEFSIGNoLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKGNoLCBzdHIyKTsKIH0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cjIpCi17Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIHN0cjIpOworaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIHN0cjIpOwogfQotaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yICsgKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIxLCBGWF9XQ0hBUiBjaCkKLXsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgQ0ZYX1dpZGVTdHJpbmdDKGNoKSk7CitpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIxLCBGWF9XQ0hBUiBjaCkgeworICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgQ0ZYX1dpZGVTdHJpbmdDKGNoKSk7CiB9Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IgKyAoRlhfV0NIQVIgY2gsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIyKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhjaCwgc3RyMik7CitpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKEZYX1dDSEFSIGNoLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMikgeworICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoY2gsIHN0cjIpOwogfQotaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yICsgKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIxLCBjb25zdCBGWF9XQ0hBUiogc3RyMikKLXsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMik7CitpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3RyMikgeworICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMik7CiB9Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IgKyAoY29uc3QgRlhfV0NIQVIqIHN0cjEsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIyKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKK2lubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgRlhfV0NIQVIqIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIyKSB7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKIH0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIyKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKK2lubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMikgeworICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMik7CiB9Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IgKyAoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIxLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMikKLXsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMik7CitpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIHN0cjIpOwogfQotaW5saW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyA9PSBsaHM7CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHJocykgeworICByZXR1cm4gcmhzID09IGxoczsKIH0KLWlubGluZSBib29sIG9wZXJhdG9yPT0gKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyA9PSBsaHM7CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7CisgIHJldHVybiByaHMgPT0gbGhzOwogfQotaW5saW5lIGJvb2wgb3BlcmF0b3IhPSAoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyAhPSBsaHM7CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHJocykgeworICByZXR1cm4gcmhzICE9IGxoczsKIH0KLWlubGluZSBib29sIG9wZXJhdG9yIT0gKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyAhPSBsaHM7CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7CisgIHJldHVybiByaHMgIT0gbGhzOwogfQogRlhfRkxPQVQgRlhfYXRvZihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiB2b2lkIEZYX2F0b251bShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0ciwgRlhfQk9PTCYgYkludGVnZXIsIHZvaWQqIHBEYXRhKTsKIEZYX1NUUlNJWkUgRlhfZnRvYShGWF9GTE9BVCBmLCBGWF9DSEFSKiBidWYpOwotQ0ZYX0J5dGVTdHJpbmcJRlhfVVRGOEVuY29kZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBGWF9TVFJTSVpFIGxlbik7Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcJRlhfVVRGOEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU3RyKQotewotICAgIHJldHVybiBGWF9VVEY4RW5jb2RlKHdzU3RyLkdldFB0cigpLCB3c1N0ci5HZXRMZW5ndGgoKSk7CitDRlhfQnl0ZVN0cmluZyBGWF9VVEY4RW5jb2RlKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIEZYX1NUUlNJWkUgbGVuKTsKK2lubGluZSBDRlhfQnl0ZVN0cmluZyBGWF9VVEY4RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTdHIpIHsKKyAgcmV0dXJuIEZYX1VURjhFbmNvZGUod3NTdHIuR2V0UHRyKCksIHdzU3RyLkdldExlbmd0aCgpKTsKIH0KLWlubGluZSBDRlhfQnl0ZVN0cmluZwlGWF9VVEY4RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1N0cikKLXsKLSAgICByZXR1cm4gRlhfVVRGOEVuY29kZSh3c1N0ci5jX3N0cigpLCB3c1N0ci5HZXRMZW5ndGgoKSk7CitpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgRlhfVVRGOEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTdHIpIHsKKyAgcmV0dXJuIEZYX1VURjhFbmNvZGUod3NTdHIuY19zdHIoKSwgd3NTdHIuR2V0TGVuZ3RoKCkpOwogfQogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9TVFJJTkdfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaAppbmRleCA4YmMyYjRhLi5mMGQ0MDM1IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oCkBAIC0xOCwxNyArMTgsMTcgQEAKICNpbmNsdWRlIDx3Y2hhci5oPgogCiAvLyBfRlhfT1NfIHZhbHVlczoKLSNkZWZpbmUgX0ZYX1dJTjMyX0RFU0tUT1BfICAgICAgMQotI2RlZmluZSBfRlhfV0lONjRfREVTS1RPUF8gICAgICAyCi0jZGVmaW5lIF9GWF9MSU5VWF9ERVNLVE9QXyAgICAgIDQKLSNkZWZpbmUgX0ZYX01BQ09TWF8gICAgICAgICAgICAgNwotI2RlZmluZSBfRlhfQU5EUk9JRF8gICAgICAgICAgIDEyCisjZGVmaW5lIF9GWF9XSU4zMl9ERVNLVE9QXyAxCisjZGVmaW5lIF9GWF9XSU42NF9ERVNLVE9QXyAyCisjZGVmaW5lIF9GWF9MSU5VWF9ERVNLVE9QXyA0CisjZGVmaW5lIF9GWF9NQUNPU1hfIDcKKyNkZWZpbmUgX0ZYX0FORFJPSURfIDEyCiAKIC8vIF9GWE1fUExBVEZPUk1fIHZhbHVlczsKLSNkZWZpbmUgX0ZYTV9QTEFURk9STV9XSU5ET1dTXyAgMSAgLy8gX0ZYX1dJTjMyX0RFU0tUT1BfIG9yIF9GWF9XSU42NF9ERVNLVE9QXy4KLSNkZWZpbmUgX0ZYTV9QTEFURk9STV9MSU5VWF8gICAgMiAgLy8gX0ZYX0xJTlVYX0RFU0tUT1BfIGFsd2F5cy4KLSNkZWZpbmUgX0ZYTV9QTEFURk9STV9BUFBMRV8gICAgMyAgLy8gX0ZYX01BQ09TWF8gYWx3YXlzLgotI2RlZmluZSBfRlhNX1BMQVRGT1JNX0FORFJPSURfICA0ICAvLyBfRlhfQU5EUk9JRF8gYWx3YXlzLgorI2RlZmluZSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfIDEgIC8vIF9GWF9XSU4zMl9ERVNLVE9QXyBvciBfRlhfV0lONjRfREVTS1RPUF8uCisjZGVmaW5lIF9GWE1fUExBVEZPUk1fTElOVVhfIDIgICAgLy8gX0ZYX0xJTlVYX0RFU0tUT1BfIGFsd2F5cy4KKyNkZWZpbmUgX0ZYTV9QTEFURk9STV9BUFBMRV8gMyAgICAvLyBfRlhfTUFDT1NYXyBhbHdheXMuCisjZGVmaW5lIF9GWE1fUExBVEZPUk1fQU5EUk9JRF8gNCAgLy8gX0ZYX0FORFJPSURfIGFsd2F5cy4KIAogI2lmbmRlZiBfRlhfT1NfCiAjaWYgZGVmaW5lZChfX0FORFJPSURfXykKQEAgLTY3LDEzICs2NywxMyBAQAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgotdHlwZWRlZiB2b2lkKiAgICAgICAgICAgICAgICAgICBGWF9QT1NJVElPTjsgLy8gS2VlcCB1bnRpbCBmeGNydCBjb250YWluZXJzIGdvbmUKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICAgRlhfV09SRDsgICAgIC8vIEtlZXAgLSAiYW4gZWZmaWNpZW50IHNtYWxsIHR5cGUiCi10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgICAgIEZYX0RXT1JEOyAgICAvLyBLZWVwIC0gImFuIGVmZmljaWVudCB0eXBlIgotdHlwZWRlZiBmbG9hdCAgICAgICAgICAgICAgICAgICBGWF9GTE9BVDsgICAgLy8gS2VlcCwgYWxsb3cgdXBncmFkZSB0byBkb3VibGVzLgotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgICBGWF9CT09MOyAgICAgLy8gS2VlcCwgc2FkbHkgbm90IGFsd2F5cyAwIG9yIDEuCi10eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgICAgIEZYX0NIQVI7ICAgICAvLyBLZWVwLCBxdWVzdGlvbmFibGUgc2lnbmVkbmVzcy4KLXR5cGVkZWYgd2NoYXJfdCAgICAgICAgICAgICAgICAgRlhfV0NIQVI7ICAgIC8vIEtlZXAsIG1heWJlIGJhZCBwbGF0Zm9ybSB3Y2hhcnMuCit0eXBlZGVmIHZvaWQqIEZYX1BPU0lUSU9OOyAgICAgICAvLyBLZWVwIHVudGlsIGZ4Y3J0IGNvbnRhaW5lcnMgZ29uZQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBGWF9XT1JEOyAgLy8gS2VlcCAtICJhbiBlZmZpY2llbnQgc21hbGwgdHlwZSIKK3R5cGVkZWYgdW5zaWduZWQgaW50IEZYX0RXT1JEOyAgIC8vIEtlZXAgLSAiYW4gZWZmaWNpZW50IHR5cGUiCit0eXBlZGVmIGZsb2F0IEZYX0ZMT0FUOyAgICAgICAgICAvLyBLZWVwLCBhbGxvdyB1cGdyYWRlIHRvIGRvdWJsZXMuCit0eXBlZGVmIGludCBGWF9CT09MOyAgICAgICAgICAgICAvLyBLZWVwLCBzYWRseSBub3QgYWx3YXlzIDAgb3IgMS4KK3R5cGVkZWYgY2hhciBGWF9DSEFSOyAgICAgICAgICAgIC8vIEtlZXAsIHF1ZXN0aW9uYWJsZSBzaWduZWRuZXNzLgordHlwZWRlZiB3Y2hhcl90IEZYX1dDSEFSOyAgICAgICAgLy8gS2VlcCwgbWF5YmUgYmFkIHBsYXRmb3JtIHdjaGFycy4KIAogLy8gUERGaXVtIHN0cmluZyBzaXplcyBhcmUgbGltaXRlZCB0byAyXjMxLTEsIGFuZCB0aGUgdmFsdWUgaXMgc2lnbmVkIHRvCiAvLyBhbGxvdyAtMSBhcyBhIHBsYWNlaG9sZGVyIGZvciAidW5rbm93biIuCkBAIC04NSwxNSArODUsMTUgQEAKICNlbmRpZgogCiAjaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRQkxCisjZGVmaW5lIFRSVUUgMQogI2VuZGlmCiAKICNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UJMAorI2RlZmluZSBGQUxTRSAwCiAjZW5kaWYKIAogI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwJMAorI2RlZmluZSBOVUxMIDAKICNlbmRpZgogCiAjZGVmaW5lIEZYU1lTX2Fzc2VydCBhc3NlcnQKQEAgLTEwNywzOCArMTA3LDQxIEBACiAKICNkZWZpbmUgRlhfTUFYKGEsIGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKICNkZWZpbmUgRlhfTUlOKGEsIGIpICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKLSNkZWZpbmUgRlhfUEkJMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1ZgorI2RlZmluZSBGWF9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTVmCiAKIC8vIE5PVEU6IHByZXZlbnQgdXNlIG9mIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBzbnByaW50ZigpIHNpbmNlIHNvbWUgcGxhdGZvcm1zCiAvLyBoYXZlIGRpZmZlcmVudCByZXR1cm4gdmFsdWVzIChlLmcuIHdpbmRvd3MgX3ZzbnByaW50ZigpKSwgYW5kIHByb3ZpZGUKIC8vIHZlcnNpb25zIHRoYXQgYWx3YXlzIE5VTC10ZXJtaW5hdGUuCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXyAmJiBfTVNDX1ZFUiA8IDE5MDAKLXZvaWQgRlhTWVNfc25wcmludGYoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgX1ByaW50Zl9mb3JtYXRfc3RyaW5nXyBjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci12b2lkIEZYU1lTX3ZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXApOwordm9pZCBGWFNZU19zbnByaW50ZihjaGFyKiBzdHIsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICBfUHJpbnRmX2Zvcm1hdF9zdHJpbmdfIGNvbnN0IGNoYXIqIGZtdCwKKyAgICAgICAgICAgICAgICAgICAgLi4uKTsKK3ZvaWQgRlhTWVNfdnNucHJpbnRmKGNoYXIqIHN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcCk7CiAjZWxzZQotI2RlZmluZSBGWFNZU19zbnByaW50Zgkodm9pZCkgc25wcmludGYKLSNkZWZpbmUgRlhTWVNfdnNucHJpbnRmCSh2b2lkKSB2c25wcmludGYKKyNkZWZpbmUgRlhTWVNfc25wcmludGYgKHZvaWQpIHNucHJpbnRmCisjZGVmaW5lIEZYU1lTX3ZzbnByaW50ZiAodm9pZCkgdnNucHJpbnRmCiAjZW5kaWYKIAotI2RlZmluZSBGWFNZU19zcHJpbnRmCURPX05PVF9VU0VfU1BSSU5URl9ESUVfRElFX0RJRQotI2RlZmluZSBGWFNZU192c3ByaW50ZglET19OT1RfVVNFX1ZTUFJJTlRGX0RJRV9ESUVfRElFCi0jZGVmaW5lIEZYU1lTX3N0cmNocglzdHJjaHIKLSNkZWZpbmUgRlhTWVNfc3RybmNtcAlzdHJuY21wCi0jZGVmaW5lIEZYU1lTX3N0cmNtcAlzdHJjbXAKLSNkZWZpbmUgRlhTWVNfc3RyY3B5CXN0cmNweQotI2RlZmluZSBGWFNZU19zdHJuY3B5CXN0cm5jcHkKLSNkZWZpbmUgRlhTWVNfc3Ryc3RyCXN0cnN0cgotI2RlZmluZSBGWFNZU19GSUxFCQlGSUxFCi0jZGVmaW5lIEZYU1lTX2ZvcGVuCQlmb3BlbgotI2RlZmluZSBGWFNZU19mY2xvc2UJZmNsb3NlCi0jZGVmaW5lIEZYU1lTX1NFRUtfRU5ECVNFRUtfRU5ECi0jZGVmaW5lIEZYU1lTX1NFRUtfU0VUCVNFRUtfU0VUCi0jZGVmaW5lIEZYU1lTX2ZzZWVrCQlmc2VlawotI2RlZmluZSBGWFNZU19mdGVsbAkJZnRlbGwKLSNkZWZpbmUgRlhTWVNfZnJlYWQJCWZyZWFkCi0jZGVmaW5lIEZYU1lTX2Z3cml0ZQlmd3JpdGUKLSNkZWZpbmUgRlhTWVNfZnByaW50ZglmcHJpbnRmCi0jZGVmaW5lIEZYU1lTX2ZmbHVzaAlmZmx1c2gKKyNkZWZpbmUgRlhTWVNfc3ByaW50ZiBET19OT1RfVVNFX1NQUklOVEZfRElFX0RJRV9ESUUKKyNkZWZpbmUgRlhTWVNfdnNwcmludGYgRE9fTk9UX1VTRV9WU1BSSU5URl9ESUVfRElFX0RJRQorI2RlZmluZSBGWFNZU19zdHJjaHIgc3RyY2hyCisjZGVmaW5lIEZYU1lTX3N0cm5jbXAgc3RybmNtcAorI2RlZmluZSBGWFNZU19zdHJjbXAgc3RyY21wCisjZGVmaW5lIEZYU1lTX3N0cmNweSBzdHJjcHkKKyNkZWZpbmUgRlhTWVNfc3RybmNweSBzdHJuY3B5CisjZGVmaW5lIEZYU1lTX3N0cnN0ciBzdHJzdHIKKyNkZWZpbmUgRlhTWVNfRklMRSBGSUxFCisjZGVmaW5lIEZYU1lTX2ZvcGVuIGZvcGVuCisjZGVmaW5lIEZYU1lTX2ZjbG9zZSBmY2xvc2UKKyNkZWZpbmUgRlhTWVNfU0VFS19FTkQgU0VFS19FTkQKKyNkZWZpbmUgRlhTWVNfU0VFS19TRVQgU0VFS19TRVQKKyNkZWZpbmUgRlhTWVNfZnNlZWsgZnNlZWsKKyNkZWZpbmUgRlhTWVNfZnRlbGwgZnRlbGwKKyNkZWZpbmUgRlhTWVNfZnJlYWQgZnJlYWQKKyNkZWZpbmUgRlhTWVNfZndyaXRlIGZ3cml0ZQorI2RlZmluZSBGWFNZU19mcHJpbnRmIGZwcmludGYKKyNkZWZpbmUgRlhTWVNfZmZsdXNoIGZmbHVzaAogCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogI2lmZGVmIF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVECkBAIC0xNTEsNyArMTU0LDcgQEAKICNlbmRpZiAgLy8gX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogCiAjaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgorfSAgLy8gZXh0ZXJuICJDIgogI2luY2x1ZGUgIi4uLy4uLy4uL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9ucy5oIgogI2RlZmluZSBGWFNZU19zdHJsZW4ocHRyKSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9TVFJTSVpFPihzdHJsZW4ocHRyKSkKICNkZWZpbmUgRlhTWVNfd2NzbGVuKHB0cikgcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfU1RSU0laRT4od2NzbGVuKHB0cikpCkBAIC0xNjEsMjAgKzE2NCwyMCBAQAogI2RlZmluZSBGWFNZU193Y3NsZW4ocHRyKSAoKEZYX1NUUlNJWkUpd2NzbGVuKHB0cikpCiAjZW5kaWYKIAotI2RlZmluZSBGWFNZU193Y3NjbXAJd2NzY21wCi0jZGVmaW5lIEZYU1lTX3djc2Nocgl3Y3NjaHIKLSNkZWZpbmUgRlhTWVNfd2Nzc3RyCXdjc3N0cgotI2RlZmluZSBGWFNZU193Y3NuY21wCXdjc25jbXAKLSNkZWZpbmUgRlhTWVNfdnN3cHJpbnRmCXZzd3ByaW50ZgotI2RlZmluZSBGWFNZU19tYnN0b3djcwltYnN0b3djcwotI2RlZmluZSBGWFNZU193Y3N0b21icwl3Y3N0b21icwotI2RlZmluZSBGWFNZU19tZW1jbXAJbWVtY21wCi0jZGVmaW5lIEZYU1lTX21lbWNweQltZW1jcHkKLSNkZWZpbmUgRlhTWVNfbWVtbW92ZQltZW1tb3ZlCi0jZGVmaW5lIEZYU1lTX21lbXNldAltZW1zZXQKLSNkZWZpbmUgRlhTWVNfbWVtY2hyCW1lbWNocgotI2RlZmluZSBGWFNZU19xc29ydAkJcXNvcnQKLSNkZWZpbmUgRlhTWVNfYnNlYXJjaAlic2VhcmNoCisjZGVmaW5lIEZYU1lTX3djc2NtcCB3Y3NjbXAKKyNkZWZpbmUgRlhTWVNfd2NzY2hyIHdjc2NocgorI2RlZmluZSBGWFNZU193Y3NzdHIgd2Nzc3RyCisjZGVmaW5lIEZYU1lTX3djc25jbXAgd2NzbmNtcAorI2RlZmluZSBGWFNZU192c3dwcmludGYgdnN3cHJpbnRmCisjZGVmaW5lIEZYU1lTX21ic3Rvd2NzIG1ic3Rvd2NzCisjZGVmaW5lIEZYU1lTX3djc3RvbWJzIHdjc3RvbWJzCisjZGVmaW5lIEZYU1lTX21lbWNtcCBtZW1jbXAKKyNkZWZpbmUgRlhTWVNfbWVtY3B5IG1lbWNweQorI2RlZmluZSBGWFNZU19tZW1tb3ZlIG1lbW1vdmUKKyNkZWZpbmUgRlhTWVNfbWVtc2V0IG1lbXNldAorI2RlZmluZSBGWFNZU19tZW1jaHIgbWVtY2hyCisjZGVmaW5lIEZYU1lTX3Fzb3J0IHFzb3J0CisjZGVmaW5lIEZYU1lTX2JzZWFyY2ggYnNlYXJjaAogCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogI2RlZmluZSBGWFNZU19HZXRBQ1AgR2V0QUNQCkBAIC0xODQsOCArMTg3LDEwIEBACiAjZGVmaW5lIEZYU1lTX3N0cmljbXAgX3N0cmljbXAKICNpZmRlZiBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRAogI2RlZmluZSBGWFNZU193Y3NpY21wKHN0cjEsIHN0cjIpIF93Y3NpY21wKCh3Y2hhcl90Kikoc3RyMSksICh3Y2hhcl90Kikoc3RyMikpCi0jZGVmaW5lIEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUocDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KSBXaWRlQ2hhclRvTXVsdGlCeXRlKHAxLCBwMiwgKGNvbnN0IHdjaGFyX3QqKShwMyksIHA0LCBwNSwgcDYsIHA3LCBwOCkKLSNkZWZpbmUgRlhTWVNfTXVsdGlCeXRlVG9XaWRlQ2hhcihwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KSBNdWx0aUJ5dGVUb1dpZGVDaGFyKHAxLCBwMiwgcDMsIHA0LCAod2NoYXJfdCopKHA1KSwgcDYpCisjZGVmaW5lIEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUocDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KSBcCisgIFdpZGVDaGFyVG9NdWx0aUJ5dGUocDEsIHAyLCAoY29uc3Qgd2NoYXJfdCopKHAzKSwgcDQsIHA1LCBwNiwgcDcsIHA4KQorI2RlZmluZSBGWFNZU19NdWx0aUJ5dGVUb1dpZGVDaGFyKHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpIFwKKyAgTXVsdGlCeXRlVG9XaWRlQ2hhcihwMSwgcDIsIHAzLCBwNCwgKHdjaGFyX3QqKShwNSksIHA2KQogI2RlZmluZSBGWFNZU193Y3Nsd3Ioc3RyKSBfd2NzbHdyKCh3Y2hhcl90Kikoc3RyKSkKICNkZWZpbmUgRlhTWVNfd2NzdXByKHN0cikgX3djc3Vwcigod2NoYXJfdCopKHN0cikpCiAjZWxzZQpAQCAtMTk4LDU4ICsyMDMsNzcgQEAKICNkZWZpbmUgRlhTWVNfR2V0RnVsbFBhdGhOYW1lIEdldEZ1bGxQYXRoTmFtZQogI2RlZmluZSBGWFNZU19HZXRNb2R1bGVGaWxlTmFtZSBHZXRNb2R1bGVGaWxlTmFtZQogI2Vsc2UKLWludAkJCUZYU1lTX0dldEFDUCh2b2lkKTsKLWNoYXIqCQlGWFNZU19pdG9hKGludCB2YWx1ZSwgY2hhciogc3RyaW5nLCBpbnQgcmFkaXgpOwotaW50CQkJRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShGWF9EV09SRCBjb2RlcGFnZSwgRlhfRFdPUkQgZHdGbGFncywgY29uc3Qgd2NoYXJfdCogd3N0ciwgaW50IHdsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiwgaW50IGJ1ZmxlbiwgY29uc3QgY2hhciogZGVmYXVsdF9zdHIsIGludCogcFVzZURlZmF1bHQpOwotaW50CQkJRlhTWVNfTXVsdGlCeXRlVG9XaWRlQ2hhcihGWF9EV09SRCBjb2RlcGFnZSwgRlhfRFdPUkQgZHdGbGFncywgY29uc3QgY2hhciogYnN0ciwgaW50IGJsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIGJ1ZiwgaW50IGJ1Zmxlbik7Ci1GWF9EV09SRAlGWFNZU19HZXRGdWxsUGF0aE5hbWUoY29uc3QgY2hhciogZmlsZW5hbWUsIEZYX0RXT1JEIGJ1ZmxlbiwgY2hhciogYnVmLCBjaGFyKiogZmlsZXBhcnQpOwotRlhfRFdPUkQJRlhTWVNfR2V0TW9kdWxlRmlsZU5hbWUodm9pZCogaE1vZHVsZSwgY2hhciogYnVmLCBGWF9EV09SRCBidWZzaXplKTsKLWNoYXIqCQlGWFNZU19zdHJsd3IoY2hhciogc3RyKTsKLWNoYXIqCQlGWFNZU19zdHJ1cHIoY2hhciogc3RyKTsKLWludAkJCUZYU1lTX3N0cmljbXAoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKLWludAkJCUZYU1lTX3djc2ljbXAoY29uc3Qgd2NoYXJfdCAqc3RyaW5nMSwgY29uc3Qgd2NoYXJfdCAqc3RyaW5nMik7Ci13Y2hhcl90KglGWFNZU193Y3Nsd3Iod2NoYXJfdCogc3RyKTsKLXdjaGFyX3QqCUZYU1lTX3djc3Vwcih3Y2hhcl90KiBzdHIpOworaW50IEZYU1lTX0dldEFDUCh2b2lkKTsKK2NoYXIqIEZYU1lTX2l0b2EoaW50IHZhbHVlLCBjaGFyKiBzdHJpbmcsIGludCByYWRpeCk7CitpbnQgRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShGWF9EV09SRCBjb2RlcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiB3c3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVmYXVsdF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBVc2VEZWZhdWx0KTsKK2ludCBGWFNZU19NdWx0aUJ5dGVUb1dpZGVDaGFyKEZYX0RXT1JEIGNvZGVwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4pOworRlhfRFdPUkQgRlhTWVNfR2V0RnVsbFBhdGhOYW1lKGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqIGZpbGVwYXJ0KTsKK0ZYX0RXT1JEIEZYU1lTX0dldE1vZHVsZUZpbGVOYW1lKHZvaWQqIGhNb2R1bGUsIGNoYXIqIGJ1ZiwgRlhfRFdPUkQgYnVmc2l6ZSk7CitjaGFyKiBGWFNZU19zdHJsd3IoY2hhciogc3RyKTsKK2NoYXIqIEZYU1lTX3N0cnVwcihjaGFyKiBzdHIpOworaW50IEZYU1lTX3N0cmljbXAoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK2ludCBGWFNZU193Y3NpY21wKGNvbnN0IHdjaGFyX3QqIHN0cmluZzEsIGNvbnN0IHdjaGFyX3QqIHN0cmluZzIpOword2NoYXJfdCogRlhTWVNfd2NzbHdyKHdjaGFyX3QqIHN0cik7Cit3Y2hhcl90KiBGWFNZU193Y3N1cHIod2NoYXJfdCogc3RyKTsKICNlbmRpZiAgLy8gX0ZYTV9QTEFURk9STSA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0jZGVmaW5lIEZYU1lTX3BvdyhhLCBiKQkJKEZYX0ZMT0FUKXBvd2YoYSwgYikKKyNkZWZpbmUgRlhTWVNfcG93KGEsIGIpIChGWF9GTE9BVCkgcG93ZihhLCBiKQogI2Vsc2UKLSNkZWZpbmUgRlhTWVNfcG93KGEsIGIpCQkoRlhfRkxPQVQpcG93KGEsIGIpCisjZGVmaW5lIEZYU1lTX3BvdyhhLCBiKSAoRlhfRkxPQVQpIHBvdyhhLCBiKQogI2VuZGlmCi0jZGVmaW5lIEZYU1lTX3NxcnQoYSkJCShGWF9GTE9BVClzcXJ0KGEpCi0jZGVmaW5lIEZYU1lTX2ZhYnMoYSkJCShGWF9GTE9BVClmYWJzKGEpCi0jZGVmaW5lIEZYU1lTX2F0YW4yKGEsIGIpCShGWF9GTE9BVClhdGFuMihhLCBiKQotI2RlZmluZSBGWFNZU19jZWlsKGEpCQkoRlhfRkxPQVQpY2VpbChhKQotI2RlZmluZSBGWFNZU19mbG9vcihhKQkJKEZYX0ZMT0FUKWZsb29yKGEpCi0jZGVmaW5lIEZYU1lTX2NvcyhhKQkJKEZYX0ZMT0FUKWNvcyhhKQotI2RlZmluZSBGWFNZU19hY29zKGEpCQkoRlhfRkxPQVQpYWNvcyhhKQotI2RlZmluZSBGWFNZU19zaW4oYSkJCShGWF9GTE9BVClzaW4oYSkKLSNkZWZpbmUgRlhTWVNfbG9nKGEpCQkoRlhfRkxPQVQpbG9nKGEpCi0jZGVmaW5lIEZYU1lTX2xvZzEwKGEpCQkoRlhfRkxPQVQpbG9nMTAoYSkKLSNkZWZpbmUgRlhTWVNfZm1vZChhLCBiKQkoRlhfRkxPQVQpZm1vZChhLCBiKQotI2RlZmluZSBGWFNZU19hYnMJCQlhYnMKLSNkZWZpbmUgRlhEV09SRF9GUk9NX0xTQkZJUlNUKGkpCShpKQotI2RlZmluZSBGWERXT1JEX0ZST01fTVNCRklSU1QoaSkJKCgodWludDhfdCkoaSkgPDwgMjQpIHwgKCh1aW50OF90KSgoaSkgPj4gOCkgPDwgMTYpIHwgKCh1aW50OF90KSgoaSkgPj4gMTYpIDw8IDgpIHwgKHVpbnQ4X3QpKChpKSA+PiAyNCkpCi0jZGVmaW5lIEZYRFdPUkRfR0VUX0xTQkZJUlNUKHApCQkoKCgodWludDhfdCopKHApKVszXSA8PCAyNCkgfCAoKCh1aW50OF90KikocCkpWzJdIDw8IDE2KSB8ICgoKHVpbnQ4X3QqKShwKSlbMV0gPDwgOCkgfCAoKCh1aW50OF90KikocCkpWzBdKSkKLSNkZWZpbmUgRlhEV09SRF9HRVRfTVNCRklSU1QocCkgKCgoKHVpbnQ4X3QqKShwKSlbMF0gPDwgMjQpIHwgKCgodWludDhfdCopKHApKVsxXSA8PCAxNikgfCAoKCh1aW50OF90KikocCkpWzJdIDw8IDgpIHwgKCgodWludDhfdCopKHApKVszXSkpCi0jZGVmaW5lIEZYU1lTX0hJQllURSh3b3JkKQkoKHVpbnQ4X3QpKCh3b3JkKSA+PiA4KSkKLSNkZWZpbmUgRlhTWVNfTE9CWVRFKHdvcmQpCSgodWludDhfdCkod29yZCkpCi0jZGVmaW5lIEZYU1lTX0hJV09SRChkd29yZCkJKChGWF9XT1JEKSgoZHdvcmQpID4+IDE2KSkKLSNkZWZpbmUgRlhTWVNfTE9XT1JEKGR3b3JkKQkoKEZYX1dPUkQpKGR3b3JkKSkKLWludDMyX3QJRlhTWVNfYXRvaShjb25zdCBGWF9DSEFSKiBzdHIpOwotaW50MzJfdAlGWFNZU193dG9pKGNvbnN0IEZYX1dDSEFSKiBzdHIpOwotaW50NjRfdAlGWFNZU19hdG9pNjQoY29uc3QgRlhfQ0hBUiogc3RyKTsKLWludDY0X3QJRlhTWVNfd3RvaTY0KGNvbnN0IEZYX1dDSEFSKiBzdHIpOwotY29uc3QgRlhfQ0hBUioJRlhTWVNfaTY0dG9hKGludDY0X3QgdmFsdWUsIEZYX0NIQVIqIHN0ciwgaW50IHJhZGl4KTsKLWNvbnN0IEZYX1dDSEFSKglGWFNZU19pNjR0b3coaW50NjRfdCB2YWx1ZSwgRlhfV0NIQVIqIHN0ciwgaW50IHJhZGl4KTsKLWludAkJCUZYU1lTX3JvdW5kKEZYX0ZMT0FUIGYpOwotI2RlZmluZQkJRlhTWVNfTXVsKGEsIGIpICgoYSkgKiAoYikpCi0jZGVmaW5lCQlGWFNZU19EaXYoYSwgYikgKChhKSAvIChiKSkKLSNkZWZpbmUJCUZYU1lTX011bERpdihhLCBiLCBjKSAoKGEpICogKGIpIC8gKGMpKQotI2RlZmluZQkJRlhTWVNfc3FydDIoYSwgYikgKEZYX0ZMT0FUKUZYU1lTX3NxcnQoKGEpKihhKSArIChiKSooYikpCisjZGVmaW5lIEZYU1lTX3NxcnQoYSkgKEZYX0ZMT0FUKSBzcXJ0KGEpCisjZGVmaW5lIEZYU1lTX2ZhYnMoYSkgKEZYX0ZMT0FUKSBmYWJzKGEpCisjZGVmaW5lIEZYU1lTX2F0YW4yKGEsIGIpIChGWF9GTE9BVCkgYXRhbjIoYSwgYikKKyNkZWZpbmUgRlhTWVNfY2VpbChhKSAoRlhfRkxPQVQpIGNlaWwoYSkKKyNkZWZpbmUgRlhTWVNfZmxvb3IoYSkgKEZYX0ZMT0FUKSBmbG9vcihhKQorI2RlZmluZSBGWFNZU19jb3MoYSkgKEZYX0ZMT0FUKSBjb3MoYSkKKyNkZWZpbmUgRlhTWVNfYWNvcyhhKSAoRlhfRkxPQVQpIGFjb3MoYSkKKyNkZWZpbmUgRlhTWVNfc2luKGEpIChGWF9GTE9BVCkgc2luKGEpCisjZGVmaW5lIEZYU1lTX2xvZyhhKSAoRlhfRkxPQVQpIGxvZyhhKQorI2RlZmluZSBGWFNZU19sb2cxMChhKSAoRlhfRkxPQVQpIGxvZzEwKGEpCisjZGVmaW5lIEZYU1lTX2Ztb2QoYSwgYikgKEZYX0ZMT0FUKSBmbW9kKGEsIGIpCisjZGVmaW5lIEZYU1lTX2FicyBhYnMKKyNkZWZpbmUgRlhEV09SRF9GUk9NX0xTQkZJUlNUKGkpIChpKQorI2RlZmluZSBGWERXT1JEX0ZST01fTVNCRklSU1QoaSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQ4X3QpKGkpIDw8IDI0KSB8ICgodWludDhfdCkoKGkpID4+IDgpIDw8IDE2KSB8IFwKKyAgICgodWludDhfdCkoKGkpID4+IDE2KSA8PCA4KSB8ICh1aW50OF90KSgoaSkgPj4gMjQpKQorI2RlZmluZSBGWERXT1JEX0dFVF9MU0JGSVJTVChwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKHVpbnQ4X3QqKShwKSlbM10gPDwgMjQpIHwgKCgodWludDhfdCopKHApKVsyXSA8PCAxNikgfCBcCisgICAoKCh1aW50OF90KikocCkpWzFdIDw8IDgpIHwgKCgodWludDhfdCopKHApKVswXSkpCisjZGVmaW5lIEZYRFdPUkRfR0VUX01TQkZJUlNUKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgodWludDhfdCopKHApKVswXSA8PCAyNCkgfCAoKCh1aW50OF90KikocCkpWzFdIDw8IDE2KSB8IFwKKyAgICgoKHVpbnQ4X3QqKShwKSlbMl0gPDwgOCkgfCAoKCh1aW50OF90KikocCkpWzNdKSkKKyNkZWZpbmUgRlhTWVNfSElCWVRFKHdvcmQpICgodWludDhfdCkoKHdvcmQpID4+IDgpKQorI2RlZmluZSBGWFNZU19MT0JZVEUod29yZCkgKCh1aW50OF90KSh3b3JkKSkKKyNkZWZpbmUgRlhTWVNfSElXT1JEKGR3b3JkKSAoKEZYX1dPUkQpKChkd29yZCkgPj4gMTYpKQorI2RlZmluZSBGWFNZU19MT1dPUkQoZHdvcmQpICgoRlhfV09SRCkoZHdvcmQpKQoraW50MzJfdCBGWFNZU19hdG9pKGNvbnN0IEZYX0NIQVIqIHN0cik7CitpbnQzMl90IEZYU1lTX3d0b2koY29uc3QgRlhfV0NIQVIqIHN0cik7CitpbnQ2NF90IEZYU1lTX2F0b2k2NChjb25zdCBGWF9DSEFSKiBzdHIpOworaW50NjRfdCBGWFNZU193dG9pNjQoY29uc3QgRlhfV0NIQVIqIHN0cik7Citjb25zdCBGWF9DSEFSKiBGWFNZU19pNjR0b2EoaW50NjRfdCB2YWx1ZSwgRlhfQ0hBUiogc3RyLCBpbnQgcmFkaXgpOworY29uc3QgRlhfV0NIQVIqIEZYU1lTX2k2NHRvdyhpbnQ2NF90IHZhbHVlLCBGWF9XQ0hBUiogc3RyLCBpbnQgcmFkaXgpOworaW50IEZYU1lTX3JvdW5kKEZYX0ZMT0FUIGYpOworI2RlZmluZSBGWFNZU19NdWwoYSwgYikgKChhKSAqIChiKSkKKyNkZWZpbmUgRlhTWVNfRGl2KGEsIGIpICgoYSkgLyAoYikpCisjZGVmaW5lIEZYU1lTX011bERpdihhLCBiLCBjKSAoKGEpICogKGIpIC8gKGMpKQorI2RlZmluZSBGWFNZU19zcXJ0MihhLCBiKSAoRlhfRkxPQVQpIEZYU1lTX3NxcnQoKGEpICogKGEpICsgKGIpICogKGIpKQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9OwogI2VuZGlmCkBAIC0yODYsNyArMzEwLDcgQEAKIAogLy8gUHJldmVudCBhIGZ1bmN0aW9uIGZyb20gZXZlciBiZWluZyBpbmxpbmVkLCB0eXBpY2FsbHkgYmVjYXVzZSB3ZSdkCiAvLyBsaWtlIGl0IHRvIGFwcGVhciBpbiBzdGFjayB0cmFjZXMuCi0jaWYgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAjZGVmaW5lIE5FVkVSX0lOTElORSBfX2RlY2xzcGVjKG5vaW5saW5lKQogI2Vsc2UgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KICNkZWZpbmUgTkVWRVJfSU5MSU5FIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfdWNkLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfdWNkLmgKaW5kZXggODRmNjE2OS4uZmI0MTcxOCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3VjZC5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF91Y2QuaApAQCAtMTAsMTkyICsxMCwxODQgQEAKICNpbmNsdWRlICJmeF9iYXNpYy5oIgogCiBlbnVtIEZYX0NIQVJCUkVBS1BST1AgewotICAgIEZYX0NCUF9PUCA9IDAsCi0gICAgRlhfQ0JQX0NMID0gMSwKLSAgICBGWF9DQlBfUVUgPSAyLAotICAgIEZYX0NCUF9HTCA9IDMsCi0gICAgRlhfQ0JQX05TID0gNCwKLSAgICBGWF9DQlBfRVggPSA1LAotICAgIEZYX0NCUF9TWSA9IDYsCi0gICAgRlhfQ0JQX0lTID0gNywKLSAgICBGWF9DQlBfUFIgPSA4LAotICAgIEZYX0NCUF9QTyA9IDksCi0gICAgRlhfQ0JQX05VID0gMTAsCi0gICAgRlhfQ0JQX0FMID0gMTEsCi0gICAgRlhfQ0JQX0lEID0gMTIsCi0gICAgRlhfQ0JQX0lOID0gMTMsCi0gICAgRlhfQ0JQX0hZID0gMTQsCi0gICAgRlhfQ0JQX0JBID0gMTUsCi0gICAgRlhfQ0JQX0JCID0gMTYsCi0gICAgRlhfQ0JQX0IyID0gMTcsCi0gICAgRlhfQ0JQX1pXID0gMTgsCi0gICAgRlhfQ0JQX0NNID0gMTksCi0gICAgRlhfQ0JQX1dKID0gMjAsCi0gICAgRlhfQ0JQX0gyID0gMjEsCi0gICAgRlhfQ0JQX0gzID0gMjIsCi0gICAgRlhfQ0JQX0pMID0gMjMsCi0gICAgRlhfQ0JQX0pWID0gMjQsCi0gICAgRlhfQ0JQX0pUID0gMjUsCisgIEZYX0NCUF9PUCA9IDAsCisgIEZYX0NCUF9DTCA9IDEsCisgIEZYX0NCUF9RVSA9IDIsCisgIEZYX0NCUF9HTCA9IDMsCisgIEZYX0NCUF9OUyA9IDQsCisgIEZYX0NCUF9FWCA9IDUsCisgIEZYX0NCUF9TWSA9IDYsCisgIEZYX0NCUF9JUyA9IDcsCisgIEZYX0NCUF9QUiA9IDgsCisgIEZYX0NCUF9QTyA9IDksCisgIEZYX0NCUF9OVSA9IDEwLAorICBGWF9DQlBfQUwgPSAxMSwKKyAgRlhfQ0JQX0lEID0gMTIsCisgIEZYX0NCUF9JTiA9IDEzLAorICBGWF9DQlBfSFkgPSAxNCwKKyAgRlhfQ0JQX0JBID0gMTUsCisgIEZYX0NCUF9CQiA9IDE2LAorICBGWF9DQlBfQjIgPSAxNywKKyAgRlhfQ0JQX1pXID0gMTgsCisgIEZYX0NCUF9DTSA9IDE5LAorICBGWF9DQlBfV0ogPSAyMCwKKyAgRlhfQ0JQX0gyID0gMjEsCisgIEZYX0NCUF9IMyA9IDIyLAorICBGWF9DQlBfSkwgPSAyMywKKyAgRlhfQ0JQX0pWID0gMjQsCisgIEZYX0NCUF9KVCA9IDI1LAogCi0gICAgRlhfQ0JQX0JLID0gMjYsCi0gICAgRlhfQ0JQX0NSID0gMjcsCi0gICAgRlhfQ0JQX0xGID0gMjgsCi0gICAgRlhfQ0JQX05MID0gMjksCi0gICAgRlhfQ0JQX1NBID0gMzAsCi0gICAgRlhfQ0JQX1NHID0gMzEsCi0gICAgRlhfQ0JQX0NCID0gMzIsCi0gICAgRlhfQ0JQX1hYID0gMzMsCi0gICAgRlhfQ0JQX0FJID0gMzQsCi0gICAgRlhfQ0JQX1NQID0gMzUsCi0gICAgRlhfQ0JQX1RCID0gMzcsCi0gICAgRlhfQ0JQX05PTkUgPSAzNiwKKyAgRlhfQ0JQX0JLID0gMjYsCisgIEZYX0NCUF9DUiA9IDI3LAorICBGWF9DQlBfTEYgPSAyOCwKKyAgRlhfQ0JQX05MID0gMjksCisgIEZYX0NCUF9TQSA9IDMwLAorICBGWF9DQlBfU0cgPSAzMSwKKyAgRlhfQ0JQX0NCID0gMzIsCisgIEZYX0NCUF9YWCA9IDMzLAorICBGWF9DQlBfQUkgPSAzNCwKKyAgRlhfQ0JQX1NQID0gMzUsCisgIEZYX0NCUF9UQiA9IDM3LAorICBGWF9DQlBfTk9ORSA9IDM2LAogfTsKLSNkZWZpbmUgRlhfQklESUNMQVNTQklUUwkJNgotI2RlZmluZSBGWF9CSURJQ0xBU1NCSVRTTUFTSwkoMzEgPDwgRlhfQklESUNMQVNTQklUUykKKyNkZWZpbmUgRlhfQklESUNMQVNTQklUUyA2CisjZGVmaW5lIEZYX0JJRElDTEFTU0JJVFNNQVNLICgzMSA8PCBGWF9CSURJQ0xBU1NCSVRTKQogZW51bSBGWF9CSURJQ0xBU1MgewotICAgIEZYX0JJRElDTEFTU19PTgkJPSAwLAotICAgIEZYX0JJRElDTEFTU19MCQk9IDEsCi0gICAgRlhfQklESUNMQVNTX1IJCT0gMiwKLSAgICBGWF9CSURJQ0xBU1NfQU4JCT0gMywKLSAgICBGWF9CSURJQ0xBU1NfRU4JCT0gNCwKLSAgICBGWF9CSURJQ0xBU1NfQUwJCT0gNSwKLSAgICBGWF9CSURJQ0xBU1NfTlNNCT0gNiwKLSAgICBGWF9CSURJQ0xBU1NfQ1MJCT0gNywKLSAgICBGWF9CSURJQ0xBU1NfRVMJCT0gOCwKLSAgICBGWF9CSURJQ0xBU1NfRVQJCT0gOSwKLSAgICBGWF9CSURJQ0xBU1NfQk4JCT0gMTAsCi0gICAgRlhfQklESUNMQVNTX1MJCT0gMTEsCi0gICAgRlhfQklESUNMQVNTX1dTCQk9IDEyLAotICAgIEZYX0JJRElDTEFTU19CCQk9IDEzLAotICAgIEZYX0JJRElDTEFTU19STE8JPSAxNCwKLSAgICBGWF9CSURJQ0xBU1NfUkxFCT0gMTUsCi0gICAgRlhfQklESUNMQVNTX0xSTwk9IDE2LAotICAgIEZYX0JJRElDTEFTU19MUkUJPSAxNywKLSAgICBGWF9CSURJQ0xBU1NfUERGCT0gMTgsCi0gICAgRlhfQklESUNMQVNTX04JCT0gRlhfQklESUNMQVNTX09OLAorICBGWF9CSURJQ0xBU1NfT04gPSAwLAorICBGWF9CSURJQ0xBU1NfTCA9IDEsCisgIEZYX0JJRElDTEFTU19SID0gMiwKKyAgRlhfQklESUNMQVNTX0FOID0gMywKKyAgRlhfQklESUNMQVNTX0VOID0gNCwKKyAgRlhfQklESUNMQVNTX0FMID0gNSwKKyAgRlhfQklESUNMQVNTX05TTSA9IDYsCisgIEZYX0JJRElDTEFTU19DUyA9IDcsCisgIEZYX0JJRElDTEFTU19FUyA9IDgsCisgIEZYX0JJRElDTEFTU19FVCA9IDksCisgIEZYX0JJRElDTEFTU19CTiA9IDEwLAorICBGWF9CSURJQ0xBU1NfUyA9IDExLAorICBGWF9CSURJQ0xBU1NfV1MgPSAxMiwKKyAgRlhfQklESUNMQVNTX0IgPSAxMywKKyAgRlhfQklESUNMQVNTX1JMTyA9IDE0LAorICBGWF9CSURJQ0xBU1NfUkxFID0gMTUsCisgIEZYX0JJRElDTEFTU19MUk8gPSAxNiwKKyAgRlhfQklESUNMQVNTX0xSRSA9IDE3LAorICBGWF9CSURJQ0xBU1NfUERGID0gMTgsCisgIEZYX0JJRElDTEFTU19OID0gRlhfQklESUNMQVNTX09OLAogfTsKLSNkZWZpbmUgRlhfQ0hBUlRZUEVCSVRTCQkxMQotI2RlZmluZSBGWF9DSEFSVFlQRUJJVFNNQVNLCSgxNSA8PCBGWF9DSEFSVFlQRUJJVFMpCisjZGVmaW5lIEZYX0NIQVJUWVBFQklUUyAxMQorI2RlZmluZSBGWF9DSEFSVFlQRUJJVFNNQVNLICgxNSA8PCBGWF9DSEFSVFlQRUJJVFMpCiBlbnVtIEZYX0NIQVJUWVBFIHsKLSAgICBGWF9DSEFSVFlQRV9Vbmtub3duCQkJCT0gMCwKLSAgICBGWF9DSEFSVFlQRV9UYWIJCQkJCT0gKDEgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKLSAgICBGWF9DSEFSVFlQRV9TcGFjZQkJCQk9ICgyIDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfQ29udHJvbAkJCQk9ICgzIDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24JCQk9ICg0IDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfTnVtZXJpYwkJCQk9ICg1IDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfTm9ybWFsCQkJCT0gKDYgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKLSAgICBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmCQkJPSAoNyA8PCBGWF9DSEFSVFlQRUJJVFMpLAotICAgIEZYX0NIQVJUWVBFX0FyYWJpY1NwZWNpYWwJCT0gKDggPDwgRlhfQ0hBUlRZUEVCSVRTKSwKLSAgICBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uCT0gKDkgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKLSAgICBGWF9DSEFSVFlQRV9BcmFiaWNOb3JtYWwJCT0gKDEwIDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfQXJhYmljRm9ybQkJCT0gKDExIDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfQXJhYmljCQkJCT0gKDEyIDw8IEZYX0NIQVJUWVBFQklUUyksCisgIEZYX0NIQVJUWVBFX1Vua25vd24gPSAwLAorICBGWF9DSEFSVFlQRV9UYWIgPSAoMSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9TcGFjZSA9ICgyIDw8IEZYX0NIQVJUWVBFQklUUyksCisgIEZYX0NIQVJUWVBFX0NvbnRyb2wgPSAoMyA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbiA9ICg0IDw8IEZYX0NIQVJUWVBFQklUUyksCisgIEZYX0NIQVJUWVBFX051bWVyaWMgPSAoNSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9Ob3JtYWwgPSAoNiA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmID0gKDcgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKKyAgRlhfQ0hBUlRZUEVfQXJhYmljU3BlY2lhbCA9ICg4IDw8IEZYX0NIQVJUWVBFQklUUyksCisgIEZYX0NIQVJUWVBFX0FyYWJpY0Rpc3RvcnRpb24gPSAoOSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9BcmFiaWNOb3JtYWwgPSAoMTAgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKKyAgRlhfQ0hBUlRZUEVfQXJhYmljRm9ybSA9ICgxMSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9BcmFiaWMgPSAoMTIgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKIH07Ci10eXBlZGVmIHN0cnVjdCBfRlhfQ0hBUlBST1BFUlRJRVMgew0KLSAgICB1bmlvbiBGWF9DSEFSUFJPUEVSVElFU19VTklPTnsNCi0gICAgICAgIHN0cnVjdCBGWF9DSEFSUFJPUEVSVElFU19CSVR7DQotICAgICAgICAgICAgRlhfRFdPUkQJZHdCcmVha1R5cGUJCTogNjsNCi0gICAgICAgICAgICBGWF9EV09SRAlkd0JpZGlDbGFzcwkJOiA1Ow0KLSAgICAgICAgICAgIEZYX0RXT1JECWR3Q2hhclR5cGUJCTogNDsNCi0gICAgICAgICAgICBGWF9EV09SRAlkd1JvdGF0aW9uCQk6IDE7DQotICAgICAgICAgICAgRlhfRFdPUkQJZHdDSktTcGVjaWFsCTogMTsNCi0gICAgICAgICAgICBGWF9EV09SRAlkd1ZlcnRJbmRleAkJOiA2Ow0KLSAgICAgICAgICAgIEZYX0RXT1JECWR3QmlkaUluZGV4CQk6IDk7DQotICAgICAgICB9Ow0KLSAgICAgICAgRlhfRFdPUkQJZHdDaGFyUHJvcHM7DQotICAgIH07DQotfSBGWF9DSEFSUFJPUEVSVElFUzsNCit0eXBlZGVmIHN0cnVjdCBfRlhfQ0hBUlBST1BFUlRJRVMgeworICB1bmlvbiBGWF9DSEFSUFJPUEVSVElFU19VTklPTiB7CisgICAgc3RydWN0IEZYX0NIQVJQUk9QRVJUSUVTX0JJVCB7CisgICAgICBGWF9EV09SRCBkd0JyZWFrVHlwZSA6IDY7CisgICAgICBGWF9EV09SRCBkd0JpZGlDbGFzcyA6IDU7CisgICAgICBGWF9EV09SRCBkd0NoYXJUeXBlIDogNDsKKyAgICAgIEZYX0RXT1JEIGR3Um90YXRpb24gOiAxOworICAgICAgRlhfRFdPUkQgZHdDSktTcGVjaWFsIDogMTsKKyAgICAgIEZYX0RXT1JEIGR3VmVydEluZGV4IDogNjsKKyAgICAgIEZYX0RXT1JEIGR3QmlkaUluZGV4IDogOTsKKyAgICB9OworICAgIEZYX0RXT1JEIGR3Q2hhclByb3BzOworICB9OworfSBGWF9DSEFSUFJPUEVSVElFUzsKIEZYX0RXT1JEIEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKEZYX1dDSEFSIHdjaCk7Ci1GWF9CT09MCUZYX0lzQ3RybENvZGUoRlhfV0NIQVIgY2gpOwotRlhfQk9PTAlGWF9Jc1JvdGF0aW9uQ29kZShGWF9XQ0hBUiBjaCk7CitGWF9CT09MIEZYX0lzQ3RybENvZGUoRlhfV0NIQVIgY2gpOworRlhfQk9PTCBGWF9Jc1JvdGF0aW9uQ29kZShGWF9XQ0hBUiBjaCk7CiBGWF9CT09MIEZYX0lzQ29tYmluYXRpb25DaGFyKEZYX1dDSEFSIHdjaCk7Ci1GWF9CT09MCUZYX0lzQmlkaUNoYXIoRlhfV0NIQVIgd2NoKTsKK0ZYX0JPT0wgRlhfSXNCaWRpQ2hhcihGWF9XQ0hBUiB3Y2gpOwogRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX0JPT0wgYlJUTCwgRlhfQk9PTCBiVmVydGljYWwpOwotRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX0RXT1JEIGR3UHJvcHMsIEZYX0JPT0wgYlJUTCwgRlhfQk9PTCBiVmVydGljYWwpOwotY2xhc3MgQ0ZYX0NoYXIKLXsNCi1wdWJsaWM6DQotICAgIENGWF9DaGFyKCkgOiBtX3dDaGFyQ29kZSgwKQ0KLSAgICAgICAgLCBtX25CcmVha1R5cGUoMCkNCi0gICAgICAgICwgbV9uUm90YXRpb24oMCkNCi0gICAgICAgICwgbV9kd0NoYXJQcm9wcygwKQ0KLSAgICAgICAgLCBtX2R3Q2hhclN0eWxlcygwKQ0KLSAgICAgICAgLCBtX2lDaGFyV2lkdGgoMCkNCi0gICAgICAgICwgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCkNCi0gICAgICAgICwgbV9pVmVydGlhbFNjYWxlKDEwMCkNCi0gICAgew0KLSAgICB9DQotICAgIENGWF9DaGFyKEZYX1dPUkQgd0NoYXJDb2RlLCBGWF9EV09SRCBkd0NoYXJQcm9wcykNCi0gICAgICAgIDogbV93Q2hhckNvZGUod0NoYXJDb2RlKQ0KLSAgICAgICAgLCBtX25CcmVha1R5cGUoMCkNCi0gICAgICAgICwgbV9uUm90YXRpb24oMCkNCi0gICAgICAgICwgbV9kd0NoYXJQcm9wcyhkd0NoYXJQcm9wcykNCi0gICAgICAgICwgbV9kd0NoYXJTdHlsZXMoMCkNCi0gICAgICAgICwgbV9pQ2hhcldpZHRoKDApDQotICAgICAgICAsIG1faUhvcml6b250YWxTY2FsZSgxMDApDQotICAgICAgICAsIG1faVZlcnRpYWxTY2FsZSgxMDApDQotICAgIHsNCi0gICAgfQ0KLSAgICBGWF9EV09SRAlHZXRDaGFyVHlwZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2R3Q2hhclByb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSzsNCi0gICAgfQ0KLSAgICBGWF9XT1JECQltX3dDaGFyQ29kZTsNCi0gICAgdWludDhfdAkJbV9uQnJlYWtUeXBlOw0KLSAgICBpbnQ4X3QJCW1fblJvdGF0aW9uOw0KLSAgICBGWF9EV09SRAltX2R3Q2hhclByb3BzOw0KLSAgICBGWF9EV09SRAltX2R3Q2hhclN0eWxlczsNCi0gICAgaW50MzJfdAltX2lDaGFyV2lkdGg7DQotICAgIGludDMyX3QJbV9pSG9yaXpvbnRhbFNjYWxlOw0KLSAgICBpbnQzMl90CW1faVZlcnRpYWxTY2FsZTsNCi19Ow0KLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX0NoYXI+CUNGWF9DaGFyQXJyYXk7DQotY2xhc3MgQ0ZYX1R4dENoYXIgOiBwdWJsaWMgQ0ZYX0NoYXINCi17DQotcHVibGljOg0KLSAgICBDRlhfVHh0Q2hhcigpIDogQ0ZYX0NoYXIoKQ0KLSAgICAgICAgLCBtX2R3U3RhdHVzKDApDQotICAgICAgICAsIG1faUJpZGlDbGFzcygwKQ0KLSAgICAgICAgLCBtX2lCaWRpTGV2ZWwoMCkNCi0gICAgICAgICwgbV9pQmlkaVBvcygwKQ0KLSAgICAgICAgLCBtX2lCaWRpT3JkZXIoMCkNCi0gICAgICAgICwgbV9wVXNlckRhdGEoTlVMTCkNCi0gICAgew0KLSAgICB9DQotICAgIEZYX0RXT1JECQkJbV9kd1N0YXR1czsNCi0gICAgaW50MTZfdAkJCW1faUJpZGlDbGFzczsNCi0gICAgaW50MTZfdAkJCW1faUJpZGlMZXZlbDsNCi0gICAgaW50MTZfdAkJCW1faUJpZGlQb3M7DQotICAgIGludDE2X3QJCQltX2lCaWRpT3JkZXI7DQotICAgIHZvaWQqCQkJbV9wVXNlckRhdGE7DQotfTsNCi10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9UeHRDaGFyPglDRlhfVHh0Q2hhckFycmF5Ow0KLWNsYXNzIENGWF9SVEZDaGFyIDogcHVibGljIENGWF9DaGFyDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX1JURkNoYXIoKSA6IENGWF9DaGFyKCkNCi0gICAgICAgICwgbV9kd1N0YXR1cygwKQ0KLSAgICAgICAgLCBtX2lGb250U2l6ZSgwKQ0KLSAgICAgICAgLCBtX2lGb250SGVpZ2h0KDApDQotICAgICAgICAsIG1faUJpZGlDbGFzcygwKQ0KLSAgICAgICAgLCBtX2lCaWRpTGV2ZWwoMCkNCi0gICAgICAgICwgbV9pQmlkaVBvcygwKQ0KLSAgICAgICAgLCBtX2R3TGF5b3V0U3R5bGVzKDApDQotICAgICAgICAsIG1fZHdJZGVudGl0eSgwKQ0KLSAgICAgICAgLCBtX3BVc2VyRGF0YShOVUxMKQ0KLSAgICB7DQotICAgIH0NCi0gICAgRlhfRFdPUkQJCQltX2R3U3RhdHVzOw0KLSAgICBpbnQzMl90CQkJbV9pRm9udFNpemU7DQotICAgIGludDMyX3QJCQltX2lGb250SGVpZ2h0Ow0KLSAgICBpbnQxNl90CQkJbV9pQmlkaUNsYXNzOw0KLSAgICBpbnQxNl90CQkJbV9pQmlkaUxldmVsOw0KLSAgICBpbnQxNl90CQkJbV9pQmlkaVBvczsNCi0gICAgaW50MTZfdAkJCW1faUJpZGlPcmRlcjsNCi0gICAgRlhfRFdPUkQJCQltX2R3TGF5b3V0U3R5bGVzOw0KLSAgICBGWF9EV09SRAkJCW1fZHdJZGVudGl0eTsNCi0gICAgSUZYX1Vua25vd24JCQkqbV9wVXNlckRhdGE7DQotfTsNCi10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9SVEZDaGFyPglDRlhfUlRGQ2hhckFycmF5Ow0KK0ZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnRpY2FsKTsKK2NsYXNzIENGWF9DaGFyIHsKKyBwdWJsaWM6CisgIENGWF9DaGFyKCkKKyAgICAgIDogbV93Q2hhckNvZGUoMCksCisgICAgICAgIG1fbkJyZWFrVHlwZSgwKSwKKyAgICAgICAgbV9uUm90YXRpb24oMCksCisgICAgICAgIG1fZHdDaGFyUHJvcHMoMCksCisgICAgICAgIG1fZHdDaGFyU3R5bGVzKDApLAorICAgICAgICBtX2lDaGFyV2lkdGgoMCksCisgICAgICAgIG1faUhvcml6b250YWxTY2FsZSgxMDApLAorICAgICAgICBtX2lWZXJ0aWFsU2NhbGUoMTAwKSB7fQorICBDRlhfQ2hhcihGWF9XT1JEIHdDaGFyQ29kZSwgRlhfRFdPUkQgZHdDaGFyUHJvcHMpCisgICAgICA6IG1fd0NoYXJDb2RlKHdDaGFyQ29kZSksCisgICAgICAgIG1fbkJyZWFrVHlwZSgwKSwKKyAgICAgICAgbV9uUm90YXRpb24oMCksCisgICAgICAgIG1fZHdDaGFyUHJvcHMoZHdDaGFyUHJvcHMpLAorICAgICAgICBtX2R3Q2hhclN0eWxlcygwKSwKKyAgICAgICAgbV9pQ2hhcldpZHRoKDApLAorICAgICAgICBtX2lIb3Jpem9udGFsU2NhbGUoMTAwKSwKKyAgICAgICAgbV9pVmVydGlhbFNjYWxlKDEwMCkge30KKyAgRlhfRFdPUkQgR2V0Q2hhclR5cGUoKSBjb25zdCB7IHJldHVybiBtX2R3Q2hhclByb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSzsgfQorICBGWF9XT1JEIG1fd0NoYXJDb2RlOworICB1aW50OF90IG1fbkJyZWFrVHlwZTsKKyAgaW50OF90IG1fblJvdGF0aW9uOworICBGWF9EV09SRCBtX2R3Q2hhclByb3BzOworICBGWF9EV09SRCBtX2R3Q2hhclN0eWxlczsKKyAgaW50MzJfdCBtX2lDaGFyV2lkdGg7CisgIGludDMyX3QgbV9pSG9yaXpvbnRhbFNjYWxlOworICBpbnQzMl90IG1faVZlcnRpYWxTY2FsZTsKK307Cit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9DaGFyPiBDRlhfQ2hhckFycmF5OworY2xhc3MgQ0ZYX1R4dENoYXIgOiBwdWJsaWMgQ0ZYX0NoYXIgeworIHB1YmxpYzoKKyAgQ0ZYX1R4dENoYXIoKQorICAgICAgOiBDRlhfQ2hhcigpLAorICAgICAgICBtX2R3U3RhdHVzKDApLAorICAgICAgICBtX2lCaWRpQ2xhc3MoMCksCisgICAgICAgIG1faUJpZGlMZXZlbCgwKSwKKyAgICAgICAgbV9pQmlkaVBvcygwKSwKKyAgICAgICAgbV9pQmlkaU9yZGVyKDApLAorICAgICAgICBtX3BVc2VyRGF0YShOVUxMKSB7fQorICBGWF9EV09SRCBtX2R3U3RhdHVzOworICBpbnQxNl90IG1faUJpZGlDbGFzczsKKyAgaW50MTZfdCBtX2lCaWRpTGV2ZWw7CisgIGludDE2X3QgbV9pQmlkaVBvczsKKyAgaW50MTZfdCBtX2lCaWRpT3JkZXI7CisgIHZvaWQqIG1fcFVzZXJEYXRhOworfTsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX1R4dENoYXI+IENGWF9UeHRDaGFyQXJyYXk7CitjbGFzcyBDRlhfUlRGQ2hhciA6IHB1YmxpYyBDRlhfQ2hhciB7CisgcHVibGljOgorICBDRlhfUlRGQ2hhcigpCisgICAgICA6IENGWF9DaGFyKCksCisgICAgICAgIG1fZHdTdGF0dXMoMCksCisgICAgICAgIG1faUZvbnRTaXplKDApLAorICAgICAgICBtX2lGb250SGVpZ2h0KDApLAorICAgICAgICBtX2lCaWRpQ2xhc3MoMCksCisgICAgICAgIG1faUJpZGlMZXZlbCgwKSwKKyAgICAgICAgbV9pQmlkaVBvcygwKSwKKyAgICAgICAgbV9kd0xheW91dFN0eWxlcygwKSwKKyAgICAgICAgbV9kd0lkZW50aXR5KDApLAorICAgICAgICBtX3BVc2VyRGF0YShOVUxMKSB7fQorICBGWF9EV09SRCBtX2R3U3RhdHVzOworICBpbnQzMl90IG1faUZvbnRTaXplOworICBpbnQzMl90IG1faUZvbnRIZWlnaHQ7CisgIGludDE2X3QgbV9pQmlkaUNsYXNzOworICBpbnQxNl90IG1faUJpZGlMZXZlbDsKKyAgaW50MTZfdCBtX2lCaWRpUG9zOworICBpbnQxNl90IG1faUJpZGlPcmRlcjsKKyAgRlhfRFdPUkQgbV9kd0xheW91dFN0eWxlczsKKyAgRlhfRFdPUkQgbV9kd0lkZW50aXR5OworICBJRlhfVW5rbm93biogbV9wVXNlckRhdGE7Cit9OwordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfUlRGQ2hhcj4gQ0ZYX1JURkNoYXJBcnJheTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlhDUlRfRlhfVUNEX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgKaW5kZXggYmEzM2IyMC4uZWFmODcyYyAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF94bWwuaApAQCAtOSwxNzIgKzksMTY4IEBACiAKICNpbmNsdWRlICJmeF9iYXNpYy5oIgogCi1jbGFzcyBDWE1MX0F0dHJJdGVtCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJbV9RU3BhY2VOYW1lOwotICAgIENGWF9CeXRlU3RyaW5nCW1fQXR0ck5hbWU7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcJbV9WYWx1ZTsKK2NsYXNzIENYTUxfQXR0ckl0ZW0geworIHB1YmxpYzoKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9RU3BhY2VOYW1lOworICBDRlhfQnl0ZVN0cmluZyBtX0F0dHJOYW1lOworICBDRlhfV2lkZVN0cmluZyBtX1ZhbHVlOwogfTsKLWNsYXNzIENYTUxfQXR0ck1hcAotewotcHVibGljOgotICAgIENYTUxfQXR0ck1hcCgpCi0gICAgewotICAgICAgICBtX3BNYXAgPSBOVUxMOwotICAgIH0KLSAgICB+Q1hNTF9BdHRyTWFwKCkKLSAgICB7Ci0gICAgICAgIFJlbW92ZUFsbCgpOwotICAgIH0KLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyoJTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3Q7Ci0gICAgdm9pZAkJCQkJU2V0QXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHZhbHVlKTsKLSAgICB2b2lkCQkJCQlSZW1vdmVBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpOwotICAgIHZvaWQJCQkJCVJlbW92ZUFsbCgpOwotICAgIGludAkJCQkJCUdldFNpemUoKSBjb25zdDsKLSAgICBDWE1MX0F0dHJJdGVtJgkJCUdldEF0KGludCBpbmRleCkgY29uc3Q7Ci0gICAgQ0ZYX09iamVjdEFycmF5PENYTUxfQXR0ckl0ZW0+KgltX3BNYXA7CitjbGFzcyBDWE1MX0F0dHJNYXAgeworIHB1YmxpYzoKKyAgQ1hNTF9BdHRyTWFwKCkgeyBtX3BNYXAgPSBOVUxMOyB9CisgIH5DWE1MX0F0dHJNYXAoKSB7IFJlbW92ZUFsbCgpOyB9CisgIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0OworICB2b2lkIFNldEF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgdmFsdWUpOworICB2b2lkIFJlbW92ZUF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSk7CisgIHZvaWQgUmVtb3ZlQWxsKCk7CisgIGludCBHZXRTaXplKCkgY29uc3Q7CisgIENYTUxfQXR0ckl0ZW0mIEdldEF0KGludCBpbmRleCkgY29uc3Q7CisgIENGWF9PYmplY3RBcnJheTxDWE1MX0F0dHJJdGVtPiogbV9wTWFwOwogfTsKLWNsYXNzIENYTUxfQ29udGVudAotewotcHVibGljOgotICAgIENYTUxfQ29udGVudCgpIDogbV9iQ0RBVEEoRkFMU0UpLCBtX0NvbnRlbnQoKSB7fQotICAgIHZvaWQJU2V0KEZYX0JPT0wgYkNEQVRBLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnQpCi0gICAgewotICAgICAgICBtX2JDREFUQSA9IGJDREFUQTsKLSAgICAgICAgbV9Db250ZW50ID0gY29udGVudDsKLSAgICB9Ci0gICAgRlhfQk9PTAkJCW1fYkNEQVRBOwotICAgIENGWF9XaWRlU3RyaW5nCW1fQ29udGVudDsKK2NsYXNzIENYTUxfQ29udGVudCB7CisgcHVibGljOgorICBDWE1MX0NvbnRlbnQoKSA6IG1fYkNEQVRBKEZBTFNFKSwgbV9Db250ZW50KCkge30KKyAgdm9pZCBTZXQoRlhfQk9PTCBiQ0RBVEEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCkgeworICAgIG1fYkNEQVRBID0gYkNEQVRBOworICAgIG1fQ29udGVudCA9IGNvbnRlbnQ7CisgIH0KKyAgRlhfQk9PTCBtX2JDREFUQTsKKyAgQ0ZYX1dpZGVTdHJpbmcgbV9Db250ZW50OwogfTsKLWNsYXNzIENYTUxfRWxlbWVudAotewotcHVibGljOgotICAgIHN0YXRpYyBDWE1MX0VsZW1lbnQqCVBhcnNlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzaXplLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycyA9IEZBTFNFLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKLSAgICBzdGF0aWMgQ1hNTF9FbGVtZW50KglQYXJzZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycyA9IEZBTFNFLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKLSAgICBzdGF0aWMgQ1hNTF9FbGVtZW50KglQYXJzZShJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlciwgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMgPSBGQUxTRSwgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplID0gTlVMTCk7Ci0gICAgQ1hNTF9FbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZ05hbWUpOwotICAgIENYTUxfRWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFUYWdOYW1lKTsKLSAgICBDWE1MX0VsZW1lbnQoKTsKK2NsYXNzIENYTUxfRWxlbWVudCB7CisgcHVibGljOgorICBzdGF0aWMgQ1hNTF9FbGVtZW50KiBQYXJzZShjb25zdCB2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplID0gTlVMTCk7CisgIHN0YXRpYyBDWE1MX0VsZW1lbnQqIFBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSA9IE5VTEwpOworICBzdGF0aWMgQ1hNTF9FbGVtZW50KiBQYXJzZShJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplID0gTlVMTCk7CisgIENYTUxfRWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFTcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWdOYW1lKTsKKyAgQ1hNTF9FbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVRhZ05hbWUpOworICBDWE1MX0VsZW1lbnQoKTsKIAotICAgIH5DWE1MX0VsZW1lbnQoKTsKKyAgfkNYTUxfRWxlbWVudCgpOwogCi0gICAgdm9pZAlFbXB0eSgpOworICB2b2lkIEVtcHR5KCk7CiAKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0VGFnTmFtZShGWF9CT09MIGJRdWFsaWZpZWQgPSBGQUxTRSkgY29uc3Q7CiAKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZXNwYWNlKEZYX0JPT0wgYlF1YWxpZmllZCA9IEZBTFNFKSBjb25zdDsKIAotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0VGFnTmFtZShGWF9CT09MIGJRdWFsaWZpZWQgPSBGQUxTRSkgY29uc3Q7CisgIENGWF9CeXRlU3RyaW5nIEdldE5hbWVzcGFjZVVSSShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFOYW1lKSBjb25zdDsKIAotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0TmFtZXNwYWNlKEZYX0JPT0wgYlF1YWxpZmllZCA9IEZBTFNFKSBjb25zdDsKKyAgQ1hNTF9FbGVtZW50KiBHZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBtX3BQYXJlbnQ7IH0KIAotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0TmFtZXNwYWNlVVJJKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcU5hbWUpIGNvbnN0OworICBGWF9EV09SRCBDb3VudEF0dHJzKCkgY29uc3QgeyByZXR1cm4gbV9BdHRyTWFwLkdldFNpemUoKTsgfQogCi0gICAgQ1hNTF9FbGVtZW50KgkJCUdldFBhcmVudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wUGFyZW50OwotICAgIH0KKyAgdm9pZCBHZXRBdHRyQnlJbmRleChpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB2YWx1ZSkgY29uc3Q7CiAKLSAgICBGWF9EV09SRAkJCQlDb3VudEF0dHJzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0F0dHJNYXAuR2V0U2l6ZSgpOwotICAgIH0KKyAgRlhfQk9PTCBIYXNBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcU5hbWUpIGNvbnN0OwogCi0gICAgdm9pZAkJCQkJR2V0QXR0ckJ5SW5kZXgoaW50IGluZGV4LCBDRlhfQnl0ZVN0cmluZyAmc3BhY2UsIENGWF9CeXRlU3RyaW5nICZuYW1lLCBDRlhfV2lkZVN0cmluZyAmdmFsdWUpIGNvbnN0OworICBGWF9CT09MIEdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0OworICBDRlhfV2lkZVN0cmluZyBHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdCB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgYXR0cjsKKyAgICBHZXRBdHRyVmFsdWUobmFtZSwgYXR0cik7CisgICAgcmV0dXJuIGF0dHI7CisgIH0KIAotICAgIEZYX0JPT0wJCQkJCUhhc0F0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxTmFtZSkgY29uc3Q7CisgIEZYX0JPT0wgR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3Q7CisgIENGWF9XaWRlU3RyaW5nIEdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdCB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgYXR0cjsKKyAgICBHZXRBdHRyVmFsdWUoc3BhY2UsIG5hbWUsIGF0dHIpOworICAgIHJldHVybiBhdHRyOworICB9CiAKLSAgICBGWF9CT09MCQkJCQlHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBDRlhfV2lkZVN0cmluZyYgYXR0cmlidXRlKSBjb25zdDsKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0Ci0gICAgewotICAgICAgICBDRlhfV2lkZVN0cmluZyBhdHRyOwotICAgICAgICBHZXRBdHRyVmFsdWUobmFtZSwgYXR0cik7Ci0gICAgICAgIHJldHVybiBhdHRyOwotICAgIH0KKyAgRlhfQk9PTCBHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCYgYXR0cmlidXRlKSBjb25zdDsKKyAgaW50IEdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QgeworICAgIGludCBhdHRyID0gMDsKKyAgICBHZXRBdHRySW50ZWdlcihuYW1lLCBhdHRyKTsKKyAgICByZXR1cm4gYXR0cjsKKyAgfQogCi0gICAgRlhfQk9PTAkJCQkJR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3Q7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdAotICAgIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgYXR0cjsKLSAgICAgICAgR2V0QXR0clZhbHVlKHNwYWNlLCBuYW1lLCBhdHRyKTsKLSAgICAgICAgcmV0dXJuIGF0dHI7Ci0gICAgfQorICBGWF9CT09MIEdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgYXR0cmlidXRlKSBjb25zdDsKKyAgaW50IEdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0IHsKKyAgICBpbnQgYXR0ciA9IDA7CisgICAgR2V0QXR0ckludGVnZXIoc3BhY2UsIG5hbWUsIGF0dHIpOworICAgIHJldHVybiBhdHRyOworICB9CiAKLSAgICBGWF9CT09MCQkJCQlHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCYgYXR0cmlidXRlKSBjb25zdDsKLSAgICBpbnQJCQkJCQlHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0Ci0gICAgewotICAgICAgICBpbnQgYXR0ciA9IDA7Ci0gICAgICAgIEdldEF0dHJJbnRlZ2VyKG5hbWUsIGF0dHIpOwotICAgICAgICByZXR1cm4gYXR0cjsKLSAgICB9CisgIEZYX0JPT0wgR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0IHsKKyAgICBGWF9GTE9BVCBhdHRyID0gMDsKKyAgICBHZXRBdHRyRmxvYXQobmFtZSwgYXR0cik7CisgICAgcmV0dXJuIGF0dHI7CisgIH0KIAotICAgIEZYX0JPT0wJCQkJCUdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0OwotICAgIGludAkJCQkJCUdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGludCBhdHRyID0gMDsKLSAgICAgICAgR2V0QXR0ckludGVnZXIoc3BhY2UsIG5hbWUsIGF0dHIpOwotICAgICAgICByZXR1cm4gYXR0cjsKLSAgICB9CisgIEZYX0JPT0wgR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdCB7CisgICAgRlhfRkxPQVQgYXR0ciA9IDA7CisgICAgR2V0QXR0ckZsb2F0KHNwYWNlLCBuYW1lLCBhdHRyKTsKKyAgICByZXR1cm4gYXR0cjsKKyAgfQogCi0gICAgRlhfQk9PTAkJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3Q7Ci0gICAgRlhfRkxPQVQJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZYX0ZMT0FUIGF0dHIgPSAwOwotICAgICAgICBHZXRBdHRyRmxvYXQobmFtZSwgYXR0cik7Ci0gICAgICAgIHJldHVybiBhdHRyOwotICAgIH0KKyAgRlhfRFdPUkQgQ291bnRDaGlsZHJlbigpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3Q7Ci0gICAgRlhfRkxPQVQJCQkJR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZYX0ZMT0FUIGF0dHIgPSAwOwotICAgICAgICBHZXRBdHRyRmxvYXQoc3BhY2UsIG5hbWUsIGF0dHIpOwotICAgICAgICByZXR1cm4gYXR0cjsKLSAgICB9CisgIGVudW0gQ2hpbGRUeXBlIHsgSW52YWxpZCwgRWxlbWVudCwgQ29udGVudCB9OwogCi0gICAgRlhfRFdPUkQJCQkJQ291bnRDaGlsZHJlbigpIGNvbnN0OworICBDaGlsZFR5cGUgR2V0Q2hpbGRUeXBlKEZYX0RXT1JEIGluZGV4KSBjb25zdDsKIAotICAgIGVudW0gQ2hpbGRUeXBlIHsgSW52YWxpZCwgRWxlbWVudCwgQ29udGVudH07CisgIENGWF9XaWRlU3RyaW5nIEdldENvbnRlbnQoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCi0gICAgQ2hpbGRUeXBlCQkJCUdldENoaWxkVHlwZShGWF9EV09SRCBpbmRleCkgY29uc3Q7CisgIENYTUxfRWxlbWVudCogR2V0RWxlbWVudChGWF9EV09SRCBpbmRleCkgY29uc3Q7CiAKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldENvbnRlbnQoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OworICBDWE1MX0VsZW1lbnQqIEdldEVsZW1lbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEVsZW1lbnQoc3BhY2UsIHRhZywgMCk7CisgIH0KIAotICAgIENYTUxfRWxlbWVudCoJCQlHZXRFbGVtZW50KEZYX0RXT1JEIGluZGV4KSBjb25zdDsKKyAgRlhfRFdPUkQgQ291bnRFbGVtZW50cyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnKSBjb25zdDsKIAotICAgIENYTUxfRWxlbWVudCoJCQlHZXRFbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldEVsZW1lbnQoc3BhY2UsIHRhZywgMCk7Ci0gICAgfQorICBDWE1MX0VsZW1lbnQqIEdldEVsZW1lbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKIAotICAgIEZYX0RXT1JECQkJCUNvdW50RWxlbWVudHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcpIGNvbnN0OworICBGWF9EV09SRCBGaW5kRWxlbWVudChDWE1MX0VsZW1lbnQqIHBDaGlsZCkgY29uc3Q7CiAKLSAgICBDWE1MX0VsZW1lbnQqCQkJR2V0RWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZywgaW50IGluZGV4KSBjb25zdDsKKyAgdm9pZCBTZXRUYWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxU3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnbmFtZSk7CiAKLSAgICBGWF9EV09SRAkJCQlGaW5kRWxlbWVudChDWE1MX0VsZW1lbnQgKnBDaGlsZCkgY29uc3Q7CisgIHZvaWQgU2V0VGFnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVRhZ05hbWUpOwogCisgIHZvaWQgUmVtb3ZlQ2hpbGRyZW4oKTsKIAorICB2b2lkIFJlbW92ZUNoaWxkKEZYX0RXT1JEIGluZGV4KTsKIAorIHByb3RlY3RlZDoKKyAgQ1hNTF9FbGVtZW50KiBtX3BQYXJlbnQ7CisgIENGWF9CeXRlU3RyaW5nIG1fUVNwYWNlTmFtZTsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9UYWdOYW1lOwogCi0gICAgdm9pZAkJCQkJU2V0VGFnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZ25hbWUpOworICBDWE1MX0F0dHJNYXAgbV9BdHRyTWFwOwogCi0gICAgdm9pZAkJCQkJU2V0VGFnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVRhZ05hbWUpOwotCi0gICAgdm9pZAkJCQkJUmVtb3ZlQ2hpbGRyZW4oKTsKLQotICAgIHZvaWQJCQkJCVJlbW92ZUNoaWxkKEZYX0RXT1JEIGluZGV4KTsKLQotCi1wcm90ZWN0ZWQ6Ci0KLSAgICBDWE1MX0VsZW1lbnQqCQkJbV9wUGFyZW50OwotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9RU3BhY2VOYW1lOwotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9UYWdOYW1lOwotCi0gICAgQ1hNTF9BdHRyTWFwCQkJbV9BdHRyTWFwOwotCi0gICAgQ0ZYX1B0ckFycmF5CQkJbV9DaGlsZHJlbjsKLSAgICBmcmllbmQgY2xhc3MgQ1hNTF9QYXJzZXI7Ci0gICAgZnJpZW5kIGNsYXNzIENYTUxfQ29tcG9zZXI7CisgIENGWF9QdHJBcnJheSBtX0NoaWxkcmVuOworICBmcmllbmQgY2xhc3MgQ1hNTF9QYXJzZXI7CisgIGZyaWVuZCBjbGFzcyBDWE1MX0NvbXBvc2VyOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlhDUlRfRlhfWE1MX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhnZS9mcGYuaCBiL2NvcmUvaW5jbHVkZS9meGdlL2ZwZi5oCmluZGV4IGZiOWJmNGQuLmVmYTAwMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2ZwZi5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGdlL2ZwZi5oCkBAIC0xMiw1NSArMTIsNTUgQEAKIGNsYXNzIElGUEZfRGV2aWNlTW9kdWxlOwogY2xhc3MgSUZQRl9Gb250TWdyOwogY2xhc3MgSUZQRl9Gb250OwotY2xhc3MgSUZQRl9EZXZpY2VNb2R1bGUKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JRlBGX0RldmljZU1vZHVsZSgpIHsgfQotICAgIHZpcnR1YWwgdm9pZAkJCQlEZXN0cm95KCkgPSAwOwotICAgIHZpcnR1YWwgSUZQRl9Gb250TWdyKgkJR2V0Rm9udE1ncigpID0gMDsKK2NsYXNzIElGUEZfRGV2aWNlTW9kdWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGUEZfRGV2aWNlTW9kdWxlKCkge30KKyAgdmlydHVhbCB2b2lkIERlc3Ryb3koKSA9IDA7CisgIHZpcnR1YWwgSUZQRl9Gb250TWdyKiBHZXRGb250TWdyKCkgPSAwOwogfTsKLUlGUEZfRGV2aWNlTW9kdWxlKglGUEZfR2V0RGV2aWNlTW9kdWxlKCk7Ci0jZGVmaW5lIEZQRl9NQVRDSEZPTlRfUkVQTEFDRUFOU0kJCTEKLXR5cGVkZWYgc3RydWN0IEZQRl9IRk9OVF8gewotICAgIHZvaWQqIHBEYXRhOwotfSogRlBGX0hGT05UOwotY2xhc3MgSUZQRl9Gb250Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpID0gMDsKLSAgICB2aXJ0dWFsIElGUEZfRm9udCoJCVJldGFpbigpID0gMDsKLSAgICB2aXJ0dWFsIEZQRl9IRk9OVAkJR2V0SGFuZGxlKCkgPSAwOwotICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJR2V0RmFtaWx5TmFtZSgpID0gMDsKLSAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCUdldFBzTmFtZSgpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRGb250U3R5bGUoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB1aW50OF90CQkJR2V0Q2hhcnNldCgpIGNvbnN0ID0gMDsKK0lGUEZfRGV2aWNlTW9kdWxlKiBGUEZfR2V0RGV2aWNlTW9kdWxlKCk7CisjZGVmaW5lIEZQRl9NQVRDSEZPTlRfUkVQTEFDRUFOU0kgMQordHlwZWRlZiBzdHJ1Y3QgRlBGX0hGT05UXyB7IHZvaWQqIHBEYXRhOyB9ICogRlBGX0hGT05UOworY2xhc3MgSUZQRl9Gb250IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOworICB2aXJ0dWFsIElGUEZfRm9udCogUmV0YWluKCkgPSAwOworICB2aXJ0dWFsIEZQRl9IRk9OVCBHZXRIYW5kbGUoKSA9IDA7CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0RmFtaWx5TmFtZSgpID0gMDsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRQc05hbWUoKSA9IDA7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Rm9udFN0eWxlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ4X3QgR2V0Q2hhcnNldCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSkgPSAwOwotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0R2x5cGhXaWR0aChpbnQzMl90IGlHbHlwaEluZGV4KSA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlKSA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRHbHlwaFdpZHRoKGludDMyX3QgaUdseXBoSW5kZXgpID0gMDsKIAotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0QXNjZW50KCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0RGVzY2VudCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldEFzY2VudCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldERlc2NlbnQoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRHbHlwaEJCb3goaW50MzJfdCBpR2x5cGhJbmRleCwgRlhfUkVDVCAmcnRCQm94KSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QkJveChGWF9SRUNUICZydEJCb3gpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEdldEdseXBoQkJveChpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9SRUNUJiBydEJCb3gpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goRlhfUkVDVCYgcnRCQm94KSA9IDA7CiAKLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEhlaWdodCgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEl0YWxpY0FuZ2xlKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldEZvbnREYXRhKEZYX0RXT1JEIGR3VGFibGUsIHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSkgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0SGVpZ2h0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0SXRhbGljQW5nbGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Rm9udERhdGEoRlhfRFdPUkQgZHdUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZSkgPSAwOwogCi1wcm90ZWN0ZWQ6Ci0gICAgfklGUEZfRm9udCgpIHsgfQorIHByb3RlY3RlZDoKKyAgfklGUEZfRm9udCgpIHt9CiB9OwotY2xhc3MgSUZQRl9Gb250TWdyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZQRl9Gb250TWdyKCkgeyB9Ci0gICAgdmlydHVhbCB2b2lkCQkJTG9hZFN5c3RlbUZvbnRzKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRQcml2YXRlRm9udChJRlhfRmlsZVJlYWQqIHBGb250RmlsZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRQcml2YXRlRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmlsZU5hbWUpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQJCQlMb2FkUHJpdmF0ZUZvbnQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSA9IDA7CitjbGFzcyBJRlBGX0ZvbnRNZ3IgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZQRl9Gb250TWdyKCkge30KKyAgdmlydHVhbCB2b2lkIExvYWRTeXN0ZW1Gb250cygpID0gMDsKKyAgdmlydHVhbCB2b2lkIExvYWRQcml2YXRlRm9udChJRlhfRmlsZVJlYWQqIHBGb250RmlsZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgTG9hZFByaXZhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGaWxlTmFtZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgTG9hZFByaXZhdGVGb250KHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgPSAwOwogCi0gICAgdmlydHVhbCBJRlBGX0ZvbnQqCQlDcmVhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYW1pbHluYW1lLCB1aW50OF90IGNoYXJzZXQsIEZYX0RXT1JEIGR3U3R5bGUsIEZYX0RXT1JEIGR3TWF0Y2ggPSAwKSA9IDA7CisgIHZpcnR1YWwgSUZQRl9Gb250KiBDcmVhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYW1pbHluYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TWF0Y2ggPSAwKSA9IDA7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWEdFX0ZQRl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaAppbmRleCAyN2ZjMmY5Li5kZGM0N2QzIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaApAQCAtMTEsNTk1ICsxMSw2ODEgQEAKICNpbmNsdWRlICIuLi9meGNydC9meF9jb29yZGluYXRlcy5oIgogCiBlbnVtIEZYRElCX0Zvcm1hdCB7Ci0gICAgRlhESUJfSW52YWxpZCA9IDAsCi0gICAgRlhESUJfMWJwcE1hc2sgPSAweDEwMSwKLSAgICBGWERJQl8xYnBwUmdiID0gMHgwMDEsCi0gICAgRlhESUJfMWJwcENteWsgPSAweDQwMSwKLSAgICBGWERJQl84YnBwTWFzayA9IDB4MTA4LAotICAgIEZYRElCXzhicHBSZ2IgPSAweDAwOCwKLSAgICBGWERJQl84YnBwUmdiYSA9IDB4MjA4LAotICAgIEZYRElCXzhicHBDbXlrID0gMHg0MDgsCi0gICAgRlhESUJfOGJwcENteWthID0gMHg2MDgsCi0gICAgRlhESUJfUmdiID0gMHgwMTgsCi0gICAgRlhESUJfUmdiYSA9IDB4MjE4LAotICAgIEZYRElCX1JnYjMyID0gMHgwMjAsCi0gICAgRlhESUJfQXJnYiA9IDB4MjIwLAotICAgIEZYRElCX0NteWsgPSAweDQyMCwKLSAgICBGWERJQl9DbXlrYSA9IDB4NjIwLAorICBGWERJQl9JbnZhbGlkID0gMCwKKyAgRlhESUJfMWJwcE1hc2sgPSAweDEwMSwKKyAgRlhESUJfMWJwcFJnYiA9IDB4MDAxLAorICBGWERJQl8xYnBwQ215ayA9IDB4NDAxLAorICBGWERJQl84YnBwTWFzayA9IDB4MTA4LAorICBGWERJQl84YnBwUmdiID0gMHgwMDgsCisgIEZYRElCXzhicHBSZ2JhID0gMHgyMDgsCisgIEZYRElCXzhicHBDbXlrID0gMHg0MDgsCisgIEZYRElCXzhicHBDbXlrYSA9IDB4NjA4LAorICBGWERJQl9SZ2IgPSAweDAxOCwKKyAgRlhESUJfUmdiYSA9IDB4MjE4LAorICBGWERJQl9SZ2IzMiA9IDB4MDIwLAorICBGWERJQl9BcmdiID0gMHgyMjAsCisgIEZYRElCX0NteWsgPSAweDQyMCwKKyAgRlhESUJfQ215a2EgPSAweDYyMCwKIH07CiBlbnVtIEZYRElCX0NoYW5uZWwgewotICAgIEZYRElCX1JlZCA9IDEsCi0gICAgRlhESUJfR3JlZW4sCi0gICAgRlhESUJfQmx1ZSwKLSAgICBGWERJQl9DeWFuLAotICAgIEZYRElCX01hZ2VudGEsCi0gICAgRlhESUJfWWVsbG93LAotICAgIEZYRElCX0JsYWNrLAotICAgIEZYRElCX0FscGhhCisgIEZYRElCX1JlZCA9IDEsCisgIEZYRElCX0dyZWVuLAorICBGWERJQl9CbHVlLAorICBGWERJQl9DeWFuLAorICBGWERJQl9NYWdlbnRhLAorICBGWERJQl9ZZWxsb3csCisgIEZYRElCX0JsYWNrLAorICBGWERJQl9BbHBoYQogfTsKLSNkZWZpbmUgRlhESUJfRE9XTlNBTVBMRQkJMHgwNAotI2RlZmluZSBGWERJQl9JTlRFUlBPTAkJCTB4MjAKLSNkZWZpbmUgRlhESUJfQklDVUJJQ19JTlRFUlBPTCAgMHg4MAotI2RlZmluZSBGWERJQl9OT1NNT09USAkJCTB4MTAwCi0jZGVmaW5lIEZYRElCX1BBTEVUVEVfTE9DCQkweDAxCi0jZGVmaW5lIEZYRElCX1BBTEVUVEVfV0lOCQkweDAyCi0jZGVmaW5lIEZYRElCX1BBTEVUVEVfTUFDCQkweDA0Ci0jZGVmaW5lIEZYRElCX0JMRU5EX05PUk1BTAkJCTAKLSNkZWZpbmUgRlhESUJfQkxFTkRfTVVMVElQTFkJCTEKLSNkZWZpbmUgRlhESUJfQkxFTkRfU0NSRUVOCQkJMgotI2RlZmluZSBGWERJQl9CTEVORF9PVkVSTEFZCQkJMwotI2RlZmluZSBGWERJQl9CTEVORF9EQVJLRU4JCQk0Ci0jZGVmaW5lIEZYRElCX0JMRU5EX0xJR0hURU4JCQk1CisjZGVmaW5lIEZYRElCX0RPV05TQU1QTEUgMHgwNAorI2RlZmluZSBGWERJQl9JTlRFUlBPTCAweDIwCisjZGVmaW5lIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wgMHg4MAorI2RlZmluZSBGWERJQl9OT1NNT09USCAweDEwMAorI2RlZmluZSBGWERJQl9QQUxFVFRFX0xPQyAweDAxCisjZGVmaW5lIEZYRElCX1BBTEVUVEVfV0lOIDB4MDIKKyNkZWZpbmUgRlhESUJfUEFMRVRURV9NQUMgMHgwNAorI2RlZmluZSBGWERJQl9CTEVORF9OT1JNQUwgMAorI2RlZmluZSBGWERJQl9CTEVORF9NVUxUSVBMWSAxCisjZGVmaW5lIEZYRElCX0JMRU5EX1NDUkVFTiAyCisjZGVmaW5lIEZYRElCX0JMRU5EX09WRVJMQVkgMworI2RlZmluZSBGWERJQl9CTEVORF9EQVJLRU4gNAorI2RlZmluZSBGWERJQl9CTEVORF9MSUdIVEVOIDUKIAotI2RlZmluZSBGWERJQl9CTEVORF9DT0xPUkRPREdFCQk2Ci0jZGVmaW5lIEZYRElCX0JMRU5EX0NPTE9SQlVSTgkJNwotI2RlZmluZSBGWERJQl9CTEVORF9IQVJETElHSFQJCTgKLSNkZWZpbmUgRlhESUJfQkxFTkRfU09GVExJR0hUCQk5Ci0jZGVmaW5lIEZYRElCX0JMRU5EX0RJRkZFUkVOQ0UJCTEwCi0jZGVmaW5lIEZYRElCX0JMRU5EX0VYQ0xVU0lPTgkJMTEKLSNkZWZpbmUgRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFCTIxCi0jZGVmaW5lIEZYRElCX0JMRU5EX0hVRQkJCQkyMQotI2RlZmluZSBGWERJQl9CTEVORF9TQVRVUkFUSU9OCQkyMgotI2RlZmluZSBGWERJQl9CTEVORF9DT0xPUgkJCTIzCi0jZGVmaW5lIEZYRElCX0JMRU5EX0xVTUlOT1NJVFkJCTI0Ci0jZGVmaW5lIEZYRElCX0JMRU5EX1VOU1VQUE9SVEVECQktMQotdHlwZWRlZiBGWF9EV09SRAlGWF9BUkdCOwotdHlwZWRlZiBGWF9EV09SRAlGWF9DT0xPUlJFRjsKLXR5cGVkZWYgRlhfRFdPUkQJRlhfQ01ZSzsKKyNkZWZpbmUgRlhESUJfQkxFTkRfQ09MT1JET0RHRSA2CisjZGVmaW5lIEZYRElCX0JMRU5EX0NPTE9SQlVSTiA3CisjZGVmaW5lIEZYRElCX0JMRU5EX0hBUkRMSUdIVCA4CisjZGVmaW5lIEZYRElCX0JMRU5EX1NPRlRMSUdIVCA5CisjZGVmaW5lIEZYRElCX0JMRU5EX0RJRkZFUkVOQ0UgMTAKKyNkZWZpbmUgRlhESUJfQkxFTkRfRVhDTFVTSU9OIDExCisjZGVmaW5lIEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSAyMQorI2RlZmluZSBGWERJQl9CTEVORF9IVUUgMjEKKyNkZWZpbmUgRlhESUJfQkxFTkRfU0FUVVJBVElPTiAyMgorI2RlZmluZSBGWERJQl9CTEVORF9DT0xPUiAyMworI2RlZmluZSBGWERJQl9CTEVORF9MVU1JTk9TSVRZIDI0CisjZGVmaW5lIEZYRElCX0JMRU5EX1VOU1VQUE9SVEVEIC0xCit0eXBlZGVmIEZYX0RXT1JEIEZYX0FSR0I7Cit0eXBlZGVmIEZYX0RXT1JEIEZYX0NPTE9SUkVGOwordHlwZWRlZiBGWF9EV09SRCBGWF9DTVlLOwogY2xhc3MgQ0ZYX0NsaXBSZ247CiBjbGFzcyBDRlhfRElCU291cmNlOwogY2xhc3MgQ0ZYX0RJQml0bWFwOwotI2RlZmluZSBGWFNZU19SR0IociwgZywgYikgICgocikgfCAoKGcpIDw8IDgpIHwgKChiKSA8PCAxNikpCi0jZGVmaW5lIEZYU1lTX0dldFJWYWx1ZShyZ2IpICgocmdiKSAmIDB4ZmYpCisjZGVmaW5lIEZYU1lTX1JHQihyLCBnLCBiKSAoKHIpIHwgKChnKSA8PCA4KSB8ICgoYikgPDwgMTYpKQorI2RlZmluZSBGWFNZU19HZXRSVmFsdWUocmdiKSAoKHJnYikmMHhmZikKICNkZWZpbmUgRlhTWVNfR2V0R1ZhbHVlKHJnYikgKCgocmdiKSA+PiA4KSAmIDB4ZmYpCiAjZGVmaW5lIEZYU1lTX0dldEJWYWx1ZShyZ2IpICgoKHJnYikgPj4gMTYpICYgMHhmZikKLSNkZWZpbmUgRlhfQ0NPTE9SKHZhbCkgKDI1NS0odmFsKSkKKyNkZWZpbmUgRlhfQ0NPTE9SKHZhbCkgKDI1NSAtICh2YWwpKQogI2RlZmluZSBGWFNZU19DTVlLKGMsIG0sIHksIGspICgoKGMpIDw8IDI0KSB8ICgobSkgPDwgMTYpIHwgKCh5KSA8PCA4KSB8IChrKSkKICNkZWZpbmUgRlhTWVNfR2V0Q1ZhbHVlKGNteWspICgodWludDhfdCkoKGNteWspID4+IDI0KSAmIDB4ZmYpCiAjZGVmaW5lIEZYU1lTX0dldE1WYWx1ZShjbXlrKSAoKHVpbnQ4X3QpKChjbXlrKSA+PiAxNikgJiAweGZmKQogI2RlZmluZSBGWFNZU19HZXRZVmFsdWUoY215aykgKCh1aW50OF90KSgoY215aykgPj4gOCkgJiAweGZmKQotI2RlZmluZSBGWFNZU19HZXRLVmFsdWUoY215aykgKCh1aW50OF90KShjbXlrKSAmIDB4ZmYpCisjZGVmaW5lIEZYU1lTX0dldEtWYWx1ZShjbXlrKSAoKHVpbnQ4X3QpKGNteWspJjB4ZmYpCiB2b2lkIENteWtEZWNvZGUoRlhfQ01ZSyBjbXlrLCBpbnQmIGMsIGludCYgbSwgaW50JiB5LCBpbnQmIGspOwotaW5saW5lIEZYX0NNWUsgQ215a0VuY29kZShpbnQgYywgaW50IG0sIGludCB5LCBpbnQgaykKLXsKLSAgICByZXR1cm4gKGMgPDwgMjQpIHwgKG0gPDwgMTYpIHwgKHkgPDwgOCkgfCBrOworaW5saW5lIEZYX0NNWUsgQ215a0VuY29kZShpbnQgYywgaW50IG0sIGludCB5LCBpbnQgaykgeworICByZXR1cm4gKGMgPDwgMjQpIHwgKG0gPDwgMTYpIHwgKHkgPDwgOCkgfCBrOwogfQotdm9pZCBBcmdiRGVjb2RlKEZYX0FSR0IgYXJnYiwgaW50JiBhLCBpbnQmIHIsIGludCZnLCBpbnQmIGIpOwordm9pZCBBcmdiRGVjb2RlKEZYX0FSR0IgYXJnYiwgaW50JiBhLCBpbnQmIHIsIGludCYgZywgaW50JiBiKTsKIHZvaWQgQXJnYkRlY29kZShGWF9BUkdCIGFyZ2IsIGludCYgYSwgRlhfQ09MT1JSRUYmIHJnYik7Ci1pbmxpbmUgRlhfQVJHQiBBcmdiRW5jb2RlKGludCBhLCBpbnQgciwgaW50IGcsIGludCBiKQotewotICAgIHJldHVybiAoYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7CitpbmxpbmUgRlhfQVJHQiBBcmdiRW5jb2RlKGludCBhLCBpbnQgciwgaW50IGcsIGludCBiKSB7CisgIHJldHVybiAoYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7CiB9CiBGWF9BUkdCIEFyZ2JFbmNvZGUoaW50IGEsIEZYX0NPTE9SUkVGIHJnYik7CiAjZGVmaW5lIEZYQVJHQl9BKGFyZ2IpICgodWludDhfdCkoKGFyZ2IpID4+IDI0KSkKICNkZWZpbmUgRlhBUkdCX1IoYXJnYikgKCh1aW50OF90KSgoYXJnYikgPj4gMTYpKQogI2RlZmluZSBGWEFSR0JfRyhhcmdiKSAoKHVpbnQ4X3QpKChhcmdiKSA+PiA4KSkKICNkZWZpbmUgRlhBUkdCX0IoYXJnYikgKCh1aW50OF90KShhcmdiKSkKLSNkZWZpbmUgRlhBUkdCX01BS0UoYSxyLGcsYikgKCgoRlhfRFdPUkQpKGEpIDw8IDI0KSB8ICgocikgPDwgMTYpIHwgKChnKSA8PCA4KSB8IChiKSkKLSNkZWZpbmUgRlhBUkdCX01VTF9BTFBIQShhcmdiLCBhbHBoYSkgKCgoKChhcmdiKSA+PiAyNCkgKiAoYWxwaGEpIC8gMjU1KSA8PCAyNCkgfCAoKGFyZ2IpICYgMHhmZmZmZmYpKQotI2RlZmluZSBGWFJHQjJHUkFZKHIsZyxiKSAoKChiKSAqIDExICsgKGcpICogNTkgKyAocikgKiAzMCkgLyAxMDApCi0jZGVmaW5lIEZYQ01ZSzJHUkFZKGMsbSx5LGspICgoKDI1NS0oYykpICogKDI1NS0oaykpICogMzAgKyAoMjU1LShtKSkgKiAoMjU1LShrKSkgKiA1OSArICgyNTUtKHkpKSAqICgyNTUtKGspKSAqIDExKSAvIDI1NTAwKQotI2RlZmluZSBGWERJQl9BTFBIQV9NRVJHRShiYWNrZHJvcCwgc291cmNlLCBzb3VyY2VfYWxwaGEpICgoKGJhY2tkcm9wKSAqICgyNTUtKHNvdXJjZV9hbHBoYSkpICsgKHNvdXJjZSkqKHNvdXJjZV9hbHBoYSkpLzI1NSkKLSNkZWZpbmUgRlhESUJfQUxQSEFfVU5JT04oZGVzdCwgc3JjKSAoKGRlc3QpICsgKHNyYykgLSAoZGVzdCkqKHNyYykvMjU1KQotI2RlZmluZSBGWENNWUtfR0VURElCKHApICgoKCh1aW50OF90KikocCkpWzBdIDw8IDI0IHwgKCgodWludDhfdCopKHApKVsxXSA8PCAxNikgfCAoKCh1aW50OF90KikocCkpWzJdIDw8IDgpIHwgKCh1aW50OF90KikocCkpWzNdKSkKKyNkZWZpbmUgRlhBUkdCX01BS0UoYSwgciwgZywgYikgXAorICAoKChGWF9EV09SRCkoYSkgPDwgMjQpIHwgKChyKSA8PCAxNikgfCAoKGcpIDw8IDgpIHwgKGIpKQorI2RlZmluZSBGWEFSR0JfTVVMX0FMUEhBKGFyZ2IsIGFscGhhKSBcCisgICgoKCgoYXJnYikgPj4gMjQpICogKGFscGhhKSAvIDI1NSkgPDwgMjQpIHwgKChhcmdiKSYweGZmZmZmZikpCisjZGVmaW5lIEZYUkdCMkdSQVkociwgZywgYikgKCgoYikqMTEgKyAoZykqNTkgKyAocikqMzApIC8gMTAwKQorI2RlZmluZSBGWENNWUsyR1JBWShjLCBtLCB5LCBrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoMjU1IC0gKGMpKSAqICgyNTUgLSAoaykpICogMzAgKyAoMjU1IC0gKG0pKSAqICgyNTUgLSAoaykpICogNTkgKyBcCisgICAgKDI1NSAtICh5KSkgKiAoMjU1IC0gKGspKSAqIDExKSAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgMjU1MDApCisjZGVmaW5lIEZYRElCX0FMUEhBX01FUkdFKGJhY2tkcm9wLCBzb3VyY2UsIHNvdXJjZV9hbHBoYSkgXAorICAoKChiYWNrZHJvcCkgKiAoMjU1IC0gKHNvdXJjZV9hbHBoYSkpICsgKHNvdXJjZSkgKiAoc291cmNlX2FscGhhKSkgLyAyNTUpCisjZGVmaW5lIEZYRElCX0FMUEhBX1VOSU9OKGRlc3QsIHNyYykgKChkZXN0KSArIChzcmMpIC0gKGRlc3QpICogKHNyYykgLyAyNTUpCisjZGVmaW5lIEZYQ01ZS19HRVRESUIocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKCh1aW50OF90KikocCkpWzBdIDw8IDI0IHwgKCgodWludDhfdCopKHApKVsxXSA8PCAxNikgfCBcCisgICAgKCgodWludDhfdCopKHApKVsyXSA8PCA4KSB8ICgodWludDhfdCopKHApKVszXSkpCiAjZGVmaW5lIEZYQ01ZS19TRVRESUIocCwgY215aykgICgodWludDhfdCopKHApKVswXSA9ICh1aW50OF90KSgoY215aykgPj4gMjQpLCBcCiAgICAgICAgICgodWludDhfdCopKHApKVsxXSA9ICh1aW50OF90KSgoY215aykgPj4gMTYpLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMl0gPSAodWludDhfdCkoKGNteWspID4+IDgpLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCopKHApKVszXSA9ICh1aW50OF90KShjbXlrKSkKLSNkZWZpbmUgRlhBUkdCX0dFVERJQihwKSAoKCgodWludDhfdCopKHApKVswXSkgfCAoKCh1aW50OF90KikocCkpWzFdIDw8IDgpIHwgKCgodWludDhfdCopKHApKVsyXSA8PCAxNikgfCAoKCh1aW50OF90KikocCkpWzNdIDw8IDI0KSkKLSNkZWZpbmUgRlhBUkdCX1NFVERJQihwLCBhcmdiKSAoKHVpbnQ4X3QqKShwKSlbMF0gPSAodWludDhfdCkoYXJnYiksIFwKLSAgICAgICAgKCh1aW50OF90KikocCkpWzFdID0gKHVpbnQ4X3QpKChhcmdiKSA+PiA4KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KikocCkpWzJdID0gKHVpbnQ4X3QpKChhcmdiKSA+PiAxNiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KikocCkpWzNdID0gKHVpbnQ4X3QpKChhcmdiKSA+PiAyNCkKLSNkZWZpbmUgRlhBUkdCX0NPUFkoZGVzdCwgc3JjKSAqKHVpbnQ4X3QqKShkZXN0KSA9ICoodWludDhfdCopKHNyYyksIFwKLSAgICAgICAgKigodWludDhfdCopKGRlc3QpKzEpID0gKigodWludDhfdCopKHNyYykrMSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKHVpbnQ4X3QqKShkZXN0KSsyKSA9ICooKHVpbnQ4X3QqKShzcmMpKzIpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKHVpbnQ4X3QqKShkZXN0KSszKSA9ICooKHVpbnQ4X3QqKShzcmMpKzMpCi0jZGVmaW5lIEZYQ01ZS19DT1BZKGRlc3QsIHNyYykgICoodWludDhfdCopKGRlc3QpID0gKih1aW50OF90Kikoc3JjKSwgXAotICAgICAgICAqKCh1aW50OF90KikoZGVzdCkrMSkgPSAqKCh1aW50OF90Kikoc3JjKSsxKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigodWludDhfdCopKGRlc3QpKzIpID0gKigodWludDhfdCopKHNyYykrMiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigodWludDhfdCopKGRlc3QpKzMpID0gKigodWludDhfdCopKHNyYykrMykKLSNkZWZpbmUgRlhBUkdCX1NFVFJHQk9SREVSRElCKHAsIGFyZ2IpICgodWludDhfdCopKHApKVszXSA9ICh1aW50OF90KShhcmdiPj4yNCksIFwKLSAgICAgICAgKCh1aW50OF90KikocCkpWzBdID0gKHVpbnQ4X3QpKChhcmdiKSA+PiAxNiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCopKHApKVsxXSA9ICh1aW50OF90KSgoYXJnYikgPj4gOCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KikocCkpWzJdID0gKHVpbnQ4X3QpKGFyZ2IpCi0jZGVmaW5lIEZYQVJHQl9HRVRSR0JPUkRFUkRJQihwKSAoKCh1aW50OF90KikocCkpWzJdKSB8ICgoKHVpbnQ4X3QqKShwKSlbMV0gPDwgOCkgfCAoKCh1aW50OF90KikocCkpWzBdIDw8IDE2KSB8ICgoKHVpbnQ4X3QqKShwKSlbM10gPDwgMjQpCi0jZGVmaW5lIEZYQVJHQl9SR0JPUkRFUkNPUFkoZGVzdCwgc3JjKSAqKCh1aW50OF90KikoZGVzdCkrMykgPSAqKCh1aW50OF90Kikoc3JjKSszKSwgXAotICAgICAgICAqKHVpbnQ4X3QqKShkZXN0KSA9ICooKHVpbnQ4X3QqKShzcmMpKzIpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKHVpbnQ4X3QqKShkZXN0KSsxKSA9ICooKHVpbnQ4X3QqKShzcmMpKzEpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigodWludDhfdCopKGRlc3QpKzIpID0gKigodWludDhfdCopKHNyYykpCisjZGVmaW5lIEZYQVJHQl9HRVRESUIocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKCh1aW50OF90KikocCkpWzBdKSB8ICgoKHVpbnQ4X3QqKShwKSlbMV0gPDwgOCkgfCBcCisgICAoKCh1aW50OF90KikocCkpWzJdIDw8IDE2KSB8ICgoKHVpbnQ4X3QqKShwKSlbM10gPDwgMjQpKQorI2RlZmluZSBGWEFSR0JfU0VURElCKHAsIGFyZ2IpICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQ4X3QqKShwKSlbMF0gPSAodWludDhfdCkoYXJnYiksICAgICAgICAgXAorICAoKHVpbnQ4X3QqKShwKSlbMV0gPSAodWludDhfdCkoKGFyZ2IpID4+IDgpLCAgXAorICAoKHVpbnQ4X3QqKShwKSlbMl0gPSAodWludDhfdCkoKGFyZ2IpID4+IDE2KSwgXAorICAoKHVpbnQ4X3QqKShwKSlbM10gPSAodWludDhfdCkoKGFyZ2IpID4+IDI0KQorI2RlZmluZSBGWEFSR0JfQ09QWShkZXN0LCBzcmMpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKih1aW50OF90KikoZGVzdCkgPSAqKHVpbnQ4X3QqKShzcmMpLCAgICAgICAgICAgICBcCisgICooKHVpbnQ4X3QqKShkZXN0KSArIDEpID0gKigodWludDhfdCopKHNyYykgKyAxKSwgXAorICAqKCh1aW50OF90KikoZGVzdCkgKyAyKSA9ICooKHVpbnQ4X3QqKShzcmMpICsgMiksIFwKKyAgKigodWludDhfdCopKGRlc3QpICsgMykgPSAqKCh1aW50OF90Kikoc3JjKSArIDMpCisjZGVmaW5lIEZYQ01ZS19DT1BZKGRlc3QsIHNyYykgICAgICAgICAgICAgICAgICAgICAgXAorICAqKHVpbnQ4X3QqKShkZXN0KSA9ICoodWludDhfdCopKHNyYyksICAgICAgICAgICAgIFwKKyAgKigodWludDhfdCopKGRlc3QpICsgMSkgPSAqKCh1aW50OF90Kikoc3JjKSArIDEpLCBcCisgICooKHVpbnQ4X3QqKShkZXN0KSArIDIpID0gKigodWludDhfdCopKHNyYykgKyAyKSwgXAorICAqKCh1aW50OF90KikoZGVzdCkgKyAzKSA9ICooKHVpbnQ4X3QqKShzcmMpICsgMykKKyNkZWZpbmUgRlhBUkdCX1NFVFJHQk9SREVSRElCKHAsIGFyZ2IpICAgICAgICAgIFwKKyAgKCh1aW50OF90KikocCkpWzNdID0gKHVpbnQ4X3QpKGFyZ2IgPj4gMjQpLCAgIFwKKyAgKCh1aW50OF90KikocCkpWzBdID0gKHVpbnQ4X3QpKChhcmdiKSA+PiAxNiksIFwKKyAgKCh1aW50OF90KikocCkpWzFdID0gKHVpbnQ4X3QpKChhcmdiKSA+PiA4KSwgIFwKKyAgKCh1aW50OF90KikocCkpWzJdID0gKHVpbnQ4X3QpKGFyZ2IpCisjZGVmaW5lIEZYQVJHQl9HRVRSR0JPUkRFUkRJQihwKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgodWludDhfdCopKHApKVsyXSkgfCAoKCh1aW50OF90KikocCkpWzFdIDw8IDgpIHwgXAorICAgICAgKCgodWludDhfdCopKHApKVswXSA8PCAxNikgfCAoKCh1aW50OF90KikocCkpWzNdIDw8IDI0KQorI2RlZmluZSBGWEFSR0JfUkdCT1JERVJDT1BZKGRlc3QsIHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKigodWludDhfdCopKGRlc3QpICsgMykgPSAqKCh1aW50OF90Kikoc3JjKSArIDMpLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICoodWludDhfdCopKGRlc3QpID0gKigodWludDhfdCopKHNyYykgKyAyKSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAqKCh1aW50OF90KikoZGVzdCkgKyAxKSA9ICooKHVpbnQ4X3QqKShzcmMpICsgMSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgKigodWludDhfdCopKGRlc3QpICsgMikgPSAqKCh1aW50OF90Kikoc3JjKSkKICNkZWZpbmUgRlhBUkdCX1RPRElCKGFyZ2IpIChhcmdiKQotI2RlZmluZSBGWENNWUtfVE9ESUIoY215aykgKCh1aW50OF90KSgoY215aykgPj4gMjQpIHwgKCh1aW50OF90KSgoY215aykgPj4gMTYpKSA8PCA4IHwgKCh1aW50OF90KSgoY215aykgPj4gOCkpIDw8IDE2IHwgKCh1aW50OF90KShjbXlrKSA8PCAyNCkpCi0jZGVmaW5lIEZYQVJHQl9UT0JHUk9SREVSRElCKGFyZ2IpICgodWludDhfdCkoYXJnYj4+MTYpIHwgKCh1aW50OF90KShhcmdiPj44KSkgPDwgOCB8ICgodWludDhfdCkoYXJnYikpIDw8IDE2IHwgKCh1aW50OF90KShhcmdiPj4yNCkgPDwgMjQpKQotI2RlZmluZSBGWEdFVEZMQUdfQ09MT1JUWVBFKGZsYWcpCQkJKHVpbnQ4X3QpKChmbGFnKT4+OCkKLSNkZWZpbmUgRlhHRVRGTEFHX0FMUEhBX0ZJTEwoZmxhZykJCQkodWludDhfdCkoZmxhZykKLSNkZWZpbmUgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShmbGFnKQkJKHVpbnQ4X3QpKChmbGFnKT4+MTYpCi0jZGVmaW5lIEZYU0VURkxBR19DT0xPUlRZUEUoZmxhZywgdmFsKQkJZmxhZyA9ICgoKHZhbCk8PDgpfChmbGFnJjB4ZmZmZjAwZmYpKQotI2RlZmluZSBGWFNFVEZMQUdfQUxQSEFfRklMTChmbGFnLCB2YWwpCQlmbGFnID0gKCh2YWwpfChmbGFnJjB4ZmZmZmZmMDApKQotI2RlZmluZSBGWFNFVEZMQUdfQUxQSEFfU1RST0tFKGZsYWcsIHZhbCkJZmxhZyA9ICgoKHZhbCk8PDE2KXwoZmxhZyYweGZmMDBmZmZmKSkKLWNsYXNzIENGWF9ESUJTb3VyY2UKLXsKLXB1YmxpYzoKKyNkZWZpbmUgRlhDTVlLX1RPRElCKGNteWspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQ4X3QpKChjbXlrKSA+PiAyNCkgfCAoKHVpbnQ4X3QpKChjbXlrKSA+PiAxNikpIDw8IDggfCBcCisgICAoKHVpbnQ4X3QpKChjbXlrKSA+PiA4KSkgPDwgMTYgfCAoKHVpbnQ4X3QpKGNteWspIDw8IDI0KSkKKyNkZWZpbmUgRlhBUkdCX1RPQkdST1JERVJESUIoYXJnYikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50OF90KShhcmdiID4+IDE2KSB8ICgodWludDhfdCkoYXJnYiA+PiA4KSkgPDwgOCB8IFwKKyAgICgodWludDhfdCkoYXJnYikpIDw8IDE2IHwgKCh1aW50OF90KShhcmdiID4+IDI0KSA8PCAyNCkpCisjZGVmaW5lIEZYR0VURkxBR19DT0xPUlRZUEUoZmxhZykgKHVpbnQ4X3QpKChmbGFnKSA+PiA4KQorI2RlZmluZSBGWEdFVEZMQUdfQUxQSEFfRklMTChmbGFnKSAodWludDhfdCkoZmxhZykKKyNkZWZpbmUgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShmbGFnKSAodWludDhfdCkoKGZsYWcpID4+IDE2KQorI2RlZmluZSBGWFNFVEZMQUdfQ09MT1JUWVBFKGZsYWcsIHZhbCkgXAorICBmbGFnID0gKCgodmFsKSA8PCA4KSB8IChmbGFnICYgMHhmZmZmMDBmZikpCisjZGVmaW5lIEZYU0VURkxBR19BTFBIQV9GSUxMKGZsYWcsIHZhbCkgZmxhZyA9ICgodmFsKSB8IChmbGFnICYgMHhmZmZmZmYwMCkpCisjZGVmaW5lIEZYU0VURkxBR19BTFBIQV9TVFJPS0UoZmxhZywgdmFsKSBcCisgIGZsYWcgPSAoKCh2YWwpIDw8IDE2KSB8IChmbGFnICYgMHhmZjAwZmZmZikpCitjbGFzcyBDRlhfRElCU291cmNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNGWF9ESUJTb3VyY2UoKTsKIAotICAgIHZpcnR1YWwJCQl+Q0ZYX0RJQlNvdXJjZSgpOworICBpbnQgR2V0V2lkdGgoKSBjb25zdCB7IHJldHVybiBtX1dpZHRoOyB9CiAKKyAgaW50IEdldEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fSGVpZ2h0OyB9CiAKKyAgRlhESUJfRm9ybWF0IEdldEZvcm1hdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKEZYRElCX0Zvcm1hdCkobV9BbHBoYUZsYWcgKiAweDEwMCArIG1fYnBwKTsKKyAgfQogCi0gICAgaW50CQkJCUdldFdpZHRoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1dpZHRoOwotICAgIH0KKyAgRlhfRFdPUkQgR2V0UGl0Y2goKSBjb25zdCB7IHJldHVybiBtX1BpdGNoOyB9CiAKLSAgICBpbnQJCQkJR2V0SGVpZ2h0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0hlaWdodDsKLSAgICB9CisgIEZYX0RXT1JEKiBHZXRQYWxldHRlKCkgY29uc3QgeyByZXR1cm4gbV9wUGFsZXR0ZTsgfQogCi0gICAgRlhESUJfRm9ybWF0CUdldEZvcm1hdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKEZYRElCX0Zvcm1hdCkobV9BbHBoYUZsYWcgKiAweDEwMCArIG1fYnBwKTsKLSAgICB9CisgIHZpcnR1YWwgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQogCi0gICAgRlhfRFdPUkQJCUdldFBpdGNoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1BpdGNoOwotICAgIH0KKyAgdmlydHVhbCBjb25zdCB1aW50OF90KiBHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3QgPSAwOwogCi0gICAgRlhfRFdPUkQqCQlHZXRQYWxldHRlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYWxldHRlOwotICAgIH0KKyAgdmlydHVhbCBGWF9CT09MIFNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgY29uc3QgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCisgIHZpcnR1YWwgdm9pZCBEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdCA9IDA7CiAKKyAgdmlydHVhbCB2b2lkIFNldERvd25TYW1wbGVTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgY29uc3Qge30KIAotICAgIHZpcnR1YWwJdWludDhfdCoJR2V0QnVmZmVyKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgaW50IEdldEJQUCgpIGNvbnN0IHsgcmV0dXJuIG1fYnBwOyB9CiAKLSAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqCUdldFNjYW5saW5lKGludCBsaW5lKSBjb25zdCA9IDA7CisgIEZYX0JPT0wgSXNBbHBoYU1hc2soKSBjb25zdCB7IHJldHVybiBtX0FscGhhRmxhZyA9PSAxOyB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIEZYX0JPT0wgSGFzQWxwaGEoKSBjb25zdCB7IHJldHVybiBtX0FscGhhRmxhZyAmIDIgPyBUUlVFIDogRkFMU0U7IH0KIAotICAgIHZpcnR1YWwgdm9pZAkJRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdCA9IDA7CisgIEZYX0JPT0wgSXNPcGFxdWVJbWFnZSgpIGNvbnN0IHsgcmV0dXJuICEobV9BbHBoYUZsYWcgJiAzKTsgfQogCi0gICAgdmlydHVhbCB2b2lkCQlTZXREb3duU2FtcGxlU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIGNvbnN0IHt9CisgIEZYX0JPT0wgSXNDbXlrSW1hZ2UoKSBjb25zdCB7IHJldHVybiBtX0FscGhhRmxhZyAmIDQgPyBUUlVFIDogRkFMU0U7IH0KIAotICAgIGludAkJCQlHZXRCUFAoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYnBwOwotICAgIH0KKyAgaW50IEdldFBhbGV0dGVTaXplKCkgY29uc3QgeworICAgIHJldHVybiBJc0FscGhhTWFzaygpID8gMCA6IChtX2JwcCA9PSAxID8gMiA6IChtX2JwcCA9PSA4ID8gMjU2IDogMCkpOworICB9CiAKLSAgICBGWF9CT09MCQkJSXNBbHBoYU1hc2soKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQWxwaGFGbGFnID09IDE7Ci0gICAgfQorICBGWF9EV09SRCBHZXRQYWxldHRlRW50cnkoaW50IGluZGV4KSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQlIYXNBbHBoYSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9BbHBoYUZsYWcgJiAyID8gVFJVRSA6IEZBTFNFOwotICAgIH0KKyAgdm9pZCBTZXRQYWxldHRlRW50cnkoaW50IGluZGV4LCBGWF9EV09SRCBjb2xvcik7CisgIEZYX0RXT1JEIEdldFBhbGV0dGVBcmdiKGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gR2V0UGFsZXR0ZUVudHJ5KGluZGV4KTsgfQorICB2b2lkIFNldFBhbGV0dGVBcmdiKGludCBpbmRleCwgRlhfRFdPUkQgY29sb3IpIHsKKyAgICBTZXRQYWxldHRlRW50cnkoaW5kZXgsIGNvbG9yKTsKKyAgfQogCi0gICAgRlhfQk9PTAkJCUlzT3BhcXVlSW1hZ2UoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuICEobV9BbHBoYUZsYWcgJiAzKTsKLSAgICB9CisgIHZvaWQgQ29weVBhbGV0dGUoY29uc3QgRlhfRFdPUkQqIHBTcmNQYWwsIEZYX0RXT1JEIHNpemUgPSAyNTYpOwogCi0gICAgRlhfQk9PTAkJCUlzQ215a0ltYWdlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0FscGhhRmxhZyAmIDQgPyBUUlVFIDogRkFMU0U7Ci0gICAgfQorICBDRlhfRElCaXRtYXAqIENsb25lKGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCkgY29uc3Q7CiAKKyAgQ0ZYX0RJQml0bWFwKiBDbG9uZUNvbnZlcnQoRlhESUJfRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkgY29uc3Q7CiAKKyAgQ0ZYX0RJQml0bWFwKiBTdHJldGNoVG8oaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpIGNvbnN0OwogCi0gICAgaW50CQkJCUdldFBhbGV0dGVTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBJc0FscGhhTWFzaygpID8gMCA6IChtX2JwcCA9PSAxID8gMiA6IChtX2JwcCA9PSA4ID8gMjU2IDogMCkpOwotICAgIH0KKyAgQ0ZYX0RJQml0bWFwKiBUcmFuc2Zvcm1Ubyhjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKSBjb25zdDsKIAotICAgIEZYX0RXT1JECQlHZXRQYWxldHRlRW50cnkoaW50IGluZGV4KSBjb25zdDsKKyAgQ0ZYX0RJQml0bWFwKiBHZXRBbHBoYU1hc2soY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKSBjb25zdDsKIAotICAgIHZvaWQJCQlTZXRQYWxldHRlRW50cnkoaW50IGluZGV4LCBGWF9EV09SRCBjb2xvcik7Ci0gICAgRlhfRFdPUkQJCUdldFBhbGV0dGVBcmdiKGludCBpbmRleCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRQYWxldHRlRW50cnkoaW5kZXgpOwotICAgIH0KLSAgICB2b2lkCQkJU2V0UGFsZXR0ZUFyZ2IoaW50IGluZGV4LCBGWF9EV09SRCBjb2xvcikKLSAgICB7Ci0gICAgICAgIFNldFBhbGV0dGVFbnRyeShpbmRleCwgY29sb3IpOwotICAgIH0KKyAgRlhfQk9PTCBDb3B5QWxwaGFNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBBbHBoYU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpOwogCi0gICAgdm9pZAkJCUNvcHlQYWxldHRlKGNvbnN0IEZYX0RXT1JEKiBwU3JjUGFsLCBGWF9EV09SRCBzaXplID0gMjU2KTsKKyAgQ0ZYX0RJQml0bWFwKiBTd2FwWFkoRlhfQk9PTCBiWEZsaXAsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYllGbGlwLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpIGNvbnN0OwogCisgIENGWF9ESUJpdG1hcCogRmxpcEltYWdlKEZYX0JPT0wgYlhGbGlwLCBGWF9CT09MIGJZRmxpcCkgY29uc3Q7CiAKLSAgICBDRlhfRElCaXRtYXAqCUNsb25lKGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCkgY29uc3Q7CisgIHZvaWQgR2V0T3ZlcmxhcFJlY3QoaW50JiBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50JiBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIGludCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50JiBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQmIHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduKTsKIAotICAgIENGWF9ESUJpdG1hcCoJQ2xvbmVDb252ZXJ0KEZYRElCX0Zvcm1hdCBmb3JtYXQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpIGNvbnN0OworICBDRlhfRElCaXRtYXAqIG1fcEFscGhhTWFzazsKIAotICAgIENGWF9ESUJpdG1hcCoJU3RyZXRjaFRvKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGZsYWdzID0gMCwgY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKSBjb25zdDsKKyBwcm90ZWN0ZWQ6CisgIENGWF9ESUJTb3VyY2UoKTsKIAorICBpbnQgbV9XaWR0aDsKIAotICAgIENGWF9ESUJpdG1hcCoJVHJhbnNmb3JtVG8oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgaW50JiBsZWZ0LCBpbnQgJnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MgPSAwLCBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpIGNvbnN0OworICBpbnQgbV9IZWlnaHQ7CiAKLSAgICBDRlhfRElCaXRtYXAqCUdldEFscGhhTWFzayhjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpIGNvbnN0OworICBpbnQgbV9icHA7CiAKLSAgICBGWF9CT09MCQkJQ29weUFscGhhTWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrLCBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpOworICBGWF9EV09SRCBtX0FscGhhRmxhZzsKIAotICAgIENGWF9ESUJpdG1hcCoJU3dhcFhZKEZYX0JPT0wgYlhGbGlwLCBGWF9CT09MIGJZRmxpcCwgY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKSBjb25zdDsKKyAgRlhfRFdPUkQgbV9QaXRjaDsKIAotICAgIENGWF9ESUJpdG1hcCoJRmxpcEltYWdlKEZYX0JPT0wgYlhGbGlwLCBGWF9CT09MIGJZRmxpcCkgY29uc3Q7CisgIEZYX0RXT1JEKiBtX3BQYWxldHRlOwogCi0gICAgdm9pZAkJCUdldE92ZXJsYXBSZWN0KGludCYgZGVzdF9sZWZ0LCBpbnQmIGRlc3RfdG9wLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwgaW50IHNyY193aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19oZWlnaHQsIGludCYgc3JjX2xlZnQsIGludCYgc3JjX3RvcCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduKTsKKyAgdm9pZCBCdWlsZFBhbGV0dGUoKTsKIAotICAgIENGWF9ESUJpdG1hcCoJbV9wQWxwaGFNYXNrOwotcHJvdGVjdGVkOgorICBGWF9CT09MIEJ1aWxkQWxwaGFNYXNrKCk7CiAKLSAgICBDRlhfRElCU291cmNlKCk7CisgIGludCBGaW5kUGFsZXR0ZShGWF9EV09SRCBjb2xvcikgY29uc3Q7CiAKLSAgICBpbnQJCQkJbV9XaWR0aDsKLQotICAgIGludAkJCQltX0hlaWdodDsKLQotICAgIGludAkJCQltX2JwcDsKLQotICAgIEZYX0RXT1JECQltX0FscGhhRmxhZzsKLQotICAgIEZYX0RXT1JECQltX1BpdGNoOwotCi0gICAgRlhfRFdPUkQqCQltX3BQYWxldHRlOwotCi0gICAgdm9pZAkJCUJ1aWxkUGFsZXR0ZSgpOwotCi0gICAgRlhfQk9PTAkJCUJ1aWxkQWxwaGFNYXNrKCk7Ci0KLSAgICBpbnQJCQkJRmluZFBhbGV0dGUoRlhfRFdPUkQgY29sb3IpIGNvbnN0OwotCi0gICAgdm9pZAkJCUdldFBhbGV0dGUoRlhfRFdPUkQqIHBhbCwgaW50IGFscGhhKSBjb25zdDsKKyAgdm9pZCBHZXRQYWxldHRlKEZYX0RXT1JEKiBwYWwsIGludCBhbHBoYSkgY29uc3Q7CiB9OwotY2xhc3MgQ0ZYX0RJQml0bWFwIDogcHVibGljIENGWF9ESUJTb3VyY2UKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9ESUJpdG1hcCA6IHB1YmxpYyBDRlhfRElCU291cmNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNGWF9ESUJpdG1hcCgpOwogCi0gICAgdmlydHVhbCB+Q0ZYX0RJQml0bWFwKCk7CisgIENGWF9ESUJpdG1hcCgpOwogCi0gICAgQ0ZYX0RJQml0bWFwKCk7CisgIENGWF9ESUJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAmIHNyYyk7CiAKLSAgICBDRlhfRElCaXRtYXAoY29uc3QgQ0ZYX0RJQml0bWFwJiBzcmMpOworICBGWF9CT09MIENyZWF0ZShpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBCdWZmZXIgPSBOVUxMLAorICAgICAgICAgICAgICAgICBpbnQgcGl0Y2ggPSAwKTsKIAotICAgIEZYX0JPT0wJCQlDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCB1aW50OF90KiBwQnVmZmVyID0gTlVMTCwgaW50IHBpdGNoID0gMCk7CisgIEZYX0JPT0wgQ29weShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKTsKIAotICAgIEZYX0JPT0wJCQlDb3B5KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpOworICB2aXJ0dWFsIHVpbnQ4X3QqIEdldEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1fcEJ1ZmZlcjsgfQogCi0gICAgdmlydHVhbAl1aW50OF90KglHZXRCdWZmZXIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEJ1ZmZlcjsKLSAgICB9CisgIHZpcnR1YWwgY29uc3QgdWludDhfdCogR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wQnVmZmVyID8gbV9wQnVmZmVyICsgbGluZSAqIG1fUGl0Y2ggOiBOVUxMOworICB9CiAKLSAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqCUdldFNjYW5saW5lKGludCBsaW5lKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEJ1ZmZlciA/IG1fcEJ1ZmZlciArIGxpbmUgKiBtX1BpdGNoIDogTlVMTDsKLSAgICB9CisgIHZpcnR1YWwgdm9pZCBEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdDsKIAotICAgIHZpcnR1YWwgdm9pZAlEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIHVpbnQ4X3QqIGRlc3Rfc2NhbiwgaW50IGRlc3RfYnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIEZYX0JPT0wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3Q7CisgIHZvaWQgVGFrZU92ZXIoQ0ZYX0RJQml0bWFwKiBwU3JjQml0bWFwKTsKIAotICAgIHZvaWQJCQlUYWtlT3ZlcihDRlhfRElCaXRtYXAqIHBTcmNCaXRtYXApOworICBGWF9CT09MIENvbnZlcnRGb3JtYXQoRlhESUJfRm9ybWF0IGZvcm1hdCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCUNvbnZlcnRGb3JtYXQoRlhESUJfRm9ybWF0IGZvcm1hdCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICB2b2lkIENsZWFyKEZYX0RXT1JEIGNvbG9yKTsKIAotICAgIHZvaWQJCQlDbGVhcihGWF9EV09SRCBjb2xvcik7CisgIEZYX0RXT1JEIEdldFBpeGVsKGludCB4LCBpbnQgeSkgY29uc3Q7CiAKLSAgICBGWF9EV09SRAkJR2V0UGl4ZWwoaW50IHgsIGludCB5KSBjb25zdDsKKyAgdm9pZCBTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yKTsKIAotICAgIHZvaWQJCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yKTsKKyAgRlhfQk9PTCBMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQ2hhbm5lbCBzcmNDaGFubmVsKTsKIAotICAgIEZYX0JPT0wJCQlMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBGWERJQl9DaGFubmVsIHNyY0NoYW5uZWwpOworICBGWF9CT09MIExvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSk7CiAKLSAgICBGWF9CT09MCQkJTG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwgaW50IHZhbHVlKTsKKyAgRlhfQk9PTCBNdWx0aXBseUFscGhhKGludCBhbHBoYSk7CiAKLSAgICBGWF9CT09MCQkJTXVsdGlwbHlBbHBoYShpbnQgYWxwaGEpOworICBGWF9CT09MIE11bHRpcGx5QWxwaGEoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzayk7CiAKLSAgICBGWF9CT09MCQkJTXVsdGlwbHlBbHBoYShjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrKTsKKyAgRlhfQk9PTCBUcmFuc2ZlckJpdG1hcChpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJVHJhbnNmZXJCaXRtYXAoaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBDb21wb3NpdGVCaXRtYXAoaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCUNvbXBvc2l0ZUJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduID0gTlVMTCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBUcmFuc2Zlck1hc2soaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJVHJhbnNmZXJNYXNrKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssIEZYX0RXT1JEIGNvbG9yLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBDb21wb3NpdGVNYXNrKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJQ29tcG9zaXRlTWFzayhpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwTWFzaywgRlhfRFdPUkQgY29sb3IsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiA9IE5VTEwsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBDb21wb3NpdGVSZWN0KGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJQ29tcG9zaXRlUmVjdChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICBGWF9CT09MIENvbnZlcnRDb2xvclNjYWxlKEZYX0RXT1JEIGZvcmVjb2xvciwgRlhfRFdPUkQgYmFja2NvbG9yKTsKIAotICAgIEZYX0JPT0wJCQlDb252ZXJ0Q29sb3JTY2FsZShGWF9EV09SRCBmb3JlY29sb3IsIEZYX0RXT1JEIGJhY2tjb2xvcik7CisgIEZYX0JPT0wgRGl0aGVyRlMoY29uc3QgRlhfRFdPUkQqIHBQYWxldHRlLAorICAgICAgICAgICAgICAgICAgIGludCBwYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwUmVjdCA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCURpdGhlckZTKGNvbnN0IEZYX0RXT1JEKiBwUGFsZXR0ZSwgaW50IHBhbF9zaXplLCBjb25zdCBGWF9SRUNUKiBwUmVjdCA9IE5VTEwpOwotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgdWludDhfdCogbV9wQnVmZmVyOwogCi0gICAgdWludDhfdCoJCW1fcEJ1ZmZlcjsKKyAgRlhfQk9PTCBtX2JFeHRCdWY7CiAKLSAgICBGWF9CT09MCQkJbV9iRXh0QnVmOwotCi0gICAgRlhfQk9PTAkJCUdldEdyYXlEYXRhKHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBHZXRHcmF5RGF0YSh2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiB9OwotY2xhc3MgQ0ZYX0RJQkV4dHJhY3RvcgotewotcHVibGljOgorY2xhc3MgQ0ZYX0RJQkV4dHJhY3RvciB7CisgcHVibGljOgorICBDRlhfRElCRXh0cmFjdG9yKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpOwogCi0gICAgQ0ZYX0RJQkV4dHJhY3Rvcihjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKTsKKyAgfkNGWF9ESUJFeHRyYWN0b3IoKTsKIAotICAgIH5DRlhfRElCRXh0cmFjdG9yKCk7CisgIG9wZXJhdG9yIENGWF9ESUJpdG1hcCooKSB7IHJldHVybiBtX3BCaXRtYXA7IH0KIAotICAgIG9wZXJhdG9yIENGWF9ESUJpdG1hcCooKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEJpdG1hcDsKLSAgICB9Ci1wcml2YXRlOgotCi0gICAgQ0ZYX0RJQml0bWFwKgkJCW1fcEJpdG1hcDsKKyBwcml2YXRlOgorICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKIH07CiB0eXBlZGVmIENGWF9Db3VudFJlZjxDRlhfRElCaXRtYXA+IENGWF9ESUJpdG1hcFJlZjsKLWNsYXNzIENGWF9GaWx0ZXJlZERJQiA6IHB1YmxpYyBDRlhfRElCU291cmNlCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfRmlsdGVyZWRESUIgOiBwdWJsaWMgQ0ZYX0RJQlNvdXJjZSB7CisgcHVibGljOgorICBDRlhfRmlsdGVyZWRESUIoKTsKIAotICAgIENGWF9GaWx0ZXJlZERJQigpOworICB+Q0ZYX0ZpbHRlcmVkRElCKCk7CiAKLSAgICB+Q0ZYX0ZpbHRlcmVkRElCKCk7CisgIHZvaWQgTG9hZFNyYyhjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBGWF9CT09MIGJBdXRvRHJvcFNyYyA9IEZBTFNFKTsKIAotICAgIHZvaWQJCQkJCUxvYWRTcmMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgRlhfQk9PTCBiQXV0b0Ryb3BTcmMgPSBGQUxTRSk7CisgIHZpcnR1YWwgRlhESUJfRm9ybWF0IEdldERlc3RGb3JtYXQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYRElCX0Zvcm1hdAlHZXREZXN0Rm9ybWF0KCkgPSAwOworICB2aXJ0dWFsIEZYX0RXT1JEKiBHZXREZXN0UGFsZXR0ZSgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfRFdPUkQqCQlHZXREZXN0UGFsZXR0ZSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFRyYW5zbGF0ZVNjYW5saW5lKHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZikgY29uc3QgPSAwOwogCisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVEb3duU2FtcGxlcyh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJVHJhbnNsYXRlU2NhbmxpbmUodWludDhfdCogZGVzdF9idWYsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYpIGNvbnN0ID0gMDsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgY29uc3QgdWludDhfdCogR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9icHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF93aWR0aCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlUcmFuc2xhdGVEb3duU2FtcGxlcyh1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHBpeGVscywgaW50IEJwcCkgY29uc3QgPSAwOwotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCoJCUdldFNjYW5saW5lKGludCBsaW5lKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQJCQlEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIHVpbnQ4X3QqIGRlc3Rfc2NhbiwgaW50IGRlc3RfYnBwLAotICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIEZYX0JPT0wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3Q7CisgIGNvbnN0IENGWF9ESUJTb3VyY2UqIG1fcFNyYzsKIAotICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqCW1fcFNyYzsKKyAgRlhfQk9PTCBtX2JBdXRvRHJvcFNyYzsKIAotICAgIEZYX0JPT0wJCQkJCW1fYkF1dG9Ecm9wU3JjOwotCi0gICAgdWludDhfdCoJCQkJbV9wU2NhbmxpbmU7CisgIHVpbnQ4X3QqIG1fcFNjYW5saW5lOwogfTsKLWNsYXNzIElGWF9TY2FubGluZUNvbXBvc2VyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYX1NjYW5saW5lQ29tcG9zZXIoKSB7IH0KK2NsYXNzIElGWF9TY2FubGluZUNvbXBvc2VyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGWF9TY2FubGluZUNvbXBvc2VyKCkge30KIAotICAgIHZpcnR1YWwJdm9pZAkJQ29tcG9zZVNjYW5saW5lKGludCBsaW5lLCBjb25zdCB1aW50OF90KiBzY2FubGluZSwgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSA9IE5VTEwpID0gMDsKKyAgdmlydHVhbCB2b2lkIENvbXBvc2VTY2FubGluZShpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhID0gTlVMTCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRJbmZvKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgU2V0SW5mbyhpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFNyY1BhbGV0dGUpID0gMDsKIH07Ci1jbGFzcyBDRlhfU2NhbmxpbmVDb21wb3NpdG9yCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpOworY2xhc3MgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvciB7CisgcHVibGljOgorICBDRlhfU2NhbmxpbmVDb21wb3NpdG9yKCk7CiAKLSAgICB+Q0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpOworICB+Q0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpOwogCi0gICAgRlhfQk9PTAkJCQlJbml0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIGludDMyX3Qgd2lkdGgsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgaW50IGJsZW5kX3R5cGUsIEZYX0JPT0wgYkNsaXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBJbml0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAorICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKKyAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsCisgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYkNsaXAsCisgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwKKyAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAorICB2b2lkIENvbXBvc2l0ZVJnYkJpdG1hcExpbmUodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhID0gTlVMTCk7CiAKLSAgICB2b2lkCQkJCUNvbXBvc2l0ZVJnYkJpdG1hcExpbmUodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEgPSBOVUxMLCB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEgPSBOVUxMKTsKKyAgdm9pZCBDb21wb3NpdGVQYWxCaXRtYXBMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSA9IE5VTEwpOwogCisgIHZvaWQgQ29tcG9zaXRlQnl0ZU1hc2tMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEgPSBOVUxMKTsKIAotICAgIHZvaWQJCQkJQ29tcG9zaXRlUGFsQml0bWFwTGluZSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgc3JjX2xlZnQsIGludCB3aWR0aCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhID0gTlVMTCwgdWludDhfdCogZHN0X2V4dHJhX2FscGhhID0gTlVMTCk7CisgIHZvaWQgQ29tcG9zaXRlQml0TWFza0xpbmUodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSA9IE5VTEwpOwogCisgcHJvdGVjdGVkOgorICBpbnQgbV9UcmFuc3BhcmVuY3k7CisgIEZYRElCX0Zvcm1hdCBtX1NyY0Zvcm1hdCwgbV9EZXN0Rm9ybWF0OworICBGWF9EV09SRCogbV9wU3JjUGFsZXR0ZTsKIAotICAgIHZvaWQJCQkJQ29tcG9zaXRlQnl0ZU1hc2tMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhID0gTlVMTCk7Ci0KLQotICAgIHZvaWQJCQkJQ29tcG9zaXRlQml0TWFza0xpbmUodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHNyY19sZWZ0LCBpbnQgd2lkdGgsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSA9IE5VTEwpOwotcHJvdGVjdGVkOgotICAgIGludAkJCQkJbV9UcmFuc3BhcmVuY3k7Ci0gICAgRlhESUJfRm9ybWF0CQltX1NyY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fRGVzdEZvcm1hdDsKLSAgICBGWF9EV09SRCoJCQltX3BTcmNQYWxldHRlOwotCi0gICAgaW50CQkJCQltX01hc2tBbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFza1JlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFza0dyZWVuLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXNrQmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFza0JsYWNrOwotICAgIGludAkJCQkJbV9CbGVuZFR5cGU7Ci0gICAgdm9pZCoJCQkJbV9wSWNjVHJhbnNmb3JtOwotICAgIHVpbnQ4X3QqCQkJbV9wQ2FjaGVTY2FubGluZTsKLSAgICBpbnQJCQkJCW1fQ2FjaGVTaXplOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgbV9iUmdiQnl0ZU9yZGVyOworICBpbnQgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsIG1fTWFza0JsYWNrOworICBpbnQgbV9CbGVuZFR5cGU7CisgIHZvaWQqIG1fcEljY1RyYW5zZm9ybTsKKyAgdWludDhfdCogbV9wQ2FjaGVTY2FubGluZTsKKyAgaW50IG1fQ2FjaGVTaXplOworICBGWF9CT09MIG1fYlJnYkJ5dGVPcmRlcjsKIH07Ci1jbGFzcyBDRlhfQml0bWFwQ29tcG9zZXIgOiBwdWJsaWMgSUZYX1NjYW5saW5lQ29tcG9zZXIKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9CaXRtYXBDb21wb3NlciA6IHB1YmxpYyBJRlhfU2NhbmxpbmVDb21wb3NlciB7CisgcHVibGljOgorICBDRlhfQml0bWFwQ29tcG9zZXIoKTsKIAotICAgIENGWF9CaXRtYXBDb21wb3NlcigpOworICB+Q0ZYX0JpdG1hcENvbXBvc2VyKCk7CiAKLSAgICB+Q0ZYX0JpdG1hcENvbXBvc2VyKCk7CisgIHZvaWQgQ29tcG9zZShDRlhfRElCaXRtYXAqIHBEZXN0LAorICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAorICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsCisgICAgICAgICAgICAgICBGWF9SRUNUJiBkZXN0X3JlY3QsCisgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJ0aWNhbCwKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFksCisgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwKKyAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRJbmZvKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSk7CiAKLSAgICB2b2lkCQkJCUNvbXBvc2UoQ0ZYX0RJQml0bWFwKiBwRGVzdCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBGWF9SRUNUJiBkZXN0X3JlY3QsIEZYX0JPT0wgYlZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwgRlhfQk9PTCBiRmxpcFksIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CisgIHZpcnR1YWwgdm9pZCBDb21wb3NlU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2NhbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKTsKLQotCi0gICAgdmlydHVhbAl2b2lkCQlDb21wb3NlU2NhbmxpbmUoaW50IGxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLCBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhKTsKLXByb3RlY3RlZDoKLQotICAgIHZvaWQJCQkJRG9Db21wb3NlKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBkZXN0X3dpZHRoLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhID0gTlVMTCwgdWludDhfdCogZHN0X2V4dHJhX2FscGhhID0gTlVMTCk7Ci0gICAgQ0ZYX0RJQml0bWFwKgkJbV9wQml0bWFwOwotICAgIGNvbnN0IENGWF9DbGlwUmduKgltX3BDbGlwUmduOwotICAgIEZYRElCX0Zvcm1hdAkJbV9TcmNGb3JtYXQ7Ci0gICAgaW50CQkJCQltX0Rlc3RMZWZ0LCBtX0Rlc3RUb3AsIG1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQsIG1fQml0bWFwQWxwaGE7Ci0gICAgRlhfRFdPUkQJCQltX01hc2tDb2xvcjsKLSAgICBjb25zdCBDRlhfRElCaXRtYXAqCW1fcENsaXBNYXNrOwotICAgIENGWF9TY2FubGluZUNvbXBvc2l0b3IJbV9Db21wb3NpdG9yOwotICAgIEZYX0JPT0wJCQkJbV9iVmVydGljYWwsIG1fYkZsaXBYLCBtX2JGbGlwWTsKLSAgICBpbnQJCQkJCW1fQWxwaGFGbGFnOwotICAgIHZvaWQqCQkJCW1fcEljY1RyYW5zZm9ybTsKLSAgICBGWF9CT09MICAgICAgICAgICAgIG1fYlJnYkJ5dGVPcmRlcjsKLSAgICBpbnQJCQkJCW1fQmxlbmRUeXBlOwotICAgIHZvaWQJCQkJQ29tcG9zZVNjYW5saW5lVihpbnQgbGluZSwgY29uc3QgdWludDhfdCogc2NhbmxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEgPSBOVUxMKTsKLSAgICB1aW50OF90KiBtX3BTY2FubGluZVY7Ci0gICAgdWludDhfdCogbV9wQ2xpcFNjYW5WOwotICAgIHVpbnQ4X3QqIG1fcEFkZENsaXBTY2FuOwotICAgIHVpbnQ4X3QqIG1fcFNjYW5saW5lQWxwaGFWOworIHByb3RlY3RlZDoKKyAgdm9pZCBEb0NvbXBvc2UodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhID0gTlVMTCk7CisgIENGWF9ESUJpdG1hcCogbV9wQml0bWFwOworICBjb25zdCBDRlhfQ2xpcFJnbiogbV9wQ2xpcFJnbjsKKyAgRlhESUJfRm9ybWF0IG1fU3JjRm9ybWF0OworICBpbnQgbV9EZXN0TGVmdCwgbV9EZXN0VG9wLCBtX0Rlc3RXaWR0aCwgbV9EZXN0SGVpZ2h0LCBtX0JpdG1hcEFscGhhOworICBGWF9EV09SRCBtX01hc2tDb2xvcjsKKyAgY29uc3QgQ0ZYX0RJQml0bWFwKiBtX3BDbGlwTWFzazsKKyAgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvciBtX0NvbXBvc2l0b3I7CisgIEZYX0JPT0wgbV9iVmVydGljYWwsIG1fYkZsaXBYLCBtX2JGbGlwWTsKKyAgaW50IG1fQWxwaGFGbGFnOworICB2b2lkKiBtX3BJY2NUcmFuc2Zvcm07CisgIEZYX0JPT0wgbV9iUmdiQnl0ZU9yZGVyOworICBpbnQgbV9CbGVuZFR5cGU7CisgIHZvaWQgQ29tcG9zZVNjYW5saW5lVihpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSA9IE5VTEwpOworICB1aW50OF90KiBtX3BTY2FubGluZVY7CisgIHVpbnQ4X3QqIG1fcENsaXBTY2FuVjsKKyAgdWludDhfdCogbV9wQWRkQ2xpcFNjYW47CisgIHVpbnQ4X3QqIG1fcFNjYW5saW5lQWxwaGFWOwogfTsKLWNsYXNzIENGWF9CaXRtYXBTdG9yZXIgOiBwdWJsaWMgSUZYX1NjYW5saW5lQ29tcG9zZXIKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9CaXRtYXBTdG9yZXIgOiBwdWJsaWMgSUZYX1NjYW5saW5lQ29tcG9zZXIgeworIHB1YmxpYzoKKyAgQ0ZYX0JpdG1hcFN0b3JlcigpOwogCi0gICAgQ0ZYX0JpdG1hcFN0b3JlcigpOworICB+Q0ZYX0JpdG1hcFN0b3JlcigpOwogCi0gICAgfkNGWF9CaXRtYXBTdG9yZXIoKTsKKyAgdmlydHVhbCB2b2lkIENvbXBvc2VTY2FubGluZShpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhKTsKIAotICAgIHZpcnR1YWwJdm9pZAkJQ29tcG9zZVNjYW5saW5lKGludCBsaW5lLCBjb25zdCB1aW50OF90KiBzY2FubGluZSwgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSk7CisgIHZpcnR1YWwgRlhfQk9PTCBTZXRJbmZvKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKTsKKyAgQ0ZYX0RJQml0bWFwKiBHZXRCaXRtYXAoKSB7IHJldHVybiBtX3BCaXRtYXA7IH0KIAotICAgIENGWF9ESUJpdG1hcCoJCUdldEJpdG1hcCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wQml0bWFwOwotICAgIH0KKyAgQ0ZYX0RJQml0bWFwKiBEZXRhY2goKTsKIAotICAgIENGWF9ESUJpdG1hcCoJCURldGFjaCgpOworICB2b2lkIFJlcGxhY2UoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsKIAotICAgIHZvaWQJCQkJUmVwbGFjZShDRlhfRElCaXRtYXAqIHBCaXRtYXApOwotcHJpdmF0ZToKLSAgICBDRlhfRElCaXRtYXAqCQltX3BCaXRtYXA7CisgcHJpdmF0ZToKKyAgQ0ZYX0RJQml0bWFwKiBtX3BCaXRtYXA7CiB9OwogY2xhc3MgQ1N0cmV0Y2hFbmdpbmU7Ci1jbGFzcyBDRlhfSW1hZ2VTdHJldGNoZXIKLXsKLXB1YmxpYzoKLSAgICBDRlhfSW1hZ2VTdHJldGNoZXIoKTsKLSAgICB+Q0ZYX0ltYWdlU3RyZXRjaGVyKCk7CitjbGFzcyBDRlhfSW1hZ2VTdHJldGNoZXIgeworIHB1YmxpYzoKKyAgQ0ZYX0ltYWdlU3RyZXRjaGVyKCk7CisgIH5DRlhfSW1hZ2VTdHJldGNoZXIoKTsKIAotICAgIEZYX0JPT0wgU3RhcnQoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0LCBjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCYgYml0bWFwX3JlY3QsCi0gICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncyk7CisgIEZYX0JPT0wgU3RhcnQoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0LAorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIGJpdG1hcF9yZWN0LAorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzKTsKIAotICAgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIEZYX0JPT0wgU3RhcnRRdWlja1N0cmV0Y2goKTsKLSAgICBGWF9CT09MIFN0YXJ0U3RyZXRjaCgpOwotICAgIEZYX0JPT0wgQ29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIEZYX0JPT0wgQ29udGludWVTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYX0JPT0wgU3RhcnRRdWlja1N0cmV0Y2goKTsKKyAgRlhfQk9PTCBTdGFydFN0cmV0Y2goKTsKKyAgRlhfQk9PTCBDb250aW51ZVF1aWNrU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYX0JPT0wgQ29udGludWVTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKTsKIAotICAgIElGWF9TY2FubGluZUNvbXBvc2VyKgltX3BEZXN0OwotICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqCW1fcFNvdXJjZTsKLSAgICBDU3RyZXRjaEVuZ2luZSoJCW1fcFN0cmV0Y2hFbmdpbmU7Ci0gICAgRlhfRFdPUkQJCW1fRmxhZ3M7Ci0gICAgRlhfQk9PTAkJCW1fYkZsaXBYOwotICAgIEZYX0JPT0wgICAgICAgICBtX2JGbGlwWTsKLSAgICBpbnQJCQkJbV9EZXN0V2lkdGg7Ci0gICAgaW50ICAgICAgICAgICAgIG1fRGVzdEhlaWdodDsKLSAgICBGWF9SRUNUCQkJbV9DbGlwUmVjdDsKLSAgICBpbnQJCQkJbV9MaW5lSW5kZXg7Ci0gICAgaW50CQkJCW1fRGVzdEJQUDsKLSAgICB1aW50OF90KgkJbV9wU2NhbmxpbmU7Ci0gICAgdWludDhfdCogICAgICAgbV9wTWFza1NjYW5saW5lOwotICAgIEZYRElCX0Zvcm1hdAltX0Rlc3RGb3JtYXQ7CisgIElGWF9TY2FubGluZUNvbXBvc2VyKiBtX3BEZXN0OworICBjb25zdCBDRlhfRElCU291cmNlKiBtX3BTb3VyY2U7CisgIENTdHJldGNoRW5naW5lKiBtX3BTdHJldGNoRW5naW5lOworICBGWF9EV09SRCBtX0ZsYWdzOworICBGWF9CT09MIG1fYkZsaXBYOworICBGWF9CT09MIG1fYkZsaXBZOworICBpbnQgbV9EZXN0V2lkdGg7CisgIGludCBtX0Rlc3RIZWlnaHQ7CisgIEZYX1JFQ1QgbV9DbGlwUmVjdDsKKyAgaW50IG1fTGluZUluZGV4OworICBpbnQgbV9EZXN0QlBQOworICB1aW50OF90KiBtX3BTY2FubGluZTsKKyAgdWludDhfdCogbV9wTWFza1NjYW5saW5lOworICBGWERJQl9Gb3JtYXQgbV9EZXN0Rm9ybWF0OwogfTsKLWNsYXNzIENGWF9JbWFnZVRyYW5zZm9ybWVyCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIoKTsKLSAgICB+Q0ZYX0ltYWdlVHJhbnNmb3JtZXIoKTsKK2NsYXNzIENGWF9JbWFnZVRyYW5zZm9ybWVyIHsKKyBwdWJsaWM6CisgIENGWF9JbWFnZVRyYW5zZm9ybWVyKCk7CisgIH5DRlhfSW1hZ2VUcmFuc2Zvcm1lcigpOwogCi0gICAgRlhfQk9PTCBTdGFydChjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBjb25zdCBGWF9SRUNUKiBwQ2xpcCk7CisgIEZYX0JPT0wgU3RhcnQoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCk7CiAKLSAgICBGWF9CT09MIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBDRlhfQWZmaW5lTWF0cml4KiBtX3BNYXRyaXg7Ci0gICAgRlhfUkVDVAkJbV9TdHJldGNoQ2xpcDsKLSAgICBpbnQJCQltX1Jlc3VsdExlZnQ7Ci0gICAgaW50CQkJbV9SZXN1bHRUb3A7Ci0gICAgaW50CQkJbV9SZXN1bHRXaWR0aDsKLSAgICBpbnQJCQltX1Jlc3VsdEhlaWdodDsKLSAgICBDRlhfQWZmaW5lTWF0cml4CW1fZGVzdDJzdHJldGNoOwotICAgIENGWF9JbWFnZVN0cmV0Y2hlcgltX1N0cmV0Y2hlcjsKLSAgICBDRlhfQml0bWFwU3RvcmVyCW1fU3RvcmVyOwotICAgIEZYX0RXT1JECW1fRmxhZ3M7Ci0gICAgaW50CQkJbV9TdGF0dXM7CisgIENGWF9BZmZpbmVNYXRyaXgqIG1fcE1hdHJpeDsKKyAgRlhfUkVDVCBtX1N0cmV0Y2hDbGlwOworICBpbnQgbV9SZXN1bHRMZWZ0OworICBpbnQgbV9SZXN1bHRUb3A7CisgIGludCBtX1Jlc3VsdFdpZHRoOworICBpbnQgbV9SZXN1bHRIZWlnaHQ7CisgIENGWF9BZmZpbmVNYXRyaXggbV9kZXN0MnN0cmV0Y2g7CisgIENGWF9JbWFnZVN0cmV0Y2hlciBtX1N0cmV0Y2hlcjsKKyAgQ0ZYX0JpdG1hcFN0b3JlciBtX1N0b3JlcjsKKyAgRlhfRFdPUkQgbV9GbGFnczsKKyAgaW50IG1fU3RhdHVzOwogfTsKLWNsYXNzIENGWF9JbWFnZVJlbmRlcmVyCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0ltYWdlUmVuZGVyZXIoKTsKLSAgICB+Q0ZYX0ltYWdlUmVuZGVyZXIoKTsKK2NsYXNzIENGWF9JbWFnZVJlbmRlcmVyIHsKKyBwdWJsaWM6CisgIENGWF9JbWFnZVJlbmRlcmVyKCk7CisgIH5DRlhfSW1hZ2VSZW5kZXJlcigpOwogCi0gICAgRlhfQk9PTCBTdGFydChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGliX2ZsYWdzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwKLSAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CisgIEZYX0JPT0wgU3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRpYl9mbGFncywKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogCi0gICAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogCi1wcm90ZWN0ZWQ6Ci0gICAgQ0ZYX0RJQml0bWFwKgkJbV9wRGV2aWNlOwotICAgIGNvbnN0IENGWF9DbGlwUmduKgltX3BDbGlwUmduOwotICAgIGludAkJCQkJbV9CaXRtYXBBbHBoYTsKLSAgICBGWF9EV09SRAkJCW1fTWFza0NvbG9yOwotICAgIENGWF9BZmZpbmVNYXRyaXgJbV9NYXRyaXg7Ci0gICAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIqCW1fcFRyYW5zZm9ybWVyOwotICAgIENGWF9JbWFnZVN0cmV0Y2hlcgltX1N0cmV0Y2hlcjsKLSAgICBDRlhfQml0bWFwQ29tcG9zZXIJbV9Db21wb3NlcjsKLSAgICBpbnQJCQkJCW1fU3RhdHVzOwotICAgIEZYX1JFQ1QJCQkJbV9DbGlwQm94OwotICAgIEZYX0RXT1JECQkJbV9GbGFnczsKLSAgICBpbnQJCQkJCW1fQWxwaGFGbGFnOwotICAgIHZvaWQqCQkJCW1fcEljY1RyYW5zZm9ybTsKLSAgICBGWF9CT09MCQkJCW1fYlJnYkJ5dGVPcmRlcjsKLSAgICBpbnQJCQkJCW1fQmxlbmRUeXBlOworIHByb3RlY3RlZDoKKyAgQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2U7CisgIGNvbnN0IENGWF9DbGlwUmduKiBtX3BDbGlwUmduOworICBpbnQgbV9CaXRtYXBBbHBoYTsKKyAgRlhfRFdPUkQgbV9NYXNrQ29sb3I7CisgIENGWF9BZmZpbmVNYXRyaXggbV9NYXRyaXg7CisgIENGWF9JbWFnZVRyYW5zZm9ybWVyKiBtX3BUcmFuc2Zvcm1lcjsKKyAgQ0ZYX0ltYWdlU3RyZXRjaGVyIG1fU3RyZXRjaGVyOworICBDRlhfQml0bWFwQ29tcG9zZXIgbV9Db21wb3NlcjsKKyAgaW50IG1fU3RhdHVzOworICBGWF9SRUNUIG1fQ2xpcEJveDsKKyAgRlhfRFdPUkQgbV9GbGFnczsKKyAgaW50IG1fQWxwaGFGbGFnOworICB2b2lkKiBtX3BJY2NUcmFuc2Zvcm07CisgIEZYX0JPT0wgbV9iUmdiQnl0ZU9yZGVyOworICBpbnQgbV9CbGVuZFR5cGU7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWEdFX0ZYX0RJQl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZm9udC5oIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZm9udC5oCmluZGV4IGMxZTEzNTcuLmNiYzg4ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZvbnQuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9mb250LmgKQEAgLTIxLDQ0OCArMjEsNDkxIEBACiBjbGFzcyBDRlhfRm9udE1hcHBlcjsKIGNsYXNzIElGWF9TeXN0ZW1Gb250SW5mbzsKIGNsYXNzIENGb250RmlsZUZhY2VJbmZvOwotI2RlZmluZSBGWEZPTlRfRklYRURfUElUQ0gJCTB4MDEKLSNkZWZpbmUgRlhGT05UX1NFUklGCQkJMHgwMgotI2RlZmluZSBGWEZPTlRfU1lNQk9MSUMJCQkweDA0Ci0jZGVmaW5lIEZYRk9OVF9TQ1JJUFQJCQkweDA4Ci0jZGVmaW5lIEZYRk9OVF9JVEFMSUMJCQkweDQwCi0jZGVmaW5lIEZYRk9OVF9CT0xECQkJCTB4NDAwMDAKLSNkZWZpbmUgRlhGT05UX1VTRUVYVEVSTkFUVFIJMHg4MDAwMAotI2RlZmluZSBGWEZPTlRfRVhBQ1RNQVRDSAkJMHg4MDAwMDAwMA0KLSNkZWZpbmUgRlhGT05UX0NJREZPTlQJCQkweDEwMDAwMAotI2RlZmluZSBGWEZPTlRfQU5TSV9DSEFSU0VUCQkwCi0jZGVmaW5lIEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQJMQotI2RlZmluZSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQJMgotI2RlZmluZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVAkxMjgKLSNkZWZpbmUgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVAkxMjkKLSNkZWZpbmUgRlhGT05UX0dCMjMxMl9DSEFSU0VUCTEzNAotI2RlZmluZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVAkxMzYKLSNkZWZpbmUgRlhGT05UX1RIQUlfQ0hBUlNFVAkJMjIyCi0jZGVmaW5lIEZYRk9OVF9FQVNURVVST1BFX0NIQVJTRVQJMjM4Ci0jZGVmaW5lIEZYRk9OVF9SVVNTSUFOX0NIQVJTRVQJMjA0Ci0jZGVmaW5lIEZYRk9OVF9HUkVFS19DSEFSU0VUCTE2MQotI2RlZmluZSBGWEZPTlRfVFVSS0lTSF9DSEFSU0VUCTE2MgotI2RlZmluZSBGWEZPTlRfSEVCUkVXX0NIQVJTRVQJMTc3Ci0jZGVmaW5lIEZYRk9OVF9BUkFCSUNfQ0hBUlNFVAkxNzgKLSNkZWZpbmUgRlhGT05UX0JBTFRJQ19DSEFSU0VUCTE4NgotI2RlZmluZSBGWEZPTlRfRkZfRklYRURQSVRDSAkxCi0jZGVmaW5lIEZYRk9OVF9GRl9ST01BTgkJCSgxPDw0KQotI2RlZmluZSBGWEZPTlRfRkZfU0NSSVBUCQkoNDw8NCkKLSNkZWZpbmUgRlhGT05UX0ZXX05PUk1BTAkJNDAwCi0jZGVmaW5lIEZYRk9OVF9GV19CT0xECQkJNzAwCi1jbGFzcyBDRlhfRm9udAotewotcHVibGljOgotICAgIENGWF9Gb250KCk7Ci0gICAgfkNGWF9Gb250KCk7CisjZGVmaW5lIEZYRk9OVF9GSVhFRF9QSVRDSCAweDAxCisjZGVmaW5lIEZYRk9OVF9TRVJJRiAweDAyCisjZGVmaW5lIEZYRk9OVF9TWU1CT0xJQyAweDA0CisjZGVmaW5lIEZYRk9OVF9TQ1JJUFQgMHgwOAorI2RlZmluZSBGWEZPTlRfSVRBTElDIDB4NDAKKyNkZWZpbmUgRlhGT05UX0JPTEQgMHg0MDAwMAorI2RlZmluZSBGWEZPTlRfVVNFRVhURVJOQVRUUiAweDgwMDAwCisjZGVmaW5lIEZYRk9OVF9FWEFDVE1BVENIIDB4ODAwMDAwMDAKKyNkZWZpbmUgRlhGT05UX0NJREZPTlQgMHgxMDAwMDAKKyNkZWZpbmUgRlhGT05UX0FOU0lfQ0hBUlNFVCAwCisjZGVmaW5lIEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQgMQorI2RlZmluZSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQgMgorI2RlZmluZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCAxMjgKKyNkZWZpbmUgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCAxMjkKKyNkZWZpbmUgRlhGT05UX0dCMjMxMl9DSEFSU0VUIDEzNAorI2RlZmluZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCAxMzYKKyNkZWZpbmUgRlhGT05UX1RIQUlfQ0hBUlNFVCAyMjIKKyNkZWZpbmUgRlhGT05UX0VBU1RFVVJPUEVfQ0hBUlNFVCAyMzgKKyNkZWZpbmUgRlhGT05UX1JVU1NJQU5fQ0hBUlNFVCAyMDQKKyNkZWZpbmUgRlhGT05UX0dSRUVLX0NIQVJTRVQgMTYxCisjZGVmaW5lIEZYRk9OVF9UVVJLSVNIX0NIQVJTRVQgMTYyCisjZGVmaW5lIEZYRk9OVF9IRUJSRVdfQ0hBUlNFVCAxNzcKKyNkZWZpbmUgRlhGT05UX0FSQUJJQ19DSEFSU0VUIDE3OAorI2RlZmluZSBGWEZPTlRfQkFMVElDX0NIQVJTRVQgMTg2CisjZGVmaW5lIEZYRk9OVF9GRl9GSVhFRFBJVENIIDEKKyNkZWZpbmUgRlhGT05UX0ZGX1JPTUFOICgxIDw8IDQpCisjZGVmaW5lIEZYRk9OVF9GRl9TQ1JJUFQgKDQgPDwgNCkKKyNkZWZpbmUgRlhGT05UX0ZXX05PUk1BTCA0MDAKKyNkZWZpbmUgRlhGT05UX0ZXX0JPTEQgNzAwCitjbGFzcyBDRlhfRm9udCB7CisgcHVibGljOgorICBDRlhfRm9udCgpOworICB+Q0ZYX0ZvbnQoKTsKIAotICAgIEZYX0JPT0wJCQkJCUxvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIEZYX0JPT0wgYlZlcnRpY2FsID0gRkFMU0UpOworICBGWF9CT09MIExvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcnVlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgIGludCBDaGFyc2V0Q1AsCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnRpY2FsID0gRkFMU0UpOwogCi0gICAgRlhfQk9PTAkJCQkJTG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUpOworICBGWF9CT09MIExvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKTsKIAotCUZYX0JPT0wJCQkJCUxvYWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUsIGludCBuRmFjZUluZGV4ID0gMCwgaW50KiBwRmFjZUNvdW50ID0gTlVMTCk7DQotDQotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIExvYWRDbG9uZShjb25zdCBDRlhfRm9udCogcEZvbnQpOw0KLQ0KKyAgRlhfQk9PTCBMb2FkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlLAorICAgICAgICAgICAgICAgICAgIGludCBuRmFjZUluZGV4ID0gMCwKKyAgICAgICAgICAgICAgICAgICBpbnQqIHBGYWNlQ291bnQgPSBOVUxMKTsKIAotICAgIEZYRlRfRmFjZQkJCQlHZXRGYWNlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0ZhY2U7Ci0gICAgfQorICBGWF9CT09MIExvYWRDbG9uZShjb25zdCBDRlhfRm9udCogcEZvbnQpOwogCisgIEZYRlRfRmFjZSBHZXRGYWNlKCkgY29uc3QgeyByZXR1cm4gbV9GYWNlOyB9CiAKLSAgICBjb25zdCBDRlhfU3Vic3RGb250KglHZXRTdWJzdEZvbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFN1YnN0Rm9udDsKLSAgICB9CisgIGNvbnN0IENGWF9TdWJzdEZvbnQqIEdldFN1YnN0Rm9udCgpIGNvbnN0IHsgcmV0dXJuIG1fcFN1YnN0Rm9udDsgfQogCi0gICAgQ0ZYX1BhdGhEYXRhKgkJCUxvYWRHbHlwaFBhdGgoRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIGludCBkZXN0X3dpZHRoID0gMCk7CisgIENGWF9QYXRoRGF0YSogTG9hZEdseXBoUGF0aChGWF9EV09SRCBnbHlwaF9pbmRleCwgaW50IGRlc3Rfd2lkdGggPSAwKTsKIAotICAgIGludAkJCQkJCUdldEdseXBoV2lkdGgoRlhfRFdPUkQgZ2x5cGhfaW5kZXgpOworICBpbnQgR2V0R2x5cGhXaWR0aChGWF9EV09SRCBnbHlwaF9pbmRleCk7CiAKLSAgICBpbnQJCQkJCQlHZXRBc2NlbnQoKSBjb25zdDsKKyAgaW50IEdldEFzY2VudCgpIGNvbnN0OwogCi0gICAgaW50CQkJCQkJR2V0RGVzY2VudCgpIGNvbnN0OworICBpbnQgR2V0RGVzY2VudCgpIGNvbnN0OwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgR2V0R2x5cGhCQm94KEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9SRUNUICZiYm94KTsKKyAgRlhfQk9PTCBHZXRHbHlwaEJCb3goRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX1JFQ1QmIGJib3gpOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNJdGFsaWMoKTsKKyAgRlhfQk9PTCBJc0l0YWxpYygpOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNCb2xkKCk7CisgIEZYX0JPT0wgSXNCb2xkKCk7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBJc0ZpeGVkV2lkdGgoKTsKKyAgRlhfQk9PTCBJc0ZpeGVkV2lkdGgoKTsKIAotICAgIEZYX0JPT0wJCQkJCUlzVmVydGljYWwoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYlZlcnRpY2FsOwotICAgIH0KKyAgRlhfQk9PTCBJc1ZlcnRpY2FsKCkgY29uc3QgeyByZXR1cm4gbV9iVmVydGljYWw7IH0KIAotICAgIENGWF9XaWRlU3RyaW5nICAgICAgICAgIEdldFBzTmFtZSgpIGNvbnN0OworICBDRlhfV2lkZVN0cmluZyBHZXRQc05hbWUoKSBjb25zdDsKIAorICBDRlhfQnl0ZVN0cmluZyBHZXRGYW1pbHlOYW1lKCkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyAgICAgICAgICBHZXRGYW1pbHlOYW1lKCkgY29uc3Q7CisgIENGWF9CeXRlU3RyaW5nIEdldEZhY2VOYW1lKCkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyAgICAgICAgICBHZXRGYWNlTmFtZSgpIGNvbnN0OworICBGWF9CT09MIElzVFRGb250KCk7CiAKKyAgRlhfQk9PTCBHZXRCQm94KEZYX1JFQ1QmIGJib3gpOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNUVEZvbnQoKTsKKyAgaW50IEdldEhlaWdodCgpOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgR2V0QkJveChGWF9SRUNUICZiYm94KTsKKyAgaW50IEdldFVMUG9zKCk7CiAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBHZXRIZWlnaHQoKTsKKyAgaW50IEdldFVMdGhpY2tuZXNzKCk7CiAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBHZXRVTFBvcygpOworICBpbnQgR2V0TWF4QWR2YW5jZVdpZHRoKCk7CiAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBHZXRVTHRoaWNrbmVzcygpOworICBGWEZUX0ZhY2UgbV9GYWNlOwogCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgR2V0TWF4QWR2YW5jZVdpZHRoKCk7CisgIENGWF9TdWJzdEZvbnQqIG1fcFN1YnN0Rm9udDsKKyAgRlhfQk9PTCBJc0VtYmVkZGVkKCkgeyByZXR1cm4gbV9iRW1iZWRkZWQ7IH0KIAotICAgIEZYRlRfRmFjZQkJCQltX0ZhY2U7CisgIHZvaWQgQWRqdXN0TU1QYXJhbXMoaW50IGdseXBoX2luZGV4LCBpbnQgd2lkdGgsIGludCB3ZWlnaHQpOworICB1aW50OF90KiBtX3BGb250RGF0YUFsbG9jYXRpb247CisgIHVpbnQ4X3QqIG1fcEZvbnREYXRhOworICB1aW50OF90KiBtX3BHc3ViRGF0YTsKKyAgRlhfRFdPUkQgbV9kd1NpemU7CisgIENGWF9CaW5hcnlCdWYgbV9PdGZGb250RGF0YTsKKyAgdm9pZCogbV9oSGFuZGxlOworICB2b2lkKiBtX3BQbGF0Zm9ybUZvbnQ7CisgIHZvaWQqIG1fcFBsYXRmb3JtRm9udENvbGxlY3Rpb247CisgIHZvaWQqIG1fcER3Rm9udDsKKyAgRlhfQk9PTCBtX2JEd0xvYWRlZDsKKyAgdm9pZCBSZWxlYXNlUGxhdGZvcm1SZXNvdXJjZSgpOwogCi0gICAgQ0ZYX1N1YnN0Rm9udCoJCQltX3BTdWJzdEZvbnQ7Ci0gICAgRlhfQk9PTAkJCQkJSXNFbWJlZGRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9iRW1iZWRkZWQ7Ci0gICAgfQorICB2b2lkIERlbGV0ZUZhY2UoKTsKIAotICAgIHZvaWQJCQkJCUFkanVzdE1NUGFyYW1zKGludCBnbHlwaF9pbmRleCwgaW50IHdpZHRoLCBpbnQgd2VpZ2h0KTsKLSAgICB1aW50OF90KgkJCQltX3BGb250RGF0YUFsbG9jYXRpb247Ci0gICAgdWludDhfdCogICAgICAgICAgICAgICBtX3BGb250RGF0YTsKLSAgICB1aW50OF90KgkJCQltX3BHc3ViRGF0YTsKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICBtX2R3U2l6ZTsKLSAgICBDRlhfQmluYXJ5QnVmICAgICAgICAgICBtX090ZkZvbnREYXRhOwotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1faEhhbmRsZTsKLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtX3BQbGF0Zm9ybUZvbnQ7Ci0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgbV9wUGxhdGZvcm1Gb250Q29sbGVjdGlvbjsKLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtX3BEd0ZvbnQ7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgbV9iRHdMb2FkZWQ7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgUmVsZWFzZVBsYXRmb3JtUmVzb3VyY2UoKTsKLQotICAgIHZvaWQJCQkJCURlbGV0ZUZhY2UoKTsKLXByb3RlY3RlZDoKLQotICAgIEZYX0JPT0wJCQkJCW1fYkVtYmVkZGVkOwotICAgIEZYX0JPT0wJCQkJCW1fYlZlcnRpY2FsOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIG1fYkxvZ2ljOw0KLSAgICB2b2lkKgkJCQkJbV9wT3duZWRTdHJlYW07CisgcHJvdGVjdGVkOgorICBGWF9CT09MIG1fYkVtYmVkZGVkOworICBGWF9CT09MIG1fYlZlcnRpY2FsOworICBGWF9CT09MIG1fYkxvZ2ljOworICB2b2lkKiBtX3BPd25lZFN0cmVhbTsKIH07Ci0jZGVmaW5lIEVOQ09ESU5HX0lOVEVSTkFMCQkwCi0jZGVmaW5lIEVOQ09ESU5HX1VOSUNPREUJCTEKLWNsYXNzIElGWF9Gb250RW5jb2RpbmcKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JRlhfRm9udEVuY29kaW5nKCkge30KKyNkZWZpbmUgRU5DT0RJTkdfSU5URVJOQUwgMAorI2RlZmluZSBFTkNPRElOR19VTklDT0RFIDEKK2NsYXNzIElGWF9Gb250RW5jb2RpbmcgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX0ZvbnRFbmNvZGluZygpIHt9CiAKLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgPSAwOworICB2aXJ0dWFsIEZYX0RXT1JEIEdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCVVuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBVbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlDaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIFVuaWNvZGUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9EV09SRCBDaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIFVuaWNvZGUpIGNvbnN0ID0gMDsKIH07CiBJRlhfRm9udEVuY29kaW5nKiBGWEdFX0NyZWF0ZVVuaWNvZGVFbmNvZGluZyhDRlhfRm9udCogcEZvbnQpOwotI2RlZmluZSBGWEZNX0VOQ19UQUcoYSwgYiwgYywgZCkgKCgoRlhfRFdPUkQpKGEpIDw8IDI0KSB8ICgoRlhfRFdPUkQpKGIpIDw8IDE2KSB8ICgoRlhfRFdPUkQpKGMpIDw8IDgpIHwgKEZYX0RXT1JEKShkKSkNCi0jZGVmaW5lIEZYRk1fRU5DT0RJTkdfTk9ORQkJCQlGWEZNX0VOQ19UQUcoMCwgMCwgMCwgMCkNCi0jZGVmaW5lIEZYRk1fRU5DT0RJTkdfTVNfU1lNQk9MCQkJRlhGTV9FTkNfVEFHKCdzJywgJ3knLCAnbScsICdiJykNCi0jZGVmaW5lIEZYRk1fRU5DT0RJTkdfVU5JQ09ERQkJCUZYRk1fRU5DX1RBRygndScsICduJywgJ2knLCAnYycpDQotI2RlZmluZSBGWEZNX0VOQ09ESU5HX01TX1NKSVMJCQlGWEZNX0VOQ19UQUcoJ3MnLCAnaicsICdpJywgJ3MnKQ0KLSNkZWZpbmUgRlhGTV9FTkNPRElOR19NU19HQjIzMTIJCQlGWEZNX0VOQ19UQUcoJ2cnLCAnYicsICcgJywgJyAnKQ0KLSNkZWZpbmUgRlhGTV9FTkNPRElOR19NU19CSUc1CQkJRlhGTV9FTkNfVEFHKCdiJywgJ2knLCAnZycsICc1JykNCi0jZGVmaW5lIEZYRk1fRU5DT0RJTkdfTVNfV0FOU1VORwkJRlhGTV9FTkNfVEFHKCd3JywgJ2EnLCAnbicsICdzJykNCi0jZGVmaW5lIEZYRk1fRU5DT0RJTkdfTVNfSk9IQUIJCQlGWEZNX0VOQ19UQUcoJ2onLCAnbycsICdoJywgJ2EnKQ0KLSNkZWZpbmUgRlhGTV9FTkNPRElOR19BRE9CRV9TVEFOREFSRAlGWEZNX0VOQ19UQUcoJ0EnLCAnRCcsICdPJywgJ0InKQ0KLSNkZWZpbmUgRlhGTV9FTkNPRElOR19BRE9CRV9FWFBFUlQJCUZYRk1fRU5DX1RBRygnQScsICdEJywgJ0InLCAnRScpDQotI2RlZmluZSBGWEZNX0VOQ09ESU5HX0FET0JFX0NVU1RPTQkJRlhGTV9FTkNfVEFHKCdBJywgJ0QnLCAnQicsICdDJykNCi0jZGVmaW5lIEZYRk1fRU5DT0RJTkdfQURPQkVfTEFUSU5fMQkJRlhGTV9FTkNfVEFHKCdsJywgJ2EnLCAndCcsICcxJykNCi0jZGVmaW5lIEZYRk1fRU5DT0RJTkdfT0xEX0xBVElOXzIJCUZYRk1fRU5DX1RBRygnbCcsICdhJywgJ3QnLCAnMicpDQotI2RlZmluZSBGWEZNX0VOQ09ESU5HX0FQUExFX1JPTUFOCQlGWEZNX0VOQ19UQUcoJ2EnLCAncicsICdtJywgJ24nKQ0KLWNsYXNzIElGWF9Gb250RW5jb2RpbmdFeCA6IHB1YmxpYyBJRlhfRm9udEVuY29kaW5nDQotew0KLXB1YmxpYzoNCi0NCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2x5cGhJbmRleEZyb21OYW1lKGNvbnN0IEZYX0NIQVIqIHBTdHJOYW1lKSA9IDA7DQotDQotICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJTmFtZUZyb21HbHlwaEluZGV4KEZYX0RXT1JEIGR3R2x5cGhJbmRleCkgPSAwOw0KLQ0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlDaGFyQ29kZUZyb21HbHlwaEluZGV4KEZYX0RXT1JEIGR3R2x5cGhJbmRleCkgPSAwOw0KLX07DQotSUZYX0ZvbnRFbmNvZGluZ0V4KglGWF9DcmVhdGVGb250RW5jb2RpbmdFeChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIG5FbmNvZGluZ0lEID0gRlhGTV9FTkNPRElOR19OT05FKTsNCi0jZGVmaW5lIEZYRk9OVF9TVUJTVF9NTQkJCQkweDAxCi0jZGVmaW5lIEZYRk9OVF9TVUJTVF9HTFlQSFBBVEgJCTB4MDQKLSNkZWZpbmUgRlhGT05UX1NVQlNUX0NMRUFSVFlQRQkJMHgwOAotI2RlZmluZSBGWEZPTlRfU1VCU1RfVFJBTlNGT1JNCQkweDEwCi0jZGVmaW5lIEZYRk9OVF9TVUJTVF9OT05TWU1CT0wJCTB4MjAKLSNkZWZpbmUgRlhGT05UX1NVQlNUX0VYQUNUCQkJMHg0MAotI2RlZmluZSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQJCTB4ODAKLWNsYXNzIENGWF9TdWJzdEZvbnQKLXsKLXB1YmxpYzoKKyNkZWZpbmUgRlhGTV9FTkNfVEFHKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChGWF9EV09SRCkoYSkgPDwgMjQpIHwgKChGWF9EV09SRCkoYikgPDwgMTYpIHwgKChGWF9EV09SRCkoYykgPDwgOCkgfCBcCisgICAoRlhfRFdPUkQpKGQpKQorI2RlZmluZSBGWEZNX0VOQ09ESU5HX05PTkUgRlhGTV9FTkNfVEFHKDAsIDAsIDAsIDApCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfTVNfU1lNQk9MIEZYRk1fRU5DX1RBRygncycsICd5JywgJ20nLCAnYicpCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfVU5JQ09ERSBGWEZNX0VOQ19UQUcoJ3UnLCAnbicsICdpJywgJ2MnKQorI2RlZmluZSBGWEZNX0VOQ09ESU5HX01TX1NKSVMgRlhGTV9FTkNfVEFHKCdzJywgJ2onLCAnaScsICdzJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19NU19HQjIzMTIgRlhGTV9FTkNfVEFHKCdnJywgJ2InLCAnICcsICcgJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19NU19CSUc1IEZYRk1fRU5DX1RBRygnYicsICdpJywgJ2cnLCAnNScpCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfTVNfV0FOU1VORyBGWEZNX0VOQ19UQUcoJ3cnLCAnYScsICduJywgJ3MnKQorI2RlZmluZSBGWEZNX0VOQ09ESU5HX01TX0pPSEFCIEZYRk1fRU5DX1RBRygnaicsICdvJywgJ2gnLCAnYScpCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQgRlhGTV9FTkNfVEFHKCdBJywgJ0QnLCAnTycsICdCJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19BRE9CRV9FWFBFUlQgRlhGTV9FTkNfVEFHKCdBJywgJ0QnLCAnQicsICdFJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19BRE9CRV9DVVNUT00gRlhGTV9FTkNfVEFHKCdBJywgJ0QnLCAnQicsICdDJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19BRE9CRV9MQVRJTl8xIEZYRk1fRU5DX1RBRygnbCcsICdhJywgJ3QnLCAnMScpCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfT0xEX0xBVElOXzIgRlhGTV9FTkNfVEFHKCdsJywgJ2EnLCAndCcsICcyJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19BUFBMRV9ST01BTiBGWEZNX0VOQ19UQUcoJ2EnLCAncicsICdtJywgJ24nKQorY2xhc3MgSUZYX0ZvbnRFbmNvZGluZ0V4IDogcHVibGljIElGWF9Gb250RW5jb2RpbmcgeworIHB1YmxpYzoKKyAgdmlydHVhbCBGWF9EV09SRCBHbHlwaEluZGV4RnJvbU5hbWUoY29uc3QgRlhfQ0hBUiogcFN0ck5hbWUpID0gMDsKIAotICAgIENGWF9TdWJzdEZvbnQoKTsKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBOYW1lRnJvbUdseXBoSW5kZXgoRlhfRFdPUkQgZHdHbHlwaEluZGV4KSA9IDA7CiAKLSAgICB2b2lkKgkJCQltX0V4dEhhbmRsZTsKLQotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9GYW1pbHk7Ci0KLSAgICBpbnQJCQkJCQltX0NoYXJzZXQ7Ci0KLSAgICBGWF9EV09SRAkJCQltX1N1YnN0RmxhZ3M7Ci0KLSAgICBpbnQJCQkJCQltX1dlaWdodDsKLQotICAgIGludAkJCQkJCW1fSXRhbGljQW5nbGU7Ci0KLSAgICBGWF9CT09MCQkJCQltX2JTdWJzdE9mQ0pLOwotCi0gICAgaW50CQkJCQkJbV9XZWlnaHRDSks7Ci0KLSAgICBGWF9CT09MCQkJCQltX2JJdGxpY0NKSzsKKyAgdmlydHVhbCBGWF9EV09SRCBDaGFyQ29kZUZyb21HbHlwaEluZGV4KEZYX0RXT1JEIGR3R2x5cGhJbmRleCkgPSAwOwogfTsKLSNkZWZpbmUgRlhfRk9OVF9GTEFHX1NFUklGICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEZYX0ZPTlRfRkxBR19GSVhFRFBJVENICQkJMHgwMgotI2RlZmluZSBGWF9GT05UX0ZMQUdfSVRBTElDCQkJCTB4MDQKLSNkZWZpbmUgRlhfRk9OVF9GTEFHX0JPTEQJCQkJMHgwOAotI2RlZmluZSBGWF9GT05UX0ZMQUdfU1lNQk9MSUNfU1lNQk9MCTB4MTAKLSNkZWZpbmUgRlhfRk9OVF9GTEFHX1NZTUJPTElDX0RJTkdCQVRTCTB4MjAKLSNkZWZpbmUgRlhfRk9OVF9GTEFHX01VTFRJUExFTUFTVEVSCQkweDQwCitJRlhfRm9udEVuY29kaW5nRXgqIEZYX0NyZWF0ZUZvbnRFbmNvZGluZ0V4KAorICAgIENGWF9Gb250KiBwRm9udCwKKyAgICBGWF9EV09SRCBuRW5jb2RpbmdJRCA9IEZYRk1fRU5DT0RJTkdfTk9ORSk7CisjZGVmaW5lIEZYRk9OVF9TVUJTVF9NTSAweDAxCisjZGVmaW5lIEZYRk9OVF9TVUJTVF9HTFlQSFBBVEggMHgwNAorI2RlZmluZSBGWEZPTlRfU1VCU1RfQ0xFQVJUWVBFIDB4MDgKKyNkZWZpbmUgRlhGT05UX1NVQlNUX1RSQU5TRk9STSAweDEwCisjZGVmaW5lIEZYRk9OVF9TVUJTVF9OT05TWU1CT0wgMHgyMAorI2RlZmluZSBGWEZPTlRfU1VCU1RfRVhBQ1QgMHg0MAorI2RlZmluZSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQgMHg4MAorY2xhc3MgQ0ZYX1N1YnN0Rm9udCB7CisgcHVibGljOgorICBDRlhfU3Vic3RGb250KCk7CisKKyAgdm9pZCogbV9FeHRIYW5kbGU7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9GYW1pbHk7CisKKyAgaW50IG1fQ2hhcnNldDsKKworICBGWF9EV09SRCBtX1N1YnN0RmxhZ3M7CisKKyAgaW50IG1fV2VpZ2h0OworCisgIGludCBtX0l0YWxpY0FuZ2xlOworCisgIEZYX0JPT0wgbV9iU3Vic3RPZkNKSzsKKworICBpbnQgbV9XZWlnaHRDSks7CisKKyAgRlhfQk9PTCBtX2JJdGxpY0NKSzsKK307CisjZGVmaW5lIEZYX0ZPTlRfRkxBR19TRVJJRiAweDAxCisjZGVmaW5lIEZYX0ZPTlRfRkxBR19GSVhFRFBJVENIIDB4MDIKKyNkZWZpbmUgRlhfRk9OVF9GTEFHX0lUQUxJQyAweDA0CisjZGVmaW5lIEZYX0ZPTlRfRkxBR19CT0xEIDB4MDgKKyNkZWZpbmUgRlhfRk9OVF9GTEFHX1NZTUJPTElDX1NZTUJPTCAweDEwCisjZGVmaW5lIEZYX0ZPTlRfRkxBR19TWU1CT0xJQ19ESU5HQkFUUyAweDIwCisjZGVmaW5lIEZYX0ZPTlRfRkxBR19NVUxUSVBMRU1BU1RFUiAweDQwCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgY29uc3QgdWludDhfdCoJbV9wRm9udERhdGE7Ci0gICAgRlhfRFdPUkQJbV9kd1NpemU7CisgIGNvbnN0IHVpbnQ4X3QqIG1fcEZvbnREYXRhOworICBGWF9EV09SRCBtX2R3U2l6ZTsKIH0gRm94aXRGb250czsKLWNsYXNzIENGWF9Gb250TWdyCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0ZvbnRNZ3IoKTsKLSAgICB+Q0ZYX0ZvbnRNZ3IoKTsKLSAgICB2b2lkCQkJSW5pdEZUTGlicmFyeSgpOwotICAgIEZYRlRfRmFjZQkJR2V0Q2FjaGVkRmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgdWludDhfdComIHBGb250RGF0YSk7Ci0gICAgRlhGVF9GYWNlCQlBZGRDYWNoZWRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IGZhY2VfaW5kZXgpOwotICAgIEZYRlRfRmFjZQkJR2V0Q2FjaGVkVFRDRmFjZShpbnQgdHRjX3NpemUsIEZYX0RXT1JEIGNoZWNrc3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250X29mZnNldCwgdWludDhfdComIHBGb250RGF0YSk7Ci0gICAgRlhGVF9GYWNlCQlBZGRDYWNoZWRUVENGYWNlKGludCB0dGNfc2l6ZSwgRlhfRFdPUkQgY2hlY2tzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIGludCBmb250X29mZnNldCk7Ci0gICAgRlhGVF9GYWNlCQlHZXRGaWxlRmFjZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgaW50IGZhY2VfaW5kZXgpOwotICAgIEZYRlRfRmFjZQkJR2V0Rml4ZWRGYWNlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZmFjZV9pbmRleCk7Ci0gICAgdm9pZAkJCVJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKTsKLSAgICB2b2lkCQkJU2V0U3lzdGVtRm9udEluZm8oSUZYX1N5c3RlbUZvbnRJbmZvKiBwRm9udEluZm8pOwotICAgIEZYRlRfRmFjZQkJRmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCk7CitjbGFzcyBDRlhfRm9udE1nciB7CisgcHVibGljOgorICBDRlhfRm9udE1ncigpOworICB+Q0ZYX0ZvbnRNZ3IoKTsKKyAgdm9pZCBJbml0RlRMaWJyYXJ5KCk7CisgIEZYRlRfRmFjZSBHZXRDYWNoZWRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHBGb250RGF0YSk7CisgIEZYRlRfRmFjZSBBZGRDYWNoZWRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmYWNlX2luZGV4KTsKKyAgRlhGVF9GYWNlIEdldENhY2hlZFRUQ0ZhY2UoaW50IHR0Y19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgcEZvbnREYXRhKTsKKyAgRlhGVF9GYWNlIEFkZENhY2hlZFRUQ0ZhY2UoaW50IHR0Y19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250X29mZnNldCk7CisgIEZYRlRfRmFjZSBHZXRGaWxlRmFjZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgaW50IGZhY2VfaW5kZXgpOworICBGWEZUX0ZhY2UgR2V0Rml4ZWRGYWNlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZmFjZV9pbmRleCk7CisgIHZvaWQgUmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpOworICB2b2lkIFNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbyogcEZvbnRJbmZvKTsKKyAgRlhGVF9GYWNlIEZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJ1ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ2hhcnNldENQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KTsKIAotICAgIHZvaWQJCQlGcmVlQ2FjaGUoKTsKKyAgdm9pZCBGcmVlQ2FjaGUoKTsKIAotICAgIEZYX0JPT0wJCQlHZXRTdGFuZGFyZEZvbnQoY29uc3QgdWludDhfdComIHBGb250RGF0YSwgRlhfRFdPUkQmIHNpemUsIGludCBpbmRleCk7Ci0gICAgQ0ZYX0ZvbnRNYXBwZXIqCW1fcEJ1aWx0aW5NYXBwZXI7Ci0gICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX0ZhY2VNYXA7Ci0gICAgRlhGVF9MaWJyYXJ5CW1fRlRMaWJyYXJ5OwotICAgIEZveGl0Rm9udHMgbV9FeHRlcm5hbEZvbnRzWzE2XTsKKyAgRlhfQk9PTCBHZXRTdGFuZGFyZEZvbnQoY29uc3QgdWludDhfdComIHBGb250RGF0YSwgRlhfRFdPUkQmIHNpemUsIGludCBpbmRleCk7CisgIENGWF9Gb250TWFwcGVyKiBtX3BCdWlsdGluTWFwcGVyOworICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyIG1fRmFjZU1hcDsKKyAgRlhGVF9MaWJyYXJ5IG1fRlRMaWJyYXJ5OworICBGb3hpdEZvbnRzIG1fRXh0ZXJuYWxGb250c1sxNl07CiB9OwotY2xhc3MgSUZYX0ZvbnRFbnVtZXJhdG9yCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYX0ZvbnRFbnVtZXJhdG9yKCkgeyB9CitjbGFzcyBJRlhfRm9udEVudW1lcmF0b3IgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX0ZvbnRFbnVtZXJhdG9yKCkge30KIAotICAgIHZpcnR1YWwgdm9pZAkJSGl0Rm9udCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIEhpdEZvbnQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCUZpbmlzaCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIEZpbmlzaCgpID0gMDsKIH07Ci1jbGFzcyBJRlhfQWRkaXRpb25hbEZvbnRFbnVtCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYX0FkZGl0aW9uYWxGb250RW51bSgpIHsgfQotICAgIHZpcnR1YWwgaW50ICBDb3VudEZpbGVzKCkgPSAwOwotICAgIHZpcnR1YWwgSUZYX0ZpbGVTdHJlYW0qIEdldEZvbnRGaWxlKGludCBpbmRleCkgPSAwOworY2xhc3MgSUZYX0FkZGl0aW9uYWxGb250RW51bSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfQWRkaXRpb25hbEZvbnRFbnVtKCkge30KKyAgdmlydHVhbCBpbnQgQ291bnRGaWxlcygpID0gMDsKKyAgdmlydHVhbCBJRlhfRmlsZVN0cmVhbSogR2V0Rm9udEZpbGUoaW50IGluZGV4KSA9IDA7CiB9OwotY2xhc3MgQ0ZYX0ZvbnRNYXBwZXIKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9Gb250TWFwcGVyIHsKKyBwdWJsaWM6CisgIENGWF9Gb250TWFwcGVyKENGWF9Gb250TWdyKiBtZ3IpOworICB+Q0ZYX0ZvbnRNYXBwZXIoKTsKIAotICAgIENGWF9Gb250TWFwcGVyKENGWF9Gb250TWdyKiBtZ3IpOwotICAgIH5DRlhfRm9udE1hcHBlcigpOworICB2b2lkIFNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbyogcEZvbnRJbmZvKTsKKyAgSUZYX1N5c3RlbUZvbnRJbmZvKiBHZXRTeXN0ZW1Gb250SW5mbygpIHsgcmV0dXJuIG1fcEZvbnRJbmZvOyB9CisgIHZvaWQgQWRkSW5zdGFsbGVkRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgaW50IGNoYXJzZXQpOworICB2b2lkIExvYWRJbnN0YWxsZWRGb250cygpOworICBDRlhfQnl0ZVN0cmluZ0FycmF5IG1fSW5zdGFsbGVkVFRGb250czsKKyAgdm9pZCBTZXRGb250RW51bWVyYXRvcihJRlhfRm9udEVudW1lcmF0b3IqIHBGb250RW51bWVyYXRvcikgeworICAgIG1fcEZvbnRFbnVtZXJhdG9yID0gcEZvbnRFbnVtZXJhdG9yOworICB9CisgIElGWF9Gb250RW51bWVyYXRvciogR2V0Rm9udEVudW1lcmF0b3IoKSBjb25zdCB7IHJldHVybiBtX3BGb250RW51bWVyYXRvcjsgfQogCi0gICAgdm9pZAkJCQlTZXRTeXN0ZW1Gb250SW5mbyhJRlhfU3lzdGVtRm9udEluZm8qIHBGb250SW5mbyk7Ci0gICAgSUZYX1N5c3RlbUZvbnRJbmZvKglHZXRTeXN0ZW1Gb250SW5mbygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRm9udEluZm87Ci0gICAgfQotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBBZGRJbnN0YWxsZWRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBpbnQgY2hhcnNldCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIExvYWRJbnN0YWxsZWRGb250cygpOwotICAgIENGWF9CeXRlU3RyaW5nQXJyYXkgICAgICAgICBtX0luc3RhbGxlZFRURm9udHM7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFNldEZvbnRFbnVtZXJhdG9yKElGWF9Gb250RW51bWVyYXRvciogcEZvbnRFbnVtZXJhdG9yKQotICAgIHsKLSAgICAgICAgbV9wRm9udEVudW1lcmF0b3IgPSBwRm9udEVudW1lcmF0b3I7Ci0gICAgfQotICAgIElGWF9Gb250RW51bWVyYXRvciogICAgICAgICBHZXRGb250RW51bWVyYXRvcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRm9udEVudW1lcmF0b3I7Ci0gICAgfQorICBGWEZUX0ZhY2UgRmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcnVlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDaGFyc2V0Q1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQpOworICBGWEZUX0ZhY2UgRmluZFN1YnN0Rm9udEJ5VW5pY29kZShGWF9EV09SRCBkd1VuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlKTsKKyAgRlhfQk9PTCBJc0J1aWx0aW5GYWNlKGNvbnN0IEZYRlRfRmFjZSBmYWNlKSBjb25zdDsKIAotICAgIEZYRlRfRmFjZSBGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgQ2hhcnNldENQLCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KTsKLSAgICBGWEZUX0ZhY2UgICAgICAgICAgICAgICAgICAgRmluZFN1YnN0Rm9udEJ5VW5pY29kZShGWF9EV09SRCBkd1VuaWNvZGUsIEZYX0RXT1JEIGZsYWdzLCBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgIElzQnVpbHRpbkZhY2UoY29uc3QgRlhGVF9GYWNlIGZhY2UpIGNvbnN0OworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBzaXplX3QgTU1fRkFDRV9DT1VOVCA9IDI7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgRk9YSVRfRkFDRV9DT1VOVCA9IDE0OwogCi1wcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICAgICBNTV9GQUNFX0NPVU5UID0gMjsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICAgRk9YSVRfRkFDRV9DT1VOVCA9IDE0OworICBDRlhfQnl0ZVN0cmluZyBHZXRQU05hbWVGcm9tVFQodm9pZCogaEZvbnQpOworICBDRlhfQnl0ZVN0cmluZyBNYXRjaEluc3RhbGxlZEZvbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBub3JtX25hbWUpOworICBGWEZUX0ZhY2UgVXNlSW50ZXJuYWxTdWJzdChDRlhfU3Vic3RGb250KiBwU3Vic3RGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUJhc2VGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljdGhmYW1pbHkpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgICAgICAgICAgICAgIEdldFBTTmFtZUZyb21UVCh2b2lkKiBoRm9udCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgICAgICAgICAgICAgIE1hdGNoSW5zdGFsbGVkRm9udHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5vcm1fbmFtZSk7Ci0gICAgRlhGVF9GYWNlICAgICAgICAgICAgICAgICAgIFVzZUludGVybmFsU3Vic3QoQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCwgaW50IGlCYXNlRm9udCwgaW50IGl0YWxpY19hbmdsZSwgaW50IHdlaWdodCwgaW50IHBpY3RoZmFtaWx5KTsKLQotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICBtX2JMaXN0TG9hZGVkOwotICAgIEZYRlRfRmFjZSAgICAgICAgICAgICAgICAgICBtX01NRmFjZXNbTU1fRkFDRV9DT1VOVF07Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgICAgICAgICAgICAgIG1fTGFzdEZhbWlseTsKLSAgICBDRlhfRFdvcmRBcnJheSAgICAgICAgICAgICAgbV9DaGFyc2V0QXJyYXk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSAgICAgICAgIG1fRmFjZUFycmF5OwotICAgIElGWF9TeXN0ZW1Gb250SW5mbyogICAgICAgICBtX3BGb250SW5mbzsKLSAgICBGWEZUX0ZhY2UgICAgICAgICAgICAgICAgICAgbV9Gb3hpdEZhY2VzW0ZPWElUX0ZBQ0VfQ09VTlRdOwotICAgIElGWF9Gb250RW51bWVyYXRvciogICAgICAgICBtX3BGb250RW51bWVyYXRvcjsKLSAgICBDRlhfRm9udE1nciogY29uc3QgbV9wRm9udE1ncjsKKyAgRlhfQk9PTCBtX2JMaXN0TG9hZGVkOworICBGWEZUX0ZhY2UgbV9NTUZhY2VzW01NX0ZBQ0VfQ09VTlRdOworICBDRlhfQnl0ZVN0cmluZyBtX0xhc3RGYW1pbHk7CisgIENGWF9EV29yZEFycmF5IG1fQ2hhcnNldEFycmF5OworICBDRlhfQnl0ZVN0cmluZ0FycmF5IG1fRmFjZUFycmF5OworICBJRlhfU3lzdGVtRm9udEluZm8qIG1fcEZvbnRJbmZvOworICBGWEZUX0ZhY2UgbV9Gb3hpdEZhY2VzW0ZPWElUX0ZBQ0VfQ09VTlRdOworICBJRlhfRm9udEVudW1lcmF0b3IqIG1fcEZvbnRFbnVtZXJhdG9yOworICBDRlhfRm9udE1nciogY29uc3QgbV9wRm9udE1ncjsKIH07Ci1jbGFzcyBJRlhfU3lzdGVtRm9udEluZm8KLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgSUZYX1N5c3RlbUZvbnRJbmZvKglDcmVhdGVEZWZhdWx0KCk7Ci0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOworY2xhc3MgSUZYX1N5c3RlbUZvbnRJbmZvIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBJRlhfU3lzdGVtRm9udEluZm8qIENyZWF0ZURlZmF1bHQoKTsKKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7CiAKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCUVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFjZSwgaW50JiBpRXhhY3QpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250QnlVbmljb2RlKEZYX0RXT1JEIGR3VW5pY29kZSwgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgcGl0Y2hfZmFtaWx5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCoJCUdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSkgPSAwOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkgPSAwOwotICAgIHZpcnR1YWwgaW50CQkJR2V0RmFjZUluZGV4KHZvaWQqIGhGb250KQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZAkJRGVsZXRlRm9udCh2b2lkKiBoRm9udCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCogICAgICAgUmV0YWluRm9udCh2b2lkKiBoRm9udCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLXByb3RlY3RlZDoKLSAgICB+SUZYX1N5c3RlbUZvbnRJbmZvKCkgeyB9CisgIHZpcnR1YWwgRlhfQk9PTCBFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpID0gMDsKKyAgdmlydHVhbCB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpID0gMDsKKyAgdmlydHVhbCB2b2lkKiBNYXBGb250QnlVbmljb2RlKEZYX0RXT1JEIGR3VW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgdmlydHVhbCB2b2lkKiBHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpID0gMDsKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRGb250RGF0YSh2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSA9IDA7CisgIHZpcnR1YWwgaW50IEdldEZhY2VJbmRleCh2b2lkKiBoRm9udCkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIHZvaWQgRGVsZXRlRm9udCh2b2lkKiBoRm9udCkgPSAwOworICB2aXJ0dWFsIHZvaWQqIFJldGFpbkZvbnQodm9pZCogaEZvbnQpIHsgcmV0dXJuIE5VTEw7IH0KKworIHByb3RlY3RlZDoKKyAgfklGWF9TeXN0ZW1Gb250SW5mbygpIHt9CiB9OwotY2xhc3MgQ0ZYX0ZvbGRlckZvbnRJbmZvIDogcHVibGljIElGWF9TeXN0ZW1Gb250SW5mbwotewotcHVibGljOgotICAgIENGWF9Gb2xkZXJGb250SW5mbygpOwotICAgIHZpcnR1YWwgfkNGWF9Gb2xkZXJGb250SW5mbygpOworY2xhc3MgQ0ZYX0ZvbGRlckZvbnRJbmZvIDogcHVibGljIElGWF9TeXN0ZW1Gb250SW5mbyB7CisgcHVibGljOgorICBDRlhfRm9sZGVyRm9udEluZm8oKTsKKyAgdmlydHVhbCB+Q0ZYX0ZvbGRlckZvbnRJbmZvKCk7CiAKLSAgICB2b2lkIEFkZFBhdGgoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBwYXRoKTsKKyAgdm9pZCBBZGRQYXRoKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcGF0aCk7CiAKLSAgICAvLyBJRlhfU3l0ZW1Gb250SW5mbzoKLSAgICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikgb3ZlcnJpZGU7Ci0gICAgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LAotICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFjZSwgaW50JiBiRXhhY3QpIG92ZXJyaWRlOwotICAgIHZvaWQqIE1hcEZvbnRCeVVuaWNvZGUoRlhfRFdPUkQgZHdVbmljb2RlLCBpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5KSBvdmVycmlkZTsKLSAgICB2b2lkKiBHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpIG92ZXJyaWRlOwotICAgIEZYX0RXT1JEIEdldEZvbnREYXRhKHZvaWQqIGhGb250LCBGWF9EV09SRCB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpIG92ZXJyaWRlOwotICAgIHZvaWQgRGVsZXRlRm9udCh2b2lkKiBoRm9udCkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkgb3ZlcnJpZGU7CisgIC8vIElGWF9TeXRlbUZvbnRJbmZvOgorICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIG92ZXJyaWRlOworICB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFjZSwKKyAgICAgICAgICAgICAgICBpbnQmIGJFeGFjdCkgb3ZlcnJpZGU7CisgIHZvaWQqIE1hcEZvbnRCeVVuaWNvZGUoRlhfRFdPUkQgZHdVbmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHkpIG92ZXJyaWRlOworICB2b2lkKiBHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpIG92ZXJyaWRlOworICBGWF9EV09SRCBHZXRGb250RGF0YSh2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgRGVsZXRlRm9udCh2b2lkKiBoRm9udCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSBvdmVycmlkZTsKIAotcHJvdGVjdGVkOgotICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIJbV9Gb250TGlzdDsKLSAgICBDRlhfQnl0ZVN0cmluZ0FycmF5CW1fUGF0aExpc3Q7Ci0gICAgQ0ZYX0ZvbnRNYXBwZXIqCQltX3BNYXBwZXI7Ci0gICAgdm9pZAkJCQlTY2FuUGF0aChDRlhfQnl0ZVN0cmluZyYgcGF0aCk7Ci0gICAgdm9pZAkJCQlTY2FuRmlsZShDRlhfQnl0ZVN0cmluZyYgcGF0aCk7Ci0gICAgdm9pZAkJCQlSZXBvcnRGYWNlKENGWF9CeXRlU3RyaW5nJiBwYXRoLCBGWFNZU19GSUxFKiBwRmlsZSwgRlhfRFdPUkQgZmlsZXNpemUsIEZYX0RXT1JEIG9mZnNldCk7CisgcHJvdGVjdGVkOgorICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyIG1fRm9udExpc3Q7CisgIENGWF9CeXRlU3RyaW5nQXJyYXkgbV9QYXRoTGlzdDsKKyAgQ0ZYX0ZvbnRNYXBwZXIqIG1fcE1hcHBlcjsKKyAgdm9pZCBTY2FuUGF0aChDRlhfQnl0ZVN0cmluZyYgcGF0aCk7CisgIHZvaWQgU2NhbkZpbGUoQ0ZYX0J5dGVTdHJpbmcmIHBhdGgpOworICB2b2lkIFJlcG9ydEZhY2UoQ0ZYX0J5dGVTdHJpbmcmIHBhdGgsCisgICAgICAgICAgICAgICAgICBGWFNZU19GSUxFKiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2Zmc2V0KTsKIH07Ci1jbGFzcyBDRlhfQ291bnRlZEZhY2VDYWNoZQotewotcHVibGljOgotICAgIENGWF9GYWNlQ2FjaGUqCW1fT2JqOwotICAgIEZYX0RXT1JECQltX25Db3VudDsKK2NsYXNzIENGWF9Db3VudGVkRmFjZUNhY2hlIHsKKyBwdWJsaWM6CisgIENGWF9GYWNlQ2FjaGUqIG1fT2JqOworICBGWF9EV09SRCBtX25Db3VudDsKIH07CiAKLWNsYXNzIENGWF9Gb250Q2FjaGUKLXsKLXB1YmxpYzoKLSAgICB+Q0ZYX0ZvbnRDYWNoZSgpOwotICAgIENGWF9GYWNlQ2FjaGUqCQkJR2V0Q2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpOwotICAgIHZvaWQJCQkJCVJlbGVhc2VDYWNoZWRGYWNlKENGWF9Gb250KiBwRm9udCk7Ci0gICAgdm9pZAkJCQkJRnJlZUNhY2hlKEZYX0JPT0wgYlJlbGVhc2UgPSBGQUxTRSk7CitjbGFzcyBDRlhfRm9udENhY2hlIHsKKyBwdWJsaWM6CisgIH5DRlhfRm9udENhY2hlKCk7CisgIENGWF9GYWNlQ2FjaGUqIEdldENhY2hlZEZhY2UoQ0ZYX0ZvbnQqIHBGb250KTsKKyAgdm9pZCBSZWxlYXNlQ2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpOworICB2b2lkIEZyZWVDYWNoZShGWF9CT09MIGJSZWxlYXNlID0gRkFMU0UpOwogCi1wcml2YXRlOgotICAgIHVzaW5nIENGWF9GVENhY2hlTWFwID0gc3RkOjptYXA8RlhGVF9GYWNlLCBDRlhfQ291bnRlZEZhY2VDYWNoZSo+OwotICAgIENGWF9GVENhY2hlTWFwIG1fRlRGYWNlTWFwOwotICAgIENGWF9GVENhY2hlTWFwIG1fRXh0RmFjZU1hcDsKKyBwcml2YXRlOgorICB1c2luZyBDRlhfRlRDYWNoZU1hcCA9IHN0ZDo6bWFwPEZYRlRfRmFjZSwgQ0ZYX0NvdW50ZWRGYWNlQ2FjaGUqPjsKKyAgQ0ZYX0ZUQ2FjaGVNYXAgbV9GVEZhY2VNYXA7CisgIENGWF9GVENhY2hlTWFwIG1fRXh0RmFjZU1hcDsKIH07Ci1jbGFzcyBDRlhfQXV0b0ZvbnRDYWNoZQotewotcHVibGljOgotICAgIENGWF9BdXRvRm9udENhY2hlKENGWF9Gb250Q2FjaGUqIHBGb250Q2FjaGUsIENGWF9Gb250KiBwRm9udCkKLSAgICAgICAgOiBtX3BGb250Q2FjaGUocEZvbnRDYWNoZSkKLSAgICAgICAgLCBtX3BGb250KHBGb250KQotICAgIHsKLSAgICB9Ci0gICAgfkNGWF9BdXRvRm9udENhY2hlKCkKLSAgICB7Ci0gICAgICAgIG1fcEZvbnRDYWNoZS0+UmVsZWFzZUNhY2hlZEZhY2UobV9wRm9udCk7Ci0gICAgfQotICAgIENGWF9Gb250Q2FjaGUqIG1fcEZvbnRDYWNoZTsKLSAgICBDRlhfRm9udCogbV9wRm9udDsKK2NsYXNzIENGWF9BdXRvRm9udENhY2hlIHsKKyBwdWJsaWM6CisgIENGWF9BdXRvRm9udENhY2hlKENGWF9Gb250Q2FjaGUqIHBGb250Q2FjaGUsIENGWF9Gb250KiBwRm9udCkKKyAgICAgIDogbV9wRm9udENhY2hlKHBGb250Q2FjaGUpLCBtX3BGb250KHBGb250KSB7fQorICB+Q0ZYX0F1dG9Gb250Q2FjaGUoKSB7IG1fcEZvbnRDYWNoZS0+UmVsZWFzZUNhY2hlZEZhY2UobV9wRm9udCk7IH0KKyAgQ0ZYX0ZvbnRDYWNoZSogbV9wRm9udENhY2hlOworICBDRlhfRm9udCogbV9wRm9udDsKIH07Ci0jZGVmaW5lIEZYX0ZPTlRDQUNIRV9ERUZJTkUocEZvbnRDYWNoZSwgcEZvbnQpIENGWF9BdXRvRm9udENhY2hlIGF1dG9Gb250Q2FjaGUoKHBGb250Q2FjaGUpLCAocEZvbnQpKQotY2xhc3MgQ0ZYX0dseXBoQml0bWFwCi17Ci1wdWJsaWM6Ci0gICAgaW50CQkJCQkJbV9Ub3A7Ci0gICAgaW50CQkJCQkJbV9MZWZ0OwotICAgIENGWF9ESUJpdG1hcAkJCW1fQml0bWFwOworI2RlZmluZSBGWF9GT05UQ0FDSEVfREVGSU5FKHBGb250Q2FjaGUsIHBGb250KSBcCisgIENGWF9BdXRvRm9udENhY2hlIGF1dG9Gb250Q2FjaGUoKHBGb250Q2FjaGUpLCAocEZvbnQpKQorY2xhc3MgQ0ZYX0dseXBoQml0bWFwIHsKKyBwdWJsaWM6CisgIGludCBtX1RvcDsKKyAgaW50IG1fTGVmdDsKKyAgQ0ZYX0RJQml0bWFwIG1fQml0bWFwOwogfTsKLWNsYXNzIENGWF9GYWNlQ2FjaGUKLXsKLXB1YmxpYzoKLSAgICB+Q0ZYX0ZhY2VDYWNoZSgpOwotICAgIGNvbnN0IENGWF9HbHlwaEJpdG1hcCoJTG9hZEdseXBoQml0bWFwKENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX0JPT0wgYkZvbnRTdHlsZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBhbnRpX2FsaWFzLCBpbnQmIHRleHRfZmxhZ3MpOwotICAgIGNvbnN0IENGWF9QYXRoRGF0YSoJCUxvYWRHbHlwaFBhdGgoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgaW50IGRlc3Rfd2lkdGgpOworY2xhc3MgQ0ZYX0ZhY2VDYWNoZSB7CisgcHVibGljOgorICB+Q0ZYX0ZhY2VDYWNoZSgpOworICBjb25zdCBDRlhfR2x5cGhCaXRtYXAqIExvYWRHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb250U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB0ZXh0X2ZsYWdzKTsKKyAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBMb2FkR2x5cGhQYXRoKENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgpOwogCisgIENGWF9GYWNlQ2FjaGUoRlhGVF9GYWNlIGZhY2UpOwogCi0gICAgQ0ZYX0ZhY2VDYWNoZShGWEZUX0ZhY2UgZmFjZSk7Ci1wcml2YXRlOgotICAgIEZYRlRfRmFjZQkJCQltX0ZhY2U7Ci0gICAgQ0ZYX0dseXBoQml0bWFwKgkJUmVuZGVyR2x5cGgoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcyk7Ci0gICAgQ0ZYX0dseXBoQml0bWFwKgkJUmVuZGVyR2x5cGhfTmF0aXZldGV4dChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LAotICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgaW50IGRlc3Rfd2lkdGgsIGludCBhbnRpX2FsaWFzKTsKLSAgICBDRlhfR2x5cGhCaXRtYXAqICAgICAgICBMb29rVXBHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENGWF9CeXRlU3RyaW5nQyYgRmFjZUdseXBoc0tleSwKLSAgICAgICAgICAgIEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9CT09MIGJGb250U3R5bGUsIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcyk7Ci0gICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX1NpemVNYXA7Ci0gICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9QYXRoTWFwOwotICAgIENGWF9ESUJpdG1hcCogICAgICAgICAgIG1fcEJpdG1hcDsKKyBwcml2YXRlOgorICBGWEZUX0ZhY2UgbV9GYWNlOworICBDRlhfR2x5cGhCaXRtYXAqIFJlbmRlckdseXBoKENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb250U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcyk7CisgIENGWF9HbHlwaEJpdG1hcCogUmVuZGVyR2x5cGhfTmF0aXZldGV4dChDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbnRpX2FsaWFzKTsKKyAgQ0ZYX0dseXBoQml0bWFwKiBMb29rVXBHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MmIEZhY2VHbHlwaHNLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9udFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbnRpX2FsaWFzKTsKKyAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX1NpemVNYXA7CisgIENGWF9NYXBQdHJUb1B0ciBtX1BhdGhNYXA7CisgIENGWF9ESUJpdG1hcCogbV9wQml0bWFwOwogCi0gICAgdm9pZAkJCQkgICAgSW5pdFBsYXRmb3JtKCk7Ci0gICAgdm9pZAkJCQkgICAgRGVzdHJveVBsYXRmb3JtKCk7CisgIHZvaWQgSW5pdFBsYXRmb3JtKCk7CisgIHZvaWQgRGVzdHJveVBsYXRmb3JtKCk7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IENGWF9HbHlwaEJpdG1hcCoJbV9wR2x5cGg7Ci0gICAgaW50CQkJCQltX09yaWdpblgsIG1fT3JpZ2luWTsKLSAgICBGWF9GTE9BVAkJCW1fZk9yaWdpblgsIG1fZk9yaWdpblk7CisgIGNvbnN0IENGWF9HbHlwaEJpdG1hcCogbV9wR2x5cGg7CisgIGludCBtX09yaWdpblgsIG1fT3JpZ2luWTsKKyAgRlhfRkxPQVQgbV9mT3JpZ2luWCwgbV9mT3JpZ2luWTsKIH0gRlhURVhUX0dMWVBIUE9TOwotRlhfUkVDVCBGWEdFX0dldEdseXBoc0JCb3goRlhURVhUX0dMWVBIUE9TKiBwR2x5cGhBbmRQb3MsIGludCBuQ2hhcnMsIGludCBhbnRpX2FsaWFzLCBGWF9GTE9BVCByZXRpbmFTY2FsZVggPSAxLjBmLCBGWF9GTE9BVCByZXRpbmFTY2FsZVkgPSAxLjBmKTsKLUZYX0JPT0wJT3V0cHV0R2x5cGgodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgdW5zaWduZWQgbG9uZyBnbHlwaF9pbmRleCwgdW5zaWduZWQgbG9uZyBhcmdiKTsKLUZYX0JPT0wJT3V0cHV0VGV4dCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LCBkb3VibGUgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0X21hdHJpeCwgdW5zaWduZWQgc2hvcnQgY29uc3QqIHRleHQsIHVuc2lnbmVkIGxvbmcgYXJnYik7Ci1jbGFzcyBJRlhfR1NVQlRhYmxlCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIElGWF9HU1VCVGFibGUqIENyZWF0ZShDRlhfRm9udCogcEZvbnQpOwotICAgIHZpcnR1YWwgfklGWF9HU1VCVGFibGUoKSB7IH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0VmVydGljYWxHbHlwaChGWF9EV09SRCBnbHlwaG51bSwgRlhfRFdPUkQqIHZnbHlwaG51bSkgPSAwOworRlhfUkVDVCBGWEdFX0dldEdseXBoc0JCb3goRlhURVhUX0dMWVBIUE9TKiBwR2x5cGhBbmRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFudGlfYWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVggPSAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmV0aW5hU2NhbGVZID0gMS4wZik7CitGWF9CT09MIE91dHB1dEdseXBoKHZvaWQqIGRpYiwKKyAgICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYik7CitGWF9CT09MIE91dHB1dFRleHQodm9pZCogZGliLAorICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0X21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBjb25zdCogdGV4dCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ2IpOworY2xhc3MgSUZYX0dTVUJUYWJsZSB7CisgcHVibGljOgorICBzdGF0aWMgSUZYX0dTVUJUYWJsZSogQ3JlYXRlKENGWF9Gb250KiBwRm9udCk7CisgIHZpcnR1YWwgfklGWF9HU1VCVGFibGUoKSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0VmVydGljYWxHbHlwaChGWF9EV09SRCBnbHlwaG51bSwgRlhfRFdPUkQqIHZnbHlwaG51bSkgPSAwOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlhHRV9GWF9GT05UX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaAppbmRleCA3N2YzMGQ1Li5jN2M4Mjk1IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgKQEAgLTMwLDcgKzMwLDggQEAKICNkZWZpbmUgRlhGVF9FTkNPRElOR19KT0hBQiBGVF9FTkNPRElOR19KT0hBQgogI2RlZmluZSBGWEZUX0VOQ09ESU5HX1dBTlNVTkcgRlRfRU5DT0RJTkdfV0FOU1VORwogI2RlZmluZSBGWEZUX0xPQURfTk9fU0NBTEUgRlRfTE9BRF9OT19TQ0FMRQotI2RlZmluZSBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIIEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRICisjZGVmaW5lIEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEggXAorICBGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSAogI2RlZmluZSBGWEZUX1JFTkRFUl9NT0RFX0xDRCBGVF9SRU5ERVJfTU9ERV9MQ0QKICNkZWZpbmUgRlhGVF9SRU5ERVJfTU9ERV9NT05PIEZUX1JFTkRFUl9NT0RFX01PTk8KICNkZWZpbmUgRlhGVF9SRU5ERVJfTU9ERV9OT1JNQUwgRlRfUkVOREVSX01PREVfTk9STUFMCkBAIC00MSw1NyArNDIsNzMgQEAKICNkZWZpbmUgRlhGVF9TVFlMRV9GTEFHX0lUQUxJQyBGVF9TVFlMRV9GTEFHX0lUQUxJQwogI2RlZmluZSBGWEZUX1NUWUxFX0ZMQUdfQk9MRCBGVF9TVFlMRV9GTEFHX0JPTEQKICNkZWZpbmUgRlhGVF9GQUNFX0ZMQUdfU0ZOVCBGVF9GQUNFX0ZMQUdfU0ZOVAotI2RlZmluZSBGWEZUX0ZBQ0VfRkxBR19UUklDS1kgKCAxTCA8PCAxMyApCi10eXBlZGVmIEZUX01NX1ZhcioJCUZYRlRfTU1fVmFyOwotdHlwZWRlZiBGVF9CaXRtYXAqCQlGWEZUX0JpdG1hcDsKLSNkZWZpbmUgRlhGVF9NYXRyaXgJCUZUX01hdHJpeAotI2RlZmluZSBGWEZUX1ZlY3RvcgkJRlRfVmVjdG9yCisjZGVmaW5lIEZYRlRfRkFDRV9GTEFHX1RSSUNLWSAoMUwgPDwgMTMpCit0eXBlZGVmIEZUX01NX1ZhciogRlhGVF9NTV9WYXI7Cit0eXBlZGVmIEZUX0JpdG1hcCogRlhGVF9CaXRtYXA7CisjZGVmaW5lIEZYRlRfTWF0cml4IEZUX01hdHJpeAorI2RlZmluZSBGWEZUX1ZlY3RvciBGVF9WZWN0b3IKICNkZWZpbmUgRlhGVF9PdXRsaW5lX0Z1bmNzIEZUX091dGxpbmVfRnVuY3MKLXR5cGVkZWYgRlRfT3Blbl9BcmdzCUZYRlRfT3Blbl9BcmdzOwotdHlwZWRlZiBGVF9TdHJlYW1SZWMJRlhGVF9TdHJlYW1SZWM7Ci10eXBlZGVmIEZUX1N0cmVhbVJlYyoJRlhGVF9TdHJlYW07Ci10eXBlZGVmIEZUX0JCb3gJCQlGWEZUX0JCb3g7Ci10eXBlZGVmIEZUX0dseXBoCQlGWEZUX0dseXBoOwotdHlwZWRlZiBGVF9DaGFyTWFwCQlGWEZUX0NoYXJNYXA7Ci0jZGVmaW5lIEZYRlRfR0xZUEhfQkJPWF9QSVhFTFMJRlRfR0xZUEhfQkJPWF9QSVhFTFMKK3R5cGVkZWYgRlRfT3Blbl9BcmdzIEZYRlRfT3Blbl9BcmdzOwordHlwZWRlZiBGVF9TdHJlYW1SZWMgRlhGVF9TdHJlYW1SZWM7Cit0eXBlZGVmIEZUX1N0cmVhbVJlYyogRlhGVF9TdHJlYW07Cit0eXBlZGVmIEZUX0JCb3ggRlhGVF9CQm94OwordHlwZWRlZiBGVF9HbHlwaCBGWEZUX0dseXBoOwordHlwZWRlZiBGVF9DaGFyTWFwIEZYRlRfQ2hhck1hcDsKKyNkZWZpbmUgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUyBGVF9HTFlQSF9CQk9YX1BJWEVMUwogI2RlZmluZSBGWEZUX09wZW5fRmFjZShsaWJyYXJ5LCBhcmdzLCBpbmRleCwgZmFjZSkgXAotICAgIEZUX09wZW5fRmFjZSgoRlRfTGlicmFyeSkobGlicmFyeSksIGFyZ3MsIGluZGV4LCAoRlRfRmFjZSopKGZhY2UpKQorICBGVF9PcGVuX0ZhY2UoKEZUX0xpYnJhcnkpKGxpYnJhcnkpLCBhcmdzLCBpbmRleCwgKEZUX0ZhY2UqKShmYWNlKSkKICNkZWZpbmUgRlhGVF9Eb25lX0ZhY2UoZmFjZSkgRlRfRG9uZV9GYWNlKChGVF9GYWNlKShmYWNlKSkKICNkZWZpbmUgRlhGVF9Eb25lX0ZyZWVUeXBlKGxpYnJhcnkpIEZUX0RvbmVfRnJlZVR5cGUoKEZUX0xpYnJhcnkpKGxpYnJhcnkpKQogI2RlZmluZSBGWEZUX0luaXRfRnJlZVR5cGUobGlicmFyeSkgRlRfSW5pdF9GcmVlVHlwZSgoRlRfTGlicmFyeSopKGxpYnJhcnkpKQogI2RlZmluZSBGWEZUX05ld19NZW1vcnlfRmFjZShsaWJyYXJ5LCBiYXNlLCBzaXplLCBpbmRleCwgZmFjZSkgXAotICAgIEZUX05ld19NZW1vcnlfRmFjZSgoRlRfTGlicmFyeSkobGlicmFyeSksIGJhc2UsIHNpemUsIGluZGV4LCAoRlRfRmFjZSopKGZhY2UpKQorICBGVF9OZXdfTWVtb3J5X0ZhY2UoKEZUX0xpYnJhcnkpKGxpYnJhcnkpLCBiYXNlLCBzaXplLCBpbmRleCwgKEZUX0ZhY2UqKShmYWNlKSkKICNkZWZpbmUgRlhGVF9OZXdfRmFjZShsaWJyYXJ5LCBmaWxlbmFtZSwgaW5kZXgsIGZhY2UpIFwKLSAgICBGVF9OZXdfRmFjZSgoRlRfTGlicmFyeSkobGlicmFyeSksIGZpbGVuYW1lLCBpbmRleCwgKEZUX0ZhY2UqKShmYWNlKSkKKyAgRlRfTmV3X0ZhY2UoKEZUX0xpYnJhcnkpKGxpYnJhcnkpLCBmaWxlbmFtZSwgaW5kZXgsIChGVF9GYWNlKikoZmFjZSkpCiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfRnJlZVR5cGUoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5kcml2ZXItPnJvb3QubGlicmFyeQotI2RlZmluZSBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIGVuY29kaW5nKSBGVF9TZWxlY3RfQ2hhcm1hcCgoRlRfRmFjZSlmYWNlLCAoRlRfRW5jb2RpbmcpZW5jb2RpbmcpCi0jZGVmaW5lIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgY2hhcm1hcCkgRlRfU2V0X0NoYXJtYXAoKEZUX0ZhY2UpZmFjZSwgKEZUX0NoYXJNYXApY2hhcm1hcCkKLSNkZWZpbmUgRlhGVF9Mb2FkX0dseXBoKGZhY2UsIGdseXBoX2luZGV4LCBmbGFncykgRlRfTG9hZF9HbHlwaCgoRlRfRmFjZSlmYWNlLCBnbHlwaF9pbmRleCwgZmxhZ3MpCisjZGVmaW5lIEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgZW5jb2RpbmcpIFwKKyAgRlRfU2VsZWN0X0NoYXJtYXAoKEZUX0ZhY2UpZmFjZSwgKEZUX0VuY29kaW5nKWVuY29kaW5nKQorI2RlZmluZSBGWEZUX1NldF9DaGFybWFwKGZhY2UsIGNoYXJtYXApIFwKKyAgRlRfU2V0X0NoYXJtYXAoKEZUX0ZhY2UpZmFjZSwgKEZUX0NoYXJNYXApY2hhcm1hcCkKKyNkZWZpbmUgRlhGVF9Mb2FkX0dseXBoKGZhY2UsIGdseXBoX2luZGV4LCBmbGFncykgXAorICBGVF9Mb2FkX0dseXBoKChGVF9GYWNlKWZhY2UsIGdseXBoX2luZGV4LCBmbGFncykKICNkZWZpbmUgRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjb2RlKSBGVF9HZXRfQ2hhcl9JbmRleCgoRlRfRmFjZSlmYWNlLCBjb2RlKQotI2RlZmluZSBGWEZUX0dldF9HbHlwaF9OYW1lKGZhY2UsIGluZGV4LCBidWZmZXIsIHNpemUpIEZUX0dldF9HbHlwaF9OYW1lKChGVF9GYWNlKWZhY2UsIGluZGV4LCBidWZmZXIsIHNpemUpCisjZGVmaW5lIEZYRlRfR2V0X0dseXBoX05hbWUoZmFjZSwgaW5kZXgsIGJ1ZmZlciwgc2l6ZSkgXAorICBGVF9HZXRfR2x5cGhfTmFtZSgoRlRfRmFjZSlmYWNlLCBpbmRleCwgYnVmZmVyLCBzaXplKQogI2RlZmluZSBGWEZUX0dldF9OYW1lX0luZGV4KGZhY2UsIG5hbWUpIEZUX0dldF9OYW1lX0luZGV4KChGVF9GYWNlKWZhY2UsIG5hbWUpCi0jZGVmaW5lIEZYRlRfSGFzX0dseXBoX05hbWVzKGZhY2UpICAoKChGVF9GYWNlKWZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTKQorI2RlZmluZSBGWEZUX0hhc19HbHlwaF9OYW1lcyhmYWNlKSBcCisgICgoKEZUX0ZhY2UpZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMpCiAjZGVmaW5lIEZYRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShmYWNlKSBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKChGVF9GYWNlKWZhY2UpCiAjZGVmaW5lIEZYRlRfTG9hZF9TZm50X1RhYmxlKGZhY2UsIHRhZywgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCkgXAotICAgIEZUX0xvYWRfU2ZudF9UYWJsZSgoRlRfRmFjZSlmYWNlLCB0YWcsIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgpCi0jZGVmaW5lIEZYRlRfR2V0X0ZpcnN0X0NoYXIoZmFjZSwgZ2x5cGhfaW5kZXgpIEZUX0dldF9GaXJzdF9DaGFyKChGVF9GYWNlKWZhY2UsIGdseXBoX2luZGV4KQotI2RlZmluZSBGWEZUX0dldF9OZXh0X0NoYXIoZmFjZSwgY29kZSwgZ2x5cGhfaW5kZXgpIEZUX0dldF9OZXh0X0NoYXIoKEZUX0ZhY2UpZmFjZSwgY29kZSwgZ2x5cGhfaW5kZXgpCi0jZGVmaW5lIEZYRlRfQ2xlYXJfRmFjZV9FeHRlcm5hbF9TdHJlYW0oZmFjZSkgKCgoRlRfRmFjZSlmYWNlKS0+ZmFjZV9mbGFncyY9fkZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0pCi0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKGZhY2UpICgoKEZUX0ZhY2UpZmFjZSktPmZhY2VfZmxhZ3MmRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSkKLSNkZWZpbmUgRlhGVF9Jc19GYWNlX1RUX09UKGZhY2UpICgoKEZUX0ZhY2UpZmFjZSktPmZhY2VfZmxhZ3MmRlRfRkFDRV9GTEFHX1NGTlQpCi0jZGVmaW5lIEZYRlRfSXNfRmFjZV9Ucmlja3koZmFjZSkgKCgoRlRfRmFjZSlmYWNlKS0+ZmFjZV9mbGFncyZGWEZUX0ZBQ0VfRkxBR19UUklDS1kpCi0jZGVmaW5lIEZYRlRfSXNfRmFjZV9maXhlZHdpZHRoKGZhY2UpICgoKEZUX0ZhY2UpZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEgpCisgIEZUX0xvYWRfU2ZudF9UYWJsZSgoRlRfRmFjZSlmYWNlLCB0YWcsIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgpCisjZGVmaW5lIEZYRlRfR2V0X0ZpcnN0X0NoYXIoZmFjZSwgZ2x5cGhfaW5kZXgpIFwKKyAgRlRfR2V0X0ZpcnN0X0NoYXIoKEZUX0ZhY2UpZmFjZSwgZ2x5cGhfaW5kZXgpCisjZGVmaW5lIEZYRlRfR2V0X05leHRfQ2hhcihmYWNlLCBjb2RlLCBnbHlwaF9pbmRleCkgXAorICBGVF9HZXRfTmV4dF9DaGFyKChGVF9GYWNlKWZhY2UsIGNvZGUsIGdseXBoX2luZGV4KQorI2RlZmluZSBGWEZUX0NsZWFyX0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKGZhY2UpIFwKKyAgKCgoRlRfRmFjZSlmYWNlKS0+ZmFjZV9mbGFncyAmPSB+RlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSkKKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0oZmFjZSkgXAorICAoKChGVF9GYWNlKWZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSkKKyNkZWZpbmUgRlhGVF9Jc19GYWNlX1RUX09UKGZhY2UpIFwKKyAgKCgoRlRfRmFjZSlmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UKQorI2RlZmluZSBGWEZUX0lzX0ZhY2VfVHJpY2t5KGZhY2UpIFwKKyAgKCgoRlRfRmFjZSlmYWNlKS0+ZmFjZV9mbGFncyAmIEZYRlRfRkFDRV9GTEFHX1RSSUNLWSkKKyNkZWZpbmUgRlhGVF9Jc19GYWNlX2ZpeGVkd2lkdGgoZmFjZSkgXAorICAoKChGVF9GYWNlKWZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIKQogI2RlZmluZSBGWEZUX0dldF9GYWNlX1N0cmVhbV9CYXNlKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+c3RyZWFtLT5iYXNlCiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfU3RyZWFtX1NpemUoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5zdHJlYW0tPnNpemUKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9GYW1pbHlfTmFtZShmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmZhbWlseV9uYW1lCiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfU3R5bGVfTmFtZShmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPnN0eWxlX25hbWUKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9OdW1mYWNlcyhmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPm51bV9mYWNlcwogI2RlZmluZSBGWEZUX0dldF9GYWNlX0ZhY2VpbmRleChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmZhY2VfaW5kZXgKLSNkZWZpbmUgRlhGVF9Jc19GYWNlX0l0YWxpYyhmYWNlKSAoKChGVF9GYWNlKWZhY2UpLT5zdHlsZV9mbGFncyZGVF9TVFlMRV9GTEFHX0lUQUxJQykKLSNkZWZpbmUgRlhGVF9Jc19GYWNlX0JvbGQoZmFjZSkgKCgoRlRfRmFjZSlmYWNlKS0+c3R5bGVfZmxhZ3MmRlRfU1RZTEVfRkxBR19CT0xEKQorI2RlZmluZSBGWEZUX0lzX0ZhY2VfSXRhbGljKGZhY2UpIFwKKyAgKCgoRlRfRmFjZSlmYWNlKS0+c3R5bGVfZmxhZ3MgJiBGVF9TVFlMRV9GTEFHX0lUQUxJQykKKyNkZWZpbmUgRlhGVF9Jc19GYWNlX0JvbGQoZmFjZSkgXAorICAoKChGVF9GYWNlKWZhY2UpLT5zdHlsZV9mbGFncyAmIEZUX1NUWUxFX0ZMQUdfQk9MRCkKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmNoYXJtYXBzCi0jZGVmaW5lIEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWAotI2RlZmluZSBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1koZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1kKKyNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKGZhY2UpIFwKKyAgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1gKKyNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKGZhY2UpIFwKKyAgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1kKICNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfV2lkdGgoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy53aWR0aAogI2RlZmluZSBGWEZUX0dldF9HbHlwaF9IZWlnaHQoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy5oZWlnaHQKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5udW1fY2hhcm1hcHMKQEAgLTEwNSwyMyArMTIyLDMwIEBACiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfeU1pbihmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmJib3gueU1pbgogI2RlZmluZSBGWEZUX0dldF9GYWNlX3lNYXgoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5iYm94LnlNYXgKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9IZWlnaHQoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5oZWlnaHQKLSNkZWZpbmUgRlhGVF9HZXRfRmFjZV9VbmRlckxpbmVUaGlja25lc3MoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT51bmRlcmxpbmVfdGhpY2tuZXNzCi0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfVW5kZXJMaW5lUG9zaXRpb24oZmFjZSkgKChGVF9GYWNlKWZhY2UpLT51bmRlcmxpbmVfcG9zaXRpb24KKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9VbmRlckxpbmVUaGlja25lc3MoZmFjZSkgXAorICAoKEZUX0ZhY2UpZmFjZSktPnVuZGVybGluZV90aGlja25lc3MKKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9VbmRlckxpbmVQb3NpdGlvbihmYWNlKSBcCisgICgoRlRfRmFjZSlmYWNlKS0+dW5kZXJsaW5lX3Bvc2l0aW9uCiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfTWF4QWR2YW5jZVdpZHRoKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+bWF4X2FkdmFuY2Vfd2lkdGgKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmFzY2VuZGVyCiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+ZGVzY2VuZGVyCi0jZGVmaW5lIEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+Z2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UKKyNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UoZmFjZSkgXAorICAoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlCiAjZGVmaW5lIEZYRlRfR2V0X01NX0F4aXModmFyLCBpbmRleCkgJigoRlRfTU1fVmFyKil2YXIpLT5heGlzW2luZGV4XQogI2RlZmluZSBGWEZUX0dldF9NTV9BeGlzX01pbihheGlzKSAoKEZUX1Zhcl9BeGlzKilheGlzKS0+bWluaW11bQogI2RlZmluZSBGWEZUX0dldF9NTV9BeGlzX01heChheGlzKSAoKEZUX1Zhcl9BeGlzKilheGlzKS0+bWF4aW11bQogI2RlZmluZSBGWEZUX0dldF9NTV9BeGlzX0RlZihheGlzKSAoKEZUX1Zhcl9BeGlzKilheGlzKS0+ZGVmCi0jZGVmaW5lIEZYRlRfQWxsb2MobGlicmFyeSwgc2l6ZSkgKChGVF9MaWJyYXJ5KWxpYnJhcnkpLT5tZW1vcnktPmFsbG9jKCgoRlRfTGlicmFyeSlsaWJyYXJ5KS0+bWVtb3J5LCBzaXplKQotI2RlZmluZSBGWEZUX0ZyZWUoZmFjZSwgcCkgKChGVF9GYWNlKWZhY2UpLT5tZW1vcnktPmZyZWUoKChGVF9GYWNlKWZhY2UpLT5tZW1vcnksIHApCisjZGVmaW5lIEZYRlRfQWxsb2MobGlicmFyeSwgc2l6ZSkgXAorICAoKEZUX0xpYnJhcnkpbGlicmFyeSktPm1lbW9yeS0+YWxsb2MoKChGVF9MaWJyYXJ5KWxpYnJhcnkpLT5tZW1vcnksIHNpemUpCisjZGVmaW5lIEZYRlRfRnJlZShmYWNlLCBwKSBcCisgICgoRlRfRmFjZSlmYWNlKS0+bWVtb3J5LT5mcmVlKCgoRlRfRmFjZSlmYWNlKS0+bWVtb3J5LCBwKQogI2RlZmluZSBGWEZUX0dldF9HbHlwaF9PdXRsaW5lKGZhY2UpICYoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5vdXRsaW5lCi0jZGVmaW5lIEZYRlRfR2V0X091dGxpbmVfQmJveChvdXRsaW5lLCBjYm94KSAgRlRfT3V0bGluZV9HZXRfQ0JveChvdXRsaW5lLCBjYm94KQotI2RlZmluZSBGWEZUX1JlbmRlcl9HbHlwaChmYWNlLCBtb2RlKSBGVF9SZW5kZXJfR2x5cGgoKChGVF9GYWNlKWZhY2UpLT5nbHlwaCwgKGVudW0gRlRfUmVuZGVyX01vZGVfKW1vZGUpCisjZGVmaW5lIEZYRlRfR2V0X091dGxpbmVfQmJveChvdXRsaW5lLCBjYm94KSBGVF9PdXRsaW5lX0dldF9DQm94KG91dGxpbmUsIGNib3gpCisjZGVmaW5lIEZYRlRfUmVuZGVyX0dseXBoKGZhY2UsIG1vZGUpIFwKKyAgRlRfUmVuZGVyX0dseXBoKCgoRlRfRmFjZSlmYWNlKS0+Z2x5cGgsIChlbnVtIEZUX1JlbmRlcl9Nb2RlXyltb2RlKQogI2RlZmluZSBGWEZUX0dldF9NTV9WYXIoZmFjZSwgcCkgRlRfR2V0X01NX1ZhcigoRlRfRmFjZSlmYWNlLCBwKQotI2RlZmluZSBGWEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMoZmFjZSwgbiwgcCkgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcygoRlRfRmFjZSlmYWNlLCBuLCBwKQorI2RlZmluZSBGWEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMoZmFjZSwgbiwgcCkgXAorICBGVF9TZXRfTU1fRGVzaWduX0Nvb3JkaW5hdGVzKChGVF9GYWNlKWZhY2UsIG4sIHApCiAjZGVmaW5lIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIHcsIGgpIEZUX1NldF9QaXhlbF9TaXplcygoRlRfRmFjZSlmYWNlLCB3LCBoKQogI2RlZmluZSBGWEZUX1NldF9UcmFuc2Zvcm0oZmFjZSwgbSwgZCkgRlRfU2V0X1RyYW5zZm9ybSgoRlRfRmFjZSlmYWNlLCBtLCBkKQogI2RlZmluZSBGWEZUX091dGxpbmVfRW1ib2xkZW4ob3V0bGluZSwgcykgRlRfT3V0bGluZV9FbWJvbGRlbihvdXRsaW5lLCBzKQpAQCAtMTMzLDEzICsxNTcsMTkgQEAKICNkZWZpbmUgRlhGVF9HZXRfQml0bWFwX0J1ZmZlcihiaXRtYXApICgoRlRfQml0bWFwKiliaXRtYXApLT5idWZmZXIKICNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfQml0bWFwTGVmdChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5iaXRtYXBfbGVmdAogI2RlZmluZSBGWEZUX0dldF9HbHlwaF9CaXRtYXBUb3AoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+Yml0bWFwX3RvcAotI2RlZmluZSBGWEZUX091dGxpbmVfRGVjb21wb3NlKG91dGxpbmUsIGZ1bmNzLCBwYXJhbXMpIEZUX091dGxpbmVfRGVjb21wb3NlKG91dGxpbmUsIGZ1bmNzLCBwYXJhbXMpCi0jZGVmaW5lIEZYRlRfU2V0X0NoYXJfU2l6ZShmYWNlLCBjaGFyX3dpZHRoLCBjaGFyX2hlaWdodCwgaG9yel9yZXNvbHV0aW9uLCB2ZXJ0X3Jlc29sdXRpb24pIEZUX1NldF9DaGFyX1NpemUoZmFjZSwgY2hhcl93aWR0aCwgY2hhcl9oZWlnaHQsIGhvcnpfcmVzb2x1dGlvbiwgdmVydF9yZXNvbHV0aW9uKQorI2RlZmluZSBGWEZUX091dGxpbmVfRGVjb21wb3NlKG91dGxpbmUsIGZ1bmNzLCBwYXJhbXMpIFwKKyAgRlRfT3V0bGluZV9EZWNvbXBvc2Uob3V0bGluZSwgZnVuY3MsIHBhcmFtcykKKyNkZWZpbmUgRlhGVF9TZXRfQ2hhcl9TaXplKGZhY2UsIGNoYXJfd2lkdGgsIGNoYXJfaGVpZ2h0LCBob3J6X3Jlc29sdXRpb24sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRfcmVzb2x1dGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfU2V0X0NoYXJfU2l6ZShmYWNlLCBjaGFyX3dpZHRoLCBjaGFyX2hlaWdodCwgaG9yel9yZXNvbHV0aW9uLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB2ZXJ0X3Jlc29sdXRpb24pCiAjZGVmaW5lIEZYRlRfR2V0X0dseXBoKHNsb3QsIGFnbHlwaCkgRlRfR2V0X0dseXBoKHNsb3QsIGFnbHlwaCkKLSNkZWZpbmUgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgYmJveF9tb2RlLCBhY2JveCkgRlRfR2x5cGhfR2V0X0NCb3goZ2x5cGgsIGJib3hfbW9kZSwgYWNib3gpCi0jZGVmaW5lIEZYRlRfRG9uZV9HbHlwaChnbHlwaCkJRlRfRG9uZV9HbHlwaChnbHlwaCkKLSNkZWZpbmUgRlhGVF9MaWJyYXJ5X1NldExjZEZpbHRlcihsaWJyYXJ5LCBmaWx0ZXIpIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKChGVF9MaWJyYXJ5KShsaWJyYXJ5KSwgZmlsdGVyKQotaW50IEZYRlRfdW5pY29kZV9mcm9tX2Fkb2JlX25hbWUoY29uc3QgY2hhciogIGdseXBoX25hbWUpOworI2RlZmluZSBGWEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBiYm94X21vZGUsIGFjYm94KSBcCisgIEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBiYm94X21vZGUsIGFjYm94KQorI2RlZmluZSBGWEZUX0RvbmVfR2x5cGgoZ2x5cGgpIEZUX0RvbmVfR2x5cGgoZ2x5cGgpCisjZGVmaW5lIEZYRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIobGlicmFyeSwgZmlsdGVyKSBcCisgIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKChGVF9MaWJyYXJ5KShsaWJyYXJ5KSwgZmlsdGVyKQoraW50IEZYRlRfdW5pY29kZV9mcm9tX2Fkb2JlX25hbWUoY29uc3QgY2hhciogZ2x5cGhfbmFtZSk7CiB2b2lkIEZYRlRfYWRvYmVfbmFtZV9mcm9tX3VuaWNvZGUoY2hhciogbmFtZSwgd2NoYXJfdCB1bmljb2RlKTsKICNpZmRlZiBfX2NwbHVzcGx1cwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oCmluZGV4IGRkMzQ5YWQuLjBhYTNmMTcgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaApAQCAtMjIsNzA4ICsyMiw3MTIgQEAKIGNsYXNzIENDb2RlY19Nb2R1bGVNZ3I7CiBjbGFzcyBJRlhHX1BhaW50TW9kdWxlTWdyOwogCi1jbGFzcyBDRlhfR0VNb2R1bGUKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9HRU1vZHVsZSB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBDcmVhdGUoKTsKIAotICAgIHN0YXRpYyB2b2lkCQkJCUNyZWF0ZSgpOworICBzdGF0aWMgdm9pZCBVc2UoQ0ZYX0dFTW9kdWxlKiBwTWdyKTsKIAotICAgIHN0YXRpYyB2b2lkCQkJCVVzZShDRlhfR0VNb2R1bGUqIHBNZ3IpOworICBzdGF0aWMgQ0ZYX0dFTW9kdWxlKiBHZXQoKTsKIAotICAgIHN0YXRpYyBDRlhfR0VNb2R1bGUqCUdldCgpOworICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7CiAKLSAgICBzdGF0aWMgdm9pZAkJCQlEZXN0cm95KCk7Ci1wdWJsaWM6CisgcHVibGljOgorICBDRlhfRm9udENhY2hlKiBHZXRGb250Q2FjaGUoKTsKKyAgQ0ZYX0ZvbnRNZ3IqIEdldEZvbnRNZ3IoKSB7IHJldHVybiBtX3BGb250TWdyOyB9CisgIHZvaWQgU2V0VGV4dEdhbW1hKEZYX0ZMT0FUIGdhbW1hVmFsdWUpOworICBjb25zdCB1aW50OF90KiBHZXRUZXh0R2FtbWFUYWJsZSgpOwogCi0gICAgQ0ZYX0ZvbnRDYWNoZSoJCQlHZXRGb250Q2FjaGUoKTsKLSAgICBDRlhfRm9udE1ncioJCQlHZXRGb250TWdyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BGb250TWdyOwotICAgIH0KLSAgICB2b2lkCQkJCQlTZXRUZXh0R2FtbWEoRlhfRkxPQVQgZ2FtbWFWYWx1ZSk7Ci0gICAgY29uc3QgdWludDhfdCoJCQkJR2V0VGV4dEdhbW1hVGFibGUoKTsKKyAgdm9pZCBTZXRDb2RlY01vZHVsZShDQ29kZWNfTW9kdWxlTWdyKiBwQ29kZWNNb2R1bGUpIHsKKyAgICBtX3BDb2RlY01vZHVsZSA9IHBDb2RlY01vZHVsZTsKKyAgfQorICBDQ29kZWNfTW9kdWxlTWdyKiBHZXRDb2RlY01vZHVsZSgpIHsgcmV0dXJuIG1fcENvZGVjTW9kdWxlOyB9CisgIEZYRlRfTGlicmFyeSBtX0ZUTGlicmFyeTsKKyAgdm9pZCogR2V0UGxhdGZvcm1EYXRhKCkgeyByZXR1cm4gbV9wUGxhdGZvcm1EYXRhOyB9CiAKLSAgICB2b2lkCQkJCQlTZXRDb2RlY01vZHVsZShDQ29kZWNfTW9kdWxlTWdyKiBwQ29kZWNNb2R1bGUpCi0gICAgewotICAgICAgICBtX3BDb2RlY01vZHVsZSA9IHBDb2RlY01vZHVsZTsKLSAgICB9Ci0gICAgQ0NvZGVjX01vZHVsZU1ncioJCUdldENvZGVjTW9kdWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BDb2RlY01vZHVsZTsKLSAgICB9Ci0gICAgRlhGVF9MaWJyYXJ5CQkJbV9GVExpYnJhcnk7Ci0gICAgdm9pZCoJCQkJCUdldFBsYXRmb3JtRGF0YSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wUGxhdGZvcm1EYXRhOwotICAgIH0KLXByb3RlY3RlZDoKKyBwcm90ZWN0ZWQ6CisgIENGWF9HRU1vZHVsZSgpOwogCi0gICAgQ0ZYX0dFTW9kdWxlKCk7CisgIH5DRlhfR0VNb2R1bGUoKTsKKyAgdm9pZCBJbml0UGxhdGZvcm0oKTsKKyAgdm9pZCBEZXN0cm95UGxhdGZvcm0oKTsKIAotICAgIH5DRlhfR0VNb2R1bGUoKTsKLSAgICB2b2lkCQkJCQlJbml0UGxhdGZvcm0oKTsKLSAgICB2b2lkCQkJCQlEZXN0cm95UGxhdGZvcm0oKTsKLXByaXZhdGU6Ci0gICAgdWludDhfdAkJCQkJbV9HYW1tYVZhbHVlWzI1Nl07Ci0gICAgQ0ZYX0ZvbnRDYWNoZSoJCQltX3BGb250Q2FjaGU7Ci0gICAgQ0ZYX0ZvbnRNZ3IqCQkJbV9wRm9udE1ncjsKLSAgICBDQ29kZWNfTW9kdWxlTWdyKgkJbV9wQ29kZWNNb2R1bGU7Ci0gICAgdm9pZCoJCQkJCW1fcFBsYXRmb3JtRGF0YTsKKyBwcml2YXRlOgorICB1aW50OF90IG1fR2FtbWFWYWx1ZVsyNTZdOworICBDRlhfRm9udENhY2hlKiBtX3BGb250Q2FjaGU7CisgIENGWF9Gb250TWdyKiBtX3BGb250TWdyOworICBDQ29kZWNfTW9kdWxlTWdyKiBtX3BDb2RlY01vZHVsZTsKKyAgdm9pZCogbV9wUGxhdGZvcm1EYXRhOwogfTsKIHR5cGVkZWYgc3RydWN0IHsKKyAgRlhfRkxPQVQgbV9Qb2ludFg7CiAKLSAgICBGWF9GTE9BVAkJCW1fUG9pbnRYOworICBGWF9GTE9BVCBtX1BvaW50WTsKIAotICAgIEZYX0ZMT0FUCQkJbV9Qb2ludFk7Ci0KLSAgICBpbnQJCQkJCW1fRmxhZzsKKyAgaW50IG1fRmxhZzsKIH0gRlhfUEFUSFBPSU5UOwotI2RlZmluZSBGWFBUX0NMT1NFRklHVVJFCQkweDAxCi0jZGVmaW5lIEZYUFRfTElORVRPCQkJCTB4MDIKLSNkZWZpbmUgRlhQVF9CRVpJRVJUTwkJCTB4MDQKLSNkZWZpbmUgRlhQVF9NT1ZFVE8JCQkJMHgwNgotI2RlZmluZSBGWFBUX1RZUEUJCQkJMHgwNgotI2RlZmluZSBGWEZJTExfQUxURVJOQVRFCQkxCi0jZGVmaW5lIEZYRklMTF9XSU5ESU5HCQkJMgotY2xhc3MgQ0ZYX0NsaXBSZ24KLXsKLXB1YmxpYzoKKyNkZWZpbmUgRlhQVF9DTE9TRUZJR1VSRSAweDAxCisjZGVmaW5lIEZYUFRfTElORVRPIDB4MDIKKyNkZWZpbmUgRlhQVF9CRVpJRVJUTyAweDA0CisjZGVmaW5lIEZYUFRfTU9WRVRPIDB4MDYKKyNkZWZpbmUgRlhQVF9UWVBFIDB4MDYKKyNkZWZpbmUgRlhGSUxMX0FMVEVSTkFURSAxCisjZGVmaW5lIEZYRklMTF9XSU5ESU5HIDIKK2NsYXNzIENGWF9DbGlwUmduIHsKKyBwdWJsaWM6CisgIENGWF9DbGlwUmduKGludCBkZXZpY2Vfd2lkdGgsIGludCBkZXZpY2VfaGVpZ2h0KTsKIAotICAgIENGWF9DbGlwUmduKGludCBkZXZpY2Vfd2lkdGgsIGludCBkZXZpY2VfaGVpZ2h0KTsKKyAgQ0ZYX0NsaXBSZ24oY29uc3QgRlhfUkVDVCYgcmVjdCk7CiAKLSAgICBDRlhfQ2xpcFJnbihjb25zdCBGWF9SRUNUJiByZWN0KTsKKyAgQ0ZYX0NsaXBSZ24oY29uc3QgQ0ZYX0NsaXBSZ24mIHNyYyk7CiAKLSAgICBDRlhfQ2xpcFJnbihjb25zdCBDRlhfQ2xpcFJnbiYgc3JjKTsKKyAgfkNGWF9DbGlwUmduKCk7CiAKLSAgICB+Q0ZYX0NsaXBSZ24oKTsKKyAgdHlwZWRlZiBlbnVtIHsgUmVjdEksIE1hc2tGIH0gQ2xpcFR5cGU7CiAKLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBSZWN0SSwKLSAgICAgICAgTWFza0YKLSAgICB9IENsaXBUeXBlOworICB2b2lkIFJlc2V0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpOwogCi0gICAgdm9pZAkJCVJlc2V0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpOworICBDbGlwVHlwZSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9UeXBlOyB9CiAKLSAgICBDbGlwVHlwZQkJR2V0VHlwZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9UeXBlOwotICAgIH0KKyAgY29uc3QgRlhfUkVDVCYgR2V0Qm94KCkgY29uc3QgeyByZXR1cm4gbV9Cb3g7IH0KIAotICAgIGNvbnN0IEZYX1JFQ1QmCUdldEJveCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Cb3g7Ci0gICAgfQorICBDRlhfRElCaXRtYXBSZWYgR2V0TWFzaygpIGNvbnN0IHsgcmV0dXJuIG1fTWFzazsgfQogCi0gICAgQ0ZYX0RJQml0bWFwUmVmCUdldE1hc2soKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fTWFzazsKLSAgICB9CisgIHZvaWQgSW50ZXJzZWN0UmVjdChjb25zdCBGWF9SRUNUJiByZWN0KTsKIAotICAgIHZvaWQJCQlJbnRlcnNlY3RSZWN0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpOworICB2b2lkIEludGVyc2VjdE1hc2tGKGludCBsZWZ0LCBpbnQgdG9wLCBDRlhfRElCaXRtYXBSZWYgTWFzayk7CiAKLSAgICB2b2lkCQkJSW50ZXJzZWN0TWFza0YoaW50IGxlZnQsIGludCB0b3AsIENGWF9ESUJpdG1hcFJlZiBNYXNrKTsKLXByb3RlY3RlZDoKKyBwcm90ZWN0ZWQ6CisgIENsaXBUeXBlIG1fVHlwZTsKIAotICAgIENsaXBUeXBlCQltX1R5cGU7CisgIEZYX1JFQ1QgbV9Cb3g7CiAKLSAgICBGWF9SRUNUCQkJbV9Cb3g7CisgIENGWF9ESUJpdG1hcFJlZiBtX01hc2s7CiAKLSAgICBDRlhfRElCaXRtYXBSZWYJbV9NYXNrOwotCi0gICAgdm9pZAkJCUludGVyc2VjdE1hc2tSZWN0KEZYX1JFQ1QgcmVjdCwgRlhfUkVDVCBtYXNrX2JveCwgQ0ZYX0RJQml0bWFwUmVmIE1hc2spOworICB2b2lkIEludGVyc2VjdE1hc2tSZWN0KEZYX1JFQ1QgcmVjdCwgRlhfUkVDVCBtYXNrX2JveCwgQ0ZYX0RJQml0bWFwUmVmIE1hc2spOwogfTsKLSNkZWZpbmUgRlhfR0FNTUEodmFsdWUpCQkJKHZhbHVlKQotI2RlZmluZSBGWF9HQU1NQV9JTlZFUlNFKHZhbHVlKQkodmFsdWUpCi1pbmxpbmUgRlhfQVJHQiBBcmdiR2FtbWEoRlhfQVJHQiBhcmdiKQotewotICAgIHJldHVybiBhcmdiOworI2RlZmluZSBGWF9HQU1NQSh2YWx1ZSkgKHZhbHVlKQorI2RlZmluZSBGWF9HQU1NQV9JTlZFUlNFKHZhbHVlKSAodmFsdWUpCitpbmxpbmUgRlhfQVJHQiBBcmdiR2FtbWEoRlhfQVJHQiBhcmdiKSB7CisgIHJldHVybiBhcmdiOwogfQotaW5saW5lIEZYX0FSR0IgQXJnYkdhbW1hSW52ZXJzZShGWF9BUkdCIGFyZ2IpCi17Ci0gICAgcmV0dXJuIGFyZ2I7CitpbmxpbmUgRlhfQVJHQiBBcmdiR2FtbWFJbnZlcnNlKEZYX0FSR0IgYXJnYikgeworICByZXR1cm4gYXJnYjsKIH0KLWNsYXNzIENGWF9QYXRoRGF0YQotewotcHVibGljOgorY2xhc3MgQ0ZYX1BhdGhEYXRhIHsKKyBwdWJsaWM6CisgIENGWF9QYXRoRGF0YSgpOwogCi0gICAgQ0ZYX1BhdGhEYXRhKCk7CisgIENGWF9QYXRoRGF0YShjb25zdCBDRlhfUGF0aERhdGEmIHNyYyk7CiAKLSAgICBDRlhfUGF0aERhdGEoY29uc3QgQ0ZYX1BhdGhEYXRhJiBzcmMpOworICB+Q0ZYX1BhdGhEYXRhKCk7CiAKLSAgICB+Q0ZYX1BhdGhEYXRhKCk7CisgIGludCBHZXRQb2ludENvdW50KCkgY29uc3QgeyByZXR1cm4gbV9Qb2ludENvdW50OyB9CiAKKyAgaW50IEdldEZsYWcoaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBtX3BQb2ludHNbaW5kZXhdLm1fRmxhZzsgfQogCisgIEZYX0ZMT0FUIEdldFBvaW50WChpbnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fcFBvaW50c1tpbmRleF0ubV9Qb2ludFg7IH0KIAorICBGWF9GTE9BVCBHZXRQb2ludFkoaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBtX3BQb2ludHNbaW5kZXhdLm1fUG9pbnRZOyB9CiAKLSAgICBpbnQJCQkJCUdldFBvaW50Q291bnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUG9pbnRDb3VudDsKLSAgICB9CisgIEZYX1BBVEhQT0lOVCogR2V0UG9pbnRzKCkgY29uc3QgeyByZXR1cm4gbV9wUG9pbnRzOyB9CiAKLSAgICBpbnQJCQkJCUdldEZsYWcoaW50IGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFBvaW50c1tpbmRleF0ubV9GbGFnOwotICAgIH0KKyAgdm9pZCBTZXRQb2ludENvdW50KGludCBuUG9pbnRzKTsKKyAgdm9pZCBBbGxvY1BvaW50Q291bnQoaW50IG5Qb2ludHMpOworICB2b2lkIEFkZFBvaW50Q291bnQoaW50IGFkZFBvaW50cyk7CiAKLSAgICBGWF9GTE9BVAkJCUdldFBvaW50WChpbnQgaW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wUG9pbnRzW2luZGV4XS5tX1BvaW50WDsKLSAgICB9CisgIENGWF9GbG9hdFJlY3QgR2V0Qm91bmRpbmdCb3goKSBjb25zdDsKIAotICAgIEZYX0ZMT0FUCQkJR2V0UG9pbnRZKGludCBpbmRleCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQb2ludHNbaW5kZXhdLm1fUG9pbnRZOwotICAgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCBHZXRCb3VuZGluZ0JveChGWF9GTE9BVCBsaW5lX3dpZHRoLCBGWF9GTE9BVCBtaXRlcl9saW1pdCkgY29uc3Q7CiAKKyAgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCk7CiAKKyAgRlhfQk9PTCBJc1JlY3QoKSBjb25zdDsKIAotICAgIEZYX1BBVEhQT0lOVCoJCUdldFBvaW50cygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wUG9pbnRzOwotICAgIH0KKyAgRlhfQk9PTCBHZXRaZXJvQXJlYVBhdGgoQ0ZYX1BhdGhEYXRhJiBOZXdQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiVGhpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWRqdXN0KSBjb25zdDsKIAotICAgIHZvaWQgU2V0UG9pbnRDb3VudChpbnQgblBvaW50cyk7Ci0gICAgdm9pZCBBbGxvY1BvaW50Q291bnQoaW50IG5Qb2ludHMpOwotICAgIHZvaWQgQWRkUG9pbnRDb3VudChpbnQgYWRkUG9pbnRzKTsKKyAgRlhfQk9PTCBJc1JlY3QoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgQ0ZYX0Zsb2F0UmVjdCogcmVjdCkgY29uc3Q7CiAKLSAgICBDRlhfRmxvYXRSZWN0CQlHZXRCb3VuZGluZ0JveCgpIGNvbnN0OworICB2b2lkIEFwcGVuZChjb25zdCBDRlhfUGF0aERhdGEqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpOworICB2b2lkIEFwcGVuZFJlY3QoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgYm90dG9tLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgdG9wKTsKIAotICAgIENGWF9GbG9hdFJlY3QJCUdldEJvdW5kaW5nQm94KEZYX0ZMT0FUIGxpbmVfd2lkdGgsIEZYX0ZMT0FUIG1pdGVyX2xpbWl0KSBjb25zdDsKKyAgdm9pZCBTZXRQb2ludChpbnQgaW5kZXgsIEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGludCBmbGFnKTsKIAotICAgIHZvaWQJCQkJVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpOworICB2b2lkIFRyaW1Qb2ludHMoaW50IG5Qb2ludHMpOwogCi0gICAgRlhfQk9PTAkJCQlJc1JlY3QoKSBjb25zdDsKKyAgdm9pZCBDb3B5KGNvbnN0IENGWF9QYXRoRGF0YSYgc3JjKTsKIAotICAgIEZYX0JPT0wJCQkJR2V0WmVyb0FyZWFQYXRoKENGWF9QYXRoRGF0YSYgTmV3UGF0aCwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfQk9PTCZiVGhpbiwgRlhfQk9PTCBiQWRqdXN0KSBjb25zdDsKKyBwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBDUERGX1BhdGg7CiAKLSAgICBGWF9CT09MCQkJCUlzUmVjdChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBDRlhfRmxvYXRSZWN0KiByZWN0KSBjb25zdDsKKyAgaW50IG1fUG9pbnRDb3VudDsKIAotICAgIHZvaWQgQXBwZW5kKGNvbnN0IENGWF9QYXRoRGF0YSogcFNyYywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCk7Ci0gICAgdm9pZCBBcHBlbmRSZWN0KEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIGJvdHRvbSwgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIHRvcCk7CisgIEZYX1BBVEhQT0lOVCogbV9wUG9pbnRzOwogCi0gICAgdm9pZAkJCQlTZXRQb2ludChpbnQgaW5kZXgsIEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGludCBmbGFnKTsKLQotICAgIHZvaWQJCQkJVHJpbVBvaW50cyhpbnQgblBvaW50cyk7Ci0KLSAgICB2b2lkIENvcHkoY29uc3QgQ0ZYX1BhdGhEYXRhICZzcmMpOwotcHJvdGVjdGVkOgotICAgIGZyaWVuZCBjbGFzcwkJQ1BERl9QYXRoOwotCi0gICAgaW50CQkJCQltX1BvaW50Q291bnQ7Ci0KLSAgICBGWF9QQVRIUE9JTlQqCQltX3BQb2ludHM7Ci0KLSAgICBpbnQJCQkJCW1fQWxsb2NDb3VudDsKKyAgaW50IG1fQWxsb2NDb3VudDsKIH07Ci1jbGFzcyBDRlhfR3JhcGhTdGF0ZURhdGEKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9HcmFwaFN0YXRlRGF0YSB7CisgcHVibGljOgorICBDRlhfR3JhcGhTdGF0ZURhdGEoKTsKIAotICAgIENGWF9HcmFwaFN0YXRlRGF0YSgpOworICBDRlhfR3JhcGhTdGF0ZURhdGEoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBzcmMpOwogCi0gICAgQ0ZYX0dyYXBoU3RhdGVEYXRhKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSYgc3JjKTsKKyAgfkNGWF9HcmFwaFN0YXRlRGF0YSgpOwogCi0gICAgfkNGWF9HcmFwaFN0YXRlRGF0YSgpOworICB2b2lkIENvcHkoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBzcmMpOwogCi0gICAgdm9pZAkJCQlDb3B5KGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSYgc3JjKTsKKyAgdm9pZCBTZXREYXNoQ291bnQoaW50IGNvdW50KTsKIAotICAgIHZvaWQJCQkJU2V0RGFzaENvdW50KGludCBjb3VudCk7CisgIHR5cGVkZWYgZW51bSB7IExpbmVDYXBCdXR0ID0gMCwgTGluZUNhcFJvdW5kID0gMSwgTGluZUNhcFNxdWFyZSA9IDIgfSBMaW5lQ2FwOworICBMaW5lQ2FwIG1fTGluZUNhcDsKKyAgaW50IG1fRGFzaENvdW50OworICBGWF9GTE9BVCogbV9EYXNoQXJyYXk7CisgIEZYX0ZMT0FUIG1fRGFzaFBoYXNlOwogCi0KLQotICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgIExpbmVDYXBCdXR0ID0gMCwKLSAgICAgICAgTGluZUNhcFJvdW5kID0gMSwKLSAgICAgICAgTGluZUNhcFNxdWFyZSA9IDIKLSAgICB9IExpbmVDYXA7Ci0gICAgTGluZUNhcAkJCQltX0xpbmVDYXA7Ci0gICAgaW50CQkJCQltX0Rhc2hDb3VudDsKLSAgICBGWF9GTE9BVCoJCW1fRGFzaEFycmF5OwotICAgIEZYX0ZMT0FUCQkJbV9EYXNoUGhhc2U7Ci0KLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBMaW5lSm9pbk1pdGVyID0gMCwKLSAgICAgICAgTGluZUpvaW5Sb3VuZCA9IDEsCi0gICAgICAgIExpbmVKb2luQmV2ZWwgPSAyLAotICAgIH0gTGluZUpvaW47Ci0gICAgTGluZUpvaW4JCQltX0xpbmVKb2luOwotICAgIEZYX0ZMT0FUCQkJbV9NaXRlckxpbWl0OwotICAgIEZYX0ZMT0FUCQkJbV9MaW5lV2lkdGg7Ci0KKyAgdHlwZWRlZiBlbnVtIHsKKyAgICBMaW5lSm9pbk1pdGVyID0gMCwKKyAgICBMaW5lSm9pblJvdW5kID0gMSwKKyAgICBMaW5lSm9pbkJldmVsID0gMiwKKyAgfSBMaW5lSm9pbjsKKyAgTGluZUpvaW4gbV9MaW5lSm9pbjsKKyAgRlhfRkxPQVQgbV9NaXRlckxpbWl0OworICBGWF9GTE9BVCBtX0xpbmVXaWR0aDsKIH07Ci0jZGVmaW5lIEZYRENfREVWSUNFX0NMQVNTCQkJMQotI2RlZmluZSBGWERDX1BJWEVMX1dJRFRICQkJMgotI2RlZmluZSBGWERDX1BJWEVMX0hFSUdIVAkJCTMKLSNkZWZpbmUgRlhEQ19CSVRTX1BJWEVMCQkJCTQKLSNkZWZpbmUgRlhEQ19IT1JaX1NJWkUJCQkJNQotI2RlZmluZSBGWERDX1ZFUlRfU0laRQkJCQk2Ci0jZGVmaW5lIEZYRENfUkVOREVSX0NBUFMJCQk3Ci0jZGVmaW5lIEZYRENfRElUSEVSX0JJVFMJCQk4Ci0jZGVmaW5lIEZYRENfRElTUExBWQkJCQkxCi0jZGVmaW5lIEZYRENfUFJJTlRFUgkJCQkyCi0jZGVmaW5lIEZYUkNfR0VUX0JJVFMJCQkJMHgwMQotI2RlZmluZSBGWFJDX0JJVF9NQVNLCQkJCTB4MDIKLSNkZWZpbmUgRlhSQ19BTFBIQV9NQVNLCQkJCTB4MDQKLSNkZWZpbmUgRlhSQ19BTFBIQV9QQVRICQkJCTB4MTAKLSNkZWZpbmUgRlhSQ19BTFBIQV9JTUFHRQkJCTB4MjAKLSNkZWZpbmUgRlhSQ19BTFBIQV9PVVRQVVQJCQkweDQwCi0jZGVmaW5lIEZYUkNfQkxFTkRfTU9ERQkJCQkweDgwCi0jZGVmaW5lIEZYUkNfU09GVF9DTElQCQkJCTB4MTAwCi0jZGVmaW5lIEZYUkNfQ01ZS19PVVRQVVQJCQkweDIwMAotI2RlZmluZSBGWFJDX0JJVE1BU0tfT1VUUFVUICAgICAgICAgMHg0MDAKLSNkZWZpbmUgRlhSQ19CWVRFTUFTS19PVVRQVVQgICAgICAgIDB4ODAwCi0jZGVmaW5lIEZYUkVOREVSX0lNQUdFX0xPU1NZCQkweDEwMDAKLSNkZWZpbmUgRlhGSUxMX0FMVEVSTkFURQkJMQotI2RlZmluZSBGWEZJTExfV0lORElORwkJCTIKLSNkZWZpbmUgRlhGSUxMX0ZVTExDT1ZFUgkJNAotI2RlZmluZSBGWEZJTExfUkVDVF9BQQkJCTgKLSNkZWZpbmUgRlhfRklMTF9TVFJPS0UJCQkxNgotI2RlZmluZSBGWF9TVFJPS0VfQURKVVNUCQkzMgotI2RlZmluZSBGWF9TVFJPS0VfVEVYVF9NT0RFCQk2NAotI2RlZmluZSBGWF9GSUxMX1RFWFRfTU9ERQkJMTI4Ci0jZGVmaW5lIEZYX1pFUk9BUkVBX0ZJTEwJCTI1NgotI2RlZmluZSBGWEZJTExfTk9QQVRIU01PT1RICQk1MTIKLSNkZWZpbmUgRlhURVhUX0NMRUFSVFlQRQkJCTB4MDEKLSNkZWZpbmUgRlhURVhUX0JHUl9TVFJJUEUJCQkweDAyCi0jZGVmaW5lIEZYVEVYVF9QUklOVEdSQVBISUNURVhUCQkweDA0Ci0jZGVmaW5lIEZYVEVYVF9OT19OQVRJVkVURVhUCQkweDA4Ci0jZGVmaW5lIEZYVEVYVF9QUklOVElNQUdFVEVYVAkJMHgxMAotI2RlZmluZSBGWFRFWFRfTk9TTU9PVEgJCQkJMHgyMAorI2RlZmluZSBGWERDX0RFVklDRV9DTEFTUyAxCisjZGVmaW5lIEZYRENfUElYRUxfV0lEVEggMgorI2RlZmluZSBGWERDX1BJWEVMX0hFSUdIVCAzCisjZGVmaW5lIEZYRENfQklUU19QSVhFTCA0CisjZGVmaW5lIEZYRENfSE9SWl9TSVpFIDUKKyNkZWZpbmUgRlhEQ19WRVJUX1NJWkUgNgorI2RlZmluZSBGWERDX1JFTkRFUl9DQVBTIDcKKyNkZWZpbmUgRlhEQ19ESVRIRVJfQklUUyA4CisjZGVmaW5lIEZYRENfRElTUExBWSAxCisjZGVmaW5lIEZYRENfUFJJTlRFUiAyCisjZGVmaW5lIEZYUkNfR0VUX0JJVFMgMHgwMQorI2RlZmluZSBGWFJDX0JJVF9NQVNLIDB4MDIKKyNkZWZpbmUgRlhSQ19BTFBIQV9NQVNLIDB4MDQKKyNkZWZpbmUgRlhSQ19BTFBIQV9QQVRIIDB4MTAKKyNkZWZpbmUgRlhSQ19BTFBIQV9JTUFHRSAweDIwCisjZGVmaW5lIEZYUkNfQUxQSEFfT1VUUFVUIDB4NDAKKyNkZWZpbmUgRlhSQ19CTEVORF9NT0RFIDB4ODAKKyNkZWZpbmUgRlhSQ19TT0ZUX0NMSVAgMHgxMDAKKyNkZWZpbmUgRlhSQ19DTVlLX09VVFBVVCAweDIwMAorI2RlZmluZSBGWFJDX0JJVE1BU0tfT1VUUFVUIDB4NDAwCisjZGVmaW5lIEZYUkNfQllURU1BU0tfT1VUUFVUIDB4ODAwCisjZGVmaW5lIEZYUkVOREVSX0lNQUdFX0xPU1NZIDB4MTAwMAorI2RlZmluZSBGWEZJTExfQUxURVJOQVRFIDEKKyNkZWZpbmUgRlhGSUxMX1dJTkRJTkcgMgorI2RlZmluZSBGWEZJTExfRlVMTENPVkVSIDQKKyNkZWZpbmUgRlhGSUxMX1JFQ1RfQUEgOAorI2RlZmluZSBGWF9GSUxMX1NUUk9LRSAxNgorI2RlZmluZSBGWF9TVFJPS0VfQURKVVNUIDMyCisjZGVmaW5lIEZYX1NUUk9LRV9URVhUX01PREUgNjQKKyNkZWZpbmUgRlhfRklMTF9URVhUX01PREUgMTI4CisjZGVmaW5lIEZYX1pFUk9BUkVBX0ZJTEwgMjU2CisjZGVmaW5lIEZYRklMTF9OT1BBVEhTTU9PVEggNTEyCisjZGVmaW5lIEZYVEVYVF9DTEVBUlRZUEUgMHgwMQorI2RlZmluZSBGWFRFWFRfQkdSX1NUUklQRSAweDAyCisjZGVmaW5lIEZYVEVYVF9QUklOVEdSQVBISUNURVhUIDB4MDQKKyNkZWZpbmUgRlhURVhUX05PX05BVElWRVRFWFQgMHgwOAorI2RlZmluZSBGWFRFWFRfUFJJTlRJTUFHRVRFWFQgMHgxMAorI2RlZmluZSBGWFRFWFRfTk9TTU9PVEggMHgyMAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIEZYX0RXT1JECQkJbV9HbHlwaEluZGV4OwotICAgIEZYX0ZMT0FUCQkJbV9PcmlnaW5YLCBtX09yaWdpblk7Ci0gICAgaW50CQkJCQltX0ZvbnRDaGFyV2lkdGg7Ci0gICAgRlhfQk9PTAkJCQltX2JHbHlwaEFkanVzdDsKLSAgICBGWF9GTE9BVAkJCW1fQWRqdXN0TWF0cml4WzRdOwotICAgIEZYX0RXT1JECQkJbV9FeHRHSUQ7Ci0gICAgRlhfQk9PTAkJCQltX2JGb250U3R5bGU7CisgIEZYX0RXT1JEIG1fR2x5cGhJbmRleDsKKyAgRlhfRkxPQVQgbV9PcmlnaW5YLCBtX09yaWdpblk7CisgIGludCBtX0ZvbnRDaGFyV2lkdGg7CisgIEZYX0JPT0wgbV9iR2x5cGhBZGp1c3Q7CisgIEZYX0ZMT0FUIG1fQWRqdXN0TWF0cml4WzRdOworICBGWF9EV09SRCBtX0V4dEdJRDsKKyAgRlhfQk9PTCBtX2JGb250U3R5bGU7CiB9IEZYVEVYVF9DSEFSUE9TOwotY2xhc3MgQ0ZYX1JlbmRlckRldmljZQotewotcHVibGljOgotICAgIENGWF9SZW5kZXJEZXZpY2UoKTsKK2NsYXNzIENGWF9SZW5kZXJEZXZpY2UgeworIHB1YmxpYzoKKyAgQ0ZYX1JlbmRlckRldmljZSgpOwogCi0gICAgdmlydHVhbCB+Q0ZYX1JlbmRlckRldmljZSgpOworICB2aXJ0dWFsIH5DRlhfUmVuZGVyRGV2aWNlKCk7CiAKLSAgICB2b2lkCQkJU2V0RGV2aWNlRHJpdmVyKElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIpOworICB2b2lkIFNldERldmljZURyaXZlcihJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyKTsKIAotICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqCUdldERldmljZURyaXZlcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyOwotICAgIH0KKyAgSUZYX1JlbmRlckRldmljZURyaXZlciogR2V0RGV2aWNlRHJpdmVyKCkgY29uc3QgeyByZXR1cm4gbV9wRGV2aWNlRHJpdmVyOyB9CiAKLSAgICBGWF9CT09MCQkJU3RhcnRSZW5kZXJpbmcoKTsKKyAgRlhfQk9PTCBTdGFydFJlbmRlcmluZygpOwogCi0gICAgdm9pZAkJCUVuZFJlbmRlcmluZygpOworICB2b2lkIEVuZFJlbmRlcmluZygpOwogCisgIHZvaWQgU2F2ZVN0YXRlKCk7CiAKKyAgdm9pZCBSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCVNhdmVTdGF0ZSgpOworICBpbnQgR2V0V2lkdGgoKSBjb25zdCB7IHJldHVybiBtX1dpZHRoOyB9CiAKLSAgICB2b2lkCQkJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKTsKKyAgaW50IEdldEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fSGVpZ2h0OyB9CiAKKyAgaW50IEdldERldmljZUNsYXNzKCkgY29uc3QgeyByZXR1cm4gbV9EZXZpY2VDbGFzczsgfQogCisgIGludCBHZXRCUFAoKSBjb25zdCB7IHJldHVybiBtX2JwcDsgfQogCisgIGludCBHZXRSZW5kZXJDYXBzKCkgY29uc3QgeyByZXR1cm4gbV9SZW5kZXJDYXBzOyB9CiAKLSAgICBpbnQJCQkJR2V0V2lkdGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fV2lkdGg7Ci0gICAgfQorICBpbnQgR2V0RGV2aWNlQ2FwcyhpbnQgaWQpIGNvbnN0OwogCi0gICAgaW50CQkJCUdldEhlaWdodCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9IZWlnaHQ7Ci0gICAgfQorICBDRlhfTWF0cml4IEdldENUTSgpIGNvbnN0OwogCi0gICAgaW50CQkJCUdldERldmljZUNsYXNzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0RldmljZUNsYXNzOwotICAgIH0KKyAgQ0ZYX0RJQml0bWFwKiBHZXRCaXRtYXAoKSBjb25zdCB7IHJldHVybiBtX3BCaXRtYXA7IH0KKyAgdm9pZCBTZXRCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSB7IG1fcEJpdG1hcCA9IHBCaXRtYXA7IH0KIAotICAgIGludAkJCQlHZXRCUFAoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYnBwOwotICAgIH0KKyAgRlhfQk9PTCBDcmVhdGVDb21wYXRpYmxlQml0bWFwKENGWF9ESUJpdG1hcCogcERJQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIGNvbnN0OwogCi0gICAgaW50CQkJCUdldFJlbmRlckNhcHMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUmVuZGVyQ2FwczsKLSAgICB9CisgIGNvbnN0IEZYX1JFQ1QmIEdldENsaXBCb3goKSBjb25zdCB7IHJldHVybiBtX0NsaXBCb3g7IH0KIAotICAgIGludAkJCQlHZXREZXZpY2VDYXBzKGludCBpZCkgY29uc3Q7CisgIEZYX0JPT0wgU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSk7CiAKLSAgICBDRlhfTWF0cml4CQlHZXRDVE0oKSBjb25zdDsKKyAgRlhfQk9PTCBTZXRDbGlwX1JlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QpOwogCi0KLSAgICBDRlhfRElCaXRtYXAqCUdldEJpdG1hcCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wQml0bWFwOwotICAgIH0KLSAgICB2b2lkCQkJU2V0Qml0bWFwKENGWF9ESUJpdG1hcCogcEJpdG1hcCkKLSAgICB7Ci0gICAgICAgIG1fcEJpdG1hcCA9IHBCaXRtYXA7Ci0gICAgfQotCi0gICAgRlhfQk9PTAkJCUNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIGNvbnN0OwotCi0gICAgY29uc3QgRlhfUkVDVCYJR2V0Q2xpcEJveCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9DbGlwQm94OwotICAgIH0KLQotICAgIEZYX0JPT0wJCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLSAgICBGWF9CT09MCQkJU2V0Q2xpcF9SZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0KTsKLQotICAgIEZYX0JPT0wJCQlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgIEZYX0JPT0wJCQlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgRlhfQk9PTCBTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMCi0gICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSk7CiAKLSAgICBGWF9CT09MCQkJU2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIEZYX0JPT0wgRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiAKLSAgICBGWF9CT09MCQkJRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CisgIEZYX0JPT0wgU2V0UGl4ZWwoaW50IHgsCisgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlID0gMCwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworICBGWF9CT09MIEZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiAKLSAgICBGWF9CT09MCQkJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogCi0gICAgQ0ZYX0RJQml0bWFwKiAgIEdldEJhY2tEcm9wKCk7CisgIEZYX0JPT0wgR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICBDRlhfRElCaXRtYXAqIEdldEJhY2tEcm9wKCk7CiAKLSAgICBGWF9CT09MCQkJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CisgIEZYX0JPT0wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCVNldEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiAKLSAgICBGWF9CT09MCQkJU3RyZXRjaEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLCBGWF9EV09SRCBmbGFncyA9IDAsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICBGWF9CT09MIFNldEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgdm9pZComIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworICBGWF9CT09MIFN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYX0JPT0wgU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogCi0gICAgdm9pZAkJCUNhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpOworICBGWF9CT09MIENvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgRlhfQk9PTAkJCURyYXdOb3JtYWxUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LCBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLCBGWF9EV09SRCB0ZXh0X2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgdm9pZCBDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKTsKIAotICAgIEZYX0JPT0wJCQlEcmF3VGV4dFBhdGgoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LCBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MlVzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLCBGWF9EV09SRCBzdHJva2VfY29sb3IsIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCwgaW50IG5GbGFnID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB2aXJ0dWFsIHZvaWQgQmVnaW4oKSB7fQotICAgIHZpcnR1YWwgdm9pZCBFbmQoKSB7fQotcHJpdmF0ZToKKyAgRlhfQk9PTCBEcmF3Tm9ybWFsVGV4dChpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0ZXh0X2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBDRlhfRElCaXRtYXAqCW1fcEJpdG1hcDsKKyAgRlhfQk9PTCBEcmF3VGV4dFBhdGgoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJVc2VyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CisgIHZpcnR1YWwgdm9pZCBCZWdpbigpIHt9CisgIHZpcnR1YWwgdm9pZCBFbmQoKSB7fQogCisgcHJpdmF0ZToKKyAgQ0ZYX0RJQml0bWFwKiBtX3BCaXRtYXA7CiAKKyAgaW50IG1fV2lkdGg7CiAKLSAgICBpbnQJCQkJbV9XaWR0aDsKKyAgaW50IG1fSGVpZ2h0OwogCi0gICAgaW50CQkJCW1fSGVpZ2h0OworICBpbnQgbV9icHA7CiAKLSAgICBpbnQJCQkJbV9icHA7CisgIGludCBtX1JlbmRlckNhcHM7CiAKLSAgICBpbnQJCQkJbV9SZW5kZXJDYXBzOworICBpbnQgbV9EZXZpY2VDbGFzczsKIAotICAgIGludAkJCQltX0RldmljZUNsYXNzOworICBGWF9SRUNUIG1fQ2xpcEJveDsKIAotICAgIEZYX1JFQ1QJCQltX0NsaXBCb3g7CisgcHJvdGVjdGVkOgorICBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBtX3BEZXZpY2VEcml2ZXI7CiAKLXByb3RlY3RlZDoKKyBwcml2YXRlOgorICB2b2lkIEluaXREZXZpY2VJbmZvKCk7CiAKLSAgICBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKgltX3BEZXZpY2VEcml2ZXI7Ci1wcml2YXRlOgotCi0gICAgdm9pZAkJCUluaXREZXZpY2VJbmZvKCk7Ci0KLSAgICB2b2lkCQkJVXBkYXRlQ2xpcEJveCgpOworICB2b2lkIFVwZGF0ZUNsaXBCb3goKTsKIH07Ci1jbGFzcyBDRlhfRnhnZURldmljZSA6IHB1YmxpYyBDRlhfUmVuZGVyRGV2aWNlCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfRnhnZURldmljZSA6IHB1YmxpYyBDRlhfUmVuZGVyRGV2aWNlIHsKKyBwdWJsaWM6CisgIENGWF9GeGdlRGV2aWNlKCk7CiAKLSAgICBDRlhfRnhnZURldmljZSgpOworICB+Q0ZYX0Z4Z2VEZXZpY2UoKTsKIAotICAgIH5DRlhfRnhnZURldmljZSgpOworICBGWF9CT09MIEF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgIGludCBkaXRoZXJfYml0cyA9IDAsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLAorICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMLAorICAgICAgICAgICAgICAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0ID0gRkFMU0UpOwogCi0gICAgRlhfQk9PTAkJCUF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cyA9IDAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0ID0gRkFMU0UpOworICBGWF9CT09MIENyZWF0ZShpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgIGludCBkaXRoZXJfYml0cyA9IDAsCisgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCUNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cyA9IDAsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwpOwotcHJvdGVjdGVkOgotCi0gICAgRlhfQk9PTAkJCW1fYk93bmVkQml0bWFwOworIHByb3RlY3RlZDoKKyAgRlhfQk9PTCBtX2JPd25lZEJpdG1hcDsKIH07Ci1jbGFzcyBDRlhfU2tpYURldmljZSA6IHB1YmxpYyBDRlhfUmVuZGVyRGV2aWNlCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfU2tpYURldmljZSA6IHB1YmxpYyBDRlhfUmVuZGVyRGV2aWNlIHsKKyBwdWJsaWM6CisgIENGWF9Ta2lhRGV2aWNlKCk7CiAKLSAgICBDRlhfU2tpYURldmljZSgpOworICB+Q0ZYX1NraWFEZXZpY2UoKTsKIAotICAgIH5DRlhfU2tpYURldmljZSgpOworICBGWF9CT09MIEF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgIGludCBkaXRoZXJfYml0cyA9IDAsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLAorICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMLAorICAgICAgICAgICAgICAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0ID0gRkFMU0UpOwogCi0gICAgRlhfQk9PTAkJCUF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cyA9IDAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0ID0gRkFMU0UpOworICBGWF9CT09MIENyZWF0ZShpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgIGludCBkaXRoZXJfYml0cyA9IDAsCisgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCUNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cyA9IDAsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwpOwotcHJvdGVjdGVkOgotCi0gICAgRlhfQk9PTAkJCW1fYk93bmVkQml0bWFwOworIHByb3RlY3RlZDoKKyAgRlhfQk9PTCBtX2JPd25lZEJpdG1hcDsKIH07Ci1jbGFzcyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyCi17Ci1wdWJsaWM6CitjbGFzcyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBDcmVhdGVGeGdlRHJpdmVyKAorICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsCisgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMLAorICAgICAgRlhfQk9PTCBiR3JvdXBLbm9ja291dCA9IEZBTFNFKTsKIAotICAgIHN0YXRpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKgkJQ3JlYXRlRnhnZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLAotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCA9IEZBTFNFKTsKKyAgdmlydHVhbCB+SUZYX1JlbmRlckRldmljZURyaXZlcigpIHt9CisgIHZpcnR1YWwgdm9pZCBCZWdpbigpIHt9CisgIHZpcnR1YWwgdm9pZCBFbmQoKSB7fQogCi0gICAgdmlydHVhbCB+SUZYX1JlbmRlckRldmljZURyaXZlcigpIHt9Ci0gICAgdmlydHVhbCB2b2lkIEJlZ2luKCkgeyB9Ci0gICAgdmlydHVhbCB2b2lkIEVuZCgpIHsgfQorICB2aXJ0dWFsIGludCBHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGludAkJR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgPSAwOworICB2aXJ0dWFsIENGWF9NYXRyaXggR2V0Q1RNKCkgY29uc3QgeyByZXR1cm4gQ0ZYX01hdHJpeCgpOyB9CiAKLSAgICB2aXJ0dWFsIENGWF9NYXRyaXgJR2V0Q1RNKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBDRlhfTWF0cml4KCk7Ci0gICAgfQorICB2aXJ0dWFsIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkgeyByZXR1cm4gRkFMU0U7IH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTCBJc1BTUHJpbnREcml2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKyAgdmlydHVhbCBGWF9CT09MIFN0YXJ0UmVuZGVyaW5nKCkgeyByZXR1cm4gVFJVRTsgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0UmVuZGVyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KKyAgdmlydHVhbCB2b2lkIEVuZFJlbmRlcmluZygpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQJRW5kUmVuZGVyaW5nKCkge30KKyAgdmlydHVhbCB2b2lkIFNhdmVTdGF0ZSgpID0gMDsKIAorICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKSA9IDA7CiAKKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlKSA9IDA7CiAKLQotICAgIHZpcnR1YWwgdm9pZAlTYXZlU3RhdGUoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKSA9IDA7Ci0KLQotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBTZXRQaXhlbChpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0gICAgdmlydHVhbCBGWF9CT09MIEZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEJhY2tEcm9wKCkgeyByZXR1cm4gTlVMTDsgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgRlhfQk9PTCBiREVkZ2UgPSBGQUxTRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdmlydHVhbCBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgdm9pZComIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIENvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTAlDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKyAgdmlydHVhbCB2b2lkIENhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQJQ2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSkge30KKyAgdmlydHVhbCBGWF9CT09MIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIHZpcnR1YWwgdm9pZCogR2V0UGxhdGZvcm1TdXJmYWNlKCkgeyByZXR1cm4gTlVMTDsgfQogCi0gICAgdmlydHVhbCB2b2lkKglHZXRQbGF0Zm9ybVN1cmZhY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICB2aXJ0dWFsIGludCBHZXREcml2ZXJUeXBlKCkgeyByZXR1cm4gMDsgfQogCi0gICAgdmlydHVhbCBpbnQJCUdldERyaXZlclR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkICAgIENsZWFyRHJpdmVyKCkge30KKyAgdmlydHVhbCB2b2lkIENsZWFyRHJpdmVyKCkge30KIH07Ci1jbGFzcyBJRlhfUFNPdXRwdXQKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgIFJlbGVhc2UoKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkCU91dHB1dFBTKGNvbnN0IEZYX0NIQVIqIHN0cmluZywgaW50IGxlbikgPSAwOworY2xhc3MgSUZYX1BTT3V0cHV0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT3V0cHV0UFMoY29uc3QgRlhfQ0hBUiogc3RyaW5nLCBpbnQgbGVuKSA9IDA7CiAKLXByb3RlY3RlZDoKLSAgICB+SUZYX1BTT3V0cHV0KCkgeyB9CisgcHJvdGVjdGVkOgorICB+SUZYX1BTT3V0cHV0KCkge30KIH07CiBjbGFzcyBDUFNGb250OwotY2xhc3MgQ0ZYX1BTUmVuZGVyZXIKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9QU1JlbmRlcmVyIHsKKyBwdWJsaWM6CisgIENGWF9QU1JlbmRlcmVyKCk7CiAKLSAgICBDRlhfUFNSZW5kZXJlcigpOworICB+Q0ZYX1BTUmVuZGVyZXIoKTsKIAotICAgIH5DRlhfUFNSZW5kZXJlcigpOworICB2b2lkIEluaXQoSUZYX1BTT3V0cHV0KiBwT3V0cHV0LAorICAgICAgICAgICAgaW50IHBzX2xldmVsLAorICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgIEZYX0JPT0wgYkNteWtPdXRwdXQpOworICBGWF9CT09MIFN0YXJ0UmVuZGVyaW5nKCk7CisgIHZvaWQgRW5kUmVuZGVyaW5nKCk7CiAKLSAgICB2b2lkCQkJSW5pdChJRlhfUFNPdXRwdXQqIHBPdXRwdXQsIGludCBwc19sZXZlbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9CT09MIGJDbXlrT3V0cHV0KTsKLSAgICBGWF9CT09MCQkJU3RhcnRSZW5kZXJpbmcoKTsKLSAgICB2b2lkCQkJRW5kUmVuZGVyaW5nKCk7CisgIHZvaWQgU2F2ZVN0YXRlKCk7CiAKLSAgICB2b2lkCQkJU2F2ZVN0YXRlKCk7CisgIHZvaWQgUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKTsKIAotICAgIHZvaWQJCQlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkID0gRkFMU0UpOworICB2b2lkIFNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpOwogCi0gICAgdm9pZAkJCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgdm9pZCBTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKTsKIAotICAgIHZvaWQJCQlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgRlhfUkVDVCBHZXRDbGlwQm94KCkgeyByZXR1cm4gbV9DbGlwQm94OyB9CiAKLSAgICBGWF9SRUNUCQkJR2V0Q2xpcEJveCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9DbGlwQm94OwotICAgIH0KKyAgRlhfQk9PTCBEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLAorICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCisgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICk7CisgIEZYX0JPT0wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIEZYX0JPT0wgRHJhd0RJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJRHJhd0RJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBEcmF3VGV4dChpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCURyYXdUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LCBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKLXByaXZhdGU6CisgcHJpdmF0ZToKKyAgSUZYX1BTT3V0cHV0KiBtX3BPdXRwdXQ7CiAKLSAgICBJRlhfUFNPdXRwdXQqCW1fcE91dHB1dDsKKyAgaW50IG1fUFNMZXZlbDsKIAotICAgIGludAkJCQltX1BTTGV2ZWw7CisgIENGWF9HcmFwaFN0YXRlRGF0YSBtX0N1ckdyYXBoU3RhdGU7CiAKLSAgICBDRlhfR3JhcGhTdGF0ZURhdGEJbV9DdXJHcmFwaFN0YXRlOworICBGWF9CT09MIG1fYkdyYXBoU3RhdGVTZXQ7CiAKLSAgICBGWF9CT09MCQkJbV9iR3JhcGhTdGF0ZVNldDsKKyAgRlhfQk9PTCBtX2JDbXlrT3V0cHV0OwogCi0gICAgRlhfQk9PTAkJCW1fYkNteWtPdXRwdXQ7CisgIEZYX0JPT0wgbV9iQ29sb3JTZXQ7CiAKLSAgICBGWF9CT09MCQkJbV9iQ29sb3JTZXQ7CisgIEZYX0RXT1JEIG1fTGFzdENvbG9yOwogCi0gICAgRlhfRFdPUkQJCW1fTGFzdENvbG9yOworICBGWF9SRUNUIG1fQ2xpcEJveDsKIAotICAgIEZYX1JFQ1QJCQltX0NsaXBCb3g7CisgIENGWF9BcnJheVRlbXBsYXRlPENQU0ZvbnQqPiBtX1BTRm9udExpc3Q7CiAKLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUFNGb250Kj4JbV9QU0ZvbnRMaXN0OworICBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9SRUNUPiBtX0NsaXBCb3hTdGFjazsKKyAgRlhfQk9PTCBtX2JJbml0ZWQ7CiAKLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9SRUNUPgltX0NsaXBCb3hTdGFjazsKLSAgICBGWF9CT09MCQkJbV9iSW5pdGVkOworICB2b2lkIE91dHB1dFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSk7CiAKLSAgICB2b2lkCQkJT3V0cHV0UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UpOworICB2b2lkIFNldEdyYXBoU3RhdGUoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSk7CiAKLSAgICB2b2lkCQkJU2V0R3JhcGhTdGF0ZShjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKTsKKyAgdm9pZCBTZXRDb2xvcihGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwogCi0gICAgdm9pZAkJCVNldENvbG9yKEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7CisgIHZvaWQgRmluZFBTRm9udEdseXBoKENGWF9GYWNlQ2FjaGUqIHBGYWNlQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MsCisgICAgICAgICAgICAgICAgICAgICAgIGludCYgcHNfZm9udG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50JiBwc19nbHlwaGluZGV4KTsKIAotICAgIHZvaWQJCQlGaW5kUFNGb250R2x5cGgoQ0ZYX0ZhY2VDYWNoZSogcEZhY2VDYWNoZSwgQ0ZYX0ZvbnQqIHBGb250LCBjb25zdCBGWFRFWFRfQ0hBUlBPUyYgY2hhcnBvcywgaW50JiBwc19mb250bnVtLCBpbnQgJnBzX2dseXBoaW5kZXgpOwotCi0gICAgdm9pZAkJCVdyaXRlUFNCaW5hcnkoY29uc3QgdWludDhfdCogZGF0YSwgaW50IGxlbik7CisgIHZvaWQgV3JpdGVQU0JpbmFyeShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgbGVuKTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZYR0VfRlhfR0VfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX2FwcGxlLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV9hcHBsZS5oCmluZGV4IDBmYjhiZWQuLjE2Mjk4NTggMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX2FwcGxlLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2VfYXBwbGUuaApAQCAtNywyMSArNywyMCBAQAogI2lmbmRlZiBDT1JFX0lOQ0xVREVfRlhHRV9GWF9HRV9BUFBMRV9IXwogI2RlZmluZSBDT1JFX0lOQ0xVREVfRlhHRV9GWF9HRV9BUFBMRV9IXwogCi0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi1jbGFzcyBDRlhfUXVhcnR6RGV2aWNlIDogcHVibGljIENGWF9SZW5kZXJEZXZpY2UKLXsKLXB1YmxpYzoKLSAgICBDRlhfUXVhcnR6RGV2aWNlKCk7Ci0gICAgfkNGWF9RdWFydHpEZXZpY2UoKTsKLSAgICBGWF9CT09MIEF0dGFjaChDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBuRGV2aWNlQ2xhc3MgPSBGWERDX0RJU1BMQVkpOwotICAgIEZYX0JPT0wgQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCk7Ci0gICAgRlhfQk9PTCBDcmVhdGUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpOworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCitjbGFzcyBDRlhfUXVhcnR6RGV2aWNlIDogcHVibGljIENGWF9SZW5kZXJEZXZpY2UgeworIHB1YmxpYzoKKyAgQ0ZYX1F1YXJ0ekRldmljZSgpOworICB+Q0ZYX1F1YXJ0ekRldmljZSgpOworICBGWF9CT09MIEF0dGFjaChDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBuRGV2aWNlQ2xhc3MgPSBGWERDX0RJU1BMQVkpOworICBGWF9CT09MIEF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXApOworICBGWF9CT09MIENyZWF0ZShpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCk7CiAKLSAgICBDR0NvbnRleHRSZWYgR2V0Q29udGV4dCgpOworICBDR0NvbnRleHRSZWYgR2V0Q29udGV4dCgpOwogCi1wcm90ZWN0ZWQ6Ci0gICAgQ0dDb250ZXh0UmVmIG1fcENvbnRleHQ7Ci0gICAgRlhfQk9PTCBtX2JPd25lZEJpdG1hcDsKKyBwcm90ZWN0ZWQ6CisgIENHQ29udGV4dFJlZiBtX3BDb250ZXh0OworICBGWF9CT09MIG1fYk93bmVkQml0bWFwOwogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaAppbmRleCA1YjE2MTQ2Li4xNDljNDZkIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmgKQEAgLTExLDk2ICsxMSw4NyBAQAogI2lmbmRlZiBfV0lORE9XU18KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjZW5kaWYKLSNkZWZpbmUgV0lORElCX09QRU5fTUVNT1JZICAgIDB4MQotI2RlZmluZSBXSU5ESUJfT1BFTl9QQVRITkFNRSAgMHgyCi10eXBlZGVmIHN0cnVjdCAgV0lORElCX09wZW5fQXJnc18geworI2RlZmluZSBXSU5ESUJfT1BFTl9NRU1PUlkgMHgxCisjZGVmaW5lIFdJTkRJQl9PUEVOX1BBVEhOQU1FIDB4MgordHlwZWRlZiBzdHJ1Y3QgV0lORElCX09wZW5fQXJnc18geworICBpbnQgZmxhZ3M7CiAKLSAgICBpbnQgICAgICAgICBmbGFnczsKKyAgY29uc3QgdWludDhfdCogbWVtb3J5X2Jhc2U7CiAKLSAgICBjb25zdCB1aW50OF90KiAgbWVtb3J5X2Jhc2U7CisgIHNpemVfdCBtZW1vcnlfc2l6ZTsKIAotICAgIHNpemVfdCAgICBtZW1vcnlfc2l6ZTsKLQotICAgIGNvbnN0IEZYX1dDSEFSKiAgcGF0aF9uYW1lOworICBjb25zdCBGWF9XQ0hBUiogcGF0aF9uYW1lOwogfSBXSU5ESUJfT3Blbl9BcmdzXzsKLWNsYXNzIENGWF9XaW5kb3dzRElCIDogcHVibGljIENGWF9ESUJpdG1hcAotewotcHVibGljOgorY2xhc3MgQ0ZYX1dpbmRvd3NESUIgOiBwdWJsaWMgQ0ZYX0RJQml0bWFwIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRCaXRtYXBJbmZvKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCk7CiAKLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJR2V0Qml0bWFwSW5mbyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApOworICBzdGF0aWMgQ0ZYX0RJQml0bWFwKiBMb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLCB2b2lkKiBwRGF0YSk7CiAKLSAgICBzdGF0aWMgQ0ZYX0RJQml0bWFwKiBMb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLCB2b2lkKiBwRGF0YSk7CisgIHN0YXRpYyBIQklUTUFQIEdldEREQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgSERDIGhEQyk7CiAKLSAgICBzdGF0aWMgSEJJVE1BUAkJR2V0RERCaXRtYXAoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBIREMgaERDKTsKKyAgc3RhdGljIENGWF9ESUJpdG1hcCogTG9hZEZyb21EREIoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJJVE1BUCBoQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplID0gMjU2KTsKIAotICAgIHN0YXRpYyBDRlhfRElCaXRtYXAqIExvYWRGcm9tRERCKEhEQyBoREMsIEhCSVRNQVAgaEJpdG1hcCwgRlhfRFdPUkQqIHBQYWxldHRlID0gTlVMTCwgRlhfRFdPUkQgc2l6ZSA9IDI1Nik7CisgIHN0YXRpYyBDRlhfRElCaXRtYXAqIExvYWRGcm9tRmlsZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUpOwogCi0gICAgc3RhdGljIENGWF9ESUJpdG1hcCogTG9hZEZyb21GaWxlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSk7CisgIHN0YXRpYyBDRlhfRElCaXRtYXAqIExvYWRGcm9tRmlsZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSkgeworICAgIHJldHVybiBMb2FkRnJvbUZpbGUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChmaWxlbmFtZSkuY19zdHIoKSk7CisgIH0KIAotICAgIHN0YXRpYyBDRlhfRElCaXRtYXAqIExvYWRGcm9tRmlsZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMb2FkRnJvbUZpbGUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChmaWxlbmFtZSkuY19zdHIoKSk7Ci0gICAgfQorICBzdGF0aWMgQ0ZYX0RJQml0bWFwKiBMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncyk7CiAKLSAgICBzdGF0aWMgQ0ZYX0RJQml0bWFwKiBMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncyk7CisgIENGWF9XaW5kb3dzRElCKEhEQyBoREMsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKLSAgICBDRlhfV2luZG93c0RJQihIREMgaERDLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICB+Q0ZYX1dpbmRvd3NESUIoKTsKIAotICAgIH5DRlhfV2luZG93c0RJQigpOworICBIREMgR2V0REMoKSBjb25zdCB7IHJldHVybiBtX2hNZW1EQzsgfQogCi0gICAgSERDCQkJCQlHZXREQygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9oTWVtREM7Ci0gICAgfQorICBIQklUTUFQIEdldFdpbmRvd3NCaXRtYXAoKSBjb25zdCB7IHJldHVybiBtX2hCaXRtYXA7IH0KIAotICAgIEhCSVRNQVAJCQkJR2V0V2luZG93c0JpdG1hcCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9oQml0bWFwOwotICAgIH0KKyAgdm9pZCBMb2FkRnJvbURldmljZShIREMgaERDLCBpbnQgbGVmdCwgaW50IHRvcCk7CiAKLSAgICB2b2lkCQkJCUxvYWRGcm9tRGV2aWNlKEhEQyBoREMsIGludCBsZWZ0LCBpbnQgdG9wKTsKKyAgdm9pZCBTZXRUb0RldmljZShIREMgaERDLCBpbnQgbGVmdCwgaW50IHRvcCk7CiAKLSAgICB2b2lkCQkJCVNldFRvRGV2aWNlKEhEQyBoREMsIGludCBsZWZ0LCBpbnQgdG9wKTsKLXByb3RlY3RlZDoKKyBwcm90ZWN0ZWQ6CisgIEhEQyBtX2hNZW1EQzsKIAotICAgIEhEQwkJCQkJbV9oTWVtREM7CisgIEhCSVRNQVAgbV9oQml0bWFwOwogCi0gICAgSEJJVE1BUAkJCQltX2hCaXRtYXA7Ci0KLSAgICBIQklUTUFQCQkJCW1faE9sZEJpdG1hcDsKKyAgSEJJVE1BUCBtX2hPbGRCaXRtYXA7CiB9OwotY2xhc3MgQ0ZYX1dpbmRvd3NEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZQotewotcHVibGljOgotICAgIHN0YXRpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKglDcmVhdGVEcml2ZXIoSERDIGhEQywgRlhfQk9PTCBiQ215a091dHB1dCA9IEZBTFNFKTsKK2NsYXNzIENGWF9XaW5kb3dzRGV2aWNlIDogcHVibGljIENGWF9SZW5kZXJEZXZpY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIENyZWF0ZURyaXZlcihIREMgaERDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNteWtPdXRwdXQgPSBGQUxTRSk7CiAKLSAgICBDRlhfV2luZG93c0RldmljZShIREMgaERDLCBGWF9CT09MIGJDbXlrT3V0cHV0ID0gRkFMU0UsIEZYX0JPT0wgYkZvcmNlUFNPdXRwdXQgPSBGQUxTRSwgaW50IHBzTGV2ZWwgPSAyKTsKKyAgQ0ZYX1dpbmRvd3NEZXZpY2UoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ215a091dHB1dCA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb3JjZVBTT3V0cHV0ID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgIGludCBwc0xldmVsID0gMik7CiAKLSAgICBIREMJCUdldERDKCkgY29uc3Q7CisgIEhEQyBHZXREQygpIGNvbnN0OwogCi0gICAgRlhfQk9PTCBtX2JGb3JjZVBTT3V0cHV0OworICBGWF9CT09MIG1fYkZvcmNlUFNPdXRwdXQ7CiAKLSAgICBzdGF0aWMgaW50IG1fcHNMZXZlbDsKKyAgc3RhdGljIGludCBtX3BzTGV2ZWw7CiB9OwotY2xhc3MgQ0ZYX1dpbkJpdG1hcERldmljZSA6IHB1YmxpYyBDRlhfUmVuZGVyRGV2aWNlCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfV2luQml0bWFwRGV2aWNlIDogcHVibGljIENGWF9SZW5kZXJEZXZpY2UgeworIHB1YmxpYzoKKyAgQ0ZYX1dpbkJpdG1hcERldmljZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpOwogCi0gICAgQ0ZYX1dpbkJpdG1hcERldmljZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpOworICB+Q0ZYX1dpbkJpdG1hcERldmljZSgpOwogCi0gICAgfkNGWF9XaW5CaXRtYXBEZXZpY2UoKTsKKyAgSERDIEdldERDKCkgeyByZXR1cm4gbV9oREM7IH0KIAotICAgIEhEQwkJR2V0REMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1faERDOwotICAgIH0KLXByb3RlY3RlZDoKKyBwcm90ZWN0ZWQ6CisgIEhCSVRNQVAgbV9oQml0bWFwOwogCi0gICAgSEJJVE1BUAltX2hCaXRtYXA7CisgIEhCSVRNQVAgbV9oT2xkQml0bWFwOwogCi0gICAgSEJJVE1BUCBtX2hPbGRCaXRtYXA7Ci0KLSAgICBIREMJCW1faERDOworICBIREMgbV9oREM7CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmNwcCBiL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmNwcAppbmRleCA4M2E0MjBhLi4xNzBjYjU3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdC5jcHAKKysrIGIvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwCkBAIC0xMCwyNDkgKzEwLDI1MCBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIHN0cnVjdCByYzRfc3RhdGUgewotICAgIGludCB4LCB5LCBtWzI1Nl07CisgIGludCB4LCB5LCBtWzI1Nl07CiB9Owotdm9pZCBDUllQVF9BcmNGb3VyU2V0dXAodm9pZCogY29udGV4dCwgIGNvbnN0IHVpbnQ4X3QqIGtleSwgIEZYX0RXT1JEIGxlbmd0aCApCi17Ci0gICAgcmM0X3N0YXRlICpzID0gKHJjNF9zdGF0ZSopY29udGV4dDsKLSAgICBpbnQgaSwgaiwgaywgKm0sIGE7Ci0gICAgcy0+eCA9IDA7Ci0gICAgcy0+eSA9IDA7Ci0gICAgbSA9IHMtPm07Ci0gICAgZm9yKCBpID0gMDsgaSA8IDI1NjsgaSsrICkgewotICAgICAgICBtW2ldID0gaTsKK3ZvaWQgQ1JZUFRfQXJjRm91clNldHVwKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGtleSwgRlhfRFdPUkQgbGVuZ3RoKSB7CisgIHJjNF9zdGF0ZSogcyA9IChyYzRfc3RhdGUqKWNvbnRleHQ7CisgIGludCBpLCBqLCBrLCAqbSwgYTsKKyAgcy0+eCA9IDA7CisgIHMtPnkgPSAwOworICBtID0gcy0+bTsKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgbVtpXSA9IGk7CisgIH0KKyAgaiA9IGsgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICBhID0gbVtpXTsKKyAgICBqID0gKGogKyBhICsga2V5W2tdKSAmIDB4RkY7CisgICAgbVtpXSA9IG1bal07CisgICAgbVtqXSA9IGE7CisgICAgaWYgKCsrayA+PSAoaW50KWxlbmd0aCkgeworICAgICAgayA9IDA7CiAgICAgfQotICAgIGogPSBrID0gMDsKLSAgICBmb3IoIGkgPSAwOyBpIDwgMjU2OyBpKysgKSB7Ci0gICAgICAgIGEgPSBtW2ldOwotICAgICAgICBqID0gKCBqICsgYSArIGtleVtrXSApICYgMHhGRjsKLSAgICAgICAgbVtpXSA9IG1bal07Ci0gICAgICAgIG1bal0gPSBhOwotICAgICAgICBpZiggKytrID49IChpbnQpbGVuZ3RoICkgewotICAgICAgICAgICAgayA9IDA7Ci0gICAgICAgIH0KLSAgICB9CisgIH0KIH0KLXZvaWQgQ1JZUFRfQXJjRm91ckNyeXB0KHZvaWQqIGNvbnRleHQsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIEZYX0RXT1JEIGxlbmd0aCApCi17Ci0gICAgc3RydWN0IHJjNF9zdGF0ZSogcyA9IChzdHJ1Y3QgcmM0X3N0YXRlKiljb250ZXh0OwotICAgIGludCBpLCB4LCB5LCAqbSwgYSwgYjsKLSAgICB4ID0gcy0+eDsKLSAgICB5ID0gcy0+eTsKLSAgICBtID0gcy0+bTsKLSAgICBmb3IoIGkgPSAwOyBpIDwgKGludClsZW5ndGg7IGkrKyApIHsKLSAgICAgICAgeCA9ICggeCArIDEgKSAmIDB4RkY7Ci0gICAgICAgIGEgPSBtW3hdOwotICAgICAgICB5ID0gKCB5ICsgYSApICYgMHhGRjsKLSAgICAgICAgbVt4XSA9IGIgPSBtW3ldOwotICAgICAgICBtW3ldID0gYTsKLSAgICAgICAgZGF0YVtpXSBePSBtWyggYSArIGIgKSAmIDB4RkZdOwotICAgIH0KLSAgICBzLT54ID0geDsKLSAgICBzLT55ID0geTsKK3ZvaWQgQ1JZUFRfQXJjRm91ckNyeXB0KHZvaWQqIGNvbnRleHQsIHVuc2lnbmVkIGNoYXIqIGRhdGEsIEZYX0RXT1JEIGxlbmd0aCkgeworICBzdHJ1Y3QgcmM0X3N0YXRlKiBzID0gKHN0cnVjdCByYzRfc3RhdGUqKWNvbnRleHQ7CisgIGludCBpLCB4LCB5LCAqbSwgYSwgYjsKKyAgeCA9IHMtPng7CisgIHkgPSBzLT55OworICBtID0gcy0+bTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpbGVuZ3RoOyBpKyspIHsKKyAgICB4ID0gKHggKyAxKSAmIDB4RkY7CisgICAgYSA9IG1beF07CisgICAgeSA9ICh5ICsgYSkgJiAweEZGOworICAgIG1beF0gPSBiID0gbVt5XTsKKyAgICBtW3ldID0gYTsKKyAgICBkYXRhW2ldIF49IG1bKGEgKyBiKSAmIDB4RkZdOworICB9CisgIHMtPnggPSB4OworICBzLT55ID0geTsKIH0KLXZvaWQgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2sodWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIGNvbnN0IHVpbnQ4X3QqIGtleSwgRlhfRFdPUkQga2V5bGVuKQotewotICAgIHJjNF9zdGF0ZSBzOwotICAgIENSWVBUX0FyY0ZvdXJTZXR1cCgmcywga2V5LCBrZXlsZW4pOwotICAgIENSWVBUX0FyY0ZvdXJDcnlwdCgmcywgcERhdGEsIHNpemUpOwordm9pZCBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayh1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBrZXlsZW4pIHsKKyAgcmM0X3N0YXRlIHM7CisgIENSWVBUX0FyY0ZvdXJTZXR1cCgmcywga2V5LCBrZXlsZW4pOworICBDUllQVF9BcmNGb3VyQ3J5cHQoJnMsIHBEYXRhLCBzaXplKTsKIH0KIHN0cnVjdCBtZDVfY29udGV4dCB7Ci0gICAgRlhfRFdPUkQgdG90YWxbMl07Ci0gICAgRlhfRFdPUkQgc3RhdGVbNF07Ci0gICAgdWludDhfdCBidWZmZXJbNjRdOworICBGWF9EV09SRCB0b3RhbFsyXTsKKyAgRlhfRFdPUkQgc3RhdGVbNF07CisgIHVpbnQ4X3QgYnVmZmVyWzY0XTsKIH07Ci0jZGVmaW5lIEdFVF9GWF9EV09SRChuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKG4pID0gKEZYX0RXT1JEKSAoKHVpbnQ4X3QgKikgYilbKGkpXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgfCAoKChGWF9EV09SRCkgKCh1aW50OF90ICopIGIpWyhpKSsxXSkgPDwgIDgpICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIHwgKCgoRlhfRFdPUkQpICgodWludDhfdCAqKSBiKVsoaSkrMl0pIDw8IDE2KSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICB8ICgoKEZYX0RXT1JEKSAoKHVpbnQ4X3QgKikgYilbKGkpKzNdKSA8PCAyNCk7ICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0jZGVmaW5lIFBVVF9GWF9EV09SRChuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKCgodWludDhfdCAqKSBiKVsoaSldICApID0gKHVpbnQ4X3QpICgoKG4pICAgICAgKSAmIDB4RkYpOyAgICAgIFwKLSAgICAgICAgKCgodWludDhfdCAqKSBiKVsoaSkrMV0pID0gKHVpbnQ4X3QpICgoKG4pID4+ICA4KSAmIDB4RkYpOyAgICAgIFwKLSAgICAgICAgKCgodWludDhfdCAqKSBiKVsoaSkrMl0pID0gKHVpbnQ4X3QpICgoKG4pID4+IDE2KSAmIDB4RkYpOyAgICAgIFwKLSAgICAgICAgKCgodWludDhfdCAqKSBiKVsoaSkrM10pID0gKHVpbnQ4X3QpICgoKG4pID4+IDI0KSAmIDB4RkYpOyAgICAgIFwKLSAgICB9Ci12b2lkIG1kNV9wcm9jZXNzKCBzdHJ1Y3QgbWQ1X2NvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCBkYXRhWzY0XSApCi17Ci0gICAgRlhfRFdPUkQgQSwgQiwgQywgRCwgWFsxNl07Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzBdLCAgZGF0YSwgIDAgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFhbMV0sICBkYXRhLCAgNCApOwotICAgIEdFVF9GWF9EV09SRCggWFsyXSwgIGRhdGEsICA4ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzNdLCAgZGF0YSwgMTIgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFhbNF0sICBkYXRhLCAxNiApOwotICAgIEdFVF9GWF9EV09SRCggWFs1XSwgIGRhdGEsIDIwICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzZdLCAgZGF0YSwgMjQgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFhbN10sICBkYXRhLCAyOCApOwotICAgIEdFVF9GWF9EV09SRCggWFs4XSwgIGRhdGEsIDMyICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzldLCAgZGF0YSwgMzYgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFhbMTBdLCBkYXRhLCA0MCApOwotICAgIEdFVF9GWF9EV09SRCggWFsxMV0sIGRhdGEsIDQ0ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzEyXSwgZGF0YSwgNDggKTsKLSAgICBHRVRfRlhfRFdPUkQoIFhbMTNdLCBkYXRhLCA1MiApOwotICAgIEdFVF9GWF9EV09SRCggWFsxNF0sIGRhdGEsIDU2ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzE1XSwgZGF0YSwgNjAgKTsKLSNkZWZpbmUgUyh4LG4pICgoeCA8PCBuKSB8ICgoeCAmIDB4RkZGRkZGRkYpID4+ICgzMiAtIG4pKSkKLSNkZWZpbmUgUChhLGIsYyxkLGsscyx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBhICs9IEYoYixjLGQpICsgWFtrXSArIHQ7IGEgPSBTKGEscykgKyBiOyAgICAgICAgICAgXAotICAgIH0KLSAgICBBID0gY3R4LT5zdGF0ZVswXTsKLSAgICBCID0gY3R4LT5zdGF0ZVsxXTsKLSAgICBDID0gY3R4LT5zdGF0ZVsyXTsKLSAgICBEID0gY3R4LT5zdGF0ZVszXTsKLSNkZWZpbmUgRih4LHkseikgKHogXiAoeCAmICh5IF4geikpKQotICAgIFAoIEEsIEIsIEMsIEQsICAwLCAgNywgMHhENzZBQTQ3OCApOwotICAgIFAoIEQsIEEsIEIsIEMsICAxLCAxMiwgMHhFOEM3Qjc1NiApOwotICAgIFAoIEMsIEQsIEEsIEIsICAyLCAxNywgMHgyNDIwNzBEQiApOwotICAgIFAoIEIsIEMsIEQsIEEsICAzLCAyMiwgMHhDMUJEQ0VFRSApOwotICAgIFAoIEEsIEIsIEMsIEQsICA0LCAgNywgMHhGNTdDMEZBRiApOwotICAgIFAoIEQsIEEsIEIsIEMsICA1LCAxMiwgMHg0Nzg3QzYyQSApOwotICAgIFAoIEMsIEQsIEEsIEIsICA2LCAxNywgMHhBODMwNDYxMyApOwotICAgIFAoIEIsIEMsIEQsIEEsICA3LCAyMiwgMHhGRDQ2OTUwMSApOwotICAgIFAoIEEsIEIsIEMsIEQsICA4LCAgNywgMHg2OTgwOThEOCApOwotICAgIFAoIEQsIEEsIEIsIEMsICA5LCAxMiwgMHg4QjQ0RjdBRiApOwotICAgIFAoIEMsIEQsIEEsIEIsIDEwLCAxNywgMHhGRkZGNUJCMSApOwotICAgIFAoIEIsIEMsIEQsIEEsIDExLCAyMiwgMHg4OTVDRDdCRSApOwotICAgIFAoIEEsIEIsIEMsIEQsIDEyLCAgNywgMHg2QjkwMTEyMiApOwotICAgIFAoIEQsIEEsIEIsIEMsIDEzLCAxMiwgMHhGRDk4NzE5MyApOwotICAgIFAoIEMsIEQsIEEsIEIsIDE0LCAxNywgMHhBNjc5NDM4RSApOwotICAgIFAoIEIsIEMsIEQsIEEsIDE1LCAyMiwgMHg0OUI0MDgyMSApOworI2RlZmluZSBHRVRfRlhfRFdPUkQobiwgYiwgaSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKG4pID0gKEZYX0RXT1JEKSgodWludDhfdCopYilbKGkpXSB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoKEZYX0RXT1JEKSgodWludDhfdCopYilbKGkpICsgMV0pIDw8IDgpIHwgIFwKKyAgICAgICAgICAoKChGWF9EV09SRCkoKHVpbnQ4X3QqKWIpWyhpKSArIDJdKSA8PCAxNikgfCBcCisgICAgICAgICAgKCgoRlhfRFdPUkQpKCh1aW50OF90KiliKVsoaSkgKyAzXSkgPDwgMjQpOyAgXAorICB9CisjZGVmaW5lIFBVVF9GWF9EV09SRChuLCBiLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKHVpbnQ4X3QqKWIpWyhpKV0pID0gKHVpbnQ4X3QpKCgobikpICYgMHhGRik7ICAgICAgICAgICBcCisgICAgKCgodWludDhfdCopYilbKGkpICsgMV0pID0gKHVpbnQ4X3QpKCgobikgPj4gOCkgJiAweEZGKTsgIFwKKyAgICAoKCh1aW50OF90KiliKVsoaSkgKyAyXSkgPSAodWludDhfdCkoKChuKSA+PiAxNikgJiAweEZGKTsgXAorICAgICgoKHVpbnQ4X3QqKWIpWyhpKSArIDNdKSA9ICh1aW50OF90KSgoKG4pID4+IDI0KSAmIDB4RkYpOyBcCisgIH0KK3ZvaWQgbWQ1X3Byb2Nlc3Moc3RydWN0IG1kNV9jb250ZXh0KiBjdHgsIGNvbnN0IHVpbnQ4X3QgZGF0YVs2NF0pIHsKKyAgRlhfRFdPUkQgQSwgQiwgQywgRCwgWFsxNl07CisgIEdFVF9GWF9EV09SRChYWzBdLCBkYXRhLCAwKTsKKyAgR0VUX0ZYX0RXT1JEKFhbMV0sIGRhdGEsIDQpOworICBHRVRfRlhfRFdPUkQoWFsyXSwgZGF0YSwgOCk7CisgIEdFVF9GWF9EV09SRChYWzNdLCBkYXRhLCAxMik7CisgIEdFVF9GWF9EV09SRChYWzRdLCBkYXRhLCAxNik7CisgIEdFVF9GWF9EV09SRChYWzVdLCBkYXRhLCAyMCk7CisgIEdFVF9GWF9EV09SRChYWzZdLCBkYXRhLCAyNCk7CisgIEdFVF9GWF9EV09SRChYWzddLCBkYXRhLCAyOCk7CisgIEdFVF9GWF9EV09SRChYWzhdLCBkYXRhLCAzMik7CisgIEdFVF9GWF9EV09SRChYWzldLCBkYXRhLCAzNik7CisgIEdFVF9GWF9EV09SRChYWzEwXSwgZGF0YSwgNDApOworICBHRVRfRlhfRFdPUkQoWFsxMV0sIGRhdGEsIDQ0KTsKKyAgR0VUX0ZYX0RXT1JEKFhbMTJdLCBkYXRhLCA0OCk7CisgIEdFVF9GWF9EV09SRChYWzEzXSwgZGF0YSwgNTIpOworICBHRVRfRlhfRFdPUkQoWFsxNF0sIGRhdGEsIDU2KTsKKyAgR0VUX0ZYX0RXT1JEKFhbMTVdLCBkYXRhLCA2MCk7CisjZGVmaW5lIFMoeCwgbikgKCh4IDw8IG4pIHwgKCh4ICYgMHhGRkZGRkZGRikgPj4gKDMyIC0gbikpKQorI2RlZmluZSBQKGEsIGIsIGMsIGQsIGssIHMsIHQpICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhICs9IEYoYiwgYywgZCkgKyBYW2tdICsgdDsgXAorICAgIGEgPSBTKGEsIHMpICsgYjsgICAgICAgICAgICBcCisgIH0KKyAgQSA9IGN0eC0+c3RhdGVbMF07CisgIEIgPSBjdHgtPnN0YXRlWzFdOworICBDID0gY3R4LT5zdGF0ZVsyXTsKKyAgRCA9IGN0eC0+c3RhdGVbM107CisjZGVmaW5lIEYoeCwgeSwgeikgKHogXiAoeCAmICh5IF4geikpKQorICBQKEEsIEIsIEMsIEQsIDAsIDcsIDB4RDc2QUE0NzgpOworICBQKEQsIEEsIEIsIEMsIDEsIDEyLCAweEU4QzdCNzU2KTsKKyAgUChDLCBELCBBLCBCLCAyLCAxNywgMHgyNDIwNzBEQik7CisgIFAoQiwgQywgRCwgQSwgMywgMjIsIDB4QzFCRENFRUUpOworICBQKEEsIEIsIEMsIEQsIDQsIDcsIDB4RjU3QzBGQUYpOworICBQKEQsIEEsIEIsIEMsIDUsIDEyLCAweDQ3ODdDNjJBKTsKKyAgUChDLCBELCBBLCBCLCA2LCAxNywgMHhBODMwNDYxMyk7CisgIFAoQiwgQywgRCwgQSwgNywgMjIsIDB4RkQ0Njk1MDEpOworICBQKEEsIEIsIEMsIEQsIDgsIDcsIDB4Njk4MDk4RDgpOworICBQKEQsIEEsIEIsIEMsIDksIDEyLCAweDhCNDRGN0FGKTsKKyAgUChDLCBELCBBLCBCLCAxMCwgMTcsIDB4RkZGRjVCQjEpOworICBQKEIsIEMsIEQsIEEsIDExLCAyMiwgMHg4OTVDRDdCRSk7CisgIFAoQSwgQiwgQywgRCwgMTIsIDcsIDB4NkI5MDExMjIpOworICBQKEQsIEEsIEIsIEMsIDEzLCAxMiwgMHhGRDk4NzE5Myk7CisgIFAoQywgRCwgQSwgQiwgMTQsIDE3LCAweEE2Nzk0MzhFKTsKKyAgUChCLCBDLCBELCBBLCAxNSwgMjIsIDB4NDlCNDA4MjEpOwogI3VuZGVmIEYKLSNkZWZpbmUgRih4LHkseikgKHkgXiAoeiAmICh4IF4geSkpKQotICAgIFAoIEEsIEIsIEMsIEQsICAxLCAgNSwgMHhGNjFFMjU2MiApOwotICAgIFAoIEQsIEEsIEIsIEMsICA2LCAgOSwgMHhDMDQwQjM0MCApOwotICAgIFAoIEMsIEQsIEEsIEIsIDExLCAxNCwgMHgyNjVFNUE1MSApOwotICAgIFAoIEIsIEMsIEQsIEEsICAwLCAyMCwgMHhFOUI2QzdBQSApOwotICAgIFAoIEEsIEIsIEMsIEQsICA1LCAgNSwgMHhENjJGMTA1RCApOwotICAgIFAoIEQsIEEsIEIsIEMsIDEwLCAgOSwgMHgwMjQ0MTQ1MyApOwotICAgIFAoIEMsIEQsIEEsIEIsIDE1LCAxNCwgMHhEOEExRTY4MSApOwotICAgIFAoIEIsIEMsIEQsIEEsICA0LCAyMCwgMHhFN0QzRkJDOCApOwotICAgIFAoIEEsIEIsIEMsIEQsICA5LCAgNSwgMHgyMUUxQ0RFNiApOwotICAgIFAoIEQsIEEsIEIsIEMsIDE0LCAgOSwgMHhDMzM3MDdENiApOwotICAgIFAoIEMsIEQsIEEsIEIsICAzLCAxNCwgMHhGNEQ1MEQ4NyApOwotICAgIFAoIEIsIEMsIEQsIEEsICA4LCAyMCwgMHg0NTVBMTRFRCApOwotICAgIFAoIEEsIEIsIEMsIEQsIDEzLCAgNSwgMHhBOUUzRTkwNSApOwotICAgIFAoIEQsIEEsIEIsIEMsICAyLCAgOSwgMHhGQ0VGQTNGOCApOwotICAgIFAoIEMsIEQsIEEsIEIsICA3LCAxNCwgMHg2NzZGMDJEOSApOwotICAgIFAoIEIsIEMsIEQsIEEsIDEyLCAyMCwgMHg4RDJBNEM4QSApOworI2RlZmluZSBGKHgsIHksIHopICh5IF4gKHogJiAoeCBeIHkpKSkKKyAgUChBLCBCLCBDLCBELCAxLCA1LCAweEY2MUUyNTYyKTsKKyAgUChELCBBLCBCLCBDLCA2LCA5LCAweEMwNDBCMzQwKTsKKyAgUChDLCBELCBBLCBCLCAxMSwgMTQsIDB4MjY1RTVBNTEpOworICBQKEIsIEMsIEQsIEEsIDAsIDIwLCAweEU5QjZDN0FBKTsKKyAgUChBLCBCLCBDLCBELCA1LCA1LCAweEQ2MkYxMDVEKTsKKyAgUChELCBBLCBCLCBDLCAxMCwgOSwgMHgwMjQ0MTQ1Myk7CisgIFAoQywgRCwgQSwgQiwgMTUsIDE0LCAweEQ4QTFFNjgxKTsKKyAgUChCLCBDLCBELCBBLCA0LCAyMCwgMHhFN0QzRkJDOCk7CisgIFAoQSwgQiwgQywgRCwgOSwgNSwgMHgyMUUxQ0RFNik7CisgIFAoRCwgQSwgQiwgQywgMTQsIDksIDB4QzMzNzA3RDYpOworICBQKEMsIEQsIEEsIEIsIDMsIDE0LCAweEY0RDUwRDg3KTsKKyAgUChCLCBDLCBELCBBLCA4LCAyMCwgMHg0NTVBMTRFRCk7CisgIFAoQSwgQiwgQywgRCwgMTMsIDUsIDB4QTlFM0U5MDUpOworICBQKEQsIEEsIEIsIEMsIDIsIDksIDB4RkNFRkEzRjgpOworICBQKEMsIEQsIEEsIEIsIDcsIDE0LCAweDY3NkYwMkQ5KTsKKyAgUChCLCBDLCBELCBBLCAxMiwgMjAsIDB4OEQyQTRDOEEpOwogI3VuZGVmIEYKLSNkZWZpbmUgRih4LHkseikgKHggXiB5IF4geikKLSAgICBQKCBBLCBCLCBDLCBELCAgNSwgIDQsIDB4RkZGQTM5NDIgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAgOCwgMTEsIDB4ODc3MUY2ODEgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAxMSwgMTYsIDB4NkQ5RDYxMjIgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAxNCwgMjMsIDB4RkRFNTM4MEMgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAgMSwgIDQsIDB4QTRCRUVBNDQgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAgNCwgMTEsIDB4NEJERUNGQTkgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAgNywgMTYsIDB4RjZCQjRCNjAgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAxMCwgMjMsIDB4QkVCRkJDNzAgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAxMywgIDQsIDB4Mjg5QjdFQzYgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAgMCwgMTEsIDB4RUFBMTI3RkEgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAgMywgMTYsIDB4RDRFRjMwODUgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAgNiwgMjMsIDB4MDQ4ODFEMDUgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAgOSwgIDQsIDB4RDlENEQwMzkgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAxMiwgMTEsIDB4RTZEQjk5RTUgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAxNSwgMTYsIDB4MUZBMjdDRjggKTsKLSAgICBQKCBCLCBDLCBELCBBLCAgMiwgMjMsIDB4QzRBQzU2NjUgKTsKKyNkZWZpbmUgRih4LCB5LCB6KSAoeCBeIHkgXiB6KQorICBQKEEsIEIsIEMsIEQsIDUsIDQsIDB4RkZGQTM5NDIpOworICBQKEQsIEEsIEIsIEMsIDgsIDExLCAweDg3NzFGNjgxKTsKKyAgUChDLCBELCBBLCBCLCAxMSwgMTYsIDB4NkQ5RDYxMjIpOworICBQKEIsIEMsIEQsIEEsIDE0LCAyMywgMHhGREU1MzgwQyk7CisgIFAoQSwgQiwgQywgRCwgMSwgNCwgMHhBNEJFRUE0NCk7CisgIFAoRCwgQSwgQiwgQywgNCwgMTEsIDB4NEJERUNGQTkpOworICBQKEMsIEQsIEEsIEIsIDcsIDE2LCAweEY2QkI0QjYwKTsKKyAgUChCLCBDLCBELCBBLCAxMCwgMjMsIDB4QkVCRkJDNzApOworICBQKEEsIEIsIEMsIEQsIDEzLCA0LCAweDI4OUI3RUM2KTsKKyAgUChELCBBLCBCLCBDLCAwLCAxMSwgMHhFQUExMjdGQSk7CisgIFAoQywgRCwgQSwgQiwgMywgMTYsIDB4RDRFRjMwODUpOworICBQKEIsIEMsIEQsIEEsIDYsIDIzLCAweDA0ODgxRDA1KTsKKyAgUChBLCBCLCBDLCBELCA5LCA0LCAweEQ5RDREMDM5KTsKKyAgUChELCBBLCBCLCBDLCAxMiwgMTEsIDB4RTZEQjk5RTUpOworICBQKEMsIEQsIEEsIEIsIDE1LCAxNiwgMHgxRkEyN0NGOCk7CisgIFAoQiwgQywgRCwgQSwgMiwgMjMsIDB4QzRBQzU2NjUpOwogI3VuZGVmIEYKLSNkZWZpbmUgRih4LHkseikgKHkgXiAoeCB8IH56KSkKLSAgICBQKCBBLCBCLCBDLCBELCAgMCwgIDYsIDB4RjQyOTIyNDQgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAgNywgMTAsIDB4NDMyQUZGOTcgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAxNCwgMTUsIDB4QUI5NDIzQTcgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAgNSwgMjEsIDB4RkM5M0EwMzkgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAxMiwgIDYsIDB4NjU1QjU5QzMgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAgMywgMTAsIDB4OEYwQ0NDOTIgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAxMCwgMTUsIDB4RkZFRkY0N0QgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAgMSwgMjEsIDB4ODU4NDVERDEgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAgOCwgIDYsIDB4NkZBODdFNEYgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAxNSwgMTAsIDB4RkUyQ0U2RTAgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAgNiwgMTUsIDB4QTMwMTQzMTQgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAxMywgMjEsIDB4NEUwODExQTEgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAgNCwgIDYsIDB4Rjc1MzdFODIgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAxMSwgMTAsIDB4QkQzQUYyMzUgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAgMiwgMTUsIDB4MkFEN0QyQkIgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAgOSwgMjEsIDB4RUI4NkQzOTEgKTsKKyNkZWZpbmUgRih4LCB5LCB6KSAoeSBeICh4IHwgfnopKQorICBQKEEsIEIsIEMsIEQsIDAsIDYsIDB4RjQyOTIyNDQpOworICBQKEQsIEEsIEIsIEMsIDcsIDEwLCAweDQzMkFGRjk3KTsKKyAgUChDLCBELCBBLCBCLCAxNCwgMTUsIDB4QUI5NDIzQTcpOworICBQKEIsIEMsIEQsIEEsIDUsIDIxLCAweEZDOTNBMDM5KTsKKyAgUChBLCBCLCBDLCBELCAxMiwgNiwgMHg2NTVCNTlDMyk7CisgIFAoRCwgQSwgQiwgQywgMywgMTAsIDB4OEYwQ0NDOTIpOworICBQKEMsIEQsIEEsIEIsIDEwLCAxNSwgMHhGRkVGRjQ3RCk7CisgIFAoQiwgQywgRCwgQSwgMSwgMjEsIDB4ODU4NDVERDEpOworICBQKEEsIEIsIEMsIEQsIDgsIDYsIDB4NkZBODdFNEYpOworICBQKEQsIEEsIEIsIEMsIDE1LCAxMCwgMHhGRTJDRTZFMCk7CisgIFAoQywgRCwgQSwgQiwgNiwgMTUsIDB4QTMwMTQzMTQpOworICBQKEIsIEMsIEQsIEEsIDEzLCAyMSwgMHg0RTA4MTFBMSk7CisgIFAoQSwgQiwgQywgRCwgNCwgNiwgMHhGNzUzN0U4Mik7CisgIFAoRCwgQSwgQiwgQywgMTEsIDEwLCAweEJEM0FGMjM1KTsKKyAgUChDLCBELCBBLCBCLCAyLCAxNSwgMHgyQUQ3RDJCQik7CisgIFAoQiwgQywgRCwgQSwgOSwgMjEsIDB4RUI4NkQzOTEpOwogI3VuZGVmIEYKLSAgICBjdHgtPnN0YXRlWzBdICs9IEE7Ci0gICAgY3R4LT5zdGF0ZVsxXSArPSBCOwotICAgIGN0eC0+c3RhdGVbMl0gKz0gQzsKLSAgICBjdHgtPnN0YXRlWzNdICs9IEQ7CisgIGN0eC0+c3RhdGVbMF0gKz0gQTsKKyAgY3R4LT5zdGF0ZVsxXSArPSBCOworICBjdHgtPnN0YXRlWzJdICs9IEM7CisgIGN0eC0+c3RhdGVbM10gKz0gRDsKIH0KLXZvaWQgQ1JZUFRfTUQ1U3RhcnQodm9pZCogY29udGV4dCkKLXsKLSAgICBzdHJ1Y3QgbWQ1X2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgbWQ1X2NvbnRleHQqKWNvbnRleHQ7Ci0gICAgY3R4LT50b3RhbFswXSA9IDA7Ci0gICAgY3R4LT50b3RhbFsxXSA9IDA7Ci0gICAgY3R4LT5zdGF0ZVswXSA9IDB4Njc0NTIzMDE7Ci0gICAgY3R4LT5zdGF0ZVsxXSA9IDB4RUZDREFCODk7Ci0gICAgY3R4LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7Ci0gICAgY3R4LT5zdGF0ZVszXSA9IDB4MTAzMjU0NzY7Cit2b2lkIENSWVBUX01ENVN0YXJ0KHZvaWQqIGNvbnRleHQpIHsKKyAgc3RydWN0IG1kNV9jb250ZXh0KiBjdHggPSAoc3RydWN0IG1kNV9jb250ZXh0Kiljb250ZXh0OworICBjdHgtPnRvdGFsWzBdID0gMDsKKyAgY3R4LT50b3RhbFsxXSA9IDA7CisgIGN0eC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOworICBjdHgtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKyAgY3R4LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7CisgIGN0eC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OwogfQotdm9pZCBDUllQVF9NRDVVcGRhdGUodm9pZCogcGN0eCwgY29uc3QgdWludDhfdCogaW5wdXQsIEZYX0RXT1JEIGxlbmd0aCApCi17Ci0gICAgc3RydWN0IG1kNV9jb250ZXh0ICpjdHggPSAoc3RydWN0IG1kNV9jb250ZXh0ICopcGN0eDsKLSAgICBGWF9EV09SRCBsZWZ0LCBmaWxsOwotICAgIGlmKCAhIGxlbmd0aCApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsZWZ0ID0gKCBjdHgtPnRvdGFsWzBdID4+IDMgKSAmIDB4M0Y7Ci0gICAgZmlsbCA9IDY0IC0gbGVmdDsKLSAgICBjdHgtPnRvdGFsWzBdICs9IGxlbmd0aCA8PCAgMzsKLSAgICBjdHgtPnRvdGFsWzFdICs9IGxlbmd0aCA+PiAyOTsKLSAgICBjdHgtPnRvdGFsWzBdICY9IDB4RkZGRkZGRkY7Ci0gICAgY3R4LT50b3RhbFsxXSArPSBjdHgtPnRvdGFsWzBdIDwgbGVuZ3RoIDw8IDM7Ci0gICAgaWYoIGxlZnQgJiYgbGVuZ3RoID49IGZpbGwgKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweSggKHZvaWQgKikgKGN0eC0+YnVmZmVyICsgbGVmdCksICh2b2lkICopIGlucHV0LCBmaWxsICk7Ci0gICAgICAgIG1kNV9wcm9jZXNzKCBjdHgsIGN0eC0+YnVmZmVyICk7Ci0gICAgICAgIGxlbmd0aCAtPSBmaWxsOwotICAgICAgICBpbnB1dCAgKz0gZmlsbDsKLSAgICAgICAgbGVmdCA9IDA7Ci0gICAgfQotICAgIHdoaWxlKCBsZW5ndGggPj0gNjQgKSB7Ci0gICAgICAgIG1kNV9wcm9jZXNzKCBjdHgsIGlucHV0ICk7Ci0gICAgICAgIGxlbmd0aCAtPSA2NDsKLSAgICAgICAgaW5wdXQgICs9IDY0OwotICAgIH0KLSAgICBpZiggbGVuZ3RoICkgewotICAgICAgICBGWFNZU19tZW1jcHkoICh2b2lkICopIChjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCAqKSBpbnB1dCwgbGVuZ3RoICk7Ci0gICAgfQordm9pZCBDUllQVF9NRDVVcGRhdGUodm9pZCogcGN0eCwgY29uc3QgdWludDhfdCogaW5wdXQsIEZYX0RXT1JEIGxlbmd0aCkgeworICBzdHJ1Y3QgbWQ1X2NvbnRleHQqIGN0eCA9IChzdHJ1Y3QgbWQ1X2NvbnRleHQqKXBjdHg7CisgIEZYX0RXT1JEIGxlZnQsIGZpbGw7CisgIGlmICghbGVuZ3RoKSB7CisgICAgcmV0dXJuOworICB9CisgIGxlZnQgPSAoY3R4LT50b3RhbFswXSA+PiAzKSAmIDB4M0Y7CisgIGZpbGwgPSA2NCAtIGxlZnQ7CisgIGN0eC0+dG90YWxbMF0gKz0gbGVuZ3RoIDw8IDM7CisgIGN0eC0+dG90YWxbMV0gKz0gbGVuZ3RoID4+IDI5OworICBjdHgtPnRvdGFsWzBdICY9IDB4RkZGRkZGRkY7CisgIGN0eC0+dG90YWxbMV0gKz0gY3R4LT50b3RhbFswXSA8IGxlbmd0aCA8PCAzOworICBpZiAobGVmdCAmJiBsZW5ndGggPj0gZmlsbCkgeworICAgIEZYU1lTX21lbWNweSgodm9pZCopKGN0eC0+YnVmZmVyICsgbGVmdCksICh2b2lkKilpbnB1dCwgZmlsbCk7CisgICAgbWQ1X3Byb2Nlc3MoY3R4LCBjdHgtPmJ1ZmZlcik7CisgICAgbGVuZ3RoIC09IGZpbGw7CisgICAgaW5wdXQgKz0gZmlsbDsKKyAgICBsZWZ0ID0gMDsKKyAgfQorICB3aGlsZSAobGVuZ3RoID49IDY0KSB7CisgICAgbWQ1X3Byb2Nlc3MoY3R4LCBpbnB1dCk7CisgICAgbGVuZ3RoIC09IDY0OworICAgIGlucHV0ICs9IDY0OworICB9CisgIGlmIChsZW5ndGgpIHsKKyAgICBGWFNZU19tZW1jcHkoKHZvaWQqKShjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCopaW5wdXQsIGxlbmd0aCk7CisgIH0KIH0KIGNvbnN0IHVpbnQ4X3QgbWQ1X3BhZGRpbmdbNjRdID0gewotICAgIDB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLX07Ci12b2lkIENSWVBUX01ENUZpbmlzaCh2b2lkKiBwY3R4LCB1aW50OF90IGRpZ2VzdFsxNl0gKQotewotICAgIHN0cnVjdCBtZDVfY29udGV4dCAqY3R4ID0gKHN0cnVjdCBtZDVfY29udGV4dCAqKXBjdHg7Ci0gICAgRlhfRFdPUkQgbGFzdCwgcGFkbjsKLSAgICB1aW50OF90IG1zZ2xlbls4XTsKLSAgICBQVVRfRlhfRFdPUkQoIGN0eC0+dG90YWxbMF0sIG1zZ2xlbiwgMCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT50b3RhbFsxXSwgbXNnbGVuLCA0ICk7Ci0gICAgbGFzdCA9ICggY3R4LT50b3RhbFswXSA+PiAzICkgJiAweDNGOwotICAgIHBhZG4gPSAoIGxhc3QgPCA1NiApID8gKCA1NiAtIGxhc3QgKSA6ICggMTIwIC0gbGFzdCApOwotICAgIENSWVBUX01ENVVwZGF0ZSggY3R4LCBtZDVfcGFkZGluZywgcGFkbiApOwotICAgIENSWVBUX01ENVVwZGF0ZSggY3R4LCBtc2dsZW4sIDggKTsKLSAgICBQVVRfRlhfRFdPUkQoIGN0eC0+c3RhdGVbMF0sIGRpZ2VzdCwgIDAgKTsKLSAgICBQVVRfRlhfRFdPUkQoIGN0eC0+c3RhdGVbMV0sIGRpZ2VzdCwgIDQgKTsKLSAgICBQVVRfRlhfRFdPUkQoIGN0eC0+c3RhdGVbMl0sIGRpZ2VzdCwgIDggKTsKLSAgICBQVVRfRlhfRFdPUkQoIGN0eC0+c3RhdGVbM10sIGRpZ2VzdCwgMTIgKTsKKyAgICAweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Cit2b2lkIENSWVBUX01ENUZpbmlzaCh2b2lkKiBwY3R4LCB1aW50OF90IGRpZ2VzdFsxNl0pIHsKKyAgc3RydWN0IG1kNV9jb250ZXh0KiBjdHggPSAoc3RydWN0IG1kNV9jb250ZXh0KilwY3R4OworICBGWF9EV09SRCBsYXN0LCBwYWRuOworICB1aW50OF90IG1zZ2xlbls4XTsKKyAgUFVUX0ZYX0RXT1JEKGN0eC0+dG90YWxbMF0sIG1zZ2xlbiwgMCk7CisgIFBVVF9GWF9EV09SRChjdHgtPnRvdGFsWzFdLCBtc2dsZW4sIDQpOworICBsYXN0ID0gKGN0eC0+dG90YWxbMF0gPj4gMykgJiAweDNGOworICBwYWRuID0gKGxhc3QgPCA1NikgPyAoNTYgLSBsYXN0KSA6ICgxMjAgLSBsYXN0KTsKKyAgQ1JZUFRfTUQ1VXBkYXRlKGN0eCwgbWQ1X3BhZGRpbmcsIHBhZG4pOworICBDUllQVF9NRDVVcGRhdGUoY3R4LCBtc2dsZW4sIDgpOworICBQVVRfRlhfRFdPUkQoY3R4LT5zdGF0ZVswXSwgZGlnZXN0LCAwKTsKKyAgUFVUX0ZYX0RXT1JEKGN0eC0+c3RhdGVbMV0sIGRpZ2VzdCwgNCk7CisgIFBVVF9GWF9EV09SRChjdHgtPnN0YXRlWzJdLCBkaWdlc3QsIDgpOworICBQVVRfRlhfRFdPUkQoY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAxMik7CiB9Ci12b2lkIENSWVBUX01ENUdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGlucHV0LCBGWF9EV09SRCBsZW5ndGgsIHVpbnQ4X3QgZGlnZXN0WzE2XSkKLXsKLSAgICBtZDVfY29udGV4dCBjdHg7Ci0gICAgQ1JZUFRfTUQ1U3RhcnQoJmN0eCk7Ci0gICAgQ1JZUFRfTUQ1VXBkYXRlKCZjdHgsIGlucHV0LCBsZW5ndGgpOwotICAgIENSWVBUX01ENUZpbmlzaCgmY3R4LCBkaWdlc3QpOwordm9pZCBDUllQVF9NRDVHZW5lcmF0ZShjb25zdCB1aW50OF90KiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpZ2VzdFsxNl0pIHsKKyAgbWQ1X2NvbnRleHQgY3R4OworICBDUllQVF9NRDVTdGFydCgmY3R4KTsKKyAgQ1JZUFRfTUQ1VXBkYXRlKCZjdHgsIGlucHV0LCBsZW5ndGgpOworICBDUllQVF9NRDVGaW5pc2goJmN0eCwgZGlnZXN0KTsKIH0KLXN0YXRpYyBGWF9CT09MICgqZ19QdWJLZXlEZWNyeXB0b3IpKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90KiBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfbGVuKSA9IE5VTEw7Ci12b2lkIENSWVBUX1NldFB1YktleURlY3J5cHRvcihGWF9CT09MICgqZnVuYykoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIHVpbnQ4X3QqIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9sZW4pKQotewotICAgIGdfUHViS2V5RGVjcnlwdG9yID0gZnVuYzsKK3N0YXRpYyBGWF9CT09MICgqZ19QdWJLZXlEZWNyeXB0b3IpKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGFfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRhdGFfbGVuKSA9IE5VTEw7Cit2b2lkIENSWVBUX1NldFB1YktleURlY3J5cHRvcihGWF9CT09MICgqZnVuYykoY29uc3QgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGF0YV9sZW4pKSB7CisgIGdfUHViS2V5RGVjcnlwdG9yID0gZnVuYzsKIH0KICNpZmRlZiBfX2NwbHVzcGx1cwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X2Flcy5jcHAgYi9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9hZXMuY3BwCmluZGV4IDRiZDg3MTAuLjc1MWU4ODkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X2Flcy5jcHAKKysrIGIvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfYWVzLmNwcApAQCAtMTEsNzM4ICsxMSw1MzIgQEAKICNkZWZpbmUgTUFYX05SIDE0CiAjZGVmaW5lIE1BWF9OSyA4CiAjZGVmaW5lIE1BWF9OQiA4Ci0jZGVmaW5lIG11bGJ5Mih4KSAoICgoeCYweDdGKSA8PCAxKSBeICh4ICYgMHg4MCA/IDB4MUIgOiAwKSApCi0jZGVmaW5lIEdFVF8zMkJJVF9NU0JfRklSU1QoY3ApIFwKLSAgICAoKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBjaGFyKShjcClbM10pIHwgXAotICAgICAoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGNoYXIpKGNwKVsyXSA8PCA4KSB8IFwKLSAgICAgKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBjaGFyKShjcClbMV0gPDwgMTYpIHwgXAotICAgICAoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGNoYXIpKGNwKVswXSA8PCAyNCkpCi0jZGVmaW5lIFBVVF8zMkJJVF9NU0JfRklSU1QoY3AsIHZhbHVlKSBkbyB7IFwKLSAgICAgICAgKGNwKVszXSA9ICh2YWx1ZSk7IFwKLSAgICAgICAgKGNwKVsyXSA9ICh2YWx1ZSkgPj4gODsgXAotICAgICAgICAoY3ApWzFdID0gKHZhbHVlKSA+PiAxNjsgXAotICAgICAgICAoY3ApWzBdID0gKHZhbHVlKSA+PiAyNDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbXVsYnkyKHgpICgoKHggJiAweDdGKSA8PCAxKSBeICh4ICYgMHg4MCA/IDB4MUIgOiAwKSkKKyNkZWZpbmUgR0VUXzMyQklUX01TQl9GSVJTVChjcCkgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgodW5zaWduZWQgbG9uZykodW5zaWduZWQgY2hhcikoY3ApWzNdKSB8ICAgICAgIFwKKyAgICgodW5zaWduZWQgbG9uZykodW5zaWduZWQgY2hhcikoY3ApWzJdIDw8IDgpIHwgIFwKKyAgICgodW5zaWduZWQgbG9uZykodW5zaWduZWQgY2hhcikoY3ApWzFdIDw8IDE2KSB8IFwKKyAgICgodW5zaWduZWQgbG9uZykodW5zaWduZWQgY2hhcikoY3ApWzBdIDw8IDI0KSkKKyNkZWZpbmUgUFVUXzMyQklUX01TQl9GSVJTVChjcCwgdmFsdWUpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoY3ApWzNdID0gKHZhbHVlKTsgICAgICAgICAgICAgICAgIFwKKyAgICAoY3ApWzJdID0gKHZhbHVlKSA+PiA4OyAgICAgICAgICAgIFwKKyAgICAoY3ApWzFdID0gKHZhbHVlKSA+PiAxNjsgICAgICAgICAgIFwKKyAgICAoY3ApWzBdID0gKHZhbHVlKSA+PiAyNDsgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKIHN0cnVjdCBBRVNDb250ZXh0IHsKLSAgICB1bnNpZ25lZCBpbnQga2V5c2NoZWRbKE1BWF9OUiArIDEpICogTUFYX05CXTsKLSAgICB1bnNpZ25lZCBpbnQgaW52a2V5c2NoZWRbKE1BWF9OUiArIDEpICogTUFYX05CXTsKLSAgICB2b2lkICgqZW5jcnlwdCkgKEFFU0NvbnRleHQgKiBjdHgsIHVuc2lnbmVkIGludCAqIGJsb2NrKTsKLSAgICB2b2lkICgqZGVjcnlwdCkgKEFFU0NvbnRleHQgKiBjdHgsIHVuc2lnbmVkIGludCAqIGJsb2NrKTsKLSAgICB1bnNpZ25lZCBpbnQgaXZbTUFYX05CXTsKLSAgICBpbnQgTmIsIE5yOworICB1bnNpZ25lZCBpbnQga2V5c2NoZWRbKE1BWF9OUiArIDEpICogTUFYX05CXTsKKyAgdW5zaWduZWQgaW50IGludmtleXNjaGVkWyhNQVhfTlIgKyAxKSAqIE1BWF9OQl07CisgIHZvaWQgKCplbmNyeXB0KShBRVNDb250ZXh0KiBjdHgsIHVuc2lnbmVkIGludCogYmxvY2spOworICB2b2lkICgqZGVjcnlwdCkoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKTsKKyAgdW5zaWduZWQgaW50IGl2W01BWF9OQl07CisgIGludCBOYiwgTnI7CiB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2JveFsyNTZdID0gewotICAgIDB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsCi0gICAgMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwKLSAgICAweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwLAotICAgIDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsCi0gICAgMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywKLSAgICAweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LAotICAgIDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsCi0gICAgMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwKLSAgICAweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLAotICAgIDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsCi0gICAgMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwKLSAgICAweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmLAotICAgIDB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsCi0gICAgMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwKLSAgICAweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1LAotICAgIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsCi0gICAgMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywKLSAgICAweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLAotICAgIDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsCi0gICAgMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwKLSAgICAweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjLAotICAgIDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksCi0gICAgMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwKLSAgICAweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4LAotICAgIDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsCi0gICAgMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwKLSAgICAweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLAotICAgIDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsCi0gICAgMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwKLSAgICAweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmLAotICAgIDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsCi0gICAgMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNgotfTsKKyAgICAweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LCAweDMwLCAweDAxLCAweDY3LCAweDJiLAorICAgIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsCisgICAgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwgMHhiNywgMHhmZCwgMHg5MywgMHgyNiwKKyAgICAweDM2LCAweDNmLCAweGY3LCAweGNjLCAweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LAorICAgIDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsIDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsCisgICAgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwgMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKKyAgICAweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LCAweDUzLCAweGQxLCAweDAwLCAweGVkLAorICAgIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsIDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsCisgICAgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwgMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwKKyAgICAweDUwLCAweDNjLCAweDlmLCAweGE4LCAweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1LAorICAgIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsIDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsCisgICAgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywgMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKKyAgICAweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LCAweDQ2LCAweGVlLCAweGI4LCAweDE0LAorICAgIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsCisgICAgMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwgMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwKKyAgICAweDhkLCAweGQ1LCAweDRlLCAweGE5LCAweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4LAorICAgIDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsIDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsCisgICAgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwgMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKKyAgICAweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLCAweGUxLCAweGY4LCAweDk4LCAweDExLAorICAgIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsIDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsCisgICAgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwgMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwKKyAgICAweGIwLCAweDU0LCAweGJiLCAweDE2fTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNib3hpbnZbMjU2XSA9IHsKLSAgICAweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4LAotICAgIDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIsCi0gICAgMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4NywKLSAgICAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiLAotICAgIDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QsCi0gICAgMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSwKLSAgICAweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyLAotICAgIDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUsCi0gICAgMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNiwKLSAgICAweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyLAotICAgIDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEsCi0gICAgMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NCwKLSAgICAweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhLAotICAgIDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYsCi0gICAgMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMiwKLSAgICAweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiLAotICAgIDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEsCi0gICAgMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3MywKLSAgICAweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1LAotICAgIDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUsCi0gICAgMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OSwKLSAgICAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiLAotICAgIDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjAsCi0gICAgMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCwKLSAgICAweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxLAotICAgIDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYsCi0gICAgMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZCwKLSAgICAweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmLAotICAgIDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAsCi0gICAgMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSwKLSAgICAweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2LAotICAgIDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QKLX07CisgICAgMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOCwgMHhiZiwgMHg0MCwgMHhhMywgMHg5ZSwKKyAgICAweDgxLCAweGYzLCAweGQ3LCAweGZiLCAweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3LAorICAgIDB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IsIDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsCisgICAgMHhhNiwgMHhjMiwgMHgyMywgMHgzZCwgMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSwKKyAgICAweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyLCAweDc2LCAweDViLCAweGEyLCAweDQ5LAorICAgIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUsIDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYsCisgICAgMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5MiwgMHg2YywgMHg3MCwgMHg0OCwgMHg1MCwKKyAgICAweGZkLCAweGVkLCAweGI5LCAweGRhLCAweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0LAorICAgIDB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEsIDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsCisgICAgMHhiOCwgMHhiMywgMHg0NSwgMHgwNiwgMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMiwKKyAgICAweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiLCAweDNhLCAweDkxLCAweDExLCAweDQxLAorICAgIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEsIDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMsCisgICAgMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NSwgMHhlMiwgMHhmOSwgMHgzNywgMHhlOCwKKyAgICAweDFjLCAweDc1LCAweGRmLCAweDZlLCAweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5LAorICAgIDB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIsIDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsCisgICAgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMCwgMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCwKKyAgICAweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxLCAweGIxLCAweDEyLCAweDEwLCAweDU5LAorICAgIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYsIDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQsCisgICAgMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZiwgMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCwKKyAgICAweGFlLCAweDJhLCAweGY1LCAweGIwLCAweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxLAorICAgIDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYsIDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsCisgICAgMHg1NSwgMHgyMSwgMHgwYywgMHg3ZH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEUwWzI1Nl0gPSB7Ci0gICAgMHhjNjYzNjNhNSwgMHhmODdjN2M4NCwgMHhlZTc3Nzc5OSwgMHhmNjdiN2I4ZCwKLSAgICAweGZmZjJmMjBkLCAweGQ2NmI2YmJkLCAweGRlNmY2ZmIxLCAweDkxYzVjNTU0LAotICAgIDB4NjAzMDMwNTAsIDB4MDIwMTAxMDMsIDB4Y2U2NzY3YTksIDB4NTYyYjJiN2QsCi0gICAgMHhlN2ZlZmUxOSwgMHhiNWQ3ZDc2MiwgMHg0ZGFiYWJlNiwgMHhlYzc2NzY5YSwKLSAgICAweDhmY2FjYTQ1LCAweDFmODI4MjlkLCAweDg5YzljOTQwLCAweGZhN2Q3ZDg3LAotICAgIDB4ZWZmYWZhMTUsIDB4YjI1OTU5ZWIsIDB4OGU0NzQ3YzksIDB4ZmJmMGYwMGIsCi0gICAgMHg0MWFkYWRlYywgMHhiM2Q0ZDQ2NywgMHg1ZmEyYTJmZCwgMHg0NWFmYWZlYSwKLSAgICAweDIzOWM5Y2JmLCAweDUzYTRhNGY3LCAweGU0NzI3Mjk2LCAweDliYzBjMDViLAotICAgIDB4NzViN2I3YzIsIDB4ZTFmZGZkMWMsIDB4M2Q5MzkzYWUsIDB4NGMyNjI2NmEsCi0gICAgMHg2YzM2MzY1YSwgMHg3ZTNmM2Y0MSwgMHhmNWY3ZjcwMiwgMHg4M2NjY2M0ZiwKLSAgICAweDY4MzQzNDVjLCAweDUxYTVhNWY0LCAweGQxZTVlNTM0LCAweGY5ZjFmMTA4LAotICAgIDB4ZTI3MTcxOTMsIDB4YWJkOGQ4NzMsIDB4NjIzMTMxNTMsIDB4MmExNTE1M2YsCi0gICAgMHgwODA0MDQwYywgMHg5NWM3Yzc1MiwgMHg0NjIzMjM2NSwgMHg5ZGMzYzM1ZSwKLSAgICAweDMwMTgxODI4LCAweDM3OTY5NmExLCAweDBhMDUwNTBmLCAweDJmOWE5YWI1LAotICAgIDB4MGUwNzA3MDksIDB4MjQxMjEyMzYsIDB4MWI4MDgwOWIsIDB4ZGZlMmUyM2QsCi0gICAgMHhjZGViZWIyNiwgMHg0ZTI3Mjc2OSwgMHg3ZmIyYjJjZCwgMHhlYTc1NzU5ZiwKLSAgICAweDEyMDkwOTFiLCAweDFkODM4MzllLCAweDU4MmMyYzc0LCAweDM0MWExYTJlLAotICAgIDB4MzYxYjFiMmQsIDB4ZGM2ZTZlYjIsIDB4YjQ1YTVhZWUsIDB4NWJhMGEwZmIsCi0gICAgMHhhNDUyNTJmNiwgMHg3NjNiM2I0ZCwgMHhiN2Q2ZDY2MSwgMHg3ZGIzYjNjZSwKLSAgICAweDUyMjkyOTdiLCAweGRkZTNlMzNlLCAweDVlMmYyZjcxLCAweDEzODQ4NDk3LAotICAgIDB4YTY1MzUzZjUsIDB4YjlkMWQxNjgsIDB4MDAwMDAwMDAsIDB4YzFlZGVkMmMsCi0gICAgMHg0MDIwMjA2MCwgMHhlM2ZjZmMxZiwgMHg3OWIxYjFjOCwgMHhiNjViNWJlZCwKLSAgICAweGQ0NmE2YWJlLCAweDhkY2JjYjQ2LCAweDY3YmViZWQ5LCAweDcyMzkzOTRiLAotICAgIDB4OTQ0YTRhZGUsIDB4OTg0YzRjZDQsIDB4YjA1ODU4ZTgsIDB4ODVjZmNmNGEsCi0gICAgMHhiYmQwZDA2YiwgMHhjNWVmZWYyYSwgMHg0ZmFhYWFlNSwgMHhlZGZiZmIxNiwKLSAgICAweDg2NDM0M2M1LCAweDlhNGQ0ZGQ3LCAweDY2MzMzMzU1LCAweDExODU4NTk0LAotICAgIDB4OGE0NTQ1Y2YsIDB4ZTlmOWY5MTAsIDB4MDQwMjAyMDYsIDB4ZmU3ZjdmODEsCi0gICAgMHhhMDUwNTBmMCwgMHg3ODNjM2M0NCwgMHgyNTlmOWZiYSwgMHg0YmE4YThlMywKLSAgICAweGEyNTE1MWYzLCAweDVkYTNhM2ZlLCAweDgwNDA0MGMwLCAweDA1OGY4ZjhhLAotICAgIDB4M2Y5MjkyYWQsIDB4MjE5ZDlkYmMsIDB4NzAzODM4NDgsIDB4ZjFmNWY1MDQsCi0gICAgMHg2M2JjYmNkZiwgMHg3N2I2YjZjMSwgMHhhZmRhZGE3NSwgMHg0MjIxMjE2MywKLSAgICAweDIwMTAxMDMwLCAweGU1ZmZmZjFhLCAweGZkZjNmMzBlLCAweGJmZDJkMjZkLAotICAgIDB4ODFjZGNkNGMsIDB4MTgwYzBjMTQsIDB4MjYxMzEzMzUsIDB4YzNlY2VjMmYsCi0gICAgMHhiZTVmNWZlMSwgMHgzNTk3OTdhMiwgMHg4ODQ0NDRjYywgMHgyZTE3MTczOSwKLSAgICAweDkzYzRjNDU3LCAweDU1YTdhN2YyLCAweGZjN2U3ZTgyLCAweDdhM2QzZDQ3LAotICAgIDB4Yzg2NDY0YWMsIDB4YmE1ZDVkZTcsIDB4MzIxOTE5MmIsIDB4ZTY3MzczOTUsCi0gICAgMHhjMDYwNjBhMCwgMHgxOTgxODE5OCwgMHg5ZTRmNGZkMSwgMHhhM2RjZGM3ZiwKLSAgICAweDQ0MjIyMjY2LCAweDU0MmEyYTdlLCAweDNiOTA5MGFiLCAweDBiODg4ODgzLAotICAgIDB4OGM0NjQ2Y2EsIDB4YzdlZWVlMjksIDB4NmJiOGI4ZDMsIDB4MjgxNDE0M2MsCi0gICAgMHhhN2RlZGU3OSwgMHhiYzVlNWVlMiwgMHgxNjBiMGIxZCwgMHhhZGRiZGI3NiwKLSAgICAweGRiZTBlMDNiLCAweDY0MzIzMjU2LCAweDc0M2EzYTRlLCAweDE0MGEwYTFlLAotICAgIDB4OTI0OTQ5ZGIsIDB4MGMwNjA2MGEsIDB4NDgyNDI0NmMsIDB4Yjg1YzVjZTQsCi0gICAgMHg5ZmMyYzI1ZCwgMHhiZGQzZDM2ZSwgMHg0M2FjYWNlZiwgMHhjNDYyNjJhNiwKLSAgICAweDM5OTE5MWE4LCAweDMxOTU5NWE0LCAweGQzZTRlNDM3LCAweGYyNzk3OThiLAotICAgIDB4ZDVlN2U3MzIsIDB4OGJjOGM4NDMsIDB4NmUzNzM3NTksIDB4ZGE2ZDZkYjcsCi0gICAgMHgwMThkOGQ4YywgMHhiMWQ1ZDU2NCwgMHg5YzRlNGVkMiwgMHg0OWE5YTllMCwKLSAgICAweGQ4NmM2Y2I0LCAweGFjNTY1NmZhLCAweGYzZjRmNDA3LCAweGNmZWFlYTI1LAotICAgIDB4Y2E2NTY1YWYsIDB4ZjQ3YTdhOGUsIDB4NDdhZWFlZTksIDB4MTAwODA4MTgsCi0gICAgMHg2ZmJhYmFkNSwgMHhmMDc4Nzg4OCwgMHg0YTI1MjU2ZiwgMHg1YzJlMmU3MiwKLSAgICAweDM4MWMxYzI0LCAweDU3YTZhNmYxLCAweDczYjRiNGM3LCAweDk3YzZjNjUxLAotICAgIDB4Y2JlOGU4MjMsIDB4YTFkZGRkN2MsIDB4ZTg3NDc0OWMsIDB4M2UxZjFmMjEsCi0gICAgMHg5NjRiNGJkZCwgMHg2MWJkYmRkYywgMHgwZDhiOGI4NiwgMHgwZjhhOGE4NSwKLSAgICAweGUwNzA3MDkwLCAweDdjM2UzZTQyLCAweDcxYjViNWM0LCAweGNjNjY2NmFhLAotICAgIDB4OTA0ODQ4ZDgsIDB4MDYwMzAzMDUsIDB4ZjdmNmY2MDEsIDB4MWMwZTBlMTIsCi0gICAgMHhjMjYxNjFhMywgMHg2YTM1MzU1ZiwgMHhhZTU3NTdmOSwgMHg2OWI5YjlkMCwKLSAgICAweDE3ODY4NjkxLCAweDk5YzFjMTU4LCAweDNhMWQxZDI3LCAweDI3OWU5ZWI5LAotICAgIDB4ZDllMWUxMzgsIDB4ZWJmOGY4MTMsIDB4MmI5ODk4YjMsIDB4MjIxMTExMzMsCi0gICAgMHhkMjY5NjliYiwgMHhhOWQ5ZDk3MCwgMHgwNzhlOGU4OSwgMHgzMzk0OTRhNywKLSAgICAweDJkOWI5YmI2LCAweDNjMWUxZTIyLCAweDE1ODc4NzkyLCAweGM5ZTllOTIwLAotICAgIDB4ODdjZWNlNDksIDB4YWE1NTU1ZmYsIDB4NTAyODI4NzgsIDB4YTVkZmRmN2EsCi0gICAgMHgwMzhjOGM4ZiwgMHg1OWExYTFmOCwgMHgwOTg5ODk4MCwgMHgxYTBkMGQxNywKLSAgICAweDY1YmZiZmRhLCAweGQ3ZTZlNjMxLCAweDg0NDI0MmM2LCAweGQwNjg2OGI4LAotICAgIDB4ODI0MTQxYzMsIDB4Mjk5OTk5YjAsIDB4NWEyZDJkNzcsIDB4MWUwZjBmMTEsCisgICAgMHhjNjYzNjNhNSwgMHhmODdjN2M4NCwgMHhlZTc3Nzc5OSwgMHhmNjdiN2I4ZCwgMHhmZmYyZjIwZCwgMHhkNjZiNmJiZCwKKyAgICAweGRlNmY2ZmIxLCAweDkxYzVjNTU0LCAweDYwMzAzMDUwLCAweDAyMDEwMTAzLCAweGNlNjc2N2E5LCAweDU2MmIyYjdkLAorICAgIDB4ZTdmZWZlMTksIDB4YjVkN2Q3NjIsIDB4NGRhYmFiZTYsIDB4ZWM3Njc2OWEsIDB4OGZjYWNhNDUsIDB4MWY4MjgyOWQsCisgICAgMHg4OWM5Yzk0MCwgMHhmYTdkN2Q4NywgMHhlZmZhZmExNSwgMHhiMjU5NTllYiwgMHg4ZTQ3NDdjOSwgMHhmYmYwZjAwYiwKKyAgICAweDQxYWRhZGVjLCAweGIzZDRkNDY3LCAweDVmYTJhMmZkLCAweDQ1YWZhZmVhLCAweDIzOWM5Y2JmLCAweDUzYTRhNGY3LAorICAgIDB4ZTQ3MjcyOTYsIDB4OWJjMGMwNWIsIDB4NzViN2I3YzIsIDB4ZTFmZGZkMWMsIDB4M2Q5MzkzYWUsIDB4NGMyNjI2NmEsCisgICAgMHg2YzM2MzY1YSwgMHg3ZTNmM2Y0MSwgMHhmNWY3ZjcwMiwgMHg4M2NjY2M0ZiwgMHg2ODM0MzQ1YywgMHg1MWE1YTVmNCwKKyAgICAweGQxZTVlNTM0LCAweGY5ZjFmMTA4LCAweGUyNzE3MTkzLCAweGFiZDhkODczLCAweDYyMzEzMTUzLCAweDJhMTUxNTNmLAorICAgIDB4MDgwNDA0MGMsIDB4OTVjN2M3NTIsIDB4NDYyMzIzNjUsIDB4OWRjM2MzNWUsIDB4MzAxODE4MjgsIDB4Mzc5Njk2YTEsCisgICAgMHgwYTA1MDUwZiwgMHgyZjlhOWFiNSwgMHgwZTA3MDcwOSwgMHgyNDEyMTIzNiwgMHgxYjgwODA5YiwgMHhkZmUyZTIzZCwKKyAgICAweGNkZWJlYjI2LCAweDRlMjcyNzY5LCAweDdmYjJiMmNkLCAweGVhNzU3NTlmLCAweDEyMDkwOTFiLCAweDFkODM4MzllLAorICAgIDB4NTgyYzJjNzQsIDB4MzQxYTFhMmUsIDB4MzYxYjFiMmQsIDB4ZGM2ZTZlYjIsIDB4YjQ1YTVhZWUsIDB4NWJhMGEwZmIsCisgICAgMHhhNDUyNTJmNiwgMHg3NjNiM2I0ZCwgMHhiN2Q2ZDY2MSwgMHg3ZGIzYjNjZSwgMHg1MjI5Mjk3YiwgMHhkZGUzZTMzZSwKKyAgICAweDVlMmYyZjcxLCAweDEzODQ4NDk3LCAweGE2NTM1M2Y1LCAweGI5ZDFkMTY4LCAweDAwMDAwMDAwLCAweGMxZWRlZDJjLAorICAgIDB4NDAyMDIwNjAsIDB4ZTNmY2ZjMWYsIDB4NzliMWIxYzgsIDB4YjY1YjViZWQsIDB4ZDQ2YTZhYmUsIDB4OGRjYmNiNDYsCisgICAgMHg2N2JlYmVkOSwgMHg3MjM5Mzk0YiwgMHg5NDRhNGFkZSwgMHg5ODRjNGNkNCwgMHhiMDU4NThlOCwgMHg4NWNmY2Y0YSwKKyAgICAweGJiZDBkMDZiLCAweGM1ZWZlZjJhLCAweDRmYWFhYWU1LCAweGVkZmJmYjE2LCAweDg2NDM0M2M1LCAweDlhNGQ0ZGQ3LAorICAgIDB4NjYzMzMzNTUsIDB4MTE4NTg1OTQsIDB4OGE0NTQ1Y2YsIDB4ZTlmOWY5MTAsIDB4MDQwMjAyMDYsIDB4ZmU3ZjdmODEsCisgICAgMHhhMDUwNTBmMCwgMHg3ODNjM2M0NCwgMHgyNTlmOWZiYSwgMHg0YmE4YThlMywgMHhhMjUxNTFmMywgMHg1ZGEzYTNmZSwKKyAgICAweDgwNDA0MGMwLCAweDA1OGY4ZjhhLCAweDNmOTI5MmFkLCAweDIxOWQ5ZGJjLCAweDcwMzgzODQ4LCAweGYxZjVmNTA0LAorICAgIDB4NjNiY2JjZGYsIDB4NzdiNmI2YzEsIDB4YWZkYWRhNzUsIDB4NDIyMTIxNjMsIDB4MjAxMDEwMzAsIDB4ZTVmZmZmMWEsCisgICAgMHhmZGYzZjMwZSwgMHhiZmQyZDI2ZCwgMHg4MWNkY2Q0YywgMHgxODBjMGMxNCwgMHgyNjEzMTMzNSwgMHhjM2VjZWMyZiwKKyAgICAweGJlNWY1ZmUxLCAweDM1OTc5N2EyLCAweDg4NDQ0NGNjLCAweDJlMTcxNzM5LCAweDkzYzRjNDU3LCAweDU1YTdhN2YyLAorICAgIDB4ZmM3ZTdlODIsIDB4N2EzZDNkNDcsIDB4Yzg2NDY0YWMsIDB4YmE1ZDVkZTcsIDB4MzIxOTE5MmIsIDB4ZTY3MzczOTUsCisgICAgMHhjMDYwNjBhMCwgMHgxOTgxODE5OCwgMHg5ZTRmNGZkMSwgMHhhM2RjZGM3ZiwgMHg0NDIyMjI2NiwgMHg1NDJhMmE3ZSwKKyAgICAweDNiOTA5MGFiLCAweDBiODg4ODgzLCAweDhjNDY0NmNhLCAweGM3ZWVlZTI5LCAweDZiYjhiOGQzLCAweDI4MTQxNDNjLAorICAgIDB4YTdkZWRlNzksIDB4YmM1ZTVlZTIsIDB4MTYwYjBiMWQsIDB4YWRkYmRiNzYsIDB4ZGJlMGUwM2IsIDB4NjQzMjMyNTYsCisgICAgMHg3NDNhM2E0ZSwgMHgxNDBhMGExZSwgMHg5MjQ5NDlkYiwgMHgwYzA2MDYwYSwgMHg0ODI0MjQ2YywgMHhiODVjNWNlNCwKKyAgICAweDlmYzJjMjVkLCAweGJkZDNkMzZlLCAweDQzYWNhY2VmLCAweGM0NjI2MmE2LCAweDM5OTE5MWE4LCAweDMxOTU5NWE0LAorICAgIDB4ZDNlNGU0MzcsIDB4ZjI3OTc5OGIsIDB4ZDVlN2U3MzIsIDB4OGJjOGM4NDMsIDB4NmUzNzM3NTksIDB4ZGE2ZDZkYjcsCisgICAgMHgwMThkOGQ4YywgMHhiMWQ1ZDU2NCwgMHg5YzRlNGVkMiwgMHg0OWE5YTllMCwgMHhkODZjNmNiNCwgMHhhYzU2NTZmYSwKKyAgICAweGYzZjRmNDA3LCAweGNmZWFlYTI1LCAweGNhNjU2NWFmLCAweGY0N2E3YThlLCAweDQ3YWVhZWU5LCAweDEwMDgwODE4LAorICAgIDB4NmZiYWJhZDUsIDB4ZjA3ODc4ODgsIDB4NGEyNTI1NmYsIDB4NWMyZTJlNzIsIDB4MzgxYzFjMjQsIDB4NTdhNmE2ZjEsCisgICAgMHg3M2I0YjRjNywgMHg5N2M2YzY1MSwgMHhjYmU4ZTgyMywgMHhhMWRkZGQ3YywgMHhlODc0NzQ5YywgMHgzZTFmMWYyMSwKKyAgICAweDk2NGI0YmRkLCAweDYxYmRiZGRjLCAweDBkOGI4Yjg2LCAweDBmOGE4YTg1LCAweGUwNzA3MDkwLCAweDdjM2UzZTQyLAorICAgIDB4NzFiNWI1YzQsIDB4Y2M2NjY2YWEsIDB4OTA0ODQ4ZDgsIDB4MDYwMzAzMDUsIDB4ZjdmNmY2MDEsIDB4MWMwZTBlMTIsCisgICAgMHhjMjYxNjFhMywgMHg2YTM1MzU1ZiwgMHhhZTU3NTdmOSwgMHg2OWI5YjlkMCwgMHgxNzg2ODY5MSwgMHg5OWMxYzE1OCwKKyAgICAweDNhMWQxZDI3LCAweDI3OWU5ZWI5LCAweGQ5ZTFlMTM4LCAweGViZjhmODEzLCAweDJiOTg5OGIzLCAweDIyMTExMTMzLAorICAgIDB4ZDI2OTY5YmIsIDB4YTlkOWQ5NzAsIDB4MDc4ZThlODksIDB4MzM5NDk0YTcsIDB4MmQ5YjliYjYsIDB4M2MxZTFlMjIsCisgICAgMHgxNTg3ODc5MiwgMHhjOWU5ZTkyMCwgMHg4N2NlY2U0OSwgMHhhYTU1NTVmZiwgMHg1MDI4Mjg3OCwgMHhhNWRmZGY3YSwKKyAgICAweDAzOGM4YzhmLCAweDU5YTFhMWY4LCAweDA5ODk4OTgwLCAweDFhMGQwZDE3LCAweDY1YmZiZmRhLCAweGQ3ZTZlNjMxLAorICAgIDB4ODQ0MjQyYzYsIDB4ZDA2ODY4YjgsIDB4ODI0MTQxYzMsIDB4Mjk5OTk5YjAsIDB4NWEyZDJkNzcsIDB4MWUwZjBmMTEsCiAgICAgMHg3YmIwYjBjYiwgMHhhODU0NTRmYywgMHg2ZGJiYmJkNiwgMHgyYzE2MTYzYSwKIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEUxWzI1Nl0gPSB7Ci0gICAgMHhhNWM2NjM2MywgMHg4NGY4N2M3YywgMHg5OWVlNzc3NywgMHg4ZGY2N2I3YiwKLSAgICAweDBkZmZmMmYyLCAweGJkZDY2YjZiLCAweGIxZGU2ZjZmLCAweDU0OTFjNWM1LAotICAgIDB4NTA2MDMwMzAsIDB4MDMwMjAxMDEsIDB4YTljZTY3NjcsIDB4N2Q1NjJiMmIsCi0gICAgMHgxOWU3ZmVmZSwgMHg2MmI1ZDdkNywgMHhlNjRkYWJhYiwgMHg5YWVjNzY3NiwKLSAgICAweDQ1OGZjYWNhLCAweDlkMWY4MjgyLCAweDQwODljOWM5LCAweDg3ZmE3ZDdkLAotICAgIDB4MTVlZmZhZmEsIDB4ZWJiMjU5NTksIDB4Yzk4ZTQ3NDcsIDB4MGJmYmYwZjAsCi0gICAgMHhlYzQxYWRhZCwgMHg2N2IzZDRkNCwgMHhmZDVmYTJhMiwgMHhlYTQ1YWZhZiwKLSAgICAweGJmMjM5YzljLCAweGY3NTNhNGE0LCAweDk2ZTQ3MjcyLCAweDViOWJjMGMwLAotICAgIDB4YzI3NWI3YjcsIDB4MWNlMWZkZmQsIDB4YWUzZDkzOTMsIDB4NmE0YzI2MjYsCi0gICAgMHg1YTZjMzYzNiwgMHg0MTdlM2YzZiwgMHgwMmY1ZjdmNywgMHg0ZjgzY2NjYywKLSAgICAweDVjNjgzNDM0LCAweGY0NTFhNWE1LCAweDM0ZDFlNWU1LCAweDA4ZjlmMWYxLAotICAgIDB4OTNlMjcxNzEsIDB4NzNhYmQ4ZDgsIDB4NTM2MjMxMzEsIDB4M2YyYTE1MTUsCi0gICAgMHgwYzA4MDQwNCwgMHg1Mjk1YzdjNywgMHg2NTQ2MjMyMywgMHg1ZTlkYzNjMywKLSAgICAweDI4MzAxODE4LCAweGExMzc5Njk2LCAweDBmMGEwNTA1LCAweGI1MmY5YTlhLAotICAgIDB4MDkwZTA3MDcsIDB4MzYyNDEyMTIsIDB4OWIxYjgwODAsIDB4M2RkZmUyZTIsCi0gICAgMHgyNmNkZWJlYiwgMHg2OTRlMjcyNywgMHhjZDdmYjJiMiwgMHg5ZmVhNzU3NSwKLSAgICAweDFiMTIwOTA5LCAweDllMWQ4MzgzLCAweDc0NTgyYzJjLCAweDJlMzQxYTFhLAotICAgIDB4MmQzNjFiMWIsIDB4YjJkYzZlNmUsIDB4ZWViNDVhNWEsIDB4ZmI1YmEwYTAsCi0gICAgMHhmNmE0NTI1MiwgMHg0ZDc2M2IzYiwgMHg2MWI3ZDZkNiwgMHhjZTdkYjNiMywKLSAgICAweDdiNTIyOTI5LCAweDNlZGRlM2UzLCAweDcxNWUyZjJmLCAweDk3MTM4NDg0LAotICAgIDB4ZjVhNjUzNTMsIDB4NjhiOWQxZDEsIDB4MDAwMDAwMDAsIDB4MmNjMWVkZWQsCi0gICAgMHg2MDQwMjAyMCwgMHgxZmUzZmNmYywgMHhjODc5YjFiMSwgMHhlZGI2NWI1YiwKLSAgICAweGJlZDQ2YTZhLCAweDQ2OGRjYmNiLCAweGQ5NjdiZWJlLCAweDRiNzIzOTM5LAotICAgIDB4ZGU5NDRhNGEsIDB4ZDQ5ODRjNGMsIDB4ZThiMDU4NTgsIDB4NGE4NWNmY2YsCi0gICAgMHg2YmJiZDBkMCwgMHgyYWM1ZWZlZiwgMHhlNTRmYWFhYSwgMHgxNmVkZmJmYiwKLSAgICAweGM1ODY0MzQzLCAweGQ3OWE0ZDRkLCAweDU1NjYzMzMzLCAweDk0MTE4NTg1LAotICAgIDB4Y2Y4YTQ1NDUsIDB4MTBlOWY5ZjksIDB4MDYwNDAyMDIsIDB4ODFmZTdmN2YsCi0gICAgMHhmMGEwNTA1MCwgMHg0NDc4M2MzYywgMHhiYTI1OWY5ZiwgMHhlMzRiYThhOCwKLSAgICAweGYzYTI1MTUxLCAweGZlNWRhM2EzLCAweGMwODA0MDQwLCAweDhhMDU4ZjhmLAotICAgIDB4YWQzZjkyOTIsIDB4YmMyMTlkOWQsIDB4NDg3MDM4MzgsIDB4MDRmMWY1ZjUsCi0gICAgMHhkZjYzYmNiYywgMHhjMTc3YjZiNiwgMHg3NWFmZGFkYSwgMHg2MzQyMjEyMSwKLSAgICAweDMwMjAxMDEwLCAweDFhZTVmZmZmLCAweDBlZmRmM2YzLCAweDZkYmZkMmQyLAotICAgIDB4NGM4MWNkY2QsIDB4MTQxODBjMGMsIDB4MzUyNjEzMTMsIDB4MmZjM2VjZWMsCi0gICAgMHhlMWJlNWY1ZiwgMHhhMjM1OTc5NywgMHhjYzg4NDQ0NCwgMHgzOTJlMTcxNywKLSAgICAweDU3OTNjNGM0LCAweGYyNTVhN2E3LCAweDgyZmM3ZTdlLCAweDQ3N2EzZDNkLAotICAgIDB4YWNjODY0NjQsIDB4ZTdiYTVkNWQsIDB4MmIzMjE5MTksIDB4OTVlNjczNzMsCi0gICAgMHhhMGMwNjA2MCwgMHg5ODE5ODE4MSwgMHhkMTllNGY0ZiwgMHg3ZmEzZGNkYywKLSAgICAweDY2NDQyMjIyLCAweDdlNTQyYTJhLCAweGFiM2I5MDkwLCAweDgzMGI4ODg4LAotICAgIDB4Y2E4YzQ2NDYsIDB4MjljN2VlZWUsIDB4ZDM2YmI4YjgsIDB4M2MyODE0MTQsCi0gICAgMHg3OWE3ZGVkZSwgMHhlMmJjNWU1ZSwgMHgxZDE2MGIwYiwgMHg3NmFkZGJkYiwKLSAgICAweDNiZGJlMGUwLCAweDU2NjQzMjMyLCAweDRlNzQzYTNhLCAweDFlMTQwYTBhLAotICAgIDB4ZGI5MjQ5NDksIDB4MGEwYzA2MDYsIDB4NmM0ODI0MjQsIDB4ZTRiODVjNWMsCi0gICAgMHg1ZDlmYzJjMiwgMHg2ZWJkZDNkMywgMHhlZjQzYWNhYywgMHhhNmM0NjI2MiwKLSAgICAweGE4Mzk5MTkxLCAweGE0MzE5NTk1LCAweDM3ZDNlNGU0LCAweDhiZjI3OTc5LAotICAgIDB4MzJkNWU3ZTcsIDB4NDM4YmM4YzgsIDB4NTk2ZTM3MzcsIDB4YjdkYTZkNmQsCi0gICAgMHg4YzAxOGQ4ZCwgMHg2NGIxZDVkNSwgMHhkMjljNGU0ZSwgMHhlMDQ5YTlhOSwKLSAgICAweGI0ZDg2YzZjLCAweGZhYWM1NjU2LCAweDA3ZjNmNGY0LCAweDI1Y2ZlYWVhLAotICAgIDB4YWZjYTY1NjUsIDB4OGVmNDdhN2EsIDB4ZTk0N2FlYWUsIDB4MTgxMDA4MDgsCi0gICAgMHhkNTZmYmFiYSwgMHg4OGYwNzg3OCwgMHg2ZjRhMjUyNSwgMHg3MjVjMmUyZSwKLSAgICAweDI0MzgxYzFjLCAweGYxNTdhNmE2LCAweGM3NzNiNGI0LCAweDUxOTdjNmM2LAotICAgIDB4MjNjYmU4ZTgsIDB4N2NhMWRkZGQsIDB4OWNlODc0NzQsIDB4MjEzZTFmMWYsCi0gICAgMHhkZDk2NGI0YiwgMHhkYzYxYmRiZCwgMHg4NjBkOGI4YiwgMHg4NTBmOGE4YSwKLSAgICAweDkwZTA3MDcwLCAweDQyN2MzZTNlLCAweGM0NzFiNWI1LCAweGFhY2M2NjY2LAotICAgIDB4ZDg5MDQ4NDgsIDB4MDUwNjAzMDMsIDB4MDFmN2Y2ZjYsIDB4MTIxYzBlMGUsCi0gICAgMHhhM2MyNjE2MSwgMHg1ZjZhMzUzNSwgMHhmOWFlNTc1NywgMHhkMDY5YjliOSwKLSAgICAweDkxMTc4Njg2LCAweDU4OTljMWMxLCAweDI3M2ExZDFkLCAweGI5Mjc5ZTllLAotICAgIDB4MzhkOWUxZTEsIDB4MTNlYmY4ZjgsIDB4YjMyYjk4OTgsIDB4MzMyMjExMTEsCi0gICAgMHhiYmQyNjk2OSwgMHg3MGE5ZDlkOSwgMHg4OTA3OGU4ZSwgMHhhNzMzOTQ5NCwKLSAgICAweGI2MmQ5YjliLCAweDIyM2MxZTFlLCAweDkyMTU4Nzg3LCAweDIwYzllOWU5LAotICAgIDB4NDk4N2NlY2UsIDB4ZmZhYTU1NTUsIDB4Nzg1MDI4MjgsIDB4N2FhNWRmZGYsCi0gICAgMHg4ZjAzOGM4YywgMHhmODU5YTFhMSwgMHg4MDA5ODk4OSwgMHgxNzFhMGQwZCwKLSAgICAweGRhNjViZmJmLCAweDMxZDdlNmU2LCAweGM2ODQ0MjQyLCAweGI4ZDA2ODY4LAotICAgIDB4YzM4MjQxNDEsIDB4YjAyOTk5OTksIDB4Nzc1YTJkMmQsIDB4MTExZTBmMGYsCisgICAgMHhhNWM2NjM2MywgMHg4NGY4N2M3YywgMHg5OWVlNzc3NywgMHg4ZGY2N2I3YiwgMHgwZGZmZjJmMiwgMHhiZGQ2NmI2YiwKKyAgICAweGIxZGU2ZjZmLCAweDU0OTFjNWM1LCAweDUwNjAzMDMwLCAweDAzMDIwMTAxLCAweGE5Y2U2NzY3LCAweDdkNTYyYjJiLAorICAgIDB4MTllN2ZlZmUsIDB4NjJiNWQ3ZDcsIDB4ZTY0ZGFiYWIsIDB4OWFlYzc2NzYsIDB4NDU4ZmNhY2EsIDB4OWQxZjgyODIsCisgICAgMHg0MDg5YzljOSwgMHg4N2ZhN2Q3ZCwgMHgxNWVmZmFmYSwgMHhlYmIyNTk1OSwgMHhjOThlNDc0NywgMHgwYmZiZjBmMCwKKyAgICAweGVjNDFhZGFkLCAweDY3YjNkNGQ0LCAweGZkNWZhMmEyLCAweGVhNDVhZmFmLCAweGJmMjM5YzljLCAweGY3NTNhNGE0LAorICAgIDB4OTZlNDcyNzIsIDB4NWI5YmMwYzAsIDB4YzI3NWI3YjcsIDB4MWNlMWZkZmQsIDB4YWUzZDkzOTMsIDB4NmE0YzI2MjYsCisgICAgMHg1YTZjMzYzNiwgMHg0MTdlM2YzZiwgMHgwMmY1ZjdmNywgMHg0ZjgzY2NjYywgMHg1YzY4MzQzNCwgMHhmNDUxYTVhNSwKKyAgICAweDM0ZDFlNWU1LCAweDA4ZjlmMWYxLCAweDkzZTI3MTcxLCAweDczYWJkOGQ4LCAweDUzNjIzMTMxLCAweDNmMmExNTE1LAorICAgIDB4MGMwODA0MDQsIDB4NTI5NWM3YzcsIDB4NjU0NjIzMjMsIDB4NWU5ZGMzYzMsIDB4MjgzMDE4MTgsIDB4YTEzNzk2OTYsCisgICAgMHgwZjBhMDUwNSwgMHhiNTJmOWE5YSwgMHgwOTBlMDcwNywgMHgzNjI0MTIxMiwgMHg5YjFiODA4MCwgMHgzZGRmZTJlMiwKKyAgICAweDI2Y2RlYmViLCAweDY5NGUyNzI3LCAweGNkN2ZiMmIyLCAweDlmZWE3NTc1LCAweDFiMTIwOTA5LCAweDllMWQ4MzgzLAorICAgIDB4NzQ1ODJjMmMsIDB4MmUzNDFhMWEsIDB4MmQzNjFiMWIsIDB4YjJkYzZlNmUsIDB4ZWViNDVhNWEsIDB4ZmI1YmEwYTAsCisgICAgMHhmNmE0NTI1MiwgMHg0ZDc2M2IzYiwgMHg2MWI3ZDZkNiwgMHhjZTdkYjNiMywgMHg3YjUyMjkyOSwgMHgzZWRkZTNlMywKKyAgICAweDcxNWUyZjJmLCAweDk3MTM4NDg0LCAweGY1YTY1MzUzLCAweDY4YjlkMWQxLCAweDAwMDAwMDAwLCAweDJjYzFlZGVkLAorICAgIDB4NjA0MDIwMjAsIDB4MWZlM2ZjZmMsIDB4Yzg3OWIxYjEsIDB4ZWRiNjViNWIsIDB4YmVkNDZhNmEsIDB4NDY4ZGNiY2IsCisgICAgMHhkOTY3YmViZSwgMHg0YjcyMzkzOSwgMHhkZTk0NGE0YSwgMHhkNDk4NGM0YywgMHhlOGIwNTg1OCwgMHg0YTg1Y2ZjZiwKKyAgICAweDZiYmJkMGQwLCAweDJhYzVlZmVmLCAweGU1NGZhYWFhLCAweDE2ZWRmYmZiLCAweGM1ODY0MzQzLCAweGQ3OWE0ZDRkLAorICAgIDB4NTU2NjMzMzMsIDB4OTQxMTg1ODUsIDB4Y2Y4YTQ1NDUsIDB4MTBlOWY5ZjksIDB4MDYwNDAyMDIsIDB4ODFmZTdmN2YsCisgICAgMHhmMGEwNTA1MCwgMHg0NDc4M2MzYywgMHhiYTI1OWY5ZiwgMHhlMzRiYThhOCwgMHhmM2EyNTE1MSwgMHhmZTVkYTNhMywKKyAgICAweGMwODA0MDQwLCAweDhhMDU4ZjhmLCAweGFkM2Y5MjkyLCAweGJjMjE5ZDlkLCAweDQ4NzAzODM4LCAweDA0ZjFmNWY1LAorICAgIDB4ZGY2M2JjYmMsIDB4YzE3N2I2YjYsIDB4NzVhZmRhZGEsIDB4NjM0MjIxMjEsIDB4MzAyMDEwMTAsIDB4MWFlNWZmZmYsCisgICAgMHgwZWZkZjNmMywgMHg2ZGJmZDJkMiwgMHg0YzgxY2RjZCwgMHgxNDE4MGMwYywgMHgzNTI2MTMxMywgMHgyZmMzZWNlYywKKyAgICAweGUxYmU1ZjVmLCAweGEyMzU5Nzk3LCAweGNjODg0NDQ0LCAweDM5MmUxNzE3LCAweDU3OTNjNGM0LCAweGYyNTVhN2E3LAorICAgIDB4ODJmYzdlN2UsIDB4NDc3YTNkM2QsIDB4YWNjODY0NjQsIDB4ZTdiYTVkNWQsIDB4MmIzMjE5MTksIDB4OTVlNjczNzMsCisgICAgMHhhMGMwNjA2MCwgMHg5ODE5ODE4MSwgMHhkMTllNGY0ZiwgMHg3ZmEzZGNkYywgMHg2NjQ0MjIyMiwgMHg3ZTU0MmEyYSwKKyAgICAweGFiM2I5MDkwLCAweDgzMGI4ODg4LCAweGNhOGM0NjQ2LCAweDI5YzdlZWVlLCAweGQzNmJiOGI4LCAweDNjMjgxNDE0LAorICAgIDB4NzlhN2RlZGUsIDB4ZTJiYzVlNWUsIDB4MWQxNjBiMGIsIDB4NzZhZGRiZGIsIDB4M2JkYmUwZTAsIDB4NTY2NDMyMzIsCisgICAgMHg0ZTc0M2EzYSwgMHgxZTE0MGEwYSwgMHhkYjkyNDk0OSwgMHgwYTBjMDYwNiwgMHg2YzQ4MjQyNCwgMHhlNGI4NWM1YywKKyAgICAweDVkOWZjMmMyLCAweDZlYmRkM2QzLCAweGVmNDNhY2FjLCAweGE2YzQ2MjYyLCAweGE4Mzk5MTkxLCAweGE0MzE5NTk1LAorICAgIDB4MzdkM2U0ZTQsIDB4OGJmMjc5NzksIDB4MzJkNWU3ZTcsIDB4NDM4YmM4YzgsIDB4NTk2ZTM3MzcsIDB4YjdkYTZkNmQsCisgICAgMHg4YzAxOGQ4ZCwgMHg2NGIxZDVkNSwgMHhkMjljNGU0ZSwgMHhlMDQ5YTlhOSwgMHhiNGQ4NmM2YywgMHhmYWFjNTY1NiwKKyAgICAweDA3ZjNmNGY0LCAweDI1Y2ZlYWVhLCAweGFmY2E2NTY1LCAweDhlZjQ3YTdhLCAweGU5NDdhZWFlLCAweDE4MTAwODA4LAorICAgIDB4ZDU2ZmJhYmEsIDB4ODhmMDc4NzgsIDB4NmY0YTI1MjUsIDB4NzI1YzJlMmUsIDB4MjQzODFjMWMsIDB4ZjE1N2E2YTYsCisgICAgMHhjNzczYjRiNCwgMHg1MTk3YzZjNiwgMHgyM2NiZThlOCwgMHg3Y2ExZGRkZCwgMHg5Y2U4NzQ3NCwgMHgyMTNlMWYxZiwKKyAgICAweGRkOTY0YjRiLCAweGRjNjFiZGJkLCAweDg2MGQ4YjhiLCAweDg1MGY4YThhLCAweDkwZTA3MDcwLCAweDQyN2MzZTNlLAorICAgIDB4YzQ3MWI1YjUsIDB4YWFjYzY2NjYsIDB4ZDg5MDQ4NDgsIDB4MDUwNjAzMDMsIDB4MDFmN2Y2ZjYsIDB4MTIxYzBlMGUsCisgICAgMHhhM2MyNjE2MSwgMHg1ZjZhMzUzNSwgMHhmOWFlNTc1NywgMHhkMDY5YjliOSwgMHg5MTE3ODY4NiwgMHg1ODk5YzFjMSwKKyAgICAweDI3M2ExZDFkLCAweGI5Mjc5ZTllLCAweDM4ZDllMWUxLCAweDEzZWJmOGY4LCAweGIzMmI5ODk4LCAweDMzMjIxMTExLAorICAgIDB4YmJkMjY5NjksIDB4NzBhOWQ5ZDksIDB4ODkwNzhlOGUsIDB4YTczMzk0OTQsIDB4YjYyZDliOWIsIDB4MjIzYzFlMWUsCisgICAgMHg5MjE1ODc4NywgMHgyMGM5ZTllOSwgMHg0OTg3Y2VjZSwgMHhmZmFhNTU1NSwgMHg3ODUwMjgyOCwgMHg3YWE1ZGZkZiwKKyAgICAweDhmMDM4YzhjLCAweGY4NTlhMWExLCAweDgwMDk4OTg5LCAweDE3MWEwZDBkLCAweGRhNjViZmJmLCAweDMxZDdlNmU2LAorICAgIDB4YzY4NDQyNDIsIDB4YjhkMDY4NjgsIDB4YzM4MjQxNDEsIDB4YjAyOTk5OTksIDB4Nzc1YTJkMmQsIDB4MTExZTBmMGYsCiAgICAgMHhjYjdiYjBiMCwgMHhmY2E4NTQ1NCwgMHhkNjZkYmJiYiwgMHgzYTJjMTYxNiwKIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEUyWzI1Nl0gPSB7Ci0gICAgMHg2M2E1YzY2MywgMHg3Yzg0Zjg3YywgMHg3Nzk5ZWU3NywgMHg3YjhkZjY3YiwKLSAgICAweGYyMGRmZmYyLCAweDZiYmRkNjZiLCAweDZmYjFkZTZmLCAweGM1NTQ5MWM1LAotICAgIDB4MzA1MDYwMzAsIDB4MDEwMzAyMDEsIDB4NjdhOWNlNjcsIDB4MmI3ZDU2MmIsCi0gICAgMHhmZTE5ZTdmZSwgMHhkNzYyYjVkNywgMHhhYmU2NGRhYiwgMHg3NjlhZWM3NiwKLSAgICAweGNhNDU4ZmNhLCAweDgyOWQxZjgyLCAweGM5NDA4OWM5LCAweDdkODdmYTdkLAotICAgIDB4ZmExNWVmZmEsIDB4NTllYmIyNTksIDB4NDdjOThlNDcsIDB4ZjAwYmZiZjAsCi0gICAgMHhhZGVjNDFhZCwgMHhkNDY3YjNkNCwgMHhhMmZkNWZhMiwgMHhhZmVhNDVhZiwKLSAgICAweDljYmYyMzljLCAweGE0Zjc1M2E0LCAweDcyOTZlNDcyLCAweGMwNWI5YmMwLAotICAgIDB4YjdjMjc1YjcsIDB4ZmQxY2UxZmQsIDB4OTNhZTNkOTMsIDB4MjY2YTRjMjYsCi0gICAgMHgzNjVhNmMzNiwgMHgzZjQxN2UzZiwgMHhmNzAyZjVmNywgMHhjYzRmODNjYywKLSAgICAweDM0NWM2ODM0LCAweGE1ZjQ1MWE1LCAweGU1MzRkMWU1LCAweGYxMDhmOWYxLAotICAgIDB4NzE5M2UyNzEsIDB4ZDg3M2FiZDgsIDB4MzE1MzYyMzEsIDB4MTUzZjJhMTUsCi0gICAgMHgwNDBjMDgwNCwgMHhjNzUyOTVjNywgMHgyMzY1NDYyMywgMHhjMzVlOWRjMywKLSAgICAweDE4MjgzMDE4LCAweDk2YTEzNzk2LCAweDA1MGYwYTA1LCAweDlhYjUyZjlhLAotICAgIDB4MDcwOTBlMDcsIDB4MTIzNjI0MTIsIDB4ODA5YjFiODAsIDB4ZTIzZGRmZTIsCi0gICAgMHhlYjI2Y2RlYiwgMHgyNzY5NGUyNywgMHhiMmNkN2ZiMiwgMHg3NTlmZWE3NSwKLSAgICAweDA5MWIxMjA5LCAweDgzOWUxZDgzLCAweDJjNzQ1ODJjLCAweDFhMmUzNDFhLAotICAgIDB4MWIyZDM2MWIsIDB4NmViMmRjNmUsIDB4NWFlZWI0NWEsIDB4YTBmYjViYTAsCi0gICAgMHg1MmY2YTQ1MiwgMHgzYjRkNzYzYiwgMHhkNjYxYjdkNiwgMHhiM2NlN2RiMywKLSAgICAweDI5N2I1MjI5LCAweGUzM2VkZGUzLCAweDJmNzE1ZTJmLCAweDg0OTcxMzg0LAotICAgIDB4NTNmNWE2NTMsIDB4ZDE2OGI5ZDEsIDB4MDAwMDAwMDAsIDB4ZWQyY2MxZWQsCi0gICAgMHgyMDYwNDAyMCwgMHhmYzFmZTNmYywgMHhiMWM4NzliMSwgMHg1YmVkYjY1YiwKLSAgICAweDZhYmVkNDZhLCAweGNiNDY4ZGNiLCAweGJlZDk2N2JlLCAweDM5NGI3MjM5LAotICAgIDB4NGFkZTk0NGEsIDB4NGNkNDk4NGMsIDB4NThlOGIwNTgsIDB4Y2Y0YTg1Y2YsCi0gICAgMHhkMDZiYmJkMCwgMHhlZjJhYzVlZiwgMHhhYWU1NGZhYSwgMHhmYjE2ZWRmYiwKLSAgICAweDQzYzU4NjQzLCAweDRkZDc5YTRkLCAweDMzNTU2NjMzLCAweDg1OTQxMTg1LAotICAgIDB4NDVjZjhhNDUsIDB4ZjkxMGU5ZjksIDB4MDIwNjA0MDIsIDB4N2Y4MWZlN2YsCi0gICAgMHg1MGYwYTA1MCwgMHgzYzQ0NzgzYywgMHg5ZmJhMjU5ZiwgMHhhOGUzNGJhOCwKLSAgICAweDUxZjNhMjUxLCAweGEzZmU1ZGEzLCAweDQwYzA4MDQwLCAweDhmOGEwNThmLAotICAgIDB4OTJhZDNmOTIsIDB4OWRiYzIxOWQsIDB4Mzg0ODcwMzgsIDB4ZjUwNGYxZjUsCi0gICAgMHhiY2RmNjNiYywgMHhiNmMxNzdiNiwgMHhkYTc1YWZkYSwgMHgyMTYzNDIyMSwKLSAgICAweDEwMzAyMDEwLCAweGZmMWFlNWZmLCAweGYzMGVmZGYzLCAweGQyNmRiZmQyLAotICAgIDB4Y2Q0YzgxY2QsIDB4MGMxNDE4MGMsIDB4MTMzNTI2MTMsIDB4ZWMyZmMzZWMsCi0gICAgMHg1ZmUxYmU1ZiwgMHg5N2EyMzU5NywgMHg0NGNjODg0NCwgMHgxNzM5MmUxNywKLSAgICAweGM0NTc5M2M0LCAweGE3ZjI1NWE3LCAweDdlODJmYzdlLCAweDNkNDc3YTNkLAotICAgIDB4NjRhY2M4NjQsIDB4NWRlN2JhNWQsIDB4MTkyYjMyMTksIDB4NzM5NWU2NzMsCi0gICAgMHg2MGEwYzA2MCwgMHg4MTk4MTk4MSwgMHg0ZmQxOWU0ZiwgMHhkYzdmYTNkYywKLSAgICAweDIyNjY0NDIyLCAweDJhN2U1NDJhLCAweDkwYWIzYjkwLCAweDg4ODMwYjg4LAotICAgIDB4NDZjYThjNDYsIDB4ZWUyOWM3ZWUsIDB4YjhkMzZiYjgsIDB4MTQzYzI4MTQsCi0gICAgMHhkZTc5YTdkZSwgMHg1ZWUyYmM1ZSwgMHgwYjFkMTYwYiwgMHhkYjc2YWRkYiwKLSAgICAweGUwM2JkYmUwLCAweDMyNTY2NDMyLCAweDNhNGU3NDNhLCAweDBhMWUxNDBhLAotICAgIDB4NDlkYjkyNDksIDB4MDYwYTBjMDYsIDB4MjQ2YzQ4MjQsIDB4NWNlNGI4NWMsCi0gICAgMHhjMjVkOWZjMiwgMHhkMzZlYmRkMywgMHhhY2VmNDNhYywgMHg2MmE2YzQ2MiwKLSAgICAweDkxYTgzOTkxLCAweDk1YTQzMTk1LCAweGU0MzdkM2U0LCAweDc5OGJmMjc5LAotICAgIDB4ZTczMmQ1ZTcsIDB4Yzg0MzhiYzgsIDB4Mzc1OTZlMzcsIDB4NmRiN2RhNmQsCi0gICAgMHg4ZDhjMDE4ZCwgMHhkNTY0YjFkNSwgMHg0ZWQyOWM0ZSwgMHhhOWUwNDlhOSwKLSAgICAweDZjYjRkODZjLCAweDU2ZmFhYzU2LCAweGY0MDdmM2Y0LCAweGVhMjVjZmVhLAotICAgIDB4NjVhZmNhNjUsIDB4N2E4ZWY0N2EsIDB4YWVlOTQ3YWUsIDB4MDgxODEwMDgsCi0gICAgMHhiYWQ1NmZiYSwgMHg3ODg4ZjA3OCwgMHgyNTZmNGEyNSwgMHgyZTcyNWMyZSwKLSAgICAweDFjMjQzODFjLCAweGE2ZjE1N2E2LCAweGI0Yzc3M2I0LCAweGM2NTE5N2M2LAotICAgIDB4ZTgyM2NiZTgsIDB4ZGQ3Y2ExZGQsIDB4NzQ5Y2U4NzQsIDB4MWYyMTNlMWYsCi0gICAgMHg0YmRkOTY0YiwgMHhiZGRjNjFiZCwgMHg4Yjg2MGQ4YiwgMHg4YTg1MGY4YSwKLSAgICAweDcwOTBlMDcwLCAweDNlNDI3YzNlLCAweGI1YzQ3MWI1LCAweDY2YWFjYzY2LAotICAgIDB4NDhkODkwNDgsIDB4MDMwNTA2MDMsIDB4ZjYwMWY3ZjYsIDB4MGUxMjFjMGUsCi0gICAgMHg2MWEzYzI2MSwgMHgzNTVmNmEzNSwgMHg1N2Y5YWU1NywgMHhiOWQwNjliOSwKLSAgICAweDg2OTExNzg2LCAweGMxNTg5OWMxLCAweDFkMjczYTFkLCAweDllYjkyNzllLAotICAgIDB4ZTEzOGQ5ZTEsIDB4ZjgxM2ViZjgsIDB4OThiMzJiOTgsIDB4MTEzMzIyMTEsCi0gICAgMHg2OWJiZDI2OSwgMHhkOTcwYTlkOSwgMHg4ZTg5MDc4ZSwgMHg5NGE3MzM5NCwKLSAgICAweDliYjYyZDliLCAweDFlMjIzYzFlLCAweDg3OTIxNTg3LCAweGU5MjBjOWU5LAotICAgIDB4Y2U0OTg3Y2UsIDB4NTVmZmFhNTUsIDB4Mjg3ODUwMjgsIDB4ZGY3YWE1ZGYsCi0gICAgMHg4YzhmMDM4YywgMHhhMWY4NTlhMSwgMHg4OTgwMDk4OSwgMHgwZDE3MWEwZCwKLSAgICAweGJmZGE2NWJmLCAweGU2MzFkN2U2LCAweDQyYzY4NDQyLCAweDY4YjhkMDY4LAotICAgIDB4NDFjMzgyNDEsIDB4OTliMDI5OTksIDB4MmQ3NzVhMmQsIDB4MGYxMTFlMGYsCisgICAgMHg2M2E1YzY2MywgMHg3Yzg0Zjg3YywgMHg3Nzk5ZWU3NywgMHg3YjhkZjY3YiwgMHhmMjBkZmZmMiwgMHg2YmJkZDY2YiwKKyAgICAweDZmYjFkZTZmLCAweGM1NTQ5MWM1LCAweDMwNTA2MDMwLCAweDAxMDMwMjAxLCAweDY3YTljZTY3LCAweDJiN2Q1NjJiLAorICAgIDB4ZmUxOWU3ZmUsIDB4ZDc2MmI1ZDcsIDB4YWJlNjRkYWIsIDB4NzY5YWVjNzYsIDB4Y2E0NThmY2EsIDB4ODI5ZDFmODIsCisgICAgMHhjOTQwODljOSwgMHg3ZDg3ZmE3ZCwgMHhmYTE1ZWZmYSwgMHg1OWViYjI1OSwgMHg0N2M5OGU0NywgMHhmMDBiZmJmMCwKKyAgICAweGFkZWM0MWFkLCAweGQ0NjdiM2Q0LCAweGEyZmQ1ZmEyLCAweGFmZWE0NWFmLCAweDljYmYyMzljLCAweGE0Zjc1M2E0LAorICAgIDB4NzI5NmU0NzIsIDB4YzA1YjliYzAsIDB4YjdjMjc1YjcsIDB4ZmQxY2UxZmQsIDB4OTNhZTNkOTMsIDB4MjY2YTRjMjYsCisgICAgMHgzNjVhNmMzNiwgMHgzZjQxN2UzZiwgMHhmNzAyZjVmNywgMHhjYzRmODNjYywgMHgzNDVjNjgzNCwgMHhhNWY0NTFhNSwKKyAgICAweGU1MzRkMWU1LCAweGYxMDhmOWYxLCAweDcxOTNlMjcxLCAweGQ4NzNhYmQ4LCAweDMxNTM2MjMxLCAweDE1M2YyYTE1LAorICAgIDB4MDQwYzA4MDQsIDB4Yzc1Mjk1YzcsIDB4MjM2NTQ2MjMsIDB4YzM1ZTlkYzMsIDB4MTgyODMwMTgsIDB4OTZhMTM3OTYsCisgICAgMHgwNTBmMGEwNSwgMHg5YWI1MmY5YSwgMHgwNzA5MGUwNywgMHgxMjM2MjQxMiwgMHg4MDliMWI4MCwgMHhlMjNkZGZlMiwKKyAgICAweGViMjZjZGViLCAweDI3Njk0ZTI3LCAweGIyY2Q3ZmIyLCAweDc1OWZlYTc1LCAweDA5MWIxMjA5LCAweDgzOWUxZDgzLAorICAgIDB4MmM3NDU4MmMsIDB4MWEyZTM0MWEsIDB4MWIyZDM2MWIsIDB4NmViMmRjNmUsIDB4NWFlZWI0NWEsIDB4YTBmYjViYTAsCisgICAgMHg1MmY2YTQ1MiwgMHgzYjRkNzYzYiwgMHhkNjYxYjdkNiwgMHhiM2NlN2RiMywgMHgyOTdiNTIyOSwgMHhlMzNlZGRlMywKKyAgICAweDJmNzE1ZTJmLCAweDg0OTcxMzg0LCAweDUzZjVhNjUzLCAweGQxNjhiOWQxLCAweDAwMDAwMDAwLCAweGVkMmNjMWVkLAorICAgIDB4MjA2MDQwMjAsIDB4ZmMxZmUzZmMsIDB4YjFjODc5YjEsIDB4NWJlZGI2NWIsIDB4NmFiZWQ0NmEsIDB4Y2I0NjhkY2IsCisgICAgMHhiZWQ5NjdiZSwgMHgzOTRiNzIzOSwgMHg0YWRlOTQ0YSwgMHg0Y2Q0OTg0YywgMHg1OGU4YjA1OCwgMHhjZjRhODVjZiwKKyAgICAweGQwNmJiYmQwLCAweGVmMmFjNWVmLCAweGFhZTU0ZmFhLCAweGZiMTZlZGZiLCAweDQzYzU4NjQzLCAweDRkZDc5YTRkLAorICAgIDB4MzM1NTY2MzMsIDB4ODU5NDExODUsIDB4NDVjZjhhNDUsIDB4ZjkxMGU5ZjksIDB4MDIwNjA0MDIsIDB4N2Y4MWZlN2YsCisgICAgMHg1MGYwYTA1MCwgMHgzYzQ0NzgzYywgMHg5ZmJhMjU5ZiwgMHhhOGUzNGJhOCwgMHg1MWYzYTI1MSwgMHhhM2ZlNWRhMywKKyAgICAweDQwYzA4MDQwLCAweDhmOGEwNThmLCAweDkyYWQzZjkyLCAweDlkYmMyMTlkLCAweDM4NDg3MDM4LCAweGY1MDRmMWY1LAorICAgIDB4YmNkZjYzYmMsIDB4YjZjMTc3YjYsIDB4ZGE3NWFmZGEsIDB4MjE2MzQyMjEsIDB4MTAzMDIwMTAsIDB4ZmYxYWU1ZmYsCisgICAgMHhmMzBlZmRmMywgMHhkMjZkYmZkMiwgMHhjZDRjODFjZCwgMHgwYzE0MTgwYywgMHgxMzM1MjYxMywgMHhlYzJmYzNlYywKKyAgICAweDVmZTFiZTVmLCAweDk3YTIzNTk3LCAweDQ0Y2M4ODQ0LCAweDE3MzkyZTE3LCAweGM0NTc5M2M0LCAweGE3ZjI1NWE3LAorICAgIDB4N2U4MmZjN2UsIDB4M2Q0NzdhM2QsIDB4NjRhY2M4NjQsIDB4NWRlN2JhNWQsIDB4MTkyYjMyMTksIDB4NzM5NWU2NzMsCisgICAgMHg2MGEwYzA2MCwgMHg4MTk4MTk4MSwgMHg0ZmQxOWU0ZiwgMHhkYzdmYTNkYywgMHgyMjY2NDQyMiwgMHgyYTdlNTQyYSwKKyAgICAweDkwYWIzYjkwLCAweDg4ODMwYjg4LCAweDQ2Y2E4YzQ2LCAweGVlMjljN2VlLCAweGI4ZDM2YmI4LCAweDE0M2MyODE0LAorICAgIDB4ZGU3OWE3ZGUsIDB4NWVlMmJjNWUsIDB4MGIxZDE2MGIsIDB4ZGI3NmFkZGIsIDB4ZTAzYmRiZTAsIDB4MzI1NjY0MzIsCisgICAgMHgzYTRlNzQzYSwgMHgwYTFlMTQwYSwgMHg0OWRiOTI0OSwgMHgwNjBhMGMwNiwgMHgyNDZjNDgyNCwgMHg1Y2U0Yjg1YywKKyAgICAweGMyNWQ5ZmMyLCAweGQzNmViZGQzLCAweGFjZWY0M2FjLCAweDYyYTZjNDYyLCAweDkxYTgzOTkxLCAweDk1YTQzMTk1LAorICAgIDB4ZTQzN2QzZTQsIDB4Nzk4YmYyNzksIDB4ZTczMmQ1ZTcsIDB4Yzg0MzhiYzgsIDB4Mzc1OTZlMzcsIDB4NmRiN2RhNmQsCisgICAgMHg4ZDhjMDE4ZCwgMHhkNTY0YjFkNSwgMHg0ZWQyOWM0ZSwgMHhhOWUwNDlhOSwgMHg2Y2I0ZDg2YywgMHg1NmZhYWM1NiwKKyAgICAweGY0MDdmM2Y0LCAweGVhMjVjZmVhLCAweDY1YWZjYTY1LCAweDdhOGVmNDdhLCAweGFlZTk0N2FlLCAweDA4MTgxMDA4LAorICAgIDB4YmFkNTZmYmEsIDB4Nzg4OGYwNzgsIDB4MjU2ZjRhMjUsIDB4MmU3MjVjMmUsIDB4MWMyNDM4MWMsIDB4YTZmMTU3YTYsCisgICAgMHhiNGM3NzNiNCwgMHhjNjUxOTdjNiwgMHhlODIzY2JlOCwgMHhkZDdjYTFkZCwgMHg3NDljZTg3NCwgMHgxZjIxM2UxZiwKKyAgICAweDRiZGQ5NjRiLCAweGJkZGM2MWJkLCAweDhiODYwZDhiLCAweDhhODUwZjhhLCAweDcwOTBlMDcwLCAweDNlNDI3YzNlLAorICAgIDB4YjVjNDcxYjUsIDB4NjZhYWNjNjYsIDB4NDhkODkwNDgsIDB4MDMwNTA2MDMsIDB4ZjYwMWY3ZjYsIDB4MGUxMjFjMGUsCisgICAgMHg2MWEzYzI2MSwgMHgzNTVmNmEzNSwgMHg1N2Y5YWU1NywgMHhiOWQwNjliOSwgMHg4NjkxMTc4NiwgMHhjMTU4OTljMSwKKyAgICAweDFkMjczYTFkLCAweDllYjkyNzllLCAweGUxMzhkOWUxLCAweGY4MTNlYmY4LCAweDk4YjMyYjk4LCAweDExMzMyMjExLAorICAgIDB4NjliYmQyNjksIDB4ZDk3MGE5ZDksIDB4OGU4OTA3OGUsIDB4OTRhNzMzOTQsIDB4OWJiNjJkOWIsIDB4MWUyMjNjMWUsCisgICAgMHg4NzkyMTU4NywgMHhlOTIwYzllOSwgMHhjZTQ5ODdjZSwgMHg1NWZmYWE1NSwgMHgyODc4NTAyOCwgMHhkZjdhYTVkZiwKKyAgICAweDhjOGYwMzhjLCAweGExZjg1OWExLCAweDg5ODAwOTg5LCAweDBkMTcxYTBkLCAweGJmZGE2NWJmLCAweGU2MzFkN2U2LAorICAgIDB4NDJjNjg0NDIsIDB4NjhiOGQwNjgsIDB4NDFjMzgyNDEsIDB4OTliMDI5OTksIDB4MmQ3NzVhMmQsIDB4MGYxMTFlMGYsCiAgICAgMHhiMGNiN2JiMCwgMHg1NGZjYTg1NCwgMHhiYmQ2NmRiYiwgMHgxNjNhMmMxNiwKIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEUzWzI1Nl0gPSB7Ci0gICAgMHg2MzYzYTVjNiwgMHg3YzdjODRmOCwgMHg3Nzc3OTllZSwgMHg3YjdiOGRmNiwKLSAgICAweGYyZjIwZGZmLCAweDZiNmJiZGQ2LCAweDZmNmZiMWRlLCAweGM1YzU1NDkxLAotICAgIDB4MzAzMDUwNjAsIDB4MDEwMTAzMDIsIDB4Njc2N2E5Y2UsIDB4MmIyYjdkNTYsCi0gICAgMHhmZWZlMTllNywgMHhkN2Q3NjJiNSwgMHhhYmFiZTY0ZCwgMHg3Njc2OWFlYywKLSAgICAweGNhY2E0NThmLCAweDgyODI5ZDFmLCAweGM5Yzk0MDg5LCAweDdkN2Q4N2ZhLAotICAgIDB4ZmFmYTE1ZWYsIDB4NTk1OWViYjIsIDB4NDc0N2M5OGUsIDB4ZjBmMDBiZmIsCi0gICAgMHhhZGFkZWM0MSwgMHhkNGQ0NjdiMywgMHhhMmEyZmQ1ZiwgMHhhZmFmZWE0NSwKLSAgICAweDljOWNiZjIzLCAweGE0YTRmNzUzLCAweDcyNzI5NmU0LCAweGMwYzA1YjliLAotICAgIDB4YjdiN2MyNzUsIDB4ZmRmZDFjZTEsIDB4OTM5M2FlM2QsIDB4MjYyNjZhNGMsCi0gICAgMHgzNjM2NWE2YywgMHgzZjNmNDE3ZSwgMHhmN2Y3MDJmNSwgMHhjY2NjNGY4MywKLSAgICAweDM0MzQ1YzY4LCAweGE1YTVmNDUxLCAweGU1ZTUzNGQxLCAweGYxZjEwOGY5LAotICAgIDB4NzE3MTkzZTIsIDB4ZDhkODczYWIsIDB4MzEzMTUzNjIsIDB4MTUxNTNmMmEsCi0gICAgMHgwNDA0MGMwOCwgMHhjN2M3NTI5NSwgMHgyMzIzNjU0NiwgMHhjM2MzNWU5ZCwKLSAgICAweDE4MTgyODMwLCAweDk2OTZhMTM3LCAweDA1MDUwZjBhLCAweDlhOWFiNTJmLAotICAgIDB4MDcwNzA5MGUsIDB4MTIxMjM2MjQsIDB4ODA4MDliMWIsIDB4ZTJlMjNkZGYsCi0gICAgMHhlYmViMjZjZCwgMHgyNzI3Njk0ZSwgMHhiMmIyY2Q3ZiwgMHg3NTc1OWZlYSwKLSAgICAweDA5MDkxYjEyLCAweDgzODM5ZTFkLCAweDJjMmM3NDU4LCAweDFhMWEyZTM0LAotICAgIDB4MWIxYjJkMzYsIDB4NmU2ZWIyZGMsIDB4NWE1YWVlYjQsIDB4YTBhMGZiNWIsCi0gICAgMHg1MjUyZjZhNCwgMHgzYjNiNGQ3NiwgMHhkNmQ2NjFiNywgMHhiM2IzY2U3ZCwKLSAgICAweDI5Mjk3YjUyLCAweGUzZTMzZWRkLCAweDJmMmY3MTVlLCAweDg0ODQ5NzEzLAotICAgIDB4NTM1M2Y1YTYsIDB4ZDFkMTY4YjksIDB4MDAwMDAwMDAsIDB4ZWRlZDJjYzEsCi0gICAgMHgyMDIwNjA0MCwgMHhmY2ZjMWZlMywgMHhiMWIxYzg3OSwgMHg1YjViZWRiNiwKLSAgICAweDZhNmFiZWQ0LCAweGNiY2I0NjhkLCAweGJlYmVkOTY3LCAweDM5Mzk0YjcyLAotICAgIDB4NGE0YWRlOTQsIDB4NGM0Y2Q0OTgsIDB4NTg1OGU4YjAsIDB4Y2ZjZjRhODUsCi0gICAgMHhkMGQwNmJiYiwgMHhlZmVmMmFjNSwgMHhhYWFhZTU0ZiwgMHhmYmZiMTZlZCwKLSAgICAweDQzNDNjNTg2LCAweDRkNGRkNzlhLCAweDMzMzM1NTY2LCAweDg1ODU5NDExLAotICAgIDB4NDU0NWNmOGEsIDB4ZjlmOTEwZTksIDB4MDIwMjA2MDQsIDB4N2Y3ZjgxZmUsCi0gICAgMHg1MDUwZjBhMCwgMHgzYzNjNDQ3OCwgMHg5ZjlmYmEyNSwgMHhhOGE4ZTM0YiwKLSAgICAweDUxNTFmM2EyLCAweGEzYTNmZTVkLCAweDQwNDBjMDgwLCAweDhmOGY4YTA1LAotICAgIDB4OTI5MmFkM2YsIDB4OWQ5ZGJjMjEsIDB4MzgzODQ4NzAsIDB4ZjVmNTA0ZjEsCi0gICAgMHhiY2JjZGY2MywgMHhiNmI2YzE3NywgMHhkYWRhNzVhZiwgMHgyMTIxNjM0MiwKLSAgICAweDEwMTAzMDIwLCAweGZmZmYxYWU1LCAweGYzZjMwZWZkLCAweGQyZDI2ZGJmLAotICAgIDB4Y2RjZDRjODEsIDB4MGMwYzE0MTgsIDB4MTMxMzM1MjYsIDB4ZWNlYzJmYzMsCi0gICAgMHg1ZjVmZTFiZSwgMHg5Nzk3YTIzNSwgMHg0NDQ0Y2M4OCwgMHgxNzE3MzkyZSwKLSAgICAweGM0YzQ1NzkzLCAweGE3YTdmMjU1LCAweDdlN2U4MmZjLCAweDNkM2Q0NzdhLAotICAgIDB4NjQ2NGFjYzgsIDB4NWQ1ZGU3YmEsIDB4MTkxOTJiMzIsIDB4NzM3Mzk1ZTYsCi0gICAgMHg2MDYwYTBjMCwgMHg4MTgxOTgxOSwgMHg0ZjRmZDE5ZSwgMHhkY2RjN2ZhMywKLSAgICAweDIyMjI2NjQ0LCAweDJhMmE3ZTU0LCAweDkwOTBhYjNiLCAweDg4ODg4MzBiLAotICAgIDB4NDY0NmNhOGMsIDB4ZWVlZTI5YzcsIDB4YjhiOGQzNmIsIDB4MTQxNDNjMjgsCi0gICAgMHhkZWRlNzlhNywgMHg1ZTVlZTJiYywgMHgwYjBiMWQxNiwgMHhkYmRiNzZhZCwKLSAgICAweGUwZTAzYmRiLCAweDMyMzI1NjY0LCAweDNhM2E0ZTc0LCAweDBhMGExZTE0LAotICAgIDB4NDk0OWRiOTIsIDB4MDYwNjBhMGMsIDB4MjQyNDZjNDgsIDB4NWM1Y2U0YjgsCi0gICAgMHhjMmMyNWQ5ZiwgMHhkM2QzNmViZCwgMHhhY2FjZWY0MywgMHg2MjYyYTZjNCwKLSAgICAweDkxOTFhODM5LCAweDk1OTVhNDMxLCAweGU0ZTQzN2QzLCAweDc5Nzk4YmYyLAotICAgIDB4ZTdlNzMyZDUsIDB4YzhjODQzOGIsIDB4MzczNzU5NmUsIDB4NmQ2ZGI3ZGEsCi0gICAgMHg4ZDhkOGMwMSwgMHhkNWQ1NjRiMSwgMHg0ZTRlZDI5YywgMHhhOWE5ZTA0OSwKLSAgICAweDZjNmNiNGQ4LCAweDU2NTZmYWFjLCAweGY0ZjQwN2YzLCAweGVhZWEyNWNmLAotICAgIDB4NjU2NWFmY2EsIDB4N2E3YThlZjQsIDB4YWVhZWU5NDcsIDB4MDgwODE4MTAsCi0gICAgMHhiYWJhZDU2ZiwgMHg3ODc4ODhmMCwgMHgyNTI1NmY0YSwgMHgyZTJlNzI1YywKLSAgICAweDFjMWMyNDM4LCAweGE2YTZmMTU3LCAweGI0YjRjNzczLCAweGM2YzY1MTk3LAotICAgIDB4ZThlODIzY2IsIDB4ZGRkZDdjYTEsIDB4NzQ3NDljZTgsIDB4MWYxZjIxM2UsCi0gICAgMHg0YjRiZGQ5NiwgMHhiZGJkZGM2MSwgMHg4YjhiODYwZCwgMHg4YThhODUwZiwKLSAgICAweDcwNzA5MGUwLCAweDNlM2U0MjdjLCAweGI1YjVjNDcxLCAweDY2NjZhYWNjLAotICAgIDB4NDg0OGQ4OTAsIDB4MDMwMzA1MDYsIDB4ZjZmNjAxZjcsIDB4MGUwZTEyMWMsCi0gICAgMHg2MTYxYTNjMiwgMHgzNTM1NWY2YSwgMHg1NzU3ZjlhZSwgMHhiOWI5ZDA2OSwKLSAgICAweDg2ODY5MTE3LCAweGMxYzE1ODk5LCAweDFkMWQyNzNhLCAweDllOWViOTI3LAotICAgIDB4ZTFlMTM4ZDksIDB4ZjhmODEzZWIsIDB4OTg5OGIzMmIsIDB4MTExMTMzMjIsCi0gICAgMHg2OTY5YmJkMiwgMHhkOWQ5NzBhOSwgMHg4ZThlODkwNywgMHg5NDk0YTczMywKLSAgICAweDliOWJiNjJkLCAweDFlMWUyMjNjLCAweDg3ODc5MjE1LCAweGU5ZTkyMGM5LAotICAgIDB4Y2VjZTQ5ODcsIDB4NTU1NWZmYWEsIDB4MjgyODc4NTAsIDB4ZGZkZjdhYTUsCi0gICAgMHg4YzhjOGYwMywgMHhhMWExZjg1OSwgMHg4OTg5ODAwOSwgMHgwZDBkMTcxYSwKLSAgICAweGJmYmZkYTY1LCAweGU2ZTYzMWQ3LCAweDQyNDJjNjg0LCAweDY4NjhiOGQwLAotICAgIDB4NDE0MWMzODIsIDB4OTk5OWIwMjksIDB4MmQyZDc3NWEsIDB4MGYwZjExMWUsCisgICAgMHg2MzYzYTVjNiwgMHg3YzdjODRmOCwgMHg3Nzc3OTllZSwgMHg3YjdiOGRmNiwgMHhmMmYyMGRmZiwgMHg2YjZiYmRkNiwKKyAgICAweDZmNmZiMWRlLCAweGM1YzU1NDkxLCAweDMwMzA1MDYwLCAweDAxMDEwMzAyLCAweDY3NjdhOWNlLCAweDJiMmI3ZDU2LAorICAgIDB4ZmVmZTE5ZTcsIDB4ZDdkNzYyYjUsIDB4YWJhYmU2NGQsIDB4NzY3NjlhZWMsIDB4Y2FjYTQ1OGYsIDB4ODI4MjlkMWYsCisgICAgMHhjOWM5NDA4OSwgMHg3ZDdkODdmYSwgMHhmYWZhMTVlZiwgMHg1OTU5ZWJiMiwgMHg0NzQ3Yzk4ZSwgMHhmMGYwMGJmYiwKKyAgICAweGFkYWRlYzQxLCAweGQ0ZDQ2N2IzLCAweGEyYTJmZDVmLCAweGFmYWZlYTQ1LCAweDljOWNiZjIzLCAweGE0YTRmNzUzLAorICAgIDB4NzI3Mjk2ZTQsIDB4YzBjMDViOWIsIDB4YjdiN2MyNzUsIDB4ZmRmZDFjZTEsIDB4OTM5M2FlM2QsIDB4MjYyNjZhNGMsCisgICAgMHgzNjM2NWE2YywgMHgzZjNmNDE3ZSwgMHhmN2Y3MDJmNSwgMHhjY2NjNGY4MywgMHgzNDM0NWM2OCwgMHhhNWE1ZjQ1MSwKKyAgICAweGU1ZTUzNGQxLCAweGYxZjEwOGY5LCAweDcxNzE5M2UyLCAweGQ4ZDg3M2FiLCAweDMxMzE1MzYyLCAweDE1MTUzZjJhLAorICAgIDB4MDQwNDBjMDgsIDB4YzdjNzUyOTUsIDB4MjMyMzY1NDYsIDB4YzNjMzVlOWQsIDB4MTgxODI4MzAsIDB4OTY5NmExMzcsCisgICAgMHgwNTA1MGYwYSwgMHg5YTlhYjUyZiwgMHgwNzA3MDkwZSwgMHgxMjEyMzYyNCwgMHg4MDgwOWIxYiwgMHhlMmUyM2RkZiwKKyAgICAweGViZWIyNmNkLCAweDI3Mjc2OTRlLCAweGIyYjJjZDdmLCAweDc1NzU5ZmVhLCAweDA5MDkxYjEyLCAweDgzODM5ZTFkLAorICAgIDB4MmMyYzc0NTgsIDB4MWExYTJlMzQsIDB4MWIxYjJkMzYsIDB4NmU2ZWIyZGMsIDB4NWE1YWVlYjQsIDB4YTBhMGZiNWIsCisgICAgMHg1MjUyZjZhNCwgMHgzYjNiNGQ3NiwgMHhkNmQ2NjFiNywgMHhiM2IzY2U3ZCwgMHgyOTI5N2I1MiwgMHhlM2UzM2VkZCwKKyAgICAweDJmMmY3MTVlLCAweDg0ODQ5NzEzLCAweDUzNTNmNWE2LCAweGQxZDE2OGI5LCAweDAwMDAwMDAwLCAweGVkZWQyY2MxLAorICAgIDB4MjAyMDYwNDAsIDB4ZmNmYzFmZTMsIDB4YjFiMWM4NzksIDB4NWI1YmVkYjYsIDB4NmE2YWJlZDQsIDB4Y2JjYjQ2OGQsCisgICAgMHhiZWJlZDk2NywgMHgzOTM5NGI3MiwgMHg0YTRhZGU5NCwgMHg0YzRjZDQ5OCwgMHg1ODU4ZThiMCwgMHhjZmNmNGE4NSwKKyAgICAweGQwZDA2YmJiLCAweGVmZWYyYWM1LCAweGFhYWFlNTRmLCAweGZiZmIxNmVkLCAweDQzNDNjNTg2LCAweDRkNGRkNzlhLAorICAgIDB4MzMzMzU1NjYsIDB4ODU4NTk0MTEsIDB4NDU0NWNmOGEsIDB4ZjlmOTEwZTksIDB4MDIwMjA2MDQsIDB4N2Y3ZjgxZmUsCisgICAgMHg1MDUwZjBhMCwgMHgzYzNjNDQ3OCwgMHg5ZjlmYmEyNSwgMHhhOGE4ZTM0YiwgMHg1MTUxZjNhMiwgMHhhM2EzZmU1ZCwKKyAgICAweDQwNDBjMDgwLCAweDhmOGY4YTA1LCAweDkyOTJhZDNmLCAweDlkOWRiYzIxLCAweDM4Mzg0ODcwLCAweGY1ZjUwNGYxLAorICAgIDB4YmNiY2RmNjMsIDB4YjZiNmMxNzcsIDB4ZGFkYTc1YWYsIDB4MjEyMTYzNDIsIDB4MTAxMDMwMjAsIDB4ZmZmZjFhZTUsCisgICAgMHhmM2YzMGVmZCwgMHhkMmQyNmRiZiwgMHhjZGNkNGM4MSwgMHgwYzBjMTQxOCwgMHgxMzEzMzUyNiwgMHhlY2VjMmZjMywKKyAgICAweDVmNWZlMWJlLCAweDk3OTdhMjM1LCAweDQ0NDRjYzg4LCAweDE3MTczOTJlLCAweGM0YzQ1NzkzLCAweGE3YTdmMjU1LAorICAgIDB4N2U3ZTgyZmMsIDB4M2QzZDQ3N2EsIDB4NjQ2NGFjYzgsIDB4NWQ1ZGU3YmEsIDB4MTkxOTJiMzIsIDB4NzM3Mzk1ZTYsCisgICAgMHg2MDYwYTBjMCwgMHg4MTgxOTgxOSwgMHg0ZjRmZDE5ZSwgMHhkY2RjN2ZhMywgMHgyMjIyNjY0NCwgMHgyYTJhN2U1NCwKKyAgICAweDkwOTBhYjNiLCAweDg4ODg4MzBiLCAweDQ2NDZjYThjLCAweGVlZWUyOWM3LCAweGI4YjhkMzZiLCAweDE0MTQzYzI4LAorICAgIDB4ZGVkZTc5YTcsIDB4NWU1ZWUyYmMsIDB4MGIwYjFkMTYsIDB4ZGJkYjc2YWQsIDB4ZTBlMDNiZGIsIDB4MzIzMjU2NjQsCisgICAgMHgzYTNhNGU3NCwgMHgwYTBhMWUxNCwgMHg0OTQ5ZGI5MiwgMHgwNjA2MGEwYywgMHgyNDI0NmM0OCwgMHg1YzVjZTRiOCwKKyAgICAweGMyYzI1ZDlmLCAweGQzZDM2ZWJkLCAweGFjYWNlZjQzLCAweDYyNjJhNmM0LCAweDkxOTFhODM5LCAweDk1OTVhNDMxLAorICAgIDB4ZTRlNDM3ZDMsIDB4Nzk3OThiZjIsIDB4ZTdlNzMyZDUsIDB4YzhjODQzOGIsIDB4MzczNzU5NmUsIDB4NmQ2ZGI3ZGEsCisgICAgMHg4ZDhkOGMwMSwgMHhkNWQ1NjRiMSwgMHg0ZTRlZDI5YywgMHhhOWE5ZTA0OSwgMHg2YzZjYjRkOCwgMHg1NjU2ZmFhYywKKyAgICAweGY0ZjQwN2YzLCAweGVhZWEyNWNmLCAweDY1NjVhZmNhLCAweDdhN2E4ZWY0LCAweGFlYWVlOTQ3LCAweDA4MDgxODEwLAorICAgIDB4YmFiYWQ1NmYsIDB4Nzg3ODg4ZjAsIDB4MjUyNTZmNGEsIDB4MmUyZTcyNWMsIDB4MWMxYzI0MzgsIDB4YTZhNmYxNTcsCisgICAgMHhiNGI0Yzc3MywgMHhjNmM2NTE5NywgMHhlOGU4MjNjYiwgMHhkZGRkN2NhMSwgMHg3NDc0OWNlOCwgMHgxZjFmMjEzZSwKKyAgICAweDRiNGJkZDk2LCAweGJkYmRkYzYxLCAweDhiOGI4NjBkLCAweDhhOGE4NTBmLCAweDcwNzA5MGUwLCAweDNlM2U0MjdjLAorICAgIDB4YjViNWM0NzEsIDB4NjY2NmFhY2MsIDB4NDg0OGQ4OTAsIDB4MDMwMzA1MDYsIDB4ZjZmNjAxZjcsIDB4MGUwZTEyMWMsCisgICAgMHg2MTYxYTNjMiwgMHgzNTM1NWY2YSwgMHg1NzU3ZjlhZSwgMHhiOWI5ZDA2OSwgMHg4Njg2OTExNywgMHhjMWMxNTg5OSwKKyAgICAweDFkMWQyNzNhLCAweDllOWViOTI3LCAweGUxZTEzOGQ5LCAweGY4ZjgxM2ViLCAweDk4OThiMzJiLCAweDExMTEzMzIyLAorICAgIDB4Njk2OWJiZDIsIDB4ZDlkOTcwYTksIDB4OGU4ZTg5MDcsIDB4OTQ5NGE3MzMsIDB4OWI5YmI2MmQsIDB4MWUxZTIyM2MsCisgICAgMHg4Nzg3OTIxNSwgMHhlOWU5MjBjOSwgMHhjZWNlNDk4NywgMHg1NTU1ZmZhYSwgMHgyODI4Nzg1MCwgMHhkZmRmN2FhNSwKKyAgICAweDhjOGM4ZjAzLCAweGExYTFmODU5LCAweDg5ODk4MDA5LCAweDBkMGQxNzFhLCAweGJmYmZkYTY1LCAweGU2ZTYzMWQ3LAorICAgIDB4NDI0MmM2ODQsIDB4Njg2OGI4ZDAsIDB4NDE0MWMzODIsIDB4OTk5OWIwMjksIDB4MmQyZDc3NWEsIDB4MGYwZjExMWUsCiAgICAgMHhiMGIwY2I3YiwgMHg1NDU0ZmNhOCwgMHhiYmJiZDY2ZCwgMHgxNjE2M2EyYywKIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEQwWzI1Nl0gPSB7Ci0gICAgMHg1MWY0YTc1MCwgMHg3ZTQxNjU1MywgMHgxYTE3YTRjMywgMHgzYTI3NWU5NiwKLSAgICAweDNiYWI2YmNiLCAweDFmOWQ0NWYxLCAweGFjZmE1OGFiLCAweDRiZTMwMzkzLAotICAgIDB4MjAzMGZhNTUsIDB4YWQ3NjZkZjYsIDB4ODhjYzc2OTEsIDB4ZjUwMjRjMjUsCi0gICAgMHg0ZmU1ZDdmYywgMHhjNTJhY2JkNywgMHgyNjM1NDQ4MCwgMHhiNTYyYTM4ZiwKLSAgICAweGRlYjE1YTQ5LCAweDI1YmExYjY3LCAweDQ1ZWEwZTk4LCAweDVkZmVjMGUxLAotICAgIDB4YzMyZjc1MDIsIDB4ODE0Y2YwMTIsIDB4OGQ0Njk3YTMsIDB4NmJkM2Y5YzYsCi0gICAgMHgwMzhmNWZlNywgMHgxNTkyOWM5NSwgMHhiZjZkN2FlYiwgMHg5NTUyNTlkYSwKLSAgICAweGQ0YmU4MzJkLCAweDU4NzQyMWQzLCAweDQ5ZTA2OTI5LCAweDhlYzljODQ0LAotICAgIDB4NzVjMjg5NmEsIDB4ZjQ4ZTc5NzgsIDB4OTk1ODNlNmIsIDB4MjdiOTcxZGQsCi0gICAgMHhiZWUxNGZiNiwgMHhmMDg4YWQxNywgMHhjOTIwYWM2NiwgMHg3ZGNlM2FiNCwKLSAgICAweDYzZGY0YTE4LCAweGU1MWEzMTgyLCAweDk3NTEzMzYwLCAweDYyNTM3ZjQ1LAotICAgIDB4YjE2NDc3ZTAsIDB4YmI2YmFlODQsIDB4ZmU4MWEwMWMsIDB4ZjkwODJiOTQsCi0gICAgMHg3MDQ4Njg1OCwgMHg4ZjQ1ZmQxOSwgMHg5NGRlNmM4NywgMHg1MjdiZjhiNywKLSAgICAweGFiNzNkMzIzLCAweDcyNGIwMmUyLCAweGUzMWY4ZjU3LCAweDY2NTVhYjJhLAotICAgIDB4YjJlYjI4MDcsIDB4MmZiNWMyMDMsIDB4ODZjNTdiOWEsIDB4ZDMzNzA4YTUsCi0gICAgMHgzMDI4ODdmMiwgMHgyM2JmYTViMiwgMHgwMjAzNmFiYSwgMHhlZDE2ODI1YywKLSAgICAweDhhY2YxYzJiLCAweGE3NzliNDkyLCAweGYzMDdmMmYwLCAweDRlNjllMmExLAotICAgIDB4NjVkYWY0Y2QsIDB4MDYwNWJlZDUsIDB4ZDEzNDYyMWYsIDB4YzRhNmZlOGEsCi0gICAgMHgzNDJlNTM5ZCwgMHhhMmYzNTVhMCwgMHgwNThhZTEzMiwgMHhhNGY2ZWI3NSwKLSAgICAweDBiODNlYzM5LCAweDQwNjBlZmFhLCAweDVlNzE5ZjA2LCAweGJkNmUxMDUxLAotICAgIDB4M2UyMThhZjksIDB4OTZkZDA2M2QsIDB4ZGQzZTA1YWUsIDB4NGRlNmJkNDYsCi0gICAgMHg5MTU0OGRiNSwgMHg3MWM0NWQwNSwgMHgwNDA2ZDQ2ZiwgMHg2MDUwMTVmZiwKLSAgICAweDE5OThmYjI0LCAweGQ2YmRlOTk3LCAweDg5NDA0M2NjLCAweDY3ZDk5ZTc3LAotICAgIDB4YjBlODQyYmQsIDB4MDc4OThiODgsIDB4ZTcxOTViMzgsIDB4NzljOGVlZGIsCi0gICAgMHhhMTdjMGE0NywgMHg3YzQyMGZlOSwgMHhmODg0MWVjOSwgMHgwMDAwMDAwMCwKLSAgICAweDA5ODA4NjgzLCAweDMyMmJlZDQ4LCAweDFlMTE3MGFjLCAweDZjNWE3MjRlLAotICAgIDB4ZmQwZWZmZmIsIDB4MGY4NTM4NTYsIDB4M2RhZWQ1MWUsIDB4MzYyZDM5MjcsCi0gICAgMHgwYTBmZDk2NCwgMHg2ODVjYTYyMSwgMHg5YjViNTRkMSwgMHgyNDM2MmUzYSwKLSAgICAweDBjMGE2N2IxLCAweDkzNTdlNzBmLCAweGI0ZWU5NmQyLCAweDFiOWI5MTllLAotICAgIDB4ODBjMGM1NGYsIDB4NjFkYzIwYTIsIDB4NWE3NzRiNjksIDB4MWMxMjFhMTYsCi0gICAgMHhlMjkzYmEwYSwgMHhjMGEwMmFlNSwgMHgzYzIyZTA0MywgMHgxMjFiMTcxZCwKLSAgICAweDBlMDkwZDBiLCAweGYyOGJjN2FkLCAweDJkYjZhOGI5LCAweDE0MWVhOWM4LAotICAgIDB4NTdmMTE5ODUsIDB4YWY3NTA3NGMsIDB4ZWU5OWRkYmIsIDB4YTM3ZjYwZmQsCi0gICAgMHhmNzAxMjY5ZiwgMHg1YzcyZjViYywgMHg0NDY2M2JjNSwgMHg1YmZiN2UzNCwKLSAgICAweDhiNDMyOTc2LCAweGNiMjNjNmRjLCAweGI2ZWRmYzY4LCAweGI4ZTRmMTYzLAotICAgIDB4ZDczMWRjY2EsIDB4NDI2Mzg1MTAsIDB4MTM5NzIyNDAsIDB4ODRjNjExMjAsCi0gICAgMHg4NTRhMjQ3ZCwgMHhkMmJiM2RmOCwgMHhhZWY5MzIxMSwgMHhjNzI5YTE2ZCwKLSAgICAweDFkOWUyZjRiLCAweGRjYjIzMGYzLCAweDBkODY1MmVjLCAweDc3YzFlM2QwLAotICAgIDB4MmJiMzE2NmMsIDB4YTk3MGI5OTksIDB4MTE5NDQ4ZmEsIDB4NDdlOTY0MjIsCi0gICAgMHhhOGZjOGNjNCwgMHhhMGYwM2YxYSwgMHg1NjdkMmNkOCwgMHgyMjMzOTBlZiwKLSAgICAweDg3NDk0ZWM3LCAweGQ5MzhkMWMxLCAweDhjY2FhMmZlLCAweDk4ZDQwYjM2LAotICAgIDB4YTZmNTgxY2YsIDB4YTU3YWRlMjgsIDB4ZGFiNzhlMjYsIDB4M2ZhZGJmYTQsCi0gICAgMHgyYzNhOWRlNCwgMHg1MDc4OTIwZCwgMHg2YTVmY2M5YiwgMHg1NDdlNDY2MiwKLSAgICAweGY2OGQxM2MyLCAweDkwZDhiOGU4LCAweDJlMzlmNzVlLCAweDgyYzNhZmY1LAotICAgIDB4OWY1ZDgwYmUsIDB4NjlkMDkzN2MsIDB4NmZkNTJkYTksIDB4Y2YyNTEyYjMsCi0gICAgMHhjOGFjOTkzYiwgMHgxMDE4N2RhNywgMHhlODljNjM2ZSwgMHhkYjNiYmI3YiwKLSAgICAweGNkMjY3ODA5LCAweDZlNTkxOGY0LCAweGVjOWFiNzAxLCAweDgzNGY5YWE4LAotICAgIDB4ZTY5NTZlNjUsIDB4YWFmZmU2N2UsIDB4MjFiY2NmMDgsIDB4ZWYxNWU4ZTYsCi0gICAgMHhiYWU3OWJkOSwgMHg0YTZmMzZjZSwgMHhlYTlmMDlkNCwgMHgyOWIwN2NkNiwKLSAgICAweDMxYTRiMmFmLCAweDJhM2YyMzMxLCAweGM2YTU5NDMwLCAweDM1YTI2NmMwLAotICAgIDB4NzQ0ZWJjMzcsIDB4ZmM4MmNhYTYsIDB4ZTA5MGQwYjAsIDB4MzNhN2Q4MTUsCi0gICAgMHhmMTA0OTg0YSwgMHg0MWVjZGFmNywgMHg3ZmNkNTAwZSwgMHgxNzkxZjYyZiwKLSAgICAweDc2NGRkNjhkLCAweDQzZWZiMDRkLCAweGNjYWE0ZDU0LCAweGU0OTYwNGRmLAotICAgIDB4OWVkMWI1ZTMsIDB4NGM2YTg4MWIsIDB4YzEyYzFmYjgsIDB4NDY2NTUxN2YsCi0gICAgMHg5ZDVlZWEwNCwgMHgwMThjMzU1ZCwgMHhmYTg3NzQ3MywgMHhmYjBiNDEyZSwKLSAgICAweGIzNjcxZDVhLCAweDkyZGJkMjUyLCAweGU5MTA1NjMzLCAweDZkZDY0NzEzLAotICAgIDB4OWFkNzYxOGMsIDB4MzdhMTBjN2EsIDB4NTlmODE0OGUsIDB4ZWIxMzNjODksCi0gICAgMHhjZWE5MjdlZSwgMHhiNzYxYzkzNSwgMHhlMTFjZTVlZCwgMHg3YTQ3YjEzYywKLSAgICAweDljZDJkZjU5LCAweDU1ZjI3MzNmLCAweDE4MTRjZTc5LCAweDczYzczN2JmLAotICAgIDB4NTNmN2NkZWEsIDB4NWZmZGFhNWIsIDB4ZGYzZDZmMTQsIDB4Nzg0NGRiODYsCi0gICAgMHhjYWFmZjM4MSwgMHhiOTY4YzQzZSwgMHgzODI0MzQyYywgMHhjMmEzNDA1ZiwKLSAgICAweDE2MWRjMzcyLCAweGJjZTIyNTBjLCAweDI4M2M0OThiLCAweGZmMGQ5NTQxLAotICAgIDB4MzlhODAxNzEsIDB4MDgwY2IzZGUsIDB4ZDhiNGU0OWMsIDB4NjQ1NmMxOTAsCisgICAgMHg1MWY0YTc1MCwgMHg3ZTQxNjU1MywgMHgxYTE3YTRjMywgMHgzYTI3NWU5NiwgMHgzYmFiNmJjYiwgMHgxZjlkNDVmMSwKKyAgICAweGFjZmE1OGFiLCAweDRiZTMwMzkzLCAweDIwMzBmYTU1LCAweGFkNzY2ZGY2LCAweDg4Y2M3NjkxLCAweGY1MDI0YzI1LAorICAgIDB4NGZlNWQ3ZmMsIDB4YzUyYWNiZDcsIDB4MjYzNTQ0ODAsIDB4YjU2MmEzOGYsIDB4ZGViMTVhNDksIDB4MjViYTFiNjcsCisgICAgMHg0NWVhMGU5OCwgMHg1ZGZlYzBlMSwgMHhjMzJmNzUwMiwgMHg4MTRjZjAxMiwgMHg4ZDQ2OTdhMywgMHg2YmQzZjljNiwKKyAgICAweDAzOGY1ZmU3LCAweDE1OTI5Yzk1LCAweGJmNmQ3YWViLCAweDk1NTI1OWRhLCAweGQ0YmU4MzJkLCAweDU4NzQyMWQzLAorICAgIDB4NDllMDY5MjksIDB4OGVjOWM4NDQsIDB4NzVjMjg5NmEsIDB4ZjQ4ZTc5NzgsIDB4OTk1ODNlNmIsIDB4MjdiOTcxZGQsCisgICAgMHhiZWUxNGZiNiwgMHhmMDg4YWQxNywgMHhjOTIwYWM2NiwgMHg3ZGNlM2FiNCwgMHg2M2RmNGExOCwgMHhlNTFhMzE4MiwKKyAgICAweDk3NTEzMzYwLCAweDYyNTM3ZjQ1LCAweGIxNjQ3N2UwLCAweGJiNmJhZTg0LCAweGZlODFhMDFjLCAweGY5MDgyYjk0LAorICAgIDB4NzA0ODY4NTgsIDB4OGY0NWZkMTksIDB4OTRkZTZjODcsIDB4NTI3YmY4YjcsIDB4YWI3M2QzMjMsIDB4NzI0YjAyZTIsCisgICAgMHhlMzFmOGY1NywgMHg2NjU1YWIyYSwgMHhiMmViMjgwNywgMHgyZmI1YzIwMywgMHg4NmM1N2I5YSwgMHhkMzM3MDhhNSwKKyAgICAweDMwMjg4N2YyLCAweDIzYmZhNWIyLCAweDAyMDM2YWJhLCAweGVkMTY4MjVjLCAweDhhY2YxYzJiLCAweGE3NzliNDkyLAorICAgIDB4ZjMwN2YyZjAsIDB4NGU2OWUyYTEsIDB4NjVkYWY0Y2QsIDB4MDYwNWJlZDUsIDB4ZDEzNDYyMWYsIDB4YzRhNmZlOGEsCisgICAgMHgzNDJlNTM5ZCwgMHhhMmYzNTVhMCwgMHgwNThhZTEzMiwgMHhhNGY2ZWI3NSwgMHgwYjgzZWMzOSwgMHg0MDYwZWZhYSwKKyAgICAweDVlNzE5ZjA2LCAweGJkNmUxMDUxLCAweDNlMjE4YWY5LCAweDk2ZGQwNjNkLCAweGRkM2UwNWFlLCAweDRkZTZiZDQ2LAorICAgIDB4OTE1NDhkYjUsIDB4NzFjNDVkMDUsIDB4MDQwNmQ0NmYsIDB4NjA1MDE1ZmYsIDB4MTk5OGZiMjQsIDB4ZDZiZGU5OTcsCisgICAgMHg4OTQwNDNjYywgMHg2N2Q5OWU3NywgMHhiMGU4NDJiZCwgMHgwNzg5OGI4OCwgMHhlNzE5NWIzOCwgMHg3OWM4ZWVkYiwKKyAgICAweGExN2MwYTQ3LCAweDdjNDIwZmU5LCAweGY4ODQxZWM5LCAweDAwMDAwMDAwLCAweDA5ODA4NjgzLCAweDMyMmJlZDQ4LAorICAgIDB4MWUxMTcwYWMsIDB4NmM1YTcyNGUsIDB4ZmQwZWZmZmIsIDB4MGY4NTM4NTYsIDB4M2RhZWQ1MWUsIDB4MzYyZDM5MjcsCisgICAgMHgwYTBmZDk2NCwgMHg2ODVjYTYyMSwgMHg5YjViNTRkMSwgMHgyNDM2MmUzYSwgMHgwYzBhNjdiMSwgMHg5MzU3ZTcwZiwKKyAgICAweGI0ZWU5NmQyLCAweDFiOWI5MTllLCAweDgwYzBjNTRmLCAweDYxZGMyMGEyLCAweDVhNzc0YjY5LCAweDFjMTIxYTE2LAorICAgIDB4ZTI5M2JhMGEsIDB4YzBhMDJhZTUsIDB4M2MyMmUwNDMsIDB4MTIxYjE3MWQsIDB4MGUwOTBkMGIsIDB4ZjI4YmM3YWQsCisgICAgMHgyZGI2YThiOSwgMHgxNDFlYTljOCwgMHg1N2YxMTk4NSwgMHhhZjc1MDc0YywgMHhlZTk5ZGRiYiwgMHhhMzdmNjBmZCwKKyAgICAweGY3MDEyNjlmLCAweDVjNzJmNWJjLCAweDQ0NjYzYmM1LCAweDViZmI3ZTM0LCAweDhiNDMyOTc2LCAweGNiMjNjNmRjLAorICAgIDB4YjZlZGZjNjgsIDB4YjhlNGYxNjMsIDB4ZDczMWRjY2EsIDB4NDI2Mzg1MTAsIDB4MTM5NzIyNDAsIDB4ODRjNjExMjAsCisgICAgMHg4NTRhMjQ3ZCwgMHhkMmJiM2RmOCwgMHhhZWY5MzIxMSwgMHhjNzI5YTE2ZCwgMHgxZDllMmY0YiwgMHhkY2IyMzBmMywKKyAgICAweDBkODY1MmVjLCAweDc3YzFlM2QwLCAweDJiYjMxNjZjLCAweGE5NzBiOTk5LCAweDExOTQ0OGZhLCAweDQ3ZTk2NDIyLAorICAgIDB4YThmYzhjYzQsIDB4YTBmMDNmMWEsIDB4NTY3ZDJjZDgsIDB4MjIzMzkwZWYsIDB4ODc0OTRlYzcsIDB4ZDkzOGQxYzEsCisgICAgMHg4Y2NhYTJmZSwgMHg5OGQ0MGIzNiwgMHhhNmY1ODFjZiwgMHhhNTdhZGUyOCwgMHhkYWI3OGUyNiwgMHgzZmFkYmZhNCwKKyAgICAweDJjM2E5ZGU0LCAweDUwNzg5MjBkLCAweDZhNWZjYzliLCAweDU0N2U0NjYyLCAweGY2OGQxM2MyLCAweDkwZDhiOGU4LAorICAgIDB4MmUzOWY3NWUsIDB4ODJjM2FmZjUsIDB4OWY1ZDgwYmUsIDB4NjlkMDkzN2MsIDB4NmZkNTJkYTksIDB4Y2YyNTEyYjMsCisgICAgMHhjOGFjOTkzYiwgMHgxMDE4N2RhNywgMHhlODljNjM2ZSwgMHhkYjNiYmI3YiwgMHhjZDI2NzgwOSwgMHg2ZTU5MThmNCwKKyAgICAweGVjOWFiNzAxLCAweDgzNGY5YWE4LCAweGU2OTU2ZTY1LCAweGFhZmZlNjdlLCAweDIxYmNjZjA4LCAweGVmMTVlOGU2LAorICAgIDB4YmFlNzliZDksIDB4NGE2ZjM2Y2UsIDB4ZWE5ZjA5ZDQsIDB4MjliMDdjZDYsIDB4MzFhNGIyYWYsIDB4MmEzZjIzMzEsCisgICAgMHhjNmE1OTQzMCwgMHgzNWEyNjZjMCwgMHg3NDRlYmMzNywgMHhmYzgyY2FhNiwgMHhlMDkwZDBiMCwgMHgzM2E3ZDgxNSwKKyAgICAweGYxMDQ5ODRhLCAweDQxZWNkYWY3LCAweDdmY2Q1MDBlLCAweDE3OTFmNjJmLCAweDc2NGRkNjhkLCAweDQzZWZiMDRkLAorICAgIDB4Y2NhYTRkNTQsIDB4ZTQ5NjA0ZGYsIDB4OWVkMWI1ZTMsIDB4NGM2YTg4MWIsIDB4YzEyYzFmYjgsIDB4NDY2NTUxN2YsCisgICAgMHg5ZDVlZWEwNCwgMHgwMThjMzU1ZCwgMHhmYTg3NzQ3MywgMHhmYjBiNDEyZSwgMHhiMzY3MWQ1YSwgMHg5MmRiZDI1MiwKKyAgICAweGU5MTA1NjMzLCAweDZkZDY0NzEzLCAweDlhZDc2MThjLCAweDM3YTEwYzdhLCAweDU5ZjgxNDhlLCAweGViMTMzYzg5LAorICAgIDB4Y2VhOTI3ZWUsIDB4Yjc2MWM5MzUsIDB4ZTExY2U1ZWQsIDB4N2E0N2IxM2MsIDB4OWNkMmRmNTksIDB4NTVmMjczM2YsCisgICAgMHgxODE0Y2U3OSwgMHg3M2M3MzdiZiwgMHg1M2Y3Y2RlYSwgMHg1ZmZkYWE1YiwgMHhkZjNkNmYxNCwgMHg3ODQ0ZGI4NiwKKyAgICAweGNhYWZmMzgxLCAweGI5NjhjNDNlLCAweDM4MjQzNDJjLCAweGMyYTM0MDVmLCAweDE2MWRjMzcyLCAweGJjZTIyNTBjLAorICAgIDB4MjgzYzQ5OGIsIDB4ZmYwZDk1NDEsIDB4MzlhODAxNzEsIDB4MDgwY2IzZGUsIDB4ZDhiNGU0OWMsIDB4NjQ1NmMxOTAsCiAgICAgMHg3YmNiODQ2MSwgMHhkNTMyYjY3MCwgMHg0ODZjNWM3NCwgMHhkMGI4NTc0MiwKIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEQxWzI1Nl0gPSB7Ci0gICAgMHg1MDUxZjRhNywgMHg1MzdlNDE2NSwgMHhjMzFhMTdhNCwgMHg5NjNhMjc1ZSwKLSAgICAweGNiM2JhYjZiLCAweGYxMWY5ZDQ1LCAweGFiYWNmYTU4LCAweDkzNGJlMzAzLAotICAgIDB4NTUyMDMwZmEsIDB4ZjZhZDc2NmQsIDB4OTE4OGNjNzYsIDB4MjVmNTAyNGMsCi0gICAgMHhmYzRmZTVkNywgMHhkN2M1MmFjYiwgMHg4MDI2MzU0NCwgMHg4ZmI1NjJhMywKLSAgICAweDQ5ZGViMTVhLCAweDY3MjViYTFiLCAweDk4NDVlYTBlLCAweGUxNWRmZWMwLAotICAgIDB4MDJjMzJmNzUsIDB4MTI4MTRjZjAsIDB4YTM4ZDQ2OTcsIDB4YzY2YmQzZjksCi0gICAgMHhlNzAzOGY1ZiwgMHg5NTE1OTI5YywgMHhlYmJmNmQ3YSwgMHhkYTk1NTI1OSwKLSAgICAweDJkZDRiZTgzLCAweGQzNTg3NDIxLCAweDI5NDllMDY5LCAweDQ0OGVjOWM4LAotICAgIDB4NmE3NWMyODksIDB4NzhmNDhlNzksIDB4NmI5OTU4M2UsIDB4ZGQyN2I5NzEsCi0gICAgMHhiNmJlZTE0ZiwgMHgxN2YwODhhZCwgMHg2NmM5MjBhYywgMHhiNDdkY2UzYSwKLSAgICAweDE4NjNkZjRhLCAweDgyZTUxYTMxLCAweDYwOTc1MTMzLCAweDQ1NjI1MzdmLAotICAgIDB4ZTBiMTY0NzcsIDB4ODRiYjZiYWUsIDB4MWNmZTgxYTAsIDB4OTRmOTA4MmIsCi0gICAgMHg1ODcwNDg2OCwgMHgxOThmNDVmZCwgMHg4Nzk0ZGU2YywgMHhiNzUyN2JmOCwKLSAgICAweDIzYWI3M2QzLCAweGUyNzI0YjAyLCAweDU3ZTMxZjhmLCAweDJhNjY1NWFiLAotICAgIDB4MDdiMmViMjgsIDB4MDMyZmI1YzIsIDB4OWE4NmM1N2IsIDB4YTVkMzM3MDgsCi0gICAgMHhmMjMwMjg4NywgMHhiMjIzYmZhNSwgMHhiYTAyMDM2YSwgMHg1Y2VkMTY4MiwKLSAgICAweDJiOGFjZjFjLCAweDkyYTc3OWI0LCAweGYwZjMwN2YyLCAweGExNGU2OWUyLAotICAgIDB4Y2Q2NWRhZjQsIDB4ZDUwNjA1YmUsIDB4MWZkMTM0NjIsIDB4OGFjNGE2ZmUsCi0gICAgMHg5ZDM0MmU1MywgMHhhMGEyZjM1NSwgMHgzMjA1OGFlMSwgMHg3NWE0ZjZlYiwKLSAgICAweDM5MGI4M2VjLCAweGFhNDA2MGVmLCAweDA2NWU3MTlmLCAweDUxYmQ2ZTEwLAotICAgIDB4ZjkzZTIxOGEsIDB4M2Q5NmRkMDYsIDB4YWVkZDNlMDUsIDB4NDY0ZGU2YmQsCi0gICAgMHhiNTkxNTQ4ZCwgMHgwNTcxYzQ1ZCwgMHg2ZjA0MDZkNCwgMHhmZjYwNTAxNSwKLSAgICAweDI0MTk5OGZiLCAweDk3ZDZiZGU5LCAweGNjODk0MDQzLCAweDc3NjdkOTllLAotICAgIDB4YmRiMGU4NDIsIDB4ODgwNzg5OGIsIDB4MzhlNzE5NWIsIDB4ZGI3OWM4ZWUsCi0gICAgMHg0N2ExN2MwYSwgMHhlOTdjNDIwZiwgMHhjOWY4ODQxZSwgMHgwMDAwMDAwMCwKLSAgICAweDgzMDk4MDg2LCAweDQ4MzIyYmVkLCAweGFjMWUxMTcwLCAweDRlNmM1YTcyLAotICAgIDB4ZmJmZDBlZmYsIDB4NTYwZjg1MzgsIDB4MWUzZGFlZDUsIDB4MjczNjJkMzksCi0gICAgMHg2NDBhMGZkOSwgMHgyMTY4NWNhNiwgMHhkMTliNWI1NCwgMHgzYTI0MzYyZSwKLSAgICAweGIxMGMwYTY3LCAweDBmOTM1N2U3LCAweGQyYjRlZTk2LCAweDllMWI5YjkxLAotICAgIDB4NGY4MGMwYzUsIDB4YTI2MWRjMjAsIDB4Njk1YTc3NGIsIDB4MTYxYzEyMWEsCi0gICAgMHgwYWUyOTNiYSwgMHhlNWMwYTAyYSwgMHg0MzNjMjJlMCwgMHgxZDEyMWIxNywKLSAgICAweDBiMGUwOTBkLCAweGFkZjI4YmM3LCAweGI5MmRiNmE4LCAweGM4MTQxZWE5LAotICAgIDB4ODU1N2YxMTksIDB4NGNhZjc1MDcsIDB4YmJlZTk5ZGQsIDB4ZmRhMzdmNjAsCi0gICAgMHg5ZmY3MDEyNiwgMHhiYzVjNzJmNSwgMHhjNTQ0NjYzYiwgMHgzNDViZmI3ZSwKLSAgICAweDc2OGI0MzI5LCAweGRjY2IyM2M2LCAweDY4YjZlZGZjLCAweDYzYjhlNGYxLAotICAgIDB4Y2FkNzMxZGMsIDB4MTA0MjYzODUsIDB4NDAxMzk3MjIsIDB4MjA4NGM2MTEsCi0gICAgMHg3ZDg1NGEyNCwgMHhmOGQyYmIzZCwgMHgxMWFlZjkzMiwgMHg2ZGM3MjlhMSwKLSAgICAweDRiMWQ5ZTJmLCAweGYzZGNiMjMwLCAweGVjMGQ4NjUyLCAweGQwNzdjMWUzLAotICAgIDB4NmMyYmIzMTYsIDB4OTlhOTcwYjksIDB4ZmExMTk0NDgsIDB4MjI0N2U5NjQsCi0gICAgMHhjNGE4ZmM4YywgMHgxYWEwZjAzZiwgMHhkODU2N2QyYywgMHhlZjIyMzM5MCwKLSAgICAweGM3ODc0OTRlLCAweGMxZDkzOGQxLCAweGZlOGNjYWEyLCAweDM2OThkNDBiLAotICAgIDB4Y2ZhNmY1ODEsIDB4MjhhNTdhZGUsIDB4MjZkYWI3OGUsIDB4YTQzZmFkYmYsCi0gICAgMHhlNDJjM2E5ZCwgMHgwZDUwNzg5MiwgMHg5YjZhNWZjYywgMHg2MjU0N2U0NiwKLSAgICAweGMyZjY4ZDEzLCAweGU4OTBkOGI4LCAweDVlMmUzOWY3LCAweGY1ODJjM2FmLAotICAgIDB4YmU5ZjVkODAsIDB4N2M2OWQwOTMsIDB4YTk2ZmQ1MmQsIDB4YjNjZjI1MTIsCi0gICAgMHgzYmM4YWM5OSwgMHhhNzEwMTg3ZCwgMHg2ZWU4OWM2MywgMHg3YmRiM2JiYiwKLSAgICAweDA5Y2QyNjc4LCAweGY0NmU1OTE4LCAweDAxZWM5YWI3LCAweGE4ODM0ZjlhLAotICAgIDB4NjVlNjk1NmUsIDB4N2VhYWZmZTYsIDB4MDgyMWJjY2YsIDB4ZTZlZjE1ZTgsCi0gICAgMHhkOWJhZTc5YiwgMHhjZTRhNmYzNiwgMHhkNGVhOWYwOSwgMHhkNjI5YjA3YywKLSAgICAweGFmMzFhNGIyLCAweDMxMmEzZjIzLCAweDMwYzZhNTk0LCAweGMwMzVhMjY2LAotICAgIDB4Mzc3NDRlYmMsIDB4YTZmYzgyY2EsIDB4YjBlMDkwZDAsIDB4MTUzM2E3ZDgsCi0gICAgMHg0YWYxMDQ5OCwgMHhmNzQxZWNkYSwgMHgwZTdmY2Q1MCwgMHgyZjE3OTFmNiwKLSAgICAweDhkNzY0ZGQ2LCAweDRkNDNlZmIwLCAweDU0Y2NhYTRkLCAweGRmZTQ5NjA0LAotICAgIDB4ZTM5ZWQxYjUsIDB4MWI0YzZhODgsIDB4YjhjMTJjMWYsIDB4N2Y0NjY1NTEsCi0gICAgMHgwNDlkNWVlYSwgMHg1ZDAxOGMzNSwgMHg3M2ZhODc3NCwgMHgyZWZiMGI0MSwKLSAgICAweDVhYjM2NzFkLCAweDUyOTJkYmQyLCAweDMzZTkxMDU2LCAweDEzNmRkNjQ3LAotICAgIDB4OGM5YWQ3NjEsIDB4N2EzN2ExMGMsIDB4OGU1OWY4MTQsIDB4ODllYjEzM2MsCi0gICAgMHhlZWNlYTkyNywgMHgzNWI3NjFjOSwgMHhlZGUxMWNlNSwgMHgzYzdhNDdiMSwKLSAgICAweDU5OWNkMmRmLCAweDNmNTVmMjczLCAweDc5MTgxNGNlLCAweGJmNzNjNzM3LAotICAgIDB4ZWE1M2Y3Y2QsIDB4NWI1ZmZkYWEsIDB4MTRkZjNkNmYsIDB4ODY3ODQ0ZGIsCi0gICAgMHg4MWNhYWZmMywgMHgzZWI5NjhjNCwgMHgyYzM4MjQzNCwgMHg1ZmMyYTM0MCwKLSAgICAweDcyMTYxZGMzLCAweDBjYmNlMjI1LCAweDhiMjgzYzQ5LCAweDQxZmYwZDk1LAotICAgIDB4NzEzOWE4MDEsIDB4ZGUwODBjYjMsIDB4OWNkOGI0ZTQsIDB4OTA2NDU2YzEsCisgICAgMHg1MDUxZjRhNywgMHg1MzdlNDE2NSwgMHhjMzFhMTdhNCwgMHg5NjNhMjc1ZSwgMHhjYjNiYWI2YiwgMHhmMTFmOWQ0NSwKKyAgICAweGFiYWNmYTU4LCAweDkzNGJlMzAzLCAweDU1MjAzMGZhLCAweGY2YWQ3NjZkLCAweDkxODhjYzc2LCAweDI1ZjUwMjRjLAorICAgIDB4ZmM0ZmU1ZDcsIDB4ZDdjNTJhY2IsIDB4ODAyNjM1NDQsIDB4OGZiNTYyYTMsIDB4NDlkZWIxNWEsIDB4NjcyNWJhMWIsCisgICAgMHg5ODQ1ZWEwZSwgMHhlMTVkZmVjMCwgMHgwMmMzMmY3NSwgMHgxMjgxNGNmMCwgMHhhMzhkNDY5NywgMHhjNjZiZDNmOSwKKyAgICAweGU3MDM4ZjVmLCAweDk1MTU5MjljLCAweGViYmY2ZDdhLCAweGRhOTU1MjU5LCAweDJkZDRiZTgzLCAweGQzNTg3NDIxLAorICAgIDB4Mjk0OWUwNjksIDB4NDQ4ZWM5YzgsIDB4NmE3NWMyODksIDB4NzhmNDhlNzksIDB4NmI5OTU4M2UsIDB4ZGQyN2I5NzEsCisgICAgMHhiNmJlZTE0ZiwgMHgxN2YwODhhZCwgMHg2NmM5MjBhYywgMHhiNDdkY2UzYSwgMHgxODYzZGY0YSwgMHg4MmU1MWEzMSwKKyAgICAweDYwOTc1MTMzLCAweDQ1NjI1MzdmLCAweGUwYjE2NDc3LCAweDg0YmI2YmFlLCAweDFjZmU4MWEwLCAweDk0ZjkwODJiLAorICAgIDB4NTg3MDQ4NjgsIDB4MTk4ZjQ1ZmQsIDB4ODc5NGRlNmMsIDB4Yjc1MjdiZjgsIDB4MjNhYjczZDMsIDB4ZTI3MjRiMDIsCisgICAgMHg1N2UzMWY4ZiwgMHgyYTY2NTVhYiwgMHgwN2IyZWIyOCwgMHgwMzJmYjVjMiwgMHg5YTg2YzU3YiwgMHhhNWQzMzcwOCwKKyAgICAweGYyMzAyODg3LCAweGIyMjNiZmE1LCAweGJhMDIwMzZhLCAweDVjZWQxNjgyLCAweDJiOGFjZjFjLCAweDkyYTc3OWI0LAorICAgIDB4ZjBmMzA3ZjIsIDB4YTE0ZTY5ZTIsIDB4Y2Q2NWRhZjQsIDB4ZDUwNjA1YmUsIDB4MWZkMTM0NjIsIDB4OGFjNGE2ZmUsCisgICAgMHg5ZDM0MmU1MywgMHhhMGEyZjM1NSwgMHgzMjA1OGFlMSwgMHg3NWE0ZjZlYiwgMHgzOTBiODNlYywgMHhhYTQwNjBlZiwKKyAgICAweDA2NWU3MTlmLCAweDUxYmQ2ZTEwLCAweGY5M2UyMThhLCAweDNkOTZkZDA2LCAweGFlZGQzZTA1LCAweDQ2NGRlNmJkLAorICAgIDB4YjU5MTU0OGQsIDB4MDU3MWM0NWQsIDB4NmYwNDA2ZDQsIDB4ZmY2MDUwMTUsIDB4MjQxOTk4ZmIsIDB4OTdkNmJkZTksCisgICAgMHhjYzg5NDA0MywgMHg3NzY3ZDk5ZSwgMHhiZGIwZTg0MiwgMHg4ODA3ODk4YiwgMHgzOGU3MTk1YiwgMHhkYjc5YzhlZSwKKyAgICAweDQ3YTE3YzBhLCAweGU5N2M0MjBmLCAweGM5Zjg4NDFlLCAweDAwMDAwMDAwLCAweDgzMDk4MDg2LCAweDQ4MzIyYmVkLAorICAgIDB4YWMxZTExNzAsIDB4NGU2YzVhNzIsIDB4ZmJmZDBlZmYsIDB4NTYwZjg1MzgsIDB4MWUzZGFlZDUsIDB4MjczNjJkMzksCisgICAgMHg2NDBhMGZkOSwgMHgyMTY4NWNhNiwgMHhkMTliNWI1NCwgMHgzYTI0MzYyZSwgMHhiMTBjMGE2NywgMHgwZjkzNTdlNywKKyAgICAweGQyYjRlZTk2LCAweDllMWI5YjkxLCAweDRmODBjMGM1LCAweGEyNjFkYzIwLCAweDY5NWE3NzRiLCAweDE2MWMxMjFhLAorICAgIDB4MGFlMjkzYmEsIDB4ZTVjMGEwMmEsIDB4NDMzYzIyZTAsIDB4MWQxMjFiMTcsIDB4MGIwZTA5MGQsIDB4YWRmMjhiYzcsCisgICAgMHhiOTJkYjZhOCwgMHhjODE0MWVhOSwgMHg4NTU3ZjExOSwgMHg0Y2FmNzUwNywgMHhiYmVlOTlkZCwgMHhmZGEzN2Y2MCwKKyAgICAweDlmZjcwMTI2LCAweGJjNWM3MmY1LCAweGM1NDQ2NjNiLCAweDM0NWJmYjdlLCAweDc2OGI0MzI5LCAweGRjY2IyM2M2LAorICAgIDB4NjhiNmVkZmMsIDB4NjNiOGU0ZjEsIDB4Y2FkNzMxZGMsIDB4MTA0MjYzODUsIDB4NDAxMzk3MjIsIDB4MjA4NGM2MTEsCisgICAgMHg3ZDg1NGEyNCwgMHhmOGQyYmIzZCwgMHgxMWFlZjkzMiwgMHg2ZGM3MjlhMSwgMHg0YjFkOWUyZiwgMHhmM2RjYjIzMCwKKyAgICAweGVjMGQ4NjUyLCAweGQwNzdjMWUzLCAweDZjMmJiMzE2LCAweDk5YTk3MGI5LCAweGZhMTE5NDQ4LCAweDIyNDdlOTY0LAorICAgIDB4YzRhOGZjOGMsIDB4MWFhMGYwM2YsIDB4ZDg1NjdkMmMsIDB4ZWYyMjMzOTAsIDB4Yzc4NzQ5NGUsIDB4YzFkOTM4ZDEsCisgICAgMHhmZThjY2FhMiwgMHgzNjk4ZDQwYiwgMHhjZmE2ZjU4MSwgMHgyOGE1N2FkZSwgMHgyNmRhYjc4ZSwgMHhhNDNmYWRiZiwKKyAgICAweGU0MmMzYTlkLCAweDBkNTA3ODkyLCAweDliNmE1ZmNjLCAweDYyNTQ3ZTQ2LCAweGMyZjY4ZDEzLCAweGU4OTBkOGI4LAorICAgIDB4NWUyZTM5ZjcsIDB4ZjU4MmMzYWYsIDB4YmU5ZjVkODAsIDB4N2M2OWQwOTMsIDB4YTk2ZmQ1MmQsIDB4YjNjZjI1MTIsCisgICAgMHgzYmM4YWM5OSwgMHhhNzEwMTg3ZCwgMHg2ZWU4OWM2MywgMHg3YmRiM2JiYiwgMHgwOWNkMjY3OCwgMHhmNDZlNTkxOCwKKyAgICAweDAxZWM5YWI3LCAweGE4ODM0ZjlhLCAweDY1ZTY5NTZlLCAweDdlYWFmZmU2LCAweDA4MjFiY2NmLCAweGU2ZWYxNWU4LAorICAgIDB4ZDliYWU3OWIsIDB4Y2U0YTZmMzYsIDB4ZDRlYTlmMDksIDB4ZDYyOWIwN2MsIDB4YWYzMWE0YjIsIDB4MzEyYTNmMjMsCisgICAgMHgzMGM2YTU5NCwgMHhjMDM1YTI2NiwgMHgzNzc0NGViYywgMHhhNmZjODJjYSwgMHhiMGUwOTBkMCwgMHgxNTMzYTdkOCwKKyAgICAweDRhZjEwNDk4LCAweGY3NDFlY2RhLCAweDBlN2ZjZDUwLCAweDJmMTc5MWY2LCAweDhkNzY0ZGQ2LCAweDRkNDNlZmIwLAorICAgIDB4NTRjY2FhNGQsIDB4ZGZlNDk2MDQsIDB4ZTM5ZWQxYjUsIDB4MWI0YzZhODgsIDB4YjhjMTJjMWYsIDB4N2Y0NjY1NTEsCisgICAgMHgwNDlkNWVlYSwgMHg1ZDAxOGMzNSwgMHg3M2ZhODc3NCwgMHgyZWZiMGI0MSwgMHg1YWIzNjcxZCwgMHg1MjkyZGJkMiwKKyAgICAweDMzZTkxMDU2LCAweDEzNmRkNjQ3LCAweDhjOWFkNzYxLCAweDdhMzdhMTBjLCAweDhlNTlmODE0LCAweDg5ZWIxMzNjLAorICAgIDB4ZWVjZWE5MjcsIDB4MzViNzYxYzksIDB4ZWRlMTFjZTUsIDB4M2M3YTQ3YjEsIDB4NTk5Y2QyZGYsIDB4M2Y1NWYyNzMsCisgICAgMHg3OTE4MTRjZSwgMHhiZjczYzczNywgMHhlYTUzZjdjZCwgMHg1YjVmZmRhYSwgMHgxNGRmM2Q2ZiwgMHg4Njc4NDRkYiwKKyAgICAweDgxY2FhZmYzLCAweDNlYjk2OGM0LCAweDJjMzgyNDM0LCAweDVmYzJhMzQwLCAweDcyMTYxZGMzLCAweDBjYmNlMjI1LAorICAgIDB4OGIyODNjNDksIDB4NDFmZjBkOTUsIDB4NzEzOWE4MDEsIDB4ZGUwODBjYjMsIDB4OWNkOGI0ZTQsIDB4OTA2NDU2YzEsCiAgICAgMHg2MTdiY2I4NCwgMHg3MGQ1MzJiNiwgMHg3NDQ4NmM1YywgMHg0MmQwYjg1NywKIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEQyWzI1Nl0gPSB7Ci0gICAgMHhhNzUwNTFmNCwgMHg2NTUzN2U0MSwgMHhhNGMzMWExNywgMHg1ZTk2M2EyNywKLSAgICAweDZiY2IzYmFiLCAweDQ1ZjExZjlkLCAweDU4YWJhY2ZhLCAweDAzOTM0YmUzLAotICAgIDB4ZmE1NTIwMzAsIDB4NmRmNmFkNzYsIDB4NzY5MTg4Y2MsIDB4NGMyNWY1MDIsCi0gICAgMHhkN2ZjNGZlNSwgMHhjYmQ3YzUyYSwgMHg0NDgwMjYzNSwgMHhhMzhmYjU2MiwKLSAgICAweDVhNDlkZWIxLCAweDFiNjcyNWJhLCAweDBlOTg0NWVhLCAweGMwZTE1ZGZlLAotICAgIDB4NzUwMmMzMmYsIDB4ZjAxMjgxNGMsIDB4OTdhMzhkNDYsIDB4ZjljNjZiZDMsCi0gICAgMHg1ZmU3MDM4ZiwgMHg5Yzk1MTU5MiwgMHg3YWViYmY2ZCwgMHg1OWRhOTU1MiwKLSAgICAweDgzMmRkNGJlLCAweDIxZDM1ODc0LCAweDY5Mjk0OWUwLCAweGM4NDQ4ZWM5LAotICAgIDB4ODk2YTc1YzIsIDB4Nzk3OGY0OGUsIDB4M2U2Yjk5NTgsIDB4NzFkZDI3YjksCi0gICAgMHg0ZmI2YmVlMSwgMHhhZDE3ZjA4OCwgMHhhYzY2YzkyMCwgMHgzYWI0N2RjZSwKLSAgICAweDRhMTg2M2RmLCAweDMxODJlNTFhLCAweDMzNjA5NzUxLCAweDdmNDU2MjUzLAotICAgIDB4NzdlMGIxNjQsIDB4YWU4NGJiNmIsIDB4YTAxY2ZlODEsIDB4MmI5NGY5MDgsCi0gICAgMHg2ODU4NzA0OCwgMHhmZDE5OGY0NSwgMHg2Yzg3OTRkZSwgMHhmOGI3NTI3YiwKLSAgICAweGQzMjNhYjczLCAweDAyZTI3MjRiLCAweDhmNTdlMzFmLCAweGFiMmE2NjU1LAotICAgIDB4MjgwN2IyZWIsIDB4YzIwMzJmYjUsIDB4N2I5YTg2YzUsIDB4MDhhNWQzMzcsCi0gICAgMHg4N2YyMzAyOCwgMHhhNWIyMjNiZiwgMHg2YWJhMDIwMywgMHg4MjVjZWQxNiwKLSAgICAweDFjMmI4YWNmLCAweGI0OTJhNzc5LCAweGYyZjBmMzA3LCAweGUyYTE0ZTY5LAotICAgIDB4ZjRjZDY1ZGEsIDB4YmVkNTA2MDUsIDB4NjIxZmQxMzQsIDB4ZmU4YWM0YTYsCi0gICAgMHg1MzlkMzQyZSwgMHg1NWEwYTJmMywgMHhlMTMyMDU4YSwgMHhlYjc1YTRmNiwKLSAgICAweGVjMzkwYjgzLCAweGVmYWE0MDYwLCAweDlmMDY1ZTcxLCAweDEwNTFiZDZlLAotICAgIDB4OGFmOTNlMjEsIDB4MDYzZDk2ZGQsIDB4MDVhZWRkM2UsIDB4YmQ0NjRkZTYsCi0gICAgMHg4ZGI1OTE1NCwgMHg1ZDA1NzFjNCwgMHhkNDZmMDQwNiwgMHgxNWZmNjA1MCwKLSAgICAweGZiMjQxOTk4LCAweGU5OTdkNmJkLCAweDQzY2M4OTQwLCAweDllNzc2N2Q5LAotICAgIDB4NDJiZGIwZTgsIDB4OGI4ODA3ODksIDB4NWIzOGU3MTksIDB4ZWVkYjc5YzgsCi0gICAgMHgwYTQ3YTE3YywgMHgwZmU5N2M0MiwgMHgxZWM5Zjg4NCwgMHgwMDAwMDAwMCwKLSAgICAweDg2ODMwOTgwLCAweGVkNDgzMjJiLCAweDcwYWMxZTExLCAweDcyNGU2YzVhLAotICAgIDB4ZmZmYmZkMGUsIDB4Mzg1NjBmODUsIDB4ZDUxZTNkYWUsIDB4MzkyNzM2MmQsCi0gICAgMHhkOTY0MGEwZiwgMHhhNjIxNjg1YywgMHg1NGQxOWI1YiwgMHgyZTNhMjQzNiwKLSAgICAweDY3YjEwYzBhLCAweGU3MGY5MzU3LCAweDk2ZDJiNGVlLCAweDkxOWUxYjliLAotICAgIDB4YzU0ZjgwYzAsIDB4MjBhMjYxZGMsIDB4NGI2OTVhNzcsIDB4MWExNjFjMTIsCi0gICAgMHhiYTBhZTI5MywgMHgyYWU1YzBhMCwgMHhlMDQzM2MyMiwgMHgxNzFkMTIxYiwKLSAgICAweDBkMGIwZTA5LCAweGM3YWRmMjhiLCAweGE4YjkyZGI2LCAweGE5YzgxNDFlLAotICAgIDB4MTk4NTU3ZjEsIDB4MDc0Y2FmNzUsIDB4ZGRiYmVlOTksIDB4NjBmZGEzN2YsCi0gICAgMHgyNjlmZjcwMSwgMHhmNWJjNWM3MiwgMHgzYmM1NDQ2NiwgMHg3ZTM0NWJmYiwKLSAgICAweDI5NzY4YjQzLCAweGM2ZGNjYjIzLCAweGZjNjhiNmVkLCAweGYxNjNiOGU0LAotICAgIDB4ZGNjYWQ3MzEsIDB4ODUxMDQyNjMsIDB4MjI0MDEzOTcsIDB4MTEyMDg0YzYsCi0gICAgMHgyNDdkODU0YSwgMHgzZGY4ZDJiYiwgMHgzMjExYWVmOSwgMHhhMTZkYzcyOSwKLSAgICAweDJmNGIxZDllLCAweDMwZjNkY2IyLCAweDUyZWMwZDg2LCAweGUzZDA3N2MxLAotICAgIDB4MTY2YzJiYjMsIDB4Yjk5OWE5NzAsIDB4NDhmYTExOTQsIDB4NjQyMjQ3ZTksCi0gICAgMHg4Y2M0YThmYywgMHgzZjFhYTBmMCwgMHgyY2Q4NTY3ZCwgMHg5MGVmMjIzMywKLSAgICAweDRlYzc4NzQ5LCAweGQxYzFkOTM4LCAweGEyZmU4Y2NhLCAweDBiMzY5OGQ0LAotICAgIDB4ODFjZmE2ZjUsIDB4ZGUyOGE1N2EsIDB4OGUyNmRhYjcsIDB4YmZhNDNmYWQsCi0gICAgMHg5ZGU0MmMzYSwgMHg5MjBkNTA3OCwgMHhjYzliNmE1ZiwgMHg0NjYyNTQ3ZSwKLSAgICAweDEzYzJmNjhkLCAweGI4ZTg5MGQ4LCAweGY3NWUyZTM5LCAweGFmZjU4MmMzLAotICAgIDB4ODBiZTlmNWQsIDB4OTM3YzY5ZDAsIDB4MmRhOTZmZDUsIDB4MTJiM2NmMjUsCi0gICAgMHg5OTNiYzhhYywgMHg3ZGE3MTAxOCwgMHg2MzZlZTg5YywgMHhiYjdiZGIzYiwKLSAgICAweDc4MDljZDI2LCAweDE4ZjQ2ZTU5LCAweGI3MDFlYzlhLCAweDlhYTg4MzRmLAotICAgIDB4NmU2NWU2OTUsIDB4ZTY3ZWFhZmYsIDB4Y2YwODIxYmMsIDB4ZThlNmVmMTUsCi0gICAgMHg5YmQ5YmFlNywgMHgzNmNlNGE2ZiwgMHgwOWQ0ZWE5ZiwgMHg3Y2Q2MjliMCwKLSAgICAweGIyYWYzMWE0LCAweDIzMzEyYTNmLCAweDk0MzBjNmE1LCAweDY2YzAzNWEyLAotICAgIDB4YmMzNzc0NGUsIDB4Y2FhNmZjODIsIDB4ZDBiMGUwOTAsIDB4ZDgxNTMzYTcsCi0gICAgMHg5ODRhZjEwNCwgMHhkYWY3NDFlYywgMHg1MDBlN2ZjZCwgMHhmNjJmMTc5MSwKLSAgICAweGQ2OGQ3NjRkLCAweGIwNGQ0M2VmLCAweDRkNTRjY2FhLCAweDA0ZGZlNDk2LAotICAgIDB4YjVlMzllZDEsIDB4ODgxYjRjNmEsIDB4MWZiOGMxMmMsIDB4NTE3ZjQ2NjUsCi0gICAgMHhlYTA0OWQ1ZSwgMHgzNTVkMDE4YywgMHg3NDczZmE4NywgMHg0MTJlZmIwYiwKLSAgICAweDFkNWFiMzY3LCAweGQyNTI5MmRiLCAweDU2MzNlOTEwLCAweDQ3MTM2ZGQ2LAotICAgIDB4NjE4YzlhZDcsIDB4MGM3YTM3YTEsIDB4MTQ4ZTU5ZjgsIDB4M2M4OWViMTMsCi0gICAgMHgyN2VlY2VhOSwgMHhjOTM1Yjc2MSwgMHhlNWVkZTExYywgMHhiMTNjN2E0NywKLSAgICAweGRmNTk5Y2QyLCAweDczM2Y1NWYyLCAweGNlNzkxODE0LCAweDM3YmY3M2M3LAotICAgIDB4Y2RlYTUzZjcsIDB4YWE1YjVmZmQsIDB4NmYxNGRmM2QsIDB4ZGI4Njc4NDQsCi0gICAgMHhmMzgxY2FhZiwgMHhjNDNlYjk2OCwgMHgzNDJjMzgyNCwgMHg0MDVmYzJhMywKLSAgICAweGMzNzIxNjFkLCAweDI1MGNiY2UyLCAweDQ5OGIyODNjLCAweDk1NDFmZjBkLAotICAgIDB4MDE3MTM5YTgsIDB4YjNkZTA4MGMsIDB4ZTQ5Y2Q4YjQsIDB4YzE5MDY0NTYsCisgICAgMHhhNzUwNTFmNCwgMHg2NTUzN2U0MSwgMHhhNGMzMWExNywgMHg1ZTk2M2EyNywgMHg2YmNiM2JhYiwgMHg0NWYxMWY5ZCwKKyAgICAweDU4YWJhY2ZhLCAweDAzOTM0YmUzLCAweGZhNTUyMDMwLCAweDZkZjZhZDc2LCAweDc2OTE4OGNjLCAweDRjMjVmNTAyLAorICAgIDB4ZDdmYzRmZTUsIDB4Y2JkN2M1MmEsIDB4NDQ4MDI2MzUsIDB4YTM4ZmI1NjIsIDB4NWE0OWRlYjEsIDB4MWI2NzI1YmEsCisgICAgMHgwZTk4NDVlYSwgMHhjMGUxNWRmZSwgMHg3NTAyYzMyZiwgMHhmMDEyODE0YywgMHg5N2EzOGQ0NiwgMHhmOWM2NmJkMywKKyAgICAweDVmZTcwMzhmLCAweDljOTUxNTkyLCAweDdhZWJiZjZkLCAweDU5ZGE5NTUyLCAweDgzMmRkNGJlLCAweDIxZDM1ODc0LAorICAgIDB4NjkyOTQ5ZTAsIDB4Yzg0NDhlYzksIDB4ODk2YTc1YzIsIDB4Nzk3OGY0OGUsIDB4M2U2Yjk5NTgsIDB4NzFkZDI3YjksCisgICAgMHg0ZmI2YmVlMSwgMHhhZDE3ZjA4OCwgMHhhYzY2YzkyMCwgMHgzYWI0N2RjZSwgMHg0YTE4NjNkZiwgMHgzMTgyZTUxYSwKKyAgICAweDMzNjA5NzUxLCAweDdmNDU2MjUzLCAweDc3ZTBiMTY0LCAweGFlODRiYjZiLCAweGEwMWNmZTgxLCAweDJiOTRmOTA4LAorICAgIDB4Njg1ODcwNDgsIDB4ZmQxOThmNDUsIDB4NmM4Nzk0ZGUsIDB4ZjhiNzUyN2IsIDB4ZDMyM2FiNzMsIDB4MDJlMjcyNGIsCisgICAgMHg4ZjU3ZTMxZiwgMHhhYjJhNjY1NSwgMHgyODA3YjJlYiwgMHhjMjAzMmZiNSwgMHg3YjlhODZjNSwgMHgwOGE1ZDMzNywKKyAgICAweDg3ZjIzMDI4LCAweGE1YjIyM2JmLCAweDZhYmEwMjAzLCAweDgyNWNlZDE2LCAweDFjMmI4YWNmLCAweGI0OTJhNzc5LAorICAgIDB4ZjJmMGYzMDcsIDB4ZTJhMTRlNjksIDB4ZjRjZDY1ZGEsIDB4YmVkNTA2MDUsIDB4NjIxZmQxMzQsIDB4ZmU4YWM0YTYsCisgICAgMHg1MzlkMzQyZSwgMHg1NWEwYTJmMywgMHhlMTMyMDU4YSwgMHhlYjc1YTRmNiwgMHhlYzM5MGI4MywgMHhlZmFhNDA2MCwKKyAgICAweDlmMDY1ZTcxLCAweDEwNTFiZDZlLCAweDhhZjkzZTIxLCAweDA2M2Q5NmRkLCAweDA1YWVkZDNlLCAweGJkNDY0ZGU2LAorICAgIDB4OGRiNTkxNTQsIDB4NWQwNTcxYzQsIDB4ZDQ2ZjA0MDYsIDB4MTVmZjYwNTAsIDB4ZmIyNDE5OTgsIDB4ZTk5N2Q2YmQsCisgICAgMHg0M2NjODk0MCwgMHg5ZTc3NjdkOSwgMHg0MmJkYjBlOCwgMHg4Yjg4MDc4OSwgMHg1YjM4ZTcxOSwgMHhlZWRiNzljOCwKKyAgICAweDBhNDdhMTdjLCAweDBmZTk3YzQyLCAweDFlYzlmODg0LCAweDAwMDAwMDAwLCAweDg2ODMwOTgwLCAweGVkNDgzMjJiLAorICAgIDB4NzBhYzFlMTEsIDB4NzI0ZTZjNWEsIDB4ZmZmYmZkMGUsIDB4Mzg1NjBmODUsIDB4ZDUxZTNkYWUsIDB4MzkyNzM2MmQsCisgICAgMHhkOTY0MGEwZiwgMHhhNjIxNjg1YywgMHg1NGQxOWI1YiwgMHgyZTNhMjQzNiwgMHg2N2IxMGMwYSwgMHhlNzBmOTM1NywKKyAgICAweDk2ZDJiNGVlLCAweDkxOWUxYjliLCAweGM1NGY4MGMwLCAweDIwYTI2MWRjLCAweDRiNjk1YTc3LCAweDFhMTYxYzEyLAorICAgIDB4YmEwYWUyOTMsIDB4MmFlNWMwYTAsIDB4ZTA0MzNjMjIsIDB4MTcxZDEyMWIsIDB4MGQwYjBlMDksIDB4YzdhZGYyOGIsCisgICAgMHhhOGI5MmRiNiwgMHhhOWM4MTQxZSwgMHgxOTg1NTdmMSwgMHgwNzRjYWY3NSwgMHhkZGJiZWU5OSwgMHg2MGZkYTM3ZiwKKyAgICAweDI2OWZmNzAxLCAweGY1YmM1YzcyLCAweDNiYzU0NDY2LCAweDdlMzQ1YmZiLCAweDI5NzY4YjQzLCAweGM2ZGNjYjIzLAorICAgIDB4ZmM2OGI2ZWQsIDB4ZjE2M2I4ZTQsIDB4ZGNjYWQ3MzEsIDB4ODUxMDQyNjMsIDB4MjI0MDEzOTcsIDB4MTEyMDg0YzYsCisgICAgMHgyNDdkODU0YSwgMHgzZGY4ZDJiYiwgMHgzMjExYWVmOSwgMHhhMTZkYzcyOSwgMHgyZjRiMWQ5ZSwgMHgzMGYzZGNiMiwKKyAgICAweDUyZWMwZDg2LCAweGUzZDA3N2MxLCAweDE2NmMyYmIzLCAweGI5OTlhOTcwLCAweDQ4ZmExMTk0LCAweDY0MjI0N2U5LAorICAgIDB4OGNjNGE4ZmMsIDB4M2YxYWEwZjAsIDB4MmNkODU2N2QsIDB4OTBlZjIyMzMsIDB4NGVjNzg3NDksIDB4ZDFjMWQ5MzgsCisgICAgMHhhMmZlOGNjYSwgMHgwYjM2OThkNCwgMHg4MWNmYTZmNSwgMHhkZTI4YTU3YSwgMHg4ZTI2ZGFiNywgMHhiZmE0M2ZhZCwKKyAgICAweDlkZTQyYzNhLCAweDkyMGQ1MDc4LCAweGNjOWI2YTVmLCAweDQ2NjI1NDdlLCAweDEzYzJmNjhkLCAweGI4ZTg5MGQ4LAorICAgIDB4Zjc1ZTJlMzksIDB4YWZmNTgyYzMsIDB4ODBiZTlmNWQsIDB4OTM3YzY5ZDAsIDB4MmRhOTZmZDUsIDB4MTJiM2NmMjUsCisgICAgMHg5OTNiYzhhYywgMHg3ZGE3MTAxOCwgMHg2MzZlZTg5YywgMHhiYjdiZGIzYiwgMHg3ODA5Y2QyNiwgMHgxOGY0NmU1OSwKKyAgICAweGI3MDFlYzlhLCAweDlhYTg4MzRmLCAweDZlNjVlNjk1LCAweGU2N2VhYWZmLCAweGNmMDgyMWJjLCAweGU4ZTZlZjE1LAorICAgIDB4OWJkOWJhZTcsIDB4MzZjZTRhNmYsIDB4MDlkNGVhOWYsIDB4N2NkNjI5YjAsIDB4YjJhZjMxYTQsIDB4MjMzMTJhM2YsCisgICAgMHg5NDMwYzZhNSwgMHg2NmMwMzVhMiwgMHhiYzM3NzQ0ZSwgMHhjYWE2ZmM4MiwgMHhkMGIwZTA5MCwgMHhkODE1MzNhNywKKyAgICAweDk4NGFmMTA0LCAweGRhZjc0MWVjLCAweDUwMGU3ZmNkLCAweGY2MmYxNzkxLCAweGQ2OGQ3NjRkLCAweGIwNGQ0M2VmLAorICAgIDB4NGQ1NGNjYWEsIDB4MDRkZmU0OTYsIDB4YjVlMzllZDEsIDB4ODgxYjRjNmEsIDB4MWZiOGMxMmMsIDB4NTE3ZjQ2NjUsCisgICAgMHhlYTA0OWQ1ZSwgMHgzNTVkMDE4YywgMHg3NDczZmE4NywgMHg0MTJlZmIwYiwgMHgxZDVhYjM2NywgMHhkMjUyOTJkYiwKKyAgICAweDU2MzNlOTEwLCAweDQ3MTM2ZGQ2LCAweDYxOGM5YWQ3LCAweDBjN2EzN2ExLCAweDE0OGU1OWY4LCAweDNjODllYjEzLAorICAgIDB4MjdlZWNlYTksIDB4YzkzNWI3NjEsIDB4ZTVlZGUxMWMsIDB4YjEzYzdhNDcsIDB4ZGY1OTljZDIsIDB4NzMzZjU1ZjIsCisgICAgMHhjZTc5MTgxNCwgMHgzN2JmNzNjNywgMHhjZGVhNTNmNywgMHhhYTViNWZmZCwgMHg2ZjE0ZGYzZCwgMHhkYjg2Nzg0NCwKKyAgICAweGYzODFjYWFmLCAweGM0M2ViOTY4LCAweDM0MmMzODI0LCAweDQwNWZjMmEzLCAweGMzNzIxNjFkLCAweDI1MGNiY2UyLAorICAgIDB4NDk4YjI4M2MsIDB4OTU0MWZmMGQsIDB4MDE3MTM5YTgsIDB4YjNkZTA4MGMsIDB4ZTQ5Y2Q4YjQsIDB4YzE5MDY0NTYsCiAgICAgMHg4NDYxN2JjYiwgMHhiNjcwZDUzMiwgMHg1Yzc0NDg2YywgMHg1NzQyZDBiOCwKIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEQzWzI1Nl0gPSB7Ci0gICAgMHhmNGE3NTA1MSwgMHg0MTY1NTM3ZSwgMHgxN2E0YzMxYSwgMHgyNzVlOTYzYSwKLSAgICAweGFiNmJjYjNiLCAweDlkNDVmMTFmLCAweGZhNThhYmFjLCAweGUzMDM5MzRiLAotICAgIDB4MzBmYTU1MjAsIDB4NzY2ZGY2YWQsIDB4Y2M3NjkxODgsIDB4MDI0YzI1ZjUsCi0gICAgMHhlNWQ3ZmM0ZiwgMHgyYWNiZDdjNSwgMHgzNTQ0ODAyNiwgMHg2MmEzOGZiNSwKLSAgICAweGIxNWE0OWRlLCAweGJhMWI2NzI1LCAweGVhMGU5ODQ1LCAweGZlYzBlMTVkLAotICAgIDB4MmY3NTAyYzMsIDB4NGNmMDEyODEsIDB4NDY5N2EzOGQsIDB4ZDNmOWM2NmIsCi0gICAgMHg4ZjVmZTcwMywgMHg5MjljOTUxNSwgMHg2ZDdhZWJiZiwgMHg1MjU5ZGE5NSwKLSAgICAweGJlODMyZGQ0LCAweDc0MjFkMzU4LCAweGUwNjkyOTQ5LCAweGM5Yzg0NDhlLAotICAgIDB4YzI4OTZhNzUsIDB4OGU3OTc4ZjQsIDB4NTgzZTZiOTksIDB4Yjk3MWRkMjcsCi0gICAgMHhlMTRmYjZiZSwgMHg4OGFkMTdmMCwgMHgyMGFjNjZjOSwgMHhjZTNhYjQ3ZCwKLSAgICAweGRmNGExODYzLCAweDFhMzE4MmU1LCAweDUxMzM2MDk3LCAweDUzN2Y0NTYyLAotICAgIDB4NjQ3N2UwYjEsIDB4NmJhZTg0YmIsIDB4ODFhMDFjZmUsIDB4MDgyYjk0ZjksCi0gICAgMHg0ODY4NTg3MCwgMHg0NWZkMTk4ZiwgMHhkZTZjODc5NCwgMHg3YmY4Yjc1MiwKLSAgICAweDczZDMyM2FiLCAweDRiMDJlMjcyLCAweDFmOGY1N2UzLCAweDU1YWIyYTY2LAotICAgIDB4ZWIyODA3YjIsIDB4YjVjMjAzMmYsIDB4YzU3YjlhODYsIDB4MzcwOGE1ZDMsCi0gICAgMHgyODg3ZjIzMCwgMHhiZmE1YjIyMywgMHgwMzZhYmEwMiwgMHgxNjgyNWNlZCwKLSAgICAweGNmMWMyYjhhLCAweDc5YjQ5MmE3LCAweDA3ZjJmMGYzLCAweDY5ZTJhMTRlLAotICAgIDB4ZGFmNGNkNjUsIDB4MDViZWQ1MDYsIDB4MzQ2MjFmZDEsIDB4YTZmZThhYzQsCi0gICAgMHgyZTUzOWQzNCwgMHhmMzU1YTBhMiwgMHg4YWUxMzIwNSwgMHhmNmViNzVhNCwKLSAgICAweDgzZWMzOTBiLCAweDYwZWZhYTQwLCAweDcxOWYwNjVlLCAweDZlMTA1MWJkLAotICAgIDB4MjE4YWY5M2UsIDB4ZGQwNjNkOTYsIDB4M2UwNWFlZGQsIDB4ZTZiZDQ2NGQsCi0gICAgMHg1NDhkYjU5MSwgMHhjNDVkMDU3MSwgMHgwNmQ0NmYwNCwgMHg1MDE1ZmY2MCwKLSAgICAweDk4ZmIyNDE5LCAweGJkZTk5N2Q2LCAweDQwNDNjYzg5LCAweGQ5OWU3NzY3LAotICAgIDB4ZTg0MmJkYjAsIDB4ODk4Yjg4MDcsIDB4MTk1YjM4ZTcsIDB4YzhlZWRiNzksCi0gICAgMHg3YzBhNDdhMSwgMHg0MjBmZTk3YywgMHg4NDFlYzlmOCwgMHgwMDAwMDAwMCwKLSAgICAweDgwODY4MzA5LCAweDJiZWQ0ODMyLCAweDExNzBhYzFlLCAweDVhNzI0ZTZjLAotICAgIDB4MGVmZmZiZmQsIDB4ODUzODU2MGYsIDB4YWVkNTFlM2QsIDB4MmQzOTI3MzYsCi0gICAgMHgwZmQ5NjQwYSwgMHg1Y2E2MjE2OCwgMHg1YjU0ZDE5YiwgMHgzNjJlM2EyNCwKLSAgICAweDBhNjdiMTBjLCAweDU3ZTcwZjkzLCAweGVlOTZkMmI0LCAweDliOTE5ZTFiLAotICAgIDB4YzBjNTRmODAsIDB4ZGMyMGEyNjEsIDB4Nzc0YjY5NWEsIDB4MTIxYTE2MWMsCi0gICAgMHg5M2JhMGFlMiwgMHhhMDJhZTVjMCwgMHgyMmUwNDMzYywgMHgxYjE3MWQxMiwKLSAgICAweDA5MGQwYjBlLCAweDhiYzdhZGYyLCAweGI2YThiOTJkLCAweDFlYTljODE0LAotICAgIDB4ZjExOTg1NTcsIDB4NzUwNzRjYWYsIDB4OTlkZGJiZWUsIDB4N2Y2MGZkYTMsCi0gICAgMHgwMTI2OWZmNywgMHg3MmY1YmM1YywgMHg2NjNiYzU0NCwgMHhmYjdlMzQ1YiwKLSAgICAweDQzMjk3NjhiLCAweDIzYzZkY2NiLCAweGVkZmM2OGI2LCAweGU0ZjE2M2I4LAotICAgIDB4MzFkY2NhZDcsIDB4NjM4NTEwNDIsIDB4OTcyMjQwMTMsIDB4YzYxMTIwODQsCi0gICAgMHg0YTI0N2Q4NSwgMHhiYjNkZjhkMiwgMHhmOTMyMTFhZSwgMHgyOWExNmRjNywKLSAgICAweDllMmY0YjFkLCAweGIyMzBmM2RjLCAweDg2NTJlYzBkLCAweGMxZTNkMDc3LAotICAgIDB4YjMxNjZjMmIsIDB4NzBiOTk5YTksIDB4OTQ0OGZhMTEsIDB4ZTk2NDIyNDcsCi0gICAgMHhmYzhjYzRhOCwgMHhmMDNmMWFhMCwgMHg3ZDJjZDg1NiwgMHgzMzkwZWYyMiwKLSAgICAweDQ5NGVjNzg3LCAweDM4ZDFjMWQ5LCAweGNhYTJmZThjLCAweGQ0MGIzNjk4LAotICAgIDB4ZjU4MWNmYTYsIDB4N2FkZTI4YTUsIDB4Yjc4ZTI2ZGEsIDB4YWRiZmE0M2YsCi0gICAgMHgzYTlkZTQyYywgMHg3ODkyMGQ1MCwgMHg1ZmNjOWI2YSwgMHg3ZTQ2NjI1NCwKLSAgICAweDhkMTNjMmY2LCAweGQ4YjhlODkwLCAweDM5Zjc1ZTJlLCAweGMzYWZmNTgyLAotICAgIDB4NWQ4MGJlOWYsIDB4ZDA5MzdjNjksIDB4ZDUyZGE5NmYsIDB4MjUxMmIzY2YsCi0gICAgMHhhYzk5M2JjOCwgMHgxODdkYTcxMCwgMHg5YzYzNmVlOCwgMHgzYmJiN2JkYiwKLSAgICAweDI2NzgwOWNkLCAweDU5MThmNDZlLCAweDlhYjcwMWVjLCAweDRmOWFhODgzLAotICAgIDB4OTU2ZTY1ZTYsIDB4ZmZlNjdlYWEsIDB4YmNjZjA4MjEsIDB4MTVlOGU2ZWYsCi0gICAgMHhlNzliZDliYSwgMHg2ZjM2Y2U0YSwgMHg5ZjA5ZDRlYSwgMHhiMDdjZDYyOSwKLSAgICAweGE0YjJhZjMxLCAweDNmMjMzMTJhLCAweGE1OTQzMGM2LCAweGEyNjZjMDM1LAotICAgIDB4NGViYzM3NzQsIDB4ODJjYWE2ZmMsIDB4OTBkMGIwZTAsIDB4YTdkODE1MzMsCi0gICAgMHgwNDk4NGFmMSwgMHhlY2RhZjc0MSwgMHhjZDUwMGU3ZiwgMHg5MWY2MmYxNywKLSAgICAweDRkZDY4ZDc2LCAweGVmYjA0ZDQzLCAweGFhNGQ1NGNjLCAweDk2MDRkZmU0LAotICAgIDB4ZDFiNWUzOWUsIDB4NmE4ODFiNGMsIDB4MmMxZmI4YzEsIDB4NjU1MTdmNDYsCi0gICAgMHg1ZWVhMDQ5ZCwgMHg4YzM1NWQwMSwgMHg4Nzc0NzNmYSwgMHgwYjQxMmVmYiwKLSAgICAweDY3MWQ1YWIzLCAweGRiZDI1MjkyLCAweDEwNTYzM2U5LCAweGQ2NDcxMzZkLAotICAgIDB4ZDc2MThjOWEsIDB4YTEwYzdhMzcsIDB4ZjgxNDhlNTksIDB4MTMzYzg5ZWIsCi0gICAgMHhhOTI3ZWVjZSwgMHg2MWM5MzViNywgMHgxY2U1ZWRlMSwgMHg0N2IxM2M3YSwKLSAgICAweGQyZGY1OTljLCAweGYyNzMzZjU1LCAweDE0Y2U3OTE4LCAweGM3MzdiZjczLAotICAgIDB4ZjdjZGVhNTMsIDB4ZmRhYTViNWYsIDB4M2Q2ZjE0ZGYsIDB4NDRkYjg2NzgsCi0gICAgMHhhZmYzODFjYSwgMHg2OGM0M2ViOSwgMHgyNDM0MmMzOCwgMHhhMzQwNWZjMiwKLSAgICAweDFkYzM3MjE2LCAweGUyMjUwY2JjLCAweDNjNDk4YjI4LCAweDBkOTU0MWZmLAotICAgIDB4YTgwMTcxMzksIDB4MGNiM2RlMDgsIDB4YjRlNDljZDgsIDB4NTZjMTkwNjQsCisgICAgMHhmNGE3NTA1MSwgMHg0MTY1NTM3ZSwgMHgxN2E0YzMxYSwgMHgyNzVlOTYzYSwgMHhhYjZiY2IzYiwgMHg5ZDQ1ZjExZiwKKyAgICAweGZhNThhYmFjLCAweGUzMDM5MzRiLCAweDMwZmE1NTIwLCAweDc2NmRmNmFkLCAweGNjNzY5MTg4LCAweDAyNGMyNWY1LAorICAgIDB4ZTVkN2ZjNGYsIDB4MmFjYmQ3YzUsIDB4MzU0NDgwMjYsIDB4NjJhMzhmYjUsIDB4YjE1YTQ5ZGUsIDB4YmExYjY3MjUsCisgICAgMHhlYTBlOTg0NSwgMHhmZWMwZTE1ZCwgMHgyZjc1MDJjMywgMHg0Y2YwMTI4MSwgMHg0Njk3YTM4ZCwgMHhkM2Y5YzY2YiwKKyAgICAweDhmNWZlNzAzLCAweDkyOWM5NTE1LCAweDZkN2FlYmJmLCAweDUyNTlkYTk1LCAweGJlODMyZGQ0LCAweDc0MjFkMzU4LAorICAgIDB4ZTA2OTI5NDksIDB4YzljODQ0OGUsIDB4YzI4OTZhNzUsIDB4OGU3OTc4ZjQsIDB4NTgzZTZiOTksIDB4Yjk3MWRkMjcsCisgICAgMHhlMTRmYjZiZSwgMHg4OGFkMTdmMCwgMHgyMGFjNjZjOSwgMHhjZTNhYjQ3ZCwgMHhkZjRhMTg2MywgMHgxYTMxODJlNSwKKyAgICAweDUxMzM2MDk3LCAweDUzN2Y0NTYyLCAweDY0NzdlMGIxLCAweDZiYWU4NGJiLCAweDgxYTAxY2ZlLCAweDA4MmI5NGY5LAorICAgIDB4NDg2ODU4NzAsIDB4NDVmZDE5OGYsIDB4ZGU2Yzg3OTQsIDB4N2JmOGI3NTIsIDB4NzNkMzIzYWIsIDB4NGIwMmUyNzIsCisgICAgMHgxZjhmNTdlMywgMHg1NWFiMmE2NiwgMHhlYjI4MDdiMiwgMHhiNWMyMDMyZiwgMHhjNTdiOWE4NiwgMHgzNzA4YTVkMywKKyAgICAweDI4ODdmMjMwLCAweGJmYTViMjIzLCAweDAzNmFiYTAyLCAweDE2ODI1Y2VkLCAweGNmMWMyYjhhLCAweDc5YjQ5MmE3LAorICAgIDB4MDdmMmYwZjMsIDB4NjllMmExNGUsIDB4ZGFmNGNkNjUsIDB4MDViZWQ1MDYsIDB4MzQ2MjFmZDEsIDB4YTZmZThhYzQsCisgICAgMHgyZTUzOWQzNCwgMHhmMzU1YTBhMiwgMHg4YWUxMzIwNSwgMHhmNmViNzVhNCwgMHg4M2VjMzkwYiwgMHg2MGVmYWE0MCwKKyAgICAweDcxOWYwNjVlLCAweDZlMTA1MWJkLCAweDIxOGFmOTNlLCAweGRkMDYzZDk2LCAweDNlMDVhZWRkLCAweGU2YmQ0NjRkLAorICAgIDB4NTQ4ZGI1OTEsIDB4YzQ1ZDA1NzEsIDB4MDZkNDZmMDQsIDB4NTAxNWZmNjAsIDB4OThmYjI0MTksIDB4YmRlOTk3ZDYsCisgICAgMHg0MDQzY2M4OSwgMHhkOTllNzc2NywgMHhlODQyYmRiMCwgMHg4OThiODgwNywgMHgxOTViMzhlNywgMHhjOGVlZGI3OSwKKyAgICAweDdjMGE0N2ExLCAweDQyMGZlOTdjLCAweDg0MWVjOWY4LCAweDAwMDAwMDAwLCAweDgwODY4MzA5LCAweDJiZWQ0ODMyLAorICAgIDB4MTE3MGFjMWUsIDB4NWE3MjRlNmMsIDB4MGVmZmZiZmQsIDB4ODUzODU2MGYsIDB4YWVkNTFlM2QsIDB4MmQzOTI3MzYsCisgICAgMHgwZmQ5NjQwYSwgMHg1Y2E2MjE2OCwgMHg1YjU0ZDE5YiwgMHgzNjJlM2EyNCwgMHgwYTY3YjEwYywgMHg1N2U3MGY5MywKKyAgICAweGVlOTZkMmI0LCAweDliOTE5ZTFiLCAweGMwYzU0ZjgwLCAweGRjMjBhMjYxLCAweDc3NGI2OTVhLCAweDEyMWExNjFjLAorICAgIDB4OTNiYTBhZTIsIDB4YTAyYWU1YzAsIDB4MjJlMDQzM2MsIDB4MWIxNzFkMTIsIDB4MDkwZDBiMGUsIDB4OGJjN2FkZjIsCisgICAgMHhiNmE4YjkyZCwgMHgxZWE5YzgxNCwgMHhmMTE5ODU1NywgMHg3NTA3NGNhZiwgMHg5OWRkYmJlZSwgMHg3ZjYwZmRhMywKKyAgICAweDAxMjY5ZmY3LCAweDcyZjViYzVjLCAweDY2M2JjNTQ0LCAweGZiN2UzNDViLCAweDQzMjk3NjhiLCAweDIzYzZkY2NiLAorICAgIDB4ZWRmYzY4YjYsIDB4ZTRmMTYzYjgsIDB4MzFkY2NhZDcsIDB4NjM4NTEwNDIsIDB4OTcyMjQwMTMsIDB4YzYxMTIwODQsCisgICAgMHg0YTI0N2Q4NSwgMHhiYjNkZjhkMiwgMHhmOTMyMTFhZSwgMHgyOWExNmRjNywgMHg5ZTJmNGIxZCwgMHhiMjMwZjNkYywKKyAgICAweDg2NTJlYzBkLCAweGMxZTNkMDc3LCAweGIzMTY2YzJiLCAweDcwYjk5OWE5LCAweDk0NDhmYTExLCAweGU5NjQyMjQ3LAorICAgIDB4ZmM4Y2M0YTgsIDB4ZjAzZjFhYTAsIDB4N2QyY2Q4NTYsIDB4MzM5MGVmMjIsIDB4NDk0ZWM3ODcsIDB4MzhkMWMxZDksCisgICAgMHhjYWEyZmU4YywgMHhkNDBiMzY5OCwgMHhmNTgxY2ZhNiwgMHg3YWRlMjhhNSwgMHhiNzhlMjZkYSwgMHhhZGJmYTQzZiwKKyAgICAweDNhOWRlNDJjLCAweDc4OTIwZDUwLCAweDVmY2M5YjZhLCAweDdlNDY2MjU0LCAweDhkMTNjMmY2LCAweGQ4YjhlODkwLAorICAgIDB4MzlmNzVlMmUsIDB4YzNhZmY1ODIsIDB4NWQ4MGJlOWYsIDB4ZDA5MzdjNjksIDB4ZDUyZGE5NmYsIDB4MjUxMmIzY2YsCisgICAgMHhhYzk5M2JjOCwgMHgxODdkYTcxMCwgMHg5YzYzNmVlOCwgMHgzYmJiN2JkYiwgMHgyNjc4MDljZCwgMHg1OTE4ZjQ2ZSwKKyAgICAweDlhYjcwMWVjLCAweDRmOWFhODgzLCAweDk1NmU2NWU2LCAweGZmZTY3ZWFhLCAweGJjY2YwODIxLCAweDE1ZThlNmVmLAorICAgIDB4ZTc5YmQ5YmEsIDB4NmYzNmNlNGEsIDB4OWYwOWQ0ZWEsIDB4YjA3Y2Q2MjksIDB4YTRiMmFmMzEsIDB4M2YyMzMxMmEsCisgICAgMHhhNTk0MzBjNiwgMHhhMjY2YzAzNSwgMHg0ZWJjMzc3NCwgMHg4MmNhYTZmYywgMHg5MGQwYjBlMCwgMHhhN2Q4MTUzMywKKyAgICAweDA0OTg0YWYxLCAweGVjZGFmNzQxLCAweGNkNTAwZTdmLCAweDkxZjYyZjE3LCAweDRkZDY4ZDc2LCAweGVmYjA0ZDQzLAorICAgIDB4YWE0ZDU0Y2MsIDB4OTYwNGRmZTQsIDB4ZDFiNWUzOWUsIDB4NmE4ODFiNGMsIDB4MmMxZmI4YzEsIDB4NjU1MTdmNDYsCisgICAgMHg1ZWVhMDQ5ZCwgMHg4YzM1NWQwMSwgMHg4Nzc0NzNmYSwgMHgwYjQxMmVmYiwgMHg2NzFkNWFiMywgMHhkYmQyNTI5MiwKKyAgICAweDEwNTYzM2U5LCAweGQ2NDcxMzZkLCAweGQ3NjE4YzlhLCAweGExMGM3YTM3LCAweGY4MTQ4ZTU5LCAweDEzM2M4OWViLAorICAgIDB4YTkyN2VlY2UsIDB4NjFjOTM1YjcsIDB4MWNlNWVkZTEsIDB4NDdiMTNjN2EsIDB4ZDJkZjU5OWMsIDB4ZjI3MzNmNTUsCisgICAgMHgxNGNlNzkxOCwgMHhjNzM3YmY3MywgMHhmN2NkZWE1MywgMHhmZGFhNWI1ZiwgMHgzZDZmMTRkZiwgMHg0NGRiODY3OCwKKyAgICAweGFmZjM4MWNhLCAweDY4YzQzZWI5LCAweDI0MzQyYzM4LCAweGEzNDA1ZmMyLCAweDFkYzM3MjE2LCAweGUyMjUwY2JjLAorICAgIDB4M2M0OThiMjgsIDB4MGQ5NTQxZmYsIDB4YTgwMTcxMzksIDB4MGNiM2RlMDgsIDB4YjRlNDljZDgsIDB4NTZjMTkwNjQsCiAgICAgMHhjYjg0NjE3YiwgMHgzMmI2NzBkNSwgMHg2YzVjNzQ0OCwgMHhiODU3NDJkMCwKIH07Ci0jZGVmaW5lIEFERF9ST1VORF9LRVlfNCAoYmxvY2tbMF1ePSprZXlzY2hlZCsrLCBibG9ja1sxXV49KmtleXNjaGVkKyssIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1syXV49KmtleXNjaGVkKyssIGJsb2NrWzNdXj0qa2V5c2NoZWQrKykKLSNkZWZpbmUgQUREX1JPVU5EX0tFWV82IChibG9ja1swXV49KmtleXNjaGVkKyssIGJsb2NrWzFdXj0qa2V5c2NoZWQrKywgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrWzJdXj0qa2V5c2NoZWQrKywgYmxvY2tbM11ePSprZXlzY2hlZCsrLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbNF1ePSprZXlzY2hlZCsrLCBibG9ja1s1XV49KmtleXNjaGVkKyspCi0jZGVmaW5lIEFERF9ST1VORF9LRVlfOCAoYmxvY2tbMF1ePSprZXlzY2hlZCsrLCBibG9ja1sxXV49KmtleXNjaGVkKyssIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1syXV49KmtleXNjaGVkKyssIGJsb2NrWzNdXj0qa2V5c2NoZWQrKywgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrWzRdXj0qa2V5c2NoZWQrKywgYmxvY2tbNV1ePSprZXlzY2hlZCsrLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbNl1ePSprZXlzY2hlZCsrLCBibG9ja1s3XV49KmtleXNjaGVkKyspCi0jZGVmaW5lIE1PVkVXT1JEKGkpICggYmxvY2tbaV0gPSBuZXdzdGF0ZVtpXSApCisjZGVmaW5lIEFERF9ST1VORF9LRVlfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChibG9ja1swXSBePSAqa2V5c2NoZWQrKywgYmxvY2tbMV0gXj0gKmtleXNjaGVkKyssIGJsb2NrWzJdIF49ICprZXlzY2hlZCsrLCBcCisgICBibG9ja1szXSBePSAqa2V5c2NoZWQrKykKKyNkZWZpbmUgQUREX1JPVU5EX0tFWV82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGJsb2NrWzBdIF49ICprZXlzY2hlZCsrLCBibG9ja1sxXSBePSAqa2V5c2NoZWQrKywgYmxvY2tbMl0gXj0gKmtleXNjaGVkKyssIFwKKyAgIGJsb2NrWzNdIF49ICprZXlzY2hlZCsrLCBibG9ja1s0XSBePSAqa2V5c2NoZWQrKywgYmxvY2tbNV0gXj0gKmtleXNjaGVkKyspCisjZGVmaW5lIEFERF9ST1VORF9LRVlfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChibG9ja1swXSBePSAqa2V5c2NoZWQrKywgYmxvY2tbMV0gXj0gKmtleXNjaGVkKyssIGJsb2NrWzJdIF49ICprZXlzY2hlZCsrLCBcCisgICBibG9ja1szXSBePSAqa2V5c2NoZWQrKywgYmxvY2tbNF0gXj0gKmtleXNjaGVkKyssIGJsb2NrWzVdIF49ICprZXlzY2hlZCsrLCBcCisgICBibG9ja1s2XSBePSAqa2V5c2NoZWQrKywgYmxvY2tbN10gXj0gKmtleXNjaGVkKyspCisjZGVmaW5lIE1PVkVXT1JEKGkpIChibG9ja1tpXSA9IG5ld3N0YXRlW2ldKQogI3VuZGVmIE1BS0VXT1JECi0jZGVmaW5lIE1BS0VXT1JEKGkpICggbmV3c3RhdGVbaV0gPSAoRTBbKGJsb2NrW2ldID4+IDI0KSAmIDB4RkZdIF4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxWyhibG9ja1soaStDMSklTmJdID4+IDE2KSAmIDB4RkZdIF4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUyWyhibG9ja1soaStDMiklTmJdID4+IDgpICYgMHhGRl0gXiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTNbYmxvY2tbKGkrQzMpJU5iXSAmIDB4RkZdKSApCi0jZGVmaW5lIExBU1RXT1JEKGkpICggbmV3c3RhdGVbaV0gPSAoU2JveFsoYmxvY2tbaV0gPj4gMjQpICYgMHhGRl0gPDwgMjQpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNib3hbKGJsb2NrWyhpK0MxKSVOYl0gPj4gMTYpICYgMHhGRl0gPDwgMTYpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNib3hbKGJsb2NrWyhpK0MyKSVOYl0gPj4gIDgpICYgMHhGRl0gPDwgIDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNib3hbKGJsb2NrWyhpK0MzKSVOYl0gICAgICApICYgMHhGRl0gICAgICApICkKLXN0YXRpYyB2b2lkIGFlc19lbmNyeXB0X25iXzQoQUVTQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgaW50ICogYmxvY2spCi17Ci0gICAgaW50IGk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBDMSA9IDEsIEMyID0gMiwgQzMgPSAzLCBOYiA9IDQ7Ci0gICAgdW5zaWduZWQgaW50ICprZXlzY2hlZCA9IGN0eC0+a2V5c2NoZWQ7Ci0gICAgdW5zaWduZWQgaW50IG5ld3N0YXRlWzRdOwotICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPk5yIC0gMTsgaSsrKSB7Ci0gICAgICAgIEFERF9ST1VORF9LRVlfNDsKLSAgICAgICAgTUFLRVdPUkQoMCk7Ci0gICAgICAgIE1BS0VXT1JEKDEpOwotICAgICAgICBNQUtFV09SRCgyKTsKLSAgICAgICAgTUFLRVdPUkQoMyk7Ci0gICAgICAgIE1PVkVXT1JEKDApOwotICAgICAgICBNT1ZFV09SRCgxKTsKLSAgICAgICAgTU9WRVdPUkQoMik7Ci0gICAgICAgIE1PVkVXT1JEKDMpOwotICAgIH0KKyNkZWZpbmUgTUFLRVdPUkQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKG5ld3N0YXRlW2ldID0gKEUwWyhibG9ja1tpXSA+PiAyNCkgJiAweEZGXSBeICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIEUxWyhibG9ja1soaSArIEMxKSAlIE5iXSA+PiAxNikgJiAweEZGXSBeIFwKKyAgICAgICAgICAgICAgICAgIEUyWyhibG9ja1soaSArIEMyKSAlIE5iXSA+PiA4KSAmIDB4RkZdIF4gIFwKKyAgICAgICAgICAgICAgICAgIEUzW2Jsb2NrWyhpICsgQzMpICUgTmJdICYgMHhGRl0pKQorI2RlZmluZSBMQVNUV09SRChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAobmV3c3RhdGVbaV0gPSAoU2JveFsoYmxvY2tbaV0gPj4gMjQpICYgMHhGRl0gPDwgMjQpIHwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAoU2JveFsoYmxvY2tbKGkgKyBDMSkgJSBOYl0gPj4gMTYpICYgMHhGRl0gPDwgMTYpIHwgXAorICAgICAgICAgICAgICAgICAoU2JveFsoYmxvY2tbKGkgKyBDMikgJSBOYl0gPj4gOCkgJiAweEZGXSA8PCA4KSB8ICAgXAorICAgICAgICAgICAgICAgICAoU2JveFsoYmxvY2tbKGkgKyBDMykgJSBOYl0pICYgMHhGRl0pKQorc3RhdGljIHZvaWQgYWVzX2VuY3J5cHRfbmJfNChBRVNDb250ZXh0KiBjdHgsIHVuc2lnbmVkIGludCogYmxvY2spIHsKKyAgaW50IGk7CisgIHN0YXRpYyBjb25zdCBpbnQgQzEgPSAxLCBDMiA9IDIsIEMzID0gMywgTmIgPSA0OworICB1bnNpZ25lZCBpbnQqIGtleXNjaGVkID0gY3R4LT5rZXlzY2hlZDsKKyAgdW5zaWduZWQgaW50IG5ld3N0YXRlWzRdOworICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5OciAtIDE7IGkrKykgewogICAgIEFERF9ST1VORF9LRVlfNDsKLSAgICBMQVNUV09SRCgwKTsKLSAgICBMQVNUV09SRCgxKTsKLSAgICBMQVNUV09SRCgyKTsKLSAgICBMQVNUV09SRCgzKTsKKyAgICBNQUtFV09SRCgwKTsKKyAgICBNQUtFV09SRCgxKTsKKyAgICBNQUtFV09SRCgyKTsKKyAgICBNQUtFV09SRCgzKTsKICAgICBNT1ZFV09SRCgwKTsKICAgICBNT1ZFV09SRCgxKTsKICAgICBNT1ZFV09SRCgyKTsKICAgICBNT1ZFV09SRCgzKTsKLSAgICBBRERfUk9VTkRfS0VZXzQ7CisgIH0KKyAgQUREX1JPVU5EX0tFWV80OworICBMQVNUV09SRCgwKTsKKyAgTEFTVFdPUkQoMSk7CisgIExBU1RXT1JEKDIpOworICBMQVNUV09SRCgzKTsKKyAgTU9WRVdPUkQoMCk7CisgIE1PVkVXT1JEKDEpOworICBNT1ZFV09SRCgyKTsKKyAgTU9WRVdPUkQoMyk7CisgIEFERF9ST1VORF9LRVlfNDsKIH0KLXN0YXRpYyB2b2lkIGFlc19lbmNyeXB0X25iXzYoQUVTQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgaW50ICogYmxvY2spCi17Ci0gICAgaW50IGk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBDMSA9IDEsIEMyID0gMiwgQzMgPSAzLCBOYiA9IDY7Ci0gICAgdW5zaWduZWQgaW50ICprZXlzY2hlZCA9IGN0eC0+a2V5c2NoZWQ7Ci0gICAgdW5zaWduZWQgaW50IG5ld3N0YXRlWzZdOwotICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPk5yIC0gMTsgaSsrKSB7Ci0gICAgICAgIEFERF9ST1VORF9LRVlfNjsKLSAgICAgICAgTUFLRVdPUkQoMCk7Ci0gICAgICAgIE1BS0VXT1JEKDEpOwotICAgICAgICBNQUtFV09SRCgyKTsKLSAgICAgICAgTUFLRVdPUkQoMyk7Ci0gICAgICAgIE1BS0VXT1JEKDQpOwotICAgICAgICBNQUtFV09SRCg1KTsKLSAgICAgICAgTU9WRVdPUkQoMCk7Ci0gICAgICAgIE1PVkVXT1JEKDEpOwotICAgICAgICBNT1ZFV09SRCgyKTsKLSAgICAgICAgTU9WRVdPUkQoMyk7Ci0gICAgICAgIE1PVkVXT1JEKDQpOwotICAgICAgICBNT1ZFV09SRCg1KTsKLSAgICB9CitzdGF0aWMgdm9pZCBhZXNfZW5jcnlwdF9uYl82KEFFU0NvbnRleHQqIGN0eCwgdW5zaWduZWQgaW50KiBibG9jaykgeworICBpbnQgaTsKKyAgc3RhdGljIGNvbnN0IGludCBDMSA9IDEsIEMyID0gMiwgQzMgPSAzLCBOYiA9IDY7CisgIHVuc2lnbmVkIGludCoga2V5c2NoZWQgPSBjdHgtPmtleXNjaGVkOworICB1bnNpZ25lZCBpbnQgbmV3c3RhdGVbNl07CisgIGZvciAoaSA9IDA7IGkgPCBjdHgtPk5yIC0gMTsgaSsrKSB7CiAgICAgQUREX1JPVU5EX0tFWV82OwotICAgIExBU1RXT1JEKDApOwotICAgIExBU1RXT1JEKDEpOwotICAgIExBU1RXT1JEKDIpOwotICAgIExBU1RXT1JEKDMpOwotICAgIExBU1RXT1JEKDQpOwotICAgIExBU1RXT1JEKDUpOworICAgIE1BS0VXT1JEKDApOworICAgIE1BS0VXT1JEKDEpOworICAgIE1BS0VXT1JEKDIpOworICAgIE1BS0VXT1JEKDMpOworICAgIE1BS0VXT1JEKDQpOworICAgIE1BS0VXT1JEKDUpOwogICAgIE1PVkVXT1JEKDApOwogICAgIE1PVkVXT1JEKDEpOwogICAgIE1PVkVXT1JEKDIpOwogICAgIE1PVkVXT1JEKDMpOwogICAgIE1PVkVXT1JEKDQpOwogICAgIE1PVkVXT1JEKDUpOwotICAgIEFERF9ST1VORF9LRVlfNjsKKyAgfQorICBBRERfUk9VTkRfS0VZXzY7CisgIExBU1RXT1JEKDApOworICBMQVNUV09SRCgxKTsKKyAgTEFTVFdPUkQoMik7CisgIExBU1RXT1JEKDMpOworICBMQVNUV09SRCg0KTsKKyAgTEFTVFdPUkQoNSk7CisgIE1PVkVXT1JEKDApOworICBNT1ZFV09SRCgxKTsKKyAgTU9WRVdPUkQoMik7CisgIE1PVkVXT1JEKDMpOworICBNT1ZFV09SRCg0KTsKKyAgTU9WRVdPUkQoNSk7CisgIEFERF9ST1VORF9LRVlfNjsKIH0KLXN0YXRpYyB2b2lkIGFlc19lbmNyeXB0X25iXzgoQUVTQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgaW50ICogYmxvY2spCi17Ci0gICAgaW50IGk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBDMSA9IDEsIEMyID0gMywgQzMgPSA0LCBOYiA9IDg7Ci0gICAgdW5zaWduZWQgaW50ICprZXlzY2hlZCA9IGN0eC0+a2V5c2NoZWQ7Ci0gICAgdW5zaWduZWQgaW50IG5ld3N0YXRlWzhdOwotICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPk5yIC0gMTsgaSsrKSB7Ci0gICAgICAgIEFERF9ST1VORF9LRVlfODsKLSAgICAgICAgTUFLRVdPUkQoMCk7Ci0gICAgICAgIE1BS0VXT1JEKDEpOwotICAgICAgICBNQUtFV09SRCgyKTsKLSAgICAgICAgTUFLRVdPUkQoMyk7Ci0gICAgICAgIE1BS0VXT1JEKDQpOwotICAgICAgICBNQUtFV09SRCg1KTsKLSAgICAgICAgTUFLRVdPUkQoNik7Ci0gICAgICAgIE1BS0VXT1JEKDcpOwotICAgICAgICBNT1ZFV09SRCgwKTsKLSAgICAgICAgTU9WRVdPUkQoMSk7Ci0gICAgICAgIE1PVkVXT1JEKDIpOwotICAgICAgICBNT1ZFV09SRCgzKTsKLSAgICAgICAgTU9WRVdPUkQoNCk7Ci0gICAgICAgIE1PVkVXT1JEKDUpOwotICAgICAgICBNT1ZFV09SRCg2KTsKLSAgICAgICAgTU9WRVdPUkQoNyk7Ci0gICAgfQorc3RhdGljIHZvaWQgYWVzX2VuY3J5cHRfbmJfOChBRVNDb250ZXh0KiBjdHgsIHVuc2lnbmVkIGludCogYmxvY2spIHsKKyAgaW50IGk7CisgIHN0YXRpYyBjb25zdCBpbnQgQzEgPSAxLCBDMiA9IDMsIEMzID0gNCwgTmIgPSA4OworICB1bnNpZ25lZCBpbnQqIGtleXNjaGVkID0gY3R4LT5rZXlzY2hlZDsKKyAgdW5zaWduZWQgaW50IG5ld3N0YXRlWzhdOworICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5OciAtIDE7IGkrKykgewogICAgIEFERF9ST1VORF9LRVlfODsKLSAgICBMQVNUV09SRCgwKTsKLSAgICBMQVNUV09SRCgxKTsKLSAgICBMQVNUV09SRCgyKTsKLSAgICBMQVNUV09SRCgzKTsKLSAgICBMQVNUV09SRCg0KTsKLSAgICBMQVNUV09SRCg1KTsKLSAgICBMQVNUV09SRCg2KTsKLSAgICBMQVNUV09SRCg3KTsKKyAgICBNQUtFV09SRCgwKTsKKyAgICBNQUtFV09SRCgxKTsKKyAgICBNQUtFV09SRCgyKTsKKyAgICBNQUtFV09SRCgzKTsKKyAgICBNQUtFV09SRCg0KTsKKyAgICBNQUtFV09SRCg1KTsKKyAgICBNQUtFV09SRCg2KTsKKyAgICBNQUtFV09SRCg3KTsKICAgICBNT1ZFV09SRCgwKTsKICAgICBNT1ZFV09SRCgxKTsKICAgICBNT1ZFV09SRCgyKTsKQEAgLTc1MSwxMTYgKzU0NSwxMTUgQEAKICAgICBNT1ZFV09SRCg1KTsKICAgICBNT1ZFV09SRCg2KTsKICAgICBNT1ZFV09SRCg3KTsKLSAgICBBRERfUk9VTkRfS0VZXzg7CisgIH0KKyAgQUREX1JPVU5EX0tFWV84OworICBMQVNUV09SRCgwKTsKKyAgTEFTVFdPUkQoMSk7CisgIExBU1RXT1JEKDIpOworICBMQVNUV09SRCgzKTsKKyAgTEFTVFdPUkQoNCk7CisgIExBU1RXT1JEKDUpOworICBMQVNUV09SRCg2KTsKKyAgTEFTVFdPUkQoNyk7CisgIE1PVkVXT1JEKDApOworICBNT1ZFV09SRCgxKTsKKyAgTU9WRVdPUkQoMik7CisgIE1PVkVXT1JEKDMpOworICBNT1ZFV09SRCg0KTsKKyAgTU9WRVdPUkQoNSk7CisgIE1PVkVXT1JEKDYpOworICBNT1ZFV09SRCg3KTsKKyAgQUREX1JPVU5EX0tFWV84OwogfQogI3VuZGVmIE1BS0VXT1JECiAjdW5kZWYgTEFTVFdPUkQKLSNkZWZpbmUgTUFLRVdPUkQoaSkgKCBuZXdzdGF0ZVtpXSA9IChEMFsoYmxvY2tbaV0gPj4gMjQpICYgMHhGRl0gXiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDFbKGJsb2NrWyhpK0MxKSVOYl0gPj4gMTYpICYgMHhGRl0gXiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDJbKGJsb2NrWyhpK0MyKSVOYl0gPj4gOCkgJiAweEZGXSBeIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM1tibG9ja1soaStDMyklTmJdICYgMHhGRl0pICkKLSNkZWZpbmUgTEFTVFdPUkQoaSkgKG5ld3N0YXRlW2ldID0gKFNib3hpbnZbKGJsb2NrW2ldID4+IDI0KSAmIDB4RkZdIDw8IDI0KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNib3hpbnZbKGJsb2NrWyhpK0MxKSVOYl0gPj4gMTYpICYgMHhGRl0gPDwgMTYpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2JveGludlsoYmxvY2tbKGkrQzIpJU5iXSA+PiAgOCkgJiAweEZGXSA8PCAgOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTYm94aW52WyhibG9ja1soaStDMyklTmJdICAgICAgKSAmIDB4RkZdICAgICAgKSApCi1zdGF0aWMgdm9pZCBhZXNfZGVjcnlwdF9uYl80KEFFU0NvbnRleHQgKiBjdHgsIHVuc2lnbmVkIGludCAqIGJsb2NrKQotewotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgQzEgPSA0IC0gMSwgQzIgPSA0IC0gMiwgQzMgPSA0IC0gMywgTmIgPSA0OwotICAgIHVuc2lnbmVkIGludCAqa2V5c2NoZWQgPSBjdHgtPmludmtleXNjaGVkOwotICAgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs0XTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5OciAtIDE7IGkrKykgewotICAgICAgICBBRERfUk9VTkRfS0VZXzQ7Ci0gICAgICAgIE1BS0VXT1JEKDApOwotICAgICAgICBNQUtFV09SRCgxKTsKLSAgICAgICAgTUFLRVdPUkQoMik7Ci0gICAgICAgIE1BS0VXT1JEKDMpOwotICAgICAgICBNT1ZFV09SRCgwKTsKLSAgICAgICAgTU9WRVdPUkQoMSk7Ci0gICAgICAgIE1PVkVXT1JEKDIpOwotICAgICAgICBNT1ZFV09SRCgzKTsKLSAgICB9CisjZGVmaW5lIE1BS0VXT1JEKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChuZXdzdGF0ZVtpXSA9IChEMFsoYmxvY2tbaV0gPj4gMjQpICYgMHhGRl0gXiAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBEMVsoYmxvY2tbKGkgKyBDMSkgJSBOYl0gPj4gMTYpICYgMHhGRl0gXiBcCisgICAgICAgICAgICAgICAgICBEMlsoYmxvY2tbKGkgKyBDMikgJSBOYl0gPj4gOCkgJiAweEZGXSBeICBcCisgICAgICAgICAgICAgICAgICBEM1tibG9ja1soaSArIEMzKSAlIE5iXSAmIDB4RkZdKSkKKyNkZWZpbmUgTEFTVFdPUkQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKG5ld3N0YXRlW2ldID0gKFNib3hpbnZbKGJsb2NrW2ldID4+IDI0KSAmIDB4RkZdIDw8IDI0KSB8ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKFNib3hpbnZbKGJsb2NrWyhpICsgQzEpICUgTmJdID4+IDE2KSAmIDB4RkZdIDw8IDE2KSB8IFwKKyAgICAgICAgICAgICAgICAgKFNib3hpbnZbKGJsb2NrWyhpICsgQzIpICUgTmJdID4+IDgpICYgMHhGRl0gPDwgOCkgfCAgIFwKKyAgICAgICAgICAgICAgICAgKFNib3hpbnZbKGJsb2NrWyhpICsgQzMpICUgTmJdKSAmIDB4RkZdKSkKK3N0YXRpYyB2b2lkIGFlc19kZWNyeXB0X25iXzQoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisgIGludCBpOworICBzdGF0aWMgY29uc3QgaW50IEMxID0gNCAtIDEsIEMyID0gNCAtIDIsIEMzID0gNCAtIDMsIE5iID0gNDsKKyAgdW5zaWduZWQgaW50KiBrZXlzY2hlZCA9IGN0eC0+aW52a2V5c2NoZWQ7CisgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs0XTsKKyAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKICAgICBBRERfUk9VTkRfS0VZXzQ7Ci0gICAgTEFTVFdPUkQoMCk7Ci0gICAgTEFTVFdPUkQoMSk7Ci0gICAgTEFTVFdPUkQoMik7Ci0gICAgTEFTVFdPUkQoMyk7CisgICAgTUFLRVdPUkQoMCk7CisgICAgTUFLRVdPUkQoMSk7CisgICAgTUFLRVdPUkQoMik7CisgICAgTUFLRVdPUkQoMyk7CiAgICAgTU9WRVdPUkQoMCk7CiAgICAgTU9WRVdPUkQoMSk7CiAgICAgTU9WRVdPUkQoMik7CiAgICAgTU9WRVdPUkQoMyk7Ci0gICAgQUREX1JPVU5EX0tFWV80OworICB9CisgIEFERF9ST1VORF9LRVlfNDsKKyAgTEFTVFdPUkQoMCk7CisgIExBU1RXT1JEKDEpOworICBMQVNUV09SRCgyKTsKKyAgTEFTVFdPUkQoMyk7CisgIE1PVkVXT1JEKDApOworICBNT1ZFV09SRCgxKTsKKyAgTU9WRVdPUkQoMik7CisgIE1PVkVXT1JEKDMpOworICBBRERfUk9VTkRfS0VZXzQ7CiB9Ci1zdGF0aWMgdm9pZCBhZXNfZGVjcnlwdF9uYl82KEFFU0NvbnRleHQgKiBjdHgsIHVuc2lnbmVkIGludCAqIGJsb2NrKQotewotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgQzEgPSA2IC0gMSwgQzIgPSA2IC0gMiwgQzMgPSA2IC0gMywgTmIgPSA2OwotICAgIHVuc2lnbmVkIGludCAqa2V5c2NoZWQgPSBjdHgtPmludmtleXNjaGVkOwotICAgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs2XTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5OciAtIDE7IGkrKykgewotICAgICAgICBBRERfUk9VTkRfS0VZXzY7Ci0gICAgICAgIE1BS0VXT1JEKDApOwotICAgICAgICBNQUtFV09SRCgxKTsKLSAgICAgICAgTUFLRVdPUkQoMik7Ci0gICAgICAgIE1BS0VXT1JEKDMpOwotICAgICAgICBNQUtFV09SRCg0KTsKLSAgICAgICAgTUFLRVdPUkQoNSk7Ci0gICAgICAgIE1PVkVXT1JEKDApOwotICAgICAgICBNT1ZFV09SRCgxKTsKLSAgICAgICAgTU9WRVdPUkQoMik7Ci0gICAgICAgIE1PVkVXT1JEKDMpOwotICAgICAgICBNT1ZFV09SRCg0KTsKLSAgICAgICAgTU9WRVdPUkQoNSk7Ci0gICAgfQorc3RhdGljIHZvaWQgYWVzX2RlY3J5cHRfbmJfNihBRVNDb250ZXh0KiBjdHgsIHVuc2lnbmVkIGludCogYmxvY2spIHsKKyAgaW50IGk7CisgIHN0YXRpYyBjb25zdCBpbnQgQzEgPSA2IC0gMSwgQzIgPSA2IC0gMiwgQzMgPSA2IC0gMywgTmIgPSA2OworICB1bnNpZ25lZCBpbnQqIGtleXNjaGVkID0gY3R4LT5pbnZrZXlzY2hlZDsKKyAgdW5zaWduZWQgaW50IG5ld3N0YXRlWzZdOworICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5OciAtIDE7IGkrKykgewogICAgIEFERF9ST1VORF9LRVlfNjsKLSAgICBMQVNUV09SRCgwKTsKLSAgICBMQVNUV09SRCgxKTsKLSAgICBMQVNUV09SRCgyKTsKLSAgICBMQVNUV09SRCgzKTsKLSAgICBMQVNUV09SRCg0KTsKLSAgICBMQVNUV09SRCg1KTsKKyAgICBNQUtFV09SRCgwKTsKKyAgICBNQUtFV09SRCgxKTsKKyAgICBNQUtFV09SRCgyKTsKKyAgICBNQUtFV09SRCgzKTsKKyAgICBNQUtFV09SRCg0KTsKKyAgICBNQUtFV09SRCg1KTsKICAgICBNT1ZFV09SRCgwKTsKICAgICBNT1ZFV09SRCgxKTsKICAgICBNT1ZFV09SRCgyKTsKICAgICBNT1ZFV09SRCgzKTsKICAgICBNT1ZFV09SRCg0KTsKICAgICBNT1ZFV09SRCg1KTsKLSAgICBBRERfUk9VTkRfS0VZXzY7CisgIH0KKyAgQUREX1JPVU5EX0tFWV82OworICBMQVNUV09SRCgwKTsKKyAgTEFTVFdPUkQoMSk7CisgIExBU1RXT1JEKDIpOworICBMQVNUV09SRCgzKTsKKyAgTEFTVFdPUkQoNCk7CisgIExBU1RXT1JEKDUpOworICBNT1ZFV09SRCgwKTsKKyAgTU9WRVdPUkQoMSk7CisgIE1PVkVXT1JEKDIpOworICBNT1ZFV09SRCgzKTsKKyAgTU9WRVdPUkQoNCk7CisgIE1PVkVXT1JEKDUpOworICBBRERfUk9VTkRfS0VZXzY7CiB9Ci1zdGF0aWMgdm9pZCBhZXNfZGVjcnlwdF9uYl84KEFFU0NvbnRleHQgKiBjdHgsIHVuc2lnbmVkIGludCAqIGJsb2NrKQotewotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgQzEgPSA4IC0gMSwgQzIgPSA4IC0gMywgQzMgPSA4IC0gNCwgTmIgPSA4OwotICAgIHVuc2lnbmVkIGludCAqa2V5c2NoZWQgPSBjdHgtPmludmtleXNjaGVkOwotICAgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs4XTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5OciAtIDE7IGkrKykgewotICAgICAgICBBRERfUk9VTkRfS0VZXzg7Ci0gICAgICAgIE1BS0VXT1JEKDApOwotICAgICAgICBNQUtFV09SRCgxKTsKLSAgICAgICAgTUFLRVdPUkQoMik7Ci0gICAgICAgIE1BS0VXT1JEKDMpOwotICAgICAgICBNQUtFV09SRCg0KTsKLSAgICAgICAgTUFLRVdPUkQoNSk7Ci0gICAgICAgIE1BS0VXT1JEKDYpOwotICAgICAgICBNQUtFV09SRCg3KTsKLSAgICAgICAgTU9WRVdPUkQoMCk7Ci0gICAgICAgIE1PVkVXT1JEKDEpOwotICAgICAgICBNT1ZFV09SRCgyKTsKLSAgICAgICAgTU9WRVdPUkQoMyk7Ci0gICAgICAgIE1PVkVXT1JEKDQpOwotICAgICAgICBNT1ZFV09SRCg1KTsKLSAgICAgICAgTU9WRVdPUkQoNik7Ci0gICAgICAgIE1PVkVXT1JEKDcpOwotICAgIH0KK3N0YXRpYyB2b2lkIGFlc19kZWNyeXB0X25iXzgoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisgIGludCBpOworICBzdGF0aWMgY29uc3QgaW50IEMxID0gOCAtIDEsIEMyID0gOCAtIDMsIEMzID0gOCAtIDQsIE5iID0gODsKKyAgdW5zaWduZWQgaW50KiBrZXlzY2hlZCA9IGN0eC0+aW52a2V5c2NoZWQ7CisgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs4XTsKKyAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKICAgICBBRERfUk9VTkRfS0VZXzg7Ci0gICAgTEFTVFdPUkQoMCk7Ci0gICAgTEFTVFdPUkQoMSk7Ci0gICAgTEFTVFdPUkQoMik7Ci0gICAgTEFTVFdPUkQoMyk7Ci0gICAgTEFTVFdPUkQoNCk7Ci0gICAgTEFTVFdPUkQoNSk7Ci0gICAgTEFTVFdPUkQoNik7Ci0gICAgTEFTVFdPUkQoNyk7CisgICAgTUFLRVdPUkQoMCk7CisgICAgTUFLRVdPUkQoMSk7CisgICAgTUFLRVdPUkQoMik7CisgICAgTUFLRVdPUkQoMyk7CisgICAgTUFLRVdPUkQoNCk7CisgICAgTUFLRVdPUkQoNSk7CisgICAgTUFLRVdPUkQoNik7CisgICAgTUFLRVdPUkQoNyk7CiAgICAgTU9WRVdPUkQoMCk7CiAgICAgTU9WRVdPUkQoMSk7CiAgICAgTU9WRVdPUkQoMik7CkBAIC04NjksMTQzICs2NjIsMTcwIEBACiAgICAgTU9WRVdPUkQoNSk7CiAgICAgTU9WRVdPUkQoNik7CiAgICAgTU9WRVdPUkQoNyk7Ci0gICAgQUREX1JPVU5EX0tFWV84OworICB9CisgIEFERF9ST1VORF9LRVlfODsKKyAgTEFTVFdPUkQoMCk7CisgIExBU1RXT1JEKDEpOworICBMQVNUV09SRCgyKTsKKyAgTEFTVFdPUkQoMyk7CisgIExBU1RXT1JEKDQpOworICBMQVNUV09SRCg1KTsKKyAgTEFTVFdPUkQoNik7CisgIExBU1RXT1JEKDcpOworICBNT1ZFV09SRCgwKTsKKyAgTU9WRVdPUkQoMSk7CisgIE1PVkVXT1JEKDIpOworICBNT1ZFV09SRCgzKTsKKyAgTU9WRVdPUkQoNCk7CisgIE1PVkVXT1JEKDUpOworICBNT1ZFV09SRCg2KTsKKyAgTU9WRVdPUkQoNyk7CisgIEFERF9ST1VORF9LRVlfODsKIH0KICN1bmRlZiBNQUtFV09SRAogI3VuZGVmIExBU1RXT1JECi1zdGF0aWMgdm9pZCBhZXNfc2V0dXAoQUVTQ29udGV4dCAqIGN0eCwgaW50IGJsb2NrbGVuLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbikKLXsKLSAgICBpbnQgaSwgaiwgTmssIHJjb25zdDsKLSAgICBBU1NFUlQoYmxvY2tsZW4gPT0gMTYgfHwgYmxvY2tsZW4gPT0gMjQgfHwgYmxvY2tsZW4gPT0gMzIpOwotICAgIEFTU0VSVChrZXlsZW4gPT0gMTYgfHwga2V5bGVuID09IDI0IHx8IGtleWxlbiA9PSAzMik7Ci0gICAgTmsgPSBrZXlsZW4gLyA0OwotICAgIGN0eC0+TmIgPSBibG9ja2xlbiAvIDQ7Ci0gICAgY3R4LT5OciA9IDYgKyAoY3R4LT5OYiA+IE5rID8gY3R4LT5OYiA6IE5rKTsKLSAgICBpZiAoY3R4LT5OYiA9PSA4KSB7Ci0gICAgICAgIGN0eC0+ZW5jcnlwdCA9IGFlc19lbmNyeXB0X25iXzgsIGN0eC0+ZGVjcnlwdCA9IGFlc19kZWNyeXB0X25iXzg7Ci0gICAgfSBlbHNlIGlmIChjdHgtPk5iID09IDYpIHsKLSAgICAgICAgY3R4LT5lbmNyeXB0ID0gYWVzX2VuY3J5cHRfbmJfNiwgY3R4LT5kZWNyeXB0ID0gYWVzX2RlY3J5cHRfbmJfNjsKLSAgICB9IGVsc2UgaWYgKGN0eC0+TmIgPT0gNCkgewotICAgICAgICBjdHgtPmVuY3J5cHQgPSBhZXNfZW5jcnlwdF9uYl80LCBjdHgtPmRlY3J5cHQgPSBhZXNfZGVjcnlwdF9uYl80Oworc3RhdGljIHZvaWQgYWVzX3NldHVwKEFFU0NvbnRleHQqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tsZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlsZW4pIHsKKyAgaW50IGksIGosIE5rLCByY29uc3Q7CisgIEFTU0VSVChibG9ja2xlbiA9PSAxNiB8fCBibG9ja2xlbiA9PSAyNCB8fCBibG9ja2xlbiA9PSAzMik7CisgIEFTU0VSVChrZXlsZW4gPT0gMTYgfHwga2V5bGVuID09IDI0IHx8IGtleWxlbiA9PSAzMik7CisgIE5rID0ga2V5bGVuIC8gNDsKKyAgY3R4LT5OYiA9IGJsb2NrbGVuIC8gNDsKKyAgY3R4LT5OciA9IDYgKyAoY3R4LT5OYiA+IE5rID8gY3R4LT5OYiA6IE5rKTsKKyAgaWYgKGN0eC0+TmIgPT0gOCkgeworICAgIGN0eC0+ZW5jcnlwdCA9IGFlc19lbmNyeXB0X25iXzgsIGN0eC0+ZGVjcnlwdCA9IGFlc19kZWNyeXB0X25iXzg7CisgIH0gZWxzZSBpZiAoY3R4LT5OYiA9PSA2KSB7CisgICAgY3R4LT5lbmNyeXB0ID0gYWVzX2VuY3J5cHRfbmJfNiwgY3R4LT5kZWNyeXB0ID0gYWVzX2RlY3J5cHRfbmJfNjsKKyAgfSBlbHNlIGlmIChjdHgtPk5iID09IDQpIHsKKyAgICBjdHgtPmVuY3J5cHQgPSBhZXNfZW5jcnlwdF9uYl80LCBjdHgtPmRlY3J5cHQgPSBhZXNfZGVjcnlwdF9uYl80OworICB9CisgIHJjb25zdCA9IDE7CisgIGZvciAoaSA9IDA7IGkgPCAoY3R4LT5OciArIDEpICogY3R4LT5OYjsgaSsrKSB7CisgICAgaWYgKGkgPCBOaykgeworICAgICAgY3R4LT5rZXlzY2hlZFtpXSA9IEdFVF8zMkJJVF9NU0JfRklSU1Qoa2V5ICsgNCAqIGkpOworICAgIH0gZWxzZSB7CisgICAgICB1bnNpZ25lZCBpbnQgdGVtcCA9IGN0eC0+a2V5c2NoZWRbaSAtIDFdOworICAgICAgaWYgKGkgJSBOayA9PSAwKSB7CisgICAgICAgIGludCBhLCBiLCBjLCBkOworICAgICAgICBhID0gKHRlbXAgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgYiA9ICh0ZW1wID4+IDgpICYgMHhGRjsKKyAgICAgICAgYyA9ICh0ZW1wID4+IDApICYgMHhGRjsKKyAgICAgICAgZCA9ICh0ZW1wID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHRlbXAgPSBTYm94W2FdIF4gcmNvbnN0OworICAgICAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBTYm94W2JdOworICAgICAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBTYm94W2NdOworICAgICAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBTYm94W2RdOworICAgICAgICByY29uc3QgPSBtdWxieTIocmNvbnN0KTsKKyAgICAgIH0gZWxzZSBpZiAoaSAlIE5rID09IDQgJiYgTmsgPiA2KSB7CisgICAgICAgIGludCBhLCBiLCBjLCBkOworICAgICAgICBhID0gKHRlbXAgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgYiA9ICh0ZW1wID4+IDE2KSAmIDB4RkY7CisgICAgICAgIGMgPSAodGVtcCA+PiA4KSAmIDB4RkY7CisgICAgICAgIGQgPSAodGVtcCA+PiAwKSAmIDB4RkY7CisgICAgICAgIHRlbXAgPSBTYm94W2FdOworICAgICAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBTYm94W2JdOworICAgICAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBTYm94W2NdOworICAgICAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBTYm94W2RdOworICAgICAgfQorICAgICAgY3R4LT5rZXlzY2hlZFtpXSA9IGN0eC0+a2V5c2NoZWRbaSAtIE5rXSBeIHRlbXA7CiAgICAgfQotICAgIHJjb25zdCA9IDE7Ci0gICAgZm9yIChpID0gMDsgaSA8IChjdHgtPk5yICsgMSkgKiBjdHgtPk5iOyBpKyspIHsKLSAgICAgICAgaWYgKGkgPCBOaykgewotICAgICAgICAgICAgY3R4LT5rZXlzY2hlZFtpXSA9IEdFVF8zMkJJVF9NU0JfRklSU1Qoa2V5ICsgNCAqIGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdW5zaWduZWQgaW50IHRlbXAgPSBjdHgtPmtleXNjaGVkW2kgLSAxXTsKLSAgICAgICAgICAgIGlmIChpICUgTmsgPT0gMCkgewotICAgICAgICAgICAgICAgIGludCBhLCBiLCBjLCBkOwotICAgICAgICAgICAgICAgIGEgPSAodGVtcCA+PiAxNikgJiAweEZGOwotICAgICAgICAgICAgICAgIGIgPSAodGVtcCA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgYyA9ICh0ZW1wID4+IDApICYgMHhGRjsKLSAgICAgICAgICAgICAgICBkID0gKHRlbXAgPj4gMjQpICYgMHhGRjsKLSAgICAgICAgICAgICAgICB0ZW1wID0gU2JveFthXSBeIHJjb25zdDsKLSAgICAgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBTYm94W2JdOwotICAgICAgICAgICAgICAgIHRlbXAgPSAodGVtcCA8PCA4KSB8IFNib3hbY107Ci0gICAgICAgICAgICAgICAgdGVtcCA9ICh0ZW1wIDw8IDgpIHwgU2JveFtkXTsKLSAgICAgICAgICAgICAgICByY29uc3QgPSBtdWxieTIocmNvbnN0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaSAlIE5rID09IDQgJiYgTmsgPiA2KSB7Ci0gICAgICAgICAgICAgICAgaW50IGEsIGIsIGMsIGQ7Ci0gICAgICAgICAgICAgICAgYSA9ICh0ZW1wID4+IDI0KSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgYiA9ICh0ZW1wID4+IDE2KSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgYyA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgICAgICBkID0gKHRlbXAgPj4gMCkgJiAweEZGOwotICAgICAgICAgICAgICAgIHRlbXAgPSBTYm94W2FdOwotICAgICAgICAgICAgICAgIHRlbXAgPSAodGVtcCA8PCA4KSB8IFNib3hbYl07Ci0gICAgICAgICAgICAgICAgdGVtcCA9ICh0ZW1wIDw8IDgpIHwgU2JveFtjXTsKLSAgICAgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBTYm94W2RdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3R4LT5rZXlzY2hlZFtpXSA9IGN0eC0+a2V5c2NoZWRbaSAtIE5rXSBeIHRlbXA7Ci0gICAgICAgIH0KKyAgfQorICBmb3IgKGkgPSAwOyBpIDw9IGN0eC0+TnI7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCBjdHgtPk5iOyBqKyspIHsKKyAgICAgIHVuc2lnbmVkIGludCB0ZW1wOworICAgICAgdGVtcCA9IGN0eC0+a2V5c2NoZWRbKGN0eC0+TnIgLSBpKSAqIGN0eC0+TmIgKyBqXTsKKyAgICAgIGlmIChpICE9IDAgJiYgaSAhPSBjdHgtPk5yKSB7CisgICAgICAgIGludCBhLCBiLCBjLCBkOworICAgICAgICBhID0gKHRlbXAgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgYiA9ICh0ZW1wID4+IDE2KSAmIDB4RkY7CisgICAgICAgIGMgPSAodGVtcCA+PiA4KSAmIDB4RkY7CisgICAgICAgIGQgPSAodGVtcCA+PiAwKSAmIDB4RkY7CisgICAgICAgIHRlbXAgPSBEMFtTYm94W2FdXTsKKyAgICAgICAgdGVtcCBePSBEMVtTYm94W2JdXTsKKyAgICAgICAgdGVtcCBePSBEMltTYm94W2NdXTsKKyAgICAgICAgdGVtcCBePSBEM1tTYm94W2RdXTsKKyAgICAgIH0KKyAgICAgIGN0eC0+aW52a2V5c2NoZWRbaSAqIGN0eC0+TmIgKyBqXSA9IHRlbXA7CiAgICAgfQotICAgIGZvciAoaSA9IDA7IGkgPD0gY3R4LT5OcjsgaSsrKSB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBjdHgtPk5iOyBqKyspIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCB0ZW1wOwotICAgICAgICAgICAgdGVtcCA9IGN0eC0+a2V5c2NoZWRbKGN0eC0+TnIgLSBpKSAqIGN0eC0+TmIgKyBqXTsKLSAgICAgICAgICAgIGlmIChpICE9IDAgJiYgaSAhPSBjdHgtPk5yKSB7Ci0gICAgICAgICAgICAgICAgaW50IGEsIGIsIGMsIGQ7Ci0gICAgICAgICAgICAgICAgYSA9ICh0ZW1wID4+IDI0KSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgYiA9ICh0ZW1wID4+IDE2KSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgYyA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgICAgICBkID0gKHRlbXAgPj4gMCkgJiAweEZGOwotICAgICAgICAgICAgICAgIHRlbXAgPSBEMFtTYm94W2FdXTsKLSAgICAgICAgICAgICAgICB0ZW1wIF49IEQxW1Nib3hbYl1dOwotICAgICAgICAgICAgICAgIHRlbXAgXj0gRDJbU2JveFtjXV07Ci0gICAgICAgICAgICAgICAgdGVtcCBePSBEM1tTYm94W2RdXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN0eC0+aW52a2V5c2NoZWRbaSAqIGN0eC0+TmIgKyBqXSA9IHRlbXA7Ci0gICAgICAgIH0KKyAgfQorfQorc3RhdGljIHZvaWQgYWVzX2RlY3J5cHQoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisgIGN0eC0+ZGVjcnlwdChjdHgsIGJsb2NrKTsKK30KK3N0YXRpYyB2b2lkIGFlc19kZWNyeXB0X2NiYyh1bnNpZ25lZCBjaGFyKiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU0NvbnRleHQqIGN0eCkgeworICB1bnNpZ25lZCBpbnQgaXZbNF0sIHhbNF0sIGN0WzRdOworICBpbnQgaTsKKyAgQVNTRVJUKChsZW4gJiAxNSkgPT0gMCk7CisgIEZYU1lTX21lbWNweShpdiwgY3R4LT5pdiwgc2l6ZW9mKGl2KSk7CisgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgeFtpXSA9IGN0W2ldID0gR0VUXzMyQklUX01TQl9GSVJTVChzcmMgKyA0ICogaSk7CiAgICAgfQotfQotc3RhdGljIHZvaWQgYWVzX2RlY3J5cHQoQUVTQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgaW50ICogYmxvY2spCi17Ci0gICAgY3R4LT5kZWNyeXB0KGN0eCwgYmxvY2spOwotfQotc3RhdGljIHZvaWQgYWVzX2RlY3J5cHRfY2JjKHVuc2lnbmVkIGNoYXIgKmRlc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbiwgQUVTQ29udGV4dCAqIGN0eCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaXZbNF0sIHhbNF0sIGN0WzRdOwotICAgIGludCBpOwotICAgIEFTU0VSVCgobGVuICYgMTUpID09IDApOwotICAgIEZYU1lTX21lbWNweShpdiwgY3R4LT5pdiwgc2l6ZW9mKGl2KSk7Ci0gICAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgeFtpXSA9IGN0W2ldID0gR0VUXzMyQklUX01TQl9GSVJTVChzcmMgKyA0ICogaSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWVzX2RlY3J5cHQoY3R4LCB4KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgUFVUXzMyQklUX01TQl9GSVJTVChkZXN0ICsgNCAqIGksIGl2W2ldIF4geFtpXSk7Ci0gICAgICAgICAgICBpdltpXSA9IGN0W2ldOwotICAgICAgICB9Ci0gICAgICAgIGRlc3QgKz0gMTY7Ci0gICAgICAgIHNyYyArPSAxNjsKLSAgICAgICAgbGVuIC09IDE2OworICAgIGFlc19kZWNyeXB0KGN0eCwgeCk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgUFVUXzMyQklUX01TQl9GSVJTVChkZXN0ICsgNCAqIGksIGl2W2ldIF4geFtpXSk7CisgICAgICBpdltpXSA9IGN0W2ldOwogICAgIH0KLSAgICBGWFNZU19tZW1jcHkoY3R4LT5pdiwgaXYsIHNpemVvZihpdikpOworICAgIGRlc3QgKz0gMTY7CisgICAgc3JjICs9IDE2OworICAgIGxlbiAtPSAxNjsKKyAgfQorICBGWFNZU19tZW1jcHkoY3R4LT5pdiwgaXYsIHNpemVvZihpdikpOwogfQotc3RhdGljIHZvaWQgYWVzX2VuY3J5cHQoQUVTQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgaW50ICogYmxvY2spCi17Ci0gICAgY3R4LT5lbmNyeXB0KGN0eCwgYmxvY2spOworc3RhdGljIHZvaWQgYWVzX2VuY3J5cHQoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisgIGN0eC0+ZW5jcnlwdChjdHgsIGJsb2NrKTsKIH0KLXN0YXRpYyB2b2lkIGFlc19lbmNyeXB0X2NiYyh1bnNpZ25lZCBjaGFyICpkZXN0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBsZW4sIEFFU0NvbnRleHQgKiBjdHgpCi17Ci0gICAgdW5zaWduZWQgaW50IGl2WzRdOwotICAgIGludCBpOwotICAgIEFTU0VSVCgobGVuICYgMTUpID09IDApOwotICAgIEZYU1lTX21lbWNweShpdiwgY3R4LT5pdiwgc2l6ZW9mKGl2KSk7Ci0gICAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgaXZbaV0gXj0gR0VUXzMyQklUX01TQl9GSVJTVChzcmMgKyA0ICogaSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWVzX2VuY3J5cHQoY3R4LCBpdik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIFBVVF8zMkJJVF9NU0JfRklSU1QoZGVzdCArIDQgKiBpLCBpdltpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdCArPSAxNjsKLSAgICAgICAgc3JjICs9IDE2OwotICAgICAgICBsZW4gLT0gMTY7CitzdGF0aWMgdm9pZCBhZXNfZW5jcnlwdF9jYmModW5zaWduZWQgY2hhciogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNDb250ZXh0KiBjdHgpIHsKKyAgdW5zaWduZWQgaW50IGl2WzRdOworICBpbnQgaTsKKyAgQVNTRVJUKChsZW4gJiAxNSkgPT0gMCk7CisgIEZYU1lTX21lbWNweShpdiwgY3R4LT5pdiwgc2l6ZW9mKGl2KSk7CisgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgaXZbaV0gXj0gR0VUXzMyQklUX01TQl9GSVJTVChzcmMgKyA0ICogaSk7CiAgICAgfQotICAgIEZYU1lTX21lbWNweShjdHgtPml2LCBpdiwgc2l6ZW9mKGl2KSk7Ci19Ci12b2lkIENSWVBUX0FFU1NldEtleSh2b2lkKiBjb250ZXh0LCBGWF9EV09SRCBibG9ja2xlbiwgY29uc3QgdWludDhfdCoga2V5LCBGWF9EV09SRCBrZXlsZW4sIEZYX0JPT0wgYkVuY3J5cHQpCi17Ci0gICAgYWVzX3NldHVwKChBRVNDb250ZXh0Kiljb250ZXh0LCBibG9ja2xlbiwga2V5LCBrZXlsZW4pOwotfQotdm9pZCBDUllQVF9BRVNTZXRJVih2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBpdikKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgKChBRVNDb250ZXh0Kiljb250ZXh0KS0+TmI7IGkrKykgewotICAgICAgICAoKEFFU0NvbnRleHQqKWNvbnRleHQpLT5pdltpXSA9IEdFVF8zMkJJVF9NU0JfRklSU1QoaXYgKyA0ICogaSk7CisgICAgYWVzX2VuY3J5cHQoY3R4LCBpdik7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgUFVUXzMyQklUX01TQl9GSVJTVChkZXN0ICsgNCAqIGksIGl2W2ldKTsKICAgICB9CisgICAgZGVzdCArPSAxNjsKKyAgICBzcmMgKz0gMTY7CisgICAgbGVuIC09IDE2OworICB9CisgIEZYU1lTX21lbWNweShjdHgtPml2LCBpdiwgc2l6ZW9mKGl2KSk7CiB9Ci12b2lkIENSWVBUX0FFU0RlY3J5cHQodm9pZCogY29udGV4dCwgdWludDhfdCogZGVzdCwgY29uc3QgdWludDhfdCogc3JjLCBGWF9EV09SRCBsZW4pCi17Ci0gICAgYWVzX2RlY3J5cHRfY2JjKGRlc3QsIHNyYywgbGVuLCAoQUVTQ29udGV4dCopY29udGV4dCk7Cit2b2lkIENSWVBUX0FFU1NldEtleSh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYmxvY2tsZW4sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBrZXlsZW4sCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmNyeXB0KSB7CisgIGFlc19zZXR1cCgoQUVTQ29udGV4dCopY29udGV4dCwgYmxvY2tsZW4sIGtleSwga2V5bGVuKTsKIH0KLXZvaWQgQ1JZUFRfQUVTRW5jcnlwdCh2b2lkKiBjb250ZXh0LCB1aW50OF90KiBkZXN0LCBjb25zdCB1aW50OF90KiBzcmMsIEZYX0RXT1JEIGxlbikKLXsKLSAgICBhZXNfZW5jcnlwdF9jYmMoZGVzdCwgc3JjLCBsZW4sIChBRVNDb250ZXh0Kiljb250ZXh0KTsKK3ZvaWQgQ1JZUFRfQUVTU2V0SVYodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogaXYpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAoKEFFU0NvbnRleHQqKWNvbnRleHQpLT5OYjsgaSsrKSB7CisgICAgKChBRVNDb250ZXh0Kiljb250ZXh0KS0+aXZbaV0gPSBHRVRfMzJCSVRfTVNCX0ZJUlNUKGl2ICsgNCAqIGkpOworICB9Cit9Cit2b2lkIENSWVBUX0FFU0RlY3J5cHQodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBsZW4pIHsKKyAgYWVzX2RlY3J5cHRfY2JjKGRlc3QsIHNyYywgbGVuLCAoQUVTQ29udGV4dCopY29udGV4dCk7Cit9Cit2b2lkIENSWVBUX0FFU0VuY3J5cHQodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBsZW4pIHsKKyAgYWVzX2VuY3J5cHRfY2JjKGRlc3QsIHNyYywgbGVuLCAoQUVTQ29udGV4dCopY29udGV4dCk7CiB9CiAjaWZkZWYgX19jcGx1c3BsdXMKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9zaGEuY3BwIGIvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfc2hhLmNwcAppbmRleCBiMjIzNDhhLi45OGU2MWQwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9zaGEuY3BwCisrKyBiL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X3NoYS5jcHAKQEAgLTksNzMyICs5LDY0NyBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIHR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBpbnQgaFs1XTsKLSAgICB1bnNpZ25lZCBjaGFyIGJsb2NrWzY0XTsKLSAgICBpbnQgYmxrdXNlZDsKLSAgICB1bnNpZ25lZCBpbnQgbGVuaGksIGxlbmxvOworICB1bnNpZ25lZCBpbnQgaFs1XTsKKyAgdW5zaWduZWQgY2hhciBibG9ja1s2NF07CisgIGludCBibGt1c2VkOworICB1bnNpZ25lZCBpbnQgbGVuaGksIGxlbmxvOwogfSBTSEFfU3RhdGU7Ci0jZGVmaW5lIHJvbCh4LHkpICggKCh4KSA8PCAoeSkpIHwgKCgodW5zaWduZWQgaW50KXgpID4+ICgzMi15KSkgKQotc3RhdGljIHZvaWQgU0hBX0NvcmVfSW5pdCh1bnNpZ25lZCBpbnQgaFs1XSkKLXsKLSAgICBoWzBdID0gMHg2NzQ1MjMwMTsKLSAgICBoWzFdID0gMHhlZmNkYWI4OTsKLSAgICBoWzJdID0gMHg5OGJhZGNmZTsKLSAgICBoWzNdID0gMHgxMDMyNTQ3NjsKLSAgICBoWzRdID0gMHhjM2QyZTFmMDsKKyNkZWZpbmUgcm9sKHgsIHkpICgoKHgpIDw8ICh5KSkgfCAoKCh1bnNpZ25lZCBpbnQpeCkgPj4gKDMyIC0geSkpKQorc3RhdGljIHZvaWQgU0hBX0NvcmVfSW5pdCh1bnNpZ25lZCBpbnQgaFs1XSkgeworICBoWzBdID0gMHg2NzQ1MjMwMTsKKyAgaFsxXSA9IDB4ZWZjZGFiODk7CisgIGhbMl0gPSAweDk4YmFkY2ZlOworICBoWzNdID0gMHgxMDMyNTQ3NjsKKyAgaFs0XSA9IDB4YzNkMmUxZjA7CiB9Ci1zdGF0aWMgdm9pZCBTSEFUcmFuc2Zvcm0odW5zaWduZWQgaW50ICogZGlnZXN0LCB1bnNpZ25lZCBpbnQgKiBibG9jaykKLXsKLSAgICB1bnNpZ25lZCBpbnQgd1s4MF07Ci0gICAgdW5zaWduZWQgaW50IGEsIGIsIGMsIGQsIGU7Ci0gICAgaW50IHQ7Ci0gICAgZm9yICh0ID0gMDsgdCA8IDE2OyB0KyspIHsKLSAgICAgICAgd1t0XSA9IGJsb2NrW3RdOwotICAgIH0KLSAgICBmb3IgKHQgPSAxNjsgdCA8IDgwOyB0KyspIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9IHdbdCAtIDNdIF4gd1t0IC0gOF0gXiB3W3QgLSAxNF0gXiB3W3QgLSAxNl07Ci0gICAgICAgIHdbdF0gPSByb2wodG1wLCAxKTsKLSAgICB9Ci0gICAgYSA9IGRpZ2VzdFswXTsKLSAgICBiID0gZGlnZXN0WzFdOwotICAgIGMgPSBkaWdlc3RbMl07Ci0gICAgZCA9IGRpZ2VzdFszXTsKLSAgICBlID0gZGlnZXN0WzRdOwotICAgIGZvciAodCA9IDA7IHQgPCAyMDsgdCsrKSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCB0bXAgPQotICAgICAgICAgICAgcm9sKGEsIDUpICsgKChiICYgYykgfCAoZCAmIH5iKSkgKyBlICsgd1t0XSArIDB4NWE4Mjc5OTk7Ci0gICAgICAgIGUgPSBkOwotICAgICAgICBkID0gYzsKLSAgICAgICAgYyA9IHJvbChiLCAzMCk7Ci0gICAgICAgIGIgPSBhOwotICAgICAgICBhID0gdG1wOwotICAgIH0KLSAgICBmb3IgKHQgPSAyMDsgdCA8IDQwOyB0KyspIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9IHJvbChhLCA1KSArIChiIF4gYyBeIGQpICsgZSArIHdbdF0gKyAweDZlZDllYmExOwotICAgICAgICBlID0gZDsKLSAgICAgICAgZCA9IGM7Ci0gICAgICAgIGMgPSByb2woYiwgMzApOwotICAgICAgICBiID0gYTsKLSAgICAgICAgYSA9IHRtcDsKLSAgICB9Ci0gICAgZm9yICh0ID0gNDA7IHQgPCA2MDsgdCsrKSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCB0bXAgPSByb2woYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1KSArICgoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCkpICsgZSArIHdbdF0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZjFiYmNkYzsKLSAgICAgICAgZSA9IGQ7Ci0gICAgICAgIGQgPSBjOwotICAgICAgICBjID0gcm9sKGIsIDMwKTsKLSAgICAgICAgYiA9IGE7Ci0gICAgICAgIGEgPSB0bXA7Ci0gICAgfQotICAgIGZvciAodCA9IDYwOyB0IDwgODA7IHQrKykgewotICAgICAgICB1bnNpZ25lZCBpbnQgdG1wID0gcm9sKGEsIDUpICsgKGIgXiBjIF4gZCkgKyBlICsgd1t0XSArIDB4Y2E2MmMxZDY7Ci0gICAgICAgIGUgPSBkOwotICAgICAgICBkID0gYzsKLSAgICAgICAgYyA9IHJvbChiLCAzMCk7Ci0gICAgICAgIGIgPSBhOwotICAgICAgICBhID0gdG1wOwotICAgIH0KLSAgICBkaWdlc3RbMF0gKz0gYTsKLSAgICBkaWdlc3RbMV0gKz0gYjsKLSAgICBkaWdlc3RbMl0gKz0gYzsKLSAgICBkaWdlc3RbM10gKz0gZDsKLSAgICBkaWdlc3RbNF0gKz0gZTsKK3N0YXRpYyB2b2lkIFNIQVRyYW5zZm9ybSh1bnNpZ25lZCBpbnQqIGRpZ2VzdCwgdW5zaWduZWQgaW50KiBibG9jaykgeworICB1bnNpZ25lZCBpbnQgd1s4MF07CisgIHVuc2lnbmVkIGludCBhLCBiLCBjLCBkLCBlOworICBpbnQgdDsKKyAgZm9yICh0ID0gMDsgdCA8IDE2OyB0KyspIHsKKyAgICB3W3RdID0gYmxvY2tbdF07CisgIH0KKyAgZm9yICh0ID0gMTY7IHQgPCA4MDsgdCsrKSB7CisgICAgdW5zaWduZWQgaW50IHRtcCA9IHdbdCAtIDNdIF4gd1t0IC0gOF0gXiB3W3QgLSAxNF0gXiB3W3QgLSAxNl07CisgICAgd1t0XSA9IHJvbCh0bXAsIDEpOworICB9CisgIGEgPSBkaWdlc3RbMF07CisgIGIgPSBkaWdlc3RbMV07CisgIGMgPSBkaWdlc3RbMl07CisgIGQgPSBkaWdlc3RbM107CisgIGUgPSBkaWdlc3RbNF07CisgIGZvciAodCA9IDA7IHQgPCAyMDsgdCsrKSB7CisgICAgdW5zaWduZWQgaW50IHRtcCA9IHJvbChhLCA1KSArICgoYiAmIGMpIHwgKGQgJiB+YikpICsgZSArIHdbdF0gKyAweDVhODI3OTk5OworICAgIGUgPSBkOworICAgIGQgPSBjOworICAgIGMgPSByb2woYiwgMzApOworICAgIGIgPSBhOworICAgIGEgPSB0bXA7CisgIH0KKyAgZm9yICh0ID0gMjA7IHQgPCA0MDsgdCsrKSB7CisgICAgdW5zaWduZWQgaW50IHRtcCA9IHJvbChhLCA1KSArIChiIF4gYyBeIGQpICsgZSArIHdbdF0gKyAweDZlZDllYmExOworICAgIGUgPSBkOworICAgIGQgPSBjOworICAgIGMgPSByb2woYiwgMzApOworICAgIGIgPSBhOworICAgIGEgPSB0bXA7CisgIH0KKyAgZm9yICh0ID0gNDA7IHQgPCA2MDsgdCsrKSB7CisgICAgdW5zaWduZWQgaW50IHRtcCA9CisgICAgICAgIHJvbChhLCA1KSArICgoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCkpICsgZSArIHdbdF0gKyAweDhmMWJiY2RjOworICAgIGUgPSBkOworICAgIGQgPSBjOworICAgIGMgPSByb2woYiwgMzApOworICAgIGIgPSBhOworICAgIGEgPSB0bXA7CisgIH0KKyAgZm9yICh0ID0gNjA7IHQgPCA4MDsgdCsrKSB7CisgICAgdW5zaWduZWQgaW50IHRtcCA9IHJvbChhLCA1KSArIChiIF4gYyBeIGQpICsgZSArIHdbdF0gKyAweGNhNjJjMWQ2OworICAgIGUgPSBkOworICAgIGQgPSBjOworICAgIGMgPSByb2woYiwgMzApOworICAgIGIgPSBhOworICAgIGEgPSB0bXA7CisgIH0KKyAgZGlnZXN0WzBdICs9IGE7CisgIGRpZ2VzdFsxXSArPSBiOworICBkaWdlc3RbMl0gKz0gYzsKKyAgZGlnZXN0WzNdICs9IGQ7CisgIGRpZ2VzdFs0XSArPSBlOwogfQotdm9pZCBDUllQVF9TSEExU3RhcnQodm9pZCogY29udGV4dCkKLXsKLSAgICBTSEFfU3RhdGUgKiBzID0gKFNIQV9TdGF0ZSopY29udGV4dDsKLSAgICBTSEFfQ29yZV9Jbml0KHMtPmgpOwotICAgIHMtPmJsa3VzZWQgPSAwOwotICAgIHMtPmxlbmhpID0gcy0+bGVubG8gPSAwOwordm9pZCBDUllQVF9TSEExU3RhcnQodm9pZCogY29udGV4dCkgeworICBTSEFfU3RhdGUqIHMgPSAoU0hBX1N0YXRlKiljb250ZXh0OworICBTSEFfQ29yZV9Jbml0KHMtPmgpOworICBzLT5ibGt1c2VkID0gMDsKKyAgcy0+bGVuaGkgPSBzLT5sZW5sbyA9IDA7CiB9Ci12b2lkIENSWVBUX1NIQTFVcGRhdGUodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSkKLXsKLSAgICBTSEFfU3RhdGUgKiBzID0gKFNIQV9TdGF0ZSopY29udGV4dDsKLSAgICB1bnNpZ25lZCBjaGFyICpxID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOwotICAgIHVuc2lnbmVkIGludCB3b3JkYmxvY2tbMTZdOwotICAgIGludCBsZW4gPSBzaXplOwotICAgIHVuc2lnbmVkIGludCBsZW53ID0gbGVuOwotICAgIGludCBpOwotICAgIHMtPmxlbmxvICs9IGxlbnc7Ci0gICAgcy0+bGVuaGkgKz0gKHMtPmxlbmxvIDwgbGVudyk7Ci0gICAgaWYgKHMtPmJsa3VzZWQgJiYgcy0+YmxrdXNlZCArIGxlbiA8IDY0KSB7Ci0gICAgICAgIEZYU1lTX21lbWNweShzLT5ibG9jayArIHMtPmJsa3VzZWQsIHEsIGxlbik7Ci0gICAgICAgIHMtPmJsa3VzZWQgKz0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdoaWxlIChzLT5ibGt1c2VkICsgbGVuID49IDY0KSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkocy0+YmxvY2sgKyBzLT5ibGt1c2VkLCBxLCA2NCAtIHMtPmJsa3VzZWQpOwotICAgICAgICAgICAgcSArPSA2NCAtIHMtPmJsa3VzZWQ7Ci0gICAgICAgICAgICBsZW4gLT0gNjQgLSBzLT5ibGt1c2VkOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAgICAgICAgICAgICB3b3JkYmxvY2tbaV0gPQotICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpIHMtPmJsb2NrW2kgKiA0ICsgMF0pIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkIGludCkgcy0+YmxvY2tbaSAqIDQgKyAxXSkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgaW50KSBzLT5ibG9ja1tpICogNCArIDJdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkIGludCkgcy0+YmxvY2tbaSAqIDQgKyAzXSkgPDwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTSEFUcmFuc2Zvcm0ocy0+aCwgd29yZGJsb2NrKTsKLSAgICAgICAgICAgIHMtPmJsa3VzZWQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIEZYU1lTX21lbWNweShzLT5ibG9jaywgcSwgbGVuKTsKLSAgICAgICAgcy0+YmxrdXNlZCA9IGxlbjsKK3ZvaWQgQ1JZUFRfU0hBMVVwZGF0ZSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKSB7CisgIFNIQV9TdGF0ZSogcyA9IChTSEFfU3RhdGUqKWNvbnRleHQ7CisgIHVuc2lnbmVkIGNoYXIqIHEgPSAodW5zaWduZWQgY2hhciopZGF0YTsKKyAgdW5zaWduZWQgaW50IHdvcmRibG9ja1sxNl07CisgIGludCBsZW4gPSBzaXplOworICB1bnNpZ25lZCBpbnQgbGVudyA9IGxlbjsKKyAgaW50IGk7CisgIHMtPmxlbmxvICs9IGxlbnc7CisgIHMtPmxlbmhpICs9IChzLT5sZW5sbyA8IGxlbncpOworICBpZiAocy0+YmxrdXNlZCAmJiBzLT5ibGt1c2VkICsgbGVuIDwgNjQpIHsKKyAgICBGWFNZU19tZW1jcHkocy0+YmxvY2sgKyBzLT5ibGt1c2VkLCBxLCBsZW4pOworICAgIHMtPmJsa3VzZWQgKz0gbGVuOworICB9IGVsc2UgeworICAgIHdoaWxlIChzLT5ibGt1c2VkICsgbGVuID49IDY0KSB7CisgICAgICBGWFNZU19tZW1jcHkocy0+YmxvY2sgKyBzLT5ibGt1c2VkLCBxLCA2NCAtIHMtPmJsa3VzZWQpOworICAgICAgcSArPSA2NCAtIHMtPmJsa3VzZWQ7CisgICAgICBsZW4gLT0gNjQgLSBzLT5ibGt1c2VkOworICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgd29yZGJsb2NrW2ldID0gKCgodW5zaWduZWQgaW50KXMtPmJsb2NrW2kgKiA0ICsgMF0pIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkIGludClzLT5ibG9ja1tpICogNCArIDFdKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpcy0+YmxvY2tbaSAqIDQgKyAyXSkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpcy0+YmxvY2tbaSAqIDQgKyAzXSkgPDwgMCk7CisgICAgICB9CisgICAgICBTSEFUcmFuc2Zvcm0ocy0+aCwgd29yZGJsb2NrKTsKKyAgICAgIHMtPmJsa3VzZWQgPSAwOwogICAgIH0KKyAgICBGWFNZU19tZW1jcHkocy0+YmxvY2ssIHEsIGxlbik7CisgICAgcy0+YmxrdXNlZCA9IGxlbjsKKyAgfQogfQotdm9pZCBDUllQVF9TSEExRmluaXNoKHZvaWQqIGNvbnRleHQsIHVpbnQ4X3QgZGlnZXN0WzIwXSkKLXsKLSAgICBTSEFfU3RhdGUgKiBzID0gKFNIQV9TdGF0ZSopY29udGV4dDsKLSAgICBpbnQgaTsKLSAgICBpbnQgcGFkOwotICAgIHVuc2lnbmVkIGNoYXIgY1s2NF07Ci0gICAgdW5zaWduZWQgaW50IGxlbmhpLCBsZW5sbzsKLSAgICBpZiAocy0+YmxrdXNlZCA+PSA1NikgewotICAgICAgICBwYWQgPSA1NiArIDY0IC0gcy0+YmxrdXNlZDsKLSAgICB9IGVsc2UgewotICAgICAgICBwYWQgPSA1NiAtIHMtPmJsa3VzZWQ7Ci0gICAgfQotICAgIGxlbmhpID0gKHMtPmxlbmhpIDw8IDMpIHwgKHMtPmxlbmxvID4+ICgzMiAtIDMpKTsKLSAgICBsZW5sbyA9IChzLT5sZW5sbyA8PCAzKTsKLSAgICBGWFNZU19tZW1zZXQoYywgMCwgcGFkKTsKLSAgICBjWzBdID0gMHg4MDsKLSAgICBDUllQVF9TSEExVXBkYXRlKHMsIGMsIHBhZCk7Ci0gICAgY1swXSA9IChsZW5oaSA+PiAyNCkgJiAweEZGOwotICAgIGNbMV0gPSAobGVuaGkgPj4gMTYpICYgMHhGRjsKLSAgICBjWzJdID0gKGxlbmhpID4+IDgpICYgMHhGRjsKLSAgICBjWzNdID0gKGxlbmhpID4+IDApICYgMHhGRjsKLSAgICBjWzRdID0gKGxlbmxvID4+IDI0KSAmIDB4RkY7Ci0gICAgY1s1XSA9IChsZW5sbyA+PiAxNikgJiAweEZGOwotICAgIGNbNl0gPSAobGVubG8gPj4gOCkgJiAweEZGOwotICAgIGNbN10gPSAobGVubG8gPj4gMCkgJiAweEZGOwotICAgIENSWVBUX1NIQTFVcGRhdGUocywgYywgOCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICBkaWdlc3RbaSAqIDRdID0gKHMtPmhbaV0gPj4gMjQpICYgMHhGRjsKLSAgICAgICAgZGlnZXN0W2kgKiA0ICsgMV0gPSAocy0+aFtpXSA+PiAxNikgJiAweEZGOwotICAgICAgICBkaWdlc3RbaSAqIDQgKyAyXSA9IChzLT5oW2ldID4+IDgpICYgMHhGRjsKLSAgICAgICAgZGlnZXN0W2kgKiA0ICsgM10gPSAocy0+aFtpXSkgJiAweEZGOwotICAgIH0KK3ZvaWQgQ1JZUFRfU0hBMUZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFsyMF0pIHsKKyAgU0hBX1N0YXRlKiBzID0gKFNIQV9TdGF0ZSopY29udGV4dDsKKyAgaW50IGk7CisgIGludCBwYWQ7CisgIHVuc2lnbmVkIGNoYXIgY1s2NF07CisgIHVuc2lnbmVkIGludCBsZW5oaSwgbGVubG87CisgIGlmIChzLT5ibGt1c2VkID49IDU2KSB7CisgICAgcGFkID0gNTYgKyA2NCAtIHMtPmJsa3VzZWQ7CisgIH0gZWxzZSB7CisgICAgcGFkID0gNTYgLSBzLT5ibGt1c2VkOworICB9CisgIGxlbmhpID0gKHMtPmxlbmhpIDw8IDMpIHwgKHMtPmxlbmxvID4+ICgzMiAtIDMpKTsKKyAgbGVubG8gPSAocy0+bGVubG8gPDwgMyk7CisgIEZYU1lTX21lbXNldChjLCAwLCBwYWQpOworICBjWzBdID0gMHg4MDsKKyAgQ1JZUFRfU0hBMVVwZGF0ZShzLCBjLCBwYWQpOworICBjWzBdID0gKGxlbmhpID4+IDI0KSAmIDB4RkY7CisgIGNbMV0gPSAobGVuaGkgPj4gMTYpICYgMHhGRjsKKyAgY1syXSA9IChsZW5oaSA+PiA4KSAmIDB4RkY7CisgIGNbM10gPSAobGVuaGkgPj4gMCkgJiAweEZGOworICBjWzRdID0gKGxlbmxvID4+IDI0KSAmIDB4RkY7CisgIGNbNV0gPSAobGVubG8gPj4gMTYpICYgMHhGRjsKKyAgY1s2XSA9IChsZW5sbyA+PiA4KSAmIDB4RkY7CisgIGNbN10gPSAobGVubG8gPj4gMCkgJiAweEZGOworICBDUllQVF9TSEExVXBkYXRlKHMsIGMsIDgpOworICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgZGlnZXN0W2kgKiA0XSA9IChzLT5oW2ldID4+IDI0KSAmIDB4RkY7CisgICAgZGlnZXN0W2kgKiA0ICsgMV0gPSAocy0+aFtpXSA+PiAxNikgJiAweEZGOworICAgIGRpZ2VzdFtpICogNCArIDJdID0gKHMtPmhbaV0gPj4gOCkgJiAweEZGOworICAgIGRpZ2VzdFtpICogNCArIDNdID0gKHMtPmhbaV0pICYgMHhGRjsKKyAgfQogfQotdm9pZCBDUllQVF9TSEExR2VuZXJhdGUoY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSwgdWludDhfdCBkaWdlc3RbMjBdKQotewotICAgIFNIQV9TdGF0ZSBzOwotICAgIENSWVBUX1NIQTFTdGFydCgmcyk7Ci0gICAgQ1JZUFRfU0hBMVVwZGF0ZSgmcywgZGF0YSwgc2l6ZSk7Ci0gICAgQ1JZUFRfU0hBMUZpbmlzaCgmcywgZGlnZXN0KTsKK3ZvaWQgQ1JZUFRfU0hBMUdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaWdlc3RbMjBdKSB7CisgIFNIQV9TdGF0ZSBzOworICBDUllQVF9TSEExU3RhcnQoJnMpOworICBDUllQVF9TSEExVXBkYXRlKCZzLCBkYXRhLCBzaXplKTsKKyAgQ1JZUFRfU0hBMUZpbmlzaCgmcywgZGlnZXN0KTsKIH0KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBGWF9EV09SRCB0b3RhbFsyXTsKLSAgICBGWF9EV09SRCBzdGF0ZVs4XTsKLSAgICB1aW50OF90IGJ1ZmZlcls2NF07CisgIEZYX0RXT1JEIHRvdGFsWzJdOworICBGWF9EV09SRCBzdGF0ZVs4XTsKKyAgdWludDhfdCBidWZmZXJbNjRdOworfSBzaGEyNTZfY29udGV4dDsKKyNkZWZpbmUgR0VUX0ZYX0RXT1JEKG4sIGIsIGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobikgPSAoKEZYX0RXT1JEKShiKVsoaSldIDw8IDI0KSB8ICgoRlhfRFdPUkQpKGIpWyhpKSArIDFdIDw8IDE2KSB8IFwKKyAgICAgICAgICAoKEZYX0RXT1JEKShiKVsoaSkgKyAyXSA8PCA4KSB8ICgoRlhfRFdPUkQpKGIpWyhpKSArIDNdKTsgICAgIFwKKyAgfQorI2RlZmluZSBQVVRfRlhfRFdPUkQobiwgYiwgaSkgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYilbKGkpXSA9ICh1aW50OF90KSgobikgPj4gMjQpOyAgICAgXAorICAgIChiKVsoaSkgKyAxXSA9ICh1aW50OF90KSgobikgPj4gMTYpOyBcCisgICAgKGIpWyhpKSArIDJdID0gKHVpbnQ4X3QpKChuKSA+PiA4KTsgIFwKKyAgICAoYilbKGkpICsgM10gPSAodWludDhfdCkoKG4pKTsgICAgICAgXAorICB9Cit2b2lkIENSWVBUX1NIQTI1NlN0YXJ0KHZvaWQqIGNvbnRleHQpIHsKKyAgc2hhMjU2X2NvbnRleHQqIGN0eCA9IChzaGEyNTZfY29udGV4dCopY29udGV4dDsKKyAgY3R4LT50b3RhbFswXSA9IDA7CisgIGN0eC0+dG90YWxbMV0gPSAwOworICBjdHgtPnN0YXRlWzBdID0gMHg2QTA5RTY2NzsKKyAgY3R4LT5zdGF0ZVsxXSA9IDB4QkI2N0FFODU7CisgIGN0eC0+c3RhdGVbMl0gPSAweDNDNkVGMzcyOworICBjdHgtPnN0YXRlWzNdID0gMHhBNTRGRjUzQTsKKyAgY3R4LT5zdGF0ZVs0XSA9IDB4NTEwRTUyN0Y7CisgIGN0eC0+c3RhdGVbNV0gPSAweDlCMDU2ODhDOworICBjdHgtPnN0YXRlWzZdID0gMHgxRjgzRDlBQjsKKyAgY3R4LT5zdGF0ZVs3XSA9IDB4NUJFMENEMTk7CiB9Ci1zaGEyNTZfY29udGV4dDsKLSNkZWZpbmUgR0VUX0ZYX0RXT1JEKG4sYixpKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKG4pID0gKCAoRlhfRFdPUkQpIChiKVsoaSkgICAgXSA8PCAyNCApICAgICAgIFwKLSAgICAgICAgICAgICAgfCAoIChGWF9EV09SRCkgKGIpWyhpKSArIDFdIDw8IDE2ICkgICAgICAgXAotICAgICAgICAgICAgICB8ICggKEZYX0RXT1JEKSAoYilbKGkpICsgMl0gPDwgIDggKSAgICAgICBcCi0gICAgICAgICAgICAgIHwgKCAoRlhfRFdPUkQpIChiKVsoaSkgKyAzXSAgICAgICApOyAgICAgIFwKLSAgICB9Ci0jZGVmaW5lIFBVVF9GWF9EV09SRChuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChiKVsoaSkgICAgXSA9ICh1aW50OF90KSAoIChuKSA+PiAyNCApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyAxXSA9ICh1aW50OF90KSAoIChuKSA+PiAxNiApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyAyXSA9ICh1aW50OF90KSAoIChuKSA+PiAgOCApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyAzXSA9ICh1aW50OF90KSAoIChuKSAgICAgICApOyAgICAgICBcCi0gICAgfQotdm9pZCBDUllQVF9TSEEyNTZTdGFydCggdm9pZCogY29udGV4dCApCi17Ci0gICAgc2hhMjU2X2NvbnRleHQgKmN0eCA9IChzaGEyNTZfY29udGV4dCAqKWNvbnRleHQ7Ci0gICAgY3R4LT50b3RhbFswXSA9IDA7Ci0gICAgY3R4LT50b3RhbFsxXSA9IDA7Ci0gICAgY3R4LT5zdGF0ZVswXSA9IDB4NkEwOUU2Njc7Ci0gICAgY3R4LT5zdGF0ZVsxXSA9IDB4QkI2N0FFODU7Ci0gICAgY3R4LT5zdGF0ZVsyXSA9IDB4M0M2RUYzNzI7Ci0gICAgY3R4LT5zdGF0ZVszXSA9IDB4QTU0RkY1M0E7Ci0gICAgY3R4LT5zdGF0ZVs0XSA9IDB4NTEwRTUyN0Y7Ci0gICAgY3R4LT5zdGF0ZVs1XSA9IDB4OUIwNTY4OEM7Ci0gICAgY3R4LT5zdGF0ZVs2XSA9IDB4MUY4M0Q5QUI7Ci0gICAgY3R4LT5zdGF0ZVs3XSA9IDB4NUJFMENEMTk7CitzdGF0aWMgdm9pZCBzaGEyNTZfcHJvY2VzcyhzaGEyNTZfY29udGV4dCogY3R4LCBjb25zdCB1aW50OF90IGRhdGFbNjRdKSB7CisgIEZYX0RXT1JEIHRlbXAxLCB0ZW1wMiwgV1s2NF07CisgIEZYX0RXT1JEIEEsIEIsIEMsIEQsIEUsIEYsIEcsIEg7CisgIEdFVF9GWF9EV09SRChXWzBdLCBkYXRhLCAwKTsKKyAgR0VUX0ZYX0RXT1JEKFdbMV0sIGRhdGEsIDQpOworICBHRVRfRlhfRFdPUkQoV1syXSwgZGF0YSwgOCk7CisgIEdFVF9GWF9EV09SRChXWzNdLCBkYXRhLCAxMik7CisgIEdFVF9GWF9EV09SRChXWzRdLCBkYXRhLCAxNik7CisgIEdFVF9GWF9EV09SRChXWzVdLCBkYXRhLCAyMCk7CisgIEdFVF9GWF9EV09SRChXWzZdLCBkYXRhLCAyNCk7CisgIEdFVF9GWF9EV09SRChXWzddLCBkYXRhLCAyOCk7CisgIEdFVF9GWF9EV09SRChXWzhdLCBkYXRhLCAzMik7CisgIEdFVF9GWF9EV09SRChXWzldLCBkYXRhLCAzNik7CisgIEdFVF9GWF9EV09SRChXWzEwXSwgZGF0YSwgNDApOworICBHRVRfRlhfRFdPUkQoV1sxMV0sIGRhdGEsIDQ0KTsKKyAgR0VUX0ZYX0RXT1JEKFdbMTJdLCBkYXRhLCA0OCk7CisgIEdFVF9GWF9EV09SRChXWzEzXSwgZGF0YSwgNTIpOworICBHRVRfRlhfRFdPUkQoV1sxNF0sIGRhdGEsIDU2KTsKKyAgR0VUX0ZYX0RXT1JEKFdbMTVdLCBkYXRhLCA2MCk7CisjZGVmaW5lIFNIUih4LCBuKSAoKHggJiAweEZGRkZGRkZGKSA+PiBuKQorI2RlZmluZSBST1RSKHgsIG4pIChTSFIoeCwgbikgfCAoeCA8PCAoMzIgLSBuKSkpCisjZGVmaW5lIFMwKHgpIChST1RSKHgsIDcpIF4gUk9UUih4LCAxOCkgXiBTSFIoeCwgMykpCisjZGVmaW5lIFMxKHgpIChST1RSKHgsIDE3KSBeIFJPVFIoeCwgMTkpIF4gU0hSKHgsIDEwKSkKKyNkZWZpbmUgUzIoeCkgKFJPVFIoeCwgMikgXiBST1RSKHgsIDEzKSBeIFJPVFIoeCwgMjIpKQorI2RlZmluZSBTMyh4KSAoUk9UUih4LCA2KSBeIFJPVFIoeCwgMTEpIF4gUk9UUih4LCAyNSkpCisjZGVmaW5lIEYwKHgsIHksIHopICgoeCAmIHkpIHwgKHogJiAoeCB8IHkpKSkKKyNkZWZpbmUgRjEoeCwgeSwgeikgKHogXiAoeCAmICh5IF4geikpKQorI2RlZmluZSBSKHQpIChXW3RdID0gUzEoV1t0IC0gMl0pICsgV1t0IC0gN10gKyBTMChXW3QgLSAxNV0pICsgV1t0IC0gMTZdKQorI2RlZmluZSBQKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIHgsIEspICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAxID0gaCArIFMzKGUpICsgRjEoZSwgZiwgZykgKyBLICsgeDsgXAorICAgIHRlbXAyID0gUzIoYSkgKyBGMChhLCBiLCBjKTsgICAgICAgICAgICAgXAorICAgIGQgKz0gdGVtcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGggPSB0ZW1wMSArIHRlbXAyOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisgIEEgPSBjdHgtPnN0YXRlWzBdOworICBCID0gY3R4LT5zdGF0ZVsxXTsKKyAgQyA9IGN0eC0+c3RhdGVbMl07CisgIEQgPSBjdHgtPnN0YXRlWzNdOworICBFID0gY3R4LT5zdGF0ZVs0XTsKKyAgRiA9IGN0eC0+c3RhdGVbNV07CisgIEcgPSBjdHgtPnN0YXRlWzZdOworICBIID0gY3R4LT5zdGF0ZVs3XTsKKyAgUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBXWzBdLCAweDQyOEEyRjk4KTsKKyAgUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBXWzFdLCAweDcxMzc0NDkxKTsKKyAgUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBXWzJdLCAweEI1QzBGQkNGKTsKKyAgUChGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBXWzNdLCAweEU5QjVEQkE1KTsKKyAgUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBXWzRdLCAweDM5NTZDMjVCKTsKKyAgUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBXWzVdLCAweDU5RjExMUYxKTsKKyAgUChDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBXWzZdLCAweDkyM0Y4MkE0KTsKKyAgUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBXWzddLCAweEFCMUM1RUQ1KTsKKyAgUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBXWzhdLCAweEQ4MDdBQTk4KTsKKyAgUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBXWzldLCAweDEyODM1QjAxKTsKKyAgUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBXWzEwXSwgMHgyNDMxODVCRSk7CisgIFAoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgV1sxMV0sIDB4NTUwQzdEQzMpOworICBQKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFdbMTJdLCAweDcyQkU1RDc0KTsKKyAgUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBXWzEzXSwgMHg4MERFQjFGRSk7CisgIFAoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgV1sxNF0sIDB4OUJEQzA2QTcpOworICBQKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFdbMTVdLCAweEMxOUJGMTc0KTsKKyAgUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDE2KSwgMHhFNDlCNjlDMSk7CisgIFAoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUigxNyksIDB4RUZCRTQ3ODYpOworICBQKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoMTgpLCAweDBGQzE5REM2KTsKKyAgUChGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDE5KSwgMHgyNDBDQTFDQyk7CisgIFAoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUigyMCksIDB4MkRFOTJDNkYpOworICBQKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoMjEpLCAweDRBNzQ4NEFBKTsKKyAgUChDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDIyKSwgMHg1Q0IwQTlEQyk7CisgIFAoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUigyMyksIDB4NzZGOTg4REEpOworICBQKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoMjQpLCAweDk4M0U1MTUyKTsKKyAgUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDI1KSwgMHhBODMxQzY2RCk7CisgIFAoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUigyNiksIDB4QjAwMzI3QzgpOworICBQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoMjcpLCAweEJGNTk3RkM3KTsKKyAgUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDI4KSwgMHhDNkUwMEJGMyk7CisgIFAoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUigyOSksIDB4RDVBNzkxNDcpOworICBQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoMzApLCAweDA2Q0E2MzUxKTsKKyAgUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDMxKSwgMHgxNDI5Mjk2Nyk7CisgIFAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUigzMiksIDB4MjdCNzBBODUpOworICBQKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoMzMpLCAweDJFMUIyMTM4KTsKKyAgUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDM0KSwgMHg0RDJDNkRGQyk7CisgIFAoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUigzNSksIDB4NTMzODBEMTMpOworICBQKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoMzYpLCAweDY1MEE3MzU0KTsKKyAgUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDM3KSwgMHg3NjZBMEFCQik7CisgIFAoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUigzOCksIDB4ODFDMkM5MkUpOworICBQKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoMzkpLCAweDkyNzIyQzg1KTsKKyAgUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDQwKSwgMHhBMkJGRThBMSk7CisgIFAoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUig0MSksIDB4QTgxQTY2NEIpOworICBQKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoNDIpLCAweEMyNEI4QjcwKTsKKyAgUChGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDQzKSwgMHhDNzZDNTFBMyk7CisgIFAoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUig0NCksIDB4RDE5MkU4MTkpOworICBQKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoNDUpLCAweEQ2OTkwNjI0KTsKKyAgUChDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDQ2KSwgMHhGNDBFMzU4NSk7CisgIFAoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUig0NyksIDB4MTA2QUEwNzApOworICBQKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoNDgpLCAweDE5QTRDMTE2KTsKKyAgUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDQ5KSwgMHgxRTM3NkMwOCk7CisgIFAoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUig1MCksIDB4Mjc0ODc3NEMpOworICBQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoNTEpLCAweDM0QjBCQ0I1KTsKKyAgUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDUyKSwgMHgzOTFDMENCMyk7CisgIFAoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUig1MyksIDB4NEVEOEFBNEEpOworICBQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoNTQpLCAweDVCOUNDQTRGKTsKKyAgUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDU1KSwgMHg2ODJFNkZGMyk7CisgIFAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUig1NiksIDB4NzQ4RjgyRUUpOworICBQKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoNTcpLCAweDc4QTU2MzZGKTsKKyAgUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDU4KSwgMHg4NEM4NzgxNCk7CisgIFAoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUig1OSksIDB4OENDNzAyMDgpOworICBQKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoNjApLCAweDkwQkVGRkZBKTsKKyAgUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDYxKSwgMHhBNDUwNkNFQik7CisgIFAoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUig2MiksIDB4QkVGOUEzRjcpOworICBQKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoNjMpLCAweEM2NzE3OEYyKTsKKyAgY3R4LT5zdGF0ZVswXSArPSBBOworICBjdHgtPnN0YXRlWzFdICs9IEI7CisgIGN0eC0+c3RhdGVbMl0gKz0gQzsKKyAgY3R4LT5zdGF0ZVszXSArPSBEOworICBjdHgtPnN0YXRlWzRdICs9IEU7CisgIGN0eC0+c3RhdGVbNV0gKz0gRjsKKyAgY3R4LT5zdGF0ZVs2XSArPSBHOworICBjdHgtPnN0YXRlWzddICs9IEg7CiB9Ci1zdGF0aWMgdm9pZCBzaGEyNTZfcHJvY2Vzcyggc2hhMjU2X2NvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCBkYXRhWzY0XSApCi17Ci0gICAgRlhfRFdPUkQgdGVtcDEsIHRlbXAyLCBXWzY0XTsKLSAgICBGWF9EV09SRCBBLCBCLCBDLCBELCBFLCBGLCBHLCBIOwotICAgIEdFVF9GWF9EV09SRCggV1swXSwgIGRhdGEsICAwICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBXWzFdLCAgZGF0YSwgIDQgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFdbMl0sICBkYXRhLCAgOCApOwotICAgIEdFVF9GWF9EV09SRCggV1szXSwgIGRhdGEsIDEyICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBXWzRdLCAgZGF0YSwgMTYgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFdbNV0sICBkYXRhLCAyMCApOwotICAgIEdFVF9GWF9EV09SRCggV1s2XSwgIGRhdGEsIDI0ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBXWzddLCAgZGF0YSwgMjggKTsKLSAgICBHRVRfRlhfRFdPUkQoIFdbOF0sICBkYXRhLCAzMiApOwotICAgIEdFVF9GWF9EV09SRCggV1s5XSwgIGRhdGEsIDM2ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBXWzEwXSwgZGF0YSwgNDAgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFdbMTFdLCBkYXRhLCA0NCApOwotICAgIEdFVF9GWF9EV09SRCggV1sxMl0sIGRhdGEsIDQ4ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBXWzEzXSwgZGF0YSwgNTIgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFdbMTRdLCBkYXRhLCA1NiApOwotICAgIEdFVF9GWF9EV09SRCggV1sxNV0sIGRhdGEsIDYwICk7Ci0jZGVmaW5lICBTSFIoeCxuKSAoKHggJiAweEZGRkZGRkZGKSA+PiBuKQotI2RlZmluZSBST1RSKHgsbikgKFNIUih4LG4pIHwgKHggPDwgKDMyIC0gbikpKQotI2RlZmluZSBTMCh4KSAoUk9UUih4LCA3KSBeIFJPVFIoeCwxOCkgXiAgU0hSKHgsIDMpKQotI2RlZmluZSBTMSh4KSAoUk9UUih4LDE3KSBeIFJPVFIoeCwxOSkgXiAgU0hSKHgsMTApKQotI2RlZmluZSBTMih4KSAoUk9UUih4LCAyKSBeIFJPVFIoeCwxMykgXiBST1RSKHgsMjIpKQotI2RlZmluZSBTMyh4KSAoUk9UUih4LCA2KSBeIFJPVFIoeCwxMSkgXiBST1RSKHgsMjUpKQotI2RlZmluZSBGMCh4LHkseikgKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKQotI2RlZmluZSBGMSh4LHkseikgKHogXiAoeCAmICh5IF4geikpKQotI2RlZmluZSBSKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIFdbdF0gPSBTMShXW3QgLSAgMl0pICsgV1t0IC0gIDddICsgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgIFMwKFdbdCAtIDE1XSkgKyBXW3QgLSAxNl0gICAgICAgICAgICBcCi0gICAgKQotI2RlZmluZSBQKGEsYixjLGQsZSxmLGcsaCx4LEspICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdGVtcDEgPSBoICsgUzMoZSkgKyBGMShlLGYsZykgKyBLICsgeDsgICAgICBcCi0gICAgICAgIHRlbXAyID0gUzIoYSkgKyBGMChhLGIsYyk7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkICs9IHRlbXAxOyBoID0gdGVtcDEgKyB0ZW1wMjsgICAgICAgICAgICAgIFwKLSAgICB9Ci0gICAgQSA9IGN0eC0+c3RhdGVbMF07Ci0gICAgQiA9IGN0eC0+c3RhdGVbMV07Ci0gICAgQyA9IGN0eC0+c3RhdGVbMl07Ci0gICAgRCA9IGN0eC0+c3RhdGVbM107Ci0gICAgRSA9IGN0eC0+c3RhdGVbNF07Ci0gICAgRiA9IGN0eC0+c3RhdGVbNV07Ci0gICAgRyA9IGN0eC0+c3RhdGVbNl07Ci0gICAgSCA9IGN0eC0+c3RhdGVbN107Ci0gICAgUCggQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgV1sgMF0sIDB4NDI4QTJGOTggKTsKLSAgICBQKCBILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBXWyAxXSwgMHg3MTM3NDQ5MSApOwotICAgIFAoIEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFdbIDJdLCAweEI1QzBGQkNGICk7Ci0gICAgUCggRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgV1sgM10sIDB4RTlCNURCQTUgKTsKLSAgICBQKCBFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBXWyA0XSwgMHgzOTU2QzI1QiApOwotICAgIFAoIEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFdbIDVdLCAweDU5RjExMUYxICk7Ci0gICAgUCggQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgV1sgNl0sIDB4OTIzRjgyQTQgKTsKLSAgICBQKCBCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBXWyA3XSwgMHhBQjFDNUVENSApOwotICAgIFAoIEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFdbIDhdLCAweEQ4MDdBQTk4ICk7Ci0gICAgUCggSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgV1sgOV0sIDB4MTI4MzVCMDEgKTsKLSAgICBQKCBHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBXWzEwXSwgMHgyNDMxODVCRSApOwotICAgIFAoIEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFdbMTFdLCAweDU1MEM3REMzICk7Ci0gICAgUCggRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgV1sxMl0sIDB4NzJCRTVENzQgKTsKLSAgICBQKCBELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBXWzEzXSwgMHg4MERFQjFGRSApOwotICAgIFAoIEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFdbMTRdLCAweDlCREMwNkE3ICk7Ci0gICAgUCggQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgV1sxNV0sIDB4QzE5QkYxNzQgKTsKLSAgICBQKCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDE2KSwgMHhFNDlCNjlDMSApOwotICAgIFAoIEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoMTcpLCAweEVGQkU0Nzg2ICk7Ci0gICAgUCggRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUigxOCksIDB4MEZDMTlEQzYgKTsKLSAgICBQKCBGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDE5KSwgMHgyNDBDQTFDQyApOwotICAgIFAoIEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoMjApLCAweDJERTkyQzZGICk7Ci0gICAgUCggRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUigyMSksIDB4NEE3NDg0QUEgKTsKLSAgICBQKCBDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDIyKSwgMHg1Q0IwQTlEQyApOwotICAgIFAoIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoMjMpLCAweDc2Rjk4OERBICk7Ci0gICAgUCggQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUigyNCksIDB4OTgzRTUxNTIgKTsKLSAgICBQKCBILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDI1KSwgMHhBODMxQzY2RCApOwotICAgIFAoIEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoMjYpLCAweEIwMDMyN0M4ICk7Ci0gICAgUCggRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUigyNyksIDB4QkY1OTdGQzcgKTsKLSAgICBQKCBFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDI4KSwgMHhDNkUwMEJGMyApOwotICAgIFAoIEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoMjkpLCAweEQ1QTc5MTQ3ICk7Ci0gICAgUCggQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUigzMCksIDB4MDZDQTYzNTEgKTsKLSAgICBQKCBCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDMxKSwgMHgxNDI5Mjk2NyApOwotICAgIFAoIEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoMzIpLCAweDI3QjcwQTg1ICk7Ci0gICAgUCggSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUigzMyksIDB4MkUxQjIxMzggKTsKLSAgICBQKCBHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDM0KSwgMHg0RDJDNkRGQyApOwotICAgIFAoIEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoMzUpLCAweDUzMzgwRDEzICk7Ci0gICAgUCggRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUigzNiksIDB4NjUwQTczNTQgKTsKLSAgICBQKCBELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDM3KSwgMHg3NjZBMEFCQiApOwotICAgIFAoIEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoMzgpLCAweDgxQzJDOTJFICk7Ci0gICAgUCggQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUigzOSksIDB4OTI3MjJDODUgKTsKLSAgICBQKCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDQwKSwgMHhBMkJGRThBMSApOwotICAgIFAoIEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoNDEpLCAweEE4MUE2NjRCICk7Ci0gICAgUCggRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUig0MiksIDB4QzI0QjhCNzAgKTsKLSAgICBQKCBGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDQzKSwgMHhDNzZDNTFBMyApOwotICAgIFAoIEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoNDQpLCAweEQxOTJFODE5ICk7Ci0gICAgUCggRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUig0NSksIDB4RDY5OTA2MjQgKTsKLSAgICBQKCBDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDQ2KSwgMHhGNDBFMzU4NSApOwotICAgIFAoIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoNDcpLCAweDEwNkFBMDcwICk7Ci0gICAgUCggQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUig0OCksIDB4MTlBNEMxMTYgKTsKLSAgICBQKCBILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDQ5KSwgMHgxRTM3NkMwOCApOwotICAgIFAoIEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoNTApLCAweDI3NDg3NzRDICk7Ci0gICAgUCggRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUig1MSksIDB4MzRCMEJDQjUgKTsKLSAgICBQKCBFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDUyKSwgMHgzOTFDMENCMyApOwotICAgIFAoIEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoNTMpLCAweDRFRDhBQTRBICk7Ci0gICAgUCggQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUig1NCksIDB4NUI5Q0NBNEYgKTsKLSAgICBQKCBCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDU1KSwgMHg2ODJFNkZGMyApOwotICAgIFAoIEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoNTYpLCAweDc0OEY4MkVFICk7Ci0gICAgUCggSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUig1NyksIDB4NzhBNTYzNkYgKTsKLSAgICBQKCBHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDU4KSwgMHg4NEM4NzgxNCApOwotICAgIFAoIEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoNTkpLCAweDhDQzcwMjA4ICk7Ci0gICAgUCggRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUig2MCksIDB4OTBCRUZGRkEgKTsKLSAgICBQKCBELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDYxKSwgMHhBNDUwNkNFQiApOwotICAgIFAoIEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoNjIpLCAweEJFRjlBM0Y3ICk7Ci0gICAgUCggQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUig2MyksIDB4QzY3MTc4RjIgKTsKLSAgICBjdHgtPnN0YXRlWzBdICs9IEE7Ci0gICAgY3R4LT5zdGF0ZVsxXSArPSBCOwotICAgIGN0eC0+c3RhdGVbMl0gKz0gQzsKLSAgICBjdHgtPnN0YXRlWzNdICs9IEQ7Ci0gICAgY3R4LT5zdGF0ZVs0XSArPSBFOwotICAgIGN0eC0+c3RhdGVbNV0gKz0gRjsKLSAgICBjdHgtPnN0YXRlWzZdICs9IEc7Ci0gICAgY3R4LT5zdGF0ZVs3XSArPSBIOwotfQotdm9pZCBDUllQVF9TSEEyNTZVcGRhdGUoIHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGlucHV0LCBGWF9EV09SRCBsZW5ndGggKQotewotICAgIHNoYTI1Nl9jb250ZXh0ICpjdHggPSAoc2hhMjU2X2NvbnRleHQgKiljb250ZXh0OwotICAgIEZYX0RXT1JEIGxlZnQsIGZpbGw7Ci0gICAgaWYoICEgbGVuZ3RoICkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxlZnQgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKLSAgICBmaWxsID0gNjQgLSBsZWZ0OwotICAgIGN0eC0+dG90YWxbMF0gKz0gbGVuZ3RoOwotICAgIGN0eC0+dG90YWxbMF0gJj0gMHhGRkZGRkZGRjsKLSAgICBpZiggY3R4LT50b3RhbFswXSA8IGxlbmd0aCApIHsKLSAgICAgICAgY3R4LT50b3RhbFsxXSsrOwotICAgIH0KLSAgICBpZiggbGVmdCAmJiBsZW5ndGggPj0gZmlsbCApIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KCAodm9pZCAqKSAoY3R4LT5idWZmZXIgKyBsZWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGlucHV0LCBmaWxsICk7Ci0gICAgICAgIHNoYTI1Nl9wcm9jZXNzKCBjdHgsIGN0eC0+YnVmZmVyICk7Ci0gICAgICAgIGxlbmd0aCAtPSBmaWxsOwotICAgICAgICBpbnB1dCAgKz0gZmlsbDsKLSAgICAgICAgbGVmdCA9IDA7Ci0gICAgfQotICAgIHdoaWxlKCBsZW5ndGggPj0gNjQgKSB7Ci0gICAgICAgIHNoYTI1Nl9wcm9jZXNzKCBjdHgsIGlucHV0ICk7Ci0gICAgICAgIGxlbmd0aCAtPSA2NDsKLSAgICAgICAgaW5wdXQgICs9IDY0OwotICAgIH0KLSAgICBpZiggbGVuZ3RoICkgewotICAgICAgICBGWFNZU19tZW1jcHkoICh2b2lkICopIChjdHgtPmJ1ZmZlciArIGxlZnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgaW5wdXQsIGxlbmd0aCApOwotICAgIH0KK3ZvaWQgQ1JZUFRfU0hBMjU2VXBkYXRlKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGlucHV0LCBGWF9EV09SRCBsZW5ndGgpIHsKKyAgc2hhMjU2X2NvbnRleHQqIGN0eCA9IChzaGEyNTZfY29udGV4dCopY29udGV4dDsKKyAgRlhfRFdPUkQgbGVmdCwgZmlsbDsKKyAgaWYgKCFsZW5ndGgpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbGVmdCA9IGN0eC0+dG90YWxbMF0gJiAweDNGOworICBmaWxsID0gNjQgLSBsZWZ0OworICBjdHgtPnRvdGFsWzBdICs9IGxlbmd0aDsKKyAgY3R4LT50b3RhbFswXSAmPSAweEZGRkZGRkZGOworICBpZiAoY3R4LT50b3RhbFswXSA8IGxlbmd0aCkgeworICAgIGN0eC0+dG90YWxbMV0rKzsKKyAgfQorICBpZiAobGVmdCAmJiBsZW5ndGggPj0gZmlsbCkgeworICAgIEZYU1lTX21lbWNweSgodm9pZCopKGN0eC0+YnVmZmVyICsgbGVmdCksICh2b2lkKilpbnB1dCwgZmlsbCk7CisgICAgc2hhMjU2X3Byb2Nlc3MoY3R4LCBjdHgtPmJ1ZmZlcik7CisgICAgbGVuZ3RoIC09IGZpbGw7CisgICAgaW5wdXQgKz0gZmlsbDsKKyAgICBsZWZ0ID0gMDsKKyAgfQorICB3aGlsZSAobGVuZ3RoID49IDY0KSB7CisgICAgc2hhMjU2X3Byb2Nlc3MoY3R4LCBpbnB1dCk7CisgICAgbGVuZ3RoIC09IDY0OworICAgIGlucHV0ICs9IDY0OworICB9CisgIGlmIChsZW5ndGgpIHsKKyAgICBGWFNZU19tZW1jcHkoKHZvaWQqKShjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCopaW5wdXQsIGxlbmd0aCk7CisgIH0KIH0KIHN0YXRpYyBjb25zdCB1aW50OF90IHNoYTI1Nl9wYWRkaW5nWzY0XSA9IHsKLSAgICAweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19Owotdm9pZCBDUllQVF9TSEEyNTZGaW5pc2goIHZvaWQqIGNvbnRleHQsIHVpbnQ4X3QgZGlnZXN0WzMyXSApCi17Ci0gICAgc2hhMjU2X2NvbnRleHQgKmN0eCA9IChzaGEyNTZfY29udGV4dCAqKWNvbnRleHQ7Ci0gICAgRlhfRFdPUkQgbGFzdCwgcGFkbjsKLSAgICBGWF9EV09SRCBoaWdoLCBsb3c7Ci0gICAgdWludDhfdCBtc2dsZW5bOF07Ci0gICAgaGlnaCA9ICggY3R4LT50b3RhbFswXSA+PiAyOSApCi0gICAgICAgICAgIHwgKCBjdHgtPnRvdGFsWzFdIDw8ICAzICk7Ci0gICAgbG93ICA9ICggY3R4LT50b3RhbFswXSA8PCAgMyApOwotICAgIFBVVF9GWF9EV09SRCggaGlnaCwgbXNnbGVuLCAwICk7Ci0gICAgUFVUX0ZYX0RXT1JEKCBsb3csICBtc2dsZW4sIDQgKTsKLSAgICBsYXN0ID0gY3R4LT50b3RhbFswXSAmIDB4M0Y7Ci0gICAgcGFkbiA9ICggbGFzdCA8IDU2ICkgPyAoIDU2IC0gbGFzdCApIDogKCAxMjAgLSBsYXN0ICk7Ci0gICAgQ1JZUFRfU0hBMjU2VXBkYXRlKCBjdHgsIHNoYTI1Nl9wYWRkaW5nLCBwYWRuICk7Ci0gICAgQ1JZUFRfU0hBMjU2VXBkYXRlKCBjdHgsIG1zZ2xlbiwgOCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVswXSwgZGlnZXN0LCAgMCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVsxXSwgZGlnZXN0LCAgNCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVsyXSwgZGlnZXN0LCAgOCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAxMiApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVs0XSwgZGlnZXN0LCAxNiApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVs1XSwgZGlnZXN0LCAyMCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVs2XSwgZGlnZXN0LCAyNCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVs3XSwgZGlnZXN0LCAyOCApOworICAgIDB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKK3ZvaWQgQ1JZUFRfU0hBMjU2RmluaXNoKHZvaWQqIGNvbnRleHQsIHVpbnQ4X3QgZGlnZXN0WzMyXSkgeworICBzaGEyNTZfY29udGV4dCogY3R4ID0gKHNoYTI1Nl9jb250ZXh0Kiljb250ZXh0OworICBGWF9EV09SRCBsYXN0LCBwYWRuOworICBGWF9EV09SRCBoaWdoLCBsb3c7CisgIHVpbnQ4X3QgbXNnbGVuWzhdOworICBoaWdoID0gKGN0eC0+dG90YWxbMF0gPj4gMjkpIHwgKGN0eC0+dG90YWxbMV0gPDwgMyk7CisgIGxvdyA9IChjdHgtPnRvdGFsWzBdIDw8IDMpOworICBQVVRfRlhfRFdPUkQoaGlnaCwgbXNnbGVuLCAwKTsKKyAgUFVUX0ZYX0RXT1JEKGxvdywgbXNnbGVuLCA0KTsKKyAgbGFzdCA9IGN0eC0+dG90YWxbMF0gJiAweDNGOworICBwYWRuID0gKGxhc3QgPCA1NikgPyAoNTYgLSBsYXN0KSA6ICgxMjAgLSBsYXN0KTsKKyAgQ1JZUFRfU0hBMjU2VXBkYXRlKGN0eCwgc2hhMjU2X3BhZGRpbmcsIHBhZG4pOworICBDUllQVF9TSEEyNTZVcGRhdGUoY3R4LCBtc2dsZW4sIDgpOworICBQVVRfRlhfRFdPUkQoY3R4LT5zdGF0ZVswXSwgZGlnZXN0LCAwKTsKKyAgUFVUX0ZYX0RXT1JEKGN0eC0+c3RhdGVbMV0sIGRpZ2VzdCwgNCk7CisgIFBVVF9GWF9EV09SRChjdHgtPnN0YXRlWzJdLCBkaWdlc3QsIDgpOworICBQVVRfRlhfRFdPUkQoY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAxMik7CisgIFBVVF9GWF9EV09SRChjdHgtPnN0YXRlWzRdLCBkaWdlc3QsIDE2KTsKKyAgUFVUX0ZYX0RXT1JEKGN0eC0+c3RhdGVbNV0sIGRpZ2VzdCwgMjApOworICBQVVRfRlhfRFdPUkQoY3R4LT5zdGF0ZVs2XSwgZGlnZXN0LCAyNCk7CisgIFBVVF9GWF9EV09SRChjdHgtPnN0YXRlWzddLCBkaWdlc3QsIDI4KTsKIH0KLXZvaWQgQ1JZUFRfU0hBMjU2R2VuZXJhdGUoY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSwgdWludDhfdCBkaWdlc3RbMzJdKQotewotICAgIHNoYTI1Nl9jb250ZXh0IGN0eDsKLSAgICBDUllQVF9TSEEyNTZTdGFydCgmY3R4KTsKLSAgICBDUllQVF9TSEEyNTZVcGRhdGUoJmN0eCwgZGF0YSwgc2l6ZSk7Ci0gICAgQ1JZUFRfU0hBMjU2RmluaXNoKCZjdHgsIGRpZ2VzdCk7Cit2b2lkIENSWVBUX1NIQTI1NkdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlnZXN0WzMyXSkgeworICBzaGEyNTZfY29udGV4dCBjdHg7CisgIENSWVBUX1NIQTI1NlN0YXJ0KCZjdHgpOworICBDUllQVF9TSEEyNTZVcGRhdGUoJmN0eCwgZGF0YSwgc2l6ZSk7CisgIENSWVBUX1NIQTI1NkZpbmlzaCgmY3R4LCBkaWdlc3QpOwogfQogdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQ2NF90CXRvdGFsWzJdOwotICAgIHVpbnQ2NF90CXN0YXRlWzhdOwotICAgIHVpbnQ4X3QJCWJ1ZmZlclsxMjhdOworICB1aW50NjRfdCB0b3RhbFsyXTsKKyAgdWludDY0X3Qgc3RhdGVbOF07CisgIHVpbnQ4X3QgYnVmZmVyWzEyOF07CiB9IHNoYTM4NF9jb250ZXh0OwotdWludDY0X3QgRlhfYXRvNjRpKGNvbnN0IEZYX0NIQVIqIHN0cikKLXsKLSAgICBGWFNZU19hc3NlcnQoc3RyICE9IE5VTEwpOwotICAgIHVpbnQ2NF90IHJldCA9IDA7Ci0gICAgaW50IGxlbiA9IChpbnQpRlhTWVNfc3RybGVuKHN0cik7Ci0gICAgbGVuID0gbGVuID4gMTYgPyAxNiA6IGxlbjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0gICAgICAgIGlmIChpKSB7Ci0gICAgICAgICAgICByZXQgPDw9IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cltpXSA+PSAnMCcgJiYgc3RyW2ldIDw9ICc5JykgewotICAgICAgICAgICAgcmV0IHw9IChzdHJbaV0gLSAnMCcpICYgMHhGRjsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPj0gJ2EnICYmIHN0cltpXSA8PSAnZicpIHsKLSAgICAgICAgICAgIHJldCB8PSAoc3RyW2ldIC0gJ2EnICsgMTApICYgMHhGRjsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPj0gJ0EnICYmIHN0cltpXSA8PSAnRicpIHsKLSAgICAgICAgICAgIHJldCB8PSAoc3RyW2ldIC0gJ0EnICsgMTApICYgMHhGRjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7Ci0gICAgICAgIH0KK3VpbnQ2NF90IEZYX2F0bzY0aShjb25zdCBGWF9DSEFSKiBzdHIpIHsKKyAgRlhTWVNfYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKyAgdWludDY0X3QgcmV0ID0gMDsKKyAgaW50IGxlbiA9IChpbnQpRlhTWVNfc3RybGVuKHN0cik7CisgIGxlbiA9IGxlbiA+IDE2ID8gMTYgOiBsZW47CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICBpZiAoaSkgeworICAgICAgcmV0IDw8PSA0OwogICAgIH0KLSAgICByZXR1cm4gcmV0OworICAgIGlmIChzdHJbaV0gPj0gJzAnICYmIHN0cltpXSA8PSAnOScpIHsKKyAgICAgIHJldCB8PSAoc3RyW2ldIC0gJzAnKSAmIDB4RkY7CisgICAgfSBlbHNlIGlmIChzdHJbaV0gPj0gJ2EnICYmIHN0cltpXSA8PSAnZicpIHsKKyAgICAgIHJldCB8PSAoc3RyW2ldIC0gJ2EnICsgMTApICYgMHhGRjsKKyAgICB9IGVsc2UgaWYgKHN0cltpXSA+PSAnQScgJiYgc3RyW2ldIDw9ICdGJykgeworICAgICAgcmV0IHw9IChzdHJbaV0gLSAnQScgKyAxMCkgJiAweEZGOworICAgIH0gZWxzZSB7CisgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOworICAgIH0KKyAgfQorICByZXR1cm4gcmV0OwogfQotdm9pZCBDUllQVF9TSEEzODRTdGFydCh2b2lkKiBjb250ZXh0KQotewotICAgIGlmIChjb250ZXh0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzaGEzODRfY29udGV4dCAqY3R4ID0gKHNoYTM4NF9jb250ZXh0ICopY29udGV4dDsKLSAgICBGWFNZU19tZW1zZXQoY3R4LCAwLCBzaXplb2Yoc2hhMzg0X2NvbnRleHQpKTsKLSAgICBjdHgtPnN0YXRlWzBdID0gRlhfYXRvNjRpKCJjYmJiOWQ1ZGMxMDU5ZWQ4Iik7Ci0gICAgY3R4LT5zdGF0ZVsxXSA9IEZYX2F0bzY0aSgiNjI5YTI5MmEzNjdjZDUwNyIpOwotICAgIGN0eC0+c3RhdGVbMl0gPSBGWF9hdG82NGkoIjkxNTkwMTVhMzA3MGRkMTciKTsKLSAgICBjdHgtPnN0YXRlWzNdID0gRlhfYXRvNjRpKCIxNTJmZWNkOGY3MGU1OTM5Iik7Ci0gICAgY3R4LT5zdGF0ZVs0XSA9IEZYX2F0bzY0aSgiNjczMzI2NjdmZmMwMGIzMSIpOwotICAgIGN0eC0+c3RhdGVbNV0gPSBGWF9hdG82NGkoIjhlYjQ0YTg3Njg1ODE1MTEiKTsKLSAgICBjdHgtPnN0YXRlWzZdID0gRlhfYXRvNjRpKCJkYjBjMmUwZDY0Zjk4ZmE3Iik7Ci0gICAgY3R4LT5zdGF0ZVs3XSA9IEZYX2F0bzY0aSgiNDdiNTQ4MWRiZWZhNGZhNCIpOwordm9pZCBDUllQVF9TSEEzODRTdGFydCh2b2lkKiBjb250ZXh0KSB7CisgIGlmIChjb250ZXh0ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2hhMzg0X2NvbnRleHQqIGN0eCA9IChzaGEzODRfY29udGV4dCopY29udGV4dDsKKyAgRlhTWVNfbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKHNoYTM4NF9jb250ZXh0KSk7CisgIGN0eC0+c3RhdGVbMF0gPSBGWF9hdG82NGkoImNiYmI5ZDVkYzEwNTllZDgiKTsKKyAgY3R4LT5zdGF0ZVsxXSA9IEZYX2F0bzY0aSgiNjI5YTI5MmEzNjdjZDUwNyIpOworICBjdHgtPnN0YXRlWzJdID0gRlhfYXRvNjRpKCI5MTU5MDE1YTMwNzBkZDE3Iik7CisgIGN0eC0+c3RhdGVbM10gPSBGWF9hdG82NGkoIjE1MmZlY2Q4ZjcwZTU5MzkiKTsKKyAgY3R4LT5zdGF0ZVs0XSA9IEZYX2F0bzY0aSgiNjczMzI2NjdmZmMwMGIzMSIpOworICBjdHgtPnN0YXRlWzVdID0gRlhfYXRvNjRpKCI4ZWI0NGE4NzY4NTgxNTExIik7CisgIGN0eC0+c3RhdGVbNl0gPSBGWF9hdG82NGkoImRiMGMyZTBkNjRmOThmYTciKTsKKyAgY3R4LT5zdGF0ZVs3XSA9IEZYX2F0bzY0aSgiNDdiNTQ4MWRiZWZhNGZhNCIpOwogfQotI2RlZmluZSBTSEEzODRfRjAoeCx5LHopICgoeCAmIHkpIHwgKHogJiAoeCB8IHkpKSkKLSNkZWZpbmUgU0hBMzg0X0YxKHgseSx6KSAoeiBeICh4ICYgKHkgXiB6KSkpCi0jZGVmaW5lIFNIQTM4NF9TSFIoeCxuKSAoeCA+PiBuKQotI2RlZmluZSBTSEEzODRfUk9UUih4LG4pIChTSEEzODRfU0hSKHgsIG4pIHwgeCA8PCAoNjQgLSBuKSkKLSNkZWZpbmUgU0hBMzg0X1MwKHgpIChTSEEzODRfUk9UUih4LCAxKSBeIFNIQTM4NF9ST1RSKHgsIDgpIF4gIFNIQTM4NF9TSFIoeCwgNykpCi0jZGVmaW5lIFNIQTM4NF9TMSh4KSAoU0hBMzg0X1JPVFIoeCwxOSkgXiBTSEEzODRfUk9UUih4LCA2MSkgXiAgU0hBMzg0X1NIUih4LCA2KSkKLSNkZWZpbmUgU0hBMzg0X1MyKHgpIChTSEEzODRfUk9UUih4LCAyOCkgXiBTSEEzODRfUk9UUih4LCAzNCkgXiBTSEEzODRfUk9UUih4LCAzOSkpCi0jZGVmaW5lIFNIQTM4NF9TMyh4KSAoU0hBMzg0X1JPVFIoeCwgMTQpIF4gU0hBMzg0X1JPVFIoeCwxOCkgXiBTSEEzODRfUk9UUih4LCA0MSkpCi0jZGVmaW5lIFNIQTM4NF9QKGEsYixjLGQsZSxmLGcsaCx4LEspCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJCQkJCQkJCVwKLSAgICAgICAgdGVtcDEgPSBoICsgU0hBMzg0X1MzKGUpICsgU0hBMzg0X0YxKGUsZixnKSArIEsgKyB4OwkJXAotICAgICAgICB0ZW1wMiA9IFNIQTM4NF9TMihhKSArIFNIQTM4NF9GMChhLGIsYyk7CQkJCQlcCi0gICAgICAgIGQgKz0gdGVtcDE7IGggPSB0ZW1wMSArIHRlbXAyOwkJCQkJCQkJXAotICAgIH0KKyNkZWZpbmUgU0hBMzg0X0YwKHgsIHksIHopICgoeCAmIHkpIHwgKHogJiAoeCB8IHkpKSkKKyNkZWZpbmUgU0hBMzg0X0YxKHgsIHksIHopICh6IF4gKHggJiAoeSBeIHopKSkKKyNkZWZpbmUgU0hBMzg0X1NIUih4LCBuKSAoeCA+PiBuKQorI2RlZmluZSBTSEEzODRfUk9UUih4LCBuKSAoU0hBMzg0X1NIUih4LCBuKSB8IHggPDwgKDY0IC0gbikpCisjZGVmaW5lIFNIQTM4NF9TMCh4KSAoU0hBMzg0X1JPVFIoeCwgMSkgXiBTSEEzODRfUk9UUih4LCA4KSBeIFNIQTM4NF9TSFIoeCwgNykpCisjZGVmaW5lIFNIQTM4NF9TMSh4KSBcCisgIChTSEEzODRfUk9UUih4LCAxOSkgXiBTSEEzODRfUk9UUih4LCA2MSkgXiBTSEEzODRfU0hSKHgsIDYpKQorI2RlZmluZSBTSEEzODRfUzIoeCkgXAorICAoU0hBMzg0X1JPVFIoeCwgMjgpIF4gU0hBMzg0X1JPVFIoeCwgMzQpIF4gU0hBMzg0X1JPVFIoeCwgMzkpKQorI2RlZmluZSBTSEEzODRfUzMoeCkgXAorICAoU0hBMzg0X1JPVFIoeCwgMTQpIF4gU0hBMzg0X1JPVFIoeCwgMTgpIF4gU0hBMzg0X1JPVFIoeCwgNDEpKQorI2RlZmluZSBTSEEzODRfUChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCB4LCBLKSAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMSA9IGggKyBTSEEzODRfUzMoZSkgKyBTSEEzODRfRjEoZSwgZiwgZykgKyBLICsgeDsgXAorICAgIHRlbXAyID0gU0hBMzg0X1MyKGEpICsgU0hBMzg0X0YwKGEsIGIsIGMpOyAgICAgICAgICAgICBcCisgICAgZCArPSB0ZW1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBoID0gdGVtcDEgKyB0ZW1wMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiBzdGF0aWMgY29uc3QgdWludDhfdCBzaGEzODRfcGFkZGluZ1sxMjhdID0gewotICAgIDB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIH07Ci0jZGVmaW5lIFNIQTM4NF9SKHQpIChXW3RdID0gU0hBMzg0X1MxKFdbdCAtICAyXSkgKyBXW3QgLSAgN10gKyBTSEEzODRfUzAoV1t0IC0gMTVdKSArIFdbdCAtIDE2XSkKKyNkZWZpbmUgU0hBMzg0X1IodCkgXAorICAoV1t0XSA9IFNIQTM4NF9TMShXW3QgLSAyXSkgKyBXW3QgLSA3XSArIFNIQTM4NF9TMChXW3QgLSAxNV0pICsgV1t0IC0gMTZdKQogc3RhdGljIGNvbnN0IEZYX0NIQVIqIGNvbnN0YW50c1tdID0gewotICAgICI0MjhhMmY5OGQ3MjhhZTIyIiwKLSAgICAiNzEzNzQ0OTEyM2VmNjVjZCIsCi0gICAgImI1YzBmYmNmZWM0ZDNiMmYiLAotICAgICJlOWI1ZGJhNTgxODlkYmJjIiwKLSAgICAiMzk1NmMyNWJmMzQ4YjUzOCIsCi0gICAgIjU5ZjExMWYxYjYwNWQwMTkiLAotICAgICI5MjNmODJhNGFmMTk0ZjliIiwKLSAgICAiYWIxYzVlZDVkYTZkODExOCIsCi0gICAgImQ4MDdhYTk4YTMwMzAyNDIiLAotICAgICIxMjgzNWIwMTQ1NzA2ZmJlIiwKLSAgICAiMjQzMTg1YmU0ZWU0YjI4YyIsCi0gICAgIjU1MGM3ZGMzZDVmZmI0ZTIiLAotICAgICI3MmJlNWQ3NGYyN2I4OTZmIiwKLSAgICAiODBkZWIxZmUzYjE2OTZiMSIsCi0gICAgIjliZGMwNmE3MjVjNzEyMzUiLAotICAgICJjMTliZjE3NGNmNjkyNjk0IiwKLSAgICAiZTQ5YjY5YzE5ZWYxNGFkMiIsCi0gICAgImVmYmU0Nzg2Mzg0ZjI1ZTMiLAotICAgICIwZmMxOWRjNjhiOGNkNWI1IiwKLSAgICAiMjQwY2ExY2M3N2FjOWM2NSIsCi0gICAgIjJkZTkyYzZmNTkyYjAyNzUiLAotICAgICI0YTc0ODRhYTZlYTZlNDgzIiwKLSAgICAiNWNiMGE5ZGNiZDQxZmJkNCIsCi0gICAgIjc2Zjk4OGRhODMxMTUzYjUiLAotICAgICI5ODNlNTE1MmVlNjZkZmFiIiwKLSAgICAiYTgzMWM2NmQyZGI0MzIxMCIsCi0gICAgImIwMDMyN2M4OThmYjIxM2YiLAotICAgICJiZjU5N2ZjN2JlZWYwZWU0IiwKLSAgICAiYzZlMDBiZjMzZGE4OGZjMiIsCi0gICAgImQ1YTc5MTQ3OTMwYWE3MjUiLAotICAgICIwNmNhNjM1MWUwMDM4MjZmIiwKLSAgICAiMTQyOTI5NjcwYTBlNmU3MCIsCi0gICAgIjI3YjcwYTg1NDZkMjJmZmMiLAotICAgICIyZTFiMjEzODVjMjZjOTI2IiwKLSAgICAiNGQyYzZkZmM1YWM0MmFlZCIsCi0gICAgIjUzMzgwZDEzOWQ5NWIzZGYiLAotICAgICI2NTBhNzM1NDhiYWY2M2RlIiwKLSAgICAiNzY2YTBhYmIzYzc3YjJhOCIsCi0gICAgIjgxYzJjOTJlNDdlZGFlZTYiLAotICAgICI5MjcyMmM4NTE0ODIzNTNiIiwKLSAgICAiYTJiZmU4YTE0Y2YxMDM2NCIsCi0gICAgImE4MWE2NjRiYmM0MjMwMDEiLAotICAgICJjMjRiOGI3MGQwZjg5NzkxIiwKLSAgICAiYzc2YzUxYTMwNjU0YmUzMCIsCi0gICAgImQxOTJlODE5ZDZlZjUyMTgiLAotICAgICJkNjk5MDYyNDU1NjVhOTEwIiwKLSAgICAiZjQwZTM1ODU1NzcxMjAyYSIsCi0gICAgIjEwNmFhMDcwMzJiYmQxYjgiLAotICAgICIxOWE0YzExNmI4ZDJkMGM4IiwKLSAgICAiMWUzNzZjMDg1MTQxYWI1MyIsCi0gICAgIjI3NDg3NzRjZGY4ZWViOTkiLAotICAgICIzNGIwYmNiNWUxOWI0OGE4IiwKLSAgICAiMzkxYzBjYjNjNWM5NWE2MyIsCi0gICAgIjRlZDhhYTRhZTM0MThhY2IiLAotICAgICI1YjljY2E0Zjc3NjNlMzczIiwKLSAgICAiNjgyZTZmZjNkNmIyYjhhMyIsCi0gICAgIjc0OGY4MmVlNWRlZmIyZmMiLAotICAgICI3OGE1NjM2ZjQzMTcyZjYwIiwKLSAgICAiODRjODc4MTRhMWYwYWI3MiIsCi0gICAgIjhjYzcwMjA4MWE2NDM5ZWMiLAotICAgICI5MGJlZmZmYTIzNjMxZTI4IiwKLSAgICAiYTQ1MDZjZWJkZTgyYmRlOSIsCi0gICAgImJlZjlhM2Y3YjJjNjc5MTUiLAotICAgICJjNjcxNzhmMmUzNzI1MzJiIiwKLSAgICAiY2EyNzNlY2VlYTI2NjE5YyIsCi0gICAgImQxODZiOGM3MjFjMGMyMDciLAotICAgICJlYWRhN2RkNmNkZTBlYjFlIiwKLSAgICAiZjU3ZDRmN2ZlZTZlZDE3OCIsCi0gICAgIjA2ZjA2N2FhNzIxNzZmYmEiLAotICAgICIwYTYzN2RjNWEyYzg5OGE2IiwKLSAgICAiMTEzZjk4MDRiZWY5MGRhZSIsCi0gICAgIjFiNzEwYjM1MTMxYzQ3MWIiLAotICAgICIyOGRiNzdmNTIzMDQ3ZDg0IiwKLSAgICAiMzJjYWFiN2I0MGM3MjQ5MyIsCi0gICAgIjNjOWViZTBhMTVjOWJlYmMiLAotICAgICI0MzFkNjdjNDljMTAwZDRjIiwKLSAgICAiNGNjNWQ0YmVjYjNlNDJiNiIsCi0gICAgIjU5N2YyOTljZmM2NTdlMmEiLAotICAgICI1ZmNiNmZhYjNhZDZmYWVjIiwKLSAgICAiNmM0NDE5OGM0YTQ3NTgxNyIsCisgICAgIjQyOGEyZjk4ZDcyOGFlMjIiLCAiNzEzNzQ0OTEyM2VmNjVjZCIsICJiNWMwZmJjZmVjNGQzYjJmIiwKKyAgICAiZTliNWRiYTU4MTg5ZGJiYyIsICIzOTU2YzI1YmYzNDhiNTM4IiwgIjU5ZjExMWYxYjYwNWQwMTkiLAorICAgICI5MjNmODJhNGFmMTk0ZjliIiwgImFiMWM1ZWQ1ZGE2ZDgxMTgiLCAiZDgwN2FhOThhMzAzMDI0MiIsCisgICAgIjEyODM1YjAxNDU3MDZmYmUiLCAiMjQzMTg1YmU0ZWU0YjI4YyIsICI1NTBjN2RjM2Q1ZmZiNGUyIiwKKyAgICAiNzJiZTVkNzRmMjdiODk2ZiIsICI4MGRlYjFmZTNiMTY5NmIxIiwgIjliZGMwNmE3MjVjNzEyMzUiLAorICAgICJjMTliZjE3NGNmNjkyNjk0IiwgImU0OWI2OWMxOWVmMTRhZDIiLCAiZWZiZTQ3ODYzODRmMjVlMyIsCisgICAgIjBmYzE5ZGM2OGI4Y2Q1YjUiLCAiMjQwY2ExY2M3N2FjOWM2NSIsICIyZGU5MmM2ZjU5MmIwMjc1IiwKKyAgICAiNGE3NDg0YWE2ZWE2ZTQ4MyIsICI1Y2IwYTlkY2JkNDFmYmQ0IiwgIjc2Zjk4OGRhODMxMTUzYjUiLAorICAgICI5ODNlNTE1MmVlNjZkZmFiIiwgImE4MzFjNjZkMmRiNDMyMTAiLCAiYjAwMzI3Yzg5OGZiMjEzZiIsCisgICAgImJmNTk3ZmM3YmVlZjBlZTQiLCAiYzZlMDBiZjMzZGE4OGZjMiIsICJkNWE3OTE0NzkzMGFhNzI1IiwKKyAgICAiMDZjYTYzNTFlMDAzODI2ZiIsICIxNDI5Mjk2NzBhMGU2ZTcwIiwgIjI3YjcwYTg1NDZkMjJmZmMiLAorICAgICIyZTFiMjEzODVjMjZjOTI2IiwgIjRkMmM2ZGZjNWFjNDJhZWQiLCAiNTMzODBkMTM5ZDk1YjNkZiIsCisgICAgIjY1MGE3MzU0OGJhZjYzZGUiLCAiNzY2YTBhYmIzYzc3YjJhOCIsICI4MWMyYzkyZTQ3ZWRhZWU2IiwKKyAgICAiOTI3MjJjODUxNDgyMzUzYiIsICJhMmJmZThhMTRjZjEwMzY0IiwgImE4MWE2NjRiYmM0MjMwMDEiLAorICAgICJjMjRiOGI3MGQwZjg5NzkxIiwgImM3NmM1MWEzMDY1NGJlMzAiLCAiZDE5MmU4MTlkNmVmNTIxOCIsCisgICAgImQ2OTkwNjI0NTU2NWE5MTAiLCAiZjQwZTM1ODU1NzcxMjAyYSIsICIxMDZhYTA3MDMyYmJkMWI4IiwKKyAgICAiMTlhNGMxMTZiOGQyZDBjOCIsICIxZTM3NmMwODUxNDFhYjUzIiwgIjI3NDg3NzRjZGY4ZWViOTkiLAorICAgICIzNGIwYmNiNWUxOWI0OGE4IiwgIjM5MWMwY2IzYzVjOTVhNjMiLCAiNGVkOGFhNGFlMzQxOGFjYiIsCisgICAgIjViOWNjYTRmNzc2M2UzNzMiLCAiNjgyZTZmZjNkNmIyYjhhMyIsICI3NDhmODJlZTVkZWZiMmZjIiwKKyAgICAiNzhhNTYzNmY0MzE3MmY2MCIsICI4NGM4NzgxNGExZjBhYjcyIiwgIjhjYzcwMjA4MWE2NDM5ZWMiLAorICAgICI5MGJlZmZmYTIzNjMxZTI4IiwgImE0NTA2Y2ViZGU4MmJkZTkiLCAiYmVmOWEzZjdiMmM2NzkxNSIsCisgICAgImM2NzE3OGYyZTM3MjUzMmIiLCAiY2EyNzNlY2VlYTI2NjE5YyIsICJkMTg2YjhjNzIxYzBjMjA3IiwKKyAgICAiZWFkYTdkZDZjZGUwZWIxZSIsICJmNTdkNGY3ZmVlNmVkMTc4IiwgIjA2ZjA2N2FhNzIxNzZmYmEiLAorICAgICIwYTYzN2RjNWEyYzg5OGE2IiwgIjExM2Y5ODA0YmVmOTBkYWUiLCAiMWI3MTBiMzUxMzFjNDcxYiIsCisgICAgIjI4ZGI3N2Y1MjMwNDdkODQiLCAiMzJjYWFiN2I0MGM3MjQ5MyIsICIzYzllYmUwYTE1YzliZWJjIiwKKyAgICAiNDMxZDY3YzQ5YzEwMGQ0YyIsICI0Y2M1ZDRiZWNiM2U0MmI2IiwgIjU5N2YyOTljZmM2NTdlMmEiLAorICAgICI1ZmNiNmZhYjNhZDZmYWVjIiwgIjZjNDQxOThjNGE0NzU4MTciLAogfTsKLSNkZWZpbmUgR0VUX0ZYXzY0V09SRChuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChuKSA9ICggKHVpbnQ2NF90KSAoYilbKGkpICAgIF0gPDwgNTYgKSAgICAgICBcCi0gICAgICAgICAgICAgIHwgKCAodWludDY0X3QpIChiKVsoaSkgKyAxXSA8PCA0OCApICAgICAgIFwKLSAgICAgICAgICAgICAgfCAoICh1aW50NjRfdCkgKGIpWyhpKSArIDJdIDw8IDQwICkgICAgICAgXAotICAgICAgICAgICAgICB8ICggKHVpbnQ2NF90KSAoYilbKGkpICsgM10gPDwgMzIgKSAgICAgIFwKLSAgICAgICAgICAgICAgfCAoICh1aW50NjRfdCkgKGIpWyhpKSArIDRdIDw8IDI0ICkgICAgICAgXAotICAgICAgICAgICAgICB8ICggKHVpbnQ2NF90KSAoYilbKGkpICsgNV0gPDwgMTYgKSAgICAgICBcCi0gICAgICAgICAgICAgIHwgKCAodWludDY0X3QpIChiKVsoaSkgKyA2XSA8PCAgOCApICAgICAgIFwKLSAgICAgICAgICAgICAgfCAoICh1aW50NjRfdCkgKGIpWyhpKSArIDddICAgICAgICk7ICAgICAgXAorI2RlZmluZSBHRVRfRlhfNjRXT1JEKG4sIGIsIGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKG4pID0gKCh1aW50NjRfdCkoYilbKGkpXSA8PCA1NikgfCAoKHVpbnQ2NF90KShiKVsoaSkgKyAxXSA8PCA0OCkgfCAgICAgXAorICAgICAgICAgICgodWludDY0X3QpKGIpWyhpKSArIDJdIDw8IDQwKSB8ICgodWludDY0X3QpKGIpWyhpKSArIDNdIDw8IDMyKSB8IFwKKyAgICAgICAgICAoKHVpbnQ2NF90KShiKVsoaSkgKyA0XSA8PCAyNCkgfCAoKHVpbnQ2NF90KShiKVsoaSkgKyA1XSA8PCAxNikgfCBcCisgICAgICAgICAgKCh1aW50NjRfdCkoYilbKGkpICsgNl0gPDwgOCkgfCAoKHVpbnQ2NF90KShiKVsoaSkgKyA3XSk7ICAgICAgICAgXAorICB9CisjZGVmaW5lIFBVVF9GWF82NERXT1JEKG4sIGIsIGkpICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChiKVsoaSldID0gKHVpbnQ4X3QpKChuKSA+PiA1Nik7ICAgICBcCisgICAgKGIpWyhpKSArIDFdID0gKHVpbnQ4X3QpKChuKSA+PiA0OCk7IFwKKyAgICAoYilbKGkpICsgMl0gPSAodWludDhfdCkoKG4pID4+IDQwKTsgXAorICAgIChiKVsoaSkgKyAzXSA9ICh1aW50OF90KSgobikgPj4gMzIpOyBcCisgICAgKGIpWyhpKSArIDRdID0gKHVpbnQ4X3QpKChuKSA+PiAyNCk7IFwKKyAgICAoYilbKGkpICsgNV0gPSAodWludDhfdCkoKG4pID4+IDE2KTsgXAorICAgIChiKVsoaSkgKyA2XSA9ICh1aW50OF90KSgobikgPj4gOCk7ICBcCisgICAgKGIpWyhpKSArIDddID0gKHVpbnQ4X3QpKChuKSk7ICAgICAgIFwKKyAgfQorc3RhdGljIHZvaWQgc2hhMzg0X3Byb2Nlc3Moc2hhMzg0X2NvbnRleHQqIGN0eCwgY29uc3QgdWludDhfdCBkYXRhWzEyOF0pIHsKKyAgdWludDY0X3QgdGVtcDEsIHRlbXAyOworICB1aW50NjRfdCBBLCBCLCBDLCBELCBFLCBGLCBHLCBIOworICB1aW50NjRfdCBXWzgwXTsKKyAgR0VUX0ZYXzY0V09SRChXWzBdLCBkYXRhLCAwKTsKKyAgR0VUX0ZYXzY0V09SRChXWzFdLCBkYXRhLCA4KTsKKyAgR0VUX0ZYXzY0V09SRChXWzJdLCBkYXRhLCAxNik7CisgIEdFVF9GWF82NFdPUkQoV1szXSwgZGF0YSwgMjQpOworICBHRVRfRlhfNjRXT1JEKFdbNF0sIGRhdGEsIDMyKTsKKyAgR0VUX0ZYXzY0V09SRChXWzVdLCBkYXRhLCA0MCk7CisgIEdFVF9GWF82NFdPUkQoV1s2XSwgZGF0YSwgNDgpOworICBHRVRfRlhfNjRXT1JEKFdbN10sIGRhdGEsIDU2KTsKKyAgR0VUX0ZYXzY0V09SRChXWzhdLCBkYXRhLCA2NCk7CisgIEdFVF9GWF82NFdPUkQoV1s5XSwgZGF0YSwgNzIpOworICBHRVRfRlhfNjRXT1JEKFdbMTBdLCBkYXRhLCA4MCk7CisgIEdFVF9GWF82NFdPUkQoV1sxMV0sIGRhdGEsIDg4KTsKKyAgR0VUX0ZYXzY0V09SRChXWzEyXSwgZGF0YSwgOTYpOworICBHRVRfRlhfNjRXT1JEKFdbMTNdLCBkYXRhLCAxMDQpOworICBHRVRfRlhfNjRXT1JEKFdbMTRdLCBkYXRhLCAxMTIpOworICBHRVRfRlhfNjRXT1JEKFdbMTVdLCBkYXRhLCAxMjApOworICBBID0gY3R4LT5zdGF0ZVswXTsKKyAgQiA9IGN0eC0+c3RhdGVbMV07CisgIEMgPSBjdHgtPnN0YXRlWzJdOworICBEID0gY3R4LT5zdGF0ZVszXTsKKyAgRSA9IGN0eC0+c3RhdGVbNF07CisgIEYgPSBjdHgtPnN0YXRlWzVdOworICBHID0gY3R4LT5zdGF0ZVs2XTsKKyAgSCA9IGN0eC0+c3RhdGVbN107CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIHVpbnQ2NF90IHRlbXBbOF07CisgICAgaWYgKGkgPCAyKSB7CisgICAgICB0ZW1wWzBdID0gV1tpICogOF07CisgICAgICB0ZW1wWzFdID0gV1tpICogOCArIDFdOworICAgICAgdGVtcFsyXSA9IFdbaSAqIDggKyAyXTsKKyAgICAgIHRlbXBbM10gPSBXW2kgKiA4ICsgM107CisgICAgICB0ZW1wWzRdID0gV1tpICogOCArIDRdOworICAgICAgdGVtcFs1XSA9IFdbaSAqIDggKyA1XTsKKyAgICAgIHRlbXBbNl0gPSBXW2kgKiA4ICsgNl07CisgICAgICB0ZW1wWzddID0gV1tpICogOCArIDddOworICAgIH0gZWxzZSB7CisgICAgICB0ZW1wWzBdID0gU0hBMzg0X1IoaSAqIDgpOworICAgICAgdGVtcFsxXSA9IFNIQTM4NF9SKGkgKiA4ICsgMSk7CisgICAgICB0ZW1wWzJdID0gU0hBMzg0X1IoaSAqIDggKyAyKTsKKyAgICAgIHRlbXBbM10gPSBTSEEzODRfUihpICogOCArIDMpOworICAgICAgdGVtcFs0XSA9IFNIQTM4NF9SKGkgKiA4ICsgNCk7CisgICAgICB0ZW1wWzVdID0gU0hBMzg0X1IoaSAqIDggKyA1KTsKKyAgICAgIHRlbXBbNl0gPSBTSEEzODRfUihpICogOCArIDYpOworICAgICAgdGVtcFs3XSA9IFNIQTM4NF9SKGkgKiA4ICsgNyk7CiAgICAgfQotI2RlZmluZSBQVVRfRlhfNjREV09SRChuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChiKVsoaSkgICAgXSA9ICh1aW50OF90KSAoIChuKSA+PiA1NiApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyAxXSA9ICh1aW50OF90KSAoIChuKSA+PiA0OCApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyAyXSA9ICh1aW50OF90KSAoIChuKSA+PiA0MCApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyAzXSA9ICh1aW50OF90KSAoIChuKSA+PiAzMiApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyA0XSA9ICh1aW50OF90KSAoIChuKSA+PiAyNCApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyA1XSA9ICh1aW50OF90KSAoIChuKSA+PiAxNiApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyA2XSA9ICh1aW50OF90KSAoIChuKSA+PiAgOCApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyA3XSA9ICh1aW50OF90KSAoIChuKSApOyAgICAgICBcCi0gICAgfQotc3RhdGljIHZvaWQgc2hhMzg0X3Byb2Nlc3MoIHNoYTM4NF9jb250ZXh0ICpjdHgsIGNvbnN0IHVpbnQ4X3QgZGF0YVsxMjhdICkKLXsKLSAgICB1aW50NjRfdCB0ZW1wMSwgdGVtcDI7Ci0gICAgdWludDY0X3QgQSwgQiwgQywgRCwgRSwgRiwgRywgSDsKLSAgICB1aW50NjRfdCBXWzgwXTsKLSAgICBHRVRfRlhfNjRXT1JEKFdbMF0sIGRhdGEsIDApOwotICAgIEdFVF9GWF82NFdPUkQoV1sxXSwgZGF0YSwgOCk7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzJdLCBkYXRhLCAxNik7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzNdLCBkYXRhLCAyNCk7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzRdLCBkYXRhLCAzMik7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzVdLCBkYXRhLCA0MCk7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzZdLCBkYXRhLCA0OCk7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzddLCBkYXRhLCA1Nik7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzhdLCBkYXRhLCA2NCk7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzldLCBkYXRhLCA3Mik7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzEwXSwgZGF0YSwgODApOwotICAgIEdFVF9GWF82NFdPUkQoV1sxMV0sIGRhdGEsIDg4KTsKLSAgICBHRVRfRlhfNjRXT1JEKFdbMTJdLCBkYXRhLCA5Nik7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzEzXSwgZGF0YSwgMTA0KTsKLSAgICBHRVRfRlhfNjRXT1JEKFdbMTRdLCBkYXRhLCAxMTIpOwotICAgIEdFVF9GWF82NFdPUkQoV1sxNV0sIGRhdGEsIDEyMCk7Ci0gICAgQSA9IGN0eC0+c3RhdGVbMF07Ci0gICAgQiA9IGN0eC0+c3RhdGVbMV07Ci0gICAgQyA9IGN0eC0+c3RhdGVbMl07Ci0gICAgRCA9IGN0eC0+c3RhdGVbM107Ci0gICAgRSA9IGN0eC0+c3RhdGVbNF07Ci0gICAgRiA9IGN0eC0+c3RhdGVbNV07Ci0gICAgRyA9IGN0eC0+c3RhdGVbNl07Ci0gICAgSCA9IGN0eC0+c3RhdGVbN107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7Ci0gICAgICAgIHVpbnQ2NF90IHRlbXBbOF07Ci0gICAgICAgIGlmIChpIDwgMikgewotICAgICAgICAgICAgdGVtcFswXSA9IFdbaSAqIDhdOwotICAgICAgICAgICAgdGVtcFsxXSA9IFdbaSAqIDggKyAxXTsKLSAgICAgICAgICAgIHRlbXBbMl0gPSBXW2kgKiA4ICsgMl07Ci0gICAgICAgICAgICB0ZW1wWzNdID0gV1tpICogOCArIDNdOwotICAgICAgICAgICAgdGVtcFs0XSA9IFdbaSAqIDggKyA0XTsKLSAgICAgICAgICAgIHRlbXBbNV0gPSBXW2kgKiA4ICsgNV07Ci0gICAgICAgICAgICB0ZW1wWzZdID0gV1tpICogOCArIDZdOwotICAgICAgICAgICAgdGVtcFs3XSA9IFdbaSAqIDggKyA3XTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRlbXBbMF0gPSBTSEEzODRfUihpICogOCk7Ci0gICAgICAgICAgICB0ZW1wWzFdID0gU0hBMzg0X1IoaSAqIDggKyAxKTsKLSAgICAgICAgICAgIHRlbXBbMl0gPSBTSEEzODRfUihpICogOCArIDIpOwotICAgICAgICAgICAgdGVtcFszXSA9IFNIQTM4NF9SKGkgKiA4ICsgMyk7Ci0gICAgICAgICAgICB0ZW1wWzRdID0gU0hBMzg0X1IoaSAqIDggKyA0KTsKLSAgICAgICAgICAgIHRlbXBbNV0gPSBTSEEzODRfUihpICogOCArIDUpOwotICAgICAgICAgICAgdGVtcFs2XSA9IFNIQTM4NF9SKGkgKiA4ICsgNik7Ci0gICAgICAgICAgICB0ZW1wWzddID0gU0hBMzg0X1IoaSAqIDggKyA3KTsKLSAgICAgICAgfQotICAgICAgICBTSEEzODRfUCggQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgdGVtcFsgMF0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggICAgXSkgKTsKLSAgICAgICAgU0hBMzg0X1AoIEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIHRlbXBbIDFdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgMV0pICk7Ci0gICAgICAgIFNIQTM4NF9QKCBHLCBILCBBLCBCLCBDLCBELCBFLCBGLCB0ZW1wWyAyXSwgRlhfYXRvNjRpKGNvbnN0YW50c1tpICogOCArIDJdKSApOwotICAgICAgICBTSEEzODRfUCggRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgdGVtcFsgM10sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyAzXSkgKTsKLSAgICAgICAgU0hBMzg0X1AoIEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIHRlbXBbIDRdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgNF0pICk7Ci0gICAgICAgIFNIQTM4NF9QKCBELCBFLCBGLCBHLCBILCBBLCBCLCBDLCB0ZW1wWyA1XSwgRlhfYXRvNjRpKGNvbnN0YW50c1tpICogOCArIDVdKSApOwotICAgICAgICBTSEEzODRfUCggQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgdGVtcFsgNl0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyA2XSkgKTsKLSAgICAgICAgU0hBMzg0X1AoIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIHRlbXBbIDddLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgN10pICk7Ci0gICAgfQotICAgIGN0eC0+c3RhdGVbMF0gKz0gQTsKLSAgICBjdHgtPnN0YXRlWzFdICs9IEI7Ci0gICAgY3R4LT5zdGF0ZVsyXSArPSBDOwotICAgIGN0eC0+c3RhdGVbM10gKz0gRDsKLSAgICBjdHgtPnN0YXRlWzRdICs9IEU7Ci0gICAgY3R4LT5zdGF0ZVs1XSArPSBGOwotICAgIGN0eC0+c3RhdGVbNl0gKz0gRzsKLSAgICBjdHgtPnN0YXRlWzddICs9IEg7CisgICAgU0hBMzg0X1AoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgdGVtcFswXSwgRlhfYXRvNjRpKGNvbnN0YW50c1tpICogOF0pKTsKKyAgICBTSEEzODRfUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCB0ZW1wWzFdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgMV0pKTsKKyAgICBTSEEzODRfUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCB0ZW1wWzJdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgMl0pKTsKKyAgICBTSEEzODRfUChGLCBHLCBILCBBLCBCLCBDLCBELCBFLCB0ZW1wWzNdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgM10pKTsKKyAgICBTSEEzODRfUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCB0ZW1wWzRdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgNF0pKTsKKyAgICBTSEEzODRfUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCB0ZW1wWzVdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgNV0pKTsKKyAgICBTSEEzODRfUChDLCBELCBFLCBGLCBHLCBILCBBLCBCLCB0ZW1wWzZdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgNl0pKTsKKyAgICBTSEEzODRfUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCB0ZW1wWzddLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgN10pKTsKKyAgfQorICBjdHgtPnN0YXRlWzBdICs9IEE7CisgIGN0eC0+c3RhdGVbMV0gKz0gQjsKKyAgY3R4LT5zdGF0ZVsyXSArPSBDOworICBjdHgtPnN0YXRlWzNdICs9IEQ7CisgIGN0eC0+c3RhdGVbNF0gKz0gRTsKKyAgY3R4LT5zdGF0ZVs1XSArPSBGOworICBjdHgtPnN0YXRlWzZdICs9IEc7CisgIGN0eC0+c3RhdGVbN10gKz0gSDsKIH0KLXZvaWQgQ1JZUFRfU0hBMzg0VXBkYXRlKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGlucHV0LCBGWF9EV09SRCBsZW5ndGgpCi17Ci0gICAgc2hhMzg0X2NvbnRleHQgKmN0eCA9IChzaGEzODRfY29udGV4dCAqKWNvbnRleHQ7Ci0gICAgRlhfRFdPUkQgbGVmdCwgZmlsbDsKLSAgICBpZiggISBsZW5ndGggKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbGVmdCA9IChGWF9EV09SRCljdHgtPnRvdGFsWzBdICYgMHg3RjsKLSAgICBmaWxsID0gMTI4IC0gbGVmdDsKLSAgICBjdHgtPnRvdGFsWzBdICs9IGxlbmd0aDsKLSAgICBpZiggY3R4LT50b3RhbFswXSA8IGxlbmd0aCApIHsKLSAgICAgICAgY3R4LT50b3RhbFsxXSsrOwotICAgIH0KLSAgICBpZiggbGVmdCAmJiBsZW5ndGggPj0gZmlsbCApIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KCAodm9pZCAqKSAoY3R4LT5idWZmZXIgKyBsZWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGlucHV0LCBmaWxsICk7Ci0gICAgICAgIHNoYTM4NF9wcm9jZXNzKCBjdHgsIGN0eC0+YnVmZmVyICk7Ci0gICAgICAgIGxlbmd0aCAtPSBmaWxsOwotICAgICAgICBpbnB1dCAgKz0gZmlsbDsKLSAgICAgICAgbGVmdCA9IDA7Ci0gICAgfQotICAgIHdoaWxlKCBsZW5ndGggPj0gMTI4ICkgewotICAgICAgICBzaGEzODRfcHJvY2VzcyggY3R4LCBpbnB1dCApOwotICAgICAgICBsZW5ndGggLT0gMTI4OwotICAgICAgICBpbnB1dCAgKz0gMTI4OwotICAgIH0KLSAgICBpZiggbGVuZ3RoICkgewotICAgICAgICBGWFNZU19tZW1jcHkoICh2b2lkICopIChjdHgtPmJ1ZmZlciArIGxlZnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgaW5wdXQsIGxlbmd0aCApOwotICAgIH0KK3ZvaWQgQ1JZUFRfU0hBMzg0VXBkYXRlKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGlucHV0LCBGWF9EV09SRCBsZW5ndGgpIHsKKyAgc2hhMzg0X2NvbnRleHQqIGN0eCA9IChzaGEzODRfY29udGV4dCopY29udGV4dDsKKyAgRlhfRFdPUkQgbGVmdCwgZmlsbDsKKyAgaWYgKCFsZW5ndGgpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbGVmdCA9IChGWF9EV09SRCljdHgtPnRvdGFsWzBdICYgMHg3RjsKKyAgZmlsbCA9IDEyOCAtIGxlZnQ7CisgIGN0eC0+dG90YWxbMF0gKz0gbGVuZ3RoOworICBpZiAoY3R4LT50b3RhbFswXSA8IGxlbmd0aCkgeworICAgIGN0eC0+dG90YWxbMV0rKzsKKyAgfQorICBpZiAobGVmdCAmJiBsZW5ndGggPj0gZmlsbCkgeworICAgIEZYU1lTX21lbWNweSgodm9pZCopKGN0eC0+YnVmZmVyICsgbGVmdCksICh2b2lkKilpbnB1dCwgZmlsbCk7CisgICAgc2hhMzg0X3Byb2Nlc3MoY3R4LCBjdHgtPmJ1ZmZlcik7CisgICAgbGVuZ3RoIC09IGZpbGw7CisgICAgaW5wdXQgKz0gZmlsbDsKKyAgICBsZWZ0ID0gMDsKKyAgfQorICB3aGlsZSAobGVuZ3RoID49IDEyOCkgeworICAgIHNoYTM4NF9wcm9jZXNzKGN0eCwgaW5wdXQpOworICAgIGxlbmd0aCAtPSAxMjg7CisgICAgaW5wdXQgKz0gMTI4OworICB9CisgIGlmIChsZW5ndGgpIHsKKyAgICBGWFNZU19tZW1jcHkoKHZvaWQqKShjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCopaW5wdXQsIGxlbmd0aCk7CisgIH0KIH0KLXZvaWQgQ1JZUFRfU0hBMzg0RmluaXNoKHZvaWQqIGNvbnRleHQsIHVpbnQ4X3QgZGlnZXN0WzQ4XSkKLXsKLSAgICBzaGEzODRfY29udGV4dCAqY3R4ID0gKHNoYTM4NF9jb250ZXh0ICopY29udGV4dDsKLSAgICBGWF9EV09SRCBsYXN0LCBwYWRuOwotICAgIHVpbnQ4X3QgbXNnbGVuWzE2XTsKLSAgICBGWFNZU19tZW1zZXQobXNnbGVuLCAwLCAxNik7Ci0gICAgdWludDY0X3QgaGlnaCwgbG93OwotICAgIGhpZ2ggPSAoIGN0eC0+dG90YWxbMF0gPj4gMjkgKQotICAgICAgICAgICB8ICggY3R4LT50b3RhbFsxXSA8PCAgMyApOwotICAgIGxvdyAgPSAoIGN0eC0+dG90YWxbMF0gPDwgIDMgKTsKLSAgICBQVVRfRlhfNjREV09SRCggaGlnaCwgbXNnbGVuLCAwICk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoIGxvdywgIG1zZ2xlbiwgOCApOwotICAgIGxhc3QgPSAoRlhfRFdPUkQpY3R4LT50b3RhbFswXSAmIDB4N0Y7Ci0gICAgcGFkbiA9ICggbGFzdCA8IDExMiApID8gKCAxMTIgLSBsYXN0ICkgOiAoIDI0MCAtIGxhc3QgKTsKLSAgICBDUllQVF9TSEEzODRVcGRhdGUoIGN0eCwgc2hhMzg0X3BhZGRpbmcsIHBhZG4gKTsKLSAgICBDUllQVF9TSEEzODRVcGRhdGUoIGN0eCwgbXNnbGVuLCAxNiApOwotICAgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbMF0sIGRpZ2VzdCwgMCk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVsxXSwgZGlnZXN0LCA4KTsKLSAgICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzJdLCBkaWdlc3QsIDE2KTsKLSAgICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzNdLCBkaWdlc3QsIDI0KTsKLSAgICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzRdLCBkaWdlc3QsIDMyKTsKLSAgICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzVdLCBkaWdlc3QsIDQwKTsKK3ZvaWQgQ1JZUFRfU0hBMzg0RmluaXNoKHZvaWQqIGNvbnRleHQsIHVpbnQ4X3QgZGlnZXN0WzQ4XSkgeworICBzaGEzODRfY29udGV4dCogY3R4ID0gKHNoYTM4NF9jb250ZXh0Kiljb250ZXh0OworICBGWF9EV09SRCBsYXN0LCBwYWRuOworICB1aW50OF90IG1zZ2xlblsxNl07CisgIEZYU1lTX21lbXNldChtc2dsZW4sIDAsIDE2KTsKKyAgdWludDY0X3QgaGlnaCwgbG93OworICBoaWdoID0gKGN0eC0+dG90YWxbMF0gPj4gMjkpIHwgKGN0eC0+dG90YWxbMV0gPDwgMyk7CisgIGxvdyA9IChjdHgtPnRvdGFsWzBdIDw8IDMpOworICBQVVRfRlhfNjREV09SRChoaWdoLCBtc2dsZW4sIDApOworICBQVVRfRlhfNjREV09SRChsb3csIG1zZ2xlbiwgOCk7CisgIGxhc3QgPSAoRlhfRFdPUkQpY3R4LT50b3RhbFswXSAmIDB4N0Y7CisgIHBhZG4gPSAobGFzdCA8IDExMikgPyAoMTEyIC0gbGFzdCkgOiAoMjQwIC0gbGFzdCk7CisgIENSWVBUX1NIQTM4NFVwZGF0ZShjdHgsIHNoYTM4NF9wYWRkaW5nLCBwYWRuKTsKKyAgQ1JZUFRfU0hBMzg0VXBkYXRlKGN0eCwgbXNnbGVuLCAxNik7CisgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbMF0sIGRpZ2VzdCwgMCk7CisgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbMV0sIGRpZ2VzdCwgOCk7CisgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbMl0sIGRpZ2VzdCwgMTYpOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzNdLCBkaWdlc3QsIDI0KTsKKyAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs0XSwgZGlnZXN0LCAzMik7CisgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbNV0sIGRpZ2VzdCwgNDApOwogfQotdm9pZCBDUllQVF9TSEEzODRHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90IGRpZ2VzdFs2NF0pCi17Ci0gICAgc2hhMzg0X2NvbnRleHQgY29udGV4dDsKLSAgICBDUllQVF9TSEEzODRTdGFydCgmY29udGV4dCk7Ci0gICAgQ1JZUFRfU0hBMzg0VXBkYXRlKCZjb250ZXh0LCBkYXRhLCBzaXplKTsKLSAgICBDUllQVF9TSEEzODRGaW5pc2goJmNvbnRleHQsIGRpZ2VzdCk7Cit2b2lkIENSWVBUX1NIQTM4NEdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlnZXN0WzY0XSkgeworICBzaGEzODRfY29udGV4dCBjb250ZXh0OworICBDUllQVF9TSEEzODRTdGFydCgmY29udGV4dCk7CisgIENSWVBUX1NIQTM4NFVwZGF0ZSgmY29udGV4dCwgZGF0YSwgc2l6ZSk7CisgIENSWVBUX1NIQTM4NEZpbmlzaCgmY29udGV4dCwgZGlnZXN0KTsKIH0KLXZvaWQgQ1JZUFRfU0hBNTEyU3RhcnQodm9pZCogY29udGV4dCkKLXsKLSAgICBpZiAoY29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2hhMzg0X2NvbnRleHQgKmN0eCA9IChzaGEzODRfY29udGV4dCAqKWNvbnRleHQ7Ci0gICAgRlhTWVNfbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKHNoYTM4NF9jb250ZXh0KSk7Ci0gICAgY3R4LT5zdGF0ZVswXSA9IEZYX2F0bzY0aSgiNmEwOWU2NjdmM2JjYzkwOCIpOwotICAgIGN0eC0+c3RhdGVbMV0gPSBGWF9hdG82NGkoImJiNjdhZTg1ODRjYWE3M2IiKTsKLSAgICBjdHgtPnN0YXRlWzJdID0gRlhfYXRvNjRpKCIzYzZlZjM3MmZlOTRmODJiIik7Ci0gICAgY3R4LT5zdGF0ZVszXSA9IEZYX2F0bzY0aSgiYTU0ZmY1M2E1ZjFkMzZmMSIpOwotICAgIGN0eC0+c3RhdGVbNF0gPSBGWF9hdG82NGkoIjUxMGU1MjdmYWRlNjgyZDEiKTsKLSAgICBjdHgtPnN0YXRlWzVdID0gRlhfYXRvNjRpKCI5YjA1Njg4YzJiM2U2YzFmIik7Ci0gICAgY3R4LT5zdGF0ZVs2XSA9IEZYX2F0bzY0aSgiMWY4M2Q5YWJmYjQxYmQ2YiIpOwotICAgIGN0eC0+c3RhdGVbN10gPSBGWF9hdG82NGkoIjViZTBjZDE5MTM3ZTIxNzkiKTsKK3ZvaWQgQ1JZUFRfU0hBNTEyU3RhcnQodm9pZCogY29udGV4dCkgeworICBpZiAoY29udGV4dCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIHNoYTM4NF9jb250ZXh0KiBjdHggPSAoc2hhMzg0X2NvbnRleHQqKWNvbnRleHQ7CisgIEZYU1lTX21lbXNldChjdHgsIDAsIHNpemVvZihzaGEzODRfY29udGV4dCkpOworICBjdHgtPnN0YXRlWzBdID0gRlhfYXRvNjRpKCI2YTA5ZTY2N2YzYmNjOTA4Iik7CisgIGN0eC0+c3RhdGVbMV0gPSBGWF9hdG82NGkoImJiNjdhZTg1ODRjYWE3M2IiKTsKKyAgY3R4LT5zdGF0ZVsyXSA9IEZYX2F0bzY0aSgiM2M2ZWYzNzJmZTk0ZjgyYiIpOworICBjdHgtPnN0YXRlWzNdID0gRlhfYXRvNjRpKCJhNTRmZjUzYTVmMWQzNmYxIik7CisgIGN0eC0+c3RhdGVbNF0gPSBGWF9hdG82NGkoIjUxMGU1MjdmYWRlNjgyZDEiKTsKKyAgY3R4LT5zdGF0ZVs1XSA9IEZYX2F0bzY0aSgiOWIwNTY4OGMyYjNlNmMxZiIpOworICBjdHgtPnN0YXRlWzZdID0gRlhfYXRvNjRpKCIxZjgzZDlhYmZiNDFiZDZiIik7CisgIGN0eC0+c3RhdGVbN10gPSBGWF9hdG82NGkoIjViZTBjZDE5MTM3ZTIxNzkiKTsKIH0KLXZvaWQgQ1JZUFRfU0hBNTEyVXBkYXRlKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUpCi17Ci0gICAgQ1JZUFRfU0hBMzg0VXBkYXRlKGNvbnRleHQsIGRhdGEsIHNpemUpOwordm9pZCBDUllQVF9TSEE1MTJVcGRhdGUodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSkgeworICBDUllQVF9TSEEzODRVcGRhdGUoY29udGV4dCwgZGF0YSwgc2l6ZSk7CiB9Ci12b2lkIENSWVBUX1NIQTUxMkZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFs2NF0pCi17Ci0gICAgc2hhMzg0X2NvbnRleHQgKmN0eCA9IChzaGEzODRfY29udGV4dCAqKWNvbnRleHQ7Ci0gICAgRlhfRFdPUkQgbGFzdCwgcGFkbjsKLSAgICB1aW50OF90IG1zZ2xlblsxNl07Ci0gICAgRlhTWVNfbWVtc2V0KG1zZ2xlbiwgMCwgMTYpOwotICAgIHVpbnQ2NF90IGhpZ2gsIGxvdzsKLSAgICBoaWdoID0gKCBjdHgtPnRvdGFsWzBdID4+IDI5ICkKLSAgICAgICAgICAgfCAoIGN0eC0+dG90YWxbMV0gPDwgIDMgKTsKLSAgICBsb3cgID0gKCBjdHgtPnRvdGFsWzBdIDw8ICAzICk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoIGhpZ2gsIG1zZ2xlbiwgMCApOwotICAgIFBVVF9GWF82NERXT1JEKCBsb3csICBtc2dsZW4sIDggKTsKLSAgICBsYXN0ID0gKEZYX0RXT1JEKWN0eC0+dG90YWxbMF0gJiAweDdGOwotICAgIHBhZG4gPSAoIGxhc3QgPCAxMTIgKSA/ICggMTEyIC0gbGFzdCApIDogKCAyNDAgLSBsYXN0ICk7Ci0gICAgQ1JZUFRfU0hBNTEyVXBkYXRlKCBjdHgsIHNoYTM4NF9wYWRkaW5nLCBwYWRuICk7Ci0gICAgQ1JZUFRfU0hBNTEyVXBkYXRlKCBjdHgsIG1zZ2xlbiwgMTYgKTsKLSAgICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzBdLCBkaWdlc3QsIDApOwotICAgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbMV0sIGRpZ2VzdCwgOCk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVsyXSwgZGlnZXN0LCAxNik7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAyNCk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs0XSwgZGlnZXN0LCAzMik7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs1XSwgZGlnZXN0LCA0MCk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs2XSwgZGlnZXN0LCA0OCk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs3XSwgZGlnZXN0LCA1Nik7Cit2b2lkIENSWVBUX1NIQTUxMkZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFs2NF0pIHsKKyAgc2hhMzg0X2NvbnRleHQqIGN0eCA9IChzaGEzODRfY29udGV4dCopY29udGV4dDsKKyAgRlhfRFdPUkQgbGFzdCwgcGFkbjsKKyAgdWludDhfdCBtc2dsZW5bMTZdOworICBGWFNZU19tZW1zZXQobXNnbGVuLCAwLCAxNik7CisgIHVpbnQ2NF90IGhpZ2gsIGxvdzsKKyAgaGlnaCA9IChjdHgtPnRvdGFsWzBdID4+IDI5KSB8IChjdHgtPnRvdGFsWzFdIDw8IDMpOworICBsb3cgPSAoY3R4LT50b3RhbFswXSA8PCAzKTsKKyAgUFVUX0ZYXzY0RFdPUkQoaGlnaCwgbXNnbGVuLCAwKTsKKyAgUFVUX0ZYXzY0RFdPUkQobG93LCBtc2dsZW4sIDgpOworICBsYXN0ID0gKEZYX0RXT1JEKWN0eC0+dG90YWxbMF0gJiAweDdGOworICBwYWRuID0gKGxhc3QgPCAxMTIpID8gKDExMiAtIGxhc3QpIDogKDI0MCAtIGxhc3QpOworICBDUllQVF9TSEE1MTJVcGRhdGUoY3R4LCBzaGEzODRfcGFkZGluZywgcGFkbik7CisgIENSWVBUX1NIQTUxMlVwZGF0ZShjdHgsIG1zZ2xlbiwgMTYpOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzBdLCBkaWdlc3QsIDApOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzFdLCBkaWdlc3QsIDgpOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzJdLCBkaWdlc3QsIDE2KTsKKyAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAyNCk7CisgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbNF0sIGRpZ2VzdCwgMzIpOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzVdLCBkaWdlc3QsIDQwKTsKKyAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs2XSwgZGlnZXN0LCA0OCk7CisgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbN10sIGRpZ2VzdCwgNTYpOwogfQotdm9pZCBDUllQVF9TSEE1MTJHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90IGRpZ2VzdFs2NF0pCi17Ci0gICAgc2hhMzg0X2NvbnRleHQgY29udGV4dDsKLSAgICBDUllQVF9TSEE1MTJTdGFydCgmY29udGV4dCk7Ci0gICAgQ1JZUFRfU0hBNTEyVXBkYXRlKCZjb250ZXh0LCBkYXRhLCBzaXplKTsKLSAgICBDUllQVF9TSEE1MTJGaW5pc2goJmNvbnRleHQsIGRpZ2VzdCk7Cit2b2lkIENSWVBUX1NIQTUxMkdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlnZXN0WzY0XSkgeworICBzaGEzODRfY29udGV4dCBjb250ZXh0OworICBDUllQVF9TSEE1MTJTdGFydCgmY29udGV4dCk7CisgIENSWVBUX1NIQTUxMlVwZGF0ZSgmY29udGV4dCwgZGF0YSwgc2l6ZSk7CisgIENSWVBUX1NIQTUxMkZpbmlzaCgmY29udGV4dCwgZGlnZXN0KTsKIH0KICNpZmRlZiBfX2NwbHVzcGx1cwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9iYXNpY19tb2R1bGUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAKaW5kZXggMDNjZmQ2Ni4uNTk1ZGFkYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAKQEAgLTE2LDEwNCArMTYsOTAgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiAvLyBzdGF0aWMKLUNQREZfTW9kdWxlTWdyKiBDUERGX01vZHVsZU1ncjo6R2V0KCkKLXsKLSAgICByZXR1cm4gZ19GUERGQVBJX3BEZWZhdWx0TWdyOworQ1BERl9Nb2R1bGVNZ3IqIENQREZfTW9kdWxlTWdyOjpHZXQoKSB7CisgIHJldHVybiBnX0ZQREZBUElfcERlZmF1bHRNZ3I7CiB9CiAKIC8vIHN0YXRpYwotdm9pZCBDUERGX01vZHVsZU1ncjo6Q3JlYXRlKCkKLXsKLSAgICBBU1NFUlQoIWdfRlBERkFQSV9wRGVmYXVsdE1ncik7Ci0gICAgZ19GUERGQVBJX3BEZWZhdWx0TWdyID0gbmV3IENQREZfTW9kdWxlTWdyOwordm9pZCBDUERGX01vZHVsZU1ncjo6Q3JlYXRlKCkgeworICBBU1NFUlQoIWdfRlBERkFQSV9wRGVmYXVsdE1ncik7CisgIGdfRlBERkFQSV9wRGVmYXVsdE1nciA9IG5ldyBDUERGX01vZHVsZU1ncjsKIH0KIAogLy8gc3RhdGljCi12b2lkIENQREZfTW9kdWxlTWdyOjpEZXN0cm95KCkKLXsKLSAgICBkZWxldGUgZ19GUERGQVBJX3BEZWZhdWx0TWdyOwotICAgIGdfRlBERkFQSV9wRGVmYXVsdE1nciA9IG51bGxwdHI7Cit2b2lkIENQREZfTW9kdWxlTWdyOjpEZXN0cm95KCkgeworICBkZWxldGUgZ19GUERGQVBJX3BEZWZhdWx0TWdyOworICBnX0ZQREZBUElfcERlZmF1bHRNZ3IgPSBudWxscHRyOwogfQogCi1DUERGX01vZHVsZU1ncjo6Q1BERl9Nb2R1bGVNZ3IoKQotICAgIDogbV9wQ29kZWNNb2R1bGUobnVsbHB0cikKLXsKLX0KK0NQREZfTW9kdWxlTWdyOjpDUERGX01vZHVsZU1ncigpIDogbV9wQ29kZWNNb2R1bGUobnVsbHB0cikge30KIAotQ1BERl9Nb2R1bGVNZ3I6On5DUERGX01vZHVsZU1ncigpCi17Ci19CitDUERGX01vZHVsZU1ncjo6fkNQREZfTW9kdWxlTWdyKCkge30KIAotdm9pZCBDUERGX01vZHVsZU1ncjo6U2V0RG93bmxvYWRDYWxsYmFjayhGWF9CT09MICgqY2FsbGJhY2spKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKSkKLXsKLSAgICBtX3BEb3dubG9hZENhbGxiYWNrID0gY2FsbGJhY2s7Cit2b2lkIENQREZfTW9kdWxlTWdyOjpTZXREb3dubG9hZENhbGxiYWNrKAorICAgIEZYX0JPT0wgKCpjYWxsYmFjaykoY29uc3QgRlhfQ0hBUiogbW9kdWxlX25hbWUpKSB7CisgIG1fcERvd25sb2FkQ2FsbGJhY2sgPSBjYWxsYmFjazsKIH0KLUZYX0JPT0wgQ1BERl9Nb2R1bGVNZ3I6OkRvd25sb2FkTW9kdWxlKGNvbnN0IEZYX0NIQVIqIG1vZHVsZV9uYW1lKQotewotICAgIGlmIChtX3BEb3dubG9hZENhbGxiYWNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gbV9wRG93bmxvYWRDYWxsYmFjayhtb2R1bGVfbmFtZSk7CitGWF9CT09MIENQREZfTW9kdWxlTWdyOjpEb3dubG9hZE1vZHVsZShjb25zdCBGWF9DSEFSKiBtb2R1bGVfbmFtZSkgeworICBpZiAobV9wRG93bmxvYWRDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBtX3BEb3dubG9hZENhbGxiYWNrKG1vZHVsZV9uYW1lKTsKIH0KLXZvaWQgQ1BERl9Nb2R1bGVNZ3I6Ok5vdGlmeU1vZHVsZUF2YWlsYWJsZShjb25zdCBGWF9DSEFSKiBtb2R1bGVfbmFtZSkKLXsKLSAgICBpZiAoRlhTWVNfc3RyY21wKG1vZHVsZV9uYW1lLCBrQWRkaW5OYW1lQ0pLKSA9PSAwKSB7Ci0gICAgICAgIG1fcFBhZ2VNb2R1bGUtPk5vdGlmeUNKS0F2YWlsYWJsZSgpOwotICAgIH0KK3ZvaWQgQ1BERl9Nb2R1bGVNZ3I6Ok5vdGlmeU1vZHVsZUF2YWlsYWJsZShjb25zdCBGWF9DSEFSKiBtb2R1bGVfbmFtZSkgeworICBpZiAoRlhTWVNfc3RyY21wKG1vZHVsZV9uYW1lLCBrQWRkaW5OYW1lQ0pLKSA9PSAwKSB7CisgICAgbV9wUGFnZU1vZHVsZS0+Tm90aWZ5Q0pLQXZhaWxhYmxlKCk7CisgIH0KIH0KLXZvaWQgQ1BERl9Nb2R1bGVNZ3I6OlJlZ2lzdGVyU2VjdXJpdHlIYW5kbGVyKGNvbnN0IEZYX0NIQVIqIGZpbHRlciwgQ1BERl9TZWN1cml0eUhhbmRsZXIgKiAoKkNyZWF0ZUhhbmRsZXIpKHZvaWQqIHBhcmFtKSwgdm9pZCogcGFyYW0pCi17Ci0gICAgaWYgKENyZWF0ZUhhbmRsZXIgPT0gTlVMTCkgewotICAgICAgICBtX1NlY3VyaXR5SGFuZGxlck1hcC5SZW1vdmVLZXkoZmlsdGVyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1NlY3VyaXR5SGFuZGxlck1hcC5TZXRBdChmaWx0ZXIsICh2b2lkKilDcmVhdGVIYW5kbGVyKTsKLSAgICB9Ci0gICAgaWYgKHBhcmFtKSB7Ci0gICAgICAgIG1fU2VjdXJpdHlIYW5kbGVyTWFwLlNldEF0KEZYX0JTVFJDKCJfcGFyYW1fIikgKyBmaWx0ZXIsIHBhcmFtKTsKLSAgICB9Cit2b2lkIENQREZfTW9kdWxlTWdyOjpSZWdpc3RlclNlY3VyaXR5SGFuZGxlcigKKyAgICBjb25zdCBGWF9DSEFSKiBmaWx0ZXIsCisgICAgQ1BERl9TZWN1cml0eUhhbmRsZXIqICgqQ3JlYXRlSGFuZGxlcikodm9pZCogcGFyYW0pLAorICAgIHZvaWQqIHBhcmFtKSB7CisgIGlmIChDcmVhdGVIYW5kbGVyID09IE5VTEwpIHsKKyAgICBtX1NlY3VyaXR5SGFuZGxlck1hcC5SZW1vdmVLZXkoZmlsdGVyKTsKKyAgfSBlbHNlIHsKKyAgICBtX1NlY3VyaXR5SGFuZGxlck1hcC5TZXRBdChmaWx0ZXIsICh2b2lkKilDcmVhdGVIYW5kbGVyKTsKKyAgfQorICBpZiAocGFyYW0pIHsKKyAgICBtX1NlY3VyaXR5SGFuZGxlck1hcC5TZXRBdChGWF9CU1RSQygiX3BhcmFtXyIpICsgZmlsdGVyLCBwYXJhbSk7CisgIH0KIH0KLXZvaWQgQ1BERl9Nb2R1bGVNZ3I6OlNldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwgdm9pZCogcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKQotewotICAgIG1fcHJpdmF0ZURhdGEuU2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkLCBwRGF0YSwgY2FsbGJhY2spOwordm9pZCBDUERGX01vZHVsZU1ncjo6U2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaykgeworICBtX3ByaXZhdGVEYXRhLlNldFByaXZhdGVEYXRhKG1vZHVsZV9pZCwgcERhdGEsIGNhbGxiYWNrKTsKIH0KLXZvaWQqIENQREZfTW9kdWxlTWdyOjpHZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpCi17Ci0gICAgcmV0dXJuIG1fcHJpdmF0ZURhdGEuR2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkKTsKK3ZvaWQqIENQREZfTW9kdWxlTWdyOjpHZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpIHsKKyAgcmV0dXJuIG1fcHJpdmF0ZURhdGEuR2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkKTsKIH0KLUNQREZfU2VjdXJpdHlIYW5kbGVyKiBDUERGX01vZHVsZU1ncjo6Q3JlYXRlU2VjdXJpdHlIYW5kbGVyKGNvbnN0IEZYX0NIQVIqIGZpbHRlcikKLXsKLSAgICBDUERGX1NlY3VyaXR5SGFuZGxlciogKCpDcmVhdGVIYW5kbGVyKSh2b2lkKikgPSBOVUxMOwotICAgIGlmICghbV9TZWN1cml0eUhhbmRsZXJNYXAuTG9va3VwKGZpbHRlciwgKHZvaWQqJilDcmVhdGVIYW5kbGVyKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKENyZWF0ZUhhbmRsZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdm9pZCogcGFyYW0gPSBOVUxMOwotICAgIG1fU2VjdXJpdHlIYW5kbGVyTWFwLkxvb2t1cChGWF9CU1RSQygiX3BhcmFtXyIpICsgZmlsdGVyLCBwYXJhbSk7Ci0gICAgcmV0dXJuIENyZWF0ZUhhbmRsZXIocGFyYW0pOworQ1BERl9TZWN1cml0eUhhbmRsZXIqIENQREZfTW9kdWxlTWdyOjpDcmVhdGVTZWN1cml0eUhhbmRsZXIoCisgICAgY29uc3QgRlhfQ0hBUiogZmlsdGVyKSB7CisgIENQREZfU2VjdXJpdHlIYW5kbGVyKiAoKkNyZWF0ZUhhbmRsZXIpKHZvaWQqKSA9IE5VTEw7CisgIGlmICghbV9TZWN1cml0eUhhbmRsZXJNYXAuTG9va3VwKGZpbHRlciwgKHZvaWQqJilDcmVhdGVIYW5kbGVyKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChDcmVhdGVIYW5kbGVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB2b2lkKiBwYXJhbSA9IE5VTEw7CisgIG1fU2VjdXJpdHlIYW5kbGVyTWFwLkxvb2t1cChGWF9CU1RSQygiX3BhcmFtXyIpICsgZmlsdGVyLCBwYXJhbSk7CisgIHJldHVybiBDcmVhdGVIYW5kbGVyKHBhcmFtKTsKIH0KLUlDb2RlY19GYXhNb2R1bGUqIENQREZfTW9kdWxlTWdyOjpHZXRGYXhNb2R1bGUoKQotewotICAgIHJldHVybiBtX3BDb2RlY01vZHVsZSA/IG1fcENvZGVjTW9kdWxlLT5HZXRGYXhNb2R1bGUoKSA6IE5VTEw7CitJQ29kZWNfRmF4TW9kdWxlKiBDUERGX01vZHVsZU1ncjo6R2V0RmF4TW9kdWxlKCkgeworICByZXR1cm4gbV9wQ29kZWNNb2R1bGUgPyBtX3BDb2RlY01vZHVsZS0+R2V0RmF4TW9kdWxlKCkgOiBOVUxMOwogfQotSUNvZGVjX0pwZWdNb2R1bGUqIENQREZfTW9kdWxlTWdyOjpHZXRKcGVnTW9kdWxlKCkKLXsKLSAgICByZXR1cm4gbV9wQ29kZWNNb2R1bGUgPyBtX3BDb2RlY01vZHVsZS0+R2V0SnBlZ01vZHVsZSgpIDogTlVMTDsKK0lDb2RlY19KcGVnTW9kdWxlKiBDUERGX01vZHVsZU1ncjo6R2V0SnBlZ01vZHVsZSgpIHsKKyAgcmV0dXJuIG1fcENvZGVjTW9kdWxlID8gbV9wQ29kZWNNb2R1bGUtPkdldEpwZWdNb2R1bGUoKSA6IE5VTEw7CiB9Ci1JQ29kZWNfSnB4TW9kdWxlKiBDUERGX01vZHVsZU1ncjo6R2V0SnB4TW9kdWxlKCkKLXsKLSAgICByZXR1cm4gbV9wQ29kZWNNb2R1bGUgPyBtX3BDb2RlY01vZHVsZS0+R2V0SnB4TW9kdWxlKCkgOiBOVUxMOworSUNvZGVjX0pweE1vZHVsZSogQ1BERl9Nb2R1bGVNZ3I6OkdldEpweE1vZHVsZSgpIHsKKyAgcmV0dXJuIG1fcENvZGVjTW9kdWxlID8gbV9wQ29kZWNNb2R1bGUtPkdldEpweE1vZHVsZSgpIDogTlVMTDsKIH0KLUlDb2RlY19KYmlnMk1vZHVsZSogQ1BERl9Nb2R1bGVNZ3I6OkdldEpiaWcyTW9kdWxlKCkKLXsKLSAgICByZXR1cm4gbV9wQ29kZWNNb2R1bGUgPyBtX3BDb2RlY01vZHVsZS0+R2V0SmJpZzJNb2R1bGUoKSA6IE5VTEw7CitJQ29kZWNfSmJpZzJNb2R1bGUqIENQREZfTW9kdWxlTWdyOjpHZXRKYmlnMk1vZHVsZSgpIHsKKyAgcmV0dXJuIG1fcENvZGVjTW9kdWxlID8gbV9wQ29kZWNNb2R1bGUtPkdldEpiaWcyTW9kdWxlKCkgOiBOVUxMOwogfQotSUNvZGVjX0ljY01vZHVsZSogQ1BERl9Nb2R1bGVNZ3I6OkdldEljY01vZHVsZSgpCi17Ci0gICAgcmV0dXJuIG1fcENvZGVjTW9kdWxlID8gbV9wQ29kZWNNb2R1bGUtPkdldEljY01vZHVsZSgpIDogTlVMTDsKK0lDb2RlY19JY2NNb2R1bGUqIENQREZfTW9kdWxlTWdyOjpHZXRJY2NNb2R1bGUoKSB7CisgIHJldHVybiBtX3BDb2RlY01vZHVsZSA/IG1fcENvZGVjTW9kdWxlLT5HZXRJY2NNb2R1bGUoKSA6IE5VTEw7CiB9Ci1JQ29kZWNfRmxhdGVNb2R1bGUqIENQREZfTW9kdWxlTWdyOjpHZXRGbGF0ZU1vZHVsZSgpCi17Ci0gICAgcmV0dXJuIG1fcENvZGVjTW9kdWxlID8gbV9wQ29kZWNNb2R1bGUtPkdldEZsYXRlTW9kdWxlKCkgOiBOVUxMOworSUNvZGVjX0ZsYXRlTW9kdWxlKiBDUERGX01vZHVsZU1ncjo6R2V0RmxhdGVNb2R1bGUoKSB7CisgIHJldHVybiBtX3BDb2RlY01vZHVsZSA/IG1fcENvZGVjTW9kdWxlLT5HZXRGbGF0ZU1vZHVsZSgpIDogTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0Fkb2JlLUNOUzEtVUNTMl81LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0Fkb2JlLUNOUzEtVUNTMl81LmNwcAppbmRleCAxMWJjYzE0Li44NjI4OWYzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9BZG9iZS1DTlMxLVVDUzJfNS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQWRvYmUtQ05TMS1VQ1MyXzUuY3BwCkBAIC03LDIzOTAgKzcsMjEyNSBAQAogI2luY2x1ZGUgImNtYXBzX2NuczEuaCIKIAogY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9DTlMxQ0lEMlVuaWNvZGVfNVsxOTA4OF0gPSB7Ci0gICAgMHhGRkZELCAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsCi0gICAgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsCi0gICAgMHgwMDJGLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsCi0gICAgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsCi0gICAgMHgwMDNGLCAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsCi0gICAgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsCi0gICAgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsCi0gICAgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywgMHgwMDVELCAweDAwNUUsCi0gICAgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsCi0gICAgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsCi0gICAgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsCi0gICAgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsCi0gICAgMHgwMEE5LCAweDIxMjIsIDB4MjAyNiwgMHgzMDAwLCAweEZGMEMsIDB4MzAwMSwgMHgzMDAyLCAweEZGMEUsCi0gICAgMHgyMDI3LCAweEZGMUIsIDB4RkYxQSwgMHhGRjFGLCAweEZGMDEsIDB4RkUzMCwgMHgyMkVGLCAweDIwMjUsCi0gICAgMHhGRTUwLCAweEZFNTEsIDB4RkU1MiwgMHgwMEI3LCAweEZFNTQsIDB4RkU1NSwgMHhGRTU2LCAweEZFNTcsCi0gICAgMHhGRjVDLCAweDIwMTMsIDB4RkUzMSwgMHgyMDE0LCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCi0gICAgMHhGRjA4LCAweEZGMDksIDB4RkUzNSwgMHhGRTM2LCAweEZGNUIsIDB4RkY1RCwgMHhGRTM3LCAweEZFMzgsCi0gICAgMHgzMDE0LCAweDMwMTUsIDB4RkUzOSwgMHhGRTNBLCAweDMwMTAsIDB4MzAxMSwgMHhGRTNCLCAweEZFM0MsCi0gICAgMHgzMDBBLCAweDMwMEIsIDB4RkUzRCwgMHhGRTNFLCAweDMwMDgsIDB4MzAwOSwgMHhGRTNGLCAweEZFNDAsCi0gICAgMHgzMDBDLCAweDMwMEQsIDB4RkU0MSwgMHhGRTQyLCAweDMwMEUsIDB4MzAwRiwgMHhGRTQzLCAweEZFNDQsCi0gICAgMHhGRTU5LCAweEZFNUEsIDB4RkU1QiwgMHhGRTVDLCAweEZFNUQsIDB4RkU1RSwgMHgyMDE4LCAweDIwMTksCi0gICAgMHgyMDFDLCAweDIwMUQsIDB4MzAxRCwgMHgzMDFFLCAweDIwMzUsIDB4MjAzMiwgMHhGRjAzLCAweEZGMDYsCi0gICAgMHhGRjBBLCAweDIwM0IsIDB4MDBBNywgMHgzMDAzLCAweDI1Q0IsIDB4MjVDRiwgMHgyNUIzLCAweDI1QjIsCi0gICAgMHgyNUNFLCAweDI2MDYsIDB4MjYwNSwgMHgyNUM3LCAweDI1QzYsIDB4MjVBMSwgMHgyNUEwLCAweDI1QkQsCi0gICAgMHgyNUJDLCAweDMyQTMsIDB4MjEwNSwgMHgyMDNFLCAweEZGRTMsIDB4RkYzRiwgMHgwMkNELCAweEZFNDksCi0gICAgMHhGRTRBLCAweEZFNEQsIDB4RkU0RSwgMHhGRTRCLCAweEZFNEMsIDB4RkU1RiwgMHhGRTYwLCAweEZFNjEsCi0gICAgMHhGRjBCLCAweEZGMEQsIDB4MDBENywgMHgwMEY3LCAweDAwQjEsIDB4MjIxQSwgMHhGRjFDLCAweEZGMUUsCi0gICAgMHhGRjFELCAweDIyNjYsIDB4MjI2NywgMHgyMjYwLCAweDIyMUUsIDB4MjI1MiwgMHgyMjYxLCAweEZFNjIsCi0gICAgMHhGRTYzLCAweEZFNjQsIDB4RkU2NSwgMHhGRTY2LCAweDIyM0MsIDB4MjIyOSwgMHgyMjJBLCAweDIyQTUsCi0gICAgMHgyMjIwLCAweDIyMUYsIDB4MjJCRiwgMHgzM0QyLCAweDMzRDEsIDB4MjIyQiwgMHgyMjJFLCAweDIyMzUsCi0gICAgMHgyMjM0LCAweDI2NDAsIDB4MjY0MiwgMHgyMjk1LCAweDI2MDksIDB4MjE5MSwgMHgyMTkzLCAweDIxOTIsCi0gICAgMHgyMTkwLCAweDIxOTYsIDB4MjE5NywgMHgyMTk5LCAweDIxOTgsIDB4MjIyNSwgMHgyMjIzLCAweEZGMEYsCi0gICAgMHhGRjNDLCAweEZGMEYsIDB4RkYzQywgMHhGRjA0LCAweDAwQTUsIDB4MzAxMiwgMHgwMEEyLCAweDAwQTMsCi0gICAgMHhGRjA1LCAweEZGMjAsIDB4MjEwMywgMHgyMTA5LCAweEZFNjksIDB4RkU2QSwgMHhGRTZCLCAweDMzRDUsCi0gICAgMHgzMzlDLCAweDMzOUQsIDB4MzM5RSwgMHgzM0NFLCAweDMzQTEsIDB4MzM4RSwgMHgzMzhGLCAweDMzQzQsCi0gICAgMHgwMEIwLCAweDUxNTksIDB4NTE1QiwgMHg1MTVFLCAweDUxNUQsIDB4NTE2MSwgMHg1MTYzLCAweDU1RTcsCi0gICAgMHg3NEU5LCAweDdDQ0UsIDB4MjU4MSwgMHgyNTgyLCAweDI1ODMsIDB4MjU4NCwgMHgyNTg1LCAweDI1ODYsCi0gICAgMHgyNTg3LCAweDI1ODgsIDB4MjU4RiwgMHgyNThFLCAweDI1OEQsIDB4MjU4QywgMHgyNThCLCAweDI1OEEsCi0gICAgMHgyNTg5LCAweDI1M0MsIDB4MjUzNCwgMHgyNTJDLCAweDI1MjQsIDB4MjUxQywgMHgyNTk0LCAweDI1MDAsCi0gICAgMHgyNTAyLCAweDI1OTUsIDB4MjUwQywgMHgyNTEwLCAweDI1MTQsIDB4MjUxOCwgMHgyNTZELCAweDI1NkUsCi0gICAgMHgyNTcwLCAweDI1NkYsIDB4MjU1MCwgMHgyNTVFLCAweDI1NkEsIDB4MjU2MSwgMHgyNUUyLCAweDI1RTMsCi0gICAgMHgyNUU1LCAweDI1RTQsIDB4MjU3MSwgMHgyNTcyLCAweDI1NzMsIDB4RkYxMCwgMHhGRjExLCAweEZGMTIsCi0gICAgMHhGRjEzLCAweEZGMTQsIDB4RkYxNSwgMHhGRjE2LCAweEZGMTcsIDB4RkYxOCwgMHhGRjE5LCAweDIxNjAsCi0gICAgMHgyMTYxLCAweDIxNjIsIDB4MjE2MywgMHgyMTY0LCAweDIxNjUsIDB4MjE2NiwgMHgyMTY3LCAweDIxNjgsCi0gICAgMHgyMTY5LCAweDMwMjEsIDB4MzAyMiwgMHgzMDIzLCAweDMwMjQsIDB4MzAyNSwgMHgzMDI2LCAweDMwMjcsCi0gICAgMHgzMDI4LCAweDMwMjksIDB4MzAzOCwgMHg1MzQ0LCAweDMwM0EsIDB4RkYyMSwgMHhGRjIyLCAweEZGMjMsCi0gICAgMHhGRjI0LCAweEZGMjUsIDB4RkYyNiwgMHhGRjI3LCAweEZGMjgsIDB4RkYyOSwgMHhGRjJBLCAweEZGMkIsCi0gICAgMHhGRjJDLCAweEZGMkQsIDB4RkYyRSwgMHhGRjJGLCAweEZGMzAsIDB4RkYzMSwgMHhGRjMyLCAweEZGMzMsCi0gICAgMHhGRjM0LCAweEZGMzUsIDB4RkYzNiwgMHhGRjM3LCAweEZGMzgsIDB4RkYzOSwgMHhGRjNBLCAweEZGNDEsCi0gICAgMHhGRjQyLCAweEZGNDMsIDB4RkY0NCwgMHhGRjQ1LCAweEZGNDYsIDB4RkY0NywgMHhGRjQ4LCAweEZGNDksCi0gICAgMHhGRjRBLCAweEZGNEIsIDB4RkY0QywgMHhGRjRELCAweEZGNEUsIDB4RkY0RiwgMHhGRjUwLCAweEZGNTEsCi0gICAgMHhGRjUyLCAweEZGNTMsIDB4RkY1NCwgMHhGRjU1LCAweEZGNTYsIDB4RkY1NywgMHhGRjU4LCAweEZGNTksCi0gICAgMHhGRjVBLCAweDAzOTEsIDB4MDM5MiwgMHgwMzkzLCAweDAzOTQsIDB4MDM5NSwgMHgwMzk2LCAweDAzOTcsCi0gICAgMHgwMzk4LCAweDAzOTksIDB4MDM5QSwgMHgwMzlCLCAweDAzOUMsIDB4MDM5RCwgMHgwMzlFLCAweDAzOUYsCi0gICAgMHgwM0EwLCAweDAzQTEsIDB4MDNBMywgMHgwM0E0LCAweDAzQTUsIDB4MDNBNiwgMHgwM0E3LCAweDAzQTgsCi0gICAgMHgwM0E5LCAweDAzQjEsIDB4MDNCMiwgMHgwM0IzLCAweDAzQjQsIDB4MDNCNSwgMHgwM0I2LCAweDAzQjcsCi0gICAgMHgwM0I4LCAweDAzQjksIDB4MDNCQSwgMHgwM0JCLCAweDAzQkMsIDB4MDNCRCwgMHgwM0JFLCAweDAzQkYsCi0gICAgMHgwM0MwLCAweDAzQzEsIDB4MDNDMywgMHgwM0M0LCAweDAzQzUsIDB4MDNDNiwgMHgwM0M3LCAweDAzQzgsCi0gICAgMHgwM0M5LCAweDMxMDUsIDB4MzEwNiwgMHgzMTA3LCAweDMxMDgsIDB4MzEwOSwgMHgzMTBBLCAweDMxMEIsCi0gICAgMHgzMTBDLCAweDMxMEQsIDB4MzEwRSwgMHgzMTBGLCAweDMxMTAsIDB4MzExMSwgMHgzMTEyLCAweDMxMTMsCi0gICAgMHgzMTE0LCAweDMxMTUsIDB4MzExNiwgMHgzMTE3LCAweDMxMTgsIDB4MzExOSwgMHgzMTFBLCAweDMxMUIsCi0gICAgMHgzMTFDLCAweDMxMUQsIDB4MzExRSwgMHgzMTFGLCAweDMxMjAsIDB4MzEyMSwgMHgzMTIyLCAweDMxMjMsCi0gICAgMHgzMTI0LCAweDMxMjUsIDB4MzEyNiwgMHgzMTI3LCAweDMxMjgsIDB4MzEyOSwgMHgwMkQ5LCAweDAyQ0EsCi0gICAgMHgwMkM3LCAweDAyQ0IsIDB4MjQ2MCwgMHgyNDYxLCAweDI0NjIsIDB4MjQ2MywgMHgyNDY0LCAweDI0NjUsCi0gICAgMHgyNDY2LCAweDI0NjcsIDB4MjQ2OCwgMHgyNDY5LCAweDI0NzQsIDB4MjQ3NSwgMHgyNDc2LCAweDI0NzcsCi0gICAgMHgyNDc4LCAweDI0NzksIDB4MjQ3QSwgMHgyNDdCLCAweDI0N0MsIDB4MjQ3RCwgMHgyMTcwLCAweDIxNzEsCi0gICAgMHgyMTcyLCAweDIxNzMsIDB4MjE3NCwgMHgyMTc1LCAweDIxNzYsIDB4MjE3NywgMHgyMTc4LCAweDIxNzksCi0gICAgMHg0RTI4LCAweDRFMzYsIDB4NEUzRiwgMHg0RTg1LCAweDRFQTAsIDB4NTE4MiwgMHg1MTk2LCAweDUxQUIsCi0gICAgMHg1MkY5LCAweDUzMzgsIDB4NTM2OSwgMHg1M0I2LCAweDU5MDIsIDB4NUI4MCwgMHg1RERCLCAweDVFN0EsCi0gICAgMHg1RTdGLCAweDVFRjQsIDB4NUY1MCwgMHg1RjYxLCAweDY1MzQsIDB4NjVFMCwgMHg3NTkyLCAweDc2NzYsCi0gICAgMHg4RkI1LCAweDk2QjYsIDB4MjQwMCwgMHgyNDAxLCAweDI0MDIsIDB4MjQwMywgMHgyNDA0LCAweDI0MDUsCi0gICAgMHgyNDA2LCAweDI0MDcsIDB4MjQwOCwgMHgyNDA5LCAweDI0MEEsIDB4MjQwQiwgMHgyNDBDLCAweDI0MEQsCi0gICAgMHgyNDBFLCAweDI0MEYsIDB4MjQxMCwgMHgyNDExLCAweDI0MTIsIDB4MjQxMywgMHgyNDE0LCAweDI0MTUsCi0gICAgMHgyNDE2LCAweDI0MTcsIDB4MjQxOCwgMHgyNDE5LCAweDI0MUEsIDB4MjQxQiwgMHgyNDFDLCAweDI0MUQsCi0gICAgMHgyNDFFLCAweDI0MUYsIDB4MjQyMSwgMHg0RTAwLCAweDRFNTksIDB4NEUwMSwgMHg0RTAzLCAweDRFNDMsCi0gICAgMHg0RTVELCAweDRFODYsIDB4NEU4QywgMHg0RUJBLCAweDUxM0YsIDB4NTE2NSwgMHg1MTZCLCAweDUxRTAsCi0gICAgMHg1MjAwLCAweDUyMDEsIDB4NTI5QiwgMHg1MzE1LCAweDUzNDEsIDB4NTM1QywgMHg1M0M4LCAweDRFMDksCi0gICAgMHg0RTBCLCAweDRFMDgsIDB4NEUwQSwgMHg0RTJCLCAweDRFMzgsIDB4NTFFMSwgMHg0RTQ1LCAweDRFNDgsCi0gICAgMHg0RTVGLCAweDRFNUUsIDB4NEU4RSwgMHg0RUExLCAweDUxNDAsIDB4NTIwMywgMHg1MkZBLCAweDUzNDMsCi0gICAgMHg1M0M5LCAweDUzRTMsIDB4NTcxRiwgMHg1OEVCLCAweDU5MTUsIDB4NTkyNywgMHg1OTczLCAweDVCNTAsCi0gICAgMHg1QjUxLCAweDVCNTMsIDB4NUJGOCwgMHg1QzBGLCAweDVDMjIsIDB4NUMzOCwgMHg1QzcxLCAweDVEREQsCi0gICAgMHg1REU1LCAweDVERjEsIDB4NURGMiwgMHg1REYzLCAweDVERkUsIDB4NUU3MiwgMHg1RUZFLCAweDVGMEIsCi0gICAgMHg1RjEzLCAweDYyNEQsIDB4NEUxMSwgMHg0RTEwLCAweDRFMEQsIDB4NEUyRCwgMHg0RTMwLCAweDRFMzksCi0gICAgMHg0RTRCLCAweDVDMzksIDB4NEU4OCwgMHg0RTkxLCAweDRFOTUsIDB4NEU5MiwgMHg0RTk0LCAweDRFQTIsCi0gICAgMHg0RUMxLCAweDRFQzAsIDB4NEVDMywgMHg0RUM2LCAweDRFQzcsIDB4NEVDRCwgMHg0RUNBLCAweDRFQ0IsCi0gICAgMHg0RUM0LCAweDUxNDMsIDB4NTE0MSwgMHg1MTY3LCAweDUxNkQsIDB4NTE2RSwgMHg1MTZDLCAweDUxOTcsCi0gICAgMHg1MUY2LCAweDUyMDYsIDB4NTIwNywgMHg1MjA4LCAweDUyRkIsIDB4NTJGRSwgMHg1MkZGLCAweDUzMTYsCi0gICAgMHg1MzM5LCAweDUzNDgsIDB4NTM0NywgMHg1MzQ1LCAweDUzNUUsIDB4NTM4NCwgMHg1M0NCLCAweDUzQ0EsCi0gICAgMHg1M0NELCAweDU4RUMsIDB4NTkyOSwgMHg1OTJCLCAweDU5MkEsIDB4NTkyRCwgMHg1QjU0LCAweDVDMTEsCi0gICAgMHg1QzI0LCAweDVDM0EsIDB4NUM2RiwgMHg1REY0LCAweDVFN0IsIDB4NUVGRiwgMHg1RjE0LCAweDVGMTUsCi0gICAgMHg1RkMzLCAweDYyMDgsIDB4NjIzNiwgMHg2MjRCLCAweDYyNEUsIDB4NjUyRiwgMHg2NTg3LCAweDY1OTcsCi0gICAgMHg2NUE0LCAweDY1QjksIDB4NjVFNSwgMHg2NkYwLCAweDY3MDgsIDB4NjcyOCwgMHg2QjIwLCAweDZCNjIsCi0gICAgMHg2Qjc5LCAweDZCQ0IsIDB4NkJENCwgMHg2QkRCLCAweDZDMEYsIDB4NkMzNCwgMHg3MDZCLCAweDcyMkEsCi0gICAgMHg3MjM2LCAweDcyM0IsIDB4NzI0NywgMHg3MjU5LCAweDcyNUIsIDB4NzJBQywgMHg3MzhCLCAweDRFMTksCi0gICAgMHg0RTE2LCAweDRFMTUsIDB4NEUxNCwgMHg0RTE4LCAweDRFM0IsIDB4NEU0RCwgMHg0RTRGLCAweDRFNEUsCi0gICAgMHg0RUU1LCAweDRFRDgsIDB4NEVENCwgMHg0RUQ1LCAweDRFRDYsIDB4NEVENywgMHg0RUUzLCAweDRFRTQsCi0gICAgMHg0RUQ5LCAweDRFREUsIDB4NTE0NSwgMHg1MTQ0LCAweDUxODksIDB4NTE4QSwgMHg1MUFDLCAweDUxRjksCi0gICAgMHg1MUZBLCAweDUxRjgsIDB4NTIwQSwgMHg1MkEwLCAweDUyOUYsIDB4NTMwNSwgMHg1MzA2LCAweDUzMTcsCi0gICAgMHg1MzFELCAweDRFREYsIDB4NTM0QSwgMHg1MzQ5LCAweDUzNjEsIDB4NTM2MCwgMHg1MzZGLCAweDUzNkUsCi0gICAgMHg1M0JCLCAweDUzRUYsIDB4NTNFNCwgMHg1M0YzLCAweDUzRUMsIDB4NTNFRSwgMHg1M0U5LCAweDUzRTgsCi0gICAgMHg1M0ZDLCAweDUzRjgsIDB4NTNGNSwgMHg1M0VCLCAweDUzRTYsIDB4NTNFQSwgMHg1M0YyLCAweDUzRjEsCi0gICAgMHg1M0YwLCAweDUzRTUsIDB4NTNFRCwgMHg1M0ZCLCAweDU2REIsIDB4NTZEQSwgMHg1OTE2LCAweDU5MkUsCi0gICAgMHg1OTMxLCAweDU5NzQsIDB4NTk3NiwgMHg1QjU1LCAweDVCODMsIDB4NUMzQywgMHg1REU4LCAweDVERTcsCi0gICAgMHg1REU2LCAweDVFMDIsIDB4NUUwMywgMHg1RTczLCAweDVFN0MsIDB4NUYwMSwgMHg1RjE4LCAweDVGMTcsCi0gICAgMHg1RkM1LCAweDYyMEEsIDB4NjI1MywgMHg2MjU0LCAweDYyNTIsIDB4NjI1MSwgMHg2NUE1LCAweDY1RTYsCi0gICAgMHg2NzJFLCAweDY3MkMsIDB4NjcyQSwgMHg2NzJCLCAweDY3MkQsIDB4NkI2MywgMHg2QkNELCAweDZDMTEsCi0gICAgMHg2QzEwLCAweDZDMzgsIDB4NkM0MSwgMHg2QzQwLCAweDZDM0UsIDB4NzJBRiwgMHg3Mzg0LCAweDczODksCi0gICAgMHg3NERDLCAweDc0RTYsIDB4NzUxOCwgMHg3NTFGLCAweDc1MjgsIDB4NzUyOSwgMHg3NTMwLCAweDc1MzEsCi0gICAgMHg3NTMyLCAweDc1MzMsIDB4NzU4QiwgMHg3NjdELCAweDc2QUUsIDB4NzZCRiwgMHg3NkVFLCAweDc3REIsCi0gICAgMHg3N0UyLCAweDc3RjMsIDB4NzkzQSwgMHg3OUJFLCAweDdBNzQsIDB4N0FDQiwgMHg0RTFFLCAweDRFMUYsCi0gICAgMHg0RTUyLCAweDRFNTMsIDB4NEU2OSwgMHg0RTk5LCAweDRFQTQsIDB4NEVBNiwgMHg0RUE1LCAweDRFRkYsCi0gICAgMHg0RjA5LCAweDRGMTksIDB4NEYwQSwgMHg0RjE1LCAweDRGMEQsIDB4NEYxMCwgMHg0RjExLCAweDRGMEYsCi0gICAgMHg0RUYyLCAweDRFRjYsIDB4NEVGQiwgMHg0RUYwLCAweDRFRjMsIDB4NEVGRCwgMHg0RjAxLCAweDRGMEIsCi0gICAgMHg1MTQ5LCAweDUxNDcsIDB4NTE0NiwgMHg1MTQ4LCAweDUxNjgsIDB4NTE3MSwgMHg1MThELCAweDUxQjAsCi0gICAgMHg1MjE3LCAweDUyMTEsIDB4NTIxMiwgMHg1MjBFLCAweDUyMTYsIDB4NTJBMywgMHg1MzA4LCAweDUzMjEsCi0gICAgMHg1MzIwLCAweDUzNzAsIDB4NTM3MSwgMHg1NDA5LCAweDU0MEYsIDB4NTQwQywgMHg1NDBBLCAweDU0MTAsCi0gICAgMHg1NDAxLCAweDU0MEIsIDB4NTQwNCwgMHg1NDExLCAweDU0MEQsIDB4NTQwOCwgMHg1NDAzLCAweDU0MEUsCi0gICAgMHg1NDA2LCAweDU0MTIsIDB4NTZFMCwgMHg1NkRFLCAweDU2REQsIDB4NTczMywgMHg1NzMwLCAweDU3MjgsCi0gICAgMHg1NzJELCAweDU3MkMsIDB4NTcyRiwgMHg1NzI5LCAweDU5MTksIDB4NTkxQSwgMHg1OTM3LCAweDU5MzgsCi0gICAgMHg1OTg0LCAweDU5NzgsIDB4NTk4MywgMHg1OTdELCAweDU5NzksIDB4NTk4MiwgMHg1OTgxLCAweDVCNTcsCi0gICAgMHg1QjU4LCAweDVCODcsIDB4NUI4OCwgMHg1Qjg1LCAweDVCODksIDB4NUJGQSwgMHg1QzE2LCAweDVDNzksCi0gICAgMHg1RERFLCAweDVFMDYsIDB4NUU3NiwgMHg1RTc0LCAweDVGMEYsIDB4NUYxQiwgMHg1RkQ5LCAweDVGRDYsCi0gICAgMHg2MjBFLCAweDYyMEMsIDB4NjIwRCwgMHg2MjEwLCAweDYyNjMsIDB4NjI1QiwgMHg2MjU4LCAweDY1MzYsCi0gICAgMHg2NUU5LCAweDY1RTgsIDB4NjVFQywgMHg2NUVELCAweDY2RjIsIDB4NjZGMywgMHg2NzA5LCAweDY3M0QsCi0gICAgMHg2NzM0LCAweDY3MzEsIDB4NjczNSwgMHg2QjIxLCAweDZCNjQsIDB4NkI3QiwgMHg2QzE2LCAweDZDNUQsCi0gICAgMHg2QzU3LCAweDZDNTksIDB4NkM1RiwgMHg2QzYwLCAweDZDNTAsIDB4NkM1NSwgMHg2QzYxLCAweDZDNUIsCi0gICAgMHg2QzRELCAweDZDNEUsIDB4NzA3MCwgMHg3MjVGLCAweDcyNUQsIDB4NzY3RSwgMHg3QUY5LCAweDdDNzMsCi0gICAgMHg3Q0Y4LCAweDdGMzYsIDB4N0Y4QSwgMHg3RkJELCAweDgwMDEsIDB4ODAwMywgMHg4MDBDLCAweDgwMTIsCi0gICAgMHg4MDMzLCAweDgwN0YsIDB4ODA4OSwgMHg4MDhCLCAweDgwOEMsIDB4ODFFMywgMHg4MUVBLCAweDgxRjMsCi0gICAgMHg4MUZDLCAweDgyMEMsIDB4ODIxQiwgMHg4MjFGLCAweDgyNkUsIDB4ODI3MiwgMHg4MjdFLCAweDg2NkIsCi0gICAgMHg4ODQwLCAweDg4NEMsIDB4ODg2MywgMHg4OTdGLCAweDk2MjEsIDB4NEUzMiwgMHg0RUE4LCAweDRGNEQsCi0gICAgMHg0RjRGLCAweDRGNDcsIDB4NEY1NywgMHg0RjVFLCAweDRGMzQsIDB4NEY1QiwgMHg0RjU1LCAweDRGMzAsCi0gICAgMHg0RjUwLCAweDRGNTEsIDB4NEYzRCwgMHg0RjNBLCAweDRGMzgsIDB4NEY0MywgMHg0RjU0LCAweDRGM0MsCi0gICAgMHg0RjQ2LCAweDRGNjMsIDB4NEY1QywgMHg0RjYwLCAweDRGMkYsIDB4NEY0RSwgMHg0RjM2LCAweDRGNTksCi0gICAgMHg0RjVELCAweDRGNDgsIDB4NEY1QSwgMHg1MTRDLCAweDUxNEIsIDB4NTE0RCwgMHg1MTc1LCAweDUxQjYsCi0gICAgMHg1MUI3LCAweDUyMjUsIDB4NTIyNCwgMHg1MjI5LCAweDUyMkEsIDB4NTIyOCwgMHg1MkFCLCAweDUyQTksCi0gICAgMHg1MkFBLCAweDUyQUMsIDB4NTMyMywgMHg1MzczLCAweDUzNzUsIDB4NTQxRCwgMHg1NDJELCAweDU0MUUsCi0gICAgMHg1NDNFLCAweDU0MjYsIDB4NTQ0RSwgMHg1NDI3LCAweDU0NDYsIDB4NTQ0MywgMHg1NDMzLCAweDU0NDgsCi0gICAgMHg1NDQyLCAweDU0MUIsIDB4NTQyOSwgMHg1NDRBLCAweDU0MzksIDB4NTQzQiwgMHg1NDM4LCAweDU0MkUsCi0gICAgMHg1NDM1LCAweDU0MzYsIDB4NTQyMCwgMHg1NDNDLCAweDU0NDAsIDB4NTQzMSwgMHg1NDJCLCAweDU0MUYsCi0gICAgMHg1NDJDLCAweDU2RUEsIDB4NTZGMCwgMHg1NkU0LCAweDU2RUIsIDB4NTc0QSwgMHg1NzUxLCAweDU3NDAsCi0gICAgMHg1NzRELCAweDU3NDcsIDB4NTc0RSwgMHg1NzNFLCAweDU3NTAsIDB4NTc0RiwgMHg1NzNCLCAweDU4RUYsCi0gICAgMHg1OTNFLCAweDU5OUQsIDB4NTk5MiwgMHg1OUE4LCAweDU5OUUsIDB4NTlBMywgMHg1OTk5LCAweDU5OTYsCi0gICAgMHg1OThELCAweDU5QTQsIDB4NTk5MywgMHg1OThBLCAweDU5QTUsIDB4NUI1RCwgMHg1QjVDLCAweDVCNUEsCi0gICAgMHg1QjVCLCAweDVCOEMsIDB4NUI4QiwgMHg1QjhGLCAweDVDMkMsIDB4NUM0MCwgMHg1QzQxLCAweDVDM0YsCi0gICAgMHg1QzNFLCAweDVDOTAsIDB4NUM5MSwgMHg1Qzk0LCAweDVDOEMsIDB4NURFQiwgMHg1RTBDLCAweDVFOEYsCi0gICAgMHg1RTg3LCAweDVFOEEsIDB4NUVGNywgMHg1RjA0LCAweDVGMUYsIDB4NUY2NCwgMHg1RjYyLCAweDVGNzcsCi0gICAgMHg1Rjc5LCAweDVGRDgsIDB4NUZDQywgMHg1RkQ3LCAweDVGQ0QsIDB4NUZGMSwgMHg1RkVCLCAweDVGRjgsCi0gICAgMHg1RkVBLCAweDYyMTIsIDB4NjIxMSwgMHg2Mjg0LCAweDYyOTcsIDB4NjI5NiwgMHg2MjgwLCAweDYyNzYsCi0gICAgMHg2Mjg5LCAweDYyNkQsIDB4NjI4QSwgMHg2MjdDLCAweDYyN0UsIDB4NjI3OSwgMHg2MjczLCAweDYyOTIsCi0gICAgMHg2MjZGLCAweDYyOTgsIDB4NjI2RSwgMHg2Mjk1LCAweDYyOTMsIDB4NjI5MSwgMHg2Mjg2LCAweDY1MzksCi0gICAgMHg2NTNCLCAweDY1MzgsIDB4NjVGMSwgMHg2NkY0LCAweDY3NUYsIDB4Njc0RSwgMHg2NzRGLCAweDY3NTAsCi0gICAgMHg2NzUxLCAweDY3NUMsIDB4Njc1NiwgMHg2NzVFLCAweDY3NDksIDB4Njc0NiwgMHg2NzYwLCAweDY3NTMsCi0gICAgMHg2NzU3LCAweDZCNjUsIDB4NkJDRiwgMHg2QzQyLCAweDZDNUUsIDB4NkM5OSwgMHg2QzgxLCAweDZDODgsCi0gICAgMHg2Qzg5LCAweDZDODUsIDB4NkM5QiwgMHg2QzZBLCAweDZDN0EsIDB4NkM5MCwgMHg2QzcwLCAweDZDOEMsCi0gICAgMHg2QzY4LCAweDZDOTYsIDB4NkM5MiwgMHg2QzdELCAweDZDODMsIDB4NkM3MiwgMHg2QzdFLCAweDZDNzQsCi0gICAgMHg2Qzg2LCAweDZDNzYsIDB4NkM4RCwgMHg2Qzk0LCAweDZDOTgsIDB4NkM4MiwgMHg3MDc2LCAweDcwN0MsCi0gICAgMHg3MDdELCAweDcwNzgsIDB4NzI2MiwgMHg3MjYxLCAweDcyNjAsIDB4NzJDNCwgMHg3MkMyLCAweDczOTYsCi0gICAgMHg3NTJDLCAweDc1MkIsIDB4NzUzNywgMHg3NTM4LCAweDc2ODIsIDB4NzZFRiwgMHg3N0UzLCAweDc5QzEsCi0gICAgMHg3OUMwLCAweDc5QkYsIDB4N0E3NiwgMHg3Q0ZCLCAweDdGNTUsIDB4ODA5NiwgMHg4MDkzLCAweDgwOUQsCi0gICAgMHg4MDk4LCAweDgwOUIsIDB4ODA5QSwgMHg4MEIyLCAweDgyNkYsIDB4ODI5MiwgMHg4MjhCLCAweDgyOEQsCi0gICAgMHg4OThCLCAweDg5RDIsIDB4OEEwMCwgMHg4QzM3LCAweDhDNDYsIDB4OEM1NSwgMHg4QzlELCAweDhENjQsCi0gICAgMHg4RDcwLCAweDhEQjMsIDB4OEVBQiwgMHg4RUNBLCAweDhGOUIsIDB4OEZCMCwgMHg4RkMyLCAweDhGQzYsCi0gICAgMHg4RkM1LCAweDhGQzQsIDB4NURFMSwgMHg5MDkxLCAweDkwQTIsIDB4OTBBQSwgMHg5MEE2LCAweDkwQTMsCi0gICAgMHg5MTQ5LCAweDkxQzYsIDB4OTFDQywgMHg5NjMyLCAweDk2MkUsIDB4OTYzMSwgMHg5NjJBLCAweDk2MkMsCi0gICAgMHg0RTI2LCAweDRFNTYsIDB4NEU3MywgMHg0RThCLCAweDRFOUIsIDB4NEU5RSwgMHg0RUFCLCAweDRFQUMsCi0gICAgMHg0RjZGLCAweDRGOUQsIDB4NEY4RCwgMHg0RjczLCAweDRGN0YsIDB4NEY2QywgMHg0RjlCLCAweDRGOEIsCi0gICAgMHg0Rjg2LCAweDRGODMsIDB4NEY3MCwgMHg0Rjc1LCAweDRGODgsIDB4NEY2OSwgMHg0RjdCLCAweDRGOTYsCi0gICAgMHg0RjdFLCAweDRGOEYsIDB4NEY5MSwgMHg0RjdBLCAweDUxNTQsIDB4NTE1MiwgMHg1MTU1LCAweDUxNjksCi0gICAgMHg1MTc3LCAweDUxNzYsIDB4NTE3OCwgMHg1MUJELCAweDUxRkQsIDB4NTIzQiwgMHg1MjM4LCAweDUyMzcsCi0gICAgMHg1MjNBLCAweDUyMzAsIDB4NTIyRSwgMHg1MjM2LCAweDUyNDEsIDB4NTJCRSwgMHg1MkJCLCAweDUzNTIsCi0gICAgMHg1MzU0LCAweDUzNTMsIDB4NTM1MSwgMHg1MzY2LCAweDUzNzcsIDB4NTM3OCwgMHg1Mzc5LCAweDUzRDYsCi0gICAgMHg1M0Q0LCAweDUzRDcsIDB4NTQ3MywgMHg1NDc1LCAweDU0OTYsIDB4NTQ3OCwgMHg1NDk1LCAweDU0ODAsCi0gICAgMHg1NDdCLCAweDU0NzcsIDB4NTQ4NCwgMHg1NDkyLCAweDU0ODYsIDB4NTQ3QywgMHg1NDkwLCAweDU0NzEsCi0gICAgMHg1NDc2LCAweDU0OEMsIDB4NTQ5QSwgMHg1NDYyLCAweDU0NjgsIDB4NTQ4QiwgMHg1NDdELCAweDU0OEUsCi0gICAgMHg1NkZBLCAweDU3ODMsIDB4NTc3NywgMHg1NzZBLCAweDU3NjksIDB4NTc2MSwgMHg1NzY2LCAweDU3NjQsCi0gICAgMHg1NzdDLCAweDU5MUMsIDB4NTk0OSwgMHg1OTQ3LCAweDU5NDgsIDB4NTk0NCwgMHg1OTU0LCAweDU5QkUsCi0gICAgMHg1OUJCLCAweDU5RDQsIDB4NTlCOSwgMHg1OUFFLCAweDU5RDEsIDB4NTlDNiwgMHg1OUQwLCAweDU5Q0QsCi0gICAgMHg1OUNCLCAweDU5RDMsIDB4NTlDQSwgMHg1OUFGLCAweDU5QjMsIDB4NTlEMiwgMHg1OUM1LCAweDVCNUYsCi0gICAgMHg1QjY0LCAweDVCNjMsIDB4NUI5NywgMHg1QjlBLCAweDVCOTgsIDB4NUI5QywgMHg1Qjk5LCAweDVCOUIsCi0gICAgMHg1QzFBLCAweDVDNDgsIDB4NUM0NSwgMHg1QzQ2LCAweDVDQjcsIDB4NUNBMSwgMHg1Q0I4LCAweDVDQTksCi0gICAgMHg1Q0FCLCAweDVDQjEsIDB4NUNCMywgMHg1RTE4LCAweDVFMUEsIDB4NUUxNiwgMHg1RTE1LCAweDVFMUIsCi0gICAgMHg1RTExLCAweDVFNzgsIDB4NUU5QSwgMHg1RTk3LCAweDVFOUMsIDB4NUU5NSwgMHg1RTk2LCAweDVFRjYsCi0gICAgMHg1RjI2LCAweDVGMjcsIDB4NUYyOSwgMHg1RjgwLCAweDVGODEsIDB4NUY3RiwgMHg1RjdDLCAweDVGREQsCi0gICAgMHg1RkUwLCAweDVGRkQsIDB4NUZGNSwgMHg1RkZGLCAweDYwMEYsIDB4NjAxNCwgMHg2MDJGLCAweDYwMzUsCi0gICAgMHg2MDE2LCAweDYwMkEsIDB4NjAxNSwgMHg2MDIxLCAweDYwMjcsIDB4NjAyOSwgMHg2MDJCLCAweDYwMUIsCi0gICAgMHg2MjE2LCAweDYyMTUsIDB4NjIzRiwgMHg2MjNFLCAweDYyNDAsIDB4NjI3RiwgMHg2MkM5LCAweDYyQ0MsCi0gICAgMHg2MkM0LCAweDYyQkYsIDB4NjJDMiwgMHg2MkI5LCAweDYyRDIsIDB4NjJEQiwgMHg2MkFCLCAweDYyRDMsCi0gICAgMHg2MkQ0LCAweDYyQ0IsIDB4NjJDOCwgMHg2MkE4LCAweDYyQkQsIDB4NjJCQywgMHg2MkQwLCAweDYyRDksCi0gICAgMHg2MkM3LCAweDYyQ0QsIDB4NjJCNSwgMHg2MkRBLCAweDYyQjEsIDB4NjJEOCwgMHg2MkQ2LCAweDYyRDcsCi0gICAgMHg2MkM2LCAweDYyQUMsIDB4NjJDRSwgMHg2NTNFLCAweDY1QTcsIDB4NjVCQywgMHg2NUZBLCAweDY2MTQsCi0gICAgMHg2NjEzLCAweDY2MEMsIDB4NjYwNiwgMHg2NjAyLCAweDY2MEUsIDB4NjYwMCwgMHg2NjBGLCAweDY2MTUsCi0gICAgMHg2NjBBLCAweDY2MDcsIDB4NjcwRCwgMHg2NzBCLCAweDY3NkQsIDB4Njc4QiwgMHg2Nzk1LCAweDY3NzEsCi0gICAgMHg2NzlDLCAweDY3NzMsIDB4Njc3NywgMHg2Nzg3LCAweDY3OUQsIDB4Njc5NywgMHg2NzZGLCAweDY3NzAsCi0gICAgMHg2NzdGLCAweDY3ODksIDB4Njc3RSwgMHg2NzkwLCAweDY3NzUsIDB4Njc5QSwgMHg2NzkzLCAweDY3N0MsCi0gICAgMHg2NzZBLCAweDY3NzIsIDB4NkIyMywgMHg2QjY2LCAweDZCNjcsIDB4NkI3RiwgMHg2QzEzLCAweDZDMUIsCi0gICAgMHg2Q0UzLCAweDZDRTgsIDB4NkNGMywgMHg2Q0IxLCAweDZDQ0MsIDB4NkNFNSwgMHg2Q0IzLCAweDZDQkQsCi0gICAgMHg2Q0JFLCAweDZDQkMsIDB4NkNFMiwgMHg2Q0FCLCAweDZDRDUsIDB4NkNEMywgMHg2Q0I4LCAweDZDQzQsCi0gICAgMHg2Q0I5LCAweDZDQzEsIDB4NkNBRSwgMHg2Q0Q3LCAweDZDQzUsIDB4NkNGMSwgMHg2Q0JGLCAweDZDQkIsCi0gICAgMHg2Q0UxLCAweDZDREIsIDB4NkNDQSwgMHg2Q0FDLCAweDZDRUYsIDB4NkNEQywgMHg2Q0Q2LCAweDZDRTAsCi0gICAgMHg3MDk1LCAweDcwOEUsIDB4NzA5MiwgMHg3MDhBLCAweDcwOTksIDB4NzIyQywgMHg3MjJELCAweDcyMzgsCi0gICAgMHg3MjQ4LCAweDcyNjcsIDB4NzI2OSwgMHg3MkMwLCAweDcyQ0UsIDB4NzJEOSwgMHg3MkQ3LCAweDcyRDAsCi0gICAgMHg3M0E5LCAweDczQTgsIDB4NzM5RiwgMHg3M0FCLCAweDczQTUsIDB4NzUzRCwgMHg3NTlELCAweDc1OTksCi0gICAgMHg3NTlBLCAweDc2ODQsIDB4NzZDMiwgMHg3NkYyLCAweDc2RjQsIDB4NzdFNSwgMHg3N0ZELCAweDc5M0UsCi0gICAgMHg3OTQwLCAweDc5NDEsIDB4NzlDOSwgMHg3OUM4LCAweDdBN0EsIDB4N0E3OSwgMHg3QUZBLCAweDdDRkUsCi0gICAgMHg3RjU0LCAweDdGOEMsIDB4N0Y4QiwgMHg4MDA1LCAweDgwQkEsIDB4ODBBNSwgMHg4MEEyLCAweDgwQjEsCi0gICAgMHg4MEExLCAweDgwQUIsIDB4ODBBOSwgMHg4MEI0LCAweDgwQUEsIDB4ODBBRiwgMHg4MUU1LCAweDgxRkUsCi0gICAgMHg4MjBELCAweDgyQjMsIDB4ODI5RCwgMHg4Mjk5LCAweDgyQUQsIDB4ODJCRCwgMHg4MjlGLCAweDgyQjksCi0gICAgMHg4MkIxLCAweDgyQUMsIDB4ODJBNSwgMHg4MkFGLCAweDgyQjgsIDB4ODJBMywgMHg4MkIwLCAweDgyQkUsCi0gICAgMHg4MkI3LCAweDg2NEUsIDB4ODY3MSwgMHg1MjFELCAweDg4NjgsIDB4OEVDQiwgMHg4RkNFLCAweDhGRDQsCi0gICAgMHg4RkQxLCAweDkwQjUsIDB4OTBCOCwgMHg5MEIxLCAweDkwQjYsIDB4OTFDNywgMHg5MUQxLCAweDk1NzcsCi0gICAgMHg5NTgwLCAweDk2MUMsIDB4OTY0MCwgMHg5NjNGLCAweDk2M0IsIDB4OTY0NCwgMHg5NjQyLCAweDk2QjksCi0gICAgMHg5NkU4LCAweDk3NTIsIDB4OTc1RSwgMHg0RTlGLCAweDRFQUQsIDB4NEVBRSwgMHg0RkUxLCAweDRGQjUsCi0gICAgMHg0RkFGLCAweDRGQkYsIDB4NEZFMCwgMHg0RkQxLCAweDRGQ0YsIDB4NEZERCwgMHg0RkMzLCAweDRGQjYsCi0gICAgMHg0RkQ4LCAweDRGREYsIDB4NEZDQSwgMHg0RkQ3LCAweDRGQUUsIDB4NEZEMCwgMHg0RkM0LCAweDRGQzIsCi0gICAgMHg0RkRBLCAweDRGQ0UsIDB4NEZERSwgMHg0RkI3LCAweDUxNTcsIDB4NTE5MiwgMHg1MTkxLCAweDUxQTAsCi0gICAgMHg1MjRFLCAweDUyNDMsIDB4NTI0QSwgMHg1MjRELCAweDUyNEMsIDB4NTI0QiwgMHg1MjQ3LCAweDUyQzcsCi0gICAgMHg1MkM5LCAweDUyQzMsIDB4NTJDMSwgMHg1MzBELCAweDUzNTcsIDB4NTM3QiwgMHg1MzlBLCAweDUzREIsCi0gICAgMHg1NEFDLCAweDU0QzAsIDB4NTRBOCwgMHg1NENFLCAweDU0QzksIDB4NTRCOCwgMHg1NEE2LCAweDU0QjMsCi0gICAgMHg1NEM3LCAweDU0QzIsIDB4NTRCRCwgMHg1NEFBLCAweDU0QzEsIDB4NTRDNCwgMHg1NEM4LCAweDU0QUYsCi0gICAgMHg1NEFCLCAweDU0QjEsIDB4NTRCQiwgMHg1NEE5LCAweDU0QTcsIDB4NTRCRiwgMHg1NkZGLCAweDU3ODIsCi0gICAgMHg1NzhCLCAweDU3QTAsIDB4NTdBMywgMHg1N0EyLCAweDU3Q0UsIDB4NTdBRSwgMHg1NzkzLCAweDU5NTUsCi0gICAgMHg1OTUxLCAweDU5NEYsIDB4NTk0RSwgMHg1OTUwLCAweDU5REMsIDB4NTlEOCwgMHg1OUZGLCAweDU5RTMsCi0gICAgMHg1OUU4LCAweDVBMDMsIDB4NTlFNSwgMHg1OUVBLCAweDU5REEsIDB4NTlFNiwgMHg1QTAxLCAweDU5RkIsCi0gICAgMHg1QjY5LCAweDVCQTMsIDB4NUJBNiwgMHg1QkE0LCAweDVCQTIsIDB4NUJBNSwgMHg1QzAxLCAweDVDNEUsCi0gICAgMHg1QzRGLCAweDVDNEQsIDB4NUM0QiwgMHg1Q0Q5LCAweDVDRDIsIDB4NURGNywgMHg1RTFELCAweDVFMjUsCi0gICAgMHg1RTFGLCAweDVFN0QsIDB4NUVBMCwgMHg1RUE2LCAweDVFRkEsIDB4NUYwOCwgMHg1RjJELCAweDVGNjUsCi0gICAgMHg1Rjg4LCAweDVGODUsIDB4NUY4QSwgMHg1RjhCLCAweDVGODcsIDB4NUY4QywgMHg1Rjg5LCAweDYwMTIsCi0gICAgMHg2MDFELCAweDYwMjAsIDB4NjAyNSwgMHg2MDBFLCAweDYwMjgsIDB4NjA0RCwgMHg2MDcwLCAweDYwNjgsCi0gICAgMHg2MDYyLCAweDYwNDYsIDB4NjA0MywgMHg2MDZDLCAweDYwNkIsIDB4NjA2QSwgMHg2MDY0LCAweDYyNDEsCi0gICAgMHg2MkRDLCAweDYzMTYsIDB4NjMwOSwgMHg2MkZDLCAweDYyRUQsIDB4NjMwMSwgMHg2MkVFLCAweDYyRkQsCi0gICAgMHg2MzA3LCAweDYyRjEsIDB4NjJGNywgMHg2MkVGLCAweDYyRUMsIDB4NjJGRSwgMHg2MkY0LCAweDYzMTEsCi0gICAgMHg2MzAyLCAweDY1M0YsIDB4NjU0NSwgMHg2NUFCLCAweDY1QkQsIDB4NjVFMiwgMHg2NjI1LCAweDY2MkQsCi0gICAgMHg2NjIwLCAweDY2MjcsIDB4NjYyRiwgMHg2NjFGLCAweDY2MjgsIDB4NjYzMSwgMHg2NjI0LCAweDY2RjcsCi0gICAgMHg2N0ZGLCAweDY3RDMsIDB4NjdGMSwgMHg2N0Q0LCAweDY3RDAsIDB4NjdFQywgMHg2N0I2LCAweDY3QUYsCi0gICAgMHg2N0Y1LCAweDY3RTksIDB4NjdFRiwgMHg2N0M0LCAweDY3RDEsIDB4NjdCNCwgMHg2N0RBLCAweDY3RTUsCi0gICAgMHg2N0I4LCAweDY3Q0YsIDB4NjdERSwgMHg2N0YzLCAweDY3QjAsIDB4NjdEOSwgMHg2N0UyLCAweDY3REQsCi0gICAgMHg2N0QyLCAweDZCNkEsIDB4NkI4MywgMHg2Qjg2LCAweDZCQjUsIDB4NkJEMiwgMHg2QkQ3LCAweDZDMUYsCi0gICAgMHg2Q0M5LCAweDZEMEIsIDB4NkQzMiwgMHg2RDJBLCAweDZENDEsIDB4NkQyNSwgMHg2RDBDLCAweDZEMzEsCi0gICAgMHg2RDFFLCAweDZEMTcsIDB4NkQzQiwgMHg2RDNELCAweDZEM0UsIDB4NkQzNiwgMHg2RDFCLCAweDZDRjUsCi0gICAgMHg2RDM5LCAweDZEMjcsIDB4NkQzOCwgMHg2RDI5LCAweDZEMkUsIDB4NkQzNSwgMHg2RDBFLCAweDZEMkIsCi0gICAgMHg3MEFCLCAweDcwQkEsIDB4NzBCMywgMHg3MEFDLCAweDcwQUYsIDB4NzBBRCwgMHg3MEI4LCAweDcwQUUsCi0gICAgMHg3MEE0LCAweDcyMzAsIDB4NzI3MiwgMHg3MjZGLCAweDcyNzQsIDB4NzJFOSwgMHg3MkUwLCAweDcyRTEsCi0gICAgMHg3M0I3LCAweDczQ0EsIDB4NzNCQiwgMHg3M0IyLCAweDczQ0QsIDB4NzNDMCwgMHg3M0IzLCAweDc1MUEsCi0gICAgMHg3NTJELCAweDc1NEYsIDB4NzU0QywgMHg3NTRFLCAweDc1NEIsIDB4NzVBQiwgMHg3NUE0LCAweDc1QTUsCi0gICAgMHg3NUEyLCAweDc1QTMsIDB4NzY3OCwgMHg3Njg2LCAweDc2ODcsIDB4NzY4OCwgMHg3NkM4LCAweDc2QzYsCi0gICAgMHg3NkMzLCAweDc2QzUsIDB4NzcwMSwgMHg3NkY5LCAweDc2RjgsIDB4NzcwOSwgMHg3NzBCLCAweDc2RkUsCi0gICAgMHg3NkZDLCAweDc3MDcsIDB4NzdEQywgMHg3ODAyLCAweDc4MTQsIDB4NzgwQywgMHg3ODBELCAweDc5NDYsCi0gICAgMHg3OTQ5LCAweDc5NDgsIDB4Nzk0NywgMHg3OUI5LCAweDc5QkEsIDB4NzlEMSwgMHg3OUQyLCAweDc5Q0IsCi0gICAgMHg3QTdGLCAweDdBODEsIDB4N0FGRiwgMHg3QUZELCAweDdDN0QsIDB4N0QwMiwgMHg3RDA1LCAweDdEMDAsCi0gICAgMHg3RDA5LCAweDdEMDcsIDB4N0QwNCwgMHg3RDA2LCAweDdGMzgsIDB4N0Y4RSwgMHg3RkJGLCAweDgwMTAsCi0gICAgMHg4MDBELCAweDgwMTEsIDB4ODAzNiwgMHg4MEQ2LCAweDgwRTUsIDB4ODBEQSwgMHg4MEMzLCAweDgwQzQsCi0gICAgMHg4MENDLCAweDgwRTEsIDB4ODBEQiwgMHg4MENFLCAweDgwREUsIDB4ODBFNCwgMHg4MERELCAweDgxRjQsCi0gICAgMHg4MjIyLCAweDgyRTcsIDB4ODMwMywgMHg4MzA1LCAweDgyRTMsIDB4ODJEQiwgMHg4MkU2LCAweDgzMDQsCi0gICAgMHg4MkU1LCAweDgzMDIsIDB4ODMwOSwgMHg4MkQyLCAweDgyRDcsIDB4ODJGMSwgMHg4MzAxLCAweDgyREMsCi0gICAgMHg4MkQ0LCAweDgyRDEsIDB4ODJERSwgMHg4MkQzLCAweDgyREYsIDB4ODJFRiwgMHg4MzA2LCAweDg2NTAsCi0gICAgMHg4Njc5LCAweDg2N0IsIDB4ODY3QSwgMHg4ODRELCAweDg4NkIsIDB4ODk4MSwgMHg4OUQ0LCAweDhBMDgsCi0gICAgMHg4QTAyLCAweDhBMDMsIDB4OEM5RSwgMHg4Q0EwLCAweDhENzQsIDB4OEQ3MywgMHg4REI0LCAweDhFQ0QsCi0gICAgMHg4RUNDLCAweDhGRjAsIDB4OEZFNiwgMHg4RkUyLCAweDhGRUEsIDB4OEZFNSwgMHg4RkVELCAweDhGRUIsCi0gICAgMHg4RkU0LCAweDhGRTgsIDB4OTBDQSwgMHg5MENFLCAweDkwQzEsIDB4OTBDMywgMHg5MTRCLCAweDkxNEEsCi0gICAgMHg5MUNELCAweDk1ODIsIDB4OTY1MCwgMHg5NjRCLCAweDk2NEMsIDB4OTY0RCwgMHg5NzYyLCAweDk3NjksCi0gICAgMHg5N0NCLCAweDk3RUQsIDB4OTdGMywgMHg5ODAxLCAweDk4QTgsIDB4OThEQiwgMHg5OERGLCAweDk5OTYsCi0gICAgMHg5OTk5LCAweDRFNTgsIDB4NEVCMywgMHg1MDBDLCAweDUwMEQsIDB4NTAyMywgMHg0RkVGLCAweDUwMjYsCi0gICAgMHg1MDI1LCAweDRGRjgsIDB4NTAyOSwgMHg1MDE2LCAweDUwMDYsIDB4NTAzQywgMHg1MDFGLCAweDUwMUEsCi0gICAgMHg1MDEyLCAweDUwMTEsIDB4NEZGQSwgMHg1MDAwLCAweDUwMTQsIDB4NTAyOCwgMHg0RkYxLCAweDUwMjEsCi0gICAgMHg1MDBCLCAweDUwMTksIDB4NTAxOCwgMHg0RkYzLCAweDRGRUUsIDB4NTAyRCwgMHg1MDJBLCAweDRGRkUsCi0gICAgMHg1MDJCLCAweDUwMDksIDB4NTE3QywgMHg1MUE0LCAweDUxQTUsIDB4NTFBMiwgMHg1MUNELCAweDUxQ0MsCi0gICAgMHg1MUM2LCAweDUxQ0IsIDB4NTI1NiwgMHg1MjVDLCAweDUyNTQsIDB4NTI1QiwgMHg1MjVELCAweDUzMkEsCi0gICAgMHg1MzdGLCAweDUzOUYsIDB4NTM5RCwgMHg1M0RGLCAweDU0RTgsIDB4NTUxMCwgMHg1NTAxLCAweDU1MzcsCi0gICAgMHg1NEZDLCAweDU0RTUsIDB4NTRGMiwgMHg1NTA2LCAweDU0RkEsIDB4NTUxNCwgMHg1NEU5LCAweDU0RUQsCi0gICAgMHg1NEUxLCAweDU1MDksIDB4NTRFRSwgMHg1NEVBLCAweDU0RTYsIDB4NTUyNywgMHg1NTA3LCAweDU0RkQsCi0gICAgMHg1NTBGLCAweDU3MDMsIDB4NTcwNCwgMHg1N0MyLCAweDU3RDQsIDB4NTdDQiwgMHg1N0MzLCAweDU4MDksCi0gICAgMHg1OTBGLCAweDU5NTcsIDB4NTk1OCwgMHg1OTVBLCAweDVBMTEsIDB4NUExOCwgMHg1QTFDLCAweDVBMUYsCi0gICAgMHg1QTFCLCAweDVBMTMsIDB4NTlFQywgMHg1QTIwLCAweDVBMjMsIDB4NUEyOSwgMHg1QTI1LCAweDVBMEMsCi0gICAgMHg1QTA5LCAweDVCNkIsIDB4NUM1OCwgMHg1QkIwLCAweDVCQjMsIDB4NUJCNiwgMHg1QkI0LCAweDVCQUUsCi0gICAgMHg1QkI1LCAweDVCQjksIDB4NUJCOCwgMHg1QzA0LCAweDVDNTEsIDB4NUM1NSwgMHg1QzUwLCAweDVDRUQsCi0gICAgMHg1Q0ZELCAweDVDRkIsIDB4NUNFQSwgMHg1Q0U4LCAweDVDRjAsIDB4NUNGNiwgMHg1RDAxLCAweDVDRjQsCi0gICAgMHg1REVFLCAweDVFMkQsIDB4NUUyQiwgMHg1RUFCLCAweDVFQUQsIDB4NUVBNywgMHg1RjMxLCAweDVGOTIsCi0gICAgMHg1RjkxLCAweDVGOTAsIDB4NjA1OSwgMHg2MDYzLCAweDYwNjUsIDB4NjA1MCwgMHg2MDU1LCAweDYwNkQsCi0gICAgMHg2MDY5LCAweDYwNkYsIDB4NjA4NCwgMHg2MDlGLCAweDYwOUEsIDB4NjA4RCwgMHg2MDk0LCAweDYwOEMsCi0gICAgMHg2MDg1LCAweDYwOTYsIDB4NjI0NywgMHg2MkYzLCAweDYzMDgsIDB4NjJGRiwgMHg2MzRFLCAweDYzM0UsCi0gICAgMHg2MzJGLCAweDYzNTUsIDB4NjM0MiwgMHg2MzQ2LCAweDYzNEYsIDB4NjM0OSwgMHg2MzNBLCAweDYzNTAsCi0gICAgMHg2MzNELCAweDYzMkEsIDB4NjMyQiwgMHg2MzI4LCAweDYzNEQsIDB4NjM0QywgMHg2NTQ4LCAweDY1NDksCi0gICAgMHg2NTk5LCAweDY1QzEsIDB4NjVDNSwgMHg2NjQyLCAweDY2NDksIDB4NjY0RiwgMHg2NjQzLCAweDY2NTIsCi0gICAgMHg2NjRDLCAweDY2NDUsIDB4NjY0MSwgMHg2NkY4LCAweDY3MTQsIDB4NjcxNSwgMHg2NzE3LCAweDY4MjEsCi0gICAgMHg2ODM4LCAweDY4NDgsIDB4Njg0NiwgMHg2ODUzLCAweDY4MzksIDB4Njg0MiwgMHg2ODU0LCAweDY4MjksCi0gICAgMHg2OEIzLCAweDY4MTcsIDB4Njg0QywgMHg2ODUxLCAweDY4M0QsIDB4NjdGNCwgMHg2ODUwLCAweDY4NDAsCi0gICAgMHg2ODNDLCAweDY4NDMsIDB4NjgyQSwgMHg2ODQ1LCAweDY4MTMsIDB4NjgxOCwgMHg2ODQxLCAweDZCOEEsCi0gICAgMHg2Qjg5LCAweDZCQjcsIDB4NkMyMywgMHg2QzI3LCAweDZDMjgsIDB4NkMyNiwgMHg2QzI0LCAweDZDRjAsCi0gICAgMHg2RDZBLCAweDZEOTUsIDB4NkQ4OCwgMHg2RDg3LCAweDZENjYsIDB4NkQ3OCwgMHg2RDc3LCAweDZENTksCi0gICAgMHg2RDkzLCAweDZENkMsIDB4NkQ4OSwgMHg2RDZFLCAweDZENUEsIDB4NkQ3NCwgMHg2RDY5LCAweDZEOEMsCi0gICAgMHg2RDhBLCAweDZENzksIDB4NkQ4NSwgMHg2RDY1LCAweDZEOTQsIDB4NzBDQSwgMHg3MEQ4LCAweDcwRTQsCi0gICAgMHg3MEQ5LCAweDcwQzgsIDB4NzBDRiwgMHg3MjM5LCAweDcyNzksIDB4NzJGQywgMHg3MkY5LCAweDcyRkQsCi0gICAgMHg3MkY4LCAweDcyRjcsIDB4NzM4NiwgMHg3M0VELCAweDc0MDksIDB4NzNFRSwgMHg3M0UwLCAweDczRUEsCi0gICAgMHg3M0RFLCAweDc1NTQsIDB4NzU1RCwgMHg3NTVDLCAweDc1NUEsIDB4NzU1OSwgMHg3NUJFLCAweDc1QzUsCi0gICAgMHg3NUM3LCAweDc1QjIsIDB4NzVCMywgMHg3NUJELCAweDc1QkMsIDB4NzVCOSwgMHg3NUMyLCAweDc1QjgsCi0gICAgMHg3NjhCLCAweDc2QjAsIDB4NzZDQSwgMHg3NkNELCAweDc2Q0UsIDB4NzcyOSwgMHg3NzFGLCAweDc3MjAsCi0gICAgMHg3NzI4LCAweDc3RTksIDB4NzgzMCwgMHg3ODI3LCAweDc4MzgsIDB4NzgxRCwgMHg3ODM0LCAweDc4MzcsCi0gICAgMHg3ODI1LCAweDc4MkQsIDB4NzgyMCwgMHg3ODFGLCAweDc4MzIsIDB4Nzk1NSwgMHg3OTUwLCAweDc5NjAsCi0gICAgMHg3OTVGLCAweDc5NTYsIDB4Nzk1RSwgMHg3OTVELCAweDc5NTcsIDB4Nzk1QSwgMHg3OUU0LCAweDc5RTMsCi0gICAgMHg3OUU3LCAweDc5REYsIDB4NzlFNiwgMHg3OUU5LCAweDc5RDgsIDB4N0E4NCwgMHg3QTg4LCAweDdBRDksCi0gICAgMHg3QjA2LCAweDdCMTEsIDB4N0M4OSwgMHg3RDIxLCAweDdEMTcsIDB4N0QwQiwgMHg3RDBBLCAweDdEMjAsCi0gICAgMHg3RDIyLCAweDdEMTQsIDB4N0QxMCwgMHg3RDE1LCAweDdEMUEsIDB4N0QxQywgMHg3RDBELCAweDdEMTksCi0gICAgMHg3RDFCLCAweDdGM0EsIDB4N0Y1RiwgMHg3Rjk0LCAweDdGQzUsIDB4N0ZDMSwgMHg4MDA2LCAweDgwMDQsCi0gICAgMHg4MDE4LCAweDgwMTUsIDB4ODAxOSwgMHg4MDE3LCAweDgwM0QsIDB4ODAzRiwgMHg4MEYxLCAweDgxMDIsCi0gICAgMHg4MEYwLCAweDgxMDUsIDB4ODBFRCwgMHg4MEY0LCAweDgxMDYsIDB4ODBGOCwgMHg4MEYzLCAweDgxMDgsCi0gICAgMHg4MEZELCAweDgxMEEsIDB4ODBGQywgMHg4MEVGLCAweDgxRUQsIDB4ODFFQywgMHg4MjAwLCAweDgyMTAsCi0gICAgMHg4MjJBLCAweDgyMkIsIDB4ODIyOCwgMHg4MjJDLCAweDgyQkIsIDB4ODMyQiwgMHg4MzUyLCAweDgzNTQsCi0gICAgMHg4MzRBLCAweDgzMzgsIDB4ODM1MCwgMHg4MzQ5LCAweDgzMzUsIDB4ODMzNCwgMHg4MzRGLCAweDgzMzIsCi0gICAgMHg4MzM5LCAweDgzMzYsIDB4ODMxNywgMHg4MzQwLCAweDgzMzEsIDB4ODMyOCwgMHg4MzQzLCAweDg2NTQsCi0gICAgMHg4NjhBLCAweDg2QUEsIDB4ODY5MywgMHg4NkE0LCAweDg2QTksIDB4ODY4QywgMHg4NkEzLCAweDg2OUMsCi0gICAgMHg4ODcwLCAweDg4NzcsIDB4ODg4MSwgMHg4ODgyLCAweDg4N0QsIDB4ODg3OSwgMHg4QTE4LCAweDhBMTAsCi0gICAgMHg4QTBFLCAweDhBMEMsIDB4OEExNSwgMHg4QTBBLCAweDhBMTcsIDB4OEExMywgMHg4QTE2LCAweDhBMEYsCi0gICAgMHg4QTExLCAweDhDNDgsIDB4OEM3QSwgMHg4Qzc5LCAweDhDQTEsIDB4OENBMiwgMHg4RDc3LCAweDhFQUMsCi0gICAgMHg4RUQyLCAweDhFRDQsIDB4OEVDRiwgMHg4RkIxLCAweDkwMDEsIDB4OTAwNiwgMHg4RkY3LCAweDkwMDAsCi0gICAgMHg4RkZBLCAweDhGRjQsIDB4OTAwMywgMHg4RkZELCAweDkwMDUsIDB4OEZGOCwgMHg5MDk1LCAweDkwRTEsCi0gICAgMHg5MERELCAweDkwRTIsIDB4OTE1MiwgMHg5MTRELCAweDkxNEMsIDB4OTFEOCwgMHg5MURELCAweDkxRDcsCi0gICAgMHg5MURDLCAweDkxRDksIDB4OTU4MywgMHg5NjYyLCAweDk2NjMsIDB4OTY2MSwgMHg5NjVCLCAweDk2NUQsCi0gICAgMHg5NjY0LCAweDk2NTgsIDB4OTY1RSwgMHg5NkJCLCAweDk4RTIsIDB4OTlBQywgMHg5QUE4LCAweDlBRDgsCi0gICAgMHg5QjI1LCAweDlCMzIsIDB4OUIzQywgMHg0RTdFLCAweDUwN0EsIDB4NTA3RCwgMHg1MDVDLCAweDUwNDcsCi0gICAgMHg1MDQzLCAweDUwNEMsIDB4NTA1QSwgMHg1MDQ5LCAweDUwNjUsIDB4NTA3NiwgMHg1MDRFLCAweDUwNTUsCi0gICAgMHg1MDc1LCAweDUwNzQsIDB4NTA3NywgMHg1MDRGLCAweDUwMEYsIDB4NTA2RiwgMHg1MDZELCAweDUxNUMsCi0gICAgMHg1MTk1LCAweDUxRjAsIDB4NTI2QSwgMHg1MjZGLCAweDUyRDIsIDB4NTJEOSwgMHg1MkQ4LCAweDUyRDUsCi0gICAgMHg1MzEwLCAweDUzMEYsIDB4NTMxOSwgMHg1MzNGLCAweDUzNDAsIDB4NTMzRSwgMHg1M0MzLCAweDY2RkMsCi0gICAgMHg1NTQ2LCAweDU1NkEsIDB4NTU2NiwgMHg1NTQ0LCAweDU1NUUsIDB4NTU2MSwgMHg1NTQzLCAweDU1NEEsCi0gICAgMHg1NTMxLCAweDU1NTYsIDB4NTU0RiwgMHg1NTU1LCAweDU1MkYsIDB4NTU2NCwgMHg1NTM4LCAweDU1MkUsCi0gICAgMHg1NTVDLCAweDU1MkMsIDB4NTU2MywgMHg1NTMzLCAweDU1NDEsIDB4NTU1NywgMHg1NzA4LCAweDU3MEIsCi0gICAgMHg1NzA5LCAweDU3REYsIDB4NTgwNSwgMHg1ODBBLCAweDU4MDYsIDB4NTdFMCwgMHg1N0U0LCAweDU3RkEsCi0gICAgMHg1ODAyLCAweDU4MzUsIDB4NTdGNywgMHg1N0Y5LCAweDU5MjAsIDB4NTk2MiwgMHg1QTM2LCAweDVBNDEsCi0gICAgMHg1QTQ5LCAweDVBNjYsIDB4NUE2QSwgMHg1QTQwLCAweDVBM0MsIDB4NUE2MiwgMHg1QTVBLCAweDVBNDYsCi0gICAgMHg1QTRBLCAweDVCNzAsIDB4NUJDNywgMHg1QkM1LCAweDVCQzQsIDB4NUJDMiwgMHg1QkJGLCAweDVCQzYsCi0gICAgMHg1QzA5LCAweDVDMDgsIDB4NUMwNywgMHg1QzYwLCAweDVDNUMsIDB4NUM1RCwgMHg1RDA3LCAweDVEMDYsCi0gICAgMHg1RDBFLCAweDVEMUIsIDB4NUQxNiwgMHg1RDIyLCAweDVEMTEsIDB4NUQyOSwgMHg1RDE0LCAweDVEMTksCi0gICAgMHg1RDI0LCAweDVEMjcsIDB4NUQxNywgMHg1REUyLCAweDVFMzgsIDB4NUUzNiwgMHg1RTMzLCAweDVFMzcsCi0gICAgMHg1RUI3LCAweDVFQjgsIDB4NUVCNiwgMHg1RUI1LCAweDVFQkUsIDB4NUYzNSwgMHg1RjM3LCAweDVGNTcsCi0gICAgMHg1RjZDLCAweDVGNjksIDB4NUY2QiwgMHg1Rjk3LCAweDVGOTksIDB4NUY5RSwgMHg1Rjk4LCAweDVGQTEsCi0gICAgMHg1RkEwLCAweDVGOUMsIDB4NjA3RiwgMHg2MEEzLCAweDYwODksIDB4NjBBMCwgMHg2MEE4LCAweDYwQ0IsCi0gICAgMHg2MEI0LCAweDYwRTYsIDB4NjBCRCwgMHg2MEM1LCAweDYwQkIsIDB4NjBCNSwgMHg2MERDLCAweDYwQkMsCi0gICAgMHg2MEQ4LCAweDYwRDUsIDB4NjBDNiwgMHg2MERGLCAweDYwQjgsIDB4NjBEQSwgMHg2MEM3LCAweDYyMUEsCi0gICAgMHg2MjFCLCAweDYyNDgsIDB4NjNBMCwgMHg2M0E3LCAweDYzNzIsIDB4NjM5NiwgMHg2M0EyLCAweDYzQTUsCi0gICAgMHg2Mzc3LCAweDYzNjcsIDB4NjM5OCwgMHg2M0FBLCAweDYzNzEsIDB4NjNBOSwgMHg2Mzg5LCAweDYzODMsCi0gICAgMHg2MzlCLCAweDYzNkIsIDB4NjNBOCwgMHg2Mzg0LCAweDYzODgsIDB4NjM5OSwgMHg2M0ExLCAweDYzQUMsCi0gICAgMHg2MzkyLCAweDYzOEYsIDB4NjM4MCwgMHg2MzdCLCAweDYzNjksIDB4NjM2OCwgMHg2MzdBLCAweDY1NUQsCi0gICAgMHg2NTU2LCAweDY1NTEsIDB4NjU1OSwgMHg2NTU3LCAweDU1NUYsIDB4NjU0RiwgMHg2NTU4LCAweDY1NTUsCi0gICAgMHg2NTU0LCAweDY1OUMsIDB4NjU5QiwgMHg2NUFDLCAweDY1Q0YsIDB4NjVDQiwgMHg2NUNDLCAweDY1Q0UsCi0gICAgMHg2NjVELCAweDY2NUEsIDB4NjY2NCwgMHg2NjY4LCAweDY2NjYsIDB4NjY1RSwgMHg2NkY5LCAweDUyRDcsCi0gICAgMHg2NzFCLCAweDY4ODEsIDB4NjhBRiwgMHg2OEEyLCAweDY4OTMsIDB4NjhCNSwgMHg2ODdGLCAweDY4NzYsCi0gICAgMHg2OEIxLCAweDY4QTcsIDB4Njg5NywgMHg2OEIwLCAweDY4ODMsIDB4NjhDNCwgMHg2OEFELCAweDY4ODYsCi0gICAgMHg2ODg1LCAweDY4OTQsIDB4Njg5RCwgMHg2OEE4LCAweDY4OUYsIDB4NjhBMSwgMHg2ODgyLCAweDZCMzIsCi0gICAgMHg2QkJBLCAweDZCRUIsIDB4NkJFQywgMHg2QzJCLCAweDZEOEUsIDB4NkRCQywgMHg2REYzLCAweDZERDksCi0gICAgMHg2REIyLCAweDZERTEsIDB4NkRDQywgMHg2REU0LCAweDZERkIsIDB4NkRGQSwgMHg2RTA1LCAweDZEQzcsCi0gICAgMHg2RENCLCAweDZEQUYsIDB4NkREMSwgMHg2REFFLCAweDZEREUsIDB4NkRGOSwgMHg2REI4LCAweDZERjcsCi0gICAgMHg2REY1LCAweDZEQzUsIDB4NkREMiwgMHg2RTFBLCAweDZEQjUsIDB4NkREQSwgMHg2REVCLCAweDZERDgsCi0gICAgMHg2REVBLCAweDZERjEsIDB4NkRFRSwgMHg2REU4LCAweDZEQzYsIDB4NkRDNCwgMHg2REFBLCAweDZERUMsCi0gICAgMHg2REJGLCAweDZERTYsIDB4NzBGOSwgMHg3MTA5LCAweDcxMEEsIDB4NzBGRCwgMHg3MEVGLCAweDcyM0QsCi0gICAgMHg3MjdELCAweDcyODEsIDB4NzMxQywgMHg3MzFCLCAweDczMTYsIDB4NzMxMywgMHg3MzE5LCAweDczODcsCi0gICAgMHg3NDA1LCAweDc0MEEsIDB4NzQwMywgMHg3NDA2LCAweDczRkUsIDB4NzQwRCwgMHg3NEUwLCAweDc0RjYsCi0gICAgMHg3NEY3LCAweDc1MUMsIDB4NzUyMiwgMHg3NTY1LCAweDc1NjYsIDB4NzU2MiwgMHg3NTcwLCAweDc1OEYsCi0gICAgMHg3NUQ0LCAweDc1RDUsIDB4NzVCNSwgMHg3NUNBLCAweDc1Q0QsIDB4NzY4RSwgMHg3NkQ0LCAweDc2RDIsCi0gICAgMHg3NkRCLCAweDc3MzcsIDB4NzczRSwgMHg3NzNDLCAweDc3MzYsIDB4NzczOCwgMHg3NzNBLCAweDc4NkIsCi0gICAgMHg3ODQzLCAweDc4NEUsIDB4Nzk2NSwgMHg3OTY4LCAweDc5NkQsIDB4NzlGQiwgMHg3QTkyLCAweDdBOTUsCi0gICAgMHg3QjIwLCAweDdCMjgsIDB4N0IxQiwgMHg3QjJDLCAweDdCMjYsIDB4N0IxOSwgMHg3QjFFLCAweDdCMkUsCi0gICAgMHg3QzkyLCAweDdDOTcsIDB4N0M5NSwgMHg3RDQ2LCAweDdENDMsIDB4N0Q3MSwgMHg3RDJFLCAweDdEMzksCi0gICAgMHg3RDNDLCAweDdENDAsIDB4N0QzMCwgMHg3RDMzLCAweDdENDQsIDB4N0QyRiwgMHg3RDQyLCAweDdEMzIsCi0gICAgMHg3RDMxLCAweDdGM0QsIDB4N0Y5RSwgMHg3RjlBLCAweDdGQ0MsIDB4N0ZDRSwgMHg3RkQyLCAweDgwMUMsCi0gICAgMHg4MDRBLCAweDgwNDYsIDB4ODEyRiwgMHg4MTE2LCAweDgxMjMsIDB4ODEyQiwgMHg4MTI5LCAweDgxMzAsCi0gICAgMHg4MTI0LCAweDgyMDIsIDB4ODIzNSwgMHg4MjM3LCAweDgyMzYsIDB4ODIzOSwgMHg4MzhFLCAweDgzOUUsCi0gICAgMHg4Mzk4LCAweDgzNzgsIDB4ODNBMiwgMHg4Mzk2LCAweDgzQkQsIDB4ODNBQiwgMHg4MzkyLCAweDgzOEEsCi0gICAgMHg4MzkzLCAweDgzODksIDB4ODNBMCwgMHg4Mzc3LCAweDgzN0IsIDB4ODM3QywgMHg4Mzg2LCAweDgzQTcsCi0gICAgMHg4NjU1LCAweDVGNkEsIDB4ODZDNywgMHg4NkMwLCAweDg2QjYsIDB4ODZDNCwgMHg4NkI1LCAweDg2QzYsCi0gICAgMHg4NkNCLCAweDg2QjEsIDB4ODZBRiwgMHg4NkM5LCAweDg4NTMsIDB4ODg5RSwgMHg4ODg4LCAweDg4QUIsCi0gICAgMHg4ODkyLCAweDg4OTYsIDB4ODg4RCwgMHg4ODhCLCAweDg5OTMsIDB4ODk4RiwgMHg4QTJBLCAweDhBMUQsCi0gICAgMHg4QTIzLCAweDhBMjUsIDB4OEEzMSwgMHg4QTJELCAweDhBMUYsIDB4OEExQiwgMHg4QTIyLCAweDhDNDksCi0gICAgMHg4QzVBLCAweDhDQTksIDB4OENBQywgMHg4Q0FCLCAweDhDQTgsIDB4OENBQSwgMHg4Q0E3LCAweDhENjcsCi0gICAgMHg4RDY2LCAweDhEQkUsIDB4OERCQSwgMHg4RURCLCAweDhFREYsIDB4OTAxOSwgMHg5MDBELCAweDkwMUEsCi0gICAgMHg5MDE3LCAweDkwMjMsIDB4OTAxRiwgMHg5MDFELCAweDkwMTAsIDB4OTAxNSwgMHg5MDFFLCAweDkwMjAsCi0gICAgMHg5MDBGLCAweDkwMjIsIDB4OTAxNiwgMHg5MDFCLCAweDkwMTQsIDB4OTBFOCwgMHg5MEVELCAweDkwRkQsCi0gICAgMHg5MTU3LCAweDkxQ0UsIDB4OTFGNSwgMHg5MUU2LCAweDkxRTMsIDB4OTFFNywgMHg5MUVELCAweDkxRTksCi0gICAgMHg5NTg5LCAweDk2NkEsIDB4OTY3NSwgMHg5NjczLCAweDk2NzgsIDB4OTY3MCwgMHg5Njc0LCAweDk2NzYsCi0gICAgMHg5Njc3LCAweDk2NkMsIDB4OTZDMCwgMHg5NkVBLCAweDk2RTksIDB4N0FFMCwgMHg3QURGLCAweDk4MDIsCi0gICAgMHg5ODAzLCAweDlCNUEsIDB4OUNFNSwgMHg5RTc1LCAweDlFN0YsIDB4OUVBNSwgMHg5RUJCLCAweDUwQTIsCi0gICAgMHg1MDhELCAweDUwODUsIDB4NTA5OSwgMHg1MDkxLCAweDUwODAsIDB4NTA5NiwgMHg1MDk4LCAweDUwOUEsCi0gICAgMHg2NzAwLCAweDUxRjEsIDB4NTI3MiwgMHg1Mjc0LCAweDUyNzUsIDB4NTI2OSwgMHg1MkRFLCAweDUyREQsCi0gICAgMHg1MkRCLCAweDUzNUEsIDB4NTNBNSwgMHg1NTdCLCAweDU1ODAsIDB4NTVBNywgMHg1NTdDLCAweDU1OEEsCi0gICAgMHg1NTlELCAweDU1OTgsIDB4NTU4MiwgMHg1NTlDLCAweDU1QUEsIDB4NTU5NCwgMHg1NTg3LCAweDU1OEIsCi0gICAgMHg1NTgzLCAweDU1QjMsIDB4NTVBRSwgMHg1NTlGLCAweDU1M0UsIDB4NTVCMiwgMHg1NTlBLCAweDU1QkIsCi0gICAgMHg1NUFDLCAweDU1QjEsIDB4NTU3RSwgMHg1NTg5LCAweDU1QUIsIDB4NTU5OSwgMHg1NzBELCAweDU4MkYsCi0gICAgMHg1ODJBLCAweDU4MzQsIDB4NTgyNCwgMHg1ODMwLCAweDU4MzEsIDB4NTgyMSwgMHg1ODFELCAweDU4MjAsCi0gICAgMHg1OEY5LCAweDU4RkEsIDB4NTk2MCwgMHg1QTc3LCAweDVBOUEsIDB4NUE3RiwgMHg1QTkyLCAweDVBOUIsCi0gICAgMHg1QUE3LCAweDVCNzMsIDB4NUI3MSwgMHg1QkQyLCAweDVCQ0MsIDB4NUJEMywgMHg1QkQwLCAweDVDMEEsCi0gICAgMHg1QzBCLCAweDVDMzEsIDB4NUQ0QywgMHg1RDUwLCAweDVEMzQsIDB4NUQ0NywgMHg1REZELCAweDVFNDUsCi0gICAgMHg1RTNELCAweDVFNDAsIDB4NUU0MywgMHg1RTdFLCAweDVFQ0EsIDB4NUVDMSwgMHg1RUMyLCAweDVFQzQsCi0gICAgMHg1RjNDLCAweDVGNkQsIDB4NUZBOSwgMHg1RkFBLCAweDVGQTgsIDB4NjBEMSwgMHg2MEUxLCAweDYwQjIsCi0gICAgMHg2MEI2LCAweDYwRTAsIDB4NjExQywgMHg2MTIzLCAweDYwRkEsIDB4NjExNSwgMHg2MEYwLCAweDYwRkIsCi0gICAgMHg2MEY0LCAweDYxNjgsIDB4NjBGMSwgMHg2MTBFLCAweDYwRjYsIDB4NjEwOSwgMHg2MTAwLCAweDYxMTIsCi0gICAgMHg2MjFGLCAweDYyNDksIDB4NjNBMywgMHg2MzhDLCAweDYzQ0YsIDB4NjNDMCwgMHg2M0U5LCAweDYzQzksCi0gICAgMHg2M0M2LCAweDYzQ0QsIDB4NjNEMiwgMHg2M0UzLCAweDYzRDAsIDB4NjNFMSwgMHg2M0Q2LCAweDYzRUQsCi0gICAgMHg2M0VFLCAweDYzNzYsIDB4NjNGNCwgMHg2M0VBLCAweDYzREIsIDB4NjQ1MiwgMHg2M0RBLCAweDYzRjksCi0gICAgMHg2NTVFLCAweDY1NjYsIDB4NjU2MiwgMHg2NTYzLCAweDY1OTEsIDB4NjU5MCwgMHg2NUFGLCAweDY2NkUsCi0gICAgMHg2NjcwLCAweDY2NzQsIDB4NjY3NiwgMHg2NjZGLCAweDY2OTEsIDB4NjY3QSwgMHg2NjdFLCAweDY2NzcsCi0gICAgMHg2NkZFLCAweDY2RkYsIDB4NjcxRiwgMHg2NzFELCAweDY4RkEsIDB4NjhENSwgMHg2OEUwLCAweDY4RDgsCi0gICAgMHg2OEQ3LCAweDY5MDUsIDB4NjhERiwgMHg2OEY1LCAweDY4RUUsIDB4NjhFNywgMHg2OEY5LCAweDY4RDIsCi0gICAgMHg2OEYyLCAweDY4RTMsIDB4NjhDQiwgMHg2OENELCAweDY5MEQsIDB4NjkxMiwgMHg2OTBFLCAweDY4QzksCi0gICAgMHg2OERBLCAweDY5NkUsIDB4NjhGQiwgMHg2QjNFLCAweDZCM0EsIDB4NkIzRCwgMHg2Qjk4LCAweDZCOTYsCi0gICAgMHg2QkJDLCAweDZCRUYsIDB4NkMyRSwgMHg2QzJGLCAweDZDMkMsIDB4NkUyRiwgMHg2RTM4LCAweDZFNTQsCi0gICAgMHg2RTIxLCAweDZFMzIsIDB4NkU2NywgMHg2RTRBLCAweDZFMjAsIDB4NkUyNSwgMHg2RTIzLCAweDZFMUIsCi0gICAgMHg2RTVCLCAweDZFNTgsIDB4NkUyNCwgMHg2RTU2LCAweDZFNkUsIDB4NkUyRCwgMHg2RTI2LCAweDZFNkYsCi0gICAgMHg2RTM0LCAweDZFNEQsIDB4NkUzQSwgMHg2RTJDLCAweDZFNDMsIDB4NkUxRCwgMHg2RTNFLCAweDZFQ0IsCi0gICAgMHg2RTg5LCAweDZFMTksIDB4NkU0RSwgMHg2RTYzLCAweDZFNDQsIDB4NkU3MiwgMHg2RTY5LCAweDZFNUYsCi0gICAgMHg3MTE5LCAweDcxMUEsIDB4NzEyNiwgMHg3MTMwLCAweDcxMjEsIDB4NzEzNiwgMHg3MTZFLCAweDcxMUMsCi0gICAgMHg3MjRDLCAweDcyODQsIDB4NzI4MCwgMHg3MzM2LCAweDczMjUsIDB4NzMzNCwgMHg3MzI5LCAweDc0M0EsCi0gICAgMHg3NDJBLCAweDc0MzMsIDB4NzQyMiwgMHg3NDI1LCAweDc0MzUsIDB4NzQzNiwgMHg3NDM0LCAweDc0MkYsCi0gICAgMHg3NDFCLCAweDc0MjYsIDB4NzQyOCwgMHg3NTI1LCAweDc1MjYsIDB4NzU2QiwgMHg3NTZBLCAweDc1RTIsCi0gICAgMHg3NURCLCAweDc1RTMsIDB4NzVEOSwgMHg3NUQ4LCAweDc1REUsIDB4NzVFMCwgMHg3NjdCLCAweDc2N0MsCi0gICAgMHg3Njk2LCAweDc2OTMsIDB4NzZCNCwgMHg3NkRDLCAweDc3NEYsIDB4NzdFRCwgMHg3ODVELCAweDc4NkMsCi0gICAgMHg3ODZGLCAweDdBMEQsIDB4N0EwOCwgMHg3QTBCLCAweDdBMDUsIDB4N0EwMCwgMHg3QTk4LCAweDdBOTcsCi0gICAgMHg3QTk2LCAweDdBRTUsIDB4N0FFMywgMHg3QjQ5LCAweDdCNTYsIDB4N0I0NiwgMHg3QjUwLCAweDdCNTIsCi0gICAgMHg3QjU0LCAweDdCNEQsIDB4N0I0QiwgMHg3QjRGLCAweDdCNTEsIDB4N0M5RiwgMHg3Q0E1LCAweDdENUUsCi0gICAgMHg3RDUwLCAweDdENjgsIDB4N0Q1NSwgMHg3RDJCLCAweDdENkUsIDB4N0Q3MiwgMHg3RDYxLCAweDdENjYsCi0gICAgMHg3RDYyLCAweDdENzAsIDB4N0Q3MywgMHg1NTg0LCAweDdGRDQsIDB4N0ZENSwgMHg4MDBCLCAweDgwNTIsCi0gICAgMHg4MDg1LCAweDgxNTUsIDB4ODE1NCwgMHg4MTRCLCAweDgxNTEsIDB4ODE0RSwgMHg4MTM5LCAweDgxNDYsCi0gICAgMHg4MTNFLCAweDgxNEMsIDB4ODE1MywgMHg4MTc0LCAweDgyMTIsIDB4ODIxQywgMHg4M0U5LCAweDg0MDMsCi0gICAgMHg4M0Y4LCAweDg0MEQsIDB4ODNFMCwgMHg4M0M1LCAweDg0MEIsIDB4ODNDMSwgMHg4M0VGLCAweDgzRjEsCi0gICAgMHg4M0Y0LCAweDg0NTcsIDB4ODQwQSwgMHg4M0YwLCAweDg0MEMsIDB4ODNDQywgMHg4M0ZELCAweDgzRjIsCi0gICAgMHg4M0NBLCAweDg0MzgsIDB4ODQwRSwgMHg4NDA0LCAweDgzREMsIDB4ODQwNywgMHg4M0Q0LCAweDgzREYsCi0gICAgMHg4NjVCLCAweDg2REYsIDB4ODZEOSwgMHg4NkVELCAweDg2RDQsIDB4ODZEQiwgMHg4NkU0LCAweDg2RDAsCi0gICAgMHg4NkRFLCAweDg4NTcsIDB4ODhDMSwgMHg4OEMyLCAweDg4QjEsIDB4ODk4MywgMHg4OTk2LCAweDhBM0IsCi0gICAgMHg4QTYwLCAweDhBNTUsIDB4OEE1RSwgMHg4QTNDLCAweDhBNDEsIDB4OEE1NCwgMHg4QTVCLCAweDhBNTAsCi0gICAgMHg4QTQ2LCAweDhBMzQsIDB4OEEzQSwgMHg4QTM2LCAweDhBNTYsIDB4OEM2MSwgMHg4QzgyLCAweDhDQUYsCi0gICAgMHg4Q0JDLCAweDhDQjMsIDB4OENCRCwgMHg4Q0MxLCAweDhDQkIsIDB4OENDMCwgMHg4Q0I0LCAweDhDQjcsCi0gICAgMHg4Q0I2LCAweDhDQkYsIDB4OENCOCwgMHg4RDhBLCAweDhEODUsIDB4OEQ4MSwgMHg4RENFLCAweDhEREQsCi0gICAgMHg4RENCLCAweDhEREEsIDB4OEREMSwgMHg4RENDLCAweDhEREIsIDB4OERDNiwgMHg4RUZCLCAweDhFRjgsCi0gICAgMHg4RUZDLCAweDhGOUMsIDB4OTAyRSwgMHg5MDM1LCAweDkwMzEsIDB4OTAzOCwgMHg5MDMyLCAweDkwMzYsCi0gICAgMHg5MTAyLCAweDkwRjUsIDB4OTEwOSwgMHg5MEZFLCAweDkxNjMsIDB4OTE2NSwgMHg5MUNGLCAweDkyMTQsCi0gICAgMHg5MjE1LCAweDkyMjMsIDB4OTIwOSwgMHg5MjFFLCAweDkyMEQsIDB4OTIxMCwgMHg5MjA3LCAweDkyMTEsCi0gICAgMHg5NTk0LCAweDk1OEYsIDB4OTU4QiwgMHg5NTkxLCAweDk1OTMsIDB4OTU5MiwgMHg5NThFLCAweDk2OEEsCi0gICAgMHg5NjhFLCAweDk2OEIsIDB4OTY3RCwgMHg5Njg1LCAweDk2ODYsIDB4OTY4RCwgMHg5NjcyLCAweDk2ODQsCi0gICAgMHg5NkMxLCAweDk2QzUsIDB4OTZDNCwgMHg5NkM2LCAweDk2QzcsIDB4OTZFRiwgMHg5NkYyLCAweDk3Q0MsCi0gICAgMHg5ODA1LCAweDk4MDYsIDB4OTgwOCwgMHg5OEU3LCAweDk4RUEsIDB4OThFRiwgMHg5OEU5LCAweDk4RjIsCi0gICAgMHg5OEVELCAweDk5QUUsIDB4OTlBRCwgMHg5RUMzLCAweDlFQ0QsIDB4OUVEMSwgMHg0RTgyLCAweDUwQUQsCi0gICAgMHg1MEI1LCAweDUwQjIsIDB4NTBCMywgMHg1MEM1LCAweDUwQkUsIDB4NTBBQywgMHg1MEI3LCAweDUwQkIsCi0gICAgMHg1MEFGLCAweDUwQzcsIDB4NTI3RiwgMHg1Mjc3LCAweDUyN0QsIDB4NTJERiwgMHg1MkU2LCAweDUyRTQsCi0gICAgMHg1MkUyLCAweDUyRTMsIDB4NTMyRiwgMHg1NURGLCAweDU1RTgsIDB4NTVEMywgMHg1NUU2LCAweDU1Q0UsCi0gICAgMHg1NURDLCAweDU1QzcsIDB4NTVEMSwgMHg1NUUzLCAweDU1RTQsIDB4NTVFRiwgMHg1NURBLCAweDU1RTEsCi0gICAgMHg1NUM1LCAweDU1QzYsIDB4NTVFNSwgMHg1NUM5LCAweDU3MTIsIDB4NTcxMywgMHg1ODVFLCAweDU4NTEsCi0gICAgMHg1ODU4LCAweDU4NTcsIDB4NTg1QSwgMHg1ODU0LCAweDU4NkIsIDB4NTg0QywgMHg1ODZELCAweDU4NEEsCi0gICAgMHg1ODYyLCAweDU4NTIsIDB4NTg0QiwgMHg1OTY3LCAweDVBQzEsIDB4NUFDOSwgMHg1QUNDLCAweDVBQkUsCi0gICAgMHg1QUJELCAweDVBQkMsIDB4NUFCMywgMHg1QUMyLCAweDVBQjIsIDB4NUQ2OSwgMHg1RDZGLCAweDVFNEMsCi0gICAgMHg1RTc5LCAweDVFQzksIDB4NUVDOCwgMHg1RjEyLCAweDVGNTksIDB4NUZBQywgMHg1RkFFLCAweDYxMUEsCi0gICAgMHg2MTBGLCAweDYxNDgsIDB4NjExRiwgMHg2MEYzLCAweDYxMUIsIDB4NjBGOSwgMHg2MTAxLCAweDYxMDgsCi0gICAgMHg2MTRFLCAweDYxNEMsIDB4NjE0NCwgMHg2MTRELCAweDYxM0UsIDB4NjEzNCwgMHg2MTI3LCAweDYxMEQsCi0gICAgMHg2MTA2LCAweDYxMzcsIDB4NjIyMSwgMHg2MjIyLCAweDY0MTMsIDB4NjQzRSwgMHg2NDFFLCAweDY0MkEsCi0gICAgMHg2NDJELCAweDY0M0QsIDB4NjQyQywgMHg2NDBGLCAweDY0MUMsIDB4NjQxNCwgMHg2NDBELCAweDY0MzYsCi0gICAgMHg2NDE2LCAweDY0MTcsIDB4NjQwNiwgMHg2NTZDLCAweDY1OUYsIDB4NjVCMCwgMHg2Njk3LCAweDY2ODksCi0gICAgMHg2Njg3LCAweDY2ODgsIDB4NjY5NiwgMHg2Njg0LCAweDY2OTgsIDB4NjY4RCwgMHg2NzAzLCAweDY5OTQsCi0gICAgMHg2OTZELCAweDY5NUEsIDB4Njk3NywgMHg2OTYwLCAweDY5NTQsIDB4Njk3NSwgMHg2OTMwLCAweDY5ODIsCi0gICAgMHg2OTRBLCAweDY5NjgsIDB4Njk2QiwgMHg2OTVFLCAweDY5NTMsIDB4Njk3OSwgMHg2OTg2LCAweDY5NUQsCi0gICAgMHg2OTYzLCAweDY5NUIsIDB4NkI0NywgMHg2QjcyLCAweDZCQzAsIDB4NkJCRiwgMHg2QkQzLCAweDZCRkQsCi0gICAgMHg2RUEyLCAweDZFQUYsIDB4NkVEMywgMHg2RUI2LCAweDZFQzIsIDB4NkU5MCwgMHg2RTlELCAweDZFQzcsCi0gICAgMHg2RUM1LCAweDZFQTUsIDB4NkU5OCwgMHg2RUJDLCAweDZFQkEsIDB4NkVBQiwgMHg2RUQxLCAweDZFOTYsCi0gICAgMHg2RTlDLCAweDZFQzQsIDB4NkVENCwgMHg2RUFBLCAweDZFQTcsIDB4NkVCNCwgMHg3MTRFLCAweDcxNTksCi0gICAgMHg3MTY5LCAweDcxNjQsIDB4NzE0OSwgMHg3MTY3LCAweDcxNUMsIDB4NzE2QywgMHg3MTY2LCAweDcxNEMsCi0gICAgMHg3MTY1LCAweDcxNUUsIDB4NzE0NiwgMHg3MTY4LCAweDcxNTYsIDB4NzIzQSwgMHg3MjUyLCAweDczMzcsCi0gICAgMHg3MzQ1LCAweDczM0YsIDB4NzMzRSwgMHg3NDZGLCAweDc0NUEsIDB4NzQ1NSwgMHg3NDVGLCAweDc0NUUsCi0gICAgMHg3NDQxLCAweDc0M0YsIDB4NzQ1OSwgMHg3NDVCLCAweDc0NUMsIDB4NzU3NiwgMHg3NTc4LCAweDc2MDAsCi0gICAgMHg3NUYwLCAweDc2MDEsIDB4NzVGMiwgMHg3NUYxLCAweDc1RkEsIDB4NzVGRiwgMHg3NUY0LCAweDc1RjMsCi0gICAgMHg3NkRFLCAweDc2REYsIDB4Nzc1QiwgMHg3NzZCLCAweDc3NjYsIDB4Nzc1RSwgMHg3NzYzLCAweDc3NzksCi0gICAgMHg3NzZBLCAweDc3NkMsIDB4Nzc1QywgMHg3NzY1LCAweDc3NjgsIDB4Nzc2MiwgMHg3N0VFLCAweDc4OEUsCi0gICAgMHg3OEIwLCAweDc4OTcsIDB4Nzg5OCwgMHg3ODhDLCAweDc4ODksIDB4Nzg3QywgMHg3ODkxLCAweDc4OTMsCi0gICAgMHg3ODdGLCAweDc5N0EsIDB4Nzk3RiwgMHg3OTgxLCAweDg0MkMsIDB4NzlCRCwgMHg3QTFDLCAweDdBMUEsCi0gICAgMHg3QTIwLCAweDdBMTQsIDB4N0ExRiwgMHg3QTFFLCAweDdBOUYsIDB4N0FBMCwgMHg3Qjc3LCAweDdCQzAsCi0gICAgMHg3QjYwLCAweDdCNkUsIDB4N0I2NywgMHg3Q0IxLCAweDdDQjMsIDB4N0NCNSwgMHg3RDkzLCAweDdENzksCi0gICAgMHg3RDkxLCAweDdEODEsIDB4N0Q4RiwgMHg3RDVCLCAweDdGNkUsIDB4N0Y2OSwgMHg3RjZBLCAweDdGNzIsCi0gICAgMHg3RkE5LCAweDdGQTgsIDB4N0ZBNCwgMHg4MDU2LCAweDgwNTgsIDB4ODA4NiwgMHg4MDg0LCAweDgxNzEsCi0gICAgMHg4MTcwLCAweDgxNzgsIDB4ODE2NSwgMHg4MTZFLCAweDgxNzMsIDB4ODE2QiwgMHg4MTc5LCAweDgxN0EsCi0gICAgMHg4MTY2LCAweDgyMDUsIDB4ODI0NywgMHg4NDgyLCAweDg0NzcsIDB4ODQzRCwgMHg4NDMxLCAweDg0NzUsCi0gICAgMHg4NDY2LCAweDg0NkIsIDB4ODQ0OSwgMHg4NDZDLCAweDg0NUIsIDB4ODQzQywgMHg4NDM1LCAweDg0NjEsCi0gICAgMHg4NDYzLCAweDg0NjksIDB4ODQ2RCwgMHg4NDQ2LCAweDg2NUUsIDB4ODY1QywgMHg4NjVGLCAweDg2RjksCi0gICAgMHg4NzEzLCAweDg3MDgsIDB4ODcwNywgMHg4NzAwLCAweDg2RkUsIDB4ODZGQiwgMHg4NzAyLCAweDg3MDMsCi0gICAgMHg4NzA2LCAweDg3MEEsIDB4ODg1OSwgMHg4OERGLCAweDg4RDQsIDB4ODhEOSwgMHg4OERDLCAweDg4RDgsCi0gICAgMHg4OERELCAweDg4RTEsIDB4ODhDQSwgMHg4OEQ1LCAweDg4RDIsIDB4ODk5QywgMHg4OUUzLCAweDhBNkIsCi0gICAgMHg4QTcyLCAweDhBNzMsIDB4OEE2NiwgMHg4QTY5LCAweDhBNzAsIDB4OEE4NywgMHg4QTdDLCAweDhBNjMsCi0gICAgMHg4QUEwLCAweDhBNzEsIDB4OEE4NSwgMHg4QTZELCAweDhBNjIsIDB4OEE2RSwgMHg4QTZDLCAweDhBNzksCi0gICAgMHg4QTdCLCAweDhBM0UsIDB4OEE2OCwgMHg4QzYyLCAweDhDOEEsIDB4OEM4OSwgMHg4Q0NBLCAweDhDQzcsCi0gICAgMHg4Q0M4LCAweDhDQzQsIDB4OENCMiwgMHg4Q0MzLCAweDhDQzIsIDB4OENDNSwgMHg4REUxLCAweDhEREYsCi0gICAgMHg4REU4LCAweDhERUYsIDB4OERGMywgMHg4REZBLCAweDhERUEsIDB4OERFNCwgMHg4REU2LCAweDhFQjIsCi0gICAgMHg4RjAzLCAweDhGMDksIDB4OEVGRSwgMHg4RjBBLCAweDhGOUYsIDB4OEZCMiwgMHg5MDRCLCAweDkwNEEsCi0gICAgMHg5MDUzLCAweDkwNDIsIDB4OTA1NCwgMHg5MDNDLCAweDkwNTUsIDB4OTA1MCwgMHg5MDQ3LCAweDkwNEYsCi0gICAgMHg5MDRFLCAweDkwNEQsIDB4OTA1MSwgMHg5MDNFLCAweDkwNDEsIDB4OTExMiwgMHg5MTE3LCAweDkxNkMsCi0gICAgMHg5MTZBLCAweDkxNjksIDB4OTFDOSwgMHg5MjM3LCAweDkyNTcsIDB4OTIzOCwgMHg5MjNELCAweDkyNDAsCi0gICAgMHg5MjNFLCAweDkyNUIsIDB4OTI0QiwgMHg5MjY0LCAweDkyNTEsIDB4OTIzNCwgMHg5MjQ5LCAweDkyNEQsCi0gICAgMHg5MjQ1LCAweDkyMzksIDB4OTIzRiwgMHg5MjVBLCAweDk1OTgsIDB4OTY5OCwgMHg5Njk0LCAweDk2OTUsCi0gICAgMHg5NkNELCAweDk2Q0IsIDB4OTZDOSwgMHg5NkNBLCAweDk2RjcsIDB4OTZGQiwgMHg5NkY5LCAweDk2RjYsCi0gICAgMHg5NzU2LCAweDk3NzQsIDB4OTc3NiwgMHg5ODEwLCAweDk4MTEsIDB4OTgxMywgMHg5ODBBLCAweDk4MTIsCi0gICAgMHg5ODBDLCAweDk4RkMsIDB4OThGNCwgMHg5OEZELCAweDk4RkUsIDB4OTlCMywgMHg5OUIxLCAweDk5QjQsCi0gICAgMHg5QUUxLCAweDlDRTksIDB4OUU4MiwgMHg5RjBFLCAweDlGMTMsIDB4OUYyMCwgMHg1MEU3LCAweDUwRUUsCi0gICAgMHg1MEU1LCAweDUwRDYsIDB4NTBFRCwgMHg1MERBLCAweDUwRDUsIDB4NTBDRiwgMHg1MEQxLCAweDUwRjEsCi0gICAgMHg1MENFLCAweDUwRTksIDB4NTE2MiwgMHg1MUYzLCAweDUyODMsIDB4NTI4MiwgMHg1MzMxLCAweDUzQUQsCi0gICAgMHg1NUZFLCAweDU2MDAsIDB4NTYxQiwgMHg1NjE3LCAweDU1RkQsIDB4NTYxNCwgMHg1NjA2LCAweDU2MDksCi0gICAgMHg1NjBELCAweDU2MEUsIDB4NTVGNywgMHg1NjE2LCAweDU2MUYsIDB4NTYwOCwgMHg1NjEwLCAweDU1RjYsCi0gICAgMHg1NzE4LCAweDU3MTYsIDB4NTg3NSwgMHg1ODdFLCAweDU4ODMsIDB4NTg5MywgMHg1ODhBLCAweDU4NzksCi0gICAgMHg1ODg1LCAweDU4N0QsIDB4NThGRCwgMHg1OTI1LCAweDU5MjIsIDB4NTkyNCwgMHg1OTZBLCAweDU5NjksCi0gICAgMHg1QUUxLCAweDVBRTYsIDB4NUFFOSwgMHg1QUQ3LCAweDVBRDYsIDB4NUFEOCwgMHg1QUUzLCAweDVCNzUsCi0gICAgMHg1QkRFLCAweDVCRTcsIDB4NUJFMSwgMHg1QkU1LCAweDVCRTYsIDB4NUJFOCwgMHg1QkUyLCAweDVCRTQsCi0gICAgMHg1QkRGLCAweDVDMEQsIDB4NUM2MiwgMHg1RDg0LCAweDVEODcsIDB4NUU1QiwgMHg1RTYzLCAweDVFNTUsCi0gICAgMHg1RTU3LCAweDVFNTQsIDB4NUVEMywgMHg1RUQ2LCAweDVGMEEsIDB4NUY0NiwgMHg1RjcwLCAweDVGQjksCi0gICAgMHg2MTQ3LCAweDYxM0YsIDB4NjE0QiwgMHg2MTc3LCAweDYxNjIsIDB4NjE2MywgMHg2MTVGLCAweDYxNUEsCi0gICAgMHg2MTU4LCAweDYxNzUsIDB4NjIyQSwgMHg2NDg3LCAweDY0NTgsIDB4NjQ1NCwgMHg2NEE0LCAweDY0NzgsCi0gICAgMHg2NDVGLCAweDY0N0EsIDB4NjQ1MSwgMHg2NDY3LCAweDY0MzQsIDB4NjQ2RCwgMHg2NDdCLCAweDY1NzIsCi0gICAgMHg2NUExLCAweDY1RDcsIDB4NjVENiwgMHg2NkEyLCAweDY2QTgsIDB4NjY5RCwgMHg2OTlDLCAweDY5QTgsCi0gICAgMHg2OTk1LCAweDY5QzEsIDB4NjlBRSwgMHg2OUQzLCAweDY5Q0IsIDB4Njk5QiwgMHg2OUI3LCAweDY5QkIsCi0gICAgMHg2OUFCLCAweDY5QjQsIDB4NjlEMCwgMHg2OUNELCAweDY5QUQsIDB4NjlDQywgMHg2OUE2LCAweDY5QzMsCi0gICAgMHg2OUEzLCAweDZCNDksIDB4NkI0QywgMHg2QzMzLCAweDZGMzMsIDB4NkYxNCwgMHg2RUZFLCAweDZGMTMsCi0gICAgMHg2RUY0LCAweDZGMjksIDB4NkYzRSwgMHg2RjIwLCAweDZGMkMsIDB4NkYwRiwgMHg2RjAyLCAweDZGMjIsCi0gICAgMHg2RUZGLCAweDZFRUYsIDB4NkYwNiwgMHg2RjMxLCAweDZGMzgsIDB4NkYzMiwgMHg2RjIzLCAweDZGMTUsCi0gICAgMHg2RjJCLCAweDZGMkYsIDB4NkY4OCwgMHg2RjJBLCAweDZFRUMsIDB4NkYwMSwgMHg2RUYyLCAweDZFQ0MsCi0gICAgMHg2RUY3LCAweDcxOTQsIDB4NzE5OSwgMHg3MTdELCAweDcxOEEsIDB4NzE4NCwgMHg3MTkyLCAweDcyM0UsCi0gICAgMHg3MjkyLCAweDcyOTYsIDB4NzM0NCwgMHg3MzUwLCAweDc0NjQsIDB4NzQ2MywgMHg3NDZBLCAweDc0NzAsCi0gICAgMHg3NDZELCAweDc1MDQsIDB4NzU5MSwgMHg3NjI3LCAweDc2MEQsIDB4NzYwQiwgMHg3NjA5LCAweDc2MTMsCi0gICAgMHg3NkUxLCAweDc2RTMsIDB4Nzc4NCwgMHg3NzdELCAweDc3N0YsIDB4Nzc2MSwgMHg3OEMxLCAweDc4OUYsCi0gICAgMHg3OEE3LCAweDc4QjMsIDB4NzhBOSwgMHg3OEEzLCAweDc5OEUsIDB4Nzk4RiwgMHg3OThELCAweDdBMkUsCi0gICAgMHg3QTMxLCAweDdBQUEsIDB4N0FBOSwgMHg3QUVELCAweDdBRUYsIDB4N0JBMSwgMHg3Qjk1LCAweDdCOEIsCi0gICAgMHg3Qjc1LCAweDdCOTcsIDB4N0I5RCwgMHg3Qjk0LCAweDdCOEYsIDB4N0JCOCwgMHg3Qjg3LCAweDdCODQsCi0gICAgMHg3Q0I5LCAweDdDQkQsIDB4N0NCRSwgMHg3REJCLCAweDdEQjAsIDB4N0Q5QywgMHg3REJELCAweDdEQkUsCi0gICAgMHg3REEwLCAweDdEQ0EsIDB4N0RCNCwgMHg3REIyLCAweDdEQjEsIDB4N0RCQSwgMHg3REEyLCAweDdEQkYsCi0gICAgMHg3REI1LCAweDdEQjgsIDB4N0RBRCwgMHg3REQyLCAweDdEQzcsIDB4N0RBQywgMHg3RjcwLCAweDdGRTAsCi0gICAgMHg3RkUxLCAweDdGREYsIDB4ODA1RSwgMHg4MDVBLCAweDgwODcsIDB4ODE1MCwgMHg4MTgwLCAweDgxOEYsCi0gICAgMHg4MTg4LCAweDgxOEEsIDB4ODE3RiwgMHg4MTgyLCAweDgxRTcsIDB4ODFGQSwgMHg4MjA3LCAweDgyMTQsCi0gICAgMHg4MjFFLCAweDgyNEIsIDB4ODRDOSwgMHg4NEJGLCAweDg0QzYsIDB4ODRDNCwgMHg4NDk5LCAweDg0OUUsCi0gICAgMHg4NEIyLCAweDg0OUMsIDB4ODRDQiwgMHg4NEI4LCAweDg0QzAsIDB4ODREMywgMHg4NDkwLCAweDg0QkMsCi0gICAgMHg4NEQxLCAweDg0Q0EsIDB4ODczRiwgMHg4NzFDLCAweDg3M0IsIDB4ODcyMiwgMHg4NzI1LCAweDg3MzQsCi0gICAgMHg4NzE4LCAweDg3NTUsIDB4ODczNywgMHg4NzI5LCAweDg4RjMsIDB4ODkwMiwgMHg4OEY0LCAweDg4RjksCi0gICAgMHg4OEY4LCAweDg4RkQsIDB4ODhFOCwgMHg4OTFBLCAweDg4RUYsIDB4OEFBNiwgMHg4QThDLCAweDhBOUUsCi0gICAgMHg4QUEzLCAweDhBOEQsIDB4OEFBMSwgMHg4QTkzLCAweDhBQTQsIDB4OEFBQSwgMHg4QUE1LCAweDhBQTgsCi0gICAgMHg4QTk4LCAweDhBOTEsIDB4OEE5QSwgMHg4QUE3LCAweDhDNkEsIDB4OEM4RCwgMHg4QzhDLCAweDhDRDMsCi0gICAgMHg4Q0QxLCAweDhDRDIsIDB4OEQ2QiwgMHg4RDk5LCAweDhEOTUsIDB4OERGQywgMHg4RjE0LCAweDhGMTIsCi0gICAgMHg4RjE1LCAweDhGMTMsIDB4OEZBMywgMHg5MDYwLCAweDkwNTgsIDB4OTA1QywgMHg5MDYzLCAweDkwNTksCi0gICAgMHg5MDVFLCAweDkwNjIsIDB4OTA1RCwgMHg5MDVCLCAweDkxMTksIDB4OTExOCwgMHg5MTFFLCAweDkxNzUsCi0gICAgMHg5MTc4LCAweDkxNzcsIDB4OTE3NCwgMHg5Mjc4LCAweDkyQUMsIDB4OTI4MCwgMHg5Mjg1LCAweDkyOTgsCi0gICAgMHg5Mjk2LCAweDkyN0IsIDB4OTI5MywgMHg5MjlDLCAweDkyQTgsIDB4OTI3QywgMHg5MjkxLCAweDk1QTEsCi0gICAgMHg5NUE4LCAweDk1QTksIDB4OTVBMywgMHg5NUE1LCAweDk1QTQsIDB4OTY5OSwgMHg5NjlDLCAweDk2OUIsCi0gICAgMHg5NkNDLCAweDk2RDIsIDB4OTcwMCwgMHg5NzdDLCAweDk3ODUsIDB4OTdGNiwgMHg5ODE3LCAweDk4MTgsCi0gICAgMHg5OEFGLCAweDk4QjEsIDB4OTkwMywgMHg5OTA1LCAweDk5MEMsIDB4OTkwOSwgMHg5OUMxLCAweDlBQUYsCi0gICAgMHg5QUIwLCAweDlBRTYsIDB4OUI0MSwgMHg5QjQyLCAweDlDRjQsIDB4OUNGNiwgMHg5Q0YzLCAweDlFQkMsCi0gICAgMHg5RjNCLCAweDlGNEEsIDB4NTEwNCwgMHg1MTAwLCAweDUwRkIsIDB4NTBGNSwgMHg1MEY5LCAweDUxMDIsCi0gICAgMHg1MTA4LCAweDUxMDksIDB4NTEwNSwgMHg1MURDLCAweDUyODcsIDB4NTI4OCwgMHg1Mjg5LCAweDUyOEQsCi0gICAgMHg1MjhBLCAweDUyRjAsIDB4NTNCMiwgMHg1NjJFLCAweDU2M0IsIDB4NTYzOSwgMHg1NjMyLCAweDU2M0YsCi0gICAgMHg1NjM0LCAweDU2MjksIDB4NTY1MywgMHg1NjRFLCAweDU2NTcsIDB4NTY3NCwgMHg1NjM2LCAweDU2MkYsCi0gICAgMHg1NjMwLCAweDU4ODAsIDB4NTg5RiwgMHg1ODlFLCAweDU4QjMsIDB4NTg5QywgMHg1OEFFLCAweDU4QTksCi0gICAgMHg1OEE2LCAweDU5NkQsIDB4NUIwOSwgMHg1QUZCLCAweDVCMEIsIDB4NUFGNSwgMHg1QjBDLCAweDVCMDgsCi0gICAgMHg1QkVFLCAweDVCRUMsIDB4NUJFOSwgMHg1QkVCLCAweDVDNjQsIDB4NUM2NSwgMHg1RDlELCAweDVEOTQsCi0gICAgMHg1RTYyLCAweDVFNUYsIDB4NUU2MSwgMHg1RUUyLCAweDVFREEsIDB4NUVERiwgMHg1RURELCAweDVFRTMsCi0gICAgMHg1RUUwLCAweDVGNDgsIDB4NUY3MSwgMHg1RkI3LCAweDVGQjUsIDB4NjE3NiwgMHg2MTY3LCAweDYxNkUsCi0gICAgMHg2MTVELCAweDYxNTUsIDB4NjE4MiwgMHg2MTdDLCAweDYxNzAsIDB4NjE2QiwgMHg2MTdFLCAweDYxQTcsCi0gICAgMHg2MTkwLCAweDYxQUIsIDB4NjE4RSwgMHg2MUFDLCAweDYxOUEsIDB4NjFBNCwgMHg2MTk0LCAweDYxQUUsCi0gICAgMHg2MjJFLCAweDY0NjksIDB4NjQ2RiwgMHg2NDc5LCAweDY0OUUsIDB4NjRCMiwgMHg2NDg4LCAweDY0OTAsCi0gICAgMHg2NEIwLCAweDY0QTUsIDB4NjQ5MywgMHg2NDk1LCAweDY0QTksIDB4NjQ5MiwgMHg2NEFFLCAweDY0QUQsCi0gICAgMHg2NEFCLCAweDY0OUEsIDB4NjRBQywgMHg2NDk5LCAweDY0QTIsIDB4NjRCMywgMHg2NTc1LCAweDY1NzcsCi0gICAgMHg2NTc4LCAweDY2QUUsIDB4NjZBQiwgMHg2NkI0LCAweDY2QjEsIDB4NkEyMywgMHg2QTFGLCAweDY5RTgsCi0gICAgMHg2QTAxLCAweDZBMUUsIDB4NkExOSwgMHg2OUZELCAweDZBMjEsIDB4NkExMywgMHg2QTBBLCAweDY5RjMsCi0gICAgMHg2QTAyLCAweDZBMDUsIDB4NjlFRCwgMHg2QTExLCAweDZCNTAsIDB4NkI0RSwgMHg2QkE0LCAweDZCQzUsCi0gICAgMHg2QkM2LCAweDZGM0YsIDB4NkY3QywgMHg2Rjg0LCAweDZGNTEsIDB4NkY2NiwgMHg2RjU0LCAweDZGODYsCi0gICAgMHg2RjZELCAweDZGNUIsIDB4NkY3OCwgMHg2RjZFLCAweDZGOEUsIDB4NkY3QSwgMHg2RjcwLCAweDZGNjQsCi0gICAgMHg2Rjk3LCAweDZGNTgsIDB4NkVENSwgMHg2RjZGLCAweDZGNjAsIDB4NkY1RiwgMHg3MTlGLCAweDcxQUMsCi0gICAgMHg3MUIxLCAweDcxQTgsIDB4NzI1NiwgMHg3MjlCLCAweDczNEUsIDB4NzM1NywgMHg3NDY5LCAweDc0OEIsCi0gICAgMHg3NDgzLCAweDc0N0UsIDB4NzQ4MCwgMHg3NTdGLCAweDc2MjAsIDB4NzYyOSwgMHg3NjFGLCAweDc2MjQsCi0gICAgMHg3NjI2LCAweDc2MjEsIDB4NzYyMiwgMHg3NjlBLCAweDc2QkEsIDB4NzZFNCwgMHg3NzhFLCAweDc3ODcsCi0gICAgMHg3NzhDLCAweDc3OTEsIDB4Nzc4QiwgMHg3OENCLCAweDc4QzUsIDB4NzhCQSwgMHg3OENBLCAweDc4QkUsCi0gICAgMHg3OEQ1LCAweDc4QkMsIDB4NzhEMCwgMHg3QTNGLCAweDdBM0MsIDB4N0E0MCwgMHg3QTNELCAweDdBMzcsCi0gICAgMHg3QTNCLCAweDdBQUYsIDB4N0FBRSwgMHg3QkFELCAweDdCQjEsIDB4N0JDNCwgMHg3QkI0LCAweDdCQzYsCi0gICAgMHg3QkM3LCAweDdCQzEsIDB4N0JBMCwgMHg3QkNDLCAweDdDQ0EsIDB4N0RFMCwgMHg3REY0LCAweDdERUYsCi0gICAgMHg3REZCLCAweDdERDgsIDB4N0RFQywgMHg3RERELCAweDdERTgsIDB4N0RFMywgMHg3RERBLCAweDdEREUsCi0gICAgMHg3REU5LCAweDdEOUUsIDB4N0REOSwgMHg3REYyLCAweDdERjksIDB4N0Y3NSwgMHg3Rjc3LCAweDdGQUYsCi0gICAgMHg3RkU5LCAweDgwMjYsIDB4ODE5QiwgMHg4MTlDLCAweDgxOUQsIDB4ODFBMCwgMHg4MTlBLCAweDgxOTgsCi0gICAgMHg4NTE3LCAweDg1M0QsIDB4ODUxQSwgMHg4NEVFLCAweDg1MkMsIDB4ODUyRCwgMHg4NTEzLCAweDg1MTEsCi0gICAgMHg4NTIzLCAweDg1MjEsIDB4ODUxNCwgMHg4NEVDLCAweDg1MjUsIDB4ODRGRiwgMHg4NTA2LCAweDg3ODIsCi0gICAgMHg4Nzc0LCAweDg3NzYsIDB4ODc2MCwgMHg4NzY2LCAweDg3NzgsIDB4ODc2OCwgMHg4NzU5LCAweDg3NTcsCi0gICAgMHg4NzRDLCAweDg3NTMsIDB4ODg1QiwgMHg4ODVELCAweDg5MTAsIDB4ODkwNywgMHg4OTEyLCAweDg5MTMsCi0gICAgMHg4OTE1LCAweDg5MEEsIDB4OEFCQywgMHg4QUQyLCAweDhBQzcsIDB4OEFDNCwgMHg4QTk1LCAweDhBQ0IsCi0gICAgMHg4QUY4LCAweDhBQjIsIDB4OEFDOSwgMHg4QUMyLCAweDhBQkYsIDB4OEFCMCwgMHg4QUQ2LCAweDhBQ0QsCi0gICAgMHg4QUI2LCAweDhBQjksIDB4OEFEQiwgMHg4QzRDLCAweDhDNEUsIDB4OEM2QywgMHg4Q0UwLCAweDhDREUsCi0gICAgMHg4Q0U2LCAweDhDRTQsIDB4OENFQywgMHg4Q0VELCAweDhDRTIsIDB4OENFMywgMHg4Q0RDLCAweDhDRUEsCi0gICAgMHg4Q0UxLCAweDhENkQsIDB4OEQ5RiwgMHg4REEzLCAweDhFMkIsIDB4OEUxMCwgMHg4RTFELCAweDhFMjIsCi0gICAgMHg4RTBGLCAweDhFMjksIDB4OEUxRiwgMHg4RTIxLCAweDhFMUUsIDB4OEVCQSwgMHg4RjFELCAweDhGMUIsCi0gICAgMHg4RjFGLCAweDhGMjksIDB4OEYyNiwgMHg4RjJBLCAweDhGMUMsIDB4OEYxRSwgMHg4RjI1LCAweDkwNjksCi0gICAgMHg5MDZFLCAweDkwNjgsIDB4OTA2RCwgMHg5MDc3LCAweDkxMzAsIDB4OTEyRCwgMHg5MTI3LCAweDkxMzEsCi0gICAgMHg5MTg3LCAweDkxODksIDB4OTE4QiwgMHg5MTgzLCAweDkyQzUsIDB4OTJCQiwgMHg5MkI3LCAweDkyRUEsCi0gICAgMHg5MkU0LCAweDkyQzEsIDB4OTJCMywgMHg5MkJDLCAweDkyRDIsIDB4OTJDNywgMHg5MkYwLCAweDkyQjIsCi0gICAgMHg5NUFELCAweDk1QjEsIDB4OTcwNCwgMHg5NzA2LCAweDk3MDcsIDB4OTcwOSwgMHg5NzYwLCAweDk3OEQsCi0gICAgMHg5NzhCLCAweDk3OEYsIDB4OTgyMSwgMHg5ODJCLCAweDk4MUMsIDB4OThCMywgMHg5OTBBLCAweDk5MTMsCi0gICAgMHg5OTEyLCAweDk5MTgsIDB4OTlERCwgMHg5OUQwLCAweDk5REYsIDB4OTlEQiwgMHg5OUQxLCAweDk5RDUsCi0gICAgMHg5OUQyLCAweDk5RDksIDB4OUFCNywgMHg5QUVFLCAweDlBRUYsIDB4OUIyNywgMHg5QjQ1LCAweDlCNDQsCi0gICAgMHg5Qjc3LCAweDlCNkYsIDB4OUQwNiwgMHg5RDA5LCAweDlEMDMsIDB4OUVBOSwgMHg5RUJFLCAweDlFQ0UsCi0gICAgMHg1OEE4LCAweDlGNTIsIDB4NTExMiwgMHg1MTE4LCAweDUxMTQsIDB4NTExMCwgMHg1MTE1LCAweDUxODAsCi0gICAgMHg1MUFBLCAweDUxREQsIDB4NTI5MSwgMHg1MjkzLCAweDUyRjMsIDB4NTY1OSwgMHg1NjZCLCAweDU2NzksCi0gICAgMHg1NjY5LCAweDU2NjQsIDB4NTY3OCwgMHg1NjZBLCAweDU2NjgsIDB4NTY2NSwgMHg1NjcxLCAweDU2NkYsCi0gICAgMHg1NjZDLCAweDU2NjIsIDB4NTY3NiwgMHg1OEMxLCAweDU4QkUsIDB4NThDNywgMHg1OEM1LCAweDU5NkUsCi0gICAgMHg1QjFELCAweDVCMzQsIDB4NUI3OCwgMHg1QkYwLCAweDVDMEUsIDB4NUY0QSwgMHg2MUIyLCAweDYxOTEsCi0gICAgMHg2MUE5LCAweDYxOEEsIDB4NjFDRCwgMHg2MUI2LCAweDYxQkUsIDB4NjFDQSwgMHg2MUM4LCAweDYyMzAsCi0gICAgMHg2NEM1LCAweDY0QzEsIDB4NjRDQiwgMHg2NEJCLCAweDY0QkMsIDB4NjREQSwgMHg2NEM0LCAweDY0QzcsCi0gICAgMHg2NEMyLCAweDY0Q0QsIDB4NjRCRiwgMHg2NEQyLCAweDY0RDQsIDB4NjRCRSwgMHg2NTc0LCAweDY2QzYsCi0gICAgMHg2NkM5LCAweDY2QjksIDB4NjZDNCwgMHg2NkM3LCAweDY2QjgsIDB4NkEzRCwgMHg2QTM4LCAweDZBM0EsCi0gICAgMHg2QTU5LCAweDZBNkIsIDB4NkE1OCwgMHg2QTM5LCAweDZBNDQsIDB4NkE2MiwgMHg2QTYxLCAweDZBNEIsCi0gICAgMHg2QTQ3LCAweDZBMzUsIDB4NkE1RiwgMHg2QTQ4LCAweDZCNTksIDB4NkI3NywgMHg2QzA1LCAweDZGQzIsCi0gICAgMHg2RkIxLCAweDZGQTEsIDB4NkZDMywgMHg2RkE0LCAweDZGQzEsIDB4NkZBNywgMHg2RkIzLCAweDZGQzAsCi0gICAgMHg2RkI5LCAweDZGQjYsIDB4NkZBNiwgMHg2RkEwLCAweDZGQjQsIDB4NzFCRSwgMHg3MUM5LCAweDcxRDAsCi0gICAgMHg3MUQyLCAweDcxQzgsIDB4NzFENSwgMHg3MUI5LCAweDcxQ0UsIDB4NzFEOSwgMHg3MURDLCAweDcxQzMsCi0gICAgMHg3MUM0LCAweDczNjgsIDB4NzQ5QywgMHg3NEEzLCAweDc0OTgsIDB4NzQ5RiwgMHg3NDlFLCAweDc0RTIsCi0gICAgMHg3NTBDLCAweDc1MEQsIDB4NzYzNCwgMHg3NjM4LCAweDc2M0EsIDB4NzZFNywgMHg3NkU1LCAweDc3QTAsCi0gICAgMHg3NzlFLCAweDc3OUYsIDB4NzdBNSwgMHg3OEU4LCAweDc4REEsIDB4NzhFQywgMHg3OEU3LCAweDc5QTYsCi0gICAgMHg3QTRELCAweDdBNEUsIDB4N0E0NiwgMHg3QTRDLCAweDdBNEIsIDB4N0FCQSwgMHg3QkQ5LCAweDdDMTEsCi0gICAgMHg3QkM5LCAweDdCRTQsIDB4N0JEQiwgMHg3QkUxLCAweDdCRTksIDB4N0JFNiwgMHg3Q0Q1LCAweDdDRDYsCi0gICAgMHg3RTBBLCAweDdFMTEsIDB4N0UwOCwgMHg3RTFCLCAweDdFMjMsIDB4N0UxRSwgMHg3RTFELCAweDdFMDksCi0gICAgMHg3RTEwLCAweDdGNzksIDB4N0ZCMiwgMHg3RkYwLCAweDdGRjEsIDB4N0ZFRSwgMHg4MDI4LCAweDgxQjMsCi0gICAgMHg4MUE5LCAweDgxQTgsIDB4ODFGQiwgMHg4MjA4LCAweDgyNTgsIDB4ODI1OSwgMHg4NTRBLCAweDg1NTksCi0gICAgMHg4NTQ4LCAweDg1NjgsIDB4ODU2OSwgMHg4NTQzLCAweDg1NDksIDB4ODU2RCwgMHg4NTZBLCAweDg1NUUsCi0gICAgMHg4NzgzLCAweDg3OUYsIDB4ODc5RSwgMHg4N0EyLCAweDg3OEQsIDB4ODg2MSwgMHg4OTJBLCAweDg5MzIsCi0gICAgMHg4OTI1LCAweDg5MkIsIDB4ODkyMSwgMHg4OUFBLCAweDg5QTYsIDB4OEFFNiwgMHg4QUZBLCAweDhBRUIsCi0gICAgMHg4QUYxLCAweDhCMDAsIDB4OEFEQywgMHg4QUU3LCAweDhBRUUsIDB4OEFGRSwgMHg4QjAxLCAweDhCMDIsCi0gICAgMHg4QUY3LCAweDhBRUQsIDB4OEFGMywgMHg4QUY2LCAweDhBRkMsIDB4OEM2QiwgMHg4QzZELCAweDhDOTMsCi0gICAgMHg4Q0Y0LCAweDhFNDQsIDB4OEUzMSwgMHg4RTM0LCAweDhFNDIsIDB4OEUzOSwgMHg4RTM1LCAweDhGM0IsCi0gICAgMHg4RjJGLCAweDhGMzgsIDB4OEYzMywgMHg4RkE4LCAweDhGQTYsIDB4OTA3NSwgMHg5MDc0LCAweDkwNzgsCi0gICAgMHg5MDcyLCAweDkwN0MsIDB4OTA3QSwgMHg5MTM0LCAweDkxOTIsIDB4OTMyMCwgMHg5MzM2LCAweDkyRjgsCi0gICAgMHg5MzMzLCAweDkzMkYsIDB4OTMyMiwgMHg5MkZDLCAweDkzMkIsIDB4OTMwNCwgMHg5MzFBLCAweDkzMTAsCi0gICAgMHg5MzI2LCAweDkzMjEsIDB4OTMxNSwgMHg5MzJFLCAweDkzMTksIDB4OTVCQiwgMHg5NkE3LCAweDk2QTgsCi0gICAgMHg5NkFBLCAweDk2RDUsIDB4OTcwRSwgMHg5NzExLCAweDk3MTYsIDB4OTcwRCwgMHg5NzEzLCAweDk3MEYsCi0gICAgMHg5NzVCLCAweDk3NUMsIDB4OTc2NiwgMHg5Nzk4LCAweDk4MzAsIDB4OTgzOCwgMHg5ODNCLCAweDk4MzcsCi0gICAgMHg5ODJELCAweDk4MzksIDB4OTgyNCwgMHg5OTEwLCAweDk5MjgsIDB4OTkxRSwgMHg5OTFCLCAweDk5MjEsCi0gICAgMHg5OTFBLCAweDk5RUQsIDB4OTlFMiwgMHg5OUYxLCAweDlBQjgsIDB4OUFCQywgMHg5QUZCLCAweDlBRUQsCi0gICAgMHg5QjI4LCAweDlCOTEsIDB4OUQxNSwgMHg5RDIzLCAweDlEMjYsIDB4OUQyOCwgMHg5RDEyLCAweDlEMUIsCi0gICAgMHg5RUQ4LCAweDlFRDQsIDB4OUY4RCwgMHg5RjlDLCAweDUxMkEsIDB4NTExRiwgMHg1MTIxLCAweDUxMzIsCi0gICAgMHg1MkY1LCAweDU2OEUsIDB4NTY4MCwgMHg1NjkwLCAweDU2ODUsIDB4NTY4NywgMHg1NjhGLCAweDU4RDUsCi0gICAgMHg1OEQzLCAweDU4RDEsIDB4NThDRSwgMHg1QjMwLCAweDVCMkEsIDB4NUIyNCwgMHg1QjdBLCAweDVDMzcsCi0gICAgMHg1QzY4LCAweDVEQkMsIDB4NURCQSwgMHg1REJELCAweDVEQjgsIDB4NUU2QiwgMHg1RjRDLCAweDVGQkQsCi0gICAgMHg2MUM5LCAweDYxQzIsIDB4NjFDNywgMHg2MUU2LCAweDYxQ0IsIDB4NjIzMiwgMHg2MjM0LCAweDY0Q0UsCi0gICAgMHg2NENBLCAweDY0RDgsIDB4NjRFMCwgMHg2NEYwLCAweDY0RTYsIDB4NjRFQywgMHg2NEYxLCAweDY0RTIsCi0gICAgMHg2NEVELCAweDY1ODIsIDB4NjU4MywgMHg2NkQ5LCAweDY2RDYsIDB4NkE4MCwgMHg2QTk0LCAweDZBODQsCi0gICAgMHg2QUEyLCAweDZBOUMsIDB4NkFEQiwgMHg2QUEzLCAweDZBN0UsIDB4NkE5NywgMHg2QTkwLCAweDZBQTAsCi0gICAgMHg2QjVDLCAweDZCQUUsIDB4NkJEQSwgMHg2QzA4LCAweDZGRDgsIDB4NkZGMSwgMHg2RkRGLCAweDZGRTAsCi0gICAgMHg2RkRCLCAweDZGRTQsIDB4NkZFQiwgMHg2RkVGLCAweDZGODAsIDB4NkZFQywgMHg2RkUxLCAweDZGRTksCi0gICAgMHg2RkQ1LCAweDZGRUUsIDB4NkZGMCwgMHg3MUU3LCAweDcxREYsIDB4NzFFRSwgMHg3MUU2LCAweDcxRTUsCi0gICAgMHg3MUVELCAweDcxRUMsIDB4NzFGNCwgMHg3MUUwLCAweDcyMzUsIDB4NzI0NiwgMHg3MzcwLCAweDczNzIsCi0gICAgMHg3NEE5LCAweDc0QjAsIDB4NzRBNiwgMHg3NEE4LCAweDc2NDYsIDB4NzY0MiwgMHg3NjRDLCAweDc2RUEsCi0gICAgMHg3N0IzLCAweDc3QUEsIDB4NzdCMCwgMHg3N0FDLCAweDc3QTcsIDB4NzdBRCwgMHg3N0VGLCAweDc4RjcsCi0gICAgMHg3OEZBLCAweDc4RjQsIDB4NzhFRiwgMHg3OTAxLCAweDc5QTcsIDB4NzlBQSwgMHg3QTU3LCAweDdBQkYsCi0gICAgMHg3QzA3LCAweDdDMEQsIDB4N0JGRSwgMHg3QkY3LCAweDdDMEMsIDB4N0JFMCwgMHg3Q0UwLCAweDdDREMsCi0gICAgMHg3Q0RFLCAweDdDRTIsIDB4N0NERiwgMHg3Q0Q5LCAweDdDREQsIDB4N0UyRSwgMHg3RTNFLCAweDdFNDYsCi0gICAgMHg3RTM3LCAweDdFMzIsIDB4N0U0MywgMHg3RTJCLCAweDdFM0QsIDB4N0UzMSwgMHg3RTQ1LCAweDdFNDEsCi0gICAgMHg3RTM0LCAweDdFMzksIDB4N0U0OCwgMHg3RTM1LCAweDdFM0YsIDB4N0UyRiwgMHg3RjQ0LCAweDdGRjMsCi0gICAgMHg3RkZDLCAweDgwNzEsIDB4ODA3MiwgMHg4MDcwLCAweDgwNkYsIDB4ODA3MywgMHg4MUM2LCAweDgxQzMsCi0gICAgMHg4MUJBLCAweDgxQzIsIDB4ODFDMCwgMHg4MUJGLCAweDgxQkQsIDB4ODFDOSwgMHg4MUJFLCAweDgxRTgsCi0gICAgMHg4MjA5LCAweDgyNzEsIDB4ODVBQSwgMHg4NTg0LCAweDg1N0UsIDB4ODU5QywgMHg4NTkxLCAweDg1OTQsCi0gICAgMHg4NUFGLCAweDg1OUIsIDB4ODU4NywgMHg4NUE4LCAweDg1OEEsIDB4ODVBNiwgMHg4NjY3LCAweDg3QzAsCi0gICAgMHg4N0QxLCAweDg3QjMsIDB4ODdEMiwgMHg4N0M2LCAweDg3QUIsIDB4ODdCQiwgMHg4N0JBLCAweDg3QzgsCi0gICAgMHg4N0NCLCAweDg5M0IsIDB4ODkzNiwgMHg4OTQ0LCAweDg5MzgsIDB4ODkzRCwgMHg4OUFDLCAweDhCMEUsCi0gICAgMHg4QjE3LCAweDhCMTksIDB4OEIxQiwgMHg4QjBBLCAweDhCMjAsIDB4OEIxRCwgMHg4QjA0LCAweDhCMTAsCi0gICAgMHg4QzQxLCAweDhDM0YsIDB4OEM3MywgMHg4Q0ZBLCAweDhDRkQsIDB4OENGQywgMHg4Q0Y4LCAweDhDRkIsCi0gICAgMHg4REE4LCAweDhFNDksIDB4OEU0QiwgMHg4RTQ4LCAweDhFNEEsIDB4OEY0NCwgMHg4RjNFLCAweDhGNDIsCi0gICAgMHg4RjQ1LCAweDhGM0YsIDB4OTA3RiwgMHg5MDdELCAweDkwODQsIDB4OTA4MSwgMHg5MDgyLCAweDkwODAsCi0gICAgMHg5MTM5LCAweDkxQTMsIDB4OTE5RSwgMHg5MTlDLCAweDkzNEQsIDB4OTM4MiwgMHg5MzI4LCAweDkzNzUsCi0gICAgMHg5MzRBLCAweDkzNjUsIDB4OTM0QiwgMHg5MzE4LCAweDkzN0UsIDB4OTM2QywgMHg5MzVCLCAweDkzNzAsCi0gICAgMHg5MzVBLCAweDkzNTQsIDB4OTVDQSwgMHg5NUNCLCAweDk1Q0MsIDB4OTVDOCwgMHg5NUM2LCAweDk2QjEsCi0gICAgMHg5NkI4LCAweDk2RDYsIDB4OTcxQywgMHg5NzFFLCAweDk3QTAsIDB4OTdEMywgMHg5ODQ2LCAweDk4QjYsCi0gICAgMHg5OTM1LCAweDlBMDEsIDB4OTlGRiwgMHg5QkFFLCAweDlCQUIsIDB4OUJBQSwgMHg5QkFELCAweDlEM0IsCi0gICAgMHg5RDNGLCAweDlFOEIsIDB4OUVDRiwgMHg5RURFLCAweDlFREMsIDB4OUVERCwgMHg5RURCLCAweDlGM0UsCi0gICAgMHg5RjRCLCAweDUzRTIsIDB4NTY5NSwgMHg1NkFFLCAweDU4RDksIDB4NThEOCwgMHg1QjM4LCAweDVGNUQsCi0gICAgMHg2MUUzLCAweDYyMzMsIDB4NjRGNCwgMHg2NEYyLCAweDY0RkUsIDB4NjUwNiwgMHg2NEZBLCAweDY0RkIsCi0gICAgMHg2NEY3LCAweDY1QjcsIDB4NjZEQywgMHg2NzI2LCAweDZBQjMsIDB4NkFBQywgMHg2QUMzLCAweDZBQkIsCi0gICAgMHg2QUI4LCAweDZBQzIsIDB4NkFBRSwgMHg2QUFGLCAweDZCNUYsIDB4NkI3OCwgMHg2QkFGLCAweDcwMDksCi0gICAgMHg3MDBCLCAweDZGRkUsIDB4NzAwNiwgMHg2RkZBLCAweDcwMTEsIDB4NzAwRiwgMHg3MUZCLCAweDcxRkMsCi0gICAgMHg3MUZFLCAweDcxRjgsIDB4NzM3NywgMHg3Mzc1LCAweDc0QTcsIDB4NzRCRiwgMHg3NTE1LCAweDc2NTYsCi0gICAgMHg3NjU4LCAweDc2NTIsIDB4NzdCRCwgMHg3N0JGLCAweDc3QkIsIDB4NzdCQywgMHg3OTBFLCAweDc5QUUsCi0gICAgMHg3QTYxLCAweDdBNjIsIDB4N0E2MCwgMHg3QUM0LCAweDdBQzUsIDB4N0MyQiwgMHg3QzI3LCAweDdDMkEsCi0gICAgMHg3QzFFLCAweDdDMjMsIDB4N0MyMSwgMHg3Q0U3LCAweDdFNTQsIDB4N0U1NSwgMHg3RTVFLCAweDdFNUEsCi0gICAgMHg3RTYxLCAweDdFNTIsIDB4N0U1OSwgMHg3RjQ4LCAweDdGRjksIDB4N0ZGQiwgMHg4MDc3LCAweDgwNzYsCi0gICAgMHg4MUNELCAweDgxQ0YsIDB4ODIwQSwgMHg4NUNGLCAweDg1QTksIDB4ODVDRCwgMHg4NUQwLCAweDg1QzksCi0gICAgMHg4NUIwLCAweDg1QkEsIDB4ODVCOSwgMHg4N0VGLCAweDg3RUMsIDB4ODdGMiwgMHg4N0UwLCAweDg5ODYsCi0gICAgMHg4OUIyLCAweDg5RjQsIDB4OEIyOCwgMHg4QjM5LCAweDhCMkMsIDB4OEIyQiwgMHg4QzUwLCAweDhEMDUsCi0gICAgMHg4RTU5LCAweDhFNjMsIDB4OEU2NiwgMHg4RTY0LCAweDhFNUYsIDB4OEU1NSwgMHg4RUMwLCAweDhGNDksCi0gICAgMHg4RjRELCAweDkwODcsIDB4OTA4MywgMHg5MDg4LCAweDkxQUIsIDB4OTFBQywgMHg5MUQwLCAweDkzOTQsCi0gICAgMHg5MzhBLCAweDkzOTYsIDB4OTNBMiwgMHg5M0IzLCAweDkzQUUsIDB4OTNBQywgMHg5M0IwLCAweDkzOTgsCi0gICAgMHg5MzlBLCAweDkzOTcsIDB4OTVENCwgMHg5NUQ2LCAweDk1RDAsIDB4OTVENSwgMHg5NkUyLCAweDk2REMsCi0gICAgMHg5NkQ5LCAweDk2REIsIDB4OTZERSwgMHg5NzI0LCAweDk3QTMsIDB4OTdBNiwgMHg5N0FELCAweDk3RjksCi0gICAgMHg5ODRELCAweDk4NEYsIDB4OTg0QywgMHg5ODRFLCAweDk4NTMsIDB4OThCQSwgMHg5OTNFLCAweDk5M0YsCi0gICAgMHg5OTNELCAweDk5MkUsIDB4OTlBNSwgMHg5QTBFLCAweDlBQzEsIDB4OUIwMywgMHg5QjA2LCAweDlCNEYsCi0gICAgMHg5QjRFLCAweDlCNEQsIDB4OUJDQSwgMHg5QkM5LCAweDlCRkQsIDB4OUJDOCwgMHg5QkMwLCAweDlENTEsCi0gICAgMHg5RDVELCAweDlENjAsIDB4OUVFMCwgMHg5RjE1LCAweDlGMkMsIDB4NTEzMywgMHg1NkE1LCAweDU2QTgsCi0gICAgMHg1OERFLCAweDU4REYsIDB4NThFMiwgMHg1QkY1LCAweDlGOTAsIDB4NUVFQywgMHg2MUYyLCAweDYxRjcsCi0gICAgMHg2MUY2LCAweDYxRjUsIDB4NjUwMCwgMHg2NTBGLCAweDY2RTAsIDB4NjZERCwgMHg2QUU1LCAweDZBREQsCi0gICAgMHg2QURBLCAweDZBRDMsIDB4NzAxQiwgMHg3MDFGLCAweDcwMjgsIDB4NzAxQSwgMHg3MDFELCAweDcwMTUsCi0gICAgMHg3MDE4LCAweDcyMDYsIDB4NzIwRCwgMHg3MjU4LCAweDcyQTIsIDB4NzM3OCwgMHg3MzdBLCAweDc0QkQsCi0gICAgMHg3NENBLCAweDc0RTMsIDB4NzU4NywgMHg3NTg2LCAweDc2NUYsIDB4NzY2MSwgMHg3N0M3LCAweDc5MTksCi0gICAgMHg3OUIxLCAweDdBNkIsIDB4N0E2OSwgMHg3QzNFLCAweDdDM0YsIDB4N0MzOCwgMHg3QzNELCAweDdDMzcsCi0gICAgMHg3QzQwLCAweDdFNkIsIDB4N0U2RCwgMHg3RTc5LCAweDdFNjksIDB4N0U2QSwgMHg3RTczLCAweDdGODUsCi0gICAgMHg3RkI2LCAweDdGQjksIDB4N0ZCOCwgMHg4MUQ4LCAweDg1RTksIDB4ODVERCwgMHg4NUVBLCAweDg1RDUsCi0gICAgMHg4NUU0LCAweDg1RTUsIDB4ODVGNywgMHg4N0ZCLCAweDg4MDUsIDB4ODgwRCwgMHg4N0Y5LCAweDg3RkUsCi0gICAgMHg4OTYwLCAweDg5NUYsIDB4ODk1NiwgMHg4OTVFLCAweDhCNDEsIDB4OEI1QywgMHg4QjU4LCAweDhCNDksCi0gICAgMHg4QjVBLCAweDhCNEUsIDB4OEI0RiwgMHg4QjQ2LCAweDhCNTksIDB4OEQwOCwgMHg4RDBBLCAweDhFN0MsCi0gICAgMHg4RTcyLCAweDhFODcsIDB4OEU3NiwgMHg4RTZDLCAweDhFN0EsIDB4OEU3NCwgMHg4RjU0LCAweDhGNEUsCi0gICAgMHg4RkFELCAweDkwOEEsIDB4OTA4QiwgMHg5MUIxLCAweDkxQUUsIDB4OTNFMSwgMHg5M0QxLCAweDkzREYsCi0gICAgMHg5M0MzLCAweDkzQzgsIDB4OTNEQywgMHg5M0RELCAweDkzRDYsIDB4OTNFMiwgMHg5M0NELCAweDkzRDgsCi0gICAgMHg5M0U0LCAweDkzRDcsIDB4OTNFOCwgMHg5NURDLCAweDk2QjQsIDB4OTZFMywgMHg5NzJBLCAweDk3MjcsCi0gICAgMHg5NzYxLCAweDk3REMsIDB4OTdGQiwgMHg5ODVFLCAweDk4NTgsIDB4OTg1QiwgMHg5OEJDLCAweDk5NDUsCi0gICAgMHg5OTQ5LCAweDlBMTYsIDB4OUExOSwgMHg5QjBELCAweDlCRTgsIDB4OUJFNywgMHg5QkQ2LCAweDlCREIsCi0gICAgMHg5RDg5LCAweDlENjEsIDB4OUQ3MiwgMHg5RDZBLCAweDlENkMsIDB4OUU5MiwgMHg5RTk3LCAweDlFOTMsCi0gICAgMHg5RUI0LCAweDUyRjgsIDB4NTZCNywgMHg1NkI2LCAweDU2QjQsIDB4NTZCQywgMHg1OEU0LCAweDVCNDAsCi0gICAgMHg1QjQzLCAweDVCN0QsIDB4NUJGNiwgMHg1REM5LCAweDYxRjgsIDB4NjFGQSwgMHg2NTE4LCAweDY1MTQsCi0gICAgMHg2NTE5LCAweDY2RTYsIDB4NjcyNywgMHg2QUVDLCAweDcwM0UsIDB4NzAzMCwgMHg3MDMyLCAweDcyMTAsCi0gICAgMHg3MzdCLCAweDc0Q0YsIDB4NzY2MiwgMHg3NjY1LCAweDc5MjYsIDB4NzkyQSwgMHg3OTJDLCAweDc5MkIsCi0gICAgMHg3QUM3LCAweDdBRjYsIDB4N0M0QywgMHg3QzQzLCAweDdDNEQsIDB4N0NFRiwgMHg3Q0YwLCAweDhGQUUsCi0gICAgMHg3RTdELCAweDdFN0MsIDB4N0U4MiwgMHg3RjRDLCAweDgwMDAsIDB4ODFEQSwgMHg4MjY2LCAweDg1RkIsCi0gICAgMHg4NUY5LCAweDg2MTEsIDB4ODVGQSwgMHg4NjA2LCAweDg2MEIsIDB4ODYwNywgMHg4NjBBLCAweDg4MTQsCi0gICAgMHg4ODE1LCAweDg5NjQsIDB4ODlCQSwgMHg4OUY4LCAweDhCNzAsIDB4OEI2QywgMHg4QjY2LCAweDhCNkYsCi0gICAgMHg4QjVGLCAweDhCNkIsIDB4OEQwRiwgMHg4RDBELCAweDhFODksIDB4OEU4MSwgMHg4RTg1LCAweDhFODIsCi0gICAgMHg5MUI0LCAweDkxQ0IsIDB4OTQxOCwgMHg5NDAzLCAweDkzRkQsIDB4OTVFMSwgMHg5NzMwLCAweDk4QzQsCi0gICAgMHg5OTUyLCAweDk5NTEsIDB4OTlBOCwgMHg5QTJCLCAweDlBMzAsIDB4OUEzNywgMHg5QTM1LCAweDlDMTMsCi0gICAgMHg5QzBELCAweDlFNzksIDB4OUVCNSwgMHg5RUU4LCAweDlGMkYsIDB4OUY1RiwgMHg5RjYzLCAweDlGNjEsCi0gICAgMHg1MTM3LCAweDUxMzgsIDB4NTZDMSwgMHg1NkMwLCAweDU2QzIsIDB4NTkxNCwgMHg1QzZDLCAweDVEQ0QsCi0gICAgMHg2MUZDLCAweDYxRkUsIDB4NjUxRCwgMHg2NTFDLCAweDY1OTUsIDB4NjZFOSwgMHg2QUZCLCAweDZCMDQsCi0gICAgMHg2QUZBLCAweDZCQjIsIDB4NzA0QywgMHg3MjFCLCAweDcyQTcsIDB4NzRENiwgMHg3NEQ0LCAweDc2NjksCi0gICAgMHg3N0QzLCAweDdDNTAsIDB4N0U4RiwgMHg3RThDLCAweDdGQkMsIDB4ODYxNywgMHg4NjJELCAweDg2MUEsCi0gICAgMHg4ODIzLCAweDg4MjIsIDB4ODgyMSwgMHg4ODFGLCAweDg5NkEsIDB4ODk2QywgMHg4OUJELCAweDhCNzQsCi0gICAgMHg4Qjc3LCAweDhCN0QsIDB4OEQxMywgMHg4RThBLCAweDhFOEQsIDB4OEU4QiwgMHg4RjVGLCAweDhGQUYsCi0gICAgMHg5MUJBLCAweDk0MkUsIDB4OTQzMywgMHg5NDM1LCAweDk0M0EsIDB4OTQzOCwgMHg5NDMyLCAweDk0MkIsCi0gICAgMHg5NUUyLCAweDk3MzgsIDB4OTczOSwgMHg5NzMyLCAweDk3RkYsIDB4OTg2NywgMHg5ODY1LCAweDk5NTcsCi0gICAgMHg5QTQ1LCAweDlBNDMsIDB4OUE0MCwgMHg5QTNFLCAweDlBQ0YsIDB4OUI1NCwgMHg5QjUxLCAweDlDMkQsCi0gICAgMHg5QzI1LCAweDlEQUYsIDB4OURCNCwgMHg5REMyLCAweDlEQjgsIDB4OUU5RCwgMHg5RUVGLCAweDlGMTksCi0gICAgMHg5RjVDLCAweDlGNjYsIDB4OUY2NywgMHg1MTNDLCAweDUxM0IsIDB4NTZDOCwgMHg1NkNBLCAweDU2QzksCi0gICAgMHg1QjdGLCAweDVERDQsIDB4NUREMiwgMHg1RjRFLCAweDYxRkYsIDB4NjUyNCwgMHg2QjBBLCAweDZCNjEsCi0gICAgMHg3MDUxLCAweDcwNTgsIDB4NzM4MCwgMHg3NEU0LCAweDc1OEEsIDB4NzY2RSwgMHg3NjZDLCAweDc5QjMsCi0gICAgMHg3QzYwLCAweDdDNUYsIDB4ODA3RSwgMHg4MDdELCAweDgxREYsIDB4ODk3MiwgMHg4OTZGLCAweDg5RkMsCi0gICAgMHg4QjgwLCAweDhEMTYsIDB4OEQxNywgMHg4RTkxLCAweDhFOTMsIDB4OEY2MSwgMHg5MTQ4LCAweDk0NDQsCi0gICAgMHg5NDUxLCAweDk0NTIsIDB4OTczRCwgMHg5NzNFLCAweDk3QzMsIDB4OTdDMSwgMHg5ODZCLCAweDk5NTUsCi0gICAgMHg5QTU1LCAweDlBNEQsIDB4OUFEMiwgMHg5QjFBLCAweDlDNDksIDB4OUMzMSwgMHg5QzNFLCAweDlDM0IsCi0gICAgMHg5REQzLCAweDlERDcsIDB4OUYzNCwgMHg5RjZDLCAweDlGNkEsIDB4OUY5NCwgMHg1NkNDLCAweDVERDYsCi0gICAgMHg2MjAwLCAweDY1MjMsIDB4NjUyQiwgMHg2NTJBLCAweDY2RUMsIDB4NkIxMCwgMHg3NERBLCAweDdBQ0EsCi0gICAgMHg3QzY0LCAweDdDNjMsIDB4N0M2NSwgMHg3RTkzLCAweDdFOTYsIDB4N0U5NCwgMHg4MUUyLCAweDg2MzgsCi0gICAgMHg4NjNGLCAweDg4MzEsIDB4OEI4QSwgMHg5MDkwLCAweDkwOEYsIDB4OTQ2MywgMHg5NDYwLCAweDk0NjQsCi0gICAgMHg5NzY4LCAweDk4NkYsIDB4OTk1QywgMHg5QTVBLCAweDlBNUIsIDB4OUE1NywgMHg5QUQzLCAweDlBRDQsCi0gICAgMHg5QUQxLCAweDlDNTQsIDB4OUM1NywgMHg5QzU2LCAweDlERTUsIDB4OUU5RiwgMHg5RUY0LCAweDU2RDEsCi0gICAgMHg1OEU5LCAweDY1MkMsIDB4NzA1RSwgMHg3NjcxLCAweDc2NzIsIDB4NzdENywgMHg3RjUwLCAweDdGODgsCi0gICAgMHg4ODM2LCAweDg4MzksIDB4ODg2MiwgMHg4QjkzLCAweDhCOTIsIDB4OEI5NiwgMHg4Mjc3LCAweDhEMUIsCi0gICAgMHg5MUMwLCAweDk0NkEsIDB4OTc0MiwgMHg5NzQ4LCAweDk3NDQsIDB4OTdDNiwgMHg5ODcwLCAweDlBNUYsCi0gICAgMHg5QjIyLCAweDlCNTgsIDB4OUM1RiwgMHg5REY5LCAweDlERkEsIDB4OUU3QywgMHg5RTdELCAweDlGMDcsCi0gICAgMHg5Rjc3LCAweDlGNzIsIDB4NUVGMywgMHg2QjE2LCAweDcwNjMsIDB4N0M2QywgMHg3QzZFLCAweDg4M0IsCi0gICAgMHg4OUMwLCAweDhFQTEsIDB4OTFDMSwgMHg5NDcyLCAweDk0NzAsIDB4OTg3MSwgMHg5OTVFLCAweDlBRDYsCi0gICAgMHg5QjIzLCAweDlFQ0MsIDB4NzA2NCwgMHg3N0RBLCAweDhCOUEsIDB4OTQ3NywgMHg5N0M5LCAweDlBNjIsCi0gICAgMHg5QTY1LCAweDdFOUMsIDB4OEI5QywgMHg4RUFBLCAweDkxQzUsIDB4OTQ3RCwgMHg5NDdFLCAweDk0N0MsCi0gICAgMHg5Qzc3LCAweDlDNzgsIDB4OUVGNywgMHg4QzU0LCAweDk0N0YsIDB4OUUxQSwgMHg3MjI4LCAweDlBNkEsCi0gICAgMHg5QjMxLCAweDlFMUIsIDB4OUUxRSwgMHg3QzcyLCAweDRFNDIsIDB4NEU1QywgMHg1MUY1LCAweDUzMUEsCi0gICAgMHg1MzgyLCAweDRFMDcsIDB4NEUwQywgMHg0RTQ3LCAweDRFOEQsIDB4NTZENywgMHg1QzZFLCAweDVGNzMsCi0gICAgMHg0RTBGLCAweDUxODcsIDB4NEUwRSwgMHg0RTJFLCAweDRFOTMsIDB4NEVDMiwgMHg0RUM5LCAweDRFQzgsCi0gICAgMHg1MTk4LCAweDUyRkMsIDB4NTM2QywgMHg1M0I5LCAweDU3MjAsIDB4NTkwMywgMHg1OTJDLCAweDVDMTAsCi0gICAgMHg1REZGLCAweDY1RTEsIDB4NkJCMywgMHg2QkNDLCAweDZDMTQsIDB4NzIzRiwgMHg0RTMxLCAweDRFM0MsCi0gICAgMHg0RUU4LCAweDRFREMsIDB4NEVFOSwgMHg0RUUxLCAweDRFREQsIDB4NEVEQSwgMHg1MjBDLCAweDUyMDksCi0gICAgMHg1MzFDLCAweDUzNEMsIDB4NTcyMiwgMHg1NzIzLCAweDU5MTcsIDB4NTkyRiwgMHg1QjgxLCAweDVCODQsCi0gICAgMHg1QzEyLCAweDVDM0IsIDB4NUM3NCwgMHg1QzczLCAweDVFMDQsIDB4NUU4MCwgMHg1RTgyLCAweDVGQzksCi0gICAgMHg2MjA5LCAweDYyNTAsIDB4NkMxNSwgMHg2QzM2LCAweDZDNDMsIDB4NkMzRiwgMHg2QzNCLCAweDcyQUUsCi0gICAgMHg3MkIwLCAweDczOEEsIDB4NzlCOCwgMHg4MDhBLCAweDk2MUUsIDB4NEYwRSwgMHg0RjE4LCAweDRGMkMsCi0gICAgMHg0RUY1LCAweDRGMTQsIDB4NEVGMSwgMHg0RjAwLCAweDRFRjcsIDB4NEYwOCwgMHg0RjFELCAweDRGMDIsCi0gICAgMHg0RjA1LCAweDRGMjIsIDB4NEYxMywgMHg0RjA0LCAweDRFRjQsIDB4NEYxMiwgMHg1MUIxLCAweDUyMTMsCi0gICAgMHg1MjEwLCAweDUyQTYsIDB4NTMyMiwgMHg1MzFGLCAweDUzNEQsIDB4NTM4QSwgMHg1NDA3LCAweDU2RTEsCi0gICAgMHg1NkRGLCAweDU3MkUsIDB4NTcyQSwgMHg1NzM0LCAweDU5M0MsIDB4NTk4MCwgMHg1OTdDLCAweDU5ODUsCi0gICAgMHg1OTdCLCAweDU5N0UsIDB4NTk3NywgMHg1OTdGLCAweDVCNTYsIDB4NUMxNSwgMHg1QzI1LCAweDVDN0MsCi0gICAgMHg1QzdBLCAweDVDN0IsIDB4NUM3RSwgMHg1RERGLCAweDVFNzUsIDB4NUU4NCwgMHg1RjAyLCAweDVGMUEsCi0gICAgMHg1Rjc0LCAweDVGRDUsIDB4NUZENCwgMHg1RkNGLCAweDYyNUMsIDB4NjI1RSwgMHg2MjY0LCAweDYyNjEsCi0gICAgMHg2MjY2LCAweDYyNjIsIDB4NjI1OSwgMHg2MjYwLCAweDYyNUEsIDB4NjI2NSwgMHg2NTM3LCAweDY1RUYsCi0gICAgMHg2NUVFLCAweDY3M0UsIDB4NjczOSwgMHg2NzM4LCAweDY3M0IsIDB4NjczQSwgMHg2NzNGLCAweDY3M0MsCi0gICAgMHg2NzMzLCAweDZDMTgsIDB4NkM0NiwgMHg2QzUyLCAweDZDNUMsIDB4NkM0RiwgMHg2QzRBLCAweDZDNTQsCi0gICAgMHg2QzRCLCAweDZDNEMsIDB4NzA3MSwgMHg3MjVFLCAweDcyQjQsIDB4NzJCNSwgMHg3MzhFLCAweDc1MkEsCi0gICAgMHg3NjdGLCAweDdBNzUsIDB4N0Y1MSwgMHg4Mjc4LCAweDgyN0MsIDB4ODI4MCwgMHg4MjdELCAweDgyN0YsCi0gICAgMHg4NjRELCAweDg5N0UsIDB4OTA5OSwgMHg5MDk3LCAweDkwOTgsIDB4OTA5QiwgMHg5MDk0LCAweDk2MjIsCi0gICAgMHg5NjI0LCAweDk2MjAsIDB4OTYyMywgMHg0RjU2LCAweDRGM0IsIDB4NEY2MiwgMHg0RjQ5LCAweDRGNTMsCi0gICAgMHg0RjY0LCAweDRGM0UsIDB4NEY2NywgMHg0RjUyLCAweDRGNUYsIDB4NEY0MSwgMHg0RjU4LCAweDRGMkQsCi0gICAgMHg0RjMzLCAweDRGM0YsIDB4NEY2MSwgMHg1MThGLCAweDUxQjksIDB4NTIxQywgMHg1MjFFLCAweDUyMjEsCi0gICAgMHg1MkFELCAweDUyQUUsIDB4NTMwOSwgMHg1MzYzLCAweDUzNzIsIDB4NTM4RSwgMHg1MzhGLCAweDU0MzAsCi0gICAgMHg1NDM3LCAweDU0MkEsIDB4NTQ1NCwgMHg1NDQ1LCAweDU0MTksIDB4NTQxQywgMHg1NDI1LCAweDU0MTgsCi0gICAgMHg1NDNELCAweDU0NEYsIDB4NTQ0MSwgMHg1NDI4LCAweDU0MjQsIDB4NTQ0NywgMHg1NkVFLCAweDU2RTcsCi0gICAgMHg1NkU1LCAweDU3NDEsIDB4NTc0NSwgMHg1NzRDLCAweDU3NDksIDB4NTc0QiwgMHg1NzUyLCAweDU5MDYsCi0gICAgMHg1OTQwLCAweDU5QTYsIDB4NTk5OCwgMHg1OUEwLCAweDU5OTcsIDB4NTk4RSwgMHg1OUEyLCAweDU5OTAsCi0gICAgMHg1OThGLCAweDU5QTcsIDB4NTlBMSwgMHg1QjhFLCAweDVCOTIsIDB4NUMyOCwgMHg1QzJBLCAweDVDOEQsCi0gICAgMHg1QzhGLCAweDVDODgsIDB4NUM4QiwgMHg1Qzg5LCAweDVDOTIsIDB4NUM4QSwgMHg1Qzg2LCAweDVDOTMsCi0gICAgMHg1Qzk1LCAweDVERTAsIDB4NUUwQSwgMHg1RTBFLCAweDVFOEIsIDB4NUU4OSwgMHg1RThDLCAweDVFODgsCi0gICAgMHg1RThELCAweDVGMDUsIDB4NUYxRCwgMHg1Rjc4LCAweDVGNzYsIDB4NUZEMiwgMHg1RkQxLCAweDVGRDAsCi0gICAgMHg1RkVELCAweDVGRTgsIDB4NUZFRSwgMHg1RkYzLCAweDVGRTEsIDB4NUZFNCwgMHg1RkUzLCAweDVGRkEsCi0gICAgMHg1RkVGLCAweDVGRjcsIDB4NUZGQiwgMHg2MDAwLCAweDVGRjQsIDB4NjIzQSwgMHg2MjgzLCAweDYyOEMsCi0gICAgMHg2MjhFLCAweDYyOEYsIDB4NjI5NCwgMHg2Mjg3LCAweDYyNzEsIDB4NjI3QiwgMHg2MjdBLCAweDYyNzAsCi0gICAgMHg2MjgxLCAweDYyODgsIDB4NjI3NywgMHg2MjdELCAweDYyNzIsIDB4NjI3NCwgMHg2NUYwLCAweDY1RjQsCi0gICAgMHg2NUYzLCAweDY1RjIsIDB4NjVGNSwgMHg2NzQ1LCAweDY3NDcsIDB4Njc1OSwgMHg2NzU1LCAweDY3NEMsCi0gICAgMHg2NzQ4LCAweDY3NUQsIDB4Njc0RCwgMHg2NzVBLCAweDY3NEIsIDB4NkJEMCwgMHg2QzE5LCAweDZDMUEsCi0gICAgMHg2Qzc4LCAweDZDNjcsIDB4NkM2QiwgMHg2Qzg0LCAweDZDOEIsIDB4NkM4RiwgMHg2QzcxLCAweDZDNkYsCi0gICAgMHg2QzY5LCAweDZDOUEsIDB4NkM2RCwgMHg2Qzg3LCAweDZDOTUsIDB4NkM5QywgMHg2QzY2LCAweDZDNzMsCi0gICAgMHg2QzY1LCAweDZDN0IsIDB4NkM4RSwgMHg3MDc0LCAweDcwN0EsIDB4NzI2MywgMHg3MkJGLCAweDcyQkQsCi0gICAgMHg3MkMzLCAweDcyQzYsIDB4NzJDMSwgMHg3MkJBLCAweDcyQzUsIDB4NzM5NSwgMHg3Mzk3LCAweDczOTMsCi0gICAgMHg3Mzk0LCAweDczOTIsIDB4NzUzQSwgMHg3NTM5LCAweDc1OTQsIDB4NzU5NSwgMHg3NjgxLCAweDc5M0QsCi0gICAgMHg4MDM0LCAweDgwOTUsIDB4ODA5OSwgMHg4MDkwLCAweDgwOTIsIDB4ODA5QywgMHg4MjkwLCAweDgyOEYsCi0gICAgMHg4Mjg1LCAweDgyOEUsIDB4ODI5MSwgMHg4MjkzLCAweDgyOEEsIDB4ODI4MywgMHg4Mjg0LCAweDhDNzgsCi0gICAgMHg4RkM5LCAweDhGQkYsIDB4OTA5RiwgMHg5MEExLCAweDkwQTUsIDB4OTA5RSwgMHg5MEE3LCAweDkwQTAsCi0gICAgMHg5NjMwLCAweDk2MjgsIDB4OTYyRiwgMHg5NjJELCAweDRFMzMsIDB4NEY5OCwgMHg0RjdDLCAweDRGODUsCi0gICAgMHg0RjdELCAweDRGODAsIDB4NEY4NywgMHg0Rjc2LCAweDRGNzQsIDB4NEY4OSwgMHg0Rjg0LCAweDRGNzcsCi0gICAgMHg0RjRDLCAweDRGOTcsIDB4NEY2QSwgMHg0RjlBLCAweDRGNzksIDB4NEY4MSwgMHg0Rjc4LCAweDRGOTAsCi0gICAgMHg0RjlDLCAweDRGOTQsIDB4NEY5RSwgMHg0RjkyLCAweDRGODIsIDB4NEY5NSwgMHg0RjZCLCAweDRGNkUsCi0gICAgMHg1MTlFLCAweDUxQkMsIDB4NTFCRSwgMHg1MjM1LCAweDUyMzIsIDB4NTIzMywgMHg1MjQ2LCAweDUyMzEsCi0gICAgMHg1MkJDLCAweDUzMEEsIDB4NTMwQiwgMHg1MzNDLCAweDUzOTIsIDB4NTM5NCwgMHg1NDg3LCAweDU0N0YsCi0gICAgMHg1NDgxLCAweDU0OTEsIDB4NTQ4MiwgMHg1NDg4LCAweDU0NkIsIDB4NTQ3QSwgMHg1NDdFLCAweDU0NjUsCi0gICAgMHg1NDZDLCAweDU0NzQsIDB4NTQ2NiwgMHg1NDhELCAweDU0NkYsIDB4NTQ2MSwgMHg1NDYwLCAweDU0OTgsCi0gICAgMHg1NDYzLCAweDU0NjcsIDB4NTQ2NCwgMHg1NkY3LCAweDU2RjksIDB4NTc2RiwgMHg1NzcyLCAweDU3NkQsCi0gICAgMHg1NzZCLCAweDU3NzEsIDB4NTc3MCwgMHg1Nzc2LCAweDU3ODAsIDB4NTc3NSwgMHg1NzdCLCAweDU3NzMsCi0gICAgMHg1Nzc0LCAweDU3NjIsIDB4NTc2OCwgMHg1NzdELCAweDU5MEMsIDB4NTk0NSwgMHg1OUI1LCAweDU5QkEsCi0gICAgMHg1OUNGLCAweDU5Q0UsIDB4NTlCMiwgMHg1OUNDLCAweDU5QzEsIDB4NTlCNiwgMHg1OUJDLCAweDU5QzMsCi0gICAgMHg1OUQ2LCAweDU5QjEsIDB4NTlCRCwgMHg1OUMwLCAweDU5QzgsIDB4NTlCNCwgMHg1OUM3LCAweDVCNjIsCi0gICAgMHg1QjY1LCAweDVCOTMsIDB4NUI5NSwgMHg1QzQ0LCAweDVDNDcsIDB4NUNBRSwgMHg1Q0E0LCAweDVDQTAsCi0gICAgMHg1Q0I1LCAweDVDQUYsIDB4NUNBOCwgMHg1Q0FDLCAweDVDOUYsIDB4NUNBMywgMHg1Q0FELCAweDVDQTIsCi0gICAgMHg1Q0FBLCAweDVDQTcsIDB4NUM5RCwgMHg1Q0E1LCAweDVDQjYsIDB4NUNCMCwgMHg1Q0E2LCAweDVFMTcsCi0gICAgMHg1RTE0LCAweDVFMTksIDB4NUYyOCwgMHg1RjIyLCAweDVGMjMsIDB4NUYyNCwgMHg1RjU0LCAweDVGODIsCi0gICAgMHg1RjdFLCAweDVGN0QsIDB4NUZERSwgMHg1RkU1LCAweDYwMkQsIDB4NjAyNiwgMHg2MDE5LCAweDYwMzIsCi0gICAgMHg2MDBCLCAweDYwMzQsIDB4NjAwQSwgMHg2MDE3LCAweDYwMzMsIDB4NjAxQSwgMHg2MDFFLCAweDYwMkMsCi0gICAgMHg2MDIyLCAweDYwMEQsIDB4NjAxMCwgMHg2MDJFLCAweDYwMTMsIDB4NjAxMSwgMHg2MDBDLCAweDYwMDksCi0gICAgMHg2MDFDLCAweDYyMTQsIDB4NjIzRCwgMHg2MkFELCAweDYyQjQsIDB4NjJEMSwgMHg2MkJFLCAweDYyQUEsCi0gICAgMHg2MkI2LCAweDYyQ0EsIDB4NjJBRSwgMHg2MkIzLCAweDYyQUYsIDB4NjJCQiwgMHg2MkE5LCAweDYyQjAsCi0gICAgMHg2MkI4LCAweDY1M0QsIDB4NjVBOCwgMHg2NUJCLCAweDY2MDksIDB4NjVGQywgMHg2NjA0LCAweDY2MTIsCi0gICAgMHg2NjA4LCAweDY1RkIsIDB4NjYwMywgMHg2NjBCLCAweDY2MEQsIDB4NjYwNSwgMHg2NUZELCAweDY2MTEsCi0gICAgMHg2NjEwLCAweDY2RjYsIDB4NjcwQSwgMHg2Nzg1LCAweDY3NkMsIDB4Njc4RSwgMHg2NzkyLCAweDY3NzYsCi0gICAgMHg2NzdCLCAweDY3OTgsIDB4Njc4NiwgMHg2Nzg0LCAweDY3NzQsIDB4Njc4RCwgMHg2NzhDLCAweDY3N0EsCi0gICAgMHg2NzlGLCAweDY3OTEsIDB4Njc5OSwgMHg2NzgzLCAweDY3N0QsIDB4Njc4MSwgMHg2Nzc4LCAweDY3NzksCi0gICAgMHg2Nzk0LCAweDZCMjUsIDB4NkI4MCwgMHg2QjdFLCAweDZCREUsIDB4NkMxRCwgMHg2QzkzLCAweDZDRUMsCi0gICAgMHg2Q0VCLCAweDZDRUUsIDB4NkNEOSwgMHg2Q0I2LCAweDZDRDQsIDB4NkNBRCwgMHg2Q0U3LCAweDZDQjcsCi0gICAgMHg2Q0QwLCAweDZDQzIsIDB4NkNCQSwgMHg2Q0MzLCAweDZDQzYsIDB4NkNFRCwgMHg2Q0YyLCAweDZDRDIsCi0gICAgMHg2Q0RELCAweDZDQjQsIDB4NkM4QSwgMHg2QzlELCAweDZDODAsIDB4NkNERSwgMHg2Q0MwLCAweDZEMzAsCi0gICAgMHg2Q0NELCAweDZDQzcsIDB4NkNCMCwgMHg2Q0Y5LCAweDZDQ0YsIDB4NkNFOSwgMHg2Q0QxLCAweDcwOTQsCi0gICAgMHg3MDk4LCAweDcwODUsIDB4NzA5MywgMHg3MDg2LCAweDcwODQsIDB4NzA5MSwgMHg3MDk2LCAweDcwODIsCi0gICAgMHg3MDlBLCAweDcwODMsIDB4NzI2QSwgMHg3MkQ2LCAweDcyQ0IsIDB4NzJEOCwgMHg3MkM5LCAweDcyREMsCi0gICAgMHg3MkQyLCAweDcyRDQsIDB4NzJEQSwgMHg3MkNDLCAweDcyRDEsIDB4NzNBNCwgMHg3M0ExLCAweDczQUQsCi0gICAgMHg3M0E2LCAweDczQTIsIDB4NzNBMCwgMHg3M0FDLCAweDczOUQsIDB4NzRERCwgMHg3NEU4LCAweDc1M0YsCi0gICAgMHg3NTQwLCAweDc1M0UsIDB4NzU4QywgMHg3NTk4LCAweDc2QUYsIDB4NzZGMywgMHg3NkYxLCAweDc2RjAsCi0gICAgMHg3NkY1LCAweDc3RjgsIDB4NzdGQywgMHg3N0Y5LCAweDc3RkIsIDB4NzdGQSwgMHg3N0Y3LCAweDc5NDIsCi0gICAgMHg3OTNGLCAweDc5QzUsIDB4N0E3OCwgMHg3QTdCLCAweDdBRkIsIDB4N0M3NSwgMHg3Q0ZELCAweDgwMzUsCi0gICAgMHg4MDhGLCAweDgwQUUsIDB4ODBBMywgMHg4MEI4LCAweDgwQjUsIDB4ODBBRCwgMHg4MjIwLCAweDgyQTAsCi0gICAgMHg4MkMwLCAweDgyQUIsIDB4ODI5QSwgMHg4Mjk4LCAweDgyOUIsIDB4ODJCNSwgMHg4MkE3LCAweDgyQUUsCi0gICAgMHg4MkJDLCAweDgyOUUsIDB4ODJCQSwgMHg4MkI0LCAweDgyQTgsIDB4ODJBMSwgMHg4MkE5LCAweDgyQzIsCi0gICAgMHg4MkE0LCAweDgyQzMsIDB4ODJCNiwgMHg4MkEyLCAweDg2NzAsIDB4ODY2RiwgMHg4NjZELCAweDg2NkUsCi0gICAgMHg4QzU2LCAweDhGRDIsIDB4OEZDQiwgMHg4RkQzLCAweDhGQ0QsIDB4OEZENiwgMHg4RkQ1LCAweDhGRDcsCi0gICAgMHg5MEIyLCAweDkwQjQsIDB4OTBBRiwgMHg5MEIzLCAweDkwQjAsIDB4OTYzOSwgMHg5NjNELCAweDk2M0MsCi0gICAgMHg5NjNBLCAweDk2NDMsIDB4NEZDRCwgMHg0RkM1LCAweDRGRDMsIDB4NEZCMiwgMHg0RkM5LCAweDRGQ0IsCi0gICAgMHg0RkMxLCAweDRGRDQsIDB4NEZEQywgMHg0RkQ5LCAweDRGQkIsIDB4NEZCMywgMHg0RkRCLCAweDRGQzcsCi0gICAgMHg0RkQ2LCAweDRGQkEsIDB4NEZDMCwgMHg0RkI5LCAweDRGRUMsIDB4NTI0NCwgMHg1MjQ5LCAweDUyQzAsCi0gICAgMHg1MkMyLCAweDUzM0QsIDB4NTM3QywgMHg1Mzk3LCAweDUzOTYsIDB4NTM5OSwgMHg1Mzk4LCAweDU0QkEsCi0gICAgMHg1NEExLCAweDU0QUQsIDB4NTRBNSwgMHg1NENGLCAweDU0QzMsIDB4ODMwRCwgMHg1NEI3LCAweDU0QUUsCi0gICAgMHg1NEQ2LCAweDU0QjYsIDB4NTRDNSwgMHg1NEM2LCAweDU0QTAsIDB4NTQ3MCwgMHg1NEJDLCAweDU0QTIsCi0gICAgMHg1NEJFLCAweDU0NzIsIDB4NTRERSwgMHg1NEIwLCAweDU3QjUsIDB4NTc5RSwgMHg1NzlGLCAweDU3QTQsCi0gICAgMHg1NzhDLCAweDU3OTcsIDB4NTc5RCwgMHg1NzlCLCAweDU3OTQsIDB4NTc5OCwgMHg1NzhGLCAweDU3OTksCi0gICAgMHg1N0E1LCAweDU3OUEsIDB4NTc5NSwgMHg1OEY0LCAweDU5MEQsIDB4NTk1MywgMHg1OUUxLCAweDU5REUsCi0gICAgMHg1OUVFLCAweDVBMDAsIDB4NTlGMSwgMHg1OURELCAweDU5RkEsIDB4NTlGRCwgMHg1OUZDLCAweDU5RjYsCi0gICAgMHg1OUU0LCAweDU5RjIsIDB4NTlGNywgMHg1OURCLCAweDU5RTksIDB4NTlGMywgMHg1OUY1LCAweDU5RTAsCi0gICAgMHg1OUZFLCAweDU5RjQsIDB4NTlFRCwgMHg1QkE4LCAweDVDNEMsIDB4NUNEMCwgMHg1Q0Q4LCAweDVDQ0MsCi0gICAgMHg1Q0Q3LCAweDVDQ0IsIDB4NUNEQiwgMHg1Q0RFLCAweDVDREEsIDB4NUNDOSwgMHg1Q0M3LCAweDVDQ0EsCi0gICAgMHg1Q0Q2LCAweDVDRDMsIDB4NUNENCwgMHg1Q0NGLCAweDVDQzgsIDB4NUNDNiwgMHg1Q0NFLCAweDVDREYsCi0gICAgMHg1Q0Y4LCAweDVERjksIDB4NUUyMSwgMHg1RTIyLCAweDVFMjMsIDB4NUUyMCwgMHg1RTI0LCAweDVFQjAsCi0gICAgMHg1RUE0LCAweDVFQTIsIDB4NUU5QiwgMHg1RUEzLCAweDVFQTUsIDB4NUYwNywgMHg1RjJFLCAweDVGNTYsCi0gICAgMHg1Rjg2LCAweDYwMzcsIDB4NjAzOSwgMHg2MDU0LCAweDYwNzIsIDB4NjA1RSwgMHg2MDQ1LCAweDYwNTMsCi0gICAgMHg2MDQ3LCAweDYwNDksIDB4NjA1QiwgMHg2MDRDLCAweDYwNDAsIDB4NjA0MiwgMHg2MDVGLCAweDYwMjQsCi0gICAgMHg2MDQ0LCAweDYwNTgsIDB4NjA2NiwgMHg2MDZFLCAweDYyNDIsIDB4NjI0MywgMHg2MkNGLCAweDYzMEQsCi0gICAgMHg2MzBCLCAweDYyRjUsIDB4NjMwRSwgMHg2MzAzLCAweDYyRUIsIDB4NjJGOSwgMHg2MzBGLCAweDYzMEMsCi0gICAgMHg2MkY4LCAweDYyRjYsIDB4NjMwMCwgMHg2MzEzLCAweDYzMTQsIDB4NjJGQSwgMHg2MzE1LCAweDYyRkIsCi0gICAgMHg2MkYwLCAweDY1NDEsIDB4NjU0MywgMHg2NUFBLCAweDY1QkYsIDB4NjYzNiwgMHg2NjIxLCAweDY2MzIsCi0gICAgMHg2NjM1LCAweDY2MUMsIDB4NjYyNiwgMHg2NjIyLCAweDY2MzMsIDB4NjYyQiwgMHg2NjNBLCAweDY2MUQsCi0gICAgMHg2NjM0LCAweDY2MzksIDB4NjYyRSwgMHg2NzBGLCAweDY3MTAsIDB4NjdDMSwgMHg2N0YyLCAweDY3QzgsCi0gICAgMHg2N0JBLCAweDY3REMsIDB4NjdCQiwgMHg2N0Y4LCAweDY3RDgsIDB4NjdDMCwgMHg2N0I3LCAweDY3QzUsCi0gICAgMHg2N0VCLCAweDY3RTQsIDB4NjdERiwgMHg2N0I1LCAweDY3Q0QsIDB4NjdCMywgMHg2N0Y3LCAweDY3RjYsCi0gICAgMHg2N0VFLCAweDY3RTMsIDB4NjdDMiwgMHg2N0I5LCAweDY3Q0UsIDB4NjdFNywgMHg2N0YwLCAweDY3QjIsCi0gICAgMHg2N0ZDLCAweDY3QzYsIDB4NjdFRCwgMHg2N0NDLCAweDY3QUUsIDB4NjdFNiwgMHg2N0RCLCAweDY3RkEsCi0gICAgMHg2N0M5LCAweDY3Q0EsIDB4NjdDMywgMHg2N0VBLCAweDY3Q0IsIDB4NkIyOCwgMHg2QjgyLCAweDZCODQsCi0gICAgMHg2QkI2LCAweDZCRDYsIDB4NkJEOCwgMHg2QkUwLCAweDZDMjAsIDB4NkMyMSwgMHg2RDI4LCAweDZEMzQsCi0gICAgMHg2RDJELCAweDZEMUYsIDB4NkQzQywgMHg2RDNGLCAweDZEMTIsIDB4NkQwQSwgMHg2Q0RBLCAweDZEMzMsCi0gICAgMHg2RDA0LCAweDZEMTksIDB4NkQzQSwgMHg2RDFBLCAweDZEMTEsIDB4NkQwMCwgMHg2RDFELCAweDZENDIsCi0gICAgMHg2RDAxLCAweDZEMTgsIDB4NkQzNywgMHg2RDAzLCAweDZEMEYsIDB4NkQ0MCwgMHg2RDA3LCAweDZEMjAsCi0gICAgMHg2RDJDLCAweDZEMDgsIDB4NkQyMiwgMHg2RDA5LCAweDZEMTAsIDB4NzBCNywgMHg3MDlGLCAweDcwQkUsCi0gICAgMHg3MEIxLCAweDcwQjAsIDB4NzBBMSwgMHg3MEI0LCAweDcwQjUsIDB4NzBBOSwgMHg3MjQxLCAweDcyNDksCi0gICAgMHg3MjRBLCAweDcyNkMsIDB4NzI3MCwgMHg3MjczLCAweDcyNkUsIDB4NzJDQSwgMHg3MkU0LCAweDcyRTgsCi0gICAgMHg3MkVCLCAweDcyREYsIDB4NzJFQSwgMHg3MkU2LCAweDcyRTMsIDB4NzM4NSwgMHg3M0NDLCAweDczQzIsCi0gICAgMHg3M0M4LCAweDczQzUsIDB4NzNCOSwgMHg3M0I2LCAweDczQjUsIDB4NzNCNCwgMHg3M0VCLCAweDczQkYsCi0gICAgMHg3M0M3LCAweDczQkUsIDB4NzNDMywgMHg3M0M2LCAweDczQjgsIDB4NzNDQiwgMHg3NEVDLCAweDc0RUUsCi0gICAgMHg3NTJFLCAweDc1NDcsIDB4NzU0OCwgMHg3NUE3LCAweDc1QUEsIDB4NzY3OSwgMHg3NkM0LCAweDc3MDgsCi0gICAgMHg3NzAzLCAweDc3MDQsIDB4NzcwNSwgMHg3NzBBLCAweDc2RjcsIDB4NzZGQiwgMHg3NkZBLCAweDc3RTcsCi0gICAgMHg3N0U4LCAweDc4MDYsIDB4NzgxMSwgMHg3ODEyLCAweDc4MDUsIDB4NzgxMCwgMHg3ODBGLCAweDc4MEUsCi0gICAgMHg3ODA5LCAweDc4MDMsIDB4NzgxMywgMHg3OTRBLCAweDc5NEMsIDB4Nzk0QiwgMHg3OTQ1LCAweDc5NDQsCi0gICAgMHg3OUQ1LCAweDc5Q0QsIDB4NzlDRiwgMHg3OUQ2LCAweDc5Q0UsIDB4N0E4MCwgMHg3QTdFLCAweDdBRDEsCi0gICAgMHg3QjAwLCAweDdCMDEsIDB4N0M3QSwgMHg3Qzc4LCAweDdDNzksIDB4N0M3RiwgMHg3QzgwLCAweDdDODEsCi0gICAgMHg3RDAzLCAweDdEMDgsIDB4N0QwMSwgMHg3RjU4LCAweDdGOTEsIDB4N0Y4RCwgMHg3RkJFLCAweDgwMDcsCi0gICAgMHg4MDBFLCAweDgwMEYsIDB4ODAxNCwgMHg4MDM3LCAweDgwRDgsIDB4ODBDNywgMHg4MEUwLCAweDgwRDEsCi0gICAgMHg4MEM4LCAweDgwQzIsIDB4ODBEMCwgMHg4MEM1LCAweDgwRTMsIDB4ODBEOSwgMHg4MERDLCAweDgwQ0EsCi0gICAgMHg4MEQ1LCAweDgwQzksIDB4ODBDRiwgMHg4MEQ3LCAweDgwRTYsIDB4ODBDRCwgMHg4MUZGLCAweDgyMjEsCi0gICAgMHg4Mjk0LCAweDgyRDksIDB4ODJGRSwgMHg4MkY5LCAweDgzMDcsIDB4ODJFOCwgMHg4MzAwLCAweDgyRDUsCi0gICAgMHg4MzNBLCAweDgyRUIsIDB4ODJENiwgMHg4MkY0LCAweDgyRUMsIDB4ODJFMSwgMHg4MkYyLCAweDgyRjUsCi0gICAgMHg4MzBDLCAweDgyRkIsIDB4ODJGNiwgMHg4MkYwLCAweDgyRUEsIDB4ODJFNCwgMHg4MkUwLCAweDgyRkEsCi0gICAgMHg4MkYzLCAweDgyRUQsIDB4ODY3NywgMHg4Njc0LCAweDg2N0MsIDB4ODY3MywgMHg4ODQxLCAweDg4NEUsCi0gICAgMHg4ODY3LCAweDg4NkEsIDB4ODg2OSwgMHg4OUQzLCAweDhBMDQsIDB4OEEwNywgMHg4RDcyLCAweDhGRTMsCi0gICAgMHg4RkUxLCAweDhGRUUsIDB4OEZFMCwgMHg5MEYxLCAweDkwQkQsIDB4OTBCRiwgMHg5MEQ1LCAweDkwQzUsCi0gICAgMHg5MEJFLCAweDkwQzcsIDB4OTBDQiwgMHg5MEM4LCAweDkxRDQsIDB4OTFEMywgMHg5NjU0LCAweDk2NEYsCi0gICAgMHg5NjUxLCAweDk2NTMsIDB4OTY0QSwgMHg5NjRFLCAweDUwMUUsIDB4NTAwNSwgMHg1MDA3LCAweDUwMTMsCi0gICAgMHg1MDIyLCAweDUwMzAsIDB4NTAxQiwgMHg0RkY1LCAweDRGRjQsIDB4NTAzMywgMHg1MDM3LCAweDUwMkMsCi0gICAgMHg0RkY2LCAweDRGRjcsIDB4NTAxNywgMHg1MDFDLCAweDUwMjAsIDB4NTAyNywgMHg1MDM1LCAweDUwMkYsCi0gICAgMHg1MDMxLCAweDUwMEUsIDB4NTE1QSwgMHg1MTk0LCAweDUxOTMsIDB4NTFDQSwgMHg1MUM0LCAweDUxQzUsCi0gICAgMHg1MUM4LCAweDUxQ0UsIDB4NTI2MSwgMHg1MjVBLCAweDUyNTIsIDB4NTI1RSwgMHg1MjVGLCAweDUyNTUsCi0gICAgMHg1MjYyLCAweDUyQ0QsIDB4NTMwRSwgMHg1MzlFLCAweDU1MjYsIDB4NTRFMiwgMHg1NTE3LCAweDU1MTIsCi0gICAgMHg1NEU3LCAweDU0RjMsIDB4NTRFNCwgMHg1NTFBLCAweDU0RkYsIDB4NTUwNCwgMHg1NTA4LCAweDU0RUIsCi0gICAgMHg1NTExLCAweDU1MDUsIDB4NTRGMSwgMHg1NTBBLCAweDU0RkIsIDB4NTRGNywgMHg1NEY4LCAweDU0RTAsCi0gICAgMHg1NTBFLCAweDU1MDMsIDB4NTUwQiwgMHg1NzAxLCAweDU3MDIsIDB4NTdDQywgMHg1ODMyLCAweDU3RDUsCi0gICAgMHg1N0QyLCAweDU3QkEsIDB4NTdDNiwgMHg1N0JELCAweDU3QkMsIDB4NTdCOCwgMHg1N0I2LCAweDU3QkYsCi0gICAgMHg1N0M3LCAweDU3RDAsIDB4NTdCOSwgMHg1N0MxLCAweDU5MEUsIDB4NTk0QSwgMHg1QTE5LCAweDVBMTYsCi0gICAgMHg1QTJELCAweDVBMkUsIDB4NUExNSwgMHg1QTBGLCAweDVBMTcsIDB4NUEwQSwgMHg1QTFFLCAweDVBMzMsCi0gICAgMHg1QjZDLCAweDVCQTcsIDB4NUJBRCwgMHg1QkFDLCAweDVDMDMsIDB4NUM1NiwgMHg1QzU0LCAweDVDRUMsCi0gICAgMHg1Q0ZGLCAweDVDRUUsIDB4NUNGMSwgMHg1Q0Y3LCAweDVEMDAsIDB4NUNGOSwgMHg1RTI5LCAweDVFMjgsCi0gICAgMHg1RUE4LCAweDVFQUUsIDB4NUVBQSwgMHg1RUFDLCAweDVGMzMsIDB4NUYzMCwgMHg1RjY3LCAweDYwNUQsCi0gICAgMHg2MDVBLCAweDYwNjcsIDB4NjA0MSwgMHg2MEEyLCAweDYwODgsIDB4NjA4MCwgMHg2MDkyLCAweDYwODEsCi0gICAgMHg2MDlELCAweDYwODMsIDB4NjA5NSwgMHg2MDlCLCAweDYwOTcsIDB4NjA4NywgMHg2MDlDLCAweDYwOEUsCi0gICAgMHg2MjE5LCAweDYyNDYsIDB4NjJGMiwgMHg2MzEwLCAweDYzNTYsIDB4NjMyQywgMHg2MzQ0LCAweDYzNDUsCi0gICAgMHg2MzM2LCAweDYzNDMsIDB4NjNFNCwgMHg2MzM5LCAweDYzNEIsIDB4NjM0QSwgMHg2MzNDLCAweDYzMjksCi0gICAgMHg2MzQxLCAweDYzMzQsIDB4NjM1OCwgMHg2MzU0LCAweDYzNTksIDB4NjMyRCwgMHg2MzQ3LCAweDYzMzMsCi0gICAgMHg2MzVBLCAweDYzNTEsIDB4NjMzOCwgMHg2MzU3LCAweDYzNDAsIDB4NjM0OCwgMHg2NTRBLCAweDY1NDYsCi0gICAgMHg2NUM2LCAweDY1QzMsIDB4NjVDNCwgMHg2NUMyLCAweDY2NEEsIDB4NjY1RiwgMHg2NjQ3LCAweDY2NTEsCi0gICAgMHg2NzEyLCAweDY3MTMsIDB4NjgxRiwgMHg2ODFBLCAweDY4NDksIDB4NjgzMiwgMHg2ODMzLCAweDY4M0IsCi0gICAgMHg2ODRCLCAweDY4NEYsIDB4NjgxNiwgMHg2ODMxLCAweDY4MUMsIDB4NjgzNSwgMHg2ODJCLCAweDY4MkQsCi0gICAgMHg2ODJGLCAweDY4NEUsIDB4Njg0NCwgMHg2ODM0LCAweDY4MUQsIDB4NjgxMiwgMHg2ODE0LCAweDY4MjYsCi0gICAgMHg2ODI4LCAweDY4MkUsIDB4Njg0RCwgMHg2ODNBLCAweDY4MjUsIDB4NjgyMCwgMHg2QjJDLCAweDZCMkYsCi0gICAgMHg2QjJELCAweDZCMzEsIDB4NkIzNCwgMHg2QjZELCAweDgwODIsIDB4NkI4OCwgMHg2QkU2LCAweDZCRTQsCi0gICAgMHg2QkU4LCAweDZCRTMsIDB4NkJFMiwgMHg2QkU3LCAweDZDMjUsIDB4NkQ3QSwgMHg2RDYzLCAweDZENjQsCi0gICAgMHg2RDc2LCAweDZEMEQsIDB4NkQ2MSwgMHg2RDkyLCAweDZENTgsIDB4NkQ2MiwgMHg2RDZELCAweDZENkYsCi0gICAgMHg2RDkxLCAweDZEOEQsIDB4NkRFRiwgMHg2RDdGLCAweDZEODYsIDB4NkQ1RSwgMHg2RDY3LCAweDZENjAsCi0gICAgMHg2RDk3LCAweDZENzAsIDB4NkQ3QywgMHg2RDVGLCAweDZEODIsIDB4NkQ5OCwgMHg2RDJGLCAweDZENjgsCi0gICAgMHg2RDhCLCAweDZEN0UsIDB4NkQ4MCwgMHg2RDg0LCAweDZEMTYsIDB4NkQ4MywgMHg2RDdCLCAweDZEN0QsCi0gICAgMHg2RDc1LCAweDZEOTAsIDB4NzBEQywgMHg3MEQzLCAweDcwRDEsIDB4NzBERCwgMHg3MENCLCAweDdGMzksCi0gICAgMHg3MEUyLCAweDcwRDcsIDB4NzBEMiwgMHg3MERFLCAweDcwRTAsIDB4NzBENCwgMHg3MENELCAweDcwQzUsCi0gICAgMHg3MEM2LCAweDcwQzcsIDB4NzBEQSwgMHg3MENFLCAweDcwRTEsIDB4NzI0MiwgMHg3Mjc4LCAweDcyNzcsCi0gICAgMHg3Mjc2LCAweDczMDAsIDB4NzJGQSwgMHg3MkY0LCAweDcyRkUsIDB4NzJGNiwgMHg3MkYzLCAweDcyRkIsCi0gICAgMHg3MzAxLCAweDczRDMsIDB4NzNEOSwgMHg3M0U1LCAweDczRDYsIDB4NzNCQywgMHg3M0U3LCAweDczRTMsCi0gICAgMHg3M0U5LCAweDczREMsIDB4NzNEMiwgMHg3M0RCLCAweDczRDQsIDB4NzNERCwgMHg3M0RBLCAweDczRDcsCi0gICAgMHg3M0Q4LCAweDczRTgsIDB4NzRERSwgMHg3NERGLCAweDc0RjQsIDB4NzRGNSwgMHg3NTIxLCAweDc1NUIsCi0gICAgMHg3NTVGLCAweDc1QjAsIDB4NzVDMSwgMHg3NUJCLCAweDc1QzQsIDB4NzVDMCwgMHg3NUJGLCAweDc1QjYsCi0gICAgMHg3NUJBLCAweDc2OEEsIDB4NzZDOSwgMHg3NzFELCAweDc3MUIsIDB4NzcxMCwgMHg3NzEzLCAweDc3MTIsCi0gICAgMHg3NzIzLCAweDc3MTEsIDB4NzcxNSwgMHg3NzE5LCAweDc3MUEsIDB4NzcyMiwgMHg3NzI3LCAweDc4MjMsCi0gICAgMHg3ODJDLCAweDc4MjIsIDB4NzgzNSwgMHg3ODJGLCAweDc4MjgsIDB4NzgyRSwgMHg3ODJCLCAweDc4MjEsCi0gICAgMHg3ODI5LCAweDc4MzMsIDB4NzgyQSwgMHg3ODMxLCAweDc5NTQsIDB4Nzk1QiwgMHg3OTRGLCAweDc5NUMsCi0gICAgMHg3OTUzLCAweDc5NTIsIDB4Nzk1MSwgMHg3OUVCLCAweDc5RUMsIDB4NzlFMCwgMHg3OUVFLCAweDc5RUQsCi0gICAgMHg3OUVBLCAweDc5REMsIDB4NzlERSwgMHg3OURELCAweDdBODYsIDB4N0E4OSwgMHg3QTg1LCAweDdBOEIsCi0gICAgMHg3QThDLCAweDdBOEEsIDB4N0E4NywgMHg3QUQ4LCAweDdCMTAsIDB4N0IwNCwgMHg3QjEzLCAweDdCMDUsCi0gICAgMHg3QjBGLCAweDdCMDgsIDB4N0IwQSwgMHg3QjBFLCAweDdCMDksIDB4N0IxMiwgMHg3Qzg0LCAweDdDOTEsCi0gICAgMHg3QzhBLCAweDdDOEMsIDB4N0M4OCwgMHg3QzhELCAweDdDODUsIDB4N0QxRSwgMHg3RDFELCAweDdEMTEsCi0gICAgMHg3RDBFLCAweDdEMTgsIDB4N0QxNiwgMHg3RDEzLCAweDdEMUYsIDB4N0QxMiwgMHg3RDBGLCAweDdEMEMsCi0gICAgMHg3RjVDLCAweDdGNjEsIDB4N0Y1RSwgMHg3RjYwLCAweDdGNUQsIDB4N0Y1QiwgMHg3Rjk2LCAweDdGOTIsCi0gICAgMHg3RkMzLCAweDdGQzIsIDB4N0ZDMCwgMHg4MDE2LCAweDgwM0UsIDB4ODAzOSwgMHg4MEZBLCAweDgwRjIsCi0gICAgMHg4MEY5LCAweDgwRjUsIDB4ODEwMSwgMHg4MEZCLCAweDgxMDAsIDB4ODIwMSwgMHg4MjJGLCAweDgyMjUsCi0gICAgMHg4MzMzLCAweDgzMkQsIDB4ODM0NCwgMHg4MzE5LCAweDgzNTEsIDB4ODMyNSwgMHg4MzU2LCAweDgzM0YsCi0gICAgMHg4MzQxLCAweDgzMjYsIDB4ODMxQywgMHg4MzIyLCAweDgzNDIsIDB4ODM0RSwgMHg4MzFCLCAweDgzMkEsCi0gICAgMHg4MzA4LCAweDgzM0MsIDB4ODM0RCwgMHg4MzE2LCAweDgzMjQsIDB4ODMyMCwgMHg4MzM3LCAweDgzMkYsCi0gICAgMHg4MzI5LCAweDgzNDcsIDB4ODM0NSwgMHg4MzRDLCAweDgzNTMsIDB4ODMxRSwgMHg4MzJDLCAweDgzNEIsCi0gICAgMHg4MzI3LCAweDgzNDgsIDB4ODY1MywgMHg4NjUyLCAweDg2QTIsIDB4ODZBOCwgMHg4Njk2LCAweDg2OEQsCi0gICAgMHg4NjkxLCAweDg2OUUsIDB4ODY4NywgMHg4Njk3LCAweDg2ODYsIDB4ODY4QiwgMHg4NjlBLCAweDg2ODUsCi0gICAgMHg4NkE1LCAweDg2OTksIDB4ODZBMSwgMHg4NkE3LCAweDg2OTUsIDB4ODY5OCwgMHg4NjhFLCAweDg2OUQsCi0gICAgMHg4NjkwLCAweDg2OTQsIDB4ODg0MywgMHg4ODQ0LCAweDg4NkQsIDB4ODg3NSwgMHg4ODc2LCAweDg4NzIsCi0gICAgMHg4ODgwLCAweDg4NzEsIDB4ODg3RiwgMHg4ODZGLCAweDg4ODMsIDB4ODg3RSwgMHg4ODc0LCAweDg4N0MsCi0gICAgMHg4QTEyLCAweDhDNDcsIDB4OEM1NywgMHg4QzdCLCAweDhDQTQsIDB4OENBMywgMHg4RDc2LCAweDhENzgsCi0gICAgMHg4REI1LCAweDhEQjcsIDB4OERCNiwgMHg4RUQxLCAweDhFRDMsIDB4OEZGRSwgMHg4RkY1LCAweDkwMDIsCi0gICAgMHg4RkZGLCAweDhGRkIsIDB4OTAwNCwgMHg4RkZDLCAweDhGRjYsIDB4OTBENiwgMHg5MEUwLCAweDkwRDksCi0gICAgMHg5MERBLCAweDkwRTMsIDB4OTBERiwgMHg5MEU1LCAweDkwRDgsIDB4OTBEQiwgMHg5MEQ3LCAweDkwREMsCi0gICAgMHg5MEU0LCAweDkxNTAsIDB4OTE0RSwgMHg5MTRGLCAweDkxRDUsIDB4OTFFMiwgMHg5MURBLCAweDk2NUMsCi0gICAgMHg5NjVGLCAweDk2QkMsIDB4OThFMywgMHg5QURGLCAweDlCMkYsIDB4NEU3RiwgMHg1MDcwLCAweDUwNkEsCi0gICAgMHg1MDYxLCAweDUwNUUsIDB4NTA2MCwgMHg1MDUzLCAweDUwNEIsIDB4NTA1RCwgMHg1MDcyLCAweDUwNDgsCi0gICAgMHg1MDRELCAweDUwNDEsIDB4NTA1QiwgMHg1MDRBLCAweDUwNjIsIDB4NTAxNSwgMHg1MDQ1LCAweDUwNUYsCi0gICAgMHg1MDY5LCAweDUwNkIsIDB4NTA2MywgMHg1MDY0LCAweDUwNDYsIDB4NTA0MCwgMHg1MDZFLCAweDUwNzMsCi0gICAgMHg1MDU3LCAweDUwNTEsIDB4NTFEMCwgMHg1MjZCLCAweDUyNkQsIDB4NTI2QywgMHg1MjZFLCAweDUyRDYsCi0gICAgMHg1MkQzLCAweDUzMkQsIDB4NTM5QywgMHg1NTc1LCAweDU1NzYsIDB4NTUzQywgMHg1NTRELCAweDU1NTAsCi0gICAgMHg1NTM0LCAweDU1MkEsIDB4NTU1MSwgMHg1NTYyLCAweDU1MzYsIDB4NTUzNSwgMHg1NTMwLCAweDU1NTIsCi0gICAgMHg1NTQ1LCAweDU1MEMsIDB4NTUzMiwgMHg1NTY1LCAweDU1NEUsIDB4NTUzOSwgMHg1NTQ4LCAweDU1MkQsCi0gICAgMHg1NTNCLCAweDU1NDAsIDB4NTU0QiwgMHg1NzBBLCAweDU3MDcsIDB4NTdGQiwgMHg1ODE0LCAweDU3RTIsCi0gICAgMHg1N0Y2LCAweDU3REMsIDB4NTdGNCwgMHg1ODAwLCAweDU3RUQsIDB4NTdGRCwgMHg1ODA4LCAweDU3RjgsCi0gICAgMHg1ODBCLCAweDU3RjMsIDB4NTdDRiwgMHg1ODA3LCAweDU3RUUsIDB4NTdFMywgMHg1N0YyLCAweDU3RTUsCi0gICAgMHg1N0VDLCAweDU3RTEsIDB4NTgwRSwgMHg1N0ZDLCAweDU4MTAsIDB4NTdFNywgMHg1ODAxLCAweDU4MEMsCi0gICAgMHg1N0YxLCAweDU3RTksIDB4NTdGMCwgMHg1ODBELCAweDU4MDQsIDB4NTk1QywgMHg1QTYwLCAweDVBNTgsCi0gICAgMHg1QTU1LCAweDVBNjcsIDB4NUE1RSwgMHg1QTM4LCAweDVBMzUsIDB4NUE2RCwgMHg1QTUwLCAweDVBNUYsCi0gICAgMHg1QTY1LCAweDVBNkMsIDB4NUE1MywgMHg1QTY0LCAweDVBNTcsIDB4NUE0MywgMHg1QTVELCAweDVBNTIsCi0gICAgMHg1QTQ0LCAweDVBNUIsIDB4NUE0OCwgMHg1QThFLCAweDVBM0UsIDB4NUE0RCwgMHg1QTM5LCAweDVBNEMsCi0gICAgMHg1QTcwLCAweDVBNjksIDB4NUE0NywgMHg1QTUxLCAweDVBNTYsIDB4NUE0MiwgMHg1QTVDLCAweDVCNzIsCi0gICAgMHg1QjZFLCAweDVCQzEsIDB4NUJDMCwgMHg1QzU5LCAweDVEMUUsIDB4NUQwQiwgMHg1RDFELCAweDVEMUEsCi0gICAgMHg1RDIwLCAweDVEMEMsIDB4NUQyOCwgMHg1RDBELCAweDVEMjYsIDB4NUQyNSwgMHg1RDBGLCAweDVEMzAsCi0gICAgMHg1RDEyLCAweDVEMjMsIDB4NUQxRiwgMHg1RDJFLCAweDVFM0UsIDB4NUUzNCwgMHg1RUIxLCAweDVFQjQsCi0gICAgMHg1RUI5LCAweDVFQjIsIDB4NUVCMywgMHg1RjM2LCAweDVGMzgsIDB4NUY5QiwgMHg1Rjk2LCAweDVGOUYsCi0gICAgMHg2MDhBLCAweDYwOTAsIDB4NjA4NiwgMHg2MEJFLCAweDYwQjAsIDB4NjBCQSwgMHg2MEQzLCAweDYwRDQsCi0gICAgMHg2MENGLCAweDYwRTQsIDB4NjBEOSwgMHg2MERELCAweDYwQzgsIDB4NjBCMSwgMHg2MERCLCAweDYwQjcsCi0gICAgMHg2MENBLCAweDYwQkYsIDB4NjBDMywgMHg2MENELCAweDYwQzAsIDB4NjMzMiwgMHg2MzY1LCAweDYzOEEsCi0gICAgMHg2MzgyLCAweDYzN0QsIDB4NjNCRCwgMHg2MzlFLCAweDYzQUQsIDB4NjM5RCwgMHg2Mzk3LCAweDYzQUIsCi0gICAgMHg2MzhFLCAweDYzNkYsIDB4NjM4NywgMHg2MzkwLCAweDYzNkUsIDB4NjNBRiwgMHg2Mzc1LCAweDYzOUMsCi0gICAgMHg2MzZELCAweDYzQUUsIDB4NjM3QywgMHg2M0E0LCAweDYzM0IsIDB4NjM5RiwgMHg2Mzc4LCAweDYzODUsCi0gICAgMHg2MzgxLCAweDYzOTEsIDB4NjM4RCwgMHg2MzcwLCAweDY1NTMsIDB4NjVDRCwgMHg2NjY1LCAweDY2NjEsCi0gICAgMHg2NjVCLCAweDY2NTksIDB4NjY1QywgMHg2NjYyLCAweDY3MTgsIDB4Njg3OSwgMHg2ODg3LCAweDY4OTAsCi0gICAgMHg2ODlDLCAweDY4NkQsIDB4Njg2RSwgMHg2OEFFLCAweDY4QUIsIDB4Njk1NiwgMHg2ODZGLCAweDY4QTMsCi0gICAgMHg2OEFDLCAweDY4QTksIDB4Njg3NSwgMHg2ODc0LCAweDY4QjIsIDB4Njg4RiwgMHg2ODc3LCAweDY4OTIsCi0gICAgMHg2ODdDLCAweDY4NkIsIDB4Njg3MiwgMHg2OEFBLCAweDY4ODAsIDB4Njg3MSwgMHg2ODdFLCAweDY4OUIsCi0gICAgMHg2ODk2LCAweDY4OEIsIDB4NjhBMCwgMHg2ODg5LCAweDY4QTQsIDB4Njg3OCwgMHg2ODdCLCAweDY4OTEsCi0gICAgMHg2ODhDLCAweDY4OEEsIDB4Njg3RCwgMHg2QjM2LCAweDZCMzMsIDB4NkIzNywgMHg2QjM4LCAweDZCOTEsCi0gICAgMHg2QjhGLCAweDZCOEQsIDB4NkI4RSwgMHg2QjhDLCAweDZDMkEsIDB4NkRDMCwgMHg2REFCLCAweDZEQjQsCi0gICAgMHg2REIzLCAweDZFNzQsIDB4NkRBQywgMHg2REU5LCAweDZERTIsIDB4NkRCNywgMHg2REY2LCAweDZERDQsCi0gICAgMHg2RTAwLCAweDZEQzgsIDB4NkRFMCwgMHg2RERGLCAweDZERDYsIDB4NkRCRSwgMHg2REU1LCAweDZEREMsCi0gICAgMHg2RERELCAweDZEREIsIDB4NkRGNCwgMHg2RENBLCAweDZEQkQsIDB4NkRFRCwgMHg2REYwLCAweDZEQkEsCi0gICAgMHg2REQ1LCAweDZEQzIsIDB4NkRDRiwgMHg2REM5LCAweDZERDAsIDB4NkRGMiwgMHg2REQzLCAweDZERkQsCi0gICAgMHg2REQ3LCAweDZEQ0QsIDB4NkRFMywgMHg2REJCLCAweDcwRkEsIDB4NzEwRCwgMHg3MEY3LCAweDcxMTcsCi0gICAgMHg3MEY0LCAweDcxMEMsIDB4NzBGMCwgMHg3MTA0LCAweDcwRjMsIDB4NzExMCwgMHg3MEZDLCAweDcwRkYsCi0gICAgMHg3MTA2LCAweDcxMTMsIDB4NzEwMCwgMHg3MEY4LCAweDcwRjYsIDB4NzEwQiwgMHg3MTAyLCAweDcxMEUsCi0gICAgMHg3MjdFLCAweDcyN0IsIDB4NzI3QywgMHg3MjdGLCAweDczMUQsIDB4NzMxNywgMHg3MzA3LCAweDczMTEsCi0gICAgMHg3MzE4LCAweDczMEEsIDB4NzMwOCwgMHg3MkZGLCAweDczMEYsIDB4NzMxRSwgMHg3Mzg4LCAweDczRjYsCi0gICAgMHg3M0Y4LCAweDczRjUsIDB4NzQwNCwgMHg3NDAxLCAweDczRkQsIDB4NzQwNywgMHg3NDAwLCAweDczRkEsCi0gICAgMHg3M0ZDLCAweDczRkYsIDB4NzQwQywgMHg3NDBCLCAweDczRjQsIDB4NzQwOCwgMHg3NTY0LCAweDc1NjMsCi0gICAgMHg3NUNFLCAweDc1RDIsIDB4NzVDRiwgMHg3NUNCLCAweDc1Q0MsIDB4NzVEMSwgMHg3NUQwLCAweDc2OEYsCi0gICAgMHg3Njg5LCAweDc2RDMsIDB4NzczOSwgMHg3NzJGLCAweDc3MkQsIDB4NzczMSwgMHg3NzMyLCAweDc3MzQsCi0gICAgMHg3NzMzLCAweDc3M0QsIDB4NzcyNSwgMHg3NzNCLCAweDc3MzUsIDB4Nzg0OCwgMHg3ODUyLCAweDc4NDksCi0gICAgMHg3ODRELCAweDc4NEEsIDB4Nzg0QywgMHg3ODI2LCAweDc4NDUsIDB4Nzg1MCwgMHg3OTY0LCAweDc5NjcsCi0gICAgMHg3OTY5LCAweDc5NkEsIDB4Nzk2MywgMHg3OTZCLCAweDc5NjEsIDB4NzlCQiwgMHg3OUZBLCAweDc5RjgsCi0gICAgMHg3OUY2LCAweDc5RjcsIDB4N0E4RiwgMHg3QTk0LCAweDdBOTAsIDB4N0IzNSwgMHg3QjNCLCAweDdCMzQsCi0gICAgMHg3QjI1LCAweDdCMzAsIDB4N0IyMiwgMHg3QjI0LCAweDdCMzMsIDB4N0IxOCwgMHg3QjJBLCAweDdCMUQsCi0gICAgMHg3QjMxLCAweDdCMkIsIDB4N0IyRCwgMHg3QjJGLCAweDdCMzIsIDB4N0IzOCwgMHg3QjFBLCAweDdCMjMsCi0gICAgMHg3Qzk0LCAweDdDOTgsIDB4N0M5NiwgMHg3Q0EzLCAweDdEMzUsIDB4N0QzRCwgMHg3RDM4LCAweDdEMzYsCi0gICAgMHg3RDNBLCAweDdENDUsIDB4N0QyQywgMHg3RDI5LCAweDdENDEsIDB4N0Q0NywgMHg3RDNFLCAweDdEM0YsCi0gICAgMHg3RDRBLCAweDdEM0IsIDB4N0QyOCwgMHg3RjYzLCAweDdGOTUsIDB4N0Y5QywgMHg3RjlELCAweDdGOUIsCi0gICAgMHg3RkNBLCAweDdGQ0IsIDB4N0ZDRCwgMHg3RkQwLCAweDdGRDEsIDB4N0ZDNywgMHg3RkNGLCAweDdGQzksCi0gICAgMHg4MDFGLCAweDgwMUUsIDB4ODAxQiwgMHg4MDQ3LCAweDgwNDMsIDB4ODA0OCwgMHg4MTE4LCAweDgxMjUsCi0gICAgMHg4MTE5LCAweDgxMUIsIDB4ODEyRCwgMHg4MTFGLCAweDgxMkMsIDB4ODExRSwgMHg4MTIxLCAweDgxMTUsCi0gICAgMHg4MTI3LCAweDgxMUQsIDB4ODEyMiwgMHg4MjExLCAweDgyMzgsIDB4ODIzMywgMHg4MjNBLCAweDgyMzQsCi0gICAgMHg4MjMyLCAweDgyNzQsIDB4ODM5MCwgMHg4M0EzLCAweDgzQTgsIDB4ODM4RCwgMHg4MzdBLCAweDgzNzMsCi0gICAgMHg4M0E0LCAweDgzNzQsIDB4ODM4RiwgMHg4MzgxLCAweDgzOTUsIDB4ODM5OSwgMHg4Mzc1LCAweDgzOTQsCi0gICAgMHg4M0E5LCAweDgzN0QsIDB4ODM4MywgMHg4MzhDLCAweDgzOUQsIDB4ODM5QiwgMHg4M0FBLCAweDgzOEIsCi0gICAgMHg4MzdFLCAweDgzQTUsIDB4ODNBRiwgMHg4Mzg4LCAweDgzOTcsIDB4ODNCMCwgMHg4MzdGLCAweDgzQTYsCi0gICAgMHg4Mzg3LCAweDgzQUUsIDB4ODM3NiwgMHg4NjU5LCAweDg2NTYsIDB4ODZCRiwgMHg4NkI3LCAweDg2QzIsCi0gICAgMHg4NkMxLCAweDg2QzUsIDB4ODZCQSwgMHg4NkIwLCAweDg2QzgsIDB4ODZCOSwgMHg4NkIzLCAweDg2QjgsCi0gICAgMHg4NkNDLCAweDg2QjQsIDB4ODZCQiwgMHg4NkJDLCAweDg2QzMsIDB4ODZCRCwgMHg4NkJFLCAweDg4NTIsCi0gICAgMHg4ODg5LCAweDg4OTUsIDB4ODhBOCwgMHg4OEEyLCAweDg4QUEsIDB4ODg5QSwgMHg4ODkxLCAweDg4QTEsCi0gICAgMHg4ODlGLCAweDg4OTgsIDB4ODhBNywgMHg4ODk5LCAweDg4OUIsIDB4ODg5NywgMHg4OEE0LCAweDg4QUMsCi0gICAgMHg4ODhDLCAweDg4OTMsIDB4ODg4RSwgMHg4OTgyLCAweDg5RDYsIDB4ODlEOSwgMHg4OUQ1LCAweDhBMzAsCi0gICAgMHg4QTI3LCAweDhBMkMsIDB4OEExRSwgMHg4QzM5LCAweDhDM0IsIDB4OEM1QywgMHg4QzVELCAweDhDN0QsCi0gICAgMHg4Q0E1LCAweDhEN0QsIDB4OEQ3QiwgMHg4RDc5LCAweDhEQkMsIDB4OERDMiwgMHg4REI5LCAweDhEQkYsCi0gICAgMHg4REMxLCAweDhFRDgsIDB4OEVERSwgMHg4RURELCAweDhFREMsIDB4OEVENywgMHg4RUUwLCAweDhFRTEsCi0gICAgMHg5MDI0LCAweDkwMEIsIDB4OTAxMSwgMHg5MDFDLCAweDkwMEMsIDB4OTAyMSwgMHg5MEVGLCAweDkwRUEsCi0gICAgMHg5MEYwLCAweDkwRjQsIDB4OTBGMiwgMHg5MEYzLCAweDkwRDQsIDB4OTBFQiwgMHg5MEVDLCAweDkwRTksCi0gICAgMHg5MTU2LCAweDkxNTgsIDB4OTE1QSwgMHg5MTUzLCAweDkxNTUsIDB4OTFFQywgMHg5MUY0LCAweDkxRjEsCi0gICAgMHg5MUYzLCAweDkxRjgsIDB4OTFFNCwgMHg5MUY5LCAweDkxRUEsIDB4OTFFQiwgMHg5MUY3LCAweDkxRTgsCi0gICAgMHg5MUVFLCAweDk1N0EsIDB4OTU4NiwgMHg5NTg4LCAweDk2N0MsIDB4OTY2RCwgMHg5NjZCLCAweDk2NzEsCi0gICAgMHg5NjZGLCAweDk2QkYsIDB4OTc2QSwgMHg5ODA0LCAweDk4RTUsIDB4OTk5NywgMHg1MDlCLCAweDUwOTUsCi0gICAgMHg1MDk0LCAweDUwOUUsIDB4NTA4QiwgMHg1MEEzLCAweDUwODMsIDB4NTA4QywgMHg1MDhFLCAweDUwOUQsCi0gICAgMHg1MDY4LCAweDUwOUMsIDB4NTA5MiwgMHg1MDgyLCAweDUwODcsIDB4NTE1RiwgMHg1MUQ0LCAweDUzMTIsCi0gICAgMHg1MzExLCAweDUzQTQsIDB4NTNBNywgMHg1NTkxLCAweDU1QTgsIDB4NTVBNSwgMHg1NUFELCAweDU1NzcsCi0gICAgMHg1NjQ1LCAweDU1QTIsIDB4NTU5MywgMHg1NTg4LCAweDU1OEYsIDB4NTVCNSwgMHg1NTgxLCAweDU1QTMsCi0gICAgMHg1NTkyLCAweDU1QTQsIDB4NTU3RCwgMHg1NThDLCAweDU1QTYsIDB4NTU3RiwgMHg1NTk1LCAweDU1QTEsCi0gICAgMHg1NThFLCAweDU3MEMsIDB4NTgyOSwgMHg1ODM3LCAweDU4MTksIDB4NTgxRSwgMHg1ODI3LCAweDU4MjMsCi0gICAgMHg1ODI4LCAweDU3RjUsIDB4NTg0OCwgMHg1ODI1LCAweDU4MUMsIDB4NTgxQiwgMHg1ODMzLCAweDU4M0YsCi0gICAgMHg1ODM2LCAweDU4MkUsIDB4NTgzOSwgMHg1ODM4LCAweDU4MkQsIDB4NTgyQywgMHg1ODNCLCAweDU5NjEsCi0gICAgMHg1QUFGLCAweDVBOTQsIDB4NUE5RiwgMHg1QTdBLCAweDVBQTIsIDB4NUE5RSwgMHg1QTc4LCAweDVBQTYsCi0gICAgMHg1QTdDLCAweDVBQTUsIDB4NUFBQywgMHg1QTk1LCAweDVBQUUsIDB4NUEzNywgMHg1QTg0LCAweDVBOEEsCi0gICAgMHg1QTk3LCAweDVBODMsIDB4NUE4QiwgMHg1QUE5LCAweDVBN0IsIDB4NUE3RCwgMHg1QThDLCAweDVBOUMsCi0gICAgMHg1QThGLCAweDVBOTMsIDB4NUE5RCwgMHg1QkVBLCAweDVCQ0QsIDB4NUJDQiwgMHg1QkQ0LCAweDVCRDEsCi0gICAgMHg1QkNBLCAweDVCQ0UsIDB4NUMwQywgMHg1QzMwLCAweDVEMzcsIDB4NUQ0MywgMHg1RDZCLCAweDVENDEsCi0gICAgMHg1RDRCLCAweDVEM0YsIDB4NUQzNSwgMHg1RDUxLCAweDVENEUsIDB4NUQ1NSwgMHg1RDMzLCAweDVEM0EsCi0gICAgMHg1RDUyLCAweDVEM0QsIDB4NUQzMSwgMHg1RDU5LCAweDVENDIsIDB4NUQzOSwgMHg1RDQ5LCAweDVEMzgsCi0gICAgMHg1RDNDLCAweDVEMzIsIDB4NUQzNiwgMHg1RDQwLCAweDVENDUsIDB4NUU0NCwgMHg1RTQxLCAweDVGNTgsCi0gICAgMHg1RkE2LCAweDVGQTUsIDB4NUZBQiwgMHg2MEM5LCAweDYwQjksIDB4NjBDQywgMHg2MEUyLCAweDYwQ0UsCi0gICAgMHg2MEM0LCAweDYxMTQsIDB4NjBGMiwgMHg2MTBBLCAweDYxMTYsIDB4NjEwNSwgMHg2MEY1LCAweDYxMTMsCi0gICAgMHg2MEY4LCAweDYwRkMsIDB4NjBGRSwgMHg2MEMxLCAweDYxMDMsIDB4NjExOCwgMHg2MTFELCAweDYxMTAsCi0gICAgMHg2MEZGLCAweDYxMDQsIDB4NjEwQiwgMHg2MjRBLCAweDYzOTQsIDB4NjNCMSwgMHg2M0IwLCAweDYzQ0UsCi0gICAgMHg2M0U1LCAweDYzRTgsIDB4NjNFRiwgMHg2M0MzLCAweDY0OUQsIDB4NjNGMywgMHg2M0NBLCAweDYzRTAsCi0gICAgMHg2M0Y2LCAweDYzRDUsIDB4NjNGMiwgMHg2M0Y1LCAweDY0NjEsIDB4NjNERiwgMHg2M0JFLCAweDYzREQsCi0gICAgMHg2M0RDLCAweDYzQzQsIDB4NjNEOCwgMHg2M0QzLCAweDYzQzIsIDB4NjNDNywgMHg2M0NDLCAweDYzQ0IsCi0gICAgMHg2M0M4LCAweDYzRjAsIDB4NjNENywgMHg2M0Q5LCAweDY1MzIsIDB4NjU2NywgMHg2NTZBLCAweDY1NjQsCi0gICAgMHg2NTVDLCAweDY1NjgsIDB4NjU2NSwgMHg2NThDLCAweDY1OUQsIDB4NjU5RSwgMHg2NUFFLCAweDY1RDAsCi0gICAgMHg2NUQyLCAweDY2N0MsIDB4NjY2QywgMHg2NjdCLCAweDY2ODAsIDB4NjY3MSwgMHg2Njc5LCAweDY2NkEsCi0gICAgMHg2NjcyLCAweDY3MDEsIDB4NjkwQywgMHg2OEQzLCAweDY5MDQsIDB4NjhEQywgMHg2OTJBLCAweDY4RUMsCi0gICAgMHg2OEVBLCAweDY4RjEsIDB4NjkwRiwgMHg2OEQ2LCAweDY4RjcsIDB4NjhFQiwgMHg2OEU0LCAweDY4RjYsCi0gICAgMHg2OTEzLCAweDY5MTAsIDB4NjhGMywgMHg2OEUxLCAweDY5MDcsIDB4NjhDQywgMHg2OTA4LCAweDY5NzAsCi0gICAgMHg2OEI0LCAweDY5MTEsIDB4NjhFRiwgMHg2OEM2LCAweDY5MTQsIDB4NjhGOCwgMHg2OEQwLCAweDY4RkQsCi0gICAgMHg2OEZDLCAweDY4RTgsIDB4NjkwQiwgMHg2OTBBLCAweDY5MTcsIDB4NjhDRSwgMHg2OEM4LCAweDY4REQsCi0gICAgMHg2OERFLCAweDY4RTYsIDB4NjhGNCwgMHg2OEQxLCAweDY5MDYsIDB4NjhENCwgMHg2OEU5LCAweDY5MTUsCi0gICAgMHg2OTI1LCAweDY4QzcsIDB4NkIzOSwgMHg2QjNCLCAweDZCM0YsIDB4NkIzQywgMHg2Qjk0LCAweDZCOTcsCi0gICAgMHg2Qjk5LCAweDZCOTUsIDB4NkJCRCwgMHg2QkYwLCAweDZCRjIsIDB4NkJGMywgMHg2QzMwLCAweDZERkMsCi0gICAgMHg2RTQ2LCAweDZFNDcsIDB4NkUxRiwgMHg2RTQ5LCAweDZFODgsIDB4NkUzQywgMHg2RTNELCAweDZFNDUsCi0gICAgMHg2RTYyLCAweDZFMkIsIDB4NkUzRiwgMHg2RTQxLCAweDZFNUQsIDB4NkU3MywgMHg2RTFDLCAweDZFMzMsCi0gICAgMHg2RTRCLCAweDZFNDAsIDB4NkU1MSwgMHg2RTNCLCAweDZFMDMsIDB4NkUyRSwgMHg2RTVFLCAweDZFNjgsCi0gICAgMHg2RTVDLCAweDZFNjEsIDB4NkUzMSwgMHg2RTI4LCAweDZFNjAsIDB4NkU3MSwgMHg2RTZCLCAweDZFMzksCi0gICAgMHg2RTIyLCAweDZFMzAsIDB4NkU1MywgMHg2RTY1LCAweDZFMjcsIDB4NkU3OCwgMHg2RTY0LCAweDZFNzcsCi0gICAgMHg2RTU1LCAweDZFNzksIDB4NkU1MiwgMHg2RTY2LCAweDZFMzUsIDB4NkUzNiwgMHg2RTVBLCAweDcxMjAsCi0gICAgMHg3MTFFLCAweDcxMkYsIDB4NzBGQiwgMHg3MTJFLCAweDcxMzEsIDB4NzEyMywgMHg3MTI1LCAweDcxMjIsCi0gICAgMHg3MTMyLCAweDcxMUYsIDB4NzEyOCwgMHg3MTNBLCAweDcxMUIsIDB4NzI0QiwgMHg3MjVBLCAweDcyODgsCi0gICAgMHg3Mjg5LCAweDcyODYsIDB4NzI4NSwgMHg3MjhCLCAweDczMTIsIDB4NzMwQiwgMHg3MzMwLCAweDczMjIsCi0gICAgMHg3MzMxLCAweDczMzMsIDB4NzMyNywgMHg3MzMyLCAweDczMkQsIDB4NzMyNiwgMHg3MzIzLCAweDczMzUsCi0gICAgMHg3MzBDLCAweDc0MkUsIDB4NzQyQywgMHg3NDMwLCAweDc0MkIsIDB4NzQxNiwgMHg3NDFBLCAweDc0MjEsCi0gICAgMHg3NDJELCAweDc0MzEsIDB4NzQyNCwgMHg3NDIzLCAweDc0MUQsIDB4NzQyOSwgMHg3NDIwLCAweDc0MzIsCi0gICAgMHg3NEZCLCAweDc1MkYsIDB4NzU2RiwgMHg3NTZDLCAweDc1RTcsIDB4NzVEQSwgMHg3NUUxLCAweDc1RTYsCi0gICAgMHg3NURELCAweDc1REYsIDB4NzVFNCwgMHg3NUQ3LCAweDc2OTUsIDB4NzY5MiwgMHg3NkRBLCAweDc3NDYsCi0gICAgMHg3NzQ3LCAweDc3NDQsIDB4Nzc0RCwgMHg3NzQ1LCAweDc3NEEsIDB4Nzc0RSwgMHg3NzRCLCAweDc3NEMsCi0gICAgMHg3N0RFLCAweDc3RUMsIDB4Nzg2MCwgMHg3ODY0LCAweDc4NjUsIDB4Nzg1QywgMHg3ODZELCAweDc4NzEsCi0gICAgMHg3ODZBLCAweDc4NkUsIDB4Nzg3MCwgMHg3ODY5LCAweDc4NjgsIDB4Nzg1RSwgMHg3ODYyLCAweDc5NzQsCi0gICAgMHg3OTczLCAweDc5NzIsIDB4Nzk3MCwgMHg3QTAyLCAweDdBMEEsIDB4N0EwMywgMHg3QTBDLCAweDdBMDQsCi0gICAgMHg3QTk5LCAweDdBRTYsIDB4N0FFNCwgMHg3QjRBLCAweDdCNDcsIDB4N0I0NCwgMHg3QjQ4LCAweDdCNEMsCi0gICAgMHg3QjRFLCAweDdCNDAsIDB4N0I1OCwgMHg3QjQ1LCAweDdDQTIsIDB4N0M5RSwgMHg3Q0E4LCAweDdDQTEsCi0gICAgMHg3RDU4LCAweDdENkYsIDB4N0Q2MywgMHg3RDUzLCAweDdENTYsIDB4N0Q2NywgMHg3RDZBLCAweDdENEYsCi0gICAgMHg3RDZELCAweDdENUMsIDB4N0Q2QiwgMHg3RDUyLCAweDdENTQsIDB4N0Q2OSwgMHg3RDUxLCAweDdENUYsCi0gICAgMHg3RDRFLCAweDdGM0UsIDB4N0YzRiwgMHg3RjY1LCAweDdGNjYsIDB4N0ZBMiwgMHg3RkEwLCAweDdGQTEsCi0gICAgMHg3RkQ3LCAweDgwNTEsIDB4ODA0RiwgMHg4MDUwLCAweDgwRkUsIDB4ODBENCwgMHg4MTQzLCAweDgxNEEsCi0gICAgMHg4MTUyLCAweDgxNEYsIDB4ODE0NywgMHg4MTNELCAweDgxNEQsIDB4ODEzQSwgMHg4MUU2LCAweDgxRUUsCi0gICAgMHg4MUY3LCAweDgxRjgsIDB4ODFGOSwgMHg4MjA0LCAweDgyM0MsIDB4ODIzRCwgMHg4MjNGLCAweDgyNzUsCi0gICAgMHg4MzNCLCAweDgzQ0YsIDB4ODNGOSwgMHg4NDIzLCAweDgzQzAsIDB4ODNFOCwgMHg4NDEyLCAweDgzRTcsCi0gICAgMHg4M0U0LCAweDgzRkMsIDB4ODNGNiwgMHg4NDEwLCAweDgzQzYsIDB4ODNDOCwgMHg4M0VCLCAweDgzRTMsCi0gICAgMHg4M0JGLCAweDg0MDEsIDB4ODNERCwgMHg4M0U1LCAweDgzRDgsIDB4ODNGRiwgMHg4M0UxLCAweDgzQ0IsCi0gICAgMHg4M0NFLCAweDgzRDYsIDB4ODNGNSwgMHg4M0M5LCAweDg0MDksIDB4ODQwRiwgMHg4M0RFLCAweDg0MTEsCi0gICAgMHg4NDA2LCAweDgzQzIsIDB4ODNGMywgMHg4M0Q1LCAweDgzRkEsIDB4ODNDNywgMHg4M0QxLCAweDgzRUEsCi0gICAgMHg4NDEzLCAweDgzOUEsIDB4ODNDMywgMHg4M0VDLCAweDgzRUUsIDB4ODNDNCwgMHg4M0ZCLCAweDgzRDcsCi0gICAgMHg4M0UyLCAweDg0MUIsIDB4ODNEQiwgMHg4M0ZFLCAweDg2RDgsIDB4ODZFMiwgMHg4NkU2LCAweDg2RDMsCi0gICAgMHg4NkUzLCAweDg2REEsIDB4ODZFQSwgMHg4NkRELCAweDg2RUIsIDB4ODZEQywgMHg4NkVDLCAweDg2RTksCi0gICAgMHg4NkQ3LCAweDg2RTgsIDB4ODZEMSwgMHg4ODQ4LCAweDg4NTYsIDB4ODg1NSwgMHg4OEJBLCAweDg4RDcsCi0gICAgMHg4OEI5LCAweDg4QjgsIDB4ODhDMCwgMHg4OEJFLCAweDg4QjYsIDB4ODhCQywgMHg4OEI3LCAweDg4QkQsCi0gICAgMHg4OEIyLCAweDg5MDEsIDB4ODhDOSwgMHg4OTk1LCAweDg5OTgsIDB4ODk5NywgMHg4OURELCAweDg5REEsCi0gICAgMHg4OURCLCAweDhBNEUsIDB4OEE0RCwgMHg4QTM5LCAweDhBNTksIDB4OEE0MCwgMHg4QTU3LCAweDhBNTgsCi0gICAgMHg4QTQ0LCAweDhBNDUsIDB4OEE1MiwgMHg4QTQ4LCAweDhBNTEsIDB4OEE0QSwgMHg4QTRDLCAweDhBNEYsCi0gICAgMHg4QzVGLCAweDhDODEsIDB4OEM4MCwgMHg4Q0JBLCAweDhDQkUsIDB4OENCMCwgMHg4Q0I5LCAweDhDQjUsCi0gICAgMHg4RDg0LCAweDhEODAsIDB4OEQ4OSwgMHg4REQ4LCAweDhERDMsIDB4OERDRCwgMHg4REM3LCAweDhERDYsCi0gICAgMHg4RERDLCAweDhEQ0YsIDB4OERENSwgMHg4REQ5LCAweDhEQzgsIDB4OERENywgMHg4REM1LCAweDhFRUYsCi0gICAgMHg4RUY3LCAweDhFRkEsIDB4OEVGOSwgMHg4RUU2LCAweDhFRUUsIDB4OEVFNSwgMHg4RUY1LCAweDhFRTcsCi0gICAgMHg4RUU4LCAweDhFRjYsIDB4OEVFQiwgMHg4RUYxLCAweDhFRUMsIDB4OEVGNCwgMHg4RUU5LCAweDkwMkQsCi0gICAgMHg5MDM0LCAweDkwMkYsIDB4OTEwNiwgMHg5MTJDLCAweDkxMDQsIDB4OTBGRiwgMHg5MEZDLCAweDkxMDgsCi0gICAgMHg5MEY5LCAweDkwRkIsIDB4OTEwMSwgMHg5MTAwLCAweDkxMDcsIDB4OTEwNSwgMHg5MTAzLCAweDkxNjEsCi0gICAgMHg5MTY0LCAweDkxNUYsIDB4OTE2MiwgMHg5MTYwLCAweDkyMDEsIDB4OTIwQSwgMHg5MjI1LCAweDkyMDMsCi0gICAgMHg5MjFBLCAweDkyMjYsIDB4OTIwRiwgMHg5MjBDLCAweDkyMDAsIDB4OTIxMiwgMHg5MUZGLCAweDkxRkQsCi0gICAgMHg5MjA2LCAweDkyMDQsIDB4OTIyNywgMHg5MjAyLCAweDkyMUMsIDB4OTIyNCwgMHg5MjE5LCAweDkyMTcsCi0gICAgMHg5MjA1LCAweDkyMTYsIDB4OTU3QiwgMHg5NThELCAweDk1OEMsIDB4OTU5MCwgMHg5Njg3LCAweDk2N0UsCi0gICAgMHg5Njg4LCAweDk2ODksIDB4OTY4MywgMHg5NjgwLCAweDk2QzIsIDB4OTZDOCwgMHg5NkMzLCAweDk2RjEsCi0gICAgMHg5NkYwLCAweDk3NkMsIDB4OTc3MCwgMHg5NzZFLCAweDk4MDcsIDB4OThBOSwgMHg5OEVCLCAweDlDRTYsCi0gICAgMHg5RUY5LCAweDRFODMsIDB4NEU4NCwgMHg0RUI2LCAweDUwQkQsIDB4NTBCRiwgMHg1MEM2LCAweDUwQUUsCi0gICAgMHg1MEM0LCAweDUwQ0EsIDB4NTBCNCwgMHg1MEM4LCAweDUwQzIsIDB4NTBCMCwgMHg1MEMxLCAweDUwQkEsCi0gICAgMHg1MEIxLCAweDUwQ0IsIDB4NTBDOSwgMHg1MEI2LCAweDUwQjgsIDB4NTFENywgMHg1MjdBLCAweDUyNzgsCi0gICAgMHg1MjdCLCAweDUyN0MsIDB4NTVDMywgMHg1NURCLCAweDU1Q0MsIDB4NTVEMCwgMHg1NUNCLCAweDU1Q0EsCi0gICAgMHg1NURELCAweDU1QzAsIDB4NTVENCwgMHg1NUM0LCAweDU1RTksIDB4NTVCRiwgMHg1NUQyLCAweDU1OEQsCi0gICAgMHg1NUNGLCAweDU1RDUsIDB4NTVFMiwgMHg1NUQ2LCAweDU1QzgsIDB4NTVGMiwgMHg1NUNELCAweDU1RDksCi0gICAgMHg1NUMyLCAweDU3MTQsIDB4NTg1MywgMHg1ODY4LCAweDU4NjQsIDB4NTg0RiwgMHg1ODRELCAweDU4NDksCi0gICAgMHg1ODZGLCAweDU4NTUsIDB4NTg0RSwgMHg1ODVELCAweDU4NTksIDB4NTg2NSwgMHg1ODVCLCAweDU4M0QsCi0gICAgMHg1ODYzLCAweDU4NzEsIDB4NThGQywgMHg1QUM3LCAweDVBQzQsIDB4NUFDQiwgMHg1QUJBLCAweDVBQjgsCi0gICAgMHg1QUIxLCAweDVBQjUsIDB4NUFCMCwgMHg1QUJGLCAweDVBQzgsIDB4NUFCQiwgMHg1QUM2LCAweDVBQjcsCi0gICAgMHg1QUMwLCAweDVBQ0EsIDB4NUFCNCwgMHg1QUI2LCAweDVBQ0QsIDB4NUFCOSwgMHg1QTkwLCAweDVCRDYsCi0gICAgMHg1QkQ4LCAweDVCRDksIDB4NUMxRiwgMHg1QzMzLCAweDVENzEsIDB4NUQ2MywgMHg1RDRBLCAweDVENjUsCi0gICAgMHg1RDcyLCAweDVENkMsIDB4NUQ1RSwgMHg1RDY4LCAweDVENjcsIDB4NUQ2MiwgMHg1REYwLCAweDVFNEYsCi0gICAgMHg1RTRFLCAweDVFNEEsIDB4NUU0RCwgMHg1RTRCLCAweDVFQzUsIDB4NUVDQywgMHg1RUM2LCAweDVFQ0IsCi0gICAgMHg1RUM3LCAweDVGNDAsIDB4NUZBRiwgMHg1RkFELCAweDYwRjcsIDB4NjE0OSwgMHg2MTRBLCAweDYxMkIsCi0gICAgMHg2MTQ1LCAweDYxMzYsIDB4NjEzMiwgMHg2MTJFLCAweDYxNDYsIDB4NjEyRiwgMHg2MTRGLCAweDYxMjksCi0gICAgMHg2MTQwLCAweDYyMjAsIDB4OTE2OCwgMHg2MjIzLCAweDYyMjUsIDB4NjIyNCwgMHg2M0M1LCAweDYzRjEsCi0gICAgMHg2M0VCLCAweDY0MTAsIDB4NjQxMiwgMHg2NDA5LCAweDY0MjAsIDB4NjQyNCwgMHg2NDMzLCAweDY0NDMsCi0gICAgMHg2NDFGLCAweDY0MTUsIDB4NjQxOCwgMHg2NDM5LCAweDY0MzcsIDB4NjQyMiwgMHg2NDIzLCAweDY0MEMsCi0gICAgMHg2NDI2LCAweDY0MzAsIDB4NjQyOCwgMHg2NDQxLCAweDY0MzUsIDB4NjQyRiwgMHg2NDBBLCAweDY0MUEsCi0gICAgMHg2NDQwLCAweDY0MjUsIDB4NjQyNywgMHg2NDBCLCAweDYzRTcsIDB4NjQxQiwgMHg2NDJFLCAweDY0MjEsCi0gICAgMHg2NDBFLCAweDY1NkYsIDB4NjU5MiwgMHg2NUQzLCAweDY2ODYsIDB4NjY4QywgMHg2Njk1LCAweDY2OTAsCi0gICAgMHg2NjhCLCAweDY2OEEsIDB4NjY5OSwgMHg2Njk0LCAweDY2NzgsIDB4NjcyMCwgMHg2OTY2LCAweDY5NUYsCi0gICAgMHg2OTM4LCAweDY5NEUsIDB4Njk2MiwgMHg2OTcxLCAweDY5M0YsIDB4Njk0NSwgMHg2OTZBLCAweDY5MzksCi0gICAgMHg2OTQyLCAweDY5NTcsIDB4Njk1OSwgMHg2OTdBLCAweDY5NDgsIDB4Njk0OSwgMHg2OTM1LCAweDY5NkMsCi0gICAgMHg2OTMzLCAweDY5M0QsIDB4Njk2NSwgMHg2OEYwLCAweDY5NzgsIDB4NjkzNCwgMHg2OTY5LCAweDY5NDAsCi0gICAgMHg2OTZGLCAweDY5NDQsIDB4Njk3NiwgMHg2OTU4LCAweDY5NDEsIDB4Njk3NCwgMHg2OTRDLCAweDY5M0IsCi0gICAgMHg2OTRCLCAweDY5MzcsIDB4Njk1QywgMHg2OTRGLCAweDY5NTEsIDB4NjkzMiwgMHg2OTUyLCAweDY5MkYsCi0gICAgMHg2OTdCLCAweDY5M0MsIDB4NkI0NiwgMHg2QjQ1LCAweDZCNDMsIDB4NkI0MiwgMHg2QjQ4LCAweDZCNDEsCi0gICAgMHg2QjlCLCAweDZCRkIsIDB4NkJGQywgMHg2QkY5LCAweDZCRjcsIDB4NkJGOCwgMHg2RTlCLCAweDZFRDYsCi0gICAgMHg2RUM4LCAweDZFOEYsIDB4NkVDMCwgMHg2RTlGLCAweDZFOTMsIDB4NkU5NCwgMHg2RUEwLCAweDZFQjEsCi0gICAgMHg2RUI5LCAweDZFQzYsIDB4NkVEMiwgMHg2RUJELCAweDZFQzEsIDB4NkU5RSwgMHg2RUM5LCAweDZFQjcsCi0gICAgMHg2RUIwLCAweDZFQ0QsIDB4NkVBNiwgMHg2RUNGLCAweDZFQjIsIDB4NkVCRSwgMHg2RUMzLCAweDZFREMsCi0gICAgMHg2RUQ4LCAweDZFOTksIDB4NkU5MiwgMHg2RThFLCAweDZFOEQsIDB4NkVBNCwgMHg2RUExLCAweDZFQkYsCi0gICAgMHg2RUIzLCAweDZFRDAsIDB4NkVDQSwgMHg2RTk3LCAweDZFQUUsIDB4NkVBMywgMHg3MTQ3LCAweDcxNTQsCi0gICAgMHg3MTUyLCAweDcxNjMsIDB4NzE2MCwgMHg3MTQxLCAweDcxNUQsIDB4NzE2MiwgMHg3MTcyLCAweDcxNzgsCi0gICAgMHg3MTZBLCAweDcxNjEsIDB4NzE0MiwgMHg3MTU4LCAweDcxNDMsIDB4NzE0QiwgMHg3MTcwLCAweDcxNUYsCi0gICAgMHg3MTUwLCAweDcxNTMsIDB4NzE0NCwgMHg3MTRELCAweDcxNUEsIDB4NzI0RiwgMHg3MjhELCAweDcyOEMsCi0gICAgMHg3MjkxLCAweDcyOTAsIDB4NzI4RSwgMHg3MzNDLCAweDczNDIsIDB4NzMzQiwgMHg3MzNBLCAweDczNDAsCi0gICAgMHg3MzRBLCAweDczNDksIDB4NzQ0NCwgMHg3NDRBLCAweDc0NEIsIDB4NzQ1MiwgMHg3NDUxLCAweDc0NTcsCi0gICAgMHg3NDQwLCAweDc0NEYsIDB4NzQ1MCwgMHg3NDRFLCAweDc0NDIsIDB4NzQ0NiwgMHg3NDRELCAweDc0NTQsCi0gICAgMHg3NEUxLCAweDc0RkYsIDB4NzRGRSwgMHg3NEZELCAweDc1MUQsIDB4NzU3OSwgMHg3NTc3LCAweDY5ODMsCi0gICAgMHg3NUVGLCAweDc2MEYsIDB4NzYwMywgMHg3NUY3LCAweDc1RkUsIDB4NzVGQywgMHg3NUY5LCAweDc1RjgsCi0gICAgMHg3NjEwLCAweDc1RkIsIDB4NzVGNiwgMHg3NUVELCAweDc1RjUsIDB4NzVGRCwgMHg3Njk5LCAweDc2QjUsCi0gICAgMHg3NkRELCAweDc3NTUsIDB4Nzc1RiwgMHg3NzYwLCAweDc3NTIsIDB4Nzc1NiwgMHg3NzVBLCAweDc3NjksCi0gICAgMHg3NzY3LCAweDc3NTQsIDB4Nzc1OSwgMHg3NzZELCAweDc3RTAsIDB4Nzg4NywgMHg3ODlBLCAweDc4OTQsCi0gICAgMHg3ODhGLCAweDc4ODQsIDB4Nzg5NSwgMHg3ODg1LCAweDc4ODYsIDB4NzhBMSwgMHg3ODgzLCAweDc4NzksCi0gICAgMHg3ODk5LCAweDc4ODAsIDB4Nzg5NiwgMHg3ODdCLCAweDc5N0MsIDB4Nzk4MiwgMHg3OTdELCAweDc5NzksCi0gICAgMHg3QTExLCAweDdBMTgsIDB4N0ExOSwgMHg3QTEyLCAweDdBMTcsIDB4N0ExNSwgMHg3QTIyLCAweDdBMTMsCi0gICAgMHg3QTFCLCAweDdBMTAsIDB4N0FBMywgMHg3QUEyLCAweDdBOUUsIDB4N0FFQiwgMHg3QjY2LCAweDdCNjQsCi0gICAgMHg3QjZELCAweDdCNzQsIDB4N0I2OSwgMHg3QjcyLCAweDdCNjUsIDB4N0I3MywgMHg3QjcxLCAweDdCNzAsCi0gICAgMHg3QjYxLCAweDdCNzgsIDB4N0I3NiwgMHg3QjYzLCAweDdDQjIsIDB4N0NCNCwgMHg3Q0FGLCAweDdEODgsCi0gICAgMHg3RDg2LCAweDdEODAsIDB4N0Q4RCwgMHg3RDdGLCAweDdEODUsIDB4N0Q3QSwgMHg3RDhFLCAweDdEN0IsCi0gICAgMHg3RDgzLCAweDdEN0MsIDB4N0Q4QywgMHg3RDk0LCAweDdEODQsIDB4N0Q3RCwgMHg3RDkyLCAweDdGNkQsCi0gICAgMHg3RjZCLCAweDdGNjcsIDB4N0Y2OCwgMHg3RjZDLCAweDdGQTYsIDB4N0ZBNSwgMHg3RkE3LCAweDdGREIsCi0gICAgMHg3RkRDLCAweDgwMjEsIDB4ODE2NCwgMHg4MTYwLCAweDgxNzcsIDB4ODE1QywgMHg4MTY5LCAweDgxNUIsCi0gICAgMHg4MTYyLCAweDgxNzIsIDB4NjcyMSwgMHg4MTVFLCAweDgxNzYsIDB4ODE2NywgMHg4MTZGLCAweDgxNDQsCi0gICAgMHg4MTYxLCAweDgyMUQsIDB4ODI0OSwgMHg4MjQ0LCAweDgyNDAsIDB4ODI0MiwgMHg4MjQ1LCAweDg0RjEsCi0gICAgMHg4NDNGLCAweDg0NTYsIDB4ODQ3NiwgMHg4NDc5LCAweDg0OEYsIDB4ODQ4RCwgMHg4NDY1LCAweDg0NTEsCi0gICAgMHg4NDQwLCAweDg0ODYsIDB4ODQ2NywgMHg4NDMwLCAweDg0NEQsIDB4ODQ3RCwgMHg4NDVBLCAweDg0NTksCi0gICAgMHg4NDc0LCAweDg0NzMsIDB4ODQ1RCwgMHg4NTA3LCAweDg0NUUsIDB4ODQzNywgMHg4NDNBLCAweDg0MzQsCi0gICAgMHg4NDdBLCAweDg0NDMsIDB4ODQ3OCwgMHg4NDMyLCAweDg0NDUsIDB4ODQyOSwgMHg4M0Q5LCAweDg0NEIsCi0gICAgMHg4NDJGLCAweDg0NDIsIDB4ODQyRCwgMHg4NDVGLCAweDg0NzAsIDB4ODQzOSwgMHg4NDRFLCAweDg0NEMsCi0gICAgMHg4NDUyLCAweDg0NkYsIDB4ODRDNSwgMHg4NDhFLCAweDg0M0IsIDB4ODQ0NywgMHg4NDM2LCAweDg0MzMsCi0gICAgMHg4NDY4LCAweDg0N0UsIDB4ODQ0NCwgMHg4NDJCLCAweDg0NjAsIDB4ODQ1NCwgMHg4NDZFLCAweDg0NTAsCi0gICAgMHg4NzBCLCAweDg3MDQsIDB4ODZGNywgMHg4NzBDLCAweDg2RkEsIDB4ODZENiwgMHg4NkY1LCAweDg3NEQsCi0gICAgMHg4NkY4LCAweDg3MEUsIDB4ODcwOSwgMHg4NzAxLCAweDg2RjYsIDB4ODcwRCwgMHg4NzA1LCAweDg4RDYsCi0gICAgMHg4OENCLCAweDg4Q0QsIDB4ODhDRSwgMHg4OERFLCAweDg4REIsIDB4ODhEQSwgMHg4OENDLCAweDg4RDAsCi0gICAgMHg4OTg1LCAweDg5OUIsIDB4ODlERiwgMHg4OUU1LCAweDg5RTQsIDB4ODlFMSwgMHg4OUUwLCAweDg5RTIsCi0gICAgMHg4OURDLCAweDg5RTYsIDB4OEE3NiwgMHg4QTg2LCAweDhBN0YsIDB4OEE2MSwgMHg4QTNGLCAweDhBNzcsCi0gICAgMHg4QTgyLCAweDhBODQsIDB4OEE3NSwgMHg4QTgzLCAweDhBODEsIDB4OEE3NCwgMHg4QTdBLCAweDhDM0MsCi0gICAgMHg4QzRCLCAweDhDNEEsIDB4OEM2NSwgMHg4QzY0LCAweDhDNjYsIDB4OEM4NiwgMHg4Qzg0LCAweDhDODUsCi0gICAgMHg4Q0NDLCAweDhENjgsIDB4OEQ2OSwgMHg4RDkxLCAweDhEOEMsIDB4OEQ4RSwgMHg4RDhGLCAweDhEOEQsCi0gICAgMHg4RDkzLCAweDhEOTQsIDB4OEQ5MCwgMHg4RDkyLCAweDhERjAsIDB4OERFMCwgMHg4REVDLCAweDhERjEsCi0gICAgMHg4REVFLCAweDhERDAsIDB4OERFOSwgMHg4REUzLCAweDhERTIsIDB4OERFNywgMHg4REYyLCAweDhERUIsCi0gICAgMHg4REY0LCAweDhGMDYsIDB4OEVGRiwgMHg4RjAxLCAweDhGMDAsIDB4OEYwNSwgMHg4RjA3LCAweDhGMDgsCi0gICAgMHg4RjAyLCAweDhGMEIsIDB4OTA1MiwgMHg5MDNGLCAweDkwNDQsIDB4OTA0OSwgMHg5MDNELCAweDkxMTAsCi0gICAgMHg5MTBELCAweDkxMEYsIDB4OTExMSwgMHg5MTE2LCAweDkxMTQsIDB4OTEwQiwgMHg5MTBFLCAweDkxNkUsCi0gICAgMHg5MTZGLCAweDkyNDgsIDB4OTI1MiwgMHg5MjMwLCAweDkyM0EsIDB4OTI2NiwgMHg5MjMzLCAweDkyNjUsCi0gICAgMHg5MjVFLCAweDkyODMsIDB4OTIyRSwgMHg5MjRBLCAweDkyNDYsIDB4OTI2RCwgMHg5MjZDLCAweDkyNEYsCi0gICAgMHg5MjYwLCAweDkyNjcsIDB4OTI2RiwgMHg5MjM2LCAweDkyNjEsIDB4OTI3MCwgMHg5MjMxLCAweDkyNTQsCi0gICAgMHg5MjYzLCAweDkyNTAsIDB4OTI3MiwgMHg5MjRFLCAweDkyNTMsIDB4OTI0QywgMHg5MjU2LCAweDkyMzIsCi0gICAgMHg5NTlGLCAweDk1OUMsIDB4OTU5RSwgMHg5NTlCLCAweDk2OTIsIDB4OTY5MywgMHg5NjkxLCAweDk2OTcsCi0gICAgMHg5NkNFLCAweDk2RkEsIDB4OTZGRCwgMHg5NkY4LCAweDk2RjUsIDB4OTc3MywgMHg5Nzc3LCAweDk3NzgsCi0gICAgMHg5NzcyLCAweDk4MEYsIDB4OTgwRCwgMHg5ODBFLCAweDk4QUMsIDB4OThGNiwgMHg5OEY5LCAweDk5QUYsCi0gICAgMHg5OUIyLCAweDk5QjAsIDB4OTlCNSwgMHg5QUFELCAweDlBQUIsIDB4OUI1QiwgMHg5Q0VBLCAweDlDRUQsCi0gICAgMHg5Q0U3LCAweDlFODAsIDB4OUVGRCwgMHg1MEU2LCAweDUwRDQsIDB4NTBENywgMHg1MEU4LCAweDUwRjMsCi0gICAgMHg1MERCLCAweDUwRUEsIDB4NTBERCwgMHg1MEU0LCAweDUwRDMsIDB4NTBFQywgMHg1MEYwLCAweDUwRUYsCi0gICAgMHg1MEUzLCAweDUwRTAsIDB4NTFEOCwgMHg1MjgwLCAweDUyODEsIDB4NTJFOSwgMHg1MkVCLCAweDUzMzAsCi0gICAgMHg1M0FDLCAweDU2MjcsIDB4NTYxNSwgMHg1NjBDLCAweDU2MTIsIDB4NTVGQywgMHg1NjBGLCAweDU2MUMsCi0gICAgMHg1NjAxLCAweDU2MTMsIDB4NTYwMiwgMHg1NUZBLCAweDU2MUQsIDB4NTYwNCwgMHg1NUZGLCAweDU1RjksCi0gICAgMHg1ODg5LCAweDU4N0MsIDB4NTg5MCwgMHg1ODk4LCAweDU4ODYsIDB4NTg4MSwgMHg1ODdGLCAweDU4NzQsCi0gICAgMHg1ODhCLCAweDU4N0EsIDB4NTg4NywgMHg1ODkxLCAweDU4OEUsIDB4NTg3NiwgMHg1ODgyLCAweDU4ODgsCi0gICAgMHg1ODdCLCAweDU4OTQsIDB4NTg4RiwgMHg1OEZFLCAweDU5NkIsIDB4NUFEQywgMHg1QUVFLCAweDVBRTUsCi0gICAgMHg1QUQ1LCAweDVBRUEsIDB4NUFEQSwgMHg1QUVELCAweDVBRUIsIDB4NUFGMywgMHg1QUUyLCAweDVBRTAsCi0gICAgMHg1QURCLCAweDVBRUMsIDB4NUFERSwgMHg1QURELCAweDVBRDksIDB4NUFFOCwgMHg1QURGLCAweDVCNzcsCi0gICAgMHg1QkUwLCAweDVCRTMsIDB4NUM2MywgMHg1RDgyLCAweDVEODAsIDB4NUQ3RCwgMHg1RDg2LCAweDVEN0EsCi0gICAgMHg1RDgxLCAweDVENzcsIDB4NUQ4QSwgMHg1RDg5LCAweDVEODgsIDB4NUQ3RSwgMHg1RDdDLCAweDVEOEQsCi0gICAgMHg1RDc5LCAweDVEN0YsIDB4NUU1OCwgMHg1RTU5LCAweDVFNTMsIDB4NUVEOCwgMHg1RUQxLCAweDVFRDcsCi0gICAgMHg1RUNFLCAweDVFREMsIDB4NUVENSwgMHg1RUQ5LCAweDVFRDIsIDB4NUVENCwgMHg1RjQ0LCAweDVGNDMsCi0gICAgMHg1RjZGLCAweDVGQjYsIDB4NjEyQywgMHg2MTI4LCAweDYxNDEsIDB4NjE1RSwgMHg2MTcxLCAweDYxNzMsCi0gICAgMHg2MTUyLCAweDYxNTMsIDB4NjE3MiwgMHg2MTZDLCAweDYxODAsIDB4NjE3NCwgMHg2MTU0LCAweDYxN0EsCi0gICAgMHg2MTVCLCAweDYxNjUsIDB4NjEzQiwgMHg2MTZBLCAweDYxNjEsIDB4NjE1NiwgMHg2MjI5LCAweDYyMjcsCi0gICAgMHg2MjJCLCAweDY0MkIsIDB4NjQ0RCwgMHg2NDVCLCAweDY0NUQsIDB4NjQ3NCwgMHg2NDc2LCAweDY0NzIsCi0gICAgMHg2NDczLCAweDY0N0QsIDB4NjQ3NSwgMHg2NDY2LCAweDY0QTYsIDB4NjQ0RSwgMHg2NDgyLCAweDY0NUUsCi0gICAgMHg2NDVDLCAweDY0NEIsIDB4NjQ1MywgMHg2NDYwLCAweDY0NTAsIDB4NjQ3RiwgMHg2NDNGLCAweDY0NkMsCi0gICAgMHg2NDZCLCAweDY0NTksIDB4NjQ2NSwgMHg2NDc3LCAweDY1NzMsIDB4NjVBMCwgMHg2NkExLCAweDY2QTAsCi0gICAgMHg2NjlGLCAweDY3MDUsIDB4NjcwNCwgMHg2NzIyLCAweDY5QjEsIDB4NjlCNiwgMHg2OUM5LCAweDY5QTAsCi0gICAgMHg2OUNFLCAweDY5OTYsIDB4NjlCMCwgMHg2OUFDLCAweDY5QkMsIDB4Njk5MSwgMHg2OTk5LCAweDY5OEUsCi0gICAgMHg2OUE3LCAweDY5OEQsIDB4NjlBOSwgMHg2OUJFLCAweDY5QUYsIDB4NjlCRiwgMHg2OUM0LCAweDY5QkQsCi0gICAgMHg2OUE0LCAweDY5RDQsIDB4NjlCOSwgMHg2OUNBLCAweDY5OUEsIDB4NjlDRiwgMHg2OUIzLCAweDY5OTMsCi0gICAgMHg2OUFBLCAweDY5QTEsIDB4Njk5RSwgMHg2OUQ5LCAweDY5OTcsIDB4Njk5MCwgMHg2OUMyLCAweDY5QjUsCi0gICAgMHg2OUE1LCAweDY5QzYsIDB4NkI0QSwgMHg2QjRELCAweDZCNEIsIDB4NkI5RSwgMHg2QjlGLCAweDZCQTAsCi0gICAgMHg2QkMzLCAweDZCQzQsIDB4NkJGRSwgMHg2RUNFLCAweDZFRjUsIDB4NkVGMSwgMHg2RjAzLCAweDZGMjUsCi0gICAgMHg2RUY4LCAweDZGMzcsIDB4NkVGQiwgMHg2RjJFLCAweDZGMDksIDB4NkY0RSwgMHg2RjE5LCAweDZGMUEsCi0gICAgMHg2RjI3LCAweDZGMTgsIDB4NkYzQiwgMHg2RjEyLCAweDZFRUQsIDB4NkYwQSwgMHg2RjM2LCAweDZGNzMsCi0gICAgMHg2RUY5LCAweDZFRUUsIDB4NkYyRCwgMHg2RjQwLCAweDZGMzAsIDB4NkYzQywgMHg2RjM1LCAweDZFRUIsCi0gICAgMHg2RjA3LCAweDZGMEUsIDB4NkY0MywgMHg2RjA1LCAweDZFRkQsIDB4NkVGNiwgMHg2RjM5LCAweDZGMUMsCi0gICAgMHg2RUZDLCAweDZGM0EsIDB4NkYxRiwgMHg2RjBELCAweDZGMUUsIDB4NkYwOCwgMHg2RjIxLCAweDcxODcsCi0gICAgMHg3MTkwLCAweDcxODksIDB4NzE4MCwgMHg3MTg1LCAweDcxODIsIDB4NzE4RiwgMHg3MTdCLCAweDcxODYsCi0gICAgMHg3MTgxLCAweDcxOTcsIDB4NzI0NCwgMHg3MjUzLCAweDcyOTcsIDB4NzI5NSwgMHg3MjkzLCAweDczNDMsCi0gICAgMHg3MzRELCAweDczNTEsIDB4NzM0QywgMHg3NDYyLCAweDc0NzMsIDB4NzQ3MSwgMHg3NDc1LCAweDc0NzIsCi0gICAgMHg3NDY3LCAweDc0NkUsIDB4NzUwMCwgMHg3NTAyLCAweDc1MDMsIDB4NzU3RCwgMHg3NTkwLCAweDc2MTYsCi0gICAgMHg3NjA4LCAweDc2MEMsIDB4NzYxNSwgMHg3NjExLCAweDc2MEEsIDB4NzYxNCwgMHg3NkI4LCAweDc3ODEsCi0gICAgMHg3NzdDLCAweDc3ODUsIDB4Nzc4MiwgMHg3NzZFLCAweDc3ODAsIDB4Nzc2RiwgMHg3NzdFLCAweDc3ODMsCi0gICAgMHg3OEIyLCAweDc4QUEsIDB4NzhCNCwgMHg3OEFELCAweDc4QTgsIDB4Nzg3RSwgMHg3OEFCLCAweDc4OUUsCi0gICAgMHg3OEE1LCAweDc4QTAsIDB4NzhBQywgMHg3OEEyLCAweDc4QTQsIDB4Nzk5OCwgMHg3OThBLCAweDc5OEIsCi0gICAgMHg3OTk2LCAweDc5OTUsIDB4Nzk5NCwgMHg3OTkzLCAweDc5OTcsIDB4Nzk4OCwgMHg3OTkyLCAweDc5OTAsCi0gICAgMHg3QTJCLCAweDdBNEEsIDB4N0EzMCwgMHg3QTJGLCAweDdBMjgsIDB4N0EyNiwgMHg3QUE4LCAweDdBQUIsCi0gICAgMHg3QUFDLCAweDdBRUUsIDB4N0I4OCwgMHg3QjlDLCAweDdCOEEsIDB4N0I5MSwgMHg3QjkwLCAweDdCOTYsCi0gICAgMHg3QjhELCAweDdCOEMsIDB4N0I5QiwgMHg3QjhFLCAweDdCODUsIDB4N0I5OCwgMHg1Mjg0LCAweDdCOTksCi0gICAgMHg3QkE0LCAweDdCODIsIDB4N0NCQiwgMHg3Q0JGLCAweDdDQkMsIDB4N0NCQSwgMHg3REE3LCAweDdEQjcsCi0gICAgMHg3REMyLCAweDdEQTMsIDB4N0RBQSwgMHg3REMxLCAweDdEQzAsIDB4N0RDNSwgMHg3RDlELCAweDdEQ0UsCi0gICAgMHg3REM0LCAweDdEQzYsIDB4N0RDQiwgMHg3RENDLCAweDdEQUYsIDB4N0RCOSwgMHg3RDk2LCAweDdEQkMsCi0gICAgMHg3RDlGLCAweDdEQTYsIDB4N0RBRSwgMHg3REE5LCAweDdEQTEsIDB4N0RDOSwgMHg3RjczLCAweDdGRTIsCi0gICAgMHg3RkUzLCAweDdGRTUsIDB4N0ZERSwgMHg4MDI0LCAweDgwNUQsIDB4ODA1QywgMHg4MTg5LCAweDgxODYsCi0gICAgMHg4MTgzLCAweDgxODcsIDB4ODE4RCwgMHg4MThDLCAweDgxOEIsIDB4ODIxNSwgMHg4NDk3LCAweDg0QTQsCi0gICAgMHg4NEExLCAweDg0OUYsIDB4ODRCQSwgMHg4NENFLCAweDg0QzIsIDB4ODRBQywgMHg4NEFFLCAweDg0QUIsCi0gICAgMHg4NEI5LCAweDg0QjQsIDB4ODRDMSwgMHg4NENELCAweDg0QUEsIDB4ODQ5QSwgMHg4NEIxLCAweDg0RDAsCi0gICAgMHg4NDlELCAweDg0QTcsIDB4ODRCQiwgMHg4NEEyLCAweDg0OTQsIDB4ODRDNywgMHg4NENDLCAweDg0OUIsCi0gICAgMHg4NEE5LCAweDg0QUYsIDB4ODRBOCwgMHg4NEQ2LCAweDg0OTgsIDB4ODRCNiwgMHg4NENGLCAweDg0QTAsCi0gICAgMHg4NEQ3LCAweDg0RDQsIDB4ODREMiwgMHg4NERCLCAweDg0QjAsIDB4ODQ5MSwgMHg4NjYxLCAweDg3MzMsCi0gICAgMHg4NzIzLCAweDg3MjgsIDB4ODc2QiwgMHg4NzQwLCAweDg3MkUsIDB4ODcxRSwgMHg4NzIxLCAweDg3MTksCi0gICAgMHg4NzFCLCAweDg3NDMsIDB4ODcyQywgMHg4NzQxLCAweDg3M0UsIDB4ODc0NiwgMHg4NzIwLCAweDg3MzIsCi0gICAgMHg4NzJBLCAweDg3MkQsIDB4ODczQywgMHg4NzEyLCAweDg3M0EsIDB4ODczMSwgMHg4NzM1LCAweDg3NDIsCi0gICAgMHg4NzI2LCAweDg3MjcsIDB4ODczOCwgMHg4NzI0LCAweDg3MUEsIDB4ODczMCwgMHg4NzExLCAweDg4RjcsCi0gICAgMHg4OEU3LCAweDg4RjEsIDB4ODhGMiwgMHg4OEZBLCAweDg4RkUsIDB4ODhFRSwgMHg4OEZDLCAweDg4RjYsCi0gICAgMHg4OEZCLCAweDg4RjAsIDB4ODhFQywgMHg4OEVCLCAweDg5OUQsIDB4ODlBMSwgMHg4OTlGLCAweDg5OUUsCi0gICAgMHg4OUU5LCAweDg5RUIsIDB4ODlFOCwgMHg4QUFCLCAweDhBOTksIDB4OEE4QiwgMHg4QTkyLCAweDhBOEYsCi0gICAgMHg4QTk2LCAweDhDM0QsIDB4OEM2OCwgMHg4QzY5LCAweDhDRDUsIDB4OENDRiwgMHg4Q0Q3LCAweDhEOTYsCi0gICAgMHg4RTA5LCAweDhFMDIsIDB4OERGRiwgMHg4RTBELCAweDhERkQsIDB4OEUwQSwgMHg4RTAzLCAweDhFMDcsCi0gICAgMHg4RTA2LCAweDhFMDUsIDB4OERGRSwgMHg4RTAwLCAweDhFMDQsIDB4OEYxMCwgMHg4RjExLCAweDhGMEUsCi0gICAgMHg4RjBELCAweDkxMjMsIDB4OTExQywgMHg5MTIwLCAweDkxMjIsIDB4OTExRiwgMHg5MTFELCAweDkxMUEsCi0gICAgMHg5MTI0LCAweDkxMjEsIDB4OTExQiwgMHg5MTdBLCAweDkxNzIsIDB4OTE3OSwgMHg5MTczLCAweDkyQTUsCi0gICAgMHg5MkE0LCAweDkyNzYsIDB4OTI5QiwgMHg5MjdBLCAweDkyQTAsIDB4OTI5NCwgMHg5MkFBLCAweDkyOEQsCi0gICAgMHg5MkE2LCAweDkyOUEsIDB4OTJBQiwgMHg5Mjc5LCAweDkyOTcsIDB4OTI3RiwgMHg5MkEzLCAweDkyRUUsCi0gICAgMHg5MjhFLCAweDkyODIsIDB4OTI5NSwgMHg5MkEyLCAweDkyN0QsIDB4OTI4OCwgMHg5MkExLCAweDkyOEEsCi0gICAgMHg5Mjg2LCAweDkyOEMsIDB4OTI5OSwgMHg5MkE3LCAweDkyN0UsIDB4OTI4NywgMHg5MkE5LCAweDkyOUQsCi0gICAgMHg5MjhCLCAweDkyMkQsIDB4OTY5RSwgMHg5NkExLCAweDk2RkYsIDB4OTc1OCwgMHg5NzdELCAweDk3N0EsCi0gICAgMHg5NzdFLCAweDk3ODMsIDB4OTc4MCwgMHg5NzgyLCAweDk3N0IsIDB4OTc4NCwgMHg5NzgxLCAweDk3N0YsCi0gICAgMHg5N0NFLCAweDk3Q0QsIDB4OTgxNiwgMHg5OEFELCAweDk4QUUsIDB4OTkwMiwgMHg5OTAwLCAweDk5MDcsCi0gICAgMHg5OTlELCAweDk5OUMsIDB4OTlDMywgMHg5OUI5LCAweDk5QkIsIDB4OTlCQSwgMHg5OUMyLCAweDk5QkQsCi0gICAgMHg5OUM3LCAweDlBQjEsIDB4OUFFMywgMHg5QUU3LCAweDlCM0UsIDB4OUIzRiwgMHg5QjYwLCAweDlCNjEsCi0gICAgMHg5QjVGLCAweDlDRjEsIDB4OUNGMiwgMHg5Q0Y1LCAweDlFQTcsIDB4NTBGRiwgMHg1MTAzLCAweDUxMzAsCi0gICAgMHg1MEY4LCAweDUxMDYsIDB4NTEwNywgMHg1MEY2LCAweDUwRkUsIDB4NTEwQiwgMHg1MTBDLCAweDUwRkQsCi0gICAgMHg1MTBBLCAweDUyOEIsIDB4NTI4QywgMHg1MkYxLCAweDUyRUYsIDB4NTY0OCwgMHg1NjQyLCAweDU2NEMsCi0gICAgMHg1NjM1LCAweDU2NDEsIDB4NTY0QSwgMHg1NjQ5LCAweDU2NDYsIDB4NTY1OCwgMHg1NjVBLCAweDU2NDAsCi0gICAgMHg1NjMzLCAweDU2M0QsIDB4NTYyQywgMHg1NjNFLCAweDU2MzgsIDB4NTYyQSwgMHg1NjNBLCAweDU3MUEsCi0gICAgMHg1OEFCLCAweDU4OUQsIDB4NThCMSwgMHg1OEEwLCAweDU4QTMsIDB4NThBRiwgMHg1OEFDLCAweDU4QTUsCi0gICAgMHg1OEExLCAweDU4RkYsIDB4NUFGRiwgMHg1QUY0LCAweDVBRkQsIDB4NUFGNywgMHg1QUY2LCAweDVCMDMsCi0gICAgMHg1QUY4LCAweDVCMDIsIDB4NUFGOSwgMHg1QjAxLCAweDVCMDcsIDB4NUIwNSwgMHg1QjBGLCAweDVDNjcsCi0gICAgMHg1RDk5LCAweDVEOTcsIDB4NUQ5RiwgMHg1RDkyLCAweDVEQTIsIDB4NUQ5MywgMHg1RDk1LCAweDVEQTAsCi0gICAgMHg1RDlDLCAweDVEQTEsIDB4NUQ5QSwgMHg1RDlFLCAweDVFNjksIDB4NUU1RCwgMHg1RTYwLCAweDVFNUMsCi0gICAgMHg3REYzLCAweDVFREIsIDB4NUVERSwgMHg1RUUxLCAweDVGNDksIDB4NUZCMiwgMHg2MThCLCAweDYxODMsCi0gICAgMHg2MTc5LCAweDYxQjEsIDB4NjFCMCwgMHg2MUEyLCAweDYxODksIDB4NjE5QiwgMHg2MTkzLCAweDYxQUYsCi0gICAgMHg2MUFELCAweDYxOUYsIDB4NjE5MiwgMHg2MUFBLCAweDYxQTEsIDB4NjE4RCwgMHg2MTY2LCAweDYxQjMsCi0gICAgMHg2MjJELCAweDY0NkUsIDB4NjQ3MCwgMHg2NDk2LCAweDY0QTAsIDB4NjQ4NSwgMHg2NDk3LCAweDY0OUMsCi0gICAgMHg2NDhGLCAweDY0OEIsIDB4NjQ4QSwgMHg2NDhDLCAweDY0QTMsIDB4NjQ5RiwgMHg2NDY4LCAweDY0QjEsCi0gICAgMHg2NDk4LCAweDY1NzYsIDB4NjU3QSwgMHg2NTc5LCAweDY1N0IsIDB4NjVCMiwgMHg2NUIzLCAweDY2QjUsCi0gICAgMHg2NkIwLCAweDY2QTksIDB4NjZCMiwgMHg2NkI3LCAweDY2QUEsIDB4NjZBRiwgMHg2QTAwLCAweDZBMDYsCi0gICAgMHg2QTE3LCAweDY5RTUsIDB4NjlGOCwgMHg2QTE1LCAweDY5RjEsIDB4NjlFNCwgMHg2QTIwLCAweDY5RkYsCi0gICAgMHg2OUVDLCAweDY5RTIsIDB4NkExQiwgMHg2QTFELCAweDY5RkUsIDB4NkEyNywgMHg2OUYyLCAweDY5RUUsCi0gICAgMHg2QTE0LCAweDY5RjcsIDB4NjlFNywgMHg2QTQwLCAweDZBMDgsIDB4NjlFNiwgMHg2OUZCLCAweDZBMEQsCi0gICAgMHg2OUZDLCAweDY5RUIsIDB4NkEwOSwgMHg2QTA0LCAweDZBMTgsIDB4NkEyNSwgMHg2QTBGLCAweDY5RjYsCi0gICAgMHg2QTI2LCAweDZBMDcsIDB4NjlGNCwgMHg2QTE2LCAweDZCNTEsIDB4NkJBNSwgMHg2QkEzLCAweDZCQTIsCi0gICAgMHg2QkE2LCAweDZDMDEsIDB4NkMwMCwgMHg2QkZGLCAweDZDMDIsIDB4NkY0MSwgMHg2RjI2LCAweDZGN0UsCi0gICAgMHg2Rjg3LCAweDZGQzYsIDB4NkY5MiwgMHg2RjhELCAweDZGODksIDB4NkY4QywgMHg2RjYyLCAweDZGNEYsCi0gICAgMHg2Rjg1LCAweDZGNUEsIDB4NkY5NiwgMHg2Rjc2LCAweDZGNkMsIDB4NkY4MiwgMHg2RjU1LCAweDZGNzIsCi0gICAgMHg2RjUyLCAweDZGNTAsIDB4NkY1NywgMHg2Rjk0LCAweDZGOTMsIDB4NkY1RCwgMHg2RjAwLCAweDZGNjEsCi0gICAgMHg2RjZCLCAweDZGN0QsIDB4NkY2NywgMHg2RjkwLCAweDZGNTMsIDB4NkY4QiwgMHg2RjY5LCAweDZGN0YsCi0gICAgMHg2Rjk1LCAweDZGNjMsIDB4NkY3NywgMHg2RjZBLCAweDZGN0IsIDB4NzFCMiwgMHg3MUFGLCAweDcxOUIsCi0gICAgMHg3MUIwLCAweDcxQTAsIDB4NzE5QSwgMHg3MUE5LCAweDcxQjUsIDB4NzE5RCwgMHg3MUE1LCAweDcxOUUsCi0gICAgMHg3MUE0LCAweDcxQTEsIDB4NzFBQSwgMHg3MTlDLCAweDcxQTcsIDB4NzFCMywgMHg3Mjk4LCAweDcyOUEsCi0gICAgMHg3MzU4LCAweDczNTIsIDB4NzM1RSwgMHg3MzVGLCAweDczNjAsIDB4NzM1RCwgMHg3MzVCLCAweDczNjEsCi0gICAgMHg3MzVBLCAweDczNTksIDB4NzM2MiwgMHg3NDg3LCAweDc0ODksIDB4NzQ4QSwgMHg3NDg2LCAweDc0ODEsCi0gICAgMHg3NDdELCAweDc0ODUsIDB4NzQ4OCwgMHg3NDdDLCAweDc0NzksIDB4NzUwOCwgMHg3NTA3LCAweDc1N0UsCi0gICAgMHg3NjI1LCAweDc2MUUsIDB4NzYxOSwgMHg3NjFELCAweDc2MUMsIDB4NzYyMywgMHg3NjFBLCAweDc2MjgsCi0gICAgMHg3NjFCLCAweDc2OUMsIDB4NzY5RCwgMHg3NjlFLCAweDc2OUIsIDB4Nzc4RCwgMHg3NzhGLCAweDc3ODksCi0gICAgMHg3Nzg4LCAweDc4Q0QsIDB4NzhCQiwgMHg3OENGLCAweDc4Q0MsIDB4NzhEMSwgMHg3OENFLCAweDc4RDQsCi0gICAgMHg3OEM4LCAweDc4QzMsIDB4NzhDNCwgMHg3OEM5LCAweDc5OUEsIDB4NzlBMSwgMHg3OUEwLCAweDc5OUMsCi0gICAgMHg3OUEyLCAweDc5OUIsIDB4NkI3NiwgMHg3QTM5LCAweDdBQjIsIDB4N0FCNCwgMHg3QUIzLCAweDdCQjcsCi0gICAgMHg3QkNCLCAweDdCQkUsIDB4N0JBQywgMHg3QkNFLCAweDdCQUYsIDB4N0JCOSwgMHg3QkNBLCAweDdCQjUsCi0gICAgMHg3Q0M1LCAweDdDQzgsIDB4N0NDQywgMHg3Q0NCLCAweDdERjcsIDB4N0REQiwgMHg3REVBLCAweDdERTcsCi0gICAgMHg3REQ3LCAweDdERTEsIDB4N0UwMywgMHg3REZBLCAweDdERTYsIDB4N0RGNiwgMHg3REYxLCAweDdERjAsCi0gICAgMHg3REVFLCAweDdEREYsIDB4N0Y3NiwgMHg3RkFDLCAweDdGQjAsIDB4N0ZBRCwgMHg3RkVELCAweDdGRUIsCi0gICAgMHg3RkVBLCAweDdGRUMsIDB4N0ZFNiwgMHg3RkU4LCAweDgwNjQsIDB4ODA2NywgMHg4MUEzLCAweDgxOUYsCi0gICAgMHg4MTlFLCAweDgxOTUsIDB4ODFBMiwgMHg4MTk5LCAweDgxOTcsIDB4ODIxNiwgMHg4MjRGLCAweDgyNTMsCi0gICAgMHg4MjUyLCAweDgyNTAsIDB4ODI0RSwgMHg4MjUxLCAweDg1MjQsIDB4ODUzQiwgMHg4NTBGLCAweDg1MDAsCi0gICAgMHg4NTI5LCAweDg1MEUsIDB4ODUwOSwgMHg4NTBELCAweDg1MUYsIDB4ODUwQSwgMHg4NTI3LCAweDg1MUMsCi0gICAgMHg4NEZCLCAweDg1MkIsIDB4ODRGQSwgMHg4NTA4LCAweDg1MEMsIDB4ODRGNCwgMHg4NTJBLCAweDg0RjIsCi0gICAgMHg4NTE1LCAweDg0RjcsIDB4ODRFQiwgMHg4NEYzLCAweDg0RkMsIDB4ODUxMiwgMHg4NEVBLCAweDg0RTksCi0gICAgMHg4NTE2LCAweDg0RkUsIDB4ODUyOCwgMHg4NTFELCAweDg1MkUsIDB4ODUwMiwgMHg4NEZELCAweDg1MUUsCi0gICAgMHg4NEY2LCAweDg1MzEsIDB4ODUyNiwgMHg4NEU3LCAweDg0RTgsIDB4ODRGMCwgMHg4NEVGLCAweDg0RjksCi0gICAgMHg4NTE4LCAweDg1MjAsIDB4ODUzMCwgMHg4NTBCLCAweDg1MTksIDB4ODUyRiwgMHg4NjYyLCAweDg3NTYsCi0gICAgMHg4NzYzLCAweDg3NjQsIDB4ODc3NywgMHg4N0UxLCAweDg3NzMsIDB4ODc1OCwgMHg4NzU0LCAweDg3NUIsCi0gICAgMHg4NzUyLCAweDg3NjEsIDB4ODc1QSwgMHg4NzUxLCAweDg3NUUsIDB4ODc2RCwgMHg4NzZBLCAweDg3NTAsCi0gICAgMHg4NzRFLCAweDg3NUYsIDB4ODc1RCwgMHg4NzZGLCAweDg3NkMsIDB4ODc3QSwgMHg4NzZFLCAweDg3NUMsCi0gICAgMHg4NzY1LCAweDg3NEYsIDB4ODc3QiwgMHg4Nzc1LCAweDg3NjIsIDB4ODc2NywgMHg4NzY5LCAweDg4NUEsCi0gICAgMHg4OTA1LCAweDg5MEMsIDB4ODkxNCwgMHg4OTBCLCAweDg5MTcsIDB4ODkxOCwgMHg4OTE5LCAweDg5MDYsCi0gICAgMHg4OTE2LCAweDg5MTEsIDB4ODkwRSwgMHg4OTA5LCAweDg5QTIsIDB4ODlBNCwgMHg4OUEzLCAweDg5RUQsCi0gICAgMHg4OUYwLCAweDg5RUMsIDB4OEFDRiwgMHg4QUM2LCAweDhBQjgsIDB4OEFEMywgMHg4QUQxLCAweDhBRDQsCi0gICAgMHg4QUQ1LCAweDhBQkIsIDB4OEFENywgMHg4QUJFLCAweDhBQzAsIDB4OEFDNSwgMHg4QUQ4LCAweDhBQzMsCi0gICAgMHg4QUJBLCAweDhBQkQsIDB4OEFEOSwgMHg4QzNFLCAweDhDNEQsIDB4OEM4RiwgMHg4Q0U1LCAweDhDREYsCi0gICAgMHg4Q0Q5LCAweDhDRTgsIDB4OENEQSwgMHg4Q0RELCAweDhDRTcsIDB4OERBMCwgMHg4RDlDLCAweDhEQTEsCi0gICAgMHg4RDlCLCAweDhFMjAsIDB4OEUyMywgMHg4RTI1LCAweDhFMjQsIDB4OEUyRSwgMHg4RTE1LCAweDhFMUIsCi0gICAgMHg4RTE2LCAweDhFMTEsIDB4OEUxOSwgMHg4RTI2LCAweDhFMjcsIDB4OEUxNCwgMHg4RTEyLCAweDhFMTgsCi0gICAgMHg4RTEzLCAweDhFMUMsIDB4OEUxNywgMHg4RTFBLCAweDhGMkMsIDB4OEYyNCwgMHg4RjE4LCAweDhGMUEsCi0gICAgMHg4RjIwLCAweDhGMjMsIDB4OEYxNiwgMHg4RjE3LCAweDkwNzMsIDB4OTA3MCwgMHg5MDZGLCAweDkwNjcsCi0gICAgMHg5MDZCLCAweDkxMkYsIDB4OTEyQiwgMHg5MTI5LCAweDkxMkEsIDB4OTEzMiwgMHg5MTI2LCAweDkxMkUsCi0gICAgMHg5MTg1LCAweDkxODYsIDB4OTE4QSwgMHg5MTgxLCAweDkxODIsIDB4OTE4NCwgMHg5MTgwLCAweDkyRDAsCi0gICAgMHg5MkMzLCAweDkyQzQsIDB4OTJDMCwgMHg5MkQ5LCAweDkyQjYsIDB4OTJDRiwgMHg5MkYxLCAweDkyREYsCi0gICAgMHg5MkQ4LCAweDkyRTksIDB4OTJENywgMHg5MkRELCAweDkyQ0MsIDB4OTJFRiwgMHg5MkMyLCAweDkyRTgsCi0gICAgMHg5MkNBLCAweDkyQzgsIDB4OTJDRSwgMHg5MkU2LCAweDkyQ0QsIDB4OTJENSwgMHg5MkM5LCAweDkyRTAsCi0gICAgMHg5MkRFLCAweDkyRTcsIDB4OTJEMSwgMHg5MkQzLCAweDkyQjUsIDB4OTJFMSwgMHg5MzI1LCAweDkyQzYsCi0gICAgMHg5MkI0LCAweDk1N0MsIDB4OTVBQywgMHg5NUFCLCAweDk1QUUsIDB4OTVCMCwgMHg5NkE0LCAweDk2QTIsCi0gICAgMHg5NkQzLCAweDk3MDUsIDB4OTcwOCwgMHg5NzAyLCAweDk3NUEsIDB4OTc4QSwgMHg5NzhFLCAweDk3ODgsCi0gICAgMHg5N0QwLCAweDk3Q0YsIDB4OTgxRSwgMHg5ODFELCAweDk4MjYsIDB4OTgyOSwgMHg5ODI4LCAweDk4MjAsCi0gICAgMHg5ODFCLCAweDk4MjcsIDB4OThCMiwgMHg5OTA4LCAweDk4RkEsIDB4OTkxMSwgMHg5OTE0LCAweDk5MTYsCi0gICAgMHg5OTE3LCAweDk5MTUsIDB4OTlEQywgMHg5OUNELCAweDk5Q0YsIDB4OTlEMywgMHg5OUQ0LCAweDk5Q0UsCi0gICAgMHg5OUM5LCAweDk5RDYsIDB4OTlEOCwgMHg5OUNCLCAweDk5RDcsIDB4OTlDQywgMHg5QUIzLCAweDlBRUMsCi0gICAgMHg5QUVCLCAweDlBRjMsIDB4OUFGMiwgMHg5QUYxLCAweDlCNDYsIDB4OUI0MywgMHg5QjY3LCAweDlCNzQsCi0gICAgMHg5QjcxLCAweDlCNjYsIDB4OUI3NiwgMHg5Qjc1LCAweDlCNzAsIDB4OUI2OCwgMHg5QjY0LCAweDlCNkMsCi0gICAgMHg5Q0ZDLCAweDlDRkEsIDB4OUNGRCwgMHg5Q0ZGLCAweDlDRjcsIDB4OUQwNywgMHg5RDAwLCAweDlDRjksCi0gICAgMHg5Q0ZCLCAweDlEMDgsIDB4OUQwNSwgMHg5RDA0LCAweDlFODMsIDB4OUVEMywgMHg5RjBGLCAweDlGMTAsCi0gICAgMHg1MTFDLCAweDUxMTMsIDB4NTExNywgMHg1MTFBLCAweDUxMTEsIDB4NTFERSwgMHg1MzM0LCAweDUzRTEsCi0gICAgMHg1NjcwLCAweDU2NjAsIDB4NTY2RSwgMHg1NjczLCAweDU2NjYsIDB4NTY2MywgMHg1NjZELCAweDU2NzIsCi0gICAgMHg1NjVFLCAweDU2NzcsIDB4NTcxQywgMHg1NzFCLCAweDU4QzgsIDB4NThCRCwgMHg1OEM5LCAweDU4QkYsCi0gICAgMHg1OEJBLCAweDU4QzIsIDB4NThCQywgMHg1OEM2LCAweDVCMTcsIDB4NUIxOSwgMHg1QjFCLCAweDVCMjEsCi0gICAgMHg1QjE0LCAweDVCMTMsIDB4NUIxMCwgMHg1QjE2LCAweDVCMjgsIDB4NUIxQSwgMHg1QjIwLCAweDVCMUUsCi0gICAgMHg1QkVGLCAweDVEQUMsIDB4NURCMSwgMHg1REE5LCAweDVEQTcsIDB4NURCNSwgMHg1REIwLCAweDVEQUUsCi0gICAgMHg1REFBLCAweDVEQTgsIDB4NURCMiwgMHg1REFELCAweDVEQUYsIDB4NURCNCwgMHg1RTY3LCAweDVFNjgsCi0gICAgMHg1RTY2LCAweDVFNkYsIDB4NUVFOSwgMHg1RUU3LCAweDVFRTYsIDB4NUVFOCwgMHg1RUU1LCAweDVGNEIsCi0gICAgMHg1RkJDLCAweDVGQkIsIDB4NjE5RCwgMHg2MUE4LCAweDYxOTYsIDB4NjFDNSwgMHg2MUI0LCAweDYxQzYsCi0gICAgMHg2MUMxLCAweDYxQ0MsIDB4NjFCQSwgMHg2MUJGLCAweDYxQjgsIDB4NjE4QywgMHg2NEQ3LCAweDY0RDYsCi0gICAgMHg2NEQwLCAweDY0Q0YsIDB4NjRDOSwgMHg2NEJELCAweDY0ODksIDB4NjRDMywgMHg2NERCLCAweDY0RjMsCi0gICAgMHg2NEQ5LCAweDY1MzMsIDB4NjU3RiwgMHg2NTdDLCAweDY1QTIsIDB4NjZDOCwgMHg2NkJFLCAweDY2QzAsCi0gICAgMHg2NkNBLCAweDY2Q0IsIDB4NjZDRiwgMHg2NkJELCAweDY2QkIsIDB4NjZCQSwgMHg2NkNDLCAweDY3MjMsCi0gICAgMHg2QTM0LCAweDZBNjYsIDB4NkE0OSwgMHg2QTY3LCAweDZBMzIsIDB4NkE2OCwgMHg2QTNFLCAweDZBNUQsCi0gICAgMHg2QTZELCAweDZBNzYsIDB4NkE1QiwgMHg2QTUxLCAweDZBMjgsIDB4NkE1QSwgMHg2QTNCLCAweDZBM0YsCi0gICAgMHg2QTQxLCAweDZBNkEsIDB4NkE2NCwgMHg2QTUwLCAweDZBNEYsIDB4NkE1NCwgMHg2QTZGLCAweDZBNjksCi0gICAgMHg2QTYwLCAweDZBM0MsIDB4NkE1RSwgMHg2QTU2LCAweDZBNTUsIDB4NkE0RCwgMHg2QTRFLCAweDZBNDYsCi0gICAgMHg2QjU1LCAweDZCNTQsIDB4NkI1NiwgMHg2QkE3LCAweDZCQUEsIDB4NkJBQiwgMHg2QkM4LCAweDZCQzcsCi0gICAgMHg2QzA0LCAweDZDMDMsIDB4NkMwNiwgMHg2RkFELCAweDZGQ0IsIDB4NkZBMywgMHg2RkM3LCAweDZGQkMsCi0gICAgMHg2RkNFLCAweDZGQzgsIDB4NkY1RSwgMHg2RkM0LCAweDZGQkQsIDB4NkY5RSwgMHg2RkNBLCAweDZGQTgsCi0gICAgMHg3MDA0LCAweDZGQTUsIDB4NkZBRSwgMHg2RkJBLCAweDZGQUMsIDB4NkZBQSwgMHg2RkNGLCAweDZGQkYsCi0gICAgMHg2RkI4LCAweDZGQTIsIDB4NkZDOSwgMHg2RkFCLCAweDZGQ0QsIDB4NkZBRiwgMHg2RkIyLCAweDZGQjAsCi0gICAgMHg3MUM1LCAweDcxQzIsIDB4NzFCRiwgMHg3MUI4LCAweDcxRDYsIDB4NzFDMCwgMHg3MUMxLCAweDcxQ0IsCi0gICAgMHg3MUQ0LCAweDcxQ0EsIDB4NzFDNywgMHg3MUNGLCAweDcxQkQsIDB4NzFEOCwgMHg3MUJDLCAweDcxQzYsCi0gICAgMHg3MURBLCAweDcxREIsIDB4NzI5RCwgMHg3MjlFLCAweDczNjksIDB4NzM2NiwgMHg3MzY3LCAweDczNkMsCi0gICAgMHg3MzY1LCAweDczNkIsIDB4NzM2QSwgMHg3NDdGLCAweDc0OUEsIDB4NzRBMCwgMHg3NDk0LCAweDc0OTIsCi0gICAgMHg3NDk1LCAweDc0QTEsIDB4NzUwQiwgMHg3NTgwLCAweDc2MkYsIDB4NzYyRCwgMHg3NjMxLCAweDc2M0QsCi0gICAgMHg3NjMzLCAweDc2M0MsIDB4NzYzNSwgMHg3NjMyLCAweDc2MzAsIDB4NzZCQiwgMHg3NkU2LCAweDc3OUEsCi0gICAgMHg3NzlELCAweDc3QTEsIDB4Nzc5QywgMHg3NzlCLCAweDc3QTIsIDB4NzdBMywgMHg3Nzk1LCAweDc3OTksCi0gICAgMHg3Nzk3LCAweDc4REQsIDB4NzhFOSwgMHg3OEU1LCAweDc4RUEsIDB4NzhERSwgMHg3OEUzLCAweDc4REIsCi0gICAgMHg3OEUxLCAweDc4RTIsIDB4NzhFRCwgMHg3OERGLCAweDc4RTAsIDB4NzlBNCwgMHg3QTQ0LCAweDdBNDgsCi0gICAgMHg3QTQ3LCAweDdBQjYsIDB4N0FCOCwgMHg3QUI1LCAweDdBQjEsIDB4N0FCNywgMHg3QkRFLCAweDdCRTMsCi0gICAgMHg3QkU3LCAweDdCREQsIDB4N0JENSwgMHg3QkU1LCAweDdCREEsIDB4N0JFOCwgMHg3QkY5LCAweDdCRDQsCi0gICAgMHg3QkVBLCAweDdCRTIsIDB4N0JEQywgMHg3QkVCLCAweDdCRDgsIDB4N0JERiwgMHg3Q0QyLCAweDdDRDQsCi0gICAgMHg3Q0Q3LCAweDdDRDAsIDB4N0NEMSwgMHg3RTEyLCAweDdFMjEsIDB4N0UxNywgMHg3RTBDLCAweDdFMUYsCi0gICAgMHg3RTIwLCAweDdFMTMsIDB4N0UwRSwgMHg3RTFDLCAweDdFMTUsIDB4N0UxQSwgMHg3RTIyLCAweDdFMEIsCi0gICAgMHg3RTBGLCAweDdFMTYsIDB4N0UwRCwgMHg3RTE0LCAweDdFMjUsIDB4N0UyNCwgMHg3RjQzLCAweDdGN0IsCi0gICAgMHg3RjdDLCAweDdGN0EsIDB4N0ZCMSwgMHg3RkVGLCAweDgwMkEsIDB4ODAyOSwgMHg4MDZDLCAweDgxQjEsCi0gICAgMHg4MUE2LCAweDgxQUUsIDB4ODFCOSwgMHg4MUI1LCAweDgxQUIsIDB4ODFCMCwgMHg4MUFDLCAweDgxQjQsCi0gICAgMHg4MUIyLCAweDgxQjcsIDB4ODFBNywgMHg4MUYyLCAweDgyNTUsIDB4ODI1NiwgMHg4MjU3LCAweDg1NTYsCi0gICAgMHg4NTQ1LCAweDg1NkIsIDB4ODU0RCwgMHg4NTUzLCAweDg1NjEsIDB4ODU1OCwgMHg4NTQwLCAweDg1NDYsCi0gICAgMHg4NTY0LCAweDg1NDEsIDB4ODU2MiwgMHg4NTQ0LCAweDg1NTEsIDB4ODU0NywgMHg4NTYzLCAweDg1M0UsCi0gICAgMHg4NTVCLCAweDg1NzEsIDB4ODU0RSwgMHg4NTZFLCAweDg1NzUsIDB4ODU1NSwgMHg4NTY3LCAweDg1NjAsCi0gICAgMHg4NThDLCAweDg1NjYsIDB4ODU1RCwgMHg4NTU0LCAweDg1NjUsIDB4ODU2QywgMHg4NjYzLCAweDg2NjUsCi0gICAgMHg4NjY0LCAweDg3QTQsIDB4ODc5QiwgMHg4NzhGLCAweDg3OTcsIDB4ODc5MywgMHg4NzkyLCAweDg3ODgsCi0gICAgMHg4NzgxLCAweDg3OTYsIDB4ODc5OCwgMHg4Nzc5LCAweDg3ODcsIDB4ODdBMywgMHg4Nzg1LCAweDg3OTAsCi0gICAgMHg4NzkxLCAweDg3OUQsIDB4ODc4NCwgMHg4Nzk0LCAweDg3OUMsIDB4ODc5QSwgMHg4Nzg5LCAweDg5MUUsCi0gICAgMHg4OTI2LCAweDg5MzAsIDB4ODkyRCwgMHg4OTJFLCAweDg5MjcsIDB4ODkzMSwgMHg4OTIyLCAweDg5MjksCi0gICAgMHg4OTIzLCAweDg5MkYsIDB4ODkyQywgMHg4OTFGLCAweDg5RjEsIDB4OEFFMCwgMHg4QUUyLCAweDhBRjIsCi0gICAgMHg4QUY0LCAweDhBRjUsIDB4OEFERCwgMHg4QjE0LCAweDhBRTQsIDB4OEFERiwgMHg4QUYwLCAweDhBQzgsCi0gICAgMHg4QURFLCAweDhBRTEsIDB4OEFFOCwgMHg4QUZGLCAweDhBRUYsIDB4OEFGQiwgMHg4QzkxLCAweDhDOTIsCi0gICAgMHg4QzkwLCAweDhDRjUsIDB4OENFRSwgMHg4Q0YxLCAweDhDRjAsIDB4OENGMywgMHg4RDZDLCAweDhENkUsCi0gICAgMHg4REE1LCAweDhEQTcsIDB4OEUzMywgMHg4RTNFLCAweDhFMzgsIDB4OEU0MCwgMHg4RTQ1LCAweDhFMzYsCi0gICAgMHg4RTNDLCAweDhFM0QsIDB4OEU0MSwgMHg4RTMwLCAweDhFM0YsIDB4OEVCRCwgMHg4RjM2LCAweDhGMkUsCi0gICAgMHg4RjM1LCAweDhGMzIsIDB4OEYzOSwgMHg4RjM3LCAweDhGMzQsIDB4OTA3NiwgMHg5MDc5LCAweDkwN0IsCi0gICAgMHg5MDg2LCAweDkwRkEsIDB4OTEzMywgMHg5MTM1LCAweDkxMzYsIDB4OTE5MywgMHg5MTkwLCAweDkxOTEsCi0gICAgMHg5MThELCAweDkxOEYsIDB4OTMyNywgMHg5MzFFLCAweDkzMDgsIDB4OTMxRiwgMHg5MzA2LCAweDkzMEYsCi0gICAgMHg5MzdBLCAweDkzMzgsIDB4OTMzQywgMHg5MzFCLCAweDkzMjMsIDB4OTMxMiwgMHg5MzAxLCAweDkzNDYsCi0gICAgMHg5MzJELCAweDkzMEUsIDB4OTMwRCwgMHg5MkNCLCAweDkzMUQsIDB4OTJGQSwgMHg5MzEzLCAweDkyRjksCi0gICAgMHg5MkY3LCAweDkzMzQsIDB4OTMwMiwgMHg5MzI0LCAweDkyRkYsIDB4OTMyOSwgMHg5MzM5LCAweDkzMzUsCi0gICAgMHg5MzJBLCAweDkzMTQsIDB4OTMwQywgMHg5MzBCLCAweDkyRkUsIDB4OTMwOSwgMHg5MzAwLCAweDkyRkIsCi0gICAgMHg5MzE2LCAweDk1QkMsIDB4OTVDRCwgMHg5NUJFLCAweDk1QjksIDB4OTVCQSwgMHg5NUI2LCAweDk1QkYsCi0gICAgMHg5NUI1LCAweDk1QkQsIDB4OTZBOSwgMHg5NkQ0LCAweDk3MEIsIDB4OTcxMiwgMHg5NzEwLCAweDk3OTksCi0gICAgMHg5Nzk3LCAweDk3OTQsIDB4OTdGMCwgMHg5N0Y4LCAweDk4MzUsIDB4OTgyRiwgMHg5ODMyLCAweDk5MjQsCi0gICAgMHg5OTFGLCAweDk5MjcsIDB4OTkyOSwgMHg5OTlFLCAweDk5RUUsIDB4OTlFQywgMHg5OUU1LCAweDk5RTQsCi0gICAgMHg5OUYwLCAweDk5RTMsIDB4OTlFQSwgMHg5OUU5LCAweDk5RTcsIDB4OUFCOSwgMHg5QUJGLCAweDlBQjQsCi0gICAgMHg5QUJCLCAweDlBRjYsIDB4OUFGQSwgMHg5QUY5LCAweDlBRjcsIDB4OUIzMywgMHg5QjgwLCAweDlCODUsCi0gICAgMHg5Qjg3LCAweDlCN0MsIDB4OUI3RSwgMHg5QjdCLCAweDlCODIsIDB4OUI5MywgMHg5QjkyLCAweDlCOTAsCi0gICAgMHg5QjdBLCAweDlCOTUsIDB4OUI3RCwgMHg5Qjg4LCAweDlEMjUsIDB4OUQxNywgMHg5RDIwLCAweDlEMUUsCi0gICAgMHg5RDE0LCAweDlEMjksIDB4OUQxRCwgMHg5RDE4LCAweDlEMjIsIDB4OUQxMCwgMHg5RDE5LCAweDlEMUYsCi0gICAgMHg5RTg4LCAweDlFODYsIDB4OUU4NywgMHg5RUFFLCAweDlFQUQsIDB4OUVENSwgMHg5RUQ2LCAweDlFRkEsCi0gICAgMHg5RjEyLCAweDlGM0QsIDB4NTEyNiwgMHg1MTI1LCAweDUxMjIsIDB4NTEyNCwgMHg1MTIwLCAweDUxMjksCi0gICAgMHg1MkY0LCAweDU2OTMsIDB4NTY4QywgMHg1NjhELCAweDU2ODYsIDB4NTY4NCwgMHg1NjgzLCAweDU2N0UsCi0gICAgMHg1NjgyLCAweDU2N0YsIDB4NTY4MSwgMHg1OEQ2LCAweDU4RDQsIDB4NThDRiwgMHg1OEQyLCAweDVCMkQsCi0gICAgMHg1QjI1LCAweDVCMzIsIDB4NUIyMywgMHg1QjJDLCAweDVCMjcsIDB4NUIyNiwgMHg1QjJGLCAweDVCMkUsCi0gICAgMHg1QjdCLCAweDVCRjEsIDB4NUJGMiwgMHg1REI3LCAweDVFNkMsIDB4NUU2QSwgMHg1RkJFLCAweDYxQzMsCi0gICAgMHg2MUI1LCAweDYxQkMsIDB4NjFFNywgMHg2MUUwLCAweDYxRTUsIDB4NjFFNCwgMHg2MUU4LCAweDYxREUsCi0gICAgMHg2NEVGLCAweDY0RTksIDB4NjRFMywgMHg2NEVCLCAweDY0RTQsIDB4NjRFOCwgMHg2NTgxLCAweDY1ODAsCi0gICAgMHg2NUI2LCAweDY1REEsIDB4NjZEMiwgMHg2QThELCAweDZBOTYsIDB4NkE4MSwgMHg2QUE1LCAweDZBODksCi0gICAgMHg2QTlGLCAweDZBOUIsIDB4NkFBMSwgMHg2QTlFLCAweDZBODcsIDB4NkE5MywgMHg2QThFLCAweDZBOTUsCi0gICAgMHg2QTgzLCAweDZBQTgsIDB4NkFBNCwgMHg2QTkxLCAweDZBN0YsIDB4NkFBNiwgMHg2QTlBLCAweDZBODUsCi0gICAgMHg2QThDLCAweDZBOTIsIDB4NkI1QiwgMHg2QkFELCAweDZDMDksIDB4NkZDQywgMHg2RkE5LCAweDZGRjQsCi0gICAgMHg2RkQ0LCAweDZGRTMsIDB4NkZEQywgMHg2RkVELCAweDZGRTcsIDB4NkZFNiwgMHg2RkRFLCAweDZGRjIsCi0gICAgMHg2RkRELCAweDZGRTIsIDB4NkZFOCwgMHg3MUUxLCAweDcxRjEsIDB4NzFFOCwgMHg3MUYyLCAweDcxRTQsCi0gICAgMHg3MUYwLCAweDcxRTIsIDB4NzM3MywgMHg3MzZFLCAweDczNkYsIDB4NzQ5NywgMHg3NEIyLCAweDc0QUIsCi0gICAgMHg3NDkwLCAweDc0QUEsIDB4NzRBRCwgMHg3NEIxLCAweDc0QTUsIDB4NzRBRiwgMHg3NTEwLCAweDc1MTEsCi0gICAgMHg3NTEyLCAweDc1MEYsIDB4NzU4NCwgMHg3NjQzLCAweDc2NDgsIDB4NzY0OSwgMHg3NjQ3LCAweDc2QTQsCi0gICAgMHg3NkU5LCAweDc3QjUsIDB4NzdBQiwgMHg3N0IyLCAweDc3QjcsIDB4NzdCNiwgMHg3N0I0LCAweDc3QjEsCi0gICAgMHg3N0E4LCAweDc3RjAsIDB4NzhGMywgMHg3OEZELCAweDc5MDIsIDB4NzhGQiwgMHg3OEZDLCAweDc4RkYsCi0gICAgMHg3OEYyLCAweDc5MDUsIDB4NzhGOSwgMHg3OEZFLCAweDc5MDQsIDB4NzlBQiwgMHg3OUE4LCAweDdBNUMsCi0gICAgMHg3QTVCLCAweDdBNTYsIDB4N0E1OCwgMHg3QTU0LCAweDdBNUEsIDB4N0FCRSwgMHg3QUMwLCAweDdBQzEsCi0gICAgMHg3QzA1LCAweDdDMEYsIDB4N0JGMiwgMHg3QzAwLCAweDdCRkYsIDB4N0JGQiwgMHg3QzBFLCAweDdCRjQsCi0gICAgMHg3QzBCLCAweDdCRjMsIDB4N0MwMiwgMHg3QzA5LCAweDdDMDMsIDB4N0MwMSwgMHg3QkY4LCAweDdCRkQsCi0gICAgMHg3QzA2LCAweDdCRjAsIDB4N0JGMSwgMHg3QzEwLCAweDdDMEEsIDB4N0NFOCwgMHg3RTJELCAweDdFM0MsCi0gICAgMHg3RTQyLCAweDdFMzMsIDB4OTg0OCwgMHg3RTM4LCAweDdFMkEsIDB4N0U0OSwgMHg3RTQwLCAweDdFNDcsCi0gICAgMHg3RTI5LCAweDdFNEMsIDB4N0UzMCwgMHg3RTNCLCAweDdFMzYsIDB4N0U0NCwgMHg3RTNBLCAweDdGNDUsCi0gICAgMHg3RjdGLCAweDdGN0UsIDB4N0Y3RCwgMHg3RkY0LCAweDdGRjIsIDB4ODAyQywgMHg4MUJCLCAweDgxQzQsCi0gICAgMHg4MUNDLCAweDgxQ0EsIDB4ODFDNSwgMHg4MUM3LCAweDgxQkMsIDB4ODFFOSwgMHg4MjVCLCAweDgyNUEsCi0gICAgMHg4MjVDLCAweDg1ODMsIDB4ODU4MCwgMHg4NThGLCAweDg1QTcsIDB4ODU5NSwgMHg4NUEwLCAweDg1OEIsCi0gICAgMHg4NUEzLCAweDg1N0IsIDB4ODVBNCwgMHg4NTlBLCAweDg1OUUsIDB4ODU3NywgMHg4NTdDLCAweDg1ODksCi0gICAgMHg4NUExLCAweDg1N0EsIDB4ODU3OCwgMHg4NTU3LCAweDg1OEUsIDB4ODU5NiwgMHg4NTg2LCAweDg1OEQsCi0gICAgMHg4NTk5LCAweDg1OUQsIDB4ODU4MSwgMHg4NUEyLCAweDg1ODIsIDB4ODU4OCwgMHg4NTg1LCAweDg1NzksCi0gICAgMHg4NTc2LCAweDg1OTgsIDB4ODU5MCwgMHg4NTlGLCAweDg2NjgsIDB4ODdCRSwgMHg4N0FBLCAweDg3QUQsCi0gICAgMHg4N0M1LCAweDg3QjAsIDB4ODdBQywgMHg4N0I5LCAweDg3QjUsIDB4ODdCQywgMHg4N0FFLCAweDg3QzksCi0gICAgMHg4N0MzLCAweDg3QzIsIDB4ODdDQywgMHg4N0I3LCAweDg3QUYsIDB4ODdDNCwgMHg4N0NBLCAweDg3QjQsCi0gICAgMHg4N0I2LCAweDg3QkYsIDB4ODdCOCwgMHg4N0JELCAweDg3REUsIDB4ODdCMiwgMHg4OTM1LCAweDg5MzMsCi0gICAgMHg4OTNDLCAweDg5M0UsIDB4ODk0MSwgMHg4OTUyLCAweDg5MzcsIDB4ODk0MiwgMHg4OUFELCAweDg5QUYsCi0gICAgMHg4OUFFLCAweDg5RjIsIDB4ODlGMywgMHg4QjFFLCAweDhCMTgsIDB4OEIxNiwgMHg4QjExLCAweDhCMDUsCi0gICAgMHg4QjBCLCAweDhCMjIsIDB4OEIwRiwgMHg4QjEyLCAweDhCMTUsIDB4OEIwNywgMHg4QjBELCAweDhCMDgsCi0gICAgMHg4QjA2LCAweDhCMUMsIDB4OEIxMywgMHg4QjFBLCAweDhDNEYsIDB4OEM3MCwgMHg4QzcyLCAweDhDNzEsCi0gICAgMHg4QzZGLCAweDhDOTUsIDB4OEM5NCwgMHg4Q0Y5LCAweDhENkYsIDB4OEU0RSwgMHg4RTRELCAweDhFNTMsCi0gICAgMHg4RTUwLCAweDhFNEMsIDB4OEU0NywgMHg4RjQzLCAweDhGNDAsIDB4OTA4NSwgMHg5MDdFLCAweDkxMzgsCi0gICAgMHg5MTlBLCAweDkxQTIsIDB4OTE5QiwgMHg5MTk5LCAweDkxOUYsIDB4OTFBMSwgMHg5MTlELCAweDkxQTAsCi0gICAgMHg5M0ExLCAweDkzODMsIDB4OTNBRiwgMHg5MzY0LCAweDkzNTYsIDB4OTM0NywgMHg5MzdDLCAweDkzNTgsCi0gICAgMHg5MzVDLCAweDkzNzYsIDB4OTM0OSwgMHg5MzUwLCAweDkzNTEsIDB4OTM2MCwgMHg5MzZELCAweDkzOEYsCi0gICAgMHg5MzRDLCAweDkzNkEsIDB4OTM3OSwgMHg5MzU3LCAweDkzNTUsIDB4OTM1MiwgMHg5MzRGLCAweDkzNzEsCi0gICAgMHg5Mzc3LCAweDkzN0IsIDB4OTM2MSwgMHg5MzVFLCAweDkzNjMsIDB4OTM2NywgMHg5MzRFLCAweDkzNTksCi0gICAgMHg5NUM3LCAweDk1QzAsIDB4OTVDOSwgMHg5NUMzLCAweDk1QzUsIDB4OTVCNywgMHg5NkFFLCAweDk2QjAsCi0gICAgMHg5NkFDLCAweDk3MjAsIDB4OTcxRiwgMHg5NzE4LCAweDk3MUQsIDB4OTcxOSwgMHg5NzlBLCAweDk3QTEsCi0gICAgMHg5NzlDLCAweDk3OUUsIDB4OTc5RCwgMHg5N0Q1LCAweDk3RDQsIDB4OTdGMSwgMHg5ODQxLCAweDk4NDQsCi0gICAgMHg5ODRBLCAweDk4NDksIDB4OTg0NSwgMHg5ODQzLCAweDk5MjUsIDB4OTkyQiwgMHg5OTJDLCAweDk5MkEsCi0gICAgMHg5OTMzLCAweDk5MzIsIDB4OTkyRiwgMHg5OTJELCAweDk5MzEsIDB4OTkzMCwgMHg5OTk4LCAweDk5QTMsCi0gICAgMHg5OUExLCAweDlBMDIsIDB4OTlGQSwgMHg5OUY0LCAweDk5RjcsIDB4OTlGOSwgMHg5OUY4LCAweDk5RjYsCi0gICAgMHg5OUZCLCAweDk5RkQsIDB4OTlGRSwgMHg5OUZDLCAweDlBMDMsIDB4OUFCRSwgMHg5QUZFLCAweDlBRkQsCi0gICAgMHg5QjAxLCAweDlBRkMsIDB4OUI0OCwgMHg5QjlBLCAweDlCQTgsIDB4OUI5RSwgMHg5QjlCLCAweDlCQTYsCi0gICAgMHg5QkExLCAweDlCQTUsIDB4OUJBNCwgMHg5Qjg2LCAweDlCQTIsIDB4OUJBMCwgMHg5QkFGLCAweDlEMzMsCi0gICAgMHg5RDQxLCAweDlENjcsIDB4OUQzNiwgMHg5RDJFLCAweDlEMkYsIDB4OUQzMSwgMHg5RDM4LCAweDlEMzAsCi0gICAgMHg5RDQ1LCAweDlENDIsIDB4OUQ0MywgMHg5RDNFLCAweDlEMzcsIDB4OUQ0MCwgMHg5RDNELCAweDdGRjUsCi0gICAgMHg5RDJELCAweDlFOEEsIDB4OUU4OSwgMHg5RThELCAweDlFQjAsIDB4OUVDOCwgMHg5RURBLCAweDlFRkIsCi0gICAgMHg5RUZGLCAweDlGMjQsIDB4OUYyMywgMHg5RjIyLCAweDlGNTQsIDB4OUZBMCwgMHg1MTMxLCAweDUxMkQsCi0gICAgMHg1MTJFLCAweDU2OTgsIDB4NTY5QywgMHg1Njk3LCAweDU2OUEsIDB4NTY5RCwgMHg1Njk5LCAweDU5NzAsCi0gICAgMHg1QjNDLCAweDVDNjksIDB4NUM2QSwgMHg1REMwLCAweDVFNkQsIDB4NUU2RSwgMHg2MUQ4LCAweDYxREYsCi0gICAgMHg2MUVELCAweDYxRUUsIDB4NjFGMSwgMHg2MUVBLCAweDYxRjAsIDB4NjFFQiwgMHg2MUQ2LCAweDYxRTksCi0gICAgMHg2NEZGLCAweDY1MDQsIDB4NjRGRCwgMHg2NEY4LCAweDY1MDEsIDB4NjUwMywgMHg2NEZDLCAweDY1OTQsCi0gICAgMHg2NURCLCAweDY2REEsIDB4NjZEQiwgMHg2NkQ4LCAweDZBQzUsIDB4NkFCOSwgMHg2QUJELCAweDZBRTEsCi0gICAgMHg2QUM2LCAweDZBQkEsIDB4NkFCNiwgMHg2QUI3LCAweDZBQzcsIDB4NkFCNCwgMHg2QUFELCAweDZCNUUsCi0gICAgMHg2QkM5LCAweDZDMEIsIDB4NzAwNywgMHg3MDBDLCAweDcwMEQsIDB4NzAwMSwgMHg3MDA1LCAweDcwMTQsCi0gICAgMHg3MDBFLCAweDZGRkYsIDB4NzAwMCwgMHg2RkZCLCAweDcwMjYsIDB4NkZGQywgMHg2RkY3LCAweDcwMEEsCi0gICAgMHg3MjAxLCAweDcxRkYsIDB4NzFGOSwgMHg3MjAzLCAweDcxRkQsIDB4NzM3NiwgMHg3NEI4LCAweDc0QzAsCi0gICAgMHg3NEI1LCAweDc0QzEsIDB4NzRCRSwgMHg3NEI2LCAweDc0QkIsIDB4NzRDMiwgMHg3NTE0LCAweDc1MTMsCi0gICAgMHg3NjVDLCAweDc2NjQsIDB4NzY1OSwgMHg3NjUwLCAweDc2NTMsIDB4NzY1NywgMHg3NjVBLCAweDc2QTYsCi0gICAgMHg3NkJELCAweDc2RUMsIDB4NzdDMiwgMHg3N0JBLCAweDc5MEMsIDB4NzkxMywgMHg3OTE0LCAweDc5MDksCi0gICAgMHg3OTEwLCAweDc5MTIsIDB4NzkxMSwgMHg3OUFELCAweDc5QUMsIDB4N0E1RiwgMHg3QzFDLCAweDdDMjksCi0gICAgMHg3QzE5LCAweDdDMjAsIDB4N0MxRiwgMHg3QzJELCAweDdDMUQsIDB4N0MyNiwgMHg3QzI4LCAweDdDMjIsCi0gICAgMHg3QzI1LCAweDdDMzAsIDB4N0U1QywgMHg3RTUwLCAweDdFNTYsIDB4N0U2MywgMHg3RTU4LCAweDdFNjIsCi0gICAgMHg3RTVGLCAweDdFNTEsIDB4N0U2MCwgMHg3RTU3LCAweDdFNTMsIDB4N0ZCNSwgMHg3RkIzLCAweDdGRjcsCi0gICAgMHg3RkY4LCAweDgwNzUsIDB4ODFEMSwgMHg4MUQyLCAweDgxRDAsIDB4ODI1RiwgMHg4MjVFLCAweDg1QjQsCi0gICAgMHg4NUM2LCAweDg1QzAsIDB4ODVDMywgMHg4NUMyLCAweDg1QjMsIDB4ODVCNSwgMHg4NUJELCAweDg1QzcsCi0gICAgMHg4NUM0LCAweDg1QkYsIDB4ODVDQiwgMHg4NUNFLCAweDg1QzgsIDB4ODVDNSwgMHg4NUIxLCAweDg1QjYsCi0gICAgMHg4NUQyLCAweDg2MjQsIDB4ODVCOCwgMHg4NUI3LCAweDg1QkUsIDB4ODY2OSwgMHg4N0U3LCAweDg3RTYsCi0gICAgMHg4N0UyLCAweDg3REIsIDB4ODdFQiwgMHg4N0VBLCAweDg3RTUsIDB4ODdERiwgMHg4N0YzLCAweDg3RTQsCi0gICAgMHg4N0Q0LCAweDg3REMsIDB4ODdEMywgMHg4N0VELCAweDg3RDgsIDB4ODdFMywgMHg4N0Q3LCAweDg3RDksCi0gICAgMHg4ODAxLCAweDg3RjQsIDB4ODdFOCwgMHg4N0RELCAweDg5NTMsIDB4ODk0QiwgMHg4OTRGLCAweDg5NEMsCi0gICAgMHg4OTQ2LCAweDg5NTAsIDB4ODk1MSwgMHg4OTQ5LCAweDhCMkEsIDB4OEIyNywgMHg4QjIzLCAweDhCMzMsCi0gICAgMHg4QjMwLCAweDhCMzUsIDB4OEI0NywgMHg4QjJGLCAweDhCM0MsIDB4OEIzRSwgMHg4QjMxLCAweDhCMjUsCi0gICAgMHg4QjM3LCAweDhCMjYsIDB4OEIzNiwgMHg4QjJFLCAweDhCMjQsIDB4OEIzQiwgMHg4QjNELCAweDhCM0EsCi0gICAgMHg4QzQyLCAweDhDNzUsIDB4OEM5OSwgMHg4Qzk4LCAweDhDOTcsIDB4OENGRSwgMHg4RDA0LCAweDhEMDIsCi0gICAgMHg4RDAwLCAweDhFNUMsIDB4OEU2MiwgMHg4RTYwLCAweDhFNTcsIDB4OEU1NiwgMHg4RTVFLCAweDhFNjUsCi0gICAgMHg4RTY3LCAweDhFNUIsIDB4OEU1QSwgMHg4RTYxLCAweDhFNUQsIDB4OEU2OSwgMHg4RTU0LCAweDhGNDYsCi0gICAgMHg4RjQ3LCAweDhGNDgsIDB4OEY0QiwgMHg5MTI4LCAweDkxM0EsIDB4OTEzQiwgMHg5MTNFLCAweDkxQTgsCi0gICAgMHg5MUE1LCAweDkxQTcsIDB4OTFBRiwgMHg5MUFBLCAweDkzQjUsIDB4OTM4QywgMHg5MzkyLCAweDkzQjcsCi0gICAgMHg5MzlCLCAweDkzOUQsIDB4OTM4OSwgMHg5M0E3LCAweDkzOEUsIDB4OTNBQSwgMHg5MzlFLCAweDkzQTYsCi0gICAgMHg5Mzk1LCAweDkzODgsIDB4OTM5OSwgMHg5MzlGLCAweDkzODAsIDB4OTM4RCwgMHg5M0IxLCAweDkzOTEsCi0gICAgMHg5M0IyLCAweDkzQTQsIDB4OTNBOCwgMHg5M0I0LCAweDkzQTMsIDB4OTVEMiwgMHg5NUQzLCAweDk1RDEsCi0gICAgMHg5NkIzLCAweDk2RDcsIDB4OTZEQSwgMHg1REMyLCAweDk2REYsIDB4OTZEOCwgMHg5NkRELCAweDk3MjMsCi0gICAgMHg5NzIyLCAweDk3MjUsIDB4OTdBQywgMHg5N0FFLCAweDk3QTgsIDB4OTdBQiwgMHg5N0E0LCAweDk3QUEsCi0gICAgMHg5N0EyLCAweDk3QTUsIDB4OTdENywgMHg5N0Q5LCAweDk3RDYsIDB4OTdEOCwgMHg5N0ZBLCAweDk4NTAsCi0gICAgMHg5ODUxLCAweDk4NTIsIDB4OThCOCwgMHg5OTQxLCAweDk5M0MsIDB4OTkzQSwgMHg5QTBGLCAweDlBMEIsCi0gICAgMHg5QTA5LCAweDlBMEQsIDB4OUEwNCwgMHg5QTExLCAweDlBMEEsIDB4OUEwNSwgMHg5QTA3LCAweDlBMDYsCi0gICAgMHg5QUMwLCAweDlBREMsIDB4OUIwOCwgMHg5QjA0LCAweDlCMDUsIDB4OUIyOSwgMHg5QjM1LCAweDlCNEEsCi0gICAgMHg5QjRDLCAweDlCNEIsIDB4OUJDNywgMHg5QkM2LCAweDlCQzMsIDB4OUJCRiwgMHg5QkMxLCAweDlCQjUsCi0gICAgMHg5QkI4LCAweDlCRDMsIDB4OUJCNiwgMHg5QkM0LCAweDlCQjksIDB4OUJCRCwgMHg5RDVDLCAweDlENTMsCi0gICAgMHg5RDRGLCAweDlENEEsIDB4OUQ1QiwgMHg5RDRCLCAweDlENTksIDB4OUQ1NiwgMHg5RDRDLCAweDlENTcsCi0gICAgMHg5RDUyLCAweDlENTQsIDB4OUQ1RiwgMHg5RDU4LCAweDlENUEsIDB4OUU4RSwgMHg5RThDLCAweDlFREYsCi0gICAgMHg5RjAxLCAweDlGMDAsIDB4OUYxNiwgMHg5RjI1LCAweDlGMkIsIDB4OUYyQSwgMHg5RjI5LCAweDlGMjgsCi0gICAgMHg5RjRDLCAweDlGNTUsIDB4NTEzNCwgMHg1MTM1LCAweDUyOTYsIDB4NTJGNywgMHg1M0I0LCAweDU2QUIsCi0gICAgMHg1NkFELCAweDU2QTYsIDB4NTZBNywgMHg1NkFBLCAweDU2QUMsIDB4NThEQSwgMHg1OERELCAweDU4REIsCi0gICAgMHg1OTEyLCAweDVCM0QsIDB4NUIzRSwgMHg1QjNGLCAweDVEQzMsIDB4NUU3MCwgMHg1RkJGLCAweDYxRkIsCi0gICAgMHg2NTA3LCAweDY1MTAsIDB4NjUwRCwgMHg2NTA5LCAweDY1MEMsIDB4NjUwRSwgMHg2NTg0LCAweDY1REUsCi0gICAgMHg2NURELCAweDY2REUsIDB4NkFFNywgMHg2QUUwLCAweDZBQ0MsIDB4NkFEMSwgMHg2QUQ5LCAweDZBQ0IsCi0gICAgMHg2QURGLCAweDZBREMsIDB4NkFEMCwgMHg2QUVCLCAweDZBQ0YsIDB4NkFDRCwgMHg2QURFLCAweDZCNjAsCi0gICAgMHg2QkIwLCAweDZDMEMsIDB4NzAxOSwgMHg3MDI3LCAweDcwMjAsIDB4NzAxNiwgMHg3MDJCLCAweDcwMjEsCi0gICAgMHg3MDIyLCAweDcwMjMsIDB4NzAyOSwgMHg3MDE3LCAweDcwMjQsIDB4NzAxQywgMHg3MjBDLCAweDcyMEEsCi0gICAgMHg3MjA3LCAweDcyMDIsIDB4NzIwNSwgMHg3MkE1LCAweDcyQTYsIDB4NzJBNCwgMHg3MkEzLCAweDcyQTEsCi0gICAgMHg3NENCLCAweDc0QzUsIDB4NzRCNywgMHg3NEMzLCAweDc1MTYsIDB4NzY2MCwgMHg3N0M5LCAweDc3Q0EsCi0gICAgMHg3N0M0LCAweDc3RjEsIDB4NzkxRCwgMHg3OTFCLCAweDc5MjEsIDB4NzkxQywgMHg3OTE3LCAweDc5MUUsCi0gICAgMHg3OUIwLCAweDdBNjcsIDB4N0E2OCwgMHg3QzMzLCAweDdDM0MsIDB4N0MzOSwgMHg3QzJDLCAweDdDM0IsCi0gICAgMHg3Q0VDLCAweDdDRUEsIDB4N0U3NiwgMHg3RTc1LCAweDdFNzgsIDB4N0U3MCwgMHg3RTc3LCAweDdFNkYsCi0gICAgMHg3RTdBLCAweDdFNzIsIDB4N0U3NCwgMHg3RTY4LCAweDdGNEIsIDB4N0Y0QSwgMHg3RjgzLCAweDdGODYsCi0gICAgMHg3RkI3LCAweDdGRkQsIDB4N0ZGRSwgMHg4MDc4LCAweDgxRDcsIDB4ODFENSwgMHg4MjBCLCAweDgyNjQsCi0gICAgMHg4MjYxLCAweDgyNjMsIDB4ODVFQiwgMHg4NUYxLCAweDg1RUQsIDB4ODVEOSwgMHg4NUUxLCAweDg1RTgsCi0gICAgMHg4NURBLCAweDg1RDcsIDB4ODVFQywgMHg4NUYyLCAweDg1RjgsIDB4ODVEOCwgMHg4NURGLCAweDg1RTMsCi0gICAgMHg4NURDLCAweDg1RDEsIDB4ODVGMCwgMHg4NUU2LCAweDg1RUYsIDB4ODVERSwgMHg4NUUyLCAweDg4MDAsCi0gICAgMHg4N0ZBLCAweDg4MDMsIDB4ODdGNiwgMHg4N0Y3LCAweDg4MDksIDB4ODgwQywgMHg4ODBCLCAweDg4MDYsCi0gICAgMHg4N0ZDLCAweDg4MDgsIDB4ODdGRiwgMHg4ODBBLCAweDg4MDIsIDB4ODk2MiwgMHg4OTVBLCAweDg5NUIsCi0gICAgMHg4OTU3LCAweDg5NjEsIDB4ODk1QywgMHg4OTU4LCAweDg5NUQsIDB4ODk1OSwgMHg4OTg4LCAweDg5QjcsCi0gICAgMHg4OUI2LCAweDg5RjYsIDB4OEI1MCwgMHg4QjQ4LCAweDhCNEEsIDB4OEI0MCwgMHg4QjUzLCAweDhCNTYsCi0gICAgMHg4QjU0LCAweDhCNEIsIDB4OEI1NSwgMHg4QjUxLCAweDhCNDIsIDB4OEI1MiwgMHg4QjU3LCAweDhDNDMsCi0gICAgMHg4Qzc3LCAweDhDNzYsIDB4OEM5QSwgMHg4RDA2LCAweDhEMDcsIDB4OEQwOSwgMHg4REFDLCAweDhEQUEsCi0gICAgMHg4REFELCAweDhEQUIsIDB4OEU2RCwgMHg4RTc4LCAweDhFNzMsIDB4OEU2QSwgMHg4RTZGLCAweDhFN0IsCi0gICAgMHg4RUMyLCAweDhGNTIsIDB4OEY1MSwgMHg4RjRGLCAweDhGNTAsIDB4OEY1MywgMHg4RkI0LCAweDkxNDAsCi0gICAgMHg5MTNGLCAweDkxQjAsIDB4OTFBRCwgMHg5M0RFLCAweDkzQzcsIDB4OTNDRiwgMHg5M0MyLCAweDkzREEsCi0gICAgMHg5M0QwLCAweDkzRjksIDB4OTNFQywgMHg5M0NDLCAweDkzRDksIDB4OTNBOSwgMHg5M0U2LCAweDkzQ0EsCi0gICAgMHg5M0Q0LCAweDkzRUUsIDB4OTNFMywgMHg5M0Q1LCAweDkzQzQsIDB4OTNDRSwgMHg5M0MwLCAweDkzRDIsCi0gICAgMHg5M0E1LCAweDkzRTcsIDB4OTU3RCwgMHg5NURBLCAweDk1REIsIDB4OTZFMSwgMHg5NzI5LCAweDk3MkIsCi0gICAgMHg5NzJDLCAweDk3MjgsIDB4OTcyNiwgMHg5N0IzLCAweDk3QjcsIDB4OTdCNiwgMHg5N0RELCAweDk3REUsCi0gICAgMHg5N0RGLCAweDk4NUMsIDB4OTg1OSwgMHg5ODVELCAweDk4NTcsIDB4OThCRiwgMHg5OEJELCAweDk4QkIsCi0gICAgMHg5OEJFLCAweDk5NDgsIDB4OTk0NywgMHg5OTQzLCAweDk5QTYsIDB4OTlBNywgMHg5QTFBLCAweDlBMTUsCi0gICAgMHg5QTI1LCAweDlBMUQsIDB4OUEyNCwgMHg5QTFCLCAweDlBMjIsIDB4OUEyMCwgMHg5QTI3LCAweDlBMjMsCi0gICAgMHg5QTFFLCAweDlBMUMsIDB4OUExNCwgMHg5QUMyLCAweDlCMEIsIDB4OUIwQSwgMHg5QjBFLCAweDlCMEMsCi0gICAgMHg5QjM3LCAweDlCRUEsIDB4OUJFQiwgMHg5QkUwLCAweDlCREUsIDB4OUJFNCwgMHg5QkU2LCAweDlCRTIsCi0gICAgMHg5QkYwLCAweDlCRDQsIDB4OUJENywgMHg5QkVDLCAweDlCREMsIDB4OUJEOSwgMHg5QkU1LCAweDlCRDUsCi0gICAgMHg5QkUxLCAweDlCREEsIDB4OUQ3NywgMHg5RDgxLCAweDlEOEEsIDB4OUQ4NCwgMHg5RDg4LCAweDlENzEsCi0gICAgMHg5RDgwLCAweDlENzgsIDB4OUQ4NiwgMHg5RDhCLCAweDlEOEMsIDB4OUQ3RCwgMHg5RDZCLCAweDlENzQsCi0gICAgMHg5RDc1LCAweDlENzAsIDB4OUQ2OSwgMHg5RDg1LCAweDlENzMsIDB4OUQ3QiwgMHg5RDgyLCAweDlENkYsCi0gICAgMHg5RDc5LCAweDlEN0YsIDB4OUQ4NywgMHg5RDY4LCAweDlFOTQsIDB4OUU5MSwgMHg5RUMwLCAweDlFRkMsCi0gICAgMHg5RjJELCAweDlGNDAsIDB4OUY0MSwgMHg5RjRELCAweDlGNTYsIDB4OUY1NywgMHg5RjU4LCAweDUzMzcsCi0gICAgMHg1NkIyLCAweDU2QjUsIDB4NTZCMywgMHg1OEUzLCAweDVCNDUsIDB4NURDNiwgMHg1REM3LCAweDVFRUUsCi0gICAgMHg1RUVGLCAweDVGQzAsIDB4NUZDMSwgMHg2MUY5LCAweDY1MTcsIDB4NjUxNiwgMHg2NTE1LCAweDY1MTMsCi0gICAgMHg2NURGLCAweDY2RTgsIDB4NjZFMywgMHg2NkU0LCAweDZBRjMsIDB4NkFGMCwgMHg2QUVBLCAweDZBRTgsCi0gICAgMHg2QUY5LCAweDZBRjEsIDB4NkFFRSwgMHg2QUVGLCAweDcwM0MsIDB4NzAzNSwgMHg3MDJGLCAweDcwMzcsCi0gICAgMHg3MDM0LCAweDcwMzEsIDB4NzA0MiwgMHg3MDM4LCAweDcwM0YsIDB4NzAzQSwgMHg3MDM5LCAweDcwMkEsCi0gICAgMHg3MDQwLCAweDcwM0IsIDB4NzAzMywgMHg3MDQxLCAweDcyMTMsIDB4NzIxNCwgMHg3MkE4LCAweDczN0QsCi0gICAgMHg3MzdDLCAweDc0QkEsIDB4NzZBQiwgMHg3NkFBLCAweDc2QkUsIDB4NzZFRCwgMHg3N0NDLCAweDc3Q0UsCi0gICAgMHg3N0NGLCAweDc3Q0QsIDB4NzdGMiwgMHg3OTI1LCAweDc5MjMsIDB4NzkyNywgMHg3OTI4LCAweDc5MjQsCi0gICAgMHg3OTI5LCAweDc5QjIsIDB4N0E2RSwgMHg3QTZDLCAweDdBNkQsIDB4N0FGNywgMHg3QzQ5LCAweDdDNDgsCi0gICAgMHg3QzRBLCAweDdDNDcsIDB4N0M0NSwgMHg3Q0VFLCAweDdFN0IsIDB4N0U3RSwgMHg3RTgxLCAweDdFODAsCi0gICAgMHg3RkJBLCAweDdGRkYsIDB4ODA3OSwgMHg4MURCLCAweDgxRDksIDB4ODI2OCwgMHg4MjY5LCAweDg2MjIsCi0gICAgMHg4NUZGLCAweDg2MDEsIDB4ODVGRSwgMHg4NjFCLCAweDg2MDAsIDB4ODVGNiwgMHg4NjA0LCAweDg2MDksCi0gICAgMHg4NjA1LCAweDg2MEMsIDB4ODVGRCwgMHg4ODE5LCAweDg4MTAsIDB4ODgxMSwgMHg4ODE3LCAweDg4MTMsCi0gICAgMHg4ODE2LCAweDg5NjMsIDB4ODk2NiwgMHg4OUI5LCAweDg5RjcsIDB4OEI2MCwgMHg4QjZBLCAweDhCNUQsCi0gICAgMHg4QjY4LCAweDhCNjMsIDB4OEI2NSwgMHg4QjY3LCAweDhCNkQsIDB4OERBRSwgMHg4RTg2LCAweDhFODgsCi0gICAgMHg4RTg0LCAweDhGNTksIDB4OEY1NiwgMHg4RjU3LCAweDhGNTUsIDB4OEY1OCwgMHg4RjVBLCAweDkwOEQsCi0gICAgMHg5MTQzLCAweDkxNDEsIDB4OTFCNywgMHg5MUI1LCAweDkxQjIsIDB4OTFCMywgMHg5NDBCLCAweDk0MTMsCi0gICAgMHg5M0ZCLCAweDk0MjAsIDB4OTQwRiwgMHg5NDE0LCAweDkzRkUsIDB4OTQxNSwgMHg5NDEwLCAweDk0MjgsCi0gICAgMHg5NDE5LCAweDk0MEQsIDB4OTNGNSwgMHg5NDAwLCAweDkzRjcsIDB4OTQwNywgMHg5NDBFLCAweDk0MTYsCi0gICAgMHg5NDEyLCAweDkzRkEsIDB4OTQwOSwgMHg5M0Y4LCAweDk0M0MsIDB4OTQwQSwgMHg5M0ZGLCAweDkzRkMsCi0gICAgMHg5NDBDLCAweDkzRjYsIDB4OTQxMSwgMHg5NDA2LCAweDk1REUsIDB4OTVFMCwgMHg5NURGLCAweDk3MkUsCi0gICAgMHg5NzJGLCAweDk3QjksIDB4OTdCQiwgMHg5N0ZELCAweDk3RkUsIDB4OTg2MCwgMHg5ODYyLCAweDk4NjMsCi0gICAgMHg5ODVGLCAweDk4QzEsIDB4OThDMiwgMHg5OTUwLCAweDk5NEUsIDB4OTk1OSwgMHg5OTRDLCAweDk5NEIsCi0gICAgMHg5OTUzLCAweDlBMzIsIDB4OUEzNCwgMHg5QTMxLCAweDlBMkMsIDB4OUEyQSwgMHg5QTM2LCAweDlBMjksCi0gICAgMHg5QTJFLCAweDlBMzgsIDB4OUEyRCwgMHg5QUM3LCAweDlBQ0EsIDB4OUFDNiwgMHg5QjEwLCAweDlCMTIsCi0gICAgMHg5QjExLCAweDlDMEIsIDB4OUMwOCwgMHg5QkY3LCAweDlDMDUsIDB4OUMxMiwgMHg5QkY4LCAweDlDNDAsCi0gICAgMHg5QzA3LCAweDlDMEUsIDB4OUMwNiwgMHg5QzE3LCAweDlDMTQsIDB4OUMwOSwgMHg5RDlGLCAweDlEOTksCi0gICAgMHg5REE0LCAweDlEOUQsIDB4OUQ5MiwgMHg5RDk4LCAweDlEOTAsIDB4OUQ5QiwgMHg5REEwLCAweDlEOTQsCi0gICAgMHg5RDlDLCAweDlEQUEsIDB4OUQ5NywgMHg5REExLCAweDlEOUEsIDB4OURBMiwgMHg5REE4LCAweDlEOUUsCi0gICAgMHg5REEzLCAweDlEQkYsIDB4OURBOSwgMHg5RDk2LCAweDlEQTYsIDB4OURBNywgMHg5RTk5LCAweDlFOUIsCi0gICAgMHg5RTlBLCAweDlFRTUsIDB4OUVFNCwgMHg5RUU3LCAweDlFRTYsIDB4OUYzMCwgMHg5RjJFLCAweDlGNUIsCi0gICAgMHg5RjYwLCAweDlGNUUsIDB4OUY1RCwgMHg5RjU5LCAweDlGOTEsIDB4NTEzQSwgMHg1MTM5LCAweDUyOTgsCi0gICAgMHg1Mjk3LCAweDU2QzMsIDB4NTZCRCwgMHg1NkJFLCAweDVCNDgsIDB4NUI0NywgMHg1RENCLCAweDVEQ0YsCi0gICAgMHg1RUYxLCAweDYxRkQsIDB4NjUxQiwgMHg2QjAyLCAweDZBRkMsIDB4NkIwMywgMHg2QUY4LCAweDZCMDAsCi0gICAgMHg3MDQzLCAweDcwNDQsIDB4NzA0QSwgMHg3MDQ4LCAweDcwNDksIDB4NzA0NSwgMHg3MDQ2LCAweDcyMUQsCi0gICAgMHg3MjFBLCAweDcyMTksIDB4NzM3RSwgMHg3NTE3LCAweDc2NkEsIDB4NzdEMCwgMHg3OTJELCAweDc5MzEsCi0gICAgMHg3OTJGLCAweDdDNTQsIDB4N0M1MywgMHg3Q0YyLCAweDdFOEEsIDB4N0U4NywgMHg3RTg4LCAweDdFOEIsCi0gICAgMHg3RTg2LCAweDdFOEQsIDB4N0Y0RCwgMHg3RkJCLCAweDgwMzAsIDB4ODFERCwgMHg4NjE4LCAweDg2MkEsCi0gICAgMHg4NjI2LCAweDg2MUYsIDB4ODYyMywgMHg4NjFDLCAweDg2MTksIDB4ODYyNywgMHg4NjJFLCAweDg2MjEsCi0gICAgMHg4NjIwLCAweDg2MjksIDB4ODYxRSwgMHg4NjI1LCAweDg4MjksIDB4ODgxRCwgMHg4ODFCLCAweDg4MjAsCi0gICAgMHg4ODI0LCAweDg4MUMsIDB4ODgyQiwgMHg4ODRBLCAweDg5NkQsIDB4ODk2OSwgMHg4OTZFLCAweDg5NkIsCi0gICAgMHg4OUZBLCAweDhCNzksIDB4OEI3OCwgMHg4QjQ1LCAweDhCN0EsIDB4OEI3QiwgMHg4RDEwLCAweDhEMTQsCi0gICAgMHg4REFGLCAweDhFOEUsIDB4OEU4QywgMHg4RjVFLCAweDhGNUIsIDB4OEY1RCwgMHg5MTQ2LCAweDkxNDQsCi0gICAgMHg5MTQ1LCAweDkxQjksIDB4OTQzRiwgMHg5NDNCLCAweDk0MzYsIDB4OTQyOSwgMHg5NDNELCAweDk0MzAsCi0gICAgMHg5NDM5LCAweDk0MkEsIDB4OTQzNywgMHg5NDJDLCAweDk0NDAsIDB4OTQzMSwgMHg5NUU1LCAweDk1RTQsCi0gICAgMHg5NUUzLCAweDk3MzUsIDB4OTczQSwgMHg5N0JGLCAweDk3RTEsIDB4OTg2NCwgMHg5OEM5LCAweDk4QzYsCi0gICAgMHg5OEMwLCAweDk5NTgsIDB4OTk1NiwgMHg5QTM5LCAweDlBM0QsIDB4OUE0NiwgMHg5QTQ0LCAweDlBNDIsCi0gICAgMHg5QTQxLCAweDlBM0EsIDB4OUEzRiwgMHg5QUNELCAweDlCMTUsIDB4OUIxNywgMHg5QjE4LCAweDlCMTYsCi0gICAgMHg5QjNBLCAweDlCNTIsIDB4OUMyQiwgMHg5QzFELCAweDlDMUMsIDB4OUMyQywgMHg5QzIzLCAweDlDMjgsCi0gICAgMHg5QzI5LCAweDlDMjQsIDB4OUMyMSwgMHg5REI3LCAweDlEQjYsIDB4OURCQywgMHg5REMxLCAweDlEQzcsCi0gICAgMHg5RENBLCAweDlEQ0YsIDB4OURCRSwgMHg5REM1LCAweDlEQzMsIDB4OURCQiwgMHg5REI1LCAweDlEQ0UsCi0gICAgMHg5REI5LCAweDlEQkEsIDB4OURBQywgMHg5REM4LCAweDlEQjEsIDB4OURBRCwgMHg5RENDLCAweDlEQjMsCi0gICAgMHg5RENELCAweDlEQjIsIDB4OUU3QSwgMHg5RTlDLCAweDlFRUIsIDB4OUVFRSwgMHg5RUVELCAweDlGMUIsCi0gICAgMHg5RjE4LCAweDlGMUEsIDB4OUYzMSwgMHg5RjRFLCAweDlGNjUsIDB4OUY2NCwgMHg5RjkyLCAweDRFQjksCi0gICAgMHg1NkM2LCAweDU2QzUsIDB4NTZDQiwgMHg1OTcxLCAweDVCNEIsIDB4NUI0QywgMHg1REQ1LCAweDVERDEsCi0gICAgMHg1RUYyLCAweDY1MjEsIDB4NjUyMCwgMHg2NTI2LCAweDY1MjIsIDB4NkIwQiwgMHg2QjA4LCAweDZCMDksCi0gICAgMHg2QzBELCAweDcwNTUsIDB4NzA1NiwgMHg3MDU3LCAweDcwNTIsIDB4NzIxRSwgMHg3MjFGLCAweDcyQTksCi0gICAgMHg3MzdGLCAweDc0RDgsIDB4NzRENSwgMHg3NEQ5LCAweDc0RDcsIDB4NzY2RCwgMHg3NkFELCAweDc5MzUsCi0gICAgMHg3OUI0LCAweDdBNzAsIDB4N0E3MSwgMHg3QzU3LCAweDdDNUMsIDB4N0M1OSwgMHg3QzVCLCAweDdDNUEsCi0gICAgMHg3Q0Y0LCAweDdDRjEsIDB4N0U5MSwgMHg3RjRGLCAweDdGODcsIDB4ODFERSwgMHg4MjZCLCAweDg2MzQsCi0gICAgMHg4NjM1LCAweDg2MzMsIDB4ODYyQywgMHg4NjMyLCAweDg2MzYsIDB4ODgyQywgMHg4ODI4LCAweDg4MjYsCi0gICAgMHg4ODJBLCAweDg4MjUsIDB4ODk3MSwgMHg4OUJGLCAweDg5QkUsIDB4ODlGQiwgMHg4QjdFLCAweDhCODQsCi0gICAgMHg4QjgyLCAweDhCODYsIDB4OEI4NSwgMHg4QjdGLCAweDhEMTUsIDB4OEU5NSwgMHg4RTk0LCAweDhFOUEsCi0gICAgMHg4RTkyLCAweDhFOTAsIDB4OEU5NiwgMHg4RTk3LCAweDhGNjAsIDB4OEY2MiwgMHg5MTQ3LCAweDk0NEMsCi0gICAgMHg5NDUwLCAweDk0NEEsIDB4OTQ0QiwgMHg5NDRGLCAweDk0NDcsIDB4OTQ0NSwgMHg5NDQ4LCAweDk0NDksCi0gICAgMHg5NDQ2LCAweDk3M0YsIDB4OTdFMywgMHg5ODZBLCAweDk4NjksIDB4OThDQiwgMHg5OTU0LCAweDk5NUIsCi0gICAgMHg5QTRFLCAweDlBNTMsIDB4OUE1NCwgMHg5QTRDLCAweDlBNEYsIDB4OUE0OCwgMHg5QTRBLCAweDlBNDksCi0gICAgMHg5QTUyLCAweDlBNTAsIDB4OUFEMCwgMHg5QjE5LCAweDlCMkIsIDB4OUIzQiwgMHg5QjU2LCAweDlCNTUsCi0gICAgMHg5QzQ2LCAweDlDNDgsIDB4OUMzRiwgMHg5QzQ0LCAweDlDMzksIDB4OUMzMywgMHg5QzQxLCAweDlDM0MsCi0gICAgMHg5QzM3LCAweDlDMzQsIDB4OUMzMiwgMHg5QzNELCAweDlDMzYsIDB4OUREQiwgMHg5REQyLCAweDlEREUsCi0gICAgMHg5RERBLCAweDlEQ0IsIDB4OUREMCwgMHg5RERDLCAweDlERDEsIDB4OURERiwgMHg5REU5LCAweDlERDksCi0gICAgMHg5REQ4LCAweDlERDYsIDB4OURGNSwgMHg5REQ1LCAweDlEREQsIDB4OUVCNiwgMHg5RUYwLCAweDlGMzUsCi0gICAgMHg5RjMzLCAweDlGMzIsIDB4OUY0MiwgMHg5RjZCLCAweDlGOTUsIDB4OUZBMiwgMHg1MTNELCAweDUyOTksCi0gICAgMHg1OEU4LCAweDU4RTcsIDB4NTk3MiwgMHg1QjRELCAweDVERDgsIDB4ODgyRiwgMHg1RjRGLCAweDYyMDEsCi0gICAgMHg2MjAzLCAweDYyMDQsIDB4NjUyOSwgMHg2NTI1LCAweDY1OTYsIDB4NjZFQiwgMHg2QjExLCAweDZCMTIsCi0gICAgMHg2QjBGLCAweDZCQ0EsIDB4NzA1QiwgMHg3MDVBLCAweDcyMjIsIDB4NzM4MiwgMHg3MzgxLCAweDczODMsCi0gICAgMHg3NjcwLCAweDc3RDQsIDB4N0M2NywgMHg3QzY2LCAweDdFOTUsIDB4ODI2QywgMHg4NjNBLCAweDg2NDAsCi0gICAgMHg4NjM5LCAweDg2M0MsIDB4ODYzMSwgMHg4NjNCLCAweDg2M0UsIDB4ODgzMCwgMHg4ODMyLCAweDg4MkUsCi0gICAgMHg4ODMzLCAweDg5NzYsIDB4ODk3NCwgMHg4OTczLCAweDg5RkUsIDB4OEI4QywgMHg4QjhFLCAweDhCOEIsCi0gICAgMHg4Qjg4LCAweDhDNDUsIDB4OEQxOSwgMHg4RTk4LCAweDhGNjQsIDB4OEY2MywgMHg5MUJDLCAweDk0NjIsCi0gICAgMHg5NDU1LCAweDk0NUQsIDB4OTQ1NywgMHg5NDVFLCAweDk3QzQsIDB4OTdDNSwgMHg5ODAwLCAweDlBNTYsCi0gICAgMHg5QTU5LCAweDlCMUUsIDB4OUIxRiwgMHg5QjIwLCAweDlDNTIsIDB4OUM1OCwgMHg5QzUwLCAweDlDNEEsCi0gICAgMHg5QzRELCAweDlDNEIsIDB4OUM1NSwgMHg5QzU5LCAweDlDNEMsIDB4OUM0RSwgMHg5REZCLCAweDlERjcsCi0gICAgMHg5REVGLCAweDlERTMsIDB4OURFQiwgMHg5REY4LCAweDlERTQsIDB4OURGNiwgMHg5REUxLCAweDlERUUsCi0gICAgMHg5REU2LCAweDlERjIsIDB4OURGMCwgMHg5REUyLCAweDlERUMsIDB4OURGNCwgMHg5REYzLCAweDlERTgsCi0gICAgMHg5REVELCAweDlFQzIsIDB4OUVEMCwgMHg5RUYyLCAweDlFRjMsIDB4OUYwNiwgMHg5RjFDLCAweDlGMzgsCi0gICAgMHg5RjM3LCAweDlGMzYsIDB4OUY0MywgMHg5RjRGLCAweDlGNzEsIDB4OUY3MCwgMHg5RjZFLCAweDlGNkYsCi0gICAgMHg1NkQzLCAweDU2Q0QsIDB4NUI0RSwgMHg1QzZELCAweDY1MkQsIDB4NjZFRCwgMHg2NkVFLCAweDZCMTMsCi0gICAgMHg3MDVGLCAweDcwNjEsIDB4NzA1RCwgMHg3MDYwLCAweDcyMjMsIDB4NzREQiwgMHg3NEU1LCAweDc3RDUsCi0gICAgMHg3OTM4LCAweDc5QjcsIDB4NzlCNiwgMHg3QzZBLCAweDdFOTcsIDB4N0Y4OSwgMHg4MjZELCAweDg2NDMsCi0gICAgMHg4ODM4LCAweDg4MzcsIDB4ODgzNSwgMHg4ODRCLCAweDhCOTQsIDB4OEI5NSwgMHg4RTlFLCAweDhFOUYsCi0gICAgMHg4RUEwLCAweDhFOUQsIDB4OTFCRSwgMHg5MUJELCAweDkxQzIsIDB4OTQ2QiwgMHg5NDY4LCAweDk0NjksCi0gICAgMHg5NkU1LCAweDk3NDYsIDB4OTc0MywgMHg5NzQ3LCAweDk3QzcsIDB4OTdFNSwgMHg5QTVFLCAweDlBRDUsCi0gICAgMHg5QjU5LCAweDlDNjMsIDB4OUM2NywgMHg5QzY2LCAweDlDNjIsIDB4OUM1RSwgMHg5QzYwLCAweDlFMDIsCi0gICAgMHg5REZFLCAweDlFMDcsIDB4OUUwMywgMHg5RTA2LCAweDlFMDUsIDB4OUUwMCwgMHg5RTAxLCAweDlFMDksCi0gICAgMHg5REZGLCAweDlERkQsIDB4OUUwNCwgMHg5RUEwLCAweDlGMUUsIDB4OUY0NiwgMHg5Rjc0LCAweDlGNzUsCi0gICAgMHg5Rjc2LCAweDU2RDQsIDB4NjUyRSwgMHg2NUI4LCAweDZCMTgsIDB4NkIxOSwgMHg2QjE3LCAweDZCMUEsCi0gICAgMHg3MDYyLCAweDcyMjYsIDB4NzJBQSwgMHg3N0Q4LCAweDc3RDksIDB4NzkzOSwgMHg3QzY5LCAweDdDNkIsCi0gICAgMHg3Q0Y2LCAweDdFOUEsIDB4N0U5OCwgMHg3RTlCLCAweDdFOTksIDB4ODFFMCwgMHg4MUUxLCAweDg2NDYsCi0gICAgMHg4NjQ3LCAweDg2NDgsIDB4ODk3OSwgMHg4OTdBLCAweDg5N0MsIDB4ODk3QiwgMHg4OUZGLCAweDhCOTgsCi0gICAgMHg4Qjk5LCAweDhFQTUsIDB4OEVBNCwgMHg4RUEzLCAweDk0NkUsIDB4OTQ2RCwgMHg5NDZGLCAweDk0NzEsCi0gICAgMHg5NDczLCAweDk3NDksIDB4OTg3MiwgMHg5OTVGLCAweDlDNjgsIDB4OUM2RSwgMHg5QzZELCAweDlFMEIsCi0gICAgMHg5RTBELCAweDlFMTAsIDB4OUUwRiwgMHg5RTEyLCAweDlFMTEsIDB4OUVBMSwgMHg5RUY1LCAweDlGMDksCi0gICAgMHg5RjQ3LCAweDlGNzgsIDB4OUY3QiwgMHg5RjdBLCAweDlGNzksIDB4NTcxRSwgMHg3MDY2LCAweDdDNkYsCi0gICAgMHg4ODNDLCAweDhEQjIsIDB4OEVBNiwgMHg5MUMzLCAweDk0NzQsIDB4OTQ3OCwgMHg5NDc2LCAweDk0NzUsCi0gICAgMHg5QTYwLCAweDlCMkUsIDB4OUM3NCwgMHg5QzczLCAweDlDNzEsIDB4OUM3NSwgMHg5RTE0LCAweDlFMTMsCi0gICAgMHg5RUY2LCAweDlGMEEsIDB4OUZBNCwgMHg3MDY4LCAweDcwNjUsIDB4N0NGNywgMHg4NjZBLCAweDg4M0UsCi0gICAgMHg4ODNELCAweDg4M0YsIDB4OEI5RSwgMHg4QzlDLCAweDhFQTksIDB4OEVDOSwgMHg5NzRCLCAweDk4NzMsCi0gICAgMHg5ODc0LCAweDk4Q0MsIDB4OTk2MSwgMHg5OUFCLCAweDlBNjQsIDB4OUE2NiwgMHg5QTY3LCAweDlCMjQsCi0gICAgMHg5RTE1LCAweDlFMTcsIDB4OUY0OCwgMHg2MjA3LCAweDZCMUUsIDB4NzIyNywgMHg4NjRDLCAweDhFQTgsCi0gICAgMHg5NDgyLCAweDk0ODAsIDB4OTQ4MSwgMHg5QTY5LCAweDlBNjgsIDB4OUUxOSwgMHg4NjRCLCAweDhCOUYsCi0gICAgMHg5NDgzLCAweDlDNzksIDB4OUVCNywgMHg3Njc1LCAweDlBNkIsIDB4OUM3QSwgMHg5RTFELCAweDcwNjksCi0gICAgMHg3MDZBLCAweDcyMjksIDB4OUVBNCwgMHg5RjdFLCAweDlGNDksIDB4OUY5OCwgMHhGRTE5LCAweDIyM0MsCi0gICAgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCi0gICAgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsCi0gICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCi0gICAgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsCi0gICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCi0gICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsCi0gICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCi0gICAgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsCi0gICAgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCi0gICAgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsCi0gICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCi0gICAgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLCAweEZFMzMsCi0gICAgMHgyNTc0LCAweEZFMzQsIDB4RkU0RiwgMHgwMzA4LCAweEZGM0UsIDB4MzBGRCwgMHgzMEZFLCAweDMwOUQsCi0gICAgMHgzMDlFLCAweEZGRkQsIDB4MzAwNSwgMHgzMDA2LCAweDMwMDcsIDB4MzBGQywgMHhGRjNCLCAweEZGM0QsCi0gICAgMHgyNzNELCAweDMwNDEsIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsCi0gICAgMHgzMDQ4LCAweDMwNDksIDB4MzA0QSwgMHgzMDRCLCAweDMwNEMsIDB4MzA0RCwgMHgzMDRFLCAweDMwNEYsCi0gICAgMHgzMDUwLCAweDMwNTEsIDB4MzA1MiwgMHgzMDUzLCAweDMwNTQsIDB4MzA1NSwgMHgzMDU2LCAweDMwNTcsCi0gICAgMHgzMDU4LCAweDMwNTksIDB4MzA1QSwgMHgzMDVCLCAweDMwNUMsIDB4MzA1RCwgMHgzMDVFLCAweDMwNUYsCi0gICAgMHgzMDYwLCAweDMwNjEsIDB4MzA2MiwgMHgzMDYzLCAweDMwNjQsIDB4MzA2NSwgMHgzMDY2LCAweDMwNjcsCi0gICAgMHgzMDY4LCAweDMwNjksIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsCi0gICAgMHgzMDcwLCAweDMwNzEsIDB4MzA3MiwgMHgzMDczLCAweDMwNzQsIDB4MzA3NSwgMHgzMDc2LCAweDMwNzcsCi0gICAgMHgzMDc4LCAweDMwNzksIDB4MzA3QSwgMHgzMDdCLCAweDMwN0MsIDB4MzA3RCwgMHgzMDdFLCAweDMwN0YsCi0gICAgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDgzLCAweDMwODQsIDB4MzA4NSwgMHgzMDg2LCAweDMwODcsCi0gICAgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhFLCAweDMwOEYsCi0gICAgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLCAweDMwQTEsIDB4MzBBMiwgMHgzMEEzLCAweDMwQTQsCi0gICAgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywgMHgzMEE4LCAweDMwQTksIDB4MzBBQSwgMHgzMEFCLCAweDMwQUMsCi0gICAgMHgzMEFELCAweDMwQUUsIDB4MzBBRiwgMHgzMEIwLCAweDMwQjEsIDB4MzBCMiwgMHgzMEIzLCAweDMwQjQsCi0gICAgMHgzMEI1LCAweDMwQjYsIDB4MzBCNywgMHgzMEI4LCAweDMwQjksIDB4MzBCQSwgMHgzMEJCLCAweDMwQkMsCi0gICAgMHgzMEJELCAweDMwQkUsIDB4MzBCRiwgMHgzMEMwLCAweDMwQzEsIDB4MzBDMiwgMHgzMEMzLCAweDMwQzQsCi0gICAgMHgzMEM1LCAweDMwQzYsIDB4MzBDNywgMHgzMEM4LCAweDMwQzksIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsCi0gICAgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwgMHgzMEQwLCAweDMwRDEsIDB4MzBEMiwgMHgzMEQzLCAweDMwRDQsCi0gICAgMHgzMEQ1LCAweDMwRDYsIDB4MzBENywgMHgzMEQ4LCAweDMwRDksIDB4MzBEQSwgMHgzMERCLCAweDMwREMsCi0gICAgMHgzMERELCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEUzLCAweDMwRTQsCi0gICAgMHgzMEU1LCAweDMwRTYsIDB4MzBFNywgMHgzMEU4LCAweDMwRTksIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsCi0gICAgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLCAweDMwRjQsCi0gICAgMHgzMEY1LCAweDMwRjYsIDB4MDQxMCwgMHgwNDExLCAweDA0MTIsIDB4MDQxMywgMHgwNDE0LCAweDA0MTUsCi0gICAgMHgwNDAxLCAweDA0MTYsIDB4MDQxNywgMHgwNDE4LCAweDA0MTksIDB4MDQxQSwgMHgwNDFCLCAweDA0MUMsCi0gICAgMHgwNDFELCAweDA0MUUsIDB4MDQxRiwgMHgwNDIwLCAweDA0MjEsIDB4MDQyMiwgMHgwNDIzLCAweDA0MjQsCi0gICAgMHgwNDI1LCAweDA0MjYsIDB4MDQyNywgMHgwNDI4LCAweDA0MjksIDB4MDQyQSwgMHgwNDJCLCAweDA0MkMsCi0gICAgMHgwNDJELCAweDA0MkUsIDB4MDQyRiwgMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLCAweDA0MzQsCi0gICAgMHgwNDM1LCAweDA0NTEsIDB4MDQzNiwgMHgwNDM3LCAweDA0MzgsIDB4MDQzOSwgMHgwNDNBLCAweDA0M0IsCi0gICAgMHgwNDNDLCAweDA0M0QsIDB4MDQzRSwgMHgwNDNGLCAweDA0NDAsIDB4MDQ0MSwgMHgwNDQyLCAweDA0NDMsCi0gICAgMHgwNDQ0LCAweDA0NDUsIDB4MDQ0NiwgMHgwNDQ3LCAweDA0NDgsIDB4MDQ0OSwgMHgwNDRBLCAweDA0NEIsCi0gICAgMHgwNDRDLCAweDA0NEQsIDB4MDQ0RSwgMHgwNDRGLCAweDIxRTcsIDB4MjFCOCwgMHgyMUI5LCAweDRFNDEsCi0gICAgMHgwMDAwLCAweDRFNUEsIDB4MDAwMCwgMHg1MjAyLCAweDQ0OTEsIDB4OUZCMCwgMHg1MTg4LCAweDlGQjEsCi0gICAgMHgwMDAwLCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCi0gICAgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCi0gICAgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCi0gICAgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCi0gICAgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCi0gICAgMHhGRkZELCAweDAwQUMsIDB4RkZFNCwgMHhGRjA3LCAweEZGMDIsIDB4MzIzMSwgMHgyMTE2LCAweDIxMjEsCi0gICAgMHg3ODgxLCAweDkyQjksIDB4ODhDRiwgMHg1OEJCLCAweDYwNTIsIDB4N0NBNywgMHg1QUZBLCAweDI1NTQsCi0gICAgMHgyNTY2LCAweDI1NTcsIDB4MjU2MCwgMHgyNTZDLCAweDI1NjMsIDB4MjU1QSwgMHgyNTY5LCAweDI1NUQsCi0gICAgMHgyNTUyLCAweDI1NjQsIDB4MjU1NSwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHgyNTU4LCAweDI1NjcsCi0gICAgMHgyNTVCLCAweDI1NTMsIDB4MjU2NSwgMHgyNTU2LCAweDI1NUYsIDB4MjU2QiwgMHgyNTYyLCAweDI1NTksCi0gICAgMHgyNTY4LCAweDI1NUMsIDB4MjU1MSwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCi0gICAgMHgyNTkzLCAweEZGRkQsIDB4RkZGRCwgMHhGRTEwLCAweEZFMTEsIDB4RkUxMiwgMHhGRkZELCAweEZFMTQsCi0gICAgMHhGRTEzLCAweEZFMTYsIDB4RkUxNSwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCi0gICAgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCi0gICAgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHgwMDAwLCAweDU3QkUsIDB4MDAwMCwgMHg3MTNFLCAweDAwMDAsCi0gICAgMHg2OUEyLCAweDAwMDAsIDB4NUI3NCwgMHg3QTQ5LCAweDAwMDAsIDB4MDAwMCwgMHg3QTY1LCAweDdBN0QsCi0gICAgMHgwMDAwLCAweDdBQkIsIDB4N0FCMCwgMHg3QUMyLCAweDdBQzMsIDB4NzFEMSwgMHgwMDAwLCAweDQxQ0EsCi0gICAgMHg3QURBLCAweDdBREQsIDB4N0FFQSwgMHg0MUVGLCAweDU0QjIsIDB4MDAwMCwgMHg3QjBCLCAweDdCNTUsCi0gICAgMHg3QjI5LCAweDAwMDAsIDB4MDAwMCwgMHg3QkEyLCAweDdCNkYsIDB4ODM5QywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg3QkQwLCAweDg0MjEsIDB4N0I5MiwgMHhGRkZELCAweDAwMDAsIDB4RkZGRCwgMHg4NDkyLCAweDdCRkEsCi0gICAgMHhGRkZELCAweDdDMzUsIDB4MDAwMCwgMHg3QzQ0LCAweDdDODMsIDB4MDAwMCwgMHg3Q0E2LCAweDAwMDAsCi0gICAgMHg3Q0M5LCAweDdDQzcsIDB4N0NFNiwgMHhGRkZELCAweDdDRjMsIDB4N0NGNSwgMHg3RTY3LCAweDQ1MUQsCi0gICAgMHgwMDAwLCAweDdENUQsIDB4MDAwMCwgMHg3RDg5LCAweDdEQUIsIDB4NzEzNSwgMHg3REIzLCAweDdERDYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4N0RFNCwgMHgzRDEzLCAweDdERjUsIDB4MDAwMCwgMHg3REU1LCAweDAwMDAsCi0gICAgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHg3RTZFLCAweEZGRkQsIDB4NDMyQiwgMHg5NDZDLCAweDdFMjcsCi0gICAgMHg3RjQwLCAweDdGNDEsIDB4N0Y0NywgMHg3OTM2LCAweDAwMDAsIDB4OTlFMSwgMHg3Rjk3LCAweDAwMDAsCi0gICAgMHg3RkEzLCAweDAwMDAsIDB4MDAwMCwgMHg0NTVDLCAweDAwMDAsIDB4MDAwMCwgMHg3RkZBLCAweDAwMDAsCi0gICAgMHhGQTVCLCAweDgwMDgsIDB4ODAxRCwgMHhGRkZELCAweDgwMkYsIDB4MDAwMCwgMHgwMDAwLCAweDgwM0IsCi0gICAgMHg4MDNDLCAweDgwNjEsIDB4MDAwMCwgMHg0OTg5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY3MjUsCi0gICAgMHg4MEE3LCAweDAwMDAsIDB4ODEwNywgMHg4MTFBLCAweDU4QjAsIDB4MDAwMCwgMHg2QzdGLCAweDAwMDAsCi0gICAgMHg2NEU3LCAweDAwMDAsIDB4ODIxOCwgMHgwMDAwLCAweDZBNTMsIDB4MDAwMCwgMHgwMDAwLCAweDQ0N0EsCi0gICAgMHg4MjI5LCAweDAwMDAsIDB4MDAwMCwgMHg0RkY5LCAweDAwMDAsIDB4ODRFMiwgMHg4MzYyLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgyQUEsIDB4NjkxQiwgMHgwMDAwLCAweDQxREIsCi0gICAgMHg4NTRCLCAweDgyRDAsIDB4ODMxQSwgMHgwMDAwLCAweDAwMDAsIDB4MzZDMSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4MjdCLCAweDgyRTIsIDB4ODMxOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzREJGLCAweDgzMUQsIDB4NTVFQywgMHg4Mzg1LCAweDQ1MEIsIDB4MDAwMCwgMHg4M0FDLCAweEZGRkQsCi0gICAgMHg4M0QzLCAweDAwMDAsIDB4NkE1NywgMHg4NTVBLCAweDM0OTYsIDB4MDAwMCwgMHg4NDU4LCAweDAwMDAsCi0gICAgMHg4NDcxLCAweDNERDMsIDB4NDRFNCwgMHg2QUE3LCAweDg0NEEsIDB4Nzk1OCwgMHhGRkZELCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODRERSwgMHhGRkZELCAweDgzOTEsIDB4NDRBMCwgMHg4NDkzLCAweDg0RTQsCi0gICAgMHgwMDAwLCAweDQyNDAsIDB4MDAwMCwgMHg0NTQzLCAweDg1MzQsIDB4NUFGMiwgMHg0NTIzLCAweDQ1MjcsCi0gICAgMHg4NTczLCAweDQ1MTYsIDB4NjdCRiwgMHg4NjE2LCAweDAwMDAsIDB4MDAwMCwgMHg4NUMxLCAweDAwMDAsCi0gICAgMHg4NjAyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQ1NkEsIDB4ODYyOCwgMHgzNjQ4LCAweDAwMDAsCi0gICAgMHg1M0Y3LCAweDAwMDAsIDB4ODY3RSwgMHhGRkZELCAweDAwMDAsIDB4ODdFRSwgMHgwMDAwLCAweDg3QjEsCi0gICAgMHg4N0RBLCAweDg4MEYsIDB4NTY2MSwgMHg4NjZDLCAweDY4NTYsIDB4NDYwRiwgMHg4ODQ1LCAweDg4NDYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODVFLCAweDg4OUMsIDB4NDY1QiwgMHg4OEI0LCAweDg4QjUsCi0gICAgMHg4OEM1LCAweDAwMDAsIDB4ODk4NywgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHg4OUE3LCAweDg5QkMsCi0gICAgMHgwMDAwLCAweDg5RTcsIDB4MDAwMCwgMHgwMDAwLCAweDhBOUMsIDB4Nzc5MywgMHg5MUZFLCAweDhBOTAsCi0gICAgMHgwMDAwLCAweDdBRTksIDB4MDAwMCwgMHg0NzEzLCAweDAwMDAsIDB4NzE3QywgMHg4QjBDLCAweDhCMUYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEIzRiwgMHhGRkZELCAweDhCNEQsIDB4OEFBOSwgMHgwMDAwLCAweDhCOTAsCi0gICAgMHg4QjlCLCAweDhBQUYsIDB4MDAwMCwgMHg0NjE1LCAweDg4NEYsIDB4OEM5QiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDM3MjUsIDB4MDAwMCwgMHg4Q0Q2LCAweDAwMDAsIDB4MDAwMCwgMHg4RDEyLCAweDhEMDMsCi0gICAgMHgwMDAwLCAweDhDREIsIDB4NzA1QywgMHg4RDExLCAweDNFRDAsIDB4MDAwMCwgMHg4REE5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4M0I3QywgMHgwMDAwLCAweDAwMDAsIDB4N0FFNywgMHg4RUFELCAweDhFQjYsCi0gICAgMHg4RUMzLCAweDkyRDQsIDB4OEYxOSwgMHg4RjJELCAweDAwMDAsIDB4MDAwMCwgMHg4RkE1LCAweDkzMDMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEZCMywgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDVFRjgsCi0gICAgMHgwMDAwLCAweDhGRjksIDB4RkZGRCwgMHgwMDAwLCAweDM5ODAsIDB4MDAwMCwgMHg5MDM3LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDkwNjEsIDB4MDAwMCwgMHgwMDAwLCAweDkwQTgsIDB4MDAwMCwgMHg5MEM0LCAweDAwMDAsCi0gICAgMHg5MEFFLCAweEZBMjYsIDB4OTE2NywgMHg5MUE5LCAweDkxQzQsIDB4N0NBQywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5MjBFLCAweDZDOUYsIDB4OTI0MSwgMHg5MjYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTMyQywgMHg5MzZCLCAweDAwMDAsIDB4MDAwMCwgMHg1QUMzLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDQ5NjUsIDB4OTI0NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MzczLCAweDk0NUIsCi0gICAgMHg4RUJDLCAweDk1ODUsIDB4OTVBNiwgMHg5NDI2LCAweDk1QTAsIDB4NkZGNiwgMHg0MkI5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NDlERiwgMHg2QzFDLCAweDk2N0IsIDB4OTY5NiwgMHg0MTZDLCAweDk2QTMsCi0gICAgMHgwMDAwLCAweDYxREEsIDB4RTRBRCwgMHg3OEY1LCAweDAwMDAsIDB4OTZCRCwgMHg1M0NDLCAweDQ5QTEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5NzMxLCAweDg2NDIsIDB4OTczNiwgMHg0QTBGLCAweDQ1M0QsIDB4NDU4NSwgMHgwMDAwLCAweDcwNzUsCi0gICAgMHg1QjQxLCAweDk3MUIsIDB4RkZGRCwgMHgwMDAwLCAweDk3NTcsIDB4NUI0QSwgMHgwMDAwLCAweDk3NUYsCi0gICAgMHg5NDI1LCAweDUwRDAsIDB4MDAwMCwgMHgwMDAwLCAweDk3ODksIDB4OTc5RiwgMHg5N0IxLCAweDk3QkUsCi0gICAgMHg5N0MwLCAweDk3RDIsIDB4OTdFMCwgMHgwMDAwLCAweDk3RUUsIDB4NzQxQywgMHgwMDAwLCAweEZGRkQsCi0gICAgMHg5N0Y1LCAweDAwMDAsIDB4MDAwMCwgMHg0QUQxLCAweDk4MzQsIDB4OTgzMywgMHg5ODRCLCAweDk4NjYsCi0gICAgMHgzQjBFLCAweDAwMDAsIDB4M0Q1MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5OENBLCAweDk4QjcsCi0gICAgMHg5OEM4LCAweDk4QzcsIDB4NEFGRiwgMHgwMDAwLCAweDAwMDAsIDB4NTVCMCwgMHg5OEUxLCAweDk4RTYsCi0gICAgMHg5OEVDLCAweDkzNzgsIDB4OTkzOSwgMHgwMDAwLCAweDRCNzIsIDB4MDAwMCwgMHgwMDAwLCAweDk5RjUsCi0gICAgMHg5QTBDLCAweDlBM0IsIDB4OUExMCwgMHg5QTU4LCAweDAwMDAsIDB4MzZDNCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5QUUwLCAweDlBRTIsIDB4MDAwMCwgMHg5QUY0LCAweDRDMEUsIDB4OUIxNCwgMHg5QjJELCAweDAwMDAsCi0gICAgMHg1MDM0LCAweDlCMzQsIDB4MzhDMywgMHgwMDAwLCAweDlCNTAsIDB4OUI0MCwgMHgwMDAwLCAweDVBNDUsCi0gICAgMHgwMDAwLCAweDlCOEUsIDB4OUMwMiwgMHg5QkZGLCAweDlDMEMsIDB4MDAwMCwgMHg5REQ0LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OUQ3RSwgMHg5RDgzLCAweDAwMDAsCi0gICAgMHg5RTBFLCAweDlEQzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5RDM5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDlFOTAsIDB4OUU5NSwgMHg5RTlFLCAweDlFQTIsIDB4NEQzNCwgMHg5RUFBLCAweDlFQUYsCi0gICAgMHgwMDAwLCAweDlFQzEsIDB4M0I2MCwgMHgzOUU1LCAweDNEMUQsIDB4NEYzMiwgMHgzN0JFLCAweDAwMDAsCi0gICAgMHg5RjAyLCAweDlGMDgsIDB4NEI5NiwgMHg5NDI0LCAweDAwMDAsIDB4OUYxNywgMHgwMDAwLCAweDlGMzksCi0gICAgMHg1NjlGLCAweDU2OEEsIDB4OUY0NSwgMHg5OUI4LCAweDAwMDAsIDB4OTdGMiwgMHg4NDdGLCAweEZGRkQsCi0gICAgMHg5RjY5LCAweDdBREMsIDB4OUY4RSwgMHg3MjE2LCAweDRCQkUsIDB4MDAwMCwgMHgwMDAwLCAweDcxNzcsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3MzlFLCAweDAwMDAsIDB4MDAwMCwgMHg3OTlGLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDkzNjksIDB4OTNGMywgMHgwMDAwLCAweDkyRUMsIDB4OTM4MSwgMHg5M0NCLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDcyMTcsIDB4M0VFQiwgMHg3NzcyLCAweDdBNDMsIDB4NzBEMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg3MTdFLCAweDAwMDAsIDB4NzBBMywgMHgwMDAwLCAweDAwMDAsIDB4M0VDNywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDM3MjIsIDB4MDAwMCwgMHgwMDAwLCAweDM2RTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzNzIzLCAweDAwMDAsIDB4NTc1QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4NTAzLCAweDAwMDAsIDB4RkZGRCwgMHg4NDU1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NDRGNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg2N0Y5LCAweDM3MzMsCi0gICAgMHgzQzE1LCAweDNERTcsIDB4NTg2QywgMHgwMDAwLCAweDY4MTAsIDB4NDA1NywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NENCLCAweDU2OUUsIDB4MDAwMCwgMHg1NjkyLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDkzOUMsIDB4NEVGOCwgMHg1MTJCLCAweDM4MTksCi0gICAgMHgwMDAwLCAweDRFQkMsIDB4MDAwMCwgMHhGRkZELCAweDRGNEIsIDB4NEY4QSwgMHgwMDAwLCAweDVBNjgsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4Mzk5OSwgMHgwMDAwLCAweDAwMDAsIDB4MzQzNSwgMHg0RjI5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEFEQSwgMHgwMDAwLCAweDRFOTgsIDB4NTBDRCwgMHg1MTBELCAweDRGQTIsCi0gICAgMHg0RjAzLCAweDAwMDAsIDB4MDAwMCwgMHg0RjQyLCAweDUwMkUsIDB4NTA2QywgMHg1MDgxLCAweDRGQ0MsCi0gICAgMHg0RkU1LCAweDUwNTgsIDB4NTBGQywgMHg2RTc2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDZENzIsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NTFBOCwgMHg1MUMzLCAweDAwMDAsIDB4NDRERCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhEN0EsIDB4MDAwMCwgMHgwMDAwLCAweDUyNTksIDB4NTJBNCwgMHgwMDAwLCAweDUyRTEsCi0gICAgMHhGRkZELCAweDQ2N0EsIDB4NzE4QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY5RDEsCi0gICAgMHgwMDAwLCAweEZGRkQsIDB4M0VERSwgMHg3NDk5LCAweDc0MTQsIDB4NzQ1NiwgMHg3Mzk4LCAweDRCOEUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NTNEMCwgMHgzNTg0LCAweDcyMEYsIDB4MDAwMCwgMHg1NUI0LCAweDAwMDAsCi0gICAgMHg1NENELCAweDAwMDAsIDB4NTcxRCwgMHg5MjVELCAweDk2RjQsIDB4NTdERCwgMHg1NzhELCAweDU3N0YsCi0gICAgMHgzNjNFLCAweDU4Q0IsIDB4NUE5OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDVBMkMsCi0gICAgMHg1OUI4LCAweDVBN0UsIDB4NUFDRiwgMHg1QTEyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzNkY1LCAweDZEMDUsIDB4NzQ0MywgMHg1QTIxLCAweDAwMDAsIDB4NUE4MSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5M0UwLCAweDc0OEMsIDB4MDAwMCwgMHg3MTA1LCAweDQ5NzIsIDB4OTQwOCwgMHgwMDAwLCAweDkzQkQsCi0gICAgMHgzN0EwLCAweDVDMUUsIDB4NUM5RSwgMHg1RTVFLCAweDVFNDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1RUNELCAweDVCNEYsIDB4MDAwMCwgMHgwMDAwLCAweDM3MDEsIDB4MDAwMCwgMHgzNkRELCAweDAwMDAsCi0gICAgMHgzNkQzLCAweDgxMkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1RjBDLCAweDVGMEUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NUE2QiwgMHgwMDAwLCAweDVCNDQsIDB4MDAwMCwgMHg4ODYwLCAweDYwN0UsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NUZEQiwgMHgzRUI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg2MUMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDYxOTksIDB4NjE5OCwgMHg2MDc1LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg2NDcxLCAweDAwMDAsIDB4MDAwMCwgMHgzQTI5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg2MzM3LCAweDY0QjYsIDB4NjMzMSwgMHg2M0QxLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDYyQTQsIDB4MDAwMCwgMHg2NDNCLCAweDY1NkIsIDB4Njk3MiwgMHgzQkY0LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NTBELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY2Q0UsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4M0FFMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDc4RUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzQ2NCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDY2OEUsIDB4MDAwMCwgMHg2NjZCLCAweDRCOTMsIDB4NjYzMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg2NjYzLCAweDAwMDAsIDB4MDAwMCwgMHg2NjFFLCAweDAwMDAsIDB4MzhEMSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzQjk5LCAweDAwMDAsIDB4MDAwMCwgMHg3NEQwLCAweDNCOTYsIDB4MDAwMCwgMHg2OEI2LCAweEZGRkQsCi0gICAgMHgzQkM0LCAweDZBQkUsIDB4MDAwMCwgMHgwMDAwLCAweDZBMzMsIDB4NkE1MiwgMHg2QUM5LCAweDZCMDUsCi0gICAgMHgwMDAwLCAweDY1MTEsIDB4Njg5OCwgMHg2QTRDLCAweDNCRDcsIDB4NkE3QSwgMHg2QjU3LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDkzQTAsIDB4OTJGMiwgMHgwMDAwLCAweDAwMDAsIDB4OTI4OSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5NDY3LCAweDZEQTUsIDB4NkYwQiwgMHhGRkZELCAweDAwMDAsIDB4M0Q4RiwgMHg2RTA0LCAweDAwMDAsCi0gICAgMHg1QTNELCAweDZFMEEsIDB4NTg0NywgMHg2RDI0LCAweDc4NDIsIDB4NzEzQiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg3MEYxLCAweDcyNTAsIDB4NzI4NywgMHg3Mjk0LCAweDAwMDAsIDB4MDAwMCwgMHg1MTc5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDc0N0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNGMDYsCi0gICAgMHgzRUIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDYwQTcsIDB4M0VGMywgMHg3NENDLCAweDc0M0MsCi0gICAgMHg5Mzg3LCAweDc0MzcsIDB4NDQ5RiwgMHgwMDAwLCAweDQ1NTEsIDB4NzU4MywgMHgzRjYzLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDNGNTgsIDB4NzU1NSwgMHg3NjczLCAweDAwMDAsIDB4RkZGRCwgMHg3NDY4LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4M0FGQiwgMHgzRENELCAweDAwMDAsIDB4M0VGRiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5MUZBLCAweDU3MzIsIDB4OTM0MiwgMHgwMDAwLCAweDAwMDAsIDB4NTBERiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg3Nzc4LCAweDAwMDAsIDB4NzcwRSwgMHg3NzBGLCAweDc3N0IsIDB4MDAwMCwgMHgwMDAwLCAweDNBNUUsCi0gICAgMHgwMDAwLCAweDc0MzgsIDB4NzQ5QiwgMHgzRUJGLCAweDAwMDAsIDB4MDAwMCwgMHg0MEM4LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDkzMDcsIDB4MDAwMCwgMHg3ODFFLCAweDc4OEQsIDB4Nzg4OCwgMHg3OEQyLCAweDczRDAsCi0gICAgMHg3OTU5LCAweDAwMDAsIDB4MDAwMCwgMHg0MTBFLCAweEZGRkQsIDB4RkZGRCwgMHg3OUE1LCAweDZBMkQsCi0gICAgMHgwMDAwLCAweDdBM0EsIDB4NzlGNCwgMHg0MTZFLCAweDAwMDAsIDB4NDEzMiwgMHg5MjM1LCAweDc5RjEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzU5NywgMHg1NTZCLCAweDM1NzAsCi0gICAgMHgzNkFBLCAweDAwMDAsIDB4MDAwMCwgMHg3QUUyLCAweDVBNTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1QTBELCAweDAwMDAsIDB4NzhGMCwgMHg1QTJBLCAweDAwMDAsIDB4N0FGRSwgMHg0MUY5LCAweDdDNUQsCi0gICAgMHg3QzZELCAweDQyMTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4N0NDRCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg3QzhFLCAweDdDN0MsIDB4N0NBRSwgMHg2QUIyLCAweDdEREMsIDB4N0UwNywgMHg3REQzLCAweDdGNEUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3RDk3LCAweDAwMDAsIDB4NDI2QSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg2N0Q2LCAweDAwMDAsIDB4MDAwMCwgMHg1N0M0LCAweDAwMDAsIDB4MDAwMCwgMHg3RkRELCAweDdCMjcsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3QjBDLCAweDAwMDAsIDB4OTlFNiwgMHg4NjQ1LCAweDlBNjMsCi0gICAgMHg2QTFDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDlBMUYsIDB4MDAwMCwgMHg4NDk1LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDQ0RUEsIDB4ODEzNywgMHg0NDAyLCAweDgwQzYsIDB4ODEwOSwgMHg4MTQyLCAweDAwMDAsCi0gICAgMHg5OEMzLCAweDAwMDAsIDB4ODI2MiwgMHg4MjY1LCAweDAwMDAsIDB4ODQ1MywgMHgwMDAwLCAweDg2MTAsCi0gICAgMHgwMDAwLCAweDVBODYsIDB4NDE3RiwgMHgwMDAwLCAweDVCMkIsIDB4MDAwMCwgMHg1QUU0LCAweDAwMDAsCi0gICAgMHg4NkEwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODJELCAweDAwMDAsIDB4NUEwMiwgMHg4ODZFLCAweDRGNDUsCi0gICAgMHg4ODg3LCAweDg4QkYsIDB4ODhFNiwgMHg4OTY1LCAweDg5NEQsIDB4MDAwMCwgMHg4OTU0LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0VBRCwgMHg4NEEzLCAweDQ2RjUsCi0gICAgMHg0NkNGLCAweDM3RjIsIDB4OEEzRCwgMHg4QTFDLCAweDAwMDAsIDB4NUY0RCwgMHg5MjJCLCAweDAwMDAsCi0gICAgMHg2NUQ0LCAweDcxMjksIDB4NzBDNCwgMHgwMDAwLCAweDlENkQsIDB4OEM5RiwgMHg4Q0U5LCAweDAwMDAsCi0gICAgMHg1OTlBLCAweDc3QzMsIDB4NTlGMCwgMHgzNkQ0LCAweDhFMkEsIDB4OEVBNywgMHgwMDAwLCAweDhGMzAsCi0gICAgMHg4RjRBLCAweDQyRjQsIDB4NkM1OCwgMHg2RkJCLCAweDAwMDAsIDB4NDg5QiwgMHg2Rjc5LCAweDZFOEIsCi0gICAgMHgwMDAwLCAweDlCRTksIDB4MzZCNSwgMHgwMDAwLCAweDkwQkIsIDB4NDhCNCwgMHg1NTcxLCAweDQ5MDYsCi0gICAgMHg5MUJCLCAweDk0MDQsIDB4MDAwMCwgMHg0MDYyLCAweDAwMDAsIDB4OTQyNywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4NEU1LCAweDhBMkIsIDB4OTU5OSwgMHg5NUE3LCAweDk1OTcsIDB4OTU5NiwgMHgwMDAwLCAweDc0NDUsCi0gICAgMHgzRUMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNFRTcsIDB4MDAwMCwgMHg5NjhGLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4M0VDQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3NDEyLCAweDc0NkIsCi0gICAgMHgzRUZDLCAweDk3NDEsIDB4MDAwMCwgMHg2ODQ3LCAweDRBMUQsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsCi0gICAgMHg5MzY4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTJCQSwgMHg1QjExLCAweDhCNjksCi0gICAgMHg0OTNDLCAweDczRjksIDB4MDAwMCwgMHg5NzlCLCAweEZGRkQsIDB4OTkzOCwgMHgwMDAwLCAweDVEQzEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTgxRiwgMHgwMDAwLCAweDkyRjYsIDB4MDAwMCwgMHg5MUU1LCAweDQ0QzAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5OERDLCAweDAwMDAsIDB4M0YwMCwgMHg5MjJBLCAweDQ5MjUsCi0gICAgMHg4NDE0LCAweDk5M0IsIDB4OTk0RCwgMHgwMDAwLCAweDNERkQsIDB4RkZGRCwgMHg0QjZGLCAweDk5QUEsCi0gICAgMHg5QTVDLCAweDAwMDAsIDB4MDAwMCwgMHg2QThGLCAweDlBMjEsIDB4NUFGRSwgMHg5QTJGLCAweDAwMDAsCi0gICAgMHg0QjkwLCAweDAwMDAsIDB4OTlCQywgMHg0QkJELCAweDRCOTcsIDB4OTM3RCwgMHg1ODcyLCAweDAwMDAsCi0gICAgMHg1ODIyLCAweDAwMDAsIDB4MDAwMCwgMHg3ODQ0LCAweDAwMDAsIDB4MDAwMCwgMHg2OEM1LCAweDNEN0QsCi0gICAgMHg5NDU4LCAweDM5MjcsIDB4NjE1MCwgMHgwMDAwLCAweDAwMDAsIDB4NjEwNywgMHg5QzRGLCAweDlDNTMsCi0gICAgMHg5QzdCLCAweDlDMzUsIDB4OUMxMCwgMHg5QjdGLCAweDlCQ0YsIDB4MDAwMCwgMHg5QjlGLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDlEMjEsIDB4NENBRSwgMHgwMDAwLCAweDlFMTgsIDB4NENCMCwgMHg5RDBDLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5REE1LCAweDg0QkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4NUZDLCAweDQ1MzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODQyMCwgMHg4NUVFLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NzlFMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzRDYyLCAweDkzREIsCi0gICAgMHg5MkJFLCAweDkzNDgsIDB4MDAwMCwgMHg3OEI5LCAweDkyNzcsIDB4OTQ0RCwgMHg0RkU0LCAweDM0NDAsCi0gICAgMHg5MDY0LCAweDAwMDAsIDB4NzgzRCwgMHg3ODU0LCAweDc4QjYsIDB4Nzg0QiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDM2OUEsIDB4NEY3MiwgMHg2RkRBLCAweDZGRDksIDB4RkZGRCwgMHg3MDFFLCAweDU0MTQsCi0gICAgMHgwMDAwLCAweDU3QkIsIDB4NThGMywgMHg1NzhBLCAweDlEMTYsIDB4NTdENywgMHg3MTM0LCAweDM0QUYsCi0gICAgMHgwMDAwLCAweDcxRUIsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDYxMEMsCi0gICAgMHg1QUNFLCAweDVBMEIsIDB4NDJCQywgMHgwMDAwLCAweDM3MkMsIDB4NEI3QiwgMHgwMDAwLCAweDkzQkIsCi0gICAgMHg5M0I4LCAweDAwMDAsIDB4MDAwMCwgMHg4NDcyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDU5OTQsIDB4MDAwMCwgMHgwMDAwLCAweDdEQTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTJFNSwgMHg3M0UyLCAweDNFRTksIDB4NzRCNCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzRUUxLCAweDAwMDAsIDB4NkFEOCwgMHg3M0YzLCAweDczRkIsIDB4M0VENiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzQ0OCwgMHgwMDAwLCAweDcwQTUsCi0gICAgMHgwMDAwLCAweDkyODQsIDB4NzNFNiwgMHg5MzVGLCAweDAwMDAsIDB4OTMzMSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5Mzg2LCAweDAwMDAsIDB4MDAwMCwgMHg0OTM1LCAweDAwMDAsIDB4NzE2QiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1NkE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU1MDIsIDB4NzlDNCwgMHgwMDAwLCAweDdERkUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0NTJFLCAweDk0MDEsIDB4MzcwQSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1OUIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDVBQTEsIDB4MzZFMiwgMHgwMDAwLCAweDM2QjAsCi0gICAgMHg5MjVGLCAweDVBNzksIDB4MDAwMCwgMHgwMDAwLCAweDkzNzQsIDB4M0NDRCwgMHgwMDAwLCAweDRBOTYsCi0gICAgMHgzOThBLCAweDUwRjQsIDB4M0Q2OSwgMHgzRDRDLCAweDAwMDAsIDB4NzE3NSwgMHg0MkZCLCAweDAwMDAsCi0gICAgMHg2RTBGLCAweDAwMDAsIDB4NDRFQiwgMHg2RDU3LCAweDAwMDAsIDB4NzA2NywgMHg2Q0FGLCAweDNDRDYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NkUwMiwgMHg2RjBDLCAweDNENkYsIDB4MDAwMCwgMHg3NTUxLCAweDM2QkMsCi0gICAgMHgzNEM4LCAweDQ2ODAsIDB4M0VEQSwgMHg0ODcxLCAweDU5QzQsIDB4OTI2RSwgMHg0OTNFLCAweDhGNDEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NTgxMiwgMHg1N0M4LCAweDM2RDYsIDB4MDAwMCwgMHg3MEZFLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY4QjksIDB4Njk2NywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg2QTFBLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg0M0UsIDB4NDRERiwgMHg0NENFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHhGRkZELCAweEZGRkQsIDB4ODMzRCwgMHgwMDAwLCAweDgzRUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1OTg5LCAweDVBODIsIDB4MDAwMCwgMHg1QTYxLCAweDVBNzEsIDB4MDAwMCwgMHgwMDAwLCAweDM3MkQsCi0gICAgMHg1OUVGLCAweDAwMDAsIDB4MzZDNywgMHg3MThFLCAweDkzOTAsIDB4NjY5QSwgMHgwMDAwLCAweDVBNkUsCi0gICAgMHg1QTJCLCAweDAwMDAsIDB4NkEyQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDcxMUQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NEZCMCwgMHgwMDAwLCAweDVDQzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg2QTBDLCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDcxMzMsIDB4MDAwMCwgMHgzREE1LCAweDZDREYsCi0gICAgMHgwMDAwLCAweDU5RUIsIDB4NUY1QywgMHgwMDAwLCAweDdDRDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5MDZDLCAweDgxRjYsIDB4NzcwQywgMHg2Q0EyLCAweDU2RkQsIDB4NTg2OSwgMHg2NzYxLCAweDVDNUUsCi0gICAgMHg1OEYyLCAweDcwQjksIDB4NjgwMywgMHg4RkJCLCAweDhGQkMsIDB4NEUyMSwgMHg3QjM5LCAweDNEQ0MsCi0gICAgMHg3MzJBLCAweDc1NjAsIDB4NTgzQSwgMHg4MkE2LCAweDY5OEEsIDB4NjBFMywgMHg0RUVFLCAweDk5QzQsCi0gICAgMHg5RUJGLCAweDUzMDEsIDB4NjdBMCwgMHg2MEU4LCAweDUxQjQsIDB4N0E4MywgMHg5QzNBLCAweDdBQzgsCi0gICAgMHg2OTFBLCAweDU5QUMsIDB4NTg0MCwgMHg1NDZBLCAweDYwRTcsIDB4NTY3QSwgMHg2OTU1LCAweDlDMkYsCi0gICAgMHg4N0E1LCAweDVDMjAsIDB4NUUwQiwgMHg2NzFFLCAweDg0QUQsIDB4OEI4MSwgMHg0RTc4LCAweDYyQzMsCi0gICAgMHg2ODU1LCAweEZGRkQsIDB4ODJGRCwgMHg4OUE1LCAweDhGQTAsIDB4OTdCOCwgMHg5ODQ3LCAweDlBQkQsCi0gICAgMHg1RkIxLCAweDY2NDgsIDB4NjZCRiwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHhGRkZELCAweEZGRkQsCi0gICAgMHgwMDAwLCAweDY3MEUsIDB4NjkxOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQ4RDAsCi0gICAgMHg0QUI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTFEMiwgMHgwMDAwLCAweDU5OUYsCi0gICAgMHgwMDAwLCAweDNCQkUsIDB4MDAwMCwgMHgzOTlCLCAweDAwMDAsIDB4MDAwMCwgMHgzNzYyLCAweDAwMDAsCi0gICAgMHg4QjVFLCAweDAwMDAsIDB4RkZGRCwgMHg3MjA5LCAweDAwMDAsIDB4MDAwMCwgMHg4RURBLCAweDUyOEYsCi0gICAgMHg3MTcxLCAweDAwMDAsIDB4MDAwMCwgMHg1NUJDLCAweDAwMDAsIDB4MzQ3MywgMHgwMDAwLCAweDQ3MTgsCi0gICAgMHgwMDAwLCAweDUwNjYsIDB4MzRGQiwgMHgwMDAwLCAweEZGRkQsIDB4NDc3QywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHhGRkZELCAweDAwMDAsIDB4OTA1NiwgMHgwMDAwLCAweDhCNjIsIDB4NUQ1QiwgMHgwMDAwLCAweEZGRkQsCi0gICAgMHgwMDAwLCAweDhBRUEsIDB4MDAwMCwgMHgwMDAwLCAweDRCQzAsIDB4MDAwMCwgMHg5NDY1LCAweDAwMDAsCi0gICAgMHg2MTk1LCAweDVBMjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NEU2QSwgMHgwMDAwLCAweDk2NTYsCi0gICAgMHg2RDhGLCAweDAwMDAsIDB4ODk3NywgMHgwMDAwLCAweEZGRkQsIDB4N0I0MiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHhGRkZELCAweDdBNDUsIDB4OUEyNiwgMHgzNjVGLCAweDAwMDAsIDB4MDAwMCwgMHg3OTgzLCAweDVEMkMsCi0gICAgMHgwMDAwLCAweEZGRkQsIDB4NDZEMCwgMHg3NTNCLCAweDg4NjUsIDB4NThCNiwgMHgzNzFDLCAweDAwMDAsCi0gICAgMHgzQzU0LCAweDkyODEsIDB4MDAwMCwgMHg5MzMwLCAweDAwMDAsIDB4NkMzOSwgMHgwMDAwLCAweDg4MjcsCi0gICAgMHg4OEY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDZFQjgsIDB4MDAwMCwgMHgwMDAwLCAweDM5QTQsCi0gICAgMHhGRkZELCAweEZGRkQsIDB4NDUzRiwgMHg2NkI2LCAweDAwMDAsIDB4MDAwMCwgMHg4OTQzLCAweDQwREYsCi0gICAgMHgwMDAwLCAweDM5QTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzFBRCwgMHg4MzY2LCAweDAwMDAsCi0gICAgMHhGRkZELCAweDRDQjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4N0I0MywgMHg3OTdFLCAweDZGQjUsCi0gICAgMHgwMDAwLCAweDZBMDMsIDB4MDAwMCwgMHg1M0EyLCAweDAwMDAsIDB4OTNCRiwgMHg2ODM2LCAweDk3NUQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDVEODUsIDB4MDAwMCwgMHg1NzE1LCAweDk4MjMsCi0gICAgMHgwMDAwLCAweDVEQUIsIDB4MDAwMCwgMHg2NUJFLCAweDY5RDUsIDB4NTNEMiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzQzExLCAweDY3MzYsIDB4MDAwMCwgMHgzNUNBLCAweDQ4RkEsIDB4RkZGRCwgMHg3ODA4LCAweDkyNTUsCi0gICAgMHg0M0YyLCAweDQzREYsIDB4NTlGOCwgMHhGRkZELCAweDU2OEIsIDB4MDAwMCwgMHg5MDEyLCAweDU1QzEsCi0gICAgMHg0NTA5LCAweDdFN0YsIDB4NkY1NiwgMHg2QUIxLCAweDM0RTQsIDB4MDAwMCwgMHgzNzNBLCAweEZGRkQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4M0RFQiwgMHgwMDAwLCAweDAwMDAsIDB4NTZCRiwgMHg4RTBFLCAweDVCNkQsCi0gICAgMHg2M0RFLCAweEZGRkQsIDB4NjUzMCwgMHg1NjJELCAweDU0MUEsIDB4MDAwMCwgMHg0QzdELCAweDU2MjIsCi0gICAgMHg1NjFFLCAweDdGNDksIDB4NTk3NSwgMHgwMDAwLCAweDg3NzAsIDB4ODExNywgMHg5RDVFLCAweDhEMTgsCi0gICAgMHg3NjNCLCAweDlDNDUsIDB4NzY0RSwgMHg3N0I5LCAweDkzNDUsIDB4NTQzMiwgMHg4MTQ4LCAweDgyRjcsCi0gICAgMHg1NjI1LCAweDgxMzIsIDB4ODQxOCwgMHg4MEJELCAweDU1RUEsIDB4Nzk2MiwgMHg1NjQzLCAweDU0MTYsCi0gICAgMHgwMDAwLCAweDM1Q0UsIDB4NTYwNSwgMHg1NUYxLCAweDY2RjEsIDB4MDAwMCwgMHgzNjJELCAweDc1MzQsCi0gICAgMHg1NUYwLCAweDU1QkEsIDB4NTQ5NywgMHg1NTcyLCAweDAwMDAsIDB4MDAwMCwgMHg1RUQwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OUVBQiwgMHg3RDVBLCAweEZGRkQsIDB4MDAwMCwgMHg2MjlELCAweDk3NkQsCi0gICAgMHg1NDk0LCAweDhDQ0QsIDB4NzFGNiwgMHg5MTc2LCAweDYzRkMsIDB4NjNCOSwgMHg2M0ZFLCAweDU1NjksCi0gICAgMHgwMDAwLCAweDlDNzIsIDB4MDAwMCwgMHg1MTlBLCAweDM0REYsIDB4MDAwMCwgMHg1MUE3LCAweDU0NEQsCi0gICAgMHg1NTFFLCAweDU1MTMsIDB4NzY2NiwgMHg4RTJELCAweDAwMDAsIDB4NzVCMSwgMHg4MEI2LCAweDg4MDQsCi0gICAgMHhGRkZELCAweDg4QzcsIDB4ODFCNiwgMHg4NDFDLCAweDQ0RUMsIDB4NzMwNCwgMHg4MzBCLCAweDU2N0IsCi0gICAgMHg5MTcwLCAweDkyMDgsIDB4MDAwMCwgMHg3MjY2LCAweDQ3NEUsIDB4MDAwMCwgMHg0MEZBLCAweDlDNUQsCi0gICAgMHg2NTFGLCAweDQ4RjMsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHhFRDJCLCAweDAwMDAsCi0gICAgMHg3MUEzLCAweDdFOEUsIDB4OUQ1MCwgMHgzNTc3LCAweDZDQjIsIDB4NTM2NywgMHgzOURDLCAweDAwMDAsCi0gICAgMHg4MjJELCAweDU0NEIsIDB4RUQ0MywgMHgzQTUyLCAweDczNzQsIDB4MDAwMCwgMHg0RDA5LCAweDlCRUQsCi0gICAgMHhGRkZELCAweDRDNUIsIDB4MDAwMCwgMHg4NDVDLCAweDAwMDAsIDB4NjMyRSwgMHg3RDI1LCAweDNBMkEsCi0gICAgMHg5MDA4LCAweDUyQ0MsIDB4M0U3NCwgMHgzNjdBLCAweDQ1RTksIDB4MDAwMCwgMHg3NjQwLCAweDVBRjAsCi0gICAgMHgwMDAwLCAweDc4N0EsIDB4MDAwMCwgMHg1OEE3LCAweDQwQkYsIDB4NTY3QywgMHg5QjhCLCAweDVENzQsCi0gICAgMHg3NjU0LCAweDAwMDAsIDB4OUU4NSwgMHg0Q0UxLCAweEZGRkQsIDB4MzdGQiwgMHg2MTE5LCAweDAwMDAsCi0gICAgMHhFRDczLCAweDU2NUQsIDB4MDAwMCwgMHg1MjM0LCAweDM1QUQsIDB4RkZGRCwgMHg5RDdDLCAweDdDNTYsCi0gICAgMHg5QjM5LCAweDU3REUsIDB4NUM1MywgMHg2NEQzLCAweDAwMDAsIDB4MDAwMCwgMHg4NkFELCAweDAwMDAsCi0gICAgMHgwMDAwLCAweEVEOEMsIDB4NTFGRSwgMHgwMDAwLCAweDVEOEUsIDB4OTcwMywgMHgwMDAwLCAweDlFODEsCi0gICAgMHg5MDRDLCAweDdCMUYsIDB4OUIwMiwgMHg1Q0QxLCAweDdCQTMsIDB4NjI2OCwgMHg2MzM1LCAweDlBRkYsCi0gICAgMHg3QkNGLCAweDlCMkEsIDB4N0M3RSwgMHhGRkZELCAweDdDNDIsIDB4N0M4NiwgMHg5QzE1LCAweDdCRkMsCi0gICAgMHg5QjA5LCAweEZGRkQsIDB4OUMyRSwgMHg5RjVBLCAweDU1NzMsIDB4NUJDMywgMHg0RkZELCAweDlFOTgsCi0gICAgMHg0RkYyLCAweDUyNjAsIDB4NTJEMSwgMHg1NzY3LCAweDUwNTYsIDB4NTlCNywgMHg1RTEyLCAweDk3QzgsCi0gICAgMHg5REFCLCAweDhGNUMsIDB4NTQ2OSwgMHg5N0I0LCAweDk5NDAsIDB4OTdCQSwgMHg1MzJDLCAweDYxMzAsCi0gICAgMHg2OTJDLCAweDUzREEsIDB4OUMwQSwgMHg5RDAyLCAweDRDM0IsIDB4OTY0MSwgMHg2OTgwLCAweDUwQTYsCi0gICAgMHg3NTQ2LCAweDAwMDAsIDB4OTlEQSwgMHg1MjczLCAweEVEQzksIDB4OTE1OSwgMHg5NjgxLCAweDkxNUMsCi0gICAgMHhFRENELCAweDkxNTEsIDB4MDAwMCwgMHg2MzdGLCAweDZBQ0EsIDB4NTYxMSwgMHg5MThFLCAweDc1N0EsCi0gICAgMHg2Mjg1LCAweDczNEYsIDB4N0M3MCwgMHgwMDAwLCAweEVEREMsIDB4NzZENiwgMHg5QjlELCAweDRFMkEsCi0gICAgMHgwMDAwLCAweDgzQkUsIDB4ODg0MiwgMHhFREU0LCAweDVDNEEsIDB4NjlDMCwgMHhGRkZELCAweEZGRkQsCi0gICAgMHg1MjFGLCAweDVERjUsIDB4NEVDRSwgMHg2QzMxLCAweDAwMDAsIDB4NEYzOSwgMHg1NDlDLCAweEZGRkQsCi0gICAgMHg1MjlBLCAweDhEODIsIDB4MzVGRSwgMHhGRkZELCAweDM1RjMsIDB4RURGNiwgMHg2QjUyLCAweDkxN0MsCi0gICAgMHg5RkE1LCAweDlCOTcsIDB4OTgyRSwgMHg5OEI0LCAweDlBQkEsIDB4OUVBOCwgMHg5RTg0LCAweDdCMTQsCi0gICAgMHhFRTAyLCAweDZCRkEsIDB4ODgxOCwgMHg3Rjc4LCAweEVFMDYsIDB4NTYyMCwgMHgwMDAwLCAweDhFNzcsCi0gICAgMHg5RjUzLCAweEVFMEIsIDB4OERENCwgMHg4RTRGLCAweDlFMUMsIDB4OEUwMSwgMHg2MjgyLCAweDAwMDAsCi0gICAgMHg4RTI4LCAweDhFNzUsIDB4N0FEMywgMHg3QTNFLCAweDc4RDgsIDB4NkNFQSwgMHg4QTY3LCAweDc2MDcsCi0gICAgMHg5RjI2LCAweDZDQ0UsIDB4ODdENiwgMHg3NUMzLCAweDAwMDAsIDB4Nzg1MywgMHg4RDBDLCAweDcyRTIsCi0gICAgMHg3MzcxLCAweDhCMkQsIDB4NzMwMiwgMHg3NEYxLCAweDhDRUIsIDB4MDAwMCwgMHg4NjJGLCAweDVGQkEsCi0gICAgMHg4OEEwLCAweDQ0QjcsIDB4RUUyRiwgMHgwMDAwLCAweEVFMzIsIDB4OEE3RSwgMHgwMDAwLCAweEVFMzUsCi0gICAgMHg2MEZELCAweDc2NjcsIDB4OUFENywgMHg5RDQ0LCAweDkzNkUsIDB4OUI4RiwgMHg4N0Y1LCAweEVFM0QsCi0gICAgMHhGRkZELCAweDhDRjcsIDB4NzMyQywgMHg5NzIxLCAweDlCQjAsIDB4MzVENiwgMHg3MkIyLCAweDRDMDcsCi0gICAgMHg3QzUxLCAweDk5NEEsIDB4NjE1OSwgMHg0QzA0LCAweDlFOTYsIDB4NjE3RCwgMHhFRTRELCAweDU3NUYsCi0gICAgMHg2MTZGLCAweDYyQTYsIDB4NjIzOSwgMHhGRkZELCAweDNBNUMsIDB4NjFFMiwgMHg1M0FBLCAweDYzNjQsCi0gICAgMHg2ODAyLCAweDM1RDIsIDB4NUQ1NywgMHg4RkRBLCAweDAwMDAsIDB4RUU1RSwgMHg1MEQ5LCAweDc5MDYsCi0gICAgMHg1MzMyLCAweDk2MzgsIDB4MDAwMCwgMHg0MDY1LCAweEVFNjYsIDB4NzdGRSwgMHhFRTY4LCAweDdDQzIsCi0gICAgMHgwMDAwLCAweDdDREEsIDB4N0EyRCwgMHg4MDY2LCAweDgwNjMsIDB4N0Q0RCwgMHg3NTA1LCAweDc0RjIsCi0gICAgMHg4OTk0LCAweDgyMUEsIDB4NjcwQywgMHg4MDYyLCAweDAwMDAsIDB4ODA1QiwgMHg3NEYwLCAweDgxMDMsCi0gICAgMHg3NzI0LCAweDg5ODksIDB4MDAwMCwgMHg3NTUzLCAweDg3QTksIDB4ODdDRSwgMHg4MUM4LCAweDg3OEMsCi0gICAgMHg4QTQ5LCAweDhDQUQsIDB4OEI0MywgMHg3NzJCLCAweDc0RjgsIDB4ODREQSwgMHg2OUIyLCAweDhEQTYsCi0gICAgMHhFRThDLCAweDg5QTksIDB4RkZGRCwgMHg2REI5LCAweDg3QzEsIDB4MDAwMCwgMHg3NEU3LCAweDNEREIsCi0gICAgMHg3MTc2LCAweDYwQTQsIDB4NjE5QywgMHgzQ0QxLCAweEZGRkQsIDB4NjA3NywgMHhFRTlBLCAweDdGNzEsCi0gICAgMHgwMDAwLCAweDYwRTksIDB4NEI3RSwgMHgwMDAwLCAweDkyREIsIDB4MDAwMCwgMHgwMDAwLCAweDg1NEMsCi0gICAgMHg0MkI1LCAweDczRUYsIDB4NTFCNSwgMHgzNjQ5LCAweDAwMDAsIDB4MDAwMCwgMHg5MzQ0LCAweDAwMDAsCi0gICAgMHg4MkVFLCAweDAwMDAsIDB4NzgzQywgMHg2NzQ0LCAweDYyREYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NEZBQiwgMHgwMDAwLCAweDUwMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDVGQTQsIDB4MDAwMCwgMHgwMDAwLCAweDZFREIsCi0gICAgMHgwMDAwLCAweDUwREUsIDB4NTEwMSwgMHgzNDdBLCAweDUxMEUsIDB4OTg2QywgMHgzNzQzLCAweDg0MTYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NTE2MCwgMHgwMDAwLCAweDUxNkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDVCODIsIDB4ODc3RCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1MUIyLCAweDUxQjgsIDB4OUQzNCwgMHg1MUM5LCAweDUxQ0YsIDB4NTFEMSwgMHgzQ0RDLCAweDUxRDMsCi0gICAgMHgwMDAwLCAweDUxQjMsIDB4RkZGRCwgMHhGRkZELCAweDUxRUQsIDB4ODNDRCwgMHg2OTNFLCAweDAwMDAsCi0gICAgMHg1RjdCLCAweDUyMEIsIDB4NTIyNiwgMHg1MjNDLCAweDUyQjUsIDB4NTI1NywgMHg1Mjk0LCAweDUyQjksCi0gICAgMHg1MkM1LCAweDdDMTUsIDB4ODU0MiwgMHg1MkUwLCAweDg2MEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1NTQ5LCAweDZFRDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTMzMywgMHhGRkZELCAweDAwMDAsCi0gICAgMHg2Q0NCLCAweDAwMDAsIDB4NjgxQiwgMHg3M0Q1LCAweDYwNEEsIDB4M0VBQSwgMHgzOENDLCAweDAwMDAsCi0gICAgMHg3MURELCAweDQ0QTIsIDB4NTM2RCwgMHg1Mzc0LCAweDAwMDAsIDB4NTM3RSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDc3RTYsIDB4NTM5MywgMHgwMDAwLCAweDUzQTAsIDB4NTNBQiwgMHg1M0FFLCAweDczQTcsCi0gICAgMHgwMDAwLCAweDNGNTksIDB4NzM5QywgMHg1M0MxLCAweDUzQzUsIDB4NkM0OSwgMHg0RTQ5LCAweDU3RkUsCi0gICAgMHg1M0Q5LCAweDNBQUIsIDB4MDAwMCwgMHg1M0UwLCAweDAwMDAsIDB4MDAwMCwgMHg1M0Y2LCAweDAwMDAsCi0gICAgMHg1NDEzLCAweDcwNzksIDB4NTUyQiwgMHg2NjU3LCAweDZENUIsIDB4NTQ2RCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1NTVELCAweDU0OEYsIDB4NTRBNCwgMHg0N0E2LCAweDAwMDAsIDB4MDAwMCwgMHgzREI0LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NTU0NywgMHg0Q0VELCAweDU0MkYsIDB4NzQxNywgMHg1NTg2LCAweDU1QTksCi0gICAgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHg0NTUyLCAweDAwMDAsIDB4NjZCMywgMHgwMDAwLCAweDU2MzcsCi0gICAgMHg2NkNELCAweDAwMDAsIDB4NjZBNCwgMHhGRkZELCAweDU2NEQsIDB4NTY0RiwgMHg3OEYxLCAweDU2RjEsCi0gICAgMHg5Nzg3LCAweDUzRkUsIDB4NTcwMCwgMHg1NkVGLCAweDU2RUQsIDB4MDAwMCwgMHgzNjIzLCAweDAwMDAsCi0gICAgMHg1NzQ2LCAweDAwMDAsIDB4NkM2RSwgMHg3MDhCLCAweDU3NDIsIDB4MzZCMSwgMHgwMDAwLCAweDU3RTYsCi0gICAgMHgwMDAwLCAweDU4MDMsIDB4MDAwMCwgMHgwMDAwLCAweDU4MjYsIDB4MDAwMCwgMHg1ODFGLCAweDU4QUEsCi0gICAgMHgzNTYxLCAweDU4RTAsIDB4NThEQywgMHgwMDAwLCAweDU4RkIsIDB4NUJGRiwgMHg1NzQzLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDkzRDMsIDB4MzVBMSwgMHg1OTFGLCAweDY4QTYsIDB4MzZDMywgMHg2RTU5LCAweDAwMDAsCi0gICAgMHg1QTI0LCAweEZGRkQsIDB4MDAwMCwgMHg4NTA1LCAweDU5QzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDU5RDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NkQ3MSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1OUY5LCAweDAwMDAsIDB4NUFBQiwgMHg1QTYzLCAweDM2RTYsIDB4MDAwMCwgMHhGRkZELCAweDM3MDgsCi0gICAgMHg1QTk2LCAweDc0NjUsIDB4NUFEMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNzMyLCAweDAwMDAsCi0gICAgMHg1RTgzLCAweDUyRDAsIDB4NUI3NiwgMHg2NTg4LCAweDVCN0MsIDB4MDAwMCwgMHg0MDA0LCAweDQ4NUQsCi0gICAgMHgwMDAwLCAweDVCRDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NUJGMywgMHg1QjlELCAweDREMTAsCi0gICAgMHg1QzA1LCAweDAwMDAsIDB4NUMxMywgMHg3M0NFLCAweDVDMTQsIDB4MDAwMCwgMHgwMDAwLCAweDVDNDksCi0gICAgMHg0OERELCAweDVDODUsIDB4NUNFOSwgMHg1Q0VGLCAweDVEOEIsIDB4MDAwMCwgMHgwMDAwLCAweDVEMTAsCi0gICAgMHg1RDE4LCAweDVENDYsIDB4MDAwMCwgMHg1Q0JBLCAweDVERDcsIDB4ODJGQywgMHgzODJELCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODI4NywgMHgzODM2LCAweDNCQzIsIDB4NUUyRSwgMHg2QThBLCAweEZGRkQsCi0gICAgMHhFMTJGLCAweDAwMDAsIDB4MDAwMCwgMHg1M0E2LCAweDRFQjcsIDB4RkZGRCwgMHg1M0E4LCAweDAwMDAsCi0gICAgMHg1RTA5LCAweEUxMzgsIDB4MDAwMCwgMHg1RUY5LCAweDVFRkIsIDB4MzhBMCwgMHg1RUZDLCAweDY4M0UsCi0gICAgMHg5NDFCLCAweDVGMEQsIDB4MDAwMCwgMHgwMDAwLCAweDNBREUsIDB4MDAwMCwgMHg1RjNBLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NUY2MywgMHgwMDAwLCAweDVGNzIsIDB4OTM0MCwgMHgwMDAwLCAweDVGQTcsCi0gICAgMHg1REI2LCAweDNENUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MUQ2LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDYwMzEsIDB4NjY4NSwgMHgzOTYzLCAweDNEQzcsIDB4MzYzOSwgMHg1NzkwLCAweDAwMDAsCi0gICAgMHg3OTcxLCAweDNFNDAsIDB4NjA5RSwgMHhGRkZELCAweDYwRUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg3NEE0LCAweDUwRTEsIDB4NUFBMCwgMHg2MTY0LCAweDYxNDIsIDB4MDAwMCwgMHgwMDAwLCAweDYxODEsCi0gICAgMHg1MUY0LCAweDAwMDAsIDB4NjE4NywgMHg1QkFBLCAweDAwMDAsIDB4MDAwMCwgMHg2MUQzLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDYxRDAsIDB4MzkzMiwgMHgwMDAwLCAweDAwMDAsIDB4NjAyMywgMHg2MTVDLCAweDY1MUUsCi0gICAgMHg2MzhCLCAweDAwMDAsIDB4NjJDNSwgMHgwMDAwLCAweDYyRDUsIDB4MDAwMCwgMHg2MzZDLCAweDAwMDAsCi0gICAgMHgzQTE3LCAweDY0MzgsIDB4NjNGOCwgMHgwMDAwLCAweDAwMDAsIDB4NkY4QSwgMHgwMDAwLCAweEZGRkQsCi0gICAgMHgwMDAwLCAweDY0RTEsIDB4NjRFNSwgMHg5NDdCLCAweDNBNjYsIDB4NjQzQSwgMHgzQTU3LCAweDY1NEQsCi0gICAgMHg2RjE2LCAweDAwMDAsIDB4MDAwMCwgMHg2NTg1LCAweDY1NkQsIDB4NjU1RiwgMHhGRkZELCAweDY1QjUsCi0gICAgMHgwMDAwLCAweDRCMzcsIDB4NjVEMSwgMHg0MEQ4LCAweDAwMDAsIDB4RTFBQiwgMHg2NUUzLCAweDVGREYsCi0gICAgMHgwMDAwLCAweDY2MTgsIDB4MDAwMCwgMHgwMDAwLCAweDY2NDQsIDB4MDAwMCwgMHgwMDAwLCAweDY2NEIsCi0gICAgMHgwMDAwLCAweDY2NjcsIDB4MDAwMCwgMHg2NjczLCAweEZBMTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDc3QzUsIDB4MDAwMCwgMHg5OUE0LCAweDY3MDIsIDB4MDAwMCwgMHgwMDAwLCAweDY5RkEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4Njc2NywgMHg2NzYyLCAweDAwMDAsIDB4MDAwMCwgMHg2N0Q3LCAweDQ0RTksCi0gICAgMHg2ODIyLCAweDZFNTAsIDB4OTIzQywgMHg2ODAxLCAweDAwMDAsIDB4MDAwMCwgMHg2ODVELCAweDAwMDAsCi0gICAgMHg2OUUxLCAweDZBMEIsIDB4MDAwMCwgMHg2OTczLCAweDY4QzMsIDB4MDAwMCwgMHg2OTAxLCAweDY5MDAsCi0gICAgMHgzQTAxLCAweDAwMDAsIDB4M0I4MCwgMHg2N0FDLCAweDY5NjEsIDB4MDAwMCwgMHg0MkZDLCAweDY5MzYsCi0gICAgMHg2OTk4LCAweDNCQTEsIDB4MDAwMCwgMHg4MzYzLCAweDUwOTAsIDB4NjlGOSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg2QTQ1LCAweDAwMDAsIDB4NkE5RCwgMHgzQkYzLCAweDY3QjEsIDB4NkFDOCwgMHgwMDAwLCAweDNDMEQsCi0gICAgMHg2QjFELCAweDAwMDAsIDB4NjBERSwgMHg2QjM1LCAweDZCNzQsIDB4MDAwMCwgMHg2RUI1LCAweDAwMDAsCi0gICAgMHhGRkZELCAweDAwMDAsIDB4Mzc0MCwgMHg1NDIxLCAweDAwMDAsIDB4NkJFMSwgMHgwMDAwLCAweDZCREMsCi0gICAgMHg2QzM3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDZDNUEsIDB4ODIyNiwgMHg2Qzc5LCAweDAwMDAsCi0gICAgMHg0NEM1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNkU1LCAweDNDRUIsCi0gICAgMHgwMDAwLCAweDlCODMsIDB4MDAwMCwgMHgwMDAwLCAweDdGOEYsIDB4NjgzNywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDZEOTYsIDB4NkQ1QywgMHg2RTdDLCAweDZGMDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4NTMzLCAweDAwMDAsIDB4NTFDNywgMHhGRkZELCAweEZGRkQsIDB4ODQyRSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDc0NTMsIDB4MDAwMCwgMHg3OUNDLCAweDZFNEYsIDB4NUE5MSwgMHgwMDAwLCAweDZGRjgsCi0gICAgMHgzNzBELCAweDZGOUQsIDB4MDAwMCwgMHg2RUZBLCAweDAwMDAsIDB4MDAwMCwgMHg0NTU1LCAweDkzRjAsCi0gICAgMHg2RjQ0LCAweDZGNUMsIDB4M0Q0RSwgMHg2Rjc0LCAweDAwMDAsIDB4M0QzQiwgMHg2RjlGLCAweDAwMDAsCi0gICAgMHg2RkQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDUxREYsCi0gICAgMHhFMjUxLCAweEUyNTIsIDB4MDAwMCwgMHgwMDAwLCAweDcwNEIsIDB4NzA3RSwgMHg3MEE3LCAweEZGRkQsCi0gICAgMHg3MENDLCAweDcwRDUsIDB4NzBENiwgMHg3MERGLCAweDQxMDQsIDB4M0RFOCwgMHg3MUI0LCAweDcxOTYsCi0gICAgMHgwMDAwLCAweDcxMkIsIDB4NzE0NSwgMHg1QTg4LCAweDcxNEEsIDB4RkE0OCwgMHgwMDAwLCAweDcxNEYsCi0gICAgMHg5MzYyLCAweDAwMDAsIDB4NzEyQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3MUJBLCAweDAwMDAsCi0gICAgMHg3MEJELCAweDcyMEUsIDB4OTQ0MiwgMHg3MjE1LCAweDU5MTEsIDB4OTQ0MywgMHg3MjI0LCAweDkzNDEsCi0gICAgMHgwMDAwLCAweDcyMkUsIDB4NzI0MCwgMHgwMDAwLCAweDY4QkQsIDB4NzI1NSwgMHg3MjU3LCAweDNFNTUsCi0gICAgMHgwMDAwLCAweDY4MEQsIDB4NkYzRCwgMHg3MjgyLCAweEZGRkQsIDB4NzMyQiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg0OEVELCAweDAwMDAsIDB4NzMyOCwgMHg3MzJFLCAweDczQ0YsIDB4NzNBQSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg3M0M5LCAweDc0NDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjYyMywgMHgzNkM1LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NzNGNywgMHg3NDE1LCAweDY5MDMsIDB4MDAwMCwgMHg3NDM5LCAweDNFRDcsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NzQ2MCwgMHgwMDAwLCAweDc0NDcsIDB4NzNFNCwgMHg3NDc2LCAweDgzQjksCi0gICAgMHg3NDZDLCAweDc0NzQsIDB4OTNGMSwgMHg2QTJDLCAweDc0ODIsIDB4NDk1MywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NUI0NiwgMHgwMDAwLCAweDAwMDAsIDB4NzRDOCwgMHgwMDAwLCAweDc1MEUsCi0gICAgMHg3NTFFLCAweDAwMDAsIDB4MDAwMCwgMHg1QkQ3LCAweDAwMDAsIDB4OTM4NSwgMHg3NTRELCAweDc1NEEsCi0gICAgMHg3NTY3LCAweDc1NkUsIDB4MDAwMCwgMHgzRjA0LCAweDAwMDAsIDB4NzU4RSwgMHg3NDVELCAweDc1OUUsCi0gICAgMHg3NUI0LCAweDc2MDIsIDB4NzYyQywgMHg3NjUxLCAweDc2NEYsIDB4NzY2RiwgMHhFMkQzLCAweDAwMDAsCi0gICAgMHg3NjkwLCAweDgxRUYsIDB4MzdGOCwgMHgwMDAwLCAweDAwMDAsIDB4NzZBMSwgMHg3NkE1LCAweDc2QjcsCi0gICAgMHg3NkNDLCAweDAwMDAsIDB4ODQ2MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3NzFFLCAweDc3MjYsCi0gICAgMHg3NzQwLCAweDY0QUYsIDB4MDAwMCwgMHg3NzU4LCAweDAwMDAsIDB4NzdBRiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDc3RjQsIDB4RkZGRCwgMHg2OENBLCAweDc4QUYsIDB4NzhDNywgMHg3OEQzLCAweDk2QTUsCi0gICAgMHg3OTJFLCAweDAwMDAsIDB4NzhENywgMHg3OTM0LCAweDc4QjEsIDB4MDAwMCwgMHg4RkI4LCAweDg4ODQsCi0gICAgMHgwMDAwLCAweDc5ODYsIDB4ODkwMCwgMHg2OTAyLCAweDc5ODAsIDB4MDAwMCwgMHg3OTlELCAweDAwMDAsCi0gICAgMHg3OTNDLCAweDc5QTksIDB4NkUyQSwgMHgwMDAwLCAweDNFQTgsIDB4NzlDNiwgMHgwMDAwLCAweDc5RDQsCi0gICAgMHhGRkZELCAweDU1MjUsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NTkwLCAweDAwMDAsCi0gICAgMHgzOUVDLCAweDAwMDAsIDB4OEU0NiwgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDc3N0EsCi0gICAgMHgwMDAwLCAweDNBMzQsIDB4NDdENSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg2NERELCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHg2NDhELCAweDhFN0UsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQ3RjQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OUFCMiwgMHgzQTY3LCAweDAwMDAsIDB4M0ZFRCwgMHgzNTA2LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHg5RDZFLCAweDk4MTUsIDB4RkZGRCwgMHg0M0Q5LCAweEZGRkQsCi0gICAgMHg2NEI0LCAweDU0RTMsIDB4RkZGRCwgMHgwMDAwLCAweEZGRkQsIDB4MzlGQiwgMHhGRkZELCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NjRFQSwgMHgwMDAwLCAweDAwMDAsIDB4OEU2OCwgMHhGRkZELCAweDAwMDAsCi0gICAgMHgwMDAwLCAweEZGRkQsIDB4NDgwQiwgMHgwMDAwLCAweDNGRkEsIDB4NTg3MywgMHgwMDAwLCAweEZGRkQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4NTU3OSwgMHhGRkZELCAweDQzQkEsCi0gICAgMHhGRkZELCAweDRBQjQsIDB4MDAwMCwgMHgwMDAwLCAweDgxQUEsIDB4OThGNSwgMHgwMDAwLCAweDYzNzksCi0gICAgMHgzOUZFLCAweDAwMDAsIDB4OERDMCwgMHg1NkExLCAweDY0N0MsIDB4M0U0MywgMHhGRkZELCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHgzOTkyLCAweDNBMDYsCi0gICAgMHgwMDAwLCAweDM1NzgsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzNEJDLCAweDZDM0QsIDB4MDAwMCwgMHhGRkZELCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNBMTgsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTVBQSwgMHhGRkZELCAweDAwMDAsCi0gICAgMHg3MTQwLCAweEZGRkQsIDB4NTE1NiwgMHg0RUZFLCAweDUwODgsIDB4RkZGRCwgMHgzNDkzLCAweDUxODYsCi0gICAgMHg1RTQyLCAweDUyMDUsIDB4NTIyNywgMHg1Mjc5LCAweDAwMDAsIDB4MzU1MywgMHg1M0MyLCAweDUzNUYsCi0gICAgMHhGRkZELCAweDU1M0YsIDB4RkZGRCwgMHg1NUQ4LCAweDM1REQsIDB4NTYyMSwgMHhGRkZELCAweDU2NTQsCi0gICAgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsIDB4RkZGRCwgMHhGRkZELCAweDM3QjksCi0gICAgMHg1Q0MxLCAweDVEMTUsIDB4NUQ1NiwgMHgzODM4LCAweDRFODEsIDB4NUVCRCwgMHgzOTE0LCAweDYxQjksCi0gICAgMHg2MjkwLCAweDYzMTgsIDB4NjQ1QSwgMHg2NDkxLCAweDgxNkQsIDB4ODE4NCwgMHg4MTkzLCAweDY4MDAsCi0gICAgMHgzQkJDLCAweDcyOEYsIDB4NzJDRCwgMHgwMDAwLCAweDczMzksIDB4NzU0MiwgMHg3NURDLCAweDNGQzAsCi0gICAgMHgwMDAwLCAweDNGRDcsIDB4RkZGRCwgMHg3NjgwLCAweDc2OEMsIDB4NDBBOCwgMHg3ODM5LCAweDQxMDMsCi0gICAgMHg3QTkxLCAweDdDMUIsIDB4N0NFRCwgMHg3RjkzLCAweDdGQUUsIDB4RkZGRCwgMHg4MkZGLCAweDU4NUYsCi0gICAgMHg4NkIyLCAweDQ1QUMsIDB4ODc4QiwgMHg4OTQ3LCAweEZGRkQsIDB4OEEyOSwgMHhGRkZELCAweDhFNzEsCi0gICAgMHgwMDAwLCAweDhFQjAsIDB4RkZGRCwgMHg5MTVFLCAweDkxOEMsIDB4OTkwRSwgMHg5OTFDLCAweEZGRkQsCi0gICAgMHhGRkZELCAweDlCODEsIDB4OURDMCwgMHg5RDkzLCAweDlFQUMsIDB4NEQ5MSwgMHhGRkZELCAweDkzQkEsCi0gICAgMHg5RTdCLCAweDcwODksIDB4NzM0OCwgMHhGRkZELCAweDc5OTksIDB4OEZCNywgMHhGRkZELCAweDk5NDIsCi0gICAgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCi0gICAgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsCi0gICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCi0gICAgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsCi0gICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCi0gICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsCi0gICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCi0gICAgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsCi0gICAgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCi0gICAgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsCi0gICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCi0gICAgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLCAweDAwQTksCi0gICAgMHgyMTIyLCAweDIwMjYsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsCi0gICAgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsCi0gICAgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsCi0gICAgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsCi0gICAgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsCi0gICAgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsCi0gICAgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsCi0gICAgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsCi0gICAgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsCi0gICAgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsCi0gICAgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsCi0gICAgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsCi0gICAgMHgwMDdFLCAweDIwQUMsIDB4MjBBQywgMHgyMTEwLCAweDIwQUMsIDB4MjBBQywgMHgzMDlCLCAweDMwOUMsCi0gICAgMHgyRTgwLCAweDMxQzAsIDB4MzFDMSwgMHgzMUMyLCAweDMxQzMsIDB4MzFDNCwgMHgwMDAwLCAweDMxQzUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MzFDNiwgMHgzMUM3LCAweDAwMDAsIDB4MDAwMCwgMHgzMUM4LCAweDAwMDAsCi0gICAgMHgzMUM5LCAweDMxQ0EsIDB4MzFDQiwgMHgzMUNDLCAweDAwMDAsIDB4MzFDRCwgMHgzMUNFLCAweEY1MzgsCi0gICAgMHhGNTM5LCAweDAwMDAsIDB4MDAwMCwgMHg5NzUxLCAweDAwMDAsIDB4NEU1QiwgMHg0RUJCLCAweDM1M0UsCi0gICAgMHg1QzIzLCAweDVGNTEsIDB4NUZDNCwgMHgzOEZBLCAweDYyNEMsIDB4NjUzNSwgMHg2QjdBLCAweDZDMzUsCi0gICAgMHg2QzNBLCAweDcwNkMsIDB4NzIyQiwgMHg0RTJDLCAweDcyQUQsIDB4MDAwMCwgMHg3RjUyLCAweDc5M0IsCi0gICAgMHg3Q0Y5LCAweDdGNTMsIDB4MDAwMCwgMHgzNEMxLCAweDAwMDAsIDB4ODAwMiwgMHg4MDgwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDUzNUQsIDB4ODg2NCwgMHg4OUMxLCAweDAwMDAsIDB4OEJBMCwgMHg4RDFELCAweDk0ODUsCi0gICAgMHg5NTc4LCAweDk1N0YsIDB4OTVFOCwgMHgwMDAwLCAweDk3RTYsIDB4OTg3NSwgMHg5OENFLCAweDk4REUsCi0gICAgMHg5OTYzLCAweDAwMDAsIDB4OUM3QywgMHg5RTFGLCAweDlFQzQsIDB4NkI2RiwgMHhGOTA3LCAweDRFMzcsCi0gICAgMHgwMDAwLCAweDk2MUQsIDB4NjIzNywgMHg5NEEyLCAweDJFODQsIDB4MkU4NiwgMHgyRTg3LCAweDJFODgsCi0gICAgMHgyRThBLCAweDJFOEMsIDB4MkU4RCwgMHgyRTk1LCAweDJFOUMsIDB4MkVBNSwgMHgyRUE3LCAweDJFQUEsCi0gICAgMHgyRUFDLCAweDJFQUUsIDB4MkVCNiwgMHgyRUJDLCAweDJFQkUsIDB4MkVDQSwgMHgyRUNDLCAweDJFQ0QsCi0gICAgMHgyRUNGLCAweDJFRDYsIDB4MkVENywgMHgyRURFLCAweDAwMDAsIDB4MDAwMCwgMHg2NTBBLCAweDRFM0QsCi0gICAgMHg2RURELCAweDlENEUsIDB4OTFERiwgMHgwMDAwLCAweDRGMUEsIDB4NEYyOCwgMHg0RkE4LCAweDUxNzQsCi0gICAgMHg1MTlDLCAweDUxRTQsIDB4NTJBMSwgMHg1MkE4LCAweDUzM0IsIDB4NTM0RSwgMHg1M0QxLCAweDUzRDgsCi0gICAgMHg1NkUyLCAweDU4RjAsIDB4NTkwNCwgMHg1OTA3LCAweDU5MzIsIDB4NTkzNCwgMHg1QjY2LCAweDVCOUUsCi0gICAgMHg1QjlGLCAweDVDOUEsIDB4NUU4NiwgMHg2MDNCLCAweDY1ODksIDB4NjdGRSwgMHg2ODA0LCAweDY4NjUsCi0gICAgMHg2RDRFLCAweDcwQkMsIDB4NzUzNSwgMHg3RUE0LCAweDdFQUMsIDB4N0VCQSwgMHg3RUM3LCAweDdFQ0YsCi0gICAgMHg3RURGLCAweDdGMDYsIDB4N0YzNywgMHg4MjdBLCAweDgyQ0YsIDB4ODM2RiwgMHg4OUM2LCAweDhCQkUsCi0gICAgMHg4QkUyLCAweDhGNjYsIDB4OEY2NywgMHg4RjZFLCAweDc0MTEsIDB4N0NGQywgMHg3RENELCAweDY5NDYsCi0gICAgMHg3QUM5LCAweDc4QjgsIDB4ODBCQywgMHg4RDBCLCAweDgwRjYsIDB4MDAwMCwgMHg4MDlGLCAweDlFQzcsCi0gICAgMHg0Q0NELCAweDlEQzksIDB4OUUwQywgMHg0QzNFLCAweDAwMDAsIDB4MDAwMCwgMHg5RTBBLCAweDAwMDAsCi0gICAgMHgzNUMxLCAweDZFOUEsIDB4ODIzRSwgMHg3NTE5LCAweDQ5MTEsIDB4OUE2QywgMHg5QThGLCAweDlGOTksCi0gICAgMHg3OTg3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NEUyNCwgMHg0RTgwLCAweDRFODcsCi0gICAgMHg0RUJGLCAweDRFRUIsIDB4NEYzNywgMHgzNDRDLCAweDRGQkQsIDB4M0U0OCwgMHg1MDAzLCAweDM0N0QsCi0gICAgMHgzNEE1LCAweDU5MDUsIDB4NTFEQiwgMHg1MUZDLCAweDRFODksIDB4NTI5MCwgMHg1MzI3LCAweDM1QzcsCi0gICAgMHg1M0E5LCAweDM1NTEsIDB4NTNCMCwgMHg1NDIzLCAweDM1NkQsIDB4MzU3MiwgMHgzNjgxLCAweDU0OTMsCi0gICAgMHg1NEEzLCAweDU0QjQsIDB4NTRCOSwgMHg1NEQwLCAweDU0RUYsIDB4NTUxOCwgMHg1NTIzLCAweDU1MjgsCi0gICAgMHgzNTk4LCAweDM1QTUsIDB4MzVCRiwgMHg1NUQ3LCAweDM1QzUsIDB4MDAwMCwgMHg0MDUzLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg0MEJCLCAweDAwMDAsIDB4NTY1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzNUZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0Y5MywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNGRjksCi0gICAgMHgwMDAwLCAweDY0MzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NTRDQywgMHg4MkM0LCAweDU1QjksIDB4MDAwMCwgMHg5QzI2LCAweDlBQjYsCi0gICAgMHgwMDAwLCAweDgwRUMsIDB4NUMxQywgMHgwMDAwLCAweDgxMzQsIDB4Mzc5NywgMHgwMDAwLCAweDkxQjYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzYwOSwgMHgwMDAwLCAweDU2QUYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1QTU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1NzlDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM3MDMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1ODk5LCAweDUyNjgsIDB4MzYxQSwgMHgwMDAwLCAweDdCQjIsIDB4NUI2OCwgMHg0ODAwLCAweDRCMkMsCi0gICAgMHg5RjI3LCAweDQ5RTcsIDB4OUMxRiwgMHg5QjhELCAweDAwMDAsIDB4MDAwMCwgMHg1NUZCLCAweDM1RjIsCi0gICAgMHg1Njg5LCAweDVEM0UsIDB4NUQ0OCwgMHgzREZDLCAweDM4MEYsIDB4NURBNCwgMHg1REI5LCAweDM4MjAsCi0gICAgMHg1RjI1LCAweDVGODMsIDB4MzkwOCwgMHgzOTNGLCAweDM5NEQsIDB4NjBENywgMHg2MTNELCAweDVDRTUsCi0gICAgMHgzOTg5LCAweDYxQjcsIDB4NjFDRiwgMHgzOUI4LCAweDYyMkMsIDB4NjJFNSwgMHgzOUY4LCAweDU2QjEsCi0gICAgMHgzQTAzLCAweDYzRTIsIDB4NjNGQiwgMHg2NDA3LCAweDNBNEIsIDB4NjRDMCwgMHg5RjlGLCAweDNBOTcsCi0gICAgMHg2NTg2LCAweDNBQkQsIDB4NjVGRiwgMHg2NjUzLCAweDNBRjIsIDB4NjY5MiwgMHgzQjIyLCAweDY3MTYsCi0gICAgMHgzQjQyLCAweDY3QTQsIDB4M0I1OCwgMHg2ODRBLCAweDY4ODQsIDB4M0I3MiwgMHgzQjcxLCAweDNCN0IsCi0gICAgMHg2OTA5LCAweDY5NDMsIDB4NzI1QywgMHg2OTY0LCAweDY5OUYsIDB4Njk4NSwgMHg2OUQ2LCAweDNCREQsCi0gICAgMHg2QTY1LCAweDZBNzQsIDB4NkE3MSwgMHg2QTgyLCAweDNCRUMsIDB4NkE5OSwgMHgzQkYyLCAweDZBQUIsCi0gICAgMHg2QUI1LCAweDZBRDQsIDB4NkFGNiwgMHg2QjgxLCAweDZCQzEsIDB4NkJFQSwgMHg2Qzc1LCAweDZDQUEsCi0gICAgMHgzQ0NCLCAweDZEMDIsIDB4NkQwNiwgMHg2RDI2LCAweDZEODEsIDB4M0NFRiwgMHg2REE0LCAweDZEQjEsCi0gICAgMHg2RTE1LCAweDZFMTgsIDB4NkUyOSwgMHg2RTg2LCAweDAwMDAsIDB4NkVCQiwgMHg2RUUyLCAweDZFREEsCi0gICAgMHg5RjdGLCAweDZFRTgsIDB4NkVFOSwgMHg2RjI0LCAweDZGMzQsIDB4M0Q0NiwgMHgwMDAwLCAweDZGODEsCi0gICAgMHg2RkJFLCAweDNENkEsIDB4M0Q3NSwgMHg3MUI3LCAweDVDOTksIDB4M0Q4QSwgMHg3MDJDLCAweDNEOTEsCi0gICAgMHg3MDUwLCAweDcwNTQsIDB4NzA2RiwgMHg3MDdGLCAweDAwMDAsIDB4NDNDMSwgMHgzNUYxLCAweDAwMDAsCi0gICAgMHgzNjRFLCAweDNEQUQsIDB4MDAwMCwgMHg2NjdELCAweDdDNzQsIDB4NzQ4RCwgMHg3RTkyLCAweDQ1MDMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNDdFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3NzEsCi0gICAgMHg2M0MxLCAweDc3NzcsIDB4ODk4QSwgMHgwMDAwLCAweDhCNEMsIDB4MDAwMCwgMHg0OTJBLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4M0FGMCwgMHg3MDhGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY4ODgsCi0gICAgMHgwMDAwLCAweDlGNjIsIDB4OTNDNiwgMHgwMDAwLCAweDkzNjYsIDB4OTI4RiwgMHg4NjE0LCAweDAwMDAsCi0gICAgMHg0MTkwLCAweDY3OEYsIDB4NjgxRSwgMHgzODYzLCAweDAwMDAsIDB4M0IxOSwgMHg4NDk2LCAweDAwMDAsCi0gICAgMHgzOUUyLCAweDg0ODAsIDB4NDM2RSwgMHg5NzcxLCAweDk5OUIsIDB4NDkyRCwgMHg2RjE3LCAweDAwMDAsCi0gICAgMHg3MEE2LCAweDAwMDAsIDB4N0U2NSwgMHg1RDJGLCAweDNERjMsIDB4MDAwMCwgMHgwMDAwLCAweDdEQTQsCi0gICAgMHg4NDI2LCAweDU0ODUsIDB4MDAwMCwgMHgwMDAwLCAweDU3N0UsIDB4MDAwMCwgMHgwMDAwLCAweDNGRTUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NzAwMywgMHgwMDAwLCAweDVENzAsIDB4NzM4RiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg0RkM4LCAweDdGRTcsIDB4NzMxMCwgMHg3MzM4LCAweDczNDEsIDB4M0VBOSwgMHg3MUY1LCAweDAwMDAsCi0gICAgMHg3M0UxLCAweDNFQ0EsIDB4M0VEMSwgMHg3NDE5LCAweDc0MUUsIDB4NzQxRiwgMHgzRUUyLCAweDNFRjAsCi0gICAgMHgzRUY0LCAweDNFRkEsIDB4NzREMywgMHgzRjBFLCAweDNGNTMsIDB4NzU2RCwgMHg3NTcyLCAweDc1OEQsCi0gICAgMHgzRjdDLCAweDc1QzgsIDB4NzY0RCwgMHg3Njc0LCAweDNGREMsIDB4NzY3QSwgMHg3MTg4LCAweDU2MjMsCi0gICAgMHg4OTgwLCAweDQwMUQsIDB4Nzc0MywgMHg0MDM5LCAweDQwNDUsIDB4MzVEQiwgMHg3Nzk4LCAweDQwNkEsCi0gICAgMHg0MDZGLCAweDc3QkUsIDB4NzdDQiwgMHg3ODE4LCAweDc4MUMsIDB4Nzg0NywgMHg3ODUxLCAweDc4NjYsCi0gICAgMHg4NDQ4LCAweDAwMDAsIDB4NzkzMywgMHg3OTMyLCAweDQxMDksIDB4Nzk5MSwgMHg3QTA2LCAweDQxNjcsCi0gICAgMHg0MUIyLCAweDdBQkMsIDB4ODI3OSwgMHg0MUM0LCAweDdBQ0YsIDB4N0FEQiwgMHg0MUNGLCAweDdCNjIsCi0gICAgMHg3QjZDLCAweDdCN0IsIDB4N0MxMiwgMHg0MjYwLCAweDQyN0EsIDB4N0M3QiwgMHg3QzlDLCAweDQyOEMsCi0gICAgMHg3Q0I4LCAweDQyOTQsIDB4OEY5MywgMHg3MEMwLCAweDAwMDAsIDB4N0RDRiwgMHg3REQ0LCAweDdERDAsCi0gICAgMHg3REZELCAweDdGQjQsIDB4NzI5RiwgMHg0Mzk3LCAweDgwMjAsIDB4ODAyNSwgMHg4MDJFLCAweDgwMzEsCi0gICAgMHg4MDU0LCAweDU3QjQsIDB4NzBBMCwgMHg4MEI3LCAweDgwRTksIDB4NDNFRCwgMHg4MTBDLCAweDgxMEUsCi0gICAgMHg4MTEyLCAweDgxMTQsIDB4NDQwMSwgMHgzQjM5LCAweDgxNTYsIDB4ODE1OSwgMHg4MTVBLCAweDQ0MTMsCi0gICAgMHg4MTdDLCAweDQ0MjUsIDB4NDQyRCwgMHg4MUE1LCAweDU3RUYsIDB4ODFDMSwgMHg4MUU0LCAweDgyNTQsCi0gICAgMHg0NDhGLCAweDgyNzYsIDB4ODJDQSwgMHg4MkQ4LCAweDQ0QjAsIDB4ODM1NywgMHg5NjY5LCAweDg0MDUsCi0gICAgMHg3MEY1LCAweDg0NjQsIDB4ODQ4OCwgMHg0NTA0LCAweDg0QkUsIDB4ODRFMSwgMHg4NEY4LCAweDg1MTAsCi0gICAgMHg4NTM4LCAweDg1NTIsIDB4NDUzQiwgMHg4NTZGLCAweDg1NzAsIDB4ODVFMCwgMHg0NTc3LCAweDg2NzIsCi0gICAgMHg4NjkyLCAweDg2RUYsIDB4OTY0NSwgMHg0NjA2LCAweDQ2MTcsIDB4ODhBRSwgMHg4OEZGLCAweDg5MjQsCi0gICAgMHg4OTkxLCAweDAwMDAsIDB4OEEzOCwgMHg4QTk0LCAweDhBQjQsIDB4OEM1MSwgMHg4Q0Q0LCAweDhDRjIsCi0gICAgMHg4RDFDLCAweDQ3OTgsIDB4OERDMywgMHg0N0VELCAweDhFM0EsIDB4NTc1NCwgMHg1NUY1LCAweDQ4MzcsCi0gICAgMHg4RUNFLCAweDhFRTIsIDB4OEVFNCwgMHg4RUVELCAweDhFRjIsIDB4OEZDMSwgMHg4RkNBLCAweDhGQ0MsCi0gICAgMHg5MDMzLCAweDQ4QUQsIDB4OThFMCwgMHg5MjEzLCAweDQ5MUUsIDB4OTIyOCwgMHg5MjU4LCAweDkyNkIsCi0gICAgMHg5MkIxLCAweDkyQUUsIDB4OTJCRiwgMHg5MkUzLCAweDkyRUIsIDB4OTJGMywgMHg5MkY0LCAweDkyRkQsCi0gICAgMHg5MzQzLCAweDkzODQsIDB4OTNBRCwgMHg0OTQ1LCAweDQ5NTEsIDB4OTQxNywgMHg5NDFELCAweDk0MkQsCi0gICAgMHg5NDNFLCAweDQ5NkEsIDB4OTQ1NCwgMHg5NDc5LCAweDk1MkQsIDB4OTVBMiwgMHg0OUE3LCAweDk1RjQsCi0gICAgMHg5NjMzLCAweDQ5RTUsIDB4NEEyNCwgMHg5NzQwLCAweDRBMzUsIDB4OTdCMiwgMHg5N0MyLCAweDRBRTQsCi0gICAgMHg5OEI5LCAweDRCMTksIDB4OThGMSwgMHg1ODQ0LCAweDk5MTksIDB4OTkzNywgMHg5OTVELCAweDk5NjIsCi0gICAgMHg0QjcwLCAweDk5QzUsIDB4NEI5RCwgMHg5QTNDLCAweDlCMEYsIDB4OUI2OSwgMHg5QkRELCAweDlCRjEsCi0gICAgMHg5QkY0LCAweDRDNkQsIDB4OUMyMCwgMHgzNzZGLCAweDAwMDAsIDB4OUQ0OSwgMHg5RUZFLCAweDU2NTAsCi0gICAgMHg5REJELCAweDlERkMsIDB4OTRGNiwgMHg4RkI2LCAweDlFQjEsIDB4OUVCRCwgMHg5RUM2LCAweDk0REMsCi0gICAgMHg5RUUyLCAweDlFRjEsIDB4OUVGOCwgMHg5RjQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDk0QzMsCi0gICAgMHgwMDAwLCAweDk0QzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NzU3LCAweDcxNzMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTQ5RSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNjQ3LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NTM2NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NzBCQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzE5OCwgMHgwMDAwLCAweDY5RTksCi0gICAgMHgzNkM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg1OEI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1Nzg4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NTk2NSwgMHgwMDAwLCAweDAwMDAsIDB4NTczRiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU3QTEsIDB4NzE1MSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU2QjksCi0gICAgMHgwMDAwLCAweDM2MTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTQ5RiwgMHgwMDAwLCAweDM2QjksCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NTZENiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDYzRTYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzREY3LCAweDAwMDAsIDB4MDAwMCwgMHg4RkQwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3RTlGLCAweDAwMDAsIDB4MDAwMCwgMHg0Q0E0LCAweDk1NDcsCi0gICAgMHgwMDAwLCAweDcxQTIsIDB4MDAwMCwgMHgwMDAwLCAweDREOUMsIDB4MDAwMCwgMHg4RkJFLCAweDhGQkEsCi0gICAgMHgwMDAwLCAweDhGQjksIDB4MDAwMCwgMHg0RUVBLCAweDAwMDAsIDB4OEU4MCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NEU5QSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzREM2LCAweDAwMDAsCi0gICAgMHg0RTFDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTVERSwgMHg4Nzg2LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDVCOTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NEUxQSwgMHg0RTA0LCAweDVCMEQsCi0gICAgMHgzNkFDLCAweDUzN0QsIDB4MzZBNSwgMHg1ODlBLCAweDAwMDAsIDB4NTdBQSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU3QTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5QzFCLCAweDAwMDAsIDB4M0UwNiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NTc3QSwgMHg1NERBLCAweDcxN0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNjM1LCAweDAwMDAsCi0gICAgMHg1MjIwLCAweDNDMTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg0NTYyLCAweDVCMUYsIDB4MDAwMCwgMHg5RjUwLCAweDlFQTYsIDB4MDAwMCwgMHg1MUUyLCAweDUzNDIsCi0gICAgMHg2NkFELCAweDU4NUMsIDB4NTU1MywgMHgzRDg1LCAweDYxNjAsIDB4NDhBRSwgMHg5N0JELCAweDAwMDAsCi0gICAgMHg2MEIzLCAweDg0MjQsIDB4OTgxNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzQjJCLCAweDNEMzIsCi0gICAgMHgwMDAwLCAweDcwODEsIDB4NUM5QywgMHgwMDAwLCAweDM3MzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAxMDAsIDB4MDBDMSwgMHgwMUNELCAweDAwQzAsIDB4MDExMiwgMHgwMEM5LCAweDAxMUEsCi0gICAgMHgwMEM4LCAweDAxNEMsIDB4MDBEMywgMHgwMUQxLCAweDAwRDIsIDB4RjMyNSwgMHgxRUJFLCAweEYzMjcsCi0gICAgMHgxRUMwLCAweDAwQ0EsIDB4MDEwMSwgMHgwMEUxLCAweDAxQ0UsIDB4MDBFMCwgMHgwMjUxLCAweDAxMTMsCi0gICAgMHgwMEU5LCAweDAxMUIsIDB4MDBFOCwgMHgwMTJCLCAweDAwRUQsIDB4MDFEMCwgMHgwMEVDLCAweDAxNEQsCi0gICAgMHgwMEYzLCAweDAxRDIsIDB4MDBGMiwgMHgwMTZCLCAweDAwRkEsIDB4MDFENCwgMHgwMEY5LCAweDAxRDYsCi0gICAgMHgwMUQ4LCAweDAxREEsIDB4MDFEQywgMHgwMEZDLCAweEYzNDQsIDB4MUVCRiwgMHhGMzQ2LCAweDFFQzEsCi0gICAgMHgwMEVBLCAweDAyNjEsIDB4MDI4MywgMHgwMjUwLCAweDAyNUIsIDB4MDI1NCwgMHgwMjc1LCAweDAxNTMsCi0gICAgMHgwMEY4LCAweDAxNEIsIDB4MDI4QSwgMHgwMjZBLCAweDIzREEsIDB4MjNEQiwgMHgyRTlELCAweDJFQzYsCi0gICAgMHgyRUUzLCAweDUwM0IsIDB4NkRGRSwgMHgwMDAwLCAweDlGQTYsIDB4M0RDOSwgMHg4ODhGLCAweDAwMDAsCi0gICAgMHg3MDc3LCAweDVDRjUsIDB4NEIyMCwgMHgwMDAwLCAweDM1NTksIDB4MDAwMCwgMHg2MTIyLCAweDAwMDAsCi0gICAgMHg4RkE3LCAweDkxRjYsIDB4NzE5MSwgMHg2NzE5LCAweDczQkEsIDB4MDAwMCwgMHgwMDAwLCAweDNDOEIsCi0gICAgMHgwMDAwLCAweDRCMTAsIDB4NzhFNCwgMHg3NDAyLCAweDUxQUUsIDB4MDAwMCwgMHg0MDA5LCAweDZBNjMsCi0gICAgMHgwMDAwLCAweDQyMjMsIDB4ODYwRiwgMHg3QTJBLCAweDAwMDAsIDB4MDAwMCwgMHg5NzU1LCAweDcwNEQsCi0gICAgMHg1MzI0LCAweDAwMDAsIDB4OTNGNCwgMHg3NkQ5LCAweDAwMDAsIDB4OUZBNywgMHg3N0RELCAweDRFQTMsCi0gICAgMHg0RkYwLCAweDUwQkMsIDB4NEUyRiwgMHg0RjE3LCAweDlGQTgsIDB4NTQzNCwgMHg3RDhCLCAweDU4OTIsCi0gICAgMHg1OEQwLCAweDAwMDAsIDB4NUU5MiwgMHg1RTk5LCAweDVGQzIsIDB4MDAwMCwgMHg2NThCLCAweDAwMDAsCi0gICAgMHg2OTE5LCAweDZBNDMsIDB4MDAwMCwgMHg2Q0ZGLCAweDcyMDAsIDB4MDAwMCwgMHg3MzhDLCAweDNFREIsCi0gICAgMHgwMDAwLCAweDVCMTUsIDB4NzRCOSwgMHg4QjgzLCAweDAwMDAsIDB4MDAwMCwgMHg3QTkzLCAweDdCRUMsCi0gICAgMHg3Q0MzLCAweDdFNkMsIDB4ODJGOCwgMHg4NTk3LCAweDlGQTksIDB4ODg5MCwgMHg5RkFBLCAweDhFQjksCi0gICAgMHg5RkFCLCAweDhGQ0YsIDB4ODU1RiwgMHg5OUUwLCAweDkyMjEsIDB4OUZBQywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg0MDcxLCAweDQyQTIsIDB4NUExQSwgMHg5ODY4LCAweDY3NkIsIDB4NDI3NiwgMHg1NzNELCAweDg1RDYsCi0gICAgMHgwMDAwLCAweDgyQkYsIDB4MDAwMCwgMHg0QzgxLCAweDAwMDAsIDB4NUQ3QiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5RkFELCAweDlGQUUsIDB4NUI5NiwgMHg5RkFGLCAweDdFNUIsIDB4NDNGMCwgMHg0QzMyLCAweDQ2MDMsCi0gICAgMHg0NUE2LCAweDQ1NzgsIDB4MDAwMCwgMHg0RDc3LCAweDQ1QjMsIDB4MDAwMCwgMHg0Q0UyLCAweDAwMDAsCi0gICAgMHgzQjk1LCAweDQ3MzYsIDB4NDc0NCwgMHg0QzQ3LCAweDRDNDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4NEM1NywgMHgwMDAwLCAweDQ3NEYsIDB4NDVEQSwgMHg0Qzg1LCAweDAwMDAsCi0gICAgMHg0RDA3LCAweDRBQTQsIDB4NDZBMSwgMHgwMDAwLCAweDcyMjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDY2NEQsIDB4NTZGQiwgMHg3RDk1LCAweDU5MUQsIDB4MDAwMCwgMHgzREY0LCAweDk3MzQsCi0gICAgMHgwMDAwLCAweDVCREIsIDB4MDAwMCwgMHg1QUE0LCAweDM2MjUsIDB4MDAwMCwgMHg1QUQxLCAweDVCQjcsCi0gICAgMHg1Q0ZDLCAweDY3NkUsIDB4ODU5MywgMHgwMDAwLCAweDc0NjEsIDB4NzQ5RCwgMHgwMDAwLCAweDY2RTcsCi0gICAgMHg2RTU3LCAweDc5Q0EsIDB4M0Q4OCwgMHg0NEMzLCAweDAwMDAsIDB4MDAwMCwgMHg0MzlBLCAweDQ1MzYsCi0gICAgMHg1Q0Q1LCAweDAwMDAsIDB4OEFGOSwgMHg1Qzc4LCAweDNEMTIsIDB4MDAwMCwgMHg1RDc4LCAweDlGQjIsCi0gICAgMHg3MTU3LCAweDQ1NTgsIDB4MDAwMCwgMHgwMDAwLCAweDRDNzcsIDB4Mzk3OCwgMHgzNDRBLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhBQ0MsIDB4NEZCNCwgMHgwMDAwLCAweDU5QkYsIDB4ODE2QywgMHg5ODU2LCAweDAwMDAsCi0gICAgMHg1RjNCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQxMDIsIDB4NDZCQiwgMHgwMDAwLCAweDNGMDcsCi0gICAgMHg5RkIzLCAweDAwMDAsIDB4NDBGOCwgMHgzN0Q2LCAweDQ2RjcsIDB4MDAwMCwgMHg0MTdDLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDQ1NkQsIDB4MzhENCwgMHgwMDAwLCAweDQ1NjEsIDB4NDUxQiwgMHg0RDg5LCAweDRDN0IsCisgICAgMHhGRkZELCAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLAorICAgIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksCisgICAgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwKKyAgICAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLAorICAgIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsCisgICAgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwKKyAgICAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LAorICAgIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwKKyAgICAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLCAweDAwQTksIDB4MjEyMiwgMHgyMDI2LAorICAgIDB4MzAwMCwgMHhGRjBDLCAweDMwMDEsIDB4MzAwMiwgMHhGRjBFLCAweDIwMjcsIDB4RkYxQiwgMHhGRjFBLCAweEZGMUYsCisgICAgMHhGRjAxLCAweEZFMzAsIDB4MjJFRiwgMHgyMDI1LCAweEZFNTAsIDB4RkU1MSwgMHhGRTUyLCAweDAwQjcsIDB4RkU1NCwKKyAgICAweEZFNTUsIDB4RkU1NiwgMHhGRTU3LCAweEZGNUMsIDB4MjAxMywgMHhGRTMxLCAweDIwMTQsIDB4RkZGRCwgMHhGRkZELAorICAgIDB4RkZGRCwgMHhGRkZELCAweEZGMDgsIDB4RkYwOSwgMHhGRTM1LCAweEZFMzYsIDB4RkY1QiwgMHhGRjVELCAweEZFMzcsCisgICAgMHhGRTM4LCAweDMwMTQsIDB4MzAxNSwgMHhGRTM5LCAweEZFM0EsIDB4MzAxMCwgMHgzMDExLCAweEZFM0IsIDB4RkUzQywKKyAgICAweDMwMEEsIDB4MzAwQiwgMHhGRTNELCAweEZFM0UsIDB4MzAwOCwgMHgzMDA5LCAweEZFM0YsIDB4RkU0MCwgMHgzMDBDLAorICAgIDB4MzAwRCwgMHhGRTQxLCAweEZFNDIsIDB4MzAwRSwgMHgzMDBGLCAweEZFNDMsIDB4RkU0NCwgMHhGRTU5LCAweEZFNUEsCisgICAgMHhGRTVCLCAweEZFNUMsIDB4RkU1RCwgMHhGRTVFLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MzAxRCwKKyAgICAweDMwMUUsIDB4MjAzNSwgMHgyMDMyLCAweEZGMDMsIDB4RkYwNiwgMHhGRjBBLCAweDIwM0IsIDB4MDBBNywgMHgzMDAzLAorICAgIDB4MjVDQiwgMHgyNUNGLCAweDI1QjMsIDB4MjVCMiwgMHgyNUNFLCAweDI2MDYsIDB4MjYwNSwgMHgyNUM3LCAweDI1QzYsCisgICAgMHgyNUExLCAweDI1QTAsIDB4MjVCRCwgMHgyNUJDLCAweDMyQTMsIDB4MjEwNSwgMHgyMDNFLCAweEZGRTMsIDB4RkYzRiwKKyAgICAweDAyQ0QsIDB4RkU0OSwgMHhGRTRBLCAweEZFNEQsIDB4RkU0RSwgMHhGRTRCLCAweEZFNEMsIDB4RkU1RiwgMHhGRTYwLAorICAgIDB4RkU2MSwgMHhGRjBCLCAweEZGMEQsIDB4MDBENywgMHgwMEY3LCAweDAwQjEsIDB4MjIxQSwgMHhGRjFDLCAweEZGMUUsCisgICAgMHhGRjFELCAweDIyNjYsIDB4MjI2NywgMHgyMjYwLCAweDIyMUUsIDB4MjI1MiwgMHgyMjYxLCAweEZFNjIsIDB4RkU2MywKKyAgICAweEZFNjQsIDB4RkU2NSwgMHhGRTY2LCAweDIyM0MsIDB4MjIyOSwgMHgyMjJBLCAweDIyQTUsIDB4MjIyMCwgMHgyMjFGLAorICAgIDB4MjJCRiwgMHgzM0QyLCAweDMzRDEsIDB4MjIyQiwgMHgyMjJFLCAweDIyMzUsIDB4MjIzNCwgMHgyNjQwLCAweDI2NDIsCisgICAgMHgyMjk1LCAweDI2MDksIDB4MjE5MSwgMHgyMTkzLCAweDIxOTIsIDB4MjE5MCwgMHgyMTk2LCAweDIxOTcsIDB4MjE5OSwKKyAgICAweDIxOTgsIDB4MjIyNSwgMHgyMjIzLCAweEZGMEYsIDB4RkYzQywgMHhGRjBGLCAweEZGM0MsIDB4RkYwNCwgMHgwMEE1LAorICAgIDB4MzAxMiwgMHgwMEEyLCAweDAwQTMsIDB4RkYwNSwgMHhGRjIwLCAweDIxMDMsIDB4MjEwOSwgMHhGRTY5LCAweEZFNkEsCisgICAgMHhGRTZCLCAweDMzRDUsIDB4MzM5QywgMHgzMzlELCAweDMzOUUsIDB4MzNDRSwgMHgzM0ExLCAweDMzOEUsIDB4MzM4RiwKKyAgICAweDMzQzQsIDB4MDBCMCwgMHg1MTU5LCAweDUxNUIsIDB4NTE1RSwgMHg1MTVELCAweDUxNjEsIDB4NTE2MywgMHg1NUU3LAorICAgIDB4NzRFOSwgMHg3Q0NFLCAweDI1ODEsIDB4MjU4MiwgMHgyNTgzLCAweDI1ODQsIDB4MjU4NSwgMHgyNTg2LCAweDI1ODcsCisgICAgMHgyNTg4LCAweDI1OEYsIDB4MjU4RSwgMHgyNThELCAweDI1OEMsIDB4MjU4QiwgMHgyNThBLCAweDI1ODksIDB4MjUzQywKKyAgICAweDI1MzQsIDB4MjUyQywgMHgyNTI0LCAweDI1MUMsIDB4MjU5NCwgMHgyNTAwLCAweDI1MDIsIDB4MjU5NSwgMHgyNTBDLAorICAgIDB4MjUxMCwgMHgyNTE0LCAweDI1MTgsIDB4MjU2RCwgMHgyNTZFLCAweDI1NzAsIDB4MjU2RiwgMHgyNTUwLCAweDI1NUUsCisgICAgMHgyNTZBLCAweDI1NjEsIDB4MjVFMiwgMHgyNUUzLCAweDI1RTUsIDB4MjVFNCwgMHgyNTcxLCAweDI1NzIsIDB4MjU3MywKKyAgICAweEZGMTAsIDB4RkYxMSwgMHhGRjEyLCAweEZGMTMsIDB4RkYxNCwgMHhGRjE1LCAweEZGMTYsIDB4RkYxNywgMHhGRjE4LAorICAgIDB4RkYxOSwgMHgyMTYwLCAweDIxNjEsIDB4MjE2MiwgMHgyMTYzLCAweDIxNjQsIDB4MjE2NSwgMHgyMTY2LCAweDIxNjcsCisgICAgMHgyMTY4LCAweDIxNjksIDB4MzAyMSwgMHgzMDIyLCAweDMwMjMsIDB4MzAyNCwgMHgzMDI1LCAweDMwMjYsIDB4MzAyNywKKyAgICAweDMwMjgsIDB4MzAyOSwgMHgzMDM4LCAweDUzNDQsIDB4MzAzQSwgMHhGRjIxLCAweEZGMjIsIDB4RkYyMywgMHhGRjI0LAorICAgIDB4RkYyNSwgMHhGRjI2LCAweEZGMjcsIDB4RkYyOCwgMHhGRjI5LCAweEZGMkEsIDB4RkYyQiwgMHhGRjJDLCAweEZGMkQsCisgICAgMHhGRjJFLCAweEZGMkYsIDB4RkYzMCwgMHhGRjMxLCAweEZGMzIsIDB4RkYzMywgMHhGRjM0LCAweEZGMzUsIDB4RkYzNiwKKyAgICAweEZGMzcsIDB4RkYzOCwgMHhGRjM5LCAweEZGM0EsIDB4RkY0MSwgMHhGRjQyLCAweEZGNDMsIDB4RkY0NCwgMHhGRjQ1LAorICAgIDB4RkY0NiwgMHhGRjQ3LCAweEZGNDgsIDB4RkY0OSwgMHhGRjRBLCAweEZGNEIsIDB4RkY0QywgMHhGRjRELCAweEZGNEUsCisgICAgMHhGRjRGLCAweEZGNTAsIDB4RkY1MSwgMHhGRjUyLCAweEZGNTMsIDB4RkY1NCwgMHhGRjU1LCAweEZGNTYsIDB4RkY1NywKKyAgICAweEZGNTgsIDB4RkY1OSwgMHhGRjVBLCAweDAzOTEsIDB4MDM5MiwgMHgwMzkzLCAweDAzOTQsIDB4MDM5NSwgMHgwMzk2LAorICAgIDB4MDM5NywgMHgwMzk4LCAweDAzOTksIDB4MDM5QSwgMHgwMzlCLCAweDAzOUMsIDB4MDM5RCwgMHgwMzlFLCAweDAzOUYsCisgICAgMHgwM0EwLCAweDAzQTEsIDB4MDNBMywgMHgwM0E0LCAweDAzQTUsIDB4MDNBNiwgMHgwM0E3LCAweDAzQTgsIDB4MDNBOSwKKyAgICAweDAzQjEsIDB4MDNCMiwgMHgwM0IzLCAweDAzQjQsIDB4MDNCNSwgMHgwM0I2LCAweDAzQjcsIDB4MDNCOCwgMHgwM0I5LAorICAgIDB4MDNCQSwgMHgwM0JCLCAweDAzQkMsIDB4MDNCRCwgMHgwM0JFLCAweDAzQkYsIDB4MDNDMCwgMHgwM0MxLCAweDAzQzMsCisgICAgMHgwM0M0LCAweDAzQzUsIDB4MDNDNiwgMHgwM0M3LCAweDAzQzgsIDB4MDNDOSwgMHgzMTA1LCAweDMxMDYsIDB4MzEwNywKKyAgICAweDMxMDgsIDB4MzEwOSwgMHgzMTBBLCAweDMxMEIsIDB4MzEwQywgMHgzMTBELCAweDMxMEUsIDB4MzEwRiwgMHgzMTEwLAorICAgIDB4MzExMSwgMHgzMTEyLCAweDMxMTMsIDB4MzExNCwgMHgzMTE1LCAweDMxMTYsIDB4MzExNywgMHgzMTE4LCAweDMxMTksCisgICAgMHgzMTFBLCAweDMxMUIsIDB4MzExQywgMHgzMTFELCAweDMxMUUsIDB4MzExRiwgMHgzMTIwLCAweDMxMjEsIDB4MzEyMiwKKyAgICAweDMxMjMsIDB4MzEyNCwgMHgzMTI1LCAweDMxMjYsIDB4MzEyNywgMHgzMTI4LCAweDMxMjksIDB4MDJEOSwgMHgwMkNBLAorICAgIDB4MDJDNywgMHgwMkNCLCAweDI0NjAsIDB4MjQ2MSwgMHgyNDYyLCAweDI0NjMsIDB4MjQ2NCwgMHgyNDY1LCAweDI0NjYsCisgICAgMHgyNDY3LCAweDI0NjgsIDB4MjQ2OSwgMHgyNDc0LCAweDI0NzUsIDB4MjQ3NiwgMHgyNDc3LCAweDI0NzgsIDB4MjQ3OSwKKyAgICAweDI0N0EsIDB4MjQ3QiwgMHgyNDdDLCAweDI0N0QsIDB4MjE3MCwgMHgyMTcxLCAweDIxNzIsIDB4MjE3MywgMHgyMTc0LAorICAgIDB4MjE3NSwgMHgyMTc2LCAweDIxNzcsIDB4MjE3OCwgMHgyMTc5LCAweDRFMjgsIDB4NEUzNiwgMHg0RTNGLCAweDRFODUsCisgICAgMHg0RUEwLCAweDUxODIsIDB4NTE5NiwgMHg1MUFCLCAweDUyRjksIDB4NTMzOCwgMHg1MzY5LCAweDUzQjYsIDB4NTkwMiwKKyAgICAweDVCODAsIDB4NUREQiwgMHg1RTdBLCAweDVFN0YsIDB4NUVGNCwgMHg1RjUwLCAweDVGNjEsIDB4NjUzNCwgMHg2NUUwLAorICAgIDB4NzU5MiwgMHg3Njc2LCAweDhGQjUsIDB4OTZCNiwgMHgyNDAwLCAweDI0MDEsIDB4MjQwMiwgMHgyNDAzLCAweDI0MDQsCisgICAgMHgyNDA1LCAweDI0MDYsIDB4MjQwNywgMHgyNDA4LCAweDI0MDksIDB4MjQwQSwgMHgyNDBCLCAweDI0MEMsIDB4MjQwRCwKKyAgICAweDI0MEUsIDB4MjQwRiwgMHgyNDEwLCAweDI0MTEsIDB4MjQxMiwgMHgyNDEzLCAweDI0MTQsIDB4MjQxNSwgMHgyNDE2LAorICAgIDB4MjQxNywgMHgyNDE4LCAweDI0MTksIDB4MjQxQSwgMHgyNDFCLCAweDI0MUMsIDB4MjQxRCwgMHgyNDFFLCAweDI0MUYsCisgICAgMHgyNDIxLCAweDRFMDAsIDB4NEU1OSwgMHg0RTAxLCAweDRFMDMsIDB4NEU0MywgMHg0RTVELCAweDRFODYsIDB4NEU4QywKKyAgICAweDRFQkEsIDB4NTEzRiwgMHg1MTY1LCAweDUxNkIsIDB4NTFFMCwgMHg1MjAwLCAweDUyMDEsIDB4NTI5QiwgMHg1MzE1LAorICAgIDB4NTM0MSwgMHg1MzVDLCAweDUzQzgsIDB4NEUwOSwgMHg0RTBCLCAweDRFMDgsIDB4NEUwQSwgMHg0RTJCLCAweDRFMzgsCisgICAgMHg1MUUxLCAweDRFNDUsIDB4NEU0OCwgMHg0RTVGLCAweDRFNUUsIDB4NEU4RSwgMHg0RUExLCAweDUxNDAsIDB4NTIwMywKKyAgICAweDUyRkEsIDB4NTM0MywgMHg1M0M5LCAweDUzRTMsIDB4NTcxRiwgMHg1OEVCLCAweDU5MTUsIDB4NTkyNywgMHg1OTczLAorICAgIDB4NUI1MCwgMHg1QjUxLCAweDVCNTMsIDB4NUJGOCwgMHg1QzBGLCAweDVDMjIsIDB4NUMzOCwgMHg1QzcxLCAweDVEREQsCisgICAgMHg1REU1LCAweDVERjEsIDB4NURGMiwgMHg1REYzLCAweDVERkUsIDB4NUU3MiwgMHg1RUZFLCAweDVGMEIsIDB4NUYxMywKKyAgICAweDYyNEQsIDB4NEUxMSwgMHg0RTEwLCAweDRFMEQsIDB4NEUyRCwgMHg0RTMwLCAweDRFMzksIDB4NEU0QiwgMHg1QzM5LAorICAgIDB4NEU4OCwgMHg0RTkxLCAweDRFOTUsIDB4NEU5MiwgMHg0RTk0LCAweDRFQTIsIDB4NEVDMSwgMHg0RUMwLCAweDRFQzMsCisgICAgMHg0RUM2LCAweDRFQzcsIDB4NEVDRCwgMHg0RUNBLCAweDRFQ0IsIDB4NEVDNCwgMHg1MTQzLCAweDUxNDEsIDB4NTE2NywKKyAgICAweDUxNkQsIDB4NTE2RSwgMHg1MTZDLCAweDUxOTcsIDB4NTFGNiwgMHg1MjA2LCAweDUyMDcsIDB4NTIwOCwgMHg1MkZCLAorICAgIDB4NTJGRSwgMHg1MkZGLCAweDUzMTYsIDB4NTMzOSwgMHg1MzQ4LCAweDUzNDcsIDB4NTM0NSwgMHg1MzVFLCAweDUzODQsCisgICAgMHg1M0NCLCAweDUzQ0EsIDB4NTNDRCwgMHg1OEVDLCAweDU5MjksIDB4NTkyQiwgMHg1OTJBLCAweDU5MkQsIDB4NUI1NCwKKyAgICAweDVDMTEsIDB4NUMyNCwgMHg1QzNBLCAweDVDNkYsIDB4NURGNCwgMHg1RTdCLCAweDVFRkYsIDB4NUYxNCwgMHg1RjE1LAorICAgIDB4NUZDMywgMHg2MjA4LCAweDYyMzYsIDB4NjI0QiwgMHg2MjRFLCAweDY1MkYsIDB4NjU4NywgMHg2NTk3LCAweDY1QTQsCisgICAgMHg2NUI5LCAweDY1RTUsIDB4NjZGMCwgMHg2NzA4LCAweDY3MjgsIDB4NkIyMCwgMHg2QjYyLCAweDZCNzksIDB4NkJDQiwKKyAgICAweDZCRDQsIDB4NkJEQiwgMHg2QzBGLCAweDZDMzQsIDB4NzA2QiwgMHg3MjJBLCAweDcyMzYsIDB4NzIzQiwgMHg3MjQ3LAorICAgIDB4NzI1OSwgMHg3MjVCLCAweDcyQUMsIDB4NzM4QiwgMHg0RTE5LCAweDRFMTYsIDB4NEUxNSwgMHg0RTE0LCAweDRFMTgsCisgICAgMHg0RTNCLCAweDRFNEQsIDB4NEU0RiwgMHg0RTRFLCAweDRFRTUsIDB4NEVEOCwgMHg0RUQ0LCAweDRFRDUsIDB4NEVENiwKKyAgICAweDRFRDcsIDB4NEVFMywgMHg0RUU0LCAweDRFRDksIDB4NEVERSwgMHg1MTQ1LCAweDUxNDQsIDB4NTE4OSwgMHg1MThBLAorICAgIDB4NTFBQywgMHg1MUY5LCAweDUxRkEsIDB4NTFGOCwgMHg1MjBBLCAweDUyQTAsIDB4NTI5RiwgMHg1MzA1LCAweDUzMDYsCisgICAgMHg1MzE3LCAweDUzMUQsIDB4NEVERiwgMHg1MzRBLCAweDUzNDksIDB4NTM2MSwgMHg1MzYwLCAweDUzNkYsIDB4NTM2RSwKKyAgICAweDUzQkIsIDB4NTNFRiwgMHg1M0U0LCAweDUzRjMsIDB4NTNFQywgMHg1M0VFLCAweDUzRTksIDB4NTNFOCwgMHg1M0ZDLAorICAgIDB4NTNGOCwgMHg1M0Y1LCAweDUzRUIsIDB4NTNFNiwgMHg1M0VBLCAweDUzRjIsIDB4NTNGMSwgMHg1M0YwLCAweDUzRTUsCisgICAgMHg1M0VELCAweDUzRkIsIDB4NTZEQiwgMHg1NkRBLCAweDU5MTYsIDB4NTkyRSwgMHg1OTMxLCAweDU5NzQsIDB4NTk3NiwKKyAgICAweDVCNTUsIDB4NUI4MywgMHg1QzNDLCAweDVERTgsIDB4NURFNywgMHg1REU2LCAweDVFMDIsIDB4NUUwMywgMHg1RTczLAorICAgIDB4NUU3QywgMHg1RjAxLCAweDVGMTgsIDB4NUYxNywgMHg1RkM1LCAweDYyMEEsIDB4NjI1MywgMHg2MjU0LCAweDYyNTIsCisgICAgMHg2MjUxLCAweDY1QTUsIDB4NjVFNiwgMHg2NzJFLCAweDY3MkMsIDB4NjcyQSwgMHg2NzJCLCAweDY3MkQsIDB4NkI2MywKKyAgICAweDZCQ0QsIDB4NkMxMSwgMHg2QzEwLCAweDZDMzgsIDB4NkM0MSwgMHg2QzQwLCAweDZDM0UsIDB4NzJBRiwgMHg3Mzg0LAorICAgIDB4NzM4OSwgMHg3NERDLCAweDc0RTYsIDB4NzUxOCwgMHg3NTFGLCAweDc1MjgsIDB4NzUyOSwgMHg3NTMwLCAweDc1MzEsCisgICAgMHg3NTMyLCAweDc1MzMsIDB4NzU4QiwgMHg3NjdELCAweDc2QUUsIDB4NzZCRiwgMHg3NkVFLCAweDc3REIsIDB4NzdFMiwKKyAgICAweDc3RjMsIDB4NzkzQSwgMHg3OUJFLCAweDdBNzQsIDB4N0FDQiwgMHg0RTFFLCAweDRFMUYsIDB4NEU1MiwgMHg0RTUzLAorICAgIDB4NEU2OSwgMHg0RTk5LCAweDRFQTQsIDB4NEVBNiwgMHg0RUE1LCAweDRFRkYsIDB4NEYwOSwgMHg0RjE5LCAweDRGMEEsCisgICAgMHg0RjE1LCAweDRGMEQsIDB4NEYxMCwgMHg0RjExLCAweDRGMEYsIDB4NEVGMiwgMHg0RUY2LCAweDRFRkIsIDB4NEVGMCwKKyAgICAweDRFRjMsIDB4NEVGRCwgMHg0RjAxLCAweDRGMEIsIDB4NTE0OSwgMHg1MTQ3LCAweDUxNDYsIDB4NTE0OCwgMHg1MTY4LAorICAgIDB4NTE3MSwgMHg1MThELCAweDUxQjAsIDB4NTIxNywgMHg1MjExLCAweDUyMTIsIDB4NTIwRSwgMHg1MjE2LCAweDUyQTMsCisgICAgMHg1MzA4LCAweDUzMjEsIDB4NTMyMCwgMHg1MzcwLCAweDUzNzEsIDB4NTQwOSwgMHg1NDBGLCAweDU0MEMsIDB4NTQwQSwKKyAgICAweDU0MTAsIDB4NTQwMSwgMHg1NDBCLCAweDU0MDQsIDB4NTQxMSwgMHg1NDBELCAweDU0MDgsIDB4NTQwMywgMHg1NDBFLAorICAgIDB4NTQwNiwgMHg1NDEyLCAweDU2RTAsIDB4NTZERSwgMHg1NkRELCAweDU3MzMsIDB4NTczMCwgMHg1NzI4LCAweDU3MkQsCisgICAgMHg1NzJDLCAweDU3MkYsIDB4NTcyOSwgMHg1OTE5LCAweDU5MUEsIDB4NTkzNywgMHg1OTM4LCAweDU5ODQsIDB4NTk3OCwKKyAgICAweDU5ODMsIDB4NTk3RCwgMHg1OTc5LCAweDU5ODIsIDB4NTk4MSwgMHg1QjU3LCAweDVCNTgsIDB4NUI4NywgMHg1Qjg4LAorICAgIDB4NUI4NSwgMHg1Qjg5LCAweDVCRkEsIDB4NUMxNiwgMHg1Qzc5LCAweDVEREUsIDB4NUUwNiwgMHg1RTc2LCAweDVFNzQsCisgICAgMHg1RjBGLCAweDVGMUIsIDB4NUZEOSwgMHg1RkQ2LCAweDYyMEUsIDB4NjIwQywgMHg2MjBELCAweDYyMTAsIDB4NjI2MywKKyAgICAweDYyNUIsIDB4NjI1OCwgMHg2NTM2LCAweDY1RTksIDB4NjVFOCwgMHg2NUVDLCAweDY1RUQsIDB4NjZGMiwgMHg2NkYzLAorICAgIDB4NjcwOSwgMHg2NzNELCAweDY3MzQsIDB4NjczMSwgMHg2NzM1LCAweDZCMjEsIDB4NkI2NCwgMHg2QjdCLCAweDZDMTYsCisgICAgMHg2QzVELCAweDZDNTcsIDB4NkM1OSwgMHg2QzVGLCAweDZDNjAsIDB4NkM1MCwgMHg2QzU1LCAweDZDNjEsIDB4NkM1QiwKKyAgICAweDZDNEQsIDB4NkM0RSwgMHg3MDcwLCAweDcyNUYsIDB4NzI1RCwgMHg3NjdFLCAweDdBRjksIDB4N0M3MywgMHg3Q0Y4LAorICAgIDB4N0YzNiwgMHg3RjhBLCAweDdGQkQsIDB4ODAwMSwgMHg4MDAzLCAweDgwMEMsIDB4ODAxMiwgMHg4MDMzLCAweDgwN0YsCisgICAgMHg4MDg5LCAweDgwOEIsIDB4ODA4QywgMHg4MUUzLCAweDgxRUEsIDB4ODFGMywgMHg4MUZDLCAweDgyMEMsIDB4ODIxQiwKKyAgICAweDgyMUYsIDB4ODI2RSwgMHg4MjcyLCAweDgyN0UsIDB4ODY2QiwgMHg4ODQwLCAweDg4NEMsIDB4ODg2MywgMHg4OTdGLAorICAgIDB4OTYyMSwgMHg0RTMyLCAweDRFQTgsIDB4NEY0RCwgMHg0RjRGLCAweDRGNDcsIDB4NEY1NywgMHg0RjVFLCAweDRGMzQsCisgICAgMHg0RjVCLCAweDRGNTUsIDB4NEYzMCwgMHg0RjUwLCAweDRGNTEsIDB4NEYzRCwgMHg0RjNBLCAweDRGMzgsIDB4NEY0MywKKyAgICAweDRGNTQsIDB4NEYzQywgMHg0RjQ2LCAweDRGNjMsIDB4NEY1QywgMHg0RjYwLCAweDRGMkYsIDB4NEY0RSwgMHg0RjM2LAorICAgIDB4NEY1OSwgMHg0RjVELCAweDRGNDgsIDB4NEY1QSwgMHg1MTRDLCAweDUxNEIsIDB4NTE0RCwgMHg1MTc1LCAweDUxQjYsCisgICAgMHg1MUI3LCAweDUyMjUsIDB4NTIyNCwgMHg1MjI5LCAweDUyMkEsIDB4NTIyOCwgMHg1MkFCLCAweDUyQTksIDB4NTJBQSwKKyAgICAweDUyQUMsIDB4NTMyMywgMHg1MzczLCAweDUzNzUsIDB4NTQxRCwgMHg1NDJELCAweDU0MUUsIDB4NTQzRSwgMHg1NDI2LAorICAgIDB4NTQ0RSwgMHg1NDI3LCAweDU0NDYsIDB4NTQ0MywgMHg1NDMzLCAweDU0NDgsIDB4NTQ0MiwgMHg1NDFCLCAweDU0MjksCisgICAgMHg1NDRBLCAweDU0MzksIDB4NTQzQiwgMHg1NDM4LCAweDU0MkUsIDB4NTQzNSwgMHg1NDM2LCAweDU0MjAsIDB4NTQzQywKKyAgICAweDU0NDAsIDB4NTQzMSwgMHg1NDJCLCAweDU0MUYsIDB4NTQyQywgMHg1NkVBLCAweDU2RjAsIDB4NTZFNCwgMHg1NkVCLAorICAgIDB4NTc0QSwgMHg1NzUxLCAweDU3NDAsIDB4NTc0RCwgMHg1NzQ3LCAweDU3NEUsIDB4NTczRSwgMHg1NzUwLCAweDU3NEYsCisgICAgMHg1NzNCLCAweDU4RUYsIDB4NTkzRSwgMHg1OTlELCAweDU5OTIsIDB4NTlBOCwgMHg1OTlFLCAweDU5QTMsIDB4NTk5OSwKKyAgICAweDU5OTYsIDB4NTk4RCwgMHg1OUE0LCAweDU5OTMsIDB4NTk4QSwgMHg1OUE1LCAweDVCNUQsIDB4NUI1QywgMHg1QjVBLAorICAgIDB4NUI1QiwgMHg1QjhDLCAweDVCOEIsIDB4NUI4RiwgMHg1QzJDLCAweDVDNDAsIDB4NUM0MSwgMHg1QzNGLCAweDVDM0UsCisgICAgMHg1QzkwLCAweDVDOTEsIDB4NUM5NCwgMHg1QzhDLCAweDVERUIsIDB4NUUwQywgMHg1RThGLCAweDVFODcsIDB4NUU4QSwKKyAgICAweDVFRjcsIDB4NUYwNCwgMHg1RjFGLCAweDVGNjQsIDB4NUY2MiwgMHg1Rjc3LCAweDVGNzksIDB4NUZEOCwgMHg1RkNDLAorICAgIDB4NUZENywgMHg1RkNELCAweDVGRjEsIDB4NUZFQiwgMHg1RkY4LCAweDVGRUEsIDB4NjIxMiwgMHg2MjExLCAweDYyODQsCisgICAgMHg2Mjk3LCAweDYyOTYsIDB4NjI4MCwgMHg2Mjc2LCAweDYyODksIDB4NjI2RCwgMHg2MjhBLCAweDYyN0MsIDB4NjI3RSwKKyAgICAweDYyNzksIDB4NjI3MywgMHg2MjkyLCAweDYyNkYsIDB4NjI5OCwgMHg2MjZFLCAweDYyOTUsIDB4NjI5MywgMHg2MjkxLAorICAgIDB4NjI4NiwgMHg2NTM5LCAweDY1M0IsIDB4NjUzOCwgMHg2NUYxLCAweDY2RjQsIDB4Njc1RiwgMHg2NzRFLCAweDY3NEYsCisgICAgMHg2NzUwLCAweDY3NTEsIDB4Njc1QywgMHg2NzU2LCAweDY3NUUsIDB4Njc0OSwgMHg2NzQ2LCAweDY3NjAsIDB4Njc1MywKKyAgICAweDY3NTcsIDB4NkI2NSwgMHg2QkNGLCAweDZDNDIsIDB4NkM1RSwgMHg2Qzk5LCAweDZDODEsIDB4NkM4OCwgMHg2Qzg5LAorICAgIDB4NkM4NSwgMHg2QzlCLCAweDZDNkEsIDB4NkM3QSwgMHg2QzkwLCAweDZDNzAsIDB4NkM4QywgMHg2QzY4LCAweDZDOTYsCisgICAgMHg2QzkyLCAweDZDN0QsIDB4NkM4MywgMHg2QzcyLCAweDZDN0UsIDB4NkM3NCwgMHg2Qzg2LCAweDZDNzYsIDB4NkM4RCwKKyAgICAweDZDOTQsIDB4NkM5OCwgMHg2QzgyLCAweDcwNzYsIDB4NzA3QywgMHg3MDdELCAweDcwNzgsIDB4NzI2MiwgMHg3MjYxLAorICAgIDB4NzI2MCwgMHg3MkM0LCAweDcyQzIsIDB4NzM5NiwgMHg3NTJDLCAweDc1MkIsIDB4NzUzNywgMHg3NTM4LCAweDc2ODIsCisgICAgMHg3NkVGLCAweDc3RTMsIDB4NzlDMSwgMHg3OUMwLCAweDc5QkYsIDB4N0E3NiwgMHg3Q0ZCLCAweDdGNTUsIDB4ODA5NiwKKyAgICAweDgwOTMsIDB4ODA5RCwgMHg4MDk4LCAweDgwOUIsIDB4ODA5QSwgMHg4MEIyLCAweDgyNkYsIDB4ODI5MiwgMHg4MjhCLAorICAgIDB4ODI4RCwgMHg4OThCLCAweDg5RDIsIDB4OEEwMCwgMHg4QzM3LCAweDhDNDYsIDB4OEM1NSwgMHg4QzlELCAweDhENjQsCisgICAgMHg4RDcwLCAweDhEQjMsIDB4OEVBQiwgMHg4RUNBLCAweDhGOUIsIDB4OEZCMCwgMHg4RkMyLCAweDhGQzYsIDB4OEZDNSwKKyAgICAweDhGQzQsIDB4NURFMSwgMHg5MDkxLCAweDkwQTIsIDB4OTBBQSwgMHg5MEE2LCAweDkwQTMsIDB4OTE0OSwgMHg5MUM2LAorICAgIDB4OTFDQywgMHg5NjMyLCAweDk2MkUsIDB4OTYzMSwgMHg5NjJBLCAweDk2MkMsIDB4NEUyNiwgMHg0RTU2LCAweDRFNzMsCisgICAgMHg0RThCLCAweDRFOUIsIDB4NEU5RSwgMHg0RUFCLCAweDRFQUMsIDB4NEY2RiwgMHg0RjlELCAweDRGOEQsIDB4NEY3MywKKyAgICAweDRGN0YsIDB4NEY2QywgMHg0RjlCLCAweDRGOEIsIDB4NEY4NiwgMHg0RjgzLCAweDRGNzAsIDB4NEY3NSwgMHg0Rjg4LAorICAgIDB4NEY2OSwgMHg0RjdCLCAweDRGOTYsIDB4NEY3RSwgMHg0RjhGLCAweDRGOTEsIDB4NEY3QSwgMHg1MTU0LCAweDUxNTIsCisgICAgMHg1MTU1LCAweDUxNjksIDB4NTE3NywgMHg1MTc2LCAweDUxNzgsIDB4NTFCRCwgMHg1MUZELCAweDUyM0IsIDB4NTIzOCwKKyAgICAweDUyMzcsIDB4NTIzQSwgMHg1MjMwLCAweDUyMkUsIDB4NTIzNiwgMHg1MjQxLCAweDUyQkUsIDB4NTJCQiwgMHg1MzUyLAorICAgIDB4NTM1NCwgMHg1MzUzLCAweDUzNTEsIDB4NTM2NiwgMHg1Mzc3LCAweDUzNzgsIDB4NTM3OSwgMHg1M0Q2LCAweDUzRDQsCisgICAgMHg1M0Q3LCAweDU0NzMsIDB4NTQ3NSwgMHg1NDk2LCAweDU0NzgsIDB4NTQ5NSwgMHg1NDgwLCAweDU0N0IsIDB4NTQ3NywKKyAgICAweDU0ODQsIDB4NTQ5MiwgMHg1NDg2LCAweDU0N0MsIDB4NTQ5MCwgMHg1NDcxLCAweDU0NzYsIDB4NTQ4QywgMHg1NDlBLAorICAgIDB4NTQ2MiwgMHg1NDY4LCAweDU0OEIsIDB4NTQ3RCwgMHg1NDhFLCAweDU2RkEsIDB4NTc4MywgMHg1Nzc3LCAweDU3NkEsCisgICAgMHg1NzY5LCAweDU3NjEsIDB4NTc2NiwgMHg1NzY0LCAweDU3N0MsIDB4NTkxQywgMHg1OTQ5LCAweDU5NDcsIDB4NTk0OCwKKyAgICAweDU5NDQsIDB4NTk1NCwgMHg1OUJFLCAweDU5QkIsIDB4NTlENCwgMHg1OUI5LCAweDU5QUUsIDB4NTlEMSwgMHg1OUM2LAorICAgIDB4NTlEMCwgMHg1OUNELCAweDU5Q0IsIDB4NTlEMywgMHg1OUNBLCAweDU5QUYsIDB4NTlCMywgMHg1OUQyLCAweDU5QzUsCisgICAgMHg1QjVGLCAweDVCNjQsIDB4NUI2MywgMHg1Qjk3LCAweDVCOUEsIDB4NUI5OCwgMHg1QjlDLCAweDVCOTksIDB4NUI5QiwKKyAgICAweDVDMUEsIDB4NUM0OCwgMHg1QzQ1LCAweDVDNDYsIDB4NUNCNywgMHg1Q0ExLCAweDVDQjgsIDB4NUNBOSwgMHg1Q0FCLAorICAgIDB4NUNCMSwgMHg1Q0IzLCAweDVFMTgsIDB4NUUxQSwgMHg1RTE2LCAweDVFMTUsIDB4NUUxQiwgMHg1RTExLCAweDVFNzgsCisgICAgMHg1RTlBLCAweDVFOTcsIDB4NUU5QywgMHg1RTk1LCAweDVFOTYsIDB4NUVGNiwgMHg1RjI2LCAweDVGMjcsIDB4NUYyOSwKKyAgICAweDVGODAsIDB4NUY4MSwgMHg1RjdGLCAweDVGN0MsIDB4NUZERCwgMHg1RkUwLCAweDVGRkQsIDB4NUZGNSwgMHg1RkZGLAorICAgIDB4NjAwRiwgMHg2MDE0LCAweDYwMkYsIDB4NjAzNSwgMHg2MDE2LCAweDYwMkEsIDB4NjAxNSwgMHg2MDIxLCAweDYwMjcsCisgICAgMHg2MDI5LCAweDYwMkIsIDB4NjAxQiwgMHg2MjE2LCAweDYyMTUsIDB4NjIzRiwgMHg2MjNFLCAweDYyNDAsIDB4NjI3RiwKKyAgICAweDYyQzksIDB4NjJDQywgMHg2MkM0LCAweDYyQkYsIDB4NjJDMiwgMHg2MkI5LCAweDYyRDIsIDB4NjJEQiwgMHg2MkFCLAorICAgIDB4NjJEMywgMHg2MkQ0LCAweDYyQ0IsIDB4NjJDOCwgMHg2MkE4LCAweDYyQkQsIDB4NjJCQywgMHg2MkQwLCAweDYyRDksCisgICAgMHg2MkM3LCAweDYyQ0QsIDB4NjJCNSwgMHg2MkRBLCAweDYyQjEsIDB4NjJEOCwgMHg2MkQ2LCAweDYyRDcsIDB4NjJDNiwKKyAgICAweDYyQUMsIDB4NjJDRSwgMHg2NTNFLCAweDY1QTcsIDB4NjVCQywgMHg2NUZBLCAweDY2MTQsIDB4NjYxMywgMHg2NjBDLAorICAgIDB4NjYwNiwgMHg2NjAyLCAweDY2MEUsIDB4NjYwMCwgMHg2NjBGLCAweDY2MTUsIDB4NjYwQSwgMHg2NjA3LCAweDY3MEQsCisgICAgMHg2NzBCLCAweDY3NkQsIDB4Njc4QiwgMHg2Nzk1LCAweDY3NzEsIDB4Njc5QywgMHg2NzczLCAweDY3NzcsIDB4Njc4NywKKyAgICAweDY3OUQsIDB4Njc5NywgMHg2NzZGLCAweDY3NzAsIDB4Njc3RiwgMHg2Nzg5LCAweDY3N0UsIDB4Njc5MCwgMHg2Nzc1LAorICAgIDB4Njc5QSwgMHg2NzkzLCAweDY3N0MsIDB4Njc2QSwgMHg2NzcyLCAweDZCMjMsIDB4NkI2NiwgMHg2QjY3LCAweDZCN0YsCisgICAgMHg2QzEzLCAweDZDMUIsIDB4NkNFMywgMHg2Q0U4LCAweDZDRjMsIDB4NkNCMSwgMHg2Q0NDLCAweDZDRTUsIDB4NkNCMywKKyAgICAweDZDQkQsIDB4NkNCRSwgMHg2Q0JDLCAweDZDRTIsIDB4NkNBQiwgMHg2Q0Q1LCAweDZDRDMsIDB4NkNCOCwgMHg2Q0M0LAorICAgIDB4NkNCOSwgMHg2Q0MxLCAweDZDQUUsIDB4NkNENywgMHg2Q0M1LCAweDZDRjEsIDB4NkNCRiwgMHg2Q0JCLCAweDZDRTEsCisgICAgMHg2Q0RCLCAweDZDQ0EsIDB4NkNBQywgMHg2Q0VGLCAweDZDREMsIDB4NkNENiwgMHg2Q0UwLCAweDcwOTUsIDB4NzA4RSwKKyAgICAweDcwOTIsIDB4NzA4QSwgMHg3MDk5LCAweDcyMkMsIDB4NzIyRCwgMHg3MjM4LCAweDcyNDgsIDB4NzI2NywgMHg3MjY5LAorICAgIDB4NzJDMCwgMHg3MkNFLCAweDcyRDksIDB4NzJENywgMHg3MkQwLCAweDczQTksIDB4NzNBOCwgMHg3MzlGLCAweDczQUIsCisgICAgMHg3M0E1LCAweDc1M0QsIDB4NzU5RCwgMHg3NTk5LCAweDc1OUEsIDB4NzY4NCwgMHg3NkMyLCAweDc2RjIsIDB4NzZGNCwKKyAgICAweDc3RTUsIDB4NzdGRCwgMHg3OTNFLCAweDc5NDAsIDB4Nzk0MSwgMHg3OUM5LCAweDc5QzgsIDB4N0E3QSwgMHg3QTc5LAorICAgIDB4N0FGQSwgMHg3Q0ZFLCAweDdGNTQsIDB4N0Y4QywgMHg3RjhCLCAweDgwMDUsIDB4ODBCQSwgMHg4MEE1LCAweDgwQTIsCisgICAgMHg4MEIxLCAweDgwQTEsIDB4ODBBQiwgMHg4MEE5LCAweDgwQjQsIDB4ODBBQSwgMHg4MEFGLCAweDgxRTUsIDB4ODFGRSwKKyAgICAweDgyMEQsIDB4ODJCMywgMHg4MjlELCAweDgyOTksIDB4ODJBRCwgMHg4MkJELCAweDgyOUYsIDB4ODJCOSwgMHg4MkIxLAorICAgIDB4ODJBQywgMHg4MkE1LCAweDgyQUYsIDB4ODJCOCwgMHg4MkEzLCAweDgyQjAsIDB4ODJCRSwgMHg4MkI3LCAweDg2NEUsCisgICAgMHg4NjcxLCAweDUyMUQsIDB4ODg2OCwgMHg4RUNCLCAweDhGQ0UsIDB4OEZENCwgMHg4RkQxLCAweDkwQjUsIDB4OTBCOCwKKyAgICAweDkwQjEsIDB4OTBCNiwgMHg5MUM3LCAweDkxRDEsIDB4OTU3NywgMHg5NTgwLCAweDk2MUMsIDB4OTY0MCwgMHg5NjNGLAorICAgIDB4OTYzQiwgMHg5NjQ0LCAweDk2NDIsIDB4OTZCOSwgMHg5NkU4LCAweDk3NTIsIDB4OTc1RSwgMHg0RTlGLCAweDRFQUQsCisgICAgMHg0RUFFLCAweDRGRTEsIDB4NEZCNSwgMHg0RkFGLCAweDRGQkYsIDB4NEZFMCwgMHg0RkQxLCAweDRGQ0YsIDB4NEZERCwKKyAgICAweDRGQzMsIDB4NEZCNiwgMHg0RkQ4LCAweDRGREYsIDB4NEZDQSwgMHg0RkQ3LCAweDRGQUUsIDB4NEZEMCwgMHg0RkM0LAorICAgIDB4NEZDMiwgMHg0RkRBLCAweDRGQ0UsIDB4NEZERSwgMHg0RkI3LCAweDUxNTcsIDB4NTE5MiwgMHg1MTkxLCAweDUxQTAsCisgICAgMHg1MjRFLCAweDUyNDMsIDB4NTI0QSwgMHg1MjRELCAweDUyNEMsIDB4NTI0QiwgMHg1MjQ3LCAweDUyQzcsIDB4NTJDOSwKKyAgICAweDUyQzMsIDB4NTJDMSwgMHg1MzBELCAweDUzNTcsIDB4NTM3QiwgMHg1MzlBLCAweDUzREIsIDB4NTRBQywgMHg1NEMwLAorICAgIDB4NTRBOCwgMHg1NENFLCAweDU0QzksIDB4NTRCOCwgMHg1NEE2LCAweDU0QjMsIDB4NTRDNywgMHg1NEMyLCAweDU0QkQsCisgICAgMHg1NEFBLCAweDU0QzEsIDB4NTRDNCwgMHg1NEM4LCAweDU0QUYsIDB4NTRBQiwgMHg1NEIxLCAweDU0QkIsIDB4NTRBOSwKKyAgICAweDU0QTcsIDB4NTRCRiwgMHg1NkZGLCAweDU3ODIsIDB4NTc4QiwgMHg1N0EwLCAweDU3QTMsIDB4NTdBMiwgMHg1N0NFLAorICAgIDB4NTdBRSwgMHg1NzkzLCAweDU5NTUsIDB4NTk1MSwgMHg1OTRGLCAweDU5NEUsIDB4NTk1MCwgMHg1OURDLCAweDU5RDgsCisgICAgMHg1OUZGLCAweDU5RTMsIDB4NTlFOCwgMHg1QTAzLCAweDU5RTUsIDB4NTlFQSwgMHg1OURBLCAweDU5RTYsIDB4NUEwMSwKKyAgICAweDU5RkIsIDB4NUI2OSwgMHg1QkEzLCAweDVCQTYsIDB4NUJBNCwgMHg1QkEyLCAweDVCQTUsIDB4NUMwMSwgMHg1QzRFLAorICAgIDB4NUM0RiwgMHg1QzRELCAweDVDNEIsIDB4NUNEOSwgMHg1Q0QyLCAweDVERjcsIDB4NUUxRCwgMHg1RTI1LCAweDVFMUYsCisgICAgMHg1RTdELCAweDVFQTAsIDB4NUVBNiwgMHg1RUZBLCAweDVGMDgsIDB4NUYyRCwgMHg1RjY1LCAweDVGODgsIDB4NUY4NSwKKyAgICAweDVGOEEsIDB4NUY4QiwgMHg1Rjg3LCAweDVGOEMsIDB4NUY4OSwgMHg2MDEyLCAweDYwMUQsIDB4NjAyMCwgMHg2MDI1LAorICAgIDB4NjAwRSwgMHg2MDI4LCAweDYwNEQsIDB4NjA3MCwgMHg2MDY4LCAweDYwNjIsIDB4NjA0NiwgMHg2MDQzLCAweDYwNkMsCisgICAgMHg2MDZCLCAweDYwNkEsIDB4NjA2NCwgMHg2MjQxLCAweDYyREMsIDB4NjMxNiwgMHg2MzA5LCAweDYyRkMsIDB4NjJFRCwKKyAgICAweDYzMDEsIDB4NjJFRSwgMHg2MkZELCAweDYzMDcsIDB4NjJGMSwgMHg2MkY3LCAweDYyRUYsIDB4NjJFQywgMHg2MkZFLAorICAgIDB4NjJGNCwgMHg2MzExLCAweDYzMDIsIDB4NjUzRiwgMHg2NTQ1LCAweDY1QUIsIDB4NjVCRCwgMHg2NUUyLCAweDY2MjUsCisgICAgMHg2NjJELCAweDY2MjAsIDB4NjYyNywgMHg2NjJGLCAweDY2MUYsIDB4NjYyOCwgMHg2NjMxLCAweDY2MjQsIDB4NjZGNywKKyAgICAweDY3RkYsIDB4NjdEMywgMHg2N0YxLCAweDY3RDQsIDB4NjdEMCwgMHg2N0VDLCAweDY3QjYsIDB4NjdBRiwgMHg2N0Y1LAorICAgIDB4NjdFOSwgMHg2N0VGLCAweDY3QzQsIDB4NjdEMSwgMHg2N0I0LCAweDY3REEsIDB4NjdFNSwgMHg2N0I4LCAweDY3Q0YsCisgICAgMHg2N0RFLCAweDY3RjMsIDB4NjdCMCwgMHg2N0Q5LCAweDY3RTIsIDB4NjdERCwgMHg2N0QyLCAweDZCNkEsIDB4NkI4MywKKyAgICAweDZCODYsIDB4NkJCNSwgMHg2QkQyLCAweDZCRDcsIDB4NkMxRiwgMHg2Q0M5LCAweDZEMEIsIDB4NkQzMiwgMHg2RDJBLAorICAgIDB4NkQ0MSwgMHg2RDI1LCAweDZEMEMsIDB4NkQzMSwgMHg2RDFFLCAweDZEMTcsIDB4NkQzQiwgMHg2RDNELCAweDZEM0UsCisgICAgMHg2RDM2LCAweDZEMUIsIDB4NkNGNSwgMHg2RDM5LCAweDZEMjcsIDB4NkQzOCwgMHg2RDI5LCAweDZEMkUsIDB4NkQzNSwKKyAgICAweDZEMEUsIDB4NkQyQiwgMHg3MEFCLCAweDcwQkEsIDB4NzBCMywgMHg3MEFDLCAweDcwQUYsIDB4NzBBRCwgMHg3MEI4LAorICAgIDB4NzBBRSwgMHg3MEE0LCAweDcyMzAsIDB4NzI3MiwgMHg3MjZGLCAweDcyNzQsIDB4NzJFOSwgMHg3MkUwLCAweDcyRTEsCisgICAgMHg3M0I3LCAweDczQ0EsIDB4NzNCQiwgMHg3M0IyLCAweDczQ0QsIDB4NzNDMCwgMHg3M0IzLCAweDc1MUEsIDB4NzUyRCwKKyAgICAweDc1NEYsIDB4NzU0QywgMHg3NTRFLCAweDc1NEIsIDB4NzVBQiwgMHg3NUE0LCAweDc1QTUsIDB4NzVBMiwgMHg3NUEzLAorICAgIDB4NzY3OCwgMHg3Njg2LCAweDc2ODcsIDB4NzY4OCwgMHg3NkM4LCAweDc2QzYsIDB4NzZDMywgMHg3NkM1LCAweDc3MDEsCisgICAgMHg3NkY5LCAweDc2RjgsIDB4NzcwOSwgMHg3NzBCLCAweDc2RkUsIDB4NzZGQywgMHg3NzA3LCAweDc3REMsIDB4NzgwMiwKKyAgICAweDc4MTQsIDB4NzgwQywgMHg3ODBELCAweDc5NDYsIDB4Nzk0OSwgMHg3OTQ4LCAweDc5NDcsIDB4NzlCOSwgMHg3OUJBLAorICAgIDB4NzlEMSwgMHg3OUQyLCAweDc5Q0IsIDB4N0E3RiwgMHg3QTgxLCAweDdBRkYsIDB4N0FGRCwgMHg3QzdELCAweDdEMDIsCisgICAgMHg3RDA1LCAweDdEMDAsIDB4N0QwOSwgMHg3RDA3LCAweDdEMDQsIDB4N0QwNiwgMHg3RjM4LCAweDdGOEUsIDB4N0ZCRiwKKyAgICAweDgwMTAsIDB4ODAwRCwgMHg4MDExLCAweDgwMzYsIDB4ODBENiwgMHg4MEU1LCAweDgwREEsIDB4ODBDMywgMHg4MEM0LAorICAgIDB4ODBDQywgMHg4MEUxLCAweDgwREIsIDB4ODBDRSwgMHg4MERFLCAweDgwRTQsIDB4ODBERCwgMHg4MUY0LCAweDgyMjIsCisgICAgMHg4MkU3LCAweDgzMDMsIDB4ODMwNSwgMHg4MkUzLCAweDgyREIsIDB4ODJFNiwgMHg4MzA0LCAweDgyRTUsIDB4ODMwMiwKKyAgICAweDgzMDksIDB4ODJEMiwgMHg4MkQ3LCAweDgyRjEsIDB4ODMwMSwgMHg4MkRDLCAweDgyRDQsIDB4ODJEMSwgMHg4MkRFLAorICAgIDB4ODJEMywgMHg4MkRGLCAweDgyRUYsIDB4ODMwNiwgMHg4NjUwLCAweDg2NzksIDB4ODY3QiwgMHg4NjdBLCAweDg4NEQsCisgICAgMHg4ODZCLCAweDg5ODEsIDB4ODlENCwgMHg4QTA4LCAweDhBMDIsIDB4OEEwMywgMHg4QzlFLCAweDhDQTAsIDB4OEQ3NCwKKyAgICAweDhENzMsIDB4OERCNCwgMHg4RUNELCAweDhFQ0MsIDB4OEZGMCwgMHg4RkU2LCAweDhGRTIsIDB4OEZFQSwgMHg4RkU1LAorICAgIDB4OEZFRCwgMHg4RkVCLCAweDhGRTQsIDB4OEZFOCwgMHg5MENBLCAweDkwQ0UsIDB4OTBDMSwgMHg5MEMzLCAweDkxNEIsCisgICAgMHg5MTRBLCAweDkxQ0QsIDB4OTU4MiwgMHg5NjUwLCAweDk2NEIsIDB4OTY0QywgMHg5NjRELCAweDk3NjIsIDB4OTc2OSwKKyAgICAweDk3Q0IsIDB4OTdFRCwgMHg5N0YzLCAweDk4MDEsIDB4OThBOCwgMHg5OERCLCAweDk4REYsIDB4OTk5NiwgMHg5OTk5LAorICAgIDB4NEU1OCwgMHg0RUIzLCAweDUwMEMsIDB4NTAwRCwgMHg1MDIzLCAweDRGRUYsIDB4NTAyNiwgMHg1MDI1LCAweDRGRjgsCisgICAgMHg1MDI5LCAweDUwMTYsIDB4NTAwNiwgMHg1MDNDLCAweDUwMUYsIDB4NTAxQSwgMHg1MDEyLCAweDUwMTEsIDB4NEZGQSwKKyAgICAweDUwMDAsIDB4NTAxNCwgMHg1MDI4LCAweDRGRjEsIDB4NTAyMSwgMHg1MDBCLCAweDUwMTksIDB4NTAxOCwgMHg0RkYzLAorICAgIDB4NEZFRSwgMHg1MDJELCAweDUwMkEsIDB4NEZGRSwgMHg1MDJCLCAweDUwMDksIDB4NTE3QywgMHg1MUE0LCAweDUxQTUsCisgICAgMHg1MUEyLCAweDUxQ0QsIDB4NTFDQywgMHg1MUM2LCAweDUxQ0IsIDB4NTI1NiwgMHg1MjVDLCAweDUyNTQsIDB4NTI1QiwKKyAgICAweDUyNUQsIDB4NTMyQSwgMHg1MzdGLCAweDUzOUYsIDB4NTM5RCwgMHg1M0RGLCAweDU0RTgsIDB4NTUxMCwgMHg1NTAxLAorICAgIDB4NTUzNywgMHg1NEZDLCAweDU0RTUsIDB4NTRGMiwgMHg1NTA2LCAweDU0RkEsIDB4NTUxNCwgMHg1NEU5LCAweDU0RUQsCisgICAgMHg1NEUxLCAweDU1MDksIDB4NTRFRSwgMHg1NEVBLCAweDU0RTYsIDB4NTUyNywgMHg1NTA3LCAweDU0RkQsIDB4NTUwRiwKKyAgICAweDU3MDMsIDB4NTcwNCwgMHg1N0MyLCAweDU3RDQsIDB4NTdDQiwgMHg1N0MzLCAweDU4MDksIDB4NTkwRiwgMHg1OTU3LAorICAgIDB4NTk1OCwgMHg1OTVBLCAweDVBMTEsIDB4NUExOCwgMHg1QTFDLCAweDVBMUYsIDB4NUExQiwgMHg1QTEzLCAweDU5RUMsCisgICAgMHg1QTIwLCAweDVBMjMsIDB4NUEyOSwgMHg1QTI1LCAweDVBMEMsIDB4NUEwOSwgMHg1QjZCLCAweDVDNTgsIDB4NUJCMCwKKyAgICAweDVCQjMsIDB4NUJCNiwgMHg1QkI0LCAweDVCQUUsIDB4NUJCNSwgMHg1QkI5LCAweDVCQjgsIDB4NUMwNCwgMHg1QzUxLAorICAgIDB4NUM1NSwgMHg1QzUwLCAweDVDRUQsIDB4NUNGRCwgMHg1Q0ZCLCAweDVDRUEsIDB4NUNFOCwgMHg1Q0YwLCAweDVDRjYsCisgICAgMHg1RDAxLCAweDVDRjQsIDB4NURFRSwgMHg1RTJELCAweDVFMkIsIDB4NUVBQiwgMHg1RUFELCAweDVFQTcsIDB4NUYzMSwKKyAgICAweDVGOTIsIDB4NUY5MSwgMHg1RjkwLCAweDYwNTksIDB4NjA2MywgMHg2MDY1LCAweDYwNTAsIDB4NjA1NSwgMHg2MDZELAorICAgIDB4NjA2OSwgMHg2MDZGLCAweDYwODQsIDB4NjA5RiwgMHg2MDlBLCAweDYwOEQsIDB4NjA5NCwgMHg2MDhDLCAweDYwODUsCisgICAgMHg2MDk2LCAweDYyNDcsIDB4NjJGMywgMHg2MzA4LCAweDYyRkYsIDB4NjM0RSwgMHg2MzNFLCAweDYzMkYsIDB4NjM1NSwKKyAgICAweDYzNDIsIDB4NjM0NiwgMHg2MzRGLCAweDYzNDksIDB4NjMzQSwgMHg2MzUwLCAweDYzM0QsIDB4NjMyQSwgMHg2MzJCLAorICAgIDB4NjMyOCwgMHg2MzRELCAweDYzNEMsIDB4NjU0OCwgMHg2NTQ5LCAweDY1OTksIDB4NjVDMSwgMHg2NUM1LCAweDY2NDIsCisgICAgMHg2NjQ5LCAweDY2NEYsIDB4NjY0MywgMHg2NjUyLCAweDY2NEMsIDB4NjY0NSwgMHg2NjQxLCAweDY2RjgsIDB4NjcxNCwKKyAgICAweDY3MTUsIDB4NjcxNywgMHg2ODIxLCAweDY4MzgsIDB4Njg0OCwgMHg2ODQ2LCAweDY4NTMsIDB4NjgzOSwgMHg2ODQyLAorICAgIDB4Njg1NCwgMHg2ODI5LCAweDY4QjMsIDB4NjgxNywgMHg2ODRDLCAweDY4NTEsIDB4NjgzRCwgMHg2N0Y0LCAweDY4NTAsCisgICAgMHg2ODQwLCAweDY4M0MsIDB4Njg0MywgMHg2ODJBLCAweDY4NDUsIDB4NjgxMywgMHg2ODE4LCAweDY4NDEsIDB4NkI4QSwKKyAgICAweDZCODksIDB4NkJCNywgMHg2QzIzLCAweDZDMjcsIDB4NkMyOCwgMHg2QzI2LCAweDZDMjQsIDB4NkNGMCwgMHg2RDZBLAorICAgIDB4NkQ5NSwgMHg2RDg4LCAweDZEODcsIDB4NkQ2NiwgMHg2RDc4LCAweDZENzcsIDB4NkQ1OSwgMHg2RDkzLCAweDZENkMsCisgICAgMHg2RDg5LCAweDZENkUsIDB4NkQ1QSwgMHg2RDc0LCAweDZENjksIDB4NkQ4QywgMHg2RDhBLCAweDZENzksIDB4NkQ4NSwKKyAgICAweDZENjUsIDB4NkQ5NCwgMHg3MENBLCAweDcwRDgsIDB4NzBFNCwgMHg3MEQ5LCAweDcwQzgsIDB4NzBDRiwgMHg3MjM5LAorICAgIDB4NzI3OSwgMHg3MkZDLCAweDcyRjksIDB4NzJGRCwgMHg3MkY4LCAweDcyRjcsIDB4NzM4NiwgMHg3M0VELCAweDc0MDksCisgICAgMHg3M0VFLCAweDczRTAsIDB4NzNFQSwgMHg3M0RFLCAweDc1NTQsIDB4NzU1RCwgMHg3NTVDLCAweDc1NUEsIDB4NzU1OSwKKyAgICAweDc1QkUsIDB4NzVDNSwgMHg3NUM3LCAweDc1QjIsIDB4NzVCMywgMHg3NUJELCAweDc1QkMsIDB4NzVCOSwgMHg3NUMyLAorICAgIDB4NzVCOCwgMHg3NjhCLCAweDc2QjAsIDB4NzZDQSwgMHg3NkNELCAweDc2Q0UsIDB4NzcyOSwgMHg3NzFGLCAweDc3MjAsCisgICAgMHg3NzI4LCAweDc3RTksIDB4NzgzMCwgMHg3ODI3LCAweDc4MzgsIDB4NzgxRCwgMHg3ODM0LCAweDc4MzcsIDB4NzgyNSwKKyAgICAweDc4MkQsIDB4NzgyMCwgMHg3ODFGLCAweDc4MzIsIDB4Nzk1NSwgMHg3OTUwLCAweDc5NjAsIDB4Nzk1RiwgMHg3OTU2LAorICAgIDB4Nzk1RSwgMHg3OTVELCAweDc5NTcsIDB4Nzk1QSwgMHg3OUU0LCAweDc5RTMsIDB4NzlFNywgMHg3OURGLCAweDc5RTYsCisgICAgMHg3OUU5LCAweDc5RDgsIDB4N0E4NCwgMHg3QTg4LCAweDdBRDksIDB4N0IwNiwgMHg3QjExLCAweDdDODksIDB4N0QyMSwKKyAgICAweDdEMTcsIDB4N0QwQiwgMHg3RDBBLCAweDdEMjAsIDB4N0QyMiwgMHg3RDE0LCAweDdEMTAsIDB4N0QxNSwgMHg3RDFBLAorICAgIDB4N0QxQywgMHg3RDBELCAweDdEMTksIDB4N0QxQiwgMHg3RjNBLCAweDdGNUYsIDB4N0Y5NCwgMHg3RkM1LCAweDdGQzEsCisgICAgMHg4MDA2LCAweDgwMDQsIDB4ODAxOCwgMHg4MDE1LCAweDgwMTksIDB4ODAxNywgMHg4MDNELCAweDgwM0YsIDB4ODBGMSwKKyAgICAweDgxMDIsIDB4ODBGMCwgMHg4MTA1LCAweDgwRUQsIDB4ODBGNCwgMHg4MTA2LCAweDgwRjgsIDB4ODBGMywgMHg4MTA4LAorICAgIDB4ODBGRCwgMHg4MTBBLCAweDgwRkMsIDB4ODBFRiwgMHg4MUVELCAweDgxRUMsIDB4ODIwMCwgMHg4MjEwLCAweDgyMkEsCisgICAgMHg4MjJCLCAweDgyMjgsIDB4ODIyQywgMHg4MkJCLCAweDgzMkIsIDB4ODM1MiwgMHg4MzU0LCAweDgzNEEsIDB4ODMzOCwKKyAgICAweDgzNTAsIDB4ODM0OSwgMHg4MzM1LCAweDgzMzQsIDB4ODM0RiwgMHg4MzMyLCAweDgzMzksIDB4ODMzNiwgMHg4MzE3LAorICAgIDB4ODM0MCwgMHg4MzMxLCAweDgzMjgsIDB4ODM0MywgMHg4NjU0LCAweDg2OEEsIDB4ODZBQSwgMHg4NjkzLCAweDg2QTQsCisgICAgMHg4NkE5LCAweDg2OEMsIDB4ODZBMywgMHg4NjlDLCAweDg4NzAsIDB4ODg3NywgMHg4ODgxLCAweDg4ODIsIDB4ODg3RCwKKyAgICAweDg4NzksIDB4OEExOCwgMHg4QTEwLCAweDhBMEUsIDB4OEEwQywgMHg4QTE1LCAweDhBMEEsIDB4OEExNywgMHg4QTEzLAorICAgIDB4OEExNiwgMHg4QTBGLCAweDhBMTEsIDB4OEM0OCwgMHg4QzdBLCAweDhDNzksIDB4OENBMSwgMHg4Q0EyLCAweDhENzcsCisgICAgMHg4RUFDLCAweDhFRDIsIDB4OEVENCwgMHg4RUNGLCAweDhGQjEsIDB4OTAwMSwgMHg5MDA2LCAweDhGRjcsIDB4OTAwMCwKKyAgICAweDhGRkEsIDB4OEZGNCwgMHg5MDAzLCAweDhGRkQsIDB4OTAwNSwgMHg4RkY4LCAweDkwOTUsIDB4OTBFMSwgMHg5MERELAorICAgIDB4OTBFMiwgMHg5MTUyLCAweDkxNEQsIDB4OTE0QywgMHg5MUQ4LCAweDkxREQsIDB4OTFENywgMHg5MURDLCAweDkxRDksCisgICAgMHg5NTgzLCAweDk2NjIsIDB4OTY2MywgMHg5NjYxLCAweDk2NUIsIDB4OTY1RCwgMHg5NjY0LCAweDk2NTgsIDB4OTY1RSwKKyAgICAweDk2QkIsIDB4OThFMiwgMHg5OUFDLCAweDlBQTgsIDB4OUFEOCwgMHg5QjI1LCAweDlCMzIsIDB4OUIzQywgMHg0RTdFLAorICAgIDB4NTA3QSwgMHg1MDdELCAweDUwNUMsIDB4NTA0NywgMHg1MDQzLCAweDUwNEMsIDB4NTA1QSwgMHg1MDQ5LCAweDUwNjUsCisgICAgMHg1MDc2LCAweDUwNEUsIDB4NTA1NSwgMHg1MDc1LCAweDUwNzQsIDB4NTA3NywgMHg1MDRGLCAweDUwMEYsIDB4NTA2RiwKKyAgICAweDUwNkQsIDB4NTE1QywgMHg1MTk1LCAweDUxRjAsIDB4NTI2QSwgMHg1MjZGLCAweDUyRDIsIDB4NTJEOSwgMHg1MkQ4LAorICAgIDB4NTJENSwgMHg1MzEwLCAweDUzMEYsIDB4NTMxOSwgMHg1MzNGLCAweDUzNDAsIDB4NTMzRSwgMHg1M0MzLCAweDY2RkMsCisgICAgMHg1NTQ2LCAweDU1NkEsIDB4NTU2NiwgMHg1NTQ0LCAweDU1NUUsIDB4NTU2MSwgMHg1NTQzLCAweDU1NEEsIDB4NTUzMSwKKyAgICAweDU1NTYsIDB4NTU0RiwgMHg1NTU1LCAweDU1MkYsIDB4NTU2NCwgMHg1NTM4LCAweDU1MkUsIDB4NTU1QywgMHg1NTJDLAorICAgIDB4NTU2MywgMHg1NTMzLCAweDU1NDEsIDB4NTU1NywgMHg1NzA4LCAweDU3MEIsIDB4NTcwOSwgMHg1N0RGLCAweDU4MDUsCisgICAgMHg1ODBBLCAweDU4MDYsIDB4NTdFMCwgMHg1N0U0LCAweDU3RkEsIDB4NTgwMiwgMHg1ODM1LCAweDU3RjcsIDB4NTdGOSwKKyAgICAweDU5MjAsIDB4NTk2MiwgMHg1QTM2LCAweDVBNDEsIDB4NUE0OSwgMHg1QTY2LCAweDVBNkEsIDB4NUE0MCwgMHg1QTNDLAorICAgIDB4NUE2MiwgMHg1QTVBLCAweDVBNDYsIDB4NUE0QSwgMHg1QjcwLCAweDVCQzcsIDB4NUJDNSwgMHg1QkM0LCAweDVCQzIsCisgICAgMHg1QkJGLCAweDVCQzYsIDB4NUMwOSwgMHg1QzA4LCAweDVDMDcsIDB4NUM2MCwgMHg1QzVDLCAweDVDNUQsIDB4NUQwNywKKyAgICAweDVEMDYsIDB4NUQwRSwgMHg1RDFCLCAweDVEMTYsIDB4NUQyMiwgMHg1RDExLCAweDVEMjksIDB4NUQxNCwgMHg1RDE5LAorICAgIDB4NUQyNCwgMHg1RDI3LCAweDVEMTcsIDB4NURFMiwgMHg1RTM4LCAweDVFMzYsIDB4NUUzMywgMHg1RTM3LCAweDVFQjcsCisgICAgMHg1RUI4LCAweDVFQjYsIDB4NUVCNSwgMHg1RUJFLCAweDVGMzUsIDB4NUYzNywgMHg1RjU3LCAweDVGNkMsIDB4NUY2OSwKKyAgICAweDVGNkIsIDB4NUY5NywgMHg1Rjk5LCAweDVGOUUsIDB4NUY5OCwgMHg1RkExLCAweDVGQTAsIDB4NUY5QywgMHg2MDdGLAorICAgIDB4NjBBMywgMHg2MDg5LCAweDYwQTAsIDB4NjBBOCwgMHg2MENCLCAweDYwQjQsIDB4NjBFNiwgMHg2MEJELCAweDYwQzUsCisgICAgMHg2MEJCLCAweDYwQjUsIDB4NjBEQywgMHg2MEJDLCAweDYwRDgsIDB4NjBENSwgMHg2MEM2LCAweDYwREYsIDB4NjBCOCwKKyAgICAweDYwREEsIDB4NjBDNywgMHg2MjFBLCAweDYyMUIsIDB4NjI0OCwgMHg2M0EwLCAweDYzQTcsIDB4NjM3MiwgMHg2Mzk2LAorICAgIDB4NjNBMiwgMHg2M0E1LCAweDYzNzcsIDB4NjM2NywgMHg2Mzk4LCAweDYzQUEsIDB4NjM3MSwgMHg2M0E5LCAweDYzODksCisgICAgMHg2MzgzLCAweDYzOUIsIDB4NjM2QiwgMHg2M0E4LCAweDYzODQsIDB4NjM4OCwgMHg2Mzk5LCAweDYzQTEsIDB4NjNBQywKKyAgICAweDYzOTIsIDB4NjM4RiwgMHg2MzgwLCAweDYzN0IsIDB4NjM2OSwgMHg2MzY4LCAweDYzN0EsIDB4NjU1RCwgMHg2NTU2LAorICAgIDB4NjU1MSwgMHg2NTU5LCAweDY1NTcsIDB4NTU1RiwgMHg2NTRGLCAweDY1NTgsIDB4NjU1NSwgMHg2NTU0LCAweDY1OUMsCisgICAgMHg2NTlCLCAweDY1QUMsIDB4NjVDRiwgMHg2NUNCLCAweDY1Q0MsIDB4NjVDRSwgMHg2NjVELCAweDY2NUEsIDB4NjY2NCwKKyAgICAweDY2NjgsIDB4NjY2NiwgMHg2NjVFLCAweDY2RjksIDB4NTJENywgMHg2NzFCLCAweDY4ODEsIDB4NjhBRiwgMHg2OEEyLAorICAgIDB4Njg5MywgMHg2OEI1LCAweDY4N0YsIDB4Njg3NiwgMHg2OEIxLCAweDY4QTcsIDB4Njg5NywgMHg2OEIwLCAweDY4ODMsCisgICAgMHg2OEM0LCAweDY4QUQsIDB4Njg4NiwgMHg2ODg1LCAweDY4OTQsIDB4Njg5RCwgMHg2OEE4LCAweDY4OUYsIDB4NjhBMSwKKyAgICAweDY4ODIsIDB4NkIzMiwgMHg2QkJBLCAweDZCRUIsIDB4NkJFQywgMHg2QzJCLCAweDZEOEUsIDB4NkRCQywgMHg2REYzLAorICAgIDB4NkREOSwgMHg2REIyLCAweDZERTEsIDB4NkRDQywgMHg2REU0LCAweDZERkIsIDB4NkRGQSwgMHg2RTA1LCAweDZEQzcsCisgICAgMHg2RENCLCAweDZEQUYsIDB4NkREMSwgMHg2REFFLCAweDZEREUsIDB4NkRGOSwgMHg2REI4LCAweDZERjcsIDB4NkRGNSwKKyAgICAweDZEQzUsIDB4NkREMiwgMHg2RTFBLCAweDZEQjUsIDB4NkREQSwgMHg2REVCLCAweDZERDgsIDB4NkRFQSwgMHg2REYxLAorICAgIDB4NkRFRSwgMHg2REU4LCAweDZEQzYsIDB4NkRDNCwgMHg2REFBLCAweDZERUMsIDB4NkRCRiwgMHg2REU2LCAweDcwRjksCisgICAgMHg3MTA5LCAweDcxMEEsIDB4NzBGRCwgMHg3MEVGLCAweDcyM0QsIDB4NzI3RCwgMHg3MjgxLCAweDczMUMsIDB4NzMxQiwKKyAgICAweDczMTYsIDB4NzMxMywgMHg3MzE5LCAweDczODcsIDB4NzQwNSwgMHg3NDBBLCAweDc0MDMsIDB4NzQwNiwgMHg3M0ZFLAorICAgIDB4NzQwRCwgMHg3NEUwLCAweDc0RjYsIDB4NzRGNywgMHg3NTFDLCAweDc1MjIsIDB4NzU2NSwgMHg3NTY2LCAweDc1NjIsCisgICAgMHg3NTcwLCAweDc1OEYsIDB4NzVENCwgMHg3NUQ1LCAweDc1QjUsIDB4NzVDQSwgMHg3NUNELCAweDc2OEUsIDB4NzZENCwKKyAgICAweDc2RDIsIDB4NzZEQiwgMHg3NzM3LCAweDc3M0UsIDB4NzczQywgMHg3NzM2LCAweDc3MzgsIDB4NzczQSwgMHg3ODZCLAorICAgIDB4Nzg0MywgMHg3ODRFLCAweDc5NjUsIDB4Nzk2OCwgMHg3OTZELCAweDc5RkIsIDB4N0E5MiwgMHg3QTk1LCAweDdCMjAsCisgICAgMHg3QjI4LCAweDdCMUIsIDB4N0IyQywgMHg3QjI2LCAweDdCMTksIDB4N0IxRSwgMHg3QjJFLCAweDdDOTIsIDB4N0M5NywKKyAgICAweDdDOTUsIDB4N0Q0NiwgMHg3RDQzLCAweDdENzEsIDB4N0QyRSwgMHg3RDM5LCAweDdEM0MsIDB4N0Q0MCwgMHg3RDMwLAorICAgIDB4N0QzMywgMHg3RDQ0LCAweDdEMkYsIDB4N0Q0MiwgMHg3RDMyLCAweDdEMzEsIDB4N0YzRCwgMHg3RjlFLCAweDdGOUEsCisgICAgMHg3RkNDLCAweDdGQ0UsIDB4N0ZEMiwgMHg4MDFDLCAweDgwNEEsIDB4ODA0NiwgMHg4MTJGLCAweDgxMTYsIDB4ODEyMywKKyAgICAweDgxMkIsIDB4ODEyOSwgMHg4MTMwLCAweDgxMjQsIDB4ODIwMiwgMHg4MjM1LCAweDgyMzcsIDB4ODIzNiwgMHg4MjM5LAorICAgIDB4ODM4RSwgMHg4MzlFLCAweDgzOTgsIDB4ODM3OCwgMHg4M0EyLCAweDgzOTYsIDB4ODNCRCwgMHg4M0FCLCAweDgzOTIsCisgICAgMHg4MzhBLCAweDgzOTMsIDB4ODM4OSwgMHg4M0EwLCAweDgzNzcsIDB4ODM3QiwgMHg4MzdDLCAweDgzODYsIDB4ODNBNywKKyAgICAweDg2NTUsIDB4NUY2QSwgMHg4NkM3LCAweDg2QzAsIDB4ODZCNiwgMHg4NkM0LCAweDg2QjUsIDB4ODZDNiwgMHg4NkNCLAorICAgIDB4ODZCMSwgMHg4NkFGLCAweDg2QzksIDB4ODg1MywgMHg4ODlFLCAweDg4ODgsIDB4ODhBQiwgMHg4ODkyLCAweDg4OTYsCisgICAgMHg4ODhELCAweDg4OEIsIDB4ODk5MywgMHg4OThGLCAweDhBMkEsIDB4OEExRCwgMHg4QTIzLCAweDhBMjUsIDB4OEEzMSwKKyAgICAweDhBMkQsIDB4OEExRiwgMHg4QTFCLCAweDhBMjIsIDB4OEM0OSwgMHg4QzVBLCAweDhDQTksIDB4OENBQywgMHg4Q0FCLAorICAgIDB4OENBOCwgMHg4Q0FBLCAweDhDQTcsIDB4OEQ2NywgMHg4RDY2LCAweDhEQkUsIDB4OERCQSwgMHg4RURCLCAweDhFREYsCisgICAgMHg5MDE5LCAweDkwMEQsIDB4OTAxQSwgMHg5MDE3LCAweDkwMjMsIDB4OTAxRiwgMHg5MDFELCAweDkwMTAsIDB4OTAxNSwKKyAgICAweDkwMUUsIDB4OTAyMCwgMHg5MDBGLCAweDkwMjIsIDB4OTAxNiwgMHg5MDFCLCAweDkwMTQsIDB4OTBFOCwgMHg5MEVELAorICAgIDB4OTBGRCwgMHg5MTU3LCAweDkxQ0UsIDB4OTFGNSwgMHg5MUU2LCAweDkxRTMsIDB4OTFFNywgMHg5MUVELCAweDkxRTksCisgICAgMHg5NTg5LCAweDk2NkEsIDB4OTY3NSwgMHg5NjczLCAweDk2NzgsIDB4OTY3MCwgMHg5Njc0LCAweDk2NzYsIDB4OTY3NywKKyAgICAweDk2NkMsIDB4OTZDMCwgMHg5NkVBLCAweDk2RTksIDB4N0FFMCwgMHg3QURGLCAweDk4MDIsIDB4OTgwMywgMHg5QjVBLAorICAgIDB4OUNFNSwgMHg5RTc1LCAweDlFN0YsIDB4OUVBNSwgMHg5RUJCLCAweDUwQTIsIDB4NTA4RCwgMHg1MDg1LCAweDUwOTksCisgICAgMHg1MDkxLCAweDUwODAsIDB4NTA5NiwgMHg1MDk4LCAweDUwOUEsIDB4NjcwMCwgMHg1MUYxLCAweDUyNzIsIDB4NTI3NCwKKyAgICAweDUyNzUsIDB4NTI2OSwgMHg1MkRFLCAweDUyREQsIDB4NTJEQiwgMHg1MzVBLCAweDUzQTUsIDB4NTU3QiwgMHg1NTgwLAorICAgIDB4NTVBNywgMHg1NTdDLCAweDU1OEEsIDB4NTU5RCwgMHg1NTk4LCAweDU1ODIsIDB4NTU5QywgMHg1NUFBLCAweDU1OTQsCisgICAgMHg1NTg3LCAweDU1OEIsIDB4NTU4MywgMHg1NUIzLCAweDU1QUUsIDB4NTU5RiwgMHg1NTNFLCAweDU1QjIsIDB4NTU5QSwKKyAgICAweDU1QkIsIDB4NTVBQywgMHg1NUIxLCAweDU1N0UsIDB4NTU4OSwgMHg1NUFCLCAweDU1OTksIDB4NTcwRCwgMHg1ODJGLAorICAgIDB4NTgyQSwgMHg1ODM0LCAweDU4MjQsIDB4NTgzMCwgMHg1ODMxLCAweDU4MjEsIDB4NTgxRCwgMHg1ODIwLCAweDU4RjksCisgICAgMHg1OEZBLCAweDU5NjAsIDB4NUE3NywgMHg1QTlBLCAweDVBN0YsIDB4NUE5MiwgMHg1QTlCLCAweDVBQTcsIDB4NUI3MywKKyAgICAweDVCNzEsIDB4NUJEMiwgMHg1QkNDLCAweDVCRDMsIDB4NUJEMCwgMHg1QzBBLCAweDVDMEIsIDB4NUMzMSwgMHg1RDRDLAorICAgIDB4NUQ1MCwgMHg1RDM0LCAweDVENDcsIDB4NURGRCwgMHg1RTQ1LCAweDVFM0QsIDB4NUU0MCwgMHg1RTQzLCAweDVFN0UsCisgICAgMHg1RUNBLCAweDVFQzEsIDB4NUVDMiwgMHg1RUM0LCAweDVGM0MsIDB4NUY2RCwgMHg1RkE5LCAweDVGQUEsIDB4NUZBOCwKKyAgICAweDYwRDEsIDB4NjBFMSwgMHg2MEIyLCAweDYwQjYsIDB4NjBFMCwgMHg2MTFDLCAweDYxMjMsIDB4NjBGQSwgMHg2MTE1LAorICAgIDB4NjBGMCwgMHg2MEZCLCAweDYwRjQsIDB4NjE2OCwgMHg2MEYxLCAweDYxMEUsIDB4NjBGNiwgMHg2MTA5LCAweDYxMDAsCisgICAgMHg2MTEyLCAweDYyMUYsIDB4NjI0OSwgMHg2M0EzLCAweDYzOEMsIDB4NjNDRiwgMHg2M0MwLCAweDYzRTksIDB4NjNDOSwKKyAgICAweDYzQzYsIDB4NjNDRCwgMHg2M0QyLCAweDYzRTMsIDB4NjNEMCwgMHg2M0UxLCAweDYzRDYsIDB4NjNFRCwgMHg2M0VFLAorICAgIDB4NjM3NiwgMHg2M0Y0LCAweDYzRUEsIDB4NjNEQiwgMHg2NDUyLCAweDYzREEsIDB4NjNGOSwgMHg2NTVFLCAweDY1NjYsCisgICAgMHg2NTYyLCAweDY1NjMsIDB4NjU5MSwgMHg2NTkwLCAweDY1QUYsIDB4NjY2RSwgMHg2NjcwLCAweDY2NzQsIDB4NjY3NiwKKyAgICAweDY2NkYsIDB4NjY5MSwgMHg2NjdBLCAweDY2N0UsIDB4NjY3NywgMHg2NkZFLCAweDY2RkYsIDB4NjcxRiwgMHg2NzFELAorICAgIDB4NjhGQSwgMHg2OEQ1LCAweDY4RTAsIDB4NjhEOCwgMHg2OEQ3LCAweDY5MDUsIDB4NjhERiwgMHg2OEY1LCAweDY4RUUsCisgICAgMHg2OEU3LCAweDY4RjksIDB4NjhEMiwgMHg2OEYyLCAweDY4RTMsIDB4NjhDQiwgMHg2OENELCAweDY5MEQsIDB4NjkxMiwKKyAgICAweDY5MEUsIDB4NjhDOSwgMHg2OERBLCAweDY5NkUsIDB4NjhGQiwgMHg2QjNFLCAweDZCM0EsIDB4NkIzRCwgMHg2Qjk4LAorICAgIDB4NkI5NiwgMHg2QkJDLCAweDZCRUYsIDB4NkMyRSwgMHg2QzJGLCAweDZDMkMsIDB4NkUyRiwgMHg2RTM4LCAweDZFNTQsCisgICAgMHg2RTIxLCAweDZFMzIsIDB4NkU2NywgMHg2RTRBLCAweDZFMjAsIDB4NkUyNSwgMHg2RTIzLCAweDZFMUIsIDB4NkU1QiwKKyAgICAweDZFNTgsIDB4NkUyNCwgMHg2RTU2LCAweDZFNkUsIDB4NkUyRCwgMHg2RTI2LCAweDZFNkYsIDB4NkUzNCwgMHg2RTRELAorICAgIDB4NkUzQSwgMHg2RTJDLCAweDZFNDMsIDB4NkUxRCwgMHg2RTNFLCAweDZFQ0IsIDB4NkU4OSwgMHg2RTE5LCAweDZFNEUsCisgICAgMHg2RTYzLCAweDZFNDQsIDB4NkU3MiwgMHg2RTY5LCAweDZFNUYsIDB4NzExOSwgMHg3MTFBLCAweDcxMjYsIDB4NzEzMCwKKyAgICAweDcxMjEsIDB4NzEzNiwgMHg3MTZFLCAweDcxMUMsIDB4NzI0QywgMHg3Mjg0LCAweDcyODAsIDB4NzMzNiwgMHg3MzI1LAorICAgIDB4NzMzNCwgMHg3MzI5LCAweDc0M0EsIDB4NzQyQSwgMHg3NDMzLCAweDc0MjIsIDB4NzQyNSwgMHg3NDM1LCAweDc0MzYsCisgICAgMHg3NDM0LCAweDc0MkYsIDB4NzQxQiwgMHg3NDI2LCAweDc0MjgsIDB4NzUyNSwgMHg3NTI2LCAweDc1NkIsIDB4NzU2QSwKKyAgICAweDc1RTIsIDB4NzVEQiwgMHg3NUUzLCAweDc1RDksIDB4NzVEOCwgMHg3NURFLCAweDc1RTAsIDB4NzY3QiwgMHg3NjdDLAorICAgIDB4NzY5NiwgMHg3NjkzLCAweDc2QjQsIDB4NzZEQywgMHg3NzRGLCAweDc3RUQsIDB4Nzg1RCwgMHg3ODZDLCAweDc4NkYsCisgICAgMHg3QTBELCAweDdBMDgsIDB4N0EwQiwgMHg3QTA1LCAweDdBMDAsIDB4N0E5OCwgMHg3QTk3LCAweDdBOTYsIDB4N0FFNSwKKyAgICAweDdBRTMsIDB4N0I0OSwgMHg3QjU2LCAweDdCNDYsIDB4N0I1MCwgMHg3QjUyLCAweDdCNTQsIDB4N0I0RCwgMHg3QjRCLAorICAgIDB4N0I0RiwgMHg3QjUxLCAweDdDOUYsIDB4N0NBNSwgMHg3RDVFLCAweDdENTAsIDB4N0Q2OCwgMHg3RDU1LCAweDdEMkIsCisgICAgMHg3RDZFLCAweDdENzIsIDB4N0Q2MSwgMHg3RDY2LCAweDdENjIsIDB4N0Q3MCwgMHg3RDczLCAweDU1ODQsIDB4N0ZENCwKKyAgICAweDdGRDUsIDB4ODAwQiwgMHg4MDUyLCAweDgwODUsIDB4ODE1NSwgMHg4MTU0LCAweDgxNEIsIDB4ODE1MSwgMHg4MTRFLAorICAgIDB4ODEzOSwgMHg4MTQ2LCAweDgxM0UsIDB4ODE0QywgMHg4MTUzLCAweDgxNzQsIDB4ODIxMiwgMHg4MjFDLCAweDgzRTksCisgICAgMHg4NDAzLCAweDgzRjgsIDB4ODQwRCwgMHg4M0UwLCAweDgzQzUsIDB4ODQwQiwgMHg4M0MxLCAweDgzRUYsIDB4ODNGMSwKKyAgICAweDgzRjQsIDB4ODQ1NywgMHg4NDBBLCAweDgzRjAsIDB4ODQwQywgMHg4M0NDLCAweDgzRkQsIDB4ODNGMiwgMHg4M0NBLAorICAgIDB4ODQzOCwgMHg4NDBFLCAweDg0MDQsIDB4ODNEQywgMHg4NDA3LCAweDgzRDQsIDB4ODNERiwgMHg4NjVCLCAweDg2REYsCisgICAgMHg4NkQ5LCAweDg2RUQsIDB4ODZENCwgMHg4NkRCLCAweDg2RTQsIDB4ODZEMCwgMHg4NkRFLCAweDg4NTcsIDB4ODhDMSwKKyAgICAweDg4QzIsIDB4ODhCMSwgMHg4OTgzLCAweDg5OTYsIDB4OEEzQiwgMHg4QTYwLCAweDhBNTUsIDB4OEE1RSwgMHg4QTNDLAorICAgIDB4OEE0MSwgMHg4QTU0LCAweDhBNUIsIDB4OEE1MCwgMHg4QTQ2LCAweDhBMzQsIDB4OEEzQSwgMHg4QTM2LCAweDhBNTYsCisgICAgMHg4QzYxLCAweDhDODIsIDB4OENBRiwgMHg4Q0JDLCAweDhDQjMsIDB4OENCRCwgMHg4Q0MxLCAweDhDQkIsIDB4OENDMCwKKyAgICAweDhDQjQsIDB4OENCNywgMHg4Q0I2LCAweDhDQkYsIDB4OENCOCwgMHg4RDhBLCAweDhEODUsIDB4OEQ4MSwgMHg4RENFLAorICAgIDB4OERERCwgMHg4RENCLCAweDhEREEsIDB4OEREMSwgMHg4RENDLCAweDhEREIsIDB4OERDNiwgMHg4RUZCLCAweDhFRjgsCisgICAgMHg4RUZDLCAweDhGOUMsIDB4OTAyRSwgMHg5MDM1LCAweDkwMzEsIDB4OTAzOCwgMHg5MDMyLCAweDkwMzYsIDB4OTEwMiwKKyAgICAweDkwRjUsIDB4OTEwOSwgMHg5MEZFLCAweDkxNjMsIDB4OTE2NSwgMHg5MUNGLCAweDkyMTQsIDB4OTIxNSwgMHg5MjIzLAorICAgIDB4OTIwOSwgMHg5MjFFLCAweDkyMEQsIDB4OTIxMCwgMHg5MjA3LCAweDkyMTEsIDB4OTU5NCwgMHg5NThGLCAweDk1OEIsCisgICAgMHg5NTkxLCAweDk1OTMsIDB4OTU5MiwgMHg5NThFLCAweDk2OEEsIDB4OTY4RSwgMHg5NjhCLCAweDk2N0QsIDB4OTY4NSwKKyAgICAweDk2ODYsIDB4OTY4RCwgMHg5NjcyLCAweDk2ODQsIDB4OTZDMSwgMHg5NkM1LCAweDk2QzQsIDB4OTZDNiwgMHg5NkM3LAorICAgIDB4OTZFRiwgMHg5NkYyLCAweDk3Q0MsIDB4OTgwNSwgMHg5ODA2LCAweDk4MDgsIDB4OThFNywgMHg5OEVBLCAweDk4RUYsCisgICAgMHg5OEU5LCAweDk4RjIsIDB4OThFRCwgMHg5OUFFLCAweDk5QUQsIDB4OUVDMywgMHg5RUNELCAweDlFRDEsIDB4NEU4MiwKKyAgICAweDUwQUQsIDB4NTBCNSwgMHg1MEIyLCAweDUwQjMsIDB4NTBDNSwgMHg1MEJFLCAweDUwQUMsIDB4NTBCNywgMHg1MEJCLAorICAgIDB4NTBBRiwgMHg1MEM3LCAweDUyN0YsIDB4NTI3NywgMHg1MjdELCAweDUyREYsIDB4NTJFNiwgMHg1MkU0LCAweDUyRTIsCisgICAgMHg1MkUzLCAweDUzMkYsIDB4NTVERiwgMHg1NUU4LCAweDU1RDMsIDB4NTVFNiwgMHg1NUNFLCAweDU1REMsIDB4NTVDNywKKyAgICAweDU1RDEsIDB4NTVFMywgMHg1NUU0LCAweDU1RUYsIDB4NTVEQSwgMHg1NUUxLCAweDU1QzUsIDB4NTVDNiwgMHg1NUU1LAorICAgIDB4NTVDOSwgMHg1NzEyLCAweDU3MTMsIDB4NTg1RSwgMHg1ODUxLCAweDU4NTgsIDB4NTg1NywgMHg1ODVBLCAweDU4NTQsCisgICAgMHg1ODZCLCAweDU4NEMsIDB4NTg2RCwgMHg1ODRBLCAweDU4NjIsIDB4NTg1MiwgMHg1ODRCLCAweDU5NjcsIDB4NUFDMSwKKyAgICAweDVBQzksIDB4NUFDQywgMHg1QUJFLCAweDVBQkQsIDB4NUFCQywgMHg1QUIzLCAweDVBQzIsIDB4NUFCMiwgMHg1RDY5LAorICAgIDB4NUQ2RiwgMHg1RTRDLCAweDVFNzksIDB4NUVDOSwgMHg1RUM4LCAweDVGMTIsIDB4NUY1OSwgMHg1RkFDLCAweDVGQUUsCisgICAgMHg2MTFBLCAweDYxMEYsIDB4NjE0OCwgMHg2MTFGLCAweDYwRjMsIDB4NjExQiwgMHg2MEY5LCAweDYxMDEsIDB4NjEwOCwKKyAgICAweDYxNEUsIDB4NjE0QywgMHg2MTQ0LCAweDYxNEQsIDB4NjEzRSwgMHg2MTM0LCAweDYxMjcsIDB4NjEwRCwgMHg2MTA2LAorICAgIDB4NjEzNywgMHg2MjIxLCAweDYyMjIsIDB4NjQxMywgMHg2NDNFLCAweDY0MUUsIDB4NjQyQSwgMHg2NDJELCAweDY0M0QsCisgICAgMHg2NDJDLCAweDY0MEYsIDB4NjQxQywgMHg2NDE0LCAweDY0MEQsIDB4NjQzNiwgMHg2NDE2LCAweDY0MTcsIDB4NjQwNiwKKyAgICAweDY1NkMsIDB4NjU5RiwgMHg2NUIwLCAweDY2OTcsIDB4NjY4OSwgMHg2Njg3LCAweDY2ODgsIDB4NjY5NiwgMHg2Njg0LAorICAgIDB4NjY5OCwgMHg2NjhELCAweDY3MDMsIDB4Njk5NCwgMHg2OTZELCAweDY5NUEsIDB4Njk3NywgMHg2OTYwLCAweDY5NTQsCisgICAgMHg2OTc1LCAweDY5MzAsIDB4Njk4MiwgMHg2OTRBLCAweDY5NjgsIDB4Njk2QiwgMHg2OTVFLCAweDY5NTMsIDB4Njk3OSwKKyAgICAweDY5ODYsIDB4Njk1RCwgMHg2OTYzLCAweDY5NUIsIDB4NkI0NywgMHg2QjcyLCAweDZCQzAsIDB4NkJCRiwgMHg2QkQzLAorICAgIDB4NkJGRCwgMHg2RUEyLCAweDZFQUYsIDB4NkVEMywgMHg2RUI2LCAweDZFQzIsIDB4NkU5MCwgMHg2RTlELCAweDZFQzcsCisgICAgMHg2RUM1LCAweDZFQTUsIDB4NkU5OCwgMHg2RUJDLCAweDZFQkEsIDB4NkVBQiwgMHg2RUQxLCAweDZFOTYsIDB4NkU5QywKKyAgICAweDZFQzQsIDB4NkVENCwgMHg2RUFBLCAweDZFQTcsIDB4NkVCNCwgMHg3MTRFLCAweDcxNTksIDB4NzE2OSwgMHg3MTY0LAorICAgIDB4NzE0OSwgMHg3MTY3LCAweDcxNUMsIDB4NzE2QywgMHg3MTY2LCAweDcxNEMsIDB4NzE2NSwgMHg3MTVFLCAweDcxNDYsCisgICAgMHg3MTY4LCAweDcxNTYsIDB4NzIzQSwgMHg3MjUyLCAweDczMzcsIDB4NzM0NSwgMHg3MzNGLCAweDczM0UsIDB4NzQ2RiwKKyAgICAweDc0NUEsIDB4NzQ1NSwgMHg3NDVGLCAweDc0NUUsIDB4NzQ0MSwgMHg3NDNGLCAweDc0NTksIDB4NzQ1QiwgMHg3NDVDLAorICAgIDB4NzU3NiwgMHg3NTc4LCAweDc2MDAsIDB4NzVGMCwgMHg3NjAxLCAweDc1RjIsIDB4NzVGMSwgMHg3NUZBLCAweDc1RkYsCisgICAgMHg3NUY0LCAweDc1RjMsIDB4NzZERSwgMHg3NkRGLCAweDc3NUIsIDB4Nzc2QiwgMHg3NzY2LCAweDc3NUUsIDB4Nzc2MywKKyAgICAweDc3NzksIDB4Nzc2QSwgMHg3NzZDLCAweDc3NUMsIDB4Nzc2NSwgMHg3NzY4LCAweDc3NjIsIDB4NzdFRSwgMHg3ODhFLAorICAgIDB4NzhCMCwgMHg3ODk3LCAweDc4OTgsIDB4Nzg4QywgMHg3ODg5LCAweDc4N0MsIDB4Nzg5MSwgMHg3ODkzLCAweDc4N0YsCisgICAgMHg3OTdBLCAweDc5N0YsIDB4Nzk4MSwgMHg4NDJDLCAweDc5QkQsIDB4N0ExQywgMHg3QTFBLCAweDdBMjAsIDB4N0ExNCwKKyAgICAweDdBMUYsIDB4N0ExRSwgMHg3QTlGLCAweDdBQTAsIDB4N0I3NywgMHg3QkMwLCAweDdCNjAsIDB4N0I2RSwgMHg3QjY3LAorICAgIDB4N0NCMSwgMHg3Q0IzLCAweDdDQjUsIDB4N0Q5MywgMHg3RDc5LCAweDdEOTEsIDB4N0Q4MSwgMHg3RDhGLCAweDdENUIsCisgICAgMHg3RjZFLCAweDdGNjksIDB4N0Y2QSwgMHg3RjcyLCAweDdGQTksIDB4N0ZBOCwgMHg3RkE0LCAweDgwNTYsIDB4ODA1OCwKKyAgICAweDgwODYsIDB4ODA4NCwgMHg4MTcxLCAweDgxNzAsIDB4ODE3OCwgMHg4MTY1LCAweDgxNkUsIDB4ODE3MywgMHg4MTZCLAorICAgIDB4ODE3OSwgMHg4MTdBLCAweDgxNjYsIDB4ODIwNSwgMHg4MjQ3LCAweDg0ODIsIDB4ODQ3NywgMHg4NDNELCAweDg0MzEsCisgICAgMHg4NDc1LCAweDg0NjYsIDB4ODQ2QiwgMHg4NDQ5LCAweDg0NkMsIDB4ODQ1QiwgMHg4NDNDLCAweDg0MzUsIDB4ODQ2MSwKKyAgICAweDg0NjMsIDB4ODQ2OSwgMHg4NDZELCAweDg0NDYsIDB4ODY1RSwgMHg4NjVDLCAweDg2NUYsIDB4ODZGOSwgMHg4NzEzLAorICAgIDB4ODcwOCwgMHg4NzA3LCAweDg3MDAsIDB4ODZGRSwgMHg4NkZCLCAweDg3MDIsIDB4ODcwMywgMHg4NzA2LCAweDg3MEEsCisgICAgMHg4ODU5LCAweDg4REYsIDB4ODhENCwgMHg4OEQ5LCAweDg4REMsIDB4ODhEOCwgMHg4OERELCAweDg4RTEsIDB4ODhDQSwKKyAgICAweDg4RDUsIDB4ODhEMiwgMHg4OTlDLCAweDg5RTMsIDB4OEE2QiwgMHg4QTcyLCAweDhBNzMsIDB4OEE2NiwgMHg4QTY5LAorICAgIDB4OEE3MCwgMHg4QTg3LCAweDhBN0MsIDB4OEE2MywgMHg4QUEwLCAweDhBNzEsIDB4OEE4NSwgMHg4QTZELCAweDhBNjIsCisgICAgMHg4QTZFLCAweDhBNkMsIDB4OEE3OSwgMHg4QTdCLCAweDhBM0UsIDB4OEE2OCwgMHg4QzYyLCAweDhDOEEsIDB4OEM4OSwKKyAgICAweDhDQ0EsIDB4OENDNywgMHg4Q0M4LCAweDhDQzQsIDB4OENCMiwgMHg4Q0MzLCAweDhDQzIsIDB4OENDNSwgMHg4REUxLAorICAgIDB4OERERiwgMHg4REU4LCAweDhERUYsIDB4OERGMywgMHg4REZBLCAweDhERUEsIDB4OERFNCwgMHg4REU2LCAweDhFQjIsCisgICAgMHg4RjAzLCAweDhGMDksIDB4OEVGRSwgMHg4RjBBLCAweDhGOUYsIDB4OEZCMiwgMHg5MDRCLCAweDkwNEEsIDB4OTA1MywKKyAgICAweDkwNDIsIDB4OTA1NCwgMHg5MDNDLCAweDkwNTUsIDB4OTA1MCwgMHg5MDQ3LCAweDkwNEYsIDB4OTA0RSwgMHg5MDRELAorICAgIDB4OTA1MSwgMHg5MDNFLCAweDkwNDEsIDB4OTExMiwgMHg5MTE3LCAweDkxNkMsIDB4OTE2QSwgMHg5MTY5LCAweDkxQzksCisgICAgMHg5MjM3LCAweDkyNTcsIDB4OTIzOCwgMHg5MjNELCAweDkyNDAsIDB4OTIzRSwgMHg5MjVCLCAweDkyNEIsIDB4OTI2NCwKKyAgICAweDkyNTEsIDB4OTIzNCwgMHg5MjQ5LCAweDkyNEQsIDB4OTI0NSwgMHg5MjM5LCAweDkyM0YsIDB4OTI1QSwgMHg5NTk4LAorICAgIDB4OTY5OCwgMHg5Njk0LCAweDk2OTUsIDB4OTZDRCwgMHg5NkNCLCAweDk2QzksIDB4OTZDQSwgMHg5NkY3LCAweDk2RkIsCisgICAgMHg5NkY5LCAweDk2RjYsIDB4OTc1NiwgMHg5Nzc0LCAweDk3NzYsIDB4OTgxMCwgMHg5ODExLCAweDk4MTMsIDB4OTgwQSwKKyAgICAweDk4MTIsIDB4OTgwQywgMHg5OEZDLCAweDk4RjQsIDB4OThGRCwgMHg5OEZFLCAweDk5QjMsIDB4OTlCMSwgMHg5OUI0LAorICAgIDB4OUFFMSwgMHg5Q0U5LCAweDlFODIsIDB4OUYwRSwgMHg5RjEzLCAweDlGMjAsIDB4NTBFNywgMHg1MEVFLCAweDUwRTUsCisgICAgMHg1MEQ2LCAweDUwRUQsIDB4NTBEQSwgMHg1MEQ1LCAweDUwQ0YsIDB4NTBEMSwgMHg1MEYxLCAweDUwQ0UsIDB4NTBFOSwKKyAgICAweDUxNjIsIDB4NTFGMywgMHg1MjgzLCAweDUyODIsIDB4NTMzMSwgMHg1M0FELCAweDU1RkUsIDB4NTYwMCwgMHg1NjFCLAorICAgIDB4NTYxNywgMHg1NUZELCAweDU2MTQsIDB4NTYwNiwgMHg1NjA5LCAweDU2MEQsIDB4NTYwRSwgMHg1NUY3LCAweDU2MTYsCisgICAgMHg1NjFGLCAweDU2MDgsIDB4NTYxMCwgMHg1NUY2LCAweDU3MTgsIDB4NTcxNiwgMHg1ODc1LCAweDU4N0UsIDB4NTg4MywKKyAgICAweDU4OTMsIDB4NTg4QSwgMHg1ODc5LCAweDU4ODUsIDB4NTg3RCwgMHg1OEZELCAweDU5MjUsIDB4NTkyMiwgMHg1OTI0LAorICAgIDB4NTk2QSwgMHg1OTY5LCAweDVBRTEsIDB4NUFFNiwgMHg1QUU5LCAweDVBRDcsIDB4NUFENiwgMHg1QUQ4LCAweDVBRTMsCisgICAgMHg1Qjc1LCAweDVCREUsIDB4NUJFNywgMHg1QkUxLCAweDVCRTUsIDB4NUJFNiwgMHg1QkU4LCAweDVCRTIsIDB4NUJFNCwKKyAgICAweDVCREYsIDB4NUMwRCwgMHg1QzYyLCAweDVEODQsIDB4NUQ4NywgMHg1RTVCLCAweDVFNjMsIDB4NUU1NSwgMHg1RTU3LAorICAgIDB4NUU1NCwgMHg1RUQzLCAweDVFRDYsIDB4NUYwQSwgMHg1RjQ2LCAweDVGNzAsIDB4NUZCOSwgMHg2MTQ3LCAweDYxM0YsCisgICAgMHg2MTRCLCAweDYxNzcsIDB4NjE2MiwgMHg2MTYzLCAweDYxNUYsIDB4NjE1QSwgMHg2MTU4LCAweDYxNzUsIDB4NjIyQSwKKyAgICAweDY0ODcsIDB4NjQ1OCwgMHg2NDU0LCAweDY0QTQsIDB4NjQ3OCwgMHg2NDVGLCAweDY0N0EsIDB4NjQ1MSwgMHg2NDY3LAorICAgIDB4NjQzNCwgMHg2NDZELCAweDY0N0IsIDB4NjU3MiwgMHg2NUExLCAweDY1RDcsIDB4NjVENiwgMHg2NkEyLCAweDY2QTgsCisgICAgMHg2NjlELCAweDY5OUMsIDB4NjlBOCwgMHg2OTk1LCAweDY5QzEsIDB4NjlBRSwgMHg2OUQzLCAweDY5Q0IsIDB4Njk5QiwKKyAgICAweDY5QjcsIDB4NjlCQiwgMHg2OUFCLCAweDY5QjQsIDB4NjlEMCwgMHg2OUNELCAweDY5QUQsIDB4NjlDQywgMHg2OUE2LAorICAgIDB4NjlDMywgMHg2OUEzLCAweDZCNDksIDB4NkI0QywgMHg2QzMzLCAweDZGMzMsIDB4NkYxNCwgMHg2RUZFLCAweDZGMTMsCisgICAgMHg2RUY0LCAweDZGMjksIDB4NkYzRSwgMHg2RjIwLCAweDZGMkMsIDB4NkYwRiwgMHg2RjAyLCAweDZGMjIsIDB4NkVGRiwKKyAgICAweDZFRUYsIDB4NkYwNiwgMHg2RjMxLCAweDZGMzgsIDB4NkYzMiwgMHg2RjIzLCAweDZGMTUsIDB4NkYyQiwgMHg2RjJGLAorICAgIDB4NkY4OCwgMHg2RjJBLCAweDZFRUMsIDB4NkYwMSwgMHg2RUYyLCAweDZFQ0MsIDB4NkVGNywgMHg3MTk0LCAweDcxOTksCisgICAgMHg3MTdELCAweDcxOEEsIDB4NzE4NCwgMHg3MTkyLCAweDcyM0UsIDB4NzI5MiwgMHg3Mjk2LCAweDczNDQsIDB4NzM1MCwKKyAgICAweDc0NjQsIDB4NzQ2MywgMHg3NDZBLCAweDc0NzAsIDB4NzQ2RCwgMHg3NTA0LCAweDc1OTEsIDB4NzYyNywgMHg3NjBELAorICAgIDB4NzYwQiwgMHg3NjA5LCAweDc2MTMsIDB4NzZFMSwgMHg3NkUzLCAweDc3ODQsIDB4Nzc3RCwgMHg3NzdGLCAweDc3NjEsCisgICAgMHg3OEMxLCAweDc4OUYsIDB4NzhBNywgMHg3OEIzLCAweDc4QTksIDB4NzhBMywgMHg3OThFLCAweDc5OEYsIDB4Nzk4RCwKKyAgICAweDdBMkUsIDB4N0EzMSwgMHg3QUFBLCAweDdBQTksIDB4N0FFRCwgMHg3QUVGLCAweDdCQTEsIDB4N0I5NSwgMHg3QjhCLAorICAgIDB4N0I3NSwgMHg3Qjk3LCAweDdCOUQsIDB4N0I5NCwgMHg3QjhGLCAweDdCQjgsIDB4N0I4NywgMHg3Qjg0LCAweDdDQjksCisgICAgMHg3Q0JELCAweDdDQkUsIDB4N0RCQiwgMHg3REIwLCAweDdEOUMsIDB4N0RCRCwgMHg3REJFLCAweDdEQTAsIDB4N0RDQSwKKyAgICAweDdEQjQsIDB4N0RCMiwgMHg3REIxLCAweDdEQkEsIDB4N0RBMiwgMHg3REJGLCAweDdEQjUsIDB4N0RCOCwgMHg3REFELAorICAgIDB4N0REMiwgMHg3REM3LCAweDdEQUMsIDB4N0Y3MCwgMHg3RkUwLCAweDdGRTEsIDB4N0ZERiwgMHg4MDVFLCAweDgwNUEsCisgICAgMHg4MDg3LCAweDgxNTAsIDB4ODE4MCwgMHg4MThGLCAweDgxODgsIDB4ODE4QSwgMHg4MTdGLCAweDgxODIsIDB4ODFFNywKKyAgICAweDgxRkEsIDB4ODIwNywgMHg4MjE0LCAweDgyMUUsIDB4ODI0QiwgMHg4NEM5LCAweDg0QkYsIDB4ODRDNiwgMHg4NEM0LAorICAgIDB4ODQ5OSwgMHg4NDlFLCAweDg0QjIsIDB4ODQ5QywgMHg4NENCLCAweDg0QjgsIDB4ODRDMCwgMHg4NEQzLCAweDg0OTAsCisgICAgMHg4NEJDLCAweDg0RDEsIDB4ODRDQSwgMHg4NzNGLCAweDg3MUMsIDB4ODczQiwgMHg4NzIyLCAweDg3MjUsIDB4ODczNCwKKyAgICAweDg3MTgsIDB4ODc1NSwgMHg4NzM3LCAweDg3MjksIDB4ODhGMywgMHg4OTAyLCAweDg4RjQsIDB4ODhGOSwgMHg4OEY4LAorICAgIDB4ODhGRCwgMHg4OEU4LCAweDg5MUEsIDB4ODhFRiwgMHg4QUE2LCAweDhBOEMsIDB4OEE5RSwgMHg4QUEzLCAweDhBOEQsCisgICAgMHg4QUExLCAweDhBOTMsIDB4OEFBNCwgMHg4QUFBLCAweDhBQTUsIDB4OEFBOCwgMHg4QTk4LCAweDhBOTEsIDB4OEE5QSwKKyAgICAweDhBQTcsIDB4OEM2QSwgMHg4QzhELCAweDhDOEMsIDB4OENEMywgMHg4Q0QxLCAweDhDRDIsIDB4OEQ2QiwgMHg4RDk5LAorICAgIDB4OEQ5NSwgMHg4REZDLCAweDhGMTQsIDB4OEYxMiwgMHg4RjE1LCAweDhGMTMsIDB4OEZBMywgMHg5MDYwLCAweDkwNTgsCisgICAgMHg5MDVDLCAweDkwNjMsIDB4OTA1OSwgMHg5MDVFLCAweDkwNjIsIDB4OTA1RCwgMHg5MDVCLCAweDkxMTksIDB4OTExOCwKKyAgICAweDkxMUUsIDB4OTE3NSwgMHg5MTc4LCAweDkxNzcsIDB4OTE3NCwgMHg5Mjc4LCAweDkyQUMsIDB4OTI4MCwgMHg5Mjg1LAorICAgIDB4OTI5OCwgMHg5Mjk2LCAweDkyN0IsIDB4OTI5MywgMHg5MjlDLCAweDkyQTgsIDB4OTI3QywgMHg5MjkxLCAweDk1QTEsCisgICAgMHg5NUE4LCAweDk1QTksIDB4OTVBMywgMHg5NUE1LCAweDk1QTQsIDB4OTY5OSwgMHg5NjlDLCAweDk2OUIsIDB4OTZDQywKKyAgICAweDk2RDIsIDB4OTcwMCwgMHg5NzdDLCAweDk3ODUsIDB4OTdGNiwgMHg5ODE3LCAweDk4MTgsIDB4OThBRiwgMHg5OEIxLAorICAgIDB4OTkwMywgMHg5OTA1LCAweDk5MEMsIDB4OTkwOSwgMHg5OUMxLCAweDlBQUYsIDB4OUFCMCwgMHg5QUU2LCAweDlCNDEsCisgICAgMHg5QjQyLCAweDlDRjQsIDB4OUNGNiwgMHg5Q0YzLCAweDlFQkMsIDB4OUYzQiwgMHg5RjRBLCAweDUxMDQsIDB4NTEwMCwKKyAgICAweDUwRkIsIDB4NTBGNSwgMHg1MEY5LCAweDUxMDIsIDB4NTEwOCwgMHg1MTA5LCAweDUxMDUsIDB4NTFEQywgMHg1Mjg3LAorICAgIDB4NTI4OCwgMHg1Mjg5LCAweDUyOEQsIDB4NTI4QSwgMHg1MkYwLCAweDUzQjIsIDB4NTYyRSwgMHg1NjNCLCAweDU2MzksCisgICAgMHg1NjMyLCAweDU2M0YsIDB4NTYzNCwgMHg1NjI5LCAweDU2NTMsIDB4NTY0RSwgMHg1NjU3LCAweDU2NzQsIDB4NTYzNiwKKyAgICAweDU2MkYsIDB4NTYzMCwgMHg1ODgwLCAweDU4OUYsIDB4NTg5RSwgMHg1OEIzLCAweDU4OUMsIDB4NThBRSwgMHg1OEE5LAorICAgIDB4NThBNiwgMHg1OTZELCAweDVCMDksIDB4NUFGQiwgMHg1QjBCLCAweDVBRjUsIDB4NUIwQywgMHg1QjA4LCAweDVCRUUsCisgICAgMHg1QkVDLCAweDVCRTksIDB4NUJFQiwgMHg1QzY0LCAweDVDNjUsIDB4NUQ5RCwgMHg1RDk0LCAweDVFNjIsIDB4NUU1RiwKKyAgICAweDVFNjEsIDB4NUVFMiwgMHg1RURBLCAweDVFREYsIDB4NUVERCwgMHg1RUUzLCAweDVFRTAsIDB4NUY0OCwgMHg1RjcxLAorICAgIDB4NUZCNywgMHg1RkI1LCAweDYxNzYsIDB4NjE2NywgMHg2MTZFLCAweDYxNUQsIDB4NjE1NSwgMHg2MTgyLCAweDYxN0MsCisgICAgMHg2MTcwLCAweDYxNkIsIDB4NjE3RSwgMHg2MUE3LCAweDYxOTAsIDB4NjFBQiwgMHg2MThFLCAweDYxQUMsIDB4NjE5QSwKKyAgICAweDYxQTQsIDB4NjE5NCwgMHg2MUFFLCAweDYyMkUsIDB4NjQ2OSwgMHg2NDZGLCAweDY0NzksIDB4NjQ5RSwgMHg2NEIyLAorICAgIDB4NjQ4OCwgMHg2NDkwLCAweDY0QjAsIDB4NjRBNSwgMHg2NDkzLCAweDY0OTUsIDB4NjRBOSwgMHg2NDkyLCAweDY0QUUsCisgICAgMHg2NEFELCAweDY0QUIsIDB4NjQ5QSwgMHg2NEFDLCAweDY0OTksIDB4NjRBMiwgMHg2NEIzLCAweDY1NzUsIDB4NjU3NywKKyAgICAweDY1NzgsIDB4NjZBRSwgMHg2NkFCLCAweDY2QjQsIDB4NjZCMSwgMHg2QTIzLCAweDZBMUYsIDB4NjlFOCwgMHg2QTAxLAorICAgIDB4NkExRSwgMHg2QTE5LCAweDY5RkQsIDB4NkEyMSwgMHg2QTEzLCAweDZBMEEsIDB4NjlGMywgMHg2QTAyLCAweDZBMDUsCisgICAgMHg2OUVELCAweDZBMTEsIDB4NkI1MCwgMHg2QjRFLCAweDZCQTQsIDB4NkJDNSwgMHg2QkM2LCAweDZGM0YsIDB4NkY3QywKKyAgICAweDZGODQsIDB4NkY1MSwgMHg2RjY2LCAweDZGNTQsIDB4NkY4NiwgMHg2RjZELCAweDZGNUIsIDB4NkY3OCwgMHg2RjZFLAorICAgIDB4NkY4RSwgMHg2RjdBLCAweDZGNzAsIDB4NkY2NCwgMHg2Rjk3LCAweDZGNTgsIDB4NkVENSwgMHg2RjZGLCAweDZGNjAsCisgICAgMHg2RjVGLCAweDcxOUYsIDB4NzFBQywgMHg3MUIxLCAweDcxQTgsIDB4NzI1NiwgMHg3MjlCLCAweDczNEUsIDB4NzM1NywKKyAgICAweDc0NjksIDB4NzQ4QiwgMHg3NDgzLCAweDc0N0UsIDB4NzQ4MCwgMHg3NTdGLCAweDc2MjAsIDB4NzYyOSwgMHg3NjFGLAorICAgIDB4NzYyNCwgMHg3NjI2LCAweDc2MjEsIDB4NzYyMiwgMHg3NjlBLCAweDc2QkEsIDB4NzZFNCwgMHg3NzhFLCAweDc3ODcsCisgICAgMHg3NzhDLCAweDc3OTEsIDB4Nzc4QiwgMHg3OENCLCAweDc4QzUsIDB4NzhCQSwgMHg3OENBLCAweDc4QkUsIDB4NzhENSwKKyAgICAweDc4QkMsIDB4NzhEMCwgMHg3QTNGLCAweDdBM0MsIDB4N0E0MCwgMHg3QTNELCAweDdBMzcsIDB4N0EzQiwgMHg3QUFGLAorICAgIDB4N0FBRSwgMHg3QkFELCAweDdCQjEsIDB4N0JDNCwgMHg3QkI0LCAweDdCQzYsIDB4N0JDNywgMHg3QkMxLCAweDdCQTAsCisgICAgMHg3QkNDLCAweDdDQ0EsIDB4N0RFMCwgMHg3REY0LCAweDdERUYsIDB4N0RGQiwgMHg3REQ4LCAweDdERUMsIDB4N0RERCwKKyAgICAweDdERTgsIDB4N0RFMywgMHg3RERBLCAweDdEREUsIDB4N0RFOSwgMHg3RDlFLCAweDdERDksIDB4N0RGMiwgMHg3REY5LAorICAgIDB4N0Y3NSwgMHg3Rjc3LCAweDdGQUYsIDB4N0ZFOSwgMHg4MDI2LCAweDgxOUIsIDB4ODE5QywgMHg4MTlELCAweDgxQTAsCisgICAgMHg4MTlBLCAweDgxOTgsIDB4ODUxNywgMHg4NTNELCAweDg1MUEsIDB4ODRFRSwgMHg4NTJDLCAweDg1MkQsIDB4ODUxMywKKyAgICAweDg1MTEsIDB4ODUyMywgMHg4NTIxLCAweDg1MTQsIDB4ODRFQywgMHg4NTI1LCAweDg0RkYsIDB4ODUwNiwgMHg4NzgyLAorICAgIDB4ODc3NCwgMHg4Nzc2LCAweDg3NjAsIDB4ODc2NiwgMHg4Nzc4LCAweDg3NjgsIDB4ODc1OSwgMHg4NzU3LCAweDg3NEMsCisgICAgMHg4NzUzLCAweDg4NUIsIDB4ODg1RCwgMHg4OTEwLCAweDg5MDcsIDB4ODkxMiwgMHg4OTEzLCAweDg5MTUsIDB4ODkwQSwKKyAgICAweDhBQkMsIDB4OEFEMiwgMHg4QUM3LCAweDhBQzQsIDB4OEE5NSwgMHg4QUNCLCAweDhBRjgsIDB4OEFCMiwgMHg4QUM5LAorICAgIDB4OEFDMiwgMHg4QUJGLCAweDhBQjAsIDB4OEFENiwgMHg4QUNELCAweDhBQjYsIDB4OEFCOSwgMHg4QURCLCAweDhDNEMsCisgICAgMHg4QzRFLCAweDhDNkMsIDB4OENFMCwgMHg4Q0RFLCAweDhDRTYsIDB4OENFNCwgMHg4Q0VDLCAweDhDRUQsIDB4OENFMiwKKyAgICAweDhDRTMsIDB4OENEQywgMHg4Q0VBLCAweDhDRTEsIDB4OEQ2RCwgMHg4RDlGLCAweDhEQTMsIDB4OEUyQiwgMHg4RTEwLAorICAgIDB4OEUxRCwgMHg4RTIyLCAweDhFMEYsIDB4OEUyOSwgMHg4RTFGLCAweDhFMjEsIDB4OEUxRSwgMHg4RUJBLCAweDhGMUQsCisgICAgMHg4RjFCLCAweDhGMUYsIDB4OEYyOSwgMHg4RjI2LCAweDhGMkEsIDB4OEYxQywgMHg4RjFFLCAweDhGMjUsIDB4OTA2OSwKKyAgICAweDkwNkUsIDB4OTA2OCwgMHg5MDZELCAweDkwNzcsIDB4OTEzMCwgMHg5MTJELCAweDkxMjcsIDB4OTEzMSwgMHg5MTg3LAorICAgIDB4OTE4OSwgMHg5MThCLCAweDkxODMsIDB4OTJDNSwgMHg5MkJCLCAweDkyQjcsIDB4OTJFQSwgMHg5MkU0LCAweDkyQzEsCisgICAgMHg5MkIzLCAweDkyQkMsIDB4OTJEMiwgMHg5MkM3LCAweDkyRjAsIDB4OTJCMiwgMHg5NUFELCAweDk1QjEsIDB4OTcwNCwKKyAgICAweDk3MDYsIDB4OTcwNywgMHg5NzA5LCAweDk3NjAsIDB4OTc4RCwgMHg5NzhCLCAweDk3OEYsIDB4OTgyMSwgMHg5ODJCLAorICAgIDB4OTgxQywgMHg5OEIzLCAweDk5MEEsIDB4OTkxMywgMHg5OTEyLCAweDk5MTgsIDB4OTlERCwgMHg5OUQwLCAweDk5REYsCisgICAgMHg5OURCLCAweDk5RDEsIDB4OTlENSwgMHg5OUQyLCAweDk5RDksIDB4OUFCNywgMHg5QUVFLCAweDlBRUYsIDB4OUIyNywKKyAgICAweDlCNDUsIDB4OUI0NCwgMHg5Qjc3LCAweDlCNkYsIDB4OUQwNiwgMHg5RDA5LCAweDlEMDMsIDB4OUVBOSwgMHg5RUJFLAorICAgIDB4OUVDRSwgMHg1OEE4LCAweDlGNTIsIDB4NTExMiwgMHg1MTE4LCAweDUxMTQsIDB4NTExMCwgMHg1MTE1LCAweDUxODAsCisgICAgMHg1MUFBLCAweDUxREQsIDB4NTI5MSwgMHg1MjkzLCAweDUyRjMsIDB4NTY1OSwgMHg1NjZCLCAweDU2NzksIDB4NTY2OSwKKyAgICAweDU2NjQsIDB4NTY3OCwgMHg1NjZBLCAweDU2NjgsIDB4NTY2NSwgMHg1NjcxLCAweDU2NkYsIDB4NTY2QywgMHg1NjYyLAorICAgIDB4NTY3NiwgMHg1OEMxLCAweDU4QkUsIDB4NThDNywgMHg1OEM1LCAweDU5NkUsIDB4NUIxRCwgMHg1QjM0LCAweDVCNzgsCisgICAgMHg1QkYwLCAweDVDMEUsIDB4NUY0QSwgMHg2MUIyLCAweDYxOTEsIDB4NjFBOSwgMHg2MThBLCAweDYxQ0QsIDB4NjFCNiwKKyAgICAweDYxQkUsIDB4NjFDQSwgMHg2MUM4LCAweDYyMzAsIDB4NjRDNSwgMHg2NEMxLCAweDY0Q0IsIDB4NjRCQiwgMHg2NEJDLAorICAgIDB4NjREQSwgMHg2NEM0LCAweDY0QzcsIDB4NjRDMiwgMHg2NENELCAweDY0QkYsIDB4NjREMiwgMHg2NEQ0LCAweDY0QkUsCisgICAgMHg2NTc0LCAweDY2QzYsIDB4NjZDOSwgMHg2NkI5LCAweDY2QzQsIDB4NjZDNywgMHg2NkI4LCAweDZBM0QsIDB4NkEzOCwKKyAgICAweDZBM0EsIDB4NkE1OSwgMHg2QTZCLCAweDZBNTgsIDB4NkEzOSwgMHg2QTQ0LCAweDZBNjIsIDB4NkE2MSwgMHg2QTRCLAorICAgIDB4NkE0NywgMHg2QTM1LCAweDZBNUYsIDB4NkE0OCwgMHg2QjU5LCAweDZCNzcsIDB4NkMwNSwgMHg2RkMyLCAweDZGQjEsCisgICAgMHg2RkExLCAweDZGQzMsIDB4NkZBNCwgMHg2RkMxLCAweDZGQTcsIDB4NkZCMywgMHg2RkMwLCAweDZGQjksIDB4NkZCNiwKKyAgICAweDZGQTYsIDB4NkZBMCwgMHg2RkI0LCAweDcxQkUsIDB4NzFDOSwgMHg3MUQwLCAweDcxRDIsIDB4NzFDOCwgMHg3MUQ1LAorICAgIDB4NzFCOSwgMHg3MUNFLCAweDcxRDksIDB4NzFEQywgMHg3MUMzLCAweDcxQzQsIDB4NzM2OCwgMHg3NDlDLCAweDc0QTMsCisgICAgMHg3NDk4LCAweDc0OUYsIDB4NzQ5RSwgMHg3NEUyLCAweDc1MEMsIDB4NzUwRCwgMHg3NjM0LCAweDc2MzgsIDB4NzYzQSwKKyAgICAweDc2RTcsIDB4NzZFNSwgMHg3N0EwLCAweDc3OUUsIDB4Nzc5RiwgMHg3N0E1LCAweDc4RTgsIDB4NzhEQSwgMHg3OEVDLAorICAgIDB4NzhFNywgMHg3OUE2LCAweDdBNEQsIDB4N0E0RSwgMHg3QTQ2LCAweDdBNEMsIDB4N0E0QiwgMHg3QUJBLCAweDdCRDksCisgICAgMHg3QzExLCAweDdCQzksIDB4N0JFNCwgMHg3QkRCLCAweDdCRTEsIDB4N0JFOSwgMHg3QkU2LCAweDdDRDUsIDB4N0NENiwKKyAgICAweDdFMEEsIDB4N0UxMSwgMHg3RTA4LCAweDdFMUIsIDB4N0UyMywgMHg3RTFFLCAweDdFMUQsIDB4N0UwOSwgMHg3RTEwLAorICAgIDB4N0Y3OSwgMHg3RkIyLCAweDdGRjAsIDB4N0ZGMSwgMHg3RkVFLCAweDgwMjgsIDB4ODFCMywgMHg4MUE5LCAweDgxQTgsCisgICAgMHg4MUZCLCAweDgyMDgsIDB4ODI1OCwgMHg4MjU5LCAweDg1NEEsIDB4ODU1OSwgMHg4NTQ4LCAweDg1NjgsIDB4ODU2OSwKKyAgICAweDg1NDMsIDB4ODU0OSwgMHg4NTZELCAweDg1NkEsIDB4ODU1RSwgMHg4NzgzLCAweDg3OUYsIDB4ODc5RSwgMHg4N0EyLAorICAgIDB4ODc4RCwgMHg4ODYxLCAweDg5MkEsIDB4ODkzMiwgMHg4OTI1LCAweDg5MkIsIDB4ODkyMSwgMHg4OUFBLCAweDg5QTYsCisgICAgMHg4QUU2LCAweDhBRkEsIDB4OEFFQiwgMHg4QUYxLCAweDhCMDAsIDB4OEFEQywgMHg4QUU3LCAweDhBRUUsIDB4OEFGRSwKKyAgICAweDhCMDEsIDB4OEIwMiwgMHg4QUY3LCAweDhBRUQsIDB4OEFGMywgMHg4QUY2LCAweDhBRkMsIDB4OEM2QiwgMHg4QzZELAorICAgIDB4OEM5MywgMHg4Q0Y0LCAweDhFNDQsIDB4OEUzMSwgMHg4RTM0LCAweDhFNDIsIDB4OEUzOSwgMHg4RTM1LCAweDhGM0IsCisgICAgMHg4RjJGLCAweDhGMzgsIDB4OEYzMywgMHg4RkE4LCAweDhGQTYsIDB4OTA3NSwgMHg5MDc0LCAweDkwNzgsIDB4OTA3MiwKKyAgICAweDkwN0MsIDB4OTA3QSwgMHg5MTM0LCAweDkxOTIsIDB4OTMyMCwgMHg5MzM2LCAweDkyRjgsIDB4OTMzMywgMHg5MzJGLAorICAgIDB4OTMyMiwgMHg5MkZDLCAweDkzMkIsIDB4OTMwNCwgMHg5MzFBLCAweDkzMTAsIDB4OTMyNiwgMHg5MzIxLCAweDkzMTUsCisgICAgMHg5MzJFLCAweDkzMTksIDB4OTVCQiwgMHg5NkE3LCAweDk2QTgsIDB4OTZBQSwgMHg5NkQ1LCAweDk3MEUsIDB4OTcxMSwKKyAgICAweDk3MTYsIDB4OTcwRCwgMHg5NzEzLCAweDk3MEYsIDB4OTc1QiwgMHg5NzVDLCAweDk3NjYsIDB4OTc5OCwgMHg5ODMwLAorICAgIDB4OTgzOCwgMHg5ODNCLCAweDk4MzcsIDB4OTgyRCwgMHg5ODM5LCAweDk4MjQsIDB4OTkxMCwgMHg5OTI4LCAweDk5MUUsCisgICAgMHg5OTFCLCAweDk5MjEsIDB4OTkxQSwgMHg5OUVELCAweDk5RTIsIDB4OTlGMSwgMHg5QUI4LCAweDlBQkMsIDB4OUFGQiwKKyAgICAweDlBRUQsIDB4OUIyOCwgMHg5QjkxLCAweDlEMTUsIDB4OUQyMywgMHg5RDI2LCAweDlEMjgsIDB4OUQxMiwgMHg5RDFCLAorICAgIDB4OUVEOCwgMHg5RUQ0LCAweDlGOEQsIDB4OUY5QywgMHg1MTJBLCAweDUxMUYsIDB4NTEyMSwgMHg1MTMyLCAweDUyRjUsCisgICAgMHg1NjhFLCAweDU2ODAsIDB4NTY5MCwgMHg1Njg1LCAweDU2ODcsIDB4NTY4RiwgMHg1OEQ1LCAweDU4RDMsIDB4NThEMSwKKyAgICAweDU4Q0UsIDB4NUIzMCwgMHg1QjJBLCAweDVCMjQsIDB4NUI3QSwgMHg1QzM3LCAweDVDNjgsIDB4NURCQywgMHg1REJBLAorICAgIDB4NURCRCwgMHg1REI4LCAweDVFNkIsIDB4NUY0QywgMHg1RkJELCAweDYxQzksIDB4NjFDMiwgMHg2MUM3LCAweDYxRTYsCisgICAgMHg2MUNCLCAweDYyMzIsIDB4NjIzNCwgMHg2NENFLCAweDY0Q0EsIDB4NjREOCwgMHg2NEUwLCAweDY0RjAsIDB4NjRFNiwKKyAgICAweDY0RUMsIDB4NjRGMSwgMHg2NEUyLCAweDY0RUQsIDB4NjU4MiwgMHg2NTgzLCAweDY2RDksIDB4NjZENiwgMHg2QTgwLAorICAgIDB4NkE5NCwgMHg2QTg0LCAweDZBQTIsIDB4NkE5QywgMHg2QURCLCAweDZBQTMsIDB4NkE3RSwgMHg2QTk3LCAweDZBOTAsCisgICAgMHg2QUEwLCAweDZCNUMsIDB4NkJBRSwgMHg2QkRBLCAweDZDMDgsIDB4NkZEOCwgMHg2RkYxLCAweDZGREYsIDB4NkZFMCwKKyAgICAweDZGREIsIDB4NkZFNCwgMHg2RkVCLCAweDZGRUYsIDB4NkY4MCwgMHg2RkVDLCAweDZGRTEsIDB4NkZFOSwgMHg2RkQ1LAorICAgIDB4NkZFRSwgMHg2RkYwLCAweDcxRTcsIDB4NzFERiwgMHg3MUVFLCAweDcxRTYsIDB4NzFFNSwgMHg3MUVELCAweDcxRUMsCisgICAgMHg3MUY0LCAweDcxRTAsIDB4NzIzNSwgMHg3MjQ2LCAweDczNzAsIDB4NzM3MiwgMHg3NEE5LCAweDc0QjAsIDB4NzRBNiwKKyAgICAweDc0QTgsIDB4NzY0NiwgMHg3NjQyLCAweDc2NEMsIDB4NzZFQSwgMHg3N0IzLCAweDc3QUEsIDB4NzdCMCwgMHg3N0FDLAorICAgIDB4NzdBNywgMHg3N0FELCAweDc3RUYsIDB4NzhGNywgMHg3OEZBLCAweDc4RjQsIDB4NzhFRiwgMHg3OTAxLCAweDc5QTcsCisgICAgMHg3OUFBLCAweDdBNTcsIDB4N0FCRiwgMHg3QzA3LCAweDdDMEQsIDB4N0JGRSwgMHg3QkY3LCAweDdDMEMsIDB4N0JFMCwKKyAgICAweDdDRTAsIDB4N0NEQywgMHg3Q0RFLCAweDdDRTIsIDB4N0NERiwgMHg3Q0Q5LCAweDdDREQsIDB4N0UyRSwgMHg3RTNFLAorICAgIDB4N0U0NiwgMHg3RTM3LCAweDdFMzIsIDB4N0U0MywgMHg3RTJCLCAweDdFM0QsIDB4N0UzMSwgMHg3RTQ1LCAweDdFNDEsCisgICAgMHg3RTM0LCAweDdFMzksIDB4N0U0OCwgMHg3RTM1LCAweDdFM0YsIDB4N0UyRiwgMHg3RjQ0LCAweDdGRjMsIDB4N0ZGQywKKyAgICAweDgwNzEsIDB4ODA3MiwgMHg4MDcwLCAweDgwNkYsIDB4ODA3MywgMHg4MUM2LCAweDgxQzMsIDB4ODFCQSwgMHg4MUMyLAorICAgIDB4ODFDMCwgMHg4MUJGLCAweDgxQkQsIDB4ODFDOSwgMHg4MUJFLCAweDgxRTgsIDB4ODIwOSwgMHg4MjcxLCAweDg1QUEsCisgICAgMHg4NTg0LCAweDg1N0UsIDB4ODU5QywgMHg4NTkxLCAweDg1OTQsIDB4ODVBRiwgMHg4NTlCLCAweDg1ODcsIDB4ODVBOCwKKyAgICAweDg1OEEsIDB4ODVBNiwgMHg4NjY3LCAweDg3QzAsIDB4ODdEMSwgMHg4N0IzLCAweDg3RDIsIDB4ODdDNiwgMHg4N0FCLAorICAgIDB4ODdCQiwgMHg4N0JBLCAweDg3QzgsIDB4ODdDQiwgMHg4OTNCLCAweDg5MzYsIDB4ODk0NCwgMHg4OTM4LCAweDg5M0QsCisgICAgMHg4OUFDLCAweDhCMEUsIDB4OEIxNywgMHg4QjE5LCAweDhCMUIsIDB4OEIwQSwgMHg4QjIwLCAweDhCMUQsIDB4OEIwNCwKKyAgICAweDhCMTAsIDB4OEM0MSwgMHg4QzNGLCAweDhDNzMsIDB4OENGQSwgMHg4Q0ZELCAweDhDRkMsIDB4OENGOCwgMHg4Q0ZCLAorICAgIDB4OERBOCwgMHg4RTQ5LCAweDhFNEIsIDB4OEU0OCwgMHg4RTRBLCAweDhGNDQsIDB4OEYzRSwgMHg4RjQyLCAweDhGNDUsCisgICAgMHg4RjNGLCAweDkwN0YsIDB4OTA3RCwgMHg5MDg0LCAweDkwODEsIDB4OTA4MiwgMHg5MDgwLCAweDkxMzksIDB4OTFBMywKKyAgICAweDkxOUUsIDB4OTE5QywgMHg5MzRELCAweDkzODIsIDB4OTMyOCwgMHg5Mzc1LCAweDkzNEEsIDB4OTM2NSwgMHg5MzRCLAorICAgIDB4OTMxOCwgMHg5MzdFLCAweDkzNkMsIDB4OTM1QiwgMHg5MzcwLCAweDkzNUEsIDB4OTM1NCwgMHg5NUNBLCAweDk1Q0IsCisgICAgMHg5NUNDLCAweDk1QzgsIDB4OTVDNiwgMHg5NkIxLCAweDk2QjgsIDB4OTZENiwgMHg5NzFDLCAweDk3MUUsIDB4OTdBMCwKKyAgICAweDk3RDMsIDB4OTg0NiwgMHg5OEI2LCAweDk5MzUsIDB4OUEwMSwgMHg5OUZGLCAweDlCQUUsIDB4OUJBQiwgMHg5QkFBLAorICAgIDB4OUJBRCwgMHg5RDNCLCAweDlEM0YsIDB4OUU4QiwgMHg5RUNGLCAweDlFREUsIDB4OUVEQywgMHg5RURELCAweDlFREIsCisgICAgMHg5RjNFLCAweDlGNEIsIDB4NTNFMiwgMHg1Njk1LCAweDU2QUUsIDB4NThEOSwgMHg1OEQ4LCAweDVCMzgsIDB4NUY1RCwKKyAgICAweDYxRTMsIDB4NjIzMywgMHg2NEY0LCAweDY0RjIsIDB4NjRGRSwgMHg2NTA2LCAweDY0RkEsIDB4NjRGQiwgMHg2NEY3LAorICAgIDB4NjVCNywgMHg2NkRDLCAweDY3MjYsIDB4NkFCMywgMHg2QUFDLCAweDZBQzMsIDB4NkFCQiwgMHg2QUI4LCAweDZBQzIsCisgICAgMHg2QUFFLCAweDZBQUYsIDB4NkI1RiwgMHg2Qjc4LCAweDZCQUYsIDB4NzAwOSwgMHg3MDBCLCAweDZGRkUsIDB4NzAwNiwKKyAgICAweDZGRkEsIDB4NzAxMSwgMHg3MDBGLCAweDcxRkIsIDB4NzFGQywgMHg3MUZFLCAweDcxRjgsIDB4NzM3NywgMHg3Mzc1LAorICAgIDB4NzRBNywgMHg3NEJGLCAweDc1MTUsIDB4NzY1NiwgMHg3NjU4LCAweDc2NTIsIDB4NzdCRCwgMHg3N0JGLCAweDc3QkIsCisgICAgMHg3N0JDLCAweDc5MEUsIDB4NzlBRSwgMHg3QTYxLCAweDdBNjIsIDB4N0E2MCwgMHg3QUM0LCAweDdBQzUsIDB4N0MyQiwKKyAgICAweDdDMjcsIDB4N0MyQSwgMHg3QzFFLCAweDdDMjMsIDB4N0MyMSwgMHg3Q0U3LCAweDdFNTQsIDB4N0U1NSwgMHg3RTVFLAorICAgIDB4N0U1QSwgMHg3RTYxLCAweDdFNTIsIDB4N0U1OSwgMHg3RjQ4LCAweDdGRjksIDB4N0ZGQiwgMHg4MDc3LCAweDgwNzYsCisgICAgMHg4MUNELCAweDgxQ0YsIDB4ODIwQSwgMHg4NUNGLCAweDg1QTksIDB4ODVDRCwgMHg4NUQwLCAweDg1QzksIDB4ODVCMCwKKyAgICAweDg1QkEsIDB4ODVCOSwgMHg4N0VGLCAweDg3RUMsIDB4ODdGMiwgMHg4N0UwLCAweDg5ODYsIDB4ODlCMiwgMHg4OUY0LAorICAgIDB4OEIyOCwgMHg4QjM5LCAweDhCMkMsIDB4OEIyQiwgMHg4QzUwLCAweDhEMDUsIDB4OEU1OSwgMHg4RTYzLCAweDhFNjYsCisgICAgMHg4RTY0LCAweDhFNUYsIDB4OEU1NSwgMHg4RUMwLCAweDhGNDksIDB4OEY0RCwgMHg5MDg3LCAweDkwODMsIDB4OTA4OCwKKyAgICAweDkxQUIsIDB4OTFBQywgMHg5MUQwLCAweDkzOTQsIDB4OTM4QSwgMHg5Mzk2LCAweDkzQTIsIDB4OTNCMywgMHg5M0FFLAorICAgIDB4OTNBQywgMHg5M0IwLCAweDkzOTgsIDB4OTM5QSwgMHg5Mzk3LCAweDk1RDQsIDB4OTVENiwgMHg5NUQwLCAweDk1RDUsCisgICAgMHg5NkUyLCAweDk2REMsIDB4OTZEOSwgMHg5NkRCLCAweDk2REUsIDB4OTcyNCwgMHg5N0EzLCAweDk3QTYsIDB4OTdBRCwKKyAgICAweDk3RjksIDB4OTg0RCwgMHg5ODRGLCAweDk4NEMsIDB4OTg0RSwgMHg5ODUzLCAweDk4QkEsIDB4OTkzRSwgMHg5OTNGLAorICAgIDB4OTkzRCwgMHg5OTJFLCAweDk5QTUsIDB4OUEwRSwgMHg5QUMxLCAweDlCMDMsIDB4OUIwNiwgMHg5QjRGLCAweDlCNEUsCisgICAgMHg5QjRELCAweDlCQ0EsIDB4OUJDOSwgMHg5QkZELCAweDlCQzgsIDB4OUJDMCwgMHg5RDUxLCAweDlENUQsIDB4OUQ2MCwKKyAgICAweDlFRTAsIDB4OUYxNSwgMHg5RjJDLCAweDUxMzMsIDB4NTZBNSwgMHg1NkE4LCAweDU4REUsIDB4NThERiwgMHg1OEUyLAorICAgIDB4NUJGNSwgMHg5RjkwLCAweDVFRUMsIDB4NjFGMiwgMHg2MUY3LCAweDYxRjYsIDB4NjFGNSwgMHg2NTAwLCAweDY1MEYsCisgICAgMHg2NkUwLCAweDY2REQsIDB4NkFFNSwgMHg2QURELCAweDZBREEsIDB4NkFEMywgMHg3MDFCLCAweDcwMUYsIDB4NzAyOCwKKyAgICAweDcwMUEsIDB4NzAxRCwgMHg3MDE1LCAweDcwMTgsIDB4NzIwNiwgMHg3MjBELCAweDcyNTgsIDB4NzJBMiwgMHg3Mzc4LAorICAgIDB4NzM3QSwgMHg3NEJELCAweDc0Q0EsIDB4NzRFMywgMHg3NTg3LCAweDc1ODYsIDB4NzY1RiwgMHg3NjYxLCAweDc3QzcsCisgICAgMHg3OTE5LCAweDc5QjEsIDB4N0E2QiwgMHg3QTY5LCAweDdDM0UsIDB4N0MzRiwgMHg3QzM4LCAweDdDM0QsIDB4N0MzNywKKyAgICAweDdDNDAsIDB4N0U2QiwgMHg3RTZELCAweDdFNzksIDB4N0U2OSwgMHg3RTZBLCAweDdFNzMsIDB4N0Y4NSwgMHg3RkI2LAorICAgIDB4N0ZCOSwgMHg3RkI4LCAweDgxRDgsIDB4ODVFOSwgMHg4NURELCAweDg1RUEsIDB4ODVENSwgMHg4NUU0LCAweDg1RTUsCisgICAgMHg4NUY3LCAweDg3RkIsIDB4ODgwNSwgMHg4ODBELCAweDg3RjksIDB4ODdGRSwgMHg4OTYwLCAweDg5NUYsIDB4ODk1NiwKKyAgICAweDg5NUUsIDB4OEI0MSwgMHg4QjVDLCAweDhCNTgsIDB4OEI0OSwgMHg4QjVBLCAweDhCNEUsIDB4OEI0RiwgMHg4QjQ2LAorICAgIDB4OEI1OSwgMHg4RDA4LCAweDhEMEEsIDB4OEU3QywgMHg4RTcyLCAweDhFODcsIDB4OEU3NiwgMHg4RTZDLCAweDhFN0EsCisgICAgMHg4RTc0LCAweDhGNTQsIDB4OEY0RSwgMHg4RkFELCAweDkwOEEsIDB4OTA4QiwgMHg5MUIxLCAweDkxQUUsIDB4OTNFMSwKKyAgICAweDkzRDEsIDB4OTNERiwgMHg5M0MzLCAweDkzQzgsIDB4OTNEQywgMHg5M0RELCAweDkzRDYsIDB4OTNFMiwgMHg5M0NELAorICAgIDB4OTNEOCwgMHg5M0U0LCAweDkzRDcsIDB4OTNFOCwgMHg5NURDLCAweDk2QjQsIDB4OTZFMywgMHg5NzJBLCAweDk3MjcsCisgICAgMHg5NzYxLCAweDk3REMsIDB4OTdGQiwgMHg5ODVFLCAweDk4NTgsIDB4OTg1QiwgMHg5OEJDLCAweDk5NDUsIDB4OTk0OSwKKyAgICAweDlBMTYsIDB4OUExOSwgMHg5QjBELCAweDlCRTgsIDB4OUJFNywgMHg5QkQ2LCAweDlCREIsIDB4OUQ4OSwgMHg5RDYxLAorICAgIDB4OUQ3MiwgMHg5RDZBLCAweDlENkMsIDB4OUU5MiwgMHg5RTk3LCAweDlFOTMsIDB4OUVCNCwgMHg1MkY4LCAweDU2QjcsCisgICAgMHg1NkI2LCAweDU2QjQsIDB4NTZCQywgMHg1OEU0LCAweDVCNDAsIDB4NUI0MywgMHg1QjdELCAweDVCRjYsIDB4NURDOSwKKyAgICAweDYxRjgsIDB4NjFGQSwgMHg2NTE4LCAweDY1MTQsIDB4NjUxOSwgMHg2NkU2LCAweDY3MjcsIDB4NkFFQywgMHg3MDNFLAorICAgIDB4NzAzMCwgMHg3MDMyLCAweDcyMTAsIDB4NzM3QiwgMHg3NENGLCAweDc2NjIsIDB4NzY2NSwgMHg3OTI2LCAweDc5MkEsCisgICAgMHg3OTJDLCAweDc5MkIsIDB4N0FDNywgMHg3QUY2LCAweDdDNEMsIDB4N0M0MywgMHg3QzRELCAweDdDRUYsIDB4N0NGMCwKKyAgICAweDhGQUUsIDB4N0U3RCwgMHg3RTdDLCAweDdFODIsIDB4N0Y0QywgMHg4MDAwLCAweDgxREEsIDB4ODI2NiwgMHg4NUZCLAorICAgIDB4ODVGOSwgMHg4NjExLCAweDg1RkEsIDB4ODYwNiwgMHg4NjBCLCAweDg2MDcsIDB4ODYwQSwgMHg4ODE0LCAweDg4MTUsCisgICAgMHg4OTY0LCAweDg5QkEsIDB4ODlGOCwgMHg4QjcwLCAweDhCNkMsIDB4OEI2NiwgMHg4QjZGLCAweDhCNUYsIDB4OEI2QiwKKyAgICAweDhEMEYsIDB4OEQwRCwgMHg4RTg5LCAweDhFODEsIDB4OEU4NSwgMHg4RTgyLCAweDkxQjQsIDB4OTFDQiwgMHg5NDE4LAorICAgIDB4OTQwMywgMHg5M0ZELCAweDk1RTEsIDB4OTczMCwgMHg5OEM0LCAweDk5NTIsIDB4OTk1MSwgMHg5OUE4LCAweDlBMkIsCisgICAgMHg5QTMwLCAweDlBMzcsIDB4OUEzNSwgMHg5QzEzLCAweDlDMEQsIDB4OUU3OSwgMHg5RUI1LCAweDlFRTgsIDB4OUYyRiwKKyAgICAweDlGNUYsIDB4OUY2MywgMHg5RjYxLCAweDUxMzcsIDB4NTEzOCwgMHg1NkMxLCAweDU2QzAsIDB4NTZDMiwgMHg1OTE0LAorICAgIDB4NUM2QywgMHg1RENELCAweDYxRkMsIDB4NjFGRSwgMHg2NTFELCAweDY1MUMsIDB4NjU5NSwgMHg2NkU5LCAweDZBRkIsCisgICAgMHg2QjA0LCAweDZBRkEsIDB4NkJCMiwgMHg3MDRDLCAweDcyMUIsIDB4NzJBNywgMHg3NEQ2LCAweDc0RDQsIDB4NzY2OSwKKyAgICAweDc3RDMsIDB4N0M1MCwgMHg3RThGLCAweDdFOEMsIDB4N0ZCQywgMHg4NjE3LCAweDg2MkQsIDB4ODYxQSwgMHg4ODIzLAorICAgIDB4ODgyMiwgMHg4ODIxLCAweDg4MUYsIDB4ODk2QSwgMHg4OTZDLCAweDg5QkQsIDB4OEI3NCwgMHg4Qjc3LCAweDhCN0QsCisgICAgMHg4RDEzLCAweDhFOEEsIDB4OEU4RCwgMHg4RThCLCAweDhGNUYsIDB4OEZBRiwgMHg5MUJBLCAweDk0MkUsIDB4OTQzMywKKyAgICAweDk0MzUsIDB4OTQzQSwgMHg5NDM4LCAweDk0MzIsIDB4OTQyQiwgMHg5NUUyLCAweDk3MzgsIDB4OTczOSwgMHg5NzMyLAorICAgIDB4OTdGRiwgMHg5ODY3LCAweDk4NjUsIDB4OTk1NywgMHg5QTQ1LCAweDlBNDMsIDB4OUE0MCwgMHg5QTNFLCAweDlBQ0YsCisgICAgMHg5QjU0LCAweDlCNTEsIDB4OUMyRCwgMHg5QzI1LCAweDlEQUYsIDB4OURCNCwgMHg5REMyLCAweDlEQjgsIDB4OUU5RCwKKyAgICAweDlFRUYsIDB4OUYxOSwgMHg5RjVDLCAweDlGNjYsIDB4OUY2NywgMHg1MTNDLCAweDUxM0IsIDB4NTZDOCwgMHg1NkNBLAorICAgIDB4NTZDOSwgMHg1QjdGLCAweDVERDQsIDB4NUREMiwgMHg1RjRFLCAweDYxRkYsIDB4NjUyNCwgMHg2QjBBLCAweDZCNjEsCisgICAgMHg3MDUxLCAweDcwNTgsIDB4NzM4MCwgMHg3NEU0LCAweDc1OEEsIDB4NzY2RSwgMHg3NjZDLCAweDc5QjMsIDB4N0M2MCwKKyAgICAweDdDNUYsIDB4ODA3RSwgMHg4MDdELCAweDgxREYsIDB4ODk3MiwgMHg4OTZGLCAweDg5RkMsIDB4OEI4MCwgMHg4RDE2LAorICAgIDB4OEQxNywgMHg4RTkxLCAweDhFOTMsIDB4OEY2MSwgMHg5MTQ4LCAweDk0NDQsIDB4OTQ1MSwgMHg5NDUyLCAweDk3M0QsCisgICAgMHg5NzNFLCAweDk3QzMsIDB4OTdDMSwgMHg5ODZCLCAweDk5NTUsIDB4OUE1NSwgMHg5QTRELCAweDlBRDIsIDB4OUIxQSwKKyAgICAweDlDNDksIDB4OUMzMSwgMHg5QzNFLCAweDlDM0IsIDB4OUREMywgMHg5REQ3LCAweDlGMzQsIDB4OUY2QywgMHg5RjZBLAorICAgIDB4OUY5NCwgMHg1NkNDLCAweDVERDYsIDB4NjIwMCwgMHg2NTIzLCAweDY1MkIsIDB4NjUyQSwgMHg2NkVDLCAweDZCMTAsCisgICAgMHg3NERBLCAweDdBQ0EsIDB4N0M2NCwgMHg3QzYzLCAweDdDNjUsIDB4N0U5MywgMHg3RTk2LCAweDdFOTQsIDB4ODFFMiwKKyAgICAweDg2MzgsIDB4ODYzRiwgMHg4ODMxLCAweDhCOEEsIDB4OTA5MCwgMHg5MDhGLCAweDk0NjMsIDB4OTQ2MCwgMHg5NDY0LAorICAgIDB4OTc2OCwgMHg5ODZGLCAweDk5NUMsIDB4OUE1QSwgMHg5QTVCLCAweDlBNTcsIDB4OUFEMywgMHg5QUQ0LCAweDlBRDEsCisgICAgMHg5QzU0LCAweDlDNTcsIDB4OUM1NiwgMHg5REU1LCAweDlFOUYsIDB4OUVGNCwgMHg1NkQxLCAweDU4RTksIDB4NjUyQywKKyAgICAweDcwNUUsIDB4NzY3MSwgMHg3NjcyLCAweDc3RDcsIDB4N0Y1MCwgMHg3Rjg4LCAweDg4MzYsIDB4ODgzOSwgMHg4ODYyLAorICAgIDB4OEI5MywgMHg4QjkyLCAweDhCOTYsIDB4ODI3NywgMHg4RDFCLCAweDkxQzAsIDB4OTQ2QSwgMHg5NzQyLCAweDk3NDgsCisgICAgMHg5NzQ0LCAweDk3QzYsIDB4OTg3MCwgMHg5QTVGLCAweDlCMjIsIDB4OUI1OCwgMHg5QzVGLCAweDlERjksIDB4OURGQSwKKyAgICAweDlFN0MsIDB4OUU3RCwgMHg5RjA3LCAweDlGNzcsIDB4OUY3MiwgMHg1RUYzLCAweDZCMTYsIDB4NzA2MywgMHg3QzZDLAorICAgIDB4N0M2RSwgMHg4ODNCLCAweDg5QzAsIDB4OEVBMSwgMHg5MUMxLCAweDk0NzIsIDB4OTQ3MCwgMHg5ODcxLCAweDk5NUUsCisgICAgMHg5QUQ2LCAweDlCMjMsIDB4OUVDQywgMHg3MDY0LCAweDc3REEsIDB4OEI5QSwgMHg5NDc3LCAweDk3QzksIDB4OUE2MiwKKyAgICAweDlBNjUsIDB4N0U5QywgMHg4QjlDLCAweDhFQUEsIDB4OTFDNSwgMHg5NDdELCAweDk0N0UsIDB4OTQ3QywgMHg5Qzc3LAorICAgIDB4OUM3OCwgMHg5RUY3LCAweDhDNTQsIDB4OTQ3RiwgMHg5RTFBLCAweDcyMjgsIDB4OUE2QSwgMHg5QjMxLCAweDlFMUIsCisgICAgMHg5RTFFLCAweDdDNzIsIDB4NEU0MiwgMHg0RTVDLCAweDUxRjUsIDB4NTMxQSwgMHg1MzgyLCAweDRFMDcsIDB4NEUwQywKKyAgICAweDRFNDcsIDB4NEU4RCwgMHg1NkQ3LCAweDVDNkUsIDB4NUY3MywgMHg0RTBGLCAweDUxODcsIDB4NEUwRSwgMHg0RTJFLAorICAgIDB4NEU5MywgMHg0RUMyLCAweDRFQzksIDB4NEVDOCwgMHg1MTk4LCAweDUyRkMsIDB4NTM2QywgMHg1M0I5LCAweDU3MjAsCisgICAgMHg1OTAzLCAweDU5MkMsIDB4NUMxMCwgMHg1REZGLCAweDY1RTEsIDB4NkJCMywgMHg2QkNDLCAweDZDMTQsIDB4NzIzRiwKKyAgICAweDRFMzEsIDB4NEUzQywgMHg0RUU4LCAweDRFREMsIDB4NEVFOSwgMHg0RUUxLCAweDRFREQsIDB4NEVEQSwgMHg1MjBDLAorICAgIDB4NTIwOSwgMHg1MzFDLCAweDUzNEMsIDB4NTcyMiwgMHg1NzIzLCAweDU5MTcsIDB4NTkyRiwgMHg1QjgxLCAweDVCODQsCisgICAgMHg1QzEyLCAweDVDM0IsIDB4NUM3NCwgMHg1QzczLCAweDVFMDQsIDB4NUU4MCwgMHg1RTgyLCAweDVGQzksIDB4NjIwOSwKKyAgICAweDYyNTAsIDB4NkMxNSwgMHg2QzM2LCAweDZDNDMsIDB4NkMzRiwgMHg2QzNCLCAweDcyQUUsIDB4NzJCMCwgMHg3MzhBLAorICAgIDB4NzlCOCwgMHg4MDhBLCAweDk2MUUsIDB4NEYwRSwgMHg0RjE4LCAweDRGMkMsIDB4NEVGNSwgMHg0RjE0LCAweDRFRjEsCisgICAgMHg0RjAwLCAweDRFRjcsIDB4NEYwOCwgMHg0RjFELCAweDRGMDIsIDB4NEYwNSwgMHg0RjIyLCAweDRGMTMsIDB4NEYwNCwKKyAgICAweDRFRjQsIDB4NEYxMiwgMHg1MUIxLCAweDUyMTMsIDB4NTIxMCwgMHg1MkE2LCAweDUzMjIsIDB4NTMxRiwgMHg1MzRELAorICAgIDB4NTM4QSwgMHg1NDA3LCAweDU2RTEsIDB4NTZERiwgMHg1NzJFLCAweDU3MkEsIDB4NTczNCwgMHg1OTNDLCAweDU5ODAsCisgICAgMHg1OTdDLCAweDU5ODUsIDB4NTk3QiwgMHg1OTdFLCAweDU5NzcsIDB4NTk3RiwgMHg1QjU2LCAweDVDMTUsIDB4NUMyNSwKKyAgICAweDVDN0MsIDB4NUM3QSwgMHg1QzdCLCAweDVDN0UsIDB4NURERiwgMHg1RTc1LCAweDVFODQsIDB4NUYwMiwgMHg1RjFBLAorICAgIDB4NUY3NCwgMHg1RkQ1LCAweDVGRDQsIDB4NUZDRiwgMHg2MjVDLCAweDYyNUUsIDB4NjI2NCwgMHg2MjYxLCAweDYyNjYsCisgICAgMHg2MjYyLCAweDYyNTksIDB4NjI2MCwgMHg2MjVBLCAweDYyNjUsIDB4NjUzNywgMHg2NUVGLCAweDY1RUUsIDB4NjczRSwKKyAgICAweDY3MzksIDB4NjczOCwgMHg2NzNCLCAweDY3M0EsIDB4NjczRiwgMHg2NzNDLCAweDY3MzMsIDB4NkMxOCwgMHg2QzQ2LAorICAgIDB4NkM1MiwgMHg2QzVDLCAweDZDNEYsIDB4NkM0QSwgMHg2QzU0LCAweDZDNEIsIDB4NkM0QywgMHg3MDcxLCAweDcyNUUsCisgICAgMHg3MkI0LCAweDcyQjUsIDB4NzM4RSwgMHg3NTJBLCAweDc2N0YsIDB4N0E3NSwgMHg3RjUxLCAweDgyNzgsIDB4ODI3QywKKyAgICAweDgyODAsIDB4ODI3RCwgMHg4MjdGLCAweDg2NEQsIDB4ODk3RSwgMHg5MDk5LCAweDkwOTcsIDB4OTA5OCwgMHg5MDlCLAorICAgIDB4OTA5NCwgMHg5NjIyLCAweDk2MjQsIDB4OTYyMCwgMHg5NjIzLCAweDRGNTYsIDB4NEYzQiwgMHg0RjYyLCAweDRGNDksCisgICAgMHg0RjUzLCAweDRGNjQsIDB4NEYzRSwgMHg0RjY3LCAweDRGNTIsIDB4NEY1RiwgMHg0RjQxLCAweDRGNTgsIDB4NEYyRCwKKyAgICAweDRGMzMsIDB4NEYzRiwgMHg0RjYxLCAweDUxOEYsIDB4NTFCOSwgMHg1MjFDLCAweDUyMUUsIDB4NTIyMSwgMHg1MkFELAorICAgIDB4NTJBRSwgMHg1MzA5LCAweDUzNjMsIDB4NTM3MiwgMHg1MzhFLCAweDUzOEYsIDB4NTQzMCwgMHg1NDM3LCAweDU0MkEsCisgICAgMHg1NDU0LCAweDU0NDUsIDB4NTQxOSwgMHg1NDFDLCAweDU0MjUsIDB4NTQxOCwgMHg1NDNELCAweDU0NEYsIDB4NTQ0MSwKKyAgICAweDU0MjgsIDB4NTQyNCwgMHg1NDQ3LCAweDU2RUUsIDB4NTZFNywgMHg1NkU1LCAweDU3NDEsIDB4NTc0NSwgMHg1NzRDLAorICAgIDB4NTc0OSwgMHg1NzRCLCAweDU3NTIsIDB4NTkwNiwgMHg1OTQwLCAweDU5QTYsIDB4NTk5OCwgMHg1OUEwLCAweDU5OTcsCisgICAgMHg1OThFLCAweDU5QTIsIDB4NTk5MCwgMHg1OThGLCAweDU5QTcsIDB4NTlBMSwgMHg1QjhFLCAweDVCOTIsIDB4NUMyOCwKKyAgICAweDVDMkEsIDB4NUM4RCwgMHg1QzhGLCAweDVDODgsIDB4NUM4QiwgMHg1Qzg5LCAweDVDOTIsIDB4NUM4QSwgMHg1Qzg2LAorICAgIDB4NUM5MywgMHg1Qzk1LCAweDVERTAsIDB4NUUwQSwgMHg1RTBFLCAweDVFOEIsIDB4NUU4OSwgMHg1RThDLCAweDVFODgsCisgICAgMHg1RThELCAweDVGMDUsIDB4NUYxRCwgMHg1Rjc4LCAweDVGNzYsIDB4NUZEMiwgMHg1RkQxLCAweDVGRDAsIDB4NUZFRCwKKyAgICAweDVGRTgsIDB4NUZFRSwgMHg1RkYzLCAweDVGRTEsIDB4NUZFNCwgMHg1RkUzLCAweDVGRkEsIDB4NUZFRiwgMHg1RkY3LAorICAgIDB4NUZGQiwgMHg2MDAwLCAweDVGRjQsIDB4NjIzQSwgMHg2MjgzLCAweDYyOEMsIDB4NjI4RSwgMHg2MjhGLCAweDYyOTQsCisgICAgMHg2Mjg3LCAweDYyNzEsIDB4NjI3QiwgMHg2MjdBLCAweDYyNzAsIDB4NjI4MSwgMHg2Mjg4LCAweDYyNzcsIDB4NjI3RCwKKyAgICAweDYyNzIsIDB4NjI3NCwgMHg2NUYwLCAweDY1RjQsIDB4NjVGMywgMHg2NUYyLCAweDY1RjUsIDB4Njc0NSwgMHg2NzQ3LAorICAgIDB4Njc1OSwgMHg2NzU1LCAweDY3NEMsIDB4Njc0OCwgMHg2NzVELCAweDY3NEQsIDB4Njc1QSwgMHg2NzRCLCAweDZCRDAsCisgICAgMHg2QzE5LCAweDZDMUEsIDB4NkM3OCwgMHg2QzY3LCAweDZDNkIsIDB4NkM4NCwgMHg2QzhCLCAweDZDOEYsIDB4NkM3MSwKKyAgICAweDZDNkYsIDB4NkM2OSwgMHg2QzlBLCAweDZDNkQsIDB4NkM4NywgMHg2Qzk1LCAweDZDOUMsIDB4NkM2NiwgMHg2QzczLAorICAgIDB4NkM2NSwgMHg2QzdCLCAweDZDOEUsIDB4NzA3NCwgMHg3MDdBLCAweDcyNjMsIDB4NzJCRiwgMHg3MkJELCAweDcyQzMsCisgICAgMHg3MkM2LCAweDcyQzEsIDB4NzJCQSwgMHg3MkM1LCAweDczOTUsIDB4NzM5NywgMHg3MzkzLCAweDczOTQsIDB4NzM5MiwKKyAgICAweDc1M0EsIDB4NzUzOSwgMHg3NTk0LCAweDc1OTUsIDB4NzY4MSwgMHg3OTNELCAweDgwMzQsIDB4ODA5NSwgMHg4MDk5LAorICAgIDB4ODA5MCwgMHg4MDkyLCAweDgwOUMsIDB4ODI5MCwgMHg4MjhGLCAweDgyODUsIDB4ODI4RSwgMHg4MjkxLCAweDgyOTMsCisgICAgMHg4MjhBLCAweDgyODMsIDB4ODI4NCwgMHg4Qzc4LCAweDhGQzksIDB4OEZCRiwgMHg5MDlGLCAweDkwQTEsIDB4OTBBNSwKKyAgICAweDkwOUUsIDB4OTBBNywgMHg5MEEwLCAweDk2MzAsIDB4OTYyOCwgMHg5NjJGLCAweDk2MkQsIDB4NEUzMywgMHg0Rjk4LAorICAgIDB4NEY3QywgMHg0Rjg1LCAweDRGN0QsIDB4NEY4MCwgMHg0Rjg3LCAweDRGNzYsIDB4NEY3NCwgMHg0Rjg5LCAweDRGODQsCisgICAgMHg0Rjc3LCAweDRGNEMsIDB4NEY5NywgMHg0RjZBLCAweDRGOUEsIDB4NEY3OSwgMHg0RjgxLCAweDRGNzgsIDB4NEY5MCwKKyAgICAweDRGOUMsIDB4NEY5NCwgMHg0RjlFLCAweDRGOTIsIDB4NEY4MiwgMHg0Rjk1LCAweDRGNkIsIDB4NEY2RSwgMHg1MTlFLAorICAgIDB4NTFCQywgMHg1MUJFLCAweDUyMzUsIDB4NTIzMiwgMHg1MjMzLCAweDUyNDYsIDB4NTIzMSwgMHg1MkJDLCAweDUzMEEsCisgICAgMHg1MzBCLCAweDUzM0MsIDB4NTM5MiwgMHg1Mzk0LCAweDU0ODcsIDB4NTQ3RiwgMHg1NDgxLCAweDU0OTEsIDB4NTQ4MiwKKyAgICAweDU0ODgsIDB4NTQ2QiwgMHg1NDdBLCAweDU0N0UsIDB4NTQ2NSwgMHg1NDZDLCAweDU0NzQsIDB4NTQ2NiwgMHg1NDhELAorICAgIDB4NTQ2RiwgMHg1NDYxLCAweDU0NjAsIDB4NTQ5OCwgMHg1NDYzLCAweDU0NjcsIDB4NTQ2NCwgMHg1NkY3LCAweDU2RjksCisgICAgMHg1NzZGLCAweDU3NzIsIDB4NTc2RCwgMHg1NzZCLCAweDU3NzEsIDB4NTc3MCwgMHg1Nzc2LCAweDU3ODAsIDB4NTc3NSwKKyAgICAweDU3N0IsIDB4NTc3MywgMHg1Nzc0LCAweDU3NjIsIDB4NTc2OCwgMHg1NzdELCAweDU5MEMsIDB4NTk0NSwgMHg1OUI1LAorICAgIDB4NTlCQSwgMHg1OUNGLCAweDU5Q0UsIDB4NTlCMiwgMHg1OUNDLCAweDU5QzEsIDB4NTlCNiwgMHg1OUJDLCAweDU5QzMsCisgICAgMHg1OUQ2LCAweDU5QjEsIDB4NTlCRCwgMHg1OUMwLCAweDU5QzgsIDB4NTlCNCwgMHg1OUM3LCAweDVCNjIsIDB4NUI2NSwKKyAgICAweDVCOTMsIDB4NUI5NSwgMHg1QzQ0LCAweDVDNDcsIDB4NUNBRSwgMHg1Q0E0LCAweDVDQTAsIDB4NUNCNSwgMHg1Q0FGLAorICAgIDB4NUNBOCwgMHg1Q0FDLCAweDVDOUYsIDB4NUNBMywgMHg1Q0FELCAweDVDQTIsIDB4NUNBQSwgMHg1Q0E3LCAweDVDOUQsCisgICAgMHg1Q0E1LCAweDVDQjYsIDB4NUNCMCwgMHg1Q0E2LCAweDVFMTcsIDB4NUUxNCwgMHg1RTE5LCAweDVGMjgsIDB4NUYyMiwKKyAgICAweDVGMjMsIDB4NUYyNCwgMHg1RjU0LCAweDVGODIsIDB4NUY3RSwgMHg1RjdELCAweDVGREUsIDB4NUZFNSwgMHg2MDJELAorICAgIDB4NjAyNiwgMHg2MDE5LCAweDYwMzIsIDB4NjAwQiwgMHg2MDM0LCAweDYwMEEsIDB4NjAxNywgMHg2MDMzLCAweDYwMUEsCisgICAgMHg2MDFFLCAweDYwMkMsIDB4NjAyMiwgMHg2MDBELCAweDYwMTAsIDB4NjAyRSwgMHg2MDEzLCAweDYwMTEsIDB4NjAwQywKKyAgICAweDYwMDksIDB4NjAxQywgMHg2MjE0LCAweDYyM0QsIDB4NjJBRCwgMHg2MkI0LCAweDYyRDEsIDB4NjJCRSwgMHg2MkFBLAorICAgIDB4NjJCNiwgMHg2MkNBLCAweDYyQUUsIDB4NjJCMywgMHg2MkFGLCAweDYyQkIsIDB4NjJBOSwgMHg2MkIwLCAweDYyQjgsCisgICAgMHg2NTNELCAweDY1QTgsIDB4NjVCQiwgMHg2NjA5LCAweDY1RkMsIDB4NjYwNCwgMHg2NjEyLCAweDY2MDgsIDB4NjVGQiwKKyAgICAweDY2MDMsIDB4NjYwQiwgMHg2NjBELCAweDY2MDUsIDB4NjVGRCwgMHg2NjExLCAweDY2MTAsIDB4NjZGNiwgMHg2NzBBLAorICAgIDB4Njc4NSwgMHg2NzZDLCAweDY3OEUsIDB4Njc5MiwgMHg2Nzc2LCAweDY3N0IsIDB4Njc5OCwgMHg2Nzg2LCAweDY3ODQsCisgICAgMHg2Nzc0LCAweDY3OEQsIDB4Njc4QywgMHg2NzdBLCAweDY3OUYsIDB4Njc5MSwgMHg2Nzk5LCAweDY3ODMsIDB4Njc3RCwKKyAgICAweDY3ODEsIDB4Njc3OCwgMHg2Nzc5LCAweDY3OTQsIDB4NkIyNSwgMHg2QjgwLCAweDZCN0UsIDB4NkJERSwgMHg2QzFELAorICAgIDB4NkM5MywgMHg2Q0VDLCAweDZDRUIsIDB4NkNFRSwgMHg2Q0Q5LCAweDZDQjYsIDB4NkNENCwgMHg2Q0FELCAweDZDRTcsCisgICAgMHg2Q0I3LCAweDZDRDAsIDB4NkNDMiwgMHg2Q0JBLCAweDZDQzMsIDB4NkNDNiwgMHg2Q0VELCAweDZDRjIsIDB4NkNEMiwKKyAgICAweDZDREQsIDB4NkNCNCwgMHg2QzhBLCAweDZDOUQsIDB4NkM4MCwgMHg2Q0RFLCAweDZDQzAsIDB4NkQzMCwgMHg2Q0NELAorICAgIDB4NkNDNywgMHg2Q0IwLCAweDZDRjksIDB4NkNDRiwgMHg2Q0U5LCAweDZDRDEsIDB4NzA5NCwgMHg3MDk4LCAweDcwODUsCisgICAgMHg3MDkzLCAweDcwODYsIDB4NzA4NCwgMHg3MDkxLCAweDcwOTYsIDB4NzA4MiwgMHg3MDlBLCAweDcwODMsIDB4NzI2QSwKKyAgICAweDcyRDYsIDB4NzJDQiwgMHg3MkQ4LCAweDcyQzksIDB4NzJEQywgMHg3MkQyLCAweDcyRDQsIDB4NzJEQSwgMHg3MkNDLAorICAgIDB4NzJEMSwgMHg3M0E0LCAweDczQTEsIDB4NzNBRCwgMHg3M0E2LCAweDczQTIsIDB4NzNBMCwgMHg3M0FDLCAweDczOUQsCisgICAgMHg3NERELCAweDc0RTgsIDB4NzUzRiwgMHg3NTQwLCAweDc1M0UsIDB4NzU4QywgMHg3NTk4LCAweDc2QUYsIDB4NzZGMywKKyAgICAweDc2RjEsIDB4NzZGMCwgMHg3NkY1LCAweDc3RjgsIDB4NzdGQywgMHg3N0Y5LCAweDc3RkIsIDB4NzdGQSwgMHg3N0Y3LAorICAgIDB4Nzk0MiwgMHg3OTNGLCAweDc5QzUsIDB4N0E3OCwgMHg3QTdCLCAweDdBRkIsIDB4N0M3NSwgMHg3Q0ZELCAweDgwMzUsCisgICAgMHg4MDhGLCAweDgwQUUsIDB4ODBBMywgMHg4MEI4LCAweDgwQjUsIDB4ODBBRCwgMHg4MjIwLCAweDgyQTAsIDB4ODJDMCwKKyAgICAweDgyQUIsIDB4ODI5QSwgMHg4Mjk4LCAweDgyOUIsIDB4ODJCNSwgMHg4MkE3LCAweDgyQUUsIDB4ODJCQywgMHg4MjlFLAorICAgIDB4ODJCQSwgMHg4MkI0LCAweDgyQTgsIDB4ODJBMSwgMHg4MkE5LCAweDgyQzIsIDB4ODJBNCwgMHg4MkMzLCAweDgyQjYsCisgICAgMHg4MkEyLCAweDg2NzAsIDB4ODY2RiwgMHg4NjZELCAweDg2NkUsIDB4OEM1NiwgMHg4RkQyLCAweDhGQ0IsIDB4OEZEMywKKyAgICAweDhGQ0QsIDB4OEZENiwgMHg4RkQ1LCAweDhGRDcsIDB4OTBCMiwgMHg5MEI0LCAweDkwQUYsIDB4OTBCMywgMHg5MEIwLAorICAgIDB4OTYzOSwgMHg5NjNELCAweDk2M0MsIDB4OTYzQSwgMHg5NjQzLCAweDRGQ0QsIDB4NEZDNSwgMHg0RkQzLCAweDRGQjIsCisgICAgMHg0RkM5LCAweDRGQ0IsIDB4NEZDMSwgMHg0RkQ0LCAweDRGREMsIDB4NEZEOSwgMHg0RkJCLCAweDRGQjMsIDB4NEZEQiwKKyAgICAweDRGQzcsIDB4NEZENiwgMHg0RkJBLCAweDRGQzAsIDB4NEZCOSwgMHg0RkVDLCAweDUyNDQsIDB4NTI0OSwgMHg1MkMwLAorICAgIDB4NTJDMiwgMHg1MzNELCAweDUzN0MsIDB4NTM5NywgMHg1Mzk2LCAweDUzOTksIDB4NTM5OCwgMHg1NEJBLCAweDU0QTEsCisgICAgMHg1NEFELCAweDU0QTUsIDB4NTRDRiwgMHg1NEMzLCAweDgzMEQsIDB4NTRCNywgMHg1NEFFLCAweDU0RDYsIDB4NTRCNiwKKyAgICAweDU0QzUsIDB4NTRDNiwgMHg1NEEwLCAweDU0NzAsIDB4NTRCQywgMHg1NEEyLCAweDU0QkUsIDB4NTQ3MiwgMHg1NERFLAorICAgIDB4NTRCMCwgMHg1N0I1LCAweDU3OUUsIDB4NTc5RiwgMHg1N0E0LCAweDU3OEMsIDB4NTc5NywgMHg1NzlELCAweDU3OUIsCisgICAgMHg1Nzk0LCAweDU3OTgsIDB4NTc4RiwgMHg1Nzk5LCAweDU3QTUsIDB4NTc5QSwgMHg1Nzk1LCAweDU4RjQsIDB4NTkwRCwKKyAgICAweDU5NTMsIDB4NTlFMSwgMHg1OURFLCAweDU5RUUsIDB4NUEwMCwgMHg1OUYxLCAweDU5REQsIDB4NTlGQSwgMHg1OUZELAorICAgIDB4NTlGQywgMHg1OUY2LCAweDU5RTQsIDB4NTlGMiwgMHg1OUY3LCAweDU5REIsIDB4NTlFOSwgMHg1OUYzLCAweDU5RjUsCisgICAgMHg1OUUwLCAweDU5RkUsIDB4NTlGNCwgMHg1OUVELCAweDVCQTgsIDB4NUM0QywgMHg1Q0QwLCAweDVDRDgsIDB4NUNDQywKKyAgICAweDVDRDcsIDB4NUNDQiwgMHg1Q0RCLCAweDVDREUsIDB4NUNEQSwgMHg1Q0M5LCAweDVDQzcsIDB4NUNDQSwgMHg1Q0Q2LAorICAgIDB4NUNEMywgMHg1Q0Q0LCAweDVDQ0YsIDB4NUNDOCwgMHg1Q0M2LCAweDVDQ0UsIDB4NUNERiwgMHg1Q0Y4LCAweDVERjksCisgICAgMHg1RTIxLCAweDVFMjIsIDB4NUUyMywgMHg1RTIwLCAweDVFMjQsIDB4NUVCMCwgMHg1RUE0LCAweDVFQTIsIDB4NUU5QiwKKyAgICAweDVFQTMsIDB4NUVBNSwgMHg1RjA3LCAweDVGMkUsIDB4NUY1NiwgMHg1Rjg2LCAweDYwMzcsIDB4NjAzOSwgMHg2MDU0LAorICAgIDB4NjA3MiwgMHg2MDVFLCAweDYwNDUsIDB4NjA1MywgMHg2MDQ3LCAweDYwNDksIDB4NjA1QiwgMHg2MDRDLCAweDYwNDAsCisgICAgMHg2MDQyLCAweDYwNUYsIDB4NjAyNCwgMHg2MDQ0LCAweDYwNTgsIDB4NjA2NiwgMHg2MDZFLCAweDYyNDIsIDB4NjI0MywKKyAgICAweDYyQ0YsIDB4NjMwRCwgMHg2MzBCLCAweDYyRjUsIDB4NjMwRSwgMHg2MzAzLCAweDYyRUIsIDB4NjJGOSwgMHg2MzBGLAorICAgIDB4NjMwQywgMHg2MkY4LCAweDYyRjYsIDB4NjMwMCwgMHg2MzEzLCAweDYzMTQsIDB4NjJGQSwgMHg2MzE1LCAweDYyRkIsCisgICAgMHg2MkYwLCAweDY1NDEsIDB4NjU0MywgMHg2NUFBLCAweDY1QkYsIDB4NjYzNiwgMHg2NjIxLCAweDY2MzIsIDB4NjYzNSwKKyAgICAweDY2MUMsIDB4NjYyNiwgMHg2NjIyLCAweDY2MzMsIDB4NjYyQiwgMHg2NjNBLCAweDY2MUQsIDB4NjYzNCwgMHg2NjM5LAorICAgIDB4NjYyRSwgMHg2NzBGLCAweDY3MTAsIDB4NjdDMSwgMHg2N0YyLCAweDY3QzgsIDB4NjdCQSwgMHg2N0RDLCAweDY3QkIsCisgICAgMHg2N0Y4LCAweDY3RDgsIDB4NjdDMCwgMHg2N0I3LCAweDY3QzUsIDB4NjdFQiwgMHg2N0U0LCAweDY3REYsIDB4NjdCNSwKKyAgICAweDY3Q0QsIDB4NjdCMywgMHg2N0Y3LCAweDY3RjYsIDB4NjdFRSwgMHg2N0UzLCAweDY3QzIsIDB4NjdCOSwgMHg2N0NFLAorICAgIDB4NjdFNywgMHg2N0YwLCAweDY3QjIsIDB4NjdGQywgMHg2N0M2LCAweDY3RUQsIDB4NjdDQywgMHg2N0FFLCAweDY3RTYsCisgICAgMHg2N0RCLCAweDY3RkEsIDB4NjdDOSwgMHg2N0NBLCAweDY3QzMsIDB4NjdFQSwgMHg2N0NCLCAweDZCMjgsIDB4NkI4MiwKKyAgICAweDZCODQsIDB4NkJCNiwgMHg2QkQ2LCAweDZCRDgsIDB4NkJFMCwgMHg2QzIwLCAweDZDMjEsIDB4NkQyOCwgMHg2RDM0LAorICAgIDB4NkQyRCwgMHg2RDFGLCAweDZEM0MsIDB4NkQzRiwgMHg2RDEyLCAweDZEMEEsIDB4NkNEQSwgMHg2RDMzLCAweDZEMDQsCisgICAgMHg2RDE5LCAweDZEM0EsIDB4NkQxQSwgMHg2RDExLCAweDZEMDAsIDB4NkQxRCwgMHg2RDQyLCAweDZEMDEsIDB4NkQxOCwKKyAgICAweDZEMzcsIDB4NkQwMywgMHg2RDBGLCAweDZENDAsIDB4NkQwNywgMHg2RDIwLCAweDZEMkMsIDB4NkQwOCwgMHg2RDIyLAorICAgIDB4NkQwOSwgMHg2RDEwLCAweDcwQjcsIDB4NzA5RiwgMHg3MEJFLCAweDcwQjEsIDB4NzBCMCwgMHg3MEExLCAweDcwQjQsCisgICAgMHg3MEI1LCAweDcwQTksIDB4NzI0MSwgMHg3MjQ5LCAweDcyNEEsIDB4NzI2QywgMHg3MjcwLCAweDcyNzMsIDB4NzI2RSwKKyAgICAweDcyQ0EsIDB4NzJFNCwgMHg3MkU4LCAweDcyRUIsIDB4NzJERiwgMHg3MkVBLCAweDcyRTYsIDB4NzJFMywgMHg3Mzg1LAorICAgIDB4NzNDQywgMHg3M0MyLCAweDczQzgsIDB4NzNDNSwgMHg3M0I5LCAweDczQjYsIDB4NzNCNSwgMHg3M0I0LCAweDczRUIsCisgICAgMHg3M0JGLCAweDczQzcsIDB4NzNCRSwgMHg3M0MzLCAweDczQzYsIDB4NzNCOCwgMHg3M0NCLCAweDc0RUMsIDB4NzRFRSwKKyAgICAweDc1MkUsIDB4NzU0NywgMHg3NTQ4LCAweDc1QTcsIDB4NzVBQSwgMHg3Njc5LCAweDc2QzQsIDB4NzcwOCwgMHg3NzAzLAorICAgIDB4NzcwNCwgMHg3NzA1LCAweDc3MEEsIDB4NzZGNywgMHg3NkZCLCAweDc2RkEsIDB4NzdFNywgMHg3N0U4LCAweDc4MDYsCisgICAgMHg3ODExLCAweDc4MTIsIDB4NzgwNSwgMHg3ODEwLCAweDc4MEYsIDB4NzgwRSwgMHg3ODA5LCAweDc4MDMsIDB4NzgxMywKKyAgICAweDc5NEEsIDB4Nzk0QywgMHg3OTRCLCAweDc5NDUsIDB4Nzk0NCwgMHg3OUQ1LCAweDc5Q0QsIDB4NzlDRiwgMHg3OUQ2LAorICAgIDB4NzlDRSwgMHg3QTgwLCAweDdBN0UsIDB4N0FEMSwgMHg3QjAwLCAweDdCMDEsIDB4N0M3QSwgMHg3Qzc4LCAweDdDNzksCisgICAgMHg3QzdGLCAweDdDODAsIDB4N0M4MSwgMHg3RDAzLCAweDdEMDgsIDB4N0QwMSwgMHg3RjU4LCAweDdGOTEsIDB4N0Y4RCwKKyAgICAweDdGQkUsIDB4ODAwNywgMHg4MDBFLCAweDgwMEYsIDB4ODAxNCwgMHg4MDM3LCAweDgwRDgsIDB4ODBDNywgMHg4MEUwLAorICAgIDB4ODBEMSwgMHg4MEM4LCAweDgwQzIsIDB4ODBEMCwgMHg4MEM1LCAweDgwRTMsIDB4ODBEOSwgMHg4MERDLCAweDgwQ0EsCisgICAgMHg4MEQ1LCAweDgwQzksIDB4ODBDRiwgMHg4MEQ3LCAweDgwRTYsIDB4ODBDRCwgMHg4MUZGLCAweDgyMjEsIDB4ODI5NCwKKyAgICAweDgyRDksIDB4ODJGRSwgMHg4MkY5LCAweDgzMDcsIDB4ODJFOCwgMHg4MzAwLCAweDgyRDUsIDB4ODMzQSwgMHg4MkVCLAorICAgIDB4ODJENiwgMHg4MkY0LCAweDgyRUMsIDB4ODJFMSwgMHg4MkYyLCAweDgyRjUsIDB4ODMwQywgMHg4MkZCLCAweDgyRjYsCisgICAgMHg4MkYwLCAweDgyRUEsIDB4ODJFNCwgMHg4MkUwLCAweDgyRkEsIDB4ODJGMywgMHg4MkVELCAweDg2NzcsIDB4ODY3NCwKKyAgICAweDg2N0MsIDB4ODY3MywgMHg4ODQxLCAweDg4NEUsIDB4ODg2NywgMHg4ODZBLCAweDg4NjksIDB4ODlEMywgMHg4QTA0LAorICAgIDB4OEEwNywgMHg4RDcyLCAweDhGRTMsIDB4OEZFMSwgMHg4RkVFLCAweDhGRTAsIDB4OTBGMSwgMHg5MEJELCAweDkwQkYsCisgICAgMHg5MEQ1LCAweDkwQzUsIDB4OTBCRSwgMHg5MEM3LCAweDkwQ0IsIDB4OTBDOCwgMHg5MUQ0LCAweDkxRDMsIDB4OTY1NCwKKyAgICAweDk2NEYsIDB4OTY1MSwgMHg5NjUzLCAweDk2NEEsIDB4OTY0RSwgMHg1MDFFLCAweDUwMDUsIDB4NTAwNywgMHg1MDEzLAorICAgIDB4NTAyMiwgMHg1MDMwLCAweDUwMUIsIDB4NEZGNSwgMHg0RkY0LCAweDUwMzMsIDB4NTAzNywgMHg1MDJDLCAweDRGRjYsCisgICAgMHg0RkY3LCAweDUwMTcsIDB4NTAxQywgMHg1MDIwLCAweDUwMjcsIDB4NTAzNSwgMHg1MDJGLCAweDUwMzEsIDB4NTAwRSwKKyAgICAweDUxNUEsIDB4NTE5NCwgMHg1MTkzLCAweDUxQ0EsIDB4NTFDNCwgMHg1MUM1LCAweDUxQzgsIDB4NTFDRSwgMHg1MjYxLAorICAgIDB4NTI1QSwgMHg1MjUyLCAweDUyNUUsIDB4NTI1RiwgMHg1MjU1LCAweDUyNjIsIDB4NTJDRCwgMHg1MzBFLCAweDUzOUUsCisgICAgMHg1NTI2LCAweDU0RTIsIDB4NTUxNywgMHg1NTEyLCAweDU0RTcsIDB4NTRGMywgMHg1NEU0LCAweDU1MUEsIDB4NTRGRiwKKyAgICAweDU1MDQsIDB4NTUwOCwgMHg1NEVCLCAweDU1MTEsIDB4NTUwNSwgMHg1NEYxLCAweDU1MEEsIDB4NTRGQiwgMHg1NEY3LAorICAgIDB4NTRGOCwgMHg1NEUwLCAweDU1MEUsIDB4NTUwMywgMHg1NTBCLCAweDU3MDEsIDB4NTcwMiwgMHg1N0NDLCAweDU4MzIsCisgICAgMHg1N0Q1LCAweDU3RDIsIDB4NTdCQSwgMHg1N0M2LCAweDU3QkQsIDB4NTdCQywgMHg1N0I4LCAweDU3QjYsIDB4NTdCRiwKKyAgICAweDU3QzcsIDB4NTdEMCwgMHg1N0I5LCAweDU3QzEsIDB4NTkwRSwgMHg1OTRBLCAweDVBMTksIDB4NUExNiwgMHg1QTJELAorICAgIDB4NUEyRSwgMHg1QTE1LCAweDVBMEYsIDB4NUExNywgMHg1QTBBLCAweDVBMUUsIDB4NUEzMywgMHg1QjZDLCAweDVCQTcsCisgICAgMHg1QkFELCAweDVCQUMsIDB4NUMwMywgMHg1QzU2LCAweDVDNTQsIDB4NUNFQywgMHg1Q0ZGLCAweDVDRUUsIDB4NUNGMSwKKyAgICAweDVDRjcsIDB4NUQwMCwgMHg1Q0Y5LCAweDVFMjksIDB4NUUyOCwgMHg1RUE4LCAweDVFQUUsIDB4NUVBQSwgMHg1RUFDLAorICAgIDB4NUYzMywgMHg1RjMwLCAweDVGNjcsIDB4NjA1RCwgMHg2MDVBLCAweDYwNjcsIDB4NjA0MSwgMHg2MEEyLCAweDYwODgsCisgICAgMHg2MDgwLCAweDYwOTIsIDB4NjA4MSwgMHg2MDlELCAweDYwODMsIDB4NjA5NSwgMHg2MDlCLCAweDYwOTcsIDB4NjA4NywKKyAgICAweDYwOUMsIDB4NjA4RSwgMHg2MjE5LCAweDYyNDYsIDB4NjJGMiwgMHg2MzEwLCAweDYzNTYsIDB4NjMyQywgMHg2MzQ0LAorICAgIDB4NjM0NSwgMHg2MzM2LCAweDYzNDMsIDB4NjNFNCwgMHg2MzM5LCAweDYzNEIsIDB4NjM0QSwgMHg2MzNDLCAweDYzMjksCisgICAgMHg2MzQxLCAweDYzMzQsIDB4NjM1OCwgMHg2MzU0LCAweDYzNTksIDB4NjMyRCwgMHg2MzQ3LCAweDYzMzMsIDB4NjM1QSwKKyAgICAweDYzNTEsIDB4NjMzOCwgMHg2MzU3LCAweDYzNDAsIDB4NjM0OCwgMHg2NTRBLCAweDY1NDYsIDB4NjVDNiwgMHg2NUMzLAorICAgIDB4NjVDNCwgMHg2NUMyLCAweDY2NEEsIDB4NjY1RiwgMHg2NjQ3LCAweDY2NTEsIDB4NjcxMiwgMHg2NzEzLCAweDY4MUYsCisgICAgMHg2ODFBLCAweDY4NDksIDB4NjgzMiwgMHg2ODMzLCAweDY4M0IsIDB4Njg0QiwgMHg2ODRGLCAweDY4MTYsIDB4NjgzMSwKKyAgICAweDY4MUMsIDB4NjgzNSwgMHg2ODJCLCAweDY4MkQsIDB4NjgyRiwgMHg2ODRFLCAweDY4NDQsIDB4NjgzNCwgMHg2ODFELAorICAgIDB4NjgxMiwgMHg2ODE0LCAweDY4MjYsIDB4NjgyOCwgMHg2ODJFLCAweDY4NEQsIDB4NjgzQSwgMHg2ODI1LCAweDY4MjAsCisgICAgMHg2QjJDLCAweDZCMkYsIDB4NkIyRCwgMHg2QjMxLCAweDZCMzQsIDB4NkI2RCwgMHg4MDgyLCAweDZCODgsIDB4NkJFNiwKKyAgICAweDZCRTQsIDB4NkJFOCwgMHg2QkUzLCAweDZCRTIsIDB4NkJFNywgMHg2QzI1LCAweDZEN0EsIDB4NkQ2MywgMHg2RDY0LAorICAgIDB4NkQ3NiwgMHg2RDBELCAweDZENjEsIDB4NkQ5MiwgMHg2RDU4LCAweDZENjIsIDB4NkQ2RCwgMHg2RDZGLCAweDZEOTEsCisgICAgMHg2RDhELCAweDZERUYsIDB4NkQ3RiwgMHg2RDg2LCAweDZENUUsIDB4NkQ2NywgMHg2RDYwLCAweDZEOTcsIDB4NkQ3MCwKKyAgICAweDZEN0MsIDB4NkQ1RiwgMHg2RDgyLCAweDZEOTgsIDB4NkQyRiwgMHg2RDY4LCAweDZEOEIsIDB4NkQ3RSwgMHg2RDgwLAorICAgIDB4NkQ4NCwgMHg2RDE2LCAweDZEODMsIDB4NkQ3QiwgMHg2RDdELCAweDZENzUsIDB4NkQ5MCwgMHg3MERDLCAweDcwRDMsCisgICAgMHg3MEQxLCAweDcwREQsIDB4NzBDQiwgMHg3RjM5LCAweDcwRTIsIDB4NzBENywgMHg3MEQyLCAweDcwREUsIDB4NzBFMCwKKyAgICAweDcwRDQsIDB4NzBDRCwgMHg3MEM1LCAweDcwQzYsIDB4NzBDNywgMHg3MERBLCAweDcwQ0UsIDB4NzBFMSwgMHg3MjQyLAorICAgIDB4NzI3OCwgMHg3Mjc3LCAweDcyNzYsIDB4NzMwMCwgMHg3MkZBLCAweDcyRjQsIDB4NzJGRSwgMHg3MkY2LCAweDcyRjMsCisgICAgMHg3MkZCLCAweDczMDEsIDB4NzNEMywgMHg3M0Q5LCAweDczRTUsIDB4NzNENiwgMHg3M0JDLCAweDczRTcsIDB4NzNFMywKKyAgICAweDczRTksIDB4NzNEQywgMHg3M0QyLCAweDczREIsIDB4NzNENCwgMHg3M0RELCAweDczREEsIDB4NzNENywgMHg3M0Q4LAorICAgIDB4NzNFOCwgMHg3NERFLCAweDc0REYsIDB4NzRGNCwgMHg3NEY1LCAweDc1MjEsIDB4NzU1QiwgMHg3NTVGLCAweDc1QjAsCisgICAgMHg3NUMxLCAweDc1QkIsIDB4NzVDNCwgMHg3NUMwLCAweDc1QkYsIDB4NzVCNiwgMHg3NUJBLCAweDc2OEEsIDB4NzZDOSwKKyAgICAweDc3MUQsIDB4NzcxQiwgMHg3NzEwLCAweDc3MTMsIDB4NzcxMiwgMHg3NzIzLCAweDc3MTEsIDB4NzcxNSwgMHg3NzE5LAorICAgIDB4NzcxQSwgMHg3NzIyLCAweDc3MjcsIDB4NzgyMywgMHg3ODJDLCAweDc4MjIsIDB4NzgzNSwgMHg3ODJGLCAweDc4MjgsCisgICAgMHg3ODJFLCAweDc4MkIsIDB4NzgyMSwgMHg3ODI5LCAweDc4MzMsIDB4NzgyQSwgMHg3ODMxLCAweDc5NTQsIDB4Nzk1QiwKKyAgICAweDc5NEYsIDB4Nzk1QywgMHg3OTUzLCAweDc5NTIsIDB4Nzk1MSwgMHg3OUVCLCAweDc5RUMsIDB4NzlFMCwgMHg3OUVFLAorICAgIDB4NzlFRCwgMHg3OUVBLCAweDc5REMsIDB4NzlERSwgMHg3OURELCAweDdBODYsIDB4N0E4OSwgMHg3QTg1LCAweDdBOEIsCisgICAgMHg3QThDLCAweDdBOEEsIDB4N0E4NywgMHg3QUQ4LCAweDdCMTAsIDB4N0IwNCwgMHg3QjEzLCAweDdCMDUsIDB4N0IwRiwKKyAgICAweDdCMDgsIDB4N0IwQSwgMHg3QjBFLCAweDdCMDksIDB4N0IxMiwgMHg3Qzg0LCAweDdDOTEsIDB4N0M4QSwgMHg3QzhDLAorICAgIDB4N0M4OCwgMHg3QzhELCAweDdDODUsIDB4N0QxRSwgMHg3RDFELCAweDdEMTEsIDB4N0QwRSwgMHg3RDE4LCAweDdEMTYsCisgICAgMHg3RDEzLCAweDdEMUYsIDB4N0QxMiwgMHg3RDBGLCAweDdEMEMsIDB4N0Y1QywgMHg3RjYxLCAweDdGNUUsIDB4N0Y2MCwKKyAgICAweDdGNUQsIDB4N0Y1QiwgMHg3Rjk2LCAweDdGOTIsIDB4N0ZDMywgMHg3RkMyLCAweDdGQzAsIDB4ODAxNiwgMHg4MDNFLAorICAgIDB4ODAzOSwgMHg4MEZBLCAweDgwRjIsIDB4ODBGOSwgMHg4MEY1LCAweDgxMDEsIDB4ODBGQiwgMHg4MTAwLCAweDgyMDEsCisgICAgMHg4MjJGLCAweDgyMjUsIDB4ODMzMywgMHg4MzJELCAweDgzNDQsIDB4ODMxOSwgMHg4MzUxLCAweDgzMjUsIDB4ODM1NiwKKyAgICAweDgzM0YsIDB4ODM0MSwgMHg4MzI2LCAweDgzMUMsIDB4ODMyMiwgMHg4MzQyLCAweDgzNEUsIDB4ODMxQiwgMHg4MzJBLAorICAgIDB4ODMwOCwgMHg4MzNDLCAweDgzNEQsIDB4ODMxNiwgMHg4MzI0LCAweDgzMjAsIDB4ODMzNywgMHg4MzJGLCAweDgzMjksCisgICAgMHg4MzQ3LCAweDgzNDUsIDB4ODM0QywgMHg4MzUzLCAweDgzMUUsIDB4ODMyQywgMHg4MzRCLCAweDgzMjcsIDB4ODM0OCwKKyAgICAweDg2NTMsIDB4ODY1MiwgMHg4NkEyLCAweDg2QTgsIDB4ODY5NiwgMHg4NjhELCAweDg2OTEsIDB4ODY5RSwgMHg4Njg3LAorICAgIDB4ODY5NywgMHg4Njg2LCAweDg2OEIsIDB4ODY5QSwgMHg4Njg1LCAweDg2QTUsIDB4ODY5OSwgMHg4NkExLCAweDg2QTcsCisgICAgMHg4Njk1LCAweDg2OTgsIDB4ODY4RSwgMHg4NjlELCAweDg2OTAsIDB4ODY5NCwgMHg4ODQzLCAweDg4NDQsIDB4ODg2RCwKKyAgICAweDg4NzUsIDB4ODg3NiwgMHg4ODcyLCAweDg4ODAsIDB4ODg3MSwgMHg4ODdGLCAweDg4NkYsIDB4ODg4MywgMHg4ODdFLAorICAgIDB4ODg3NCwgMHg4ODdDLCAweDhBMTIsIDB4OEM0NywgMHg4QzU3LCAweDhDN0IsIDB4OENBNCwgMHg4Q0EzLCAweDhENzYsCisgICAgMHg4RDc4LCAweDhEQjUsIDB4OERCNywgMHg4REI2LCAweDhFRDEsIDB4OEVEMywgMHg4RkZFLCAweDhGRjUsIDB4OTAwMiwKKyAgICAweDhGRkYsIDB4OEZGQiwgMHg5MDA0LCAweDhGRkMsIDB4OEZGNiwgMHg5MEQ2LCAweDkwRTAsIDB4OTBEOSwgMHg5MERBLAorICAgIDB4OTBFMywgMHg5MERGLCAweDkwRTUsIDB4OTBEOCwgMHg5MERCLCAweDkwRDcsIDB4OTBEQywgMHg5MEU0LCAweDkxNTAsCisgICAgMHg5MTRFLCAweDkxNEYsIDB4OTFENSwgMHg5MUUyLCAweDkxREEsIDB4OTY1QywgMHg5NjVGLCAweDk2QkMsIDB4OThFMywKKyAgICAweDlBREYsIDB4OUIyRiwgMHg0RTdGLCAweDUwNzAsIDB4NTA2QSwgMHg1MDYxLCAweDUwNUUsIDB4NTA2MCwgMHg1MDUzLAorICAgIDB4NTA0QiwgMHg1MDVELCAweDUwNzIsIDB4NTA0OCwgMHg1MDRELCAweDUwNDEsIDB4NTA1QiwgMHg1MDRBLCAweDUwNjIsCisgICAgMHg1MDE1LCAweDUwNDUsIDB4NTA1RiwgMHg1MDY5LCAweDUwNkIsIDB4NTA2MywgMHg1MDY0LCAweDUwNDYsIDB4NTA0MCwKKyAgICAweDUwNkUsIDB4NTA3MywgMHg1MDU3LCAweDUwNTEsIDB4NTFEMCwgMHg1MjZCLCAweDUyNkQsIDB4NTI2QywgMHg1MjZFLAorICAgIDB4NTJENiwgMHg1MkQzLCAweDUzMkQsIDB4NTM5QywgMHg1NTc1LCAweDU1NzYsIDB4NTUzQywgMHg1NTRELCAweDU1NTAsCisgICAgMHg1NTM0LCAweDU1MkEsIDB4NTU1MSwgMHg1NTYyLCAweDU1MzYsIDB4NTUzNSwgMHg1NTMwLCAweDU1NTIsIDB4NTU0NSwKKyAgICAweDU1MEMsIDB4NTUzMiwgMHg1NTY1LCAweDU1NEUsIDB4NTUzOSwgMHg1NTQ4LCAweDU1MkQsIDB4NTUzQiwgMHg1NTQwLAorICAgIDB4NTU0QiwgMHg1NzBBLCAweDU3MDcsIDB4NTdGQiwgMHg1ODE0LCAweDU3RTIsIDB4NTdGNiwgMHg1N0RDLCAweDU3RjQsCisgICAgMHg1ODAwLCAweDU3RUQsIDB4NTdGRCwgMHg1ODA4LCAweDU3RjgsIDB4NTgwQiwgMHg1N0YzLCAweDU3Q0YsIDB4NTgwNywKKyAgICAweDU3RUUsIDB4NTdFMywgMHg1N0YyLCAweDU3RTUsIDB4NTdFQywgMHg1N0UxLCAweDU4MEUsIDB4NTdGQywgMHg1ODEwLAorICAgIDB4NTdFNywgMHg1ODAxLCAweDU4MEMsIDB4NTdGMSwgMHg1N0U5LCAweDU3RjAsIDB4NTgwRCwgMHg1ODA0LCAweDU5NUMsCisgICAgMHg1QTYwLCAweDVBNTgsIDB4NUE1NSwgMHg1QTY3LCAweDVBNUUsIDB4NUEzOCwgMHg1QTM1LCAweDVBNkQsIDB4NUE1MCwKKyAgICAweDVBNUYsIDB4NUE2NSwgMHg1QTZDLCAweDVBNTMsIDB4NUE2NCwgMHg1QTU3LCAweDVBNDMsIDB4NUE1RCwgMHg1QTUyLAorICAgIDB4NUE0NCwgMHg1QTVCLCAweDVBNDgsIDB4NUE4RSwgMHg1QTNFLCAweDVBNEQsIDB4NUEzOSwgMHg1QTRDLCAweDVBNzAsCisgICAgMHg1QTY5LCAweDVBNDcsIDB4NUE1MSwgMHg1QTU2LCAweDVBNDIsIDB4NUE1QywgMHg1QjcyLCAweDVCNkUsIDB4NUJDMSwKKyAgICAweDVCQzAsIDB4NUM1OSwgMHg1RDFFLCAweDVEMEIsIDB4NUQxRCwgMHg1RDFBLCAweDVEMjAsIDB4NUQwQywgMHg1RDI4LAorICAgIDB4NUQwRCwgMHg1RDI2LCAweDVEMjUsIDB4NUQwRiwgMHg1RDMwLCAweDVEMTIsIDB4NUQyMywgMHg1RDFGLCAweDVEMkUsCisgICAgMHg1RTNFLCAweDVFMzQsIDB4NUVCMSwgMHg1RUI0LCAweDVFQjksIDB4NUVCMiwgMHg1RUIzLCAweDVGMzYsIDB4NUYzOCwKKyAgICAweDVGOUIsIDB4NUY5NiwgMHg1RjlGLCAweDYwOEEsIDB4NjA5MCwgMHg2MDg2LCAweDYwQkUsIDB4NjBCMCwgMHg2MEJBLAorICAgIDB4NjBEMywgMHg2MEQ0LCAweDYwQ0YsIDB4NjBFNCwgMHg2MEQ5LCAweDYwREQsIDB4NjBDOCwgMHg2MEIxLCAweDYwREIsCisgICAgMHg2MEI3LCAweDYwQ0EsIDB4NjBCRiwgMHg2MEMzLCAweDYwQ0QsIDB4NjBDMCwgMHg2MzMyLCAweDYzNjUsIDB4NjM4QSwKKyAgICAweDYzODIsIDB4NjM3RCwgMHg2M0JELCAweDYzOUUsIDB4NjNBRCwgMHg2MzlELCAweDYzOTcsIDB4NjNBQiwgMHg2MzhFLAorICAgIDB4NjM2RiwgMHg2Mzg3LCAweDYzOTAsIDB4NjM2RSwgMHg2M0FGLCAweDYzNzUsIDB4NjM5QywgMHg2MzZELCAweDYzQUUsCisgICAgMHg2MzdDLCAweDYzQTQsIDB4NjMzQiwgMHg2MzlGLCAweDYzNzgsIDB4NjM4NSwgMHg2MzgxLCAweDYzOTEsIDB4NjM4RCwKKyAgICAweDYzNzAsIDB4NjU1MywgMHg2NUNELCAweDY2NjUsIDB4NjY2MSwgMHg2NjVCLCAweDY2NTksIDB4NjY1QywgMHg2NjYyLAorICAgIDB4NjcxOCwgMHg2ODc5LCAweDY4ODcsIDB4Njg5MCwgMHg2ODlDLCAweDY4NkQsIDB4Njg2RSwgMHg2OEFFLCAweDY4QUIsCisgICAgMHg2OTU2LCAweDY4NkYsIDB4NjhBMywgMHg2OEFDLCAweDY4QTksIDB4Njg3NSwgMHg2ODc0LCAweDY4QjIsIDB4Njg4RiwKKyAgICAweDY4NzcsIDB4Njg5MiwgMHg2ODdDLCAweDY4NkIsIDB4Njg3MiwgMHg2OEFBLCAweDY4ODAsIDB4Njg3MSwgMHg2ODdFLAorICAgIDB4Njg5QiwgMHg2ODk2LCAweDY4OEIsIDB4NjhBMCwgMHg2ODg5LCAweDY4QTQsIDB4Njg3OCwgMHg2ODdCLCAweDY4OTEsCisgICAgMHg2ODhDLCAweDY4OEEsIDB4Njg3RCwgMHg2QjM2LCAweDZCMzMsIDB4NkIzNywgMHg2QjM4LCAweDZCOTEsIDB4NkI4RiwKKyAgICAweDZCOEQsIDB4NkI4RSwgMHg2QjhDLCAweDZDMkEsIDB4NkRDMCwgMHg2REFCLCAweDZEQjQsIDB4NkRCMywgMHg2RTc0LAorICAgIDB4NkRBQywgMHg2REU5LCAweDZERTIsIDB4NkRCNywgMHg2REY2LCAweDZERDQsIDB4NkUwMCwgMHg2REM4LCAweDZERTAsCisgICAgMHg2RERGLCAweDZERDYsIDB4NkRCRSwgMHg2REU1LCAweDZEREMsIDB4NkRERCwgMHg2RERCLCAweDZERjQsIDB4NkRDQSwKKyAgICAweDZEQkQsIDB4NkRFRCwgMHg2REYwLCAweDZEQkEsIDB4NkRENSwgMHg2REMyLCAweDZEQ0YsIDB4NkRDOSwgMHg2REQwLAorICAgIDB4NkRGMiwgMHg2REQzLCAweDZERkQsIDB4NkRENywgMHg2RENELCAweDZERTMsIDB4NkRCQiwgMHg3MEZBLCAweDcxMEQsCisgICAgMHg3MEY3LCAweDcxMTcsIDB4NzBGNCwgMHg3MTBDLCAweDcwRjAsIDB4NzEwNCwgMHg3MEYzLCAweDcxMTAsIDB4NzBGQywKKyAgICAweDcwRkYsIDB4NzEwNiwgMHg3MTEzLCAweDcxMDAsIDB4NzBGOCwgMHg3MEY2LCAweDcxMEIsIDB4NzEwMiwgMHg3MTBFLAorICAgIDB4NzI3RSwgMHg3MjdCLCAweDcyN0MsIDB4NzI3RiwgMHg3MzFELCAweDczMTcsIDB4NzMwNywgMHg3MzExLCAweDczMTgsCisgICAgMHg3MzBBLCAweDczMDgsIDB4NzJGRiwgMHg3MzBGLCAweDczMUUsIDB4NzM4OCwgMHg3M0Y2LCAweDczRjgsIDB4NzNGNSwKKyAgICAweDc0MDQsIDB4NzQwMSwgMHg3M0ZELCAweDc0MDcsIDB4NzQwMCwgMHg3M0ZBLCAweDczRkMsIDB4NzNGRiwgMHg3NDBDLAorICAgIDB4NzQwQiwgMHg3M0Y0LCAweDc0MDgsIDB4NzU2NCwgMHg3NTYzLCAweDc1Q0UsIDB4NzVEMiwgMHg3NUNGLCAweDc1Q0IsCisgICAgMHg3NUNDLCAweDc1RDEsIDB4NzVEMCwgMHg3NjhGLCAweDc2ODksIDB4NzZEMywgMHg3NzM5LCAweDc3MkYsIDB4NzcyRCwKKyAgICAweDc3MzEsIDB4NzczMiwgMHg3NzM0LCAweDc3MzMsIDB4NzczRCwgMHg3NzI1LCAweDc3M0IsIDB4NzczNSwgMHg3ODQ4LAorICAgIDB4Nzg1MiwgMHg3ODQ5LCAweDc4NEQsIDB4Nzg0QSwgMHg3ODRDLCAweDc4MjYsIDB4Nzg0NSwgMHg3ODUwLCAweDc5NjQsCisgICAgMHg3OTY3LCAweDc5NjksIDB4Nzk2QSwgMHg3OTYzLCAweDc5NkIsIDB4Nzk2MSwgMHg3OUJCLCAweDc5RkEsIDB4NzlGOCwKKyAgICAweDc5RjYsIDB4NzlGNywgMHg3QThGLCAweDdBOTQsIDB4N0E5MCwgMHg3QjM1LCAweDdCM0IsIDB4N0IzNCwgMHg3QjI1LAorICAgIDB4N0IzMCwgMHg3QjIyLCAweDdCMjQsIDB4N0IzMywgMHg3QjE4LCAweDdCMkEsIDB4N0IxRCwgMHg3QjMxLCAweDdCMkIsCisgICAgMHg3QjJELCAweDdCMkYsIDB4N0IzMiwgMHg3QjM4LCAweDdCMUEsIDB4N0IyMywgMHg3Qzk0LCAweDdDOTgsIDB4N0M5NiwKKyAgICAweDdDQTMsIDB4N0QzNSwgMHg3RDNELCAweDdEMzgsIDB4N0QzNiwgMHg3RDNBLCAweDdENDUsIDB4N0QyQywgMHg3RDI5LAorICAgIDB4N0Q0MSwgMHg3RDQ3LCAweDdEM0UsIDB4N0QzRiwgMHg3RDRBLCAweDdEM0IsIDB4N0QyOCwgMHg3RjYzLCAweDdGOTUsCisgICAgMHg3RjlDLCAweDdGOUQsIDB4N0Y5QiwgMHg3RkNBLCAweDdGQ0IsIDB4N0ZDRCwgMHg3RkQwLCAweDdGRDEsIDB4N0ZDNywKKyAgICAweDdGQ0YsIDB4N0ZDOSwgMHg4MDFGLCAweDgwMUUsIDB4ODAxQiwgMHg4MDQ3LCAweDgwNDMsIDB4ODA0OCwgMHg4MTE4LAorICAgIDB4ODEyNSwgMHg4MTE5LCAweDgxMUIsIDB4ODEyRCwgMHg4MTFGLCAweDgxMkMsIDB4ODExRSwgMHg4MTIxLCAweDgxMTUsCisgICAgMHg4MTI3LCAweDgxMUQsIDB4ODEyMiwgMHg4MjExLCAweDgyMzgsIDB4ODIzMywgMHg4MjNBLCAweDgyMzQsIDB4ODIzMiwKKyAgICAweDgyNzQsIDB4ODM5MCwgMHg4M0EzLCAweDgzQTgsIDB4ODM4RCwgMHg4MzdBLCAweDgzNzMsIDB4ODNBNCwgMHg4Mzc0LAorICAgIDB4ODM4RiwgMHg4MzgxLCAweDgzOTUsIDB4ODM5OSwgMHg4Mzc1LCAweDgzOTQsIDB4ODNBOSwgMHg4MzdELCAweDgzODMsCisgICAgMHg4MzhDLCAweDgzOUQsIDB4ODM5QiwgMHg4M0FBLCAweDgzOEIsIDB4ODM3RSwgMHg4M0E1LCAweDgzQUYsIDB4ODM4OCwKKyAgICAweDgzOTcsIDB4ODNCMCwgMHg4MzdGLCAweDgzQTYsIDB4ODM4NywgMHg4M0FFLCAweDgzNzYsIDB4ODY1OSwgMHg4NjU2LAorICAgIDB4ODZCRiwgMHg4NkI3LCAweDg2QzIsIDB4ODZDMSwgMHg4NkM1LCAweDg2QkEsIDB4ODZCMCwgMHg4NkM4LCAweDg2QjksCisgICAgMHg4NkIzLCAweDg2QjgsIDB4ODZDQywgMHg4NkI0LCAweDg2QkIsIDB4ODZCQywgMHg4NkMzLCAweDg2QkQsIDB4ODZCRSwKKyAgICAweDg4NTIsIDB4ODg4OSwgMHg4ODk1LCAweDg4QTgsIDB4ODhBMiwgMHg4OEFBLCAweDg4OUEsIDB4ODg5MSwgMHg4OEExLAorICAgIDB4ODg5RiwgMHg4ODk4LCAweDg4QTcsIDB4ODg5OSwgMHg4ODlCLCAweDg4OTcsIDB4ODhBNCwgMHg4OEFDLCAweDg4OEMsCisgICAgMHg4ODkzLCAweDg4OEUsIDB4ODk4MiwgMHg4OUQ2LCAweDg5RDksIDB4ODlENSwgMHg4QTMwLCAweDhBMjcsIDB4OEEyQywKKyAgICAweDhBMUUsIDB4OEMzOSwgMHg4QzNCLCAweDhDNUMsIDB4OEM1RCwgMHg4QzdELCAweDhDQTUsIDB4OEQ3RCwgMHg4RDdCLAorICAgIDB4OEQ3OSwgMHg4REJDLCAweDhEQzIsIDB4OERCOSwgMHg4REJGLCAweDhEQzEsIDB4OEVEOCwgMHg4RURFLCAweDhFREQsCisgICAgMHg4RURDLCAweDhFRDcsIDB4OEVFMCwgMHg4RUUxLCAweDkwMjQsIDB4OTAwQiwgMHg5MDExLCAweDkwMUMsIDB4OTAwQywKKyAgICAweDkwMjEsIDB4OTBFRiwgMHg5MEVBLCAweDkwRjAsIDB4OTBGNCwgMHg5MEYyLCAweDkwRjMsIDB4OTBENCwgMHg5MEVCLAorICAgIDB4OTBFQywgMHg5MEU5LCAweDkxNTYsIDB4OTE1OCwgMHg5MTVBLCAweDkxNTMsIDB4OTE1NSwgMHg5MUVDLCAweDkxRjQsCisgICAgMHg5MUYxLCAweDkxRjMsIDB4OTFGOCwgMHg5MUU0LCAweDkxRjksIDB4OTFFQSwgMHg5MUVCLCAweDkxRjcsIDB4OTFFOCwKKyAgICAweDkxRUUsIDB4OTU3QSwgMHg5NTg2LCAweDk1ODgsIDB4OTY3QywgMHg5NjZELCAweDk2NkIsIDB4OTY3MSwgMHg5NjZGLAorICAgIDB4OTZCRiwgMHg5NzZBLCAweDk4MDQsIDB4OThFNSwgMHg5OTk3LCAweDUwOUIsIDB4NTA5NSwgMHg1MDk0LCAweDUwOUUsCisgICAgMHg1MDhCLCAweDUwQTMsIDB4NTA4MywgMHg1MDhDLCAweDUwOEUsIDB4NTA5RCwgMHg1MDY4LCAweDUwOUMsIDB4NTA5MiwKKyAgICAweDUwODIsIDB4NTA4NywgMHg1MTVGLCAweDUxRDQsIDB4NTMxMiwgMHg1MzExLCAweDUzQTQsIDB4NTNBNywgMHg1NTkxLAorICAgIDB4NTVBOCwgMHg1NUE1LCAweDU1QUQsIDB4NTU3NywgMHg1NjQ1LCAweDU1QTIsIDB4NTU5MywgMHg1NTg4LCAweDU1OEYsCisgICAgMHg1NUI1LCAweDU1ODEsIDB4NTVBMywgMHg1NTkyLCAweDU1QTQsIDB4NTU3RCwgMHg1NThDLCAweDU1QTYsIDB4NTU3RiwKKyAgICAweDU1OTUsIDB4NTVBMSwgMHg1NThFLCAweDU3MEMsIDB4NTgyOSwgMHg1ODM3LCAweDU4MTksIDB4NTgxRSwgMHg1ODI3LAorICAgIDB4NTgyMywgMHg1ODI4LCAweDU3RjUsIDB4NTg0OCwgMHg1ODI1LCAweDU4MUMsIDB4NTgxQiwgMHg1ODMzLCAweDU4M0YsCisgICAgMHg1ODM2LCAweDU4MkUsIDB4NTgzOSwgMHg1ODM4LCAweDU4MkQsIDB4NTgyQywgMHg1ODNCLCAweDU5NjEsIDB4NUFBRiwKKyAgICAweDVBOTQsIDB4NUE5RiwgMHg1QTdBLCAweDVBQTIsIDB4NUE5RSwgMHg1QTc4LCAweDVBQTYsIDB4NUE3QywgMHg1QUE1LAorICAgIDB4NUFBQywgMHg1QTk1LCAweDVBQUUsIDB4NUEzNywgMHg1QTg0LCAweDVBOEEsIDB4NUE5NywgMHg1QTgzLCAweDVBOEIsCisgICAgMHg1QUE5LCAweDVBN0IsIDB4NUE3RCwgMHg1QThDLCAweDVBOUMsIDB4NUE4RiwgMHg1QTkzLCAweDVBOUQsIDB4NUJFQSwKKyAgICAweDVCQ0QsIDB4NUJDQiwgMHg1QkQ0LCAweDVCRDEsIDB4NUJDQSwgMHg1QkNFLCAweDVDMEMsIDB4NUMzMCwgMHg1RDM3LAorICAgIDB4NUQ0MywgMHg1RDZCLCAweDVENDEsIDB4NUQ0QiwgMHg1RDNGLCAweDVEMzUsIDB4NUQ1MSwgMHg1RDRFLCAweDVENTUsCisgICAgMHg1RDMzLCAweDVEM0EsIDB4NUQ1MiwgMHg1RDNELCAweDVEMzEsIDB4NUQ1OSwgMHg1RDQyLCAweDVEMzksIDB4NUQ0OSwKKyAgICAweDVEMzgsIDB4NUQzQywgMHg1RDMyLCAweDVEMzYsIDB4NUQ0MCwgMHg1RDQ1LCAweDVFNDQsIDB4NUU0MSwgMHg1RjU4LAorICAgIDB4NUZBNiwgMHg1RkE1LCAweDVGQUIsIDB4NjBDOSwgMHg2MEI5LCAweDYwQ0MsIDB4NjBFMiwgMHg2MENFLCAweDYwQzQsCisgICAgMHg2MTE0LCAweDYwRjIsIDB4NjEwQSwgMHg2MTE2LCAweDYxMDUsIDB4NjBGNSwgMHg2MTEzLCAweDYwRjgsIDB4NjBGQywKKyAgICAweDYwRkUsIDB4NjBDMSwgMHg2MTAzLCAweDYxMTgsIDB4NjExRCwgMHg2MTEwLCAweDYwRkYsIDB4NjEwNCwgMHg2MTBCLAorICAgIDB4NjI0QSwgMHg2Mzk0LCAweDYzQjEsIDB4NjNCMCwgMHg2M0NFLCAweDYzRTUsIDB4NjNFOCwgMHg2M0VGLCAweDYzQzMsCisgICAgMHg2NDlELCAweDYzRjMsIDB4NjNDQSwgMHg2M0UwLCAweDYzRjYsIDB4NjNENSwgMHg2M0YyLCAweDYzRjUsIDB4NjQ2MSwKKyAgICAweDYzREYsIDB4NjNCRSwgMHg2M0RELCAweDYzREMsIDB4NjNDNCwgMHg2M0Q4LCAweDYzRDMsIDB4NjNDMiwgMHg2M0M3LAorICAgIDB4NjNDQywgMHg2M0NCLCAweDYzQzgsIDB4NjNGMCwgMHg2M0Q3LCAweDYzRDksIDB4NjUzMiwgMHg2NTY3LCAweDY1NkEsCisgICAgMHg2NTY0LCAweDY1NUMsIDB4NjU2OCwgMHg2NTY1LCAweDY1OEMsIDB4NjU5RCwgMHg2NTlFLCAweDY1QUUsIDB4NjVEMCwKKyAgICAweDY1RDIsIDB4NjY3QywgMHg2NjZDLCAweDY2N0IsIDB4NjY4MCwgMHg2NjcxLCAweDY2NzksIDB4NjY2QSwgMHg2NjcyLAorICAgIDB4NjcwMSwgMHg2OTBDLCAweDY4RDMsIDB4NjkwNCwgMHg2OERDLCAweDY5MkEsIDB4NjhFQywgMHg2OEVBLCAweDY4RjEsCisgICAgMHg2OTBGLCAweDY4RDYsIDB4NjhGNywgMHg2OEVCLCAweDY4RTQsIDB4NjhGNiwgMHg2OTEzLCAweDY5MTAsIDB4NjhGMywKKyAgICAweDY4RTEsIDB4NjkwNywgMHg2OENDLCAweDY5MDgsIDB4Njk3MCwgMHg2OEI0LCAweDY5MTEsIDB4NjhFRiwgMHg2OEM2LAorICAgIDB4NjkxNCwgMHg2OEY4LCAweDY4RDAsIDB4NjhGRCwgMHg2OEZDLCAweDY4RTgsIDB4NjkwQiwgMHg2OTBBLCAweDY5MTcsCisgICAgMHg2OENFLCAweDY4QzgsIDB4NjhERCwgMHg2OERFLCAweDY4RTYsIDB4NjhGNCwgMHg2OEQxLCAweDY5MDYsIDB4NjhENCwKKyAgICAweDY4RTksIDB4NjkxNSwgMHg2OTI1LCAweDY4QzcsIDB4NkIzOSwgMHg2QjNCLCAweDZCM0YsIDB4NkIzQywgMHg2Qjk0LAorICAgIDB4NkI5NywgMHg2Qjk5LCAweDZCOTUsIDB4NkJCRCwgMHg2QkYwLCAweDZCRjIsIDB4NkJGMywgMHg2QzMwLCAweDZERkMsCisgICAgMHg2RTQ2LCAweDZFNDcsIDB4NkUxRiwgMHg2RTQ5LCAweDZFODgsIDB4NkUzQywgMHg2RTNELCAweDZFNDUsIDB4NkU2MiwKKyAgICAweDZFMkIsIDB4NkUzRiwgMHg2RTQxLCAweDZFNUQsIDB4NkU3MywgMHg2RTFDLCAweDZFMzMsIDB4NkU0QiwgMHg2RTQwLAorICAgIDB4NkU1MSwgMHg2RTNCLCAweDZFMDMsIDB4NkUyRSwgMHg2RTVFLCAweDZFNjgsIDB4NkU1QywgMHg2RTYxLCAweDZFMzEsCisgICAgMHg2RTI4LCAweDZFNjAsIDB4NkU3MSwgMHg2RTZCLCAweDZFMzksIDB4NkUyMiwgMHg2RTMwLCAweDZFNTMsIDB4NkU2NSwKKyAgICAweDZFMjcsIDB4NkU3OCwgMHg2RTY0LCAweDZFNzcsIDB4NkU1NSwgMHg2RTc5LCAweDZFNTIsIDB4NkU2NiwgMHg2RTM1LAorICAgIDB4NkUzNiwgMHg2RTVBLCAweDcxMjAsIDB4NzExRSwgMHg3MTJGLCAweDcwRkIsIDB4NzEyRSwgMHg3MTMxLCAweDcxMjMsCisgICAgMHg3MTI1LCAweDcxMjIsIDB4NzEzMiwgMHg3MTFGLCAweDcxMjgsIDB4NzEzQSwgMHg3MTFCLCAweDcyNEIsIDB4NzI1QSwKKyAgICAweDcyODgsIDB4NzI4OSwgMHg3Mjg2LCAweDcyODUsIDB4NzI4QiwgMHg3MzEyLCAweDczMEIsIDB4NzMzMCwgMHg3MzIyLAorICAgIDB4NzMzMSwgMHg3MzMzLCAweDczMjcsIDB4NzMzMiwgMHg3MzJELCAweDczMjYsIDB4NzMyMywgMHg3MzM1LCAweDczMEMsCisgICAgMHg3NDJFLCAweDc0MkMsIDB4NzQzMCwgMHg3NDJCLCAweDc0MTYsIDB4NzQxQSwgMHg3NDIxLCAweDc0MkQsIDB4NzQzMSwKKyAgICAweDc0MjQsIDB4NzQyMywgMHg3NDFELCAweDc0MjksIDB4NzQyMCwgMHg3NDMyLCAweDc0RkIsIDB4NzUyRiwgMHg3NTZGLAorICAgIDB4NzU2QywgMHg3NUU3LCAweDc1REEsIDB4NzVFMSwgMHg3NUU2LCAweDc1REQsIDB4NzVERiwgMHg3NUU0LCAweDc1RDcsCisgICAgMHg3Njk1LCAweDc2OTIsIDB4NzZEQSwgMHg3NzQ2LCAweDc3NDcsIDB4Nzc0NCwgMHg3NzRELCAweDc3NDUsIDB4Nzc0QSwKKyAgICAweDc3NEUsIDB4Nzc0QiwgMHg3NzRDLCAweDc3REUsIDB4NzdFQywgMHg3ODYwLCAweDc4NjQsIDB4Nzg2NSwgMHg3ODVDLAorICAgIDB4Nzg2RCwgMHg3ODcxLCAweDc4NkEsIDB4Nzg2RSwgMHg3ODcwLCAweDc4NjksIDB4Nzg2OCwgMHg3ODVFLCAweDc4NjIsCisgICAgMHg3OTc0LCAweDc5NzMsIDB4Nzk3MiwgMHg3OTcwLCAweDdBMDIsIDB4N0EwQSwgMHg3QTAzLCAweDdBMEMsIDB4N0EwNCwKKyAgICAweDdBOTksIDB4N0FFNiwgMHg3QUU0LCAweDdCNEEsIDB4N0I0NywgMHg3QjQ0LCAweDdCNDgsIDB4N0I0QywgMHg3QjRFLAorICAgIDB4N0I0MCwgMHg3QjU4LCAweDdCNDUsIDB4N0NBMiwgMHg3QzlFLCAweDdDQTgsIDB4N0NBMSwgMHg3RDU4LCAweDdENkYsCisgICAgMHg3RDYzLCAweDdENTMsIDB4N0Q1NiwgMHg3RDY3LCAweDdENkEsIDB4N0Q0RiwgMHg3RDZELCAweDdENUMsIDB4N0Q2QiwKKyAgICAweDdENTIsIDB4N0Q1NCwgMHg3RDY5LCAweDdENTEsIDB4N0Q1RiwgMHg3RDRFLCAweDdGM0UsIDB4N0YzRiwgMHg3RjY1LAorICAgIDB4N0Y2NiwgMHg3RkEyLCAweDdGQTAsIDB4N0ZBMSwgMHg3RkQ3LCAweDgwNTEsIDB4ODA0RiwgMHg4MDUwLCAweDgwRkUsCisgICAgMHg4MEQ0LCAweDgxNDMsIDB4ODE0QSwgMHg4MTUyLCAweDgxNEYsIDB4ODE0NywgMHg4MTNELCAweDgxNEQsIDB4ODEzQSwKKyAgICAweDgxRTYsIDB4ODFFRSwgMHg4MUY3LCAweDgxRjgsIDB4ODFGOSwgMHg4MjA0LCAweDgyM0MsIDB4ODIzRCwgMHg4MjNGLAorICAgIDB4ODI3NSwgMHg4MzNCLCAweDgzQ0YsIDB4ODNGOSwgMHg4NDIzLCAweDgzQzAsIDB4ODNFOCwgMHg4NDEyLCAweDgzRTcsCisgICAgMHg4M0U0LCAweDgzRkMsIDB4ODNGNiwgMHg4NDEwLCAweDgzQzYsIDB4ODNDOCwgMHg4M0VCLCAweDgzRTMsIDB4ODNCRiwKKyAgICAweDg0MDEsIDB4ODNERCwgMHg4M0U1LCAweDgzRDgsIDB4ODNGRiwgMHg4M0UxLCAweDgzQ0IsIDB4ODNDRSwgMHg4M0Q2LAorICAgIDB4ODNGNSwgMHg4M0M5LCAweDg0MDksIDB4ODQwRiwgMHg4M0RFLCAweDg0MTEsIDB4ODQwNiwgMHg4M0MyLCAweDgzRjMsCisgICAgMHg4M0Q1LCAweDgzRkEsIDB4ODNDNywgMHg4M0QxLCAweDgzRUEsIDB4ODQxMywgMHg4MzlBLCAweDgzQzMsIDB4ODNFQywKKyAgICAweDgzRUUsIDB4ODNDNCwgMHg4M0ZCLCAweDgzRDcsIDB4ODNFMiwgMHg4NDFCLCAweDgzREIsIDB4ODNGRSwgMHg4NkQ4LAorICAgIDB4ODZFMiwgMHg4NkU2LCAweDg2RDMsIDB4ODZFMywgMHg4NkRBLCAweDg2RUEsIDB4ODZERCwgMHg4NkVCLCAweDg2REMsCisgICAgMHg4NkVDLCAweDg2RTksIDB4ODZENywgMHg4NkU4LCAweDg2RDEsIDB4ODg0OCwgMHg4ODU2LCAweDg4NTUsIDB4ODhCQSwKKyAgICAweDg4RDcsIDB4ODhCOSwgMHg4OEI4LCAweDg4QzAsIDB4ODhCRSwgMHg4OEI2LCAweDg4QkMsIDB4ODhCNywgMHg4OEJELAorICAgIDB4ODhCMiwgMHg4OTAxLCAweDg4QzksIDB4ODk5NSwgMHg4OTk4LCAweDg5OTcsIDB4ODlERCwgMHg4OURBLCAweDg5REIsCisgICAgMHg4QTRFLCAweDhBNEQsIDB4OEEzOSwgMHg4QTU5LCAweDhBNDAsIDB4OEE1NywgMHg4QTU4LCAweDhBNDQsIDB4OEE0NSwKKyAgICAweDhBNTIsIDB4OEE0OCwgMHg4QTUxLCAweDhBNEEsIDB4OEE0QywgMHg4QTRGLCAweDhDNUYsIDB4OEM4MSwgMHg4QzgwLAorICAgIDB4OENCQSwgMHg4Q0JFLCAweDhDQjAsIDB4OENCOSwgMHg4Q0I1LCAweDhEODQsIDB4OEQ4MCwgMHg4RDg5LCAweDhERDgsCisgICAgMHg4REQzLCAweDhEQ0QsIDB4OERDNywgMHg4REQ2LCAweDhEREMsIDB4OERDRiwgMHg4REQ1LCAweDhERDksIDB4OERDOCwKKyAgICAweDhERDcsIDB4OERDNSwgMHg4RUVGLCAweDhFRjcsIDB4OEVGQSwgMHg4RUY5LCAweDhFRTYsIDB4OEVFRSwgMHg4RUU1LAorICAgIDB4OEVGNSwgMHg4RUU3LCAweDhFRTgsIDB4OEVGNiwgMHg4RUVCLCAweDhFRjEsIDB4OEVFQywgMHg4RUY0LCAweDhFRTksCisgICAgMHg5MDJELCAweDkwMzQsIDB4OTAyRiwgMHg5MTA2LCAweDkxMkMsIDB4OTEwNCwgMHg5MEZGLCAweDkwRkMsIDB4OTEwOCwKKyAgICAweDkwRjksIDB4OTBGQiwgMHg5MTAxLCAweDkxMDAsIDB4OTEwNywgMHg5MTA1LCAweDkxMDMsIDB4OTE2MSwgMHg5MTY0LAorICAgIDB4OTE1RiwgMHg5MTYyLCAweDkxNjAsIDB4OTIwMSwgMHg5MjBBLCAweDkyMjUsIDB4OTIwMywgMHg5MjFBLCAweDkyMjYsCisgICAgMHg5MjBGLCAweDkyMEMsIDB4OTIwMCwgMHg5MjEyLCAweDkxRkYsIDB4OTFGRCwgMHg5MjA2LCAweDkyMDQsIDB4OTIyNywKKyAgICAweDkyMDIsIDB4OTIxQywgMHg5MjI0LCAweDkyMTksIDB4OTIxNywgMHg5MjA1LCAweDkyMTYsIDB4OTU3QiwgMHg5NThELAorICAgIDB4OTU4QywgMHg5NTkwLCAweDk2ODcsIDB4OTY3RSwgMHg5Njg4LCAweDk2ODksIDB4OTY4MywgMHg5NjgwLCAweDk2QzIsCisgICAgMHg5NkM4LCAweDk2QzMsIDB4OTZGMSwgMHg5NkYwLCAweDk3NkMsIDB4OTc3MCwgMHg5NzZFLCAweDk4MDcsIDB4OThBOSwKKyAgICAweDk4RUIsIDB4OUNFNiwgMHg5RUY5LCAweDRFODMsIDB4NEU4NCwgMHg0RUI2LCAweDUwQkQsIDB4NTBCRiwgMHg1MEM2LAorICAgIDB4NTBBRSwgMHg1MEM0LCAweDUwQ0EsIDB4NTBCNCwgMHg1MEM4LCAweDUwQzIsIDB4NTBCMCwgMHg1MEMxLCAweDUwQkEsCisgICAgMHg1MEIxLCAweDUwQ0IsIDB4NTBDOSwgMHg1MEI2LCAweDUwQjgsIDB4NTFENywgMHg1MjdBLCAweDUyNzgsIDB4NTI3QiwKKyAgICAweDUyN0MsIDB4NTVDMywgMHg1NURCLCAweDU1Q0MsIDB4NTVEMCwgMHg1NUNCLCAweDU1Q0EsIDB4NTVERCwgMHg1NUMwLAorICAgIDB4NTVENCwgMHg1NUM0LCAweDU1RTksIDB4NTVCRiwgMHg1NUQyLCAweDU1OEQsIDB4NTVDRiwgMHg1NUQ1LCAweDU1RTIsCisgICAgMHg1NUQ2LCAweDU1QzgsIDB4NTVGMiwgMHg1NUNELCAweDU1RDksIDB4NTVDMiwgMHg1NzE0LCAweDU4NTMsIDB4NTg2OCwKKyAgICAweDU4NjQsIDB4NTg0RiwgMHg1ODRELCAweDU4NDksIDB4NTg2RiwgMHg1ODU1LCAweDU4NEUsIDB4NTg1RCwgMHg1ODU5LAorICAgIDB4NTg2NSwgMHg1ODVCLCAweDU4M0QsIDB4NTg2MywgMHg1ODcxLCAweDU4RkMsIDB4NUFDNywgMHg1QUM0LCAweDVBQ0IsCisgICAgMHg1QUJBLCAweDVBQjgsIDB4NUFCMSwgMHg1QUI1LCAweDVBQjAsIDB4NUFCRiwgMHg1QUM4LCAweDVBQkIsIDB4NUFDNiwKKyAgICAweDVBQjcsIDB4NUFDMCwgMHg1QUNBLCAweDVBQjQsIDB4NUFCNiwgMHg1QUNELCAweDVBQjksIDB4NUE5MCwgMHg1QkQ2LAorICAgIDB4NUJEOCwgMHg1QkQ5LCAweDVDMUYsIDB4NUMzMywgMHg1RDcxLCAweDVENjMsIDB4NUQ0QSwgMHg1RDY1LCAweDVENzIsCisgICAgMHg1RDZDLCAweDVENUUsIDB4NUQ2OCwgMHg1RDY3LCAweDVENjIsIDB4NURGMCwgMHg1RTRGLCAweDVFNEUsIDB4NUU0QSwKKyAgICAweDVFNEQsIDB4NUU0QiwgMHg1RUM1LCAweDVFQ0MsIDB4NUVDNiwgMHg1RUNCLCAweDVFQzcsIDB4NUY0MCwgMHg1RkFGLAorICAgIDB4NUZBRCwgMHg2MEY3LCAweDYxNDksIDB4NjE0QSwgMHg2MTJCLCAweDYxNDUsIDB4NjEzNiwgMHg2MTMyLCAweDYxMkUsCisgICAgMHg2MTQ2LCAweDYxMkYsIDB4NjE0RiwgMHg2MTI5LCAweDYxNDAsIDB4NjIyMCwgMHg5MTY4LCAweDYyMjMsIDB4NjIyNSwKKyAgICAweDYyMjQsIDB4NjNDNSwgMHg2M0YxLCAweDYzRUIsIDB4NjQxMCwgMHg2NDEyLCAweDY0MDksIDB4NjQyMCwgMHg2NDI0LAorICAgIDB4NjQzMywgMHg2NDQzLCAweDY0MUYsIDB4NjQxNSwgMHg2NDE4LCAweDY0MzksIDB4NjQzNywgMHg2NDIyLCAweDY0MjMsCisgICAgMHg2NDBDLCAweDY0MjYsIDB4NjQzMCwgMHg2NDI4LCAweDY0NDEsIDB4NjQzNSwgMHg2NDJGLCAweDY0MEEsIDB4NjQxQSwKKyAgICAweDY0NDAsIDB4NjQyNSwgMHg2NDI3LCAweDY0MEIsIDB4NjNFNywgMHg2NDFCLCAweDY0MkUsIDB4NjQyMSwgMHg2NDBFLAorICAgIDB4NjU2RiwgMHg2NTkyLCAweDY1RDMsIDB4NjY4NiwgMHg2NjhDLCAweDY2OTUsIDB4NjY5MCwgMHg2NjhCLCAweDY2OEEsCisgICAgMHg2Njk5LCAweDY2OTQsIDB4NjY3OCwgMHg2NzIwLCAweDY5NjYsIDB4Njk1RiwgMHg2OTM4LCAweDY5NEUsIDB4Njk2MiwKKyAgICAweDY5NzEsIDB4NjkzRiwgMHg2OTQ1LCAweDY5NkEsIDB4NjkzOSwgMHg2OTQyLCAweDY5NTcsIDB4Njk1OSwgMHg2OTdBLAorICAgIDB4Njk0OCwgMHg2OTQ5LCAweDY5MzUsIDB4Njk2QywgMHg2OTMzLCAweDY5M0QsIDB4Njk2NSwgMHg2OEYwLCAweDY5NzgsCisgICAgMHg2OTM0LCAweDY5NjksIDB4Njk0MCwgMHg2OTZGLCAweDY5NDQsIDB4Njk3NiwgMHg2OTU4LCAweDY5NDEsIDB4Njk3NCwKKyAgICAweDY5NEMsIDB4NjkzQiwgMHg2OTRCLCAweDY5MzcsIDB4Njk1QywgMHg2OTRGLCAweDY5NTEsIDB4NjkzMiwgMHg2OTUyLAorICAgIDB4NjkyRiwgMHg2OTdCLCAweDY5M0MsIDB4NkI0NiwgMHg2QjQ1LCAweDZCNDMsIDB4NkI0MiwgMHg2QjQ4LCAweDZCNDEsCisgICAgMHg2QjlCLCAweDZCRkIsIDB4NkJGQywgMHg2QkY5LCAweDZCRjcsIDB4NkJGOCwgMHg2RTlCLCAweDZFRDYsIDB4NkVDOCwKKyAgICAweDZFOEYsIDB4NkVDMCwgMHg2RTlGLCAweDZFOTMsIDB4NkU5NCwgMHg2RUEwLCAweDZFQjEsIDB4NkVCOSwgMHg2RUM2LAorICAgIDB4NkVEMiwgMHg2RUJELCAweDZFQzEsIDB4NkU5RSwgMHg2RUM5LCAweDZFQjcsIDB4NkVCMCwgMHg2RUNELCAweDZFQTYsCisgICAgMHg2RUNGLCAweDZFQjIsIDB4NkVCRSwgMHg2RUMzLCAweDZFREMsIDB4NkVEOCwgMHg2RTk5LCAweDZFOTIsIDB4NkU4RSwKKyAgICAweDZFOEQsIDB4NkVBNCwgMHg2RUExLCAweDZFQkYsIDB4NkVCMywgMHg2RUQwLCAweDZFQ0EsIDB4NkU5NywgMHg2RUFFLAorICAgIDB4NkVBMywgMHg3MTQ3LCAweDcxNTQsIDB4NzE1MiwgMHg3MTYzLCAweDcxNjAsIDB4NzE0MSwgMHg3MTVELCAweDcxNjIsCisgICAgMHg3MTcyLCAweDcxNzgsIDB4NzE2QSwgMHg3MTYxLCAweDcxNDIsIDB4NzE1OCwgMHg3MTQzLCAweDcxNEIsIDB4NzE3MCwKKyAgICAweDcxNUYsIDB4NzE1MCwgMHg3MTUzLCAweDcxNDQsIDB4NzE0RCwgMHg3MTVBLCAweDcyNEYsIDB4NzI4RCwgMHg3MjhDLAorICAgIDB4NzI5MSwgMHg3MjkwLCAweDcyOEUsIDB4NzMzQywgMHg3MzQyLCAweDczM0IsIDB4NzMzQSwgMHg3MzQwLCAweDczNEEsCisgICAgMHg3MzQ5LCAweDc0NDQsIDB4NzQ0QSwgMHg3NDRCLCAweDc0NTIsIDB4NzQ1MSwgMHg3NDU3LCAweDc0NDAsIDB4NzQ0RiwKKyAgICAweDc0NTAsIDB4NzQ0RSwgMHg3NDQyLCAweDc0NDYsIDB4NzQ0RCwgMHg3NDU0LCAweDc0RTEsIDB4NzRGRiwgMHg3NEZFLAorICAgIDB4NzRGRCwgMHg3NTFELCAweDc1NzksIDB4NzU3NywgMHg2OTgzLCAweDc1RUYsIDB4NzYwRiwgMHg3NjAzLCAweDc1RjcsCisgICAgMHg3NUZFLCAweDc1RkMsIDB4NzVGOSwgMHg3NUY4LCAweDc2MTAsIDB4NzVGQiwgMHg3NUY2LCAweDc1RUQsIDB4NzVGNSwKKyAgICAweDc1RkQsIDB4NzY5OSwgMHg3NkI1LCAweDc2REQsIDB4Nzc1NSwgMHg3NzVGLCAweDc3NjAsIDB4Nzc1MiwgMHg3NzU2LAorICAgIDB4Nzc1QSwgMHg3NzY5LCAweDc3NjcsIDB4Nzc1NCwgMHg3NzU5LCAweDc3NkQsIDB4NzdFMCwgMHg3ODg3LCAweDc4OUEsCisgICAgMHg3ODk0LCAweDc4OEYsIDB4Nzg4NCwgMHg3ODk1LCAweDc4ODUsIDB4Nzg4NiwgMHg3OEExLCAweDc4ODMsIDB4Nzg3OSwKKyAgICAweDc4OTksIDB4Nzg4MCwgMHg3ODk2LCAweDc4N0IsIDB4Nzk3QywgMHg3OTgyLCAweDc5N0QsIDB4Nzk3OSwgMHg3QTExLAorICAgIDB4N0ExOCwgMHg3QTE5LCAweDdBMTIsIDB4N0ExNywgMHg3QTE1LCAweDdBMjIsIDB4N0ExMywgMHg3QTFCLCAweDdBMTAsCisgICAgMHg3QUEzLCAweDdBQTIsIDB4N0E5RSwgMHg3QUVCLCAweDdCNjYsIDB4N0I2NCwgMHg3QjZELCAweDdCNzQsIDB4N0I2OSwKKyAgICAweDdCNzIsIDB4N0I2NSwgMHg3QjczLCAweDdCNzEsIDB4N0I3MCwgMHg3QjYxLCAweDdCNzgsIDB4N0I3NiwgMHg3QjYzLAorICAgIDB4N0NCMiwgMHg3Q0I0LCAweDdDQUYsIDB4N0Q4OCwgMHg3RDg2LCAweDdEODAsIDB4N0Q4RCwgMHg3RDdGLCAweDdEODUsCisgICAgMHg3RDdBLCAweDdEOEUsIDB4N0Q3QiwgMHg3RDgzLCAweDdEN0MsIDB4N0Q4QywgMHg3RDk0LCAweDdEODQsIDB4N0Q3RCwKKyAgICAweDdEOTIsIDB4N0Y2RCwgMHg3RjZCLCAweDdGNjcsIDB4N0Y2OCwgMHg3RjZDLCAweDdGQTYsIDB4N0ZBNSwgMHg3RkE3LAorICAgIDB4N0ZEQiwgMHg3RkRDLCAweDgwMjEsIDB4ODE2NCwgMHg4MTYwLCAweDgxNzcsIDB4ODE1QywgMHg4MTY5LCAweDgxNUIsCisgICAgMHg4MTYyLCAweDgxNzIsIDB4NjcyMSwgMHg4MTVFLCAweDgxNzYsIDB4ODE2NywgMHg4MTZGLCAweDgxNDQsIDB4ODE2MSwKKyAgICAweDgyMUQsIDB4ODI0OSwgMHg4MjQ0LCAweDgyNDAsIDB4ODI0MiwgMHg4MjQ1LCAweDg0RjEsIDB4ODQzRiwgMHg4NDU2LAorICAgIDB4ODQ3NiwgMHg4NDc5LCAweDg0OEYsIDB4ODQ4RCwgMHg4NDY1LCAweDg0NTEsIDB4ODQ0MCwgMHg4NDg2LCAweDg0NjcsCisgICAgMHg4NDMwLCAweDg0NEQsIDB4ODQ3RCwgMHg4NDVBLCAweDg0NTksIDB4ODQ3NCwgMHg4NDczLCAweDg0NUQsIDB4ODUwNywKKyAgICAweDg0NUUsIDB4ODQzNywgMHg4NDNBLCAweDg0MzQsIDB4ODQ3QSwgMHg4NDQzLCAweDg0NzgsIDB4ODQzMiwgMHg4NDQ1LAorICAgIDB4ODQyOSwgMHg4M0Q5LCAweDg0NEIsIDB4ODQyRiwgMHg4NDQyLCAweDg0MkQsIDB4ODQ1RiwgMHg4NDcwLCAweDg0MzksCisgICAgMHg4NDRFLCAweDg0NEMsIDB4ODQ1MiwgMHg4NDZGLCAweDg0QzUsIDB4ODQ4RSwgMHg4NDNCLCAweDg0NDcsIDB4ODQzNiwKKyAgICAweDg0MzMsIDB4ODQ2OCwgMHg4NDdFLCAweDg0NDQsIDB4ODQyQiwgMHg4NDYwLCAweDg0NTQsIDB4ODQ2RSwgMHg4NDUwLAorICAgIDB4ODcwQiwgMHg4NzA0LCAweDg2RjcsIDB4ODcwQywgMHg4NkZBLCAweDg2RDYsIDB4ODZGNSwgMHg4NzRELCAweDg2RjgsCisgICAgMHg4NzBFLCAweDg3MDksIDB4ODcwMSwgMHg4NkY2LCAweDg3MEQsIDB4ODcwNSwgMHg4OEQ2LCAweDg4Q0IsIDB4ODhDRCwKKyAgICAweDg4Q0UsIDB4ODhERSwgMHg4OERCLCAweDg4REEsIDB4ODhDQywgMHg4OEQwLCAweDg5ODUsIDB4ODk5QiwgMHg4OURGLAorICAgIDB4ODlFNSwgMHg4OUU0LCAweDg5RTEsIDB4ODlFMCwgMHg4OUUyLCAweDg5REMsIDB4ODlFNiwgMHg4QTc2LCAweDhBODYsCisgICAgMHg4QTdGLCAweDhBNjEsIDB4OEEzRiwgMHg4QTc3LCAweDhBODIsIDB4OEE4NCwgMHg4QTc1LCAweDhBODMsIDB4OEE4MSwKKyAgICAweDhBNzQsIDB4OEE3QSwgMHg4QzNDLCAweDhDNEIsIDB4OEM0QSwgMHg4QzY1LCAweDhDNjQsIDB4OEM2NiwgMHg4Qzg2LAorICAgIDB4OEM4NCwgMHg4Qzg1LCAweDhDQ0MsIDB4OEQ2OCwgMHg4RDY5LCAweDhEOTEsIDB4OEQ4QywgMHg4RDhFLCAweDhEOEYsCisgICAgMHg4RDhELCAweDhEOTMsIDB4OEQ5NCwgMHg4RDkwLCAweDhEOTIsIDB4OERGMCwgMHg4REUwLCAweDhERUMsIDB4OERGMSwKKyAgICAweDhERUUsIDB4OEREMCwgMHg4REU5LCAweDhERTMsIDB4OERFMiwgMHg4REU3LCAweDhERjIsIDB4OERFQiwgMHg4REY0LAorICAgIDB4OEYwNiwgMHg4RUZGLCAweDhGMDEsIDB4OEYwMCwgMHg4RjA1LCAweDhGMDcsIDB4OEYwOCwgMHg4RjAyLCAweDhGMEIsCisgICAgMHg5MDUyLCAweDkwM0YsIDB4OTA0NCwgMHg5MDQ5LCAweDkwM0QsIDB4OTExMCwgMHg5MTBELCAweDkxMEYsIDB4OTExMSwKKyAgICAweDkxMTYsIDB4OTExNCwgMHg5MTBCLCAweDkxMEUsIDB4OTE2RSwgMHg5MTZGLCAweDkyNDgsIDB4OTI1MiwgMHg5MjMwLAorICAgIDB4OTIzQSwgMHg5MjY2LCAweDkyMzMsIDB4OTI2NSwgMHg5MjVFLCAweDkyODMsIDB4OTIyRSwgMHg5MjRBLCAweDkyNDYsCisgICAgMHg5MjZELCAweDkyNkMsIDB4OTI0RiwgMHg5MjYwLCAweDkyNjcsIDB4OTI2RiwgMHg5MjM2LCAweDkyNjEsIDB4OTI3MCwKKyAgICAweDkyMzEsIDB4OTI1NCwgMHg5MjYzLCAweDkyNTAsIDB4OTI3MiwgMHg5MjRFLCAweDkyNTMsIDB4OTI0QywgMHg5MjU2LAorICAgIDB4OTIzMiwgMHg5NTlGLCAweDk1OUMsIDB4OTU5RSwgMHg5NTlCLCAweDk2OTIsIDB4OTY5MywgMHg5NjkxLCAweDk2OTcsCisgICAgMHg5NkNFLCAweDk2RkEsIDB4OTZGRCwgMHg5NkY4LCAweDk2RjUsIDB4OTc3MywgMHg5Nzc3LCAweDk3NzgsIDB4OTc3MiwKKyAgICAweDk4MEYsIDB4OTgwRCwgMHg5ODBFLCAweDk4QUMsIDB4OThGNiwgMHg5OEY5LCAweDk5QUYsIDB4OTlCMiwgMHg5OUIwLAorICAgIDB4OTlCNSwgMHg5QUFELCAweDlBQUIsIDB4OUI1QiwgMHg5Q0VBLCAweDlDRUQsIDB4OUNFNywgMHg5RTgwLCAweDlFRkQsCisgICAgMHg1MEU2LCAweDUwRDQsIDB4NTBENywgMHg1MEU4LCAweDUwRjMsIDB4NTBEQiwgMHg1MEVBLCAweDUwREQsIDB4NTBFNCwKKyAgICAweDUwRDMsIDB4NTBFQywgMHg1MEYwLCAweDUwRUYsIDB4NTBFMywgMHg1MEUwLCAweDUxRDgsIDB4NTI4MCwgMHg1MjgxLAorICAgIDB4NTJFOSwgMHg1MkVCLCAweDUzMzAsIDB4NTNBQywgMHg1NjI3LCAweDU2MTUsIDB4NTYwQywgMHg1NjEyLCAweDU1RkMsCisgICAgMHg1NjBGLCAweDU2MUMsIDB4NTYwMSwgMHg1NjEzLCAweDU2MDIsIDB4NTVGQSwgMHg1NjFELCAweDU2MDQsIDB4NTVGRiwKKyAgICAweDU1RjksIDB4NTg4OSwgMHg1ODdDLCAweDU4OTAsIDB4NTg5OCwgMHg1ODg2LCAweDU4ODEsIDB4NTg3RiwgMHg1ODc0LAorICAgIDB4NTg4QiwgMHg1ODdBLCAweDU4ODcsIDB4NTg5MSwgMHg1ODhFLCAweDU4NzYsIDB4NTg4MiwgMHg1ODg4LCAweDU4N0IsCisgICAgMHg1ODk0LCAweDU4OEYsIDB4NThGRSwgMHg1OTZCLCAweDVBREMsIDB4NUFFRSwgMHg1QUU1LCAweDVBRDUsIDB4NUFFQSwKKyAgICAweDVBREEsIDB4NUFFRCwgMHg1QUVCLCAweDVBRjMsIDB4NUFFMiwgMHg1QUUwLCAweDVBREIsIDB4NUFFQywgMHg1QURFLAorICAgIDB4NUFERCwgMHg1QUQ5LCAweDVBRTgsIDB4NUFERiwgMHg1Qjc3LCAweDVCRTAsIDB4NUJFMywgMHg1QzYzLCAweDVEODIsCisgICAgMHg1RDgwLCAweDVEN0QsIDB4NUQ4NiwgMHg1RDdBLCAweDVEODEsIDB4NUQ3NywgMHg1RDhBLCAweDVEODksIDB4NUQ4OCwKKyAgICAweDVEN0UsIDB4NUQ3QywgMHg1RDhELCAweDVENzksIDB4NUQ3RiwgMHg1RTU4LCAweDVFNTksIDB4NUU1MywgMHg1RUQ4LAorICAgIDB4NUVEMSwgMHg1RUQ3LCAweDVFQ0UsIDB4NUVEQywgMHg1RUQ1LCAweDVFRDksIDB4NUVEMiwgMHg1RUQ0LCAweDVGNDQsCisgICAgMHg1RjQzLCAweDVGNkYsIDB4NUZCNiwgMHg2MTJDLCAweDYxMjgsIDB4NjE0MSwgMHg2MTVFLCAweDYxNzEsIDB4NjE3MywKKyAgICAweDYxNTIsIDB4NjE1MywgMHg2MTcyLCAweDYxNkMsIDB4NjE4MCwgMHg2MTc0LCAweDYxNTQsIDB4NjE3QSwgMHg2MTVCLAorICAgIDB4NjE2NSwgMHg2MTNCLCAweDYxNkEsIDB4NjE2MSwgMHg2MTU2LCAweDYyMjksIDB4NjIyNywgMHg2MjJCLCAweDY0MkIsCisgICAgMHg2NDRELCAweDY0NUIsIDB4NjQ1RCwgMHg2NDc0LCAweDY0NzYsIDB4NjQ3MiwgMHg2NDczLCAweDY0N0QsIDB4NjQ3NSwKKyAgICAweDY0NjYsIDB4NjRBNiwgMHg2NDRFLCAweDY0ODIsIDB4NjQ1RSwgMHg2NDVDLCAweDY0NEIsIDB4NjQ1MywgMHg2NDYwLAorICAgIDB4NjQ1MCwgMHg2NDdGLCAweDY0M0YsIDB4NjQ2QywgMHg2NDZCLCAweDY0NTksIDB4NjQ2NSwgMHg2NDc3LCAweDY1NzMsCisgICAgMHg2NUEwLCAweDY2QTEsIDB4NjZBMCwgMHg2NjlGLCAweDY3MDUsIDB4NjcwNCwgMHg2NzIyLCAweDY5QjEsIDB4NjlCNiwKKyAgICAweDY5QzksIDB4NjlBMCwgMHg2OUNFLCAweDY5OTYsIDB4NjlCMCwgMHg2OUFDLCAweDY5QkMsIDB4Njk5MSwgMHg2OTk5LAorICAgIDB4Njk4RSwgMHg2OUE3LCAweDY5OEQsIDB4NjlBOSwgMHg2OUJFLCAweDY5QUYsIDB4NjlCRiwgMHg2OUM0LCAweDY5QkQsCisgICAgMHg2OUE0LCAweDY5RDQsIDB4NjlCOSwgMHg2OUNBLCAweDY5OUEsIDB4NjlDRiwgMHg2OUIzLCAweDY5OTMsIDB4NjlBQSwKKyAgICAweDY5QTEsIDB4Njk5RSwgMHg2OUQ5LCAweDY5OTcsIDB4Njk5MCwgMHg2OUMyLCAweDY5QjUsIDB4NjlBNSwgMHg2OUM2LAorICAgIDB4NkI0QSwgMHg2QjRELCAweDZCNEIsIDB4NkI5RSwgMHg2QjlGLCAweDZCQTAsIDB4NkJDMywgMHg2QkM0LCAweDZCRkUsCisgICAgMHg2RUNFLCAweDZFRjUsIDB4NkVGMSwgMHg2RjAzLCAweDZGMjUsIDB4NkVGOCwgMHg2RjM3LCAweDZFRkIsIDB4NkYyRSwKKyAgICAweDZGMDksIDB4NkY0RSwgMHg2RjE5LCAweDZGMUEsIDB4NkYyNywgMHg2RjE4LCAweDZGM0IsIDB4NkYxMiwgMHg2RUVELAorICAgIDB4NkYwQSwgMHg2RjM2LCAweDZGNzMsIDB4NkVGOSwgMHg2RUVFLCAweDZGMkQsIDB4NkY0MCwgMHg2RjMwLCAweDZGM0MsCisgICAgMHg2RjM1LCAweDZFRUIsIDB4NkYwNywgMHg2RjBFLCAweDZGNDMsIDB4NkYwNSwgMHg2RUZELCAweDZFRjYsIDB4NkYzOSwKKyAgICAweDZGMUMsIDB4NkVGQywgMHg2RjNBLCAweDZGMUYsIDB4NkYwRCwgMHg2RjFFLCAweDZGMDgsIDB4NkYyMSwgMHg3MTg3LAorICAgIDB4NzE5MCwgMHg3MTg5LCAweDcxODAsIDB4NzE4NSwgMHg3MTgyLCAweDcxOEYsIDB4NzE3QiwgMHg3MTg2LCAweDcxODEsCisgICAgMHg3MTk3LCAweDcyNDQsIDB4NzI1MywgMHg3Mjk3LCAweDcyOTUsIDB4NzI5MywgMHg3MzQzLCAweDczNEQsIDB4NzM1MSwKKyAgICAweDczNEMsIDB4NzQ2MiwgMHg3NDczLCAweDc0NzEsIDB4NzQ3NSwgMHg3NDcyLCAweDc0NjcsIDB4NzQ2RSwgMHg3NTAwLAorICAgIDB4NzUwMiwgMHg3NTAzLCAweDc1N0QsIDB4NzU5MCwgMHg3NjE2LCAweDc2MDgsIDB4NzYwQywgMHg3NjE1LCAweDc2MTEsCisgICAgMHg3NjBBLCAweDc2MTQsIDB4NzZCOCwgMHg3NzgxLCAweDc3N0MsIDB4Nzc4NSwgMHg3NzgyLCAweDc3NkUsIDB4Nzc4MCwKKyAgICAweDc3NkYsIDB4Nzc3RSwgMHg3NzgzLCAweDc4QjIsIDB4NzhBQSwgMHg3OEI0LCAweDc4QUQsIDB4NzhBOCwgMHg3ODdFLAorICAgIDB4NzhBQiwgMHg3ODlFLCAweDc4QTUsIDB4NzhBMCwgMHg3OEFDLCAweDc4QTIsIDB4NzhBNCwgMHg3OTk4LCAweDc5OEEsCisgICAgMHg3OThCLCAweDc5OTYsIDB4Nzk5NSwgMHg3OTk0LCAweDc5OTMsIDB4Nzk5NywgMHg3OTg4LCAweDc5OTIsIDB4Nzk5MCwKKyAgICAweDdBMkIsIDB4N0E0QSwgMHg3QTMwLCAweDdBMkYsIDB4N0EyOCwgMHg3QTI2LCAweDdBQTgsIDB4N0FBQiwgMHg3QUFDLAorICAgIDB4N0FFRSwgMHg3Qjg4LCAweDdCOUMsIDB4N0I4QSwgMHg3QjkxLCAweDdCOTAsIDB4N0I5NiwgMHg3QjhELCAweDdCOEMsCisgICAgMHg3QjlCLCAweDdCOEUsIDB4N0I4NSwgMHg3Qjk4LCAweDUyODQsIDB4N0I5OSwgMHg3QkE0LCAweDdCODIsIDB4N0NCQiwKKyAgICAweDdDQkYsIDB4N0NCQywgMHg3Q0JBLCAweDdEQTcsIDB4N0RCNywgMHg3REMyLCAweDdEQTMsIDB4N0RBQSwgMHg3REMxLAorICAgIDB4N0RDMCwgMHg3REM1LCAweDdEOUQsIDB4N0RDRSwgMHg3REM0LCAweDdEQzYsIDB4N0RDQiwgMHg3RENDLCAweDdEQUYsCisgICAgMHg3REI5LCAweDdEOTYsIDB4N0RCQywgMHg3RDlGLCAweDdEQTYsIDB4N0RBRSwgMHg3REE5LCAweDdEQTEsIDB4N0RDOSwKKyAgICAweDdGNzMsIDB4N0ZFMiwgMHg3RkUzLCAweDdGRTUsIDB4N0ZERSwgMHg4MDI0LCAweDgwNUQsIDB4ODA1QywgMHg4MTg5LAorICAgIDB4ODE4NiwgMHg4MTgzLCAweDgxODcsIDB4ODE4RCwgMHg4MThDLCAweDgxOEIsIDB4ODIxNSwgMHg4NDk3LCAweDg0QTQsCisgICAgMHg4NEExLCAweDg0OUYsIDB4ODRCQSwgMHg4NENFLCAweDg0QzIsIDB4ODRBQywgMHg4NEFFLCAweDg0QUIsIDB4ODRCOSwKKyAgICAweDg0QjQsIDB4ODRDMSwgMHg4NENELCAweDg0QUEsIDB4ODQ5QSwgMHg4NEIxLCAweDg0RDAsIDB4ODQ5RCwgMHg4NEE3LAorICAgIDB4ODRCQiwgMHg4NEEyLCAweDg0OTQsIDB4ODRDNywgMHg4NENDLCAweDg0OUIsIDB4ODRBOSwgMHg4NEFGLCAweDg0QTgsCisgICAgMHg4NEQ2LCAweDg0OTgsIDB4ODRCNiwgMHg4NENGLCAweDg0QTAsIDB4ODRENywgMHg4NEQ0LCAweDg0RDIsIDB4ODREQiwKKyAgICAweDg0QjAsIDB4ODQ5MSwgMHg4NjYxLCAweDg3MzMsIDB4ODcyMywgMHg4NzI4LCAweDg3NkIsIDB4ODc0MCwgMHg4NzJFLAorICAgIDB4ODcxRSwgMHg4NzIxLCAweDg3MTksIDB4ODcxQiwgMHg4NzQzLCAweDg3MkMsIDB4ODc0MSwgMHg4NzNFLCAweDg3NDYsCisgICAgMHg4NzIwLCAweDg3MzIsIDB4ODcyQSwgMHg4NzJELCAweDg3M0MsIDB4ODcxMiwgMHg4NzNBLCAweDg3MzEsIDB4ODczNSwKKyAgICAweDg3NDIsIDB4ODcyNiwgMHg4NzI3LCAweDg3MzgsIDB4ODcyNCwgMHg4NzFBLCAweDg3MzAsIDB4ODcxMSwgMHg4OEY3LAorICAgIDB4ODhFNywgMHg4OEYxLCAweDg4RjIsIDB4ODhGQSwgMHg4OEZFLCAweDg4RUUsIDB4ODhGQywgMHg4OEY2LCAweDg4RkIsCisgICAgMHg4OEYwLCAweDg4RUMsIDB4ODhFQiwgMHg4OTlELCAweDg5QTEsIDB4ODk5RiwgMHg4OTlFLCAweDg5RTksIDB4ODlFQiwKKyAgICAweDg5RTgsIDB4OEFBQiwgMHg4QTk5LCAweDhBOEIsIDB4OEE5MiwgMHg4QThGLCAweDhBOTYsIDB4OEMzRCwgMHg4QzY4LAorICAgIDB4OEM2OSwgMHg4Q0Q1LCAweDhDQ0YsIDB4OENENywgMHg4RDk2LCAweDhFMDksIDB4OEUwMiwgMHg4REZGLCAweDhFMEQsCisgICAgMHg4REZELCAweDhFMEEsIDB4OEUwMywgMHg4RTA3LCAweDhFMDYsIDB4OEUwNSwgMHg4REZFLCAweDhFMDAsIDB4OEUwNCwKKyAgICAweDhGMTAsIDB4OEYxMSwgMHg4RjBFLCAweDhGMEQsIDB4OTEyMywgMHg5MTFDLCAweDkxMjAsIDB4OTEyMiwgMHg5MTFGLAorICAgIDB4OTExRCwgMHg5MTFBLCAweDkxMjQsIDB4OTEyMSwgMHg5MTFCLCAweDkxN0EsIDB4OTE3MiwgMHg5MTc5LCAweDkxNzMsCisgICAgMHg5MkE1LCAweDkyQTQsIDB4OTI3NiwgMHg5MjlCLCAweDkyN0EsIDB4OTJBMCwgMHg5Mjk0LCAweDkyQUEsIDB4OTI4RCwKKyAgICAweDkyQTYsIDB4OTI5QSwgMHg5MkFCLCAweDkyNzksIDB4OTI5NywgMHg5MjdGLCAweDkyQTMsIDB4OTJFRSwgMHg5MjhFLAorICAgIDB4OTI4MiwgMHg5Mjk1LCAweDkyQTIsIDB4OTI3RCwgMHg5Mjg4LCAweDkyQTEsIDB4OTI4QSwgMHg5Mjg2LCAweDkyOEMsCisgICAgMHg5Mjk5LCAweDkyQTcsIDB4OTI3RSwgMHg5Mjg3LCAweDkyQTksIDB4OTI5RCwgMHg5MjhCLCAweDkyMkQsIDB4OTY5RSwKKyAgICAweDk2QTEsIDB4OTZGRiwgMHg5NzU4LCAweDk3N0QsIDB4OTc3QSwgMHg5NzdFLCAweDk3ODMsIDB4OTc4MCwgMHg5NzgyLAorICAgIDB4OTc3QiwgMHg5Nzg0LCAweDk3ODEsIDB4OTc3RiwgMHg5N0NFLCAweDk3Q0QsIDB4OTgxNiwgMHg5OEFELCAweDk4QUUsCisgICAgMHg5OTAyLCAweDk5MDAsIDB4OTkwNywgMHg5OTlELCAweDk5OUMsIDB4OTlDMywgMHg5OUI5LCAweDk5QkIsIDB4OTlCQSwKKyAgICAweDk5QzIsIDB4OTlCRCwgMHg5OUM3LCAweDlBQjEsIDB4OUFFMywgMHg5QUU3LCAweDlCM0UsIDB4OUIzRiwgMHg5QjYwLAorICAgIDB4OUI2MSwgMHg5QjVGLCAweDlDRjEsIDB4OUNGMiwgMHg5Q0Y1LCAweDlFQTcsIDB4NTBGRiwgMHg1MTAzLCAweDUxMzAsCisgICAgMHg1MEY4LCAweDUxMDYsIDB4NTEwNywgMHg1MEY2LCAweDUwRkUsIDB4NTEwQiwgMHg1MTBDLCAweDUwRkQsIDB4NTEwQSwKKyAgICAweDUyOEIsIDB4NTI4QywgMHg1MkYxLCAweDUyRUYsIDB4NTY0OCwgMHg1NjQyLCAweDU2NEMsIDB4NTYzNSwgMHg1NjQxLAorICAgIDB4NTY0QSwgMHg1NjQ5LCAweDU2NDYsIDB4NTY1OCwgMHg1NjVBLCAweDU2NDAsIDB4NTYzMywgMHg1NjNELCAweDU2MkMsCisgICAgMHg1NjNFLCAweDU2MzgsIDB4NTYyQSwgMHg1NjNBLCAweDU3MUEsIDB4NThBQiwgMHg1ODlELCAweDU4QjEsIDB4NThBMCwKKyAgICAweDU4QTMsIDB4NThBRiwgMHg1OEFDLCAweDU4QTUsIDB4NThBMSwgMHg1OEZGLCAweDVBRkYsIDB4NUFGNCwgMHg1QUZELAorICAgIDB4NUFGNywgMHg1QUY2LCAweDVCMDMsIDB4NUFGOCwgMHg1QjAyLCAweDVBRjksIDB4NUIwMSwgMHg1QjA3LCAweDVCMDUsCisgICAgMHg1QjBGLCAweDVDNjcsIDB4NUQ5OSwgMHg1RDk3LCAweDVEOUYsIDB4NUQ5MiwgMHg1REEyLCAweDVEOTMsIDB4NUQ5NSwKKyAgICAweDVEQTAsIDB4NUQ5QywgMHg1REExLCAweDVEOUEsIDB4NUQ5RSwgMHg1RTY5LCAweDVFNUQsIDB4NUU2MCwgMHg1RTVDLAorICAgIDB4N0RGMywgMHg1RURCLCAweDVFREUsIDB4NUVFMSwgMHg1RjQ5LCAweDVGQjIsIDB4NjE4QiwgMHg2MTgzLCAweDYxNzksCisgICAgMHg2MUIxLCAweDYxQjAsIDB4NjFBMiwgMHg2MTg5LCAweDYxOUIsIDB4NjE5MywgMHg2MUFGLCAweDYxQUQsIDB4NjE5RiwKKyAgICAweDYxOTIsIDB4NjFBQSwgMHg2MUExLCAweDYxOEQsIDB4NjE2NiwgMHg2MUIzLCAweDYyMkQsIDB4NjQ2RSwgMHg2NDcwLAorICAgIDB4NjQ5NiwgMHg2NEEwLCAweDY0ODUsIDB4NjQ5NywgMHg2NDlDLCAweDY0OEYsIDB4NjQ4QiwgMHg2NDhBLCAweDY0OEMsCisgICAgMHg2NEEzLCAweDY0OUYsIDB4NjQ2OCwgMHg2NEIxLCAweDY0OTgsIDB4NjU3NiwgMHg2NTdBLCAweDY1NzksIDB4NjU3QiwKKyAgICAweDY1QjIsIDB4NjVCMywgMHg2NkI1LCAweDY2QjAsIDB4NjZBOSwgMHg2NkIyLCAweDY2QjcsIDB4NjZBQSwgMHg2NkFGLAorICAgIDB4NkEwMCwgMHg2QTA2LCAweDZBMTcsIDB4NjlFNSwgMHg2OUY4LCAweDZBMTUsIDB4NjlGMSwgMHg2OUU0LCAweDZBMjAsCisgICAgMHg2OUZGLCAweDY5RUMsIDB4NjlFMiwgMHg2QTFCLCAweDZBMUQsIDB4NjlGRSwgMHg2QTI3LCAweDY5RjIsIDB4NjlFRSwKKyAgICAweDZBMTQsIDB4NjlGNywgMHg2OUU3LCAweDZBNDAsIDB4NkEwOCwgMHg2OUU2LCAweDY5RkIsIDB4NkEwRCwgMHg2OUZDLAorICAgIDB4NjlFQiwgMHg2QTA5LCAweDZBMDQsIDB4NkExOCwgMHg2QTI1LCAweDZBMEYsIDB4NjlGNiwgMHg2QTI2LCAweDZBMDcsCisgICAgMHg2OUY0LCAweDZBMTYsIDB4NkI1MSwgMHg2QkE1LCAweDZCQTMsIDB4NkJBMiwgMHg2QkE2LCAweDZDMDEsIDB4NkMwMCwKKyAgICAweDZCRkYsIDB4NkMwMiwgMHg2RjQxLCAweDZGMjYsIDB4NkY3RSwgMHg2Rjg3LCAweDZGQzYsIDB4NkY5MiwgMHg2RjhELAorICAgIDB4NkY4OSwgMHg2RjhDLCAweDZGNjIsIDB4NkY0RiwgMHg2Rjg1LCAweDZGNUEsIDB4NkY5NiwgMHg2Rjc2LCAweDZGNkMsCisgICAgMHg2RjgyLCAweDZGNTUsIDB4NkY3MiwgMHg2RjUyLCAweDZGNTAsIDB4NkY1NywgMHg2Rjk0LCAweDZGOTMsIDB4NkY1RCwKKyAgICAweDZGMDAsIDB4NkY2MSwgMHg2RjZCLCAweDZGN0QsIDB4NkY2NywgMHg2RjkwLCAweDZGNTMsIDB4NkY4QiwgMHg2RjY5LAorICAgIDB4NkY3RiwgMHg2Rjk1LCAweDZGNjMsIDB4NkY3NywgMHg2RjZBLCAweDZGN0IsIDB4NzFCMiwgMHg3MUFGLCAweDcxOUIsCisgICAgMHg3MUIwLCAweDcxQTAsIDB4NzE5QSwgMHg3MUE5LCAweDcxQjUsIDB4NzE5RCwgMHg3MUE1LCAweDcxOUUsIDB4NzFBNCwKKyAgICAweDcxQTEsIDB4NzFBQSwgMHg3MTlDLCAweDcxQTcsIDB4NzFCMywgMHg3Mjk4LCAweDcyOUEsIDB4NzM1OCwgMHg3MzUyLAorICAgIDB4NzM1RSwgMHg3MzVGLCAweDczNjAsIDB4NzM1RCwgMHg3MzVCLCAweDczNjEsIDB4NzM1QSwgMHg3MzU5LCAweDczNjIsCisgICAgMHg3NDg3LCAweDc0ODksIDB4NzQ4QSwgMHg3NDg2LCAweDc0ODEsIDB4NzQ3RCwgMHg3NDg1LCAweDc0ODgsIDB4NzQ3QywKKyAgICAweDc0NzksIDB4NzUwOCwgMHg3NTA3LCAweDc1N0UsIDB4NzYyNSwgMHg3NjFFLCAweDc2MTksIDB4NzYxRCwgMHg3NjFDLAorICAgIDB4NzYyMywgMHg3NjFBLCAweDc2MjgsIDB4NzYxQiwgMHg3NjlDLCAweDc2OUQsIDB4NzY5RSwgMHg3NjlCLCAweDc3OEQsCisgICAgMHg3NzhGLCAweDc3ODksIDB4Nzc4OCwgMHg3OENELCAweDc4QkIsIDB4NzhDRiwgMHg3OENDLCAweDc4RDEsIDB4NzhDRSwKKyAgICAweDc4RDQsIDB4NzhDOCwgMHg3OEMzLCAweDc4QzQsIDB4NzhDOSwgMHg3OTlBLCAweDc5QTEsIDB4NzlBMCwgMHg3OTlDLAorICAgIDB4NzlBMiwgMHg3OTlCLCAweDZCNzYsIDB4N0EzOSwgMHg3QUIyLCAweDdBQjQsIDB4N0FCMywgMHg3QkI3LCAweDdCQ0IsCisgICAgMHg3QkJFLCAweDdCQUMsIDB4N0JDRSwgMHg3QkFGLCAweDdCQjksIDB4N0JDQSwgMHg3QkI1LCAweDdDQzUsIDB4N0NDOCwKKyAgICAweDdDQ0MsIDB4N0NDQiwgMHg3REY3LCAweDdEREIsIDB4N0RFQSwgMHg3REU3LCAweDdERDcsIDB4N0RFMSwgMHg3RTAzLAorICAgIDB4N0RGQSwgMHg3REU2LCAweDdERjYsIDB4N0RGMSwgMHg3REYwLCAweDdERUUsIDB4N0RERiwgMHg3Rjc2LCAweDdGQUMsCisgICAgMHg3RkIwLCAweDdGQUQsIDB4N0ZFRCwgMHg3RkVCLCAweDdGRUEsIDB4N0ZFQywgMHg3RkU2LCAweDdGRTgsIDB4ODA2NCwKKyAgICAweDgwNjcsIDB4ODFBMywgMHg4MTlGLCAweDgxOUUsIDB4ODE5NSwgMHg4MUEyLCAweDgxOTksIDB4ODE5NywgMHg4MjE2LAorICAgIDB4ODI0RiwgMHg4MjUzLCAweDgyNTIsIDB4ODI1MCwgMHg4MjRFLCAweDgyNTEsIDB4ODUyNCwgMHg4NTNCLCAweDg1MEYsCisgICAgMHg4NTAwLCAweDg1MjksIDB4ODUwRSwgMHg4NTA5LCAweDg1MEQsIDB4ODUxRiwgMHg4NTBBLCAweDg1MjcsIDB4ODUxQywKKyAgICAweDg0RkIsIDB4ODUyQiwgMHg4NEZBLCAweDg1MDgsIDB4ODUwQywgMHg4NEY0LCAweDg1MkEsIDB4ODRGMiwgMHg4NTE1LAorICAgIDB4ODRGNywgMHg4NEVCLCAweDg0RjMsIDB4ODRGQywgMHg4NTEyLCAweDg0RUEsIDB4ODRFOSwgMHg4NTE2LCAweDg0RkUsCisgICAgMHg4NTI4LCAweDg1MUQsIDB4ODUyRSwgMHg4NTAyLCAweDg0RkQsIDB4ODUxRSwgMHg4NEY2LCAweDg1MzEsIDB4ODUyNiwKKyAgICAweDg0RTcsIDB4ODRFOCwgMHg4NEYwLCAweDg0RUYsIDB4ODRGOSwgMHg4NTE4LCAweDg1MjAsIDB4ODUzMCwgMHg4NTBCLAorICAgIDB4ODUxOSwgMHg4NTJGLCAweDg2NjIsIDB4ODc1NiwgMHg4NzYzLCAweDg3NjQsIDB4ODc3NywgMHg4N0UxLCAweDg3NzMsCisgICAgMHg4NzU4LCAweDg3NTQsIDB4ODc1QiwgMHg4NzUyLCAweDg3NjEsIDB4ODc1QSwgMHg4NzUxLCAweDg3NUUsIDB4ODc2RCwKKyAgICAweDg3NkEsIDB4ODc1MCwgMHg4NzRFLCAweDg3NUYsIDB4ODc1RCwgMHg4NzZGLCAweDg3NkMsIDB4ODc3QSwgMHg4NzZFLAorICAgIDB4ODc1QywgMHg4NzY1LCAweDg3NEYsIDB4ODc3QiwgMHg4Nzc1LCAweDg3NjIsIDB4ODc2NywgMHg4NzY5LCAweDg4NUEsCisgICAgMHg4OTA1LCAweDg5MEMsIDB4ODkxNCwgMHg4OTBCLCAweDg5MTcsIDB4ODkxOCwgMHg4OTE5LCAweDg5MDYsIDB4ODkxNiwKKyAgICAweDg5MTEsIDB4ODkwRSwgMHg4OTA5LCAweDg5QTIsIDB4ODlBNCwgMHg4OUEzLCAweDg5RUQsIDB4ODlGMCwgMHg4OUVDLAorICAgIDB4OEFDRiwgMHg4QUM2LCAweDhBQjgsIDB4OEFEMywgMHg4QUQxLCAweDhBRDQsIDB4OEFENSwgMHg4QUJCLCAweDhBRDcsCisgICAgMHg4QUJFLCAweDhBQzAsIDB4OEFDNSwgMHg4QUQ4LCAweDhBQzMsIDB4OEFCQSwgMHg4QUJELCAweDhBRDksIDB4OEMzRSwKKyAgICAweDhDNEQsIDB4OEM4RiwgMHg4Q0U1LCAweDhDREYsIDB4OENEOSwgMHg4Q0U4LCAweDhDREEsIDB4OENERCwgMHg4Q0U3LAorICAgIDB4OERBMCwgMHg4RDlDLCAweDhEQTEsIDB4OEQ5QiwgMHg4RTIwLCAweDhFMjMsIDB4OEUyNSwgMHg4RTI0LCAweDhFMkUsCisgICAgMHg4RTE1LCAweDhFMUIsIDB4OEUxNiwgMHg4RTExLCAweDhFMTksIDB4OEUyNiwgMHg4RTI3LCAweDhFMTQsIDB4OEUxMiwKKyAgICAweDhFMTgsIDB4OEUxMywgMHg4RTFDLCAweDhFMTcsIDB4OEUxQSwgMHg4RjJDLCAweDhGMjQsIDB4OEYxOCwgMHg4RjFBLAorICAgIDB4OEYyMCwgMHg4RjIzLCAweDhGMTYsIDB4OEYxNywgMHg5MDczLCAweDkwNzAsIDB4OTA2RiwgMHg5MDY3LCAweDkwNkIsCisgICAgMHg5MTJGLCAweDkxMkIsIDB4OTEyOSwgMHg5MTJBLCAweDkxMzIsIDB4OTEyNiwgMHg5MTJFLCAweDkxODUsIDB4OTE4NiwKKyAgICAweDkxOEEsIDB4OTE4MSwgMHg5MTgyLCAweDkxODQsIDB4OTE4MCwgMHg5MkQwLCAweDkyQzMsIDB4OTJDNCwgMHg5MkMwLAorICAgIDB4OTJEOSwgMHg5MkI2LCAweDkyQ0YsIDB4OTJGMSwgMHg5MkRGLCAweDkyRDgsIDB4OTJFOSwgMHg5MkQ3LCAweDkyREQsCisgICAgMHg5MkNDLCAweDkyRUYsIDB4OTJDMiwgMHg5MkU4LCAweDkyQ0EsIDB4OTJDOCwgMHg5MkNFLCAweDkyRTYsIDB4OTJDRCwKKyAgICAweDkyRDUsIDB4OTJDOSwgMHg5MkUwLCAweDkyREUsIDB4OTJFNywgMHg5MkQxLCAweDkyRDMsIDB4OTJCNSwgMHg5MkUxLAorICAgIDB4OTMyNSwgMHg5MkM2LCAweDkyQjQsIDB4OTU3QywgMHg5NUFDLCAweDk1QUIsIDB4OTVBRSwgMHg5NUIwLCAweDk2QTQsCisgICAgMHg5NkEyLCAweDk2RDMsIDB4OTcwNSwgMHg5NzA4LCAweDk3MDIsIDB4OTc1QSwgMHg5NzhBLCAweDk3OEUsIDB4OTc4OCwKKyAgICAweDk3RDAsIDB4OTdDRiwgMHg5ODFFLCAweDk4MUQsIDB4OTgyNiwgMHg5ODI5LCAweDk4MjgsIDB4OTgyMCwgMHg5ODFCLAorICAgIDB4OTgyNywgMHg5OEIyLCAweDk5MDgsIDB4OThGQSwgMHg5OTExLCAweDk5MTQsIDB4OTkxNiwgMHg5OTE3LCAweDk5MTUsCisgICAgMHg5OURDLCAweDk5Q0QsIDB4OTlDRiwgMHg5OUQzLCAweDk5RDQsIDB4OTlDRSwgMHg5OUM5LCAweDk5RDYsIDB4OTlEOCwKKyAgICAweDk5Q0IsIDB4OTlENywgMHg5OUNDLCAweDlBQjMsIDB4OUFFQywgMHg5QUVCLCAweDlBRjMsIDB4OUFGMiwgMHg5QUYxLAorICAgIDB4OUI0NiwgMHg5QjQzLCAweDlCNjcsIDB4OUI3NCwgMHg5QjcxLCAweDlCNjYsIDB4OUI3NiwgMHg5Qjc1LCAweDlCNzAsCisgICAgMHg5QjY4LCAweDlCNjQsIDB4OUI2QywgMHg5Q0ZDLCAweDlDRkEsIDB4OUNGRCwgMHg5Q0ZGLCAweDlDRjcsIDB4OUQwNywKKyAgICAweDlEMDAsIDB4OUNGOSwgMHg5Q0ZCLCAweDlEMDgsIDB4OUQwNSwgMHg5RDA0LCAweDlFODMsIDB4OUVEMywgMHg5RjBGLAorICAgIDB4OUYxMCwgMHg1MTFDLCAweDUxMTMsIDB4NTExNywgMHg1MTFBLCAweDUxMTEsIDB4NTFERSwgMHg1MzM0LCAweDUzRTEsCisgICAgMHg1NjcwLCAweDU2NjAsIDB4NTY2RSwgMHg1NjczLCAweDU2NjYsIDB4NTY2MywgMHg1NjZELCAweDU2NzIsIDB4NTY1RSwKKyAgICAweDU2NzcsIDB4NTcxQywgMHg1NzFCLCAweDU4QzgsIDB4NThCRCwgMHg1OEM5LCAweDU4QkYsIDB4NThCQSwgMHg1OEMyLAorICAgIDB4NThCQywgMHg1OEM2LCAweDVCMTcsIDB4NUIxOSwgMHg1QjFCLCAweDVCMjEsIDB4NUIxNCwgMHg1QjEzLCAweDVCMTAsCisgICAgMHg1QjE2LCAweDVCMjgsIDB4NUIxQSwgMHg1QjIwLCAweDVCMUUsIDB4NUJFRiwgMHg1REFDLCAweDVEQjEsIDB4NURBOSwKKyAgICAweDVEQTcsIDB4NURCNSwgMHg1REIwLCAweDVEQUUsIDB4NURBQSwgMHg1REE4LCAweDVEQjIsIDB4NURBRCwgMHg1REFGLAorICAgIDB4NURCNCwgMHg1RTY3LCAweDVFNjgsIDB4NUU2NiwgMHg1RTZGLCAweDVFRTksIDB4NUVFNywgMHg1RUU2LCAweDVFRTgsCisgICAgMHg1RUU1LCAweDVGNEIsIDB4NUZCQywgMHg1RkJCLCAweDYxOUQsIDB4NjFBOCwgMHg2MTk2LCAweDYxQzUsIDB4NjFCNCwKKyAgICAweDYxQzYsIDB4NjFDMSwgMHg2MUNDLCAweDYxQkEsIDB4NjFCRiwgMHg2MUI4LCAweDYxOEMsIDB4NjRENywgMHg2NEQ2LAorICAgIDB4NjREMCwgMHg2NENGLCAweDY0QzksIDB4NjRCRCwgMHg2NDg5LCAweDY0QzMsIDB4NjREQiwgMHg2NEYzLCAweDY0RDksCisgICAgMHg2NTMzLCAweDY1N0YsIDB4NjU3QywgMHg2NUEyLCAweDY2QzgsIDB4NjZCRSwgMHg2NkMwLCAweDY2Q0EsIDB4NjZDQiwKKyAgICAweDY2Q0YsIDB4NjZCRCwgMHg2NkJCLCAweDY2QkEsIDB4NjZDQywgMHg2NzIzLCAweDZBMzQsIDB4NkE2NiwgMHg2QTQ5LAorICAgIDB4NkE2NywgMHg2QTMyLCAweDZBNjgsIDB4NkEzRSwgMHg2QTVELCAweDZBNkQsIDB4NkE3NiwgMHg2QTVCLCAweDZBNTEsCisgICAgMHg2QTI4LCAweDZBNUEsIDB4NkEzQiwgMHg2QTNGLCAweDZBNDEsIDB4NkE2QSwgMHg2QTY0LCAweDZBNTAsIDB4NkE0RiwKKyAgICAweDZBNTQsIDB4NkE2RiwgMHg2QTY5LCAweDZBNjAsIDB4NkEzQywgMHg2QTVFLCAweDZBNTYsIDB4NkE1NSwgMHg2QTRELAorICAgIDB4NkE0RSwgMHg2QTQ2LCAweDZCNTUsIDB4NkI1NCwgMHg2QjU2LCAweDZCQTcsIDB4NkJBQSwgMHg2QkFCLCAweDZCQzgsCisgICAgMHg2QkM3LCAweDZDMDQsIDB4NkMwMywgMHg2QzA2LCAweDZGQUQsIDB4NkZDQiwgMHg2RkEzLCAweDZGQzcsIDB4NkZCQywKKyAgICAweDZGQ0UsIDB4NkZDOCwgMHg2RjVFLCAweDZGQzQsIDB4NkZCRCwgMHg2RjlFLCAweDZGQ0EsIDB4NkZBOCwgMHg3MDA0LAorICAgIDB4NkZBNSwgMHg2RkFFLCAweDZGQkEsIDB4NkZBQywgMHg2RkFBLCAweDZGQ0YsIDB4NkZCRiwgMHg2RkI4LCAweDZGQTIsCisgICAgMHg2RkM5LCAweDZGQUIsIDB4NkZDRCwgMHg2RkFGLCAweDZGQjIsIDB4NkZCMCwgMHg3MUM1LCAweDcxQzIsIDB4NzFCRiwKKyAgICAweDcxQjgsIDB4NzFENiwgMHg3MUMwLCAweDcxQzEsIDB4NzFDQiwgMHg3MUQ0LCAweDcxQ0EsIDB4NzFDNywgMHg3MUNGLAorICAgIDB4NzFCRCwgMHg3MUQ4LCAweDcxQkMsIDB4NzFDNiwgMHg3MURBLCAweDcxREIsIDB4NzI5RCwgMHg3MjlFLCAweDczNjksCisgICAgMHg3MzY2LCAweDczNjcsIDB4NzM2QywgMHg3MzY1LCAweDczNkIsIDB4NzM2QSwgMHg3NDdGLCAweDc0OUEsIDB4NzRBMCwKKyAgICAweDc0OTQsIDB4NzQ5MiwgMHg3NDk1LCAweDc0QTEsIDB4NzUwQiwgMHg3NTgwLCAweDc2MkYsIDB4NzYyRCwgMHg3NjMxLAorICAgIDB4NzYzRCwgMHg3NjMzLCAweDc2M0MsIDB4NzYzNSwgMHg3NjMyLCAweDc2MzAsIDB4NzZCQiwgMHg3NkU2LCAweDc3OUEsCisgICAgMHg3NzlELCAweDc3QTEsIDB4Nzc5QywgMHg3NzlCLCAweDc3QTIsIDB4NzdBMywgMHg3Nzk1LCAweDc3OTksIDB4Nzc5NywKKyAgICAweDc4REQsIDB4NzhFOSwgMHg3OEU1LCAweDc4RUEsIDB4NzhERSwgMHg3OEUzLCAweDc4REIsIDB4NzhFMSwgMHg3OEUyLAorICAgIDB4NzhFRCwgMHg3OERGLCAweDc4RTAsIDB4NzlBNCwgMHg3QTQ0LCAweDdBNDgsIDB4N0E0NywgMHg3QUI2LCAweDdBQjgsCisgICAgMHg3QUI1LCAweDdBQjEsIDB4N0FCNywgMHg3QkRFLCAweDdCRTMsIDB4N0JFNywgMHg3QkRELCAweDdCRDUsIDB4N0JFNSwKKyAgICAweDdCREEsIDB4N0JFOCwgMHg3QkY5LCAweDdCRDQsIDB4N0JFQSwgMHg3QkUyLCAweDdCREMsIDB4N0JFQiwgMHg3QkQ4LAorICAgIDB4N0JERiwgMHg3Q0QyLCAweDdDRDQsIDB4N0NENywgMHg3Q0QwLCAweDdDRDEsIDB4N0UxMiwgMHg3RTIxLCAweDdFMTcsCisgICAgMHg3RTBDLCAweDdFMUYsIDB4N0UyMCwgMHg3RTEzLCAweDdFMEUsIDB4N0UxQywgMHg3RTE1LCAweDdFMUEsIDB4N0UyMiwKKyAgICAweDdFMEIsIDB4N0UwRiwgMHg3RTE2LCAweDdFMEQsIDB4N0UxNCwgMHg3RTI1LCAweDdFMjQsIDB4N0Y0MywgMHg3RjdCLAorICAgIDB4N0Y3QywgMHg3RjdBLCAweDdGQjEsIDB4N0ZFRiwgMHg4MDJBLCAweDgwMjksIDB4ODA2QywgMHg4MUIxLCAweDgxQTYsCisgICAgMHg4MUFFLCAweDgxQjksIDB4ODFCNSwgMHg4MUFCLCAweDgxQjAsIDB4ODFBQywgMHg4MUI0LCAweDgxQjIsIDB4ODFCNywKKyAgICAweDgxQTcsIDB4ODFGMiwgMHg4MjU1LCAweDgyNTYsIDB4ODI1NywgMHg4NTU2LCAweDg1NDUsIDB4ODU2QiwgMHg4NTRELAorICAgIDB4ODU1MywgMHg4NTYxLCAweDg1NTgsIDB4ODU0MCwgMHg4NTQ2LCAweDg1NjQsIDB4ODU0MSwgMHg4NTYyLCAweDg1NDQsCisgICAgMHg4NTUxLCAweDg1NDcsIDB4ODU2MywgMHg4NTNFLCAweDg1NUIsIDB4ODU3MSwgMHg4NTRFLCAweDg1NkUsIDB4ODU3NSwKKyAgICAweDg1NTUsIDB4ODU2NywgMHg4NTYwLCAweDg1OEMsIDB4ODU2NiwgMHg4NTVELCAweDg1NTQsIDB4ODU2NSwgMHg4NTZDLAorICAgIDB4ODY2MywgMHg4NjY1LCAweDg2NjQsIDB4ODdBNCwgMHg4NzlCLCAweDg3OEYsIDB4ODc5NywgMHg4NzkzLCAweDg3OTIsCisgICAgMHg4Nzg4LCAweDg3ODEsIDB4ODc5NiwgMHg4Nzk4LCAweDg3NzksIDB4ODc4NywgMHg4N0EzLCAweDg3ODUsIDB4ODc5MCwKKyAgICAweDg3OTEsIDB4ODc5RCwgMHg4Nzg0LCAweDg3OTQsIDB4ODc5QywgMHg4NzlBLCAweDg3ODksIDB4ODkxRSwgMHg4OTI2LAorICAgIDB4ODkzMCwgMHg4OTJELCAweDg5MkUsIDB4ODkyNywgMHg4OTMxLCAweDg5MjIsIDB4ODkyOSwgMHg4OTIzLCAweDg5MkYsCisgICAgMHg4OTJDLCAweDg5MUYsIDB4ODlGMSwgMHg4QUUwLCAweDhBRTIsIDB4OEFGMiwgMHg4QUY0LCAweDhBRjUsIDB4OEFERCwKKyAgICAweDhCMTQsIDB4OEFFNCwgMHg4QURGLCAweDhBRjAsIDB4OEFDOCwgMHg4QURFLCAweDhBRTEsIDB4OEFFOCwgMHg4QUZGLAorICAgIDB4OEFFRiwgMHg4QUZCLCAweDhDOTEsIDB4OEM5MiwgMHg4QzkwLCAweDhDRjUsIDB4OENFRSwgMHg4Q0YxLCAweDhDRjAsCisgICAgMHg4Q0YzLCAweDhENkMsIDB4OEQ2RSwgMHg4REE1LCAweDhEQTcsIDB4OEUzMywgMHg4RTNFLCAweDhFMzgsIDB4OEU0MCwKKyAgICAweDhFNDUsIDB4OEUzNiwgMHg4RTNDLCAweDhFM0QsIDB4OEU0MSwgMHg4RTMwLCAweDhFM0YsIDB4OEVCRCwgMHg4RjM2LAorICAgIDB4OEYyRSwgMHg4RjM1LCAweDhGMzIsIDB4OEYzOSwgMHg4RjM3LCAweDhGMzQsIDB4OTA3NiwgMHg5MDc5LCAweDkwN0IsCisgICAgMHg5MDg2LCAweDkwRkEsIDB4OTEzMywgMHg5MTM1LCAweDkxMzYsIDB4OTE5MywgMHg5MTkwLCAweDkxOTEsIDB4OTE4RCwKKyAgICAweDkxOEYsIDB4OTMyNywgMHg5MzFFLCAweDkzMDgsIDB4OTMxRiwgMHg5MzA2LCAweDkzMEYsIDB4OTM3QSwgMHg5MzM4LAorICAgIDB4OTMzQywgMHg5MzFCLCAweDkzMjMsIDB4OTMxMiwgMHg5MzAxLCAweDkzNDYsIDB4OTMyRCwgMHg5MzBFLCAweDkzMEQsCisgICAgMHg5MkNCLCAweDkzMUQsIDB4OTJGQSwgMHg5MzEzLCAweDkyRjksIDB4OTJGNywgMHg5MzM0LCAweDkzMDIsIDB4OTMyNCwKKyAgICAweDkyRkYsIDB4OTMyOSwgMHg5MzM5LCAweDkzMzUsIDB4OTMyQSwgMHg5MzE0LCAweDkzMEMsIDB4OTMwQiwgMHg5MkZFLAorICAgIDB4OTMwOSwgMHg5MzAwLCAweDkyRkIsIDB4OTMxNiwgMHg5NUJDLCAweDk1Q0QsIDB4OTVCRSwgMHg5NUI5LCAweDk1QkEsCisgICAgMHg5NUI2LCAweDk1QkYsIDB4OTVCNSwgMHg5NUJELCAweDk2QTksIDB4OTZENCwgMHg5NzBCLCAweDk3MTIsIDB4OTcxMCwKKyAgICAweDk3OTksIDB4OTc5NywgMHg5Nzk0LCAweDk3RjAsIDB4OTdGOCwgMHg5ODM1LCAweDk4MkYsIDB4OTgzMiwgMHg5OTI0LAorICAgIDB4OTkxRiwgMHg5OTI3LCAweDk5MjksIDB4OTk5RSwgMHg5OUVFLCAweDk5RUMsIDB4OTlFNSwgMHg5OUU0LCAweDk5RjAsCisgICAgMHg5OUUzLCAweDk5RUEsIDB4OTlFOSwgMHg5OUU3LCAweDlBQjksIDB4OUFCRiwgMHg5QUI0LCAweDlBQkIsIDB4OUFGNiwKKyAgICAweDlBRkEsIDB4OUFGOSwgMHg5QUY3LCAweDlCMzMsIDB4OUI4MCwgMHg5Qjg1LCAweDlCODcsIDB4OUI3QywgMHg5QjdFLAorICAgIDB4OUI3QiwgMHg5QjgyLCAweDlCOTMsIDB4OUI5MiwgMHg5QjkwLCAweDlCN0EsIDB4OUI5NSwgMHg5QjdELCAweDlCODgsCisgICAgMHg5RDI1LCAweDlEMTcsIDB4OUQyMCwgMHg5RDFFLCAweDlEMTQsIDB4OUQyOSwgMHg5RDFELCAweDlEMTgsIDB4OUQyMiwKKyAgICAweDlEMTAsIDB4OUQxOSwgMHg5RDFGLCAweDlFODgsIDB4OUU4NiwgMHg5RTg3LCAweDlFQUUsIDB4OUVBRCwgMHg5RUQ1LAorICAgIDB4OUVENiwgMHg5RUZBLCAweDlGMTIsIDB4OUYzRCwgMHg1MTI2LCAweDUxMjUsIDB4NTEyMiwgMHg1MTI0LCAweDUxMjAsCisgICAgMHg1MTI5LCAweDUyRjQsIDB4NTY5MywgMHg1NjhDLCAweDU2OEQsIDB4NTY4NiwgMHg1Njg0LCAweDU2ODMsIDB4NTY3RSwKKyAgICAweDU2ODIsIDB4NTY3RiwgMHg1NjgxLCAweDU4RDYsIDB4NThENCwgMHg1OENGLCAweDU4RDIsIDB4NUIyRCwgMHg1QjI1LAorICAgIDB4NUIzMiwgMHg1QjIzLCAweDVCMkMsIDB4NUIyNywgMHg1QjI2LCAweDVCMkYsIDB4NUIyRSwgMHg1QjdCLCAweDVCRjEsCisgICAgMHg1QkYyLCAweDVEQjcsIDB4NUU2QywgMHg1RTZBLCAweDVGQkUsIDB4NjFDMywgMHg2MUI1LCAweDYxQkMsIDB4NjFFNywKKyAgICAweDYxRTAsIDB4NjFFNSwgMHg2MUU0LCAweDYxRTgsIDB4NjFERSwgMHg2NEVGLCAweDY0RTksIDB4NjRFMywgMHg2NEVCLAorICAgIDB4NjRFNCwgMHg2NEU4LCAweDY1ODEsIDB4NjU4MCwgMHg2NUI2LCAweDY1REEsIDB4NjZEMiwgMHg2QThELCAweDZBOTYsCisgICAgMHg2QTgxLCAweDZBQTUsIDB4NkE4OSwgMHg2QTlGLCAweDZBOUIsIDB4NkFBMSwgMHg2QTlFLCAweDZBODcsIDB4NkE5MywKKyAgICAweDZBOEUsIDB4NkE5NSwgMHg2QTgzLCAweDZBQTgsIDB4NkFBNCwgMHg2QTkxLCAweDZBN0YsIDB4NkFBNiwgMHg2QTlBLAorICAgIDB4NkE4NSwgMHg2QThDLCAweDZBOTIsIDB4NkI1QiwgMHg2QkFELCAweDZDMDksIDB4NkZDQywgMHg2RkE5LCAweDZGRjQsCisgICAgMHg2RkQ0LCAweDZGRTMsIDB4NkZEQywgMHg2RkVELCAweDZGRTcsIDB4NkZFNiwgMHg2RkRFLCAweDZGRjIsIDB4NkZERCwKKyAgICAweDZGRTIsIDB4NkZFOCwgMHg3MUUxLCAweDcxRjEsIDB4NzFFOCwgMHg3MUYyLCAweDcxRTQsIDB4NzFGMCwgMHg3MUUyLAorICAgIDB4NzM3MywgMHg3MzZFLCAweDczNkYsIDB4NzQ5NywgMHg3NEIyLCAweDc0QUIsIDB4NzQ5MCwgMHg3NEFBLCAweDc0QUQsCisgICAgMHg3NEIxLCAweDc0QTUsIDB4NzRBRiwgMHg3NTEwLCAweDc1MTEsIDB4NzUxMiwgMHg3NTBGLCAweDc1ODQsIDB4NzY0MywKKyAgICAweDc2NDgsIDB4NzY0OSwgMHg3NjQ3LCAweDc2QTQsIDB4NzZFOSwgMHg3N0I1LCAweDc3QUIsIDB4NzdCMiwgMHg3N0I3LAorICAgIDB4NzdCNiwgMHg3N0I0LCAweDc3QjEsIDB4NzdBOCwgMHg3N0YwLCAweDc4RjMsIDB4NzhGRCwgMHg3OTAyLCAweDc4RkIsCisgICAgMHg3OEZDLCAweDc4RkYsIDB4NzhGMiwgMHg3OTA1LCAweDc4RjksIDB4NzhGRSwgMHg3OTA0LCAweDc5QUIsIDB4NzlBOCwKKyAgICAweDdBNUMsIDB4N0E1QiwgMHg3QTU2LCAweDdBNTgsIDB4N0E1NCwgMHg3QTVBLCAweDdBQkUsIDB4N0FDMCwgMHg3QUMxLAorICAgIDB4N0MwNSwgMHg3QzBGLCAweDdCRjIsIDB4N0MwMCwgMHg3QkZGLCAweDdCRkIsIDB4N0MwRSwgMHg3QkY0LCAweDdDMEIsCisgICAgMHg3QkYzLCAweDdDMDIsIDB4N0MwOSwgMHg3QzAzLCAweDdDMDEsIDB4N0JGOCwgMHg3QkZELCAweDdDMDYsIDB4N0JGMCwKKyAgICAweDdCRjEsIDB4N0MxMCwgMHg3QzBBLCAweDdDRTgsIDB4N0UyRCwgMHg3RTNDLCAweDdFNDIsIDB4N0UzMywgMHg5ODQ4LAorICAgIDB4N0UzOCwgMHg3RTJBLCAweDdFNDksIDB4N0U0MCwgMHg3RTQ3LCAweDdFMjksIDB4N0U0QywgMHg3RTMwLCAweDdFM0IsCisgICAgMHg3RTM2LCAweDdFNDQsIDB4N0UzQSwgMHg3RjQ1LCAweDdGN0YsIDB4N0Y3RSwgMHg3RjdELCAweDdGRjQsIDB4N0ZGMiwKKyAgICAweDgwMkMsIDB4ODFCQiwgMHg4MUM0LCAweDgxQ0MsIDB4ODFDQSwgMHg4MUM1LCAweDgxQzcsIDB4ODFCQywgMHg4MUU5LAorICAgIDB4ODI1QiwgMHg4MjVBLCAweDgyNUMsIDB4ODU4MywgMHg4NTgwLCAweDg1OEYsIDB4ODVBNywgMHg4NTk1LCAweDg1QTAsCisgICAgMHg4NThCLCAweDg1QTMsIDB4ODU3QiwgMHg4NUE0LCAweDg1OUEsIDB4ODU5RSwgMHg4NTc3LCAweDg1N0MsIDB4ODU4OSwKKyAgICAweDg1QTEsIDB4ODU3QSwgMHg4NTc4LCAweDg1NTcsIDB4ODU4RSwgMHg4NTk2LCAweDg1ODYsIDB4ODU4RCwgMHg4NTk5LAorICAgIDB4ODU5RCwgMHg4NTgxLCAweDg1QTIsIDB4ODU4MiwgMHg4NTg4LCAweDg1ODUsIDB4ODU3OSwgMHg4NTc2LCAweDg1OTgsCisgICAgMHg4NTkwLCAweDg1OUYsIDB4ODY2OCwgMHg4N0JFLCAweDg3QUEsIDB4ODdBRCwgMHg4N0M1LCAweDg3QjAsIDB4ODdBQywKKyAgICAweDg3QjksIDB4ODdCNSwgMHg4N0JDLCAweDg3QUUsIDB4ODdDOSwgMHg4N0MzLCAweDg3QzIsIDB4ODdDQywgMHg4N0I3LAorICAgIDB4ODdBRiwgMHg4N0M0LCAweDg3Q0EsIDB4ODdCNCwgMHg4N0I2LCAweDg3QkYsIDB4ODdCOCwgMHg4N0JELCAweDg3REUsCisgICAgMHg4N0IyLCAweDg5MzUsIDB4ODkzMywgMHg4OTNDLCAweDg5M0UsIDB4ODk0MSwgMHg4OTUyLCAweDg5MzcsIDB4ODk0MiwKKyAgICAweDg5QUQsIDB4ODlBRiwgMHg4OUFFLCAweDg5RjIsIDB4ODlGMywgMHg4QjFFLCAweDhCMTgsIDB4OEIxNiwgMHg4QjExLAorICAgIDB4OEIwNSwgMHg4QjBCLCAweDhCMjIsIDB4OEIwRiwgMHg4QjEyLCAweDhCMTUsIDB4OEIwNywgMHg4QjBELCAweDhCMDgsCisgICAgMHg4QjA2LCAweDhCMUMsIDB4OEIxMywgMHg4QjFBLCAweDhDNEYsIDB4OEM3MCwgMHg4QzcyLCAweDhDNzEsIDB4OEM2RiwKKyAgICAweDhDOTUsIDB4OEM5NCwgMHg4Q0Y5LCAweDhENkYsIDB4OEU0RSwgMHg4RTRELCAweDhFNTMsIDB4OEU1MCwgMHg4RTRDLAorICAgIDB4OEU0NywgMHg4RjQzLCAweDhGNDAsIDB4OTA4NSwgMHg5MDdFLCAweDkxMzgsIDB4OTE5QSwgMHg5MUEyLCAweDkxOUIsCisgICAgMHg5MTk5LCAweDkxOUYsIDB4OTFBMSwgMHg5MTlELCAweDkxQTAsIDB4OTNBMSwgMHg5MzgzLCAweDkzQUYsIDB4OTM2NCwKKyAgICAweDkzNTYsIDB4OTM0NywgMHg5MzdDLCAweDkzNTgsIDB4OTM1QywgMHg5Mzc2LCAweDkzNDksIDB4OTM1MCwgMHg5MzUxLAorICAgIDB4OTM2MCwgMHg5MzZELCAweDkzOEYsIDB4OTM0QywgMHg5MzZBLCAweDkzNzksIDB4OTM1NywgMHg5MzU1LCAweDkzNTIsCisgICAgMHg5MzRGLCAweDkzNzEsIDB4OTM3NywgMHg5MzdCLCAweDkzNjEsIDB4OTM1RSwgMHg5MzYzLCAweDkzNjcsIDB4OTM0RSwKKyAgICAweDkzNTksIDB4OTVDNywgMHg5NUMwLCAweDk1QzksIDB4OTVDMywgMHg5NUM1LCAweDk1QjcsIDB4OTZBRSwgMHg5NkIwLAorICAgIDB4OTZBQywgMHg5NzIwLCAweDk3MUYsIDB4OTcxOCwgMHg5NzFELCAweDk3MTksIDB4OTc5QSwgMHg5N0ExLCAweDk3OUMsCisgICAgMHg5NzlFLCAweDk3OUQsIDB4OTdENSwgMHg5N0Q0LCAweDk3RjEsIDB4OTg0MSwgMHg5ODQ0LCAweDk4NEEsIDB4OTg0OSwKKyAgICAweDk4NDUsIDB4OTg0MywgMHg5OTI1LCAweDk5MkIsIDB4OTkyQywgMHg5OTJBLCAweDk5MzMsIDB4OTkzMiwgMHg5OTJGLAorICAgIDB4OTkyRCwgMHg5OTMxLCAweDk5MzAsIDB4OTk5OCwgMHg5OUEzLCAweDk5QTEsIDB4OUEwMiwgMHg5OUZBLCAweDk5RjQsCisgICAgMHg5OUY3LCAweDk5RjksIDB4OTlGOCwgMHg5OUY2LCAweDk5RkIsIDB4OTlGRCwgMHg5OUZFLCAweDk5RkMsIDB4OUEwMywKKyAgICAweDlBQkUsIDB4OUFGRSwgMHg5QUZELCAweDlCMDEsIDB4OUFGQywgMHg5QjQ4LCAweDlCOUEsIDB4OUJBOCwgMHg5QjlFLAorICAgIDB4OUI5QiwgMHg5QkE2LCAweDlCQTEsIDB4OUJBNSwgMHg5QkE0LCAweDlCODYsIDB4OUJBMiwgMHg5QkEwLCAweDlCQUYsCisgICAgMHg5RDMzLCAweDlENDEsIDB4OUQ2NywgMHg5RDM2LCAweDlEMkUsIDB4OUQyRiwgMHg5RDMxLCAweDlEMzgsIDB4OUQzMCwKKyAgICAweDlENDUsIDB4OUQ0MiwgMHg5RDQzLCAweDlEM0UsIDB4OUQzNywgMHg5RDQwLCAweDlEM0QsIDB4N0ZGNSwgMHg5RDJELAorICAgIDB4OUU4QSwgMHg5RTg5LCAweDlFOEQsIDB4OUVCMCwgMHg5RUM4LCAweDlFREEsIDB4OUVGQiwgMHg5RUZGLCAweDlGMjQsCisgICAgMHg5RjIzLCAweDlGMjIsIDB4OUY1NCwgMHg5RkEwLCAweDUxMzEsIDB4NTEyRCwgMHg1MTJFLCAweDU2OTgsIDB4NTY5QywKKyAgICAweDU2OTcsIDB4NTY5QSwgMHg1NjlELCAweDU2OTksIDB4NTk3MCwgMHg1QjNDLCAweDVDNjksIDB4NUM2QSwgMHg1REMwLAorICAgIDB4NUU2RCwgMHg1RTZFLCAweDYxRDgsIDB4NjFERiwgMHg2MUVELCAweDYxRUUsIDB4NjFGMSwgMHg2MUVBLCAweDYxRjAsCisgICAgMHg2MUVCLCAweDYxRDYsIDB4NjFFOSwgMHg2NEZGLCAweDY1MDQsIDB4NjRGRCwgMHg2NEY4LCAweDY1MDEsIDB4NjUwMywKKyAgICAweDY0RkMsIDB4NjU5NCwgMHg2NURCLCAweDY2REEsIDB4NjZEQiwgMHg2NkQ4LCAweDZBQzUsIDB4NkFCOSwgMHg2QUJELAorICAgIDB4NkFFMSwgMHg2QUM2LCAweDZBQkEsIDB4NkFCNiwgMHg2QUI3LCAweDZBQzcsIDB4NkFCNCwgMHg2QUFELCAweDZCNUUsCisgICAgMHg2QkM5LCAweDZDMEIsIDB4NzAwNywgMHg3MDBDLCAweDcwMEQsIDB4NzAwMSwgMHg3MDA1LCAweDcwMTQsIDB4NzAwRSwKKyAgICAweDZGRkYsIDB4NzAwMCwgMHg2RkZCLCAweDcwMjYsIDB4NkZGQywgMHg2RkY3LCAweDcwMEEsIDB4NzIwMSwgMHg3MUZGLAorICAgIDB4NzFGOSwgMHg3MjAzLCAweDcxRkQsIDB4NzM3NiwgMHg3NEI4LCAweDc0QzAsIDB4NzRCNSwgMHg3NEMxLCAweDc0QkUsCisgICAgMHg3NEI2LCAweDc0QkIsIDB4NzRDMiwgMHg3NTE0LCAweDc1MTMsIDB4NzY1QywgMHg3NjY0LCAweDc2NTksIDB4NzY1MCwKKyAgICAweDc2NTMsIDB4NzY1NywgMHg3NjVBLCAweDc2QTYsIDB4NzZCRCwgMHg3NkVDLCAweDc3QzIsIDB4NzdCQSwgMHg3OTBDLAorICAgIDB4NzkxMywgMHg3OTE0LCAweDc5MDksIDB4NzkxMCwgMHg3OTEyLCAweDc5MTEsIDB4NzlBRCwgMHg3OUFDLCAweDdBNUYsCisgICAgMHg3QzFDLCAweDdDMjksIDB4N0MxOSwgMHg3QzIwLCAweDdDMUYsIDB4N0MyRCwgMHg3QzFELCAweDdDMjYsIDB4N0MyOCwKKyAgICAweDdDMjIsIDB4N0MyNSwgMHg3QzMwLCAweDdFNUMsIDB4N0U1MCwgMHg3RTU2LCAweDdFNjMsIDB4N0U1OCwgMHg3RTYyLAorICAgIDB4N0U1RiwgMHg3RTUxLCAweDdFNjAsIDB4N0U1NywgMHg3RTUzLCAweDdGQjUsIDB4N0ZCMywgMHg3RkY3LCAweDdGRjgsCisgICAgMHg4MDc1LCAweDgxRDEsIDB4ODFEMiwgMHg4MUQwLCAweDgyNUYsIDB4ODI1RSwgMHg4NUI0LCAweDg1QzYsIDB4ODVDMCwKKyAgICAweDg1QzMsIDB4ODVDMiwgMHg4NUIzLCAweDg1QjUsIDB4ODVCRCwgMHg4NUM3LCAweDg1QzQsIDB4ODVCRiwgMHg4NUNCLAorICAgIDB4ODVDRSwgMHg4NUM4LCAweDg1QzUsIDB4ODVCMSwgMHg4NUI2LCAweDg1RDIsIDB4ODYyNCwgMHg4NUI4LCAweDg1QjcsCisgICAgMHg4NUJFLCAweDg2NjksIDB4ODdFNywgMHg4N0U2LCAweDg3RTIsIDB4ODdEQiwgMHg4N0VCLCAweDg3RUEsIDB4ODdFNSwKKyAgICAweDg3REYsIDB4ODdGMywgMHg4N0U0LCAweDg3RDQsIDB4ODdEQywgMHg4N0QzLCAweDg3RUQsIDB4ODdEOCwgMHg4N0UzLAorICAgIDB4ODdENywgMHg4N0Q5LCAweDg4MDEsIDB4ODdGNCwgMHg4N0U4LCAweDg3REQsIDB4ODk1MywgMHg4OTRCLCAweDg5NEYsCisgICAgMHg4OTRDLCAweDg5NDYsIDB4ODk1MCwgMHg4OTUxLCAweDg5NDksIDB4OEIyQSwgMHg4QjI3LCAweDhCMjMsIDB4OEIzMywKKyAgICAweDhCMzAsIDB4OEIzNSwgMHg4QjQ3LCAweDhCMkYsIDB4OEIzQywgMHg4QjNFLCAweDhCMzEsIDB4OEIyNSwgMHg4QjM3LAorICAgIDB4OEIyNiwgMHg4QjM2LCAweDhCMkUsIDB4OEIyNCwgMHg4QjNCLCAweDhCM0QsIDB4OEIzQSwgMHg4QzQyLCAweDhDNzUsCisgICAgMHg4Qzk5LCAweDhDOTgsIDB4OEM5NywgMHg4Q0ZFLCAweDhEMDQsIDB4OEQwMiwgMHg4RDAwLCAweDhFNUMsIDB4OEU2MiwKKyAgICAweDhFNjAsIDB4OEU1NywgMHg4RTU2LCAweDhFNUUsIDB4OEU2NSwgMHg4RTY3LCAweDhFNUIsIDB4OEU1QSwgMHg4RTYxLAorICAgIDB4OEU1RCwgMHg4RTY5LCAweDhFNTQsIDB4OEY0NiwgMHg4RjQ3LCAweDhGNDgsIDB4OEY0QiwgMHg5MTI4LCAweDkxM0EsCisgICAgMHg5MTNCLCAweDkxM0UsIDB4OTFBOCwgMHg5MUE1LCAweDkxQTcsIDB4OTFBRiwgMHg5MUFBLCAweDkzQjUsIDB4OTM4QywKKyAgICAweDkzOTIsIDB4OTNCNywgMHg5MzlCLCAweDkzOUQsIDB4OTM4OSwgMHg5M0E3LCAweDkzOEUsIDB4OTNBQSwgMHg5MzlFLAorICAgIDB4OTNBNiwgMHg5Mzk1LCAweDkzODgsIDB4OTM5OSwgMHg5MzlGLCAweDkzODAsIDB4OTM4RCwgMHg5M0IxLCAweDkzOTEsCisgICAgMHg5M0IyLCAweDkzQTQsIDB4OTNBOCwgMHg5M0I0LCAweDkzQTMsIDB4OTVEMiwgMHg5NUQzLCAweDk1RDEsIDB4OTZCMywKKyAgICAweDk2RDcsIDB4OTZEQSwgMHg1REMyLCAweDk2REYsIDB4OTZEOCwgMHg5NkRELCAweDk3MjMsIDB4OTcyMiwgMHg5NzI1LAorICAgIDB4OTdBQywgMHg5N0FFLCAweDk3QTgsIDB4OTdBQiwgMHg5N0E0LCAweDk3QUEsIDB4OTdBMiwgMHg5N0E1LCAweDk3RDcsCisgICAgMHg5N0Q5LCAweDk3RDYsIDB4OTdEOCwgMHg5N0ZBLCAweDk4NTAsIDB4OTg1MSwgMHg5ODUyLCAweDk4QjgsIDB4OTk0MSwKKyAgICAweDk5M0MsIDB4OTkzQSwgMHg5QTBGLCAweDlBMEIsIDB4OUEwOSwgMHg5QTBELCAweDlBMDQsIDB4OUExMSwgMHg5QTBBLAorICAgIDB4OUEwNSwgMHg5QTA3LCAweDlBMDYsIDB4OUFDMCwgMHg5QURDLCAweDlCMDgsIDB4OUIwNCwgMHg5QjA1LCAweDlCMjksCisgICAgMHg5QjM1LCAweDlCNEEsIDB4OUI0QywgMHg5QjRCLCAweDlCQzcsIDB4OUJDNiwgMHg5QkMzLCAweDlCQkYsIDB4OUJDMSwKKyAgICAweDlCQjUsIDB4OUJCOCwgMHg5QkQzLCAweDlCQjYsIDB4OUJDNCwgMHg5QkI5LCAweDlCQkQsIDB4OUQ1QywgMHg5RDUzLAorICAgIDB4OUQ0RiwgMHg5RDRBLCAweDlENUIsIDB4OUQ0QiwgMHg5RDU5LCAweDlENTYsIDB4OUQ0QywgMHg5RDU3LCAweDlENTIsCisgICAgMHg5RDU0LCAweDlENUYsIDB4OUQ1OCwgMHg5RDVBLCAweDlFOEUsIDB4OUU4QywgMHg5RURGLCAweDlGMDEsIDB4OUYwMCwKKyAgICAweDlGMTYsIDB4OUYyNSwgMHg5RjJCLCAweDlGMkEsIDB4OUYyOSwgMHg5RjI4LCAweDlGNEMsIDB4OUY1NSwgMHg1MTM0LAorICAgIDB4NTEzNSwgMHg1Mjk2LCAweDUyRjcsIDB4NTNCNCwgMHg1NkFCLCAweDU2QUQsIDB4NTZBNiwgMHg1NkE3LCAweDU2QUEsCisgICAgMHg1NkFDLCAweDU4REEsIDB4NThERCwgMHg1OERCLCAweDU5MTIsIDB4NUIzRCwgMHg1QjNFLCAweDVCM0YsIDB4NURDMywKKyAgICAweDVFNzAsIDB4NUZCRiwgMHg2MUZCLCAweDY1MDcsIDB4NjUxMCwgMHg2NTBELCAweDY1MDksIDB4NjUwQywgMHg2NTBFLAorICAgIDB4NjU4NCwgMHg2NURFLCAweDY1REQsIDB4NjZERSwgMHg2QUU3LCAweDZBRTAsIDB4NkFDQywgMHg2QUQxLCAweDZBRDksCisgICAgMHg2QUNCLCAweDZBREYsIDB4NkFEQywgMHg2QUQwLCAweDZBRUIsIDB4NkFDRiwgMHg2QUNELCAweDZBREUsIDB4NkI2MCwKKyAgICAweDZCQjAsIDB4NkMwQywgMHg3MDE5LCAweDcwMjcsIDB4NzAyMCwgMHg3MDE2LCAweDcwMkIsIDB4NzAyMSwgMHg3MDIyLAorICAgIDB4NzAyMywgMHg3MDI5LCAweDcwMTcsIDB4NzAyNCwgMHg3MDFDLCAweDcyMEMsIDB4NzIwQSwgMHg3MjA3LCAweDcyMDIsCisgICAgMHg3MjA1LCAweDcyQTUsIDB4NzJBNiwgMHg3MkE0LCAweDcyQTMsIDB4NzJBMSwgMHg3NENCLCAweDc0QzUsIDB4NzRCNywKKyAgICAweDc0QzMsIDB4NzUxNiwgMHg3NjYwLCAweDc3QzksIDB4NzdDQSwgMHg3N0M0LCAweDc3RjEsIDB4NzkxRCwgMHg3OTFCLAorICAgIDB4NzkyMSwgMHg3OTFDLCAweDc5MTcsIDB4NzkxRSwgMHg3OUIwLCAweDdBNjcsIDB4N0E2OCwgMHg3QzMzLCAweDdDM0MsCisgICAgMHg3QzM5LCAweDdDMkMsIDB4N0MzQiwgMHg3Q0VDLCAweDdDRUEsIDB4N0U3NiwgMHg3RTc1LCAweDdFNzgsIDB4N0U3MCwKKyAgICAweDdFNzcsIDB4N0U2RiwgMHg3RTdBLCAweDdFNzIsIDB4N0U3NCwgMHg3RTY4LCAweDdGNEIsIDB4N0Y0QSwgMHg3RjgzLAorICAgIDB4N0Y4NiwgMHg3RkI3LCAweDdGRkQsIDB4N0ZGRSwgMHg4MDc4LCAweDgxRDcsIDB4ODFENSwgMHg4MjBCLCAweDgyNjQsCisgICAgMHg4MjYxLCAweDgyNjMsIDB4ODVFQiwgMHg4NUYxLCAweDg1RUQsIDB4ODVEOSwgMHg4NUUxLCAweDg1RTgsIDB4ODVEQSwKKyAgICAweDg1RDcsIDB4ODVFQywgMHg4NUYyLCAweDg1RjgsIDB4ODVEOCwgMHg4NURGLCAweDg1RTMsIDB4ODVEQywgMHg4NUQxLAorICAgIDB4ODVGMCwgMHg4NUU2LCAweDg1RUYsIDB4ODVERSwgMHg4NUUyLCAweDg4MDAsIDB4ODdGQSwgMHg4ODAzLCAweDg3RjYsCisgICAgMHg4N0Y3LCAweDg4MDksIDB4ODgwQywgMHg4ODBCLCAweDg4MDYsIDB4ODdGQywgMHg4ODA4LCAweDg3RkYsIDB4ODgwQSwKKyAgICAweDg4MDIsIDB4ODk2MiwgMHg4OTVBLCAweDg5NUIsIDB4ODk1NywgMHg4OTYxLCAweDg5NUMsIDB4ODk1OCwgMHg4OTVELAorICAgIDB4ODk1OSwgMHg4OTg4LCAweDg5QjcsIDB4ODlCNiwgMHg4OUY2LCAweDhCNTAsIDB4OEI0OCwgMHg4QjRBLCAweDhCNDAsCisgICAgMHg4QjUzLCAweDhCNTYsIDB4OEI1NCwgMHg4QjRCLCAweDhCNTUsIDB4OEI1MSwgMHg4QjQyLCAweDhCNTIsIDB4OEI1NywKKyAgICAweDhDNDMsIDB4OEM3NywgMHg4Qzc2LCAweDhDOUEsIDB4OEQwNiwgMHg4RDA3LCAweDhEMDksIDB4OERBQywgMHg4REFBLAorICAgIDB4OERBRCwgMHg4REFCLCAweDhFNkQsIDB4OEU3OCwgMHg4RTczLCAweDhFNkEsIDB4OEU2RiwgMHg4RTdCLCAweDhFQzIsCisgICAgMHg4RjUyLCAweDhGNTEsIDB4OEY0RiwgMHg4RjUwLCAweDhGNTMsIDB4OEZCNCwgMHg5MTQwLCAweDkxM0YsIDB4OTFCMCwKKyAgICAweDkxQUQsIDB4OTNERSwgMHg5M0M3LCAweDkzQ0YsIDB4OTNDMiwgMHg5M0RBLCAweDkzRDAsIDB4OTNGOSwgMHg5M0VDLAorICAgIDB4OTNDQywgMHg5M0Q5LCAweDkzQTksIDB4OTNFNiwgMHg5M0NBLCAweDkzRDQsIDB4OTNFRSwgMHg5M0UzLCAweDkzRDUsCisgICAgMHg5M0M0LCAweDkzQ0UsIDB4OTNDMCwgMHg5M0QyLCAweDkzQTUsIDB4OTNFNywgMHg5NTdELCAweDk1REEsIDB4OTVEQiwKKyAgICAweDk2RTEsIDB4OTcyOSwgMHg5NzJCLCAweDk3MkMsIDB4OTcyOCwgMHg5NzI2LCAweDk3QjMsIDB4OTdCNywgMHg5N0I2LAorICAgIDB4OTdERCwgMHg5N0RFLCAweDk3REYsIDB4OTg1QywgMHg5ODU5LCAweDk4NUQsIDB4OTg1NywgMHg5OEJGLCAweDk4QkQsCisgICAgMHg5OEJCLCAweDk4QkUsIDB4OTk0OCwgMHg5OTQ3LCAweDk5NDMsIDB4OTlBNiwgMHg5OUE3LCAweDlBMUEsIDB4OUExNSwKKyAgICAweDlBMjUsIDB4OUExRCwgMHg5QTI0LCAweDlBMUIsIDB4OUEyMiwgMHg5QTIwLCAweDlBMjcsIDB4OUEyMywgMHg5QTFFLAorICAgIDB4OUExQywgMHg5QTE0LCAweDlBQzIsIDB4OUIwQiwgMHg5QjBBLCAweDlCMEUsIDB4OUIwQywgMHg5QjM3LCAweDlCRUEsCisgICAgMHg5QkVCLCAweDlCRTAsIDB4OUJERSwgMHg5QkU0LCAweDlCRTYsIDB4OUJFMiwgMHg5QkYwLCAweDlCRDQsIDB4OUJENywKKyAgICAweDlCRUMsIDB4OUJEQywgMHg5QkQ5LCAweDlCRTUsIDB4OUJENSwgMHg5QkUxLCAweDlCREEsIDB4OUQ3NywgMHg5RDgxLAorICAgIDB4OUQ4QSwgMHg5RDg0LCAweDlEODgsIDB4OUQ3MSwgMHg5RDgwLCAweDlENzgsIDB4OUQ4NiwgMHg5RDhCLCAweDlEOEMsCisgICAgMHg5RDdELCAweDlENkIsIDB4OUQ3NCwgMHg5RDc1LCAweDlENzAsIDB4OUQ2OSwgMHg5RDg1LCAweDlENzMsIDB4OUQ3QiwKKyAgICAweDlEODIsIDB4OUQ2RiwgMHg5RDc5LCAweDlEN0YsIDB4OUQ4NywgMHg5RDY4LCAweDlFOTQsIDB4OUU5MSwgMHg5RUMwLAorICAgIDB4OUVGQywgMHg5RjJELCAweDlGNDAsIDB4OUY0MSwgMHg5RjRELCAweDlGNTYsIDB4OUY1NywgMHg5RjU4LCAweDUzMzcsCisgICAgMHg1NkIyLCAweDU2QjUsIDB4NTZCMywgMHg1OEUzLCAweDVCNDUsIDB4NURDNiwgMHg1REM3LCAweDVFRUUsIDB4NUVFRiwKKyAgICAweDVGQzAsIDB4NUZDMSwgMHg2MUY5LCAweDY1MTcsIDB4NjUxNiwgMHg2NTE1LCAweDY1MTMsIDB4NjVERiwgMHg2NkU4LAorICAgIDB4NjZFMywgMHg2NkU0LCAweDZBRjMsIDB4NkFGMCwgMHg2QUVBLCAweDZBRTgsIDB4NkFGOSwgMHg2QUYxLCAweDZBRUUsCisgICAgMHg2QUVGLCAweDcwM0MsIDB4NzAzNSwgMHg3MDJGLCAweDcwMzcsIDB4NzAzNCwgMHg3MDMxLCAweDcwNDIsIDB4NzAzOCwKKyAgICAweDcwM0YsIDB4NzAzQSwgMHg3MDM5LCAweDcwMkEsIDB4NzA0MCwgMHg3MDNCLCAweDcwMzMsIDB4NzA0MSwgMHg3MjEzLAorICAgIDB4NzIxNCwgMHg3MkE4LCAweDczN0QsIDB4NzM3QywgMHg3NEJBLCAweDc2QUIsIDB4NzZBQSwgMHg3NkJFLCAweDc2RUQsCisgICAgMHg3N0NDLCAweDc3Q0UsIDB4NzdDRiwgMHg3N0NELCAweDc3RjIsIDB4NzkyNSwgMHg3OTIzLCAweDc5MjcsIDB4NzkyOCwKKyAgICAweDc5MjQsIDB4NzkyOSwgMHg3OUIyLCAweDdBNkUsIDB4N0E2QywgMHg3QTZELCAweDdBRjcsIDB4N0M0OSwgMHg3QzQ4LAorICAgIDB4N0M0QSwgMHg3QzQ3LCAweDdDNDUsIDB4N0NFRSwgMHg3RTdCLCAweDdFN0UsIDB4N0U4MSwgMHg3RTgwLCAweDdGQkEsCisgICAgMHg3RkZGLCAweDgwNzksIDB4ODFEQiwgMHg4MUQ5LCAweDgyNjgsIDB4ODI2OSwgMHg4NjIyLCAweDg1RkYsIDB4ODYwMSwKKyAgICAweDg1RkUsIDB4ODYxQiwgMHg4NjAwLCAweDg1RjYsIDB4ODYwNCwgMHg4NjA5LCAweDg2MDUsIDB4ODYwQywgMHg4NUZELAorICAgIDB4ODgxOSwgMHg4ODEwLCAweDg4MTEsIDB4ODgxNywgMHg4ODEzLCAweDg4MTYsIDB4ODk2MywgMHg4OTY2LCAweDg5QjksCisgICAgMHg4OUY3LCAweDhCNjAsIDB4OEI2QSwgMHg4QjVELCAweDhCNjgsIDB4OEI2MywgMHg4QjY1LCAweDhCNjcsIDB4OEI2RCwKKyAgICAweDhEQUUsIDB4OEU4NiwgMHg4RTg4LCAweDhFODQsIDB4OEY1OSwgMHg4RjU2LCAweDhGNTcsIDB4OEY1NSwgMHg4RjU4LAorICAgIDB4OEY1QSwgMHg5MDhELCAweDkxNDMsIDB4OTE0MSwgMHg5MUI3LCAweDkxQjUsIDB4OTFCMiwgMHg5MUIzLCAweDk0MEIsCisgICAgMHg5NDEzLCAweDkzRkIsIDB4OTQyMCwgMHg5NDBGLCAweDk0MTQsIDB4OTNGRSwgMHg5NDE1LCAweDk0MTAsIDB4OTQyOCwKKyAgICAweDk0MTksIDB4OTQwRCwgMHg5M0Y1LCAweDk0MDAsIDB4OTNGNywgMHg5NDA3LCAweDk0MEUsIDB4OTQxNiwgMHg5NDEyLAorICAgIDB4OTNGQSwgMHg5NDA5LCAweDkzRjgsIDB4OTQzQywgMHg5NDBBLCAweDkzRkYsIDB4OTNGQywgMHg5NDBDLCAweDkzRjYsCisgICAgMHg5NDExLCAweDk0MDYsIDB4OTVERSwgMHg5NUUwLCAweDk1REYsIDB4OTcyRSwgMHg5NzJGLCAweDk3QjksIDB4OTdCQiwKKyAgICAweDk3RkQsIDB4OTdGRSwgMHg5ODYwLCAweDk4NjIsIDB4OTg2MywgMHg5ODVGLCAweDk4QzEsIDB4OThDMiwgMHg5OTUwLAorICAgIDB4OTk0RSwgMHg5OTU5LCAweDk5NEMsIDB4OTk0QiwgMHg5OTUzLCAweDlBMzIsIDB4OUEzNCwgMHg5QTMxLCAweDlBMkMsCisgICAgMHg5QTJBLCAweDlBMzYsIDB4OUEyOSwgMHg5QTJFLCAweDlBMzgsIDB4OUEyRCwgMHg5QUM3LCAweDlBQ0EsIDB4OUFDNiwKKyAgICAweDlCMTAsIDB4OUIxMiwgMHg5QjExLCAweDlDMEIsIDB4OUMwOCwgMHg5QkY3LCAweDlDMDUsIDB4OUMxMiwgMHg5QkY4LAorICAgIDB4OUM0MCwgMHg5QzA3LCAweDlDMEUsIDB4OUMwNiwgMHg5QzE3LCAweDlDMTQsIDB4OUMwOSwgMHg5RDlGLCAweDlEOTksCisgICAgMHg5REE0LCAweDlEOUQsIDB4OUQ5MiwgMHg5RDk4LCAweDlEOTAsIDB4OUQ5QiwgMHg5REEwLCAweDlEOTQsIDB4OUQ5QywKKyAgICAweDlEQUEsIDB4OUQ5NywgMHg5REExLCAweDlEOUEsIDB4OURBMiwgMHg5REE4LCAweDlEOUUsIDB4OURBMywgMHg5REJGLAorICAgIDB4OURBOSwgMHg5RDk2LCAweDlEQTYsIDB4OURBNywgMHg5RTk5LCAweDlFOUIsIDB4OUU5QSwgMHg5RUU1LCAweDlFRTQsCisgICAgMHg5RUU3LCAweDlFRTYsIDB4OUYzMCwgMHg5RjJFLCAweDlGNUIsIDB4OUY2MCwgMHg5RjVFLCAweDlGNUQsIDB4OUY1OSwKKyAgICAweDlGOTEsIDB4NTEzQSwgMHg1MTM5LCAweDUyOTgsIDB4NTI5NywgMHg1NkMzLCAweDU2QkQsIDB4NTZCRSwgMHg1QjQ4LAorICAgIDB4NUI0NywgMHg1RENCLCAweDVEQ0YsIDB4NUVGMSwgMHg2MUZELCAweDY1MUIsIDB4NkIwMiwgMHg2QUZDLCAweDZCMDMsCisgICAgMHg2QUY4LCAweDZCMDAsIDB4NzA0MywgMHg3MDQ0LCAweDcwNEEsIDB4NzA0OCwgMHg3MDQ5LCAweDcwNDUsIDB4NzA0NiwKKyAgICAweDcyMUQsIDB4NzIxQSwgMHg3MjE5LCAweDczN0UsIDB4NzUxNywgMHg3NjZBLCAweDc3RDAsIDB4NzkyRCwgMHg3OTMxLAorICAgIDB4NzkyRiwgMHg3QzU0LCAweDdDNTMsIDB4N0NGMiwgMHg3RThBLCAweDdFODcsIDB4N0U4OCwgMHg3RThCLCAweDdFODYsCisgICAgMHg3RThELCAweDdGNEQsIDB4N0ZCQiwgMHg4MDMwLCAweDgxREQsIDB4ODYxOCwgMHg4NjJBLCAweDg2MjYsIDB4ODYxRiwKKyAgICAweDg2MjMsIDB4ODYxQywgMHg4NjE5LCAweDg2MjcsIDB4ODYyRSwgMHg4NjIxLCAweDg2MjAsIDB4ODYyOSwgMHg4NjFFLAorICAgIDB4ODYyNSwgMHg4ODI5LCAweDg4MUQsIDB4ODgxQiwgMHg4ODIwLCAweDg4MjQsIDB4ODgxQywgMHg4ODJCLCAweDg4NEEsCisgICAgMHg4OTZELCAweDg5NjksIDB4ODk2RSwgMHg4OTZCLCAweDg5RkEsIDB4OEI3OSwgMHg4Qjc4LCAweDhCNDUsIDB4OEI3QSwKKyAgICAweDhCN0IsIDB4OEQxMCwgMHg4RDE0LCAweDhEQUYsIDB4OEU4RSwgMHg4RThDLCAweDhGNUUsIDB4OEY1QiwgMHg4RjVELAorICAgIDB4OTE0NiwgMHg5MTQ0LCAweDkxNDUsIDB4OTFCOSwgMHg5NDNGLCAweDk0M0IsIDB4OTQzNiwgMHg5NDI5LCAweDk0M0QsCisgICAgMHg5NDMwLCAweDk0MzksIDB4OTQyQSwgMHg5NDM3LCAweDk0MkMsIDB4OTQ0MCwgMHg5NDMxLCAweDk1RTUsIDB4OTVFNCwKKyAgICAweDk1RTMsIDB4OTczNSwgMHg5NzNBLCAweDk3QkYsIDB4OTdFMSwgMHg5ODY0LCAweDk4QzksIDB4OThDNiwgMHg5OEMwLAorICAgIDB4OTk1OCwgMHg5OTU2LCAweDlBMzksIDB4OUEzRCwgMHg5QTQ2LCAweDlBNDQsIDB4OUE0MiwgMHg5QTQxLCAweDlBM0EsCisgICAgMHg5QTNGLCAweDlBQ0QsIDB4OUIxNSwgMHg5QjE3LCAweDlCMTgsIDB4OUIxNiwgMHg5QjNBLCAweDlCNTIsIDB4OUMyQiwKKyAgICAweDlDMUQsIDB4OUMxQywgMHg5QzJDLCAweDlDMjMsIDB4OUMyOCwgMHg5QzI5LCAweDlDMjQsIDB4OUMyMSwgMHg5REI3LAorICAgIDB4OURCNiwgMHg5REJDLCAweDlEQzEsIDB4OURDNywgMHg5RENBLCAweDlEQ0YsIDB4OURCRSwgMHg5REM1LCAweDlEQzMsCisgICAgMHg5REJCLCAweDlEQjUsIDB4OURDRSwgMHg5REI5LCAweDlEQkEsIDB4OURBQywgMHg5REM4LCAweDlEQjEsIDB4OURBRCwKKyAgICAweDlEQ0MsIDB4OURCMywgMHg5RENELCAweDlEQjIsIDB4OUU3QSwgMHg5RTlDLCAweDlFRUIsIDB4OUVFRSwgMHg5RUVELAorICAgIDB4OUYxQiwgMHg5RjE4LCAweDlGMUEsIDB4OUYzMSwgMHg5RjRFLCAweDlGNjUsIDB4OUY2NCwgMHg5RjkyLCAweDRFQjksCisgICAgMHg1NkM2LCAweDU2QzUsIDB4NTZDQiwgMHg1OTcxLCAweDVCNEIsIDB4NUI0QywgMHg1REQ1LCAweDVERDEsIDB4NUVGMiwKKyAgICAweDY1MjEsIDB4NjUyMCwgMHg2NTI2LCAweDY1MjIsIDB4NkIwQiwgMHg2QjA4LCAweDZCMDksIDB4NkMwRCwgMHg3MDU1LAorICAgIDB4NzA1NiwgMHg3MDU3LCAweDcwNTIsIDB4NzIxRSwgMHg3MjFGLCAweDcyQTksIDB4NzM3RiwgMHg3NEQ4LCAweDc0RDUsCisgICAgMHg3NEQ5LCAweDc0RDcsIDB4NzY2RCwgMHg3NkFELCAweDc5MzUsIDB4NzlCNCwgMHg3QTcwLCAweDdBNzEsIDB4N0M1NywKKyAgICAweDdDNUMsIDB4N0M1OSwgMHg3QzVCLCAweDdDNUEsIDB4N0NGNCwgMHg3Q0YxLCAweDdFOTEsIDB4N0Y0RiwgMHg3Rjg3LAorICAgIDB4ODFERSwgMHg4MjZCLCAweDg2MzQsIDB4ODYzNSwgMHg4NjMzLCAweDg2MkMsIDB4ODYzMiwgMHg4NjM2LCAweDg4MkMsCisgICAgMHg4ODI4LCAweDg4MjYsIDB4ODgyQSwgMHg4ODI1LCAweDg5NzEsIDB4ODlCRiwgMHg4OUJFLCAweDg5RkIsIDB4OEI3RSwKKyAgICAweDhCODQsIDB4OEI4MiwgMHg4Qjg2LCAweDhCODUsIDB4OEI3RiwgMHg4RDE1LCAweDhFOTUsIDB4OEU5NCwgMHg4RTlBLAorICAgIDB4OEU5MiwgMHg4RTkwLCAweDhFOTYsIDB4OEU5NywgMHg4RjYwLCAweDhGNjIsIDB4OTE0NywgMHg5NDRDLCAweDk0NTAsCisgICAgMHg5NDRBLCAweDk0NEIsIDB4OTQ0RiwgMHg5NDQ3LCAweDk0NDUsIDB4OTQ0OCwgMHg5NDQ5LCAweDk0NDYsIDB4OTczRiwKKyAgICAweDk3RTMsIDB4OTg2QSwgMHg5ODY5LCAweDk4Q0IsIDB4OTk1NCwgMHg5OTVCLCAweDlBNEUsIDB4OUE1MywgMHg5QTU0LAorICAgIDB4OUE0QywgMHg5QTRGLCAweDlBNDgsIDB4OUE0QSwgMHg5QTQ5LCAweDlBNTIsIDB4OUE1MCwgMHg5QUQwLCAweDlCMTksCisgICAgMHg5QjJCLCAweDlCM0IsIDB4OUI1NiwgMHg5QjU1LCAweDlDNDYsIDB4OUM0OCwgMHg5QzNGLCAweDlDNDQsIDB4OUMzOSwKKyAgICAweDlDMzMsIDB4OUM0MSwgMHg5QzNDLCAweDlDMzcsIDB4OUMzNCwgMHg5QzMyLCAweDlDM0QsIDB4OUMzNiwgMHg5RERCLAorICAgIDB4OUREMiwgMHg5RERFLCAweDlEREEsIDB4OURDQiwgMHg5REQwLCAweDlEREMsIDB4OUREMSwgMHg5RERGLCAweDlERTksCisgICAgMHg5REQ5LCAweDlERDgsIDB4OURENiwgMHg5REY1LCAweDlERDUsIDB4OURERCwgMHg5RUI2LCAweDlFRjAsIDB4OUYzNSwKKyAgICAweDlGMzMsIDB4OUYzMiwgMHg5RjQyLCAweDlGNkIsIDB4OUY5NSwgMHg5RkEyLCAweDUxM0QsIDB4NTI5OSwgMHg1OEU4LAorICAgIDB4NThFNywgMHg1OTcyLCAweDVCNEQsIDB4NUREOCwgMHg4ODJGLCAweDVGNEYsIDB4NjIwMSwgMHg2MjAzLCAweDYyMDQsCisgICAgMHg2NTI5LCAweDY1MjUsIDB4NjU5NiwgMHg2NkVCLCAweDZCMTEsIDB4NkIxMiwgMHg2QjBGLCAweDZCQ0EsIDB4NzA1QiwKKyAgICAweDcwNUEsIDB4NzIyMiwgMHg3MzgyLCAweDczODEsIDB4NzM4MywgMHg3NjcwLCAweDc3RDQsIDB4N0M2NywgMHg3QzY2LAorICAgIDB4N0U5NSwgMHg4MjZDLCAweDg2M0EsIDB4ODY0MCwgMHg4NjM5LCAweDg2M0MsIDB4ODYzMSwgMHg4NjNCLCAweDg2M0UsCisgICAgMHg4ODMwLCAweDg4MzIsIDB4ODgyRSwgMHg4ODMzLCAweDg5NzYsIDB4ODk3NCwgMHg4OTczLCAweDg5RkUsIDB4OEI4QywKKyAgICAweDhCOEUsIDB4OEI4QiwgMHg4Qjg4LCAweDhDNDUsIDB4OEQxOSwgMHg4RTk4LCAweDhGNjQsIDB4OEY2MywgMHg5MUJDLAorICAgIDB4OTQ2MiwgMHg5NDU1LCAweDk0NUQsIDB4OTQ1NywgMHg5NDVFLCAweDk3QzQsIDB4OTdDNSwgMHg5ODAwLCAweDlBNTYsCisgICAgMHg5QTU5LCAweDlCMUUsIDB4OUIxRiwgMHg5QjIwLCAweDlDNTIsIDB4OUM1OCwgMHg5QzUwLCAweDlDNEEsIDB4OUM0RCwKKyAgICAweDlDNEIsIDB4OUM1NSwgMHg5QzU5LCAweDlDNEMsIDB4OUM0RSwgMHg5REZCLCAweDlERjcsIDB4OURFRiwgMHg5REUzLAorICAgIDB4OURFQiwgMHg5REY4LCAweDlERTQsIDB4OURGNiwgMHg5REUxLCAweDlERUUsIDB4OURFNiwgMHg5REYyLCAweDlERjAsCisgICAgMHg5REUyLCAweDlERUMsIDB4OURGNCwgMHg5REYzLCAweDlERTgsIDB4OURFRCwgMHg5RUMyLCAweDlFRDAsIDB4OUVGMiwKKyAgICAweDlFRjMsIDB4OUYwNiwgMHg5RjFDLCAweDlGMzgsIDB4OUYzNywgMHg5RjM2LCAweDlGNDMsIDB4OUY0RiwgMHg5RjcxLAorICAgIDB4OUY3MCwgMHg5RjZFLCAweDlGNkYsIDB4NTZEMywgMHg1NkNELCAweDVCNEUsIDB4NUM2RCwgMHg2NTJELCAweDY2RUQsCisgICAgMHg2NkVFLCAweDZCMTMsIDB4NzA1RiwgMHg3MDYxLCAweDcwNUQsIDB4NzA2MCwgMHg3MjIzLCAweDc0REIsIDB4NzRFNSwKKyAgICAweDc3RDUsIDB4NzkzOCwgMHg3OUI3LCAweDc5QjYsIDB4N0M2QSwgMHg3RTk3LCAweDdGODksIDB4ODI2RCwgMHg4NjQzLAorICAgIDB4ODgzOCwgMHg4ODM3LCAweDg4MzUsIDB4ODg0QiwgMHg4Qjk0LCAweDhCOTUsIDB4OEU5RSwgMHg4RTlGLCAweDhFQTAsCisgICAgMHg4RTlELCAweDkxQkUsIDB4OTFCRCwgMHg5MUMyLCAweDk0NkIsIDB4OTQ2OCwgMHg5NDY5LCAweDk2RTUsIDB4OTc0NiwKKyAgICAweDk3NDMsIDB4OTc0NywgMHg5N0M3LCAweDk3RTUsIDB4OUE1RSwgMHg5QUQ1LCAweDlCNTksIDB4OUM2MywgMHg5QzY3LAorICAgIDB4OUM2NiwgMHg5QzYyLCAweDlDNUUsIDB4OUM2MCwgMHg5RTAyLCAweDlERkUsIDB4OUUwNywgMHg5RTAzLCAweDlFMDYsCisgICAgMHg5RTA1LCAweDlFMDAsIDB4OUUwMSwgMHg5RTA5LCAweDlERkYsIDB4OURGRCwgMHg5RTA0LCAweDlFQTAsIDB4OUYxRSwKKyAgICAweDlGNDYsIDB4OUY3NCwgMHg5Rjc1LCAweDlGNzYsIDB4NTZENCwgMHg2NTJFLCAweDY1QjgsIDB4NkIxOCwgMHg2QjE5LAorICAgIDB4NkIxNywgMHg2QjFBLCAweDcwNjIsIDB4NzIyNiwgMHg3MkFBLCAweDc3RDgsIDB4NzdEOSwgMHg3OTM5LCAweDdDNjksCisgICAgMHg3QzZCLCAweDdDRjYsIDB4N0U5QSwgMHg3RTk4LCAweDdFOUIsIDB4N0U5OSwgMHg4MUUwLCAweDgxRTEsIDB4ODY0NiwKKyAgICAweDg2NDcsIDB4ODY0OCwgMHg4OTc5LCAweDg5N0EsIDB4ODk3QywgMHg4OTdCLCAweDg5RkYsIDB4OEI5OCwgMHg4Qjk5LAorICAgIDB4OEVBNSwgMHg4RUE0LCAweDhFQTMsIDB4OTQ2RSwgMHg5NDZELCAweDk0NkYsIDB4OTQ3MSwgMHg5NDczLCAweDk3NDksCisgICAgMHg5ODcyLCAweDk5NUYsIDB4OUM2OCwgMHg5QzZFLCAweDlDNkQsIDB4OUUwQiwgMHg5RTBELCAweDlFMTAsIDB4OUUwRiwKKyAgICAweDlFMTIsIDB4OUUxMSwgMHg5RUExLCAweDlFRjUsIDB4OUYwOSwgMHg5RjQ3LCAweDlGNzgsIDB4OUY3QiwgMHg5RjdBLAorICAgIDB4OUY3OSwgMHg1NzFFLCAweDcwNjYsIDB4N0M2RiwgMHg4ODNDLCAweDhEQjIsIDB4OEVBNiwgMHg5MUMzLCAweDk0NzQsCisgICAgMHg5NDc4LCAweDk0NzYsIDB4OTQ3NSwgMHg5QTYwLCAweDlCMkUsIDB4OUM3NCwgMHg5QzczLCAweDlDNzEsIDB4OUM3NSwKKyAgICAweDlFMTQsIDB4OUUxMywgMHg5RUY2LCAweDlGMEEsIDB4OUZBNCwgMHg3MDY4LCAweDcwNjUsIDB4N0NGNywgMHg4NjZBLAorICAgIDB4ODgzRSwgMHg4ODNELCAweDg4M0YsIDB4OEI5RSwgMHg4QzlDLCAweDhFQTksIDB4OEVDOSwgMHg5NzRCLCAweDk4NzMsCisgICAgMHg5ODc0LCAweDk4Q0MsIDB4OTk2MSwgMHg5OUFCLCAweDlBNjQsIDB4OUE2NiwgMHg5QTY3LCAweDlCMjQsIDB4OUUxNSwKKyAgICAweDlFMTcsIDB4OUY0OCwgMHg2MjA3LCAweDZCMUUsIDB4NzIyNywgMHg4NjRDLCAweDhFQTgsIDB4OTQ4MiwgMHg5NDgwLAorICAgIDB4OTQ4MSwgMHg5QTY5LCAweDlBNjgsIDB4OUUxOSwgMHg4NjRCLCAweDhCOUYsIDB4OTQ4MywgMHg5Qzc5LCAweDlFQjcsCisgICAgMHg3Njc1LCAweDlBNkIsIDB4OUM3QSwgMHg5RTFELCAweDcwNjksIDB4NzA2QSwgMHg3MjI5LCAweDlFQTQsIDB4OUY3RSwKKyAgICAweDlGNDksIDB4OUY5OCwgMHhGRTE5LCAweDIyM0MsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LAorICAgIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsCisgICAgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwKKyAgICAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLAorICAgIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsCisgICAgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwKKyAgICAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLAorICAgIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisgICAgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywKKyAgICAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LAorICAgIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsCisgICAgMHhGRTMzLCAweDI1NzQsIDB4RkUzNCwgMHhGRTRGLCAweDAzMDgsIDB4RkYzRSwgMHgzMEZELCAweDMwRkUsIDB4MzA5RCwKKyAgICAweDMwOUUsIDB4RkZGRCwgMHgzMDA1LCAweDMwMDYsIDB4MzAwNywgMHgzMEZDLCAweEZGM0IsIDB4RkYzRCwgMHgyNzNELAorICAgIDB4MzA0MSwgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwgMHgzMDQ1LCAweDMwNDYsIDB4MzA0NywgMHgzMDQ4LCAweDMwNDksCisgICAgMHgzMDRBLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELCAweDMwNEUsIDB4MzA0RiwgMHgzMDUwLCAweDMwNTEsIDB4MzA1MiwKKyAgICAweDMwNTMsIDB4MzA1NCwgMHgzMDU1LCAweDMwNTYsIDB4MzA1NywgMHgzMDU4LCAweDMwNTksIDB4MzA1QSwgMHgzMDVCLAorICAgIDB4MzA1QywgMHgzMDVELCAweDMwNUUsIDB4MzA1RiwgMHgzMDYwLCAweDMwNjEsIDB4MzA2MiwgMHgzMDYzLCAweDMwNjQsCisgICAgMHgzMDY1LCAweDMwNjYsIDB4MzA2NywgMHgzMDY4LCAweDMwNjksIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwKKyAgICAweDMwNkUsIDB4MzA2RiwgMHgzMDcwLCAweDMwNzEsIDB4MzA3MiwgMHgzMDczLCAweDMwNzQsIDB4MzA3NSwgMHgzMDc2LAorICAgIDB4MzA3NywgMHgzMDc4LCAweDMwNzksIDB4MzA3QSwgMHgzMDdCLCAweDMwN0MsIDB4MzA3RCwgMHgzMDdFLCAweDMwN0YsCisgICAgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDgzLCAweDMwODQsIDB4MzA4NSwgMHgzMDg2LCAweDMwODcsIDB4MzA4OCwKKyAgICAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhFLCAweDMwOEYsIDB4MzA5MCwgMHgzMDkxLAorICAgIDB4MzA5MiwgMHgzMDkzLCAweDMwQTEsIDB4MzBBMiwgMHgzMEEzLCAweDMwQTQsIDB4MzBBNSwgMHgzMEE2LCAweDMwQTcsCisgICAgMHgzMEE4LCAweDMwQTksIDB4MzBBQSwgMHgzMEFCLCAweDMwQUMsIDB4MzBBRCwgMHgzMEFFLCAweDMwQUYsIDB4MzBCMCwKKyAgICAweDMwQjEsIDB4MzBCMiwgMHgzMEIzLCAweDMwQjQsIDB4MzBCNSwgMHgzMEI2LCAweDMwQjcsIDB4MzBCOCwgMHgzMEI5LAorICAgIDB4MzBCQSwgMHgzMEJCLCAweDMwQkMsIDB4MzBCRCwgMHgzMEJFLCAweDMwQkYsIDB4MzBDMCwgMHgzMEMxLCAweDMwQzIsCisgICAgMHgzMEMzLCAweDMwQzQsIDB4MzBDNSwgMHgzMEM2LCAweDMwQzcsIDB4MzBDOCwgMHgzMEM5LCAweDMwQ0EsIDB4MzBDQiwKKyAgICAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMCwgMHgzMEQxLCAweDMwRDIsIDB4MzBEMywgMHgzMEQ0LAorICAgIDB4MzBENSwgMHgzMEQ2LCAweDMwRDcsIDB4MzBEOCwgMHgzMEQ5LCAweDMwREEsIDB4MzBEQiwgMHgzMERDLCAweDMwREQsCisgICAgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFMywgMHgzMEU0LCAweDMwRTUsIDB4MzBFNiwKKyAgICAweDMwRTcsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRSwgMHgzMEVGLAorICAgIDB4MzBGMCwgMHgzMEYxLCAweDMwRjIsIDB4MzBGMywgMHgzMEY0LCAweDMwRjUsIDB4MzBGNiwgMHgwNDEwLCAweDA0MTEsCisgICAgMHgwNDEyLCAweDA0MTMsIDB4MDQxNCwgMHgwNDE1LCAweDA0MDEsIDB4MDQxNiwgMHgwNDE3LCAweDA0MTgsIDB4MDQxOSwKKyAgICAweDA0MUEsIDB4MDQxQiwgMHgwNDFDLCAweDA0MUQsIDB4MDQxRSwgMHgwNDFGLCAweDA0MjAsIDB4MDQyMSwgMHgwNDIyLAorICAgIDB4MDQyMywgMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LCAweDA0MjgsIDB4MDQyOSwgMHgwNDJBLCAweDA0MkIsCisgICAgMHgwNDJDLCAweDA0MkQsIDB4MDQyRSwgMHgwNDJGLCAweDA0MzAsIDB4MDQzMSwgMHgwNDMyLCAweDA0MzMsIDB4MDQzNCwKKyAgICAweDA0MzUsIDB4MDQ1MSwgMHgwNDM2LCAweDA0MzcsIDB4MDQzOCwgMHgwNDM5LCAweDA0M0EsIDB4MDQzQiwgMHgwNDNDLAorICAgIDB4MDQzRCwgMHgwNDNFLCAweDA0M0YsIDB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywgMHgwNDQ0LCAweDA0NDUsCisgICAgMHgwNDQ2LCAweDA0NDcsIDB4MDQ0OCwgMHgwNDQ5LCAweDA0NEEsIDB4MDQ0QiwgMHgwNDRDLCAweDA0NEQsIDB4MDQ0RSwKKyAgICAweDA0NEYsIDB4MjFFNywgMHgyMUI4LCAweDIxQjksIDB4NEU0MSwgMHgwMDAwLCAweDRFNUEsIDB4MDAwMCwgMHg1MjAyLAorICAgIDB4NDQ5MSwgMHg5RkIwLCAweDUxODgsIDB4OUZCMSwgMHgwMDAwLCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCisgICAgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKKyAgICAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELAorICAgIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCisgICAgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKKyAgICAweDAwQUMsIDB4RkZFNCwgMHhGRjA3LCAweEZGMDIsIDB4MzIzMSwgMHgyMTE2LCAweDIxMjEsIDB4Nzg4MSwgMHg5MkI5LAorICAgIDB4ODhDRiwgMHg1OEJCLCAweDYwNTIsIDB4N0NBNywgMHg1QUZBLCAweDI1NTQsIDB4MjU2NiwgMHgyNTU3LCAweDI1NjAsCisgICAgMHgyNTZDLCAweDI1NjMsIDB4MjU1QSwgMHgyNTY5LCAweDI1NUQsIDB4MjU1MiwgMHgyNTY0LCAweDI1NTUsIDB4RkZGRCwKKyAgICAweEZGRkQsIDB4RkZGRCwgMHgyNTU4LCAweDI1NjcsIDB4MjU1QiwgMHgyNTUzLCAweDI1NjUsIDB4MjU1NiwgMHgyNTVGLAorICAgIDB4MjU2QiwgMHgyNTYyLCAweDI1NTksIDB4MjU2OCwgMHgyNTVDLCAweDI1NTEsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCisgICAgMHhGRkZELCAweEZGRkQsIDB4MjU5MywgMHhGRkZELCAweEZGRkQsIDB4RkUxMCwgMHhGRTExLCAweEZFMTIsIDB4RkZGRCwKKyAgICAweEZFMTQsIDB4RkUxMywgMHhGRTE2LCAweEZFMTUsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELAorICAgIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCisgICAgMHhGRkZELCAweEZGRkQsIDB4MDAwMCwgMHg1N0JFLCAweDAwMDAsIDB4NzEzRSwgMHgwMDAwLCAweDY5QTIsIDB4MDAwMCwKKyAgICAweDVCNzQsIDB4N0E0OSwgMHgwMDAwLCAweDAwMDAsIDB4N0E2NSwgMHg3QTdELCAweDAwMDAsIDB4N0FCQiwgMHg3QUIwLAorICAgIDB4N0FDMiwgMHg3QUMzLCAweDcxRDEsIDB4MDAwMCwgMHg0MUNBLCAweDdBREEsIDB4N0FERCwgMHg3QUVBLCAweDQxRUYsCisgICAgMHg1NEIyLCAweDAwMDAsIDB4N0IwQiwgMHg3QjU1LCAweDdCMjksIDB4MDAwMCwgMHgwMDAwLCAweDdCQTIsIDB4N0I2RiwKKyAgICAweDgzOUMsIDB4MDAwMCwgMHgwMDAwLCAweDdCRDAsIDB4ODQyMSwgMHg3QjkyLCAweEZGRkQsIDB4MDAwMCwgMHhGRkZELAorICAgIDB4ODQ5MiwgMHg3QkZBLCAweEZGRkQsIDB4N0MzNSwgMHgwMDAwLCAweDdDNDQsIDB4N0M4MywgMHgwMDAwLCAweDdDQTYsCisgICAgMHgwMDAwLCAweDdDQzksIDB4N0NDNywgMHg3Q0U2LCAweEZGRkQsIDB4N0NGMywgMHg3Q0Y1LCAweDdFNjcsIDB4NDUxRCwKKyAgICAweDAwMDAsIDB4N0Q1RCwgMHgwMDAwLCAweDdEODksIDB4N0RBQiwgMHg3MTM1LCAweDdEQjMsIDB4N0RENiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg3REU0LCAweDNEMTMsIDB4N0RGNSwgMHgwMDAwLCAweDdERTUsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsCisgICAgMHgwMDAwLCAweDdFNkUsIDB4RkZGRCwgMHg0MzJCLCAweDk0NkMsIDB4N0UyNywgMHg3RjQwLCAweDdGNDEsIDB4N0Y0NywKKyAgICAweDc5MzYsIDB4MDAwMCwgMHg5OUUxLCAweDdGOTcsIDB4MDAwMCwgMHg3RkEzLCAweDAwMDAsIDB4MDAwMCwgMHg0NTVDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDdGRkEsIDB4MDAwMCwgMHhGQTVCLCAweDgwMDgsIDB4ODAxRCwgMHhGRkZELCAweDgwMkYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODAzQiwgMHg4MDNDLCAweDgwNjEsIDB4MDAwMCwgMHg0OTg5LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NjcyNSwgMHg4MEE3LCAweDAwMDAsIDB4ODEwNywgMHg4MTFBLCAweDU4QjAsIDB4MDAwMCwgMHg2QzdGLAorICAgIDB4MDAwMCwgMHg2NEU3LCAweDAwMDAsIDB4ODIxOCwgMHgwMDAwLCAweDZBNTMsIDB4MDAwMCwgMHgwMDAwLCAweDQ0N0EsCisgICAgMHg4MjI5LCAweDAwMDAsIDB4MDAwMCwgMHg0RkY5LCAweDAwMDAsIDB4ODRFMiwgMHg4MzYyLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgyQUEsIDB4NjkxQiwgMHgwMDAwLCAweDQxREIsIDB4ODU0QiwgMHg4MkQwLAorICAgIDB4ODMxQSwgMHgwMDAwLCAweDAwMDAsIDB4MzZDMSwgMHgwMDAwLCAweDAwMDAsIDB4ODI3QiwgMHg4MkUyLCAweDgzMTgsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0RCRiwgMHg4MzFELCAweDU1RUMsIDB4ODM4NSwKKyAgICAweDQ1MEIsIDB4MDAwMCwgMHg4M0FDLCAweEZGRkQsIDB4ODNEMywgMHgwMDAwLCAweDZBNTcsIDB4ODU1QSwgMHgzNDk2LAorICAgIDB4MDAwMCwgMHg4NDU4LCAweDAwMDAsIDB4ODQ3MSwgMHgzREQzLCAweDQ0RTQsIDB4NkFBNywgMHg4NDRBLCAweDc5NTgsCisgICAgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg0REUsIDB4RkZGRCwgMHg4MzkxLCAweDQ0QTAsIDB4ODQ5MywKKyAgICAweDg0RTQsIDB4MDAwMCwgMHg0MjQwLCAweDAwMDAsIDB4NDU0MywgMHg4NTM0LCAweDVBRjIsIDB4NDUyMywgMHg0NTI3LAorICAgIDB4ODU3MywgMHg0NTE2LCAweDY3QkYsIDB4ODYxNiwgMHgwMDAwLCAweDAwMDAsIDB4ODVDMSwgMHgwMDAwLCAweDg2MDIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0NTZBLCAweDg2MjgsIDB4MzY0OCwgMHgwMDAwLCAweDUzRjcsIDB4MDAwMCwKKyAgICAweDg2N0UsIDB4RkZGRCwgMHgwMDAwLCAweDg3RUUsIDB4MDAwMCwgMHg4N0IxLCAweDg3REEsIDB4ODgwRiwgMHg1NjYxLAorICAgIDB4ODY2QywgMHg2ODU2LCAweDQ2MEYsIDB4ODg0NSwgMHg4ODQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NUUsCisgICAgMHg4ODlDLCAweDQ2NUIsIDB4ODhCNCwgMHg4OEI1LCAweDg4QzUsIDB4MDAwMCwgMHg4OTg3LCAweEZGRkQsIDB4RkZGRCwKKyAgICAweEZGRkQsIDB4ODlBNywgMHg4OUJDLCAweDAwMDAsIDB4ODlFNywgMHgwMDAwLCAweDAwMDAsIDB4OEE5QywgMHg3NzkzLAorICAgIDB4OTFGRSwgMHg4QTkwLCAweDAwMDAsIDB4N0FFOSwgMHgwMDAwLCAweDQ3MTMsIDB4MDAwMCwgMHg3MTdDLCAweDhCMEMsCisgICAgMHg4QjFGLCAweDAwMDAsIDB4MDAwMCwgMHg4QjNGLCAweEZGRkQsIDB4OEI0RCwgMHg4QUE5LCAweDAwMDAsIDB4OEI5MCwKKyAgICAweDhCOUIsIDB4OEFBRiwgMHgwMDAwLCAweDQ2MTUsIDB4ODg0RiwgMHg4QzlCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MzcyNSwgMHgwMDAwLCAweDhDRDYsIDB4MDAwMCwgMHgwMDAwLCAweDhEMTIsIDB4OEQwMywgMHgwMDAwLCAweDhDREIsCisgICAgMHg3MDVDLCAweDhEMTEsIDB4M0VEMCwgMHgwMDAwLCAweDhEQTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0I3QywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg3QUU3LCAweDhFQUQsIDB4OEVCNiwgMHg4RUMzLCAweDkyRDQsIDB4OEYxOSwgMHg4RjJELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGQTUsIDB4OTMwMywgMHgwMDAwLCAweDAwMDAsIDB4OEZCMywgMHhGRkZELCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NUVGOCwgMHgwMDAwLCAweDhGRjksIDB4RkZGRCwgMHgwMDAwLCAweDM5ODAsIDB4MDAwMCwKKyAgICAweDkwMzcsIDB4MDAwMCwgMHgwMDAwLCAweDkwNjEsIDB4MDAwMCwgMHgwMDAwLCAweDkwQTgsIDB4MDAwMCwgMHg5MEM0LAorICAgIDB4MDAwMCwgMHg5MEFFLCAweEZBMjYsIDB4OTE2NywgMHg5MUE5LCAweDkxQzQsIDB4N0NBQywgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MjBFLCAweDZDOUYsIDB4OTI0MSwgMHg5MjYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OTMyQywgMHg5MzZCLCAweDAwMDAsIDB4MDAwMCwgMHg1QUMzLCAweDAwMDAsIDB4MDAwMCwgMHg0OTY1LAorICAgIDB4OTI0NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MzczLCAweDk0NUIsIDB4OEVCQywgMHg5NTg1LCAweDk1QTYsCisgICAgMHg5NDI2LCAweDk1QTAsIDB4NkZGNiwgMHg0MkI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQ5REYsIDB4NkMxQywKKyAgICAweDk2N0IsIDB4OTY5NiwgMHg0MTZDLCAweDk2QTMsIDB4MDAwMCwgMHg2MURBLCAweEU0QUQsIDB4NzhGNSwgMHgwMDAwLAorICAgIDB4OTZCRCwgMHg1M0NDLCAweDQ5QTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTczMSwgMHg4NjQyLCAweDk3MzYsIDB4NEEwRiwgMHg0NTNELCAweDQ1ODUsIDB4MDAwMCwKKyAgICAweDcwNzUsIDB4NUI0MSwgMHg5NzFCLCAweEZGRkQsIDB4MDAwMCwgMHg5NzU3LCAweDVCNEEsIDB4MDAwMCwgMHg5NzVGLAorICAgIDB4OTQyNSwgMHg1MEQwLCAweDAwMDAsIDB4MDAwMCwgMHg5Nzg5LCAweDk3OUYsIDB4OTdCMSwgMHg5N0JFLCAweDk3QzAsCisgICAgMHg5N0QyLCAweDk3RTAsIDB4MDAwMCwgMHg5N0VFLCAweDc0MUMsIDB4MDAwMCwgMHhGRkZELCAweDk3RjUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NEFEMSwgMHg5ODM0LCAweDk4MzMsIDB4OTg0QiwgMHg5ODY2LCAweDNCMEUsIDB4MDAwMCwgMHgzRDUxLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OThDQSwgMHg5OEI3LCAweDk4QzgsIDB4OThDNywgMHg0QUZGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDU1QjAsIDB4OThFMSwgMHg5OEU2LCAweDk4RUMsIDB4OTM3OCwgMHg5OTM5LCAweDAwMDAsIDB4NEI3MiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5OUY1LCAweDlBMEMsIDB4OUEzQiwgMHg5QTEwLCAweDlBNTgsIDB4MDAwMCwgMHgzNkM0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDlBRTAsIDB4OUFFMiwgMHgwMDAwLCAweDlBRjQsIDB4NEMwRSwgMHg5QjE0LCAweDlCMkQsCisgICAgMHgwMDAwLCAweDUwMzQsIDB4OUIzNCwgMHgzOEMzLCAweDAwMDAsIDB4OUI1MCwgMHg5QjQwLCAweDAwMDAsIDB4NUE0NSwKKyAgICAweDAwMDAsIDB4OUI4RSwgMHg5QzAyLCAweDlCRkYsIDB4OUMwQywgMHgwMDAwLCAweDlERDQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5RDdFLCAweDlEODMsIDB4MDAwMCwgMHg5RTBFLCAweDlEQzQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDlEMzksIDB4MDAwMCwgMHgwMDAwLCAweDlFOTAsIDB4OUU5NSwKKyAgICAweDlFOUUsIDB4OUVBMiwgMHg0RDM0LCAweDlFQUEsIDB4OUVBRiwgMHgwMDAwLCAweDlFQzEsIDB4M0I2MCwgMHgzOUU1LAorICAgIDB4M0QxRCwgMHg0RjMyLCAweDM3QkUsIDB4MDAwMCwgMHg5RjAyLCAweDlGMDgsIDB4NEI5NiwgMHg5NDI0LCAweDAwMDAsCisgICAgMHg5RjE3LCAweDAwMDAsIDB4OUYzOSwgMHg1NjlGLCAweDU2OEEsIDB4OUY0NSwgMHg5OUI4LCAweDAwMDAsIDB4OTdGMiwKKyAgICAweDg0N0YsIDB4RkZGRCwgMHg5RjY5LCAweDdBREMsIDB4OUY4RSwgMHg3MjE2LCAweDRCQkUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NzE3NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3MzlFLCAweDAwMDAsIDB4MDAwMCwgMHg3OTlGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDkzNjksIDB4OTNGMywgMHgwMDAwLCAweDkyRUMsIDB4OTM4MSwgMHg5M0NCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDcyMTcsIDB4M0VFQiwgMHg3NzcyLCAweDdBNDMsIDB4NzBEMCwgMHgwMDAwLCAweDAwMDAsIDB4NzE3RSwgMHgwMDAwLAorICAgIDB4NzBBMywgMHgwMDAwLCAweDAwMDAsIDB4M0VDNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNzIyLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDM2RTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzcyMywgMHgwMDAwLCAweDU3NUIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODUwMywgMHgwMDAwLCAweEZGRkQsIDB4ODQ1NSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQ0RjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg2N0Y5LCAweDM3MzMsIDB4M0MxNSwgMHgzREU3LCAweDU4NkMsIDB4MDAwMCwgMHg2ODEwLCAweDQwNTcsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTRDQiwgMHg1NjlFLCAweDAwMDAsIDB4NTY5MiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHg5MzlDLCAweDRFRjgsIDB4NTEyQiwgMHgzODE5LCAweDAwMDAsCisgICAgMHg0RUJDLCAweDAwMDAsIDB4RkZGRCwgMHg0RjRCLCAweDRGOEEsIDB4MDAwMCwgMHg1QTY4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDM5OTksIDB4MDAwMCwgMHgwMDAwLCAweDM0MzUsIDB4NEYyOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QURBLAorICAgIDB4MDAwMCwgMHg0RTk4LCAweDUwQ0QsIDB4NTEwRCwgMHg0RkEyLCAweDRGMDMsIDB4MDAwMCwgMHgwMDAwLCAweDRGNDIsCisgICAgMHg1MDJFLCAweDUwNkMsIDB4NTA4MSwgMHg0RkNDLCAweDRGRTUsIDB4NTA1OCwgMHg1MEZDLCAweDZFNzYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg2RDcyLCAweDAwMDAsIDB4MDAwMCwgMHg1MUE4LCAweDUxQzMsIDB4MDAwMCwgMHg0NERELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ3QSwgMHgwMDAwLCAweDAwMDAsIDB4NTI1OSwgMHg1MkE0LCAweDAwMDAsCisgICAgMHg1MkUxLCAweEZGRkQsIDB4NDY3QSwgMHg3MThDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjlEMSwKKyAgICAweDAwMDAsIDB4RkZGRCwgMHgzRURFLCAweDc0OTksIDB4NzQxNCwgMHg3NDU2LCAweDczOTgsIDB4NEI4RSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg1M0QwLCAweDM1ODQsIDB4NzIwRiwgMHgwMDAwLCAweDU1QjQsIDB4MDAwMCwgMHg1NENELCAweDAwMDAsCisgICAgMHg1NzFELCAweDkyNUQsIDB4OTZGNCwgMHg1N0RELCAweDU3OEQsIDB4NTc3RiwgMHgzNjNFLCAweDU4Q0IsIDB4NUE5OSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NUEyQywgMHg1OUI4LCAweDVBN0UsIDB4NUFDRiwgMHg1QTEyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNkY1LCAweDZEMDUsIDB4NzQ0MywgMHg1QTIxLCAweDAwMDAsCisgICAgMHg1QTgxLCAweDAwMDAsIDB4MDAwMCwgMHg5M0UwLCAweDc0OEMsIDB4MDAwMCwgMHg3MTA1LCAweDQ5NzIsIDB4OTQwOCwKKyAgICAweDAwMDAsIDB4OTNCRCwgMHgzN0EwLCAweDVDMUUsIDB4NUM5RSwgMHg1RTVFLCAweDVFNDgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg1RUNELCAweDVCNEYsIDB4MDAwMCwgMHgwMDAwLCAweDM3MDEsIDB4MDAwMCwgMHgzNkRELCAweDAwMDAsCisgICAgMHgzNkQzLCAweDgxMkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1RjBDLCAweDVGMEUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NUE2QiwgMHgwMDAwLCAweDVCNDQsIDB4MDAwMCwgMHg4ODYwLCAweDYwN0UsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NUZEQiwgMHgzRUI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjFDMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDYxOTksIDB4NjE5OCwgMHg2MDc1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjQ3MSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgzQTI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjMzNywgMHg2NEI2LAorICAgIDB4NjMzMSwgMHg2M0QxLCAweDAwMDAsIDB4MDAwMCwgMHg2MkE0LCAweDAwMDAsIDB4NjQzQiwgMHg2NTZCLCAweDY5NzIsCisgICAgMHgzQkY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTUwRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDY2Q0UsIDB4MDAwMCwgMHgwMDAwLCAweDNBRTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg3OEVFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM0NjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg2NjhFLCAweDAwMDAsIDB4NjY2QiwgMHg0QjkzLCAweDY2MzAsIDB4MDAwMCwgMHgwMDAwLCAweDY2NjMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NjYxRSwgMHgwMDAwLCAweDM4RDEsIDB4MDAwMCwgMHgwMDAwLCAweDNCOTksIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NzREMCwgMHgzQjk2LCAweDAwMDAsIDB4NjhCNiwgMHhGRkZELCAweDNCQzQsIDB4NkFCRSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg2QTMzLCAweDZBNTIsIDB4NkFDOSwgMHg2QjA1LCAweDAwMDAsIDB4NjUxMSwgMHg2ODk4LCAweDZBNEMsIDB4M0JENywKKyAgICAweDZBN0EsIDB4NkI1NywgMHgwMDAwLCAweDAwMDAsIDB4OTNBMCwgMHg5MkYyLCAweDAwMDAsIDB4MDAwMCwgMHg5Mjg5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDk0NjcsIDB4NkRBNSwgMHg2RjBCLCAweEZGRkQsIDB4MDAwMCwgMHgzRDhGLCAweDZFMDQsCisgICAgMHgwMDAwLCAweDVBM0QsIDB4NkUwQSwgMHg1ODQ3LCAweDZEMjQsIDB4Nzg0MiwgMHg3MTNCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDcwRjEsIDB4NzI1MCwgMHg3Mjg3LCAweDcyOTQsIDB4MDAwMCwgMHgwMDAwLCAweDUxNzksIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NzQ3QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0YwNiwgMHgzRUIxLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NjBBNywgMHgzRUYzLCAweDc0Q0MsIDB4NzQzQywgMHg5Mzg3LCAweDc0MzcsIDB4NDQ5RiwKKyAgICAweDAwMDAsIDB4NDU1MSwgMHg3NTgzLCAweDNGNjMsIDB4MDAwMCwgMHgwMDAwLCAweDNGNTgsIDB4NzU1NSwgMHg3NjczLAorICAgIDB4MDAwMCwgMHhGRkZELCAweDc0NjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0FGQiwgMHgzRENELCAweDAwMDAsCisgICAgMHgzRUZGLCAweDAwMDAsIDB4MDAwMCwgMHg5MUZBLCAweDU3MzIsIDB4OTM0MiwgMHgwMDAwLCAweDAwMDAsIDB4NTBERiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg3Nzc4LCAweDAwMDAsIDB4NzcwRSwgMHg3NzBGLCAweDc3N0IsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4M0E1RSwgMHgwMDAwLCAweDc0MzgsIDB4NzQ5QiwgMHgzRUJGLCAweDAwMDAsIDB4MDAwMCwgMHg0MEM4LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDkzMDcsIDB4MDAwMCwgMHg3ODFFLCAweDc4OEQsIDB4Nzg4OCwgMHg3OEQyLCAweDczRDAsIDB4Nzk1OSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg0MTBFLCAweEZGRkQsIDB4RkZGRCwgMHg3OUE1LCAweDZBMkQsIDB4MDAwMCwgMHg3QTNBLAorICAgIDB4NzlGNCwgMHg0MTZFLCAweDAwMDAsIDB4NDEzMiwgMHg5MjM1LCAweDc5RjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MzU5NywgMHg1NTZCLCAweDM1NzAsIDB4MzZBQSwgMHgwMDAwLCAweDAwMDAsIDB4N0FFMiwKKyAgICAweDVBNTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NUEwRCwgMHgwMDAwLCAweDc4RjAsIDB4NUEyQSwgMHgwMDAwLAorICAgIDB4N0FGRSwgMHg0MUY5LCAweDdDNUQsIDB4N0M2RCwgMHg0MjExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDdDQ0QsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4N0M4RSwgMHg3QzdDLCAweDdDQUUsIDB4NkFCMiwgMHg3RERDLCAweDdFMDcsIDB4N0REMywKKyAgICAweDdGNEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4N0Q5NywgMHgwMDAwLCAweDQyNkEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NjdENiwgMHgwMDAwLCAweDAwMDAsIDB4NTdDNCwgMHgwMDAwLCAweDAwMDAsIDB4N0ZERCwgMHg3QjI3LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4N0IwQywgMHgwMDAwLCAweDk5RTYsIDB4ODY0NSwgMHg5QTYzLCAweDZBMUMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5QTFGLCAweDAwMDAsIDB4ODQ5NSwgMHgwMDAwLCAweDAwMDAsIDB4NDRFQSwgMHg4MTM3LAorICAgIDB4NDQwMiwgMHg4MEM2LCAweDgxMDksIDB4ODE0MiwgMHgwMDAwLCAweDk4QzMsIDB4MDAwMCwgMHg4MjYyLCAweDgyNjUsCisgICAgMHgwMDAwLCAweDg0NTMsIDB4MDAwMCwgMHg4NjEwLCAweDAwMDAsIDB4NUE4NiwgMHg0MTdGLCAweDAwMDAsIDB4NUIyQiwKKyAgICAweDAwMDAsIDB4NUFFNCwgMHgwMDAwLCAweDg2QTAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MkQsIDB4MDAwMCwgMHg1QTAyLAorICAgIDB4ODg2RSwgMHg0RjQ1LCAweDg4ODcsIDB4ODhCRiwgMHg4OEU2LCAweDg5NjUsIDB4ODk0RCwgMHgwMDAwLCAweDg5NTQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzRUFELCAweDg0QTMsIDB4NDZGNSwKKyAgICAweDQ2Q0YsIDB4MzdGMiwgMHg4QTNELCAweDhBMUMsIDB4MDAwMCwgMHg1RjRELCAweDkyMkIsIDB4MDAwMCwgMHg2NUQ0LAorICAgIDB4NzEyOSwgMHg3MEM0LCAweDAwMDAsIDB4OUQ2RCwgMHg4QzlGLCAweDhDRTksIDB4MDAwMCwgMHg1OTlBLCAweDc3QzMsCisgICAgMHg1OUYwLCAweDM2RDQsIDB4OEUyQSwgMHg4RUE3LCAweDAwMDAsIDB4OEYzMCwgMHg4RjRBLCAweDQyRjQsIDB4NkM1OCwKKyAgICAweDZGQkIsIDB4MDAwMCwgMHg0ODlCLCAweDZGNzksIDB4NkU4QiwgMHgwMDAwLCAweDlCRTksIDB4MzZCNSwgMHgwMDAwLAorICAgIDB4OTBCQiwgMHg0OEI0LCAweDU1NzEsIDB4NDkwNiwgMHg5MUJCLCAweDk0MDQsIDB4MDAwMCwgMHg0MDYyLCAweDAwMDAsCisgICAgMHg5NDI3LCAweDAwMDAsIDB4MDAwMCwgMHg4NEU1LCAweDhBMkIsIDB4OTU5OSwgMHg5NUE3LCAweDk1OTcsIDB4OTU5NiwKKyAgICAweDAwMDAsIDB4NzQ0NSwgMHgzRUMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNFRTcsIDB4MDAwMCwgMHg5NjhGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0VDQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3NDEyLCAweDc0NkIsCisgICAgMHgzRUZDLCAweDk3NDEsIDB4MDAwMCwgMHg2ODQ3LCAweDRBMUQsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4OTM2OCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTJCQSwgMHg1QjExLCAweDhCNjksIDB4NDkzQywgMHg3M0Y5LAorICAgIDB4MDAwMCwgMHg5NzlCLCAweEZGRkQsIDB4OTkzOCwgMHgwMDAwLCAweDVEQzEsIDB4MDAwMCwgMHgwMDAwLCAweDk4MUYsCisgICAgMHgwMDAwLCAweDkyRjYsIDB4MDAwMCwgMHg5MUU1LCAweDQ0QzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OThEQywKKyAgICAweDAwMDAsIDB4M0YwMCwgMHg5MjJBLCAweDQ5MjUsIDB4ODQxNCwgMHg5OTNCLCAweDk5NEQsIDB4MDAwMCwgMHgzREZELAorICAgIDB4RkZGRCwgMHg0QjZGLCAweDk5QUEsIDB4OUE1QywgMHgwMDAwLCAweDAwMDAsIDB4NkE4RiwgMHg5QTIxLCAweDVBRkUsCisgICAgMHg5QTJGLCAweDAwMDAsIDB4NEI5MCwgMHgwMDAwLCAweDk5QkMsIDB4NEJCRCwgMHg0Qjk3LCAweDkzN0QsIDB4NTg3MiwKKyAgICAweDAwMDAsIDB4NTgyMiwgMHgwMDAwLCAweDAwMDAsIDB4Nzg0NCwgMHgwMDAwLCAweDAwMDAsIDB4NjhDNSwgMHgzRDdELAorICAgIDB4OTQ1OCwgMHgzOTI3LCAweDYxNTAsIDB4MDAwMCwgMHgwMDAwLCAweDYxMDcsIDB4OUM0RiwgMHg5QzUzLCAweDlDN0IsCisgICAgMHg5QzM1LCAweDlDMTAsIDB4OUI3RiwgMHg5QkNGLCAweDAwMDAsIDB4OUI5RiwgMHgwMDAwLCAweDAwMDAsIDB4OUQyMSwKKyAgICAweDRDQUUsIDB4MDAwMCwgMHg5RTE4LCAweDRDQjAsIDB4OUQwQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OURBNSwgMHg4NEJELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1RkMsIDB4NDUzMywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg0MjAsIDB4ODVFRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3OUUyLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4M0Q2MiwgMHg5M0RCLCAweDkyQkUsIDB4OTM0OCwgMHgwMDAwLCAweDc4QjksIDB4OTI3NywgMHg5NDRELAorICAgIDB4NEZFNCwgMHgzNDQwLCAweDkwNjQsIDB4MDAwMCwgMHg3ODNELCAweDc4NTQsIDB4NzhCNiwgMHg3ODRCLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MzY5QSwgMHg0RjcyLCAweDZGREEsIDB4NkZEOSwgMHhGRkZELCAweDcwMUUsIDB4NTQxNCwKKyAgICAweDAwMDAsIDB4NTdCQiwgMHg1OEYzLCAweDU3OEEsIDB4OUQxNiwgMHg1N0Q3LCAweDcxMzQsIDB4MzRBRiwgMHgwMDAwLAorICAgIDB4NzFFQiwgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDAsIDB4NjEwQywgMHg1QUNFLCAweDVBMEIsCisgICAgMHg0MkJDLCAweDAwMDAsIDB4MzcyQywgMHg0QjdCLCAweDAwMDAsIDB4OTNCQiwgMHg5M0I4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg0NzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU5OTQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4N0RBOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTJFNSwgMHg3M0UyLCAweDNFRTksCisgICAgMHg3NEI0LCAweDAwMDAsIDB4MDAwMCwgMHgzRUUxLCAweDAwMDAsIDB4NkFEOCwgMHg3M0YzLCAweDczRkIsIDB4M0VENiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzQ0OCwgMHgwMDAwLAorICAgIDB4NzBBNSwgMHgwMDAwLCAweDkyODQsIDB4NzNFNiwgMHg5MzVGLCAweDAwMDAsIDB4OTMzMSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5Mzg2LCAweDAwMDAsIDB4MDAwMCwgMHg0OTM1LCAweDAwMDAsIDB4NzE2QiwgMHgwMDAwLCAweDAwMDAsIDB4NTZBNCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU1MDIsIDB4NzlDNCwgMHgwMDAwLCAweDdERkUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg0NTJFLCAweDk0MDEsIDB4MzcwQSwgMHgwMDAwLCAweDAwMDAsIDB4NTlCMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDVBQTEsIDB4MzZFMiwgMHgwMDAwLCAweDM2QjAsIDB4OTI1RiwgMHg1QTc5LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkzNzQsIDB4M0NDRCwgMHgwMDAwLCAweDRBOTYsIDB4Mzk4QSwgMHg1MEY0LCAweDNENjksIDB4M0Q0QywgMHgwMDAwLAorICAgIDB4NzE3NSwgMHg0MkZCLCAweDAwMDAsIDB4NkUwRiwgMHgwMDAwLCAweDQ0RUIsIDB4NkQ1NywgMHgwMDAwLCAweDcwNjcsCisgICAgMHg2Q0FGLCAweDNDRDYsIDB4MDAwMCwgMHgwMDAwLCAweDZFMDIsIDB4NkYwQywgMHgzRDZGLCAweDAwMDAsIDB4NzU1MSwKKyAgICAweDM2QkMsIDB4MzRDOCwgMHg0NjgwLCAweDNFREEsIDB4NDg3MSwgMHg1OUM0LCAweDkyNkUsIDB4NDkzRSwgMHg4RjQxLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDU4MTIsIDB4NTdDOCwgMHgzNkQ2LCAweDAwMDAsIDB4NzBGRSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg2OEI5LCAweDY5NjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NkExQSwgMHgwMDAwLCAweDAwMDAsIDB4ODQzRSwgMHg0NERGLAorICAgIDB4NDRDRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4RkZGRCwgMHg4MzNELCAweDAwMDAsCisgICAgMHg4M0VELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU5ODksIDB4NUE4MiwgMHgwMDAwLCAweDVBNjEsIDB4NUE3MSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgzNzJELCAweDU5RUYsIDB4MDAwMCwgMHgzNkM3LCAweDcxOEUsIDB4OTM5MCwgMHg2NjlBLAorICAgIDB4MDAwMCwgMHg1QTZFLCAweDVBMkIsIDB4MDAwMCwgMHg2QTJCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg3MTFELCAweDAwMDAsIDB4MDAwMCwgMHg0RkIwLCAweDAwMDAsIDB4NUNDMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDZBMEMsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4NzEzMywgMHgwMDAwLCAweDNEQTUsIDB4NkNERiwgMHgwMDAwLAorICAgIDB4NTlFQiwgMHg1RjVDLCAweDAwMDAsIDB4N0NEMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDZDLCAweDgxRjYsCisgICAgMHg3NzBDLCAweDZDQTIsIDB4NTZGRCwgMHg1ODY5LCAweDY3NjEsIDB4NUM1RSwgMHg1OEYyLCAweDcwQjksIDB4NjgwMywKKyAgICAweDhGQkIsIDB4OEZCQywgMHg0RTIxLCAweDdCMzksIDB4M0RDQywgMHg3MzJBLCAweDc1NjAsIDB4NTgzQSwgMHg4MkE2LAorICAgIDB4Njk4QSwgMHg2MEUzLCAweDRFRUUsIDB4OTlDNCwgMHg5RUJGLCAweDUzMDEsIDB4NjdBMCwgMHg2MEU4LCAweDUxQjQsCisgICAgMHg3QTgzLCAweDlDM0EsIDB4N0FDOCwgMHg2OTFBLCAweDU5QUMsIDB4NTg0MCwgMHg1NDZBLCAweDYwRTcsIDB4NTY3QSwKKyAgICAweDY5NTUsIDB4OUMyRiwgMHg4N0E1LCAweDVDMjAsIDB4NUUwQiwgMHg2NzFFLCAweDg0QUQsIDB4OEI4MSwgMHg0RTc4LAorICAgIDB4NjJDMywgMHg2ODU1LCAweEZGRkQsIDB4ODJGRCwgMHg4OUE1LCAweDhGQTAsIDB4OTdCOCwgMHg5ODQ3LCAweDlBQkQsCisgICAgMHg1RkIxLCAweDY2NDgsIDB4NjZCRiwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHhGRkZELCAweEZGRkQsIDB4MDAwMCwKKyAgICAweDY3MEUsIDB4NjkxOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQ4RDAsIDB4NEFCOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTFEMiwgMHgwMDAwLCAweDU5OUYsIDB4MDAwMCwgMHgzQkJFLCAweDAwMDAsCisgICAgMHgzOTlCLCAweDAwMDAsIDB4MDAwMCwgMHgzNzYyLCAweDAwMDAsIDB4OEI1RSwgMHgwMDAwLCAweEZGRkQsIDB4NzIwOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RURBLCAweDUyOEYsIDB4NzE3MSwgMHgwMDAwLCAweDAwMDAsIDB4NTVCQywgMHgwMDAwLAorICAgIDB4MzQ3MywgMHgwMDAwLCAweDQ3MTgsIDB4MDAwMCwgMHg1MDY2LCAweDM0RkIsIDB4MDAwMCwgMHhGRkZELCAweDQ3N0MsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDkwNTYsIDB4MDAwMCwgMHg4QjYyLCAweDVENUIsIDB4MDAwMCwKKyAgICAweEZGRkQsIDB4MDAwMCwgMHg4QUVBLCAweDAwMDAsIDB4MDAwMCwgMHg0QkMwLCAweDAwMDAsIDB4OTQ2NSwgMHgwMDAwLAorICAgIDB4NjE5NSwgMHg1QTI3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDRFNkEsIDB4MDAwMCwgMHg5NjU2LCAweDZEOEYsCisgICAgMHgwMDAwLCAweDg5NzcsIDB4MDAwMCwgMHhGRkZELCAweDdCNDIsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4N0E0NSwKKyAgICAweDlBMjYsIDB4MzY1RiwgMHgwMDAwLCAweDAwMDAsIDB4Nzk4MywgMHg1RDJDLCAweDAwMDAsIDB4RkZGRCwgMHg0NkQwLAorICAgIDB4NzUzQiwgMHg4ODY1LCAweDU4QjYsIDB4MzcxQywgMHgwMDAwLCAweDNDNTQsIDB4OTI4MSwgMHgwMDAwLCAweDkzMzAsCisgICAgMHgwMDAwLCAweDZDMzksIDB4MDAwMCwgMHg4ODI3LCAweDg4RjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NkVCOCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgzOUE0LCAweEZGRkQsIDB4RkZGRCwgMHg0NTNGLCAweDY2QjYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODk0MywgMHg0MERGLCAweDAwMDAsIDB4MzlBMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3MUFELCAweDgzNjYsCisgICAgMHgwMDAwLCAweEZGRkQsIDB4NENCNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3QjQzLCAweDc5N0UsIDB4NkZCNSwKKyAgICAweDAwMDAsIDB4NkEwMywgMHgwMDAwLCAweDUzQTIsIDB4MDAwMCwgMHg5M0JGLCAweDY4MzYsIDB4OTc1RCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NUQ4NSwgMHgwMDAwLCAweDU3MTUsIDB4OTgyMywgMHgwMDAwLCAweDVEQUIsCisgICAgMHgwMDAwLCAweDY1QkUsIDB4NjlENSwgMHg1M0QyLCAweDAwMDAsIDB4MDAwMCwgMHgzQzExLCAweDY3MzYsIDB4MDAwMCwKKyAgICAweDM1Q0EsIDB4NDhGQSwgMHhGRkZELCAweDc4MDgsIDB4OTI1NSwgMHg0M0YyLCAweDQzREYsIDB4NTlGOCwgMHhGRkZELAorICAgIDB4NTY4QiwgMHgwMDAwLCAweDkwMTIsIDB4NTVDMSwgMHg0NTA5LCAweDdFN0YsIDB4NkY1NiwgMHg2QUIxLCAweDM0RTQsCisgICAgMHgwMDAwLCAweDM3M0EsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDAsIDB4M0RFQiwgMHgwMDAwLCAweDAwMDAsIDB4NTZCRiwKKyAgICAweDhFMEUsIDB4NUI2RCwgMHg2M0RFLCAweEZGRkQsIDB4NjUzMCwgMHg1NjJELCAweDU0MUEsIDB4MDAwMCwgMHg0QzdELAorICAgIDB4NTYyMiwgMHg1NjFFLCAweDdGNDksIDB4NTk3NSwgMHgwMDAwLCAweDg3NzAsIDB4ODExNywgMHg5RDVFLCAweDhEMTgsCisgICAgMHg3NjNCLCAweDlDNDUsIDB4NzY0RSwgMHg3N0I5LCAweDkzNDUsIDB4NTQzMiwgMHg4MTQ4LCAweDgyRjcsIDB4NTYyNSwKKyAgICAweDgxMzIsIDB4ODQxOCwgMHg4MEJELCAweDU1RUEsIDB4Nzk2MiwgMHg1NjQzLCAweDU0MTYsIDB4MDAwMCwgMHgzNUNFLAorICAgIDB4NTYwNSwgMHg1NUYxLCAweDY2RjEsIDB4MDAwMCwgMHgzNjJELCAweDc1MzQsIDB4NTVGMCwgMHg1NUJBLCAweDU0OTcsCisgICAgMHg1NTcyLCAweDAwMDAsIDB4MDAwMCwgMHg1RUQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDlFQUIsIDB4N0Q1QSwKKyAgICAweEZGRkQsIDB4MDAwMCwgMHg2MjlELCAweDk3NkQsIDB4NTQ5NCwgMHg4Q0NELCAweDcxRjYsIDB4OTE3NiwgMHg2M0ZDLAorICAgIDB4NjNCOSwgMHg2M0ZFLCAweDU1NjksIDB4MDAwMCwgMHg5QzcyLCAweDAwMDAsIDB4NTE5QSwgMHgzNERGLCAweDAwMDAsCisgICAgMHg1MUE3LCAweDU0NEQsIDB4NTUxRSwgMHg1NTEzLCAweDc2NjYsIDB4OEUyRCwgMHgwMDAwLCAweDc1QjEsIDB4ODBCNiwKKyAgICAweDg4MDQsIDB4RkZGRCwgMHg4OEM3LCAweDgxQjYsIDB4ODQxQywgMHg0NEVDLCAweDczMDQsIDB4ODMwQiwgMHg1NjdCLAorICAgIDB4OTE3MCwgMHg5MjA4LCAweDAwMDAsIDB4NzI2NiwgMHg0NzRFLCAweDAwMDAsIDB4NDBGQSwgMHg5QzVELCAweDY1MUYsCisgICAgMHg0OEYzLCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsIDB4RUQyQiwgMHgwMDAwLCAweDcxQTMsIDB4N0U4RSwKKyAgICAweDlENTAsIDB4MzU3NywgMHg2Q0IyLCAweDUzNjcsIDB4MzlEQywgMHgwMDAwLCAweDgyMkQsIDB4NTQ0QiwgMHhFRDQzLAorICAgIDB4M0E1MiwgMHg3Mzc0LCAweDAwMDAsIDB4NEQwOSwgMHg5QkVELCAweEZGRkQsIDB4NEM1QiwgMHgwMDAwLCAweDg0NUMsCisgICAgMHgwMDAwLCAweDYzMkUsIDB4N0QyNSwgMHgzQTJBLCAweDkwMDgsIDB4NTJDQywgMHgzRTc0LCAweDM2N0EsIDB4NDVFOSwKKyAgICAweDAwMDAsIDB4NzY0MCwgMHg1QUYwLCAweDAwMDAsIDB4Nzg3QSwgMHgwMDAwLCAweDU4QTcsIDB4NDBCRiwgMHg1NjdDLAorICAgIDB4OUI4QiwgMHg1RDc0LCAweDc2NTQsIDB4MDAwMCwgMHg5RTg1LCAweDRDRTEsIDB4RkZGRCwgMHgzN0ZCLCAweDYxMTksCisgICAgMHgwMDAwLCAweEVENzMsIDB4NTY1RCwgMHgwMDAwLCAweDUyMzQsIDB4MzVBRCwgMHhGRkZELCAweDlEN0MsIDB4N0M1NiwKKyAgICAweDlCMzksIDB4NTdERSwgMHg1QzUzLCAweDY0RDMsIDB4MDAwMCwgMHgwMDAwLCAweDg2QUQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4RUQ4QywgMHg1MUZFLCAweDAwMDAsIDB4NUQ4RSwgMHg5NzAzLCAweDAwMDAsIDB4OUU4MSwgMHg5MDRDLCAweDdCMUYsCisgICAgMHg5QjAyLCAweDVDRDEsIDB4N0JBMywgMHg2MjY4LCAweDYzMzUsIDB4OUFGRiwgMHg3QkNGLCAweDlCMkEsIDB4N0M3RSwKKyAgICAweEZGRkQsIDB4N0M0MiwgMHg3Qzg2LCAweDlDMTUsIDB4N0JGQywgMHg5QjA5LCAweEZGRkQsIDB4OUMyRSwgMHg5RjVBLAorICAgIDB4NTU3MywgMHg1QkMzLCAweDRGRkQsIDB4OUU5OCwgMHg0RkYyLCAweDUyNjAsIDB4NTJEMSwgMHg1NzY3LCAweDUwNTYsCisgICAgMHg1OUI3LCAweDVFMTIsIDB4OTdDOCwgMHg5REFCLCAweDhGNUMsIDB4NTQ2OSwgMHg5N0I0LCAweDk5NDAsIDB4OTdCQSwKKyAgICAweDUzMkMsIDB4NjEzMCwgMHg2OTJDLCAweDUzREEsIDB4OUMwQSwgMHg5RDAyLCAweDRDM0IsIDB4OTY0MSwgMHg2OTgwLAorICAgIDB4NTBBNiwgMHg3NTQ2LCAweDAwMDAsIDB4OTlEQSwgMHg1MjczLCAweEVEQzksIDB4OTE1OSwgMHg5NjgxLCAweDkxNUMsCisgICAgMHhFRENELCAweDkxNTEsIDB4MDAwMCwgMHg2MzdGLCAweDZBQ0EsIDB4NTYxMSwgMHg5MThFLCAweDc1N0EsIDB4NjI4NSwKKyAgICAweDczNEYsIDB4N0M3MCwgMHgwMDAwLCAweEVEREMsIDB4NzZENiwgMHg5QjlELCAweDRFMkEsIDB4MDAwMCwgMHg4M0JFLAorICAgIDB4ODg0MiwgMHhFREU0LCAweDVDNEEsIDB4NjlDMCwgMHhGRkZELCAweEZGRkQsIDB4NTIxRiwgMHg1REY1LCAweDRFQ0UsCisgICAgMHg2QzMxLCAweDAwMDAsIDB4NEYzOSwgMHg1NDlDLCAweEZGRkQsIDB4NTI5QSwgMHg4RDgyLCAweDM1RkUsIDB4RkZGRCwKKyAgICAweDM1RjMsIDB4RURGNiwgMHg2QjUyLCAweDkxN0MsIDB4OUZBNSwgMHg5Qjk3LCAweDk4MkUsIDB4OThCNCwgMHg5QUJBLAorICAgIDB4OUVBOCwgMHg5RTg0LCAweDdCMTQsIDB4RUUwMiwgMHg2QkZBLCAweDg4MTgsIDB4N0Y3OCwgMHhFRTA2LCAweDU2MjAsCisgICAgMHgwMDAwLCAweDhFNzcsIDB4OUY1MywgMHhFRTBCLCAweDhERDQsIDB4OEU0RiwgMHg5RTFDLCAweDhFMDEsIDB4NjI4MiwKKyAgICAweDAwMDAsIDB4OEUyOCwgMHg4RTc1LCAweDdBRDMsIDB4N0EzRSwgMHg3OEQ4LCAweDZDRUEsIDB4OEE2NywgMHg3NjA3LAorICAgIDB4OUYyNiwgMHg2Q0NFLCAweDg3RDYsIDB4NzVDMywgMHgwMDAwLCAweDc4NTMsIDB4OEQwQywgMHg3MkUyLCAweDczNzEsCisgICAgMHg4QjJELCAweDczMDIsIDB4NzRGMSwgMHg4Q0VCLCAweDAwMDAsIDB4ODYyRiwgMHg1RkJBLCAweDg4QTAsIDB4NDRCNywKKyAgICAweEVFMkYsIDB4MDAwMCwgMHhFRTMyLCAweDhBN0UsIDB4MDAwMCwgMHhFRTM1LCAweDYwRkQsIDB4NzY2NywgMHg5QUQ3LAorICAgIDB4OUQ0NCwgMHg5MzZFLCAweDlCOEYsIDB4ODdGNSwgMHhFRTNELCAweEZGRkQsIDB4OENGNywgMHg3MzJDLCAweDk3MjEsCisgICAgMHg5QkIwLCAweDM1RDYsIDB4NzJCMiwgMHg0QzA3LCAweDdDNTEsIDB4OTk0QSwgMHg2MTU5LCAweDRDMDQsIDB4OUU5NiwKKyAgICAweDYxN0QsIDB4RUU0RCwgMHg1NzVGLCAweDYxNkYsIDB4NjJBNiwgMHg2MjM5LCAweEZGRkQsIDB4M0E1QywgMHg2MUUyLAorICAgIDB4NTNBQSwgMHg2MzY0LCAweDY4MDIsIDB4MzVEMiwgMHg1RDU3LCAweDhGREEsIDB4MDAwMCwgMHhFRTVFLCAweDUwRDksCisgICAgMHg3OTA2LCAweDUzMzIsIDB4OTYzOCwgMHgwMDAwLCAweDQwNjUsIDB4RUU2NiwgMHg3N0ZFLCAweEVFNjgsIDB4N0NDMiwKKyAgICAweDAwMDAsIDB4N0NEQSwgMHg3QTJELCAweDgwNjYsIDB4ODA2MywgMHg3RDRELCAweDc1MDUsIDB4NzRGMiwgMHg4OTk0LAorICAgIDB4ODIxQSwgMHg2NzBDLCAweDgwNjIsIDB4MDAwMCwgMHg4MDVCLCAweDc0RjAsIDB4ODEwMywgMHg3NzI0LCAweDg5ODksCisgICAgMHgwMDAwLCAweDc1NTMsIDB4ODdBOSwgMHg4N0NFLCAweDgxQzgsIDB4ODc4QywgMHg4QTQ5LCAweDhDQUQsIDB4OEI0MywKKyAgICAweDc3MkIsIDB4NzRGOCwgMHg4NERBLCAweDY5QjIsIDB4OERBNiwgMHhFRThDLCAweDg5QTksIDB4RkZGRCwgMHg2REI5LAorICAgIDB4ODdDMSwgMHgwMDAwLCAweDc0RTcsIDB4M0REQiwgMHg3MTc2LCAweDYwQTQsIDB4NjE5QywgMHgzQ0QxLCAweEZGRkQsCisgICAgMHg2MDc3LCAweEVFOUEsIDB4N0Y3MSwgMHgwMDAwLCAweDYwRTksIDB4NEI3RSwgMHgwMDAwLCAweDkyREIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODU0QywgMHg0MkI1LCAweDczRUYsIDB4NTFCNSwgMHgzNjQ5LCAweDAwMDAsIDB4MDAwMCwgMHg5MzQ0LAorICAgIDB4MDAwMCwgMHg4MkVFLCAweDAwMDAsIDB4NzgzQywgMHg2NzQ0LCAweDYyREYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NEZBQiwgMHgwMDAwLCAweDUwMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDVGQTQsIDB4MDAwMCwgMHgwMDAwLCAweDZFREIsIDB4MDAwMCwgMHg1MERFLAorICAgIDB4NTEwMSwgMHgzNDdBLCAweDUxMEUsIDB4OTg2QywgMHgzNzQzLCAweDg0MTYsIDB4MDAwMCwgMHgwMDAwLCAweDUxNjAsCisgICAgMHgwMDAwLCAweDUxNkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDVCODIsIDB4ODc3RCwgMHgwMDAwLCAweDAwMDAsIDB4NTFCMiwgMHg1MUI4LCAweDlEMzQsIDB4NTFDOSwgMHg1MUNGLAorICAgIDB4NTFEMSwgMHgzQ0RDLCAweDUxRDMsIDB4MDAwMCwgMHg1MUIzLCAweEZGRkQsIDB4RkZGRCwgMHg1MUVELCAweDgzQ0QsCisgICAgMHg2OTNFLCAweDAwMDAsIDB4NUY3QiwgMHg1MjBCLCAweDUyMjYsIDB4NTIzQywgMHg1MkI1LCAweDUyNTcsIDB4NTI5NCwKKyAgICAweDUyQjksIDB4NTJDNSwgMHg3QzE1LCAweDg1NDIsIDB4NTJFMCwgMHg4NjBELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NTU0OSwgMHg2RUQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDUzMzMsIDB4RkZGRCwgMHgwMDAwLCAweDZDQ0IsCisgICAgMHgwMDAwLCAweDY4MUIsIDB4NzNENSwgMHg2MDRBLCAweDNFQUEsIDB4MzhDQywgMHgwMDAwLCAweDcxREQsIDB4NDRBMiwKKyAgICAweDUzNkQsIDB4NTM3NCwgMHgwMDAwLCAweDUzN0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzdFNiwgMHg1MzkzLAorICAgIDB4MDAwMCwgMHg1M0EwLCAweDUzQUIsIDB4NTNBRSwgMHg3M0E3LCAweDAwMDAsIDB4M0Y1OSwgMHg3MzlDLCAweDUzQzEsCisgICAgMHg1M0M1LCAweDZDNDksIDB4NEU0OSwgMHg1N0ZFLCAweDUzRDksIDB4M0FBQiwgMHgwMDAwLCAweDUzRTAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NTNGNiwgMHgwMDAwLCAweDU0MTMsIDB4NzA3OSwgMHg1NTJCLCAweDY2NTcsIDB4NkQ1QiwgMHg1NDZELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDU1NUQsIDB4NTQ4RiwgMHg1NEE0LCAweDQ3QTYsIDB4MDAwMCwgMHgwMDAwLCAweDNEQjQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NTQ3LCAweDRDRUQsIDB4NTQyRiwgMHg3NDE3LCAweDU1ODYsIDB4NTVBOSwKKyAgICAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDQ1NTIsIDB4MDAwMCwgMHg2NkIzLCAweDAwMDAsIDB4NTYzNywgMHg2NkNELAorICAgIDB4MDAwMCwgMHg2NkE0LCAweEZGRkQsIDB4NTY0RCwgMHg1NjRGLCAweDc4RjEsIDB4NTZGMSwgMHg5Nzg3LCAweDUzRkUsCisgICAgMHg1NzAwLCAweDU2RUYsIDB4NTZFRCwgMHgwMDAwLCAweDM2MjMsIDB4MDAwMCwgMHg1NzQ2LCAweDAwMDAsIDB4NkM2RSwKKyAgICAweDcwOEIsIDB4NTc0MiwgMHgzNkIxLCAweDAwMDAsIDB4NTdFNiwgMHgwMDAwLCAweDU4MDMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NTgyNiwgMHgwMDAwLCAweDU4MUYsIDB4NThBQSwgMHgzNTYxLCAweDU4RTAsIDB4NThEQywgMHgwMDAwLCAweDU4RkIsCisgICAgMHg1QkZGLCAweDU3NDMsIDB4MDAwMCwgMHgwMDAwLCAweDkzRDMsIDB4MzVBMSwgMHg1OTFGLCAweDY4QTYsIDB4MzZDMywKKyAgICAweDZFNTksIDB4MDAwMCwgMHg1QTI0LCAweEZGRkQsIDB4MDAwMCwgMHg4NTA1LCAweDU5QzksIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDU5RDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NkQ3MSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg1OUY5LCAweDAwMDAsIDB4NUFBQiwgMHg1QTYzLCAweDM2RTYsIDB4MDAwMCwgMHhGRkZELCAweDM3MDgsIDB4NUE5NiwKKyAgICAweDc0NjUsIDB4NUFEMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNzMyLCAweDAwMDAsIDB4NUU4MywgMHg1MkQwLAorICAgIDB4NUI3NiwgMHg2NTg4LCAweDVCN0MsIDB4MDAwMCwgMHg0MDA0LCAweDQ4NUQsIDB4MDAwMCwgMHg1QkQ1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NUJGMywgMHg1QjlELCAweDREMTAsIDB4NUMwNSwgMHgwMDAwLCAweDVDMTMsIDB4NzNDRSwKKyAgICAweDVDMTQsIDB4MDAwMCwgMHgwMDAwLCAweDVDNDksIDB4NDhERCwgMHg1Qzg1LCAweDVDRTksIDB4NUNFRiwgMHg1RDhCLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDVEMTAsIDB4NUQxOCwgMHg1RDQ2LCAweDAwMDAsIDB4NUNCQSwgMHg1REQ3LCAweDgyRkMsCisgICAgMHgzODJELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgyODcsIDB4MzgzNiwgMHgzQkMyLCAweDVFMkUsIDB4NkE4QSwKKyAgICAweEZGRkQsIDB4RTEyRiwgMHgwMDAwLCAweDAwMDAsIDB4NTNBNiwgMHg0RUI3LCAweEZGRkQsIDB4NTNBOCwgMHgwMDAwLAorICAgIDB4NUUwOSwgMHhFMTM4LCAweDAwMDAsIDB4NUVGOSwgMHg1RUZCLCAweDM4QTAsIDB4NUVGQywgMHg2ODNFLCAweDk0MUIsCisgICAgMHg1RjBELCAweDAwMDAsIDB4MDAwMCwgMHgzQURFLCAweDAwMDAsIDB4NUYzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDVGNjMsIDB4MDAwMCwgMHg1RjcyLCAweDkzNDAsIDB4MDAwMCwgMHg1RkE3LCAweDVEQjYsIDB4M0Q1RiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTFENiwgMHgwMDAwLCAweDAwMDAsIDB4NjAzMSwgMHg2Njg1LCAweDM5NjMsCisgICAgMHgzREM3LCAweDM2MzksIDB4NTc5MCwgMHgwMDAwLCAweDc5NzEsIDB4M0U0MCwgMHg2MDlFLCAweEZGRkQsIDB4NjBFQSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDc0QTQsIDB4NTBFMSwgMHg1QUEwLCAweDYxNjQsIDB4NjE0MiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg2MTgxLCAweDUxRjQsIDB4MDAwMCwgMHg2MTg3LCAweDVCQUEsIDB4MDAwMCwgMHgwMDAwLCAweDYxRDMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NjFEMCwgMHgzOTMyLCAweDAwMDAsIDB4MDAwMCwgMHg2MDIzLCAweDYxNUMsIDB4NjUxRSwKKyAgICAweDYzOEIsIDB4MDAwMCwgMHg2MkM1LCAweDAwMDAsIDB4NjJENSwgMHgwMDAwLCAweDYzNkMsIDB4MDAwMCwgMHgzQTE3LAorICAgIDB4NjQzOCwgMHg2M0Y4LCAweDAwMDAsIDB4MDAwMCwgMHg2RjhBLCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDY0RTEsCisgICAgMHg2NEU1LCAweDk0N0IsIDB4M0E2NiwgMHg2NDNBLCAweDNBNTcsIDB4NjU0RCwgMHg2RjE2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDY1ODUsIDB4NjU2RCwgMHg2NTVGLCAweEZGRkQsIDB4NjVCNSwgMHgwMDAwLCAweDRCMzcsIDB4NjVEMSwgMHg0MEQ4LAorICAgIDB4MDAwMCwgMHhFMUFCLCAweDY1RTMsIDB4NUZERiwgMHgwMDAwLCAweDY2MTgsIDB4MDAwMCwgMHgwMDAwLCAweDY2NDQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NjY0QiwgMHgwMDAwLCAweDY2NjcsIDB4MDAwMCwgMHg2NjczLCAweEZBMTIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDc3QzUsIDB4MDAwMCwgMHg5OUE0LCAweDY3MDIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NjlGQSwgMHgwMDAwLCAweDAwMDAsIDB4Njc2NywgMHg2NzYyLCAweDAwMDAsIDB4MDAwMCwgMHg2N0Q3LCAweDQ0RTksCisgICAgMHg2ODIyLCAweDZFNTAsIDB4OTIzQywgMHg2ODAxLCAweDAwMDAsIDB4MDAwMCwgMHg2ODVELCAweDAwMDAsIDB4NjlFMSwKKyAgICAweDZBMEIsIDB4MDAwMCwgMHg2OTczLCAweDY4QzMsIDB4MDAwMCwgMHg2OTAxLCAweDY5MDAsIDB4M0EwMSwgMHgwMDAwLAorICAgIDB4M0I4MCwgMHg2N0FDLCAweDY5NjEsIDB4MDAwMCwgMHg0MkZDLCAweDY5MzYsIDB4Njk5OCwgMHgzQkExLCAweDAwMDAsCisgICAgMHg4MzYzLCAweDUwOTAsIDB4NjlGOSwgMHgwMDAwLCAweDAwMDAsIDB4NkE0NSwgMHgwMDAwLCAweDZBOUQsIDB4M0JGMywKKyAgICAweDY3QjEsIDB4NkFDOCwgMHgwMDAwLCAweDNDMEQsIDB4NkIxRCwgMHgwMDAwLCAweDYwREUsIDB4NkIzNSwgMHg2Qjc0LAorICAgIDB4MDAwMCwgMHg2RUI1LCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDM3NDAsIDB4NTQyMSwgMHgwMDAwLCAweDZCRTEsCisgICAgMHgwMDAwLCAweDZCREMsIDB4NkMzNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg2QzVBLCAweDgyMjYsIDB4NkM3OSwKKyAgICAweDAwMDAsIDB4NDRDNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzZFNSwgMHgzQ0VCLAorICAgIDB4MDAwMCwgMHg5QjgzLCAweDAwMDAsIDB4MDAwMCwgMHg3RjhGLCAweDY4MzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg2RDk2LCAweDZENUMsIDB4NkU3QywgMHg2RjA0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1MzMsIDB4MDAwMCwKKyAgICAweDUxQzcsIDB4RkZGRCwgMHhGRkZELCAweDg0MkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzQ1MywgMHgwMDAwLAorICAgIDB4NzlDQywgMHg2RTRGLCAweDVBOTEsIDB4MDAwMCwgMHg2RkY4LCAweDM3MEQsIDB4NkY5RCwgMHgwMDAwLCAweDZFRkEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NDU1NSwgMHg5M0YwLCAweDZGNDQsIDB4NkY1QywgMHgzRDRFLCAweDZGNzQsIDB4MDAwMCwKKyAgICAweDNEM0IsIDB4NkY5RiwgMHgwMDAwLCAweDZGRDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg1MURGLCAweEUyNTEsIDB4RTI1MiwgMHgwMDAwLCAweDAwMDAsIDB4NzA0QiwgMHg3MDdFLCAweDcwQTcsCisgICAgMHhGRkZELCAweDcwQ0MsIDB4NzBENSwgMHg3MEQ2LCAweDcwREYsIDB4NDEwNCwgMHgzREU4LCAweDcxQjQsIDB4NzE5NiwKKyAgICAweDAwMDAsIDB4NzEyQiwgMHg3MTQ1LCAweDVBODgsIDB4NzE0QSwgMHhGQTQ4LCAweDAwMDAsIDB4NzE0RiwgMHg5MzYyLAorICAgIDB4MDAwMCwgMHg3MTJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDcxQkEsIDB4MDAwMCwgMHg3MEJELCAweDcyMEUsCisgICAgMHg5NDQyLCAweDcyMTUsIDB4NTkxMSwgMHg5NDQzLCAweDcyMjQsIDB4OTM0MSwgMHgwMDAwLCAweDcyMkUsIDB4NzI0MCwKKyAgICAweDAwMDAsIDB4NjhCRCwgMHg3MjU1LCAweDcyNTcsIDB4M0U1NSwgMHgwMDAwLCAweDY4MEQsIDB4NkYzRCwgMHg3MjgyLAorICAgIDB4RkZGRCwgMHg3MzJCLCAweDAwMDAsIDB4MDAwMCwgMHg0OEVELCAweDAwMDAsIDB4NzMyOCwgMHg3MzJFLCAweDczQ0YsCisgICAgMHg3M0FBLCAweDAwMDAsIDB4MDAwMCwgMHg3M0M5LCAweDc0NDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjYyMywKKyAgICAweDM2QzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzNGNywgMHg3NDE1LCAweDY5MDMsIDB4MDAwMCwgMHg3NDM5LAorICAgIDB4M0VENywgMHgwMDAwLCAweDAwMDAsIDB4NzQ2MCwgMHgwMDAwLCAweDc0NDcsIDB4NzNFNCwgMHg3NDc2LCAweDgzQjksCisgICAgMHg3NDZDLCAweDc0NzQsIDB4OTNGMSwgMHg2QTJDLCAweDc0ODIsIDB4NDk1MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NUI0NiwgMHgwMDAwLCAweDAwMDAsIDB4NzRDOCwgMHgwMDAwLCAweDc1MEUsIDB4NzUxRSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg1QkQ3LCAweDAwMDAsIDB4OTM4NSwgMHg3NTRELCAweDc1NEEsIDB4NzU2NywgMHg3NTZFLCAweDAwMDAsCisgICAgMHgzRjA0LCAweDAwMDAsIDB4NzU4RSwgMHg3NDVELCAweDc1OUUsIDB4NzVCNCwgMHg3NjAyLCAweDc2MkMsIDB4NzY1MSwKKyAgICAweDc2NEYsIDB4NzY2RiwgMHhFMkQzLCAweDAwMDAsIDB4NzY5MCwgMHg4MUVGLCAweDM3RjgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NzZBMSwgMHg3NkE1LCAweDc2QjcsIDB4NzZDQywgMHgwMDAwLCAweDg0NjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg3NzFFLCAweDc3MjYsIDB4Nzc0MCwgMHg2NEFGLCAweDAwMDAsIDB4Nzc1OCwgMHgwMDAwLCAweDc3QUYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg3N0Y0LCAweEZGRkQsIDB4NjhDQSwgMHg3OEFGLCAweDc4QzcsIDB4NzhEMywgMHg5NkE1LAorICAgIDB4NzkyRSwgMHgwMDAwLCAweDc4RDcsIDB4NzkzNCwgMHg3OEIxLCAweDAwMDAsIDB4OEZCOCwgMHg4ODg0LCAweDAwMDAsCisgICAgMHg3OTg2LCAweDg5MDAsIDB4NjkwMiwgMHg3OTgwLCAweDAwMDAsIDB4Nzk5RCwgMHgwMDAwLCAweDc5M0MsIDB4NzlBOSwKKyAgICAweDZFMkEsIDB4MDAwMCwgMHgzRUE4LCAweDc5QzYsIDB4MDAwMCwgMHg3OUQ0LCAweEZGRkQsIDB4NTUyNSwgMHhGRkZELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTU5MCwgMHgwMDAwLCAweDM5RUMsIDB4MDAwMCwgMHg4RTQ2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHg3NzdBLCAweDAwMDAsIDB4M0EzNCwgMHg0N0Q1LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NjRERCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDY0OEQsIDB4OEU3RSwgMHgwMDAwLAorICAgIDB4RkZGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg0N0Y0LCAweDAwMDAsIDB4MDAwMCwgMHg5QUIyLCAweDNBNjcsIDB4MDAwMCwgMHgzRkVELCAweDM1MDYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDlENkUsIDB4OTgxNSwgMHhGRkZELCAweDQzRDksIDB4RkZGRCwgMHg2NEI0LAorICAgIDB4NTRFMywgMHhGRkZELCAweDAwMDAsIDB4RkZGRCwgMHgzOUZCLCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg2NEVBLCAweDAwMDAsIDB4MDAwMCwgMHg4RTY4LCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4NDgwQiwKKyAgICAweDAwMDAsIDB4M0ZGQSwgMHg1ODczLCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4RkZGRCwgMHg1NTc5LCAweEZGRkQsIDB4NDNCQSwgMHhGRkZELCAweDRBQjQsIDB4MDAwMCwgMHgwMDAwLCAweDgxQUEsCisgICAgMHg5OEY1LCAweDAwMDAsIDB4NjM3OSwgMHgzOUZFLCAweDAwMDAsIDB4OERDMCwgMHg1NkExLCAweDY0N0MsIDB4M0U0MywKKyAgICAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHgzOTkyLAorICAgIDB4M0EwNiwgMHgwMDAwLCAweDM1NzgsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgzNEJDLCAweDZDM0QsIDB4MDAwMCwgMHhGRkZELCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNBMTgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTVBQSwgMHhGRkZELCAweDAwMDAsIDB4NzE0MCwgMHhGRkZELCAweDUxNTYsCisgICAgMHg0RUZFLCAweDUwODgsIDB4RkZGRCwgMHgzNDkzLCAweDUxODYsIDB4NUU0MiwgMHg1MjA1LCAweDUyMjcsIDB4NTI3OSwKKyAgICAweDAwMDAsIDB4MzU1MywgMHg1M0MyLCAweDUzNUYsIDB4RkZGRCwgMHg1NTNGLCAweEZGRkQsIDB4NTVEOCwgMHgzNURELAorICAgIDB4NTYyMSwgMHhGRkZELCAweDU2NTQsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweEZGRkQsCisgICAgMHhGRkZELCAweDM3QjksIDB4NUNDMSwgMHg1RDE1LCAweDVENTYsIDB4MzgzOCwgMHg0RTgxLCAweDVFQkQsIDB4MzkxNCwKKyAgICAweDYxQjksIDB4NjI5MCwgMHg2MzE4LCAweDY0NUEsIDB4NjQ5MSwgMHg4MTZELCAweDgxODQsIDB4ODE5MywgMHg2ODAwLAorICAgIDB4M0JCQywgMHg3MjhGLCAweDcyQ0QsIDB4MDAwMCwgMHg3MzM5LCAweDc1NDIsIDB4NzVEQywgMHgzRkMwLCAweDAwMDAsCisgICAgMHgzRkQ3LCAweEZGRkQsIDB4NzY4MCwgMHg3NjhDLCAweDQwQTgsIDB4NzgzOSwgMHg0MTAzLCAweDdBOTEsIDB4N0MxQiwKKyAgICAweDdDRUQsIDB4N0Y5MywgMHg3RkFFLCAweEZGRkQsIDB4ODJGRiwgMHg1ODVGLCAweDg2QjIsIDB4NDVBQywgMHg4NzhCLAorICAgIDB4ODk0NywgMHhGRkZELCAweDhBMjksIDB4RkZGRCwgMHg4RTcxLCAweDAwMDAsIDB4OEVCMCwgMHhGRkZELCAweDkxNUUsCisgICAgMHg5MThDLCAweDk5MEUsIDB4OTkxQywgMHhGRkZELCAweEZGRkQsIDB4OUI4MSwgMHg5REMwLCAweDlEOTMsIDB4OUVBQywKKyAgICAweDREOTEsIDB4RkZGRCwgMHg5M0JBLCAweDlFN0IsIDB4NzA4OSwgMHg3MzQ4LCAweEZGRkQsIDB4Nzk5OSwgMHg4RkI3LAorICAgIDB4RkZGRCwgMHg5OTQyLCAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsCisgICAgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LAorICAgIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsCisgICAgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwKKyAgICAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorICAgIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsCisgICAgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwKKyAgICAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLAorICAgIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLCAweDAwQTksIDB4MjEyMiwKKyAgICAweDIwMjYsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLCAweDAwMzAsCisgICAgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwKKyAgICAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLCAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLAorICAgIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsCisgICAgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwKKyAgICAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywgMHgwMDVELAorICAgIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsCisgICAgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LAorICAgIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsIDB4MjBBQywgMHgyMEFDLCAweDIxMTAsCisgICAgMHgyMEFDLCAweDIwQUMsIDB4MzA5QiwgMHgzMDlDLCAweDJFODAsIDB4MzFDMCwgMHgzMUMxLCAweDMxQzIsIDB4MzFDMywKKyAgICAweDMxQzQsIDB4MDAwMCwgMHgzMUM1LCAweDAwMDAsIDB4MDAwMCwgMHgzMUM2LCAweDMxQzcsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MzFDOCwgMHgwMDAwLCAweDMxQzksIDB4MzFDQSwgMHgzMUNCLCAweDMxQ0MsIDB4MDAwMCwgMHgzMUNELCAweDMxQ0UsCisgICAgMHhGNTM4LCAweEY1MzksIDB4MDAwMCwgMHgwMDAwLCAweDk3NTEsIDB4MDAwMCwgMHg0RTVCLCAweDRFQkIsIDB4MzUzRSwKKyAgICAweDVDMjMsIDB4NUY1MSwgMHg1RkM0LCAweDM4RkEsIDB4NjI0QywgMHg2NTM1LCAweDZCN0EsIDB4NkMzNSwgMHg2QzNBLAorICAgIDB4NzA2QywgMHg3MjJCLCAweDRFMkMsIDB4NzJBRCwgMHgwMDAwLCAweDdGNTIsIDB4NzkzQiwgMHg3Q0Y5LCAweDdGNTMsCisgICAgMHgwMDAwLCAweDM0QzEsIDB4MDAwMCwgMHg4MDAyLCAweDgwODAsIDB4MDAwMCwgMHgwMDAwLCAweDUzNUQsIDB4ODg2NCwKKyAgICAweDg5QzEsIDB4MDAwMCwgMHg4QkEwLCAweDhEMUQsIDB4OTQ4NSwgMHg5NTc4LCAweDk1N0YsIDB4OTVFOCwgMHgwMDAwLAorICAgIDB4OTdFNiwgMHg5ODc1LCAweDk4Q0UsIDB4OThERSwgMHg5OTYzLCAweDAwMDAsIDB4OUM3QywgMHg5RTFGLCAweDlFQzQsCisgICAgMHg2QjZGLCAweEY5MDcsIDB4NEUzNywgMHgwMDAwLCAweDk2MUQsIDB4NjIzNywgMHg5NEEyLCAweDJFODQsIDB4MkU4NiwKKyAgICAweDJFODcsIDB4MkU4OCwgMHgyRThBLCAweDJFOEMsIDB4MkU4RCwgMHgyRTk1LCAweDJFOUMsIDB4MkVBNSwgMHgyRUE3LAorICAgIDB4MkVBQSwgMHgyRUFDLCAweDJFQUUsIDB4MkVCNiwgMHgyRUJDLCAweDJFQkUsIDB4MkVDQSwgMHgyRUNDLCAweDJFQ0QsCisgICAgMHgyRUNGLCAweDJFRDYsIDB4MkVENywgMHgyRURFLCAweDAwMDAsIDB4MDAwMCwgMHg2NTBBLCAweDRFM0QsIDB4NkVERCwKKyAgICAweDlENEUsIDB4OTFERiwgMHgwMDAwLCAweDRGMUEsIDB4NEYyOCwgMHg0RkE4LCAweDUxNzQsIDB4NTE5QywgMHg1MUU0LAorICAgIDB4NTJBMSwgMHg1MkE4LCAweDUzM0IsIDB4NTM0RSwgMHg1M0QxLCAweDUzRDgsIDB4NTZFMiwgMHg1OEYwLCAweDU5MDQsCisgICAgMHg1OTA3LCAweDU5MzIsIDB4NTkzNCwgMHg1QjY2LCAweDVCOUUsIDB4NUI5RiwgMHg1QzlBLCAweDVFODYsIDB4NjAzQiwKKyAgICAweDY1ODksIDB4NjdGRSwgMHg2ODA0LCAweDY4NjUsIDB4NkQ0RSwgMHg3MEJDLCAweDc1MzUsIDB4N0VBNCwgMHg3RUFDLAorICAgIDB4N0VCQSwgMHg3RUM3LCAweDdFQ0YsIDB4N0VERiwgMHg3RjA2LCAweDdGMzcsIDB4ODI3QSwgMHg4MkNGLCAweDgzNkYsCisgICAgMHg4OUM2LCAweDhCQkUsIDB4OEJFMiwgMHg4RjY2LCAweDhGNjcsIDB4OEY2RSwgMHg3NDExLCAweDdDRkMsIDB4N0RDRCwKKyAgICAweDY5NDYsIDB4N0FDOSwgMHg3OEI4LCAweDgwQkMsIDB4OEQwQiwgMHg4MEY2LCAweDAwMDAsIDB4ODA5RiwgMHg5RUM3LAorICAgIDB4NENDRCwgMHg5REM5LCAweDlFMEMsIDB4NEMzRSwgMHgwMDAwLCAweDAwMDAsIDB4OUUwQSwgMHgwMDAwLCAweDM1QzEsCisgICAgMHg2RTlBLCAweDgyM0UsIDB4NzUxOSwgMHg0OTExLCAweDlBNkMsIDB4OUE4RiwgMHg5Rjk5LCAweDc5ODcsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDRFMjQsIDB4NEU4MCwgMHg0RTg3LCAweDRFQkYsIDB4NEVFQiwgMHg0RjM3LAorICAgIDB4MzQ0QywgMHg0RkJELCAweDNFNDgsIDB4NTAwMywgMHgzNDdELCAweDM0QTUsIDB4NTkwNSwgMHg1MURCLCAweDUxRkMsCisgICAgMHg0RTg5LCAweDUyOTAsIDB4NTMyNywgMHgzNUM3LCAweDUzQTksIDB4MzU1MSwgMHg1M0IwLCAweDU0MjMsIDB4MzU2RCwKKyAgICAweDM1NzIsIDB4MzY4MSwgMHg1NDkzLCAweDU0QTMsIDB4NTRCNCwgMHg1NEI5LCAweDU0RDAsIDB4NTRFRiwgMHg1NTE4LAorICAgIDB4NTUyMywgMHg1NTI4LCAweDM1OTgsIDB4MzVBNSwgMHgzNUJGLCAweDU1RDcsIDB4MzVDNSwgMHgwMDAwLCAweDQwNTMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDQwQkIsIDB4MDAwMCwgMHg1NjUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNUZCLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzRjkzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0ZGOSwgMHgwMDAwLCAweDY0MzIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTRDQywgMHg4MkM0LAorICAgIDB4NTVCOSwgMHgwMDAwLCAweDlDMjYsIDB4OUFCNiwgMHgwMDAwLCAweDgwRUMsIDB4NUMxQywgMHgwMDAwLCAweDgxMzQsCisgICAgMHgzNzk3LCAweDAwMDAsIDB4OTFCNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzYwOSwKKyAgICAweDAwMDAsIDB4NTZBRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1QTU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg1NzlDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM3MDMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTg5OSwgMHg1MjY4LAorICAgIDB4MzYxQSwgMHgwMDAwLCAweDdCQjIsIDB4NUI2OCwgMHg0ODAwLCAweDRCMkMsIDB4OUYyNywgMHg0OUU3LCAweDlDMUYsCisgICAgMHg5QjhELCAweDAwMDAsIDB4MDAwMCwgMHg1NUZCLCAweDM1RjIsIDB4NTY4OSwgMHg1RDNFLCAweDVENDgsIDB4M0RGQywKKyAgICAweDM4MEYsIDB4NURBNCwgMHg1REI5LCAweDM4MjAsIDB4NUYyNSwgMHg1RjgzLCAweDM5MDgsIDB4MzkzRiwgMHgzOTRELAorICAgIDB4NjBENywgMHg2MTNELCAweDVDRTUsIDB4Mzk4OSwgMHg2MUI3LCAweDYxQ0YsIDB4MzlCOCwgMHg2MjJDLCAweDYyRTUsCisgICAgMHgzOUY4LCAweDU2QjEsIDB4M0EwMywgMHg2M0UyLCAweDYzRkIsIDB4NjQwNywgMHgzQTRCLCAweDY0QzAsIDB4OUY5RiwKKyAgICAweDNBOTcsIDB4NjU4NiwgMHgzQUJELCAweDY1RkYsIDB4NjY1MywgMHgzQUYyLCAweDY2OTIsIDB4M0IyMiwgMHg2NzE2LAorICAgIDB4M0I0MiwgMHg2N0E0LCAweDNCNTgsIDB4Njg0QSwgMHg2ODg0LCAweDNCNzIsIDB4M0I3MSwgMHgzQjdCLCAweDY5MDksCisgICAgMHg2OTQzLCAweDcyNUMsIDB4Njk2NCwgMHg2OTlGLCAweDY5ODUsIDB4NjlENiwgMHgzQkRELCAweDZBNjUsIDB4NkE3NCwKKyAgICAweDZBNzEsIDB4NkE4MiwgMHgzQkVDLCAweDZBOTksIDB4M0JGMiwgMHg2QUFCLCAweDZBQjUsIDB4NkFENCwgMHg2QUY2LAorICAgIDB4NkI4MSwgMHg2QkMxLCAweDZCRUEsIDB4NkM3NSwgMHg2Q0FBLCAweDNDQ0IsIDB4NkQwMiwgMHg2RDA2LCAweDZEMjYsCisgICAgMHg2RDgxLCAweDNDRUYsIDB4NkRBNCwgMHg2REIxLCAweDZFMTUsIDB4NkUxOCwgMHg2RTI5LCAweDZFODYsIDB4MDAwMCwKKyAgICAweDZFQkIsIDB4NkVFMiwgMHg2RURBLCAweDlGN0YsIDB4NkVFOCwgMHg2RUU5LCAweDZGMjQsIDB4NkYzNCwgMHgzRDQ2LAorICAgIDB4MDAwMCwgMHg2RjgxLCAweDZGQkUsIDB4M0Q2QSwgMHgzRDc1LCAweDcxQjcsIDB4NUM5OSwgMHgzRDhBLCAweDcwMkMsCisgICAgMHgzRDkxLCAweDcwNTAsIDB4NzA1NCwgMHg3MDZGLCAweDcwN0YsIDB4MDAwMCwgMHg0M0MxLCAweDM1RjEsIDB4MDAwMCwKKyAgICAweDM2NEUsIDB4M0RBRCwgMHgwMDAwLCAweDY2N0QsIDB4N0M3NCwgMHg3NDhELCAweDdFOTIsIDB4NDUwMywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDM0N0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3MSwgMHg2M0MxLCAweDc3NzcsCisgICAgMHg4OThBLCAweDAwMDAsIDB4OEI0QywgMHgwMDAwLCAweDQ5MkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0FGMCwKKyAgICAweDcwOEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4Njg4OCwgMHgwMDAwLCAweDlGNjIsIDB4OTNDNiwgMHgwMDAwLAorICAgIDB4OTM2NiwgMHg5MjhGLCAweDg2MTQsIDB4MDAwMCwgMHg0MTkwLCAweDY3OEYsIDB4NjgxRSwgMHgzODYzLCAweDAwMDAsCisgICAgMHgzQjE5LCAweDg0OTYsIDB4MDAwMCwgMHgzOUUyLCAweDg0ODAsIDB4NDM2RSwgMHg5NzcxLCAweDk5OUIsIDB4NDkyRCwKKyAgICAweDZGMTcsIDB4MDAwMCwgMHg3MEE2LCAweDAwMDAsIDB4N0U2NSwgMHg1RDJGLCAweDNERjMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4N0RBNCwgMHg4NDI2LCAweDU0ODUsIDB4MDAwMCwgMHgwMDAwLCAweDU3N0UsIDB4MDAwMCwgMHgwMDAwLCAweDNGRTUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NzAwMywgMHgwMDAwLCAweDVENzAsIDB4NzM4RiwgMHgwMDAwLCAweDAwMDAsIDB4NEZDOCwKKyAgICAweDdGRTcsIDB4NzMxMCwgMHg3MzM4LCAweDczNDEsIDB4M0VBOSwgMHg3MUY1LCAweDAwMDAsIDB4NzNFMSwgMHgzRUNBLAorICAgIDB4M0VEMSwgMHg3NDE5LCAweDc0MUUsIDB4NzQxRiwgMHgzRUUyLCAweDNFRjAsIDB4M0VGNCwgMHgzRUZBLCAweDc0RDMsCisgICAgMHgzRjBFLCAweDNGNTMsIDB4NzU2RCwgMHg3NTcyLCAweDc1OEQsIDB4M0Y3QywgMHg3NUM4LCAweDc2NEQsIDB4NzY3NCwKKyAgICAweDNGREMsIDB4NzY3QSwgMHg3MTg4LCAweDU2MjMsIDB4ODk4MCwgMHg0MDFELCAweDc3NDMsIDB4NDAzOSwgMHg0MDQ1LAorICAgIDB4MzVEQiwgMHg3Nzk4LCAweDQwNkEsIDB4NDA2RiwgMHg3N0JFLCAweDc3Q0IsIDB4NzgxOCwgMHg3ODFDLCAweDc4NDcsCisgICAgMHg3ODUxLCAweDc4NjYsIDB4ODQ0OCwgMHgwMDAwLCAweDc5MzMsIDB4NzkzMiwgMHg0MTA5LCAweDc5OTEsIDB4N0EwNiwKKyAgICAweDQxNjcsIDB4NDFCMiwgMHg3QUJDLCAweDgyNzksIDB4NDFDNCwgMHg3QUNGLCAweDdBREIsIDB4NDFDRiwgMHg3QjYyLAorICAgIDB4N0I2QywgMHg3QjdCLCAweDdDMTIsIDB4NDI2MCwgMHg0MjdBLCAweDdDN0IsIDB4N0M5QywgMHg0MjhDLCAweDdDQjgsCisgICAgMHg0Mjk0LCAweDhGOTMsIDB4NzBDMCwgMHgwMDAwLCAweDdEQ0YsIDB4N0RENCwgMHg3REQwLCAweDdERkQsIDB4N0ZCNCwKKyAgICAweDcyOUYsIDB4NDM5NywgMHg4MDIwLCAweDgwMjUsIDB4ODAyRSwgMHg4MDMxLCAweDgwNTQsIDB4NTdCNCwgMHg3MEEwLAorICAgIDB4ODBCNywgMHg4MEU5LCAweDQzRUQsIDB4ODEwQywgMHg4MTBFLCAweDgxMTIsIDB4ODExNCwgMHg0NDAxLCAweDNCMzksCisgICAgMHg4MTU2LCAweDgxNTksIDB4ODE1QSwgMHg0NDEzLCAweDgxN0MsIDB4NDQyNSwgMHg0NDJELCAweDgxQTUsIDB4NTdFRiwKKyAgICAweDgxQzEsIDB4ODFFNCwgMHg4MjU0LCAweDQ0OEYsIDB4ODI3NiwgMHg4MkNBLCAweDgyRDgsIDB4NDRCMCwgMHg4MzU3LAorICAgIDB4OTY2OSwgMHg4NDA1LCAweDcwRjUsIDB4ODQ2NCwgMHg4NDg4LCAweDQ1MDQsIDB4ODRCRSwgMHg4NEUxLCAweDg0RjgsCisgICAgMHg4NTEwLCAweDg1MzgsIDB4ODU1MiwgMHg0NTNCLCAweDg1NkYsIDB4ODU3MCwgMHg4NUUwLCAweDQ1NzcsIDB4ODY3MiwKKyAgICAweDg2OTIsIDB4ODZFRiwgMHg5NjQ1LCAweDQ2MDYsIDB4NDYxNywgMHg4OEFFLCAweDg4RkYsIDB4ODkyNCwgMHg4OTkxLAorICAgIDB4MDAwMCwgMHg4QTM4LCAweDhBOTQsIDB4OEFCNCwgMHg4QzUxLCAweDhDRDQsIDB4OENGMiwgMHg4RDFDLCAweDQ3OTgsCisgICAgMHg4REMzLCAweDQ3RUQsIDB4OEUzQSwgMHg1NzU0LCAweDU1RjUsIDB4NDgzNywgMHg4RUNFLCAweDhFRTIsIDB4OEVFNCwKKyAgICAweDhFRUQsIDB4OEVGMiwgMHg4RkMxLCAweDhGQ0EsIDB4OEZDQywgMHg5MDMzLCAweDQ4QUQsIDB4OThFMCwgMHg5MjEzLAorICAgIDB4NDkxRSwgMHg5MjI4LCAweDkyNTgsIDB4OTI2QiwgMHg5MkIxLCAweDkyQUUsIDB4OTJCRiwgMHg5MkUzLCAweDkyRUIsCisgICAgMHg5MkYzLCAweDkyRjQsIDB4OTJGRCwgMHg5MzQzLCAweDkzODQsIDB4OTNBRCwgMHg0OTQ1LCAweDQ5NTEsIDB4OTQxNywKKyAgICAweDk0MUQsIDB4OTQyRCwgMHg5NDNFLCAweDQ5NkEsIDB4OTQ1NCwgMHg5NDc5LCAweDk1MkQsIDB4OTVBMiwgMHg0OUE3LAorICAgIDB4OTVGNCwgMHg5NjMzLCAweDQ5RTUsIDB4NEEyNCwgMHg5NzQwLCAweDRBMzUsIDB4OTdCMiwgMHg5N0MyLCAweDRBRTQsCisgICAgMHg5OEI5LCAweDRCMTksIDB4OThGMSwgMHg1ODQ0LCAweDk5MTksIDB4OTkzNywgMHg5OTVELCAweDk5NjIsIDB4NEI3MCwKKyAgICAweDk5QzUsIDB4NEI5RCwgMHg5QTNDLCAweDlCMEYsIDB4OUI2OSwgMHg5QkRELCAweDlCRjEsIDB4OUJGNCwgMHg0QzZELAorICAgIDB4OUMyMCwgMHgzNzZGLCAweDAwMDAsIDB4OUQ0OSwgMHg5RUZFLCAweDU2NTAsIDB4OURCRCwgMHg5REZDLCAweDk0RjYsCisgICAgMHg4RkI2LCAweDlFQjEsIDB4OUVCRCwgMHg5RUM2LCAweDk0REMsIDB4OUVFMiwgMHg5RUYxLCAweDlFRjgsIDB4OUY0NCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDk0QzMsIDB4MDAwMCwgMHg5NEMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg1NzU3LCAweDcxNzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU0OUUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzY0NywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDUzNjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDcwQkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDcxOTgsIDB4MDAwMCwgMHg2OUU5LCAweDM2QzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDU4QjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU3ODgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg1OTY1LCAweDAwMDAsIDB4MDAwMCwgMHg1NzNGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NTdBMSwgMHg3MTUxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTZCOSwgMHgwMDAwLCAweDM2MTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTQ5RiwgMHgwMDAwLAorICAgIDB4MzZCOSwgMHgwMDAwLCAweDAwMDAsIDB4NTZENiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDYzRTYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgzREY3LCAweDAwMDAsIDB4MDAwMCwgMHg4RkQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4N0U5RiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg0Q0E0LCAweDk1NDcsIDB4MDAwMCwgMHg3MUEyLCAweDAwMDAsIDB4MDAwMCwgMHg0RDlDLCAweDAwMDAsCisgICAgMHg4RkJFLCAweDhGQkEsIDB4MDAwMCwgMHg4RkI5LCAweDAwMDAsIDB4NEVFQSwgMHgwMDAwLCAweDhFODAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDRFOUEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0RDNiwgMHgwMDAwLCAweDRFMUMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU1REUsIDB4ODc4NiwgMHgwMDAwLCAweDAwMDAsIDB4NUI5MCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDRFMUEsIDB4NEUwNCwgMHg1QjBELCAweDM2QUMsIDB4NTM3RCwgMHgzNkE1LCAweDU4OUEsIDB4MDAwMCwKKyAgICAweDU3QUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTdBNywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDlDMUIsIDB4MDAwMCwgMHgzRTA2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg1NzdBLCAweDU0REEsIDB4NzE3QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM2MzUsIDB4MDAwMCwgMHg1MjIwLCAweDNDMTgsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0NTYyLCAweDVCMUYsIDB4MDAwMCwgMHg5RjUwLAorICAgIDB4OUVBNiwgMHgwMDAwLCAweDUxRTIsIDB4NTM0MiwgMHg2NkFELCAweDU4NUMsIDB4NTU1MywgMHgzRDg1LCAweDYxNjAsCisgICAgMHg0OEFFLCAweDk3QkQsIDB4MDAwMCwgMHg2MEIzLCAweDg0MjQsIDB4OTgxNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDNCMkIsIDB4M0QzMiwgMHgwMDAwLCAweDcwODEsIDB4NUM5QywgMHgwMDAwLCAweDM3MzAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAxMDAsIDB4MDBDMSwgMHgwMUNELCAweDAwQzAsIDB4MDExMiwgMHgwMEM5LCAweDAxMUEsCisgICAgMHgwMEM4LCAweDAxNEMsIDB4MDBEMywgMHgwMUQxLCAweDAwRDIsIDB4RjMyNSwgMHgxRUJFLCAweEYzMjcsIDB4MUVDMCwKKyAgICAweDAwQ0EsIDB4MDEwMSwgMHgwMEUxLCAweDAxQ0UsIDB4MDBFMCwgMHgwMjUxLCAweDAxMTMsIDB4MDBFOSwgMHgwMTFCLAorICAgIDB4MDBFOCwgMHgwMTJCLCAweDAwRUQsIDB4MDFEMCwgMHgwMEVDLCAweDAxNEQsIDB4MDBGMywgMHgwMUQyLCAweDAwRjIsCisgICAgMHgwMTZCLCAweDAwRkEsIDB4MDFENCwgMHgwMEY5LCAweDAxRDYsIDB4MDFEOCwgMHgwMURBLCAweDAxREMsIDB4MDBGQywKKyAgICAweEYzNDQsIDB4MUVCRiwgMHhGMzQ2LCAweDFFQzEsIDB4MDBFQSwgMHgwMjYxLCAweDAyODMsIDB4MDI1MCwgMHgwMjVCLAorICAgIDB4MDI1NCwgMHgwMjc1LCAweDAxNTMsIDB4MDBGOCwgMHgwMTRCLCAweDAyOEEsIDB4MDI2QSwgMHgyM0RBLCAweDIzREIsCisgICAgMHgyRTlELCAweDJFQzYsIDB4MkVFMywgMHg1MDNCLCAweDZERkUsIDB4MDAwMCwgMHg5RkE2LCAweDNEQzksIDB4ODg4RiwKKyAgICAweDAwMDAsIDB4NzA3NywgMHg1Q0Y1LCAweDRCMjAsIDB4MDAwMCwgMHgzNTU5LCAweDAwMDAsIDB4NjEyMiwgMHgwMDAwLAorICAgIDB4OEZBNywgMHg5MUY2LCAweDcxOTEsIDB4NjcxOSwgMHg3M0JBLCAweDAwMDAsIDB4MDAwMCwgMHgzQzhCLCAweDAwMDAsCisgICAgMHg0QjEwLCAweDc4RTQsIDB4NzQwMiwgMHg1MUFFLCAweDAwMDAsIDB4NDAwOSwgMHg2QTYzLCAweDAwMDAsIDB4NDIyMywKKyAgICAweDg2MEYsIDB4N0EyQSwgMHgwMDAwLCAweDAwMDAsIDB4OTc1NSwgMHg3MDRELCAweDUzMjQsIDB4MDAwMCwgMHg5M0Y0LAorICAgIDB4NzZEOSwgMHgwMDAwLCAweDlGQTcsIDB4NzdERCwgMHg0RUEzLCAweDRGRjAsIDB4NTBCQywgMHg0RTJGLCAweDRGMTcsCisgICAgMHg5RkE4LCAweDU0MzQsIDB4N0Q4QiwgMHg1ODkyLCAweDU4RDAsIDB4MDAwMCwgMHg1RTkyLCAweDVFOTksIDB4NUZDMiwKKyAgICAweDAwMDAsIDB4NjU4QiwgMHgwMDAwLCAweDY5MTksIDB4NkE0MywgMHgwMDAwLCAweDZDRkYsIDB4NzIwMCwgMHgwMDAwLAorICAgIDB4NzM4QywgMHgzRURCLCAweDAwMDAsIDB4NUIxNSwgMHg3NEI5LCAweDhCODMsIDB4MDAwMCwgMHgwMDAwLCAweDdBOTMsCisgICAgMHg3QkVDLCAweDdDQzMsIDB4N0U2QywgMHg4MkY4LCAweDg1OTcsIDB4OUZBOSwgMHg4ODkwLCAweDlGQUEsIDB4OEVCOSwKKyAgICAweDlGQUIsIDB4OEZDRiwgMHg4NTVGLCAweDk5RTAsIDB4OTIyMSwgMHg5RkFDLCAweDAwMDAsIDB4MDAwMCwgMHg0MDcxLAorICAgIDB4NDJBMiwgMHg1QTFBLCAweDk4NjgsIDB4Njc2QiwgMHg0Mjc2LCAweDU3M0QsIDB4ODVENiwgMHgwMDAwLCAweDgyQkYsCisgICAgMHgwMDAwLCAweDRDODEsIDB4MDAwMCwgMHg1RDdCLCAweDAwMDAsIDB4MDAwMCwgMHg5RkFELCAweDlGQUUsIDB4NUI5NiwKKyAgICAweDlGQUYsIDB4N0U1QiwgMHg0M0YwLCAweDRDMzIsIDB4NDYwMywgMHg0NUE2LCAweDQ1NzgsIDB4MDAwMCwgMHg0RDc3LAorICAgIDB4NDVCMywgMHgwMDAwLCAweDRDRTIsIDB4MDAwMCwgMHgzQjk1LCAweDQ3MzYsIDB4NDc0NCwgMHg0QzQ3LCAweDRDNDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NEM1NywgMHgwMDAwLCAweDQ3NEYsIDB4NDVEQSwKKyAgICAweDRDODUsIDB4MDAwMCwgMHg0RDA3LCAweDRBQTQsIDB4NDZBMSwgMHgwMDAwLCAweDcyMjUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDY2NEQsIDB4NTZGQiwgMHg3RDk1LCAweDU5MUQsIDB4MDAwMCwgMHgzREY0LCAweDk3MzQsCisgICAgMHgwMDAwLCAweDVCREIsIDB4MDAwMCwgMHg1QUE0LCAweDM2MjUsIDB4MDAwMCwgMHg1QUQxLCAweDVCQjcsIDB4NUNGQywKKyAgICAweDY3NkUsIDB4ODU5MywgMHgwMDAwLCAweDc0NjEsIDB4NzQ5RCwgMHgwMDAwLCAweDY2RTcsIDB4NkU1NywgMHg3OUNBLAorICAgIDB4M0Q4OCwgMHg0NEMzLCAweDAwMDAsIDB4MDAwMCwgMHg0MzlBLCAweDQ1MzYsIDB4NUNENSwgMHgwMDAwLCAweDhBRjksCisgICAgMHg1Qzc4LCAweDNEMTIsIDB4MDAwMCwgMHg1RDc4LCAweDlGQjIsIDB4NzE1NywgMHg0NTU4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDRDNzcsIDB4Mzk3OCwgMHgzNDRBLCAweDAwMDAsIDB4MDAwMCwgMHg4QUNDLCAweDRGQjQsIDB4MDAwMCwgMHg1OUJGLAorICAgIDB4ODE2QywgMHg5ODU2LCAweDAwMDAsIDB4NUYzQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0MTAyLCAweDQ2QkIsCisgICAgMHgwMDAwLCAweDNGMDcsIDB4OUZCMywgMHgwMDAwLCAweDQwRjgsIDB4MzdENiwgMHg0NkY3LCAweDAwMDAsIDB4NDE3QywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg0NTZELCAweDM4RDQsIDB4MDAwMCwgMHg0NTYxLCAweDQ1MUIsIDB4NEQ4OSwgMHg0QzdCLAogICAgIDB4NEQ3NiwgMHg0NUVBLCAweDNGQzgsIDB4MDAwMCwgMHgzNjYxLCAweDQ0REUsIDB4NDRCRCwgMHg0MUVELAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0NOUy1FVUMtSF8wLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0NOUy1FVUMtSF8wLmNwcAppbmRleCA3MjMwOTViLi44ODgxYzkxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9DTlMtRVVDLUhfMC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQ05TLUVVQy1IXzAuY3BwCkBAIC02MywxMjMgKzYzLDExMCBAQAogfTsKIAogY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9DTlNfRVVDX0hfMF9EV29yZFsyMzggKiA0XSA9IHsKLSAgICAweDhFQTEsIDB4QTFBMSwgMHhBMUZFLCAweDAwNjMsIDB4OEVBMSwgMHhBMkExLCAweEEyRkUsIDB4MDBDMSwKLSAgICAweDhFQTEsIDB4QTNBMSwgMHhBM0NFLCAweDAxMUYsIDB4OEVBMSwgMHhBNEExLCAweEE0RkUsIDB4MDE0RCwKLSAgICAweDhFQTEsIDB4QTVBMSwgMHhBNUVDLCAweDAxQUIsIDB4OEVBMSwgMHhBNUVFLCAweEE1RjAsIDB4MDFGNywKLSAgICAweDhFQTEsIDB4QTZBMSwgMHhBNkJFLCAweDAxRkEsIDB4OEVBMSwgMHhBN0ExLCAweEE3QTEsIDB4MDI1MywKLSAgICAweDhFQTEsIDB4QTdBMiwgMHhBN0E0LCAweDAyMTgsIDB4OEVBMSwgMHhBN0E1LCAweEE3QTUsIDB4MDI1NCwKLSAgICAweDhFQTEsIDB4QTdBNiwgMHhBN0E2LCAweDAyMUIsIDB4OEVBMSwgMHhBN0E3LCAweEE3QTcsIDB4MDI1QSwKLSAgICAweDhFQTEsIDB4QTdBOCwgMHhBN0E4LCAweDAyMUMsIDB4OEVBMSwgMHhBN0E5LCAweEE3QUMsIDB4MDI1QiwKLSAgICAweDhFQTEsIDB4QTdBRCwgMHhBN0FGLCAweDAyMUQsIDB4OEVBMSwgMHhBN0IwLCAweEE3QjAsIDB4MDI1RiwKLSAgICAweDhFQTEsIDB4QTdCMSwgMHhBN0IxLCAweDE3NkUsIDB4OEVBMSwgMHhBN0IyLCAweEE3QjIsIDB4MDI2MCwKLSAgICAweDhFQTEsIDB4QTdCMywgMHhBN0IzLCAweDAyNjIsIDB4OEVBMSwgMHhBN0I0LCAweEE3QjQsIDB4MDIyMCwKLSAgICAweDhFQTEsIDB4QTdCNSwgMHhBN0I1LCAweDAyNjMsIDB4OEVBMSwgMHhBN0I2LCAweEE3QjYsIDB4MTc2RiwKLSAgICAweDhFQTEsIDB4QTdCNywgMHhBN0I3LCAweDAyMjEsIDB4OEVBMSwgMHhBN0I4LCAweEE3QjksIDB4MDI2NCwKLSAgICAweDhFQTEsIDB4QTdCQSwgMHhBN0JBLCAweDAyMjIsIDB4OEVBMSwgMHhBN0JCLCAweEE3QkIsIDB4MTc3MCwKLSAgICAweDhFQTEsIDB4QTdCQywgMHhBN0JDLCAweDAyMjMsIDB4OEVBMSwgMHhBN0JELCAweEE3QkQsIDB4MDI2NiwKLSAgICAweDhFQTEsIDB4QTdCRSwgMHhBN0JFLCAweDAyNzksIDB4OEVBMSwgMHhBN0JGLCAweEE3QkYsIDB4MTc3NSwKLSAgICAweDhFQTEsIDB4QTdDMCwgMHhBN0MxLCAweDAyN0EsIDB4OEVBMSwgMHhBN0MyLCAweEE3QzIsIDB4MDIyNCwKLSAgICAweDhFQTEsIDB4QTdDMywgMHhBN0M2LCAweDAyN0MsIDB4OEVBMSwgMHhBN0M3LCAweEE3QzcsIDB4MDIyNSwKLSAgICAweDhFQTEsIDB4QTdDOCwgMHhBN0NCLCAweDAyODIsIDB4OEVBMSwgMHhBN0NDLCAweEE3Q0MsIDB4MTc3NiwKLSAgICAweDhFQTEsIDB4QTdDRCwgMHhBN0NELCAweDAyODYsIDB4OEVBMSwgMHhBN0NFLCAweEE3Q0UsIDB4MDIyNiwKLSAgICAweDhFQTEsIDB4QTdDRiwgMHhBN0QwLCAweDAyODgsIDB4OEVBMSwgMHhBN0QxLCAweEE3RDIsIDB4MDI4QywKLSAgICAweDhFQTEsIDB4QTdEMywgMHhBN0Q1LCAweDAyMjcsIDB4OEVBMSwgMHhBN0Q2LCAweEE3RDgsIDB4MDI4RSwKLSAgICAweDhFQTEsIDB4QTdEOSwgMHhBN0RBLCAweDAyMkEsIDB4OEVBMSwgMHhBN0RCLCAweEE3REIsIDB4MTc3NywKLSAgICAweDhFQTEsIDB4QTdEQywgMHhBN0RGLCAweDAyRDAsIDB4OEVBMSwgMHhBN0UwLCAweEE3RTAsIDB4MDJENSwKLSAgICAweDhFQTEsIDB4QTdFMSwgMHhBN0UxLCAweDAyMkMsIDB4OEVBMSwgMHhBN0UyLCAweEE3RTUsIDB4MDJENiwKLSAgICAweDhFQTEsIDB4QTdFNiwgMHhBN0U2LCAweDAyMkQsIDB4OEVBMSwgMHhBN0U3LCAweEE3RUQsIDB4MDJEQSwKLSAgICAweDhFQTEsIDB4QTdFRSwgMHhBN0VFLCAweDE3OEEsIDB4OEVBMSwgMHhBN0VGLCAweEE3RjIsIDB4MDJFMSwKLSAgICAweDhFQTEsIDB4QTdGMywgMHhBN0YzLCAweDE3OEMsIDB4OEVBMSwgMHhBN0Y0LCAweEE3RjgsIDB4MDJFNSwKLSAgICAweDhFQTEsIDB4QTdGOSwgMHhBN0Y5LCAweDE3OEQsIDB4OEVBMSwgMHhBN0ZBLCAweEE3RkQsIDB4MDJFQSwKLSAgICAweDhFQTEsIDB4QTdGRSwgMHhBN0ZFLCAweDAzNTYsIDB4OEVBMSwgMHhBOEExLCAweEE4QTYsIDB4MDM1NywKLSAgICAweDhFQTEsIDB4QThBNywgMHhBOEE3LCAweDAzNUUsIDB4OEVBMSwgMHhBOEE4LCAweEE4QTgsIDB4MDM2MiwKLSAgICAweDhFQTEsIDB4QThBOSwgMHhBOEFBLCAweDAyMkUsIDB4OEVBMSwgMHhBOEFCLCAweEE4QjIsIDB4MDM2MywKLSAgICAweDhFQTEsIDB4QThCMywgMHhBOEIzLCAweDE3QjIsIDB4OEVBMSwgMHhBOEI0LCAweEE4QjYsIDB4MDM2QiwKLSAgICAweDhFQTEsIDB4QThCNywgMHhBOEJBLCAweDAzRjYsIDB4OEVBMSwgMHhBOEJCLCAweEE4QkIsIDB4MTgxMiwKLSAgICAweDhFQTEsIDB4QThCQywgMHhBOEJFLCAweDAzRkEsIDB4OEVBMSwgMHhBOEJGLCAweEE4QzMsIDB4MDNGRSwKLSAgICAweDhFQTEsIDB4QThDNCwgMHhBOENDLCAweDA0MDUsIDB4OEVBMSwgMHhBOENELCAweEE4Q0QsIDB4MTgxMywKLSAgICAweDhFQTEsIDB4QThDRSwgMHhBOENFLCAweDE4MTgsIDB4OEVBMSwgMHhBOENGLCAweEE4RDIsIDB4MDQwRiwKLSAgICAweDhFQTEsIDB4QThEMywgMHhBOEQzLCAweDE4MTksIDB4OEVBMSwgMHhBOEQ0LCAweEE4RDksIDB4MDUwOCwKLSAgICAweDhFQTEsIDB4QThEQSwgMHhBOERBLCAweDE4RTcsIDB4OEVBMSwgMHhBOERCLCAweEE4RTIsIDB4MDUwRSwKLSAgICAweDhFQTEsIDB4QThFMywgMHhBOEUzLCAweDAyMzAsIDB4OEVBMSwgMHhBOEU0LCAweEE4RTQsIDB4MDUxQiwKLSAgICAweDhFQTEsIDB4QThFNSwgMHhBOEU3LCAweDA1MjAsIDB4OEVBMSwgMHhBOEU4LCAweEE4RUIsIDB4MDY5NiwKLSAgICAweDhFQTEsIDB4QThFQywgMHhBOEVDLCAweDAyMzEsIDB4OEVBMSwgMHhBOEVELCAweEE4RjAsIDB4MDY5RiwKLSAgICAweDhFQTEsIDB4QThGMSwgMHhBOEZCLCAweDA4MjYsIDB4OEVBMSwgMHhBOEZDLCAweEE4RkUsIDB4MDlGNSwKLSAgICAweDhFQTEsIDB4QTlBMSwgMHhBOUExLCAweDFFMzMsIDB4OEVBMSwgMHhBOUEyLCAweEE5QTIsIDB4MDlGOCwKLSAgICAweDhFQTEsIDB4QTlBMywgMHhBOUEzLCAweDFFMzQsIDB4OEVBMSwgMHhBOUE0LCAweEE5QTUsIDB4MDlGOSwKLSAgICAweDhFQTEsIDB4QTlBNiwgMHhBOUFCLCAweDBCRTEsIDB4OEVBMSwgMHhBOUFDLCAweEE5QUUsIDB4MERCQiwKLSAgICAweDhFQTEsIDB4QTlBRiwgMHhBOUFGLCAweDIzNjAsIDB4OEVBMSwgMHhBOUIwLCAweEE5QjAsIDB4MjYxMiwKLSAgICAweDhFQTEsIDB4QTlCMSwgMHhBOUIzLCAweDBGN0IsIDB4OEVBMSwgMHhBOUI0LCAweEE5QjUsIDB4MTEwMCwKLSAgICAweDhFQTEsIDB4QTlCNiwgMHhBOUI2LCAweDEyODksIDB4OEVBMSwgMHhBOUI3LCAweEE5QjgsIDB4MTNCMiwKLSAgICAweDhFQTEsIDB4QTlCOSwgMHhBOUI5LCAweDJGMEQsIDB4OEVBMSwgMHhDMkExLCAweEMyQzEsIDB4MDIzMiwKLSAgICAweDhFQTEsIDB4QzRBMSwgMHhDNEZFLCAweDAyNTMsIDB4OEVBMSwgMHhDNUExLCAweEM1RkUsIDB4MDJCMSwKLSAgICAweDhFQTEsIDB4QzZBMSwgMHhDNkZFLCAweDAzMEYsIDB4OEVBMSwgMHhDN0ExLCAweEM3RkUsIDB4MDM2RCwKLSAgICAweDhFQTEsIDB4QzhBMSwgMHhDOEZFLCAweDAzQ0IsIDB4OEVBMSwgMHhDOUExLCAweEM5RkUsIDB4MDQyOSwKLSAgICAweDhFQTEsIDB4Q0FBMSwgMHhDQUZFLCAweDA0ODcsIDB4OEVBMSwgMHhDQkExLCAweENCRkUsIDB4MDRFNSwKLSAgICAweDhFQTEsIDB4Q0NBMSwgMHhDQ0ZFLCAweDA1NDMsIDB4OEVBMSwgMHhDREExLCAweENERkUsIDB4MDVBMSwKLSAgICAweDhFQTEsIDB4Q0VBMSwgMHhDRUZFLCAweDA1RkYsIDB4OEVBMSwgMHhDRkExLCAweENGRkUsIDB4MDY1RCwKLSAgICAweDhFQTEsIDB4RDBBMSwgMHhEMEZFLCAweDA2QkIsIDB4OEVBMSwgMHhEMUExLCAweEQxRkUsIDB4MDcxOSwKLSAgICAweDhFQTEsIDB4RDJBMSwgMHhEMkZFLCAweDA3NzcsIDB4OEVBMSwgMHhEM0ExLCAweEQzRkUsIDB4MDdENSwKLSAgICAweDhFQTEsIDB4RDRBMSwgMHhENEZFLCAweDA4MzMsIDB4OEVBMSwgMHhENUExLCAweEQ1RkUsIDB4MDg5MSwKLSAgICAweDhFQTEsIDB4RDZBMSwgMHhENkZFLCAweDA4RUYsIDB4OEVBMSwgMHhEN0ExLCAweEQ3RkUsIDB4MDk0RCwKLSAgICAweDhFQTEsIDB4RDhBMSwgMHhEOEZFLCAweDA5QUIsIDB4OEVBMSwgMHhEOUExLCAweEQ5RkUsIDB4MEEwOSwKLSAgICAweDhFQTEsIDB4REFBMSwgMHhEQUZFLCAweDBBNjcsIDB4OEVBMSwgMHhEQkExLCAweERCRkUsIDB4MEFDNSwKLSAgICAweDhFQTEsIDB4RENBMSwgMHhEQ0ZFLCAweDBCMjMsIDB4OEVBMSwgMHhEREExLCAweERERkUsIDB4MEI4MSwKLSAgICAweDhFQTEsIDB4REVBMSwgMHhERUZFLCAweDBCREYsIDB4OEVBMSwgMHhERkExLCAweERGRkUsIDB4MEMzRCwKLSAgICAweDhFQTEsIDB4RTBBMSwgMHhFMEZFLCAweDBDOUIsIDB4OEVBMSwgMHhFMUExLCAweEUxRkUsIDB4MENGOSwKLSAgICAweDhFQTEsIDB4RTJBMSwgMHhFMkZFLCAweDBENTcsIDB4OEVBMSwgMHhFM0ExLCAweEUzRkUsIDB4MERCNSwKLSAgICAweDhFQTEsIDB4RTRBMSwgMHhFNEZFLCAweDBFMTMsIDB4OEVBMSwgMHhFNUExLCAweEU1RkUsIDB4MEU3MSwKLSAgICAweDhFQTEsIDB4RTZBMSwgMHhFNkZFLCAweDBFQ0YsIDB4OEVBMSwgMHhFN0ExLCAweEU3RkUsIDB4MEYyRCwKLSAgICAweDhFQTEsIDB4RThBMSwgMHhFOEZFLCAweDBGOEIsIDB4OEVBMSwgMHhFOUExLCAweEU5RkUsIDB4MEZFOSwKLSAgICAweDhFQTEsIDB4RUFBMSwgMHhFQUZFLCAweDEwNDcsIDB4OEVBMSwgMHhFQkExLCAweEVCRkUsIDB4MTBBNSwKLSAgICAweDhFQTEsIDB4RUNBMSwgMHhFQ0ZFLCAweDExMDMsIDB4OEVBMSwgMHhFREExLCAweEVERkUsIDB4MTE2MSwKLSAgICAweDhFQTEsIDB4RUVBMSwgMHhFRUZFLCAweDExQkYsIDB4OEVBMSwgMHhFRkExLCAweEVGRkUsIDB4MTIxRCwKLSAgICAweDhFQTEsIDB4RjBBMSwgMHhGMEZFLCAweDEyN0IsIDB4OEVBMSwgMHhGMUExLCAweEYxRkUsIDB4MTJEOSwKLSAgICAweDhFQTEsIDB4RjJBMSwgMHhGMkZFLCAweDEzMzcsIDB4OEVBMSwgMHhGM0ExLCAweEYzRkUsIDB4MTM5NSwKLSAgICAweDhFQTEsIDB4RjRBMSwgMHhGNEZFLCAweDEzRjMsIDB4OEVBMSwgMHhGNUExLCAweEY1RkUsIDB4MTQ1MSwKLSAgICAweDhFQTEsIDB4RjZBMSwgMHhGNkZFLCAweDE0QUYsIDB4OEVBMSwgMHhGN0ExLCAweEY3RkUsIDB4MTUwRCwKLSAgICAweDhFQTEsIDB4RjhBMSwgMHhGOEZFLCAweDE1NkIsIDB4OEVBMSwgMHhGOUExLCAweEY5RkUsIDB4MTVDOSwKLSAgICAweDhFQTEsIDB4RkFBMSwgMHhGQUZFLCAweDE2MjcsIDB4OEVBMSwgMHhGQkExLCAweEZCRkUsIDB4MTY4NSwKLSAgICAweDhFQTEsIDB4RkNBMSwgMHhGQ0ZFLCAweDE2RTMsIDB4OEVBMSwgMHhGREExLCAweEZEQ0IsIDB4MTc0MSwKLSAgICAweDhFQTIsIDB4QTFBMSwgMHhBMUZFLCAweDE3NkMsIDB4OEVBMiwgMHhBMkExLCAweEEyRkUsIDB4MTdDQSwKLSAgICAweDhFQTIsIDB4QTNBMSwgMHhBM0ZFLCAweDE4MjgsIDB4OEVBMiwgMHhBNEExLCAweEE0RkUsIDB4MTg4NiwKLSAgICAweDhFQTIsIDB4QTVBMSwgMHhBNUZFLCAweDE4RTQsIDB4OEVBMiwgMHhBNkExLCAweEE2RkUsIDB4MTk0MiwKLSAgICAweDhFQTIsIDB4QTdBMSwgMHhBN0ZFLCAweDE5QTAsIDB4OEVBMiwgMHhBOEExLCAweEE4RkUsIDB4MTlGRSwKLSAgICAweDhFQTIsIDB4QTlBMSwgMHhBOUZFLCAweDFBNUMsIDB4OEVBMiwgMHhBQUExLCAweEFBRkUsIDB4MUFCQSwKLSAgICAweDhFQTIsIDB4QUJBMSwgMHhBQkZFLCAweDFCMTgsIDB4OEVBMiwgMHhBQ0ExLCAweEFDRkUsIDB4MUI3NiwKLSAgICAweDhFQTIsIDB4QURBMSwgMHhBREZFLCAweDFCRDQsIDB4OEVBMiwgMHhBRUExLCAweEFFRkUsIDB4MUMzMiwKLSAgICAweDhFQTIsIDB4QUZBMSwgMHhBRkZFLCAweDFDOTAsIDB4OEVBMiwgMHhCMEExLCAweEIwRkUsIDB4MUNFRSwKLSAgICAweDhFQTIsIDB4QjFBMSwgMHhCMUZFLCAweDFENEMsIDB4OEVBMiwgMHhCMkExLCAweEIyRkUsIDB4MURBQSwKLSAgICAweDhFQTIsIDB4QjNBMSwgMHhCM0ZFLCAweDFFMDgsIDB4OEVBMiwgMHhCNEExLCAweEI0RkUsIDB4MUU2NiwKLSAgICAweDhFQTIsIDB4QjVBMSwgMHhCNUZFLCAweDFFQzQsIDB4OEVBMiwgMHhCNkExLCAweEI2RkUsIDB4MUYyMiwKLSAgICAweDhFQTIsIDB4QjdBMSwgMHhCN0ZFLCAweDFGODAsIDB4OEVBMiwgMHhCOEExLCAweEI4RkUsIDB4MUZERSwKLSAgICAweDhFQTIsIDB4QjlBMSwgMHhCOUZFLCAweDIwM0MsIDB4OEVBMiwgMHhCQUExLCAweEJBRkUsIDB4MjA5QSwKLSAgICAweDhFQTIsIDB4QkJBMSwgMHhCQkZFLCAweDIwRjgsIDB4OEVBMiwgMHhCQ0ExLCAweEJDRkUsIDB4MjE1NiwKLSAgICAweDhFQTIsIDB4QkRBMSwgMHhCREZFLCAweDIxQjQsIDB4OEVBMiwgMHhCRUExLCAweEJFRkUsIDB4MjIxMiwKLSAgICAweDhFQTIsIDB4QkZBMSwgMHhCRkZFLCAweDIyNzAsIDB4OEVBMiwgMHhDMEExLCAweEMwRkUsIDB4MjJDRSwKLSAgICAweDhFQTIsIDB4QzFBMSwgMHhDMUZFLCAweDIzMkMsIDB4OEVBMiwgMHhDMkExLCAweEMyRkUsIDB4MjM4QSwKLSAgICAweDhFQTIsIDB4QzNBMSwgMHhDM0ZFLCAweDIzRTgsIDB4OEVBMiwgMHhDNEExLCAweEM0RkUsIDB4MjQ0NiwKLSAgICAweDhFQTIsIDB4QzVBMSwgMHhDNUZFLCAweDI0QTQsIDB4OEVBMiwgMHhDNkExLCAweEM2RkUsIDB4MjUwMiwKLSAgICAweDhFQTIsIDB4QzdBMSwgMHhDN0ZFLCAweDI1NjAsIDB4OEVBMiwgMHhDOEExLCAweEM4RkUsIDB4MjVCRSwKLSAgICAweDhFQTIsIDB4QzlBMSwgMHhDOUZFLCAweDI2MUMsIDB4OEVBMiwgMHhDQUExLCAweENBRkUsIDB4MjY3QSwKLSAgICAweDhFQTIsIDB4Q0JBMSwgMHhDQkZFLCAweDI2RDgsIDB4OEVBMiwgMHhDQ0ExLCAweENDRkUsIDB4MjczNiwKLSAgICAweDhFQTIsIDB4Q0RBMSwgMHhDREZFLCAweDI3OTQsIDB4OEVBMiwgMHhDRUExLCAweENFRkUsIDB4MjdGMiwKLSAgICAweDhFQTIsIDB4Q0ZBMSwgMHhDRkZFLCAweDI4NTAsIDB4OEVBMiwgMHhEMEExLCAweEQwRkUsIDB4MjhBRSwKLSAgICAweDhFQTIsIDB4RDFBMSwgMHhEMUZFLCAweDI5MEMsIDB4OEVBMiwgMHhEMkExLCAweEQyRkUsIDB4Mjk2QSwKLSAgICAweDhFQTIsIDB4RDNBMSwgMHhEM0ZFLCAweDI5QzgsIDB4OEVBMiwgMHhENEExLCAweEQ0RkUsIDB4MkEyNiwKLSAgICAweDhFQTIsIDB4RDVBMSwgMHhENUZFLCAweDJBODQsIDB4OEVBMiwgMHhENkExLCAweEQ2RkUsIDB4MkFFMiwKLSAgICAweDhFQTIsIDB4RDdBMSwgMHhEN0ZFLCAweDJCNDAsIDB4OEVBMiwgMHhEOEExLCAweEQ4RkUsIDB4MkI5RSwKLSAgICAweDhFQTIsIDB4RDlBMSwgMHhEOUZFLCAweDJCRkMsIDB4OEVBMiwgMHhEQUExLCAweERBRkUsIDB4MkM1QSwKLSAgICAweDhFQTIsIDB4REJBMSwgMHhEQkZFLCAweDJDQjgsIDB4OEVBMiwgMHhEQ0ExLCAweERDRkUsIDB4MkQxNiwKLSAgICAweDhFQTIsIDB4RERBMSwgMHhEREZFLCAweDJENzQsIDB4OEVBMiwgMHhERUExLCAweERFRkUsIDB4MkREMiwKLSAgICAweDhFQTIsIDB4REZBMSwgMHhERkZFLCAweDJFMzAsIDB4OEVBMiwgMHhFMEExLCAweEUwRkUsIDB4MkU4RSwKLSAgICAweDhFQTIsIDB4RTFBMSwgMHhFMUZFLCAweDJFRUMsIDB4OEVBMiwgMHhFMkExLCAweEUyRkUsIDB4MkY0QSwKLSAgICAweDhFQTIsIDB4RTNBMSwgMHhFM0ZFLCAweDJGQTgsIDB4OEVBMiwgMHhFNEExLCAweEU0RkUsIDB4MzAwNiwKLSAgICAweDhFQTIsIDB4RTVBMSwgMHhFNUZFLCAweDMwNjQsIDB4OEVBMiwgMHhFNkExLCAweEU2RkUsIDB4MzBDMiwKLSAgICAweDhFQTIsIDB4RTdBMSwgMHhFN0ZFLCAweDMxMjAsIDB4OEVBMiwgMHhFOEExLCAweEU4RkUsIDB4MzE3RSwKLSAgICAweDhFQTIsIDB4RTlBMSwgMHhFOUZFLCAweDMxREMsIDB4OEVBMiwgMHhFQUExLCAweEVBRkUsIDB4MzIzQSwKLSAgICAweDhFQTIsIDB4RUJBMSwgMHhFQkZFLCAweDMyOTgsIDB4OEVBMiwgMHhFQ0ExLCAweEVDRkUsIDB4MzJGNiwKLSAgICAweDhFQTIsIDB4RURBMSwgMHhFREZFLCAweDMzNTQsIDB4OEVBMiwgMHhFRUExLCAweEVFRkUsIDB4MzNCMiwKLSAgICAweDhFQTIsIDB4RUZBMSwgMHhFRkZFLCAweDM0MTAsIDB4OEVBMiwgMHhGMEExLCAweEYwRkUsIDB4MzQ2RSwKLSAgICAweDhFQTIsIDB4RjFBMSwgMHhGMUZFLCAweDM0Q0MsIDB4OEVBMiwgMHhGMkExLCAweEYyQzQsIDB4MzUyQSwKKyAgICAweDhFQTEsIDB4QTFBMSwgMHhBMUZFLCAweDAwNjMsIDB4OEVBMSwgMHhBMkExLCAweEEyRkUsIDB4MDBDMSwgMHg4RUExLAorICAgIDB4QTNBMSwgMHhBM0NFLCAweDAxMUYsIDB4OEVBMSwgMHhBNEExLCAweEE0RkUsIDB4MDE0RCwgMHg4RUExLCAweEE1QTEsCisgICAgMHhBNUVDLCAweDAxQUIsIDB4OEVBMSwgMHhBNUVFLCAweEE1RjAsIDB4MDFGNywgMHg4RUExLCAweEE2QTEsIDB4QTZCRSwKKyAgICAweDAxRkEsIDB4OEVBMSwgMHhBN0ExLCAweEE3QTEsIDB4MDI1MywgMHg4RUExLCAweEE3QTIsIDB4QTdBNCwgMHgwMjE4LAorICAgIDB4OEVBMSwgMHhBN0E1LCAweEE3QTUsIDB4MDI1NCwgMHg4RUExLCAweEE3QTYsIDB4QTdBNiwgMHgwMjFCLCAweDhFQTEsCisgICAgMHhBN0E3LCAweEE3QTcsIDB4MDI1QSwgMHg4RUExLCAweEE3QTgsIDB4QTdBOCwgMHgwMjFDLCAweDhFQTEsIDB4QTdBOSwKKyAgICAweEE3QUMsIDB4MDI1QiwgMHg4RUExLCAweEE3QUQsIDB4QTdBRiwgMHgwMjFELCAweDhFQTEsIDB4QTdCMCwgMHhBN0IwLAorICAgIDB4MDI1RiwgMHg4RUExLCAweEE3QjEsIDB4QTdCMSwgMHgxNzZFLCAweDhFQTEsIDB4QTdCMiwgMHhBN0IyLCAweDAyNjAsCisgICAgMHg4RUExLCAweEE3QjMsIDB4QTdCMywgMHgwMjYyLCAweDhFQTEsIDB4QTdCNCwgMHhBN0I0LCAweDAyMjAsIDB4OEVBMSwKKyAgICAweEE3QjUsIDB4QTdCNSwgMHgwMjYzLCAweDhFQTEsIDB4QTdCNiwgMHhBN0I2LCAweDE3NkYsIDB4OEVBMSwgMHhBN0I3LAorICAgIDB4QTdCNywgMHgwMjIxLCAweDhFQTEsIDB4QTdCOCwgMHhBN0I5LCAweDAyNjQsIDB4OEVBMSwgMHhBN0JBLCAweEE3QkEsCisgICAgMHgwMjIyLCAweDhFQTEsIDB4QTdCQiwgMHhBN0JCLCAweDE3NzAsIDB4OEVBMSwgMHhBN0JDLCAweEE3QkMsIDB4MDIyMywKKyAgICAweDhFQTEsIDB4QTdCRCwgMHhBN0JELCAweDAyNjYsIDB4OEVBMSwgMHhBN0JFLCAweEE3QkUsIDB4MDI3OSwgMHg4RUExLAorICAgIDB4QTdCRiwgMHhBN0JGLCAweDE3NzUsIDB4OEVBMSwgMHhBN0MwLCAweEE3QzEsIDB4MDI3QSwgMHg4RUExLCAweEE3QzIsCisgICAgMHhBN0MyLCAweDAyMjQsIDB4OEVBMSwgMHhBN0MzLCAweEE3QzYsIDB4MDI3QywgMHg4RUExLCAweEE3QzcsIDB4QTdDNywKKyAgICAweDAyMjUsIDB4OEVBMSwgMHhBN0M4LCAweEE3Q0IsIDB4MDI4MiwgMHg4RUExLCAweEE3Q0MsIDB4QTdDQywgMHgxNzc2LAorICAgIDB4OEVBMSwgMHhBN0NELCAweEE3Q0QsIDB4MDI4NiwgMHg4RUExLCAweEE3Q0UsIDB4QTdDRSwgMHgwMjI2LCAweDhFQTEsCisgICAgMHhBN0NGLCAweEE3RDAsIDB4MDI4OCwgMHg4RUExLCAweEE3RDEsIDB4QTdEMiwgMHgwMjhDLCAweDhFQTEsIDB4QTdEMywKKyAgICAweEE3RDUsIDB4MDIyNywgMHg4RUExLCAweEE3RDYsIDB4QTdEOCwgMHgwMjhFLCAweDhFQTEsIDB4QTdEOSwgMHhBN0RBLAorICAgIDB4MDIyQSwgMHg4RUExLCAweEE3REIsIDB4QTdEQiwgMHgxNzc3LCAweDhFQTEsIDB4QTdEQywgMHhBN0RGLCAweDAyRDAsCisgICAgMHg4RUExLCAweEE3RTAsIDB4QTdFMCwgMHgwMkQ1LCAweDhFQTEsIDB4QTdFMSwgMHhBN0UxLCAweDAyMkMsIDB4OEVBMSwKKyAgICAweEE3RTIsIDB4QTdFNSwgMHgwMkQ2LCAweDhFQTEsIDB4QTdFNiwgMHhBN0U2LCAweDAyMkQsIDB4OEVBMSwgMHhBN0U3LAorICAgIDB4QTdFRCwgMHgwMkRBLCAweDhFQTEsIDB4QTdFRSwgMHhBN0VFLCAweDE3OEEsIDB4OEVBMSwgMHhBN0VGLCAweEE3RjIsCisgICAgMHgwMkUxLCAweDhFQTEsIDB4QTdGMywgMHhBN0YzLCAweDE3OEMsIDB4OEVBMSwgMHhBN0Y0LCAweEE3RjgsIDB4MDJFNSwKKyAgICAweDhFQTEsIDB4QTdGOSwgMHhBN0Y5LCAweDE3OEQsIDB4OEVBMSwgMHhBN0ZBLCAweEE3RkQsIDB4MDJFQSwgMHg4RUExLAorICAgIDB4QTdGRSwgMHhBN0ZFLCAweDAzNTYsIDB4OEVBMSwgMHhBOEExLCAweEE4QTYsIDB4MDM1NywgMHg4RUExLCAweEE4QTcsCisgICAgMHhBOEE3LCAweDAzNUUsIDB4OEVBMSwgMHhBOEE4LCAweEE4QTgsIDB4MDM2MiwgMHg4RUExLCAweEE4QTksIDB4QThBQSwKKyAgICAweDAyMkUsIDB4OEVBMSwgMHhBOEFCLCAweEE4QjIsIDB4MDM2MywgMHg4RUExLCAweEE4QjMsIDB4QThCMywgMHgxN0IyLAorICAgIDB4OEVBMSwgMHhBOEI0LCAweEE4QjYsIDB4MDM2QiwgMHg4RUExLCAweEE4QjcsIDB4QThCQSwgMHgwM0Y2LCAweDhFQTEsCisgICAgMHhBOEJCLCAweEE4QkIsIDB4MTgxMiwgMHg4RUExLCAweEE4QkMsIDB4QThCRSwgMHgwM0ZBLCAweDhFQTEsIDB4QThCRiwKKyAgICAweEE4QzMsIDB4MDNGRSwgMHg4RUExLCAweEE4QzQsIDB4QThDQywgMHgwNDA1LCAweDhFQTEsIDB4QThDRCwgMHhBOENELAorICAgIDB4MTgxMywgMHg4RUExLCAweEE4Q0UsIDB4QThDRSwgMHgxODE4LCAweDhFQTEsIDB4QThDRiwgMHhBOEQyLCAweDA0MEYsCisgICAgMHg4RUExLCAweEE4RDMsIDB4QThEMywgMHgxODE5LCAweDhFQTEsIDB4QThENCwgMHhBOEQ5LCAweDA1MDgsIDB4OEVBMSwKKyAgICAweEE4REEsIDB4QThEQSwgMHgxOEU3LCAweDhFQTEsIDB4QThEQiwgMHhBOEUyLCAweDA1MEUsIDB4OEVBMSwgMHhBOEUzLAorICAgIDB4QThFMywgMHgwMjMwLCAweDhFQTEsIDB4QThFNCwgMHhBOEU0LCAweDA1MUIsIDB4OEVBMSwgMHhBOEU1LCAweEE4RTcsCisgICAgMHgwNTIwLCAweDhFQTEsIDB4QThFOCwgMHhBOEVCLCAweDA2OTYsIDB4OEVBMSwgMHhBOEVDLCAweEE4RUMsIDB4MDIzMSwKKyAgICAweDhFQTEsIDB4QThFRCwgMHhBOEYwLCAweDA2OUYsIDB4OEVBMSwgMHhBOEYxLCAweEE4RkIsIDB4MDgyNiwgMHg4RUExLAorICAgIDB4QThGQywgMHhBOEZFLCAweDA5RjUsIDB4OEVBMSwgMHhBOUExLCAweEE5QTEsIDB4MUUzMywgMHg4RUExLCAweEE5QTIsCisgICAgMHhBOUEyLCAweDA5RjgsIDB4OEVBMSwgMHhBOUEzLCAweEE5QTMsIDB4MUUzNCwgMHg4RUExLCAweEE5QTQsIDB4QTlBNSwKKyAgICAweDA5RjksIDB4OEVBMSwgMHhBOUE2LCAweEE5QUIsIDB4MEJFMSwgMHg4RUExLCAweEE5QUMsIDB4QTlBRSwgMHgwREJCLAorICAgIDB4OEVBMSwgMHhBOUFGLCAweEE5QUYsIDB4MjM2MCwgMHg4RUExLCAweEE5QjAsIDB4QTlCMCwgMHgyNjEyLCAweDhFQTEsCisgICAgMHhBOUIxLCAweEE5QjMsIDB4MEY3QiwgMHg4RUExLCAweEE5QjQsIDB4QTlCNSwgMHgxMTAwLCAweDhFQTEsIDB4QTlCNiwKKyAgICAweEE5QjYsIDB4MTI4OSwgMHg4RUExLCAweEE5QjcsIDB4QTlCOCwgMHgxM0IyLCAweDhFQTEsIDB4QTlCOSwgMHhBOUI5LAorICAgIDB4MkYwRCwgMHg4RUExLCAweEMyQTEsIDB4QzJDMSwgMHgwMjMyLCAweDhFQTEsIDB4QzRBMSwgMHhDNEZFLCAweDAyNTMsCisgICAgMHg4RUExLCAweEM1QTEsIDB4QzVGRSwgMHgwMkIxLCAweDhFQTEsIDB4QzZBMSwgMHhDNkZFLCAweDAzMEYsIDB4OEVBMSwKKyAgICAweEM3QTEsIDB4QzdGRSwgMHgwMzZELCAweDhFQTEsIDB4QzhBMSwgMHhDOEZFLCAweDAzQ0IsIDB4OEVBMSwgMHhDOUExLAorICAgIDB4QzlGRSwgMHgwNDI5LCAweDhFQTEsIDB4Q0FBMSwgMHhDQUZFLCAweDA0ODcsIDB4OEVBMSwgMHhDQkExLCAweENCRkUsCisgICAgMHgwNEU1LCAweDhFQTEsIDB4Q0NBMSwgMHhDQ0ZFLCAweDA1NDMsIDB4OEVBMSwgMHhDREExLCAweENERkUsIDB4MDVBMSwKKyAgICAweDhFQTEsIDB4Q0VBMSwgMHhDRUZFLCAweDA1RkYsIDB4OEVBMSwgMHhDRkExLCAweENGRkUsIDB4MDY1RCwgMHg4RUExLAorICAgIDB4RDBBMSwgMHhEMEZFLCAweDA2QkIsIDB4OEVBMSwgMHhEMUExLCAweEQxRkUsIDB4MDcxOSwgMHg4RUExLCAweEQyQTEsCisgICAgMHhEMkZFLCAweDA3NzcsIDB4OEVBMSwgMHhEM0ExLCAweEQzRkUsIDB4MDdENSwgMHg4RUExLCAweEQ0QTEsIDB4RDRGRSwKKyAgICAweDA4MzMsIDB4OEVBMSwgMHhENUExLCAweEQ1RkUsIDB4MDg5MSwgMHg4RUExLCAweEQ2QTEsIDB4RDZGRSwgMHgwOEVGLAorICAgIDB4OEVBMSwgMHhEN0ExLCAweEQ3RkUsIDB4MDk0RCwgMHg4RUExLCAweEQ4QTEsIDB4RDhGRSwgMHgwOUFCLCAweDhFQTEsCisgICAgMHhEOUExLCAweEQ5RkUsIDB4MEEwOSwgMHg4RUExLCAweERBQTEsIDB4REFGRSwgMHgwQTY3LCAweDhFQTEsIDB4REJBMSwKKyAgICAweERCRkUsIDB4MEFDNSwgMHg4RUExLCAweERDQTEsIDB4RENGRSwgMHgwQjIzLCAweDhFQTEsIDB4RERBMSwgMHhEREZFLAorICAgIDB4MEI4MSwgMHg4RUExLCAweERFQTEsIDB4REVGRSwgMHgwQkRGLCAweDhFQTEsIDB4REZBMSwgMHhERkZFLCAweDBDM0QsCisgICAgMHg4RUExLCAweEUwQTEsIDB4RTBGRSwgMHgwQzlCLCAweDhFQTEsIDB4RTFBMSwgMHhFMUZFLCAweDBDRjksIDB4OEVBMSwKKyAgICAweEUyQTEsIDB4RTJGRSwgMHgwRDU3LCAweDhFQTEsIDB4RTNBMSwgMHhFM0ZFLCAweDBEQjUsIDB4OEVBMSwgMHhFNEExLAorICAgIDB4RTRGRSwgMHgwRTEzLCAweDhFQTEsIDB4RTVBMSwgMHhFNUZFLCAweDBFNzEsIDB4OEVBMSwgMHhFNkExLCAweEU2RkUsCisgICAgMHgwRUNGLCAweDhFQTEsIDB4RTdBMSwgMHhFN0ZFLCAweDBGMkQsIDB4OEVBMSwgMHhFOEExLCAweEU4RkUsIDB4MEY4QiwKKyAgICAweDhFQTEsIDB4RTlBMSwgMHhFOUZFLCAweDBGRTksIDB4OEVBMSwgMHhFQUExLCAweEVBRkUsIDB4MTA0NywgMHg4RUExLAorICAgIDB4RUJBMSwgMHhFQkZFLCAweDEwQTUsIDB4OEVBMSwgMHhFQ0ExLCAweEVDRkUsIDB4MTEwMywgMHg4RUExLCAweEVEQTEsCisgICAgMHhFREZFLCAweDExNjEsIDB4OEVBMSwgMHhFRUExLCAweEVFRkUsIDB4MTFCRiwgMHg4RUExLCAweEVGQTEsIDB4RUZGRSwKKyAgICAweDEyMUQsIDB4OEVBMSwgMHhGMEExLCAweEYwRkUsIDB4MTI3QiwgMHg4RUExLCAweEYxQTEsIDB4RjFGRSwgMHgxMkQ5LAorICAgIDB4OEVBMSwgMHhGMkExLCAweEYyRkUsIDB4MTMzNywgMHg4RUExLCAweEYzQTEsIDB4RjNGRSwgMHgxMzk1LCAweDhFQTEsCisgICAgMHhGNEExLCAweEY0RkUsIDB4MTNGMywgMHg4RUExLCAweEY1QTEsIDB4RjVGRSwgMHgxNDUxLCAweDhFQTEsIDB4RjZBMSwKKyAgICAweEY2RkUsIDB4MTRBRiwgMHg4RUExLCAweEY3QTEsIDB4RjdGRSwgMHgxNTBELCAweDhFQTEsIDB4RjhBMSwgMHhGOEZFLAorICAgIDB4MTU2QiwgMHg4RUExLCAweEY5QTEsIDB4RjlGRSwgMHgxNUM5LCAweDhFQTEsIDB4RkFBMSwgMHhGQUZFLCAweDE2MjcsCisgICAgMHg4RUExLCAweEZCQTEsIDB4RkJGRSwgMHgxNjg1LCAweDhFQTEsIDB4RkNBMSwgMHhGQ0ZFLCAweDE2RTMsIDB4OEVBMSwKKyAgICAweEZEQTEsIDB4RkRDQiwgMHgxNzQxLCAweDhFQTIsIDB4QTFBMSwgMHhBMUZFLCAweDE3NkMsIDB4OEVBMiwgMHhBMkExLAorICAgIDB4QTJGRSwgMHgxN0NBLCAweDhFQTIsIDB4QTNBMSwgMHhBM0ZFLCAweDE4MjgsIDB4OEVBMiwgMHhBNEExLCAweEE0RkUsCisgICAgMHgxODg2LCAweDhFQTIsIDB4QTVBMSwgMHhBNUZFLCAweDE4RTQsIDB4OEVBMiwgMHhBNkExLCAweEE2RkUsIDB4MTk0MiwKKyAgICAweDhFQTIsIDB4QTdBMSwgMHhBN0ZFLCAweDE5QTAsIDB4OEVBMiwgMHhBOEExLCAweEE4RkUsIDB4MTlGRSwgMHg4RUEyLAorICAgIDB4QTlBMSwgMHhBOUZFLCAweDFBNUMsIDB4OEVBMiwgMHhBQUExLCAweEFBRkUsIDB4MUFCQSwgMHg4RUEyLCAweEFCQTEsCisgICAgMHhBQkZFLCAweDFCMTgsIDB4OEVBMiwgMHhBQ0ExLCAweEFDRkUsIDB4MUI3NiwgMHg4RUEyLCAweEFEQTEsIDB4QURGRSwKKyAgICAweDFCRDQsIDB4OEVBMiwgMHhBRUExLCAweEFFRkUsIDB4MUMzMiwgMHg4RUEyLCAweEFGQTEsIDB4QUZGRSwgMHgxQzkwLAorICAgIDB4OEVBMiwgMHhCMEExLCAweEIwRkUsIDB4MUNFRSwgMHg4RUEyLCAweEIxQTEsIDB4QjFGRSwgMHgxRDRDLCAweDhFQTIsCisgICAgMHhCMkExLCAweEIyRkUsIDB4MURBQSwgMHg4RUEyLCAweEIzQTEsIDB4QjNGRSwgMHgxRTA4LCAweDhFQTIsIDB4QjRBMSwKKyAgICAweEI0RkUsIDB4MUU2NiwgMHg4RUEyLCAweEI1QTEsIDB4QjVGRSwgMHgxRUM0LCAweDhFQTIsIDB4QjZBMSwgMHhCNkZFLAorICAgIDB4MUYyMiwgMHg4RUEyLCAweEI3QTEsIDB4QjdGRSwgMHgxRjgwLCAweDhFQTIsIDB4QjhBMSwgMHhCOEZFLCAweDFGREUsCisgICAgMHg4RUEyLCAweEI5QTEsIDB4QjlGRSwgMHgyMDNDLCAweDhFQTIsIDB4QkFBMSwgMHhCQUZFLCAweDIwOUEsIDB4OEVBMiwKKyAgICAweEJCQTEsIDB4QkJGRSwgMHgyMEY4LCAweDhFQTIsIDB4QkNBMSwgMHhCQ0ZFLCAweDIxNTYsIDB4OEVBMiwgMHhCREExLAorICAgIDB4QkRGRSwgMHgyMUI0LCAweDhFQTIsIDB4QkVBMSwgMHhCRUZFLCAweDIyMTIsIDB4OEVBMiwgMHhCRkExLCAweEJGRkUsCisgICAgMHgyMjcwLCAweDhFQTIsIDB4QzBBMSwgMHhDMEZFLCAweDIyQ0UsIDB4OEVBMiwgMHhDMUExLCAweEMxRkUsIDB4MjMyQywKKyAgICAweDhFQTIsIDB4QzJBMSwgMHhDMkZFLCAweDIzOEEsIDB4OEVBMiwgMHhDM0ExLCAweEMzRkUsIDB4MjNFOCwgMHg4RUEyLAorICAgIDB4QzRBMSwgMHhDNEZFLCAweDI0NDYsIDB4OEVBMiwgMHhDNUExLCAweEM1RkUsIDB4MjRBNCwgMHg4RUEyLCAweEM2QTEsCisgICAgMHhDNkZFLCAweDI1MDIsIDB4OEVBMiwgMHhDN0ExLCAweEM3RkUsIDB4MjU2MCwgMHg4RUEyLCAweEM4QTEsIDB4QzhGRSwKKyAgICAweDI1QkUsIDB4OEVBMiwgMHhDOUExLCAweEM5RkUsIDB4MjYxQywgMHg4RUEyLCAweENBQTEsIDB4Q0FGRSwgMHgyNjdBLAorICAgIDB4OEVBMiwgMHhDQkExLCAweENCRkUsIDB4MjZEOCwgMHg4RUEyLCAweENDQTEsIDB4Q0NGRSwgMHgyNzM2LCAweDhFQTIsCisgICAgMHhDREExLCAweENERkUsIDB4Mjc5NCwgMHg4RUEyLCAweENFQTEsIDB4Q0VGRSwgMHgyN0YyLCAweDhFQTIsIDB4Q0ZBMSwKKyAgICAweENGRkUsIDB4Mjg1MCwgMHg4RUEyLCAweEQwQTEsIDB4RDBGRSwgMHgyOEFFLCAweDhFQTIsIDB4RDFBMSwgMHhEMUZFLAorICAgIDB4MjkwQywgMHg4RUEyLCAweEQyQTEsIDB4RDJGRSwgMHgyOTZBLCAweDhFQTIsIDB4RDNBMSwgMHhEM0ZFLCAweDI5QzgsCisgICAgMHg4RUEyLCAweEQ0QTEsIDB4RDRGRSwgMHgyQTI2LCAweDhFQTIsIDB4RDVBMSwgMHhENUZFLCAweDJBODQsIDB4OEVBMiwKKyAgICAweEQ2QTEsIDB4RDZGRSwgMHgyQUUyLCAweDhFQTIsIDB4RDdBMSwgMHhEN0ZFLCAweDJCNDAsIDB4OEVBMiwgMHhEOEExLAorICAgIDB4RDhGRSwgMHgyQjlFLCAweDhFQTIsIDB4RDlBMSwgMHhEOUZFLCAweDJCRkMsIDB4OEVBMiwgMHhEQUExLCAweERBRkUsCisgICAgMHgyQzVBLCAweDhFQTIsIDB4REJBMSwgMHhEQkZFLCAweDJDQjgsIDB4OEVBMiwgMHhEQ0ExLCAweERDRkUsIDB4MkQxNiwKKyAgICAweDhFQTIsIDB4RERBMSwgMHhEREZFLCAweDJENzQsIDB4OEVBMiwgMHhERUExLCAweERFRkUsIDB4MkREMiwgMHg4RUEyLAorICAgIDB4REZBMSwgMHhERkZFLCAweDJFMzAsIDB4OEVBMiwgMHhFMEExLCAweEUwRkUsIDB4MkU4RSwgMHg4RUEyLCAweEUxQTEsCisgICAgMHhFMUZFLCAweDJFRUMsIDB4OEVBMiwgMHhFMkExLCAweEUyRkUsIDB4MkY0QSwgMHg4RUEyLCAweEUzQTEsIDB4RTNGRSwKKyAgICAweDJGQTgsIDB4OEVBMiwgMHhFNEExLCAweEU0RkUsIDB4MzAwNiwgMHg4RUEyLCAweEU1QTEsIDB4RTVGRSwgMHgzMDY0LAorICAgIDB4OEVBMiwgMHhFNkExLCAweEU2RkUsIDB4MzBDMiwgMHg4RUEyLCAweEU3QTEsIDB4RTdGRSwgMHgzMTIwLCAweDhFQTIsCisgICAgMHhFOEExLCAweEU4RkUsIDB4MzE3RSwgMHg4RUEyLCAweEU5QTEsIDB4RTlGRSwgMHgzMURDLCAweDhFQTIsIDB4RUFBMSwKKyAgICAweEVBRkUsIDB4MzIzQSwgMHg4RUEyLCAweEVCQTEsIDB4RUJGRSwgMHgzMjk4LCAweDhFQTIsIDB4RUNBMSwgMHhFQ0ZFLAorICAgIDB4MzJGNiwgMHg4RUEyLCAweEVEQTEsIDB4RURGRSwgMHgzMzU0LCAweDhFQTIsIDB4RUVBMSwgMHhFRUZFLCAweDMzQjIsCisgICAgMHg4RUEyLCAweEVGQTEsIDB4RUZGRSwgMHgzNDEwLCAweDhFQTIsIDB4RjBBMSwgMHhGMEZFLCAweDM0NkUsIDB4OEVBMiwKKyAgICAweEYxQTEsIDB4RjFGRSwgMHgzNENDLCAweDhFQTIsIDB4RjJBMSwgMHhGMkM0LCAweDM1MkEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQ05TLUVVQy1WXzAuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQ05TLUVVQy1WXzAuY3BwCmluZGV4IDg1OGVkNWQuLjM4YWQ2YWIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0NOUy1FVUMtVl8wLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9DTlMtRVVDLVZfMC5jcHAKQEAgLTcwLDEzNSArNzAsMTIwIEBACiB9OwogCiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0NOU19FVUNfVl8wX0RXb3JkWzI2MSAqIDRdID0gewotICAgIDB4OEVBMSwgMHhBMUExLCAweEExQUIsIDB4MDA2MywgMHg4RUExLCAweEExQUMsIDB4QTFBQywgMHgzNTRFLAotICAgIDB4OEVBMSwgMHhBMUFELCAweEExQkEsIDB4MDA2RiwgMHg4RUExLCAweEExQkIsIDB4QTFCQiwgMHgwMDdDLAotICAgIDB4OEVBMSwgMHhBMUJDLCAweEExQkMsIDB4MDA3RSwgMHg4RUExLCAweEExQkQsIDB4QTFCRCwgMHgwMDdFLAotICAgIDB4OEVBMSwgMHhBMUJFLCAweEExQkYsIDB4MDA4MiwgMHg4RUExLCAweEExQzAsIDB4QTFDMSwgMHgwMDgyLAotICAgIDB4OEVBMSwgMHhBMUMyLCAweEExQzMsIDB4MDA4NiwgMHg4RUExLCAweEExQzQsIDB4QTFDNSwgMHgwMDg2LAotICAgIDB4OEVBMSwgMHhBMUM2LCAweEExQzcsIDB4MDA4QSwgMHg4RUExLCAweEExQzgsIDB4QTFDOSwgMHgwMDhBLAotICAgIDB4OEVBMSwgMHhBMUNBLCAweEExQ0IsIDB4MDA4RSwgMHg4RUExLCAweEExQ0MsIDB4QTFDRCwgMHgwMDhFLAotICAgIDB4OEVBMSwgMHhBMUNFLCAweEExQ0YsIDB4MDA5MiwgMHg4RUExLCAweEExRDAsIDB4QTFEMSwgMHgwMDkyLAotICAgIDB4OEVBMSwgMHhBMUQyLCAweEExRDMsIDB4MDA5NiwgMHg4RUExLCAweEExRDQsIDB4QTFENSwgMHgwMDk2LAotICAgIDB4OEVBMSwgMHhBMUQ2LCAweEExRDcsIDB4MDA5QSwgMHg4RUExLCAweEExRDgsIDB4QTFEOSwgMHgwMDlBLAotICAgIDB4OEVBMSwgMHhBMURBLCAweEExREIsIDB4MDA5RSwgMHg4RUExLCAweEExREMsIDB4QTFGRSwgMHgwMDlFLAotICAgIDB4OEVBMSwgMHhBMkExLCAweEEyQzMsIDB4MDBDMSwgMHg4RUExLCAweEEyQzQsIDB4QTJDNCwgMHgzNTRGLAotICAgIDB4OEVBMSwgMHhBMkM1LCAweEEyRkUsIDB4MDBFNSwgMHg4RUExLCAweEEzQTEsIDB4QTNDRSwgMHgwMTFGLAotICAgIDB4OEVBMSwgMHhBNEExLCAweEE0RkUsIDB4MDE0RCwgMHg4RUExLCAweEE1QTEsIDB4QTVFQywgMHgwMUFCLAotICAgIDB4OEVBMSwgMHhBNUVFLCAweEE1RjAsIDB4MDFGNywgMHg4RUExLCAweEE2QTEsIDB4QTZCRSwgMHgwMUZBLAotICAgIDB4OEVBMSwgMHhBN0ExLCAweEE3QTEsIDB4MDI1MywgMHg4RUExLCAweEE3QTIsIDB4QTdBNCwgMHgwMjE4LAotICAgIDB4OEVBMSwgMHhBN0E1LCAweEE3QTUsIDB4MDI1NCwgMHg4RUExLCAweEE3QTYsIDB4QTdBNiwgMHgwMjFCLAotICAgIDB4OEVBMSwgMHhBN0E3LCAweEE3QTcsIDB4MDI1QSwgMHg4RUExLCAweEE3QTgsIDB4QTdBOCwgMHgwMjFDLAotICAgIDB4OEVBMSwgMHhBN0E5LCAweEE3QUMsIDB4MDI1QiwgMHg4RUExLCAweEE3QUQsIDB4QTdBRiwgMHgwMjFELAotICAgIDB4OEVBMSwgMHhBN0IwLCAweEE3QjAsIDB4MDI1RiwgMHg4RUExLCAweEE3QjEsIDB4QTdCMSwgMHgxNzZFLAotICAgIDB4OEVBMSwgMHhBN0IyLCAweEE3QjIsIDB4MDI2MCwgMHg4RUExLCAweEE3QjMsIDB4QTdCMywgMHgwMjYyLAotICAgIDB4OEVBMSwgMHhBN0I0LCAweEE3QjQsIDB4MDIyMCwgMHg4RUExLCAweEE3QjUsIDB4QTdCNSwgMHgwMjYzLAotICAgIDB4OEVBMSwgMHhBN0I2LCAweEE3QjYsIDB4MTc2RiwgMHg4RUExLCAweEE3QjcsIDB4QTdCNywgMHgwMjIxLAotICAgIDB4OEVBMSwgMHhBN0I4LCAweEE3QjksIDB4MDI2NCwgMHg4RUExLCAweEE3QkEsIDB4QTdCQSwgMHgwMjIyLAotICAgIDB4OEVBMSwgMHhBN0JCLCAweEE3QkIsIDB4MTc3MCwgMHg4RUExLCAweEE3QkMsIDB4QTdCQywgMHgwMjIzLAotICAgIDB4OEVBMSwgMHhBN0JELCAweEE3QkQsIDB4MDI2NiwgMHg4RUExLCAweEE3QkUsIDB4QTdCRSwgMHgwMjc5LAotICAgIDB4OEVBMSwgMHhBN0JGLCAweEE3QkYsIDB4MTc3NSwgMHg4RUExLCAweEE3QzAsIDB4QTdDMSwgMHgwMjdBLAotICAgIDB4OEVBMSwgMHhBN0MyLCAweEE3QzIsIDB4MDIyNCwgMHg4RUExLCAweEE3QzMsIDB4QTdDNiwgMHgwMjdDLAotICAgIDB4OEVBMSwgMHhBN0M3LCAweEE3QzcsIDB4MDIyNSwgMHg4RUExLCAweEE3QzgsIDB4QTdDQiwgMHgwMjgyLAotICAgIDB4OEVBMSwgMHhBN0NDLCAweEE3Q0MsIDB4MTc3NiwgMHg4RUExLCAweEE3Q0QsIDB4QTdDRCwgMHgwMjg2LAotICAgIDB4OEVBMSwgMHhBN0NFLCAweEE3Q0UsIDB4MDIyNiwgMHg4RUExLCAweEE3Q0YsIDB4QTdEMCwgMHgwMjg4LAotICAgIDB4OEVBMSwgMHhBN0QxLCAweEE3RDIsIDB4MDI4QywgMHg4RUExLCAweEE3RDMsIDB4QTdENSwgMHgwMjI3LAotICAgIDB4OEVBMSwgMHhBN0Q2LCAweEE3RDgsIDB4MDI4RSwgMHg4RUExLCAweEE3RDksIDB4QTdEQSwgMHgwMjJBLAotICAgIDB4OEVBMSwgMHhBN0RCLCAweEE3REIsIDB4MTc3NywgMHg4RUExLCAweEE3REMsIDB4QTdERiwgMHgwMkQwLAotICAgIDB4OEVBMSwgMHhBN0UwLCAweEE3RTAsIDB4MDJENSwgMHg4RUExLCAweEE3RTEsIDB4QTdFMSwgMHgwMjJDLAotICAgIDB4OEVBMSwgMHhBN0UyLCAweEE3RTUsIDB4MDJENiwgMHg4RUExLCAweEE3RTYsIDB4QTdFNiwgMHgwMjJELAotICAgIDB4OEVBMSwgMHhBN0U3LCAweEE3RUQsIDB4MDJEQSwgMHg4RUExLCAweEE3RUUsIDB4QTdFRSwgMHgxNzhBLAotICAgIDB4OEVBMSwgMHhBN0VGLCAweEE3RjIsIDB4MDJFMSwgMHg4RUExLCAweEE3RjMsIDB4QTdGMywgMHgxNzhDLAotICAgIDB4OEVBMSwgMHhBN0Y0LCAweEE3RjgsIDB4MDJFNSwgMHg4RUExLCAweEE3RjksIDB4QTdGOSwgMHgxNzhELAotICAgIDB4OEVBMSwgMHhBN0ZBLCAweEE3RkQsIDB4MDJFQSwgMHg4RUExLCAweEE3RkUsIDB4QTdGRSwgMHgwMzU2LAotICAgIDB4OEVBMSwgMHhBOEExLCAweEE4QTYsIDB4MDM1NywgMHg4RUExLCAweEE4QTcsIDB4QThBNywgMHgwMzVFLAotICAgIDB4OEVBMSwgMHhBOEE4LCAweEE4QTgsIDB4MDM2MiwgMHg4RUExLCAweEE4QTksIDB4QThBQSwgMHgwMjJFLAotICAgIDB4OEVBMSwgMHhBOEFCLCAweEE4QjIsIDB4MDM2MywgMHg4RUExLCAweEE4QjMsIDB4QThCMywgMHgxN0IyLAotICAgIDB4OEVBMSwgMHhBOEI0LCAweEE4QjYsIDB4MDM2QiwgMHg4RUExLCAweEE4QjcsIDB4QThCQSwgMHgwM0Y2LAotICAgIDB4OEVBMSwgMHhBOEJCLCAweEE4QkIsIDB4MTgxMiwgMHg4RUExLCAweEE4QkMsIDB4QThCRSwgMHgwM0ZBLAotICAgIDB4OEVBMSwgMHhBOEJGLCAweEE4QzMsIDB4MDNGRSwgMHg4RUExLCAweEE4QzQsIDB4QThDQywgMHgwNDA1LAotICAgIDB4OEVBMSwgMHhBOENELCAweEE4Q0QsIDB4MTgxMywgMHg4RUExLCAweEE4Q0UsIDB4QThDRSwgMHgxODE4LAotICAgIDB4OEVBMSwgMHhBOENGLCAweEE4RDIsIDB4MDQwRiwgMHg4RUExLCAweEE4RDMsIDB4QThEMywgMHgxODE5LAotICAgIDB4OEVBMSwgMHhBOEQ0LCAweEE4RDksIDB4MDUwOCwgMHg4RUExLCAweEE4REEsIDB4QThEQSwgMHgxOEU3LAotICAgIDB4OEVBMSwgMHhBOERCLCAweEE4RTIsIDB4MDUwRSwgMHg4RUExLCAweEE4RTMsIDB4QThFMywgMHgwMjMwLAotICAgIDB4OEVBMSwgMHhBOEU0LCAweEE4RTQsIDB4MDUxQiwgMHg4RUExLCAweEE4RTUsIDB4QThFNywgMHgwNTIwLAotICAgIDB4OEVBMSwgMHhBOEU4LCAweEE4RUIsIDB4MDY5NiwgMHg4RUExLCAweEE4RUMsIDB4QThFQywgMHgwMjMxLAotICAgIDB4OEVBMSwgMHhBOEVELCAweEE4RjAsIDB4MDY5RiwgMHg4RUExLCAweEE4RjEsIDB4QThGQiwgMHgwODI2LAotICAgIDB4OEVBMSwgMHhBOEZDLCAweEE4RkUsIDB4MDlGNSwgMHg4RUExLCAweEE5QTEsIDB4QTlBMSwgMHgxRTMzLAotICAgIDB4OEVBMSwgMHhBOUEyLCAweEE5QTIsIDB4MDlGOCwgMHg4RUExLCAweEE5QTMsIDB4QTlBMywgMHgxRTM0LAotICAgIDB4OEVBMSwgMHhBOUE0LCAweEE5QTUsIDB4MDlGOSwgMHg4RUExLCAweEE5QTYsIDB4QTlBQiwgMHgwQkUxLAotICAgIDB4OEVBMSwgMHhBOUFDLCAweEE5QUUsIDB4MERCQiwgMHg4RUExLCAweEE5QUYsIDB4QTlBRiwgMHgyMzYwLAotICAgIDB4OEVBMSwgMHhBOUIwLCAweEE5QjAsIDB4MjYxMiwgMHg4RUExLCAweEE5QjEsIDB4QTlCMywgMHgwRjdCLAotICAgIDB4OEVBMSwgMHhBOUI0LCAweEE5QjUsIDB4MTEwMCwgMHg4RUExLCAweEE5QjYsIDB4QTlCNiwgMHgxMjg5LAotICAgIDB4OEVBMSwgMHhBOUI3LCAweEE5QjgsIDB4MTNCMiwgMHg4RUExLCAweEE5QjksIDB4QTlCOSwgMHgyRjBELAotICAgIDB4OEVBMSwgMHhDMkExLCAweEMyQzEsIDB4MDIzMiwgMHg4RUExLCAweEM0QTEsIDB4QzRGRSwgMHgwMjUzLAotICAgIDB4OEVBMSwgMHhDNUExLCAweEM1RkUsIDB4MDJCMSwgMHg4RUExLCAweEM2QTEsIDB4QzZGRSwgMHgwMzBGLAotICAgIDB4OEVBMSwgMHhDN0ExLCAweEM3RkUsIDB4MDM2RCwgMHg4RUExLCAweEM4QTEsIDB4QzhGRSwgMHgwM0NCLAotICAgIDB4OEVBMSwgMHhDOUExLCAweEM5RkUsIDB4MDQyOSwgMHg4RUExLCAweENBQTEsIDB4Q0FGRSwgMHgwNDg3LAotICAgIDB4OEVBMSwgMHhDQkExLCAweENCRkUsIDB4MDRFNSwgMHg4RUExLCAweENDQTEsIDB4Q0NGRSwgMHgwNTQzLAotICAgIDB4OEVBMSwgMHhDREExLCAweENERkUsIDB4MDVBMSwgMHg4RUExLCAweENFQTEsIDB4Q0VGRSwgMHgwNUZGLAotICAgIDB4OEVBMSwgMHhDRkExLCAweENGRkUsIDB4MDY1RCwgMHg4RUExLCAweEQwQTEsIDB4RDBGRSwgMHgwNkJCLAotICAgIDB4OEVBMSwgMHhEMUExLCAweEQxRkUsIDB4MDcxOSwgMHg4RUExLCAweEQyQTEsIDB4RDJGRSwgMHgwNzc3LAotICAgIDB4OEVBMSwgMHhEM0ExLCAweEQzRkUsIDB4MDdENSwgMHg4RUExLCAweEQ0QTEsIDB4RDRGRSwgMHgwODMzLAotICAgIDB4OEVBMSwgMHhENUExLCAweEQ1RkUsIDB4MDg5MSwgMHg4RUExLCAweEQ2QTEsIDB4RDZGRSwgMHgwOEVGLAotICAgIDB4OEVBMSwgMHhEN0ExLCAweEQ3RkUsIDB4MDk0RCwgMHg4RUExLCAweEQ4QTEsIDB4RDhGRSwgMHgwOUFCLAotICAgIDB4OEVBMSwgMHhEOUExLCAweEQ5RkUsIDB4MEEwOSwgMHg4RUExLCAweERBQTEsIDB4REFGRSwgMHgwQTY3LAotICAgIDB4OEVBMSwgMHhEQkExLCAweERCRkUsIDB4MEFDNSwgMHg4RUExLCAweERDQTEsIDB4RENGRSwgMHgwQjIzLAotICAgIDB4OEVBMSwgMHhEREExLCAweERERkUsIDB4MEI4MSwgMHg4RUExLCAweERFQTEsIDB4REVGRSwgMHgwQkRGLAotICAgIDB4OEVBMSwgMHhERkExLCAweERGRkUsIDB4MEMzRCwgMHg4RUExLCAweEUwQTEsIDB4RTBGRSwgMHgwQzlCLAotICAgIDB4OEVBMSwgMHhFMUExLCAweEUxRkUsIDB4MENGOSwgMHg4RUExLCAweEUyQTEsIDB4RTJGRSwgMHgwRDU3LAotICAgIDB4OEVBMSwgMHhFM0ExLCAweEUzRkUsIDB4MERCNSwgMHg4RUExLCAweEU0QTEsIDB4RTRGRSwgMHgwRTEzLAotICAgIDB4OEVBMSwgMHhFNUExLCAweEU1RkUsIDB4MEU3MSwgMHg4RUExLCAweEU2QTEsIDB4RTZGRSwgMHgwRUNGLAotICAgIDB4OEVBMSwgMHhFN0ExLCAweEU3RkUsIDB4MEYyRCwgMHg4RUExLCAweEU4QTEsIDB4RThGRSwgMHgwRjhCLAotICAgIDB4OEVBMSwgMHhFOUExLCAweEU5RkUsIDB4MEZFOSwgMHg4RUExLCAweEVBQTEsIDB4RUFGRSwgMHgxMDQ3LAotICAgIDB4OEVBMSwgMHhFQkExLCAweEVCRkUsIDB4MTBBNSwgMHg4RUExLCAweEVDQTEsIDB4RUNGRSwgMHgxMTAzLAotICAgIDB4OEVBMSwgMHhFREExLCAweEVERkUsIDB4MTE2MSwgMHg4RUExLCAweEVFQTEsIDB4RUVGRSwgMHgxMUJGLAotICAgIDB4OEVBMSwgMHhFRkExLCAweEVGRkUsIDB4MTIxRCwgMHg4RUExLCAweEYwQTEsIDB4RjBGRSwgMHgxMjdCLAotICAgIDB4OEVBMSwgMHhGMUExLCAweEYxRkUsIDB4MTJEOSwgMHg4RUExLCAweEYyQTEsIDB4RjJGRSwgMHgxMzM3LAotICAgIDB4OEVBMSwgMHhGM0ExLCAweEYzRkUsIDB4MTM5NSwgMHg4RUExLCAweEY0QTEsIDB4RjRGRSwgMHgxM0YzLAotICAgIDB4OEVBMSwgMHhGNUExLCAweEY1RkUsIDB4MTQ1MSwgMHg4RUExLCAweEY2QTEsIDB4RjZGRSwgMHgxNEFGLAotICAgIDB4OEVBMSwgMHhGN0ExLCAweEY3RkUsIDB4MTUwRCwgMHg4RUExLCAweEY4QTEsIDB4RjhGRSwgMHgxNTZCLAotICAgIDB4OEVBMSwgMHhGOUExLCAweEY5RkUsIDB4MTVDOSwgMHg4RUExLCAweEZBQTEsIDB4RkFGRSwgMHgxNjI3LAotICAgIDB4OEVBMSwgMHhGQkExLCAweEZCRkUsIDB4MTY4NSwgMHg4RUExLCAweEZDQTEsIDB4RkNGRSwgMHgxNkUzLAotICAgIDB4OEVBMSwgMHhGREExLCAweEZEQ0IsIDB4MTc0MSwgMHg4RUEyLCAweEExQTEsIDB4QTFGRSwgMHgxNzZDLAotICAgIDB4OEVBMiwgMHhBMkExLCAweEEyRkUsIDB4MTdDQSwgMHg4RUEyLCAweEEzQTEsIDB4QTNGRSwgMHgxODI4LAotICAgIDB4OEVBMiwgMHhBNEExLCAweEE0RkUsIDB4MTg4NiwgMHg4RUEyLCAweEE1QTEsIDB4QTVGRSwgMHgxOEU0LAotICAgIDB4OEVBMiwgMHhBNkExLCAweEE2RkUsIDB4MTk0MiwgMHg4RUEyLCAweEE3QTEsIDB4QTdGRSwgMHgxOUEwLAotICAgIDB4OEVBMiwgMHhBOEExLCAweEE4RkUsIDB4MTlGRSwgMHg4RUEyLCAweEE5QTEsIDB4QTlGRSwgMHgxQTVDLAotICAgIDB4OEVBMiwgMHhBQUExLCAweEFBRkUsIDB4MUFCQSwgMHg4RUEyLCAweEFCQTEsIDB4QUJGRSwgMHgxQjE4LAotICAgIDB4OEVBMiwgMHhBQ0ExLCAweEFDRkUsIDB4MUI3NiwgMHg4RUEyLCAweEFEQTEsIDB4QURGRSwgMHgxQkQ0LAotICAgIDB4OEVBMiwgMHhBRUExLCAweEFFRkUsIDB4MUMzMiwgMHg4RUEyLCAweEFGQTEsIDB4QUZGRSwgMHgxQzkwLAotICAgIDB4OEVBMiwgMHhCMEExLCAweEIwRkUsIDB4MUNFRSwgMHg4RUEyLCAweEIxQTEsIDB4QjFGRSwgMHgxRDRDLAotICAgIDB4OEVBMiwgMHhCMkExLCAweEIyRkUsIDB4MURBQSwgMHg4RUEyLCAweEIzQTEsIDB4QjNGRSwgMHgxRTA4LAotICAgIDB4OEVBMiwgMHhCNEExLCAweEI0RkUsIDB4MUU2NiwgMHg4RUEyLCAweEI1QTEsIDB4QjVGRSwgMHgxRUM0LAotICAgIDB4OEVBMiwgMHhCNkExLCAweEI2RkUsIDB4MUYyMiwgMHg4RUEyLCAweEI3QTEsIDB4QjdGRSwgMHgxRjgwLAotICAgIDB4OEVBMiwgMHhCOEExLCAweEI4RkUsIDB4MUZERSwgMHg4RUEyLCAweEI5QTEsIDB4QjlGRSwgMHgyMDNDLAotICAgIDB4OEVBMiwgMHhCQUExLCAweEJBRkUsIDB4MjA5QSwgMHg4RUEyLCAweEJCQTEsIDB4QkJGRSwgMHgyMEY4LAotICAgIDB4OEVBMiwgMHhCQ0ExLCAweEJDRkUsIDB4MjE1NiwgMHg4RUEyLCAweEJEQTEsIDB4QkRGRSwgMHgyMUI0LAotICAgIDB4OEVBMiwgMHhCRUExLCAweEJFRkUsIDB4MjIxMiwgMHg4RUEyLCAweEJGQTEsIDB4QkZGRSwgMHgyMjcwLAotICAgIDB4OEVBMiwgMHhDMEExLCAweEMwRkUsIDB4MjJDRSwgMHg4RUEyLCAweEMxQTEsIDB4QzFGRSwgMHgyMzJDLAotICAgIDB4OEVBMiwgMHhDMkExLCAweEMyRkUsIDB4MjM4QSwgMHg4RUEyLCAweEMzQTEsIDB4QzNGRSwgMHgyM0U4LAotICAgIDB4OEVBMiwgMHhDNEExLCAweEM0RkUsIDB4MjQ0NiwgMHg4RUEyLCAweEM1QTEsIDB4QzVGRSwgMHgyNEE0LAotICAgIDB4OEVBMiwgMHhDNkExLCAweEM2RkUsIDB4MjUwMiwgMHg4RUEyLCAweEM3QTEsIDB4QzdGRSwgMHgyNTYwLAotICAgIDB4OEVBMiwgMHhDOEExLCAweEM4RkUsIDB4MjVCRSwgMHg4RUEyLCAweEM5QTEsIDB4QzlGRSwgMHgyNjFDLAotICAgIDB4OEVBMiwgMHhDQUExLCAweENBRkUsIDB4MjY3QSwgMHg4RUEyLCAweENCQTEsIDB4Q0JGRSwgMHgyNkQ4LAotICAgIDB4OEVBMiwgMHhDQ0ExLCAweENDRkUsIDB4MjczNiwgMHg4RUEyLCAweENEQTEsIDB4Q0RGRSwgMHgyNzk0LAotICAgIDB4OEVBMiwgMHhDRUExLCAweENFRkUsIDB4MjdGMiwgMHg4RUEyLCAweENGQTEsIDB4Q0ZGRSwgMHgyODUwLAotICAgIDB4OEVBMiwgMHhEMEExLCAweEQwRkUsIDB4MjhBRSwgMHg4RUEyLCAweEQxQTEsIDB4RDFGRSwgMHgyOTBDLAotICAgIDB4OEVBMiwgMHhEMkExLCAweEQyRkUsIDB4Mjk2QSwgMHg4RUEyLCAweEQzQTEsIDB4RDNGRSwgMHgyOUM4LAotICAgIDB4OEVBMiwgMHhENEExLCAweEQ0RkUsIDB4MkEyNiwgMHg4RUEyLCAweEQ1QTEsIDB4RDVGRSwgMHgyQTg0LAotICAgIDB4OEVBMiwgMHhENkExLCAweEQ2RkUsIDB4MkFFMiwgMHg4RUEyLCAweEQ3QTEsIDB4RDdGRSwgMHgyQjQwLAotICAgIDB4OEVBMiwgMHhEOEExLCAweEQ4RkUsIDB4MkI5RSwgMHg4RUEyLCAweEQ5QTEsIDB4RDlGRSwgMHgyQkZDLAotICAgIDB4OEVBMiwgMHhEQUExLCAweERBRkUsIDB4MkM1QSwgMHg4RUEyLCAweERCQTEsIDB4REJGRSwgMHgyQ0I4LAotICAgIDB4OEVBMiwgMHhEQ0ExLCAweERDRkUsIDB4MkQxNiwgMHg4RUEyLCAweEREQTEsIDB4RERGRSwgMHgyRDc0LAotICAgIDB4OEVBMiwgMHhERUExLCAweERFRkUsIDB4MkREMiwgMHg4RUEyLCAweERGQTEsIDB4REZGRSwgMHgyRTMwLAotICAgIDB4OEVBMiwgMHhFMEExLCAweEUwRkUsIDB4MkU4RSwgMHg4RUEyLCAweEUxQTEsIDB4RTFGRSwgMHgyRUVDLAotICAgIDB4OEVBMiwgMHhFMkExLCAweEUyRkUsIDB4MkY0QSwgMHg4RUEyLCAweEUzQTEsIDB4RTNGRSwgMHgyRkE4LAotICAgIDB4OEVBMiwgMHhFNEExLCAweEU0RkUsIDB4MzAwNiwgMHg4RUEyLCAweEU1QTEsIDB4RTVGRSwgMHgzMDY0LAotICAgIDB4OEVBMiwgMHhFNkExLCAweEU2RkUsIDB4MzBDMiwgMHg4RUEyLCAweEU3QTEsIDB4RTdGRSwgMHgzMTIwLAotICAgIDB4OEVBMiwgMHhFOEExLCAweEU4RkUsIDB4MzE3RSwgMHg4RUEyLCAweEU5QTEsIDB4RTlGRSwgMHgzMURDLAotICAgIDB4OEVBMiwgMHhFQUExLCAweEVBRkUsIDB4MzIzQSwgMHg4RUEyLCAweEVCQTEsIDB4RUJGRSwgMHgzMjk4LAotICAgIDB4OEVBMiwgMHhFQ0ExLCAweEVDRkUsIDB4MzJGNiwgMHg4RUEyLCAweEVEQTEsIDB4RURGRSwgMHgzMzU0LAotICAgIDB4OEVBMiwgMHhFRUExLCAweEVFRkUsIDB4MzNCMiwgMHg4RUEyLCAweEVGQTEsIDB4RUZGRSwgMHgzNDEwLAotICAgIDB4OEVBMiwgMHhGMEExLCAweEYwRkUsIDB4MzQ2RSwgMHg4RUEyLCAweEYxQTEsIDB4RjFGRSwgMHgzNENDLAotICAgIDB4OEVBMiwgMHhGMkExLCAweEYyQzQsIDB4MzUyQSwKKyAgICAweDhFQTEsIDB4QTFBMSwgMHhBMUFCLCAweDAwNjMsIDB4OEVBMSwgMHhBMUFDLCAweEExQUMsIDB4MzU0RSwgMHg4RUExLAorICAgIDB4QTFBRCwgMHhBMUJBLCAweDAwNkYsIDB4OEVBMSwgMHhBMUJCLCAweEExQkIsIDB4MDA3QywgMHg4RUExLCAweEExQkMsCisgICAgMHhBMUJDLCAweDAwN0UsIDB4OEVBMSwgMHhBMUJELCAweEExQkQsIDB4MDA3RSwgMHg4RUExLCAweEExQkUsIDB4QTFCRiwKKyAgICAweDAwODIsIDB4OEVBMSwgMHhBMUMwLCAweEExQzEsIDB4MDA4MiwgMHg4RUExLCAweEExQzIsIDB4QTFDMywgMHgwMDg2LAorICAgIDB4OEVBMSwgMHhBMUM0LCAweEExQzUsIDB4MDA4NiwgMHg4RUExLCAweEExQzYsIDB4QTFDNywgMHgwMDhBLCAweDhFQTEsCisgICAgMHhBMUM4LCAweEExQzksIDB4MDA4QSwgMHg4RUExLCAweEExQ0EsIDB4QTFDQiwgMHgwMDhFLCAweDhFQTEsIDB4QTFDQywKKyAgICAweEExQ0QsIDB4MDA4RSwgMHg4RUExLCAweEExQ0UsIDB4QTFDRiwgMHgwMDkyLCAweDhFQTEsIDB4QTFEMCwgMHhBMUQxLAorICAgIDB4MDA5MiwgMHg4RUExLCAweEExRDIsIDB4QTFEMywgMHgwMDk2LCAweDhFQTEsIDB4QTFENCwgMHhBMUQ1LCAweDAwOTYsCisgICAgMHg4RUExLCAweEExRDYsIDB4QTFENywgMHgwMDlBLCAweDhFQTEsIDB4QTFEOCwgMHhBMUQ5LCAweDAwOUEsIDB4OEVBMSwKKyAgICAweEExREEsIDB4QTFEQiwgMHgwMDlFLCAweDhFQTEsIDB4QTFEQywgMHhBMUZFLCAweDAwOUUsIDB4OEVBMSwgMHhBMkExLAorICAgIDB4QTJDMywgMHgwMEMxLCAweDhFQTEsIDB4QTJDNCwgMHhBMkM0LCAweDM1NEYsIDB4OEVBMSwgMHhBMkM1LCAweEEyRkUsCisgICAgMHgwMEU1LCAweDhFQTEsIDB4QTNBMSwgMHhBM0NFLCAweDAxMUYsIDB4OEVBMSwgMHhBNEExLCAweEE0RkUsIDB4MDE0RCwKKyAgICAweDhFQTEsIDB4QTVBMSwgMHhBNUVDLCAweDAxQUIsIDB4OEVBMSwgMHhBNUVFLCAweEE1RjAsIDB4MDFGNywgMHg4RUExLAorICAgIDB4QTZBMSwgMHhBNkJFLCAweDAxRkEsIDB4OEVBMSwgMHhBN0ExLCAweEE3QTEsIDB4MDI1MywgMHg4RUExLCAweEE3QTIsCisgICAgMHhBN0E0LCAweDAyMTgsIDB4OEVBMSwgMHhBN0E1LCAweEE3QTUsIDB4MDI1NCwgMHg4RUExLCAweEE3QTYsIDB4QTdBNiwKKyAgICAweDAyMUIsIDB4OEVBMSwgMHhBN0E3LCAweEE3QTcsIDB4MDI1QSwgMHg4RUExLCAweEE3QTgsIDB4QTdBOCwgMHgwMjFDLAorICAgIDB4OEVBMSwgMHhBN0E5LCAweEE3QUMsIDB4MDI1QiwgMHg4RUExLCAweEE3QUQsIDB4QTdBRiwgMHgwMjFELCAweDhFQTEsCisgICAgMHhBN0IwLCAweEE3QjAsIDB4MDI1RiwgMHg4RUExLCAweEE3QjEsIDB4QTdCMSwgMHgxNzZFLCAweDhFQTEsIDB4QTdCMiwKKyAgICAweEE3QjIsIDB4MDI2MCwgMHg4RUExLCAweEE3QjMsIDB4QTdCMywgMHgwMjYyLCAweDhFQTEsIDB4QTdCNCwgMHhBN0I0LAorICAgIDB4MDIyMCwgMHg4RUExLCAweEE3QjUsIDB4QTdCNSwgMHgwMjYzLCAweDhFQTEsIDB4QTdCNiwgMHhBN0I2LCAweDE3NkYsCisgICAgMHg4RUExLCAweEE3QjcsIDB4QTdCNywgMHgwMjIxLCAweDhFQTEsIDB4QTdCOCwgMHhBN0I5LCAweDAyNjQsIDB4OEVBMSwKKyAgICAweEE3QkEsIDB4QTdCQSwgMHgwMjIyLCAweDhFQTEsIDB4QTdCQiwgMHhBN0JCLCAweDE3NzAsIDB4OEVBMSwgMHhBN0JDLAorICAgIDB4QTdCQywgMHgwMjIzLCAweDhFQTEsIDB4QTdCRCwgMHhBN0JELCAweDAyNjYsIDB4OEVBMSwgMHhBN0JFLCAweEE3QkUsCisgICAgMHgwMjc5LCAweDhFQTEsIDB4QTdCRiwgMHhBN0JGLCAweDE3NzUsIDB4OEVBMSwgMHhBN0MwLCAweEE3QzEsIDB4MDI3QSwKKyAgICAweDhFQTEsIDB4QTdDMiwgMHhBN0MyLCAweDAyMjQsIDB4OEVBMSwgMHhBN0MzLCAweEE3QzYsIDB4MDI3QywgMHg4RUExLAorICAgIDB4QTdDNywgMHhBN0M3LCAweDAyMjUsIDB4OEVBMSwgMHhBN0M4LCAweEE3Q0IsIDB4MDI4MiwgMHg4RUExLCAweEE3Q0MsCisgICAgMHhBN0NDLCAweDE3NzYsIDB4OEVBMSwgMHhBN0NELCAweEE3Q0QsIDB4MDI4NiwgMHg4RUExLCAweEE3Q0UsIDB4QTdDRSwKKyAgICAweDAyMjYsIDB4OEVBMSwgMHhBN0NGLCAweEE3RDAsIDB4MDI4OCwgMHg4RUExLCAweEE3RDEsIDB4QTdEMiwgMHgwMjhDLAorICAgIDB4OEVBMSwgMHhBN0QzLCAweEE3RDUsIDB4MDIyNywgMHg4RUExLCAweEE3RDYsIDB4QTdEOCwgMHgwMjhFLCAweDhFQTEsCisgICAgMHhBN0Q5LCAweEE3REEsIDB4MDIyQSwgMHg4RUExLCAweEE3REIsIDB4QTdEQiwgMHgxNzc3LCAweDhFQTEsIDB4QTdEQywKKyAgICAweEE3REYsIDB4MDJEMCwgMHg4RUExLCAweEE3RTAsIDB4QTdFMCwgMHgwMkQ1LCAweDhFQTEsIDB4QTdFMSwgMHhBN0UxLAorICAgIDB4MDIyQywgMHg4RUExLCAweEE3RTIsIDB4QTdFNSwgMHgwMkQ2LCAweDhFQTEsIDB4QTdFNiwgMHhBN0U2LCAweDAyMkQsCisgICAgMHg4RUExLCAweEE3RTcsIDB4QTdFRCwgMHgwMkRBLCAweDhFQTEsIDB4QTdFRSwgMHhBN0VFLCAweDE3OEEsIDB4OEVBMSwKKyAgICAweEE3RUYsIDB4QTdGMiwgMHgwMkUxLCAweDhFQTEsIDB4QTdGMywgMHhBN0YzLCAweDE3OEMsIDB4OEVBMSwgMHhBN0Y0LAorICAgIDB4QTdGOCwgMHgwMkU1LCAweDhFQTEsIDB4QTdGOSwgMHhBN0Y5LCAweDE3OEQsIDB4OEVBMSwgMHhBN0ZBLCAweEE3RkQsCisgICAgMHgwMkVBLCAweDhFQTEsIDB4QTdGRSwgMHhBN0ZFLCAweDAzNTYsIDB4OEVBMSwgMHhBOEExLCAweEE4QTYsIDB4MDM1NywKKyAgICAweDhFQTEsIDB4QThBNywgMHhBOEE3LCAweDAzNUUsIDB4OEVBMSwgMHhBOEE4LCAweEE4QTgsIDB4MDM2MiwgMHg4RUExLAorICAgIDB4QThBOSwgMHhBOEFBLCAweDAyMkUsIDB4OEVBMSwgMHhBOEFCLCAweEE4QjIsIDB4MDM2MywgMHg4RUExLCAweEE4QjMsCisgICAgMHhBOEIzLCAweDE3QjIsIDB4OEVBMSwgMHhBOEI0LCAweEE4QjYsIDB4MDM2QiwgMHg4RUExLCAweEE4QjcsIDB4QThCQSwKKyAgICAweDAzRjYsIDB4OEVBMSwgMHhBOEJCLCAweEE4QkIsIDB4MTgxMiwgMHg4RUExLCAweEE4QkMsIDB4QThCRSwgMHgwM0ZBLAorICAgIDB4OEVBMSwgMHhBOEJGLCAweEE4QzMsIDB4MDNGRSwgMHg4RUExLCAweEE4QzQsIDB4QThDQywgMHgwNDA1LCAweDhFQTEsCisgICAgMHhBOENELCAweEE4Q0QsIDB4MTgxMywgMHg4RUExLCAweEE4Q0UsIDB4QThDRSwgMHgxODE4LCAweDhFQTEsIDB4QThDRiwKKyAgICAweEE4RDIsIDB4MDQwRiwgMHg4RUExLCAweEE4RDMsIDB4QThEMywgMHgxODE5LCAweDhFQTEsIDB4QThENCwgMHhBOEQ5LAorICAgIDB4MDUwOCwgMHg4RUExLCAweEE4REEsIDB4QThEQSwgMHgxOEU3LCAweDhFQTEsIDB4QThEQiwgMHhBOEUyLCAweDA1MEUsCisgICAgMHg4RUExLCAweEE4RTMsIDB4QThFMywgMHgwMjMwLCAweDhFQTEsIDB4QThFNCwgMHhBOEU0LCAweDA1MUIsIDB4OEVBMSwKKyAgICAweEE4RTUsIDB4QThFNywgMHgwNTIwLCAweDhFQTEsIDB4QThFOCwgMHhBOEVCLCAweDA2OTYsIDB4OEVBMSwgMHhBOEVDLAorICAgIDB4QThFQywgMHgwMjMxLCAweDhFQTEsIDB4QThFRCwgMHhBOEYwLCAweDA2OUYsIDB4OEVBMSwgMHhBOEYxLCAweEE4RkIsCisgICAgMHgwODI2LCAweDhFQTEsIDB4QThGQywgMHhBOEZFLCAweDA5RjUsIDB4OEVBMSwgMHhBOUExLCAweEE5QTEsIDB4MUUzMywKKyAgICAweDhFQTEsIDB4QTlBMiwgMHhBOUEyLCAweDA5RjgsIDB4OEVBMSwgMHhBOUEzLCAweEE5QTMsIDB4MUUzNCwgMHg4RUExLAorICAgIDB4QTlBNCwgMHhBOUE1LCAweDA5RjksIDB4OEVBMSwgMHhBOUE2LCAweEE5QUIsIDB4MEJFMSwgMHg4RUExLCAweEE5QUMsCisgICAgMHhBOUFFLCAweDBEQkIsIDB4OEVBMSwgMHhBOUFGLCAweEE5QUYsIDB4MjM2MCwgMHg4RUExLCAweEE5QjAsIDB4QTlCMCwKKyAgICAweDI2MTIsIDB4OEVBMSwgMHhBOUIxLCAweEE5QjMsIDB4MEY3QiwgMHg4RUExLCAweEE5QjQsIDB4QTlCNSwgMHgxMTAwLAorICAgIDB4OEVBMSwgMHhBOUI2LCAweEE5QjYsIDB4MTI4OSwgMHg4RUExLCAweEE5QjcsIDB4QTlCOCwgMHgxM0IyLCAweDhFQTEsCisgICAgMHhBOUI5LCAweEE5QjksIDB4MkYwRCwgMHg4RUExLCAweEMyQTEsIDB4QzJDMSwgMHgwMjMyLCAweDhFQTEsIDB4QzRBMSwKKyAgICAweEM0RkUsIDB4MDI1MywgMHg4RUExLCAweEM1QTEsIDB4QzVGRSwgMHgwMkIxLCAweDhFQTEsIDB4QzZBMSwgMHhDNkZFLAorICAgIDB4MDMwRiwgMHg4RUExLCAweEM3QTEsIDB4QzdGRSwgMHgwMzZELCAweDhFQTEsIDB4QzhBMSwgMHhDOEZFLCAweDAzQ0IsCisgICAgMHg4RUExLCAweEM5QTEsIDB4QzlGRSwgMHgwNDI5LCAweDhFQTEsIDB4Q0FBMSwgMHhDQUZFLCAweDA0ODcsIDB4OEVBMSwKKyAgICAweENCQTEsIDB4Q0JGRSwgMHgwNEU1LCAweDhFQTEsIDB4Q0NBMSwgMHhDQ0ZFLCAweDA1NDMsIDB4OEVBMSwgMHhDREExLAorICAgIDB4Q0RGRSwgMHgwNUExLCAweDhFQTEsIDB4Q0VBMSwgMHhDRUZFLCAweDA1RkYsIDB4OEVBMSwgMHhDRkExLCAweENGRkUsCisgICAgMHgwNjVELCAweDhFQTEsIDB4RDBBMSwgMHhEMEZFLCAweDA2QkIsIDB4OEVBMSwgMHhEMUExLCAweEQxRkUsIDB4MDcxOSwKKyAgICAweDhFQTEsIDB4RDJBMSwgMHhEMkZFLCAweDA3NzcsIDB4OEVBMSwgMHhEM0ExLCAweEQzRkUsIDB4MDdENSwgMHg4RUExLAorICAgIDB4RDRBMSwgMHhENEZFLCAweDA4MzMsIDB4OEVBMSwgMHhENUExLCAweEQ1RkUsIDB4MDg5MSwgMHg4RUExLCAweEQ2QTEsCisgICAgMHhENkZFLCAweDA4RUYsIDB4OEVBMSwgMHhEN0ExLCAweEQ3RkUsIDB4MDk0RCwgMHg4RUExLCAweEQ4QTEsIDB4RDhGRSwKKyAgICAweDA5QUIsIDB4OEVBMSwgMHhEOUExLCAweEQ5RkUsIDB4MEEwOSwgMHg4RUExLCAweERBQTEsIDB4REFGRSwgMHgwQTY3LAorICAgIDB4OEVBMSwgMHhEQkExLCAweERCRkUsIDB4MEFDNSwgMHg4RUExLCAweERDQTEsIDB4RENGRSwgMHgwQjIzLCAweDhFQTEsCisgICAgMHhEREExLCAweERERkUsIDB4MEI4MSwgMHg4RUExLCAweERFQTEsIDB4REVGRSwgMHgwQkRGLCAweDhFQTEsIDB4REZBMSwKKyAgICAweERGRkUsIDB4MEMzRCwgMHg4RUExLCAweEUwQTEsIDB4RTBGRSwgMHgwQzlCLCAweDhFQTEsIDB4RTFBMSwgMHhFMUZFLAorICAgIDB4MENGOSwgMHg4RUExLCAweEUyQTEsIDB4RTJGRSwgMHgwRDU3LCAweDhFQTEsIDB4RTNBMSwgMHhFM0ZFLCAweDBEQjUsCisgICAgMHg4RUExLCAweEU0QTEsIDB4RTRGRSwgMHgwRTEzLCAweDhFQTEsIDB4RTVBMSwgMHhFNUZFLCAweDBFNzEsIDB4OEVBMSwKKyAgICAweEU2QTEsIDB4RTZGRSwgMHgwRUNGLCAweDhFQTEsIDB4RTdBMSwgMHhFN0ZFLCAweDBGMkQsIDB4OEVBMSwgMHhFOEExLAorICAgIDB4RThGRSwgMHgwRjhCLCAweDhFQTEsIDB4RTlBMSwgMHhFOUZFLCAweDBGRTksIDB4OEVBMSwgMHhFQUExLCAweEVBRkUsCisgICAgMHgxMDQ3LCAweDhFQTEsIDB4RUJBMSwgMHhFQkZFLCAweDEwQTUsIDB4OEVBMSwgMHhFQ0ExLCAweEVDRkUsIDB4MTEwMywKKyAgICAweDhFQTEsIDB4RURBMSwgMHhFREZFLCAweDExNjEsIDB4OEVBMSwgMHhFRUExLCAweEVFRkUsIDB4MTFCRiwgMHg4RUExLAorICAgIDB4RUZBMSwgMHhFRkZFLCAweDEyMUQsIDB4OEVBMSwgMHhGMEExLCAweEYwRkUsIDB4MTI3QiwgMHg4RUExLCAweEYxQTEsCisgICAgMHhGMUZFLCAweDEyRDksIDB4OEVBMSwgMHhGMkExLCAweEYyRkUsIDB4MTMzNywgMHg4RUExLCAweEYzQTEsIDB4RjNGRSwKKyAgICAweDEzOTUsIDB4OEVBMSwgMHhGNEExLCAweEY0RkUsIDB4MTNGMywgMHg4RUExLCAweEY1QTEsIDB4RjVGRSwgMHgxNDUxLAorICAgIDB4OEVBMSwgMHhGNkExLCAweEY2RkUsIDB4MTRBRiwgMHg4RUExLCAweEY3QTEsIDB4RjdGRSwgMHgxNTBELCAweDhFQTEsCisgICAgMHhGOEExLCAweEY4RkUsIDB4MTU2QiwgMHg4RUExLCAweEY5QTEsIDB4RjlGRSwgMHgxNUM5LCAweDhFQTEsIDB4RkFBMSwKKyAgICAweEZBRkUsIDB4MTYyNywgMHg4RUExLCAweEZCQTEsIDB4RkJGRSwgMHgxNjg1LCAweDhFQTEsIDB4RkNBMSwgMHhGQ0ZFLAorICAgIDB4MTZFMywgMHg4RUExLCAweEZEQTEsIDB4RkRDQiwgMHgxNzQxLCAweDhFQTIsIDB4QTFBMSwgMHhBMUZFLCAweDE3NkMsCisgICAgMHg4RUEyLCAweEEyQTEsIDB4QTJGRSwgMHgxN0NBLCAweDhFQTIsIDB4QTNBMSwgMHhBM0ZFLCAweDE4MjgsIDB4OEVBMiwKKyAgICAweEE0QTEsIDB4QTRGRSwgMHgxODg2LCAweDhFQTIsIDB4QTVBMSwgMHhBNUZFLCAweDE4RTQsIDB4OEVBMiwgMHhBNkExLAorICAgIDB4QTZGRSwgMHgxOTQyLCAweDhFQTIsIDB4QTdBMSwgMHhBN0ZFLCAweDE5QTAsIDB4OEVBMiwgMHhBOEExLCAweEE4RkUsCisgICAgMHgxOUZFLCAweDhFQTIsIDB4QTlBMSwgMHhBOUZFLCAweDFBNUMsIDB4OEVBMiwgMHhBQUExLCAweEFBRkUsIDB4MUFCQSwKKyAgICAweDhFQTIsIDB4QUJBMSwgMHhBQkZFLCAweDFCMTgsIDB4OEVBMiwgMHhBQ0ExLCAweEFDRkUsIDB4MUI3NiwgMHg4RUEyLAorICAgIDB4QURBMSwgMHhBREZFLCAweDFCRDQsIDB4OEVBMiwgMHhBRUExLCAweEFFRkUsIDB4MUMzMiwgMHg4RUEyLCAweEFGQTEsCisgICAgMHhBRkZFLCAweDFDOTAsIDB4OEVBMiwgMHhCMEExLCAweEIwRkUsIDB4MUNFRSwgMHg4RUEyLCAweEIxQTEsIDB4QjFGRSwKKyAgICAweDFENEMsIDB4OEVBMiwgMHhCMkExLCAweEIyRkUsIDB4MURBQSwgMHg4RUEyLCAweEIzQTEsIDB4QjNGRSwgMHgxRTA4LAorICAgIDB4OEVBMiwgMHhCNEExLCAweEI0RkUsIDB4MUU2NiwgMHg4RUEyLCAweEI1QTEsIDB4QjVGRSwgMHgxRUM0LCAweDhFQTIsCisgICAgMHhCNkExLCAweEI2RkUsIDB4MUYyMiwgMHg4RUEyLCAweEI3QTEsIDB4QjdGRSwgMHgxRjgwLCAweDhFQTIsIDB4QjhBMSwKKyAgICAweEI4RkUsIDB4MUZERSwgMHg4RUEyLCAweEI5QTEsIDB4QjlGRSwgMHgyMDNDLCAweDhFQTIsIDB4QkFBMSwgMHhCQUZFLAorICAgIDB4MjA5QSwgMHg4RUEyLCAweEJCQTEsIDB4QkJGRSwgMHgyMEY4LCAweDhFQTIsIDB4QkNBMSwgMHhCQ0ZFLCAweDIxNTYsCisgICAgMHg4RUEyLCAweEJEQTEsIDB4QkRGRSwgMHgyMUI0LCAweDhFQTIsIDB4QkVBMSwgMHhCRUZFLCAweDIyMTIsIDB4OEVBMiwKKyAgICAweEJGQTEsIDB4QkZGRSwgMHgyMjcwLCAweDhFQTIsIDB4QzBBMSwgMHhDMEZFLCAweDIyQ0UsIDB4OEVBMiwgMHhDMUExLAorICAgIDB4QzFGRSwgMHgyMzJDLCAweDhFQTIsIDB4QzJBMSwgMHhDMkZFLCAweDIzOEEsIDB4OEVBMiwgMHhDM0ExLCAweEMzRkUsCisgICAgMHgyM0U4LCAweDhFQTIsIDB4QzRBMSwgMHhDNEZFLCAweDI0NDYsIDB4OEVBMiwgMHhDNUExLCAweEM1RkUsIDB4MjRBNCwKKyAgICAweDhFQTIsIDB4QzZBMSwgMHhDNkZFLCAweDI1MDIsIDB4OEVBMiwgMHhDN0ExLCAweEM3RkUsIDB4MjU2MCwgMHg4RUEyLAorICAgIDB4QzhBMSwgMHhDOEZFLCAweDI1QkUsIDB4OEVBMiwgMHhDOUExLCAweEM5RkUsIDB4MjYxQywgMHg4RUEyLCAweENBQTEsCisgICAgMHhDQUZFLCAweDI2N0EsIDB4OEVBMiwgMHhDQkExLCAweENCRkUsIDB4MjZEOCwgMHg4RUEyLCAweENDQTEsIDB4Q0NGRSwKKyAgICAweDI3MzYsIDB4OEVBMiwgMHhDREExLCAweENERkUsIDB4Mjc5NCwgMHg4RUEyLCAweENFQTEsIDB4Q0VGRSwgMHgyN0YyLAorICAgIDB4OEVBMiwgMHhDRkExLCAweENGRkUsIDB4Mjg1MCwgMHg4RUEyLCAweEQwQTEsIDB4RDBGRSwgMHgyOEFFLCAweDhFQTIsCisgICAgMHhEMUExLCAweEQxRkUsIDB4MjkwQywgMHg4RUEyLCAweEQyQTEsIDB4RDJGRSwgMHgyOTZBLCAweDhFQTIsIDB4RDNBMSwKKyAgICAweEQzRkUsIDB4MjlDOCwgMHg4RUEyLCAweEQ0QTEsIDB4RDRGRSwgMHgyQTI2LCAweDhFQTIsIDB4RDVBMSwgMHhENUZFLAorICAgIDB4MkE4NCwgMHg4RUEyLCAweEQ2QTEsIDB4RDZGRSwgMHgyQUUyLCAweDhFQTIsIDB4RDdBMSwgMHhEN0ZFLCAweDJCNDAsCisgICAgMHg4RUEyLCAweEQ4QTEsIDB4RDhGRSwgMHgyQjlFLCAweDhFQTIsIDB4RDlBMSwgMHhEOUZFLCAweDJCRkMsIDB4OEVBMiwKKyAgICAweERBQTEsIDB4REFGRSwgMHgyQzVBLCAweDhFQTIsIDB4REJBMSwgMHhEQkZFLCAweDJDQjgsIDB4OEVBMiwgMHhEQ0ExLAorICAgIDB4RENGRSwgMHgyRDE2LCAweDhFQTIsIDB4RERBMSwgMHhEREZFLCAweDJENzQsIDB4OEVBMiwgMHhERUExLCAweERFRkUsCisgICAgMHgyREQyLCAweDhFQTIsIDB4REZBMSwgMHhERkZFLCAweDJFMzAsIDB4OEVBMiwgMHhFMEExLCAweEUwRkUsIDB4MkU4RSwKKyAgICAweDhFQTIsIDB4RTFBMSwgMHhFMUZFLCAweDJFRUMsIDB4OEVBMiwgMHhFMkExLCAweEUyRkUsIDB4MkY0QSwgMHg4RUEyLAorICAgIDB4RTNBMSwgMHhFM0ZFLCAweDJGQTgsIDB4OEVBMiwgMHhFNEExLCAweEU0RkUsIDB4MzAwNiwgMHg4RUEyLCAweEU1QTEsCisgICAgMHhFNUZFLCAweDMwNjQsIDB4OEVBMiwgMHhFNkExLCAweEU2RkUsIDB4MzBDMiwgMHg4RUEyLCAweEU3QTEsIDB4RTdGRSwKKyAgICAweDMxMjAsIDB4OEVBMiwgMHhFOEExLCAweEU4RkUsIDB4MzE3RSwgMHg4RUEyLCAweEU5QTEsIDB4RTlGRSwgMHgzMURDLAorICAgIDB4OEVBMiwgMHhFQUExLCAweEVBRkUsIDB4MzIzQSwgMHg4RUEyLCAweEVCQTEsIDB4RUJGRSwgMHgzMjk4LCAweDhFQTIsCisgICAgMHhFQ0ExLCAweEVDRkUsIDB4MzJGNiwgMHg4RUEyLCAweEVEQTEsIDB4RURGRSwgMHgzMzU0LCAweDhFQTIsIDB4RUVBMSwKKyAgICAweEVFRkUsIDB4MzNCMiwgMHg4RUEyLCAweEVGQTEsIDB4RUZGRSwgMHgzNDEwLCAweDhFQTIsIDB4RjBBMSwgMHhGMEZFLAorICAgIDB4MzQ2RSwgMHg4RUEyLCAweEYxQTEsIDB4RjFGRSwgMHgzNENDLCAweDhFQTIsIDB4RjJBMSwgMHhGMkM0LCAweDM1MkEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvRVRlbi1CNS1WXzAuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvRVRlbi1CNS1WXzAuY3BwCmluZGV4IGViMWYxOWMuLmYwOThiMTggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0VUZW4tQjUtVl8wLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVuLUI1LVZfMC5jcHAKQEAgLTcsOSArNyw5IEBACiAjaW5jbHVkZSAiY21hcHNfY25zMS5oIgogCiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0VUZW5fQjVfVl8wWzEzICogM10gPSB7Ci0gICAgMHhBMTRCLCAweEExNEIsIDB4MzU0RSwgMHhBMTVBLCAweEExNUEsIDB4MzVBRiwgMHhBMTVDLCAweEExNUMsIDB4MzVCMSwKLSAgICAweEExNUQsIDB4QTE1RSwgMHgwMDgyLCAweEExNjEsIDB4QTE2MiwgMHgwMDg2LCAweEExNjUsIDB4QTE2NiwgMHgwMDhBLAotICAgIDB4QTE2OSwgMHhBMTZBLCAweDAwOEUsIDB4QTE2RCwgMHhBMTZFLCAweDAwOTIsIDB4QTE3MSwgMHhBMTcyLCAweDAwOTYsCi0gICAgMHhBMTc1LCAweEExNzYsIDB4MDA5QSwgMHhBMTc5LCAweEExN0EsIDB4MDA5RSwgMHhBMUUzLCAweEExRTMsIDB4MzU0RiwKLSAgICAweEM2RTQsIDB4QzZFNSwgMHgzNzExLAorICAgIDB4QTE0QiwgMHhBMTRCLCAweDM1NEUsIDB4QTE1QSwgMHhBMTVBLCAweDM1QUYsIDB4QTE1QywgMHhBMTVDLAorICAgIDB4MzVCMSwgMHhBMTVELCAweEExNUUsIDB4MDA4MiwgMHhBMTYxLCAweEExNjIsIDB4MDA4NiwgMHhBMTY1LAorICAgIDB4QTE2NiwgMHgwMDhBLCAweEExNjksIDB4QTE2QSwgMHgwMDhFLCAweEExNkQsIDB4QTE2RSwgMHgwMDkyLAorICAgIDB4QTE3MSwgMHhBMTcyLCAweDAwOTYsIDB4QTE3NSwgMHhBMTc2LCAweDAwOUEsIDB4QTE3OSwgMHhBMTdBLAorICAgIDB4MDA5RSwgMHhBMUUzLCAweEExRTMsIDB4MzU0RiwgMHhDNkU0LCAweEM2RTUsIDB4MzcxMSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9IS3Njcy1CNS1WXzUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvSEtzY3MtQjUtVl81LmNwcAppbmRleCBjNmZmZTcxLi40ZGJjYzM4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9IS3Njcy1CNS1WXzUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0hLc2NzLUI1LVZfNS5jcHAKQEAgLTcsOSArNyw5IEBACiAjaW5jbHVkZSAiY21hcHNfY25zMS5oIgogCiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0hLc2NzX0I1X1ZfNVsxMyAqIDNdID0gewotICAgIDB4QTE0QiwgMHhBMTRCLCAweDM1NEUsIDB4QTE1QSwgMHhBMTVBLCAweDM1QUYsIDB4QTE1QywgMHhBMTVDLCAweDM1QjEsCi0gICAgMHhBMTVELCAweEExNUUsIDB4MDA4MiwgMHhBMTYxLCAweEExNjIsIDB4MDA4NiwgMHhBMTY1LCAweEExNjYsIDB4MDA4QSwKLSAgICAweEExNjksIDB4QTE2QSwgMHgwMDhFLCAweEExNkQsIDB4QTE2RSwgMHgwMDkyLCAweEExNzEsIDB4QTE3MiwgMHgwMDk2LAotICAgIDB4QTE3NSwgMHhBMTc2LCAweDAwOUEsIDB4QTE3OSwgMHhBMTdBLCAweDAwOUUsIDB4QTFFMywgMHhBMUUzLCAweDM1NEYsCi0gICAgMHhDNkU0LCAweEM2RTUsIDB4MzcxMSwKKyAgICAweEExNEIsIDB4QTE0QiwgMHgzNTRFLCAweEExNUEsIDB4QTE1QSwgMHgzNUFGLCAweEExNUMsIDB4QTE1QywKKyAgICAweDM1QjEsIDB4QTE1RCwgMHhBMTVFLCAweDAwODIsIDB4QTE2MSwgMHhBMTYyLCAweDAwODYsIDB4QTE2NSwKKyAgICAweEExNjYsIDB4MDA4QSwgMHhBMTY5LCAweEExNkEsIDB4MDA4RSwgMHhBMTZELCAweEExNkUsIDB4MDA5MiwKKyAgICAweEExNzEsIDB4QTE3MiwgMHgwMDk2LCAweEExNzUsIDB4QTE3NiwgMHgwMDlBLCAweEExNzksIDB4QTE3QSwKKyAgICAweDAwOUUsIDB4QTFFMywgMHhBMUUzLCAweDM1NEYsIDB4QzZFNCwgMHhDNkU1LCAweDM3MTEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVDUzItVl8zLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL1VuaUNOUy1VQ1MyLVZfMy5jcHAKaW5kZXggZjQ1ZDA2NC4uMmVjNzg4ZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVDUzItVl8zLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9VbmlDTlMtVUNTMi1WXzMuY3BwCkBAIC03LDkgKzcsOSBAQAogI2luY2x1ZGUgImNtYXBzX2NuczEuaCIKIAogY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlDTlNfVUNTMl9WXzNbMTMgKiAzXSA9IHsKLSAgICAweDIwMTMsIDB4MjAxMywgMHgwMDc4LCAweDIwMTQsIDB4MjAxNCwgMHgwMDdBLCAweDIwMjUsIDB4MjAyNSwgMHgwMDZELAotICAgIDB4MzAwOCwgMHgzMDA5LCAweDAwOTYsIDB4MzAwQSwgMHgzMDBCLCAweDAwOTIsIDB4MzAwQywgMHgzMDBELCAweDAwOUEsCi0gICAgMHgzMDBFLCAweDMwMEYsIDB4MDA5RSwgMHgzMDEwLCAweDMwMTEsIDB4MDA4RSwgMHgzMDE0LCAweDMwMTUsIDB4MDA4QSwKLSAgICAweEZFNEYsIDB4RkU0RiwgMHgzNUIxLCAweEZGMDgsIDB4RkYwOSwgMHgwMDgyLCAweEZGNUIsIDB4RkY1QiwgMHgwMDg2LAotICAgIDB4RkY1RCwgMHhGRjVELCAweDAwODcsCisgICAgMHgyMDEzLCAweDIwMTMsIDB4MDA3OCwgMHgyMDE0LCAweDIwMTQsIDB4MDA3QSwgMHgyMDI1LCAweDIwMjUsCisgICAgMHgwMDZELCAweDMwMDgsIDB4MzAwOSwgMHgwMDk2LCAweDMwMEEsIDB4MzAwQiwgMHgwMDkyLCAweDMwMEMsCisgICAgMHgzMDBELCAweDAwOUEsIDB4MzAwRSwgMHgzMDBGLCAweDAwOUUsIDB4MzAxMCwgMHgzMDExLCAweDAwOEUsCisgICAgMHgzMDE0LCAweDMwMTUsIDB4MDA4QSwgMHhGRTRGLCAweEZFNEYsIDB4MzVCMSwgMHhGRjA4LCAweEZGMDksCisgICAgMHgwMDgyLCAweEZGNUIsIDB4RkY1QiwgMHgwMDg2LCAweEZGNUQsIDB4RkY1RCwgMHgwMDg3LAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL1VuaUNOUy1VVEYxNi1IXzAuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVURjE2LUhfMC5jcHAKaW5kZXggODZiYTdkYy4uZjRmZjhkNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVURjE2LUhfMC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVURjE2LUhfMC5jcHAKQEAgLTcsMzY0NiArNywzMjQxIEBACiAjaW5jbHVkZSAiY21hcHNfY25zMS5oIgogCiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUNOU19VVEYxNl9IXzBbMTQ1NTcgKiAyXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwMSwgMHgwMDIxLCAweDAwMDIsIDB4MDAyMiwgMHgwMDAzLCAweDAwMjMsIDB4MDAwNCwKLSAgICAweDAwMjQsIDB4MDAwNSwgMHgwMDI1LCAweDAwMDYsIDB4MDAyNiwgMHgwMDA3LCAweDAwMjcsIDB4MDAwOCwKLSAgICAweDAwMjgsIDB4MDAwOSwgMHgwMDI5LCAweDAwMEEsIDB4MDAyQSwgMHgwMDBCLCAweDAwMkIsIDB4MDAwQywKLSAgICAweDAwMkMsIDB4MDAwRCwgMHgwMDJELCAweDAwMEUsIDB4MDAyRSwgMHgwMDBGLCAweDAwMkYsIDB4MDAxMCwKLSAgICAweDAwMzAsIDB4MDAxMSwgMHgwMDMxLCAweDAwMTIsIDB4MDAzMiwgMHgwMDEzLCAweDAwMzMsIDB4MDAxNCwKLSAgICAweDAwMzQsIDB4MDAxNSwgMHgwMDM1LCAweDAwMTYsIDB4MDAzNiwgMHgwMDE3LCAweDAwMzcsIDB4MDAxOCwKLSAgICAweDAwMzgsIDB4MDAxOSwgMHgwMDM5LCAweDAwMUEsIDB4MDAzQSwgMHgwMDFCLCAweDAwM0IsIDB4MDAxQywKLSAgICAweDAwM0MsIDB4MDAxRCwgMHgwMDNELCAweDAwMUUsIDB4MDAzRSwgMHgwMDFGLCAweDAwM0YsIDB4MDAyMCwKLSAgICAweDAwNDAsIDB4MDAyMSwgMHgwMDQxLCAweDAwMjIsIDB4MDA0MiwgMHgwMDIzLCAweDAwNDMsIDB4MDAyNCwKLSAgICAweDAwNDQsIDB4MDAyNSwgMHgwMDQ1LCAweDAwMjYsIDB4MDA0NiwgMHgwMDI3LCAweDAwNDcsIDB4MDAyOCwKLSAgICAweDAwNDgsIDB4MDAyOSwgMHgwMDQ5LCAweDAwMkEsIDB4MDA0QSwgMHgwMDJCLCAweDAwNEIsIDB4MDAyQywKLSAgICAweDAwNEMsIDB4MDAyRCwgMHgwMDRELCAweDAwMkUsIDB4MDA0RSwgMHgwMDJGLCAweDAwNEYsIDB4MDAzMCwKLSAgICAweDAwNTAsIDB4MDAzMSwgMHgwMDUxLCAweDAwMzIsIDB4MDA1MiwgMHgwMDMzLCAweDAwNTMsIDB4MDAzNCwKLSAgICAweDAwNTQsIDB4MDAzNSwgMHgwMDU1LCAweDAwMzYsIDB4MDA1NiwgMHgwMDM3LCAweDAwNTcsIDB4MDAzOCwKLSAgICAweDAwNTgsIDB4MDAzOSwgMHgwMDU5LCAweDAwM0EsIDB4MDA1QSwgMHgwMDNCLCAweDAwNUIsIDB4MDAzQywKLSAgICAweDAwNUMsIDB4MDAzRCwgMHgwMDVELCAweDAwM0UsIDB4MDA1RSwgMHgwMDNGLCAweDAwNUYsIDB4MDA0MCwKLSAgICAweDAwNjAsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDIsIDB4MDA2MiwgMHgwMDQzLCAweDAwNjMsIDB4MDA0NCwKLSAgICAweDAwNjQsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDYsIDB4MDA2NiwgMHgwMDQ3LCAweDAwNjcsIDB4MDA0OCwKLSAgICAweDAwNjgsIDB4MDA0OSwgMHgwMDY5LCAweDAwNEEsIDB4MDA2QSwgMHgwMDRCLCAweDAwNkIsIDB4MDA0QywKLSAgICAweDAwNkMsIDB4MDA0RCwgMHgwMDZELCAweDAwNEUsIDB4MDA2RSwgMHgwMDRGLCAweDAwNkYsIDB4MDA1MCwKLSAgICAweDAwNzAsIDB4MDA1MSwgMHgwMDcxLCAweDAwNTIsIDB4MDA3MiwgMHgwMDUzLCAweDAwNzMsIDB4MDA1NCwKLSAgICAweDAwNzQsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTYsIDB4MDA3NiwgMHgwMDU3LCAweDAwNzcsIDB4MDA1OCwKLSAgICAweDAwNzgsIDB4MDA1OSwgMHgwMDc5LCAweDAwNUEsIDB4MDA3QSwgMHgwMDVCLCAweDAwN0IsIDB4MDA1QywKLSAgICAweDAwN0MsIDB4MDA1RCwgMHgwMDdELCAweDAwNUUsIDB4MDA3RSwgMHgwMDVGLCAweDAwQTIsIDB4MDEwNiwKLSAgICAweDAwQTMsIDB4MDEwNywgMHgwMEE1LCAweDAxMDQsIDB4MDBBNywgMHgwMEIyLCAweDAwQTgsIDB4MzVCMywKLSAgICAweDAwQUMsIDB4MzZFMSwgMHgwMEFGLCAweDAwQzMsIDB4MDBCMCwgMHgwMTE4LCAweDAwQjEsIDB4MDBENCwKLSAgICAweDAwQjcsIDB4MDA3MywgMHgwMEQ3LCAweDAwRDIsIDB4MDBGNywgMHgwMEQzLCAweDAyQzYsIDB4MzVCNCwKLSAgICAweDAyQzcsIDB4MDFGOCwgMHgwMkNBLCAweDAxRjcsIDB4MDJDQiwgMHgwMUY5LCAweDAyQ0QsIDB4MDBDNiwKLSAgICAweDAyRDksIDB4MDFGNiwgMHgwMzA4LCAweDM1QjMsIDB4MDM5MSwgMHgwMUExLCAweDAzOTIsIDB4MDFBMiwKLSAgICAweDAzOTMsIDB4MDFBMywgMHgwMzk0LCAweDAxQTQsIDB4MDM5NSwgMHgwMUE1LCAweDAzOTYsIDB4MDFBNiwKLSAgICAweDAzOTcsIDB4MDFBNywgMHgwMzk4LCAweDAxQTgsIDB4MDM5OSwgMHgwMUE5LCAweDAzOUEsIDB4MDFBQSwKLSAgICAweDAzOUIsIDB4MDFBQiwgMHgwMzlDLCAweDAxQUMsIDB4MDM5RCwgMHgwMUFELCAweDAzOUUsIDB4MDFBRSwKLSAgICAweDAzOUYsIDB4MDFBRiwgMHgwM0EwLCAweDAxQjAsIDB4MDNBMSwgMHgwMUIxLCAweDAzQTMsIDB4MDFCMiwKLSAgICAweDAzQTQsIDB4MDFCMywgMHgwM0E1LCAweDAxQjQsIDB4MDNBNiwgMHgwMUI1LCAweDAzQTcsIDB4MDFCNiwKLSAgICAweDAzQTgsIDB4MDFCNywgMHgwM0E5LCAweDAxQjgsIDB4MDNCMSwgMHgwMUI5LCAweDAzQjIsIDB4MDFCQSwKLSAgICAweDAzQjMsIDB4MDFCQiwgMHgwM0I0LCAweDAxQkMsIDB4MDNCNSwgMHgwMUJELCAweDAzQjYsIDB4MDFCRSwKLSAgICAweDAzQjcsIDB4MDFCRiwgMHgwM0I4LCAweDAxQzAsIDB4MDNCOSwgMHgwMUMxLCAweDAzQkEsIDB4MDFDMiwKLSAgICAweDAzQkIsIDB4MDFDMywgMHgwM0JDLCAweDAxQzQsIDB4MDNCRCwgMHgwMUM1LCAweDAzQkUsIDB4MDFDNiwKLSAgICAweDAzQkYsIDB4MDFDNywgMHgwM0MwLCAweDAxQzgsIDB4MDNDMSwgMHgwMUM5LCAweDAzQzMsIDB4MDFDQSwKLSAgICAweDAzQzQsIDB4MDFDQiwgMHgwM0M1LCAweDAxQ0MsIDB4MDNDNiwgMHgwMUNELCAweDAzQzcsIDB4MDFDRSwKLSAgICAweDAzQzgsIDB4MDFDRiwgMHgwM0M5LCAweDAxRDAsIDB4MDQwMSwgMHgzNjcwLCAweDA0MTAsIDB4MzY2QSwKLSAgICAweDA0MTEsIDB4MzY2QiwgMHgwNDEyLCAweDM2NkMsIDB4MDQxMywgMHgzNjZELCAweDA0MTQsIDB4MzY2RSwKLSAgICAweDA0MTUsIDB4MzY2RiwgMHgwNDE2LCAweDM2NzEsIDB4MDQxNywgMHgzNjcyLCAweDA0MTgsIDB4MzY3MywKLSAgICAweDA0MTksIDB4MzY3NCwgMHgwNDFBLCAweDM2NzUsIDB4MDQxQiwgMHgzNjc2LCAweDA0MUMsIDB4MzY3NywKLSAgICAweDA0MUQsIDB4MzY3OCwgMHgwNDFFLCAweDM2NzksIDB4MDQxRiwgMHgzNjdBLCAweDA0MjAsIDB4MzY3QiwKLSAgICAweDA0MjEsIDB4MzY3QywgMHgwNDIyLCAweDM2N0QsIDB4MDQyMywgMHgzNjdFLCAweDA0MjQsIDB4MzY3RiwKLSAgICAweDA0MjUsIDB4MzY4MCwgMHgwNDI2LCAweDM2ODEsIDB4MDQyNywgMHgzNjgyLCAweDA0MjgsIDB4MzY4MywKLSAgICAweDA0MjksIDB4MzY4NCwgMHgwNDJBLCAweDM2ODUsIDB4MDQyQiwgMHgzNjg2LCAweDA0MkMsIDB4MzY4NywKLSAgICAweDA0MkQsIDB4MzY4OCwgMHgwNDJFLCAweDM2ODksIDB4MDQyRiwgMHgzNjhBLCAweDA0MzAsIDB4MzY4QiwKLSAgICAweDA0MzEsIDB4MzY4QywgMHgwNDMyLCAweDM2OEQsIDB4MDQzMywgMHgzNjhFLCAweDA0MzQsIDB4MzY4RiwKLSAgICAweDA0MzUsIDB4MzY5MCwgMHgwNDM2LCAweDM2OTIsIDB4MDQzNywgMHgzNjkzLCAweDA0MzgsIDB4MzY5NCwKLSAgICAweDA0MzksIDB4MzY5NSwgMHgwNDNBLCAweDM2OTYsIDB4MDQzQiwgMHgzNjk3LCAweDA0M0MsIDB4MzY5OCwKLSAgICAweDA0M0QsIDB4MzY5OSwgMHgwNDNFLCAweDM2OUEsIDB4MDQzRiwgMHgzNjlCLCAweDA0NDAsIDB4MzY5QywKLSAgICAweDA0NDEsIDB4MzY5RCwgMHgwNDQyLCAweDM2OUUsIDB4MDQ0MywgMHgzNjlGLCAweDA0NDQsIDB4MzZBMCwKLSAgICAweDA0NDUsIDB4MzZBMSwgMHgwNDQ2LCAweDM2QTIsIDB4MDQ0NywgMHgzNkEzLCAweDA0NDgsIDB4MzZBNCwKLSAgICAweDA0NDksIDB4MzZBNSwgMHgwNDRBLCAweDM2QTYsIDB4MDQ0QiwgMHgzNkE3LCAweDA0NEMsIDB4MzZBOCwKLSAgICAweDA0NEQsIDB4MzZBOSwgMHgwNDRFLCAweDM2QUEsIDB4MDQ0RiwgMHgzNkFCLCAweDA0NTEsIDB4MzY5MSwKLSAgICAweDIwMTMsIDB4MDA3OSwgMHgyMDE0LCAweDAwN0IsIDB4MjAxOCwgMHgwMEE2LCAweDIwMTksIDB4MDBBNywKLSAgICAweDIwMUMsIDB4MDBBOCwgMHgyMDFELCAweDAwQTksIDB4MjAyMiwgMHgwMDY4LCAweDIwMjUsIDB4MDA2RiwKLSAgICAweDIwMjYsIDB4MDA2RSwgMHgyMDI3LCAweDAwNjgsIDB4MjAzMiwgMHgwMEFELCAweDIwMzUsIDB4MDBBQywKLSAgICAweDIwM0IsIDB4MDBCMSwgMHgyMDNFLCAweDAwQzMsIDB4MjEwMywgMHgwMTBBLCAweDIxMDUsIDB4MDBDMiwKLSAgICAweDIxMDksIDB4MDEwQiwgMHgyMTE2LCAweDM2RTYsIDB4MjEyMSwgMHgzNkU3LCAweDIxNjAsIDB4MDE1NywKLSAgICAweDIxNjEsIDB4MDE1OCwgMHgyMTYyLCAweDAxNTksIDB4MjE2MywgMHgwMTVBLCAweDIxNjQsIDB4MDE1QiwKLSAgICAweDIxNjUsIDB4MDE1QywgMHgyMTY2LCAweDAxNUQsIDB4MjE2NywgMHgwMTVFLCAweDIxNjgsIDB4MDE1RiwKLSAgICAweDIxNjksIDB4MDE2MCwgMHgyMTcwLCAweDAyMEUsIDB4MjE3MSwgMHgwMjBGLCAweDIxNzIsIDB4MDIxMCwKLSAgICAweDIxNzMsIDB4MDIxMSwgMHgyMTc0LCAweDAyMTIsIDB4MjE3NSwgMHgwMjEzLCAweDIxNzYsIDB4MDIxNCwKLSAgICAweDIxNzcsIDB4MDIxNSwgMHgyMTc4LCAweDAyMTYsIDB4MjE3OSwgMHgwMjE3LCAweDIxOTAsIDB4MDBGOCwKLSAgICAweDIxOTEsIDB4MDBGNSwgMHgyMTkyLCAweDAwRjcsIDB4MjE5MywgMHgwMEY2LCAweDIxOTYsIDB4MDBGOSwKLSAgICAweDIxOTcsIDB4MDBGQSwgMHgyMTk4LCAweDAwRkMsIDB4MjE5OSwgMHgwMEZCLCAweDIxQjgsIDB4MzZBRCwKLSAgICAweDIxQjksIDB4MzZBRSwgMHgyMUU3LCAweDM2QUMsIDB4MjIxNSwgMHgwMTAxLCAweDIyMUEsIDB4MDBENSwKLSAgICAweDIyMUUsIDB4MDBEQywgMHgyMjFGLCAweDAwRTksIDB4MjIyMCwgMHgwMEU4LCAweDIyMjMsIDB4MDBGRSwKLSAgICAweDIyMjUsIDB4MDBGRCwgMHgyMjI5LCAweDAwRTUsIDB4MjIyQSwgMHgwMEU2LCAweDIyMkIsIDB4MDBFRCwKLSAgICAweDIyMkUsIDB4MDBFRSwgMHgyMjM0LCAweDAwRjAsIDB4MjIzNSwgMHgwMEVGLCAweDIyM0MsIDB4MDBFNCwKLSAgICAweDIyNTIsIDB4MDBERCwgMHgyMjYwLCAweDAwREIsIDB4MjI2MSwgMHgwMERFLCAweDIyNjYsIDB4MDBEOSwKLSAgICAweDIyNjcsIDB4MDBEQSwgMHgyMjk1LCAweDAwRjMsIDB4MjI5OSwgMHgwMEY0LCAweDIyQTUsIDB4MDBFNywKLSAgICAweDIyQkYsIDB4MDBFQSwgMHgyMkVGLCAweDAwNkUsIDB4MjQwMCwgMHgwMjMyLCAweDI0MDEsIDB4MDIzMywKLSAgICAweDI0MDIsIDB4MDIzNCwgMHgyNDAzLCAweDAyMzUsIDB4MjQwNCwgMHgwMjM2LCAweDI0MDUsIDB4MDIzNywKLSAgICAweDI0MDYsIDB4MDIzOCwgMHgyNDA3LCAweDAyMzksIDB4MjQwOCwgMHgwMjNBLCAweDI0MDksIDB4MDIzQiwKLSAgICAweDI0MEEsIDB4MDIzQywgMHgyNDBCLCAweDAyM0QsIDB4MjQwQywgMHgwMjNFLCAweDI0MEQsIDB4MDIzRiwKLSAgICAweDI0MEUsIDB4MDI0MCwgMHgyNDBGLCAweDAyNDEsIDB4MjQxMCwgMHgwMjQyLCAweDI0MTEsIDB4MDI0MywKLSAgICAweDI0MTIsIDB4MDI0NCwgMHgyNDEzLCAweDAyNDUsIDB4MjQxNCwgMHgwMjQ2LCAweDI0MTUsIDB4MDI0NywKLSAgICAweDI0MTYsIDB4MDI0OCwgMHgyNDE3LCAweDAyNDksIDB4MjQxOCwgMHgwMjRBLCAweDI0MTksIDB4MDI0QiwKLSAgICAweDI0MUEsIDB4MDI0QywgMHgyNDFCLCAweDAyNEQsIDB4MjQxQywgMHgwMjRFLCAweDI0MUQsIDB4MDI0RiwKLSAgICAweDI0MUUsIDB4MDI1MCwgMHgyNDFGLCAweDAyNTEsIDB4MjQyMSwgMHgwMjUyLCAweDI0NjAsIDB4MDFGQSwKLSAgICAweDI0NjEsIDB4MDFGQiwgMHgyNDYyLCAweDAxRkMsIDB4MjQ2MywgMHgwMUZELCAweDI0NjQsIDB4MDFGRSwKLSAgICAweDI0NjUsIDB4MDFGRiwgMHgyNDY2LCAweDAyMDAsIDB4MjQ2NywgMHgwMjAxLCAweDI0NjgsIDB4MDIwMiwKLSAgICAweDI0NjksIDB4MDIwMywgMHgyNDc0LCAweDAyMDQsIDB4MjQ3NSwgMHgwMjA1LCAweDI0NzYsIDB4MDIwNiwKLSAgICAweDI0NzcsIDB4MDIwNywgMHgyNDc4LCAweDAyMDgsIDB4MjQ3OSwgMHgwMjA5LCAweDI0N0EsIDB4MDIwQSwKLSAgICAweDI0N0IsIDB4MDIwQiwgMHgyNDdDLCAweDAyMEMsIDB4MjQ3RCwgMHgwMjBELCAweDI1MDAsIDB4MDEzNywKLSAgICAweDI1MDIsIDB4MDEzOCwgMHgyNTBDLCAweDAxM0EsIDB4MjUxMCwgMHgwMTNCLCAweDI1MTQsIDB4MDEzQywKLSAgICAweDI1MTgsIDB4MDEzRCwgMHgyNTFDLCAweDAxMzUsIDB4MjUyNCwgMHgwMTM0LCAweDI1MkMsIDB4MDEzMywKLSAgICAweDI1MzQsIDB4MDEzMiwgMHgyNTNDLCAweDAxMzEsIDB4MjU1MCwgMHgwMTQyLCAweDI1NTEsIDB4MzcwQSwKLSAgICAweDI1NTIsIDB4MzZGOCwgMHgyNTUzLCAweDM3MDEsIDB4MjU1NCwgMHgzNkVGLCAweDI1NTUsIDB4MzZGQSwKLSAgICAweDI1NTYsIDB4MzcwMywgMHgyNTU3LCAweDM2RjEsIDB4MjU1OCwgMHgzNkZFLCAweDI1NTksIDB4MzcwNywKLSAgICAweDI1NUEsIDB4MzZGNSwgMHgyNTVCLCAweDM3MDAsIDB4MjU1QywgMHgzNzA5LCAweDI1NUQsIDB4MzZGNywKLSAgICAweDI1NUUsIDB4MDE0MywgMHgyNTVGLCAweDM3MDQsIDB4MjU2MCwgMHgzNkYyLCAweDI1NjEsIDB4MDE0NSwKLSAgICAweDI1NjIsIDB4MzcwNiwgMHgyNTYzLCAweDM2RjQsIDB4MjU2NCwgMHgzNkY5LCAweDI1NjUsIDB4MzcwMiwKLSAgICAweDI1NjYsIDB4MzZGMCwgMHgyNTY3LCAweDM2RkYsIDB4MjU2OCwgMHgzNzA4LCAweDI1NjksIDB4MzZGNiwKLSAgICAweDI1NkEsIDB4MDE0NCwgMHgyNTZCLCAweDM3MDUsIDB4MjU2QywgMHgzNkYzLCAweDI1NkQsIDB4MDEzRSwKLSAgICAweDI1NkUsIDB4MDEzRiwgMHgyNTZGLCAweDAxNDEsIDB4MjU3MCwgMHgwMTQwLCAweDI1NzEsIDB4MDE0QSwKLSAgICAweDI1NzIsIDB4MDE0QiwgMHgyNTczLCAweDAxNEMsIDB4MjU3NCwgMHgzNUIwLCAweDI1ODEsIDB4MDEyMiwKLSAgICAweDI1ODIsIDB4MDEyMywgMHgyNTgzLCAweDAxMjQsIDB4MjU4NCwgMHgwMTI1LCAweDI1ODUsIDB4MDEyNiwKLSAgICAweDI1ODYsIDB4MDEyNywgMHgyNTg3LCAweDAxMjgsIDB4MjU4OCwgMHgwMTI5LCAweDI1ODksIDB4MDEzMCwKLSAgICAweDI1OEEsIDB4MDEyRiwgMHgyNThCLCAweDAxMkUsIDB4MjU4QywgMHgwMTJELCAweDI1OEQsIDB4MDEyQywKLSAgICAweDI1OEUsIDB4MDEyQiwgMHgyNThGLCAweDAxMkEsIDB4MjU5MywgMHgzNzEwLCAweDI1OTQsIDB4MDEzNiwKLSAgICAweDI1OTUsIDB4MDEzOSwgMHgyNUEwLCAweDAwQkUsIDB4MjVBMSwgMHgwMEJELCAweDI1QjIsIDB4MDBCNywKLSAgICAweDI1QjMsIDB4MDBCNiwgMHgyNUJDLCAweDAwQzAsIDB4MjVCRCwgMHgwMEJGLCAweDI1QzYsIDB4MDBCQywKLSAgICAweDI1QzcsIDB4MDBCQiwgMHgyNUNCLCAweDAwQjQsIDB4MjVDRSwgMHgwMEI4LCAweDI1Q0YsIDB4MDBCNSwKLSAgICAweDI1RTIsIDB4MDE0NiwgMHgyNUUzLCAweDAxNDcsIDB4MjVFNCwgMHgwMTQ5LCAweDI1RTUsIDB4MDE0OCwKLSAgICAweDI2MDUsIDB4MDBCQSwgMHgyNjA2LCAweDAwQjksIDB4MjYwOSwgMHgwMEY0LCAweDI2NDAsIDB4MDBGMSwKLSAgICAweDI2NDEsIDB4MDBGMywgMHgyNjQyLCAweDAwRjIsIDB4MjczRCwgMHgzNUMwLCAweDJGMDAsIDB4MDI1MywKLSAgICAweDJGMDEsIDB4MDIxOCwgMHgyRjAyLCAweDAyMTksIDB4MkYwMywgMHgwMjFBLCAweDJGMDQsIDB4MDI1NCwKLSAgICAweDJGMDUsIDB4MDIxQiwgMHgyRjA2LCAweDAyNUEsIDB4MkYwNywgMHgwMjFDLCAweDJGMDgsIDB4MDI1QiwKLSAgICAweDJGMDksIDB4MDI1QywgMHgyRjBBLCAweDAyNUQsIDB4MkYwQiwgMHgwMjVFLCAweDJGMEMsIDB4MDIxRCwKLSAgICAweDJGMEQsIDB4MDIxRSwgMHgyRjBFLCAweDAyMUYsIDB4MkYwRiwgMHgwMjVGLCAweDJGMTAsIDB4MTc2RSwKLSAgICAweDJGMTEsIDB4MDI2MCwgMHgyRjEyLCAweDAyNjIsIDB4MkYxMywgMHgwMjIwLCAweDJGMTQsIDB4MDI2MywKLSAgICAweDJGMTUsIDB4MTc2RiwgMHgyRjE2LCAweDAyMjEsIDB4MkYxNywgMHgwMjY0LCAweDJGMTgsIDB4MDI2NSwKLSAgICAweDJGMTksIDB4MDIyMiwgMHgyRjFBLCAweDE3NzAsIDB4MkYxQiwgMHgwMjIzLCAweDJGMUMsIDB4MDI2NiwKLSAgICAweDJGMUQsIDB4MDI3OSwgMHgyRjFFLCAweDE3NzUsIDB4MkYxRiwgMHgwMjdBLCAweDJGMjAsIDB4MDI3QiwKLSAgICAweDJGMjEsIDB4MDIyNCwgMHgyRjIyLCAweDAyMjQsIDB4MkYyMywgMHgwMjdDLCAweDJGMjQsIDB4MDI3RCwKLSAgICAweDJGMjUsIDB4MDI3RSwgMHgyRjI2LCAweDAyN0YsIDB4MkYyNywgMHgwMjI1LCAweDJGMjgsIDB4MDI4MiwKLSAgICAweDJGMjksIDB4MDI4MywgMHgyRjJBLCAweDAyODQsIDB4MkYyQiwgMHgwMjg1LCAweDJGMkMsIDB4MTc3NiwKLSAgICAweDJGMkQsIDB4MDI4NiwgMHgyRjJFLCAweDAyMjYsIDB4MkYyRiwgMHgwMjg4LCAweDJGMzAsIDB4MDI4OSwKLSAgICAweDJGMzEsIDB4MDI4QywgMHgyRjMyLCAweDAyOEQsIDB4MkYzMywgMHgwMjI3LCAweDJGMzQsIDB4MDIyOCwKLSAgICAweDJGMzUsIDB4MDIyOSwgMHgyRjM2LCAweDAyOEUsIDB4MkYzNywgMHgwMjhGLCAweDJGMzgsIDB4MDI5MCwKLSAgICAweDJGMzksIDB4MDIyQSwgMHgyRjNBLCAweDAyMkIsIDB4MkYzQiwgMHgxNzc3LCAweDJGM0MsIDB4MDJEMCwKLSAgICAweDJGM0QsIDB4MDJEMSwgMHgyRjNFLCAweDAyRDIsIDB4MkYzRiwgMHgwMkQzLCAweDJGNDAsIDB4MDJENSwKLSAgICAweDJGNDEsIDB4MDIyQywgMHgyRjQyLCAweDAyRDYsIDB4MkY0MywgMHgwMkQ3LCAweDJGNDQsIDB4MDJEOCwKLSAgICAweDJGNDUsIDB4MDJEOSwgMHgyRjQ2LCAweDAyMkQsIDB4MkY0NywgMHgwMkRBLCAweDJGNDgsIDB4MDJEQiwKLSAgICAweDJGNDksIDB4MDJEQywgMHgyRjRBLCAweDAyREQsIDB4MkY0QiwgMHgwMkRFLCAweDJGNEMsIDB4MDJERiwKLSAgICAweDJGNEQsIDB4MDJFMCwgMHgyRjRFLCAweDE3OEEsIDB4MkY0RiwgMHgwMkUxLCAweDJGNTAsIDB4MDJFMiwKLSAgICAweDJGNTEsIDB4MDJFMywgMHgyRjUyLCAweDAyRTQsIDB4MkY1MywgMHgxNzhDLCAweDJGNTQsIDB4MDJFNSwKLSAgICAweDJGNTUsIDB4MDJFNiwgMHgyRjU2LCAweDAyRTcsIDB4MkY1NywgMHgwMkU4LCAweDJGNTgsIDB4MDJFOSwKLSAgICAweDJGNTksIDB4MTc4RCwgMHgyRjVBLCAweDAyRUEsIDB4MkY1QiwgMHgwMkVCLCAweDJGNUMsIDB4MDJFQywKLSAgICAweDJGNUQsIDB4MDJFRCwgMHgyRjVFLCAweDAzNTYsIDB4MkY1RiwgMHgwMzU3LCAweDJGNjAsIDB4MDM1OCwKLSAgICAweDJGNjEsIDB4MDM1OSwgMHgyRjYyLCAweDAzNUEsIDB4MkY2MywgMHgwMzVCLCAweDJGNjQsIDB4MDM1QywKLSAgICAweDJGNjUsIDB4MDM1RSwgMHgyRjY2LCAweDAzNjIsIDB4MkY2NywgMHgwMjJFLCAweDJGNjgsIDB4MDIyRiwKLSAgICAweDJGNjksIDB4MDM2MywgMHgyRjZBLCAweDAzNjQsIDB4MkY2QiwgMHgwMzY1LCAweDJGNkMsIDB4MDM2NiwKLSAgICAweDJGNkQsIDB4MDM2NywgMHgyRjZFLCAweDAzNjgsIDB4MkY2RiwgMHgwMzY5LCAweDJGNzAsIDB4MDM2QSwKLSAgICAweDJGNzEsIDB4MTdCMiwgMHgyRjcyLCAweDAzNkIsIDB4MkY3MywgMHgwMzZDLCAweDJGNzQsIDB4MDM2RCwKLSAgICAweDJGNzUsIDB4MDNGNiwgMHgyRjc2LCAweDAzRjcsIDB4MkY3NywgMHgwM0Y4LCAweDJGNzgsIDB4MDNGOSwKLSAgICAweDJGNzksIDB4MTgxMiwgMHgyRjdBLCAweDAzRkEsIDB4MkY3QiwgMHgwM0ZCLCAweDJGN0MsIDB4MDNGQywKLSAgICAweDJGN0QsIDB4MDNGRSwgMHgyRjdFLCAweDAzRkYsIDB4MkY3RiwgMHgwNDAwLCAweDJGODAsIDB4MDQwMSwKLSAgICAweDJGODEsIDB4MDQwMiwgMHgyRjgyLCAweDA0MDUsIDB4MkY4MywgMHgwNDA2LCAweDJGODQsIDB4MDQwNywKLSAgICAweDJGODUsIDB4MDQwOCwgMHgyRjg2LCAweDA0MDksIDB4MkY4NywgMHgwNDBBLCAweDJGODgsIDB4MDQwQiwKLSAgICAweDJGODksIDB4MDQwQywgMHgyRjhBLCAweDA0MEQsIDB4MkY4QiwgMHgxODEzLCAweDJGOEMsIDB4MTgxOCwKLSAgICAweDJGOEQsIDB4MDQwRiwgMHgyRjhFLCAweDA0MTAsIDB4MkY4RiwgMHgwNDExLCAweDJGOTAsIDB4MDQxMiwKLSAgICAweDJGOTEsIDB4MTgxOSwgMHgyRjkyLCAweDA1MDgsIDB4MkY5MywgMHgwNTA5LCAweDJGOTQsIDB4MDUwQSwKLSAgICAweDJGOTUsIDB4MDUwQiwgMHgyRjk2LCAweDA1MEMsIDB4MkY5NywgMHgwNTBELCAweDJGOTgsIDB4MThFNywKLSAgICAweDJGOTksIDB4MDUwRSwgMHgyRjlBLCAweDA1MEYsIDB4MkY5QiwgMHgwNTEwLCAweDJGOUMsIDB4MDUxMSwKLSAgICAweDJGOUQsIDB4MDUxMiwgMHgyRjlFLCAweDA1MTMsIDB4MkY5RiwgMHgwNTE0LCAweDJGQTAsIDB4MDUxNSwKLSAgICAweDJGQTEsIDB4MDIzMCwgMHgyRkEyLCAweDA1MUIsIDB4MkZBMywgMHgwNTIwLCAweDJGQTQsIDB4MDUyMSwKLSAgICAweDJGQTUsIDB4MDUyMiwgMHgyRkE2LCAweDA2OTYsIDB4MkZBNywgMHgwNjk3LCAweDJGQTgsIDB4MDY5OCwKLSAgICAweDJGQTksIDB4MDY5OSwgMHgyRkFBLCAweDAyMzEsIDB4MkZBQiwgMHgwNjlGLCAweDJGQUMsIDB4MDZBMCwKLSAgICAweDJGQUUsIDB4MDZBMiwgMHgyRkFGLCAweDA4MjYsIDB4MkZCMCwgMHgwODI3LCAweDJGQjEsIDB4MDgyOCwKLSAgICAweDJGQjIsIDB4MDgyOSwgMHgyRkIzLCAweDA4MkEsIDB4MkZCNCwgMHgwODJCLCAweDJGQjUsIDB4MDgyQywKLSAgICAweDJGQjYsIDB4MDgyRCwgMHgyRkI3LCAweDA4MkUsIDB4MkZCOCwgMHgwODJGLCAweDJGQjksIDB4MDgzMCwKLSAgICAweDJGQkEsIDB4MDlGNSwgMHgyRkJCLCAweDA5RjYsIDB4MkZCQywgMHgwOUY3LCAweDJGQkQsIDB4MUUzMywKLSAgICAweDJGQkUsIDB4MDlGOCwgMHgyRkJGLCAweDFFMzQsIDB4MkZDMCwgMHgwOUY5LCAweDJGQzEsIDB4MDlGQSwKLSAgICAweDJGQzIsIDB4MEJFMSwgMHgyRkMzLCAweDBCRTIsIDB4MkZDNCwgMHgwQkUzLCAweDJGQzUsIDB4MEJFNCwKLSAgICAweDJGQzYsIDB4MEJFNSwgMHgyRkM3LCAweDBCRTYsIDB4MkZDOCwgMHgwREJCLCAweDJGQzksIDB4MERCQywKLSAgICAweDJGQ0EsIDB4MERCRCwgMHgyRkNCLCAweDIzNjAsIDB4MkZDQywgMHgyNjEyLCAweDJGQ0QsIDB4MEY3QiwKLSAgICAweDJGQ0UsIDB4MEY3QywgMHgyRkNGLCAweDBGN0QsIDB4MkZEMCwgMHgxMTAwLCAweDJGRDEsIDB4MTEwMSwKLSAgICAweDJGRDIsIDB4MTI4OSwgMHgyRkQzLCAweDEzQjIsIDB4MkZENCwgMHgxM0IzLCAweDJGRDUsIDB4MkYwRCwKLSAgICAweDMwMDAsIDB4MDA2MywgMHgzMDAxLCAweDAwNjUsIDB4MzAwMiwgMHgwMDY2LCAweDMwMDMsIDB4MDBCMywKLSAgICAweDMwMDUsIDB4MzVCQSwgMHgzMDA2LCAweDM1QkIsIDB4MzAwNywgMHgzNUJDLCAweDMwMDgsIDB4MDA5NCwKLSAgICAweDMwMDksIDB4MDA5NSwgMHgzMDBBLCAweDAwOTAsIDB4MzAwQiwgMHgwMDkxLCAweDMwMEMsIDB4MDA5OCwKLSAgICAweDMwMEQsIDB4MDA5OSwgMHgzMDBFLCAweDAwOUMsIDB4MzAwRiwgMHgwMDlELCAweDMwMTAsIDB4MDA4QywKLSAgICAweDMwMTEsIDB4MDA4RCwgMHgzMDEyLCAweDAxMDUsIDB4MzAxNCwgMHgwMDg4LCAweDMwMTUsIDB4MDA4OSwKLSAgICAweDMwMUQsIDB4MDBBQSwgMHgzMDFFLCAweDAwQUIsIDB4MzAyMSwgMHgwMTYxLCAweDMwMjIsIDB4MDE2MiwKLSAgICAweDMwMjMsIDB4MDE2MywgMHgzMDI0LCAweDAxNjQsIDB4MzAyNSwgMHgwMTY1LCAweDMwMjYsIDB4MDE2NiwKLSAgICAweDMwMjcsIDB4MDE2NywgMHgzMDI4LCAweDAxNjgsIDB4MzAyOSwgMHgwMTY5LCAweDMwMzgsIDB4MDE2QSwKLSAgICAweDMwMzksIDB4MDE2QiwgMHgzMDNBLCAweDAxNkMsIDB4MzA0MSwgMHgzNUMxLCAweDMwNDIsIDB4MzVDMiwKLSAgICAweDMwNDMsIDB4MzVDMywgMHgzMDQ0LCAweDM1QzQsIDB4MzA0NSwgMHgzNUM1LCAweDMwNDYsIDB4MzVDNiwKLSAgICAweDMwNDcsIDB4MzVDNywgMHgzMDQ4LCAweDM1QzgsIDB4MzA0OSwgMHgzNUM5LCAweDMwNEEsIDB4MzVDQSwKLSAgICAweDMwNEIsIDB4MzVDQiwgMHgzMDRDLCAweDM1Q0MsIDB4MzA0RCwgMHgzNUNELCAweDMwNEUsIDB4MzVDRSwKLSAgICAweDMwNEYsIDB4MzVDRiwgMHgzMDUwLCAweDM1RDAsIDB4MzA1MSwgMHgzNUQxLCAweDMwNTIsIDB4MzVEMiwKLSAgICAweDMwNTMsIDB4MzVEMywgMHgzMDU0LCAweDM1RDQsIDB4MzA1NSwgMHgzNUQ1LCAweDMwNTYsIDB4MzVENiwKLSAgICAweDMwNTcsIDB4MzVENywgMHgzMDU4LCAweDM1RDgsIDB4MzA1OSwgMHgzNUQ5LCAweDMwNUEsIDB4MzVEQSwKLSAgICAweDMwNUIsIDB4MzVEQiwgMHgzMDVDLCAweDM1REMsIDB4MzA1RCwgMHgzNURELCAweDMwNUUsIDB4MzVERSwKLSAgICAweDMwNUYsIDB4MzVERiwgMHgzMDYwLCAweDM1RTAsIDB4MzA2MSwgMHgzNUUxLCAweDMwNjIsIDB4MzVFMiwKLSAgICAweDMwNjMsIDB4MzVFMywgMHgzMDY0LCAweDM1RTQsIDB4MzA2NSwgMHgzNUU1LCAweDMwNjYsIDB4MzVFNiwKLSAgICAweDMwNjcsIDB4MzVFNywgMHgzMDY4LCAweDM1RTgsIDB4MzA2OSwgMHgzNUU5LCAweDMwNkEsIDB4MzVFQSwKLSAgICAweDMwNkIsIDB4MzVFQiwgMHgzMDZDLCAweDM1RUMsIDB4MzA2RCwgMHgzNUVELCAweDMwNkUsIDB4MzVFRSwKLSAgICAweDMwNkYsIDB4MzVFRiwgMHgzMDcwLCAweDM1RjAsIDB4MzA3MSwgMHgzNUYxLCAweDMwNzIsIDB4MzVGMiwKLSAgICAweDMwNzMsIDB4MzVGMywgMHgzMDc0LCAweDM1RjQsIDB4MzA3NSwgMHgzNUY1LCAweDMwNzYsIDB4MzVGNiwKLSAgICAweDMwNzcsIDB4MzVGNywgMHgzMDc4LCAweDM1RjgsIDB4MzA3OSwgMHgzNUY5LCAweDMwN0EsIDB4MzVGQSwKLSAgICAweDMwN0IsIDB4MzVGQiwgMHgzMDdDLCAweDM1RkMsIDB4MzA3RCwgMHgzNUZELCAweDMwN0UsIDB4MzVGRSwKLSAgICAweDMwN0YsIDB4MzVGRiwgMHgzMDgwLCAweDM2MDAsIDB4MzA4MSwgMHgzNjAxLCAweDMwODIsIDB4MzYwMiwKLSAgICAweDMwODMsIDB4MzYwMywgMHgzMDg0LCAweDM2MDQsIDB4MzA4NSwgMHgzNjA1LCAweDMwODYsIDB4MzYwNiwKLSAgICAweDMwODcsIDB4MzYwNywgMHgzMDg4LCAweDM2MDgsIDB4MzA4OSwgMHgzNjA5LCAweDMwOEEsIDB4MzYwQSwKLSAgICAweDMwOEIsIDB4MzYwQiwgMHgzMDhDLCAweDM2MEMsIDB4MzA4RCwgMHgzNjBELCAweDMwOEUsIDB4MzYwRSwKLSAgICAweDMwOEYsIDB4MzYwRiwgMHgzMDkwLCAweDM2MTAsIDB4MzA5MSwgMHgzNjExLCAweDMwOTIsIDB4MzYxMiwKLSAgICAweDMwOTMsIDB4MzYxMywgMHgzMDlELCAweDM1QjcsIDB4MzA5RSwgMHgzNUI4LCAweDMwQTEsIDB4MzYxNCwKLSAgICAweDMwQTIsIDB4MzYxNSwgMHgzMEEzLCAweDM2MTYsIDB4MzBBNCwgMHgzNjE3LCAweDMwQTUsIDB4MzYxOCwKLSAgICAweDMwQTYsIDB4MzYxOSwgMHgzMEE3LCAweDM2MUEsIDB4MzBBOCwgMHgzNjFCLCAweDMwQTksIDB4MzYxQywKLSAgICAweDMwQUEsIDB4MzYxRCwgMHgzMEFCLCAweDM2MUUsIDB4MzBBQywgMHgzNjFGLCAweDMwQUQsIDB4MzYyMCwKLSAgICAweDMwQUUsIDB4MzYyMSwgMHgzMEFGLCAweDM2MjIsIDB4MzBCMCwgMHgzNjIzLCAweDMwQjEsIDB4MzYyNCwKLSAgICAweDMwQjIsIDB4MzYyNSwgMHgzMEIzLCAweDM2MjYsIDB4MzBCNCwgMHgzNjI3LCAweDMwQjUsIDB4MzYyOCwKLSAgICAweDMwQjYsIDB4MzYyOSwgMHgzMEI3LCAweDM2MkEsIDB4MzBCOCwgMHgzNjJCLCAweDMwQjksIDB4MzYyQywKLSAgICAweDMwQkEsIDB4MzYyRCwgMHgzMEJCLCAweDM2MkUsIDB4MzBCQywgMHgzNjJGLCAweDMwQkQsIDB4MzYzMCwKLSAgICAweDMwQkUsIDB4MzYzMSwgMHgzMEJGLCAweDM2MzIsIDB4MzBDMCwgMHgzNjMzLCAweDMwQzEsIDB4MzYzNCwKLSAgICAweDMwQzIsIDB4MzYzNSwgMHgzMEMzLCAweDM2MzYsIDB4MzBDNCwgMHgzNjM3LCAweDMwQzUsIDB4MzYzOCwKLSAgICAweDMwQzYsIDB4MzYzOSwgMHgzMEM3LCAweDM2M0EsIDB4MzBDOCwgMHgzNjNCLCAweDMwQzksIDB4MzYzQywKLSAgICAweDMwQ0EsIDB4MzYzRCwgMHgzMENCLCAweDM2M0UsIDB4MzBDQywgMHgzNjNGLCAweDMwQ0QsIDB4MzY0MCwKLSAgICAweDMwQ0UsIDB4MzY0MSwgMHgzMENGLCAweDM2NDIsIDB4MzBEMCwgMHgzNjQzLCAweDMwRDEsIDB4MzY0NCwKLSAgICAweDMwRDIsIDB4MzY0NSwgMHgzMEQzLCAweDM2NDYsIDB4MzBENCwgMHgzNjQ3LCAweDMwRDUsIDB4MzY0OCwKLSAgICAweDMwRDYsIDB4MzY0OSwgMHgzMEQ3LCAweDM2NEEsIDB4MzBEOCwgMHgzNjRCLCAweDMwRDksIDB4MzY0QywKLSAgICAweDMwREEsIDB4MzY0RCwgMHgzMERCLCAweDM2NEUsIDB4MzBEQywgMHgzNjRGLCAweDMwREQsIDB4MzY1MCwKLSAgICAweDMwREUsIDB4MzY1MSwgMHgzMERGLCAweDM2NTIsIDB4MzBFMCwgMHgzNjUzLCAweDMwRTEsIDB4MzY1NCwKLSAgICAweDMwRTIsIDB4MzY1NSwgMHgzMEUzLCAweDM2NTYsIDB4MzBFNCwgMHgzNjU3LCAweDMwRTUsIDB4MzY1OCwKLSAgICAweDMwRTYsIDB4MzY1OSwgMHgzMEU3LCAweDM2NUEsIDB4MzBFOCwgMHgzNjVCLCAweDMwRTksIDB4MzY1QywKLSAgICAweDMwRUEsIDB4MzY1RCwgMHgzMEVCLCAweDM2NUUsIDB4MzBFQywgMHgzNjVGLCAweDMwRUQsIDB4MzY2MCwKLSAgICAweDMwRUUsIDB4MzY2MSwgMHgzMEVGLCAweDM2NjIsIDB4MzBGMCwgMHgzNjYzLCAweDMwRjEsIDB4MzY2NCwKLSAgICAweDMwRjIsIDB4MzY2NSwgMHgzMEYzLCAweDM2NjYsIDB4MzBGNCwgMHgzNjY3LCAweDMwRjUsIDB4MzY2OCwKLSAgICAweDMwRjYsIDB4MzY2OSwgMHgzMEZDLCAweDM1QkQsIDB4MzBGRCwgMHgzNUI1LCAweDMwRkUsIDB4MzVCNiwKLSAgICAweDMxMDUsIDB4MDFEMSwgMHgzMTA2LCAweDAxRDIsIDB4MzEwNywgMHgwMUQzLCAweDMxMDgsIDB4MDFENCwKLSAgICAweDMxMDksIDB4MDFENSwgMHgzMTBBLCAweDAxRDYsIDB4MzEwQiwgMHgwMUQ3LCAweDMxMEMsIDB4MDFEOCwKLSAgICAweDMxMEQsIDB4MDFEOSwgMHgzMTBFLCAweDAxREEsIDB4MzEwRiwgMHgwMURCLCAweDMxMTAsIDB4MDFEQywKLSAgICAweDMxMTEsIDB4MDFERCwgMHgzMTEyLCAweDAxREUsIDB4MzExMywgMHgwMURGLCAweDMxMTQsIDB4MDFFMCwKLSAgICAweDMxMTUsIDB4MDFFMSwgMHgzMTE2LCAweDAxRTIsIDB4MzExNywgMHgwMUUzLCAweDMxMTgsIDB4MDFFNCwKLSAgICAweDMxMTksIDB4MDFFNSwgMHgzMTFBLCAweDAxRTYsIDB4MzExQiwgMHgwMUU3LCAweDMxMUMsIDB4MDFFOCwKLSAgICAweDMxMUQsIDB4MDFFOSwgMHgzMTFFLCAweDAxRUEsIDB4MzExRiwgMHgwMUVCLCAweDMxMjAsIDB4MDFFQywKLSAgICAweDMxMjEsIDB4MDFFRCwgMHgzMTIyLCAweDAxRUUsIDB4MzEyMywgMHgwMUVGLCAweDMxMjQsIDB4MDFGMCwKLSAgICAweDMxMjUsIDB4MDFGMSwgMHgzMTI2LCAweDAxRjIsIDB4MzEyNywgMHgwMUYzLCAweDMxMjgsIDB4MDFGNCwKLSAgICAweDMxMjksIDB4MDFGNSwgMHgzMjMxLCAweDM2RTUsIDB4MzJBMywgMHgwMEMxLCAweDMzOEUsIDB4MDExNSwKLSAgICAweDMzOEYsIDB4MDExNiwgMHgzMzlDLCAweDAxMTAsIDB4MzM5RCwgMHgwMTExLCAweDMzOUUsIDB4MDExMiwKLSAgICAweDMzQTEsIDB4MDExNCwgMHgzM0M0LCAweDAxMTcsIDB4MzNDRSwgMHgwMTEzLCAweDMzRDEsIDB4MDBFQywKLSAgICAweDMzRDIsIDB4MDBFQiwgMHgzM0Q1LCAweDAxMEYsIDB4MzYxRCwgMHgzNkI3LCAweDQ0OTEsIDB4MzZCNCwKLSAgICAweDRFMDAsIDB4MDI1MywgMHg0RTAxLCAweDAyNTUsIDB4NEUwMywgMHgwMjU2LCAweDRFMDcsIDB4MTc3MSwKLSAgICAweDRFMDgsIDB4MDI2OSwgMHg0RTA5LCAweDAyNjcsIDB4NEUwQSwgMHgwMjZBLCAweDRFMEIsIDB4MDI2OCwKLSAgICAweDRFMEMsIDB4MTc3MiwgMHg0RTBELCAweDAyOTQsIDB4NEUwRSwgMHgxNzdBLCAweDRFMEYsIDB4MTc3OCwKLSAgICAweDRFMTAsIDB4MDI5MywgMHg0RTExLCAweDAyOTIsIDB4NEUxNCwgMHgwMkYyLCAweDRFMTUsIDB4MDJGMSwKLSAgICAweDRFMTYsIDB4MDJGMCwgMHg0RTE4LCAweDAyRjMsIDB4NEUxOSwgMHgwMkVGLCAweDRFMUUsIDB4MDM2RSwKLSAgICAweDRFMUYsIDB4MDM2RiwgMHg0RTI2LCAweDA1MjgsIDB4NEUyOCwgMHgwMjE4LCAweDRFMkIsIDB4MDI2QiwKLSAgICAweDRFMkQsIDB4MDI5NSwgMHg0RTJFLCAweDE3N0IsIDB4NEUzMCwgMHgwMjk2LCAweDRFMzEsIDB4MTc4RSwKLSAgICAweDRFMzIsIDB4MDQxNSwgMHg0RTMzLCAweDE4RjQsIDB4NEUzNiwgMHgwMjE5LCAweDRFMzgsIDB4MDI2QywKLSAgICAweDRFMzksIDB4MDI5NywgMHg0RTNCLCAweDAyRjQsIDB4NEUzQywgMHgxNzhGLCAweDRFM0YsIDB4MDIxQSwKLSAgICAweDRFNDEsIDB4MzZBRiwgMHg0RTQyLCAweDE3NkMsIDB4NEU0MywgMHgwMjU3LCAweDRFNDUsIDB4MDI2RSwKLSAgICAweDRFNDcsIDB4MTc3MywgMHg0RTQ4LCAweDAyNkYsIDB4NEU0QiwgMHgwMjk4LCAweDRFNEQsIDB4MDJGNSwKLSAgICAweDRFNEUsIDB4MDJGNywgMHg0RTRGLCAweDAyRjYsIDB4NEU1MiwgMHgwMzcwLCAweDRFNTMsIDB4MDM3MSwKLSAgICAweDRFNTYsIDB4MDUyOSwgMHg0RTU4LCAweDA4MzEsIDB4NEU1OSwgMHgwMjU0LCAweDRFNUEsIDB4MzZCMSwKLSAgICAweDRFNUMsIDB4MTc2RCwgMHg0RTVELCAweDAyNTgsIDB4NEU1RSwgMHgwMjcxLCAweDRFNUYsIDB4MDI3MCwKLSAgICAweDRFNjksIDB4MDM3MiwgMHg0RTczLCAweDA1MkEsIDB4NEU3RSwgMHgwOUZCLCAweDRFN0YsIDB4MUUzNSwKLSAgICAweDRFODIsIDB4MERCRSwgMHg0RTgzLCAweDIzNjEsIDB4NEU4NCwgMHgyMzYyLCAweDRFODUsIDB4MDIxQiwKLSAgICAweDRFODYsIDB4MDI1OSwgMHg0RTg4LCAweDAyOUEsIDB4NEU4QiwgMHgwNTJCLCAweDRFOEMsIDB4MDI1QSwKLSAgICAweDRFOEQsIDB4MTc3NCwgMHg0RThFLCAweDAyNzIsIDB4NEU5MSwgMHgwMjlCLCAweDRFOTIsIDB4MDI5RCwKLSAgICAweDRFOTMsIDB4MTc3QywgMHg0RTk0LCAweDAyOUUsIDB4NEU5NSwgMHgwMjlDLCAweDRFOTksIDB4MDM3MywKLSAgICAweDRFOUIsIDB4MDUyQywgMHg0RTlFLCAweDA1MkQsIDB4NEU5RiwgMHgwNkEzLCAweDRFQTAsIDB4MDIxQywKLSAgICAweDRFQTEsIDB4MDI3MywgMHg0RUEyLCAweDAyOUYsIDB4NEVBNCwgMHgwMzc0LCAweDRFQTUsIDB4MDM3NiwKLSAgICAweDRFQTYsIDB4MDM3NSwgMHg0RUE4LCAweDA0MTYsIDB4NEVBQiwgMHgwNTJFLCAweDRFQUMsIDB4MDUyRiwKLSAgICAweDRFQUQsIDB4MDZBNCwgMHg0RUFFLCAweDA2QTUsIDB4NEVCMywgMHgwODMyLCAweDRFQjYsIDB4MjM2MywKLSAgICAweDRFQjksIDB4MzM3NywgMHg0RUJBLCAweDAyNUIsIDB4NEVDMCwgMHgwMkExLCAweDRFQzEsIDB4MDJBMCwKLSAgICAweDRFQzIsIDB4MTc3RCwgMHg0RUMzLCAweDAyQTIsIDB4NEVDNCwgMHgwMkE4LCAweDRFQzYsIDB4MDJBMywKLSAgICAweDRFQzcsIDB4MDJBNCwgMHg0RUM4LCAweDE3N0YsIDB4NEVDOSwgMHgxNzdFLCAweDRFQ0EsIDB4MDJBNiwKLSAgICAweDRFQ0IsIDB4MDJBNywgMHg0RUNELCAweDAyQTUsIDB4NEVENCwgMHgwMkZBLCAweDRFRDUsIDB4MDJGQiwKLSAgICAweDRFRDYsIDB4MDJGQywgMHg0RUQ3LCAweDAyRkQsIDB4NEVEOCwgMHgwMkY5LCAweDRFRDksIDB4MDMwMCwKLSAgICAweDRFREEsIDB4MTc5NSwgMHg0RURDLCAweDE3OTEsIDB4NEVERCwgMHgxNzk0LCAweDRFREUsIDB4MDMwMSwKLSAgICAweDRFREYsIDB4MDMxMSwgMHg0RUUxLCAweDE3OTMsIDB4NEVFMywgMHgwMkZFLCAweDRFRTQsIDB4MDJGRiwKLSAgICAweDRFRTUsIDB4MDJGOCwgMHg0RUU4LCAweDE3OTAsIDB4NEVFOSwgMHgxNzkyLCAweDRFRjAsIDB4MDM4MywKLSAgICAweDRFRjEsIDB4MTdCQSwgMHg0RUYyLCAweDAzODAsIDB4NEVGMywgMHgwMzg0LCAweDRFRjQsIDB4MTdDNCwKLSAgICAweDRFRjUsIDB4MTdCOCwgMHg0RUY2LCAweDAzODEsIDB4NEVGNywgMHgxN0JDLCAweDRFRkIsIDB4MDM4MiwKLSAgICAweDRFRkQsIDB4MDM4NSwgMHg0RUZGLCAweDAzNzcsIDB4NEYwMCwgMHgxN0JCLCAweDRGMDEsIDB4MDM4NiwKLSAgICAweDRGMDIsIDB4MTdCRiwgMHg0RjA0LCAweDE3QzMsIDB4NEYwNSwgMHgxN0MwLCAweDRGMDgsIDB4MTdCRCwKLSAgICAweDRGMDksIDB4MDM3OCwgMHg0RjBBLCAweDAzN0EsIDB4NEYwQiwgMHgwMzg3LCAweDRGMEQsIDB4MDM3QywKLSAgICAweDRGMEUsIDB4MTdCNSwgMHg0RjBGLCAweDAzN0YsIDB4NEYxMCwgMHgwMzdELCAweDRGMTEsIDB4MDM3RSwKLSAgICAweDRGMTIsIDB4MTdDNSwgMHg0RjEzLCAweDE3QzIsIDB4NEYxNCwgMHgxN0I5LCAweDRGMTUsIDB4MDM3QiwKLSAgICAweDRGMTgsIDB4MTdCNiwgMHg0RjE5LCAweDAzNzksIDB4NEYxRCwgMHgxN0JFLCAweDRGMjIsIDB4MTdDMSwKLSAgICAweDRGMkMsIDB4MTdCNywgMHg0RjJELCAweDE4MkYsIDB4NEYyRiwgMHgwNDJDLCAweDRGMzAsIDB4MDQxRiwKLSAgICAweDRGMzMsIDB4MTgzMCwgMHg0RjM0LCAweDA0MUMsIDB4NEYzNiwgMHgwNDJFLCAweDRGMzgsIDB4MDQyNCwKLSAgICAweDRGM0EsIDB4MDQyMywgMHg0RjNCLCAweDE4MjQsIDB4NEYzQywgMHgwNDI3LCAweDRGM0QsIDB4MDQyMiwKLSAgICAweDRGM0UsIDB4MTgyOSwgMHg0RjNGLCAweDE4MzEsIDB4NEY0MSwgMHgxODJELCAweDRGNDMsIDB4MDQyNSwKLSAgICAweDRGNDYsIDB4MDQyOCwgMHg0RjQ3LCAweDA0MTksIDB4NEY0OCwgMHgwNDMxLCAweDRGNDksIDB4MTgyNiwKLSAgICAweDRGNEMsIDB4MTkwMCwgMHg0RjRELCAweDA0MTcsIDB4NEY0RSwgMHgwNDJELCAweDRGNEYsIDB4MDQxOCwKLSAgICAweDRGNTAsIDB4MDQyMCwgMHg0RjUxLCAweDA0MjEsIDB4NEY1MiwgMHgxODJCLCAweDRGNTMsIDB4MTgyNywKLSAgICAweDRGNTQsIDB4MDQyNiwgMHg0RjU1LCAweDA0MUUsIDB4NEY1NiwgMHgxODIzLCAweDRGNTcsIDB4MDQxQSwKLSAgICAweDRGNTgsIDB4MTgyRSwgMHg0RjU5LCAweDA0MkYsIDB4NEY1QSwgMHgwNDMyLCAweDRGNUIsIDB4MDQxRCwKLSAgICAweDRGNUMsIDB4MDQyQSwgMHg0RjVELCAweDA0MzAsIDB4NEY1RSwgMHgwNDFCLCAweDRGNUYsIDB4MTgyQywKLSAgICAweDRGNjAsIDB4MDQyQiwgMHg0RjYxLCAweDE4MzIsIDB4NEY2MiwgMHgxODI1LCAweDRGNjMsIDB4MDQyOSwKLSAgICAweDRGNjQsIDB4MTgyOCwgMHg0RjY3LCAweDE4MkEsIDB4NEY2OSwgMHgwNTNELCAweDRGNkEsIDB4MTkwMiwKLSAgICAweDRGNkIsIDB4MTkwRSwgMHg0RjZDLCAweDA1MzUsIDB4NEY2RSwgMHgxOTBGLCAweDRGNkYsIDB4MDUzMCwKLSAgICAweDRGNzAsIDB4MDUzQSwgMHg0RjczLCAweDA1MzMsIDB4NEY3NCwgMHgxOEZDLCAweDRGNzUsIDB4MDUzQiwKLSAgICAweDRGNzYsIDB4MThGQiwgMHg0Rjc3LCAweDE4RkYsIDB4NEY3OCwgMHgxOTA2LCAweDRGNzksIDB4MTkwNCwKLSAgICAweDRGN0EsIDB4MDU0MywgMHg0RjdCLCAweDA1M0UsIDB4NEY3QywgMHgxOEY2LCAweDRGN0QsIDB4MThGOCwKLSAgICAweDRGN0UsIDB4MDU0MCwgMHg0RjdGLCAweDA1MzQsIDB4NEY4MCwgMHgxOEY5LCAweDRGODEsIDB4MTkwNSwKLSAgICAweDRGODIsIDB4MTkwQywgMHg0RjgzLCAweDA1MzksIDB4NEY4NCwgMHgxOEZFLCAweDRGODUsIDB4MThGNywKLSAgICAweDRGODYsIDB4MDUzOCwgMHg0Rjg3LCAweDE4RkEsIDB4NEY4OCwgMHgwNTNDLCAweDRGODksIDB4MThGRCwKLSAgICAweDRGOEIsIDB4MDUzNywgMHg0RjhELCAweDA1MzIsIDB4NEY4RiwgMHgwNTQxLCAweDRGOTAsIDB4MTkwNywKLSAgICAweDRGOTEsIDB4MDU0MiwgMHg0RjkyLCAweDE5MEIsIDB4NEY5NCwgMHgxOTA5LCAweDRGOTUsIDB4MTkwRCwKLSAgICAweDRGOTYsIDB4MDUzRiwgMHg0Rjk3LCAweDE5MDEsIDB4NEY5OCwgMHgxOEY1LCAweDRGOUEsIDB4MTkwMywKLSAgICAweDRGOUIsIDB4MDUzNiwgMHg0RjlDLCAweDE5MDgsIDB4NEY5RCwgMHgwNTMxLCAweDRGOUUsIDB4MTkwQSwKLSAgICAweDRGQUUsIDB4MDZCNCwgMHg0RkFGLCAweDA2QTgsIDB4NEZCMiwgMHgxQTVELCAweDRGQjMsIDB4MUE2NSwKLSAgICAweDRGQjUsIDB4MDZBNywgMHg0RkI2LCAweDA2QUYsIDB4NEZCNywgMHgwNkJCLCAweDRGQjksIDB4MUE2QiwKLSAgICAweDRGQkEsIDB4MUE2OSwgMHg0RkJCLCAweDFBNjQsIDB4NEZCRiwgMHgwNkE5LCAweDRGQzAsIDB4MUE2QSwKLSAgICAweDRGQzEsIDB4MUE2MCwgMHg0RkMyLCAweDA2QjcsIDB4NEZDMywgMHgwNkFFLCAweDRGQzQsIDB4MDZCNiwKLSAgICAweDRGQzUsIDB4MUE1QiwgMHg0RkM3LCAweDFBNjcsIDB4NEZDOSwgMHgxQTVFLCAweDRGQ0EsIDB4MDZCMiwKLSAgICAweDRGQ0IsIDB4MUE1RiwgMHg0RkNELCAweDFBNUEsIDB4NEZDRSwgMHgwNkI5LCAweDRGQ0YsIDB4MDZBQywKLSAgICAweDRGRDAsIDB4MDZCNSwgMHg0RkQxLCAweDA2QUIsIDB4NEZEMywgMHgxQTVDLCAweDRGRDQsIDB4MUE2MSwKLSAgICAweDRGRDYsIDB4MUE2OCwgMHg0RkQ3LCAweDA2QjMsIDB4NEZEOCwgMHgwNkIwLCAweDRGRDksIDB4MUE2MywKLSAgICAweDRGREEsIDB4MDZCOCwgMHg0RkRCLCAweDFBNjYsIDB4NEZEQywgMHgxQTYyLCAweDRGREQsIDB4MDZBRCwKLSAgICAweDRGREUsIDB4MDZCQSwgMHg0RkRGLCAweDA2QjEsIDB4NEZFMCwgMHgwNkFBLCAweDRGRTEsIDB4MDZBNiwKLSAgICAweDRGRUMsIDB4MUE2QywgMHg0RkVFLCAweDA4NEMsIDB4NEZFRiwgMHgwODM2LCAweDRGRjEsIDB4MDg0NiwKLSAgICAweDRGRjMsIDB4MDg0QiwgMHg0RkY0LCAweDFDMjQsIDB4NEZGNSwgMHgxQzIzLCAweDRGRjYsIDB4MUMyOCwKLSAgICAweDRGRjcsIDB4MUMyOSwgMHg0RkY4LCAweDA4MzksIDB4NEZGQSwgMHgwODQyLCAweDRGRkUsIDB4MDg0RiwKLSAgICAweDUwMDAsIDB4MDg0MywgMHg1MDA1LCAweDFDMUQsIDB4NTAwNiwgMHgwODNDLCAweDUwMDcsIDB4MUMxRSwKLSAgICAweDUwMDksIDB4MDg1MSwgMHg1MDBCLCAweDA4NDgsIDB4NTAwQywgMHgwODMzLCAweDUwMEQsIDB4MDgzNCwKLSAgICAweDUwMEUsIDB4MUMzMSwgMHg1MDBGLCAweDBBMEMsIDB4NTAxMSwgMHgwODQxLCAweDUwMTIsIDB4MDg0MCwKLSAgICAweDUwMTMsIDB4MUMxRiwgMHg1MDE0LCAweDA4NDQsIDB4NTAxNSwgMHgxRTQ1LCAweDUwMTYsIDB4MDgzQiwKLSAgICAweDUwMTcsIDB4MUMyQSwgMHg1MDE4LCAweDA4NEEsIDB4NTAxOSwgMHgwODQ5LCAweDUwMUEsIDB4MDgzRiwKLSAgICAweDUwMUIsIDB4MUMyMiwgMHg1MDFDLCAweDFDMkIsIDB4NTAxRSwgMHgxQzFDLCAweDUwMUYsIDB4MDgzRSwKLSAgICAweDUwMjAsIDB4MUMyQywgMHg1MDIxLCAweDA4NDcsIDB4NTAyMiwgMHgxQzIwLCAweDUwMjMsIDB4MDgzNSwKLSAgICAweDUwMjUsIDB4MDgzOCwgMHg1MDI2LCAweDA4MzcsIDB4NTAyNywgMHgxQzJELCAweDUwMjgsIDB4MDg0NSwKLSAgICAweDUwMjksIDB4MDgzQSwgMHg1MDJBLCAweDA4NEUsIDB4NTAyQiwgMHgwODUwLCAweDUwMkMsIDB4MUMyNywKLSAgICAweDUwMkQsIDB4MDg0RCwgMHg1MDJGLCAweDFDMkYsIDB4NTAzMCwgMHgxQzIxLCAweDUwMzEsIDB4MUMzMCwKLSAgICAweDUwMzMsIDB4MUMyNSwgMHg1MDM1LCAweDFDMkUsIDB4NTAzNywgMHgxQzI2LCAweDUwM0MsIDB4MDgzRCwKLSAgICAweDUwNDAsIDB4MUU0RCwgMHg1MDQxLCAweDFFNDEsIDB4NTA0MywgMHgwQTAwLCAweDUwNDUsIDB4MUU0NiwKLSAgICAweDUwNDYsIDB4MUU0QywgMHg1MDQ3LCAweDA5RkYsIDB4NTA0OCwgMHgxRTNGLCAweDUwNDksIDB4MEEwMywKLSAgICAweDUwNEEsIDB4MUU0MywgMHg1MDRCLCAweDFFM0MsIDB4NTA0QywgMHgwQTAxLCAweDUwNEQsIDB4MUU0MCwKLSAgICAweDUwNEUsIDB4MEEwNiwgMHg1MDRGLCAweDBBMEIsIDB4NTA1MSwgMHgxRTUxLCAweDUwNTMsIDB4MUUzQiwKLSAgICAweDUwNTUsIDB4MEEwNywgMHg1MDU3LCAweDFFNTAsIDB4NTA1QSwgMHgwQTAyLCAweDUwNUIsIDB4MUU0MiwKLSAgICAweDUwNUMsIDB4MDlGRSwgMHg1MDVELCAweDFFM0QsIDB4NTA1RSwgMHgxRTM5LCAweDUwNUYsIDB4MUU0NywKLSAgICAweDUwNjAsIDB4MUUzQSwgMHg1MDYxLCAweDFFMzgsIDB4NTA2MiwgMHgxRTQ0LCAweDUwNjMsIDB4MUU0QSwKLSAgICAweDUwNjQsIDB4MUU0QiwgMHg1MDY1LCAweDBBMDQsIDB4NTA2OCwgMHgyMEI4LCAweDUwNjksIDB4MUU0OCwKLSAgICAweDUwNkEsIDB4MUUzNywgMHg1MDZCLCAweDFFNDksIDB4NTA2RCwgMHgwQTBFLCAweDUwNkUsIDB4MUU0RSwKLSAgICAweDUwNkYsIDB4MEEwRCwgMHg1MDcwLCAweDFFMzYsIDB4NTA3MiwgMHgxRTNFLCAweDUwNzMsIDB4MUU0RiwKLSAgICAweDUwNzQsIDB4MEEwOSwgMHg1MDc1LCAweDBBMDgsIDB4NTA3NiwgMHgwQTA1LCAweDUwNzcsIDB4MEEwQSwKLSAgICAweDUwN0EsIDB4MDlGQywgMHg1MDdELCAweDA5RkQsIDB4NTA4MCwgMHgwQkVDLCAweDUwODIsIDB4MjBCQiwKLSAgICAweDUwODMsIDB4MjBCNCwgMHg1MDg1LCAweDBCRTksIDB4NTA4NywgMHgyMEJDLCAweDUwOEIsIDB4MjBCMiwKLSAgICAweDUwOEMsIDB4MjBCNSwgMHg1MDhELCAweDBCRTgsIDB4NTA4RSwgMHgyMEI2LCAweDUwOTEsIDB4MEJFQiwKLSAgICAweDUwOTIsIDB4MjBCQSwgMHg1MDk0LCAweDIwQjAsIDB4NTA5NSwgMHgyMEFGLCAweDUwOTYsIDB4MEJFRCwKLSAgICAweDUwOTgsIDB4MEJFRSwgMHg1MDk5LCAweDBCRUEsIDB4NTA5QSwgMHgwQkVGLCAweDUwOUIsIDB4MjBBRSwKLSAgICAweDUwOUMsIDB4MjBCOSwgMHg1MDlELCAweDIwQjcsIDB4NTA5RSwgMHgyMEIxLCAweDUwQTIsIDB4MEJFNywKLSAgICAweDUwQTMsIDB4MjBCMywgMHg1MEFDLCAweDBEQzUsIDB4NTBBRCwgMHgwREJGLCAweDUwQUUsIDB4MjM2NywKLSAgICAweDUwQUYsIDB4MERDOCwgMHg1MEIwLCAweDIzNkQsIDB4NTBCMSwgMHgyMzcwLCAweDUwQjIsIDB4MERDMSwKLSAgICAweDUwQjMsIDB4MERDMiwgMHg1MEI0LCAweDIzNkEsIDB4NTBCNSwgMHgwREMwLCAweDUwQjYsIDB4MjM3MywKLSAgICAweDUwQjcsIDB4MERDNiwgMHg1MEI4LCAweDIzNzQsIDB4NTBCQSwgMHgyMzZGLCAweDUwQkIsIDB4MERDNywKLSAgICAweDUwQkQsIDB4MjM2NCwgMHg1MEJFLCAweDBEQzQsIDB4NTBCRiwgMHgyMzY1LCAweDUwQzEsIDB4MjM2RSwKLSAgICAweDUwQzIsIDB4MjM2QywgMHg1MEM0LCAweDIzNjgsIDB4NTBDNSwgMHgwREMzLCAweDUwQzYsIDB4MjM2NiwKLSAgICAweDUwQzcsIDB4MERDOSwgMHg1MEM4LCAweDIzNkIsIDB4NTBDOSwgMHgyMzcyLCAweDUwQ0EsIDB4MjM2OSwKLSAgICAweDUwQ0IsIDB4MjM3MSwgMHg1MENFLCAweDBGODgsIDB4NTBDRiwgMHgwRjg1LCAweDUwRDEsIDB4MEY4NiwKLSAgICAweDUwRDMsIDB4MjYxQywgMHg1MEQ0LCAweDI2MTQsIDB4NTBENSwgMHgwRjg0LCAweDUwRDYsIDB4MEY4MSwKLSAgICAweDUwRDcsIDB4MjYxNSwgMHg1MERBLCAweDBGODMsIDB4NTBEQiwgMHgyNjE4LCAweDUwREQsIDB4MjYxQSwKLSAgICAweDUwRTAsIDB4MjYyMSwgMHg1MEUzLCAweDI2MjAsIDB4NTBFNCwgMHgyNjFCLCAweDUwRTUsIDB4MEY4MCwKLSAgICAweDUwRTYsIDB4MjYxMywgMHg1MEU3LCAweDBGN0UsIDB4NTBFOCwgMHgyNjE2LCAweDUwRTksIDB4MEY4OSwKLSAgICAweDUwRUEsIDB4MjYxOSwgMHg1MEVDLCAweDI2MUQsIDB4NTBFRCwgMHgwRjgyLCAweDUwRUUsIDB4MEY3RiwKLSAgICAweDUwRUYsIDB4MjYxRiwgMHg1MEYwLCAweDI2MUUsIDB4NTBGMSwgMHgwRjg3LCAweDUwRjMsIDB4MjYxNywKLSAgICAweDUwRjUsIDB4MTEwNSwgMHg1MEY2LCAweDI4ODMsIDB4NTBGOCwgMHgyODgwLCAweDUwRjksIDB4MTEwNiwKLSAgICAweDUwRkIsIDB4MTEwNCwgMHg1MEZELCAweDI4ODcsIDB4NTBGRSwgMHgyODg0LCAweDUwRkYsIDB4Mjg3RCwKLSAgICAweDUxMDAsIDB4MTEwMywgMHg1MTAyLCAweDExMDcsIDB4NTEwMywgMHgyODdFLCAweDUxMDQsIDB4MTEwMiwKLSAgICAweDUxMDUsIDB4MTEwQSwgMHg1MTA2LCAweDI4ODEsIDB4NTEwNywgMHgyODgyLCAweDUxMDgsIDB4MTEwOCwKLSAgICAweDUxMDksIDB4MTEwOSwgMHg1MTBBLCAweDI4ODgsIDB4NTEwQiwgMHgyODg1LCAweDUxMEMsIDB4Mjg4NiwKLSAgICAweDUxMTAsIDB4MTI4RCwgMHg1MTExLCAweDJCMDQsIDB4NTExMiwgMHgxMjhBLCAweDUxMTMsIDB4MkIwMSwKLSAgICAweDUxMTQsIDB4MTI4QywgMHg1MTE1LCAweDEyOEUsIDB4NTExNywgMHgyQjAyLCAweDUxMTgsIDB4MTI4QiwKLSAgICAweDUxMUEsIDB4MkIwMywgMHg1MTFDLCAweDJCMDAsIDB4NTExRiwgMHgxM0I1LCAweDUxMjAsIDB4MkQzRSwKLSAgICAweDUxMjEsIDB4MTNCNiwgMHg1MTIyLCAweDJEM0MsIDB4NTEyNCwgMHgyRDNELCAweDUxMjUsIDB4MkQzQiwKLSAgICAweDUxMjYsIDB4MkQzQSwgMHg1MTI5LCAweDJEM0YsIDB4NTEyQSwgMHgxM0I0LCAweDUxMkQsIDB4MkYwRiwKLSAgICAweDUxMkUsIDB4MkYxMCwgMHg1MTMwLCAweDI4N0YsIDB4NTEzMSwgMHgyRjBFLCAweDUxMzIsIDB4MTNCNywKLSAgICAweDUxMzMsIDB4MTU3NSwgMHg1MTM0LCAweDMwN0EsIDB4NTEzNSwgMHgzMDdCLCAweDUxMzcsIDB4MTY2OCwKLSAgICAweDUxMzgsIDB4MTY2OSwgMHg1MTM5LCAweDMyQzYsIDB4NTEzQSwgMHgzMkM1LCAweDUxM0IsIDB4MTZCQywKLSAgICAweDUxM0MsIDB4MTZCQiwgMHg1MTNELCAweDM0MEUsIDB4NTEzRiwgMHgwMjVDLCAweDUxNDAsIDB4MDI3NCwKLSAgICAweDUxNDEsIDB4MDJBQSwgMHg1MTQzLCAweDAyQTksIDB4NTE0NCwgMHgwMzAzLCAweDUxNDUsIDB4MDMwMiwKLSAgICAweDUxNDYsIDB4MDM4QSwgMHg1MTQ3LCAweDAzODksIDB4NTE0OCwgMHgwMzhCLCAweDUxNDksIDB4MDM4OCwKLSAgICAweDUxNEIsIDB4MDQzNCwgMHg1MTRDLCAweDA0MzMsIDB4NTE0RCwgMHgwNDM1LCAweDUxNTIsIDB4MDU0NSwKLSAgICAweDUxNTQsIDB4MDU0NCwgMHg1MTU1LCAweDA1NDYsIDB4NTE1NywgMHgwNkJDLCAweDUxNTksIDB4MDExOSwKLSAgICAweDUxNUEsIDB4MUMzMiwgMHg1MTVCLCAweDAxMUEsIDB4NTE1QywgMHgwQTBGLCAweDUxNUQsIDB4MDExQywKLSAgICAweDUxNUUsIDB4MDExQiwgMHg1MTVGLCAweDIwQkQsIDB4NTE2MSwgMHgwMTFELCAweDUxNjIsIDB4MEY4QSwKLSAgICAweDUxNjMsIDB4MDExRSwgMHg1MTY1LCAweDAyNUQsIDB4NTE2NywgMHgwMkFCLCAweDUxNjgsIDB4MDM4QywKLSAgICAweDUxNjksIDB4MDU0NywgMHg1MTZCLCAweDAyNUUsIDB4NTE2QywgMHgwMkFFLCAweDUxNkQsIDB4MDJBQywKLSAgICAweDUxNkUsIDB4MDJBRCwgMHg1MTcxLCAweDAzOEQsIDB4NTE3NSwgMHgwNDM2LCAweDUxNzYsIDB4MDU0OSwKLSAgICAweDUxNzcsIDB4MDU0OCwgMHg1MTc4LCAweDA1NEEsIDB4NTE3QywgMHgwODUyLCAweDUxODAsIDB4MTI4RiwKLSAgICAweDUxODIsIDB4MDIxRCwgMHg1MTg3LCAweDE3NzksIDB4NTE4OCwgMHgzNkI2LCAweDUxODksIDB4MDMwNCwKLSAgICAweDUxOEEsIDB4MDMwNSwgMHg1MThELCAweDAzOEUsIDB4NTE4RiwgMHgxODMzLCAweDUxOTEsIDB4MDZCRSwKLSAgICAweDUxOTIsIDB4MDZCRCwgMHg1MTkzLCAweDFDMzQsIDB4NTE5NCwgMHgxQzMzLCAweDUxOTUsIDB4MEExMCwKLSAgICAweDUxOTYsIDB4MDIxRSwgMHg1MTk3LCAweDAyQUYsIDB4NTE5OCwgMHgxNzgwLCAweDUxOUUsIDB4MTkxMCwKLSAgICAweDUxQTAsIDB4MDZCRiwgMHg1MUEyLCAweDA4NTUsIDB4NTFBNCwgMHgwODUzLCAweDUxQTUsIDB4MDg1NCwKLSAgICAweDUxQUEsIDB4MTI5MCwgMHg1MUFCLCAweDAyMUYsIDB4NTFBQywgMHgwMzA2LCAweDUxQjAsIDB4MDM4RiwKLSAgICAweDUxQjEsIDB4MTdDNiwgMHg1MUI2LCAweDA0MzcsIDB4NTFCNywgMHgwNDM4LCAweDUxQjksIDB4MTgzNCwKLSAgICAweDUxQkMsIDB4MTkxMSwgMHg1MUJELCAweDA1NEIsIDB4NTFCRSwgMHgxOTEyLCAweDUxQzQsIDB4MUMzNiwKLSAgICAweDUxQzUsIDB4MUMzNywgMHg1MUM2LCAweDA4NTgsIDB4NTFDOCwgMHgxQzM4LCAweDUxQ0EsIDB4MUMzNSwKLSAgICAweDUxQ0IsIDB4MDg1OSwgMHg1MUNDLCAweDA4NTcsIDB4NTFDRCwgMHgwODU2LCAweDUxQ0UsIDB4MUMzOSwKLSAgICAweDUxRDAsIDB4MUU1MiwgMHg1MUQ0LCAweDIwQkUsIDB4NTFENywgMHgyMzc1LCAweDUxRDgsIDB4MjYyMiwKLSAgICAweDUxREMsIDB4MTEwQiwgMHg1MURELCAweDEyOTEsIDB4NTFERSwgMHgyQjA1LCAweDUxRTAsIDB4MDI1RiwKLSAgICAweDUxRTEsIDB4MDI2RCwgMHg1MUYwLCAweDBBMTEsIDB4NTFGMSwgMHgwQkYxLCAweDUxRjMsIDB4MEY4QiwKLSAgICAweDUxRjUsIDB4MTc2RSwgMHg1MUY2LCAweDAyQjAsIDB4NTFGOCwgMHgwMzA5LCAweDUxRjksIDB4MDMwNywKLSAgICAweDUxRkEsIDB4MDMwOCwgMHg1MUZELCAweDA1NEMsIDB4NTIwMCwgMHgwMjYwLCAweDUyMDEsIDB4MDI2MSwKLSAgICAweDUyMDIsIDB4MzZCMywgMHg1MjAzLCAweDAyNzUsIDB4NTIwNiwgMHgwMkIxLCAweDUyMDcsIDB4MDJCMiwKLSAgICAweDUyMDgsIDB4MDJCMywgMHg1MjA5LCAweDE3OTcsIDB4NTIwQSwgMHgwMzBBLCAweDUyMEMsIDB4MTc5NiwKLSAgICAweDUyMEUsIDB4MDM5MywgMHg1MjEwLCAweDE3QzgsIDB4NTIxMSwgMHgwMzkxLCAweDUyMTIsIDB4MDM5MiwKLSAgICAweDUyMTMsIDB4MTdDNywgMHg1MjE2LCAweDAzOTQsIDB4NTIxNywgMHgwMzkwLCAweDUyMUMsIDB4MTgzNSwKLSAgICAweDUyMUQsIDB4MDY4QiwgMHg1MjFFLCAweDE4MzYsIDB4NTIyMSwgMHgxODM3LCAweDUyMjQsIDB4MDQzQSwKLSAgICAweDUyMjUsIDB4MDQzOSwgMHg1MjI4LCAweDA0M0QsIDB4NTIyOSwgMHgwNDNCLCAweDUyMkEsIDB4MDQzQywKLSAgICAweDUyMkUsIDB4MDU1MiwgMHg1MjMwLCAweDA1NTEsIDB4NTIzMSwgMHgxOTE3LCAweDUyMzIsIDB4MTkxNCwKLSAgICAweDUyMzMsIDB4MTkxNSwgMHg1MjM1LCAweDE5MTMsIDB4NTIzNiwgMHgwNTUzLCAweDUyMzcsIDB4MDU0RiwKLSAgICAweDUyMzgsIDB4MDU0RSwgMHg1MjNBLCAweDA1NTAsIDB4NTIzQiwgMHgwNTRELCAweDUyNDEsIDB4MDU1NCwKLSAgICAweDUyNDMsIDB4MDZDMSwgMHg1MjQ0LCAweDFBNkQsIDB4NTI0NiwgMHgxOTE2LCAweDUyNDcsIDB4MDZDNiwKLSAgICAweDUyNDksIDB4MUE2RSwgMHg1MjRBLCAweDA2QzIsIDB4NTI0QiwgMHgwNkM1LCAweDUyNEMsIDB4MDZDNCwKLSAgICAweDUyNEQsIDB4MDZDMywgMHg1MjRFLCAweDA2QzAsIDB4NTI1MiwgMHgxQzNDLCAweDUyNTQsIDB4MDg1QywKLSAgICAweDUyNTUsIDB4MUMzRiwgMHg1MjU2LCAweDA4NUEsIDB4NTI1QSwgMHgxQzNCLCAweDUyNUIsIDB4MDg1RCwKLSAgICAweDUyNUMsIDB4MDg1QiwgMHg1MjVELCAweDA4NUUsIDB4NTI1RSwgMHgxQzNELCAweDUyNUYsIDB4MUMzRSwKLSAgICAweDUyNjEsIDB4MUMzQSwgMHg1MjYyLCAweDFDNDAsIDB4NTI2OSwgMHgwQkY1LCAweDUyNkEsIDB4MEExMiwKLSAgICAweDUyNkIsIDB4MUU1MywgMHg1MjZDLCAweDFFNTUsIDB4NTI2RCwgMHgxRTU0LCAweDUyNkUsIDB4MUU1NiwKLSAgICAweDUyNkYsIDB4MEExMywgMHg1MjcyLCAweDBCRjIsIDB4NTI3NCwgMHgwQkYzLCAweDUyNzUsIDB4MEJGNCwKLSAgICAweDUyNzcsIDB4MERDQiwgMHg1Mjc4LCAweDIzNzcsIDB4NTI3QSwgMHgyMzc2LCAweDUyN0IsIDB4MjM3OCwKLSAgICAweDUyN0MsIDB4MjM3OSwgMHg1MjdELCAweDBEQ0MsIDB4NTI3RiwgMHgwRENBLCAweDUyODAsIDB4MjYyMywKLSAgICAweDUyODEsIDB4MjYyNCwgMHg1MjgyLCAweDBGOEQsIDB4NTI4MywgMHgwRjhDLCAweDUyODQsIDB4Mjc3NiwKLSAgICAweDUyODcsIDB4MTEwQywgMHg1Mjg4LCAweDExMEQsIDB4NTI4OSwgMHgxMTBFLCAweDUyOEEsIDB4MTExMCwKLSAgICAweDUyOEIsIDB4Mjg4OSwgMHg1MjhDLCAweDI4OEEsIDB4NTI4RCwgMHgxMTBGLCAweDUyOTEsIDB4MTI5MiwKLSAgICAweDUyOTMsIDB4MTI5MywgMHg1Mjk2LCAweDMwN0MsIDB4NTI5NywgMHgzMkM4LCAweDUyOTgsIDB4MzJDNywKLSAgICAweDUyOTksIDB4MzQwRiwgMHg1MjlCLCAweDAyNjIsIDB4NTI5RiwgMHgwMzBDLCAweDUyQTAsIDB4MDMwQiwKLSAgICAweDUyQTMsIDB4MDM5NSwgMHg1MkE2LCAweDE3QzksIDB4NTJBOSwgMHgwNDNGLCAweDUyQUEsIDB4MDQ0MCwKLSAgICAweDUyQUIsIDB4MDQzRSwgMHg1MkFDLCAweDA0NDEsIDB4NTJBRCwgMHgxODM4LCAweDUyQUUsIDB4MTgzOSwKLSAgICAweDUyQkIsIDB4MDU1NiwgMHg1MkJDLCAweDE5MTgsIDB4NTJCRSwgMHgwNTU1LCAweDUyQzAsIDB4MUE2RiwKLSAgICAweDUyQzEsIDB4MDZDQSwgMHg1MkMyLCAweDFBNzAsIDB4NTJDMywgMHgwNkM5LCAweDUyQzcsIDB4MDZDNywKLSAgICAweDUyQzksIDB4MDZDOCwgMHg1MkNELCAweDFDNDEsIDB4NTJEMiwgMHgwQTE0LCAweDUyRDMsIDB4MUU1OCwKLSAgICAweDUyRDUsIDB4MEExNywgMHg1MkQ2LCAweDFFNTcsIDB4NTJENywgMHgwQUNGLCAweDUyRDgsIDB4MEExNiwKLSAgICAweDUyRDksIDB4MEExNSwgMHg1MkRCLCAweDBCRjgsIDB4NTJERCwgMHgwQkY3LCAweDUyREUsIDB4MEJGNiwKLSAgICAweDUyREYsIDB4MERDRCwgMHg1MkUyLCAweDBERDAsIDB4NTJFMywgMHgwREQxLCAweDUyRTQsIDB4MERDRiwKLSAgICAweDUyRTYsIDB4MERDRSwgMHg1MkU5LCAweDI2MjUsIDB4NTJFQiwgMHgyNjI2LCAweDUyRUYsIDB4Mjg4QywKLSAgICAweDUyRjAsIDB4MTExMSwgMHg1MkYxLCAweDI4OEIsIDB4NTJGMywgMHgxMjk0LCAweDUyRjQsIDB4MkQ0MCwKLSAgICAweDUyRjUsIDB4MTNCOCwgMHg1MkY3LCAweDMwN0QsIDB4NTJGOCwgMHgxNjA5LCAweDUyRjksIDB4MDIyMCwKLSAgICAweDUyRkEsIDB4MDI3NiwgMHg1MkZCLCAweDAyQjQsIDB4NTJGQywgMHgxNzgxLCAweDUyRkUsIDB4MDJCNSwKLSAgICAweDUyRkYsIDB4MDJCNiwgMHg1MzA1LCAweDAzMEQsIDB4NTMwNiwgMHgwMzBFLCAweDUzMDgsIDB4MDM5NiwKLSAgICAweDUzMDksIDB4MTgzQSwgMHg1MzBBLCAweDE5MTksIDB4NTMwQiwgMHgxOTFBLCAweDUzMEQsIDB4MDZDQiwKLSAgICAweDUzMEUsIDB4MUM0MiwgMHg1MzBGLCAweDBBMTksIDB4NTMxMCwgMHgwQTE4LCAweDUzMTEsIDB4MjBDMCwKLSAgICAweDUzMTIsIDB4MjBCRiwgMHg1MzE1LCAweDAyNjMsIDB4NTMxNiwgMHgwMkI3LCAweDUzMTcsIDB4MDMwRiwKLSAgICAweDUzMTksIDB4MEExQSwgMHg1MzFBLCAweDE3NkYsIDB4NTMxQywgMHgxNzk4LCAweDUzMUQsIDB4MDMxMCwKLSAgICAweDUzMUYsIDB4MTdDQiwgMHg1MzIwLCAweDAzOTgsIDB4NTMyMSwgMHgwMzk3LCAweDUzMjIsIDB4MTdDQSwKLSAgICAweDUzMjMsIDB4MDQ0MiwgMHg1MzJBLCAweDA4NUYsIDB4NTMyRCwgMHgxRTU5LCAweDUzMkYsIDB4MEREMiwKLSAgICAweDUzMzAsIDB4MjYyNywgMHg1MzMxLCAweDBGOEUsIDB4NTMzNCwgMHgyQjA2LCAweDUzMzcsIDB4MzFDNywKLSAgICAweDUzMzgsIDB4MDIyMSwgMHg1MzM5LCAweDAyQjgsIDB4NTMzQywgMHgxOTFCLCAweDUzM0QsIDB4MUE3MSwKLSAgICAweDUzM0UsIDB4MEExRCwgMHg1MzNGLCAweDBBMUIsIDB4NTM0MCwgMHgwQTFDLCAweDUzNDEsIDB4MDI2NCwKLSAgICAweDUzNDMsIDB4MDI3NywgMHg1MzQ0LCAweDAxNkIsIDB4NTM0NSwgMHgwMkJCLCAweDUzNDcsIDB4MDJCQSwKLSAgICAweDUzNDgsIDB4MDJCOSwgMHg1MzQ5LCAweDAzMTMsIDB4NTM0QSwgMHgwMzEyLCAweDUzNEMsIDB4MTc5OSwKLSAgICAweDUzNEQsIDB4MTdDQywgMHg1MzUxLCAweDA1NUEsIDB4NTM1MiwgMHgwNTU3LCAweDUzNTMsIDB4MDU1OSwKLSAgICAweDUzNTQsIDB4MDU1OCwgMHg1MzU3LCAweDA2Q0MsIDB4NTM1QSwgMHgwQkY5LCAweDUzNUMsIDB4MDI2NSwKLSAgICAweDUzNUUsIDB4MDJCQywgMHg1MzYwLCAweDAzMTUsIDB4NTM2MSwgMHgwMzE0LCAweDUzNjMsIDB4MTgzQiwKLSAgICAweDUzNjYsIDB4MDU1QiwgMHg1MzY5LCAweDAyMjIsIDB4NTM2QywgMHgxNzgyLCAweDUzNkUsIDB4MDMxNywKLSAgICAweDUzNkYsIDB4MDMxNiwgMHg1MzcwLCAweDAzOTksIDB4NTM3MSwgMHgwMzlBLCAweDUzNzIsIDB4MTgzQywKLSAgICAweDUzNzMsIDB4MDQ0MywgMHg1Mzc1LCAweDA0NDQsIDB4NTM3NywgMHgwNTVDLCAweDUzNzgsIDB4MDU1RCwKLSAgICAweDUzNzksIDB4MDU1RSwgMHg1MzdCLCAweDA2Q0QsIDB4NTM3QywgMHgxQTcyLCAweDUzN0YsIDB4MDg2MCwKLSAgICAweDUzODIsIDB4MTc3MCwgMHg1Mzg0LCAweDAyQkQsIDB4NTM4QSwgMHgxN0NELCAweDUzOEUsIDB4MTgzRCwKLSAgICAweDUzOEYsIDB4MTgzRSwgMHg1MzkyLCAweDE5MUMsIDB4NTM5NCwgMHgxOTFELCAweDUzOTYsIDB4MUE3NCwKLSAgICAweDUzOTcsIDB4MUE3MywgMHg1Mzk4LCAweDFBNzYsIDB4NTM5OSwgMHgxQTc1LCAweDUzOUEsIDB4MDZDRSwKLSAgICAweDUzOUMsIDB4MUU1QSwgMHg1MzlELCAweDA4NjIsIDB4NTM5RSwgMHgxQzQzLCAweDUzOUYsIDB4MDg2MSwKLSAgICAweDUzQTQsIDB4MjBDMSwgMHg1M0E1LCAweDBCRkEsIDB4NTNBNywgMHgyMEMyLCAweDUzQUMsIDB4MjYyOCwKLSAgICAweDUzQUQsIDB4MEY4RiwgMHg1M0IyLCAweDExMTIsIDB4NTNCNCwgMHgzMDdFLCAweDUzQjYsIDB4MDIyMywKLSAgICAweDUzQjksIDB4MTc4MywgMHg1M0JCLCAweDAzMTgsIDB4NTNDMywgMHgwQTFFLCAweDUzQzgsIDB4MDI2NiwKLSAgICAweDUzQzksIDB4MDI3OCwgMHg1M0NBLCAweDAyQkYsIDB4NTNDQiwgMHgwMkJFLCAweDUzQ0QsIDB4MDJDMCwKLSAgICAweDUzRDQsIDB4MDU2MCwgMHg1M0Q2LCAweDA1NUYsIDB4NTNENywgMHgwNTYxLCAweDUzREIsIDB4MDZDRiwKLSAgICAweDUzREYsIDB4MDg2MywgMHg1M0UxLCAweDJCMDcsIDB4NTNFMiwgMHgxNEM5LCAweDUzRTMsIDB4MDI3OSwKLSAgICAweDUzRTQsIDB4MDMxQSwgMHg1M0U1LCAweDAzMjksIDB4NTNFNiwgMHgwMzI0LCAweDUzRTgsIDB4MDMxRiwKLSAgICAweDUzRTksIDB4MDMxRSwgMHg1M0VBLCAweDAzMjUsIDB4NTNFQiwgMHgwMzIzLCAweDUzRUMsIDB4MDMxQywKLSAgICAweDUzRUQsIDB4MDMyQSwgMHg1M0VFLCAweDAzMUQsIDB4NTNFRiwgMHgwMzE5LCAweDUzRjAsIDB4MDMyOCwKLSAgICAweDUzRjEsIDB4MDMyNywgMHg1M0YyLCAweDAzMjYsIDB4NTNGMywgMHgwMzFCLCAweDUzRjUsIDB4MDMyMiwKLSAgICAweDUzRjgsIDB4MDMyMSwgMHg1M0ZCLCAweDAzMkIsIDB4NTNGQywgMHgwMzIwLCAweDU0MDEsIDB4MDNBMCwKLSAgICAweDU0MDMsIDB4MDNBNiwgMHg1NDA0LCAweDAzQTIsIDB4NTQwNiwgMHgwM0E4LCAweDU0MDcsIDB4MTdDRSwKLSAgICAweDU0MDgsIDB4MDNBNSwgMHg1NDA5LCAweDAzOUIsIDB4NTQwQSwgMHgwMzlFLCAweDU0MEIsIDB4MDNBMSwKLSAgICAweDU0MEMsIDB4MDM5RCwgMHg1NDBELCAweDAzQTQsIDB4NTQwRSwgMHgwM0E3LCAweDU0MEYsIDB4MDM5QywKLSAgICAweDU0MTAsIDB4MDM5RiwgMHg1NDExLCAweDAzQTMsIDB4NTQxMiwgMHgwM0E5LCAweDU0MTgsIDB4MTg0NywKLSAgICAweDU0MTksIDB4MTg0NCwgMHg1NDFCLCAweDA0NTEsIDB4NTQxQywgMHgxODQ1LCAweDU0MUQsIDB4MDQ0NSwKLSAgICAweDU0MUUsIDB4MDQ0NywgMHg1NDFGLCAweDA0NUYsIDB4NTQyMCwgMHgwNDVBLCAweDU0MjQsIDB4MTg0QywKLSAgICAweDU0MjUsIDB4MTg0NiwgMHg1NDI2LCAweDA0NDksIDB4NTQyNywgMHgwNDRCLCAweDU0MjgsIDB4MTg0QiwKLSAgICAweDU0MjksIDB4MDQ1MiwgMHg1NDJBLCAweDE4NDEsIDB4NTQyQiwgMHgwNDVFLCAweDU0MkMsIDB4MDQ2MCwKLSAgICAweDU0MkQsIDB4MDQ0NiwgMHg1NDJFLCAweDA0NTcsIDB4NTQzMCwgMHgxODNGLCAweDU0MzEsIDB4MDQ1RCwKLSAgICAweDU0MzMsIDB4MDQ0RSwgMHg1NDM1LCAweDA0NTgsIDB4NTQzNiwgMHgwNDU5LCAweDU0MzcsIDB4MTg0MCwKLSAgICAweDU0MzgsIDB4MDQ1NiwgMHg1NDM5LCAweDA0NTQsIDB4NTQzQiwgMHgwNDU1LCAweDU0M0MsIDB4MDQ1QiwKLSAgICAweDU0M0QsIDB4MTg0OCwgMHg1NDNFLCAweDA0NDgsIDB4NTQ0MCwgMHgwNDVDLCAweDU0NDEsIDB4MTg0QSwKLSAgICAweDU0NDIsIDB4MDQ1MCwgMHg1NDQzLCAweDA0NEQsIDB4NTQ0NSwgMHgxODQzLCAweDU0NDYsIDB4MDQ0QywKLSAgICAweDU0NDcsIDB4MTg0RCwgMHg1NDQ4LCAweDA0NEYsIDB4NTQ0QSwgMHgwNDUzLCAweDU0NEUsIDB4MDQ0QSwKLSAgICAweDU0NEYsIDB4MTg0OSwgMHg1NDU0LCAweDE4NDIsIDB4NTQ2MCwgMHgxOTJFLCAweDU0NjEsIDB4MTkyRCwKLSAgICAweDU0NjIsIDB4MDU3MywgMHg1NDYzLCAweDE5MzAsIDB4NTQ2NCwgMHgxOTMyLCAweDU0NjUsIDB4MTkyNywKLSAgICAweDU0NjYsIDB4MTkyQSwgMHg1NDY3LCAweDE5MzEsIDB4NTQ2OCwgMHgwNTc0LCAweDU0NkIsIDB4MTkyNCwKLSAgICAweDU0NkMsIDB4MTkyOCwgMHg1NDZGLCAweDE5MkMsIDB4NTQ3MCwgMHgxQTg1LCAweDU0NzEsIDB4MDU2RiwKLSAgICAweDU0NzIsIDB4MUE4OSwgMHg1NDczLCAweDA1NjIsIDB4NTQ3NCwgMHgxOTI5LCAweDU0NzUsIDB4MDU2MywKLSAgICAweDU0NzYsIDB4MDU3MCwgMHg1NDc3LCAweDA1NjksIDB4NTQ3OCwgMHgwNTY1LCAweDU0N0EsIDB4MTkyNSwKLSAgICAweDU0N0IsIDB4MDU2OCwgMHg1NDdDLCAweDA1NkQsIDB4NTQ3RCwgMHgwNTc2LCAweDU0N0UsIDB4MTkyNiwKLSAgICAweDU0N0YsIDB4MTkxRiwgMHg1NDgwLCAweDA1NjcsIDB4NTQ4MSwgMHgxOTIwLCAweDU0ODIsIDB4MTkyMiwKLSAgICAweDU0ODQsIDB4MDU2QSwgMHg1NDg2LCAweDA1NkMsIDB4NTQ4NywgMHgxOTFFLCAweDU0ODgsIDB4MTkyMywKLSAgICAweDU0OEIsIDB4MDU3NSwgMHg1NDhDLCAweDA1NzEsIDB4NTQ4RCwgMHgxOTJCLCAweDU0OEUsIDB4MDU3NywKLSAgICAweDU0OTAsIDB4MDU2RSwgMHg1NDkxLCAweDE5MjEsIDB4NTQ5MiwgMHgwNTZCLCAweDU0OTUsIDB4MDU2NiwKLSAgICAweDU0OTYsIDB4MDU2NCwgMHg1NDk4LCAweDE5MkYsIDB4NTQ5QSwgMHgwNTcyLCAweDU0QTAsIDB4MUE4NCwKLSAgICAweDU0QTEsIDB4MUE3OCwgMHg1NEEyLCAweDFBODcsIDB4NTRBNSwgMHgxQTdBLCAweDU0QTYsIDB4MDZENiwKLSAgICAweDU0QTcsIDB4MDZFNCwgMHg1NEE4LCAweDA2RDIsIDB4NTRBOSwgMHgwNkUzLCAweDU0QUEsIDB4MDZEQiwKLSAgICAweDU0QUIsIDB4MDZFMCwgMHg1NEFDLCAweDA2RDAsIDB4NTRBRCwgMHgxQTc5LCAweDU0QUUsIDB4MUE3RiwKLSAgICAweDU0QUYsIDB4MDZERiwgMHg1NEIwLCAweDFBOEIsIDB4NTRCMSwgMHgwNkUxLCAweDU0QjMsIDB4MDZENywKLSAgICAweDU0QjYsIDB4MUE4MSwgMHg1NEI3LCAweDFBN0UsIDB4NTRCOCwgMHgwNkQ1LCAweDU0QkEsIDB4MUE3NywKLSAgICAweDU0QkIsIDB4MDZFMiwgMHg1NEJDLCAweDFBODYsIDB4NTRCRCwgMHgwNkRBLCAweDU0QkUsIDB4MUE4OCwKLSAgICAweDU0QkYsIDB4MDZFNSwgMHg1NEMwLCAweDA2RDEsIDB4NTRDMSwgMHgwNkRDLCAweDU0QzIsIDB4MDZEOSwKLSAgICAweDU0QzMsIDB4MUE3QywgMHg1NEM0LCAweDA2REQsIDB4NTRDNSwgMHgxQTgyLCAweDU0QzYsIDB4MUE4MywKLSAgICAweDU0QzcsIDB4MDZEOCwgMHg1NEM4LCAweDA2REUsIDB4NTRDOSwgMHgwNkQ0LCAweDU0Q0UsIDB4MDZEMywKLSAgICAweDU0Q0YsIDB4MUE3QiwgMHg1NEQ2LCAweDFBODAsIDB4NTRERSwgMHgxQThBLCAweDU0RTAsIDB4MUM1NywKLSAgICAweDU0RTEsIDB4MDg3MCwgMHg1NEUyLCAweDFDNDUsIDB4NTRFNCwgMHgxQzRBLCAweDU0RTUsIDB4MDg2OSwKLSAgICAweDU0RTYsIDB4MDg3NCwgMHg1NEU3LCAweDFDNDgsIDB4NTRFOCwgMHgwODY0LCAweDU0RTksIDB4MDg2RSwKLSAgICAweDU0RUEsIDB4MDg3MywgMHg1NEVCLCAweDFDNEYsIDB4NTRFRCwgMHgwODZGLCAweDU0RUUsIDB4MDg3MiwKLSAgICAweDU0RjEsIDB4MUM1MiwgMHg1NEYyLCAweDA4NkEsIDB4NTRGMywgMHgxQzQ5LCAweDU0RjcsIDB4MUM1NSwKLSAgICAweDU0RjgsIDB4MUM1NiwgMHg1NEZBLCAweDA4NkMsIDB4NTRGQiwgMHgxQzU0LCAweDU0RkMsIDB4MDg2OCwKLSAgICAweDU0RkQsIDB4MDg3NywgMHg1NEZGLCAweDFDNEMsIDB4NTUwMSwgMHgwODY2LCAweDU1MDMsIDB4MUM1OSwKLSAgICAweDU1MDQsIDB4MUM0RCwgMHg1NTA1LCAweDFDNTEsIDB4NTUwNiwgMHgwODZCLCAweDU1MDcsIDB4MDg3NiwKLSAgICAweDU1MDgsIDB4MUM0RSwgMHg1NTA5LCAweDA4NzEsIDB4NTUwQSwgMHgxQzUzLCAweDU1MEIsIDB4MUM1QSwKLSAgICAweDU1MEMsIDB4MUU2OSwgMHg1NTBFLCAweDFDNTgsIDB4NTUwRiwgMHgwODc4LCAweDU1MTAsIDB4MDg2NSwKLSAgICAweDU1MTEsIDB4MUM1MCwgMHg1NTEyLCAweDFDNDcsIDB4NTUxNCwgMHgwODZELCAweDU1MTcsIDB4MUM0NiwKLSAgICAweDU1MUEsIDB4MUM0QiwgMHg1NTI2LCAweDFDNDQsIDB4NTUyNywgMHgwODc1LCAweDU1MkEsIDB4MUU2MSwKLSAgICAweDU1MkMsIDB4MEEzMSwgMHg1NTJELCAweDFFNkYsIDB4NTUyRSwgMHgwQTJGLCAweDU1MkYsIDB4MEEyQywKLSAgICAweDU1MzAsIDB4MUU2NiwgMHg1NTMxLCAweDBBMjgsIDB4NTUzMiwgMHgxRTZBLCAweDU1MzMsIDB4MEEzMywKLSAgICAweDU1MzQsIDB4MUU2MCwgMHg1NTM1LCAweDFFNjUsIDB4NTUzNiwgMHgxRTY0LCAweDU1MzcsIDB4MDg2NywKLSAgICAweDU1MzgsIDB4MEEyRSwgMHg1NTM5LCAweDFFNkQsIDB4NTUzQiwgMHgxRTcwLCAweDU1M0MsIDB4MUU1RCwKLSAgICAweDU1M0UsIDB4MEMwQywgMHg1NTQwLCAweDFFNzEsIDB4NTU0MSwgMHgwQTM0LCAweDU1NDMsIDB4MEEyNiwKLSAgICAweDU1NDQsIDB4MEEyMywgMHg1NTQ1LCAweDFFNjgsIDB4NTU0NiwgMHgwQTIwLCAweDU1NDgsIDB4MUU2RSwKLSAgICAweDU1NEEsIDB4MEEyNywgMHg1NTRCLCAweDFFNzIsIDB4NTU0RCwgMHgxRTVFLCAweDU1NEUsIDB4MUU2QywKLSAgICAweDU1NEYsIDB4MEEyQSwgMHg1NTUwLCAweDFFNUYsIDB4NTU1MSwgMHgxRTYyLCAweDU1NTIsIDB4MUU2NywKLSAgICAweDU1NTUsIDB4MEEyQiwgMHg1NTU2LCAweDBBMjksIDB4NTU1NywgMHgwQTM1LCAweDU1NUMsIDB4MEEzMCwKLSAgICAweDU1NUUsIDB4MEEyNCwgMHg1NTVGLCAweDBBQkMsIDB4NTU2MSwgMHgwQTI1LCAweDU1NjIsIDB4MUU2MywKLSAgICAweDU1NjMsIDB4MEEzMiwgMHg1NTY0LCAweDBBMkQsIDB4NTU2NSwgMHgxRTZCLCAweDU1NjYsIDB4MEEyMiwKLSAgICAweDU1NkEsIDB4MEEyMSwgMHg1NTc1LCAweDFFNUIsIDB4NTU3NiwgMHgxRTVDLCAweDU1NzcsIDB4MjBDNywKLSAgICAweDU1N0IsIDB4MEJGQiwgMHg1NTdDLCAweDBCRkUsIDB4NTU3RCwgMHgyMEQyLCAweDU1N0UsIDB4MEMxMiwKLSAgICAweDU1N0YsIDB4MjBENSwgMHg1NTgwLCAweDBCRkMsIDB4NTU4MSwgMHgyMENFLCAweDU1ODIsIDB4MEMwMiwKLSAgICAweDU1ODMsIDB4MEMwOCwgMHg1NTg0LCAweDBEMUIsIDB4NTU4NywgMHgwQzA2LCAweDU1ODgsIDB4MjBDQiwKLSAgICAweDU1ODksIDB4MEMxMywgMHg1NThBLCAweDBCRkYsIDB4NTU4QiwgMHgwQzA3LCAweDU1OEMsIDB4MjBEMywKLSAgICAweDU1OEQsIDB4MjM4NywgMHg1NThFLCAweDIwRDgsIDB4NTU4RiwgMHgyMENDLCAweDU1OTEsIDB4MjBDMywKLSAgICAweDU1OTIsIDB4MjBEMCwgMHg1NTkzLCAweDIwQ0EsIDB4NTU5NCwgMHgwQzA1LCAweDU1OTUsIDB4MjBENiwKLSAgICAweDU1OTgsIDB4MEMwMSwgMHg1NTk5LCAweDBDMTUsIDB4NTU5QSwgMHgwQzBFLCAweDU1OUMsIDB4MEMwMywKLSAgICAweDU1OUQsIDB4MEMwMCwgMHg1NTlGLCAweDBDMEIsIDB4NTVBMSwgMHgyMEQ3LCAweDU1QTIsIDB4MjBDOSwKLSAgICAweDU1QTMsIDB4MjBDRiwgMHg1NUE0LCAweDIwRDEsIDB4NTVBNSwgMHgyMEM1LCAweDU1QTYsIDB4MjBENCwKLSAgICAweDU1QTcsIDB4MEJGRCwgMHg1NUE4LCAweDIwQzQsIDB4NTVBQSwgMHgwQzA0LCAweDU1QUIsIDB4MEMxNCwKLSAgICAweDU1QUMsIDB4MEMxMCwgMHg1NUFELCAweDIwQzYsIDB4NTVBRSwgMHgwQzBBLCAweDU1QjEsIDB4MEMxMSwKLSAgICAweDU1QjIsIDB4MEMwRCwgMHg1NUIzLCAweDBDMDksIDB4NTVCNSwgMHgyMENELCAweDU1QkIsIDB4MEMwRiwKLSAgICAweDU1QkYsIDB4MjM4NSwgMHg1NUMwLCAweDIzODEsIDB4NTVDMiwgMHgyMzkwLCAweDU1QzMsIDB4MjM3QSwKLSAgICAweDU1QzQsIDB4MjM4MywgMHg1NUM1LCAweDBERTAsIDB4NTVDNiwgMHgwREUxLCAweDU1QzcsIDB4MEREOSwKLSAgICAweDU1QzgsIDB4MjM4QywgMHg1NUM5LCAweDBERTMsIDB4NTVDQSwgMHgyMzdGLCAweDU1Q0IsIDB4MjM3RSwKLSAgICAweDU1Q0MsIDB4MjM3QywgMHg1NUNELCAweDIzOEUsIDB4NTVDRSwgMHgwREQ3LCAweDU1Q0YsIDB4MjM4OCwKLSAgICAweDU1RDAsIDB4MjM3RCwgMHg1NUQxLCAweDBEREEsIDB4NTVEMiwgMHgyMzg2LCAweDU1RDMsIDB4MERENSwKLSAgICAweDU1RDQsIDB4MjM4MiwgMHg1NUQ1LCAweDIzODksIDB4NTVENiwgMHgyMzhCLCAweDU1RDksIDB4MjM4RiwKLSAgICAweDU1REEsIDB4MERERSwgMHg1NURCLCAweDIzN0IsIDB4NTVEQywgMHgwREQ4LCAweDU1REQsIDB4MjM4MCwKLSAgICAweDU1REYsIDB4MEREMywgMHg1NUUxLCAweDBEREYsIDB4NTVFMiwgMHgyMzhBLCAweDU1RTMsIDB4MEREQiwKLSAgICAweDU1RTQsIDB4MEREQywgMHg1NUU1LCAweDBERTIsIDB4NTVFNiwgMHgwREQ2LCAweDU1RTcsIDB4MDExRiwKLSAgICAweDU1RTgsIDB4MERENCwgMHg1NUU5LCAweDIzODQsIDB4NTVFRiwgMHgwRERELCAweDU1RjIsIDB4MjM4RCwKLSAgICAweDU1RjYsIDB4MEY5RiwgMHg1NUY3LCAweDBGOUEsIDB4NTVGOSwgMHgyNjM3LCAweDU1RkEsIDB4MjYzMywKLSAgICAweDU1RkMsIDB4MjYyRCwgMHg1NUZELCAweDBGOTQsIDB4NTVGRSwgMHgwRjkwLCAweDU1RkYsIDB4MjYzNiwKLSAgICAweDU2MDAsIDB4MEY5MSwgMHg1NjAxLCAweDI2MzAsIDB4NTYwMiwgMHgyNjMyLCAweDU2MDQsIDB4MjYzNSwKLSAgICAweDU2MDYsIDB4MEY5NiwgMHg1NjA4LCAweDBGOUQsIDB4NTYwOSwgMHgwRjk3LCAweDU2MEMsIDB4MjYyQiwKLSAgICAweDU2MEQsIDB4MEY5OCwgMHg1NjBFLCAweDBGOTksIDB4NTYwRiwgMHgyNjJFLCAweDU2MTAsIDB4MEY5RSwKLSAgICAweDU2MTIsIDB4MjYyQywgMHg1NjEzLCAweDI2MzEsIDB4NTYxNCwgMHgwRjk1LCAweDU2MTUsIDB4MjYyQSwKLSAgICAweDU2MTYsIDB4MEY5QiwgMHg1NjE3LCAweDBGOTMsIDB4NTYxQiwgMHgwRjkyLCAweDU2MUMsIDB4MjYyRiwKLSAgICAweDU2MUQsIDB4MjYzNCwgMHg1NjFGLCAweDBGOUMsIDB4NTYyNywgMHgyNjI5LCAweDU2MjksIDB4MTExOSwKLSAgICAweDU2MkEsIDB4Mjg5RCwgMHg1NjJDLCAweDI4OUEsIDB4NTYyRSwgMHgxMTEzLCAweDU2MkYsIDB4MTExRiwKLSAgICAweDU2MzAsIDB4MTEyMCwgMHg1NjMyLCAweDExMTYsIDB4NTYzMywgMHgyODk4LCAweDU2MzQsIDB4MTExOCwKLSAgICAweDU2MzUsIDB4Mjg5MCwgMHg1NjM2LCAweDExMUUsIDB4NTYzOCwgMHgyODlDLCAweDU2MzksIDB4MTExNSwKLSAgICAweDU2M0EsIDB4Mjg5RSwgMHg1NjNCLCAweDExMTQsIDB4NTYzRCwgMHgyODk5LCAweDU2M0UsIDB4Mjg5QiwKLSAgICAweDU2M0YsIDB4MTExNywgMHg1NjQwLCAweDI4OTcsIDB4NTY0MSwgMHgyODkxLCAweDU2NDIsIDB4Mjg4RSwKLSAgICAweDU2NDUsIDB4MjBDOCwgMHg1NjQ2LCAweDI4OTQsIDB4NTY0OCwgMHgyODhELCAweDU2NDksIDB4Mjg5MywKLSAgICAweDU2NEEsIDB4Mjg5MiwgMHg1NjRDLCAweDI4OEYsIDB4NTY0RSwgMHgxMTFCLCAweDU2NTMsIDB4MTExQSwKLSAgICAweDU2NTcsIDB4MTExQywgMHg1NjU4LCAweDI4OTUsIDB4NTY1OSwgMHgxMjk1LCAweDU2NUEsIDB4Mjg5NiwKLSAgICAweDU2NUUsIDB4MkIxMCwgMHg1NjYwLCAweDJCMDksIDB4NTY2MiwgMHgxMkExLCAweDU2NjMsIDB4MkIwRCwKLSAgICAweDU2NjQsIDB4MTI5OSwgMHg1NjY1LCAweDEyOUQsIDB4NTY2NiwgMHgyQjBDLCAweDU2NjgsIDB4MTI5QywKLSAgICAweDU2NjksIDB4MTI5OCwgMHg1NjZBLCAweDEyOUIsIDB4NTY2QiwgMHgxMjk2LCAweDU2NkMsIDB4MTJBMCwKLSAgICAweDU2NkQsIDB4MkIwRSwgMHg1NjZFLCAweDJCMEEsIDB4NTY2RiwgMHgxMjlGLCAweDU2NzAsIDB4MkIwOCwKLSAgICAweDU2NzEsIDB4MTI5RSwgMHg1NjcyLCAweDJCMEYsIDB4NTY3MywgMHgyQjBCLCAweDU2NzQsIDB4MTExRCwKLSAgICAweDU2NzYsIDB4MTJBMiwgMHg1Njc3LCAweDJCMTEsIDB4NTY3OCwgMHgxMjlBLCAweDU2NzksIDB4MTI5NywKLSAgICAweDU2N0UsIDB4MkQ0NywgMHg1NjdGLCAweDJENDksIDB4NTY4MCwgMHgxM0JBLCAweDU2ODEsIDB4MkQ0QSwKLSAgICAweDU2ODIsIDB4MkQ0OCwgMHg1NjgzLCAweDJENDYsIDB4NTY4NCwgMHgyRDQ1LCAweDU2ODUsIDB4MTNCQywKLSAgICAweDU2ODYsIDB4MkQ0NCwgMHg1Njg3LCAweDEzQkQsIDB4NTY4QywgMHgyRDQyLCAweDU2OEQsIDB4MkQ0MywKLSAgICAweDU2OEUsIDB4MTNCOSwgMHg1NjhGLCAweDEzQkUsIDB4NTY5MCwgMHgxM0JCLCAweDU2OTMsIDB4MkQ0MSwKLSAgICAweDU2OTUsIDB4MTRDQSwgMHg1Njk3LCAweDJGMTMsIDB4NTY5OCwgMHgyRjExLCAweDU2OTksIDB4MkYxNiwKLSAgICAweDU2OUEsIDB4MkYxNCwgMHg1NjlDLCAweDJGMTIsIDB4NTY5RCwgMHgyRjE1LCAweDU2QTUsIDB4MTU3NiwKLSAgICAweDU2QTYsIDB4MzA4MSwgMHg1NkE3LCAweDMwODIsIDB4NTZBOCwgMHgxNTc3LCAweDU2QUEsIDB4MzA4MywKLSAgICAweDU2QUIsIDB4MzA3RiwgMHg1NkFDLCAweDMwODQsIDB4NTZBRCwgMHgzMDgwLCAweDU2QUUsIDB4MTRDQiwKLSAgICAweDU2QjIsIDB4MzFDOCwgMHg1NkIzLCAweDMxQ0EsIDB4NTZCNCwgMHgxNjBDLCAweDU2QjUsIDB4MzFDOSwKLSAgICAweDU2QjYsIDB4MTYwQiwgMHg1NkI3LCAweDE2MEEsIDB4NTZCQywgMHgxNjBELCAweDU2QkQsIDB4MzJDQSwKLSAgICAweDU2QkUsIDB4MzJDQiwgMHg1NkMwLCAweDE2NkIsIDB4NTZDMSwgMHgxNjZBLCAweDU2QzIsIDB4MTY2QywKLSAgICAweDU2QzMsIDB4MzJDOSwgMHg1NkM1LCAweDMzNzksIDB4NTZDNiwgMHgzMzc4LCAweDU2QzgsIDB4MTZCRCwKLSAgICAweDU2QzksIDB4MTZCRiwgMHg1NkNBLCAweDE2QkUsIDB4NTZDQiwgMHgzMzdBLCAweDU2Q0MsIDB4MTZGNiwKLSAgICAweDU2Q0QsIDB4MzQ4MSwgMHg1NkQxLCAweDE3MUYsIDB4NTZEMywgMHgzNDgwLCAweDU2RDQsIDB4MzRDOSwKLSAgICAweDU2RDcsIDB4MTc3NSwgMHg1NkRBLCAweDAzMkQsIDB4NTZEQiwgMHgwMzJDLCAweDU2REQsIDB4MDNBQywKLSAgICAweDU2REUsIDB4MDNBQiwgMHg1NkRGLCAweDE3RDAsIDB4NTZFMCwgMHgwM0FBLCAweDU2RTEsIDB4MTdDRiwKLSAgICAweDU2RTQsIDB4MDQ2MywgMHg1NkU1LCAweDE4NTAsIDB4NTZFNywgMHgxODRGLCAweDU2RUEsIDB4MDQ2MSwKLSAgICAweDU2RUIsIDB4MDQ2NCwgMHg1NkVFLCAweDE4NEUsIDB4NTZGMCwgMHgwNDYyLCAweDU2RjcsIDB4MTkzMywKLSAgICAweDU2RjksIDB4MTkzNCwgMHg1NkZBLCAweDA1NzgsIDB4NTZGRiwgMHgwNkU2LCAweDU3MDEsIDB4MUM1QiwKLSAgICAweDU3MDIsIDB4MUM1QywgMHg1NzAzLCAweDA4NzksIDB4NTcwNCwgMHgwODdBLCAweDU3MDcsIDB4MUU3NCwKLSAgICAweDU3MDgsIDB4MEEzNiwgMHg1NzA5LCAweDBBMzgsIDB4NTcwQSwgMHgxRTczLCAweDU3MEIsIDB4MEEzNywKLSAgICAweDU3MEMsIDB4MjBEOSwgMHg1NzBELCAweDBDMTYsIDB4NTcxMiwgMHgwREU0LCAweDU3MTMsIDB4MERFNSwKLSAgICAweDU3MTQsIDB4MjM5MSwgMHg1NzE2LCAweDBGQTEsIDB4NTcxOCwgMHgwRkEwLCAweDU3MUEsIDB4Mjg5RiwKLSAgICAweDU3MUIsIDB4MkIxMywgMHg1NzFDLCAweDJCMTIsIDB4NTcxRSwgMHgzNTA1LCAweDU3MUYsIDB4MDI3QSwKLSAgICAweDU3MjAsIDB4MTc4NCwgMHg1NzIyLCAweDE3OUEsIDB4NTcyMywgMHgxNzlCLCAweDU3MjgsIDB4MDNBRiwKLSAgICAweDU3MjksIDB4MDNCMywgMHg1NzJBLCAweDE3RDIsIDB4NTcyQywgMHgwM0IxLCAweDU3MkQsIDB4MDNCMCwKLSAgICAweDU3MkUsIDB4MTdEMSwgMHg1NzJGLCAweDAzQjIsIDB4NTczMCwgMHgwM0FFLCAweDU3MzMsIDB4MDNBRCwKLSAgICAweDU3MzQsIDB4MTdEMywgMHg1NzNCLCAweDA0NkUsIDB4NTczRSwgMHgwNDZCLCAweDU3NDAsIDB4MDQ2NywKLSAgICAweDU3NDEsIDB4MTg1MSwgMHg1NzQ1LCAweDE4NTIsIDB4NTc0NywgMHgwNDY5LCAweDU3NDksIDB4MTg1NCwKLSAgICAweDU3NEEsIDB4MDQ2NSwgMHg1NzRCLCAweDE4NTUsIDB4NTc0QywgMHgxODUzLCAweDU3NEQsIDB4MDQ2OCwKLSAgICAweDU3NEUsIDB4MDQ2QSwgMHg1NzRGLCAweDA0NkQsIDB4NTc1MCwgMHgwNDZDLCAweDU3NTEsIDB4MDQ2NiwKLSAgICAweDU3NTIsIDB4MTg1NiwgMHg1NzYxLCAweDA1N0QsIDB4NTc2MiwgMHgxOTQxLCAweDU3NjQsIDB4MDU3RiwKLSAgICAweDU3NjYsIDB4MDU3RSwgMHg1NzY4LCAweDE5NDIsIDB4NTc2OSwgMHgwNTdDLCAweDU3NkEsIDB4MDU3QiwKLSAgICAweDU3NkIsIDB4MTkzOCwgMHg1NzZELCAweDE5MzcsIDB4NTc2RiwgMHgxOTM1LCAweDU3NzAsIDB4MTkzQSwKLSAgICAweDU3NzEsIDB4MTkzOSwgMHg1NzcyLCAweDE5MzYsIDB4NTc3MywgMHgxOTNGLCAweDU3NzQsIDB4MTk0MCwKLSAgICAweDU3NzUsIDB4MTkzRCwgMHg1Nzc2LCAweDE5M0IsIDB4NTc3NywgMHgwNTdBLCAweDU3N0IsIDB4MTkzRSwKLSAgICAweDU3N0MsIDB4MDU4MCwgMHg1NzdELCAweDE5NDMsIDB4NTc4MCwgMHgxOTNDLCAweDU3ODIsIDB4MDZFNywKLSAgICAweDU3ODMsIDB4MDU3OSwgMHg1NzhCLCAweDA2RTgsIDB4NTc4QywgMHgxQTkwLCAweDU3OEYsIDB4MUE5NiwKLSAgICAweDU3OTMsIDB4MDZFRSwgMHg1Nzk0LCAweDFBOTQsIDB4NTc5NSwgMHgxQTlBLCAweDU3OTcsIDB4MUE5MSwKLSAgICAweDU3OTgsIDB4MUE5NSwgMHg1Nzk5LCAweDFBOTcsIDB4NTc5QSwgMHgxQTk5LCAweDU3OUIsIDB4MUE5MywKLSAgICAweDU3OUQsIDB4MUE5MiwgMHg1NzlFLCAweDFBOEQsIDB4NTc5RiwgMHgxQThFLCAweDU3QTAsIDB4MDZFOSwKLSAgICAweDU3QTIsIDB4MDZFQiwgMHg1N0EzLCAweDA2RUEsIDB4NTdBNCwgMHgxQThGLCAweDU3QTUsIDB4MUE5OCwKLSAgICAweDU3QUUsIDB4MDZFRCwgMHg1N0I1LCAweDFBOEMsIDB4NTdCNiwgMHgxQzY2LCAweDU3QjgsIDB4MUM2NSwKLSAgICAweDU3QjksIDB4MUM2QSwgMHg1N0JBLCAweDFDNjEsIDB4NTdCQywgMHgxQzY0LCAweDU3QkQsIDB4MUM2MywKLSAgICAweDU3QkYsIDB4MUM2NywgMHg1N0MxLCAweDFDNkIsIDB4NTdDMiwgMHgwODdCLCAweDU3QzMsIDB4MDg3RSwKLSAgICAweDU3QzYsIDB4MUM2MiwgMHg1N0M3LCAweDFDNjgsIDB4NTdDQiwgMHgwODdELCAweDU3Q0MsIDB4MUM1RCwKLSAgICAweDU3Q0UsIDB4MDZFQywgMHg1N0NGLCAweDFFODIsIDB4NTdEMCwgMHgxQzY5LCAweDU3RDIsIDB4MUM2MCwKLSAgICAweDU3RDQsIDB4MDg3QywgMHg1N0Q1LCAweDFDNUYsIDB4NTdEQywgMHgxRTc5LCAweDU3REYsIDB4MEEzOSwKLSAgICAweDU3RTAsIDB4MEEzRCwgMHg1N0UxLCAweDFFODksIDB4NTdFMiwgMHgxRTc3LCAweDU3RTMsIDB4MUU4NSwKLSAgICAweDU3RTQsIDB4MEEzRSwgMHg1N0U1LCAweDFFODcsIDB4NTdFNywgMHgxRThELCAweDU3RTksIDB4MUU5MSwKLSAgICAweDU3RUMsIDB4MUU4OCwgMHg1N0VELCAweDFFN0MsIDB4NTdFRSwgMHgxRTg0LCAweDU3RjAsIDB4MUU5MiwKLSAgICAweDU3RjEsIDB4MUU5MCwgMHg1N0YyLCAweDFFODYsIDB4NTdGMywgMHgxRTgxLCAweDU3RjQsIDB4MUU3QSwKLSAgICAweDU3RjUsIDB4MjBFMSwgMHg1N0Y2LCAweDFFNzgsIDB4NTdGNywgMHgwQTQyLCAweDU3RjgsIDB4MUU3RiwKLSAgICAweDU3RjksIDB4MEE0MywgMHg1N0ZBLCAweDBBM0YsIDB4NTdGQiwgMHgxRTc1LCAweDU3RkMsIDB4MUU4QiwKLSAgICAweDU3RkQsIDB4MUU3RCwgMHg1ODAwLCAweDFFN0IsIDB4NTgwMSwgMHgxRThFLCAweDU4MDIsIDB4MEE0MCwKLSAgICAweDU4MDQsIDB4MUU5NCwgMHg1ODA1LCAweDBBM0EsIDB4NTgwNiwgMHgwQTNDLCAweDU4MDcsIDB4MUU4MywKLSAgICAweDU4MDgsIDB4MUU3RSwgMHg1ODA5LCAweDA4N0YsIDB4NTgwQSwgMHgwQTNCLCAweDU4MEIsIDB4MUU4MCwKLSAgICAweDU4MEMsIDB4MUU4RiwgMHg1ODBELCAweDFFOTMsIDB4NTgwRSwgMHgxRThBLCAweDU4MTAsIDB4MUU4QywKLSAgICAweDU4MTQsIDB4MUU3NiwgMHg1ODE5LCAweDIwREMsIDB4NTgxQiwgMHgyMEU1LCAweDU4MUMsIDB4MjBFNCwKLSAgICAweDU4MUQsIDB4MEMxRSwgMHg1ODFFLCAweDIwREQsIDB4NTgyMCwgMHgwQzFGLCAweDU4MjEsIDB4MEMxRCwKLSAgICAweDU4MjMsIDB4MjBERiwgMHg1ODI0LCAweDBDMUEsIDB4NTgyNSwgMHgyMEUzLCAweDU4MjcsIDB4MjBERSwKLSAgICAweDU4MjgsIDB4MjBFMCwgMHg1ODI5LCAweDIwREEsIDB4NTgyQSwgMHgwQzE4LCAweDU4MkMsIDB4MjBFRCwKLSAgICAweDU4MkQsIDB4MjBFQywgMHg1ODJFLCAweDIwRTksIDB4NTgyRiwgMHgwQzE3LCAweDU4MzAsIDB4MEMxQiwKLSAgICAweDU4MzEsIDB4MEMxQywgMHg1ODMyLCAweDFDNUUsIDB4NTgzMywgMHgyMEU2LCAweDU4MzQsIDB4MEMxOSwKLSAgICAweDU4MzUsIDB4MEE0MSwgMHg1ODM2LCAweDIwRTgsIDB4NTgzNywgMHgyMERCLCAweDU4MzgsIDB4MjBFQiwKLSAgICAweDU4MzksIDB4MjBFQSwgMHg1ODNCLCAweDIwRUUsIDB4NTgzRCwgMHgyMzlGLCAweDU4M0YsIDB4MjBFNywKLSAgICAweDU4NDgsIDB4MjBFMiwgMHg1ODQ5LCAweDIzOTcsIDB4NTg0QSwgMHgwREVGLCAweDU4NEIsIDB4MERGMiwKLSAgICAweDU4NEMsIDB4MERFRCwgMHg1ODRELCAweDIzOTYsIDB4NTg0RSwgMHgyMzlBLCAweDU4NEYsIDB4MjM5NSwKLSAgICAweDU4NTEsIDB4MERFNywgMHg1ODUyLCAweDBERjEsIDB4NTg1MywgMHgyMzkyLCAweDU4NTQsIDB4MERFQiwKLSAgICAweDU4NTUsIDB4MjM5OSwgMHg1ODU3LCAweDBERTksIDB4NTg1OCwgMHgwREU4LCAweDU4NTksIDB4MjM5QywKLSAgICAweDU4NUEsIDB4MERFQSwgMHg1ODVCLCAweDIzOUUsIDB4NTg1RCwgMHgyMzlCLCAweDU4NUUsIDB4MERFNiwKLSAgICAweDU4NjIsIDB4MERGMCwgMHg1ODYzLCAweDIzQTAsIDB4NTg2NCwgMHgyMzk0LCAweDU4NjUsIDB4MjM5RCwKLSAgICAweDU4NjgsIDB4MjM5MywgMHg1ODZCLCAweDBERUMsIDB4NTg2RCwgMHgwREVFLCAweDU4NkYsIDB4MjM5OCwKLSAgICAweDU4NzEsIDB4MjNBMSwgMHg1ODc0LCAweDI2M0YsIDB4NTg3NSwgMHgwRkEyLCAweDU4NzYsIDB4MjY0NSwKLSAgICAweDU4NzksIDB4MEZBNywgMHg1ODdBLCAweDI2NDEsIDB4NTg3QiwgMHgyNjQ4LCAweDU4N0MsIDB4MjYzOSwKLSAgICAweDU4N0QsIDB4MEZBOSwgMHg1ODdFLCAweDBGQTMsIDB4NTg3RiwgMHgyNjNFLCAweDU4ODAsIDB4MTEyMSwKLSAgICAweDU4ODEsIDB4MjYzRCwgMHg1ODgyLCAweDI2NDYsIDB4NTg4MywgMHgwRkE0LCAweDU4ODUsIDB4MEZBOCwKLSAgICAweDU4ODYsIDB4MjYzQywgMHg1ODg3LCAweDI2NDIsIDB4NTg4OCwgMHgyNjQ3LCAweDU4ODksIDB4MjYzOCwKLSAgICAweDU4OEEsIDB4MEZBNiwgMHg1ODhCLCAweDI2NDAsIDB4NTg4RSwgMHgyNjQ0LCAweDU4OEYsIDB4MjY0QSwKLSAgICAweDU4OTAsIDB4MjYzQSwgMHg1ODkxLCAweDI2NDMsIDB4NTg5MywgMHgwRkE1LCAweDU4OTQsIDB4MjY0OSwKLSAgICAweDU4OTgsIDB4MjYzQiwgMHg1ODlDLCAweDExMjUsIDB4NTg5RCwgMHgyOEExLCAweDU4OUUsIDB4MTEyMywKLSAgICAweDU4OUYsIDB4MTEyMiwgMHg1OEEwLCAweDI4QTMsIDB4NThBMSwgMHgyOEE4LCAweDU4QTMsIDB4MjhBNCwKLSAgICAweDU4QTUsIDB4MjhBNywgMHg1OEE2LCAweDExMjgsIDB4NThBOCwgMHgxMjg4LCAweDU4QTksIDB4MTEyNywKLSAgICAweDU4QUIsIDB4MjhBMCwgMHg1OEFDLCAweDI4QTYsIDB4NThBRSwgMHgxMTI2LCAweDU4QUYsIDB4MjhBNSwKLSAgICAweDU4QjEsIDB4MjhBMiwgMHg1OEIzLCAweDExMjQsIDB4NThCQSwgMHgyQjE4LCAweDU4QkIsIDB4MzZFQiwKLSAgICAweDU4QkMsIDB4MkIxQSwgMHg1OEJELCAweDJCMTUsIDB4NThCRSwgMHgxMkE0LCAweDU4QkYsIDB4MkIxNywKLSAgICAweDU4QzEsIDB4MTJBMywgMHg1OEMyLCAweDJCMTksIDB4NThDNSwgMHgxMkE2LCAweDU4QzYsIDB4MkIxQiwKLSAgICAweDU4QzcsIDB4MTJBNSwgMHg1OEM4LCAweDJCMTQsIDB4NThDOSwgMHgyQjE2LCAweDU4Q0UsIDB4MTNDMiwKLSAgICAweDU4Q0YsIDB4MkQ0RCwgMHg1OEQxLCAweDEzQzEsIDB4NThEMiwgMHgyRDRFLCAweDU4RDMsIDB4MTNDMCwKLSAgICAweDU4RDQsIDB4MkQ0QywgMHg1OEQ1LCAweDEzQkYsIDB4NThENiwgMHgyRDRCLCAweDU4RDgsIDB4MTRDRCwKLSAgICAweDU4RDksIDB4MTRDQywgMHg1OERBLCAweDMwODUsIDB4NThEQiwgMHgzMDg3LCAweDU4REQsIDB4MzA4NiwKLSAgICAweDU4REUsIDB4MTU3OCwgMHg1OERGLCAweDE1NzksIDB4NThFMiwgMHgxNTdBLCAweDU4RTMsIDB4MzFDQiwKLSAgICAweDU4RTQsIDB4MTYwRSwgMHg1OEU3LCAweDM0MTEsIDB4NThFOCwgMHgzNDEwLCAweDU4RTksIDB4MTcyMCwKLSAgICAweDU4RUIsIDB4MDI3QiwgMHg1OEVDLCAweDAyQzEsIDB4NThFRiwgMHgwNDZGLCAweDU4RjQsIDB4MUE5QiwKLSAgICAweDU4RjksIDB4MEMyMCwgMHg1OEZBLCAweDBDMjEsIDB4NThGQywgMHgyM0EyLCAweDU4RkQsIDB4MEZBQSwKLSAgICAweDU4RkUsIDB4MjY0QiwgMHg1OEZGLCAweDI4QTksIDB4NTkwMiwgMHgwMjI0LCAweDU5MDMsIDB4MTc4NSwKLSAgICAweDU5MDYsIDB4MTg1NywgMHg1OTBBLCAweDAyMjQsIDB4NTkwQywgMHgxOTQ0LCAweDU5MEQsIDB4MUE5QywKLSAgICAweDU5MEUsIDB4MUM2QywgMHg1OTBGLCAweDA4ODAsIDB4NTkxMiwgMHgzMDg4LCAweDU5MTQsIDB4MTY2RCwKLSAgICAweDU5MTUsIDB4MDI3QywgMHg1OTE2LCAweDAzMkUsIDB4NTkxNywgMHgxNzlDLCAweDU5MTksIDB4MDNCNCwKLSAgICAweDU5MUEsIDB4MDNCNSwgMHg1OTFDLCAweDA1ODEsIDB4NTkyMCwgMHgwQTQ0LCAweDU5MjIsIDB4MEZBQywKLSAgICAweDU5MjQsIDB4MEZBRCwgMHg1OTI1LCAweDBGQUIsIDB4NTkyNywgMHgwMjdELCAweDU5MjksIDB4MDJDMiwKLSAgICAweDU5MkEsIDB4MDJDNCwgMHg1OTJCLCAweDAyQzMsIDB4NTkyQywgMHgxNzg2LCAweDU5MkQsIDB4MDJDNSwKLSAgICAweDU5MkUsIDB4MDMyRiwgMHg1OTJGLCAweDE3OUQsIDB4NTkzMSwgMHgwMzMwLCAweDU5MzcsIDB4MDNCNiwKLSAgICAweDU5MzgsIDB4MDNCNywgMHg1OTNDLCAweDE3RDQsIDB4NTkzRSwgMHgwNDcwLCAweDU5NDAsIDB4MTg1OCwKLSAgICAweDU5NDQsIDB4MDU4NSwgMHg1OTQ1LCAweDE5NDUsIDB4NTk0NywgMHgwNTgzLCAweDU5NDgsIDB4MDU4NCwKLSAgICAweDU5NDksIDB4MDU4MiwgMHg1OTRBLCAweDFDNkQsIDB4NTk0RSwgMHgwNkYyLCAweDU5NEYsIDB4MDZGMSwKLSAgICAweDU5NTAsIDB4MDZGMywgMHg1OTUxLCAweDA2RjAsIDB4NTk1MywgMHgxQTlELCAweDU5NTQsIDB4MDU4NiwKLSAgICAweDU5NTUsIDB4MDZFRiwgMHg1OTU3LCAweDA4ODEsIDB4NTk1OCwgMHgwODgyLCAweDU5NUEsIDB4MDg4MywKLSAgICAweDU5NUMsIDB4MUU5NSwgMHg1OTYwLCAweDBDMjIsIDB4NTk2MSwgMHgyMEVGLCAweDU5NjIsIDB4MEE0NSwKLSAgICAweDU5NjcsIDB4MERGMywgMHg1OTY5LCAweDBGQUYsIDB4NTk2QSwgMHgwRkFFLCAweDU5NkIsIDB4MjY0QywKLSAgICAweDU5NkQsIDB4MTEyOSwgMHg1OTZFLCAweDEyQTcsIDB4NTk3MCwgMHgyRjE3LCAweDU5NzEsIDB4MzM3QiwKLSAgICAweDU5NzIsIDB4MzQxMiwgMHg1OTczLCAweDAyN0UsIDB4NTk3NCwgMHgwMzMxLCAweDU5NzYsIDB4MDMzMiwKLSAgICAweDU5NzcsIDB4MTdEQSwgMHg1OTc4LCAweDAzQjksIDB4NTk3OSwgMHgwM0JDLCAweDU5N0IsIDB4MTdEOCwKLSAgICAweDU5N0MsIDB4MTdENiwgMHg1OTdELCAweDAzQkIsIDB4NTk3RSwgMHgxN0Q5LCAweDU5N0YsIDB4MTdEQiwKLSAgICAweDU5ODAsIDB4MTdENSwgMHg1OTgxLCAweDAzQkUsIDB4NTk4MiwgMHgwM0JELCAweDU5ODMsIDB4MDNCQSwKLSAgICAweDU5ODQsIDB4MDNCOCwgMHg1OTg1LCAweDE3RDcsIDB4NTk4QSwgMHgwNDdCLCAweDU5OEQsIDB4MDQ3OCwKLSAgICAweDU5OEUsIDB4MTg1RCwgMHg1OThGLCAweDE4NjAsIDB4NTk5MCwgMHgxODVGLCAweDU5OTIsIDB4MDQ3MiwKLSAgICAweDU5OTMsIDB4MDQ3QSwgMHg1OTk2LCAweDA0NzcsIDB4NTk5NywgMHgxODVDLCAweDU5OTgsIDB4MTg1QSwKLSAgICAweDU5OTksIDB4MDQ3NiwgMHg1OTlELCAweDA0NzEsIDB4NTk5RSwgMHgwNDc0LCAweDU5QTAsIDB4MTg1QiwKLSAgICAweDU5QTEsIDB4MTg2MiwgMHg1OUEyLCAweDE4NUUsIDB4NTlBMywgMHgwNDc1LCAweDU5QTQsIDB4MDQ3OSwKLSAgICAweDU5QTUsIDB4MDQ3QywgMHg1OUE2LCAweDE4NTksIDB4NTlBNywgMHgxODYxLCAweDU5QTgsIDB4MDQ3MywKLSAgICAweDU5QUUsIDB4MDU4QiwgMHg1OUFGLCAweDA1OTMsIDB4NTlCMSwgMHgxOTUxLCAweDU5QjIsIDB4MTk0QSwKLSAgICAweDU5QjMsIDB4MDU5NCwgMHg1OUI0LCAweDE5NTUsIDB4NTlCNSwgMHgxOTQ2LCAweDU5QjYsIDB4MTk0RCwKLSAgICAweDU5QjksIDB4MDU4QSwgMHg1OUJBLCAweDE5NDcsIDB4NTlCQiwgMHgwNTg4LCAweDU5QkMsIDB4MTk0RSwKLSAgICAweDU5QkQsIDB4MTk1MiwgMHg1OUJFLCAweDA1ODcsIDB4NTlDMCwgMHgxOTUzLCAweDU5QzEsIDB4MTk0QywKLSAgICAweDU5QzMsIDB4MTk0RiwgMHg1OUM1LCAweDA1OTYsIDB4NTlDNiwgMHgwNThELCAweDU5QzcsIDB4MTk1NiwKLSAgICAweDU5QzgsIDB4MTk1NCwgMHg1OUNBLCAweDA1OTIsIDB4NTlDQiwgMHgwNTkwLCAweDU5Q0MsIDB4MTk0QiwKLSAgICAweDU5Q0QsIDB4MDU4RiwgMHg1OUNFLCAweDE5NDksIDB4NTlDRiwgMHgxOTQ4LCAweDU5RDAsIDB4MDU4RSwKLSAgICAweDU5RDEsIDB4MDU4QywgMHg1OUQyLCAweDA1OTUsIDB4NTlEMywgMHgwNTkxLCAweDU5RDQsIDB4MDU4OSwKLSAgICAweDU5RDYsIDB4MTk1MCwgMHg1OUQ4LCAweDA2RjUsIDB4NTlEQSwgMHgwNkZDLCAweDU5REIsIDB4MUFBQiwKLSAgICAweDU5REMsIDB4MDZGNCwgMHg1OURELCAweDFBQTMsIDB4NTlERSwgMHgxQTlGLCAweDU5RTAsIDB4MUFBRiwKLSAgICAweDU5RTEsIDB4MUE5RSwgMHg1OUUzLCAweDA2RjcsIDB4NTlFNCwgMHgxQUE4LCAweDU5RTUsIDB4MDZGQSwKLSAgICAweDU5RTYsIDB4MDZGRCwgMHg1OUU4LCAweDA2RjgsIDB4NTlFOSwgMHgxQUFDLCAweDU5RUEsIDB4MDZGQiwKLSAgICAweDU5RUMsIDB4MDg4QSwgMHg1OUVELCAweDFBQjIsIDB4NTlFRSwgMHgxQUEwLCAweDU5RjEsIDB4MUFBMiwKLSAgICAweDU5RjIsIDB4MUFBOSwgMHg1OUYzLCAweDFBQUQsIDB4NTlGNCwgMHgxQUIxLCAweDU5RjUsIDB4MUFBRSwKLSAgICAweDU5RjYsIDB4MUFBNywgMHg1OUY3LCAweDFBQUEsIDB4NTlGQSwgMHgxQUE0LCAweDU5RkIsIDB4MDZGRiwKLSAgICAweDU5RkMsIDB4MUFBNiwgMHg1OUZELCAweDFBQTUsIDB4NTlGRSwgMHgxQUIwLCAweDU5RkYsIDB4MDZGNiwKLSAgICAweDVBMDAsIDB4MUFBMSwgMHg1QTAxLCAweDA2RkUsIDB4NUEwMywgMHgwNkY5LCAweDVBMDksIDB4MDg5MCwKLSAgICAweDVBMEEsIDB4MUM3NSwgMHg1QTBDLCAweDA4OEYsIDB4NUEwRiwgMHgxQzczLCAweDVBMTEsIDB4MDg4NCwKLSAgICAweDVBMTMsIDB4MDg4OSwgMHg1QTE1LCAweDFDNzIsIDB4NUExNiwgMHgxQzZGLCAweDVBMTcsIDB4MUM3NCwKLSAgICAweDVBMTgsIDB4MDg4NSwgMHg1QTE5LCAweDFDNkUsIDB4NUExQiwgMHgwODg4LCAweDVBMUMsIDB4MDg4NiwKLSAgICAweDVBMUUsIDB4MUM3NiwgMHg1QTFGLCAweDA4ODcsIDB4NUEyMCwgMHgwODhCLCAweDVBMjMsIDB4MDg4QywKLSAgICAweDVBMjUsIDB4MDg4RSwgMHg1QTI5LCAweDA4OEQsIDB4NUEyRCwgMHgxQzcwLCAweDVBMkUsIDB4MUM3MSwKLSAgICAweDVBMzMsIDB4MUM3NywgMHg1QTM1LCAweDFFOUMsIDB4NUEzNiwgMHgwQTQ2LCAweDVBMzcsIDB4MjBGRCwKLSAgICAweDVBMzgsIDB4MUU5QiwgMHg1QTM5LCAweDFFQUUsIDB4NUEzQywgMHgwQTRDLCAweDVBM0UsIDB4MUVBQywKLSAgICAweDVBNDAsIDB4MEE0QiwgMHg1QTQxLCAweDBBNDcsIDB4NUE0MiwgMHgxRUI1LCAweDVBNDMsIDB4MUVBNSwKLSAgICAweDVBNDQsIDB4MUVBOCwgMHg1QTQ2LCAweDBBNEYsIDB4NUE0NywgMHgxRUIyLCAweDVBNDgsIDB4MUVBQSwKLSAgICAweDVBNDksIDB4MEE0OCwgMHg1QTRBLCAweDBBNTAsIDB4NUE0QywgMHgxRUFGLCAweDVBNEQsIDB4MUVBRCwKLSAgICAweDVBNTAsIDB4MUU5RSwgMHg1QTUxLCAweDFFQjMsIDB4NUE1MiwgMHgxRUE3LCAweDVBNTMsIDB4MUVBMiwKLSAgICAweDVBNTUsIDB4MUU5OCwgMHg1QTU2LCAweDFFQjQsIDB4NUE1NywgMHgxRUE0LCAweDVBNTgsIDB4MUU5NywKLSAgICAweDVBNUEsIDB4MEE0RSwgMHg1QTVCLCAweDFFQTksIDB4NUE1QywgMHgxRUI2LCAweDVBNUQsIDB4MUVBNiwKLSAgICAweDVBNUUsIDB4MUU5QSwgMHg1QTVGLCAweDFFOUYsIDB4NUE2MCwgMHgxRTk2LCAweDVBNjIsIDB4MEE0RCwKLSAgICAweDVBNjQsIDB4MUVBMywgMHg1QTY1LCAweDFFQTAsIDB4NUE2NiwgMHgwQTQ5LCAweDVBNjcsIDB4MUU5OSwKLSAgICAweDVBNjksIDB4MUVCMSwgMHg1QTZBLCAweDBBNEEsIDB4NUE2QywgMHgxRUExLCAweDVBNkQsIDB4MUU5RCwKLSAgICAweDVBNzAsIDB4MUVCMCwgMHg1QTc3LCAweDBDMjMsIDB4NUE3OCwgMHgyMEY2LCAweDVBN0EsIDB4MjBGMywKLSAgICAweDVBN0IsIDB4MjEwNCwgMHg1QTdDLCAweDIwRjgsIDB4NUE3RCwgMHgyMTA1LCAweDVBN0YsIDB4MEMyNSwKLSAgICAweDVBODMsIDB4MjEwMSwgMHg1QTg0LCAweDIwRkUsIDB4NUE4QSwgMHgyMEZGLCAweDVBOEIsIDB4MjEwMiwKLSAgICAweDVBOEMsIDB4MjEwNiwgMHg1QThFLCAweDFFQUIsIDB4NUE4RiwgMHgyMTA4LCAweDVBOTAsIDB4MjNCNiwKLSAgICAweDVBOTIsIDB4MEMyNiwgMHg1QTkzLCAweDIxMDksIDB4NUE5NCwgMHgyMEYxLCAweDVBOTUsIDB4MjBGQiwKLSAgICAweDVBOTcsIDB4MjEwMCwgMHg1QTlBLCAweDBDMjQsIDB4NUE5QiwgMHgwQzI3LCAweDVBOUMsIDB4MjEwNywKLSAgICAweDVBOUQsIDB4MjEwQSwgMHg1QTlFLCAweDIwRjUsIDB4NUE5RiwgMHgyMEYyLCAweDVBQTIsIDB4MjBGNCwKLSAgICAweDVBQTUsIDB4MjBGOSwgMHg1QUE2LCAweDIwRjcsIDB4NUFBNywgMHgwQzI4LCAweDVBQTksIDB4MjEwMywKLSAgICAweDVBQUMsIDB4MjBGQSwgMHg1QUFFLCAweDIwRkMsIDB4NUFBRiwgMHgyMEYwLCAweDVBQjAsIDB4MjNBQSwKLSAgICAweDVBQjEsIDB4MjNBOCwgMHg1QUIyLCAweDBERkMsIDB4NUFCMywgMHgwREZBLCAweDVBQjQsIDB4MjNCMiwKLSAgICAweDVBQjUsIDB4MjNBOSwgMHg1QUI2LCAweDIzQjMsIDB4NUFCNywgMHgyM0FGLCAweDVBQjgsIDB4MjNBNywKLSAgICAweDVBQjksIDB4MjNCNSwgMHg1QUJBLCAweDIzQTYsIDB4NUFCQiwgMHgyM0FELCAweDVBQkMsIDB4MERGOSwKLSAgICAweDVBQkQsIDB4MERGOCwgMHg1QUJFLCAweDBERjcsIDB4NUFCRiwgMHgyM0FCLCAweDVBQzAsIDB4MjNCMCwKLSAgICAweDVBQzEsIDB4MERGNCwgMHg1QUMyLCAweDBERkIsIDB4NUFDNCwgMHgyM0E0LCAweDVBQzYsIDB4MjNBRSwKLSAgICAweDVBQzcsIDB4MjNBMywgMHg1QUM4LCAweDIzQUMsIDB4NUFDOSwgMHgwREY1LCAweDVBQ0EsIDB4MjNCMSwKLSAgICAweDVBQ0IsIDB4MjNBNSwgMHg1QUNDLCAweDBERjYsIDB4NUFDRCwgMHgyM0I0LCAweDVBRDUsIDB4MjY1MCwKLSAgICAweDVBRDYsIDB4MEZCNCwgMHg1QUQ3LCAweDBGQjMsIDB4NUFEOCwgMHgwRkI1LCAweDVBRDksIDB4MjY1QywKLSAgICAweDVBREEsIDB4MjY1MiwgMHg1QURCLCAweDI2NTgsIDB4NUFEQywgMHgyNjRELCAweDVBREQsIDB4MjY1QiwKLSAgICAweDVBREUsIDB4MjY1QSwgMHg1QURGLCAweDI2NUUsIDB4NUFFMCwgMHgyNjU3LCAweDVBRTEsIDB4MEZCMCwKLSAgICAweDVBRTIsIDB4MjY1NiwgMHg1QUUzLCAweDBGQjYsIDB4NUFFNSwgMHgyNjRGLCAweDVBRTYsIDB4MEZCMSwKLSAgICAweDVBRTgsIDB4MjY1RCwgMHg1QUU5LCAweDBGQjIsIDB4NUFFQSwgMHgyNjUxLCAweDVBRUIsIDB4MjY1NCwKLSAgICAweDVBRUMsIDB4MjY1OSwgMHg1QUVELCAweDI2NTMsIDB4NUFFRSwgMHgyNjRFLCAweDVBRjMsIDB4MjY1NSwKLSAgICAweDVBRjQsIDB4MjhBQiwgMHg1QUY1LCAweDExMkQsIDB4NUFGNiwgMHgyOEFFLCAweDVBRjcsIDB4MjhBRCwKLSAgICAweDVBRjgsIDB4MjhCMCwgMHg1QUY5LCAweDI4QjIsIDB4NUFGQSwgMHgzNkVFLCAweDVBRkIsIDB4MTEyQiwKLSAgICAweDVBRkQsIDB4MjhBQywgMHg1QUZGLCAweDI4QUEsIDB4NUIwMSwgMHgyOEIzLCAweDVCMDIsIDB4MjhCMSwKLSAgICAweDVCMDMsIDB4MjhBRiwgMHg1QjA1LCAweDI4QjUsIDB4NUIwNywgMHgyOEI0LCAweDVCMDgsIDB4MTEyRiwKLSAgICAweDVCMDksIDB4MTEyQSwgMHg1QjBCLCAweDExMkMsIDB4NUIwQywgMHgxMTJFLCAweDVCMEYsIDB4MjhCNiwKLSAgICAweDVCMTAsIDB4MkIyMiwgMHg1QjEzLCAweDJCMjEsIDB4NUIxNCwgMHgyQjIwLCAweDVCMTYsIDB4MkIyMywKLSAgICAweDVCMTcsIDB4MkIxQywgMHg1QjE5LCAweDJCMUQsIDB4NUIxQSwgMHgyQjI1LCAweDVCMUIsIDB4MkIxRSwKLSAgICAweDVCMUQsIDB4MTJBOCwgMHg1QjFFLCAweDJCMjcsIDB4NUIyMCwgMHgyQjI2LCAweDVCMjEsIDB4MkIxRiwKLSAgICAweDVCMjMsIDB4MkQ1MiwgMHg1QjI0LCAweDEzQzUsIDB4NUIyNSwgMHgyRDUwLCAweDVCMjYsIDB4MkQ1NSwKLSAgICAweDVCMjcsIDB4MkQ1NCwgMHg1QjI4LCAweDJCMjQsIDB4NUIyQSwgMHgxM0M0LCAweDVCMkMsIDB4MkQ1MywKLSAgICAweDVCMkQsIDB4MkQ0RiwgMHg1QjJFLCAweDJENTcsIDB4NUIyRiwgMHgyRDU2LCAweDVCMzAsIDB4MTNDMywKLSAgICAweDVCMzIsIDB4MkQ1MSwgMHg1QjM0LCAweDEyQTksIDB4NUIzOCwgMHgxNENFLCAweDVCM0MsIDB4MkYxOCwKLSAgICAweDVCM0QsIDB4MzA4OSwgMHg1QjNFLCAweDMwOEEsIDB4NUIzRiwgMHgzMDhCLCAweDVCNDAsIDB4MTYwRiwKLSAgICAweDVCNDMsIDB4MTYxMCwgMHg1QjQ1LCAweDMxQ0MsIDB4NUI0NywgMHgzMkNELCAweDVCNDgsIDB4MzJDQywKLSAgICAweDVCNEIsIDB4MzM3QywgMHg1QjRDLCAweDMzN0QsIDB4NUI0RCwgMHgzNDEzLCAweDVCNEUsIDB4MzQ4MiwKLSAgICAweDVCNTAsIDB4MDI3RiwgMHg1QjUxLCAweDAyODAsIDB4NUI1MywgMHgwMjgxLCAweDVCNTQsIDB4MDJDNiwKLSAgICAweDVCNTUsIDB4MDMzMywgMHg1QjU2LCAweDE3REMsIDB4NUI1NywgMHgwM0JGLCAweDVCNTgsIDB4MDNDMCwKLSAgICAweDVCNUEsIDB4MDQ3RiwgMHg1QjVCLCAweDA0ODAsIDB4NUI1QywgMHgwNDdFLCAweDVCNUQsIDB4MDQ3RCwKLSAgICAweDVCNUYsIDB4MDU5NywgMHg1QjYyLCAweDE5NTcsIDB4NUI2MywgMHgwNTk5LCAweDVCNjQsIDB4MDU5OCwKLSAgICAweDVCNjUsIDB4MTk1OCwgMHg1QjY5LCAweDA3MDAsIDB4NUI2QiwgMHgwODkxLCAweDVCNkMsIDB4MUM3OCwKLSAgICAweDVCNkUsIDB4MUVCOCwgMHg1QjcwLCAweDBBNTEsIDB4NUI3MSwgMHgwQzJBLCAweDVCNzIsIDB4MUVCNywKLSAgICAweDVCNzMsIDB4MEMyOSwgMHg1Qjc1LCAweDBGQjcsIDB4NUI3NywgMHgyNjVGLCAweDVCNzgsIDB4MTJBQSwKLSAgICAweDVCN0EsIDB4MTNDNiwgMHg1QjdCLCAweDJENTgsIDB4NUI3RCwgMHgxNjExLCAweDVCN0YsIDB4MTZDMCwKLSAgICAweDVCODAsIDB4MDIyNSwgMHg1QjgxLCAweDE3OUUsIDB4NUI4MywgMHgwMzM0LCAweDVCODQsIDB4MTc5RiwKLSAgICAweDVCODUsIDB4MDNDMywgMHg1Qjg3LCAweDAzQzEsIDB4NUI4OCwgMHgwM0MyLCAweDVCODksIDB4MDNDNCwKLSAgICAweDVCOEIsIDB4MDQ4MiwgMHg1QjhDLCAweDA0ODEsIDB4NUI4RSwgMHgxODYzLCAweDVCOEYsIDB4MDQ4MywKLSAgICAweDVCOTIsIDB4MTg2NCwgMHg1QjkzLCAweDE5NTksIDB4NUI5NSwgMHgxOTVBLCAweDVCOTcsIDB4MDU5QSwKLSAgICAweDVCOTgsIDB4MDU5QywgMHg1Qjk5LCAweDA1OUUsIDB4NUI5QSwgMHgwNTlCLCAweDVCOUIsIDB4MDU5RiwKLSAgICAweDVCOUMsIDB4MDU5RCwgMHg1QkEyLCAweDA3MDQsIDB4NUJBMywgMHgwNzAxLCAweDVCQTQsIDB4MDcwMywKLSAgICAweDVCQTUsIDB4MDcwNSwgMHg1QkE2LCAweDA3MDIsIDB4NUJBNywgMHgxQzc5LCAweDVCQTgsIDB4MUFCMywKLSAgICAweDVCQUMsIDB4MUM3QiwgMHg1QkFELCAweDFDN0EsIDB4NUJBRSwgMHgwODk3LCAweDVCQjAsIDB4MDg5MywKLSAgICAweDVCQjMsIDB4MDg5NCwgMHg1QkI0LCAweDA4OTYsIDB4NUJCNSwgMHgwODk4LCAweDVCQjYsIDB4MDg5NSwKLSAgICAweDVCQjgsIDB4MDg5QSwgMHg1QkI5LCAweDA4OTksIDB4NUJCRiwgMHgwQTU2LCAweDVCQzAsIDB4MUVCQSwKLSAgICAweDVCQzEsIDB4MUVCOSwgMHg1QkMyLCAweDBBNTUsIDB4NUJDNCwgMHgwQTU0LCAweDVCQzUsIDB4MEE1MywKLSAgICAweDVCQzYsIDB4MEE1NywgMHg1QkM3LCAweDBBNTIsIDB4NUJDQSwgMHgyMTEwLCAweDVCQ0IsIDB4MjEwRCwKLSAgICAweDVCQ0MsIDB4MEMyQywgMHg1QkNELCAweDIxMEMsIDB4NUJDRSwgMHgyMTExLCAweDVCRDAsIDB4MEMyRSwKLSAgICAweDVCRDEsIDB4MjEwRiwgMHg1QkQyLCAweDBDMkIsIDB4NUJEMywgMHgwQzJELCAweDVCRDQsIDB4MjEwRSwKLSAgICAweDVCRDYsIDB4MjNCNywgMHg1QkQ4LCAweDIzQjgsIDB4NUJEOSwgMHgyM0I5LCAweDVCREUsIDB4MEZCOCwKLSAgICAweDVCREYsIDB4MEZDMCwgMHg1QkUwLCAweDI2NjAsIDB4NUJFMSwgMHgwRkJBLCAweDVCRTIsIDB4MEZCRSwKLSAgICAweDVCRTMsIDB4MjY2MSwgMHg1QkU0LCAweDBGQkYsIDB4NUJFNSwgMHgwRkJCLCAweDVCRTYsIDB4MEZCQywKLSAgICAweDVCRTcsIDB4MEZCOSwgMHg1QkU4LCAweDBGQkQsIDB4NUJFOSwgMHgxMTMyLCAweDVCRUEsIDB4MjEwQiwKLSAgICAweDVCRUIsIDB4MTEzMywgMHg1QkVDLCAweDExMzEsIDB4NUJFRSwgMHgxMTMwLCAweDVCRUYsIDB4MkIyOCwKLSAgICAweDVCRjAsIDB4MTJBQiwgMHg1QkYxLCAweDJENTksIDB4NUJGMiwgMHgyRDVBLCAweDVCRjUsIDB4MTU3QiwKLSAgICAweDVCRjYsIDB4MTYxMiwgMHg1QkY4LCAweDAyODIsIDB4NUJGQSwgMHgwM0M1LCAweDVDMDEsIDB4MDcwNiwKLSAgICAweDVDMDMsIDB4MUM3QywgMHg1QzA0LCAweDA4OUIsIDB4NUMwNywgMHgwQTVBLCAweDVDMDgsIDB4MEE1OSwKLSAgICAweDVDMDksIDB4MEE1OCwgMHg1QzBBLCAweDBDMkYsIDB4NUMwQiwgMHgwQzMwLCAweDVDMEMsIDB4MjExMiwKLSAgICAweDVDMEQsIDB4MEZDMSwgMHg1QzBFLCAweDEyQUMsIDB4NUMwRiwgMHgwMjgzLCAweDVDMTAsIDB4MTc4NywKLSAgICAweDVDMTEsIDB4MDJDNywgMHg1QzEyLCAweDE3QTAsIDB4NUMxNSwgMHgxN0RELCAweDVDMTYsIDB4MDNDNiwKLSAgICAweDVDMUEsIDB4MDVBMCwgMHg1QzFGLCAweDIzQkEsIDB4NUMyMiwgMHgwMjg0LCAweDVDMjQsIDB4MDJDOCwKLSAgICAweDVDMjUsIDB4MTdERSwgMHg1QzI4LCAweDE4NjUsIDB4NUMyQSwgMHgxODY2LCAweDVDMkMsIDB4MDQ4NCwKLSAgICAweDVDMzAsIDB4MjExMywgMHg1QzMxLCAweDBDMzEsIDB4NUMzMywgMHgyM0JCLCAweDVDMzcsIDB4MTNDNywKLSAgICAweDVDMzgsIDB4MDI4NSwgMHg1QzM5LCAweDAyOTksIDB4NUMzQSwgMHgwMkM5LCAweDVDM0IsIDB4MTdBMSwKLSAgICAweDVDM0MsIDB4MDMzNSwgMHg1QzNFLCAweDA0ODgsIDB4NUMzRiwgMHgwNDg3LCAweDVDNDAsIDB4MDQ4NSwKLSAgICAweDVDNDEsIDB4MDQ4NiwgMHg1QzQ0LCAweDE5NUIsIDB4NUM0NSwgMHgwNUEyLCAweDVDNDYsIDB4MDVBMywKLSAgICAweDVDNDcsIDB4MTk1QywgMHg1QzQ4LCAweDA1QTEsIDB4NUM0QiwgMHgwNzBBLCAweDVDNEMsIDB4MUFCNCwKLSAgICAweDVDNEQsIDB4MDcwOSwgMHg1QzRFLCAweDA3MDcsIDB4NUM0RiwgMHgwNzA4LCAweDVDNTAsIDB4MDg5RSwKLSAgICAweDVDNTEsIDB4MDg5QywgMHg1QzU0LCAweDFDN0UsIDB4NUM1NSwgMHgwODlELCAweDVDNTYsIDB4MUM3RCwKLSAgICAweDVDNTgsIDB4MDg5MiwgMHg1QzU5LCAweDFFQkIsIDB4NUM1QywgMHgwQTVDLCAweDVDNUQsIDB4MEE1RCwKLSAgICAweDVDNjAsIDB4MEE1QiwgMHg1QzYyLCAweDBGQzIsIDB4NUM2MywgMHgyNjYyLCAweDVDNjQsIDB4MTEzNCwKLSAgICAweDVDNjUsIDB4MTEzNSwgMHg1QzY3LCAweDI4QjcsIDB4NUM2OCwgMHgxM0M4LCAweDVDNjksIDB4MkYxOSwKLSAgICAweDVDNkEsIDB4MkYxQSwgMHg1QzZDLCAweDE2NkUsIDB4NUM2RCwgMHgzNDgzLCAweDVDNkUsIDB4MTc3NiwKLSAgICAweDVDNkYsIDB4MDJDQSwgMHg1QzcxLCAweDAyODYsIDB4NUM3MywgMHgxN0EzLCAweDVDNzQsIDB4MTdBMiwKLSAgICAweDVDNzksIDB4MDNDNywgMHg1QzdBLCAweDE3RTAsIDB4NUM3QiwgMHgxN0UxLCAweDVDN0MsIDB4MTdERiwKLSAgICAweDVDN0UsIDB4MTdFMiwgMHg1Qzg2LCAweDE4NkUsIDB4NUM4OCwgMHgxODY5LCAweDVDODksIDB4MTg2QiwKLSAgICAweDVDOEEsIDB4MTg2RCwgMHg1QzhCLCAweDE4NkEsIDB4NUM4QywgMHgwNDhDLCAweDVDOEQsIDB4MTg2NywKLSAgICAweDVDOEYsIDB4MTg2OCwgMHg1QzkwLCAweDA0ODksIDB4NUM5MSwgMHgwNDhBLCAweDVDOTIsIDB4MTg2QywKLSAgICAweDVDOTMsIDB4MTg2RiwgMHg1Qzk0LCAweDA0OEIsIDB4NUM5NSwgMHgxODcwLCAweDVDOUQsIDB4MTk2QSwKLSAgICAweDVDOUYsIDB4MTk2NCwgMHg1Q0EwLCAweDE5NUYsIDB4NUNBMSwgMHgwNUE1LCAweDVDQTIsIDB4MTk2NywKLSAgICAweDVDQTMsIDB4MTk2NSwgMHg1Q0E0LCAweDE5NUUsIDB4NUNBNSwgMHgxOTZCLCAweDVDQTYsIDB4MTk2RSwKLSAgICAweDVDQTcsIDB4MTk2OSwgMHg1Q0E4LCAweDE5NjIsIDB4NUNBOSwgMHgwNUE3LCAweDVDQUEsIDB4MTk2OCwKLSAgICAweDVDQUIsIDB4MDVBOCwgMHg1Q0FDLCAweDE5NjMsIDB4NUNBRCwgMHgxOTY2LCAweDVDQUUsIDB4MTk1RCwKLSAgICAweDVDQUYsIDB4MTk2MSwgMHg1Q0IwLCAweDE5NkQsIDB4NUNCMSwgMHgwNUE5LCAweDVDQjMsIDB4MDVBQSwKLSAgICAweDVDQjUsIDB4MTk2MCwgMHg1Q0I2LCAweDE5NkMsIDB4NUNCNywgMHgwNUE0LCAweDVDQjgsIDB4MDVBNiwKLSAgICAweDVDQzYsIDB4MUFDNSwgMHg1Q0M3LCAweDFBQkUsIDB4NUNDOCwgMHgxQUM0LCAweDVDQzksIDB4MUFCRCwKLSAgICAweDVDQ0EsIDB4MUFCRiwgMHg1Q0NCLCAweDFBQjksIDB4NUNDQywgMHgxQUI3LCAweDVDQ0UsIDB4MUFDNiwKLSAgICAweDVDQ0YsIDB4MUFDMywgMHg1Q0QwLCAweDFBQjUsIDB4NUNEMiwgMHgwNzBDLCAweDVDRDMsIDB4MUFDMSwKLSAgICAweDVDRDQsIDB4MUFDMiwgMHg1Q0Q2LCAweDFBQzAsIDB4NUNENywgMHgxQUI4LCAweDVDRDgsIDB4MUFCNiwKLSAgICAweDVDRDksIDB4MDcwQiwgMHg1Q0RBLCAweDFBQkMsIDB4NUNEQiwgMHgxQUJBLCAweDVDREUsIDB4MUFCQiwKLSAgICAweDVDREYsIDB4MUFDNywgMHg1Q0U4LCAweDA4QTMsIDB4NUNFQSwgMHgwOEEyLCAweDVDRUMsIDB4MUM3RiwKLSAgICAweDVDRUQsIDB4MDg5RiwgMHg1Q0VFLCAweDFDODEsIDB4NUNGMCwgMHgwOEE0LCAweDVDRjEsIDB4MUM4MiwKLSAgICAweDVDRjQsIDB4MDhBNywgMHg1Q0Y2LCAweDA4QTUsIDB4NUNGNywgMHgxQzgzLCAweDVDRjgsIDB4MUFDOCwKLSAgICAweDVDRjksIDB4MUM4NSwgMHg1Q0ZCLCAweDA4QTEsIDB4NUNGRCwgMHgwOEEwLCAweDVDRkYsIDB4MUM4MCwKLSAgICAweDVEMDAsIDB4MUM4NCwgMHg1RDAxLCAweDA4QTYsIDB4NUQwNiwgMHgwQTVGLCAweDVEMDcsIDB4MEE1RSwKLSAgICAweDVEMEIsIDB4MUVCRCwgMHg1RDBDLCAweDFFQzEsIDB4NUQwRCwgMHgxRUMzLCAweDVEMEUsIDB4MEE2MCwKLSAgICAweDVEMEYsIDB4MUVDNiwgMHg1RDExLCAweDBBNjQsIDB4NUQxMiwgMHgxRUM4LCAweDVEMTQsIDB4MEE2NiwKLSAgICAweDVEMTYsIDB4MEE2MiwgMHg1RDE3LCAweDBBNkEsIDB4NUQxOSwgMHgwQTY3LCAweDVEMUEsIDB4MUVCRiwKLSAgICAweDVEMUIsIDB4MEE2MSwgMHg1RDFELCAweDFFQkUsIDB4NUQxRSwgMHgxRUJDLCAweDVEMUYsIDB4MUVDQSwKLSAgICAweDVEMjAsIDB4MUVDMCwgMHg1RDIyLCAweDBBNjMsIDB4NUQyMywgMHgxRUM5LCAweDVEMjQsIDB4MEE2OCwKLSAgICAweDVEMjUsIDB4MUVDNSwgMHg1RDI2LCAweDFFQzQsIDB4NUQyNywgMHgwQTY5LCAweDVEMjgsIDB4MUVDMiwKLSAgICAweDVEMjksIDB4MEE2NSwgMHg1RDJFLCAweDFFQ0IsIDB4NUQzMCwgMHgxRUM3LCAweDVEMzEsIDB4MjEyMiwKLSAgICAweDVEMzIsIDB4MjEyOSwgMHg1RDMzLCAweDIxMUUsIDB4NUQzNCwgMHgwQzM0LCAweDVEMzUsIDB4MjExQSwKLSAgICAweDVEMzYsIDB4MjEyQSwgMHg1RDM3LCAweDIxMTQsIDB4NUQzOCwgMHgyMTI3LCAweDVEMzksIDB4MjEyNSwKLSAgICAweDVEM0EsIDB4MjExRiwgMHg1RDNDLCAweDIxMjgsIDB4NUQzRCwgMHgyMTIxLCAweDVEM0YsIDB4MjExOSwKLSAgICAweDVENDAsIDB4MjEyQiwgMHg1RDQxLCAweDIxMTcsIDB4NUQ0MiwgMHgyMTI0LCAweDVENDMsIDB4MjExNSwKLSAgICAweDVENDUsIDB4MjEyQywgMHg1RDQ3LCAweDBDMzUsIDB4NUQ0OSwgMHgyMTI2LCAweDVENEEsIDB4MjNCRSwKLSAgICAweDVENEIsIDB4MjExOCwgMHg1RDRDLCAweDBDMzIsIDB4NUQ0RSwgMHgyMTFDLCAweDVENTAsIDB4MEMzMywKLSAgICAweDVENTEsIDB4MjExQiwgMHg1RDUyLCAweDIxMjAsIDB4NUQ1NSwgMHgyMTFELCAweDVENTksIDB4MjEyMywKLSAgICAweDVENUUsIDB4MjNDMiwgMHg1RDYyLCAweDIzQzUsIDB4NUQ2MywgMHgyM0JELCAweDVENjUsIDB4MjNCRiwKLSAgICAweDVENjcsIDB4MjNDNCwgMHg1RDY4LCAweDIzQzMsIDB4NUQ2OSwgMHgwREZELCAweDVENkIsIDB4MjExNiwKLSAgICAweDVENkMsIDB4MjNDMSwgMHg1RDZGLCAweDBERkUsIDB4NUQ3MSwgMHgyM0JDLCAweDVENzIsIDB4MjNDMCwKLSAgICAweDVENzcsIDB4MjY2OSwgMHg1RDc5LCAweDI2NzAsIDB4NUQ3QSwgMHgyNjY3LCAweDVEN0MsIDB4MjY2RSwKLSAgICAweDVEN0QsIDB4MjY2NSwgMHg1RDdFLCAweDI2NkQsIDB4NUQ3RiwgMHgyNjcxLCAweDVEODAsIDB4MjY2NCwKLSAgICAweDVEODEsIDB4MjY2OCwgMHg1RDgyLCAweDI2NjMsIDB4NUQ4NCwgMHgwRkMzLCAweDVEODYsIDB4MjY2NiwKLSAgICAweDVEODcsIDB4MEZDNCwgMHg1RDg4LCAweDI2NkMsIDB4NUQ4OSwgMHgyNjZCLCAweDVEOEEsIDB4MjY2QSwKLSAgICAweDVEOEQsIDB4MjY2RiwgMHg1RDkyLCAweDI4QkIsIDB4NUQ5MywgMHgyOEJELCAweDVEOTQsIDB4MTEzNywKLSAgICAweDVEOTUsIDB4MjhCRSwgMHg1RDk3LCAweDI4QjksIDB4NUQ5OSwgMHgyOEI4LCAweDVEOUEsIDB4MjhDMiwKLSAgICAweDVEOUMsIDB4MjhDMCwgMHg1RDlELCAweDExMzYsIDB4NUQ5RSwgMHgyOEMzLCAweDVEOUYsIDB4MjhCQSwKLSAgICAweDVEQTAsIDB4MjhCRiwgMHg1REExLCAweDI4QzEsIDB4NURBMiwgMHgyOEJDLCAweDVEQTcsIDB4MkIyQywKLSAgICAweDVEQTgsIDB4MkIzMSwgMHg1REE5LCAweDJCMkIsIDB4NURBQSwgMHgyQjMwLCAweDVEQUMsIDB4MkIyOSwKLSAgICAweDVEQUQsIDB4MkIzMywgMHg1REFFLCAweDJCMkYsIDB4NURBRiwgMHgyQjM0LCAweDVEQjAsIDB4MkIyRSwKLSAgICAweDVEQjEsIDB4MkIyQSwgMHg1REIyLCAweDJCMzIsIDB4NURCNCwgMHgyQjM1LCAweDVEQjUsIDB4MkIyRCwKLSAgICAweDVEQjcsIDB4MkQ1QiwgMHg1REI4LCAweDEzQ0MsIDB4NURCQSwgMHgxM0NBLCAweDVEQkMsIDB4MTNDOSwKLSAgICAweDVEQkQsIDB4MTNDQiwgMHg1REMwLCAweDJGMUIsIDB4NURDMiwgMHgzMDIzLCAweDVEQzMsIDB4MzA4QywKLSAgICAweDVEQzYsIDB4MzFDRCwgMHg1REM3LCAweDMxQ0UsIDB4NURDOSwgMHgxNjEzLCAweDVEQ0IsIDB4MzJDRSwKLSAgICAweDVEQ0QsIDB4MTY2RiwgMHg1RENGLCAweDMyQ0YsIDB4NUREMSwgMHgzMzdGLCAweDVERDIsIDB4MTZDMiwKLSAgICAweDVERDQsIDB4MTZDMSwgMHg1REQ1LCAweDMzN0UsIDB4NURENiwgMHgxNkY3LCAweDVERDgsIDB4MzQxNCwKLSAgICAweDVEREIsIDB4MDIyNiwgMHg1RERELCAweDAyODcsIDB4NURERSwgMHgwM0M4LCAweDVEREYsIDB4MTdFMywKLSAgICAweDVERTAsIDB4MTg3MSwgMHg1REUxLCAweDA1MUEsIDB4NURFMiwgMHgwQTZCLCAweDVERTUsIDB4MDI4OCwKLSAgICAweDVERTYsIDB4MDMzOCwgMHg1REU3LCAweDAzMzcsIDB4NURFOCwgMHgwMzM2LCAweDVERUIsIDB4MDQ4RCwKLSAgICAweDVERUUsIDB4MDhBOCwgMHg1REYwLCAweDIzQzYsIDB4NURGMSwgMHgwMjg5LCAweDVERjIsIDB4MDI4QSwKLSAgICAweDVERjMsIDB4MDI4QiwgMHg1REY0LCAweDAyQ0IsIDB4NURGNywgMHgwNzBELCAweDVERjksIDB4MUFDOSwKLSAgICAweDVERkQsIDB4MEMzNiwgMHg1REZFLCAweDAyOEMsIDB4NURGRiwgMHgxNzg4LCAweDVFMDIsIDB4MDMzOSwKLSAgICAweDVFMDMsIDB4MDMzQSwgMHg1RTA0LCAweDE3QTQsIDB4NUUwNiwgMHgwM0M5LCAweDVFMEEsIDB4MTg3MiwKLSAgICAweDVFMEMsIDB4MDQ4RSwgMHg1RTBFLCAweDE4NzMsIDB4NUUxMSwgMHgwNUIwLCAweDVFMTQsIDB4MTk3MCwKLSAgICAweDVFMTUsIDB4MDVBRSwgMHg1RTE2LCAweDA1QUQsIDB4NUUxNywgMHgxOTZGLCAweDVFMTgsIDB4MDVBQiwKLSAgICAweDVFMTksIDB4MTk3MSwgMHg1RTFBLCAweDA1QUMsIDB4NUUxQiwgMHgwNUFGLCAweDVFMUQsIDB4MDcwRSwKLSAgICAweDVFMUYsIDB4MDcxMCwgMHg1RTIwLCAweDFBQ0QsIDB4NUUyMSwgMHgxQUNBLCAweDVFMjIsIDB4MUFDQiwKLSAgICAweDVFMjMsIDB4MUFDQywgMHg1RTI0LCAweDFBQ0UsIDB4NUUyNSwgMHgwNzBGLCAweDVFMjgsIDB4MUM4NywKLSAgICAweDVFMjksIDB4MUM4NiwgMHg1RTJCLCAweDA4QUEsIDB4NUUyRCwgMHgwOEE5LCAweDVFMzMsIDB4MEE2RSwKLSAgICAweDVFMzQsIDB4MUVDRCwgMHg1RTM2LCAweDBBNkQsIDB4NUUzNywgMHgwQTZGLCAweDVFMzgsIDB4MEE2QywKLSAgICAweDVFM0QsIDB4MEMzOCwgMHg1RTNFLCAweDFFQ0MsIDB4NUU0MCwgMHgwQzM5LCAweDVFNDEsIDB4MjEyRSwKLSAgICAweDVFNDMsIDB4MEMzQSwgMHg1RTQ0LCAweDIxMkQsIDB4NUU0NSwgMHgwQzM3LCAweDVFNEEsIDB4MjNDOSwKLSAgICAweDVFNEIsIDB4MjNDQiwgMHg1RTRDLCAweDBERkYsIDB4NUU0RCwgMHgyM0NBLCAweDVFNEUsIDB4MjNDOCwKLSAgICAweDVFNEYsIDB4MjNDNywgMHg1RTUzLCAweDI2NzQsIDB4NUU1NCwgMHgwRkM5LCAweDVFNTUsIDB4MEZDNywKLSAgICAweDVFNTcsIDB4MEZDOCwgMHg1RTU4LCAweDI2NzIsIDB4NUU1OSwgMHgyNjczLCAweDVFNUIsIDB4MEZDNSwKLSAgICAweDVFNUMsIDB4MjhDNywgMHg1RTVELCAweDI4QzUsIDB4NUU1RiwgMHgxMTM5LCAweDVFNjAsIDB4MjhDNiwKLSAgICAweDVFNjEsIDB4MTEzQSwgMHg1RTYyLCAweDExMzgsIDB4NUU2MywgMHgwRkM2LCAweDVFNjYsIDB4MkIzOCwKLSAgICAweDVFNjcsIDB4MkIzNiwgMHg1RTY4LCAweDJCMzcsIDB4NUU2OSwgMHgyOEM0LCAweDVFNkEsIDB4MkQ1RCwKLSAgICAweDVFNkIsIDB4MTNDRCwgMHg1RTZDLCAweDJENUMsIDB4NUU2RCwgMHgyRjFDLCAweDVFNkUsIDB4MkYxRCwKLSAgICAweDVFNkYsIDB4MkIzOSwgMHg1RTcwLCAweDMwOEQsIDB4NUU3MiwgMHgwMjhELCAweDVFNzMsIDB4MDMzQiwKLSAgICAweDVFNzQsIDB4MDNDQiwgMHg1RTc1LCAweDE3RTQsIDB4NUU3NiwgMHgwM0NBLCAweDVFNzgsIDB4MDVCMSwKLSAgICAweDVFNzksIDB4MEUwMCwgMHg1RTdBLCAweDAyMjcsIDB4NUU3QiwgMHgwMkNDLCAweDVFN0MsIDB4MDMzQywKLSAgICAweDVFN0QsIDB4MDcxMSwgMHg1RTdFLCAweDBDM0IsIDB4NUU3RiwgMHgwMjI4LCAweDVFODAsIDB4MTdBNSwKLSAgICAweDVFODIsIDB4MTdBNiwgMHg1RTg0LCAweDE3RTUsIDB4NUU4NywgMHgwNDkwLCAweDVFODgsIDB4MTg3NywKLSAgICAweDVFODksIDB4MTg3NSwgMHg1RThBLCAweDA0OTEsIDB4NUU4QiwgMHgxODc0LCAweDVFOEMsIDB4MTg3NiwKLSAgICAweDVFOEQsIDB4MTg3OCwgMHg1RThGLCAweDA0OEYsIDB4NUU5NSwgMHgwNUI1LCAweDVFOTYsIDB4MDVCNiwKLSAgICAweDVFOTcsIDB4MDVCMywgMHg1RTlBLCAweDA1QjIsIDB4NUU5QiwgMHgxQUQyLCAweDVFOUMsIDB4MDVCNCwKLSAgICAweDVFQTAsIDB4MDcxMiwgMHg1RUEyLCAweDFBRDEsIDB4NUVBMywgMHgxQUQzLCAweDVFQTQsIDB4MUFEMCwKLSAgICAweDVFQTUsIDB4MUFENCwgMHg1RUE2LCAweDA3MTMsIDB4NUVBNywgMHgwOEFELCAweDVFQTgsIDB4MUM4OCwKLSAgICAweDVFQUEsIDB4MUM4QSwgMHg1RUFCLCAweDA4QUIsIDB4NUVBQywgMHgxQzhCLCAweDVFQUQsIDB4MDhBQywKLSAgICAweDVFQUUsIDB4MUM4OSwgMHg1RUIwLCAweDFBQ0YsIDB4NUVCMSwgMHgxRUNFLCAweDVFQjIsIDB4MUVEMSwKLSAgICAweDVFQjMsIDB4MUVEMiwgMHg1RUI0LCAweDFFQ0YsIDB4NUVCNSwgMHgwQTczLCAweDVFQjYsIDB4MEE3MiwKLSAgICAweDVFQjcsIDB4MEE3MCwgMHg1RUI4LCAweDBBNzEsIDB4NUVCOSwgMHgxRUQwLCAweDVFQkUsIDB4MEE3NCwKLSAgICAweDVFQzEsIDB4MEMzRCwgMHg1RUMyLCAweDBDM0UsIDB4NUVDNCwgMHgwQzNGLCAweDVFQzUsIDB4MjNDQywKLSAgICAweDVFQzYsIDB4MjNDRSwgMHg1RUM3LCAweDIzRDAsIDB4NUVDOCwgMHgwRTAyLCAweDVFQzksIDB4MEUwMSwKLSAgICAweDVFQ0EsIDB4MEMzQywgMHg1RUNCLCAweDIzQ0YsIDB4NUVDQywgMHgyM0NELCAweDVFQ0UsIDB4MjY3OCwKLSAgICAweDVFRDEsIDB4MjY3NiwgMHg1RUQyLCAweDI2N0MsIDB4NUVEMywgMHgwRkNBLCAweDVFRDQsIDB4MjY3RCwKLSAgICAweDVFRDUsIDB4MjY3QSwgMHg1RUQ2LCAweDBGQ0IsIDB4NUVENywgMHgyNjc3LCAweDVFRDgsIDB4MjY3NSwKLSAgICAweDVFRDksIDB4MjY3QiwgMHg1RURBLCAweDExM0MsIDB4NUVEQiwgMHgyOEM5LCAweDVFREMsIDB4MjY3OSwKLSAgICAweDVFREQsIDB4MTEzRSwgMHg1RURFLCAweDI4Q0EsIDB4NUVERiwgMHgxMTNELCAweDVFRTAsIDB4MTE0MCwKLSAgICAweDVFRTEsIDB4MjhDQiwgMHg1RUUyLCAweDExM0IsIDB4NUVFMywgMHgxMTNGLCAweDVFRTUsIDB4MkIzRSwKLSAgICAweDVFRTYsIDB4MkIzQywgMHg1RUU3LCAweDJCM0IsIDB4NUVFOCwgMHgyQjNELCAweDVFRTksIDB4MkIzQSwKLSAgICAweDVFRUMsIDB4MTU3RCwgMHg1RUVFLCAweDMxQ0YsIDB4NUVFRiwgMHgzMUQwLCAweDVFRjEsIDB4MzJEMCwKLSAgICAweDVFRjIsIDB4MzM4MCwgMHg1RUYzLCAweDE3NDIsIDB4NUVGNCwgMHgwMjI5LCAweDVFRjYsIDB4MDVCNywKLSAgICAweDVFRjcsIDB4MDQ5MiwgMHg1RUZBLCAweDA3MTQsIDB4NUVGRSwgMHgwMjhFLCAweDVFRkYsIDB4MDJDRCwKLSAgICAweDVGMDEsIDB4MDMzRCwgMHg1RjAyLCAweDE3RTYsIDB4NUYwNCwgMHgwNDkzLCAweDVGMDUsIDB4MTg3OSwKLSAgICAweDVGMDcsIDB4MUFENSwgMHg1RjA4LCAweDA3MTUsIDB4NUYwQSwgMHgwRkNDLCAweDVGMEIsIDB4MDI4RiwKLSAgICAweDVGMEYsIDB4MDNDQywgMHg1RjEyLCAweDBFMDMsIDB4NUYxMywgMHgwMjkwLCAweDVGMTQsIDB4MDJDRSwKLSAgICAweDVGMTUsIDB4MDJDRiwgMHg1RjE3LCAweDAzM0YsIDB4NUYxOCwgMHgwMzNFLCAweDVGMUEsIDB4MTdFNywKLSAgICAweDVGMUIsIDB4MDNDRCwgMHg1RjFELCAweDE4N0EsIDB4NUYxRiwgMHgwNDk0LCAweDVGMjIsIDB4MTk3MywKLSAgICAweDVGMjMsIDB4MTk3NCwgMHg1RjI0LCAweDE5NzUsIDB4NUYyNiwgMHgwNUI4LCAweDVGMjcsIDB4MDVCOSwKLSAgICAweDVGMjgsIDB4MTk3MiwgMHg1RjI5LCAweDA1QkEsIDB4NUYyRCwgMHgwNzE2LCAweDVGMkUsIDB4MUFENiwKLSAgICAweDVGMzAsIDB4MUM4RCwgMHg1RjMxLCAweDA4QUUsIDB4NUYzMywgMHgxQzhDLCAweDVGMzUsIDB4MEE3NSwKLSAgICAweDVGMzYsIDB4MUVEMywgMHg1RjM3LCAweDBBNzYsIDB4NUYzOCwgMHgxRUQ0LCAweDVGM0MsIDB4MEM0MCwKLSAgICAweDVGNDAsIDB4MjNEMSwgMHg1RjQzLCAweDI2N0YsIDB4NUY0NCwgMHgyNjdFLCAweDVGNDYsIDB4MEZDRCwKLSAgICAweDVGNDgsIDB4MTE0MSwgMHg1RjQ5LCAweDI4Q0MsIDB4NUY0QSwgMHgxMkFELCAweDVGNEIsIDB4MkIzRiwKLSAgICAweDVGNEMsIDB4MTNDRSwgMHg1RjRFLCAweDE2QzMsIDB4NUY0RiwgMHgzNDE2LCAweDVGNTAsIDB4MDIyQSwKLSAgICAweDVGNTQsIDB4MTk3NiwgMHg1RjU2LCAweDFBRDcsIDB4NUY1NywgMHgwQTc3LCAweDVGNTgsIDB4MjEyRiwKLSAgICAweDVGNTksIDB4MEUwNCwgMHg1RjVELCAweDE0Q0YsIDB4NUY2MSwgMHgwMjJCLCAweDVGNjIsIDB4MDQ5NiwKLSAgICAweDVGNjQsIDB4MDQ5NSwgMHg1RjY1LCAweDA3MTcsIDB4NUY2NywgMHgxQzhFLCAweDVGNjksIDB4MEE3OSwKLSAgICAweDVGNkEsIDB4MEI4OSwgMHg1RjZCLCAweDBBN0EsIDB4NUY2QywgMHgwQTc4LCAweDVGNkQsIDB4MEM0MSwKLSAgICAweDVGNkYsIDB4MjY4MCwgMHg1RjcwLCAweDBGQ0UsIDB4NUY3MSwgMHgxMTQyLCAweDVGNzMsIDB4MTc3NywKLSAgICAweDVGNzQsIDB4MTdFOCwgMHg1Rjc2LCAweDE4N0MsIDB4NUY3NywgMHgwNDk3LCAweDVGNzgsIDB4MTg3QiwKLSAgICAweDVGNzksIDB4MDQ5OCwgMHg1RjdDLCAweDA1QkUsIDB4NUY3RCwgMHgxOTc5LCAweDVGN0UsIDB4MTk3OCwKLSAgICAweDVGN0YsIDB4MDVCRCwgMHg1RjgwLCAweDA1QkIsIDB4NUY4MSwgMHgwNUJDLCAweDVGODIsIDB4MTk3NywKLSAgICAweDVGODUsIDB4MDcxOSwgMHg1Rjg2LCAweDFBRDgsIDB4NUY4NywgMHgwNzFDLCAweDVGODgsIDB4MDcxOCwKLSAgICAweDVGODksIDB4MDcxRSwgMHg1RjhBLCAweDA3MUEsIDB4NUY4QiwgMHgwNzFCLCAweDVGOEMsIDB4MDcxRCwKLSAgICAweDVGOTAsIDB4MDhCMSwgMHg1RjkxLCAweDA4QjAsIDB4NUY5MiwgMHgwOEFGLCAweDVGOTYsIDB4MUVENiwKLSAgICAweDVGOTcsIDB4MEE3QiwgMHg1Rjk4LCAweDBBN0UsIDB4NUY5OSwgMHgwQTdDLCAweDVGOUIsIDB4MUVENSwKLSAgICAweDVGOUMsIDB4MEE4MSwgMHg1RjlFLCAweDBBN0QsIDB4NUY5RiwgMHgxRUQ3LCAweDVGQTAsIDB4MEE4MCwKLSAgICAweDVGQTEsIDB4MEE3RiwgMHg1RkE1LCAweDIxMzEsIDB4NUZBNiwgMHgyMTMwLCAweDVGQTgsIDB4MEM0NCwKLSAgICAweDVGQTksIDB4MEM0MiwgMHg1RkFBLCAweDBDNDMsIDB4NUZBQiwgMHgyMTMyLCAweDVGQUMsIDB4MEUwNSwKLSAgICAweDVGQUQsIDB4MjNEMywgMHg1RkFFLCAweDBFMDYsIDB4NUZBRiwgMHgyM0QyLCAweDVGQjIsIDB4MjhDRCwKLSAgICAweDVGQjUsIDB4MTE0NCwgMHg1RkI2LCAweDI2ODEsIDB4NUZCNywgMHgxMTQzLCAweDVGQjksIDB4MEZDRiwKLSAgICAweDVGQkIsIDB4MkI0MSwgMHg1RkJDLCAweDJCNDAsIDB4NUZCRCwgMHgxM0NGLCAweDVGQkUsIDB4MkQ1RSwKLSAgICAweDVGQkYsIDB4MzA4RSwgMHg1RkMwLCAweDMxRDEsIDB4NUZDMSwgMHgzMUQyLCAweDVGQzMsIDB4MDJEMCwKLSAgICAweDVGQzUsIDB4MDM0MCwgMHg1RkM5LCAweDE3QTcsIDB4NUZDQywgMHgwNDlBLCAweDVGQ0QsIDB4MDQ5QywKLSAgICAweDVGQ0YsIDB4MTdFQiwgMHg1RkQwLCAweDE4N0YsIDB4NUZEMSwgMHgxODdFLCAweDVGRDIsIDB4MTg3RCwKLSAgICAweDVGRDQsIDB4MTdFQSwgMHg1RkQ1LCAweDE3RTksIDB4NUZENiwgMHgwM0NGLCAweDVGRDcsIDB4MDQ5QiwKLSAgICAweDVGRDgsIDB4MDQ5OSwgMHg1RkQ5LCAweDAzQ0UsIDB4NUZERCwgMHgwNUJGLCAweDVGREUsIDB4MTk3QSwKLSAgICAweDVGRTAsIDB4MDVDMCwgMHg1RkUxLCAweDE4ODQsIDB4NUZFMywgMHgxODg2LCAweDVGRTQsIDB4MTg4NSwKLSAgICAweDVGRTUsIDB4MTk3QiwgMHg1RkU4LCAweDE4ODEsIDB4NUZFQSwgMHgwNEEwLCAweDVGRUIsIDB4MDQ5RSwKLSAgICAweDVGRUQsIDB4MTg4MCwgMHg1RkVFLCAweDE4ODIsIDB4NUZFRiwgMHgxODg4LCAweDVGRjEsIDB4MDQ5RCwKLSAgICAweDVGRjMsIDB4MTg4MywgMHg1RkY0LCAweDE4OEMsIDB4NUZGNSwgMHgwNUMyLCAweDVGRjcsIDB4MTg4OSwKLSAgICAweDVGRjgsIDB4MDQ5RiwgMHg1RkZBLCAweDE4ODcsIDB4NUZGQiwgMHgxODhBLCAweDVGRkQsIDB4MDVDMSwKLSAgICAweDVGRkYsIDB4MDVDMywgMHg2MDAwLCAweDE4OEIsIDB4NjAwOSwgMHgxOThGLCAweDYwMEEsIDB4MTk4MiwKLSAgICAweDYwMEIsIDB4MTk4MCwgMHg2MDBDLCAweDE5OEUsIDB4NjAwRCwgMHgxOTg5LCAweDYwMEUsIDB4MDcyMywKLSAgICAweDYwMEYsIDB4MDVDNCwgMHg2MDEwLCAweDE5OEEsIDB4NjAxMSwgMHgxOThELCAweDYwMTIsIDB4MDcxRiwKLSAgICAweDYwMTMsIDB4MTk4QywgMHg2MDE0LCAweDA1QzUsIDB4NjAxNSwgMHgwNUNBLCAweDYwMTYsIDB4MDVDOCwKLSAgICAweDYwMTcsIDB4MTk4MywgMHg2MDE5LCAweDE5N0UsIDB4NjAxQSwgMHgxOTg1LCAweDYwMUIsIDB4MDVDRiwKLSAgICAweDYwMUMsIDB4MTk5MCwgMHg2MDFELCAweDA3MjAsIDB4NjAxRSwgMHgxOTg2LCAweDYwMjAsIDB4MDcyMSwKLSAgICAweDYwMjEsIDB4MDVDQiwgMHg2MDIyLCAweDE5ODgsIDB4NjAyNCwgMHgxQUU3LCAweDYwMjUsIDB4MDcyMiwKLSAgICAweDYwMjYsIDB4MTk3RCwgMHg2MDI3LCAweDA1Q0MsIDB4NjAyOCwgMHgwNzI0LCAweDYwMjksIDB4MDVDRCwKLSAgICAweDYwMkEsIDB4MDVDOSwgMHg2MDJCLCAweDA1Q0UsIDB4NjAyQywgMHgxOTg3LCAweDYwMkQsIDB4MTk3QywKLSAgICAweDYwMkUsIDB4MTk4QiwgMHg2MDJGLCAweDA1QzYsIDB4NjAzMiwgMHgxOTdGLCAweDYwMzMsIDB4MTk4NCwKLSAgICAweDYwMzQsIDB4MTk4MSwgMHg2MDM1LCAweDA1QzcsIDB4NjAzNywgMHgxQUQ5LCAweDYwMzksIDB4MUFEQSwKLSAgICAweDYwNDAsIDB4MUFFNCwgMHg2MDQxLCAweDFDOTIsIDB4NjA0MiwgMHgxQUU1LCAweDYwNDMsIDB4MDcyQSwKLSAgICAweDYwNDQsIDB4MUFFOCwgMHg2MDQ1LCAweDFBREUsIDB4NjA0NiwgMHgwNzI5LCAweDYwNDcsIDB4MUFFMCwKLSAgICAweDYwNDksIDB4MUFFMSwgMHg2MDRDLCAweDFBRTMsIDB4NjA0RCwgMHgwNzI1LCAweDYwNTAsIDB4MDhCNSwKLSAgICAweDYwNTIsIDB4MzZFQywgMHg2MDUzLCAweDFBREYsIDB4NjA1NCwgMHgxQURCLCAweDYwNTUsIDB4MDhCNiwKLSAgICAweDYwNTgsIDB4MUFFOSwgMHg2MDU5LCAweDA4QjIsIDB4NjA1QSwgMHgxQzkwLCAweDYwNUIsIDB4MUFFMiwKLSAgICAweDYwNUQsIDB4MUM4RiwgMHg2MDVFLCAweDFBREQsIDB4NjA1RiwgMHgxQUU2LCAweDYwNjIsIDB4MDcyOCwKLSAgICAweDYwNjMsIDB4MDhCMywgMHg2MDY0LCAweDA3MkUsIDB4NjA2NSwgMHgwOEI0LCAweDYwNjYsIDB4MUFFQSwKLSAgICAweDYwNjcsIDB4MUM5MSwgMHg2MDY4LCAweDA3MjcsIDB4NjA2OSwgMHgwOEI4LCAweDYwNkEsIDB4MDcyRCwKLSAgICAweDYwNkIsIDB4MDcyQywgMHg2MDZDLCAweDA3MkIsIDB4NjA2RCwgMHgwOEI3LCAweDYwNkUsIDB4MUFFQiwKLSAgICAweDYwNkYsIDB4MDhCOSwgMHg2MDcwLCAweDA3MjYsIDB4NjA3MiwgMHgxQURDLCAweDYwN0YsIDB4MEE4MiwKLSAgICAweDYwODAsIDB4MUM5NSwgMHg2MDgxLCAweDFDOTcsIDB4NjA4MywgMHgxQzk5LCAweDYwODQsIDB4MDhCQSwKLSAgICAweDYwODUsIDB4MDhDMCwgMHg2MDg2LCAweDFFREEsIDB4NjA4NywgMHgxQzlELCAweDYwODgsIDB4MUM5NCwKLSAgICAweDYwODksIDB4MEE4NCwgMHg2MDhBLCAweDFFRDgsIDB4NjA4QywgMHgwOEJGLCAweDYwOEQsIDB4MDhCRCwKLSAgICAweDYwOEUsIDB4MUM5RiwgMHg2MDkwLCAweDFFRDksIDB4NjA5MiwgMHgxQzk2LCAweDYwOTQsIDB4MDhCRSwKLSAgICAweDYwOTUsIDB4MUM5QSwgMHg2MDk2LCAweDA4QzEsIDB4NjA5NywgMHgxQzlDLCAweDYwOUEsIDB4MDhCQywKLSAgICAweDYwOUIsIDB4MUM5QiwgMHg2MDlDLCAweDFDOUUsIDB4NjA5RCwgMHgxQzk4LCAweDYwOUYsIDB4MDhCQiwKLSAgICAweDYwQTAsIDB4MEE4NSwgMHg2MEEyLCAweDFDOTMsIDB4NjBBMywgMHgwQTgzLCAweDYwQTgsIDB4MEE4NiwKLSAgICAweDYwQjAsIDB4MUVEQywgMHg2MEIxLCAweDFFRTUsIDB4NjBCMiwgMHgwQzQ3LCAweDYwQjQsIDB4MEE4OCwKLSAgICAweDYwQjUsIDB4MEE4RCwgMHg2MEI2LCAweDBDNDgsIDB4NjBCNywgMHgxRUU3LCAweDYwQjgsIDB4MEE5NCwKLSAgICAweDYwQjksIDB4MjEzNCwgMHg2MEJBLCAweDFFREQsIDB4NjBCQiwgMHgwQThDLCAweDYwQkMsIDB4MEE4RiwKLSAgICAweDYwQkQsIDB4MEE4QSwgMHg2MEJFLCAweDFFREIsIDB4NjBCRiwgMHgxRUU5LCAweDYwQzAsIDB4MUVFQywKLSAgICAweDYwQzEsIDB4MjE0MywgMHg2MEMzLCAweDFFRUEsIDB4NjBDNCwgMHgyMTM4LCAweDYwQzUsIDB4MEE4QiwKLSAgICAweDYwQzYsIDB4MEE5MiwgMHg2MEM3LCAweDBBOTYsIDB4NjBDOCwgMHgxRUU0LCAweDYwQzksIDB4MjEzMywKLSAgICAweDYwQ0EsIDB4MUVFOCwgMHg2MENCLCAweDBBODcsIDB4NjBDQywgMHgyMTM1LCAweDYwQ0QsIDB4MUVFQiwKLSAgICAweDYwQ0UsIDB4MjEzNywgMHg2MENGLCAweDFFRTAsIDB4NjBEMSwgMHgwQzQ1LCAweDYwRDMsIDB4MUVERSwKLSAgICAweDYwRDQsIDB4MUVERiwgMHg2MEQ1LCAweDBBOTEsIDB4NjBEOCwgMHgwQTkwLCAweDYwRDksIDB4MUVFMiwKLSAgICAweDYwREEsIDB4MEE5NSwgMHg2MERCLCAweDFFRTYsIDB4NjBEQywgMHgwQThFLCAweDYwREQsIDB4MUVFMywKLSAgICAweDYwREYsIDB4MEE5MywgMHg2MEUwLCAweDBDNDksIDB4NjBFMSwgMHgwQzQ2LCAweDYwRTIsIDB4MjEzNiwKLSAgICAweDYwRTQsIDB4MUVFMSwgMHg2MEU2LCAweDBBODksIDB4NjBGMCwgMHgwQzRFLCAweDYwRjEsIDB4MEM1MiwKLSAgICAweDYwRjIsIDB4MjEzQSwgMHg2MEYzLCAweDBFMEIsIDB4NjBGNCwgMHgwQzUwLCAweDYwRjUsIDB4MjEzRSwKLSAgICAweDYwRjYsIDB4MEM1NCwgMHg2MEY3LCAweDIzRDQsIDB4NjBGOCwgMHgyMTQwLCAweDYwRjksIDB4MEUwRCwKLSAgICAweDYwRkEsIDB4MEM0QywgMHg2MEZCLCAweDBDNEYsIDB4NjBGQywgMHgyMTQxLCAweDYwRkUsIDB4MjE0MiwKLSAgICAweDYwRkYsIDB4MjE0OCwgMHg2MTAwLCAweDBDNTYsIDB4NjEwMSwgMHgwRTBFLCAweDYxMDMsIDB4MjE0NCwKLSAgICAweDYxMDQsIDB4MjE0OSwgMHg2MTA1LCAweDIxM0QsIDB4NjEwNiwgMHgwRTE4LCAweDYxMDgsIDB4MEUwRiwKLSAgICAweDYxMDksIDB4MEM1NSwgMHg2MTBBLCAweDIxM0IsIDB4NjEwQiwgMHgyMTRBLCAweDYxMEQsIDB4MEUxNywKLSAgICAweDYxMEUsIDB4MEM1MywgMHg2MTBGLCAweDBFMDgsIDB4NjExMCwgMHgyMTQ3LCAweDYxMTIsIDB4MEM1NywKLSAgICAweDYxMTMsIDB4MjEzRiwgMHg2MTE0LCAweDIxMzksIDB4NjExNSwgMHgwQzRELCAweDYxMTYsIDB4MjEzQywKLSAgICAweDYxMTgsIDB4MjE0NSwgMHg2MTFBLCAweDBFMDcsIDB4NjExQiwgMHgwRTBDLCAweDYxMUMsIDB4MEM0QSwKLSAgICAweDYxMUQsIDB4MjE0NiwgMHg2MTFGLCAweDBFMEEsIDB4NjEyMywgMHgwQzRCLCAweDYxMjcsIDB4MEUxNiwKLSAgICAweDYxMjgsIDB4MjY4MywgMHg2MTI5LCAweDIzREYsIDB4NjEyQiwgMHgyM0Q3LCAweDYxMkMsIDB4MjY4MiwKLSAgICAweDYxMkUsIDB4MjNEQiwgMHg2MTJGLCAweDIzREQsIDB4NjEzMiwgMHgyM0RBLCAweDYxMzQsIDB4MEUxNSwKLSAgICAweDYxMzYsIDB4MjNEOSwgMHg2MTM3LCAweDBFMTksIDB4NjEzQiwgMHgyNjkyLCAweDYxM0UsIDB4MEUxNCwKLSAgICAweDYxM0YsIDB4MEZEMSwgMHg2MTQwLCAweDIzRTAsIDB4NjE0MSwgMHgyNjg0LCAweDYxNDQsIDB4MEUxMiwKLSAgICAweDYxNDUsIDB4MjNEOCwgMHg2MTQ2LCAweDIzREMsIDB4NjE0NywgMHgwRkQwLCAweDYxNDgsIDB4MEUwOSwKLSAgICAweDYxNDksIDB4MjNENSwgMHg2MTRBLCAweDIzRDYsIDB4NjE0QiwgMHgwRkQyLCAweDYxNEMsIDB4MEUxMSwKLSAgICAweDYxNEQsIDB4MEUxMywgMHg2MTRFLCAweDBFMTAsIDB4NjE0RiwgMHgyM0RFLCAweDYxNTIsIDB4MjY4OCwKLSAgICAweDYxNTMsIDB4MjY4OSwgMHg2MTU0LCAweDI2OEUsIDB4NjE1NSwgMHgxMTQ5LCAweDYxNTYsIDB4MjY5NSwKLSAgICAweDYxNTgsIDB4MEZEOCwgMHg2MTVBLCAweDBGRDcsIDB4NjE1QiwgMHgyNjkwLCAweDYxNUQsIDB4MTE0OCwKLSAgICAweDYxNUUsIDB4MjY4NSwgMHg2MTVGLCAweDBGRDYsIDB4NjE2MSwgMHgyNjk0LCAweDYxNjIsIDB4MEZENCwKLSAgICAweDYxNjMsIDB4MEZENSwgMHg2MTY1LCAweDI2OTEsIDB4NjE2NiwgMHgyOERFLCAweDYxNjcsIDB4MTE0NiwKLSAgICAweDYxNjgsIDB4MEM1MSwgMHg2MTZBLCAweDI2OTMsIDB4NjE2QiwgMHgxMTRELCAweDYxNkMsIDB4MjY4QiwKLSAgICAweDYxNkUsIDB4MTE0NywgMHg2MTcwLCAweDExNEMsIDB4NjE3MSwgMHgyNjg2LCAweDYxNzIsIDB4MjY4QSwKLSAgICAweDYxNzMsIDB4MjY4NywgMHg2MTc0LCAweDI2OEQsIDB4NjE3NSwgMHgwRkQ5LCAweDYxNzYsIDB4MTE0NSwKLSAgICAweDYxNzcsIDB4MEZEMywgMHg2MTc5LCAweDI4RDAsIDB4NjE3QSwgMHgyNjhGLCAweDYxN0MsIDB4MTE0QiwKLSAgICAweDYxN0UsIDB4MTE0RSwgMHg2MTgwLCAweDI2OEMsIDB4NjE4MiwgMHgxMTRBLCAweDYxODMsIDB4MjhDRiwKLSAgICAweDYxODksIDB4MjhENCwgMHg2MThBLCAweDEyQjEsIDB4NjE4QiwgMHgyOENFLCAweDYxOEMsIDB4MkI0RCwKLSAgICAweDYxOEQsIDB4MjhERCwgMHg2MThFLCAweDExNTIsIDB4NjE5MCwgMHgxMTUwLCAweDYxOTEsIDB4MTJBRiwKLSAgICAweDYxOTIsIDB4MjhEQSwgMHg2MTkzLCAweDI4RDYsIDB4NjE5NCwgMHgxMTU2LCAweDYxOTYsIDB4MkI0NCwKLSAgICAweDYxOUEsIDB4MTE1NCwgMHg2MTlCLCAweDI4RDUsIDB4NjE5RCwgMHgyQjQyLCAweDYxOUYsIDB4MjhEOSwKLSAgICAweDYxQTEsIDB4MjhEQywgMHg2MUEyLCAweDI4RDMsIDB4NjFBNCwgMHgxMTU1LCAweDYxQTcsIDB4MTE0RiwKLSAgICAweDYxQTgsIDB4MkI0MywgMHg2MUE5LCAweDEyQjAsIDB4NjFBQSwgMHgyOERCLCAweDYxQUIsIDB4MTE1MSwKLSAgICAweDYxQUMsIDB4MTE1MywgMHg2MUFELCAweDI4RDgsIDB4NjFBRSwgMHgxMTU3LCAweDYxQUYsIDB4MjhENywKLSAgICAweDYxQjAsIDB4MjhEMiwgMHg2MUIxLCAweDI4RDEsIDB4NjFCMiwgMHgxMkFFLCAweDYxQjMsIDB4MjhERiwKLSAgICAweDYxQjQsIDB4MkI0NiwgMHg2MUI1LCAweDJENjAsIDB4NjFCNiwgMHgxMkIzLCAweDYxQjgsIDB4MkI0QywKLSAgICAweDYxQkEsIDB4MkI0QSwgMHg2MUJDLCAweDJENjEsIDB4NjFCRSwgMHgxMkI0LCAweDYxQkYsIDB4MkI0QiwKLSAgICAweDYxQzEsIDB4MkI0OCwgMHg2MUMyLCAweDEzRDEsIDB4NjFDMywgMHgyRDVGLCAweDYxQzUsIDB4MkI0NSwKLSAgICAweDYxQzYsIDB4MkI0NywgMHg2MUM3LCAweDEzRDIsIDB4NjFDOCwgMHgxMkI2LCAweDYxQzksIDB4MTNEMCwKLSAgICAweDYxQ0EsIDB4MTJCNSwgMHg2MUNCLCAweDEzRDQsIDB4NjFDQywgMHgyQjQ5LCAweDYxQ0QsIDB4MTJCMiwKLSAgICAweDYxRDYsIDB4MkYyNiwgMHg2MUQ4LCAweDJGMUUsIDB4NjFERSwgMHgyRDY3LCAweDYxREYsIDB4MkYxRiwKLSAgICAweDYxRTAsIDB4MkQ2MywgMHg2MUUzLCAweDE0RDAsIDB4NjFFNCwgMHgyRDY1LCAweDYxRTUsIDB4MkQ2NCwKLSAgICAweDYxRTYsIDB4MTNEMywgMHg2MUU3LCAweDJENjIsIDB4NjFFOCwgMHgyRDY2LCAweDYxRTksIDB4MkYyNywKLSAgICAweDYxRUEsIDB4MkYyMywgMHg2MUVCLCAweDJGMjUsIDB4NjFFRCwgMHgyRjIwLCAweDYxRUUsIDB4MkYyMSwKLSAgICAweDYxRjAsIDB4MkYyNCwgMHg2MUYxLCAweDJGMjIsIDB4NjFGMiwgMHgxNTdFLCAweDYxRjUsIDB4MTU4MSwKLSAgICAweDYxRjYsIDB4MTU4MCwgMHg2MUY3LCAweDE1N0YsIDB4NjFGOCwgMHgxNjE0LCAweDYxRjksIDB4MzFEMywKLSAgICAweDYxRkEsIDB4MTYxNSwgMHg2MUZCLCAweDMwOEYsIDB4NjFGQywgMHgxNjcwLCAweDYxRkQsIDB4MzJEMSwKLSAgICAweDYxRkUsIDB4MTY3MSwgMHg2MUZGLCAweDE2QzQsIDB4NjIwMCwgMHgxNkY4LCAweDYyMDEsIDB4MzQxNywKLSAgICAweDYyMDMsIDB4MzQxOCwgMHg2MjA0LCAweDM0MTksIDB4NjIwNywgMHgzNTMzLCAweDYyMDgsIDB4MDJEMSwKLSAgICAweDYyMDksIDB4MTdBOCwgMHg2MjBBLCAweDAzNDEsIDB4NjIwQywgMHgwM0QxLCAweDYyMEQsIDB4MDNEMiwKLSAgICAweDYyMEUsIDB4MDNEMCwgMHg2MjEwLCAweDAzRDMsIDB4NjIxMSwgMHgwNEEyLCAweDYyMTIsIDB4MDRBMSwKLSAgICAweDYyMTQsIDB4MTk5MSwgMHg2MjE1LCAweDA1RDEsIDB4NjIxNiwgMHgwNUQwLCAweDYyMTksIDB4MUNBMCwKLSAgICAweDYyMUEsIDB4MEE5NywgMHg2MjFCLCAweDBBOTgsIDB4NjIxRiwgMHgwQzU4LCAweDYyMjAsIDB4MjNFMSwKLSAgICAweDYyMjEsIDB4MEUxQSwgMHg2MjIyLCAweDBFMUIsIDB4NjIyMywgMHgyM0UzLCAweDYyMjQsIDB4MjNFNSwKLSAgICAweDYyMjUsIDB4MjNFNCwgMHg2MjI3LCAweDI2OTcsIDB4NjIyOSwgMHgyNjk2LCAweDYyMkEsIDB4MEZEQSwKLSAgICAweDYyMkIsIDB4MjY5OCwgMHg2MjJELCAweDI4RTAsIDB4NjIyRSwgMHgxMTU4LCAweDYyMzAsIDB4MTJCNywKLSAgICAweDYyMzIsIDB4MTNENSwgMHg2MjMzLCAweDE0RDEsIDB4NjIzNCwgMHgxM0Q2LCAweDYyMzYsIDB4MDJEMiwKLSAgICAweDYyM0EsIDB4MTg4RCwgMHg2MjNELCAweDE5OTIsIDB4NjIzRSwgMHgwNUQzLCAweDYyM0YsIDB4MDVEMiwKLSAgICAweDYyNDAsIDB4MDVENCwgMHg2MjQxLCAweDA3MkYsIDB4NjI0MiwgMHgxQUVDLCAweDYyNDMsIDB4MUFFRCwKLSAgICAweDYyNDYsIDB4MUNBMSwgMHg2MjQ3LCAweDA4QzIsIDB4NjI0OCwgMHgwQTk5LCAweDYyNDksIDB4MEM1OSwKLSAgICAweDYyNEEsIDB4MjE0QiwgMHg2MjRCLCAweDAyRDMsIDB4NjI0RCwgMHgwMjkxLCAweDYyNEUsIDB4MDJENCwKLSAgICAweDYyNTAsIDB4MTdBOSwgMHg2MjUxLCAweDAzNDUsIDB4NjI1MiwgMHgwMzQ0LCAweDYyNTMsIDB4MDM0MiwKLSAgICAweDYyNTQsIDB4MDM0MywgMHg2MjU4LCAweDAzRDYsIDB4NjI1OSwgMHgxN0YyLCAweDYyNUEsIDB4MTdGNCwKLSAgICAweDYyNUIsIDB4MDNENSwgMHg2MjVDLCAweDE3RUMsIDB4NjI1RSwgMHgxN0VELCAweDYyNjAsIDB4MTdGMywKLSAgICAweDYyNjEsIDB4MTdFRiwgMHg2MjYyLCAweDE3RjEsIDB4NjI2MywgMHgwM0Q0LCAweDYyNjQsIDB4MTdFRSwKLSAgICAweDYyNjUsIDB4MTdGNSwgMHg2MjY2LCAweDE3RjAsIDB4NjI2RCwgMHgwNEE5LCAweDYyNkUsIDB4MDRCMiwKLSAgICAweDYyNkYsIDB4MDRCMCwgMHg2MjcwLCAweDE4OTcsIDB4NjI3MSwgMHgxODk0LCAweDYyNzIsIDB4MTg5QywKLSAgICAweDYyNzMsIDB4MDRBRSwgMHg2Mjc0LCAweDE4OUQsIDB4NjI3NiwgMHgwNEE3LCAweDYyNzcsIDB4MTg5QSwKLSAgICAweDYyNzksIDB4MDRBRCwgMHg2MjdBLCAweDE4OTYsIDB4NjI3QiwgMHgxODk1LCAweDYyN0MsIDB4MDRBQiwKLSAgICAweDYyN0QsIDB4MTg5QiwgMHg2MjdFLCAweDA0QUMsIDB4NjI3RiwgMHgwNUQ1LCAweDYyODAsIDB4MDRBNiwKLSAgICAweDYyODEsIDB4MTg5OCwgMHg2MjgzLCAweDE4OEUsIDB4NjI4NCwgMHgwNEEzLCAweDYyODYsIDB4MDRCNiwKLSAgICAweDYyODcsIDB4MTg5MywgMHg2Mjg4LCAweDE4OTksIDB4NjI4OSwgMHgwNEE4LCAweDYyOEEsIDB4MDRBQSwKLSAgICAweDYyOEMsIDB4MTg4RiwgMHg2MjhFLCAweDE4OTAsIDB4NjI4RiwgMHgxODkxLCAweDYyOTEsIDB4MDRCNSwKLSAgICAweDYyOTIsIDB4MDRBRiwgMHg2MjkzLCAweDA0QjQsIDB4NjI5NCwgMHgxODkyLCAweDYyOTUsIDB4MDRCMywKLSAgICAweDYyOTYsIDB4MDRBNSwgMHg2Mjk3LCAweDA0QTQsIDB4NjI5OCwgMHgwNEIxLCAweDYyQTgsIDB4MDVFMywKLSAgICAweDYyQTksIDB4MTk5RSwgMHg2MkFBLCAweDE5OTcsIDB4NjJBQiwgMHgwNURFLCAweDYyQUMsIDB4MDVGMSwKLSAgICAweDYyQUQsIDB4MTk5MywgMHg2MkFFLCAweDE5OUEsIDB4NjJBRiwgMHgxOTlDLCAweDYyQjAsIDB4MTk5RiwKLSAgICAweDYyQjEsIDB4MDVFQywgMHg2MkIzLCAweDE5OUIsIDB4NjJCNCwgMHgxOTk0LCAweDYyQjUsIDB4MDVFQSwKLSAgICAweDYyQjYsIDB4MTk5OCwgMHg2MkI4LCAweDE5QTAsIDB4NjJCOSwgMHgwNURCLCAweDYyQkIsIDB4MTk5RCwKLSAgICAweDYyQkMsIDB4MDVFNSwgMHg2MkJELCAweDA1RTQsIDB4NjJCRSwgMHgxOTk2LCAweDYyQkYsIDB4MDVEOSwKLSAgICAweDYyQzIsIDB4MDVEQSwgMHg2MkM0LCAweDA1RDgsIDB4NjJDNiwgMHgwNUYwLCAweDYyQzcsIDB4MDVFOCwKLSAgICAweDYyQzgsIDB4MDVFMiwgMHg2MkM5LCAweDA1RDYsIDB4NjJDQSwgMHgxOTk5LCAweDYyQ0IsIDB4MDVFMSwKLSAgICAweDYyQ0MsIDB4MDVENywgMHg2MkNELCAweDA1RTksIDB4NjJDRSwgMHgwNUYyLCAweDYyQ0YsIDB4MUFFRSwKLSAgICAweDYyRDAsIDB4MDVFNiwgMHg2MkQxLCAweDE5OTUsIDB4NjJEMiwgMHgwNURDLCAweDYyRDMsIDB4MDVERiwKLSAgICAweDYyRDQsIDB4MDVFMCwgMHg2MkQ2LCAweDA1RUUsIDB4NjJENywgMHgwNUVGLCAweDYyRDgsIDB4MDVFRCwKLSAgICAweDYyRDksIDB4MDVFNywgMHg2MkRBLCAweDA1RUIsIDB4NjJEQiwgMHgwNURELCAweDYyREMsIDB4MDczMCwKLSAgICAweDYyRUIsIDB4MUFGNCwgMHg2MkVDLCAweDA3M0MsIDB4NjJFRCwgMHgwNzM0LCAweDYyRUUsIDB4MDczNiwKLSAgICAweDYyRUYsIDB4MDczQiwgMHg2MkYwLCAweDFCMDAsIDB4NjJGMSwgMHgwNzM5LCAweDYyRjIsIDB4MUNBMiwKLSAgICAweDYyRjMsIDB4MDhDMywgMHg2MkY0LCAweDA3M0UsIDB4NjJGNSwgMHgxQUYxLCAweDYyRjYsIDB4MUFGOSwKLSAgICAweDYyRjcsIDB4MDczQSwgMHg2MkY4LCAweDFBRjgsIDB4NjJGOSwgMHgxQUY1LCAweDYyRkEsIDB4MUFGRCwKLSAgICAweDYyRkIsIDB4MUFGRiwgMHg2MkZDLCAweDA3MzMsIDB4NjJGRCwgMHgwNzM3LCAweDYyRkUsIDB4MDczRCwKLSAgICAweDYyRkYsIDB4MDhDNSwgMHg2MzAwLCAweDFBRkEsIDB4NjMwMSwgMHgwNzM1LCAweDYzMDIsIDB4MDc0MCwKLSAgICAweDYzMDMsIDB4MUFGMywgMHg2MzA3LCAweDA3MzgsIDB4NjMwOCwgMHgwOEM0LCAweDYzMDksIDB4MDczMiwKLSAgICAweDYzMEIsIDB4MUFGMCwgMHg2MzBDLCAweDFBRjcsIDB4NjMwRCwgMHgxQUVGLCAweDYzMEUsIDB4MUFGMiwKLSAgICAweDYzMEYsIDB4MUFGNiwgMHg2MzEwLCAweDFDQTMsIDB4NjMxMSwgMHgwNzNGLCAweDYzMTMsIDB4MUFGQiwKLSAgICAweDYzMTQsIDB4MUFGQywgMHg2MzE1LCAweDFBRkUsIDB4NjMxNiwgMHgwNzMxLCAweDYzMjgsIDB4MDhEMywKLSAgICAweDYzMjksIDB4MUNBRiwgMHg2MzJBLCAweDA4RDEsIDB4NjMyQiwgMHgwOEQyLCAweDYzMkMsIDB4MUNBNSwKLSAgICAweDYzMkQsIDB4MUNCNSwgMHg2MzJGLCAweDA4QzgsIDB4NjMzMiwgMHgxRUVELCAweDYzMzMsIDB4MUNCNywKLSAgICAweDYzMzQsIDB4MUNCMSwgMHg2MzM2LCAweDFDQTgsIDB4NjMzOCwgMHgxQ0JBLCAweDYzMzksIDB4MUNBQiwKLSAgICAweDYzM0EsIDB4MDhDRSwgMHg2MzNCLCAweDFGMDQsIDB4NjMzQywgMHgxQ0FFLCAweDYzM0QsIDB4MDhEMCwKLSAgICAweDYzM0UsIDB4MDhDNywgMHg2MzQwLCAweDFDQkMsIDB4NjM0MSwgMHgxQ0IwLCAweDYzNDIsIDB4MDhDQSwKLSAgICAweDYzNDMsIDB4MUNBOSwgMHg2MzQ0LCAweDFDQTYsIDB4NjM0NSwgMHgxQ0E3LCAweDYzNDYsIDB4MDhDQiwKLSAgICAweDYzNDcsIDB4MUNCNiwgMHg2MzQ4LCAweDFDQkQsIDB4NjM0OSwgMHgwOENELCAweDYzNEEsIDB4MUNBRCwKLSAgICAweDYzNEIsIDB4MUNBQywgMHg2MzRDLCAweDA4RDUsIDB4NjM0RCwgMHgwOEQ0LCAweDYzNEUsIDB4MDhDNiwKLSAgICAweDYzNEYsIDB4MDhDQywgMHg2MzUwLCAweDA4Q0YsIDB4NjM1MSwgMHgxQ0I5LCAweDYzNTQsIDB4MUNCMywKLSAgICAweDYzNTUsIDB4MDhDOSwgMHg2MzU2LCAweDFDQTQsIDB4NjM1NywgMHgxQ0JCLCAweDYzNTgsIDB4MUNCMiwKLSAgICAweDYzNTksIDB4MUNCNCwgMHg2MzVBLCAweDFDQjgsIDB4NjM2NSwgMHgxRUVFLCAweDYzNjcsIDB4MEFBMSwKLSAgICAweDYzNjgsIDB4MEFCNSwgMHg2MzY5LCAweDBBQjQsIDB4NjM2QiwgMHgwQUE5LCAweDYzNkQsIDB4MUYwMCwKLSAgICAweDYzNkUsIDB4MUVGQywgMHg2MzZGLCAweDFFRjksIDB4NjM3MCwgMHgxRjBCLCAweDYzNzEsIDB4MEFBNCwKLSAgICAweDYzNzIsIDB4MEE5QywgMHg2Mzc1LCAweDFFRkUsIDB4NjM3NiwgMHgwQzY5LCAweDYzNzcsIDB4MEFBMCwKLSAgICAweDYzNzgsIDB4MUYwNiwgMHg2MzdBLCAweDBBQjYsIDB4NjM3QiwgMHgwQUIzLCAweDYzN0MsIDB4MUYwMiwKLSAgICAweDYzN0QsIDB4MUVGMSwgMHg2MzgwLCAweDBBQjIsIDB4NjM4MSwgMHgxRjA4LCAweDYzODIsIDB4MUVGMCwKLSAgICAweDYzODMsIDB4MEFBNywgMHg2Mzg0LCAweDBBQUIsIDB4NjM4NSwgMHgxRjA3LCAweDYzODcsIDB4MUVGQSwKLSAgICAweDYzODgsIDB4MEFBQywgMHg2Mzg5LCAweDBBQTYsIDB4NjM4QSwgMHgxRUVGLCAweDYzOEMsIDB4MEM1QiwKLSAgICAweDYzOEQsIDB4MUYwQSwgMHg2MzhFLCAweDFFRjgsIDB4NjM4RiwgMHgwQUIxLCAweDYzOTAsIDB4MUVGQiwKLSAgICAweDYzOTEsIDB4MUYwOSwgMHg2MzkyLCAweDBBQjAsIDB4NjM5NCwgMHgyMTRDLCAweDYzOTYsIDB4MEE5RCwKLSAgICAweDYzOTcsIDB4MUVGNiwgMHg2Mzk4LCAweDBBQTIsIDB4NjM5OSwgMHgwQUFELCAweDYzOUIsIDB4MEFBOCwKLSAgICAweDYzOUMsIDB4MUVGRiwgMHg2MzlELCAweDFFRjUsIDB4NjM5RSwgMHgxRUYzLCAweDYzOUYsIDB4MUYwNSwKLSAgICAweDYzQTAsIDB4MEE5QSwgMHg2M0ExLCAweDBBQUUsIDB4NjNBMiwgMHgwQTlFLCAweDYzQTMsIDB4MEM1QSwKLSAgICAweDYzQTQsIDB4MUYwMywgMHg2M0E1LCAweDBBOUYsIDB4NjNBNywgMHgwQTlCLCAweDYzQTgsIDB4MEFBQSwKLSAgICAweDYzQTksIDB4MEFBNSwgMHg2M0FBLCAweDBBQTMsIDB4NjNBQiwgMHgxRUY3LCAweDYzQUMsIDB4MEFBRiwKLSAgICAweDYzQUQsIDB4MUVGNCwgMHg2M0FFLCAweDFGMDEsIDB4NjNBRiwgMHgxRUZELCAweDYzQjAsIDB4MjE0RSwKLSAgICAweDYzQjEsIDB4MjE0RCwgMHg2M0JELCAweDFFRjIsIDB4NjNCRSwgMHgyMTVFLCAweDYzQzAsIDB4MEM1RCwKLSAgICAweDYzQzIsIDB4MjE2NCwgMHg2M0MzLCAweDIxNTMsIDB4NjNDNCwgMHgyMTYxLCAweDYzQzUsIDB4MjNFNiwKLSAgICAweDYzQzYsIDB4MEM2MCwgMHg2M0M3LCAweDIxNjUsIDB4NjNDOCwgMHgyMTY4LCAweDYzQzksIDB4MEM1RiwKLSAgICAweDYzQ0EsIDB4MjE1NiwgMHg2M0NCLCAweDIxNjcsIDB4NjNDQywgMHgyMTY2LCAweDYzQ0QsIDB4MEM2MSwKLSAgICAweDYzQ0UsIDB4MjE0RiwgMHg2M0NGLCAweDBDNUMsIDB4NjNEMCwgMHgwQzY0LCAweDYzRDIsIDB4MEM2MiwKLSAgICAweDYzRDMsIDB4MjE2MywgMHg2M0Q1LCAweDIxNTksIDB4NjNENiwgMHgwQzY2LCAweDYzRDcsIDB4MjE2QSwKLSAgICAweDYzRDgsIDB4MjE2MiwgMHg2M0Q5LCAweDIxNkIsIDB4NjNEQSwgMHgwQzZFLCAweDYzREIsIDB4MEM2QywKLSAgICAweDYzREMsIDB4MjE2MCwgMHg2M0RELCAweDIxNUYsIDB4NjNERiwgMHgyMTVELCAweDYzRTAsIDB4MjE1NywKLSAgICAweDYzRTEsIDB4MEM2NSwgMHg2M0UzLCAweDBDNjMsIDB4NjNFNCwgMHgxQ0FBLCAweDYzRTUsIDB4MjE1MCwKLSAgICAweDYzRTcsIDB4MjQwNCwgMHg2M0U4LCAweDIxNTEsIDB4NjNFOSwgMHgwQzVFLCAweDYzRUEsIDB4MEM2QiwKLSAgICAweDYzRUIsIDB4MjNFOCwgMHg2M0VELCAweDBDNjcsIDB4NjNFRSwgMHgwQzY4LCAweDYzRUYsIDB4MjE1MiwKLSAgICAweDYzRjAsIDB4MjE2OSwgMHg2M0YxLCAweDIzRTcsIDB4NjNGMiwgMHgyMTVBLCAweDYzRjMsIDB4MjE1NSwKLSAgICAweDYzRjQsIDB4MEM2QSwgMHg2M0Y1LCAweDIxNUIsIDB4NjNGNiwgMHgyMTU4LCAweDYzRjksIDB4MEM2RiwKLSAgICAweDY0MDYsIDB4MEUyQSwgMHg2NDA5LCAweDIzRUIsIDB4NjQwQSwgMHgyM0ZFLCAweDY0MEIsIDB4MjQwMywKLSAgICAweDY0MEMsIDB4MjNGNywgMHg2NDBELCAweDBFMjYsIDB4NjQwRSwgMHgyNDA4LCAweDY0MEYsIDB4MEUyMywKLSAgICAweDY0MTAsIDB4MjNFOSwgMHg2NDEyLCAweDIzRUEsIDB4NjQxMywgMHgwRTFDLCAweDY0MTQsIDB4MEUyNSwKLSAgICAweDY0MTUsIDB4MjNGMSwgMHg2NDE2LCAweDBFMjgsIDB4NjQxNywgMHgwRTI5LCAweDY0MTgsIDB4MjNGMiwKLSAgICAweDY0MUEsIDB4MjNGRiwgMHg2NDFCLCAweDI0MDUsIDB4NjQxQywgMHgwRTI0LCAweDY0MUUsIDB4MEUxRSwKLSAgICAweDY0MUYsIDB4MjNGMCwgMHg2NDIwLCAweDIzRUMsIDB4NjQyMSwgMHgyNDA3LCAweDY0MjIsIDB4MjNGNSwKLSAgICAweDY0MjMsIDB4MjNGNiwgMHg2NDI0LCAweDIzRUQsIDB4NjQyNSwgMHgyNDAxLCAweDY0MjYsIDB4MjNGOCwKLSAgICAweDY0MjcsIDB4MjQwMiwgMHg2NDI4LCAweDIzRkEsIDB4NjQyQSwgMHgwRTFGLCAweDY0MkIsIDB4MjY5OSwKLSAgICAweDY0MkMsIDB4MEUyMiwgMHg2NDJELCAweDBFMjAsIDB4NjQyRSwgMHgyNDA2LCAweDY0MkYsIDB4MjNGRCwKLSAgICAweDY0MzAsIDB4MjNGOSwgMHg2NDMzLCAweDIzRUUsIDB4NjQzNCwgMHgwRkU0LCAweDY0MzUsIDB4MjNGQywKLSAgICAweDY0MzYsIDB4MEUyNywgMHg2NDM3LCAweDIzRjQsIDB4NjQzOSwgMHgyM0YzLCAweDY0M0QsIDB4MEUyMSwKLSAgICAweDY0M0UsIDB4MEUxRCwgMHg2NDNGLCAweDI2QUUsIDB4NjQ0MCwgMHgyNDAwLCAweDY0NDEsIDB4MjNGQiwKLSAgICAweDY0NDMsIDB4MjNFRiwgMHg2NDRCLCAweDI2QTksIDB4NjQ0RCwgMHgyNjlBLCAweDY0NEUsIDB4MjZBNSwKLSAgICAweDY0NTAsIDB4MjZBQywgMHg2NDUxLCAweDBGRTIsIDB4NjQ1MiwgMHgwQzZELCAweDY0NTMsIDB4MjZBQSwKLSAgICAweDY0NTQsIDB4MEZERCwgMHg2NDU4LCAweDBGREMsIDB4NjQ1OSwgMHgyNkIxLCAweDY0NUIsIDB4MjY5QiwKLSAgICAweDY0NUMsIDB4MjZBOCwgMHg2NDVELCAweDI2OUMsIDB4NjQ1RSwgMHgyNkE3LCAweDY0NUYsIDB4MEZFMCwKLSAgICAweDY0NjAsIDB4MjZBQiwgMHg2NDYxLCAweDIxNUMsIDB4NjQ2NSwgMHgyNkIyLCAweDY0NjYsIDB4MjZBMywKLSAgICAweDY0NjcsIDB4MEZFMywgMHg2NDY4LCAweDI4RUUsIDB4NjQ2OSwgMHgxMTU5LCAweDY0NkIsIDB4MjZCMCwKLSAgICAweDY0NkMsIDB4MjZBRiwgMHg2NDZELCAweDBGRTUsIDB4NjQ2RSwgMHgyOEUxLCAweDY0NkYsIDB4MTE1QSwKLSAgICAweDY0NzAsIDB4MjhFMiwgMHg2NDcyLCAweDI2OUYsIDB4NjQ3MywgMHgyNkEwLCAweDY0NzQsIDB4MjY5RCwKLSAgICAweDY0NzUsIDB4MjZBMiwgMHg2NDc2LCAweDI2OUUsIDB4NjQ3NywgMHgyNkIzLCAweDY0NzgsIDB4MEZERiwKLSAgICAweDY0NzksIDB4MTE1QiwgMHg2NDdBLCAweDBGRTEsIDB4NjQ3QiwgMHgwRkU2LCAweDY0N0QsIDB4MjZBMSwKLSAgICAweDY0N0YsIDB4MjZBRCwgMHg2NDgyLCAweDI2QTYsIDB4NjQ4NSwgMHgyOEU1LCAweDY0ODcsIDB4MEZEQiwKLSAgICAweDY0ODgsIDB4MTE1RSwgMHg2NDg5LCAweDJCNTQsIDB4NjQ4QSwgMHgyOEVBLCAweDY0OEIsIDB4MjhFOSwKLSAgICAweDY0OEMsIDB4MjhFQiwgMHg2NDhGLCAweDI4RTgsIDB4NjQ5MCwgMHgxMTVGLCAweDY0OTIsIDB4MTE2NSwKLSAgICAweDY0OTMsIDB4MTE2MiwgMHg2NDk1LCAweDExNjMsIDB4NjQ5NiwgMHgyOEUzLCAweDY0OTcsIDB4MjhFNiwKLSAgICAweDY0OTgsIDB4MjhGMCwgMHg2NDk5LCAweDExNkIsIDB4NjQ5QSwgMHgxMTY5LCAweDY0OUMsIDB4MjhFNywKLSAgICAweDY0OUQsIDB4MjE1NCwgMHg2NDlFLCAweDExNUMsIDB4NjQ5RiwgMHgyOEVELCAweDY0QTAsIDB4MjhFNCwKLSAgICAweDY0QTIsIDB4MTE2QywgMHg2NEEzLCAweDI4RUMsIDB4NjRBNCwgMHgwRkRFLCAweDY0QTUsIDB4MTE2MSwKLSAgICAweDY0QTYsIDB4MjZBNCwgMHg2NEE5LCAweDExNjQsIDB4NjRBQiwgMHgxMTY4LCAweDY0QUMsIDB4MTE2QSwKLSAgICAweDY0QUQsIDB4MTE2NywgMHg2NEFFLCAweDExNjYsIDB4NjRCMCwgMHgxMTYwLCAweDY0QjEsIDB4MjhFRiwKLSAgICAweDY0QjIsIDB4MTE1RCwgMHg2NEIzLCAweDExNkQsIDB4NjRCQiwgMHgxMkJCLCAweDY0QkMsIDB4MTJCQywKLSAgICAweDY0QkQsIDB4MkI1MywgMHg2NEJFLCAweDEyQzUsIDB4NjRCRiwgMHgxMkMyLCAweDY0QzEsIDB4MTJCOSwKLSAgICAweDY0QzIsIDB4MTJDMCwgMHg2NEMzLCAweDJCNTUsIDB4NjRDNCwgMHgxMkJFLCAweDY0QzUsIDB4MTJCOCwKLSAgICAweDY0QzcsIDB4MTJCRiwgMHg2NEM5LCAweDJCNTIsIDB4NjRDQSwgMHgxM0Q4LCAweDY0Q0IsIDB4MTJCQSwKLSAgICAweDY0Q0QsIDB4MTJDMSwgMHg2NENFLCAweDEzRDcsIDB4NjRDRiwgMHgyQjUxLCAweDY0RDAsIDB4MkI1MCwKLSAgICAweDY0RDIsIDB4MTJDMywgMHg2NEQ0LCAweDEyQzQsIDB4NjRENiwgMHgyQjRGLCAweDY0RDcsIDB4MkI0RSwKLSAgICAweDY0RDgsIDB4MTNEOSwgMHg2NEQ5LCAweDJCNTgsIDB4NjREQSwgMHgxMkJELCAweDY0REIsIDB4MkI1NiwKLSAgICAweDY0RTAsIDB4MTNEQSwgMHg2NEUyLCAweDEzREYsIDB4NjRFMywgMHgyRDZBLCAweDY0RTQsIDB4MkQ2QywKLSAgICAweDY0RTYsIDB4MTNEQywgMHg2NEU4LCAweDJENkQsIDB4NjRFOSwgMHgyRDY5LCAweDY0RUIsIDB4MkQ2QiwKLSAgICAweDY0RUMsIDB4MTNERCwgMHg2NEVELCAweDEzRTAsIDB4NjRFRiwgMHgyRDY4LCAweDY0RjAsIDB4MTNEQiwKLSAgICAweDY0RjEsIDB4MTNERSwgMHg2NEYyLCAweDE0RDMsIDB4NjRGMywgMHgyQjU3LCAweDY0RjQsIDB4MTREMiwKLSAgICAweDY0RjcsIDB4MTREOCwgMHg2NEY4LCAweDJGMkIsIDB4NjRGQSwgMHgxNEQ2LCAweDY0RkIsIDB4MTRENywKLSAgICAweDY0RkMsIDB4MkYyRSwgMHg2NEZELCAweDJGMkEsIDB4NjRGRSwgMHgxNEQ0LCAweDY0RkYsIDB4MkYyOCwKLSAgICAweDY1MDAsIDB4MTU4MiwgMHg2NTAxLCAweDJGMkMsIDB4NjUwMywgMHgyRjJELCAweDY1MDQsIDB4MkYyOSwKLSAgICAweDY1MDYsIDB4MTRENSwgMHg2NTA3LCAweDMwOTAsIDB4NjUwOSwgMHgzMDkzLCAweDY1MEMsIDB4MzA5NCwKLSAgICAweDY1MEQsIDB4MzA5MiwgMHg2NTBFLCAweDMwOTUsIDB4NjUwRiwgMHgxNTgzLCAweDY1MTAsIDB4MzA5MSwKLSAgICAweDY1MTMsIDB4MzFENywgMHg2NTE0LCAweDE2MTcsIDB4NjUxNSwgMHgzMUQ2LCAweDY1MTYsIDB4MzFENSwKLSAgICAweDY1MTcsIDB4MzFENCwgMHg2NTE4LCAweDE2MTYsIDB4NjUxOSwgMHgxNjE4LCAweDY1MUIsIDB4MzJEMiwKLSAgICAweDY1MUMsIDB4MTY3MywgMHg2NTFELCAweDE2NzIsIDB4NjUyMCwgMHgzMzgyLCAweDY1MjEsIDB4MzM4MSwKLSAgICAweDY1MjIsIDB4MzM4NCwgMHg2NTIzLCAweDE2RjksIDB4NjUyNCwgMHgxNkM1LCAweDY1MjUsIDB4MzQxQiwKLSAgICAweDY1MjYsIDB4MzM4MywgMHg2NTI5LCAweDM0MUEsIDB4NjUyQSwgMHgxNkZCLCAweDY1MkIsIDB4MTZGQSwKLSAgICAweDY1MkMsIDB4MTcyMSwgMHg2NTJELCAweDM0ODQsIDB4NjUyRSwgMHgzNENBLCAweDY1MkYsIDB4MDJENSwKLSAgICAweDY1MzIsIDB4MjE2QywgMHg2NTMzLCAweDJCNTksIDB4NjUzNCwgMHgwMjJDLCAweDY1MzYsIDB4MDNENywKLSAgICAweDY1MzcsIDB4MTdGNiwgMHg2NTM4LCAweDA0QjksIDB4NjUzOSwgMHgwNEI3LCAweDY1M0IsIDB4MDRCOCwKLSAgICAweDY1M0QsIDB4MTlBMSwgMHg2NTNFLCAweDA1RjMsIDB4NjUzRiwgMHgwNzQxLCAweDY1NDEsIDB4MUIwMSwKLSAgICAweDY1NDMsIDB4MUIwMiwgMHg2NTQ1LCAweDA3NDIsIDB4NjU0NiwgMHgxQ0JGLCAweDY1NDgsIDB4MDhENiwKLSAgICAweDY1NDksIDB4MDhENywgMHg2NTRBLCAweDFDQkUsIDB4NjU0RiwgMHgwQUJELCAweDY1NTEsIDB4MEFCOSwKLSAgICAweDY1NTMsIDB4MUYwQywgMHg2NTU0LCAweDBBQzAsIDB4NjU1NSwgMHgwQUJGLCAweDY1NTYsIDB4MEFCOCwKLSAgICAweDY1NTcsIDB4MEFCQiwgMHg2NTU4LCAweDBBQkUsIDB4NjU1OSwgMHgwQUJBLCAweDY1NUMsIDB4MjE3MCwKLSAgICAweDY1NUQsIDB4MEFCNywgMHg2NTVFLCAweDBDNzAsIDB4NjU2MiwgMHgwQzcyLCAweDY1NjMsIDB4MEM3MywKLSAgICAweDY1NjQsIDB4MjE2RiwgMHg2NTY1LCAweDIxNzIsIDB4NjU2NiwgMHgwQzcxLCAweDY1NjcsIDB4MjE2RCwKLSAgICAweDY1NjgsIDB4MjE3MSwgMHg2NTZBLCAweDIxNkUsIDB4NjU2QywgMHgwRTJCLCAweDY1NkYsIDB4MjQwOSwKLSAgICAweDY1NzIsIDB4MEZFNywgMHg2NTczLCAweDI2QjQsIDB4NjU3NCwgMHgxMkM2LCAweDY1NzUsIDB4MTE2RSwKLSAgICAweDY1NzYsIDB4MjhGMSwgMHg2NTc3LCAweDExNkYsIDB4NjU3OCwgMHgxMTcwLCAweDY1NzksIDB4MjhGMywKLSAgICAweDY1N0EsIDB4MjhGMiwgMHg2NTdCLCAweDI4RjQsIDB4NjU3QywgMHgyQjVCLCAweDY1N0YsIDB4MkI1QSwKLSAgICAweDY1ODAsIDB4MkQ2RiwgMHg2NTgxLCAweDJENkUsIDB4NjU4MiwgMHgxM0UxLCAweDY1ODMsIDB4MTNFMiwKLSAgICAweDY1ODQsIDB4MzA5NiwgMHg2NTg3LCAweDAyRDYsIDB4NjU4QywgMHgyMTczLCAweDY1OTAsIDB4MEM3NSwKLSAgICAweDY1OTEsIDB4MEM3NCwgMHg2NTkyLCAweDI0MEEsIDB4NjU5NCwgMHgyRjJGLCAweDY1OTUsIDB4MTY3NCwKLSAgICAweDY1OTYsIDB4MzQxQywgMHg2NTk3LCAweDAyRDcsIDB4NjU5OSwgMHgwOEQ4LCAweDY1OUIsIDB4MEFDMiwKLSAgICAweDY1OUMsIDB4MEFDMSwgMHg2NTlELCAweDIxNzQsIDB4NjU5RSwgMHgyMTc1LCAweDY1OUYsIDB4MEUyQywKLSAgICAweDY1QTAsIDB4MjZCNSwgMHg2NUExLCAweDBGRTgsIDB4NjVBMiwgMHgyQjVDLCAweDY1QTQsIDB4MDJEOCwKLSAgICAweDY1QTUsIDB4MDM0NiwgMHg2NUE3LCAweDA1RjQsIDB4NjVBOCwgMHgxOUEyLCAweDY1QUEsIDB4MUIwMywKLSAgICAweDY1QUIsIDB4MDc0MywgMHg2NUFDLCAweDBBQzMsIDB4NjVBRSwgMHgyMTc2LCAweDY1QUYsIDB4MEM3NiwKLSAgICAweDY1QjAsIDB4MEUyRCwgMHg2NUIyLCAweDI4RjUsIDB4NjVCMywgMHgyOEY2LCAweDY1QjYsIDB4MkQ3MCwKLSAgICAweDY1QjcsIDB4MTREOSwgMHg2NUI4LCAweDM0Q0IsIDB4NjVCOSwgMHgwMkQ5LCAweDY1QkIsIDB4MTlBMywKLSAgICAweDY1QkMsIDB4MDVGNSwgMHg2NUJELCAweDA3NDQsIDB4NjVCRiwgMHgxQjA0LCAweDY1QzEsIDB4MDhEOSwKLSAgICAweDY1QzIsIDB4MUNDMywgMHg2NUMzLCAweDFDQzEsIDB4NjVDNCwgMHgxQ0MyLCAweDY1QzUsIDB4MDhEQSwKLSAgICAweDY1QzYsIDB4MUNDMCwgMHg2NUNCLCAweDBBQzUsIDB4NjVDQywgMHgwQUM2LCAweDY1Q0QsIDB4MUYwRCwKLSAgICAweDY1Q0UsIDB4MEFDNywgMHg2NUNGLCAweDBBQzQsIDB4NjVEMCwgMHgyMTc3LCAweDY1RDIsIDB4MjE3OCwKLSAgICAweDY1RDMsIDB4MjQwQiwgMHg2NUQ2LCAweDBGRUEsIDB4NjVENywgMHgwRkU5LCAweDY1REEsIDB4MkQ3MSwKLSAgICAweDY1REIsIDB4MkYzMCwgMHg2NURELCAweDMwOTgsIDB4NjVERSwgMHgzMDk3LCAweDY1REYsIDB4MzFEOCwKLSAgICAweDY1RTAsIDB4MDIyRCwgMHg2NUUxLCAweDE3ODksIDB4NjVFMiwgMHgwNzQ1LCAweDY1RTUsIDB4MDJEQSwKLSAgICAweDY1RTYsIDB4MDM0NywgMHg2NUU4LCAweDAzRDksIDB4NjVFOSwgMHgwM0Q4LCAweDY1RUMsIDB4MDNEQSwKLSAgICAweDY1RUQsIDB4MDNEQiwgMHg2NUVFLCAweDE3RjgsIDB4NjVFRiwgMHgxN0Y3LCAweDY1RjAsIDB4MTg5RSwKLSAgICAweDY1RjEsIDB4MDRCQSwgMHg2NUYyLCAweDE4QTEsIDB4NjVGMywgMHgxOEEwLCAweDY1RjQsIDB4MTg5RiwKLSAgICAweDY1RjUsIDB4MThBMiwgMHg2NUZBLCAweDA1RjYsIDB4NjVGQiwgMHgxOUE5LCAweDY1RkMsIDB4MTlBNSwKLSAgICAweDY1RkQsIDB4MTlBRSwgMHg2NjAwLCAweDA1RkQsIDB4NjYwMiwgMHgwNUZCLCAweDY2MDMsIDB4MTlBQSwKLSAgICAweDY2MDQsIDB4MTlBNiwgMHg2NjA1LCAweDE5QUQsIDB4NjYwNiwgMHgwNUZBLCAweDY2MDcsIDB4MDYwMSwKLSAgICAweDY2MDgsIDB4MTlBOCwgMHg2NjA5LCAweDE5QTQsIDB4NjYwQSwgMHgwNjAwLCAweDY2MEIsIDB4MTlBQiwKLSAgICAweDY2MEMsIDB4MDVGOSwgMHg2NjBELCAweDE5QUMsIDB4NjYwRSwgMHgwNUZDLCAweDY2MEYsIDB4MDVGRSwKLSAgICAweDY2MTAsIDB4MTlCMCwgMHg2NjExLCAweDE5QUYsIDB4NjYxMiwgMHgxOUE3LCAweDY2MTMsIDB4MDVGOCwKLSAgICAweDY2MTQsIDB4MDVGNywgMHg2NjE1LCAweDA1RkYsIDB4NjYxQywgMHgxQjA5LCAweDY2MUQsIDB4MUIwRiwKLSAgICAweDY2MUYsIDB4MDc0QiwgMHg2NjIwLCAweDA3NDgsIDB4NjYyMSwgMHgxQjA2LCAweDY2MjIsIDB4MUIwQiwKLSAgICAweDY2MjQsIDB4MDc0RSwgMHg2NjI1LCAweDA3NDYsIDB4NjYyNiwgMHgxQjBBLCAweDY2MjcsIDB4MDc0OSwKLSAgICAweDY2MjgsIDB4MDc0QywgMHg2NjJCLCAweDFCMEQsIDB4NjYyRCwgMHgwNzQ3LCAweDY2MkUsIDB4MUIxMiwKLSAgICAweDY2MkYsIDB4MDc0QSwgMHg2NjMxLCAweDA3NEQsIDB4NjYzMiwgMHgxQjA3LCAweDY2MzMsIDB4MUIwQywKLSAgICAweDY2MzQsIDB4MUIxMCwgMHg2NjM1LCAweDFCMDgsIDB4NjYzNiwgMHgxQjA1LCAweDY2MzksIDB4MUIxMSwKLSAgICAweDY2M0EsIDB4MUIwRSwgMHg2NjQxLCAweDA4RTIsIDB4NjY0MiwgMHgwOERCLCAweDY2NDMsIDB4MDhERSwKLSAgICAweDY2NDUsIDB4MDhFMSwgMHg2NjQ3LCAweDFDQzYsIDB4NjY0OSwgMHgwOERDLCAweDY2NEEsIDB4MUNDNCwKLSAgICAweDY2NEMsIDB4MDhFMCwgMHg2NjRGLCAweDA4REQsIDB4NjY1MSwgMHgxQ0M3LCAweDY2NTIsIDB4MDhERiwKLSAgICAweDY2NTksIDB4MUYxMSwgMHg2NjVBLCAweDBBQzksIDB4NjY1QiwgMHgxRjEwLCAweDY2NUMsIDB4MUYxMiwKLSAgICAweDY2NUQsIDB4MEFDOCwgMHg2NjVFLCAweDBBQ0QsIDB4NjY1RiwgMHgxQ0M1LCAweDY2NjEsIDB4MUYwRiwKLSAgICAweDY2NjIsIDB4MUYxMywgMHg2NjY0LCAweDBBQ0EsIDB4NjY2NSwgMHgxRjBFLCAweDY2NjYsIDB4MEFDQywKLSAgICAweDY2NjgsIDB4MEFDQiwgMHg2NjZBLCAweDIxN0YsIDB4NjY2QywgMHgyMTdBLCAweDY2NkUsIDB4MEM3NywKLSAgICAweDY2NkYsIDB4MEM3QiwgMHg2NjcwLCAweDBDNzgsIDB4NjY3MSwgMHgyMTdELCAweDY2NzIsIDB4MjE4MCwKLSAgICAweDY2NzQsIDB4MEM3OSwgMHg2Njc2LCAweDBDN0EsIDB4NjY3NywgMHgwQzdGLCAweDY2NzgsIDB4MjQxNCwKLSAgICAweDY2NzksIDB4MjE3RSwgMHg2NjdBLCAweDBDN0QsIDB4NjY3QiwgMHgyMTdCLCAweDY2N0MsIDB4MjE3OSwKLSAgICAweDY2N0UsIDB4MEM3RSwgMHg2NjgwLCAweDIxN0MsIDB4NjY4NCwgMHgwRTMzLCAweDY2ODYsIDB4MjQwQywKLSAgICAweDY2ODcsIDB4MEUzMCwgMHg2Njg4LCAweDBFMzEsIDB4NjY4OSwgMHgwRTJGLCAweDY2OEEsIDB4MjQxMSwKLSAgICAweDY2OEIsIDB4MjQxMCwgMHg2NjhDLCAweDI0MEQsIDB4NjY4RCwgMHgwRTM1LCAweDY2OTAsIDB4MjQwRiwKLSAgICAweDY2OTEsIDB4MEM3QywgMHg2Njk0LCAweDI0MTMsIDB4NjY5NSwgMHgyNDBFLCAweDY2OTYsIDB4MEUzMiwKLSAgICAweDY2OTcsIDB4MEUyRSwgMHg2Njk4LCAweDBFMzQsIDB4NjY5OSwgMHgyNDEyLCAweDY2OUQsIDB4MEZFRCwKLSAgICAweDY2OUYsIDB4MjZCOCwgMHg2NkEwLCAweDI2QjcsIDB4NjZBMSwgMHgyNkI2LCAweDY2QTIsIDB4MEZFQiwKLSAgICAweDY2QTgsIDB4MEZFQywgMHg2NkE5LCAweDI4RjksIDB4NjZBQSwgMHgyOEZDLCAweDY2QUIsIDB4MTE3MiwKLSAgICAweDY2QUUsIDB4MTE3MSwgMHg2NkFGLCAweDI4RkQsIDB4NjZCMCwgMHgyOEY4LCAweDY2QjEsIDB4MTE3NCwKLSAgICAweDY2QjIsIDB4MjhGQSwgMHg2NkI0LCAweDExNzMsIDB4NjZCNSwgMHgyOEY3LCAweDY2QjcsIDB4MjhGQiwKLSAgICAweDY2QjgsIDB4MTJDQywgMHg2NkI5LCAweDEyQzksIDB4NjZCQSwgMHgyQjY1LCAweDY2QkIsIDB4MkI2NCwKLSAgICAweDY2QkQsIDB4MkI2MywgMHg2NkJFLCAweDJCNUUsIDB4NjZDMCwgMHgyQjVGLCAweDY2QzQsIDB4MTJDQSwKLSAgICAweDY2QzYsIDB4MTJDNywgMHg2NkM3LCAweDEyQ0IsIDB4NjZDOCwgMHgyQjVELCAweDY2QzksIDB4MTJDOCwKLSAgICAweDY2Q0EsIDB4MkI2MCwgMHg2NkNCLCAweDJCNjEsIDB4NjZDQywgMHgyQjY2LCAweDY2Q0YsIDB4MkI2MiwKLSAgICAweDY2RDIsIDB4MkQ3MiwgMHg2NkQ2LCAweDEzRTQsIDB4NjZEOCwgMHgyRjMzLCAweDY2RDksIDB4MTNFMywKLSAgICAweDY2REEsIDB4MkYzMSwgMHg2NkRCLCAweDJGMzIsIDB4NjZEQywgMHgxNERBLCAweDY2REQsIDB4MTU4NSwKLSAgICAweDY2REUsIDB4MzA5OSwgMHg2NkUwLCAweDE1ODQsIDB4NjZFMywgMHgzMURBLCAweDY2RTQsIDB4MzFEQiwKLSAgICAweDY2RTYsIDB4MTYxOSwgMHg2NkU4LCAweDMxRDksIDB4NjZFOSwgMHgxNjc1LCAweDY2RUIsIDB4MzQxRCwKLSAgICAweDY2RUMsIDB4MTZGQywgMHg2NkVELCAweDM0ODUsIDB4NjZFRSwgMHgzNDg2LCAweDY2RjAsIDB4MDJEQiwKLSAgICAweDY2RjIsIDB4MDNEQywgMHg2NkYzLCAweDAzREQsIDB4NjZGNCwgMHgwNEJCLCAweDY2RjYsIDB4MTlCMSwKLSAgICAweDY2RjcsIDB4MDc0RiwgMHg2NkY4LCAweDA4RTMsIDB4NjZGOSwgMHgwQUNFLCAweDY2RkMsIDB4MEExRiwKLSAgICAweDY2RkUsIDB4MEM4MCwgMHg2NkZGLCAweDBDODEsIDB4NjcwMCwgMHgwQkYwLCAweDY3MDEsIDB4MjE4MSwKLSAgICAweDY3MDMsIDB4MEUzNiwgMHg2NzA0LCAweDI2QkEsIDB4NjcwNSwgMHgyNkI5LCAweDY3MDgsIDB4MDJEQywKLSAgICAweDY3MDksIDB4MDNERSwgMHg2NzBBLCAweDE5QjIsIDB4NjcwQiwgMHgwNjAzLCAweDY3MEQsIDB4MDYwMiwKLSAgICAweDY3MEYsIDB4MUIxMywgMHg2NzEwLCAweDFCMTQsIDB4NjcxMiwgMHgxQ0M4LCAweDY3MTMsIDB4MUNDOSwKLSAgICAweDY3MTQsIDB4MDhFNCwgMHg2NzE1LCAweDA4RTUsIDB4NjcxNywgMHgwOEU2LCAweDY3MTgsIDB4MUYxNCwKLSAgICAweDY3MUIsIDB4MEFEMCwgMHg2NzFELCAweDBDODMsIDB4NjcxRiwgMHgwQzgyLCAweDY3MjAsIDB4MjQxNSwKLSAgICAweDY3MjEsIDB4MjUyMiwgMHg2NzIyLCAweDI2QkIsIDB4NjcyMywgMHgyQjY3LCAweDY3MjYsIDB4MTREQiwKLSAgICAweDY3MjcsIDB4MTYxQSwgMHg2NzI4LCAweDAyREQsIDB4NjcyQSwgMHgwMzRBLCAweDY3MkIsIDB4MDM0QiwKLSAgICAweDY3MkMsIDB4MDM0OSwgMHg2NzJELCAweDAzNEMsIDB4NjcyRSwgMHgwMzQ4LCAweDY3MzEsIDB4MDNFMSwKLSAgICAweDY3MzMsIDB4MTgwMCwgMHg2NzM0LCAweDAzRTAsIDB4NjczNSwgMHgwM0UyLCAweDY3MzgsIDB4MTdGQiwKLSAgICAweDY3MzksIDB4MTdGQSwgMHg2NzNBLCAweDE3RkQsIDB4NjczQiwgMHgxN0ZDLCAweDY3M0MsIDB4MTdGRiwKLSAgICAweDY3M0QsIDB4MDNERiwgMHg2NzNFLCAweDE3RjksIDB4NjczRiwgMHgxN0ZFLCAweDY3NDUsIDB4MThBMywKLSAgICAweDY3NDYsIDB4MDRDNSwgMHg2NzQ3LCAweDE4QTQsIDB4Njc0OCwgMHgxOEE4LCAweDY3NDksIDB4MDRDNCwKLSAgICAweDY3NEIsIDB4MThBQywgMHg2NzRDLCAweDE4QTcsIDB4Njc0RCwgMHgxOEFBLCAweDY3NEUsIDB4MDRCRCwKLSAgICAweDY3NEYsIDB4MDRCRSwgMHg2NzUwLCAweDA0QkYsIDB4Njc1MSwgMHgwNEMwLCAweDY3NTMsIDB4MDRDNywKLSAgICAweDY3NTUsIDB4MThBNiwgMHg2NzU2LCAweDA0QzIsIDB4Njc1NywgMHgwNEM4LCAweDY3NTksIDB4MThBNSwKLSAgICAweDY3NUEsIDB4MThBQiwgMHg2NzVDLCAweDA0QzEsIDB4Njc1RCwgMHgxOEE5LCAweDY3NUUsIDB4MDRDMywKLSAgICAweDY3NUYsIDB4MDRCQywgMHg2NzYwLCAweDA0QzYsIDB4Njc2QSwgMHgwNjE4LCAweDY3NkMsIDB4MTlCNCwKLSAgICAweDY3NkQsIDB4MDYwNCwgMHg2NzZGLCAweDA2MEUsIDB4Njc3MCwgMHgwNjBGLCAweDY3NzEsIDB4MDYwNywKLSAgICAweDY3NzIsIDB4MDYxOSwgMHg2NzczLCAweDA2MDksIDB4Njc3NCwgMHgxOUJDLCAweDY3NzUsIDB4MDYxNCwKLSAgICAweDY3NzYsIDB4MTlCNywgMHg2Nzc3LCAweDA2MEEsIDB4Njc3OCwgMHgxOUM2LCAweDY3NzksIDB4MTlDNywKLSAgICAweDY3N0EsIDB4MTlCRiwgMHg2NzdCLCAweDE5QjgsIDB4Njc3QywgMHgwNjE3LCAweDY3N0QsIDB4MTlDNCwKLSAgICAweDY3N0UsIDB4MDYxMiwgMHg2NzdGLCAweDA2MTAsIDB4Njc4MSwgMHgxOUM1LCAweDY3ODMsIDB4MTlDMywKLSAgICAweDY3ODQsIDB4MTlCQiwgMHg2Nzg1LCAweDE5QjMsIDB4Njc4NiwgMHgxOUJBLCAweDY3ODcsIDB4MDYwQiwKLSAgICAweDY3ODksIDB4MDYxMSwgMHg2NzhCLCAweDA2MDUsIDB4Njc4QywgMHgxOUJFLCAweDY3OEQsIDB4MTlCRCwKLSAgICAweDY3OEUsIDB4MTlCNSwgMHg2NzkwLCAweDA2MTMsIDB4Njc5MSwgMHgxOUMxLCAweDY3OTIsIDB4MTlCNiwKLSAgICAweDY3OTMsIDB4MDYxNiwgMHg2Nzk0LCAweDE5QzgsIDB4Njc5NSwgMHgwNjA2LCAweDY3OTcsIDB4MDYwRCwKLSAgICAweDY3OTgsIDB4MTlCOSwgMHg2Nzk5LCAweDE5QzIsIDB4Njc5QSwgMHgwNjE1LCAweDY3OUMsIDB4MDYwOCwKLSAgICAweDY3OUQsIDB4MDYwQywgMHg2NzlGLCAweDE5QzAsIDB4NjdBRSwgMHgxQjM0LCAweDY3QUYsIDB4MDc1NywKLSAgICAweDY3QjAsIDB4MDc2NCwgMHg2N0IyLCAweDFCMkYsIDB4NjdCMywgMHgxQjI1LCAweDY3QjQsIDB4MDc1RCwKLSAgICAweDY3QjUsIDB4MUIyMywgMHg2N0I2LCAweDA3NTYsIDB4NjdCNywgMHgxQjFFLCAweDY3QjgsIDB4MDc2MCwKLSAgICAweDY3QjksIDB4MUIyQiwgMHg2N0JBLCAweDFCMTgsIDB4NjdCQiwgMHgxQjFBLCAweDY3QzAsIDB4MUIxRCwKLSAgICAweDY3QzEsIDB4MUIxNSwgMHg2N0MyLCAweDFCMkEsIDB4NjdDMywgMHgxQjNBLCAweDY3QzQsIDB4MDc1QiwKLSAgICAweDY3QzUsIDB4MUIxRiwgMHg2N0M2LCAweDFCMzEsIDB4NjdDOCwgMHgxQjE3LCAweDY3QzksIDB4MUIzOCwKLSAgICAweDY3Q0EsIDB4MUIzOSwgMHg2N0NCLCAweDFCM0MsIDB4NjdDQywgMHgxQjMzLCAweDY3Q0QsIDB4MUIyNCwKLSAgICAweDY3Q0UsIDB4MUIyQywgMHg2N0NGLCAweDA3NjEsIDB4NjdEMCwgMHgwNzU0LCAweDY3RDEsIDB4MDc1QywKLSAgICAweDY3RDIsIDB4MDc2OCwgMHg2N0QzLCAweDA3NTEsIDB4NjdENCwgMHgwNzUzLCAweDY3RDgsIDB4MUIxQywKLSAgICAweDY3RDksIDB4MDc2NSwgMHg2N0RBLCAweDA3NUUsIDB4NjdEQiwgMHgxQjM2LCAweDY3REMsIDB4MUIxOSwKLSAgICAweDY3REQsIDB4MDc2NywgMHg2N0RFLCAweDA3NjIsIDB4NjdERiwgMHgxQjIyLCAweDY3RTIsIDB4MDc2NiwKLSAgICAweDY3RTMsIDB4MUIyOSwgMHg2N0U0LCAweDFCMjEsIDB4NjdFNSwgMHgwNzVGLCAweDY3RTYsIDB4MUIzNSwKLSAgICAweDY3RTcsIDB4MUIyRCwgMHg2N0U5LCAweDA3NTksIDB4NjdFQSwgMHgxQjNCLCAweDY3RUIsIDB4MUIyMCwKLSAgICAweDY3RUMsIDB4MDc1NSwgMHg2N0VELCAweDFCMzIsIDB4NjdFRSwgMHgxQjI4LCAweDY3RUYsIDB4MDc1QSwKLSAgICAweDY3RjAsIDB4MUIyRSwgMHg2N0YxLCAweDA3NTIsIDB4NjdGMiwgMHgxQjE2LCAweDY3RjMsIDB4MDc2MywKLSAgICAweDY3RjQsIDB4MDhGNSwgMHg2N0Y1LCAweDA3NTgsIDB4NjdGNiwgMHgxQjI3LCAweDY3RjcsIDB4MUIyNiwKLSAgICAweDY3RjgsIDB4MUIxQiwgMHg2N0ZBLCAweDFCMzcsIDB4NjdGQywgMHgxQjMwLCAweDY3RkYsIDB4MDc1MCwKLSAgICAweDY4MTIsIDB4MUNERCwgMHg2ODEzLCAweDA4RkMsIDB4NjgxNCwgMHgxQ0RFLCAweDY4MTYsIDB4MUNEMiwKLSAgICAweDY4MTcsIDB4MDhGMSwgMHg2ODE4LCAweDA4RkQsIDB4NjgxQSwgMHgxQ0NCLCAweDY4MUMsIDB4MUNENCwKLSAgICAweDY4MUQsIDB4MUNEQywgMHg2ODFGLCAweDFDQ0EsIDB4NjgyMCwgMHgxQ0U1LCAweDY4MjEsIDB4MDhFNywKLSAgICAweDY4MjUsIDB4MUNFNCwgMHg2ODI2LCAweDFDREYsIDB4NjgyOCwgMHgxQ0UwLCAweDY4MjksIDB4MDhFRiwKLSAgICAweDY4MkEsIDB4MDhGQSwgMHg2ODJCLCAweDFDRDYsIDB4NjgyRCwgMHgxQ0Q3LCAweDY4MkUsIDB4MUNFMSwKLSAgICAweDY4MkYsIDB4MUNEOCwgMHg2ODMxLCAweDFDRDMsIDB4NjgzMiwgMHgxQ0NELCAweDY4MzMsIDB4MUNDRSwKLSAgICAweDY4MzQsIDB4MUNEQiwgMHg2ODM1LCAweDFDRDUsIDB4NjgzOCwgMHgwOEU4LCAweDY4MzksIDB4MDhFQywKLSAgICAweDY4M0EsIDB4MUNFMywgMHg2ODNCLCAweDFDQ0YsIDB4NjgzQywgMHgwOEY4LCAweDY4M0QsIDB4MDhGNCwKLSAgICAweDY4NDAsIDB4MDhGNywgMHg2ODQxLCAweDA4RkUsIDB4Njg0MiwgMHgwOEVELCAweDY4NDMsIDB4MDhGOSwKLSAgICAweDY4NDQsIDB4MUNEQSwgMHg2ODQ1LCAweDA4RkIsIDB4Njg0NiwgMHgwOEVBLCAweDY4NDgsIDB4MDhFOSwKLSAgICAweDY4NDksIDB4MUNDQywgMHg2ODRCLCAweDFDRDAsIDB4Njg0QywgMHgwOEYyLCAweDY4NEQsIDB4MUNFMiwKLSAgICAweDY4NEUsIDB4MUNEOSwgMHg2ODRGLCAweDFDRDEsIDB4Njg1MCwgMHgwOEY2LCAweDY4NTEsIDB4MDhGMywKLSAgICAweDY4NTMsIDB4MDhFQiwgMHg2ODU0LCAweDA4RUUsIDB4Njg2QiwgMHgxRjI5LCAweDY4NkQsIDB4MUYxOSwKLSAgICAweDY4NkUsIDB4MUYxQSwgMHg2ODZGLCAweDFGMUUsIDB4Njg3MSwgMHgxRjJELCAweDY4NzIsIDB4MUYyQSwKLSAgICAweDY4NzQsIDB4MUYyMywgMHg2ODc1LCAweDFGMjIsIDB4Njg3NiwgMHgwQUQ3LCAweDY4NzcsIDB4MUYyNiwKLSAgICAweDY4NzgsIDB4MUYzNSwgMHg2ODc5LCAweDFGMTUsIDB4Njg3QiwgMHgxRjM2LCAweDY4N0MsIDB4MUYyOCwKLSAgICAweDY4N0QsIDB4MUYzQSwgMHg2ODdFLCAweDFGMkUsIDB4Njg3RiwgMHgwQUQ2LCAweDY4ODAsIDB4MUYyQywKLSAgICAweDY4ODEsIDB4MEFEMSwgMHg2ODgyLCAweDBBRTYsIDB4Njg4MywgMHgwQURDLCAweDY4ODUsIDB4MEFFMCwKLSAgICAweDY4ODYsIDB4MEFERiwgMHg2ODg3LCAweDFGMTYsIDB4Njg4OSwgMHgxRjMzLCAweDY4OEEsIDB4MUYzOSwKLSAgICAweDY4OEIsIDB4MUYzMSwgMHg2ODhDLCAweDFGMzgsIDB4Njg4RiwgMHgxRjI1LCAweDY4OTAsIDB4MUYxNywKLSAgICAweDY4OTEsIDB4MUYzNywgMHg2ODkyLCAweDFGMjcsIDB4Njg5MywgMHgwQUQ0LCAweDY4OTQsIDB4MEFFMSwKLSAgICAweDY4OTYsIDB4MUYzMCwgMHg2ODk3LCAweDBBREEsIDB4Njg5QiwgMHgxRjJGLCAweDY4OUMsIDB4MUYxOCwKLSAgICAweDY4OUQsIDB4MEFFMiwgMHg2ODlGLCAweDBBRTQsIDB4NjhBMCwgMHgxRjMyLCAweDY4QTEsIDB4MEFFNSwKLSAgICAweDY4QTIsIDB4MEFEMywgMHg2OEEzLCAweDFGMUYsIDB4NjhBNCwgMHgxRjM0LCAweDY4QTcsIDB4MEFEOSwKLSAgICAweDY4QTgsIDB4MEFFMywgMHg2OEE5LCAweDFGMjEsIDB4NjhBQSwgMHgxRjJCLCAweDY4QUIsIDB4MUYxQywKLSAgICAweDY4QUMsIDB4MUYyMCwgMHg2OEFELCAweDBBREUsIDB4NjhBRSwgMHgxRjFCLCAweDY4QUYsIDB4MEFEMiwKLSAgICAweDY4QjAsIDB4MEFEQiwgMHg2OEIxLCAweDBBRDgsIDB4NjhCMiwgMHgxRjI0LCAweDY4QjMsIDB4MDhGMCwKLSAgICAweDY4QjQsIDB4MjE5OCwgMHg2OEI1LCAweDBBRDUsIDB4NjhDNCwgMHgwQURELCAweDY4QzYsIDB4MjE5QiwKLSAgICAweDY4QzcsIDB4MjFCMSwgMHg2OEM4LCAweDIxQTYsIDB4NjhDOSwgMHgwQzk3LCAweDY4Q0IsIDB4MEM5MiwKLSAgICAweDY4Q0MsIDB4MjE5NSwgMHg2OENELCAweDBDOTMsIDB4NjhDRSwgMHgyMUE1LCAweDY4RDAsIDB4MjE5RSwKLSAgICAweDY4RDEsIDB4MjFBQiwgMHg2OEQyLCAweDBDOEYsIDB4NjhEMywgMHgyMTgzLCAweDY4RDQsIDB4MjFBRCwKLSAgICAweDY4RDUsIDB4MEM4NSwgMHg2OEQ2LCAweDIxOEIsIDB4NjhENywgMHgwQzg4LCAweDY4RDgsIDB4MEM4NywKLSAgICAweDY4REEsIDB4MEM5OCwgMHg2OERDLCAweDIxODUsIDB4NjhERCwgMHgyMUE3LCAweDY4REUsIDB4MjFBOCwKLSAgICAweDY4REYsIDB4MEM4QSwgMHg2OEUwLCAweDBDODYsIDB4NjhFMSwgMHgyMTkzLCAweDY4RTMsIDB4MEM5MSwKLSAgICAweDY4RTQsIDB4MjE4RSwgMHg2OEU2LCAweDIxQTksIDB4NjhFNywgMHgwQzhELCAweDY4RTgsIDB4MjFBMSwKLSAgICAweDY4RTksIDB4MjFBRSwgMHg2OEVBLCAweDIxODgsIDB4NjhFQiwgMHgyMThELCAweDY4RUMsIDB4MjE4NywKLSAgICAweDY4RUUsIDB4MEM4QywgMHg2OEVGLCAweDIxOUEsIDB4NjhGMCwgMHgyNDJCLCAweDY4RjEsIDB4MjE4OSwKLSAgICAweDY4RjIsIDB4MEM5MCwgMHg2OEYzLCAweDIxOTIsIDB4NjhGNCwgMHgyMUFBLCAweDY4RjUsIDB4MEM4QiwKLSAgICAweDY4RjYsIDB4MjE4RiwgMHg2OEY3LCAweDIxOEMsIDB4NjhGOCwgMHgyMTlELCAweDY4RjksIDB4MEM4RSwKLSAgICAweDY4RkEsIDB4MEM4NCwgMHg2OEZCLCAweDBDOUEsIDB4NjhGQywgMHgyMUEwLCAweDY4RkQsIDB4MjE5RiwKLSAgICAweDY5MDQsIDB4MjE4NCwgMHg2OTA1LCAweDBDODksIDB4NjkwNiwgMHgyMUFDLCAweDY5MDcsIDB4MjE5NCwKLSAgICAweDY5MDgsIDB4MjE5NiwgMHg2OTBBLCAweDIxQTMsIDB4NjkwQiwgMHgyMUEyLCAweDY5MEMsIDB4MjE4MiwKLSAgICAweDY5MEQsIDB4MEM5NCwgMHg2OTBFLCAweDBDOTYsIDB4NjkwRiwgMHgyMThBLCAweDY5MTAsIDB4MjE5MSwKLSAgICAweDY5MTEsIDB4MjE5OSwgMHg2OTEyLCAweDBDOTUsIDB4NjkxMywgMHgyMTkwLCAweDY5MTQsIDB4MjE5QywKLSAgICAweDY5MTUsIDB4MjFBRiwgMHg2OTE3LCAweDIxQTQsIDB4NjkyNSwgMHgyMUIwLCAweDY5MkEsIDB4MjE4NiwKLSAgICAweDY5MkYsIDB4MjQzRiwgMHg2OTMwLCAweDBFM0UsIDB4NjkzMiwgMHgyNDNELCAweDY5MzMsIDB4MjQyOCwKLSAgICAweDY5MzQsIDB4MjQyRCwgMHg2OTM1LCAweDI0MjYsIDB4NjkzNywgMHgyNDM5LCAweDY5MzgsIDB4MjQxOCwKLSAgICAweDY5MzksIDB4MjQxRiwgMHg2OTNCLCAweDI0MzcsIDB4NjkzQywgMHgyNDQxLCAweDY5M0QsIDB4MjQyOSwKLSAgICAweDY5M0YsIDB4MjQxQywgMHg2OTQwLCAweDI0MkYsIDB4Njk0MSwgMHgyNDM0LCAweDY5NDIsIDB4MjQyMCwKLSAgICAweDY5NDQsIDB4MjQzMSwgMHg2OTQ1LCAweDI0MUQsIDB4Njk0OCwgMHgyNDI0LCAweDY5NDksIDB4MjQyNSwKLSAgICAweDY5NEEsIDB4MEU0MCwgMHg2OTRCLCAweDI0MzgsIDB4Njk0QywgMHgyNDM2LCAweDY5NEUsIDB4MjQxOSwKLSAgICAweDY5NEYsIDB4MjQzQiwgMHg2OTUxLCAweDI0M0MsIDB4Njk1MiwgMHgyNDNFLCAweDY5NTMsIDB4MEU0NCwKLSAgICAweDY5NTQsIDB4MEUzQywgMHg2OTU2LCAweDFGMUQsIDB4Njk1NywgMHgyNDIxLCAweDY5NTgsIDB4MjQzMywKLSAgICAweDY5NTksIDB4MjQyMiwgMHg2OTVBLCAweDBFMzksIDB4Njk1QiwgMHgwRTQ5LCAweDY5NUMsIDB4MjQzQSwKLSAgICAweDY5NUQsIDB4MEU0NywgMHg2OTVFLCAweDBFNDMsIDB4Njk1RiwgMHgyNDE3LCAweDY5NjAsIDB4MEUzQiwKLSAgICAweDY5NjIsIDB4MjQxQSwgMHg2OTYzLCAweDBFNDgsIDB4Njk2NSwgMHgyNDJBLCAweDY5NjYsIDB4MjQxNiwKLSAgICAweDY5NjgsIDB4MEU0MSwgMHg2OTY5LCAweDI0MkUsIDB4Njk2QSwgMHgyNDFFLCAweDY5NkIsIDB4MEU0MiwKLSAgICAweDY5NkMsIDB4MjQyNywgMHg2OTZELCAweDBFMzgsIDB4Njk2RSwgMHgwQzk5LCAweDY5NkYsIDB4MjQzMCwKLSAgICAweDY5NzAsIDB4MjE5NywgMHg2OTcxLCAweDI0MUIsIDB4Njk3NCwgMHgyNDM1LCAweDY5NzUsIDB4MEUzRCwKLSAgICAweDY5NzYsIDB4MjQzMiwgMHg2OTc3LCAweDBFM0EsIDB4Njk3OCwgMHgyNDJDLCAweDY5NzksIDB4MEU0NSwKLSAgICAweDY5N0EsIDB4MjQyMywgMHg2OTdCLCAweDI0NDAsIDB4Njk4MiwgMHgwRTNGLCAweDY5ODMsIDB4MjRBRiwKLSAgICAweDY5ODYsIDB4MEU0NiwgMHg2OThELCAweDI2QzksIDB4Njk4RSwgMHgyNkM3LCAweDY5OTAsIDB4MjZERCwKLSAgICAweDY5OTEsIDB4MjZDNSwgMHg2OTkzLCAweDI2RDcsIDB4Njk5NCwgMHgwRTM3LCAweDY5OTUsIDB4MEZGMCwKLSAgICAweDY5OTYsIDB4MjZDMSwgMHg2OTk3LCAweDI2REMsIDB4Njk5OSwgMHgyNkM2LCAweDY5OUEsIDB4MjZENCwKLSAgICAweDY5OUIsIDB4MEZGNSwgMHg2OTlDLCAweDBGRUUsIDB4Njk5RSwgMHgyNkRBLCAweDY5QTAsIDB4MjZCRiwKLSAgICAweDY5QTEsIDB4MjZEOSwgMHg2OUEzLCAweDEwMDAsIDB4NjlBNCwgMHgyNkQwLCAweDY5QTUsIDB4MjZFMCwKLSAgICAweDY5QTYsIDB4MEZGRSwgMHg2OUE3LCAweDI2QzgsIDB4NjlBOCwgMHgwRkVGLCAweDY5QTksIDB4MjZDQSwKLSAgICAweDY5QUEsIDB4MjZEOCwgMHg2OUFCLCAweDBGRjgsIDB4NjlBQywgMHgyNkMzLCAweDY5QUQsIDB4MEZGQywKLSAgICAweDY5QUUsIDB4MEZGMiwgMHg2OUFGLCAweDI2Q0MsIDB4NjlCMCwgMHgyNkMyLCAweDY5QjEsIDB4MjZCQywKLSAgICAweDY5QjMsIDB4MjZENiwgMHg2OUI0LCAweDBGRjksIDB4NjlCNSwgMHgyNkRGLCAweDY5QjYsIDB4MjZCRCwKLSAgICAweDY5QjcsIDB4MEZGNiwgMHg2OUI5LCAweDI2RDIsIDB4NjlCQiwgMHgwRkY3LCAweDY5QkMsIDB4MjZDNCwKLSAgICAweDY5QkQsIDB4MjZDRiwgMHg2OUJFLCAweDI2Q0IsIDB4NjlCRiwgMHgyNkNELCAweDY5QzEsIDB4MEZGMSwKLSAgICAweDY5QzIsIDB4MjZERSwgMHg2OUMzLCAweDBGRkYsIDB4NjlDNCwgMHgyNkNFLCAweDY5QzYsIDB4MjZFMSwKLSAgICAweDY5QzksIDB4MjZCRSwgMHg2OUNBLCAweDI2RDMsIDB4NjlDQiwgMHgwRkY0LCAweDY5Q0MsIDB4MEZGRCwKLSAgICAweDY5Q0QsIDB4MEZGQiwgMHg2OUNFLCAweDI2QzAsIDB4NjlDRiwgMHgyNkQ1LCAweDY5RDAsIDB4MEZGQSwKLSAgICAweDY5RDMsIDB4MEZGMywgMHg2OUQ0LCAweDI2RDEsIDB4NjlEOSwgMHgyNkRCLCAweDY5RTIsIDB4MjkwOSwKLSAgICAweDY5RTQsIDB4MjkwNSwgMHg2OUU1LCAweDI5MDEsIDB4NjlFNiwgMHgyOTE1LCAweDY5RTcsIDB4MjkxMiwKLSAgICAweDY5RTgsIDB4MTE3NywgMHg2OUVCLCAweDI5MTksIDB4NjlFQywgMHgyOTA4LCAweDY5RUQsIDB4MTE4MiwKLSAgICAweDY5RUUsIDB4MjkwRiwgMHg2OUYxLCAweDI5MDQsIDB4NjlGMiwgMHgyOTBFLCAweDY5RjMsIDB4MTE3RiwKLSAgICAweDY5RjQsIDB4MjkyMiwgMHg2OUY2LCAweDI5MUYsIDB4NjlGNywgMHgyOTExLCAweDY5RjgsIDB4MjkwMiwKLSAgICAweDY5RkIsIDB4MjkxNiwgMHg2OUZDLCAweDI5MTgsIDB4NjlGRCwgMHgxMTdCLCAweDY5RkUsIDB4MjkwQywKLSAgICAweDY5RkYsIDB4MjkwNywgMHg2QTAwLCAweDI4RkUsIDB4NkEwMSwgMHgxMTc4LCAweDZBMDIsIDB4MTE4MCwKLSAgICAweDZBMDQsIDB4MjkxQiwgMHg2QTA1LCAweDExODEsIDB4NkEwNiwgMHgyOEZGLCAweDZBMDcsIDB4MjkyMSwKLSAgICAweDZBMDgsIDB4MjkxNCwgMHg2QTA5LCAweDI5MUEsIDB4NkEwQSwgMHgxMTdFLCAweDZBMEQsIDB4MjkxNywKLSAgICAweDZBMEYsIDB4MjkxRSwgMHg2QTExLCAweDExODMsIDB4NkExMywgMHgxMTdELCAweDZBMTQsIDB4MjkxMCwKLSAgICAweDZBMTUsIDB4MjkwMywgMHg2QTE2LCAweDI5MjMsIDB4NkExNywgMHgyOTAwLCAweDZBMTgsIDB4MjkxQywKLSAgICAweDZBMTksIDB4MTE3QSwgMHg2QTFCLCAweDI5MEEsIDB4NkExRCwgMHgyOTBCLCAweDZBMUUsIDB4MTE3OSwKLSAgICAweDZBMUYsIDB4MTE3NiwgMHg2QTIwLCAweDI5MDYsIDB4NkEyMSwgMHgxMTdDLCAweDZBMjMsIDB4MTE3NSwKLSAgICAweDZBMjUsIDB4MjkxRCwgMHg2QTI2LCAweDI5MjAsIDB4NkEyNywgMHgyOTBELCAweDZBMjgsIDB4MkI3NCwKLSAgICAweDZBMzIsIDB4MkI2QywgMHg2QTM0LCAweDJCNjgsIDB4NkEzNSwgMHgxMkQ5LCAweDZBMzgsIDB4MTJDRSwKLSAgICAweDZBMzksIDB4MTJEMywgMHg2QTNBLCAweDEyQ0YsIDB4NkEzQiwgMHgyQjc2LCAweDZBM0MsIDB4MkI4MSwKLSAgICAweDZBM0QsIDB4MTJDRCwgMHg2QTNFLCAweDJCNkUsIDB4NkEzRiwgMHgyQjc3LCAweDZBNDAsIDB4MjkxMywKLSAgICAweDZBNDEsIDB4MkI3OCwgMHg2QTQ0LCAweDEyRDQsIDB4NkE0NiwgMHgyQjg3LCAweDZBNDcsIDB4MTJEOCwKLSAgICAweDZBNDgsIDB4MTJEQiwgMHg2QTQ5LCAweDJCNkEsIDB4NkE0QiwgMHgxMkQ3LCAweDZBNEQsIDB4MkI4NSwKLSAgICAweDZBNEUsIDB4MkI4NiwgMHg2QTRGLCAweDJCN0MsIDB4NkE1MCwgMHgyQjdCLCAweDZBNTEsIDB4MkI3MywKLSAgICAweDZBNTQsIDB4MkI3RCwgMHg2QTU1LCAweDJCODQsIDB4NkE1NiwgMHgyQjgzLCAweDZBNTgsIDB4MTJEMiwKLSAgICAweDZBNTksIDB4MTJEMCwgMHg2QTVBLCAweDJCNzUsIDB4NkE1QiwgMHgyQjcyLCAweDZBNUQsIDB4MkI2RiwKLSAgICAweDZBNUUsIDB4MkI4MiwgMHg2QTVGLCAweDEyREEsIDB4NkE2MCwgMHgyQjgwLCAweDZBNjEsIDB4MTJENiwKLSAgICAweDZBNjIsIDB4MTJENSwgMHg2QTY0LCAweDJCN0EsIDB4NkE2NiwgMHgyQjY5LCAweDZBNjcsIDB4MkI2QiwKLSAgICAweDZBNjgsIDB4MkI2RCwgMHg2QTY5LCAweDJCN0YsIDB4NkE2QSwgMHgyQjc5LCAweDZBNkIsIDB4MTJEMSwKLSAgICAweDZBNkQsIDB4MkI3MCwgMHg2QTZGLCAweDJCN0UsIDB4NkE3NiwgMHgyQjcxLCAweDZBN0UsIDB4MTNFQywKLSAgICAweDZBN0YsIDB4MkQ4NCwgMHg2QTgwLCAweDEzRTUsIDB4NkE4MSwgMHgyRDc1LCAweDZBODMsIDB4MkQ4MCwKLSAgICAweDZBODQsIDB4MTNFNywgMHg2QTg1LCAweDJEODcsIDB4NkE4NywgMHgyRDdDLCAweDZBODksIDB4MkQ3NywKLSAgICAweDZBOEMsIDB4MkQ4OCwgMHg2QThELCAweDJENzMsIDB4NkE4RSwgMHgyRDdFLCAweDZBOTAsIDB4MTNFRSwKLSAgICAweDZBOTEsIDB4MkQ4MywgMHg2QTkyLCAweDJEODksIDB4NkE5MywgMHgyRDdELCAweDZBOTQsIDB4MTNFNiwKLSAgICAweDZBOTUsIDB4MkQ3RiwgMHg2QTk2LCAweDJENzQsIDB4NkE5NywgMHgxM0VELCAweDZBOUEsIDB4MkQ4NiwKLSAgICAweDZBOUIsIDB4MkQ3OSwgMHg2QTlDLCAweDEzRTksIDB4NkE5RSwgMHgyRDdCLCAweDZBOUYsIDB4MkQ3OCwKLSAgICAweDZBQTAsIDB4MTNFRiwgMHg2QUExLCAweDJEN0EsIDB4NkFBMiwgMHgxM0U4LCAweDZBQTMsIDB4MTNFQiwKLSAgICAweDZBQTQsIDB4MkQ4MiwgMHg2QUE1LCAweDJENzYsIDB4NkFBNiwgMHgyRDg1LCAweDZBQTgsIDB4MkQ4MSwKLSAgICAweDZBQUMsIDB4MTRERCwgMHg2QUFELCAweDJGM0UsIDB4NkFBRSwgMHgxNEUyLCAweDZBQUYsIDB4MTRFMywKLSAgICAweDZBQjMsIDB4MTREQywgMHg2QUI0LCAweDJGM0QsIDB4NkFCNiwgMHgyRjNBLCAweDZBQjcsIDB4MkYzQiwKLSAgICAweDZBQjgsIDB4MTRFMCwgMHg2QUI5LCAweDJGMzUsIDB4NkFCQSwgMHgyRjM5LCAweDZBQkIsIDB4MTRERiwKLSAgICAweDZBQkQsIDB4MkYzNiwgMHg2QUMyLCAweDE0RTEsIDB4NkFDMywgMHgxNERFLCAweDZBQzUsIDB4MkYzNCwKLSAgICAweDZBQzYsIDB4MkYzOCwgMHg2QUM3LCAweDJGM0MsIDB4NkFDQiwgMHgzMDlGLCAweDZBQ0MsIDB4MzA5QywKLSAgICAweDZBQ0QsIDB4MzBBNSwgMHg2QUNGLCAweDMwQTQsIDB4NkFEMCwgMHgzMEEyLCAweDZBRDEsIDB4MzA5RCwKLSAgICAweDZBRDMsIDB4MTU4OSwgMHg2QUQ5LCAweDMwOUUsIDB4NkFEQSwgMHgxNTg4LCAweDZBREIsIDB4MTNFQSwKLSAgICAweDZBREMsIDB4MzBBMSwgMHg2QURELCAweDE1ODcsIDB4NkFERSwgMHgzMEE2LCAweDZBREYsIDB4MzBBMCwKLSAgICAweDZBRTAsIDB4MzA5QiwgMHg2QUUxLCAweDJGMzcsIDB4NkFFNSwgMHgxNTg2LCAweDZBRTcsIDB4MzA5QSwKLSAgICAweDZBRTgsIDB4MzFERiwgMHg2QUVBLCAweDMxREUsIDB4NkFFQiwgMHgzMEEzLCAweDZBRUMsIDB4MTYxQiwKLSAgICAweDZBRUUsIDB4MzFFMiwgMHg2QUVGLCAweDMxRTMsIDB4NkFGMCwgMHgzMURELCAweDZBRjEsIDB4MzFFMSwKLSAgICAweDZBRjMsIDB4MzFEQywgMHg2QUY4LCAweDMyRDYsIDB4NkFGOSwgMHgzMUUwLCAweDZBRkEsIDB4MTY3OCwKLSAgICAweDZBRkIsIDB4MTY3NiwgMHg2QUZDLCAweDMyRDQsIDB4NkIwMCwgMHgzMkQ3LCAweDZCMDIsIDB4MzJEMywKLSAgICAweDZCMDMsIDB4MzJENSwgMHg2QjA0LCAweDE2NzcsIDB4NkIwOCwgMHgzMzg2LCAweDZCMDksIDB4MzM4NywKLSAgICAweDZCMEEsIDB4MTZDNiwgMHg2QjBCLCAweDMzODUsIDB4NkIwRiwgMHgzNDIwLCAweDZCMTAsIDB4MTZGRCwKLSAgICAweDZCMTEsIDB4MzQxRSwgMHg2QjEyLCAweDM0MUYsIDB4NkIxMywgMHgzNDg3LCAweDZCMTYsIDB4MTc0MywKLSAgICAweDZCMTcsIDB4MzRDRSwgMHg2QjE4LCAweDM0Q0MsIDB4NkIxOSwgMHgzNENELCAweDZCMUEsIDB4MzRDRiwKLSAgICAweDZCMUUsIDB4MzUzNCwgMHg2QjIwLCAweDAyREUsIDB4NkIyMSwgMHgwM0UzLCAweDZCMjMsIDB4MDYxQSwKLSAgICAweDZCMjUsIDB4MTlDOSwgMHg2QjI4LCAweDFCM0QsIDB4NkIyQywgMHgxQ0U2LCAweDZCMkQsIDB4MUNFOCwKLSAgICAweDZCMkYsIDB4MUNFNywgMHg2QjMxLCAweDFDRTksIDB4NkIzMiwgMHgwQUU3LCAweDZCMzMsIDB4MUYzQywKLSAgICAweDZCMzQsIDB4MUNFQSwgMHg2QjM2LCAweDFGM0IsIDB4NkIzNywgMHgxRjNELCAweDZCMzgsIDB4MUYzRSwKLSAgICAweDZCMzksIDB4MjFCMiwgMHg2QjNBLCAweDBDOUMsIDB4NkIzQiwgMHgyMUIzLCAweDZCM0MsIDB4MjFCNSwKLSAgICAweDZCM0QsIDB4MEM5RCwgMHg2QjNFLCAweDBDOUIsIDB4NkIzRiwgMHgyMUI0LCAweDZCNDEsIDB4MjQ0NywKLSAgICAweDZCNDIsIDB4MjQ0NSwgMHg2QjQzLCAweDI0NDQsIDB4NkI0NSwgMHgyNDQzLCAweDZCNDYsIDB4MjQ0MiwKLSAgICAweDZCNDcsIDB4MEU0QSwgMHg2QjQ4LCAweDI0NDYsIDB4NkI0OSwgMHgxMDAxLCAweDZCNEEsIDB4MjZFMiwKLSAgICAweDZCNEIsIDB4MjZFNCwgMHg2QjRDLCAweDEwMDIsIDB4NkI0RCwgMHgyNkUzLCAweDZCNEUsIDB4MTE4NSwKLSAgICAweDZCNTAsIDB4MTE4NCwgMHg2QjUxLCAweDI5MjQsIDB4NkI1NCwgMHgyQjg5LCAweDZCNTUsIDB4MkI4OCwKLSAgICAweDZCNTYsIDB4MkI4QSwgMHg2QjU5LCAweDEyREMsIDB4NkI1QiwgMHgyRDhBLCAweDZCNUMsIDB4MTNGMCwKLSAgICAweDZCNUUsIDB4MkYzRiwgMHg2QjVGLCAweDE0RTQsIDB4NkI2MCwgMHgzMEE3LCAweDZCNjEsIDB4MTZDNywKLSAgICAweDZCNjIsIDB4MDJERiwgMHg2QjYzLCAweDAzNEQsIDB4NkI2NCwgMHgwM0U0LCAweDZCNjUsIDB4MDRDOSwKLSAgICAweDZCNjYsIDB4MDYxQiwgMHg2QjY3LCAweDA2MUMsIDB4NkI2QSwgMHgwNzY5LCAweDZCNkQsIDB4MUNFQiwKLSAgICAweDZCNzIsIDB4MEU0QiwgMHg2Qjc2LCAweDI5QTIsIDB4NkI3NywgMHgxMkRELCAweDZCNzgsIDB4MTRFNSwKLSAgICAweDZCNzksIDB4MDJFMCwgMHg2QjdCLCAweDAzRTUsIDB4NkI3RSwgMHgxOUNCLCAweDZCN0YsIDB4MDYxRCwKLSAgICAweDZCODAsIDB4MTlDQSwgMHg2QjgyLCAweDFCM0UsIDB4NkI4MywgMHgwNzZBLCAweDZCODQsIDB4MUIzRiwKLSAgICAweDZCODYsIDB4MDc2QiwgMHg2Qjg4LCAweDFDRUQsIDB4NkI4OSwgMHgwOTAwLCAweDZCOEEsIDB4MDhGRiwKLSAgICAweDZCOEMsIDB4MUY0MywgMHg2QjhELCAweDFGNDEsIDB4NkI4RSwgMHgxRjQyLCAweDZCOEYsIDB4MUY0MCwKLSAgICAweDZCOTEsIDB4MUYzRiwgMHg2Qjk0LCAweDIxQjYsIDB4NkI5NSwgMHgyMUI5LCAweDZCOTYsIDB4MEM5RiwKLSAgICAweDZCOTcsIDB4MjFCNywgMHg2Qjk4LCAweDBDOUUsIDB4NkI5OSwgMHgyMUI4LCAweDZCOUIsIDB4MjQ0OCwKLSAgICAweDZCOUUsIDB4MjZFNSwgMHg2QjlGLCAweDI2RTYsIDB4NkJBMCwgMHgyNkU3LCAweDZCQTIsIDB4MjkyNywKLSAgICAweDZCQTMsIDB4MjkyNiwgMHg2QkE0LCAweDExODYsIDB4NkJBNSwgMHgyOTI1LCAweDZCQTYsIDB4MjkyOCwKLSAgICAweDZCQTcsIDB4MkI4QiwgMHg2QkFBLCAweDJCOEMsIDB4NkJBQiwgMHgyQjhELCAweDZCQUQsIDB4MkQ4QiwKLSAgICAweDZCQUUsIDB4MTNGMSwgMHg2QkFGLCAweDE0RTYsIDB4NkJCMCwgMHgzMEE4LCAweDZCQjIsIDB4MTY3OSwKLSAgICAweDZCQjMsIDB4MTc4QSwgMHg2QkI1LCAweDA3NkMsIDB4NkJCNiwgMHgxQjQwLCAweDZCQjcsIDB4MDkwMSwKLSAgICAweDZCQkEsIDB4MEFFOCwgMHg2QkJDLCAweDBDQTAsIDB4NkJCRCwgMHgyMUJBLCAweDZCQkYsIDB4MEU0RCwKLSAgICAweDZCQzAsIDB4MEU0QywgMHg2QkMzLCAweDI2RTgsIDB4NkJDNCwgMHgyNkU5LCAweDZCQzUsIDB4MTE4NywKLSAgICAweDZCQzYsIDB4MTE4OCwgMHg2QkM3LCAweDJCOEYsIDB4NkJDOCwgMHgyQjhFLCAweDZCQzksIDB4MkY0MCwKLSAgICAweDZCQ0EsIDB4MzQyMSwgMHg2QkNCLCAweDAyRTEsIDB4NkJDQywgMHgxNzhCLCAweDZCQ0QsIDB4MDM0RSwKLSAgICAweDZCQ0YsIDB4MDRDQSwgMHg2QkQwLCAweDE4QUQsIDB4NkJEMiwgMHgwNzZELCAweDZCRDMsIDB4MEU0RSwKLSAgICAweDZCRDQsIDB4MDJFMiwgMHg2QkQ2LCAweDFCNDEsIDB4NkJENywgMHgwNzZFLCAweDZCRDgsIDB4MUI0MiwKLSAgICAweDZCREEsIDB4MTNGMiwgMHg2QkRCLCAweDAyRTMsIDB4NkJERSwgMHgxOUNDLCAweDZCRTAsIDB4MUI0MywKLSAgICAweDZCRTIsIDB4MUNGMiwgMHg2QkUzLCAweDFDRjEsIDB4NkJFNCwgMHgxQ0VGLCAweDZCRTYsIDB4MUNFRSwKLSAgICAweDZCRTcsIDB4MUNGMywgMHg2QkU4LCAweDFDRjAsIDB4NkJFQiwgMHgwQUU5LCAweDZCRUMsIDB4MEFFQSwKLSAgICAweDZCRUYsIDB4MENBMSwgMHg2QkYwLCAweDIxQkIsIDB4NkJGMiwgMHgyMUJDLCAweDZCRjMsIDB4MjFCRCwKLSAgICAweDZCRjcsIDB4MjQ0QywgMHg2QkY4LCAweDI0NEQsIDB4NkJGOSwgMHgyNDRCLCAweDZCRkIsIDB4MjQ0OSwKLSAgICAweDZCRkMsIDB4MjQ0QSwgMHg2QkZELCAweDBFNEYsIDB4NkJGRSwgMHgyNkVBLCAweDZCRkYsIDB4MjkyQiwKLSAgICAweDZDMDAsIDB4MjkyQSwgMHg2QzAxLCAweDI5MjksIDB4NkMwMiwgMHgyOTJDLCAweDZDMDMsIDB4MkI5MSwKLSAgICAweDZDMDQsIDB4MkI5MCwgMHg2QzA1LCAweDEyREUsIDB4NkMwNiwgMHgyQjkyLCAweDZDMDgsIDB4MTNGMywKLSAgICAweDZDMDksIDB4MkQ4QywgMHg2QzBCLCAweDJGNDEsIDB4NkMwQywgMHgzMEE5LCAweDZDMEQsIDB4MzM4OCwKLSAgICAweDZDMEYsIDB4MDJFNCwgMHg2QzEwLCAweDAzNTAsIDB4NkMxMSwgMHgwMzRGLCAweDZDMTMsIDB4MDYxRSwKLSAgICAweDZDMTQsIDB4MTc4QywgMHg2QzE1LCAweDE3QUEsIDB4NkMxNiwgMHgwM0U2LCAweDZDMTgsIDB4MTgwMSwKLSAgICAweDZDMTksIDB4MThBRSwgMHg2QzFBLCAweDE4QUYsIDB4NkMxQiwgMHgwNjFGLCAweDZDMUQsIDB4MTlDRCwKLSAgICAweDZDMUYsIDB4MDc2RiwgMHg2QzIwLCAweDFCNDQsIDB4NkMyMSwgMHgxQjQ1LCAweDZDMjMsIDB4MDkwMiwKLSAgICAweDZDMjQsIDB4MDkwNiwgMHg2QzI1LCAweDFDRjQsIDB4NkMyNiwgMHgwOTA1LCAweDZDMjcsIDB4MDkwMywKLSAgICAweDZDMjgsIDB4MDkwNCwgMHg2QzJBLCAweDFGNDQsIDB4NkMyQiwgMHgwQUVCLCAweDZDMkMsIDB4MENBNCwKLSAgICAweDZDMkUsIDB4MENBMiwgMHg2QzJGLCAweDBDQTMsIDB4NkMzMCwgMHgyMUJFLCAweDZDMzMsIDB4MTAwMywKLSAgICAweDZDMzQsIDB4MDJFNSwgMHg2QzM2LCAweDE3QUIsIDB4NkMzOCwgMHgwMzUxLCAweDZDM0IsIDB4MTdBRSwKLSAgICAweDZDM0UsIDB4MDM1NCwgMHg2QzNGLCAweDE3QUQsIDB4NkM0MCwgMHgwMzUzLCAweDZDNDEsIDB4MDM1MiwKLSAgICAweDZDNDIsIDB4MDRDQiwgMHg2QzQzLCAweDE3QUMsIDB4NkM0NiwgMHgxODAyLCAweDZDNEEsIDB4MTgwNiwKLSAgICAweDZDNEIsIDB4MTgwOCwgMHg2QzRDLCAweDE4MDksIDB4NkM0RCwgMHgwM0YwLCAweDZDNEUsIDB4MDNGMSwKLSAgICAweDZDNEYsIDB4MTgwNSwgMHg2QzUwLCAweDAzRUMsIDB4NkM1MiwgMHgxODAzLCAweDZDNTQsIDB4MTgwNywKLSAgICAweDZDNTUsIDB4MDNFRCwgMHg2QzU3LCAweDAzRTgsIDB4NkM1OSwgMHgwM0U5LCAweDZDNUIsIDB4MDNFRiwKLSAgICAweDZDNUMsIDB4MTgwNCwgMHg2QzVELCAweDAzRTcsIDB4NkM1RSwgMHgwNENDLCAweDZDNUYsIDB4MDNFQSwKLSAgICAweDZDNjAsIDB4MDNFQiwgMHg2QzYxLCAweDAzRUUsIDB4NkM2NSwgMHgxOEMwLCAweDZDNjYsIDB4MThCRSwKLSAgICAweDZDNjcsIDB4MThCMSwgMHg2QzY4LCAweDA0RDgsIDB4NkM2OSwgMHgxOEI4LCAweDZDNkEsIDB4MDREMywKLSAgICAweDZDNkIsIDB4MThCMiwgMHg2QzZELCAweDE4QkEsIDB4NkM2RiwgMHgxOEI3LCAweDZDNzAsIDB4MDRENiwKLSAgICAweDZDNzEsIDB4MThCNiwgMHg2QzcyLCAweDA0REQsIDB4NkM3MywgMHgxOEJGLCAweDZDNzQsIDB4MDRERiwKLSAgICAweDZDNzYsIDB4MDRFMSwgMHg2Qzc4LCAweDE4QjAsIDB4NkM3QSwgMHgwNEQ0LCAweDZDN0IsIDB4MThDMSwKLSAgICAweDZDN0QsIDB4MDREQiwgMHg2QzdFLCAweDA0REUsIDB4NkM4MCwgMHgxOUU0LCAweDZDODEsIDB4MDRDRSwKLSAgICAweDZDODIsIDB4MDRFNSwgMHg2QzgzLCAweDA0REMsIDB4NkM4NCwgMHgxOEIzLCAweDZDODUsIDB4MDREMSwKLSAgICAweDZDODYsIDB4MDRFMCwgMHg2Qzg3LCAweDE4QkIsIDB4NkM4OCwgMHgwNENGLCAweDZDODksIDB4MDREMCwKLSAgICAweDZDOEEsIDB4MTlFMiwgMHg2QzhCLCAweDE4QjQsIDB4NkM4QywgMHgwNEQ3LCAweDZDOEQsIDB4MDRFMiwKLSAgICAweDZDOEUsIDB4MThDMiwgMHg2QzhGLCAweDE4QjUsIDB4NkM5MCwgMHgwNEQ1LCAweDZDOTIsIDB4MDREQSwKLSAgICAweDZDOTMsIDB4MTlDRSwgMHg2Qzk0LCAweDA0RTMsIDB4NkM5NSwgMHgxOEJDLCAweDZDOTYsIDB4MDREOSwKLSAgICAweDZDOTgsIDB4MDRFNCwgMHg2Qzk5LCAweDA0Q0QsIDB4NkM5QSwgMHgxOEI5LCAweDZDOUIsIDB4MDREMiwKLSAgICAweDZDOUMsIDB4MThCRCwgMHg2QzlELCAweDE5RTMsIDB4NkNBQiwgMHgwNjJCLCAweDZDQUMsIDB4MDYzQiwKLSAgICAweDZDQUQsIDB4MTlENSwgMHg2Q0FFLCAweDA2MzIsIDB4NkNCMCwgMHgxOUVBLCAweDZDQjEsIDB4MDYyMywKLSAgICAweDZDQjMsIDB4MDYyNiwgMHg2Q0I0LCAweDE5RTEsIDB4NkNCNiwgMHgxOUQzLCAweDZDQjcsIDB4MTlENywKLSAgICAweDZDQjgsIDB4MDYyRSwgMHg2Q0I5LCAweDA2MzAsIDB4NkNCQSwgMHgxOURBLCAweDZDQkIsIDB4MDYzNywKLSAgICAweDZDQkMsIDB4MDYyOSwgMHg2Q0JELCAweDA2MjcsIDB4NkNCRSwgMHgwNjI4LCAweDZDQkYsIDB4MDYzNiwKLSAgICAweDZDQzAsIDB4MTlFNiwgMHg2Q0MxLCAweDA2MzEsIDB4NkNDMiwgMHgxOUQ5LCAweDZDQzMsIDB4MTlEQiwKLSAgICAweDZDQzQsIDB4MDYyRiwgMHg2Q0M1LCAweDA2MzQsIDB4NkNDNiwgMHgxOURDLCAweDZDQzcsIDB4MTlFOSwKLSAgICAweDZDQzksIDB4MDc3MCwgMHg2Q0NBLCAweDA2M0EsIDB4NkNDQywgMHgwNjI0LCAweDZDQ0QsIDB4MTlFOCwKLSAgICAweDZDQ0YsIDB4MTlFQywgMHg2Q0QwLCAweDE5RDgsIDB4NkNEMSwgMHgxOUVFLCAweDZDRDIsIDB4MTlERiwKLSAgICAweDZDRDMsIDB4MDYyRCwgMHg2Q0Q0LCAweDE5RDQsIDB4NkNENSwgMHgwNjJDLCAweDZDRDYsIDB4MDYzRSwKLSAgICAweDZDRDcsIDB4MDYzMywgMHg2Q0Q5LCAweDE5RDIsIDB4NkNEQSwgMHgxQjRFLCAweDZDREIsIDB4MDYzOSwKLSAgICAweDZDREMsIDB4MDYzRCwgMHg2Q0RELCAweDE5RTAsIDB4NkNERSwgMHgxOUU1LCAweDZDRTAsIDB4MDYzRiwKLSAgICAweDZDRTEsIDB4MDYzOCwgMHg2Q0UyLCAweDA2MkEsIDB4NkNFMywgMHgwNjIwLCAweDZDRTUsIDB4MDYyNSwKLSAgICAweDZDRTcsIDB4MTlENiwgMHg2Q0U4LCAweDA2MjEsIDB4NkNFOSwgMHgxOUVELCAweDZDRUIsIDB4MTlEMCwKLSAgICAweDZDRUMsIDB4MTlDRiwgMHg2Q0VELCAweDE5REQsIDB4NkNFRSwgMHgxOUQxLCAweDZDRUYsIDB4MDYzQywKLSAgICAweDZDRjAsIDB4MDkwNywgMHg2Q0YxLCAweDA2MzUsIDB4NkNGMiwgMHgxOURFLCAweDZDRjMsIDB4MDYyMiwKLSAgICAweDZDRjUsIDB4MDc3RiwgMHg2Q0Y5LCAweDE5RUIsIDB4NkQwMCwgMHgxQjU1LCAweDZEMDEsIDB4MUI1OCwKLSAgICAweDZEMDMsIDB4MUI1QiwgMHg2RDA0LCAweDFCNTAsIDB4NkQwNywgMHgxQjVFLCAweDZEMDgsIDB4MUI2MSwKLSAgICAweDZEMDksIDB4MUI2MywgMHg2RDBBLCAweDFCNEQsIDB4NkQwQiwgMHgwNzcxLCAweDZEMEMsIDB4MDc3NiwKLSAgICAweDZEMEQsIDB4MUNGOSwgMHg2RDBFLCAweDA3ODYsIDB4NkQwRiwgMHgxQjVDLCAweDZEMTAsIDB4MUI2NCwKLSAgICAweDZEMTEsIDB4MUI1NCwgMHg2RDEyLCAweDFCNEMsIDB4NkQxNiwgMHgxRDE0LCAweDZEMTcsIDB4MDc3OSwKLSAgICAweDZEMTgsIDB4MUI1OSwgMHg2RDE5LCAweDFCNTEsIDB4NkQxQSwgMHgxQjUzLCAweDZEMUIsIDB4MDc3RSwKLSAgICAweDZEMUQsIDB4MUI1NiwgMHg2RDFFLCAweDA3NzgsIDB4NkQxRiwgMHgxQjQ5LCAweDZEMjAsIDB4MUI1RiwKLSAgICAweDZEMjIsIDB4MUI2MiwgMHg2RDI1LCAweDA3NzUsIDB4NkQyNywgMHgwNzgxLCAweDZEMjgsIDB4MUI0NiwKLSAgICAweDZEMjksIDB4MDc4MywgMHg2RDJBLCAweDA3NzMsIDB4NkQyQiwgMHgwNzg3LCAweDZEMkMsIDB4MUI2MCwKLSAgICAweDZEMkQsIDB4MUI0OCwgMHg2RDJFLCAweDA3ODQsIDB4NkQyRiwgMHgxRDBFLCAweDZEMzAsIDB4MTlFNywKLSAgICAweDZEMzEsIDB4MDc3NywgMHg2RDMyLCAweDA3NzIsIDB4NkQzMywgMHgxQjRGLCAweDZEMzQsIDB4MUI0NywKLSAgICAweDZEMzUsIDB4MDc4NSwgMHg2RDM2LCAweDA3N0QsIDB4NkQzNywgMHgxQjVBLCAweDZEMzgsIDB4MDc4MiwKLSAgICAweDZEMzksIDB4MDc4MCwgMHg2RDNBLCAweDFCNTIsIDB4NkQzQiwgMHgwNzdBLCAweDZEM0MsIDB4MUI0QSwKLSAgICAweDZEM0QsIDB4MDc3QiwgMHg2RDNFLCAweDA3N0MsIDB4NkQzRiwgMHgxQjRCLCAweDZENDAsIDB4MUI1RCwKLSAgICAweDZENDEsIDB4MDc3NCwgMHg2RDQyLCAweDFCNTcsIDB4NkQ1OCwgMHgxQ0ZDLCAweDZENTksIDB4MDkwRiwKLSAgICAweDZENUEsIDB4MDkxNCwgMHg2RDVFLCAweDFEMDUsIDB4NkQ1RiwgMHgxRDBCLCAweDZENjAsIDB4MUQwNywKLSAgICAweDZENjEsIDB4MUNGQSwgMHg2RDYyLCAweDFDRkQsIDB4NkQ2MywgMHgxQ0Y2LCAweDZENjQsIDB4MUNGNywKLSAgICAweDZENjUsIDB4MDkxQiwgMHg2RDY2LCAweDA5MEMsIDB4NkQ2NywgMHgxRDA2LCAweDZENjgsIDB4MUQwRiwKLSAgICAweDZENjksIDB4MDkxNiwgMHg2RDZBLCAweDA5MDgsIDB4NkQ2QywgMHgwOTExLCAweDZENkQsIDB4MUNGRSwKLSAgICAweDZENkUsIDB4MDkxMywgMHg2RDZGLCAweDFDRkYsIDB4NkQ3MCwgMHgxRDA5LCAweDZENzQsIDB4MDkxNSwKLSAgICAweDZENzUsIDB4MUQxOCwgMHg2RDc2LCAweDFDRjgsIDB4NkQ3NywgMHgwOTBFLCAweDZENzgsIDB4MDkwRCwKLSAgICAweDZENzksIDB4MDkxOSwgMHg2RDdBLCAweDFDRjUsIDB4NkQ3QiwgMHgxRDE2LCAweDZEN0MsIDB4MUQwQSwKLSAgICAweDZEN0QsIDB4MUQxNywgMHg2RDdFLCAweDFEMTEsIDB4NkQ3RiwgMHgxRDAzLCAweDZEODAsIDB4MUQxMiwKLSAgICAweDZEODIsIDB4MUQwQywgMHg2RDgzLCAweDFEMTUsIDB4NkQ4NCwgMHgxRDEzLCAweDZEODUsIDB4MDkxQSwKLSAgICAweDZEODYsIDB4MUQwNCwgMHg2RDg3LCAweDA5MEIsIDB4NkQ4OCwgMHgwOTBBLCAweDZEODksIDB4MDkxMiwKLSAgICAweDZEOEEsIDB4MDkxOCwgMHg2RDhCLCAweDFEMTAsIDB4NkQ4QywgMHgwOTE3LCAweDZEOEQsIDB4MUQwMSwKLSAgICAweDZEOEUsIDB4MEFFQywgMHg2RDkwLCAweDFEMTksIDB4NkQ5MSwgMHgxRDAwLCAweDZEOTIsIDB4MUNGQiwKLSAgICAweDZEOTMsIDB4MDkxMCwgMHg2RDk0LCAweDA5MUMsIDB4NkQ5NSwgMHgwOTA5LCAweDZEOTcsIDB4MUQwOCwKLSAgICAweDZEOTgsIDB4MUQwRCwgMHg2REFBLCAweDBCMEUsIDB4NkRBQiwgMHgxRjQ2LCAweDZEQUMsIDB4MUY0QSwKLSAgICAweDZEQUUsIDB4MEFGQiwgMHg2REFGLCAweDBBRjksIDB4NkRCMiwgMHgwQUYwLCAweDZEQjMsIDB4MUY0OCwKLSAgICAweDZEQjQsIDB4MUY0NywgMHg2REI1LCAweDBCMDQsIDB4NkRCNywgMHgxRjRELCAweDZEQjgsIDB4MEFGRSwKLSAgICAweDZEQkEsIDB4MUY1RiwgMHg2REJCLCAweDFGNkIsIDB4NkRCQywgMHgwQUVELCAweDZEQkQsIDB4MUY1QywKLSAgICAweDZEQkUsIDB4MUY1NSwgMHg2REJGLCAweDBCMTAsIDB4NkRDMCwgMHgxRjQ1LCAweDZEQzIsIDB4MUY2MSwKLSAgICAweDZEQzQsIDB4MEIwRCwgMHg2REM1LCAweDBCMDEsIDB4NkRDNiwgMHgwQjBDLCAweDZEQzcsIDB4MEFGNywKLSAgICAweDZEQzgsIDB4MUY1MSwgMHg2REM5LCAweDFGNjMsIDB4NkRDQSwgMHgxRjVCLCAweDZEQ0IsIDB4MEFGOCwKLSAgICAweDZEQ0MsIDB4MEFGMiwgMHg2RENELCAweDFGNjksIDB4NkRDRiwgMHgxRjYyLCAweDZERDAsIDB4MUY2NCwKLSAgICAweDZERDEsIDB4MEFGQSwgMHg2REQyLCAweDBCMDIsIDB4NkREMywgMHgxRjY2LCAweDZERDQsIDB4MUY0RiwKLSAgICAweDZERDUsIDB4MUY2MCwgMHg2REQ2LCAweDFGNTQsIDB4NkRENywgMHgxRjY4LCAweDZERDgsIDB4MEIwNywKLSAgICAweDZERDksIDB4MEFFRiwgMHg2RERBLCAweDBCMDUsIDB4NkREQiwgMHgxRjU5LCAweDZEREMsIDB4MUY1NywKLSAgICAweDZEREQsIDB4MUY1OCwgMHg2RERFLCAweDBBRkMsIDB4NkRERiwgMHgxRjUzLCAweDZERTAsIDB4MUY1MiwKLSAgICAweDZERTEsIDB4MEFGMSwgMHg2REUyLCAweDFGNEMsIDB4NkRFMywgMHgxRjZBLCAweDZERTQsIDB4MEFGMywKLSAgICAweDZERTUsIDB4MUY1NiwgMHg2REU2LCAweDBCMTEsIDB4NkRFOCwgMHgwQjBCLCAweDZERTksIDB4MUY0QiwKLSAgICAweDZERUEsIDB4MEIwOCwgMHg2REVCLCAweDBCMDYsIDB4NkRFQywgMHgwQjBGLCAweDZERUQsIDB4MUY1RCwKLSAgICAweDZERUUsIDB4MEIwQSwgMHg2REVGLCAweDFEMDIsIDB4NkRGMCwgMHgxRjVFLCAweDZERjEsIDB4MEIwOSwKLSAgICAweDZERjIsIDB4MUY2NSwgMHg2REYzLCAweDBBRUUsIDB4NkRGNCwgMHgxRjVBLCAweDZERjUsIDB4MEIwMCwKLSAgICAweDZERjYsIDB4MUY0RSwgMHg2REY3LCAweDBBRkYsIDB4NkRGOSwgMHgwQUZELCAweDZERkEsIDB4MEFGNSwKLSAgICAweDZERkIsIDB4MEFGNCwgMHg2REZDLCAweDIxQkYsIDB4NkRGRCwgMHgxRjY3LCAweDZFMDAsIDB4MUY1MCwKLSAgICAweDZFMDMsIDB4MjFENCwgMHg2RTA1LCAweDBBRjYsIDB4NkUxOSwgMHgwQ0MxLCAweDZFMUEsIDB4MEIwMywKLSAgICAweDZFMUIsIDB4MENBRiwgMHg2RTFDLCAweDIxQ0UsIDB4NkUxRCwgMHgwQ0JELCAweDZFMUYsIDB4MjFDMiwKLSAgICAweDZFMjAsIDB4MENBQywgMHg2RTIxLCAweDBDQTgsIDB4NkUyMiwgMHgyMUUwLCAweDZFMjMsIDB4MENBRSwKLSAgICAweDZFMjQsIDB4MENCMiwgMHg2RTI1LCAweDBDQUQsIDB4NkUyNiwgMHgwQ0I2LCAweDZFMjcsIDB4MjFFNCwKLSAgICAweDZFMjgsIDB4MjFEQiwgMHg2RTJCLCAweDIxQzksIDB4NkUyQywgMHgwQ0JCLCAweDZFMkQsIDB4MENCNSwKLSAgICAweDZFMkUsIDB4MjFENSwgMHg2RTJGLCAweDBDQTUsIDB4NkUzMCwgMHgyMUUxLCAweDZFMzEsIDB4MjFEQSwKLSAgICAweDZFMzIsIDB4MENBOSwgMHg2RTMzLCAweDIxQ0YsIDB4NkUzNCwgMHgwQ0I4LCAweDZFMzUsIDB4MjFFQywKLSAgICAweDZFMzYsIDB4MjFFRCwgMHg2RTM4LCAweDBDQTYsIDB4NkUzOSwgMHgyMURGLCAweDZFM0EsIDB4MENCQSwKLSAgICAweDZFM0IsIDB4MjFEMywgMHg2RTNDLCAweDIxQzUsIDB4NkUzRCwgMHgyMUM2LCAweDZFM0UsIDB4MENCRSwKLSAgICAweDZFM0YsIDB4MjFDQSwgMHg2RTQwLCAweDIxRDEsIDB4NkU0MSwgMHgyMUNCLCAweDZFNDMsIDB4MENCQywKLSAgICAweDZFNDQsIDB4MENDNCwgMHg2RTQ1LCAweDIxQzcsIDB4NkU0NiwgMHgyMUMwLCAweDZFNDcsIDB4MjFDMSwKLSAgICAweDZFNDksIDB4MjFDMywgMHg2RTRBLCAweDBDQUIsIDB4NkU0QiwgMHgyMUQwLCAweDZFNEQsIDB4MENCOSwKLSAgICAweDZFNEUsIDB4MENDMiwgMHg2RTUxLCAweDIxRDIsIDB4NkU1MiwgMHgyMUVBLCAweDZFNTMsIDB4MjFFMiwKLSAgICAweDZFNTQsIDB4MENBNywgMHg2RTU1LCAweDIxRTgsIDB4NkU1NiwgMHgwQ0IzLCAweDZFNTgsIDB4MENCMSwKLSAgICAweDZFNUEsIDB4MjFFRSwgMHg2RTVCLCAweDBDQjAsIDB4NkU1QywgMHgyMUQ4LCAweDZFNUQsIDB4MjFDQywKLSAgICAweDZFNUUsIDB4MjFENiwgMHg2RTVGLCAweDBDQzcsIDB4NkU2MCwgMHgyMURDLCAweDZFNjEsIDB4MjFEOSwKLSAgICAweDZFNjIsIDB4MjFDOCwgMHg2RTYzLCAweDBDQzMsIDB4NkU2NCwgMHgyMUU2LCAweDZFNjUsIDB4MjFFMywKLSAgICAweDZFNjYsIDB4MjFFQiwgMHg2RTY3LCAweDBDQUEsIDB4NkU2OCwgMHgyMUQ3LCAweDZFNjksIDB4MENDNiwKLSAgICAweDZFNkIsIDB4MjFERSwgMHg2RTZFLCAweDBDQjQsIDB4NkU2RiwgMHgwQ0I3LCAweDZFNzEsIDB4MjFERCwKLSAgICAweDZFNzIsIDB4MENDNSwgMHg2RTczLCAweDIxQ0QsIDB4NkU3NCwgMHgxRjQ5LCAweDZFNzcsIDB4MjFFNywKLSAgICAweDZFNzgsIDB4MjFFNSwgMHg2RTc5LCAweDIxRTksIDB4NkU4OCwgMHgyMUM0LCAweDZFODksIDB4MENDMCwKLSAgICAweDZFOEQsIDB4MjQ2QywgMHg2RThFLCAweDI0NkIsIDB4NkU4RiwgMHgyNDUxLCAweDZFOTAsIDB4MEU1NSwKLSAgICAweDZFOTIsIDB4MjQ2QSwgMHg2RTkzLCAweDI0NTQsIDB4NkU5NCwgMHgyNDU1LCAweDZFOTYsIDB4MEU1RiwKLSAgICAweDZFOTcsIDB4MjQ3MywgMHg2RTk4LCAweDBFNUEsIDB4NkU5OSwgMHgyNDY5LCAweDZFOUIsIDB4MjQ0RSwKLSAgICAweDZFOUMsIDB4MEU2MCwgMHg2RTlELCAweDBFNTYsIDB4NkU5RSwgMHgyNDVELCAweDZFOUYsIDB4MjQ1MywKLSAgICAweDZFQTAsIDB4MjQ1NiwgMHg2RUExLCAweDI0NkUsIDB4NkVBMiwgMHgwRTUwLCAweDZFQTMsIDB4MjQ3NSwKLSAgICAweDZFQTQsIDB4MjQ2RCwgMHg2RUE1LCAweDBFNTksIDB4NkVBNiwgMHgyNDYyLCAweDZFQTcsIDB4MEU2NCwKLSAgICAweDZFQUEsIDB4MEU2MywgMHg2RUFCLCAweDBFNUQsIDB4NkVBRSwgMHgyNDc0LCAweDZFQUYsIDB4MEU1MSwKLSAgICAweDZFQjAsIDB4MjQ2MCwgMHg2RUIxLCAweDI0NTcsIDB4NkVCMiwgMHgyNDY0LCAweDZFQjMsIDB4MjQ3MCwKLSAgICAweDZFQjQsIDB4MEU2NSwgMHg2RUI2LCAweDBFNTMsIDB4NkVCNywgMHgyNDVGLCAweDZFQjksIDB4MjQ1OCwKLSAgICAweDZFQkEsIDB4MEU1QywgMHg2RUJDLCAweDBFNUIsIDB4NkVCRCwgMHgyNDVCLCAweDZFQkUsIDB4MjQ2NSwKLSAgICAweDZFQkYsIDB4MjQ2RiwgMHg2RUMwLCAweDI0NTIsIDB4NkVDMSwgMHgyNDVDLCAweDZFQzIsIDB4MEU1NCwKLSAgICAweDZFQzMsIDB4MjQ2NiwgMHg2RUM0LCAweDBFNjEsIDB4NkVDNSwgMHgwRTU4LCAweDZFQzYsIDB4MjQ1OSwKLSAgICAweDZFQzcsIDB4MEU1NywgMHg2RUM4LCAweDI0NTAsIDB4NkVDOSwgMHgyNDVFLCAweDZFQ0EsIDB4MjQ3MiwKLSAgICAweDZFQ0IsIDB4MENCRiwgMHg2RUNDLCAweDEwMUYsIDB4NkVDRCwgMHgyNDYxLCAweDZFQ0UsIDB4MjZFQiwKLSAgICAweDZFQ0YsIDB4MjQ2MywgMHg2RUQwLCAweDI0NzEsIDB4NkVEMSwgMHgwRTVFLCAweDZFRDIsIDB4MjQ1QSwKLSAgICAweDZFRDMsIDB4MEU1MiwgMHg2RUQ0LCAweDBFNjIsIDB4NkVENSwgMHgxMTlBLCAweDZFRDYsIDB4MjQ0RiwKLSAgICAweDZFRDgsIDB4MjQ2OCwgMHg2RURDLCAweDI0NjcsIDB4NkVFQiwgMHgyNzA3LCAweDZFRUMsIDB4MTAxQywKLSAgICAweDZFRUQsIDB4MjZGQywgMHg2RUVFLCAweDI3MDEsIDB4NkVFRiwgMHgxMDExLCAweDZFRjEsIDB4MjZFRCwKLSAgICAweDZFRjIsIDB4MTAxRSwgMHg2RUY0LCAweDEwMDgsIDB4NkVGNSwgMHgyNkVDLCAweDZFRjYsIDB4MjcwRCwKLSAgICAweDZFRjcsIDB4MTAyMCwgMHg2RUY4LCAweDI2RjAsIDB4NkVGOSwgMHgyNzAwLCAweDZFRkIsIDB4MjZGMiwKLSAgICAweDZFRkMsIDB4MjcxMCwgMHg2RUZELCAweDI3MEMsIDB4NkVGRSwgMHgxMDA2LCAweDZFRkYsIDB4MTAxMCwKLSAgICAweDZGMDAsIDB4Mjk0NiwgMHg2RjAxLCAweDEwMUQsIDB4NkYwMiwgMHgxMDBFLCAweDZGMDMsIDB4MjZFRSwKLSAgICAweDZGMDUsIDB4MjcwQiwgMHg2RjA2LCAweDEwMTIsIDB4NkYwNywgMHgyNzA4LCAweDZGMDgsIDB4MjcxNSwKLSAgICAweDZGMDksIDB4MjZGNCwgMHg2RjBBLCAweDI2RkQsIDB4NkYwRCwgMHgyNzEzLCAweDZGMEUsIDB4MjcwOSwKLSAgICAweDZGMEYsIDB4MTAwRCwgMHg2RjEyLCAweDI2RkIsIDB4NkYxMywgMHgxMDA3LCAweDZGMTQsIDB4MTAwNSwKLSAgICAweDZGMTUsIDB4MTAxNywgMHg2RjE4LCAweDI2RjksIDB4NkYxOSwgMHgyNkY2LCAweDZGMUEsIDB4MjZGNywKLSAgICAweDZGMUMsIDB4MjcwRiwgMHg2RjFFLCAweDI3MTQsIDB4NkYxRiwgMHgyNzEyLCAweDZGMjAsIDB4MTAwQiwKLSAgICAweDZGMjEsIDB4MjcxNiwgMHg2RjIyLCAweDEwMEYsIDB4NkYyMywgMHgxMDE2LCAweDZGMjUsIDB4MjZFRiwKLSAgICAweDZGMjYsIDB4MjkyRSwgMHg2RjI3LCAweDI2RjgsIDB4NkYyOSwgMHgxMDA5LCAweDZGMkEsIDB4MTAxQiwKLSAgICAweDZGMkIsIDB4MTAxOCwgMHg2RjJDLCAweDEwMEMsIDB4NkYyRCwgMHgyNzAyLCAweDZGMkUsIDB4MjZGMywKLSAgICAweDZGMkYsIDB4MTAxOSwgMHg2RjMwLCAweDI3MDQsIDB4NkYzMSwgMHgxMDEzLCAweDZGMzIsIDB4MTAxNSwKLSAgICAweDZGMzMsIDB4MTAwNCwgMHg2RjM1LCAweDI3MDYsIDB4NkYzNiwgMHgyNkZFLCAweDZGMzcsIDB4MjZGMSwKLSAgICAweDZGMzgsIDB4MTAxNCwgMHg2RjM5LCAweDI3MEUsIDB4NkYzQSwgMHgyNzExLCAweDZGM0IsIDB4MjZGQSwKLSAgICAweDZGM0MsIDB4MjcwNSwgMHg2RjNFLCAweDEwMEEsIDB4NkYzRiwgMHgxMTg5LCAweDZGNDAsIDB4MjcwMywKLSAgICAweDZGNDEsIDB4MjkyRCwgMHg2RjQzLCAweDI3MEEsIDB4NkY0RSwgMHgyNkY1LCAweDZGNEYsIDB4MjkzNywKLSAgICAweDZGNTAsIDB4Mjk0MSwgMHg2RjUxLCAweDExOEMsIDB4NkY1MiwgMHgyOTQwLCAweDZGNTMsIDB4Mjk0QywKLSAgICAweDZGNTQsIDB4MTE4RSwgMHg2RjU1LCAweDI5M0UsIDB4NkY1NywgMHgyOTQyLCAweDZGNTgsIDB4MTE5OSwKLSAgICAweDZGNUEsIDB4MjkzOSwgMHg2RjVCLCAweDExOTEsIDB4NkY1RCwgMHgyOTQ1LCAweDZGNUUsIDB4MkI5QSwKLSAgICAweDZGNUYsIDB4MTE5RCwgMHg2RjYwLCAweDExOUMsIDB4NkY2MSwgMHgyOTQ3LCAweDZGNjIsIDB4MjkzNiwKLSAgICAweDZGNjMsIDB4Mjk1MSwgMHg2RjY0LCAweDExOTcsIDB4NkY2NiwgMHgxMThELCAweDZGNjcsIDB4Mjk0QSwKLSAgICAweDZGNjksIDB4Mjk0RSwgMHg2RjZBLCAweDI5NTMsIDB4NkY2QiwgMHgyOTQ4LCAweDZGNkMsIDB4MjkzQywKLSAgICAweDZGNkQsIDB4MTE5MCwgMHg2RjZFLCAweDExOTMsIDB4NkY2RiwgMHgxMTlCLCAweDZGNzAsIDB4MTE5NiwKLSAgICAweDZGNzIsIDB4MjkzRiwgMHg2RjczLCAweDI2RkYsIDB4NkY3NiwgMHgyOTNCLCAweDZGNzcsIDB4Mjk1MiwKLSAgICAweDZGNzgsIDB4MTE5MiwgMHg2RjdBLCAweDExOTUsIDB4NkY3QiwgMHgyOTU0LCAweDZGN0MsIDB4MTE4QSwKLSAgICAweDZGN0QsIDB4Mjk0OSwgMHg2RjdFLCAweDI5MkYsIDB4NkY3RiwgMHgyOTRGLCAweDZGODAsIDB4MTNGQywKLSAgICAweDZGODIsIDB4MjkzRCwgMHg2Rjg0LCAweDExOEIsIDB4NkY4NSwgMHgyOTM4LCAweDZGODYsIDB4MTE4RiwKLSAgICAweDZGODcsIDB4MjkzMCwgMHg2Rjg4LCAweDEwMUEsIDB4NkY4OSwgMHgyOTM0LCAweDZGOEIsIDB4Mjk0RCwKLSAgICAweDZGOEMsIDB4MjkzNSwgMHg2RjhELCAweDI5MzMsIDB4NkY4RSwgMHgxMTk0LCAweDZGOTAsIDB4Mjk0QiwKLSAgICAweDZGOTIsIDB4MjkzMiwgMHg2RjkzLCAweDI5NDQsIDB4NkY5NCwgMHgyOTQzLCAweDZGOTUsIDB4Mjk1MCwKLSAgICAweDZGOTYsIDB4MjkzQSwgMHg2Rjk3LCAweDExOTgsIDB4NkY5RSwgMHgyQjlELCAweDZGQTAsIDB4MTJFQiwKLSAgICAweDZGQTEsIDB4MTJFMSwgMHg2RkEyLCAweDJCQTksIDB4NkZBMywgMHgyQjk1LCAweDZGQTQsIDB4MTJFMywKLSAgICAweDZGQTUsIDB4MkJBMSwgMHg2RkE2LCAweDEyRUEsIDB4NkZBNywgMHgxMkU1LCAweDZGQTgsIDB4MkI5RiwKLSAgICAweDZGQTksIDB4MkQ4RSwgMHg2RkFBLCAweDJCQTUsIDB4NkZBQiwgMHgyQkFCLCAweDZGQUMsIDB4MkJBNCwKLSAgICAweDZGQUQsIDB4MkI5MywgMHg2RkFFLCAweDJCQTIsIDB4NkZBRiwgMHgyQkFELCAweDZGQjAsIDB4MkJBRiwKLSAgICAweDZGQjEsIDB4MTJFMCwgMHg2RkIyLCAweDJCQUUsIDB4NkZCMywgMHgxMkU2LCAweDZGQjQsIDB4MTJFQywKLSAgICAweDZGQjYsIDB4MTJFOSwgMHg2RkI4LCAweDJCQTgsIDB4NkZCOSwgMHgxMkU4LCAweDZGQkEsIDB4MkJBMywKLSAgICAweDZGQkMsIDB4MkI5NywgMHg2RkJELCAweDJCOUMsIDB4NkZCRiwgMHgyQkE3LCAweDZGQzAsIDB4MTJFNywKLSAgICAweDZGQzEsIDB4MTJFNCwgMHg2RkMyLCAweDEyREYsIDB4NkZDMywgMHgxMkUyLCAweDZGQzQsIDB4MkI5QiwKLSAgICAweDZGQzYsIDB4MjkzMSwgMHg2RkM3LCAweDJCOTYsIDB4NkZDOCwgMHgyQjk5LCAweDZGQzksIDB4MkJBQSwKLSAgICAweDZGQ0EsIDB4MkI5RSwgMHg2RkNCLCAweDJCOTQsIDB4NkZDQywgMHgyRDhELCAweDZGQ0QsIDB4MkJBQywKLSAgICAweDZGQ0UsIDB4MkI5OCwgMHg2RkNGLCAweDJCQTYsIDB4NkZENCwgMHgyRDkwLCAweDZGRDUsIDB4MTQwMCwKLSAgICAweDZGRDgsIDB4MTNGNCwgMHg2RkRCLCAweDEzRjgsIDB4NkZEQywgMHgyRDkyLCAweDZGREQsIDB4MkQ5OCwKLSAgICAweDZGREUsIDB4MkQ5NiwgMHg2RkRGLCAweDEzRjYsIDB4NkZFMCwgMHgxM0Y3LCAweDZGRTEsIDB4MTNGRSwKLSAgICAweDZGRTIsIDB4MkQ5OSwgMHg2RkUzLCAweDJEOTEsIDB4NkZFNCwgMHgxM0Y5LCAweDZGRTYsIDB4MkQ5NSwKLSAgICAweDZGRTcsIDB4MkQ5NCwgMHg2RkU4LCAweDJEOUEsIDB4NkZFOSwgMHgxM0ZGLCAweDZGRUIsIDB4MTNGQSwKLSAgICAweDZGRUMsIDB4MTNGRCwgMHg2RkVELCAweDJEOTMsIDB4NkZFRSwgMHgxNDAxLCAweDZGRUYsIDB4MTNGQiwKLSAgICAweDZGRjAsIDB4MTQwMiwgMHg2RkYxLCAweDEzRjUsIDB4NkZGMiwgMHgyRDk3LCAweDZGRjQsIDB4MkQ4RiwKLSAgICAweDZGRjcsIDB4MkY0RSwgMHg2RkZBLCAweDE0RUIsIDB4NkZGQiwgMHgyRjRCLCAweDZGRkMsIDB4MkY0RCwKLSAgICAweDZGRkUsIDB4MTRFOSwgMHg2RkZGLCAweDJGNDksIDB4NzAwMCwgMHgyRjRBLCAweDcwMDEsIDB4MkY0NSwKLSAgICAweDcwMDQsIDB4MkJBMCwgMHg3MDA1LCAweDJGNDYsIDB4NzAwNiwgMHgxNEVBLCAweDcwMDcsIDB4MkY0MiwKLSAgICAweDcwMDksIDB4MTRFNywgMHg3MDBBLCAweDJGNEYsIDB4NzAwQiwgMHgxNEU4LCAweDcwMEMsIDB4MkY0MywKLSAgICAweDcwMEQsIDB4MkY0NCwgMHg3MDBFLCAweDJGNDgsIDB4NzAwRiwgMHgxNEVELCAweDcwMTEsIDB4MTRFQywKLSAgICAweDcwMTQsIDB4MkY0NywgMHg3MDE1LCAweDE1OEYsIDB4NzAxNiwgMHgzMEFELCAweDcwMTcsIDB4MzBCMywKLSAgICAweDcwMTgsIDB4MTU5MCwgMHg3MDE5LCAweDMwQUEsIDB4NzAxQSwgMHgxNThELCAweDcwMUIsIDB4MTU4QSwKLSAgICAweDcwMUMsIDB4MzBCNSwgMHg3MDFELCAweDE1OEUsIDB4NzAxRiwgMHgxNThCLCAweDcwMjAsIDB4MzBBQywKLSAgICAweDcwMjEsIDB4MzBBRiwgMHg3MDIyLCAweDMwQjAsIDB4NzAyMywgMHgzMEIxLCAweDcwMjQsIDB4MzBCNCwKLSAgICAweDcwMjYsIDB4MkY0QywgMHg3MDI3LCAweDMwQUIsIDB4NzAyOCwgMHgxNThDLCAweDcwMjksIDB4MzBCMiwKLSAgICAweDcwMkEsIDB4MzFFRiwgMHg3MDJCLCAweDMwQUUsIDB4NzAyRiwgMHgzMUU2LCAweDcwMzAsIDB4MTYxRCwKLSAgICAweDcwMzEsIDB4MzFFOSwgMHg3MDMyLCAweDE2MUUsIDB4NzAzMywgMHgzMUYyLCAweDcwMzQsIDB4MzFFOCwKLSAgICAweDcwMzUsIDB4MzFFNSwgMHg3MDM3LCAweDMxRTcsIDB4NzAzOCwgMHgzMUVCLCAweDcwMzksIDB4MzFFRSwKLSAgICAweDcwM0EsIDB4MzFFRCwgMHg3MDNCLCAweDMxRjEsIDB4NzAzQywgMHgzMUU0LCAweDcwM0UsIDB4MTYxQywKLSAgICAweDcwM0YsIDB4MzFFQywgMHg3MDQwLCAweDMxRjAsIDB4NzA0MSwgMHgzMUYzLCAweDcwNDIsIDB4MzFFQSwKLSAgICAweDcwNDMsIDB4MzJEOCwgMHg3MDQ0LCAweDMyRDksIDB4NzA0NSwgMHgzMkRELCAweDcwNDYsIDB4MzJERSwKLSAgICAweDcwNDgsIDB4MzJEQiwgMHg3MDQ5LCAweDMyREMsIDB4NzA0QSwgMHgzMkRBLCAweDcwNEMsIDB4MTY3QSwKLSAgICAweDcwNTEsIDB4MTZDOCwgMHg3MDUyLCAweDMzOEMsIDB4NzA1NSwgMHgzMzg5LCAweDcwNTYsIDB4MzM4QSwKLSAgICAweDcwNTcsIDB4MzM4QiwgMHg3MDU4LCAweDE2QzksIDB4NzA1QSwgMHgzNDIzLCAweDcwNUIsIDB4MzQyMiwKLSAgICAweDcwNUQsIDB4MzQ4QSwgMHg3MDVFLCAweDE3MjIsIDB4NzA1RiwgMHgzNDg4LCAweDcwNjAsIDB4MzQ4QiwKLSAgICAweDcwNjEsIDB4MzQ4OSwgMHg3MDYyLCAweDM0RDAsIDB4NzA2MywgMHgxNzQ0LCAweDcwNjQsIDB4MTc1MiwKLSAgICAweDcwNjUsIDB4MzUxQywgMHg3MDY2LCAweDM1MDYsIDB4NzA2OCwgMHgzNTFCLCAweDcwNjksIDB4MzU0NywKLSAgICAweDcwNkEsIDB4MzU0OCwgMHg3MDZCLCAweDAyRTYsIDB4NzA3MCwgMHgwM0YyLCAweDcwNzEsIDB4MTgwQSwKLSAgICAweDcwNzQsIDB4MThDMywgMHg3MDc2LCAweDA0RTYsIDB4NzA3OCwgMHgwNEU5LCAweDcwN0EsIDB4MThDNCwKLSAgICAweDcwN0MsIDB4MDRFNywgMHg3MDdELCAweDA0RTgsIDB4NzA4MiwgMHgxOUY3LCAweDcwODMsIDB4MTlGOSwKLSAgICAweDcwODQsIDB4MTlGNCwgMHg3MDg1LCAweDE5RjEsIDB4NzA4NiwgMHgxOUYzLCAweDcwOEEsIDB4MDY0MywKLSAgICAweDcwOEUsIDB4MDY0MSwgMHg3MDkxLCAweDE5RjUsIDB4NzA5MiwgMHgwNjQyLCAweDcwOTMsIDB4MTlGMiwKLSAgICAweDcwOTQsIDB4MTlFRiwgMHg3MDk1LCAweDA2NDAsIDB4NzA5NiwgMHgxOUY2LCAweDcwOTgsIDB4MTlGMCwKLSAgICAweDcwOTksIDB4MDY0NCwgMHg3MDlBLCAweDE5RjgsIDB4NzA5RiwgMHgxQjY2LCAweDcwQTEsIDB4MUI2QSwKLSAgICAweDcwQTQsIDB4MDc5MCwgMHg3MEE5LCAweDFCNkQsIDB4NzBBQiwgMHgwNzg4LCAweDcwQUMsIDB4MDc4QiwKLSAgICAweDcwQUQsIDB4MDc4RCwgMHg3MEFFLCAweDA3OEYsIDB4NzBBRiwgMHgwNzhDLCAweDcwQjAsIDB4MUI2OSwKLSAgICAweDcwQjEsIDB4MUI2OCwgMHg3MEIzLCAweDA3OEEsIDB4NzBCNCwgMHgxQjZCLCAweDcwQjUsIDB4MUI2QywKLSAgICAweDcwQjcsIDB4MUI2NSwgMHg3MEI4LCAweDA3OEUsIDB4NzBCQSwgMHgwNzg5LCAweDcwQkUsIDB4MUI2NywKLSAgICAweDcwQzUsIDB4MUQyNywgMHg3MEM2LCAweDFEMjgsIDB4NzBDNywgMHgxRDI5LCAweDcwQzgsIDB4MDkyMSwKLSAgICAweDcwQ0EsIDB4MDkxRCwgMHg3MENCLCAweDFEMUUsIDB4NzBDRCwgMHgxRDI2LCAweDcwQ0UsIDB4MUQyQiwKLSAgICAweDcwQ0YsIDB4MDkyMiwgMHg3MEQxLCAweDFEMUMsIDB4NzBEMiwgMHgxRDIyLCAweDcwRDMsIDB4MUQxQiwKLSAgICAweDcwRDQsIDB4MUQyNSwgMHg3MEQ3LCAweDFEMjEsIDB4NzBEOCwgMHgwOTFFLCAweDcwRDksIDB4MDkyMCwKLSAgICAweDcwREEsIDB4MUQyQSwgMHg3MERDLCAweDFEMUEsIDB4NzBERCwgMHgxRDFELCAweDcwREUsIDB4MUQyMywKLSAgICAweDcwRTAsIDB4MUQyNCwgMHg3MEUxLCAweDFEMkMsIDB4NzBFMiwgMHgxRDIwLCAweDcwRTQsIDB4MDkxRiwKLSAgICAweDcwRUYsIDB4MEIxNiwgMHg3MEYwLCAweDFGNzIsIDB4NzBGMywgMHgxRjc0LCAweDcwRjQsIDB4MUY3MCwKLSAgICAweDcwRjYsIDB4MUY3QywgMHg3MEY3LCAweDFGNkUsIDB4NzBGOCwgMHgxRjdCLCAweDcwRjksIDB4MEIxMiwKLSAgICAweDcwRkEsIDB4MUY2QywgMHg3MEZCLCAweDIxRjIsIDB4NzBGQywgMHgxRjc2LCAweDcwRkQsIDB4MEIxNSwKLSAgICAweDcwRkYsIDB4MUY3NywgMHg3MTAwLCAweDFGN0EsIDB4NzEwMiwgMHgxRjdFLCAweDcxMDQsIDB4MUY3MywKLSAgICAweDcxMDYsIDB4MUY3OCwgMHg3MTA5LCAweDBCMTMsIDB4NzEwQSwgMHgwQjE0LCAweDcxMEIsIDB4MUY3RCwKLSAgICAweDcxMEMsIDB4MUY3MSwgMHg3MTBELCAweDFGNkQsIDB4NzEwRSwgMHgxRjdGLCAweDcxMTAsIDB4MUY3NSwKLSAgICAweDcxMTMsIDB4MUY3OSwgMHg3MTE3LCAweDFGNkYsIDB4NzExOSwgMHgwQ0M4LCAweDcxMUEsIDB4MENDOSwKLSAgICAweDcxMUIsIDB4MjFGQywgMHg3MTFDLCAweDBDQ0YsIDB4NzExRSwgMHgyMUYwLCAweDcxMUYsIDB4MjFGOSwKLSAgICAweDcxMjAsIDB4MjFFRiwgMHg3MTIxLCAweDBDQ0MsIDB4NzEyMiwgMHgyMUY3LCAweDcxMjMsIDB4MjFGNSwKLSAgICAweDcxMjUsIDB4MjFGNiwgMHg3MTI2LCAweDBDQ0EsIDB4NzEyOCwgMHgyMUZBLCAweDcxMkUsIDB4MjFGMywKLSAgICAweDcxMkYsIDB4MjFGMSwgMHg3MTMwLCAweDBDQ0IsIDB4NzEzMSwgMHgyMUY0LCAweDcxMzIsIDB4MjFGOCwKLSAgICAweDcxMzYsIDB4MENDRCwgMHg3MTNBLCAweDIxRkIsIDB4NzE0MSwgMHgyNDdCLCAweDcxNDIsIDB4MjQ4MiwKLSAgICAweDcxNDMsIDB4MjQ4NCwgMHg3MTQ0LCAweDI0OEEsIDB4NzE0NiwgMHgwRTcyLCAweDcxNDcsIDB4MjQ3NiwKLSAgICAweDcxNDksIDB4MEU2QSwgMHg3MTRCLCAweDI0ODUsIDB4NzE0QywgMHgwRTZGLCAweDcxNEQsIDB4MjQ4QiwKLSAgICAweDcxNEUsIDB4MEU2NiwgMHg3MTUwLCAweDI0ODgsIDB4NzE1MiwgMHgyNDc4LCAweDcxNTMsIDB4MjQ4OSwKLSAgICAweDcxNTQsIDB4MjQ3NywgMHg3MTU2LCAweDBFNzQsIDB4NzE1OCwgMHgyNDgzLCAweDcxNTksIDB4MEU2NywKLSAgICAweDcxNUEsIDB4MjQ4QywgMHg3MTVDLCAweDBFNkMsIDB4NzE1RCwgMHgyNDdDLCAweDcxNUUsIDB4MEU3MSwKLSAgICAweDcxNUYsIDB4MjQ4NywgMHg3MTYwLCAweDI0N0EsIDB4NzE2MSwgMHgyNDgxLCAweDcxNjIsIDB4MjQ3RCwKLSAgICAweDcxNjMsIDB4MjQ3OSwgMHg3MTY0LCAweDBFNjksIDB4NzE2NSwgMHgwRTcwLCAweDcxNjYsIDB4MEU2RSwKLSAgICAweDcxNjcsIDB4MEU2QiwgMHg3MTY4LCAweDBFNzMsIDB4NzE2OSwgMHgwRTY4LCAweDcxNkEsIDB4MjQ4MCwKLSAgICAweDcxNkMsIDB4MEU2RCwgMHg3MTZFLCAweDBDQ0UsIDB4NzE3MCwgMHgyNDg2LCAweDcxNzIsIDB4MjQ3RSwKLSAgICAweDcxNzgsIDB4MjQ3RiwgMHg3MTdCLCAweDI3MUUsIDB4NzE3RCwgMHgxMDIzLCAweDcxODAsIDB4MjcxQSwKLSAgICAweDcxODEsIDB4MjcyMCwgMHg3MTgyLCAweDI3MUMsIDB4NzE4NCwgMHgxMDI1LCAweDcxODUsIDB4MjcxQiwKLSAgICAweDcxODYsIDB4MjcxRiwgMHg3MTg3LCAweDI3MTcsIDB4NzE4OSwgMHgyNzE5LCAweDcxOEEsIDB4MTAyNCwKLSAgICAweDcxOEYsIDB4MjcxRCwgMHg3MTkwLCAweDI3MTgsIDB4NzE5MiwgMHgxMDI2LCAweDcxOTQsIDB4MTAyMSwKLSAgICAweDcxOTcsIDB4MjcyMSwgMHg3MTk5LCAweDEwMjIsIDB4NzE5QSwgMHgyOTVBLCAweDcxOUIsIDB4Mjk1NywKLSAgICAweDcxOUMsIDB4Mjk2MywgMHg3MTlELCAweDI5NUQsIDB4NzE5RSwgMHgyOTVGLCAweDcxOUYsIDB4MTE5RSwKLSAgICAweDcxQTAsIDB4Mjk1OSwgMHg3MUExLCAweDI5NjEsIDB4NzFBNCwgMHgyOTYwLCAweDcxQTUsIDB4Mjk1RSwKLSAgICAweDcxQTcsIDB4Mjk2NCwgMHg3MUE4LCAweDExQTEsIDB4NzFBOSwgMHgyOTVCLCAweDcxQUEsIDB4Mjk2MiwKLSAgICAweDcxQUMsIDB4MTE5RiwgMHg3MUFGLCAweDI5NTYsIDB4NzFCMCwgMHgyOTU4LCAweDcxQjEsIDB4MTFBMCwKLSAgICAweDcxQjIsIDB4Mjk1NSwgMHg3MUIzLCAweDI5NjUsIDB4NzFCNSwgMHgyOTVDLCAweDcxQjgsIDB4MkJCMywKLSAgICAweDcxQjksIDB4MTJGMywgMHg3MUJDLCAweDJCQkUsIDB4NzFCRCwgMHgyQkJDLCAweDcxQkUsIDB4MTJFRCwKLSAgICAweDcxQkYsIDB4MkJCMiwgMHg3MUMwLCAweDJCQjUsIDB4NzFDMSwgMHgyQkI2LCAweDcxQzIsIDB4MkJCMSwKLSAgICAweDcxQzMsIDB4MTJGNywgMHg3MUM0LCAweDEyRjgsIDB4NzFDNSwgMHgyQkIwLCAweDcxQzYsIDB4MkJCRiwKLSAgICAweDcxQzcsIDB4MkJCQSwgMHg3MUM4LCAweDEyRjEsIDB4NzFDOSwgMHgxMkVFLCAweDcxQ0EsIDB4MkJCOSwKLSAgICAweDcxQ0IsIDB4MkJCNywgMHg3MUNFLCAweDEyRjQsIDB4NzFDRiwgMHgyQkJCLCAweDcxRDAsIDB4MTJFRiwKLSAgICAweDcxRDIsIDB4MTJGMCwgMHg3MUQ0LCAweDJCQjgsIDB4NzFENSwgMHgxMkYyLCAweDcxRDYsIDB4MkJCNCwKLSAgICAweDcxRDgsIDB4MkJCRCwgMHg3MUQ5LCAweDEyRjUsIDB4NzFEQSwgMHgyQkMwLCAweDcxREIsIDB4MkJDMSwKLSAgICAweDcxREMsIDB4MTJGNiwgMHg3MURGLCAweDE0MDQsIDB4NzFFMCwgMHgxNDBCLCAweDcxRTEsIDB4MkQ5QiwKLSAgICAweDcxRTIsIDB4MkRBMSwgMHg3MUU0LCAweDJEOUYsIDB4NzFFNSwgMHgxNDA3LCAweDcxRTYsIDB4MTQwNiwKLSAgICAweDcxRTcsIDB4MTQwMywgMHg3MUU4LCAweDJEOUQsIDB4NzFFQywgMHgxNDA5LCAweDcxRUQsIDB4MTQwOCwKLSAgICAweDcxRUUsIDB4MTQwNSwgMHg3MUYwLCAweDJEQTAsIDB4NzFGMSwgMHgyRDlDLCAweDcxRjIsIDB4MkQ5RSwKLSAgICAweDcxRjQsIDB4MTQwQSwgMHg3MUY4LCAweDE0RjEsIDB4NzFGOSwgMHgyRjUyLCAweDcxRkIsIDB4MTRFRSwKLSAgICAweDcxRkMsIDB4MTRFRiwgMHg3MUZELCAweDJGNTQsIDB4NzFGRSwgMHgxNEYwLCAweDcxRkYsIDB4MkY1MSwKLSAgICAweDcyMDEsIDB4MkY1MCwgMHg3MjAyLCAweDMwQjksIDB4NzIwMywgMHgyRjUzLCAweDcyMDUsIDB4MzBCQSwKLSAgICAweDcyMDYsIDB4MTU5MSwgMHg3MjA3LCAweDMwQjgsIDB4NzIwQSwgMHgzMEI3LCAweDcyMEMsIDB4MzBCNiwKLSAgICAweDcyMEQsIDB4MTU5MiwgMHg3MjEwLCAweDE2MUYsIDB4NzIxMywgMHgzMUY0LCAweDcyMTQsIDB4MzFGNSwKLSAgICAweDcyMTksIDB4MzJFMSwgMHg3MjFBLCAweDMyRTAsIDB4NzIxQiwgMHgxNjdCLCAweDcyMUQsIDB4MzJERiwKLSAgICAweDcyMUUsIDB4MzM4RCwgMHg3MjFGLCAweDMzOEUsIDB4NzIyMiwgMHgzNDI0LCAweDcyMjMsIDB4MzQ4QywKLSAgICAweDcyMjYsIDB4MzREMSwgMHg3MjI3LCAweDM1MzUsIDB4NzIyOCwgMHgxNzY2LCAweDcyMjksIDB4MzU0OSwKLSAgICAweDcyMkEsIDB4MDJFNywgMHg3MjJDLCAweDA2NDUsIDB4NzIyRCwgMHgwNjQ2LCAweDcyMzAsIDB4MDc5MSwKLSAgICAweDcyMzUsIDB4MTQwQywgMHg3MjM2LCAweDAyRTgsIDB4NzIzOCwgMHgwNjQ3LCAweDcyMzksIDB4MDkyMywKLSAgICAweDcyM0EsIDB4MEU3NSwgMHg3MjNCLCAweDAyRTksIDB4NzIzRCwgMHgwQjE3LCAweDcyM0UsIDB4MTAyNywKLSAgICAweDcyM0YsIDB4MTc4RCwgMHg3MjQxLCAweDFCNkUsIDB4NzI0MiwgMHgxRDJELCAweDcyNDQsIDB4MjcyMiwKLSAgICAweDcyNDYsIDB4MTQwRCwgMHg3MjQ3LCAweDAyRUEsIDB4NzI0OCwgMHgwNjQ4LCAweDcyNDksIDB4MUI2RiwKLSAgICAweDcyNEEsIDB4MUI3MCwgMHg3MjRCLCAweDIxRkQsIDB4NzI0QywgMHgwQ0QwLCAweDcyNEYsIDB4MjQ4RCwKLSAgICAweDcyNTIsIDB4MEU3NiwgMHg3MjUzLCAweDI3MjMsIDB4NzI1NiwgMHgxMUEyLCAweDcyNTgsIDB4MTU5MywKLSAgICAweDcyNTksIDB4MDJFQiwgMHg3MjVBLCAweDIxRkUsIDB4NzI1QiwgMHgwMkVDLCAweDcyNUQsIDB4MDNGNCwKLSAgICAweDcyNUUsIDB4MTgwQiwgMHg3MjVGLCAweDAzRjMsIDB4NzI2MCwgMHgwNEVDLCAweDcyNjEsIDB4MDRFQiwKLSAgICAweDcyNjIsIDB4MDRFQSwgMHg3MjYzLCAweDE4QzUsIDB4NzI2NywgMHgwNjQ5LCAweDcyNjksIDB4MDY0QSwKLSAgICAweDcyNkEsIDB4MTlGQSwgMHg3MjZDLCAweDFCNzEsIDB4NzI2RSwgMHgxQjc0LCAweDcyNkYsIDB4MDc5MywKLSAgICAweDcyNzAsIDB4MUI3MiwgMHg3MjcyLCAweDA3OTIsIDB4NzI3MywgMHgxQjczLCAweDcyNzQsIDB4MDc5NCwKLSAgICAweDcyNzYsIDB4MUQzMCwgMHg3Mjc3LCAweDFEMkYsIDB4NzI3OCwgMHgxRDJFLCAweDcyNzksIDB4MDkyNCwKLSAgICAweDcyN0IsIDB4MUY4MSwgMHg3MjdDLCAweDFGODIsIDB4NzI3RCwgMHgwQjE4LCAweDcyN0UsIDB4MUY4MCwKLSAgICAweDcyN0YsIDB4MUY4MywgMHg3MjgwLCAweDBDRDIsIDB4NzI4MSwgMHgwQjE5LCAweDcyODQsIDB4MENEMSwKLSAgICAweDcyODUsIDB4MjIwMiwgMHg3Mjg2LCAweDIyMDEsIDB4NzI4OCwgMHgyMUZGLCAweDcyODksIDB4MjIwMCwKLSAgICAweDcyOEIsIDB4MjIwMywgMHg3MjhDLCAweDI0OEYsIDB4NzI4RCwgMHgyNDhFLCAweDcyOEUsIDB4MjQ5MiwKLSAgICAweDcyOTAsIDB4MjQ5MSwgMHg3MjkxLCAweDI0OTAsIDB4NzI5MiwgMHgxMDI4LCAweDcyOTMsIDB4MjcyNiwKLSAgICAweDcyOTUsIDB4MjcyNSwgMHg3Mjk2LCAweDEwMjksIDB4NzI5NywgMHgyNzI0LCAweDcyOTgsIDB4Mjk2NiwKLSAgICAweDcyOUEsIDB4Mjk2NywgMHg3MjlCLCAweDExQTMsIDB4NzI5RCwgMHgyQkMyLCAweDcyOUUsIDB4MkJDMywKLSAgICAweDcyQTEsIDB4MzBCRiwgMHg3MkEyLCAweDE1OTQsIDB4NzJBMywgMHgzMEJFLCAweDcyQTQsIDB4MzBCRCwKLSAgICAweDcyQTUsIDB4MzBCQiwgMHg3MkE2LCAweDMwQkMsIDB4NzJBNywgMHgxNjdDLCAweDcyQTgsIDB4MzFGNiwKLSAgICAweDcyQTksIDB4MzM4RiwgMHg3MkFBLCAweDM0RDIsIDB4NzJBQywgMHgwMkVELCAweDcyQUUsIDB4MTdBRiwKLSAgICAweDcyQUYsIDB4MDM1NSwgMHg3MkIwLCAweDE3QjAsIDB4NzJCNCwgMHgxODBDLCAweDcyQjUsIDB4MTgwRCwKLSAgICAweDcyQkEsIDB4MThDQiwgMHg3MkJELCAweDE4QzcsIDB4NzJCRiwgMHgxOEM2LCAweDcyQzAsIDB4MDY0QiwKLSAgICAweDcyQzEsIDB4MThDQSwgMHg3MkMyLCAweDA0RUUsIDB4NzJDMywgMHgxOEM4LCAweDcyQzQsIDB4MDRFRCwKLSAgICAweDcyQzUsIDB4MThDQywgMHg3MkM2LCAweDE4QzksIDB4NzJDOSwgMHgxOUZFLCAweDcyQ0EsIDB4MUI3NSwKLSAgICAweDcyQ0IsIDB4MTlGQywgMHg3MkNDLCAweDFBMDMsIDB4NzJDRSwgMHgwNjRDLCAweDcyRDAsIDB4MDY0RiwKLSAgICAweDcyRDEsIDB4MUEwNCwgMHg3MkQyLCAweDFBMDAsIDB4NzJENCwgMHgxQTAxLCAweDcyRDYsIDB4MTlGQiwKLSAgICAweDcyRDcsIDB4MDY0RSwgMHg3MkQ4LCAweDE5RkQsIDB4NzJEOSwgMHgwNjRELCAweDcyREEsIDB4MUEwMiwKLSAgICAweDcyREMsIDB4MTlGRiwgMHg3MkRGLCAweDFCNzksIDB4NzJFMCwgMHgwNzk2LCAweDcyRTEsIDB4MDc5NywKLSAgICAweDcyRTMsIDB4MUI3QywgMHg3MkU0LCAweDFCNzYsIDB4NzJFNiwgMHgxQjdCLCAweDcyRTgsIDB4MUI3NywKLSAgICAweDcyRTksIDB4MDc5NSwgMHg3MkVBLCAweDFCN0EsIDB4NzJFQiwgMHgxQjc4LCAweDcyRjMsIDB4MUQzNiwKLSAgICAweDcyRjQsIDB4MUQzMywgMHg3MkY2LCAweDFEMzUsIDB4NzJGNywgMHgwOTI5LCAweDcyRjgsIDB4MDkyOCwKLSAgICAweDcyRjksIDB4MDkyNiwgMHg3MkZBLCAweDFEMzIsIDB4NzJGQiwgMHgxRDM3LCAweDcyRkMsIDB4MDkyNSwKLSAgICAweDcyRkQsIDB4MDkyNywgMHg3MkZFLCAweDFEMzQsIDB4NzJGRiwgMHgxRjhCLCAweDczMDAsIDB4MUQzMSwKLSAgICAweDczMDEsIDB4MUQzOCwgMHg3MzA3LCAweDFGODYsIDB4NzMwOCwgMHgxRjhBLCAweDczMEEsIDB4MUY4OSwKLSAgICAweDczMEIsIDB4MjIwNSwgMHg3MzBDLCAweDIyMTAsIDB4NzMwRiwgMHgxRjhDLCAweDczMTEsIDB4MUY4NywKLSAgICAweDczMTIsIDB4MjIwNCwgMHg3MzEzLCAweDBCMUQsIDB4NzMxNiwgMHgwQjFDLCAweDczMTcsIDB4MUY4NSwKLSAgICAweDczMTgsIDB4MUY4OCwgMHg3MzE5LCAweDBCMUUsIDB4NzMxQiwgMHgwQjFCLCAweDczMUMsIDB4MEIxQSwKLSAgICAweDczMUQsIDB4MUY4NCwgMHg3MzFFLCAweDFGOEQsIDB4NzMyMiwgMHgyMjA3LCAweDczMjMsIDB4MjIwRSwKLSAgICAweDczMjUsIDB4MENENCwgMHg3MzI2LCAweDIyMEQsIDB4NzMyNywgMHgyMjBBLCAweDczMjksIDB4MENENiwKLSAgICAweDczMkQsIDB4MjIwQywgMHg3MzMwLCAweDIyMDYsIDB4NzMzMSwgMHgyMjA4LCAweDczMzIsIDB4MjIwQiwKLSAgICAweDczMzMsIDB4MjIwOSwgMHg3MzM0LCAweDBDRDUsIDB4NzMzNSwgMHgyMjBGLCAweDczMzYsIDB4MENEMywKLSAgICAweDczMzcsIDB4MEU3NywgMHg3MzNBLCAweDI0OTYsIDB4NzMzQiwgMHgyNDk1LCAweDczM0MsIDB4MjQ5MywKLSAgICAweDczM0UsIDB4MEU3QSwgMHg3MzNGLCAweDBFNzksIDB4NzM0MCwgMHgyNDk3LCAweDczNDIsIDB4MjQ5NCwKLSAgICAweDczNDMsIDB4MjcyNywgMHg3MzQ0LCAweDEwMkEsIDB4NzM0NSwgMHgwRTc4LCAweDczNDksIDB4MjQ5OSwKLSAgICAweDczNEEsIDB4MjQ5OCwgMHg3MzRDLCAweDI3MkEsIDB4NzM0RCwgMHgyNzI4LCAweDczNEUsIDB4MTFBNCwKLSAgICAweDczNTAsIDB4MTAyQiwgMHg3MzUxLCAweDI3MjksIDB4NzM1MiwgMHgyOTY5LCAweDczNTcsIDB4MTFBNSwKLSAgICAweDczNTgsIDB4Mjk2OCwgMHg3MzU5LCAweDI5NzEsIDB4NzM1QSwgMHgyOTcwLCAweDczNUIsIDB4Mjk2RSwKLSAgICAweDczNUQsIDB4Mjk2RCwgMHg3MzVFLCAweDI5NkEsIDB4NzM1RiwgMHgyOTZCLCAweDczNjAsIDB4Mjk2QywKLSAgICAweDczNjEsIDB4Mjk2RiwgMHg3MzYyLCAweDI5NzIsIDB4NzM2NSwgMHgyQkM4LCAweDczNjYsIDB4MkJDNSwKLSAgICAweDczNjcsIDB4MkJDNiwgMHg3MzY4LCAweDEyRjksIDB4NzM2OSwgMHgyQkM0LCAweDczNkEsIDB4MkJDQSwKLSAgICAweDczNkIsIDB4MkJDOSwgMHg3MzZDLCAweDJCQzcsIDB4NzM2RSwgMHgyREEzLCAweDczNkYsIDB4MkRBNCwKLSAgICAweDczNzAsIDB4MTQwRSwgMHg3MzcyLCAweDE0MEYsIDB4NzM3MywgMHgyREEyLCAweDczNzUsIDB4MTRGMywKLSAgICAweDczNzYsIDB4MkY1NSwgMHg3Mzc3LCAweDE0RjIsIDB4NzM3OCwgMHgxNTk1LCAweDczN0EsIDB4MTU5NiwKLSAgICAweDczN0IsIDB4MTYyMCwgMHg3MzdDLCAweDMxRjgsIDB4NzM3RCwgMHgzMUY3LCAweDczN0UsIDB4MzJFMiwKLSAgICAweDczN0YsIDB4MzM5MCwgMHg3MzgwLCAweDE2Q0EsIDB4NzM4MSwgMHgzNDI2LCAweDczODIsIDB4MzQyNSwKLSAgICAweDczODMsIDB4MzQyNywgMHg3Mzg0LCAweDAzNTYsIDB4NzM4NSwgMHgxQjdELCAweDczODYsIDB4MDkyQSwKLSAgICAweDczODcsIDB4MEIxRiwgMHg3Mzg4LCAweDFGOEUsIDB4NzM4OSwgMHgwMzU3LCAweDczOEEsIDB4MTdCMSwKLSAgICAweDczOEIsIDB4MDJFRSwgMHg3MzhFLCAweDE4MEUsIDB4NzM5MiwgMHgxOEQxLCAweDczOTMsIDB4MThDRiwKLSAgICAweDczOTQsIDB4MThEMCwgMHg3Mzk1LCAweDE4Q0QsIDB4NzM5NiwgMHgwNEVGLCAweDczOTcsIDB4MThDRSwKLSAgICAweDczOUQsIDB4MUEwQywgMHg3MzlGLCAweDA2NTIsIDB4NzNBMCwgMHgxQTBBLCAweDczQTEsIDB4MUEwNiwKLSAgICAweDczQTIsIDB4MUEwOSwgMHg3M0E0LCAweDFBMDUsIDB4NzNBNSwgMHgwNjU0LCAweDczQTYsIDB4MUEwOCwKLSAgICAweDczQTgsIDB4MDY1MSwgMHg3M0E5LCAweDA2NTAsIDB4NzNBQiwgMHgwNjUzLCAweDczQUMsIDB4MUEwQiwKLSAgICAweDczQUQsIDB4MUEwNywgMHg3M0IyLCAweDA3OUIsIDB4NzNCMywgMHgwNzlFLCAweDczQjQsIDB4MUI4NSwKLSAgICAweDczQjUsIDB4MUI4NCwgMHg3M0I2LCAweDFCODMsIDB4NzNCNywgMHgwNzk4LCAweDczQjgsIDB4MUI4QywKLSAgICAweDczQjksIDB4MUI4MiwgMHg3M0JCLCAweDA3OUEsIDB4NzNCQywgMHgxRDNELCAweDczQkUsIDB4MUI4OSwKLSAgICAweDczQkYsIDB4MUI4NywgMHg3M0MwLCAweDA3OUQsIDB4NzNDMiwgMHgxQjdGLCAweDczQzMsIDB4MUI4QSwKLSAgICAweDczQzUsIDB4MUI4MSwgMHg3M0M2LCAweDFCOEIsIDB4NzNDNywgMHgxQjg4LCAweDczQzgsIDB4MUI4MCwKLSAgICAweDczQ0EsIDB4MDc5OSwgMHg3M0NCLCAweDFCOEQsIDB4NzNDQywgMHgxQjdFLCAweDczQ0QsIDB4MDc5QywKLSAgICAweDczRDIsIDB4MUQ0MiwgMHg3M0QzLCAweDFEMzksIDB4NzNENCwgMHgxRDQ0LCAweDczRDYsIDB4MUQzQywKLSAgICAweDczRDcsIDB4MUQ0NywgMHg3M0Q4LCAweDFENDgsIDB4NzNEOSwgMHgxRDNBLCAweDczREEsIDB4MUQ0NiwKLSAgICAweDczREIsIDB4MUQ0MywgMHg3M0RDLCAweDFENDEsIDB4NzNERCwgMHgxRDQ1LCAweDczREUsIDB4MDkzMCwKLSAgICAweDczRTAsIDB4MDkyRSwgMHg3M0UzLCAweDFEM0YsIDB4NzNFNSwgMHgxRDNCLCAweDczRTcsIDB4MUQzRSwKLSAgICAweDczRTgsIDB4MUQ0OSwgMHg3M0U5LCAweDFENDAsIDB4NzNFQSwgMHgwOTJGLCAweDczRUIsIDB4MUI4NiwKLSAgICAweDczRUQsIDB4MDkyQiwgMHg3M0VFLCAweDA5MkQsIDB4NzNGNCwgMHgxRjlDLCAweDczRjUsIDB4MUY5MSwKLSAgICAweDczRjYsIDB4MUY4RiwgMHg3M0Y4LCAweDFGOTAsIDB4NzNGQSwgMHgxRjk3LCAweDczRkMsIDB4MUY5OCwKLSAgICAweDczRkQsIDB4MUY5NCwgMHg3M0ZFLCAweDBCMjQsIDB4NzNGRiwgMHgxRjk5LCAweDc0MDAsIDB4MUY5NiwKLSAgICAweDc0MDEsIDB4MUY5MywgMHg3NDAzLCAweDBCMjIsIDB4NzQwNCwgMHgxRjkyLCAweDc0MDUsIDB4MEIyMCwKLSAgICAweDc0MDYsIDB4MEIyMywgMHg3NDA3LCAweDFGOTUsIDB4NzQwOCwgMHgxRjlELCAweDc0MDksIDB4MDkyQywKLSAgICAweDc0MEEsIDB4MEIyMSwgMHg3NDBCLCAweDFGOUIsIDB4NzQwQywgMHgxRjlBLCAweDc0MEQsIDB4MEIyNSwKLSAgICAweDc0MTYsIDB4MjIxNSwgMHg3NDFBLCAweDIyMTYsIDB4NzQxQiwgMHgwQ0UwLCAweDc0MUQsIDB4MjIxQywKLSAgICAweDc0MjAsIDB4MjIxRSwgMHg3NDIxLCAweDIyMTcsIDB4NzQyMiwgMHgwQ0RBLCAweDc0MjMsIDB4MjIxQiwKLSAgICAweDc0MjQsIDB4MjIxQSwgMHg3NDI1LCAweDBDREIsIDB4NzQyNiwgMHgwQ0UxLCAweDc0MjgsIDB4MENFMiwKLSAgICAweDc0MjksIDB4MjIxRCwgMHg3NDJBLCAweDBDRDgsIDB4NzQyQiwgMHgyMjE0LCAweDc0MkMsIDB4MjIxMiwKLSAgICAweDc0MkQsIDB4MjIxOCwgMHg3NDJFLCAweDIyMTEsIDB4NzQyRiwgMHgwQ0RGLCAweDc0MzAsIDB4MjIxMywKLSAgICAweDc0MzEsIDB4MjIxOSwgMHg3NDMyLCAweDIyMUYsIDB4NzQzMywgMHgwQ0Q5LCAweDc0MzQsIDB4MENERSwKLSAgICAweDc0MzUsIDB4MENEQywgMHg3NDM2LCAweDBDREQsIDB4NzQzQSwgMHgwQ0Q3LCAweDc0M0YsIDB4MEU4MSwKLSAgICAweDc0NDAsIDB4MjRBMCwgMHg3NDQxLCAweDBFODAsIDB4NzQ0MiwgMHgyNEE0LCAweDc0NDQsIDB4MjQ5QSwKLSAgICAweDc0NDYsIDB4MjRBNSwgMHg3NDRBLCAweDI0OUIsIDB4NzQ0QiwgMHgyNDlDLCAweDc0NEQsIDB4MjRBNiwKLSAgICAweDc0NEUsIDB4MjRBMywgMHg3NDRGLCAweDI0QTEsIDB4NzQ1MCwgMHgyNEEyLCAweDc0NTEsIDB4MjQ5RSwKLSAgICAweDc0NTIsIDB4MjQ5RCwgMHg3NDU0LCAweDI0QTcsIDB4NzQ1NSwgMHgwRTdELCAweDc0NTcsIDB4MjQ5RiwKLSAgICAweDc0NTksIDB4MEU4MiwgMHg3NDVBLCAweDBFN0MsIDB4NzQ1QiwgMHgwRTgzLCAweDc0NUMsIDB4MEU4NCwKLSAgICAweDc0NUUsIDB4MEU3RiwgMHg3NDVGLCAweDBFN0UsIDB4NzQ2MiwgMHgyNzJCLCAweDc0NjMsIDB4MTAyRCwKLSAgICAweDc0NjQsIDB4MTAyQywgMHg3NDY3LCAweDI3MzAsIDB4NzQ2OSwgMHgxMUE2LCAweDc0NkEsIDB4MTAyRSwKLSAgICAweDc0NkQsIDB4MTAzMCwgMHg3NDZFLCAweDI3MzEsIDB4NzQ2RiwgMHgwRTdCLCAweDc0NzAsIDB4MTAyRiwKLSAgICAweDc0NzEsIDB4MjcyRCwgMHg3NDcyLCAweDI3MkYsIDB4NzQ3MywgMHgyNzJDLCAweDc0NzUsIDB4MjcyRSwKLSAgICAweDc0NzksIDB4Mjk3QywgMHg3NDdDLCAweDI5N0IsIDB4NzQ3RCwgMHgyOTc4LCAweDc0N0UsIDB4MTFBOSwKLSAgICAweDc0N0YsIDB4MkJDQiwgMHg3NDgwLCAweDExQUEsIDB4NzQ4MSwgMHgyOTc3LCAweDc0ODMsIDB4MTFBOCwKLSAgICAweDc0ODUsIDB4Mjk3OSwgMHg3NDg2LCAweDI5NzYsIDB4NzQ4NywgMHgyOTczLCAweDc0ODgsIDB4Mjk3QSwKLSAgICAweDc0ODksIDB4Mjk3NCwgMHg3NDhBLCAweDI5NzUsIDB4NzQ4QiwgMHgxMUE3LCAweDc0OTAsIDB4MkRBOCwKLSAgICAweDc0OTIsIDB4MkJDRiwgMHg3NDk0LCAweDJCQ0UsIDB4NzQ5NSwgMHgyQkQwLCAweDc0OTcsIDB4MkRBNSwKLSAgICAweDc0OTgsIDB4MTJGQywgMHg3NDlBLCAweDJCQ0MsIDB4NzQ5QywgMHgxMkZBLCAweDc0OUUsIDB4MTJGRSwKLSAgICAweDc0OUYsIDB4MTJGRCwgMHg3NEEwLCAweDJCQ0QsIDB4NzRBMSwgMHgyQkQxLCAweDc0QTMsIDB4MTJGQiwKLSAgICAweDc0QTUsIDB4MkRBQywgMHg3NEE2LCAweDE0MTIsIDB4NzRBNywgMHgxNEY0LCAweDc0QTgsIDB4MTQxMywKLSAgICAweDc0QTksIDB4MTQxMCwgMHg3NEFBLCAweDJEQTksIDB4NzRBQiwgMHgyREE3LCAweDc0QUQsIDB4MkRBQSwKLSAgICAweDc0QUYsIDB4MkRBRCwgMHg3NEIwLCAweDE0MTEsIDB4NzRCMSwgMHgyREFCLCAweDc0QjIsIDB4MkRBNiwKLSAgICAweDc0QjUsIDB4MkY1OCwgMHg3NEI2LCAweDJGNUIsIDB4NzRCNywgMHgzMEMyLCAweDc0QjgsIDB4MkY1NiwKLSAgICAweDc0QkEsIDB4MzFGOSwgMHg3NEJCLCAweDJGNUMsIDB4NzRCRCwgMHgxNTk3LCAweDc0QkUsIDB4MkY1QSwKLSAgICAweDc0QkYsIDB4MTRGNSwgMHg3NEMwLCAweDJGNTcsIDB4NzRDMSwgMHgyRjU5LCAweDc0QzIsIDB4MkY1RCwKLSAgICAweDc0QzMsIDB4MzBDMywgMHg3NEM1LCAweDMwQzEsIDB4NzRDQSwgMHgxNTk4LCAweDc0Q0IsIDB4MzBDMCwKLSAgICAweDc0Q0YsIDB4MTYyMSwgMHg3NEQ0LCAweDE2N0UsIDB4NzRENSwgMHgzMzkyLCAweDc0RDYsIDB4MTY3RCwKLSAgICAweDc0RDcsIDB4MzM5NCwgMHg3NEQ4LCAweDMzOTEsIDB4NzREOSwgMHgzMzkzLCAweDc0REEsIDB4MTZGRSwKLSAgICAweDc0REIsIDB4MzQ4RCwgMHg3NERDLCAweDAzNTgsIDB4NzRERCwgMHgxQTBELCAweDc0REUsIDB4MUQ0QSwKLSAgICAweDc0REYsIDB4MUQ0QiwgMHg3NEUwLCAweDBCMjYsIDB4NzRFMSwgMHgyNEE4LCAweDc0RTIsIDB4MTJGRiwKLSAgICAweDc0RTMsIDB4MTU5OSwgMHg3NEU0LCAweDE2Q0IsIDB4NzRFNSwgMHgzNDhFLCAweDc0RTYsIDB4MDM1OSwKLSAgICAweDc0RTgsIDB4MUEwRSwgMHg3NEU5LCAweDAxMjAsIDB4NzRFQywgMHgxQjhFLCAweDc0RUUsIDB4MUI4RiwKLSAgICAweDc0RjQsIDB4MUQ0QywgMHg3NEY1LCAweDFENEQsIDB4NzRGNiwgMHgwQjI3LCAweDc0RjcsIDB4MEIyOCwKLSAgICAweDc0RkIsIDB4MjIyMCwgMHg3NEZELCAweDI0QUIsIDB4NzRGRSwgMHgyNEFBLCAweDc0RkYsIDB4MjRBOSwKLSAgICAweDc1MDAsIDB4MjczMiwgMHg3NTAyLCAweDI3MzMsIDB4NzUwMywgMHgyNzM0LCAweDc1MDQsIDB4MTAzMSwKLSAgICAweDc1MDcsIDB4Mjk3RSwgMHg3NTA4LCAweDI5N0QsIDB4NzUwQiwgMHgyQkQyLCAweDc1MEMsIDB4MTMwMCwKLSAgICAweDc1MEQsIDB4MTMwMSwgMHg3NTBGLCAweDJEQjEsIDB4NzUxMCwgMHgyREFFLCAweDc1MTEsIDB4MkRBRiwKLSAgICAweDc1MTIsIDB4MkRCMCwgMHg3NTEzLCAweDJGNUYsIDB4NzUxNCwgMHgyRjVFLCAweDc1MTUsIDB4MTRGNiwKLSAgICAweDc1MTYsIDB4MzBDNCwgMHg3NTE3LCAweDMyRTMsIDB4NzUxOCwgMHgwMzVBLCAweDc1MUEsIDB4MDc5RiwKLSAgICAweDc1MUMsIDB4MEIyOSwgMHg3NTFELCAweDI0QUMsIDB4NzUxRiwgMHgwMzVCLCAweDc1MjEsIDB4MUQ0RSwKLSAgICAweDc1MjIsIDB4MEIyQSwgMHg3NTI1LCAweDBDRTMsIDB4NzUyNiwgMHgwQ0U0LCAweDc1MjgsIDB4MDM1QywKLSAgICAweDc1MjksIDB4MDM1RCwgMHg3NTJBLCAweDE4MEYsIDB4NzUyQiwgMHgwNEYxLCAweDc1MkMsIDB4MDRGMCwKLSAgICAweDc1MkQsIDB4MDdBMCwgMHg3NTJFLCAweDFCOTAsIDB4NzUyRiwgMHgyMjIxLCAweDc1MzAsIDB4MDM1RSwKLSAgICAweDc1MzEsIDB4MDM1RiwgMHg3NTMyLCAweDAzNjAsIDB4NzUzMywgMHgwMzYxLCAweDc1MzcsIDB4MDRGMiwKLSAgICAweDc1MzgsIDB4MDRGMywgMHg3NTM5LCAweDE4RDMsIDB4NzUzQSwgMHgxOEQyLCAweDc1M0QsIDB4MDY1NSwKLSAgICAweDc1M0UsIDB4MUExMSwgMHg3NTNGLCAweDFBMEYsIDB4NzU0MCwgMHgxQTEwLCAweDc1NDcsIDB4MUI5MSwKLSAgICAweDc1NDgsIDB4MUI5MiwgMHg3NTRCLCAweDA3QTQsIDB4NzU0QywgMHgwN0EyLCAweDc1NEUsIDB4MDdBMywKLSAgICAweDc1NEYsIDB4MDdBMSwgMHg3NTU0LCAweDA5MzEsIDB4NzU1OSwgMHgwOTM1LCAweDc1NUEsIDB4MDkzNCwKLSAgICAweDc1NUIsIDB4MUQ0RiwgMHg3NTVDLCAweDA5MzMsIDB4NzU1RCwgMHgwOTMyLCAweDc1NUYsIDB4MUQ1MCwKLSAgICAweDc1NjIsIDB4MEIyRCwgMHg3NTYzLCAweDFGOUYsIDB4NzU2NCwgMHgxRjlFLCAweDc1NjUsIDB4MEIyQiwKLSAgICAweDc1NjYsIDB4MEIyQywgMHg3NTZBLCAweDBDRTYsIDB4NzU2QiwgMHgwQ0U1LCAweDc1NkMsIDB4MjIyMywKLSAgICAweDc1NkYsIDB4MjIyMiwgMHg3NTcwLCAweDBCMkUsIDB4NzU3NiwgMHgwRTg1LCAweDc1NzcsIDB4MjRBRSwKLSAgICAweDc1NzgsIDB4MEU4NiwgMHg3NTc5LCAweDI0QUQsIDB4NzU3RCwgMHgyNzM1LCAweDc1N0UsIDB4Mjk3RiwKLSAgICAweDc1N0YsIDB4MTFBQiwgMHg3NTgwLCAweDJCRDMsIDB4NzU4NCwgMHgyREIyLCAweDc1ODYsIDB4MTU5QiwKLSAgICAweDc1ODcsIDB4MTU5QSwgMHg3NThBLCAweDE2Q0MsIDB4NzU4QiwgMHgwMzYyLCAweDc1OEMsIDB4MUExMiwKLSAgICAweDc1OEYsIDB4MEIyRiwgMHg3NTkwLCAweDI3MzYsIDB4NzU5MSwgMHgxMDMyLCAweDc1OTIsIDB4MDIyRSwKLSAgICAweDc1OTQsIDB4MThENCwgMHg3NTk1LCAweDE4RDUsIDB4NzU5OCwgMHgxQTEzLCAweDc1OTksIDB4MDY1NywKLSAgICAweDc1OUEsIDB4MDY1OCwgMHg3NTlELCAweDA2NTYsIDB4NzVBMiwgMHgwN0E4LCAweDc1QTMsIDB4MDdBOSwKLSAgICAweDc1QTQsIDB4MDdBNiwgMHg3NUE1LCAweDA3QTcsIDB4NzVBNywgMHgxQjkzLCAweDc1QUEsIDB4MUI5NCwKLSAgICAweDc1QUIsIDB4MDdBNSwgMHg3NUIwLCAweDFENTEsIDB4NzVCMiwgMHgwOTM5LCAweDc1QjMsIDB4MDkzQSwKLSAgICAweDc1QjUsIDB4MEIzMiwgMHg3NUI2LCAweDFENTcsIDB4NzVCOCwgMHgwOTNGLCAweDc1QjksIDB4MDkzRCwKLSAgICAweDc1QkEsIDB4MUQ1OCwgMHg3NUJCLCAweDFENTMsIDB4NzVCQywgMHgwOTNDLCAweDc1QkQsIDB4MDkzQiwKLSAgICAweDc1QkUsIDB4MDkzNiwgMHg3NUJGLCAweDFENTYsIDB4NzVDMCwgMHgxRDU1LCAweDc1QzEsIDB4MUQ1MiwKLSAgICAweDc1QzIsIDB4MDkzRSwgMHg3NUM0LCAweDFENTQsIDB4NzVDNSwgMHgwOTM3LCAweDc1QzcsIDB4MDkzOCwKLSAgICAweDc1Q0EsIDB4MEIzMywgMHg3NUNCLCAweDFGQTMsIDB4NzVDQywgMHgxRkE0LCAweDc1Q0QsIDB4MEIzNCwKLSAgICAweDc1Q0UsIDB4MUZBMCwgMHg3NUNGLCAweDFGQTIsIDB4NzVEMCwgMHgxRkE2LCAweDc1RDEsIDB4MUZBNSwKLSAgICAweDc1RDIsIDB4MUZBMSwgMHg3NUQ0LCAweDBCMzAsIDB4NzVENSwgMHgwQjMxLCAweDc1RDcsIDB4MjIyQiwKLSAgICAweDc1RDgsIDB4MENFQiwgMHg3NUQ5LCAweDBDRUEsIDB4NzVEQSwgMHgyMjI1LCAweDc1REIsIDB4MENFOCwKLSAgICAweDc1REQsIDB4MjIyOCwgMHg3NURFLCAweDBDRUMsIDB4NzVERiwgMHgyMjI5LCAweDc1RTAsIDB4MENFRCwKLSAgICAweDc1RTEsIDB4MjIyNiwgMHg3NUUyLCAweDBDRTcsIDB4NzVFMywgMHgwQ0U5LCAweDc1RTQsIDB4MjIyQSwKLSAgICAweDc1RTYsIDB4MjIyNywgMHg3NUU3LCAweDIyMjQsIDB4NzVFRCwgMHgyNEJCLCAweDc1RUYsIDB4MjRCMCwKLSAgICAweDc1RjAsIDB4MEU4OCwgMHg3NUYxLCAweDBFOEIsIDB4NzVGMiwgMHgwRThBLCAweDc1RjMsIDB4MEU4RiwKLSAgICAweDc1RjQsIDB4MEU4RSwgMHg3NUY1LCAweDI0QkMsIDB4NzVGNiwgMHgyNEJBLCAweDc1RjcsIDB4MjRCMywKLSAgICAweDc1RjgsIDB4MjRCNywgMHg3NUY5LCAweDI0QjYsIDB4NzVGQSwgMHgwRThDLCAweDc1RkIsIDB4MjRCOSwKLSAgICAweDc1RkMsIDB4MjRCNSwgMHg3NUZELCAweDI0QkQsIDB4NzVGRSwgMHgyNEI0LCAweDc1RkYsIDB4MEU4RCwKLSAgICAweDc2MDAsIDB4MEU4NywgMHg3NjAxLCAweDBFODksIDB4NzYwMywgMHgyNEIyLCAweDc2MDgsIDB4MjczOCwKLSAgICAweDc2MDksIDB4MTAzNiwgMHg3NjBBLCAweDI3M0MsIDB4NzYwQiwgMHgxMDM1LCAweDc2MEMsIDB4MjczOSwKLSAgICAweDc2MEQsIDB4MTAzNCwgMHg3NjBGLCAweDI0QjEsIDB4NzYxMCwgMHgyNEI4LCAweDc2MTEsIDB4MjczQiwKLSAgICAweDc2MTMsIDB4MTAzNywgMHg3NjE0LCAweDI3M0QsIDB4NzYxNSwgMHgyNzNBLCAweDc2MTYsIDB4MjczNywKLSAgICAweDc2MTksIDB4Mjk4MiwgMHg3NjFBLCAweDI5ODYsIDB4NzYxQiwgMHgyOTg4LCAweDc2MUMsIDB4Mjk4NCwKLSAgICAweDc2MUQsIDB4Mjk4MywgMHg3NjFFLCAweDI5ODEsIDB4NzYxRiwgMHgxMUFFLCAweDc2MjAsIDB4MTFBQywKLSAgICAweDc2MjEsIDB4MTFCMSwgMHg3NjIyLCAweDExQjIsIDB4NzYyMywgMHgyOTg1LCAweDc2MjQsIDB4MTFBRiwKLSAgICAweDc2MjUsIDB4Mjk4MCwgMHg3NjI2LCAweDExQjAsIDB4NzYyNywgMHgxMDMzLCAweDc2MjgsIDB4Mjk4NywKLSAgICAweDc2MjksIDB4MTFBRCwgMHg3NjJELCAweDJCRDUsIDB4NzYyRiwgMHgyQkQ0LCAweDc2MzAsIDB4MkJEQywKLSAgICAweDc2MzEsIDB4MkJENiwgMHg3NjMyLCAweDJCREIsIDB4NzYzMywgMHgyQkQ4LCAweDc2MzQsIDB4MTMwMiwKLSAgICAweDc2MzUsIDB4MkJEQSwgMHg3NjM4LCAweDEzMDMsIDB4NzYzQSwgMHgxMzA0LCAweDc2M0MsIDB4MkJEOSwKLSAgICAweDc2M0QsIDB4MkJENywgMHg3NjQyLCAweDE0MTUsIDB4NzY0MywgMHgyREIzLCAweDc2NDYsIDB4MTQxNCwKLSAgICAweDc2NDcsIDB4MkRCNiwgMHg3NjQ4LCAweDJEQjQsIDB4NzY0OSwgMHgyREI1LCAweDc2NEMsIDB4MTQxNiwKLSAgICAweDc2NTAsIDB4MkY2MywgMHg3NjUyLCAweDE0RjksIDB4NzY1MywgMHgyRjY0LCAweDc2NTYsIDB4MTRGNywKLSAgICAweDc2NTcsIDB4MkY2NSwgMHg3NjU4LCAweDE0RjgsIDB4NzY1OSwgMHgyRjYyLCAweDc2NUEsIDB4MkY2NiwKLSAgICAweDc2NUMsIDB4MkY2MCwgMHg3NjVGLCAweDE1OUMsIDB4NzY2MCwgMHgzMEM1LCAweDc2NjEsIDB4MTU5RCwKLSAgICAweDc2NjIsIDB4MTYyMiwgMHg3NjY0LCAweDJGNjEsIDB4NzY2NSwgMHgxNjIzLCAweDc2NjksIDB4MTY3RiwKLSAgICAweDc2NkEsIDB4MzJFNCwgMHg3NjZDLCAweDE2Q0UsIDB4NzY2RCwgMHgzMzk1LCAweDc2NkUsIDB4MTZDRCwKLSAgICAweDc2NzAsIDB4MzQyOCwgMHg3NjcxLCAweDE3MjMsIDB4NzY3MiwgMHgxNzI0LCAweDc2NzUsIDB4MzU0MywKLSAgICAweDc2NzYsIDB4MDIyRiwgMHg3Njc4LCAweDA3QUEsIDB4NzY3OSwgMHgxQjk1LCAweDc2N0IsIDB4MENFRSwKLSAgICAweDc2N0MsIDB4MENFRiwgMHg3NjdELCAweDAzNjMsIDB4NzY3RSwgMHgwM0Y1LCAweDc2N0YsIDB4MTgxMCwKLSAgICAweDc2ODEsIDB4MThENiwgMHg3NjgyLCAweDA0RjQsIDB4NzY4NCwgMHgwNjU5LCAweDc2ODYsIDB4MDdBQiwKLSAgICAweDc2ODcsIDB4MDdBQywgMHg3Njg4LCAweDA3QUQsIDB4NzY4OSwgMHgxRkE4LCAweDc2OEEsIDB4MUQ1OSwKLSAgICAweDc2OEIsIDB4MDk0MCwgMHg3NjhFLCAweDBCMzUsIDB4NzY4RiwgMHgxRkE3LCAweDc2OTIsIDB4MjIyRCwKLSAgICAweDc2OTMsIDB4MENGMSwgMHg3Njk1LCAweDIyMkMsIDB4NzY5NiwgMHgwQ0YwLCAweDc2OTksIDB4MjRCRSwKLSAgICAweDc2OUEsIDB4MTFCMywgMHg3NjlCLCAweDI5OEMsIDB4NzY5QywgMHgyOTg5LCAweDc2OUQsIDB4Mjk4QSwKLSAgICAweDc2OUUsIDB4Mjk4QiwgMHg3NkE0LCAweDJEQjcsIDB4NzZBNiwgMHgyRjY3LCAweDc2QUEsIDB4MzFGQiwKLSAgICAweDc2QUIsIDB4MzFGQSwgMHg3NkFELCAweDMzOTYsIDB4NzZBRSwgMHgwMzY0LCAweDc2QUYsIDB4MUExNCwKLSAgICAweDc2QjAsIDB4MDk0MSwgMHg3NkI0LCAweDBDRjIsIDB4NzZCNSwgMHgyNEJGLCAweDc2QjgsIDB4MjczRSwKLSAgICAweDc2QkEsIDB4MTFCNCwgMHg3NkJCLCAweDJCREQsIDB4NzZCRCwgMHgyRjY4LCAweDc2QkUsIDB4MzFGQywKLSAgICAweDc2QkYsIDB4MDM2NSwgMHg3NkMyLCAweDA2NUEsIDB4NzZDMywgMHgwN0IwLCAweDc2QzQsIDB4MUI5NiwKLSAgICAweDc2QzUsIDB4MDdCMSwgMHg3NkM2LCAweDA3QUYsIDB4NzZDOCwgMHgwN0FFLCAweDc2QzksIDB4MUQ1QSwKLSAgICAweDc2Q0EsIDB4MDk0MiwgMHg3NkNELCAweDA5NDMsIDB4NzZDRSwgMHgwOTQ0LCAweDc2RDIsIDB4MEIzNywKLSAgICAweDc2RDMsIDB4MUZBOSwgMHg3NkQ0LCAweDBCMzYsIDB4NzZEQSwgMHgyMjJFLCAweDc2REIsIDB4MEIzOCwKLSAgICAweDc2REMsIDB4MENGMywgMHg3NkRELCAweDI0QzAsIDB4NzZERSwgMHgwRTkwLCAweDc2REYsIDB4MEU5MSwKLSAgICAweDc2RTEsIDB4MTAzOCwgMHg3NkUzLCAweDEwMzksIDB4NzZFNCwgMHgxMUI1LCAweDc2RTUsIDB4MTMwNiwKLSAgICAweDc2RTYsIDB4MkJERSwgMHg3NkU3LCAweDEzMDUsIDB4NzZFOSwgMHgyREI4LCAweDc2RUEsIDB4MTQxNywKLSAgICAweDc2RUMsIDB4MkY2OSwgMHg3NkVELCAweDMxRkQsIDB4NzZFRSwgMHgwMzY2LCAweDc2RUYsIDB4MDRGNSwKLSAgICAweDc2RjAsIDB4MUExNywgMHg3NkYxLCAweDFBMTYsIDB4NzZGMiwgMHgwNjVCLCAweDc2RjMsIDB4MUExNSwKLSAgICAweDc2RjQsIDB4MDY1QywgMHg3NkY1LCAweDFBMTgsIDB4NzZGNywgMHgxQjlDLCAweDc2RjgsIDB4MDdCNCwKLSAgICAweDc2RjksIDB4MDdCMywgMHg3NkZBLCAweDFCOUUsIDB4NzZGQiwgMHgxQjlELCAweDc2RkMsIDB4MDdCOCwKLSAgICAweDc2RkUsIDB4MDdCNywgMHg3NzAxLCAweDA3QjIsIDB4NzcwMywgMHgxQjk4LCAweDc3MDQsIDB4MUI5OSwKLSAgICAweDc3MDUsIDB4MUI5QSwgMHg3NzA3LCAweDA3QjksIDB4NzcwOCwgMHgxQjk3LCAweDc3MDksIDB4MDdCNSwKLSAgICAweDc3MEEsIDB4MUI5QiwgMHg3NzBCLCAweDA3QjYsIDB4NzcxMCwgMHgxRDVELCAweDc3MTEsIDB4MUQ2MSwKLSAgICAweDc3MTIsIDB4MUQ1RiwgMHg3NzEzLCAweDFENUUsIDB4NzcxNSwgMHgxRDYyLCAweDc3MTksIDB4MUQ2MywKLSAgICAweDc3MUEsIDB4MUQ2NCwgMHg3NzFCLCAweDFENUMsIDB4NzcxRCwgMHgxRDVCLCAweDc3MUYsIDB4MDk0NiwKLSAgICAweDc3MjAsIDB4MDk0NywgMHg3NzIyLCAweDFENjUsIDB4NzcyMywgMHgxRDYwLCAweDc3MjUsIDB4MUZCMiwKLSAgICAweDc3MjcsIDB4MUQ2NiwgMHg3NzI4LCAweDA5NDgsIDB4NzcyOSwgMHgwOTQ1LCAweDc3MkQsIDB4MUZBQywKLSAgICAweDc3MkYsIDB4MUZBQiwgMHg3NzMxLCAweDFGQUQsIDB4NzczMiwgMHgxRkFFLCAweDc3MzMsIDB4MUZCMCwKLSAgICAweDc3MzQsIDB4MUZBRiwgMHg3NzM1LCAweDFGQjQsIDB4NzczNiwgMHgwQjNDLCAweDc3MzcsIDB4MEIzOSwKLSAgICAweDc3MzgsIDB4MEIzRCwgMHg3NzM5LCAweDFGQUEsIDB4NzczQSwgMHgwQjNFLCAweDc3M0IsIDB4MUZCMywKLSAgICAweDc3M0MsIDB4MEIzQiwgMHg3NzNELCAweDFGQjEsIDB4NzczRSwgMHgwQjNBLCAweDc3NDQsIDB4MjIzMSwKLSAgICAweDc3NDUsIDB4MjIzMywgMHg3NzQ2LCAweDIyMkYsIDB4Nzc0NywgMHgyMjMwLCAweDc3NEEsIDB4MjIzNCwKLSAgICAweDc3NEIsIDB4MjIzNiwgMHg3NzRDLCAweDIyMzcsIDB4Nzc0RCwgMHgyMjMyLCAweDc3NEUsIDB4MjIzNSwKLSAgICAweDc3NEYsIDB4MENGNCwgMHg3NzUyLCAweDI0QzQsIDB4Nzc1NCwgMHgyNEM5LCAweDc3NTUsIDB4MjRDMSwKLSAgICAweDc3NTYsIDB4MjRDNSwgMHg3NzU5LCAweDI0Q0EsIDB4Nzc1QSwgMHgyNEM2LCAweDc3NUIsIDB4MEU5MiwKLSAgICAweDc3NUMsIDB4MEU5QSwgMHg3NzVFLCAweDBFOTUsIDB4Nzc1RiwgMHgyNEMyLCAweDc3NjAsIDB4MjRDMywKLSAgICAweDc3NjEsIDB4MTAzRCwgMHg3NzYyLCAweDBFOUQsIDB4Nzc2MywgMHgwRTk2LCAweDc3NjUsIDB4MEU5QiwKLSAgICAweDc3NjYsIDB4MEU5NCwgMHg3NzY3LCAweDI0QzgsIDB4Nzc2OCwgMHgwRTlDLCAweDc3NjksIDB4MjRDNywKLSAgICAweDc3NkEsIDB4MEU5OCwgMHg3NzZCLCAweDBFOTMsIDB4Nzc2QywgMHgwRTk5LCAweDc3NkQsIDB4MjRDQiwKLSAgICAweDc3NkUsIDB4Mjc0MywgMHg3NzZGLCAweDI3NDUsIDB4Nzc3OSwgMHgwRTk3LCAweDc3N0MsIDB4Mjc0MCwKLSAgICAweDc3N0QsIDB4MTAzQiwgMHg3NzdFLCAweDI3NDYsIDB4Nzc3RiwgMHgxMDNDLCAweDc3ODAsIDB4Mjc0NCwKLSAgICAweDc3ODEsIDB4MjczRiwgMHg3NzgyLCAweDI3NDIsIDB4Nzc4MywgMHgyNzQ3LCAweDc3ODQsIDB4MTAzQSwKLSAgICAweDc3ODUsIDB4Mjc0MSwgMHg3Nzg3LCAweDExQjcsIDB4Nzc4OCwgMHgyOTkwLCAweDc3ODksIDB4Mjk4RiwKLSAgICAweDc3OEIsIDB4MTFCQSwgMHg3NzhDLCAweDExQjgsIDB4Nzc4RCwgMHgyOThELCAweDc3OEUsIDB4MTFCNiwKLSAgICAweDc3OEYsIDB4Mjk4RSwgMHg3NzkxLCAweDExQjksIDB4Nzc5NSwgMHgyQkU2LCAweDc3OTcsIDB4MkJFOCwKLSAgICAweDc3OTksIDB4MkJFNywgMHg3NzlBLCAweDJCREYsIDB4Nzc5QiwgMHgyQkUzLCAweDc3OUMsIDB4MkJFMiwKLSAgICAweDc3OUQsIDB4MkJFMCwgMHg3NzlFLCAweDEzMDgsIDB4Nzc5RiwgMHgxMzA5LCAweDc3QTAsIDB4MTMwNywKLSAgICAweDc3QTEsIDB4MkJFMSwgMHg3N0EyLCAweDJCRTQsIDB4NzdBMywgMHgyQkU1LCAweDc3QTUsIDB4MTMwQSwKLSAgICAweDc3QTcsIDB4MTQxQywgMHg3N0E4LCAweDJEQzAsIDB4NzdBQSwgMHgxNDE5LCAweDc3QUIsIDB4MkRCQSwKLSAgICAweDc3QUMsIDB4MTQxQiwgMHg3N0FELCAweDE0MUQsIDB4NzdCMCwgMHgxNDFBLCAweDc3QjEsIDB4MkRCRiwKLSAgICAweDc3QjIsIDB4MkRCQiwgMHg3N0IzLCAweDE0MTgsIDB4NzdCNCwgMHgyREJFLCAweDc3QjUsIDB4MkRCOSwKLSAgICAweDc3QjYsIDB4MkRCRCwgMHg3N0I3LCAweDJEQkMsIDB4NzdCQSwgMHgyRjZCLCAweDc3QkIsIDB4MTRGQywKLSAgICAweDc3QkMsIDB4MTRGRCwgMHg3N0JELCAweDE0RkEsIDB4NzdCRiwgMHgxNEZCLCAweDc3QzIsIDB4MkY2QSwKLSAgICAweDc3QzQsIDB4MzBDOCwgMHg3N0M3LCAweDE1OUUsIDB4NzdDOSwgMHgzMEM2LCAweDc3Q0EsIDB4MzBDNywKLSAgICAweDc3Q0MsIDB4MzFGRSwgMHg3N0NELCAweDMyMDEsIDB4NzdDRSwgMHgzMUZGLCAweDc3Q0YsIDB4MzIwMCwKLSAgICAweDc3RDAsIDB4MzJFNSwgMHg3N0QzLCAweDE2ODAsIDB4NzdENCwgMHgzNDI5LCAweDc3RDUsIDB4MzQ4RiwKLSAgICAweDc3RDcsIDB4MTcyNSwgMHg3N0Q4LCAweDM0RDMsIDB4NzdEOSwgMHgzNEQ0LCAweDc3REEsIDB4MTc1MywKLSAgICAweDc3REIsIDB4MDM2NywgMHg3N0RDLCAweDA3QkEsIDB4NzdERSwgMHgyMjM4LCAweDc3RTAsIDB4MjRDQywKLSAgICAweDc3RTIsIDB4MDM2OCwgMHg3N0UzLCAweDA0RjYsIDB4NzdFNSwgMHgwNjVELCAweDc3RTcsIDB4MUI5RiwKLSAgICAweDc3RTgsIDB4MUJBMCwgMHg3N0U5LCAweDA5NDksIDB4NzdFQywgMHgyMjM5LCAweDc3RUQsIDB4MENGNSwKLSAgICAweDc3RUUsIDB4MEU5RSwgMHg3N0VGLCAweDE0MUUsIDB4NzdGMCwgMHgyREMxLCAweDc3RjEsIDB4MzBDOSwKLSAgICAweDc3RjIsIDB4MzIwMiwgMHg3N0YzLCAweDAzNjksIDB4NzdGNywgMHgxQTFFLCAweDc3RjgsIDB4MUExOSwKLSAgICAweDc3RjksIDB4MUExQiwgMHg3N0ZBLCAweDFBMUQsIDB4NzdGQiwgMHgxQTFDLCAweDc3RkMsIDB4MUExQSwKLSAgICAweDc3RkQsIDB4MDY1RSwgMHg3ODAyLCAweDA3QkIsIDB4NzgwMywgMHgxQkE5LCAweDc4MDUsIDB4MUJBNCwKLSAgICAweDc4MDYsIDB4MUJBMSwgMHg3ODA5LCAweDFCQTgsIDB4NzgwQywgMHgwN0JELCAweDc4MEQsIDB4MDdCRSwKLSAgICAweDc4MEUsIDB4MUJBNywgMHg3ODBGLCAweDFCQTYsIDB4NzgxMCwgMHgxQkE1LCAweDc4MTEsIDB4MUJBMiwKLSAgICAweDc4MTIsIDB4MUJBMywgMHg3ODEzLCAweDFCQUEsIDB4NzgxNCwgMHgwN0JDLCAweDc4MUQsIDB4MDk0RCwKLSAgICAweDc4MUYsIDB4MDk1MywgMHg3ODIwLCAweDA5NTIsIDB4NzgyMSwgMHgxRDZGLCAweDc4MjIsIDB4MUQ2OSwKLSAgICAweDc4MjMsIDB4MUQ2NywgMHg3ODI1LCAweDA5NTAsIDB4NzgyNiwgMHgxRkJCLCAweDc4MjcsIDB4MDk0QiwKLSAgICAweDc4MjgsIDB4MUQ2QywgMHg3ODI5LCAweDFENzAsIDB4NzgyQSwgMHgxRDcyLCAweDc4MkIsIDB4MUQ2RSwKLSAgICAweDc4MkMsIDB4MUQ2OCwgMHg3ODJELCAweDA5NTEsIDB4NzgyRSwgMHgxRDZELCAweDc4MkYsIDB4MUQ2QiwKLSAgICAweDc4MzAsIDB4MDk0QSwgMHg3ODMxLCAweDFENzMsIDB4NzgzMiwgMHgwOTU0LCAweDc4MzMsIDB4MUQ3MSwKLSAgICAweDc4MzQsIDB4MDk0RSwgMHg3ODM1LCAweDFENkEsIDB4NzgzNywgMHgwOTRGLCAweDc4MzgsIDB4MDk0QywKLSAgICAweDc4NDMsIDB4MEI0MCwgMHg3ODQ1LCAweDFGQkMsIDB4Nzg0OCwgMHgxRkI1LCAweDc4NDksIDB4MUZCNywKLSAgICAweDc4NEEsIDB4MUZCOSwgMHg3ODRDLCAweDFGQkEsIDB4Nzg0RCwgMHgxRkI4LCAweDc4NEUsIDB4MEI0MSwKLSAgICAweDc4NTAsIDB4MUZCRCwgMHg3ODUyLCAweDFGQjYsIDB4Nzg1QywgMHgyMjNELCAweDc4NUQsIDB4MENGNiwKLSAgICAweDc4NUUsIDB4MjI0NSwgMHg3ODYwLCAweDIyM0EsIDB4Nzg2MiwgMHgyMjQ2LCAweDc4NjQsIDB4MjIzQiwKLSAgICAweDc4NjUsIDB4MjIzQywgMHg3ODY4LCAweDIyNDQsIDB4Nzg2OSwgMHgyMjQzLCAweDc4NkEsIDB4MjI0MCwKLSAgICAweDc4NkIsIDB4MEIzRiwgMHg3ODZDLCAweDBDRjcsIDB4Nzg2RCwgMHgyMjNFLCAweDc4NkUsIDB4MjI0MSwKLSAgICAweDc4NkYsIDB4MENGOCwgMHg3ODcwLCAweDIyNDIsIDB4Nzg3MSwgMHgyMjNGLCAweDc4NzksIDB4MjRENywKLSAgICAweDc4N0IsIDB4MjREQiwgMHg3ODdDLCAweDBFQTUsIDB4Nzg3RSwgMHgyNzRELCAweDc4N0YsIDB4MEVBOCwKLSAgICAweDc4ODAsIDB4MjREOSwgMHg3ODgxLCAweDM2RTgsIDB4Nzg4MywgMHgyNEQ2LCAweDc4ODQsIDB4MjREMSwKLSAgICAweDc4ODUsIDB4MjREMywgMHg3ODg2LCAweDI0RDQsIDB4Nzg4NywgMHgyNENELCAweDc4ODksIDB4MEVBNCwKLSAgICAweDc4OEMsIDB4MEVBMywgMHg3ODhFLCAweDBFOUYsIDB4Nzg4RiwgMHgyNEQwLCAweDc4OTEsIDB4MEVBNiwKLSAgICAweDc4OTMsIDB4MEVBNywgMHg3ODk0LCAweDI0Q0YsIDB4Nzg5NSwgMHgyNEQyLCAweDc4OTYsIDB4MjREQSwKLSAgICAweDc4OTcsIDB4MEVBMSwgMHg3ODk4LCAweDBFQTIsIDB4Nzg5OSwgMHgyNEQ4LCAweDc4OUEsIDB4MjRDRSwKLSAgICAweDc4OUUsIDB4Mjc0RiwgMHg3ODlGLCAweDEwM0YsIDB4NzhBMCwgMHgyNzUxLCAweDc4QTEsIDB4MjRENSwKLSAgICAweDc4QTIsIDB4Mjc1MywgMHg3OEEzLCAweDEwNDMsIDB4NzhBNCwgMHgyNzU0LCAweDc4QTUsIDB4Mjc1MCwKLSAgICAweDc4QTcsIDB4MTA0MCwgMHg3OEE4LCAweDI3NEMsIDB4NzhBOSwgMHgxMDQyLCAweDc4QUEsIDB4Mjc0OSwKLSAgICAweDc4QUIsIDB4Mjc0RSwgMHg3OEFDLCAweDI3NTIsIDB4NzhBRCwgMHgyNzRCLCAweDc4QjAsIDB4MEVBMCwKLSAgICAweDc4QjIsIDB4Mjc0OCwgMHg3OEIzLCAweDEwNDEsIDB4NzhCNCwgMHgyNzRBLCAweDc4QkEsIDB4MTFCRCwKLSAgICAweDc4QkIsIDB4Mjk5MiwgMHg3OEJDLCAweDExQzEsIDB4NzhCRSwgMHgxMUJGLCAweDc4QzEsIDB4MTAzRSwKLSAgICAweDc4QzMsIDB4Mjk5OSwgMHg3OEM0LCAweDI5OUEsIDB4NzhDNSwgMHgxMUJDLCAweDc4QzgsIDB4Mjk5OCwKLSAgICAweDc4QzksIDB4Mjk5QiwgMHg3OENBLCAweDExQkUsIDB4NzhDQiwgMHgxMUJCLCAweDc4Q0MsIDB4Mjk5NCwKLSAgICAweDc4Q0QsIDB4Mjk5MSwgMHg3OENFLCAweDI5OTYsIDB4NzhDRiwgMHgyOTkzLCAweDc4RDAsIDB4MTFDMiwKLSAgICAweDc4RDEsIDB4Mjk5NSwgMHg3OEQ0LCAweDI5OTcsIDB4NzhENSwgMHgxMUMwLCAweDc4REEsIDB4MTMwQywKLSAgICAweDc4REIsIDB4MkJFRiwgMHg3OERELCAweDJCRTksIDB4NzhERSwgMHgyQkVELCAweDc4REYsIDB4MkJGMywKLSAgICAweDc4RTAsIDB4MkJGNCwgMHg3OEUxLCAweDJCRjAsIDB4NzhFMiwgMHgyQkYxLCAweDc4RTMsIDB4MkJFRSwKLSAgICAweDc4RTUsIDB4MkJFQiwgMHg3OEU3LCAweDEzMEUsIDB4NzhFOCwgMHgxMzBCLCAweDc4RTksIDB4MkJFQSwKLSAgICAweDc4RUEsIDB4MkJFQywgMHg3OEVDLCAweDEzMEQsIDB4NzhFRCwgMHgyQkYyLCAweDc4RUYsIDB4MTQyMiwKLSAgICAweDc4RjIsIDB4MkRDOCwgMHg3OEYzLCAweDJEQzIsIDB4NzhGNCwgMHgxNDIxLCAweDc4RjcsIDB4MTQxRiwKLSAgICAweDc4RjksIDB4MkRDQSwgMHg3OEZBLCAweDE0MjAsIDB4NzhGQiwgMHgyREM1LCAweDc4RkMsIDB4MkRDNiwKLSAgICAweDc4RkQsIDB4MkRDMywgMHg3OEZFLCAweDJEQ0IsIDB4NzhGRiwgMHgyREM3LCAweDc5MDEsIDB4MTQyMywKLSAgICAweDc5MDIsIDB4MkRDNCwgMHg3OTA0LCAweDJEQ0MsIDB4NzkwNSwgMHgyREM5LCAweDc5MDksIDB4MkY2RiwKLSAgICAweDc5MEMsIDB4MkY2QywgMHg3OTBFLCAweDE0RkUsIDB4NzkxMCwgMHgyRjcwLCAweDc5MTEsIDB4MkY3MiwKLSAgICAweDc5MTIsIDB4MkY3MSwgMHg3OTEzLCAweDJGNkQsIDB4NzkxNCwgMHgyRjZFLCAweDc5MTcsIDB4MzBDRSwKLSAgICAweDc5MTksIDB4MTU5RiwgMHg3OTFCLCAweDMwQ0IsIDB4NzkxQywgMHgzMENELCAweDc5MUQsIDB4MzBDQSwKLSAgICAweDc5MUUsIDB4MzBDRiwgMHg3OTIxLCAweDMwQ0MsIDB4NzkyMywgMHgzMjA0LCAweDc5MjQsIDB4MzIwNywKLSAgICAweDc5MjUsIDB4MzIwMywgMHg3OTI2LCAweDE2MjQsIDB4NzkyNywgMHgzMjA1LCAweDc5MjgsIDB4MzIwNiwKLSAgICAweDc5MjksIDB4MzIwOCwgMHg3OTJBLCAweDE2MjUsIDB4NzkyQiwgMHgxNjI3LCAweDc5MkMsIDB4MTYyNiwKLSAgICAweDc5MkQsIDB4MzJFNiwgMHg3OTJGLCAweDMyRTgsIDB4NzkzMSwgMHgzMkU3LCAweDc5MzUsIDB4MzM5NywKLSAgICAweDc5MzgsIDB4MzQ5MCwgMHg3OTM5LCAweDM0RDUsIDB4NzkzQSwgMHgwMzZBLCAweDc5M0QsIDB4MThENywKLSAgICAweDc5M0UsIDB4MDY1RiwgMHg3OTNGLCAweDFBMjAsIDB4Nzk0MCwgMHgwNjYwLCAweDc5NDEsIDB4MDY2MSwKLSAgICAweDc5NDIsIDB4MUExRiwgMHg3OTQ0LCAweDFCQUYsIDB4Nzk0NSwgMHgxQkFFLCAweDc5NDYsIDB4MDdCRiwKLSAgICAweDc5NDcsIDB4MDdDMiwgMHg3OTQ4LCAweDA3QzEsIDB4Nzk0OSwgMHgwN0MwLCAweDc5NEEsIDB4MUJBQiwKLSAgICAweDc5NEIsIDB4MUJBRCwgMHg3OTRDLCAweDFCQUMsIDB4Nzk0RiwgMHgxRDc2LCAweDc5NTAsIDB4MDk1NiwKLSAgICAweDc5NTEsIDB4MUQ3QSwgMHg3OTUyLCAweDFENzksIDB4Nzk1MywgMHgxRDc4LCAweDc5NTQsIDB4MUQ3NCwKLSAgICAweDc5NTUsIDB4MDk1NSwgMHg3OTU2LCAweDA5NTksIDB4Nzk1NywgMHgwOTVDLCAweDc5NUEsIDB4MDk1RCwKLSAgICAweDc5NUIsIDB4MUQ3NSwgMHg3OTVDLCAweDFENzcsIDB4Nzk1RCwgMHgwOTVCLCAweDc5NUUsIDB4MDk1QSwKLSAgICAweDc5NUYsIDB4MDk1OCwgMHg3OTYwLCAweDA5NTcsIDB4Nzk2MSwgMHgxRkM0LCAweDc5NjMsIDB4MUZDMiwKLSAgICAweDc5NjQsIDB4MUZCRSwgMHg3OTY1LCAweDBCNDIsIDB4Nzk2NywgMHgxRkJGLCAweDc5NjgsIDB4MEI0MywKLSAgICAweDc5NjksIDB4MUZDMCwgMHg3OTZBLCAweDFGQzEsIDB4Nzk2QiwgMHgxRkMzLCAweDc5NkQsIDB4MEI0NCwKLSAgICAweDc5NzAsIDB4MjI0QSwgMHg3OTcyLCAweDIyNDksIDB4Nzk3MywgMHgyMjQ4LCAweDc5NzQsIDB4MjI0NywKLSAgICAweDc5NzksIDB4MjRERiwgMHg3OTdBLCAweDBFQTksIDB4Nzk3QywgMHgyNERDLCAweDc5N0QsIDB4MjRERSwKLSAgICAweDc5N0YsIDB4MEVBQSwgMHg3OTgxLCAweDBFQUIsIDB4Nzk4MiwgMHgyNERELCAweDc5ODgsIDB4Mjc1RCwKLSAgICAweDc5OEEsIDB4Mjc1NiwgMHg3OThCLCAweDI3NTcsIDB4Nzk4RCwgMHgxMDQ2LCAweDc5OEUsIDB4MTA0NCwKLSAgICAweDc5OEYsIDB4MTA0NSwgMHg3OTkwLCAweDI3NUYsIDB4Nzk5MiwgMHgyNzVFLCAweDc5OTMsIDB4Mjc1QiwKLSAgICAweDc5OTQsIDB4Mjc1QSwgMHg3OTk1LCAweDI3NTksIDB4Nzk5NiwgMHgyNzU4LCAweDc5OTcsIDB4Mjc1QywKLSAgICAweDc5OTgsIDB4Mjc1NSwgMHg3OTlBLCAweDI5OUMsIDB4Nzk5QiwgMHgyOUExLCAweDc5OUMsIDB4Mjk5RiwKLSAgICAweDc5QTAsIDB4Mjk5RSwgMHg3OUExLCAweDI5OUQsIDB4NzlBMiwgMHgyOUEwLCAweDc5QTQsIDB4MkJGNSwKLSAgICAweDc5QTYsIDB4MTMwRiwgMHg3OUE3LCAweDE0MjQsIDB4NzlBOCwgMHgyRENFLCAweDc5QUEsIDB4MTQyNSwKLSAgICAweDc5QUIsIDB4MkRDRCwgMHg3OUFDLCAweDJGNzQsIDB4NzlBRCwgMHgyRjczLCAweDc5QUUsIDB4MTRGRiwKLSAgICAweDc5QjAsIDB4MzBEMCwgMHg3OUIxLCAweDE1QTAsIDB4NzlCMiwgMHgzMjA5LCAweDc5QjMsIDB4MTZDRiwKLSAgICAweDc5QjQsIDB4MzM5OCwgMHg3OUI2LCAweDM0OTIsIDB4NzlCNywgMHgzNDkxLCAweDc5QjgsIDB4MTdCMiwKLSAgICAweDc5QjksIDB4MDdDMywgMHg3OUJBLCAweDA3QzQsIDB4NzlCQiwgMHgxRkM1LCAweDc5QkQsIDB4MEVBRCwKLSAgICAweDc5QkUsIDB4MDM2QiwgMHg3OUJGLCAweDA0RjksIDB4NzlDMCwgMHgwNEY4LCAweDc5QzEsIDB4MDRGNywKLSAgICAweDc5QzUsIDB4MUEyMSwgMHg3OUM4LCAweDA2NjMsIDB4NzlDOSwgMHgwNjYyLCAweDc5Q0IsIDB4MDdDNywKLSAgICAweDc5Q0QsIDB4MUJCMSwgMHg3OUNFLCAweDFCQjQsIDB4NzlDRiwgMHgxQkIyLCAweDc5RDEsIDB4MDdDNSwKLSAgICAweDc5RDIsIDB4MDdDNiwgMHg3OUQ1LCAweDFCQjAsIDB4NzlENiwgMHgxQkIzLCAweDc5RDgsIDB4MDk2NCwKLSAgICAweDc5REMsIDB4MUQ4MSwgMHg3OURELCAweDFEODMsIDB4NzlERSwgMHgxRDgyLCAweDc5REYsIDB4MDk2MSwKLSAgICAweDc5RTAsIDB4MUQ3RCwgMHg3OUUzLCAweDA5NUYsIDB4NzlFNCwgMHgwOTVFLCAweDc5RTYsIDB4MDk2MiwKLSAgICAweDc5RTcsIDB4MDk2MCwgMHg3OUU5LCAweDA5NjMsIDB4NzlFQSwgMHgxRDgwLCAweDc5RUIsIDB4MUQ3QiwKLSAgICAweDc5RUMsIDB4MUQ3QywgMHg3OUVELCAweDFEN0YsIDB4NzlFRSwgMHgxRDdFLCAweDc5RjYsIDB4MUZDOCwKLSAgICAweDc5RjcsIDB4MUZDOSwgMHg3OUY4LCAweDFGQzcsIDB4NzlGQSwgMHgxRkM2LCAweDc5RkIsIDB4MEI0NSwKLSAgICAweDdBMDAsIDB4MENGRCwgMHg3QTAyLCAweDIyNEIsIDB4N0EwMywgMHgyMjRELCAweDdBMDQsIDB4MjI0RiwKLSAgICAweDdBMDUsIDB4MENGQywgMHg3QTA4LCAweDBDRkEsIDB4N0EwQSwgMHgyMjRDLCAweDdBMEIsIDB4MENGQiwKLSAgICAweDdBMEMsIDB4MjI0RSwgMHg3QTBELCAweDBDRjksIDB4N0ExMCwgMHgyNEU5LCAweDdBMTEsIDB4MjRFMCwKLSAgICAweDdBMTIsIDB4MjRFMywgMHg3QTEzLCAweDI0RTcsIDB4N0ExNCwgMHgwRUIxLCAweDdBMTUsIDB4MjRFNSwKLSAgICAweDdBMTcsIDB4MjRFNCwgMHg3QTE4LCAweDI0RTEsIDB4N0ExOSwgMHgyNEUyLCAweDdBMUEsIDB4MEVBRiwKLSAgICAweDdBMUIsIDB4MjRFOCwgMHg3QTFDLCAweDBFQUUsIDB4N0ExRSwgMHgwRUIzLCAweDdBMUYsIDB4MEVCMiwKLSAgICAweDdBMjAsIDB4MEVCMCwgMHg3QTIyLCAweDI0RTYsIDB4N0EyNiwgMHgyNzY1LCAweDdBMjgsIDB4Mjc2NCwKLSAgICAweDdBMkIsIDB4Mjc2MCwgMHg3QTJFLCAweDEwNDcsIDB4N0EyRiwgMHgyNzYzLCAweDdBMzAsIDB4Mjc2MiwKLSAgICAweDdBMzEsIDB4MTA0OCwgMHg3QTM3LCAweDExQzcsIDB4N0EzOSwgMHgyOUEzLCAweDdBM0IsIDB4MTFDOCwKLSAgICAweDdBM0MsIDB4MTFDNCwgMHg3QTNELCAweDExQzYsIDB4N0EzRiwgMHgxMUMzLCAweDdBNDAsIDB4MTFDNSwKLSAgICAweDdBNDQsIDB4MkJGNiwgMHg3QTQ2LCAweDEzMTIsIDB4N0E0NywgMHgyQkY4LCAweDdBNDgsIDB4MkJGNywKLSAgICAweDdBNEEsIDB4Mjc2MSwgMHg3QTRCLCAweDEzMTQsIDB4N0E0QywgMHgxMzEzLCAweDdBNEQsIDB4MTMxMCwKLSAgICAweDdBNEUsIDB4MTMxMSwgMHg3QTU0LCAweDJERDMsIDB4N0E1NiwgMHgyREQxLCAweDdBNTcsIDB4MTQyNiwKLSAgICAweDdBNTgsIDB4MkREMiwgMHg3QTVBLCAweDJERDQsIDB4N0E1QiwgMHgyREQwLCAweDdBNUMsIDB4MkRDRiwKLSAgICAweDdBNUYsIDB4MkY3NSwgMHg3QTYwLCAweDE1MDIsIDB4N0E2MSwgMHgxNTAwLCAweDdBNjIsIDB4MTUwMSwKLSAgICAweDdBNjcsIDB4MzBEMSwgMHg3QTY4LCAweDMwRDIsIDB4N0E2OSwgMHgxNUEyLCAweDdBNkIsIDB4MTVBMSwKLSAgICAweDdBNkMsIDB4MzIwQiwgMHg3QTZELCAweDMyMEMsIDB4N0E2RSwgMHgzMjBBLCAweDdBNzAsIDB4MzM5OSwKLSAgICAweDdBNzEsIDB4MzM5QSwgMHg3QTc0LCAweDAzNkMsIDB4N0E3NSwgMHgxODExLCAweDdBNzYsIDB4MDRGQSwKLSAgICAweDdBNzgsIDB4MUEyMiwgMHg3QTc5LCAweDA2NjUsIDB4N0E3QSwgMHgwNjY0LCAweDdBN0IsIDB4MUEyMywKLSAgICAweDdBN0UsIDB4MUJCNiwgMHg3QTdGLCAweDA3QzgsIDB4N0E4MCwgMHgxQkI1LCAweDdBODEsIDB4MDdDOSwKLSAgICAweDdBODQsIDB4MDk2NSwgMHg3QTg1LCAweDFEODYsIDB4N0E4NiwgMHgxRDg0LCAweDdBODcsIDB4MUQ4QSwKLSAgICAweDdBODgsIDB4MDk2NiwgMHg3QTg5LCAweDFEODUsIDB4N0E4QSwgMHgxRDg5LCAweDdBOEIsIDB4MUQ4NywKLSAgICAweDdBOEMsIDB4MUQ4OCwgMHg3QThGLCAweDFGQ0EsIDB4N0E5MCwgMHgxRkNDLCAweDdBOTIsIDB4MEI0NiwKLSAgICAweDdBOTQsIDB4MUZDQiwgMHg3QTk1LCAweDBCNDcsIDB4N0E5NiwgMHgwRDAwLCAweDdBOTcsIDB4MENGRiwKLSAgICAweDdBOTgsIDB4MENGRSwgMHg3QTk5LCAweDIyNTAsIDB4N0E5RSwgMHgyNEVDLCAweDdBOUYsIDB4MEVCNCwKLSAgICAweDdBQTAsIDB4MEVCNSwgMHg3QUEyLCAweDI0RUIsIDB4N0FBMywgMHgyNEVBLCAweDdBQTgsIDB4Mjc2NiwKLSAgICAweDdBQTksIDB4MTA0QSwgMHg3QUFBLCAweDEwNDksIDB4N0FBQiwgMHgyNzY3LCAweDdBQUMsIDB4Mjc2OCwKLSAgICAweDdBQUUsIDB4MTFDQSwgMHg3QUFGLCAweDExQzksIDB4N0FCMSwgMHgyQkZDLCAweDdBQjIsIDB4MjlBNCwKLSAgICAweDdBQjMsIDB4MjlBNiwgMHg3QUI0LCAweDI5QTUsIDB4N0FCNSwgMHgyQkZCLCAweDdBQjYsIDB4MkJGOSwKLSAgICAweDdBQjcsIDB4MkJGRCwgMHg3QUI4LCAweDJCRkEsIDB4N0FCQSwgMHgxMzE1LCAweDdBQkUsIDB4MkRENSwKLSAgICAweDdBQkYsIDB4MTQyNywgMHg3QUMwLCAweDJERDYsIDB4N0FDMSwgMHgyREQ3LCAweDdBQzQsIDB4MTUwMywKLSAgICAweDdBQzUsIDB4MTUwNCwgMHg3QUM3LCAweDE2MjgsIDB4N0FDQSwgMHgxNkZGLCAweDdBQ0IsIDB4MDM2RCwKLSAgICAweDdBRDEsIDB4MUJCNywgMHg3QUQ4LCAweDFEOEIsIDB4N0FEOSwgMHgwOTY3LCAweDdBREYsIDB4MEJERSwKLSAgICAweDdBRTAsIDB4MEJERCwgMHg3QUUzLCAweDBEMDIsIDB4N0FFNCwgMHgyMjUyLCAweDdBRTUsIDB4MEQwMSwKLSAgICAweDdBRTYsIDB4MjI1MSwgMHg3QUVCLCAweDI0RUQsIDB4N0FFRCwgMHgxMDRCLCAweDdBRUUsIDB4Mjc2OSwKLSAgICAweDdBRUYsIDB4MTA0QywgMHg3QUY2LCAweDE2MjksIDB4N0FGNywgMHgzMjBELCAweDdBRjksIDB4MDNGNiwKLSAgICAweDdBRkEsIDB4MDY2NiwgMHg3QUZCLCAweDFBMjQsIDB4N0FGRCwgMHgwN0NCLCAweDdBRkYsIDB4MDdDQSwKLSAgICAweDdCMDAsIDB4MUJCOCwgMHg3QjAxLCAweDFCQjksIDB4N0IwNCwgMHgxRDhELCAweDdCMDUsIDB4MUQ4RiwKLSAgICAweDdCMDYsIDB4MDk2OCwgMHg3QjA4LCAweDFEOTEsIDB4N0IwOSwgMHgxRDk0LCAweDdCMEEsIDB4MUQ5MiwKLSAgICAweDdCMEUsIDB4MUQ5MywgMHg3QjBGLCAweDFEOTAsIDB4N0IxMCwgMHgxRDhDLCAweDdCMTEsIDB4MDk2OSwKLSAgICAweDdCMTIsIDB4MUQ5NSwgMHg3QjEzLCAweDFEOEUsIDB4N0IxOCwgMHgxRkQ1LCAweDdCMTksIDB4MEI0RCwKLSAgICAweDdCMUEsIDB4MUZERSwgMHg3QjFCLCAweDBCNEEsIDB4N0IxRCwgMHgxRkQ3LCAweDdCMUUsIDB4MEI0RSwKLSAgICAweDdCMjAsIDB4MEI0OCwgMHg3QjIyLCAweDFGRDIsIDB4N0IyMywgMHgxRkRGLCAweDdCMjQsIDB4MUZEMywKLSAgICAweDdCMjUsIDB4MUZEMCwgMHg3QjI2LCAweDBCNEMsIDB4N0IyOCwgMHgwQjQ5LCAweDdCMkEsIDB4MUZENiwKLSAgICAweDdCMkIsIDB4MUZEOSwgMHg3QjJDLCAweDBCNEIsIDB4N0IyRCwgMHgxRkRBLCAweDdCMkUsIDB4MEI0RiwKLSAgICAweDdCMkYsIDB4MUZEQiwgMHg3QjMwLCAweDFGRDEsIDB4N0IzMSwgMHgxRkQ4LCAweDdCMzIsIDB4MUZEQywKLSAgICAweDdCMzMsIDB4MUZENCwgMHg3QjM0LCAweDFGQ0YsIDB4N0IzNSwgMHgxRkNELCAweDdCMzgsIDB4MUZERCwKLSAgICAweDdCM0IsIDB4MUZDRSwgMHg3QjQwLCAweDIyNTksIDB4N0I0NCwgMHgyMjU1LCAweDdCNDUsIDB4MjI1QiwKLSAgICAweDdCNDYsIDB4MEQwNSwgMHg3QjQ3LCAweDIyNTQsIDB4N0I0OCwgMHgyMjU2LCAweDdCNDksIDB4MEQwMywKLSAgICAweDdCNEEsIDB4MjI1MywgMHg3QjRCLCAweDBEMEEsIDB4N0I0QywgMHgyMjU3LCAweDdCNEQsIDB4MEQwOSwKLSAgICAweDdCNEUsIDB4MjI1OCwgMHg3QjRGLCAweDBEMEIsIDB4N0I1MCwgMHgwRDA2LCAweDdCNTEsIDB4MEQwQywKLSAgICAweDdCNTIsIDB4MEQwNywgMHg3QjU0LCAweDBEMDgsIDB4N0I1NiwgMHgwRDA0LCAweDdCNTgsIDB4MjI1QSwKLSAgICAweDdCNjAsIDB4MEVCOCwgMHg3QjYxLCAweDI0RjgsIDB4N0I2MywgMHgyNEZCLCAweDdCNjQsIDB4MjRFRiwKLSAgICAweDdCNjUsIDB4MjRGNCwgMHg3QjY2LCAweDI0RUUsIDB4N0I2NywgMHgwRUJBLCAweDdCNjksIDB4MjRGMiwKLSAgICAweDdCNkQsIDB4MjRGMCwgMHg3QjZFLCAweDBFQjksIDB4N0I3MCwgMHgyNEY3LCAweDdCNzEsIDB4MjRGNiwKLSAgICAweDdCNzIsIDB4MjRGMywgMHg3QjczLCAweDI0RjUsIDB4N0I3NCwgMHgyNEYxLCAweDdCNzUsIDB4MTA1MCwKLSAgICAweDdCNzYsIDB4MjRGQSwgMHg3Qjc3LCAweDBFQjYsIDB4N0I3OCwgMHgyNEY5LCAweDdCODIsIDB4Mjc3OSwKLSAgICAweDdCODQsIDB4MTA1NywgMHg3Qjg1LCAweDI3NzQsIDB4N0I4NywgMHgxMDU2LCAweDdCODgsIDB4Mjc2QSwKLSAgICAweDdCOEEsIDB4Mjc2QywgMHg3QjhCLCAweDEwNEYsIDB4N0I4QywgMHgyNzcxLCAweDdCOEQsIDB4Mjc3MCwKLSAgICAweDdCOEUsIDB4Mjc3MywgMHg3QjhGLCAweDEwNTQsIDB4N0I5MCwgMHgyNzZFLCAweDdCOTEsIDB4Mjc2RCwKLSAgICAweDdCOTQsIDB4MTA1MywgMHg3Qjk1LCAweDEwNEUsIDB4N0I5NiwgMHgyNzZGLCAweDdCOTcsIDB4MTA1MSwKLSAgICAweDdCOTgsIDB4Mjc3NSwgMHg3Qjk5LCAweDI3NzcsIDB4N0I5QiwgMHgyNzcyLCAweDdCOUMsIDB4Mjc2QiwKLSAgICAweDdCOUQsIDB4MTA1MiwgMHg3QkEwLCAweDExRDIsIDB4N0JBMSwgMHgxMDRELCAweDdCQTQsIDB4Mjc3OCwKLSAgICAweDdCQUMsIDB4MjlBQSwgMHg3QkFELCAweDExQ0IsIDB4N0JBRiwgMHgyOUFDLCAweDdCQjEsIDB4MTFDQywKLSAgICAweDdCQjQsIDB4MTFDRSwgMHg3QkI1LCAweDI5QUYsIDB4N0JCNywgMHgyOUE3LCAweDdCQjgsIDB4MTA1NSwKLSAgICAweDdCQjksIDB4MjlBRCwgMHg3QkJFLCAweDI5QTksIDB4N0JDMCwgMHgwRUI3LCAweDdCQzEsIDB4MTFEMSwKLSAgICAweDdCQzQsIDB4MTFDRCwgMHg3QkM2LCAweDExQ0YsIDB4N0JDNywgMHgxMUQwLCAweDdCQzksIDB4MTMxOCwKLSAgICAweDdCQ0EsIDB4MjlBRSwgMHg3QkNCLCAweDI5QTgsIDB4N0JDQywgMHgxMUQzLCAweDdCQ0UsIDB4MjlBQiwKLSAgICAweDdCRDQsIDB4MkMwNywgMHg3QkQ1LCAweDJDMDIsIDB4N0JEOCwgMHgyQzBDLCAweDdCRDksIDB4MTMxNiwKLSAgICAweDdCREEsIDB4MkMwNCwgMHg3QkRCLCAweDEzMUEsIDB4N0JEQywgMHgyQzBBLCAweDdCREQsIDB4MkMwMSwKLSAgICAweDdCREUsIDB4MkJGRSwgMHg3QkRGLCAweDJDMEQsIDB4N0JFMCwgMHgxNDJELCAweDdCRTEsIDB4MTMxQiwKLSAgICAweDdCRTIsIDB4MkMwOSwgMHg3QkUzLCAweDJCRkYsIDB4N0JFNCwgMHgxMzE5LCAweDdCRTUsIDB4MkMwMywKLSAgICAweDdCRTYsIDB4MTMxRCwgMHg3QkU3LCAweDJDMDAsIDB4N0JFOCwgMHgyQzA1LCAweDdCRTksIDB4MTMxQywKLSAgICAweDdCRUEsIDB4MkMwOCwgMHg3QkVCLCAweDJDMEIsIDB4N0JGMCwgMHgyREU5LCAweDdCRjEsIDB4MkRFQSwKLSAgICAweDdCRjIsIDB4MkREQSwgMHg3QkYzLCAweDJERTEsIDB4N0JGNCwgMHgyRERGLCAweDdCRjcsIDB4MTQyQiwKLSAgICAweDdCRjgsIDB4MkRFNiwgMHg3QkY5LCAweDJDMDYsIDB4N0JGQiwgMHgyRERELCAweDdCRkQsIDB4MkRFNywKLSAgICAweDdCRkUsIDB4MTQyQSwgMHg3QkZGLCAweDJEREMsIDB4N0MwMCwgMHgyRERCLCAweDdDMDEsIDB4MkRFNSwKLSAgICAweDdDMDIsIDB4MkRFMiwgMHg3QzAzLCAweDJERTQsIDB4N0MwNSwgMHgyREQ4LCAweDdDMDYsIDB4MkRFOCwKLSAgICAweDdDMDcsIDB4MTQyOCwgMHg3QzA5LCAweDJERTMsIDB4N0MwQSwgMHgyREVDLCAweDdDMEIsIDB4MkRFMCwKLSAgICAweDdDMEMsIDB4MTQyQywgMHg3QzBELCAweDE0MjksIDB4N0MwRSwgMHgyRERFLCAweDdDMEYsIDB4MkREOSwKLSAgICAweDdDMTAsIDB4MkRFQiwgMHg3QzExLCAweDEzMTcsIDB4N0MxOSwgMHgyRjc4LCAweDdDMUMsIDB4MkY3NiwKLSAgICAweDdDMUQsIDB4MkY3QywgMHg3QzFFLCAweDE1MDgsIDB4N0MxRiwgMHgyRjdBLCAweDdDMjAsIDB4MkY3OSwKLSAgICAweDdDMjEsIDB4MTUwQSwgMHg3QzIyLCAweDJGN0YsIDB4N0MyMywgMHgxNTA5LCAweDdDMjUsIDB4MkY4MCwKLSAgICAweDdDMjYsIDB4MkY3RCwgMHg3QzI3LCAweDE1MDYsIDB4N0MyOCwgMHgyRjdFLCAweDdDMjksIDB4MkY3NywKLSAgICAweDdDMkEsIDB4MTUwNywgMHg3QzJCLCAweDE1MDUsIDB4N0MyQywgMHgzMEQ2LCAweDdDMkQsIDB4MkY3QiwKLSAgICAweDdDMzAsIDB4MkY4MSwgMHg3QzMzLCAweDMwRDMsIDB4N0MzNywgMHgxNUE3LCAweDdDMzgsIDB4MTVBNSwKLSAgICAweDdDMzksIDB4MzBENSwgMHg3QzNCLCAweDMwRDcsIDB4N0MzQywgMHgzMEQ0LCAweDdDM0QsIDB4MTVBNiwKLSAgICAweDdDM0UsIDB4MTVBMywgMHg3QzNGLCAweDE1QTQsIDB4N0M0MCwgMHgxNUE4LCAweDdDNDMsIDB4MTYyQiwKLSAgICAweDdDNDUsIDB4MzIxMiwgMHg3QzQ3LCAweDMyMTEsIDB4N0M0OCwgMHgzMjBGLCAweDdDNDksIDB4MzIwRSwKLSAgICAweDdDNEEsIDB4MzIxMCwgMHg3QzRDLCAweDE2MkEsIDB4N0M0RCwgMHgxNjJDLCAweDdDNTAsIDB4MTY4MSwKLSAgICAweDdDNTMsIDB4MzJFQSwgMHg3QzU0LCAweDMyRTksIDB4N0M1NywgMHgzMzlCLCAweDdDNTksIDB4MzM5RCwKLSAgICAweDdDNUEsIDB4MzM5RiwgMHg3QzVCLCAweDMzOUUsIDB4N0M1QywgMHgzMzlDLCAweDdDNUYsIDB4MTZEMSwKLSAgICAweDdDNjAsIDB4MTZEMCwgMHg3QzYzLCAweDE3MDEsIDB4N0M2NCwgMHgxNzAwLCAweDdDNjUsIDB4MTcwMiwKLSAgICAweDdDNjYsIDB4MzQyQiwgMHg3QzY3LCAweDM0MkEsIDB4N0M2OSwgMHgzNEQ2LCAweDdDNkEsIDB4MzQ5MywKLSAgICAweDdDNkIsIDB4MzRENywgMHg3QzZDLCAweDE3NDUsIDB4N0M2RSwgMHgxNzQ2LCAweDdDNkYsIDB4MzUwNywKLSAgICAweDdDNzIsIDB4MTc2QiwgMHg3QzczLCAweDAzRjcsIDB4N0M3NSwgMHgxQTI1LCAweDdDNzgsIDB4MUJCQiwKLSAgICAweDdDNzksIDB4MUJCQywgMHg3QzdBLCAweDFCQkEsIDB4N0M3RCwgMHgwN0NDLCAweDdDN0YsIDB4MUJCRCwKLSAgICAweDdDODAsIDB4MUJCRSwgMHg3QzgxLCAweDFCQkYsIDB4N0M4NCwgMHgxRDk2LCAweDdDODUsIDB4MUQ5QywKLSAgICAweDdDODgsIDB4MUQ5QSwgMHg3Qzg5LCAweDA5NkEsIDB4N0M4QSwgMHgxRDk4LCAweDdDOEMsIDB4MUQ5OSwKLSAgICAweDdDOEQsIDB4MUQ5QiwgMHg3QzkxLCAweDFEOTcsIDB4N0M5MiwgMHgwQjUwLCAweDdDOTQsIDB4MUZFMCwKLSAgICAweDdDOTUsIDB4MEI1MiwgMHg3Qzk2LCAweDFGRTIsIDB4N0M5NywgMHgwQjUxLCAweDdDOTgsIDB4MUZFMSwKLSAgICAweDdDOUUsIDB4MjI1RCwgMHg3QzlGLCAweDBEMEQsIDB4N0NBMSwgMHgyMjVGLCAweDdDQTIsIDB4MjI1QywKLSAgICAweDdDQTMsIDB4MUZFMywgMHg3Q0E1LCAweDBEMEUsIDB4N0NBNywgMHgzNkVELCAweDdDQTgsIDB4MjI1RSwKLSAgICAweDdDQUYsIDB4MjRGRSwgMHg3Q0IxLCAweDBFQkIsIDB4N0NCMiwgMHgyNEZDLCAweDdDQjMsIDB4MEVCQywKLSAgICAweDdDQjQsIDB4MjRGRCwgMHg3Q0I1LCAweDBFQkQsIDB4N0NCOSwgMHgxMDU4LCAweDdDQkEsIDB4Mjc3RCwKLSAgICAweDdDQkIsIDB4Mjc3QSwgMHg3Q0JDLCAweDI3N0MsIDB4N0NCRCwgMHgxMDU5LCAweDdDQkUsIDB4MTA1QSwKLSAgICAweDdDQkYsIDB4Mjc3QiwgMHg3Q0M1LCAweDI5QjAsIDB4N0NDOCwgMHgyOUIxLCAweDdDQ0EsIDB4MTFENCwKLSAgICAweDdDQ0IsIDB4MjlCMywgMHg3Q0NDLCAweDI5QjIsIDB4N0NDRSwgMHgwMTIxLCAweDdDRDAsIDB4MkMxMSwKLSAgICAweDdDRDEsIDB4MkMxMiwgMHg3Q0QyLCAweDJDMEUsIDB4N0NENCwgMHgyQzBGLCAweDdDRDUsIDB4MTMxRSwKLSAgICAweDdDRDYsIDB4MTMxRiwgMHg3Q0Q3LCAweDJDMTAsIDB4N0NEOSwgMHgxNDMzLCAweDdDREMsIDB4MTQyRiwKLSAgICAweDdDREQsIDB4MTQzNCwgMHg3Q0RFLCAweDE0MzAsIDB4N0NERiwgMHgxNDMyLCAweDdDRTAsIDB4MTQyRSwKLSAgICAweDdDRTIsIDB4MTQzMSwgMHg3Q0U3LCAweDE1MEIsIDB4N0NFOCwgMHgyREVELCAweDdDRUEsIDB4MzBEOSwKLSAgICAweDdDRUMsIDB4MzBEOCwgMHg3Q0VFLCAweDMyMTMsIDB4N0NFRiwgMHgxNjJELCAweDdDRjAsIDB4MTYyRSwKLSAgICAweDdDRjEsIDB4MzNBMSwgMHg3Q0YyLCAweDMyRUIsIDB4N0NGNCwgMHgzM0EwLCAweDdDRjYsIDB4MzREOCwKLSAgICAweDdDRjcsIDB4MzUxRCwgMHg3Q0Y4LCAweDAzRjgsIDB4N0NGQiwgMHgwNEZCLCAweDdDRkQsIDB4MUEyNiwKLSAgICAweDdDRkUsIDB4MDY2NywgMHg3RDAwLCAweDA3Q0YsIDB4N0QwMSwgMHgxQkMyLCAweDdEMDIsIDB4MDdDRCwKLSAgICAweDdEMDMsIDB4MUJDMCwgMHg3RDA0LCAweDA3RDIsIDB4N0QwNSwgMHgwN0NFLCAweDdEMDYsIDB4MDdEMywKLSAgICAweDdEMDcsIDB4MDdEMSwgMHg3RDA4LCAweDFCQzEsIDB4N0QwOSwgMHgwN0QwLCAweDdEMEEsIDB4MDk2RSwKLSAgICAweDdEMEIsIDB4MDk2RCwgMHg3RDBDLCAweDFEQTcsIDB4N0QwRCwgMHgwOTc2LCAweDdEMEUsIDB4MURBMCwKLSAgICAweDdEMEYsIDB4MURBNiwgMHg3RDEwLCAweDA5NzIsIDB4N0QxMSwgMHgxRDlGLCAweDdEMTIsIDB4MURBNSwKLSAgICAweDdEMTMsIDB4MURBMywgMHg3RDE0LCAweDA5NzEsIDB4N0QxNSwgMHgwOTczLCAweDdEMTYsIDB4MURBMiwKLSAgICAweDdEMTcsIDB4MDk2QywgMHg3RDE4LCAweDFEQTEsIDB4N0QxOSwgMHgwOTc3LCAweDdEMUEsIDB4MDk3NCwKLSAgICAweDdEMUIsIDB4MDk3OCwgMHg3RDFDLCAweDA5NzUsIDB4N0QxRCwgMHgxRDlFLCAweDdEMUUsIDB4MUQ5RCwKLSAgICAweDdEMUYsIDB4MURBNCwgMHg3RDIwLCAweDA5NkYsIDB4N0QyMSwgMHgwOTZCLCAweDdEMjIsIDB4MDk3MCwKLSAgICAweDdEMjgsIDB4MUZGMiwgMHg3RDI5LCAweDFGRUIsIDB4N0QyQiwgMHgwRDEzLCAweDdEMkMsIDB4MUZFQSwKLSAgICAweDdEMkUsIDB4MEI1NiwgMHg3RDJGLCAweDBCNUQsIDB4N0QzMCwgMHgwQjVBLCAweDdEMzEsIDB4MEI2MCwKLSAgICAweDdEMzIsIDB4MEI1RiwgMHg3RDMzLCAweDBCNUIsIDB4N0QzNSwgMHgxRkU0LCAweDdEMzYsIDB4MUZFNywKLSAgICAweDdEMzgsIDB4MUZFNiwgMHg3RDM5LCAweDBCNTcsIDB4N0QzQSwgMHgxRkU4LCAweDdEM0IsIDB4MUZGMSwKLSAgICAweDdEM0MsIDB4MEI1OCwgMHg3RDNELCAweDFGRTUsIDB4N0QzRSwgMHgxRkVFLCAweDdEM0YsIDB4MUZFRiwKLSAgICAweDdENDAsIDB4MEI1OSwgMHg3RDQxLCAweDFGRUMsIDB4N0Q0MiwgMHgwQjVFLCAweDdENDMsIDB4MEI1NCwKLSAgICAweDdENDQsIDB4MEI1QywgMHg3RDQ1LCAweDFGRTksIDB4N0Q0NiwgMHgwQjUzLCAweDdENDcsIDB4MUZFRCwKLSAgICAweDdENEEsIDB4MUZGMCwgMHg3RDRFLCAweDIyNzAsIDB4N0Q0RiwgMHgyMjY3LCAweDdENTAsIDB4MEQxMCwKLSAgICAweDdENTEsIDB4MjI2RSwgMHg3RDUyLCAweDIyNkIsIDB4N0Q1MywgMHgyMjYzLCAweDdENTQsIDB4MjI2QywKLSAgICAweDdENTUsIDB4MEQxMiwgMHg3RDU2LCAweDIyNjQsIDB4N0Q1OCwgMHgyMjYwLCAweDdENUIsIDB4MEVDMywKLSAgICAweDdENUMsIDB4MjI2OSwgMHg3RDVFLCAweDBEMEYsIDB4N0Q1RiwgMHgyMjZGLCAweDdENjEsIDB4MEQxNiwKLSAgICAweDdENjIsIDB4MEQxOCwgMHg3RDYzLCAweDIyNjIsIDB4N0Q2NiwgMHgwRDE3LCAweDdENjcsIDB4MjI2NSwKLSAgICAweDdENjgsIDB4MEQxMSwgMHg3RDY5LCAweDIyNkQsIDB4N0Q2QSwgMHgyMjY2LCAweDdENkIsIDB4MjI2QSwKLSAgICAweDdENkQsIDB4MjI2OCwgMHg3RDZFLCAweDBEMTQsIDB4N0Q2RiwgMHgyMjYxLCAweDdENzAsIDB4MEQxOSwKLSAgICAweDdENzEsIDB4MEI1NSwgMHg3RDcyLCAweDBEMTUsIDB4N0Q3MywgMHgwRDFBLCAweDdENzksIDB4MEVCRiwKLSAgICAweDdEN0EsIDB4MjUwNSwgMHg3RDdCLCAweDI1MDcsIDB4N0Q3QywgMHgyNTA5LCAweDdEN0QsIDB4MjUwRCwKLSAgICAweDdEN0YsIDB4MjUwMywgMHg3RDgwLCAweDI1MDEsIDB4N0Q4MSwgMHgwRUMxLCAweDdEODMsIDB4MjUwOCwKLSAgICAweDdEODQsIDB4MjUwQywgMHg3RDg1LCAweDI1MDQsIDB4N0Q4NiwgMHgyNTAwLCAweDdEODgsIDB4MjRGRiwKLSAgICAweDdEOEMsIDB4MjUwQSwgMHg3RDhELCAweDI1MDIsIDB4N0Q4RSwgMHgyNTA2LCAweDdEOEYsIDB4MEVDMiwKLSAgICAweDdEOTEsIDB4MEVDMCwgMHg3RDkyLCAweDI1MEUsIDB4N0Q5MywgMHgwRUJFLCAweDdEOTQsIDB4MjUwQiwKLSAgICAweDdEOTYsIDB4Mjc4RSwgMHg3RDlDLCAweDEwNUQsIDB4N0Q5RCwgMHgyNzg2LCAweDdEOUUsIDB4MTFFMSwKLSAgICAweDdEOUYsIDB4Mjc5MCwgMHg3REEwLCAweDEwNjAsIDB4N0RBMSwgMHgyNzk0LCAweDdEQTIsIDB4MTA2NiwKLSAgICAweDdEQTMsIDB4Mjc4MSwgMHg3REE2LCAweDI3OTEsIDB4N0RBNywgMHgyNzdFLCAweDdEQTksIDB4Mjc5MywKLSAgICAweDdEQUEsIDB4Mjc4MiwgMHg3REFDLCAweDEwNkQsIDB4N0RBRCwgMHgxMDZBLCAweDdEQUUsIDB4Mjc5MiwKLSAgICAweDdEQUYsIDB4Mjc4QywgMHg3REIwLCAweDEwNUMsIDB4N0RCMSwgMHgxMDY0LCAweDdEQjIsIDB4MTA2MywKLSAgICAweDdEQjQsIDB4MTA2MiwgMHg3REI1LCAweDEwNjgsIDB4N0RCNywgMHgyNzdGLCAweDdEQjgsIDB4MTA2OSwKLSAgICAweDdEQjksIDB4Mjc4RCwgMHg3REJBLCAweDEwNjUsIDB4N0RCQiwgMHgxMDVCLCAweDdEQkMsIDB4Mjc4RiwKLSAgICAweDdEQkQsIDB4MTA1RSwgMHg3REJFLCAweDEwNUYsIDB4N0RCRiwgMHgxMDY3LCAweDdEQzAsIDB4Mjc4NCwKLSAgICAweDdEQzEsIDB4Mjc4MywgMHg3REMyLCAweDI3ODAsIDB4N0RDNCwgMHgyNzg4LCAweDdEQzUsIDB4Mjc4NSwKLSAgICAweDdEQzYsIDB4Mjc4OSwgMHg3REM3LCAweDEwNkMsIDB4N0RDOSwgMHgyNzk1LCAweDdEQ0EsIDB4MTA2MSwKLSAgICAweDdEQ0IsIDB4Mjc4QSwgMHg3RENDLCAweDI3OEIsIDB4N0RDRSwgMHgyNzg3LCAweDdERDIsIDB4MTA2QiwKLSAgICAweDdERDcsIDB4MjlCOCwgMHg3REQ4LCAweDExRDksIDB4N0REOSwgMHgxMUUyLCAweDdEREEsIDB4MTFERSwKLSAgICAweDdEREIsIDB4MjlCNSwgMHg3RERELCAweDExREIsIDB4N0RERSwgMHgxMURGLCAweDdEREYsIDB4MjlDMSwKLSAgICAweDdERTAsIDB4MTFENSwgMHg3REUxLCAweDI5QjksIDB4N0RFMywgMHgxMURELCAweDdERTYsIDB4MjlCQywKLSAgICAweDdERTcsIDB4MjlCNywgMHg3REU4LCAweDExREMsIDB4N0RFOSwgMHgxMUUwLCAweDdERUEsIDB4MjlCNiwKLSAgICAweDdERUMsIDB4MTFEQSwgMHg3REVFLCAweDI5QzAsIDB4N0RFRiwgMHgxMUQ3LCAweDdERjAsIDB4MjlCRiwKLSAgICAweDdERjEsIDB4MjlCRSwgMHg3REYyLCAweDExRTMsIDB4N0RGMywgMHgyOEM4LCAweDdERjQsIDB4MTFENiwKLSAgICAweDdERjYsIDB4MjlCRCwgMHg3REY3LCAweDI5QjQsIDB4N0RGOSwgMHgxMUU0LCAweDdERkEsIDB4MjlCQiwKLSAgICAweDdERkIsIDB4MTFEOCwgMHg3RTAzLCAweDI5QkEsIDB4N0UwOCwgMHgxMzIyLCAweDdFMDksIDB4MTMyNywKLSAgICAweDdFMEEsIDB4MTMyMCwgMHg3RTBCLCAweDJDMUYsIDB4N0UwQywgMHgyQzE2LCAweDdFMEQsIDB4MkMyMiwKLSAgICAweDdFMEUsIDB4MkMxQSwgMHg3RTBGLCAweDJDMjAsIDB4N0UxMCwgMHgxMzI4LCAweDdFMTEsIDB4MTMyMSwKLSAgICAweDdFMTIsIDB4MkMxMywgMHg3RTEzLCAweDJDMTksIDB4N0UxNCwgMHgyQzIzLCAweDdFMTUsIDB4MkMxQywKLSAgICAweDdFMTYsIDB4MkMyMSwgMHg3RTE3LCAweDJDMTUsIDB4N0UxQSwgMHgyQzFELCAweDdFMUIsIDB4MTMyMywKLSAgICAweDdFMUMsIDB4MkMxQiwgMHg3RTFELCAweDEzMjYsIDB4N0UxRSwgMHgxMzI1LCAweDdFMUYsIDB4MkMxNywKLSAgICAweDdFMjAsIDB4MkMxOCwgMHg3RTIxLCAweDJDMTQsIDB4N0UyMiwgMHgyQzFFLCAweDdFMjMsIDB4MTMyNCwKLSAgICAweDdFMjQsIDB4MkMyNSwgMHg3RTI1LCAweDJDMjQsIDB4N0UyOSwgMHgyREY4LCAweDdFMkEsIDB4MkRGNCwKLSAgICAweDdFMkIsIDB4MTQzQiwgMHg3RTJELCAweDJERUUsIDB4N0UyRSwgMHgxNDM1LCAweDdFMkYsIDB4MTQ0NSwKLSAgICAweDdFMzAsIDB4MkRGQSwgMHg3RTMxLCAweDE0M0QsIDB4N0UzMiwgMHgxNDM5LCAweDdFMzMsIDB4MkRGMSwKLSAgICAweDdFMzQsIDB4MTQ0MCwgMHg3RTM1LCAweDE0NDMsIDB4N0UzNiwgMHgyREZDLCAweDdFMzcsIDB4MTQzOCwKLSAgICAweDdFMzgsIDB4MkRGMywgMHg3RTM5LCAweDE0NDEsIDB4N0UzQSwgMHgyREZFLCAweDdFM0IsIDB4MkRGQiwKLSAgICAweDdFM0MsIDB4MkRFRiwgMHg3RTNELCAweDE0M0MsIDB4N0UzRSwgMHgxNDM2LCAweDdFM0YsIDB4MTQ0NCwKLSAgICAweDdFNDAsIDB4MkRGNiwgMHg3RTQxLCAweDE0M0YsIDB4N0U0MiwgMHgyREYwLCAweDdFNDMsIDB4MTQzQSwKLSAgICAweDdFNDQsIDB4MkRGRCwgMHg3RTQ1LCAweDE0M0UsIDB4N0U0NiwgMHgxNDM3LCAweDdFNDcsIDB4MkRGNywKLSAgICAweDdFNDgsIDB4MTQ0MiwgMHg3RTQ5LCAweDJERjUsIDB4N0U0QywgMHgyREY5LCAweDdFNTAsIDB4MkY4MywKLSAgICAweDdFNTEsIDB4MkY4OSwgMHg3RTUyLCAweDE1MTEsIDB4N0U1MywgMHgyRjhDLCAweDdFNTQsIDB4MTUwQywKLSAgICAweDdFNTUsIDB4MTUwRCwgMHg3RTU2LCAweDJGODQsIDB4N0U1NywgMHgyRjhCLCAweDdFNTgsIDB4MkY4NiwKLSAgICAweDdFNTksIDB4MTUxMiwgMHg3RTVBLCAweDE1MEYsIDB4N0U1QywgMHgyRjgyLCAweDdFNUUsIDB4MTUwRSwKLSAgICAweDdFNUYsIDB4MkY4OCwgMHg3RTYwLCAweDJGOEEsIDB4N0U2MSwgMHgxNTEwLCAweDdFNjIsIDB4MkY4NywKLSAgICAweDdFNjMsIDB4MkY4NSwgMHg3RTY4LCAweDMwRTMsIDB4N0U2OSwgMHgxNUFDLCAweDdFNkEsIDB4MTVBRCwKLSAgICAweDdFNkIsIDB4MTVBOSwgMHg3RTZELCAweDE1QUEsIDB4N0U2RiwgMHgzMERGLCAweDdFNzAsIDB4MzBERCwKLSAgICAweDdFNzIsIDB4MzBFMSwgMHg3RTczLCAweDE1QUUsIDB4N0U3NCwgMHgzMEUyLCAweDdFNzUsIDB4MzBEQiwKLSAgICAweDdFNzYsIDB4MzBEQSwgMHg3RTc3LCAweDMwREUsIDB4N0U3OCwgMHgzMERDLCAweDdFNzksIDB4MTVBQiwKLSAgICAweDdFN0EsIDB4MzBFMCwgMHg3RTdCLCAweDMyMTQsIDB4N0U3QywgMHgxNjMxLCAweDdFN0QsIDB4MTYzMCwKLSAgICAweDdFN0UsIDB4MzIxNSwgMHg3RTgwLCAweDMyMTcsIDB4N0U4MSwgMHgzMjE2LCAweDdFODIsIDB4MTYzMiwKLSAgICAweDdFODYsIDB4MzJGMCwgMHg3RTg3LCAweDMyRUQsIDB4N0U4OCwgMHgzMkVFLCAweDdFOEEsIDB4MzJFQywKLSAgICAweDdFOEIsIDB4MzJFRiwgMHg3RThDLCAweDE2ODMsIDB4N0U4RCwgMHgzMkYxLCAweDdFOEYsIDB4MTY4MiwKLSAgICAweDdFOTEsIDB4MzNBMiwgMHg3RTkzLCAweDE3MDMsIDB4N0U5NCwgMHgxNzA1LCAweDdFOTUsIDB4MzQyQywKLSAgICAweDdFOTYsIDB4MTcwNCwgMHg3RTk3LCAweDM0OTQsIDB4N0U5OCwgMHgzNERBLCAweDdFOTksIDB4MzREQywKLSAgICAweDdFOUEsIDB4MzREOSwgMHg3RTlCLCAweDM0REIsIDB4N0U5QywgMHgxNzU5LCAweDdGMzYsIDB4MDNGOSwKLSAgICAweDdGMzgsIDB4MDdENCwgMHg3RjM5LCAweDFEMUYsIDB4N0YzQSwgMHgwOTc5LCAweDdGM0QsIDB4MEI2MSwKLSAgICAweDdGM0UsIDB4MjI3MSwgMHg3RjNGLCAweDIyNzIsIDB4N0Y0MywgMHgyQzI2LCAweDdGNDQsIDB4MTQ0NiwKLSAgICAweDdGNDUsIDB4MkRGRiwgMHg3RjQ4LCAweDE1MTMsIDB4N0Y0QSwgMHgzMEU1LCAweDdGNEIsIDB4MzBFNCwKLSAgICAweDdGNEMsIDB4MTYzMywgMHg3RjRELCAweDMyRjIsIDB4N0Y0RiwgMHgzM0EzLCAweDdGNTAsIDB4MTcyNiwKLSAgICAweDdGNTEsIDB4MTgxMiwgMHg3RjU0LCAweDA2NjgsIDB4N0Y1NSwgMHgwNEZDLCAweDdGNTgsIDB4MUJDMywKLSAgICAweDdGNUIsIDB4MURBRCwgMHg3RjVDLCAweDFEQTgsIDB4N0Y1RCwgMHgxREFDLCAweDdGNUUsIDB4MURBQSwKLSAgICAweDdGNUYsIDB4MDk3QSwgMHg3RjYwLCAweDFEQUIsIDB4N0Y2MSwgMHgxREE5LCAweDdGNjMsIDB4MUZGMywKLSAgICAweDdGNjUsIDB4MjI3MywgMHg3RjY2LCAweDIyNzQsIDB4N0Y2NywgMHgyNTExLCAweDdGNjgsIDB4MjUxMiwKLSAgICAweDdGNjksIDB4MEVDNSwgMHg3RjZBLCAweDBFQzYsIDB4N0Y2QiwgMHgyNTEwLCAweDdGNkMsIDB4MjUxMywKLSAgICAweDdGNkQsIDB4MjUwRiwgMHg3RjZFLCAweDBFQzQsIDB4N0Y3MCwgMHgxMDZFLCAweDdGNzIsIDB4MEVDNywKLSAgICAweDdGNzMsIDB4Mjc5NiwgMHg3Rjc1LCAweDExRTUsIDB4N0Y3NiwgMHgyOUMyLCAweDdGNzcsIDB4MTFFNiwKLSAgICAweDdGNzksIDB4MTMyOSwgMHg3RjdBLCAweDJDMjksIDB4N0Y3QiwgMHgyQzI3LCAweDdGN0MsIDB4MkMyOCwKLSAgICAweDdGN0QsIDB4MkUwMiwgMHg3RjdFLCAweDJFMDEsIDB4N0Y3RiwgMHgyRTAwLCAweDdGODMsIDB4MzBFNiwKLSAgICAweDdGODUsIDB4MTVBRiwgMHg3Rjg2LCAweDMwRTcsIDB4N0Y4NywgMHgzM0E0LCAweDdGODgsIDB4MTcyNywKLSAgICAweDdGODksIDB4MzQ5NSwgMHg3RjhBLCAweDAzRkEsIDB4N0Y4QiwgMHgwNjZBLCAweDdGOEMsIDB4MDY2OSwKLSAgICAweDdGOEQsIDB4MUJDNSwgMHg3RjhFLCAweDA3RDUsIDB4N0Y5MSwgMHgxQkM0LCAweDdGOTIsIDB4MURBRiwKLSAgICAweDdGOTQsIDB4MDk3QiwgMHg3Rjk1LCAweDFGRjQsIDB4N0Y5NiwgMHgxREFFLCAweDdGOUEsIDB4MEI2MywKLSAgICAweDdGOUIsIDB4MUZGNywgMHg3RjlDLCAweDFGRjUsIDB4N0Y5RCwgMHgxRkY2LCAweDdGOUUsIDB4MEI2MiwKLSAgICAweDdGQTAsIDB4MjI3NiwgMHg3RkExLCAweDIyNzcsIDB4N0ZBMiwgMHgyMjc1LCAweDdGQTQsIDB4MEVDQSwKLSAgICAweDdGQTUsIDB4MjUxNSwgMHg3RkE2LCAweDI1MTQsIDB4N0ZBNywgMHgyNTE2LCAweDdGQTgsIDB4MEVDOSwKLSAgICAweDdGQTksIDB4MEVDOCwgMHg3RkFDLCAweDI5QzMsIDB4N0ZBRCwgMHgyOUM1LCAweDdGQUYsIDB4MTFFNywKLSAgICAweDdGQjAsIDB4MjlDNCwgMHg3RkIxLCAweDJDMkEsIDB4N0ZCMiwgMHgxMzJBLCAweDdGQjMsIDB4MkY4RSwKLSAgICAweDdGQjUsIDB4MkY4RCwgMHg3RkI2LCAweDE1QjAsIDB4N0ZCNywgMHgzMEU4LCAweDdGQjgsIDB4MTVCMiwKLSAgICAweDdGQjksIDB4MTVCMSwgMHg3RkJBLCAweDMyMTgsIDB4N0ZCQiwgMHgzMkYzLCAweDdGQkMsIDB4MTY4NCwKLSAgICAweDdGQkQsIDB4MDNGQiwgMHg3RkJFLCAweDFCQzYsIDB4N0ZCRiwgMHgwN0Q2LCAweDdGQzAsIDB4MURCMiwKLSAgICAweDdGQzEsIDB4MDk3RCwgMHg3RkMyLCAweDFEQjEsIDB4N0ZDMywgMHgxREIwLCAweDdGQzUsIDB4MDk3QywKLSAgICAweDdGQzcsIDB4MUZGRCwgMHg3RkM5LCAweDFGRkYsIDB4N0ZDQSwgMHgxRkY4LCAweDdGQ0IsIDB4MUZGOSwKLSAgICAweDdGQ0MsIDB4MEI2NCwgMHg3RkNELCAweDFGRkEsIDB4N0ZDRSwgMHgwQjY1LCAweDdGQ0YsIDB4MUZGRSwKLSAgICAweDdGRDAsIDB4MUZGQiwgMHg3RkQxLCAweDFGRkMsIDB4N0ZEMiwgMHgwQjY2LCAweDdGRDQsIDB4MEQxQywKLSAgICAweDdGRDUsIDB4MEQxRCwgMHg3RkQ3LCAweDIyNzgsIDB4N0ZEQiwgMHgyNTE3LCAweDdGREMsIDB4MjUxOCwKLSAgICAweDdGREUsIDB4Mjc5QSwgMHg3RkRGLCAweDEwNzEsIDB4N0ZFMCwgMHgxMDZGLCAweDdGRTEsIDB4MTA3MCwKLSAgICAweDdGRTIsIDB4Mjc5NywgMHg3RkUzLCAweDI3OTgsIDB4N0ZFNSwgMHgyNzk5LCAweDdGRTYsIDB4MjlDQSwKLSAgICAweDdGRTgsIDB4MjlDQiwgMHg3RkU5LCAweDExRTgsIDB4N0ZFQSwgMHgyOUM4LCAweDdGRUIsIDB4MjlDNywKLSAgICAweDdGRUMsIDB4MjlDOSwgMHg3RkVELCAweDI5QzYsIDB4N0ZFRSwgMHgxMzJELCAweDdGRUYsIDB4MkMyQiwKLSAgICAweDdGRjAsIDB4MTMyQiwgMHg3RkYxLCAweDEzMkMsIDB4N0ZGMiwgMHgyRTA0LCAweDdGRjMsIDB4MTQ0NywKLSAgICAweDdGRjQsIDB4MkUwMywgMHg3RkY1LCAweDJFRkYsIDB4N0ZGNywgMHgyRjhGLCAweDdGRjgsIDB4MkY5MCwKLSAgICAweDdGRjksIDB4MTUxNCwgMHg3RkZCLCAweDE1MTUsIDB4N0ZGQywgMHgxNDQ4LCAweDdGRkQsIDB4MzBFOSwKLSAgICAweDdGRkUsIDB4MzBFQSwgMHg3RkZGLCAweDMyMTksIDB4ODAwMCwgMHgxNjM0LCAweDgwMDEsIDB4MDNGQywKLSAgICAweDgwMDMsIDB4MDNGRCwgMHg4MDA0LCAweDA5N0YsIDB4ODAwNSwgMHgwNjZCLCAweDgwMDYsIDB4MDk3RSwKLSAgICAweDgwMDcsIDB4MUJDNywgMHg4MDBCLCAweDBEMUUsIDB4ODAwQywgMHgwM0ZFLCAweDgwMEQsIDB4MDdEOCwKLSAgICAweDgwMEUsIDB4MUJDOCwgMHg4MDBGLCAweDFCQzksIDB4ODAxMCwgMHgwN0Q3LCAweDgwMTEsIDB4MDdEOSwKLSAgICAweDgwMTIsIDB4MDNGRiwgMHg4MDE0LCAweDFCQ0EsIDB4ODAxNSwgMHgwOTgxLCAweDgwMTYsIDB4MURCMywKLSAgICAweDgwMTcsIDB4MDk4MywgMHg4MDE4LCAweDA5ODAsIDB4ODAxOSwgMHgwOTgyLCAweDgwMUIsIDB4MjAwMiwKLSAgICAweDgwMUMsIDB4MEI2NywgMHg4MDFFLCAweDIwMDEsIDB4ODAxRiwgMHgyMDAwLCAweDgwMjEsIDB4MjUxOSwKLSAgICAweDgwMjQsIDB4Mjc5QiwgMHg4MDI2LCAweDExRTksIDB4ODAyOCwgMHgxMzJFLCAweDgwMjksIDB4MkMyRCwKLSAgICAweDgwMkEsIDB4MkMyQywgMHg4MDJDLCAweDJFMDUsIDB4ODAzMCwgMHgzMkY0LCAweDgwMzMsIDB4MDQwMCwKLSAgICAweDgwMzQsIDB4MThEOCwgMHg4MDM1LCAweDFBMjcsIDB4ODAzNiwgMHgwN0RBLCAweDgwMzcsIDB4MUJDQiwKLSAgICAweDgwMzksIDB4MURCNSwgMHg4MDNELCAweDA5ODQsIDB4ODAzRSwgMHgxREI0LCAweDgwM0YsIDB4MDk4NSwKLSAgICAweDgwNDMsIDB4MjAwNCwgMHg4MDQ2LCAweDBCNjksIDB4ODA0NywgMHgyMDAzLCAweDgwNDgsIDB4MjAwNSwKLSAgICAweDgwNEEsIDB4MEI2OCwgMHg4MDRGLCAweDIyN0EsIDB4ODA1MCwgMHgyMjdCLCAweDgwNTEsIDB4MjI3OSwKLSAgICAweDgwNTIsIDB4MEQxRiwgMHg4MDU2LCAweDBFQ0IsIDB4ODA1OCwgMHgwRUNDLCAweDgwNUEsIDB4MTA3MywKLSAgICAweDgwNUMsIDB4Mjc5RCwgMHg4MDVELCAweDI3OUMsIDB4ODA1RSwgMHgxMDcyLCAweDgwNjQsIDB4MjlDQywKLSAgICAweDgwNjcsIDB4MjlDRCwgMHg4MDZDLCAweDJDMkUsIDB4ODA2RiwgMHgxNDRDLCAweDgwNzAsIDB4MTQ0QiwKLSAgICAweDgwNzEsIDB4MTQ0OSwgMHg4MDcyLCAweDE0NEEsIDB4ODA3MywgMHgxNDRELCAweDgwNzUsIDB4MkY5MSwKLSAgICAweDgwNzYsIDB4MTUxNywgMHg4MDc3LCAweDE1MTYsIDB4ODA3OCwgMHgzMEVCLCAweDgwNzksIDB4MzIxQSwKLSAgICAweDgwN0QsIDB4MTZEMywgMHg4MDdFLCAweDE2RDIsIDB4ODA3RiwgMHgwNDAxLCAweDgwODIsIDB4MUNFQywKLSAgICAweDgwODQsIDB4MEVDRSwgMHg4MDg1LCAweDBEMjAsIDB4ODA4NiwgMHgwRUNELCAweDgwODcsIDB4MTA3NCwKLSAgICAweDgwODksIDB4MDQwMiwgMHg4MDhBLCAweDE3QjMsIDB4ODA4QiwgMHgwNDAzLCAweDgwOEMsIDB4MDQwNCwKLSAgICAweDgwOEYsIDB4MUEyOCwgMHg4MDkwLCAweDE4REIsIDB4ODA5MiwgMHgxOERDLCAweDgwOTMsIDB4MDRGRSwKLSAgICAweDgwOTUsIDB4MThEOSwgMHg4MDk2LCAweDA0RkQsIDB4ODA5OCwgMHgwNTAwLCAweDgwOTksIDB4MThEQSwKLSAgICAweDgwOUEsIDB4MDUwMiwgMHg4MDlCLCAweDA1MDEsIDB4ODA5QywgMHgxOERELCAweDgwOUQsIDB4MDRGRiwKLSAgICAweDgwQTEsIDB4MDY3MCwgMHg4MEEyLCAweDA2NkUsIDB4ODBBMywgMHgxQTJBLCAweDgwQTUsIDB4MDY2RCwKLSAgICAweDgwQTksIDB4MDY3MiwgMHg4MEFBLCAweDA2NzQsIDB4ODBBQiwgMHgwNjcxLCAweDgwQUQsIDB4MUEyRCwKLSAgICAweDgwQUUsIDB4MUEyOSwgMHg4MEFGLCAweDA2NzUsIDB4ODBCMSwgMHgwNjZGLCAweDgwQjIsIDB4MDUwMywKLSAgICAweDgwQjQsIDB4MDY3MywgMHg4MEI1LCAweDFBMkMsIDB4ODBCOCwgMHgxQTJCLCAweDgwQkEsIDB4MDY2QywKLSAgICAweDgwQzIsIDB4MUJEMSwgMHg4MEMzLCAweDA3REUsIDB4ODBDNCwgMHgwN0RGLCAweDgwQzUsIDB4MUJEMywKLSAgICAweDgwQzcsIDB4MUJDRCwgMHg4MEM4LCAweDFCRDAsIDB4ODBDOSwgMHgxQkQ5LCAweDgwQ0EsIDB4MUJENywKLSAgICAweDgwQ0MsIDB4MDdFMCwgMHg4MENELCAweDFCREQsIDB4ODBDRSwgMHgwN0UzLCAweDgwQ0YsIDB4MUJEQSwKLSAgICAweDgwRDAsIDB4MUJEMiwgMHg4MEQxLCAweDFCQ0YsIDB4ODBENCwgMHgyMjdELCAweDgwRDUsIDB4MUJEOCwKLSAgICAweDgwRDYsIDB4MDdEQiwgMHg4MEQ3LCAweDFCREIsIDB4ODBEOCwgMHgxQkNDLCAweDgwRDksIDB4MUJENSwKLSAgICAweDgwREEsIDB4MDdERCwgMHg4MERCLCAweDA3RTIsIDB4ODBEQywgMHgxQkQ2LCAweDgwREQsIDB4MDdFNiwKLSAgICAweDgwREUsIDB4MDdFNCwgMHg4MEUwLCAweDFCQ0UsIDB4ODBFMSwgMHgwN0UxLCAweDgwRTMsIDB4MUJENCwKLSAgICAweDgwRTQsIDB4MDdFNSwgMHg4MEU1LCAweDA3REMsIDB4ODBFNiwgMHgxQkRDLCAweDgwRUQsIDB4MDk4QSwKLSAgICAweDgwRUYsIDB4MDk5MywgMHg4MEYwLCAweDA5ODgsIDB4ODBGMSwgMHgwOTg2LCAweDgwRjIsIDB4MURCNywKLSAgICAweDgwRjMsIDB4MDk4RSwgMHg4MEY0LCAweDA5OEIsIDB4ODBGNSwgMHgxREI5LCAweDgwRjgsIDB4MDk4RCwKLSAgICAweDgwRjksIDB4MURCOCwgMHg4MEZBLCAweDFEQjYsIDB4ODBGQiwgMHgxREJCLCAweDgwRkMsIDB4MDk5MiwKLSAgICAweDgwRkQsIDB4MDk5MCwgMHg4MEZFLCAweDIyN0MsIDB4ODEwMCwgMHgxREJDLCAweDgxMDEsIDB4MURCQSwKLSAgICAweDgxMDIsIDB4MDk4NywgMHg4MTA1LCAweDA5ODksIDB4ODEwNiwgMHgwOThDLCAweDgxMDgsIDB4MDk4RiwKLSAgICAweDgxMEEsIDB4MDk5MSwgMHg4MTE1LCAweDIwMEYsIDB4ODExNiwgMHgwQjZCLCAweDgxMTgsIDB4MjAwNiwKLSAgICAweDgxMTksIDB4MjAwOCwgMHg4MTFCLCAweDIwMDksIDB4ODExRCwgMHgyMDExLCAweDgxMUUsIDB4MjAwRCwKLSAgICAweDgxMUYsIDB4MjAwQiwgMHg4MTIxLCAweDIwMEUsIDB4ODEyMiwgMHgyMDEyLCAweDgxMjMsIDB4MEI2QywKLSAgICAweDgxMjQsIDB4MEI3MCwgMHg4MTI1LCAweDIwMDcsIDB4ODEyNywgMHgyMDEwLCAweDgxMjksIDB4MEI2RSwKLSAgICAweDgxMkIsIDB4MEI2RCwgMHg4MTJDLCAweDIwMEMsIDB4ODEyRCwgMHgyMDBBLCAweDgxMkYsIDB4MEI2QSwKLSAgICAweDgxMzAsIDB4MEI2RiwgMHg4MTM5LCAweDBEMjYsIDB4ODEzQSwgMHgyMjg1LCAweDgxM0QsIDB4MjI4MywKLSAgICAweDgxM0UsIDB4MEQyOCwgMHg4MTQzLCAweDIyN0UsIDB4ODE0NCwgMHgyNTI3LCAweDgxNDYsIDB4MEQyNywKLSAgICAweDgxNDcsIDB4MjI4MiwgMHg4MTRBLCAweDIyN0YsIDB4ODE0QiwgMHgwRDIzLCAweDgxNEMsIDB4MEQyOSwKLSAgICAweDgxNEQsIDB4MjI4NCwgMHg4MTRFLCAweDBEMjUsIDB4ODE0RiwgMHgyMjgxLCAweDgxNTAsIDB4MTA3NSwKLSAgICAweDgxNTEsIDB4MEQyNCwgMHg4MTUyLCAweDIyODAsIDB4ODE1MywgMHgwRDJBLCAweDgxNTQsIDB4MEQyMiwKLSAgICAweDgxNTUsIDB4MEQyMSwgMHg4MTVCLCAweDI1MUYsIDB4ODE1QywgMHgyNTFELCAweDgxNUUsIDB4MjUyMywKLSAgICAweDgxNjAsIDB4MjUxQiwgMHg4MTYxLCAweDI1MjgsIDB4ODE2MiwgMHgyNTIwLCAweDgxNjQsIDB4MjUxQSwKLSAgICAweDgxNjUsIDB4MEVEMiwgMHg4MTY2LCAweDBFRDgsIDB4ODE2NywgMHgyNTI1LCAweDgxNjksIDB4MjUxRSwKLSAgICAweDgxNkIsIDB4MEVENSwgMHg4MTZFLCAweDBFRDMsIDB4ODE2RiwgMHgyNTI2LCAweDgxNzAsIDB4MEVEMCwKLSAgICAweDgxNzEsIDB4MEVDRiwgMHg4MTcyLCAweDI1MjEsIDB4ODE3MywgMHgwRUQ0LCAweDgxNzQsIDB4MEQyQiwKLSAgICAweDgxNzYsIDB4MjUyNCwgMHg4MTc3LCAweDI1MUMsIDB4ODE3OCwgMHgwRUQxLCAweDgxNzksIDB4MEVENiwKLSAgICAweDgxN0EsIDB4MEVENywgMHg4MTdGLCAweDEwN0EsIDB4ODE4MCwgMHgxMDc2LCAweDgxODIsIDB4MTA3QiwKLSAgICAweDgxODMsIDB4MjdBMCwgMHg4MTg2LCAweDI3OUYsIDB4ODE4NywgMHgyN0ExLCAweDgxODgsIDB4MTA3OCwKLSAgICAweDgxODksIDB4Mjc5RSwgMHg4MThBLCAweDEwNzksIDB4ODE4QiwgMHgyN0E0LCAweDgxOEMsIDB4MjdBMywKLSAgICAweDgxOEQsIDB4MjdBMiwgMHg4MThGLCAweDEwNzcsIDB4ODE5NSwgMHgyOUQxLCAweDgxOTcsIDB4MjlENCwKLSAgICAweDgxOTgsIDB4MTFFRiwgMHg4MTk5LCAweDI5RDMsIDB4ODE5QSwgMHgxMUVFLCAweDgxOUIsIDB4MTFFQSwKLSAgICAweDgxOUMsIDB4MTFFQiwgMHg4MTlELCAweDExRUMsIDB4ODE5RSwgMHgyOUQwLCAweDgxOUYsIDB4MjlDRiwKLSAgICAweDgxQTAsIDB4MTFFRCwgMHg4MUEyLCAweDI5RDIsIDB4ODFBMywgMHgyOUNFLCAweDgxQTYsIDB4MkMzMCwKLSAgICAweDgxQTcsIDB4MkMzQSwgMHg4MUE4LCAweDEzMzEsIDB4ODFBOSwgMHgxMzMwLCAweDgxQUIsIDB4MkMzNCwKLSAgICAweDgxQUMsIDB4MkMzNiwgMHg4MUFFLCAweDJDMzEsIDB4ODFCMCwgMHgyQzM1LCAweDgxQjEsIDB4MkMyRiwKLSAgICAweDgxQjIsIDB4MkMzOCwgMHg4MUIzLCAweDEzMkYsIDB4ODFCNCwgMHgyQzM3LCAweDgxQjUsIDB4MkMzMywKLSAgICAweDgxQjcsIDB4MkMzOSwgMHg4MUI5LCAweDJDMzIsIDB4ODFCQSwgMHgxNDUwLCAweDgxQkIsIDB4MkUwNiwKLSAgICAweDgxQkMsIDB4MkUwQywgMHg4MUJELCAweDE0NTQsIDB4ODFCRSwgMHgxNDU2LCAweDgxQkYsIDB4MTQ1MywKLSAgICAweDgxQzAsIDB4MTQ1MiwgMHg4MUMyLCAweDE0NTEsIDB4ODFDMywgMHgxNDRGLCAweDgxQzQsIDB4MkUwNywKLSAgICAweDgxQzUsIDB4MkUwQSwgMHg4MUM2LCAweDE0NEUsIDB4ODFDNywgMHgyRTBCLCAweDgxQzksIDB4MTQ1NSwKLSAgICAweDgxQ0EsIDB4MkUwOSwgMHg4MUNDLCAweDJFMDgsIDB4ODFDRCwgMHgxNTE4LCAweDgxQ0YsIDB4MTUxOSwKLSAgICAweDgxRDAsIDB4MkY5NCwgMHg4MUQxLCAweDJGOTIsIDB4ODFEMiwgMHgyRjkzLCAweDgxRDUsIDB4MzBFRCwKLSAgICAweDgxRDcsIDB4MzBFQywgMHg4MUQ4LCAweDE1QjMsIDB4ODFEOSwgMHgzMjFDLCAweDgxREEsIDB4MTYzNSwKLSAgICAweDgxREIsIDB4MzIxQiwgMHg4MURELCAweDMyRjUsIDB4ODFERSwgMHgzM0E1LCAweDgxREYsIDB4MTZENCwKLSAgICAweDgxRTAsIDB4MzRERCwgMHg4MUUxLCAweDM0REUsIDB4ODFFMiwgMHgxNzA2LCAweDgxRTMsIDB4MDQwNSwKLSAgICAweDgxRTUsIDB4MDY3NiwgMHg4MUU2LCAweDIyODYsIDB4ODFFNywgMHgxMDdDLCAweDgxRTgsIDB4MTQ1NywKLSAgICAweDgxRTksIDB4MkUwRCwgMHg4MUVBLCAweDA0MDYsIDB4ODFFQywgMHgwOTk1LCAweDgxRUQsIDB4MDk5NCwKLSAgICAweDgxRUUsIDB4MjI4NywgMHg4MUYyLCAweDJDM0IsIDB4ODFGMywgMHgwNDA3LCAweDgxRjQsIDB4MDdFNywKLSAgICAweDgxRjcsIDB4MjI4OCwgMHg4MUY4LCAweDIyODksIDB4ODFGOSwgMHgyMjhBLCAweDgxRkEsIDB4MTA3RCwKLSAgICAweDgxRkIsIDB4MTMzMiwgMHg4MUZDLCAweDA0MDgsIDB4ODFGRSwgMHgwNjc3LCAweDgxRkYsIDB4MUJERSwKLSAgICAweDgyMDAsIDB4MDk5NiwgMHg4MjAxLCAweDFEQkQsIDB4ODIwMiwgMHgwQjcxLCAweDgyMDQsIDB4MjI4QiwKLSAgICAweDgyMDUsIDB4MEVEOSwgMHg4MjA3LCAweDEwN0UsIDB4ODIwOCwgMHgxMzMzLCAweDgyMDksIDB4MTQ1OCwKLSAgICAweDgyMEEsIDB4MTUxQSwgMHg4MjBCLCAweDMwRUUsIDB4ODIwQywgMHgwNDA5LCAweDgyMEQsIDB4MDY3OCwKLSAgICAweDgyMTAsIDB4MDk5NywgMHg4MjExLCAweDIwMTMsIDB4ODIxMiwgMHgwRDJDLCAweDgyMTQsIDB4MTA3RiwKLSAgICAweDgyMTUsIDB4MjdBNSwgMHg4MjE2LCAweDI5RDUsIDB4ODIxQiwgMHgwNDBBLCAweDgyMUMsIDB4MEQyRCwKLSAgICAweDgyMUQsIDB4MjUyOSwgMHg4MjFFLCAweDEwODAsIDB4ODIxRiwgMHgwNDBCLCAweDgyMjAsIDB4MUEyRSwKLSAgICAweDgyMjEsIDB4MUJERiwgMHg4MjIyLCAweDA3RTgsIDB4ODIyNSwgMHgxREJGLCAweDgyMjgsIDB4MDk5QSwKLSAgICAweDgyMkEsIDB4MDk5OCwgMHg4MjJCLCAweDA5OTksIDB4ODIyQywgMHgwOTlCLCAweDgyMkYsIDB4MURCRSwKLSAgICAweDgyMzIsIDB4MjAxOCwgMHg4MjMzLCAweDIwMTUsIDB4ODIzNCwgMHgyMDE3LCAweDgyMzUsIDB4MEI3MiwKLSAgICAweDgyMzYsIDB4MEI3NCwgMHg4MjM3LCAweDBCNzMsIDB4ODIzOCwgMHgyMDE0LCAweDgyMzksIDB4MEI3NSwKLSAgICAweDgyM0EsIDB4MjAxNiwgMHg4MjNDLCAweDIyOEMsIDB4ODIzRCwgMHgyMjhELCAweDgyM0YsIDB4MjI4RSwKLSAgICAweDgyNDAsIDB4MjUyQywgMHg4MjQyLCAweDI1MkQsIDB4ODI0NCwgMHgyNTJCLCAweDgyNDUsIDB4MjUyRSwKLSAgICAweDgyNDcsIDB4MEVEQSwgMHg4MjQ5LCAweDI1MkEsIDB4ODI0QiwgMHgxMDgxLCAweDgyNEUsIDB4MjlEQSwKLSAgICAweDgyNEYsIDB4MjlENiwgMHg4MjUwLCAweDI5RDksIDB4ODI1MSwgMHgyOURCLCAweDgyNTIsIDB4MjlEOCwKLSAgICAweDgyNTMsIDB4MjlENywgMHg4MjU1LCAweDJDM0MsIDB4ODI1NiwgMHgyQzNELCAweDgyNTcsIDB4MkMzRSwKLSAgICAweDgyNTgsIDB4MTMzNCwgMHg4MjU5LCAweDEzMzUsIDB4ODI1QSwgMHgyRTBGLCAweDgyNUIsIDB4MkUwRSwKLSAgICAweDgyNUMsIDB4MkUxMCwgMHg4MjVFLCAweDJGOTYsIDB4ODI1RiwgMHgyRjk1LCAweDgyNjEsIDB4MzBGMCwKLSAgICAweDgyNjMsIDB4MzBGMSwgMHg4MjY0LCAweDMwRUYsIDB4ODI2NiwgMHgxNjM2LCAweDgyNjgsIDB4MzIxRCwKLSAgICAweDgyNjksIDB4MzIxRSwgMHg4MjZCLCAweDMzQTYsIDB4ODI2QywgMHgzNDJELCAweDgyNkQsIDB4MzQ5NiwKLSAgICAweDgyNkUsIDB4MDQwQywgMHg4MjZGLCAweDA1MDQsIDB4ODI3MSwgMHgxNDU5LCAweDgyNzIsIDB4MDQwRCwKLSAgICAweDgyNzQsIDB4MjAxOSwgMHg4Mjc1LCAweDIyOEYsIDB4ODI3NywgMHgxNzJFLCAweDgyNzgsIDB4MTgxMywKLSAgICAweDgyN0MsIDB4MTgxNCwgMHg4MjdELCAweDE4MTYsIDB4ODI3RSwgMHgwNDBFLCAweDgyN0YsIDB4MTgxNywKLSAgICAweDgyODAsIDB4MTgxNSwgMHg4MjgzLCAweDE4RTUsIDB4ODI4NCwgMHgxOEU2LCAweDgyODUsIDB4MThFMCwKLSAgICAweDgyOEEsIDB4MThFNCwgMHg4MjhCLCAweDA1MDYsIDB4ODI4RCwgMHgwNTA3LCAweDgyOEUsIDB4MThFMSwKLSAgICAweDgyOEYsIDB4MThERiwgMHg4MjkwLCAweDE4REUsIDB4ODI5MSwgMHgxOEUyLCAweDgyOTIsIDB4MDUwNSwKLSAgICAweDgyOTMsIDB4MThFMywgMHg4Mjk0LCAweDFCRTAsIDB4ODI5OCwgMHgxQTMzLCAweDgyOTksIDB4MDY3QiwKLSAgICAweDgyOUEsIDB4MUEzMiwgMHg4MjlCLCAweDFBMzQsIDB4ODI5RCwgMHgwNjdBLCAweDgyOUUsIDB4MUEzOSwKLSAgICAweDgyOUYsIDB4MDY3RSwgMHg4MkEwLCAweDFBMkYsIDB4ODJBMSwgMHgxQTNELCAweDgyQTIsIDB4MUE0MywKLSAgICAweDgyQTMsIDB4MDY4NSwgMHg4MkE0LCAweDFBNDAsIDB4ODJBNSwgMHgwNjgyLCAweDgyQTcsIDB4MUEzNiwKLSAgICAweDgyQTgsIDB4MUEzQywgMHg4MkE5LCAweDFBM0UsIDB4ODJBQiwgMHgxQTMxLCAweDgyQUMsIDB4MDY4MSwKLSAgICAweDgyQUQsIDB4MDY3QywgMHg4MkFFLCAweDFBMzcsIDB4ODJBRiwgMHgwNjgzLCAweDgyQjAsIDB4MDY4NiwKLSAgICAweDgyQjEsIDB4MDY4MCwgMHg4MkIzLCAweDA2NzksIDB4ODJCNCwgMHgxQTNCLCAweDgyQjUsIDB4MUEzNSwKLSAgICAweDgyQjYsIDB4MUE0MiwgMHg4MkI3LCAweDA2ODgsIDB4ODJCOCwgMHgwNjg0LCAweDgyQjksIDB4MDY3RiwKLSAgICAweDgyQkEsIDB4MUEzQSwgMHg4MkJCLCAweDA5OUMsIDB4ODJCQywgMHgxQTM4LCAweDgyQkQsIDB4MDY3RCwKLSAgICAweDgyQkUsIDB4MDY4NywgMHg4MkMwLCAweDFBMzAsIDB4ODJDMiwgMHgxQTNGLCAweDgyQzMsIDB4MUE0MSwKLSAgICAweDgyRDEsIDB4MDdGOSwgMHg4MkQyLCAweDA3RjMsIDB4ODJEMywgMHgwN0ZCLCAweDgyRDQsIDB4MDdGOCwKLSAgICAweDgyRDUsIDB4MUJFNywgMHg4MkQ2LCAweDFCRUEsIDB4ODJENywgMHgwN0Y0LCAweDgyRDksIDB4MUJFMSwKLSAgICAweDgyREIsIDB4MDdFRCwgMHg4MkRDLCAweDA3RjcsIDB4ODJERSwgMHgwN0ZBLCAweDgyREYsIDB4MDdGQywKLSAgICAweDgyRTAsIDB4MUJGNiwgMHg4MkUxLCAweDFCRUQsIDB4ODJFMywgMHgwN0VDLCAweDgyRTQsIDB4MUJGNSwKLSAgICAweDgyRTUsIDB4MDdGMCwgMHg4MkU2LCAweDA3RUUsIDB4ODJFNywgMHgwN0U5LCAweDgyRTgsIDB4MUJFNSwKLSAgICAweDgyRUEsIDB4MUJGNCwgMHg4MkVCLCAweDFCRTksIDB4ODJFQywgMHgxQkVDLCAweDgyRUQsIDB4MUJGOSwKLSAgICAweDgyRUYsIDB4MDdGRCwgMHg4MkYwLCAweDFCRjMsIDB4ODJGMSwgMHgwN0Y1LCAweDgyRjIsIDB4MUJFRSwKLSAgICAweDgyRjMsIDB4MUJGOCwgMHg4MkY0LCAweDFCRUIsIDB4ODJGNSwgMHgxQkVGLCAweDgyRjYsIDB4MUJGMiwKLSAgICAweDgyRjksIDB4MUJFMywgMHg4MkZBLCAweDFCRjcsIDB4ODJGQiwgMHgxQkYxLCAweDgyRkUsIDB4MUJFMiwKLSAgICAweDgzMDAsIDB4MUJFNiwgMHg4MzAxLCAweDA3RjYsIDB4ODMwMiwgMHgwN0YxLCAweDgzMDMsIDB4MDdFQSwKLSAgICAweDgzMDQsIDB4MDdFRiwgMHg4MzA1LCAweDA3RUIsIDB4ODMwNiwgMHgwN0ZFLCAweDgzMDcsIDB4MUJFNCwKLSAgICAweDgzMDgsIDB4MUREMCwgMHg4MzA5LCAweDA3RjIsIDB4ODMwQywgMHgxQkYwLCAweDgzMEQsIDB4MUE3RCwKLSAgICAweDgzMTYsIDB4MUREMywgMHg4MzE3LCAweDA5QUEsIDB4ODMxOSwgMHgxREMzLCAweDgzMUIsIDB4MURDRSwKLSAgICAweDgzMUMsIDB4MURDQSwgMHg4MzFFLCAweDFEREQsIDB4ODMyMCwgMHgxREQ1LCAweDgzMjIsIDB4MURDQiwKLSAgICAweDgzMjQsIDB4MURENCwgMHg4MzI1LCAweDFEQzUsIDB4ODMyNiwgMHgxREM5LCAweDgzMjcsIDB4MURFMCwKLSAgICAweDgzMjgsIDB4MDlBRCwgMHg4MzI5LCAweDFERDgsIDB4ODMyQSwgMHgxRENGLCAweDgzMkIsIDB4MDk5RCwKLSAgICAweDgzMkMsIDB4MURERSwgMHg4MzJELCAweDFEQzEsIDB4ODMyRiwgMHgxREQ3LCAweDgzMzEsIDB4MDlBQywKLSAgICAweDgzMzIsIDB4MDlBNywgMHg4MzMzLCAweDFEQzAsIDB4ODMzNCwgMHgwOUE1LCAweDgzMzUsIDB4MDlBNCwKLSAgICAweDgzMzYsIDB4MDlBOSwgMHg4MzM3LCAweDFERDYsIDB4ODMzOCwgMHgwOUExLCAweDgzMzksIDB4MDlBOCwKLSAgICAweDgzM0EsIDB4MUJFOCwgMHg4MzNCLCAweDIyOTAsIDB4ODMzQywgMHgxREQxLCAweDgzM0YsIDB4MURDNywKLSAgICAweDgzNDAsIDB4MDlBQiwgMHg4MzQxLCAweDFEQzgsIDB4ODM0MiwgMHgxRENDLCAweDgzNDMsIDB4MDlBRSwKLSAgICAweDgzNDQsIDB4MURDMiwgMHg4MzQ1LCAweDFEREEsIDB4ODM0NywgMHgxREQ5LCAweDgzNDgsIDB4MURFMSwKLSAgICAweDgzNDksIDB4MDlBMywgMHg4MzRBLCAweDA5QTAsIDB4ODM0QiwgMHgxRERGLCAweDgzNEMsIDB4MUREQiwKLSAgICAweDgzNEQsIDB4MUREMiwgMHg4MzRFLCAweDFEQ0QsIDB4ODM0RiwgMHgwOUE2LCAweDgzNTAsIDB4MDlBMiwKLSAgICAweDgzNTEsIDB4MURDNCwgMHg4MzUyLCAweDA5OUUsIDB4ODM1MywgMHgxRERDLCAweDgzNTQsIDB4MDk5RiwKLSAgICAweDgzNTYsIDB4MURDNiwgMHg4MzczLCAweDIwMUYsIDB4ODM3NCwgMHgyMDIxLCAweDgzNzUsIDB4MjAyNiwKLSAgICAweDgzNzYsIDB4MjAzQSwgMHg4Mzc3LCAweDBCODMsIDB4ODM3OCwgMHgwQjc5LCAweDgzN0EsIDB4MjAxRSwKLSAgICAweDgzN0IsIDB4MEI4NCwgMHg4MzdDLCAweDBCODUsIDB4ODM3RCwgMHgyMDI5LCAweDgzN0UsIDB4MjAzMCwKLSAgICAweDgzN0YsIDB4MjAzNiwgMHg4MzgxLCAweDIwMjMsIDB4ODM4MywgMHgyMDJBLCAweDgzODYsIDB4MEI4NiwKLSAgICAweDgzODcsIDB4MjAzOCwgMHg4Mzg4LCAweDIwMzMsIDB4ODM4OSwgMHgwQjgxLCAweDgzOEEsIDB4MEI3RiwKLSAgICAweDgzOEIsIDB4MjAyRiwgMHg4MzhDLCAweDIwMkIsIDB4ODM4RCwgMHgyMDFELCAweDgzOEUsIDB4MEI3NiwKLSAgICAweDgzOEYsIDB4MjAyMiwgMHg4MzkwLCAweDIwMUEsIDB4ODM5MiwgMHgwQjdFLCAweDgzOTMsIDB4MEI4MCwKLSAgICAweDgzOTQsIDB4MjAyNywgMHg4Mzk1LCAweDIwMjQsIDB4ODM5NiwgMHgwQjdCLCAweDgzOTcsIDB4MjAzNCwKLSAgICAweDgzOTgsIDB4MEI3OCwgMHg4Mzk5LCAweDIwMjUsIDB4ODM5QSwgMHgyMkI5LCAweDgzOUIsIDB4MjAyRCwKLSAgICAweDgzOUQsIDB4MjAyQywgMHg4MzlFLCAweDBCNzcsIDB4ODNBMCwgMHgwQjgyLCAweDgzQTIsIDB4MEI3QSwKLSAgICAweDgzQTMsIDB4MjAxQiwgMHg4M0E0LCAweDIwMjAsIDB4ODNBNSwgMHgyMDMxLCAweDgzQTYsIDB4MjAzNywKLSAgICAweDgzQTcsIDB4MEI4NywgMHg4M0E4LCAweDIwMUMsIDB4ODNBOSwgMHgyMDI4LCAweDgzQUEsIDB4MjAyRSwKLSAgICAweDgzQUIsIDB4MEI3RCwgMHg4M0FFLCAweDIwMzksIDB4ODNBRiwgMHgyMDMyLCAweDgzQjAsIDB4MjAzNSwKLSAgICAweDgzQkQsIDB4MEI3QywgMHg4M0JGLCAweDIyQTAsIDB4ODNDMCwgMHgyMjk0LCAweDgzQzEsIDB4MEQzNSwKLSAgICAweDgzQzIsIDB4MjJCMSwgMHg4M0MzLCAweDIyQkEsIDB4ODNDNCwgMHgyMkJELCAweDgzQzUsIDB4MEQzMywKLSAgICAweDgzQzYsIDB4MjI5QywgMHg4M0M3LCAweDIyQjUsIDB4ODNDOCwgMHgyMjlELCAweDgzQzksIDB4MjJBQiwKLSAgICAweDgzQ0EsIDB4MEQ0MCwgMHg4M0NCLCAweDIyQTcsIDB4ODNDQywgMHgwRDNELCAweDgzQ0UsIDB4MjJBOCwKLSAgICAweDgzQ0YsIDB4MjI5MSwgMHg4M0QxLCAweDIyQjYsIDB4ODNENCwgMHgwRDQ2LCAweDgzRDUsIDB4MjJCMywKLSAgICAweDgzRDYsIDB4MjJBOSwgMHg4M0Q3LCAweDIyQkYsIDB4ODNEOCwgMHgyMkE0LCAweDgzRDksIDB4MjU0RSwKLSAgICAweDgzREIsIDB4MjJDMiwgMHg4M0RDLCAweDBENDQsIDB4ODNERCwgMHgyMkEyLCAweDgzREUsIDB4MjJBRSwKLSAgICAweDgzREYsIDB4MEQ0NywgMHg4M0UwLCAweDBEMzIsIDB4ODNFMSwgMHgyMkE2LCAweDgzRTIsIDB4MjJDMCwKLSAgICAweDgzRTMsIDB4MjI5RiwgMHg4M0U0LCAweDIyOTgsIDB4ODNFNSwgMHgyMkEzLCAweDgzRTcsIDB4MjI5NywKLSAgICAweDgzRTgsIDB4MjI5NSwgMHg4M0U5LCAweDBEMkUsIDB4ODNFQSwgMHgyMkI3LCAweDgzRUIsIDB4MjI5RSwKLSAgICAweDgzRUMsIDB4MjJCQiwgMHg4M0VFLCAweDIyQkMsIDB4ODNFRiwgMHgwRDM2LCAweDgzRjAsIDB4MEQzQiwKLSAgICAweDgzRjEsIDB4MEQzNywgMHg4M0YyLCAweDBEM0YsIDB4ODNGMywgMHgyMkIyLCAweDgzRjQsIDB4MEQzOCwKLSAgICAweDgzRjUsIDB4MjJBQSwgMHg4M0Y2LCAweDIyOUEsIDB4ODNGOCwgMHgwRDMwLCAweDgzRjksIDB4MjI5MiwKLSAgICAweDgzRkEsIDB4MjJCNCwgMHg4M0ZCLCAweDIyQkUsIDB4ODNGQywgMHgyMjk5LCAweDgzRkQsIDB4MEQzRSwKLSAgICAweDgzRkUsIDB4MjJDMywgMHg4M0ZGLCAweDIyQTUsIDB4ODQwMSwgMHgyMkExLCAweDg0MDMsIDB4MEQyRiwKLSAgICAweDg0MDQsIDB4MEQ0MywgMHg4NDA2LCAweDIyQjAsIDB4ODQwNywgMHgwRDQ1LCAweDg0MDksIDB4MjJBQywKLSAgICAweDg0MEEsIDB4MEQzQSwgMHg4NDBCLCAweDBEMzQsIDB4ODQwQywgMHgwRDNDLCAweDg0MEQsIDB4MEQzMSwKLSAgICAweDg0MEUsIDB4MEQ0MiwgMHg4NDBGLCAweDIyQUQsIDB4ODQxMCwgMHgyMjlCLCAweDg0MTEsIDB4MjJBRiwKLSAgICAweDg0MTIsIDB4MjI5NiwgMHg4NDEzLCAweDIyQjgsIDB4ODQxQiwgMHgyMkMxLCAweDg0MjMsIDB4MjI5MywKLSAgICAweDg0MjksIDB4MjU0RCwgMHg4NDJCLCAweDI1NjMsIDB4ODQyQywgMHgwRUFDLCAweDg0MkQsIDB4MjU1MiwKLSAgICAweDg0MkYsIDB4MjU1MCwgMHg4NDMwLCAweDI1M0IsIDB4ODQzMSwgMHgwRURFLCAweDg0MzIsIDB4MjU0QiwKLSAgICAweDg0MzMsIDB4MjU1RiwgMHg4NDM0LCAweDI1NDcsIDB4ODQzNSwgMHgwRUU2LCAweDg0MzYsIDB4MjU1RSwKLSAgICAweDg0MzcsIDB4MjU0NSwgMHg4NDM4LCAweDBENDEsIDB4ODQzOSwgMHgyNTU1LCAweDg0M0EsIDB4MjU0NiwKLSAgICAweDg0M0IsIDB4MjU1QywgMHg4NDNDLCAweDBFRTUsIDB4ODQzRCwgMHgwRURELCAweDg0M0YsIDB4MjUzMCwKLSAgICAweDg0NDAsIDB4MjUzOCwgMHg4NDQyLCAweDI1NTEsIDB4ODQ0MywgMHgyNTQ5LCAweDg0NDQsIDB4MjU2MiwKLSAgICAweDg0NDUsIDB4MjU0QywgMHg4NDQ2LCAweDBFRUIsIDB4ODQ0NywgMHgyNTVELCAweDg0NDksIDB4MEVFMiwKLSAgICAweDg0NEIsIDB4MjU0RiwgMHg4NDRDLCAweDI1NTcsIDB4ODQ0RCwgMHgyNTNDLCAweDg0NEUsIDB4MjU1NiwKLSAgICAweDg0NTAsIDB4MjU2NywgMHg4NDUxLCAweDI1MzcsIDB4ODQ1MiwgMHgyNTU4LCAweDg0NTQsIDB4MjU2NSwKLSAgICAweDg0NTYsIDB4MjUzMSwgMHg4NDU3LCAweDBEMzksIDB4ODQ1OSwgMHgyNTNGLCAweDg0NUEsIDB4MjUzRSwKLSAgICAweDg0NUIsIDB4MEVFNCwgMHg4NDVELCAweDI1NDIsIDB4ODQ1RSwgMHgyNTQ0LCAweDg0NUYsIDB4MjU1MywKLSAgICAweDg0NjAsIDB4MjU2NCwgMHg4NDYxLCAweDBFRTcsIDB4ODQ2MywgMHgwRUU4LCAweDg0NjUsIDB4MjUzNiwKLSAgICAweDg0NjYsIDB4MEVFMCwgMHg4NDY3LCAweDI1M0EsIDB4ODQ2OCwgMHgyNTYwLCAweDg0NjksIDB4MEVFOSwKLSAgICAweDg0NkIsIDB4MEVFMSwgMHg4NDZDLCAweDBFRTMsIDB4ODQ2RCwgMHgwRUVBLCAweDg0NkUsIDB4MjU2NiwKLSAgICAweDg0NkYsIDB4MjU1OSwgMHg4NDcwLCAweDI1NTQsIDB4ODQ3MywgMHgyNTQxLCAweDg0NzQsIDB4MjU0MCwKLSAgICAweDg0NzUsIDB4MEVERiwgMHg4NDc2LCAweDI1MzIsIDB4ODQ3NywgMHgwRURDLCAweDg0NzgsIDB4MjU0QSwKLSAgICAweDg0NzksIDB4MjUzMywgMHg4NDdBLCAweDI1NDgsIDB4ODQ3RCwgMHgyNTNELCAweDg0N0UsIDB4MjU2MSwKLSAgICAweDg0ODIsIDB4MEVEQiwgMHg4NDg2LCAweDI1MzksIDB4ODQ4RCwgMHgyNTM1LCAweDg0OEUsIDB4MjU1QiwKLSAgICAweDg0OEYsIDB4MjUzNCwgMHg4NDkwLCAweDEwOEUsIDB4ODQ5MSwgMHgyN0NELCAweDg0OTQsIDB4MjdCQywKLSAgICAweDg0OTcsIDB4MjdBNiwgMHg4NDk4LCAweDI3QzQsIDB4ODQ5OSwgMHgxMDg2LCAweDg0OUEsIDB4MjdCNSwKLSAgICAweDg0OUIsIDB4MjdCRiwgMHg4NDlDLCAweDEwODksIDB4ODQ5RCwgMHgyN0I4LCAweDg0OUUsIDB4MTA4NywKLSAgICAweDg0OUYsIDB4MjdBOSwgMHg4NEEwLCAweDI3QzcsIDB4ODRBMSwgMHgyN0E4LCAweDg0QTIsIDB4MjdCQiwKLSAgICAweDg0QTQsIDB4MjdBNywgMHg4NEE3LCAweDI3QjksIDB4ODRBOCwgMHgyN0MyLCAweDg0QTksIDB4MjdDMCwKLSAgICAweDg0QUEsIDB4MjdCNCwgMHg4NEFCLCAweDI3QUYsIDB4ODRBQywgMHgyN0FELCAweDg0QUUsIDB4MjdBRSwKLSAgICAweDg0QUYsIDB4MjdDMSwgMHg4NEIwLCAweDI3Q0MsIDB4ODRCMSwgMHgyN0I2LCAweDg0QjIsIDB4MTA4OCwKLSAgICAweDg0QjQsIDB4MjdCMSwgMHg4NEI2LCAweDI3QzUsIDB4ODRCOCwgMHgxMDhCLCAweDg0QjksIDB4MjdCMCwKLSAgICAweDg0QkEsIDB4MjdBQSwgMHg4NEJCLCAweDI3QkEsIDB4ODRCQywgMHgxMDhGLCAweDg0QkYsIDB4MTA4MywKLSAgICAweDg0QzAsIDB4MTA4QywgMHg4NEMxLCAweDI3QjIsIDB4ODRDMiwgMHgyN0FDLCAweDg0QzQsIDB4MTA4NSwKLSAgICAweDg0QzUsIDB4MjU1QSwgMHg4NEM2LCAweDEwODQsIDB4ODRDNywgMHgyN0JELCAweDg0QzksIDB4MTA4MiwKLSAgICAweDg0Q0EsIDB4MTA5MSwgMHg4NENCLCAweDEwOEEsIDB4ODRDQywgMHgyN0JFLCAweDg0Q0QsIDB4MjdCMywKLSAgICAweDg0Q0UsIDB4MjdBQiwgMHg4NENGLCAweDI3QzYsIDB4ODREMCwgMHgyN0I3LCAweDg0RDEsIDB4MTA5MCwKLSAgICAweDg0RDIsIDB4MjdDQSwgMHg4NEQzLCAweDEwOEQsIDB4ODRENCwgMHgyN0M5LCAweDg0RDYsIDB4MjdDMywKLSAgICAweDg0RDcsIDB4MjdDOCwgMHg4NERCLCAweDI3Q0IsIDB4ODRFNywgMHgyQTAzLCAweDg0RTgsIDB4MkEwNCwKLSAgICAweDg0RTksIDB4MjlGNywgMHg4NEVBLCAweDI5RjYsIDB4ODRFQiwgMHgyOUYyLCAweDg0RUMsIDB4MTFGQiwKLSAgICAweDg0RUUsIDB4MTFGMywgMHg4NEVGLCAweDJBMDYsIDB4ODRGMCwgMHgyQTA1LCAweDg0RjEsIDB4MjUyRiwKLSAgICAweDg0RjIsIDB4MjlFRiwgMHg4NEYzLCAweDI5RjMsIDB4ODRGNCwgMHgyOUVELCAweDg0RjYsIDB4MkEwMCwKLSAgICAweDg0RjcsIDB4MjlGMSwgMHg4NEY5LCAweDJBMDcsIDB4ODRGQSwgMHgyOUVBLCAweDg0RkIsIDB4MjlFOCwKLSAgICAweDg0RkMsIDB4MjlGNCwgMHg4NEZELCAweDI5RkUsIDB4ODRGRSwgMHgyOUY5LCAweDg0RkYsIDB4MTFGRCwKLSAgICAweDg1MDAsIDB4MjlERiwgMHg4NTAyLCAweDI5RkQsIDB4ODUwNiwgMHgxMUZFLCAweDg1MDcsIDB4MjU0MywKLSAgICAweDg1MDgsIDB4MjlFQiwgMHg4NTA5LCAweDI5RTIsIDB4ODUwQSwgMHgyOUU1LCAweDg1MEIsIDB4MkEwQiwKLSAgICAweDg1MEMsIDB4MjlFQywgMHg4NTBELCAweDI5RTMsIDB4ODUwRSwgMHgyOUUxLCAweDg1MEYsIDB4MjlERSwKLSAgICAweDg1MTEsIDB4MTFGNywgMHg4NTEyLCAweDI5RjUsIDB4ODUxMywgMHgxMUY2LCAweDg1MTQsIDB4MTFGQSwKLSAgICAweDg1MTUsIDB4MjlGMCwgMHg4NTE2LCAweDI5RjgsIDB4ODUxNywgMHgxMUYwLCAweDg1MTgsIDB4MkEwOCwKLSAgICAweDg1MTksIDB4MkEwQywgMHg4NTFBLCAweDExRjIsIDB4ODUxQywgMHgyOUU3LCAweDg1MUQsIDB4MjlGQiwKLSAgICAweDg1MUUsIDB4MjlGRiwgMHg4NTFGLCAweDI5RTQsIDB4ODUyMCwgMHgyQTA5LCAweDg1MjEsIDB4MTFGOSwKLSAgICAweDg1MjMsIDB4MTFGOCwgMHg4NTI0LCAweDI5REMsIDB4ODUyNSwgMHgxMUZDLCAweDg1MjYsIDB4MkEwMiwKLSAgICAweDg1MjcsIDB4MjlFNiwgMHg4NTI4LCAweDI5RkEsIDB4ODUyOSwgMHgyOUUwLCAweDg1MkEsIDB4MjlFRSwKLSAgICAweDg1MkIsIDB4MjlFOSwgMHg4NTJDLCAweDExRjQsIDB4ODUyRCwgMHgxMUY1LCAweDg1MkUsIDB4MjlGQywKLSAgICAweDg1MkYsIDB4MkEwRCwgMHg4NTMwLCAweDJBMEEsIDB4ODUzMSwgMHgyQTAxLCAweDg1M0IsIDB4MjlERCwKLSAgICAweDg1M0QsIDB4MTFGMSwgMHg4NTNFLCAweDJDNEYsIDB4ODU0MCwgMHgyQzQ2LCAweDg1NDEsIDB4MkM0OSwKLSAgICAweDg1NDMsIDB4MTMzQiwgMHg4NTQ0LCAweDJDNEIsIDB4ODU0NSwgMHgyQzQwLCAweDg1NDYsIDB4MkM0NywKLSAgICAweDg1NDcsIDB4MkM0RCwgMHg4NTQ4LCAweDEzMzgsIDB4ODU0OSwgMHgxMzNDLCAweDg1NEEsIDB4MTMzNiwKLSAgICAweDg1NEQsIDB4MkM0MiwgMHg4NTRFLCAweDJDNTIsIDB4ODU1MSwgMHgyQzRDLCAweDg1NTMsIDB4MkM0MywKLSAgICAweDg1NTQsIDB4MkM1QiwgMHg4NTU1LCAweDJDNTUsIDB4ODU1NiwgMHgyQzNGLCAweDg1NTcsIDB4MkUyMywKLSAgICAweDg1NTgsIDB4MkM0NSwgMHg4NTU5LCAweDEzMzcsIDB4ODU1QiwgMHgyQzUwLCAweDg1NUQsIDB4MkM1QSwKLSAgICAweDg1NUUsIDB4MTMzRiwgMHg4NTYwLCAweDJDNTcsIDB4ODU2MSwgMHgyQzQ0LCAweDg1NjIsIDB4MkM0QSwKLSAgICAweDg1NjMsIDB4MkM0RSwgMHg4NTY0LCAweDJDNDgsIDB4ODU2NSwgMHgyQzVDLCAweDg1NjYsIDB4MkM1OSwKLSAgICAweDg1NjcsIDB4MkM1NiwgMHg4NTY4LCAweDEzMzksIDB4ODU2OSwgMHgxMzNBLCAweDg1NkEsIDB4MTMzRSwKLSAgICAweDg1NkIsIDB4MkM0MSwgMHg4NTZDLCAweDJDNUQsIDB4ODU2RCwgMHgxMzNELCAweDg1NkUsIDB4MkM1MywKLSAgICAweDg1NzEsIDB4MkM1MSwgMHg4NTc1LCAweDJDNTQsIDB4ODU3NiwgMHgyRTMwLCAweDg1NzcsIDB4MkUxRCwKLSAgICAweDg1NzgsIDB4MkUyMiwgMHg4NTc5LCAweDJFMkYsIDB4ODU3QSwgMHgyRTIxLCAweDg1N0IsIDB4MkUxOSwKLSAgICAweDg1N0MsIDB4MkUxRSwgMHg4NTdFLCAweDE0NUMsIDB4ODU4MCwgMHgyRTEyLCAweDg1ODEsIDB4MkUyQSwKLSAgICAweDg1ODIsIDB4MkUyQywgMHg4NTgzLCAweDJFMTEsIDB4ODU4NCwgMHgxNDVCLCAweDg1ODUsIDB4MkUyRSwKLSAgICAweDg1ODYsIDB4MkUyNiwgMHg4NTg3LCAweDE0NjIsIDB4ODU4OCwgMHgyRTJELCAweDg1ODksIDB4MkUxRiwKLSAgICAweDg1OEEsIDB4MTQ2NCwgMHg4NThCLCAweDJFMTcsIDB4ODU4QywgMHgyQzU4LCAweDg1OEQsIDB4MkUyNywKLSAgICAweDg1OEUsIDB4MkUyNCwgMHg4NThGLCAweDJFMTMsIDB4ODU5MCwgMHgyRTMyLCAweDg1OTEsIDB4MTQ1RSwKLSAgICAweDg1OTQsIDB4MTQ1RiwgMHg4NTk1LCAweDJFMTUsIDB4ODU5NiwgMHgyRTI1LCAweDg1OTgsIDB4MkUzMSwKLSAgICAweDg1OTksIDB4MkUyOCwgMHg4NTlBLCAweDJFMUIsIDB4ODU5QiwgMHgxNDYxLCAweDg1OUMsIDB4MTQ1RCwKLSAgICAweDg1OUQsIDB4MkUyOSwgMHg4NTlFLCAweDJFMUMsIDB4ODU5RiwgMHgyRTMzLCAweDg1QTAsIDB4MkUxNiwKLSAgICAweDg1QTEsIDB4MkUyMCwgMHg4NUEyLCAweDJFMkIsIDB4ODVBMywgMHgyRTE4LCAweDg1QTQsIDB4MkUxQSwKLSAgICAweDg1QTYsIDB4MTQ2NSwgMHg4NUE3LCAweDJFMTQsIDB4ODVBOCwgMHgxNDYzLCAweDg1QTksIDB4MTUxQywKLSAgICAweDg1QUEsIDB4MTQ1QSwgMHg4NUFGLCAweDE0NjAsIDB4ODVCMCwgMHgxNTIwLCAweDg1QjEsIDB4MkZBNiwKLSAgICAweDg1QjMsIDB4MkY5QywgMHg4NUI0LCAweDJGOTcsIDB4ODVCNSwgMHgyRjlELCAweDg1QjYsIDB4MkZBNywKLSAgICAweDg1QjcsIDB4MkZBQiwgMHg4NUI4LCAweDJGQUEsIDB4ODVCOSwgMHgxNTIyLCAweDg1QkEsIDB4MTUyMSwKLSAgICAweDg1QkQsIDB4MkY5RSwgMHg4NUJFLCAweDJGQUMsIDB4ODVCRiwgMHgyRkExLCAweDg1QzAsIDB4MkY5OSwKLSAgICAweDg1QzIsIDB4MkY5QiwgMHg4NUMzLCAweDJGOUEsIDB4ODVDNCwgMHgyRkEwLCAweDg1QzUsIDB4MkZBNSwKLSAgICAweDg1QzYsIDB4MkY5OCwgMHg4NUM3LCAweDJGOUYsIDB4ODVDOCwgMHgyRkE0LCAweDg1QzksIDB4MTUxRiwKLSAgICAweDg1Q0IsIDB4MkZBMiwgMHg4NUNELCAweDE1MUQsIDB4ODVDRSwgMHgyRkEzLCAweDg1Q0YsIDB4MTUxQiwKLSAgICAweDg1RDAsIDB4MTUxRSwgMHg4NUQxLCAweDMxMDEsIDB4ODVEMiwgMHgyRkE4LCAweDg1RDUsIDB4MTVCNywKLSAgICAweDg1RDcsIDB4MzBGOSwgMHg4NUQ4LCAweDMwRkQsIDB4ODVEOSwgMHgzMEY1LCAweDg1REEsIDB4MzBGOCwKLSAgICAweDg1REMsIDB4MzEwMCwgMHg4NURELCAweDE1QjUsIDB4ODVERSwgMHgzMTA1LCAweDg1REYsIDB4MzBGRSwKLSAgICAweDg1RTEsIDB4MzBGNiwgMHg4NUUyLCAweDMxMDYsIDB4ODVFMywgMHgzMEZGLCAweDg1RTQsIDB4MTVCOCwKLSAgICAweDg1RTUsIDB4MTVCOSwgMHg4NUU2LCAweDMxMDMsIDB4ODVFOCwgMHgzMEY3LCAweDg1RTksIDB4MTVCNCwKLSAgICAweDg1RUEsIDB4MTVCNiwgMHg4NUVCLCAweDMwRjIsIDB4ODVFQywgMHgzMEZBLCAweDg1RUQsIDB4MzBGNCwKLSAgICAweDg1RUYsIDB4MzEwNCwgMHg4NUYwLCAweDMxMDIsIDB4ODVGMSwgMHgzMEYzLCAweDg1RjIsIDB4MzBGQiwKLSAgICAweDg1RjYsIDB4MzIyNSwgMHg4NUY3LCAweDE1QkEsIDB4ODVGOCwgMHgzMEZDLCAweDg1RjksIDB4MTYzOCwKLSAgICAweDg1RkEsIDB4MTYzQSwgMHg4NUZCLCAweDE2MzcsIDB4ODVGRCwgMHgzMjJBLCAweDg1RkUsIDB4MzIyMiwKLSAgICAweDg1RkYsIDB4MzIyMCwgMHg4NjAwLCAweDMyMjQsIDB4ODYwMSwgMHgzMjIxLCAweDg2MDQsIDB4MzIyNiwKLSAgICAweDg2MDUsIDB4MzIyOCwgMHg4NjA2LCAweDE2M0IsIDB4ODYwNywgMHgxNjNELCAweDg2MDksIDB4MzIyNywKLSAgICAweDg2MEEsIDB4MTYzRSwgMHg4NjBCLCAweDE2M0MsIDB4ODYwQywgMHgzMjI5LCAweDg2MTEsIDB4MTYzOSwKLSAgICAweDg2MTcsIDB4MTY4NSwgMHg4NjE4LCAweDMyRjYsIDB4ODYxOSwgMHgzMkZDLCAweDg2MUEsIDB4MTY4NywKLSAgICAweDg2MUIsIDB4MzIyMywgMHg4NjFDLCAweDMyRkIsIDB4ODYxRSwgMHgzMzAyLCAweDg2MUYsIDB4MzJGOSwKLSAgICAweDg2MjAsIDB4MzMwMCwgMHg4NjIxLCAweDMyRkYsIDB4ODYyMiwgMHgzMjFGLCAweDg2MjMsIDB4MzJGQSwKLSAgICAweDg2MjQsIDB4MkZBOSwgMHg4NjI1LCAweDMzMDMsIDB4ODYyNiwgMHgzMkY4LCAweDg2MjcsIDB4MzJGRCwKLSAgICAweDg2MjksIDB4MzMwMSwgMHg4NjJBLCAweDMyRjcsIDB4ODYyQywgMHgzM0FBLCAweDg2MkQsIDB4MTY4NiwKLSAgICAweDg2MkUsIDB4MzJGRSwgMHg4NjMxLCAweDM0MzIsIDB4ODYzMiwgMHgzM0FCLCAweDg2MzMsIDB4MzNBOSwKLSAgICAweDg2MzQsIDB4MzNBNywgMHg4NjM1LCAweDMzQTgsIDB4ODYzNiwgMHgzM0FDLCAweDg2MzgsIDB4MTcwNywKLSAgICAweDg2MzksIDB4MzQzMCwgMHg4NjNBLCAweDM0MkUsIDB4ODYzQiwgMHgzNDMzLCAweDg2M0MsIDB4MzQzMSwKLSAgICAweDg2M0UsIDB4MzQzNCwgMHg4NjNGLCAweDE3MDgsIDB4ODY0MCwgMHgzNDJGLCAweDg2NDMsIDB4MzQ5NywKLSAgICAweDg2NDYsIDB4MzRERiwgMHg4NjQ3LCAweDM0RTAsIDB4ODY0OCwgMHgzNEUxLCAweDg2NEIsIDB4MzUzRSwKLSAgICAweDg2NEMsIDB4MzUzNiwgMHg4NjRELCAweDE4MTgsIDB4ODY0RSwgMHgwNjg5LCAweDg2NTAsIDB4MDdGRiwKLSAgICAweDg2NTIsIDB4MURFMywgMHg4NjUzLCAweDFERTIsIDB4ODY1NCwgMHgwOUFGLCAweDg2NTUsIDB4MEI4OCwKLSAgICAweDg2NTYsIDB4MjAzQywgMHg4NjU5LCAweDIwM0IsIDB4ODY1QiwgMHgwRDQ4LCAweDg2NUMsIDB4MEVFRCwKLSAgICAweDg2NUUsIDB4MEVFQywgMHg4NjVGLCAweDBFRUUsIDB4ODY2MSwgMHgyN0NFLCAweDg2NjIsIDB4MkEwRSwKLSAgICAweDg2NjMsIDB4MkM1RSwgMHg4NjY0LCAweDJDNjAsIDB4ODY2NSwgMHgyQzVGLCAweDg2NjcsIDB4MTQ2NiwKLSAgICAweDg2NjgsIDB4MkUzNCwgMHg4NjY5LCAweDJGQUQsIDB4ODY2QSwgMHgzNTFFLCAweDg2NkIsIDB4MDQwRiwKLSAgICAweDg2NkQsIDB4MUE0NiwgMHg4NjZFLCAweDFBNDcsIDB4ODY2RiwgMHgxQTQ1LCAweDg2NzAsIDB4MUE0NCwKLSAgICAweDg2NzEsIDB4MDY4QSwgMHg4NjczLCAweDFCRkQsIDB4ODY3NCwgMHgxQkZCLCAweDg2NzcsIDB4MUJGQSwKLSAgICAweDg2NzksIDB4MDgwMCwgMHg4NjdBLCAweDA4MDIsIDB4ODY3QiwgMHgwODAxLCAweDg2N0MsIDB4MUJGQywKLSAgICAweDg2ODUsIDB4MURFRiwgMHg4Njg2LCAweDFERUMsIDB4ODY4NywgMHgxREVBLCAweDg2OEEsIDB4MDlCMCwKLSAgICAweDg2OEIsIDB4MURFRCwgMHg4NjhDLCAweDA5QjUsIDB4ODY4RCwgMHgxREU3LCAweDg2OEUsIDB4MURGNiwKLSAgICAweDg2OTAsIDB4MURGOCwgMHg4NjkxLCAweDFERTgsIDB4ODY5MywgMHgwOUIyLCAweDg2OTQsIDB4MURGOSwKLSAgICAweDg2OTUsIDB4MURGNCwgMHg4Njk2LCAweDFERTYsIDB4ODY5NywgMHgxREVCLCAweDg2OTgsIDB4MURGNSwKLSAgICAweDg2OTksIDB4MURGMSwgMHg4NjlBLCAweDFERUUsIDB4ODY5QywgMHgwOUI3LCAweDg2OUQsIDB4MURGNywKLSAgICAweDg2OUUsIDB4MURFOSwgMHg4NkExLCAweDFERjIsIDB4ODZBMiwgMHgxREU0LCAweDg2QTMsIDB4MDlCNiwKLSAgICAweDg2QTQsIDB4MDlCMywgMHg4NkE1LCAweDFERjAsIDB4ODZBNywgMHgxREYzLCAweDg2QTgsIDB4MURFNSwKLSAgICAweDg2QTksIDB4MDlCNCwgMHg4NkFBLCAweDA5QjEsIDB4ODZBRiwgMHgwQjkyLCAweDg2QjAsIDB4MjA0MywKLSAgICAweDg2QjEsIDB4MEI5MSwgMHg4NkIzLCAweDIwNDYsIDB4ODZCNCwgMHgyMDQ5LCAweDg2QjUsIDB4MEI4RSwKLSAgICAweDg2QjYsIDB4MEI4QywgMHg4NkI3LCAweDIwM0UsIDB4ODZCOCwgMHgyMDQ3LCAweDg2QjksIDB4MjA0NSwKLSAgICAweDg2QkEsIDB4MjA0MiwgMHg4NkJCLCAweDIwNEEsIDB4ODZCQywgMHgyMDRCLCAweDg2QkQsIDB4MjA0RCwKLSAgICAweDg2QkUsIDB4MjA0RSwgMHg4NkJGLCAweDIwM0QsIDB4ODZDMCwgMHgwQjhCLCAweDg2QzEsIDB4MjA0MCwKLSAgICAweDg2QzIsIDB4MjAzRiwgMHg4NkMzLCAweDIwNEMsIDB4ODZDNCwgMHgwQjhELCAweDg2QzUsIDB4MjA0MSwKLSAgICAweDg2QzYsIDB4MEI4RiwgMHg4NkM3LCAweDBCOEEsIDB4ODZDOCwgMHgyMDQ0LCAweDg2QzksIDB4MEI5MywKLSAgICAweDg2Q0IsIDB4MEI5MCwgMHg4NkNDLCAweDIwNDgsIDB4ODZEMCwgMHgwRDRGLCAweDg2RDEsIDB4MjJEMiwKLSAgICAweDg2RDMsIDB4MjJDNywgMHg4NkQ0LCAweDBENEMsIDB4ODZENiwgMHgyNTZELCAweDg2RDcsIDB4MjJEMCwKLSAgICAweDg2RDgsIDB4MjJDNCwgMHg4NkQ5LCAweDBENEEsIDB4ODZEQSwgMHgyMkM5LCAweDg2REIsIDB4MEQ0RCwKLSAgICAweDg2REMsIDB4MjJDRCwgMHg4NkRELCAweDIyQ0IsIDB4ODZERSwgMHgwRDUwLCAweDg2REYsIDB4MEQ0OSwKLSAgICAweDg2RTIsIDB4MjJDNSwgMHg4NkUzLCAweDIyQzgsIDB4ODZFNCwgMHgwRDRFLCAweDg2RTYsIDB4MjJDNiwKLSAgICAweDg2RTgsIDB4MjJEMSwgMHg4NkU5LCAweDIyQ0YsIDB4ODZFQSwgMHgyMkNBLCAweDg2RUIsIDB4MjJDQywKLSAgICAweDg2RUMsIDB4MjJDRSwgMHg4NkVELCAweDBENEIsIDB4ODZGNSwgMHgyNTZFLCAweDg2RjYsIDB4MjU3NCwKLSAgICAweDg2RjcsIDB4MjU2QSwgMHg4NkY4LCAweDI1NzAsIDB4ODZGOSwgMHgwRUVGLCAweDg2RkEsIDB4MjU2QywKLSAgICAweDg2RkIsIDB4MEVGNSwgMHg4NkZFLCAweDBFRjQsIDB4ODcwMCwgMHgwRUYzLCAweDg3MDEsIDB4MjU3MywKLSAgICAweDg3MDIsIDB4MEVGNiwgMHg4NzAzLCAweDBFRjcsIDB4ODcwNCwgMHgyNTY5LCAweDg3MDUsIDB4MjU3NiwKLSAgICAweDg3MDYsIDB4MEVGOCwgMHg4NzA3LCAweDBFRjIsIDB4ODcwOCwgMHgwRUYxLCAweDg3MDksIDB4MjU3MiwKLSAgICAweDg3MEEsIDB4MEVGOSwgMHg4NzBCLCAweDI1NjgsIDB4ODcwQywgMHgyNTZCLCAweDg3MEQsIDB4MjU3NSwKLSAgICAweDg3MEUsIDB4MjU3MSwgMHg4NzExLCAweDI3RUUsIDB4ODcxMiwgMHgyN0UzLCAweDg3MTMsIDB4MEVGMCwKLSAgICAweDg3MTgsIDB4MTA5OCwgMHg4NzE5LCAweDI3RDcsIDB4ODcxQSwgMHgyN0VDLCAweDg3MUIsIDB4MjdEOCwKLSAgICAweDg3MUMsIDB4MTA5MywgMHg4NzFFLCAweDI3RDUsIDB4ODcyMCwgMHgyN0RFLCAweDg3MjEsIDB4MjdENiwKLSAgICAweDg3MjIsIDB4MTA5NSwgMHg4NzIzLCAweDI3RDAsIDB4ODcyNCwgMHgyN0VCLCAweDg3MjUsIDB4MTA5NiwKLSAgICAweDg3MjYsIDB4MjdFOCwgMHg4NzI3LCAweDI3RTksIDB4ODcyOCwgMHgyN0QxLCAweDg3MjksIDB4MTA5QiwKLSAgICAweDg3MkEsIDB4MjdFMCwgMHg4NzJDLCAweDI3REEsIDB4ODcyRCwgMHgyN0UxLCAweDg3MkUsIDB4MjdENCwKLSAgICAweDg3MzAsIDB4MjdFRCwgMHg4NzMxLCAweDI3RTUsIDB4ODczMiwgMHgyN0RGLCAweDg3MzMsIDB4MjdDRiwKLSAgICAweDg3MzQsIDB4MTA5NywgMHg4NzM1LCAweDI3RTYsIDB4ODczNywgMHgxMDlBLCAweDg3MzgsIDB4MjdFQSwKLSAgICAweDg3M0EsIDB4MjdFNCwgMHg4NzNCLCAweDEwOTQsIDB4ODczQywgMHgyN0UyLCAweDg3M0UsIDB4MjdEQywKLSAgICAweDg3M0YsIDB4MTA5MiwgMHg4NzQwLCAweDI3RDMsIDB4ODc0MSwgMHgyN0RCLCAweDg3NDIsIDB4MjdFNywKLSAgICAweDg3NDMsIDB4MjdEOSwgMHg4NzQ2LCAweDI3REQsIDB4ODc0QywgMHgxMjA4LCAweDg3NEQsIDB4MjU2RiwKLSAgICAweDg3NEUsIDB4MkEyMCwgMHg4NzRGLCAweDJBMjksIDB4ODc1MCwgMHgyQTFGLCAweDg3NTEsIDB4MkExQiwKLSAgICAweDg3NTIsIDB4MkExOCwgMHg4NzUzLCAweDEyMDksIDB4ODc1NCwgMHgyQTE2LCAweDg3NTUsIDB4MTA5OSwKLSAgICAweDg3NTYsIDB4MkEwRiwgMHg4NzU3LCAweDEyMDcsIDB4ODc1OCwgMHgyQTE1LCAweDg3NTksIDB4MTIwNiwKLSAgICAweDg3NUEsIDB4MkExQSwgMHg4NzVCLCAweDJBMTcsIDB4ODc1QywgMHgyQTI3LCAweDg3NUQsIDB4MkEyMiwKLSAgICAweDg3NUUsIDB4MkExQywgMHg4NzVGLCAweDJBMjEsIDB4ODc2MCwgMHgxMjAyLCAweDg3NjEsIDB4MkExOSwKLSAgICAweDg3NjIsIDB4MkEyQywgMHg4NzYzLCAweDJBMTAsIDB4ODc2NCwgMHgyQTExLCAweDg3NjUsIDB4MkEyOCwKLSAgICAweDg3NjYsIDB4MTIwMywgMHg4NzY3LCAweDJBMkQsIDB4ODc2OCwgMHgxMjA1LCAweDg3NjksIDB4MkEyRSwKLSAgICAweDg3NkEsIDB4MkExRSwgMHg4NzZCLCAweDI3RDIsIDB4ODc2QywgMHgyQTI0LCAweDg3NkQsIDB4MkExRCwKLSAgICAweDg3NkUsIDB4MkEyNiwgMHg4NzZGLCAweDJBMjMsIDB4ODc3MywgMHgyQTE0LCAweDg3NzQsIDB4MTIwMCwKLSAgICAweDg3NzUsIDB4MkEyQiwgMHg4Nzc2LCAweDEyMDEsIDB4ODc3NywgMHgyQTEyLCAweDg3NzgsIDB4MTIwNCwKLSAgICAweDg3NzksIDB4MkM2QiwgMHg4NzdBLCAweDJBMjUsIDB4ODc3QiwgMHgyQTJBLCAweDg3ODEsIDB4MkM2OCwKLSAgICAweDg3ODIsIDB4MTFGRiwgMHg4NzgzLCAweDEzNDAsIDB4ODc4NCwgMHgyQzcyLCAweDg3ODUsIDB4MkM2RSwKLSAgICAweDg3ODcsIDB4MkM2QywgMHg4Nzg4LCAweDJDNjcsIDB4ODc4OSwgMHgyQzc2LCAweDg3OEQsIDB4MTM0NCwKLSAgICAweDg3OEYsIDB4MkM2MywgMHg4NzkwLCAweDJDNkYsIDB4ODc5MSwgMHgyQzcwLCAweDg3OTIsIDB4MkM2NiwKLSAgICAweDg3OTMsIDB4MkM2NSwgMHg4Nzk0LCAweDJDNzMsIDB4ODc5NiwgMHgyQzY5LCAweDg3OTcsIDB4MkM2NCwKLSAgICAweDg3OTgsIDB4MkM2QSwgMHg4NzlBLCAweDJDNzUsIDB4ODc5QiwgMHgyQzYyLCAweDg3OUMsIDB4MkM3NCwKLSAgICAweDg3OUQsIDB4MkM3MSwgMHg4NzlFLCAweDEzNDIsIDB4ODc5RiwgMHgxMzQxLCAweDg3QTIsIDB4MTM0MywKLSAgICAweDg3QTMsIDB4MkM2RCwgMHg4N0E0LCAweDJDNjEsIDB4ODdBQSwgMHgyRTM2LCAweDg3QUIsIDB4MTQ2QywKLSAgICAweDg3QUMsIDB4MkUzQSwgMHg4N0FELCAweDJFMzcsIDB4ODdBRSwgMHgyRTNFLCAweDg3QUYsIDB4MkU0NCwKLSAgICAweDg3QjAsIDB4MkUzOSwgMHg4N0IyLCAweDJFNEQsIDB4ODdCMywgMHgxNDY5LCAweDg3QjQsIDB4MkU0NywKLSAgICAweDg3QjUsIDB4MkUzQywgMHg4N0I2LCAweDJFNDgsIDB4ODdCNywgMHgyRTQzLCAweDg3QjgsIDB4MkU0QSwKLSAgICAweDg3QjksIDB4MkUzQiwgMHg4N0JBLCAweDE0NkUsIDB4ODdCQiwgMHgxNDZELCAweDg3QkMsIDB4MkUzRCwKLSAgICAweDg3QkQsIDB4MkU0QiwgMHg4N0JFLCAweDJFMzUsIDB4ODdCRiwgMHgyRTQ5LCAweDg3QzAsIDB4MTQ2NywKLSAgICAweDg3QzIsIDB4MkU0MSwgMHg4N0MzLCAweDJFNDAsIDB4ODdDNCwgMHgyRTQ1LCAweDg3QzUsIDB4MkUzOCwKLSAgICAweDg3QzYsIDB4MTQ2QiwgMHg4N0M4LCAweDE0NkYsIDB4ODdDOSwgMHgyRTNGLCAweDg3Q0EsIDB4MkU0NiwKLSAgICAweDg3Q0IsIDB4MTQ3MCwgMHg4N0NDLCAweDJFNDIsIDB4ODdEMSwgMHgxNDY4LCAweDg3RDIsIDB4MTQ2QSwKLSAgICAweDg3RDMsIDB4MkZCQSwgMHg4N0Q0LCAweDJGQjgsIDB4ODdENywgMHgyRkJFLCAweDg3RDgsIDB4MkZCQywKLSAgICAweDg3RDksIDB4MkZCRiwgMHg4N0RCLCAweDJGQjEsIDB4ODdEQywgMHgyRkI5LCAweDg3REQsIDB4MkZDMywKLSAgICAweDg3REUsIDB4MkU0QywgMHg4N0RGLCAweDJGQjUsIDB4ODdFMCwgMHgxNTI2LCAweDg3RTEsIDB4MkExMywKLSAgICAweDg3RTIsIDB4MkZCMCwgMHg4N0UzLCAweDJGQkQsIDB4ODdFNCwgMHgyRkI3LCAweDg3RTUsIDB4MkZCNCwKLSAgICAweDg3RTYsIDB4MkZBRiwgMHg4N0U3LCAweDJGQUUsIDB4ODdFOCwgMHgyRkMyLCAweDg3RUEsIDB4MkZCMywKLSAgICAweDg3RUIsIDB4MkZCMiwgMHg4N0VDLCAweDE1MjQsIDB4ODdFRCwgMHgyRkJCLCAweDg3RUYsIDB4MTUyMywKLSAgICAweDg3RjIsIDB4MTUyNSwgMHg4N0YzLCAweDJGQjYsIDB4ODdGNCwgMHgyRkMxLCAweDg3RjYsIDB4MzEwQSwKLSAgICAweDg3RjcsIDB4MzEwQiwgMHg4N0Y5LCAweDE1QkUsIDB4ODdGQSwgMHgzMTA4LCAweDg3RkIsIDB4MTVCQiwKLSAgICAweDg3RkMsIDB4MzExMCwgMHg4N0ZFLCAweDE1QkYsIDB4ODdGRiwgMHgzMTEyLCAweDg4MDAsIDB4MzEwNywKLSAgICAweDg4MDEsIDB4MkZDMCwgMHg4ODAyLCAweDMxMTQsIDB4ODgwMywgMHgzMTA5LCAweDg4MDUsIDB4MTVCQywKLSAgICAweDg4MDYsIDB4MzEwRiwgMHg4ODA4LCAweDMxMTEsIDB4ODgwOSwgMHgzMTBDLCAweDg4MEEsIDB4MzExMywKLSAgICAweDg4MEIsIDB4MzEwRSwgMHg4ODBDLCAweDMxMEQsIDB4ODgwRCwgMHgxNUJELCAweDg4MTAsIDB4MzIyQywKLSAgICAweDg4MTEsIDB4MzIyRCwgMHg4ODEzLCAweDMyMkYsIDB4ODgxNCwgMHgxNjNGLCAweDg4MTUsIDB4MTY0MCwKLSAgICAweDg4MTYsIDB4MzIzMCwgMHg4ODE3LCAweDMyMkUsIDB4ODgxOSwgMHgzMjJCLCAweDg4MUIsIDB4MzMwNiwKLSAgICAweDg4MUMsIDB4MzMwOSwgMHg4ODFELCAweDMzMDUsIDB4ODgxRiwgMHgxNjhCLCAweDg4MjAsIDB4MzMwNywKLSAgICAweDg4MjEsIDB4MTY4QSwgMHg4ODIyLCAweDE2ODksIDB4ODgyMywgMHgxNjg4LCAweDg4MjQsIDB4MzMwOCwKLSAgICAweDg4MjUsIDB4MzNCMSwgMHg4ODI2LCAweDMzQUYsIDB4ODgyOCwgMHgzM0FFLCAweDg4MjksIDB4MzMwNCwKLSAgICAweDg4MkEsIDB4MzNCMCwgMHg4ODJCLCAweDMzMEEsIDB4ODgyQywgMHgzM0FELCAweDg4MkUsIDB4MzQzNywKLSAgICAweDg4MkYsIDB4MzQxNSwgMHg4ODMwLCAweDM0MzUsIDB4ODgzMSwgMHgxNzA5LCAweDg4MzIsIDB4MzQzNiwKLSAgICAweDg4MzMsIDB4MzQzOCwgMHg4ODM1LCAweDM0OUEsIDB4ODgzNiwgMHgxNzI4LCAweDg4MzcsIDB4MzQ5OSwKLSAgICAweDg4MzgsIDB4MzQ5OCwgMHg4ODM5LCAweDE3MjksIDB4ODgzQiwgMHgxNzQ3LCAweDg4M0MsIDB4MzUwOCwKLSAgICAweDg4M0QsIDB4MzUyMCwgMHg4ODNFLCAweDM1MUYsIDB4ODgzRiwgMHgzNTIxLCAweDg4NDAsIDB4MDQxMCwKLSAgICAweDg4NDEsIDB4MUJGRSwgMHg4ODQzLCAweDFERkEsIDB4ODg0NCwgMHgxREZCLCAweDg4NDgsIDB4MjJEMywKLSAgICAweDg4NEEsIDB4MzMwQiwgMHg4ODRCLCAweDM0OUIsIDB4ODg0QywgMHgwNDExLCAweDg4NEQsIDB4MDgwMywKLSAgICAweDg4NEUsIDB4MUJGRiwgMHg4ODUyLCAweDIwNEYsIDB4ODg1MywgMHgwQjk0LCAweDg4NTUsIDB4MjJENSwKLSAgICAweDg4NTYsIDB4MjJENCwgMHg4ODU3LCAweDBENTEsIDB4ODg1OSwgMHgwRUZBLCAweDg4NUEsIDB4MkEyRiwKLSAgICAweDg4NUIsIDB4MTIwQSwgMHg4ODVELCAweDEyMEIsIDB4ODg2MSwgMHgxMzQ1LCAweDg4NjIsIDB4MTcyQSwKLSAgICAweDg4NjMsIDB4MDQxMiwgMHg4ODY3LCAweDFDMDAsIDB4ODg2OCwgMHgwNjhDLCAweDg4NjksIDB4MUMwMiwKLSAgICAweDg4NkEsIDB4MUMwMSwgMHg4ODZCLCAweDA4MDQsIDB4ODg2RCwgMHgxREZDLCAweDg4NkYsIDB4MUUwMywKLSAgICAweDg4NzAsIDB4MDlCOCwgMHg4ODcxLCAweDFFMDEsIDB4ODg3MiwgMHgxREZGLCAweDg4NzQsIDB4MUUwNiwKLSAgICAweDg4NzUsIDB4MURGRCwgMHg4ODc2LCAweDFERkUsIDB4ODg3NywgMHgwOUI5LCAweDg4NzksIDB4MDlCRCwKLSAgICAweDg4N0MsIDB4MUUwNywgMHg4ODdELCAweDA5QkMsIDB4ODg3RSwgMHgxRTA1LCAweDg4N0YsIDB4MUUwMiwKLSAgICAweDg4ODAsIDB4MUUwMCwgMHg4ODgxLCAweDA5QkEsIDB4ODg4MiwgMHgwOUJCLCAweDg4ODMsIDB4MUUwNCwKLSAgICAweDg4ODgsIDB4MEI5NiwgMHg4ODg5LCAweDIwNTAsIDB4ODg4QiwgMHgwQjlCLCAweDg4OEMsIDB4MjA2MCwKLSAgICAweDg4OEQsIDB4MEI5QSwgMHg4ODhFLCAweDIwNjIsIDB4ODg5MSwgMHgyMDU2LCAweDg4OTIsIDB4MEI5OCwKLSAgICAweDg4OTMsIDB4MjA2MSwgMHg4ODk1LCAweDIwNTEsIDB4ODg5NiwgMHgwQjk5LCAweDg4OTcsIDB4MjA1RCwKLSAgICAweDg4OTgsIDB4MjA1OSwgMHg4ODk5LCAweDIwNUIsIDB4ODg5QSwgMHgyMDU1LCAweDg4OUIsIDB4MjA1QywKLSAgICAweDg4OUUsIDB4MEI5NSwgMHg4ODlGLCAweDIwNTgsIDB4ODhBMSwgMHgyMDU3LCAweDg4QTIsIDB4MjA1MywKLSAgICAweDg4QTQsIDB4MjA1RSwgMHg4OEE3LCAweDIwNUEsIDB4ODhBOCwgMHgyMDUyLCAweDg4QUEsIDB4MjA1NCwKLSAgICAweDg4QUIsIDB4MEI5NywgMHg4OEFDLCAweDIwNUYsIDB4ODhCMSwgMHgwRDU0LCAweDg4QjIsIDB4MjJFMCwKLSAgICAweDg4QjYsIDB4MjJEQywgMHg4OEI3LCAweDIyREUsIDB4ODhCOCwgMHgyMkQ5LCAweDg4QjksIDB4MjJEOCwKLSAgICAweDg4QkEsIDB4MjJENiwgMHg4OEJDLCAweDIyREQsIDB4ODhCRCwgMHgyMkRGLCAweDg4QkUsIDB4MjJEQiwKLSAgICAweDg4QzAsIDB4MjJEQSwgMHg4OEMxLCAweDBENTIsIDB4ODhDMiwgMHgwRDUzLCAweDg4QzksIDB4MjJFMiwKLSAgICAweDg4Q0EsIDB4MEYwMiwgMHg4OENCLCAweDI1NzgsIDB4ODhDQywgMHgyNTdFLCAweDg4Q0QsIDB4MjU3OSwKLSAgICAweDg4Q0UsIDB4MjU3QSwgMHg4OENGLCAweDM2RUEsIDB4ODhEMCwgMHgyNTdGLCAweDg4RDIsIDB4MEYwNCwKLSAgICAweDg4RDQsIDB4MEVGQywgMHg4OEQ1LCAweDBGMDMsIDB4ODhENiwgMHgyNTc3LCAweDg4RDcsIDB4MjJENywKLSAgICAweDg4RDgsIDB4MEVGRiwgMHg4OEQ5LCAweDBFRkQsIDB4ODhEQSwgMHgyNTdELCAweDg4REIsIDB4MjU3QywKLSAgICAweDg4REMsIDB4MEVGRSwgMHg4OERELCAweDBGMDAsIDB4ODhERSwgMHgyNTdCLCAweDg4REYsIDB4MEVGQiwKLSAgICAweDg4RTEsIDB4MEYwMSwgMHg4OEU3LCAweDI3RjAsIDB4ODhFOCwgMHgxMEEyLCAweDg4RUIsIDB4MjdGQiwKLSAgICAweDg4RUMsIDB4MjdGQSwgMHg4OEVFLCAweDI3RjUsIDB4ODhFRiwgMHgxMEE0LCAweDg4RjAsIDB4MjdGOSwKLSAgICAweDg4RjEsIDB4MjdGMSwgMHg4OEYyLCAweDI3RjIsIDB4ODhGMywgMHgxMDlDLCAweDg4RjQsIDB4MTA5RSwKLSAgICAweDg4RjYsIDB4MjdGNywgMHg4OEY3LCAweDI3RUYsIDB4ODhGOCwgMHgxMEEwLCAweDg4RjksIDB4MTA5RiwKLSAgICAweDg4RkEsIDB4MjdGMywgMHg4OEZCLCAweDI3RjgsIDB4ODhGQywgMHgyN0Y2LCAweDg4RkQsIDB4MTBBMSwKLSAgICAweDg4RkUsIDB4MjdGNCwgMHg4OTAxLCAweDIyRTEsIDB4ODkwMiwgMHgxMDlELCAweDg5MDUsIDB4MkEzMCwKLSAgICAweDg5MDYsIDB4MkEzNywgMHg4OTA3LCAweDEyMEQsIDB4ODkwOSwgMHgyQTNCLCAweDg5MEEsIDB4MTIxMSwKLSAgICAweDg5MEIsIDB4MkEzMywgMHg4OTBDLCAweDJBMzEsIDB4ODkwRSwgMHgyQTNBLCAweDg5MTAsIDB4MTIwQywKLSAgICAweDg5MTEsIDB4MkEzOSwgMHg4OTEyLCAweDEyMEUsIDB4ODkxMywgMHgxMjBGLCAweDg5MTQsIDB4MkEzMiwKLSAgICAweDg5MTUsIDB4MTIxMCwgMHg4OTE2LCAweDJBMzgsIDB4ODkxNywgMHgyQTM0LCAweDg5MTgsIDB4MkEzNSwKLSAgICAweDg5MTksIDB4MkEzNiwgMHg4OTFBLCAweDEwQTMsIDB4ODkxRSwgMHgyQzc3LCAweDg5MUYsIDB4MkM4MywKLSAgICAweDg5MjEsIDB4MTM0QSwgMHg4OTIyLCAweDJDN0UsIDB4ODkyMywgMHgyQzgwLCAweDg5MjUsIDB4MTM0OCwKLSAgICAweDg5MjYsIDB4MkM3OCwgMHg4OTI3LCAweDJDN0MsIDB4ODkyOSwgMHgyQzdGLCAweDg5MkEsIDB4MTM0NiwKLSAgICAweDg5MkIsIDB4MTM0OSwgMHg4OTJDLCAweDJDODIsIDB4ODkyRCwgMHgyQzdBLCAweDg5MkUsIDB4MkM3QiwKLSAgICAweDg5MkYsIDB4MkM4MSwgMHg4OTMwLCAweDJDNzksIDB4ODkzMSwgMHgyQzdELCAweDg5MzIsIDB4MTM0NywKLSAgICAweDg5MzMsIDB4MkU0RiwgMHg4OTM1LCAweDJFNEUsIDB4ODkzNiwgMHgxNDcyLCAweDg5MzcsIDB4MkU1NCwKLSAgICAweDg5MzgsIDB4MTQ3NCwgMHg4OTNCLCAweDE0NzEsIDB4ODkzQywgMHgyRTUwLCAweDg5M0QsIDB4MTQ3NSwKLSAgICAweDg5M0UsIDB4MkU1MSwgMHg4OTQxLCAweDJFNTIsIDB4ODk0MiwgMHgyRTU1LCAweDg5NDQsIDB4MTQ3MywKLSAgICAweDg5NDYsIDB4MkZDOCwgMHg4OTQ5LCAweDJGQ0IsIDB4ODk0QiwgMHgyRkM1LCAweDg5NEMsIDB4MkZDNywKLSAgICAweDg5NEYsIDB4MkZDNiwgMHg4OTUwLCAweDJGQzksIDB4ODk1MSwgMHgyRkNBLCAweDg5NTIsIDB4MkU1MywKLSAgICAweDg5NTMsIDB4MkZDNCwgMHg4OTU2LCAweDE1QzIsIDB4ODk1NywgMHgzMTE4LCAweDg5NTgsIDB4MzExQiwKLSAgICAweDg5NTksIDB4MzExRCwgMHg4OTVBLCAweDMxMTYsIDB4ODk1QiwgMHgzMTE3LCAweDg5NUMsIDB4MzExQSwKLSAgICAweDg5NUQsIDB4MzExQywgMHg4OTVFLCAweDE1QzMsIDB4ODk1RiwgMHgxNUMxLCAweDg5NjAsIDB4MTVDMCwKLSAgICAweDg5NjEsIDB4MzExOSwgMHg4OTYyLCAweDMxMTUsIDB4ODk2MywgMHgzMjMxLCAweDg5NjQsIDB4MTY0MSwKLSAgICAweDg5NjYsIDB4MzIzMiwgMHg4OTY5LCAweDMzMEQsIDB4ODk2QSwgMHgxNjhDLCAweDg5NkIsIDB4MzMwRiwKLSAgICAweDg5NkMsIDB4MTY4RCwgMHg4OTZELCAweDMzMEMsIDB4ODk2RSwgMHgzMzBFLCAweDg5NkYsIDB4MTZENiwKLSAgICAweDg5NzEsIDB4MzNCMiwgMHg4OTcyLCAweDE2RDUsIDB4ODk3MywgMHgzNDNCLCAweDg5NzQsIDB4MzQzQSwKLSAgICAweDg5NzYsIDB4MzQzOSwgMHg4OTc5LCAweDM0RTIsIDB4ODk3QSwgMHgzNEUzLCAweDg5N0IsIDB4MzRFNSwKLSAgICAweDg5N0MsIDB4MzRFNCwgMHg4OTdFLCAweDE4MTksIDB4ODk3RiwgMHgwNDEzLCAweDg5ODEsIDB4MDgwNSwKLSAgICAweDg5ODIsIDB4MjA2MywgMHg4OTgzLCAweDBENTUsIDB4ODk4NSwgMHgyNTgwLCAweDg5ODYsIDB4MTUyNywKLSAgICAweDg5ODgsIDB4MzExRSwgMHg4OThCLCAweDA1MDgsIDB4ODk4RiwgMHgwQjlELCAweDg5OTMsIDB4MEI5QywKLSAgICAweDg5OTUsIDB4MjJFMywgMHg4OTk2LCAweDBENTYsIDB4ODk5NywgMHgyMkU1LCAweDg5OTgsIDB4MjJFNCwKLSAgICAweDg5OUIsIDB4MjU4MSwgMHg4OTlDLCAweDBGMDUsIDB4ODk5RCwgMHgyN0ZDLCAweDg5OUUsIDB4MjdGRiwKLSAgICAweDg5OUYsIDB4MjdGRSwgMHg4OUExLCAweDI3RkQsIDB4ODlBMiwgMHgyQTNDLCAweDg5QTMsIDB4MkEzRSwKLSAgICAweDg5QTQsIDB4MkEzRCwgMHg4OUE2LCAweDEzNEMsIDB4ODlBQSwgMHgxMzRCLCAweDg5QUMsIDB4MTQ3NiwKLSAgICAweDg5QUQsIDB4MkU1NiwgMHg4OUFFLCAweDJFNTgsIDB4ODlBRiwgMHgyRTU3LCAweDg5QjIsIDB4MTUyOCwKLSAgICAweDg5QjYsIDB4MzEyMCwgMHg4OUI3LCAweDMxMUYsIDB4ODlCOSwgMHgzMjMzLCAweDg5QkEsIDB4MTY0MiwKLSAgICAweDg5QkQsIDB4MTY4RSwgMHg4OUJFLCAweDMzQjQsIDB4ODlCRiwgMHgzM0IzLCAweDg5QzAsIDB4MTc0OCwKLSAgICAweDg5RDIsIDB4MDUwOSwgMHg4OUQzLCAweDFDMDMsIDB4ODlENCwgMHgwODA2LCAweDg5RDUsIDB4MjA2NiwKLSAgICAweDg5RDYsIDB4MjA2NCwgMHg4OUQ5LCAweDIwNjUsIDB4ODlEQSwgMHgyMkU3LCAweDg5REIsIDB4MjJFOCwKLSAgICAweDg5REMsIDB4MjU4OCwgMHg4OURELCAweDIyRTYsIDB4ODlERiwgMHgyNTgyLCAweDg5RTAsIDB4MjU4NiwKLSAgICAweDg5RTEsIDB4MjU4NSwgMHg4OUUyLCAweDI1ODcsIDB4ODlFMywgMHgwRjA2LCAweDg5RTQsIDB4MjU4NCwKLSAgICAweDg5RTUsIDB4MjU4MywgMHg4OUU2LCAweDI1ODksIDB4ODlFOCwgMHgyODAyLCAweDg5RTksIDB4MjgwMCwKLSAgICAweDg5RUIsIDB4MjgwMSwgMHg4OUVDLCAweDJBNDEsIDB4ODlFRCwgMHgyQTNGLCAweDg5RjAsIDB4MkE0MCwKLSAgICAweDg5RjEsIDB4MkM4NCwgMHg4OUYyLCAweDJFNTksIDB4ODlGMywgMHgyRTVBLCAweDg5RjQsIDB4MTUyOSwKLSAgICAweDg5RjYsIDB4MzEyMSwgMHg4OUY3LCAweDMyMzQsIDB4ODlGOCwgMHgxNjQzLCAweDg5RkEsIDB4MzMxMCwKLSAgICAweDg5RkIsIDB4MzNCNSwgMHg4OUZDLCAweDE2RDcsIDB4ODlGRSwgMHgzNDNDLCAweDg5RkYsIDB4MzRFNiwKLSAgICAweDhBMDAsIDB4MDUwQSwgMHg4QTAyLCAweDA4MDgsIDB4OEEwMywgMHgwODA5LCAweDhBMDQsIDB4MUMwNCwKLSAgICAweDhBMDcsIDB4MUMwNSwgMHg4QTA4LCAweDA4MDcsIDB4OEEwQSwgMHgwOUMzLCAweDhBMEMsIDB4MDlDMSwKLSAgICAweDhBMEUsIDB4MDlDMCwgMHg4QTBGLCAweDA5QzcsIDB4OEExMCwgMHgwOUJGLCAweDhBMTEsIDB4MDlDOCwKLSAgICAweDhBMTIsIDB4MUUwOCwgMHg4QTEzLCAweDA5QzUsIDB4OEExNSwgMHgwOUMyLCAweDhBMTYsIDB4MDlDNiwKLSAgICAweDhBMTcsIDB4MDlDNCwgMHg4QTE4LCAweDA5QkUsIDB4OEExQiwgMHgwQkE1LCAweDhBMUQsIDB4MEI5RiwKLSAgICAweDhBMUUsIDB4MjA2QSwgMHg4QTFGLCAweDBCQTQsIDB4OEEyMiwgMHgwQkE2LCAweDhBMjMsIDB4MEJBMCwKLSAgICAweDhBMjUsIDB4MEJBMSwgMHg4QTI3LCAweDIwNjgsIDB4OEEyQSwgMHgwQjlFLCAweDhBMkMsIDB4MjA2OSwKLSAgICAweDhBMkQsIDB4MEJBMywgMHg4QTMwLCAweDIwNjcsIDB4OEEzMSwgMHgwQkEyLCAweDhBMzQsIDB4MEQ2MSwKLSAgICAweDhBMzYsIDB4MEQ2MywgMHg4QTM5LCAweDIyRUIsIDB4OEEzQSwgMHgwRDYyLCAweDhBM0IsIDB4MEQ1NywKLSAgICAweDhBM0MsIDB4MEQ1QiwgMHg4QTNFLCAweDBGMTksIDB4OEEzRiwgMHgyNThFLCAweDhBNDAsIDB4MjJFRCwKLSAgICAweDhBNDEsIDB4MEQ1QywgMHg4QTQ0LCAweDIyRjAsIDB4OEE0NSwgMHgyMkYxLCAweDhBNDYsIDB4MEQ2MCwKLSAgICAweDhBNDgsIDB4MjJGMywgMHg4QTRBLCAweDIyRjUsIDB4OEE0QywgMHgyMkY2LCAweDhBNEQsIDB4MjJFQSwKLSAgICAweDhBNEUsIDB4MjJFOSwgMHg4QTRGLCAweDIyRjcsIDB4OEE1MCwgMHgwRDVGLCAweDhBNTEsIDB4MjJGNCwKLSAgICAweDhBNTIsIDB4MjJGMiwgMHg4QTU0LCAweDBENUQsIDB4OEE1NSwgMHgwRDU5LCAweDhBNTYsIDB4MEQ2NCwKLSAgICAweDhBNTcsIDB4MjJFRSwgMHg4QTU4LCAweDIyRUYsIDB4OEE1OSwgMHgyMkVDLCAweDhBNUIsIDB4MEQ1RSwKLSAgICAweDhBNUUsIDB4MEQ1QSwgMHg4QTYwLCAweDBENTgsIDB4OEE2MSwgMHgyNThELCAweDhBNjIsIDB4MEYxNCwKLSAgICAweDhBNjMsIDB4MEYwRiwgMHg4QTY2LCAweDBGMEEsIDB4OEE2OCwgMHgwRjFBLCAweDhBNjksIDB4MEYwQiwKLSAgICAweDhBNkIsIDB4MEYwNywgMHg4QTZDLCAweDBGMTYsIDB4OEE2RCwgMHgwRjEzLCAweDhBNkUsIDB4MEYxNSwKLSAgICAweDhBNzAsIDB4MEYwQywgMHg4QTcxLCAweDBGMTEsIDB4OEE3MiwgMHgwRjA4LCAweDhBNzMsIDB4MEYwOSwKLSAgICAweDhBNzQsIDB4MjU5NSwgMHg4QTc1LCAweDI1OTIsIDB4OEE3NiwgMHgyNThBLCAweDhBNzcsIDB4MjU4RiwKLSAgICAweDhBNzksIDB4MEYxNywgMHg4QTdBLCAweDI1OTYsIDB4OEE3QiwgMHgwRjE4LCAweDhBN0MsIDB4MEYwRSwKLSAgICAweDhBN0YsIDB4MjU4QywgMHg4QTgxLCAweDI1OTQsIDB4OEE4MiwgMHgyNTkwLCAweDhBODMsIDB4MjU5MywKLSAgICAweDhBODQsIDB4MjU5MSwgMHg4QTg1LCAweDBGMTIsIDB4OEE4NiwgMHgyNThCLCAweDhBODcsIDB4MEYwRCwKLSAgICAweDhBOEIsIDB4MjgwNSwgMHg4QThDLCAweDEwQTYsIDB4OEE4RCwgMHgxMEE5LCAweDhBOEYsIDB4MjgwNywKLSAgICAweDhBOTEsIDB4MTBCMSwgMHg4QTkyLCAweDI4MDYsIDB4OEE5MywgMHgxMEFCLCAweDhBOTUsIDB4MTIxNiwKLSAgICAweDhBOTYsIDB4MjgwOCwgMHg4QTk4LCAweDEwQjAsIDB4OEE5OSwgMHgyODA0LCAweDhBOUEsIDB4MTBCMiwKLSAgICAweDhBOUUsIDB4MTBBNywgMHg4QUEwLCAweDBGMTAsIDB4OEFBMSwgMHgxMEFBLCAweDhBQTMsIDB4MTBBOCwKLSAgICAweDhBQTQsIDB4MTBBQywgMHg4QUE1LCAweDEwQUUsIDB4OEFBNiwgMHgxMEE1LCAweDhBQTcsIDB4MTBCMywKLSAgICAweDhBQTgsIDB4MTBBRiwgMHg4QUFBLCAweDEwQUQsIDB4OEFBQiwgMHgyODAzLCAweDhBQjAsIDB4MTIxRCwKLSAgICAweDhBQjIsIDB4MTIxOSwgMHg4QUI2LCAweDEyMjAsIDB4OEFCOCwgMHgyQTQ0LCAweDhBQjksIDB4MTIyMSwKLSAgICAweDhBQkEsIDB4MkE1MCwgMHg4QUJCLCAweDJBNDksIDB4OEFCQywgMHgxMjEyLCAweDhBQkQsIDB4MkE1MSwKLSAgICAweDhBQkUsIDB4MkE0QiwgMHg4QUJGLCAweDEyMUMsIDB4OEFDMCwgMHgyQTRDLCAweDhBQzIsIDB4MTIxQiwKLSAgICAweDhBQzMsIDB4MkE0RiwgMHg4QUM0LCAweDEyMTUsIDB4OEFDNSwgMHgyQTRELCAweDhBQzYsIDB4MkE0MywKLSAgICAweDhBQzcsIDB4MTIxNCwgMHg4QUM4LCAweDJDOEYsIDB4OEFDOSwgMHgxMjFBLCAweDhBQ0IsIDB4MTIxNywKLSAgICAweDhBQ0QsIDB4MTIxRiwgMHg4QUNGLCAweDJBNDIsIDB4OEFEMSwgMHgyQTQ2LCAweDhBRDIsIDB4MTIxMywKLSAgICAweDhBRDMsIDB4MkE0NSwgMHg4QUQ0LCAweDJBNDcsIDB4OEFENSwgMHgyQTQ4LCAweDhBRDYsIDB4MTIxRSwKLSAgICAweDhBRDcsIDB4MkE0QSwgMHg4QUQ4LCAweDJBNEUsIDB4OEFEOSwgMHgyQTUyLCAweDhBREIsIDB4MTIyMiwKLSAgICAweDhBREMsIDB4MTM1MiwgMHg4QURELCAweDJDOEEsIDB4OEFERSwgMHgyQzkwLCAweDhBREYsIDB4MkM4RCwKLSAgICAweDhBRTAsIDB4MkM4NSwgMHg4QUUxLCAweDJDOTEsIDB4OEFFMiwgMHgyQzg2LCAweDhBRTQsIDB4MkM4QywKLSAgICAweDhBRTYsIDB4MTM0RCwgMHg4QUU3LCAweDEzNTMsIDB4OEFFOCwgMHgyQzkyLCAweDhBRUIsIDB4MTM0RiwKLSAgICAweDhBRUQsIDB4MTM1OSwgMHg4QUVFLCAweDEzNTQsIDB4OEFFRiwgMHgyQzk0LCAweDhBRjAsIDB4MkM4RSwKLSAgICAweDhBRjEsIDB4MTM1MCwgMHg4QUYyLCAweDJDODcsIDB4OEFGMywgMHgxMzVBLCAweDhBRjQsIDB4MkM4OCwKLSAgICAweDhBRjUsIDB4MkM4OSwgMHg4QUY2LCAweDEzNUIsIDB4OEFGNywgMHgxMzU4LCAweDhBRjgsIDB4MTIxOCwKLSAgICAweDhBRkEsIDB4MTM0RSwgMHg4QUZCLCAweDJDOTUsIDB4OEFGQywgMHgxMzVDLCAweDhBRkUsIDB4MTM1NSwKLSAgICAweDhBRkYsIDB4MkM5MywgMHg4QjAwLCAweDEzNTEsIDB4OEIwMSwgMHgxMzU2LCAweDhCMDIsIDB4MTM1NywKLSAgICAweDhCMDQsIDB4MTQ3RSwgMHg4QjA1LCAweDJFNUYsIDB4OEIwNiwgMHgyRTY4LCAweDhCMDcsIDB4MkU2NSwKLSAgICAweDhCMDgsIDB4MkU2NywgMHg4QjBBLCAweDE0N0IsIDB4OEIwQiwgMHgyRTYwLCAweDhCMEQsIDB4MkU2NiwKLSAgICAweDhCMEUsIDB4MTQ3NywgMHg4QjBGLCAweDJFNjIsIDB4OEIxMCwgMHgxNDdGLCAweDhCMTEsIDB4MkU1RSwKLSAgICAweDhCMTIsIDB4MkU2MywgMHg4QjEzLCAweDJFNkEsIDB4OEIxNCwgMHgyQzhCLCAweDhCMTUsIDB4MkU2NCwKLSAgICAweDhCMTYsIDB4MkU1RCwgMHg4QjE3LCAweDE0NzgsIDB4OEIxOCwgMHgyRTVDLCAweDhCMTksIDB4MTQ3OSwKLSAgICAweDhCMUEsIDB4MkU2QiwgMHg4QjFCLCAweDE0N0EsIDB4OEIxQywgMHgyRTY5LCAweDhCMUQsIDB4MTQ3RCwKLSAgICAweDhCMUUsIDB4MkU1QiwgMHg4QjIwLCAweDE0N0MsIDB4OEIyMiwgMHgyRTYxLCAweDhCMjMsIDB4MkZDRSwKLSAgICAweDhCMjQsIDB4MkZEQywgMHg4QjI1LCAweDJGRDcsIDB4OEIyNiwgMHgyRkQ5LCAweDhCMjcsIDB4MkZDRCwKLSAgICAweDhCMjgsIDB4MTUyQSwgMHg4QjJBLCAweDJGQ0MsIDB4OEIyQiwgMHgxNTJELCAweDhCMkMsIDB4MTUyQywKLSAgICAweDhCMkUsIDB4MkZEQiwgMHg4QjJGLCAweDJGRDMsIDB4OEIzMCwgMHgyRkQwLCAweDhCMzEsIDB4MkZENiwKLSAgICAweDhCMzMsIDB4MkZDRiwgMHg4QjM1LCAweDJGRDEsIDB4OEIzNiwgMHgyRkRBLCAweDhCMzcsIDB4MkZEOCwKLSAgICAweDhCMzksIDB4MTUyQiwgMHg4QjNBLCAweDJGREYsIDB4OEIzQiwgMHgyRkRELCAweDhCM0MsIDB4MkZENCwKLSAgICAweDhCM0QsIDB4MkZERSwgMHg4QjNFLCAweDJGRDUsIDB4OEI0MCwgMHgzMTI1LCAweDhCNDEsIDB4MTVDNCwKLSAgICAweDhCNDIsIDB4MzEyQywgMHg4QjQ1LCAweDMzMTMsIDB4OEI0NiwgMHgxNUNCLCAweDhCNDcsIDB4MkZEMiwKLSAgICAweDhCNDgsIDB4MzEyMywgMHg4QjQ5LCAweDE1QzcsIDB4OEI0QSwgMHgzMTI0LCAweDhCNEIsIDB4MzEyOSwKLSAgICAweDhCNEUsIDB4MTVDOSwgMHg4QjRGLCAweDE1Q0EsIDB4OEI1MCwgMHgzMTIyLCAweDhCNTEsIDB4MzEyQiwKLSAgICAweDhCNTIsIDB4MzEyRCwgMHg4QjUzLCAweDMxMjYsIDB4OEI1NCwgMHgzMTI4LCAweDhCNTUsIDB4MzEyQSwKLSAgICAweDhCNTYsIDB4MzEyNywgMHg4QjU3LCAweDMxMkUsIDB4OEI1OCwgMHgxNUM2LCAweDhCNTksIDB4MTVDQywKLSAgICAweDhCNUEsIDB4MTVDOCwgMHg4QjVDLCAweDE1QzUsIDB4OEI1RCwgMHgzMjM3LCAweDhCNUYsIDB4MTY0OCwKLSAgICAweDhCNjAsIDB4MzIzNSwgMHg4QjYzLCAweDMyMzksIDB4OEI2NSwgMHgzMjNBLCAweDhCNjYsIDB4MTY0NiwKLSAgICAweDhCNjcsIDB4MzIzQiwgMHg4QjY4LCAweDMyMzgsIDB4OEI2QSwgMHgzMjM2LCAweDhCNkIsIDB4MTY0OSwKLSAgICAweDhCNkMsIDB4MTY0NSwgMHg4QjZELCAweDMyM0MsIDB4OEI2RiwgMHgxNjQ3LCAweDhCNzAsIDB4MTY0NCwKLSAgICAweDhCNzQsIDB4MTY4RiwgMHg4Qjc3LCAweDE2OTAsIDB4OEI3OCwgMHgzMzEyLCAweDhCNzksIDB4MzMxMSwKLSAgICAweDhCN0EsIDB4MzMxNCwgMHg4QjdCLCAweDMzMTUsIDB4OEI3RCwgMHgxNjkxLCAweDhCN0UsIDB4MzNCNiwKLSAgICAweDhCN0YsIDB4MzNCQiwgMHg4QjgwLCAweDE2RDgsIDB4OEI4MiwgMHgzM0I4LCAweDhCODQsIDB4MzNCNywKLSAgICAweDhCODUsIDB4MzNCQSwgMHg4Qjg2LCAweDMzQjksIDB4OEI4OCwgMHgzNDQwLCAweDhCOEEsIDB4MTcwQSwKLSAgICAweDhCOEIsIDB4MzQzRiwgMHg4QjhDLCAweDM0M0QsIDB4OEI4RSwgMHgzNDNFLCAweDhCOTIsIDB4MTcyQywKLSAgICAweDhCOTMsIDB4MTcyQiwgMHg4Qjk0LCAweDM0OUMsIDB4OEI5NSwgMHgzNDlELCAweDhCOTYsIDB4MTcyRCwKLSAgICAweDhCOTgsIDB4MzRFNywgMHg4Qjk5LCAweDM0RTgsIDB4OEI5QSwgMHgxNzU0LCAweDhCOUMsIDB4MTc1QSwKLSAgICAweDhCOUUsIDB4MzUyMiwgMHg4QjlGLCAweDM1M0YsIDB4OEMzNywgMHgwNTBCLCAweDhDMzksIDB4MjA2QiwKLSAgICAweDhDM0IsIDB4MjA2QywgMHg4QzNDLCAweDI1OTcsIDB4OEMzRCwgMHgyODA5LCAweDhDM0UsIDB4MkE1MywKLSAgICAweDhDM0YsIDB4MTQ4MSwgMHg4QzQxLCAweDE0ODAsIDB4OEM0MiwgMHgyRkUwLCAweDhDNDMsIDB4MzEyRiwKLSAgICAweDhDNDUsIDB4MzQ0MSwgMHg4QzQ2LCAweDA1MEMsIDB4OEM0NywgMHgxRTA5LCAweDhDNDgsIDB4MDlDOSwKLSAgICAweDhDNDksIDB4MEJBNywgMHg4QzRBLCAweDI1OTksIDB4OEM0QiwgMHgyNTk4LCAweDhDNEMsIDB4MTIyMywKLSAgICAweDhDNEQsIDB4MkE1NCwgMHg4QzRFLCAweDEyMjQsIDB4OEM0RiwgMHgyRTZDLCAweDhDNTAsIDB4MTUyRSwKLSAgICAweDhDNTQsIDB4MTc2MywgMHg4QzU1LCAweDA1MEQsIDB4OEM1NiwgMHgxQTQ4LCAweDhDNTcsIDB4MUUwQSwKLSAgICAweDhDNUEsIDB4MEJBOCwgMHg4QzVDLCAweDIwNkQsIDB4OEM1RCwgMHgyMDZFLCAweDhDNUYsIDB4MjJGOCwKLSAgICAweDhDNjEsIDB4MEQ2NSwgMHg4QzYyLCAweDBGMUIsIDB4OEM2NCwgMHgyNTlCLCAweDhDNjUsIDB4MjU5QSwKLSAgICAweDhDNjYsIDB4MjU5QywgMHg4QzY4LCAweDI4MEEsIDB4OEM2OSwgMHgyODBCLCAweDhDNkEsIDB4MTBCNCwKLSAgICAweDhDNkIsIDB4MTM1RCwgMHg4QzZDLCAweDEyMjUsIDB4OEM2RCwgMHgxMzVFLCAweDhDNkYsIDB4MkU3MCwKLSAgICAweDhDNzAsIDB4MkU2RCwgMHg4QzcxLCAweDJFNkYsIDB4OEM3MiwgMHgyRTZFLCAweDhDNzMsIDB4MTQ4MiwKLSAgICAweDhDNzUsIDB4MkZFMSwgMHg4Qzc2LCAweDMxMzEsIDB4OEM3NywgMHgzMTMwLCAweDhDNzgsIDB4MThFNywKLSAgICAweDhDNzksIDB4MDlDQiwgMHg4QzdBLCAweDA5Q0EsIDB4OEM3QiwgMHgxRTBCLCAweDhDN0QsIDB4MjA2RiwKLSAgICAweDhDODAsIDB4MjJGQSwgMHg4QzgxLCAweDIyRjksIDB4OEM4MiwgMHgwRDY2LCAweDhDODQsIDB4MjU5RSwKLSAgICAweDhDODUsIDB4MjU5RiwgMHg4Qzg2LCAweDI1OUQsIDB4OEM4OSwgMHgwRjFELCAweDhDOEEsIDB4MEYxQywKLSAgICAweDhDOEMsIDB4MTBCNiwgMHg4QzhELCAweDEwQjUsIDB4OEM4RiwgMHgyQTU1LCAweDhDOTAsIDB4MkM5OCwKLSAgICAweDhDOTEsIDB4MkM5NiwgMHg4QzkyLCAweDJDOTcsIDB4OEM5MywgMHgxMzVGLCAweDhDOTQsIDB4MkU3MiwKLSAgICAweDhDOTUsIDB4MkU3MSwgMHg4Qzk3LCAweDJGRTQsIDB4OEM5OCwgMHgyRkUzLCAweDhDOTksIDB4MkZFMiwKLSAgICAweDhDOUEsIDB4MzEzMiwgMHg4QzlDLCAweDM1MjMsIDB4OEM5RCwgMHgwNTBFLCAweDhDOUUsIDB4MDgwQSwKLSAgICAweDhDQTAsIDB4MDgwQiwgMHg4Q0ExLCAweDA5Q0MsIDB4OENBMiwgMHgwOUNELCAweDhDQTMsIDB4MUUwRCwKLSAgICAweDhDQTQsIDB4MUUwQywgMHg4Q0E1LCAweDIwNzAsIDB4OENBNywgMHgwQkFFLCAweDhDQTgsIDB4MEJBQywKLSAgICAweDhDQTksIDB4MEJBOSwgMHg4Q0FBLCAweDBCQUQsIDB4OENBQiwgMHgwQkFCLCAweDhDQUMsIDB4MEJBQSwKLSAgICAweDhDQUYsIDB4MEQ2NywgMHg4Q0IwLCAweDIyRkQsIDB4OENCMiwgMHgwRjIyLCAweDhDQjMsIDB4MEQ2OSwKLSAgICAweDhDQjQsIDB4MEQ2RSwgMHg4Q0I1LCAweDIyRkYsIDB4OENCNiwgMHgwRDcwLCAweDhDQjcsIDB4MEQ2RiwKLSAgICAweDhDQjgsIDB4MEQ3MiwgMHg4Q0I5LCAweDIyRkUsIDB4OENCQSwgMHgyMkZCLCAweDhDQkIsIDB4MEQ2QywKLSAgICAweDhDQkMsIDB4MEQ2OCwgMHg4Q0JELCAweDBENkEsIDB4OENCRSwgMHgyMkZDLCAweDhDQkYsIDB4MEQ3MSwKLSAgICAweDhDQzAsIDB4MEQ2RCwgMHg4Q0MxLCAweDBENkIsIDB4OENDMiwgMHgwRjI0LCAweDhDQzMsIDB4MEYyMywKLSAgICAweDhDQzQsIDB4MEYyMSwgMHg4Q0M1LCAweDBGMjUsIDB4OENDNywgMHgwRjFGLCAweDhDQzgsIDB4MEYyMCwKLSAgICAweDhDQ0EsIDB4MEYxRSwgMHg4Q0NDLCAweDI1QTAsIDB4OENDRiwgMHgyODBELCAweDhDRDEsIDB4MTBCOCwKLSAgICAweDhDRDIsIDB4MTBCOSwgMHg4Q0QzLCAweDEwQjcsIDB4OENENSwgMHgyODBDLCAweDhDRDcsIDB4MjgwRSwKLSAgICAweDhDRDksIDB4MkE1OCwgMHg4Q0RBLCAweDJBNUEsIDB4OENEQywgMHgxMjJFLCAweDhDREQsIDB4MkE1QiwKLSAgICAweDhDREUsIDB4MTIyNywgMHg4Q0RGLCAweDJBNTcsIDB4OENFMCwgMHgxMjI2LCAweDhDRTEsIDB4MTIzMCwKLSAgICAweDhDRTIsIDB4MTIyQywgMHg4Q0UzLCAweDEyMkQsIDB4OENFNCwgMHgxMjI5LCAweDhDRTUsIDB4MkE1NiwKLSAgICAweDhDRTYsIDB4MTIyOCwgMHg4Q0U3LCAweDJBNUMsIDB4OENFOCwgMHgyQTU5LCAweDhDRUEsIDB4MTIyRiwKLSAgICAweDhDRUMsIDB4MTIyQSwgMHg4Q0VELCAweDEyMkIsIDB4OENFRSwgMHgyQzlBLCAweDhDRjAsIDB4MkM5QywKLSAgICAweDhDRjEsIDB4MkM5QiwgMHg4Q0YzLCAweDJDOUQsIDB4OENGNCwgMHgxMzYwLCAweDhDRjUsIDB4MkM5OSwKLSAgICAweDhDRjgsIDB4MTQ4NiwgMHg4Q0Y5LCAweDJFNzMsIDB4OENGQSwgMHgxNDgzLCAweDhDRkIsIDB4MTQ4NywKLSAgICAweDhDRkMsIDB4MTQ4NSwgMHg4Q0ZELCAweDE0ODQsIDB4OENGRSwgMHgyRkU1LCAweDhEMDAsIDB4MkZFOCwKLSAgICAweDhEMDIsIDB4MkZFNywgMHg4RDA0LCAweDJGRTYsIDB4OEQwNSwgMHgxNTJGLCAweDhEMDYsIDB4MzEzMywKLSAgICAweDhEMDcsIDB4MzEzNCwgMHg4RDA4LCAweDE1Q0QsIDB4OEQwOSwgMHgzMTM1LCAweDhEMEEsIDB4MTVDRSwKLSAgICAweDhEMEQsIDB4MTY0QiwgMHg4RDBGLCAweDE2NEEsIDB4OEQxMCwgMHgzMzE2LCAweDhEMTMsIDB4MTY5MiwKLSAgICAweDhEMTQsIDB4MzMxNywgMHg4RDE1LCAweDMzQkMsIDB4OEQxNiwgMHgxNkQ5LCAweDhEMTcsIDB4MTZEQSwKLSAgICAweDhEMTksIDB4MzQ0MiwgMHg4RDFCLCAweDE3MkYsIDB4OEQ2NCwgMHgwNTBGLCAweDhENjYsIDB4MEJCMCwKLSAgICAweDhENjcsIDB4MEJBRiwgMHg4RDY4LCAweDI1QTEsIDB4OEQ2OSwgMHgyNUEyLCAweDhENkIsIDB4MTBCQSwKLSAgICAweDhENkMsIDB4MkM5RSwgMHg4RDZELCAweDEyMzEsIDB4OEQ2RSwgMHgyQzlGLCAweDhENkYsIDB4MkU3NCwKLSAgICAweDhENzAsIDB4MDUxMCwgMHg4RDcyLCAweDFDMDYsIDB4OEQ3MywgMHgwODBELCAweDhENzQsIDB4MDgwQywKLSAgICAweDhENzYsIDB4MUUwRSwgMHg4RDc3LCAweDA5Q0UsIDB4OEQ3OCwgMHgxRTBGLCAweDhENzksIDB4MjA3MywKLSAgICAweDhEN0IsIDB4MjA3MiwgMHg4RDdELCAweDIwNzEsIDB4OEQ4MCwgMHgyMzAxLCAweDhEODEsIDB4MEQ3NSwKLSAgICAweDhEODQsIDB4MjMwMCwgMHg4RDg1LCAweDBENzQsIDB4OEQ4OSwgMHgyMzAyLCAweDhEOEEsIDB4MEQ3MywKLSAgICAweDhEOEMsIDB4MjVBNCwgMHg4RDhELCAweDI1QTcsIDB4OEQ4RSwgMHgyNUE1LCAweDhEOEYsIDB4MjVBNiwKLSAgICAweDhEOTAsIDB4MjVBQSwgMHg4RDkxLCAweDI1QTMsIDB4OEQ5MiwgMHgyNUFCLCAweDhEOTMsIDB4MjVBOCwKLSAgICAweDhEOTQsIDB4MjVBOSwgMHg4RDk1LCAweDEwQkMsIDB4OEQ5NiwgMHgyODBGLCAweDhEOTksIDB4MTBCQiwKLSAgICAweDhEOUIsIDB4MkE2MCwgMHg4RDlDLCAweDJBNUUsIDB4OEQ5RiwgMHgxMjMyLCAweDhEQTAsIDB4MkE1RCwKLSAgICAweDhEQTEsIDB4MkE1RiwgMHg4REEzLCAweDEyMzMsIDB4OERBNSwgMHgyQ0EwLCAweDhEQTcsIDB4MkNBMSwKLSAgICAweDhEQTgsIDB4MTQ4OCwgMHg4REFBLCAweDMxMzcsIDB4OERBQiwgMHgzMTM5LCAweDhEQUMsIDB4MzEzNiwKLSAgICAweDhEQUQsIDB4MzEzOCwgMHg4REFFLCAweDMyM0QsIDB4OERBRiwgMHgzMzE4LCAweDhEQjIsIDB4MzUwOSwKLSAgICAweDhEQjMsIDB4MDUxMSwgMHg4REI0LCAweDA4MEUsIDB4OERCNSwgMHgxRTEwLCAweDhEQjYsIDB4MUUxMiwKLSAgICAweDhEQjcsIDB4MUUxMSwgMHg4REI5LCAweDIwNzYsIDB4OERCQSwgMHgwQkIyLCAweDhEQkMsIDB4MjA3NCwKLSAgICAweDhEQkUsIDB4MEJCMSwgMHg4REJGLCAweDIwNzcsIDB4OERDMSwgMHgyMDc4LCAweDhEQzIsIDB4MjA3NSwKLSAgICAweDhEQzUsIDB4MjMwRSwgMHg4REM2LCAweDBEN0QsIDB4OERDNywgMHgyMzA2LCAweDhEQzgsIDB4MjMwQywKLSAgICAweDhEQ0IsIDB4MEQ3OCwgMHg4RENDLCAweDBEN0IsIDB4OERDRCwgMHgyMzA1LCAweDhEQ0UsIDB4MEQ3NiwKLSAgICAweDhEQ0YsIDB4MjMwOSwgMHg4REQwLCAweDI1QjEsIDB4OEREMSwgMHgwRDdBLCAweDhERDMsIDB4MjMwNCwKLSAgICAweDhERDUsIDB4MjMwQSwgMHg4REQ2LCAweDIzMDcsIDB4OERENywgMHgyMzBELCAweDhERDgsIDB4MjMwMywKLSAgICAweDhERDksIDB4MjMwQiwgMHg4RERBLCAweDBENzksIDB4OEREQiwgMHgwRDdDLCAweDhEREMsIDB4MjMwOCwKLSAgICAweDhEREQsIDB4MEQ3NywgMHg4RERGLCAweDBGMjcsIDB4OERFMCwgMHgyNUFELCAweDhERTEsIDB4MEYyNiwKLSAgICAweDhERTIsIDB4MjVCNCwgMHg4REUzLCAweDI1QjMsIDB4OERFNCwgMHgwRjJELCAweDhERTYsIDB4MEYyRSwKLSAgICAweDhERTcsIDB4MjVCNSwgMHg4REU4LCAweDBGMjgsIDB4OERFOSwgMHgyNUIyLCAweDhERUEsIDB4MEYyQywKLSAgICAweDhERUIsIDB4MjVCNywgMHg4REVDLCAweDI1QUUsIDB4OERFRSwgMHgyNUIwLCAweDhERUYsIDB4MEYyOSwKLSAgICAweDhERjAsIDB4MjVBQywgMHg4REYxLCAweDI1QUYsIDB4OERGMiwgMHgyNUI2LCAweDhERjMsIDB4MEYyQSwKLSAgICAweDhERjQsIDB4MjVCOCwgMHg4REZBLCAweDBGMkIsIDB4OERGQywgMHgxMEJELCAweDhERkQsIDB4MjgxNCwKLSAgICAweDhERkUsIDB4MjgxQSwgMHg4REZGLCAweDI4MTIsIDB4OEUwMCwgMHgyODFCLCAweDhFMDIsIDB4MjgxMSwKLSAgICAweDhFMDMsIDB4MjgxNiwgMHg4RTA0LCAweDI4MUMsIDB4OEUwNSwgMHgyODE5LCAweDhFMDYsIDB4MjgxOCwKLSAgICAweDhFMDcsIDB4MjgxNywgMHg4RTA5LCAweDI4MTAsIDB4OEUwQSwgMHgyODE1LCAweDhFMEQsIDB4MjgxMywKLSAgICAweDhFMEYsIDB4MTIzOCwgMHg4RTEwLCAweDEyMzUsIDB4OEUxMSwgMHgyQTY5LCAweDhFMTIsIDB4MkE2RSwKLSAgICAweDhFMTMsIDB4MkE3MCwgMHg4RTE0LCAweDJBNkQsIDB4OEUxNSwgMHgyQTY2LCAweDhFMTYsIDB4MkE2OCwKLSAgICAweDhFMTcsIDB4MkE3MiwgMHg4RTE4LCAweDJBNkYsIDB4OEUxOSwgMHgyQTZBLCAweDhFMUEsIDB4MkE3MywKLSAgICAweDhFMUIsIDB4MkE2NywgMHg4RTFDLCAweDJBNzEsIDB4OEUxRCwgMHgxMjM2LCAweDhFMUUsIDB4MTIzQywKLSAgICAweDhFMUYsIDB4MTIzQSwgMHg4RTIwLCAweDJBNjEsIDB4OEUyMSwgMHgxMjNCLCAweDhFMjIsIDB4MTIzNywKLSAgICAweDhFMjMsIDB4MkE2MiwgMHg4RTI0LCAweDJBNjQsIDB4OEUyNSwgMHgyQTYzLCAweDhFMjYsIDB4MkE2QiwKLSAgICAweDhFMjcsIDB4MkE2QywgMHg4RTI5LCAweDEyMzksIDB4OEUyQiwgMHgxMjM0LCAweDhFMkUsIDB4MkE2NSwKLSAgICAweDhFMzAsIDB4MkNBQiwgMHg4RTMxLCAweDEzNjIsIDB4OEUzMywgMHgyQ0EyLCAweDhFMzQsIDB4MTM2MywKLSAgICAweDhFMzUsIDB4MTM2NiwgMHg4RTM2LCAweDJDQTcsIDB4OEUzOCwgMHgyQ0E0LCAweDhFMzksIDB4MTM2NSwKLSAgICAweDhFM0MsIDB4MkNBOCwgMHg4RTNELCAweDJDQTksIDB4OEUzRSwgMHgyQ0EzLCAweDhFM0YsIDB4MkNBQywKLSAgICAweDhFNDAsIDB4MkNBNSwgMHg4RTQxLCAweDJDQUEsIDB4OEU0MiwgMHgxMzY0LCAweDhFNDQsIDB4MTM2MSwKLSAgICAweDhFNDUsIDB4MkNBNiwgMHg4RTQ3LCAweDJFN0EsIDB4OEU0OCwgMHgxNDhCLCAweDhFNDksIDB4MTQ4OSwKLSAgICAweDhFNEEsIDB4MTQ4QywgMHg4RTRCLCAweDE0OEEsIDB4OEU0QywgMHgyRTc5LCAweDhFNEQsIDB4MkU3NiwKLSAgICAweDhFNEUsIDB4MkU3NSwgMHg4RTUwLCAweDJFNzgsIDB4OEU1MywgMHgyRTc3LCAweDhFNTQsIDB4MkZGNiwKLSAgICAweDhFNTUsIDB4MTUzNSwgMHg4RTU2LCAweDJGRUQsIDB4OEU1NywgMHgyRkVDLCAweDhFNTksIDB4MTUzMCwKLSAgICAweDhFNUEsIDB4MkZGMiwgMHg4RTVCLCAweDJGRjEsIDB4OEU1QywgMHgyRkU5LCAweDhFNUQsIDB4MkZGNCwKLSAgICAweDhFNUUsIDB4MkZFRSwgMHg4RTVGLCAweDE1MzQsIDB4OEU2MCwgMHgyRkVCLCAweDhFNjEsIDB4MkZGMywKLSAgICAweDhFNjIsIDB4MkZFQSwgMHg4RTYzLCAweDE1MzEsIDB4OEU2NCwgMHgxNTMzLCAweDhFNjUsIDB4MkZFRiwKLSAgICAweDhFNjYsIDB4MTUzMiwgMHg4RTY3LCAweDJGRjAsIDB4OEU2OSwgMHgyRkY1LCAweDhFNkEsIDB4MzEzRCwKLSAgICAweDhFNkMsIDB4MTVEMywgMHg4RTZELCAweDMxM0EsIDB4OEU2RiwgMHgzMTNFLCAweDhFNzIsIDB4MTVEMCwKLSAgICAweDhFNzMsIDB4MzEzQywgMHg4RTc0LCAweDE1RDUsIDB4OEU3NiwgMHgxNUQyLCAweDhFNzgsIDB4MzEzQiwKLSAgICAweDhFN0EsIDB4MTVENCwgMHg4RTdCLCAweDMxM0YsIDB4OEU3QywgMHgxNUNGLCAweDhFODEsIDB4MTY0RCwKLSAgICAweDhFODIsIDB4MTY0RiwgMHg4RTg0LCAweDMyNDAsIDB4OEU4NSwgMHgxNjRFLCAweDhFODYsIDB4MzIzRSwKLSAgICAweDhFODcsIDB4MTVEMSwgMHg4RTg4LCAweDMyM0YsIDB4OEU4OSwgMHgxNjRDLCAweDhFOEEsIDB4MTY5MywKLSAgICAweDhFOEIsIDB4MTY5NSwgMHg4RThDLCAweDMzMUEsIDB4OEU4RCwgMHgxNjk0LCAweDhFOEUsIDB4MzMxOSwKLSAgICAweDhFOTAsIDB4MzNDMSwgMHg4RTkxLCAweDE2REIsIDB4OEU5MiwgMHgzM0MwLCAweDhFOTMsIDB4MTZEQywKLSAgICAweDhFOTQsIDB4MzNCRSwgMHg4RTk1LCAweDMzQkQsIDB4OEU5NiwgMHgzM0MyLCAweDhFOTcsIDB4MzNDMywKLSAgICAweDhFOTgsIDB4MzQ0MywgMHg4RTlBLCAweDMzQkYsIDB4OEU5RCwgMHgzNEExLCAweDhFOUUsIDB4MzQ5RSwKLSAgICAweDhFOUYsIDB4MzQ5RiwgMHg4RUEwLCAweDM0QTAsIDB4OEVBMSwgMHgxNzQ5LCAweDhFQTMsIDB4MzRFQiwKLSAgICAweDhFQTQsIDB4MzRFQSwgMHg4RUE1LCAweDM0RTksIDB4OEVBNiwgMHgzNTBBLCAweDhFQTgsIDB4MzUzNywKLSAgICAweDhFQTksIDB4MzUyNCwgMHg4RUFBLCAweDE3NUIsIDB4OEVBQiwgMHgwNTEyLCAweDhFQUMsIDB4MDlDRiwKLSAgICAweDhFQjIsIDB4MEYyRiwgMHg4RUJBLCAweDEyM0QsIDB4OEVCRCwgMHgyQ0FELCAweDhFQzAsIDB4MTUzNiwKLSAgICAweDhFQzIsIDB4MzE0MCwgMHg4RUM5LCAweDM1MjUsIDB4OEVDQSwgMHgwNTEzLCAweDhFQ0IsIDB4MDY4RCwKLSAgICAweDhFQ0MsIDB4MDgxMCwgMHg4RUNELCAweDA4MEYsIDB4OEVDRiwgMHgwOUQyLCAweDhFRDEsIDB4MUUxMywKLSAgICAweDhFRDIsIDB4MDlEMCwgMHg4RUQzLCAweDFFMTQsIDB4OEVENCwgMHgwOUQxLCAweDhFRDcsIDB4MjA3RCwKLSAgICAweDhFRDgsIDB4MjA3OSwgMHg4RURCLCAweDBCQjMsIDB4OEVEQywgMHgyMDdDLCAweDhFREQsIDB4MjA3QiwKLSAgICAweDhFREUsIDB4MjA3QSwgMHg4RURGLCAweDBCQjQsIDB4OEVFMCwgMHgyMDdFLCAweDhFRTEsIDB4MjA3RiwKLSAgICAweDhFRTUsIDB4MjMxNSwgMHg4RUU2LCAweDIzMTMsIDB4OEVFNywgMHgyMzE3LCAweDhFRTgsIDB4MjMxOCwKLSAgICAweDhFRTksIDB4MjMxRSwgMHg4RUVCLCAweDIzMUEsIDB4OEVFQywgMHgyMzFDLCAweDhFRUUsIDB4MjMxNCwKLSAgICAweDhFRUYsIDB4MjMwRiwgMHg4RUYxLCAweDIzMUIsIDB4OEVGNCwgMHgyMzFELCAweDhFRjUsIDB4MjMxNiwKLSAgICAweDhFRjYsIDB4MjMxOSwgMHg4RUY3LCAweDIzMTAsIDB4OEVGOCwgMHgwRDdGLCAweDhFRjksIDB4MjMxMiwKLSAgICAweDhFRkEsIDB4MjMxMSwgMHg4RUZCLCAweDBEN0UsIDB4OEVGQywgMHgwRDgwLCAweDhFRkUsIDB4MEYzMiwKLSAgICAweDhFRkYsIDB4MjVCQSwgMHg4RjAwLCAweDI1QkMsIDB4OEYwMSwgMHgyNUJCLCAweDhGMDIsIDB4MjVDMCwKLSAgICAweDhGMDMsIDB4MEYzMCwgMHg4RjA1LCAweDI1QkQsIDB4OEYwNiwgMHgyNUI5LCAweDhGMDcsIDB4MjVCRSwKLSAgICAweDhGMDgsIDB4MjVCRiwgMHg4RjA5LCAweDBGMzEsIDB4OEYwQSwgMHgwRjMzLCAweDhGMEIsIDB4MjVDMSwKLSAgICAweDhGMEQsIDB4MjgyMCwgMHg4RjBFLCAweDI4MUYsIDB4OEYxMCwgMHgyODFELCAweDhGMTEsIDB4MjgxRSwKLSAgICAweDhGMTIsIDB4MTBCRiwgMHg4RjEzLCAweDEwQzEsIDB4OEYxNCwgMHgxMEJFLCAweDhGMTUsIDB4MTBDMCwKLSAgICAweDhGMTYsIDB4MkE3QSwgMHg4RjE3LCAweDJBN0IsIDB4OEYxOCwgMHgyQTc2LCAweDhGMUEsIDB4MkE3NywKLSAgICAweDhGMUIsIDB4MTIzRiwgMHg4RjFDLCAweDEyNDQsIDB4OEYxRCwgMHgxMjNFLCAweDhGMUUsIDB4MTI0NSwKLSAgICAweDhGMUYsIDB4MTI0MCwgMHg4RjIwLCAweDJBNzgsIDB4OEYyMywgMHgyQTc5LCAweDhGMjQsIDB4MkE3NSwKLSAgICAweDhGMjUsIDB4MTI0NiwgMHg4RjI2LCAweDEyNDIsIDB4OEYyOSwgMHgxMjQxLCAweDhGMkEsIDB4MTI0MywKLSAgICAweDhGMkMsIDB4MkE3NCwgMHg4RjJFLCAweDJDQUYsIDB4OEYyRiwgMHgxMzY4LCAweDhGMzIsIDB4MkNCMSwKLSAgICAweDhGMzMsIDB4MTM2QSwgMHg4RjM0LCAweDJDQjQsIDB4OEYzNSwgMHgyQ0IwLCAweDhGMzYsIDB4MkNBRSwKLSAgICAweDhGMzcsIDB4MkNCMywgMHg4RjM4LCAweDEzNjksIDB4OEYzOSwgMHgyQ0IyLCAweDhGM0IsIDB4MTM2NywKLSAgICAweDhGM0UsIDB4MTQ4RSwgMHg4RjNGLCAweDE0OTEsIDB4OEY0MCwgMHgyRTdDLCAweDhGNDIsIDB4MTQ4RiwKLSAgICAweDhGNDMsIDB4MkU3QiwgMHg4RjQ0LCAweDE0OEQsIDB4OEY0NSwgMHgxNDkwLCAweDhGNDYsIDB4MkZGNywKLSAgICAweDhGNDcsIDB4MkZGOCwgMHg4RjQ4LCAweDJGRjksIDB4OEY0OSwgMHgxNTM3LCAweDhGNEIsIDB4MkZGQSwKLSAgICAweDhGNEQsIDB4MTUzOCwgMHg4RjRFLCAweDE1RDcsIDB4OEY0RiwgMHgzMTQzLCAweDhGNTAsIDB4MzE0NCwKLSAgICAweDhGNTEsIDB4MzE0MiwgMHg4RjUyLCAweDMxNDEsIDB4OEY1MywgMHgzMTQ1LCAweDhGNTQsIDB4MTVENiwKLSAgICAweDhGNTUsIDB4MzI0NCwgMHg4RjU2LCAweDMyNDIsIDB4OEY1NywgMHgzMjQzLCAweDhGNTgsIDB4MzI0NSwKLSAgICAweDhGNTksIDB4MzI0MSwgMHg4RjVBLCAweDMyNDYsIDB4OEY1QiwgMHgzMzFDLCAweDhGNUQsIDB4MzMxRCwKLSAgICAweDhGNUUsIDB4MzMxQiwgMHg4RjVGLCAweDE2OTYsIDB4OEY2MCwgMHgzM0M0LCAweDhGNjEsIDB4MTZERCwKLSAgICAweDhGNjIsIDB4MzNDNSwgMHg4RjYzLCAweDM0NDUsIDB4OEY2NCwgMHgzNDQ0LCAweDhGOUIsIDB4MDUxNCwKLSAgICAweDhGOUMsIDB4MEQ4MSwgMHg4RjlGLCAweDBGMzQsIDB4OEZBMywgMHgxMEMyLCAweDhGQTYsIDB4MTM2QywKLSAgICAweDhGQTgsIDB4MTM2QiwgMHg4RkFELCAweDE1RDgsIDB4OEZBRSwgMHgxNjJGLCAweDhGQUYsIDB4MTY5NywKLSAgICAweDhGQjAsIDB4MDUxNSwgMHg4RkIxLCAweDA5RDMsIDB4OEZCMiwgMHgwRjM1LCAweDhGQjQsIDB4MzE0NiwKLSAgICAweDhGQjUsIDB4MDIzMCwgMHg4RkJGLCAweDE4RTksIDB4OEZDMiwgMHgwNTE2LCAweDhGQzQsIDB4MDUxOSwKLSAgICAweDhGQzUsIDB4MDUxOCwgMHg4RkM2LCAweDA1MTcsIDB4OEZDOSwgMHgxOEU4LCAweDhGQ0IsIDB4MUE0QSwKLSAgICAweDhGQ0QsIDB4MUE0QywgMHg4RkNFLCAweDA2OEUsIDB4OEZEMSwgMHgwNjkwLCAweDhGRDIsIDB4MUE0OSwKLSAgICAweDhGRDMsIDB4MUE0QiwgMHg4RkQ0LCAweDA2OEYsIDB4OEZENSwgMHgxQTRFLCAweDhGRDYsIDB4MUE0RCwKLSAgICAweDhGRDcsIDB4MUE0RiwgMHg4RkUwLCAweDFDMEEsIDB4OEZFMSwgMHgxQzA4LCAweDhGRTIsIDB4MDgxMywKLSAgICAweDhGRTMsIDB4MUMwNywgMHg4RkU0LCAweDA4MTgsIDB4OEZFNSwgMHgwODE1LCAweDhGRTYsIDB4MDgxMiwKLSAgICAweDhGRTgsIDB4MDgxOSwgMHg4RkVBLCAweDA4MTQsIDB4OEZFQiwgMHgwODE3LCAweDhGRUQsIDB4MDgxNiwKLSAgICAweDhGRUUsIDB4MUMwOSwgMHg4RkYwLCAweDA4MTEsIDB4OEZGNCwgMHgwOUQ5LCAweDhGRjUsIDB4MUUxNiwKLSAgICAweDhGRjYsIDB4MUUxQywgMHg4RkY3LCAweDA5RDYsIDB4OEZGOCwgMHgwOURELCAweDhGRkEsIDB4MDlEOCwKLSAgICAweDhGRkIsIDB4MUUxOSwgMHg4RkZDLCAweDFFMUIsIDB4OEZGRCwgMHgwOURCLCAweDhGRkUsIDB4MUUxNSwKLSAgICAweDhGRkYsIDB4MUUxOCwgMHg5MDAwLCAweDA5RDcsIDB4OTAwMSwgMHgwOUQ0LCAweDkwMDIsIDB4MUUxNywKLSAgICAweDkwMDMsIDB4MDlEQSwgMHg5MDA0LCAweDFFMUEsIDB4OTAwNSwgMHgwOURDLCAweDkwMDYsIDB4MDlENSwKLSAgICAweDkwMEIsIDB4MjA4MSwgMHg5MDBDLCAweDIwODQsIDB4OTAwRCwgMHgwQkI2LCAweDkwMEYsIDB4MEJDMCwKLSAgICAweDkwMTAsIDB4MEJCQywgMHg5MDExLCAweDIwODIsIDB4OTAxNCwgMHgwQkM0LCAweDkwMTUsIDB4MEJCRCwKLSAgICAweDkwMTYsIDB4MEJDMiwgMHg5MDE3LCAweDBCQjgsIDB4OTAxOSwgMHgwQkI1LCAweDkwMUEsIDB4MEJCNywKLSAgICAweDkwMUIsIDB4MEJDMywgMHg5MDFDLCAweDIwODMsIDB4OTAxRCwgMHgwQkJCLCAweDkwMUUsIDB4MEJCRSwKLSAgICAweDkwMUYsIDB4MEJCQSwgMHg5MDIwLCAweDBCQkYsIDB4OTAyMSwgMHgyMDg1LCAweDkwMjIsIDB4MEJDMSwKLSAgICAweDkwMjMsIDB4MEJCOSwgMHg5MDI0LCAweDIwODAsIDB4OTAyRCwgMHgyMzFGLCAweDkwMkUsIDB4MEQ4MiwKLSAgICAweDkwMkYsIDB4MjMyMSwgMHg5MDMxLCAweDBEODQsIDB4OTAzMiwgMHgwRDg2LCAweDkwMzQsIDB4MjMyMCwKLSAgICAweDkwMzUsIDB4MEQ4MywgMHg5MDM2LCAweDBEODcsIDB4OTAzOCwgMHgwRDg1LCAweDkwM0MsIDB4MEYzQiwKLSAgICAweDkwM0QsIDB4MjVDNiwgMHg5MDNFLCAweDBGNDMsIDB4OTAzRiwgMHgyNUMzLCAweDkwNDEsIDB4MEY0NCwKLSAgICAweDkwNDIsIDB4MEYzOSwgMHg5MDQ0LCAweDI1QzQsIDB4OTA0NywgMHgwRjNFLCAweDkwNDksIDB4MjVDNSwKLSAgICAweDkwNEEsIDB4MEYzNywgMHg5MDRCLCAweDBGMzYsIDB4OTA0RCwgMHgwRjQxLCAweDkwNEUsIDB4MEY0MCwKLSAgICAweDkwNEYsIDB4MEYzRiwgMHg5MDUwLCAweDBGM0QsIDB4OTA1MSwgMHgwRjQyLCAweDkwNTIsIDB4MjVDMiwKLSAgICAweDkwNTMsIDB4MEYzOCwgMHg5MDU0LCAweDBGM0EsIDB4OTA1NSwgMHgwRjNDLCAweDkwNTgsIDB4MTBDNCwKLSAgICAweDkwNTksIDB4MTBDNywgMHg5MDVCLCAweDEwQ0IsIDB4OTA1QywgMHgxMEM1LCAweDkwNUQsIDB4MTBDQSwKLSAgICAweDkwNUUsIDB4MTBDOCwgMHg5MDYwLCAweDEwQzMsIDB4OTA2MiwgMHgxMEM5LCAweDkwNjMsIDB4MTBDNiwKLSAgICAweDkwNjcsIDB4MkE3RiwgMHg5MDY4LCAweDEyNDksIDB4OTA2OSwgMHgxMjQ3LCAweDkwNkIsIDB4MkE4MCwKLSAgICAweDkwNkQsIDB4MTI0QSwgMHg5MDZFLCAweDEyNDgsIDB4OTA2RiwgMHgyQTdFLCAweDkwNzAsIDB4MkE3RCwKLSAgICAweDkwNzIsIDB4MTM3MCwgMHg5MDczLCAweDJBN0MsIDB4OTA3NCwgMHgxMzZFLCAweDkwNzUsIDB4MTM2RCwKLSAgICAweDkwNzYsIDB4MkNCNSwgMHg5MDc3LCAweDEyNEIsIDB4OTA3OCwgMHgxMzZGLCAweDkwNzksIDB4MkNCNiwKLSAgICAweDkwN0EsIDB4MTM3MiwgMHg5MDdCLCAweDJDQjcsIDB4OTA3QywgMHgxMzcxLCAweDkwN0QsIDB4MTQ5MywKLSAgICAweDkwN0UsIDB4MkU3RSwgMHg5MDdGLCAweDE0OTIsIDB4OTA4MCwgMHgxNDk3LCAweDkwODEsIDB4MTQ5NSwKLSAgICAweDkwODIsIDB4MTQ5NiwgMHg5MDgzLCAweDE1M0EsIDB4OTA4NCwgMHgxNDk0LCAweDkwODUsIDB4MkU3RCwKLSAgICAweDkwODYsIDB4MkNCOCwgMHg5MDg3LCAweDE1MzksIDB4OTA4OCwgMHgxNTNCLCAweDkwOEEsIDB4MTVEOSwKLSAgICAweDkwOEIsIDB4MTVEQSwgMHg5MDhELCAweDMyNDcsIDB4OTA4RiwgMHgxNzBDLCAweDkwOTAsIDB4MTcwQiwKLSAgICAweDkwOTEsIDB4MDUxQiwgMHg5MDk0LCAweDE4MUUsIDB4OTA5NSwgMHgwOURFLCAweDkwOTcsIDB4MTgxQiwKLSAgICAweDkwOTgsIDB4MTgxQywgMHg5MDk5LCAweDE4MUEsIDB4OTA5QiwgMHgxODFELCAweDkwOUUsIDB4MThFRCwKLSAgICAweDkwOUYsIDB4MThFQSwgMHg5MEEwLCAweDE4RUYsIDB4OTBBMSwgMHgxOEVCLCAweDkwQTIsIDB4MDUxQywKLSAgICAweDkwQTMsIDB4MDUxRiwgMHg5MEE1LCAweDE4RUMsIDB4OTBBNiwgMHgwNTFFLCAweDkwQTcsIDB4MThFRSwKLSAgICAweDkwQUEsIDB4MDUxRCwgMHg5MEFGLCAweDFBNTIsIDB4OTBCMCwgMHgxQTU0LCAweDkwQjEsIDB4MDY5MywKLSAgICAweDkwQjIsIDB4MUE1MCwgMHg5MEIzLCAweDFBNTMsIDB4OTBCNCwgMHgxQTUxLCAweDkwQjUsIDB4MDY5MSwKLSAgICAweDkwQjYsIDB4MDY5NCwgMHg5MEI4LCAweDA2OTIsIDB4OTBCRCwgMHgxQzBDLCAweDkwQkUsIDB4MUMxMCwKLSAgICAweDkwQkYsIDB4MUMwRCwgMHg5MEMxLCAweDA4MUMsIDB4OTBDMywgMHgwODFELCAweDkwQzUsIDB4MUMwRiwKLSAgICAweDkwQzcsIDB4MUMxMSwgMHg5MEM4LCAweDFDMTMsIDB4OTBDQSwgMHgwODFBLCAweDkwQ0IsIDB4MUMxMiwKLSAgICAweDkwQ0UsIDB4MDgxQiwgMHg5MEQ0LCAweDIwOEMsIDB4OTBENSwgMHgxQzBFLCAweDkwRDYsIDB4MUUxRCwKLSAgICAweDkwRDcsIDB4MUUyNiwgMHg5MEQ4LCAweDFFMjQsIDB4OTBEOSwgMHgxRTFGLCAweDkwREEsIDB4MUUyMCwKLSAgICAweDkwREIsIDB4MUUyNSwgMHg5MERDLCAweDFFMjcsIDB4OTBERCwgMHgwOUUwLCAweDkwREYsIDB4MUUyMiwKLSAgICAweDkwRTAsIDB4MUUxRSwgMHg5MEUxLCAweDA5REYsIDB4OTBFMiwgMHgwOUUxLCAweDkwRTMsIDB4MUUyMSwKLSAgICAweDkwRTQsIDB4MUUyOCwgMHg5MEU1LCAweDFFMjMsIDB4OTBFOCwgMHgwQkM1LCAweDkwRTksIDB4MjA4RiwKLSAgICAweDkwRUEsIDB4MjA4NywgMHg5MEVCLCAweDIwOEQsIDB4OTBFQywgMHgyMDhFLCAweDkwRUQsIDB4MEJDNiwKLSAgICAweDkwRUYsIDB4MjA4NiwgMHg5MEYwLCAweDIwODgsIDB4OTBGMSwgMHgxQzBCLCAweDkwRjIsIDB4MjA4QSwKLSAgICAweDkwRjMsIDB4MjA4QiwgMHg5MEY0LCAweDIwODksIDB4OTBGNSwgMHgwRDg5LCAweDkwRjksIDB4MjMyOCwKLSAgICAweDkwRkEsIDB4MkNCOSwgMHg5MEZCLCAweDIzMjksIDB4OTBGQywgMHgyMzI2LCAweDkwRkQsIDB4MEJDNywKLSAgICAweDkwRkUsIDB4MEQ4QiwgMHg5MEZGLCAweDIzMjUsIDB4OTEwMCwgMHgyMzJCLCAweDkxMDEsIDB4MjMyQSwKLSAgICAweDkxMDIsIDB4MEQ4OCwgMHg5MTAzLCAweDIzMkUsIDB4OTEwNCwgMHgyMzI0LCAweDkxMDUsIDB4MjMyRCwKLSAgICAweDkxMDYsIDB4MjMyMiwgMHg5MTA3LCAweDIzMkMsIDB4OTEwOCwgMHgyMzI3LCAweDkxMDksIDB4MEQ4QSwKLSAgICAweDkxMEIsIDB4MjVDRCwgMHg5MTBELCAweDI1QzgsIDB4OTEwRSwgMHgyNUNFLCAweDkxMEYsIDB4MjVDOSwKLSAgICAweDkxMTAsIDB4MjVDNywgMHg5MTExLCAweDI1Q0EsIDB4OTExMiwgMHgwRjQ1LCAweDkxMTQsIDB4MjVDQywKLSAgICAweDkxMTYsIDB4MjVDQiwgMHg5MTE3LCAweDBGNDYsIDB4OTExOCwgMHgxMENELCAweDkxMTksIDB4MTBDQywKLSAgICAweDkxMUEsIDB4MjgyNywgMHg5MTFCLCAweDI4MkEsIDB4OTExQywgMHgyODIyLCAweDkxMUQsIDB4MjgyNiwKLSAgICAweDkxMUUsIDB4MTBDRSwgMHg5MTFGLCAweDI4MjUsIDB4OTEyMCwgMHgyODIzLCAweDkxMjEsIDB4MjgyOSwKLSAgICAweDkxMjIsIDB4MjgyNCwgMHg5MTIzLCAweDI4MjEsIDB4OTEyNCwgMHgyODI4LCAweDkxMjYsIDB4MkE4NiwKLSAgICAweDkxMjcsIDB4MTI0RSwgMHg5MTI4LCAweDJGRkIsIDB4OTEyOSwgMHgyQTgzLCAweDkxMkEsIDB4MkE4NCwKLSAgICAweDkxMkIsIDB4MkE4MiwgMHg5MTJDLCAweDIzMjMsIDB4OTEyRCwgMHgxMjRELCAweDkxMkUsIDB4MkE4NywKLSAgICAweDkxMkYsIDB4MkE4MSwgMHg5MTMwLCAweDEyNEMsIDB4OTEzMSwgMHgxMjRGLCAweDkxMzIsIDB4MkE4NSwKLSAgICAweDkxMzMsIDB4MkNCQSwgMHg5MTM0LCAweDEzNzMsIDB4OTEzNSwgMHgyQ0JCLCAweDkxMzYsIDB4MkNCQywKLSAgICAweDkxMzgsIDB4MkU3RiwgMHg5MTM5LCAweDE0OTgsIDB4OTEzQSwgMHgyRkZDLCAweDkxM0IsIDB4MkZGRCwKLSAgICAweDkxM0UsIDB4MkZGRSwgMHg5MTNGLCAweDMxNDgsIDB4OTE0MCwgMHgzMTQ3LCAweDkxNDEsIDB4MzI0OSwKLSAgICAweDkxNDMsIDB4MzI0OCwgMHg5MTQ0LCAweDMzMUYsIDB4OTE0NSwgMHgzMzIwLCAweDkxNDYsIDB4MzMxRSwKLSAgICAweDkxNDcsIDB4MzNDNiwgMHg5MTQ4LCAweDE2REUsIDB4OTE0OSwgMHgwNTIwLCAweDkxNEEsIDB4MDgxRiwKLSAgICAweDkxNEIsIDB4MDgxRSwgMHg5MTRDLCAweDA5RTQsIDB4OTE0RCwgMHgwOUUzLCAweDkxNEUsIDB4MUUyQSwKLSAgICAweDkxNEYsIDB4MUUyQiwgMHg5MTUwLCAweDFFMjksIDB4OTE1MiwgMHgwOUUyLCAweDkxNTMsIDB4MjA5MywKLSAgICAweDkxNTUsIDB4MjA5NCwgMHg5MTU2LCAweDIwOTAsIDB4OTE1NywgMHgwQkM4LCAweDkxNTgsIDB4MjA5MSwKLSAgICAweDkxNUEsIDB4MjA5MiwgMHg5MTVGLCAweDIzMzEsIDB4OTE2MCwgMHgyMzMzLCAweDkxNjEsIDB4MjMyRiwKLSAgICAweDkxNjIsIDB4MjMzMiwgMHg5MTYzLCAweDBEOEMsIDB4OTE2NCwgMHgyMzMwLCAweDkxNjUsIDB4MEQ4RCwKLSAgICAweDkxNjgsIDB4MjNFMiwgMHg5MTY5LCAweDBGNDksIDB4OTE2QSwgMHgwRjQ4LCAweDkxNkMsIDB4MEY0NywKLSAgICAweDkxNkUsIDB4MjVDRiwgMHg5MTZGLCAweDI1RDAsIDB4OTE3MiwgMHgyODJDLCAweDkxNzMsIDB4MjgyRSwKLSAgICAweDkxNzQsIDB4MTBEMiwgMHg5MTc1LCAweDEwQ0YsIDB4OTE3NywgMHgxMEQxLCAweDkxNzgsIDB4MTBEMCwKLSAgICAweDkxNzksIDB4MjgyRCwgMHg5MTdBLCAweDI4MkIsIDB4OTE4MCwgMHgyQThFLCAweDkxODEsIDB4MkE4QiwKLSAgICAweDkxODIsIDB4MkE4QywgMHg5MTgzLCAweDEyNTMsIDB4OTE4NCwgMHgyQThELCAweDkxODUsIDB4MkE4OCwKLSAgICAweDkxODYsIDB4MkE4OSwgMHg5MTg3LCAweDEyNTAsIDB4OTE4OSwgMHgxMjUxLCAweDkxOEEsIDB4MkE4QSwKLSAgICAweDkxOEIsIDB4MTI1MiwgMHg5MThELCAweDJDQzAsIDB4OTE4RiwgMHgyQ0MxLCAweDkxOTAsIDB4MkNCRSwKLSAgICAweDkxOTEsIDB4MkNCRiwgMHg5MTkyLCAweDEzNzQsIDB4OTE5MywgMHgyQ0JELCAweDkxOTksIDB4MkU4MywKLSAgICAweDkxOUEsIDB4MkU4MCwgMHg5MTlCLCAweDJFODIsIDB4OTE5QywgMHgxNDlCLCAweDkxOUQsIDB4MkU4NiwKLSAgICAweDkxOUUsIDB4MTQ5QSwgMHg5MTlGLCAweDJFODQsIDB4OTFBMCwgMHgyRTg3LCAweDkxQTEsIDB4MkU4NSwKLSAgICAweDkxQTIsIDB4MkU4MSwgMHg5MUEzLCAweDE0OTksIDB4OTFBNSwgMHgzMDAwLCAweDkxQTcsIDB4MzAwMSwKLSAgICAweDkxQTgsIDB4MkZGRiwgMHg5MUFBLCAweDMwMDMsIDB4OTFBQiwgMHgxNTNDLCAweDkxQUMsIDB4MTUzRCwKLSAgICAweDkxQUQsIDB4MzE0QSwgMHg5MUFFLCAweDE1REMsIDB4OTFBRiwgMHgzMDAyLCAweDkxQjAsIDB4MzE0OSwKLSAgICAweDkxQjEsIDB4MTVEQiwgMHg5MUIyLCAweDMyNEMsIDB4OTFCMywgMHgzMjRELCAweDkxQjQsIDB4MTY1MCwKLSAgICAweDkxQjUsIDB4MzI0QiwgMHg5MUI3LCAweDMyNEEsIDB4OTFCOSwgMHgzMzIxLCAweDkxQkEsIDB4MTY5OCwKLSAgICAweDkxQkMsIDB4MzQ0NiwgMHg5MUJELCAweDM0QTMsIDB4OTFCRSwgMHgzNEEyLCAweDkxQzAsIDB4MTczMCwKLSAgICAweDkxQzEsIDB4MTc0QSwgMHg5MUMyLCAweDM0QTQsIDB4OTFDMywgMHgzNTBCLCAweDkxQzUsIDB4MTc1QywKLSAgICAweDkxQzYsIDB4MDUyMSwgMHg5MUM3LCAweDA2OTUsIDB4OTFDOSwgMHgwRjRBLCAweDkxQ0IsIDB4MTY1MSwKLSAgICAweDkxQ0MsIDB4MDUyMiwgMHg5MUNELCAweDA4MjAsIDB4OTFDRSwgMHgwQkM5LCAweDkxQ0YsIDB4MEQ4RSwKLSAgICAweDkxRDAsIDB4MTUzRSwgMHg5MUQxLCAweDA2OTYsIDB4OTFEMywgMHgxQzE1LCAweDkxRDQsIDB4MUMxNCwKLSAgICAweDkxRDUsIDB4MUUyQywgMHg5MUQ3LCAweDA5RTcsIDB4OTFEOCwgMHgwOUU1LCAweDkxRDksIDB4MDlFOSwKLSAgICAweDkxREEsIDB4MUUyRSwgMHg5MURDLCAweDA5RTgsIDB4OTFERCwgMHgwOUU2LCAweDkxRTIsIDB4MUUyRCwKLSAgICAweDkxRTMsIDB4MEJDQywgMHg5MUU0LCAweDIwOUEsIDB4OTFFNiwgMHgwQkNCLCAweDkxRTcsIDB4MEJDRCwKLSAgICAweDkxRTgsIDB4MjA5RiwgMHg5MUU5LCAweDBCQ0YsIDB4OTFFQSwgMHgyMDlDLCAweDkxRUIsIDB4MjA5RCwKLSAgICAweDkxRUMsIDB4MjA5NSwgMHg5MUVELCAweDBCQ0UsIDB4OTFFRSwgMHgyMEEwLCAweDkxRjEsIDB4MjA5NywKLSAgICAweDkxRjMsIDB4MjA5OCwgMHg5MUY0LCAweDIwOTYsIDB4OTFGNSwgMHgwQkNBLCAweDkxRjcsIDB4MjA5RSwKLSAgICAweDkxRjgsIDB4MjA5OSwgMHg5MUY5LCAweDIwOUIsIDB4OTFGRCwgMHgyMzNGLCAweDkxRkYsIDB4MjMzRSwKLSAgICAweDkyMDAsIDB4MjMzQywgMHg5MjAxLCAweDIzMzQsIDB4OTIwMiwgMHgyMzQzLCAweDkyMDMsIDB4MjMzNywKLSAgICAweDkyMDQsIDB4MjM0MSwgMHg5MjA1LCAweDIzNDgsIDB4OTIwNiwgMHgyMzQwLCAweDkyMDcsIDB4MEQ5NiwKLSAgICAweDkyMDksIDB4MEQ5MiwgMHg5MjBBLCAweDIzMzUsIDB4OTIwQywgMHgyMzNCLCAweDkyMEQsIDB4MEQ5NCwKLSAgICAweDkyMEYsIDB4MjMzQSwgMHg5MjEwLCAweDBEOTUsIDB4OTIxMSwgMHgwRDk3LCAweDkyMTIsIDB4MjMzRCwKLSAgICAweDkyMTQsIDB4MEQ4RiwgMHg5MjE1LCAweDBEOTAsIDB4OTIxNiwgMHgyMzQ5LCAweDkyMTcsIDB4MjM0NywKLSAgICAweDkyMTksIDB4MjM0NiwgMHg5MjFBLCAweDIzMzgsIDB4OTIxQywgMHgyMzQ0LCAweDkyMUUsIDB4MEQ5MywKLSAgICAweDkyMjMsIDB4MEQ5MSwgMHg5MjI0LCAweDIzNDUsIDB4OTIyNSwgMHgyMzM2LCAweDkyMjYsIDB4MjMzOSwKLSAgICAweDkyMjcsIDB4MjM0MiwgMHg5MjJELCAweDI4NTEsIDB4OTIyRSwgMHgyNURBLCAweDkyMzAsIDB4MjVEMywKLSAgICAweDkyMzEsIDB4MjVFNiwgMHg5MjMyLCAweDI1RUYsIDB4OTIzMywgMHgyNUQ2LCAweDkyMzQsIDB4MEY1NSwKLSAgICAweDkyMzYsIDB4MjVFMywgMHg5MjM3LCAweDBGNEIsIDB4OTIzOCwgMHgwRjRELCAweDkyMzksIDB4MEY1OSwKLSAgICAweDkyM0EsIDB4MjVENCwgMHg5MjNELCAweDBGNEUsIDB4OTIzRSwgMHgwRjUwLCAweDkyM0YsIDB4MEY1QSwKLSAgICAweDkyNDAsIDB4MEY0RiwgMHg5MjQ1LCAweDBGNTgsIDB4OTI0NiwgMHgyNURDLCAweDkyNDgsIDB4MjVEMSwKLSAgICAweDkyNDksIDB4MEY1NiwgMHg5MjRBLCAweDI1REIsIDB4OTI0QiwgMHgwRjUyLCAweDkyNEMsIDB4MjVFRCwKLSAgICAweDkyNEQsIDB4MEY1NywgMHg5MjRFLCAweDI1RUIsIDB4OTI0RiwgMHgyNURGLCAweDkyNTAsIDB4MjVFOSwKLSAgICAweDkyNTEsIDB4MEY1NCwgMHg5MjUyLCAweDI1RDIsIDB4OTI1MywgMHgyNUVDLCAweDkyNTQsIDB4MjVFNywKLSAgICAweDkyNTYsIDB4MjVFRSwgMHg5MjU3LCAweDBGNEMsIDB4OTI1QSwgMHgwRjVCLCAweDkyNUIsIDB4MEY1MSwKLSAgICAweDkyNUUsIDB4MjVEOCwgMHg5MjYwLCAweDI1RTAsIDB4OTI2MSwgMHgyNUU0LCAweDkyNjMsIDB4MjVFOCwKLSAgICAweDkyNjQsIDB4MEY1MywgMHg5MjY1LCAweDI1RDcsIDB4OTI2NiwgMHgyNUQ1LCAweDkyNjcsIDB4MjVFMSwKLSAgICAweDkyNkMsIDB4MjVERSwgMHg5MjZELCAweDI1REQsIDB4OTI2RiwgMHgyNUUyLCAweDkyNzAsIDB4MjVFNSwKLSAgICAweDkyNzIsIDB4MjVFQSwgMHg5Mjc2LCAweDI4MzEsIDB4OTI3OCwgMHgxMEQzLCAweDkyNzksIDB4MjgzQiwKLSAgICAweDkyN0EsIDB4MjgzMywgMHg5MjdCLCAweDEwRDksIDB4OTI3QywgMHgxMERELCAweDkyN0QsIDB4Mjg0NCwKLSAgICAweDkyN0UsIDB4Mjg0QywgMHg5MjdGLCAweDI4M0QsIDB4OTI4MCwgMHgxMEQ1LCAweDkyODIsIDB4Mjg0MSwKLSAgICAweDkyODMsIDB4MjVEOSwgMHg5Mjg1LCAweDEwRDYsIDB4OTI4NiwgMHgyODQ4LCAweDkyODcsIDB4Mjg0RCwKLSAgICAweDkyODgsIDB4Mjg0NSwgMHg5MjhBLCAweDI4NDcsIDB4OTI4QiwgMHgyODUwLCAweDkyOEMsIDB4Mjg0OSwKLSAgICAweDkyOEQsIDB4MjgzNywgMHg5MjhFLCAweDI4NDAsIDB4OTI5MSwgMHgxMERFLCAweDkyOTMsIDB4MTBEQSwKLSAgICAweDkyOTQsIDB4MjgzNSwgMHg5Mjk1LCAweDI4NDIsIDB4OTI5NiwgMHgxMEQ4LCAweDkyOTcsIDB4MjgzQywKLSAgICAweDkyOTgsIDB4MTBENywgMHg5Mjk5LCAweDI4NEEsIDB4OTI5QSwgMHgyODM5LCAweDkyOUIsIDB4MjgzMiwKLSAgICAweDkyOUMsIDB4MTBEQiwgMHg5MjlELCAweDI4NEYsIDB4OTJBMCwgMHgyODM0LCAweDkyQTEsIDB4Mjg0NiwKLSAgICAweDkyQTIsIDB4Mjg0MywgMHg5MkEzLCAweDI4M0UsIDB4OTJBNCwgMHgyODMwLCAweDkyQTUsIDB4MjgyRiwKLSAgICAweDkyQTYsIDB4MjgzOCwgMHg5MkE3LCAweDI4NEIsIDB4OTJBOCwgMHgxMERDLCAweDkyQTksIDB4Mjg0RSwKLSAgICAweDkyQUEsIDB4MjgzNiwgMHg5MkFCLCAweDI4M0EsIDB4OTJBQywgMHgxMEQ0LCAweDkyQjIsIDB4MTI1RiwKLSAgICAweDkyQjMsIDB4MTI1QSwgMHg5MkI0LCAweDJBQjAsIDB4OTJCNSwgMHgyQUFDLCAweDkyQjYsIDB4MkE5NCwKLSAgICAweDkyQjcsIDB4MTI1NiwgMHg5MkI5LCAweDM2RTksIDB4OTJCQiwgMHgxMjU1LCAweDkyQkMsIDB4MTI1QiwKLSAgICAweDkyQzAsIDB4MkE5MiwgMHg5MkMxLCAweDEyNTksIDB4OTJDMiwgMHgyQTlFLCAweDkyQzMsIDB4MkE5MCwKLSAgICAweDkyQzQsIDB4MkE5MSwgMHg5MkM1LCAweDEyNTQsIDB4OTJDNiwgMHgyQUFGLCAweDkyQzcsIDB4MTI1RCwKLSAgICAweDkyQzgsIDB4MkFBMSwgMHg5MkM5LCAweDJBQTYsIDB4OTJDQSwgMHgyQUEwLCAweDkyQ0IsIDB4MkNEMywKLSAgICAweDkyQ0MsIDB4MkE5QywgMHg5MkNELCAweDJBQTQsIDB4OTJDRSwgMHgyQUEyLCAweDkyQ0YsIDB4MkE5NSwKLSAgICAweDkyRDAsIDB4MkE4RiwgMHg5MkQxLCAweDJBQUEsIDB4OTJEMiwgMHgxMjVDLCAweDkyRDMsIDB4MkFBQiwKLSAgICAweDkyRDUsIDB4MkFBNSwgMHg5MkQ3LCAweDJBOUEsIDB4OTJEOCwgMHgyQTk4LCAweDkyRDksIDB4MkE5MywKLSAgICAweDkyREQsIDB4MkE5QiwgMHg5MkRFLCAweDJBQTgsIDB4OTJERiwgMHgyQTk3LCAweDkyRTAsIDB4MkFBNywKLSAgICAweDkyRTEsIDB4MkFBRCwgMHg5MkU0LCAweDEyNTgsIDB4OTJFNiwgMHgyQUEzLCAweDkyRTcsIDB4MkFBOSwKLSAgICAweDkyRTgsIDB4MkE5RiwgMHg5MkU5LCAweDJBOTksIDB4OTJFQSwgMHgxMjU3LCAweDkyRUUsIDB4MjgzRiwKLSAgICAweDkyRUYsIDB4MkE5RCwgMHg5MkYwLCAweDEyNUUsIDB4OTJGMSwgMHgyQTk2LCAweDkyRjcsIDB4MkNEOCwKLSAgICAweDkyRjgsIDB4MTM3NywgMHg5MkY5LCAweDJDRDcsIDB4OTJGQSwgMHgyQ0Q1LCAweDkyRkIsIDB4MkNFNywKLSAgICAweDkyRkMsIDB4MTM3QiwgMHg5MkZFLCAweDJDRTQsIDB4OTJGRiwgMHgyQ0RDLCAweDkzMDAsIDB4MkNFNiwKLSAgICAweDkzMDEsIDB4MkNDRSwgMHg5MzAyLCAweDJDREEsIDB4OTMwNCwgMHgxMzdELCAweDkzMDYsIDB4MkNDNiwKLSAgICAweDkzMDgsIDB4MkNDNCwgMHg5MzA5LCAweDJDRTUsIDB4OTMwQiwgMHgyQ0UzLCAweDkzMEMsIDB4MkNFMiwKLSAgICAweDkzMEQsIDB4MkNEMiwgMHg5MzBFLCAweDJDRDEsIDB4OTMwRiwgMHgyQ0M3LCAweDkzMTAsIDB4MTM3RiwKLSAgICAweDkzMTIsIDB4MkNDRCwgMHg5MzEzLCAweDJDRDYsIDB4OTMxNCwgMHgyQ0UxLCAweDkzMTUsIDB4MTM4MiwKLSAgICAweDkzMTYsIDB4MkNFOCwgMHg5MzE4LCAweDE0QTMsIDB4OTMxOSwgMHgxMzg0LCAweDkzMUEsIDB4MTM3RSwKLSAgICAweDkzMUIsIDB4MkNDQiwgMHg5MzFELCAweDJDRDQsIDB4OTMxRSwgMHgyQ0MzLCAweDkzMUYsIDB4MkNDNSwKLSAgICAweDkzMjAsIDB4MTM3NSwgMHg5MzIxLCAweDEzODEsIDB4OTMyMiwgMHgxMzdBLCAweDkzMjMsIDB4MkNDQywKLSAgICAweDkzMjQsIDB4MkNEQiwgMHg5MzI1LCAweDJBQUUsIDB4OTMyNiwgMHgxMzgwLCAweDkzMjcsIDB4MkNDMiwKLSAgICAweDkzMjgsIDB4MTQ5RSwgMHg5MzI5LCAweDJDREQsIDB4OTMyQSwgMHgyQ0UwLCAweDkzMkIsIDB4MTM3QywKLSAgICAweDkzMkQsIDB4MkNEMCwgMHg5MzJFLCAweDEzODMsIDB4OTMyRiwgMHgxMzc5LCAweDkzMzMsIDB4MTM3OCwKLSAgICAweDkzMzQsIDB4MkNEOSwgMHg5MzM1LCAweDJDREYsIDB4OTMzNiwgMHgxMzc2LCAweDkzMzgsIDB4MkNDOSwKLSAgICAweDkzMzksIDB4MkNERSwgMHg5MzNDLCAweDJDQ0EsIDB4OTM0NiwgMHgyQ0NGLCAweDkzNDcsIDB4MkU4RCwKLSAgICAweDkzNDksIDB4MkU5MiwgMHg5MzRBLCAweDE0QTAsIDB4OTM0QiwgMHgxNEEyLCAweDkzNEMsIDB4MkU5OCwKLSAgICAweDkzNEQsIDB4MTQ5QywgMHg5MzRFLCAweDJFQTYsIDB4OTM0RiwgMHgyRTlFLCAweDkzNTAsIDB4MkU5MywKLSAgICAweDkzNTEsIDB4MkU5NCwgMHg5MzUyLCAweDJFOUQsIDB4OTM1NCwgMHgxNEE5LCAweDkzNTUsIDB4MkU5QywKLSAgICAweDkzNTYsIDB4MkU4QywgMHg5MzU3LCAweDJFOUIsIDB4OTM1OCwgMHgyRThGLCAweDkzNTksIDB4MkVBNywKLSAgICAweDkzNUEsIDB4MTRBOCwgMHg5MzVCLCAweDE0QTYsIDB4OTM1QywgMHgyRTkwLCAweDkzNUUsIDB4MkVBMywKLSAgICAweDkzNjAsIDB4MkU5NSwgMHg5MzYxLCAweDJFQTIsIDB4OTM2MywgMHgyRUE0LCAweDkzNjQsIDB4MkU4QiwKLSAgICAweDkzNjUsIDB4MTRBMSwgMHg5MzY3LCAweDJFQTUsIDB4OTM2QSwgMHgyRTk5LCAweDkzNkMsIDB4MTRBNSwKLSAgICAweDkzNkQsIDB4MkU5NiwgMHg5MzcwLCAweDE0QTcsIDB4OTM3MSwgMHgyRTlGLCAweDkzNzUsIDB4MTQ5RiwKLSAgICAweDkzNzYsIDB4MkU5MSwgMHg5Mzc3LCAweDJFQTAsIDB4OTM3OSwgMHgyRTlBLCAweDkzN0EsIDB4MkNDOCwKLSAgICAweDkzN0IsIDB4MkVBMSwgMHg5MzdDLCAweDJFOEUsIDB4OTM3RSwgMHgxNEE0LCAweDkzODAsIDB4MzAxNCwKLSAgICAweDkzODIsIDB4MTQ5RCwgMHg5MzgzLCAweDJFODksIDB4OTM4OCwgMHgzMDExLCAweDkzODksIDB4MzAwQSwKLSAgICAweDkzOEEsIDB4MTU0MCwgMHg5MzhDLCAweDMwMDUsIDB4OTM4RCwgMHgzMDE1LCAweDkzOEUsIDB4MzAwQywKLSAgICAweDkzOEYsIDB4MkU5NywgMHg5MzkxLCAweDMwMTcsIDB4OTM5MiwgMHgzMDA2LCAweDkzOTQsIDB4MTUzRiwKLSAgICAweDkzOTUsIDB4MzAxMCwgMHg5Mzk2LCAweDE1NDEsIDB4OTM5NywgMHgxNTQ5LCAweDkzOTgsIDB4MTU0NywKLSAgICAweDkzOTksIDB4MzAxMiwgMHg5MzlBLCAweDE1NDgsIDB4OTM5QiwgMHgzMDA4LCAweDkzOUQsIDB4MzAwOSwKLSAgICAweDkzOUUsIDB4MzAwRSwgMHg5MzlGLCAweDMwMTMsIDB4OTNBMSwgMHgyRTg4LCAweDkzQTIsIDB4MTU0MiwKLSAgICAweDkzQTMsIDB4MzAxQywgMHg5M0E0LCAweDMwMTksIDB4OTNBNSwgMHgzMTYwLCAweDkzQTYsIDB4MzAwRiwKLSAgICAweDkzQTcsIDB4MzAwQiwgMHg5M0E4LCAweDMwMUEsIDB4OTNBOSwgMHgzMTU1LCAweDkzQUEsIDB4MzAwRCwKLSAgICAweDkzQUMsIDB4MTU0NSwgMHg5M0FFLCAweDE1NDQsIDB4OTNBRiwgMHgyRThBLCAweDkzQjAsIDB4MTU0NiwKLSAgICAweDkzQjEsIDB4MzAxNiwgMHg5M0IyLCAweDMwMTgsIDB4OTNCMywgMHgxNTQzLCAweDkzQjQsIDB4MzAxQiwKLSAgICAweDkzQjUsIDB4MzAwNCwgMHg5M0I3LCAweDMwMDcsIDB4OTNDMCwgMHgzMTVFLCAweDkzQzIsIDB4MzE0RSwKLSAgICAweDkzQzMsIDB4MTVFMCwgMHg5M0M0LCAweDMxNUMsIDB4OTNDNywgMHgzMTRDLCAweDkzQzgsIDB4MTVFMSwKLSAgICAweDkzQ0EsIDB4MzE1NywgMHg5M0NDLCAweDMxNTMsIDB4OTNDRCwgMHgxNUU2LCAweDkzQ0UsIDB4MzE1RCwKLSAgICAweDkzQ0YsIDB4MzE0RCwgMHg5M0QwLCAweDMxNTAsIDB4OTNEMSwgMHgxNURFLCAweDkzRDIsIDB4MzE1RiwKLSAgICAweDkzRDQsIDB4MzE1OCwgMHg5M0Q1LCAweDMxNUIsIDB4OTNENiwgMHgxNUU0LCAweDkzRDcsIDB4MTVFOSwKLSAgICAweDkzRDgsIDB4MTVFNywgMHg5M0Q5LCAweDMxNTQsIDB4OTNEQSwgMHgzMTRGLCAweDkzREMsIDB4MTVFMiwKLSAgICAweDkzREQsIDB4MTVFMywgMHg5M0RFLCAweDMxNEIsIDB4OTNERiwgMHgxNURGLCAweDkzRTEsIDB4MTVERCwKLSAgICAweDkzRTIsIDB4MTVFNSwgMHg5M0UzLCAweDMxNUEsIDB4OTNFNCwgMHgxNUU4LCAweDkzRTYsIDB4MzE1NiwKLSAgICAweDkzRTcsIDB4MzE2MSwgMHg5M0U4LCAweDE1RUEsIDB4OTNFQywgMHgzMTUyLCAweDkzRUUsIDB4MzE1OSwKLSAgICAweDkzRjUsIDB4MzI1QSwgMHg5M0Y2LCAweDMyNjksIDB4OTNGNywgMHgzMjVDLCAweDkzRjgsIDB4MzI2MywKLSAgICAweDkzRjksIDB4MzE1MSwgMHg5M0ZBLCAweDMyNjEsIDB4OTNGQiwgMHgzMjUwLCAweDkzRkMsIDB4MzI2NywKLSAgICAweDkzRkQsIDB4MTY1NCwgMHg5M0ZFLCAweDMyNTQsIDB4OTNGRiwgMHgzMjY2LCAweDk0MDAsIDB4MzI1QiwKLSAgICAweDk0MDMsIDB4MTY1MywgMHg5NDA2LCAweDMyNkIsIDB4OTQwNywgMHgzMjVELCAweDk0MDksIDB4MzI2MiwKLSAgICAweDk0MEEsIDB4MzI2NSwgMHg5NDBCLCAweDMyNEUsIDB4OTQwQywgMHgzMjY4LCAweDk0MEQsIDB4MzI1OSwKLSAgICAweDk0MEUsIDB4MzI1RSwgMHg5NDBGLCAweDMyNTIsIDB4OTQxMCwgMHgzMjU2LCAweDk0MTEsIDB4MzI2QSwKLSAgICAweDk0MTIsIDB4MzI2MCwgMHg5NDEzLCAweDMyNEYsIDB4OTQxNCwgMHgzMjUzLCAweDk0MTUsIDB4MzI1NSwKLSAgICAweDk0MTYsIDB4MzI1RiwgMHg5NDE4LCAweDE2NTIsIDB4OTQxOSwgMHgzMjU4LCAweDk0MjAsIDB4MzI1MSwKLSAgICAweDk0MjgsIDB4MzI1NywgMHg5NDI5LCAweDMzMjUsIDB4OTQyQSwgMHgzMzI5LCAweDk0MkIsIDB4MTY5RiwKLSAgICAweDk0MkMsIDB4MzMyQiwgMHg5NDJFLCAweDE2OTksIDB4OTQzMCwgMHgzMzI3LCAweDk0MzEsIDB4MzMyRCwKLSAgICAweDk0MzIsIDB4MTY5RSwgMHg5NDMzLCAweDE2OUEsIDB4OTQzNSwgMHgxNjlCLCAweDk0MzYsIDB4MzMyNCwKLSAgICAweDk0MzcsIDB4MzMyQSwgMHg5NDM4LCAweDE2OUQsIDB4OTQzOSwgMHgzMzI4LCAweDk0M0EsIDB4MTY5QywKLSAgICAweDk0M0IsIDB4MzMyMywgMHg5NDNDLCAweDMyNjQsIDB4OTQzRCwgMHgzMzI2LCAweDk0M0YsIDB4MzMyMiwKLSAgICAweDk0NDAsIDB4MzMyQywgMHg5NDQ0LCAweDE2REYsIDB4OTQ0NSwgMHgzM0NELCAweDk0NDYsIDB4MzNEMCwKLSAgICAweDk0NDcsIDB4MzNDQywgMHg5NDQ4LCAweDMzQ0UsIDB4OTQ0OSwgMHgzM0NGLCAweDk0NEEsIDB4MzNDOSwKLSAgICAweDk0NEIsIDB4MzNDQSwgMHg5NDRDLCAweDMzQzcsIDB4OTQ0RiwgMHgzM0NCLCAweDk0NTAsIDB4MzNDOCwKLSAgICAweDk0NTEsIDB4MTZFMCwgMHg5NDUyLCAweDE2RTEsIDB4OTQ1NSwgMHgzNDQ4LCAweDk0NTcsIDB4MzQ0QSwKLSAgICAweDk0NUQsIDB4MzQ0OSwgMHg5NDVFLCAweDM0NEIsIDB4OTQ2MCwgMHgxNzBFLCAweDk0NjIsIDB4MzQ0NywKLSAgICAweDk0NjMsIDB4MTcwRCwgMHg5NDY0LCAweDE3MEYsIDB4OTQ2OCwgMHgzNEE2LCAweDk0NjksIDB4MzRBNywKLSAgICAweDk0NkEsIDB4MTczMSwgMHg5NDZCLCAweDM0QTUsIDB4OTQ2RCwgMHgzNEVELCAweDk0NkUsIDB4MzRFQywKLSAgICAweDk0NkYsIDB4MzRFRSwgMHg5NDcwLCAweDE3NEMsIDB4OTQ3MSwgMHgzNEVGLCAweDk0NzIsIDB4MTc0QiwKLSAgICAweDk0NzMsIDB4MzRGMCwgMHg5NDc0LCAweDM1MEMsIDB4OTQ3NSwgMHgzNTBGLCAweDk0NzYsIDB4MzUwRSwKLSAgICAweDk0NzcsIDB4MTc1NSwgMHg5NDc4LCAweDM1MEQsIDB4OTQ3QywgMHgxNzVGLCAweDk0N0QsIDB4MTc1RCwKLSAgICAweDk0N0UsIDB4MTc1RSwgMHg5NDdGLCAweDE3NjQsIDB4OTQ4MCwgMHgzNTM5LCAweDk0ODEsIDB4MzUzQSwKLSAgICAweDk0ODIsIDB4MzUzOCwgMHg5NDgzLCAweDM1NDAsIDB4OTU3NywgMHgwNjk3LCAweDk1N0EsIDB4MjBBMSwKLSAgICAweDk1N0IsIDB4MjM0QSwgMHg5NTdDLCAweDJBQjEsIDB4OTU3RCwgMHgzMTYyLCAweDk1ODAsIDB4MDY5OCwKLSAgICAweDk1ODIsIDB4MDgyMSwgMHg5NTgzLCAweDA5RUEsIDB4OTU4NiwgMHgyMEEyLCAweDk1ODgsIDB4MjBBMywKLSAgICAweDk1ODksIDB4MEJEMCwgMHg5NThCLCAweDBEOUEsIDB4OTU4QywgMHgyMzRDLCAweDk1OEQsIDB4MjM0QiwKLSAgICAweDk1OEUsIDB4MEQ5RSwgMHg5NThGLCAweDBEOTksIDB4OTU5MCwgMHgyMzRELCAweDk1OTEsIDB4MEQ5QiwKLSAgICAweDk1OTIsIDB4MEQ5RCwgMHg5NTkzLCAweDBEOUMsIDB4OTU5NCwgMHgwRDk4LCAweDk1OTgsIDB4MEY1QywKLSAgICAweDk1OUIsIDB4MjVGMywgMHg5NTlDLCAweDI1RjEsIDB4OTU5RSwgMHgyNUYyLCAweDk1OUYsIDB4MjVGMCwKLSAgICAweDk1QTEsIDB4MTBERiwgMHg5NUEzLCAweDEwRTIsIDB4OTVBNCwgMHgxMEU0LCAweDk1QTUsIDB4MTBFMywKLSAgICAweDk1QTgsIDB4MTBFMCwgMHg5NUE5LCAweDEwRTEsIDB4OTVBQiwgMHgyQUIzLCAweDk1QUMsIDB4MkFCMiwKLSAgICAweDk1QUQsIDB4MTI2MCwgMHg5NUFFLCAweDJBQjQsIDB4OTVCMCwgMHgyQUI1LCAweDk1QjEsIDB4MTI2MSwKLSAgICAweDk1QjUsIDB4MkNGMCwgMHg5NUI2LCAweDJDRUUsIDB4OTVCNywgMHgyRUFELCAweDk1QjksIDB4MkNFQywKLSAgICAweDk1QkEsIDB4MkNFRCwgMHg5NUJCLCAweDEzODUsIDB4OTVCQywgMHgyQ0U5LCAweDk1QkQsIDB4MkNGMSwKLSAgICAweDk1QkUsIDB4MkNFQiwgMHg5NUJGLCAweDJDRUYsIDB4OTVDMCwgMHgyRUE5LCAweDk1QzMsIDB4MkVBQiwKLSAgICAweDk1QzUsIDB4MkVBQywgMHg5NUM2LCAweDE0QUUsIDB4OTVDNywgMHgyRUE4LCAweDk1QzgsIDB4MTRBRCwKLSAgICAweDk1QzksIDB4MkVBQSwgMHg5NUNBLCAweDE0QUEsIDB4OTVDQiwgMHgxNEFCLCAweDk1Q0MsIDB4MTRBQywKLSAgICAweDk1Q0QsIDB4MkNFQSwgMHg5NUQwLCAweDE1NEMsIDB4OTVEMSwgMHgzMDFGLCAweDk1RDIsIDB4MzAxRCwKLSAgICAweDk1RDMsIDB4MzAxRSwgMHg5NUQ0LCAweDE1NEEsIDB4OTVENSwgMHgxNTRELCAweDk1RDYsIDB4MTU0QiwKLSAgICAweDk1REEsIDB4MzE2MywgMHg5NURCLCAweDMxNjQsIDB4OTVEQywgMHgxNUVCLCAweDk1REUsIDB4MzI2QywKLSAgICAweDk1REYsIDB4MzI2RSwgMHg5NUUwLCAweDMyNkQsIDB4OTVFMSwgMHgxNjU1LCAweDk1RTIsIDB4MTZBMCwKLSAgICAweDk1RTMsIDB4MzMzMCwgMHg5NUU0LCAweDMzMkYsIDB4OTVFNSwgMHgzMzJFLCAweDk2MUMsIDB4MDY5OSwKLSAgICAweDk2MUUsIDB4MTdCNCwgMHg5NjIwLCAweDE4MjEsIDB4OTYyMSwgMHgwNDE0LCAweDk2MjIsIDB4MTgxRiwKLSAgICAweDk2MjMsIDB4MTgyMiwgMHg5NjI0LCAweDE4MjAsIDB4OTYyOCwgMHgxOEYxLCAweDk2MkEsIDB4MDUyNiwKLSAgICAweDk2MkMsIDB4MDUyNywgMHg5NjJELCAweDE4RjMsIDB4OTYyRSwgMHgwNTI0LCAweDk2MkYsIDB4MThGMiwKLSAgICAweDk2MzAsIDB4MThGMCwgMHg5NjMxLCAweDA1MjUsIDB4OTYzMiwgMHgwNTIzLCAweDk2MzksIDB4MUE1NSwKLSAgICAweDk2M0EsIDB4MUE1OCwgMHg5NjNCLCAweDA2OUMsIDB4OTYzQywgMHgxQTU3LCAweDk2M0QsIDB4MUE1NiwKLSAgICAweDk2M0YsIDB4MDY5QiwgMHg5NjQwLCAweDA2OUEsIDB4OTY0MiwgMHgwNjlFLCAweDk2NDMsIDB4MUE1OSwKLSAgICAweDk2NDQsIDB4MDY5RCwgMHg5NjRBLCAweDFDMUEsIDB4OTY0QiwgMHgwODIzLCAweDk2NEMsIDB4MDgyNCwKLSAgICAweDk2NEQsIDB4MDgyNSwgMHg5NjRFLCAweDFDMUIsIDB4OTY0RiwgMHgxQzE3LCAweDk2NTAsIDB4MDgyMiwKLSAgICAweDk2NTEsIDB4MUMxOCwgMHg5NjUzLCAweDFDMTksIDB4OTY1NCwgMHgxQzE2LCAweDk2NTgsIDB4MDlGMSwKLSAgICAweDk2NUIsIDB4MDlFRSwgMHg5NjVDLCAweDFFMkYsIDB4OTY1RCwgMHgwOUVGLCAweDk2NUUsIDB4MDlGMiwKLSAgICAweDk2NUYsIDB4MUUzMCwgMHg5NjYxLCAweDA5RUQsIDB4OTY2MiwgMHgwOUVCLCAweDk2NjMsIDB4MDlFQywKLSAgICAweDk2NjQsIDB4MDlGMCwgMHg5NjZBLCAweDBCRDEsIDB4OTY2QiwgMHgyMEE2LCAweDk2NkMsIDB4MEJEOSwKLSAgICAweDk2NkQsIDB4MjBBNSwgMHg5NjZGLCAweDIwQTgsIDB4OTY3MCwgMHgwQkQ1LCAweDk2NzEsIDB4MjBBNywKLSAgICAweDk2NzIsIDB4MERBNiwgMHg5NjczLCAweDBCRDMsIDB4OTY3NCwgMHgwQkQ2LCAweDk2NzUsIDB4MEJEMiwKLSAgICAweDk2NzYsIDB4MEJENywgMHg5Njc3LCAweDBCRDgsIDB4OTY3OCwgMHgwQkQ0LCAweDk2N0MsIDB4MjBBNCwKLSAgICAweDk2N0QsIDB4MERBMiwgMHg5NjdFLCAweDIzNEYsIDB4OTY4MCwgMHgyMzUzLCAweDk2ODMsIDB4MjM1MiwKLSAgICAweDk2ODQsIDB4MERBNywgMHg5Njg1LCAweDBEQTMsIDB4OTY4NiwgMHgwREE0LCAweDk2ODcsIDB4MjM0RSwKLSAgICAweDk2ODgsIDB4MjM1MCwgMHg5Njg5LCAweDIzNTEsIDB4OTY4QSwgMHgwRDlGLCAweDk2OEIsIDB4MERBMSwKLSAgICAweDk2OEQsIDB4MERBNSwgMHg5NjhFLCAweDBEQTAsIDB4OTY5MSwgMHgyNUY2LCAweDk2OTIsIDB4MjVGNCwKLSAgICAweDk2OTMsIDB4MjVGNSwgMHg5Njk0LCAweDBGNUUsIDB4OTY5NSwgMHgwRjVGLCAweDk2OTcsIDB4MjVGNywKLSAgICAweDk2OTgsIDB4MEY1RCwgMHg5Njk5LCAweDEwRTUsIDB4OTY5QiwgMHgxMEU3LCAweDk2OUMsIDB4MTBFNiwKLSAgICAweDk2OUUsIDB4Mjg1MiwgMHg5NkExLCAweDI4NTMsIDB4OTZBMiwgMHgyQUI3LCAweDk2QTQsIDB4MkFCNiwKLSAgICAweDk2QTcsIDB4MTM4NiwgMHg5NkE4LCAweDEzODcsIDB4OTZBOSwgMHgyQ0YyLCAweDk2QUEsIDB4MTM4OCwKLSAgICAweDk2QUMsIDB4MkVCMCwgMHg5NkFFLCAweDJFQUUsIDB4OTZCMCwgMHgyRUFGLCAweDk2QjEsIDB4MTRBRiwKLSAgICAweDk2QjMsIDB4MzAyMCwgMHg5NkI0LCAweDE1RUMsIDB4OTZCNiwgMHgwMjMxLCAweDk2QjgsIDB4MTRCMCwKLSAgICAweDk2QjksIDB4MDY5RiwgMHg5NkJCLCAweDA5RjMsIDB4OTZCQywgMHgxRTMxLCAweDk2QkYsIDB4MjBBOSwKLSAgICAweDk2QzAsIDB4MEJEQSwgMHg5NkMxLCAweDBEQTgsIDB4OTZDMiwgMHgyMzU0LCAweDk2QzMsIDB4MjM1NiwKLSAgICAweDk2QzQsIDB4MERBQSwgMHg5NkM1LCAweDBEQTksIDB4OTZDNiwgMHgwREFCLCAweDk2QzcsIDB4MERBQywKLSAgICAweDk2QzgsIDB4MjM1NSwgMHg5NkM5LCAweDBGNjIsIDB4OTZDQSwgMHgwRjYzLCAweDk2Q0IsIDB4MEY2MSwKLSAgICAweDk2Q0MsIDB4MTBFOCwgMHg5NkNELCAweDBGNjAsIDB4OTZDRSwgMHgyNUY4LCAweDk2RDIsIDB4MTBFOSwKLSAgICAweDk2RDMsIDB4MkFCOCwgMHg5NkQ0LCAweDJDRjMsIDB4OTZENSwgMHgxMzg5LCAweDk2RDYsIDB4MTRCMSwKLSAgICAweDk2RDcsIDB4MzAyMSwgMHg5NkQ4LCAweDMwMjUsIDB4OTZEOSwgMHgxNTUwLCAweDk2REEsIDB4MzAyMiwKLSAgICAweDk2REIsIDB4MTU1MSwgMHg5NkRDLCAweDE1NEYsIDB4OTZERCwgMHgzMDI2LCAweDk2REUsIDB4MTU1MiwKLSAgICAweDk2REYsIDB4MzAyNCwgMHg5NkUxLCAweDMxNjUsIDB4OTZFMiwgMHgxNTRFLCAweDk2RTMsIDB4MTVFRCwKLSAgICAweDk2RTUsIDB4MzRBOCwgMHg5NkU4LCAweDA2QTAsIDB4OTZFOSwgMHgwQkRDLCAweDk2RUEsIDB4MEJEQiwKLSAgICAweDk2RUYsIDB4MERBRCwgMHg5NkYwLCAweDIzNTgsIDB4OTZGMSwgMHgyMzU3LCAweDk2RjIsIDB4MERBRSwKLSAgICAweDk2RjUsIDB4MjVGQywgMHg5NkY2LCAweDBGNjcsIDB4OTZGNywgMHgwRjY0LCAweDk2RjgsIDB4MjVGQiwKLSAgICAweDk2RjksIDB4MEY2NiwgMHg5NkZBLCAweDI1RjksIDB4OTZGQiwgMHgwRjY1LCAweDk2RkQsIDB4MjVGQSwKLSAgICAweDk2RkYsIDB4Mjg1NCwgMHg5NzAwLCAweDEwRUEsIDB4OTcwMiwgMHgyQUJCLCAweDk3MDQsIDB4MTI2MiwKLSAgICAweDk3MDUsIDB4MkFCOSwgMHg5NzA2LCAweDEyNjMsIDB4OTcwNywgMHgxMjY0LCAweDk3MDgsIDB4MkFCQSwKLSAgICAweDk3MDksIDB4MTI2NSwgMHg5NzBCLCAweDJDRjQsIDB4OTcwRCwgMHgxMzhELCAweDk3MEUsIDB4MTM4QSwKLSAgICAweDk3MEYsIDB4MTM4RiwgMHg5NzEwLCAweDJDRjYsIDB4OTcxMSwgMHgxMzhCLCAweDk3MTIsIDB4MkNGNSwKLSAgICAweDk3MTMsIDB4MTM4RSwgMHg5NzE2LCAweDEzOEMsIDB4OTcxOCwgMHgyRUIzLCAweDk3MTksIDB4MkVCNSwKLSAgICAweDk3MUMsIDB4MTRCMiwgMHg5NzFELCAweDJFQjQsIDB4OTcxRSwgMHgxNEIzLCAweDk3MUYsIDB4MkVCMiwKLSAgICAweDk3MjAsIDB4MkVCMSwgMHg5NzIyLCAweDMwMjgsIDB4OTcyMywgMHgzMDI3LCAweDk3MjQsIDB4MTU1MywKLSAgICAweDk3MjUsIDB4MzAyOSwgMHg5NzI2LCAweDMxNkEsIDB4OTcyNywgMHgxNUVGLCAweDk3MjgsIDB4MzE2OSwKLSAgICAweDk3MjksIDB4MzE2NiwgMHg5NzJBLCAweDE1RUUsIDB4OTcyQiwgMHgzMTY3LCAweDk3MkMsIDB4MzE2OCwKLSAgICAweDk3MkUsIDB4MzI2RiwgMHg5NzJGLCAweDMyNzAsIDB4OTczMCwgMHgxNjU2LCAweDk3MzIsIDB4MTZBMywKLSAgICAweDk3MzUsIDB4MzMzMSwgMHg5NzM4LCAweDE2QTEsIDB4OTczOSwgMHgxNkEyLCAweDk3M0EsIDB4MzMzMiwKLSAgICAweDk3M0QsIDB4MTZFMiwgMHg5NzNFLCAweDE2RTMsIDB4OTczRiwgMHgzM0QxLCAweDk3NDIsIDB4MTczMiwKLSAgICAweDk3NDMsIDB4MzRBQSwgMHg5NzQ0LCAweDE3MzQsIDB4OTc0NiwgMHgzNEE5LCAweDk3NDcsIDB4MzRBQiwKLSAgICAweDk3NDgsIDB4MTczMywgMHg5NzQ5LCAweDM0RjEsIDB4OTc0QiwgMHgzNTI2LCAweDk3NTIsIDB4MDZBMSwKLSAgICAweDk3NTYsIDB4MEY2OCwgMHg5NzU4LCAweDI4NTUsIDB4OTc1QSwgMHgyQUJDLCAweDk3NUIsIDB4MTM5MCwKLSAgICAweDk3NUMsIDB4MTM5MSwgMHg5NzVFLCAweDA2QTIsIDB4OTc2MCwgMHgxMjY2LCAweDk3NjEsIDB4MTVGMCwKLSAgICAweDk3NjIsIDB4MDgyNiwgMHg5NzY2LCAweDEzOTIsIDB4OTc2OCwgMHgxNzEwLCAweDk3NjksIDB4MDgyNywKLSAgICAweDk3NkEsIDB4MjBBQSwgMHg5NzZDLCAweDIzNTksIDB4OTc2RSwgMHgyMzVCLCAweDk3NzAsIDB4MjM1QSwKLSAgICAweDk3NzIsIDB4MjYwMCwgMHg5NzczLCAweDI1RkQsIDB4OTc3NCwgMHgwRjY5LCAweDk3NzYsIDB4MEY2QSwKLSAgICAweDk3NzcsIDB4MjVGRSwgMHg5Nzc4LCAweDI1RkYsIDB4OTc3QSwgMHgyODU3LCAweDk3N0IsIDB4Mjg1QywKLSAgICAweDk3N0MsIDB4MTBFQiwgMHg5NzdELCAweDI4NTYsIDB4OTc3RSwgMHgyODU4LCAweDk3N0YsIDB4Mjg1RiwKLSAgICAweDk3ODAsIDB4Mjg1QSwgMHg5NzgxLCAweDI4NUUsIDB4OTc4MiwgMHgyODVCLCAweDk3ODMsIDB4Mjg1OSwKLSAgICAweDk3ODQsIDB4Mjg1RCwgMHg5Nzg1LCAweDEwRUMsIDB4OTc4OCwgMHgyQUJGLCAweDk3OEEsIDB4MkFCRCwKLSAgICAweDk3OEIsIDB4MTI2OCwgMHg5NzhELCAweDEyNjcsIDB4OTc4RSwgMHgyQUJFLCAweDk3OEYsIDB4MTI2OSwKLSAgICAweDk3OTQsIDB4MkNGOSwgMHg5Nzk3LCAweDJDRjgsIDB4OTc5OCwgMHgxMzkzLCAweDk3OTksIDB4MkNGNywKLSAgICAweDk3OUEsIDB4MkVCNiwgMHg5NzlDLCAweDJFQjgsIDB4OTc5RCwgMHgyRUJBLCAweDk3OUUsIDB4MkVCOSwKLSAgICAweDk3QTAsIDB4MTRCNCwgMHg5N0ExLCAweDJFQjcsIDB4OTdBMiwgMHgzMDMwLCAweDk3QTMsIDB4MTU1NCwKLSAgICAweDk3QTQsIDB4MzAyRSwgMHg5N0E1LCAweDMwMzEsIDB4OTdBNiwgMHgxNTU1LCAweDk3QTgsIDB4MzAyQywKLSAgICAweDk3QUEsIDB4MzAyRiwgMHg5N0FCLCAweDMwMkQsIDB4OTdBQywgMHgzMDJBLCAweDk3QUQsIDB4MTU1NiwKLSAgICAweDk3QUUsIDB4MzAyQiwgMHg5N0IzLCAweDMxNkIsIDB4OTdCNiwgMHgzMTZELCAweDk3QjcsIDB4MzE2QywKLSAgICAweDk3QjksIDB4MzI3MSwgMHg5N0JCLCAweDMyNzIsIDB4OTdCRiwgMHgzMzMzLCAweDk3QzEsIDB4MTZFNSwKLSAgICAweDk3QzMsIDB4MTZFNCwgMHg5N0M0LCAweDM0NEMsIDB4OTdDNSwgMHgzNDRELCAweDk3QzYsIDB4MTczNSwKLSAgICAweDk3QzcsIDB4MzRBQywgMHg5N0M5LCAweDE3NTYsIDB4OTdDQiwgMHgwODI4LCAweDk3Q0MsIDB4MERBRiwKLSAgICAweDk3Q0QsIDB4Mjg2MSwgMHg5N0NFLCAweDI4NjAsIDB4OTdDRiwgMHgyQUMxLCAweDk3RDAsIDB4MkFDMCwKLSAgICAweDk3RDMsIDB4MTRCNSwgMHg5N0Q0LCAweDJFQkMsIDB4OTdENSwgMHgyRUJCLCAweDk3RDYsIDB4MzAzNCwKLSAgICAweDk3RDcsIDB4MzAzMiwgMHg5N0Q4LCAweDMwMzUsIDB4OTdEOSwgMHgzMDMzLCAweDk3REMsIDB4MTVGMSwKLSAgICAweDk3REQsIDB4MzE2RSwgMHg5N0RFLCAweDMxNkYsIDB4OTdERiwgMHgzMTcwLCAweDk3RTEsIDB4MzMzNCwKLSAgICAweDk3RTMsIDB4MzNEMiwgMHg5N0U1LCAweDM0QUQsIDB4OTdFRCwgMHgwODI5LCAweDk3RjAsIDB4MkNGQSwKLSAgICAweDk3RjEsIDB4MkVCRCwgMHg5N0YzLCAweDA4MkEsIDB4OTdGNiwgMHgxMEVELCAweDk3RjgsIDB4MkNGQiwKLSAgICAweDk3RjksIDB4MTU1NywgMHg5N0ZBLCAweDMwMzYsIDB4OTdGQiwgMHgxNUYyLCAweDk3RkQsIDB4MzI3MywKLSAgICAweDk3RkUsIDB4MzI3NCwgMHg5N0ZGLCAweDE2QTQsIDB4OTgwMCwgMHgzNDRFLCAweDk4MDEsIDB4MDgyQiwKLSAgICAweDk4MDIsIDB4MEJERiwgMHg5ODAzLCAweDBCRTAsIDB4OTgwNCwgMHgyMEFCLCAweDk4MDUsIDB4MERCMCwKLSAgICAweDk4MDYsIDB4MERCMSwgMHg5ODA3LCAweDIzNUMsIDB4OTgwOCwgMHgwREIyLCAweDk4MEEsIDB4MEY2RSwKLSAgICAweDk4MEMsIDB4MEY3MCwgMHg5ODBELCAweDI2MDIsIDB4OTgwRSwgMHgyNjAzLCAweDk4MEYsIDB4MjYwMSwKLSAgICAweDk4MTAsIDB4MEY2QiwgMHg5ODExLCAweDBGNkMsIDB4OTgxMiwgMHgwRjZGLCAweDk4MTMsIDB4MEY2RCwKLSAgICAweDk4MTYsIDB4Mjg2MiwgMHg5ODE3LCAweDEwRUUsIDB4OTgxOCwgMHgxMEVGLCAweDk4MUIsIDB4MkFDOCwKLSAgICAweDk4MUMsIDB4MTI2QywgMHg5ODFELCAweDJBQzMsIDB4OTgxRSwgMHgyQUMyLCAweDk4MjAsIDB4MkFDNywKLSAgICAweDk4MjEsIDB4MTI2QSwgMHg5ODI0LCAweDEzOUEsIDB4OTgyNiwgMHgyQUM0LCAweDk4MjcsIDB4MkFDOSwKLSAgICAweDk4MjgsIDB4MkFDNiwgMHg5ODI5LCAweDJBQzUsIDB4OTgyQiwgMHgxMjZCLCAweDk4MkQsIDB4MTM5OCwKLSAgICAweDk4MkYsIDB4MkNGRCwgMHg5ODMwLCAweDEzOTQsIDB4OTgzMiwgMHgyQ0ZFLCAweDk4MzUsIDB4MkNGQywKLSAgICAweDk4MzcsIDB4MTM5NywgMHg5ODM4LCAweDEzOTUsIDB4OTgzOSwgMHgxMzk5LCAweDk4M0IsIDB4MTM5NiwKLSAgICAweDk4NDEsIDB4MkVCRSwgMHg5ODQzLCAweDJFQzMsIDB4OTg0NCwgMHgyRUJGLCAweDk4NDUsIDB4MkVDMiwKLSAgICAweDk4NDYsIDB4MTRCNiwgMHg5ODQ4LCAweDJERjIsIDB4OTg0OSwgMHgyRUMxLCAweDk4NEEsIDB4MkVDMCwKLSAgICAweDk4NEMsIDB4MTU1QSwgMHg5ODRELCAweDE1NTgsIDB4OTg0RSwgMHgxNTVCLCAweDk4NEYsIDB4MTU1OSwKLSAgICAweDk4NTAsIDB4MzAzNywgMHg5ODUxLCAweDMwMzgsIDB4OTg1MiwgMHgzMDM5LCAweDk4NTMsIDB4MTU1QywKLSAgICAweDk4NTcsIDB4MzE3NCwgMHg5ODU4LCAweDE1RjQsIDB4OTg1OSwgMHgzMTcyLCAweDk4NUIsIDB4MTVGNSwKLSAgICAweDk4NUMsIDB4MzE3MSwgMHg5ODVELCAweDMxNzMsIDB4OTg1RSwgMHgxNUYzLCAweDk4NUYsIDB4MzI3OCwKLSAgICAweDk4NjAsIDB4MzI3NSwgMHg5ODYyLCAweDMyNzYsIDB4OTg2MywgMHgzMjc3LCAweDk4NjQsIDB4MzMzNSwKLSAgICAweDk4NjUsIDB4MTZBNiwgMHg5ODY3LCAweDE2QTUsIDB4OTg2OSwgMHgzM0Q0LCAweDk4NkEsIDB4MzNEMywKLSAgICAweDk4NkIsIDB4MTZFNiwgMHg5ODZGLCAweDE3MTEsIDB4OTg3MCwgMHgxNzM2LCAweDk4NzEsIDB4MTc0RCwKLSAgICAweDk4NzIsIDB4MzRGMiwgMHg5ODczLCAweDM1MjcsIDB4OTg3NCwgMHgzNTI4LCAweDk4QTgsIDB4MDgyQywKLSAgICAweDk4QTksIDB4MjM1RCwgMHg5OEFDLCAweDI2MDQsIDB4OThBRCwgMHgyODYzLCAweDk4QUUsIDB4Mjg2NCwKLSAgICAweDk4QUYsIDB4MTBGMCwgMHg5OEIxLCAweDEwRjEsIDB4OThCMiwgMHgyQUNBLCAweDk4QjMsIDB4MTI2RCwKLSAgICAweDk4QjYsIDB4MTRCNywgMHg5OEI4LCAweDMwM0EsIDB4OThCQSwgMHgxNTVELCAweDk4QkIsIDB4MzE3NywKLSAgICAweDk4QkMsIDB4MTVGNiwgMHg5OEJELCAweDMxNzYsIDB4OThCRSwgMHgzMTc4LCAweDk4QkYsIDB4MzE3NSwKLSAgICAweDk4QzAsIDB4MzMzOCwgMHg5OEMxLCAweDMyNzksIDB4OThDMiwgMHgzMjdBLCAweDk4QzQsIDB4MTY1NywKLSAgICAweDk4QzYsIDB4MzMzNywgMHg5OEM5LCAweDMzMzYsIDB4OThDQiwgMHgzM0Q1LCAweDk4Q0MsIDB4MzUyOSwKLSAgICAweDk4REIsIDB4MDgyRCwgMHg5OERGLCAweDA4MkUsIDB4OThFMiwgMHgwOUY0LCAweDk4RTMsIDB4MUUzMiwKLSAgICAweDk4RTUsIDB4MjBBQywgMHg5OEU3LCAweDBEQjMsIDB4OThFOSwgMHgwREI2LCAweDk4RUEsIDB4MERCNCwKLSAgICAweDk4RUIsIDB4MjM1RSwgMHg5OEVELCAweDBEQjgsIDB4OThFRiwgMHgwREI1LCAweDk4RjIsIDB4MERCNywKLSAgICAweDk4RjQsIDB4MEY3MiwgMHg5OEY2LCAweDI2MDUsIDB4OThGOSwgMHgyNjA2LCAweDk4RkEsIDB4MkFDQywKLSAgICAweDk4RkMsIDB4MEY3MSwgMHg5OEZELCAweDBGNzMsIDB4OThGRSwgMHgwRjc0LCAweDk5MDAsIDB4Mjg2NiwKLSAgICAweDk5MDIsIDB4Mjg2NSwgMHg5OTAzLCAweDEwRjIsIDB4OTkwNSwgMHgxMEYzLCAweDk5MDcsIDB4Mjg2NywKLSAgICAweDk5MDgsIDB4MkFDQiwgMHg5OTA5LCAweDEwRjUsIDB4OTkwQSwgMHgxMjZFLCAweDk5MEMsIDB4MTBGNCwKLSAgICAweDk5MTAsIDB4MTM5QiwgMHg5OTExLCAweDJBQ0QsIDB4OTkxMiwgMHgxMjcwLCAweDk5MTMsIDB4MTI2RiwKLSAgICAweDk5MTQsIDB4MkFDRSwgMHg5OTE1LCAweDJBRDEsIDB4OTkxNiwgMHgyQUNGLCAweDk5MTcsIDB4MkFEMCwKLSAgICAweDk5MTgsIDB4MTI3MSwgMHg5OTFBLCAweDEzQTAsIDB4OTkxQiwgMHgxMzlFLCAweDk5MUUsIDB4MTM5RCwKLSAgICAweDk5MUYsIDB4MkQwMCwgMHg5OTIxLCAweDEzOUYsIDB4OTkyNCwgMHgyQ0ZGLCAweDk5MjUsIDB4MkVDNCwKLSAgICAweDk5MjcsIDB4MkQwMSwgMHg5OTI4LCAweDEzOUMsIDB4OTkyOSwgMHgyRDAyLCAweDk5MkEsIDB4MkVDNywKLSAgICAweDk5MkIsIDB4MkVDNSwgMHg5OTJDLCAweDJFQzYsIDB4OTkyRCwgMHgyRUNCLCAweDk5MkUsIDB4MTU2MSwKLSAgICAweDk5MkYsIDB4MkVDQSwgMHg5OTMwLCAweDJFQ0QsIDB4OTkzMSwgMHgyRUNDLCAweDk5MzIsIDB4MkVDOSwKLSAgICAweDk5MzMsIDB4MkVDOCwgMHg5OTM1LCAweDE0QjgsIDB4OTkzQSwgMHgzMDNELCAweDk5M0MsIDB4MzAzQywKLSAgICAweDk5M0QsIDB4MTU2MCwgMHg5OTNFLCAweDE1NUUsIDB4OTkzRiwgMHgxNTVGLCAweDk5NDEsIDB4MzAzQiwKLSAgICAweDk5NDMsIDB4MzE3QiwgMHg5OTQ1LCAweDE1RjcsIDB4OTk0NywgMHgzMTdBLCAweDk5NDgsIDB4MzE3OSwKLSAgICAweDk5NDksIDB4MTVGOCwgMHg5OTRCLCAweDMyN0YsIDB4OTk0QywgMHgzMjdFLCAweDk5NEUsIDB4MzI3QywKLSAgICAweDk5NTAsIDB4MzI3QiwgMHg5OTUxLCAweDE2NTksIDB4OTk1MiwgMHgxNjU4LCAweDk5NTMsIDB4MzI4MCwKLSAgICAweDk5NTQsIDB4MzNENiwgMHg5OTU1LCAweDE2RTcsIDB4OTk1NiwgMHgzMzNBLCAweDk5NTcsIDB4MTZBNywKLSAgICAweDk5NTgsIDB4MzMzOSwgMHg5OTU5LCAweDMyN0QsIDB4OTk1QiwgMHgzM0Q3LCAweDk5NUMsIDB4MTcxMiwKLSAgICAweDk5NUUsIDB4MTc0RSwgMHg5OTVGLCAweDM0RjMsIDB4OTk2MSwgMHgzNTJBLCAweDk5OTYsIDB4MDgyRiwKLSAgICAweDk5OTcsIDB4MjBBRCwgMHg5OTk4LCAweDJFQ0UsIDB4OTk5OSwgMHgwODMwLCAweDk5OUMsIDB4Mjg2OSwKLSAgICAweDk5OUQsIDB4Mjg2OCwgMHg5OTlFLCAweDJEMDMsIDB4OTlBMSwgMHgyRUQwLCAweDk5QTMsIDB4MkVDRiwKLSAgICAweDk5QTUsIDB4MTU2MiwgMHg5OUE2LCAweDMxN0MsIDB4OTlBNywgMHgzMTdELCAweDk5QTgsIDB4MTY1QSwKLSAgICAweDk5QUIsIDB4MzUyQiwgMHg5OUFDLCAweDA5RjUsIDB4OTlBRCwgMHgwREJBLCAweDk5QUUsIDB4MERCOSwKLSAgICAweDk5QUYsIDB4MjYwNywgMHg5OUIwLCAweDI2MDksIDB4OTlCMSwgMHgwRjc2LCAweDk5QjIsIDB4MjYwOCwKLSAgICAweDk5QjMsIDB4MEY3NSwgMHg5OUI0LCAweDBGNzcsIDB4OTlCNSwgMHgyNjBBLCAweDk5QjksIDB4Mjg2QiwKLSAgICAweDk5QkEsIDB4Mjg2RCwgMHg5OUJCLCAweDI4NkMsIDB4OTlCRCwgMHgyODZGLCAweDk5QzEsIDB4MTBGNiwKLSAgICAweDk5QzIsIDB4Mjg2RSwgMHg5OUMzLCAweDI4NkEsIDB4OTlDNywgMHgyODcwLCAweDk5QzksIDB4MkFEOCwKLSAgICAweDk5Q0IsIDB4MkFEQiwgMHg5OUNDLCAweDJBREQsIDB4OTlDRCwgMHgyQUQzLCAweDk5Q0UsIDB4MkFENywKLSAgICAweDk5Q0YsIDB4MkFENCwgMHg5OUQwLCAweDEyNzMsIDB4OTlEMSwgMHgxMjc2LCAweDk5RDIsIDB4MTI3OCwKLSAgICAweDk5RDMsIDB4MkFENSwgMHg5OUQ0LCAweDJBRDYsIDB4OTlENSwgMHgxMjc3LCAweDk5RDYsIDB4MkFEOSwKLSAgICAweDk5RDcsIDB4MkFEQywgMHg5OUQ4LCAweDJBREEsIDB4OTlEOSwgMHgxMjc5LCAweDk5REIsIDB4MTI3NSwKLSAgICAweDk5REMsIDB4MkFEMiwgMHg5OURELCAweDEyNzIsIDB4OTlERiwgMHgxMjc0LCAweDk5RTIsIDB4MTNBMiwKLSAgICAweDk5RTMsIDB4MkQwOSwgMHg5OUU0LCAweDJEMDcsIDB4OTlFNSwgMHgyRDA2LCAweDk5RTcsIDB4MkQwQywKLSAgICAweDk5RTksIDB4MkQwQiwgMHg5OUVBLCAweDJEMEEsIDB4OTlFQywgMHgyRDA1LCAweDk5RUQsIDB4MTNBMSwKLSAgICAweDk5RUUsIDB4MkQwNCwgMHg5OUYwLCAweDJEMDgsIDB4OTlGMSwgMHgxM0EzLCAweDk5RjQsIDB4MkVEMywKLSAgICAweDk5RjYsIDB4MkVENywgMHg5OUY3LCAweDJFRDQsIDB4OTlGOCwgMHgyRUQ2LCAweDk5RjksIDB4MkVENSwKLSAgICAweDk5RkEsIDB4MkVEMiwgMHg5OUZCLCAweDJFRDgsIDB4OTlGQywgMHgyRURCLCAweDk5RkQsIDB4MkVEOSwKLSAgICAweDk5RkUsIDB4MkVEQSwgMHg5OUZGLCAweDE0QkEsIDB4OUEwMSwgMHgxNEI5LCAweDlBMDIsIDB4MkVEMSwKLSAgICAweDlBMDMsIDB4MkVEQywgMHg5QTA0LCAweDMwNDIsIDB4OUEwNSwgMHgzMDQ1LCAweDlBMDYsIDB4MzA0NywKLSAgICAweDlBMDcsIDB4MzA0NiwgMHg5QTA5LCAweDMwNDAsIDB4OUEwQSwgMHgzMDQ0LCAweDlBMEIsIDB4MzAzRiwKLSAgICAweDlBMEQsIDB4MzA0MSwgMHg5QTBFLCAweDE1NjMsIDB4OUEwRiwgMHgzMDNFLCAweDlBMTEsIDB4MzA0MywKLSAgICAweDlBMTQsIDB4MzE4QSwgMHg5QTE1LCAweDMxN0YsIDB4OUExNiwgMHgxNUY5LCAweDlBMTksIDB4MTVGQSwKLSAgICAweDlBMUEsIDB4MzE3RSwgMHg5QTFCLCAweDMxODMsIDB4OUExQywgMHgzMTg5LCAweDlBMUQsIDB4MzE4MSwKLSAgICAweDlBMUUsIDB4MzE4OCwgMHg5QTIwLCAweDMxODUsIDB4OUEyMiwgMHgzMTg0LCAweDlBMjMsIDB4MzE4NywKLSAgICAweDlBMjQsIDB4MzE4MiwgMHg5QTI1LCAweDMxODAsIDB4OUEyNywgMHgzMTg2LCAweDlBMjksIDB4MzI4NywKLSAgICAweDlBMkEsIDB4MzI4NSwgMHg5QTJCLCAweDE2NUIsIDB4OUEyQywgMHgzMjg0LCAweDlBMkQsIDB4MzI4QSwKLSAgICAweDlBMkUsIDB4MzI4OCwgMHg5QTMwLCAweDE2NUMsIDB4OUEzMSwgMHgzMjgzLCAweDlBMzIsIDB4MzI4MSwKLSAgICAweDlBMzQsIDB4MzI4MiwgMHg5QTM1LCAweDE2NUUsIDB4OUEzNiwgMHgzMjg2LCAweDlBMzcsIDB4MTY1RCwKLSAgICAweDlBMzgsIDB4MzI4OSwgMHg5QTM5LCAweDMzM0IsIDB4OUEzQSwgMHgzMzQxLCAweDlBM0QsIDB4MzMzQywKLSAgICAweDlBM0UsIDB4MTZBQiwgMHg5QTNGLCAweDMzNDIsIDB4OUE0MCwgMHgxNkFBLCAweDlBNDEsIDB4MzM0MCwKLSAgICAweDlBNDIsIDB4MzMzRiwgMHg5QTQzLCAweDE2QTksIDB4OUE0NCwgMHgzMzNFLCAweDlBNDUsIDB4MTZBOCwKLSAgICAweDlBNDYsIDB4MzMzRCwgMHg5QTQ4LCAweDMzREQsIDB4OUE0OSwgMHgzM0RGLCAweDlBNEEsIDB4MzNERSwKLSAgICAweDlBNEMsIDB4MzNEQiwgMHg5QTRELCAweDE2RTksIDB4OUE0RSwgMHgzM0Q4LCAweDlBNEYsIDB4MzNEQywKLSAgICAweDlBNTAsIDB4MzNFMSwgMHg5QTUyLCAweDMzRTAsIDB4OUE1MywgMHgzM0Q5LCAweDlBNTQsIDB4MzNEQSwKLSAgICAweDlBNTUsIDB4MTZFOCwgMHg5QTU2LCAweDM0NEYsIDB4OUE1NywgMHgxNzE1LCAweDlBNTksIDB4MzQ1MCwKLSAgICAweDlBNUEsIDB4MTcxMywgMHg5QTVCLCAweDE3MTQsIDB4OUE1RSwgMHgzNEFFLCAweDlBNUYsIDB4MTczNywKLSAgICAweDlBNjAsIDB4MzUxMCwgMHg5QTYyLCAweDE3NTcsIDB4OUE2NCwgMHgzNTJDLCAweDlBNjUsIDB4MTc1OCwKLSAgICAweDlBNjYsIDB4MzUyRCwgMHg5QTY3LCAweDM1MkUsIDB4OUE2OCwgMHgzNTNDLCAweDlBNjksIDB4MzUzQiwKLSAgICAweDlBNkEsIDB4MTc2NywgMHg5QTZCLCAweDM1NDQsIDB4OUFBOCwgMHgwOUY2LCAweDlBQUIsIDB4MjYwQywKLSAgICAweDlBQUQsIDB4MjYwQiwgMHg5QUFGLCAweDEwRjcsIDB4OUFCMCwgMHgxMEY4LCAweDlBQjEsIDB4Mjg3MSwKLSAgICAweDlBQjMsIDB4MkFERSwgMHg5QUI0LCAweDJEMEYsIDB4OUFCNywgMHgxMjdBLCAweDlBQjgsIDB4MTNBNCwKLSAgICAweDlBQjksIDB4MkQwRCwgMHg5QUJCLCAweDJEMTAsIDB4OUFCQywgMHgxM0E1LCAweDlBQkUsIDB4MkVERCwKLSAgICAweDlBQkYsIDB4MkQwRSwgMHg5QUMwLCAweDMwNDgsIDB4OUFDMSwgMHgxNTY0LCAweDlBQzIsIDB4MzE4QiwKLSAgICAweDlBQzYsIDB4MzI4RCwgMHg5QUM3LCAweDMyOEIsIDB4OUFDQSwgMHgzMjhDLCAweDlBQ0QsIDB4MzM0MywKLSAgICAweDlBQ0YsIDB4MTZBQywgMHg5QUQwLCAweDMzRTIsIDB4OUFEMSwgMHgxNzE4LCAweDlBRDIsIDB4MTZFQSwKLSAgICAweDlBRDMsIDB4MTcxNiwgMHg5QUQ0LCAweDE3MTcsIDB4OUFENSwgMHgzNEFGLCAweDlBRDYsIDB4MTc0RiwKLSAgICAweDlBRDgsIDB4MDlGNywgMHg5QURDLCAweDMwNDksIDB4OUFERiwgMHgxRTMzLCAweDlBRTEsIDB4MEY3OCwKLSAgICAweDlBRTMsIDB4Mjg3MiwgMHg5QUU2LCAweDEwRjksIDB4OUFFNywgMHgyODczLCAweDlBRUIsIDB4MkFFMCwKLSAgICAweDlBRUMsIDB4MkFERiwgMHg5QUVELCAweDEzQTcsIDB4OUFFRSwgMHgxMjdCLCAweDlBRUYsIDB4MTI3QywKLSAgICAweDlBRjEsIDB4MkFFMywgMHg5QUYyLCAweDJBRTIsIDB4OUFGMywgMHgyQUUxLCAweDlBRjYsIDB4MkQxMSwKLSAgICAweDlBRjcsIDB4MkQxNCwgMHg5QUY5LCAweDJEMTMsIDB4OUFGQSwgMHgyRDEyLCAweDlBRkIsIDB4MTNBNiwKLSAgICAweDlBRkMsIDB4MkVFMSwgMHg5QUZELCAweDJFREYsIDB4OUFGRSwgMHgyRURFLCAweDlCMDEsIDB4MkVFMCwKLSAgICAweDlCMDMsIDB4MTU2NSwgMHg5QjA0LCAweDMwNEIsIDB4OUIwNSwgMHgzMDRDLCAweDlCMDYsIDB4MTU2NiwKLSAgICAweDlCMDgsIDB4MzA0QSwgMHg5QjBBLCAweDMxOEQsIDB4OUIwQiwgMHgzMThDLCAweDlCMEMsIDB4MzE4RiwKLSAgICAweDlCMEQsIDB4MTVGQiwgMHg5QjBFLCAweDMxOEUsIDB4OUIxMCwgMHgzMjhFLCAweDlCMTEsIDB4MzI5MCwKLSAgICAweDlCMTIsIDB4MzI4RiwgMHg5QjE1LCAweDMzNDQsIDB4OUIxNiwgMHgzMzQ3LCAweDlCMTcsIDB4MzM0NSwKLSAgICAweDlCMTgsIDB4MzM0NiwgMHg5QjE5LCAweDMzRTMsIDB4OUIxQSwgMHgxNkVCLCAweDlCMUUsIDB4MzQ1MSwKLSAgICAweDlCMUYsIDB4MzQ1MiwgMHg5QjIwLCAweDM0NTMsIDB4OUIyMiwgMHgxNzM4LCAweDlCMjMsIDB4MTc1MCwKLSAgICAweDlCMjQsIDB4MzUyRiwgMHg5QjI1LCAweDA5RjgsIDB4OUIyNywgMHgxMjdELCAweDlCMjgsIDB4MTNBOCwKLSAgICAweDlCMjksIDB4MzA0RCwgMHg5QjJCLCAweDMzRTQsIDB4OUIyRSwgMHgzNTExLCAweDlCMkYsIDB4MUUzNCwKLSAgICAweDlCMzEsIDB4MTc2OCwgMHg5QjMyLCAweDA5RjksIDB4OUIzMywgMHgyRDE1LCAweDlCMzUsIDB4MzA0RSwKLSAgICAweDlCMzcsIDB4MzE5MCwgMHg5QjNBLCAweDMzNDgsIDB4OUIzQiwgMHgzM0U1LCAweDlCM0MsIDB4MDlGQSwKLSAgICAweDlCM0UsIDB4Mjg3NCwgMHg5QjNGLCAweDI4NzUsIDB4OUI0MSwgMHgxMEZBLCAweDlCNDIsIDB4MTBGQiwKLSAgICAweDlCNDMsIDB4MkFFNSwgMHg5QjQ0LCAweDEyN0YsIDB4OUI0NSwgMHgxMjdFLCAweDlCNDYsIDB4MkFFNCwKLSAgICAweDlCNDgsIDB4MkVFMiwgMHg5QjRBLCAweDMwNEYsIDB4OUI0QiwgMHgzMDUxLCAweDlCNEMsIDB4MzA1MCwKLSAgICAweDlCNEQsIDB4MTU2OSwgMHg5QjRFLCAweDE1NjgsIDB4OUI0RiwgMHgxNTY3LCAweDlCNTEsIDB4MTZBRSwKLSAgICAweDlCNTIsIDB4MzM0OSwgMHg5QjU0LCAweDE2QUQsIDB4OUI1NSwgMHgzM0U3LCAweDlCNTYsIDB4MzNFNiwKLSAgICAweDlCNTgsIDB4MTczOSwgMHg5QjU5LCAweDM0QjAsIDB4OUI1QSwgMHgwQkUxLCAweDlCNUIsIDB4MjYwRCwKLSAgICAweDlCNUYsIDB4Mjg3OCwgMHg5QjYwLCAweDI4NzYsIDB4OUI2MSwgMHgyODc3LCAweDlCNjQsIDB4MkFFRSwKLSAgICAweDlCNjYsIDB4MkFFOSwgMHg5QjY3LCAweDJBRTYsIDB4OUI2OCwgMHgyQUVELCAweDlCNkMsIDB4MkFFRiwKLSAgICAweDlCNkYsIDB4MTI4MSwgMHg5QjcwLCAweDJBRUMsIDB4OUI3MSwgMHgyQUU4LCAweDlCNzQsIDB4MkFFNywKLSAgICAweDlCNzUsIDB4MkFFQiwgMHg5Qjc2LCAweDJBRUEsIDB4OUI3NywgMHgxMjgwLCAweDlCN0EsIDB4MkQyMCwKLSAgICAweDlCN0IsIDB4MkQxQiwgMHg5QjdDLCAweDJEMTksIDB4OUI3RCwgMHgyRDIyLCAweDlCN0UsIDB4MkQxQSwKLSAgICAweDlCODAsIDB4MkQxNiwgMHg5QjgyLCAweDJEMUMsIDB4OUI4NSwgMHgyRDE3LCAweDlCODYsIDB4MkVFQiwKLSAgICAweDlCODcsIDB4MkQxOCwgMHg5Qjg4LCAweDJEMjMsIDB4OUI5MCwgMHgyRDFGLCAweDlCOTEsIDB4MTNBOSwKLSAgICAweDlCOTIsIDB4MkQxRSwgMHg5QjkzLCAweDJEMUQsIDB4OUI5NSwgMHgyRDIxLCAweDlCOUEsIDB4MkVFMywKLSAgICAweDlCOUIsIDB4MkVFNiwgMHg5QjlFLCAweDJFRTUsIDB4OUJBMCwgMHgyRUVELCAweDlCQTEsIDB4MkVFOCwKLSAgICAweDlCQTIsIDB4MkVFQywgMHg5QkE0LCAweDJFRUEsIDB4OUJBNSwgMHgyRUU5LCAweDlCQTYsIDB4MkVFNywKLSAgICAweDlCQTgsIDB4MkVFNCwgMHg5QkFBLCAweDE0QkQsIDB4OUJBQiwgMHgxNEJDLCAweDlCQUQsIDB4MTRCRSwKLSAgICAweDlCQUUsIDB4MTRCQiwgMHg5QkFGLCAweDJFRUUsIDB4OUJCNSwgMHgzMDU3LCAweDlCQjYsIDB4MzA1QSwKLSAgICAweDlCQjgsIDB4MzA1OCwgMHg5QkI5LCAweDMwNUMsIDB4OUJCRCwgMHgzMDVELCAweDlCQkYsIDB4MzA1NSwKLSAgICAweDlCQzAsIDB4MTU2RSwgMHg5QkMxLCAweDMwNTYsIDB4OUJDMywgMHgzMDU0LCAweDlCQzQsIDB4MzA1QiwKLSAgICAweDlCQzYsIDB4MzA1MywgMHg5QkM3LCAweDMwNTIsIDB4OUJDOCwgMHgxNTZELCAweDlCQzksIDB4MTU2QiwKLSAgICAweDlCQ0EsIDB4MTU2QSwgMHg5QkQzLCAweDMwNTksIDB4OUJENCwgMHgzMTk5LCAweDlCRDUsIDB4MzE5RiwKLSAgICAweDlCRDYsIDB4MTVGRSwgMHg5QkQ3LCAweDMxOUEsIDB4OUJEOSwgMHgzMTlELCAweDlCREEsIDB4MzFBMSwKLSAgICAweDlCREIsIDB4MTVGRiwgMHg5QkRDLCAweDMxOUMsIDB4OUJERSwgMHgzMTk0LCAweDlCRTAsIDB4MzE5MywKLSAgICAweDlCRTEsIDB4MzFBMCwgMHg5QkUyLCAweDMxOTcsIDB4OUJFNCwgMHgzMTk1LCAweDlCRTUsIDB4MzE5RSwKLSAgICAweDlCRTYsIDB4MzE5NiwgMHg5QkU3LCAweDE1RkQsIDB4OUJFOCwgMHgxNUZDLCAweDlCRUEsIDB4MzE5MSwKLSAgICAweDlCRUIsIDB4MzE5MiwgMHg5QkVDLCAweDMxOUIsIDB4OUJGMCwgMHgzMTk4LCAweDlCRjcsIDB4MzI5MywKLSAgICAweDlCRjgsIDB4MzI5NiwgMHg5QkZELCAweDE1NkMsIDB4OUMwNSwgMHgzMjk0LCAweDlDMDYsIDB4MzI5QSwKLSAgICAweDlDMDcsIDB4MzI5OCwgMHg5QzA4LCAweDMyOTIsIDB4OUMwOSwgMHgzMjlELCAweDlDMEIsIDB4MzI5MSwKLSAgICAweDlDMEQsIDB4MTY2MCwgMHg5QzBFLCAweDMyOTksIDB4OUMxMiwgMHgzMjk1LCAweDlDMTMsIDB4MTY1RiwKLSAgICAweDlDMTQsIDB4MzI5QywgMHg5QzE3LCAweDMyOUIsIDB4OUMxQywgMHgzMzRDLCAweDlDMUQsIDB4MzM0QiwKLSAgICAweDlDMjEsIDB4MzM1MiwgMHg5QzIzLCAweDMzNEUsIDB4OUMyNCwgMHgzMzUxLCAweDlDMjUsIDB4MTZCMCwKLSAgICAweDlDMjgsIDB4MzM0RiwgMHg5QzI5LCAweDMzNTAsIDB4OUMyQiwgMHgzMzRBLCAweDlDMkMsIDB4MzM0RCwKLSAgICAweDlDMkQsIDB4MTZBRiwgMHg5QzMxLCAweDE2RUQsIDB4OUMzMiwgMHgzM0YyLCAweDlDMzMsIDB4MzNFRCwKLSAgICAweDlDMzQsIDB4MzNGMSwgMHg5QzM2LCAweDMzRjQsIDB4OUMzNywgMHgzM0YwLCAweDlDMzksIDB4MzNFQywKLSAgICAweDlDM0IsIDB4MTZFRiwgMHg5QzNDLCAweDMzRUYsIDB4OUMzRCwgMHgzM0YzLCAweDlDM0UsIDB4MTZFRSwKLSAgICAweDlDM0YsIDB4MzNFQSwgMHg5QzQwLCAweDMyOTcsIDB4OUM0MSwgMHgzM0VFLCAweDlDNDQsIDB4MzNFQiwKLSAgICAweDlDNDYsIDB4MzNFOCwgMHg5QzQ4LCAweDMzRTksIDB4OUM0OSwgMHgxNkVDLCAweDlDNEEsIDB4MzQ1NywKLSAgICAweDlDNEIsIDB4MzQ1OSwgMHg5QzRDLCAweDM0NUMsIDB4OUM0RCwgMHgzNDU4LCAweDlDNEUsIDB4MzQ1RCwKLSAgICAweDlDNTAsIDB4MzQ1NiwgMHg5QzUyLCAweDM0NTQsIDB4OUM1NCwgMHgxNzE5LCAweDlDNTUsIDB4MzQ1QSwKLSAgICAweDlDNTYsIDB4MTcxQiwgMHg5QzU3LCAweDE3MUEsIDB4OUM1OCwgMHgzNDU1LCAweDlDNTksIDB4MzQ1QiwKLSAgICAweDlDNUUsIDB4MzRCNSwgMHg5QzVGLCAweDE3M0EsIDB4OUM2MCwgMHgzNEI2LCAweDlDNjIsIDB4MzRCNCwKLSAgICAweDlDNjMsIDB4MzRCMSwgMHg5QzY2LCAweDM0QjMsIDB4OUM2NywgMHgzNEIyLCAweDlDNjgsIDB4MzRGNCwKLSAgICAweDlDNkQsIDB4MzRGNiwgMHg5QzZFLCAweDM0RjUsIDB4OUM3MSwgMHgzNTE0LCAweDlDNzMsIDB4MzUxMywKLSAgICAweDlDNzQsIDB4MzUxMiwgMHg5Qzc1LCAweDM1MTUsIDB4OUM3NywgMHgxNzYwLCAweDlDNzgsIDB4MTc2MSwKLSAgICAweDlDNzksIDB4MzU0MSwgMHg5QzdBLCAweDM1NDUsIDB4OUNFNSwgMHgwQkUyLCAweDlDRTYsIDB4MjM1RiwKLSAgICAweDlDRTcsIDB4MjYxMCwgMHg5Q0U5LCAweDBGNzksIDB4OUNFQSwgMHgyNjBFLCAweDlDRUQsIDB4MjYwRiwKLSAgICAweDlDRjEsIDB4Mjg3OSwgMHg5Q0YyLCAweDI4N0EsIDB4OUNGMywgMHgxMEZFLCAweDlDRjQsIDB4MTBGQywKLSAgICAweDlDRjUsIDB4Mjg3QiwgMHg5Q0Y2LCAweDEwRkQsIDB4OUNGNywgMHgyQUY0LCAweDlDRjksIDB4MkFGNywKLSAgICAweDlDRkEsIDB4MkFGMSwgMHg5Q0ZCLCAweDJBRjgsIDB4OUNGQywgMHgyQUYwLCAweDlDRkQsIDB4MkFGMiwKLSAgICAweDlDRkYsIDB4MkFGMywgMHg5RDAwLCAweDJBRjYsIDB4OUQwMywgMHgxMjg0LCAweDlEMDQsIDB4MkFGQiwKLSAgICAweDlEMDUsIDB4MkFGQSwgMHg5RDA2LCAweDEyODIsIDB4OUQwNywgMHgyQUY1LCAweDlEMDgsIDB4MkFGOSwKLSAgICAweDlEMDksIDB4MTI4MywgMHg5RDEwLCAweDJEMkQsIDB4OUQxMiwgMHgxM0FFLCAweDlEMTQsIDB4MkQyOCwKLSAgICAweDlEMTUsIDB4MTNBQSwgMHg5RDE3LCAweDJEMjUsIDB4OUQxOCwgMHgyRDJCLCAweDlEMTksIDB4MkQyRSwKLSAgICAweDlEMUIsIDB4MTNBRiwgMHg5RDFELCAweDJEMkEsIDB4OUQxRSwgMHgyRDI3LCAweDlEMUYsIDB4MkQyRiwKLSAgICAweDlEMjAsIDB4MkQyNiwgMHg5RDIyLCAweDJEMkMsIDB4OUQyMywgMHgxM0FCLCAweDlEMjUsIDB4MkQyNCwKLSAgICAweDlEMjYsIDB4MTNBQywgMHg5RDI4LCAweDEzQUQsIDB4OUQyOSwgMHgyRDI5LCAweDlEMkQsIDB4MkYwMCwKLSAgICAweDlEMkUsIDB4MkVGMywgMHg5RDJGLCAweDJFRjQsIDB4OUQzMCwgMHgyRUY3LCAweDlEMzEsIDB4MkVGNSwKLSAgICAweDlEMzMsIDB4MkVFRiwgMHg5RDM2LCAweDJFRjIsIDB4OUQzNywgMHgyRUZDLCAweDlEMzgsIDB4MkVGNiwKLSAgICAweDlEM0IsIDB4MTRCRiwgMHg5RDNELCAweDJFRkUsIDB4OUQzRSwgMHgyRUZCLCAweDlEM0YsIDB4MTRDMCwKLSAgICAweDlENDAsIDB4MkVGRCwgMHg5RDQxLCAweDJFRjAsIDB4OUQ0MiwgMHgyRUY5LCAweDlENDMsIDB4MkVGQSwKLSAgICAweDlENDUsIDB4MkVGOCwgMHg5RDRBLCAweDMwNjEsIDB4OUQ0QiwgMHgzMDYzLCAweDlENEMsIDB4MzA2NiwKLSAgICAweDlENEYsIDB4MzA2MCwgMHg5RDUxLCAweDE1NkYsIDB4OUQ1MiwgMHgzMDY4LCAweDlENTMsIDB4MzA1RiwKLSAgICAweDlENTQsIDB4MzA2OSwgMHg5RDU2LCAweDMwNjUsIDB4OUQ1NywgMHgzMDY3LCAweDlENTgsIDB4MzA2QiwKLSAgICAweDlENTksIDB4MzA2NCwgMHg5RDVBLCAweDMwNkMsIDB4OUQ1QiwgMHgzMDYyLCAweDlENUMsIDB4MzA1RSwKLSAgICAweDlENUQsIDB4MTU3MCwgMHg5RDVGLCAweDMwNkEsIDB4OUQ2MCwgMHgxNTcxLCAweDlENjEsIDB4MTYwMSwKLSAgICAweDlENjcsIDB4MkVGMSwgMHg5RDY4LCAweDMxQkIsIDB4OUQ2OSwgMHgzMUIyLCAweDlENkEsIDB4MTYwMywKLSAgICAweDlENkIsIDB4MzFBRSwgMHg5RDZDLCAweDE2MDQsIDB4OUQ2RiwgMHgzMUI3LCAweDlENzAsIDB4MzFCMSwKLSAgICAweDlENzEsIDB4MzFBNywgMHg5RDcyLCAweDE2MDIsIDB4OUQ3MywgMHgzMUI0LCAweDlENzQsIDB4MzFBRiwKLSAgICAweDlENzUsIDB4MzFCMCwgMHg5RDc3LCAweDMxQTIsIDB4OUQ3OCwgMHgzMUE5LCAweDlENzksIDB4MzFCOCwKLSAgICAweDlEN0IsIDB4MzFCNSwgMHg5RDdELCAweDMxQUQsIDB4OUQ3RiwgMHgzMUI5LCAweDlEODAsIDB4MzFBOCwKLSAgICAweDlEODEsIDB4MzFBMywgMHg5RDgyLCAweDMxQjYsIDB4OUQ4NCwgMHgzMUE1LCAweDlEODUsIDB4MzFCMywKLSAgICAweDlEODYsIDB4MzFBQSwgMHg5RDg3LCAweDMxQkEsIDB4OUQ4OCwgMHgzMUE2LCAweDlEODksIDB4MTYwMCwKLSAgICAweDlEOEEsIDB4MzFBNCwgMHg5RDhCLCAweDMxQUIsIDB4OUQ4QywgMHgzMUFDLCAweDlEOTAsIDB4MzJBNCwKLSAgICAweDlEOTIsIDB4MzJBMiwgMHg5RDk0LCAweDMyQTcsIDB4OUQ5NiwgMHgzMkIzLCAweDlEOTcsIDB4MzJBQSwKLSAgICAweDlEOTgsIDB4MzJBMywgMHg5RDk5LCAweDMyOUYsIDB4OUQ5QSwgMHgzMkFDLCAweDlEOUIsIDB4MzJBNSwKLSAgICAweDlEOUMsIDB4MzJBOCwgMHg5RDlELCAweDMyQTEsIDB4OUQ5RSwgMHgzMkFGLCAweDlEOUYsIDB4MzI5RSwKLSAgICAweDlEQTAsIDB4MzJBNiwgMHg5REExLCAweDMyQUIsIDB4OURBMiwgMHgzMkFELCAweDlEQTMsIDB4MzJCMCwKLSAgICAweDlEQTQsIDB4MzJBMCwgMHg5REE2LCAweDMyQjQsIDB4OURBNywgMHgzMkI1LCAweDlEQTgsIDB4MzJBRSwKLSAgICAweDlEQTksIDB4MzJCMiwgMHg5REFBLCAweDMyQTksIDB4OURBQywgMHgzMzYyLCAweDlEQUQsIDB4MzM2NSwKLSAgICAweDlEQUYsIDB4MTZCMSwgMHg5REIxLCAweDMzNjQsIDB4OURCMiwgMHgzMzY5LCAweDlEQjMsIDB4MzM2NywKLSAgICAweDlEQjQsIDB4MTZCMiwgMHg5REI1LCAweDMzNUUsIDB4OURCNiwgMHgzMzU0LCAweDlEQjcsIDB4MzM1MywKLSAgICAweDlEQjgsIDB4MTZCNCwgMHg5REI5LCAweDMzNjAsIDB4OURCQSwgMHgzMzYxLCAweDlEQkIsIDB4MzM1RCwKLSAgICAweDlEQkMsIDB4MzM1NSwgMHg5REJFLCAweDMzNUEsIDB4OURCRiwgMHgzMkIxLCAweDlEQzEsIDB4MzM1NiwKLSAgICAweDlEQzIsIDB4MTZCMywgMHg5REMzLCAweDMzNUMsIDB4OURDNSwgMHgzMzVCLCAweDlEQzcsIDB4MzM1NywKLSAgICAweDlEQzgsIDB4MzM2MywgMHg5RENBLCAweDMzNTgsIDB4OURDQiwgMHgzM0Y5LCAweDlEQ0MsIDB4MzM2NiwKLSAgICAweDlEQ0QsIDB4MzM2OCwgMHg5RENFLCAweDMzNUYsIDB4OURDRiwgMHgzMzU5LCAweDlERDAsIDB4MzNGQSwKLSAgICAweDlERDEsIDB4MzNGQywgMHg5REQyLCAweDMzRjYsIDB4OUREMywgMHgxNkYwLCAweDlERDUsIDB4MzQwMywKLSAgICAweDlERDYsIDB4MzQwMSwgMHg5REQ3LCAweDE2RjEsIDB4OUREOCwgMHgzNDAwLCAweDlERDksIDB4MzNGRiwKLSAgICAweDlEREEsIDB4MzNGOCwgMHg5RERCLCAweDMzRjUsIDB4OUREQywgMHgzM0ZCLCAweDlEREQsIDB4MzQwNCwKLSAgICAweDlEREUsIDB4MzNGNywgMHg5RERGLCAweDMzRkQsIDB4OURFMSwgMHgzNDY2LCAweDlERTIsIDB4MzQ2QiwKLSAgICAweDlERTMsIDB4MzQ2MSwgMHg5REU0LCAweDM0NjQsIDB4OURFNSwgMHgxNzFDLCAweDlERTYsIDB4MzQ2OCwKLSAgICAweDlERTgsIDB4MzQ2RiwgMHg5REU5LCAweDMzRkUsIDB4OURFQiwgMHgzNDYyLCAweDlERUMsIDB4MzQ2QywKLSAgICAweDlERUQsIDB4MzQ3MCwgMHg5REVFLCAweDM0NjcsIDB4OURFRiwgMHgzNDYwLCAweDlERjAsIDB4MzQ2QSwKLSAgICAweDlERjIsIDB4MzQ2OSwgMHg5REYzLCAweDM0NkUsIDB4OURGNCwgMHgzNDZELCAweDlERjUsIDB4MzQwMiwKLSAgICAweDlERjYsIDB4MzQ2NSwgMHg5REY3LCAweDM0NUYsIDB4OURGOCwgMHgzNDYzLCAweDlERjksIDB4MTczQiwKLSAgICAweDlERkEsIDB4MTczQywgMHg5REZCLCAweDM0NUUsIDB4OURGRCwgMHgzNEMxLCAweDlERkUsIDB4MzRCOCwKLSAgICAweDlERkYsIDB4MzRDMCwgMHg5RTAwLCAweDM0QkQsIDB4OUUwMSwgMHgzNEJFLCAweDlFMDIsIDB4MzRCNywKLSAgICAweDlFMDMsIDB4MzRCQSwgMHg5RTA0LCAweDM0QzIsIDB4OUUwNSwgMHgzNEJDLCAweDlFMDYsIDB4MzRCQiwKLSAgICAweDlFMDcsIDB4MzRCOSwgMHg5RTA5LCAweDM0QkYsIDB4OUUwQiwgMHgzNEY3LCAweDlFMEQsIDB4MzRGOCwKLSAgICAweDlFMEYsIDB4MzRGQSwgMHg5RTEwLCAweDM0RjksIDB4OUUxMSwgMHgzNEZDLCAweDlFMTIsIDB4MzRGQiwKLSAgICAweDlFMTMsIDB4MzUxNywgMHg5RTE0LCAweDM1MTYsIDB4OUUxNSwgMHgzNTMwLCAweDlFMTcsIDB4MzUzMSwKLSAgICAweDlFMTksIDB4MzUzRCwgMHg5RTFBLCAweDE3NjUsIDB4OUUxQiwgMHgxNzY5LCAweDlFMUQsIDB4MzU0NiwKLSAgICAweDlFMUUsIDB4MTc2QSwgMHg5RTc1LCAweDBCRTMsIDB4OUU3OSwgMHgxNjYxLCAweDlFN0EsIDB4MzM2QSwKLSAgICAweDlFN0MsIDB4MTczRCwgMHg5RTdELCAweDE3M0UsIDB4OUU3RiwgMHgwQkU0LCAweDlFODAsIDB4MjYxMSwKLSAgICAweDlFODIsIDB4MEY3QSwgMHg5RTgzLCAweDJBRkMsIDB4OUU4NiwgMHgyRDMxLCAweDlFODcsIDB4MkQzMiwKLSAgICAweDlFODgsIDB4MkQzMCwgMHg5RTg5LCAweDJGMDIsIDB4OUU4QSwgMHgyRjAxLCAweDlFOEIsIDB4MTRDMSwKLSAgICAweDlFOEMsIDB4MzA2RSwgMHg5RThELCAweDJGMDMsIDB4OUU4RSwgMHgzMDZELCAweDlFOTEsIDB4MzFCRCwKLSAgICAweDlFOTIsIDB4MTYwNSwgMHg5RTkzLCAweDE2MDcsIDB4OUU5NCwgMHgzMUJDLCAweDlFOTcsIDB4MTYwNiwKLSAgICAweDlFOTksIDB4MzJCNiwgMHg5RTlBLCAweDMyQjgsIDB4OUU5QiwgMHgzMkI3LCAweDlFOUMsIDB4MzM2QiwKLSAgICAweDlFOUQsIDB4MTZCNSwgMHg5RTlGLCAweDE3MUQsIDB4OUVBMCwgMHgzNEMzLCAweDlFQTEsIDB4MzRGRCwKLSAgICAweDlFQTQsIDB4MzU0QSwgMHg5RUE1LCAweDBCRTUsIDB4OUVBNywgMHgyODdDLCAweDlFQTksIDB4MTI4NSwKLSAgICAweDlFQUQsIDB4MkQzNCwgMHg5RUFFLCAweDJEMzMsIDB4OUVCMCwgMHgyRjA0LCAweDlFQjQsIDB4MTYwOCwKLSAgICAweDlFQjUsIDB4MTY2MiwgMHg5RUI2LCAweDM0MDUsIDB4OUVCNywgMHgzNTQyLCAweDlFQkIsIDB4MEJFNiwKLSAgICAweDlFQkMsIDB4MTBGRiwgMHg5RUJFLCAweDEyODYsIDB4OUVDMCwgMHgzMUJFLCAweDlFQzIsIDB4MzQ3MSwKLSAgICAweDlFQzMsIDB4MERCQiwgMHg5RUM4LCAweDJGMDUsIDB4OUVDQywgMHgxNzUxLCAweDlFQ0QsIDB4MERCQywKLSAgICAweDlFQ0UsIDB4MTI4NywgMHg5RUNGLCAweDE0QzIsIDB4OUVEMCwgMHgzNDcyLCAweDlFRDEsIDB4MERCRCwKLSAgICAweDlFRDMsIDB4MkFGRCwgMHg5RUQ0LCAweDEzQjEsIDB4OUVENSwgMHgyRDM1LCAweDlFRDYsIDB4MkQzNiwKLSAgICAweDlFRDgsIDB4MTNCMCwgMHg5RURBLCAweDJGMDYsIDB4OUVEQiwgMHgxNEM2LCAweDlFREMsIDB4MTRDNCwKLSAgICAweDlFREQsIDB4MTRDNSwgMHg5RURFLCAweDE0QzMsIDB4OUVERiwgMHgzMDZGLCAweDlFRTAsIDB4MTU3MiwKLSAgICAweDlFRTQsIDB4MzJCQSwgMHg5RUU1LCAweDMyQjksIDB4OUVFNiwgMHgzMkJDLCAweDlFRTcsIDB4MzJCQiwKLSAgICAweDlFRTgsIDB4MTY2MywgMHg5RUVCLCAweDMzNkMsIDB4OUVFRCwgMHgzMzZFLCAweDlFRUUsIDB4MzM2RCwKLSAgICAweDlFRUYsIDB4MTZCNiwgMHg5RUYwLCAweDM0MDYsIDB4OUVGMiwgMHgzNDczLCAweDlFRjMsIDB4MzQ3NCwKLSAgICAweDlFRjQsIDB4MTcxRSwgMHg5RUY1LCAweDM0RkUsIDB4OUVGNiwgMHgzNTE4LCAweDlFRjcsIDB4MTc2MiwKLSAgICAweDlFRjksIDB4MjM2MCwgMHg5RUZBLCAweDJEMzcsIDB4OUVGQiwgMHgyRjA3LCAweDlFRkMsIDB4MzFCRiwKLSAgICAweDlFRkQsIDB4MjYxMiwgMHg5RUZGLCAweDJGMDgsIDB4OUYwMCwgMHgzMDcxLCAweDlGMDEsIDB4MzA3MCwKLSAgICAweDlGMDYsIDB4MzQ3NSwgMHg5RjA3LCAweDE3M0YsIDB4OUYwOSwgMHgzNEZGLCAweDlGMEEsIDB4MzUxOSwKLSAgICAweDlGMEUsIDB4MEY3QiwgMHg5RjBGLCAweDJBRkUsIDB4OUYxMCwgMHgyQUZGLCAweDlGMTIsIDB4MkQzOCwKLSAgICAweDlGMTMsIDB4MEY3QywgMHg5RjE1LCAweDE1NzMsIDB4OUYxNiwgMHgzMDcyLCAweDlGMTgsIDB4MzM3MCwKLSAgICAweDlGMTksIDB4MTZCNywgMHg5RjFBLCAweDMzNzEsIDB4OUYxQiwgMHgzMzZGLCAweDlGMUMsIDB4MzQ3NiwKLSAgICAweDlGMUUsIDB4MzRDNCwgMHg5RjIwLCAweDBGN0QsIDB4OUYyMiwgMHgyRjBCLCAweDlGMjMsIDB4MkYwQSwKLSAgICAweDlGMjQsIDB4MkYwOSwgMHg5RjI1LCAweDMwNzMsIDB4OUYyOCwgMHgzMDc3LCAweDlGMjksIDB4MzA3NiwKLSAgICAweDlGMkEsIDB4MzA3NSwgMHg5RjJCLCAweDMwNzQsIDB4OUYyQywgMHgxNTc0LCAweDlGMkQsIDB4MzFDMCwKLSAgICAweDlGMkUsIDB4MzJCRSwgMHg5RjJGLCAweDE2NjQsIDB4OUYzMCwgMHgzMkJELCAweDlGMzEsIDB4MzM3MiwKLSAgICAweDlGMzIsIDB4MzQwOSwgMHg5RjMzLCAweDM0MDgsIDB4OUYzNCwgMHgxNkYyLCAweDlGMzUsIDB4MzQwNywKLSAgICAweDlGMzYsIDB4MzQ3OSwgMHg5RjM3LCAweDM0NzgsIDB4OUYzOCwgMHgzNDc3LCAweDlGM0IsIDB4MTEwMCwKLSAgICAweDlGM0QsIDB4MkQzOSwgMHg5RjNFLCAweDE0QzcsIDB4OUY0MCwgMHgzMUMxLCAweDlGNDEsIDB4MzFDMiwKLSAgICAweDlGNDIsIDB4MzQwQSwgMHg5RjQzLCAweDM0N0EsIDB4OUY0NiwgMHgzNEM1LCAweDlGNDcsIDB4MzUwMCwKLSAgICAweDlGNDgsIDB4MzUzMiwgMHg5RjQ5LCAweDM1NEMsIDB4OUY0QSwgMHgxMTAxLCAweDlGNEIsIDB4MTRDOCwKLSAgICAweDlGNEMsIDB4MzA3OCwgMHg5RjRELCAweDMxQzMsIDB4OUY0RSwgMHgzMzczLCAweDlGNEYsIDB4MzQ3QiwKLSAgICAweDlGNTIsIDB4MTI4OSwgMHg5RjU0LCAweDJGMEMsIDB4OUY1NSwgMHgzMDc5LCAweDlGNTYsIDB4MzFDNCwKLSAgICAweDlGNTcsIDB4MzFDNSwgMHg5RjU4LCAweDMxQzYsIDB4OUY1OSwgMHgzMkMzLCAweDlGNUIsIDB4MzJCRiwKLSAgICAweDlGNUMsIDB4MTZCOCwgMHg5RjVELCAweDMyQzIsIDB4OUY1RSwgMHgzMkMxLCAweDlGNUYsIDB4MTY2NSwKLSAgICAweDlGNjAsIDB4MzJDMCwgMHg5RjYxLCAweDE2NjcsIDB4OUY2MywgMHgxNjY2LCAweDlGNjQsIDB4MzM3NSwKLSAgICAweDlGNjUsIDB4MzM3NCwgMHg5RjY2LCAweDE2QjksIDB4OUY2NywgMHgxNkJBLCAweDlGNkEsIDB4MTZGNCwKLSAgICAweDlGNkIsIDB4MzQwQiwgMHg5RjZDLCAweDE2RjMsIDB4OUY2RSwgMHgzNDdFLCAweDlGNkYsIDB4MzQ3RiwKLSAgICAweDlGNzAsIDB4MzQ3RCwgMHg5RjcxLCAweDM0N0MsIDB4OUY3MiwgMHgxNzQxLCAweDlGNzQsIDB4MzRDNiwKLSAgICAweDlGNzUsIDB4MzRDNywgMHg5Rjc2LCAweDM0QzgsIDB4OUY3NywgMHgxNzQwLCAweDlGNzgsIDB4MzUwMSwKLSAgICAweDlGNzksIDB4MzUwNCwgMHg5RjdBLCAweDM1MDMsIDB4OUY3QiwgMHgzNTAyLCAweDlGN0UsIDB4MzU0QiwKLSAgICAweDlGOEQsIDB4MTNCMiwgMHg5RjkwLCAweDE1N0MsIDB4OUY5MSwgMHgzMkM0LCAweDlGOTIsIDB4MzM3NiwKLSAgICAweDlGOTQsIDB4MTZGNSwgMHg5Rjk1LCAweDM0MEMsIDB4OUY5OCwgMHgzNTRELCAweDlGOUMsIDB4MTNCMywKLSAgICAweDlGQTAsIDB4MkYwRCwgMHg5RkEyLCAweDM0MEQsIDB4OUZBNCwgMHgzNTFBLCAweEUwMUYsIDB4MDgzQSwKLSAgICAweEUwMjYsIDB4MDlGRCwgMHhFMDVCLCAweDAzMEQsIDB4RTA2MywgMHgwMTZCLCAweEUwNzMsIDB4MDg2MCwKLSAgICAweEUwRjMsIDB4MEMyMywgMHhFMTJFLCAweDE3RTQsIDB4RTE0OSwgMHgyMTJGLCAweEUxOTEsIDB4MTE1RiwKLSAgICAweEUxQkEsIDB4MEM3OSwgMHhFMUM5LCAweDA0QzMsIDB4RTIyQywgMHgxOEJELCAweEUyMkQsIDB4MENCRCwKLSAgICAweEUyMzAsIDB4MENBNSwgMHhFMjY2LCAweDBDQ0UsIDB4RTJBMywgMHgwRTg0LCAweEUyQkMsIDB4MDEyMCwKLSAgICAweEUyRUYsIDB4MUJBOCwgMHhFMzNBLCAweDEwNTUsIDB4RTM0MCwgMHgyREU4LCAweEUzNEYsIDB4MDEyMSwKLSAgICAweEUzNUEsIDB4MTA2QiwgMHhFMzYzLCAweDEzMjYsIDB4RTM3QywgMHgwNjZCLCAweEUzN0YsIDB4MTMyRSwKLSAgICAweEUzQzUsIDB4MEQzNSwgMHhFM0Q3LCAweDI3QzIsIDB4RTNEQywgMHgyMkFELCAweEU0MTcsIDB4MTM0QywKLSAgICAweEU0NEEsIDB4MDlDRSwgMHhFNDc4LCAweDBCQzcsIDB4RTQ4NSwgMHgzNkU5LCAweEU0QzUsIDB4MTM5MSwKLSAgICAweEU0REEsIDB4MTZBNCwgMHhFNTQ1LCAweDMwNzIsIDB4RTVEMiwgMHgwMTE5LCAweEU1RDMsIDB4MDExQSwKLSAgICAweEU1RDQsIDB4MDExQywgMHhFNUQ1LCAweDAxMUIsIDB4RTVGNCwgMHgyOTdDLCAweEU2QzYsIDB4MUQwNiwKLSAgICAweEU3MjcsIDB4MjlBMSwgMHhFN0QzLCAweDE4MUIsIDB4RTg5MywgMHgyQjI0LCAweEVCNDAsIDB4MkY1MCwKLSAgICAweEVCNDIsIDB4MTcyNSwgMHhFQjQ1LCAweDMyRUQsIDB4RUI2RSwgMHgyQUQ5LCAweEVCODYsIDB4MUMxNCwKLSAgICAweEVCOUUsIDB4MTJFOSwgMHhFQkE5LCAweDJDQUUsIDB4RUJCQSwgMHgxQTY0LCAweEVCQzksIDB4MTQwNCwKLSAgICAweEVCQ0YsIDB4MjMyNCwgMHhFQkQyLCAweDM0NkEsIDB4RUJERSwgMHgyMjkxLCAweEVDMDEsIDB4MTc4NywKLSAgICAweEVDMDIsIDB4MDk1RiwgMHhFQzE1LCAweDFFOTksIDB4RUM1QiwgMHgyNUMxLCAweEVDNUUsIDB4MEQwQywKLSAgICAweEVDQTYsIDB4MDVFNiwgMHhFRDI4LCAweDA3MjgsIDB4RUQ2RSwgMHgyNEI2LCAweEVEN0MsIDB4MTgwNiwKLSAgICAweEVEOUUsIDB4MzUxMSwgMHhFREU3LCAweDBGODIsIDB4RUU1MiwgMHgwNUYyLCAweEVFOTgsIDB4MjQ3RCwKLSAgICAweEY2QjEsIDB4MDFGQSwgMHhGNkIyLCAweDAxRkIsIDB4RjZCMywgMHgwMUZDLCAweEY2QjQsIDB4MDFGRCwKLSAgICAweEY2QjUsIDB4MDFGRSwgMHhGNkI2LCAweDAxRkYsIDB4RjZCNywgMHgwMjAwLCAweEY2QjgsIDB4MDIwMSwKLSAgICAweEY2QjksIDB4MDIwMiwgMHhGNkJBLCAweDAyMDMsIDB4RjZCQiwgMHgwMjA0LCAweEY2QkMsIDB4MDIwNSwKLSAgICAweEY2QkQsIDB4MDIwNiwgMHhGNkJFLCAweDAyMDcsIDB4RjZCRiwgMHgwMjA4LCAweEY2QzAsIDB4MDIwOSwKLSAgICAweEY2QzEsIDB4MDIwQSwgMHhGNkMyLCAweDAyMEIsIDB4RjZDMywgMHgwMjBDLCAweEY2QzQsIDB4MDIwRCwKLSAgICAweEY2QzUsIDB4MDIwRSwgMHhGNkM2LCAweDAyMEYsIDB4RjZDNywgMHgwMjEwLCAweEY2QzgsIDB4MDIxMSwKLSAgICAweEY2QzksIDB4MDIxMiwgMHhGNkNBLCAweDAyMTMsIDB4RjZDQiwgMHgwMjE0LCAweEY2Q0MsIDB4MDIxNSwKLSAgICAweEY2Q0QsIDB4MDIxNiwgMHhGNkNFLCAweDAyMTcsIDB4RjZDRiwgMHgwMjE5LCAweEY2RDAsIDB4MDIxQSwKLSAgICAweEY2RDEsIDB4MDIxQiwgMHhGNkQyLCAweDAyMUMsIDB4RjZEMywgMHgwMjFELCAweEY2RDQsIDB4MDIxRSwKLSAgICAweEY2RDUsIDB4MDIxRiwgMHhGNkQ2LCAweDAyMjAsIDB4RjZENywgMHgwMjIxLCAweEY2RDgsIDB4MDIyMiwKLSAgICAweEY2RDksIDB4MDIyMywgMHhGNkRBLCAweDAyMjQsIDB4RjZEQiwgMHgwMjI1LCAweEY2REMsIDB4MDIyNiwKLSAgICAweEY2REQsIDB4MDIyNywgMHhGNkRFLCAweDAyMjgsIDB4RjZFMCwgMHgwMjJBLCAweEY2RTEsIDB4MDIyQiwKLSAgICAweEY2RTIsIDB4MDIyQywgMHhGNkU0LCAweDAyMkUsIDB4RjZFNiwgMHgwMjMwLCAweEY2RTgsIDB4MzVCMywKLSAgICAweEY2RTksIDB4MzVCNCwgMHhGNkVBLCAweDM1QjUsIDB4RjZFQiwgMHgzNUI2LCAweEY2RUMsIDB4MzVCNywKLSAgICAweEY2RUQsIDB4MzVCOCwgMHhGNkYwLCAweDM1QkEsIDB4RjZGMSwgMHgzNUJCLCAweEY2RjIsIDB4MzVCQywKLSAgICAweEY2RjMsIDB4MzVCRCwgMHhGNkY0LCAweDM1QkUsIDB4RjZGNSwgMHgzNUJGLCAweEY2RjYsIDB4MzVDMCwKLSAgICAweEY2RjcsIDB4MzVDMSwgMHhGNkY4LCAweDM1QzIsIDB4RjZGOSwgMHgzNUMzLCAweEY2RkEsIDB4MzVDNCwKLSAgICAweEY2RkIsIDB4MzVDNSwgMHhGNkZDLCAweDM1QzYsIDB4RjZGRCwgMHgzNUM3LCAweEY2RkUsIDB4MzVDOCwKLSAgICAweEY2RkYsIDB4MzVDOSwgMHhGNzAwLCAweDM1Q0EsIDB4RjcwMSwgMHgzNUNCLCAweEY3MDIsIDB4MzVDQywKLSAgICAweEY3MDMsIDB4MzVDRCwgMHhGNzA0LCAweDM1Q0UsIDB4RjcwNSwgMHgzNUNGLCAweEY3MDYsIDB4MzVEMCwKLSAgICAweEY3MDcsIDB4MzVEMSwgMHhGNzA4LCAweDM1RDIsIDB4RjcwOSwgMHgzNUQzLCAweEY3MEEsIDB4MzVENCwKLSAgICAweEY3MEIsIDB4MzVENSwgMHhGNzBDLCAweDM1RDYsIDB4RjcwRCwgMHgzNUQ3LCAweEY3MEUsIDB4MzVEOCwKLSAgICAweEY3MEYsIDB4MzVEOSwgMHhGNzEwLCAweDM1REEsIDB4RjcxMSwgMHgzNURCLCAweEY3MTIsIDB4MzVEQywKLSAgICAweEY3MTMsIDB4MzVERCwgMHhGNzE0LCAweDM1REUsIDB4RjcxNSwgMHgzNURGLCAweEY3MTYsIDB4MzVFMCwKLSAgICAweEY3MTcsIDB4MzVFMSwgMHhGNzE4LCAweDM1RTIsIDB4RjcxOSwgMHgzNUUzLCAweEY3MUEsIDB4MzVFNCwKLSAgICAweEY3MUIsIDB4MzVFNSwgMHhGNzFDLCAweDM1RTYsIDB4RjcxRCwgMHgzNUU3LCAweEY3MUUsIDB4MzVFOCwKLSAgICAweEY3MUYsIDB4MzVFOSwgMHhGNzIwLCAweDM1RUEsIDB4RjcyMSwgMHgzNUVCLCAweEY3MjIsIDB4MzVFQywKLSAgICAweEY3MjMsIDB4MzVFRCwgMHhGNzI0LCAweDM1RUUsIDB4RjcyNSwgMHgzNUVGLCAweEY3MjYsIDB4MzVGMCwKLSAgICAweEY3MjcsIDB4MzVGMSwgMHhGNzI4LCAweDM1RjIsIDB4RjcyOSwgMHgzNUYzLCAweEY3MkEsIDB4MzVGNCwKLSAgICAweEY3MkIsIDB4MzVGNSwgMHhGNzJDLCAweDM1RjYsIDB4RjcyRCwgMHgzNUY3LCAweEY3MkUsIDB4MzVGOCwKLSAgICAweEY3MkYsIDB4MzVGOSwgMHhGNzMwLCAweDM1RkEsIDB4RjczMSwgMHgzNUZCLCAweEY3MzIsIDB4MzVGQywKLSAgICAweEY3MzMsIDB4MzVGRCwgMHhGNzM0LCAweDM1RkUsIDB4RjczNSwgMHgzNUZGLCAweEY3MzYsIDB4MzYwMCwKLSAgICAweEY3MzcsIDB4MzYwMSwgMHhGNzM4LCAweDM2MDIsIDB4RjczOSwgMHgzNjAzLCAweEY3M0EsIDB4MzYwNCwKLSAgICAweEY3M0IsIDB4MzYwNSwgMHhGNzNDLCAweDM2MDYsIDB4RjczRCwgMHgzNjA3LCAweEY3M0UsIDB4MzYwOCwKLSAgICAweEY3M0YsIDB4MzYwOSwgMHhGNzQwLCAweDM2MEEsIDB4Rjc0MSwgMHgzNjBCLCAweEY3NDIsIDB4MzYwQywKLSAgICAweEY3NDMsIDB4MzYwRCwgMHhGNzQ0LCAweDM2MEUsIDB4Rjc0NSwgMHgzNjBGLCAweEY3NDYsIDB4MzYxMCwKLSAgICAweEY3NDcsIDB4MzYxMSwgMHhGNzQ4LCAweDM2MTIsIDB4Rjc0OSwgMHgzNjEzLCAweEY3NEEsIDB4MzYxNCwKLSAgICAweEY3NEIsIDB4MzYxNSwgMHhGNzRDLCAweDM2MTYsIDB4Rjc0RCwgMHgzNjE3LCAweEY3NEUsIDB4MzYxOCwKLSAgICAweEY3NEYsIDB4MzYxOSwgMHhGNzUwLCAweDM2MUEsIDB4Rjc1MSwgMHgzNjFCLCAweEY3NTIsIDB4MzYxQywKLSAgICAweEY3NTMsIDB4MzYxRCwgMHhGNzU0LCAweDM2MUUsIDB4Rjc1NSwgMHgzNjFGLCAweEY3NTYsIDB4MzYyMCwKLSAgICAweEY3NTcsIDB4MzYyMSwgMHhGNzU4LCAweDM2MjIsIDB4Rjc1OSwgMHgzNjIzLCAweEY3NUEsIDB4MzYyNCwKLSAgICAweEY3NUIsIDB4MzYyNSwgMHhGNzVDLCAweDM2MjYsIDB4Rjc1RCwgMHgzNjI3LCAweEY3NUUsIDB4MzYyOCwKLSAgICAweEY3NUYsIDB4MzYyOSwgMHhGNzYwLCAweDM2MkEsIDB4Rjc2MSwgMHgzNjJCLCAweEY3NjIsIDB4MzYyQywKLSAgICAweEY3NjMsIDB4MzYyRCwgMHhGNzY0LCAweDM2MkUsIDB4Rjc2NSwgMHgzNjJGLCAweEY3NjYsIDB4MzYzMCwKLSAgICAweEY3NjcsIDB4MzYzMSwgMHhGNzY4LCAweDM2MzIsIDB4Rjc2OSwgMHgzNjMzLCAweEY3NkEsIDB4MzYzNCwKLSAgICAweEY3NkIsIDB4MzYzNSwgMHhGNzZDLCAweDM2MzYsIDB4Rjc2RCwgMHgzNjM3LCAweEY3NkUsIDB4MzYzOCwKLSAgICAweEY3NkYsIDB4MzYzOSwgMHhGNzcwLCAweDM2M0EsIDB4Rjc3MSwgMHgzNjNCLCAweEY3NzIsIDB4MzYzQywKLSAgICAweEY3NzMsIDB4MzYzRCwgMHhGNzc0LCAweDM2M0UsIDB4Rjc3NSwgMHgzNjNGLCAweEY3NzYsIDB4MzY0MCwKLSAgICAweEY3NzcsIDB4MzY0MSwgMHhGNzc4LCAweDM2NDIsIDB4Rjc3OSwgMHgzNjQzLCAweEY3N0EsIDB4MzY0NCwKLSAgICAweEY3N0IsIDB4MzY0NSwgMHhGNzdDLCAweDM2NDYsIDB4Rjc3RCwgMHgzNjQ3LCAweEY3N0UsIDB4MzY0OCwKLSAgICAweEY3N0YsIDB4MzY0OSwgMHhGNzgwLCAweDM2NEEsIDB4Rjc4MSwgMHgzNjRCLCAweEY3ODIsIDB4MzY0QywKLSAgICAweEY3ODMsIDB4MzY0RCwgMHhGNzg0LCAweDM2NEUsIDB4Rjc4NSwgMHgzNjRGLCAweEY3ODYsIDB4MzY1MCwKLSAgICAweEY3ODcsIDB4MzY1MSwgMHhGNzg4LCAweDM2NTIsIDB4Rjc4OSwgMHgzNjUzLCAweEY3OEEsIDB4MzY1NCwKLSAgICAweEY3OEIsIDB4MzY1NSwgMHhGNzhDLCAweDM2NTYsIDB4Rjc4RCwgMHgzNjU3LCAweEY3OEUsIDB4MzY1OCwKLSAgICAweEY3OEYsIDB4MzY1OSwgMHhGNzkwLCAweDM2NUEsIDB4Rjc5MSwgMHgzNjVCLCAweEY3OTIsIDB4MzY1QywKLSAgICAweEY3OTMsIDB4MzY1RCwgMHhGNzk0LCAweDM2NUUsIDB4Rjc5NSwgMHgzNjVGLCAweEY3OTYsIDB4MzY2MCwKLSAgICAweEY3OTcsIDB4MzY2MSwgMHhGNzk4LCAweDM2NjIsIDB4Rjc5OSwgMHgzNjYzLCAweEY3OUEsIDB4MzY2NCwKLSAgICAweEY3OUIsIDB4MzY2NSwgMHhGNzlDLCAweDM2NjYsIDB4Rjc5RCwgMHgzNjY3LCAweEY3OUUsIDB4MzY2OCwKLSAgICAweEY3OUYsIDB4MzY2OSwgMHhGN0EwLCAweDM2NkEsIDB4RjdBMSwgMHgzNjZCLCAweEY3QTIsIDB4MzY2QywKLSAgICAweEY3QTMsIDB4MzY2RCwgMHhGN0E0LCAweDM2NkUsIDB4RjdBNSwgMHgzNjZGLCAweEY3QTYsIDB4MzY3MCwKLSAgICAweEY3QTcsIDB4MzY3MSwgMHhGN0E4LCAweDM2NzIsIDB4RjdBOSwgMHgzNjczLCAweEY3QUEsIDB4MzY3NCwKLSAgICAweEY3QUIsIDB4MzY3NSwgMHhGN0FDLCAweDM2NzYsIDB4RjdBRCwgMHgzNjc3LCAweEY3QUUsIDB4MzY3OCwKLSAgICAweEY3QUYsIDB4MzY3OSwgMHhGN0IwLCAweDM2N0EsIDB4RjdCMSwgMHgzNjdCLCAweEY3QjIsIDB4MzY3QywKLSAgICAweEY3QjMsIDB4MzY3RCwgMHhGN0I0LCAweDM2N0UsIDB4RjdCNSwgMHgzNjdGLCAweEY3QjYsIDB4MzY4MCwKLSAgICAweEY3QjcsIDB4MzY4MSwgMHhGN0I4LCAweDM2ODIsIDB4RjdCOSwgMHgzNjgzLCAweEY3QkEsIDB4MzY4NCwKLSAgICAweEY3QkIsIDB4MzY4NSwgMHhGN0JDLCAweDM2ODYsIDB4RjdCRCwgMHgzNjg3LCAweEY3QkUsIDB4MzY4OCwKLSAgICAweEY3QkYsIDB4MzY4OSwgMHhGN0MwLCAweDM2OEEsIDB4RjdDMSwgMHgzNjhCLCAweEY3QzIsIDB4MzY4QywKLSAgICAweEY3QzMsIDB4MzY4RCwgMHhGN0M0LCAweDM2OEUsIDB4RjdDNSwgMHgzNjhGLCAweEY3QzYsIDB4MzY5MCwKLSAgICAweEY3QzcsIDB4MzY5MSwgMHhGN0M4LCAweDM2OTIsIDB4RjdDOSwgMHgzNjkzLCAweEY3Q0EsIDB4MzY5NCwKLSAgICAweEY3Q0IsIDB4MzY5NSwgMHhGN0NDLCAweDM2OTYsIDB4RjdDRCwgMHgzNjk3LCAweEY3Q0UsIDB4MzY5OCwKLSAgICAweEY3Q0YsIDB4MzY5OSwgMHhGN0QwLCAweDM2OUEsIDB4RjdEMSwgMHgzNjlCLCAweEY3RDIsIDB4MzY5QywKLSAgICAweEY3RDMsIDB4MzY5RCwgMHhGN0Q0LCAweDM2OUUsIDB4RjdENSwgMHgzNjlGLCAweEY3RDYsIDB4MzZBMCwKLSAgICAweEY3RDcsIDB4MzZBMSwgMHhGN0Q4LCAweDM2QTIsIDB4RjdEOSwgMHgzNkEzLCAweEY3REEsIDB4MzZBNCwKLSAgICAweEY3REIsIDB4MzZBNSwgMHhGN0RDLCAweDM2QTYsIDB4RjdERCwgMHgzNkE3LCAweEY3REUsIDB4MzZBOCwKLSAgICAweEY3REYsIDB4MzZBOSwgMHhGN0UwLCAweDM2QUEsIDB4RjdFMSwgMHgzNkFCLCAweEY3RTIsIDB4MzZBQywKLSAgICAweEY3RTMsIDB4MzZBRCwgMHhGN0U0LCAweDM2QUUsIDB4RjdFNSwgMHgzNkFGLCAweEY3RTYsIDB4MzZCMCwKLSAgICAweEY3RTcsIDB4MzZCMSwgMHhGN0U4LCAweDM2QjIsIDB4RjdFOSwgMHgzNkIzLCAweEY3RUEsIDB4MzZCNCwKLSAgICAweEY3RUIsIDB4MzZCNSwgMHhGN0VDLCAweDM2QjYsIDB4RjdFRCwgMHgzNkI3LCAweEY3RUUsIDB4MzZCOCwKLSAgICAweEY4MTcsIDB4MzZFMSwgMHhGODE4LCAweDM2RTIsIDB4RjgxOSwgMHgzNkUzLCAweEY4MUEsIDB4MzZFNCwKLSAgICAweEY4MUIsIDB4MzZFNSwgMHhGODFDLCAweDM2RTYsIDB4RjgxRCwgMHgzNkU3LCAweEZBMEMsIDB4MDI3NCwKLSAgICAweEZBMEQsIDB4MjM4MSwgMHhGRTMwLCAweDAwNkQsIDB4RkUzMSwgMHgwMDdBLCAweEZFMzMsIDB4MzVBRiwKLSAgICAweEZFMzQsIDB4MzVCMSwgMHhGRTM1LCAweDAwODIsIDB4RkUzNiwgMHgwMDgzLCAweEZFMzcsIDB4MDA4NiwKLSAgICAweEZFMzgsIDB4MDA4NywgMHhGRTM5LCAweDAwOEEsIDB4RkUzQSwgMHgwMDhCLCAweEZFM0IsIDB4MDA4RSwKLSAgICAweEZFM0MsIDB4MDA4RiwgMHhGRTNELCAweDAwOTIsIDB4RkUzRSwgMHgwMDkzLCAweEZFM0YsIDB4MDA5NiwKLSAgICAweEZFNDAsIDB4MDA5NywgMHhGRTQxLCAweDAwOUEsIDB4RkU0MiwgMHgwMDlCLCAweEZFNDMsIDB4MDA5RSwKLSAgICAweEZFNDQsIDB4MDA5RiwgMHhGRTQ5LCAweDAwQzcsIDB4RkU0QSwgMHgwMEM4LCAweEZFNEIsIDB4MDBDQiwKLSAgICAweEZFNEMsIDB4MDBDQywgMHhGRTRELCAweDAwQzksIDB4RkU0RSwgMHgwMENBLCAweEZFNEYsIDB4MzVCMiwKLSAgICAweEZFNTAsIDB4MDA3MCwgMHhGRTUxLCAweDAwNzEsIDB4RkU1MiwgMHgwMDcyLCAweEZFNTQsIDB4MDA3NCwKLSAgICAweEZFNTUsIDB4MDA3NSwgMHhGRTU2LCAweDAwNzYsIDB4RkU1NywgMHgwMDc3LCAweEZFNTksIDB4MDBBMCwKLSAgICAweEZFNUEsIDB4MDBBMSwgMHhGRTVCLCAweDAwQTIsIDB4RkU1QywgMHgwMEEzLCAweEZFNUQsIDB4MDBBNCwKLSAgICAweEZFNUUsIDB4MDBBNSwgMHhGRTVGLCAweDAwQ0QsIDB4RkU2MCwgMHgwMENFLCAweEZFNjEsIDB4MDBDRiwKLSAgICAweEZFNjIsIDB4MDBERiwgMHhGRTYzLCAweDAwRTAsIDB4RkU2NCwgMHgwMEUxLCAweEZFNjUsIDB4MDBFMiwKLSAgICAweEZFNjYsIDB4MDBFMywgMHhGRTY4LCAweDAxMDIsIDB4RkU2OSwgMHgwMTBDLCAweEZFNkEsIDB4MDEwRCwKLSAgICAweEZFNkIsIDB4MDEwRSwgMHhGRjAxLCAweDAwNkMsIDB4RkYwMiwgMHgzNkU0LCAweEZGMDMsIDB4MDBBRSwKLSAgICAweEZGMDQsIDB4MDEwMywgMHhGRjA1LCAweDAxMDgsIDB4RkYwNiwgMHgwMEFGLCAweEZGMDcsIDB4MzZFMywKLSAgICAweEZGMDgsIDB4MDA4MCwgMHhGRjA5LCAweDAwODEsIDB4RkYwQSwgMHgwMEIwLCAweEZGMEIsIDB4MDBEMCwKLSAgICAweEZGMEMsIDB4MDA2NCwgMHhGRjBELCAweDAwRDEsIDB4RkYwRSwgMHgwMDY3LCAweEZGMEYsIDB4MDEwMSwKLSAgICAweEZGMTAsIDB4MDE0RCwgMHhGRjExLCAweDAxNEUsIDB4RkYxMiwgMHgwMTRGLCAweEZGMTMsIDB4MDE1MCwKLSAgICAweEZGMTQsIDB4MDE1MSwgMHhGRjE1LCAweDAxNTIsIDB4RkYxNiwgMHgwMTUzLCAweEZGMTcsIDB4MDE1NCwKLSAgICAweEZGMTgsIDB4MDE1NSwgMHhGRjE5LCAweDAxNTYsIDB4RkYxQSwgMHgwMDZBLCAweEZGMUIsIDB4MDA2OSwKLSAgICAweEZGMUMsIDB4MDBENiwgMHhGRjFELCAweDAwRDgsIDB4RkYxRSwgMHgwMEQ3LCAweEZGMUYsIDB4MDA2QiwKLSAgICAweEZGMjAsIDB4MDEwOSwgMHhGRjIxLCAweDAxNkQsIDB4RkYyMiwgMHgwMTZFLCAweEZGMjMsIDB4MDE2RiwKLSAgICAweEZGMjQsIDB4MDE3MCwgMHhGRjI1LCAweDAxNzEsIDB4RkYyNiwgMHgwMTcyLCAweEZGMjcsIDB4MDE3MywKLSAgICAweEZGMjgsIDB4MDE3NCwgMHhGRjI5LCAweDAxNzUsIDB4RkYyQSwgMHgwMTc2LCAweEZGMkIsIDB4MDE3NywKLSAgICAweEZGMkMsIDB4MDE3OCwgMHhGRjJELCAweDAxNzksIDB4RkYyRSwgMHgwMTdBLCAweEZGMkYsIDB4MDE3QiwKLSAgICAweEZGMzAsIDB4MDE3QywgMHhGRjMxLCAweDAxN0QsIDB4RkYzMiwgMHgwMTdFLCAweEZGMzMsIDB4MDE3RiwKLSAgICAweEZGMzQsIDB4MDE4MCwgMHhGRjM1LCAweDAxODEsIDB4RkYzNiwgMHgwMTgyLCAweEZGMzcsIDB4MDE4MywKLSAgICAweEZGMzgsIDB4MDE4NCwgMHhGRjM5LCAweDAxODUsIDB4RkYzQSwgMHgwMTg2LCAweEZGM0IsIDB4MzVCRSwKLSAgICAweEZGM0MsIDB4MDEwMiwgMHhGRjNELCAweDM1QkYsIDB4RkYzRSwgMHgzNUI0LCAweEZGM0YsIDB4MDBDNSwKLSAgICAweEZGNDEsIDB4MDE4NywgMHhGRjQyLCAweDAxODgsIDB4RkY0MywgMHgwMTg5LCAweEZGNDQsIDB4MDE4QSwKLSAgICAweEZGNDUsIDB4MDE4QiwgMHhGRjQ2LCAweDAxOEMsIDB4RkY0NywgMHgwMThELCAweEZGNDgsIDB4MDE4RSwKLSAgICAweEZGNDksIDB4MDE4RiwgMHhGRjRBLCAweDAxOTAsIDB4RkY0QiwgMHgwMTkxLCAweEZGNEMsIDB4MDE5MiwKLSAgICAweEZGNEQsIDB4MDE5MywgMHhGRjRFLCAweDAxOTQsIDB4RkY0RiwgMHgwMTk1LCAweEZGNTAsIDB4MDE5NiwKLSAgICAweEZGNTEsIDB4MDE5NywgMHhGRjUyLCAweDAxOTgsIDB4RkY1MywgMHgwMTk5LCAweEZGNTQsIDB4MDE5QSwKLSAgICAweEZGNTUsIDB4MDE5QiwgMHhGRjU2LCAweDAxOUMsIDB4RkY1NywgMHgwMTlELCAweEZGNTgsIDB4MDE5RSwKLSAgICAweEZGNTksIDB4MDE5RiwgMHhGRjVBLCAweDAxQTAsIDB4RkY1QiwgMHgwMDg0LCAweEZGNUMsIDB4MDA3OCwKLSAgICAweEZGNUQsIDB4MDA4NSwgMHhGRjVFLCAweDAwRTQsIDB4RkY2NCwgMHgwMDcxLCAweEZGRTAsIDB4MDEwNiwKLSAgICAweEZGRTEsIDB4MDEwNywgMHhGRkUyLCAweDM2RTEsIDB4RkZFMywgMHgwMEM0LCAweEZGRTQsIDB4MzZFMiwKLSAgICAweEZGRTUsIDB4MDEwNCwKKyAgICAweDAwMjAsIDB4MDAwMSwgMHgwMDIxLCAweDAwMDIsIDB4MDAyMiwgMHgwMDAzLCAweDAwMjMsIDB4MDAwNCwgMHgwMDI0LAorICAgIDB4MDAwNSwgMHgwMDI1LCAweDAwMDYsIDB4MDAyNiwgMHgwMDA3LCAweDAwMjcsIDB4MDAwOCwgMHgwMDI4LCAweDAwMDksCisgICAgMHgwMDI5LCAweDAwMEEsIDB4MDAyQSwgMHgwMDBCLCAweDAwMkIsIDB4MDAwQywgMHgwMDJDLCAweDAwMEQsIDB4MDAyRCwKKyAgICAweDAwMEUsIDB4MDAyRSwgMHgwMDBGLCAweDAwMkYsIDB4MDAxMCwgMHgwMDMwLCAweDAwMTEsIDB4MDAzMSwgMHgwMDEyLAorICAgIDB4MDAzMiwgMHgwMDEzLCAweDAwMzMsIDB4MDAxNCwgMHgwMDM0LCAweDAwMTUsIDB4MDAzNSwgMHgwMDE2LCAweDAwMzYsCisgICAgMHgwMDE3LCAweDAwMzcsIDB4MDAxOCwgMHgwMDM4LCAweDAwMTksIDB4MDAzOSwgMHgwMDFBLCAweDAwM0EsIDB4MDAxQiwKKyAgICAweDAwM0IsIDB4MDAxQywgMHgwMDNDLCAweDAwMUQsIDB4MDAzRCwgMHgwMDFFLCAweDAwM0UsIDB4MDAxRiwgMHgwMDNGLAorICAgIDB4MDAyMCwgMHgwMDQwLCAweDAwMjEsIDB4MDA0MSwgMHgwMDIyLCAweDAwNDIsIDB4MDAyMywgMHgwMDQzLCAweDAwMjQsCisgICAgMHgwMDQ0LCAweDAwMjUsIDB4MDA0NSwgMHgwMDI2LCAweDAwNDYsIDB4MDAyNywgMHgwMDQ3LCAweDAwMjgsIDB4MDA0OCwKKyAgICAweDAwMjksIDB4MDA0OSwgMHgwMDJBLCAweDAwNEEsIDB4MDAyQiwgMHgwMDRCLCAweDAwMkMsIDB4MDA0QywgMHgwMDJELAorICAgIDB4MDA0RCwgMHgwMDJFLCAweDAwNEUsIDB4MDAyRiwgMHgwMDRGLCAweDAwMzAsIDB4MDA1MCwgMHgwMDMxLCAweDAwNTEsCisgICAgMHgwMDMyLCAweDAwNTIsIDB4MDAzMywgMHgwMDUzLCAweDAwMzQsIDB4MDA1NCwgMHgwMDM1LCAweDAwNTUsIDB4MDAzNiwKKyAgICAweDAwNTYsIDB4MDAzNywgMHgwMDU3LCAweDAwMzgsIDB4MDA1OCwgMHgwMDM5LCAweDAwNTksIDB4MDAzQSwgMHgwMDVBLAorICAgIDB4MDAzQiwgMHgwMDVCLCAweDAwM0MsIDB4MDA1QywgMHgwMDNELCAweDAwNUQsIDB4MDAzRSwgMHgwMDVFLCAweDAwM0YsCisgICAgMHgwMDVGLCAweDAwNDAsIDB4MDA2MCwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MiwgMHgwMDYyLCAweDAwNDMsIDB4MDA2MywKKyAgICAweDAwNDQsIDB4MDA2NCwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NiwgMHgwMDY2LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ4LAorICAgIDB4MDA2OCwgMHgwMDQ5LCAweDAwNjksIDB4MDA0QSwgMHgwMDZBLCAweDAwNEIsIDB4MDA2QiwgMHgwMDRDLCAweDAwNkMsCisgICAgMHgwMDRELCAweDAwNkQsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEYsIDB4MDA2RiwgMHgwMDUwLCAweDAwNzAsIDB4MDA1MSwKKyAgICAweDAwNzEsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTMsIDB4MDA3MywgMHgwMDU0LCAweDAwNzQsIDB4MDA1NSwgMHgwMDc1LAorICAgIDB4MDA1NiwgMHgwMDc2LCAweDAwNTcsIDB4MDA3NywgMHgwMDU4LCAweDAwNzgsIDB4MDA1OSwgMHgwMDc5LCAweDAwNUEsCisgICAgMHgwMDdBLCAweDAwNUIsIDB4MDA3QiwgMHgwMDVDLCAweDAwN0MsIDB4MDA1RCwgMHgwMDdELCAweDAwNUUsIDB4MDA3RSwKKyAgICAweDAwNUYsIDB4MDBBMiwgMHgwMTA2LCAweDAwQTMsIDB4MDEwNywgMHgwMEE1LCAweDAxMDQsIDB4MDBBNywgMHgwMEIyLAorICAgIDB4MDBBOCwgMHgzNUIzLCAweDAwQUMsIDB4MzZFMSwgMHgwMEFGLCAweDAwQzMsIDB4MDBCMCwgMHgwMTE4LCAweDAwQjEsCisgICAgMHgwMEQ0LCAweDAwQjcsIDB4MDA3MywgMHgwMEQ3LCAweDAwRDIsIDB4MDBGNywgMHgwMEQzLCAweDAyQzYsIDB4MzVCNCwKKyAgICAweDAyQzcsIDB4MDFGOCwgMHgwMkNBLCAweDAxRjcsIDB4MDJDQiwgMHgwMUY5LCAweDAyQ0QsIDB4MDBDNiwgMHgwMkQ5LAorICAgIDB4MDFGNiwgMHgwMzA4LCAweDM1QjMsIDB4MDM5MSwgMHgwMUExLCAweDAzOTIsIDB4MDFBMiwgMHgwMzkzLCAweDAxQTMsCisgICAgMHgwMzk0LCAweDAxQTQsIDB4MDM5NSwgMHgwMUE1LCAweDAzOTYsIDB4MDFBNiwgMHgwMzk3LCAweDAxQTcsIDB4MDM5OCwKKyAgICAweDAxQTgsIDB4MDM5OSwgMHgwMUE5LCAweDAzOUEsIDB4MDFBQSwgMHgwMzlCLCAweDAxQUIsIDB4MDM5QywgMHgwMUFDLAorICAgIDB4MDM5RCwgMHgwMUFELCAweDAzOUUsIDB4MDFBRSwgMHgwMzlGLCAweDAxQUYsIDB4MDNBMCwgMHgwMUIwLCAweDAzQTEsCisgICAgMHgwMUIxLCAweDAzQTMsIDB4MDFCMiwgMHgwM0E0LCAweDAxQjMsIDB4MDNBNSwgMHgwMUI0LCAweDAzQTYsIDB4MDFCNSwKKyAgICAweDAzQTcsIDB4MDFCNiwgMHgwM0E4LCAweDAxQjcsIDB4MDNBOSwgMHgwMUI4LCAweDAzQjEsIDB4MDFCOSwgMHgwM0IyLAorICAgIDB4MDFCQSwgMHgwM0IzLCAweDAxQkIsIDB4MDNCNCwgMHgwMUJDLCAweDAzQjUsIDB4MDFCRCwgMHgwM0I2LCAweDAxQkUsCisgICAgMHgwM0I3LCAweDAxQkYsIDB4MDNCOCwgMHgwMUMwLCAweDAzQjksIDB4MDFDMSwgMHgwM0JBLCAweDAxQzIsIDB4MDNCQiwKKyAgICAweDAxQzMsIDB4MDNCQywgMHgwMUM0LCAweDAzQkQsIDB4MDFDNSwgMHgwM0JFLCAweDAxQzYsIDB4MDNCRiwgMHgwMUM3LAorICAgIDB4MDNDMCwgMHgwMUM4LCAweDAzQzEsIDB4MDFDOSwgMHgwM0MzLCAweDAxQ0EsIDB4MDNDNCwgMHgwMUNCLCAweDAzQzUsCisgICAgMHgwMUNDLCAweDAzQzYsIDB4MDFDRCwgMHgwM0M3LCAweDAxQ0UsIDB4MDNDOCwgMHgwMUNGLCAweDAzQzksIDB4MDFEMCwKKyAgICAweDA0MDEsIDB4MzY3MCwgMHgwNDEwLCAweDM2NkEsIDB4MDQxMSwgMHgzNjZCLCAweDA0MTIsIDB4MzY2QywgMHgwNDEzLAorICAgIDB4MzY2RCwgMHgwNDE0LCAweDM2NkUsIDB4MDQxNSwgMHgzNjZGLCAweDA0MTYsIDB4MzY3MSwgMHgwNDE3LCAweDM2NzIsCisgICAgMHgwNDE4LCAweDM2NzMsIDB4MDQxOSwgMHgzNjc0LCAweDA0MUEsIDB4MzY3NSwgMHgwNDFCLCAweDM2NzYsIDB4MDQxQywKKyAgICAweDM2NzcsIDB4MDQxRCwgMHgzNjc4LCAweDA0MUUsIDB4MzY3OSwgMHgwNDFGLCAweDM2N0EsIDB4MDQyMCwgMHgzNjdCLAorICAgIDB4MDQyMSwgMHgzNjdDLCAweDA0MjIsIDB4MzY3RCwgMHgwNDIzLCAweDM2N0UsIDB4MDQyNCwgMHgzNjdGLCAweDA0MjUsCisgICAgMHgzNjgwLCAweDA0MjYsIDB4MzY4MSwgMHgwNDI3LCAweDM2ODIsIDB4MDQyOCwgMHgzNjgzLCAweDA0MjksIDB4MzY4NCwKKyAgICAweDA0MkEsIDB4MzY4NSwgMHgwNDJCLCAweDM2ODYsIDB4MDQyQywgMHgzNjg3LCAweDA0MkQsIDB4MzY4OCwgMHgwNDJFLAorICAgIDB4MzY4OSwgMHgwNDJGLCAweDM2OEEsIDB4MDQzMCwgMHgzNjhCLCAweDA0MzEsIDB4MzY4QywgMHgwNDMyLCAweDM2OEQsCisgICAgMHgwNDMzLCAweDM2OEUsIDB4MDQzNCwgMHgzNjhGLCAweDA0MzUsIDB4MzY5MCwgMHgwNDM2LCAweDM2OTIsIDB4MDQzNywKKyAgICAweDM2OTMsIDB4MDQzOCwgMHgzNjk0LCAweDA0MzksIDB4MzY5NSwgMHgwNDNBLCAweDM2OTYsIDB4MDQzQiwgMHgzNjk3LAorICAgIDB4MDQzQywgMHgzNjk4LCAweDA0M0QsIDB4MzY5OSwgMHgwNDNFLCAweDM2OUEsIDB4MDQzRiwgMHgzNjlCLCAweDA0NDAsCisgICAgMHgzNjlDLCAweDA0NDEsIDB4MzY5RCwgMHgwNDQyLCAweDM2OUUsIDB4MDQ0MywgMHgzNjlGLCAweDA0NDQsIDB4MzZBMCwKKyAgICAweDA0NDUsIDB4MzZBMSwgMHgwNDQ2LCAweDM2QTIsIDB4MDQ0NywgMHgzNkEzLCAweDA0NDgsIDB4MzZBNCwgMHgwNDQ5LAorICAgIDB4MzZBNSwgMHgwNDRBLCAweDM2QTYsIDB4MDQ0QiwgMHgzNkE3LCAweDA0NEMsIDB4MzZBOCwgMHgwNDRELCAweDM2QTksCisgICAgMHgwNDRFLCAweDM2QUEsIDB4MDQ0RiwgMHgzNkFCLCAweDA0NTEsIDB4MzY5MSwgMHgyMDEzLCAweDAwNzksIDB4MjAxNCwKKyAgICAweDAwN0IsIDB4MjAxOCwgMHgwMEE2LCAweDIwMTksIDB4MDBBNywgMHgyMDFDLCAweDAwQTgsIDB4MjAxRCwgMHgwMEE5LAorICAgIDB4MjAyMiwgMHgwMDY4LCAweDIwMjUsIDB4MDA2RiwgMHgyMDI2LCAweDAwNkUsIDB4MjAyNywgMHgwMDY4LCAweDIwMzIsCisgICAgMHgwMEFELCAweDIwMzUsIDB4MDBBQywgMHgyMDNCLCAweDAwQjEsIDB4MjAzRSwgMHgwMEMzLCAweDIxMDMsIDB4MDEwQSwKKyAgICAweDIxMDUsIDB4MDBDMiwgMHgyMTA5LCAweDAxMEIsIDB4MjExNiwgMHgzNkU2LCAweDIxMjEsIDB4MzZFNywgMHgyMTYwLAorICAgIDB4MDE1NywgMHgyMTYxLCAweDAxNTgsIDB4MjE2MiwgMHgwMTU5LCAweDIxNjMsIDB4MDE1QSwgMHgyMTY0LCAweDAxNUIsCisgICAgMHgyMTY1LCAweDAxNUMsIDB4MjE2NiwgMHgwMTVELCAweDIxNjcsIDB4MDE1RSwgMHgyMTY4LCAweDAxNUYsIDB4MjE2OSwKKyAgICAweDAxNjAsIDB4MjE3MCwgMHgwMjBFLCAweDIxNzEsIDB4MDIwRiwgMHgyMTcyLCAweDAyMTAsIDB4MjE3MywgMHgwMjExLAorICAgIDB4MjE3NCwgMHgwMjEyLCAweDIxNzUsIDB4MDIxMywgMHgyMTc2LCAweDAyMTQsIDB4MjE3NywgMHgwMjE1LCAweDIxNzgsCisgICAgMHgwMjE2LCAweDIxNzksIDB4MDIxNywgMHgyMTkwLCAweDAwRjgsIDB4MjE5MSwgMHgwMEY1LCAweDIxOTIsIDB4MDBGNywKKyAgICAweDIxOTMsIDB4MDBGNiwgMHgyMTk2LCAweDAwRjksIDB4MjE5NywgMHgwMEZBLCAweDIxOTgsIDB4MDBGQywgMHgyMTk5LAorICAgIDB4MDBGQiwgMHgyMUI4LCAweDM2QUQsIDB4MjFCOSwgMHgzNkFFLCAweDIxRTcsIDB4MzZBQywgMHgyMjE1LCAweDAxMDEsCisgICAgMHgyMjFBLCAweDAwRDUsIDB4MjIxRSwgMHgwMERDLCAweDIyMUYsIDB4MDBFOSwgMHgyMjIwLCAweDAwRTgsIDB4MjIyMywKKyAgICAweDAwRkUsIDB4MjIyNSwgMHgwMEZELCAweDIyMjksIDB4MDBFNSwgMHgyMjJBLCAweDAwRTYsIDB4MjIyQiwgMHgwMEVELAorICAgIDB4MjIyRSwgMHgwMEVFLCAweDIyMzQsIDB4MDBGMCwgMHgyMjM1LCAweDAwRUYsIDB4MjIzQywgMHgwMEU0LCAweDIyNTIsCisgICAgMHgwMERELCAweDIyNjAsIDB4MDBEQiwgMHgyMjYxLCAweDAwREUsIDB4MjI2NiwgMHgwMEQ5LCAweDIyNjcsIDB4MDBEQSwKKyAgICAweDIyOTUsIDB4MDBGMywgMHgyMjk5LCAweDAwRjQsIDB4MjJBNSwgMHgwMEU3LCAweDIyQkYsIDB4MDBFQSwgMHgyMkVGLAorICAgIDB4MDA2RSwgMHgyNDAwLCAweDAyMzIsIDB4MjQwMSwgMHgwMjMzLCAweDI0MDIsIDB4MDIzNCwgMHgyNDAzLCAweDAyMzUsCisgICAgMHgyNDA0LCAweDAyMzYsIDB4MjQwNSwgMHgwMjM3LCAweDI0MDYsIDB4MDIzOCwgMHgyNDA3LCAweDAyMzksIDB4MjQwOCwKKyAgICAweDAyM0EsIDB4MjQwOSwgMHgwMjNCLCAweDI0MEEsIDB4MDIzQywgMHgyNDBCLCAweDAyM0QsIDB4MjQwQywgMHgwMjNFLAorICAgIDB4MjQwRCwgMHgwMjNGLCAweDI0MEUsIDB4MDI0MCwgMHgyNDBGLCAweDAyNDEsIDB4MjQxMCwgMHgwMjQyLCAweDI0MTEsCisgICAgMHgwMjQzLCAweDI0MTIsIDB4MDI0NCwgMHgyNDEzLCAweDAyNDUsIDB4MjQxNCwgMHgwMjQ2LCAweDI0MTUsIDB4MDI0NywKKyAgICAweDI0MTYsIDB4MDI0OCwgMHgyNDE3LCAweDAyNDksIDB4MjQxOCwgMHgwMjRBLCAweDI0MTksIDB4MDI0QiwgMHgyNDFBLAorICAgIDB4MDI0QywgMHgyNDFCLCAweDAyNEQsIDB4MjQxQywgMHgwMjRFLCAweDI0MUQsIDB4MDI0RiwgMHgyNDFFLCAweDAyNTAsCisgICAgMHgyNDFGLCAweDAyNTEsIDB4MjQyMSwgMHgwMjUyLCAweDI0NjAsIDB4MDFGQSwgMHgyNDYxLCAweDAxRkIsIDB4MjQ2MiwKKyAgICAweDAxRkMsIDB4MjQ2MywgMHgwMUZELCAweDI0NjQsIDB4MDFGRSwgMHgyNDY1LCAweDAxRkYsIDB4MjQ2NiwgMHgwMjAwLAorICAgIDB4MjQ2NywgMHgwMjAxLCAweDI0NjgsIDB4MDIwMiwgMHgyNDY5LCAweDAyMDMsIDB4MjQ3NCwgMHgwMjA0LCAweDI0NzUsCisgICAgMHgwMjA1LCAweDI0NzYsIDB4MDIwNiwgMHgyNDc3LCAweDAyMDcsIDB4MjQ3OCwgMHgwMjA4LCAweDI0NzksIDB4MDIwOSwKKyAgICAweDI0N0EsIDB4MDIwQSwgMHgyNDdCLCAweDAyMEIsIDB4MjQ3QywgMHgwMjBDLCAweDI0N0QsIDB4MDIwRCwgMHgyNTAwLAorICAgIDB4MDEzNywgMHgyNTAyLCAweDAxMzgsIDB4MjUwQywgMHgwMTNBLCAweDI1MTAsIDB4MDEzQiwgMHgyNTE0LCAweDAxM0MsCisgICAgMHgyNTE4LCAweDAxM0QsIDB4MjUxQywgMHgwMTM1LCAweDI1MjQsIDB4MDEzNCwgMHgyNTJDLCAweDAxMzMsIDB4MjUzNCwKKyAgICAweDAxMzIsIDB4MjUzQywgMHgwMTMxLCAweDI1NTAsIDB4MDE0MiwgMHgyNTUxLCAweDM3MEEsIDB4MjU1MiwgMHgzNkY4LAorICAgIDB4MjU1MywgMHgzNzAxLCAweDI1NTQsIDB4MzZFRiwgMHgyNTU1LCAweDM2RkEsIDB4MjU1NiwgMHgzNzAzLCAweDI1NTcsCisgICAgMHgzNkYxLCAweDI1NTgsIDB4MzZGRSwgMHgyNTU5LCAweDM3MDcsIDB4MjU1QSwgMHgzNkY1LCAweDI1NUIsIDB4MzcwMCwKKyAgICAweDI1NUMsIDB4MzcwOSwgMHgyNTVELCAweDM2RjcsIDB4MjU1RSwgMHgwMTQzLCAweDI1NUYsIDB4MzcwNCwgMHgyNTYwLAorICAgIDB4MzZGMiwgMHgyNTYxLCAweDAxNDUsIDB4MjU2MiwgMHgzNzA2LCAweDI1NjMsIDB4MzZGNCwgMHgyNTY0LCAweDM2RjksCisgICAgMHgyNTY1LCAweDM3MDIsIDB4MjU2NiwgMHgzNkYwLCAweDI1NjcsIDB4MzZGRiwgMHgyNTY4LCAweDM3MDgsIDB4MjU2OSwKKyAgICAweDM2RjYsIDB4MjU2QSwgMHgwMTQ0LCAweDI1NkIsIDB4MzcwNSwgMHgyNTZDLCAweDM2RjMsIDB4MjU2RCwgMHgwMTNFLAorICAgIDB4MjU2RSwgMHgwMTNGLCAweDI1NkYsIDB4MDE0MSwgMHgyNTcwLCAweDAxNDAsIDB4MjU3MSwgMHgwMTRBLCAweDI1NzIsCisgICAgMHgwMTRCLCAweDI1NzMsIDB4MDE0QywgMHgyNTc0LCAweDM1QjAsIDB4MjU4MSwgMHgwMTIyLCAweDI1ODIsIDB4MDEyMywKKyAgICAweDI1ODMsIDB4MDEyNCwgMHgyNTg0LCAweDAxMjUsIDB4MjU4NSwgMHgwMTI2LCAweDI1ODYsIDB4MDEyNywgMHgyNTg3LAorICAgIDB4MDEyOCwgMHgyNTg4LCAweDAxMjksIDB4MjU4OSwgMHgwMTMwLCAweDI1OEEsIDB4MDEyRiwgMHgyNThCLCAweDAxMkUsCisgICAgMHgyNThDLCAweDAxMkQsIDB4MjU4RCwgMHgwMTJDLCAweDI1OEUsIDB4MDEyQiwgMHgyNThGLCAweDAxMkEsIDB4MjU5MywKKyAgICAweDM3MTAsIDB4MjU5NCwgMHgwMTM2LCAweDI1OTUsIDB4MDEzOSwgMHgyNUEwLCAweDAwQkUsIDB4MjVBMSwgMHgwMEJELAorICAgIDB4MjVCMiwgMHgwMEI3LCAweDI1QjMsIDB4MDBCNiwgMHgyNUJDLCAweDAwQzAsIDB4MjVCRCwgMHgwMEJGLCAweDI1QzYsCisgICAgMHgwMEJDLCAweDI1QzcsIDB4MDBCQiwgMHgyNUNCLCAweDAwQjQsIDB4MjVDRSwgMHgwMEI4LCAweDI1Q0YsIDB4MDBCNSwKKyAgICAweDI1RTIsIDB4MDE0NiwgMHgyNUUzLCAweDAxNDcsIDB4MjVFNCwgMHgwMTQ5LCAweDI1RTUsIDB4MDE0OCwgMHgyNjA1LAorICAgIDB4MDBCQSwgMHgyNjA2LCAweDAwQjksIDB4MjYwOSwgMHgwMEY0LCAweDI2NDAsIDB4MDBGMSwgMHgyNjQxLCAweDAwRjMsCisgICAgMHgyNjQyLCAweDAwRjIsIDB4MjczRCwgMHgzNUMwLCAweDJGMDAsIDB4MDI1MywgMHgyRjAxLCAweDAyMTgsIDB4MkYwMiwKKyAgICAweDAyMTksIDB4MkYwMywgMHgwMjFBLCAweDJGMDQsIDB4MDI1NCwgMHgyRjA1LCAweDAyMUIsIDB4MkYwNiwgMHgwMjVBLAorICAgIDB4MkYwNywgMHgwMjFDLCAweDJGMDgsIDB4MDI1QiwgMHgyRjA5LCAweDAyNUMsIDB4MkYwQSwgMHgwMjVELCAweDJGMEIsCisgICAgMHgwMjVFLCAweDJGMEMsIDB4MDIxRCwgMHgyRjBELCAweDAyMUUsIDB4MkYwRSwgMHgwMjFGLCAweDJGMEYsIDB4MDI1RiwKKyAgICAweDJGMTAsIDB4MTc2RSwgMHgyRjExLCAweDAyNjAsIDB4MkYxMiwgMHgwMjYyLCAweDJGMTMsIDB4MDIyMCwgMHgyRjE0LAorICAgIDB4MDI2MywgMHgyRjE1LCAweDE3NkYsIDB4MkYxNiwgMHgwMjIxLCAweDJGMTcsIDB4MDI2NCwgMHgyRjE4LCAweDAyNjUsCisgICAgMHgyRjE5LCAweDAyMjIsIDB4MkYxQSwgMHgxNzcwLCAweDJGMUIsIDB4MDIyMywgMHgyRjFDLCAweDAyNjYsIDB4MkYxRCwKKyAgICAweDAyNzksIDB4MkYxRSwgMHgxNzc1LCAweDJGMUYsIDB4MDI3QSwgMHgyRjIwLCAweDAyN0IsIDB4MkYyMSwgMHgwMjI0LAorICAgIDB4MkYyMiwgMHgwMjI0LCAweDJGMjMsIDB4MDI3QywgMHgyRjI0LCAweDAyN0QsIDB4MkYyNSwgMHgwMjdFLCAweDJGMjYsCisgICAgMHgwMjdGLCAweDJGMjcsIDB4MDIyNSwgMHgyRjI4LCAweDAyODIsIDB4MkYyOSwgMHgwMjgzLCAweDJGMkEsIDB4MDI4NCwKKyAgICAweDJGMkIsIDB4MDI4NSwgMHgyRjJDLCAweDE3NzYsIDB4MkYyRCwgMHgwMjg2LCAweDJGMkUsIDB4MDIyNiwgMHgyRjJGLAorICAgIDB4MDI4OCwgMHgyRjMwLCAweDAyODksIDB4MkYzMSwgMHgwMjhDLCAweDJGMzIsIDB4MDI4RCwgMHgyRjMzLCAweDAyMjcsCisgICAgMHgyRjM0LCAweDAyMjgsIDB4MkYzNSwgMHgwMjI5LCAweDJGMzYsIDB4MDI4RSwgMHgyRjM3LCAweDAyOEYsIDB4MkYzOCwKKyAgICAweDAyOTAsIDB4MkYzOSwgMHgwMjJBLCAweDJGM0EsIDB4MDIyQiwgMHgyRjNCLCAweDE3NzcsIDB4MkYzQywgMHgwMkQwLAorICAgIDB4MkYzRCwgMHgwMkQxLCAweDJGM0UsIDB4MDJEMiwgMHgyRjNGLCAweDAyRDMsIDB4MkY0MCwgMHgwMkQ1LCAweDJGNDEsCisgICAgMHgwMjJDLCAweDJGNDIsIDB4MDJENiwgMHgyRjQzLCAweDAyRDcsIDB4MkY0NCwgMHgwMkQ4LCAweDJGNDUsIDB4MDJEOSwKKyAgICAweDJGNDYsIDB4MDIyRCwgMHgyRjQ3LCAweDAyREEsIDB4MkY0OCwgMHgwMkRCLCAweDJGNDksIDB4MDJEQywgMHgyRjRBLAorICAgIDB4MDJERCwgMHgyRjRCLCAweDAyREUsIDB4MkY0QywgMHgwMkRGLCAweDJGNEQsIDB4MDJFMCwgMHgyRjRFLCAweDE3OEEsCisgICAgMHgyRjRGLCAweDAyRTEsIDB4MkY1MCwgMHgwMkUyLCAweDJGNTEsIDB4MDJFMywgMHgyRjUyLCAweDAyRTQsIDB4MkY1MywKKyAgICAweDE3OEMsIDB4MkY1NCwgMHgwMkU1LCAweDJGNTUsIDB4MDJFNiwgMHgyRjU2LCAweDAyRTcsIDB4MkY1NywgMHgwMkU4LAorICAgIDB4MkY1OCwgMHgwMkU5LCAweDJGNTksIDB4MTc4RCwgMHgyRjVBLCAweDAyRUEsIDB4MkY1QiwgMHgwMkVCLCAweDJGNUMsCisgICAgMHgwMkVDLCAweDJGNUQsIDB4MDJFRCwgMHgyRjVFLCAweDAzNTYsIDB4MkY1RiwgMHgwMzU3LCAweDJGNjAsIDB4MDM1OCwKKyAgICAweDJGNjEsIDB4MDM1OSwgMHgyRjYyLCAweDAzNUEsIDB4MkY2MywgMHgwMzVCLCAweDJGNjQsIDB4MDM1QywgMHgyRjY1LAorICAgIDB4MDM1RSwgMHgyRjY2LCAweDAzNjIsIDB4MkY2NywgMHgwMjJFLCAweDJGNjgsIDB4MDIyRiwgMHgyRjY5LCAweDAzNjMsCisgICAgMHgyRjZBLCAweDAzNjQsIDB4MkY2QiwgMHgwMzY1LCAweDJGNkMsIDB4MDM2NiwgMHgyRjZELCAweDAzNjcsIDB4MkY2RSwKKyAgICAweDAzNjgsIDB4MkY2RiwgMHgwMzY5LCAweDJGNzAsIDB4MDM2QSwgMHgyRjcxLCAweDE3QjIsIDB4MkY3MiwgMHgwMzZCLAorICAgIDB4MkY3MywgMHgwMzZDLCAweDJGNzQsIDB4MDM2RCwgMHgyRjc1LCAweDAzRjYsIDB4MkY3NiwgMHgwM0Y3LCAweDJGNzcsCisgICAgMHgwM0Y4LCAweDJGNzgsIDB4MDNGOSwgMHgyRjc5LCAweDE4MTIsIDB4MkY3QSwgMHgwM0ZBLCAweDJGN0IsIDB4MDNGQiwKKyAgICAweDJGN0MsIDB4MDNGQywgMHgyRjdELCAweDAzRkUsIDB4MkY3RSwgMHgwM0ZGLCAweDJGN0YsIDB4MDQwMCwgMHgyRjgwLAorICAgIDB4MDQwMSwgMHgyRjgxLCAweDA0MDIsIDB4MkY4MiwgMHgwNDA1LCAweDJGODMsIDB4MDQwNiwgMHgyRjg0LCAweDA0MDcsCisgICAgMHgyRjg1LCAweDA0MDgsIDB4MkY4NiwgMHgwNDA5LCAweDJGODcsIDB4MDQwQSwgMHgyRjg4LCAweDA0MEIsIDB4MkY4OSwKKyAgICAweDA0MEMsIDB4MkY4QSwgMHgwNDBELCAweDJGOEIsIDB4MTgxMywgMHgyRjhDLCAweDE4MTgsIDB4MkY4RCwgMHgwNDBGLAorICAgIDB4MkY4RSwgMHgwNDEwLCAweDJGOEYsIDB4MDQxMSwgMHgyRjkwLCAweDA0MTIsIDB4MkY5MSwgMHgxODE5LCAweDJGOTIsCisgICAgMHgwNTA4LCAweDJGOTMsIDB4MDUwOSwgMHgyRjk0LCAweDA1MEEsIDB4MkY5NSwgMHgwNTBCLCAweDJGOTYsIDB4MDUwQywKKyAgICAweDJGOTcsIDB4MDUwRCwgMHgyRjk4LCAweDE4RTcsIDB4MkY5OSwgMHgwNTBFLCAweDJGOUEsIDB4MDUwRiwgMHgyRjlCLAorICAgIDB4MDUxMCwgMHgyRjlDLCAweDA1MTEsIDB4MkY5RCwgMHgwNTEyLCAweDJGOUUsIDB4MDUxMywgMHgyRjlGLCAweDA1MTQsCisgICAgMHgyRkEwLCAweDA1MTUsIDB4MkZBMSwgMHgwMjMwLCAweDJGQTIsIDB4MDUxQiwgMHgyRkEzLCAweDA1MjAsIDB4MkZBNCwKKyAgICAweDA1MjEsIDB4MkZBNSwgMHgwNTIyLCAweDJGQTYsIDB4MDY5NiwgMHgyRkE3LCAweDA2OTcsIDB4MkZBOCwgMHgwNjk4LAorICAgIDB4MkZBOSwgMHgwNjk5LCAweDJGQUEsIDB4MDIzMSwgMHgyRkFCLCAweDA2OUYsIDB4MkZBQywgMHgwNkEwLCAweDJGQUUsCisgICAgMHgwNkEyLCAweDJGQUYsIDB4MDgyNiwgMHgyRkIwLCAweDA4MjcsIDB4MkZCMSwgMHgwODI4LCAweDJGQjIsIDB4MDgyOSwKKyAgICAweDJGQjMsIDB4MDgyQSwgMHgyRkI0LCAweDA4MkIsIDB4MkZCNSwgMHgwODJDLCAweDJGQjYsIDB4MDgyRCwgMHgyRkI3LAorICAgIDB4MDgyRSwgMHgyRkI4LCAweDA4MkYsIDB4MkZCOSwgMHgwODMwLCAweDJGQkEsIDB4MDlGNSwgMHgyRkJCLCAweDA5RjYsCisgICAgMHgyRkJDLCAweDA5RjcsIDB4MkZCRCwgMHgxRTMzLCAweDJGQkUsIDB4MDlGOCwgMHgyRkJGLCAweDFFMzQsIDB4MkZDMCwKKyAgICAweDA5RjksIDB4MkZDMSwgMHgwOUZBLCAweDJGQzIsIDB4MEJFMSwgMHgyRkMzLCAweDBCRTIsIDB4MkZDNCwgMHgwQkUzLAorICAgIDB4MkZDNSwgMHgwQkU0LCAweDJGQzYsIDB4MEJFNSwgMHgyRkM3LCAweDBCRTYsIDB4MkZDOCwgMHgwREJCLCAweDJGQzksCisgICAgMHgwREJDLCAweDJGQ0EsIDB4MERCRCwgMHgyRkNCLCAweDIzNjAsIDB4MkZDQywgMHgyNjEyLCAweDJGQ0QsIDB4MEY3QiwKKyAgICAweDJGQ0UsIDB4MEY3QywgMHgyRkNGLCAweDBGN0QsIDB4MkZEMCwgMHgxMTAwLCAweDJGRDEsIDB4MTEwMSwgMHgyRkQyLAorICAgIDB4MTI4OSwgMHgyRkQzLCAweDEzQjIsIDB4MkZENCwgMHgxM0IzLCAweDJGRDUsIDB4MkYwRCwgMHgzMDAwLCAweDAwNjMsCisgICAgMHgzMDAxLCAweDAwNjUsIDB4MzAwMiwgMHgwMDY2LCAweDMwMDMsIDB4MDBCMywgMHgzMDA1LCAweDM1QkEsIDB4MzAwNiwKKyAgICAweDM1QkIsIDB4MzAwNywgMHgzNUJDLCAweDMwMDgsIDB4MDA5NCwgMHgzMDA5LCAweDAwOTUsIDB4MzAwQSwgMHgwMDkwLAorICAgIDB4MzAwQiwgMHgwMDkxLCAweDMwMEMsIDB4MDA5OCwgMHgzMDBELCAweDAwOTksIDB4MzAwRSwgMHgwMDlDLCAweDMwMEYsCisgICAgMHgwMDlELCAweDMwMTAsIDB4MDA4QywgMHgzMDExLCAweDAwOEQsIDB4MzAxMiwgMHgwMTA1LCAweDMwMTQsIDB4MDA4OCwKKyAgICAweDMwMTUsIDB4MDA4OSwgMHgzMDFELCAweDAwQUEsIDB4MzAxRSwgMHgwMEFCLCAweDMwMjEsIDB4MDE2MSwgMHgzMDIyLAorICAgIDB4MDE2MiwgMHgzMDIzLCAweDAxNjMsIDB4MzAyNCwgMHgwMTY0LCAweDMwMjUsIDB4MDE2NSwgMHgzMDI2LCAweDAxNjYsCisgICAgMHgzMDI3LCAweDAxNjcsIDB4MzAyOCwgMHgwMTY4LCAweDMwMjksIDB4MDE2OSwgMHgzMDM4LCAweDAxNkEsIDB4MzAzOSwKKyAgICAweDAxNkIsIDB4MzAzQSwgMHgwMTZDLCAweDMwNDEsIDB4MzVDMSwgMHgzMDQyLCAweDM1QzIsIDB4MzA0MywgMHgzNUMzLAorICAgIDB4MzA0NCwgMHgzNUM0LCAweDMwNDUsIDB4MzVDNSwgMHgzMDQ2LCAweDM1QzYsIDB4MzA0NywgMHgzNUM3LCAweDMwNDgsCisgICAgMHgzNUM4LCAweDMwNDksIDB4MzVDOSwgMHgzMDRBLCAweDM1Q0EsIDB4MzA0QiwgMHgzNUNCLCAweDMwNEMsIDB4MzVDQywKKyAgICAweDMwNEQsIDB4MzVDRCwgMHgzMDRFLCAweDM1Q0UsIDB4MzA0RiwgMHgzNUNGLCAweDMwNTAsIDB4MzVEMCwgMHgzMDUxLAorICAgIDB4MzVEMSwgMHgzMDUyLCAweDM1RDIsIDB4MzA1MywgMHgzNUQzLCAweDMwNTQsIDB4MzVENCwgMHgzMDU1LCAweDM1RDUsCisgICAgMHgzMDU2LCAweDM1RDYsIDB4MzA1NywgMHgzNUQ3LCAweDMwNTgsIDB4MzVEOCwgMHgzMDU5LCAweDM1RDksIDB4MzA1QSwKKyAgICAweDM1REEsIDB4MzA1QiwgMHgzNURCLCAweDMwNUMsIDB4MzVEQywgMHgzMDVELCAweDM1REQsIDB4MzA1RSwgMHgzNURFLAorICAgIDB4MzA1RiwgMHgzNURGLCAweDMwNjAsIDB4MzVFMCwgMHgzMDYxLCAweDM1RTEsIDB4MzA2MiwgMHgzNUUyLCAweDMwNjMsCisgICAgMHgzNUUzLCAweDMwNjQsIDB4MzVFNCwgMHgzMDY1LCAweDM1RTUsIDB4MzA2NiwgMHgzNUU2LCAweDMwNjcsIDB4MzVFNywKKyAgICAweDMwNjgsIDB4MzVFOCwgMHgzMDY5LCAweDM1RTksIDB4MzA2QSwgMHgzNUVBLCAweDMwNkIsIDB4MzVFQiwgMHgzMDZDLAorICAgIDB4MzVFQywgMHgzMDZELCAweDM1RUQsIDB4MzA2RSwgMHgzNUVFLCAweDMwNkYsIDB4MzVFRiwgMHgzMDcwLCAweDM1RjAsCisgICAgMHgzMDcxLCAweDM1RjEsIDB4MzA3MiwgMHgzNUYyLCAweDMwNzMsIDB4MzVGMywgMHgzMDc0LCAweDM1RjQsIDB4MzA3NSwKKyAgICAweDM1RjUsIDB4MzA3NiwgMHgzNUY2LCAweDMwNzcsIDB4MzVGNywgMHgzMDc4LCAweDM1RjgsIDB4MzA3OSwgMHgzNUY5LAorICAgIDB4MzA3QSwgMHgzNUZBLCAweDMwN0IsIDB4MzVGQiwgMHgzMDdDLCAweDM1RkMsIDB4MzA3RCwgMHgzNUZELCAweDMwN0UsCisgICAgMHgzNUZFLCAweDMwN0YsIDB4MzVGRiwgMHgzMDgwLCAweDM2MDAsIDB4MzA4MSwgMHgzNjAxLCAweDMwODIsIDB4MzYwMiwKKyAgICAweDMwODMsIDB4MzYwMywgMHgzMDg0LCAweDM2MDQsIDB4MzA4NSwgMHgzNjA1LCAweDMwODYsIDB4MzYwNiwgMHgzMDg3LAorICAgIDB4MzYwNywgMHgzMDg4LCAweDM2MDgsIDB4MzA4OSwgMHgzNjA5LCAweDMwOEEsIDB4MzYwQSwgMHgzMDhCLCAweDM2MEIsCisgICAgMHgzMDhDLCAweDM2MEMsIDB4MzA4RCwgMHgzNjBELCAweDMwOEUsIDB4MzYwRSwgMHgzMDhGLCAweDM2MEYsIDB4MzA5MCwKKyAgICAweDM2MTAsIDB4MzA5MSwgMHgzNjExLCAweDMwOTIsIDB4MzYxMiwgMHgzMDkzLCAweDM2MTMsIDB4MzA5RCwgMHgzNUI3LAorICAgIDB4MzA5RSwgMHgzNUI4LCAweDMwQTEsIDB4MzYxNCwgMHgzMEEyLCAweDM2MTUsIDB4MzBBMywgMHgzNjE2LCAweDMwQTQsCisgICAgMHgzNjE3LCAweDMwQTUsIDB4MzYxOCwgMHgzMEE2LCAweDM2MTksIDB4MzBBNywgMHgzNjFBLCAweDMwQTgsIDB4MzYxQiwKKyAgICAweDMwQTksIDB4MzYxQywgMHgzMEFBLCAweDM2MUQsIDB4MzBBQiwgMHgzNjFFLCAweDMwQUMsIDB4MzYxRiwgMHgzMEFELAorICAgIDB4MzYyMCwgMHgzMEFFLCAweDM2MjEsIDB4MzBBRiwgMHgzNjIyLCAweDMwQjAsIDB4MzYyMywgMHgzMEIxLCAweDM2MjQsCisgICAgMHgzMEIyLCAweDM2MjUsIDB4MzBCMywgMHgzNjI2LCAweDMwQjQsIDB4MzYyNywgMHgzMEI1LCAweDM2MjgsIDB4MzBCNiwKKyAgICAweDM2MjksIDB4MzBCNywgMHgzNjJBLCAweDMwQjgsIDB4MzYyQiwgMHgzMEI5LCAweDM2MkMsIDB4MzBCQSwgMHgzNjJELAorICAgIDB4MzBCQiwgMHgzNjJFLCAweDMwQkMsIDB4MzYyRiwgMHgzMEJELCAweDM2MzAsIDB4MzBCRSwgMHgzNjMxLCAweDMwQkYsCisgICAgMHgzNjMyLCAweDMwQzAsIDB4MzYzMywgMHgzMEMxLCAweDM2MzQsIDB4MzBDMiwgMHgzNjM1LCAweDMwQzMsIDB4MzYzNiwKKyAgICAweDMwQzQsIDB4MzYzNywgMHgzMEM1LCAweDM2MzgsIDB4MzBDNiwgMHgzNjM5LCAweDMwQzcsIDB4MzYzQSwgMHgzMEM4LAorICAgIDB4MzYzQiwgMHgzMEM5LCAweDM2M0MsIDB4MzBDQSwgMHgzNjNELCAweDMwQ0IsIDB4MzYzRSwgMHgzMENDLCAweDM2M0YsCisgICAgMHgzMENELCAweDM2NDAsIDB4MzBDRSwgMHgzNjQxLCAweDMwQ0YsIDB4MzY0MiwgMHgzMEQwLCAweDM2NDMsIDB4MzBEMSwKKyAgICAweDM2NDQsIDB4MzBEMiwgMHgzNjQ1LCAweDMwRDMsIDB4MzY0NiwgMHgzMEQ0LCAweDM2NDcsIDB4MzBENSwgMHgzNjQ4LAorICAgIDB4MzBENiwgMHgzNjQ5LCAweDMwRDcsIDB4MzY0QSwgMHgzMEQ4LCAweDM2NEIsIDB4MzBEOSwgMHgzNjRDLCAweDMwREEsCisgICAgMHgzNjRELCAweDMwREIsIDB4MzY0RSwgMHgzMERDLCAweDM2NEYsIDB4MzBERCwgMHgzNjUwLCAweDMwREUsIDB4MzY1MSwKKyAgICAweDMwREYsIDB4MzY1MiwgMHgzMEUwLCAweDM2NTMsIDB4MzBFMSwgMHgzNjU0LCAweDMwRTIsIDB4MzY1NSwgMHgzMEUzLAorICAgIDB4MzY1NiwgMHgzMEU0LCAweDM2NTcsIDB4MzBFNSwgMHgzNjU4LCAweDMwRTYsIDB4MzY1OSwgMHgzMEU3LCAweDM2NUEsCisgICAgMHgzMEU4LCAweDM2NUIsIDB4MzBFOSwgMHgzNjVDLCAweDMwRUEsIDB4MzY1RCwgMHgzMEVCLCAweDM2NUUsIDB4MzBFQywKKyAgICAweDM2NUYsIDB4MzBFRCwgMHgzNjYwLCAweDMwRUUsIDB4MzY2MSwgMHgzMEVGLCAweDM2NjIsIDB4MzBGMCwgMHgzNjYzLAorICAgIDB4MzBGMSwgMHgzNjY0LCAweDMwRjIsIDB4MzY2NSwgMHgzMEYzLCAweDM2NjYsIDB4MzBGNCwgMHgzNjY3LCAweDMwRjUsCisgICAgMHgzNjY4LCAweDMwRjYsIDB4MzY2OSwgMHgzMEZDLCAweDM1QkQsIDB4MzBGRCwgMHgzNUI1LCAweDMwRkUsIDB4MzVCNiwKKyAgICAweDMxMDUsIDB4MDFEMSwgMHgzMTA2LCAweDAxRDIsIDB4MzEwNywgMHgwMUQzLCAweDMxMDgsIDB4MDFENCwgMHgzMTA5LAorICAgIDB4MDFENSwgMHgzMTBBLCAweDAxRDYsIDB4MzEwQiwgMHgwMUQ3LCAweDMxMEMsIDB4MDFEOCwgMHgzMTBELCAweDAxRDksCisgICAgMHgzMTBFLCAweDAxREEsIDB4MzEwRiwgMHgwMURCLCAweDMxMTAsIDB4MDFEQywgMHgzMTExLCAweDAxREQsIDB4MzExMiwKKyAgICAweDAxREUsIDB4MzExMywgMHgwMURGLCAweDMxMTQsIDB4MDFFMCwgMHgzMTE1LCAweDAxRTEsIDB4MzExNiwgMHgwMUUyLAorICAgIDB4MzExNywgMHgwMUUzLCAweDMxMTgsIDB4MDFFNCwgMHgzMTE5LCAweDAxRTUsIDB4MzExQSwgMHgwMUU2LCAweDMxMUIsCisgICAgMHgwMUU3LCAweDMxMUMsIDB4MDFFOCwgMHgzMTFELCAweDAxRTksIDB4MzExRSwgMHgwMUVBLCAweDMxMUYsIDB4MDFFQiwKKyAgICAweDMxMjAsIDB4MDFFQywgMHgzMTIxLCAweDAxRUQsIDB4MzEyMiwgMHgwMUVFLCAweDMxMjMsIDB4MDFFRiwgMHgzMTI0LAorICAgIDB4MDFGMCwgMHgzMTI1LCAweDAxRjEsIDB4MzEyNiwgMHgwMUYyLCAweDMxMjcsIDB4MDFGMywgMHgzMTI4LCAweDAxRjQsCisgICAgMHgzMTI5LCAweDAxRjUsIDB4MzIzMSwgMHgzNkU1LCAweDMyQTMsIDB4MDBDMSwgMHgzMzhFLCAweDAxMTUsIDB4MzM4RiwKKyAgICAweDAxMTYsIDB4MzM5QywgMHgwMTEwLCAweDMzOUQsIDB4MDExMSwgMHgzMzlFLCAweDAxMTIsIDB4MzNBMSwgMHgwMTE0LAorICAgIDB4MzNDNCwgMHgwMTE3LCAweDMzQ0UsIDB4MDExMywgMHgzM0QxLCAweDAwRUMsIDB4MzNEMiwgMHgwMEVCLCAweDMzRDUsCisgICAgMHgwMTBGLCAweDM2MUQsIDB4MzZCNywgMHg0NDkxLCAweDM2QjQsIDB4NEUwMCwgMHgwMjUzLCAweDRFMDEsIDB4MDI1NSwKKyAgICAweDRFMDMsIDB4MDI1NiwgMHg0RTA3LCAweDE3NzEsIDB4NEUwOCwgMHgwMjY5LCAweDRFMDksIDB4MDI2NywgMHg0RTBBLAorICAgIDB4MDI2QSwgMHg0RTBCLCAweDAyNjgsIDB4NEUwQywgMHgxNzcyLCAweDRFMEQsIDB4MDI5NCwgMHg0RTBFLCAweDE3N0EsCisgICAgMHg0RTBGLCAweDE3NzgsIDB4NEUxMCwgMHgwMjkzLCAweDRFMTEsIDB4MDI5MiwgMHg0RTE0LCAweDAyRjIsIDB4NEUxNSwKKyAgICAweDAyRjEsIDB4NEUxNiwgMHgwMkYwLCAweDRFMTgsIDB4MDJGMywgMHg0RTE5LCAweDAyRUYsIDB4NEUxRSwgMHgwMzZFLAorICAgIDB4NEUxRiwgMHgwMzZGLCAweDRFMjYsIDB4MDUyOCwgMHg0RTI4LCAweDAyMTgsIDB4NEUyQiwgMHgwMjZCLCAweDRFMkQsCisgICAgMHgwMjk1LCAweDRFMkUsIDB4MTc3QiwgMHg0RTMwLCAweDAyOTYsIDB4NEUzMSwgMHgxNzhFLCAweDRFMzIsIDB4MDQxNSwKKyAgICAweDRFMzMsIDB4MThGNCwgMHg0RTM2LCAweDAyMTksIDB4NEUzOCwgMHgwMjZDLCAweDRFMzksIDB4MDI5NywgMHg0RTNCLAorICAgIDB4MDJGNCwgMHg0RTNDLCAweDE3OEYsIDB4NEUzRiwgMHgwMjFBLCAweDRFNDEsIDB4MzZBRiwgMHg0RTQyLCAweDE3NkMsCisgICAgMHg0RTQzLCAweDAyNTcsIDB4NEU0NSwgMHgwMjZFLCAweDRFNDcsIDB4MTc3MywgMHg0RTQ4LCAweDAyNkYsIDB4NEU0QiwKKyAgICAweDAyOTgsIDB4NEU0RCwgMHgwMkY1LCAweDRFNEUsIDB4MDJGNywgMHg0RTRGLCAweDAyRjYsIDB4NEU1MiwgMHgwMzcwLAorICAgIDB4NEU1MywgMHgwMzcxLCAweDRFNTYsIDB4MDUyOSwgMHg0RTU4LCAweDA4MzEsIDB4NEU1OSwgMHgwMjU0LCAweDRFNUEsCisgICAgMHgzNkIxLCAweDRFNUMsIDB4MTc2RCwgMHg0RTVELCAweDAyNTgsIDB4NEU1RSwgMHgwMjcxLCAweDRFNUYsIDB4MDI3MCwKKyAgICAweDRFNjksIDB4MDM3MiwgMHg0RTczLCAweDA1MkEsIDB4NEU3RSwgMHgwOUZCLCAweDRFN0YsIDB4MUUzNSwgMHg0RTgyLAorICAgIDB4MERCRSwgMHg0RTgzLCAweDIzNjEsIDB4NEU4NCwgMHgyMzYyLCAweDRFODUsIDB4MDIxQiwgMHg0RTg2LCAweDAyNTksCisgICAgMHg0RTg4LCAweDAyOUEsIDB4NEU4QiwgMHgwNTJCLCAweDRFOEMsIDB4MDI1QSwgMHg0RThELCAweDE3NzQsIDB4NEU4RSwKKyAgICAweDAyNzIsIDB4NEU5MSwgMHgwMjlCLCAweDRFOTIsIDB4MDI5RCwgMHg0RTkzLCAweDE3N0MsIDB4NEU5NCwgMHgwMjlFLAorICAgIDB4NEU5NSwgMHgwMjlDLCAweDRFOTksIDB4MDM3MywgMHg0RTlCLCAweDA1MkMsIDB4NEU5RSwgMHgwNTJELCAweDRFOUYsCisgICAgMHgwNkEzLCAweDRFQTAsIDB4MDIxQywgMHg0RUExLCAweDAyNzMsIDB4NEVBMiwgMHgwMjlGLCAweDRFQTQsIDB4MDM3NCwKKyAgICAweDRFQTUsIDB4MDM3NiwgMHg0RUE2LCAweDAzNzUsIDB4NEVBOCwgMHgwNDE2LCAweDRFQUIsIDB4MDUyRSwgMHg0RUFDLAorICAgIDB4MDUyRiwgMHg0RUFELCAweDA2QTQsIDB4NEVBRSwgMHgwNkE1LCAweDRFQjMsIDB4MDgzMiwgMHg0RUI2LCAweDIzNjMsCisgICAgMHg0RUI5LCAweDMzNzcsIDB4NEVCQSwgMHgwMjVCLCAweDRFQzAsIDB4MDJBMSwgMHg0RUMxLCAweDAyQTAsIDB4NEVDMiwKKyAgICAweDE3N0QsIDB4NEVDMywgMHgwMkEyLCAweDRFQzQsIDB4MDJBOCwgMHg0RUM2LCAweDAyQTMsIDB4NEVDNywgMHgwMkE0LAorICAgIDB4NEVDOCwgMHgxNzdGLCAweDRFQzksIDB4MTc3RSwgMHg0RUNBLCAweDAyQTYsIDB4NEVDQiwgMHgwMkE3LCAweDRFQ0QsCisgICAgMHgwMkE1LCAweDRFRDQsIDB4MDJGQSwgMHg0RUQ1LCAweDAyRkIsIDB4NEVENiwgMHgwMkZDLCAweDRFRDcsIDB4MDJGRCwKKyAgICAweDRFRDgsIDB4MDJGOSwgMHg0RUQ5LCAweDAzMDAsIDB4NEVEQSwgMHgxNzk1LCAweDRFREMsIDB4MTc5MSwgMHg0RURELAorICAgIDB4MTc5NCwgMHg0RURFLCAweDAzMDEsIDB4NEVERiwgMHgwMzExLCAweDRFRTEsIDB4MTc5MywgMHg0RUUzLCAweDAyRkUsCisgICAgMHg0RUU0LCAweDAyRkYsIDB4NEVFNSwgMHgwMkY4LCAweDRFRTgsIDB4MTc5MCwgMHg0RUU5LCAweDE3OTIsIDB4NEVGMCwKKyAgICAweDAzODMsIDB4NEVGMSwgMHgxN0JBLCAweDRFRjIsIDB4MDM4MCwgMHg0RUYzLCAweDAzODQsIDB4NEVGNCwgMHgxN0M0LAorICAgIDB4NEVGNSwgMHgxN0I4LCAweDRFRjYsIDB4MDM4MSwgMHg0RUY3LCAweDE3QkMsIDB4NEVGQiwgMHgwMzgyLCAweDRFRkQsCisgICAgMHgwMzg1LCAweDRFRkYsIDB4MDM3NywgMHg0RjAwLCAweDE3QkIsIDB4NEYwMSwgMHgwMzg2LCAweDRGMDIsIDB4MTdCRiwKKyAgICAweDRGMDQsIDB4MTdDMywgMHg0RjA1LCAweDE3QzAsIDB4NEYwOCwgMHgxN0JELCAweDRGMDksIDB4MDM3OCwgMHg0RjBBLAorICAgIDB4MDM3QSwgMHg0RjBCLCAweDAzODcsIDB4NEYwRCwgMHgwMzdDLCAweDRGMEUsIDB4MTdCNSwgMHg0RjBGLCAweDAzN0YsCisgICAgMHg0RjEwLCAweDAzN0QsIDB4NEYxMSwgMHgwMzdFLCAweDRGMTIsIDB4MTdDNSwgMHg0RjEzLCAweDE3QzIsIDB4NEYxNCwKKyAgICAweDE3QjksIDB4NEYxNSwgMHgwMzdCLCAweDRGMTgsIDB4MTdCNiwgMHg0RjE5LCAweDAzNzksIDB4NEYxRCwgMHgxN0JFLAorICAgIDB4NEYyMiwgMHgxN0MxLCAweDRGMkMsIDB4MTdCNywgMHg0RjJELCAweDE4MkYsIDB4NEYyRiwgMHgwNDJDLCAweDRGMzAsCisgICAgMHgwNDFGLCAweDRGMzMsIDB4MTgzMCwgMHg0RjM0LCAweDA0MUMsIDB4NEYzNiwgMHgwNDJFLCAweDRGMzgsIDB4MDQyNCwKKyAgICAweDRGM0EsIDB4MDQyMywgMHg0RjNCLCAweDE4MjQsIDB4NEYzQywgMHgwNDI3LCAweDRGM0QsIDB4MDQyMiwgMHg0RjNFLAorICAgIDB4MTgyOSwgMHg0RjNGLCAweDE4MzEsIDB4NEY0MSwgMHgxODJELCAweDRGNDMsIDB4MDQyNSwgMHg0RjQ2LCAweDA0MjgsCisgICAgMHg0RjQ3LCAweDA0MTksIDB4NEY0OCwgMHgwNDMxLCAweDRGNDksIDB4MTgyNiwgMHg0RjRDLCAweDE5MDAsIDB4NEY0RCwKKyAgICAweDA0MTcsIDB4NEY0RSwgMHgwNDJELCAweDRGNEYsIDB4MDQxOCwgMHg0RjUwLCAweDA0MjAsIDB4NEY1MSwgMHgwNDIxLAorICAgIDB4NEY1MiwgMHgxODJCLCAweDRGNTMsIDB4MTgyNywgMHg0RjU0LCAweDA0MjYsIDB4NEY1NSwgMHgwNDFFLCAweDRGNTYsCisgICAgMHgxODIzLCAweDRGNTcsIDB4MDQxQSwgMHg0RjU4LCAweDE4MkUsIDB4NEY1OSwgMHgwNDJGLCAweDRGNUEsIDB4MDQzMiwKKyAgICAweDRGNUIsIDB4MDQxRCwgMHg0RjVDLCAweDA0MkEsIDB4NEY1RCwgMHgwNDMwLCAweDRGNUUsIDB4MDQxQiwgMHg0RjVGLAorICAgIDB4MTgyQywgMHg0RjYwLCAweDA0MkIsIDB4NEY2MSwgMHgxODMyLCAweDRGNjIsIDB4MTgyNSwgMHg0RjYzLCAweDA0MjksCisgICAgMHg0RjY0LCAweDE4MjgsIDB4NEY2NywgMHgxODJBLCAweDRGNjksIDB4MDUzRCwgMHg0RjZBLCAweDE5MDIsIDB4NEY2QiwKKyAgICAweDE5MEUsIDB4NEY2QywgMHgwNTM1LCAweDRGNkUsIDB4MTkwRiwgMHg0RjZGLCAweDA1MzAsIDB4NEY3MCwgMHgwNTNBLAorICAgIDB4NEY3MywgMHgwNTMzLCAweDRGNzQsIDB4MThGQywgMHg0Rjc1LCAweDA1M0IsIDB4NEY3NiwgMHgxOEZCLCAweDRGNzcsCisgICAgMHgxOEZGLCAweDRGNzgsIDB4MTkwNiwgMHg0Rjc5LCAweDE5MDQsIDB4NEY3QSwgMHgwNTQzLCAweDRGN0IsIDB4MDUzRSwKKyAgICAweDRGN0MsIDB4MThGNiwgMHg0RjdELCAweDE4RjgsIDB4NEY3RSwgMHgwNTQwLCAweDRGN0YsIDB4MDUzNCwgMHg0RjgwLAorICAgIDB4MThGOSwgMHg0RjgxLCAweDE5MDUsIDB4NEY4MiwgMHgxOTBDLCAweDRGODMsIDB4MDUzOSwgMHg0Rjg0LCAweDE4RkUsCisgICAgMHg0Rjg1LCAweDE4RjcsIDB4NEY4NiwgMHgwNTM4LCAweDRGODcsIDB4MThGQSwgMHg0Rjg4LCAweDA1M0MsIDB4NEY4OSwKKyAgICAweDE4RkQsIDB4NEY4QiwgMHgwNTM3LCAweDRGOEQsIDB4MDUzMiwgMHg0RjhGLCAweDA1NDEsIDB4NEY5MCwgMHgxOTA3LAorICAgIDB4NEY5MSwgMHgwNTQyLCAweDRGOTIsIDB4MTkwQiwgMHg0Rjk0LCAweDE5MDksIDB4NEY5NSwgMHgxOTBELCAweDRGOTYsCisgICAgMHgwNTNGLCAweDRGOTcsIDB4MTkwMSwgMHg0Rjk4LCAweDE4RjUsIDB4NEY5QSwgMHgxOTAzLCAweDRGOUIsIDB4MDUzNiwKKyAgICAweDRGOUMsIDB4MTkwOCwgMHg0RjlELCAweDA1MzEsIDB4NEY5RSwgMHgxOTBBLCAweDRGQUUsIDB4MDZCNCwgMHg0RkFGLAorICAgIDB4MDZBOCwgMHg0RkIyLCAweDFBNUQsIDB4NEZCMywgMHgxQTY1LCAweDRGQjUsIDB4MDZBNywgMHg0RkI2LCAweDA2QUYsCisgICAgMHg0RkI3LCAweDA2QkIsIDB4NEZCOSwgMHgxQTZCLCAweDRGQkEsIDB4MUE2OSwgMHg0RkJCLCAweDFBNjQsIDB4NEZCRiwKKyAgICAweDA2QTksIDB4NEZDMCwgMHgxQTZBLCAweDRGQzEsIDB4MUE2MCwgMHg0RkMyLCAweDA2QjcsIDB4NEZDMywgMHgwNkFFLAorICAgIDB4NEZDNCwgMHgwNkI2LCAweDRGQzUsIDB4MUE1QiwgMHg0RkM3LCAweDFBNjcsIDB4NEZDOSwgMHgxQTVFLCAweDRGQ0EsCisgICAgMHgwNkIyLCAweDRGQ0IsIDB4MUE1RiwgMHg0RkNELCAweDFBNUEsIDB4NEZDRSwgMHgwNkI5LCAweDRGQ0YsIDB4MDZBQywKKyAgICAweDRGRDAsIDB4MDZCNSwgMHg0RkQxLCAweDA2QUIsIDB4NEZEMywgMHgxQTVDLCAweDRGRDQsIDB4MUE2MSwgMHg0RkQ2LAorICAgIDB4MUE2OCwgMHg0RkQ3LCAweDA2QjMsIDB4NEZEOCwgMHgwNkIwLCAweDRGRDksIDB4MUE2MywgMHg0RkRBLCAweDA2QjgsCisgICAgMHg0RkRCLCAweDFBNjYsIDB4NEZEQywgMHgxQTYyLCAweDRGREQsIDB4MDZBRCwgMHg0RkRFLCAweDA2QkEsIDB4NEZERiwKKyAgICAweDA2QjEsIDB4NEZFMCwgMHgwNkFBLCAweDRGRTEsIDB4MDZBNiwgMHg0RkVDLCAweDFBNkMsIDB4NEZFRSwgMHgwODRDLAorICAgIDB4NEZFRiwgMHgwODM2LCAweDRGRjEsIDB4MDg0NiwgMHg0RkYzLCAweDA4NEIsIDB4NEZGNCwgMHgxQzI0LCAweDRGRjUsCisgICAgMHgxQzIzLCAweDRGRjYsIDB4MUMyOCwgMHg0RkY3LCAweDFDMjksIDB4NEZGOCwgMHgwODM5LCAweDRGRkEsIDB4MDg0MiwKKyAgICAweDRGRkUsIDB4MDg0RiwgMHg1MDAwLCAweDA4NDMsIDB4NTAwNSwgMHgxQzFELCAweDUwMDYsIDB4MDgzQywgMHg1MDA3LAorICAgIDB4MUMxRSwgMHg1MDA5LCAweDA4NTEsIDB4NTAwQiwgMHgwODQ4LCAweDUwMEMsIDB4MDgzMywgMHg1MDBELCAweDA4MzQsCisgICAgMHg1MDBFLCAweDFDMzEsIDB4NTAwRiwgMHgwQTBDLCAweDUwMTEsIDB4MDg0MSwgMHg1MDEyLCAweDA4NDAsIDB4NTAxMywKKyAgICAweDFDMUYsIDB4NTAxNCwgMHgwODQ0LCAweDUwMTUsIDB4MUU0NSwgMHg1MDE2LCAweDA4M0IsIDB4NTAxNywgMHgxQzJBLAorICAgIDB4NTAxOCwgMHgwODRBLCAweDUwMTksIDB4MDg0OSwgMHg1MDFBLCAweDA4M0YsIDB4NTAxQiwgMHgxQzIyLCAweDUwMUMsCisgICAgMHgxQzJCLCAweDUwMUUsIDB4MUMxQywgMHg1MDFGLCAweDA4M0UsIDB4NTAyMCwgMHgxQzJDLCAweDUwMjEsIDB4MDg0NywKKyAgICAweDUwMjIsIDB4MUMyMCwgMHg1MDIzLCAweDA4MzUsIDB4NTAyNSwgMHgwODM4LCAweDUwMjYsIDB4MDgzNywgMHg1MDI3LAorICAgIDB4MUMyRCwgMHg1MDI4LCAweDA4NDUsIDB4NTAyOSwgMHgwODNBLCAweDUwMkEsIDB4MDg0RSwgMHg1MDJCLCAweDA4NTAsCisgICAgMHg1MDJDLCAweDFDMjcsIDB4NTAyRCwgMHgwODRELCAweDUwMkYsIDB4MUMyRiwgMHg1MDMwLCAweDFDMjEsIDB4NTAzMSwKKyAgICAweDFDMzAsIDB4NTAzMywgMHgxQzI1LCAweDUwMzUsIDB4MUMyRSwgMHg1MDM3LCAweDFDMjYsIDB4NTAzQywgMHgwODNELAorICAgIDB4NTA0MCwgMHgxRTRELCAweDUwNDEsIDB4MUU0MSwgMHg1MDQzLCAweDBBMDAsIDB4NTA0NSwgMHgxRTQ2LCAweDUwNDYsCisgICAgMHgxRTRDLCAweDUwNDcsIDB4MDlGRiwgMHg1MDQ4LCAweDFFM0YsIDB4NTA0OSwgMHgwQTAzLCAweDUwNEEsIDB4MUU0MywKKyAgICAweDUwNEIsIDB4MUUzQywgMHg1MDRDLCAweDBBMDEsIDB4NTA0RCwgMHgxRTQwLCAweDUwNEUsIDB4MEEwNiwgMHg1MDRGLAorICAgIDB4MEEwQiwgMHg1MDUxLCAweDFFNTEsIDB4NTA1MywgMHgxRTNCLCAweDUwNTUsIDB4MEEwNywgMHg1MDU3LCAweDFFNTAsCisgICAgMHg1MDVBLCAweDBBMDIsIDB4NTA1QiwgMHgxRTQyLCAweDUwNUMsIDB4MDlGRSwgMHg1MDVELCAweDFFM0QsIDB4NTA1RSwKKyAgICAweDFFMzksIDB4NTA1RiwgMHgxRTQ3LCAweDUwNjAsIDB4MUUzQSwgMHg1MDYxLCAweDFFMzgsIDB4NTA2MiwgMHgxRTQ0LAorICAgIDB4NTA2MywgMHgxRTRBLCAweDUwNjQsIDB4MUU0QiwgMHg1MDY1LCAweDBBMDQsIDB4NTA2OCwgMHgyMEI4LCAweDUwNjksCisgICAgMHgxRTQ4LCAweDUwNkEsIDB4MUUzNywgMHg1MDZCLCAweDFFNDksIDB4NTA2RCwgMHgwQTBFLCAweDUwNkUsIDB4MUU0RSwKKyAgICAweDUwNkYsIDB4MEEwRCwgMHg1MDcwLCAweDFFMzYsIDB4NTA3MiwgMHgxRTNFLCAweDUwNzMsIDB4MUU0RiwgMHg1MDc0LAorICAgIDB4MEEwOSwgMHg1MDc1LCAweDBBMDgsIDB4NTA3NiwgMHgwQTA1LCAweDUwNzcsIDB4MEEwQSwgMHg1MDdBLCAweDA5RkMsCisgICAgMHg1MDdELCAweDA5RkQsIDB4NTA4MCwgMHgwQkVDLCAweDUwODIsIDB4MjBCQiwgMHg1MDgzLCAweDIwQjQsIDB4NTA4NSwKKyAgICAweDBCRTksIDB4NTA4NywgMHgyMEJDLCAweDUwOEIsIDB4MjBCMiwgMHg1MDhDLCAweDIwQjUsIDB4NTA4RCwgMHgwQkU4LAorICAgIDB4NTA4RSwgMHgyMEI2LCAweDUwOTEsIDB4MEJFQiwgMHg1MDkyLCAweDIwQkEsIDB4NTA5NCwgMHgyMEIwLCAweDUwOTUsCisgICAgMHgyMEFGLCAweDUwOTYsIDB4MEJFRCwgMHg1MDk4LCAweDBCRUUsIDB4NTA5OSwgMHgwQkVBLCAweDUwOUEsIDB4MEJFRiwKKyAgICAweDUwOUIsIDB4MjBBRSwgMHg1MDlDLCAweDIwQjksIDB4NTA5RCwgMHgyMEI3LCAweDUwOUUsIDB4MjBCMSwgMHg1MEEyLAorICAgIDB4MEJFNywgMHg1MEEzLCAweDIwQjMsIDB4NTBBQywgMHgwREM1LCAweDUwQUQsIDB4MERCRiwgMHg1MEFFLCAweDIzNjcsCisgICAgMHg1MEFGLCAweDBEQzgsIDB4NTBCMCwgMHgyMzZELCAweDUwQjEsIDB4MjM3MCwgMHg1MEIyLCAweDBEQzEsIDB4NTBCMywKKyAgICAweDBEQzIsIDB4NTBCNCwgMHgyMzZBLCAweDUwQjUsIDB4MERDMCwgMHg1MEI2LCAweDIzNzMsIDB4NTBCNywgMHgwREM2LAorICAgIDB4NTBCOCwgMHgyMzc0LCAweDUwQkEsIDB4MjM2RiwgMHg1MEJCLCAweDBEQzcsIDB4NTBCRCwgMHgyMzY0LCAweDUwQkUsCisgICAgMHgwREM0LCAweDUwQkYsIDB4MjM2NSwgMHg1MEMxLCAweDIzNkUsIDB4NTBDMiwgMHgyMzZDLCAweDUwQzQsIDB4MjM2OCwKKyAgICAweDUwQzUsIDB4MERDMywgMHg1MEM2LCAweDIzNjYsIDB4NTBDNywgMHgwREM5LCAweDUwQzgsIDB4MjM2QiwgMHg1MEM5LAorICAgIDB4MjM3MiwgMHg1MENBLCAweDIzNjksIDB4NTBDQiwgMHgyMzcxLCAweDUwQ0UsIDB4MEY4OCwgMHg1MENGLCAweDBGODUsCisgICAgMHg1MEQxLCAweDBGODYsIDB4NTBEMywgMHgyNjFDLCAweDUwRDQsIDB4MjYxNCwgMHg1MEQ1LCAweDBGODQsIDB4NTBENiwKKyAgICAweDBGODEsIDB4NTBENywgMHgyNjE1LCAweDUwREEsIDB4MEY4MywgMHg1MERCLCAweDI2MTgsIDB4NTBERCwgMHgyNjFBLAorICAgIDB4NTBFMCwgMHgyNjIxLCAweDUwRTMsIDB4MjYyMCwgMHg1MEU0LCAweDI2MUIsIDB4NTBFNSwgMHgwRjgwLCAweDUwRTYsCisgICAgMHgyNjEzLCAweDUwRTcsIDB4MEY3RSwgMHg1MEU4LCAweDI2MTYsIDB4NTBFOSwgMHgwRjg5LCAweDUwRUEsIDB4MjYxOSwKKyAgICAweDUwRUMsIDB4MjYxRCwgMHg1MEVELCAweDBGODIsIDB4NTBFRSwgMHgwRjdGLCAweDUwRUYsIDB4MjYxRiwgMHg1MEYwLAorICAgIDB4MjYxRSwgMHg1MEYxLCAweDBGODcsIDB4NTBGMywgMHgyNjE3LCAweDUwRjUsIDB4MTEwNSwgMHg1MEY2LCAweDI4ODMsCisgICAgMHg1MEY4LCAweDI4ODAsIDB4NTBGOSwgMHgxMTA2LCAweDUwRkIsIDB4MTEwNCwgMHg1MEZELCAweDI4ODcsIDB4NTBGRSwKKyAgICAweDI4ODQsIDB4NTBGRiwgMHgyODdELCAweDUxMDAsIDB4MTEwMywgMHg1MTAyLCAweDExMDcsIDB4NTEwMywgMHgyODdFLAorICAgIDB4NTEwNCwgMHgxMTAyLCAweDUxMDUsIDB4MTEwQSwgMHg1MTA2LCAweDI4ODEsIDB4NTEwNywgMHgyODgyLCAweDUxMDgsCisgICAgMHgxMTA4LCAweDUxMDksIDB4MTEwOSwgMHg1MTBBLCAweDI4ODgsIDB4NTEwQiwgMHgyODg1LCAweDUxMEMsIDB4Mjg4NiwKKyAgICAweDUxMTAsIDB4MTI4RCwgMHg1MTExLCAweDJCMDQsIDB4NTExMiwgMHgxMjhBLCAweDUxMTMsIDB4MkIwMSwgMHg1MTE0LAorICAgIDB4MTI4QywgMHg1MTE1LCAweDEyOEUsIDB4NTExNywgMHgyQjAyLCAweDUxMTgsIDB4MTI4QiwgMHg1MTFBLCAweDJCMDMsCisgICAgMHg1MTFDLCAweDJCMDAsIDB4NTExRiwgMHgxM0I1LCAweDUxMjAsIDB4MkQzRSwgMHg1MTIxLCAweDEzQjYsIDB4NTEyMiwKKyAgICAweDJEM0MsIDB4NTEyNCwgMHgyRDNELCAweDUxMjUsIDB4MkQzQiwgMHg1MTI2LCAweDJEM0EsIDB4NTEyOSwgMHgyRDNGLAorICAgIDB4NTEyQSwgMHgxM0I0LCAweDUxMkQsIDB4MkYwRiwgMHg1MTJFLCAweDJGMTAsIDB4NTEzMCwgMHgyODdGLCAweDUxMzEsCisgICAgMHgyRjBFLCAweDUxMzIsIDB4MTNCNywgMHg1MTMzLCAweDE1NzUsIDB4NTEzNCwgMHgzMDdBLCAweDUxMzUsIDB4MzA3QiwKKyAgICAweDUxMzcsIDB4MTY2OCwgMHg1MTM4LCAweDE2NjksIDB4NTEzOSwgMHgzMkM2LCAweDUxM0EsIDB4MzJDNSwgMHg1MTNCLAorICAgIDB4MTZCQywgMHg1MTNDLCAweDE2QkIsIDB4NTEzRCwgMHgzNDBFLCAweDUxM0YsIDB4MDI1QywgMHg1MTQwLCAweDAyNzQsCisgICAgMHg1MTQxLCAweDAyQUEsIDB4NTE0MywgMHgwMkE5LCAweDUxNDQsIDB4MDMwMywgMHg1MTQ1LCAweDAzMDIsIDB4NTE0NiwKKyAgICAweDAzOEEsIDB4NTE0NywgMHgwMzg5LCAweDUxNDgsIDB4MDM4QiwgMHg1MTQ5LCAweDAzODgsIDB4NTE0QiwgMHgwNDM0LAorICAgIDB4NTE0QywgMHgwNDMzLCAweDUxNEQsIDB4MDQzNSwgMHg1MTUyLCAweDA1NDUsIDB4NTE1NCwgMHgwNTQ0LCAweDUxNTUsCisgICAgMHgwNTQ2LCAweDUxNTcsIDB4MDZCQywgMHg1MTU5LCAweDAxMTksIDB4NTE1QSwgMHgxQzMyLCAweDUxNUIsIDB4MDExQSwKKyAgICAweDUxNUMsIDB4MEEwRiwgMHg1MTVELCAweDAxMUMsIDB4NTE1RSwgMHgwMTFCLCAweDUxNUYsIDB4MjBCRCwgMHg1MTYxLAorICAgIDB4MDExRCwgMHg1MTYyLCAweDBGOEEsIDB4NTE2MywgMHgwMTFFLCAweDUxNjUsIDB4MDI1RCwgMHg1MTY3LCAweDAyQUIsCisgICAgMHg1MTY4LCAweDAzOEMsIDB4NTE2OSwgMHgwNTQ3LCAweDUxNkIsIDB4MDI1RSwgMHg1MTZDLCAweDAyQUUsIDB4NTE2RCwKKyAgICAweDAyQUMsIDB4NTE2RSwgMHgwMkFELCAweDUxNzEsIDB4MDM4RCwgMHg1MTc1LCAweDA0MzYsIDB4NTE3NiwgMHgwNTQ5LAorICAgIDB4NTE3NywgMHgwNTQ4LCAweDUxNzgsIDB4MDU0QSwgMHg1MTdDLCAweDA4NTIsIDB4NTE4MCwgMHgxMjhGLCAweDUxODIsCisgICAgMHgwMjFELCAweDUxODcsIDB4MTc3OSwgMHg1MTg4LCAweDM2QjYsIDB4NTE4OSwgMHgwMzA0LCAweDUxOEEsIDB4MDMwNSwKKyAgICAweDUxOEQsIDB4MDM4RSwgMHg1MThGLCAweDE4MzMsIDB4NTE5MSwgMHgwNkJFLCAweDUxOTIsIDB4MDZCRCwgMHg1MTkzLAorICAgIDB4MUMzNCwgMHg1MTk0LCAweDFDMzMsIDB4NTE5NSwgMHgwQTEwLCAweDUxOTYsIDB4MDIxRSwgMHg1MTk3LCAweDAyQUYsCisgICAgMHg1MTk4LCAweDE3ODAsIDB4NTE5RSwgMHgxOTEwLCAweDUxQTAsIDB4MDZCRiwgMHg1MUEyLCAweDA4NTUsIDB4NTFBNCwKKyAgICAweDA4NTMsIDB4NTFBNSwgMHgwODU0LCAweDUxQUEsIDB4MTI5MCwgMHg1MUFCLCAweDAyMUYsIDB4NTFBQywgMHgwMzA2LAorICAgIDB4NTFCMCwgMHgwMzhGLCAweDUxQjEsIDB4MTdDNiwgMHg1MUI2LCAweDA0MzcsIDB4NTFCNywgMHgwNDM4LCAweDUxQjksCisgICAgMHgxODM0LCAweDUxQkMsIDB4MTkxMSwgMHg1MUJELCAweDA1NEIsIDB4NTFCRSwgMHgxOTEyLCAweDUxQzQsIDB4MUMzNiwKKyAgICAweDUxQzUsIDB4MUMzNywgMHg1MUM2LCAweDA4NTgsIDB4NTFDOCwgMHgxQzM4LCAweDUxQ0EsIDB4MUMzNSwgMHg1MUNCLAorICAgIDB4MDg1OSwgMHg1MUNDLCAweDA4NTcsIDB4NTFDRCwgMHgwODU2LCAweDUxQ0UsIDB4MUMzOSwgMHg1MUQwLCAweDFFNTIsCisgICAgMHg1MUQ0LCAweDIwQkUsIDB4NTFENywgMHgyMzc1LCAweDUxRDgsIDB4MjYyMiwgMHg1MURDLCAweDExMEIsIDB4NTFERCwKKyAgICAweDEyOTEsIDB4NTFERSwgMHgyQjA1LCAweDUxRTAsIDB4MDI1RiwgMHg1MUUxLCAweDAyNkQsIDB4NTFGMCwgMHgwQTExLAorICAgIDB4NTFGMSwgMHgwQkYxLCAweDUxRjMsIDB4MEY4QiwgMHg1MUY1LCAweDE3NkUsIDB4NTFGNiwgMHgwMkIwLCAweDUxRjgsCisgICAgMHgwMzA5LCAweDUxRjksIDB4MDMwNywgMHg1MUZBLCAweDAzMDgsIDB4NTFGRCwgMHgwNTRDLCAweDUyMDAsIDB4MDI2MCwKKyAgICAweDUyMDEsIDB4MDI2MSwgMHg1MjAyLCAweDM2QjMsIDB4NTIwMywgMHgwMjc1LCAweDUyMDYsIDB4MDJCMSwgMHg1MjA3LAorICAgIDB4MDJCMiwgMHg1MjA4LCAweDAyQjMsIDB4NTIwOSwgMHgxNzk3LCAweDUyMEEsIDB4MDMwQSwgMHg1MjBDLCAweDE3OTYsCisgICAgMHg1MjBFLCAweDAzOTMsIDB4NTIxMCwgMHgxN0M4LCAweDUyMTEsIDB4MDM5MSwgMHg1MjEyLCAweDAzOTIsIDB4NTIxMywKKyAgICAweDE3QzcsIDB4NTIxNiwgMHgwMzk0LCAweDUyMTcsIDB4MDM5MCwgMHg1MjFDLCAweDE4MzUsIDB4NTIxRCwgMHgwNjhCLAorICAgIDB4NTIxRSwgMHgxODM2LCAweDUyMjEsIDB4MTgzNywgMHg1MjI0LCAweDA0M0EsIDB4NTIyNSwgMHgwNDM5LCAweDUyMjgsCisgICAgMHgwNDNELCAweDUyMjksIDB4MDQzQiwgMHg1MjJBLCAweDA0M0MsIDB4NTIyRSwgMHgwNTUyLCAweDUyMzAsIDB4MDU1MSwKKyAgICAweDUyMzEsIDB4MTkxNywgMHg1MjMyLCAweDE5MTQsIDB4NTIzMywgMHgxOTE1LCAweDUyMzUsIDB4MTkxMywgMHg1MjM2LAorICAgIDB4MDU1MywgMHg1MjM3LCAweDA1NEYsIDB4NTIzOCwgMHgwNTRFLCAweDUyM0EsIDB4MDU1MCwgMHg1MjNCLCAweDA1NEQsCisgICAgMHg1MjQxLCAweDA1NTQsIDB4NTI0MywgMHgwNkMxLCAweDUyNDQsIDB4MUE2RCwgMHg1MjQ2LCAweDE5MTYsIDB4NTI0NywKKyAgICAweDA2QzYsIDB4NTI0OSwgMHgxQTZFLCAweDUyNEEsIDB4MDZDMiwgMHg1MjRCLCAweDA2QzUsIDB4NTI0QywgMHgwNkM0LAorICAgIDB4NTI0RCwgMHgwNkMzLCAweDUyNEUsIDB4MDZDMCwgMHg1MjUyLCAweDFDM0MsIDB4NTI1NCwgMHgwODVDLCAweDUyNTUsCisgICAgMHgxQzNGLCAweDUyNTYsIDB4MDg1QSwgMHg1MjVBLCAweDFDM0IsIDB4NTI1QiwgMHgwODVELCAweDUyNUMsIDB4MDg1QiwKKyAgICAweDUyNUQsIDB4MDg1RSwgMHg1MjVFLCAweDFDM0QsIDB4NTI1RiwgMHgxQzNFLCAweDUyNjEsIDB4MUMzQSwgMHg1MjYyLAorICAgIDB4MUM0MCwgMHg1MjY5LCAweDBCRjUsIDB4NTI2QSwgMHgwQTEyLCAweDUyNkIsIDB4MUU1MywgMHg1MjZDLCAweDFFNTUsCisgICAgMHg1MjZELCAweDFFNTQsIDB4NTI2RSwgMHgxRTU2LCAweDUyNkYsIDB4MEExMywgMHg1MjcyLCAweDBCRjIsIDB4NTI3NCwKKyAgICAweDBCRjMsIDB4NTI3NSwgMHgwQkY0LCAweDUyNzcsIDB4MERDQiwgMHg1Mjc4LCAweDIzNzcsIDB4NTI3QSwgMHgyMzc2LAorICAgIDB4NTI3QiwgMHgyMzc4LCAweDUyN0MsIDB4MjM3OSwgMHg1MjdELCAweDBEQ0MsIDB4NTI3RiwgMHgwRENBLCAweDUyODAsCisgICAgMHgyNjIzLCAweDUyODEsIDB4MjYyNCwgMHg1MjgyLCAweDBGOEQsIDB4NTI4MywgMHgwRjhDLCAweDUyODQsIDB4Mjc3NiwKKyAgICAweDUyODcsIDB4MTEwQywgMHg1Mjg4LCAweDExMEQsIDB4NTI4OSwgMHgxMTBFLCAweDUyOEEsIDB4MTExMCwgMHg1MjhCLAorICAgIDB4Mjg4OSwgMHg1MjhDLCAweDI4OEEsIDB4NTI4RCwgMHgxMTBGLCAweDUyOTEsIDB4MTI5MiwgMHg1MjkzLCAweDEyOTMsCisgICAgMHg1Mjk2LCAweDMwN0MsIDB4NTI5NywgMHgzMkM4LCAweDUyOTgsIDB4MzJDNywgMHg1Mjk5LCAweDM0MEYsIDB4NTI5QiwKKyAgICAweDAyNjIsIDB4NTI5RiwgMHgwMzBDLCAweDUyQTAsIDB4MDMwQiwgMHg1MkEzLCAweDAzOTUsIDB4NTJBNiwgMHgxN0M5LAorICAgIDB4NTJBOSwgMHgwNDNGLCAweDUyQUEsIDB4MDQ0MCwgMHg1MkFCLCAweDA0M0UsIDB4NTJBQywgMHgwNDQxLCAweDUyQUQsCisgICAgMHgxODM4LCAweDUyQUUsIDB4MTgzOSwgMHg1MkJCLCAweDA1NTYsIDB4NTJCQywgMHgxOTE4LCAweDUyQkUsIDB4MDU1NSwKKyAgICAweDUyQzAsIDB4MUE2RiwgMHg1MkMxLCAweDA2Q0EsIDB4NTJDMiwgMHgxQTcwLCAweDUyQzMsIDB4MDZDOSwgMHg1MkM3LAorICAgIDB4MDZDNywgMHg1MkM5LCAweDA2QzgsIDB4NTJDRCwgMHgxQzQxLCAweDUyRDIsIDB4MEExNCwgMHg1MkQzLCAweDFFNTgsCisgICAgMHg1MkQ1LCAweDBBMTcsIDB4NTJENiwgMHgxRTU3LCAweDUyRDcsIDB4MEFDRiwgMHg1MkQ4LCAweDBBMTYsIDB4NTJEOSwKKyAgICAweDBBMTUsIDB4NTJEQiwgMHgwQkY4LCAweDUyREQsIDB4MEJGNywgMHg1MkRFLCAweDBCRjYsIDB4NTJERiwgMHgwRENELAorICAgIDB4NTJFMiwgMHgwREQwLCAweDUyRTMsIDB4MEREMSwgMHg1MkU0LCAweDBEQ0YsIDB4NTJFNiwgMHgwRENFLCAweDUyRTksCisgICAgMHgyNjI1LCAweDUyRUIsIDB4MjYyNiwgMHg1MkVGLCAweDI4OEMsIDB4NTJGMCwgMHgxMTExLCAweDUyRjEsIDB4Mjg4QiwKKyAgICAweDUyRjMsIDB4MTI5NCwgMHg1MkY0LCAweDJENDAsIDB4NTJGNSwgMHgxM0I4LCAweDUyRjcsIDB4MzA3RCwgMHg1MkY4LAorICAgIDB4MTYwOSwgMHg1MkY5LCAweDAyMjAsIDB4NTJGQSwgMHgwMjc2LCAweDUyRkIsIDB4MDJCNCwgMHg1MkZDLCAweDE3ODEsCisgICAgMHg1MkZFLCAweDAyQjUsIDB4NTJGRiwgMHgwMkI2LCAweDUzMDUsIDB4MDMwRCwgMHg1MzA2LCAweDAzMEUsIDB4NTMwOCwKKyAgICAweDAzOTYsIDB4NTMwOSwgMHgxODNBLCAweDUzMEEsIDB4MTkxOSwgMHg1MzBCLCAweDE5MUEsIDB4NTMwRCwgMHgwNkNCLAorICAgIDB4NTMwRSwgMHgxQzQyLCAweDUzMEYsIDB4MEExOSwgMHg1MzEwLCAweDBBMTgsIDB4NTMxMSwgMHgyMEMwLCAweDUzMTIsCisgICAgMHgyMEJGLCAweDUzMTUsIDB4MDI2MywgMHg1MzE2LCAweDAyQjcsIDB4NTMxNywgMHgwMzBGLCAweDUzMTksIDB4MEExQSwKKyAgICAweDUzMUEsIDB4MTc2RiwgMHg1MzFDLCAweDE3OTgsIDB4NTMxRCwgMHgwMzEwLCAweDUzMUYsIDB4MTdDQiwgMHg1MzIwLAorICAgIDB4MDM5OCwgMHg1MzIxLCAweDAzOTcsIDB4NTMyMiwgMHgxN0NBLCAweDUzMjMsIDB4MDQ0MiwgMHg1MzJBLCAweDA4NUYsCisgICAgMHg1MzJELCAweDFFNTksIDB4NTMyRiwgMHgwREQyLCAweDUzMzAsIDB4MjYyNywgMHg1MzMxLCAweDBGOEUsIDB4NTMzNCwKKyAgICAweDJCMDYsIDB4NTMzNywgMHgzMUM3LCAweDUzMzgsIDB4MDIyMSwgMHg1MzM5LCAweDAyQjgsIDB4NTMzQywgMHgxOTFCLAorICAgIDB4NTMzRCwgMHgxQTcxLCAweDUzM0UsIDB4MEExRCwgMHg1MzNGLCAweDBBMUIsIDB4NTM0MCwgMHgwQTFDLCAweDUzNDEsCisgICAgMHgwMjY0LCAweDUzNDMsIDB4MDI3NywgMHg1MzQ0LCAweDAxNkIsIDB4NTM0NSwgMHgwMkJCLCAweDUzNDcsIDB4MDJCQSwKKyAgICAweDUzNDgsIDB4MDJCOSwgMHg1MzQ5LCAweDAzMTMsIDB4NTM0QSwgMHgwMzEyLCAweDUzNEMsIDB4MTc5OSwgMHg1MzRELAorICAgIDB4MTdDQywgMHg1MzUxLCAweDA1NUEsIDB4NTM1MiwgMHgwNTU3LCAweDUzNTMsIDB4MDU1OSwgMHg1MzU0LCAweDA1NTgsCisgICAgMHg1MzU3LCAweDA2Q0MsIDB4NTM1QSwgMHgwQkY5LCAweDUzNUMsIDB4MDI2NSwgMHg1MzVFLCAweDAyQkMsIDB4NTM2MCwKKyAgICAweDAzMTUsIDB4NTM2MSwgMHgwMzE0LCAweDUzNjMsIDB4MTgzQiwgMHg1MzY2LCAweDA1NUIsIDB4NTM2OSwgMHgwMjIyLAorICAgIDB4NTM2QywgMHgxNzgyLCAweDUzNkUsIDB4MDMxNywgMHg1MzZGLCAweDAzMTYsIDB4NTM3MCwgMHgwMzk5LCAweDUzNzEsCisgICAgMHgwMzlBLCAweDUzNzIsIDB4MTgzQywgMHg1MzczLCAweDA0NDMsIDB4NTM3NSwgMHgwNDQ0LCAweDUzNzcsIDB4MDU1QywKKyAgICAweDUzNzgsIDB4MDU1RCwgMHg1Mzc5LCAweDA1NUUsIDB4NTM3QiwgMHgwNkNELCAweDUzN0MsIDB4MUE3MiwgMHg1MzdGLAorICAgIDB4MDg2MCwgMHg1MzgyLCAweDE3NzAsIDB4NTM4NCwgMHgwMkJELCAweDUzOEEsIDB4MTdDRCwgMHg1MzhFLCAweDE4M0QsCisgICAgMHg1MzhGLCAweDE4M0UsIDB4NTM5MiwgMHgxOTFDLCAweDUzOTQsIDB4MTkxRCwgMHg1Mzk2LCAweDFBNzQsIDB4NTM5NywKKyAgICAweDFBNzMsIDB4NTM5OCwgMHgxQTc2LCAweDUzOTksIDB4MUE3NSwgMHg1MzlBLCAweDA2Q0UsIDB4NTM5QywgMHgxRTVBLAorICAgIDB4NTM5RCwgMHgwODYyLCAweDUzOUUsIDB4MUM0MywgMHg1MzlGLCAweDA4NjEsIDB4NTNBNCwgMHgyMEMxLCAweDUzQTUsCisgICAgMHgwQkZBLCAweDUzQTcsIDB4MjBDMiwgMHg1M0FDLCAweDI2MjgsIDB4NTNBRCwgMHgwRjhGLCAweDUzQjIsIDB4MTExMiwKKyAgICAweDUzQjQsIDB4MzA3RSwgMHg1M0I2LCAweDAyMjMsIDB4NTNCOSwgMHgxNzgzLCAweDUzQkIsIDB4MDMxOCwgMHg1M0MzLAorICAgIDB4MEExRSwgMHg1M0M4LCAweDAyNjYsIDB4NTNDOSwgMHgwMjc4LCAweDUzQ0EsIDB4MDJCRiwgMHg1M0NCLCAweDAyQkUsCisgICAgMHg1M0NELCAweDAyQzAsIDB4NTNENCwgMHgwNTYwLCAweDUzRDYsIDB4MDU1RiwgMHg1M0Q3LCAweDA1NjEsIDB4NTNEQiwKKyAgICAweDA2Q0YsIDB4NTNERiwgMHgwODYzLCAweDUzRTEsIDB4MkIwNywgMHg1M0UyLCAweDE0QzksIDB4NTNFMywgMHgwMjc5LAorICAgIDB4NTNFNCwgMHgwMzFBLCAweDUzRTUsIDB4MDMyOSwgMHg1M0U2LCAweDAzMjQsIDB4NTNFOCwgMHgwMzFGLCAweDUzRTksCisgICAgMHgwMzFFLCAweDUzRUEsIDB4MDMyNSwgMHg1M0VCLCAweDAzMjMsIDB4NTNFQywgMHgwMzFDLCAweDUzRUQsIDB4MDMyQSwKKyAgICAweDUzRUUsIDB4MDMxRCwgMHg1M0VGLCAweDAzMTksIDB4NTNGMCwgMHgwMzI4LCAweDUzRjEsIDB4MDMyNywgMHg1M0YyLAorICAgIDB4MDMyNiwgMHg1M0YzLCAweDAzMUIsIDB4NTNGNSwgMHgwMzIyLCAweDUzRjgsIDB4MDMyMSwgMHg1M0ZCLCAweDAzMkIsCisgICAgMHg1M0ZDLCAweDAzMjAsIDB4NTQwMSwgMHgwM0EwLCAweDU0MDMsIDB4MDNBNiwgMHg1NDA0LCAweDAzQTIsIDB4NTQwNiwKKyAgICAweDAzQTgsIDB4NTQwNywgMHgxN0NFLCAweDU0MDgsIDB4MDNBNSwgMHg1NDA5LCAweDAzOUIsIDB4NTQwQSwgMHgwMzlFLAorICAgIDB4NTQwQiwgMHgwM0ExLCAweDU0MEMsIDB4MDM5RCwgMHg1NDBELCAweDAzQTQsIDB4NTQwRSwgMHgwM0E3LCAweDU0MEYsCisgICAgMHgwMzlDLCAweDU0MTAsIDB4MDM5RiwgMHg1NDExLCAweDAzQTMsIDB4NTQxMiwgMHgwM0E5LCAweDU0MTgsIDB4MTg0NywKKyAgICAweDU0MTksIDB4MTg0NCwgMHg1NDFCLCAweDA0NTEsIDB4NTQxQywgMHgxODQ1LCAweDU0MUQsIDB4MDQ0NSwgMHg1NDFFLAorICAgIDB4MDQ0NywgMHg1NDFGLCAweDA0NUYsIDB4NTQyMCwgMHgwNDVBLCAweDU0MjQsIDB4MTg0QywgMHg1NDI1LCAweDE4NDYsCisgICAgMHg1NDI2LCAweDA0NDksIDB4NTQyNywgMHgwNDRCLCAweDU0MjgsIDB4MTg0QiwgMHg1NDI5LCAweDA0NTIsIDB4NTQyQSwKKyAgICAweDE4NDEsIDB4NTQyQiwgMHgwNDVFLCAweDU0MkMsIDB4MDQ2MCwgMHg1NDJELCAweDA0NDYsIDB4NTQyRSwgMHgwNDU3LAorICAgIDB4NTQzMCwgMHgxODNGLCAweDU0MzEsIDB4MDQ1RCwgMHg1NDMzLCAweDA0NEUsIDB4NTQzNSwgMHgwNDU4LCAweDU0MzYsCisgICAgMHgwNDU5LCAweDU0MzcsIDB4MTg0MCwgMHg1NDM4LCAweDA0NTYsIDB4NTQzOSwgMHgwNDU0LCAweDU0M0IsIDB4MDQ1NSwKKyAgICAweDU0M0MsIDB4MDQ1QiwgMHg1NDNELCAweDE4NDgsIDB4NTQzRSwgMHgwNDQ4LCAweDU0NDAsIDB4MDQ1QywgMHg1NDQxLAorICAgIDB4MTg0QSwgMHg1NDQyLCAweDA0NTAsIDB4NTQ0MywgMHgwNDRELCAweDU0NDUsIDB4MTg0MywgMHg1NDQ2LCAweDA0NEMsCisgICAgMHg1NDQ3LCAweDE4NEQsIDB4NTQ0OCwgMHgwNDRGLCAweDU0NEEsIDB4MDQ1MywgMHg1NDRFLCAweDA0NEEsIDB4NTQ0RiwKKyAgICAweDE4NDksIDB4NTQ1NCwgMHgxODQyLCAweDU0NjAsIDB4MTkyRSwgMHg1NDYxLCAweDE5MkQsIDB4NTQ2MiwgMHgwNTczLAorICAgIDB4NTQ2MywgMHgxOTMwLCAweDU0NjQsIDB4MTkzMiwgMHg1NDY1LCAweDE5MjcsIDB4NTQ2NiwgMHgxOTJBLCAweDU0NjcsCisgICAgMHgxOTMxLCAweDU0NjgsIDB4MDU3NCwgMHg1NDZCLCAweDE5MjQsIDB4NTQ2QywgMHgxOTI4LCAweDU0NkYsIDB4MTkyQywKKyAgICAweDU0NzAsIDB4MUE4NSwgMHg1NDcxLCAweDA1NkYsIDB4NTQ3MiwgMHgxQTg5LCAweDU0NzMsIDB4MDU2MiwgMHg1NDc0LAorICAgIDB4MTkyOSwgMHg1NDc1LCAweDA1NjMsIDB4NTQ3NiwgMHgwNTcwLCAweDU0NzcsIDB4MDU2OSwgMHg1NDc4LCAweDA1NjUsCisgICAgMHg1NDdBLCAweDE5MjUsIDB4NTQ3QiwgMHgwNTY4LCAweDU0N0MsIDB4MDU2RCwgMHg1NDdELCAweDA1NzYsIDB4NTQ3RSwKKyAgICAweDE5MjYsIDB4NTQ3RiwgMHgxOTFGLCAweDU0ODAsIDB4MDU2NywgMHg1NDgxLCAweDE5MjAsIDB4NTQ4MiwgMHgxOTIyLAorICAgIDB4NTQ4NCwgMHgwNTZBLCAweDU0ODYsIDB4MDU2QywgMHg1NDg3LCAweDE5MUUsIDB4NTQ4OCwgMHgxOTIzLCAweDU0OEIsCisgICAgMHgwNTc1LCAweDU0OEMsIDB4MDU3MSwgMHg1NDhELCAweDE5MkIsIDB4NTQ4RSwgMHgwNTc3LCAweDU0OTAsIDB4MDU2RSwKKyAgICAweDU0OTEsIDB4MTkyMSwgMHg1NDkyLCAweDA1NkIsIDB4NTQ5NSwgMHgwNTY2LCAweDU0OTYsIDB4MDU2NCwgMHg1NDk4LAorICAgIDB4MTkyRiwgMHg1NDlBLCAweDA1NzIsIDB4NTRBMCwgMHgxQTg0LCAweDU0QTEsIDB4MUE3OCwgMHg1NEEyLCAweDFBODcsCisgICAgMHg1NEE1LCAweDFBN0EsIDB4NTRBNiwgMHgwNkQ2LCAweDU0QTcsIDB4MDZFNCwgMHg1NEE4LCAweDA2RDIsIDB4NTRBOSwKKyAgICAweDA2RTMsIDB4NTRBQSwgMHgwNkRCLCAweDU0QUIsIDB4MDZFMCwgMHg1NEFDLCAweDA2RDAsIDB4NTRBRCwgMHgxQTc5LAorICAgIDB4NTRBRSwgMHgxQTdGLCAweDU0QUYsIDB4MDZERiwgMHg1NEIwLCAweDFBOEIsIDB4NTRCMSwgMHgwNkUxLCAweDU0QjMsCisgICAgMHgwNkQ3LCAweDU0QjYsIDB4MUE4MSwgMHg1NEI3LCAweDFBN0UsIDB4NTRCOCwgMHgwNkQ1LCAweDU0QkEsIDB4MUE3NywKKyAgICAweDU0QkIsIDB4MDZFMiwgMHg1NEJDLCAweDFBODYsIDB4NTRCRCwgMHgwNkRBLCAweDU0QkUsIDB4MUE4OCwgMHg1NEJGLAorICAgIDB4MDZFNSwgMHg1NEMwLCAweDA2RDEsIDB4NTRDMSwgMHgwNkRDLCAweDU0QzIsIDB4MDZEOSwgMHg1NEMzLCAweDFBN0MsCisgICAgMHg1NEM0LCAweDA2REQsIDB4NTRDNSwgMHgxQTgyLCAweDU0QzYsIDB4MUE4MywgMHg1NEM3LCAweDA2RDgsIDB4NTRDOCwKKyAgICAweDA2REUsIDB4NTRDOSwgMHgwNkQ0LCAweDU0Q0UsIDB4MDZEMywgMHg1NENGLCAweDFBN0IsIDB4NTRENiwgMHgxQTgwLAorICAgIDB4NTRERSwgMHgxQThBLCAweDU0RTAsIDB4MUM1NywgMHg1NEUxLCAweDA4NzAsIDB4NTRFMiwgMHgxQzQ1LCAweDU0RTQsCisgICAgMHgxQzRBLCAweDU0RTUsIDB4MDg2OSwgMHg1NEU2LCAweDA4NzQsIDB4NTRFNywgMHgxQzQ4LCAweDU0RTgsIDB4MDg2NCwKKyAgICAweDU0RTksIDB4MDg2RSwgMHg1NEVBLCAweDA4NzMsIDB4NTRFQiwgMHgxQzRGLCAweDU0RUQsIDB4MDg2RiwgMHg1NEVFLAorICAgIDB4MDg3MiwgMHg1NEYxLCAweDFDNTIsIDB4NTRGMiwgMHgwODZBLCAweDU0RjMsIDB4MUM0OSwgMHg1NEY3LCAweDFDNTUsCisgICAgMHg1NEY4LCAweDFDNTYsIDB4NTRGQSwgMHgwODZDLCAweDU0RkIsIDB4MUM1NCwgMHg1NEZDLCAweDA4NjgsIDB4NTRGRCwKKyAgICAweDA4NzcsIDB4NTRGRiwgMHgxQzRDLCAweDU1MDEsIDB4MDg2NiwgMHg1NTAzLCAweDFDNTksIDB4NTUwNCwgMHgxQzRELAorICAgIDB4NTUwNSwgMHgxQzUxLCAweDU1MDYsIDB4MDg2QiwgMHg1NTA3LCAweDA4NzYsIDB4NTUwOCwgMHgxQzRFLCAweDU1MDksCisgICAgMHgwODcxLCAweDU1MEEsIDB4MUM1MywgMHg1NTBCLCAweDFDNUEsIDB4NTUwQywgMHgxRTY5LCAweDU1MEUsIDB4MUM1OCwKKyAgICAweDU1MEYsIDB4MDg3OCwgMHg1NTEwLCAweDA4NjUsIDB4NTUxMSwgMHgxQzUwLCAweDU1MTIsIDB4MUM0NywgMHg1NTE0LAorICAgIDB4MDg2RCwgMHg1NTE3LCAweDFDNDYsIDB4NTUxQSwgMHgxQzRCLCAweDU1MjYsIDB4MUM0NCwgMHg1NTI3LCAweDA4NzUsCisgICAgMHg1NTJBLCAweDFFNjEsIDB4NTUyQywgMHgwQTMxLCAweDU1MkQsIDB4MUU2RiwgMHg1NTJFLCAweDBBMkYsIDB4NTUyRiwKKyAgICAweDBBMkMsIDB4NTUzMCwgMHgxRTY2LCAweDU1MzEsIDB4MEEyOCwgMHg1NTMyLCAweDFFNkEsIDB4NTUzMywgMHgwQTMzLAorICAgIDB4NTUzNCwgMHgxRTYwLCAweDU1MzUsIDB4MUU2NSwgMHg1NTM2LCAweDFFNjQsIDB4NTUzNywgMHgwODY3LCAweDU1MzgsCisgICAgMHgwQTJFLCAweDU1MzksIDB4MUU2RCwgMHg1NTNCLCAweDFFNzAsIDB4NTUzQywgMHgxRTVELCAweDU1M0UsIDB4MEMwQywKKyAgICAweDU1NDAsIDB4MUU3MSwgMHg1NTQxLCAweDBBMzQsIDB4NTU0MywgMHgwQTI2LCAweDU1NDQsIDB4MEEyMywgMHg1NTQ1LAorICAgIDB4MUU2OCwgMHg1NTQ2LCAweDBBMjAsIDB4NTU0OCwgMHgxRTZFLCAweDU1NEEsIDB4MEEyNywgMHg1NTRCLCAweDFFNzIsCisgICAgMHg1NTRELCAweDFFNUUsIDB4NTU0RSwgMHgxRTZDLCAweDU1NEYsIDB4MEEyQSwgMHg1NTUwLCAweDFFNUYsIDB4NTU1MSwKKyAgICAweDFFNjIsIDB4NTU1MiwgMHgxRTY3LCAweDU1NTUsIDB4MEEyQiwgMHg1NTU2LCAweDBBMjksIDB4NTU1NywgMHgwQTM1LAorICAgIDB4NTU1QywgMHgwQTMwLCAweDU1NUUsIDB4MEEyNCwgMHg1NTVGLCAweDBBQkMsIDB4NTU2MSwgMHgwQTI1LCAweDU1NjIsCisgICAgMHgxRTYzLCAweDU1NjMsIDB4MEEzMiwgMHg1NTY0LCAweDBBMkQsIDB4NTU2NSwgMHgxRTZCLCAweDU1NjYsIDB4MEEyMiwKKyAgICAweDU1NkEsIDB4MEEyMSwgMHg1NTc1LCAweDFFNUIsIDB4NTU3NiwgMHgxRTVDLCAweDU1NzcsIDB4MjBDNywgMHg1NTdCLAorICAgIDB4MEJGQiwgMHg1NTdDLCAweDBCRkUsIDB4NTU3RCwgMHgyMEQyLCAweDU1N0UsIDB4MEMxMiwgMHg1NTdGLCAweDIwRDUsCisgICAgMHg1NTgwLCAweDBCRkMsIDB4NTU4MSwgMHgyMENFLCAweDU1ODIsIDB4MEMwMiwgMHg1NTgzLCAweDBDMDgsIDB4NTU4NCwKKyAgICAweDBEMUIsIDB4NTU4NywgMHgwQzA2LCAweDU1ODgsIDB4MjBDQiwgMHg1NTg5LCAweDBDMTMsIDB4NTU4QSwgMHgwQkZGLAorICAgIDB4NTU4QiwgMHgwQzA3LCAweDU1OEMsIDB4MjBEMywgMHg1NThELCAweDIzODcsIDB4NTU4RSwgMHgyMEQ4LCAweDU1OEYsCisgICAgMHgyMENDLCAweDU1OTEsIDB4MjBDMywgMHg1NTkyLCAweDIwRDAsIDB4NTU5MywgMHgyMENBLCAweDU1OTQsIDB4MEMwNSwKKyAgICAweDU1OTUsIDB4MjBENiwgMHg1NTk4LCAweDBDMDEsIDB4NTU5OSwgMHgwQzE1LCAweDU1OUEsIDB4MEMwRSwgMHg1NTlDLAorICAgIDB4MEMwMywgMHg1NTlELCAweDBDMDAsIDB4NTU5RiwgMHgwQzBCLCAweDU1QTEsIDB4MjBENywgMHg1NUEyLCAweDIwQzksCisgICAgMHg1NUEzLCAweDIwQ0YsIDB4NTVBNCwgMHgyMEQxLCAweDU1QTUsIDB4MjBDNSwgMHg1NUE2LCAweDIwRDQsIDB4NTVBNywKKyAgICAweDBCRkQsIDB4NTVBOCwgMHgyMEM0LCAweDU1QUEsIDB4MEMwNCwgMHg1NUFCLCAweDBDMTQsIDB4NTVBQywgMHgwQzEwLAorICAgIDB4NTVBRCwgMHgyMEM2LCAweDU1QUUsIDB4MEMwQSwgMHg1NUIxLCAweDBDMTEsIDB4NTVCMiwgMHgwQzBELCAweDU1QjMsCisgICAgMHgwQzA5LCAweDU1QjUsIDB4MjBDRCwgMHg1NUJCLCAweDBDMEYsIDB4NTVCRiwgMHgyMzg1LCAweDU1QzAsIDB4MjM4MSwKKyAgICAweDU1QzIsIDB4MjM5MCwgMHg1NUMzLCAweDIzN0EsIDB4NTVDNCwgMHgyMzgzLCAweDU1QzUsIDB4MERFMCwgMHg1NUM2LAorICAgIDB4MERFMSwgMHg1NUM3LCAweDBERDksIDB4NTVDOCwgMHgyMzhDLCAweDU1QzksIDB4MERFMywgMHg1NUNBLCAweDIzN0YsCisgICAgMHg1NUNCLCAweDIzN0UsIDB4NTVDQywgMHgyMzdDLCAweDU1Q0QsIDB4MjM4RSwgMHg1NUNFLCAweDBERDcsIDB4NTVDRiwKKyAgICAweDIzODgsIDB4NTVEMCwgMHgyMzdELCAweDU1RDEsIDB4MEREQSwgMHg1NUQyLCAweDIzODYsIDB4NTVEMywgMHgwREQ1LAorICAgIDB4NTVENCwgMHgyMzgyLCAweDU1RDUsIDB4MjM4OSwgMHg1NUQ2LCAweDIzOEIsIDB4NTVEOSwgMHgyMzhGLCAweDU1REEsCisgICAgMHgwRERFLCAweDU1REIsIDB4MjM3QiwgMHg1NURDLCAweDBERDgsIDB4NTVERCwgMHgyMzgwLCAweDU1REYsIDB4MEREMywKKyAgICAweDU1RTEsIDB4MERERiwgMHg1NUUyLCAweDIzOEEsIDB4NTVFMywgMHgwRERCLCAweDU1RTQsIDB4MEREQywgMHg1NUU1LAorICAgIDB4MERFMiwgMHg1NUU2LCAweDBERDYsIDB4NTVFNywgMHgwMTFGLCAweDU1RTgsIDB4MERENCwgMHg1NUU5LCAweDIzODQsCisgICAgMHg1NUVGLCAweDBEREQsIDB4NTVGMiwgMHgyMzhELCAweDU1RjYsIDB4MEY5RiwgMHg1NUY3LCAweDBGOUEsIDB4NTVGOSwKKyAgICAweDI2MzcsIDB4NTVGQSwgMHgyNjMzLCAweDU1RkMsIDB4MjYyRCwgMHg1NUZELCAweDBGOTQsIDB4NTVGRSwgMHgwRjkwLAorICAgIDB4NTVGRiwgMHgyNjM2LCAweDU2MDAsIDB4MEY5MSwgMHg1NjAxLCAweDI2MzAsIDB4NTYwMiwgMHgyNjMyLCAweDU2MDQsCisgICAgMHgyNjM1LCAweDU2MDYsIDB4MEY5NiwgMHg1NjA4LCAweDBGOUQsIDB4NTYwOSwgMHgwRjk3LCAweDU2MEMsIDB4MjYyQiwKKyAgICAweDU2MEQsIDB4MEY5OCwgMHg1NjBFLCAweDBGOTksIDB4NTYwRiwgMHgyNjJFLCAweDU2MTAsIDB4MEY5RSwgMHg1NjEyLAorICAgIDB4MjYyQywgMHg1NjEzLCAweDI2MzEsIDB4NTYxNCwgMHgwRjk1LCAweDU2MTUsIDB4MjYyQSwgMHg1NjE2LCAweDBGOUIsCisgICAgMHg1NjE3LCAweDBGOTMsIDB4NTYxQiwgMHgwRjkyLCAweDU2MUMsIDB4MjYyRiwgMHg1NjFELCAweDI2MzQsIDB4NTYxRiwKKyAgICAweDBGOUMsIDB4NTYyNywgMHgyNjI5LCAweDU2MjksIDB4MTExOSwgMHg1NjJBLCAweDI4OUQsIDB4NTYyQywgMHgyODlBLAorICAgIDB4NTYyRSwgMHgxMTEzLCAweDU2MkYsIDB4MTExRiwgMHg1NjMwLCAweDExMjAsIDB4NTYzMiwgMHgxMTE2LCAweDU2MzMsCisgICAgMHgyODk4LCAweDU2MzQsIDB4MTExOCwgMHg1NjM1LCAweDI4OTAsIDB4NTYzNiwgMHgxMTFFLCAweDU2MzgsIDB4Mjg5QywKKyAgICAweDU2MzksIDB4MTExNSwgMHg1NjNBLCAweDI4OUUsIDB4NTYzQiwgMHgxMTE0LCAweDU2M0QsIDB4Mjg5OSwgMHg1NjNFLAorICAgIDB4Mjg5QiwgMHg1NjNGLCAweDExMTcsIDB4NTY0MCwgMHgyODk3LCAweDU2NDEsIDB4Mjg5MSwgMHg1NjQyLCAweDI4OEUsCisgICAgMHg1NjQ1LCAweDIwQzgsIDB4NTY0NiwgMHgyODk0LCAweDU2NDgsIDB4Mjg4RCwgMHg1NjQ5LCAweDI4OTMsIDB4NTY0QSwKKyAgICAweDI4OTIsIDB4NTY0QywgMHgyODhGLCAweDU2NEUsIDB4MTExQiwgMHg1NjUzLCAweDExMUEsIDB4NTY1NywgMHgxMTFDLAorICAgIDB4NTY1OCwgMHgyODk1LCAweDU2NTksIDB4MTI5NSwgMHg1NjVBLCAweDI4OTYsIDB4NTY1RSwgMHgyQjEwLCAweDU2NjAsCisgICAgMHgyQjA5LCAweDU2NjIsIDB4MTJBMSwgMHg1NjYzLCAweDJCMEQsIDB4NTY2NCwgMHgxMjk5LCAweDU2NjUsIDB4MTI5RCwKKyAgICAweDU2NjYsIDB4MkIwQywgMHg1NjY4LCAweDEyOUMsIDB4NTY2OSwgMHgxMjk4LCAweDU2NkEsIDB4MTI5QiwgMHg1NjZCLAorICAgIDB4MTI5NiwgMHg1NjZDLCAweDEyQTAsIDB4NTY2RCwgMHgyQjBFLCAweDU2NkUsIDB4MkIwQSwgMHg1NjZGLCAweDEyOUYsCisgICAgMHg1NjcwLCAweDJCMDgsIDB4NTY3MSwgMHgxMjlFLCAweDU2NzIsIDB4MkIwRiwgMHg1NjczLCAweDJCMEIsIDB4NTY3NCwKKyAgICAweDExMUQsIDB4NTY3NiwgMHgxMkEyLCAweDU2NzcsIDB4MkIxMSwgMHg1Njc4LCAweDEyOUEsIDB4NTY3OSwgMHgxMjk3LAorICAgIDB4NTY3RSwgMHgyRDQ3LCAweDU2N0YsIDB4MkQ0OSwgMHg1NjgwLCAweDEzQkEsIDB4NTY4MSwgMHgyRDRBLCAweDU2ODIsCisgICAgMHgyRDQ4LCAweDU2ODMsIDB4MkQ0NiwgMHg1Njg0LCAweDJENDUsIDB4NTY4NSwgMHgxM0JDLCAweDU2ODYsIDB4MkQ0NCwKKyAgICAweDU2ODcsIDB4MTNCRCwgMHg1NjhDLCAweDJENDIsIDB4NTY4RCwgMHgyRDQzLCAweDU2OEUsIDB4MTNCOSwgMHg1NjhGLAorICAgIDB4MTNCRSwgMHg1NjkwLCAweDEzQkIsIDB4NTY5MywgMHgyRDQxLCAweDU2OTUsIDB4MTRDQSwgMHg1Njk3LCAweDJGMTMsCisgICAgMHg1Njk4LCAweDJGMTEsIDB4NTY5OSwgMHgyRjE2LCAweDU2OUEsIDB4MkYxNCwgMHg1NjlDLCAweDJGMTIsIDB4NTY5RCwKKyAgICAweDJGMTUsIDB4NTZBNSwgMHgxNTc2LCAweDU2QTYsIDB4MzA4MSwgMHg1NkE3LCAweDMwODIsIDB4NTZBOCwgMHgxNTc3LAorICAgIDB4NTZBQSwgMHgzMDgzLCAweDU2QUIsIDB4MzA3RiwgMHg1NkFDLCAweDMwODQsIDB4NTZBRCwgMHgzMDgwLCAweDU2QUUsCisgICAgMHgxNENCLCAweDU2QjIsIDB4MzFDOCwgMHg1NkIzLCAweDMxQ0EsIDB4NTZCNCwgMHgxNjBDLCAweDU2QjUsIDB4MzFDOSwKKyAgICAweDU2QjYsIDB4MTYwQiwgMHg1NkI3LCAweDE2MEEsIDB4NTZCQywgMHgxNjBELCAweDU2QkQsIDB4MzJDQSwgMHg1NkJFLAorICAgIDB4MzJDQiwgMHg1NkMwLCAweDE2NkIsIDB4NTZDMSwgMHgxNjZBLCAweDU2QzIsIDB4MTY2QywgMHg1NkMzLCAweDMyQzksCisgICAgMHg1NkM1LCAweDMzNzksIDB4NTZDNiwgMHgzMzc4LCAweDU2QzgsIDB4MTZCRCwgMHg1NkM5LCAweDE2QkYsIDB4NTZDQSwKKyAgICAweDE2QkUsIDB4NTZDQiwgMHgzMzdBLCAweDU2Q0MsIDB4MTZGNiwgMHg1NkNELCAweDM0ODEsIDB4NTZEMSwgMHgxNzFGLAorICAgIDB4NTZEMywgMHgzNDgwLCAweDU2RDQsIDB4MzRDOSwgMHg1NkQ3LCAweDE3NzUsIDB4NTZEQSwgMHgwMzJELCAweDU2REIsCisgICAgMHgwMzJDLCAweDU2REQsIDB4MDNBQywgMHg1NkRFLCAweDAzQUIsIDB4NTZERiwgMHgxN0QwLCAweDU2RTAsIDB4MDNBQSwKKyAgICAweDU2RTEsIDB4MTdDRiwgMHg1NkU0LCAweDA0NjMsIDB4NTZFNSwgMHgxODUwLCAweDU2RTcsIDB4MTg0RiwgMHg1NkVBLAorICAgIDB4MDQ2MSwgMHg1NkVCLCAweDA0NjQsIDB4NTZFRSwgMHgxODRFLCAweDU2RjAsIDB4MDQ2MiwgMHg1NkY3LCAweDE5MzMsCisgICAgMHg1NkY5LCAweDE5MzQsIDB4NTZGQSwgMHgwNTc4LCAweDU2RkYsIDB4MDZFNiwgMHg1NzAxLCAweDFDNUIsIDB4NTcwMiwKKyAgICAweDFDNUMsIDB4NTcwMywgMHgwODc5LCAweDU3MDQsIDB4MDg3QSwgMHg1NzA3LCAweDFFNzQsIDB4NTcwOCwgMHgwQTM2LAorICAgIDB4NTcwOSwgMHgwQTM4LCAweDU3MEEsIDB4MUU3MywgMHg1NzBCLCAweDBBMzcsIDB4NTcwQywgMHgyMEQ5LCAweDU3MEQsCisgICAgMHgwQzE2LCAweDU3MTIsIDB4MERFNCwgMHg1NzEzLCAweDBERTUsIDB4NTcxNCwgMHgyMzkxLCAweDU3MTYsIDB4MEZBMSwKKyAgICAweDU3MTgsIDB4MEZBMCwgMHg1NzFBLCAweDI4OUYsIDB4NTcxQiwgMHgyQjEzLCAweDU3MUMsIDB4MkIxMiwgMHg1NzFFLAorICAgIDB4MzUwNSwgMHg1NzFGLCAweDAyN0EsIDB4NTcyMCwgMHgxNzg0LCAweDU3MjIsIDB4MTc5QSwgMHg1NzIzLCAweDE3OUIsCisgICAgMHg1NzI4LCAweDAzQUYsIDB4NTcyOSwgMHgwM0IzLCAweDU3MkEsIDB4MTdEMiwgMHg1NzJDLCAweDAzQjEsIDB4NTcyRCwKKyAgICAweDAzQjAsIDB4NTcyRSwgMHgxN0QxLCAweDU3MkYsIDB4MDNCMiwgMHg1NzMwLCAweDAzQUUsIDB4NTczMywgMHgwM0FELAorICAgIDB4NTczNCwgMHgxN0QzLCAweDU3M0IsIDB4MDQ2RSwgMHg1NzNFLCAweDA0NkIsIDB4NTc0MCwgMHgwNDY3LCAweDU3NDEsCisgICAgMHgxODUxLCAweDU3NDUsIDB4MTg1MiwgMHg1NzQ3LCAweDA0NjksIDB4NTc0OSwgMHgxODU0LCAweDU3NEEsIDB4MDQ2NSwKKyAgICAweDU3NEIsIDB4MTg1NSwgMHg1NzRDLCAweDE4NTMsIDB4NTc0RCwgMHgwNDY4LCAweDU3NEUsIDB4MDQ2QSwgMHg1NzRGLAorICAgIDB4MDQ2RCwgMHg1NzUwLCAweDA0NkMsIDB4NTc1MSwgMHgwNDY2LCAweDU3NTIsIDB4MTg1NiwgMHg1NzYxLCAweDA1N0QsCisgICAgMHg1NzYyLCAweDE5NDEsIDB4NTc2NCwgMHgwNTdGLCAweDU3NjYsIDB4MDU3RSwgMHg1NzY4LCAweDE5NDIsIDB4NTc2OSwKKyAgICAweDA1N0MsIDB4NTc2QSwgMHgwNTdCLCAweDU3NkIsIDB4MTkzOCwgMHg1NzZELCAweDE5MzcsIDB4NTc2RiwgMHgxOTM1LAorICAgIDB4NTc3MCwgMHgxOTNBLCAweDU3NzEsIDB4MTkzOSwgMHg1NzcyLCAweDE5MzYsIDB4NTc3MywgMHgxOTNGLCAweDU3NzQsCisgICAgMHgxOTQwLCAweDU3NzUsIDB4MTkzRCwgMHg1Nzc2LCAweDE5M0IsIDB4NTc3NywgMHgwNTdBLCAweDU3N0IsIDB4MTkzRSwKKyAgICAweDU3N0MsIDB4MDU4MCwgMHg1NzdELCAweDE5NDMsIDB4NTc4MCwgMHgxOTNDLCAweDU3ODIsIDB4MDZFNywgMHg1NzgzLAorICAgIDB4MDU3OSwgMHg1NzhCLCAweDA2RTgsIDB4NTc4QywgMHgxQTkwLCAweDU3OEYsIDB4MUE5NiwgMHg1NzkzLCAweDA2RUUsCisgICAgMHg1Nzk0LCAweDFBOTQsIDB4NTc5NSwgMHgxQTlBLCAweDU3OTcsIDB4MUE5MSwgMHg1Nzk4LCAweDFBOTUsIDB4NTc5OSwKKyAgICAweDFBOTcsIDB4NTc5QSwgMHgxQTk5LCAweDU3OUIsIDB4MUE5MywgMHg1NzlELCAweDFBOTIsIDB4NTc5RSwgMHgxQThELAorICAgIDB4NTc5RiwgMHgxQThFLCAweDU3QTAsIDB4MDZFOSwgMHg1N0EyLCAweDA2RUIsIDB4NTdBMywgMHgwNkVBLCAweDU3QTQsCisgICAgMHgxQThGLCAweDU3QTUsIDB4MUE5OCwgMHg1N0FFLCAweDA2RUQsIDB4NTdCNSwgMHgxQThDLCAweDU3QjYsIDB4MUM2NiwKKyAgICAweDU3QjgsIDB4MUM2NSwgMHg1N0I5LCAweDFDNkEsIDB4NTdCQSwgMHgxQzYxLCAweDU3QkMsIDB4MUM2NCwgMHg1N0JELAorICAgIDB4MUM2MywgMHg1N0JGLCAweDFDNjcsIDB4NTdDMSwgMHgxQzZCLCAweDU3QzIsIDB4MDg3QiwgMHg1N0MzLCAweDA4N0UsCisgICAgMHg1N0M2LCAweDFDNjIsIDB4NTdDNywgMHgxQzY4LCAweDU3Q0IsIDB4MDg3RCwgMHg1N0NDLCAweDFDNUQsIDB4NTdDRSwKKyAgICAweDA2RUMsIDB4NTdDRiwgMHgxRTgyLCAweDU3RDAsIDB4MUM2OSwgMHg1N0QyLCAweDFDNjAsIDB4NTdENCwgMHgwODdDLAorICAgIDB4NTdENSwgMHgxQzVGLCAweDU3REMsIDB4MUU3OSwgMHg1N0RGLCAweDBBMzksIDB4NTdFMCwgMHgwQTNELCAweDU3RTEsCisgICAgMHgxRTg5LCAweDU3RTIsIDB4MUU3NywgMHg1N0UzLCAweDFFODUsIDB4NTdFNCwgMHgwQTNFLCAweDU3RTUsIDB4MUU4NywKKyAgICAweDU3RTcsIDB4MUU4RCwgMHg1N0U5LCAweDFFOTEsIDB4NTdFQywgMHgxRTg4LCAweDU3RUQsIDB4MUU3QywgMHg1N0VFLAorICAgIDB4MUU4NCwgMHg1N0YwLCAweDFFOTIsIDB4NTdGMSwgMHgxRTkwLCAweDU3RjIsIDB4MUU4NiwgMHg1N0YzLCAweDFFODEsCisgICAgMHg1N0Y0LCAweDFFN0EsIDB4NTdGNSwgMHgyMEUxLCAweDU3RjYsIDB4MUU3OCwgMHg1N0Y3LCAweDBBNDIsIDB4NTdGOCwKKyAgICAweDFFN0YsIDB4NTdGOSwgMHgwQTQzLCAweDU3RkEsIDB4MEEzRiwgMHg1N0ZCLCAweDFFNzUsIDB4NTdGQywgMHgxRThCLAorICAgIDB4NTdGRCwgMHgxRTdELCAweDU4MDAsIDB4MUU3QiwgMHg1ODAxLCAweDFFOEUsIDB4NTgwMiwgMHgwQTQwLCAweDU4MDQsCisgICAgMHgxRTk0LCAweDU4MDUsIDB4MEEzQSwgMHg1ODA2LCAweDBBM0MsIDB4NTgwNywgMHgxRTgzLCAweDU4MDgsIDB4MUU3RSwKKyAgICAweDU4MDksIDB4MDg3RiwgMHg1ODBBLCAweDBBM0IsIDB4NTgwQiwgMHgxRTgwLCAweDU4MEMsIDB4MUU4RiwgMHg1ODBELAorICAgIDB4MUU5MywgMHg1ODBFLCAweDFFOEEsIDB4NTgxMCwgMHgxRThDLCAweDU4MTQsIDB4MUU3NiwgMHg1ODE5LCAweDIwREMsCisgICAgMHg1ODFCLCAweDIwRTUsIDB4NTgxQywgMHgyMEU0LCAweDU4MUQsIDB4MEMxRSwgMHg1ODFFLCAweDIwREQsIDB4NTgyMCwKKyAgICAweDBDMUYsIDB4NTgyMSwgMHgwQzFELCAweDU4MjMsIDB4MjBERiwgMHg1ODI0LCAweDBDMUEsIDB4NTgyNSwgMHgyMEUzLAorICAgIDB4NTgyNywgMHgyMERFLCAweDU4MjgsIDB4MjBFMCwgMHg1ODI5LCAweDIwREEsIDB4NTgyQSwgMHgwQzE4LCAweDU4MkMsCisgICAgMHgyMEVELCAweDU4MkQsIDB4MjBFQywgMHg1ODJFLCAweDIwRTksIDB4NTgyRiwgMHgwQzE3LCAweDU4MzAsIDB4MEMxQiwKKyAgICAweDU4MzEsIDB4MEMxQywgMHg1ODMyLCAweDFDNUUsIDB4NTgzMywgMHgyMEU2LCAweDU4MzQsIDB4MEMxOSwgMHg1ODM1LAorICAgIDB4MEE0MSwgMHg1ODM2LCAweDIwRTgsIDB4NTgzNywgMHgyMERCLCAweDU4MzgsIDB4MjBFQiwgMHg1ODM5LCAweDIwRUEsCisgICAgMHg1ODNCLCAweDIwRUUsIDB4NTgzRCwgMHgyMzlGLCAweDU4M0YsIDB4MjBFNywgMHg1ODQ4LCAweDIwRTIsIDB4NTg0OSwKKyAgICAweDIzOTcsIDB4NTg0QSwgMHgwREVGLCAweDU4NEIsIDB4MERGMiwgMHg1ODRDLCAweDBERUQsIDB4NTg0RCwgMHgyMzk2LAorICAgIDB4NTg0RSwgMHgyMzlBLCAweDU4NEYsIDB4MjM5NSwgMHg1ODUxLCAweDBERTcsIDB4NTg1MiwgMHgwREYxLCAweDU4NTMsCisgICAgMHgyMzkyLCAweDU4NTQsIDB4MERFQiwgMHg1ODU1LCAweDIzOTksIDB4NTg1NywgMHgwREU5LCAweDU4NTgsIDB4MERFOCwKKyAgICAweDU4NTksIDB4MjM5QywgMHg1ODVBLCAweDBERUEsIDB4NTg1QiwgMHgyMzlFLCAweDU4NUQsIDB4MjM5QiwgMHg1ODVFLAorICAgIDB4MERFNiwgMHg1ODYyLCAweDBERjAsIDB4NTg2MywgMHgyM0EwLCAweDU4NjQsIDB4MjM5NCwgMHg1ODY1LCAweDIzOUQsCisgICAgMHg1ODY4LCAweDIzOTMsIDB4NTg2QiwgMHgwREVDLCAweDU4NkQsIDB4MERFRSwgMHg1ODZGLCAweDIzOTgsIDB4NTg3MSwKKyAgICAweDIzQTEsIDB4NTg3NCwgMHgyNjNGLCAweDU4NzUsIDB4MEZBMiwgMHg1ODc2LCAweDI2NDUsIDB4NTg3OSwgMHgwRkE3LAorICAgIDB4NTg3QSwgMHgyNjQxLCAweDU4N0IsIDB4MjY0OCwgMHg1ODdDLCAweDI2MzksIDB4NTg3RCwgMHgwRkE5LCAweDU4N0UsCisgICAgMHgwRkEzLCAweDU4N0YsIDB4MjYzRSwgMHg1ODgwLCAweDExMjEsIDB4NTg4MSwgMHgyNjNELCAweDU4ODIsIDB4MjY0NiwKKyAgICAweDU4ODMsIDB4MEZBNCwgMHg1ODg1LCAweDBGQTgsIDB4NTg4NiwgMHgyNjNDLCAweDU4ODcsIDB4MjY0MiwgMHg1ODg4LAorICAgIDB4MjY0NywgMHg1ODg5LCAweDI2MzgsIDB4NTg4QSwgMHgwRkE2LCAweDU4OEIsIDB4MjY0MCwgMHg1ODhFLCAweDI2NDQsCisgICAgMHg1ODhGLCAweDI2NEEsIDB4NTg5MCwgMHgyNjNBLCAweDU4OTEsIDB4MjY0MywgMHg1ODkzLCAweDBGQTUsIDB4NTg5NCwKKyAgICAweDI2NDksIDB4NTg5OCwgMHgyNjNCLCAweDU4OUMsIDB4MTEyNSwgMHg1ODlELCAweDI4QTEsIDB4NTg5RSwgMHgxMTIzLAorICAgIDB4NTg5RiwgMHgxMTIyLCAweDU4QTAsIDB4MjhBMywgMHg1OEExLCAweDI4QTgsIDB4NThBMywgMHgyOEE0LCAweDU4QTUsCisgICAgMHgyOEE3LCAweDU4QTYsIDB4MTEyOCwgMHg1OEE4LCAweDEyODgsIDB4NThBOSwgMHgxMTI3LCAweDU4QUIsIDB4MjhBMCwKKyAgICAweDU4QUMsIDB4MjhBNiwgMHg1OEFFLCAweDExMjYsIDB4NThBRiwgMHgyOEE1LCAweDU4QjEsIDB4MjhBMiwgMHg1OEIzLAorICAgIDB4MTEyNCwgMHg1OEJBLCAweDJCMTgsIDB4NThCQiwgMHgzNkVCLCAweDU4QkMsIDB4MkIxQSwgMHg1OEJELCAweDJCMTUsCisgICAgMHg1OEJFLCAweDEyQTQsIDB4NThCRiwgMHgyQjE3LCAweDU4QzEsIDB4MTJBMywgMHg1OEMyLCAweDJCMTksIDB4NThDNSwKKyAgICAweDEyQTYsIDB4NThDNiwgMHgyQjFCLCAweDU4QzcsIDB4MTJBNSwgMHg1OEM4LCAweDJCMTQsIDB4NThDOSwgMHgyQjE2LAorICAgIDB4NThDRSwgMHgxM0MyLCAweDU4Q0YsIDB4MkQ0RCwgMHg1OEQxLCAweDEzQzEsIDB4NThEMiwgMHgyRDRFLCAweDU4RDMsCisgICAgMHgxM0MwLCAweDU4RDQsIDB4MkQ0QywgMHg1OEQ1LCAweDEzQkYsIDB4NThENiwgMHgyRDRCLCAweDU4RDgsIDB4MTRDRCwKKyAgICAweDU4RDksIDB4MTRDQywgMHg1OERBLCAweDMwODUsIDB4NThEQiwgMHgzMDg3LCAweDU4REQsIDB4MzA4NiwgMHg1OERFLAorICAgIDB4MTU3OCwgMHg1OERGLCAweDE1NzksIDB4NThFMiwgMHgxNTdBLCAweDU4RTMsIDB4MzFDQiwgMHg1OEU0LCAweDE2MEUsCisgICAgMHg1OEU3LCAweDM0MTEsIDB4NThFOCwgMHgzNDEwLCAweDU4RTksIDB4MTcyMCwgMHg1OEVCLCAweDAyN0IsIDB4NThFQywKKyAgICAweDAyQzEsIDB4NThFRiwgMHgwNDZGLCAweDU4RjQsIDB4MUE5QiwgMHg1OEY5LCAweDBDMjAsIDB4NThGQSwgMHgwQzIxLAorICAgIDB4NThGQywgMHgyM0EyLCAweDU4RkQsIDB4MEZBQSwgMHg1OEZFLCAweDI2NEIsIDB4NThGRiwgMHgyOEE5LCAweDU5MDIsCisgICAgMHgwMjI0LCAweDU5MDMsIDB4MTc4NSwgMHg1OTA2LCAweDE4NTcsIDB4NTkwQSwgMHgwMjI0LCAweDU5MEMsIDB4MTk0NCwKKyAgICAweDU5MEQsIDB4MUE5QywgMHg1OTBFLCAweDFDNkMsIDB4NTkwRiwgMHgwODgwLCAweDU5MTIsIDB4MzA4OCwgMHg1OTE0LAorICAgIDB4MTY2RCwgMHg1OTE1LCAweDAyN0MsIDB4NTkxNiwgMHgwMzJFLCAweDU5MTcsIDB4MTc5QywgMHg1OTE5LCAweDAzQjQsCisgICAgMHg1OTFBLCAweDAzQjUsIDB4NTkxQywgMHgwNTgxLCAweDU5MjAsIDB4MEE0NCwgMHg1OTIyLCAweDBGQUMsIDB4NTkyNCwKKyAgICAweDBGQUQsIDB4NTkyNSwgMHgwRkFCLCAweDU5MjcsIDB4MDI3RCwgMHg1OTI5LCAweDAyQzIsIDB4NTkyQSwgMHgwMkM0LAorICAgIDB4NTkyQiwgMHgwMkMzLCAweDU5MkMsIDB4MTc4NiwgMHg1OTJELCAweDAyQzUsIDB4NTkyRSwgMHgwMzJGLCAweDU5MkYsCisgICAgMHgxNzlELCAweDU5MzEsIDB4MDMzMCwgMHg1OTM3LCAweDAzQjYsIDB4NTkzOCwgMHgwM0I3LCAweDU5M0MsIDB4MTdENCwKKyAgICAweDU5M0UsIDB4MDQ3MCwgMHg1OTQwLCAweDE4NTgsIDB4NTk0NCwgMHgwNTg1LCAweDU5NDUsIDB4MTk0NSwgMHg1OTQ3LAorICAgIDB4MDU4MywgMHg1OTQ4LCAweDA1ODQsIDB4NTk0OSwgMHgwNTgyLCAweDU5NEEsIDB4MUM2RCwgMHg1OTRFLCAweDA2RjIsCisgICAgMHg1OTRGLCAweDA2RjEsIDB4NTk1MCwgMHgwNkYzLCAweDU5NTEsIDB4MDZGMCwgMHg1OTUzLCAweDFBOUQsIDB4NTk1NCwKKyAgICAweDA1ODYsIDB4NTk1NSwgMHgwNkVGLCAweDU5NTcsIDB4MDg4MSwgMHg1OTU4LCAweDA4ODIsIDB4NTk1QSwgMHgwODgzLAorICAgIDB4NTk1QywgMHgxRTk1LCAweDU5NjAsIDB4MEMyMiwgMHg1OTYxLCAweDIwRUYsIDB4NTk2MiwgMHgwQTQ1LCAweDU5NjcsCisgICAgMHgwREYzLCAweDU5NjksIDB4MEZBRiwgMHg1OTZBLCAweDBGQUUsIDB4NTk2QiwgMHgyNjRDLCAweDU5NkQsIDB4MTEyOSwKKyAgICAweDU5NkUsIDB4MTJBNywgMHg1OTcwLCAweDJGMTcsIDB4NTk3MSwgMHgzMzdCLCAweDU5NzIsIDB4MzQxMiwgMHg1OTczLAorICAgIDB4MDI3RSwgMHg1OTc0LCAweDAzMzEsIDB4NTk3NiwgMHgwMzMyLCAweDU5NzcsIDB4MTdEQSwgMHg1OTc4LCAweDAzQjksCisgICAgMHg1OTc5LCAweDAzQkMsIDB4NTk3QiwgMHgxN0Q4LCAweDU5N0MsIDB4MTdENiwgMHg1OTdELCAweDAzQkIsIDB4NTk3RSwKKyAgICAweDE3RDksIDB4NTk3RiwgMHgxN0RCLCAweDU5ODAsIDB4MTdENSwgMHg1OTgxLCAweDAzQkUsIDB4NTk4MiwgMHgwM0JELAorICAgIDB4NTk4MywgMHgwM0JBLCAweDU5ODQsIDB4MDNCOCwgMHg1OTg1LCAweDE3RDcsIDB4NTk4QSwgMHgwNDdCLCAweDU5OEQsCisgICAgMHgwNDc4LCAweDU5OEUsIDB4MTg1RCwgMHg1OThGLCAweDE4NjAsIDB4NTk5MCwgMHgxODVGLCAweDU5OTIsIDB4MDQ3MiwKKyAgICAweDU5OTMsIDB4MDQ3QSwgMHg1OTk2LCAweDA0NzcsIDB4NTk5NywgMHgxODVDLCAweDU5OTgsIDB4MTg1QSwgMHg1OTk5LAorICAgIDB4MDQ3NiwgMHg1OTlELCAweDA0NzEsIDB4NTk5RSwgMHgwNDc0LCAweDU5QTAsIDB4MTg1QiwgMHg1OUExLCAweDE4NjIsCisgICAgMHg1OUEyLCAweDE4NUUsIDB4NTlBMywgMHgwNDc1LCAweDU5QTQsIDB4MDQ3OSwgMHg1OUE1LCAweDA0N0MsIDB4NTlBNiwKKyAgICAweDE4NTksIDB4NTlBNywgMHgxODYxLCAweDU5QTgsIDB4MDQ3MywgMHg1OUFFLCAweDA1OEIsIDB4NTlBRiwgMHgwNTkzLAorICAgIDB4NTlCMSwgMHgxOTUxLCAweDU5QjIsIDB4MTk0QSwgMHg1OUIzLCAweDA1OTQsIDB4NTlCNCwgMHgxOTU1LCAweDU5QjUsCisgICAgMHgxOTQ2LCAweDU5QjYsIDB4MTk0RCwgMHg1OUI5LCAweDA1OEEsIDB4NTlCQSwgMHgxOTQ3LCAweDU5QkIsIDB4MDU4OCwKKyAgICAweDU5QkMsIDB4MTk0RSwgMHg1OUJELCAweDE5NTIsIDB4NTlCRSwgMHgwNTg3LCAweDU5QzAsIDB4MTk1MywgMHg1OUMxLAorICAgIDB4MTk0QywgMHg1OUMzLCAweDE5NEYsIDB4NTlDNSwgMHgwNTk2LCAweDU5QzYsIDB4MDU4RCwgMHg1OUM3LCAweDE5NTYsCisgICAgMHg1OUM4LCAweDE5NTQsIDB4NTlDQSwgMHgwNTkyLCAweDU5Q0IsIDB4MDU5MCwgMHg1OUNDLCAweDE5NEIsIDB4NTlDRCwKKyAgICAweDA1OEYsIDB4NTlDRSwgMHgxOTQ5LCAweDU5Q0YsIDB4MTk0OCwgMHg1OUQwLCAweDA1OEUsIDB4NTlEMSwgMHgwNThDLAorICAgIDB4NTlEMiwgMHgwNTk1LCAweDU5RDMsIDB4MDU5MSwgMHg1OUQ0LCAweDA1ODksIDB4NTlENiwgMHgxOTUwLCAweDU5RDgsCisgICAgMHgwNkY1LCAweDU5REEsIDB4MDZGQywgMHg1OURCLCAweDFBQUIsIDB4NTlEQywgMHgwNkY0LCAweDU5REQsIDB4MUFBMywKKyAgICAweDU5REUsIDB4MUE5RiwgMHg1OUUwLCAweDFBQUYsIDB4NTlFMSwgMHgxQTlFLCAweDU5RTMsIDB4MDZGNywgMHg1OUU0LAorICAgIDB4MUFBOCwgMHg1OUU1LCAweDA2RkEsIDB4NTlFNiwgMHgwNkZELCAweDU5RTgsIDB4MDZGOCwgMHg1OUU5LCAweDFBQUMsCisgICAgMHg1OUVBLCAweDA2RkIsIDB4NTlFQywgMHgwODhBLCAweDU5RUQsIDB4MUFCMiwgMHg1OUVFLCAweDFBQTAsIDB4NTlGMSwKKyAgICAweDFBQTIsIDB4NTlGMiwgMHgxQUE5LCAweDU5RjMsIDB4MUFBRCwgMHg1OUY0LCAweDFBQjEsIDB4NTlGNSwgMHgxQUFFLAorICAgIDB4NTlGNiwgMHgxQUE3LCAweDU5RjcsIDB4MUFBQSwgMHg1OUZBLCAweDFBQTQsIDB4NTlGQiwgMHgwNkZGLCAweDU5RkMsCisgICAgMHgxQUE2LCAweDU5RkQsIDB4MUFBNSwgMHg1OUZFLCAweDFBQjAsIDB4NTlGRiwgMHgwNkY2LCAweDVBMDAsIDB4MUFBMSwKKyAgICAweDVBMDEsIDB4MDZGRSwgMHg1QTAzLCAweDA2RjksIDB4NUEwOSwgMHgwODkwLCAweDVBMEEsIDB4MUM3NSwgMHg1QTBDLAorICAgIDB4MDg4RiwgMHg1QTBGLCAweDFDNzMsIDB4NUExMSwgMHgwODg0LCAweDVBMTMsIDB4MDg4OSwgMHg1QTE1LCAweDFDNzIsCisgICAgMHg1QTE2LCAweDFDNkYsIDB4NUExNywgMHgxQzc0LCAweDVBMTgsIDB4MDg4NSwgMHg1QTE5LCAweDFDNkUsIDB4NUExQiwKKyAgICAweDA4ODgsIDB4NUExQywgMHgwODg2LCAweDVBMUUsIDB4MUM3NiwgMHg1QTFGLCAweDA4ODcsIDB4NUEyMCwgMHgwODhCLAorICAgIDB4NUEyMywgMHgwODhDLCAweDVBMjUsIDB4MDg4RSwgMHg1QTI5LCAweDA4OEQsIDB4NUEyRCwgMHgxQzcwLCAweDVBMkUsCisgICAgMHgxQzcxLCAweDVBMzMsIDB4MUM3NywgMHg1QTM1LCAweDFFOUMsIDB4NUEzNiwgMHgwQTQ2LCAweDVBMzcsIDB4MjBGRCwKKyAgICAweDVBMzgsIDB4MUU5QiwgMHg1QTM5LCAweDFFQUUsIDB4NUEzQywgMHgwQTRDLCAweDVBM0UsIDB4MUVBQywgMHg1QTQwLAorICAgIDB4MEE0QiwgMHg1QTQxLCAweDBBNDcsIDB4NUE0MiwgMHgxRUI1LCAweDVBNDMsIDB4MUVBNSwgMHg1QTQ0LCAweDFFQTgsCisgICAgMHg1QTQ2LCAweDBBNEYsIDB4NUE0NywgMHgxRUIyLCAweDVBNDgsIDB4MUVBQSwgMHg1QTQ5LCAweDBBNDgsIDB4NUE0QSwKKyAgICAweDBBNTAsIDB4NUE0QywgMHgxRUFGLCAweDVBNEQsIDB4MUVBRCwgMHg1QTUwLCAweDFFOUUsIDB4NUE1MSwgMHgxRUIzLAorICAgIDB4NUE1MiwgMHgxRUE3LCAweDVBNTMsIDB4MUVBMiwgMHg1QTU1LCAweDFFOTgsIDB4NUE1NiwgMHgxRUI0LCAweDVBNTcsCisgICAgMHgxRUE0LCAweDVBNTgsIDB4MUU5NywgMHg1QTVBLCAweDBBNEUsIDB4NUE1QiwgMHgxRUE5LCAweDVBNUMsIDB4MUVCNiwKKyAgICAweDVBNUQsIDB4MUVBNiwgMHg1QTVFLCAweDFFOUEsIDB4NUE1RiwgMHgxRTlGLCAweDVBNjAsIDB4MUU5NiwgMHg1QTYyLAorICAgIDB4MEE0RCwgMHg1QTY0LCAweDFFQTMsIDB4NUE2NSwgMHgxRUEwLCAweDVBNjYsIDB4MEE0OSwgMHg1QTY3LCAweDFFOTksCisgICAgMHg1QTY5LCAweDFFQjEsIDB4NUE2QSwgMHgwQTRBLCAweDVBNkMsIDB4MUVBMSwgMHg1QTZELCAweDFFOUQsIDB4NUE3MCwKKyAgICAweDFFQjAsIDB4NUE3NywgMHgwQzIzLCAweDVBNzgsIDB4MjBGNiwgMHg1QTdBLCAweDIwRjMsIDB4NUE3QiwgMHgyMTA0LAorICAgIDB4NUE3QywgMHgyMEY4LCAweDVBN0QsIDB4MjEwNSwgMHg1QTdGLCAweDBDMjUsIDB4NUE4MywgMHgyMTAxLCAweDVBODQsCisgICAgMHgyMEZFLCAweDVBOEEsIDB4MjBGRiwgMHg1QThCLCAweDIxMDIsIDB4NUE4QywgMHgyMTA2LCAweDVBOEUsIDB4MUVBQiwKKyAgICAweDVBOEYsIDB4MjEwOCwgMHg1QTkwLCAweDIzQjYsIDB4NUE5MiwgMHgwQzI2LCAweDVBOTMsIDB4MjEwOSwgMHg1QTk0LAorICAgIDB4MjBGMSwgMHg1QTk1LCAweDIwRkIsIDB4NUE5NywgMHgyMTAwLCAweDVBOUEsIDB4MEMyNCwgMHg1QTlCLCAweDBDMjcsCisgICAgMHg1QTlDLCAweDIxMDcsIDB4NUE5RCwgMHgyMTBBLCAweDVBOUUsIDB4MjBGNSwgMHg1QTlGLCAweDIwRjIsIDB4NUFBMiwKKyAgICAweDIwRjQsIDB4NUFBNSwgMHgyMEY5LCAweDVBQTYsIDB4MjBGNywgMHg1QUE3LCAweDBDMjgsIDB4NUFBOSwgMHgyMTAzLAorICAgIDB4NUFBQywgMHgyMEZBLCAweDVBQUUsIDB4MjBGQywgMHg1QUFGLCAweDIwRjAsIDB4NUFCMCwgMHgyM0FBLCAweDVBQjEsCisgICAgMHgyM0E4LCAweDVBQjIsIDB4MERGQywgMHg1QUIzLCAweDBERkEsIDB4NUFCNCwgMHgyM0IyLCAweDVBQjUsIDB4MjNBOSwKKyAgICAweDVBQjYsIDB4MjNCMywgMHg1QUI3LCAweDIzQUYsIDB4NUFCOCwgMHgyM0E3LCAweDVBQjksIDB4MjNCNSwgMHg1QUJBLAorICAgIDB4MjNBNiwgMHg1QUJCLCAweDIzQUQsIDB4NUFCQywgMHgwREY5LCAweDVBQkQsIDB4MERGOCwgMHg1QUJFLCAweDBERjcsCisgICAgMHg1QUJGLCAweDIzQUIsIDB4NUFDMCwgMHgyM0IwLCAweDVBQzEsIDB4MERGNCwgMHg1QUMyLCAweDBERkIsIDB4NUFDNCwKKyAgICAweDIzQTQsIDB4NUFDNiwgMHgyM0FFLCAweDVBQzcsIDB4MjNBMywgMHg1QUM4LCAweDIzQUMsIDB4NUFDOSwgMHgwREY1LAorICAgIDB4NUFDQSwgMHgyM0IxLCAweDVBQ0IsIDB4MjNBNSwgMHg1QUNDLCAweDBERjYsIDB4NUFDRCwgMHgyM0I0LCAweDVBRDUsCisgICAgMHgyNjUwLCAweDVBRDYsIDB4MEZCNCwgMHg1QUQ3LCAweDBGQjMsIDB4NUFEOCwgMHgwRkI1LCAweDVBRDksIDB4MjY1QywKKyAgICAweDVBREEsIDB4MjY1MiwgMHg1QURCLCAweDI2NTgsIDB4NUFEQywgMHgyNjRELCAweDVBREQsIDB4MjY1QiwgMHg1QURFLAorICAgIDB4MjY1QSwgMHg1QURGLCAweDI2NUUsIDB4NUFFMCwgMHgyNjU3LCAweDVBRTEsIDB4MEZCMCwgMHg1QUUyLCAweDI2NTYsCisgICAgMHg1QUUzLCAweDBGQjYsIDB4NUFFNSwgMHgyNjRGLCAweDVBRTYsIDB4MEZCMSwgMHg1QUU4LCAweDI2NUQsIDB4NUFFOSwKKyAgICAweDBGQjIsIDB4NUFFQSwgMHgyNjUxLCAweDVBRUIsIDB4MjY1NCwgMHg1QUVDLCAweDI2NTksIDB4NUFFRCwgMHgyNjUzLAorICAgIDB4NUFFRSwgMHgyNjRFLCAweDVBRjMsIDB4MjY1NSwgMHg1QUY0LCAweDI4QUIsIDB4NUFGNSwgMHgxMTJELCAweDVBRjYsCisgICAgMHgyOEFFLCAweDVBRjcsIDB4MjhBRCwgMHg1QUY4LCAweDI4QjAsIDB4NUFGOSwgMHgyOEIyLCAweDVBRkEsIDB4MzZFRSwKKyAgICAweDVBRkIsIDB4MTEyQiwgMHg1QUZELCAweDI4QUMsIDB4NUFGRiwgMHgyOEFBLCAweDVCMDEsIDB4MjhCMywgMHg1QjAyLAorICAgIDB4MjhCMSwgMHg1QjAzLCAweDI4QUYsIDB4NUIwNSwgMHgyOEI1LCAweDVCMDcsIDB4MjhCNCwgMHg1QjA4LCAweDExMkYsCisgICAgMHg1QjA5LCAweDExMkEsIDB4NUIwQiwgMHgxMTJDLCAweDVCMEMsIDB4MTEyRSwgMHg1QjBGLCAweDI4QjYsIDB4NUIxMCwKKyAgICAweDJCMjIsIDB4NUIxMywgMHgyQjIxLCAweDVCMTQsIDB4MkIyMCwgMHg1QjE2LCAweDJCMjMsIDB4NUIxNywgMHgyQjFDLAorICAgIDB4NUIxOSwgMHgyQjFELCAweDVCMUEsIDB4MkIyNSwgMHg1QjFCLCAweDJCMUUsIDB4NUIxRCwgMHgxMkE4LCAweDVCMUUsCisgICAgMHgyQjI3LCAweDVCMjAsIDB4MkIyNiwgMHg1QjIxLCAweDJCMUYsIDB4NUIyMywgMHgyRDUyLCAweDVCMjQsIDB4MTNDNSwKKyAgICAweDVCMjUsIDB4MkQ1MCwgMHg1QjI2LCAweDJENTUsIDB4NUIyNywgMHgyRDU0LCAweDVCMjgsIDB4MkIyNCwgMHg1QjJBLAorICAgIDB4MTNDNCwgMHg1QjJDLCAweDJENTMsIDB4NUIyRCwgMHgyRDRGLCAweDVCMkUsIDB4MkQ1NywgMHg1QjJGLCAweDJENTYsCisgICAgMHg1QjMwLCAweDEzQzMsIDB4NUIzMiwgMHgyRDUxLCAweDVCMzQsIDB4MTJBOSwgMHg1QjM4LCAweDE0Q0UsIDB4NUIzQywKKyAgICAweDJGMTgsIDB4NUIzRCwgMHgzMDg5LCAweDVCM0UsIDB4MzA4QSwgMHg1QjNGLCAweDMwOEIsIDB4NUI0MCwgMHgxNjBGLAorICAgIDB4NUI0MywgMHgxNjEwLCAweDVCNDUsIDB4MzFDQywgMHg1QjQ3LCAweDMyQ0QsIDB4NUI0OCwgMHgzMkNDLCAweDVCNEIsCisgICAgMHgzMzdDLCAweDVCNEMsIDB4MzM3RCwgMHg1QjRELCAweDM0MTMsIDB4NUI0RSwgMHgzNDgyLCAweDVCNTAsIDB4MDI3RiwKKyAgICAweDVCNTEsIDB4MDI4MCwgMHg1QjUzLCAweDAyODEsIDB4NUI1NCwgMHgwMkM2LCAweDVCNTUsIDB4MDMzMywgMHg1QjU2LAorICAgIDB4MTdEQywgMHg1QjU3LCAweDAzQkYsIDB4NUI1OCwgMHgwM0MwLCAweDVCNUEsIDB4MDQ3RiwgMHg1QjVCLCAweDA0ODAsCisgICAgMHg1QjVDLCAweDA0N0UsIDB4NUI1RCwgMHgwNDdELCAweDVCNUYsIDB4MDU5NywgMHg1QjYyLCAweDE5NTcsIDB4NUI2MywKKyAgICAweDA1OTksIDB4NUI2NCwgMHgwNTk4LCAweDVCNjUsIDB4MTk1OCwgMHg1QjY5LCAweDA3MDAsIDB4NUI2QiwgMHgwODkxLAorICAgIDB4NUI2QywgMHgxQzc4LCAweDVCNkUsIDB4MUVCOCwgMHg1QjcwLCAweDBBNTEsIDB4NUI3MSwgMHgwQzJBLCAweDVCNzIsCisgICAgMHgxRUI3LCAweDVCNzMsIDB4MEMyOSwgMHg1Qjc1LCAweDBGQjcsIDB4NUI3NywgMHgyNjVGLCAweDVCNzgsIDB4MTJBQSwKKyAgICAweDVCN0EsIDB4MTNDNiwgMHg1QjdCLCAweDJENTgsIDB4NUI3RCwgMHgxNjExLCAweDVCN0YsIDB4MTZDMCwgMHg1QjgwLAorICAgIDB4MDIyNSwgMHg1QjgxLCAweDE3OUUsIDB4NUI4MywgMHgwMzM0LCAweDVCODQsIDB4MTc5RiwgMHg1Qjg1LCAweDAzQzMsCisgICAgMHg1Qjg3LCAweDAzQzEsIDB4NUI4OCwgMHgwM0MyLCAweDVCODksIDB4MDNDNCwgMHg1QjhCLCAweDA0ODIsIDB4NUI4QywKKyAgICAweDA0ODEsIDB4NUI4RSwgMHgxODYzLCAweDVCOEYsIDB4MDQ4MywgMHg1QjkyLCAweDE4NjQsIDB4NUI5MywgMHgxOTU5LAorICAgIDB4NUI5NSwgMHgxOTVBLCAweDVCOTcsIDB4MDU5QSwgMHg1Qjk4LCAweDA1OUMsIDB4NUI5OSwgMHgwNTlFLCAweDVCOUEsCisgICAgMHgwNTlCLCAweDVCOUIsIDB4MDU5RiwgMHg1QjlDLCAweDA1OUQsIDB4NUJBMiwgMHgwNzA0LCAweDVCQTMsIDB4MDcwMSwKKyAgICAweDVCQTQsIDB4MDcwMywgMHg1QkE1LCAweDA3MDUsIDB4NUJBNiwgMHgwNzAyLCAweDVCQTcsIDB4MUM3OSwgMHg1QkE4LAorICAgIDB4MUFCMywgMHg1QkFDLCAweDFDN0IsIDB4NUJBRCwgMHgxQzdBLCAweDVCQUUsIDB4MDg5NywgMHg1QkIwLCAweDA4OTMsCisgICAgMHg1QkIzLCAweDA4OTQsIDB4NUJCNCwgMHgwODk2LCAweDVCQjUsIDB4MDg5OCwgMHg1QkI2LCAweDA4OTUsIDB4NUJCOCwKKyAgICAweDA4OUEsIDB4NUJCOSwgMHgwODk5LCAweDVCQkYsIDB4MEE1NiwgMHg1QkMwLCAweDFFQkEsIDB4NUJDMSwgMHgxRUI5LAorICAgIDB4NUJDMiwgMHgwQTU1LCAweDVCQzQsIDB4MEE1NCwgMHg1QkM1LCAweDBBNTMsIDB4NUJDNiwgMHgwQTU3LCAweDVCQzcsCisgICAgMHgwQTUyLCAweDVCQ0EsIDB4MjExMCwgMHg1QkNCLCAweDIxMEQsIDB4NUJDQywgMHgwQzJDLCAweDVCQ0QsIDB4MjEwQywKKyAgICAweDVCQ0UsIDB4MjExMSwgMHg1QkQwLCAweDBDMkUsIDB4NUJEMSwgMHgyMTBGLCAweDVCRDIsIDB4MEMyQiwgMHg1QkQzLAorICAgIDB4MEMyRCwgMHg1QkQ0LCAweDIxMEUsIDB4NUJENiwgMHgyM0I3LCAweDVCRDgsIDB4MjNCOCwgMHg1QkQ5LCAweDIzQjksCisgICAgMHg1QkRFLCAweDBGQjgsIDB4NUJERiwgMHgwRkMwLCAweDVCRTAsIDB4MjY2MCwgMHg1QkUxLCAweDBGQkEsIDB4NUJFMiwKKyAgICAweDBGQkUsIDB4NUJFMywgMHgyNjYxLCAweDVCRTQsIDB4MEZCRiwgMHg1QkU1LCAweDBGQkIsIDB4NUJFNiwgMHgwRkJDLAorICAgIDB4NUJFNywgMHgwRkI5LCAweDVCRTgsIDB4MEZCRCwgMHg1QkU5LCAweDExMzIsIDB4NUJFQSwgMHgyMTBCLCAweDVCRUIsCisgICAgMHgxMTMzLCAweDVCRUMsIDB4MTEzMSwgMHg1QkVFLCAweDExMzAsIDB4NUJFRiwgMHgyQjI4LCAweDVCRjAsIDB4MTJBQiwKKyAgICAweDVCRjEsIDB4MkQ1OSwgMHg1QkYyLCAweDJENUEsIDB4NUJGNSwgMHgxNTdCLCAweDVCRjYsIDB4MTYxMiwgMHg1QkY4LAorICAgIDB4MDI4MiwgMHg1QkZBLCAweDAzQzUsIDB4NUMwMSwgMHgwNzA2LCAweDVDMDMsIDB4MUM3QywgMHg1QzA0LCAweDA4OUIsCisgICAgMHg1QzA3LCAweDBBNUEsIDB4NUMwOCwgMHgwQTU5LCAweDVDMDksIDB4MEE1OCwgMHg1QzBBLCAweDBDMkYsIDB4NUMwQiwKKyAgICAweDBDMzAsIDB4NUMwQywgMHgyMTEyLCAweDVDMEQsIDB4MEZDMSwgMHg1QzBFLCAweDEyQUMsIDB4NUMwRiwgMHgwMjgzLAorICAgIDB4NUMxMCwgMHgxNzg3LCAweDVDMTEsIDB4MDJDNywgMHg1QzEyLCAweDE3QTAsIDB4NUMxNSwgMHgxN0RELCAweDVDMTYsCisgICAgMHgwM0M2LCAweDVDMUEsIDB4MDVBMCwgMHg1QzFGLCAweDIzQkEsIDB4NUMyMiwgMHgwMjg0LCAweDVDMjQsIDB4MDJDOCwKKyAgICAweDVDMjUsIDB4MTdERSwgMHg1QzI4LCAweDE4NjUsIDB4NUMyQSwgMHgxODY2LCAweDVDMkMsIDB4MDQ4NCwgMHg1QzMwLAorICAgIDB4MjExMywgMHg1QzMxLCAweDBDMzEsIDB4NUMzMywgMHgyM0JCLCAweDVDMzcsIDB4MTNDNywgMHg1QzM4LCAweDAyODUsCisgICAgMHg1QzM5LCAweDAyOTksIDB4NUMzQSwgMHgwMkM5LCAweDVDM0IsIDB4MTdBMSwgMHg1QzNDLCAweDAzMzUsIDB4NUMzRSwKKyAgICAweDA0ODgsIDB4NUMzRiwgMHgwNDg3LCAweDVDNDAsIDB4MDQ4NSwgMHg1QzQxLCAweDA0ODYsIDB4NUM0NCwgMHgxOTVCLAorICAgIDB4NUM0NSwgMHgwNUEyLCAweDVDNDYsIDB4MDVBMywgMHg1QzQ3LCAweDE5NUMsIDB4NUM0OCwgMHgwNUExLCAweDVDNEIsCisgICAgMHgwNzBBLCAweDVDNEMsIDB4MUFCNCwgMHg1QzRELCAweDA3MDksIDB4NUM0RSwgMHgwNzA3LCAweDVDNEYsIDB4MDcwOCwKKyAgICAweDVDNTAsIDB4MDg5RSwgMHg1QzUxLCAweDA4OUMsIDB4NUM1NCwgMHgxQzdFLCAweDVDNTUsIDB4MDg5RCwgMHg1QzU2LAorICAgIDB4MUM3RCwgMHg1QzU4LCAweDA4OTIsIDB4NUM1OSwgMHgxRUJCLCAweDVDNUMsIDB4MEE1QywgMHg1QzVELCAweDBBNUQsCisgICAgMHg1QzYwLCAweDBBNUIsIDB4NUM2MiwgMHgwRkMyLCAweDVDNjMsIDB4MjY2MiwgMHg1QzY0LCAweDExMzQsIDB4NUM2NSwKKyAgICAweDExMzUsIDB4NUM2NywgMHgyOEI3LCAweDVDNjgsIDB4MTNDOCwgMHg1QzY5LCAweDJGMTksIDB4NUM2QSwgMHgyRjFBLAorICAgIDB4NUM2QywgMHgxNjZFLCAweDVDNkQsIDB4MzQ4MywgMHg1QzZFLCAweDE3NzYsIDB4NUM2RiwgMHgwMkNBLCAweDVDNzEsCisgICAgMHgwMjg2LCAweDVDNzMsIDB4MTdBMywgMHg1Qzc0LCAweDE3QTIsIDB4NUM3OSwgMHgwM0M3LCAweDVDN0EsIDB4MTdFMCwKKyAgICAweDVDN0IsIDB4MTdFMSwgMHg1QzdDLCAweDE3REYsIDB4NUM3RSwgMHgxN0UyLCAweDVDODYsIDB4MTg2RSwgMHg1Qzg4LAorICAgIDB4MTg2OSwgMHg1Qzg5LCAweDE4NkIsIDB4NUM4QSwgMHgxODZELCAweDVDOEIsIDB4MTg2QSwgMHg1QzhDLCAweDA0OEMsCisgICAgMHg1QzhELCAweDE4NjcsIDB4NUM4RiwgMHgxODY4LCAweDVDOTAsIDB4MDQ4OSwgMHg1QzkxLCAweDA0OEEsIDB4NUM5MiwKKyAgICAweDE4NkMsIDB4NUM5MywgMHgxODZGLCAweDVDOTQsIDB4MDQ4QiwgMHg1Qzk1LCAweDE4NzAsIDB4NUM5RCwgMHgxOTZBLAorICAgIDB4NUM5RiwgMHgxOTY0LCAweDVDQTAsIDB4MTk1RiwgMHg1Q0ExLCAweDA1QTUsIDB4NUNBMiwgMHgxOTY3LCAweDVDQTMsCisgICAgMHgxOTY1LCAweDVDQTQsIDB4MTk1RSwgMHg1Q0E1LCAweDE5NkIsIDB4NUNBNiwgMHgxOTZFLCAweDVDQTcsIDB4MTk2OSwKKyAgICAweDVDQTgsIDB4MTk2MiwgMHg1Q0E5LCAweDA1QTcsIDB4NUNBQSwgMHgxOTY4LCAweDVDQUIsIDB4MDVBOCwgMHg1Q0FDLAorICAgIDB4MTk2MywgMHg1Q0FELCAweDE5NjYsIDB4NUNBRSwgMHgxOTVELCAweDVDQUYsIDB4MTk2MSwgMHg1Q0IwLCAweDE5NkQsCisgICAgMHg1Q0IxLCAweDA1QTksIDB4NUNCMywgMHgwNUFBLCAweDVDQjUsIDB4MTk2MCwgMHg1Q0I2LCAweDE5NkMsIDB4NUNCNywKKyAgICAweDA1QTQsIDB4NUNCOCwgMHgwNUE2LCAweDVDQzYsIDB4MUFDNSwgMHg1Q0M3LCAweDFBQkUsIDB4NUNDOCwgMHgxQUM0LAorICAgIDB4NUNDOSwgMHgxQUJELCAweDVDQ0EsIDB4MUFCRiwgMHg1Q0NCLCAweDFBQjksIDB4NUNDQywgMHgxQUI3LCAweDVDQ0UsCisgICAgMHgxQUM2LCAweDVDQ0YsIDB4MUFDMywgMHg1Q0QwLCAweDFBQjUsIDB4NUNEMiwgMHgwNzBDLCAweDVDRDMsIDB4MUFDMSwKKyAgICAweDVDRDQsIDB4MUFDMiwgMHg1Q0Q2LCAweDFBQzAsIDB4NUNENywgMHgxQUI4LCAweDVDRDgsIDB4MUFCNiwgMHg1Q0Q5LAorICAgIDB4MDcwQiwgMHg1Q0RBLCAweDFBQkMsIDB4NUNEQiwgMHgxQUJBLCAweDVDREUsIDB4MUFCQiwgMHg1Q0RGLCAweDFBQzcsCisgICAgMHg1Q0U4LCAweDA4QTMsIDB4NUNFQSwgMHgwOEEyLCAweDVDRUMsIDB4MUM3RiwgMHg1Q0VELCAweDA4OUYsIDB4NUNFRSwKKyAgICAweDFDODEsIDB4NUNGMCwgMHgwOEE0LCAweDVDRjEsIDB4MUM4MiwgMHg1Q0Y0LCAweDA4QTcsIDB4NUNGNiwgMHgwOEE1LAorICAgIDB4NUNGNywgMHgxQzgzLCAweDVDRjgsIDB4MUFDOCwgMHg1Q0Y5LCAweDFDODUsIDB4NUNGQiwgMHgwOEExLCAweDVDRkQsCisgICAgMHgwOEEwLCAweDVDRkYsIDB4MUM4MCwgMHg1RDAwLCAweDFDODQsIDB4NUQwMSwgMHgwOEE2LCAweDVEMDYsIDB4MEE1RiwKKyAgICAweDVEMDcsIDB4MEE1RSwgMHg1RDBCLCAweDFFQkQsIDB4NUQwQywgMHgxRUMxLCAweDVEMEQsIDB4MUVDMywgMHg1RDBFLAorICAgIDB4MEE2MCwgMHg1RDBGLCAweDFFQzYsIDB4NUQxMSwgMHgwQTY0LCAweDVEMTIsIDB4MUVDOCwgMHg1RDE0LCAweDBBNjYsCisgICAgMHg1RDE2LCAweDBBNjIsIDB4NUQxNywgMHgwQTZBLCAweDVEMTksIDB4MEE2NywgMHg1RDFBLCAweDFFQkYsIDB4NUQxQiwKKyAgICAweDBBNjEsIDB4NUQxRCwgMHgxRUJFLCAweDVEMUUsIDB4MUVCQywgMHg1RDFGLCAweDFFQ0EsIDB4NUQyMCwgMHgxRUMwLAorICAgIDB4NUQyMiwgMHgwQTYzLCAweDVEMjMsIDB4MUVDOSwgMHg1RDI0LCAweDBBNjgsIDB4NUQyNSwgMHgxRUM1LCAweDVEMjYsCisgICAgMHgxRUM0LCAweDVEMjcsIDB4MEE2OSwgMHg1RDI4LCAweDFFQzIsIDB4NUQyOSwgMHgwQTY1LCAweDVEMkUsIDB4MUVDQiwKKyAgICAweDVEMzAsIDB4MUVDNywgMHg1RDMxLCAweDIxMjIsIDB4NUQzMiwgMHgyMTI5LCAweDVEMzMsIDB4MjExRSwgMHg1RDM0LAorICAgIDB4MEMzNCwgMHg1RDM1LCAweDIxMUEsIDB4NUQzNiwgMHgyMTJBLCAweDVEMzcsIDB4MjExNCwgMHg1RDM4LCAweDIxMjcsCisgICAgMHg1RDM5LCAweDIxMjUsIDB4NUQzQSwgMHgyMTFGLCAweDVEM0MsIDB4MjEyOCwgMHg1RDNELCAweDIxMjEsIDB4NUQzRiwKKyAgICAweDIxMTksIDB4NUQ0MCwgMHgyMTJCLCAweDVENDEsIDB4MjExNywgMHg1RDQyLCAweDIxMjQsIDB4NUQ0MywgMHgyMTE1LAorICAgIDB4NUQ0NSwgMHgyMTJDLCAweDVENDcsIDB4MEMzNSwgMHg1RDQ5LCAweDIxMjYsIDB4NUQ0QSwgMHgyM0JFLCAweDVENEIsCisgICAgMHgyMTE4LCAweDVENEMsIDB4MEMzMiwgMHg1RDRFLCAweDIxMUMsIDB4NUQ1MCwgMHgwQzMzLCAweDVENTEsIDB4MjExQiwKKyAgICAweDVENTIsIDB4MjEyMCwgMHg1RDU1LCAweDIxMUQsIDB4NUQ1OSwgMHgyMTIzLCAweDVENUUsIDB4MjNDMiwgMHg1RDYyLAorICAgIDB4MjNDNSwgMHg1RDYzLCAweDIzQkQsIDB4NUQ2NSwgMHgyM0JGLCAweDVENjcsIDB4MjNDNCwgMHg1RDY4LCAweDIzQzMsCisgICAgMHg1RDY5LCAweDBERkQsIDB4NUQ2QiwgMHgyMTE2LCAweDVENkMsIDB4MjNDMSwgMHg1RDZGLCAweDBERkUsIDB4NUQ3MSwKKyAgICAweDIzQkMsIDB4NUQ3MiwgMHgyM0MwLCAweDVENzcsIDB4MjY2OSwgMHg1RDc5LCAweDI2NzAsIDB4NUQ3QSwgMHgyNjY3LAorICAgIDB4NUQ3QywgMHgyNjZFLCAweDVEN0QsIDB4MjY2NSwgMHg1RDdFLCAweDI2NkQsIDB4NUQ3RiwgMHgyNjcxLCAweDVEODAsCisgICAgMHgyNjY0LCAweDVEODEsIDB4MjY2OCwgMHg1RDgyLCAweDI2NjMsIDB4NUQ4NCwgMHgwRkMzLCAweDVEODYsIDB4MjY2NiwKKyAgICAweDVEODcsIDB4MEZDNCwgMHg1RDg4LCAweDI2NkMsIDB4NUQ4OSwgMHgyNjZCLCAweDVEOEEsIDB4MjY2QSwgMHg1RDhELAorICAgIDB4MjY2RiwgMHg1RDkyLCAweDI4QkIsIDB4NUQ5MywgMHgyOEJELCAweDVEOTQsIDB4MTEzNywgMHg1RDk1LCAweDI4QkUsCisgICAgMHg1RDk3LCAweDI4QjksIDB4NUQ5OSwgMHgyOEI4LCAweDVEOUEsIDB4MjhDMiwgMHg1RDlDLCAweDI4QzAsIDB4NUQ5RCwKKyAgICAweDExMzYsIDB4NUQ5RSwgMHgyOEMzLCAweDVEOUYsIDB4MjhCQSwgMHg1REEwLCAweDI4QkYsIDB4NURBMSwgMHgyOEMxLAorICAgIDB4NURBMiwgMHgyOEJDLCAweDVEQTcsIDB4MkIyQywgMHg1REE4LCAweDJCMzEsIDB4NURBOSwgMHgyQjJCLCAweDVEQUEsCisgICAgMHgyQjMwLCAweDVEQUMsIDB4MkIyOSwgMHg1REFELCAweDJCMzMsIDB4NURBRSwgMHgyQjJGLCAweDVEQUYsIDB4MkIzNCwKKyAgICAweDVEQjAsIDB4MkIyRSwgMHg1REIxLCAweDJCMkEsIDB4NURCMiwgMHgyQjMyLCAweDVEQjQsIDB4MkIzNSwgMHg1REI1LAorICAgIDB4MkIyRCwgMHg1REI3LCAweDJENUIsIDB4NURCOCwgMHgxM0NDLCAweDVEQkEsIDB4MTNDQSwgMHg1REJDLCAweDEzQzksCisgICAgMHg1REJELCAweDEzQ0IsIDB4NURDMCwgMHgyRjFCLCAweDVEQzIsIDB4MzAyMywgMHg1REMzLCAweDMwOEMsIDB4NURDNiwKKyAgICAweDMxQ0QsIDB4NURDNywgMHgzMUNFLCAweDVEQzksIDB4MTYxMywgMHg1RENCLCAweDMyQ0UsIDB4NURDRCwgMHgxNjZGLAorICAgIDB4NURDRiwgMHgzMkNGLCAweDVERDEsIDB4MzM3RiwgMHg1REQyLCAweDE2QzIsIDB4NURENCwgMHgxNkMxLCAweDVERDUsCisgICAgMHgzMzdFLCAweDVERDYsIDB4MTZGNywgMHg1REQ4LCAweDM0MTQsIDB4NUREQiwgMHgwMjI2LCAweDVEREQsIDB4MDI4NywKKyAgICAweDVEREUsIDB4MDNDOCwgMHg1RERGLCAweDE3RTMsIDB4NURFMCwgMHgxODcxLCAweDVERTEsIDB4MDUxQSwgMHg1REUyLAorICAgIDB4MEE2QiwgMHg1REU1LCAweDAyODgsIDB4NURFNiwgMHgwMzM4LCAweDVERTcsIDB4MDMzNywgMHg1REU4LCAweDAzMzYsCisgICAgMHg1REVCLCAweDA0OEQsIDB4NURFRSwgMHgwOEE4LCAweDVERjAsIDB4MjNDNiwgMHg1REYxLCAweDAyODksIDB4NURGMiwKKyAgICAweDAyOEEsIDB4NURGMywgMHgwMjhCLCAweDVERjQsIDB4MDJDQiwgMHg1REY3LCAweDA3MEQsIDB4NURGOSwgMHgxQUM5LAorICAgIDB4NURGRCwgMHgwQzM2LCAweDVERkUsIDB4MDI4QywgMHg1REZGLCAweDE3ODgsIDB4NUUwMiwgMHgwMzM5LCAweDVFMDMsCisgICAgMHgwMzNBLCAweDVFMDQsIDB4MTdBNCwgMHg1RTA2LCAweDAzQzksIDB4NUUwQSwgMHgxODcyLCAweDVFMEMsIDB4MDQ4RSwKKyAgICAweDVFMEUsIDB4MTg3MywgMHg1RTExLCAweDA1QjAsIDB4NUUxNCwgMHgxOTcwLCAweDVFMTUsIDB4MDVBRSwgMHg1RTE2LAorICAgIDB4MDVBRCwgMHg1RTE3LCAweDE5NkYsIDB4NUUxOCwgMHgwNUFCLCAweDVFMTksIDB4MTk3MSwgMHg1RTFBLCAweDA1QUMsCisgICAgMHg1RTFCLCAweDA1QUYsIDB4NUUxRCwgMHgwNzBFLCAweDVFMUYsIDB4MDcxMCwgMHg1RTIwLCAweDFBQ0QsIDB4NUUyMSwKKyAgICAweDFBQ0EsIDB4NUUyMiwgMHgxQUNCLCAweDVFMjMsIDB4MUFDQywgMHg1RTI0LCAweDFBQ0UsIDB4NUUyNSwgMHgwNzBGLAorICAgIDB4NUUyOCwgMHgxQzg3LCAweDVFMjksIDB4MUM4NiwgMHg1RTJCLCAweDA4QUEsIDB4NUUyRCwgMHgwOEE5LCAweDVFMzMsCisgICAgMHgwQTZFLCAweDVFMzQsIDB4MUVDRCwgMHg1RTM2LCAweDBBNkQsIDB4NUUzNywgMHgwQTZGLCAweDVFMzgsIDB4MEE2QywKKyAgICAweDVFM0QsIDB4MEMzOCwgMHg1RTNFLCAweDFFQ0MsIDB4NUU0MCwgMHgwQzM5LCAweDVFNDEsIDB4MjEyRSwgMHg1RTQzLAorICAgIDB4MEMzQSwgMHg1RTQ0LCAweDIxMkQsIDB4NUU0NSwgMHgwQzM3LCAweDVFNEEsIDB4MjNDOSwgMHg1RTRCLCAweDIzQ0IsCisgICAgMHg1RTRDLCAweDBERkYsIDB4NUU0RCwgMHgyM0NBLCAweDVFNEUsIDB4MjNDOCwgMHg1RTRGLCAweDIzQzcsIDB4NUU1MywKKyAgICAweDI2NzQsIDB4NUU1NCwgMHgwRkM5LCAweDVFNTUsIDB4MEZDNywgMHg1RTU3LCAweDBGQzgsIDB4NUU1OCwgMHgyNjcyLAorICAgIDB4NUU1OSwgMHgyNjczLCAweDVFNUIsIDB4MEZDNSwgMHg1RTVDLCAweDI4QzcsIDB4NUU1RCwgMHgyOEM1LCAweDVFNUYsCisgICAgMHgxMTM5LCAweDVFNjAsIDB4MjhDNiwgMHg1RTYxLCAweDExM0EsIDB4NUU2MiwgMHgxMTM4LCAweDVFNjMsIDB4MEZDNiwKKyAgICAweDVFNjYsIDB4MkIzOCwgMHg1RTY3LCAweDJCMzYsIDB4NUU2OCwgMHgyQjM3LCAweDVFNjksIDB4MjhDNCwgMHg1RTZBLAorICAgIDB4MkQ1RCwgMHg1RTZCLCAweDEzQ0QsIDB4NUU2QywgMHgyRDVDLCAweDVFNkQsIDB4MkYxQywgMHg1RTZFLCAweDJGMUQsCisgICAgMHg1RTZGLCAweDJCMzksIDB4NUU3MCwgMHgzMDhELCAweDVFNzIsIDB4MDI4RCwgMHg1RTczLCAweDAzM0IsIDB4NUU3NCwKKyAgICAweDAzQ0IsIDB4NUU3NSwgMHgxN0U0LCAweDVFNzYsIDB4MDNDQSwgMHg1RTc4LCAweDA1QjEsIDB4NUU3OSwgMHgwRTAwLAorICAgIDB4NUU3QSwgMHgwMjI3LCAweDVFN0IsIDB4MDJDQywgMHg1RTdDLCAweDAzM0MsIDB4NUU3RCwgMHgwNzExLCAweDVFN0UsCisgICAgMHgwQzNCLCAweDVFN0YsIDB4MDIyOCwgMHg1RTgwLCAweDE3QTUsIDB4NUU4MiwgMHgxN0E2LCAweDVFODQsIDB4MTdFNSwKKyAgICAweDVFODcsIDB4MDQ5MCwgMHg1RTg4LCAweDE4NzcsIDB4NUU4OSwgMHgxODc1LCAweDVFOEEsIDB4MDQ5MSwgMHg1RThCLAorICAgIDB4MTg3NCwgMHg1RThDLCAweDE4NzYsIDB4NUU4RCwgMHgxODc4LCAweDVFOEYsIDB4MDQ4RiwgMHg1RTk1LCAweDA1QjUsCisgICAgMHg1RTk2LCAweDA1QjYsIDB4NUU5NywgMHgwNUIzLCAweDVFOUEsIDB4MDVCMiwgMHg1RTlCLCAweDFBRDIsIDB4NUU5QywKKyAgICAweDA1QjQsIDB4NUVBMCwgMHgwNzEyLCAweDVFQTIsIDB4MUFEMSwgMHg1RUEzLCAweDFBRDMsIDB4NUVBNCwgMHgxQUQwLAorICAgIDB4NUVBNSwgMHgxQUQ0LCAweDVFQTYsIDB4MDcxMywgMHg1RUE3LCAweDA4QUQsIDB4NUVBOCwgMHgxQzg4LCAweDVFQUEsCisgICAgMHgxQzhBLCAweDVFQUIsIDB4MDhBQiwgMHg1RUFDLCAweDFDOEIsIDB4NUVBRCwgMHgwOEFDLCAweDVFQUUsIDB4MUM4OSwKKyAgICAweDVFQjAsIDB4MUFDRiwgMHg1RUIxLCAweDFFQ0UsIDB4NUVCMiwgMHgxRUQxLCAweDVFQjMsIDB4MUVEMiwgMHg1RUI0LAorICAgIDB4MUVDRiwgMHg1RUI1LCAweDBBNzMsIDB4NUVCNiwgMHgwQTcyLCAweDVFQjcsIDB4MEE3MCwgMHg1RUI4LCAweDBBNzEsCisgICAgMHg1RUI5LCAweDFFRDAsIDB4NUVCRSwgMHgwQTc0LCAweDVFQzEsIDB4MEMzRCwgMHg1RUMyLCAweDBDM0UsIDB4NUVDNCwKKyAgICAweDBDM0YsIDB4NUVDNSwgMHgyM0NDLCAweDVFQzYsIDB4MjNDRSwgMHg1RUM3LCAweDIzRDAsIDB4NUVDOCwgMHgwRTAyLAorICAgIDB4NUVDOSwgMHgwRTAxLCAweDVFQ0EsIDB4MEMzQywgMHg1RUNCLCAweDIzQ0YsIDB4NUVDQywgMHgyM0NELCAweDVFQ0UsCisgICAgMHgyNjc4LCAweDVFRDEsIDB4MjY3NiwgMHg1RUQyLCAweDI2N0MsIDB4NUVEMywgMHgwRkNBLCAweDVFRDQsIDB4MjY3RCwKKyAgICAweDVFRDUsIDB4MjY3QSwgMHg1RUQ2LCAweDBGQ0IsIDB4NUVENywgMHgyNjc3LCAweDVFRDgsIDB4MjY3NSwgMHg1RUQ5LAorICAgIDB4MjY3QiwgMHg1RURBLCAweDExM0MsIDB4NUVEQiwgMHgyOEM5LCAweDVFREMsIDB4MjY3OSwgMHg1RURELCAweDExM0UsCisgICAgMHg1RURFLCAweDI4Q0EsIDB4NUVERiwgMHgxMTNELCAweDVFRTAsIDB4MTE0MCwgMHg1RUUxLCAweDI4Q0IsIDB4NUVFMiwKKyAgICAweDExM0IsIDB4NUVFMywgMHgxMTNGLCAweDVFRTUsIDB4MkIzRSwgMHg1RUU2LCAweDJCM0MsIDB4NUVFNywgMHgyQjNCLAorICAgIDB4NUVFOCwgMHgyQjNELCAweDVFRTksIDB4MkIzQSwgMHg1RUVDLCAweDE1N0QsIDB4NUVFRSwgMHgzMUNGLCAweDVFRUYsCisgICAgMHgzMUQwLCAweDVFRjEsIDB4MzJEMCwgMHg1RUYyLCAweDMzODAsIDB4NUVGMywgMHgxNzQyLCAweDVFRjQsIDB4MDIyOSwKKyAgICAweDVFRjYsIDB4MDVCNywgMHg1RUY3LCAweDA0OTIsIDB4NUVGQSwgMHgwNzE0LCAweDVFRkUsIDB4MDI4RSwgMHg1RUZGLAorICAgIDB4MDJDRCwgMHg1RjAxLCAweDAzM0QsIDB4NUYwMiwgMHgxN0U2LCAweDVGMDQsIDB4MDQ5MywgMHg1RjA1LCAweDE4NzksCisgICAgMHg1RjA3LCAweDFBRDUsIDB4NUYwOCwgMHgwNzE1LCAweDVGMEEsIDB4MEZDQywgMHg1RjBCLCAweDAyOEYsIDB4NUYwRiwKKyAgICAweDAzQ0MsIDB4NUYxMiwgMHgwRTAzLCAweDVGMTMsIDB4MDI5MCwgMHg1RjE0LCAweDAyQ0UsIDB4NUYxNSwgMHgwMkNGLAorICAgIDB4NUYxNywgMHgwMzNGLCAweDVGMTgsIDB4MDMzRSwgMHg1RjFBLCAweDE3RTcsIDB4NUYxQiwgMHgwM0NELCAweDVGMUQsCisgICAgMHgxODdBLCAweDVGMUYsIDB4MDQ5NCwgMHg1RjIyLCAweDE5NzMsIDB4NUYyMywgMHgxOTc0LCAweDVGMjQsIDB4MTk3NSwKKyAgICAweDVGMjYsIDB4MDVCOCwgMHg1RjI3LCAweDA1QjksIDB4NUYyOCwgMHgxOTcyLCAweDVGMjksIDB4MDVCQSwgMHg1RjJELAorICAgIDB4MDcxNiwgMHg1RjJFLCAweDFBRDYsIDB4NUYzMCwgMHgxQzhELCAweDVGMzEsIDB4MDhBRSwgMHg1RjMzLCAweDFDOEMsCisgICAgMHg1RjM1LCAweDBBNzUsIDB4NUYzNiwgMHgxRUQzLCAweDVGMzcsIDB4MEE3NiwgMHg1RjM4LCAweDFFRDQsIDB4NUYzQywKKyAgICAweDBDNDAsIDB4NUY0MCwgMHgyM0QxLCAweDVGNDMsIDB4MjY3RiwgMHg1RjQ0LCAweDI2N0UsIDB4NUY0NiwgMHgwRkNELAorICAgIDB4NUY0OCwgMHgxMTQxLCAweDVGNDksIDB4MjhDQywgMHg1RjRBLCAweDEyQUQsIDB4NUY0QiwgMHgyQjNGLCAweDVGNEMsCisgICAgMHgxM0NFLCAweDVGNEUsIDB4MTZDMywgMHg1RjRGLCAweDM0MTYsIDB4NUY1MCwgMHgwMjJBLCAweDVGNTQsIDB4MTk3NiwKKyAgICAweDVGNTYsIDB4MUFENywgMHg1RjU3LCAweDBBNzcsIDB4NUY1OCwgMHgyMTJGLCAweDVGNTksIDB4MEUwNCwgMHg1RjVELAorICAgIDB4MTRDRiwgMHg1RjYxLCAweDAyMkIsIDB4NUY2MiwgMHgwNDk2LCAweDVGNjQsIDB4MDQ5NSwgMHg1RjY1LCAweDA3MTcsCisgICAgMHg1RjY3LCAweDFDOEUsIDB4NUY2OSwgMHgwQTc5LCAweDVGNkEsIDB4MEI4OSwgMHg1RjZCLCAweDBBN0EsIDB4NUY2QywKKyAgICAweDBBNzgsIDB4NUY2RCwgMHgwQzQxLCAweDVGNkYsIDB4MjY4MCwgMHg1RjcwLCAweDBGQ0UsIDB4NUY3MSwgMHgxMTQyLAorICAgIDB4NUY3MywgMHgxNzc3LCAweDVGNzQsIDB4MTdFOCwgMHg1Rjc2LCAweDE4N0MsIDB4NUY3NywgMHgwNDk3LCAweDVGNzgsCisgICAgMHgxODdCLCAweDVGNzksIDB4MDQ5OCwgMHg1RjdDLCAweDA1QkUsIDB4NUY3RCwgMHgxOTc5LCAweDVGN0UsIDB4MTk3OCwKKyAgICAweDVGN0YsIDB4MDVCRCwgMHg1RjgwLCAweDA1QkIsIDB4NUY4MSwgMHgwNUJDLCAweDVGODIsIDB4MTk3NywgMHg1Rjg1LAorICAgIDB4MDcxOSwgMHg1Rjg2LCAweDFBRDgsIDB4NUY4NywgMHgwNzFDLCAweDVGODgsIDB4MDcxOCwgMHg1Rjg5LCAweDA3MUUsCisgICAgMHg1RjhBLCAweDA3MUEsIDB4NUY4QiwgMHgwNzFCLCAweDVGOEMsIDB4MDcxRCwgMHg1RjkwLCAweDA4QjEsIDB4NUY5MSwKKyAgICAweDA4QjAsIDB4NUY5MiwgMHgwOEFGLCAweDVGOTYsIDB4MUVENiwgMHg1Rjk3LCAweDBBN0IsIDB4NUY5OCwgMHgwQTdFLAorICAgIDB4NUY5OSwgMHgwQTdDLCAweDVGOUIsIDB4MUVENSwgMHg1RjlDLCAweDBBODEsIDB4NUY5RSwgMHgwQTdELCAweDVGOUYsCisgICAgMHgxRUQ3LCAweDVGQTAsIDB4MEE4MCwgMHg1RkExLCAweDBBN0YsIDB4NUZBNSwgMHgyMTMxLCAweDVGQTYsIDB4MjEzMCwKKyAgICAweDVGQTgsIDB4MEM0NCwgMHg1RkE5LCAweDBDNDIsIDB4NUZBQSwgMHgwQzQzLCAweDVGQUIsIDB4MjEzMiwgMHg1RkFDLAorICAgIDB4MEUwNSwgMHg1RkFELCAweDIzRDMsIDB4NUZBRSwgMHgwRTA2LCAweDVGQUYsIDB4MjNEMiwgMHg1RkIyLCAweDI4Q0QsCisgICAgMHg1RkI1LCAweDExNDQsIDB4NUZCNiwgMHgyNjgxLCAweDVGQjcsIDB4MTE0MywgMHg1RkI5LCAweDBGQ0YsIDB4NUZCQiwKKyAgICAweDJCNDEsIDB4NUZCQywgMHgyQjQwLCAweDVGQkQsIDB4MTNDRiwgMHg1RkJFLCAweDJENUUsIDB4NUZCRiwgMHgzMDhFLAorICAgIDB4NUZDMCwgMHgzMUQxLCAweDVGQzEsIDB4MzFEMiwgMHg1RkMzLCAweDAyRDAsIDB4NUZDNSwgMHgwMzQwLCAweDVGQzksCisgICAgMHgxN0E3LCAweDVGQ0MsIDB4MDQ5QSwgMHg1RkNELCAweDA0OUMsIDB4NUZDRiwgMHgxN0VCLCAweDVGRDAsIDB4MTg3RiwKKyAgICAweDVGRDEsIDB4MTg3RSwgMHg1RkQyLCAweDE4N0QsIDB4NUZENCwgMHgxN0VBLCAweDVGRDUsIDB4MTdFOSwgMHg1RkQ2LAorICAgIDB4MDNDRiwgMHg1RkQ3LCAweDA0OUIsIDB4NUZEOCwgMHgwNDk5LCAweDVGRDksIDB4MDNDRSwgMHg1RkRELCAweDA1QkYsCisgICAgMHg1RkRFLCAweDE5N0EsIDB4NUZFMCwgMHgwNUMwLCAweDVGRTEsIDB4MTg4NCwgMHg1RkUzLCAweDE4ODYsIDB4NUZFNCwKKyAgICAweDE4ODUsIDB4NUZFNSwgMHgxOTdCLCAweDVGRTgsIDB4MTg4MSwgMHg1RkVBLCAweDA0QTAsIDB4NUZFQiwgMHgwNDlFLAorICAgIDB4NUZFRCwgMHgxODgwLCAweDVGRUUsIDB4MTg4MiwgMHg1RkVGLCAweDE4ODgsIDB4NUZGMSwgMHgwNDlELCAweDVGRjMsCisgICAgMHgxODgzLCAweDVGRjQsIDB4MTg4QywgMHg1RkY1LCAweDA1QzIsIDB4NUZGNywgMHgxODg5LCAweDVGRjgsIDB4MDQ5RiwKKyAgICAweDVGRkEsIDB4MTg4NywgMHg1RkZCLCAweDE4OEEsIDB4NUZGRCwgMHgwNUMxLCAweDVGRkYsIDB4MDVDMywgMHg2MDAwLAorICAgIDB4MTg4QiwgMHg2MDA5LCAweDE5OEYsIDB4NjAwQSwgMHgxOTgyLCAweDYwMEIsIDB4MTk4MCwgMHg2MDBDLCAweDE5OEUsCisgICAgMHg2MDBELCAweDE5ODksIDB4NjAwRSwgMHgwNzIzLCAweDYwMEYsIDB4MDVDNCwgMHg2MDEwLCAweDE5OEEsIDB4NjAxMSwKKyAgICAweDE5OEQsIDB4NjAxMiwgMHgwNzFGLCAweDYwMTMsIDB4MTk4QywgMHg2MDE0LCAweDA1QzUsIDB4NjAxNSwgMHgwNUNBLAorICAgIDB4NjAxNiwgMHgwNUM4LCAweDYwMTcsIDB4MTk4MywgMHg2MDE5LCAweDE5N0UsIDB4NjAxQSwgMHgxOTg1LCAweDYwMUIsCisgICAgMHgwNUNGLCAweDYwMUMsIDB4MTk5MCwgMHg2MDFELCAweDA3MjAsIDB4NjAxRSwgMHgxOTg2LCAweDYwMjAsIDB4MDcyMSwKKyAgICAweDYwMjEsIDB4MDVDQiwgMHg2MDIyLCAweDE5ODgsIDB4NjAyNCwgMHgxQUU3LCAweDYwMjUsIDB4MDcyMiwgMHg2MDI2LAorICAgIDB4MTk3RCwgMHg2MDI3LCAweDA1Q0MsIDB4NjAyOCwgMHgwNzI0LCAweDYwMjksIDB4MDVDRCwgMHg2MDJBLCAweDA1QzksCisgICAgMHg2MDJCLCAweDA1Q0UsIDB4NjAyQywgMHgxOTg3LCAweDYwMkQsIDB4MTk3QywgMHg2MDJFLCAweDE5OEIsIDB4NjAyRiwKKyAgICAweDA1QzYsIDB4NjAzMiwgMHgxOTdGLCAweDYwMzMsIDB4MTk4NCwgMHg2MDM0LCAweDE5ODEsIDB4NjAzNSwgMHgwNUM3LAorICAgIDB4NjAzNywgMHgxQUQ5LCAweDYwMzksIDB4MUFEQSwgMHg2MDQwLCAweDFBRTQsIDB4NjA0MSwgMHgxQzkyLCAweDYwNDIsCisgICAgMHgxQUU1LCAweDYwNDMsIDB4MDcyQSwgMHg2MDQ0LCAweDFBRTgsIDB4NjA0NSwgMHgxQURFLCAweDYwNDYsIDB4MDcyOSwKKyAgICAweDYwNDcsIDB4MUFFMCwgMHg2MDQ5LCAweDFBRTEsIDB4NjA0QywgMHgxQUUzLCAweDYwNEQsIDB4MDcyNSwgMHg2MDUwLAorICAgIDB4MDhCNSwgMHg2MDUyLCAweDM2RUMsIDB4NjA1MywgMHgxQURGLCAweDYwNTQsIDB4MUFEQiwgMHg2MDU1LCAweDA4QjYsCisgICAgMHg2MDU4LCAweDFBRTksIDB4NjA1OSwgMHgwOEIyLCAweDYwNUEsIDB4MUM5MCwgMHg2MDVCLCAweDFBRTIsIDB4NjA1RCwKKyAgICAweDFDOEYsIDB4NjA1RSwgMHgxQURELCAweDYwNUYsIDB4MUFFNiwgMHg2MDYyLCAweDA3MjgsIDB4NjA2MywgMHgwOEIzLAorICAgIDB4NjA2NCwgMHgwNzJFLCAweDYwNjUsIDB4MDhCNCwgMHg2MDY2LCAweDFBRUEsIDB4NjA2NywgMHgxQzkxLCAweDYwNjgsCisgICAgMHgwNzI3LCAweDYwNjksIDB4MDhCOCwgMHg2MDZBLCAweDA3MkQsIDB4NjA2QiwgMHgwNzJDLCAweDYwNkMsIDB4MDcyQiwKKyAgICAweDYwNkQsIDB4MDhCNywgMHg2MDZFLCAweDFBRUIsIDB4NjA2RiwgMHgwOEI5LCAweDYwNzAsIDB4MDcyNiwgMHg2MDcyLAorICAgIDB4MUFEQywgMHg2MDdGLCAweDBBODIsIDB4NjA4MCwgMHgxQzk1LCAweDYwODEsIDB4MUM5NywgMHg2MDgzLCAweDFDOTksCisgICAgMHg2MDg0LCAweDA4QkEsIDB4NjA4NSwgMHgwOEMwLCAweDYwODYsIDB4MUVEQSwgMHg2MDg3LCAweDFDOUQsIDB4NjA4OCwKKyAgICAweDFDOTQsIDB4NjA4OSwgMHgwQTg0LCAweDYwOEEsIDB4MUVEOCwgMHg2MDhDLCAweDA4QkYsIDB4NjA4RCwgMHgwOEJELAorICAgIDB4NjA4RSwgMHgxQzlGLCAweDYwOTAsIDB4MUVEOSwgMHg2MDkyLCAweDFDOTYsIDB4NjA5NCwgMHgwOEJFLCAweDYwOTUsCisgICAgMHgxQzlBLCAweDYwOTYsIDB4MDhDMSwgMHg2MDk3LCAweDFDOUMsIDB4NjA5QSwgMHgwOEJDLCAweDYwOUIsIDB4MUM5QiwKKyAgICAweDYwOUMsIDB4MUM5RSwgMHg2MDlELCAweDFDOTgsIDB4NjA5RiwgMHgwOEJCLCAweDYwQTAsIDB4MEE4NSwgMHg2MEEyLAorICAgIDB4MUM5MywgMHg2MEEzLCAweDBBODMsIDB4NjBBOCwgMHgwQTg2LCAweDYwQjAsIDB4MUVEQywgMHg2MEIxLCAweDFFRTUsCisgICAgMHg2MEIyLCAweDBDNDcsIDB4NjBCNCwgMHgwQTg4LCAweDYwQjUsIDB4MEE4RCwgMHg2MEI2LCAweDBDNDgsIDB4NjBCNywKKyAgICAweDFFRTcsIDB4NjBCOCwgMHgwQTk0LCAweDYwQjksIDB4MjEzNCwgMHg2MEJBLCAweDFFREQsIDB4NjBCQiwgMHgwQThDLAorICAgIDB4NjBCQywgMHgwQThGLCAweDYwQkQsIDB4MEE4QSwgMHg2MEJFLCAweDFFREIsIDB4NjBCRiwgMHgxRUU5LCAweDYwQzAsCisgICAgMHgxRUVDLCAweDYwQzEsIDB4MjE0MywgMHg2MEMzLCAweDFFRUEsIDB4NjBDNCwgMHgyMTM4LCAweDYwQzUsIDB4MEE4QiwKKyAgICAweDYwQzYsIDB4MEE5MiwgMHg2MEM3LCAweDBBOTYsIDB4NjBDOCwgMHgxRUU0LCAweDYwQzksIDB4MjEzMywgMHg2MENBLAorICAgIDB4MUVFOCwgMHg2MENCLCAweDBBODcsIDB4NjBDQywgMHgyMTM1LCAweDYwQ0QsIDB4MUVFQiwgMHg2MENFLCAweDIxMzcsCisgICAgMHg2MENGLCAweDFFRTAsIDB4NjBEMSwgMHgwQzQ1LCAweDYwRDMsIDB4MUVERSwgMHg2MEQ0LCAweDFFREYsIDB4NjBENSwKKyAgICAweDBBOTEsIDB4NjBEOCwgMHgwQTkwLCAweDYwRDksIDB4MUVFMiwgMHg2MERBLCAweDBBOTUsIDB4NjBEQiwgMHgxRUU2LAorICAgIDB4NjBEQywgMHgwQThFLCAweDYwREQsIDB4MUVFMywgMHg2MERGLCAweDBBOTMsIDB4NjBFMCwgMHgwQzQ5LCAweDYwRTEsCisgICAgMHgwQzQ2LCAweDYwRTIsIDB4MjEzNiwgMHg2MEU0LCAweDFFRTEsIDB4NjBFNiwgMHgwQTg5LCAweDYwRjAsIDB4MEM0RSwKKyAgICAweDYwRjEsIDB4MEM1MiwgMHg2MEYyLCAweDIxM0EsIDB4NjBGMywgMHgwRTBCLCAweDYwRjQsIDB4MEM1MCwgMHg2MEY1LAorICAgIDB4MjEzRSwgMHg2MEY2LCAweDBDNTQsIDB4NjBGNywgMHgyM0Q0LCAweDYwRjgsIDB4MjE0MCwgMHg2MEY5LCAweDBFMEQsCisgICAgMHg2MEZBLCAweDBDNEMsIDB4NjBGQiwgMHgwQzRGLCAweDYwRkMsIDB4MjE0MSwgMHg2MEZFLCAweDIxNDIsIDB4NjBGRiwKKyAgICAweDIxNDgsIDB4NjEwMCwgMHgwQzU2LCAweDYxMDEsIDB4MEUwRSwgMHg2MTAzLCAweDIxNDQsIDB4NjEwNCwgMHgyMTQ5LAorICAgIDB4NjEwNSwgMHgyMTNELCAweDYxMDYsIDB4MEUxOCwgMHg2MTA4LCAweDBFMEYsIDB4NjEwOSwgMHgwQzU1LCAweDYxMEEsCisgICAgMHgyMTNCLCAweDYxMEIsIDB4MjE0QSwgMHg2MTBELCAweDBFMTcsIDB4NjEwRSwgMHgwQzUzLCAweDYxMEYsIDB4MEUwOCwKKyAgICAweDYxMTAsIDB4MjE0NywgMHg2MTEyLCAweDBDNTcsIDB4NjExMywgMHgyMTNGLCAweDYxMTQsIDB4MjEzOSwgMHg2MTE1LAorICAgIDB4MEM0RCwgMHg2MTE2LCAweDIxM0MsIDB4NjExOCwgMHgyMTQ1LCAweDYxMUEsIDB4MEUwNywgMHg2MTFCLCAweDBFMEMsCisgICAgMHg2MTFDLCAweDBDNEEsIDB4NjExRCwgMHgyMTQ2LCAweDYxMUYsIDB4MEUwQSwgMHg2MTIzLCAweDBDNEIsIDB4NjEyNywKKyAgICAweDBFMTYsIDB4NjEyOCwgMHgyNjgzLCAweDYxMjksIDB4MjNERiwgMHg2MTJCLCAweDIzRDcsIDB4NjEyQywgMHgyNjgyLAorICAgIDB4NjEyRSwgMHgyM0RCLCAweDYxMkYsIDB4MjNERCwgMHg2MTMyLCAweDIzREEsIDB4NjEzNCwgMHgwRTE1LCAweDYxMzYsCisgICAgMHgyM0Q5LCAweDYxMzcsIDB4MEUxOSwgMHg2MTNCLCAweDI2OTIsIDB4NjEzRSwgMHgwRTE0LCAweDYxM0YsIDB4MEZEMSwKKyAgICAweDYxNDAsIDB4MjNFMCwgMHg2MTQxLCAweDI2ODQsIDB4NjE0NCwgMHgwRTEyLCAweDYxNDUsIDB4MjNEOCwgMHg2MTQ2LAorICAgIDB4MjNEQywgMHg2MTQ3LCAweDBGRDAsIDB4NjE0OCwgMHgwRTA5LCAweDYxNDksIDB4MjNENSwgMHg2MTRBLCAweDIzRDYsCisgICAgMHg2MTRCLCAweDBGRDIsIDB4NjE0QywgMHgwRTExLCAweDYxNEQsIDB4MEUxMywgMHg2MTRFLCAweDBFMTAsIDB4NjE0RiwKKyAgICAweDIzREUsIDB4NjE1MiwgMHgyNjg4LCAweDYxNTMsIDB4MjY4OSwgMHg2MTU0LCAweDI2OEUsIDB4NjE1NSwgMHgxMTQ5LAorICAgIDB4NjE1NiwgMHgyNjk1LCAweDYxNTgsIDB4MEZEOCwgMHg2MTVBLCAweDBGRDcsIDB4NjE1QiwgMHgyNjkwLCAweDYxNUQsCisgICAgMHgxMTQ4LCAweDYxNUUsIDB4MjY4NSwgMHg2MTVGLCAweDBGRDYsIDB4NjE2MSwgMHgyNjk0LCAweDYxNjIsIDB4MEZENCwKKyAgICAweDYxNjMsIDB4MEZENSwgMHg2MTY1LCAweDI2OTEsIDB4NjE2NiwgMHgyOERFLCAweDYxNjcsIDB4MTE0NiwgMHg2MTY4LAorICAgIDB4MEM1MSwgMHg2MTZBLCAweDI2OTMsIDB4NjE2QiwgMHgxMTRELCAweDYxNkMsIDB4MjY4QiwgMHg2MTZFLCAweDExNDcsCisgICAgMHg2MTcwLCAweDExNEMsIDB4NjE3MSwgMHgyNjg2LCAweDYxNzIsIDB4MjY4QSwgMHg2MTczLCAweDI2ODcsIDB4NjE3NCwKKyAgICAweDI2OEQsIDB4NjE3NSwgMHgwRkQ5LCAweDYxNzYsIDB4MTE0NSwgMHg2MTc3LCAweDBGRDMsIDB4NjE3OSwgMHgyOEQwLAorICAgIDB4NjE3QSwgMHgyNjhGLCAweDYxN0MsIDB4MTE0QiwgMHg2MTdFLCAweDExNEUsIDB4NjE4MCwgMHgyNjhDLCAweDYxODIsCisgICAgMHgxMTRBLCAweDYxODMsIDB4MjhDRiwgMHg2MTg5LCAweDI4RDQsIDB4NjE4QSwgMHgxMkIxLCAweDYxOEIsIDB4MjhDRSwKKyAgICAweDYxOEMsIDB4MkI0RCwgMHg2MThELCAweDI4REQsIDB4NjE4RSwgMHgxMTUyLCAweDYxOTAsIDB4MTE1MCwgMHg2MTkxLAorICAgIDB4MTJBRiwgMHg2MTkyLCAweDI4REEsIDB4NjE5MywgMHgyOEQ2LCAweDYxOTQsIDB4MTE1NiwgMHg2MTk2LCAweDJCNDQsCisgICAgMHg2MTlBLCAweDExNTQsIDB4NjE5QiwgMHgyOEQ1LCAweDYxOUQsIDB4MkI0MiwgMHg2MTlGLCAweDI4RDksIDB4NjFBMSwKKyAgICAweDI4REMsIDB4NjFBMiwgMHgyOEQzLCAweDYxQTQsIDB4MTE1NSwgMHg2MUE3LCAweDExNEYsIDB4NjFBOCwgMHgyQjQzLAorICAgIDB4NjFBOSwgMHgxMkIwLCAweDYxQUEsIDB4MjhEQiwgMHg2MUFCLCAweDExNTEsIDB4NjFBQywgMHgxMTUzLCAweDYxQUQsCisgICAgMHgyOEQ4LCAweDYxQUUsIDB4MTE1NywgMHg2MUFGLCAweDI4RDcsIDB4NjFCMCwgMHgyOEQyLCAweDYxQjEsIDB4MjhEMSwKKyAgICAweDYxQjIsIDB4MTJBRSwgMHg2MUIzLCAweDI4REYsIDB4NjFCNCwgMHgyQjQ2LCAweDYxQjUsIDB4MkQ2MCwgMHg2MUI2LAorICAgIDB4MTJCMywgMHg2MUI4LCAweDJCNEMsIDB4NjFCQSwgMHgyQjRBLCAweDYxQkMsIDB4MkQ2MSwgMHg2MUJFLCAweDEyQjQsCisgICAgMHg2MUJGLCAweDJCNEIsIDB4NjFDMSwgMHgyQjQ4LCAweDYxQzIsIDB4MTNEMSwgMHg2MUMzLCAweDJENUYsIDB4NjFDNSwKKyAgICAweDJCNDUsIDB4NjFDNiwgMHgyQjQ3LCAweDYxQzcsIDB4MTNEMiwgMHg2MUM4LCAweDEyQjYsIDB4NjFDOSwgMHgxM0QwLAorICAgIDB4NjFDQSwgMHgxMkI1LCAweDYxQ0IsIDB4MTNENCwgMHg2MUNDLCAweDJCNDksIDB4NjFDRCwgMHgxMkIyLCAweDYxRDYsCisgICAgMHgyRjI2LCAweDYxRDgsIDB4MkYxRSwgMHg2MURFLCAweDJENjcsIDB4NjFERiwgMHgyRjFGLCAweDYxRTAsIDB4MkQ2MywKKyAgICAweDYxRTMsIDB4MTREMCwgMHg2MUU0LCAweDJENjUsIDB4NjFFNSwgMHgyRDY0LCAweDYxRTYsIDB4MTNEMywgMHg2MUU3LAorICAgIDB4MkQ2MiwgMHg2MUU4LCAweDJENjYsIDB4NjFFOSwgMHgyRjI3LCAweDYxRUEsIDB4MkYyMywgMHg2MUVCLCAweDJGMjUsCisgICAgMHg2MUVELCAweDJGMjAsIDB4NjFFRSwgMHgyRjIxLCAweDYxRjAsIDB4MkYyNCwgMHg2MUYxLCAweDJGMjIsIDB4NjFGMiwKKyAgICAweDE1N0UsIDB4NjFGNSwgMHgxNTgxLCAweDYxRjYsIDB4MTU4MCwgMHg2MUY3LCAweDE1N0YsIDB4NjFGOCwgMHgxNjE0LAorICAgIDB4NjFGOSwgMHgzMUQzLCAweDYxRkEsIDB4MTYxNSwgMHg2MUZCLCAweDMwOEYsIDB4NjFGQywgMHgxNjcwLCAweDYxRkQsCisgICAgMHgzMkQxLCAweDYxRkUsIDB4MTY3MSwgMHg2MUZGLCAweDE2QzQsIDB4NjIwMCwgMHgxNkY4LCAweDYyMDEsIDB4MzQxNywKKyAgICAweDYyMDMsIDB4MzQxOCwgMHg2MjA0LCAweDM0MTksIDB4NjIwNywgMHgzNTMzLCAweDYyMDgsIDB4MDJEMSwgMHg2MjA5LAorICAgIDB4MTdBOCwgMHg2MjBBLCAweDAzNDEsIDB4NjIwQywgMHgwM0QxLCAweDYyMEQsIDB4MDNEMiwgMHg2MjBFLCAweDAzRDAsCisgICAgMHg2MjEwLCAweDAzRDMsIDB4NjIxMSwgMHgwNEEyLCAweDYyMTIsIDB4MDRBMSwgMHg2MjE0LCAweDE5OTEsIDB4NjIxNSwKKyAgICAweDA1RDEsIDB4NjIxNiwgMHgwNUQwLCAweDYyMTksIDB4MUNBMCwgMHg2MjFBLCAweDBBOTcsIDB4NjIxQiwgMHgwQTk4LAorICAgIDB4NjIxRiwgMHgwQzU4LCAweDYyMjAsIDB4MjNFMSwgMHg2MjIxLCAweDBFMUEsIDB4NjIyMiwgMHgwRTFCLCAweDYyMjMsCisgICAgMHgyM0UzLCAweDYyMjQsIDB4MjNFNSwgMHg2MjI1LCAweDIzRTQsIDB4NjIyNywgMHgyNjk3LCAweDYyMjksIDB4MjY5NiwKKyAgICAweDYyMkEsIDB4MEZEQSwgMHg2MjJCLCAweDI2OTgsIDB4NjIyRCwgMHgyOEUwLCAweDYyMkUsIDB4MTE1OCwgMHg2MjMwLAorICAgIDB4MTJCNywgMHg2MjMyLCAweDEzRDUsIDB4NjIzMywgMHgxNEQxLCAweDYyMzQsIDB4MTNENiwgMHg2MjM2LCAweDAyRDIsCisgICAgMHg2MjNBLCAweDE4OEQsIDB4NjIzRCwgMHgxOTkyLCAweDYyM0UsIDB4MDVEMywgMHg2MjNGLCAweDA1RDIsIDB4NjI0MCwKKyAgICAweDA1RDQsIDB4NjI0MSwgMHgwNzJGLCAweDYyNDIsIDB4MUFFQywgMHg2MjQzLCAweDFBRUQsIDB4NjI0NiwgMHgxQ0ExLAorICAgIDB4NjI0NywgMHgwOEMyLCAweDYyNDgsIDB4MEE5OSwgMHg2MjQ5LCAweDBDNTksIDB4NjI0QSwgMHgyMTRCLCAweDYyNEIsCisgICAgMHgwMkQzLCAweDYyNEQsIDB4MDI5MSwgMHg2MjRFLCAweDAyRDQsIDB4NjI1MCwgMHgxN0E5LCAweDYyNTEsIDB4MDM0NSwKKyAgICAweDYyNTIsIDB4MDM0NCwgMHg2MjUzLCAweDAzNDIsIDB4NjI1NCwgMHgwMzQzLCAweDYyNTgsIDB4MDNENiwgMHg2MjU5LAorICAgIDB4MTdGMiwgMHg2MjVBLCAweDE3RjQsIDB4NjI1QiwgMHgwM0Q1LCAweDYyNUMsIDB4MTdFQywgMHg2MjVFLCAweDE3RUQsCisgICAgMHg2MjYwLCAweDE3RjMsIDB4NjI2MSwgMHgxN0VGLCAweDYyNjIsIDB4MTdGMSwgMHg2MjYzLCAweDAzRDQsIDB4NjI2NCwKKyAgICAweDE3RUUsIDB4NjI2NSwgMHgxN0Y1LCAweDYyNjYsIDB4MTdGMCwgMHg2MjZELCAweDA0QTksIDB4NjI2RSwgMHgwNEIyLAorICAgIDB4NjI2RiwgMHgwNEIwLCAweDYyNzAsIDB4MTg5NywgMHg2MjcxLCAweDE4OTQsIDB4NjI3MiwgMHgxODlDLCAweDYyNzMsCisgICAgMHgwNEFFLCAweDYyNzQsIDB4MTg5RCwgMHg2Mjc2LCAweDA0QTcsIDB4NjI3NywgMHgxODlBLCAweDYyNzksIDB4MDRBRCwKKyAgICAweDYyN0EsIDB4MTg5NiwgMHg2MjdCLCAweDE4OTUsIDB4NjI3QywgMHgwNEFCLCAweDYyN0QsIDB4MTg5QiwgMHg2MjdFLAorICAgIDB4MDRBQywgMHg2MjdGLCAweDA1RDUsIDB4NjI4MCwgMHgwNEE2LCAweDYyODEsIDB4MTg5OCwgMHg2MjgzLCAweDE4OEUsCisgICAgMHg2Mjg0LCAweDA0QTMsIDB4NjI4NiwgMHgwNEI2LCAweDYyODcsIDB4MTg5MywgMHg2Mjg4LCAweDE4OTksIDB4NjI4OSwKKyAgICAweDA0QTgsIDB4NjI4QSwgMHgwNEFBLCAweDYyOEMsIDB4MTg4RiwgMHg2MjhFLCAweDE4OTAsIDB4NjI4RiwgMHgxODkxLAorICAgIDB4NjI5MSwgMHgwNEI1LCAweDYyOTIsIDB4MDRBRiwgMHg2MjkzLCAweDA0QjQsIDB4NjI5NCwgMHgxODkyLCAweDYyOTUsCisgICAgMHgwNEIzLCAweDYyOTYsIDB4MDRBNSwgMHg2Mjk3LCAweDA0QTQsIDB4NjI5OCwgMHgwNEIxLCAweDYyQTgsIDB4MDVFMywKKyAgICAweDYyQTksIDB4MTk5RSwgMHg2MkFBLCAweDE5OTcsIDB4NjJBQiwgMHgwNURFLCAweDYyQUMsIDB4MDVGMSwgMHg2MkFELAorICAgIDB4MTk5MywgMHg2MkFFLCAweDE5OUEsIDB4NjJBRiwgMHgxOTlDLCAweDYyQjAsIDB4MTk5RiwgMHg2MkIxLCAweDA1RUMsCisgICAgMHg2MkIzLCAweDE5OUIsIDB4NjJCNCwgMHgxOTk0LCAweDYyQjUsIDB4MDVFQSwgMHg2MkI2LCAweDE5OTgsIDB4NjJCOCwKKyAgICAweDE5QTAsIDB4NjJCOSwgMHgwNURCLCAweDYyQkIsIDB4MTk5RCwgMHg2MkJDLCAweDA1RTUsIDB4NjJCRCwgMHgwNUU0LAorICAgIDB4NjJCRSwgMHgxOTk2LCAweDYyQkYsIDB4MDVEOSwgMHg2MkMyLCAweDA1REEsIDB4NjJDNCwgMHgwNUQ4LCAweDYyQzYsCisgICAgMHgwNUYwLCAweDYyQzcsIDB4MDVFOCwgMHg2MkM4LCAweDA1RTIsIDB4NjJDOSwgMHgwNUQ2LCAweDYyQ0EsIDB4MTk5OSwKKyAgICAweDYyQ0IsIDB4MDVFMSwgMHg2MkNDLCAweDA1RDcsIDB4NjJDRCwgMHgwNUU5LCAweDYyQ0UsIDB4MDVGMiwgMHg2MkNGLAorICAgIDB4MUFFRSwgMHg2MkQwLCAweDA1RTYsIDB4NjJEMSwgMHgxOTk1LCAweDYyRDIsIDB4MDVEQywgMHg2MkQzLCAweDA1REYsCisgICAgMHg2MkQ0LCAweDA1RTAsIDB4NjJENiwgMHgwNUVFLCAweDYyRDcsIDB4MDVFRiwgMHg2MkQ4LCAweDA1RUQsIDB4NjJEOSwKKyAgICAweDA1RTcsIDB4NjJEQSwgMHgwNUVCLCAweDYyREIsIDB4MDVERCwgMHg2MkRDLCAweDA3MzAsIDB4NjJFQiwgMHgxQUY0LAorICAgIDB4NjJFQywgMHgwNzNDLCAweDYyRUQsIDB4MDczNCwgMHg2MkVFLCAweDA3MzYsIDB4NjJFRiwgMHgwNzNCLCAweDYyRjAsCisgICAgMHgxQjAwLCAweDYyRjEsIDB4MDczOSwgMHg2MkYyLCAweDFDQTIsIDB4NjJGMywgMHgwOEMzLCAweDYyRjQsIDB4MDczRSwKKyAgICAweDYyRjUsIDB4MUFGMSwgMHg2MkY2LCAweDFBRjksIDB4NjJGNywgMHgwNzNBLCAweDYyRjgsIDB4MUFGOCwgMHg2MkY5LAorICAgIDB4MUFGNSwgMHg2MkZBLCAweDFBRkQsIDB4NjJGQiwgMHgxQUZGLCAweDYyRkMsIDB4MDczMywgMHg2MkZELCAweDA3MzcsCisgICAgMHg2MkZFLCAweDA3M0QsIDB4NjJGRiwgMHgwOEM1LCAweDYzMDAsIDB4MUFGQSwgMHg2MzAxLCAweDA3MzUsIDB4NjMwMiwKKyAgICAweDA3NDAsIDB4NjMwMywgMHgxQUYzLCAweDYzMDcsIDB4MDczOCwgMHg2MzA4LCAweDA4QzQsIDB4NjMwOSwgMHgwNzMyLAorICAgIDB4NjMwQiwgMHgxQUYwLCAweDYzMEMsIDB4MUFGNywgMHg2MzBELCAweDFBRUYsIDB4NjMwRSwgMHgxQUYyLCAweDYzMEYsCisgICAgMHgxQUY2LCAweDYzMTAsIDB4MUNBMywgMHg2MzExLCAweDA3M0YsIDB4NjMxMywgMHgxQUZCLCAweDYzMTQsIDB4MUFGQywKKyAgICAweDYzMTUsIDB4MUFGRSwgMHg2MzE2LCAweDA3MzEsIDB4NjMyOCwgMHgwOEQzLCAweDYzMjksIDB4MUNBRiwgMHg2MzJBLAorICAgIDB4MDhEMSwgMHg2MzJCLCAweDA4RDIsIDB4NjMyQywgMHgxQ0E1LCAweDYzMkQsIDB4MUNCNSwgMHg2MzJGLCAweDA4QzgsCisgICAgMHg2MzMyLCAweDFFRUQsIDB4NjMzMywgMHgxQ0I3LCAweDYzMzQsIDB4MUNCMSwgMHg2MzM2LCAweDFDQTgsIDB4NjMzOCwKKyAgICAweDFDQkEsIDB4NjMzOSwgMHgxQ0FCLCAweDYzM0EsIDB4MDhDRSwgMHg2MzNCLCAweDFGMDQsIDB4NjMzQywgMHgxQ0FFLAorICAgIDB4NjMzRCwgMHgwOEQwLCAweDYzM0UsIDB4MDhDNywgMHg2MzQwLCAweDFDQkMsIDB4NjM0MSwgMHgxQ0IwLCAweDYzNDIsCisgICAgMHgwOENBLCAweDYzNDMsIDB4MUNBOSwgMHg2MzQ0LCAweDFDQTYsIDB4NjM0NSwgMHgxQ0E3LCAweDYzNDYsIDB4MDhDQiwKKyAgICAweDYzNDcsIDB4MUNCNiwgMHg2MzQ4LCAweDFDQkQsIDB4NjM0OSwgMHgwOENELCAweDYzNEEsIDB4MUNBRCwgMHg2MzRCLAorICAgIDB4MUNBQywgMHg2MzRDLCAweDA4RDUsIDB4NjM0RCwgMHgwOEQ0LCAweDYzNEUsIDB4MDhDNiwgMHg2MzRGLCAweDA4Q0MsCisgICAgMHg2MzUwLCAweDA4Q0YsIDB4NjM1MSwgMHgxQ0I5LCAweDYzNTQsIDB4MUNCMywgMHg2MzU1LCAweDA4QzksIDB4NjM1NiwKKyAgICAweDFDQTQsIDB4NjM1NywgMHgxQ0JCLCAweDYzNTgsIDB4MUNCMiwgMHg2MzU5LCAweDFDQjQsIDB4NjM1QSwgMHgxQ0I4LAorICAgIDB4NjM2NSwgMHgxRUVFLCAweDYzNjcsIDB4MEFBMSwgMHg2MzY4LCAweDBBQjUsIDB4NjM2OSwgMHgwQUI0LCAweDYzNkIsCisgICAgMHgwQUE5LCAweDYzNkQsIDB4MUYwMCwgMHg2MzZFLCAweDFFRkMsIDB4NjM2RiwgMHgxRUY5LCAweDYzNzAsIDB4MUYwQiwKKyAgICAweDYzNzEsIDB4MEFBNCwgMHg2MzcyLCAweDBBOUMsIDB4NjM3NSwgMHgxRUZFLCAweDYzNzYsIDB4MEM2OSwgMHg2Mzc3LAorICAgIDB4MEFBMCwgMHg2Mzc4LCAweDFGMDYsIDB4NjM3QSwgMHgwQUI2LCAweDYzN0IsIDB4MEFCMywgMHg2MzdDLCAweDFGMDIsCisgICAgMHg2MzdELCAweDFFRjEsIDB4NjM4MCwgMHgwQUIyLCAweDYzODEsIDB4MUYwOCwgMHg2MzgyLCAweDFFRjAsIDB4NjM4MywKKyAgICAweDBBQTcsIDB4NjM4NCwgMHgwQUFCLCAweDYzODUsIDB4MUYwNywgMHg2Mzg3LCAweDFFRkEsIDB4NjM4OCwgMHgwQUFDLAorICAgIDB4NjM4OSwgMHgwQUE2LCAweDYzOEEsIDB4MUVFRiwgMHg2MzhDLCAweDBDNUIsIDB4NjM4RCwgMHgxRjBBLCAweDYzOEUsCisgICAgMHgxRUY4LCAweDYzOEYsIDB4MEFCMSwgMHg2MzkwLCAweDFFRkIsIDB4NjM5MSwgMHgxRjA5LCAweDYzOTIsIDB4MEFCMCwKKyAgICAweDYzOTQsIDB4MjE0QywgMHg2Mzk2LCAweDBBOUQsIDB4NjM5NywgMHgxRUY2LCAweDYzOTgsIDB4MEFBMiwgMHg2Mzk5LAorICAgIDB4MEFBRCwgMHg2MzlCLCAweDBBQTgsIDB4NjM5QywgMHgxRUZGLCAweDYzOUQsIDB4MUVGNSwgMHg2MzlFLCAweDFFRjMsCisgICAgMHg2MzlGLCAweDFGMDUsIDB4NjNBMCwgMHgwQTlBLCAweDYzQTEsIDB4MEFBRSwgMHg2M0EyLCAweDBBOUUsIDB4NjNBMywKKyAgICAweDBDNUEsIDB4NjNBNCwgMHgxRjAzLCAweDYzQTUsIDB4MEE5RiwgMHg2M0E3LCAweDBBOUIsIDB4NjNBOCwgMHgwQUFBLAorICAgIDB4NjNBOSwgMHgwQUE1LCAweDYzQUEsIDB4MEFBMywgMHg2M0FCLCAweDFFRjcsIDB4NjNBQywgMHgwQUFGLCAweDYzQUQsCisgICAgMHgxRUY0LCAweDYzQUUsIDB4MUYwMSwgMHg2M0FGLCAweDFFRkQsIDB4NjNCMCwgMHgyMTRFLCAweDYzQjEsIDB4MjE0RCwKKyAgICAweDYzQkQsIDB4MUVGMiwgMHg2M0JFLCAweDIxNUUsIDB4NjNDMCwgMHgwQzVELCAweDYzQzIsIDB4MjE2NCwgMHg2M0MzLAorICAgIDB4MjE1MywgMHg2M0M0LCAweDIxNjEsIDB4NjNDNSwgMHgyM0U2LCAweDYzQzYsIDB4MEM2MCwgMHg2M0M3LCAweDIxNjUsCisgICAgMHg2M0M4LCAweDIxNjgsIDB4NjNDOSwgMHgwQzVGLCAweDYzQ0EsIDB4MjE1NiwgMHg2M0NCLCAweDIxNjcsIDB4NjNDQywKKyAgICAweDIxNjYsIDB4NjNDRCwgMHgwQzYxLCAweDYzQ0UsIDB4MjE0RiwgMHg2M0NGLCAweDBDNUMsIDB4NjNEMCwgMHgwQzY0LAorICAgIDB4NjNEMiwgMHgwQzYyLCAweDYzRDMsIDB4MjE2MywgMHg2M0Q1LCAweDIxNTksIDB4NjNENiwgMHgwQzY2LCAweDYzRDcsCisgICAgMHgyMTZBLCAweDYzRDgsIDB4MjE2MiwgMHg2M0Q5LCAweDIxNkIsIDB4NjNEQSwgMHgwQzZFLCAweDYzREIsIDB4MEM2QywKKyAgICAweDYzREMsIDB4MjE2MCwgMHg2M0RELCAweDIxNUYsIDB4NjNERiwgMHgyMTVELCAweDYzRTAsIDB4MjE1NywgMHg2M0UxLAorICAgIDB4MEM2NSwgMHg2M0UzLCAweDBDNjMsIDB4NjNFNCwgMHgxQ0FBLCAweDYzRTUsIDB4MjE1MCwgMHg2M0U3LCAweDI0MDQsCisgICAgMHg2M0U4LCAweDIxNTEsIDB4NjNFOSwgMHgwQzVFLCAweDYzRUEsIDB4MEM2QiwgMHg2M0VCLCAweDIzRTgsIDB4NjNFRCwKKyAgICAweDBDNjcsIDB4NjNFRSwgMHgwQzY4LCAweDYzRUYsIDB4MjE1MiwgMHg2M0YwLCAweDIxNjksIDB4NjNGMSwgMHgyM0U3LAorICAgIDB4NjNGMiwgMHgyMTVBLCAweDYzRjMsIDB4MjE1NSwgMHg2M0Y0LCAweDBDNkEsIDB4NjNGNSwgMHgyMTVCLCAweDYzRjYsCisgICAgMHgyMTU4LCAweDYzRjksIDB4MEM2RiwgMHg2NDA2LCAweDBFMkEsIDB4NjQwOSwgMHgyM0VCLCAweDY0MEEsIDB4MjNGRSwKKyAgICAweDY0MEIsIDB4MjQwMywgMHg2NDBDLCAweDIzRjcsIDB4NjQwRCwgMHgwRTI2LCAweDY0MEUsIDB4MjQwOCwgMHg2NDBGLAorICAgIDB4MEUyMywgMHg2NDEwLCAweDIzRTksIDB4NjQxMiwgMHgyM0VBLCAweDY0MTMsIDB4MEUxQywgMHg2NDE0LCAweDBFMjUsCisgICAgMHg2NDE1LCAweDIzRjEsIDB4NjQxNiwgMHgwRTI4LCAweDY0MTcsIDB4MEUyOSwgMHg2NDE4LCAweDIzRjIsIDB4NjQxQSwKKyAgICAweDIzRkYsIDB4NjQxQiwgMHgyNDA1LCAweDY0MUMsIDB4MEUyNCwgMHg2NDFFLCAweDBFMUUsIDB4NjQxRiwgMHgyM0YwLAorICAgIDB4NjQyMCwgMHgyM0VDLCAweDY0MjEsIDB4MjQwNywgMHg2NDIyLCAweDIzRjUsIDB4NjQyMywgMHgyM0Y2LCAweDY0MjQsCisgICAgMHgyM0VELCAweDY0MjUsIDB4MjQwMSwgMHg2NDI2LCAweDIzRjgsIDB4NjQyNywgMHgyNDAyLCAweDY0MjgsIDB4MjNGQSwKKyAgICAweDY0MkEsIDB4MEUxRiwgMHg2NDJCLCAweDI2OTksIDB4NjQyQywgMHgwRTIyLCAweDY0MkQsIDB4MEUyMCwgMHg2NDJFLAorICAgIDB4MjQwNiwgMHg2NDJGLCAweDIzRkQsIDB4NjQzMCwgMHgyM0Y5LCAweDY0MzMsIDB4MjNFRSwgMHg2NDM0LCAweDBGRTQsCisgICAgMHg2NDM1LCAweDIzRkMsIDB4NjQzNiwgMHgwRTI3LCAweDY0MzcsIDB4MjNGNCwgMHg2NDM5LCAweDIzRjMsIDB4NjQzRCwKKyAgICAweDBFMjEsIDB4NjQzRSwgMHgwRTFELCAweDY0M0YsIDB4MjZBRSwgMHg2NDQwLCAweDI0MDAsIDB4NjQ0MSwgMHgyM0ZCLAorICAgIDB4NjQ0MywgMHgyM0VGLCAweDY0NEIsIDB4MjZBOSwgMHg2NDRELCAweDI2OUEsIDB4NjQ0RSwgMHgyNkE1LCAweDY0NTAsCisgICAgMHgyNkFDLCAweDY0NTEsIDB4MEZFMiwgMHg2NDUyLCAweDBDNkQsIDB4NjQ1MywgMHgyNkFBLCAweDY0NTQsIDB4MEZERCwKKyAgICAweDY0NTgsIDB4MEZEQywgMHg2NDU5LCAweDI2QjEsIDB4NjQ1QiwgMHgyNjlCLCAweDY0NUMsIDB4MjZBOCwgMHg2NDVELAorICAgIDB4MjY5QywgMHg2NDVFLCAweDI2QTcsIDB4NjQ1RiwgMHgwRkUwLCAweDY0NjAsIDB4MjZBQiwgMHg2NDYxLCAweDIxNUMsCisgICAgMHg2NDY1LCAweDI2QjIsIDB4NjQ2NiwgMHgyNkEzLCAweDY0NjcsIDB4MEZFMywgMHg2NDY4LCAweDI4RUUsIDB4NjQ2OSwKKyAgICAweDExNTksIDB4NjQ2QiwgMHgyNkIwLCAweDY0NkMsIDB4MjZBRiwgMHg2NDZELCAweDBGRTUsIDB4NjQ2RSwgMHgyOEUxLAorICAgIDB4NjQ2RiwgMHgxMTVBLCAweDY0NzAsIDB4MjhFMiwgMHg2NDcyLCAweDI2OUYsIDB4NjQ3MywgMHgyNkEwLCAweDY0NzQsCisgICAgMHgyNjlELCAweDY0NzUsIDB4MjZBMiwgMHg2NDc2LCAweDI2OUUsIDB4NjQ3NywgMHgyNkIzLCAweDY0NzgsIDB4MEZERiwKKyAgICAweDY0NzksIDB4MTE1QiwgMHg2NDdBLCAweDBGRTEsIDB4NjQ3QiwgMHgwRkU2LCAweDY0N0QsIDB4MjZBMSwgMHg2NDdGLAorICAgIDB4MjZBRCwgMHg2NDgyLCAweDI2QTYsIDB4NjQ4NSwgMHgyOEU1LCAweDY0ODcsIDB4MEZEQiwgMHg2NDg4LCAweDExNUUsCisgICAgMHg2NDg5LCAweDJCNTQsIDB4NjQ4QSwgMHgyOEVBLCAweDY0OEIsIDB4MjhFOSwgMHg2NDhDLCAweDI4RUIsIDB4NjQ4RiwKKyAgICAweDI4RTgsIDB4NjQ5MCwgMHgxMTVGLCAweDY0OTIsIDB4MTE2NSwgMHg2NDkzLCAweDExNjIsIDB4NjQ5NSwgMHgxMTYzLAorICAgIDB4NjQ5NiwgMHgyOEUzLCAweDY0OTcsIDB4MjhFNiwgMHg2NDk4LCAweDI4RjAsIDB4NjQ5OSwgMHgxMTZCLCAweDY0OUEsCisgICAgMHgxMTY5LCAweDY0OUMsIDB4MjhFNywgMHg2NDlELCAweDIxNTQsIDB4NjQ5RSwgMHgxMTVDLCAweDY0OUYsIDB4MjhFRCwKKyAgICAweDY0QTAsIDB4MjhFNCwgMHg2NEEyLCAweDExNkMsIDB4NjRBMywgMHgyOEVDLCAweDY0QTQsIDB4MEZERSwgMHg2NEE1LAorICAgIDB4MTE2MSwgMHg2NEE2LCAweDI2QTQsIDB4NjRBOSwgMHgxMTY0LCAweDY0QUIsIDB4MTE2OCwgMHg2NEFDLCAweDExNkEsCisgICAgMHg2NEFELCAweDExNjcsIDB4NjRBRSwgMHgxMTY2LCAweDY0QjAsIDB4MTE2MCwgMHg2NEIxLCAweDI4RUYsIDB4NjRCMiwKKyAgICAweDExNUQsIDB4NjRCMywgMHgxMTZELCAweDY0QkIsIDB4MTJCQiwgMHg2NEJDLCAweDEyQkMsIDB4NjRCRCwgMHgyQjUzLAorICAgIDB4NjRCRSwgMHgxMkM1LCAweDY0QkYsIDB4MTJDMiwgMHg2NEMxLCAweDEyQjksIDB4NjRDMiwgMHgxMkMwLCAweDY0QzMsCisgICAgMHgyQjU1LCAweDY0QzQsIDB4MTJCRSwgMHg2NEM1LCAweDEyQjgsIDB4NjRDNywgMHgxMkJGLCAweDY0QzksIDB4MkI1MiwKKyAgICAweDY0Q0EsIDB4MTNEOCwgMHg2NENCLCAweDEyQkEsIDB4NjRDRCwgMHgxMkMxLCAweDY0Q0UsIDB4MTNENywgMHg2NENGLAorICAgIDB4MkI1MSwgMHg2NEQwLCAweDJCNTAsIDB4NjREMiwgMHgxMkMzLCAweDY0RDQsIDB4MTJDNCwgMHg2NEQ2LCAweDJCNEYsCisgICAgMHg2NEQ3LCAweDJCNEUsIDB4NjREOCwgMHgxM0Q5LCAweDY0RDksIDB4MkI1OCwgMHg2NERBLCAweDEyQkQsIDB4NjREQiwKKyAgICAweDJCNTYsIDB4NjRFMCwgMHgxM0RBLCAweDY0RTIsIDB4MTNERiwgMHg2NEUzLCAweDJENkEsIDB4NjRFNCwgMHgyRDZDLAorICAgIDB4NjRFNiwgMHgxM0RDLCAweDY0RTgsIDB4MkQ2RCwgMHg2NEU5LCAweDJENjksIDB4NjRFQiwgMHgyRDZCLCAweDY0RUMsCisgICAgMHgxM0RELCAweDY0RUQsIDB4MTNFMCwgMHg2NEVGLCAweDJENjgsIDB4NjRGMCwgMHgxM0RCLCAweDY0RjEsIDB4MTNERSwKKyAgICAweDY0RjIsIDB4MTREMywgMHg2NEYzLCAweDJCNTcsIDB4NjRGNCwgMHgxNEQyLCAweDY0RjcsIDB4MTREOCwgMHg2NEY4LAorICAgIDB4MkYyQiwgMHg2NEZBLCAweDE0RDYsIDB4NjRGQiwgMHgxNEQ3LCAweDY0RkMsIDB4MkYyRSwgMHg2NEZELCAweDJGMkEsCisgICAgMHg2NEZFLCAweDE0RDQsIDB4NjRGRiwgMHgyRjI4LCAweDY1MDAsIDB4MTU4MiwgMHg2NTAxLCAweDJGMkMsIDB4NjUwMywKKyAgICAweDJGMkQsIDB4NjUwNCwgMHgyRjI5LCAweDY1MDYsIDB4MTRENSwgMHg2NTA3LCAweDMwOTAsIDB4NjUwOSwgMHgzMDkzLAorICAgIDB4NjUwQywgMHgzMDk0LCAweDY1MEQsIDB4MzA5MiwgMHg2NTBFLCAweDMwOTUsIDB4NjUwRiwgMHgxNTgzLCAweDY1MTAsCisgICAgMHgzMDkxLCAweDY1MTMsIDB4MzFENywgMHg2NTE0LCAweDE2MTcsIDB4NjUxNSwgMHgzMUQ2LCAweDY1MTYsIDB4MzFENSwKKyAgICAweDY1MTcsIDB4MzFENCwgMHg2NTE4LCAweDE2MTYsIDB4NjUxOSwgMHgxNjE4LCAweDY1MUIsIDB4MzJEMiwgMHg2NTFDLAorICAgIDB4MTY3MywgMHg2NTFELCAweDE2NzIsIDB4NjUyMCwgMHgzMzgyLCAweDY1MjEsIDB4MzM4MSwgMHg2NTIyLCAweDMzODQsCisgICAgMHg2NTIzLCAweDE2RjksIDB4NjUyNCwgMHgxNkM1LCAweDY1MjUsIDB4MzQxQiwgMHg2NTI2LCAweDMzODMsIDB4NjUyOSwKKyAgICAweDM0MUEsIDB4NjUyQSwgMHgxNkZCLCAweDY1MkIsIDB4MTZGQSwgMHg2NTJDLCAweDE3MjEsIDB4NjUyRCwgMHgzNDg0LAorICAgIDB4NjUyRSwgMHgzNENBLCAweDY1MkYsIDB4MDJENSwgMHg2NTMyLCAweDIxNkMsIDB4NjUzMywgMHgyQjU5LCAweDY1MzQsCisgICAgMHgwMjJDLCAweDY1MzYsIDB4MDNENywgMHg2NTM3LCAweDE3RjYsIDB4NjUzOCwgMHgwNEI5LCAweDY1MzksIDB4MDRCNywKKyAgICAweDY1M0IsIDB4MDRCOCwgMHg2NTNELCAweDE5QTEsIDB4NjUzRSwgMHgwNUYzLCAweDY1M0YsIDB4MDc0MSwgMHg2NTQxLAorICAgIDB4MUIwMSwgMHg2NTQzLCAweDFCMDIsIDB4NjU0NSwgMHgwNzQyLCAweDY1NDYsIDB4MUNCRiwgMHg2NTQ4LCAweDA4RDYsCisgICAgMHg2NTQ5LCAweDA4RDcsIDB4NjU0QSwgMHgxQ0JFLCAweDY1NEYsIDB4MEFCRCwgMHg2NTUxLCAweDBBQjksIDB4NjU1MywKKyAgICAweDFGMEMsIDB4NjU1NCwgMHgwQUMwLCAweDY1NTUsIDB4MEFCRiwgMHg2NTU2LCAweDBBQjgsIDB4NjU1NywgMHgwQUJCLAorICAgIDB4NjU1OCwgMHgwQUJFLCAweDY1NTksIDB4MEFCQSwgMHg2NTVDLCAweDIxNzAsIDB4NjU1RCwgMHgwQUI3LCAweDY1NUUsCisgICAgMHgwQzcwLCAweDY1NjIsIDB4MEM3MiwgMHg2NTYzLCAweDBDNzMsIDB4NjU2NCwgMHgyMTZGLCAweDY1NjUsIDB4MjE3MiwKKyAgICAweDY1NjYsIDB4MEM3MSwgMHg2NTY3LCAweDIxNkQsIDB4NjU2OCwgMHgyMTcxLCAweDY1NkEsIDB4MjE2RSwgMHg2NTZDLAorICAgIDB4MEUyQiwgMHg2NTZGLCAweDI0MDksIDB4NjU3MiwgMHgwRkU3LCAweDY1NzMsIDB4MjZCNCwgMHg2NTc0LCAweDEyQzYsCisgICAgMHg2NTc1LCAweDExNkUsIDB4NjU3NiwgMHgyOEYxLCAweDY1NzcsIDB4MTE2RiwgMHg2NTc4LCAweDExNzAsIDB4NjU3OSwKKyAgICAweDI4RjMsIDB4NjU3QSwgMHgyOEYyLCAweDY1N0IsIDB4MjhGNCwgMHg2NTdDLCAweDJCNUIsIDB4NjU3RiwgMHgyQjVBLAorICAgIDB4NjU4MCwgMHgyRDZGLCAweDY1ODEsIDB4MkQ2RSwgMHg2NTgyLCAweDEzRTEsIDB4NjU4MywgMHgxM0UyLCAweDY1ODQsCisgICAgMHgzMDk2LCAweDY1ODcsIDB4MDJENiwgMHg2NThDLCAweDIxNzMsIDB4NjU5MCwgMHgwQzc1LCAweDY1OTEsIDB4MEM3NCwKKyAgICAweDY1OTIsIDB4MjQwQSwgMHg2NTk0LCAweDJGMkYsIDB4NjU5NSwgMHgxNjc0LCAweDY1OTYsIDB4MzQxQywgMHg2NTk3LAorICAgIDB4MDJENywgMHg2NTk5LCAweDA4RDgsIDB4NjU5QiwgMHgwQUMyLCAweDY1OUMsIDB4MEFDMSwgMHg2NTlELCAweDIxNzQsCisgICAgMHg2NTlFLCAweDIxNzUsIDB4NjU5RiwgMHgwRTJDLCAweDY1QTAsIDB4MjZCNSwgMHg2NUExLCAweDBGRTgsIDB4NjVBMiwKKyAgICAweDJCNUMsIDB4NjVBNCwgMHgwMkQ4LCAweDY1QTUsIDB4MDM0NiwgMHg2NUE3LCAweDA1RjQsIDB4NjVBOCwgMHgxOUEyLAorICAgIDB4NjVBQSwgMHgxQjAzLCAweDY1QUIsIDB4MDc0MywgMHg2NUFDLCAweDBBQzMsIDB4NjVBRSwgMHgyMTc2LCAweDY1QUYsCisgICAgMHgwQzc2LCAweDY1QjAsIDB4MEUyRCwgMHg2NUIyLCAweDI4RjUsIDB4NjVCMywgMHgyOEY2LCAweDY1QjYsIDB4MkQ3MCwKKyAgICAweDY1QjcsIDB4MTREOSwgMHg2NUI4LCAweDM0Q0IsIDB4NjVCOSwgMHgwMkQ5LCAweDY1QkIsIDB4MTlBMywgMHg2NUJDLAorICAgIDB4MDVGNSwgMHg2NUJELCAweDA3NDQsIDB4NjVCRiwgMHgxQjA0LCAweDY1QzEsIDB4MDhEOSwgMHg2NUMyLCAweDFDQzMsCisgICAgMHg2NUMzLCAweDFDQzEsIDB4NjVDNCwgMHgxQ0MyLCAweDY1QzUsIDB4MDhEQSwgMHg2NUM2LCAweDFDQzAsIDB4NjVDQiwKKyAgICAweDBBQzUsIDB4NjVDQywgMHgwQUM2LCAweDY1Q0QsIDB4MUYwRCwgMHg2NUNFLCAweDBBQzcsIDB4NjVDRiwgMHgwQUM0LAorICAgIDB4NjVEMCwgMHgyMTc3LCAweDY1RDIsIDB4MjE3OCwgMHg2NUQzLCAweDI0MEIsIDB4NjVENiwgMHgwRkVBLCAweDY1RDcsCisgICAgMHgwRkU5LCAweDY1REEsIDB4MkQ3MSwgMHg2NURCLCAweDJGMzAsIDB4NjVERCwgMHgzMDk4LCAweDY1REUsIDB4MzA5NywKKyAgICAweDY1REYsIDB4MzFEOCwgMHg2NUUwLCAweDAyMkQsIDB4NjVFMSwgMHgxNzg5LCAweDY1RTIsIDB4MDc0NSwgMHg2NUU1LAorICAgIDB4MDJEQSwgMHg2NUU2LCAweDAzNDcsIDB4NjVFOCwgMHgwM0Q5LCAweDY1RTksIDB4MDNEOCwgMHg2NUVDLCAweDAzREEsCisgICAgMHg2NUVELCAweDAzREIsIDB4NjVFRSwgMHgxN0Y4LCAweDY1RUYsIDB4MTdGNywgMHg2NUYwLCAweDE4OUUsIDB4NjVGMSwKKyAgICAweDA0QkEsIDB4NjVGMiwgMHgxOEExLCAweDY1RjMsIDB4MThBMCwgMHg2NUY0LCAweDE4OUYsIDB4NjVGNSwgMHgxOEEyLAorICAgIDB4NjVGQSwgMHgwNUY2LCAweDY1RkIsIDB4MTlBOSwgMHg2NUZDLCAweDE5QTUsIDB4NjVGRCwgMHgxOUFFLCAweDY2MDAsCisgICAgMHgwNUZELCAweDY2MDIsIDB4MDVGQiwgMHg2NjAzLCAweDE5QUEsIDB4NjYwNCwgMHgxOUE2LCAweDY2MDUsIDB4MTlBRCwKKyAgICAweDY2MDYsIDB4MDVGQSwgMHg2NjA3LCAweDA2MDEsIDB4NjYwOCwgMHgxOUE4LCAweDY2MDksIDB4MTlBNCwgMHg2NjBBLAorICAgIDB4MDYwMCwgMHg2NjBCLCAweDE5QUIsIDB4NjYwQywgMHgwNUY5LCAweDY2MEQsIDB4MTlBQywgMHg2NjBFLCAweDA1RkMsCisgICAgMHg2NjBGLCAweDA1RkUsIDB4NjYxMCwgMHgxOUIwLCAweDY2MTEsIDB4MTlBRiwgMHg2NjEyLCAweDE5QTcsIDB4NjYxMywKKyAgICAweDA1RjgsIDB4NjYxNCwgMHgwNUY3LCAweDY2MTUsIDB4MDVGRiwgMHg2NjFDLCAweDFCMDksIDB4NjYxRCwgMHgxQjBGLAorICAgIDB4NjYxRiwgMHgwNzRCLCAweDY2MjAsIDB4MDc0OCwgMHg2NjIxLCAweDFCMDYsIDB4NjYyMiwgMHgxQjBCLCAweDY2MjQsCisgICAgMHgwNzRFLCAweDY2MjUsIDB4MDc0NiwgMHg2NjI2LCAweDFCMEEsIDB4NjYyNywgMHgwNzQ5LCAweDY2MjgsIDB4MDc0QywKKyAgICAweDY2MkIsIDB4MUIwRCwgMHg2NjJELCAweDA3NDcsIDB4NjYyRSwgMHgxQjEyLCAweDY2MkYsIDB4MDc0QSwgMHg2NjMxLAorICAgIDB4MDc0RCwgMHg2NjMyLCAweDFCMDcsIDB4NjYzMywgMHgxQjBDLCAweDY2MzQsIDB4MUIxMCwgMHg2NjM1LCAweDFCMDgsCisgICAgMHg2NjM2LCAweDFCMDUsIDB4NjYzOSwgMHgxQjExLCAweDY2M0EsIDB4MUIwRSwgMHg2NjQxLCAweDA4RTIsIDB4NjY0MiwKKyAgICAweDA4REIsIDB4NjY0MywgMHgwOERFLCAweDY2NDUsIDB4MDhFMSwgMHg2NjQ3LCAweDFDQzYsIDB4NjY0OSwgMHgwOERDLAorICAgIDB4NjY0QSwgMHgxQ0M0LCAweDY2NEMsIDB4MDhFMCwgMHg2NjRGLCAweDA4REQsIDB4NjY1MSwgMHgxQ0M3LCAweDY2NTIsCisgICAgMHgwOERGLCAweDY2NTksIDB4MUYxMSwgMHg2NjVBLCAweDBBQzksIDB4NjY1QiwgMHgxRjEwLCAweDY2NUMsIDB4MUYxMiwKKyAgICAweDY2NUQsIDB4MEFDOCwgMHg2NjVFLCAweDBBQ0QsIDB4NjY1RiwgMHgxQ0M1LCAweDY2NjEsIDB4MUYwRiwgMHg2NjYyLAorICAgIDB4MUYxMywgMHg2NjY0LCAweDBBQ0EsIDB4NjY2NSwgMHgxRjBFLCAweDY2NjYsIDB4MEFDQywgMHg2NjY4LCAweDBBQ0IsCisgICAgMHg2NjZBLCAweDIxN0YsIDB4NjY2QywgMHgyMTdBLCAweDY2NkUsIDB4MEM3NywgMHg2NjZGLCAweDBDN0IsIDB4NjY3MCwKKyAgICAweDBDNzgsIDB4NjY3MSwgMHgyMTdELCAweDY2NzIsIDB4MjE4MCwgMHg2Njc0LCAweDBDNzksIDB4NjY3NiwgMHgwQzdBLAorICAgIDB4NjY3NywgMHgwQzdGLCAweDY2NzgsIDB4MjQxNCwgMHg2Njc5LCAweDIxN0UsIDB4NjY3QSwgMHgwQzdELCAweDY2N0IsCisgICAgMHgyMTdCLCAweDY2N0MsIDB4MjE3OSwgMHg2NjdFLCAweDBDN0UsIDB4NjY4MCwgMHgyMTdDLCAweDY2ODQsIDB4MEUzMywKKyAgICAweDY2ODYsIDB4MjQwQywgMHg2Njg3LCAweDBFMzAsIDB4NjY4OCwgMHgwRTMxLCAweDY2ODksIDB4MEUyRiwgMHg2NjhBLAorICAgIDB4MjQxMSwgMHg2NjhCLCAweDI0MTAsIDB4NjY4QywgMHgyNDBELCAweDY2OEQsIDB4MEUzNSwgMHg2NjkwLCAweDI0MEYsCisgICAgMHg2NjkxLCAweDBDN0MsIDB4NjY5NCwgMHgyNDEzLCAweDY2OTUsIDB4MjQwRSwgMHg2Njk2LCAweDBFMzIsIDB4NjY5NywKKyAgICAweDBFMkUsIDB4NjY5OCwgMHgwRTM0LCAweDY2OTksIDB4MjQxMiwgMHg2NjlELCAweDBGRUQsIDB4NjY5RiwgMHgyNkI4LAorICAgIDB4NjZBMCwgMHgyNkI3LCAweDY2QTEsIDB4MjZCNiwgMHg2NkEyLCAweDBGRUIsIDB4NjZBOCwgMHgwRkVDLCAweDY2QTksCisgICAgMHgyOEY5LCAweDY2QUEsIDB4MjhGQywgMHg2NkFCLCAweDExNzIsIDB4NjZBRSwgMHgxMTcxLCAweDY2QUYsIDB4MjhGRCwKKyAgICAweDY2QjAsIDB4MjhGOCwgMHg2NkIxLCAweDExNzQsIDB4NjZCMiwgMHgyOEZBLCAweDY2QjQsIDB4MTE3MywgMHg2NkI1LAorICAgIDB4MjhGNywgMHg2NkI3LCAweDI4RkIsIDB4NjZCOCwgMHgxMkNDLCAweDY2QjksIDB4MTJDOSwgMHg2NkJBLCAweDJCNjUsCisgICAgMHg2NkJCLCAweDJCNjQsIDB4NjZCRCwgMHgyQjYzLCAweDY2QkUsIDB4MkI1RSwgMHg2NkMwLCAweDJCNUYsIDB4NjZDNCwKKyAgICAweDEyQ0EsIDB4NjZDNiwgMHgxMkM3LCAweDY2QzcsIDB4MTJDQiwgMHg2NkM4LCAweDJCNUQsIDB4NjZDOSwgMHgxMkM4LAorICAgIDB4NjZDQSwgMHgyQjYwLCAweDY2Q0IsIDB4MkI2MSwgMHg2NkNDLCAweDJCNjYsIDB4NjZDRiwgMHgyQjYyLCAweDY2RDIsCisgICAgMHgyRDcyLCAweDY2RDYsIDB4MTNFNCwgMHg2NkQ4LCAweDJGMzMsIDB4NjZEOSwgMHgxM0UzLCAweDY2REEsIDB4MkYzMSwKKyAgICAweDY2REIsIDB4MkYzMiwgMHg2NkRDLCAweDE0REEsIDB4NjZERCwgMHgxNTg1LCAweDY2REUsIDB4MzA5OSwgMHg2NkUwLAorICAgIDB4MTU4NCwgMHg2NkUzLCAweDMxREEsIDB4NjZFNCwgMHgzMURCLCAweDY2RTYsIDB4MTYxOSwgMHg2NkU4LCAweDMxRDksCisgICAgMHg2NkU5LCAweDE2NzUsIDB4NjZFQiwgMHgzNDFELCAweDY2RUMsIDB4MTZGQywgMHg2NkVELCAweDM0ODUsIDB4NjZFRSwKKyAgICAweDM0ODYsIDB4NjZGMCwgMHgwMkRCLCAweDY2RjIsIDB4MDNEQywgMHg2NkYzLCAweDAzREQsIDB4NjZGNCwgMHgwNEJCLAorICAgIDB4NjZGNiwgMHgxOUIxLCAweDY2RjcsIDB4MDc0RiwgMHg2NkY4LCAweDA4RTMsIDB4NjZGOSwgMHgwQUNFLCAweDY2RkMsCisgICAgMHgwQTFGLCAweDY2RkUsIDB4MEM4MCwgMHg2NkZGLCAweDBDODEsIDB4NjcwMCwgMHgwQkYwLCAweDY3MDEsIDB4MjE4MSwKKyAgICAweDY3MDMsIDB4MEUzNiwgMHg2NzA0LCAweDI2QkEsIDB4NjcwNSwgMHgyNkI5LCAweDY3MDgsIDB4MDJEQywgMHg2NzA5LAorICAgIDB4MDNERSwgMHg2NzBBLCAweDE5QjIsIDB4NjcwQiwgMHgwNjAzLCAweDY3MEQsIDB4MDYwMiwgMHg2NzBGLCAweDFCMTMsCisgICAgMHg2NzEwLCAweDFCMTQsIDB4NjcxMiwgMHgxQ0M4LCAweDY3MTMsIDB4MUNDOSwgMHg2NzE0LCAweDA4RTQsIDB4NjcxNSwKKyAgICAweDA4RTUsIDB4NjcxNywgMHgwOEU2LCAweDY3MTgsIDB4MUYxNCwgMHg2NzFCLCAweDBBRDAsIDB4NjcxRCwgMHgwQzgzLAorICAgIDB4NjcxRiwgMHgwQzgyLCAweDY3MjAsIDB4MjQxNSwgMHg2NzIxLCAweDI1MjIsIDB4NjcyMiwgMHgyNkJCLCAweDY3MjMsCisgICAgMHgyQjY3LCAweDY3MjYsIDB4MTREQiwgMHg2NzI3LCAweDE2MUEsIDB4NjcyOCwgMHgwMkRELCAweDY3MkEsIDB4MDM0QSwKKyAgICAweDY3MkIsIDB4MDM0QiwgMHg2NzJDLCAweDAzNDksIDB4NjcyRCwgMHgwMzRDLCAweDY3MkUsIDB4MDM0OCwgMHg2NzMxLAorICAgIDB4MDNFMSwgMHg2NzMzLCAweDE4MDAsIDB4NjczNCwgMHgwM0UwLCAweDY3MzUsIDB4MDNFMiwgMHg2NzM4LCAweDE3RkIsCisgICAgMHg2NzM5LCAweDE3RkEsIDB4NjczQSwgMHgxN0ZELCAweDY3M0IsIDB4MTdGQywgMHg2NzNDLCAweDE3RkYsIDB4NjczRCwKKyAgICAweDAzREYsIDB4NjczRSwgMHgxN0Y5LCAweDY3M0YsIDB4MTdGRSwgMHg2NzQ1LCAweDE4QTMsIDB4Njc0NiwgMHgwNEM1LAorICAgIDB4Njc0NywgMHgxOEE0LCAweDY3NDgsIDB4MThBOCwgMHg2NzQ5LCAweDA0QzQsIDB4Njc0QiwgMHgxOEFDLCAweDY3NEMsCisgICAgMHgxOEE3LCAweDY3NEQsIDB4MThBQSwgMHg2NzRFLCAweDA0QkQsIDB4Njc0RiwgMHgwNEJFLCAweDY3NTAsIDB4MDRCRiwKKyAgICAweDY3NTEsIDB4MDRDMCwgMHg2NzUzLCAweDA0QzcsIDB4Njc1NSwgMHgxOEE2LCAweDY3NTYsIDB4MDRDMiwgMHg2NzU3LAorICAgIDB4MDRDOCwgMHg2NzU5LCAweDE4QTUsIDB4Njc1QSwgMHgxOEFCLCAweDY3NUMsIDB4MDRDMSwgMHg2NzVELCAweDE4QTksCisgICAgMHg2NzVFLCAweDA0QzMsIDB4Njc1RiwgMHgwNEJDLCAweDY3NjAsIDB4MDRDNiwgMHg2NzZBLCAweDA2MTgsIDB4Njc2QywKKyAgICAweDE5QjQsIDB4Njc2RCwgMHgwNjA0LCAweDY3NkYsIDB4MDYwRSwgMHg2NzcwLCAweDA2MEYsIDB4Njc3MSwgMHgwNjA3LAorICAgIDB4Njc3MiwgMHgwNjE5LCAweDY3NzMsIDB4MDYwOSwgMHg2Nzc0LCAweDE5QkMsIDB4Njc3NSwgMHgwNjE0LCAweDY3NzYsCisgICAgMHgxOUI3LCAweDY3NzcsIDB4MDYwQSwgMHg2Nzc4LCAweDE5QzYsIDB4Njc3OSwgMHgxOUM3LCAweDY3N0EsIDB4MTlCRiwKKyAgICAweDY3N0IsIDB4MTlCOCwgMHg2NzdDLCAweDA2MTcsIDB4Njc3RCwgMHgxOUM0LCAweDY3N0UsIDB4MDYxMiwgMHg2NzdGLAorICAgIDB4MDYxMCwgMHg2NzgxLCAweDE5QzUsIDB4Njc4MywgMHgxOUMzLCAweDY3ODQsIDB4MTlCQiwgMHg2Nzg1LCAweDE5QjMsCisgICAgMHg2Nzg2LCAweDE5QkEsIDB4Njc4NywgMHgwNjBCLCAweDY3ODksIDB4MDYxMSwgMHg2NzhCLCAweDA2MDUsIDB4Njc4QywKKyAgICAweDE5QkUsIDB4Njc4RCwgMHgxOUJELCAweDY3OEUsIDB4MTlCNSwgMHg2NzkwLCAweDA2MTMsIDB4Njc5MSwgMHgxOUMxLAorICAgIDB4Njc5MiwgMHgxOUI2LCAweDY3OTMsIDB4MDYxNiwgMHg2Nzk0LCAweDE5QzgsIDB4Njc5NSwgMHgwNjA2LCAweDY3OTcsCisgICAgMHgwNjBELCAweDY3OTgsIDB4MTlCOSwgMHg2Nzk5LCAweDE5QzIsIDB4Njc5QSwgMHgwNjE1LCAweDY3OUMsIDB4MDYwOCwKKyAgICAweDY3OUQsIDB4MDYwQywgMHg2NzlGLCAweDE5QzAsIDB4NjdBRSwgMHgxQjM0LCAweDY3QUYsIDB4MDc1NywgMHg2N0IwLAorICAgIDB4MDc2NCwgMHg2N0IyLCAweDFCMkYsIDB4NjdCMywgMHgxQjI1LCAweDY3QjQsIDB4MDc1RCwgMHg2N0I1LCAweDFCMjMsCisgICAgMHg2N0I2LCAweDA3NTYsIDB4NjdCNywgMHgxQjFFLCAweDY3QjgsIDB4MDc2MCwgMHg2N0I5LCAweDFCMkIsIDB4NjdCQSwKKyAgICAweDFCMTgsIDB4NjdCQiwgMHgxQjFBLCAweDY3QzAsIDB4MUIxRCwgMHg2N0MxLCAweDFCMTUsIDB4NjdDMiwgMHgxQjJBLAorICAgIDB4NjdDMywgMHgxQjNBLCAweDY3QzQsIDB4MDc1QiwgMHg2N0M1LCAweDFCMUYsIDB4NjdDNiwgMHgxQjMxLCAweDY3QzgsCisgICAgMHgxQjE3LCAweDY3QzksIDB4MUIzOCwgMHg2N0NBLCAweDFCMzksIDB4NjdDQiwgMHgxQjNDLCAweDY3Q0MsIDB4MUIzMywKKyAgICAweDY3Q0QsIDB4MUIyNCwgMHg2N0NFLCAweDFCMkMsIDB4NjdDRiwgMHgwNzYxLCAweDY3RDAsIDB4MDc1NCwgMHg2N0QxLAorICAgIDB4MDc1QywgMHg2N0QyLCAweDA3NjgsIDB4NjdEMywgMHgwNzUxLCAweDY3RDQsIDB4MDc1MywgMHg2N0Q4LCAweDFCMUMsCisgICAgMHg2N0Q5LCAweDA3NjUsIDB4NjdEQSwgMHgwNzVFLCAweDY3REIsIDB4MUIzNiwgMHg2N0RDLCAweDFCMTksIDB4NjdERCwKKyAgICAweDA3NjcsIDB4NjdERSwgMHgwNzYyLCAweDY3REYsIDB4MUIyMiwgMHg2N0UyLCAweDA3NjYsIDB4NjdFMywgMHgxQjI5LAorICAgIDB4NjdFNCwgMHgxQjIxLCAweDY3RTUsIDB4MDc1RiwgMHg2N0U2LCAweDFCMzUsIDB4NjdFNywgMHgxQjJELCAweDY3RTksCisgICAgMHgwNzU5LCAweDY3RUEsIDB4MUIzQiwgMHg2N0VCLCAweDFCMjAsIDB4NjdFQywgMHgwNzU1LCAweDY3RUQsIDB4MUIzMiwKKyAgICAweDY3RUUsIDB4MUIyOCwgMHg2N0VGLCAweDA3NUEsIDB4NjdGMCwgMHgxQjJFLCAweDY3RjEsIDB4MDc1MiwgMHg2N0YyLAorICAgIDB4MUIxNiwgMHg2N0YzLCAweDA3NjMsIDB4NjdGNCwgMHgwOEY1LCAweDY3RjUsIDB4MDc1OCwgMHg2N0Y2LCAweDFCMjcsCisgICAgMHg2N0Y3LCAweDFCMjYsIDB4NjdGOCwgMHgxQjFCLCAweDY3RkEsIDB4MUIzNywgMHg2N0ZDLCAweDFCMzAsIDB4NjdGRiwKKyAgICAweDA3NTAsIDB4NjgxMiwgMHgxQ0RELCAweDY4MTMsIDB4MDhGQywgMHg2ODE0LCAweDFDREUsIDB4NjgxNiwgMHgxQ0QyLAorICAgIDB4NjgxNywgMHgwOEYxLCAweDY4MTgsIDB4MDhGRCwgMHg2ODFBLCAweDFDQ0IsIDB4NjgxQywgMHgxQ0Q0LCAweDY4MUQsCisgICAgMHgxQ0RDLCAweDY4MUYsIDB4MUNDQSwgMHg2ODIwLCAweDFDRTUsIDB4NjgyMSwgMHgwOEU3LCAweDY4MjUsIDB4MUNFNCwKKyAgICAweDY4MjYsIDB4MUNERiwgMHg2ODI4LCAweDFDRTAsIDB4NjgyOSwgMHgwOEVGLCAweDY4MkEsIDB4MDhGQSwgMHg2ODJCLAorICAgIDB4MUNENiwgMHg2ODJELCAweDFDRDcsIDB4NjgyRSwgMHgxQ0UxLCAweDY4MkYsIDB4MUNEOCwgMHg2ODMxLCAweDFDRDMsCisgICAgMHg2ODMyLCAweDFDQ0QsIDB4NjgzMywgMHgxQ0NFLCAweDY4MzQsIDB4MUNEQiwgMHg2ODM1LCAweDFDRDUsIDB4NjgzOCwKKyAgICAweDA4RTgsIDB4NjgzOSwgMHgwOEVDLCAweDY4M0EsIDB4MUNFMywgMHg2ODNCLCAweDFDQ0YsIDB4NjgzQywgMHgwOEY4LAorICAgIDB4NjgzRCwgMHgwOEY0LCAweDY4NDAsIDB4MDhGNywgMHg2ODQxLCAweDA4RkUsIDB4Njg0MiwgMHgwOEVELCAweDY4NDMsCisgICAgMHgwOEY5LCAweDY4NDQsIDB4MUNEQSwgMHg2ODQ1LCAweDA4RkIsIDB4Njg0NiwgMHgwOEVBLCAweDY4NDgsIDB4MDhFOSwKKyAgICAweDY4NDksIDB4MUNDQywgMHg2ODRCLCAweDFDRDAsIDB4Njg0QywgMHgwOEYyLCAweDY4NEQsIDB4MUNFMiwgMHg2ODRFLAorICAgIDB4MUNEOSwgMHg2ODRGLCAweDFDRDEsIDB4Njg1MCwgMHgwOEY2LCAweDY4NTEsIDB4MDhGMywgMHg2ODUzLCAweDA4RUIsCisgICAgMHg2ODU0LCAweDA4RUUsIDB4Njg2QiwgMHgxRjI5LCAweDY4NkQsIDB4MUYxOSwgMHg2ODZFLCAweDFGMUEsIDB4Njg2RiwKKyAgICAweDFGMUUsIDB4Njg3MSwgMHgxRjJELCAweDY4NzIsIDB4MUYyQSwgMHg2ODc0LCAweDFGMjMsIDB4Njg3NSwgMHgxRjIyLAorICAgIDB4Njg3NiwgMHgwQUQ3LCAweDY4NzcsIDB4MUYyNiwgMHg2ODc4LCAweDFGMzUsIDB4Njg3OSwgMHgxRjE1LCAweDY4N0IsCisgICAgMHgxRjM2LCAweDY4N0MsIDB4MUYyOCwgMHg2ODdELCAweDFGM0EsIDB4Njg3RSwgMHgxRjJFLCAweDY4N0YsIDB4MEFENiwKKyAgICAweDY4ODAsIDB4MUYyQywgMHg2ODgxLCAweDBBRDEsIDB4Njg4MiwgMHgwQUU2LCAweDY4ODMsIDB4MEFEQywgMHg2ODg1LAorICAgIDB4MEFFMCwgMHg2ODg2LCAweDBBREYsIDB4Njg4NywgMHgxRjE2LCAweDY4ODksIDB4MUYzMywgMHg2ODhBLCAweDFGMzksCisgICAgMHg2ODhCLCAweDFGMzEsIDB4Njg4QywgMHgxRjM4LCAweDY4OEYsIDB4MUYyNSwgMHg2ODkwLCAweDFGMTcsIDB4Njg5MSwKKyAgICAweDFGMzcsIDB4Njg5MiwgMHgxRjI3LCAweDY4OTMsIDB4MEFENCwgMHg2ODk0LCAweDBBRTEsIDB4Njg5NiwgMHgxRjMwLAorICAgIDB4Njg5NywgMHgwQURBLCAweDY4OUIsIDB4MUYyRiwgMHg2ODlDLCAweDFGMTgsIDB4Njg5RCwgMHgwQUUyLCAweDY4OUYsCisgICAgMHgwQUU0LCAweDY4QTAsIDB4MUYzMiwgMHg2OEExLCAweDBBRTUsIDB4NjhBMiwgMHgwQUQzLCAweDY4QTMsIDB4MUYxRiwKKyAgICAweDY4QTQsIDB4MUYzNCwgMHg2OEE3LCAweDBBRDksIDB4NjhBOCwgMHgwQUUzLCAweDY4QTksIDB4MUYyMSwgMHg2OEFBLAorICAgIDB4MUYyQiwgMHg2OEFCLCAweDFGMUMsIDB4NjhBQywgMHgxRjIwLCAweDY4QUQsIDB4MEFERSwgMHg2OEFFLCAweDFGMUIsCisgICAgMHg2OEFGLCAweDBBRDIsIDB4NjhCMCwgMHgwQURCLCAweDY4QjEsIDB4MEFEOCwgMHg2OEIyLCAweDFGMjQsIDB4NjhCMywKKyAgICAweDA4RjAsIDB4NjhCNCwgMHgyMTk4LCAweDY4QjUsIDB4MEFENSwgMHg2OEM0LCAweDBBREQsIDB4NjhDNiwgMHgyMTlCLAorICAgIDB4NjhDNywgMHgyMUIxLCAweDY4QzgsIDB4MjFBNiwgMHg2OEM5LCAweDBDOTcsIDB4NjhDQiwgMHgwQzkyLCAweDY4Q0MsCisgICAgMHgyMTk1LCAweDY4Q0QsIDB4MEM5MywgMHg2OENFLCAweDIxQTUsIDB4NjhEMCwgMHgyMTlFLCAweDY4RDEsIDB4MjFBQiwKKyAgICAweDY4RDIsIDB4MEM4RiwgMHg2OEQzLCAweDIxODMsIDB4NjhENCwgMHgyMUFELCAweDY4RDUsIDB4MEM4NSwgMHg2OEQ2LAorICAgIDB4MjE4QiwgMHg2OEQ3LCAweDBDODgsIDB4NjhEOCwgMHgwQzg3LCAweDY4REEsIDB4MEM5OCwgMHg2OERDLCAweDIxODUsCisgICAgMHg2OERELCAweDIxQTcsIDB4NjhERSwgMHgyMUE4LCAweDY4REYsIDB4MEM4QSwgMHg2OEUwLCAweDBDODYsIDB4NjhFMSwKKyAgICAweDIxOTMsIDB4NjhFMywgMHgwQzkxLCAweDY4RTQsIDB4MjE4RSwgMHg2OEU2LCAweDIxQTksIDB4NjhFNywgMHgwQzhELAorICAgIDB4NjhFOCwgMHgyMUExLCAweDY4RTksIDB4MjFBRSwgMHg2OEVBLCAweDIxODgsIDB4NjhFQiwgMHgyMThELCAweDY4RUMsCisgICAgMHgyMTg3LCAweDY4RUUsIDB4MEM4QywgMHg2OEVGLCAweDIxOUEsIDB4NjhGMCwgMHgyNDJCLCAweDY4RjEsIDB4MjE4OSwKKyAgICAweDY4RjIsIDB4MEM5MCwgMHg2OEYzLCAweDIxOTIsIDB4NjhGNCwgMHgyMUFBLCAweDY4RjUsIDB4MEM4QiwgMHg2OEY2LAorICAgIDB4MjE4RiwgMHg2OEY3LCAweDIxOEMsIDB4NjhGOCwgMHgyMTlELCAweDY4RjksIDB4MEM4RSwgMHg2OEZBLCAweDBDODQsCisgICAgMHg2OEZCLCAweDBDOUEsIDB4NjhGQywgMHgyMUEwLCAweDY4RkQsIDB4MjE5RiwgMHg2OTA0LCAweDIxODQsIDB4NjkwNSwKKyAgICAweDBDODksIDB4NjkwNiwgMHgyMUFDLCAweDY5MDcsIDB4MjE5NCwgMHg2OTA4LCAweDIxOTYsIDB4NjkwQSwgMHgyMUEzLAorICAgIDB4NjkwQiwgMHgyMUEyLCAweDY5MEMsIDB4MjE4MiwgMHg2OTBELCAweDBDOTQsIDB4NjkwRSwgMHgwQzk2LCAweDY5MEYsCisgICAgMHgyMThBLCAweDY5MTAsIDB4MjE5MSwgMHg2OTExLCAweDIxOTksIDB4NjkxMiwgMHgwQzk1LCAweDY5MTMsIDB4MjE5MCwKKyAgICAweDY5MTQsIDB4MjE5QywgMHg2OTE1LCAweDIxQUYsIDB4NjkxNywgMHgyMUE0LCAweDY5MjUsIDB4MjFCMCwgMHg2OTJBLAorICAgIDB4MjE4NiwgMHg2OTJGLCAweDI0M0YsIDB4NjkzMCwgMHgwRTNFLCAweDY5MzIsIDB4MjQzRCwgMHg2OTMzLCAweDI0MjgsCisgICAgMHg2OTM0LCAweDI0MkQsIDB4NjkzNSwgMHgyNDI2LCAweDY5MzcsIDB4MjQzOSwgMHg2OTM4LCAweDI0MTgsIDB4NjkzOSwKKyAgICAweDI0MUYsIDB4NjkzQiwgMHgyNDM3LCAweDY5M0MsIDB4MjQ0MSwgMHg2OTNELCAweDI0MjksIDB4NjkzRiwgMHgyNDFDLAorICAgIDB4Njk0MCwgMHgyNDJGLCAweDY5NDEsIDB4MjQzNCwgMHg2OTQyLCAweDI0MjAsIDB4Njk0NCwgMHgyNDMxLCAweDY5NDUsCisgICAgMHgyNDFELCAweDY5NDgsIDB4MjQyNCwgMHg2OTQ5LCAweDI0MjUsIDB4Njk0QSwgMHgwRTQwLCAweDY5NEIsIDB4MjQzOCwKKyAgICAweDY5NEMsIDB4MjQzNiwgMHg2OTRFLCAweDI0MTksIDB4Njk0RiwgMHgyNDNCLCAweDY5NTEsIDB4MjQzQywgMHg2OTUyLAorICAgIDB4MjQzRSwgMHg2OTUzLCAweDBFNDQsIDB4Njk1NCwgMHgwRTNDLCAweDY5NTYsIDB4MUYxRCwgMHg2OTU3LCAweDI0MjEsCisgICAgMHg2OTU4LCAweDI0MzMsIDB4Njk1OSwgMHgyNDIyLCAweDY5NUEsIDB4MEUzOSwgMHg2OTVCLCAweDBFNDksIDB4Njk1QywKKyAgICAweDI0M0EsIDB4Njk1RCwgMHgwRTQ3LCAweDY5NUUsIDB4MEU0MywgMHg2OTVGLCAweDI0MTcsIDB4Njk2MCwgMHgwRTNCLAorICAgIDB4Njk2MiwgMHgyNDFBLCAweDY5NjMsIDB4MEU0OCwgMHg2OTY1LCAweDI0MkEsIDB4Njk2NiwgMHgyNDE2LCAweDY5NjgsCisgICAgMHgwRTQxLCAweDY5NjksIDB4MjQyRSwgMHg2OTZBLCAweDI0MUUsIDB4Njk2QiwgMHgwRTQyLCAweDY5NkMsIDB4MjQyNywKKyAgICAweDY5NkQsIDB4MEUzOCwgMHg2OTZFLCAweDBDOTksIDB4Njk2RiwgMHgyNDMwLCAweDY5NzAsIDB4MjE5NywgMHg2OTcxLAorICAgIDB4MjQxQiwgMHg2OTc0LCAweDI0MzUsIDB4Njk3NSwgMHgwRTNELCAweDY5NzYsIDB4MjQzMiwgMHg2OTc3LCAweDBFM0EsCisgICAgMHg2OTc4LCAweDI0MkMsIDB4Njk3OSwgMHgwRTQ1LCAweDY5N0EsIDB4MjQyMywgMHg2OTdCLCAweDI0NDAsIDB4Njk4MiwKKyAgICAweDBFM0YsIDB4Njk4MywgMHgyNEFGLCAweDY5ODYsIDB4MEU0NiwgMHg2OThELCAweDI2QzksIDB4Njk4RSwgMHgyNkM3LAorICAgIDB4Njk5MCwgMHgyNkRELCAweDY5OTEsIDB4MjZDNSwgMHg2OTkzLCAweDI2RDcsIDB4Njk5NCwgMHgwRTM3LCAweDY5OTUsCisgICAgMHgwRkYwLCAweDY5OTYsIDB4MjZDMSwgMHg2OTk3LCAweDI2REMsIDB4Njk5OSwgMHgyNkM2LCAweDY5OUEsIDB4MjZENCwKKyAgICAweDY5OUIsIDB4MEZGNSwgMHg2OTlDLCAweDBGRUUsIDB4Njk5RSwgMHgyNkRBLCAweDY5QTAsIDB4MjZCRiwgMHg2OUExLAorICAgIDB4MjZEOSwgMHg2OUEzLCAweDEwMDAsIDB4NjlBNCwgMHgyNkQwLCAweDY5QTUsIDB4MjZFMCwgMHg2OUE2LCAweDBGRkUsCisgICAgMHg2OUE3LCAweDI2QzgsIDB4NjlBOCwgMHgwRkVGLCAweDY5QTksIDB4MjZDQSwgMHg2OUFBLCAweDI2RDgsIDB4NjlBQiwKKyAgICAweDBGRjgsIDB4NjlBQywgMHgyNkMzLCAweDY5QUQsIDB4MEZGQywgMHg2OUFFLCAweDBGRjIsIDB4NjlBRiwgMHgyNkNDLAorICAgIDB4NjlCMCwgMHgyNkMyLCAweDY5QjEsIDB4MjZCQywgMHg2OUIzLCAweDI2RDYsIDB4NjlCNCwgMHgwRkY5LCAweDY5QjUsCisgICAgMHgyNkRGLCAweDY5QjYsIDB4MjZCRCwgMHg2OUI3LCAweDBGRjYsIDB4NjlCOSwgMHgyNkQyLCAweDY5QkIsIDB4MEZGNywKKyAgICAweDY5QkMsIDB4MjZDNCwgMHg2OUJELCAweDI2Q0YsIDB4NjlCRSwgMHgyNkNCLCAweDY5QkYsIDB4MjZDRCwgMHg2OUMxLAorICAgIDB4MEZGMSwgMHg2OUMyLCAweDI2REUsIDB4NjlDMywgMHgwRkZGLCAweDY5QzQsIDB4MjZDRSwgMHg2OUM2LCAweDI2RTEsCisgICAgMHg2OUM5LCAweDI2QkUsIDB4NjlDQSwgMHgyNkQzLCAweDY5Q0IsIDB4MEZGNCwgMHg2OUNDLCAweDBGRkQsIDB4NjlDRCwKKyAgICAweDBGRkIsIDB4NjlDRSwgMHgyNkMwLCAweDY5Q0YsIDB4MjZENSwgMHg2OUQwLCAweDBGRkEsIDB4NjlEMywgMHgwRkYzLAorICAgIDB4NjlENCwgMHgyNkQxLCAweDY5RDksIDB4MjZEQiwgMHg2OUUyLCAweDI5MDksIDB4NjlFNCwgMHgyOTA1LCAweDY5RTUsCisgICAgMHgyOTAxLCAweDY5RTYsIDB4MjkxNSwgMHg2OUU3LCAweDI5MTIsIDB4NjlFOCwgMHgxMTc3LCAweDY5RUIsIDB4MjkxOSwKKyAgICAweDY5RUMsIDB4MjkwOCwgMHg2OUVELCAweDExODIsIDB4NjlFRSwgMHgyOTBGLCAweDY5RjEsIDB4MjkwNCwgMHg2OUYyLAorICAgIDB4MjkwRSwgMHg2OUYzLCAweDExN0YsIDB4NjlGNCwgMHgyOTIyLCAweDY5RjYsIDB4MjkxRiwgMHg2OUY3LCAweDI5MTEsCisgICAgMHg2OUY4LCAweDI5MDIsIDB4NjlGQiwgMHgyOTE2LCAweDY5RkMsIDB4MjkxOCwgMHg2OUZELCAweDExN0IsIDB4NjlGRSwKKyAgICAweDI5MEMsIDB4NjlGRiwgMHgyOTA3LCAweDZBMDAsIDB4MjhGRSwgMHg2QTAxLCAweDExNzgsIDB4NkEwMiwgMHgxMTgwLAorICAgIDB4NkEwNCwgMHgyOTFCLCAweDZBMDUsIDB4MTE4MSwgMHg2QTA2LCAweDI4RkYsIDB4NkEwNywgMHgyOTIxLCAweDZBMDgsCisgICAgMHgyOTE0LCAweDZBMDksIDB4MjkxQSwgMHg2QTBBLCAweDExN0UsIDB4NkEwRCwgMHgyOTE3LCAweDZBMEYsIDB4MjkxRSwKKyAgICAweDZBMTEsIDB4MTE4MywgMHg2QTEzLCAweDExN0QsIDB4NkExNCwgMHgyOTEwLCAweDZBMTUsIDB4MjkwMywgMHg2QTE2LAorICAgIDB4MjkyMywgMHg2QTE3LCAweDI5MDAsIDB4NkExOCwgMHgyOTFDLCAweDZBMTksIDB4MTE3QSwgMHg2QTFCLCAweDI5MEEsCisgICAgMHg2QTFELCAweDI5MEIsIDB4NkExRSwgMHgxMTc5LCAweDZBMUYsIDB4MTE3NiwgMHg2QTIwLCAweDI5MDYsIDB4NkEyMSwKKyAgICAweDExN0MsIDB4NkEyMywgMHgxMTc1LCAweDZBMjUsIDB4MjkxRCwgMHg2QTI2LCAweDI5MjAsIDB4NkEyNywgMHgyOTBELAorICAgIDB4NkEyOCwgMHgyQjc0LCAweDZBMzIsIDB4MkI2QywgMHg2QTM0LCAweDJCNjgsIDB4NkEzNSwgMHgxMkQ5LCAweDZBMzgsCisgICAgMHgxMkNFLCAweDZBMzksIDB4MTJEMywgMHg2QTNBLCAweDEyQ0YsIDB4NkEzQiwgMHgyQjc2LCAweDZBM0MsIDB4MkI4MSwKKyAgICAweDZBM0QsIDB4MTJDRCwgMHg2QTNFLCAweDJCNkUsIDB4NkEzRiwgMHgyQjc3LCAweDZBNDAsIDB4MjkxMywgMHg2QTQxLAorICAgIDB4MkI3OCwgMHg2QTQ0LCAweDEyRDQsIDB4NkE0NiwgMHgyQjg3LCAweDZBNDcsIDB4MTJEOCwgMHg2QTQ4LCAweDEyREIsCisgICAgMHg2QTQ5LCAweDJCNkEsIDB4NkE0QiwgMHgxMkQ3LCAweDZBNEQsIDB4MkI4NSwgMHg2QTRFLCAweDJCODYsIDB4NkE0RiwKKyAgICAweDJCN0MsIDB4NkE1MCwgMHgyQjdCLCAweDZBNTEsIDB4MkI3MywgMHg2QTU0LCAweDJCN0QsIDB4NkE1NSwgMHgyQjg0LAorICAgIDB4NkE1NiwgMHgyQjgzLCAweDZBNTgsIDB4MTJEMiwgMHg2QTU5LCAweDEyRDAsIDB4NkE1QSwgMHgyQjc1LCAweDZBNUIsCisgICAgMHgyQjcyLCAweDZBNUQsIDB4MkI2RiwgMHg2QTVFLCAweDJCODIsIDB4NkE1RiwgMHgxMkRBLCAweDZBNjAsIDB4MkI4MCwKKyAgICAweDZBNjEsIDB4MTJENiwgMHg2QTYyLCAweDEyRDUsIDB4NkE2NCwgMHgyQjdBLCAweDZBNjYsIDB4MkI2OSwgMHg2QTY3LAorICAgIDB4MkI2QiwgMHg2QTY4LCAweDJCNkQsIDB4NkE2OSwgMHgyQjdGLCAweDZBNkEsIDB4MkI3OSwgMHg2QTZCLCAweDEyRDEsCisgICAgMHg2QTZELCAweDJCNzAsIDB4NkE2RiwgMHgyQjdFLCAweDZBNzYsIDB4MkI3MSwgMHg2QTdFLCAweDEzRUMsIDB4NkE3RiwKKyAgICAweDJEODQsIDB4NkE4MCwgMHgxM0U1LCAweDZBODEsIDB4MkQ3NSwgMHg2QTgzLCAweDJEODAsIDB4NkE4NCwgMHgxM0U3LAorICAgIDB4NkE4NSwgMHgyRDg3LCAweDZBODcsIDB4MkQ3QywgMHg2QTg5LCAweDJENzcsIDB4NkE4QywgMHgyRDg4LCAweDZBOEQsCisgICAgMHgyRDczLCAweDZBOEUsIDB4MkQ3RSwgMHg2QTkwLCAweDEzRUUsIDB4NkE5MSwgMHgyRDgzLCAweDZBOTIsIDB4MkQ4OSwKKyAgICAweDZBOTMsIDB4MkQ3RCwgMHg2QTk0LCAweDEzRTYsIDB4NkE5NSwgMHgyRDdGLCAweDZBOTYsIDB4MkQ3NCwgMHg2QTk3LAorICAgIDB4MTNFRCwgMHg2QTlBLCAweDJEODYsIDB4NkE5QiwgMHgyRDc5LCAweDZBOUMsIDB4MTNFOSwgMHg2QTlFLCAweDJEN0IsCisgICAgMHg2QTlGLCAweDJENzgsIDB4NkFBMCwgMHgxM0VGLCAweDZBQTEsIDB4MkQ3QSwgMHg2QUEyLCAweDEzRTgsIDB4NkFBMywKKyAgICAweDEzRUIsIDB4NkFBNCwgMHgyRDgyLCAweDZBQTUsIDB4MkQ3NiwgMHg2QUE2LCAweDJEODUsIDB4NkFBOCwgMHgyRDgxLAorICAgIDB4NkFBQywgMHgxNERELCAweDZBQUQsIDB4MkYzRSwgMHg2QUFFLCAweDE0RTIsIDB4NkFBRiwgMHgxNEUzLCAweDZBQjMsCisgICAgMHgxNERDLCAweDZBQjQsIDB4MkYzRCwgMHg2QUI2LCAweDJGM0EsIDB4NkFCNywgMHgyRjNCLCAweDZBQjgsIDB4MTRFMCwKKyAgICAweDZBQjksIDB4MkYzNSwgMHg2QUJBLCAweDJGMzksIDB4NkFCQiwgMHgxNERGLCAweDZBQkQsIDB4MkYzNiwgMHg2QUMyLAorICAgIDB4MTRFMSwgMHg2QUMzLCAweDE0REUsIDB4NkFDNSwgMHgyRjM0LCAweDZBQzYsIDB4MkYzOCwgMHg2QUM3LCAweDJGM0MsCisgICAgMHg2QUNCLCAweDMwOUYsIDB4NkFDQywgMHgzMDlDLCAweDZBQ0QsIDB4MzBBNSwgMHg2QUNGLCAweDMwQTQsIDB4NkFEMCwKKyAgICAweDMwQTIsIDB4NkFEMSwgMHgzMDlELCAweDZBRDMsIDB4MTU4OSwgMHg2QUQ5LCAweDMwOUUsIDB4NkFEQSwgMHgxNTg4LAorICAgIDB4NkFEQiwgMHgxM0VBLCAweDZBREMsIDB4MzBBMSwgMHg2QURELCAweDE1ODcsIDB4NkFERSwgMHgzMEE2LCAweDZBREYsCisgICAgMHgzMEEwLCAweDZBRTAsIDB4MzA5QiwgMHg2QUUxLCAweDJGMzcsIDB4NkFFNSwgMHgxNTg2LCAweDZBRTcsIDB4MzA5QSwKKyAgICAweDZBRTgsIDB4MzFERiwgMHg2QUVBLCAweDMxREUsIDB4NkFFQiwgMHgzMEEzLCAweDZBRUMsIDB4MTYxQiwgMHg2QUVFLAorICAgIDB4MzFFMiwgMHg2QUVGLCAweDMxRTMsIDB4NkFGMCwgMHgzMURELCAweDZBRjEsIDB4MzFFMSwgMHg2QUYzLCAweDMxREMsCisgICAgMHg2QUY4LCAweDMyRDYsIDB4NkFGOSwgMHgzMUUwLCAweDZBRkEsIDB4MTY3OCwgMHg2QUZCLCAweDE2NzYsIDB4NkFGQywKKyAgICAweDMyRDQsIDB4NkIwMCwgMHgzMkQ3LCAweDZCMDIsIDB4MzJEMywgMHg2QjAzLCAweDMyRDUsIDB4NkIwNCwgMHgxNjc3LAorICAgIDB4NkIwOCwgMHgzMzg2LCAweDZCMDksIDB4MzM4NywgMHg2QjBBLCAweDE2QzYsIDB4NkIwQiwgMHgzMzg1LCAweDZCMEYsCisgICAgMHgzNDIwLCAweDZCMTAsIDB4MTZGRCwgMHg2QjExLCAweDM0MUUsIDB4NkIxMiwgMHgzNDFGLCAweDZCMTMsIDB4MzQ4NywKKyAgICAweDZCMTYsIDB4MTc0MywgMHg2QjE3LCAweDM0Q0UsIDB4NkIxOCwgMHgzNENDLCAweDZCMTksIDB4MzRDRCwgMHg2QjFBLAorICAgIDB4MzRDRiwgMHg2QjFFLCAweDM1MzQsIDB4NkIyMCwgMHgwMkRFLCAweDZCMjEsIDB4MDNFMywgMHg2QjIzLCAweDA2MUEsCisgICAgMHg2QjI1LCAweDE5QzksIDB4NkIyOCwgMHgxQjNELCAweDZCMkMsIDB4MUNFNiwgMHg2QjJELCAweDFDRTgsIDB4NkIyRiwKKyAgICAweDFDRTcsIDB4NkIzMSwgMHgxQ0U5LCAweDZCMzIsIDB4MEFFNywgMHg2QjMzLCAweDFGM0MsIDB4NkIzNCwgMHgxQ0VBLAorICAgIDB4NkIzNiwgMHgxRjNCLCAweDZCMzcsIDB4MUYzRCwgMHg2QjM4LCAweDFGM0UsIDB4NkIzOSwgMHgyMUIyLCAweDZCM0EsCisgICAgMHgwQzlDLCAweDZCM0IsIDB4MjFCMywgMHg2QjNDLCAweDIxQjUsIDB4NkIzRCwgMHgwQzlELCAweDZCM0UsIDB4MEM5QiwKKyAgICAweDZCM0YsIDB4MjFCNCwgMHg2QjQxLCAweDI0NDcsIDB4NkI0MiwgMHgyNDQ1LCAweDZCNDMsIDB4MjQ0NCwgMHg2QjQ1LAorICAgIDB4MjQ0MywgMHg2QjQ2LCAweDI0NDIsIDB4NkI0NywgMHgwRTRBLCAweDZCNDgsIDB4MjQ0NiwgMHg2QjQ5LCAweDEwMDEsCisgICAgMHg2QjRBLCAweDI2RTIsIDB4NkI0QiwgMHgyNkU0LCAweDZCNEMsIDB4MTAwMiwgMHg2QjRELCAweDI2RTMsIDB4NkI0RSwKKyAgICAweDExODUsIDB4NkI1MCwgMHgxMTg0LCAweDZCNTEsIDB4MjkyNCwgMHg2QjU0LCAweDJCODksIDB4NkI1NSwgMHgyQjg4LAorICAgIDB4NkI1NiwgMHgyQjhBLCAweDZCNTksIDB4MTJEQywgMHg2QjVCLCAweDJEOEEsIDB4NkI1QywgMHgxM0YwLCAweDZCNUUsCisgICAgMHgyRjNGLCAweDZCNUYsIDB4MTRFNCwgMHg2QjYwLCAweDMwQTcsIDB4NkI2MSwgMHgxNkM3LCAweDZCNjIsIDB4MDJERiwKKyAgICAweDZCNjMsIDB4MDM0RCwgMHg2QjY0LCAweDAzRTQsIDB4NkI2NSwgMHgwNEM5LCAweDZCNjYsIDB4MDYxQiwgMHg2QjY3LAorICAgIDB4MDYxQywgMHg2QjZBLCAweDA3NjksIDB4NkI2RCwgMHgxQ0VCLCAweDZCNzIsIDB4MEU0QiwgMHg2Qjc2LCAweDI5QTIsCisgICAgMHg2Qjc3LCAweDEyREQsIDB4NkI3OCwgMHgxNEU1LCAweDZCNzksIDB4MDJFMCwgMHg2QjdCLCAweDAzRTUsIDB4NkI3RSwKKyAgICAweDE5Q0IsIDB4NkI3RiwgMHgwNjFELCAweDZCODAsIDB4MTlDQSwgMHg2QjgyLCAweDFCM0UsIDB4NkI4MywgMHgwNzZBLAorICAgIDB4NkI4NCwgMHgxQjNGLCAweDZCODYsIDB4MDc2QiwgMHg2Qjg4LCAweDFDRUQsIDB4NkI4OSwgMHgwOTAwLCAweDZCOEEsCisgICAgMHgwOEZGLCAweDZCOEMsIDB4MUY0MywgMHg2QjhELCAweDFGNDEsIDB4NkI4RSwgMHgxRjQyLCAweDZCOEYsIDB4MUY0MCwKKyAgICAweDZCOTEsIDB4MUYzRiwgMHg2Qjk0LCAweDIxQjYsIDB4NkI5NSwgMHgyMUI5LCAweDZCOTYsIDB4MEM5RiwgMHg2Qjk3LAorICAgIDB4MjFCNywgMHg2Qjk4LCAweDBDOUUsIDB4NkI5OSwgMHgyMUI4LCAweDZCOUIsIDB4MjQ0OCwgMHg2QjlFLCAweDI2RTUsCisgICAgMHg2QjlGLCAweDI2RTYsIDB4NkJBMCwgMHgyNkU3LCAweDZCQTIsIDB4MjkyNywgMHg2QkEzLCAweDI5MjYsIDB4NkJBNCwKKyAgICAweDExODYsIDB4NkJBNSwgMHgyOTI1LCAweDZCQTYsIDB4MjkyOCwgMHg2QkE3LCAweDJCOEIsIDB4NkJBQSwgMHgyQjhDLAorICAgIDB4NkJBQiwgMHgyQjhELCAweDZCQUQsIDB4MkQ4QiwgMHg2QkFFLCAweDEzRjEsIDB4NkJBRiwgMHgxNEU2LCAweDZCQjAsCisgICAgMHgzMEE4LCAweDZCQjIsIDB4MTY3OSwgMHg2QkIzLCAweDE3OEEsIDB4NkJCNSwgMHgwNzZDLCAweDZCQjYsIDB4MUI0MCwKKyAgICAweDZCQjcsIDB4MDkwMSwgMHg2QkJBLCAweDBBRTgsIDB4NkJCQywgMHgwQ0EwLCAweDZCQkQsIDB4MjFCQSwgMHg2QkJGLAorICAgIDB4MEU0RCwgMHg2QkMwLCAweDBFNEMsIDB4NkJDMywgMHgyNkU4LCAweDZCQzQsIDB4MjZFOSwgMHg2QkM1LCAweDExODcsCisgICAgMHg2QkM2LCAweDExODgsIDB4NkJDNywgMHgyQjhGLCAweDZCQzgsIDB4MkI4RSwgMHg2QkM5LCAweDJGNDAsIDB4NkJDQSwKKyAgICAweDM0MjEsIDB4NkJDQiwgMHgwMkUxLCAweDZCQ0MsIDB4MTc4QiwgMHg2QkNELCAweDAzNEUsIDB4NkJDRiwgMHgwNENBLAorICAgIDB4NkJEMCwgMHgxOEFELCAweDZCRDIsIDB4MDc2RCwgMHg2QkQzLCAweDBFNEUsIDB4NkJENCwgMHgwMkUyLCAweDZCRDYsCisgICAgMHgxQjQxLCAweDZCRDcsIDB4MDc2RSwgMHg2QkQ4LCAweDFCNDIsIDB4NkJEQSwgMHgxM0YyLCAweDZCREIsIDB4MDJFMywKKyAgICAweDZCREUsIDB4MTlDQywgMHg2QkUwLCAweDFCNDMsIDB4NkJFMiwgMHgxQ0YyLCAweDZCRTMsIDB4MUNGMSwgMHg2QkU0LAorICAgIDB4MUNFRiwgMHg2QkU2LCAweDFDRUUsIDB4NkJFNywgMHgxQ0YzLCAweDZCRTgsIDB4MUNGMCwgMHg2QkVCLCAweDBBRTksCisgICAgMHg2QkVDLCAweDBBRUEsIDB4NkJFRiwgMHgwQ0ExLCAweDZCRjAsIDB4MjFCQiwgMHg2QkYyLCAweDIxQkMsIDB4NkJGMywKKyAgICAweDIxQkQsIDB4NkJGNywgMHgyNDRDLCAweDZCRjgsIDB4MjQ0RCwgMHg2QkY5LCAweDI0NEIsIDB4NkJGQiwgMHgyNDQ5LAorICAgIDB4NkJGQywgMHgyNDRBLCAweDZCRkQsIDB4MEU0RiwgMHg2QkZFLCAweDI2RUEsIDB4NkJGRiwgMHgyOTJCLCAweDZDMDAsCisgICAgMHgyOTJBLCAweDZDMDEsIDB4MjkyOSwgMHg2QzAyLCAweDI5MkMsIDB4NkMwMywgMHgyQjkxLCAweDZDMDQsIDB4MkI5MCwKKyAgICAweDZDMDUsIDB4MTJERSwgMHg2QzA2LCAweDJCOTIsIDB4NkMwOCwgMHgxM0YzLCAweDZDMDksIDB4MkQ4QywgMHg2QzBCLAorICAgIDB4MkY0MSwgMHg2QzBDLCAweDMwQTksIDB4NkMwRCwgMHgzMzg4LCAweDZDMEYsIDB4MDJFNCwgMHg2QzEwLCAweDAzNTAsCisgICAgMHg2QzExLCAweDAzNEYsIDB4NkMxMywgMHgwNjFFLCAweDZDMTQsIDB4MTc4QywgMHg2QzE1LCAweDE3QUEsIDB4NkMxNiwKKyAgICAweDAzRTYsIDB4NkMxOCwgMHgxODAxLCAweDZDMTksIDB4MThBRSwgMHg2QzFBLCAweDE4QUYsIDB4NkMxQiwgMHgwNjFGLAorICAgIDB4NkMxRCwgMHgxOUNELCAweDZDMUYsIDB4MDc2RiwgMHg2QzIwLCAweDFCNDQsIDB4NkMyMSwgMHgxQjQ1LCAweDZDMjMsCisgICAgMHgwOTAyLCAweDZDMjQsIDB4MDkwNiwgMHg2QzI1LCAweDFDRjQsIDB4NkMyNiwgMHgwOTA1LCAweDZDMjcsIDB4MDkwMywKKyAgICAweDZDMjgsIDB4MDkwNCwgMHg2QzJBLCAweDFGNDQsIDB4NkMyQiwgMHgwQUVCLCAweDZDMkMsIDB4MENBNCwgMHg2QzJFLAorICAgIDB4MENBMiwgMHg2QzJGLCAweDBDQTMsIDB4NkMzMCwgMHgyMUJFLCAweDZDMzMsIDB4MTAwMywgMHg2QzM0LCAweDAyRTUsCisgICAgMHg2QzM2LCAweDE3QUIsIDB4NkMzOCwgMHgwMzUxLCAweDZDM0IsIDB4MTdBRSwgMHg2QzNFLCAweDAzNTQsIDB4NkMzRiwKKyAgICAweDE3QUQsIDB4NkM0MCwgMHgwMzUzLCAweDZDNDEsIDB4MDM1MiwgMHg2QzQyLCAweDA0Q0IsIDB4NkM0MywgMHgxN0FDLAorICAgIDB4NkM0NiwgMHgxODAyLCAweDZDNEEsIDB4MTgwNiwgMHg2QzRCLCAweDE4MDgsIDB4NkM0QywgMHgxODA5LCAweDZDNEQsCisgICAgMHgwM0YwLCAweDZDNEUsIDB4MDNGMSwgMHg2QzRGLCAweDE4MDUsIDB4NkM1MCwgMHgwM0VDLCAweDZDNTIsIDB4MTgwMywKKyAgICAweDZDNTQsIDB4MTgwNywgMHg2QzU1LCAweDAzRUQsIDB4NkM1NywgMHgwM0U4LCAweDZDNTksIDB4MDNFOSwgMHg2QzVCLAorICAgIDB4MDNFRiwgMHg2QzVDLCAweDE4MDQsIDB4NkM1RCwgMHgwM0U3LCAweDZDNUUsIDB4MDRDQywgMHg2QzVGLCAweDAzRUEsCisgICAgMHg2QzYwLCAweDAzRUIsIDB4NkM2MSwgMHgwM0VFLCAweDZDNjUsIDB4MThDMCwgMHg2QzY2LCAweDE4QkUsIDB4NkM2NywKKyAgICAweDE4QjEsIDB4NkM2OCwgMHgwNEQ4LCAweDZDNjksIDB4MThCOCwgMHg2QzZBLCAweDA0RDMsIDB4NkM2QiwgMHgxOEIyLAorICAgIDB4NkM2RCwgMHgxOEJBLCAweDZDNkYsIDB4MThCNywgMHg2QzcwLCAweDA0RDYsIDB4NkM3MSwgMHgxOEI2LCAweDZDNzIsCisgICAgMHgwNERELCAweDZDNzMsIDB4MThCRiwgMHg2Qzc0LCAweDA0REYsIDB4NkM3NiwgMHgwNEUxLCAweDZDNzgsIDB4MThCMCwKKyAgICAweDZDN0EsIDB4MDRENCwgMHg2QzdCLCAweDE4QzEsIDB4NkM3RCwgMHgwNERCLCAweDZDN0UsIDB4MDRERSwgMHg2QzgwLAorICAgIDB4MTlFNCwgMHg2QzgxLCAweDA0Q0UsIDB4NkM4MiwgMHgwNEU1LCAweDZDODMsIDB4MDREQywgMHg2Qzg0LCAweDE4QjMsCisgICAgMHg2Qzg1LCAweDA0RDEsIDB4NkM4NiwgMHgwNEUwLCAweDZDODcsIDB4MThCQiwgMHg2Qzg4LCAweDA0Q0YsIDB4NkM4OSwKKyAgICAweDA0RDAsIDB4NkM4QSwgMHgxOUUyLCAweDZDOEIsIDB4MThCNCwgMHg2QzhDLCAweDA0RDcsIDB4NkM4RCwgMHgwNEUyLAorICAgIDB4NkM4RSwgMHgxOEMyLCAweDZDOEYsIDB4MThCNSwgMHg2QzkwLCAweDA0RDUsIDB4NkM5MiwgMHgwNERBLCAweDZDOTMsCisgICAgMHgxOUNFLCAweDZDOTQsIDB4MDRFMywgMHg2Qzk1LCAweDE4QkMsIDB4NkM5NiwgMHgwNEQ5LCAweDZDOTgsIDB4MDRFNCwKKyAgICAweDZDOTksIDB4MDRDRCwgMHg2QzlBLCAweDE4QjksIDB4NkM5QiwgMHgwNEQyLCAweDZDOUMsIDB4MThCRCwgMHg2QzlELAorICAgIDB4MTlFMywgMHg2Q0FCLCAweDA2MkIsIDB4NkNBQywgMHgwNjNCLCAweDZDQUQsIDB4MTlENSwgMHg2Q0FFLCAweDA2MzIsCisgICAgMHg2Q0IwLCAweDE5RUEsIDB4NkNCMSwgMHgwNjIzLCAweDZDQjMsIDB4MDYyNiwgMHg2Q0I0LCAweDE5RTEsIDB4NkNCNiwKKyAgICAweDE5RDMsIDB4NkNCNywgMHgxOUQ3LCAweDZDQjgsIDB4MDYyRSwgMHg2Q0I5LCAweDA2MzAsIDB4NkNCQSwgMHgxOURBLAorICAgIDB4NkNCQiwgMHgwNjM3LCAweDZDQkMsIDB4MDYyOSwgMHg2Q0JELCAweDA2MjcsIDB4NkNCRSwgMHgwNjI4LCAweDZDQkYsCisgICAgMHgwNjM2LCAweDZDQzAsIDB4MTlFNiwgMHg2Q0MxLCAweDA2MzEsIDB4NkNDMiwgMHgxOUQ5LCAweDZDQzMsIDB4MTlEQiwKKyAgICAweDZDQzQsIDB4MDYyRiwgMHg2Q0M1LCAweDA2MzQsIDB4NkNDNiwgMHgxOURDLCAweDZDQzcsIDB4MTlFOSwgMHg2Q0M5LAorICAgIDB4MDc3MCwgMHg2Q0NBLCAweDA2M0EsIDB4NkNDQywgMHgwNjI0LCAweDZDQ0QsIDB4MTlFOCwgMHg2Q0NGLCAweDE5RUMsCisgICAgMHg2Q0QwLCAweDE5RDgsIDB4NkNEMSwgMHgxOUVFLCAweDZDRDIsIDB4MTlERiwgMHg2Q0QzLCAweDA2MkQsIDB4NkNENCwKKyAgICAweDE5RDQsIDB4NkNENSwgMHgwNjJDLCAweDZDRDYsIDB4MDYzRSwgMHg2Q0Q3LCAweDA2MzMsIDB4NkNEOSwgMHgxOUQyLAorICAgIDB4NkNEQSwgMHgxQjRFLCAweDZDREIsIDB4MDYzOSwgMHg2Q0RDLCAweDA2M0QsIDB4NkNERCwgMHgxOUUwLCAweDZDREUsCisgICAgMHgxOUU1LCAweDZDRTAsIDB4MDYzRiwgMHg2Q0UxLCAweDA2MzgsIDB4NkNFMiwgMHgwNjJBLCAweDZDRTMsIDB4MDYyMCwKKyAgICAweDZDRTUsIDB4MDYyNSwgMHg2Q0U3LCAweDE5RDYsIDB4NkNFOCwgMHgwNjIxLCAweDZDRTksIDB4MTlFRCwgMHg2Q0VCLAorICAgIDB4MTlEMCwgMHg2Q0VDLCAweDE5Q0YsIDB4NkNFRCwgMHgxOURELCAweDZDRUUsIDB4MTlEMSwgMHg2Q0VGLCAweDA2M0MsCisgICAgMHg2Q0YwLCAweDA5MDcsIDB4NkNGMSwgMHgwNjM1LCAweDZDRjIsIDB4MTlERSwgMHg2Q0YzLCAweDA2MjIsIDB4NkNGNSwKKyAgICAweDA3N0YsIDB4NkNGOSwgMHgxOUVCLCAweDZEMDAsIDB4MUI1NSwgMHg2RDAxLCAweDFCNTgsIDB4NkQwMywgMHgxQjVCLAorICAgIDB4NkQwNCwgMHgxQjUwLCAweDZEMDcsIDB4MUI1RSwgMHg2RDA4LCAweDFCNjEsIDB4NkQwOSwgMHgxQjYzLCAweDZEMEEsCisgICAgMHgxQjRELCAweDZEMEIsIDB4MDc3MSwgMHg2RDBDLCAweDA3NzYsIDB4NkQwRCwgMHgxQ0Y5LCAweDZEMEUsIDB4MDc4NiwKKyAgICAweDZEMEYsIDB4MUI1QywgMHg2RDEwLCAweDFCNjQsIDB4NkQxMSwgMHgxQjU0LCAweDZEMTIsIDB4MUI0QywgMHg2RDE2LAorICAgIDB4MUQxNCwgMHg2RDE3LCAweDA3NzksIDB4NkQxOCwgMHgxQjU5LCAweDZEMTksIDB4MUI1MSwgMHg2RDFBLCAweDFCNTMsCisgICAgMHg2RDFCLCAweDA3N0UsIDB4NkQxRCwgMHgxQjU2LCAweDZEMUUsIDB4MDc3OCwgMHg2RDFGLCAweDFCNDksIDB4NkQyMCwKKyAgICAweDFCNUYsIDB4NkQyMiwgMHgxQjYyLCAweDZEMjUsIDB4MDc3NSwgMHg2RDI3LCAweDA3ODEsIDB4NkQyOCwgMHgxQjQ2LAorICAgIDB4NkQyOSwgMHgwNzgzLCAweDZEMkEsIDB4MDc3MywgMHg2RDJCLCAweDA3ODcsIDB4NkQyQywgMHgxQjYwLCAweDZEMkQsCisgICAgMHgxQjQ4LCAweDZEMkUsIDB4MDc4NCwgMHg2RDJGLCAweDFEMEUsIDB4NkQzMCwgMHgxOUU3LCAweDZEMzEsIDB4MDc3NywKKyAgICAweDZEMzIsIDB4MDc3MiwgMHg2RDMzLCAweDFCNEYsIDB4NkQzNCwgMHgxQjQ3LCAweDZEMzUsIDB4MDc4NSwgMHg2RDM2LAorICAgIDB4MDc3RCwgMHg2RDM3LCAweDFCNUEsIDB4NkQzOCwgMHgwNzgyLCAweDZEMzksIDB4MDc4MCwgMHg2RDNBLCAweDFCNTIsCisgICAgMHg2RDNCLCAweDA3N0EsIDB4NkQzQywgMHgxQjRBLCAweDZEM0QsIDB4MDc3QiwgMHg2RDNFLCAweDA3N0MsIDB4NkQzRiwKKyAgICAweDFCNEIsIDB4NkQ0MCwgMHgxQjVELCAweDZENDEsIDB4MDc3NCwgMHg2RDQyLCAweDFCNTcsIDB4NkQ1OCwgMHgxQ0ZDLAorICAgIDB4NkQ1OSwgMHgwOTBGLCAweDZENUEsIDB4MDkxNCwgMHg2RDVFLCAweDFEMDUsIDB4NkQ1RiwgMHgxRDBCLCAweDZENjAsCisgICAgMHgxRDA3LCAweDZENjEsIDB4MUNGQSwgMHg2RDYyLCAweDFDRkQsIDB4NkQ2MywgMHgxQ0Y2LCAweDZENjQsIDB4MUNGNywKKyAgICAweDZENjUsIDB4MDkxQiwgMHg2RDY2LCAweDA5MEMsIDB4NkQ2NywgMHgxRDA2LCAweDZENjgsIDB4MUQwRiwgMHg2RDY5LAorICAgIDB4MDkxNiwgMHg2RDZBLCAweDA5MDgsIDB4NkQ2QywgMHgwOTExLCAweDZENkQsIDB4MUNGRSwgMHg2RDZFLCAweDA5MTMsCisgICAgMHg2RDZGLCAweDFDRkYsIDB4NkQ3MCwgMHgxRDA5LCAweDZENzQsIDB4MDkxNSwgMHg2RDc1LCAweDFEMTgsIDB4NkQ3NiwKKyAgICAweDFDRjgsIDB4NkQ3NywgMHgwOTBFLCAweDZENzgsIDB4MDkwRCwgMHg2RDc5LCAweDA5MTksIDB4NkQ3QSwgMHgxQ0Y1LAorICAgIDB4NkQ3QiwgMHgxRDE2LCAweDZEN0MsIDB4MUQwQSwgMHg2RDdELCAweDFEMTcsIDB4NkQ3RSwgMHgxRDExLCAweDZEN0YsCisgICAgMHgxRDAzLCAweDZEODAsIDB4MUQxMiwgMHg2RDgyLCAweDFEMEMsIDB4NkQ4MywgMHgxRDE1LCAweDZEODQsIDB4MUQxMywKKyAgICAweDZEODUsIDB4MDkxQSwgMHg2RDg2LCAweDFEMDQsIDB4NkQ4NywgMHgwOTBCLCAweDZEODgsIDB4MDkwQSwgMHg2RDg5LAorICAgIDB4MDkxMiwgMHg2RDhBLCAweDA5MTgsIDB4NkQ4QiwgMHgxRDEwLCAweDZEOEMsIDB4MDkxNywgMHg2RDhELCAweDFEMDEsCisgICAgMHg2RDhFLCAweDBBRUMsIDB4NkQ5MCwgMHgxRDE5LCAweDZEOTEsIDB4MUQwMCwgMHg2RDkyLCAweDFDRkIsIDB4NkQ5MywKKyAgICAweDA5MTAsIDB4NkQ5NCwgMHgwOTFDLCAweDZEOTUsIDB4MDkwOSwgMHg2RDk3LCAweDFEMDgsIDB4NkQ5OCwgMHgxRDBELAorICAgIDB4NkRBQSwgMHgwQjBFLCAweDZEQUIsIDB4MUY0NiwgMHg2REFDLCAweDFGNEEsIDB4NkRBRSwgMHgwQUZCLCAweDZEQUYsCisgICAgMHgwQUY5LCAweDZEQjIsIDB4MEFGMCwgMHg2REIzLCAweDFGNDgsIDB4NkRCNCwgMHgxRjQ3LCAweDZEQjUsIDB4MEIwNCwKKyAgICAweDZEQjcsIDB4MUY0RCwgMHg2REI4LCAweDBBRkUsIDB4NkRCQSwgMHgxRjVGLCAweDZEQkIsIDB4MUY2QiwgMHg2REJDLAorICAgIDB4MEFFRCwgMHg2REJELCAweDFGNUMsIDB4NkRCRSwgMHgxRjU1LCAweDZEQkYsIDB4MEIxMCwgMHg2REMwLCAweDFGNDUsCisgICAgMHg2REMyLCAweDFGNjEsIDB4NkRDNCwgMHgwQjBELCAweDZEQzUsIDB4MEIwMSwgMHg2REM2LCAweDBCMEMsIDB4NkRDNywKKyAgICAweDBBRjcsIDB4NkRDOCwgMHgxRjUxLCAweDZEQzksIDB4MUY2MywgMHg2RENBLCAweDFGNUIsIDB4NkRDQiwgMHgwQUY4LAorICAgIDB4NkRDQywgMHgwQUYyLCAweDZEQ0QsIDB4MUY2OSwgMHg2RENGLCAweDFGNjIsIDB4NkREMCwgMHgxRjY0LCAweDZERDEsCisgICAgMHgwQUZBLCAweDZERDIsIDB4MEIwMiwgMHg2REQzLCAweDFGNjYsIDB4NkRENCwgMHgxRjRGLCAweDZERDUsIDB4MUY2MCwKKyAgICAweDZERDYsIDB4MUY1NCwgMHg2REQ3LCAweDFGNjgsIDB4NkREOCwgMHgwQjA3LCAweDZERDksIDB4MEFFRiwgMHg2RERBLAorICAgIDB4MEIwNSwgMHg2RERCLCAweDFGNTksIDB4NkREQywgMHgxRjU3LCAweDZEREQsIDB4MUY1OCwgMHg2RERFLCAweDBBRkMsCisgICAgMHg2RERGLCAweDFGNTMsIDB4NkRFMCwgMHgxRjUyLCAweDZERTEsIDB4MEFGMSwgMHg2REUyLCAweDFGNEMsIDB4NkRFMywKKyAgICAweDFGNkEsIDB4NkRFNCwgMHgwQUYzLCAweDZERTUsIDB4MUY1NiwgMHg2REU2LCAweDBCMTEsIDB4NkRFOCwgMHgwQjBCLAorICAgIDB4NkRFOSwgMHgxRjRCLCAweDZERUEsIDB4MEIwOCwgMHg2REVCLCAweDBCMDYsIDB4NkRFQywgMHgwQjBGLCAweDZERUQsCisgICAgMHgxRjVELCAweDZERUUsIDB4MEIwQSwgMHg2REVGLCAweDFEMDIsIDB4NkRGMCwgMHgxRjVFLCAweDZERjEsIDB4MEIwOSwKKyAgICAweDZERjIsIDB4MUY2NSwgMHg2REYzLCAweDBBRUUsIDB4NkRGNCwgMHgxRjVBLCAweDZERjUsIDB4MEIwMCwgMHg2REY2LAorICAgIDB4MUY0RSwgMHg2REY3LCAweDBBRkYsIDB4NkRGOSwgMHgwQUZELCAweDZERkEsIDB4MEFGNSwgMHg2REZCLCAweDBBRjQsCisgICAgMHg2REZDLCAweDIxQkYsIDB4NkRGRCwgMHgxRjY3LCAweDZFMDAsIDB4MUY1MCwgMHg2RTAzLCAweDIxRDQsIDB4NkUwNSwKKyAgICAweDBBRjYsIDB4NkUxOSwgMHgwQ0MxLCAweDZFMUEsIDB4MEIwMywgMHg2RTFCLCAweDBDQUYsIDB4NkUxQywgMHgyMUNFLAorICAgIDB4NkUxRCwgMHgwQ0JELCAweDZFMUYsIDB4MjFDMiwgMHg2RTIwLCAweDBDQUMsIDB4NkUyMSwgMHgwQ0E4LCAweDZFMjIsCisgICAgMHgyMUUwLCAweDZFMjMsIDB4MENBRSwgMHg2RTI0LCAweDBDQjIsIDB4NkUyNSwgMHgwQ0FELCAweDZFMjYsIDB4MENCNiwKKyAgICAweDZFMjcsIDB4MjFFNCwgMHg2RTI4LCAweDIxREIsIDB4NkUyQiwgMHgyMUM5LCAweDZFMkMsIDB4MENCQiwgMHg2RTJELAorICAgIDB4MENCNSwgMHg2RTJFLCAweDIxRDUsIDB4NkUyRiwgMHgwQ0E1LCAweDZFMzAsIDB4MjFFMSwgMHg2RTMxLCAweDIxREEsCisgICAgMHg2RTMyLCAweDBDQTksIDB4NkUzMywgMHgyMUNGLCAweDZFMzQsIDB4MENCOCwgMHg2RTM1LCAweDIxRUMsIDB4NkUzNiwKKyAgICAweDIxRUQsIDB4NkUzOCwgMHgwQ0E2LCAweDZFMzksIDB4MjFERiwgMHg2RTNBLCAweDBDQkEsIDB4NkUzQiwgMHgyMUQzLAorICAgIDB4NkUzQywgMHgyMUM1LCAweDZFM0QsIDB4MjFDNiwgMHg2RTNFLCAweDBDQkUsIDB4NkUzRiwgMHgyMUNBLCAweDZFNDAsCisgICAgMHgyMUQxLCAweDZFNDEsIDB4MjFDQiwgMHg2RTQzLCAweDBDQkMsIDB4NkU0NCwgMHgwQ0M0LCAweDZFNDUsIDB4MjFDNywKKyAgICAweDZFNDYsIDB4MjFDMCwgMHg2RTQ3LCAweDIxQzEsIDB4NkU0OSwgMHgyMUMzLCAweDZFNEEsIDB4MENBQiwgMHg2RTRCLAorICAgIDB4MjFEMCwgMHg2RTRELCAweDBDQjksIDB4NkU0RSwgMHgwQ0MyLCAweDZFNTEsIDB4MjFEMiwgMHg2RTUyLCAweDIxRUEsCisgICAgMHg2RTUzLCAweDIxRTIsIDB4NkU1NCwgMHgwQ0E3LCAweDZFNTUsIDB4MjFFOCwgMHg2RTU2LCAweDBDQjMsIDB4NkU1OCwKKyAgICAweDBDQjEsIDB4NkU1QSwgMHgyMUVFLCAweDZFNUIsIDB4MENCMCwgMHg2RTVDLCAweDIxRDgsIDB4NkU1RCwgMHgyMUNDLAorICAgIDB4NkU1RSwgMHgyMUQ2LCAweDZFNUYsIDB4MENDNywgMHg2RTYwLCAweDIxREMsIDB4NkU2MSwgMHgyMUQ5LCAweDZFNjIsCisgICAgMHgyMUM4LCAweDZFNjMsIDB4MENDMywgMHg2RTY0LCAweDIxRTYsIDB4NkU2NSwgMHgyMUUzLCAweDZFNjYsIDB4MjFFQiwKKyAgICAweDZFNjcsIDB4MENBQSwgMHg2RTY4LCAweDIxRDcsIDB4NkU2OSwgMHgwQ0M2LCAweDZFNkIsIDB4MjFERSwgMHg2RTZFLAorICAgIDB4MENCNCwgMHg2RTZGLCAweDBDQjcsIDB4NkU3MSwgMHgyMURELCAweDZFNzIsIDB4MENDNSwgMHg2RTczLCAweDIxQ0QsCisgICAgMHg2RTc0LCAweDFGNDksIDB4NkU3NywgMHgyMUU3LCAweDZFNzgsIDB4MjFFNSwgMHg2RTc5LCAweDIxRTksIDB4NkU4OCwKKyAgICAweDIxQzQsIDB4NkU4OSwgMHgwQ0MwLCAweDZFOEQsIDB4MjQ2QywgMHg2RThFLCAweDI0NkIsIDB4NkU4RiwgMHgyNDUxLAorICAgIDB4NkU5MCwgMHgwRTU1LCAweDZFOTIsIDB4MjQ2QSwgMHg2RTkzLCAweDI0NTQsIDB4NkU5NCwgMHgyNDU1LCAweDZFOTYsCisgICAgMHgwRTVGLCAweDZFOTcsIDB4MjQ3MywgMHg2RTk4LCAweDBFNUEsIDB4NkU5OSwgMHgyNDY5LCAweDZFOUIsIDB4MjQ0RSwKKyAgICAweDZFOUMsIDB4MEU2MCwgMHg2RTlELCAweDBFNTYsIDB4NkU5RSwgMHgyNDVELCAweDZFOUYsIDB4MjQ1MywgMHg2RUEwLAorICAgIDB4MjQ1NiwgMHg2RUExLCAweDI0NkUsIDB4NkVBMiwgMHgwRTUwLCAweDZFQTMsIDB4MjQ3NSwgMHg2RUE0LCAweDI0NkQsCisgICAgMHg2RUE1LCAweDBFNTksIDB4NkVBNiwgMHgyNDYyLCAweDZFQTcsIDB4MEU2NCwgMHg2RUFBLCAweDBFNjMsIDB4NkVBQiwKKyAgICAweDBFNUQsIDB4NkVBRSwgMHgyNDc0LCAweDZFQUYsIDB4MEU1MSwgMHg2RUIwLCAweDI0NjAsIDB4NkVCMSwgMHgyNDU3LAorICAgIDB4NkVCMiwgMHgyNDY0LCAweDZFQjMsIDB4MjQ3MCwgMHg2RUI0LCAweDBFNjUsIDB4NkVCNiwgMHgwRTUzLCAweDZFQjcsCisgICAgMHgyNDVGLCAweDZFQjksIDB4MjQ1OCwgMHg2RUJBLCAweDBFNUMsIDB4NkVCQywgMHgwRTVCLCAweDZFQkQsIDB4MjQ1QiwKKyAgICAweDZFQkUsIDB4MjQ2NSwgMHg2RUJGLCAweDI0NkYsIDB4NkVDMCwgMHgyNDUyLCAweDZFQzEsIDB4MjQ1QywgMHg2RUMyLAorICAgIDB4MEU1NCwgMHg2RUMzLCAweDI0NjYsIDB4NkVDNCwgMHgwRTYxLCAweDZFQzUsIDB4MEU1OCwgMHg2RUM2LCAweDI0NTksCisgICAgMHg2RUM3LCAweDBFNTcsIDB4NkVDOCwgMHgyNDUwLCAweDZFQzksIDB4MjQ1RSwgMHg2RUNBLCAweDI0NzIsIDB4NkVDQiwKKyAgICAweDBDQkYsIDB4NkVDQywgMHgxMDFGLCAweDZFQ0QsIDB4MjQ2MSwgMHg2RUNFLCAweDI2RUIsIDB4NkVDRiwgMHgyNDYzLAorICAgIDB4NkVEMCwgMHgyNDcxLCAweDZFRDEsIDB4MEU1RSwgMHg2RUQyLCAweDI0NUEsIDB4NkVEMywgMHgwRTUyLCAweDZFRDQsCisgICAgMHgwRTYyLCAweDZFRDUsIDB4MTE5QSwgMHg2RUQ2LCAweDI0NEYsIDB4NkVEOCwgMHgyNDY4LCAweDZFREMsIDB4MjQ2NywKKyAgICAweDZFRUIsIDB4MjcwNywgMHg2RUVDLCAweDEwMUMsIDB4NkVFRCwgMHgyNkZDLCAweDZFRUUsIDB4MjcwMSwgMHg2RUVGLAorICAgIDB4MTAxMSwgMHg2RUYxLCAweDI2RUQsIDB4NkVGMiwgMHgxMDFFLCAweDZFRjQsIDB4MTAwOCwgMHg2RUY1LCAweDI2RUMsCisgICAgMHg2RUY2LCAweDI3MEQsIDB4NkVGNywgMHgxMDIwLCAweDZFRjgsIDB4MjZGMCwgMHg2RUY5LCAweDI3MDAsIDB4NkVGQiwKKyAgICAweDI2RjIsIDB4NkVGQywgMHgyNzEwLCAweDZFRkQsIDB4MjcwQywgMHg2RUZFLCAweDEwMDYsIDB4NkVGRiwgMHgxMDEwLAorICAgIDB4NkYwMCwgMHgyOTQ2LCAweDZGMDEsIDB4MTAxRCwgMHg2RjAyLCAweDEwMEUsIDB4NkYwMywgMHgyNkVFLCAweDZGMDUsCisgICAgMHgyNzBCLCAweDZGMDYsIDB4MTAxMiwgMHg2RjA3LCAweDI3MDgsIDB4NkYwOCwgMHgyNzE1LCAweDZGMDksIDB4MjZGNCwKKyAgICAweDZGMEEsIDB4MjZGRCwgMHg2RjBELCAweDI3MTMsIDB4NkYwRSwgMHgyNzA5LCAweDZGMEYsIDB4MTAwRCwgMHg2RjEyLAorICAgIDB4MjZGQiwgMHg2RjEzLCAweDEwMDcsIDB4NkYxNCwgMHgxMDA1LCAweDZGMTUsIDB4MTAxNywgMHg2RjE4LCAweDI2RjksCisgICAgMHg2RjE5LCAweDI2RjYsIDB4NkYxQSwgMHgyNkY3LCAweDZGMUMsIDB4MjcwRiwgMHg2RjFFLCAweDI3MTQsIDB4NkYxRiwKKyAgICAweDI3MTIsIDB4NkYyMCwgMHgxMDBCLCAweDZGMjEsIDB4MjcxNiwgMHg2RjIyLCAweDEwMEYsIDB4NkYyMywgMHgxMDE2LAorICAgIDB4NkYyNSwgMHgyNkVGLCAweDZGMjYsIDB4MjkyRSwgMHg2RjI3LCAweDI2RjgsIDB4NkYyOSwgMHgxMDA5LCAweDZGMkEsCisgICAgMHgxMDFCLCAweDZGMkIsIDB4MTAxOCwgMHg2RjJDLCAweDEwMEMsIDB4NkYyRCwgMHgyNzAyLCAweDZGMkUsIDB4MjZGMywKKyAgICAweDZGMkYsIDB4MTAxOSwgMHg2RjMwLCAweDI3MDQsIDB4NkYzMSwgMHgxMDEzLCAweDZGMzIsIDB4MTAxNSwgMHg2RjMzLAorICAgIDB4MTAwNCwgMHg2RjM1LCAweDI3MDYsIDB4NkYzNiwgMHgyNkZFLCAweDZGMzcsIDB4MjZGMSwgMHg2RjM4LCAweDEwMTQsCisgICAgMHg2RjM5LCAweDI3MEUsIDB4NkYzQSwgMHgyNzExLCAweDZGM0IsIDB4MjZGQSwgMHg2RjNDLCAweDI3MDUsIDB4NkYzRSwKKyAgICAweDEwMEEsIDB4NkYzRiwgMHgxMTg5LCAweDZGNDAsIDB4MjcwMywgMHg2RjQxLCAweDI5MkQsIDB4NkY0MywgMHgyNzBBLAorICAgIDB4NkY0RSwgMHgyNkY1LCAweDZGNEYsIDB4MjkzNywgMHg2RjUwLCAweDI5NDEsIDB4NkY1MSwgMHgxMThDLCAweDZGNTIsCisgICAgMHgyOTQwLCAweDZGNTMsIDB4Mjk0QywgMHg2RjU0LCAweDExOEUsIDB4NkY1NSwgMHgyOTNFLCAweDZGNTcsIDB4Mjk0MiwKKyAgICAweDZGNTgsIDB4MTE5OSwgMHg2RjVBLCAweDI5MzksIDB4NkY1QiwgMHgxMTkxLCAweDZGNUQsIDB4Mjk0NSwgMHg2RjVFLAorICAgIDB4MkI5QSwgMHg2RjVGLCAweDExOUQsIDB4NkY2MCwgMHgxMTlDLCAweDZGNjEsIDB4Mjk0NywgMHg2RjYyLCAweDI5MzYsCisgICAgMHg2RjYzLCAweDI5NTEsIDB4NkY2NCwgMHgxMTk3LCAweDZGNjYsIDB4MTE4RCwgMHg2RjY3LCAweDI5NEEsIDB4NkY2OSwKKyAgICAweDI5NEUsIDB4NkY2QSwgMHgyOTUzLCAweDZGNkIsIDB4Mjk0OCwgMHg2RjZDLCAweDI5M0MsIDB4NkY2RCwgMHgxMTkwLAorICAgIDB4NkY2RSwgMHgxMTkzLCAweDZGNkYsIDB4MTE5QiwgMHg2RjcwLCAweDExOTYsIDB4NkY3MiwgMHgyOTNGLCAweDZGNzMsCisgICAgMHgyNkZGLCAweDZGNzYsIDB4MjkzQiwgMHg2Rjc3LCAweDI5NTIsIDB4NkY3OCwgMHgxMTkyLCAweDZGN0EsIDB4MTE5NSwKKyAgICAweDZGN0IsIDB4Mjk1NCwgMHg2RjdDLCAweDExOEEsIDB4NkY3RCwgMHgyOTQ5LCAweDZGN0UsIDB4MjkyRiwgMHg2RjdGLAorICAgIDB4Mjk0RiwgMHg2RjgwLCAweDEzRkMsIDB4NkY4MiwgMHgyOTNELCAweDZGODQsIDB4MTE4QiwgMHg2Rjg1LCAweDI5MzgsCisgICAgMHg2Rjg2LCAweDExOEYsIDB4NkY4NywgMHgyOTMwLCAweDZGODgsIDB4MTAxQSwgMHg2Rjg5LCAweDI5MzQsIDB4NkY4QiwKKyAgICAweDI5NEQsIDB4NkY4QywgMHgyOTM1LCAweDZGOEQsIDB4MjkzMywgMHg2RjhFLCAweDExOTQsIDB4NkY5MCwgMHgyOTRCLAorICAgIDB4NkY5MiwgMHgyOTMyLCAweDZGOTMsIDB4Mjk0NCwgMHg2Rjk0LCAweDI5NDMsIDB4NkY5NSwgMHgyOTUwLCAweDZGOTYsCisgICAgMHgyOTNBLCAweDZGOTcsIDB4MTE5OCwgMHg2RjlFLCAweDJCOUQsIDB4NkZBMCwgMHgxMkVCLCAweDZGQTEsIDB4MTJFMSwKKyAgICAweDZGQTIsIDB4MkJBOSwgMHg2RkEzLCAweDJCOTUsIDB4NkZBNCwgMHgxMkUzLCAweDZGQTUsIDB4MkJBMSwgMHg2RkE2LAorICAgIDB4MTJFQSwgMHg2RkE3LCAweDEyRTUsIDB4NkZBOCwgMHgyQjlGLCAweDZGQTksIDB4MkQ4RSwgMHg2RkFBLCAweDJCQTUsCisgICAgMHg2RkFCLCAweDJCQUIsIDB4NkZBQywgMHgyQkE0LCAweDZGQUQsIDB4MkI5MywgMHg2RkFFLCAweDJCQTIsIDB4NkZBRiwKKyAgICAweDJCQUQsIDB4NkZCMCwgMHgyQkFGLCAweDZGQjEsIDB4MTJFMCwgMHg2RkIyLCAweDJCQUUsIDB4NkZCMywgMHgxMkU2LAorICAgIDB4NkZCNCwgMHgxMkVDLCAweDZGQjYsIDB4MTJFOSwgMHg2RkI4LCAweDJCQTgsIDB4NkZCOSwgMHgxMkU4LCAweDZGQkEsCisgICAgMHgyQkEzLCAweDZGQkMsIDB4MkI5NywgMHg2RkJELCAweDJCOUMsIDB4NkZCRiwgMHgyQkE3LCAweDZGQzAsIDB4MTJFNywKKyAgICAweDZGQzEsIDB4MTJFNCwgMHg2RkMyLCAweDEyREYsIDB4NkZDMywgMHgxMkUyLCAweDZGQzQsIDB4MkI5QiwgMHg2RkM2LAorICAgIDB4MjkzMSwgMHg2RkM3LCAweDJCOTYsIDB4NkZDOCwgMHgyQjk5LCAweDZGQzksIDB4MkJBQSwgMHg2RkNBLCAweDJCOUUsCisgICAgMHg2RkNCLCAweDJCOTQsIDB4NkZDQywgMHgyRDhELCAweDZGQ0QsIDB4MkJBQywgMHg2RkNFLCAweDJCOTgsIDB4NkZDRiwKKyAgICAweDJCQTYsIDB4NkZENCwgMHgyRDkwLCAweDZGRDUsIDB4MTQwMCwgMHg2RkQ4LCAweDEzRjQsIDB4NkZEQiwgMHgxM0Y4LAorICAgIDB4NkZEQywgMHgyRDkyLCAweDZGREQsIDB4MkQ5OCwgMHg2RkRFLCAweDJEOTYsIDB4NkZERiwgMHgxM0Y2LCAweDZGRTAsCisgICAgMHgxM0Y3LCAweDZGRTEsIDB4MTNGRSwgMHg2RkUyLCAweDJEOTksIDB4NkZFMywgMHgyRDkxLCAweDZGRTQsIDB4MTNGOSwKKyAgICAweDZGRTYsIDB4MkQ5NSwgMHg2RkU3LCAweDJEOTQsIDB4NkZFOCwgMHgyRDlBLCAweDZGRTksIDB4MTNGRiwgMHg2RkVCLAorICAgIDB4MTNGQSwgMHg2RkVDLCAweDEzRkQsIDB4NkZFRCwgMHgyRDkzLCAweDZGRUUsIDB4MTQwMSwgMHg2RkVGLCAweDEzRkIsCisgICAgMHg2RkYwLCAweDE0MDIsIDB4NkZGMSwgMHgxM0Y1LCAweDZGRjIsIDB4MkQ5NywgMHg2RkY0LCAweDJEOEYsIDB4NkZGNywKKyAgICAweDJGNEUsIDB4NkZGQSwgMHgxNEVCLCAweDZGRkIsIDB4MkY0QiwgMHg2RkZDLCAweDJGNEQsIDB4NkZGRSwgMHgxNEU5LAorICAgIDB4NkZGRiwgMHgyRjQ5LCAweDcwMDAsIDB4MkY0QSwgMHg3MDAxLCAweDJGNDUsIDB4NzAwNCwgMHgyQkEwLCAweDcwMDUsCisgICAgMHgyRjQ2LCAweDcwMDYsIDB4MTRFQSwgMHg3MDA3LCAweDJGNDIsIDB4NzAwOSwgMHgxNEU3LCAweDcwMEEsIDB4MkY0RiwKKyAgICAweDcwMEIsIDB4MTRFOCwgMHg3MDBDLCAweDJGNDMsIDB4NzAwRCwgMHgyRjQ0LCAweDcwMEUsIDB4MkY0OCwgMHg3MDBGLAorICAgIDB4MTRFRCwgMHg3MDExLCAweDE0RUMsIDB4NzAxNCwgMHgyRjQ3LCAweDcwMTUsIDB4MTU4RiwgMHg3MDE2LCAweDMwQUQsCisgICAgMHg3MDE3LCAweDMwQjMsIDB4NzAxOCwgMHgxNTkwLCAweDcwMTksIDB4MzBBQSwgMHg3MDFBLCAweDE1OEQsIDB4NzAxQiwKKyAgICAweDE1OEEsIDB4NzAxQywgMHgzMEI1LCAweDcwMUQsIDB4MTU4RSwgMHg3MDFGLCAweDE1OEIsIDB4NzAyMCwgMHgzMEFDLAorICAgIDB4NzAyMSwgMHgzMEFGLCAweDcwMjIsIDB4MzBCMCwgMHg3MDIzLCAweDMwQjEsIDB4NzAyNCwgMHgzMEI0LCAweDcwMjYsCisgICAgMHgyRjRDLCAweDcwMjcsIDB4MzBBQiwgMHg3MDI4LCAweDE1OEMsIDB4NzAyOSwgMHgzMEIyLCAweDcwMkEsIDB4MzFFRiwKKyAgICAweDcwMkIsIDB4MzBBRSwgMHg3MDJGLCAweDMxRTYsIDB4NzAzMCwgMHgxNjFELCAweDcwMzEsIDB4MzFFOSwgMHg3MDMyLAorICAgIDB4MTYxRSwgMHg3MDMzLCAweDMxRjIsIDB4NzAzNCwgMHgzMUU4LCAweDcwMzUsIDB4MzFFNSwgMHg3MDM3LCAweDMxRTcsCisgICAgMHg3MDM4LCAweDMxRUIsIDB4NzAzOSwgMHgzMUVFLCAweDcwM0EsIDB4MzFFRCwgMHg3MDNCLCAweDMxRjEsIDB4NzAzQywKKyAgICAweDMxRTQsIDB4NzAzRSwgMHgxNjFDLCAweDcwM0YsIDB4MzFFQywgMHg3MDQwLCAweDMxRjAsIDB4NzA0MSwgMHgzMUYzLAorICAgIDB4NzA0MiwgMHgzMUVBLCAweDcwNDMsIDB4MzJEOCwgMHg3MDQ0LCAweDMyRDksIDB4NzA0NSwgMHgzMkRELCAweDcwNDYsCisgICAgMHgzMkRFLCAweDcwNDgsIDB4MzJEQiwgMHg3MDQ5LCAweDMyREMsIDB4NzA0QSwgMHgzMkRBLCAweDcwNEMsIDB4MTY3QSwKKyAgICAweDcwNTEsIDB4MTZDOCwgMHg3MDUyLCAweDMzOEMsIDB4NzA1NSwgMHgzMzg5LCAweDcwNTYsIDB4MzM4QSwgMHg3MDU3LAorICAgIDB4MzM4QiwgMHg3MDU4LCAweDE2QzksIDB4NzA1QSwgMHgzNDIzLCAweDcwNUIsIDB4MzQyMiwgMHg3MDVELCAweDM0OEEsCisgICAgMHg3MDVFLCAweDE3MjIsIDB4NzA1RiwgMHgzNDg4LCAweDcwNjAsIDB4MzQ4QiwgMHg3MDYxLCAweDM0ODksIDB4NzA2MiwKKyAgICAweDM0RDAsIDB4NzA2MywgMHgxNzQ0LCAweDcwNjQsIDB4MTc1MiwgMHg3MDY1LCAweDM1MUMsIDB4NzA2NiwgMHgzNTA2LAorICAgIDB4NzA2OCwgMHgzNTFCLCAweDcwNjksIDB4MzU0NywgMHg3MDZBLCAweDM1NDgsIDB4NzA2QiwgMHgwMkU2LCAweDcwNzAsCisgICAgMHgwM0YyLCAweDcwNzEsIDB4MTgwQSwgMHg3MDc0LCAweDE4QzMsIDB4NzA3NiwgMHgwNEU2LCAweDcwNzgsIDB4MDRFOSwKKyAgICAweDcwN0EsIDB4MThDNCwgMHg3MDdDLCAweDA0RTcsIDB4NzA3RCwgMHgwNEU4LCAweDcwODIsIDB4MTlGNywgMHg3MDgzLAorICAgIDB4MTlGOSwgMHg3MDg0LCAweDE5RjQsIDB4NzA4NSwgMHgxOUYxLCAweDcwODYsIDB4MTlGMywgMHg3MDhBLCAweDA2NDMsCisgICAgMHg3MDhFLCAweDA2NDEsIDB4NzA5MSwgMHgxOUY1LCAweDcwOTIsIDB4MDY0MiwgMHg3MDkzLCAweDE5RjIsIDB4NzA5NCwKKyAgICAweDE5RUYsIDB4NzA5NSwgMHgwNjQwLCAweDcwOTYsIDB4MTlGNiwgMHg3MDk4LCAweDE5RjAsIDB4NzA5OSwgMHgwNjQ0LAorICAgIDB4NzA5QSwgMHgxOUY4LCAweDcwOUYsIDB4MUI2NiwgMHg3MEExLCAweDFCNkEsIDB4NzBBNCwgMHgwNzkwLCAweDcwQTksCisgICAgMHgxQjZELCAweDcwQUIsIDB4MDc4OCwgMHg3MEFDLCAweDA3OEIsIDB4NzBBRCwgMHgwNzhELCAweDcwQUUsIDB4MDc4RiwKKyAgICAweDcwQUYsIDB4MDc4QywgMHg3MEIwLCAweDFCNjksIDB4NzBCMSwgMHgxQjY4LCAweDcwQjMsIDB4MDc4QSwgMHg3MEI0LAorICAgIDB4MUI2QiwgMHg3MEI1LCAweDFCNkMsIDB4NzBCNywgMHgxQjY1LCAweDcwQjgsIDB4MDc4RSwgMHg3MEJBLCAweDA3ODksCisgICAgMHg3MEJFLCAweDFCNjcsIDB4NzBDNSwgMHgxRDI3LCAweDcwQzYsIDB4MUQyOCwgMHg3MEM3LCAweDFEMjksIDB4NzBDOCwKKyAgICAweDA5MjEsIDB4NzBDQSwgMHgwOTFELCAweDcwQ0IsIDB4MUQxRSwgMHg3MENELCAweDFEMjYsIDB4NzBDRSwgMHgxRDJCLAorICAgIDB4NzBDRiwgMHgwOTIyLCAweDcwRDEsIDB4MUQxQywgMHg3MEQyLCAweDFEMjIsIDB4NzBEMywgMHgxRDFCLCAweDcwRDQsCisgICAgMHgxRDI1LCAweDcwRDcsIDB4MUQyMSwgMHg3MEQ4LCAweDA5MUUsIDB4NzBEOSwgMHgwOTIwLCAweDcwREEsIDB4MUQyQSwKKyAgICAweDcwREMsIDB4MUQxQSwgMHg3MERELCAweDFEMUQsIDB4NzBERSwgMHgxRDIzLCAweDcwRTAsIDB4MUQyNCwgMHg3MEUxLAorICAgIDB4MUQyQywgMHg3MEUyLCAweDFEMjAsIDB4NzBFNCwgMHgwOTFGLCAweDcwRUYsIDB4MEIxNiwgMHg3MEYwLCAweDFGNzIsCisgICAgMHg3MEYzLCAweDFGNzQsIDB4NzBGNCwgMHgxRjcwLCAweDcwRjYsIDB4MUY3QywgMHg3MEY3LCAweDFGNkUsIDB4NzBGOCwKKyAgICAweDFGN0IsIDB4NzBGOSwgMHgwQjEyLCAweDcwRkEsIDB4MUY2QywgMHg3MEZCLCAweDIxRjIsIDB4NzBGQywgMHgxRjc2LAorICAgIDB4NzBGRCwgMHgwQjE1LCAweDcwRkYsIDB4MUY3NywgMHg3MTAwLCAweDFGN0EsIDB4NzEwMiwgMHgxRjdFLCAweDcxMDQsCisgICAgMHgxRjczLCAweDcxMDYsIDB4MUY3OCwgMHg3MTA5LCAweDBCMTMsIDB4NzEwQSwgMHgwQjE0LCAweDcxMEIsIDB4MUY3RCwKKyAgICAweDcxMEMsIDB4MUY3MSwgMHg3MTBELCAweDFGNkQsIDB4NzEwRSwgMHgxRjdGLCAweDcxMTAsIDB4MUY3NSwgMHg3MTEzLAorICAgIDB4MUY3OSwgMHg3MTE3LCAweDFGNkYsIDB4NzExOSwgMHgwQ0M4LCAweDcxMUEsIDB4MENDOSwgMHg3MTFCLCAweDIxRkMsCisgICAgMHg3MTFDLCAweDBDQ0YsIDB4NzExRSwgMHgyMUYwLCAweDcxMUYsIDB4MjFGOSwgMHg3MTIwLCAweDIxRUYsIDB4NzEyMSwKKyAgICAweDBDQ0MsIDB4NzEyMiwgMHgyMUY3LCAweDcxMjMsIDB4MjFGNSwgMHg3MTI1LCAweDIxRjYsIDB4NzEyNiwgMHgwQ0NBLAorICAgIDB4NzEyOCwgMHgyMUZBLCAweDcxMkUsIDB4MjFGMywgMHg3MTJGLCAweDIxRjEsIDB4NzEzMCwgMHgwQ0NCLCAweDcxMzEsCisgICAgMHgyMUY0LCAweDcxMzIsIDB4MjFGOCwgMHg3MTM2LCAweDBDQ0QsIDB4NzEzQSwgMHgyMUZCLCAweDcxNDEsIDB4MjQ3QiwKKyAgICAweDcxNDIsIDB4MjQ4MiwgMHg3MTQzLCAweDI0ODQsIDB4NzE0NCwgMHgyNDhBLCAweDcxNDYsIDB4MEU3MiwgMHg3MTQ3LAorICAgIDB4MjQ3NiwgMHg3MTQ5LCAweDBFNkEsIDB4NzE0QiwgMHgyNDg1LCAweDcxNEMsIDB4MEU2RiwgMHg3MTRELCAweDI0OEIsCisgICAgMHg3MTRFLCAweDBFNjYsIDB4NzE1MCwgMHgyNDg4LCAweDcxNTIsIDB4MjQ3OCwgMHg3MTUzLCAweDI0ODksIDB4NzE1NCwKKyAgICAweDI0NzcsIDB4NzE1NiwgMHgwRTc0LCAweDcxNTgsIDB4MjQ4MywgMHg3MTU5LCAweDBFNjcsIDB4NzE1QSwgMHgyNDhDLAorICAgIDB4NzE1QywgMHgwRTZDLCAweDcxNUQsIDB4MjQ3QywgMHg3MTVFLCAweDBFNzEsIDB4NzE1RiwgMHgyNDg3LCAweDcxNjAsCisgICAgMHgyNDdBLCAweDcxNjEsIDB4MjQ4MSwgMHg3MTYyLCAweDI0N0QsIDB4NzE2MywgMHgyNDc5LCAweDcxNjQsIDB4MEU2OSwKKyAgICAweDcxNjUsIDB4MEU3MCwgMHg3MTY2LCAweDBFNkUsIDB4NzE2NywgMHgwRTZCLCAweDcxNjgsIDB4MEU3MywgMHg3MTY5LAorICAgIDB4MEU2OCwgMHg3MTZBLCAweDI0ODAsIDB4NzE2QywgMHgwRTZELCAweDcxNkUsIDB4MENDRSwgMHg3MTcwLCAweDI0ODYsCisgICAgMHg3MTcyLCAweDI0N0UsIDB4NzE3OCwgMHgyNDdGLCAweDcxN0IsIDB4MjcxRSwgMHg3MTdELCAweDEwMjMsIDB4NzE4MCwKKyAgICAweDI3MUEsIDB4NzE4MSwgMHgyNzIwLCAweDcxODIsIDB4MjcxQywgMHg3MTg0LCAweDEwMjUsIDB4NzE4NSwgMHgyNzFCLAorICAgIDB4NzE4NiwgMHgyNzFGLCAweDcxODcsIDB4MjcxNywgMHg3MTg5LCAweDI3MTksIDB4NzE4QSwgMHgxMDI0LCAweDcxOEYsCisgICAgMHgyNzFELCAweDcxOTAsIDB4MjcxOCwgMHg3MTkyLCAweDEwMjYsIDB4NzE5NCwgMHgxMDIxLCAweDcxOTcsIDB4MjcyMSwKKyAgICAweDcxOTksIDB4MTAyMiwgMHg3MTlBLCAweDI5NUEsIDB4NzE5QiwgMHgyOTU3LCAweDcxOUMsIDB4Mjk2MywgMHg3MTlELAorICAgIDB4Mjk1RCwgMHg3MTlFLCAweDI5NUYsIDB4NzE5RiwgMHgxMTlFLCAweDcxQTAsIDB4Mjk1OSwgMHg3MUExLCAweDI5NjEsCisgICAgMHg3MUE0LCAweDI5NjAsIDB4NzFBNSwgMHgyOTVFLCAweDcxQTcsIDB4Mjk2NCwgMHg3MUE4LCAweDExQTEsIDB4NzFBOSwKKyAgICAweDI5NUIsIDB4NzFBQSwgMHgyOTYyLCAweDcxQUMsIDB4MTE5RiwgMHg3MUFGLCAweDI5NTYsIDB4NzFCMCwgMHgyOTU4LAorICAgIDB4NzFCMSwgMHgxMUEwLCAweDcxQjIsIDB4Mjk1NSwgMHg3MUIzLCAweDI5NjUsIDB4NzFCNSwgMHgyOTVDLCAweDcxQjgsCisgICAgMHgyQkIzLCAweDcxQjksIDB4MTJGMywgMHg3MUJDLCAweDJCQkUsIDB4NzFCRCwgMHgyQkJDLCAweDcxQkUsIDB4MTJFRCwKKyAgICAweDcxQkYsIDB4MkJCMiwgMHg3MUMwLCAweDJCQjUsIDB4NzFDMSwgMHgyQkI2LCAweDcxQzIsIDB4MkJCMSwgMHg3MUMzLAorICAgIDB4MTJGNywgMHg3MUM0LCAweDEyRjgsIDB4NzFDNSwgMHgyQkIwLCAweDcxQzYsIDB4MkJCRiwgMHg3MUM3LCAweDJCQkEsCisgICAgMHg3MUM4LCAweDEyRjEsIDB4NzFDOSwgMHgxMkVFLCAweDcxQ0EsIDB4MkJCOSwgMHg3MUNCLCAweDJCQjcsIDB4NzFDRSwKKyAgICAweDEyRjQsIDB4NzFDRiwgMHgyQkJCLCAweDcxRDAsIDB4MTJFRiwgMHg3MUQyLCAweDEyRjAsIDB4NzFENCwgMHgyQkI4LAorICAgIDB4NzFENSwgMHgxMkYyLCAweDcxRDYsIDB4MkJCNCwgMHg3MUQ4LCAweDJCQkQsIDB4NzFEOSwgMHgxMkY1LCAweDcxREEsCisgICAgMHgyQkMwLCAweDcxREIsIDB4MkJDMSwgMHg3MURDLCAweDEyRjYsIDB4NzFERiwgMHgxNDA0LCAweDcxRTAsIDB4MTQwQiwKKyAgICAweDcxRTEsIDB4MkQ5QiwgMHg3MUUyLCAweDJEQTEsIDB4NzFFNCwgMHgyRDlGLCAweDcxRTUsIDB4MTQwNywgMHg3MUU2LAorICAgIDB4MTQwNiwgMHg3MUU3LCAweDE0MDMsIDB4NzFFOCwgMHgyRDlELCAweDcxRUMsIDB4MTQwOSwgMHg3MUVELCAweDE0MDgsCisgICAgMHg3MUVFLCAweDE0MDUsIDB4NzFGMCwgMHgyREEwLCAweDcxRjEsIDB4MkQ5QywgMHg3MUYyLCAweDJEOUUsIDB4NzFGNCwKKyAgICAweDE0MEEsIDB4NzFGOCwgMHgxNEYxLCAweDcxRjksIDB4MkY1MiwgMHg3MUZCLCAweDE0RUUsIDB4NzFGQywgMHgxNEVGLAorICAgIDB4NzFGRCwgMHgyRjU0LCAweDcxRkUsIDB4MTRGMCwgMHg3MUZGLCAweDJGNTEsIDB4NzIwMSwgMHgyRjUwLCAweDcyMDIsCisgICAgMHgzMEI5LCAweDcyMDMsIDB4MkY1MywgMHg3MjA1LCAweDMwQkEsIDB4NzIwNiwgMHgxNTkxLCAweDcyMDcsIDB4MzBCOCwKKyAgICAweDcyMEEsIDB4MzBCNywgMHg3MjBDLCAweDMwQjYsIDB4NzIwRCwgMHgxNTkyLCAweDcyMTAsIDB4MTYxRiwgMHg3MjEzLAorICAgIDB4MzFGNCwgMHg3MjE0LCAweDMxRjUsIDB4NzIxOSwgMHgzMkUxLCAweDcyMUEsIDB4MzJFMCwgMHg3MjFCLCAweDE2N0IsCisgICAgMHg3MjFELCAweDMyREYsIDB4NzIxRSwgMHgzMzhELCAweDcyMUYsIDB4MzM4RSwgMHg3MjIyLCAweDM0MjQsIDB4NzIyMywKKyAgICAweDM0OEMsIDB4NzIyNiwgMHgzNEQxLCAweDcyMjcsIDB4MzUzNSwgMHg3MjI4LCAweDE3NjYsIDB4NzIyOSwgMHgzNTQ5LAorICAgIDB4NzIyQSwgMHgwMkU3LCAweDcyMkMsIDB4MDY0NSwgMHg3MjJELCAweDA2NDYsIDB4NzIzMCwgMHgwNzkxLCAweDcyMzUsCisgICAgMHgxNDBDLCAweDcyMzYsIDB4MDJFOCwgMHg3MjM4LCAweDA2NDcsIDB4NzIzOSwgMHgwOTIzLCAweDcyM0EsIDB4MEU3NSwKKyAgICAweDcyM0IsIDB4MDJFOSwgMHg3MjNELCAweDBCMTcsIDB4NzIzRSwgMHgxMDI3LCAweDcyM0YsIDB4MTc4RCwgMHg3MjQxLAorICAgIDB4MUI2RSwgMHg3MjQyLCAweDFEMkQsIDB4NzI0NCwgMHgyNzIyLCAweDcyNDYsIDB4MTQwRCwgMHg3MjQ3LCAweDAyRUEsCisgICAgMHg3MjQ4LCAweDA2NDgsIDB4NzI0OSwgMHgxQjZGLCAweDcyNEEsIDB4MUI3MCwgMHg3MjRCLCAweDIxRkQsIDB4NzI0QywKKyAgICAweDBDRDAsIDB4NzI0RiwgMHgyNDhELCAweDcyNTIsIDB4MEU3NiwgMHg3MjUzLCAweDI3MjMsIDB4NzI1NiwgMHgxMUEyLAorICAgIDB4NzI1OCwgMHgxNTkzLCAweDcyNTksIDB4MDJFQiwgMHg3MjVBLCAweDIxRkUsIDB4NzI1QiwgMHgwMkVDLCAweDcyNUQsCisgICAgMHgwM0Y0LCAweDcyNUUsIDB4MTgwQiwgMHg3MjVGLCAweDAzRjMsIDB4NzI2MCwgMHgwNEVDLCAweDcyNjEsIDB4MDRFQiwKKyAgICAweDcyNjIsIDB4MDRFQSwgMHg3MjYzLCAweDE4QzUsIDB4NzI2NywgMHgwNjQ5LCAweDcyNjksIDB4MDY0QSwgMHg3MjZBLAorICAgIDB4MTlGQSwgMHg3MjZDLCAweDFCNzEsIDB4NzI2RSwgMHgxQjc0LCAweDcyNkYsIDB4MDc5MywgMHg3MjcwLCAweDFCNzIsCisgICAgMHg3MjcyLCAweDA3OTIsIDB4NzI3MywgMHgxQjczLCAweDcyNzQsIDB4MDc5NCwgMHg3Mjc2LCAweDFEMzAsIDB4NzI3NywKKyAgICAweDFEMkYsIDB4NzI3OCwgMHgxRDJFLCAweDcyNzksIDB4MDkyNCwgMHg3MjdCLCAweDFGODEsIDB4NzI3QywgMHgxRjgyLAorICAgIDB4NzI3RCwgMHgwQjE4LCAweDcyN0UsIDB4MUY4MCwgMHg3MjdGLCAweDFGODMsIDB4NzI4MCwgMHgwQ0QyLCAweDcyODEsCisgICAgMHgwQjE5LCAweDcyODQsIDB4MENEMSwgMHg3Mjg1LCAweDIyMDIsIDB4NzI4NiwgMHgyMjAxLCAweDcyODgsIDB4MjFGRiwKKyAgICAweDcyODksIDB4MjIwMCwgMHg3MjhCLCAweDIyMDMsIDB4NzI4QywgMHgyNDhGLCAweDcyOEQsIDB4MjQ4RSwgMHg3MjhFLAorICAgIDB4MjQ5MiwgMHg3MjkwLCAweDI0OTEsIDB4NzI5MSwgMHgyNDkwLCAweDcyOTIsIDB4MTAyOCwgMHg3MjkzLCAweDI3MjYsCisgICAgMHg3Mjk1LCAweDI3MjUsIDB4NzI5NiwgMHgxMDI5LCAweDcyOTcsIDB4MjcyNCwgMHg3Mjk4LCAweDI5NjYsIDB4NzI5QSwKKyAgICAweDI5NjcsIDB4NzI5QiwgMHgxMUEzLCAweDcyOUQsIDB4MkJDMiwgMHg3MjlFLCAweDJCQzMsIDB4NzJBMSwgMHgzMEJGLAorICAgIDB4NzJBMiwgMHgxNTk0LCAweDcyQTMsIDB4MzBCRSwgMHg3MkE0LCAweDMwQkQsIDB4NzJBNSwgMHgzMEJCLCAweDcyQTYsCisgICAgMHgzMEJDLCAweDcyQTcsIDB4MTY3QywgMHg3MkE4LCAweDMxRjYsIDB4NzJBOSwgMHgzMzhGLCAweDcyQUEsIDB4MzREMiwKKyAgICAweDcyQUMsIDB4MDJFRCwgMHg3MkFFLCAweDE3QUYsIDB4NzJBRiwgMHgwMzU1LCAweDcyQjAsIDB4MTdCMCwgMHg3MkI0LAorICAgIDB4MTgwQywgMHg3MkI1LCAweDE4MEQsIDB4NzJCQSwgMHgxOENCLCAweDcyQkQsIDB4MThDNywgMHg3MkJGLCAweDE4QzYsCisgICAgMHg3MkMwLCAweDA2NEIsIDB4NzJDMSwgMHgxOENBLCAweDcyQzIsIDB4MDRFRSwgMHg3MkMzLCAweDE4QzgsIDB4NzJDNCwKKyAgICAweDA0RUQsIDB4NzJDNSwgMHgxOENDLCAweDcyQzYsIDB4MThDOSwgMHg3MkM5LCAweDE5RkUsIDB4NzJDQSwgMHgxQjc1LAorICAgIDB4NzJDQiwgMHgxOUZDLCAweDcyQ0MsIDB4MUEwMywgMHg3MkNFLCAweDA2NEMsIDB4NzJEMCwgMHgwNjRGLCAweDcyRDEsCisgICAgMHgxQTA0LCAweDcyRDIsIDB4MUEwMCwgMHg3MkQ0LCAweDFBMDEsIDB4NzJENiwgMHgxOUZCLCAweDcyRDcsIDB4MDY0RSwKKyAgICAweDcyRDgsIDB4MTlGRCwgMHg3MkQ5LCAweDA2NEQsIDB4NzJEQSwgMHgxQTAyLCAweDcyREMsIDB4MTlGRiwgMHg3MkRGLAorICAgIDB4MUI3OSwgMHg3MkUwLCAweDA3OTYsIDB4NzJFMSwgMHgwNzk3LCAweDcyRTMsIDB4MUI3QywgMHg3MkU0LCAweDFCNzYsCisgICAgMHg3MkU2LCAweDFCN0IsIDB4NzJFOCwgMHgxQjc3LCAweDcyRTksIDB4MDc5NSwgMHg3MkVBLCAweDFCN0EsIDB4NzJFQiwKKyAgICAweDFCNzgsIDB4NzJGMywgMHgxRDM2LCAweDcyRjQsIDB4MUQzMywgMHg3MkY2LCAweDFEMzUsIDB4NzJGNywgMHgwOTI5LAorICAgIDB4NzJGOCwgMHgwOTI4LCAweDcyRjksIDB4MDkyNiwgMHg3MkZBLCAweDFEMzIsIDB4NzJGQiwgMHgxRDM3LCAweDcyRkMsCisgICAgMHgwOTI1LCAweDcyRkQsIDB4MDkyNywgMHg3MkZFLCAweDFEMzQsIDB4NzJGRiwgMHgxRjhCLCAweDczMDAsIDB4MUQzMSwKKyAgICAweDczMDEsIDB4MUQzOCwgMHg3MzA3LCAweDFGODYsIDB4NzMwOCwgMHgxRjhBLCAweDczMEEsIDB4MUY4OSwgMHg3MzBCLAorICAgIDB4MjIwNSwgMHg3MzBDLCAweDIyMTAsIDB4NzMwRiwgMHgxRjhDLCAweDczMTEsIDB4MUY4NywgMHg3MzEyLCAweDIyMDQsCisgICAgMHg3MzEzLCAweDBCMUQsIDB4NzMxNiwgMHgwQjFDLCAweDczMTcsIDB4MUY4NSwgMHg3MzE4LCAweDFGODgsIDB4NzMxOSwKKyAgICAweDBCMUUsIDB4NzMxQiwgMHgwQjFCLCAweDczMUMsIDB4MEIxQSwgMHg3MzFELCAweDFGODQsIDB4NzMxRSwgMHgxRjhELAorICAgIDB4NzMyMiwgMHgyMjA3LCAweDczMjMsIDB4MjIwRSwgMHg3MzI1LCAweDBDRDQsIDB4NzMyNiwgMHgyMjBELCAweDczMjcsCisgICAgMHgyMjBBLCAweDczMjksIDB4MENENiwgMHg3MzJELCAweDIyMEMsIDB4NzMzMCwgMHgyMjA2LCAweDczMzEsIDB4MjIwOCwKKyAgICAweDczMzIsIDB4MjIwQiwgMHg3MzMzLCAweDIyMDksIDB4NzMzNCwgMHgwQ0Q1LCAweDczMzUsIDB4MjIwRiwgMHg3MzM2LAorICAgIDB4MENEMywgMHg3MzM3LCAweDBFNzcsIDB4NzMzQSwgMHgyNDk2LCAweDczM0IsIDB4MjQ5NSwgMHg3MzNDLCAweDI0OTMsCisgICAgMHg3MzNFLCAweDBFN0EsIDB4NzMzRiwgMHgwRTc5LCAweDczNDAsIDB4MjQ5NywgMHg3MzQyLCAweDI0OTQsIDB4NzM0MywKKyAgICAweDI3MjcsIDB4NzM0NCwgMHgxMDJBLCAweDczNDUsIDB4MEU3OCwgMHg3MzQ5LCAweDI0OTksIDB4NzM0QSwgMHgyNDk4LAorICAgIDB4NzM0QywgMHgyNzJBLCAweDczNEQsIDB4MjcyOCwgMHg3MzRFLCAweDExQTQsIDB4NzM1MCwgMHgxMDJCLCAweDczNTEsCisgICAgMHgyNzI5LCAweDczNTIsIDB4Mjk2OSwgMHg3MzU3LCAweDExQTUsIDB4NzM1OCwgMHgyOTY4LCAweDczNTksIDB4Mjk3MSwKKyAgICAweDczNUEsIDB4Mjk3MCwgMHg3MzVCLCAweDI5NkUsIDB4NzM1RCwgMHgyOTZELCAweDczNUUsIDB4Mjk2QSwgMHg3MzVGLAorICAgIDB4Mjk2QiwgMHg3MzYwLCAweDI5NkMsIDB4NzM2MSwgMHgyOTZGLCAweDczNjIsIDB4Mjk3MiwgMHg3MzY1LCAweDJCQzgsCisgICAgMHg3MzY2LCAweDJCQzUsIDB4NzM2NywgMHgyQkM2LCAweDczNjgsIDB4MTJGOSwgMHg3MzY5LCAweDJCQzQsIDB4NzM2QSwKKyAgICAweDJCQ0EsIDB4NzM2QiwgMHgyQkM5LCAweDczNkMsIDB4MkJDNywgMHg3MzZFLCAweDJEQTMsIDB4NzM2RiwgMHgyREE0LAorICAgIDB4NzM3MCwgMHgxNDBFLCAweDczNzIsIDB4MTQwRiwgMHg3MzczLCAweDJEQTIsIDB4NzM3NSwgMHgxNEYzLCAweDczNzYsCisgICAgMHgyRjU1LCAweDczNzcsIDB4MTRGMiwgMHg3Mzc4LCAweDE1OTUsIDB4NzM3QSwgMHgxNTk2LCAweDczN0IsIDB4MTYyMCwKKyAgICAweDczN0MsIDB4MzFGOCwgMHg3MzdELCAweDMxRjcsIDB4NzM3RSwgMHgzMkUyLCAweDczN0YsIDB4MzM5MCwgMHg3MzgwLAorICAgIDB4MTZDQSwgMHg3MzgxLCAweDM0MjYsIDB4NzM4MiwgMHgzNDI1LCAweDczODMsIDB4MzQyNywgMHg3Mzg0LCAweDAzNTYsCisgICAgMHg3Mzg1LCAweDFCN0QsIDB4NzM4NiwgMHgwOTJBLCAweDczODcsIDB4MEIxRiwgMHg3Mzg4LCAweDFGOEUsIDB4NzM4OSwKKyAgICAweDAzNTcsIDB4NzM4QSwgMHgxN0IxLCAweDczOEIsIDB4MDJFRSwgMHg3MzhFLCAweDE4MEUsIDB4NzM5MiwgMHgxOEQxLAorICAgIDB4NzM5MywgMHgxOENGLCAweDczOTQsIDB4MThEMCwgMHg3Mzk1LCAweDE4Q0QsIDB4NzM5NiwgMHgwNEVGLCAweDczOTcsCisgICAgMHgxOENFLCAweDczOUQsIDB4MUEwQywgMHg3MzlGLCAweDA2NTIsIDB4NzNBMCwgMHgxQTBBLCAweDczQTEsIDB4MUEwNiwKKyAgICAweDczQTIsIDB4MUEwOSwgMHg3M0E0LCAweDFBMDUsIDB4NzNBNSwgMHgwNjU0LCAweDczQTYsIDB4MUEwOCwgMHg3M0E4LAorICAgIDB4MDY1MSwgMHg3M0E5LCAweDA2NTAsIDB4NzNBQiwgMHgwNjUzLCAweDczQUMsIDB4MUEwQiwgMHg3M0FELCAweDFBMDcsCisgICAgMHg3M0IyLCAweDA3OUIsIDB4NzNCMywgMHgwNzlFLCAweDczQjQsIDB4MUI4NSwgMHg3M0I1LCAweDFCODQsIDB4NzNCNiwKKyAgICAweDFCODMsIDB4NzNCNywgMHgwNzk4LCAweDczQjgsIDB4MUI4QywgMHg3M0I5LCAweDFCODIsIDB4NzNCQiwgMHgwNzlBLAorICAgIDB4NzNCQywgMHgxRDNELCAweDczQkUsIDB4MUI4OSwgMHg3M0JGLCAweDFCODcsIDB4NzNDMCwgMHgwNzlELCAweDczQzIsCisgICAgMHgxQjdGLCAweDczQzMsIDB4MUI4QSwgMHg3M0M1LCAweDFCODEsIDB4NzNDNiwgMHgxQjhCLCAweDczQzcsIDB4MUI4OCwKKyAgICAweDczQzgsIDB4MUI4MCwgMHg3M0NBLCAweDA3OTksIDB4NzNDQiwgMHgxQjhELCAweDczQ0MsIDB4MUI3RSwgMHg3M0NELAorICAgIDB4MDc5QywgMHg3M0QyLCAweDFENDIsIDB4NzNEMywgMHgxRDM5LCAweDczRDQsIDB4MUQ0NCwgMHg3M0Q2LCAweDFEM0MsCisgICAgMHg3M0Q3LCAweDFENDcsIDB4NzNEOCwgMHgxRDQ4LCAweDczRDksIDB4MUQzQSwgMHg3M0RBLCAweDFENDYsIDB4NzNEQiwKKyAgICAweDFENDMsIDB4NzNEQywgMHgxRDQxLCAweDczREQsIDB4MUQ0NSwgMHg3M0RFLCAweDA5MzAsIDB4NzNFMCwgMHgwOTJFLAorICAgIDB4NzNFMywgMHgxRDNGLCAweDczRTUsIDB4MUQzQiwgMHg3M0U3LCAweDFEM0UsIDB4NzNFOCwgMHgxRDQ5LCAweDczRTksCisgICAgMHgxRDQwLCAweDczRUEsIDB4MDkyRiwgMHg3M0VCLCAweDFCODYsIDB4NzNFRCwgMHgwOTJCLCAweDczRUUsIDB4MDkyRCwKKyAgICAweDczRjQsIDB4MUY5QywgMHg3M0Y1LCAweDFGOTEsIDB4NzNGNiwgMHgxRjhGLCAweDczRjgsIDB4MUY5MCwgMHg3M0ZBLAorICAgIDB4MUY5NywgMHg3M0ZDLCAweDFGOTgsIDB4NzNGRCwgMHgxRjk0LCAweDczRkUsIDB4MEIyNCwgMHg3M0ZGLCAweDFGOTksCisgICAgMHg3NDAwLCAweDFGOTYsIDB4NzQwMSwgMHgxRjkzLCAweDc0MDMsIDB4MEIyMiwgMHg3NDA0LCAweDFGOTIsIDB4NzQwNSwKKyAgICAweDBCMjAsIDB4NzQwNiwgMHgwQjIzLCAweDc0MDcsIDB4MUY5NSwgMHg3NDA4LCAweDFGOUQsIDB4NzQwOSwgMHgwOTJDLAorICAgIDB4NzQwQSwgMHgwQjIxLCAweDc0MEIsIDB4MUY5QiwgMHg3NDBDLCAweDFGOUEsIDB4NzQwRCwgMHgwQjI1LCAweDc0MTYsCisgICAgMHgyMjE1LCAweDc0MUEsIDB4MjIxNiwgMHg3NDFCLCAweDBDRTAsIDB4NzQxRCwgMHgyMjFDLCAweDc0MjAsIDB4MjIxRSwKKyAgICAweDc0MjEsIDB4MjIxNywgMHg3NDIyLCAweDBDREEsIDB4NzQyMywgMHgyMjFCLCAweDc0MjQsIDB4MjIxQSwgMHg3NDI1LAorICAgIDB4MENEQiwgMHg3NDI2LCAweDBDRTEsIDB4NzQyOCwgMHgwQ0UyLCAweDc0MjksIDB4MjIxRCwgMHg3NDJBLCAweDBDRDgsCisgICAgMHg3NDJCLCAweDIyMTQsIDB4NzQyQywgMHgyMjEyLCAweDc0MkQsIDB4MjIxOCwgMHg3NDJFLCAweDIyMTEsIDB4NzQyRiwKKyAgICAweDBDREYsIDB4NzQzMCwgMHgyMjEzLCAweDc0MzEsIDB4MjIxOSwgMHg3NDMyLCAweDIyMUYsIDB4NzQzMywgMHgwQ0Q5LAorICAgIDB4NzQzNCwgMHgwQ0RFLCAweDc0MzUsIDB4MENEQywgMHg3NDM2LCAweDBDREQsIDB4NzQzQSwgMHgwQ0Q3LCAweDc0M0YsCisgICAgMHgwRTgxLCAweDc0NDAsIDB4MjRBMCwgMHg3NDQxLCAweDBFODAsIDB4NzQ0MiwgMHgyNEE0LCAweDc0NDQsIDB4MjQ5QSwKKyAgICAweDc0NDYsIDB4MjRBNSwgMHg3NDRBLCAweDI0OUIsIDB4NzQ0QiwgMHgyNDlDLCAweDc0NEQsIDB4MjRBNiwgMHg3NDRFLAorICAgIDB4MjRBMywgMHg3NDRGLCAweDI0QTEsIDB4NzQ1MCwgMHgyNEEyLCAweDc0NTEsIDB4MjQ5RSwgMHg3NDUyLCAweDI0OUQsCisgICAgMHg3NDU0LCAweDI0QTcsIDB4NzQ1NSwgMHgwRTdELCAweDc0NTcsIDB4MjQ5RiwgMHg3NDU5LCAweDBFODIsIDB4NzQ1QSwKKyAgICAweDBFN0MsIDB4NzQ1QiwgMHgwRTgzLCAweDc0NUMsIDB4MEU4NCwgMHg3NDVFLCAweDBFN0YsIDB4NzQ1RiwgMHgwRTdFLAorICAgIDB4NzQ2MiwgMHgyNzJCLCAweDc0NjMsIDB4MTAyRCwgMHg3NDY0LCAweDEwMkMsIDB4NzQ2NywgMHgyNzMwLCAweDc0NjksCisgICAgMHgxMUE2LCAweDc0NkEsIDB4MTAyRSwgMHg3NDZELCAweDEwMzAsIDB4NzQ2RSwgMHgyNzMxLCAweDc0NkYsIDB4MEU3QiwKKyAgICAweDc0NzAsIDB4MTAyRiwgMHg3NDcxLCAweDI3MkQsIDB4NzQ3MiwgMHgyNzJGLCAweDc0NzMsIDB4MjcyQywgMHg3NDc1LAorICAgIDB4MjcyRSwgMHg3NDc5LCAweDI5N0MsIDB4NzQ3QywgMHgyOTdCLCAweDc0N0QsIDB4Mjk3OCwgMHg3NDdFLCAweDExQTksCisgICAgMHg3NDdGLCAweDJCQ0IsIDB4NzQ4MCwgMHgxMUFBLCAweDc0ODEsIDB4Mjk3NywgMHg3NDgzLCAweDExQTgsIDB4NzQ4NSwKKyAgICAweDI5NzksIDB4NzQ4NiwgMHgyOTc2LCAweDc0ODcsIDB4Mjk3MywgMHg3NDg4LCAweDI5N0EsIDB4NzQ4OSwgMHgyOTc0LAorICAgIDB4NzQ4QSwgMHgyOTc1LCAweDc0OEIsIDB4MTFBNywgMHg3NDkwLCAweDJEQTgsIDB4NzQ5MiwgMHgyQkNGLCAweDc0OTQsCisgICAgMHgyQkNFLCAweDc0OTUsIDB4MkJEMCwgMHg3NDk3LCAweDJEQTUsIDB4NzQ5OCwgMHgxMkZDLCAweDc0OUEsIDB4MkJDQywKKyAgICAweDc0OUMsIDB4MTJGQSwgMHg3NDlFLCAweDEyRkUsIDB4NzQ5RiwgMHgxMkZELCAweDc0QTAsIDB4MkJDRCwgMHg3NEExLAorICAgIDB4MkJEMSwgMHg3NEEzLCAweDEyRkIsIDB4NzRBNSwgMHgyREFDLCAweDc0QTYsIDB4MTQxMiwgMHg3NEE3LCAweDE0RjQsCisgICAgMHg3NEE4LCAweDE0MTMsIDB4NzRBOSwgMHgxNDEwLCAweDc0QUEsIDB4MkRBOSwgMHg3NEFCLCAweDJEQTcsIDB4NzRBRCwKKyAgICAweDJEQUEsIDB4NzRBRiwgMHgyREFELCAweDc0QjAsIDB4MTQxMSwgMHg3NEIxLCAweDJEQUIsIDB4NzRCMiwgMHgyREE2LAorICAgIDB4NzRCNSwgMHgyRjU4LCAweDc0QjYsIDB4MkY1QiwgMHg3NEI3LCAweDMwQzIsIDB4NzRCOCwgMHgyRjU2LCAweDc0QkEsCisgICAgMHgzMUY5LCAweDc0QkIsIDB4MkY1QywgMHg3NEJELCAweDE1OTcsIDB4NzRCRSwgMHgyRjVBLCAweDc0QkYsIDB4MTRGNSwKKyAgICAweDc0QzAsIDB4MkY1NywgMHg3NEMxLCAweDJGNTksIDB4NzRDMiwgMHgyRjVELCAweDc0QzMsIDB4MzBDMywgMHg3NEM1LAorICAgIDB4MzBDMSwgMHg3NENBLCAweDE1OTgsIDB4NzRDQiwgMHgzMEMwLCAweDc0Q0YsIDB4MTYyMSwgMHg3NEQ0LCAweDE2N0UsCisgICAgMHg3NEQ1LCAweDMzOTIsIDB4NzRENiwgMHgxNjdELCAweDc0RDcsIDB4MzM5NCwgMHg3NEQ4LCAweDMzOTEsIDB4NzREOSwKKyAgICAweDMzOTMsIDB4NzREQSwgMHgxNkZFLCAweDc0REIsIDB4MzQ4RCwgMHg3NERDLCAweDAzNTgsIDB4NzRERCwgMHgxQTBELAorICAgIDB4NzRERSwgMHgxRDRBLCAweDc0REYsIDB4MUQ0QiwgMHg3NEUwLCAweDBCMjYsIDB4NzRFMSwgMHgyNEE4LCAweDc0RTIsCisgICAgMHgxMkZGLCAweDc0RTMsIDB4MTU5OSwgMHg3NEU0LCAweDE2Q0IsIDB4NzRFNSwgMHgzNDhFLCAweDc0RTYsIDB4MDM1OSwKKyAgICAweDc0RTgsIDB4MUEwRSwgMHg3NEU5LCAweDAxMjAsIDB4NzRFQywgMHgxQjhFLCAweDc0RUUsIDB4MUI4RiwgMHg3NEY0LAorICAgIDB4MUQ0QywgMHg3NEY1LCAweDFENEQsIDB4NzRGNiwgMHgwQjI3LCAweDc0RjcsIDB4MEIyOCwgMHg3NEZCLCAweDIyMjAsCisgICAgMHg3NEZELCAweDI0QUIsIDB4NzRGRSwgMHgyNEFBLCAweDc0RkYsIDB4MjRBOSwgMHg3NTAwLCAweDI3MzIsIDB4NzUwMiwKKyAgICAweDI3MzMsIDB4NzUwMywgMHgyNzM0LCAweDc1MDQsIDB4MTAzMSwgMHg3NTA3LCAweDI5N0UsIDB4NzUwOCwgMHgyOTdELAorICAgIDB4NzUwQiwgMHgyQkQyLCAweDc1MEMsIDB4MTMwMCwgMHg3NTBELCAweDEzMDEsIDB4NzUwRiwgMHgyREIxLCAweDc1MTAsCisgICAgMHgyREFFLCAweDc1MTEsIDB4MkRBRiwgMHg3NTEyLCAweDJEQjAsIDB4NzUxMywgMHgyRjVGLCAweDc1MTQsIDB4MkY1RSwKKyAgICAweDc1MTUsIDB4MTRGNiwgMHg3NTE2LCAweDMwQzQsIDB4NzUxNywgMHgzMkUzLCAweDc1MTgsIDB4MDM1QSwgMHg3NTFBLAorICAgIDB4MDc5RiwgMHg3NTFDLCAweDBCMjksIDB4NzUxRCwgMHgyNEFDLCAweDc1MUYsIDB4MDM1QiwgMHg3NTIxLCAweDFENEUsCisgICAgMHg3NTIyLCAweDBCMkEsIDB4NzUyNSwgMHgwQ0UzLCAweDc1MjYsIDB4MENFNCwgMHg3NTI4LCAweDAzNUMsIDB4NzUyOSwKKyAgICAweDAzNUQsIDB4NzUyQSwgMHgxODBGLCAweDc1MkIsIDB4MDRGMSwgMHg3NTJDLCAweDA0RjAsIDB4NzUyRCwgMHgwN0EwLAorICAgIDB4NzUyRSwgMHgxQjkwLCAweDc1MkYsIDB4MjIyMSwgMHg3NTMwLCAweDAzNUUsIDB4NzUzMSwgMHgwMzVGLCAweDc1MzIsCisgICAgMHgwMzYwLCAweDc1MzMsIDB4MDM2MSwgMHg3NTM3LCAweDA0RjIsIDB4NzUzOCwgMHgwNEYzLCAweDc1MzksIDB4MThEMywKKyAgICAweDc1M0EsIDB4MThEMiwgMHg3NTNELCAweDA2NTUsIDB4NzUzRSwgMHgxQTExLCAweDc1M0YsIDB4MUEwRiwgMHg3NTQwLAorICAgIDB4MUExMCwgMHg3NTQ3LCAweDFCOTEsIDB4NzU0OCwgMHgxQjkyLCAweDc1NEIsIDB4MDdBNCwgMHg3NTRDLCAweDA3QTIsCisgICAgMHg3NTRFLCAweDA3QTMsIDB4NzU0RiwgMHgwN0ExLCAweDc1NTQsIDB4MDkzMSwgMHg3NTU5LCAweDA5MzUsIDB4NzU1QSwKKyAgICAweDA5MzQsIDB4NzU1QiwgMHgxRDRGLCAweDc1NUMsIDB4MDkzMywgMHg3NTVELCAweDA5MzIsIDB4NzU1RiwgMHgxRDUwLAorICAgIDB4NzU2MiwgMHgwQjJELCAweDc1NjMsIDB4MUY5RiwgMHg3NTY0LCAweDFGOUUsIDB4NzU2NSwgMHgwQjJCLCAweDc1NjYsCisgICAgMHgwQjJDLCAweDc1NkEsIDB4MENFNiwgMHg3NTZCLCAweDBDRTUsIDB4NzU2QywgMHgyMjIzLCAweDc1NkYsIDB4MjIyMiwKKyAgICAweDc1NzAsIDB4MEIyRSwgMHg3NTc2LCAweDBFODUsIDB4NzU3NywgMHgyNEFFLCAweDc1NzgsIDB4MEU4NiwgMHg3NTc5LAorICAgIDB4MjRBRCwgMHg3NTdELCAweDI3MzUsIDB4NzU3RSwgMHgyOTdGLCAweDc1N0YsIDB4MTFBQiwgMHg3NTgwLCAweDJCRDMsCisgICAgMHg3NTg0LCAweDJEQjIsIDB4NzU4NiwgMHgxNTlCLCAweDc1ODcsIDB4MTU5QSwgMHg3NThBLCAweDE2Q0MsIDB4NzU4QiwKKyAgICAweDAzNjIsIDB4NzU4QywgMHgxQTEyLCAweDc1OEYsIDB4MEIyRiwgMHg3NTkwLCAweDI3MzYsIDB4NzU5MSwgMHgxMDMyLAorICAgIDB4NzU5MiwgMHgwMjJFLCAweDc1OTQsIDB4MThENCwgMHg3NTk1LCAweDE4RDUsIDB4NzU5OCwgMHgxQTEzLCAweDc1OTksCisgICAgMHgwNjU3LCAweDc1OUEsIDB4MDY1OCwgMHg3NTlELCAweDA2NTYsIDB4NzVBMiwgMHgwN0E4LCAweDc1QTMsIDB4MDdBOSwKKyAgICAweDc1QTQsIDB4MDdBNiwgMHg3NUE1LCAweDA3QTcsIDB4NzVBNywgMHgxQjkzLCAweDc1QUEsIDB4MUI5NCwgMHg3NUFCLAorICAgIDB4MDdBNSwgMHg3NUIwLCAweDFENTEsIDB4NzVCMiwgMHgwOTM5LCAweDc1QjMsIDB4MDkzQSwgMHg3NUI1LCAweDBCMzIsCisgICAgMHg3NUI2LCAweDFENTcsIDB4NzVCOCwgMHgwOTNGLCAweDc1QjksIDB4MDkzRCwgMHg3NUJBLCAweDFENTgsIDB4NzVCQiwKKyAgICAweDFENTMsIDB4NzVCQywgMHgwOTNDLCAweDc1QkQsIDB4MDkzQiwgMHg3NUJFLCAweDA5MzYsIDB4NzVCRiwgMHgxRDU2LAorICAgIDB4NzVDMCwgMHgxRDU1LCAweDc1QzEsIDB4MUQ1MiwgMHg3NUMyLCAweDA5M0UsIDB4NzVDNCwgMHgxRDU0LCAweDc1QzUsCisgICAgMHgwOTM3LCAweDc1QzcsIDB4MDkzOCwgMHg3NUNBLCAweDBCMzMsIDB4NzVDQiwgMHgxRkEzLCAweDc1Q0MsIDB4MUZBNCwKKyAgICAweDc1Q0QsIDB4MEIzNCwgMHg3NUNFLCAweDFGQTAsIDB4NzVDRiwgMHgxRkEyLCAweDc1RDAsIDB4MUZBNiwgMHg3NUQxLAorICAgIDB4MUZBNSwgMHg3NUQyLCAweDFGQTEsIDB4NzVENCwgMHgwQjMwLCAweDc1RDUsIDB4MEIzMSwgMHg3NUQ3LCAweDIyMkIsCisgICAgMHg3NUQ4LCAweDBDRUIsIDB4NzVEOSwgMHgwQ0VBLCAweDc1REEsIDB4MjIyNSwgMHg3NURCLCAweDBDRTgsIDB4NzVERCwKKyAgICAweDIyMjgsIDB4NzVERSwgMHgwQ0VDLCAweDc1REYsIDB4MjIyOSwgMHg3NUUwLCAweDBDRUQsIDB4NzVFMSwgMHgyMjI2LAorICAgIDB4NzVFMiwgMHgwQ0U3LCAweDc1RTMsIDB4MENFOSwgMHg3NUU0LCAweDIyMkEsIDB4NzVFNiwgMHgyMjI3LCAweDc1RTcsCisgICAgMHgyMjI0LCAweDc1RUQsIDB4MjRCQiwgMHg3NUVGLCAweDI0QjAsIDB4NzVGMCwgMHgwRTg4LCAweDc1RjEsIDB4MEU4QiwKKyAgICAweDc1RjIsIDB4MEU4QSwgMHg3NUYzLCAweDBFOEYsIDB4NzVGNCwgMHgwRThFLCAweDc1RjUsIDB4MjRCQywgMHg3NUY2LAorICAgIDB4MjRCQSwgMHg3NUY3LCAweDI0QjMsIDB4NzVGOCwgMHgyNEI3LCAweDc1RjksIDB4MjRCNiwgMHg3NUZBLCAweDBFOEMsCisgICAgMHg3NUZCLCAweDI0QjksIDB4NzVGQywgMHgyNEI1LCAweDc1RkQsIDB4MjRCRCwgMHg3NUZFLCAweDI0QjQsIDB4NzVGRiwKKyAgICAweDBFOEQsIDB4NzYwMCwgMHgwRTg3LCAweDc2MDEsIDB4MEU4OSwgMHg3NjAzLCAweDI0QjIsIDB4NzYwOCwgMHgyNzM4LAorICAgIDB4NzYwOSwgMHgxMDM2LCAweDc2MEEsIDB4MjczQywgMHg3NjBCLCAweDEwMzUsIDB4NzYwQywgMHgyNzM5LCAweDc2MEQsCisgICAgMHgxMDM0LCAweDc2MEYsIDB4MjRCMSwgMHg3NjEwLCAweDI0QjgsIDB4NzYxMSwgMHgyNzNCLCAweDc2MTMsIDB4MTAzNywKKyAgICAweDc2MTQsIDB4MjczRCwgMHg3NjE1LCAweDI3M0EsIDB4NzYxNiwgMHgyNzM3LCAweDc2MTksIDB4Mjk4MiwgMHg3NjFBLAorICAgIDB4Mjk4NiwgMHg3NjFCLCAweDI5ODgsIDB4NzYxQywgMHgyOTg0LCAweDc2MUQsIDB4Mjk4MywgMHg3NjFFLCAweDI5ODEsCisgICAgMHg3NjFGLCAweDExQUUsIDB4NzYyMCwgMHgxMUFDLCAweDc2MjEsIDB4MTFCMSwgMHg3NjIyLCAweDExQjIsIDB4NzYyMywKKyAgICAweDI5ODUsIDB4NzYyNCwgMHgxMUFGLCAweDc2MjUsIDB4Mjk4MCwgMHg3NjI2LCAweDExQjAsIDB4NzYyNywgMHgxMDMzLAorICAgIDB4NzYyOCwgMHgyOTg3LCAweDc2MjksIDB4MTFBRCwgMHg3NjJELCAweDJCRDUsIDB4NzYyRiwgMHgyQkQ0LCAweDc2MzAsCisgICAgMHgyQkRDLCAweDc2MzEsIDB4MkJENiwgMHg3NjMyLCAweDJCREIsIDB4NzYzMywgMHgyQkQ4LCAweDc2MzQsIDB4MTMwMiwKKyAgICAweDc2MzUsIDB4MkJEQSwgMHg3NjM4LCAweDEzMDMsIDB4NzYzQSwgMHgxMzA0LCAweDc2M0MsIDB4MkJEOSwgMHg3NjNELAorICAgIDB4MkJENywgMHg3NjQyLCAweDE0MTUsIDB4NzY0MywgMHgyREIzLCAweDc2NDYsIDB4MTQxNCwgMHg3NjQ3LCAweDJEQjYsCisgICAgMHg3NjQ4LCAweDJEQjQsIDB4NzY0OSwgMHgyREI1LCAweDc2NEMsIDB4MTQxNiwgMHg3NjUwLCAweDJGNjMsIDB4NzY1MiwKKyAgICAweDE0RjksIDB4NzY1MywgMHgyRjY0LCAweDc2NTYsIDB4MTRGNywgMHg3NjU3LCAweDJGNjUsIDB4NzY1OCwgMHgxNEY4LAorICAgIDB4NzY1OSwgMHgyRjYyLCAweDc2NUEsIDB4MkY2NiwgMHg3NjVDLCAweDJGNjAsIDB4NzY1RiwgMHgxNTlDLCAweDc2NjAsCisgICAgMHgzMEM1LCAweDc2NjEsIDB4MTU5RCwgMHg3NjYyLCAweDE2MjIsIDB4NzY2NCwgMHgyRjYxLCAweDc2NjUsIDB4MTYyMywKKyAgICAweDc2NjksIDB4MTY3RiwgMHg3NjZBLCAweDMyRTQsIDB4NzY2QywgMHgxNkNFLCAweDc2NkQsIDB4MzM5NSwgMHg3NjZFLAorICAgIDB4MTZDRCwgMHg3NjcwLCAweDM0MjgsIDB4NzY3MSwgMHgxNzIzLCAweDc2NzIsIDB4MTcyNCwgMHg3Njc1LCAweDM1NDMsCisgICAgMHg3Njc2LCAweDAyMkYsIDB4NzY3OCwgMHgwN0FBLCAweDc2NzksIDB4MUI5NSwgMHg3NjdCLCAweDBDRUUsIDB4NzY3QywKKyAgICAweDBDRUYsIDB4NzY3RCwgMHgwMzYzLCAweDc2N0UsIDB4MDNGNSwgMHg3NjdGLCAweDE4MTAsIDB4NzY4MSwgMHgxOEQ2LAorICAgIDB4NzY4MiwgMHgwNEY0LCAweDc2ODQsIDB4MDY1OSwgMHg3Njg2LCAweDA3QUIsIDB4NzY4NywgMHgwN0FDLCAweDc2ODgsCisgICAgMHgwN0FELCAweDc2ODksIDB4MUZBOCwgMHg3NjhBLCAweDFENTksIDB4NzY4QiwgMHgwOTQwLCAweDc2OEUsIDB4MEIzNSwKKyAgICAweDc2OEYsIDB4MUZBNywgMHg3NjkyLCAweDIyMkQsIDB4NzY5MywgMHgwQ0YxLCAweDc2OTUsIDB4MjIyQywgMHg3Njk2LAorICAgIDB4MENGMCwgMHg3Njk5LCAweDI0QkUsIDB4NzY5QSwgMHgxMUIzLCAweDc2OUIsIDB4Mjk4QywgMHg3NjlDLCAweDI5ODksCisgICAgMHg3NjlELCAweDI5OEEsIDB4NzY5RSwgMHgyOThCLCAweDc2QTQsIDB4MkRCNywgMHg3NkE2LCAweDJGNjcsIDB4NzZBQSwKKyAgICAweDMxRkIsIDB4NzZBQiwgMHgzMUZBLCAweDc2QUQsIDB4MzM5NiwgMHg3NkFFLCAweDAzNjQsIDB4NzZBRiwgMHgxQTE0LAorICAgIDB4NzZCMCwgMHgwOTQxLCAweDc2QjQsIDB4MENGMiwgMHg3NkI1LCAweDI0QkYsIDB4NzZCOCwgMHgyNzNFLCAweDc2QkEsCisgICAgMHgxMUI0LCAweDc2QkIsIDB4MkJERCwgMHg3NkJELCAweDJGNjgsIDB4NzZCRSwgMHgzMUZDLCAweDc2QkYsIDB4MDM2NSwKKyAgICAweDc2QzIsIDB4MDY1QSwgMHg3NkMzLCAweDA3QjAsIDB4NzZDNCwgMHgxQjk2LCAweDc2QzUsIDB4MDdCMSwgMHg3NkM2LAorICAgIDB4MDdBRiwgMHg3NkM4LCAweDA3QUUsIDB4NzZDOSwgMHgxRDVBLCAweDc2Q0EsIDB4MDk0MiwgMHg3NkNELCAweDA5NDMsCisgICAgMHg3NkNFLCAweDA5NDQsIDB4NzZEMiwgMHgwQjM3LCAweDc2RDMsIDB4MUZBOSwgMHg3NkQ0LCAweDBCMzYsIDB4NzZEQSwKKyAgICAweDIyMkUsIDB4NzZEQiwgMHgwQjM4LCAweDc2REMsIDB4MENGMywgMHg3NkRELCAweDI0QzAsIDB4NzZERSwgMHgwRTkwLAorICAgIDB4NzZERiwgMHgwRTkxLCAweDc2RTEsIDB4MTAzOCwgMHg3NkUzLCAweDEwMzksIDB4NzZFNCwgMHgxMUI1LCAweDc2RTUsCisgICAgMHgxMzA2LCAweDc2RTYsIDB4MkJERSwgMHg3NkU3LCAweDEzMDUsIDB4NzZFOSwgMHgyREI4LCAweDc2RUEsIDB4MTQxNywKKyAgICAweDc2RUMsIDB4MkY2OSwgMHg3NkVELCAweDMxRkQsIDB4NzZFRSwgMHgwMzY2LCAweDc2RUYsIDB4MDRGNSwgMHg3NkYwLAorICAgIDB4MUExNywgMHg3NkYxLCAweDFBMTYsIDB4NzZGMiwgMHgwNjVCLCAweDc2RjMsIDB4MUExNSwgMHg3NkY0LCAweDA2NUMsCisgICAgMHg3NkY1LCAweDFBMTgsIDB4NzZGNywgMHgxQjlDLCAweDc2RjgsIDB4MDdCNCwgMHg3NkY5LCAweDA3QjMsIDB4NzZGQSwKKyAgICAweDFCOUUsIDB4NzZGQiwgMHgxQjlELCAweDc2RkMsIDB4MDdCOCwgMHg3NkZFLCAweDA3QjcsIDB4NzcwMSwgMHgwN0IyLAorICAgIDB4NzcwMywgMHgxQjk4LCAweDc3MDQsIDB4MUI5OSwgMHg3NzA1LCAweDFCOUEsIDB4NzcwNywgMHgwN0I5LCAweDc3MDgsCisgICAgMHgxQjk3LCAweDc3MDksIDB4MDdCNSwgMHg3NzBBLCAweDFCOUIsIDB4NzcwQiwgMHgwN0I2LCAweDc3MTAsIDB4MUQ1RCwKKyAgICAweDc3MTEsIDB4MUQ2MSwgMHg3NzEyLCAweDFENUYsIDB4NzcxMywgMHgxRDVFLCAweDc3MTUsIDB4MUQ2MiwgMHg3NzE5LAorICAgIDB4MUQ2MywgMHg3NzFBLCAweDFENjQsIDB4NzcxQiwgMHgxRDVDLCAweDc3MUQsIDB4MUQ1QiwgMHg3NzFGLCAweDA5NDYsCisgICAgMHg3NzIwLCAweDA5NDcsIDB4NzcyMiwgMHgxRDY1LCAweDc3MjMsIDB4MUQ2MCwgMHg3NzI1LCAweDFGQjIsIDB4NzcyNywKKyAgICAweDFENjYsIDB4NzcyOCwgMHgwOTQ4LCAweDc3MjksIDB4MDk0NSwgMHg3NzJELCAweDFGQUMsIDB4NzcyRiwgMHgxRkFCLAorICAgIDB4NzczMSwgMHgxRkFELCAweDc3MzIsIDB4MUZBRSwgMHg3NzMzLCAweDFGQjAsIDB4NzczNCwgMHgxRkFGLCAweDc3MzUsCisgICAgMHgxRkI0LCAweDc3MzYsIDB4MEIzQywgMHg3NzM3LCAweDBCMzksIDB4NzczOCwgMHgwQjNELCAweDc3MzksIDB4MUZBQSwKKyAgICAweDc3M0EsIDB4MEIzRSwgMHg3NzNCLCAweDFGQjMsIDB4NzczQywgMHgwQjNCLCAweDc3M0QsIDB4MUZCMSwgMHg3NzNFLAorICAgIDB4MEIzQSwgMHg3NzQ0LCAweDIyMzEsIDB4Nzc0NSwgMHgyMjMzLCAweDc3NDYsIDB4MjIyRiwgMHg3NzQ3LCAweDIyMzAsCisgICAgMHg3NzRBLCAweDIyMzQsIDB4Nzc0QiwgMHgyMjM2LCAweDc3NEMsIDB4MjIzNywgMHg3NzRELCAweDIyMzIsIDB4Nzc0RSwKKyAgICAweDIyMzUsIDB4Nzc0RiwgMHgwQ0Y0LCAweDc3NTIsIDB4MjRDNCwgMHg3NzU0LCAweDI0QzksIDB4Nzc1NSwgMHgyNEMxLAorICAgIDB4Nzc1NiwgMHgyNEM1LCAweDc3NTksIDB4MjRDQSwgMHg3NzVBLCAweDI0QzYsIDB4Nzc1QiwgMHgwRTkyLCAweDc3NUMsCisgICAgMHgwRTlBLCAweDc3NUUsIDB4MEU5NSwgMHg3NzVGLCAweDI0QzIsIDB4Nzc2MCwgMHgyNEMzLCAweDc3NjEsIDB4MTAzRCwKKyAgICAweDc3NjIsIDB4MEU5RCwgMHg3NzYzLCAweDBFOTYsIDB4Nzc2NSwgMHgwRTlCLCAweDc3NjYsIDB4MEU5NCwgMHg3NzY3LAorICAgIDB4MjRDOCwgMHg3NzY4LCAweDBFOUMsIDB4Nzc2OSwgMHgyNEM3LCAweDc3NkEsIDB4MEU5OCwgMHg3NzZCLCAweDBFOTMsCisgICAgMHg3NzZDLCAweDBFOTksIDB4Nzc2RCwgMHgyNENCLCAweDc3NkUsIDB4Mjc0MywgMHg3NzZGLCAweDI3NDUsIDB4Nzc3OSwKKyAgICAweDBFOTcsIDB4Nzc3QywgMHgyNzQwLCAweDc3N0QsIDB4MTAzQiwgMHg3NzdFLCAweDI3NDYsIDB4Nzc3RiwgMHgxMDNDLAorICAgIDB4Nzc4MCwgMHgyNzQ0LCAweDc3ODEsIDB4MjczRiwgMHg3NzgyLCAweDI3NDIsIDB4Nzc4MywgMHgyNzQ3LCAweDc3ODQsCisgICAgMHgxMDNBLCAweDc3ODUsIDB4Mjc0MSwgMHg3Nzg3LCAweDExQjcsIDB4Nzc4OCwgMHgyOTkwLCAweDc3ODksIDB4Mjk4RiwKKyAgICAweDc3OEIsIDB4MTFCQSwgMHg3NzhDLCAweDExQjgsIDB4Nzc4RCwgMHgyOThELCAweDc3OEUsIDB4MTFCNiwgMHg3NzhGLAorICAgIDB4Mjk4RSwgMHg3NzkxLCAweDExQjksIDB4Nzc5NSwgMHgyQkU2LCAweDc3OTcsIDB4MkJFOCwgMHg3Nzk5LCAweDJCRTcsCisgICAgMHg3NzlBLCAweDJCREYsIDB4Nzc5QiwgMHgyQkUzLCAweDc3OUMsIDB4MkJFMiwgMHg3NzlELCAweDJCRTAsIDB4Nzc5RSwKKyAgICAweDEzMDgsIDB4Nzc5RiwgMHgxMzA5LCAweDc3QTAsIDB4MTMwNywgMHg3N0ExLCAweDJCRTEsIDB4NzdBMiwgMHgyQkU0LAorICAgIDB4NzdBMywgMHgyQkU1LCAweDc3QTUsIDB4MTMwQSwgMHg3N0E3LCAweDE0MUMsIDB4NzdBOCwgMHgyREMwLCAweDc3QUEsCisgICAgMHgxNDE5LCAweDc3QUIsIDB4MkRCQSwgMHg3N0FDLCAweDE0MUIsIDB4NzdBRCwgMHgxNDFELCAweDc3QjAsIDB4MTQxQSwKKyAgICAweDc3QjEsIDB4MkRCRiwgMHg3N0IyLCAweDJEQkIsIDB4NzdCMywgMHgxNDE4LCAweDc3QjQsIDB4MkRCRSwgMHg3N0I1LAorICAgIDB4MkRCOSwgMHg3N0I2LCAweDJEQkQsIDB4NzdCNywgMHgyREJDLCAweDc3QkEsIDB4MkY2QiwgMHg3N0JCLCAweDE0RkMsCisgICAgMHg3N0JDLCAweDE0RkQsIDB4NzdCRCwgMHgxNEZBLCAweDc3QkYsIDB4MTRGQiwgMHg3N0MyLCAweDJGNkEsIDB4NzdDNCwKKyAgICAweDMwQzgsIDB4NzdDNywgMHgxNTlFLCAweDc3QzksIDB4MzBDNiwgMHg3N0NBLCAweDMwQzcsIDB4NzdDQywgMHgzMUZFLAorICAgIDB4NzdDRCwgMHgzMjAxLCAweDc3Q0UsIDB4MzFGRiwgMHg3N0NGLCAweDMyMDAsIDB4NzdEMCwgMHgzMkU1LCAweDc3RDMsCisgICAgMHgxNjgwLCAweDc3RDQsIDB4MzQyOSwgMHg3N0Q1LCAweDM0OEYsIDB4NzdENywgMHgxNzI1LCAweDc3RDgsIDB4MzREMywKKyAgICAweDc3RDksIDB4MzRENCwgMHg3N0RBLCAweDE3NTMsIDB4NzdEQiwgMHgwMzY3LCAweDc3REMsIDB4MDdCQSwgMHg3N0RFLAorICAgIDB4MjIzOCwgMHg3N0UwLCAweDI0Q0MsIDB4NzdFMiwgMHgwMzY4LCAweDc3RTMsIDB4MDRGNiwgMHg3N0U1LCAweDA2NUQsCisgICAgMHg3N0U3LCAweDFCOUYsIDB4NzdFOCwgMHgxQkEwLCAweDc3RTksIDB4MDk0OSwgMHg3N0VDLCAweDIyMzksIDB4NzdFRCwKKyAgICAweDBDRjUsIDB4NzdFRSwgMHgwRTlFLCAweDc3RUYsIDB4MTQxRSwgMHg3N0YwLCAweDJEQzEsIDB4NzdGMSwgMHgzMEM5LAorICAgIDB4NzdGMiwgMHgzMjAyLCAweDc3RjMsIDB4MDM2OSwgMHg3N0Y3LCAweDFBMUUsIDB4NzdGOCwgMHgxQTE5LCAweDc3RjksCisgICAgMHgxQTFCLCAweDc3RkEsIDB4MUExRCwgMHg3N0ZCLCAweDFBMUMsIDB4NzdGQywgMHgxQTFBLCAweDc3RkQsIDB4MDY1RSwKKyAgICAweDc4MDIsIDB4MDdCQiwgMHg3ODAzLCAweDFCQTksIDB4NzgwNSwgMHgxQkE0LCAweDc4MDYsIDB4MUJBMSwgMHg3ODA5LAorICAgIDB4MUJBOCwgMHg3ODBDLCAweDA3QkQsIDB4NzgwRCwgMHgwN0JFLCAweDc4MEUsIDB4MUJBNywgMHg3ODBGLCAweDFCQTYsCisgICAgMHg3ODEwLCAweDFCQTUsIDB4NzgxMSwgMHgxQkEyLCAweDc4MTIsIDB4MUJBMywgMHg3ODEzLCAweDFCQUEsIDB4NzgxNCwKKyAgICAweDA3QkMsIDB4NzgxRCwgMHgwOTRELCAweDc4MUYsIDB4MDk1MywgMHg3ODIwLCAweDA5NTIsIDB4NzgyMSwgMHgxRDZGLAorICAgIDB4NzgyMiwgMHgxRDY5LCAweDc4MjMsIDB4MUQ2NywgMHg3ODI1LCAweDA5NTAsIDB4NzgyNiwgMHgxRkJCLCAweDc4MjcsCisgICAgMHgwOTRCLCAweDc4MjgsIDB4MUQ2QywgMHg3ODI5LCAweDFENzAsIDB4NzgyQSwgMHgxRDcyLCAweDc4MkIsIDB4MUQ2RSwKKyAgICAweDc4MkMsIDB4MUQ2OCwgMHg3ODJELCAweDA5NTEsIDB4NzgyRSwgMHgxRDZELCAweDc4MkYsIDB4MUQ2QiwgMHg3ODMwLAorICAgIDB4MDk0QSwgMHg3ODMxLCAweDFENzMsIDB4NzgzMiwgMHgwOTU0LCAweDc4MzMsIDB4MUQ3MSwgMHg3ODM0LCAweDA5NEUsCisgICAgMHg3ODM1LCAweDFENkEsIDB4NzgzNywgMHgwOTRGLCAweDc4MzgsIDB4MDk0QywgMHg3ODQzLCAweDBCNDAsIDB4Nzg0NSwKKyAgICAweDFGQkMsIDB4Nzg0OCwgMHgxRkI1LCAweDc4NDksIDB4MUZCNywgMHg3ODRBLCAweDFGQjksIDB4Nzg0QywgMHgxRkJBLAorICAgIDB4Nzg0RCwgMHgxRkI4LCAweDc4NEUsIDB4MEI0MSwgMHg3ODUwLCAweDFGQkQsIDB4Nzg1MiwgMHgxRkI2LCAweDc4NUMsCisgICAgMHgyMjNELCAweDc4NUQsIDB4MENGNiwgMHg3ODVFLCAweDIyNDUsIDB4Nzg2MCwgMHgyMjNBLCAweDc4NjIsIDB4MjI0NiwKKyAgICAweDc4NjQsIDB4MjIzQiwgMHg3ODY1LCAweDIyM0MsIDB4Nzg2OCwgMHgyMjQ0LCAweDc4NjksIDB4MjI0MywgMHg3ODZBLAorICAgIDB4MjI0MCwgMHg3ODZCLCAweDBCM0YsIDB4Nzg2QywgMHgwQ0Y3LCAweDc4NkQsIDB4MjIzRSwgMHg3ODZFLCAweDIyNDEsCisgICAgMHg3ODZGLCAweDBDRjgsIDB4Nzg3MCwgMHgyMjQyLCAweDc4NzEsIDB4MjIzRiwgMHg3ODc5LCAweDI0RDcsIDB4Nzg3QiwKKyAgICAweDI0REIsIDB4Nzg3QywgMHgwRUE1LCAweDc4N0UsIDB4Mjc0RCwgMHg3ODdGLCAweDBFQTgsIDB4Nzg4MCwgMHgyNEQ5LAorICAgIDB4Nzg4MSwgMHgzNkU4LCAweDc4ODMsIDB4MjRENiwgMHg3ODg0LCAweDI0RDEsIDB4Nzg4NSwgMHgyNEQzLCAweDc4ODYsCisgICAgMHgyNEQ0LCAweDc4ODcsIDB4MjRDRCwgMHg3ODg5LCAweDBFQTQsIDB4Nzg4QywgMHgwRUEzLCAweDc4OEUsIDB4MEU5RiwKKyAgICAweDc4OEYsIDB4MjREMCwgMHg3ODkxLCAweDBFQTYsIDB4Nzg5MywgMHgwRUE3LCAweDc4OTQsIDB4MjRDRiwgMHg3ODk1LAorICAgIDB4MjREMiwgMHg3ODk2LCAweDI0REEsIDB4Nzg5NywgMHgwRUExLCAweDc4OTgsIDB4MEVBMiwgMHg3ODk5LCAweDI0RDgsCisgICAgMHg3ODlBLCAweDI0Q0UsIDB4Nzg5RSwgMHgyNzRGLCAweDc4OUYsIDB4MTAzRiwgMHg3OEEwLCAweDI3NTEsIDB4NzhBMSwKKyAgICAweDI0RDUsIDB4NzhBMiwgMHgyNzUzLCAweDc4QTMsIDB4MTA0MywgMHg3OEE0LCAweDI3NTQsIDB4NzhBNSwgMHgyNzUwLAorICAgIDB4NzhBNywgMHgxMDQwLCAweDc4QTgsIDB4Mjc0QywgMHg3OEE5LCAweDEwNDIsIDB4NzhBQSwgMHgyNzQ5LCAweDc4QUIsCisgICAgMHgyNzRFLCAweDc4QUMsIDB4Mjc1MiwgMHg3OEFELCAweDI3NEIsIDB4NzhCMCwgMHgwRUEwLCAweDc4QjIsIDB4Mjc0OCwKKyAgICAweDc4QjMsIDB4MTA0MSwgMHg3OEI0LCAweDI3NEEsIDB4NzhCQSwgMHgxMUJELCAweDc4QkIsIDB4Mjk5MiwgMHg3OEJDLAorICAgIDB4MTFDMSwgMHg3OEJFLCAweDExQkYsIDB4NzhDMSwgMHgxMDNFLCAweDc4QzMsIDB4Mjk5OSwgMHg3OEM0LCAweDI5OUEsCisgICAgMHg3OEM1LCAweDExQkMsIDB4NzhDOCwgMHgyOTk4LCAweDc4QzksIDB4Mjk5QiwgMHg3OENBLCAweDExQkUsIDB4NzhDQiwKKyAgICAweDExQkIsIDB4NzhDQywgMHgyOTk0LCAweDc4Q0QsIDB4Mjk5MSwgMHg3OENFLCAweDI5OTYsIDB4NzhDRiwgMHgyOTkzLAorICAgIDB4NzhEMCwgMHgxMUMyLCAweDc4RDEsIDB4Mjk5NSwgMHg3OEQ0LCAweDI5OTcsIDB4NzhENSwgMHgxMUMwLCAweDc4REEsCisgICAgMHgxMzBDLCAweDc4REIsIDB4MkJFRiwgMHg3OERELCAweDJCRTksIDB4NzhERSwgMHgyQkVELCAweDc4REYsIDB4MkJGMywKKyAgICAweDc4RTAsIDB4MkJGNCwgMHg3OEUxLCAweDJCRjAsIDB4NzhFMiwgMHgyQkYxLCAweDc4RTMsIDB4MkJFRSwgMHg3OEU1LAorICAgIDB4MkJFQiwgMHg3OEU3LCAweDEzMEUsIDB4NzhFOCwgMHgxMzBCLCAweDc4RTksIDB4MkJFQSwgMHg3OEVBLCAweDJCRUMsCisgICAgMHg3OEVDLCAweDEzMEQsIDB4NzhFRCwgMHgyQkYyLCAweDc4RUYsIDB4MTQyMiwgMHg3OEYyLCAweDJEQzgsIDB4NzhGMywKKyAgICAweDJEQzIsIDB4NzhGNCwgMHgxNDIxLCAweDc4RjcsIDB4MTQxRiwgMHg3OEY5LCAweDJEQ0EsIDB4NzhGQSwgMHgxNDIwLAorICAgIDB4NzhGQiwgMHgyREM1LCAweDc4RkMsIDB4MkRDNiwgMHg3OEZELCAweDJEQzMsIDB4NzhGRSwgMHgyRENCLCAweDc4RkYsCisgICAgMHgyREM3LCAweDc5MDEsIDB4MTQyMywgMHg3OTAyLCAweDJEQzQsIDB4NzkwNCwgMHgyRENDLCAweDc5MDUsIDB4MkRDOSwKKyAgICAweDc5MDksIDB4MkY2RiwgMHg3OTBDLCAweDJGNkMsIDB4NzkwRSwgMHgxNEZFLCAweDc5MTAsIDB4MkY3MCwgMHg3OTExLAorICAgIDB4MkY3MiwgMHg3OTEyLCAweDJGNzEsIDB4NzkxMywgMHgyRjZELCAweDc5MTQsIDB4MkY2RSwgMHg3OTE3LCAweDMwQ0UsCisgICAgMHg3OTE5LCAweDE1OUYsIDB4NzkxQiwgMHgzMENCLCAweDc5MUMsIDB4MzBDRCwgMHg3OTFELCAweDMwQ0EsIDB4NzkxRSwKKyAgICAweDMwQ0YsIDB4NzkyMSwgMHgzMENDLCAweDc5MjMsIDB4MzIwNCwgMHg3OTI0LCAweDMyMDcsIDB4NzkyNSwgMHgzMjAzLAorICAgIDB4NzkyNiwgMHgxNjI0LCAweDc5MjcsIDB4MzIwNSwgMHg3OTI4LCAweDMyMDYsIDB4NzkyOSwgMHgzMjA4LCAweDc5MkEsCisgICAgMHgxNjI1LCAweDc5MkIsIDB4MTYyNywgMHg3OTJDLCAweDE2MjYsIDB4NzkyRCwgMHgzMkU2LCAweDc5MkYsIDB4MzJFOCwKKyAgICAweDc5MzEsIDB4MzJFNywgMHg3OTM1LCAweDMzOTcsIDB4NzkzOCwgMHgzNDkwLCAweDc5MzksIDB4MzRENSwgMHg3OTNBLAorICAgIDB4MDM2QSwgMHg3OTNELCAweDE4RDcsIDB4NzkzRSwgMHgwNjVGLCAweDc5M0YsIDB4MUEyMCwgMHg3OTQwLCAweDA2NjAsCisgICAgMHg3OTQxLCAweDA2NjEsIDB4Nzk0MiwgMHgxQTFGLCAweDc5NDQsIDB4MUJBRiwgMHg3OTQ1LCAweDFCQUUsIDB4Nzk0NiwKKyAgICAweDA3QkYsIDB4Nzk0NywgMHgwN0MyLCAweDc5NDgsIDB4MDdDMSwgMHg3OTQ5LCAweDA3QzAsIDB4Nzk0QSwgMHgxQkFCLAorICAgIDB4Nzk0QiwgMHgxQkFELCAweDc5NEMsIDB4MUJBQywgMHg3OTRGLCAweDFENzYsIDB4Nzk1MCwgMHgwOTU2LCAweDc5NTEsCisgICAgMHgxRDdBLCAweDc5NTIsIDB4MUQ3OSwgMHg3OTUzLCAweDFENzgsIDB4Nzk1NCwgMHgxRDc0LCAweDc5NTUsIDB4MDk1NSwKKyAgICAweDc5NTYsIDB4MDk1OSwgMHg3OTU3LCAweDA5NUMsIDB4Nzk1QSwgMHgwOTVELCAweDc5NUIsIDB4MUQ3NSwgMHg3OTVDLAorICAgIDB4MUQ3NywgMHg3OTVELCAweDA5NUIsIDB4Nzk1RSwgMHgwOTVBLCAweDc5NUYsIDB4MDk1OCwgMHg3OTYwLCAweDA5NTcsCisgICAgMHg3OTYxLCAweDFGQzQsIDB4Nzk2MywgMHgxRkMyLCAweDc5NjQsIDB4MUZCRSwgMHg3OTY1LCAweDBCNDIsIDB4Nzk2NywKKyAgICAweDFGQkYsIDB4Nzk2OCwgMHgwQjQzLCAweDc5NjksIDB4MUZDMCwgMHg3OTZBLCAweDFGQzEsIDB4Nzk2QiwgMHgxRkMzLAorICAgIDB4Nzk2RCwgMHgwQjQ0LCAweDc5NzAsIDB4MjI0QSwgMHg3OTcyLCAweDIyNDksIDB4Nzk3MywgMHgyMjQ4LCAweDc5NzQsCisgICAgMHgyMjQ3LCAweDc5NzksIDB4MjRERiwgMHg3OTdBLCAweDBFQTksIDB4Nzk3QywgMHgyNERDLCAweDc5N0QsIDB4MjRERSwKKyAgICAweDc5N0YsIDB4MEVBQSwgMHg3OTgxLCAweDBFQUIsIDB4Nzk4MiwgMHgyNERELCAweDc5ODgsIDB4Mjc1RCwgMHg3OThBLAorICAgIDB4Mjc1NiwgMHg3OThCLCAweDI3NTcsIDB4Nzk4RCwgMHgxMDQ2LCAweDc5OEUsIDB4MTA0NCwgMHg3OThGLCAweDEwNDUsCisgICAgMHg3OTkwLCAweDI3NUYsIDB4Nzk5MiwgMHgyNzVFLCAweDc5OTMsIDB4Mjc1QiwgMHg3OTk0LCAweDI3NUEsIDB4Nzk5NSwKKyAgICAweDI3NTksIDB4Nzk5NiwgMHgyNzU4LCAweDc5OTcsIDB4Mjc1QywgMHg3OTk4LCAweDI3NTUsIDB4Nzk5QSwgMHgyOTlDLAorICAgIDB4Nzk5QiwgMHgyOUExLCAweDc5OUMsIDB4Mjk5RiwgMHg3OUEwLCAweDI5OUUsIDB4NzlBMSwgMHgyOTlELCAweDc5QTIsCisgICAgMHgyOUEwLCAweDc5QTQsIDB4MkJGNSwgMHg3OUE2LCAweDEzMEYsIDB4NzlBNywgMHgxNDI0LCAweDc5QTgsIDB4MkRDRSwKKyAgICAweDc5QUEsIDB4MTQyNSwgMHg3OUFCLCAweDJEQ0QsIDB4NzlBQywgMHgyRjc0LCAweDc5QUQsIDB4MkY3MywgMHg3OUFFLAorICAgIDB4MTRGRiwgMHg3OUIwLCAweDMwRDAsIDB4NzlCMSwgMHgxNUEwLCAweDc5QjIsIDB4MzIwOSwgMHg3OUIzLCAweDE2Q0YsCisgICAgMHg3OUI0LCAweDMzOTgsIDB4NzlCNiwgMHgzNDkyLCAweDc5QjcsIDB4MzQ5MSwgMHg3OUI4LCAweDE3QjIsIDB4NzlCOSwKKyAgICAweDA3QzMsIDB4NzlCQSwgMHgwN0M0LCAweDc5QkIsIDB4MUZDNSwgMHg3OUJELCAweDBFQUQsIDB4NzlCRSwgMHgwMzZCLAorICAgIDB4NzlCRiwgMHgwNEY5LCAweDc5QzAsIDB4MDRGOCwgMHg3OUMxLCAweDA0RjcsIDB4NzlDNSwgMHgxQTIxLCAweDc5QzgsCisgICAgMHgwNjYzLCAweDc5QzksIDB4MDY2MiwgMHg3OUNCLCAweDA3QzcsIDB4NzlDRCwgMHgxQkIxLCAweDc5Q0UsIDB4MUJCNCwKKyAgICAweDc5Q0YsIDB4MUJCMiwgMHg3OUQxLCAweDA3QzUsIDB4NzlEMiwgMHgwN0M2LCAweDc5RDUsIDB4MUJCMCwgMHg3OUQ2LAorICAgIDB4MUJCMywgMHg3OUQ4LCAweDA5NjQsIDB4NzlEQywgMHgxRDgxLCAweDc5REQsIDB4MUQ4MywgMHg3OURFLCAweDFEODIsCisgICAgMHg3OURGLCAweDA5NjEsIDB4NzlFMCwgMHgxRDdELCAweDc5RTMsIDB4MDk1RiwgMHg3OUU0LCAweDA5NUUsIDB4NzlFNiwKKyAgICAweDA5NjIsIDB4NzlFNywgMHgwOTYwLCAweDc5RTksIDB4MDk2MywgMHg3OUVBLCAweDFEODAsIDB4NzlFQiwgMHgxRDdCLAorICAgIDB4NzlFQywgMHgxRDdDLCAweDc5RUQsIDB4MUQ3RiwgMHg3OUVFLCAweDFEN0UsIDB4NzlGNiwgMHgxRkM4LCAweDc5RjcsCisgICAgMHgxRkM5LCAweDc5RjgsIDB4MUZDNywgMHg3OUZBLCAweDFGQzYsIDB4NzlGQiwgMHgwQjQ1LCAweDdBMDAsIDB4MENGRCwKKyAgICAweDdBMDIsIDB4MjI0QiwgMHg3QTAzLCAweDIyNEQsIDB4N0EwNCwgMHgyMjRGLCAweDdBMDUsIDB4MENGQywgMHg3QTA4LAorICAgIDB4MENGQSwgMHg3QTBBLCAweDIyNEMsIDB4N0EwQiwgMHgwQ0ZCLCAweDdBMEMsIDB4MjI0RSwgMHg3QTBELCAweDBDRjksCisgICAgMHg3QTEwLCAweDI0RTksIDB4N0ExMSwgMHgyNEUwLCAweDdBMTIsIDB4MjRFMywgMHg3QTEzLCAweDI0RTcsIDB4N0ExNCwKKyAgICAweDBFQjEsIDB4N0ExNSwgMHgyNEU1LCAweDdBMTcsIDB4MjRFNCwgMHg3QTE4LCAweDI0RTEsIDB4N0ExOSwgMHgyNEUyLAorICAgIDB4N0ExQSwgMHgwRUFGLCAweDdBMUIsIDB4MjRFOCwgMHg3QTFDLCAweDBFQUUsIDB4N0ExRSwgMHgwRUIzLCAweDdBMUYsCisgICAgMHgwRUIyLCAweDdBMjAsIDB4MEVCMCwgMHg3QTIyLCAweDI0RTYsIDB4N0EyNiwgMHgyNzY1LCAweDdBMjgsIDB4Mjc2NCwKKyAgICAweDdBMkIsIDB4Mjc2MCwgMHg3QTJFLCAweDEwNDcsIDB4N0EyRiwgMHgyNzYzLCAweDdBMzAsIDB4Mjc2MiwgMHg3QTMxLAorICAgIDB4MTA0OCwgMHg3QTM3LCAweDExQzcsIDB4N0EzOSwgMHgyOUEzLCAweDdBM0IsIDB4MTFDOCwgMHg3QTNDLCAweDExQzQsCisgICAgMHg3QTNELCAweDExQzYsIDB4N0EzRiwgMHgxMUMzLCAweDdBNDAsIDB4MTFDNSwgMHg3QTQ0LCAweDJCRjYsIDB4N0E0NiwKKyAgICAweDEzMTIsIDB4N0E0NywgMHgyQkY4LCAweDdBNDgsIDB4MkJGNywgMHg3QTRBLCAweDI3NjEsIDB4N0E0QiwgMHgxMzE0LAorICAgIDB4N0E0QywgMHgxMzEzLCAweDdBNEQsIDB4MTMxMCwgMHg3QTRFLCAweDEzMTEsIDB4N0E1NCwgMHgyREQzLCAweDdBNTYsCisgICAgMHgyREQxLCAweDdBNTcsIDB4MTQyNiwgMHg3QTU4LCAweDJERDIsIDB4N0E1QSwgMHgyREQ0LCAweDdBNUIsIDB4MkREMCwKKyAgICAweDdBNUMsIDB4MkRDRiwgMHg3QTVGLCAweDJGNzUsIDB4N0E2MCwgMHgxNTAyLCAweDdBNjEsIDB4MTUwMCwgMHg3QTYyLAorICAgIDB4MTUwMSwgMHg3QTY3LCAweDMwRDEsIDB4N0E2OCwgMHgzMEQyLCAweDdBNjksIDB4MTVBMiwgMHg3QTZCLCAweDE1QTEsCisgICAgMHg3QTZDLCAweDMyMEIsIDB4N0E2RCwgMHgzMjBDLCAweDdBNkUsIDB4MzIwQSwgMHg3QTcwLCAweDMzOTksIDB4N0E3MSwKKyAgICAweDMzOUEsIDB4N0E3NCwgMHgwMzZDLCAweDdBNzUsIDB4MTgxMSwgMHg3QTc2LCAweDA0RkEsIDB4N0E3OCwgMHgxQTIyLAorICAgIDB4N0E3OSwgMHgwNjY1LCAweDdBN0EsIDB4MDY2NCwgMHg3QTdCLCAweDFBMjMsIDB4N0E3RSwgMHgxQkI2LCAweDdBN0YsCisgICAgMHgwN0M4LCAweDdBODAsIDB4MUJCNSwgMHg3QTgxLCAweDA3QzksIDB4N0E4NCwgMHgwOTY1LCAweDdBODUsIDB4MUQ4NiwKKyAgICAweDdBODYsIDB4MUQ4NCwgMHg3QTg3LCAweDFEOEEsIDB4N0E4OCwgMHgwOTY2LCAweDdBODksIDB4MUQ4NSwgMHg3QThBLAorICAgIDB4MUQ4OSwgMHg3QThCLCAweDFEODcsIDB4N0E4QywgMHgxRDg4LCAweDdBOEYsIDB4MUZDQSwgMHg3QTkwLCAweDFGQ0MsCisgICAgMHg3QTkyLCAweDBCNDYsIDB4N0E5NCwgMHgxRkNCLCAweDdBOTUsIDB4MEI0NywgMHg3QTk2LCAweDBEMDAsIDB4N0E5NywKKyAgICAweDBDRkYsIDB4N0E5OCwgMHgwQ0ZFLCAweDdBOTksIDB4MjI1MCwgMHg3QTlFLCAweDI0RUMsIDB4N0E5RiwgMHgwRUI0LAorICAgIDB4N0FBMCwgMHgwRUI1LCAweDdBQTIsIDB4MjRFQiwgMHg3QUEzLCAweDI0RUEsIDB4N0FBOCwgMHgyNzY2LCAweDdBQTksCisgICAgMHgxMDRBLCAweDdBQUEsIDB4MTA0OSwgMHg3QUFCLCAweDI3NjcsIDB4N0FBQywgMHgyNzY4LCAweDdBQUUsIDB4MTFDQSwKKyAgICAweDdBQUYsIDB4MTFDOSwgMHg3QUIxLCAweDJCRkMsIDB4N0FCMiwgMHgyOUE0LCAweDdBQjMsIDB4MjlBNiwgMHg3QUI0LAorICAgIDB4MjlBNSwgMHg3QUI1LCAweDJCRkIsIDB4N0FCNiwgMHgyQkY5LCAweDdBQjcsIDB4MkJGRCwgMHg3QUI4LCAweDJCRkEsCisgICAgMHg3QUJBLCAweDEzMTUsIDB4N0FCRSwgMHgyREQ1LCAweDdBQkYsIDB4MTQyNywgMHg3QUMwLCAweDJERDYsIDB4N0FDMSwKKyAgICAweDJERDcsIDB4N0FDNCwgMHgxNTAzLCAweDdBQzUsIDB4MTUwNCwgMHg3QUM3LCAweDE2MjgsIDB4N0FDQSwgMHgxNkZGLAorICAgIDB4N0FDQiwgMHgwMzZELCAweDdBRDEsIDB4MUJCNywgMHg3QUQ4LCAweDFEOEIsIDB4N0FEOSwgMHgwOTY3LCAweDdBREYsCisgICAgMHgwQkRFLCAweDdBRTAsIDB4MEJERCwgMHg3QUUzLCAweDBEMDIsIDB4N0FFNCwgMHgyMjUyLCAweDdBRTUsIDB4MEQwMSwKKyAgICAweDdBRTYsIDB4MjI1MSwgMHg3QUVCLCAweDI0RUQsIDB4N0FFRCwgMHgxMDRCLCAweDdBRUUsIDB4Mjc2OSwgMHg3QUVGLAorICAgIDB4MTA0QywgMHg3QUY2LCAweDE2MjksIDB4N0FGNywgMHgzMjBELCAweDdBRjksIDB4MDNGNiwgMHg3QUZBLCAweDA2NjYsCisgICAgMHg3QUZCLCAweDFBMjQsIDB4N0FGRCwgMHgwN0NCLCAweDdBRkYsIDB4MDdDQSwgMHg3QjAwLCAweDFCQjgsIDB4N0IwMSwKKyAgICAweDFCQjksIDB4N0IwNCwgMHgxRDhELCAweDdCMDUsIDB4MUQ4RiwgMHg3QjA2LCAweDA5NjgsIDB4N0IwOCwgMHgxRDkxLAorICAgIDB4N0IwOSwgMHgxRDk0LCAweDdCMEEsIDB4MUQ5MiwgMHg3QjBFLCAweDFEOTMsIDB4N0IwRiwgMHgxRDkwLCAweDdCMTAsCisgICAgMHgxRDhDLCAweDdCMTEsIDB4MDk2OSwgMHg3QjEyLCAweDFEOTUsIDB4N0IxMywgMHgxRDhFLCAweDdCMTgsIDB4MUZENSwKKyAgICAweDdCMTksIDB4MEI0RCwgMHg3QjFBLCAweDFGREUsIDB4N0IxQiwgMHgwQjRBLCAweDdCMUQsIDB4MUZENywgMHg3QjFFLAorICAgIDB4MEI0RSwgMHg3QjIwLCAweDBCNDgsIDB4N0IyMiwgMHgxRkQyLCAweDdCMjMsIDB4MUZERiwgMHg3QjI0LCAweDFGRDMsCisgICAgMHg3QjI1LCAweDFGRDAsIDB4N0IyNiwgMHgwQjRDLCAweDdCMjgsIDB4MEI0OSwgMHg3QjJBLCAweDFGRDYsIDB4N0IyQiwKKyAgICAweDFGRDksIDB4N0IyQywgMHgwQjRCLCAweDdCMkQsIDB4MUZEQSwgMHg3QjJFLCAweDBCNEYsIDB4N0IyRiwgMHgxRkRCLAorICAgIDB4N0IzMCwgMHgxRkQxLCAweDdCMzEsIDB4MUZEOCwgMHg3QjMyLCAweDFGREMsIDB4N0IzMywgMHgxRkQ0LCAweDdCMzQsCisgICAgMHgxRkNGLCAweDdCMzUsIDB4MUZDRCwgMHg3QjM4LCAweDFGREQsIDB4N0IzQiwgMHgxRkNFLCAweDdCNDAsIDB4MjI1OSwKKyAgICAweDdCNDQsIDB4MjI1NSwgMHg3QjQ1LCAweDIyNUIsIDB4N0I0NiwgMHgwRDA1LCAweDdCNDcsIDB4MjI1NCwgMHg3QjQ4LAorICAgIDB4MjI1NiwgMHg3QjQ5LCAweDBEMDMsIDB4N0I0QSwgMHgyMjUzLCAweDdCNEIsIDB4MEQwQSwgMHg3QjRDLCAweDIyNTcsCisgICAgMHg3QjRELCAweDBEMDksIDB4N0I0RSwgMHgyMjU4LCAweDdCNEYsIDB4MEQwQiwgMHg3QjUwLCAweDBEMDYsIDB4N0I1MSwKKyAgICAweDBEMEMsIDB4N0I1MiwgMHgwRDA3LCAweDdCNTQsIDB4MEQwOCwgMHg3QjU2LCAweDBEMDQsIDB4N0I1OCwgMHgyMjVBLAorICAgIDB4N0I2MCwgMHgwRUI4LCAweDdCNjEsIDB4MjRGOCwgMHg3QjYzLCAweDI0RkIsIDB4N0I2NCwgMHgyNEVGLCAweDdCNjUsCisgICAgMHgyNEY0LCAweDdCNjYsIDB4MjRFRSwgMHg3QjY3LCAweDBFQkEsIDB4N0I2OSwgMHgyNEYyLCAweDdCNkQsIDB4MjRGMCwKKyAgICAweDdCNkUsIDB4MEVCOSwgMHg3QjcwLCAweDI0RjcsIDB4N0I3MSwgMHgyNEY2LCAweDdCNzIsIDB4MjRGMywgMHg3QjczLAorICAgIDB4MjRGNSwgMHg3Qjc0LCAweDI0RjEsIDB4N0I3NSwgMHgxMDUwLCAweDdCNzYsIDB4MjRGQSwgMHg3Qjc3LCAweDBFQjYsCisgICAgMHg3Qjc4LCAweDI0RjksIDB4N0I4MiwgMHgyNzc5LCAweDdCODQsIDB4MTA1NywgMHg3Qjg1LCAweDI3NzQsIDB4N0I4NywKKyAgICAweDEwNTYsIDB4N0I4OCwgMHgyNzZBLCAweDdCOEEsIDB4Mjc2QywgMHg3QjhCLCAweDEwNEYsIDB4N0I4QywgMHgyNzcxLAorICAgIDB4N0I4RCwgMHgyNzcwLCAweDdCOEUsIDB4Mjc3MywgMHg3QjhGLCAweDEwNTQsIDB4N0I5MCwgMHgyNzZFLCAweDdCOTEsCisgICAgMHgyNzZELCAweDdCOTQsIDB4MTA1MywgMHg3Qjk1LCAweDEwNEUsIDB4N0I5NiwgMHgyNzZGLCAweDdCOTcsIDB4MTA1MSwKKyAgICAweDdCOTgsIDB4Mjc3NSwgMHg3Qjk5LCAweDI3NzcsIDB4N0I5QiwgMHgyNzcyLCAweDdCOUMsIDB4Mjc2QiwgMHg3QjlELAorICAgIDB4MTA1MiwgMHg3QkEwLCAweDExRDIsIDB4N0JBMSwgMHgxMDRELCAweDdCQTQsIDB4Mjc3OCwgMHg3QkFDLCAweDI5QUEsCisgICAgMHg3QkFELCAweDExQ0IsIDB4N0JBRiwgMHgyOUFDLCAweDdCQjEsIDB4MTFDQywgMHg3QkI0LCAweDExQ0UsIDB4N0JCNSwKKyAgICAweDI5QUYsIDB4N0JCNywgMHgyOUE3LCAweDdCQjgsIDB4MTA1NSwgMHg3QkI5LCAweDI5QUQsIDB4N0JCRSwgMHgyOUE5LAorICAgIDB4N0JDMCwgMHgwRUI3LCAweDdCQzEsIDB4MTFEMSwgMHg3QkM0LCAweDExQ0QsIDB4N0JDNiwgMHgxMUNGLCAweDdCQzcsCisgICAgMHgxMUQwLCAweDdCQzksIDB4MTMxOCwgMHg3QkNBLCAweDI5QUUsIDB4N0JDQiwgMHgyOUE4LCAweDdCQ0MsIDB4MTFEMywKKyAgICAweDdCQ0UsIDB4MjlBQiwgMHg3QkQ0LCAweDJDMDcsIDB4N0JENSwgMHgyQzAyLCAweDdCRDgsIDB4MkMwQywgMHg3QkQ5LAorICAgIDB4MTMxNiwgMHg3QkRBLCAweDJDMDQsIDB4N0JEQiwgMHgxMzFBLCAweDdCREMsIDB4MkMwQSwgMHg3QkRELCAweDJDMDEsCisgICAgMHg3QkRFLCAweDJCRkUsIDB4N0JERiwgMHgyQzBELCAweDdCRTAsIDB4MTQyRCwgMHg3QkUxLCAweDEzMUIsIDB4N0JFMiwKKyAgICAweDJDMDksIDB4N0JFMywgMHgyQkZGLCAweDdCRTQsIDB4MTMxOSwgMHg3QkU1LCAweDJDMDMsIDB4N0JFNiwgMHgxMzFELAorICAgIDB4N0JFNywgMHgyQzAwLCAweDdCRTgsIDB4MkMwNSwgMHg3QkU5LCAweDEzMUMsIDB4N0JFQSwgMHgyQzA4LCAweDdCRUIsCisgICAgMHgyQzBCLCAweDdCRjAsIDB4MkRFOSwgMHg3QkYxLCAweDJERUEsIDB4N0JGMiwgMHgyRERBLCAweDdCRjMsIDB4MkRFMSwKKyAgICAweDdCRjQsIDB4MkRERiwgMHg3QkY3LCAweDE0MkIsIDB4N0JGOCwgMHgyREU2LCAweDdCRjksIDB4MkMwNiwgMHg3QkZCLAorICAgIDB4MkRERCwgMHg3QkZELCAweDJERTcsIDB4N0JGRSwgMHgxNDJBLCAweDdCRkYsIDB4MkREQywgMHg3QzAwLCAweDJEREIsCisgICAgMHg3QzAxLCAweDJERTUsIDB4N0MwMiwgMHgyREUyLCAweDdDMDMsIDB4MkRFNCwgMHg3QzA1LCAweDJERDgsIDB4N0MwNiwKKyAgICAweDJERTgsIDB4N0MwNywgMHgxNDI4LCAweDdDMDksIDB4MkRFMywgMHg3QzBBLCAweDJERUMsIDB4N0MwQiwgMHgyREUwLAorICAgIDB4N0MwQywgMHgxNDJDLCAweDdDMEQsIDB4MTQyOSwgMHg3QzBFLCAweDJEREUsIDB4N0MwRiwgMHgyREQ5LCAweDdDMTAsCisgICAgMHgyREVCLCAweDdDMTEsIDB4MTMxNywgMHg3QzE5LCAweDJGNzgsIDB4N0MxQywgMHgyRjc2LCAweDdDMUQsIDB4MkY3QywKKyAgICAweDdDMUUsIDB4MTUwOCwgMHg3QzFGLCAweDJGN0EsIDB4N0MyMCwgMHgyRjc5LCAweDdDMjEsIDB4MTUwQSwgMHg3QzIyLAorICAgIDB4MkY3RiwgMHg3QzIzLCAweDE1MDksIDB4N0MyNSwgMHgyRjgwLCAweDdDMjYsIDB4MkY3RCwgMHg3QzI3LCAweDE1MDYsCisgICAgMHg3QzI4LCAweDJGN0UsIDB4N0MyOSwgMHgyRjc3LCAweDdDMkEsIDB4MTUwNywgMHg3QzJCLCAweDE1MDUsIDB4N0MyQywKKyAgICAweDMwRDYsIDB4N0MyRCwgMHgyRjdCLCAweDdDMzAsIDB4MkY4MSwgMHg3QzMzLCAweDMwRDMsIDB4N0MzNywgMHgxNUE3LAorICAgIDB4N0MzOCwgMHgxNUE1LCAweDdDMzksIDB4MzBENSwgMHg3QzNCLCAweDMwRDcsIDB4N0MzQywgMHgzMEQ0LCAweDdDM0QsCisgICAgMHgxNUE2LCAweDdDM0UsIDB4MTVBMywgMHg3QzNGLCAweDE1QTQsIDB4N0M0MCwgMHgxNUE4LCAweDdDNDMsIDB4MTYyQiwKKyAgICAweDdDNDUsIDB4MzIxMiwgMHg3QzQ3LCAweDMyMTEsIDB4N0M0OCwgMHgzMjBGLCAweDdDNDksIDB4MzIwRSwgMHg3QzRBLAorICAgIDB4MzIxMCwgMHg3QzRDLCAweDE2MkEsIDB4N0M0RCwgMHgxNjJDLCAweDdDNTAsIDB4MTY4MSwgMHg3QzUzLCAweDMyRUEsCisgICAgMHg3QzU0LCAweDMyRTksIDB4N0M1NywgMHgzMzlCLCAweDdDNTksIDB4MzM5RCwgMHg3QzVBLCAweDMzOUYsIDB4N0M1QiwKKyAgICAweDMzOUUsIDB4N0M1QywgMHgzMzlDLCAweDdDNUYsIDB4MTZEMSwgMHg3QzYwLCAweDE2RDAsIDB4N0M2MywgMHgxNzAxLAorICAgIDB4N0M2NCwgMHgxNzAwLCAweDdDNjUsIDB4MTcwMiwgMHg3QzY2LCAweDM0MkIsIDB4N0M2NywgMHgzNDJBLCAweDdDNjksCisgICAgMHgzNEQ2LCAweDdDNkEsIDB4MzQ5MywgMHg3QzZCLCAweDM0RDcsIDB4N0M2QywgMHgxNzQ1LCAweDdDNkUsIDB4MTc0NiwKKyAgICAweDdDNkYsIDB4MzUwNywgMHg3QzcyLCAweDE3NkIsIDB4N0M3MywgMHgwM0Y3LCAweDdDNzUsIDB4MUEyNSwgMHg3Qzc4LAorICAgIDB4MUJCQiwgMHg3Qzc5LCAweDFCQkMsIDB4N0M3QSwgMHgxQkJBLCAweDdDN0QsIDB4MDdDQywgMHg3QzdGLCAweDFCQkQsCisgICAgMHg3QzgwLCAweDFCQkUsIDB4N0M4MSwgMHgxQkJGLCAweDdDODQsIDB4MUQ5NiwgMHg3Qzg1LCAweDFEOUMsIDB4N0M4OCwKKyAgICAweDFEOUEsIDB4N0M4OSwgMHgwOTZBLCAweDdDOEEsIDB4MUQ5OCwgMHg3QzhDLCAweDFEOTksIDB4N0M4RCwgMHgxRDlCLAorICAgIDB4N0M5MSwgMHgxRDk3LCAweDdDOTIsIDB4MEI1MCwgMHg3Qzk0LCAweDFGRTAsIDB4N0M5NSwgMHgwQjUyLCAweDdDOTYsCisgICAgMHgxRkUyLCAweDdDOTcsIDB4MEI1MSwgMHg3Qzk4LCAweDFGRTEsIDB4N0M5RSwgMHgyMjVELCAweDdDOUYsIDB4MEQwRCwKKyAgICAweDdDQTEsIDB4MjI1RiwgMHg3Q0EyLCAweDIyNUMsIDB4N0NBMywgMHgxRkUzLCAweDdDQTUsIDB4MEQwRSwgMHg3Q0E3LAorICAgIDB4MzZFRCwgMHg3Q0E4LCAweDIyNUUsIDB4N0NBRiwgMHgyNEZFLCAweDdDQjEsIDB4MEVCQiwgMHg3Q0IyLCAweDI0RkMsCisgICAgMHg3Q0IzLCAweDBFQkMsIDB4N0NCNCwgMHgyNEZELCAweDdDQjUsIDB4MEVCRCwgMHg3Q0I5LCAweDEwNTgsIDB4N0NCQSwKKyAgICAweDI3N0QsIDB4N0NCQiwgMHgyNzdBLCAweDdDQkMsIDB4Mjc3QywgMHg3Q0JELCAweDEwNTksIDB4N0NCRSwgMHgxMDVBLAorICAgIDB4N0NCRiwgMHgyNzdCLCAweDdDQzUsIDB4MjlCMCwgMHg3Q0M4LCAweDI5QjEsIDB4N0NDQSwgMHgxMUQ0LCAweDdDQ0IsCisgICAgMHgyOUIzLCAweDdDQ0MsIDB4MjlCMiwgMHg3Q0NFLCAweDAxMjEsIDB4N0NEMCwgMHgyQzExLCAweDdDRDEsIDB4MkMxMiwKKyAgICAweDdDRDIsIDB4MkMwRSwgMHg3Q0Q0LCAweDJDMEYsIDB4N0NENSwgMHgxMzFFLCAweDdDRDYsIDB4MTMxRiwgMHg3Q0Q3LAorICAgIDB4MkMxMCwgMHg3Q0Q5LCAweDE0MzMsIDB4N0NEQywgMHgxNDJGLCAweDdDREQsIDB4MTQzNCwgMHg3Q0RFLCAweDE0MzAsCisgICAgMHg3Q0RGLCAweDE0MzIsIDB4N0NFMCwgMHgxNDJFLCAweDdDRTIsIDB4MTQzMSwgMHg3Q0U3LCAweDE1MEIsIDB4N0NFOCwKKyAgICAweDJERUQsIDB4N0NFQSwgMHgzMEQ5LCAweDdDRUMsIDB4MzBEOCwgMHg3Q0VFLCAweDMyMTMsIDB4N0NFRiwgMHgxNjJELAorICAgIDB4N0NGMCwgMHgxNjJFLCAweDdDRjEsIDB4MzNBMSwgMHg3Q0YyLCAweDMyRUIsIDB4N0NGNCwgMHgzM0EwLCAweDdDRjYsCisgICAgMHgzNEQ4LCAweDdDRjcsIDB4MzUxRCwgMHg3Q0Y4LCAweDAzRjgsIDB4N0NGQiwgMHgwNEZCLCAweDdDRkQsIDB4MUEyNiwKKyAgICAweDdDRkUsIDB4MDY2NywgMHg3RDAwLCAweDA3Q0YsIDB4N0QwMSwgMHgxQkMyLCAweDdEMDIsIDB4MDdDRCwgMHg3RDAzLAorICAgIDB4MUJDMCwgMHg3RDA0LCAweDA3RDIsIDB4N0QwNSwgMHgwN0NFLCAweDdEMDYsIDB4MDdEMywgMHg3RDA3LCAweDA3RDEsCisgICAgMHg3RDA4LCAweDFCQzEsIDB4N0QwOSwgMHgwN0QwLCAweDdEMEEsIDB4MDk2RSwgMHg3RDBCLCAweDA5NkQsIDB4N0QwQywKKyAgICAweDFEQTcsIDB4N0QwRCwgMHgwOTc2LCAweDdEMEUsIDB4MURBMCwgMHg3RDBGLCAweDFEQTYsIDB4N0QxMCwgMHgwOTcyLAorICAgIDB4N0QxMSwgMHgxRDlGLCAweDdEMTIsIDB4MURBNSwgMHg3RDEzLCAweDFEQTMsIDB4N0QxNCwgMHgwOTcxLCAweDdEMTUsCisgICAgMHgwOTczLCAweDdEMTYsIDB4MURBMiwgMHg3RDE3LCAweDA5NkMsIDB4N0QxOCwgMHgxREExLCAweDdEMTksIDB4MDk3NywKKyAgICAweDdEMUEsIDB4MDk3NCwgMHg3RDFCLCAweDA5NzgsIDB4N0QxQywgMHgwOTc1LCAweDdEMUQsIDB4MUQ5RSwgMHg3RDFFLAorICAgIDB4MUQ5RCwgMHg3RDFGLCAweDFEQTQsIDB4N0QyMCwgMHgwOTZGLCAweDdEMjEsIDB4MDk2QiwgMHg3RDIyLCAweDA5NzAsCisgICAgMHg3RDI4LCAweDFGRjIsIDB4N0QyOSwgMHgxRkVCLCAweDdEMkIsIDB4MEQxMywgMHg3RDJDLCAweDFGRUEsIDB4N0QyRSwKKyAgICAweDBCNTYsIDB4N0QyRiwgMHgwQjVELCAweDdEMzAsIDB4MEI1QSwgMHg3RDMxLCAweDBCNjAsIDB4N0QzMiwgMHgwQjVGLAorICAgIDB4N0QzMywgMHgwQjVCLCAweDdEMzUsIDB4MUZFNCwgMHg3RDM2LCAweDFGRTcsIDB4N0QzOCwgMHgxRkU2LCAweDdEMzksCisgICAgMHgwQjU3LCAweDdEM0EsIDB4MUZFOCwgMHg3RDNCLCAweDFGRjEsIDB4N0QzQywgMHgwQjU4LCAweDdEM0QsIDB4MUZFNSwKKyAgICAweDdEM0UsIDB4MUZFRSwgMHg3RDNGLCAweDFGRUYsIDB4N0Q0MCwgMHgwQjU5LCAweDdENDEsIDB4MUZFQywgMHg3RDQyLAorICAgIDB4MEI1RSwgMHg3RDQzLCAweDBCNTQsIDB4N0Q0NCwgMHgwQjVDLCAweDdENDUsIDB4MUZFOSwgMHg3RDQ2LCAweDBCNTMsCisgICAgMHg3RDQ3LCAweDFGRUQsIDB4N0Q0QSwgMHgxRkYwLCAweDdENEUsIDB4MjI3MCwgMHg3RDRGLCAweDIyNjcsIDB4N0Q1MCwKKyAgICAweDBEMTAsIDB4N0Q1MSwgMHgyMjZFLCAweDdENTIsIDB4MjI2QiwgMHg3RDUzLCAweDIyNjMsIDB4N0Q1NCwgMHgyMjZDLAorICAgIDB4N0Q1NSwgMHgwRDEyLCAweDdENTYsIDB4MjI2NCwgMHg3RDU4LCAweDIyNjAsIDB4N0Q1QiwgMHgwRUMzLCAweDdENUMsCisgICAgMHgyMjY5LCAweDdENUUsIDB4MEQwRiwgMHg3RDVGLCAweDIyNkYsIDB4N0Q2MSwgMHgwRDE2LCAweDdENjIsIDB4MEQxOCwKKyAgICAweDdENjMsIDB4MjI2MiwgMHg3RDY2LCAweDBEMTcsIDB4N0Q2NywgMHgyMjY1LCAweDdENjgsIDB4MEQxMSwgMHg3RDY5LAorICAgIDB4MjI2RCwgMHg3RDZBLCAweDIyNjYsIDB4N0Q2QiwgMHgyMjZBLCAweDdENkQsIDB4MjI2OCwgMHg3RDZFLCAweDBEMTQsCisgICAgMHg3RDZGLCAweDIyNjEsIDB4N0Q3MCwgMHgwRDE5LCAweDdENzEsIDB4MEI1NSwgMHg3RDcyLCAweDBEMTUsIDB4N0Q3MywKKyAgICAweDBEMUEsIDB4N0Q3OSwgMHgwRUJGLCAweDdEN0EsIDB4MjUwNSwgMHg3RDdCLCAweDI1MDcsIDB4N0Q3QywgMHgyNTA5LAorICAgIDB4N0Q3RCwgMHgyNTBELCAweDdEN0YsIDB4MjUwMywgMHg3RDgwLCAweDI1MDEsIDB4N0Q4MSwgMHgwRUMxLCAweDdEODMsCisgICAgMHgyNTA4LCAweDdEODQsIDB4MjUwQywgMHg3RDg1LCAweDI1MDQsIDB4N0Q4NiwgMHgyNTAwLCAweDdEODgsIDB4MjRGRiwKKyAgICAweDdEOEMsIDB4MjUwQSwgMHg3RDhELCAweDI1MDIsIDB4N0Q4RSwgMHgyNTA2LCAweDdEOEYsIDB4MEVDMiwgMHg3RDkxLAorICAgIDB4MEVDMCwgMHg3RDkyLCAweDI1MEUsIDB4N0Q5MywgMHgwRUJFLCAweDdEOTQsIDB4MjUwQiwgMHg3RDk2LCAweDI3OEUsCisgICAgMHg3RDlDLCAweDEwNUQsIDB4N0Q5RCwgMHgyNzg2LCAweDdEOUUsIDB4MTFFMSwgMHg3RDlGLCAweDI3OTAsIDB4N0RBMCwKKyAgICAweDEwNjAsIDB4N0RBMSwgMHgyNzk0LCAweDdEQTIsIDB4MTA2NiwgMHg3REEzLCAweDI3ODEsIDB4N0RBNiwgMHgyNzkxLAorICAgIDB4N0RBNywgMHgyNzdFLCAweDdEQTksIDB4Mjc5MywgMHg3REFBLCAweDI3ODIsIDB4N0RBQywgMHgxMDZELCAweDdEQUQsCisgICAgMHgxMDZBLCAweDdEQUUsIDB4Mjc5MiwgMHg3REFGLCAweDI3OEMsIDB4N0RCMCwgMHgxMDVDLCAweDdEQjEsIDB4MTA2NCwKKyAgICAweDdEQjIsIDB4MTA2MywgMHg3REI0LCAweDEwNjIsIDB4N0RCNSwgMHgxMDY4LCAweDdEQjcsIDB4Mjc3RiwgMHg3REI4LAorICAgIDB4MTA2OSwgMHg3REI5LCAweDI3OEQsIDB4N0RCQSwgMHgxMDY1LCAweDdEQkIsIDB4MTA1QiwgMHg3REJDLCAweDI3OEYsCisgICAgMHg3REJELCAweDEwNUUsIDB4N0RCRSwgMHgxMDVGLCAweDdEQkYsIDB4MTA2NywgMHg3REMwLCAweDI3ODQsIDB4N0RDMSwKKyAgICAweDI3ODMsIDB4N0RDMiwgMHgyNzgwLCAweDdEQzQsIDB4Mjc4OCwgMHg3REM1LCAweDI3ODUsIDB4N0RDNiwgMHgyNzg5LAorICAgIDB4N0RDNywgMHgxMDZDLCAweDdEQzksIDB4Mjc5NSwgMHg3RENBLCAweDEwNjEsIDB4N0RDQiwgMHgyNzhBLCAweDdEQ0MsCisgICAgMHgyNzhCLCAweDdEQ0UsIDB4Mjc4NywgMHg3REQyLCAweDEwNkIsIDB4N0RENywgMHgyOUI4LCAweDdERDgsIDB4MTFEOSwKKyAgICAweDdERDksIDB4MTFFMiwgMHg3RERBLCAweDExREUsIDB4N0REQiwgMHgyOUI1LCAweDdEREQsIDB4MTFEQiwgMHg3RERFLAorICAgIDB4MTFERiwgMHg3RERGLCAweDI5QzEsIDB4N0RFMCwgMHgxMUQ1LCAweDdERTEsIDB4MjlCOSwgMHg3REUzLCAweDExREQsCisgICAgMHg3REU2LCAweDI5QkMsIDB4N0RFNywgMHgyOUI3LCAweDdERTgsIDB4MTFEQywgMHg3REU5LCAweDExRTAsIDB4N0RFQSwKKyAgICAweDI5QjYsIDB4N0RFQywgMHgxMURBLCAweDdERUUsIDB4MjlDMCwgMHg3REVGLCAweDExRDcsIDB4N0RGMCwgMHgyOUJGLAorICAgIDB4N0RGMSwgMHgyOUJFLCAweDdERjIsIDB4MTFFMywgMHg3REYzLCAweDI4QzgsIDB4N0RGNCwgMHgxMUQ2LCAweDdERjYsCisgICAgMHgyOUJELCAweDdERjcsIDB4MjlCNCwgMHg3REY5LCAweDExRTQsIDB4N0RGQSwgMHgyOUJCLCAweDdERkIsIDB4MTFEOCwKKyAgICAweDdFMDMsIDB4MjlCQSwgMHg3RTA4LCAweDEzMjIsIDB4N0UwOSwgMHgxMzI3LCAweDdFMEEsIDB4MTMyMCwgMHg3RTBCLAorICAgIDB4MkMxRiwgMHg3RTBDLCAweDJDMTYsIDB4N0UwRCwgMHgyQzIyLCAweDdFMEUsIDB4MkMxQSwgMHg3RTBGLCAweDJDMjAsCisgICAgMHg3RTEwLCAweDEzMjgsIDB4N0UxMSwgMHgxMzIxLCAweDdFMTIsIDB4MkMxMywgMHg3RTEzLCAweDJDMTksIDB4N0UxNCwKKyAgICAweDJDMjMsIDB4N0UxNSwgMHgyQzFDLCAweDdFMTYsIDB4MkMyMSwgMHg3RTE3LCAweDJDMTUsIDB4N0UxQSwgMHgyQzFELAorICAgIDB4N0UxQiwgMHgxMzIzLCAweDdFMUMsIDB4MkMxQiwgMHg3RTFELCAweDEzMjYsIDB4N0UxRSwgMHgxMzI1LCAweDdFMUYsCisgICAgMHgyQzE3LCAweDdFMjAsIDB4MkMxOCwgMHg3RTIxLCAweDJDMTQsIDB4N0UyMiwgMHgyQzFFLCAweDdFMjMsIDB4MTMyNCwKKyAgICAweDdFMjQsIDB4MkMyNSwgMHg3RTI1LCAweDJDMjQsIDB4N0UyOSwgMHgyREY4LCAweDdFMkEsIDB4MkRGNCwgMHg3RTJCLAorICAgIDB4MTQzQiwgMHg3RTJELCAweDJERUUsIDB4N0UyRSwgMHgxNDM1LCAweDdFMkYsIDB4MTQ0NSwgMHg3RTMwLCAweDJERkEsCisgICAgMHg3RTMxLCAweDE0M0QsIDB4N0UzMiwgMHgxNDM5LCAweDdFMzMsIDB4MkRGMSwgMHg3RTM0LCAweDE0NDAsIDB4N0UzNSwKKyAgICAweDE0NDMsIDB4N0UzNiwgMHgyREZDLCAweDdFMzcsIDB4MTQzOCwgMHg3RTM4LCAweDJERjMsIDB4N0UzOSwgMHgxNDQxLAorICAgIDB4N0UzQSwgMHgyREZFLCAweDdFM0IsIDB4MkRGQiwgMHg3RTNDLCAweDJERUYsIDB4N0UzRCwgMHgxNDNDLCAweDdFM0UsCisgICAgMHgxNDM2LCAweDdFM0YsIDB4MTQ0NCwgMHg3RTQwLCAweDJERjYsIDB4N0U0MSwgMHgxNDNGLCAweDdFNDIsIDB4MkRGMCwKKyAgICAweDdFNDMsIDB4MTQzQSwgMHg3RTQ0LCAweDJERkQsIDB4N0U0NSwgMHgxNDNFLCAweDdFNDYsIDB4MTQzNywgMHg3RTQ3LAorICAgIDB4MkRGNywgMHg3RTQ4LCAweDE0NDIsIDB4N0U0OSwgMHgyREY1LCAweDdFNEMsIDB4MkRGOSwgMHg3RTUwLCAweDJGODMsCisgICAgMHg3RTUxLCAweDJGODksIDB4N0U1MiwgMHgxNTExLCAweDdFNTMsIDB4MkY4QywgMHg3RTU0LCAweDE1MEMsIDB4N0U1NSwKKyAgICAweDE1MEQsIDB4N0U1NiwgMHgyRjg0LCAweDdFNTcsIDB4MkY4QiwgMHg3RTU4LCAweDJGODYsIDB4N0U1OSwgMHgxNTEyLAorICAgIDB4N0U1QSwgMHgxNTBGLCAweDdFNUMsIDB4MkY4MiwgMHg3RTVFLCAweDE1MEUsIDB4N0U1RiwgMHgyRjg4LCAweDdFNjAsCisgICAgMHgyRjhBLCAweDdFNjEsIDB4MTUxMCwgMHg3RTYyLCAweDJGODcsIDB4N0U2MywgMHgyRjg1LCAweDdFNjgsIDB4MzBFMywKKyAgICAweDdFNjksIDB4MTVBQywgMHg3RTZBLCAweDE1QUQsIDB4N0U2QiwgMHgxNUE5LCAweDdFNkQsIDB4MTVBQSwgMHg3RTZGLAorICAgIDB4MzBERiwgMHg3RTcwLCAweDMwREQsIDB4N0U3MiwgMHgzMEUxLCAweDdFNzMsIDB4MTVBRSwgMHg3RTc0LCAweDMwRTIsCisgICAgMHg3RTc1LCAweDMwREIsIDB4N0U3NiwgMHgzMERBLCAweDdFNzcsIDB4MzBERSwgMHg3RTc4LCAweDMwREMsIDB4N0U3OSwKKyAgICAweDE1QUIsIDB4N0U3QSwgMHgzMEUwLCAweDdFN0IsIDB4MzIxNCwgMHg3RTdDLCAweDE2MzEsIDB4N0U3RCwgMHgxNjMwLAorICAgIDB4N0U3RSwgMHgzMjE1LCAweDdFODAsIDB4MzIxNywgMHg3RTgxLCAweDMyMTYsIDB4N0U4MiwgMHgxNjMyLCAweDdFODYsCisgICAgMHgzMkYwLCAweDdFODcsIDB4MzJFRCwgMHg3RTg4LCAweDMyRUUsIDB4N0U4QSwgMHgzMkVDLCAweDdFOEIsIDB4MzJFRiwKKyAgICAweDdFOEMsIDB4MTY4MywgMHg3RThELCAweDMyRjEsIDB4N0U4RiwgMHgxNjgyLCAweDdFOTEsIDB4MzNBMiwgMHg3RTkzLAorICAgIDB4MTcwMywgMHg3RTk0LCAweDE3MDUsIDB4N0U5NSwgMHgzNDJDLCAweDdFOTYsIDB4MTcwNCwgMHg3RTk3LCAweDM0OTQsCisgICAgMHg3RTk4LCAweDM0REEsIDB4N0U5OSwgMHgzNERDLCAweDdFOUEsIDB4MzREOSwgMHg3RTlCLCAweDM0REIsIDB4N0U5QywKKyAgICAweDE3NTksIDB4N0YzNiwgMHgwM0Y5LCAweDdGMzgsIDB4MDdENCwgMHg3RjM5LCAweDFEMUYsIDB4N0YzQSwgMHgwOTc5LAorICAgIDB4N0YzRCwgMHgwQjYxLCAweDdGM0UsIDB4MjI3MSwgMHg3RjNGLCAweDIyNzIsIDB4N0Y0MywgMHgyQzI2LCAweDdGNDQsCisgICAgMHgxNDQ2LCAweDdGNDUsIDB4MkRGRiwgMHg3RjQ4LCAweDE1MTMsIDB4N0Y0QSwgMHgzMEU1LCAweDdGNEIsIDB4MzBFNCwKKyAgICAweDdGNEMsIDB4MTYzMywgMHg3RjRELCAweDMyRjIsIDB4N0Y0RiwgMHgzM0EzLCAweDdGNTAsIDB4MTcyNiwgMHg3RjUxLAorICAgIDB4MTgxMiwgMHg3RjU0LCAweDA2NjgsIDB4N0Y1NSwgMHgwNEZDLCAweDdGNTgsIDB4MUJDMywgMHg3RjVCLCAweDFEQUQsCisgICAgMHg3RjVDLCAweDFEQTgsIDB4N0Y1RCwgMHgxREFDLCAweDdGNUUsIDB4MURBQSwgMHg3RjVGLCAweDA5N0EsIDB4N0Y2MCwKKyAgICAweDFEQUIsIDB4N0Y2MSwgMHgxREE5LCAweDdGNjMsIDB4MUZGMywgMHg3RjY1LCAweDIyNzMsIDB4N0Y2NiwgMHgyMjc0LAorICAgIDB4N0Y2NywgMHgyNTExLCAweDdGNjgsIDB4MjUxMiwgMHg3RjY5LCAweDBFQzUsIDB4N0Y2QSwgMHgwRUM2LCAweDdGNkIsCisgICAgMHgyNTEwLCAweDdGNkMsIDB4MjUxMywgMHg3RjZELCAweDI1MEYsIDB4N0Y2RSwgMHgwRUM0LCAweDdGNzAsIDB4MTA2RSwKKyAgICAweDdGNzIsIDB4MEVDNywgMHg3RjczLCAweDI3OTYsIDB4N0Y3NSwgMHgxMUU1LCAweDdGNzYsIDB4MjlDMiwgMHg3Rjc3LAorICAgIDB4MTFFNiwgMHg3Rjc5LCAweDEzMjksIDB4N0Y3QSwgMHgyQzI5LCAweDdGN0IsIDB4MkMyNywgMHg3RjdDLCAweDJDMjgsCisgICAgMHg3RjdELCAweDJFMDIsIDB4N0Y3RSwgMHgyRTAxLCAweDdGN0YsIDB4MkUwMCwgMHg3RjgzLCAweDMwRTYsIDB4N0Y4NSwKKyAgICAweDE1QUYsIDB4N0Y4NiwgMHgzMEU3LCAweDdGODcsIDB4MzNBNCwgMHg3Rjg4LCAweDE3MjcsIDB4N0Y4OSwgMHgzNDk1LAorICAgIDB4N0Y4QSwgMHgwM0ZBLCAweDdGOEIsIDB4MDY2QSwgMHg3RjhDLCAweDA2NjksIDB4N0Y4RCwgMHgxQkM1LCAweDdGOEUsCisgICAgMHgwN0Q1LCAweDdGOTEsIDB4MUJDNCwgMHg3RjkyLCAweDFEQUYsIDB4N0Y5NCwgMHgwOTdCLCAweDdGOTUsIDB4MUZGNCwKKyAgICAweDdGOTYsIDB4MURBRSwgMHg3RjlBLCAweDBCNjMsIDB4N0Y5QiwgMHgxRkY3LCAweDdGOUMsIDB4MUZGNSwgMHg3RjlELAorICAgIDB4MUZGNiwgMHg3RjlFLCAweDBCNjIsIDB4N0ZBMCwgMHgyMjc2LCAweDdGQTEsIDB4MjI3NywgMHg3RkEyLCAweDIyNzUsCisgICAgMHg3RkE0LCAweDBFQ0EsIDB4N0ZBNSwgMHgyNTE1LCAweDdGQTYsIDB4MjUxNCwgMHg3RkE3LCAweDI1MTYsIDB4N0ZBOCwKKyAgICAweDBFQzksIDB4N0ZBOSwgMHgwRUM4LCAweDdGQUMsIDB4MjlDMywgMHg3RkFELCAweDI5QzUsIDB4N0ZBRiwgMHgxMUU3LAorICAgIDB4N0ZCMCwgMHgyOUM0LCAweDdGQjEsIDB4MkMyQSwgMHg3RkIyLCAweDEzMkEsIDB4N0ZCMywgMHgyRjhFLCAweDdGQjUsCisgICAgMHgyRjhELCAweDdGQjYsIDB4MTVCMCwgMHg3RkI3LCAweDMwRTgsIDB4N0ZCOCwgMHgxNUIyLCAweDdGQjksIDB4MTVCMSwKKyAgICAweDdGQkEsIDB4MzIxOCwgMHg3RkJCLCAweDMyRjMsIDB4N0ZCQywgMHgxNjg0LCAweDdGQkQsIDB4MDNGQiwgMHg3RkJFLAorICAgIDB4MUJDNiwgMHg3RkJGLCAweDA3RDYsIDB4N0ZDMCwgMHgxREIyLCAweDdGQzEsIDB4MDk3RCwgMHg3RkMyLCAweDFEQjEsCisgICAgMHg3RkMzLCAweDFEQjAsIDB4N0ZDNSwgMHgwOTdDLCAweDdGQzcsIDB4MUZGRCwgMHg3RkM5LCAweDFGRkYsIDB4N0ZDQSwKKyAgICAweDFGRjgsIDB4N0ZDQiwgMHgxRkY5LCAweDdGQ0MsIDB4MEI2NCwgMHg3RkNELCAweDFGRkEsIDB4N0ZDRSwgMHgwQjY1LAorICAgIDB4N0ZDRiwgMHgxRkZFLCAweDdGRDAsIDB4MUZGQiwgMHg3RkQxLCAweDFGRkMsIDB4N0ZEMiwgMHgwQjY2LCAweDdGRDQsCisgICAgMHgwRDFDLCAweDdGRDUsIDB4MEQxRCwgMHg3RkQ3LCAweDIyNzgsIDB4N0ZEQiwgMHgyNTE3LCAweDdGREMsIDB4MjUxOCwKKyAgICAweDdGREUsIDB4Mjc5QSwgMHg3RkRGLCAweDEwNzEsIDB4N0ZFMCwgMHgxMDZGLCAweDdGRTEsIDB4MTA3MCwgMHg3RkUyLAorICAgIDB4Mjc5NywgMHg3RkUzLCAweDI3OTgsIDB4N0ZFNSwgMHgyNzk5LCAweDdGRTYsIDB4MjlDQSwgMHg3RkU4LCAweDI5Q0IsCisgICAgMHg3RkU5LCAweDExRTgsIDB4N0ZFQSwgMHgyOUM4LCAweDdGRUIsIDB4MjlDNywgMHg3RkVDLCAweDI5QzksIDB4N0ZFRCwKKyAgICAweDI5QzYsIDB4N0ZFRSwgMHgxMzJELCAweDdGRUYsIDB4MkMyQiwgMHg3RkYwLCAweDEzMkIsIDB4N0ZGMSwgMHgxMzJDLAorICAgIDB4N0ZGMiwgMHgyRTA0LCAweDdGRjMsIDB4MTQ0NywgMHg3RkY0LCAweDJFMDMsIDB4N0ZGNSwgMHgyRUZGLCAweDdGRjcsCisgICAgMHgyRjhGLCAweDdGRjgsIDB4MkY5MCwgMHg3RkY5LCAweDE1MTQsIDB4N0ZGQiwgMHgxNTE1LCAweDdGRkMsIDB4MTQ0OCwKKyAgICAweDdGRkQsIDB4MzBFOSwgMHg3RkZFLCAweDMwRUEsIDB4N0ZGRiwgMHgzMjE5LCAweDgwMDAsIDB4MTYzNCwgMHg4MDAxLAorICAgIDB4MDNGQywgMHg4MDAzLCAweDAzRkQsIDB4ODAwNCwgMHgwOTdGLCAweDgwMDUsIDB4MDY2QiwgMHg4MDA2LCAweDA5N0UsCisgICAgMHg4MDA3LCAweDFCQzcsIDB4ODAwQiwgMHgwRDFFLCAweDgwMEMsIDB4MDNGRSwgMHg4MDBELCAweDA3RDgsIDB4ODAwRSwKKyAgICAweDFCQzgsIDB4ODAwRiwgMHgxQkM5LCAweDgwMTAsIDB4MDdENywgMHg4MDExLCAweDA3RDksIDB4ODAxMiwgMHgwM0ZGLAorICAgIDB4ODAxNCwgMHgxQkNBLCAweDgwMTUsIDB4MDk4MSwgMHg4MDE2LCAweDFEQjMsIDB4ODAxNywgMHgwOTgzLCAweDgwMTgsCisgICAgMHgwOTgwLCAweDgwMTksIDB4MDk4MiwgMHg4MDFCLCAweDIwMDIsIDB4ODAxQywgMHgwQjY3LCAweDgwMUUsIDB4MjAwMSwKKyAgICAweDgwMUYsIDB4MjAwMCwgMHg4MDIxLCAweDI1MTksIDB4ODAyNCwgMHgyNzlCLCAweDgwMjYsIDB4MTFFOSwgMHg4MDI4LAorICAgIDB4MTMyRSwgMHg4MDI5LCAweDJDMkQsIDB4ODAyQSwgMHgyQzJDLCAweDgwMkMsIDB4MkUwNSwgMHg4MDMwLCAweDMyRjQsCisgICAgMHg4MDMzLCAweDA0MDAsIDB4ODAzNCwgMHgxOEQ4LCAweDgwMzUsIDB4MUEyNywgMHg4MDM2LCAweDA3REEsIDB4ODAzNywKKyAgICAweDFCQ0IsIDB4ODAzOSwgMHgxREI1LCAweDgwM0QsIDB4MDk4NCwgMHg4MDNFLCAweDFEQjQsIDB4ODAzRiwgMHgwOTg1LAorICAgIDB4ODA0MywgMHgyMDA0LCAweDgwNDYsIDB4MEI2OSwgMHg4MDQ3LCAweDIwMDMsIDB4ODA0OCwgMHgyMDA1LCAweDgwNEEsCisgICAgMHgwQjY4LCAweDgwNEYsIDB4MjI3QSwgMHg4MDUwLCAweDIyN0IsIDB4ODA1MSwgMHgyMjc5LCAweDgwNTIsIDB4MEQxRiwKKyAgICAweDgwNTYsIDB4MEVDQiwgMHg4MDU4LCAweDBFQ0MsIDB4ODA1QSwgMHgxMDczLCAweDgwNUMsIDB4Mjc5RCwgMHg4MDVELAorICAgIDB4Mjc5QywgMHg4MDVFLCAweDEwNzIsIDB4ODA2NCwgMHgyOUNDLCAweDgwNjcsIDB4MjlDRCwgMHg4MDZDLCAweDJDMkUsCisgICAgMHg4MDZGLCAweDE0NEMsIDB4ODA3MCwgMHgxNDRCLCAweDgwNzEsIDB4MTQ0OSwgMHg4MDcyLCAweDE0NEEsIDB4ODA3MywKKyAgICAweDE0NEQsIDB4ODA3NSwgMHgyRjkxLCAweDgwNzYsIDB4MTUxNywgMHg4MDc3LCAweDE1MTYsIDB4ODA3OCwgMHgzMEVCLAorICAgIDB4ODA3OSwgMHgzMjFBLCAweDgwN0QsIDB4MTZEMywgMHg4MDdFLCAweDE2RDIsIDB4ODA3RiwgMHgwNDAxLCAweDgwODIsCisgICAgMHgxQ0VDLCAweDgwODQsIDB4MEVDRSwgMHg4MDg1LCAweDBEMjAsIDB4ODA4NiwgMHgwRUNELCAweDgwODcsIDB4MTA3NCwKKyAgICAweDgwODksIDB4MDQwMiwgMHg4MDhBLCAweDE3QjMsIDB4ODA4QiwgMHgwNDAzLCAweDgwOEMsIDB4MDQwNCwgMHg4MDhGLAorICAgIDB4MUEyOCwgMHg4MDkwLCAweDE4REIsIDB4ODA5MiwgMHgxOERDLCAweDgwOTMsIDB4MDRGRSwgMHg4MDk1LCAweDE4RDksCisgICAgMHg4MDk2LCAweDA0RkQsIDB4ODA5OCwgMHgwNTAwLCAweDgwOTksIDB4MThEQSwgMHg4MDlBLCAweDA1MDIsIDB4ODA5QiwKKyAgICAweDA1MDEsIDB4ODA5QywgMHgxOERELCAweDgwOUQsIDB4MDRGRiwgMHg4MEExLCAweDA2NzAsIDB4ODBBMiwgMHgwNjZFLAorICAgIDB4ODBBMywgMHgxQTJBLCAweDgwQTUsIDB4MDY2RCwgMHg4MEE5LCAweDA2NzIsIDB4ODBBQSwgMHgwNjc0LCAweDgwQUIsCisgICAgMHgwNjcxLCAweDgwQUQsIDB4MUEyRCwgMHg4MEFFLCAweDFBMjksIDB4ODBBRiwgMHgwNjc1LCAweDgwQjEsIDB4MDY2RiwKKyAgICAweDgwQjIsIDB4MDUwMywgMHg4MEI0LCAweDA2NzMsIDB4ODBCNSwgMHgxQTJDLCAweDgwQjgsIDB4MUEyQiwgMHg4MEJBLAorICAgIDB4MDY2QywgMHg4MEMyLCAweDFCRDEsIDB4ODBDMywgMHgwN0RFLCAweDgwQzQsIDB4MDdERiwgMHg4MEM1LCAweDFCRDMsCisgICAgMHg4MEM3LCAweDFCQ0QsIDB4ODBDOCwgMHgxQkQwLCAweDgwQzksIDB4MUJEOSwgMHg4MENBLCAweDFCRDcsIDB4ODBDQywKKyAgICAweDA3RTAsIDB4ODBDRCwgMHgxQkRELCAweDgwQ0UsIDB4MDdFMywgMHg4MENGLCAweDFCREEsIDB4ODBEMCwgMHgxQkQyLAorICAgIDB4ODBEMSwgMHgxQkNGLCAweDgwRDQsIDB4MjI3RCwgMHg4MEQ1LCAweDFCRDgsIDB4ODBENiwgMHgwN0RCLCAweDgwRDcsCisgICAgMHgxQkRCLCAweDgwRDgsIDB4MUJDQywgMHg4MEQ5LCAweDFCRDUsIDB4ODBEQSwgMHgwN0RELCAweDgwREIsIDB4MDdFMiwKKyAgICAweDgwREMsIDB4MUJENiwgMHg4MERELCAweDA3RTYsIDB4ODBERSwgMHgwN0U0LCAweDgwRTAsIDB4MUJDRSwgMHg4MEUxLAorICAgIDB4MDdFMSwgMHg4MEUzLCAweDFCRDQsIDB4ODBFNCwgMHgwN0U1LCAweDgwRTUsIDB4MDdEQywgMHg4MEU2LCAweDFCREMsCisgICAgMHg4MEVELCAweDA5OEEsIDB4ODBFRiwgMHgwOTkzLCAweDgwRjAsIDB4MDk4OCwgMHg4MEYxLCAweDA5ODYsIDB4ODBGMiwKKyAgICAweDFEQjcsIDB4ODBGMywgMHgwOThFLCAweDgwRjQsIDB4MDk4QiwgMHg4MEY1LCAweDFEQjksIDB4ODBGOCwgMHgwOThELAorICAgIDB4ODBGOSwgMHgxREI4LCAweDgwRkEsIDB4MURCNiwgMHg4MEZCLCAweDFEQkIsIDB4ODBGQywgMHgwOTkyLCAweDgwRkQsCisgICAgMHgwOTkwLCAweDgwRkUsIDB4MjI3QywgMHg4MTAwLCAweDFEQkMsIDB4ODEwMSwgMHgxREJBLCAweDgxMDIsIDB4MDk4NywKKyAgICAweDgxMDUsIDB4MDk4OSwgMHg4MTA2LCAweDA5OEMsIDB4ODEwOCwgMHgwOThGLCAweDgxMEEsIDB4MDk5MSwgMHg4MTE1LAorICAgIDB4MjAwRiwgMHg4MTE2LCAweDBCNkIsIDB4ODExOCwgMHgyMDA2LCAweDgxMTksIDB4MjAwOCwgMHg4MTFCLCAweDIwMDksCisgICAgMHg4MTFELCAweDIwMTEsIDB4ODExRSwgMHgyMDBELCAweDgxMUYsIDB4MjAwQiwgMHg4MTIxLCAweDIwMEUsIDB4ODEyMiwKKyAgICAweDIwMTIsIDB4ODEyMywgMHgwQjZDLCAweDgxMjQsIDB4MEI3MCwgMHg4MTI1LCAweDIwMDcsIDB4ODEyNywgMHgyMDEwLAorICAgIDB4ODEyOSwgMHgwQjZFLCAweDgxMkIsIDB4MEI2RCwgMHg4MTJDLCAweDIwMEMsIDB4ODEyRCwgMHgyMDBBLCAweDgxMkYsCisgICAgMHgwQjZBLCAweDgxMzAsIDB4MEI2RiwgMHg4MTM5LCAweDBEMjYsIDB4ODEzQSwgMHgyMjg1LCAweDgxM0QsIDB4MjI4MywKKyAgICAweDgxM0UsIDB4MEQyOCwgMHg4MTQzLCAweDIyN0UsIDB4ODE0NCwgMHgyNTI3LCAweDgxNDYsIDB4MEQyNywgMHg4MTQ3LAorICAgIDB4MjI4MiwgMHg4MTRBLCAweDIyN0YsIDB4ODE0QiwgMHgwRDIzLCAweDgxNEMsIDB4MEQyOSwgMHg4MTRELCAweDIyODQsCisgICAgMHg4MTRFLCAweDBEMjUsIDB4ODE0RiwgMHgyMjgxLCAweDgxNTAsIDB4MTA3NSwgMHg4MTUxLCAweDBEMjQsIDB4ODE1MiwKKyAgICAweDIyODAsIDB4ODE1MywgMHgwRDJBLCAweDgxNTQsIDB4MEQyMiwgMHg4MTU1LCAweDBEMjEsIDB4ODE1QiwgMHgyNTFGLAorICAgIDB4ODE1QywgMHgyNTFELCAweDgxNUUsIDB4MjUyMywgMHg4MTYwLCAweDI1MUIsIDB4ODE2MSwgMHgyNTI4LCAweDgxNjIsCisgICAgMHgyNTIwLCAweDgxNjQsIDB4MjUxQSwgMHg4MTY1LCAweDBFRDIsIDB4ODE2NiwgMHgwRUQ4LCAweDgxNjcsIDB4MjUyNSwKKyAgICAweDgxNjksIDB4MjUxRSwgMHg4MTZCLCAweDBFRDUsIDB4ODE2RSwgMHgwRUQzLCAweDgxNkYsIDB4MjUyNiwgMHg4MTcwLAorICAgIDB4MEVEMCwgMHg4MTcxLCAweDBFQ0YsIDB4ODE3MiwgMHgyNTIxLCAweDgxNzMsIDB4MEVENCwgMHg4MTc0LCAweDBEMkIsCisgICAgMHg4MTc2LCAweDI1MjQsIDB4ODE3NywgMHgyNTFDLCAweDgxNzgsIDB4MEVEMSwgMHg4MTc5LCAweDBFRDYsIDB4ODE3QSwKKyAgICAweDBFRDcsIDB4ODE3RiwgMHgxMDdBLCAweDgxODAsIDB4MTA3NiwgMHg4MTgyLCAweDEwN0IsIDB4ODE4MywgMHgyN0EwLAorICAgIDB4ODE4NiwgMHgyNzlGLCAweDgxODcsIDB4MjdBMSwgMHg4MTg4LCAweDEwNzgsIDB4ODE4OSwgMHgyNzlFLCAweDgxOEEsCisgICAgMHgxMDc5LCAweDgxOEIsIDB4MjdBNCwgMHg4MThDLCAweDI3QTMsIDB4ODE4RCwgMHgyN0EyLCAweDgxOEYsIDB4MTA3NywKKyAgICAweDgxOTUsIDB4MjlEMSwgMHg4MTk3LCAweDI5RDQsIDB4ODE5OCwgMHgxMUVGLCAweDgxOTksIDB4MjlEMywgMHg4MTlBLAorICAgIDB4MTFFRSwgMHg4MTlCLCAweDExRUEsIDB4ODE5QywgMHgxMUVCLCAweDgxOUQsIDB4MTFFQywgMHg4MTlFLCAweDI5RDAsCisgICAgMHg4MTlGLCAweDI5Q0YsIDB4ODFBMCwgMHgxMUVELCAweDgxQTIsIDB4MjlEMiwgMHg4MUEzLCAweDI5Q0UsIDB4ODFBNiwKKyAgICAweDJDMzAsIDB4ODFBNywgMHgyQzNBLCAweDgxQTgsIDB4MTMzMSwgMHg4MUE5LCAweDEzMzAsIDB4ODFBQiwgMHgyQzM0LAorICAgIDB4ODFBQywgMHgyQzM2LCAweDgxQUUsIDB4MkMzMSwgMHg4MUIwLCAweDJDMzUsIDB4ODFCMSwgMHgyQzJGLCAweDgxQjIsCisgICAgMHgyQzM4LCAweDgxQjMsIDB4MTMyRiwgMHg4MUI0LCAweDJDMzcsIDB4ODFCNSwgMHgyQzMzLCAweDgxQjcsIDB4MkMzOSwKKyAgICAweDgxQjksIDB4MkMzMiwgMHg4MUJBLCAweDE0NTAsIDB4ODFCQiwgMHgyRTA2LCAweDgxQkMsIDB4MkUwQywgMHg4MUJELAorICAgIDB4MTQ1NCwgMHg4MUJFLCAweDE0NTYsIDB4ODFCRiwgMHgxNDUzLCAweDgxQzAsIDB4MTQ1MiwgMHg4MUMyLCAweDE0NTEsCisgICAgMHg4MUMzLCAweDE0NEYsIDB4ODFDNCwgMHgyRTA3LCAweDgxQzUsIDB4MkUwQSwgMHg4MUM2LCAweDE0NEUsIDB4ODFDNywKKyAgICAweDJFMEIsIDB4ODFDOSwgMHgxNDU1LCAweDgxQ0EsIDB4MkUwOSwgMHg4MUNDLCAweDJFMDgsIDB4ODFDRCwgMHgxNTE4LAorICAgIDB4ODFDRiwgMHgxNTE5LCAweDgxRDAsIDB4MkY5NCwgMHg4MUQxLCAweDJGOTIsIDB4ODFEMiwgMHgyRjkzLCAweDgxRDUsCisgICAgMHgzMEVELCAweDgxRDcsIDB4MzBFQywgMHg4MUQ4LCAweDE1QjMsIDB4ODFEOSwgMHgzMjFDLCAweDgxREEsIDB4MTYzNSwKKyAgICAweDgxREIsIDB4MzIxQiwgMHg4MURELCAweDMyRjUsIDB4ODFERSwgMHgzM0E1LCAweDgxREYsIDB4MTZENCwgMHg4MUUwLAorICAgIDB4MzRERCwgMHg4MUUxLCAweDM0REUsIDB4ODFFMiwgMHgxNzA2LCAweDgxRTMsIDB4MDQwNSwgMHg4MUU1LCAweDA2NzYsCisgICAgMHg4MUU2LCAweDIyODYsIDB4ODFFNywgMHgxMDdDLCAweDgxRTgsIDB4MTQ1NywgMHg4MUU5LCAweDJFMEQsIDB4ODFFQSwKKyAgICAweDA0MDYsIDB4ODFFQywgMHgwOTk1LCAweDgxRUQsIDB4MDk5NCwgMHg4MUVFLCAweDIyODcsIDB4ODFGMiwgMHgyQzNCLAorICAgIDB4ODFGMywgMHgwNDA3LCAweDgxRjQsIDB4MDdFNywgMHg4MUY3LCAweDIyODgsIDB4ODFGOCwgMHgyMjg5LCAweDgxRjksCisgICAgMHgyMjhBLCAweDgxRkEsIDB4MTA3RCwgMHg4MUZCLCAweDEzMzIsIDB4ODFGQywgMHgwNDA4LCAweDgxRkUsIDB4MDY3NywKKyAgICAweDgxRkYsIDB4MUJERSwgMHg4MjAwLCAweDA5OTYsIDB4ODIwMSwgMHgxREJELCAweDgyMDIsIDB4MEI3MSwgMHg4MjA0LAorICAgIDB4MjI4QiwgMHg4MjA1LCAweDBFRDksIDB4ODIwNywgMHgxMDdFLCAweDgyMDgsIDB4MTMzMywgMHg4MjA5LCAweDE0NTgsCisgICAgMHg4MjBBLCAweDE1MUEsIDB4ODIwQiwgMHgzMEVFLCAweDgyMEMsIDB4MDQwOSwgMHg4MjBELCAweDA2NzgsIDB4ODIxMCwKKyAgICAweDA5OTcsIDB4ODIxMSwgMHgyMDEzLCAweDgyMTIsIDB4MEQyQywgMHg4MjE0LCAweDEwN0YsIDB4ODIxNSwgMHgyN0E1LAorICAgIDB4ODIxNiwgMHgyOUQ1LCAweDgyMUIsIDB4MDQwQSwgMHg4MjFDLCAweDBEMkQsIDB4ODIxRCwgMHgyNTI5LCAweDgyMUUsCisgICAgMHgxMDgwLCAweDgyMUYsIDB4MDQwQiwgMHg4MjIwLCAweDFBMkUsIDB4ODIyMSwgMHgxQkRGLCAweDgyMjIsIDB4MDdFOCwKKyAgICAweDgyMjUsIDB4MURCRiwgMHg4MjI4LCAweDA5OUEsIDB4ODIyQSwgMHgwOTk4LCAweDgyMkIsIDB4MDk5OSwgMHg4MjJDLAorICAgIDB4MDk5QiwgMHg4MjJGLCAweDFEQkUsIDB4ODIzMiwgMHgyMDE4LCAweDgyMzMsIDB4MjAxNSwgMHg4MjM0LCAweDIwMTcsCisgICAgMHg4MjM1LCAweDBCNzIsIDB4ODIzNiwgMHgwQjc0LCAweDgyMzcsIDB4MEI3MywgMHg4MjM4LCAweDIwMTQsIDB4ODIzOSwKKyAgICAweDBCNzUsIDB4ODIzQSwgMHgyMDE2LCAweDgyM0MsIDB4MjI4QywgMHg4MjNELCAweDIyOEQsIDB4ODIzRiwgMHgyMjhFLAorICAgIDB4ODI0MCwgMHgyNTJDLCAweDgyNDIsIDB4MjUyRCwgMHg4MjQ0LCAweDI1MkIsIDB4ODI0NSwgMHgyNTJFLCAweDgyNDcsCisgICAgMHgwRURBLCAweDgyNDksIDB4MjUyQSwgMHg4MjRCLCAweDEwODEsIDB4ODI0RSwgMHgyOURBLCAweDgyNEYsIDB4MjlENiwKKyAgICAweDgyNTAsIDB4MjlEOSwgMHg4MjUxLCAweDI5REIsIDB4ODI1MiwgMHgyOUQ4LCAweDgyNTMsIDB4MjlENywgMHg4MjU1LAorICAgIDB4MkMzQywgMHg4MjU2LCAweDJDM0QsIDB4ODI1NywgMHgyQzNFLCAweDgyNTgsIDB4MTMzNCwgMHg4MjU5LCAweDEzMzUsCisgICAgMHg4MjVBLCAweDJFMEYsIDB4ODI1QiwgMHgyRTBFLCAweDgyNUMsIDB4MkUxMCwgMHg4MjVFLCAweDJGOTYsIDB4ODI1RiwKKyAgICAweDJGOTUsIDB4ODI2MSwgMHgzMEYwLCAweDgyNjMsIDB4MzBGMSwgMHg4MjY0LCAweDMwRUYsIDB4ODI2NiwgMHgxNjM2LAorICAgIDB4ODI2OCwgMHgzMjFELCAweDgyNjksIDB4MzIxRSwgMHg4MjZCLCAweDMzQTYsIDB4ODI2QywgMHgzNDJELCAweDgyNkQsCisgICAgMHgzNDk2LCAweDgyNkUsIDB4MDQwQywgMHg4MjZGLCAweDA1MDQsIDB4ODI3MSwgMHgxNDU5LCAweDgyNzIsIDB4MDQwRCwKKyAgICAweDgyNzQsIDB4MjAxOSwgMHg4Mjc1LCAweDIyOEYsIDB4ODI3NywgMHgxNzJFLCAweDgyNzgsIDB4MTgxMywgMHg4MjdDLAorICAgIDB4MTgxNCwgMHg4MjdELCAweDE4MTYsIDB4ODI3RSwgMHgwNDBFLCAweDgyN0YsIDB4MTgxNywgMHg4MjgwLCAweDE4MTUsCisgICAgMHg4MjgzLCAweDE4RTUsIDB4ODI4NCwgMHgxOEU2LCAweDgyODUsIDB4MThFMCwgMHg4MjhBLCAweDE4RTQsIDB4ODI4QiwKKyAgICAweDA1MDYsIDB4ODI4RCwgMHgwNTA3LCAweDgyOEUsIDB4MThFMSwgMHg4MjhGLCAweDE4REYsIDB4ODI5MCwgMHgxOERFLAorICAgIDB4ODI5MSwgMHgxOEUyLCAweDgyOTIsIDB4MDUwNSwgMHg4MjkzLCAweDE4RTMsIDB4ODI5NCwgMHgxQkUwLCAweDgyOTgsCisgICAgMHgxQTMzLCAweDgyOTksIDB4MDY3QiwgMHg4MjlBLCAweDFBMzIsIDB4ODI5QiwgMHgxQTM0LCAweDgyOUQsIDB4MDY3QSwKKyAgICAweDgyOUUsIDB4MUEzOSwgMHg4MjlGLCAweDA2N0UsIDB4ODJBMCwgMHgxQTJGLCAweDgyQTEsIDB4MUEzRCwgMHg4MkEyLAorICAgIDB4MUE0MywgMHg4MkEzLCAweDA2ODUsIDB4ODJBNCwgMHgxQTQwLCAweDgyQTUsIDB4MDY4MiwgMHg4MkE3LCAweDFBMzYsCisgICAgMHg4MkE4LCAweDFBM0MsIDB4ODJBOSwgMHgxQTNFLCAweDgyQUIsIDB4MUEzMSwgMHg4MkFDLCAweDA2ODEsIDB4ODJBRCwKKyAgICAweDA2N0MsIDB4ODJBRSwgMHgxQTM3LCAweDgyQUYsIDB4MDY4MywgMHg4MkIwLCAweDA2ODYsIDB4ODJCMSwgMHgwNjgwLAorICAgIDB4ODJCMywgMHgwNjc5LCAweDgyQjQsIDB4MUEzQiwgMHg4MkI1LCAweDFBMzUsIDB4ODJCNiwgMHgxQTQyLCAweDgyQjcsCisgICAgMHgwNjg4LCAweDgyQjgsIDB4MDY4NCwgMHg4MkI5LCAweDA2N0YsIDB4ODJCQSwgMHgxQTNBLCAweDgyQkIsIDB4MDk5QywKKyAgICAweDgyQkMsIDB4MUEzOCwgMHg4MkJELCAweDA2N0QsIDB4ODJCRSwgMHgwNjg3LCAweDgyQzAsIDB4MUEzMCwgMHg4MkMyLAorICAgIDB4MUEzRiwgMHg4MkMzLCAweDFBNDEsIDB4ODJEMSwgMHgwN0Y5LCAweDgyRDIsIDB4MDdGMywgMHg4MkQzLCAweDA3RkIsCisgICAgMHg4MkQ0LCAweDA3RjgsIDB4ODJENSwgMHgxQkU3LCAweDgyRDYsIDB4MUJFQSwgMHg4MkQ3LCAweDA3RjQsIDB4ODJEOSwKKyAgICAweDFCRTEsIDB4ODJEQiwgMHgwN0VELCAweDgyREMsIDB4MDdGNywgMHg4MkRFLCAweDA3RkEsIDB4ODJERiwgMHgwN0ZDLAorICAgIDB4ODJFMCwgMHgxQkY2LCAweDgyRTEsIDB4MUJFRCwgMHg4MkUzLCAweDA3RUMsIDB4ODJFNCwgMHgxQkY1LCAweDgyRTUsCisgICAgMHgwN0YwLCAweDgyRTYsIDB4MDdFRSwgMHg4MkU3LCAweDA3RTksIDB4ODJFOCwgMHgxQkU1LCAweDgyRUEsIDB4MUJGNCwKKyAgICAweDgyRUIsIDB4MUJFOSwgMHg4MkVDLCAweDFCRUMsIDB4ODJFRCwgMHgxQkY5LCAweDgyRUYsIDB4MDdGRCwgMHg4MkYwLAorICAgIDB4MUJGMywgMHg4MkYxLCAweDA3RjUsIDB4ODJGMiwgMHgxQkVFLCAweDgyRjMsIDB4MUJGOCwgMHg4MkY0LCAweDFCRUIsCisgICAgMHg4MkY1LCAweDFCRUYsIDB4ODJGNiwgMHgxQkYyLCAweDgyRjksIDB4MUJFMywgMHg4MkZBLCAweDFCRjcsIDB4ODJGQiwKKyAgICAweDFCRjEsIDB4ODJGRSwgMHgxQkUyLCAweDgzMDAsIDB4MUJFNiwgMHg4MzAxLCAweDA3RjYsIDB4ODMwMiwgMHgwN0YxLAorICAgIDB4ODMwMywgMHgwN0VBLCAweDgzMDQsIDB4MDdFRiwgMHg4MzA1LCAweDA3RUIsIDB4ODMwNiwgMHgwN0ZFLCAweDgzMDcsCisgICAgMHgxQkU0LCAweDgzMDgsIDB4MUREMCwgMHg4MzA5LCAweDA3RjIsIDB4ODMwQywgMHgxQkYwLCAweDgzMEQsIDB4MUE3RCwKKyAgICAweDgzMTYsIDB4MUREMywgMHg4MzE3LCAweDA5QUEsIDB4ODMxOSwgMHgxREMzLCAweDgzMUIsIDB4MURDRSwgMHg4MzFDLAorICAgIDB4MURDQSwgMHg4MzFFLCAweDFEREQsIDB4ODMyMCwgMHgxREQ1LCAweDgzMjIsIDB4MURDQiwgMHg4MzI0LCAweDFERDQsCisgICAgMHg4MzI1LCAweDFEQzUsIDB4ODMyNiwgMHgxREM5LCAweDgzMjcsIDB4MURFMCwgMHg4MzI4LCAweDA5QUQsIDB4ODMyOSwKKyAgICAweDFERDgsIDB4ODMyQSwgMHgxRENGLCAweDgzMkIsIDB4MDk5RCwgMHg4MzJDLCAweDFEREUsIDB4ODMyRCwgMHgxREMxLAorICAgIDB4ODMyRiwgMHgxREQ3LCAweDgzMzEsIDB4MDlBQywgMHg4MzMyLCAweDA5QTcsIDB4ODMzMywgMHgxREMwLCAweDgzMzQsCisgICAgMHgwOUE1LCAweDgzMzUsIDB4MDlBNCwgMHg4MzM2LCAweDA5QTksIDB4ODMzNywgMHgxREQ2LCAweDgzMzgsIDB4MDlBMSwKKyAgICAweDgzMzksIDB4MDlBOCwgMHg4MzNBLCAweDFCRTgsIDB4ODMzQiwgMHgyMjkwLCAweDgzM0MsIDB4MUREMSwgMHg4MzNGLAorICAgIDB4MURDNywgMHg4MzQwLCAweDA5QUIsIDB4ODM0MSwgMHgxREM4LCAweDgzNDIsIDB4MURDQywgMHg4MzQzLCAweDA5QUUsCisgICAgMHg4MzQ0LCAweDFEQzIsIDB4ODM0NSwgMHgxRERBLCAweDgzNDcsIDB4MUREOSwgMHg4MzQ4LCAweDFERTEsIDB4ODM0OSwKKyAgICAweDA5QTMsIDB4ODM0QSwgMHgwOUEwLCAweDgzNEIsIDB4MURERiwgMHg4MzRDLCAweDFEREIsIDB4ODM0RCwgMHgxREQyLAorICAgIDB4ODM0RSwgMHgxRENELCAweDgzNEYsIDB4MDlBNiwgMHg4MzUwLCAweDA5QTIsIDB4ODM1MSwgMHgxREM0LCAweDgzNTIsCisgICAgMHgwOTlFLCAweDgzNTMsIDB4MUREQywgMHg4MzU0LCAweDA5OUYsIDB4ODM1NiwgMHgxREM2LCAweDgzNzMsIDB4MjAxRiwKKyAgICAweDgzNzQsIDB4MjAyMSwgMHg4Mzc1LCAweDIwMjYsIDB4ODM3NiwgMHgyMDNBLCAweDgzNzcsIDB4MEI4MywgMHg4Mzc4LAorICAgIDB4MEI3OSwgMHg4MzdBLCAweDIwMUUsIDB4ODM3QiwgMHgwQjg0LCAweDgzN0MsIDB4MEI4NSwgMHg4MzdELCAweDIwMjksCisgICAgMHg4MzdFLCAweDIwMzAsIDB4ODM3RiwgMHgyMDM2LCAweDgzODEsIDB4MjAyMywgMHg4MzgzLCAweDIwMkEsIDB4ODM4NiwKKyAgICAweDBCODYsIDB4ODM4NywgMHgyMDM4LCAweDgzODgsIDB4MjAzMywgMHg4Mzg5LCAweDBCODEsIDB4ODM4QSwgMHgwQjdGLAorICAgIDB4ODM4QiwgMHgyMDJGLCAweDgzOEMsIDB4MjAyQiwgMHg4MzhELCAweDIwMUQsIDB4ODM4RSwgMHgwQjc2LCAweDgzOEYsCisgICAgMHgyMDIyLCAweDgzOTAsIDB4MjAxQSwgMHg4MzkyLCAweDBCN0UsIDB4ODM5MywgMHgwQjgwLCAweDgzOTQsIDB4MjAyNywKKyAgICAweDgzOTUsIDB4MjAyNCwgMHg4Mzk2LCAweDBCN0IsIDB4ODM5NywgMHgyMDM0LCAweDgzOTgsIDB4MEI3OCwgMHg4Mzk5LAorICAgIDB4MjAyNSwgMHg4MzlBLCAweDIyQjksIDB4ODM5QiwgMHgyMDJELCAweDgzOUQsIDB4MjAyQywgMHg4MzlFLCAweDBCNzcsCisgICAgMHg4M0EwLCAweDBCODIsIDB4ODNBMiwgMHgwQjdBLCAweDgzQTMsIDB4MjAxQiwgMHg4M0E0LCAweDIwMjAsIDB4ODNBNSwKKyAgICAweDIwMzEsIDB4ODNBNiwgMHgyMDM3LCAweDgzQTcsIDB4MEI4NywgMHg4M0E4LCAweDIwMUMsIDB4ODNBOSwgMHgyMDI4LAorICAgIDB4ODNBQSwgMHgyMDJFLCAweDgzQUIsIDB4MEI3RCwgMHg4M0FFLCAweDIwMzksIDB4ODNBRiwgMHgyMDMyLCAweDgzQjAsCisgICAgMHgyMDM1LCAweDgzQkQsIDB4MEI3QywgMHg4M0JGLCAweDIyQTAsIDB4ODNDMCwgMHgyMjk0LCAweDgzQzEsIDB4MEQzNSwKKyAgICAweDgzQzIsIDB4MjJCMSwgMHg4M0MzLCAweDIyQkEsIDB4ODNDNCwgMHgyMkJELCAweDgzQzUsIDB4MEQzMywgMHg4M0M2LAorICAgIDB4MjI5QywgMHg4M0M3LCAweDIyQjUsIDB4ODNDOCwgMHgyMjlELCAweDgzQzksIDB4MjJBQiwgMHg4M0NBLCAweDBENDAsCisgICAgMHg4M0NCLCAweDIyQTcsIDB4ODNDQywgMHgwRDNELCAweDgzQ0UsIDB4MjJBOCwgMHg4M0NGLCAweDIyOTEsIDB4ODNEMSwKKyAgICAweDIyQjYsIDB4ODNENCwgMHgwRDQ2LCAweDgzRDUsIDB4MjJCMywgMHg4M0Q2LCAweDIyQTksIDB4ODNENywgMHgyMkJGLAorICAgIDB4ODNEOCwgMHgyMkE0LCAweDgzRDksIDB4MjU0RSwgMHg4M0RCLCAweDIyQzIsIDB4ODNEQywgMHgwRDQ0LCAweDgzREQsCisgICAgMHgyMkEyLCAweDgzREUsIDB4MjJBRSwgMHg4M0RGLCAweDBENDcsIDB4ODNFMCwgMHgwRDMyLCAweDgzRTEsIDB4MjJBNiwKKyAgICAweDgzRTIsIDB4MjJDMCwgMHg4M0UzLCAweDIyOUYsIDB4ODNFNCwgMHgyMjk4LCAweDgzRTUsIDB4MjJBMywgMHg4M0U3LAorICAgIDB4MjI5NywgMHg4M0U4LCAweDIyOTUsIDB4ODNFOSwgMHgwRDJFLCAweDgzRUEsIDB4MjJCNywgMHg4M0VCLCAweDIyOUUsCisgICAgMHg4M0VDLCAweDIyQkIsIDB4ODNFRSwgMHgyMkJDLCAweDgzRUYsIDB4MEQzNiwgMHg4M0YwLCAweDBEM0IsIDB4ODNGMSwKKyAgICAweDBEMzcsIDB4ODNGMiwgMHgwRDNGLCAweDgzRjMsIDB4MjJCMiwgMHg4M0Y0LCAweDBEMzgsIDB4ODNGNSwgMHgyMkFBLAorICAgIDB4ODNGNiwgMHgyMjlBLCAweDgzRjgsIDB4MEQzMCwgMHg4M0Y5LCAweDIyOTIsIDB4ODNGQSwgMHgyMkI0LCAweDgzRkIsCisgICAgMHgyMkJFLCAweDgzRkMsIDB4MjI5OSwgMHg4M0ZELCAweDBEM0UsIDB4ODNGRSwgMHgyMkMzLCAweDgzRkYsIDB4MjJBNSwKKyAgICAweDg0MDEsIDB4MjJBMSwgMHg4NDAzLCAweDBEMkYsIDB4ODQwNCwgMHgwRDQzLCAweDg0MDYsIDB4MjJCMCwgMHg4NDA3LAorICAgIDB4MEQ0NSwgMHg4NDA5LCAweDIyQUMsIDB4ODQwQSwgMHgwRDNBLCAweDg0MEIsIDB4MEQzNCwgMHg4NDBDLCAweDBEM0MsCisgICAgMHg4NDBELCAweDBEMzEsIDB4ODQwRSwgMHgwRDQyLCAweDg0MEYsIDB4MjJBRCwgMHg4NDEwLCAweDIyOUIsIDB4ODQxMSwKKyAgICAweDIyQUYsIDB4ODQxMiwgMHgyMjk2LCAweDg0MTMsIDB4MjJCOCwgMHg4NDFCLCAweDIyQzEsIDB4ODQyMywgMHgyMjkzLAorICAgIDB4ODQyOSwgMHgyNTRELCAweDg0MkIsIDB4MjU2MywgMHg4NDJDLCAweDBFQUMsIDB4ODQyRCwgMHgyNTUyLCAweDg0MkYsCisgICAgMHgyNTUwLCAweDg0MzAsIDB4MjUzQiwgMHg4NDMxLCAweDBFREUsIDB4ODQzMiwgMHgyNTRCLCAweDg0MzMsIDB4MjU1RiwKKyAgICAweDg0MzQsIDB4MjU0NywgMHg4NDM1LCAweDBFRTYsIDB4ODQzNiwgMHgyNTVFLCAweDg0MzcsIDB4MjU0NSwgMHg4NDM4LAorICAgIDB4MEQ0MSwgMHg4NDM5LCAweDI1NTUsIDB4ODQzQSwgMHgyNTQ2LCAweDg0M0IsIDB4MjU1QywgMHg4NDNDLCAweDBFRTUsCisgICAgMHg4NDNELCAweDBFREQsIDB4ODQzRiwgMHgyNTMwLCAweDg0NDAsIDB4MjUzOCwgMHg4NDQyLCAweDI1NTEsIDB4ODQ0MywKKyAgICAweDI1NDksIDB4ODQ0NCwgMHgyNTYyLCAweDg0NDUsIDB4MjU0QywgMHg4NDQ2LCAweDBFRUIsIDB4ODQ0NywgMHgyNTVELAorICAgIDB4ODQ0OSwgMHgwRUUyLCAweDg0NEIsIDB4MjU0RiwgMHg4NDRDLCAweDI1NTcsIDB4ODQ0RCwgMHgyNTNDLCAweDg0NEUsCisgICAgMHgyNTU2LCAweDg0NTAsIDB4MjU2NywgMHg4NDUxLCAweDI1MzcsIDB4ODQ1MiwgMHgyNTU4LCAweDg0NTQsIDB4MjU2NSwKKyAgICAweDg0NTYsIDB4MjUzMSwgMHg4NDU3LCAweDBEMzksIDB4ODQ1OSwgMHgyNTNGLCAweDg0NUEsIDB4MjUzRSwgMHg4NDVCLAorICAgIDB4MEVFNCwgMHg4NDVELCAweDI1NDIsIDB4ODQ1RSwgMHgyNTQ0LCAweDg0NUYsIDB4MjU1MywgMHg4NDYwLCAweDI1NjQsCisgICAgMHg4NDYxLCAweDBFRTcsIDB4ODQ2MywgMHgwRUU4LCAweDg0NjUsIDB4MjUzNiwgMHg4NDY2LCAweDBFRTAsIDB4ODQ2NywKKyAgICAweDI1M0EsIDB4ODQ2OCwgMHgyNTYwLCAweDg0NjksIDB4MEVFOSwgMHg4NDZCLCAweDBFRTEsIDB4ODQ2QywgMHgwRUUzLAorICAgIDB4ODQ2RCwgMHgwRUVBLCAweDg0NkUsIDB4MjU2NiwgMHg4NDZGLCAweDI1NTksIDB4ODQ3MCwgMHgyNTU0LCAweDg0NzMsCisgICAgMHgyNTQxLCAweDg0NzQsIDB4MjU0MCwgMHg4NDc1LCAweDBFREYsIDB4ODQ3NiwgMHgyNTMyLCAweDg0NzcsIDB4MEVEQywKKyAgICAweDg0NzgsIDB4MjU0QSwgMHg4NDc5LCAweDI1MzMsIDB4ODQ3QSwgMHgyNTQ4LCAweDg0N0QsIDB4MjUzRCwgMHg4NDdFLAorICAgIDB4MjU2MSwgMHg4NDgyLCAweDBFREIsIDB4ODQ4NiwgMHgyNTM5LCAweDg0OEQsIDB4MjUzNSwgMHg4NDhFLCAweDI1NUIsCisgICAgMHg4NDhGLCAweDI1MzQsIDB4ODQ5MCwgMHgxMDhFLCAweDg0OTEsIDB4MjdDRCwgMHg4NDk0LCAweDI3QkMsIDB4ODQ5NywKKyAgICAweDI3QTYsIDB4ODQ5OCwgMHgyN0M0LCAweDg0OTksIDB4MTA4NiwgMHg4NDlBLCAweDI3QjUsIDB4ODQ5QiwgMHgyN0JGLAorICAgIDB4ODQ5QywgMHgxMDg5LCAweDg0OUQsIDB4MjdCOCwgMHg4NDlFLCAweDEwODcsIDB4ODQ5RiwgMHgyN0E5LCAweDg0QTAsCisgICAgMHgyN0M3LCAweDg0QTEsIDB4MjdBOCwgMHg4NEEyLCAweDI3QkIsIDB4ODRBNCwgMHgyN0E3LCAweDg0QTcsIDB4MjdCOSwKKyAgICAweDg0QTgsIDB4MjdDMiwgMHg4NEE5LCAweDI3QzAsIDB4ODRBQSwgMHgyN0I0LCAweDg0QUIsIDB4MjdBRiwgMHg4NEFDLAorICAgIDB4MjdBRCwgMHg4NEFFLCAweDI3QUUsIDB4ODRBRiwgMHgyN0MxLCAweDg0QjAsIDB4MjdDQywgMHg4NEIxLCAweDI3QjYsCisgICAgMHg4NEIyLCAweDEwODgsIDB4ODRCNCwgMHgyN0IxLCAweDg0QjYsIDB4MjdDNSwgMHg4NEI4LCAweDEwOEIsIDB4ODRCOSwKKyAgICAweDI3QjAsIDB4ODRCQSwgMHgyN0FBLCAweDg0QkIsIDB4MjdCQSwgMHg4NEJDLCAweDEwOEYsIDB4ODRCRiwgMHgxMDgzLAorICAgIDB4ODRDMCwgMHgxMDhDLCAweDg0QzEsIDB4MjdCMiwgMHg4NEMyLCAweDI3QUMsIDB4ODRDNCwgMHgxMDg1LCAweDg0QzUsCisgICAgMHgyNTVBLCAweDg0QzYsIDB4MTA4NCwgMHg4NEM3LCAweDI3QkQsIDB4ODRDOSwgMHgxMDgyLCAweDg0Q0EsIDB4MTA5MSwKKyAgICAweDg0Q0IsIDB4MTA4QSwgMHg4NENDLCAweDI3QkUsIDB4ODRDRCwgMHgyN0IzLCAweDg0Q0UsIDB4MjdBQiwgMHg4NENGLAorICAgIDB4MjdDNiwgMHg4NEQwLCAweDI3QjcsIDB4ODREMSwgMHgxMDkwLCAweDg0RDIsIDB4MjdDQSwgMHg4NEQzLCAweDEwOEQsCisgICAgMHg4NEQ0LCAweDI3QzksIDB4ODRENiwgMHgyN0MzLCAweDg0RDcsIDB4MjdDOCwgMHg4NERCLCAweDI3Q0IsIDB4ODRFNywKKyAgICAweDJBMDMsIDB4ODRFOCwgMHgyQTA0LCAweDg0RTksIDB4MjlGNywgMHg4NEVBLCAweDI5RjYsIDB4ODRFQiwgMHgyOUYyLAorICAgIDB4ODRFQywgMHgxMUZCLCAweDg0RUUsIDB4MTFGMywgMHg4NEVGLCAweDJBMDYsIDB4ODRGMCwgMHgyQTA1LCAweDg0RjEsCisgICAgMHgyNTJGLCAweDg0RjIsIDB4MjlFRiwgMHg4NEYzLCAweDI5RjMsIDB4ODRGNCwgMHgyOUVELCAweDg0RjYsIDB4MkEwMCwKKyAgICAweDg0RjcsIDB4MjlGMSwgMHg4NEY5LCAweDJBMDcsIDB4ODRGQSwgMHgyOUVBLCAweDg0RkIsIDB4MjlFOCwgMHg4NEZDLAorICAgIDB4MjlGNCwgMHg4NEZELCAweDI5RkUsIDB4ODRGRSwgMHgyOUY5LCAweDg0RkYsIDB4MTFGRCwgMHg4NTAwLCAweDI5REYsCisgICAgMHg4NTAyLCAweDI5RkQsIDB4ODUwNiwgMHgxMUZFLCAweDg1MDcsIDB4MjU0MywgMHg4NTA4LCAweDI5RUIsIDB4ODUwOSwKKyAgICAweDI5RTIsIDB4ODUwQSwgMHgyOUU1LCAweDg1MEIsIDB4MkEwQiwgMHg4NTBDLCAweDI5RUMsIDB4ODUwRCwgMHgyOUUzLAorICAgIDB4ODUwRSwgMHgyOUUxLCAweDg1MEYsIDB4MjlERSwgMHg4NTExLCAweDExRjcsIDB4ODUxMiwgMHgyOUY1LCAweDg1MTMsCisgICAgMHgxMUY2LCAweDg1MTQsIDB4MTFGQSwgMHg4NTE1LCAweDI5RjAsIDB4ODUxNiwgMHgyOUY4LCAweDg1MTcsIDB4MTFGMCwKKyAgICAweDg1MTgsIDB4MkEwOCwgMHg4NTE5LCAweDJBMEMsIDB4ODUxQSwgMHgxMUYyLCAweDg1MUMsIDB4MjlFNywgMHg4NTFELAorICAgIDB4MjlGQiwgMHg4NTFFLCAweDI5RkYsIDB4ODUxRiwgMHgyOUU0LCAweDg1MjAsIDB4MkEwOSwgMHg4NTIxLCAweDExRjksCisgICAgMHg4NTIzLCAweDExRjgsIDB4ODUyNCwgMHgyOURDLCAweDg1MjUsIDB4MTFGQywgMHg4NTI2LCAweDJBMDIsIDB4ODUyNywKKyAgICAweDI5RTYsIDB4ODUyOCwgMHgyOUZBLCAweDg1MjksIDB4MjlFMCwgMHg4NTJBLCAweDI5RUUsIDB4ODUyQiwgMHgyOUU5LAorICAgIDB4ODUyQywgMHgxMUY0LCAweDg1MkQsIDB4MTFGNSwgMHg4NTJFLCAweDI5RkMsIDB4ODUyRiwgMHgyQTBELCAweDg1MzAsCisgICAgMHgyQTBBLCAweDg1MzEsIDB4MkEwMSwgMHg4NTNCLCAweDI5REQsIDB4ODUzRCwgMHgxMUYxLCAweDg1M0UsIDB4MkM0RiwKKyAgICAweDg1NDAsIDB4MkM0NiwgMHg4NTQxLCAweDJDNDksIDB4ODU0MywgMHgxMzNCLCAweDg1NDQsIDB4MkM0QiwgMHg4NTQ1LAorICAgIDB4MkM0MCwgMHg4NTQ2LCAweDJDNDcsIDB4ODU0NywgMHgyQzRELCAweDg1NDgsIDB4MTMzOCwgMHg4NTQ5LCAweDEzM0MsCisgICAgMHg4NTRBLCAweDEzMzYsIDB4ODU0RCwgMHgyQzQyLCAweDg1NEUsIDB4MkM1MiwgMHg4NTUxLCAweDJDNEMsIDB4ODU1MywKKyAgICAweDJDNDMsIDB4ODU1NCwgMHgyQzVCLCAweDg1NTUsIDB4MkM1NSwgMHg4NTU2LCAweDJDM0YsIDB4ODU1NywgMHgyRTIzLAorICAgIDB4ODU1OCwgMHgyQzQ1LCAweDg1NTksIDB4MTMzNywgMHg4NTVCLCAweDJDNTAsIDB4ODU1RCwgMHgyQzVBLCAweDg1NUUsCisgICAgMHgxMzNGLCAweDg1NjAsIDB4MkM1NywgMHg4NTYxLCAweDJDNDQsIDB4ODU2MiwgMHgyQzRBLCAweDg1NjMsIDB4MkM0RSwKKyAgICAweDg1NjQsIDB4MkM0OCwgMHg4NTY1LCAweDJDNUMsIDB4ODU2NiwgMHgyQzU5LCAweDg1NjcsIDB4MkM1NiwgMHg4NTY4LAorICAgIDB4MTMzOSwgMHg4NTY5LCAweDEzM0EsIDB4ODU2QSwgMHgxMzNFLCAweDg1NkIsIDB4MkM0MSwgMHg4NTZDLCAweDJDNUQsCisgICAgMHg4NTZELCAweDEzM0QsIDB4ODU2RSwgMHgyQzUzLCAweDg1NzEsIDB4MkM1MSwgMHg4NTc1LCAweDJDNTQsIDB4ODU3NiwKKyAgICAweDJFMzAsIDB4ODU3NywgMHgyRTFELCAweDg1NzgsIDB4MkUyMiwgMHg4NTc5LCAweDJFMkYsIDB4ODU3QSwgMHgyRTIxLAorICAgIDB4ODU3QiwgMHgyRTE5LCAweDg1N0MsIDB4MkUxRSwgMHg4NTdFLCAweDE0NUMsIDB4ODU4MCwgMHgyRTEyLCAweDg1ODEsCisgICAgMHgyRTJBLCAweDg1ODIsIDB4MkUyQywgMHg4NTgzLCAweDJFMTEsIDB4ODU4NCwgMHgxNDVCLCAweDg1ODUsIDB4MkUyRSwKKyAgICAweDg1ODYsIDB4MkUyNiwgMHg4NTg3LCAweDE0NjIsIDB4ODU4OCwgMHgyRTJELCAweDg1ODksIDB4MkUxRiwgMHg4NThBLAorICAgIDB4MTQ2NCwgMHg4NThCLCAweDJFMTcsIDB4ODU4QywgMHgyQzU4LCAweDg1OEQsIDB4MkUyNywgMHg4NThFLCAweDJFMjQsCisgICAgMHg4NThGLCAweDJFMTMsIDB4ODU5MCwgMHgyRTMyLCAweDg1OTEsIDB4MTQ1RSwgMHg4NTk0LCAweDE0NUYsIDB4ODU5NSwKKyAgICAweDJFMTUsIDB4ODU5NiwgMHgyRTI1LCAweDg1OTgsIDB4MkUzMSwgMHg4NTk5LCAweDJFMjgsIDB4ODU5QSwgMHgyRTFCLAorICAgIDB4ODU5QiwgMHgxNDYxLCAweDg1OUMsIDB4MTQ1RCwgMHg4NTlELCAweDJFMjksIDB4ODU5RSwgMHgyRTFDLCAweDg1OUYsCisgICAgMHgyRTMzLCAweDg1QTAsIDB4MkUxNiwgMHg4NUExLCAweDJFMjAsIDB4ODVBMiwgMHgyRTJCLCAweDg1QTMsIDB4MkUxOCwKKyAgICAweDg1QTQsIDB4MkUxQSwgMHg4NUE2LCAweDE0NjUsIDB4ODVBNywgMHgyRTE0LCAweDg1QTgsIDB4MTQ2MywgMHg4NUE5LAorICAgIDB4MTUxQywgMHg4NUFBLCAweDE0NUEsIDB4ODVBRiwgMHgxNDYwLCAweDg1QjAsIDB4MTUyMCwgMHg4NUIxLCAweDJGQTYsCisgICAgMHg4NUIzLCAweDJGOUMsIDB4ODVCNCwgMHgyRjk3LCAweDg1QjUsIDB4MkY5RCwgMHg4NUI2LCAweDJGQTcsIDB4ODVCNywKKyAgICAweDJGQUIsIDB4ODVCOCwgMHgyRkFBLCAweDg1QjksIDB4MTUyMiwgMHg4NUJBLCAweDE1MjEsIDB4ODVCRCwgMHgyRjlFLAorICAgIDB4ODVCRSwgMHgyRkFDLCAweDg1QkYsIDB4MkZBMSwgMHg4NUMwLCAweDJGOTksIDB4ODVDMiwgMHgyRjlCLCAweDg1QzMsCisgICAgMHgyRjlBLCAweDg1QzQsIDB4MkZBMCwgMHg4NUM1LCAweDJGQTUsIDB4ODVDNiwgMHgyRjk4LCAweDg1QzcsIDB4MkY5RiwKKyAgICAweDg1QzgsIDB4MkZBNCwgMHg4NUM5LCAweDE1MUYsIDB4ODVDQiwgMHgyRkEyLCAweDg1Q0QsIDB4MTUxRCwgMHg4NUNFLAorICAgIDB4MkZBMywgMHg4NUNGLCAweDE1MUIsIDB4ODVEMCwgMHgxNTFFLCAweDg1RDEsIDB4MzEwMSwgMHg4NUQyLCAweDJGQTgsCisgICAgMHg4NUQ1LCAweDE1QjcsIDB4ODVENywgMHgzMEY5LCAweDg1RDgsIDB4MzBGRCwgMHg4NUQ5LCAweDMwRjUsIDB4ODVEQSwKKyAgICAweDMwRjgsIDB4ODVEQywgMHgzMTAwLCAweDg1REQsIDB4MTVCNSwgMHg4NURFLCAweDMxMDUsIDB4ODVERiwgMHgzMEZFLAorICAgIDB4ODVFMSwgMHgzMEY2LCAweDg1RTIsIDB4MzEwNiwgMHg4NUUzLCAweDMwRkYsIDB4ODVFNCwgMHgxNUI4LCAweDg1RTUsCisgICAgMHgxNUI5LCAweDg1RTYsIDB4MzEwMywgMHg4NUU4LCAweDMwRjcsIDB4ODVFOSwgMHgxNUI0LCAweDg1RUEsIDB4MTVCNiwKKyAgICAweDg1RUIsIDB4MzBGMiwgMHg4NUVDLCAweDMwRkEsIDB4ODVFRCwgMHgzMEY0LCAweDg1RUYsIDB4MzEwNCwgMHg4NUYwLAorICAgIDB4MzEwMiwgMHg4NUYxLCAweDMwRjMsIDB4ODVGMiwgMHgzMEZCLCAweDg1RjYsIDB4MzIyNSwgMHg4NUY3LCAweDE1QkEsCisgICAgMHg4NUY4LCAweDMwRkMsIDB4ODVGOSwgMHgxNjM4LCAweDg1RkEsIDB4MTYzQSwgMHg4NUZCLCAweDE2MzcsIDB4ODVGRCwKKyAgICAweDMyMkEsIDB4ODVGRSwgMHgzMjIyLCAweDg1RkYsIDB4MzIyMCwgMHg4NjAwLCAweDMyMjQsIDB4ODYwMSwgMHgzMjIxLAorICAgIDB4ODYwNCwgMHgzMjI2LCAweDg2MDUsIDB4MzIyOCwgMHg4NjA2LCAweDE2M0IsIDB4ODYwNywgMHgxNjNELCAweDg2MDksCisgICAgMHgzMjI3LCAweDg2MEEsIDB4MTYzRSwgMHg4NjBCLCAweDE2M0MsIDB4ODYwQywgMHgzMjI5LCAweDg2MTEsIDB4MTYzOSwKKyAgICAweDg2MTcsIDB4MTY4NSwgMHg4NjE4LCAweDMyRjYsIDB4ODYxOSwgMHgzMkZDLCAweDg2MUEsIDB4MTY4NywgMHg4NjFCLAorICAgIDB4MzIyMywgMHg4NjFDLCAweDMyRkIsIDB4ODYxRSwgMHgzMzAyLCAweDg2MUYsIDB4MzJGOSwgMHg4NjIwLCAweDMzMDAsCisgICAgMHg4NjIxLCAweDMyRkYsIDB4ODYyMiwgMHgzMjFGLCAweDg2MjMsIDB4MzJGQSwgMHg4NjI0LCAweDJGQTksIDB4ODYyNSwKKyAgICAweDMzMDMsIDB4ODYyNiwgMHgzMkY4LCAweDg2MjcsIDB4MzJGRCwgMHg4NjI5LCAweDMzMDEsIDB4ODYyQSwgMHgzMkY3LAorICAgIDB4ODYyQywgMHgzM0FBLCAweDg2MkQsIDB4MTY4NiwgMHg4NjJFLCAweDMyRkUsIDB4ODYzMSwgMHgzNDMyLCAweDg2MzIsCisgICAgMHgzM0FCLCAweDg2MzMsIDB4MzNBOSwgMHg4NjM0LCAweDMzQTcsIDB4ODYzNSwgMHgzM0E4LCAweDg2MzYsIDB4MzNBQywKKyAgICAweDg2MzgsIDB4MTcwNywgMHg4NjM5LCAweDM0MzAsIDB4ODYzQSwgMHgzNDJFLCAweDg2M0IsIDB4MzQzMywgMHg4NjNDLAorICAgIDB4MzQzMSwgMHg4NjNFLCAweDM0MzQsIDB4ODYzRiwgMHgxNzA4LCAweDg2NDAsIDB4MzQyRiwgMHg4NjQzLCAweDM0OTcsCisgICAgMHg4NjQ2LCAweDM0REYsIDB4ODY0NywgMHgzNEUwLCAweDg2NDgsIDB4MzRFMSwgMHg4NjRCLCAweDM1M0UsIDB4ODY0QywKKyAgICAweDM1MzYsIDB4ODY0RCwgMHgxODE4LCAweDg2NEUsIDB4MDY4OSwgMHg4NjUwLCAweDA3RkYsIDB4ODY1MiwgMHgxREUzLAorICAgIDB4ODY1MywgMHgxREUyLCAweDg2NTQsIDB4MDlBRiwgMHg4NjU1LCAweDBCODgsIDB4ODY1NiwgMHgyMDNDLCAweDg2NTksCisgICAgMHgyMDNCLCAweDg2NUIsIDB4MEQ0OCwgMHg4NjVDLCAweDBFRUQsIDB4ODY1RSwgMHgwRUVDLCAweDg2NUYsIDB4MEVFRSwKKyAgICAweDg2NjEsIDB4MjdDRSwgMHg4NjYyLCAweDJBMEUsIDB4ODY2MywgMHgyQzVFLCAweDg2NjQsIDB4MkM2MCwgMHg4NjY1LAorICAgIDB4MkM1RiwgMHg4NjY3LCAweDE0NjYsIDB4ODY2OCwgMHgyRTM0LCAweDg2NjksIDB4MkZBRCwgMHg4NjZBLCAweDM1MUUsCisgICAgMHg4NjZCLCAweDA0MEYsIDB4ODY2RCwgMHgxQTQ2LCAweDg2NkUsIDB4MUE0NywgMHg4NjZGLCAweDFBNDUsIDB4ODY3MCwKKyAgICAweDFBNDQsIDB4ODY3MSwgMHgwNjhBLCAweDg2NzMsIDB4MUJGRCwgMHg4Njc0LCAweDFCRkIsIDB4ODY3NywgMHgxQkZBLAorICAgIDB4ODY3OSwgMHgwODAwLCAweDg2N0EsIDB4MDgwMiwgMHg4NjdCLCAweDA4MDEsIDB4ODY3QywgMHgxQkZDLCAweDg2ODUsCisgICAgMHgxREVGLCAweDg2ODYsIDB4MURFQywgMHg4Njg3LCAweDFERUEsIDB4ODY4QSwgMHgwOUIwLCAweDg2OEIsIDB4MURFRCwKKyAgICAweDg2OEMsIDB4MDlCNSwgMHg4NjhELCAweDFERTcsIDB4ODY4RSwgMHgxREY2LCAweDg2OTAsIDB4MURGOCwgMHg4NjkxLAorICAgIDB4MURFOCwgMHg4NjkzLCAweDA5QjIsIDB4ODY5NCwgMHgxREY5LCAweDg2OTUsIDB4MURGNCwgMHg4Njk2LCAweDFERTYsCisgICAgMHg4Njk3LCAweDFERUIsIDB4ODY5OCwgMHgxREY1LCAweDg2OTksIDB4MURGMSwgMHg4NjlBLCAweDFERUUsIDB4ODY5QywKKyAgICAweDA5QjcsIDB4ODY5RCwgMHgxREY3LCAweDg2OUUsIDB4MURFOSwgMHg4NkExLCAweDFERjIsIDB4ODZBMiwgMHgxREU0LAorICAgIDB4ODZBMywgMHgwOUI2LCAweDg2QTQsIDB4MDlCMywgMHg4NkE1LCAweDFERjAsIDB4ODZBNywgMHgxREYzLCAweDg2QTgsCisgICAgMHgxREU1LCAweDg2QTksIDB4MDlCNCwgMHg4NkFBLCAweDA5QjEsIDB4ODZBRiwgMHgwQjkyLCAweDg2QjAsIDB4MjA0MywKKyAgICAweDg2QjEsIDB4MEI5MSwgMHg4NkIzLCAweDIwNDYsIDB4ODZCNCwgMHgyMDQ5LCAweDg2QjUsIDB4MEI4RSwgMHg4NkI2LAorICAgIDB4MEI4QywgMHg4NkI3LCAweDIwM0UsIDB4ODZCOCwgMHgyMDQ3LCAweDg2QjksIDB4MjA0NSwgMHg4NkJBLCAweDIwNDIsCisgICAgMHg4NkJCLCAweDIwNEEsIDB4ODZCQywgMHgyMDRCLCAweDg2QkQsIDB4MjA0RCwgMHg4NkJFLCAweDIwNEUsIDB4ODZCRiwKKyAgICAweDIwM0QsIDB4ODZDMCwgMHgwQjhCLCAweDg2QzEsIDB4MjA0MCwgMHg4NkMyLCAweDIwM0YsIDB4ODZDMywgMHgyMDRDLAorICAgIDB4ODZDNCwgMHgwQjhELCAweDg2QzUsIDB4MjA0MSwgMHg4NkM2LCAweDBCOEYsIDB4ODZDNywgMHgwQjhBLCAweDg2QzgsCisgICAgMHgyMDQ0LCAweDg2QzksIDB4MEI5MywgMHg4NkNCLCAweDBCOTAsIDB4ODZDQywgMHgyMDQ4LCAweDg2RDAsIDB4MEQ0RiwKKyAgICAweDg2RDEsIDB4MjJEMiwgMHg4NkQzLCAweDIyQzcsIDB4ODZENCwgMHgwRDRDLCAweDg2RDYsIDB4MjU2RCwgMHg4NkQ3LAorICAgIDB4MjJEMCwgMHg4NkQ4LCAweDIyQzQsIDB4ODZEOSwgMHgwRDRBLCAweDg2REEsIDB4MjJDOSwgMHg4NkRCLCAweDBENEQsCisgICAgMHg4NkRDLCAweDIyQ0QsIDB4ODZERCwgMHgyMkNCLCAweDg2REUsIDB4MEQ1MCwgMHg4NkRGLCAweDBENDksIDB4ODZFMiwKKyAgICAweDIyQzUsIDB4ODZFMywgMHgyMkM4LCAweDg2RTQsIDB4MEQ0RSwgMHg4NkU2LCAweDIyQzYsIDB4ODZFOCwgMHgyMkQxLAorICAgIDB4ODZFOSwgMHgyMkNGLCAweDg2RUEsIDB4MjJDQSwgMHg4NkVCLCAweDIyQ0MsIDB4ODZFQywgMHgyMkNFLCAweDg2RUQsCisgICAgMHgwRDRCLCAweDg2RjUsIDB4MjU2RSwgMHg4NkY2LCAweDI1NzQsIDB4ODZGNywgMHgyNTZBLCAweDg2RjgsIDB4MjU3MCwKKyAgICAweDg2RjksIDB4MEVFRiwgMHg4NkZBLCAweDI1NkMsIDB4ODZGQiwgMHgwRUY1LCAweDg2RkUsIDB4MEVGNCwgMHg4NzAwLAorICAgIDB4MEVGMywgMHg4NzAxLCAweDI1NzMsIDB4ODcwMiwgMHgwRUY2LCAweDg3MDMsIDB4MEVGNywgMHg4NzA0LCAweDI1NjksCisgICAgMHg4NzA1LCAweDI1NzYsIDB4ODcwNiwgMHgwRUY4LCAweDg3MDcsIDB4MEVGMiwgMHg4NzA4LCAweDBFRjEsIDB4ODcwOSwKKyAgICAweDI1NzIsIDB4ODcwQSwgMHgwRUY5LCAweDg3MEIsIDB4MjU2OCwgMHg4NzBDLCAweDI1NkIsIDB4ODcwRCwgMHgyNTc1LAorICAgIDB4ODcwRSwgMHgyNTcxLCAweDg3MTEsIDB4MjdFRSwgMHg4NzEyLCAweDI3RTMsIDB4ODcxMywgMHgwRUYwLCAweDg3MTgsCisgICAgMHgxMDk4LCAweDg3MTksIDB4MjdENywgMHg4NzFBLCAweDI3RUMsIDB4ODcxQiwgMHgyN0Q4LCAweDg3MUMsIDB4MTA5MywKKyAgICAweDg3MUUsIDB4MjdENSwgMHg4NzIwLCAweDI3REUsIDB4ODcyMSwgMHgyN0Q2LCAweDg3MjIsIDB4MTA5NSwgMHg4NzIzLAorICAgIDB4MjdEMCwgMHg4NzI0LCAweDI3RUIsIDB4ODcyNSwgMHgxMDk2LCAweDg3MjYsIDB4MjdFOCwgMHg4NzI3LCAweDI3RTksCisgICAgMHg4NzI4LCAweDI3RDEsIDB4ODcyOSwgMHgxMDlCLCAweDg3MkEsIDB4MjdFMCwgMHg4NzJDLCAweDI3REEsIDB4ODcyRCwKKyAgICAweDI3RTEsIDB4ODcyRSwgMHgyN0Q0LCAweDg3MzAsIDB4MjdFRCwgMHg4NzMxLCAweDI3RTUsIDB4ODczMiwgMHgyN0RGLAorICAgIDB4ODczMywgMHgyN0NGLCAweDg3MzQsIDB4MTA5NywgMHg4NzM1LCAweDI3RTYsIDB4ODczNywgMHgxMDlBLCAweDg3MzgsCisgICAgMHgyN0VBLCAweDg3M0EsIDB4MjdFNCwgMHg4NzNCLCAweDEwOTQsIDB4ODczQywgMHgyN0UyLCAweDg3M0UsIDB4MjdEQywKKyAgICAweDg3M0YsIDB4MTA5MiwgMHg4NzQwLCAweDI3RDMsIDB4ODc0MSwgMHgyN0RCLCAweDg3NDIsIDB4MjdFNywgMHg4NzQzLAorICAgIDB4MjdEOSwgMHg4NzQ2LCAweDI3REQsIDB4ODc0QywgMHgxMjA4LCAweDg3NEQsIDB4MjU2RiwgMHg4NzRFLCAweDJBMjAsCisgICAgMHg4NzRGLCAweDJBMjksIDB4ODc1MCwgMHgyQTFGLCAweDg3NTEsIDB4MkExQiwgMHg4NzUyLCAweDJBMTgsIDB4ODc1MywKKyAgICAweDEyMDksIDB4ODc1NCwgMHgyQTE2LCAweDg3NTUsIDB4MTA5OSwgMHg4NzU2LCAweDJBMEYsIDB4ODc1NywgMHgxMjA3LAorICAgIDB4ODc1OCwgMHgyQTE1LCAweDg3NTksIDB4MTIwNiwgMHg4NzVBLCAweDJBMUEsIDB4ODc1QiwgMHgyQTE3LCAweDg3NUMsCisgICAgMHgyQTI3LCAweDg3NUQsIDB4MkEyMiwgMHg4NzVFLCAweDJBMUMsIDB4ODc1RiwgMHgyQTIxLCAweDg3NjAsIDB4MTIwMiwKKyAgICAweDg3NjEsIDB4MkExOSwgMHg4NzYyLCAweDJBMkMsIDB4ODc2MywgMHgyQTEwLCAweDg3NjQsIDB4MkExMSwgMHg4NzY1LAorICAgIDB4MkEyOCwgMHg4NzY2LCAweDEyMDMsIDB4ODc2NywgMHgyQTJELCAweDg3NjgsIDB4MTIwNSwgMHg4NzY5LCAweDJBMkUsCisgICAgMHg4NzZBLCAweDJBMUUsIDB4ODc2QiwgMHgyN0QyLCAweDg3NkMsIDB4MkEyNCwgMHg4NzZELCAweDJBMUQsIDB4ODc2RSwKKyAgICAweDJBMjYsIDB4ODc2RiwgMHgyQTIzLCAweDg3NzMsIDB4MkExNCwgMHg4Nzc0LCAweDEyMDAsIDB4ODc3NSwgMHgyQTJCLAorICAgIDB4ODc3NiwgMHgxMjAxLCAweDg3NzcsIDB4MkExMiwgMHg4Nzc4LCAweDEyMDQsIDB4ODc3OSwgMHgyQzZCLCAweDg3N0EsCisgICAgMHgyQTI1LCAweDg3N0IsIDB4MkEyQSwgMHg4NzgxLCAweDJDNjgsIDB4ODc4MiwgMHgxMUZGLCAweDg3ODMsIDB4MTM0MCwKKyAgICAweDg3ODQsIDB4MkM3MiwgMHg4Nzg1LCAweDJDNkUsIDB4ODc4NywgMHgyQzZDLCAweDg3ODgsIDB4MkM2NywgMHg4Nzg5LAorICAgIDB4MkM3NiwgMHg4NzhELCAweDEzNDQsIDB4ODc4RiwgMHgyQzYzLCAweDg3OTAsIDB4MkM2RiwgMHg4NzkxLCAweDJDNzAsCisgICAgMHg4NzkyLCAweDJDNjYsIDB4ODc5MywgMHgyQzY1LCAweDg3OTQsIDB4MkM3MywgMHg4Nzk2LCAweDJDNjksIDB4ODc5NywKKyAgICAweDJDNjQsIDB4ODc5OCwgMHgyQzZBLCAweDg3OUEsIDB4MkM3NSwgMHg4NzlCLCAweDJDNjIsIDB4ODc5QywgMHgyQzc0LAorICAgIDB4ODc5RCwgMHgyQzcxLCAweDg3OUUsIDB4MTM0MiwgMHg4NzlGLCAweDEzNDEsIDB4ODdBMiwgMHgxMzQzLCAweDg3QTMsCisgICAgMHgyQzZELCAweDg3QTQsIDB4MkM2MSwgMHg4N0FBLCAweDJFMzYsIDB4ODdBQiwgMHgxNDZDLCAweDg3QUMsIDB4MkUzQSwKKyAgICAweDg3QUQsIDB4MkUzNywgMHg4N0FFLCAweDJFM0UsIDB4ODdBRiwgMHgyRTQ0LCAweDg3QjAsIDB4MkUzOSwgMHg4N0IyLAorICAgIDB4MkU0RCwgMHg4N0IzLCAweDE0NjksIDB4ODdCNCwgMHgyRTQ3LCAweDg3QjUsIDB4MkUzQywgMHg4N0I2LCAweDJFNDgsCisgICAgMHg4N0I3LCAweDJFNDMsIDB4ODdCOCwgMHgyRTRBLCAweDg3QjksIDB4MkUzQiwgMHg4N0JBLCAweDE0NkUsIDB4ODdCQiwKKyAgICAweDE0NkQsIDB4ODdCQywgMHgyRTNELCAweDg3QkQsIDB4MkU0QiwgMHg4N0JFLCAweDJFMzUsIDB4ODdCRiwgMHgyRTQ5LAorICAgIDB4ODdDMCwgMHgxNDY3LCAweDg3QzIsIDB4MkU0MSwgMHg4N0MzLCAweDJFNDAsIDB4ODdDNCwgMHgyRTQ1LCAweDg3QzUsCisgICAgMHgyRTM4LCAweDg3QzYsIDB4MTQ2QiwgMHg4N0M4LCAweDE0NkYsIDB4ODdDOSwgMHgyRTNGLCAweDg3Q0EsIDB4MkU0NiwKKyAgICAweDg3Q0IsIDB4MTQ3MCwgMHg4N0NDLCAweDJFNDIsIDB4ODdEMSwgMHgxNDY4LCAweDg3RDIsIDB4MTQ2QSwgMHg4N0QzLAorICAgIDB4MkZCQSwgMHg4N0Q0LCAweDJGQjgsIDB4ODdENywgMHgyRkJFLCAweDg3RDgsIDB4MkZCQywgMHg4N0Q5LCAweDJGQkYsCisgICAgMHg4N0RCLCAweDJGQjEsIDB4ODdEQywgMHgyRkI5LCAweDg3REQsIDB4MkZDMywgMHg4N0RFLCAweDJFNEMsIDB4ODdERiwKKyAgICAweDJGQjUsIDB4ODdFMCwgMHgxNTI2LCAweDg3RTEsIDB4MkExMywgMHg4N0UyLCAweDJGQjAsIDB4ODdFMywgMHgyRkJELAorICAgIDB4ODdFNCwgMHgyRkI3LCAweDg3RTUsIDB4MkZCNCwgMHg4N0U2LCAweDJGQUYsIDB4ODdFNywgMHgyRkFFLCAweDg3RTgsCisgICAgMHgyRkMyLCAweDg3RUEsIDB4MkZCMywgMHg4N0VCLCAweDJGQjIsIDB4ODdFQywgMHgxNTI0LCAweDg3RUQsIDB4MkZCQiwKKyAgICAweDg3RUYsIDB4MTUyMywgMHg4N0YyLCAweDE1MjUsIDB4ODdGMywgMHgyRkI2LCAweDg3RjQsIDB4MkZDMSwgMHg4N0Y2LAorICAgIDB4MzEwQSwgMHg4N0Y3LCAweDMxMEIsIDB4ODdGOSwgMHgxNUJFLCAweDg3RkEsIDB4MzEwOCwgMHg4N0ZCLCAweDE1QkIsCisgICAgMHg4N0ZDLCAweDMxMTAsIDB4ODdGRSwgMHgxNUJGLCAweDg3RkYsIDB4MzExMiwgMHg4ODAwLCAweDMxMDcsIDB4ODgwMSwKKyAgICAweDJGQzAsIDB4ODgwMiwgMHgzMTE0LCAweDg4MDMsIDB4MzEwOSwgMHg4ODA1LCAweDE1QkMsIDB4ODgwNiwgMHgzMTBGLAorICAgIDB4ODgwOCwgMHgzMTExLCAweDg4MDksIDB4MzEwQywgMHg4ODBBLCAweDMxMTMsIDB4ODgwQiwgMHgzMTBFLCAweDg4MEMsCisgICAgMHgzMTBELCAweDg4MEQsIDB4MTVCRCwgMHg4ODEwLCAweDMyMkMsIDB4ODgxMSwgMHgzMjJELCAweDg4MTMsIDB4MzIyRiwKKyAgICAweDg4MTQsIDB4MTYzRiwgMHg4ODE1LCAweDE2NDAsIDB4ODgxNiwgMHgzMjMwLCAweDg4MTcsIDB4MzIyRSwgMHg4ODE5LAorICAgIDB4MzIyQiwgMHg4ODFCLCAweDMzMDYsIDB4ODgxQywgMHgzMzA5LCAweDg4MUQsIDB4MzMwNSwgMHg4ODFGLCAweDE2OEIsCisgICAgMHg4ODIwLCAweDMzMDcsIDB4ODgyMSwgMHgxNjhBLCAweDg4MjIsIDB4MTY4OSwgMHg4ODIzLCAweDE2ODgsIDB4ODgyNCwKKyAgICAweDMzMDgsIDB4ODgyNSwgMHgzM0IxLCAweDg4MjYsIDB4MzNBRiwgMHg4ODI4LCAweDMzQUUsIDB4ODgyOSwgMHgzMzA0LAorICAgIDB4ODgyQSwgMHgzM0IwLCAweDg4MkIsIDB4MzMwQSwgMHg4ODJDLCAweDMzQUQsIDB4ODgyRSwgMHgzNDM3LCAweDg4MkYsCisgICAgMHgzNDE1LCAweDg4MzAsIDB4MzQzNSwgMHg4ODMxLCAweDE3MDksIDB4ODgzMiwgMHgzNDM2LCAweDg4MzMsIDB4MzQzOCwKKyAgICAweDg4MzUsIDB4MzQ5QSwgMHg4ODM2LCAweDE3MjgsIDB4ODgzNywgMHgzNDk5LCAweDg4MzgsIDB4MzQ5OCwgMHg4ODM5LAorICAgIDB4MTcyOSwgMHg4ODNCLCAweDE3NDcsIDB4ODgzQywgMHgzNTA4LCAweDg4M0QsIDB4MzUyMCwgMHg4ODNFLCAweDM1MUYsCisgICAgMHg4ODNGLCAweDM1MjEsIDB4ODg0MCwgMHgwNDEwLCAweDg4NDEsIDB4MUJGRSwgMHg4ODQzLCAweDFERkEsIDB4ODg0NCwKKyAgICAweDFERkIsIDB4ODg0OCwgMHgyMkQzLCAweDg4NEEsIDB4MzMwQiwgMHg4ODRCLCAweDM0OUIsIDB4ODg0QywgMHgwNDExLAorICAgIDB4ODg0RCwgMHgwODAzLCAweDg4NEUsIDB4MUJGRiwgMHg4ODUyLCAweDIwNEYsIDB4ODg1MywgMHgwQjk0LCAweDg4NTUsCisgICAgMHgyMkQ1LCAweDg4NTYsIDB4MjJENCwgMHg4ODU3LCAweDBENTEsIDB4ODg1OSwgMHgwRUZBLCAweDg4NUEsIDB4MkEyRiwKKyAgICAweDg4NUIsIDB4MTIwQSwgMHg4ODVELCAweDEyMEIsIDB4ODg2MSwgMHgxMzQ1LCAweDg4NjIsIDB4MTcyQSwgMHg4ODYzLAorICAgIDB4MDQxMiwgMHg4ODY3LCAweDFDMDAsIDB4ODg2OCwgMHgwNjhDLCAweDg4NjksIDB4MUMwMiwgMHg4ODZBLCAweDFDMDEsCisgICAgMHg4ODZCLCAweDA4MDQsIDB4ODg2RCwgMHgxREZDLCAweDg4NkYsIDB4MUUwMywgMHg4ODcwLCAweDA5QjgsIDB4ODg3MSwKKyAgICAweDFFMDEsIDB4ODg3MiwgMHgxREZGLCAweDg4NzQsIDB4MUUwNiwgMHg4ODc1LCAweDFERkQsIDB4ODg3NiwgMHgxREZFLAorICAgIDB4ODg3NywgMHgwOUI5LCAweDg4NzksIDB4MDlCRCwgMHg4ODdDLCAweDFFMDcsIDB4ODg3RCwgMHgwOUJDLCAweDg4N0UsCisgICAgMHgxRTA1LCAweDg4N0YsIDB4MUUwMiwgMHg4ODgwLCAweDFFMDAsIDB4ODg4MSwgMHgwOUJBLCAweDg4ODIsIDB4MDlCQiwKKyAgICAweDg4ODMsIDB4MUUwNCwgMHg4ODg4LCAweDBCOTYsIDB4ODg4OSwgMHgyMDUwLCAweDg4OEIsIDB4MEI5QiwgMHg4ODhDLAorICAgIDB4MjA2MCwgMHg4ODhELCAweDBCOUEsIDB4ODg4RSwgMHgyMDYyLCAweDg4OTEsIDB4MjA1NiwgMHg4ODkyLCAweDBCOTgsCisgICAgMHg4ODkzLCAweDIwNjEsIDB4ODg5NSwgMHgyMDUxLCAweDg4OTYsIDB4MEI5OSwgMHg4ODk3LCAweDIwNUQsIDB4ODg5OCwKKyAgICAweDIwNTksIDB4ODg5OSwgMHgyMDVCLCAweDg4OUEsIDB4MjA1NSwgMHg4ODlCLCAweDIwNUMsIDB4ODg5RSwgMHgwQjk1LAorICAgIDB4ODg5RiwgMHgyMDU4LCAweDg4QTEsIDB4MjA1NywgMHg4OEEyLCAweDIwNTMsIDB4ODhBNCwgMHgyMDVFLCAweDg4QTcsCisgICAgMHgyMDVBLCAweDg4QTgsIDB4MjA1MiwgMHg4OEFBLCAweDIwNTQsIDB4ODhBQiwgMHgwQjk3LCAweDg4QUMsIDB4MjA1RiwKKyAgICAweDg4QjEsIDB4MEQ1NCwgMHg4OEIyLCAweDIyRTAsIDB4ODhCNiwgMHgyMkRDLCAweDg4QjcsIDB4MjJERSwgMHg4OEI4LAorICAgIDB4MjJEOSwgMHg4OEI5LCAweDIyRDgsIDB4ODhCQSwgMHgyMkQ2LCAweDg4QkMsIDB4MjJERCwgMHg4OEJELCAweDIyREYsCisgICAgMHg4OEJFLCAweDIyREIsIDB4ODhDMCwgMHgyMkRBLCAweDg4QzEsIDB4MEQ1MiwgMHg4OEMyLCAweDBENTMsIDB4ODhDOSwKKyAgICAweDIyRTIsIDB4ODhDQSwgMHgwRjAyLCAweDg4Q0IsIDB4MjU3OCwgMHg4OENDLCAweDI1N0UsIDB4ODhDRCwgMHgyNTc5LAorICAgIDB4ODhDRSwgMHgyNTdBLCAweDg4Q0YsIDB4MzZFQSwgMHg4OEQwLCAweDI1N0YsIDB4ODhEMiwgMHgwRjA0LCAweDg4RDQsCisgICAgMHgwRUZDLCAweDg4RDUsIDB4MEYwMywgMHg4OEQ2LCAweDI1NzcsIDB4ODhENywgMHgyMkQ3LCAweDg4RDgsIDB4MEVGRiwKKyAgICAweDg4RDksIDB4MEVGRCwgMHg4OERBLCAweDI1N0QsIDB4ODhEQiwgMHgyNTdDLCAweDg4REMsIDB4MEVGRSwgMHg4OERELAorICAgIDB4MEYwMCwgMHg4OERFLCAweDI1N0IsIDB4ODhERiwgMHgwRUZCLCAweDg4RTEsIDB4MEYwMSwgMHg4OEU3LCAweDI3RjAsCisgICAgMHg4OEU4LCAweDEwQTIsIDB4ODhFQiwgMHgyN0ZCLCAweDg4RUMsIDB4MjdGQSwgMHg4OEVFLCAweDI3RjUsIDB4ODhFRiwKKyAgICAweDEwQTQsIDB4ODhGMCwgMHgyN0Y5LCAweDg4RjEsIDB4MjdGMSwgMHg4OEYyLCAweDI3RjIsIDB4ODhGMywgMHgxMDlDLAorICAgIDB4ODhGNCwgMHgxMDlFLCAweDg4RjYsIDB4MjdGNywgMHg4OEY3LCAweDI3RUYsIDB4ODhGOCwgMHgxMEEwLCAweDg4RjksCisgICAgMHgxMDlGLCAweDg4RkEsIDB4MjdGMywgMHg4OEZCLCAweDI3RjgsIDB4ODhGQywgMHgyN0Y2LCAweDg4RkQsIDB4MTBBMSwKKyAgICAweDg4RkUsIDB4MjdGNCwgMHg4OTAxLCAweDIyRTEsIDB4ODkwMiwgMHgxMDlELCAweDg5MDUsIDB4MkEzMCwgMHg4OTA2LAorICAgIDB4MkEzNywgMHg4OTA3LCAweDEyMEQsIDB4ODkwOSwgMHgyQTNCLCAweDg5MEEsIDB4MTIxMSwgMHg4OTBCLCAweDJBMzMsCisgICAgMHg4OTBDLCAweDJBMzEsIDB4ODkwRSwgMHgyQTNBLCAweDg5MTAsIDB4MTIwQywgMHg4OTExLCAweDJBMzksIDB4ODkxMiwKKyAgICAweDEyMEUsIDB4ODkxMywgMHgxMjBGLCAweDg5MTQsIDB4MkEzMiwgMHg4OTE1LCAweDEyMTAsIDB4ODkxNiwgMHgyQTM4LAorICAgIDB4ODkxNywgMHgyQTM0LCAweDg5MTgsIDB4MkEzNSwgMHg4OTE5LCAweDJBMzYsIDB4ODkxQSwgMHgxMEEzLCAweDg5MUUsCisgICAgMHgyQzc3LCAweDg5MUYsIDB4MkM4MywgMHg4OTIxLCAweDEzNEEsIDB4ODkyMiwgMHgyQzdFLCAweDg5MjMsIDB4MkM4MCwKKyAgICAweDg5MjUsIDB4MTM0OCwgMHg4OTI2LCAweDJDNzgsIDB4ODkyNywgMHgyQzdDLCAweDg5MjksIDB4MkM3RiwgMHg4OTJBLAorICAgIDB4MTM0NiwgMHg4OTJCLCAweDEzNDksIDB4ODkyQywgMHgyQzgyLCAweDg5MkQsIDB4MkM3QSwgMHg4OTJFLCAweDJDN0IsCisgICAgMHg4OTJGLCAweDJDODEsIDB4ODkzMCwgMHgyQzc5LCAweDg5MzEsIDB4MkM3RCwgMHg4OTMyLCAweDEzNDcsIDB4ODkzMywKKyAgICAweDJFNEYsIDB4ODkzNSwgMHgyRTRFLCAweDg5MzYsIDB4MTQ3MiwgMHg4OTM3LCAweDJFNTQsIDB4ODkzOCwgMHgxNDc0LAorICAgIDB4ODkzQiwgMHgxNDcxLCAweDg5M0MsIDB4MkU1MCwgMHg4OTNELCAweDE0NzUsIDB4ODkzRSwgMHgyRTUxLCAweDg5NDEsCisgICAgMHgyRTUyLCAweDg5NDIsIDB4MkU1NSwgMHg4OTQ0LCAweDE0NzMsIDB4ODk0NiwgMHgyRkM4LCAweDg5NDksIDB4MkZDQiwKKyAgICAweDg5NEIsIDB4MkZDNSwgMHg4OTRDLCAweDJGQzcsIDB4ODk0RiwgMHgyRkM2LCAweDg5NTAsIDB4MkZDOSwgMHg4OTUxLAorICAgIDB4MkZDQSwgMHg4OTUyLCAweDJFNTMsIDB4ODk1MywgMHgyRkM0LCAweDg5NTYsIDB4MTVDMiwgMHg4OTU3LCAweDMxMTgsCisgICAgMHg4OTU4LCAweDMxMUIsIDB4ODk1OSwgMHgzMTFELCAweDg5NUEsIDB4MzExNiwgMHg4OTVCLCAweDMxMTcsIDB4ODk1QywKKyAgICAweDMxMUEsIDB4ODk1RCwgMHgzMTFDLCAweDg5NUUsIDB4MTVDMywgMHg4OTVGLCAweDE1QzEsIDB4ODk2MCwgMHgxNUMwLAorICAgIDB4ODk2MSwgMHgzMTE5LCAweDg5NjIsIDB4MzExNSwgMHg4OTYzLCAweDMyMzEsIDB4ODk2NCwgMHgxNjQxLCAweDg5NjYsCisgICAgMHgzMjMyLCAweDg5NjksIDB4MzMwRCwgMHg4OTZBLCAweDE2OEMsIDB4ODk2QiwgMHgzMzBGLCAweDg5NkMsIDB4MTY4RCwKKyAgICAweDg5NkQsIDB4MzMwQywgMHg4OTZFLCAweDMzMEUsIDB4ODk2RiwgMHgxNkQ2LCAweDg5NzEsIDB4MzNCMiwgMHg4OTcyLAorICAgIDB4MTZENSwgMHg4OTczLCAweDM0M0IsIDB4ODk3NCwgMHgzNDNBLCAweDg5NzYsIDB4MzQzOSwgMHg4OTc5LCAweDM0RTIsCisgICAgMHg4OTdBLCAweDM0RTMsIDB4ODk3QiwgMHgzNEU1LCAweDg5N0MsIDB4MzRFNCwgMHg4OTdFLCAweDE4MTksIDB4ODk3RiwKKyAgICAweDA0MTMsIDB4ODk4MSwgMHgwODA1LCAweDg5ODIsIDB4MjA2MywgMHg4OTgzLCAweDBENTUsIDB4ODk4NSwgMHgyNTgwLAorICAgIDB4ODk4NiwgMHgxNTI3LCAweDg5ODgsIDB4MzExRSwgMHg4OThCLCAweDA1MDgsIDB4ODk4RiwgMHgwQjlELCAweDg5OTMsCisgICAgMHgwQjlDLCAweDg5OTUsIDB4MjJFMywgMHg4OTk2LCAweDBENTYsIDB4ODk5NywgMHgyMkU1LCAweDg5OTgsIDB4MjJFNCwKKyAgICAweDg5OUIsIDB4MjU4MSwgMHg4OTlDLCAweDBGMDUsIDB4ODk5RCwgMHgyN0ZDLCAweDg5OUUsIDB4MjdGRiwgMHg4OTlGLAorICAgIDB4MjdGRSwgMHg4OUExLCAweDI3RkQsIDB4ODlBMiwgMHgyQTNDLCAweDg5QTMsIDB4MkEzRSwgMHg4OUE0LCAweDJBM0QsCisgICAgMHg4OUE2LCAweDEzNEMsIDB4ODlBQSwgMHgxMzRCLCAweDg5QUMsIDB4MTQ3NiwgMHg4OUFELCAweDJFNTYsIDB4ODlBRSwKKyAgICAweDJFNTgsIDB4ODlBRiwgMHgyRTU3LCAweDg5QjIsIDB4MTUyOCwgMHg4OUI2LCAweDMxMjAsIDB4ODlCNywgMHgzMTFGLAorICAgIDB4ODlCOSwgMHgzMjMzLCAweDg5QkEsIDB4MTY0MiwgMHg4OUJELCAweDE2OEUsIDB4ODlCRSwgMHgzM0I0LCAweDg5QkYsCisgICAgMHgzM0IzLCAweDg5QzAsIDB4MTc0OCwgMHg4OUQyLCAweDA1MDksIDB4ODlEMywgMHgxQzAzLCAweDg5RDQsIDB4MDgwNiwKKyAgICAweDg5RDUsIDB4MjA2NiwgMHg4OUQ2LCAweDIwNjQsIDB4ODlEOSwgMHgyMDY1LCAweDg5REEsIDB4MjJFNywgMHg4OURCLAorICAgIDB4MjJFOCwgMHg4OURDLCAweDI1ODgsIDB4ODlERCwgMHgyMkU2LCAweDg5REYsIDB4MjU4MiwgMHg4OUUwLCAweDI1ODYsCisgICAgMHg4OUUxLCAweDI1ODUsIDB4ODlFMiwgMHgyNTg3LCAweDg5RTMsIDB4MEYwNiwgMHg4OUU0LCAweDI1ODQsIDB4ODlFNSwKKyAgICAweDI1ODMsIDB4ODlFNiwgMHgyNTg5LCAweDg5RTgsIDB4MjgwMiwgMHg4OUU5LCAweDI4MDAsIDB4ODlFQiwgMHgyODAxLAorICAgIDB4ODlFQywgMHgyQTQxLCAweDg5RUQsIDB4MkEzRiwgMHg4OUYwLCAweDJBNDAsIDB4ODlGMSwgMHgyQzg0LCAweDg5RjIsCisgICAgMHgyRTU5LCAweDg5RjMsIDB4MkU1QSwgMHg4OUY0LCAweDE1MjksIDB4ODlGNiwgMHgzMTIxLCAweDg5RjcsIDB4MzIzNCwKKyAgICAweDg5RjgsIDB4MTY0MywgMHg4OUZBLCAweDMzMTAsIDB4ODlGQiwgMHgzM0I1LCAweDg5RkMsIDB4MTZENywgMHg4OUZFLAorICAgIDB4MzQzQywgMHg4OUZGLCAweDM0RTYsIDB4OEEwMCwgMHgwNTBBLCAweDhBMDIsIDB4MDgwOCwgMHg4QTAzLCAweDA4MDksCisgICAgMHg4QTA0LCAweDFDMDQsIDB4OEEwNywgMHgxQzA1LCAweDhBMDgsIDB4MDgwNywgMHg4QTBBLCAweDA5QzMsIDB4OEEwQywKKyAgICAweDA5QzEsIDB4OEEwRSwgMHgwOUMwLCAweDhBMEYsIDB4MDlDNywgMHg4QTEwLCAweDA5QkYsIDB4OEExMSwgMHgwOUM4LAorICAgIDB4OEExMiwgMHgxRTA4LCAweDhBMTMsIDB4MDlDNSwgMHg4QTE1LCAweDA5QzIsIDB4OEExNiwgMHgwOUM2LCAweDhBMTcsCisgICAgMHgwOUM0LCAweDhBMTgsIDB4MDlCRSwgMHg4QTFCLCAweDBCQTUsIDB4OEExRCwgMHgwQjlGLCAweDhBMUUsIDB4MjA2QSwKKyAgICAweDhBMUYsIDB4MEJBNCwgMHg4QTIyLCAweDBCQTYsIDB4OEEyMywgMHgwQkEwLCAweDhBMjUsIDB4MEJBMSwgMHg4QTI3LAorICAgIDB4MjA2OCwgMHg4QTJBLCAweDBCOUUsIDB4OEEyQywgMHgyMDY5LCAweDhBMkQsIDB4MEJBMywgMHg4QTMwLCAweDIwNjcsCisgICAgMHg4QTMxLCAweDBCQTIsIDB4OEEzNCwgMHgwRDYxLCAweDhBMzYsIDB4MEQ2MywgMHg4QTM5LCAweDIyRUIsIDB4OEEzQSwKKyAgICAweDBENjIsIDB4OEEzQiwgMHgwRDU3LCAweDhBM0MsIDB4MEQ1QiwgMHg4QTNFLCAweDBGMTksIDB4OEEzRiwgMHgyNThFLAorICAgIDB4OEE0MCwgMHgyMkVELCAweDhBNDEsIDB4MEQ1QywgMHg4QTQ0LCAweDIyRjAsIDB4OEE0NSwgMHgyMkYxLCAweDhBNDYsCisgICAgMHgwRDYwLCAweDhBNDgsIDB4MjJGMywgMHg4QTRBLCAweDIyRjUsIDB4OEE0QywgMHgyMkY2LCAweDhBNEQsIDB4MjJFQSwKKyAgICAweDhBNEUsIDB4MjJFOSwgMHg4QTRGLCAweDIyRjcsIDB4OEE1MCwgMHgwRDVGLCAweDhBNTEsIDB4MjJGNCwgMHg4QTUyLAorICAgIDB4MjJGMiwgMHg4QTU0LCAweDBENUQsIDB4OEE1NSwgMHgwRDU5LCAweDhBNTYsIDB4MEQ2NCwgMHg4QTU3LCAweDIyRUUsCisgICAgMHg4QTU4LCAweDIyRUYsIDB4OEE1OSwgMHgyMkVDLCAweDhBNUIsIDB4MEQ1RSwgMHg4QTVFLCAweDBENUEsIDB4OEE2MCwKKyAgICAweDBENTgsIDB4OEE2MSwgMHgyNThELCAweDhBNjIsIDB4MEYxNCwgMHg4QTYzLCAweDBGMEYsIDB4OEE2NiwgMHgwRjBBLAorICAgIDB4OEE2OCwgMHgwRjFBLCAweDhBNjksIDB4MEYwQiwgMHg4QTZCLCAweDBGMDcsIDB4OEE2QywgMHgwRjE2LCAweDhBNkQsCisgICAgMHgwRjEzLCAweDhBNkUsIDB4MEYxNSwgMHg4QTcwLCAweDBGMEMsIDB4OEE3MSwgMHgwRjExLCAweDhBNzIsIDB4MEYwOCwKKyAgICAweDhBNzMsIDB4MEYwOSwgMHg4QTc0LCAweDI1OTUsIDB4OEE3NSwgMHgyNTkyLCAweDhBNzYsIDB4MjU4QSwgMHg4QTc3LAorICAgIDB4MjU4RiwgMHg4QTc5LCAweDBGMTcsIDB4OEE3QSwgMHgyNTk2LCAweDhBN0IsIDB4MEYxOCwgMHg4QTdDLCAweDBGMEUsCisgICAgMHg4QTdGLCAweDI1OEMsIDB4OEE4MSwgMHgyNTk0LCAweDhBODIsIDB4MjU5MCwgMHg4QTgzLCAweDI1OTMsIDB4OEE4NCwKKyAgICAweDI1OTEsIDB4OEE4NSwgMHgwRjEyLCAweDhBODYsIDB4MjU4QiwgMHg4QTg3LCAweDBGMEQsIDB4OEE4QiwgMHgyODA1LAorICAgIDB4OEE4QywgMHgxMEE2LCAweDhBOEQsIDB4MTBBOSwgMHg4QThGLCAweDI4MDcsIDB4OEE5MSwgMHgxMEIxLCAweDhBOTIsCisgICAgMHgyODA2LCAweDhBOTMsIDB4MTBBQiwgMHg4QTk1LCAweDEyMTYsIDB4OEE5NiwgMHgyODA4LCAweDhBOTgsIDB4MTBCMCwKKyAgICAweDhBOTksIDB4MjgwNCwgMHg4QTlBLCAweDEwQjIsIDB4OEE5RSwgMHgxMEE3LCAweDhBQTAsIDB4MEYxMCwgMHg4QUExLAorICAgIDB4MTBBQSwgMHg4QUEzLCAweDEwQTgsIDB4OEFBNCwgMHgxMEFDLCAweDhBQTUsIDB4MTBBRSwgMHg4QUE2LCAweDEwQTUsCisgICAgMHg4QUE3LCAweDEwQjMsIDB4OEFBOCwgMHgxMEFGLCAweDhBQUEsIDB4MTBBRCwgMHg4QUFCLCAweDI4MDMsIDB4OEFCMCwKKyAgICAweDEyMUQsIDB4OEFCMiwgMHgxMjE5LCAweDhBQjYsIDB4MTIyMCwgMHg4QUI4LCAweDJBNDQsIDB4OEFCOSwgMHgxMjIxLAorICAgIDB4OEFCQSwgMHgyQTUwLCAweDhBQkIsIDB4MkE0OSwgMHg4QUJDLCAweDEyMTIsIDB4OEFCRCwgMHgyQTUxLCAweDhBQkUsCisgICAgMHgyQTRCLCAweDhBQkYsIDB4MTIxQywgMHg4QUMwLCAweDJBNEMsIDB4OEFDMiwgMHgxMjFCLCAweDhBQzMsIDB4MkE0RiwKKyAgICAweDhBQzQsIDB4MTIxNSwgMHg4QUM1LCAweDJBNEQsIDB4OEFDNiwgMHgyQTQzLCAweDhBQzcsIDB4MTIxNCwgMHg4QUM4LAorICAgIDB4MkM4RiwgMHg4QUM5LCAweDEyMUEsIDB4OEFDQiwgMHgxMjE3LCAweDhBQ0QsIDB4MTIxRiwgMHg4QUNGLCAweDJBNDIsCisgICAgMHg4QUQxLCAweDJBNDYsIDB4OEFEMiwgMHgxMjEzLCAweDhBRDMsIDB4MkE0NSwgMHg4QUQ0LCAweDJBNDcsIDB4OEFENSwKKyAgICAweDJBNDgsIDB4OEFENiwgMHgxMjFFLCAweDhBRDcsIDB4MkE0QSwgMHg4QUQ4LCAweDJBNEUsIDB4OEFEOSwgMHgyQTUyLAorICAgIDB4OEFEQiwgMHgxMjIyLCAweDhBREMsIDB4MTM1MiwgMHg4QURELCAweDJDOEEsIDB4OEFERSwgMHgyQzkwLCAweDhBREYsCisgICAgMHgyQzhELCAweDhBRTAsIDB4MkM4NSwgMHg4QUUxLCAweDJDOTEsIDB4OEFFMiwgMHgyQzg2LCAweDhBRTQsIDB4MkM4QywKKyAgICAweDhBRTYsIDB4MTM0RCwgMHg4QUU3LCAweDEzNTMsIDB4OEFFOCwgMHgyQzkyLCAweDhBRUIsIDB4MTM0RiwgMHg4QUVELAorICAgIDB4MTM1OSwgMHg4QUVFLCAweDEzNTQsIDB4OEFFRiwgMHgyQzk0LCAweDhBRjAsIDB4MkM4RSwgMHg4QUYxLCAweDEzNTAsCisgICAgMHg4QUYyLCAweDJDODcsIDB4OEFGMywgMHgxMzVBLCAweDhBRjQsIDB4MkM4OCwgMHg4QUY1LCAweDJDODksIDB4OEFGNiwKKyAgICAweDEzNUIsIDB4OEFGNywgMHgxMzU4LCAweDhBRjgsIDB4MTIxOCwgMHg4QUZBLCAweDEzNEUsIDB4OEFGQiwgMHgyQzk1LAorICAgIDB4OEFGQywgMHgxMzVDLCAweDhBRkUsIDB4MTM1NSwgMHg4QUZGLCAweDJDOTMsIDB4OEIwMCwgMHgxMzUxLCAweDhCMDEsCisgICAgMHgxMzU2LCAweDhCMDIsIDB4MTM1NywgMHg4QjA0LCAweDE0N0UsIDB4OEIwNSwgMHgyRTVGLCAweDhCMDYsIDB4MkU2OCwKKyAgICAweDhCMDcsIDB4MkU2NSwgMHg4QjA4LCAweDJFNjcsIDB4OEIwQSwgMHgxNDdCLCAweDhCMEIsIDB4MkU2MCwgMHg4QjBELAorICAgIDB4MkU2NiwgMHg4QjBFLCAweDE0NzcsIDB4OEIwRiwgMHgyRTYyLCAweDhCMTAsIDB4MTQ3RiwgMHg4QjExLCAweDJFNUUsCisgICAgMHg4QjEyLCAweDJFNjMsIDB4OEIxMywgMHgyRTZBLCAweDhCMTQsIDB4MkM4QiwgMHg4QjE1LCAweDJFNjQsIDB4OEIxNiwKKyAgICAweDJFNUQsIDB4OEIxNywgMHgxNDc4LCAweDhCMTgsIDB4MkU1QywgMHg4QjE5LCAweDE0NzksIDB4OEIxQSwgMHgyRTZCLAorICAgIDB4OEIxQiwgMHgxNDdBLCAweDhCMUMsIDB4MkU2OSwgMHg4QjFELCAweDE0N0QsIDB4OEIxRSwgMHgyRTVCLCAweDhCMjAsCisgICAgMHgxNDdDLCAweDhCMjIsIDB4MkU2MSwgMHg4QjIzLCAweDJGQ0UsIDB4OEIyNCwgMHgyRkRDLCAweDhCMjUsIDB4MkZENywKKyAgICAweDhCMjYsIDB4MkZEOSwgMHg4QjI3LCAweDJGQ0QsIDB4OEIyOCwgMHgxNTJBLCAweDhCMkEsIDB4MkZDQywgMHg4QjJCLAorICAgIDB4MTUyRCwgMHg4QjJDLCAweDE1MkMsIDB4OEIyRSwgMHgyRkRCLCAweDhCMkYsIDB4MkZEMywgMHg4QjMwLCAweDJGRDAsCisgICAgMHg4QjMxLCAweDJGRDYsIDB4OEIzMywgMHgyRkNGLCAweDhCMzUsIDB4MkZEMSwgMHg4QjM2LCAweDJGREEsIDB4OEIzNywKKyAgICAweDJGRDgsIDB4OEIzOSwgMHgxNTJCLCAweDhCM0EsIDB4MkZERiwgMHg4QjNCLCAweDJGREQsIDB4OEIzQywgMHgyRkQ0LAorICAgIDB4OEIzRCwgMHgyRkRFLCAweDhCM0UsIDB4MkZENSwgMHg4QjQwLCAweDMxMjUsIDB4OEI0MSwgMHgxNUM0LCAweDhCNDIsCisgICAgMHgzMTJDLCAweDhCNDUsIDB4MzMxMywgMHg4QjQ2LCAweDE1Q0IsIDB4OEI0NywgMHgyRkQyLCAweDhCNDgsIDB4MzEyMywKKyAgICAweDhCNDksIDB4MTVDNywgMHg4QjRBLCAweDMxMjQsIDB4OEI0QiwgMHgzMTI5LCAweDhCNEUsIDB4MTVDOSwgMHg4QjRGLAorICAgIDB4MTVDQSwgMHg4QjUwLCAweDMxMjIsIDB4OEI1MSwgMHgzMTJCLCAweDhCNTIsIDB4MzEyRCwgMHg4QjUzLCAweDMxMjYsCisgICAgMHg4QjU0LCAweDMxMjgsIDB4OEI1NSwgMHgzMTJBLCAweDhCNTYsIDB4MzEyNywgMHg4QjU3LCAweDMxMkUsIDB4OEI1OCwKKyAgICAweDE1QzYsIDB4OEI1OSwgMHgxNUNDLCAweDhCNUEsIDB4MTVDOCwgMHg4QjVDLCAweDE1QzUsIDB4OEI1RCwgMHgzMjM3LAorICAgIDB4OEI1RiwgMHgxNjQ4LCAweDhCNjAsIDB4MzIzNSwgMHg4QjYzLCAweDMyMzksIDB4OEI2NSwgMHgzMjNBLCAweDhCNjYsCisgICAgMHgxNjQ2LCAweDhCNjcsIDB4MzIzQiwgMHg4QjY4LCAweDMyMzgsIDB4OEI2QSwgMHgzMjM2LCAweDhCNkIsIDB4MTY0OSwKKyAgICAweDhCNkMsIDB4MTY0NSwgMHg4QjZELCAweDMyM0MsIDB4OEI2RiwgMHgxNjQ3LCAweDhCNzAsIDB4MTY0NCwgMHg4Qjc0LAorICAgIDB4MTY4RiwgMHg4Qjc3LCAweDE2OTAsIDB4OEI3OCwgMHgzMzEyLCAweDhCNzksIDB4MzMxMSwgMHg4QjdBLCAweDMzMTQsCisgICAgMHg4QjdCLCAweDMzMTUsIDB4OEI3RCwgMHgxNjkxLCAweDhCN0UsIDB4MzNCNiwgMHg4QjdGLCAweDMzQkIsIDB4OEI4MCwKKyAgICAweDE2RDgsIDB4OEI4MiwgMHgzM0I4LCAweDhCODQsIDB4MzNCNywgMHg4Qjg1LCAweDMzQkEsIDB4OEI4NiwgMHgzM0I5LAorICAgIDB4OEI4OCwgMHgzNDQwLCAweDhCOEEsIDB4MTcwQSwgMHg4QjhCLCAweDM0M0YsIDB4OEI4QywgMHgzNDNELCAweDhCOEUsCisgICAgMHgzNDNFLCAweDhCOTIsIDB4MTcyQywgMHg4QjkzLCAweDE3MkIsIDB4OEI5NCwgMHgzNDlDLCAweDhCOTUsIDB4MzQ5RCwKKyAgICAweDhCOTYsIDB4MTcyRCwgMHg4Qjk4LCAweDM0RTcsIDB4OEI5OSwgMHgzNEU4LCAweDhCOUEsIDB4MTc1NCwgMHg4QjlDLAorICAgIDB4MTc1QSwgMHg4QjlFLCAweDM1MjIsIDB4OEI5RiwgMHgzNTNGLCAweDhDMzcsIDB4MDUwQiwgMHg4QzM5LCAweDIwNkIsCisgICAgMHg4QzNCLCAweDIwNkMsIDB4OEMzQywgMHgyNTk3LCAweDhDM0QsIDB4MjgwOSwgMHg4QzNFLCAweDJBNTMsIDB4OEMzRiwKKyAgICAweDE0ODEsIDB4OEM0MSwgMHgxNDgwLCAweDhDNDIsIDB4MkZFMCwgMHg4QzQzLCAweDMxMkYsIDB4OEM0NSwgMHgzNDQxLAorICAgIDB4OEM0NiwgMHgwNTBDLCAweDhDNDcsIDB4MUUwOSwgMHg4QzQ4LCAweDA5QzksIDB4OEM0OSwgMHgwQkE3LCAweDhDNEEsCisgICAgMHgyNTk5LCAweDhDNEIsIDB4MjU5OCwgMHg4QzRDLCAweDEyMjMsIDB4OEM0RCwgMHgyQTU0LCAweDhDNEUsIDB4MTIyNCwKKyAgICAweDhDNEYsIDB4MkU2QywgMHg4QzUwLCAweDE1MkUsIDB4OEM1NCwgMHgxNzYzLCAweDhDNTUsIDB4MDUwRCwgMHg4QzU2LAorICAgIDB4MUE0OCwgMHg4QzU3LCAweDFFMEEsIDB4OEM1QSwgMHgwQkE4LCAweDhDNUMsIDB4MjA2RCwgMHg4QzVELCAweDIwNkUsCisgICAgMHg4QzVGLCAweDIyRjgsIDB4OEM2MSwgMHgwRDY1LCAweDhDNjIsIDB4MEYxQiwgMHg4QzY0LCAweDI1OUIsIDB4OEM2NSwKKyAgICAweDI1OUEsIDB4OEM2NiwgMHgyNTlDLCAweDhDNjgsIDB4MjgwQSwgMHg4QzY5LCAweDI4MEIsIDB4OEM2QSwgMHgxMEI0LAorICAgIDB4OEM2QiwgMHgxMzVELCAweDhDNkMsIDB4MTIyNSwgMHg4QzZELCAweDEzNUUsIDB4OEM2RiwgMHgyRTcwLCAweDhDNzAsCisgICAgMHgyRTZELCAweDhDNzEsIDB4MkU2RiwgMHg4QzcyLCAweDJFNkUsIDB4OEM3MywgMHgxNDgyLCAweDhDNzUsIDB4MkZFMSwKKyAgICAweDhDNzYsIDB4MzEzMSwgMHg4Qzc3LCAweDMxMzAsIDB4OEM3OCwgMHgxOEU3LCAweDhDNzksIDB4MDlDQiwgMHg4QzdBLAorICAgIDB4MDlDQSwgMHg4QzdCLCAweDFFMEIsIDB4OEM3RCwgMHgyMDZGLCAweDhDODAsIDB4MjJGQSwgMHg4QzgxLCAweDIyRjksCisgICAgMHg4QzgyLCAweDBENjYsIDB4OEM4NCwgMHgyNTlFLCAweDhDODUsIDB4MjU5RiwgMHg4Qzg2LCAweDI1OUQsIDB4OEM4OSwKKyAgICAweDBGMUQsIDB4OEM4QSwgMHgwRjFDLCAweDhDOEMsIDB4MTBCNiwgMHg4QzhELCAweDEwQjUsIDB4OEM4RiwgMHgyQTU1LAorICAgIDB4OEM5MCwgMHgyQzk4LCAweDhDOTEsIDB4MkM5NiwgMHg4QzkyLCAweDJDOTcsIDB4OEM5MywgMHgxMzVGLCAweDhDOTQsCisgICAgMHgyRTcyLCAweDhDOTUsIDB4MkU3MSwgMHg4Qzk3LCAweDJGRTQsIDB4OEM5OCwgMHgyRkUzLCAweDhDOTksIDB4MkZFMiwKKyAgICAweDhDOUEsIDB4MzEzMiwgMHg4QzlDLCAweDM1MjMsIDB4OEM5RCwgMHgwNTBFLCAweDhDOUUsIDB4MDgwQSwgMHg4Q0EwLAorICAgIDB4MDgwQiwgMHg4Q0ExLCAweDA5Q0MsIDB4OENBMiwgMHgwOUNELCAweDhDQTMsIDB4MUUwRCwgMHg4Q0E0LCAweDFFMEMsCisgICAgMHg4Q0E1LCAweDIwNzAsIDB4OENBNywgMHgwQkFFLCAweDhDQTgsIDB4MEJBQywgMHg4Q0E5LCAweDBCQTksIDB4OENBQSwKKyAgICAweDBCQUQsIDB4OENBQiwgMHgwQkFCLCAweDhDQUMsIDB4MEJBQSwgMHg4Q0FGLCAweDBENjcsIDB4OENCMCwgMHgyMkZELAorICAgIDB4OENCMiwgMHgwRjIyLCAweDhDQjMsIDB4MEQ2OSwgMHg4Q0I0LCAweDBENkUsIDB4OENCNSwgMHgyMkZGLCAweDhDQjYsCisgICAgMHgwRDcwLCAweDhDQjcsIDB4MEQ2RiwgMHg4Q0I4LCAweDBENzIsIDB4OENCOSwgMHgyMkZFLCAweDhDQkEsIDB4MjJGQiwKKyAgICAweDhDQkIsIDB4MEQ2QywgMHg4Q0JDLCAweDBENjgsIDB4OENCRCwgMHgwRDZBLCAweDhDQkUsIDB4MjJGQywgMHg4Q0JGLAorICAgIDB4MEQ3MSwgMHg4Q0MwLCAweDBENkQsIDB4OENDMSwgMHgwRDZCLCAweDhDQzIsIDB4MEYyNCwgMHg4Q0MzLCAweDBGMjMsCisgICAgMHg4Q0M0LCAweDBGMjEsIDB4OENDNSwgMHgwRjI1LCAweDhDQzcsIDB4MEYxRiwgMHg4Q0M4LCAweDBGMjAsIDB4OENDQSwKKyAgICAweDBGMUUsIDB4OENDQywgMHgyNUEwLCAweDhDQ0YsIDB4MjgwRCwgMHg4Q0QxLCAweDEwQjgsIDB4OENEMiwgMHgxMEI5LAorICAgIDB4OENEMywgMHgxMEI3LCAweDhDRDUsIDB4MjgwQywgMHg4Q0Q3LCAweDI4MEUsIDB4OENEOSwgMHgyQTU4LCAweDhDREEsCisgICAgMHgyQTVBLCAweDhDREMsIDB4MTIyRSwgMHg4Q0RELCAweDJBNUIsIDB4OENERSwgMHgxMjI3LCAweDhDREYsIDB4MkE1NywKKyAgICAweDhDRTAsIDB4MTIyNiwgMHg4Q0UxLCAweDEyMzAsIDB4OENFMiwgMHgxMjJDLCAweDhDRTMsIDB4MTIyRCwgMHg4Q0U0LAorICAgIDB4MTIyOSwgMHg4Q0U1LCAweDJBNTYsIDB4OENFNiwgMHgxMjI4LCAweDhDRTcsIDB4MkE1QywgMHg4Q0U4LCAweDJBNTksCisgICAgMHg4Q0VBLCAweDEyMkYsIDB4OENFQywgMHgxMjJBLCAweDhDRUQsIDB4MTIyQiwgMHg4Q0VFLCAweDJDOUEsIDB4OENGMCwKKyAgICAweDJDOUMsIDB4OENGMSwgMHgyQzlCLCAweDhDRjMsIDB4MkM5RCwgMHg4Q0Y0LCAweDEzNjAsIDB4OENGNSwgMHgyQzk5LAorICAgIDB4OENGOCwgMHgxNDg2LCAweDhDRjksIDB4MkU3MywgMHg4Q0ZBLCAweDE0ODMsIDB4OENGQiwgMHgxNDg3LCAweDhDRkMsCisgICAgMHgxNDg1LCAweDhDRkQsIDB4MTQ4NCwgMHg4Q0ZFLCAweDJGRTUsIDB4OEQwMCwgMHgyRkU4LCAweDhEMDIsIDB4MkZFNywKKyAgICAweDhEMDQsIDB4MkZFNiwgMHg4RDA1LCAweDE1MkYsIDB4OEQwNiwgMHgzMTMzLCAweDhEMDcsIDB4MzEzNCwgMHg4RDA4LAorICAgIDB4MTVDRCwgMHg4RDA5LCAweDMxMzUsIDB4OEQwQSwgMHgxNUNFLCAweDhEMEQsIDB4MTY0QiwgMHg4RDBGLCAweDE2NEEsCisgICAgMHg4RDEwLCAweDMzMTYsIDB4OEQxMywgMHgxNjkyLCAweDhEMTQsIDB4MzMxNywgMHg4RDE1LCAweDMzQkMsIDB4OEQxNiwKKyAgICAweDE2RDksIDB4OEQxNywgMHgxNkRBLCAweDhEMTksIDB4MzQ0MiwgMHg4RDFCLCAweDE3MkYsIDB4OEQ2NCwgMHgwNTBGLAorICAgIDB4OEQ2NiwgMHgwQkIwLCAweDhENjcsIDB4MEJBRiwgMHg4RDY4LCAweDI1QTEsIDB4OEQ2OSwgMHgyNUEyLCAweDhENkIsCisgICAgMHgxMEJBLCAweDhENkMsIDB4MkM5RSwgMHg4RDZELCAweDEyMzEsIDB4OEQ2RSwgMHgyQzlGLCAweDhENkYsIDB4MkU3NCwKKyAgICAweDhENzAsIDB4MDUxMCwgMHg4RDcyLCAweDFDMDYsIDB4OEQ3MywgMHgwODBELCAweDhENzQsIDB4MDgwQywgMHg4RDc2LAorICAgIDB4MUUwRSwgMHg4RDc3LCAweDA5Q0UsIDB4OEQ3OCwgMHgxRTBGLCAweDhENzksIDB4MjA3MywgMHg4RDdCLCAweDIwNzIsCisgICAgMHg4RDdELCAweDIwNzEsIDB4OEQ4MCwgMHgyMzAxLCAweDhEODEsIDB4MEQ3NSwgMHg4RDg0LCAweDIzMDAsIDB4OEQ4NSwKKyAgICAweDBENzQsIDB4OEQ4OSwgMHgyMzAyLCAweDhEOEEsIDB4MEQ3MywgMHg4RDhDLCAweDI1QTQsIDB4OEQ4RCwgMHgyNUE3LAorICAgIDB4OEQ4RSwgMHgyNUE1LCAweDhEOEYsIDB4MjVBNiwgMHg4RDkwLCAweDI1QUEsIDB4OEQ5MSwgMHgyNUEzLCAweDhEOTIsCisgICAgMHgyNUFCLCAweDhEOTMsIDB4MjVBOCwgMHg4RDk0LCAweDI1QTksIDB4OEQ5NSwgMHgxMEJDLCAweDhEOTYsIDB4MjgwRiwKKyAgICAweDhEOTksIDB4MTBCQiwgMHg4RDlCLCAweDJBNjAsIDB4OEQ5QywgMHgyQTVFLCAweDhEOUYsIDB4MTIzMiwgMHg4REEwLAorICAgIDB4MkE1RCwgMHg4REExLCAweDJBNUYsIDB4OERBMywgMHgxMjMzLCAweDhEQTUsIDB4MkNBMCwgMHg4REE3LCAweDJDQTEsCisgICAgMHg4REE4LCAweDE0ODgsIDB4OERBQSwgMHgzMTM3LCAweDhEQUIsIDB4MzEzOSwgMHg4REFDLCAweDMxMzYsIDB4OERBRCwKKyAgICAweDMxMzgsIDB4OERBRSwgMHgzMjNELCAweDhEQUYsIDB4MzMxOCwgMHg4REIyLCAweDM1MDksIDB4OERCMywgMHgwNTExLAorICAgIDB4OERCNCwgMHgwODBFLCAweDhEQjUsIDB4MUUxMCwgMHg4REI2LCAweDFFMTIsIDB4OERCNywgMHgxRTExLCAweDhEQjksCisgICAgMHgyMDc2LCAweDhEQkEsIDB4MEJCMiwgMHg4REJDLCAweDIwNzQsIDB4OERCRSwgMHgwQkIxLCAweDhEQkYsIDB4MjA3NywKKyAgICAweDhEQzEsIDB4MjA3OCwgMHg4REMyLCAweDIwNzUsIDB4OERDNSwgMHgyMzBFLCAweDhEQzYsIDB4MEQ3RCwgMHg4REM3LAorICAgIDB4MjMwNiwgMHg4REM4LCAweDIzMEMsIDB4OERDQiwgMHgwRDc4LCAweDhEQ0MsIDB4MEQ3QiwgMHg4RENELCAweDIzMDUsCisgICAgMHg4RENFLCAweDBENzYsIDB4OERDRiwgMHgyMzA5LCAweDhERDAsIDB4MjVCMSwgMHg4REQxLCAweDBEN0EsIDB4OEREMywKKyAgICAweDIzMDQsIDB4OERENSwgMHgyMzBBLCAweDhERDYsIDB4MjMwNywgMHg4REQ3LCAweDIzMEQsIDB4OEREOCwgMHgyMzAzLAorICAgIDB4OEREOSwgMHgyMzBCLCAweDhEREEsIDB4MEQ3OSwgMHg4RERCLCAweDBEN0MsIDB4OEREQywgMHgyMzA4LCAweDhEREQsCisgICAgMHgwRDc3LCAweDhEREYsIDB4MEYyNywgMHg4REUwLCAweDI1QUQsIDB4OERFMSwgMHgwRjI2LCAweDhERTIsIDB4MjVCNCwKKyAgICAweDhERTMsIDB4MjVCMywgMHg4REU0LCAweDBGMkQsIDB4OERFNiwgMHgwRjJFLCAweDhERTcsIDB4MjVCNSwgMHg4REU4LAorICAgIDB4MEYyOCwgMHg4REU5LCAweDI1QjIsIDB4OERFQSwgMHgwRjJDLCAweDhERUIsIDB4MjVCNywgMHg4REVDLCAweDI1QUUsCisgICAgMHg4REVFLCAweDI1QjAsIDB4OERFRiwgMHgwRjI5LCAweDhERjAsIDB4MjVBQywgMHg4REYxLCAweDI1QUYsIDB4OERGMiwKKyAgICAweDI1QjYsIDB4OERGMywgMHgwRjJBLCAweDhERjQsIDB4MjVCOCwgMHg4REZBLCAweDBGMkIsIDB4OERGQywgMHgxMEJELAorICAgIDB4OERGRCwgMHgyODE0LCAweDhERkUsIDB4MjgxQSwgMHg4REZGLCAweDI4MTIsIDB4OEUwMCwgMHgyODFCLCAweDhFMDIsCisgICAgMHgyODExLCAweDhFMDMsIDB4MjgxNiwgMHg4RTA0LCAweDI4MUMsIDB4OEUwNSwgMHgyODE5LCAweDhFMDYsIDB4MjgxOCwKKyAgICAweDhFMDcsIDB4MjgxNywgMHg4RTA5LCAweDI4MTAsIDB4OEUwQSwgMHgyODE1LCAweDhFMEQsIDB4MjgxMywgMHg4RTBGLAorICAgIDB4MTIzOCwgMHg4RTEwLCAweDEyMzUsIDB4OEUxMSwgMHgyQTY5LCAweDhFMTIsIDB4MkE2RSwgMHg4RTEzLCAweDJBNzAsCisgICAgMHg4RTE0LCAweDJBNkQsIDB4OEUxNSwgMHgyQTY2LCAweDhFMTYsIDB4MkE2OCwgMHg4RTE3LCAweDJBNzIsIDB4OEUxOCwKKyAgICAweDJBNkYsIDB4OEUxOSwgMHgyQTZBLCAweDhFMUEsIDB4MkE3MywgMHg4RTFCLCAweDJBNjcsIDB4OEUxQywgMHgyQTcxLAorICAgIDB4OEUxRCwgMHgxMjM2LCAweDhFMUUsIDB4MTIzQywgMHg4RTFGLCAweDEyM0EsIDB4OEUyMCwgMHgyQTYxLCAweDhFMjEsCisgICAgMHgxMjNCLCAweDhFMjIsIDB4MTIzNywgMHg4RTIzLCAweDJBNjIsIDB4OEUyNCwgMHgyQTY0LCAweDhFMjUsIDB4MkE2MywKKyAgICAweDhFMjYsIDB4MkE2QiwgMHg4RTI3LCAweDJBNkMsIDB4OEUyOSwgMHgxMjM5LCAweDhFMkIsIDB4MTIzNCwgMHg4RTJFLAorICAgIDB4MkE2NSwgMHg4RTMwLCAweDJDQUIsIDB4OEUzMSwgMHgxMzYyLCAweDhFMzMsIDB4MkNBMiwgMHg4RTM0LCAweDEzNjMsCisgICAgMHg4RTM1LCAweDEzNjYsIDB4OEUzNiwgMHgyQ0E3LCAweDhFMzgsIDB4MkNBNCwgMHg4RTM5LCAweDEzNjUsIDB4OEUzQywKKyAgICAweDJDQTgsIDB4OEUzRCwgMHgyQ0E5LCAweDhFM0UsIDB4MkNBMywgMHg4RTNGLCAweDJDQUMsIDB4OEU0MCwgMHgyQ0E1LAorICAgIDB4OEU0MSwgMHgyQ0FBLCAweDhFNDIsIDB4MTM2NCwgMHg4RTQ0LCAweDEzNjEsIDB4OEU0NSwgMHgyQ0E2LCAweDhFNDcsCisgICAgMHgyRTdBLCAweDhFNDgsIDB4MTQ4QiwgMHg4RTQ5LCAweDE0ODksIDB4OEU0QSwgMHgxNDhDLCAweDhFNEIsIDB4MTQ4QSwKKyAgICAweDhFNEMsIDB4MkU3OSwgMHg4RTRELCAweDJFNzYsIDB4OEU0RSwgMHgyRTc1LCAweDhFNTAsIDB4MkU3OCwgMHg4RTUzLAorICAgIDB4MkU3NywgMHg4RTU0LCAweDJGRjYsIDB4OEU1NSwgMHgxNTM1LCAweDhFNTYsIDB4MkZFRCwgMHg4RTU3LCAweDJGRUMsCisgICAgMHg4RTU5LCAweDE1MzAsIDB4OEU1QSwgMHgyRkYyLCAweDhFNUIsIDB4MkZGMSwgMHg4RTVDLCAweDJGRTksIDB4OEU1RCwKKyAgICAweDJGRjQsIDB4OEU1RSwgMHgyRkVFLCAweDhFNUYsIDB4MTUzNCwgMHg4RTYwLCAweDJGRUIsIDB4OEU2MSwgMHgyRkYzLAorICAgIDB4OEU2MiwgMHgyRkVBLCAweDhFNjMsIDB4MTUzMSwgMHg4RTY0LCAweDE1MzMsIDB4OEU2NSwgMHgyRkVGLCAweDhFNjYsCisgICAgMHgxNTMyLCAweDhFNjcsIDB4MkZGMCwgMHg4RTY5LCAweDJGRjUsIDB4OEU2QSwgMHgzMTNELCAweDhFNkMsIDB4MTVEMywKKyAgICAweDhFNkQsIDB4MzEzQSwgMHg4RTZGLCAweDMxM0UsIDB4OEU3MiwgMHgxNUQwLCAweDhFNzMsIDB4MzEzQywgMHg4RTc0LAorICAgIDB4MTVENSwgMHg4RTc2LCAweDE1RDIsIDB4OEU3OCwgMHgzMTNCLCAweDhFN0EsIDB4MTVENCwgMHg4RTdCLCAweDMxM0YsCisgICAgMHg4RTdDLCAweDE1Q0YsIDB4OEU4MSwgMHgxNjRELCAweDhFODIsIDB4MTY0RiwgMHg4RTg0LCAweDMyNDAsIDB4OEU4NSwKKyAgICAweDE2NEUsIDB4OEU4NiwgMHgzMjNFLCAweDhFODcsIDB4MTVEMSwgMHg4RTg4LCAweDMyM0YsIDB4OEU4OSwgMHgxNjRDLAorICAgIDB4OEU4QSwgMHgxNjkzLCAweDhFOEIsIDB4MTY5NSwgMHg4RThDLCAweDMzMUEsIDB4OEU4RCwgMHgxNjk0LCAweDhFOEUsCisgICAgMHgzMzE5LCAweDhFOTAsIDB4MzNDMSwgMHg4RTkxLCAweDE2REIsIDB4OEU5MiwgMHgzM0MwLCAweDhFOTMsIDB4MTZEQywKKyAgICAweDhFOTQsIDB4MzNCRSwgMHg4RTk1LCAweDMzQkQsIDB4OEU5NiwgMHgzM0MyLCAweDhFOTcsIDB4MzNDMywgMHg4RTk4LAorICAgIDB4MzQ0MywgMHg4RTlBLCAweDMzQkYsIDB4OEU5RCwgMHgzNEExLCAweDhFOUUsIDB4MzQ5RSwgMHg4RTlGLCAweDM0OUYsCisgICAgMHg4RUEwLCAweDM0QTAsIDB4OEVBMSwgMHgxNzQ5LCAweDhFQTMsIDB4MzRFQiwgMHg4RUE0LCAweDM0RUEsIDB4OEVBNSwKKyAgICAweDM0RTksIDB4OEVBNiwgMHgzNTBBLCAweDhFQTgsIDB4MzUzNywgMHg4RUE5LCAweDM1MjQsIDB4OEVBQSwgMHgxNzVCLAorICAgIDB4OEVBQiwgMHgwNTEyLCAweDhFQUMsIDB4MDlDRiwgMHg4RUIyLCAweDBGMkYsIDB4OEVCQSwgMHgxMjNELCAweDhFQkQsCisgICAgMHgyQ0FELCAweDhFQzAsIDB4MTUzNiwgMHg4RUMyLCAweDMxNDAsIDB4OEVDOSwgMHgzNTI1LCAweDhFQ0EsIDB4MDUxMywKKyAgICAweDhFQ0IsIDB4MDY4RCwgMHg4RUNDLCAweDA4MTAsIDB4OEVDRCwgMHgwODBGLCAweDhFQ0YsIDB4MDlEMiwgMHg4RUQxLAorICAgIDB4MUUxMywgMHg4RUQyLCAweDA5RDAsIDB4OEVEMywgMHgxRTE0LCAweDhFRDQsIDB4MDlEMSwgMHg4RUQ3LCAweDIwN0QsCisgICAgMHg4RUQ4LCAweDIwNzksIDB4OEVEQiwgMHgwQkIzLCAweDhFREMsIDB4MjA3QywgMHg4RURELCAweDIwN0IsIDB4OEVERSwKKyAgICAweDIwN0EsIDB4OEVERiwgMHgwQkI0LCAweDhFRTAsIDB4MjA3RSwgMHg4RUUxLCAweDIwN0YsIDB4OEVFNSwgMHgyMzE1LAorICAgIDB4OEVFNiwgMHgyMzEzLCAweDhFRTcsIDB4MjMxNywgMHg4RUU4LCAweDIzMTgsIDB4OEVFOSwgMHgyMzFFLCAweDhFRUIsCisgICAgMHgyMzFBLCAweDhFRUMsIDB4MjMxQywgMHg4RUVFLCAweDIzMTQsIDB4OEVFRiwgMHgyMzBGLCAweDhFRjEsIDB4MjMxQiwKKyAgICAweDhFRjQsIDB4MjMxRCwgMHg4RUY1LCAweDIzMTYsIDB4OEVGNiwgMHgyMzE5LCAweDhFRjcsIDB4MjMxMCwgMHg4RUY4LAorICAgIDB4MEQ3RiwgMHg4RUY5LCAweDIzMTIsIDB4OEVGQSwgMHgyMzExLCAweDhFRkIsIDB4MEQ3RSwgMHg4RUZDLCAweDBEODAsCisgICAgMHg4RUZFLCAweDBGMzIsIDB4OEVGRiwgMHgyNUJBLCAweDhGMDAsIDB4MjVCQywgMHg4RjAxLCAweDI1QkIsIDB4OEYwMiwKKyAgICAweDI1QzAsIDB4OEYwMywgMHgwRjMwLCAweDhGMDUsIDB4MjVCRCwgMHg4RjA2LCAweDI1QjksIDB4OEYwNywgMHgyNUJFLAorICAgIDB4OEYwOCwgMHgyNUJGLCAweDhGMDksIDB4MEYzMSwgMHg4RjBBLCAweDBGMzMsIDB4OEYwQiwgMHgyNUMxLCAweDhGMEQsCisgICAgMHgyODIwLCAweDhGMEUsIDB4MjgxRiwgMHg4RjEwLCAweDI4MUQsIDB4OEYxMSwgMHgyODFFLCAweDhGMTIsIDB4MTBCRiwKKyAgICAweDhGMTMsIDB4MTBDMSwgMHg4RjE0LCAweDEwQkUsIDB4OEYxNSwgMHgxMEMwLCAweDhGMTYsIDB4MkE3QSwgMHg4RjE3LAorICAgIDB4MkE3QiwgMHg4RjE4LCAweDJBNzYsIDB4OEYxQSwgMHgyQTc3LCAweDhGMUIsIDB4MTIzRiwgMHg4RjFDLCAweDEyNDQsCisgICAgMHg4RjFELCAweDEyM0UsIDB4OEYxRSwgMHgxMjQ1LCAweDhGMUYsIDB4MTI0MCwgMHg4RjIwLCAweDJBNzgsIDB4OEYyMywKKyAgICAweDJBNzksIDB4OEYyNCwgMHgyQTc1LCAweDhGMjUsIDB4MTI0NiwgMHg4RjI2LCAweDEyNDIsIDB4OEYyOSwgMHgxMjQxLAorICAgIDB4OEYyQSwgMHgxMjQzLCAweDhGMkMsIDB4MkE3NCwgMHg4RjJFLCAweDJDQUYsIDB4OEYyRiwgMHgxMzY4LCAweDhGMzIsCisgICAgMHgyQ0IxLCAweDhGMzMsIDB4MTM2QSwgMHg4RjM0LCAweDJDQjQsIDB4OEYzNSwgMHgyQ0IwLCAweDhGMzYsIDB4MkNBRSwKKyAgICAweDhGMzcsIDB4MkNCMywgMHg4RjM4LCAweDEzNjksIDB4OEYzOSwgMHgyQ0IyLCAweDhGM0IsIDB4MTM2NywgMHg4RjNFLAorICAgIDB4MTQ4RSwgMHg4RjNGLCAweDE0OTEsIDB4OEY0MCwgMHgyRTdDLCAweDhGNDIsIDB4MTQ4RiwgMHg4RjQzLCAweDJFN0IsCisgICAgMHg4RjQ0LCAweDE0OEQsIDB4OEY0NSwgMHgxNDkwLCAweDhGNDYsIDB4MkZGNywgMHg4RjQ3LCAweDJGRjgsIDB4OEY0OCwKKyAgICAweDJGRjksIDB4OEY0OSwgMHgxNTM3LCAweDhGNEIsIDB4MkZGQSwgMHg4RjRELCAweDE1MzgsIDB4OEY0RSwgMHgxNUQ3LAorICAgIDB4OEY0RiwgMHgzMTQzLCAweDhGNTAsIDB4MzE0NCwgMHg4RjUxLCAweDMxNDIsIDB4OEY1MiwgMHgzMTQxLCAweDhGNTMsCisgICAgMHgzMTQ1LCAweDhGNTQsIDB4MTVENiwgMHg4RjU1LCAweDMyNDQsIDB4OEY1NiwgMHgzMjQyLCAweDhGNTcsIDB4MzI0MywKKyAgICAweDhGNTgsIDB4MzI0NSwgMHg4RjU5LCAweDMyNDEsIDB4OEY1QSwgMHgzMjQ2LCAweDhGNUIsIDB4MzMxQywgMHg4RjVELAorICAgIDB4MzMxRCwgMHg4RjVFLCAweDMzMUIsIDB4OEY1RiwgMHgxNjk2LCAweDhGNjAsIDB4MzNDNCwgMHg4RjYxLCAweDE2REQsCisgICAgMHg4RjYyLCAweDMzQzUsIDB4OEY2MywgMHgzNDQ1LCAweDhGNjQsIDB4MzQ0NCwgMHg4RjlCLCAweDA1MTQsIDB4OEY5QywKKyAgICAweDBEODEsIDB4OEY5RiwgMHgwRjM0LCAweDhGQTMsIDB4MTBDMiwgMHg4RkE2LCAweDEzNkMsIDB4OEZBOCwgMHgxMzZCLAorICAgIDB4OEZBRCwgMHgxNUQ4LCAweDhGQUUsIDB4MTYyRiwgMHg4RkFGLCAweDE2OTcsIDB4OEZCMCwgMHgwNTE1LCAweDhGQjEsCisgICAgMHgwOUQzLCAweDhGQjIsIDB4MEYzNSwgMHg4RkI0LCAweDMxNDYsIDB4OEZCNSwgMHgwMjMwLCAweDhGQkYsIDB4MThFOSwKKyAgICAweDhGQzIsIDB4MDUxNiwgMHg4RkM0LCAweDA1MTksIDB4OEZDNSwgMHgwNTE4LCAweDhGQzYsIDB4MDUxNywgMHg4RkM5LAorICAgIDB4MThFOCwgMHg4RkNCLCAweDFBNEEsIDB4OEZDRCwgMHgxQTRDLCAweDhGQ0UsIDB4MDY4RSwgMHg4RkQxLCAweDA2OTAsCisgICAgMHg4RkQyLCAweDFBNDksIDB4OEZEMywgMHgxQTRCLCAweDhGRDQsIDB4MDY4RiwgMHg4RkQ1LCAweDFBNEUsIDB4OEZENiwKKyAgICAweDFBNEQsIDB4OEZENywgMHgxQTRGLCAweDhGRTAsIDB4MUMwQSwgMHg4RkUxLCAweDFDMDgsIDB4OEZFMiwgMHgwODEzLAorICAgIDB4OEZFMywgMHgxQzA3LCAweDhGRTQsIDB4MDgxOCwgMHg4RkU1LCAweDA4MTUsIDB4OEZFNiwgMHgwODEyLCAweDhGRTgsCisgICAgMHgwODE5LCAweDhGRUEsIDB4MDgxNCwgMHg4RkVCLCAweDA4MTcsIDB4OEZFRCwgMHgwODE2LCAweDhGRUUsIDB4MUMwOSwKKyAgICAweDhGRjAsIDB4MDgxMSwgMHg4RkY0LCAweDA5RDksIDB4OEZGNSwgMHgxRTE2LCAweDhGRjYsIDB4MUUxQywgMHg4RkY3LAorICAgIDB4MDlENiwgMHg4RkY4LCAweDA5REQsIDB4OEZGQSwgMHgwOUQ4LCAweDhGRkIsIDB4MUUxOSwgMHg4RkZDLCAweDFFMUIsCisgICAgMHg4RkZELCAweDA5REIsIDB4OEZGRSwgMHgxRTE1LCAweDhGRkYsIDB4MUUxOCwgMHg5MDAwLCAweDA5RDcsIDB4OTAwMSwKKyAgICAweDA5RDQsIDB4OTAwMiwgMHgxRTE3LCAweDkwMDMsIDB4MDlEQSwgMHg5MDA0LCAweDFFMUEsIDB4OTAwNSwgMHgwOURDLAorICAgIDB4OTAwNiwgMHgwOUQ1LCAweDkwMEIsIDB4MjA4MSwgMHg5MDBDLCAweDIwODQsIDB4OTAwRCwgMHgwQkI2LCAweDkwMEYsCisgICAgMHgwQkMwLCAweDkwMTAsIDB4MEJCQywgMHg5MDExLCAweDIwODIsIDB4OTAxNCwgMHgwQkM0LCAweDkwMTUsIDB4MEJCRCwKKyAgICAweDkwMTYsIDB4MEJDMiwgMHg5MDE3LCAweDBCQjgsIDB4OTAxOSwgMHgwQkI1LCAweDkwMUEsIDB4MEJCNywgMHg5MDFCLAorICAgIDB4MEJDMywgMHg5MDFDLCAweDIwODMsIDB4OTAxRCwgMHgwQkJCLCAweDkwMUUsIDB4MEJCRSwgMHg5MDFGLCAweDBCQkEsCisgICAgMHg5MDIwLCAweDBCQkYsIDB4OTAyMSwgMHgyMDg1LCAweDkwMjIsIDB4MEJDMSwgMHg5MDIzLCAweDBCQjksIDB4OTAyNCwKKyAgICAweDIwODAsIDB4OTAyRCwgMHgyMzFGLCAweDkwMkUsIDB4MEQ4MiwgMHg5MDJGLCAweDIzMjEsIDB4OTAzMSwgMHgwRDg0LAorICAgIDB4OTAzMiwgMHgwRDg2LCAweDkwMzQsIDB4MjMyMCwgMHg5MDM1LCAweDBEODMsIDB4OTAzNiwgMHgwRDg3LCAweDkwMzgsCisgICAgMHgwRDg1LCAweDkwM0MsIDB4MEYzQiwgMHg5MDNELCAweDI1QzYsIDB4OTAzRSwgMHgwRjQzLCAweDkwM0YsIDB4MjVDMywKKyAgICAweDkwNDEsIDB4MEY0NCwgMHg5MDQyLCAweDBGMzksIDB4OTA0NCwgMHgyNUM0LCAweDkwNDcsIDB4MEYzRSwgMHg5MDQ5LAorICAgIDB4MjVDNSwgMHg5MDRBLCAweDBGMzcsIDB4OTA0QiwgMHgwRjM2LCAweDkwNEQsIDB4MEY0MSwgMHg5MDRFLCAweDBGNDAsCisgICAgMHg5MDRGLCAweDBGM0YsIDB4OTA1MCwgMHgwRjNELCAweDkwNTEsIDB4MEY0MiwgMHg5MDUyLCAweDI1QzIsIDB4OTA1MywKKyAgICAweDBGMzgsIDB4OTA1NCwgMHgwRjNBLCAweDkwNTUsIDB4MEYzQywgMHg5MDU4LCAweDEwQzQsIDB4OTA1OSwgMHgxMEM3LAorICAgIDB4OTA1QiwgMHgxMENCLCAweDkwNUMsIDB4MTBDNSwgMHg5MDVELCAweDEwQ0EsIDB4OTA1RSwgMHgxMEM4LCAweDkwNjAsCisgICAgMHgxMEMzLCAweDkwNjIsIDB4MTBDOSwgMHg5MDYzLCAweDEwQzYsIDB4OTA2NywgMHgyQTdGLCAweDkwNjgsIDB4MTI0OSwKKyAgICAweDkwNjksIDB4MTI0NywgMHg5MDZCLCAweDJBODAsIDB4OTA2RCwgMHgxMjRBLCAweDkwNkUsIDB4MTI0OCwgMHg5MDZGLAorICAgIDB4MkE3RSwgMHg5MDcwLCAweDJBN0QsIDB4OTA3MiwgMHgxMzcwLCAweDkwNzMsIDB4MkE3QywgMHg5MDc0LCAweDEzNkUsCisgICAgMHg5MDc1LCAweDEzNkQsIDB4OTA3NiwgMHgyQ0I1LCAweDkwNzcsIDB4MTI0QiwgMHg5MDc4LCAweDEzNkYsIDB4OTA3OSwKKyAgICAweDJDQjYsIDB4OTA3QSwgMHgxMzcyLCAweDkwN0IsIDB4MkNCNywgMHg5MDdDLCAweDEzNzEsIDB4OTA3RCwgMHgxNDkzLAorICAgIDB4OTA3RSwgMHgyRTdFLCAweDkwN0YsIDB4MTQ5MiwgMHg5MDgwLCAweDE0OTcsIDB4OTA4MSwgMHgxNDk1LCAweDkwODIsCisgICAgMHgxNDk2LCAweDkwODMsIDB4MTUzQSwgMHg5MDg0LCAweDE0OTQsIDB4OTA4NSwgMHgyRTdELCAweDkwODYsIDB4MkNCOCwKKyAgICAweDkwODcsIDB4MTUzOSwgMHg5MDg4LCAweDE1M0IsIDB4OTA4QSwgMHgxNUQ5LCAweDkwOEIsIDB4MTVEQSwgMHg5MDhELAorICAgIDB4MzI0NywgMHg5MDhGLCAweDE3MEMsIDB4OTA5MCwgMHgxNzBCLCAweDkwOTEsIDB4MDUxQiwgMHg5MDk0LCAweDE4MUUsCisgICAgMHg5MDk1LCAweDA5REUsIDB4OTA5NywgMHgxODFCLCAweDkwOTgsIDB4MTgxQywgMHg5MDk5LCAweDE4MUEsIDB4OTA5QiwKKyAgICAweDE4MUQsIDB4OTA5RSwgMHgxOEVELCAweDkwOUYsIDB4MThFQSwgMHg5MEEwLCAweDE4RUYsIDB4OTBBMSwgMHgxOEVCLAorICAgIDB4OTBBMiwgMHgwNTFDLCAweDkwQTMsIDB4MDUxRiwgMHg5MEE1LCAweDE4RUMsIDB4OTBBNiwgMHgwNTFFLCAweDkwQTcsCisgICAgMHgxOEVFLCAweDkwQUEsIDB4MDUxRCwgMHg5MEFGLCAweDFBNTIsIDB4OTBCMCwgMHgxQTU0LCAweDkwQjEsIDB4MDY5MywKKyAgICAweDkwQjIsIDB4MUE1MCwgMHg5MEIzLCAweDFBNTMsIDB4OTBCNCwgMHgxQTUxLCAweDkwQjUsIDB4MDY5MSwgMHg5MEI2LAorICAgIDB4MDY5NCwgMHg5MEI4LCAweDA2OTIsIDB4OTBCRCwgMHgxQzBDLCAweDkwQkUsIDB4MUMxMCwgMHg5MEJGLCAweDFDMEQsCisgICAgMHg5MEMxLCAweDA4MUMsIDB4OTBDMywgMHgwODFELCAweDkwQzUsIDB4MUMwRiwgMHg5MEM3LCAweDFDMTEsIDB4OTBDOCwKKyAgICAweDFDMTMsIDB4OTBDQSwgMHgwODFBLCAweDkwQ0IsIDB4MUMxMiwgMHg5MENFLCAweDA4MUIsIDB4OTBENCwgMHgyMDhDLAorICAgIDB4OTBENSwgMHgxQzBFLCAweDkwRDYsIDB4MUUxRCwgMHg5MEQ3LCAweDFFMjYsIDB4OTBEOCwgMHgxRTI0LCAweDkwRDksCisgICAgMHgxRTFGLCAweDkwREEsIDB4MUUyMCwgMHg5MERCLCAweDFFMjUsIDB4OTBEQywgMHgxRTI3LCAweDkwREQsIDB4MDlFMCwKKyAgICAweDkwREYsIDB4MUUyMiwgMHg5MEUwLCAweDFFMUUsIDB4OTBFMSwgMHgwOURGLCAweDkwRTIsIDB4MDlFMSwgMHg5MEUzLAorICAgIDB4MUUyMSwgMHg5MEU0LCAweDFFMjgsIDB4OTBFNSwgMHgxRTIzLCAweDkwRTgsIDB4MEJDNSwgMHg5MEU5LCAweDIwOEYsCisgICAgMHg5MEVBLCAweDIwODcsIDB4OTBFQiwgMHgyMDhELCAweDkwRUMsIDB4MjA4RSwgMHg5MEVELCAweDBCQzYsIDB4OTBFRiwKKyAgICAweDIwODYsIDB4OTBGMCwgMHgyMDg4LCAweDkwRjEsIDB4MUMwQiwgMHg5MEYyLCAweDIwOEEsIDB4OTBGMywgMHgyMDhCLAorICAgIDB4OTBGNCwgMHgyMDg5LCAweDkwRjUsIDB4MEQ4OSwgMHg5MEY5LCAweDIzMjgsIDB4OTBGQSwgMHgyQ0I5LCAweDkwRkIsCisgICAgMHgyMzI5LCAweDkwRkMsIDB4MjMyNiwgMHg5MEZELCAweDBCQzcsIDB4OTBGRSwgMHgwRDhCLCAweDkwRkYsIDB4MjMyNSwKKyAgICAweDkxMDAsIDB4MjMyQiwgMHg5MTAxLCAweDIzMkEsIDB4OTEwMiwgMHgwRDg4LCAweDkxMDMsIDB4MjMyRSwgMHg5MTA0LAorICAgIDB4MjMyNCwgMHg5MTA1LCAweDIzMkQsIDB4OTEwNiwgMHgyMzIyLCAweDkxMDcsIDB4MjMyQywgMHg5MTA4LCAweDIzMjcsCisgICAgMHg5MTA5LCAweDBEOEEsIDB4OTEwQiwgMHgyNUNELCAweDkxMEQsIDB4MjVDOCwgMHg5MTBFLCAweDI1Q0UsIDB4OTEwRiwKKyAgICAweDI1QzksIDB4OTExMCwgMHgyNUM3LCAweDkxMTEsIDB4MjVDQSwgMHg5MTEyLCAweDBGNDUsIDB4OTExNCwgMHgyNUNDLAorICAgIDB4OTExNiwgMHgyNUNCLCAweDkxMTcsIDB4MEY0NiwgMHg5MTE4LCAweDEwQ0QsIDB4OTExOSwgMHgxMENDLCAweDkxMUEsCisgICAgMHgyODI3LCAweDkxMUIsIDB4MjgyQSwgMHg5MTFDLCAweDI4MjIsIDB4OTExRCwgMHgyODI2LCAweDkxMUUsIDB4MTBDRSwKKyAgICAweDkxMUYsIDB4MjgyNSwgMHg5MTIwLCAweDI4MjMsIDB4OTEyMSwgMHgyODI5LCAweDkxMjIsIDB4MjgyNCwgMHg5MTIzLAorICAgIDB4MjgyMSwgMHg5MTI0LCAweDI4MjgsIDB4OTEyNiwgMHgyQTg2LCAweDkxMjcsIDB4MTI0RSwgMHg5MTI4LCAweDJGRkIsCisgICAgMHg5MTI5LCAweDJBODMsIDB4OTEyQSwgMHgyQTg0LCAweDkxMkIsIDB4MkE4MiwgMHg5MTJDLCAweDIzMjMsIDB4OTEyRCwKKyAgICAweDEyNEQsIDB4OTEyRSwgMHgyQTg3LCAweDkxMkYsIDB4MkE4MSwgMHg5MTMwLCAweDEyNEMsIDB4OTEzMSwgMHgxMjRGLAorICAgIDB4OTEzMiwgMHgyQTg1LCAweDkxMzMsIDB4MkNCQSwgMHg5MTM0LCAweDEzNzMsIDB4OTEzNSwgMHgyQ0JCLCAweDkxMzYsCisgICAgMHgyQ0JDLCAweDkxMzgsIDB4MkU3RiwgMHg5MTM5LCAweDE0OTgsIDB4OTEzQSwgMHgyRkZDLCAweDkxM0IsIDB4MkZGRCwKKyAgICAweDkxM0UsIDB4MkZGRSwgMHg5MTNGLCAweDMxNDgsIDB4OTE0MCwgMHgzMTQ3LCAweDkxNDEsIDB4MzI0OSwgMHg5MTQzLAorICAgIDB4MzI0OCwgMHg5MTQ0LCAweDMzMUYsIDB4OTE0NSwgMHgzMzIwLCAweDkxNDYsIDB4MzMxRSwgMHg5MTQ3LCAweDMzQzYsCisgICAgMHg5MTQ4LCAweDE2REUsIDB4OTE0OSwgMHgwNTIwLCAweDkxNEEsIDB4MDgxRiwgMHg5MTRCLCAweDA4MUUsIDB4OTE0QywKKyAgICAweDA5RTQsIDB4OTE0RCwgMHgwOUUzLCAweDkxNEUsIDB4MUUyQSwgMHg5MTRGLCAweDFFMkIsIDB4OTE1MCwgMHgxRTI5LAorICAgIDB4OTE1MiwgMHgwOUUyLCAweDkxNTMsIDB4MjA5MywgMHg5MTU1LCAweDIwOTQsIDB4OTE1NiwgMHgyMDkwLCAweDkxNTcsCisgICAgMHgwQkM4LCAweDkxNTgsIDB4MjA5MSwgMHg5MTVBLCAweDIwOTIsIDB4OTE1RiwgMHgyMzMxLCAweDkxNjAsIDB4MjMzMywKKyAgICAweDkxNjEsIDB4MjMyRiwgMHg5MTYyLCAweDIzMzIsIDB4OTE2MywgMHgwRDhDLCAweDkxNjQsIDB4MjMzMCwgMHg5MTY1LAorICAgIDB4MEQ4RCwgMHg5MTY4LCAweDIzRTIsIDB4OTE2OSwgMHgwRjQ5LCAweDkxNkEsIDB4MEY0OCwgMHg5MTZDLCAweDBGNDcsCisgICAgMHg5MTZFLCAweDI1Q0YsIDB4OTE2RiwgMHgyNUQwLCAweDkxNzIsIDB4MjgyQywgMHg5MTczLCAweDI4MkUsIDB4OTE3NCwKKyAgICAweDEwRDIsIDB4OTE3NSwgMHgxMENGLCAweDkxNzcsIDB4MTBEMSwgMHg5MTc4LCAweDEwRDAsIDB4OTE3OSwgMHgyODJELAorICAgIDB4OTE3QSwgMHgyODJCLCAweDkxODAsIDB4MkE4RSwgMHg5MTgxLCAweDJBOEIsIDB4OTE4MiwgMHgyQThDLCAweDkxODMsCisgICAgMHgxMjUzLCAweDkxODQsIDB4MkE4RCwgMHg5MTg1LCAweDJBODgsIDB4OTE4NiwgMHgyQTg5LCAweDkxODcsIDB4MTI1MCwKKyAgICAweDkxODksIDB4MTI1MSwgMHg5MThBLCAweDJBOEEsIDB4OTE4QiwgMHgxMjUyLCAweDkxOEQsIDB4MkNDMCwgMHg5MThGLAorICAgIDB4MkNDMSwgMHg5MTkwLCAweDJDQkUsIDB4OTE5MSwgMHgyQ0JGLCAweDkxOTIsIDB4MTM3NCwgMHg5MTkzLCAweDJDQkQsCisgICAgMHg5MTk5LCAweDJFODMsIDB4OTE5QSwgMHgyRTgwLCAweDkxOUIsIDB4MkU4MiwgMHg5MTlDLCAweDE0OUIsIDB4OTE5RCwKKyAgICAweDJFODYsIDB4OTE5RSwgMHgxNDlBLCAweDkxOUYsIDB4MkU4NCwgMHg5MUEwLCAweDJFODcsIDB4OTFBMSwgMHgyRTg1LAorICAgIDB4OTFBMiwgMHgyRTgxLCAweDkxQTMsIDB4MTQ5OSwgMHg5MUE1LCAweDMwMDAsIDB4OTFBNywgMHgzMDAxLCAweDkxQTgsCisgICAgMHgyRkZGLCAweDkxQUEsIDB4MzAwMywgMHg5MUFCLCAweDE1M0MsIDB4OTFBQywgMHgxNTNELCAweDkxQUQsIDB4MzE0QSwKKyAgICAweDkxQUUsIDB4MTVEQywgMHg5MUFGLCAweDMwMDIsIDB4OTFCMCwgMHgzMTQ5LCAweDkxQjEsIDB4MTVEQiwgMHg5MUIyLAorICAgIDB4MzI0QywgMHg5MUIzLCAweDMyNEQsIDB4OTFCNCwgMHgxNjUwLCAweDkxQjUsIDB4MzI0QiwgMHg5MUI3LCAweDMyNEEsCisgICAgMHg5MUI5LCAweDMzMjEsIDB4OTFCQSwgMHgxNjk4LCAweDkxQkMsIDB4MzQ0NiwgMHg5MUJELCAweDM0QTMsIDB4OTFCRSwKKyAgICAweDM0QTIsIDB4OTFDMCwgMHgxNzMwLCAweDkxQzEsIDB4MTc0QSwgMHg5MUMyLCAweDM0QTQsIDB4OTFDMywgMHgzNTBCLAorICAgIDB4OTFDNSwgMHgxNzVDLCAweDkxQzYsIDB4MDUyMSwgMHg5MUM3LCAweDA2OTUsIDB4OTFDOSwgMHgwRjRBLCAweDkxQ0IsCisgICAgMHgxNjUxLCAweDkxQ0MsIDB4MDUyMiwgMHg5MUNELCAweDA4MjAsIDB4OTFDRSwgMHgwQkM5LCAweDkxQ0YsIDB4MEQ4RSwKKyAgICAweDkxRDAsIDB4MTUzRSwgMHg5MUQxLCAweDA2OTYsIDB4OTFEMywgMHgxQzE1LCAweDkxRDQsIDB4MUMxNCwgMHg5MUQ1LAorICAgIDB4MUUyQywgMHg5MUQ3LCAweDA5RTcsIDB4OTFEOCwgMHgwOUU1LCAweDkxRDksIDB4MDlFOSwgMHg5MURBLCAweDFFMkUsCisgICAgMHg5MURDLCAweDA5RTgsIDB4OTFERCwgMHgwOUU2LCAweDkxRTIsIDB4MUUyRCwgMHg5MUUzLCAweDBCQ0MsIDB4OTFFNCwKKyAgICAweDIwOUEsIDB4OTFFNiwgMHgwQkNCLCAweDkxRTcsIDB4MEJDRCwgMHg5MUU4LCAweDIwOUYsIDB4OTFFOSwgMHgwQkNGLAorICAgIDB4OTFFQSwgMHgyMDlDLCAweDkxRUIsIDB4MjA5RCwgMHg5MUVDLCAweDIwOTUsIDB4OTFFRCwgMHgwQkNFLCAweDkxRUUsCisgICAgMHgyMEEwLCAweDkxRjEsIDB4MjA5NywgMHg5MUYzLCAweDIwOTgsIDB4OTFGNCwgMHgyMDk2LCAweDkxRjUsIDB4MEJDQSwKKyAgICAweDkxRjcsIDB4MjA5RSwgMHg5MUY4LCAweDIwOTksIDB4OTFGOSwgMHgyMDlCLCAweDkxRkQsIDB4MjMzRiwgMHg5MUZGLAorICAgIDB4MjMzRSwgMHg5MjAwLCAweDIzM0MsIDB4OTIwMSwgMHgyMzM0LCAweDkyMDIsIDB4MjM0MywgMHg5MjAzLCAweDIzMzcsCisgICAgMHg5MjA0LCAweDIzNDEsIDB4OTIwNSwgMHgyMzQ4LCAweDkyMDYsIDB4MjM0MCwgMHg5MjA3LCAweDBEOTYsIDB4OTIwOSwKKyAgICAweDBEOTIsIDB4OTIwQSwgMHgyMzM1LCAweDkyMEMsIDB4MjMzQiwgMHg5MjBELCAweDBEOTQsIDB4OTIwRiwgMHgyMzNBLAorICAgIDB4OTIxMCwgMHgwRDk1LCAweDkyMTEsIDB4MEQ5NywgMHg5MjEyLCAweDIzM0QsIDB4OTIxNCwgMHgwRDhGLCAweDkyMTUsCisgICAgMHgwRDkwLCAweDkyMTYsIDB4MjM0OSwgMHg5MjE3LCAweDIzNDcsIDB4OTIxOSwgMHgyMzQ2LCAweDkyMUEsIDB4MjMzOCwKKyAgICAweDkyMUMsIDB4MjM0NCwgMHg5MjFFLCAweDBEOTMsIDB4OTIyMywgMHgwRDkxLCAweDkyMjQsIDB4MjM0NSwgMHg5MjI1LAorICAgIDB4MjMzNiwgMHg5MjI2LCAweDIzMzksIDB4OTIyNywgMHgyMzQyLCAweDkyMkQsIDB4Mjg1MSwgMHg5MjJFLCAweDI1REEsCisgICAgMHg5MjMwLCAweDI1RDMsIDB4OTIzMSwgMHgyNUU2LCAweDkyMzIsIDB4MjVFRiwgMHg5MjMzLCAweDI1RDYsIDB4OTIzNCwKKyAgICAweDBGNTUsIDB4OTIzNiwgMHgyNUUzLCAweDkyMzcsIDB4MEY0QiwgMHg5MjM4LCAweDBGNEQsIDB4OTIzOSwgMHgwRjU5LAorICAgIDB4OTIzQSwgMHgyNUQ0LCAweDkyM0QsIDB4MEY0RSwgMHg5MjNFLCAweDBGNTAsIDB4OTIzRiwgMHgwRjVBLCAweDkyNDAsCisgICAgMHgwRjRGLCAweDkyNDUsIDB4MEY1OCwgMHg5MjQ2LCAweDI1REMsIDB4OTI0OCwgMHgyNUQxLCAweDkyNDksIDB4MEY1NiwKKyAgICAweDkyNEEsIDB4MjVEQiwgMHg5MjRCLCAweDBGNTIsIDB4OTI0QywgMHgyNUVELCAweDkyNEQsIDB4MEY1NywgMHg5MjRFLAorICAgIDB4MjVFQiwgMHg5MjRGLCAweDI1REYsIDB4OTI1MCwgMHgyNUU5LCAweDkyNTEsIDB4MEY1NCwgMHg5MjUyLCAweDI1RDIsCisgICAgMHg5MjUzLCAweDI1RUMsIDB4OTI1NCwgMHgyNUU3LCAweDkyNTYsIDB4MjVFRSwgMHg5MjU3LCAweDBGNEMsIDB4OTI1QSwKKyAgICAweDBGNUIsIDB4OTI1QiwgMHgwRjUxLCAweDkyNUUsIDB4MjVEOCwgMHg5MjYwLCAweDI1RTAsIDB4OTI2MSwgMHgyNUU0LAorICAgIDB4OTI2MywgMHgyNUU4LCAweDkyNjQsIDB4MEY1MywgMHg5MjY1LCAweDI1RDcsIDB4OTI2NiwgMHgyNUQ1LCAweDkyNjcsCisgICAgMHgyNUUxLCAweDkyNkMsIDB4MjVERSwgMHg5MjZELCAweDI1REQsIDB4OTI2RiwgMHgyNUUyLCAweDkyNzAsIDB4MjVFNSwKKyAgICAweDkyNzIsIDB4MjVFQSwgMHg5Mjc2LCAweDI4MzEsIDB4OTI3OCwgMHgxMEQzLCAweDkyNzksIDB4MjgzQiwgMHg5MjdBLAorICAgIDB4MjgzMywgMHg5MjdCLCAweDEwRDksIDB4OTI3QywgMHgxMERELCAweDkyN0QsIDB4Mjg0NCwgMHg5MjdFLCAweDI4NEMsCisgICAgMHg5MjdGLCAweDI4M0QsIDB4OTI4MCwgMHgxMEQ1LCAweDkyODIsIDB4Mjg0MSwgMHg5MjgzLCAweDI1RDksIDB4OTI4NSwKKyAgICAweDEwRDYsIDB4OTI4NiwgMHgyODQ4LCAweDkyODcsIDB4Mjg0RCwgMHg5Mjg4LCAweDI4NDUsIDB4OTI4QSwgMHgyODQ3LAorICAgIDB4OTI4QiwgMHgyODUwLCAweDkyOEMsIDB4Mjg0OSwgMHg5MjhELCAweDI4MzcsIDB4OTI4RSwgMHgyODQwLCAweDkyOTEsCisgICAgMHgxMERFLCAweDkyOTMsIDB4MTBEQSwgMHg5Mjk0LCAweDI4MzUsIDB4OTI5NSwgMHgyODQyLCAweDkyOTYsIDB4MTBEOCwKKyAgICAweDkyOTcsIDB4MjgzQywgMHg5Mjk4LCAweDEwRDcsIDB4OTI5OSwgMHgyODRBLCAweDkyOUEsIDB4MjgzOSwgMHg5MjlCLAorICAgIDB4MjgzMiwgMHg5MjlDLCAweDEwREIsIDB4OTI5RCwgMHgyODRGLCAweDkyQTAsIDB4MjgzNCwgMHg5MkExLCAweDI4NDYsCisgICAgMHg5MkEyLCAweDI4NDMsIDB4OTJBMywgMHgyODNFLCAweDkyQTQsIDB4MjgzMCwgMHg5MkE1LCAweDI4MkYsIDB4OTJBNiwKKyAgICAweDI4MzgsIDB4OTJBNywgMHgyODRCLCAweDkyQTgsIDB4MTBEQywgMHg5MkE5LCAweDI4NEUsIDB4OTJBQSwgMHgyODM2LAorICAgIDB4OTJBQiwgMHgyODNBLCAweDkyQUMsIDB4MTBENCwgMHg5MkIyLCAweDEyNUYsIDB4OTJCMywgMHgxMjVBLCAweDkyQjQsCisgICAgMHgyQUIwLCAweDkyQjUsIDB4MkFBQywgMHg5MkI2LCAweDJBOTQsIDB4OTJCNywgMHgxMjU2LCAweDkyQjksIDB4MzZFOSwKKyAgICAweDkyQkIsIDB4MTI1NSwgMHg5MkJDLCAweDEyNUIsIDB4OTJDMCwgMHgyQTkyLCAweDkyQzEsIDB4MTI1OSwgMHg5MkMyLAorICAgIDB4MkE5RSwgMHg5MkMzLCAweDJBOTAsIDB4OTJDNCwgMHgyQTkxLCAweDkyQzUsIDB4MTI1NCwgMHg5MkM2LCAweDJBQUYsCisgICAgMHg5MkM3LCAweDEyNUQsIDB4OTJDOCwgMHgyQUExLCAweDkyQzksIDB4MkFBNiwgMHg5MkNBLCAweDJBQTAsIDB4OTJDQiwKKyAgICAweDJDRDMsIDB4OTJDQywgMHgyQTlDLCAweDkyQ0QsIDB4MkFBNCwgMHg5MkNFLCAweDJBQTIsIDB4OTJDRiwgMHgyQTk1LAorICAgIDB4OTJEMCwgMHgyQThGLCAweDkyRDEsIDB4MkFBQSwgMHg5MkQyLCAweDEyNUMsIDB4OTJEMywgMHgyQUFCLCAweDkyRDUsCisgICAgMHgyQUE1LCAweDkyRDcsIDB4MkE5QSwgMHg5MkQ4LCAweDJBOTgsIDB4OTJEOSwgMHgyQTkzLCAweDkyREQsIDB4MkE5QiwKKyAgICAweDkyREUsIDB4MkFBOCwgMHg5MkRGLCAweDJBOTcsIDB4OTJFMCwgMHgyQUE3LCAweDkyRTEsIDB4MkFBRCwgMHg5MkU0LAorICAgIDB4MTI1OCwgMHg5MkU2LCAweDJBQTMsIDB4OTJFNywgMHgyQUE5LCAweDkyRTgsIDB4MkE5RiwgMHg5MkU5LCAweDJBOTksCisgICAgMHg5MkVBLCAweDEyNTcsIDB4OTJFRSwgMHgyODNGLCAweDkyRUYsIDB4MkE5RCwgMHg5MkYwLCAweDEyNUUsIDB4OTJGMSwKKyAgICAweDJBOTYsIDB4OTJGNywgMHgyQ0Q4LCAweDkyRjgsIDB4MTM3NywgMHg5MkY5LCAweDJDRDcsIDB4OTJGQSwgMHgyQ0Q1LAorICAgIDB4OTJGQiwgMHgyQ0U3LCAweDkyRkMsIDB4MTM3QiwgMHg5MkZFLCAweDJDRTQsIDB4OTJGRiwgMHgyQ0RDLCAweDkzMDAsCisgICAgMHgyQ0U2LCAweDkzMDEsIDB4MkNDRSwgMHg5MzAyLCAweDJDREEsIDB4OTMwNCwgMHgxMzdELCAweDkzMDYsIDB4MkNDNiwKKyAgICAweDkzMDgsIDB4MkNDNCwgMHg5MzA5LCAweDJDRTUsIDB4OTMwQiwgMHgyQ0UzLCAweDkzMEMsIDB4MkNFMiwgMHg5MzBELAorICAgIDB4MkNEMiwgMHg5MzBFLCAweDJDRDEsIDB4OTMwRiwgMHgyQ0M3LCAweDkzMTAsIDB4MTM3RiwgMHg5MzEyLCAweDJDQ0QsCisgICAgMHg5MzEzLCAweDJDRDYsIDB4OTMxNCwgMHgyQ0UxLCAweDkzMTUsIDB4MTM4MiwgMHg5MzE2LCAweDJDRTgsIDB4OTMxOCwKKyAgICAweDE0QTMsIDB4OTMxOSwgMHgxMzg0LCAweDkzMUEsIDB4MTM3RSwgMHg5MzFCLCAweDJDQ0IsIDB4OTMxRCwgMHgyQ0Q0LAorICAgIDB4OTMxRSwgMHgyQ0MzLCAweDkzMUYsIDB4MkNDNSwgMHg5MzIwLCAweDEzNzUsIDB4OTMyMSwgMHgxMzgxLCAweDkzMjIsCisgICAgMHgxMzdBLCAweDkzMjMsIDB4MkNDQywgMHg5MzI0LCAweDJDREIsIDB4OTMyNSwgMHgyQUFFLCAweDkzMjYsIDB4MTM4MCwKKyAgICAweDkzMjcsIDB4MkNDMiwgMHg5MzI4LCAweDE0OUUsIDB4OTMyOSwgMHgyQ0RELCAweDkzMkEsIDB4MkNFMCwgMHg5MzJCLAorICAgIDB4MTM3QywgMHg5MzJELCAweDJDRDAsIDB4OTMyRSwgMHgxMzgzLCAweDkzMkYsIDB4MTM3OSwgMHg5MzMzLCAweDEzNzgsCisgICAgMHg5MzM0LCAweDJDRDksIDB4OTMzNSwgMHgyQ0RGLCAweDkzMzYsIDB4MTM3NiwgMHg5MzM4LCAweDJDQzksIDB4OTMzOSwKKyAgICAweDJDREUsIDB4OTMzQywgMHgyQ0NBLCAweDkzNDYsIDB4MkNDRiwgMHg5MzQ3LCAweDJFOEQsIDB4OTM0OSwgMHgyRTkyLAorICAgIDB4OTM0QSwgMHgxNEEwLCAweDkzNEIsIDB4MTRBMiwgMHg5MzRDLCAweDJFOTgsIDB4OTM0RCwgMHgxNDlDLCAweDkzNEUsCisgICAgMHgyRUE2LCAweDkzNEYsIDB4MkU5RSwgMHg5MzUwLCAweDJFOTMsIDB4OTM1MSwgMHgyRTk0LCAweDkzNTIsIDB4MkU5RCwKKyAgICAweDkzNTQsIDB4MTRBOSwgMHg5MzU1LCAweDJFOUMsIDB4OTM1NiwgMHgyRThDLCAweDkzNTcsIDB4MkU5QiwgMHg5MzU4LAorICAgIDB4MkU4RiwgMHg5MzU5LCAweDJFQTcsIDB4OTM1QSwgMHgxNEE4LCAweDkzNUIsIDB4MTRBNiwgMHg5MzVDLCAweDJFOTAsCisgICAgMHg5MzVFLCAweDJFQTMsIDB4OTM2MCwgMHgyRTk1LCAweDkzNjEsIDB4MkVBMiwgMHg5MzYzLCAweDJFQTQsIDB4OTM2NCwKKyAgICAweDJFOEIsIDB4OTM2NSwgMHgxNEExLCAweDkzNjcsIDB4MkVBNSwgMHg5MzZBLCAweDJFOTksIDB4OTM2QywgMHgxNEE1LAorICAgIDB4OTM2RCwgMHgyRTk2LCAweDkzNzAsIDB4MTRBNywgMHg5MzcxLCAweDJFOUYsIDB4OTM3NSwgMHgxNDlGLCAweDkzNzYsCisgICAgMHgyRTkxLCAweDkzNzcsIDB4MkVBMCwgMHg5Mzc5LCAweDJFOUEsIDB4OTM3QSwgMHgyQ0M4LCAweDkzN0IsIDB4MkVBMSwKKyAgICAweDkzN0MsIDB4MkU4RSwgMHg5MzdFLCAweDE0QTQsIDB4OTM4MCwgMHgzMDE0LCAweDkzODIsIDB4MTQ5RCwgMHg5MzgzLAorICAgIDB4MkU4OSwgMHg5Mzg4LCAweDMwMTEsIDB4OTM4OSwgMHgzMDBBLCAweDkzOEEsIDB4MTU0MCwgMHg5MzhDLCAweDMwMDUsCisgICAgMHg5MzhELCAweDMwMTUsIDB4OTM4RSwgMHgzMDBDLCAweDkzOEYsIDB4MkU5NywgMHg5MzkxLCAweDMwMTcsIDB4OTM5MiwKKyAgICAweDMwMDYsIDB4OTM5NCwgMHgxNTNGLCAweDkzOTUsIDB4MzAxMCwgMHg5Mzk2LCAweDE1NDEsIDB4OTM5NywgMHgxNTQ5LAorICAgIDB4OTM5OCwgMHgxNTQ3LCAweDkzOTksIDB4MzAxMiwgMHg5MzlBLCAweDE1NDgsIDB4OTM5QiwgMHgzMDA4LCAweDkzOUQsCisgICAgMHgzMDA5LCAweDkzOUUsIDB4MzAwRSwgMHg5MzlGLCAweDMwMTMsIDB4OTNBMSwgMHgyRTg4LCAweDkzQTIsIDB4MTU0MiwKKyAgICAweDkzQTMsIDB4MzAxQywgMHg5M0E0LCAweDMwMTksIDB4OTNBNSwgMHgzMTYwLCAweDkzQTYsIDB4MzAwRiwgMHg5M0E3LAorICAgIDB4MzAwQiwgMHg5M0E4LCAweDMwMUEsIDB4OTNBOSwgMHgzMTU1LCAweDkzQUEsIDB4MzAwRCwgMHg5M0FDLCAweDE1NDUsCisgICAgMHg5M0FFLCAweDE1NDQsIDB4OTNBRiwgMHgyRThBLCAweDkzQjAsIDB4MTU0NiwgMHg5M0IxLCAweDMwMTYsIDB4OTNCMiwKKyAgICAweDMwMTgsIDB4OTNCMywgMHgxNTQzLCAweDkzQjQsIDB4MzAxQiwgMHg5M0I1LCAweDMwMDQsIDB4OTNCNywgMHgzMDA3LAorICAgIDB4OTNDMCwgMHgzMTVFLCAweDkzQzIsIDB4MzE0RSwgMHg5M0MzLCAweDE1RTAsIDB4OTNDNCwgMHgzMTVDLCAweDkzQzcsCisgICAgMHgzMTRDLCAweDkzQzgsIDB4MTVFMSwgMHg5M0NBLCAweDMxNTcsIDB4OTNDQywgMHgzMTUzLCAweDkzQ0QsIDB4MTVFNiwKKyAgICAweDkzQ0UsIDB4MzE1RCwgMHg5M0NGLCAweDMxNEQsIDB4OTNEMCwgMHgzMTUwLCAweDkzRDEsIDB4MTVERSwgMHg5M0QyLAorICAgIDB4MzE1RiwgMHg5M0Q0LCAweDMxNTgsIDB4OTNENSwgMHgzMTVCLCAweDkzRDYsIDB4MTVFNCwgMHg5M0Q3LCAweDE1RTksCisgICAgMHg5M0Q4LCAweDE1RTcsIDB4OTNEOSwgMHgzMTU0LCAweDkzREEsIDB4MzE0RiwgMHg5M0RDLCAweDE1RTIsIDB4OTNERCwKKyAgICAweDE1RTMsIDB4OTNERSwgMHgzMTRCLCAweDkzREYsIDB4MTVERiwgMHg5M0UxLCAweDE1REQsIDB4OTNFMiwgMHgxNUU1LAorICAgIDB4OTNFMywgMHgzMTVBLCAweDkzRTQsIDB4MTVFOCwgMHg5M0U2LCAweDMxNTYsIDB4OTNFNywgMHgzMTYxLCAweDkzRTgsCisgICAgMHgxNUVBLCAweDkzRUMsIDB4MzE1MiwgMHg5M0VFLCAweDMxNTksIDB4OTNGNSwgMHgzMjVBLCAweDkzRjYsIDB4MzI2OSwKKyAgICAweDkzRjcsIDB4MzI1QywgMHg5M0Y4LCAweDMyNjMsIDB4OTNGOSwgMHgzMTUxLCAweDkzRkEsIDB4MzI2MSwgMHg5M0ZCLAorICAgIDB4MzI1MCwgMHg5M0ZDLCAweDMyNjcsIDB4OTNGRCwgMHgxNjU0LCAweDkzRkUsIDB4MzI1NCwgMHg5M0ZGLCAweDMyNjYsCisgICAgMHg5NDAwLCAweDMyNUIsIDB4OTQwMywgMHgxNjUzLCAweDk0MDYsIDB4MzI2QiwgMHg5NDA3LCAweDMyNUQsIDB4OTQwOSwKKyAgICAweDMyNjIsIDB4OTQwQSwgMHgzMjY1LCAweDk0MEIsIDB4MzI0RSwgMHg5NDBDLCAweDMyNjgsIDB4OTQwRCwgMHgzMjU5LAorICAgIDB4OTQwRSwgMHgzMjVFLCAweDk0MEYsIDB4MzI1MiwgMHg5NDEwLCAweDMyNTYsIDB4OTQxMSwgMHgzMjZBLCAweDk0MTIsCisgICAgMHgzMjYwLCAweDk0MTMsIDB4MzI0RiwgMHg5NDE0LCAweDMyNTMsIDB4OTQxNSwgMHgzMjU1LCAweDk0MTYsIDB4MzI1RiwKKyAgICAweDk0MTgsIDB4MTY1MiwgMHg5NDE5LCAweDMyNTgsIDB4OTQyMCwgMHgzMjUxLCAweDk0MjgsIDB4MzI1NywgMHg5NDI5LAorICAgIDB4MzMyNSwgMHg5NDJBLCAweDMzMjksIDB4OTQyQiwgMHgxNjlGLCAweDk0MkMsIDB4MzMyQiwgMHg5NDJFLCAweDE2OTksCisgICAgMHg5NDMwLCAweDMzMjcsIDB4OTQzMSwgMHgzMzJELCAweDk0MzIsIDB4MTY5RSwgMHg5NDMzLCAweDE2OUEsIDB4OTQzNSwKKyAgICAweDE2OUIsIDB4OTQzNiwgMHgzMzI0LCAweDk0MzcsIDB4MzMyQSwgMHg5NDM4LCAweDE2OUQsIDB4OTQzOSwgMHgzMzI4LAorICAgIDB4OTQzQSwgMHgxNjlDLCAweDk0M0IsIDB4MzMyMywgMHg5NDNDLCAweDMyNjQsIDB4OTQzRCwgMHgzMzI2LCAweDk0M0YsCisgICAgMHgzMzIyLCAweDk0NDAsIDB4MzMyQywgMHg5NDQ0LCAweDE2REYsIDB4OTQ0NSwgMHgzM0NELCAweDk0NDYsIDB4MzNEMCwKKyAgICAweDk0NDcsIDB4MzNDQywgMHg5NDQ4LCAweDMzQ0UsIDB4OTQ0OSwgMHgzM0NGLCAweDk0NEEsIDB4MzNDOSwgMHg5NDRCLAorICAgIDB4MzNDQSwgMHg5NDRDLCAweDMzQzcsIDB4OTQ0RiwgMHgzM0NCLCAweDk0NTAsIDB4MzNDOCwgMHg5NDUxLCAweDE2RTAsCisgICAgMHg5NDUyLCAweDE2RTEsIDB4OTQ1NSwgMHgzNDQ4LCAweDk0NTcsIDB4MzQ0QSwgMHg5NDVELCAweDM0NDksIDB4OTQ1RSwKKyAgICAweDM0NEIsIDB4OTQ2MCwgMHgxNzBFLCAweDk0NjIsIDB4MzQ0NywgMHg5NDYzLCAweDE3MEQsIDB4OTQ2NCwgMHgxNzBGLAorICAgIDB4OTQ2OCwgMHgzNEE2LCAweDk0NjksIDB4MzRBNywgMHg5NDZBLCAweDE3MzEsIDB4OTQ2QiwgMHgzNEE1LCAweDk0NkQsCisgICAgMHgzNEVELCAweDk0NkUsIDB4MzRFQywgMHg5NDZGLCAweDM0RUUsIDB4OTQ3MCwgMHgxNzRDLCAweDk0NzEsIDB4MzRFRiwKKyAgICAweDk0NzIsIDB4MTc0QiwgMHg5NDczLCAweDM0RjAsIDB4OTQ3NCwgMHgzNTBDLCAweDk0NzUsIDB4MzUwRiwgMHg5NDc2LAorICAgIDB4MzUwRSwgMHg5NDc3LCAweDE3NTUsIDB4OTQ3OCwgMHgzNTBELCAweDk0N0MsIDB4MTc1RiwgMHg5NDdELCAweDE3NUQsCisgICAgMHg5NDdFLCAweDE3NUUsIDB4OTQ3RiwgMHgxNzY0LCAweDk0ODAsIDB4MzUzOSwgMHg5NDgxLCAweDM1M0EsIDB4OTQ4MiwKKyAgICAweDM1MzgsIDB4OTQ4MywgMHgzNTQwLCAweDk1NzcsIDB4MDY5NywgMHg5NTdBLCAweDIwQTEsIDB4OTU3QiwgMHgyMzRBLAorICAgIDB4OTU3QywgMHgyQUIxLCAweDk1N0QsIDB4MzE2MiwgMHg5NTgwLCAweDA2OTgsIDB4OTU4MiwgMHgwODIxLCAweDk1ODMsCisgICAgMHgwOUVBLCAweDk1ODYsIDB4MjBBMiwgMHg5NTg4LCAweDIwQTMsIDB4OTU4OSwgMHgwQkQwLCAweDk1OEIsIDB4MEQ5QSwKKyAgICAweDk1OEMsIDB4MjM0QywgMHg5NThELCAweDIzNEIsIDB4OTU4RSwgMHgwRDlFLCAweDk1OEYsIDB4MEQ5OSwgMHg5NTkwLAorICAgIDB4MjM0RCwgMHg5NTkxLCAweDBEOUIsIDB4OTU5MiwgMHgwRDlELCAweDk1OTMsIDB4MEQ5QywgMHg5NTk0LCAweDBEOTgsCisgICAgMHg5NTk4LCAweDBGNUMsIDB4OTU5QiwgMHgyNUYzLCAweDk1OUMsIDB4MjVGMSwgMHg5NTlFLCAweDI1RjIsIDB4OTU5RiwKKyAgICAweDI1RjAsIDB4OTVBMSwgMHgxMERGLCAweDk1QTMsIDB4MTBFMiwgMHg5NUE0LCAweDEwRTQsIDB4OTVBNSwgMHgxMEUzLAorICAgIDB4OTVBOCwgMHgxMEUwLCAweDk1QTksIDB4MTBFMSwgMHg5NUFCLCAweDJBQjMsIDB4OTVBQywgMHgyQUIyLCAweDk1QUQsCisgICAgMHgxMjYwLCAweDk1QUUsIDB4MkFCNCwgMHg5NUIwLCAweDJBQjUsIDB4OTVCMSwgMHgxMjYxLCAweDk1QjUsIDB4MkNGMCwKKyAgICAweDk1QjYsIDB4MkNFRSwgMHg5NUI3LCAweDJFQUQsIDB4OTVCOSwgMHgyQ0VDLCAweDk1QkEsIDB4MkNFRCwgMHg5NUJCLAorICAgIDB4MTM4NSwgMHg5NUJDLCAweDJDRTksIDB4OTVCRCwgMHgyQ0YxLCAweDk1QkUsIDB4MkNFQiwgMHg5NUJGLCAweDJDRUYsCisgICAgMHg5NUMwLCAweDJFQTksIDB4OTVDMywgMHgyRUFCLCAweDk1QzUsIDB4MkVBQywgMHg5NUM2LCAweDE0QUUsIDB4OTVDNywKKyAgICAweDJFQTgsIDB4OTVDOCwgMHgxNEFELCAweDk1QzksIDB4MkVBQSwgMHg5NUNBLCAweDE0QUEsIDB4OTVDQiwgMHgxNEFCLAorICAgIDB4OTVDQywgMHgxNEFDLCAweDk1Q0QsIDB4MkNFQSwgMHg5NUQwLCAweDE1NEMsIDB4OTVEMSwgMHgzMDFGLCAweDk1RDIsCisgICAgMHgzMDFELCAweDk1RDMsIDB4MzAxRSwgMHg5NUQ0LCAweDE1NEEsIDB4OTVENSwgMHgxNTRELCAweDk1RDYsIDB4MTU0QiwKKyAgICAweDk1REEsIDB4MzE2MywgMHg5NURCLCAweDMxNjQsIDB4OTVEQywgMHgxNUVCLCAweDk1REUsIDB4MzI2QywgMHg5NURGLAorICAgIDB4MzI2RSwgMHg5NUUwLCAweDMyNkQsIDB4OTVFMSwgMHgxNjU1LCAweDk1RTIsIDB4MTZBMCwgMHg5NUUzLCAweDMzMzAsCisgICAgMHg5NUU0LCAweDMzMkYsIDB4OTVFNSwgMHgzMzJFLCAweDk2MUMsIDB4MDY5OSwgMHg5NjFFLCAweDE3QjQsIDB4OTYyMCwKKyAgICAweDE4MjEsIDB4OTYyMSwgMHgwNDE0LCAweDk2MjIsIDB4MTgxRiwgMHg5NjIzLCAweDE4MjIsIDB4OTYyNCwgMHgxODIwLAorICAgIDB4OTYyOCwgMHgxOEYxLCAweDk2MkEsIDB4MDUyNiwgMHg5NjJDLCAweDA1MjcsIDB4OTYyRCwgMHgxOEYzLCAweDk2MkUsCisgICAgMHgwNTI0LCAweDk2MkYsIDB4MThGMiwgMHg5NjMwLCAweDE4RjAsIDB4OTYzMSwgMHgwNTI1LCAweDk2MzIsIDB4MDUyMywKKyAgICAweDk2MzksIDB4MUE1NSwgMHg5NjNBLCAweDFBNTgsIDB4OTYzQiwgMHgwNjlDLCAweDk2M0MsIDB4MUE1NywgMHg5NjNELAorICAgIDB4MUE1NiwgMHg5NjNGLCAweDA2OUIsIDB4OTY0MCwgMHgwNjlBLCAweDk2NDIsIDB4MDY5RSwgMHg5NjQzLCAweDFBNTksCisgICAgMHg5NjQ0LCAweDA2OUQsIDB4OTY0QSwgMHgxQzFBLCAweDk2NEIsIDB4MDgyMywgMHg5NjRDLCAweDA4MjQsIDB4OTY0RCwKKyAgICAweDA4MjUsIDB4OTY0RSwgMHgxQzFCLCAweDk2NEYsIDB4MUMxNywgMHg5NjUwLCAweDA4MjIsIDB4OTY1MSwgMHgxQzE4LAorICAgIDB4OTY1MywgMHgxQzE5LCAweDk2NTQsIDB4MUMxNiwgMHg5NjU4LCAweDA5RjEsIDB4OTY1QiwgMHgwOUVFLCAweDk2NUMsCisgICAgMHgxRTJGLCAweDk2NUQsIDB4MDlFRiwgMHg5NjVFLCAweDA5RjIsIDB4OTY1RiwgMHgxRTMwLCAweDk2NjEsIDB4MDlFRCwKKyAgICAweDk2NjIsIDB4MDlFQiwgMHg5NjYzLCAweDA5RUMsIDB4OTY2NCwgMHgwOUYwLCAweDk2NkEsIDB4MEJEMSwgMHg5NjZCLAorICAgIDB4MjBBNiwgMHg5NjZDLCAweDBCRDksIDB4OTY2RCwgMHgyMEE1LCAweDk2NkYsIDB4MjBBOCwgMHg5NjcwLCAweDBCRDUsCisgICAgMHg5NjcxLCAweDIwQTcsIDB4OTY3MiwgMHgwREE2LCAweDk2NzMsIDB4MEJEMywgMHg5Njc0LCAweDBCRDYsIDB4OTY3NSwKKyAgICAweDBCRDIsIDB4OTY3NiwgMHgwQkQ3LCAweDk2NzcsIDB4MEJEOCwgMHg5Njc4LCAweDBCRDQsIDB4OTY3QywgMHgyMEE0LAorICAgIDB4OTY3RCwgMHgwREEyLCAweDk2N0UsIDB4MjM0RiwgMHg5NjgwLCAweDIzNTMsIDB4OTY4MywgMHgyMzUyLCAweDk2ODQsCisgICAgMHgwREE3LCAweDk2ODUsIDB4MERBMywgMHg5Njg2LCAweDBEQTQsIDB4OTY4NywgMHgyMzRFLCAweDk2ODgsIDB4MjM1MCwKKyAgICAweDk2ODksIDB4MjM1MSwgMHg5NjhBLCAweDBEOUYsIDB4OTY4QiwgMHgwREExLCAweDk2OEQsIDB4MERBNSwgMHg5NjhFLAorICAgIDB4MERBMCwgMHg5NjkxLCAweDI1RjYsIDB4OTY5MiwgMHgyNUY0LCAweDk2OTMsIDB4MjVGNSwgMHg5Njk0LCAweDBGNUUsCisgICAgMHg5Njk1LCAweDBGNUYsIDB4OTY5NywgMHgyNUY3LCAweDk2OTgsIDB4MEY1RCwgMHg5Njk5LCAweDEwRTUsIDB4OTY5QiwKKyAgICAweDEwRTcsIDB4OTY5QywgMHgxMEU2LCAweDk2OUUsIDB4Mjg1MiwgMHg5NkExLCAweDI4NTMsIDB4OTZBMiwgMHgyQUI3LAorICAgIDB4OTZBNCwgMHgyQUI2LCAweDk2QTcsIDB4MTM4NiwgMHg5NkE4LCAweDEzODcsIDB4OTZBOSwgMHgyQ0YyLCAweDk2QUEsCisgICAgMHgxMzg4LCAweDk2QUMsIDB4MkVCMCwgMHg5NkFFLCAweDJFQUUsIDB4OTZCMCwgMHgyRUFGLCAweDk2QjEsIDB4MTRBRiwKKyAgICAweDk2QjMsIDB4MzAyMCwgMHg5NkI0LCAweDE1RUMsIDB4OTZCNiwgMHgwMjMxLCAweDk2QjgsIDB4MTRCMCwgMHg5NkI5LAorICAgIDB4MDY5RiwgMHg5NkJCLCAweDA5RjMsIDB4OTZCQywgMHgxRTMxLCAweDk2QkYsIDB4MjBBOSwgMHg5NkMwLCAweDBCREEsCisgICAgMHg5NkMxLCAweDBEQTgsIDB4OTZDMiwgMHgyMzU0LCAweDk2QzMsIDB4MjM1NiwgMHg5NkM0LCAweDBEQUEsIDB4OTZDNSwKKyAgICAweDBEQTksIDB4OTZDNiwgMHgwREFCLCAweDk2QzcsIDB4MERBQywgMHg5NkM4LCAweDIzNTUsIDB4OTZDOSwgMHgwRjYyLAorICAgIDB4OTZDQSwgMHgwRjYzLCAweDk2Q0IsIDB4MEY2MSwgMHg5NkNDLCAweDEwRTgsIDB4OTZDRCwgMHgwRjYwLCAweDk2Q0UsCisgICAgMHgyNUY4LCAweDk2RDIsIDB4MTBFOSwgMHg5NkQzLCAweDJBQjgsIDB4OTZENCwgMHgyQ0YzLCAweDk2RDUsIDB4MTM4OSwKKyAgICAweDk2RDYsIDB4MTRCMSwgMHg5NkQ3LCAweDMwMjEsIDB4OTZEOCwgMHgzMDI1LCAweDk2RDksIDB4MTU1MCwgMHg5NkRBLAorICAgIDB4MzAyMiwgMHg5NkRCLCAweDE1NTEsIDB4OTZEQywgMHgxNTRGLCAweDk2REQsIDB4MzAyNiwgMHg5NkRFLCAweDE1NTIsCisgICAgMHg5NkRGLCAweDMwMjQsIDB4OTZFMSwgMHgzMTY1LCAweDk2RTIsIDB4MTU0RSwgMHg5NkUzLCAweDE1RUQsIDB4OTZFNSwKKyAgICAweDM0QTgsIDB4OTZFOCwgMHgwNkEwLCAweDk2RTksIDB4MEJEQywgMHg5NkVBLCAweDBCREIsIDB4OTZFRiwgMHgwREFELAorICAgIDB4OTZGMCwgMHgyMzU4LCAweDk2RjEsIDB4MjM1NywgMHg5NkYyLCAweDBEQUUsIDB4OTZGNSwgMHgyNUZDLCAweDk2RjYsCisgICAgMHgwRjY3LCAweDk2RjcsIDB4MEY2NCwgMHg5NkY4LCAweDI1RkIsIDB4OTZGOSwgMHgwRjY2LCAweDk2RkEsIDB4MjVGOSwKKyAgICAweDk2RkIsIDB4MEY2NSwgMHg5NkZELCAweDI1RkEsIDB4OTZGRiwgMHgyODU0LCAweDk3MDAsIDB4MTBFQSwgMHg5NzAyLAorICAgIDB4MkFCQiwgMHg5NzA0LCAweDEyNjIsIDB4OTcwNSwgMHgyQUI5LCAweDk3MDYsIDB4MTI2MywgMHg5NzA3LCAweDEyNjQsCisgICAgMHg5NzA4LCAweDJBQkEsIDB4OTcwOSwgMHgxMjY1LCAweDk3MEIsIDB4MkNGNCwgMHg5NzBELCAweDEzOEQsIDB4OTcwRSwKKyAgICAweDEzOEEsIDB4OTcwRiwgMHgxMzhGLCAweDk3MTAsIDB4MkNGNiwgMHg5NzExLCAweDEzOEIsIDB4OTcxMiwgMHgyQ0Y1LAorICAgIDB4OTcxMywgMHgxMzhFLCAweDk3MTYsIDB4MTM4QywgMHg5NzE4LCAweDJFQjMsIDB4OTcxOSwgMHgyRUI1LCAweDk3MUMsCisgICAgMHgxNEIyLCAweDk3MUQsIDB4MkVCNCwgMHg5NzFFLCAweDE0QjMsIDB4OTcxRiwgMHgyRUIyLCAweDk3MjAsIDB4MkVCMSwKKyAgICAweDk3MjIsIDB4MzAyOCwgMHg5NzIzLCAweDMwMjcsIDB4OTcyNCwgMHgxNTUzLCAweDk3MjUsIDB4MzAyOSwgMHg5NzI2LAorICAgIDB4MzE2QSwgMHg5NzI3LCAweDE1RUYsIDB4OTcyOCwgMHgzMTY5LCAweDk3MjksIDB4MzE2NiwgMHg5NzJBLCAweDE1RUUsCisgICAgMHg5NzJCLCAweDMxNjcsIDB4OTcyQywgMHgzMTY4LCAweDk3MkUsIDB4MzI2RiwgMHg5NzJGLCAweDMyNzAsIDB4OTczMCwKKyAgICAweDE2NTYsIDB4OTczMiwgMHgxNkEzLCAweDk3MzUsIDB4MzMzMSwgMHg5NzM4LCAweDE2QTEsIDB4OTczOSwgMHgxNkEyLAorICAgIDB4OTczQSwgMHgzMzMyLCAweDk3M0QsIDB4MTZFMiwgMHg5NzNFLCAweDE2RTMsIDB4OTczRiwgMHgzM0QxLCAweDk3NDIsCisgICAgMHgxNzMyLCAweDk3NDMsIDB4MzRBQSwgMHg5NzQ0LCAweDE3MzQsIDB4OTc0NiwgMHgzNEE5LCAweDk3NDcsIDB4MzRBQiwKKyAgICAweDk3NDgsIDB4MTczMywgMHg5NzQ5LCAweDM0RjEsIDB4OTc0QiwgMHgzNTI2LCAweDk3NTIsIDB4MDZBMSwgMHg5NzU2LAorICAgIDB4MEY2OCwgMHg5NzU4LCAweDI4NTUsIDB4OTc1QSwgMHgyQUJDLCAweDk3NUIsIDB4MTM5MCwgMHg5NzVDLCAweDEzOTEsCisgICAgMHg5NzVFLCAweDA2QTIsIDB4OTc2MCwgMHgxMjY2LCAweDk3NjEsIDB4MTVGMCwgMHg5NzYyLCAweDA4MjYsIDB4OTc2NiwKKyAgICAweDEzOTIsIDB4OTc2OCwgMHgxNzEwLCAweDk3NjksIDB4MDgyNywgMHg5NzZBLCAweDIwQUEsIDB4OTc2QywgMHgyMzU5LAorICAgIDB4OTc2RSwgMHgyMzVCLCAweDk3NzAsIDB4MjM1QSwgMHg5NzcyLCAweDI2MDAsIDB4OTc3MywgMHgyNUZELCAweDk3NzQsCisgICAgMHgwRjY5LCAweDk3NzYsIDB4MEY2QSwgMHg5Nzc3LCAweDI1RkUsIDB4OTc3OCwgMHgyNUZGLCAweDk3N0EsIDB4Mjg1NywKKyAgICAweDk3N0IsIDB4Mjg1QywgMHg5NzdDLCAweDEwRUIsIDB4OTc3RCwgMHgyODU2LCAweDk3N0UsIDB4Mjg1OCwgMHg5NzdGLAorICAgIDB4Mjg1RiwgMHg5NzgwLCAweDI4NUEsIDB4OTc4MSwgMHgyODVFLCAweDk3ODIsIDB4Mjg1QiwgMHg5NzgzLCAweDI4NTksCisgICAgMHg5Nzg0LCAweDI4NUQsIDB4OTc4NSwgMHgxMEVDLCAweDk3ODgsIDB4MkFCRiwgMHg5NzhBLCAweDJBQkQsIDB4OTc4QiwKKyAgICAweDEyNjgsIDB4OTc4RCwgMHgxMjY3LCAweDk3OEUsIDB4MkFCRSwgMHg5NzhGLCAweDEyNjksIDB4OTc5NCwgMHgyQ0Y5LAorICAgIDB4OTc5NywgMHgyQ0Y4LCAweDk3OTgsIDB4MTM5MywgMHg5Nzk5LCAweDJDRjcsIDB4OTc5QSwgMHgyRUI2LCAweDk3OUMsCisgICAgMHgyRUI4LCAweDk3OUQsIDB4MkVCQSwgMHg5NzlFLCAweDJFQjksIDB4OTdBMCwgMHgxNEI0LCAweDk3QTEsIDB4MkVCNywKKyAgICAweDk3QTIsIDB4MzAzMCwgMHg5N0EzLCAweDE1NTQsIDB4OTdBNCwgMHgzMDJFLCAweDk3QTUsIDB4MzAzMSwgMHg5N0E2LAorICAgIDB4MTU1NSwgMHg5N0E4LCAweDMwMkMsIDB4OTdBQSwgMHgzMDJGLCAweDk3QUIsIDB4MzAyRCwgMHg5N0FDLCAweDMwMkEsCisgICAgMHg5N0FELCAweDE1NTYsIDB4OTdBRSwgMHgzMDJCLCAweDk3QjMsIDB4MzE2QiwgMHg5N0I2LCAweDMxNkQsIDB4OTdCNywKKyAgICAweDMxNkMsIDB4OTdCOSwgMHgzMjcxLCAweDk3QkIsIDB4MzI3MiwgMHg5N0JGLCAweDMzMzMsIDB4OTdDMSwgMHgxNkU1LAorICAgIDB4OTdDMywgMHgxNkU0LCAweDk3QzQsIDB4MzQ0QywgMHg5N0M1LCAweDM0NEQsIDB4OTdDNiwgMHgxNzM1LCAweDk3QzcsCisgICAgMHgzNEFDLCAweDk3QzksIDB4MTc1NiwgMHg5N0NCLCAweDA4MjgsIDB4OTdDQywgMHgwREFGLCAweDk3Q0QsIDB4Mjg2MSwKKyAgICAweDk3Q0UsIDB4Mjg2MCwgMHg5N0NGLCAweDJBQzEsIDB4OTdEMCwgMHgyQUMwLCAweDk3RDMsIDB4MTRCNSwgMHg5N0Q0LAorICAgIDB4MkVCQywgMHg5N0Q1LCAweDJFQkIsIDB4OTdENiwgMHgzMDM0LCAweDk3RDcsIDB4MzAzMiwgMHg5N0Q4LCAweDMwMzUsCisgICAgMHg5N0Q5LCAweDMwMzMsIDB4OTdEQywgMHgxNUYxLCAweDk3REQsIDB4MzE2RSwgMHg5N0RFLCAweDMxNkYsIDB4OTdERiwKKyAgICAweDMxNzAsIDB4OTdFMSwgMHgzMzM0LCAweDk3RTMsIDB4MzNEMiwgMHg5N0U1LCAweDM0QUQsIDB4OTdFRCwgMHgwODI5LAorICAgIDB4OTdGMCwgMHgyQ0ZBLCAweDk3RjEsIDB4MkVCRCwgMHg5N0YzLCAweDA4MkEsIDB4OTdGNiwgMHgxMEVELCAweDk3RjgsCisgICAgMHgyQ0ZCLCAweDk3RjksIDB4MTU1NywgMHg5N0ZBLCAweDMwMzYsIDB4OTdGQiwgMHgxNUYyLCAweDk3RkQsIDB4MzI3MywKKyAgICAweDk3RkUsIDB4MzI3NCwgMHg5N0ZGLCAweDE2QTQsIDB4OTgwMCwgMHgzNDRFLCAweDk4MDEsIDB4MDgyQiwgMHg5ODAyLAorICAgIDB4MEJERiwgMHg5ODAzLCAweDBCRTAsIDB4OTgwNCwgMHgyMEFCLCAweDk4MDUsIDB4MERCMCwgMHg5ODA2LCAweDBEQjEsCisgICAgMHg5ODA3LCAweDIzNUMsIDB4OTgwOCwgMHgwREIyLCAweDk4MEEsIDB4MEY2RSwgMHg5ODBDLCAweDBGNzAsIDB4OTgwRCwKKyAgICAweDI2MDIsIDB4OTgwRSwgMHgyNjAzLCAweDk4MEYsIDB4MjYwMSwgMHg5ODEwLCAweDBGNkIsIDB4OTgxMSwgMHgwRjZDLAorICAgIDB4OTgxMiwgMHgwRjZGLCAweDk4MTMsIDB4MEY2RCwgMHg5ODE2LCAweDI4NjIsIDB4OTgxNywgMHgxMEVFLCAweDk4MTgsCisgICAgMHgxMEVGLCAweDk4MUIsIDB4MkFDOCwgMHg5ODFDLCAweDEyNkMsIDB4OTgxRCwgMHgyQUMzLCAweDk4MUUsIDB4MkFDMiwKKyAgICAweDk4MjAsIDB4MkFDNywgMHg5ODIxLCAweDEyNkEsIDB4OTgyNCwgMHgxMzlBLCAweDk4MjYsIDB4MkFDNCwgMHg5ODI3LAorICAgIDB4MkFDOSwgMHg5ODI4LCAweDJBQzYsIDB4OTgyOSwgMHgyQUM1LCAweDk4MkIsIDB4MTI2QiwgMHg5ODJELCAweDEzOTgsCisgICAgMHg5ODJGLCAweDJDRkQsIDB4OTgzMCwgMHgxMzk0LCAweDk4MzIsIDB4MkNGRSwgMHg5ODM1LCAweDJDRkMsIDB4OTgzNywKKyAgICAweDEzOTcsIDB4OTgzOCwgMHgxMzk1LCAweDk4MzksIDB4MTM5OSwgMHg5ODNCLCAweDEzOTYsIDB4OTg0MSwgMHgyRUJFLAorICAgIDB4OTg0MywgMHgyRUMzLCAweDk4NDQsIDB4MkVCRiwgMHg5ODQ1LCAweDJFQzIsIDB4OTg0NiwgMHgxNEI2LCAweDk4NDgsCisgICAgMHgyREYyLCAweDk4NDksIDB4MkVDMSwgMHg5ODRBLCAweDJFQzAsIDB4OTg0QywgMHgxNTVBLCAweDk4NEQsIDB4MTU1OCwKKyAgICAweDk4NEUsIDB4MTU1QiwgMHg5ODRGLCAweDE1NTksIDB4OTg1MCwgMHgzMDM3LCAweDk4NTEsIDB4MzAzOCwgMHg5ODUyLAorICAgIDB4MzAzOSwgMHg5ODUzLCAweDE1NUMsIDB4OTg1NywgMHgzMTc0LCAweDk4NTgsIDB4MTVGNCwgMHg5ODU5LCAweDMxNzIsCisgICAgMHg5ODVCLCAweDE1RjUsIDB4OTg1QywgMHgzMTcxLCAweDk4NUQsIDB4MzE3MywgMHg5ODVFLCAweDE1RjMsIDB4OTg1RiwKKyAgICAweDMyNzgsIDB4OTg2MCwgMHgzMjc1LCAweDk4NjIsIDB4MzI3NiwgMHg5ODYzLCAweDMyNzcsIDB4OTg2NCwgMHgzMzM1LAorICAgIDB4OTg2NSwgMHgxNkE2LCAweDk4NjcsIDB4MTZBNSwgMHg5ODY5LCAweDMzRDQsIDB4OTg2QSwgMHgzM0QzLCAweDk4NkIsCisgICAgMHgxNkU2LCAweDk4NkYsIDB4MTcxMSwgMHg5ODcwLCAweDE3MzYsIDB4OTg3MSwgMHgxNzRELCAweDk4NzIsIDB4MzRGMiwKKyAgICAweDk4NzMsIDB4MzUyNywgMHg5ODc0LCAweDM1MjgsIDB4OThBOCwgMHgwODJDLCAweDk4QTksIDB4MjM1RCwgMHg5OEFDLAorICAgIDB4MjYwNCwgMHg5OEFELCAweDI4NjMsIDB4OThBRSwgMHgyODY0LCAweDk4QUYsIDB4MTBGMCwgMHg5OEIxLCAweDEwRjEsCisgICAgMHg5OEIyLCAweDJBQ0EsIDB4OThCMywgMHgxMjZELCAweDk4QjYsIDB4MTRCNywgMHg5OEI4LCAweDMwM0EsIDB4OThCQSwKKyAgICAweDE1NUQsIDB4OThCQiwgMHgzMTc3LCAweDk4QkMsIDB4MTVGNiwgMHg5OEJELCAweDMxNzYsIDB4OThCRSwgMHgzMTc4LAorICAgIDB4OThCRiwgMHgzMTc1LCAweDk4QzAsIDB4MzMzOCwgMHg5OEMxLCAweDMyNzksIDB4OThDMiwgMHgzMjdBLCAweDk4QzQsCisgICAgMHgxNjU3LCAweDk4QzYsIDB4MzMzNywgMHg5OEM5LCAweDMzMzYsIDB4OThDQiwgMHgzM0Q1LCAweDk4Q0MsIDB4MzUyOSwKKyAgICAweDk4REIsIDB4MDgyRCwgMHg5OERGLCAweDA4MkUsIDB4OThFMiwgMHgwOUY0LCAweDk4RTMsIDB4MUUzMiwgMHg5OEU1LAorICAgIDB4MjBBQywgMHg5OEU3LCAweDBEQjMsIDB4OThFOSwgMHgwREI2LCAweDk4RUEsIDB4MERCNCwgMHg5OEVCLCAweDIzNUUsCisgICAgMHg5OEVELCAweDBEQjgsIDB4OThFRiwgMHgwREI1LCAweDk4RjIsIDB4MERCNywgMHg5OEY0LCAweDBGNzIsIDB4OThGNiwKKyAgICAweDI2MDUsIDB4OThGOSwgMHgyNjA2LCAweDk4RkEsIDB4MkFDQywgMHg5OEZDLCAweDBGNzEsIDB4OThGRCwgMHgwRjczLAorICAgIDB4OThGRSwgMHgwRjc0LCAweDk5MDAsIDB4Mjg2NiwgMHg5OTAyLCAweDI4NjUsIDB4OTkwMywgMHgxMEYyLCAweDk5MDUsCisgICAgMHgxMEYzLCAweDk5MDcsIDB4Mjg2NywgMHg5OTA4LCAweDJBQ0IsIDB4OTkwOSwgMHgxMEY1LCAweDk5MEEsIDB4MTI2RSwKKyAgICAweDk5MEMsIDB4MTBGNCwgMHg5OTEwLCAweDEzOUIsIDB4OTkxMSwgMHgyQUNELCAweDk5MTIsIDB4MTI3MCwgMHg5OTEzLAorICAgIDB4MTI2RiwgMHg5OTE0LCAweDJBQ0UsIDB4OTkxNSwgMHgyQUQxLCAweDk5MTYsIDB4MkFDRiwgMHg5OTE3LCAweDJBRDAsCisgICAgMHg5OTE4LCAweDEyNzEsIDB4OTkxQSwgMHgxM0EwLCAweDk5MUIsIDB4MTM5RSwgMHg5OTFFLCAweDEzOUQsIDB4OTkxRiwKKyAgICAweDJEMDAsIDB4OTkyMSwgMHgxMzlGLCAweDk5MjQsIDB4MkNGRiwgMHg5OTI1LCAweDJFQzQsIDB4OTkyNywgMHgyRDAxLAorICAgIDB4OTkyOCwgMHgxMzlDLCAweDk5MjksIDB4MkQwMiwgMHg5OTJBLCAweDJFQzcsIDB4OTkyQiwgMHgyRUM1LCAweDk5MkMsCisgICAgMHgyRUM2LCAweDk5MkQsIDB4MkVDQiwgMHg5OTJFLCAweDE1NjEsIDB4OTkyRiwgMHgyRUNBLCAweDk5MzAsIDB4MkVDRCwKKyAgICAweDk5MzEsIDB4MkVDQywgMHg5OTMyLCAweDJFQzksIDB4OTkzMywgMHgyRUM4LCAweDk5MzUsIDB4MTRCOCwgMHg5OTNBLAorICAgIDB4MzAzRCwgMHg5OTNDLCAweDMwM0MsIDB4OTkzRCwgMHgxNTYwLCAweDk5M0UsIDB4MTU1RSwgMHg5OTNGLCAweDE1NUYsCisgICAgMHg5OTQxLCAweDMwM0IsIDB4OTk0MywgMHgzMTdCLCAweDk5NDUsIDB4MTVGNywgMHg5OTQ3LCAweDMxN0EsIDB4OTk0OCwKKyAgICAweDMxNzksIDB4OTk0OSwgMHgxNUY4LCAweDk5NEIsIDB4MzI3RiwgMHg5OTRDLCAweDMyN0UsIDB4OTk0RSwgMHgzMjdDLAorICAgIDB4OTk1MCwgMHgzMjdCLCAweDk5NTEsIDB4MTY1OSwgMHg5OTUyLCAweDE2NTgsIDB4OTk1MywgMHgzMjgwLCAweDk5NTQsCisgICAgMHgzM0Q2LCAweDk5NTUsIDB4MTZFNywgMHg5OTU2LCAweDMzM0EsIDB4OTk1NywgMHgxNkE3LCAweDk5NTgsIDB4MzMzOSwKKyAgICAweDk5NTksIDB4MzI3RCwgMHg5OTVCLCAweDMzRDcsIDB4OTk1QywgMHgxNzEyLCAweDk5NUUsIDB4MTc0RSwgMHg5OTVGLAorICAgIDB4MzRGMywgMHg5OTYxLCAweDM1MkEsIDB4OTk5NiwgMHgwODJGLCAweDk5OTcsIDB4MjBBRCwgMHg5OTk4LCAweDJFQ0UsCisgICAgMHg5OTk5LCAweDA4MzAsIDB4OTk5QywgMHgyODY5LCAweDk5OUQsIDB4Mjg2OCwgMHg5OTlFLCAweDJEMDMsIDB4OTlBMSwKKyAgICAweDJFRDAsIDB4OTlBMywgMHgyRUNGLCAweDk5QTUsIDB4MTU2MiwgMHg5OUE2LCAweDMxN0MsIDB4OTlBNywgMHgzMTdELAorICAgIDB4OTlBOCwgMHgxNjVBLCAweDk5QUIsIDB4MzUyQiwgMHg5OUFDLCAweDA5RjUsIDB4OTlBRCwgMHgwREJBLCAweDk5QUUsCisgICAgMHgwREI5LCAweDk5QUYsIDB4MjYwNywgMHg5OUIwLCAweDI2MDksIDB4OTlCMSwgMHgwRjc2LCAweDk5QjIsIDB4MjYwOCwKKyAgICAweDk5QjMsIDB4MEY3NSwgMHg5OUI0LCAweDBGNzcsIDB4OTlCNSwgMHgyNjBBLCAweDk5QjksIDB4Mjg2QiwgMHg5OUJBLAorICAgIDB4Mjg2RCwgMHg5OUJCLCAweDI4NkMsIDB4OTlCRCwgMHgyODZGLCAweDk5QzEsIDB4MTBGNiwgMHg5OUMyLCAweDI4NkUsCisgICAgMHg5OUMzLCAweDI4NkEsIDB4OTlDNywgMHgyODcwLCAweDk5QzksIDB4MkFEOCwgMHg5OUNCLCAweDJBREIsIDB4OTlDQywKKyAgICAweDJBREQsIDB4OTlDRCwgMHgyQUQzLCAweDk5Q0UsIDB4MkFENywgMHg5OUNGLCAweDJBRDQsIDB4OTlEMCwgMHgxMjczLAorICAgIDB4OTlEMSwgMHgxMjc2LCAweDk5RDIsIDB4MTI3OCwgMHg5OUQzLCAweDJBRDUsIDB4OTlENCwgMHgyQUQ2LCAweDk5RDUsCisgICAgMHgxMjc3LCAweDk5RDYsIDB4MkFEOSwgMHg5OUQ3LCAweDJBREMsIDB4OTlEOCwgMHgyQURBLCAweDk5RDksIDB4MTI3OSwKKyAgICAweDk5REIsIDB4MTI3NSwgMHg5OURDLCAweDJBRDIsIDB4OTlERCwgMHgxMjcyLCAweDk5REYsIDB4MTI3NCwgMHg5OUUyLAorICAgIDB4MTNBMiwgMHg5OUUzLCAweDJEMDksIDB4OTlFNCwgMHgyRDA3LCAweDk5RTUsIDB4MkQwNiwgMHg5OUU3LCAweDJEMEMsCisgICAgMHg5OUU5LCAweDJEMEIsIDB4OTlFQSwgMHgyRDBBLCAweDk5RUMsIDB4MkQwNSwgMHg5OUVELCAweDEzQTEsIDB4OTlFRSwKKyAgICAweDJEMDQsIDB4OTlGMCwgMHgyRDA4LCAweDk5RjEsIDB4MTNBMywgMHg5OUY0LCAweDJFRDMsIDB4OTlGNiwgMHgyRUQ3LAorICAgIDB4OTlGNywgMHgyRUQ0LCAweDk5RjgsIDB4MkVENiwgMHg5OUY5LCAweDJFRDUsIDB4OTlGQSwgMHgyRUQyLCAweDk5RkIsCisgICAgMHgyRUQ4LCAweDk5RkMsIDB4MkVEQiwgMHg5OUZELCAweDJFRDksIDB4OTlGRSwgMHgyRURBLCAweDk5RkYsIDB4MTRCQSwKKyAgICAweDlBMDEsIDB4MTRCOSwgMHg5QTAyLCAweDJFRDEsIDB4OUEwMywgMHgyRURDLCAweDlBMDQsIDB4MzA0MiwgMHg5QTA1LAorICAgIDB4MzA0NSwgMHg5QTA2LCAweDMwNDcsIDB4OUEwNywgMHgzMDQ2LCAweDlBMDksIDB4MzA0MCwgMHg5QTBBLCAweDMwNDQsCisgICAgMHg5QTBCLCAweDMwM0YsIDB4OUEwRCwgMHgzMDQxLCAweDlBMEUsIDB4MTU2MywgMHg5QTBGLCAweDMwM0UsIDB4OUExMSwKKyAgICAweDMwNDMsIDB4OUExNCwgMHgzMThBLCAweDlBMTUsIDB4MzE3RiwgMHg5QTE2LCAweDE1RjksIDB4OUExOSwgMHgxNUZBLAorICAgIDB4OUExQSwgMHgzMTdFLCAweDlBMUIsIDB4MzE4MywgMHg5QTFDLCAweDMxODksIDB4OUExRCwgMHgzMTgxLCAweDlBMUUsCisgICAgMHgzMTg4LCAweDlBMjAsIDB4MzE4NSwgMHg5QTIyLCAweDMxODQsIDB4OUEyMywgMHgzMTg3LCAweDlBMjQsIDB4MzE4MiwKKyAgICAweDlBMjUsIDB4MzE4MCwgMHg5QTI3LCAweDMxODYsIDB4OUEyOSwgMHgzMjg3LCAweDlBMkEsIDB4MzI4NSwgMHg5QTJCLAorICAgIDB4MTY1QiwgMHg5QTJDLCAweDMyODQsIDB4OUEyRCwgMHgzMjhBLCAweDlBMkUsIDB4MzI4OCwgMHg5QTMwLCAweDE2NUMsCisgICAgMHg5QTMxLCAweDMyODMsIDB4OUEzMiwgMHgzMjgxLCAweDlBMzQsIDB4MzI4MiwgMHg5QTM1LCAweDE2NUUsIDB4OUEzNiwKKyAgICAweDMyODYsIDB4OUEzNywgMHgxNjVELCAweDlBMzgsIDB4MzI4OSwgMHg5QTM5LCAweDMzM0IsIDB4OUEzQSwgMHgzMzQxLAorICAgIDB4OUEzRCwgMHgzMzNDLCAweDlBM0UsIDB4MTZBQiwgMHg5QTNGLCAweDMzNDIsIDB4OUE0MCwgMHgxNkFBLCAweDlBNDEsCisgICAgMHgzMzQwLCAweDlBNDIsIDB4MzMzRiwgMHg5QTQzLCAweDE2QTksIDB4OUE0NCwgMHgzMzNFLCAweDlBNDUsIDB4MTZBOCwKKyAgICAweDlBNDYsIDB4MzMzRCwgMHg5QTQ4LCAweDMzREQsIDB4OUE0OSwgMHgzM0RGLCAweDlBNEEsIDB4MzNERSwgMHg5QTRDLAorICAgIDB4MzNEQiwgMHg5QTRELCAweDE2RTksIDB4OUE0RSwgMHgzM0Q4LCAweDlBNEYsIDB4MzNEQywgMHg5QTUwLCAweDMzRTEsCisgICAgMHg5QTUyLCAweDMzRTAsIDB4OUE1MywgMHgzM0Q5LCAweDlBNTQsIDB4MzNEQSwgMHg5QTU1LCAweDE2RTgsIDB4OUE1NiwKKyAgICAweDM0NEYsIDB4OUE1NywgMHgxNzE1LCAweDlBNTksIDB4MzQ1MCwgMHg5QTVBLCAweDE3MTMsIDB4OUE1QiwgMHgxNzE0LAorICAgIDB4OUE1RSwgMHgzNEFFLCAweDlBNUYsIDB4MTczNywgMHg5QTYwLCAweDM1MTAsIDB4OUE2MiwgMHgxNzU3LCAweDlBNjQsCisgICAgMHgzNTJDLCAweDlBNjUsIDB4MTc1OCwgMHg5QTY2LCAweDM1MkQsIDB4OUE2NywgMHgzNTJFLCAweDlBNjgsIDB4MzUzQywKKyAgICAweDlBNjksIDB4MzUzQiwgMHg5QTZBLCAweDE3NjcsIDB4OUE2QiwgMHgzNTQ0LCAweDlBQTgsIDB4MDlGNiwgMHg5QUFCLAorICAgIDB4MjYwQywgMHg5QUFELCAweDI2MEIsIDB4OUFBRiwgMHgxMEY3LCAweDlBQjAsIDB4MTBGOCwgMHg5QUIxLCAweDI4NzEsCisgICAgMHg5QUIzLCAweDJBREUsIDB4OUFCNCwgMHgyRDBGLCAweDlBQjcsIDB4MTI3QSwgMHg5QUI4LCAweDEzQTQsIDB4OUFCOSwKKyAgICAweDJEMEQsIDB4OUFCQiwgMHgyRDEwLCAweDlBQkMsIDB4MTNBNSwgMHg5QUJFLCAweDJFREQsIDB4OUFCRiwgMHgyRDBFLAorICAgIDB4OUFDMCwgMHgzMDQ4LCAweDlBQzEsIDB4MTU2NCwgMHg5QUMyLCAweDMxOEIsIDB4OUFDNiwgMHgzMjhELCAweDlBQzcsCisgICAgMHgzMjhCLCAweDlBQ0EsIDB4MzI4QywgMHg5QUNELCAweDMzNDMsIDB4OUFDRiwgMHgxNkFDLCAweDlBRDAsIDB4MzNFMiwKKyAgICAweDlBRDEsIDB4MTcxOCwgMHg5QUQyLCAweDE2RUEsIDB4OUFEMywgMHgxNzE2LCAweDlBRDQsIDB4MTcxNywgMHg5QUQ1LAorICAgIDB4MzRBRiwgMHg5QUQ2LCAweDE3NEYsIDB4OUFEOCwgMHgwOUY3LCAweDlBREMsIDB4MzA0OSwgMHg5QURGLCAweDFFMzMsCisgICAgMHg5QUUxLCAweDBGNzgsIDB4OUFFMywgMHgyODcyLCAweDlBRTYsIDB4MTBGOSwgMHg5QUU3LCAweDI4NzMsIDB4OUFFQiwKKyAgICAweDJBRTAsIDB4OUFFQywgMHgyQURGLCAweDlBRUQsIDB4MTNBNywgMHg5QUVFLCAweDEyN0IsIDB4OUFFRiwgMHgxMjdDLAorICAgIDB4OUFGMSwgMHgyQUUzLCAweDlBRjIsIDB4MkFFMiwgMHg5QUYzLCAweDJBRTEsIDB4OUFGNiwgMHgyRDExLCAweDlBRjcsCisgICAgMHgyRDE0LCAweDlBRjksIDB4MkQxMywgMHg5QUZBLCAweDJEMTIsIDB4OUFGQiwgMHgxM0E2LCAweDlBRkMsIDB4MkVFMSwKKyAgICAweDlBRkQsIDB4MkVERiwgMHg5QUZFLCAweDJFREUsIDB4OUIwMSwgMHgyRUUwLCAweDlCMDMsIDB4MTU2NSwgMHg5QjA0LAorICAgIDB4MzA0QiwgMHg5QjA1LCAweDMwNEMsIDB4OUIwNiwgMHgxNTY2LCAweDlCMDgsIDB4MzA0QSwgMHg5QjBBLCAweDMxOEQsCisgICAgMHg5QjBCLCAweDMxOEMsIDB4OUIwQywgMHgzMThGLCAweDlCMEQsIDB4MTVGQiwgMHg5QjBFLCAweDMxOEUsIDB4OUIxMCwKKyAgICAweDMyOEUsIDB4OUIxMSwgMHgzMjkwLCAweDlCMTIsIDB4MzI4RiwgMHg5QjE1LCAweDMzNDQsIDB4OUIxNiwgMHgzMzQ3LAorICAgIDB4OUIxNywgMHgzMzQ1LCAweDlCMTgsIDB4MzM0NiwgMHg5QjE5LCAweDMzRTMsIDB4OUIxQSwgMHgxNkVCLCAweDlCMUUsCisgICAgMHgzNDUxLCAweDlCMUYsIDB4MzQ1MiwgMHg5QjIwLCAweDM0NTMsIDB4OUIyMiwgMHgxNzM4LCAweDlCMjMsIDB4MTc1MCwKKyAgICAweDlCMjQsIDB4MzUyRiwgMHg5QjI1LCAweDA5RjgsIDB4OUIyNywgMHgxMjdELCAweDlCMjgsIDB4MTNBOCwgMHg5QjI5LAorICAgIDB4MzA0RCwgMHg5QjJCLCAweDMzRTQsIDB4OUIyRSwgMHgzNTExLCAweDlCMkYsIDB4MUUzNCwgMHg5QjMxLCAweDE3NjgsCisgICAgMHg5QjMyLCAweDA5RjksIDB4OUIzMywgMHgyRDE1LCAweDlCMzUsIDB4MzA0RSwgMHg5QjM3LCAweDMxOTAsIDB4OUIzQSwKKyAgICAweDMzNDgsIDB4OUIzQiwgMHgzM0U1LCAweDlCM0MsIDB4MDlGQSwgMHg5QjNFLCAweDI4NzQsIDB4OUIzRiwgMHgyODc1LAorICAgIDB4OUI0MSwgMHgxMEZBLCAweDlCNDIsIDB4MTBGQiwgMHg5QjQzLCAweDJBRTUsIDB4OUI0NCwgMHgxMjdGLCAweDlCNDUsCisgICAgMHgxMjdFLCAweDlCNDYsIDB4MkFFNCwgMHg5QjQ4LCAweDJFRTIsIDB4OUI0QSwgMHgzMDRGLCAweDlCNEIsIDB4MzA1MSwKKyAgICAweDlCNEMsIDB4MzA1MCwgMHg5QjRELCAweDE1NjksIDB4OUI0RSwgMHgxNTY4LCAweDlCNEYsIDB4MTU2NywgMHg5QjUxLAorICAgIDB4MTZBRSwgMHg5QjUyLCAweDMzNDksIDB4OUI1NCwgMHgxNkFELCAweDlCNTUsIDB4MzNFNywgMHg5QjU2LCAweDMzRTYsCisgICAgMHg5QjU4LCAweDE3MzksIDB4OUI1OSwgMHgzNEIwLCAweDlCNUEsIDB4MEJFMSwgMHg5QjVCLCAweDI2MEQsIDB4OUI1RiwKKyAgICAweDI4NzgsIDB4OUI2MCwgMHgyODc2LCAweDlCNjEsIDB4Mjg3NywgMHg5QjY0LCAweDJBRUUsIDB4OUI2NiwgMHgyQUU5LAorICAgIDB4OUI2NywgMHgyQUU2LCAweDlCNjgsIDB4MkFFRCwgMHg5QjZDLCAweDJBRUYsIDB4OUI2RiwgMHgxMjgxLCAweDlCNzAsCisgICAgMHgyQUVDLCAweDlCNzEsIDB4MkFFOCwgMHg5Qjc0LCAweDJBRTcsIDB4OUI3NSwgMHgyQUVCLCAweDlCNzYsIDB4MkFFQSwKKyAgICAweDlCNzcsIDB4MTI4MCwgMHg5QjdBLCAweDJEMjAsIDB4OUI3QiwgMHgyRDFCLCAweDlCN0MsIDB4MkQxOSwgMHg5QjdELAorICAgIDB4MkQyMiwgMHg5QjdFLCAweDJEMUEsIDB4OUI4MCwgMHgyRDE2LCAweDlCODIsIDB4MkQxQywgMHg5Qjg1LCAweDJEMTcsCisgICAgMHg5Qjg2LCAweDJFRUIsIDB4OUI4NywgMHgyRDE4LCAweDlCODgsIDB4MkQyMywgMHg5QjkwLCAweDJEMUYsIDB4OUI5MSwKKyAgICAweDEzQTksIDB4OUI5MiwgMHgyRDFFLCAweDlCOTMsIDB4MkQxRCwgMHg5Qjk1LCAweDJEMjEsIDB4OUI5QSwgMHgyRUUzLAorICAgIDB4OUI5QiwgMHgyRUU2LCAweDlCOUUsIDB4MkVFNSwgMHg5QkEwLCAweDJFRUQsIDB4OUJBMSwgMHgyRUU4LCAweDlCQTIsCisgICAgMHgyRUVDLCAweDlCQTQsIDB4MkVFQSwgMHg5QkE1LCAweDJFRTksIDB4OUJBNiwgMHgyRUU3LCAweDlCQTgsIDB4MkVFNCwKKyAgICAweDlCQUEsIDB4MTRCRCwgMHg5QkFCLCAweDE0QkMsIDB4OUJBRCwgMHgxNEJFLCAweDlCQUUsIDB4MTRCQiwgMHg5QkFGLAorICAgIDB4MkVFRSwgMHg5QkI1LCAweDMwNTcsIDB4OUJCNiwgMHgzMDVBLCAweDlCQjgsIDB4MzA1OCwgMHg5QkI5LCAweDMwNUMsCisgICAgMHg5QkJELCAweDMwNUQsIDB4OUJCRiwgMHgzMDU1LCAweDlCQzAsIDB4MTU2RSwgMHg5QkMxLCAweDMwNTYsIDB4OUJDMywKKyAgICAweDMwNTQsIDB4OUJDNCwgMHgzMDVCLCAweDlCQzYsIDB4MzA1MywgMHg5QkM3LCAweDMwNTIsIDB4OUJDOCwgMHgxNTZELAorICAgIDB4OUJDOSwgMHgxNTZCLCAweDlCQ0EsIDB4MTU2QSwgMHg5QkQzLCAweDMwNTksIDB4OUJENCwgMHgzMTk5LCAweDlCRDUsCisgICAgMHgzMTlGLCAweDlCRDYsIDB4MTVGRSwgMHg5QkQ3LCAweDMxOUEsIDB4OUJEOSwgMHgzMTlELCAweDlCREEsIDB4MzFBMSwKKyAgICAweDlCREIsIDB4MTVGRiwgMHg5QkRDLCAweDMxOUMsIDB4OUJERSwgMHgzMTk0LCAweDlCRTAsIDB4MzE5MywgMHg5QkUxLAorICAgIDB4MzFBMCwgMHg5QkUyLCAweDMxOTcsIDB4OUJFNCwgMHgzMTk1LCAweDlCRTUsIDB4MzE5RSwgMHg5QkU2LCAweDMxOTYsCisgICAgMHg5QkU3LCAweDE1RkQsIDB4OUJFOCwgMHgxNUZDLCAweDlCRUEsIDB4MzE5MSwgMHg5QkVCLCAweDMxOTIsIDB4OUJFQywKKyAgICAweDMxOUIsIDB4OUJGMCwgMHgzMTk4LCAweDlCRjcsIDB4MzI5MywgMHg5QkY4LCAweDMyOTYsIDB4OUJGRCwgMHgxNTZDLAorICAgIDB4OUMwNSwgMHgzMjk0LCAweDlDMDYsIDB4MzI5QSwgMHg5QzA3LCAweDMyOTgsIDB4OUMwOCwgMHgzMjkyLCAweDlDMDksCisgICAgMHgzMjlELCAweDlDMEIsIDB4MzI5MSwgMHg5QzBELCAweDE2NjAsIDB4OUMwRSwgMHgzMjk5LCAweDlDMTIsIDB4MzI5NSwKKyAgICAweDlDMTMsIDB4MTY1RiwgMHg5QzE0LCAweDMyOUMsIDB4OUMxNywgMHgzMjlCLCAweDlDMUMsIDB4MzM0QywgMHg5QzFELAorICAgIDB4MzM0QiwgMHg5QzIxLCAweDMzNTIsIDB4OUMyMywgMHgzMzRFLCAweDlDMjQsIDB4MzM1MSwgMHg5QzI1LCAweDE2QjAsCisgICAgMHg5QzI4LCAweDMzNEYsIDB4OUMyOSwgMHgzMzUwLCAweDlDMkIsIDB4MzM0QSwgMHg5QzJDLCAweDMzNEQsIDB4OUMyRCwKKyAgICAweDE2QUYsIDB4OUMzMSwgMHgxNkVELCAweDlDMzIsIDB4MzNGMiwgMHg5QzMzLCAweDMzRUQsIDB4OUMzNCwgMHgzM0YxLAorICAgIDB4OUMzNiwgMHgzM0Y0LCAweDlDMzcsIDB4MzNGMCwgMHg5QzM5LCAweDMzRUMsIDB4OUMzQiwgMHgxNkVGLCAweDlDM0MsCisgICAgMHgzM0VGLCAweDlDM0QsIDB4MzNGMywgMHg5QzNFLCAweDE2RUUsIDB4OUMzRiwgMHgzM0VBLCAweDlDNDAsIDB4MzI5NywKKyAgICAweDlDNDEsIDB4MzNFRSwgMHg5QzQ0LCAweDMzRUIsIDB4OUM0NiwgMHgzM0U4LCAweDlDNDgsIDB4MzNFOSwgMHg5QzQ5LAorICAgIDB4MTZFQywgMHg5QzRBLCAweDM0NTcsIDB4OUM0QiwgMHgzNDU5LCAweDlDNEMsIDB4MzQ1QywgMHg5QzRELCAweDM0NTgsCisgICAgMHg5QzRFLCAweDM0NUQsIDB4OUM1MCwgMHgzNDU2LCAweDlDNTIsIDB4MzQ1NCwgMHg5QzU0LCAweDE3MTksIDB4OUM1NSwKKyAgICAweDM0NUEsIDB4OUM1NiwgMHgxNzFCLCAweDlDNTcsIDB4MTcxQSwgMHg5QzU4LCAweDM0NTUsIDB4OUM1OSwgMHgzNDVCLAorICAgIDB4OUM1RSwgMHgzNEI1LCAweDlDNUYsIDB4MTczQSwgMHg5QzYwLCAweDM0QjYsIDB4OUM2MiwgMHgzNEI0LCAweDlDNjMsCisgICAgMHgzNEIxLCAweDlDNjYsIDB4MzRCMywgMHg5QzY3LCAweDM0QjIsIDB4OUM2OCwgMHgzNEY0LCAweDlDNkQsIDB4MzRGNiwKKyAgICAweDlDNkUsIDB4MzRGNSwgMHg5QzcxLCAweDM1MTQsIDB4OUM3MywgMHgzNTEzLCAweDlDNzQsIDB4MzUxMiwgMHg5Qzc1LAorICAgIDB4MzUxNSwgMHg5Qzc3LCAweDE3NjAsIDB4OUM3OCwgMHgxNzYxLCAweDlDNzksIDB4MzU0MSwgMHg5QzdBLCAweDM1NDUsCisgICAgMHg5Q0U1LCAweDBCRTIsIDB4OUNFNiwgMHgyMzVGLCAweDlDRTcsIDB4MjYxMCwgMHg5Q0U5LCAweDBGNzksIDB4OUNFQSwKKyAgICAweDI2MEUsIDB4OUNFRCwgMHgyNjBGLCAweDlDRjEsIDB4Mjg3OSwgMHg5Q0YyLCAweDI4N0EsIDB4OUNGMywgMHgxMEZFLAorICAgIDB4OUNGNCwgMHgxMEZDLCAweDlDRjUsIDB4Mjg3QiwgMHg5Q0Y2LCAweDEwRkQsIDB4OUNGNywgMHgyQUY0LCAweDlDRjksCisgICAgMHgyQUY3LCAweDlDRkEsIDB4MkFGMSwgMHg5Q0ZCLCAweDJBRjgsIDB4OUNGQywgMHgyQUYwLCAweDlDRkQsIDB4MkFGMiwKKyAgICAweDlDRkYsIDB4MkFGMywgMHg5RDAwLCAweDJBRjYsIDB4OUQwMywgMHgxMjg0LCAweDlEMDQsIDB4MkFGQiwgMHg5RDA1LAorICAgIDB4MkFGQSwgMHg5RDA2LCAweDEyODIsIDB4OUQwNywgMHgyQUY1LCAweDlEMDgsIDB4MkFGOSwgMHg5RDA5LCAweDEyODMsCisgICAgMHg5RDEwLCAweDJEMkQsIDB4OUQxMiwgMHgxM0FFLCAweDlEMTQsIDB4MkQyOCwgMHg5RDE1LCAweDEzQUEsIDB4OUQxNywKKyAgICAweDJEMjUsIDB4OUQxOCwgMHgyRDJCLCAweDlEMTksIDB4MkQyRSwgMHg5RDFCLCAweDEzQUYsIDB4OUQxRCwgMHgyRDJBLAorICAgIDB4OUQxRSwgMHgyRDI3LCAweDlEMUYsIDB4MkQyRiwgMHg5RDIwLCAweDJEMjYsIDB4OUQyMiwgMHgyRDJDLCAweDlEMjMsCisgICAgMHgxM0FCLCAweDlEMjUsIDB4MkQyNCwgMHg5RDI2LCAweDEzQUMsIDB4OUQyOCwgMHgxM0FELCAweDlEMjksIDB4MkQyOSwKKyAgICAweDlEMkQsIDB4MkYwMCwgMHg5RDJFLCAweDJFRjMsIDB4OUQyRiwgMHgyRUY0LCAweDlEMzAsIDB4MkVGNywgMHg5RDMxLAorICAgIDB4MkVGNSwgMHg5RDMzLCAweDJFRUYsIDB4OUQzNiwgMHgyRUYyLCAweDlEMzcsIDB4MkVGQywgMHg5RDM4LCAweDJFRjYsCisgICAgMHg5RDNCLCAweDE0QkYsIDB4OUQzRCwgMHgyRUZFLCAweDlEM0UsIDB4MkVGQiwgMHg5RDNGLCAweDE0QzAsIDB4OUQ0MCwKKyAgICAweDJFRkQsIDB4OUQ0MSwgMHgyRUYwLCAweDlENDIsIDB4MkVGOSwgMHg5RDQzLCAweDJFRkEsIDB4OUQ0NSwgMHgyRUY4LAorICAgIDB4OUQ0QSwgMHgzMDYxLCAweDlENEIsIDB4MzA2MywgMHg5RDRDLCAweDMwNjYsIDB4OUQ0RiwgMHgzMDYwLCAweDlENTEsCisgICAgMHgxNTZGLCAweDlENTIsIDB4MzA2OCwgMHg5RDUzLCAweDMwNUYsIDB4OUQ1NCwgMHgzMDY5LCAweDlENTYsIDB4MzA2NSwKKyAgICAweDlENTcsIDB4MzA2NywgMHg5RDU4LCAweDMwNkIsIDB4OUQ1OSwgMHgzMDY0LCAweDlENUEsIDB4MzA2QywgMHg5RDVCLAorICAgIDB4MzA2MiwgMHg5RDVDLCAweDMwNUUsIDB4OUQ1RCwgMHgxNTcwLCAweDlENUYsIDB4MzA2QSwgMHg5RDYwLCAweDE1NzEsCisgICAgMHg5RDYxLCAweDE2MDEsIDB4OUQ2NywgMHgyRUYxLCAweDlENjgsIDB4MzFCQiwgMHg5RDY5LCAweDMxQjIsIDB4OUQ2QSwKKyAgICAweDE2MDMsIDB4OUQ2QiwgMHgzMUFFLCAweDlENkMsIDB4MTYwNCwgMHg5RDZGLCAweDMxQjcsIDB4OUQ3MCwgMHgzMUIxLAorICAgIDB4OUQ3MSwgMHgzMUE3LCAweDlENzIsIDB4MTYwMiwgMHg5RDczLCAweDMxQjQsIDB4OUQ3NCwgMHgzMUFGLCAweDlENzUsCisgICAgMHgzMUIwLCAweDlENzcsIDB4MzFBMiwgMHg5RDc4LCAweDMxQTksIDB4OUQ3OSwgMHgzMUI4LCAweDlEN0IsIDB4MzFCNSwKKyAgICAweDlEN0QsIDB4MzFBRCwgMHg5RDdGLCAweDMxQjksIDB4OUQ4MCwgMHgzMUE4LCAweDlEODEsIDB4MzFBMywgMHg5RDgyLAorICAgIDB4MzFCNiwgMHg5RDg0LCAweDMxQTUsIDB4OUQ4NSwgMHgzMUIzLCAweDlEODYsIDB4MzFBQSwgMHg5RDg3LCAweDMxQkEsCisgICAgMHg5RDg4LCAweDMxQTYsIDB4OUQ4OSwgMHgxNjAwLCAweDlEOEEsIDB4MzFBNCwgMHg5RDhCLCAweDMxQUIsIDB4OUQ4QywKKyAgICAweDMxQUMsIDB4OUQ5MCwgMHgzMkE0LCAweDlEOTIsIDB4MzJBMiwgMHg5RDk0LCAweDMyQTcsIDB4OUQ5NiwgMHgzMkIzLAorICAgIDB4OUQ5NywgMHgzMkFBLCAweDlEOTgsIDB4MzJBMywgMHg5RDk5LCAweDMyOUYsIDB4OUQ5QSwgMHgzMkFDLCAweDlEOUIsCisgICAgMHgzMkE1LCAweDlEOUMsIDB4MzJBOCwgMHg5RDlELCAweDMyQTEsIDB4OUQ5RSwgMHgzMkFGLCAweDlEOUYsIDB4MzI5RSwKKyAgICAweDlEQTAsIDB4MzJBNiwgMHg5REExLCAweDMyQUIsIDB4OURBMiwgMHgzMkFELCAweDlEQTMsIDB4MzJCMCwgMHg5REE0LAorICAgIDB4MzJBMCwgMHg5REE2LCAweDMyQjQsIDB4OURBNywgMHgzMkI1LCAweDlEQTgsIDB4MzJBRSwgMHg5REE5LCAweDMyQjIsCisgICAgMHg5REFBLCAweDMyQTksIDB4OURBQywgMHgzMzYyLCAweDlEQUQsIDB4MzM2NSwgMHg5REFGLCAweDE2QjEsIDB4OURCMSwKKyAgICAweDMzNjQsIDB4OURCMiwgMHgzMzY5LCAweDlEQjMsIDB4MzM2NywgMHg5REI0LCAweDE2QjIsIDB4OURCNSwgMHgzMzVFLAorICAgIDB4OURCNiwgMHgzMzU0LCAweDlEQjcsIDB4MzM1MywgMHg5REI4LCAweDE2QjQsIDB4OURCOSwgMHgzMzYwLCAweDlEQkEsCisgICAgMHgzMzYxLCAweDlEQkIsIDB4MzM1RCwgMHg5REJDLCAweDMzNTUsIDB4OURCRSwgMHgzMzVBLCAweDlEQkYsIDB4MzJCMSwKKyAgICAweDlEQzEsIDB4MzM1NiwgMHg5REMyLCAweDE2QjMsIDB4OURDMywgMHgzMzVDLCAweDlEQzUsIDB4MzM1QiwgMHg5REM3LAorICAgIDB4MzM1NywgMHg5REM4LCAweDMzNjMsIDB4OURDQSwgMHgzMzU4LCAweDlEQ0IsIDB4MzNGOSwgMHg5RENDLCAweDMzNjYsCisgICAgMHg5RENELCAweDMzNjgsIDB4OURDRSwgMHgzMzVGLCAweDlEQ0YsIDB4MzM1OSwgMHg5REQwLCAweDMzRkEsIDB4OUREMSwKKyAgICAweDMzRkMsIDB4OUREMiwgMHgzM0Y2LCAweDlERDMsIDB4MTZGMCwgMHg5REQ1LCAweDM0MDMsIDB4OURENiwgMHgzNDAxLAorICAgIDB4OURENywgMHgxNkYxLCAweDlERDgsIDB4MzQwMCwgMHg5REQ5LCAweDMzRkYsIDB4OUREQSwgMHgzM0Y4LCAweDlEREIsCisgICAgMHgzM0Y1LCAweDlEREMsIDB4MzNGQiwgMHg5RERELCAweDM0MDQsIDB4OURERSwgMHgzM0Y3LCAweDlEREYsIDB4MzNGRCwKKyAgICAweDlERTEsIDB4MzQ2NiwgMHg5REUyLCAweDM0NkIsIDB4OURFMywgMHgzNDYxLCAweDlERTQsIDB4MzQ2NCwgMHg5REU1LAorICAgIDB4MTcxQywgMHg5REU2LCAweDM0NjgsIDB4OURFOCwgMHgzNDZGLCAweDlERTksIDB4MzNGRSwgMHg5REVCLCAweDM0NjIsCisgICAgMHg5REVDLCAweDM0NkMsIDB4OURFRCwgMHgzNDcwLCAweDlERUUsIDB4MzQ2NywgMHg5REVGLCAweDM0NjAsIDB4OURGMCwKKyAgICAweDM0NkEsIDB4OURGMiwgMHgzNDY5LCAweDlERjMsIDB4MzQ2RSwgMHg5REY0LCAweDM0NkQsIDB4OURGNSwgMHgzNDAyLAorICAgIDB4OURGNiwgMHgzNDY1LCAweDlERjcsIDB4MzQ1RiwgMHg5REY4LCAweDM0NjMsIDB4OURGOSwgMHgxNzNCLCAweDlERkEsCisgICAgMHgxNzNDLCAweDlERkIsIDB4MzQ1RSwgMHg5REZELCAweDM0QzEsIDB4OURGRSwgMHgzNEI4LCAweDlERkYsIDB4MzRDMCwKKyAgICAweDlFMDAsIDB4MzRCRCwgMHg5RTAxLCAweDM0QkUsIDB4OUUwMiwgMHgzNEI3LCAweDlFMDMsIDB4MzRCQSwgMHg5RTA0LAorICAgIDB4MzRDMiwgMHg5RTA1LCAweDM0QkMsIDB4OUUwNiwgMHgzNEJCLCAweDlFMDcsIDB4MzRCOSwgMHg5RTA5LCAweDM0QkYsCisgICAgMHg5RTBCLCAweDM0RjcsIDB4OUUwRCwgMHgzNEY4LCAweDlFMEYsIDB4MzRGQSwgMHg5RTEwLCAweDM0RjksIDB4OUUxMSwKKyAgICAweDM0RkMsIDB4OUUxMiwgMHgzNEZCLCAweDlFMTMsIDB4MzUxNywgMHg5RTE0LCAweDM1MTYsIDB4OUUxNSwgMHgzNTMwLAorICAgIDB4OUUxNywgMHgzNTMxLCAweDlFMTksIDB4MzUzRCwgMHg5RTFBLCAweDE3NjUsIDB4OUUxQiwgMHgxNzY5LCAweDlFMUQsCisgICAgMHgzNTQ2LCAweDlFMUUsIDB4MTc2QSwgMHg5RTc1LCAweDBCRTMsIDB4OUU3OSwgMHgxNjYxLCAweDlFN0EsIDB4MzM2QSwKKyAgICAweDlFN0MsIDB4MTczRCwgMHg5RTdELCAweDE3M0UsIDB4OUU3RiwgMHgwQkU0LCAweDlFODAsIDB4MjYxMSwgMHg5RTgyLAorICAgIDB4MEY3QSwgMHg5RTgzLCAweDJBRkMsIDB4OUU4NiwgMHgyRDMxLCAweDlFODcsIDB4MkQzMiwgMHg5RTg4LCAweDJEMzAsCisgICAgMHg5RTg5LCAweDJGMDIsIDB4OUU4QSwgMHgyRjAxLCAweDlFOEIsIDB4MTRDMSwgMHg5RThDLCAweDMwNkUsIDB4OUU4RCwKKyAgICAweDJGMDMsIDB4OUU4RSwgMHgzMDZELCAweDlFOTEsIDB4MzFCRCwgMHg5RTkyLCAweDE2MDUsIDB4OUU5MywgMHgxNjA3LAorICAgIDB4OUU5NCwgMHgzMUJDLCAweDlFOTcsIDB4MTYwNiwgMHg5RTk5LCAweDMyQjYsIDB4OUU5QSwgMHgzMkI4LCAweDlFOUIsCisgICAgMHgzMkI3LCAweDlFOUMsIDB4MzM2QiwgMHg5RTlELCAweDE2QjUsIDB4OUU5RiwgMHgxNzFELCAweDlFQTAsIDB4MzRDMywKKyAgICAweDlFQTEsIDB4MzRGRCwgMHg5RUE0LCAweDM1NEEsIDB4OUVBNSwgMHgwQkU1LCAweDlFQTcsIDB4Mjg3QywgMHg5RUE5LAorICAgIDB4MTI4NSwgMHg5RUFELCAweDJEMzQsIDB4OUVBRSwgMHgyRDMzLCAweDlFQjAsIDB4MkYwNCwgMHg5RUI0LCAweDE2MDgsCisgICAgMHg5RUI1LCAweDE2NjIsIDB4OUVCNiwgMHgzNDA1LCAweDlFQjcsIDB4MzU0MiwgMHg5RUJCLCAweDBCRTYsIDB4OUVCQywKKyAgICAweDEwRkYsIDB4OUVCRSwgMHgxMjg2LCAweDlFQzAsIDB4MzFCRSwgMHg5RUMyLCAweDM0NzEsIDB4OUVDMywgMHgwREJCLAorICAgIDB4OUVDOCwgMHgyRjA1LCAweDlFQ0MsIDB4MTc1MSwgMHg5RUNELCAweDBEQkMsIDB4OUVDRSwgMHgxMjg3LCAweDlFQ0YsCisgICAgMHgxNEMyLCAweDlFRDAsIDB4MzQ3MiwgMHg5RUQxLCAweDBEQkQsIDB4OUVEMywgMHgyQUZELCAweDlFRDQsIDB4MTNCMSwKKyAgICAweDlFRDUsIDB4MkQzNSwgMHg5RUQ2LCAweDJEMzYsIDB4OUVEOCwgMHgxM0IwLCAweDlFREEsIDB4MkYwNiwgMHg5RURCLAorICAgIDB4MTRDNiwgMHg5RURDLCAweDE0QzQsIDB4OUVERCwgMHgxNEM1LCAweDlFREUsIDB4MTRDMywgMHg5RURGLCAweDMwNkYsCisgICAgMHg5RUUwLCAweDE1NzIsIDB4OUVFNCwgMHgzMkJBLCAweDlFRTUsIDB4MzJCOSwgMHg5RUU2LCAweDMyQkMsIDB4OUVFNywKKyAgICAweDMyQkIsIDB4OUVFOCwgMHgxNjYzLCAweDlFRUIsIDB4MzM2QywgMHg5RUVELCAweDMzNkUsIDB4OUVFRSwgMHgzMzZELAorICAgIDB4OUVFRiwgMHgxNkI2LCAweDlFRjAsIDB4MzQwNiwgMHg5RUYyLCAweDM0NzMsIDB4OUVGMywgMHgzNDc0LCAweDlFRjQsCisgICAgMHgxNzFFLCAweDlFRjUsIDB4MzRGRSwgMHg5RUY2LCAweDM1MTgsIDB4OUVGNywgMHgxNzYyLCAweDlFRjksIDB4MjM2MCwKKyAgICAweDlFRkEsIDB4MkQzNywgMHg5RUZCLCAweDJGMDcsIDB4OUVGQywgMHgzMUJGLCAweDlFRkQsIDB4MjYxMiwgMHg5RUZGLAorICAgIDB4MkYwOCwgMHg5RjAwLCAweDMwNzEsIDB4OUYwMSwgMHgzMDcwLCAweDlGMDYsIDB4MzQ3NSwgMHg5RjA3LCAweDE3M0YsCisgICAgMHg5RjA5LCAweDM0RkYsIDB4OUYwQSwgMHgzNTE5LCAweDlGMEUsIDB4MEY3QiwgMHg5RjBGLCAweDJBRkUsIDB4OUYxMCwKKyAgICAweDJBRkYsIDB4OUYxMiwgMHgyRDM4LCAweDlGMTMsIDB4MEY3QywgMHg5RjE1LCAweDE1NzMsIDB4OUYxNiwgMHgzMDcyLAorICAgIDB4OUYxOCwgMHgzMzcwLCAweDlGMTksIDB4MTZCNywgMHg5RjFBLCAweDMzNzEsIDB4OUYxQiwgMHgzMzZGLCAweDlGMUMsCisgICAgMHgzNDc2LCAweDlGMUUsIDB4MzRDNCwgMHg5RjIwLCAweDBGN0QsIDB4OUYyMiwgMHgyRjBCLCAweDlGMjMsIDB4MkYwQSwKKyAgICAweDlGMjQsIDB4MkYwOSwgMHg5RjI1LCAweDMwNzMsIDB4OUYyOCwgMHgzMDc3LCAweDlGMjksIDB4MzA3NiwgMHg5RjJBLAorICAgIDB4MzA3NSwgMHg5RjJCLCAweDMwNzQsIDB4OUYyQywgMHgxNTc0LCAweDlGMkQsIDB4MzFDMCwgMHg5RjJFLCAweDMyQkUsCisgICAgMHg5RjJGLCAweDE2NjQsIDB4OUYzMCwgMHgzMkJELCAweDlGMzEsIDB4MzM3MiwgMHg5RjMyLCAweDM0MDksIDB4OUYzMywKKyAgICAweDM0MDgsIDB4OUYzNCwgMHgxNkYyLCAweDlGMzUsIDB4MzQwNywgMHg5RjM2LCAweDM0NzksIDB4OUYzNywgMHgzNDc4LAorICAgIDB4OUYzOCwgMHgzNDc3LCAweDlGM0IsIDB4MTEwMCwgMHg5RjNELCAweDJEMzksIDB4OUYzRSwgMHgxNEM3LCAweDlGNDAsCisgICAgMHgzMUMxLCAweDlGNDEsIDB4MzFDMiwgMHg5RjQyLCAweDM0MEEsIDB4OUY0MywgMHgzNDdBLCAweDlGNDYsIDB4MzRDNSwKKyAgICAweDlGNDcsIDB4MzUwMCwgMHg5RjQ4LCAweDM1MzIsIDB4OUY0OSwgMHgzNTRDLCAweDlGNEEsIDB4MTEwMSwgMHg5RjRCLAorICAgIDB4MTRDOCwgMHg5RjRDLCAweDMwNzgsIDB4OUY0RCwgMHgzMUMzLCAweDlGNEUsIDB4MzM3MywgMHg5RjRGLCAweDM0N0IsCisgICAgMHg5RjUyLCAweDEyODksIDB4OUY1NCwgMHgyRjBDLCAweDlGNTUsIDB4MzA3OSwgMHg5RjU2LCAweDMxQzQsIDB4OUY1NywKKyAgICAweDMxQzUsIDB4OUY1OCwgMHgzMUM2LCAweDlGNTksIDB4MzJDMywgMHg5RjVCLCAweDMyQkYsIDB4OUY1QywgMHgxNkI4LAorICAgIDB4OUY1RCwgMHgzMkMyLCAweDlGNUUsIDB4MzJDMSwgMHg5RjVGLCAweDE2NjUsIDB4OUY2MCwgMHgzMkMwLCAweDlGNjEsCisgICAgMHgxNjY3LCAweDlGNjMsIDB4MTY2NiwgMHg5RjY0LCAweDMzNzUsIDB4OUY2NSwgMHgzMzc0LCAweDlGNjYsIDB4MTZCOSwKKyAgICAweDlGNjcsIDB4MTZCQSwgMHg5RjZBLCAweDE2RjQsIDB4OUY2QiwgMHgzNDBCLCAweDlGNkMsIDB4MTZGMywgMHg5RjZFLAorICAgIDB4MzQ3RSwgMHg5RjZGLCAweDM0N0YsIDB4OUY3MCwgMHgzNDdELCAweDlGNzEsIDB4MzQ3QywgMHg5RjcyLCAweDE3NDEsCisgICAgMHg5Rjc0LCAweDM0QzYsIDB4OUY3NSwgMHgzNEM3LCAweDlGNzYsIDB4MzRDOCwgMHg5Rjc3LCAweDE3NDAsIDB4OUY3OCwKKyAgICAweDM1MDEsIDB4OUY3OSwgMHgzNTA0LCAweDlGN0EsIDB4MzUwMywgMHg5RjdCLCAweDM1MDIsIDB4OUY3RSwgMHgzNTRCLAorICAgIDB4OUY4RCwgMHgxM0IyLCAweDlGOTAsIDB4MTU3QywgMHg5RjkxLCAweDMyQzQsIDB4OUY5MiwgMHgzMzc2LCAweDlGOTQsCisgICAgMHgxNkY1LCAweDlGOTUsIDB4MzQwQywgMHg5Rjk4LCAweDM1NEQsIDB4OUY5QywgMHgxM0IzLCAweDlGQTAsIDB4MkYwRCwKKyAgICAweDlGQTIsIDB4MzQwRCwgMHg5RkE0LCAweDM1MUEsIDB4RTAxRiwgMHgwODNBLCAweEUwMjYsIDB4MDlGRCwgMHhFMDVCLAorICAgIDB4MDMwRCwgMHhFMDYzLCAweDAxNkIsIDB4RTA3MywgMHgwODYwLCAweEUwRjMsIDB4MEMyMywgMHhFMTJFLCAweDE3RTQsCisgICAgMHhFMTQ5LCAweDIxMkYsIDB4RTE5MSwgMHgxMTVGLCAweEUxQkEsIDB4MEM3OSwgMHhFMUM5LCAweDA0QzMsIDB4RTIyQywKKyAgICAweDE4QkQsIDB4RTIyRCwgMHgwQ0JELCAweEUyMzAsIDB4MENBNSwgMHhFMjY2LCAweDBDQ0UsIDB4RTJBMywgMHgwRTg0LAorICAgIDB4RTJCQywgMHgwMTIwLCAweEUyRUYsIDB4MUJBOCwgMHhFMzNBLCAweDEwNTUsIDB4RTM0MCwgMHgyREU4LCAweEUzNEYsCisgICAgMHgwMTIxLCAweEUzNUEsIDB4MTA2QiwgMHhFMzYzLCAweDEzMjYsIDB4RTM3QywgMHgwNjZCLCAweEUzN0YsIDB4MTMyRSwKKyAgICAweEUzQzUsIDB4MEQzNSwgMHhFM0Q3LCAweDI3QzIsIDB4RTNEQywgMHgyMkFELCAweEU0MTcsIDB4MTM0QywgMHhFNDRBLAorICAgIDB4MDlDRSwgMHhFNDc4LCAweDBCQzcsIDB4RTQ4NSwgMHgzNkU5LCAweEU0QzUsIDB4MTM5MSwgMHhFNERBLCAweDE2QTQsCisgICAgMHhFNTQ1LCAweDMwNzIsIDB4RTVEMiwgMHgwMTE5LCAweEU1RDMsIDB4MDExQSwgMHhFNUQ0LCAweDAxMUMsIDB4RTVENSwKKyAgICAweDAxMUIsIDB4RTVGNCwgMHgyOTdDLCAweEU2QzYsIDB4MUQwNiwgMHhFNzI3LCAweDI5QTEsIDB4RTdEMywgMHgxODFCLAorICAgIDB4RTg5MywgMHgyQjI0LCAweEVCNDAsIDB4MkY1MCwgMHhFQjQyLCAweDE3MjUsIDB4RUI0NSwgMHgzMkVELCAweEVCNkUsCisgICAgMHgyQUQ5LCAweEVCODYsIDB4MUMxNCwgMHhFQjlFLCAweDEyRTksIDB4RUJBOSwgMHgyQ0FFLCAweEVCQkEsIDB4MUE2NCwKKyAgICAweEVCQzksIDB4MTQwNCwgMHhFQkNGLCAweDIzMjQsIDB4RUJEMiwgMHgzNDZBLCAweEVCREUsIDB4MjI5MSwgMHhFQzAxLAorICAgIDB4MTc4NywgMHhFQzAyLCAweDA5NUYsIDB4RUMxNSwgMHgxRTk5LCAweEVDNUIsIDB4MjVDMSwgMHhFQzVFLCAweDBEMEMsCisgICAgMHhFQ0E2LCAweDA1RTYsIDB4RUQyOCwgMHgwNzI4LCAweEVENkUsIDB4MjRCNiwgMHhFRDdDLCAweDE4MDYsIDB4RUQ5RSwKKyAgICAweDM1MTEsIDB4RURFNywgMHgwRjgyLCAweEVFNTIsIDB4MDVGMiwgMHhFRTk4LCAweDI0N0QsIDB4RjZCMSwgMHgwMUZBLAorICAgIDB4RjZCMiwgMHgwMUZCLCAweEY2QjMsIDB4MDFGQywgMHhGNkI0LCAweDAxRkQsIDB4RjZCNSwgMHgwMUZFLCAweEY2QjYsCisgICAgMHgwMUZGLCAweEY2QjcsIDB4MDIwMCwgMHhGNkI4LCAweDAyMDEsIDB4RjZCOSwgMHgwMjAyLCAweEY2QkEsIDB4MDIwMywKKyAgICAweEY2QkIsIDB4MDIwNCwgMHhGNkJDLCAweDAyMDUsIDB4RjZCRCwgMHgwMjA2LCAweEY2QkUsIDB4MDIwNywgMHhGNkJGLAorICAgIDB4MDIwOCwgMHhGNkMwLCAweDAyMDksIDB4RjZDMSwgMHgwMjBBLCAweEY2QzIsIDB4MDIwQiwgMHhGNkMzLCAweDAyMEMsCisgICAgMHhGNkM0LCAweDAyMEQsIDB4RjZDNSwgMHgwMjBFLCAweEY2QzYsIDB4MDIwRiwgMHhGNkM3LCAweDAyMTAsIDB4RjZDOCwKKyAgICAweDAyMTEsIDB4RjZDOSwgMHgwMjEyLCAweEY2Q0EsIDB4MDIxMywgMHhGNkNCLCAweDAyMTQsIDB4RjZDQywgMHgwMjE1LAorICAgIDB4RjZDRCwgMHgwMjE2LCAweEY2Q0UsIDB4MDIxNywgMHhGNkNGLCAweDAyMTksIDB4RjZEMCwgMHgwMjFBLCAweEY2RDEsCisgICAgMHgwMjFCLCAweEY2RDIsIDB4MDIxQywgMHhGNkQzLCAweDAyMUQsIDB4RjZENCwgMHgwMjFFLCAweEY2RDUsIDB4MDIxRiwKKyAgICAweEY2RDYsIDB4MDIyMCwgMHhGNkQ3LCAweDAyMjEsIDB4RjZEOCwgMHgwMjIyLCAweEY2RDksIDB4MDIyMywgMHhGNkRBLAorICAgIDB4MDIyNCwgMHhGNkRCLCAweDAyMjUsIDB4RjZEQywgMHgwMjI2LCAweEY2REQsIDB4MDIyNywgMHhGNkRFLCAweDAyMjgsCisgICAgMHhGNkUwLCAweDAyMkEsIDB4RjZFMSwgMHgwMjJCLCAweEY2RTIsIDB4MDIyQywgMHhGNkU0LCAweDAyMkUsIDB4RjZFNiwKKyAgICAweDAyMzAsIDB4RjZFOCwgMHgzNUIzLCAweEY2RTksIDB4MzVCNCwgMHhGNkVBLCAweDM1QjUsIDB4RjZFQiwgMHgzNUI2LAorICAgIDB4RjZFQywgMHgzNUI3LCAweEY2RUQsIDB4MzVCOCwgMHhGNkYwLCAweDM1QkEsIDB4RjZGMSwgMHgzNUJCLCAweEY2RjIsCisgICAgMHgzNUJDLCAweEY2RjMsIDB4MzVCRCwgMHhGNkY0LCAweDM1QkUsIDB4RjZGNSwgMHgzNUJGLCAweEY2RjYsIDB4MzVDMCwKKyAgICAweEY2RjcsIDB4MzVDMSwgMHhGNkY4LCAweDM1QzIsIDB4RjZGOSwgMHgzNUMzLCAweEY2RkEsIDB4MzVDNCwgMHhGNkZCLAorICAgIDB4MzVDNSwgMHhGNkZDLCAweDM1QzYsIDB4RjZGRCwgMHgzNUM3LCAweEY2RkUsIDB4MzVDOCwgMHhGNkZGLCAweDM1QzksCisgICAgMHhGNzAwLCAweDM1Q0EsIDB4RjcwMSwgMHgzNUNCLCAweEY3MDIsIDB4MzVDQywgMHhGNzAzLCAweDM1Q0QsIDB4RjcwNCwKKyAgICAweDM1Q0UsIDB4RjcwNSwgMHgzNUNGLCAweEY3MDYsIDB4MzVEMCwgMHhGNzA3LCAweDM1RDEsIDB4RjcwOCwgMHgzNUQyLAorICAgIDB4RjcwOSwgMHgzNUQzLCAweEY3MEEsIDB4MzVENCwgMHhGNzBCLCAweDM1RDUsIDB4RjcwQywgMHgzNUQ2LCAweEY3MEQsCisgICAgMHgzNUQ3LCAweEY3MEUsIDB4MzVEOCwgMHhGNzBGLCAweDM1RDksIDB4RjcxMCwgMHgzNURBLCAweEY3MTEsIDB4MzVEQiwKKyAgICAweEY3MTIsIDB4MzVEQywgMHhGNzEzLCAweDM1REQsIDB4RjcxNCwgMHgzNURFLCAweEY3MTUsIDB4MzVERiwgMHhGNzE2LAorICAgIDB4MzVFMCwgMHhGNzE3LCAweDM1RTEsIDB4RjcxOCwgMHgzNUUyLCAweEY3MTksIDB4MzVFMywgMHhGNzFBLCAweDM1RTQsCisgICAgMHhGNzFCLCAweDM1RTUsIDB4RjcxQywgMHgzNUU2LCAweEY3MUQsIDB4MzVFNywgMHhGNzFFLCAweDM1RTgsIDB4RjcxRiwKKyAgICAweDM1RTksIDB4RjcyMCwgMHgzNUVBLCAweEY3MjEsIDB4MzVFQiwgMHhGNzIyLCAweDM1RUMsIDB4RjcyMywgMHgzNUVELAorICAgIDB4RjcyNCwgMHgzNUVFLCAweEY3MjUsIDB4MzVFRiwgMHhGNzI2LCAweDM1RjAsIDB4RjcyNywgMHgzNUYxLCAweEY3MjgsCisgICAgMHgzNUYyLCAweEY3MjksIDB4MzVGMywgMHhGNzJBLCAweDM1RjQsIDB4RjcyQiwgMHgzNUY1LCAweEY3MkMsIDB4MzVGNiwKKyAgICAweEY3MkQsIDB4MzVGNywgMHhGNzJFLCAweDM1RjgsIDB4RjcyRiwgMHgzNUY5LCAweEY3MzAsIDB4MzVGQSwgMHhGNzMxLAorICAgIDB4MzVGQiwgMHhGNzMyLCAweDM1RkMsIDB4RjczMywgMHgzNUZELCAweEY3MzQsIDB4MzVGRSwgMHhGNzM1LCAweDM1RkYsCisgICAgMHhGNzM2LCAweDM2MDAsIDB4RjczNywgMHgzNjAxLCAweEY3MzgsIDB4MzYwMiwgMHhGNzM5LCAweDM2MDMsIDB4RjczQSwKKyAgICAweDM2MDQsIDB4RjczQiwgMHgzNjA1LCAweEY3M0MsIDB4MzYwNiwgMHhGNzNELCAweDM2MDcsIDB4RjczRSwgMHgzNjA4LAorICAgIDB4RjczRiwgMHgzNjA5LCAweEY3NDAsIDB4MzYwQSwgMHhGNzQxLCAweDM2MEIsIDB4Rjc0MiwgMHgzNjBDLCAweEY3NDMsCisgICAgMHgzNjBELCAweEY3NDQsIDB4MzYwRSwgMHhGNzQ1LCAweDM2MEYsIDB4Rjc0NiwgMHgzNjEwLCAweEY3NDcsIDB4MzYxMSwKKyAgICAweEY3NDgsIDB4MzYxMiwgMHhGNzQ5LCAweDM2MTMsIDB4Rjc0QSwgMHgzNjE0LCAweEY3NEIsIDB4MzYxNSwgMHhGNzRDLAorICAgIDB4MzYxNiwgMHhGNzRELCAweDM2MTcsIDB4Rjc0RSwgMHgzNjE4LCAweEY3NEYsIDB4MzYxOSwgMHhGNzUwLCAweDM2MUEsCisgICAgMHhGNzUxLCAweDM2MUIsIDB4Rjc1MiwgMHgzNjFDLCAweEY3NTMsIDB4MzYxRCwgMHhGNzU0LCAweDM2MUUsIDB4Rjc1NSwKKyAgICAweDM2MUYsIDB4Rjc1NiwgMHgzNjIwLCAweEY3NTcsIDB4MzYyMSwgMHhGNzU4LCAweDM2MjIsIDB4Rjc1OSwgMHgzNjIzLAorICAgIDB4Rjc1QSwgMHgzNjI0LCAweEY3NUIsIDB4MzYyNSwgMHhGNzVDLCAweDM2MjYsIDB4Rjc1RCwgMHgzNjI3LCAweEY3NUUsCisgICAgMHgzNjI4LCAweEY3NUYsIDB4MzYyOSwgMHhGNzYwLCAweDM2MkEsIDB4Rjc2MSwgMHgzNjJCLCAweEY3NjIsIDB4MzYyQywKKyAgICAweEY3NjMsIDB4MzYyRCwgMHhGNzY0LCAweDM2MkUsIDB4Rjc2NSwgMHgzNjJGLCAweEY3NjYsIDB4MzYzMCwgMHhGNzY3LAorICAgIDB4MzYzMSwgMHhGNzY4LCAweDM2MzIsIDB4Rjc2OSwgMHgzNjMzLCAweEY3NkEsIDB4MzYzNCwgMHhGNzZCLCAweDM2MzUsCisgICAgMHhGNzZDLCAweDM2MzYsIDB4Rjc2RCwgMHgzNjM3LCAweEY3NkUsIDB4MzYzOCwgMHhGNzZGLCAweDM2MzksIDB4Rjc3MCwKKyAgICAweDM2M0EsIDB4Rjc3MSwgMHgzNjNCLCAweEY3NzIsIDB4MzYzQywgMHhGNzczLCAweDM2M0QsIDB4Rjc3NCwgMHgzNjNFLAorICAgIDB4Rjc3NSwgMHgzNjNGLCAweEY3NzYsIDB4MzY0MCwgMHhGNzc3LCAweDM2NDEsIDB4Rjc3OCwgMHgzNjQyLCAweEY3NzksCisgICAgMHgzNjQzLCAweEY3N0EsIDB4MzY0NCwgMHhGNzdCLCAweDM2NDUsIDB4Rjc3QywgMHgzNjQ2LCAweEY3N0QsIDB4MzY0NywKKyAgICAweEY3N0UsIDB4MzY0OCwgMHhGNzdGLCAweDM2NDksIDB4Rjc4MCwgMHgzNjRBLCAweEY3ODEsIDB4MzY0QiwgMHhGNzgyLAorICAgIDB4MzY0QywgMHhGNzgzLCAweDM2NEQsIDB4Rjc4NCwgMHgzNjRFLCAweEY3ODUsIDB4MzY0RiwgMHhGNzg2LCAweDM2NTAsCisgICAgMHhGNzg3LCAweDM2NTEsIDB4Rjc4OCwgMHgzNjUyLCAweEY3ODksIDB4MzY1MywgMHhGNzhBLCAweDM2NTQsIDB4Rjc4QiwKKyAgICAweDM2NTUsIDB4Rjc4QywgMHgzNjU2LCAweEY3OEQsIDB4MzY1NywgMHhGNzhFLCAweDM2NTgsIDB4Rjc4RiwgMHgzNjU5LAorICAgIDB4Rjc5MCwgMHgzNjVBLCAweEY3OTEsIDB4MzY1QiwgMHhGNzkyLCAweDM2NUMsIDB4Rjc5MywgMHgzNjVELCAweEY3OTQsCisgICAgMHgzNjVFLCAweEY3OTUsIDB4MzY1RiwgMHhGNzk2LCAweDM2NjAsIDB4Rjc5NywgMHgzNjYxLCAweEY3OTgsIDB4MzY2MiwKKyAgICAweEY3OTksIDB4MzY2MywgMHhGNzlBLCAweDM2NjQsIDB4Rjc5QiwgMHgzNjY1LCAweEY3OUMsIDB4MzY2NiwgMHhGNzlELAorICAgIDB4MzY2NywgMHhGNzlFLCAweDM2NjgsIDB4Rjc5RiwgMHgzNjY5LCAweEY3QTAsIDB4MzY2QSwgMHhGN0ExLCAweDM2NkIsCisgICAgMHhGN0EyLCAweDM2NkMsIDB4RjdBMywgMHgzNjZELCAweEY3QTQsIDB4MzY2RSwgMHhGN0E1LCAweDM2NkYsIDB4RjdBNiwKKyAgICAweDM2NzAsIDB4RjdBNywgMHgzNjcxLCAweEY3QTgsIDB4MzY3MiwgMHhGN0E5LCAweDM2NzMsIDB4RjdBQSwgMHgzNjc0LAorICAgIDB4RjdBQiwgMHgzNjc1LCAweEY3QUMsIDB4MzY3NiwgMHhGN0FELCAweDM2NzcsIDB4RjdBRSwgMHgzNjc4LCAweEY3QUYsCisgICAgMHgzNjc5LCAweEY3QjAsIDB4MzY3QSwgMHhGN0IxLCAweDM2N0IsIDB4RjdCMiwgMHgzNjdDLCAweEY3QjMsIDB4MzY3RCwKKyAgICAweEY3QjQsIDB4MzY3RSwgMHhGN0I1LCAweDM2N0YsIDB4RjdCNiwgMHgzNjgwLCAweEY3QjcsIDB4MzY4MSwgMHhGN0I4LAorICAgIDB4MzY4MiwgMHhGN0I5LCAweDM2ODMsIDB4RjdCQSwgMHgzNjg0LCAweEY3QkIsIDB4MzY4NSwgMHhGN0JDLCAweDM2ODYsCisgICAgMHhGN0JELCAweDM2ODcsIDB4RjdCRSwgMHgzNjg4LCAweEY3QkYsIDB4MzY4OSwgMHhGN0MwLCAweDM2OEEsIDB4RjdDMSwKKyAgICAweDM2OEIsIDB4RjdDMiwgMHgzNjhDLCAweEY3QzMsIDB4MzY4RCwgMHhGN0M0LCAweDM2OEUsIDB4RjdDNSwgMHgzNjhGLAorICAgIDB4RjdDNiwgMHgzNjkwLCAweEY3QzcsIDB4MzY5MSwgMHhGN0M4LCAweDM2OTIsIDB4RjdDOSwgMHgzNjkzLCAweEY3Q0EsCisgICAgMHgzNjk0LCAweEY3Q0IsIDB4MzY5NSwgMHhGN0NDLCAweDM2OTYsIDB4RjdDRCwgMHgzNjk3LCAweEY3Q0UsIDB4MzY5OCwKKyAgICAweEY3Q0YsIDB4MzY5OSwgMHhGN0QwLCAweDM2OUEsIDB4RjdEMSwgMHgzNjlCLCAweEY3RDIsIDB4MzY5QywgMHhGN0QzLAorICAgIDB4MzY5RCwgMHhGN0Q0LCAweDM2OUUsIDB4RjdENSwgMHgzNjlGLCAweEY3RDYsIDB4MzZBMCwgMHhGN0Q3LCAweDM2QTEsCisgICAgMHhGN0Q4LCAweDM2QTIsIDB4RjdEOSwgMHgzNkEzLCAweEY3REEsIDB4MzZBNCwgMHhGN0RCLCAweDM2QTUsIDB4RjdEQywKKyAgICAweDM2QTYsIDB4RjdERCwgMHgzNkE3LCAweEY3REUsIDB4MzZBOCwgMHhGN0RGLCAweDM2QTksIDB4RjdFMCwgMHgzNkFBLAorICAgIDB4RjdFMSwgMHgzNkFCLCAweEY3RTIsIDB4MzZBQywgMHhGN0UzLCAweDM2QUQsIDB4RjdFNCwgMHgzNkFFLCAweEY3RTUsCisgICAgMHgzNkFGLCAweEY3RTYsIDB4MzZCMCwgMHhGN0U3LCAweDM2QjEsIDB4RjdFOCwgMHgzNkIyLCAweEY3RTksIDB4MzZCMywKKyAgICAweEY3RUEsIDB4MzZCNCwgMHhGN0VCLCAweDM2QjUsIDB4RjdFQywgMHgzNkI2LCAweEY3RUQsIDB4MzZCNywgMHhGN0VFLAorICAgIDB4MzZCOCwgMHhGODE3LCAweDM2RTEsIDB4RjgxOCwgMHgzNkUyLCAweEY4MTksIDB4MzZFMywgMHhGODFBLCAweDM2RTQsCisgICAgMHhGODFCLCAweDM2RTUsIDB4RjgxQywgMHgzNkU2LCAweEY4MUQsIDB4MzZFNywgMHhGQTBDLCAweDAyNzQsIDB4RkEwRCwKKyAgICAweDIzODEsIDB4RkUzMCwgMHgwMDZELCAweEZFMzEsIDB4MDA3QSwgMHhGRTMzLCAweDM1QUYsIDB4RkUzNCwgMHgzNUIxLAorICAgIDB4RkUzNSwgMHgwMDgyLCAweEZFMzYsIDB4MDA4MywgMHhGRTM3LCAweDAwODYsIDB4RkUzOCwgMHgwMDg3LCAweEZFMzksCisgICAgMHgwMDhBLCAweEZFM0EsIDB4MDA4QiwgMHhGRTNCLCAweDAwOEUsIDB4RkUzQywgMHgwMDhGLCAweEZFM0QsIDB4MDA5MiwKKyAgICAweEZFM0UsIDB4MDA5MywgMHhGRTNGLCAweDAwOTYsIDB4RkU0MCwgMHgwMDk3LCAweEZFNDEsIDB4MDA5QSwgMHhGRTQyLAorICAgIDB4MDA5QiwgMHhGRTQzLCAweDAwOUUsIDB4RkU0NCwgMHgwMDlGLCAweEZFNDksIDB4MDBDNywgMHhGRTRBLCAweDAwQzgsCisgICAgMHhGRTRCLCAweDAwQ0IsIDB4RkU0QywgMHgwMENDLCAweEZFNEQsIDB4MDBDOSwgMHhGRTRFLCAweDAwQ0EsIDB4RkU0RiwKKyAgICAweDM1QjIsIDB4RkU1MCwgMHgwMDcwLCAweEZFNTEsIDB4MDA3MSwgMHhGRTUyLCAweDAwNzIsIDB4RkU1NCwgMHgwMDc0LAorICAgIDB4RkU1NSwgMHgwMDc1LCAweEZFNTYsIDB4MDA3NiwgMHhGRTU3LCAweDAwNzcsIDB4RkU1OSwgMHgwMEEwLCAweEZFNUEsCisgICAgMHgwMEExLCAweEZFNUIsIDB4MDBBMiwgMHhGRTVDLCAweDAwQTMsIDB4RkU1RCwgMHgwMEE0LCAweEZFNUUsIDB4MDBBNSwKKyAgICAweEZFNUYsIDB4MDBDRCwgMHhGRTYwLCAweDAwQ0UsIDB4RkU2MSwgMHgwMENGLCAweEZFNjIsIDB4MDBERiwgMHhGRTYzLAorICAgIDB4MDBFMCwgMHhGRTY0LCAweDAwRTEsIDB4RkU2NSwgMHgwMEUyLCAweEZFNjYsIDB4MDBFMywgMHhGRTY4LCAweDAxMDIsCisgICAgMHhGRTY5LCAweDAxMEMsIDB4RkU2QSwgMHgwMTBELCAweEZFNkIsIDB4MDEwRSwgMHhGRjAxLCAweDAwNkMsIDB4RkYwMiwKKyAgICAweDM2RTQsIDB4RkYwMywgMHgwMEFFLCAweEZGMDQsIDB4MDEwMywgMHhGRjA1LCAweDAxMDgsIDB4RkYwNiwgMHgwMEFGLAorICAgIDB4RkYwNywgMHgzNkUzLCAweEZGMDgsIDB4MDA4MCwgMHhGRjA5LCAweDAwODEsIDB4RkYwQSwgMHgwMEIwLCAweEZGMEIsCisgICAgMHgwMEQwLCAweEZGMEMsIDB4MDA2NCwgMHhGRjBELCAweDAwRDEsIDB4RkYwRSwgMHgwMDY3LCAweEZGMEYsIDB4MDEwMSwKKyAgICAweEZGMTAsIDB4MDE0RCwgMHhGRjExLCAweDAxNEUsIDB4RkYxMiwgMHgwMTRGLCAweEZGMTMsIDB4MDE1MCwgMHhGRjE0LAorICAgIDB4MDE1MSwgMHhGRjE1LCAweDAxNTIsIDB4RkYxNiwgMHgwMTUzLCAweEZGMTcsIDB4MDE1NCwgMHhGRjE4LCAweDAxNTUsCisgICAgMHhGRjE5LCAweDAxNTYsIDB4RkYxQSwgMHgwMDZBLCAweEZGMUIsIDB4MDA2OSwgMHhGRjFDLCAweDAwRDYsIDB4RkYxRCwKKyAgICAweDAwRDgsIDB4RkYxRSwgMHgwMEQ3LCAweEZGMUYsIDB4MDA2QiwgMHhGRjIwLCAweDAxMDksIDB4RkYyMSwgMHgwMTZELAorICAgIDB4RkYyMiwgMHgwMTZFLCAweEZGMjMsIDB4MDE2RiwgMHhGRjI0LCAweDAxNzAsIDB4RkYyNSwgMHgwMTcxLCAweEZGMjYsCisgICAgMHgwMTcyLCAweEZGMjcsIDB4MDE3MywgMHhGRjI4LCAweDAxNzQsIDB4RkYyOSwgMHgwMTc1LCAweEZGMkEsIDB4MDE3NiwKKyAgICAweEZGMkIsIDB4MDE3NywgMHhGRjJDLCAweDAxNzgsIDB4RkYyRCwgMHgwMTc5LCAweEZGMkUsIDB4MDE3QSwgMHhGRjJGLAorICAgIDB4MDE3QiwgMHhGRjMwLCAweDAxN0MsIDB4RkYzMSwgMHgwMTdELCAweEZGMzIsIDB4MDE3RSwgMHhGRjMzLCAweDAxN0YsCisgICAgMHhGRjM0LCAweDAxODAsIDB4RkYzNSwgMHgwMTgxLCAweEZGMzYsIDB4MDE4MiwgMHhGRjM3LCAweDAxODMsIDB4RkYzOCwKKyAgICAweDAxODQsIDB4RkYzOSwgMHgwMTg1LCAweEZGM0EsIDB4MDE4NiwgMHhGRjNCLCAweDM1QkUsIDB4RkYzQywgMHgwMTAyLAorICAgIDB4RkYzRCwgMHgzNUJGLCAweEZGM0UsIDB4MzVCNCwgMHhGRjNGLCAweDAwQzUsIDB4RkY0MSwgMHgwMTg3LCAweEZGNDIsCisgICAgMHgwMTg4LCAweEZGNDMsIDB4MDE4OSwgMHhGRjQ0LCAweDAxOEEsIDB4RkY0NSwgMHgwMThCLCAweEZGNDYsIDB4MDE4QywKKyAgICAweEZGNDcsIDB4MDE4RCwgMHhGRjQ4LCAweDAxOEUsIDB4RkY0OSwgMHgwMThGLCAweEZGNEEsIDB4MDE5MCwgMHhGRjRCLAorICAgIDB4MDE5MSwgMHhGRjRDLCAweDAxOTIsIDB4RkY0RCwgMHgwMTkzLCAweEZGNEUsIDB4MDE5NCwgMHhGRjRGLCAweDAxOTUsCisgICAgMHhGRjUwLCAweDAxOTYsIDB4RkY1MSwgMHgwMTk3LCAweEZGNTIsIDB4MDE5OCwgMHhGRjUzLCAweDAxOTksIDB4RkY1NCwKKyAgICAweDAxOUEsIDB4RkY1NSwgMHgwMTlCLCAweEZGNTYsIDB4MDE5QywgMHhGRjU3LCAweDAxOUQsIDB4RkY1OCwgMHgwMTlFLAorICAgIDB4RkY1OSwgMHgwMTlGLCAweEZGNUEsIDB4MDFBMCwgMHhGRjVCLCAweDAwODQsIDB4RkY1QywgMHgwMDc4LCAweEZGNUQsCisgICAgMHgwMDg1LCAweEZGNUUsIDB4MDBFNCwgMHhGRjY0LCAweDAwNzEsIDB4RkZFMCwgMHgwMTA2LCAweEZGRTEsIDB4MDEwNywKKyAgICAweEZGRTIsIDB4MzZFMSwgMHhGRkUzLCAweDAwQzQsIDB4RkZFNCwgMHgzNkUyLCAweEZGRTUsIDB4MDEwNCwKIH07CiAKIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pQ05TX1VURjE2X0hfMF9EV29yZFszICogM10gPSB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9jbWFwc19jbnMxLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL2NtYXBzX2NuczEuY3BwCmluZGV4IDE1ZDNhODMuLjk0NjE3YTQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL2NtYXBzX2NuczEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL2NtYXBzX2NuczEuY3BwCkBAIC0xMiwyNyArMTIsNDQgQEAKICNpbmNsdWRlICJjbWFwc19jbnMxLmgiCiAKIHN0YXRpYyBjb25zdCBGWENNQVBfQ01hcCBnX0ZYQ01BUF9DTlMxX2NtYXBzW10gPSB7Ci0gICAgeyAiQjVwYy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9CNXBjX0hfMCwgMjQ3LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIkI1cGMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQjVwY19WXzAsIDEyLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJIS3Njcy1CNS1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9IS3Njc19CNV9IXzUsIDEyMTAsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwIH0sCi0gICAgeyAiSEtzY3MtQjUtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfSEtzY3NfQjVfVl81LCAxMywgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiRVRlbi1CNS1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9FVGVuX0I1X0hfMCwgMjU0LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIkVUZW4tQjUtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVRlbl9CNV9WXzAsIDEzLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJFVGVubXMtQjUtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVRlbm1zX0I1X0hfMCwgMSwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0yIH0sCi0gICAgeyAiRVRlbm1zLUI1LVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0VUZW5tc19CNV9WXzAsIDE4LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJDTlMtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0NOU19FVUNfSF8wLCAxNTcsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQ05TX0VVQ19IXzBfRFdvcmQsIDIzOCwgMCB9LAotICAgIHsgIkNOUy1FVUMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQ05TX0VVQ19WXzAsIDE4MCwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9DTlNfRVVDX1ZfMF9EV29yZCwgMjYxLCAwIH0sCi0gICAgeyAiVW5pQ05TLVVDUzItSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pQ05TX1VDUzJfSF8zLCAxNjQxOCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJVbmlDTlMtVUNTMi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlDTlNfVUNTMl9WXzMsIDEzLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJVbmlDTlMtVVRGMTYtSCIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUNOU19VVEYxNl9IXzAsIDE0NTU3LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIlVuaUNOUy1VVEYxNi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlDTlNfVUNTMl9WXzMsIDEzLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKKyAgICB7IkI1cGMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQjVwY19IXzAsIDI0NywgRlhDTUFQX0NNYXA6Ok5vbmUsCisgICAgIE5VTEwsIDAsIDB9LAorICAgIHsiQjVwYy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9CNXBjX1ZfMCwgMTIsIEZYQ01BUF9DTWFwOjpOb25lLAorICAgICBOVUxMLCAwLCAtMX0sCisgICAgeyJIS3Njcy1CNS1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9IS3Njc19CNV9IXzUsIDEyMTAsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IkhLc2NzLUI1LVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0hLc2NzX0I1X1ZfNSwgMTMsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJFVGVuLUI1LUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0VUZW5fQjVfSF8wLCAyNTQsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IkVUZW4tQjUtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVRlbl9CNV9WXzAsIDEzLAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAorICAgIHsiRVRlbm1zLUI1LUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0VUZW5tc19CNV9IXzAsIDEsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMn0sCisgICAgeyJFVGVubXMtQjUtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVRlbm1zX0I1X1ZfMCwgMTgsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJDTlMtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0NOU19FVUNfSF8wLCAxNTcsCisgICAgIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQ05TX0VVQ19IXzBfRFdvcmQsIDIzOCwgMH0sCisgICAgeyJDTlMtRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0NOU19FVUNfVl8wLCAxODAsCisgICAgIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQ05TX0VVQ19WXzBfRFdvcmQsIDI2MSwgMH0sCisgICAgeyJVbmlDTlMtVUNTMi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlDTlNfVUNTMl9IXzMsIDE2NDE4LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMH0sCisgICAgeyJVbmlDTlMtVUNTMi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlDTlNfVUNTMl9WXzMsIDEzLAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAorICAgIHsiVW5pQ05TLVVURjE2LUgiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlDTlNfVVRGMTZfSF8wLCAxNDU1NywKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDB9LAorICAgIHsiVW5pQ05TLVVURjE2LVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUNOU19VQ1MyX1ZfMywgMTMsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCiB9OwogCi12b2lkIENQREZfTW9kdWxlTWdyOjpMb2FkRW1iZWRkZWRDTlMxQ01hcHMoKQotewotICAgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOwotICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9DTlMxXS5tX3BNYXBMaXN0ID0gZ19GWENNQVBfQ05TMV9jbWFwczsKLSAgICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfQ05TMV0ubV9Db3VudCA9IEZYX0FycmF5U2l6ZShnX0ZYQ01BUF9DTlMxX2NtYXBzKTsKLSAgICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9DTlMxXS5tX3BNYXAgPSBnX0ZYQ01BUF9DTlMxQ0lEMlVuaWNvZGVfNTsKLSAgICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9DTlMxXS5tX0NvdW50ID0gMTkwODg7Cit2b2lkIENQREZfTW9kdWxlTWdyOjpMb2FkRW1iZWRkZWRDTlMxQ01hcHMoKSB7CisgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9CisgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKTsKKyAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0NOUzFdLm1fcE1hcExpc3QgPQorICAgICAgZ19GWENNQVBfQ05TMV9jbWFwczsKKyAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0NOUzFdLm1fQ291bnQgPQorICAgICAgRlhfQXJyYXlTaXplKGdfRlhDTUFQX0NOUzFfY21hcHMpOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9DTlMxXS5tX3BNYXAgPQorICAgICAgZ19GWENNQVBfQ05TMUNJRDJVbmljb2RlXzU7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0NOUzFdLm1fQ291bnQgPSAxOTA4ODsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvQWRvYmUtR0IxLVVDUzJfNS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0Fkb2JlLUdCMS1VQ1MyXzUuY3BwCmluZGV4IDkyY2VjOGYuLmMzZDY3ZWEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvQWRvYmUtR0IxLVVDUzJfNS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9BZG9iZS1HQjEtVUNTMl81LmNwcApAQCAtNywzNzkwICs3LDMzNjkgQEAKICNpbmNsdWRlICJjbWFwc19nYjEuaCIKIAogY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9HQjFDSUQyVW5pY29kZV81WzMwMjg0XSA9IHsKLSAgICAweEZGRkQsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwKLSAgICAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwKLSAgICAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwKLSAgICAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwKLSAgICAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwKLSAgICAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwKLSAgICAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwKLSAgICAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsIDB4MDA1RSwKLSAgICAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwKLSAgICAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwKLSAgICAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwKLSAgICAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwKLSAgICAweDMwMDAsIDB4MzAwMSwgMHgzMDAyLCAweDAwQjcsIDB4MDJDOSwgMHgwMkM3LCAweDAwQTgsIDB4MzAwMywKLSAgICAweDMwMDUsIDB4MjAxNCwgMHhGRjVFLCAweDIwMTYsIDB4MjAyNiwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywKLSAgICAweDIwMUQsIDB4MzAxNCwgMHgzMDE1LCAweDMwMDgsIDB4MzAwOSwgMHgzMDBBLCAweDMwMEIsIDB4MzAwQywKLSAgICAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLCAweDMwMTYsIDB4MzAxNywgMHgzMDEwLCAweDMwMTEsIDB4MDBCMSwKLSAgICAweDAwRDcsIDB4MDBGNywgMHgyMjM2LCAweDIyMjcsIDB4MjIyOCwgMHgyMjExLCAweDIyMEYsIDB4MjIyQSwKLSAgICAweDIyMjksIDB4MjIwOCwgMHgyMjM3LCAweDIyMUEsIDB4MjJBNSwgMHgyMjI1LCAweDIyMjAsIDB4MjMxMiwKLSAgICAweDIyOTksIDB4MjIyQiwgMHgyMjJFLCAweDIyNjEsIDB4MjI0QywgMHgyMjQ4LCAweDIyM0QsIDB4MjIxRCwKLSAgICAweDIyNjAsIDB4MjI2RSwgMHgyMjZGLCAweDIyNjQsIDB4MjI2NSwgMHgyMjFFLCAweDIyMzUsIDB4MjIzNCwKLSAgICAweDI2NDIsIDB4MjY0MCwgMHgwMEIwLCAweDIwMzIsIDB4MjAzMywgMHgyMTAzLCAweEZGMDQsIDB4MDBBNCwKLSAgICAweEZGRTAsIDB4RkZFMSwgMHgyMDMwLCAweDAwQTcsIDB4MjExNiwgMHgyNjA2LCAweDI2MDUsIDB4MjVDQiwKLSAgICAweDI1Q0YsIDB4MjVDRSwgMHgyNUM3LCAweDI1QzYsIDB4MjVBMSwgMHgyNUEwLCAweDI1QjMsIDB4MjVCMiwKLSAgICAweDIwM0IsIDB4MjE5MiwgMHgyMTkwLCAweDIxOTEsIDB4MjE5MywgMHgzMDEzLCAweDI0ODgsIDB4MjQ4OSwKLSAgICAweDI0OEEsIDB4MjQ4QiwgMHgyNDhDLCAweDI0OEQsIDB4MjQ4RSwgMHgyNDhGLCAweDI0OTAsIDB4MjQ5MSwKLSAgICAweDI0OTIsIDB4MjQ5MywgMHgyNDk0LCAweDI0OTUsIDB4MjQ5NiwgMHgyNDk3LCAweDI0OTgsIDB4MjQ5OSwKLSAgICAweDI0OUEsIDB4MjQ5QiwgMHgyNDc0LCAweDI0NzUsIDB4MjQ3NiwgMHgyNDc3LCAweDI0NzgsIDB4MjQ3OSwKLSAgICAweDI0N0EsIDB4MjQ3QiwgMHgyNDdDLCAweDI0N0QsIDB4MjQ3RSwgMHgyNDdGLCAweDI0ODAsIDB4MjQ4MSwKLSAgICAweDI0ODIsIDB4MjQ4MywgMHgyNDg0LCAweDI0ODUsIDB4MjQ4NiwgMHgyNDg3LCAweDI0NjAsIDB4MjQ2MSwKLSAgICAweDI0NjIsIDB4MjQ2MywgMHgyNDY0LCAweDI0NjUsIDB4MjQ2NiwgMHgyNDY3LCAweDI0NjgsIDB4MjQ2OSwKLSAgICAweDMyMjAsIDB4MzIyMSwgMHgzMjIyLCAweDMyMjMsIDB4MzIyNCwgMHgzMjI1LCAweDMyMjYsIDB4MzIyNywKLSAgICAweDMyMjgsIDB4MzIyOSwgMHgyMTYwLCAweDIxNjEsIDB4MjE2MiwgMHgyMTYzLCAweDIxNjQsIDB4MjE2NSwKLSAgICAweDIxNjYsIDB4MjE2NywgMHgyMTY4LCAweDIxNjksIDB4MjE2QSwgMHgyMTZCLCAweEZGMDEsIDB4RkYwMiwKLSAgICAweEZGMDMsIDB4RkZFNSwgMHhGRjA1LCAweEZGMDYsIDB4RkYwNywgMHhGRjA4LCAweEZGMDksIDB4RkYwQSwKLSAgICAweEZGMEIsIDB4RkYwQywgMHhGRjBELCAweEZGMEUsIDB4RkYwRiwgMHhGRjEwLCAweEZGMTEsIDB4RkYxMiwKLSAgICAweEZGMTMsIDB4RkYxNCwgMHhGRjE1LCAweEZGMTYsIDB4RkYxNywgMHhGRjE4LCAweEZGMTksIDB4RkYxQSwKLSAgICAweEZGMUIsIDB4RkYxQywgMHhGRjFELCAweEZGMUUsIDB4RkYxRiwgMHhGRjIwLCAweEZGMjEsIDB4RkYyMiwKLSAgICAweEZGMjMsIDB4RkYyNCwgMHhGRjI1LCAweEZGMjYsIDB4RkYyNywgMHhGRjI4LCAweEZGMjksIDB4RkYyQSwKLSAgICAweEZGMkIsIDB4RkYyQywgMHhGRjJELCAweEZGMkUsIDB4RkYyRiwgMHhGRjMwLCAweEZGMzEsIDB4RkYzMiwKLSAgICAweEZGMzMsIDB4RkYzNCwgMHhGRjM1LCAweEZGMzYsIDB4RkYzNywgMHhGRjM4LCAweEZGMzksIDB4RkYzQSwKLSAgICAweEZGM0IsIDB4RkYzQywgMHhGRjNELCAweEZGM0UsIDB4RkYzRiwgMHhGRjQwLCAweEZGNDEsIDB4RkY0MiwKLSAgICAweEZGNDMsIDB4RkY0NCwgMHhGRjQ1LCAweEZGNDYsIDB4RkY0NywgMHhGRjQ4LCAweEZGNDksIDB4RkY0QSwKLSAgICAweEZGNEIsIDB4RkY0QywgMHhGRjRELCAweEZGNEUsIDB4RkY0RiwgMHhGRjUwLCAweEZGNTEsIDB4RkY1MiwKLSAgICAweEZGNTMsIDB4RkY1NCwgMHhGRjU1LCAweEZGNTYsIDB4RkY1NywgMHhGRjU4LCAweEZGNTksIDB4RkY1QSwKLSAgICAweEZGNUIsIDB4RkY1QywgMHhGRjVELCAweEZGRTMsIDB4MzA0MSwgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwKLSAgICAweDMwNDUsIDB4MzA0NiwgMHgzMDQ3LCAweDMwNDgsIDB4MzA0OSwgMHgzMDRBLCAweDMwNEIsIDB4MzA0QywKLSAgICAweDMwNEQsIDB4MzA0RSwgMHgzMDRGLCAweDMwNTAsIDB4MzA1MSwgMHgzMDUyLCAweDMwNTMsIDB4MzA1NCwKLSAgICAweDMwNTUsIDB4MzA1NiwgMHgzMDU3LCAweDMwNTgsIDB4MzA1OSwgMHgzMDVBLCAweDMwNUIsIDB4MzA1QywKLSAgICAweDMwNUQsIDB4MzA1RSwgMHgzMDVGLCAweDMwNjAsIDB4MzA2MSwgMHgzMDYyLCAweDMwNjMsIDB4MzA2NCwKLSAgICAweDMwNjUsIDB4MzA2NiwgMHgzMDY3LCAweDMwNjgsIDB4MzA2OSwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywKLSAgICAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLCAweDMwNzAsIDB4MzA3MSwgMHgzMDcyLCAweDMwNzMsIDB4MzA3NCwKLSAgICAweDMwNzUsIDB4MzA3NiwgMHgzMDc3LCAweDMwNzgsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0IsIDB4MzA3QywKLSAgICAweDMwN0QsIDB4MzA3RSwgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODMsIDB4MzA4NCwKLSAgICAweDMwODUsIDB4MzA4NiwgMHgzMDg3LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLCAweDMwOEIsIDB4MzA4QywKLSAgICAweDMwOEQsIDB4MzA4RSwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMSwKLSAgICAweDMwQTIsIDB4MzBBMywgMHgzMEE0LCAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LCAweDMwQTgsIDB4MzBBOSwKLSAgICAweDMwQUEsIDB4MzBBQiwgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsIDB4MzBCMSwKLSAgICAweDMwQjIsIDB4MzBCMywgMHgzMEI0LCAweDMwQjUsIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwKLSAgICAweDMwQkEsIDB4MzBCQiwgMHgzMEJDLCAweDMwQkQsIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwKLSAgICAweDMwQzIsIDB4MzBDMywgMHgzMEM0LCAweDMwQzUsIDB4MzBDNiwgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwKLSAgICAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDAsIDB4MzBEMSwKLSAgICAweDMwRDIsIDB4MzBEMywgMHgzMEQ0LCAweDMwRDUsIDB4MzBENiwgMHgzMEQ3LCAweDMwRDgsIDB4MzBEOSwKLSAgICAweDMwREEsIDB4MzBEQiwgMHgzMERDLCAweDMwREQsIDB4MzBERSwgMHgzMERGLCAweDMwRTAsIDB4MzBFMSwKLSAgICAweDMwRTIsIDB4MzBFMywgMHgzMEU0LCAweDMwRTUsIDB4MzBFNiwgMHgzMEU3LCAweDMwRTgsIDB4MzBFOSwKLSAgICAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRSwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwKLSAgICAweDMwRjIsIDB4MzBGMywgMHgzMEY0LCAweDMwRjUsIDB4MzBGNiwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywKLSAgICAweDAzOTQsIDB4MDM5NSwgMHgwMzk2LCAweDAzOTcsIDB4MDM5OCwgMHgwMzk5LCAweDAzOUEsIDB4MDM5QiwKLSAgICAweDAzOUMsIDB4MDM5RCwgMHgwMzlFLCAweDAzOUYsIDB4MDNBMCwgMHgwM0ExLCAweDAzQTMsIDB4MDNBNCwKLSAgICAweDAzQTUsIDB4MDNBNiwgMHgwM0E3LCAweDAzQTgsIDB4MDNBOSwgMHgwM0IxLCAweDAzQjIsIDB4MDNCMywKLSAgICAweDAzQjQsIDB4MDNCNSwgMHgwM0I2LCAweDAzQjcsIDB4MDNCOCwgMHgwM0I5LCAweDAzQkEsIDB4MDNCQiwKLSAgICAweDAzQkMsIDB4MDNCRCwgMHgwM0JFLCAweDAzQkYsIDB4MDNDMCwgMHgwM0MxLCAweDAzQzMsIDB4MDNDNCwKLSAgICAweDAzQzUsIDB4MDNDNiwgMHgwM0M3LCAweDAzQzgsIDB4MDNDOSwgMHhGRjBDLCAweDMwMDIsIDB4MzAwMSwKLSAgICAweEZGMUEsIDB4RkYxQiwgMHhGRjAxLCAweEZGMUYsIDB4RkUzNSwgMHhGRTM2LCAweEZFMzksIDB4RkUzQSwKLSAgICAweEZFM0YsIDB4RkU0MCwgMHhGRTNELCAweEZFM0UsIDB4RkU0MSwgMHhGRTQyLCAweEZFNDMsIDB4RkU0NCwKLSAgICAweDMwMTYsIDB4MzAxNywgMHhGRTNCLCAweEZFM0MsIDB4RkUzNywgMHhGRTM4LCAweEZFMzEsIDB4MjAyNiwKLSAgICAweEZFMzMsIDB4RkUzNCwgMHgwNDEwLCAweDA0MTEsIDB4MDQxMiwgMHgwNDEzLCAweDA0MTQsIDB4MDQxNSwKLSAgICAweDA0MDEsIDB4MDQxNiwgMHgwNDE3LCAweDA0MTgsIDB4MDQxOSwgMHgwNDFBLCAweDA0MUIsIDB4MDQxQywKLSAgICAweDA0MUQsIDB4MDQxRSwgMHgwNDFGLCAweDA0MjAsIDB4MDQyMSwgMHgwNDIyLCAweDA0MjMsIDB4MDQyNCwKLSAgICAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LCAweDA0MjgsIDB4MDQyOSwgMHgwNDJBLCAweDA0MkIsIDB4MDQyQywKLSAgICAweDA0MkQsIDB4MDQyRSwgMHgwNDJGLCAweDA0MzAsIDB4MDQzMSwgMHgwNDMyLCAweDA0MzMsIDB4MDQzNCwKLSAgICAweDA0MzUsIDB4MDQ1MSwgMHgwNDM2LCAweDA0MzcsIDB4MDQzOCwgMHgwNDM5LCAweDA0M0EsIDB4MDQzQiwKLSAgICAweDA0M0MsIDB4MDQzRCwgMHgwNDNFLCAweDA0M0YsIDB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywKLSAgICAweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsIDB4MDQ0OCwgMHgwNDQ5LCAweDA0NEEsIDB4MDQ0QiwKLSAgICAweDA0NEMsIDB4MDQ0RCwgMHgwNDRFLCAweDA0NEYsIDB4MDEwMSwgMHgwMEUxLCAweDAxQ0UsIDB4MDBFMCwKLSAgICAweDAxMTMsIDB4MDBFOSwgMHgwMTFCLCAweDAwRTgsIDB4MDEyQiwgMHgwMEVELCAweDAxRDAsIDB4MDBFQywKLSAgICAweDAxNEQsIDB4MDBGMywgMHgwMUQyLCAweDAwRjIsIDB4MDE2QiwgMHgwMEZBLCAweDAxRDQsIDB4MDBGOSwKLSAgICAweDAxRDYsIDB4MDFEOCwgMHgwMURBLCAweDAxREMsIDB4MDBGQywgMHgwMEVBLCAweDAyNTEsIDB4MUUzRiwKLSAgICAweDAxNDQsIDB4MDE0OCwgMHgwMUY5LCAweDAyNjEsIDB4MzEwNSwgMHgzMTA2LCAweDMxMDcsIDB4MzEwOCwKLSAgICAweDMxMDksIDB4MzEwQSwgMHgzMTBCLCAweDMxMEMsIDB4MzEwRCwgMHgzMTBFLCAweDMxMEYsIDB4MzExMCwKLSAgICAweDMxMTEsIDB4MzExMiwgMHgzMTEzLCAweDMxMTQsIDB4MzExNSwgMHgzMTE2LCAweDMxMTcsIDB4MzExOCwKLSAgICAweDMxMTksIDB4MzExQSwgMHgzMTFCLCAweDMxMUMsIDB4MzExRCwgMHgzMTFFLCAweDMxMUYsIDB4MzEyMCwKLSAgICAweDMxMjEsIDB4MzEyMiwgMHgzMTIzLCAweDMxMjQsIDB4MzEyNSwgMHgzMTI2LCAweDMxMjcsIDB4MzEyOCwKLSAgICAweDMxMjksIDB4RTdDRCwgMHgyNTAwLCAweDI1MDEsIDB4MjUwMiwgMHgyNTAzLCAweDI1MDQsIDB4MjUwNSwKLSAgICAweDI1MDYsIDB4MjUwNywgMHgyNTA4LCAweDI1MDksIDB4MjUwQSwgMHgyNTBCLCAweDI1MEMsIDB4MjUwRCwKLSAgICAweDI1MEUsIDB4MjUwRiwgMHgyNTEwLCAweDI1MTEsIDB4MjUxMiwgMHgyNTEzLCAweDI1MTQsIDB4MjUxNSwKLSAgICAweDI1MTYsIDB4MjUxNywgMHgyNTE4LCAweDI1MTksIDB4MjUxQSwgMHgyNTFCLCAweDI1MUMsIDB4MjUxRCwKLSAgICAweDI1MUUsIDB4MjUxRiwgMHgyNTIwLCAweDI1MjEsIDB4MjUyMiwgMHgyNTIzLCAweDI1MjQsIDB4MjUyNSwKLSAgICAweDI1MjYsIDB4MjUyNywgMHgyNTI4LCAweDI1MjksIDB4MjUyQSwgMHgyNTJCLCAweDI1MkMsIDB4MjUyRCwKLSAgICAweDI1MkUsIDB4MjUyRiwgMHgyNTMwLCAweDI1MzEsIDB4MjUzMiwgMHgyNTMzLCAweDI1MzQsIDB4MjUzNSwKLSAgICAweDI1MzYsIDB4MjUzNywgMHgyNTM4LCAweDI1MzksIDB4MjUzQSwgMHgyNTNCLCAweDI1M0MsIDB4MjUzRCwKLSAgICAweDI1M0UsIDB4MjUzRiwgMHgyNTQwLCAweDI1NDEsIDB4MjU0MiwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwKLSAgICAweDI1NDYsIDB4MjU0NywgMHgyNTQ4LCAweDI1NDksIDB4MjU0QSwgMHgyNTRCLCAweDAwMjEsIDB4MDAyMiwKLSAgICAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwKLSAgICAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwKLSAgICAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwKLSAgICAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwKLSAgICAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwKLSAgICAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwKLSAgICAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwKLSAgICAweDAwNUIsIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwKLSAgICAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwKLSAgICAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwKLSAgICAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwKLSAgICAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsIDB4MDEwMSwgMHgwMEUxLCAweDAxQ0UsIDB4MDBFMCwKLSAgICAweDAxMTMsIDB4MDBFOSwgMHgwMTFCLCAweDAwRTgsIDB4MDEyQiwgMHgwMEVELCAweDAxRDAsIDB4MDBFQywKLSAgICAweDAxNEQsIDB4MDBGMywgMHgwMUQyLCAweDAwRjIsIDB4MDE2QiwgMHgwMEZBLCAweDAxRDQsIDB4MDBGOSwKLSAgICAweDAxRDYsIDB4MDFEOCwgMHgwMURBLCAweDAxREMsIDB4MDBGQywgMHgwMEVBLCAweDAyNTEsIDB4MUUzRiwKLSAgICAweDAxNDQsIDB4MDE0OCwgMHgwMUY5LCAweDAyNjEsIDB4NTU0QSwgMHg5NjNGLCAweDU3QzMsIDB4NjMyOCwKLSAgICAweDU0Q0UsIDB4NTUwOSwgMHg1NEMwLCAweDc2OTEsIDB4NzY0QywgMHg4NTNDLCAweDc3RUUsIDB4ODI3RSwKLSAgICAweDc4OEQsIDB4NzIzMSwgMHg5Njk4LCAweDk3OEQsIDB4NkMyOCwgMHg1Qjg5LCAweDRGRkEsIDB4NjMwOSwKLSAgICAweDY2OTcsIDB4NUNCOCwgMHg4MEZBLCAweDY4NDgsIDB4ODBBRSwgMHg2NjAyLCAweDc2Q0UsIDB4NTFGOSwKLSAgICAweDY1NTYsIDB4NzFBQywgMHg3RkYxLCAweDg4ODQsIDB4NTBCMiwgMHg1OTY1LCAweDYxQ0EsIDB4NkZCMywKLSAgICAweDgyQUQsIDB4NjM0QywgMHg2MjUyLCAweDUzRUQsIDB4NTQyNywgMHg3QjA2LCAweDUxNkIsIDB4NzVBNCwKLSAgICAweDVERjQsIDB4NjJENCwgMHg4RENCLCAweDk3NzYsIDB4NjI4QSwgMHg4MDE5LCAweDU3NUQsIDB4OTczOCwKLSAgICAweDdGNjIsIDB4NzIzOCwgMHg3NjdELCAweDY3Q0YsIDB4NzY3RSwgMHg2NDQ2LCAweDRGNzAsIDB4OEQyNSwKLSAgICAweDYyREMsIDB4N0ExNywgMHg2NTkxLCAweDczRUQsIDB4NjQyQywgMHg2MjczLCAweDgyMkMsIDB4OTg4MSwKLSAgICAweDY3N0YsIDB4NzI0OCwgMHg2MjZFLCAweDYyQ0MsIDB4NEYzNCwgMHg3NEUzLCAweDUzNEEsIDB4NTI5RSwKLSAgICAweDdFQ0EsIDB4OTBBNiwgMHg1RTJFLCAweDY4ODYsIDB4Njk5QywgMHg4MTgwLCAweDdFRDEsIDB4NjhEMiwKLSAgICAweDc4QzUsIDB4ODY4QywgMHg5NTUxLCAweDUwOEQsIDB4OEMyNCwgMHg4MkRFLCAweDgwREUsIDB4NTMwNSwKLSAgICAweDg5MTIsIDB4NTI2NSwgMHg4NTg0LCAweDk2RjksIDB4NEZERCwgMHg1ODIxLCAweDk5NzEsIDB4NUI5RCwKLSAgICAweDYyQjEsIDB4NjJBNSwgMHg2NkI0LCAweDhDNzksIDB4OUM4RCwgMHg3MjA2LCAweDY3NkYsIDB4Nzg5MSwKLSAgICAweDYwQjIsIDB4NTM1MSwgMHg1MzE3LCAweDhGODgsIDB4ODBDQywgMHg4RDFELCAweDk0QTEsIDB4NTAwRCwKLSAgICAweDcyQzgsIDB4NTkwNywgMHg2MEVCLCAweDcxMTksIDB4ODhBQiwgMHg1OTU0LCAweDgyRUYsIDB4NjcyQywKLSAgICAweDdCMjgsIDB4NUQyOSwgMHg3RUY3LCAweDc1MkQsIDB4NkNGNSwgMHg4RTY2LCAweDhGRjgsIDB4OTAzQywKLSAgICAweDlGM0IsIDB4NkJENCwgMHg5MTE5LCAweDdCMTQsIDB4NUY3QywgMHg3OEE3LCAweDg0RDYsIDB4ODUzRCwKLSAgICAweDZCRDUsIDB4NkJEOSwgMHg2QkQ2LCAweDVFMDEsIDB4NUU4NywgMHg3NUY5LCAweDk1RUQsIDB4NjU1RCwKLSAgICAweDVGMEEsIDB4NUZDNSwgMHg4RjlGLCAweDU4QzEsIDB4ODFDMiwgMHg5MDdGLCAweDk2NUIsIDB4OTdBRCwKLSAgICAweDhGQjksIDB4N0YxNiwgMHg4RDJDLCAweDYyNDEsIDB4NEZCRiwgMHg1M0Q4LCAweDUzNUUsIDB4OEZBOCwKLSAgICAweDhGQTksIDB4OEZBQiwgMHg5MDRELCAweDY4MDcsIDB4NUY2QSwgMHg4MTk4LCAweDg4NjgsIDB4OUNENiwKLSAgICAweDYxOEIsIDB4NTIyQiwgMHg3NjJBLCAweDVGNkMsIDB4NjU4QywgMHg2RkQyLCAweDZFRTgsIDB4NUJCRSwKLSAgICAweDY0NDgsIDB4NTE3NSwgMHg1MUIwLCAweDY3QzQsIDB4NEUxOSwgMHg3OUM5LCAweDk5N0MsIDB4NzBCMywKLSAgICAweDc1QzUsIDB4NUU3NiwgMHg3M0JCLCAweDgzRTAsIDB4NjRBRCwgMHg2MkU4LCAweDk0QjUsIDB4NkNFMiwKLSAgICAweDUzNUEsIDB4NTJDMywgMHg2NDBGLCAweDk0QzIsIDB4N0I5NCwgMHg0RjJGLCAweDVFMUIsIDB4ODIzNiwKLSAgICAweDgxMTYsIDB4ODE4QSwgMHg2RTI0LCAweDZDQ0EsIDB4OUE3MywgMHg2MzU1LCAweDUzNUMsIDB4NTRGQSwKLSAgICAweDg4NjUsIDB4NTdFMCwgMHg0RTBELCAweDVFMDMsIDB4NkI2NSwgMHg3QzNGLCAweDkwRTgsIDB4NjAxNiwKLSAgICAweDY0RTYsIDB4NzMxQywgMHg4OEMxLCAweDY3NTAsIDB4NjI0RCwgMHg4RDIyLCAweDc3NkMsIDB4OEUyOSwKLSAgICAweDkxQzcsIDB4NUY2OSwgMHg4M0RDLCAweDg1MjEsIDB4OTkxMCwgMHg1M0MyLCAweDg2OTUsIDB4NkI4QiwKLSAgICAweDYwRUQsIDB4NjBFOCwgMHg3MDdGLCAweDgyQ0QsIDB4ODIzMSwgMHg0RUQzLCAweDZDQTcsIDB4ODVDRiwKLSAgICAweDY0Q0QsIDB4N0NEOSwgMHg2OUZELCAweDY2RjksIDB4ODM0OSwgMHg1Mzk1LCAweDdCNTYsIDB4NEZBNywKLSAgICAweDUxOEMsIDB4NkQ0QiwgMHg1QzQyLCAweDhFNkQsIDB4NjNEMiwgMHg1M0M5LCAweDgzMkMsIDB4ODMzNiwKLSAgICAweDY3RTUsIDB4NzhCNCwgMHg2NDNELCAweDVCREYsIDB4NUM5NCwgMHg1REVFLCAweDhCRTcsIDB4NjJDNiwKLSAgICAweDY3RjQsIDB4OEM3QSwgMHg2NDAwLCAweDYzQkEsIDB4ODc0OSwgMHg5OThCLCAweDhDMTcsIDB4N0YyMCwKLSAgICAweDk0RjIsIDB4NEVBNywgMHg5NjEwLCAweDk4QTQsIDB4NjYwQywgMHg3MzE2LCAweDU3M0EsIDB4NUMxRCwKLSAgICAweDVFMzgsIDB4OTU3RiwgMHg1MDdGLCAweDgwQTAsIDB4NTM4MiwgMHg2NTVFLCAweDc1NDUsIDB4NTUzMSwKLSAgICAweDUwMjEsIDB4OEQ4NSwgMHg2Mjg0LCAweDk0OUUsIDB4NjcxRCwgMHg1NjMyLCAweDZGNkUsIDB4NURFMiwKLSAgICAweDU0MzUsIDB4NzA5MiwgMHg4RjY2LCAweDYyNkYsIDB4NjRBNCwgMHg2M0EzLCAweDVGN0IsIDB4NkY4OCwKLSAgICAweDkwRjQsIDB4ODFFMywgMHg4RkIwLCAweDVDMTgsIDB4NjY2OCwgMHg1RkYxLCAweDZDODksIDB4OTY0OCwKLSAgICAweDhEODEsIDB4ODg2QywgMHg2NDkxLCAweDc5RjAsIDB4NTdDRSwgMHg2QTU5LCAweDYyMTAsIDB4NTQ0OCwKLSAgICAweDRFNTgsIDB4N0EwQiwgMHg2MEU5LCAweDZGODQsIDB4OEJEQSwgMHg2MjdGLCAweDkwMUUsIDB4OUE4QiwKLSAgICAweDc5RTQsIDB4NTQwMywgMHg3NUY0LCAweDYzMDEsIDB4NTMxOSwgMHg2QzYwLCAweDhGREYsIDB4NUYxQiwKLSAgICAweDlBNzAsIDB4ODAzQiwgMHg5RjdGLCAweDRGODgsIDB4NUMzQSwgMHg4RDY0LCAweDdGQzUsIDB4NjVBNSwKLSAgICAweDcwQkQsIDB4NTE0NSwgMHg1MUIyLCAweDg2NkIsIDB4NUQwNywgMHg1QkEwLCAweDYyQkQsIDB4OTE2QywKLSAgICAweDc1NzQsIDB4OEUwQywgMHg3QTIwLCAweDYxMDEsIDB4N0I3OSwgMHg0RUM3LCAweDdFRjgsIDB4Nzc4NSwKLSAgICAweDRFMTEsIDB4ODFFRCwgMHg1MjFELCAweDUxRkEsIDB4NkE3MSwgMHg1M0E4LCAweDhFODcsIDB4OTUwNCwKLSAgICAweDk2Q0YsIDB4NkVDMSwgMHg5NjY0LCAweDY5NUEsIDB4Nzg0MCwgMHg1MEE4LCAweDc3RDcsIDB4NjQxMCwKLSAgICAweDg5RTYsIDB4NTkwNCwgMHg2M0UzLCAweDVEREQsIDB4N0E3RiwgMHg2OTNELCAweDRGMjAsIDB4ODIzOSwKLSAgICAweDU1OTgsIDB4NEUzMiwgMHg3NUFFLCAweDdBOTcsIDB4NUU2MiwgMHg1RThBLCAweDk1RUYsIDB4NTIxQiwKLSAgICAweDU0MzksIDB4NzA4QSwgMHg2Mzc2LCAweDk1MjQsIDB4NTc4MiwgMHg2NjI1LCAweDY5M0YsIDB4OTE4NywKLSAgICAweDU1MDcsIDB4NkRGMywgMHg3RUFGLCAweDg4MjIsIDB4NjIzMywgMHg3RUYwLCAweDc1QjUsIDB4ODMyOCwKLSAgICAweDc4QzEsIDB4OTZDQywgMHg4RjlFLCAweDYxNDgsIDB4NzRGNywgMHg4QkNELCAweDZCNjQsIDB4NTIzQSwKLSAgICAweDhENTAsIDB4NkIyMSwgMHg4MDZBLCAweDg0NzEsIDB4NTZGMSwgMHg1MzA2LCAweDRFQ0UsIDB4NEUxQiwKLSAgICAweDUxRDEsIDB4N0M5NywgMHg5MThCLCAweDdDMDcsIDB4NEZDMywgMHg4RTdGLCAweDdCRTEsIDB4N0E5QywKLSAgICAweDY0NjcsIDB4NUQxNCwgMHg1MEFDLCAweDgxMDYsIDB4NzYwMSwgMHg3Q0I5LCAweDZERUMsIDB4N0ZFMCwKLSAgICAweDY3NTEsIDB4NUI1OCwgMHg1QkY4LCAweDc4Q0IsIDB4NjRBRSwgMHg2NDEzLCAweDYzQUEsIDB4NjMyQiwKLSAgICAweDk1MTksIDB4NjQyRCwgMHg4RkJFLCAweDdCNTQsIDB4NzYyOSwgMHg2MjUzLCAweDU5MjcsIDB4NTQ0NiwKLSAgICAweDZCNzksIDB4NTBBMywgMHg2MjM0LCAweDVFMjYsIDB4NkI4NiwgMHg0RUUzLCAweDhEMzcsIDB4ODg4QiwKLSAgICAweDVGODUsIDB4OTAyRSwgMHg2MDIwLCAweDgwM0QsIDB4NjJDNSwgMHg0RTM5LCAweDUzNTUsIDB4OTBGOCwKLSAgICAweDYzQjgsIDB4ODBDNiwgMHg2NUU2LCAweDZDMkUsIDB4NEY0NiwgMHg2MEVFLCAweDZERTEsIDB4OEJERSwKLSAgICAweDVGMzksIDB4ODZDQiwgMHg1RjUzLCAweDYzMjEsIDB4NTE1QSwgMHg4MzYxLCAweDY4NjMsIDB4NTIwMCwKLSAgICAweDYzNjMsIDB4OEU0OCwgMHg1MDEyLCAweDVDOUIsIDB4Nzk3NywgMHg1QkZDLCAweDUyMzAsIDB4N0EzQiwKLSAgICAweDYwQkMsIDB4OTA1MywgMHg3NkQ3LCAweDVGQjcsIDB4NUY5NywgMHg3Njg0LCAweDhFNkMsIDB4NzA2RiwKLSAgICAweDc2N0IsIDB4N0I0OSwgMHg3N0FBLCAweDUxRjMsIDB4OTA5MywgMHg1ODI0LCAweDRGNEUsIDB4NkVGNCwKLSAgICAweDhGRUEsIDB4NjU0QywgMHg3QjFCLCAweDcyQzQsIDB4NkRBNCwgMHg3RkRGLCAweDVBRTEsIDB4NjJCNSwKLSAgICAweDVFOTUsIDB4NTczMCwgMHg4NDgyLCAweDdCMkMsIDB4NUUxRCwgMHg1RjFGLCAweDkwMTIsIDB4N0YxNCwKLSAgICAweDk4QTAsIDB4NjM4MiwgMHg2RUM3LCAweDc4OTgsIDB4NzBCOSwgMHg1MTc4LCAweDk3NUIsIDB4NTdBQiwKLSAgICAweDc1MzUsIDB4NEY0MywgMHg3NTM4LCAweDVFOTcsIDB4NjBFNiwgMHg1OTYwLCAweDZEQzAsIDB4NkJCRiwKLSAgICAweDc4ODksIDB4NTNGQywgMHg5NkQ1LCAweDUxQ0IsIDB4NTIwMSwgMHg2Mzg5LCAweDU0MEEsIDB4OTQ5MywKLSAgICAweDhDMDMsIDB4OERDQywgMHg3MjM5LCAweDc4OUYsIDB4ODc3NiwgMHg4RkVELCAweDhDMEQsIDB4NTNFMCwKLSAgICAweDRFMDEsIDB4NzZFRiwgMHg1M0VFLCAweDk0ODksIDB4OTg3NiwgMHg5RjBFLCAweDk1MkQsIDB4NUI5QSwKLSAgICAweDhCQTIsIDB4NEUyMiwgMHg0RTFDLCAweDUxQUMsIDB4ODQ2MywgMHg2MUMyLCAweDUyQTgsIDB4NjgwQiwKLSAgICAweDRGOTcsIDB4NjA2QiwgMHg1MUJCLCAweDZEMUUsIDB4NTE1QywgMHg2Mjk2LCAweDY1OTcsIDB4OTY2MSwKLSAgICAweDhDNDYsIDB4OTAxNywgMHg3NUQ4LCAweDkwRkQsIDB4Nzc2MywgMHg2QkQyLCAweDcyOEEsIDB4NzJFQywKLSAgICAweDhCRkIsIDB4NTgzNSwgMHg3Nzc5LCAweDhENEMsIDB4Njc1QywgMHg5NTQwLCAweDgwOUEsIDB4NUVBNiwKLSAgICAweDZFMjEsIDB4NTk5MiwgMHg3QUVGLCAweDc3RUQsIDB4OTUzQiwgMHg2QkI1LCAweDY1QUQsIDB4N0YwRSwKLSAgICAweDU4MDYsIDB4NTE1MSwgMHg5NjFGLCAweDVCRjksIDB4NThBOSwgMHg1NDI4LCAweDhFNzIsIDB4NjU2NiwKLSAgICAweDk4N0YsIDB4NTZFNCwgMHg5NDlELCAweDc2RkUsIDB4OTA0MSwgMHg2Mzg3LCAweDU0QzYsIDB4NTkxQSwKLSAgICAweDU5M0EsIDB4NTc5QiwgMHg4RUIyLCAweDY3MzUsIDB4OERGQSwgMHg4MjM1LCAweDUyNDEsIDB4NjBGMCwKLSAgICAweDU4MTUsIDB4ODZGRSwgMHg1Q0U4LCAweDlFNDUsIDB4NEZDNCwgMHg5ODlELCAweDhCQjksIDB4NUEyNSwKLSAgICAweDYwNzYsIDB4NTM4NCwgMHg2MjdDLCAweDkwNEYsIDB4OTEwMiwgMHg5OTdGLCAweDYwNjksIDB4ODAwQywKLSAgICAweDUxM0YsIDB4ODAzMywgMHg1QzE0LCAweDk5NzUsIDB4NkQzMSwgMHg0RThDLCAweDhEMzAsIDB4NTNEMSwKLSAgICAweDdGNUEsIDB4N0I0RiwgMHg0RjEwLCAweDRFNEYsIDB4OTYwMCwgMHg2Q0Q1LCAweDczRDAsIDB4ODVFOSwKLSAgICAweDVFMDYsIDB4NzU2QSwgMHg3RkZCLCAweDZBMEEsIDB4NzdGRSwgMHg5NDkyLCAweDdFNDEsIDB4NTFFMSwKLSAgICAweDcwRTYsIDB4NTNDRCwgMHg4RkQ0LCAweDgzMDMsIDB4OEQyOSwgMHg3MkFGLCAweDk5NkQsIDB4NkNEQiwKLSAgICAweDU3NEEsIDB4ODJCMywgMHg2NUI5LCAweDgwQUEsIDB4NjIzRiwgMHg5NjMyLCAweDU5QTgsIDB4NEVGRiwKLSAgICAweDhCQkYsIDB4N0VCQSwgMHg2NTNFLCAweDgzRjIsIDB4OTc1RSwgMHg1NTYxLCAweDk4REUsIDB4ODBBNSwKLSAgICAweDUzMkEsIDB4OEJGRCwgMHg1NDIwLCAweDgwQkEsIDB4NUU5RiwgMHg2Q0I4LCAweDhEMzksIDB4ODJBQywKLSAgICAweDkxNUEsIDB4NTQyOSwgMHg2QzFCLCAweDUyMDYsIDB4N0VCNywgMHg1NzVGLCAweDcxMUEsIDB4NkM3RSwKLSAgICAweDdDODksIDB4NTk0QiwgMHg0RUZELCAweDVGRkYsIDB4NjEyNCwgMHg3Q0FBLCAweDRFMzAsIDB4NUMwMSwKLSAgICAweDY3QUIsIDB4ODcwMiwgMHg1Q0YwLCAweDk1MEIsIDB4OThDRSwgMHg3NUFGLCAweDcwRkQsIDB4OTAyMiwKLSAgICAweDUxQUYsIDB4N0YxRCwgMHg4QkJELCAweDU5NDksIDB4NTFFNCwgMHg0RjVCLCAweDU0MjYsIDB4NTkyQiwKLSAgICAweDY1NzcsIDB4ODBBNCwgMHg1Qjc1LCAweDYyNzYsIDB4NjJDMiwgMHg4RjkwLCAweDVFNDUsIDB4NkMxRiwKLSAgICAweDdCMjYsIDB4NEYwRiwgMHg0RkQ4LCAweDY3MEQsIDB4NkQ2RSwgMHg2REFBLCAweDc5OEYsIDB4ODhCMSwKLSAgICAweDVGMTcsIDB4NzUyQiwgMHg2MjlBLCAweDhGODUsIDB4NEZFRiwgMHg5MURDLCAweDY1QTcsIDB4ODEyRiwKLSAgICAweDgxNTEsIDB4NUU5QywgMHg4MTUwLCAweDhENzQsIDB4NTI2RiwgMHg4OTg2LCAweDhENEIsIDB4NTkwRCwKLSAgICAweDUwODUsIDB4NEVEOCwgMHg5NjFDLCAweDcyMzYsIDB4ODE3OSwgMHg4RDFGLCAweDVCQ0MsIDB4OEJBMywKLSAgICAweDk2NDQsIDB4NTk4NywgMHg3RjFBLCAweDU0OTAsIDB4NTY3NiwgMHg1NjBFLCAweDhCRTUsIDB4NjUzOSwKLSAgICAweDY5ODIsIDB4OTQ5OSwgMHg3NkQ2LCAweDZFODksIDB4NUU3MiwgMHg3NTE4LCAweDY3NDYsIDB4NjdEMSwKLSAgICAweDdBRkYsIDB4ODA5RCwgMHg4RDc2LCAweDYxMUYsIDB4NzlDNiwgMHg2NTYyLCAweDhENjMsIDB4NTE4OCwKLSAgICAweDUyMUEsIDB4OTRBMiwgMHg3RjM4LCAweDgwOUIsIDB4N0VCMiwgMHg1Qzk3LCAweDZFMkYsIDB4Njc2MCwKLSAgICAweDdCRDksIDB4NzY4QiwgMHg5QUQ4LCAweDgxOEYsIDB4N0Y5NCwgMHg3Q0Q1LCAweDY0MUUsIDB4OTU1MCwKLSAgICAweDdBM0YsIDB4NTQ0QSwgMHg1NEU1LCAweDZCNEMsIDB4NjQwMSwgMHg2MjA4LCAweDlFM0QsIDB4ODBGMywKLSAgICAweDc1OTksIDB4NTI3MiwgMHg5NzY5LCAweDg0NUIsIDB4NjgzQywgMHg4NkU0LCAweDk2MDEsIDB4OTY5NCwKLSAgICAweDk0RUMsIDB4NEUyQSwgMHg1NDA0LCAweDdFRDksIDB4NjgzOSwgMHg4RERGLCAweDgwMTUsIDB4NjZGNCwKLSAgICAweDVFOUEsIDB4N0ZCOSwgMHg1N0MyLCAweDgwM0YsIDB4Njg5NywgMHg1REU1LCAweDY1M0IsIDB4NTI5RiwKLSAgICAweDYwNkQsIDB4OUY5QSwgMHg0RjlCLCAweDhFQUMsIDB4NTE2QywgMHg1QkFCLCAweDVGMTMsIDB4NURFOSwKLSAgICAweDZDNUUsIDB4NjJGMSwgMHg4RDIxLCAweDUxNzEsIDB4OTRBOSwgMHg1MkZFLCAweDZDOUYsIDB4ODJERiwKLSAgICAweDcyRDcsIDB4NTdBMiwgMHg2Nzg0LCAweDhEMkQsIDB4NTkxRiwgMHg4RjlDLCAweDgzQzcsIDB4NTQ5NSwKLSAgICAweDdCOEQsIDB4NEYzMCwgMHg2Q0JELCAweDVCNjQsIDB4NTlEMSwgMHg5RjEzLCAweDUzRTQsIDB4ODZDQSwKLSAgICAweDlBQTgsIDB4OEMzNywgMHg4MEExLCAweDY1NDUsIDB4OTg3RSwgMHg1NkZBLCAweDk2QzcsIDB4NTIyRSwKLSAgICAweDc0REMsIDB4NTI1MCwgMHg1QkUxLCAweDYzMDIsIDB4ODkwMiwgMHg0RTU2LCAweDYyRDAsIDB4NjAyQSwKLSAgICAweDY4RkEsIDB4NTE3MywgMHg1Qjk4LCAweDUxQTAsIDB4ODlDMiwgMHg3QkExLCAweDk5ODYsIDB4N0Y1MCwKLSAgICAweDYwRUYsIDB4NzA0QywgMHg4RDJGLCAweDUxNDksIDB4NUU3RiwgMHg5MDFCLCAweDc0NzAsIDB4ODlDNCwKLSAgICAweDU3MkQsIDB4Nzg0NSwgMHg1RjUyLCAweDlGOUYsIDB4OTVGQSwgMHg4RjY4LCAweDlCM0MsIDB4OEJFMSwKLSAgICAweDc2NzgsIDB4Njg0MiwgMHg2N0RDLCAweDhERUEsIDB4OEQzNSwgMHg1MjNELCAweDhGOEEsIDB4NkVEQSwKLSAgICAweDY4Q0QsIDB4OTUwNSwgMHg5MEVELCAweDU2RkQsIDB4Njc5QywgMHg4OEY5LCAweDhGQzcsIDB4NTRDOCwKLSAgICAweDlBQjgsIDB4NUI2OSwgMHg2RDc3LCAweDZDMjYsIDB4NEVBNSwgMHg1QkIzLCAweDlBODcsIDB4OTE2MywKLSAgICAweDYxQTgsIDB4OTBBRiwgMHg5N0U5LCAweDU0MkIsIDB4NkRCNSwgMHg1QkQyLCAweDUxRkQsIDB4NTU4QSwKLSAgICAweDdGNTUsIDB4N0ZGMCwgMHg2NEJDLCAweDYzNEQsIDB4NjVGMSwgMHg2MUJFLCAweDYwOEQsIDB4NzEwQSwKLSAgICAweDZDNTcsIDB4NkM0OSwgMHg1OTJGLCAweDY3NkQsIDB4ODIyQSwgMHg1OEQ1LCAweDU2OEUsIDB4OEM2QSwKLSAgICAweDZCRUIsIDB4OTBERCwgMHg1OTdELCAweDgwMTcsIDB4NTNGNywgMHg2RDY5LCAweDU0NzUsIDB4NTU5RCwKLSAgICAweDgzNzcsIDB4ODNDRiwgMHg2ODM4LCAweDc5QkUsIDB4NTQ4QywgMHg0RjU1LCAweDU0MDgsIDB4NzZEMiwKLSAgICAweDhDODksIDB4OTYwMiwgMHg2Q0IzLCAweDZEQjgsIDB4OEQ2QiwgMHg4OTEwLCAweDlFNjQsIDB4OEQzQSwKLSAgICAweDU2M0YsIDB4OUVEMSwgMHg3NUQ1LCAweDVGODgsIDB4NzJFMCwgMHg2MDY4LCAweDU0RkMsIDB4NEVBOCwKLSAgICAweDZBMkEsIDB4ODg2MSwgMHg2MDUyLCAweDhGNzAsIDB4NTRDNCwgMHg3MEQ4LCAweDg2NzksIDB4OUUzRiwKLSAgICAweDZEMkEsIDB4NUI4RiwgMHg1RjE4LCAweDdFQTIsIDB4NTU4OSwgMHg0RkFGLCAweDczMzQsIDB4NTQzQywKLSAgICAweDUzOUEsIDB4NTAxOSwgMHg1NDBFLCAweDU0N0MsIDB4NEU0RSwgMHg1RkZELCAweDc0NUEsIDB4NThGNiwKLSAgICAweDg0NkIsIDB4ODBFMSwgMHg4Nzc0LCAweDcyRDAsIDB4N0NDQSwgMHg2RTU2LCAweDVGMjcsIDB4ODY0RSwKLSAgICAweDU1MkMsIDB4NjJBNCwgMHg0RTkyLCAweDZDQUEsIDB4NjIzNywgMHg4MkIxLCAweDU0RDcsIDB4NTM0RSwKLSAgICAweDczM0UsIDB4NkVEMSwgMHg3NTNCLCAweDUyMTIsIDB4NTMxNiwgMHg4QkRELCAweDY5RDAsIDB4NUY4QSwKLSAgICAweDYwMDAsIDB4NkRFRSwgMHg1NzRGLCAweDZCMjIsIDB4NzNBRiwgMHg2ODUzLCAweDhGRDgsIDB4N0YxMywKLSAgICAweDYzNjIsIDB4NjBBMywgMHg1NTI0LCAweDc1RUEsIDB4OEM2MiwgMHg3MTE1LCAweDZEQTMsIDB4NUJBNiwKLSAgICAweDVFN0IsIDB4ODM1MiwgMHg2MTRDLCAweDlFQzQsIDB4NzhGQSwgMHg4NzU3LCAweDdDMjcsIDB4NzY4NywKLSAgICAweDUxRjAsIDB4NjBGNiwgMHg3MTRDLCAweDY2NDMsIDB4NUU0QywgMHg2MDRELCAweDhDMEUsIDB4NzA3MCwKLSAgICAweDYzMjUsIDB4OEY4OSwgMHg1RkJELCAweDYwNjIsIDB4ODZENCwgMHg1NkRFLCAweDZCQzEsIDB4NjA5NCwKLSAgICAweDYxNjcsIDB4NTM0OSwgMHg2MEUwLCAweDY2NjYsIDB4OEQzRiwgMHg3OUZELCAweDRGMUEsIDB4NzBFOSwKLSAgICAweDZDNDcsIDB4OEJCMywgMHg4QkYyLCAweDdFRDgsIDB4ODM2NCwgMHg2NjBGLCAweDVBNUEsIDB4OUI0MiwKLSAgICAweDZENTEsIDB4NkRGNywgMHg4QzQxLCAweDZEM0IsIDB4NEYxOSwgMHg3MDZCLCAweDgzQjcsIDB4NjIxNiwKLSAgICAweDYwRDEsIDB4OTcwRCwgMHg4RDI3LCAweDc5NzgsIDB4NTFGQiwgMHg1NzNFLCAweDU3RkEsIDB4NjczQSwKLSAgICAweDc1NzgsIDB4N0EzRCwgMHg3OUVGLCAweDdCOTUsIDB4ODA4QywgMHg5OTY1LCAweDhGRjksIDB4NkZDMCwKLSAgICAweDhCQTUsIDB4OUUyMSwgMHg1OUVDLCAweDdFRTksIDB4N0YwOSwgMHg1NDA5LCAweDY3ODEsIDB4NjhEOCwKLSAgICAweDhGOTEsIDB4N0M0RCwgMHg5NkM2LCAweDUzQ0EsIDB4NjAyNSwgMHg3NUJFLCAweDZDNzIsIDB4NTM3MywKLSAgICAweDVBQzksIDB4N0VBNywgMHg2MzI0LCAweDUxRTAsIDB4ODEwQSwgMHg1REYxLCAweDg0REYsIDB4NjI4MCwKLSAgICAweDUxODAsIDB4NUI2MywgMHg0RjBFLCAweDc5NkQsIDB4NTI0MiwgMHg2MEI4LCAweDZENEUsIDB4NUJDNCwKLSAgICAweDVCQzIsIDB4OEJBMSwgMHg4QkIwLCAweDY1RTIsIDB4NUZDQywgMHg5NjQ1LCAweDU5OTMsIDB4N0VFNywKLSAgICAweDdFQUEsIDB4NTYwOSwgMHg2N0I3LCAweDU5MzksIDB4NEY3MywgMHg1QkI2LCAweDUyQTAsIDB4ODM1QSwKLSAgICAweDk4OEEsIDB4OEQzRSwgMHg3NTMyLCAweDk0QkUsIDB4NTA0NywgMHg3QTNDLCAweDRFRjcsIDB4NjdCNiwKLSAgICAweDlBN0UsIDB4NUFDMSwgMHg2QjdDLCAweDc2RDEsIDB4NTc1QSwgMHg1QzE2LCAweDdCM0EsIDB4OTVGNCwKLSAgICAweDcxNEUsIDB4NTE3QywgMHg4MEE5LCAweDgyNzAsIDB4NTk3OCwgMHg3RjA0LCAweDgzMjcsIDB4NjhDMCwKLSAgICAweDY3RUMsIDB4NzhCMSwgMHg3ODc3LCAweDYyRTMsIDB4NjM2MSwgMHg3QjgwLCAweDRGRUQsIDB4NTI2QSwKLSAgICAweDUxQ0YsIDB4ODM1MCwgMHg2OURCLCAweDkyNzQsIDB4OERGNSwgMHg4RDMxLCAweDg5QzEsIDB4OTUyRSwKLSAgICAweDdCQUQsIDB4NEVGNiwgMHg1MDY1LCAweDgyMzAsIDB4NTI1MSwgMHg5OTZGLCAweDZFMTAsIDB4NkU4NSwKLSAgICAweDZEQTcsIDB4NUVGQSwgMHg1MEY1LCAweDU5REMsIDB4NUMwNiwgMHg2RDQ2LCAweDZDNUYsIDB4NzU4NiwKLSAgICAweDg0OEIsIDB4Njg2OCwgMHg1OTU2LCAweDhCQjIsIDB4NTMyMCwgMHg5MTcxLCAweDk2NEQsIDB4ODU0OSwKLSAgICAweDY5MTIsIDB4NzkwMSwgMHg3MTI2LCAweDgwRjYsIDB4NEVBNCwgMHg5MENBLCAweDZENDcsIDB4OUE4NCwKLSAgICAweDVBMDcsIDB4NTZCQywgMHg2NDA1LCAweDk0RjAsIDB4NzdFQiwgMHg0RkE1LCAweDgxMUEsIDB4NzJFMSwKLSAgICAweDg5RDIsIDB4OTk3QSwgMHg3RjM0LCAweDdFREUsIDB4NTI3RiwgMHg2NTU5LCAweDkxNzUsIDB4OEY3RiwKLSAgICAweDhGODMsIDB4NTNFQiwgMHg3QTk2LCAweDYzRUQsIDB4NjNBNSwgMHg3Njg2LCAweDc5RjgsIDB4ODg1NywKLSAgICAweDk2MzYsIDB4NjIyQSwgMHg1MkFCLCAweDgyODIsIDB4Njg1NCwgMHg2NzcwLCAweDYzNzcsIDB4Nzc2QiwKLSAgICAweDdBRUQsIDB4NkQwMSwgMHg3RUQzLCAweDg5RTMsIDB4NTlEMCwgMHg2MjEyLCAweDg1QzksIDB4ODJBNSwKLSAgICAweDc1NEMsIDB4NTAxRiwgMHg0RUNCLCAweDc1QTUsIDB4OEJFQiwgMHg1QzRBLCAweDVERkUsIDB4N0I0QiwKLSAgICAweDY1QTQsIDB4OTFEMSwgMHg0RUNBLCAweDZEMjUsIDB4ODk1RiwgMHg3RDI3LCAweDk1MjYsIDB4NEVDNSwKLSAgICAweDhDMjgsIDB4OEZEQiwgMHg5NzczLCAweDY2NEIsIDB4Nzk4MSwgMHg4RkQxLCAweDcwRUMsIDB4NkQ3OCwKLSAgICAweDVDM0QsIDB4NTJCMiwgMHg4MzQ2LCAweDUxNjIsIDB4ODMwRSwgMHg3NzVCLCAweDY2NzYsIDB4OUNCOCwKLSAgICAweDRFQUMsIDB4NjBDQSwgMHg3Q0JFLCAweDdDQjMsIDB4N0VDRiwgMHg0RTk1LCAweDhCNjYsIDB4NjY2RiwKLSAgICAweDk4ODgsIDB4OTc1OSwgMHg1ODgzLCAweDY1NkMsIDB4OTU1QywgMHg1Rjg0LCAweDc1QzksIDB4OTc1NiwKLSAgICAweDdBREYsIDB4N0FERSwgMHg1MUMwLCAweDcwQUYsIDB4N0E5OCwgMHg2M0VBLCAweDdBNzYsIDB4N0VBMCwKLSAgICAweDczOTYsIDB4OTdFRCwgMHg0RTQ1LCAweDcwNzgsIDB4NEU1RCwgMHg5MTUyLCAweDUzQTksIDB4NjU1MSwKLSAgICAweDY1RTcsIDB4ODFGQywgMHg4MjA1LCAweDU0OEUsIDB4NUMzMSwgMHg3NTlBLCAweDk3QTAsIDB4NjJEOCwKLSAgICAweDcyRDksIDB4NzVCRCwgMHg1QzQ1LCAweDlBNzksIDB4ODNDQSwgMHg1QzQwLCAweDU0ODAsIDB4NzdFOSwKLSAgICAweDRFM0UsIDB4NkNBRSwgMHg4MDVBLCAweDYyRDIsIDB4NjM2RSwgMHg1REU4LCAweDUxNzcsIDB4OERERCwKLSAgICAweDhFMUUsIDB4OTUyRiwgMHg0RkYxLCAweDUzRTUsIDB4NjBFNywgMHg3MEFDLCAweDUyNjcsIDB4NjM1MCwKLSAgICAweDlFNDMsIDB4NUExRiwgMHg1MDI2LCAweDc3MzcsIDB4NTM3NywgMHg3RUUyLCAweDY0ODUsIDB4NjUyQiwKLSAgICAweDYyODksIDB4NjM5OCwgMHg1MDE0LCAweDcyMzUsIDB4ODlDOSwgMHg1MUIzLCAweDhCQzAsIDB4N0VERCwKLSAgICAweDU3NDcsIDB4ODNDQywgMHg5NEE3LCAweDUxOUIsIDB4NTQxQiwgMHg1Q0ZCLCAweDRGQ0EsIDB4N0FFMywKLSAgICAweDZENUEsIDB4OTBFMSwgMHg5QThGLCAweDU1ODAsIDB4NTQ5NiwgMHg1MzYxLCAweDU0QUYsIDB4NUYwMCwKLSAgICAweDYzRTksIDB4Njk3NywgMHg1MUVGLCAweDYxNjgsIDB4NTIwQSwgMHg1ODJBLCAweDUyRDgsIDB4NTc0RSwKLSAgICAweDc4MEQsIDB4NzcwQiwgMHg1RUI3LCAweDYxNzcsIDB4N0NFMCwgMHg2MjVCLCAweDYyOTcsIDB4NEVBMiwKLSAgICAweDcwOTUsIDB4ODAwMywgMHg2MkY3LCAweDcwRTQsIDB4OTc2MCwgMHg1Nzc3LCAweDgyREIsIDB4NjdFRiwKLSAgICAweDY4RjUsIDB4NzhENSwgMHg5ODk3LCAweDc5RDEsIDB4NThGMywgMHg1NEIzLCAweDUzRUYsIDB4NkUzNCwKLSAgICAweDUxNEIsIDB4NTIzQiwgMHg1QkEyLCAweDhCRkUsIDB4ODBBRiwgMHg1NTQzLCAweDU3QTYsIDB4NjA3MywKLSAgICAweDU3NTEsIDB4NTQyRCwgMHg3QTdBLCAweDYwNTAsIDB4NUI1NCwgMHg2M0E3LCAweDYyQTAsIDB4NTNFMywKLSAgICAweDYyNjMsIDB4NUJDNywgMHg2N0FGLCAweDU0RUQsIDB4N0E5RiwgMHg4MkU2LCAweDkxNzcsIDB4NUU5MywKLSAgICAweDg4RTQsIDB4NTkzOCwgMHg1N0FFLCAweDYzMEUsIDB4OERFOCwgMHg4MEVGLCAweDU3NTcsIDB4N0I3NywKLSAgICAweDRGQTksIDB4NUZFQiwgMHg1QkJELCAweDZCM0UsIDB4NTMyMSwgMHg3QjUwLCAweDcyQzIsIDB4Njg0NiwKLSAgICAweDc3RkYsIDB4NzczNiwgMHg2NUY3LCAweDUxQjUsIDB4NEU4RiwgMHg3NkQ0LCAweDVDQkYsIDB4N0FBNSwKLSAgICAweDg0NzUsIDB4NTk0RSwgMHg5QjQxLCAweDUwODAsIDB4OTk4OCwgMHg2MTI3LCAweDZFODMsIDB4NTc2NCwKLSAgICAweDY2MDYsIDB4NjM0NiwgMHg1NkYwLCAweDYyRUMsIDB4NjI2OSwgMHg1RUQzLCAweDk2MTQsIDB4NTc4MywKLSAgICAweDYyQzksIDB4NTU4NywgMHg4NzIxLCAweDgxNEEsIDB4OEZBMywgMHg1NTY2LCAweDgzQjEsIDB4Njc2NSwKLSAgICAweDhENTYsIDB4ODRERCwgMHg1QTZBLCAweDY4MEYsIDB4NjJFNiwgMHg3QkVFLCAweDk2MTEsIDB4NTE3MCwKLSAgICAweDZGOUMsIDB4OEMzMCwgMHg2M0ZELCAweDg5QzgsIDB4NjFEMiwgMHg3RjA2LCAweDcwQzIsIDB4NkVFNSwKLSAgICAweDc0MDUsIDB4Njk5NCwgMHg3MkZDLCAweDVFQ0EsIDB4OTBDRSwgMHg2NzE3LCAweDZENkEsIDB4NjM1RSwKLSAgICAweDUyQjMsIDB4NzI2MiwgMHg4MDAxLCAweDRGNkMsIDB4NTlFNSwgMHg5MTZBLCAweDcwRDksIDB4NkQ5RCwKLSAgICAweDUyRDIsIDB4NEU1MCwgMHg5NkY3LCAweDk1NkQsIDB4ODU3RSwgMHg3OENBLCAweDdEMkYsIDB4NTEyMSwKLSAgICAweDU3OTIsIDB4NjRDMiwgMHg4MDhCLCAweDdDN0IsIDB4NkNFQSwgMHg2OEYxLCAweDY5NUUsIDB4NTFCNywKLSAgICAweDUzOTgsIDB4NjhBOCwgMHg3MjgxLCAweDlFQ0UsIDB4N0JGMSwgMHg3MkY4LCAweDc5QkIsIDB4NkYxMywKLSAgICAweDc0MDYsIDB4Njc0RSwgMHg5MUNDLCAweDlDQTQsIDB4NzkzQywgMHg4Mzg5LCAweDgzNTQsIDB4NTQwRiwKLSAgICAweDY4MTcsIDB4NEUzRCwgMHg1Mzg5LCAweDUyQjEsIDB4NzgzRSwgMHg1Mzg2LCAweDUyMjksIDB4NTA4OCwKLSAgICAweDRGOEIsIDB4NEZEMCwgMHg3NUUyLCAweDdBQ0IsIDB4N0M5MiwgMHg2Q0E1LCAweDk2QjYsIDB4NTI5QiwKLSAgICAweDc0ODMsIDB4NTRFOSwgMHg0RkU5LCAweDgwNTQsIDB4ODNCMiwgMHg4RkRFLCAweDk1NzAsIDB4NUVDOSwKLSAgICAweDYwMUMsIDB4NkQ5RiwgMHg1RTE4LCAweDY1NUIsIDB4ODEzOCwgMHg5NEZFLCAweDYwNEIsIDB4NzBCQywKLSAgICAweDdFQzMsIDB4N0NBRSwgMHg1MUM5LCAweDY4ODEsIDB4N0NCMSwgMHg4MjZGLCAweDRFMjQsIDB4OEY4NiwKLSAgICAweDkxQ0YsIDB4NjY3RSwgMHg0RUFFLCAweDhDMDUsIDB4NjRBOSwgMHg4MDRBLCAweDUwREEsIDB4NzU5NywKLSAgICAweDcxQ0UsIDB4NUJFNSwgMHg4RkJELCAweDZGNjYsIDB4NEU4NiwgMHg2NDgyLCAweDk1NjMsIDB4NUVENiwKLSAgICAweDY1OTksIDB4NTIxNywgMHg4OEMyLCAweDcwQzgsIDB4NTJBMywgMHg3MzBFLCAweDc0MzMsIDB4Njc5NywKLSAgICAweDc4RjcsIDB4OTcxNiwgMHg0RTM0LCAweDkwQkIsIDB4OUNERSwgMHg2RENCLCAweDUxREIsIDB4OEQ0MSwKLSAgICAweDU0MUQsIDB4NjJDRSwgMHg3M0IyLCAweDgzRjEsIDB4OTZGNiwgMHg5Rjg0LCAweDk0QzMsIDB4NEYzNiwKLSAgICAweDdGOUEsIDB4NTFDQywgMHg3MDc1LCAweDk2NzUsIDB4NUNBRCwgMHg5ODg2LCAweDUzRTYsIDB4NEVFNCwKLSAgICAweDZFOUMsIDB4NzQwOSwgMHg2OUI0LCAweDc4NkIsIDB4OTk4RiwgMHg3NTU5LCAweDUyMTgsIDB4NzYyNCwKLSAgICAweDZENDEsIDB4NjdGMywgMHg1MTZELCAweDlGOTksIDB4ODA0QiwgMHg1NDk5LCAweDdCM0MsIDB4N0FCRiwKLSAgICAweDk2ODYsIDB4NTc4NCwgMHg2MkUyLCAweDk2NDcsIDB4Njk3QywgMHg1QTA0LCAweDY0MDIsIDB4N0JEMywKLSAgICAweDZGMEYsIDB4OTY0QiwgMHg4MkE2LCAweDUzNjIsIDB4OTg4NSwgMHg1RTkwLCAweDcwODksIDB4NjNCMywKLSAgICAweDUzNjQsIDB4ODY0RiwgMHg5QzgxLCAweDlFOTMsIDB4Nzg4QywgMHg5NzMyLCAweDhERUYsIDB4OEQ0MiwKLSAgICAweDlFN0YsIDB4NkY1RSwgMHg3OTg0LCAweDVGNTUsIDB4OTY0NiwgMHg2MjJFLCAweDlBNzQsIDB4NTQxNSwKLSAgICAweDk0REQsIDB4NEZBMywgMHg2NUM1LCAweDVDNjUsIDB4NUM2MSwgMHg3RjE1LCAweDg2NTEsIDB4NkMyRiwKLSAgICAweDVGOEIsIDB4NzM4NywgMHg2RUU0LCAweDdFRkYsIDB4NUNFNiwgMHg2MzFCLCAweDVCNkEsIDB4NkVFNiwKLSAgICAweDUzNzUsIDB4NEU3MSwgMHg2M0EwLCAweDc1NjUsIDB4NjJBMSwgMHg4RjZFLCAweDRGMjYsIDB4NEVEMSwKLSAgICAweDZDQTYsIDB4N0VCNiwgMHg4QkJBLCAweDg0MUQsIDB4ODdCQSwgMHg3RjU3LCAweDkwM0IsIDB4OTUyMywKLSAgICAweDdCQTksIDB4OUFBMSwgMHg4OEY4LCAweDg0M0QsIDB4NkQxQiwgMHg5QTg2LCAweDdFREMsIDB4NTk4OCwKLSAgICAweDlFQkIsIDB4NzM5QiwgMHg3ODAxLCAweDg2ODIsIDB4OUE2QywgMHg5QTgyLCAweDU2MUIsIDB4NTQxNywKLSAgICAweDU3Q0IsIDB4NEU3MCwgMHg5RUE2LCAweDUzNTYsIDB4OEZDOCwgMHg4MTA5LCAweDc3OTIsIDB4OTk5MiwKLSAgICAweDg2RUUsIDB4NkVFMSwgMHg4NTEzLCAweDY2RkMsIDB4NjE2MiwgMHg2RjJCLCAweDhDMjksIDB4ODI5MiwKLSAgICAweDgzMkIsIDB4NzZGMiwgMHg2QzEzLCAweDVGRDksIDB4ODNCRCwgMHg3MzJCLCAweDgzMDUsIDB4OTUxQSwKLSAgICAweDZCREIsIDB4NzdEQiwgMHg5NEM2LCAweDUzNkYsIDB4ODMwMiwgMHg1MTkyLCAweDVFM0QsIDB4OEM4QywKLSAgICAweDhEMzgsIDB4NEU0OCwgMHg3M0FCLCAweDY3OUEsIDB4Njg4NSwgMHg5MTc2LCAweDk3MDksIDB4NzE2NCwKLSAgICAweDZDQTEsIDB4NzcwOSwgMHg1QTkyLCAweDk1NDEsIDB4NkJDRiwgMHg3RjhFLCAweDY2MjcsIDB4NUJEMCwKLSAgICAweDU5QjksIDB4NUE5QSwgMHg5NUU4LCAweDk1RjcsIDB4NEVFQywgMHg4NDBDLCAweDg0OTksIDB4NkFBQywKLSAgICAweDc2REYsIDB4OTUzMCwgMHg3MzFCLCAweDY4QTYsIDB4NUI1RiwgMHg3NzJGLCAweDkxOUEsIDB4OTc2MSwKLSAgICAweDdDREMsIDB4OEZGNywgMHg4QzFDLCAweDVGMjUsIDB4N0M3MywgMHg3OUQ4LCAweDg5QzUsIDB4NkNDQywKLSAgICAweDg3MUMsIDB4NUJDNiwgMHg1RTQyLCAweDY4QzksIDB4NzcyMCwgMHg3RUY1LCAweDUxOTUsIDB4NTE0RCwKLSAgICAweDUyQzksIDB4NUEyOSwgMHg3RjA1LCAweDk3NjIsIDB4ODJENywgMHg2M0NGLCAweDc3ODQsIDB4ODVEMCwKLSAgICAweDc5RDIsIDB4NkUzQSwgMHg1RTk5LCAweDU5OTksIDB4ODUxMSwgMHg3MDZELCAweDZDMTEsIDB4NjJCRiwKLSAgICAweDc2QkYsIDB4NjU0RiwgMHg2MEFGLCAweDk1RkQsIDB4NjYwRSwgMHg4NzlGLCAweDlFMjMsIDB4OTRFRCwKLSAgICAweDU0MEQsIDB4NTQ3RCwgMHg4QzJDLCAweDY0NzgsIDB4NjQ3OSwgMHg4NjExLCAweDZBMjEsIDB4ODE5QywKLSAgICAweDc4RTgsIDB4NjQ2OSwgMHg5QjU0LCAweDYyQjksIDB4NjcyQiwgMHg4M0FCLCAweDU4QTgsIDB4OUVEOCwKLSAgICAweDZDQUIsIDB4NkYyMCwgMHg1QkRFLCAweDk2NEMsIDB4OEMwQiwgMHg3MjVGLCAweDY3RDAsIDB4NjJDNywKLSAgICAweDcyNjEsIDB4NEVBOSwgMHg1OUM2LCAweDZCQ0QsIDB4NTg5MywgMHg2NkFFLCAweDVFNTUsIDB4NTJERiwKLSAgICAweDYxNTUsIDB4NjcyOCwgMHg3NkVFLCAweDc3NjYsIDB4NzI2NywgMHg3QTQ2LCAweDYyRkYsIDB4NTRFQSwKLSAgICAweDU0NTAsIDB4OTRBMCwgMHg5MEEzLCAweDVBMUMsIDB4N0VCMywgMHg2QzE2LCAweDRFNDMsIDB4NTk3NiwKLSAgICAweDgwMTAsIDB4NTk0OCwgMHg1MzU3LCAweDc1MzcsIDB4OTZCRSwgMHg1NkNBLCAweDYzMjAsIDB4ODExMSwKLSAgICAweDYwN0MsIDB4OTVGOSwgMHg2REQ2LCAweDU0NjIsIDB4OTk4MSwgMHg1MTg1LCAweDVBRTksIDB4ODBGRCwKLSAgICAweDU5QUUsIDB4OTcxMywgMHg1MDJBLCAweDZDRTUsIDB4NUMzQywgMHg2MkRGLCAweDRGNjAsIDB4NTMzRiwKLSAgICAweDgxN0IsIDB4OTAwNiwgMHg2RUJBLCAweDg1MkIsIDB4NjJDOCwgMHg1RTc0LCAweDc4QkUsIDB4NjRCNSwKLSAgICAweDYzN0IsIDB4NUZGNSwgMHg1QTE4LCAweDkxN0YsIDB4OUUxRiwgMHg1QzNGLCAweDYzNEYsIDB4ODA0MiwKLSAgICAweDVCN0QsIDB4NTU2RSwgMHg5NTRBLCAweDk1NEQsIDB4NkQ4NSwgMHg2MEE4LCAweDY3RTAsIDB4NzJERSwKLSAgICAweDUxREQsIDB4NUI4MSwgMHg2MkU3LCAweDZDREUsIDB4NzI1QiwgMHg2MjZELCAweDk0QUUsIDB4N0VCRCwKLSAgICAweDgxMTMsIDB4NkQ1MywgMHg1MTlDLCAweDVGMDQsIDB4NTk3NCwgMHg1MkFBLCAweDYwMTIsIDB4NTk3MywKLSAgICAweDY2OTYsIDB4ODY1MCwgMHg3NTlGLCAweDYzMkEsIDB4NjFFNiwgMHg3Q0VGLCAweDhCRkEsIDB4NTRFNiwKLSAgICAweDZCMjcsIDB4OUUyNSwgMHg2QkI0LCAweDg1RDUsIDB4NTQ1NSwgMHg1MDc2LCAweDZDQTQsIDB4NTU2QSwKLSAgICAweDhEQjQsIDB4NzIyQywgMHg1RTE1LCAweDYwMTUsIDB4NzQzNiwgMHg2MkNELCAweDYzOTIsIDB4NzI0QywKLSAgICAweDVGOTgsIDB4NkU0MywgMHg2RDNFLCAweDY1MDAsIDB4NkY1OCwgMHg3NkQ4LCAweDc4RDAsIDB4NzZGQywKLSAgICAweDc1NTQsIDB4NTIyNCwgMHg1M0RCLCAweDRFNTMsIDB4NUU5RSwgMHg2NUMxLCAweDgwMkEsIDB4ODBENiwKLSAgICAweDYyOUIsIDB4NTQ4NiwgMHg1MjI4LCAweDcwQUUsIDB4ODg4RCwgMHg4REQxLCAweDZDRTEsIDB4NTQ3OCwKLSAgICAweDgwREEsIDB4NTdGOSwgMHg4OEY0LCAweDhENTQsIDB4OTY2QSwgMHg5MTRELCAweDRGNjksIDB4NkM5QiwKLSAgICAweDU1QjcsIDB4NzZDNiwgMHg3ODMwLCAweDYyQTgsIDB4NzBGOSwgMHg2RjhFLCAweDVGNkQsIDB4ODRFQywKLSAgICAweDY4REEsIDB4Nzg3QywgMHg3QkY3LCAweDgxQTgsIDB4NjcwQiwgMHg5RTRGLCAweDYzNjcsIDB4NzhCMCwKLSAgICAweDU3NkYsIDB4NzgxMiwgMHg5NzM5LCAweDYyNzksIDB4NjJBQiwgMHg1Mjg4LCAweDc0MzUsIDB4NkJENywKLSAgICAweDU1NjQsIDB4ODEzRSwgMHg3NUIyLCAweDc2QUUsIDB4NTMzOSwgMHg3NURFLCAweDUwRkIsIDB4NUM0MSwKLSAgICAweDhCNkMsIDB4N0JDNywgMHg1MDRGLCAweDcyNDcsIDB4OUE5NywgMHg5OEQ4LCAweDZGMDIsIDB4NzRFMiwKLSAgICAweDc5NjgsIDB4NjQ4NywgMHg3N0E1LCAweDYyRkMsIDB4OTg5MSwgMHg4RDJCLCAweDU0QzEsIDB4ODA1OCwKLSAgICAweDRFNTIsIDB4NTc2QSwgMHg4MkY5LCAweDg0MEQsIDB4NUU3MywgMHg1MUVELCAweDc0RjYsIDB4OEJDNCwKLSAgICAweDVDNEYsIDB4NTc2MSwgMHg2Q0ZDLCAweDk4ODcsIDB4NUE0NiwgMHg3ODM0LCAweDlCNDQsIDB4OEZFQiwKLSAgICAweDdDOTUsIDB4NTI1NiwgMHg2MjUxLCAweDk0RkEsIDB4NEVDNiwgMHg4Mzg2LCAweDg0NjEsIDB4ODNFOSwKLSAgICAweDg0QjIsIDB4NTdENCwgMHg2NzM0LCAweDU3MDMsIDB4NjY2RSwgMHg2RDY2LCAweDhDMzEsIDB4NjZERCwKLSAgICAweDcwMTEsIDB4NjcxRiwgMHg2QjNBLCAweDY4MTYsIDB4NjIxQSwgMHg1OUJCLCAweDRFMDMsIDB4NTFDNCwKLSAgICAweDZGMDYsIDB4NjdEMiwgMHg2QzhGLCAweDUxNzYsIDB4NjhDQiwgMHg1OTQ3LCAweDZCNjcsIDB4NzU2NiwKLSAgICAweDVEMEUsIDB4ODExMCwgMHg5RjUwLCAweDY1RDcsIDB4Nzk0OCwgMHg3OTQxLCAweDlBOTEsIDB4OEQ3NywKLSAgICAweDVDODIsIDB4NEU1RSwgMHg0RjAxLCAweDU0MkYsIDB4NTk1MSwgMHg3ODBDLCAweDU2NjgsIDB4NkMxNCwKLSAgICAweDhGQzQsIDB4NUYwMywgMHg2QzdELCAweDZDRTMsIDB4OEJBQiwgMHg2MzkwLCAweDYwNzAsIDB4NkQzRCwKLSAgICAweDcyNzUsIDB4NjI2NiwgMHg5NDhFLCAweDk0QzUsIDB4NTM0MywgMHg4RkMxLCAweDdCN0UsIDB4NEVERiwKLSAgICAweDhDMjYsIDB4NEU3RSwgMHg5RUQ0LCAweDk0QjEsIDB4OTRCMywgMHg1MjRELCAweDZGNUMsIDB4OTA2MywKLSAgICAweDZENDUsIDB4OEMzNCwgMHg1ODExLCAweDVENEMsIDB4NkIyMCwgMHg2QjQ5LCAweDY3QUEsIDB4NTQ1QiwKLSAgICAweDgxNTQsIDB4N0Y4QywgMHg1ODk5LCAweDg1MzcsIDB4NUYzQSwgMHg2MkEyLCAweDZBNDcsIDB4OTUzOSwKLSAgICAweDY1NzIsIDB4NjA4NCwgMHg2ODY1LCAweDc3QTcsIDB4NEU1NCwgMHg0RkE4LCAweDVERTcsIDB4OTc5OCwKLSAgICAweDY0QUMsIDB4N0ZEOCwgMHg1Q0VELCAweDRGQ0YsIDB4N0E4RCwgMHg1MjA3LCAweDgzMDQsIDB4NEUxNCwKLSAgICAweDYwMkYsIDB4N0E4MywgMHg5NEE2LCAweDRGQjUsIDB4NEVCMiwgMHg3OUU2LCAweDc0MzQsIDB4NTJFNCwKLSAgICAweDgyQjksIDB4NjREMiwgMHg3OUJELCAweDVCREQsIDB4NkM4MSwgMHg5NzUyLCAweDhGN0IsIDB4NkMyMiwKLSAgICAweDUwM0UsIDB4NTM3RiwgMHg2RTA1LCAweDY0Q0UsIDB4NjY3NCwgMHg2QzMwLCAweDYwQzUsIDB4OTg3NywKLSAgICAweDhCRjcsIDB4NUU4NiwgMHg3NDNDLCAweDdBNzcsIDB4NzlDQiwgMHg0RTE4LCAweDkwQjEsIDB4NzQwMywKLSAgICAweDZDNDIsIDB4NTZEQSwgMHg5MTRCLCAweDZDQzUsIDB4OEQ4QiwgMHg1MzNBLCAweDg2QzYsIDB4NjZGMiwKLSAgICAweDhFQUYsIDB4NUM0OCwgMHg5QTcxLCAweDZFMjAsIDB4NTNENiwgMHg1QTM2LCAweDlGOEIsIDB4OERBMywKLSAgICAweDUzQkIsIDB4NTcwOCwgMHg5OEE3LCAweDY3NDMsIDB4OTE5QiwgMHg2Q0M5LCAweDUxNjgsIDB4NzVDQSwKLSAgICAweDYyRjMsIDB4NzJBQywgMHg1MjM4LCAweDUyOUQsIDB4N0YzQSwgMHg3MDk0LCAweDc2MzgsIDB4NTM3NCwKLSAgICAweDlFNEEsIDB4NjlCNywgMHg3ODZFLCAweDk2QzAsIDB4ODhEOSwgMHg3RkE0LCAweDcxMzYsIDB4NzFDMywKLSAgICAweDUxODksIDB4NjdEMywgMHg3NEU0LCAweDU4RTQsIDB4NjUxOCwgMHg1NkI3LCAweDhCQTksIDB4OTk3NiwKLSAgICAweDYyNzAsIDB4N0VENSwgMHg2MEY5LCAweDcwRUQsIDB4NThFQywgMHg0RUMxLCAweDRFQkEsIDB4NUZDRCwKLSAgICAweDk3RTcsIDB4NEVGQiwgMHg4QkE0LCAweDUyMDMsIDB4NTk4QSwgMHg3RUFCLCAweDYyNTQsIDB4NEVDRCwKLSAgICAweDY1RTUsIDB4NjIwRSwgMHg4MzM4LCAweDg0QzksIDB4ODM2MywgMHg4NzhELCAweDcxOTQsIDB4NkVCNiwKLSAgICAweDVCQjksIDB4N0VEMiwgMHg1MTk3LCAweDYzQzksIDB4NjdENCwgMHg4MDg5LCAweDgzMzksIDB4ODgxNSwKLSAgICAweDUxMTIsIDB4NUI3QSwgMHg1OTgyLCAweDhGQjEsIDB4NEU3MywgMHg2QzVELCAweDUxNjUsIDB4ODkyNSwKLSAgICAweDhGNkYsIDB4OTYyRSwgMHg4NTRBLCAweDc0NUUsIDB4OTUxMCwgMHg5NUYwLCAweDZEQTYsIDB4ODJFNSwKLSAgICAweDVGMzEsIDB4NjQ5MiwgMHg2RDEyLCAweDg0MjgsIDB4ODE2RSwgMHg5Q0MzLCAweDU4NUUsIDB4OEQ1QiwKLSAgICAweDRFMDksIDB4NTNDMSwgMHg0RjFFLCAweDY1NjMsIDB4Njg1MSwgMHg1NUQzLCAweDRFMjcsIDB4NjQxNCwKLSAgICAweDlBOUEsIDB4NjI2QiwgMHg1QUMyLCAweDc0NUYsIDB4ODI3MiwgMHg2REE5LCAweDY4RUUsIDB4NTBFNywKLSAgICAweDgzOEUsIDB4NzgwMiwgMHg2NzQwLCAweDUyMzksIDB4NkM5OSwgMHg3RUIxLCAweDUwQkIsIDB4NTU2NSwKLSAgICAweDcxNUUsIDB4N0I1QiwgMHg2NjUyLCAweDczQ0EsIDB4ODJFQiwgMHg2NzQ5LCAweDVDNzEsIDB4NTIyMCwKLSAgICAweDcxN0QsIDB4ODg2QiwgMHg5NUVBLCAweDk2NTUsIDB4NjRDNSwgMHg4RDYxLCAweDgxQjMsIDB4NTU4NCwKLSAgICAweDZDNTUsIDB4NjI0NywgMHg3RjJFLCAweDU4OTIsIDB4NEYyNCwgMHg1NTQ2LCAweDhENEYsIDB4NjY0QywKLSAgICAweDRFMEEsIDB4NUMxQSwgMHg4OEYzLCAweDY4QTIsIDB4NjM0RSwgMHg3QTBELCAweDcwRTcsIDB4ODI4RCwKLSAgICAweDUyRkEsIDB4OTdGNiwgMHg1QzExLCAweDU0RTgsIDB4OTBCNSwgMHg3RUNELCAweDU5NjIsIDB4OEQ0QSwKLSAgICAweDg2QzcsIDB4ODIwQywgMHg4MjBELCAweDhENjYsIDB4NjQ0NCwgMHg1QzA0LCAweDYxNTEsIDB4NkQ4OSwKLSAgICAweDc5M0UsIDB4OEJCRSwgMHg3ODM3LCAweDc1MzMsIDB4NTQ3QiwgMHg0RjM4LCAweDhFQUIsIDB4NkRGMSwKLSAgICAweDVBMjAsIDB4N0VDNSwgMHg3OTVFLCAweDZDODgsIDB4NUJBMSwgMHg1QTc2LCAweDc1MUEsIDB4ODBCRSwKLSAgICAweDYxNEUsIDB4NkUxNywgMHg1OEYwLCAweDc1MUYsIDB4NzUyNSwgMHg3MjcyLCAweDUzNDcsIDB4N0VGMywKLSAgICAweDc3MDEsIDB4NzZEQiwgMHg1MjY5LCAweDgwREMsIDB4NTcyMywgMHg1RTA4LCAweDU5MzEsIDB4NzJFRSwKLSAgICAweDY1QkQsIDB4NkU3RiwgMHg4QkQ3LCAweDVDMzgsIDB4ODY3MSwgMHg1MzQxLCAweDc3RjMsIDB4NjJGRSwKLSAgICAweDY1RjYsIDB4NEVDMCwgMHg5OERGLCAweDg2ODAsIDB4NUI5RSwgMHg4QkM2LCAweDUzRjIsIDB4NzdFMiwKLSAgICAweDRGN0YsIDB4NUM0RSwgMHg5QTc2LCAweDU5Q0IsIDB4NUYwRiwgMHg3OTNBLCAweDU4RUIsIDB4NEUxNiwKLSAgICAweDY3RkYsIDB4NEU4QiwgMHg2MkVELCAweDhBOTMsIDB4OTAxRCwgMHg1MkJGLCAweDY2MkYsIDB4NTVEQywKLSAgICAweDU2NkMsIDB4OTAwMiwgMHg0RUQ1LCAweDRGOEQsIDB4OTFDQSwgMHg5OTcwLCAweDZDMEYsIDB4NUUwMiwKLSAgICAweDYwNDMsIDB4NUJBNCwgMHg4OUM2LCAweDhCRDUsIDB4NjUzNiwgMHg2MjRCLCAweDk5OTYsIDB4NUI4OCwKLSAgICAweDVCRkYsIDB4NjM4OCwgMHg1NTJFLCAweDUzRDcsIDB4NzYyNiwgMHg1MTdELCAweDg1MkMsIDB4NjdBMiwKLSAgICAweDY4QjMsIDB4NkI4QSwgMHg2MjkyLCAweDhGOTMsIDB4NTNENCwgMHg4MjEyLCAweDZERDEsIDB4NzU4RiwKLSAgICAweDRFNjYsIDB4OEQ0RSwgMHg1QjcwLCAweDcxOUYsIDB4ODVBRiwgMHg2NjkxLCAweDY2RDksIDB4N0Y3MiwKLSAgICAweDg3MDAsIDB4OUVDRCwgMHg5RjIwLCAweDVDNUUsIDB4NjcyRiwgMHg4RkYwLCAweDY4MTEsIDB4Njc1RiwKLSAgICAweDYyMEQsIDB4N0FENiwgMHg1ODg1LCAweDVFQjYsIDB4NjU3MCwgMHg2RjMxLCAweDYwNTUsIDB4NTIzNywKLSAgICAweDgwMEQsIDB4NjQ1NCwgMHg4ODcwLCAweDc1MjksIDB4NUUwNSwgMHg2ODEzLCAweDYyRjQsIDB4OTcxQywKLSAgICAweDUzQ0MsIDB4NzIzRCwgMHg4QzAxLCAweDZDMzQsIDB4Nzc2MSwgMHg3QTBFLCAweDU0MkUsIDB4NzdBQywKLSAgICAweDk4N0EsIDB4ODIxQywgMHg4QkY0LCAweDc4NTUsIDB4NjcxNCwgMHg3MEMxLCAweDY1QUYsIDB4NjQ5NSwKLSAgICAweDU2MzYsIDB4NjAxRCwgMHg3OUMxLCAweDUzRjgsIDB4NEUxRCwgMHg2QjdCLCAweDgwODYsIDB4NUJGQSwKLSAgICAweDU1RTMsIDB4NTZEQiwgMHg0RjNBLCAweDRGM0MsIDB4OTk3MiwgMHg1REYzLCAweDY3N0UsIDB4ODAzOCwKLSAgICAweDYwMDIsIDB4OTg4MiwgMHg5MDAxLCAweDVCOEIsIDB4OEJCQywgMHg4QkY1LCAweDY0MUMsIDB4ODI1OCwKLSAgICAweDY0REUsIDB4NTVGRCwgMHg4MkNGLCAweDkxNjUsIDB4NEZENywgMHg3RDIwLCAweDkwMUYsIDB4N0M5RiwKLSAgICAweDUwRjMsIDB4NTg1MSwgMHg2RUFGLCAweDVCQkYsIDB4OEJDOSwgMHg4MDgzLCAweDkxNzgsIDB4ODQ5QywKLSAgICAweDdCOTcsIDB4ODY3RCwgMHg5NjhCLCAweDk2OEYsIDB4N0VFNSwgMHg5QUQzLCAweDc4OEUsIDB4NUM4MSwKLSAgICAweDdBNTcsIDB4OTA0MiwgMHg5NkE3LCAweDc5NUYsIDB4NUI1OSwgMHg2MzVGLCAweDdCMEIsIDB4ODREMSwKLSAgICAweDY4QUQsIDB4NTUwNiwgMHg3RjI5LCAweDc0MTAsIDB4N0QyMiwgMHg5NTAxLCAweDYyNDAsIDB4NTg0QywKLSAgICAweDRFRDYsIDB4NUI4MywgMHg1OTc5LCAweDU4NTQsIDB4NzM2RCwgMHg2MzFFLCAweDhFNEIsIDB4OEUwRiwKLSAgICAweDgwQ0UsIDB4ODJENCwgMHg2MkFDLCAweDUzRjAsIDB4NkNGMCwgMHg5MTVFLCAweDU5MkEsIDB4NjAwMSwKLSAgICAweDZDNzAsIDB4NTc0RCwgMHg2NDRBLCAweDhEMkEsIDB4NzYyQiwgMHg2RUU5LCAweDU3NUIsIDB4NkE4MCwKLSAgICAweDc1RjAsIDB4NkY2RCwgMHg4QzJELCAweDhDMDgsIDB4NTc2NiwgMHg2QkVGLCAweDg4OTIsIDB4NzhCMywKLSAgICAweDYzQTIsIDB4NTNGOSwgMHg3MEFELCAweDZDNjQsIDB4NTg1OCwgMHg2NDJBLCAweDU4MDIsIDB4NjhFMCwKLSAgICAweDgxOUIsIDB4NTUxMCwgMHg3Q0Q2LCAweDUwMTgsIDB4OEVCQSwgMHg2RENDLCAweDhEOUYsIDB4NzBFQiwKLSAgICAweDYzOEYsIDB4NkQ5QiwgMHg2RUQ0LCAweDdFRTYsIDB4ODQwNCwgMHg2ODQzLCAweDkwMDMsIDB4NkREOCwKLSAgICAweDk2NzYsIDB4OEJBOCwgMHg1OTU3LCAweDcyNzksIDB4ODVFNCwgMHg4MTdFLCAweDc1QkMsIDB4OEE4QSwKLSAgICAweDY4QUYsIDB4NTI1NCwgMHg4RTIyLCAweDk1MTEsIDB4NjNEMCwgMHg5ODk4LCAweDhFNDQsIDB4NTU3QywKLSAgICAweDRGNTMsIDB4NjZGRiwgMHg1NjhGLCAweDYwRDUsIDB4NkQ5NSwgMHg1MjQzLCAweDVDNDksIDB4NTkyOSwKLSAgICAweDZERkIsIDB4NTg2QiwgMHg3NTMwLCAweDc1MUMsIDB4NjA2QywgMHg4MjE0LCAweDgxNDYsIDB4NjMxMSwKLSAgICAweDY3NjEsIDB4OEZFMiwgMHg3NzNBLCAweDhERjMsIDB4OEQzNCwgMHg5NEMxLCAweDVFMTYsIDB4NTM4NSwKLSAgICAweDU0MkMsIDB4NzBDMywgMHg2QzQwLCAweDVFRjcsIDB4NTA1QywgMHg0RUFELCAweDVFQUQsIDB4NjMzQSwKLSAgICAweDgyNDcsIDB4OTAxQSwgMHg2ODUwLCAweDkxNkUsIDB4NzdCMywgMHg1NDBDLCAweDk0REMsIDB4NUY2NCwKLSAgICAweDdBRTUsIDB4Njg3NiwgMHg2MzQ1LCAweDdCNTIsIDB4N0VERiwgMHg3NURCLCAweDUwNzcsIDB4NjI5NSwKLSAgICAweDU5MzQsIDB4OTAwRiwgMHg1MUY4LCAweDc5QzMsIDB4N0E4MSwgMHg1NkZFLCAweDVGOTIsIDB4OTAxNCwKLSAgICAweDZEODIsIDB4NUM2MCwgMHg1NzFGLCAweDU0MTAsIDB4NTE1NCwgMHg2RTRELCAweDU2RTIsIDB4NjNBOCwKLSAgICAweDk4OTMsIDB4ODE3RiwgMHg4NzE1LCAweDg5MkEsIDB4OTAwMCwgMHg1NDFFLCAweDVDNkYsIDB4ODFDMCwKLSAgICAweDYyRDYsIDB4NjI1OCwgMHg4MTMxLCAweDlFMzUsIDB4OTY0MCwgMHg5QTZFLCAweDlBN0MsIDB4NjkyRCwKLSAgICAweDU5QTUsIDB4NjJEMywgMHg1NTNFLCAweDYzMTYsIDB4NTRDNywgMHg4NkQ5LCAweDZEM0MsIDB4NUEwMywKLSAgICAweDc0RTYsIDB4ODg5QywgMHg2QjZBLCAweDU5MTYsIDB4OEM0QywgMHg1RjJGLCAweDZFN0UsIDB4NzNBOSwKLSAgICAweDk4N0QsIDB4NEUzOCwgMHg3MEY3LCAweDVCOEMsIDB4Nzg5NywgMHg2MzNELCAweDY2NUEsIDB4NzY5NiwKLSAgICAweDYwQ0IsIDB4NUI5QiwgMHg1QTQ5LCAweDRFMDcsIDB4ODE1NSwgMHg2QzZBLCAweDczOEIsIDB4NEVBMSwKLSAgICAweDY3ODksIDB4N0Y1MSwgMHg1RjgwLCAweDY1RkEsIDB4NjcxQiwgMHg1RkQ4LCAweDU5ODQsIDB4NUEwMSwKLSAgICAweDVEQ0QsIDB4NUZBRSwgMHg1MzcxLCAweDk3RTYsIDB4OEZERCwgMHg2ODQ1LCAweDU2RjQsIDB4NTUyRiwKLSAgICAweDYwREYsIDB4NEUzQSwgMHg2RjRELCAweDdFRjQsIDB4ODJDNywgMHg4NDBFLCAweDU5RDQsIDB4NEYxRiwKLSAgICAweDRGMkEsIDB4NUMzRSwgMHg3RUFDLCAweDY3MkEsIDB4ODUxQSwgMHg1NDczLCAweDc1NEYsIDB4ODBDMywKLSAgICAweDU1ODIsIDB4OUI0RiwgMHg0RjRELCAweDZFMkQsIDB4OEMxMywgMHg1QzA5LCAweDYxNzAsIDB4NTM2QiwKLSAgICAweDc2MUYsIDB4NkUyOSwgMHg4NjhBLCAweDY1ODcsIDB4OTVGQiwgMHg3RUI5LCAweDU0M0IsIDB4N0EzMywKLSAgICAweDdEMEEsIDB4OTVFRSwgMHg1NUUxLCAweDdGQzEsIDB4NzRFRSwgMHg2MzFELCAweDg3MTcsIDB4NkRBMSwKLSAgICAweDdBOUQsIDB4NjIxMSwgMHg2NUExLCAweDUzNjcsIDB4NjNFMSwgMHg2QzgzLCAweDVERUIsIDB4NTQ1QywKLSAgICAweDk0QTgsIDB4NEU0QywgMHg2QzYxLCAweDhCRUMsIDB4NUM0QiwgMHg2NUUwLCAweDgyOUMsIDB4NjhBNywKLSAgICAweDU0M0UsIDB4NTQzNCwgMHg2QkNCLCAweDZCNjYsIDB4NEU5NCwgMHg2MzQyLCAweDUzNDgsIDB4ODIxRSwKLSAgICAweDRGMEQsIDB4NEZBRSwgMHg1NzVFLCAweDYyMEEsIDB4OTZGRSwgMHg2NjY0LCAweDcyNjksIDB4NTJGRiwKLSAgICAweDUyQTEsIDB4NjA5RiwgMHg4QkVGLCAweDY2MTQsIDB4NzE5OSwgMHg2NzkwLCAweDg5N0YsIDB4Nzg1MiwKLSAgICAweDc3RkQsIDB4NjY3MCwgMHg1NjNCLCAweDU0MzgsIDB4OTUyMSwgMHg3MjdBLCAweDdBMDAsIDB4NjA2RiwKLSAgICAweDVFMEMsIDB4NjA4OSwgMHg4MTlELCAweDU5MTUsIDB4NjBEQywgMHg3MTg0LCAweDcwRUYsIDB4NkVBQSwKLSAgICAweDZDNTAsIDB4NzI4MCwgMHg2QTg0LCAweDg4QUQsIDB4NUUyRCwgMHg0RTYwLCAweDVBQjMsIDB4NTU5QywKLSAgICAweDk0RTMsIDB4NkQxNywgMHg3Q0ZCLCAweDk2OTksIDB4NjIwRiwgMHg3RUM2LCAweDc3OEUsIDB4ODY3RSwKLSAgICAweDUzMjMsIDB4OTcxRSwgMHg4Rjk2LCAweDY2ODcsIDB4NUNFMSwgMHg0RkEwLCAweDcyRUQsIDB4NEUwQiwKLSAgICAweDUzQTYsIDB4NTkwRiwgMHg1NDEzLCAweDYzODAsIDB4OTUyOCwgMHg1MTQ4LCAweDRFRDksIDB4OUM5QywKLSAgICAweDdFQTQsIDB4NTRCOCwgMHg4RDI0LCAweDg4NTQsIDB4ODIzNywgMHg5NUYyLCAweDZEOEUsIDB4NUYyNiwKLSAgICAweDVBQ0MsIDB4NjYzRSwgMHg5NjY5LCAweDczQjAsIDB4NzMyRSwgMHg1M0JGLCAweDgxN0EsIDB4OTk4NSwKLSAgICAweDdGQTEsIDB4NUJBQSwgMHg5Njc3LCAweDk2NTAsIDB4N0VCRiwgMHg3NkY4LCAweDUzQTIsIDB4OTU3NiwKLSAgICAweDk5OTksIDB4N0JCMSwgMHg4OTQ0LCAweDZFNTgsIDB4NEU2MSwgMHg3RkQ0LCAweDc5NjUsIDB4OEJFNiwKLSAgICAweDYwRjMsIDB4NTRDRCwgMHg0RUFCLCAweDk4NzksIDB4NURGNywgMHg2QTYxLCAweDUwQ0YsIDB4NTQxMSwKLSAgICAweDhDNjEsIDB4ODQyNywgMHg3ODVELCAweDk3MDQsIDB4NTI0QSwgMHg1NEVFLCAweDU2QTMsIDB4OTUwMCwKLSAgICAweDZEODgsIDB4NUJCNSwgMHg2REM2LCAweDY2NTMsIDB4NUMwRiwgMHg1QjVELCAweDY4MjEsIDB4ODA5NiwKLSAgICAweDU1NzgsIDB4N0IxMSwgMHg2NTQ4LCAweDY5NTQsIDB4NEU5QiwgMHg2QjQ3LCAweDg3NEUsIDB4OTc4QiwKLSAgICAweDUzNEYsIDB4NjMxRiwgMHg2NDNBLCAweDkwQUEsIDB4NjU5QywgMHg4MEMxLCAweDhDMTAsIDB4NTE5OSwKLSAgICAweDY4QjAsIDB4NTM3OCwgMHg4N0Y5LCAweDYxQzgsIDB4NkNDNCwgMHg2Q0ZCLCAweDhDMjIsIDB4NUM1MSwKLSAgICAweDg1QUEsIDB4ODJBRiwgMHg5NTBDLCAweDZCMjMsIDB4OEY5QiwgMHg2NUIwLCAweDVGRkIsIDB4NUZDMywKLSAgICAweDRGRTEsIDB4ODg0NSwgMHg2NjFGLCAweDgxNjUsIDB4NzMyOSwgMHg2MEZBLCAweDUxNzQsIDB4NTIxMSwKLSAgICAweDU3OEIsIDB4NUY2MiwgMHg5MEEyLCAweDg4NEMsIDB4OTE5MiwgMHg1RTc4LCAweDY3NEYsIDB4NjAyNywKLSAgICAweDU5RDMsIDB4NTE0NCwgMHg1MUY2LCAweDgwRjgsIDB4NTMwOCwgMHg2Qzc5LCAweDk2QzQsIDB4NzE4QSwKLSAgICAweDRGMTEsIDB4NEZFRSwgMHg3RjlFLCAweDY3M0QsIDB4NTVDNSwgMHg5NTA4LCAweDc5QzAsIDB4ODg5NiwKLSAgICAweDdFRTMsIDB4NTg5RiwgMHg2MjBDLCAweDk3MDAsIDB4ODY1QSwgMHg1NjE4LCAweDk4N0IsIDB4NUY5MCwKLSAgICAweDhCQjgsIDB4ODRDNCwgMHg5MTU3LCAweDUzRDksIDB4NjVFRCwgMHg1RThGLCAweDc1NUMsIDB4NjA2NCwKLSAgICAweDdENkUsIDB4NUE3RiwgMHg3RUVBLCAweDdFRUQsIDB4OEY2OSwgMHg1NUE3LCAweDVCQTMsIDB4NjBBQywKLSAgICAweDY1Q0IsIDB4NzM4NCwgMHg5MDA5LCAweDc2NjMsIDB4NzcyOSwgMHg3RURBLCAweDk3NzQsIDB4ODU5QiwKLSAgICAweDVCNjYsIDB4N0E3NCwgMHg5NkVBLCAweDg4NDAsIDB4NTJDQiwgMHg3MThGLCAweDVGQUEsIDB4NjVFQywKLSAgICAweDhCRTIsIDB4NUJGQiwgMHg5QTZGLCAweDVERTEsIDB4NkI4OSwgMHg2QzVCLCAweDhCQUQsIDB4OEJBRiwKLSAgICAweDkwMEEsIDB4OEZDNSwgMHg1MzhCLCAweDYyQkMsIDB4OUUyNiwgMHg5RTJELCAweDU0NDAsIDB4NEUyQiwKLSAgICAweDgyQkQsIDB4NzI1OSwgMHg4NjlDLCAweDVEMTYsIDB4ODg1OSwgMHg2REFGLCAweDk2QzUsIDB4NTREMSwKLSAgICAweDRFOUEsIDB4OEJCNiwgMHg3MTA5LCAweDU0QkQsIDB4OTYwOSwgMHg3MERGLCAweDZERjksIDB4NzZEMCwKLSAgICAweDRFMjUsIDB4NzgxNCwgMHg4NzEyLCAweDVDQTksIDB4NUVGNiwgMHg4QTAwLCAweDk4OUMsIDB4OTYwRSwKLSAgICAweDcwOEUsIDB4NkNCRiwgMHg1OTQ0LCAweDYzQTksIDB4NzczQywgMHg4ODRELCAweDZGMTQsIDB4ODI3MywKLSAgICAweDU4MzAsIDB4NzFENSwgMHg1MzhDLCAweDc4MUEsIDB4OTZDMSwgMHg1NTAxLCAweDVGNjYsIDB4NzEzMCwKLSAgICAweDVCQjQsIDB4OEMxQSwgMHg5QThDLCAweDZCODMsIDB4NTkyRSwgMHg5RTJGLCAweDc5RTcsIDB4Njc2OCwKLSAgICAweDYyNkMsIDB4NEY2RiwgMHg3NUExLCAweDdGOEEsIDB4NkQwQiwgMHg5NjMzLCAweDZDMjcsIDB4NEVGMCwKLSAgICAweDc1RDIsIDB4NTE3QiwgMHg2ODM3LCAweDZGM0UsIDB4OTA4MCwgMHg4MTcwLCAweDU5OTYsIDB4NzQ3NiwKLSAgICAweDY0NDcsIDB4NUMyNywgMHg5MDY1LCAweDdBOTEsIDB4OEMyMywgMHg1OURBLCAweDU0QUMsIDB4ODIwMCwKLSAgICAweDgzNkYsIDB4ODk4MSwgMHg4MDAwLCAweDY5MzAsIDB4NTY0RSwgMHg4MDM2LCAweDcyMzcsIDB4OTFDRSwKLSAgICAweDUxQjYsIDB4NEU1RiwgMHg5ODc1LCAweDYzOTYsIDB4NEUxQSwgMHg1M0Y2LCAweDY2RjMsIDB4ODE0QiwKLSAgICAweDU5MUMsIDB4NkRCMiwgMHg0RTAwLCAweDU4RjksIDB4NTMzQiwgMHg2M0Q2LCAweDk0RjEsIDB4NEY5RCwKLSAgICAweDRGMEEsIDB4ODg2MywgMHg5ODkwLCAweDU5MzcsIDB4OTA1NywgMHg3OUZCLCAweDRFRUEsIDB4ODBGMCwKLSAgICAweDc1OTEsIDB4NkM4MiwgMHg1QjlDLCAweDU5RTgsIDB4NUY1RCwgMHg2OTA1LCAweDg2ODEsIDB4NTAxQSwKLSAgICAweDVERjIsIDB4NEU1OSwgMHg3N0UzLCAweDRFRTUsIDB4ODI3QSwgMHg2MjkxLCAweDY2MTMsIDB4OTA5MSwKLSAgICAweDVDNzksIDB4NEVCRiwgMHg1Rjc5LCAweDgxQzYsIDB4OTAzOCwgMHg4MDg0LCAweDc1QUIsIDB4NEVBNiwKLSAgICAweDg4RDQsIDB4NjEwRiwgMHg2QkM1LCAweDVGQzYsIDB4NEU0OSwgMHg3NkNBLCAweDZFQTIsIDB4OEJFMywKLSAgICAweDhCQUUsIDB4OEMwQSwgMHg4QkQxLCAweDVGMDIsIDB4N0ZGQywgMHg3RkNDLCAweDdFQ0UsIDB4ODMzNSwKLSAgICAweDgzNkIsIDB4NTZFMCwgMHg2QkI3LCAweDk3RjMsIDB4OTYzNCwgMHg1OUZCLCAweDU0MUYsIDB4OTRGNiwKLSAgICAweDZERUIsIDB4NUJDNSwgMHg5OTZFLCAweDVDMzksIDB4NUYxNSwgMHg5NjkwLCAweDUzNzAsIDB4ODJGMSwKLSAgICAweDZBMzEsIDB4NUE3NCwgMHg5RTcwLCAweDVFOTQsIDB4N0YyOCwgMHg4M0I5LCAweDg0MjQsIDB4ODQyNSwKLSAgICAweDgzNjcsIDB4ODc0NywgMHg4RkNFLCAweDhENjIsIDB4NzZDOCwgMHg1RjcxLCAweDk4OTYsIDB4Nzg2QywKLSAgICAweDY2MjAsIDB4NTRERiwgMHg2MkU1LCAweDRGNjMsIDB4ODFDMywgMHg3NUM4LCAweDVFQjgsIDB4OTZDRCwKLSAgICAweDhFMEEsIDB4ODZGOSwgMHg1NDhGLCAweDZDRjMsIDB4NkQ4QywgMHg2QzM4LCAweDYwN0YsIDB4NTJDNywKLSAgICAweDc1MjgsIDB4NUU3RCwgMHg0RjE4LCAweDYwQTAsIDB4NUZFNywgMHg1QzI0LCAweDc1MzEsIDB4OTBBRSwKLSAgICAweDk0QzAsIDB4NzJCOSwgMHg2Q0I5LCAweDZFMzgsIDB4OTE0OSwgMHg2NzA5LCAweDUzQ0IsIDB4NTNGMywKLSAgICAweDRGNTEsIDB4OTFDOSwgMHg4QkYxLCAweDUzQzgsIDB4NUU3QywgMHg4RkMyLCAweDZERTQsIDB4NEU4RSwKLSAgICAweDc2QzIsIDB4Njk4NiwgMHg4NjVFLCAweDYxMUEsIDB4ODIwNiwgMHg0RjU5LCAweDRGREUsIDB4OTAzRSwKLSAgICAweDlDN0MsIDB4NjEwOSwgMHg2RTFELCAweDZFMTQsIDB4OTY4NSwgMHg0RTg4LCAweDVBMzEsIDB4OTZFOCwKLSAgICAweDRFMEUsIDB4NUM3RiwgMHg3OUI5LCAweDVCODcsIDB4OEJFRCwgMHg3RkJELCAweDczODksIDB4NTdERiwKLSAgICAweDgyOEIsIDB4OTBDMSwgMHg1NDAxLCAweDkwNDcsIDB4NTVCQiwgMHg1Q0VBLCAweDVGQTEsIDB4NjEwOCwKLSAgICAweDZCMzIsIDB4NzJGMSwgMHg4MEIyLCAweDhBODksIDB4NkQ3NCwgMHg1QkQzLCAweDg4RDUsIDB4OTg4NCwKLSAgICAweDhDNkIsIDB4OUE2RCwgMHg5RTMzLCAweDZFMEEsIDB4NTFBNCwgMHg1MTQzLCAweDU3QTMsIDB4ODg4MSwKLSAgICAweDUzOUYsIDB4NjNGNCwgMHg4Rjk1LCAweDU2RUQsIDB4NTQ1OCwgMHg1NzA2LCAweDczM0YsIDB4NkU5MCwKLSAgICAweDdGMTgsIDB4OEZEQywgMHg4MkQxLCAweDYxM0YsIDB4NjAyOCwgMHg5NjYyLCAweDY2RjAsIDB4N0VBNiwKLSAgICAweDhEOEEsIDB4OERDMywgMHg5NEE1LCAweDVDQjMsIDB4N0NBNCwgMHg2NzA4LCAweDYwQTYsIDB4OTYwNSwKLSAgICAweDgwMTgsIDB4NEU5MSwgMHg5MEU3LCAweDUzMDAsIDB4OTY2OCwgMHg1MTQxLCAweDhGRDAsIDB4ODU3NCwKLSAgICAweDkxNUQsIDB4NjY1NSwgMHg5N0Y1LCAweDVCNTUsIDB4NTMxRCwgMHg3ODM4LCAweDY3NDIsIDB4NjgzRCwKLSAgICAweDU0QzksIDB4NzA3RSwgMHg1QkIwLCAweDhGN0QsIDB4NTE4RCwgMHg1NzI4LCAweDU0QjEsIDB4NjUxMiwKLSAgICAweDY2ODIsIDB4OEQ1RSwgMHg4RDQzLCAweDgxMEYsIDB4ODQ2QywgMHg5MDZELCAweDdDREYsIDB4NTFGRiwKLSAgICAweDg1RkIsIDB4NjdBMywgMHg2NUU5LCAweDZGQTEsIDB4ODZBNCwgMHg4RTgxLCAweDU2NkEsIDB4OTAyMCwKLSAgICAweDc2ODIsIDB4NzA3NiwgMHg3MUU1LCAweDhEMjMsIDB4NjJFOSwgMHg1MjE5LCAweDZDRkQsIDB4OEQzQywKLSAgICAweDYwMEUsIDB4NTg5RSwgMHg2MThFLCAweDY2RkUsIDB4OEQ2MCwgMHg2MjRFLCAweDU1QjMsIDB4NkUyMywKLSAgICAweDY3MkQsIDB4OEY2NywgMHg5NEUxLCAweDk1RjgsIDB4NzcyOCwgMHg2ODA1LCAweDY5QTgsIDB4NTQ4QiwKLSAgICAweDRFNEQsIDB4NzBCOCwgMHg4QkM4LCAweDY0NTgsIDB4NjU4QiwgMHg1Qjg1LCAweDdBODQsIDB4NTAzQSwKLSAgICAweDVCRTgsIDB4NzdCQiwgMHg2QkUxLCAweDhBNzksIDB4N0M5OCwgMHg2Q0JFLCAweDc2Q0YsIDB4NjVBOSwKLSAgICAweDhGOTcsIDB4NUQyRCwgMHg1QzU1LCAweDg2MzgsIDB4NjgwOCwgMHg1MzYwLCAweDYyMTgsIDB4N0FEOSwKLSAgICAweDZFNUIsIDB4N0VGRCwgMHg2QTFGLCAweDdBRTAsIDB4NUY3MCwgMHg2RjMzLCAweDVGMjAsIDB4NjM4QywKLSAgICAweDZEQTgsIDB4Njc1NiwgMHg0RTA4LCAweDVFMTAsIDB4OEQyNiwgMHg0RUQ3LCAweDgwQzAsIDB4NzYzNCwKLSAgICAweDk2OUMsIDB4NjJEQiwgMHg2NjJELCAweDYyN0UsIDB4NkNCQywgMHg4RDc1LCAweDcxNjcsIDB4N0Y2OSwKLSAgICAweDUxNDYsIDB4ODA4NywgMHg1M0VDLCAweDkwNkUsIDB4NjI5OCwgMHg1NEYyLCAweDg2RjAsIDB4OEY5OSwKLSAgICAweDgwMDUsIDB4OTUxNywgMHg4NTE3LCAweDhGRDksIDB4NkQ1OSwgMHg3M0NELCAweDY1OUYsIDB4NzcxRiwKLSAgICAweDc1MDQsIDB4NzgyNywgMHg4MUZCLCAweDhEMUUsIDB4OTQ4OCwgMHg0RkE2LCAweDY3OTUsIDB4NzVCOSwKLSAgICAweDhCQ0EsIDB4OTcwNywgMHg2MzJGLCAweDk1NDcsIDB4OTYzNSwgMHg4NEI4LCAweDYzMjMsIDB4Nzc0MSwKLSAgICAweDVGODEsIDB4NzJGMCwgMHg0RTg5LCAweDYwMTQsIDB4NjU3NCwgMHg2MkVGLCAweDZCNjMsIDB4NjUzRiwKLSAgICAweDVFMjcsIDB4NzVDNywgMHg5MEQxLCAweDhCQzEsIDB4ODI5RCwgMHg2NzlELCAweDY1MkYsIDB4NTQzMSwKLSAgICAweDg3MTgsIDB4NzdFNSwgMHg4MEEyLCAweDgxMDIsIDB4NkM0MSwgMHg0RTRCLCAweDdFQzcsIDB4ODA0QywKLSAgICAweDc2RjQsIDB4NjkwRCwgMHg2Qjk2LCAweDYyNjcsIDB4NTAzQywgMHg0Rjg0LCAweDU3NDAsIDB4NjMwNywKLSAgICAweDZCNjIsIDB4OERCRSwgMHg1M0VBLCAweDY1RTgsIDB4N0VCOCwgMHg1RkQ3LCAweDYzMUEsIDB4NjNCNywKLSAgICAweDgxRjMsIDB4ODFGNCwgMHg3RjZFLCAweDVFMUMsIDB4NUNEOSwgMHg1MjM2LCAweDY2N0EsIDB4NzlFOSwKLSAgICAweDdBMUEsIDB4OEQyOCwgMHg3MDk5LCAweDc1RDQsIDB4NkVERSwgMHg2Q0JCLCAweDdBOTIsIDB4NEUyRCwKLSAgICAweDc2QzUsIDB4NUZFMCwgMHg5NDlGLCAweDg4NzcsIDB4N0VDOCwgMHg3OUNELCAweDgwQkYsIDB4OTFDRCwKLSAgICAweDRFRjIsIDB4NEYxNywgMHg4MjFGLCAweDU0NjgsIDB4NURERSwgMHg2RDMyLCAweDhCQ0MsIDB4N0NBNSwKLSAgICAweDhGNzQsIDB4ODA5OCwgMHg1RTFBLCAweDU0OTIsIDB4NzZCMSwgMHg1Qjk5LCAweDY2M0MsIDB4OUFBNCwKLSAgICAweDczRTAsIDB4NjgyQSwgMHg4NkRCLCAweDY3MzEsIDB4NzMyQSwgMHg4QkY4LCAweDhCREIsIDB4OTAxMCwKLSAgICAweDdBRjksIDB4NzBEQiwgMHg3MTZFLCAweDYyQzQsIDB4NzdBOSwgMHg1NjMxLCAweDRFM0IsIDB4ODQ1NywKLSAgICAweDY3RjEsIDB4NTJBOSwgMHg4NkMwLCAweDhEMkUsIDB4OTRGOCwgMHg3QjUxLCAweDRGNEYsIDB4NkNFOCwKLSAgICAweDc5NUQsIDB4OUE3QiwgMHg2MjkzLCAweDcyMkEsIDB4NjJGRCwgMHg0RTEzLCAweDc4MTYsIDB4OEY2QywKLSAgICAweDY0QjAsIDB4OEQ1QSwgMHg3QkM2LCAweDY4NjksIDB4NUU4NCwgMHg4OEM1LCAweDU5ODYsIDB4NjQ5RSwKLSAgICAweDU4RUUsIDB4NzJCNiwgMHg2OTBFLCAweDk1MjUsIDB4OEZGRCwgMHg4RDU4LCAweDU3NjAsIDB4N0YwMCwKLSAgICAweDhDMDYsIDB4NTFDNiwgMHg2MzQ5LCAweDYyRDksIDB4NTM1MywgMHg2ODRDLCAweDc0MjIsIDB4ODMwMSwKLSAgICAweDkxNEMsIDB4NTU0NCwgMHg3NzQwLCAweDcwN0MsIDB4NkQ0QSwgMHg1MTc5LCAweDU0QTgsIDB4OEQ0NCwKLSAgICAweDU5RkYsIDB4NkVDQiwgMHg2REM0LCAweDVCNUMsIDB4N0QyQiwgMHg0RUQ0LCAweDdDN0QsIDB4NkVEMywKLSAgICAweDVCNTAsIDB4ODFFQSwgMHg2RTBELCAweDVCNTcsIDB4OUIwMywgMHg2OEQ1LCAweDhFMkEsIDB4NUI5NywKLSAgICAweDdFRkMsIDB4NjAzQiwgMHg3RUI1LCAweDkwQjksIDB4OEQ3MCwgMHg1OTRGLCAweDYzQ0QsIDB4NzlERiwKLSAgICAweDhEQjMsIDB4NTM1MiwgMHg2NUNGLCAweDc5NTYsIDB4OEJDNSwgMHg5NjNCLCAweDdFQzQsIDB4OTRCQiwKLSAgICAweDdFODIsIDB4NTYzNCwgMHg5MTg5LCAweDY3MDAsIDB4N0Y2QSwgMHg1QzBBLCAweDkwNzUsIDB4NjYyOCwKLSAgICAweDVERTYsIDB4NEY1MCwgMHg2N0RFLCAweDUwNUEsIDB4NEY1QywgMHg1NzUwLCAweDVFQTcsIDB4NEU4RCwKLSAgICAweDRFMEMsIDB4NTE0MCwgMHg0RTEwLCAweDVFRkYsIDB4NTM0NSwgMHg0RTE1LCAweDRFOTgsIDB4NEUxRSwKLSAgICAweDlCMzIsIDB4NUI2QywgMHg1NjY5LCAweDRFMjgsIDB4NzlCQSwgMHg0RTNGLCAweDUzMTUsIDB4NEU0NywKLSAgICAweDU5MkQsIDB4NzIzQiwgMHg1MzZFLCAweDZDMTAsIDB4NTZERiwgMHg4MEU0LCAweDk5OTcsIDB4NkJEMywKLSAgICAweDc3N0UsIDB4OUYxNywgMHg0RTM2LCAweDRFOUYsIDB4OUYxMCwgMHg0RTVDLCAweDRFNjksIDB4NEU5MywKLSAgICAweDgyODgsIDB4NUI1QiwgMHg1NTZDLCAweDU2MEYsIDB4NEVDNCwgMHg1MzhELCAweDUzOUQsIDB4NTNBMywKLSAgICAweDUzQTUsIDB4NTNBRSwgMHg5NzY1LCAweDhENUQsIDB4NTMxQSwgMHg1M0Y1LCAweDUzMjYsIDB4NTMyRSwKLSAgICAweDUzM0UsIDB4OEQ1QywgMHg1MzY2LCAweDUzNjMsIDB4NTIwMiwgMHg1MjA4LCAweDUyMEUsIDB4NTIyRCwKLSAgICAweDUyMzMsIDB4NTIzRiwgMHg1MjQwLCAweDUyNEMsIDB4NTI1RSwgMHg1MjYxLCAweDUyNUMsIDB4ODRBRiwKLSAgICAweDUyN0QsIDB4NTI4MiwgMHg1MjgxLCAweDUyOTAsIDB4NTI5MywgMHg1MTgyLCAweDdGNTQsIDB4NEVCQiwKLSAgICAweDRFQzMsIDB4NEVDOSwgMHg0RUMyLCAweDRFRTgsIDB4NEVFMSwgMHg0RUVCLCAweDRFREUsIDB4NEYxQiwKLSAgICAweDRFRjMsIDB4NEYyMiwgMHg0RjY0LCAweDRFRjUsIDB4NEYyNSwgMHg0RjI3LCAweDRGMDksIDB4NEYyQiwKLSAgICAweDRGNUUsIDB4NEY2NywgMHg2NTM4LCAweDRGNUEsIDB4NEY1RCwgMHg0RjVGLCAweDRGNTcsIDB4NEYzMiwKLSAgICAweDRGM0QsIDB4NEY3NiwgMHg0Rjc0LCAweDRGOTEsIDB4NEY4OSwgMHg0RjgzLCAweDRGOEYsIDB4NEY3RSwKLSAgICAweDRGN0IsIDB4NEZBQSwgMHg0RjdDLCAweDRGQUMsIDB4NEY5NCwgMHg0RkU2LCAweDRGRTgsIDB4NEZFQSwKLSAgICAweDRGQzUsIDB4NEZEQSwgMHg0RkUzLCAweDRGREMsIDB4NEZEMSwgMHg0RkRGLCAweDRGRjgsIDB4NTAyOSwKLSAgICAweDUwNEMsIDB4NEZGMywgMHg1MDJDLCAweDUwMEYsIDB4NTAyRSwgMHg1MDJELCAweDRGRkUsIDB4NTAxQywKLSAgICAweDUwMEMsIDB4NTAyNSwgMHg1MDI4LCAweDUwN0UsIDB4NTA0MywgMHg1MDU1LCAweDUwNDgsIDB4NTA0RSwKLSAgICAweDUwNkMsIDB4NTA3QiwgMHg1MEE1LCAweDUwQTcsIDB4NTBBOSwgMHg1MEJBLCAweDUwRDYsIDB4NTEwNiwKLSAgICAweDUwRUQsIDB4NTBFQywgMHg1MEU2LCAweDUwRUUsIDB4NTEwNywgMHg1MTBCLCAweDRFREQsIDB4NkMzRCwKLSAgICAweDRGNTgsIDB4NEY2NSwgMHg0RkNFLCAweDlGQTAsIDB4NkM0NiwgMHg3Qzc0LCAweDUxNkUsIDB4NURGRCwKLSAgICAweDlFQzksIDB4OTk5OCwgMHg1MTgxLCAweDU5MTQsIDB4NTJGOSwgMHg1MzBELCAweDhBMDcsIDB4NTMxMCwKLSAgICAweDUxRUIsIDB4NTkxOSwgMHg1MTU1LCAweDRFQTAsIDB4NTE1NiwgMHg0RUIzLCAweDg4NkUsIDB4ODhBNCwKLSAgICAweDRFQjUsIDB4ODExNCwgMHg4OEQyLCAweDc5ODAsIDB4NUIzNCwgMHg4ODAzLCAweDdGQjgsIDB4NTFBQiwKLSAgICAweDUxQjEsIDB4NTFCRCwgMHg1MUJDLCAweDUxQzcsIDB4NTE5NiwgMHg1MUEyLCAweDUxQTUsIDB4OEJBMCwKLSAgICAweDhCQTYsIDB4OEJBNywgMHg4QkFBLCAweDhCQjQsIDB4OEJCNSwgMHg4QkI3LCAweDhCQzIsIDB4OEJDMywKLSAgICAweDhCQ0IsIDB4OEJDRiwgMHg4QkNFLCAweDhCRDIsIDB4OEJEMywgMHg4QkQ0LCAweDhCRDYsIDB4OEJEOCwKLSAgICAweDhCRDksIDB4OEJEQywgMHg4QkRGLCAweDhCRTAsIDB4OEJFNCwgMHg4QkU4LCAweDhCRTksIDB4OEJFRSwKLSAgICAweDhCRjAsIDB4OEJGMywgMHg4QkY2LCAweDhCRjksIDB4OEJGQywgMHg4QkZGLCAweDhDMDAsIDB4OEMwMiwKLSAgICAweDhDMDQsIDB4OEMwNywgMHg4QzBDLCAweDhDMEYsIDB4OEMxMSwgMHg4QzEyLCAweDhDMTQsIDB4OEMxNSwKLSAgICAweDhDMTYsIDB4OEMxOSwgMHg4QzFCLCAweDhDMTgsIDB4OEMxRCwgMHg4QzFGLCAweDhDMjAsIDB4OEMyMSwKLSAgICAweDhDMjUsIDB4OEMyNywgMHg4QzJBLCAweDhDMkIsIDB4OEMyRSwgMHg4QzJGLCAweDhDMzIsIDB4OEMzMywKLSAgICAweDhDMzUsIDB4OEMzNiwgMHg1MzY5LCAweDUzN0EsIDB4OTYxRCwgMHg5NjIyLCAweDk2MjEsIDB4OTYzMSwKLSAgICAweDk2MkEsIDB4OTYzRCwgMHg5NjNDLCAweDk2NDIsIDB4OTY0OSwgMHg5NjU0LCAweDk2NUYsIDB4OTY2NywKLSAgICAweDk2NkMsIDB4OTY3MiwgMHg5Njc0LCAweDk2ODgsIDB4OTY4RCwgMHg5Njk3LCAweDk2QjAsIDB4OTA5NywKLSAgICAweDkwOUIsIDB4OTA5RCwgMHg5MDk5LCAweDkwQUMsIDB4OTBBMSwgMHg5MEI0LCAweDkwQjMsIDB4OTBCNiwKLSAgICAweDkwQkEsIDB4OTBCOCwgMHg5MEIwLCAweDkwQ0YsIDB4OTBDNSwgMHg5MEJFLCAweDkwRDAsIDB4OTBDNCwKLSAgICAweDkwQzcsIDB4OTBEMywgMHg5MEU2LCAweDkwRTIsIDB4OTBEQywgMHg5MEQ3LCAweDkwREIsIDB4OTBFQiwKLSAgICAweDkwRUYsIDB4OTBGRSwgMHg5MTA0LCAweDkxMjIsIDB4OTExRSwgMHg5MTIzLCAweDkxMzEsIDB4OTEyRiwKLSAgICAweDkxMzksIDB4OTE0MywgMHg5MTQ2LCAweDUyMEQsIDB4NTk0MiwgMHg1MkEyLCAweDUyQUMsIDB4NTJBRCwKLSAgICAweDUyQkUsIDB4NTRGRiwgMHg1MkQwLCAweDUyRDYsIDB4NTJGMCwgMHg1M0RGLCAweDcxRUUsIDB4NzdDRCwKLSAgICAweDVFRjQsIDB4NTFGNSwgMHg1MUZDLCAweDlCMkYsIDB4NTNCNiwgMHg1RjAxLCAweDc1NUEsIDB4NURFRiwKLSAgICAweDU3NEMsIDB4NTdBOSwgMHg1N0ExLCAweDU4N0UsIDB4NThCQywgMHg1OEM1LCAweDU4RDEsIDB4NTcyOSwKLSAgICAweDU3MkMsIDB4NTcyQSwgMHg1NzMzLCAweDU3MzksIDB4NTcyRSwgMHg1NzJGLCAweDU3NUMsIDB4NTczQiwKLSAgICAweDU3NDIsIDB4NTc2OSwgMHg1Nzg1LCAweDU3NkIsIDB4NTc4NiwgMHg1NzdDLCAweDU3N0IsIDB4NTc2OCwKLSAgICAweDU3NkQsIDB4NTc3NiwgMHg1NzczLCAweDU3QUQsIDB4NTdBNCwgMHg1NzhDLCAweDU3QjIsIDB4NTdDRiwKLSAgICAweDU3QTcsIDB4NTdCNCwgMHg1NzkzLCAweDU3QTAsIDB4NTdENSwgMHg1N0Q4LCAweDU3REEsIDB4NTdEOSwKLSAgICAweDU3RDIsIDB4NTdCOCwgMHg1N0Y0LCAweDU3RUYsIDB4NTdGOCwgMHg1N0U0LCAweDU3REQsIDB4NTgwQiwKLSAgICAweDU4MEQsIDB4NTdGRCwgMHg1N0VELCAweDU4MDAsIDB4NTgxRSwgMHg1ODE5LCAweDU4NDQsIDB4NTgyMCwKLSAgICAweDU4NjUsIDB4NTg2QywgMHg1ODgxLCAweDU4ODksIDB4NTg5QSwgMHg1ODgwLCAweDk5QTgsIDB4OUYxOSwKLSAgICAweDYxRkYsIDB4ODI3OSwgMHg4MjdELCAweDgyN0YsIDB4ODI4RiwgMHg4MjhBLCAweDgyQTgsIDB4ODI4NCwKLSAgICAweDgyOEUsIDB4ODI5MSwgMHg4Mjk3LCAweDgyOTksIDB4ODJBQiwgMHg4MkI4LCAweDgyQkUsIDB4ODJCMCwKLSAgICAweDgyQzgsIDB4ODJDQSwgMHg4MkUzLCAweDgyOTgsIDB4ODJCNywgMHg4MkFFLCAweDgyQ0IsIDB4ODJDQywKLSAgICAweDgyQzEsIDB4ODJBOSwgMHg4MkI0LCAweDgyQTEsIDB4ODJBQSwgMHg4MjlGLCAweDgyQzQsIDB4ODJDRSwKLSAgICAweDgyQTQsIDB4ODJFMSwgMHg4MzA5LCAweDgyRjcsIDB4ODJFNCwgMHg4MzBGLCAweDgzMDcsIDB4ODJEQywKLSAgICAweDgyRjQsIDB4ODJEMiwgMHg4MkQ4LCAweDgzMEMsIDB4ODJGQiwgMHg4MkQzLCAweDgzMTEsIDB4ODMxQSwKLSAgICAweDgzMDYsIDB4ODMxNCwgMHg4MzE1LCAweDgyRTAsIDB4ODJENSwgMHg4MzFDLCAweDgzNTEsIDB4ODM1QiwKLSAgICAweDgzNUMsIDB4ODMwOCwgMHg4MzkyLCAweDgzM0MsIDB4ODMzNCwgMHg4MzMxLCAweDgzOUIsIDB4ODM1RSwKLSAgICAweDgzMkYsIDB4ODM0RiwgMHg4MzQ3LCAweDgzNDMsIDB4ODM1RiwgMHg4MzQwLCAweDgzMTcsIDB4ODM2MCwKLSAgICAweDgzMkQsIDB4ODMzQSwgMHg4MzMzLCAweDgzNjYsIDB4ODM2NSwgMHg4MzY4LCAweDgzMUIsIDB4ODM2OSwKLSAgICAweDgzNkMsIDB4ODM2QSwgMHg4MzZELCAweDgzNkUsIDB4ODNCMCwgMHg4Mzc4LCAweDgzQjMsIDB4ODNCNCwKLSAgICAweDgzQTAsIDB4ODNBQSwgMHg4MzkzLCAweDgzOUMsIDB4ODM4NSwgMHg4MzdDLCAweDgzQjYsIDB4ODNBOSwKLSAgICAweDgzN0QsIDB4ODNCOCwgMHg4MzdCLCAweDgzOTgsIDB4ODM5RSwgMHg4M0E4LCAweDgzQkEsIDB4ODNCQywKLSAgICAweDgzQzEsIDB4ODQwMSwgMHg4M0U1LCAweDgzRDgsIDB4NTgwNywgMHg4NDE4LCAweDg0MEIsIDB4ODNERCwKLSAgICAweDgzRkQsIDB4ODNENiwgMHg4NDFDLCAweDg0MzgsIDB4ODQxMSwgMHg4NDA2LCAweDgzRDQsIDB4ODNERiwKLSAgICAweDg0MEYsIDB4ODQwMywgMHg4M0Y4LCAweDgzRjksIDB4ODNFQSwgMHg4M0M1LCAweDgzQzAsIDB4ODQyNiwKLSAgICAweDgzRjAsIDB4ODNFMSwgMHg4NDVDLCAweDg0NTEsIDB4ODQ1QSwgMHg4NDU5LCAweDg0NzMsIDB4ODQ4NywKLSAgICAweDg0ODgsIDB4ODQ3QSwgMHg4NDg5LCAweDg0NzgsIDB4ODQzQywgMHg4NDQ2LCAweDg0NjksIDB4ODQ3NiwKLSAgICAweDg0OEMsIDB4ODQ4RSwgMHg4NDMxLCAweDg0NkQsIDB4ODRDMSwgMHg4NENELCAweDg0RDAsIDB4ODRFNiwKLSAgICAweDg0QkQsIDB4ODREMywgMHg4NENBLCAweDg0QkYsIDB4ODRCQSwgMHg4NEUwLCAweDg0QTEsIDB4ODRCOSwKLSAgICAweDg0QjQsIDB4ODQ5NywgMHg4NEU1LCAweDg0RTMsIDB4ODUwQywgMHg3NTBELCAweDg1MzgsIDB4ODRGMCwKLSAgICAweDg1MzksIDB4ODUxRiwgMHg4NTNBLCAweDg1NTYsIDB4ODUzQiwgMHg4NEZGLCAweDg0RkMsIDB4ODU1OSwKLSAgICAweDg1NDgsIDB4ODU2OCwgMHg4NTY0LCAweDg1NUUsIDB4ODU3QSwgMHg3N0EyLCAweDg1NDMsIDB4ODU3MiwKLSAgICAweDg1N0IsIDB4ODVBNCwgMHg4NUE4LCAweDg1ODcsIDB4ODU4RiwgMHg4NTc5LCAweDg1QUUsIDB4ODU5QywKLSAgICAweDg1ODUsIDB4ODVCOSwgMHg4NUI3LCAweDg1QjAsIDB4ODVEMywgMHg4NUMxLCAweDg1REMsIDB4ODVGRiwKLSAgICAweDg2MjcsIDB4ODYwNSwgMHg4NjI5LCAweDg2MTYsIDB4ODYzQywgMHg1RUZFLCAweDVGMDgsIDB4NTkzQywKLSAgICAweDU5NDEsIDB4ODAzNywgMHg1OTU1LCAweDU5NUEsIDB4NTk1OCwgMHg1MzBGLCAweDVDMjIsIDB4NUMyNSwKLSAgICAweDVDMkMsIDB4NUMzNCwgMHg2MjRDLCAweDYyNkEsIDB4NjI5RiwgMHg2MkJCLCAweDYyQ0EsIDB4NjJEQSwKLSAgICAweDYyRDcsIDB4NjJFRSwgMHg2MzIyLCAweDYyRjYsIDB4NjMzOSwgMHg2MzRCLCAweDYzNDMsIDB4NjNBRCwKLSAgICAweDYzRjYsIDB4NjM3MSwgMHg2MzdBLCAweDYzOEUsIDB4NjNCNCwgMHg2MzZELCAweDYzQUMsIDB4NjM4QSwKLSAgICAweDYzNjksIDB4NjNBRSwgMHg2M0JDLCAweDYzRjIsIDB4NjNGOCwgMHg2M0UwLCAweDYzRkYsIDB4NjNDNCwKLSAgICAweDYzREUsIDB4NjNDRSwgMHg2NDUyLCAweDYzQzYsIDB4NjNCRSwgMHg2NDQ1LCAweDY0NDEsIDB4NjQwQiwKLSAgICAweDY0MUIsIDB4NjQyMCwgMHg2NDBDLCAweDY0MjYsIDB4NjQyMSwgMHg2NDVFLCAweDY0ODQsIDB4NjQ2RCwKLSAgICAweDY0OTYsIDB4NjQ3QSwgMHg2NEI3LCAweDY0QjgsIDB4NjQ5OSwgMHg2NEJBLCAweDY0QzAsIDB4NjREMCwKLSAgICAweDY0RDcsIDB4NjRFNCwgMHg2NEUyLCAweDY1MDksIDB4NjUyNSwgMHg2NTJFLCAweDVGMEIsIDB4NUZEMiwKLSAgICAweDc1MTksIDB4NUYxMSwgMHg1MzVGLCAweDUzRjEsIDB4NTNGRCwgMHg1M0U5LCAweDUzRTgsIDB4NTNGQiwKLSAgICAweDU0MTIsIDB4NTQxNiwgMHg1NDA2LCAweDU0NEIsIDB4NTQ1MiwgMHg1NDUzLCAweDU0NTQsIDB4NTQ1NiwKLSAgICAweDU0NDMsIDB4NTQyMSwgMHg1NDU3LCAweDU0NTksIDB4NTQyMywgMHg1NDMyLCAweDU0ODIsIDB4NTQ5NCwKLSAgICAweDU0NzcsIDB4NTQ3MSwgMHg1NDY0LCAweDU0OUEsIDB4NTQ5QiwgMHg1NDg0LCAweDU0NzYsIDB4NTQ2NiwKLSAgICAweDU0OUQsIDB4NTREMCwgMHg1NEFELCAweDU0QzIsIDB4NTRCNCwgMHg1NEQyLCAweDU0QTcsIDB4NTRBNiwKLSAgICAweDU0RDMsIDB4NTRENCwgMHg1NDcyLCAweDU0QTMsIDB4NTRENSwgMHg1NEJCLCAweDU0QkYsIDB4NTRDQywKLSAgICAweDU0RDksIDB4NTREQSwgMHg1NERDLCAweDU0QTksIDB4NTRBQSwgMHg1NEE0LCAweDU0REQsIDB4NTRDRiwKLSAgICAweDU0REUsIDB4NTUxQiwgMHg1NEU3LCAweDU1MjAsIDB4NTRGRCwgMHg1NTE0LCAweDU0RjMsIDB4NTUyMiwKLSAgICAweDU1MjMsIDB4NTUwRiwgMHg1NTExLCAweDU1MjcsIDB4NTUyQSwgMHg1NTY3LCAweDU1OEYsIDB4NTVCNSwKLSAgICAweDU1NDksIDB4NTU2RCwgMHg1NTQxLCAweDU1NTUsIDB4NTUzRiwgMHg1NTUwLCAweDU1M0MsIDB4NTUzNywKLSAgICAweDU1NTYsIDB4NTU3NSwgMHg1NTc2LCAweDU1NzcsIDB4NTUzMywgMHg1NTMwLCAweDU1NUMsIDB4NTU4QiwKLSAgICAweDU1RDIsIDB4NTU4MywgMHg1NUIxLCAweDU1QjksIDB4NTU4OCwgMHg1NTgxLCAweDU1OUYsIDB4NTU3RSwKLSAgICAweDU1RDYsIDB4NTU5MSwgMHg1NTdCLCAweDU1REYsIDB4NTVCRCwgMHg1NUJFLCAweDU1OTQsIDB4NTU5OSwKLSAgICAweDU1RUEsIDB4NTVGNywgMHg1NUM5LCAweDU2MUYsIDB4NTVEMSwgMHg1NUVCLCAweDU1RUMsIDB4NTVENCwKLSAgICAweDU1RTYsIDB4NTVERCwgMHg1NUM0LCAweDU1RUYsIDB4NTVFNSwgMHg1NUYyLCAweDU1RjMsIDB4NTVDQywKLSAgICAweDU1Q0QsIDB4NTVFOCwgMHg1NUY1LCAweDU1RTQsIDB4OEY5NCwgMHg1NjFFLCAweDU2MDgsIDB4NTYwQywKLSAgICAweDU2MDEsIDB4NTYyNCwgMHg1NjIzLCAweDU1RkUsIDB4NTYwMCwgMHg1NjI3LCAweDU2MkQsIDB4NTY1OCwKLSAgICAweDU2MzksIDB4NTY1NywgMHg1NjJDLCAweDU2NEQsIDB4NTY2MiwgMHg1NjU5LCAweDU2NUMsIDB4NTY0QywKLSAgICAweDU2NTQsIDB4NTY4NiwgMHg1NjY0LCAweDU2NzEsIDB4NTY2QiwgMHg1NjdCLCAweDU2N0MsIDB4NTY4NSwKLSAgICAweDU2OTMsIDB4NTZBRiwgMHg1NkQ0LCAweDU2RDcsIDB4NTZERCwgMHg1NkUxLCAweDU2RjUsIDB4NTZFQiwKLSAgICAweDU2RjksIDB4NTZGRiwgMHg1NzA0LCAweDU3MEEsIDB4NTcwOSwgMHg1NzFDLCAweDVFMEYsIDB4NUUxOSwKLSAgICAweDVFMTQsIDB4NUUxMSwgMHg1RTMxLCAweDVFM0IsIDB4NUUzQywgMHg1RTM3LCAweDVFNDQsIDB4NUU1NCwKLSAgICAweDVFNUIsIDB4NUU1RSwgMHg1RTYxLCAweDVDOEMsIDB4NUM3QSwgMHg1QzhELCAweDVDOTAsIDB4NUM5NiwKLSAgICAweDVDODgsIDB4NUM5OCwgMHg1Qzk5LCAweDVDOTEsIDB4NUM5QSwgMHg1QzlDLCAweDVDQjUsIDB4NUNBMiwKLSAgICAweDVDQkQsIDB4NUNBQywgMHg1Q0FCLCAweDVDQjEsIDB4NUNBMywgMHg1Q0MxLCAweDVDQjcsIDB4NUNDNCwKLSAgICAweDVDRDIsIDB4NUNFNCwgMHg1Q0NCLCAweDVDRTUsIDB4NUQwMiwgMHg1RDAzLCAweDVEMjcsIDB4NUQyNiwKLSAgICAweDVEMkUsIDB4NUQyNCwgMHg1RDFFLCAweDVEMDYsIDB4NUQxQiwgMHg1RDU4LCAweDVEM0UsIDB4NUQzNCwKLSAgICAweDVEM0QsIDB4NUQ2QywgMHg1RDVCLCAweDVENkYsIDB4NUQ1RCwgMHg1RDZCLCAweDVENEIsIDB4NUQ0QSwKLSAgICAweDVENjksIDB4NUQ3NCwgMHg1RDgyLCAweDVEOTksIDB4NUQ5RCwgMHg4QzczLCAweDVEQjcsIDB4NURDNSwKLSAgICAweDVGNzMsIDB4NUY3NywgMHg1RjgyLCAweDVGODcsIDB4NUY4OSwgMHg1RjhDLCAweDVGOTUsIDB4NUY5OSwKLSAgICAweDVGOUMsIDB4NUZBOCwgMHg1RkFELCAweDVGQjUsIDB4NUZCQywgMHg4ODYyLCAweDVGNjEsIDB4NzJBRCwKLSAgICAweDcyQjAsIDB4NzJCNCwgMHg3MkI3LCAweDcyQjgsIDB4NzJDMywgMHg3MkMxLCAweDcyQ0UsIDB4NzJDRCwKLSAgICAweDcyRDIsIDB4NzJFOCwgMHg3MkVGLCAweDcyRTksIDB4NzJGMiwgMHg3MkY0LCAweDcyRjcsIDB4NzMwMSwKLSAgICAweDcyRjMsIDB4NzMwMywgMHg3MkZBLCAweDcyRkIsIDB4NzMxNywgMHg3MzEzLCAweDczMjEsIDB4NzMwQSwKLSAgICAweDczMUUsIDB4NzMxRCwgMHg3MzE1LCAweDczMjIsIDB4NzMzOSwgMHg3MzI1LCAweDczMkMsIDB4NzMzOCwKLSAgICAweDczMzEsIDB4NzM1MCwgMHg3MzRELCAweDczNTcsIDB4NzM2MCwgMHg3MzZDLCAweDczNkYsIDB4NzM3RSwKLSAgICAweDgyMUIsIDB4NTkyNSwgMHg5OEU3LCAweDU5MjQsIDB4NTkwMiwgMHg5OTYzLCAweDk5NjcsIDB4OTk2OCwKLSAgICAweDk5NjksIDB4OTk2QSwgMHg5OTZCLCAweDk5NkMsIDB4OTk3NCwgMHg5OTc3LCAweDk5N0QsIDB4OTk4MCwKLSAgICAweDk5ODQsIDB4OTk4NywgMHg5OThBLCAweDk5OEQsIDB4OTk5MCwgMHg5OTkxLCAweDk5OTMsIDB4OTk5NCwKLSAgICAweDk5OTUsIDB4NUU4MCwgMHg1RTkxLCAweDVFOEIsIDB4NUU5NiwgMHg1RUE1LCAweDVFQTAsIDB4NUVCOSwKLSAgICAweDVFQjUsIDB4NUVCRSwgMHg1RUIzLCAweDhENTMsIDB4NUVEMiwgMHg1RUQxLCAweDVFREIsIDB4NUVFOCwKLSAgICAweDVFRUEsIDB4ODFCQSwgMHg1RkM0LCAweDVGQzksIDB4NUZENiwgMHg1RkNGLCAweDYwMDMsIDB4NUZFRSwKLSAgICAweDYwMDQsIDB4NUZFMSwgMHg1RkU0LCAweDVGRkUsIDB4NjAwNSwgMHg2MDA2LCAweDVGRUEsIDB4NUZFRCwKLSAgICAweDVGRjgsIDB4NjAxOSwgMHg2MDM1LCAweDYwMjYsIDB4NjAxQiwgMHg2MDBGLCAweDYwMEQsIDB4NjAyOSwKLSAgICAweDYwMkIsIDB4NjAwQSwgMHg2MDNGLCAweDYwMjEsIDB4NjA3OCwgMHg2MDc5LCAweDYwN0IsIDB4NjA3QSwKLSAgICAweDYwNDIsIDB4NjA2QSwgMHg2MDdELCAweDYwOTYsIDB4NjA5QSwgMHg2MEFELCAweDYwOUQsIDB4NjA4MywKLSAgICAweDYwOTIsIDB4NjA4QywgMHg2MDlCLCAweDYwRUMsIDB4NjBCQiwgMHg2MEIxLCAweDYwREQsIDB4NjBEOCwKLSAgICAweDYwQzYsIDB4NjBEQSwgMHg2MEI0LCAweDYxMjAsIDB4NjEyNiwgMHg2MTE1LCAweDYxMjMsIDB4NjBGNCwKLSAgICAweDYxMDAsIDB4NjEwRSwgMHg2MTJCLCAweDYxNEEsIDB4NjE3NSwgMHg2MUFDLCAweDYxOTQsIDB4NjFBNywKLSAgICAweDYxQjcsIDB4NjFENCwgMHg2MUY1LCAweDVGREQsIDB4OTZCMywgMHg5NUU5LCAweDk1RUIsIDB4OTVGMSwKLSAgICAweDk1RjMsIDB4OTVGNSwgMHg5NUY2LCAweDk1RkMsIDB4OTVGRSwgMHg5NjAzLCAweDk2MDQsIDB4OTYwNiwKLSAgICAweDk2MDgsIDB4OTYwQSwgMHg5NjBCLCAweDk2MEMsIDB4OTYwRCwgMHg5NjBGLCAweDk2MTIsIDB4OTYxNSwKLSAgICAweDk2MTYsIDB4OTYxNywgMHg5NjE5LCAweDk2MUEsIDB4NEUyQywgMHg3MjNGLCAweDYyMTUsIDB4NkMzNSwKLSAgICAweDZDNTQsIDB4NkM1QywgMHg2QzRBLCAweDZDQTMsIDB4NkM4NSwgMHg2QzkwLCAweDZDOTQsIDB4NkM4QywKLSAgICAweDZDNjgsIDB4NkM2OSwgMHg2Qzc0LCAweDZDNzYsIDB4NkM4NiwgMHg2Q0E5LCAweDZDRDAsIDB4NkNENCwKLSAgICAweDZDQUQsIDB4NkNGNywgMHg2Q0Y4LCAweDZDRjEsIDB4NkNENywgMHg2Q0IyLCAweDZDRTAsIDB4NkNENiwKLSAgICAweDZDRkEsIDB4NkNFQiwgMHg2Q0VFLCAweDZDQjEsIDB4NkNEMywgMHg2Q0VGLCAweDZDRkUsIDB4NkQzOSwKLSAgICAweDZEMjcsIDB4NkQwQywgMHg2RDQzLCAweDZENDgsIDB4NkQwNywgMHg2RDA0LCAweDZEMTksIDB4NkQwRSwKLSAgICAweDZEMkIsIDB4NkQ0RCwgMHg2RDJFLCAweDZEMzUsIDB4NkQxQSwgMHg2RDRGLCAweDZENTIsIDB4NkQ1NCwKLSAgICAweDZEMzMsIDB4NkQ5MSwgMHg2RDZGLCAweDZEOUUsIDB4NkRBMCwgMHg2RDVFLCAweDZEOTMsIDB4NkQ5NCwKLSAgICAweDZENUMsIDB4NkQ2MCwgMHg2RDdDLCAweDZENjMsIDB4NkUxQSwgMHg2REM3LCAweDZEQzUsIDB4NkRERSwKLSAgICAweDZFMEUsIDB4NkRCRiwgMHg2REUwLCAweDZFMTEsIDB4NkRFNiwgMHg2RERELCAweDZERDksIDB4NkUxNiwKLSAgICAweDZEQUIsIDB4NkUwQywgMHg2REFFLCAweDZFMkIsIDB4NkU2RSwgMHg2RTRFLCAweDZFNkIsIDB4NkVCMiwKLSAgICAweDZFNUYsIDB4NkU4NiwgMHg2RTUzLCAweDZFNTQsIDB4NkUzMiwgMHg2RTI1LCAweDZFNDQsIDB4NkVERiwKLSAgICAweDZFQjEsIDB4NkU5OCwgMHg2RUUwLCAweDZGMkQsIDB4NkVFMiwgMHg2RUE1LCAweDZFQTcsIDB4NkVCRCwKLSAgICAweDZFQkIsIDB4NkVCNywgMHg2RUQ3LCAweDZFQjQsIDB4NkVDRiwgMHg2RThGLCAweDZFQzIsIDB4NkU5RiwKLSAgICAweDZGNjIsIDB4NkY0NiwgMHg2RjQ3LCAweDZGMjQsIDB4NkYxNSwgMHg2RUY5LCAweDZGMkYsIDB4NkYzNiwKLSAgICAweDZGNEIsIDB4NkY3NCwgMHg2RjJBLCAweDZGMDksIDB4NkYyOSwgMHg2Rjg5LCAweDZGOEQsIDB4NkY4QywKLSAgICAweDZGNzgsIDB4NkY3MiwgMHg2RjdDLCAweDZGN0EsIDB4NkZEMSwgMHg2RkM5LCAweDZGQTcsIDB4NkZCOSwKLSAgICAweDZGQjYsIDB4NkZDMiwgMHg2RkUxLCAweDZGRUUsIDB4NkZERSwgMHg2RkUwLCAweDZGRUYsIDB4NzAxQSwKLSAgICAweDcwMjMsIDB4NzAxQiwgMHg3MDM5LCAweDcwMzUsIDB4NzA0RiwgMHg3MDVFLCAweDVCODAsIDB4NUI4NCwKLSAgICAweDVCOTUsIDB4NUI5MywgMHg1QkE1LCAweDVCQjgsIDB4NzUyRiwgMHg5QTlFLCAweDY0MzQsIDB4NUJFNCwKLSAgICAweDVCRUUsIDB4ODkzMCwgMHg1QkYwLCAweDhFNDcsIDB4OEIwNywgMHg4RkI2LCAweDhGRDMsIDB4OEZENSwKLSAgICAweDhGRTUsIDB4OEZFRSwgMHg4RkU0LCAweDhGRTksIDB4OEZFNiwgMHg4RkYzLCAweDhGRTgsIDB4OTAwNSwKLSAgICAweDkwMDQsIDB4OTAwQiwgMHg5MDI2LCAweDkwMTEsIDB4OTAwRCwgMHg5MDE2LCAweDkwMjEsIDB4OTAzNSwKLSAgICAweDkwMzYsIDB4OTAyRCwgMHg5MDJGLCAweDkwNDQsIDB4OTA1MSwgMHg5MDUyLCAweDkwNTAsIDB4OTA2OCwKLSAgICAweDkwNTgsIDB4OTA2MiwgMHg5MDVCLCAweDY2QjksIDB4OTA3NCwgMHg5MDdELCAweDkwODIsIDB4OTA4OCwKLSAgICAweDkwODMsIDB4OTA4QiwgMHg1RjUwLCAweDVGNTcsIDB4NUY1NiwgMHg1RjU4LCAweDVDM0IsIDB4NTRBQiwKLSAgICAweDVDNTAsIDB4NUM1OSwgMHg1QjcxLCAweDVDNjMsIDB4NUM2NiwgMHg3RkJDLCAweDVGMkEsIDB4NUYyOSwKLSAgICAweDVGMkQsIDB4ODI3NCwgMHg1RjNDLCAweDlCM0IsIDB4NUM2RSwgMHg1OTgxLCAweDU5ODMsIDB4NTk4RCwKLSAgICAweDU5QTksIDB4NTlBQSwgMHg1OUEzLCAweDU5OTcsIDB4NTlDQSwgMHg1OUFCLCAweDU5OUUsIDB4NTlBNCwKLSAgICAweDU5RDIsIDB4NTlCMiwgMHg1OUFGLCAweDU5RDcsIDB4NTlCRSwgMHg1QTA1LCAweDVBMDYsIDB4NTlERCwKLSAgICAweDVBMDgsIDB4NTlFMywgMHg1OUQ4LCAweDU5RjksIDB4NUEwQywgMHg1QTA5LCAweDVBMzIsIDB4NUEzNCwKLSAgICAweDVBMTEsIDB4NUEyMywgMHg1QTEzLCAweDVBNDAsIDB4NUE2NywgMHg1QTRBLCAweDVBNTUsIDB4NUEzQywKLSAgICAweDVBNjIsIDB4NUE3NSwgMHg4MEVDLCAweDVBQUEsIDB4NUE5QiwgMHg1QTc3LCAweDVBN0EsIDB4NUFCRSwKLSAgICAweDVBRUIsIDB4NUFCMiwgMHg1QUQyLCAweDVBRDQsIDB4NUFCOCwgMHg1QUUwLCAweDVBRTMsIDB4NUFGMSwKLSAgICAweDVBRDYsIDB4NUFFNiwgMHg1QUQ4LCAweDVBREMsIDB4NUIwOSwgMHg1QjE3LCAweDVCMTYsIDB4NUIzMiwKLSAgICAweDVCMzcsIDB4NUI0MCwgMHg1QzE1LCAweDVDMUMsIDB4NUI1QSwgMHg1QjY1LCAweDVCNzMsIDB4NUI1MSwKLSAgICAweDVCNTMsIDB4NUI2MiwgMHg5QTc1LCAweDlBNzcsIDB4OUE3OCwgMHg5QTdBLCAweDlBN0YsIDB4OUE3RCwKLSAgICAweDlBODAsIDB4OUE4MSwgMHg5QTg1LCAweDlBODgsIDB4OUE4QSwgMHg5QTkwLCAweDlBOTIsIDB4OUE5MywKLSAgICAweDlBOTYsIDB4OUE5OCwgMHg5QTlCLCAweDlBOUMsIDB4OUE5RCwgMHg5QTlGLCAweDlBQTAsIDB4OUFBMiwKLSAgICAweDlBQTMsIDB4OUFBNSwgMHg5QUE3LCAweDdFOUYsIDB4N0VBMSwgMHg3RUEzLCAweDdFQTUsIDB4N0VBOCwKLSAgICAweDdFQTksIDB4N0VBRCwgMHg3RUIwLCAweDdFQkUsIDB4N0VDMCwgMHg3RUMxLCAweDdFQzIsIDB4N0VDOSwKLSAgICAweDdFQ0IsIDB4N0VDQywgMHg3RUQwLCAweDdFRDQsIDB4N0VENywgMHg3RURCLCAweDdFRTAsIDB4N0VFMSwKLSAgICAweDdFRTgsIDB4N0VFQiwgMHg3RUVFLCAweDdFRUYsIDB4N0VGMSwgMHg3RUYyLCAweDdGMEQsIDB4N0VGNiwKLSAgICAweDdFRkEsIDB4N0VGQiwgMHg3RUZFLCAweDdGMDEsIDB4N0YwMiwgMHg3RjAzLCAweDdGMDcsIDB4N0YwOCwKLSAgICAweDdGMEIsIDB4N0YwQywgMHg3RjBGLCAweDdGMTEsIDB4N0YxMiwgMHg3RjE3LCAweDdGMTksIDB4N0YxQywKLSAgICAweDdGMUIsIDB4N0YxRiwgMHg3RjIxLCAweDdGMjIsIDB4N0YyMywgMHg3RjI0LCAweDdGMjUsIDB4N0YyNiwKLSAgICAweDdGMjcsIDB4N0YyQSwgMHg3RjJCLCAweDdGMkMsIDB4N0YyRCwgMHg3RjJGLCAweDdGMzAsIDB4N0YzMSwKLSAgICAweDdGMzIsIDB4N0YzMywgMHg3RjM1LCAweDVFN0EsIDB4NzU3RiwgMHg1RERCLCAweDc1M0UsIDB4OTA5NSwKLSAgICAweDczOEUsIDB4NzM5MSwgMHg3M0FFLCAweDczQTIsIDB4NzM5RiwgMHg3M0NGLCAweDczQzIsIDB4NzNEMSwKLSAgICAweDczQjcsIDB4NzNCMywgMHg3M0MwLCAweDczQzksIDB4NzNDOCwgMHg3M0U1LCAweDczRDksIDB4OTg3QywKLSAgICAweDc0MEEsIDB4NzNFOSwgMHg3M0U3LCAweDczREUsIDB4NzNCQSwgMHg3M0YyLCAweDc0MEYsIDB4NzQyQSwKLSAgICAweDc0NUIsIDB4NzQyNiwgMHg3NDI1LCAweDc0MjgsIDB4NzQzMCwgMHg3NDJFLCAweDc0MkMsIDB4NzQxQiwKLSAgICAweDc0MUEsIDB4NzQ0MSwgMHg3NDVDLCAweDc0NTcsIDB4NzQ1NSwgMHg3NDU5LCAweDc0NzcsIDB4NzQ2RCwKLSAgICAweDc0N0UsIDB4NzQ5QywgMHg3NDhFLCAweDc0ODAsIDB4NzQ4MSwgMHg3NDg3LCAweDc0OEIsIDB4NzQ5RSwKLSAgICAweDc0QTgsIDB4NzRBOSwgMHg3NDkwLCAweDc0QTcsIDB4NzREMiwgMHg3NEJBLCAweDk3RUEsIDB4OTdFQiwKLSAgICAweDk3RUMsIDB4Njc0QywgMHg2NzUzLCAweDY3NUUsIDB4Njc0OCwgMHg2NzY5LCAweDY3QTUsIDB4Njc4NywKLSAgICAweDY3NkEsIDB4Njc3MywgMHg2Nzk4LCAweDY3QTcsIDB4Njc3NSwgMHg2N0E4LCAweDY3OUUsIDB4NjdBRCwKLSAgICAweDY3OEIsIDB4Njc3NywgMHg2NzdDLCAweDY3RjAsIDB4NjgwOSwgMHg2N0Q4LCAweDY4MEEsIDB4NjdFOSwKLSAgICAweDY3QjAsIDB4NjgwQywgMHg2N0Q5LCAweDY3QjUsIDB4NjdEQSwgMHg2N0IzLCAweDY3REQsIDB4NjgwMCwKLSAgICAweDY3QzMsIDB4NjdCOCwgMHg2N0UyLCAweDY4MEUsIDB4NjdDMSwgMHg2N0ZELCAweDY4MzIsIDB4NjgzMywKLSAgICAweDY4NjAsIDB4Njg2MSwgMHg2ODRFLCAweDY4NjIsIDB4Njg0NCwgMHg2ODY0LCAweDY4ODMsIDB4NjgxRCwKLSAgICAweDY4NTUsIDB4Njg2NiwgMHg2ODQxLCAweDY4NjcsIDB4Njg0MCwgMHg2ODNFLCAweDY4NEEsIDB4Njg0OSwKLSAgICAweDY4MjksIDB4NjhCNSwgMHg2ODhGLCAweDY4NzQsIDB4Njg3NywgMHg2ODkzLCAweDY4NkIsIDB4NjhDMiwKLSAgICAweDY5NkUsIDB4NjhGQywgMHg2OTFGLCAweDY5MjAsIDB4NjhGOSwgMHg2OTI0LCAweDY4RjAsIDB4NjkwQiwKLSAgICAweDY5MDEsIDB4Njk1NywgMHg2OEUzLCAweDY5MTAsIDB4Njk3MSwgMHg2OTM5LCAweDY5NjAsIDB4Njk0MiwKLSAgICAweDY5NUQsIDB4Njk4NCwgMHg2OTZCLCAweDY5ODAsIDB4Njk5OCwgMHg2OTc4LCAweDY5MzQsIDB4NjlDQywKLSAgICAweDY5ODcsIDB4Njk4OCwgMHg2OUNFLCAweDY5ODksIDB4Njk2NiwgMHg2OTYzLCAweDY5NzksIDB4Njk5QiwKLSAgICAweDY5QTcsIDB4NjlCQiwgMHg2OUFCLCAweDY5QUQsIDB4NjlENCwgMHg2OUIxLCAweDY5QzEsIDB4NjlDQSwKLSAgICAweDY5REYsIDB4Njk5NSwgMHg2OUUwLCAweDY5OEQsIDB4NjlGRiwgMHg2QTJGLCAweDY5RUQsIDB4NkExNywKLSAgICAweDZBMTgsIDB4NkE2NSwgMHg2OUYyLCAweDZBNDQsIDB4NkEzRSwgMHg2QUEwLCAweDZBNTAsIDB4NkE1QiwKLSAgICAweDZBMzUsIDB4NkE4RSwgMHg2QTc5LCAweDZBM0QsIDB4NkEyOCwgMHg2QTU4LCAweDZBN0MsIDB4NkE5MSwKLSAgICAweDZBOTAsIDB4NkFBOSwgMHg2QTk3LCAweDZBQUIsIDB4NzMzNywgMHg3MzUyLCAweDZCODEsIDB4NkI4MiwKLSAgICAweDZCODcsIDB4NkI4NCwgMHg2QjkyLCAweDZCOTMsIDB4NkI4RCwgMHg2QjlBLCAweDZCOUIsIDB4NkJBMSwKLSAgICAweDZCQUEsIDB4OEY2QiwgMHg4RjZELCAweDhGNzEsIDB4OEY3MiwgMHg4RjczLCAweDhGNzUsIDB4OEY3NiwKLSAgICAweDhGNzgsIDB4OEY3NywgMHg4Rjc5LCAweDhGN0EsIDB4OEY3QywgMHg4RjdFLCAweDhGODEsIDB4OEY4MiwKLSAgICAweDhGODQsIDB4OEY4NywgMHg4RjhCLCAweDhGOEQsIDB4OEY4RSwgMHg4RjhGLCAweDhGOTgsIDB4OEY5QSwKLSAgICAweDhFQ0UsIDB4NjIwQiwgMHg2MjE3LCAweDYyMUIsIDB4NjIxRiwgMHg2MjIyLCAweDYyMjEsIDB4NjIyNSwKLSAgICAweDYyMjQsIDB4NjIyQywgMHg4MUU3LCAweDc0RUYsIDB4NzRGNCwgMHg3NEZGLCAweDc1MEYsIDB4NzUxMSwKLSAgICAweDc1MTMsIDB4NjUzNCwgMHg2NUVFLCAweDY1RUYsIDB4NjVGMCwgMHg2NjBBLCAweDY2MTksIDB4Njc3MiwKLSAgICAweDY2MDMsIDB4NjYxNSwgMHg2NjAwLCAweDcwODUsIDB4NjZGNywgMHg2NjFELCAweDY2MzQsIDB4NjYzMSwKLSAgICAweDY2MzYsIDB4NjYzNSwgMHg4MDA2LCAweDY2NUYsIDB4NjY1NCwgMHg2NjQxLCAweDY2NEYsIDB4NjY1NiwKLSAgICAweDY2NjEsIDB4NjY1NywgMHg2Njc3LCAweDY2ODQsIDB4NjY4QywgMHg2NkE3LCAweDY2OUQsIDB4NjZCRSwKLSAgICAweDY2REIsIDB4NjZEQywgMHg2NkU2LCAweDY2RTksIDB4OEQzMiwgMHg4RDMzLCAweDhEMzYsIDB4OEQzQiwKLSAgICAweDhEM0QsIDB4OEQ0MCwgMHg4RDQ1LCAweDhENDYsIDB4OEQ0OCwgMHg4RDQ5LCAweDhENDcsIDB4OEQ0RCwKLSAgICAweDhENTUsIDB4OEQ1OSwgMHg4OUM3LCAweDg5Q0EsIDB4ODlDQiwgMHg4OUNDLCAweDg5Q0UsIDB4ODlDRiwKLSAgICAweDg5RDAsIDB4ODlEMSwgMHg3MjZFLCAweDcyOUYsIDB4NzI1RCwgMHg3MjY2LCAweDcyNkYsIDB4NzI3RSwKLSAgICAweDcyN0YsIDB4NzI4NCwgMHg3MjhCLCAweDcyOEQsIDB4NzI4RiwgMHg3MjkyLCAweDYzMDgsIDB4NjMzMiwKLSAgICAweDYzQjAsIDB4NjQzRiwgMHg2NEQ4LCAweDgwMDQsIDB4NkJFQSwgMHg2QkYzLCAweDZCRkQsIDB4NkJGNSwKLSAgICAweDZCRjksIDB4NkMwNSwgMHg2QzA3LCAweDZDMDYsIDB4NkMwRCwgMHg2QzE1LCAweDZDMTgsIDB4NkMxOSwKLSAgICAweDZDMUEsIDB4NkMyMSwgMHg2QzI5LCAweDZDMjQsIDB4NkMyQSwgMHg2QzMyLCAweDY1MzUsIDB4NjU1NSwKLSAgICAweDY1NkIsIDB4NzI0RCwgMHg3MjUyLCAweDcyNTYsIDB4NzIzMCwgMHg4NjYyLCAweDUyMTYsIDB4ODA5RiwKLSAgICAweDgwOUMsIDB4ODA5MywgMHg4MEJDLCAweDY3MEEsIDB4ODBCRCwgMHg4MEIxLCAweDgwQUIsIDB4ODBBRCwKLSAgICAweDgwQjQsIDB4ODBCNywgMHg4MEU3LCAweDgwRTgsIDB4ODBFOSwgMHg4MEVBLCAweDgwREIsIDB4ODBDMiwKLSAgICAweDgwQzQsIDB4ODBEOSwgMHg4MENELCAweDgwRDcsIDB4NjcxMCwgMHg4MERELCAweDgwRUIsIDB4ODBGMSwKLSAgICAweDgwRjQsIDB4ODBFRCwgMHg4MTBELCAweDgxMEUsIDB4ODBGMiwgMHg4MEZDLCAweDY3MTUsIDB4ODExMiwKLSAgICAweDhDNUEsIDB4ODEzNiwgMHg4MTFFLCAweDgxMkMsIDB4ODExOCwgMHg4MTMyLCAweDgxNDgsIDB4ODE0QywKLSAgICAweDgxNTMsIDB4ODE3NCwgMHg4MTU5LCAweDgxNUEsIDB4ODE3MSwgMHg4MTYwLCAweDgxNjksIDB4ODE3QywKLSAgICAweDgxN0QsIDB4ODE2RCwgMHg4MTY3LCAweDU4NEQsIDB4NUFCNSwgMHg4MTg4LCAweDgxODIsIDB4ODE5MSwKLSAgICAweDZFRDUsIDB4ODFBMywgMHg4MUFBLCAweDgxQ0MsIDB4NjcyNiwgMHg4MUNBLCAweDgxQkIsIDB4ODFDMSwKLSAgICAweDgxQTYsIDB4NkIyNCwgMHg2QjM3LCAweDZCMzksIDB4NkI0MywgMHg2QjQ2LCAweDZCNTksIDB4OThEMSwKLSAgICAweDk4RDIsIDB4OThEMywgMHg5OEQ1LCAweDk4RDksIDB4OThEQSwgMHg2QkIzLCAweDVGNDAsIDB4NkJDMiwKLSAgICAweDg5RjMsIDB4NjU5MCwgMHg5RjUxLCAweDY1OTMsIDB4NjVCQywgMHg2NUM2LCAweDY1QzQsIDB4NjVDMywKLSAgICAweDY1Q0MsIDB4NjVDRSwgMHg2NUQyLCAweDY1RDYsIDB4NzA4MCwgMHg3MDlDLCAweDcwOTYsIDB4NzA5RCwKLSAgICAweDcwQkIsIDB4NzBDMCwgMHg3MEI3LCAweDcwQUIsIDB4NzBCMSwgMHg3MEU4LCAweDcwQ0EsIDB4NzExMCwKLSAgICAweDcxMTMsIDB4NzExNiwgMHg3MTJGLCAweDcxMzEsIDB4NzE3MywgMHg3MTVDLCAweDcxNjgsIDB4NzE0NSwKLSAgICAweDcxNzIsIDB4NzE0QSwgMHg3MTc4LCAweDcxN0EsIDB4NzE5OCwgMHg3MUIzLCAweDcxQjUsIDB4NzFBOCwKLSAgICAweDcxQTAsIDB4NzFFMCwgMHg3MUQ0LCAweDcxRTcsIDB4NzFGOSwgMHg3MjFELCAweDcyMjgsIDB4NzA2QywKLSAgICAweDcxMTgsIDB4NzE2NiwgMHg3MUI5LCAweDYyM0UsIDB4NjIzRCwgMHg2MjQzLCAweDYyNDgsIDB4NjI0OSwKLSAgICAweDc5M0IsIDB4Nzk0MCwgMHg3OTQ2LCAweDc5NDksIDB4Nzk1QiwgMHg3OTVDLCAweDc5NTMsIDB4Nzk1QSwKLSAgICAweDc5NjIsIDB4Nzk1NywgMHg3OTYwLCAweDc5NkYsIDB4Nzk2NywgMHg3OTdBLCAweDc5ODUsIDB4Nzk4QSwKLSAgICAweDc5OUEsIDB4NzlBNywgMHg3OUIzLCAweDVGRDEsIDB4NUZEMCwgMHg2MDNDLCAweDYwNUQsIDB4NjA1QSwKLSAgICAweDYwNjcsIDB4NjA0MSwgMHg2MDU5LCAweDYwNjMsIDB4NjBBQiwgMHg2MTA2LCAweDYxMEQsIDB4NjE1RCwKLSAgICAweDYxQTksIDB4NjE5RCwgMHg2MUNCLCAweDYxRDEsIDB4NjIwNiwgMHg4MDgwLCAweDgwN0YsIDB4NkM5MywKLSAgICAweDZDRjYsIDB4NkRGQywgMHg3N0Y2LCAweDc3RjgsIDB4NzgwMCwgMHg3ODA5LCAweDc4MTcsIDB4NzgxOCwKLSAgICAweDc4MTEsIDB4NjVBQiwgMHg3ODJELCAweDc4MUMsIDB4NzgxRCwgMHg3ODM5LCAweDc4M0EsIDB4NzgzQiwKLSAgICAweDc4MUYsIDB4NzgzQywgMHg3ODI1LCAweDc4MkMsIDB4NzgyMywgMHg3ODI5LCAweDc4NEUsIDB4Nzg2RCwKLSAgICAweDc4NTYsIDB4Nzg1NywgMHg3ODI2LCAweDc4NTAsIDB4Nzg0NywgMHg3ODRDLCAweDc4NkEsIDB4Nzg5QiwKLSAgICAweDc4OTMsIDB4Nzg5QSwgMHg3ODg3LCAweDc4OUMsIDB4NzhBMSwgMHg3OEEzLCAweDc4QjIsIDB4NzhCOSwKLSAgICAweDc4QTUsIDB4NzhENCwgMHg3OEQ5LCAweDc4QzksIDB4NzhFQywgMHg3OEYyLCAweDc5MDUsIDB4NzhGNCwKLSAgICAweDc5MTMsIDB4NzkyNCwgMHg3OTFFLCAweDc5MzQsIDB4OUY5QiwgMHg5RUY5LCAweDlFRkIsIDB4OUVGQywKLSAgICAweDc2RjEsIDB4NzcwNCwgMHg3NzBELCAweDc2RjksIDB4NzcwNywgMHg3NzA4LCAweDc3MUEsIDB4NzcyMiwKLSAgICAweDc3MTksIDB4NzcyRCwgMHg3NzI2LCAweDc3MzUsIDB4NzczOCwgMHg3NzUwLCAweDc3NTEsIDB4Nzc0NywKLSAgICAweDc3NDMsIDB4Nzc1QSwgMHg3NzY4LCAweDc3NjIsIDB4Nzc2NSwgMHg3NzdGLCAweDc3OEQsIDB4Nzc3RCwKLSAgICAweDc3ODAsIDB4Nzc4QywgMHg3NzkxLCAweDc3OUYsIDB4NzdBMCwgMHg3N0IwLCAweDc3QjUsIDB4NzdCRCwKLSAgICAweDc1M0EsIDB4NzU0MCwgMHg3NTRFLCAweDc1NEIsIDB4NzU0OCwgMHg3NTVCLCAweDc1NzIsIDB4NzU3OSwKLSAgICAweDc1ODMsIDB4N0Y1OCwgMHg3RjYxLCAweDdGNUYsIDB4OEE0OCwgMHg3RjY4LCAweDdGNzQsIDB4N0Y3MSwKLSAgICAweDdGNzksIDB4N0Y4MSwgMHg3RjdFLCAweDc2Q0QsIDB4NzZFNSwgMHg4ODMyLCAweDk0ODUsIDB4OTQ4NiwKLSAgICAweDk0ODcsIDB4OTQ4QiwgMHg5NDhBLCAweDk0OEMsIDB4OTQ4RCwgMHg5NDhGLCAweDk0OTAsIDB4OTQ5NCwKLSAgICAweDk0OTcsIDB4OTQ5NSwgMHg5NDlBLCAweDk0OUIsIDB4OTQ5QywgMHg5NEEzLCAweDk0QTQsIDB4OTRBQiwKLSAgICAweDk0QUEsIDB4OTRBRCwgMHg5NEFDLCAweDk0QUYsIDB4OTRCMCwgMHg5NEIyLCAweDk0QjQsIDB4OTRCNiwKLSAgICAweDk0QjcsIDB4OTRCOCwgMHg5NEI5LCAweDk0QkEsIDB4OTRCQywgMHg5NEJELCAweDk0QkYsIDB4OTRDNCwKLSAgICAweDk0QzgsIDB4OTRDOSwgMHg5NENBLCAweDk0Q0IsIDB4OTRDQywgMHg5NENELCAweDk0Q0UsIDB4OTREMCwKLSAgICAweDk0RDEsIDB4OTREMiwgMHg5NEQ1LCAweDk0RDYsIDB4OTRENywgMHg5NEQ5LCAweDk0RDgsIDB4OTREQiwKLSAgICAweDk0REUsIDB4OTRERiwgMHg5NEUwLCAweDk0RTIsIDB4OTRFNCwgMHg5NEU1LCAweDk0RTcsIDB4OTRFOCwKLSAgICAweDk0RUEsIDB4OTRFOSwgMHg5NEVCLCAweDk0RUUsIDB4OTRFRiwgMHg5NEYzLCAweDk0RjQsIDB4OTRGNSwKLSAgICAweDk0RjcsIDB4OTRGOSwgMHg5NEZDLCAweDk0RkQsIDB4OTRGRiwgMHg5NTAzLCAweDk1MDIsIDB4OTUwNiwKLSAgICAweDk1MDcsIDB4OTUwOSwgMHg5NTBBLCAweDk1MEQsIDB4OTUwRSwgMHg5NTBGLCAweDk1MTIsIDB4OTUxMywKLSAgICAweDk1MTQsIDB4OTUxNSwgMHg5NTE2LCAweDk1MTgsIDB4OTUxQiwgMHg5NTFELCAweDk1MUUsIDB4OTUxRiwKLSAgICAweDk1MjIsIDB4OTUyQSwgMHg5NTJCLCAweDk1MjksIDB4OTUyQywgMHg5NTMxLCAweDk1MzIsIDB4OTUzNCwKLSAgICAweDk1MzYsIDB4OTUzNywgMHg5NTM4LCAweDk1M0MsIDB4OTUzRSwgMHg5NTNGLCAweDk1NDIsIDB4OTUzNSwKLSAgICAweDk1NDQsIDB4OTU0NSwgMHg5NTQ2LCAweDk1NDksIDB4OTU0QywgMHg5NTRFLCAweDk1NEYsIDB4OTU1MiwKLSAgICAweDk1NTMsIDB4OTU1NCwgMHg5NTU2LCAweDk1NTcsIDB4OTU1OCwgMHg5NTU5LCAweDk1NUIsIDB4OTU1RSwKLSAgICAweDk1NUYsIDB4OTU1RCwgMHg5NTYxLCAweDk1NjIsIDB4OTU2NCwgMHg5NTY1LCAweDk1NjYsIDB4OTU2NywKLSAgICAweDk1NjgsIDB4OTU2OSwgMHg5NTZBLCAweDk1NkIsIDB4OTU2QywgMHg5NTZGLCAweDk1NzEsIDB4OTU3MiwKLSAgICAweDk1NzMsIDB4OTUzQSwgMHg3N0U3LCAweDc3RUMsIDB4OTZDOSwgMHg3OUQ1LCAweDc5RUQsIDB4NzlFMywKLSAgICAweDc5RUIsIDB4N0EwNiwgMHg1RDQ3LCAweDdBMDMsIDB4N0EwMiwgMHg3QTFFLCAweDdBMTQsIDB4N0EzOSwKLSAgICAweDdBMzcsIDB4N0E1MSwgMHg5RUNGLCAweDk5QTUsIDB4N0E3MCwgMHg3Njg4LCAweDc2OEUsIDB4NzY5MywKLSAgICAweDc2OTksIDB4NzZBNCwgMHg3NERFLCAweDc0RTAsIDB4NzUyQywgMHg5RTIwLCAweDlFMjIsIDB4OUUyOCwKLSAgICAweDlFMjksIDB4OUUyQSwgMHg5RTJCLCAweDlFMkMsIDB4OUUzMiwgMHg5RTMxLCAweDlFMzYsIDB4OUUzOCwKLSAgICAweDlFMzcsIDB4OUUzOSwgMHg5RTNBLCAweDlFM0UsIDB4OUU0MSwgMHg5RTQyLCAweDlFNDQsIDB4OUU0NiwKLSAgICAweDlFNDcsIDB4OUU0OCwgMHg5RTQ5LCAweDlFNEIsIDB4OUU0QywgMHg5RTRFLCAweDlFNTEsIDB4OUU1NSwKLSAgICAweDlFNTcsIDB4OUU1QSwgMHg5RTVCLCAweDlFNUMsIDB4OUU1RSwgMHg5RTYzLCAweDlFNjYsIDB4OUU2NywKLSAgICAweDlFNjgsIDB4OUU2OSwgMHg5RTZBLCAweDlFNkIsIDB4OUU2QywgMHg5RTcxLCAweDlFNkQsIDB4OUU3MywKLSAgICAweDc1OTIsIDB4NzU5NCwgMHg3NTk2LCAweDc1QTAsIDB4NzU5RCwgMHg3NUFDLCAweDc1QTMsIDB4NzVCMywKLSAgICAweDc1QjQsIDB4NzVCOCwgMHg3NUM0LCAweDc1QjEsIDB4NzVCMCwgMHg3NUMzLCAweDc1QzIsIDB4NzVENiwKLSAgICAweDc1Q0QsIDB4NzVFMywgMHg3NUU4LCAweDc1RTYsIDB4NzVFNCwgMHg3NUVCLCAweDc1RTcsIDB4NzYwMywKLSAgICAweDc1RjEsIDB4NzVGQywgMHg3NUZGLCAweDc2MTAsIDB4NzYwMCwgMHg3NjA1LCAweDc2MEMsIDB4NzYxNywKLSAgICAweDc2MEEsIDB4NzYyNSwgMHg3NjE4LCAweDc2MTUsIDB4NzYxOSwgMHg3NjFCLCAweDc2M0MsIDB4NzYyMiwKLSAgICAweDc2MjAsIDB4NzY0MCwgMHg3NjJELCAweDc2MzAsIDB4NzYzRiwgMHg3NjM1LCAweDc2NDMsIDB4NzYzRSwKLSAgICAweDc2MzMsIDB4NzY0RCwgMHg3NjVFLCAweDc2NTQsIDB4NzY1QywgMHg3NjU2LCAweDc2NkIsIDB4NzY2RiwKLSAgICAweDdGQ0EsIDB4N0FFNiwgMHg3QTc4LCAweDdBNzksIDB4N0E4MCwgMHg3QTg2LCAweDdBODgsIDB4N0E5NSwKLSAgICAweDdBQTYsIDB4N0FBMCwgMHg3QUFDLCAweDdBQTgsIDB4N0FBRCwgMHg3QUIzLCAweDg4NjQsIDB4ODg2OSwKLSAgICAweDg4NzIsIDB4ODg3RCwgMHg4ODdGLCAweDg4ODIsIDB4ODhBMiwgMHg4OEM2LCAweDg4QjcsIDB4ODhCQywKLSAgICAweDg4QzksIDB4ODhFMiwgMHg4OENFLCAweDg4RTMsIDB4ODhFNSwgMHg4OEYxLCAweDg5MUEsIDB4ODhGQywKLSAgICAweDg4RTgsIDB4ODhGRSwgMHg4OEYwLCAweDg5MjEsIDB4ODkxOSwgMHg4OTEzLCAweDg5MUIsIDB4ODkwQSwKLSAgICAweDg5MzQsIDB4ODkyQiwgMHg4OTM2LCAweDg5NDEsIDB4ODk2NiwgMHg4OTdCLCAweDc1OEIsIDB4ODBFNSwKLSAgICAweDc2QjIsIDB4NzZCNCwgMHg3N0RDLCAweDgwMTIsIDB4ODAxNCwgMHg4MDE2LCAweDgwMUMsIDB4ODAyMCwKLSAgICAweDgwMjIsIDB4ODAyNSwgMHg4MDI2LCAweDgwMjcsIDB4ODAyOSwgMHg4MDI4LCAweDgwMzEsIDB4ODAwQiwKLSAgICAweDgwMzUsIDB4ODA0MywgMHg4MDQ2LCAweDgwNEQsIDB4ODA1MiwgMHg4MDY5LCAweDgwNzEsIDB4ODk4MywKLSAgICAweDk4NzgsIDB4OTg4MCwgMHg5ODgzLCAweDk4ODksIDB4OTg4QywgMHg5ODhELCAweDk4OEYsIDB4OTg5NCwKLSAgICAweDk4OUEsIDB4OTg5QiwgMHg5ODlFLCAweDk4OUYsIDB4OThBMSwgMHg5OEEyLCAweDk4QTUsIDB4OThBNiwKLSAgICAweDg2NEQsIDB4ODY1NCwgMHg4NjZDLCAweDg2NkUsIDB4ODY3RiwgMHg4NjdBLCAweDg2N0MsIDB4ODY3QiwKLSAgICAweDg2QTgsIDB4ODY4RCwgMHg4NjhCLCAweDg2QUMsIDB4ODY5RCwgMHg4NkE3LCAweDg2QTMsIDB4ODZBQSwKLSAgICAweDg2OTMsIDB4ODZBOSwgMHg4NkI2LCAweDg2QzQsIDB4ODZCNSwgMHg4NkNFLCAweDg2QjAsIDB4ODZCQSwKLSAgICAweDg2QjEsIDB4ODZBRiwgMHg4NkM5LCAweDg2Q0YsIDB4ODZCNCwgMHg4NkU5LCAweDg2RjEsIDB4ODZGMiwKLSAgICAweDg2RUQsIDB4ODZGMywgMHg4NkQwLCAweDg3MTMsIDB4ODZERSwgMHg4NkY0LCAweDg2REYsIDB4ODZEOCwKLSAgICAweDg2RDEsIDB4ODcwMywgMHg4NzA3LCAweDg2RjgsIDB4ODcwOCwgMHg4NzBBLCAweDg3MEQsIDB4ODcwOSwKLSAgICAweDg3MjMsIDB4ODczQiwgMHg4NzFFLCAweDg3MjUsIDB4ODcyRSwgMHg4NzFBLCAweDg3M0UsIDB4ODc0OCwKLSAgICAweDg3MzQsIDB4ODczMSwgMHg4NzI5LCAweDg3MzcsIDB4ODczRiwgMHg4NzgyLCAweDg3MjIsIDB4ODc3RCwKLSAgICAweDg3N0UsIDB4ODc3QiwgMHg4NzYwLCAweDg3NzAsIDB4ODc0QywgMHg4NzZFLCAweDg3OEIsIDB4ODc1MywKLSAgICAweDg3NjMsIDB4ODc3QywgMHg4NzY0LCAweDg3NTksIDB4ODc2NSwgMHg4NzkzLCAweDg3QUYsIDB4ODdBOCwKLSAgICAweDg3RDIsIDB4ODdDNiwgMHg4Nzg4LCAweDg3ODUsIDB4ODdBRCwgMHg4Nzk3LCAweDg3ODMsIDB4ODdBQiwKLSAgICAweDg3RTUsIDB4ODdBQywgMHg4N0I1LCAweDg3QjMsIDB4ODdDQiwgMHg4N0QzLCAweDg3QkQsIDB4ODdEMSwKLSAgICAweDg3QzAsIDB4ODdDQSwgMHg4N0RCLCAweDg3RUEsIDB4ODdFMCwgMHg4N0VFLCAweDg4MTYsIDB4ODgxMywKLSAgICAweDg3RkUsIDB4ODgwQSwgMHg4ODFCLCAweDg4MjEsIDB4ODgzOSwgMHg4ODNDLCAweDdGMzYsIDB4N0Y0MiwKLSAgICAweDdGNDQsIDB4N0Y0NSwgMHg4MjEwLCAweDdBRkEsIDB4N0FGRCwgMHg3QjA4LCAweDdCMDMsIDB4N0IwNCwKLSAgICAweDdCMTUsIDB4N0IwQSwgMHg3QjJCLCAweDdCMEYsIDB4N0I0NywgMHg3QjM4LCAweDdCMkEsIDB4N0IxOSwKLSAgICAweDdCMkUsIDB4N0IzMSwgMHg3QjIwLCAweDdCMjUsIDB4N0IyNCwgMHg3QjMzLCAweDdCM0UsIDB4N0IxRSwKLSAgICAweDdCNTgsIDB4N0I1QSwgMHg3QjQ1LCAweDdCNzUsIDB4N0I0QywgMHg3QjVELCAweDdCNjAsIDB4N0I2RSwKLSAgICAweDdCN0IsIDB4N0I2MiwgMHg3QjcyLCAweDdCNzEsIDB4N0I5MCwgMHg3QkE2LCAweDdCQTcsIDB4N0JCOCwKLSAgICAweDdCQUMsIDB4N0I5RCwgMHg3QkE4LCAweDdCODUsIDB4N0JBQSwgMHg3QjlDLCAweDdCQTIsIDB4N0JBQiwKLSAgICAweDdCQjQsIDB4N0JEMSwgMHg3QkMxLCAweDdCQ0MsIDB4N0JERCwgMHg3QkRBLCAweDdCRTUsIDB4N0JFNiwKLSAgICAweDdCRUEsIDB4N0MwQywgMHg3QkZFLCAweDdCRkMsIDB4N0MwRiwgMHg3QzE2LCAweDdDMEIsIDB4N0MxRiwKLSAgICAweDdDMkEsIDB4N0MyNiwgMHg3QzM4LCAweDdDNDEsIDB4N0M0MCwgMHg4MUZFLCAweDgyMDEsIDB4ODIwMiwKLSAgICAweDgyMDQsIDB4ODFFQywgMHg4ODQ0LCAweDgyMjEsIDB4ODIyMiwgMHg4MjIzLCAweDgyMkQsIDB4ODIyRiwKLSAgICAweDgyMjgsIDB4ODIyQiwgMHg4MjM4LCAweDgyM0IsIDB4ODIzMywgMHg4MjM0LCAweDgyM0UsIDB4ODI0NCwKLSAgICAweDgyNDksIDB4ODI0QiwgMHg4MjRGLCAweDgyNUEsIDB4ODI1RiwgMHg4MjY4LCAweDg4N0UsIDB4ODg4NSwKLSAgICAweDg4ODgsIDB4ODhEOCwgMHg4OERGLCAweDg5NUUsIDB4N0Y5RCwgMHg3RjlGLCAweDdGQTcsIDB4N0ZBRiwKLSAgICAweDdGQjAsIDB4N0ZCMiwgMHg3QzdDLCAweDY1NDksIDB4N0M5MSwgMHg3QzlELCAweDdDOUMsIDB4N0M5RSwKLSAgICAweDdDQTIsIDB4N0NCMiwgMHg3Q0JDLCAweDdDQkQsIDB4N0NDMSwgMHg3Q0M3LCAweDdDQ0MsIDB4N0NDRCwKLSAgICAweDdDQzgsIDB4N0NDNSwgMHg3Q0Q3LCAweDdDRTgsIDB4ODI2RSwgMHg2NkE4LCAweDdGQkYsIDB4N0ZDRSwKLSAgICAweDdGRDUsIDB4N0ZFNSwgMHg3RkUxLCAweDdGRTYsIDB4N0ZFOSwgMHg3RkVFLCAweDdGRjMsIDB4N0NGOCwKLSAgICAweDdENzcsIDB4N0RBNiwgMHg3REFFLCAweDdFNDcsIDB4N0U5QiwgMHg5RUI4LCAweDlFQjQsIDB4OEQ3MywKLSAgICAweDhEODQsIDB4OEQ5NCwgMHg4RDkxLCAweDhEQjEsIDB4OEQ2NywgMHg4RDZELCAweDhDNDcsIDB4OEM0OSwKLSAgICAweDkxNEEsIDB4OTE1MCwgMHg5MTRFLCAweDkxNEYsIDB4OTE2NCwgMHg5MTYyLCAweDkxNjEsIDB4OTE3MCwKLSAgICAweDkxNjksIDB4OTE2RiwgMHg5MTdELCAweDkxN0UsIDB4OTE3MiwgMHg5MTc0LCAweDkxNzksIDB4OTE4QywKLSAgICAweDkxODUsIDB4OTE5MCwgMHg5MThELCAweDkxOTEsIDB4OTFBMiwgMHg5MUEzLCAweDkxQUEsIDB4OTFBRCwKLSAgICAweDkxQUUsIDB4OTFBRiwgMHg5MUI1LCAweDkxQjQsIDB4OTFCQSwgMHg4QzU1LCAweDlFN0UsIDB4OERCOCwKLSAgICAweDhERUIsIDB4OEUwNSwgMHg4RTU5LCAweDhFNjksIDB4OERCNSwgMHg4REJGLCAweDhEQkMsIDB4OERCQSwKLSAgICAweDhEQzQsIDB4OERENiwgMHg4REQ3LCAweDhEREEsIDB4OERERSwgMHg4RENFLCAweDhEQ0YsIDB4OEREQiwKLSAgICAweDhEQzYsIDB4OERFQywgMHg4REY3LCAweDhERjgsIDB4OERFMywgMHg4REY5LCAweDhERkIsIDB4OERFNCwKLSAgICAweDhFMDksIDB4OERGRCwgMHg4RTE0LCAweDhFMUQsIDB4OEUxRiwgMHg4RTJDLCAweDhFMkUsIDB4OEUyMywKLSAgICAweDhFMkYsIDB4OEUzQSwgMHg4RTQwLCAweDhFMzksIDB4OEUzNSwgMHg4RTNELCAweDhFMzEsIDB4OEU0OSwKLSAgICAweDhFNDEsIDB4OEU0MiwgMHg4RTUxLCAweDhFNTIsIDB4OEU0QSwgMHg4RTcwLCAweDhFNzYsIDB4OEU3QywKLSAgICAweDhFNkYsIDB4OEU3NCwgMHg4RTg1LCAweDhFOEYsIDB4OEU5NCwgMHg4RTkwLCAweDhFOUMsIDB4OEU5RSwKLSAgICAweDhDNzgsIDB4OEM4MiwgMHg4QzhBLCAweDhDODUsIDB4OEM5OCwgMHg4Qzk0LCAweDY1OUIsIDB4ODlENiwKLSAgICAweDg5REUsIDB4ODlEQSwgMHg4OURDLCAweDg5RTUsIDB4ODlFQiwgMHg4OUVGLCAweDhBM0UsIDB4OEIyNiwKLSAgICAweDk3NTMsIDB4OTZFOSwgMHg5NkYzLCAweDk2RUYsIDB4OTcwNiwgMHg5NzAxLCAweDk3MDgsIDB4OTcwRiwKLSAgICAweDk3MEUsIDB4OTcyQSwgMHg5NzJELCAweDk3MzAsIDB4OTczRSwgMHg5RjgwLCAweDlGODMsIDB4OUY4NSwKLSAgICAweDlGODYsIDB4OUY4NywgMHg5Rjg4LCAweDlGODksIDB4OUY4QSwgMHg5RjhDLCAweDlFRkUsIDB4OUYwQiwKLSAgICAweDlGMEQsIDB4OTZCOSwgMHg5NkJDLCAweDk2QkQsIDB4OTZDRSwgMHg5NkQyLCAweDc3QkYsIDB4OTZFMCwKLSAgICAweDkyOEUsIDB4OTJBRSwgMHg5MkM4LCAweDkzM0UsIDB4OTM2QSwgMHg5M0NBLCAweDkzOEYsIDB4OTQzRSwKLSAgICAweDk0NkIsIDB4OUM3RiwgMHg5QzgyLCAweDlDODUsIDB4OUM4NiwgMHg5Qzg3LCAweDlDODgsIDB4N0EyMywKLSAgICAweDlDOEIsIDB4OUM4RSwgMHg5QzkwLCAweDlDOTEsIDB4OUM5MiwgMHg5Qzk0LCAweDlDOTUsIDB4OUM5QSwKLSAgICAweDlDOUIsIDB4OUM5RSwgMHg5QzlGLCAweDlDQTAsIDB4OUNBMSwgMHg5Q0EyLCAweDlDQTMsIDB4OUNBNSwKLSAgICAweDlDQTYsIDB4OUNBNywgMHg5Q0E4LCAweDlDQTksIDB4OUNBQiwgMHg5Q0FELCAweDlDQUUsIDB4OUNCMCwKLSAgICAweDlDQjEsIDB4OUNCMiwgMHg5Q0IzLCAweDlDQjQsIDB4OUNCNSwgMHg5Q0I2LCAweDlDQjcsIDB4OUNCQSwKLSAgICAweDlDQkIsIDB4OUNCQywgMHg5Q0JELCAweDlDQzQsIDB4OUNDNSwgMHg5Q0M2LCAweDlDQzcsIDB4OUNDQSwKLSAgICAweDlDQ0IsIDB4OUNDQywgMHg5Q0NELCAweDlDQ0UsIDB4OUNDRiwgMHg5Q0QwLCAweDlDRDMsIDB4OUNENCwKLSAgICAweDlDRDUsIDB4OUNENywgMHg5Q0Q4LCAweDlDRDksIDB4OUNEQywgMHg5Q0RELCAweDlDREYsIDB4OUNFMiwKLSAgICAweDk3N0MsIDB4OTc4NSwgMHg5NzkxLCAweDk3OTIsIDB4OTc5NCwgMHg5N0FGLCAweDk3QUIsIDB4OTdBMywKLSAgICAweDk3QjIsIDB4OTdCNCwgMHg5QUIxLCAweDlBQjAsIDB4OUFCNywgMHg5RTU4LCAweDlBQjYsIDB4OUFCQSwKLSAgICAweDlBQkMsIDB4OUFDMSwgMHg5QUMwLCAweDlBQzUsIDB4OUFDMiwgMHg5QUNCLCAweDlBQ0MsIDB4OUFEMSwKLSAgICAweDlCNDUsIDB4OUI0MywgMHg5QjQ3LCAweDlCNDksIDB4OUI0OCwgMHg5QjRELCAweDlCNTEsIDB4OThFOCwKLSAgICAweDk5MEQsIDB4OTkyRSwgMHg5OTU1LCAweDk5NTQsIDB4OUFERiwgMHg5QUUxLCAweDlBRTYsIDB4OUFFRiwKLSAgICAweDlBRUIsIDB4OUFGQiwgMHg5QUVELCAweDlBRjksIDB4OUIwOCwgMHg5QjBGLCAweDlCMTMsIDB4OUIxRiwKLSAgICAweDlCMjMsIDB4OUVCRCwgMHg5RUJFLCAweDdFM0IsIDB4OUU4MiwgMHg5RTg3LCAweDlFODgsIDB4OUU4QiwKLSAgICAweDlFOTIsIDB4OTNENiwgMHg5RTlELCAweDlFOUYsIDB4OUVEQiwgMHg5RURDLCAweDlFREQsIDB4OUVFMCwKLSAgICAweDlFREYsIDB4OUVFMiwgMHg5RUU5LCAweDlFRTcsIDB4OUVFNSwgMHg5RUVBLCAweDlFRUYsIDB4OUYyMiwKLSAgICAweDlGMkMsIDB4OUYyRiwgMHg5RjM5LCAweDlGMzcsIDB4OUYzRCwgMHg5RjNFLCAweDlGNDQsIDB4MzAwNywKLSAgICAweEZGNUUsIDB4MjAxNiwgMHgzMDEzLCAweEZGMEUsIDB4RkYxRCwgMHhGRjNCLCAweEZGM0QsIDB4RkZFMywKLSAgICAweDAwRkMsIDB4MDBBOSwgMHgyMTIyLCAweDIwMjYsIDB4MDAyMCwgMHg3NjlBLCAweDg1RjksIDB4NzkxOSwKLSAgICAweDYxMUIsIDB4OUFBRiwgMHg4OTU2LCAweDU4RTksIDB4N0Y3NywgMHg2NEZBLCAweDY1NTcsIDB4OTgxMiwKLSAgICAweDhGQTYsIDB4N0Q0NiwgMHg1RTZCLCAweDdEODEsIDB4OTM4QSwgMHg4QjE3LCAweDk4RkQsIDB4NUJGNiwKLSAgICAweDU4MzEsIDB4OUI5MSwgMHg4RjI5LCAweDhDOUQsIDB4OTJDNywgMHg3MkZELCAweDUwOTksIDB4NjE4QSwKLSAgICAweDdEQjMsIDB4N0I0NiwgMHg3NTYyLCAweDY1ODMsIDB4NUU2MywgMHg5NTg5LCAweDkwOEEsIDB4N0RFOCwKLSAgICAweDhDQjYsIDB4OEI4QSwgMHg4RkFGLCAweDhGQUUsIDB4NkExOSwgMHg5QzQ5LCAweDc2NUYsIDB4NzAxNSwKLSAgICAweDZGRjEsIDB4OENEMywgMHg2NEVGLCAweDk5MDUsIDB4NjRBNSwgMHg5MjYyLCAweDkyNTEsIDB4OTlDMSwKLSAgICAweDg4REMsIDB4OENBMSwgMHg1M0MzLCAweDg4MzYsIDB4NkI5OCwgMHg2MTVBLCAweDYxNTgsIDB4NzFFNiwKLSAgICAweDg0QkMsIDB4ODI1OSwgMHg1MDA5LCAweDZFQzQsIDB4NTNBMCwgMHg1MDc0LCAweDZFMkMsIDB4NUM2NCwKLSAgICAweDhBNkIsIDB4NjUxOSwgMHg2NDdCLCAweDg3RUMsIDB4OTk1RSwgMHg4QjkyLCAweDdFOEYsIDB4OTNERiwKLSAgICAweDc1MjMsIDB4OTVFMSwgMHg5ODZCLCAweDU4MzQsIDB4NTYxNywgMHg5NTc3LCAweDUxMUYsIDB4ODE3OCwKLSAgICAweDVFRTAsIDB4NjZBMiwgMHg5MjE0LCAweDhFQ0EsIDB4NUZCOSwgMHg1ODc1LCAweDk2NzMsIDB4ODk2RiwKLSAgICAweDdBMzEsIDB4NjFGMiwgMHg4QUEwLCAweDlBMDEsIDB4OTA3MiwgMHg5OUIzLCAweDlGNTIsIDB4NzFCRSwKLSAgICAweDg4NUQsIDB4ODdGMiwgMHg1QkY1LCAweDc1ODcsIDB4OEU4QSwgMHg3QzRDLCAweDdEQTIsIDB4OTE5QywKLSAgICAweDkyRTQsIDB4OTZEQiwgMHg3OTBFLCAweDUxMzIsIDB4ODlGOCwgMHg4NjU1LCAweDUwQjMsIDB4NzYyMSwKLSAgICAweDk1RDYsIDB4NTI3NSwgMHg5MzE4LCAweDdEMTQsIDB4N0RCRCwgMHg4RkFELCAweDhBNUUsIDB4OENEQywKLSAgICAweDgwNzAsIDB4NUY5RSwgMHg1M0UyLCAweDhFQTUsIDB4N0FDNCwgMHg5MzJGLCAweDkwNTQsIDB4NUUzNiwKLSAgICAweDhDQjgsIDB4NjRENCwgMHg1NUFFLCAweDkxMzIsIDB4NjRBMywgMHg4MUJELCAweDYxOUEsIDB4OEE5NSwKLSAgICAweDVGNDgsIDB4NzU3NiwgMHg2NENCLCAweDlFRTgsIDB4ODU2OSwgMHg2QTk0LCAweDY0MTcsIDB4NUNGNiwKLSAgICAweDc5QjEsIDB4NUMwRSwgMHg3MUM4LCAweDkxMjcsIDB4NjU3NSwgMHg2RUNDLCAweDkwNUUsIDB4N0RFMCwKLSAgICAweDk4NUIsIDB4OUVERSwgMHg1ODhBLCAweDk2RkIsIDB4NkZCMSwgMHg5MUUzLCAweDhBQkYsIDB4OEFEQywKLSAgICAweDkxRDgsIDB4OTgwMiwgMHg5MzIwLCAweDhBMDIsIDB4Njc3MSwgMHg1MkQ1LCAweDY4REYsIDB4NTFDRCwKLSAgICAweDlCMjUsIDB4NzJBMiwgMHg3MzY4LCAweDhCODAsIDB4OENFRCwgMHg5MzRELCAweDkzNUIsIDB4NjVCNywKLSAgICAweDdEREUsIDB4OTY4QSwgMHg1QzBELCAweDU2NzgsIDB4OTgxMywgMHg5MjBELCAweDU5NkEsIDB4NThBRSwKLSAgICAweDlENUQsIDB4OTg0RCwgMHg4QTFCLCAweDYwRTEsIDB4OTkxMywgMHg1MTUyLCAweDcyM0UsIDB4OTkwQywKLSAgICAweDhDQjMsIDB4NzY3QywgMHg3RjcwLCAweDk1QTUsIDB4NzkyQywgMHg5MUU5LCAweDcxNjksIDB4N0JDNCwKLSAgICAweDhDQTksIDB4OThFRiwgMHg4QTJBLCAweDdEMjEsIDB4OThEQiwgMHg4QUI5LCAweDVFRTIsIDB4OENCQiwKLSAgICAweDdEMUIsIDB4NThCMywgMHg1OTZFLCAweDYxQTQsIDB4N0NERSwgMHg4QzUwLCAweDY5NTMsIDB4OTJEMiwKLSAgICAweDk4QTgsIDB4NzYwQiwgMHg5OUFFLCAweDdFMkIsIDB4OEFGNywgMHg5Q0YzLCAweDgxOUEsIDB4OEYzQiwKLSAgICAweDY0QUIsIDB4OEYxNCwgMHg4Q0U2LCAweDVGQTksIDB4OENBMCwgMHg4QTAzLCAweDVBNjYsIDB4N0UxQiwKLSAgICAweDhBNzIsIDB4OTIyMywgMHg4NENCLCAweDVFNzksIDB4OEQ5NSwgMHg4RDFCLCAweDVDQTEsIDB4NTI1QiwKLSAgICAweDkyRkMsIDB4N0RCMSwgMHg1RDE3LCAweDkzQUMsIDB4NjRGMSwgMHg5RDNGLCAweDk1QTMsIDB4OTI3QiwKLSAgICAweDUwMEIsIDB4N0Q2NiwgMHg5Rjk0LCAweDk3OEYsIDB4OENBMiwgMHg5MjBFLCAweDZFOUQsIDB4NjlDQiwKLSAgICAweDhDRkMsIDB4ODgzMSwgMHg5ODY3LCAweDUyNkUsIDB4OTVEQywgMHg4OUMwLCAweDk5MjgsIDB4NjE2MywKLSAgICAweDhDQUIsIDB4NUVFMywgMHg4OThGLCAweDZCNzgsIDB4OUY5QywgMHg5NUE4LCAweDhFQ0MsIDB4OEE2RCwKLSAgICAweDZBQzMsIDB4OENCNCwgMHg1MjhBLCAweDhGMjUsIDB4OTM0QiwgMHg1NzBCLCAweDkwNEUsIDB4OTlFRCwKLSAgICAweDk3RDMsIDB4NkYyMiwgMHg4NjVGLCAweDk1QTEsIDB4OURCNCwgMHg4Q0MwLCAweDhGNUYsIDB4OUQzQiwKLSAgICAweDdEMDUsIDB4NThGQSwgMHg4Qjc3LCAweDZFRUMsIDB4NTYyOSwgMHg4M0VGLCAweDc1NkIsIDB4NTI4MywKLSAgICAweDhBNzEsIDB4NjFGNywgMHg1OERFLCAweDZCNjEsIDB4NzRCMCwgMHg5MDg0LCAweDdERTksIDB4OEIwQSwKLSAgICAweDYzRUUsIDB4OEYxRCwgMHg4Q0M0LCAweDdBNjIsIDB4NjcwMywgMHg3MUY0LCAweDUzMkYsIDB4OEFGMSwKLSAgICAweDhBQTgsIDB4N0U2QSwgMHg4NDc3LCAweDZFM0UsIDB4NzM3MiwgMHg4Q0E4LCAweDc5OEQsIDB4NjRDQSwKLSAgICAweDZBNUYsIDB4N0E0RCwgMHg5OTUxLCAweDhCNEYsIDB4OURDNCwgMHg3RTNFLCAweDdEREQsIDB4Njk3NSwKLSAgICAweDhGMkYsIDB4N0QxQSwgMHg2NEUwLCAweDVFN0UsIDB4ODU4QSwgMHg1MjkxLCAweDZGREYsIDB4OEEwOCwKLSAgICAweDhBMTgsIDB4OTY5QiwgMHg3RTdDLCAweDdEMDAsIDB4NTkzRSwgMHg4M0EyLCAweDk4MzAsIDB4OENDOCwKLSAgICAweDkyNDAsIDB4NTBGOSwgMHg5OUQ1LCAweDZCQjIsIDB4NzZFMywgMHg1ODA1LCAweDdCOEIsIDB4OTU5MywKLSAgICAweDgyNzEsIDB4N0REOCwgMHg3RTZELCAweDZBQTIsIDB4OUU3QywgMHg2M0MwLCAweDY0QkYsIDB4N0MyMSwKLSAgICAweDUxMDksIDB4ODVBNiwgMHg2QUJCLCAweDk0NTIsIDB4OEUxMCwgMHg4Q0U0LCAweDg5OEIsIDB4OTM3NSwKLSAgICAweDgyNjYsIDB4NTI4RCwgMHg5OTFFLCAweDZGMzgsIDB4NkZGQSwgMHg2Rjk3LCAweDVDMDcsIDB4NkYzRiwKLSAgICAweDg1MjMsIDB4NjlGMywgMHg1OTZDLCAweDhCMUIsIDB4OTFBQywgMHg4MUEwLCAweDZGODYsIDB4OUE1NSwKLSAgICAweDVCMEMsIDB4NjUyQSwgMHg5Mjc4LCAweDc3RUYsIDB4NTBFNSwgMHg5OTAzLCAweDdFNzMsIDB4N0Q1RSwKLSAgICAweDhGNEUsIDB4OEYwMywgMHg5NjhFLCAweDdCQzAsIDB4NkY1NCwgMHg3RDUwLCAweDhBQTEsIDB4N0RDQSwKLSAgICAweDkzMjYsIDB4NTBDNSwgMHg4QjM5LCAweDkwMzIsIDB4NzFGQywgMHg3NkUxLCAweDUyQzEsIDB4ODM5NiwKLSAgICAweDlCRTgsIDB4OUE1QSwgMHg3RDkzLCAweDk4MzgsIDB4OTNFMSwgMHg1RjkxLCAweDc1RDksIDB4N0FGNiwKLSAgICAweDdDRkUsIDB4ODIwQSwgMHg5OUQyLCAweDgyMDksIDB4NjREQSwgMHg5MkY4LCAweDYxRkMsIDB4NTI4NywKLSAgICAweDlENTEsIDB4N0Q3OSwgMHg4OUJBLCAweDhBMjMsIDB4N0Q3NiwgMHg5MjFFLCAweDhFQ0QsIDB4OTlGRiwKLSAgICAweDk1OEIsIDB4NTFGMSwgMHg5ODQ2LCAweDZCQkIsIDB4OEFCMiwgMHg1OEJFLCAweDYxQzcsIDB4NjQ3MywKLSAgICAweDVFQUIsIDB4ODkzMiwgMHg4QTg3LCAweDU4NEEsIDB4NTEwOCwgMHg1QkVDLCAweDc5MjYsIDB4NjZFMCwKLSAgICAweDg2NjcsIDB4NURDQiwgMHg3QUJBLCAweDk5NEIsIDB4NkY3MCwgMHg2NEY0LCAweDk1Q0EsIDB4ODgxRiwKLSAgICAweDgxRDgsIDB4ODQwQSwgMHg0Rjg2LCAweDhDRjQsIDB4ODVDRCwgMHg2QjA0LCAweDY1MTQsIDB4N0M0MywKLSAgICAweDk1Q0MsIDB4ODYyRCwgMHg3MDNFLCAweDhCOTUsIDB4NjUyQywgMHg4OUJELCAweDYxRjYsIDB4N0U5QywKLSAgICAweDcyMUIsIDB4NkZFQiwgMHg2NDg4LCAweDUyREUsIDB4NkY4NywgMHg2QTAyLCAweDk0MzMsIDB4NThEOCwKLSAgICAweDk4NUUsIDB4N0M2QywgMHg5NkUyLCAweDcwNTUsIDB4ODhDRiwgMHg5QkM5LCAweDc5QUUsIDB4OUU5NywKLSAgICAweDUzQjIsIDB4NTJGNSwgMHg3OTJCLCAweDZCNzcsIDB4NzAxRCwgMHg5NkI4LCAweDUwMDYsIDB4ODA2RiwKLSAgICAweDg0RUUsIDB4OTAyMywgMHg5NDJFLCAweDYxOTAsIDB4NkYyMywgMHg3QzNFLCAweDY1ODIsIDB4ODFDOSwKLSAgICAweDkzQzgsIDB4NjIwMCwgMHg3MTQ5LCAweDdERjQsIDB4N0NFNywgMHg1MTY5LCAweDhGMUIsIDB4OEFEMiwKLSAgICAweDc2NDIsIDB4OTA3QywgMHg5NDEwLCAweDczNzUsIDB4ODFFOCwgMHg5MTMwLCAweDlDNTcsIDB4OENDMywKLSAgICAweDlGNjEsIDB4OTIzNCwgMHg5NzQ4LCAweDVEQkEsIDB4OTgxOCwgMHg5OTNFLCAweDUyODksIDB4OUY4RCwKLSAgICAweDgwN0UsIDB4NTZBOCwgMHg3QzYwLCAweDU4REYsIDB4NjUwRiwgMHg5NkI0LCAweDZBMTMsIDB4NUE0MSwKLSAgICAweDY0NUYsIDB4N0MwRCwgMHg4NjA2LCAweDc2RTcsIDB4OTg3MSwgMHg1RUVDLCAweDcyMTAsIDB4NjRDNCwKLSAgICAweDZFRjcsIDB4ODY1QywgMHg5QjZGLCAweDhDQzIsIDB4OTMzMiwgMHg5Njc4LCAweDlBNjIsIDB4OTJDMSwKLSAgICAweDVDNjIsIDB4N0UzNywgMHg2MTZFLCAweDZGRkUsIDB4N0REMSwgMHg1REQyLCAweDY1MjMsIDB4NUI3RiwKLSAgICAweDcwNjQsIDB4NEU4MiwgMHg2Mzg0LCAweDhGMkEsIDB4NTAyQiwgMHg0Rjk2LCAweDZERUEsIDB4N0RCOCwKLSAgICAweDhBRDYsIDB4ODYzRiwgMHg3Rjg1LCAweDkwOEYsIDB4OTQ3QywgMHg3QzZFLCAweDlBM0UsIDB4OTlGMSwKLSAgICAweDdENjEsIDB4NUFCRCwgMHg3NDZBLCAweDc4QkMsIDB4ODc5RSwgMHg5OUFDLCAweDk5RTEsIDB4NTVDRSwKLSAgICAweDhDQjcsIDB4OUVBNSwgMHg4Q0UzLCAweDkwODEsIDB4Nzc5RSwgMHg5OTQ1LCAweDg4M0IsIDB4NkVGRiwKLSAgICAweDhCM0UsIDB4OTMyOCwgMHg5MjVBLCAweDhDQkYsIDB4OTM4MiwgMHg5NTgwLCAweDYwQjYsIDB4NTAxMSwKLSAgICAweDkzMzMsIDB4NTkyMiwgMHg4QjBFLCAweDVGNEMsIDB4ODk5MywgMHg3REJGLCAweDdERUMsIDB4NUVERiwKLSAgICAweDZFQzUsIDB4NjFBQiwgMHg5NUE5LCAweDlDRjQsIDB4OTI5OCwgMHg4QjJDLCAweDhCMDAsIDB4NzU1RCwKLSAgICAweDkyMDksIDB4N0QwRCwgMHg5NkUzLCAweDY0OTMsIDB4ODE2NiwgMHg2MEYxLCAweDlCMjcsIDB4OTkxMiwKLSAgICAweDY0RUMsIDB4ODFBOSwgMHg2NTA2LCAweDkxQzAsIDB4OUNFNSwgMHg4MDc2LCAweDU2OTksIDB4OTQ3NywKLSAgICAweDkzQjMsIDB4NkFCOCwgMHg3MzcwLCAweDVCRTcsIDB4NjRGMCwgMHg2RkQ4LCAweDkyMTUsIDB4N0QxMCwKLSAgICAweDgxQkYsIDB4NkZDMywgMHg4RkIyLCAweDc2MjcsIDB4OEFGRSwgMHg2QjUwLCAweDlERDcsIDB4NkJDNiwKLSAgICAweDU2MTQsIDB4NkYxQSwgMHg3NkU0LCAweDlGOTAsIDB4OENFMCwgMHg1Njc0LCAweDlENkMsIDB4OUExOSwKLSAgICAweDk4QzQsIDB4OTgzQiwgMHg4Q0E3LCAweDg2MEIsIDB4NjE5MSwgMHg4QTU1LCAweDZGNTEsIDB4OTgxNywKLSAgICAweDY0QjIsIDB4OTJFQSwgMHg1MEQ1LCAweDZBMzgsIDB4OEI1QywgMHg4MUNELCAweDlGNEEsIDB4OUEwRSwKLSAgICAweDhDNDgsIDB4NTU1MywgMHg2QzIzLCAweDhBMTYsIDB4NzI3RCwgMHg5MUZBLCAweDkyNUIsIDB4OTA3NywKLSAgICAweDdDM0QsIDB4OEIxOSwgMHg5MzIyLCAweDkyNTcsIDB4NkRGQSwgMHg4Qjc0LCAweDU4NzksIDB4NjlDRCwKLSAgICAweDU1QzYsIDB4NThCQiwgMHg4NTk0LCAweDY0MzYsIDB4OTM2QywgMHg2QTRCLCAweDU1QUMsIDB4NTBEMSwKLSAgICAweDdGRjksIDB4N0FDNSwgMHg3QUNBLCAweDZCM0QsIDB4ODlBQSwgMHg1QkUyLCAweDhGMTUsIDB4NkMyQiwKLSAgICAweDUwQkUsIDB4OTgwMywgMHg4QUNCLCAweDYxNzYsIDB4NzRDQSwgMHg3QUFFLCAweDhEQTgsIDB4NTM0MCwKLSAgICAweDhFQzAsIDB4OUE0NSwgMHg5RjcyLCAweDk4NzQsIDB4NkIwQSwgMHg1MkY4LCAweDlENzIsIDB4NzhCQSwKLSAgICAweDhCOTMsIDB4OTk1MiwgMHg2NEZFLCAweDdFNUUsIDB4NzFCMSwgMHg5N0NDLCAweDhBOEQsIDB4N0QwOSwKLSAgICAweDY5QUUsIDB4N0Q2OCwgMHg4RURGLCAweDkyRUQsIDB4OTU4RiwgMHg2RjY0LCAweDcwNTEsIDB4ODVBOSwKLSAgICAweDlDMTMsIDB4OENGRCwgMHg1MDk4LCAweDU1QUEsIDB4OUEzNywgMHg2MzgzLCAweDZGODAsIDB4NkJCQSwKLSAgICAweDdEMTcsIDB4N0JFOSwgMHg2NkVDLCAweDk1ODMsIDB4OTY1RCwgMHg4RDBELCAweDdFNTUsIDB4NTBCNywKLSAgICAweDhDREUsIDB4NzFEMiwgMHg3RDM5LCAweDhDRDIsIDB4NjM2OCwgMHg2NTFELCAweDYxRkUsIDB4OEEyRCwKLSAgICAweDdEMzMsIDB4NUJFOSwgMHg1QjM4LCAweDgxNEUsIDB4NkVGMiwgMHg4MDcyLCAweDdFNjksIDB4NTJERCwKLSAgICAweDgwNTYsIDB4NUUyQiwgMHg3MzQ1LCAweDZGRDUsIDB4OEE2OSwgMHg2NjQyLCAweDg3NTUsIDB4NUJFNiwKLSAgICAweDhCNTgsIDB4OTlEQiwgMHg1MkUyLCAweDkwNjksIDB4OTFDQiwgMHg5OEZFLCAweDg5OTYsIDB4OEE2NiwKLSAgICAweDU4RkQsIDB4NzM3OCwgMHg2QTFFLCAweDhGMzgsIDB4NjZGOCwgMHg4RDE2LCAweDVDNkMsIDB4ODg1MywKLSAgICAweDZBMzksIDB4N0FFQSwgMHg2NTc4LCAweDVFMjUsIDB4OTZEOSwgMHg4QUIwLCAweDk4MDYsIDB4OEFBQywKLSAgICAweDc4QTksIDB4NzIwRCwgMHg3RDcyLCAweDk4RkMsIDB4OUIwNiwgMHg4MDczLCAweDYxNkIsIDB4OTgwQywKLSAgICAweDhBMUYsIDB4OEFBNiwgMHg2NEZCLCAweDg2MDcsIDB4OEEzNCwgMHg4MDg1LCAweDk2RDYsIDB4OTZBOCwKLSAgICAweDdEOEYsIDB4NkI3MiwgMHg1QjZCLCAweDY0MEQsIDB4N0UyRSwgMHg3NDYzLCAweDkzOTYsIDB4NzM3QSwKLSAgICAweDY0QkIsIDB4ODFGQSwgMHg2MTRCLCAweDY1MjQsIDB4OENBQSwgMHg3NjcxLCAweDcwNTgsIDB4NThDNywKLSAgICAweDhCNUEsIDB4OEFDNywgMHg1NjA2LCAweDZFNkYsIDB4NzFEOSwgMHg2RkU0LCAweDdFMjcsIDB4OEEwRSwKLSAgICAweDlBMzAsIDB4OEIwNCwgMHg5MkJCLCAweDk4NEMsIDB4OUFENCwgMHg2ODlELCAweDhDQkMsIDB4OTQzNSwKLSAgICAweDVFRjMsIDB4ODA3RCwgMHg3MEY0LCAweDkyODUsIDB4N0Q3MSwgMHg5ODJELCAweDU3MTYsIDB4NTg1NywKLSAgICAweDU3MTgsIDB4OTgzRCwgMHg5RDE1LCAweDk5QjEsIDB4OTlERCwgMHg2QTYyLCAweDdBQUEsIDB4ODk2QSwKLSAgICAweDVGNEUsIDB4NzA2MywgMHg5ODExLCAweDg0MkMsIDB4N0RCMiwgMHg5N0NCLCAweDkwNTUsIDB4NTcwRCwKLSAgICAweDcyMzIsIDB4NkZGMCwgMHg3REFELCAweDg0NjYsIDB4NTA0OSwgMHg1MERFLCAweDdERUYsIDB4OEIwMiwKLSAgICAweDg4NUIsIDB4ODA1RSwgMHg3RDBCLCAweDdBNjksIDB4NTU0RiwgMHg2NEJFLCAweDg3NzgsIDB4NkUyNiwKLSAgICAweDdBQTksIDB4NTVEQSwgMHg5M0EyLCAweDcwQ0YsIDB4OEFBMywgMHg3MTIxLCAweDg1NkEsIDB4NTg2MiwKLSAgICAweDk3MjcsIDB4NTJEOSwgMHg4QUE0LCAweDkzMkIsIDB4NzJBNywgMHg4OTcyLCAweDdGRDIsIDB4OTI5MSwKLSAgICAweDYyMzIsIDB4N0QzMCwgMHg4NzY2LCAweDhGNDQsIDB4NUNGRCwgMHg0RkUwLCAweDcyRjksIDB4NTY4NywKLSAgICAweDkzNDEsIDB4OUJBRSwgMHg3RTk2LCAweDhDRTIsIDB4OTI5QywgMHg5NTkxLCAweDk4NkYsIDB4OTZBQSwKLSAgICAweDczRkUsIDB4NzM3QiwgMHg3RTIzLCAweDk5MjEsIDB4NjFCMiwgMHg3REFCLCAweDk0NzIsIDB4OTEwOSwKLSAgICAweDhBNzMsIDB4OTdGRiwgMHg5ODA1LCAweDg1NkQsIDB4NTZDMiwgMHg5MkI3LCAweDY2QzksIDB4NTYyRiwKLSAgICAweDUzNTQsIDB4NjMzRSwgMHg4MTA1LCAweDhBRTcsIDB4NUJFQiwgMHg3MDA5LCAweDhCMUQsIDB4OTJDNSwKLSAgICAweDkxQzEsIDB4ODIwOCwgMHg5MkI5LCAweDdEODksIDB4OTgwOCwgMHg4QTMxLCAweDdERDIsIDB4N0U4QywKLSAgICAweDhFRDIsIDB4NjFGOCwgMHg5MDc4LCAweDc2NkMsIDB4N0Q2MiwgMHg1Qjc4LCAweDUyREIsIDB4OEE2MiwKLSAgICAweDVDMEIsIDB4OTlCNCwgMHg4QTEzLCAweDhBMEEsIDB4OTA1QywgMHg1OEQzLCAweDlEMDksIDB4OUQyOCwKLSAgICAweDU1NUUsIDB4NEU5RSwgMHg4QTFELCAweDk1QjksIDB4OUU3RCwgMHg1NkI0LCAweDk4NTQsIDB4OTVCQiwKLSAgICAweDgyNzcsIDB4NTNBRCwgMHg3ODZGLCAweDhBRkEsIDB4OUE1NywgMHg5RDI2LCAweDY5NEEsIDB4NjNEQSwKLSAgICAweDc2MEQsIDB4OTY3RCwgMHg3NjYyLCAweDk5MEEsIDB4NkEyMywgMHg1ODJGLCAweDhCMjEsIDB4ODVFNSwKLSAgICAweDcyM0EsIDB4OTgwMSwgMHg2OTZELCAweDg0NDksIDB4OTFBQiwgMHg5MkE1LCAweDk4MjQsIDB4OTA3QSwKLSAgICAweDUxMDAsIDB4ODdGQiwgMHg4NURELCAweDUxMDQsIDB4NjFCNiwgMHg3RkE5LCAweDhBNjMsIDB4OEI3MCwKLSAgICAweDhBQkMsIDB4OEI2RiwgMHg3RTc5LCAweDg1MkQsIDB4OTY3MCwgMHg5MjgwLCAweDk4RjIsIDB4OTZCMSwKLSAgICAweDZBRkIsIDB4NUIzMCwgMHg5REY5LCAweDYxQzksIDB4N0U5MywgMHg3NDY5LCAweDg3QTIsIDB4NzFERiwKLSAgICAweDcxOTIsIDB4ODgwNSwgMHg4RDBGLCAweDdBNEUsIDB4NTVCMiwgMHg2NEMxLCAweDUwQUQsIDB4NzY3MCwKLSAgICAweDhFMzQsIDB4NTEyQSwgMHg2MTgyLCAweDkwRjUsIDB4OTIzRSwgMHg3MzM2LCAweDhBOTgsIDB4OEYzRiwKLSAgICAweDk5MTgsIDB4OUI1QSwgMHg2RjAxLCAweDgyMDcsIDB4NURCQywgMHg4QTlFLCAweDlCMzEsIDB4NzM0NCwKLSAgICAweDhCN0QsIDB4OTgxMCwgMHg5OUFELCAweDlEMUIsIDB4NkRGNSwgMHg4RjQ1LCAweDU3MTIsIDB4NTRFMSwKLSAgICAweDU3MTMsIDB4N0RFMywgMHg5MDYwLCAweDk4NTgsIDB4N0QwNCwgMHg4RThELCAweDk0NzAsIDB4OTVCMiwKLSAgICAweDk2RjIsIDB4OTExNiwgMHg5Njk1LCAweDkwNEIsIDB4ODVGNCwgMHg5MTk2LCAweDY2ODgsIDB4OTZEQywKLSAgICAweDhGMDksIDB4NjUyMiwgMHg2NkFCLCAweDhEMEEsIDB4OEQxQywgMHg4MURGLCAweDk0N0YsIDB4NjhENywKLSAgICAweDdBQzgsIDB4OENBQywgMHg2NEM3LCAweDUyNDcsIDB4NkZBNCwgMHg4Q0NBLCAweDhEMDgsIDB4OEVDQiwKLSAgICAweDkzNTgsIDB4OTU5OCwgMHg4QTUwLCAweDlGNEIsIDB4NTBCNSwgMHg2QzA4LCAweDc2REUsIDB4NjVBQywKLSAgICAweDhGM0UsIDB4NUQ4NCwgMHg2OEU3LCAweDYyMzAsIDB4N0RCQiwgMHg1RjM1LCAweDZGMzIsIDB4NUUzMywKLSAgICAweDhDRUMsIDB4ODEzOSwgMHg4RDk5LCAweDg3QzQsIDB4OEY0RCwgMHg5MzdBLCAweDkwMTksIDB4OEM5RSwKLSAgICAweDkxREQsIDB4NTA3NSwgMHg4QTNBLCAweDkzQUUsIDB4OTY2MywgMHg1RTQwLCAweDc2NjUsIDB4OTEyRCwKLSAgICAweDhCNDksIDB4N0U1NCwgMHg4MDc3LCAweDU3RjcsIDB4ODg3OSwgMHg3RDE5LCAweDY0NkYsIDB4NjRGMiwKLSAgICAweDVFNUYsIDB4OENFQSwgMHg2RUVGLCAweDk0MTgsIDB4N0Q0MiwgMHg3QTJFLCAweDgxNkIsIDB4ODg0NiwKLSAgICAweDhCMDUsIDB4OEVGOCwgMHg3NkJBLCAweDY2NUQsIDB4OUE1RiwgMHg4QUY4LCAweDhBODUsIDB4NzFFRCwKLSAgICAweDc3REEsIDB4NTZEMSwgMHg4Q0FGLCAweDk0NDQsIDB4N0JDOSwgMHg5OUQwLCAweDVDMDgsIDB4NzhEQSwKLSAgICAweDhGNDksIDB4OENGQSwgMHg2QTAxLCAweDgzOEEsIDB4ODhERCwgMHg1OTlELCAweDU4RUYsIDB4NzJDMCwKLSAgICAweDkzMTAsIDB4OEQwNSwgMHg1ODlDLCAweDdEQjQsIDB4OEFDNCwgMHg2RTk2LCAweDZGQzEsIDB4OENDNywKLSAgICAweDZGMkMsIDB4N0Q5QywgMHg3RTNELCAweDdFMzEsIDB4OTExMiwgMHg4QTVCLCAweDdENDQsIDB4OTQ3RCwKLSAgICAweDU1QzcsIDB4NTM5OSwgMHg1M0I0LCAweDk3NjgsIDB4OEQwQiwgMHg1MzJELCAweDUzMzEsIDB4OENGRSwKLSAgICAweDUyNDQsIDB4NTI4QywgMHg1Mjc0LCAweDUwQjQsIDB4NTAwMCwgMHg1MDk2LCAweDUxMTUsIDB4NTEwMiwKLSAgICAweDUxMTQsIDB4NTEzQywgMHg1MTM3LCAweDUwRTgsIDB4NTBDMiwgMHg1MTNCLCAweDUxMTAsIDB4NTEzQSwKLSAgICAweDUwQzksIDB4N0NGNCwgMHg5RUNDLCAweDU2QzUsIDB4OUNFQywgMHg4OTNCLCAweDgxRTAsIDB4OEEwMSwKLSAgICAweDhBMTAsIDB4OEEwQywgMHg4QTE1LCAweDhCMzMsIDB4OEE0RSwgMHg4QTI1LCAweDhBNDEsIDB4OEEzNiwKLSAgICAweDhBNDYsIDB4OEE1NCwgMHg4QTU4LCAweDhBNTIsIDB4OEE4NiwgMHg4QTg0LCAweDhBN0YsIDB4OEE3MCwKLSAgICAweDhBN0MsIDB4OEE3NSwgMHg4QTZDLCAweDhBNkUsIDB4OEFDRCwgMHg4QUUyLCAweDhBNjEsIDB4OEE5QSwKLSAgICAweDhBQTUsIDB4OEE5MSwgMHg4QTkyLCAweDhBQ0YsIDB4OEFEMSwgMHg4QUM5LCAweDhBREIsIDB4OEFENywKLSAgICAweDhBQzIsIDB4OEFCNiwgMHg4QUY2LCAweDhBRUIsIDB4OEIxNCwgMHg4QjAxLCAweDhBRTQsIDB4OEFFRCwKLSAgICAweDhBRkMsIDB4OEFGMywgMHg4QUU2LCAweDhBRUUsIDB4OEFERSwgMHg4QjI4LCAweDhCOUMsIDB4OEIxNiwKLSAgICAweDhCMUEsIDB4OEIxMCwgMHg4QjJCLCAweDhCMkQsIDB4OEI1NiwgMHg4QjU5LCAweDhCNEUsIDB4OEI5RSwKLSAgICAweDhCNkIsIDB4OEI5NiwgMHg5NjU4LCAweDkxM0EsIDB4OTExNCwgMHg5MTM0LCAweDkwREYsIDB4OTEzNiwKLSAgICAweDkxMDYsIDB4OTE0OCwgMHg4MkJCLCAweDUyRjEsIDB4NURGMCwgMHg1ODBBLCAweDU4RDksIDB4NThFMiwKLSAgICAweDU4RTAsIDB4NThEQSwgMHg1N0UxLCAweDU4NEYsIDB4NTgxNiwgMHg1ODUyLCAweDU4MUQsIDB4NTg2NCwKLSAgICAweDg1OEMsIDB4ODU1MywgMHg4NUY2LCAweDgzQTcsIDB4ODQwNywgMHg4NEVGLCAweDgyRTcsIDB4ODYyMiwKLSAgICAweDg1MjYsIDB4NTg0QiwgMHg3MTYyLCAweDg1NTgsIDB4ODRGRCwgMHg4NTRFLCAweDg1ODgsIDB4ODVCQSwKLSAgICAweDcyOTYsIDB4NkVDRSwgMHg4NTQxLCAweDg1Q0UsIDB4ODU1MiwgMHg4NEMwLCAweDg0NTIsIDB4ODQ2NCwKLSAgICAweDg0OTQsIDB4ODQzNSwgMHg4NTlGLCAweDg1NTUsIDB4OURBRiwgMHg4NDkzLCAweDdFMDgsIDB4ODU0NiwKLSAgICAweDg1NjIsIDB4ODUxRSwgMHg5QTQwLCAweDg2M0EsIDB4OTNBMywgMHg4NTc3LCAweDg2MUUsIDB4ODVGQSwKLSAgICAweDg2MDQsIDB4ODVFQSwgMHg4NjFBLCAweDU5NjksIDB4NUMzNywgMHg2MzZCLCAweDY0NzYsIDB4NjQ5RiwKLSAgICAweDY0NTEsIDB4NjQ1QywgMHg2NEIzLCAweDY1MDQsIDB4NjUxNiwgMHg2NEY3LCAweDY0RkMsIDB4NjUxQiwKLSAgICAweDU2MzAsIDB4NTYzOCwgMHg1NkM4LCAweDU2QTYsIDB4NTUwNCwgMHg1NEJDLCAweDU2ODAsIDB4NTY1RCwKLSAgICAweDU2NjAsIDB4NTYzNSwgMHg1NUY2LCAweDU2NjYsIDB4NTY3MiwgMHg1NjhDLCAweDU2NjUsIDB4NTYxQywKLSAgICAweDU2MkUsIDB4NTVFOSwgMHg1NjE2LCAweDU2QzAsIDB4NTYwRCwgMHg1NkIzLCAweDU2QzEsIDB4NTY2RiwKLSAgICAweDhGNjEsIDB4NTZCNiwgMHg1Njk1LCAweDU3MDcsIDB4NUU0MywgMHg1RTZDLCAweDVFNTgsIDB4NUU1NywKLSAgICAweDVEODcsIDB4NUNGNCwgMHg1RDUwLCAweDVEMkMsIDB4NURBNywgMHg1REEwLCAweDVEOTcsIDB4NUQwRCwKLSAgICAweDVEQjgsIDB4NUQ4MSwgMHg1REQ0LCAweDVGQTAsIDB4NzM3NywgMHg3MzQxLCAweDczNkEsIDB4NzMzQiwKLSAgICAweDczNkIsIDB4NzM4MCwgMHg3MzdDLCAweDk4RTAsIDB4OTkzMywgMHg5OEU5LCAweDk5M0MsIDB4OThFQSwKLSAgICAweDk4RUIsIDB4OThFRCwgMHg5OEY0LCAweDk5MDksIDB4OTkxMSwgMHg5OTFCLCAweDk5MzcsIDB4OTkzRiwKLSAgICAweDk5NDMsIDB4OTk0OCwgMHg5OTQ5LCAweDk5NEEsIDB4OTk0QywgMHg5OTYyLCAweDVFRTEsIDB4OENFMSwKLSAgICAweDYxRkEsIDB4NjFBRSwgMHg2MTZBLCAweDYxM0UsIDB4NjBCNSwgMHg2MTM0LCAweDYxQ0MsIDB4NjE1RiwKLSAgICAweDYxRTgsIDB4NjBGQiwgMHg2MTM3LCAweDYwRjIsIDB4NjE3MywgMHg2MTFDLCAweDYxOTIsIDB4OTU4MiwKLSAgICAweDk1ODYsIDB4OTVDOCwgMHg5NThFLCAweDk1OTQsIDB4OTU4QywgMHg5NUU1LCAweDk1QUQsIDB4OTVBQiwKLSAgICAweDlCMkUsIDB4OTVBQywgMHg5NUJFLCAweDk1QjYsIDB4OUIyOSwgMHg5NUJGLCAweDk1QkQsIDB4OTVCQywKLSAgICAweDk1QzMsIDB4OTVDQiwgMHg5NUQ0LCAweDk1RDAsIDB4OTVENSwgMHg5NURFLCAweDcwNDMsIDB4NkY1OSwKLSAgICAweDcwMjcsIDB4NzAxOCwgMHg2RkZDLCAweDZEODcsIDB4NkQ3OSwgMHg2RTVFLCAweDZGQUUsIDB4NzAwRiwKLSAgICAweDZFRjgsIDB4NkY2RiwgMHg2REY2LCAweDZGN0YsIDB4NzAwNiwgMHg2RkEwLCAweDcwMEIsIDB4NzA2NywKLSAgICAweDcwNDQsIDB4NzAwNSwgMHg2Rjc3LCAweDcwMjAsIDB4NzAxRiwgMHg3MDMyLCAweDcwMjgsIDB4NzA1RCwKLSAgICAweDlBMkIsIDB4OTA4NywgMHg5MDE1LCAweDkwOTAsIDB4NUM2OCwgMHg1RjMzLCAweDVBRjUsIDB4NUFENywKLSAgICAweDVCMDAsIDB4NUE2RCwgMHg1QjA4LCAweDVCNEMsIDB4NUFBNywgMHg1QUZCLCAweDVCMEIsIDB4NUIyMSwKLSAgICAweDVCMkEsIDB4NUIxOSwgMHg5OUQ0LCAweDk5REYsIDB4OTlEOSwgMHg5QTM2LCAweDlBNUIsIDB4OTlEMSwKLSAgICAweDk5RDgsIDB4OUE0RCwgMHg5QTRBLCAweDk5RTIsIDB4OUE2QSwgMHg5QTBGLCAweDlBMEQsIDB4OUEwNSwKLSAgICAweDlBNDIsIDB4OUEyRCwgMHg5QTE2LCAweDlBNDEsIDB4OUEyRSwgMHg5QTM4LCAweDlBNDMsIDB4OUE0NCwKLSAgICAweDlBNEYsIDB4OUE2NSwgMHg5QTY0LCAweDdDRjksIDB4N0QwNiwgMHg3RDAyLCAweDdEMDcsIDB4N0QwOCwKLSAgICAweDdFOEEsIDB4N0QxQywgMHg3RDE1LCAweDdEMTMsIDB4N0QzQSwgMHg3RDMyLCAweDdEMzEsIDB4N0UxMCwKLSAgICAweDdEM0MsIDB4N0Q0MCwgMHg3RDNGLCAweDdENUQsIDB4N0Q0RSwgMHg3RDczLCAweDdEODYsIDB4N0Q4MywKLSAgICAweDdEODgsIDB4N0RCRSwgMHg3REJBLCAweDdEQ0IsIDB4N0RENCwgMHg3REM0LCAweDdEOUUsIDB4N0RBQywKLSAgICAweDdEQjksIDB4N0RBMywgMHg3REIwLCAweDdEQzcsIDB4N0REOSwgMHg3REQ3LCAweDdERjksIDB4N0RGMiwKLSAgICAweDdFNjIsIDB4N0RFNiwgMHg3REY2LCAweDdERjEsIDB4N0UwQiwgMHg3REUxLCAweDdFMDksIDB4N0UxRCwKLSAgICAweDdFMUYsIDB4N0UxRSwgMHg3RTJELCAweDdFMEEsIDB4N0UxMSwgMHg3RTdELCAweDdFMzksIDB4N0UzNSwKLSAgICAweDdFMzIsIDB4N0U0NiwgMHg3RTQ1LCAweDdFODgsIDB4N0U1QSwgMHg3RTUyLCAweDdFNkUsIDB4N0U3RSwKLSAgICAweDdFNzAsIDB4N0U2RiwgMHg3RTk4LCAweDc0QTMsIDB4NzQ0QiwgMHg3NENGLCAweDk4MEEsIDB4NzRCRCwKLSAgICAweDc0M0YsIDB4NzQ4OSwgMHg3NEE2LCAweDc0RDQsIDB4NzREQSwgMHg5N0Q5LCAweDk3REUsIDB4OTdEQywKLSAgICAweDY5QUEsIDB4NkFFQSwgMHg2ODk4LCAweDY4RDYsIDB4NkEwNSwgMHg2ODlGLCAweDZBREIsIDB4NkFGMywKLSAgICAweDZBRTgsIDB4NkFERiwgMHg2QTg5LCAweDY5MEYsIDB4NkE0OCwgMHg2OTY4LCAweDY5QkYsIDB4NkEzQSwKLSAgICAweDZBOUMsIDB4NkIxMiwgMHg2QjFFLCAweDZBREQsIDB4NjlFNywgMHg2QjBGLCAweDZCMTYsIDB4NkFFQywKLSAgICAweDZBREEsIDB4NkFGOCwgMHg2QUIzLCAweDZBRTcsIDB4NkFBMywgMHg2QUQzLCAweDZBREUsIDB4NkJBNCwKLSAgICAweDZCOUUsIDB4NkJBRSwgMHg2QkFCLCAweDZCQUYsIDB4OEVENCwgMHg4RURCLCAweDhFRjIsIDB4OEVGQiwKLSAgICAweDhGNjQsIDB4OEVGOSwgMHg4RUZDLCAweDhFRUIsIDB4OEVFNCwgMHg4RjYyLCAweDhFRkEsIDB4OEVGRSwKLSAgICAweDhGMEEsIDB4OEYwNywgMHg4RjA1LCAweDhGMTIsIDB4OEYyNiwgMHg4RjFFLCAweDhGMUYsIDB4OEYxQywKLSAgICAweDhGMzMsIDB4OEY0NiwgMHg4RjU0LCAweDYyMTQsIDB4NjIyNywgMHg3NTBDLCAweDY2QzcsIDB4NjZDNCwKLSAgICAweDY2ODksIDB4NjZENiwgMHg4Q0MxLCAweDhDQjAsIDB4OENCQSwgMHg4Q0JELCAweDhEMDQsIDB4OENCMiwKLSAgICAweDhDQzUsIDB4OEQxMCwgMHg4Q0QxLCAweDhDREEsIDB4OENENSwgMHg4Q0VCLCAweDhDRTcsIDB4OENGQiwKLSAgICAweDg5OTgsIDB4ODlBQywgMHg4OUExLCAweDg5QkYsIDB4ODlBNiwgMHg4OUFGLCAweDg5QjIsIDB4ODlCNywKLSAgICAweDZCRkYsIDB4NkMwQywgMHg2QzJDLCAweDcyNTgsIDB4NjcyNywgMHg4MTU2LCAweDgxREEsIDB4ODExQiwKLSAgICAweDgxQkUsIDB4ODE2MSwgMHg4MUNGLCAweDZCNUYsIDB4OThBRSwgMHg5OEFGLCAweDk4QjYsIDB4OThCQywKLSAgICAweDk4QzYsIDB4OThDOCwgMHg4RjQyLCAweDlGNEYsIDB4NjU5NSwgMHg3MTZDLCAweDcxNTIsIDB4NzE5NywKLSAgICAweDcxQzEsIDB4NzFEQywgMHg3MUZFLCAweDc5QjAsIDB4Nzk4RSwgMHg3OUFBLCAweDYxREYsIDB4NjE2NCwKLSAgICAweDYxRTMsIDB4NjIwNywgMHg2RkE5LCAweDc4RUYsIDB4NzhBRCwgMHg3ODY4LCAweDc4QjgsIDB4NzkyQSwKLSAgICAweDc5MzEsIDB4Nzg2NCwgMHg3OEZELCAweDc4RTcsIDB4NzhFMywgMHg5Rjk1LCAweDc3OTgsIDB4Nzc1RSwKLSAgICAweDc3QkMsIDB4N0Y4NiwgMHg3Rjg4LCAweDkxRDIsIDB4OTFEMywgMHg5MUQ0LCAweDkxRDksIDB4OTFENywKLSAgICAweDkxRDUsIDB4OTFGNywgMHg5MUU3LCAweDkxRTQsIDB4OTM0NiwgMHg5MUY1LCAweDkxRjksIDB4OTIwOCwKLSAgICAweDkyMjYsIDB4OTI0NSwgMHg5MjExLCAweDkyMTAsIDB4OTIwMSwgMHg5MjI3LCAweDkyMDQsIDB4OTIyNSwKLSAgICAweDkyMDAsIDB4OTIzQSwgMHg5MjY2LCAweDkyMzcsIDB4OTIzMywgMHg5MjU1LCAweDkyM0QsIDB4OTIzOCwKLSAgICAweDkyNUUsIDB4OTI2QywgMHg5MjZELCAweDkyM0YsIDB4OTQ2MCwgMHg5MjMwLCAweDkyNDksIDB4OTI0OCwKLSAgICAweDkyNEQsIDB4OTIyRSwgMHg5MjM5LCAweDk0MzgsIDB4OTJBQywgMHg5MkEwLCAweDkyN0EsIDB4OTJBQSwKLSAgICAweDkyRUUsIDB4OTJDRiwgMHg5NDAzLCAweDkyRTMsIDB4OTQzQSwgMHg5MkIxLCAweDkyQTYsIDB4OTNBNywKLSAgICAweDkyOTYsIDB4OTJDQywgMHg5MkE5LCAweDkzRjUsIDB4OTI5MywgMHg5MjdGLCAweDkzQTksIDB4OTI5QSwKLSAgICAweDkzMUEsIDB4OTJBQiwgMHg5MjgzLCAweDk0MEIsIDB4OTJBOCwgMHg5MkEzLCAweDk0MTIsIDB4OTMzOCwKLSAgICAweDkyRjEsIDB4OTNENywgMHg5MkU1LCAweDkyRjAsIDB4OTJFRiwgMHg5MkU4LCAweDkyQkMsIDB4OTJERCwKLSAgICAweDkyRjYsIDB4OTQyNiwgMHg5NDI3LCAweDkyQzMsIDB4OTJERiwgMHg5MkU2LCAweDkzMTIsIDB4OTMwNiwKLSAgICAweDkzNjksIDB4OTMxQiwgMHg5MzQwLCAweDkzMDEsIDB4OTMxNSwgMHg5MzJFLCAweDkzNDMsIDB4OTMwNywKLSAgICAweDkzMDgsIDB4OTMxRiwgMHg5MzE5LCAweDkzNjUsIDB4OTM0NywgMHg5Mzc2LCAweDkzNTQsIDB4OTM2NCwKLSAgICAweDkzQUEsIDB4OTM3MCwgMHg5Mzg0LCAweDkzRTQsIDB4OTNEOCwgMHg5NDI4LCAweDkzODcsIDB4OTNDQywKLSAgICAweDkzOTgsIDB4OTNCOCwgMHg5M0JGLCAweDkzQTYsIDB4OTNCMCwgMHg5M0I1LCAweDk0NEMsIDB4OTNFMiwKLSAgICAweDkzREMsIDB4OTNERCwgMHg5M0NELCAweDkzREUsIDB4OTNDMywgMHg5M0M3LCAweDkzRDEsIDB4OTQxNCwKLSAgICAweDk0MUQsIDB4OTNGNywgMHg5NDY1LCAweDk0MTMsIDB4OTQ2RCwgMHg5NDIwLCAweDk0NzksIDB4OTNGOSwKLSAgICAweDk0MTksIDB4OTQ0QSwgMHg5NDMyLCAweDk0M0YsIDB4OTQ1NCwgMHg5NDYzLCAweDkzN0UsIDB4N0E2MSwKLSAgICAweDlDRTksIDB4OUNGNiwgMHg5RDA3LCAweDlEMDYsIDB4OUQyMywgMHg5RDg3LCAweDlFMTUsIDB4OUQxRCwKLSAgICAweDlEMUYsIDB4OURFNSwgMHg5RDJGLCAweDlERDksIDB4OUQzMCwgMHg5RDQyLCAweDlFMUUsIDB4OUQ1MywKLSAgICAweDlFMUQsIDB4OUQ2MCwgMHg5RDUyLCAweDlERjMsIDB4OUQ1QywgMHg5RDYxLCAweDlEOTMsIDB4OUQ2QSwKLSAgICAweDlENkYsIDB4OUQ4OSwgMHg5RDk4LCAweDlEOUEsIDB4OURDMCwgMHg5REE1LCAweDlEQTksIDB4OURDMiwKLSAgICAweDlEQkMsIDB4OUUxQSwgMHg5REQzLCAweDlEREEsIDB4OURFRiwgMHg5REU2LCAweDlERjIsIDB4OURGOCwKLSAgICAweDlFMEMsIDB4OURGQSwgMHg5RTFCLCAweDc2NjQsIDB4NzY1OCwgMHg3NjY3LCAweDc2MDIsIDB4NzY0NiwKLSAgICAweDc2NDcsIDB4NzY0OSwgMHg3NjFFLCAweDc2M0IsIDB4NzY2RCwgMHg3NjZFLCAweDc2NjksIDB4NzY3MiwKLSAgICAweDdBQzcsIDB4N0FCNiwgMHg4OTYwLCAweDg5MzMsIDB4ODk1RCwgMHg4OTQ3LCAweDg5MzgsIDB4ODk2NCwKLSAgICAweDc2QjgsIDB4ODAyRSwgMHg4MDJDLCAweDgwNzksIDB4ODA3NSwgMHg5ODA3LCAweDk4MEUsIDB4OTgwRiwKLSAgICAweDk4MjEsIDB4OTgxQywgMHg2RjQxLCAweDk4MjYsIDB4OTgzNywgMHg5ODRFLCAweDk4NTMsIDB4OTg3MywKLSAgICAweDk4NjIsIDB4OTg1OSwgMHg5ODY1LCAweDk4NkMsIDB4OTg3MCwgMHg4N0UzLCAweDg4MDYsIDB4ODcwNiwKLSAgICAweDg4MjMsIDB4ODdGNiwgMHg4NkZBLCAweDg3RUYsIDB4ODc4NCwgMHg4ODEwLCAweDg3QzgsIDB4ODgxMSwKLSAgICAweDg3QkIsIDB4ODdDRSwgMHg3RjRDLCAweDdCRTQsIDB4N0I2NywgMHg3QzY5LCAweDdCRjMsIDB4N0MwMCwKLSAgICAweDdCQ0IsIDB4N0M1QywgMHg3QzFFLCAweDdDMkIsIDB4N0MyMywgMHg3QzZBLCAweDdDNUYsIDB4ODI2NCwKLSAgICAweDgyNkIsIDB4ODhDQSwgMHg3RkE1LCAweDdDRjIsIDB4N0NGNiwgMHg3Q0RELCAweDdFMzYsIDB4OUVBOSwKLSAgICAweDhEQjIsIDB4OTFDNSwgMHg5MUMzLCAweDlFN0EsIDB4OEU4OSwgMHg4RTRDLCAweDhFOTIsIDB4OEU3QSwKLSAgICAweDhFNTUsIDB4OEU5QSwgMHg4RThCLCAweDhFOTMsIDB4OEU5MSwgMHg4RUExLCAweDhFNjMsIDB4OEVBQSwKLSAgICAweDhFQTYsIDB4ODlGNCwgMHg4OUY2LCAweDk3NUEsIDB4OTc0MiwgMHg5NzNELCAweDk3NDQsIDB4OUY1NCwKLSAgICAweDlGNUYsIDB4OUY1OSwgMHg5RjYwLCAweDlGNUMsIDB4OUY2NiwgMHg5RjZDLCAweDlGNkEsIDB4OUY3NywKLSAgICAweDlFRkQsIDB4OUVGRiwgMHg5RjA5LCAweDhCOEUsIDB4OTQ3RSwgMHg5M0U4LCAweDlCNzcsIDB4OUI3NCwKLSAgICAweDlCODEsIDB4OUI4MywgMHg5QjhFLCAweDlDNzgsIDB4N0E0QywgMHg5QjkyLCAweDlDNUYsIDB4OUI5MCwKLSAgICAweDlCQUQsIDB4OUI5QSwgMHg5QkFBLCAweDlCOUUsIDB4OUM2RCwgMHg5QkFCLCAweDlCOUQsIDB4OUM1OCwKLSAgICAweDlCQzEsIDB4OUM3QSwgMHg5QzMxLCAweDlDMzksIDB4OUMyMywgMHg5QzM3LCAweDlCQzAsIDB4OUJDQSwKLSAgICAweDlCQzcsIDB4OUJGRCwgMHg5QkQ2LCAweDlCRUEsIDB4OUJFQiwgMHg5QkUxLCAweDlCRTQsIDB4OUJFNywKLSAgICAweDlCREQsIDB4OUJFMiwgMHg5QkYwLCAweDlCREIsIDB4OUJGNCwgMHg5QkQ0LCAweDlDNUQsIDB4OUMwOCwKLSAgICAweDlDMTAsIDB4OUMwRCwgMHg5QzEyLCAweDlDMDksIDB4OUJGRiwgMHg5QzIwLCAweDlDMzIsIDB4OUMyRCwKLSAgICAweDlDMjgsIDB4OUMyNSwgMHg5QzI5LCAweDlDMzMsIDB4OUMzRSwgMHg5QzQ4LCAweDlDM0IsIDB4OUMzNSwKLSAgICAweDlDNDUsIDB4OUM1NiwgMHg5QzU0LCAweDlDNTIsIDB4OUM2NywgMHg5N0MzLCAweDk3QkQsIDB4OTdDOSwKLSAgICAweDlEQkIsIDB4OUFDRiwgMHg5QUQ2LCAweDlBRDUsIDB4OUI1OCwgMHg5QjRFLCAweDk5NTcsIDB4OTk1QywKLSAgICAweDlCMjIsIDB4OUVGNywgMHg5RUYyLCAweDg5NkMsIDB4OTVDNiwgMHg5MzM2LCAweDVGNDYsIDB4ODUxNCwKLSAgICAweDdFOTQsIDB4OUY2MywgMHg1Njc5LCAweDlGMTUsIDB4NTY0MSwgMHg5QUVFLCAweDg5MDcsIDB4N0E0MCwKLSAgICAweDk4QjMsIDB4OTVBNCwgMHg5QjBELCAweDhGRjQsIDB4NUY1OSwgMHg3QTZCLCAweDk4RTIsIDB4NTBBMiwKLSAgICAweDg1OTEsIDB4NTExOCwgMHg2MzcyLCAweDUyNEIsIDB4Nzc0RiwgMHg3RThELCAweDY2QzYsIDB4NzdBRCwKLSAgICAweDlFNzUsIDB4NTZDOSwgMHg5RUY0LCAweDZGREIsIDB4NjFERSwgMHg3N0M3LCAweDcwMzAsIDB4OUVCNSwKLSAgICAweDg4NEEsIDB4OTVFMiwgMHg5N0M2LCAweDdDNjQsIDB4N0UzNCwgMHg5N0E2LCAweDlFQUYsIDB4NTZDQywKLSAgICAweDk4QjEsIDB4NkFBRiwgMHg3RjRFLCAweDdDRjAsIDB4NEZDMiwgMHg3RTZCLCAweDlFNzksIDB4NTZBRSwKLSAgICAweDlCMUEsIDB4ODQ2RiwgMHg3OUE2LCAweDdDNzIsIDB4OUFEMiwgMHg5NkJCLCAweDdERkIsIDB4ODhGRCwKLSAgICAweDc4NDMsIDB4MjE3MCwgMHgyMTcxLCAweDIxNzIsIDB4MjE3MywgMHgyMTc0LCAweDIxNzUsIDB4MjE3NiwKLSAgICAweDIxNzcsIDB4MjE3OCwgMHgyMTc5LCAweDAyQ0EsIDB4MDJDQiwgMHgwMkQ5LCAweDIwMTMsIDB4MjAxNSwKLSAgICAweDIwMjUsIDB4MjAzNSwgMHgyMTA1LCAweDIxMDksIDB4MjE5NiwgMHgyMTk3LCAweDIxOTgsIDB4MjE5OSwKLSAgICAweDIyMTUsIDB4MjIxRiwgMHgyMjIzLCAweDIyNTIsIDB4MjI2NiwgMHgyMjY3LCAweDIyQkYsIDB4MjU1MCwKLSAgICAweDI1NTEsIDB4MjU1MiwgMHgyNTUzLCAweDI1NTQsIDB4MjU1NSwgMHgyNTU2LCAweDI1NTcsIDB4MjU1OCwKLSAgICAweDI1NTksIDB4MjU1QSwgMHgyNTVCLCAweDI1NUMsIDB4MjU1RCwgMHgyNTVFLCAweDI1NUYsIDB4MjU2MCwKLSAgICAweDI1NjEsIDB4MjU2MiwgMHgyNTYzLCAweDI1NjQsIDB4MjU2NSwgMHgyNTY2LCAweDI1NjcsIDB4MjU2OCwKLSAgICAweDI1NjksIDB4MjU2QSwgMHgyNTZCLCAweDI1NkMsIDB4MjU2RCwgMHgyNTZFLCAweDI1NkYsIDB4MjU3MCwKLSAgICAweDI1NzEsIDB4MjU3MiwgMHgyNTczLCAweDI1ODEsIDB4MjU4MiwgMHgyNTgzLCAweDI1ODQsIDB4MjU4NSwKLSAgICAweDI1ODYsIDB4MjU4NywgMHgyNTg4LCAweDI1ODksIDB4MjU4QSwgMHgyNThCLCAweDI1OEMsIDB4MjU4RCwKLSAgICAweDI1OEUsIDB4MjU4RiwgMHgyNTkzLCAweDI1OTQsIDB4MjU5NSwgMHgyNUJDLCAweDI1QkQsIDB4MjVFMiwKLSAgICAweDI1RTMsIDB4MjVFNCwgMHgyNUU1LCAweDI2MDksIDB4MjI5NSwgMHgzMDEyLCAweDMwMUQsIDB4MzAxRSwKLSAgICAweDMwMjEsIDB4MzAyMiwgMHgzMDIzLCAweDMwMjQsIDB4MzAyNSwgMHgzMDI2LCAweDMwMjcsIDB4MzAyOCwKLSAgICAweDMwMjksIDB4MzJBMywgMHgzMzhFLCAweDMzOEYsIDB4MzM5QywgMHgzMzlELCAweDMzOUUsIDB4MzNBMSwKLSAgICAweDMzQzQsIDB4MzNDRSwgMHgzM0QxLCAweDMzRDIsIDB4MzNENSwgMHhGRTMwLCAweEZGRTIsIDB4RkZFNCwKLSAgICAweDIxMjEsIDB4MzIzMSwgMHgyMDEwLCAweDMwRkMsIDB4MzA5QiwgMHgzMDlDLCAweDMwRkQsIDB4MzBGRSwKLSAgICAweDMwMDYsIDB4MzA5RCwgMHgzMDlFLCAweEZFNDksIDB4RkU0QSwgMHhGRTRCLCAweEZFNEMsIDB4RkU0RCwKLSAgICAweEZFNEUsIDB4RkU0RiwgMHhGRTUwLCAweEZFNTEsIDB4RkU1MiwgMHhGRTU0LCAweEZFNTUsIDB4RkU1NiwKLSAgICAweEZFNTcsIDB4RkU1OSwgMHhGRTVBLCAweEZFNUIsIDB4RkU1QywgMHhGRTVELCAweEZFNUUsIDB4RkU1RiwKLSAgICAweEZFNjAsIDB4RkU2MSwgMHhGRTYyLCAweEZFNjMsIDB4RkU2NCwgMHhGRTY1LCAweEZFNjYsIDB4RkU2OCwKLSAgICAweEZFNjksIDB4RkU2QSwgMHhGRTZCLCAweDMwM0UsIDB4MkZGMCwgMHgyRkYxLCAweDJGRjIsIDB4MkZGMywKLSAgICAweDJGRjQsIDB4MkZGNSwgMHgyRkY2LCAweDJGRjcsIDB4MkZGOCwgMHgyRkY5LCAweDJGRkEsIDB4MkZGQiwKLSAgICAweDRFMDIsIDB4NEUwNCwgMHg0RTA1LCAweDRFMDYsIDB4NEUwRiwgMHg0RTEyLCAweDRFMTcsIDB4NEUxRiwKLSAgICAweDRFMjAsIDB4NEUyMSwgMHg0RTIzLCAweDRFMjYsIDB4NEUyOSwgMHg0RTJFLCAweDRFMkYsIDB4NEUzMSwKLSAgICAweDRFMzMsIDB4NEUzNSwgMHg0RTM3LCAweDRFM0MsIDB4NEU0MCwgMHg0RTQxLCAweDRFNDIsIDB4NEU0NCwKLSAgICAweDRFNDYsIDB4NEU0QSwgMHg0RTUxLCAweDRFNTUsIDB4NEU1NywgMHg0RTVBLCAweDRFNUIsIDB4NEU2MiwKLSAgICAweDRFNjMsIDB4NEU2NCwgMHg0RTY1LCAweDRFNjcsIDB4NEU2OCwgMHg0RTZBLCAweDRFNkIsIDB4NEU2QywKLSAgICAweDRFNkQsIDB4NEU2RSwgMHg0RTZGLCAweDRFNzIsIDB4NEU3NCwgMHg0RTc1LCAweDRFNzYsIDB4NEU3NywKLSAgICAweDRFNzgsIDB4NEU3OSwgMHg0RTdBLCAweDRFN0IsIDB4NEU3QywgMHg0RTdELCAweDRFN0YsIDB4NEU4MCwKLSAgICAweDRFODEsIDB4NEU4MywgMHg0RTg0LCAweDRFODUsIDB4NEU4NywgMHg0RThBLCAweDRFOTAsIDB4NEU5NiwKLSAgICAweDRFOTcsIDB4NEU5OSwgMHg0RTlDLCAweDRFOUQsIDB4NEVBMywgMHg0RUFBLCAweDRFQUYsIDB4NEVCMCwKLSAgICAweDRFQjEsIDB4NEVCNCwgMHg0RUI2LCAweDRFQjcsIDB4NEVCOCwgMHg0RUI5LCAweDRFQkMsIDB4NEVCRCwKLSAgICAweDRFQkUsIDB4NEVDOCwgMHg0RUNDLCAweDRFQ0YsIDB4NEVEMCwgMHg0RUQyLCAweDRFREEsIDB4NEVEQiwKLSAgICAweDRFREMsIDB4NEVFMCwgMHg0RUUyLCAweDRFRTYsIDB4NEVFNywgMHg0RUU5LCAweDRFRUQsIDB4NEVFRSwKLSAgICAweDRFRUYsIDB4NEVGMSwgMHg0RUY0LCAweDRFRjgsIDB4NEVGOSwgMHg0RUZBLCAweDRFRkMsIDB4NEVGRSwKLSAgICAweDRGMDAsIDB4NEYwMiwgMHg0RjAzLCAweDRGMDQsIDB4NEYwNSwgMHg0RjA2LCAweDRGMDcsIDB4NEYwOCwKLSAgICAweDRGMEIsIDB4NEYwQywgMHg0RjEyLCAweDRGMTMsIDB4NEYxNCwgMHg0RjE1LCAweDRGMTYsIDB4NEYxQywKLSAgICAweDRGMUQsIDB4NEYyMSwgMHg0RjIzLCAweDRGMjgsIDB4NEYyOSwgMHg0RjJDLCAweDRGMkQsIDB4NEYyRSwKLSAgICAweDRGMzEsIDB4NEYzMywgMHg0RjM1LCAweDRGMzcsIDB4NEYzOSwgMHg0RjNCLCAweDRGM0UsIDB4NEYzRiwKLSAgICAweDRGNDAsIDB4NEY0MSwgMHg0RjQyLCAweDRGNDQsIDB4NEY0NSwgMHg0RjQ3LCAweDRGNDgsIDB4NEY0OSwKLSAgICAweDRGNEEsIDB4NEY0QiwgMHg0RjRDLCAweDRGNTIsIDB4NEY1NCwgMHg0RjU2LCAweDRGNjEsIDB4NEY2MiwKLSAgICAweDRGNjYsIDB4NEY2OCwgMHg0RjZBLCAweDRGNkIsIDB4NEY2RCwgMHg0RjZFLCAweDRGNzEsIDB4NEY3MiwKLSAgICAweDRGNzUsIDB4NEY3NywgMHg0Rjc4LCAweDRGNzksIDB4NEY3QSwgMHg0RjdELCAweDRGODAsIDB4NEY4MSwKLSAgICAweDRGODIsIDB4NEY4NSwgMHg0Rjg3LCAweDRGOEEsIDB4NEY4QywgMHg0RjhFLCAweDRGOTAsIDB4NEY5MiwKLSAgICAweDRGOTMsIDB4NEY5NSwgMHg0Rjk4LCAweDRGOTksIDB4NEY5QSwgMHg0RjlDLCAweDRGOUUsIDB4NEY5RiwKLSAgICAweDRGQTEsIDB4NEZBMiwgMHg0RkE0LCAweDRGQUIsIDB4NEZBRCwgMHg0RkIwLCAweDRGQjEsIDB4NEZCMiwKLSAgICAweDRGQjMsIDB4NEZCNCwgMHg0RkI2LCAweDRGQjcsIDB4NEZCOCwgMHg0RkI5LCAweDRGQkEsIDB4NEZCQiwKLSAgICAweDRGQkMsIDB4NEZCRCwgMHg0RkJFLCAweDRGQzAsIDB4NEZDMSwgMHg0RkM2LCAweDRGQzcsIDB4NEZDOCwKLSAgICAweDRGQzksIDB4NEZDQiwgMHg0RkNDLCAweDRGQ0QsIDB4NEZEMiwgMHg0RkQzLCAweDRGRDQsIDB4NEZENSwKLSAgICAweDRGRDYsIDB4NEZEOSwgMHg0RkRCLCAweDRGRTIsIDB4NEZFNCwgMHg0RkU1LCAweDRGRTcsIDB4NEZFQiwKLSAgICAweDRGRUMsIDB4NEZGMCwgMHg0RkYyLCAweDRGRjQsIDB4NEZGNSwgMHg0RkY2LCAweDRGRjcsIDB4NEZGOSwKLSAgICAweDRGRkIsIDB4NEZGQywgMHg0RkZELCAweDRGRkYsIDB4NTAwMSwgMHg1MDAyLCAweDUwMDMsIDB4NTAwNCwKLSAgICAweDUwMDUsIDB4NTAwNywgMHg1MDA4LCAweDUwMEEsIDB4NTAwRSwgMHg1MDEwLCAweDUwMTMsIDB4NTAxNSwKLSAgICAweDUwMTYsIDB4NTAxNywgMHg1MDFCLCAweDUwMUQsIDB4NTAxRSwgMHg1MDIwLCAweDUwMjIsIDB4NTAyMywKLSAgICAweDUwMjQsIDB4NTAyNywgMHg1MDJGLCAweDUwMzAsIDB4NTAzMSwgMHg1MDMyLCAweDUwMzMsIDB4NTAzNCwKLSAgICAweDUwMzUsIDB4NTAzNiwgMHg1MDM3LCAweDUwMzgsIDB4NTAzOSwgMHg1MDNCLCAweDUwM0QsIDB4NTAzRiwKLSAgICAweDUwNDAsIDB4NTA0MSwgMHg1MDQyLCAweDUwNDQsIDB4NTA0NSwgMHg1MDQ2LCAweDUwNEEsIDB4NTA0QiwKLSAgICAweDUwNEQsIDB4NTA1MCwgMHg1MDUxLCAweDUwNTIsIDB4NTA1MywgMHg1MDU0LCAweDUwNTYsIDB4NTA1NywKLSAgICAweDUwNTgsIDB4NTA1OSwgMHg1MDVCLCAweDUwNUQsIDB4NTA1RSwgMHg1MDVGLCAweDUwNjAsIDB4NTA2MSwKLSAgICAweDUwNjIsIDB4NTA2MywgMHg1MDY0LCAweDUwNjYsIDB4NTA2NywgMHg1MDY4LCAweDUwNjksIDB4NTA2QSwKLSAgICAweDUwNkIsIDB4NTA2RCwgMHg1MDZFLCAweDUwNkYsIDB4NTA3MCwgMHg1MDcxLCAweDUwNzIsIDB4NTA3MywKLSAgICAweDUwNzgsIDB4NTA3OSwgMHg1MDdBLCAweDUwN0MsIDB4NTA3RCwgMHg1MDgxLCAweDUwODIsIDB4NTA4MywKLSAgICAweDUwODQsIDB4NTA4NiwgMHg1MDg3LCAweDUwODksIDB4NTA4QSwgMHg1MDhCLCAweDUwOEMsIDB4NTA4RSwKLSAgICAweDUwOEYsIDB4NTA5MCwgMHg1MDkxLCAweDUwOTIsIDB4NTA5MywgMHg1MDk0LCAweDUwOTUsIDB4NTA5NywKLSAgICAweDUwOUEsIDB4NTA5QiwgMHg1MDlDLCAweDUwOUQsIDB4NTA5RSwgMHg1MDlGLCAweDUwQTAsIDB4NTBBMSwKLSAgICAweDUwQTQsIDB4NTBBNiwgMHg1MEFBLCAweDUwQUIsIDB4NTBBRSwgMHg1MEFGLCAweDUwQjAsIDB4NTBCMSwKLSAgICAweDUwQjYsIDB4NTBCOCwgMHg1MEI5LCAweDUwQkMsIDB4NTBCRCwgMHg1MEJGLCAweDUwQzAsIDB4NTBDMSwKLSAgICAweDUwQzMsIDB4NTBDNCwgMHg1MEM2LCAweDUwQzcsIDB4NTBDOCwgMHg1MENBLCAweDUwQ0IsIDB4NTBDQywKLSAgICAweDUwQ0QsIDB4NTBDRSwgMHg1MEQwLCAweDUwRDIsIDB4NTBEMywgMHg1MEQ0LCAweDUwRDcsIDB4NTBEOCwKLSAgICAweDUwRDksIDB4NTBEQiwgMHg1MERDLCAweDUwREQsIDB4NTBERiwgMHg1MEUwLCAweDUwRTEsIDB4NTBFMiwKLSAgICAweDUwRTMsIDB4NTBFNCwgMHg1MEU5LCAweDUwRUEsIDB4NTBFQiwgMHg1MEVGLCAweDUwRjAsIDB4NTBGMSwKLSAgICAweDUwRjIsIDB4NTBGNCwgMHg1MEY2LCAweDUwRjcsIDB4NTBGOCwgMHg1MEZBLCAweDUwRkMsIDB4NTBGRCwKLSAgICAweDUwRkUsIDB4NTBGRiwgMHg1MTAxLCAweDUxMDMsIDB4NTEwNSwgMHg1MTBBLCAweDUxMEMsIDB4NTEwRCwKLSAgICAweDUxMEUsIDB4NTEwRiwgMHg1MTExLCAweDUxMTMsIDB4NTExNiwgMHg1MTE3LCAweDUxMTksIDB4NTExQSwKLSAgICAweDUxMUIsIDB4NTExQywgMHg1MTFELCAweDUxMUUsIDB4NTEyMCwgMHg1MTIyLCAweDUxMjMsIDB4NTEyNCwKLSAgICAweDUxMjUsIDB4NTEyNiwgMHg1MTI3LCAweDUxMjgsIDB4NTEyOSwgMHg1MTJCLCAweDUxMkMsIDB4NTEyRCwKLSAgICAweDUxMkUsIDB4NTEyRiwgMHg1MTMwLCAweDUxMzEsIDB4NTEzMywgMHg1MTM0LCAweDUxMzUsIDB4NTEzNiwKLSAgICAweDUxMzgsIDB4NTEzOSwgMHg1MTNELCAweDUxM0UsIDB4NTE0MiwgMHg1MTQ3LCAweDUxNEEsIDB4NTE0QywKLSAgICAweDUxNEUsIDB4NTE0RiwgMHg1MTUwLCAweDUxNTMsIDB4NTE1NywgMHg1MTU4LCAweDUxNTksIDB4NTE1QiwKLSAgICAweDUxNUQsIDB4NTE1RSwgMHg1MTVGLCAweDUxNjAsIDB4NTE2MSwgMHg1MTYzLCAweDUxNjQsIDB4NTE2NiwKLSAgICAweDUxNjcsIDB4NTE2QSwgMHg1MTZGLCAweDUxNzIsIDB4NTE3QSwgMHg1MTdFLCAweDUxN0YsIDB4NTE4MywKLSAgICAweDUxODQsIDB4NTE4NiwgMHg1MTg3LCAweDUxOEEsIDB4NTE4QiwgMHg1MThFLCAweDUxOEYsIDB4NTE5MCwKLSAgICAweDUxOTEsIDB4NTE5MywgMHg1MTk0LCAweDUxOTgsIDB4NTE5QSwgMHg1MTlELCAweDUxOUUsIDB4NTE5RiwKLSAgICAweDUxQTEsIDB4NTFBMywgMHg1MUE2LCAweDUxQTcsIDB4NTFBOCwgMHg1MUE5LCAweDUxQUEsIDB4NTFBRCwKLSAgICAweDUxQUUsIDB4NTFCNCwgMHg1MUI4LCAweDUxQjksIDB4NTFCQSwgMHg1MUJFLCAweDUxQkYsIDB4NTFDMSwKLSAgICAweDUxQzIsIDB4NTFDMywgMHg1MUM1LCAweDUxQzgsIDB4NTFDQSwgMHg1MUNFLCAweDUxRDAsIDB4NTFEMiwKLSAgICAweDUxRDMsIDB4NTFENCwgMHg1MUQ1LCAweDUxRDYsIDB4NTFENywgMHg1MUQ4LCAweDUxRDksIDB4NTFEQSwKLSAgICAweDUxREMsIDB4NTFERSwgMHg1MURGLCAweDUxRTIsIDB4NTFFMywgMHg1MUU1LCAweDUxRTYsIDB4NTFFNywKLSAgICAweDUxRTgsIDB4NTFFOSwgMHg1MUVBLCAweDUxRUMsIDB4NTFFRSwgMHg1MUYyLCAweDUxRjQsIDB4NTFGNywKLSAgICAweDUxRkUsIDB4NTIwNCwgMHg1MjA1LCAweDUyMDksIDB4NTIwQiwgMHg1MjBDLCAweDUyMEYsIDB4NTIxMCwKLSAgICAweDUyMTMsIDB4NTIxNCwgMHg1MjE1LCAweDUyMUMsIDB4NTIxRSwgMHg1MjFGLCAweDUyMjEsIDB4NTIyMiwKLSAgICAweDUyMjMsIDB4NTIyNSwgMHg1MjI2LCAweDUyMjcsIDB4NTIyQSwgMHg1MjJDLCAweDUyMkYsIDB4NTIzMSwKLSAgICAweDUyMzIsIDB4NTIzNCwgMHg1MjM1LCAweDUyM0MsIDB4NTIzRSwgMHg1MjQ1LCAweDUyNDYsIDB4NTI0OCwKLSAgICAweDUyNDksIDB4NTI0RSwgMHg1MjRGLCAweDUyNTIsIDB4NTI1MywgMHg1MjU1LCAweDUyNTcsIDB4NTI1OCwKLSAgICAweDUyNTksIDB4NTI1QSwgMHg1MjVELCAweDUyNUYsIDB4NTI2MCwgMHg1MjYyLCAweDUyNjMsIDB4NTI2NCwKLSAgICAweDUyNjYsIDB4NTI2OCwgMHg1MjZCLCAweDUyNkMsIDB4NTI2RCwgMHg1MjcwLCAweDUyNzEsIDB4NTI3MywKLSAgICAweDUyNzYsIDB4NTI3NywgMHg1Mjc4LCAweDUyNzksIDB4NTI3QSwgMHg1MjdCLCAweDUyN0MsIDB4NTI3RSwKLSAgICAweDUyODAsIDB4NTI4NCwgMHg1Mjg1LCAweDUyODYsIDB4NTI4QiwgMHg1MjhFLCAweDUyOEYsIDB4NTI5MiwKLSAgICAweDUyOTQsIDB4NTI5NSwgMHg1Mjk2LCAweDUyOTcsIDB4NTI5OCwgMHg1Mjk5LCAweDUyOUEsIDB4NTI5QywKLSAgICAweDUyQTQsIDB4NTJBNSwgMHg1MkE2LCAweDUyQTcsIDB4NTJBRSwgMHg1MkFGLCAweDUyQjAsIDB4NTJCNCwKLSAgICAweDUyQjUsIDB4NTJCNiwgMHg1MkI3LCAweDUyQjgsIDB4NTJCOSwgMHg1MkJBLCAweDUyQkIsIDB4NTJCQywKLSAgICAweDUyQkQsIDB4NTJDMCwgMHg1MkMyLCAweDUyQzQsIDB4NTJDNSwgMHg1MkM2LCAweDUyQzgsIDB4NTJDQSwKLSAgICAweDUyQ0MsIDB4NTJDRCwgMHg1MkNFLCAweDUyQ0YsIDB4NTJEMSwgMHg1MkQzLCAweDUyRDQsIDB4NTJENywKLSAgICAweDUyREEsIDB4NTJEQywgMHg1MkUwLCAweDUyRTEsIDB4NTJFMywgMHg1MkU1LCAweDUyRTYsIDB4NTJFNywKLSAgICAweDUyRTgsIDB4NTJFOSwgMHg1MkVBLCAweDUyRUIsIDB4NTJFQywgMHg1MkVELCAweDUyRUUsIDB4NTJFRiwKLSAgICAweDUyRjIsIDB4NTJGMywgMHg1MkY0LCAweDUyRjYsIDB4NTJGNywgMHg1MkZCLCAweDUyRkMsIDB4NTJGRCwKLSAgICAweDUzMDEsIDB4NTMwMiwgMHg1MzAzLCAweDUzMDQsIDB4NTMwNywgMHg1MzA5LCAweDUzMEEsIDB4NTMwQiwKLSAgICAweDUzMEMsIDB4NTMwRSwgMHg1MzExLCAweDUzMTIsIDB4NTMxMywgMHg1MzE0LCAweDUzMTgsIDB4NTMxQiwKLSAgICAweDUzMUMsIDB4NTMxRSwgMHg1MzFGLCAweDUzMjIsIDB4NTMyNCwgMHg1MzI1LCAweDUzMjcsIDB4NTMyOCwKLSAgICAweDUzMjksIDB4NTMyQiwgMHg1MzJDLCAweDUzMzAsIDB4NTMzMiwgMHg1MzMzLCAweDUzMzQsIDB4NTMzNSwKLSAgICAweDUzMzYsIDB4NTMzNywgMHg1MzM4LCAweDUzM0MsIDB4NTMzRCwgMHg1MzQyLCAweDUzNDQsIDB4NTM0NiwKLSAgICAweDUzNEIsIDB4NTM0QywgMHg1MzRELCAweDUzNTAsIDB4NTM1OCwgMHg1MzU5LCAweDUzNUIsIDB4NTM1RCwKLSAgICAweDUzNjUsIDB4NTM2OCwgMHg1MzZBLCAweDUzNkMsIDB4NTM2RCwgMHg1MzcyLCAweDUzNzYsIDB4NTM3OSwKLSAgICAweDUzN0IsIDB4NTM3QywgMHg1MzdELCAweDUzN0UsIDB4NTM4MCwgMHg1MzgxLCAweDUzODMsIDB4NTM4NywKLSAgICAweDUzODgsIDB4NTM4QSwgMHg1MzhFLCAweDUzOEYsIDB4NTM5MCwgMHg1MzkxLCAweDUzOTIsIDB4NTM5MywKLSAgICAweDUzOTQsIDB4NTM5NiwgMHg1Mzk3LCAweDUzOUIsIDB4NTM5QywgMHg1MzlFLCAweDUzQTEsIDB4NTNBNCwKLSAgICAweDUzQTcsIDB4NTNBQSwgMHg1M0FCLCAweDUzQUMsIDB4NTNBRiwgMHg1M0IwLCAweDUzQjEsIDB4NTNCMywKLSAgICAweDUzQjUsIDB4NTNCNywgMHg1M0I4LCAweDUzQjksIDB4NTNCQSwgMHg1M0JDLCAweDUzQkQsIDB4NTNCRSwKLSAgICAweDUzQzAsIDB4NTNDNCwgMHg1M0M1LCAweDUzQzYsIDB4NTNDNywgMHg1M0NFLCAweDUzQ0YsIDB4NTNEMCwKLSAgICAweDUzRDIsIDB4NTNEMywgMHg1M0Q1LCAweDUzREEsIDB4NTNEQywgMHg1M0RELCAweDUzREUsIDB4NTNFMSwKLSAgICAweDUzRTcsIDB4NTNGNCwgMHg1M0ZBLCAweDUzRkUsIDB4NTNGRiwgMHg1NDAwLCAweDU0MDIsIDB4NTQwNSwKLSAgICAweDU0MDcsIDB4NTQwQiwgMHg1NDE0LCAweDU0MTgsIDB4NTQxOSwgMHg1NDFBLCAweDU0MUMsIDB4NTQyMiwKLSAgICAweDU0MjQsIDB4NTQyNSwgMHg1NDJBLCAweDU0MzAsIDB4NTQzMywgMHg1NDM2LCAweDU0MzcsIDB4NTQzQSwKLSAgICAweDU0M0QsIDB4NTQzRiwgMHg1NDQxLCAweDU0NDIsIDB4NTQ0NCwgMHg1NDQ1LCAweDU0NDcsIDB4NTQ0OSwKLSAgICAweDU0NEMsIDB4NTQ0RCwgMHg1NDRFLCAweDU0NEYsIDB4NTQ1MSwgMHg1NDVBLCAweDU0NUQsIDB4NTQ1RSwKLSAgICAweDU0NUYsIDB4NTQ2MCwgMHg1NDYxLCAweDU0NjMsIDB4NTQ2NSwgMHg1NDY3LCAweDU0NjksIDB4NTQ2QSwKLSAgICAweDU0NkIsIDB4NTQ2QywgMHg1NDZELCAweDU0NkUsIDB4NTQ2RiwgMHg1NDcwLCAweDU0NzQsIDB4NTQ3OSwKLSAgICAweDU0N0EsIDB4NTQ3RSwgMHg1NDdGLCAweDU0ODEsIDB4NTQ4MywgMHg1NDg1LCAweDU0ODcsIDB4NTQ4OCwKLSAgICAweDU0ODksIDB4NTQ4QSwgMHg1NDhELCAweDU0OTEsIDB4NTQ5MywgMHg1NDk3LCAweDU0OTgsIDB4NTQ5QywKLSAgICAweDU0OUUsIDB4NTQ5RiwgMHg1NEEwLCAweDU0QTEsIDB4NTRBMiwgMHg1NEE1LCAweDU0QUUsIDB4NTRCMCwKLSAgICAweDU0QjIsIDB4NTRCNSwgMHg1NEI2LCAweDU0QjcsIDB4NTRCOSwgMHg1NEJBLCAweDU0QkUsIDB4NTRDMywKLSAgICAweDU0QzUsIDB4NTRDQSwgMHg1NENCLCAweDU0RDYsIDB4NTREOCwgMHg1NERCLCAweDU0RTAsIDB4NTRFMiwKLSAgICAweDU0RTMsIDB4NTRFNCwgMHg1NEVCLCAweDU0RUMsIDB4NTRFRiwgMHg1NEYwLCAweDU0RjEsIDB4NTRGNCwKLSAgICAweDU0RjUsIDB4NTRGNiwgMHg1NEY3LCAweDU0RjgsIDB4NTRGOSwgMHg1NEZCLCAweDU0RkUsIDB4NTUwMCwKLSAgICAweDU1MDIsIDB4NTUwMywgMHg1NTA1LCAweDU1MDgsIDB4NTUwQSwgMHg1NTBCLCAweDU1MEMsIDB4NTUwRCwKLSAgICAweDU1MEUsIDB4NTUxMiwgMHg1NTEzLCAweDU1MTUsIDB4NTUxNiwgMHg1NTE3LCAweDU1MTgsIDB4NTUxOSwKLSAgICAweDU1MUEsIDB4NTUxQywgMHg1NTFELCAweDU1MUUsIDB4NTUxRiwgMHg1NTIxLCAweDU1MjUsIDB4NTUyNiwKLSAgICAweDU1MjgsIDB4NTUyOSwgMHg1NTJCLCAweDU1MkQsIDB4NTUzMiwgMHg1NTM0LCAweDU1MzUsIDB4NTUzNiwKLSAgICAweDU1MzgsIDB4NTUzOSwgMHg1NTNBLCAweDU1M0IsIDB4NTUzRCwgMHg1NTQwLCAweDU1NDIsIDB4NTU0NSwKLSAgICAweDU1NDcsIDB4NTU0OCwgMHg1NTRCLCAweDU1NEMsIDB4NTU0RCwgMHg1NTRFLCAweDU1NTEsIDB4NTU1MiwKLSAgICAweDU1NTQsIDB4NTU1NywgMHg1NTU4LCAweDU1NTksIDB4NTU1QSwgMHg1NTVCLCAweDU1NUQsIDB4NTU1RiwKLSAgICAweDU1NjAsIDB4NTU2MiwgMHg1NTYzLCAweDU1NjgsIDB4NTU2OSwgMHg1NTZCLCAweDU1NkYsIDB4NTU3MCwKLSAgICAweDU1NzEsIDB4NTU3MiwgMHg1NTczLCAweDU1NzQsIDB4NTU3OSwgMHg1NTdBLCAweDU1N0QsIDB4NTU3RiwKLSAgICAweDU1ODUsIDB4NTU4NiwgMHg1NThDLCAweDU1OEQsIDB4NTU4RSwgMHg1NTkwLCAweDU1OTIsIDB4NTU5MywKLSAgICAweDU1OTUsIDB4NTU5NiwgMHg1NTk3LCAweDU1OUEsIDB4NTU5QiwgMHg1NTlFLCAweDU1QTAsIDB4NTVBMSwKLSAgICAweDU1QTIsIDB4NTVBMywgMHg1NUE0LCAweDU1QTUsIDB4NTVBNiwgMHg1NUE4LCAweDU1QTksIDB4NTVBQiwKLSAgICAweDU1QUQsIDB4NTVBRiwgMHg1NUIwLCAweDU1QjQsIDB4NTVCNiwgMHg1NUI4LCAweDU1QkEsIDB4NTVCQywKLSAgICAweDU1QkYsIDB4NTVDMCwgMHg1NUMxLCAweDU1QzIsIDB4NTVDMywgMHg1NUM4LCAweDU1Q0EsIDB4NTVDQiwKLSAgICAweDU1Q0YsIDB4NTVEMCwgMHg1NUQ1LCAweDU1RDcsIDB4NTVEOCwgMHg1NUQ5LCAweDU1REIsIDB4NTVERSwKLSAgICAweDU1RTAsIDB4NTVFMiwgMHg1NUU3LCAweDU1RUQsIDB4NTVFRSwgMHg1NUYwLCAweDU1RjEsIDB4NTVGNCwKLSAgICAweDU1RjgsIDB4NTVGOSwgMHg1NUZBLCAweDU1RkIsIDB4NTVGQywgMHg1NUZGLCAweDU2MDIsIDB4NTYwMywKLSAgICAweDU2MDQsIDB4NTYwNSwgMHg1NjA3LCAweDU2MEEsIDB4NTYwQiwgMHg1NjEwLCAweDU2MTEsIDB4NTYxMiwKLSAgICAweDU2MTMsIDB4NTYxNSwgMHg1NjE5LCAweDU2MUEsIDB4NTYxRCwgMHg1NjIwLCAweDU2MjEsIDB4NTYyMiwKLSAgICAweDU2MjUsIDB4NTYyNiwgMHg1NjI4LCAweDU2MkEsIDB4NTYyQiwgMHg1NjMzLCAweDU2MzcsIDB4NTYzQSwKLSAgICAweDU2M0MsIDB4NTYzRCwgMHg1NjNFLCAweDU2NDAsIDB4NTY0MiwgMHg1NjQzLCAweDU2NDQsIDB4NTY0NSwKLSAgICAweDU2NDYsIDB4NTY0NywgMHg1NjQ4LCAweDU2NDksIDB4NTY0QSwgMHg1NjRCLCAweDU2NEYsIDB4NTY1MCwKLSAgICAweDU2NTEsIDB4NTY1MiwgMHg1NjUzLCAweDU2NTUsIDB4NTY1NiwgMHg1NjVBLCAweDU2NUIsIDB4NTY1RSwKLSAgICAweDU2NUYsIDB4NTY2MSwgMHg1NjYzLCAweDU2NjcsIDB4NTY2RCwgMHg1NjZFLCAweDU2NzAsIDB4NTY3MywKLSAgICAweDU2NzUsIDB4NTY3NywgMHg1NjdBLCAweDU2N0QsIDB4NTY3RSwgMHg1NjdGLCAweDU2ODEsIDB4NTY4MiwKLSAgICAweDU2ODMsIDB4NTY4NCwgMHg1Njg4LCAweDU2ODksIDB4NTY4QSwgMHg1NjhCLCAweDU2OEQsIDB4NTY5MCwKLSAgICAweDU2OTEsIDB4NTY5MiwgMHg1Njk0LCAweDU2OTYsIDB4NTY5NywgMHg1Njk4LCAweDU2OUEsIDB4NTY5QiwKLSAgICAweDU2OUMsIDB4NTY5RCwgMHg1NjlFLCAweDU2OUYsIDB4NTZBMCwgMHg1NkExLCAweDU2QTIsIDB4NTZBNCwKLSAgICAweDU2QTUsIDB4NTZBNywgMHg1NkE5LCAweDU2QUEsIDB4NTZBQiwgMHg1NkFDLCAweDU2QUQsIDB4NTZCMCwKLSAgICAweDU2QjEsIDB4NTZCMiwgMHg1NkI1LCAweDU2QjgsIDB4NTZCOSwgMHg1NkJBLCAweDU2QkIsIDB4NTZCRCwKLSAgICAweDU2QkUsIDB4NTZCRiwgMHg1NkMzLCAweDU2QzQsIDB4NTZDNiwgMHg1NkM3LCAweDU2Q0IsIDB4NTZDRCwKLSAgICAweDU2Q0UsIDB4NTZDRiwgMHg1NkQwLCAweDU2RDIsIDB4NTZEMywgMHg1NkQ1LCAweDU2RDYsIDB4NTZEOCwKLSAgICAweDU2RDksIDB4NTZEQywgMHg1NkUzLCAweDU2RTUsIDB4NTZFNiwgMHg1NkU3LCAweDU2RTgsIDB4NTZFOSwKLSAgICAweDU2RUEsIDB4NTZFQywgMHg1NkVFLCAweDU2RUYsIDB4NTZGMiwgMHg1NkYzLCAweDU2RjYsIDB4NTZGNywKLSAgICAweDU2RjgsIDB4NTZGQiwgMHg1NkZDLCAweDU3MDAsIDB4NTcwMSwgMHg1NzAyLCAweDU3MDUsIDB4NTcwQywKLSAgICAweDU3MEUsIDB4NTcwRiwgMHg1NzEwLCAweDU3MTEsIDB4NTcxNCwgMHg1NzE1LCAweDU3MTcsIDB4NTcxOSwKLSAgICAweDU3MUEsIDB4NTcxQiwgMHg1NzFELCAweDU3MUUsIDB4NTcyMCwgMHg1NzIxLCAweDU3MjIsIDB4NTcyNCwKLSAgICAweDU3MjUsIDB4NTcyNiwgMHg1NzI3LCAweDU3MkIsIDB4NTczMSwgMHg1NzMyLCAweDU3MzQsIDB4NTczNSwKLSAgICAweDU3MzYsIDB4NTczNywgMHg1NzM4LCAweDU3M0MsIDB4NTczRCwgMHg1NzNGLCAweDU3NDEsIDB4NTc0MywKLSAgICAweDU3NDQsIDB4NTc0NSwgMHg1NzQ2LCAweDU3NDgsIDB4NTc0OSwgMHg1NzRCLCAweDU3NTIsIDB4NTc1MywKLSAgICAweDU3NTQsIDB4NTc1NSwgMHg1NzU2LCAweDU3NTgsIDB4NTc1OSwgMHg1NzYyLCAweDU3NjMsIDB4NTc2NSwKLSAgICAweDU3NjcsIDB4NTc2QywgMHg1NzZFLCAweDU3NzAsIDB4NTc3MSwgMHg1NzcyLCAweDU3NzQsIDB4NTc3NSwKLSAgICAweDU3NzgsIDB4NTc3OSwgMHg1NzdBLCAweDU3N0QsIDB4NTc3RSwgMHg1NzdGLCAweDU3ODAsIDB4NTc4MSwKLSAgICAweDU3ODcsIDB4NTc4OCwgMHg1Nzg5LCAweDU3OEEsIDB4NTc4RCwgMHg1NzhFLCAweDU3OEYsIDB4NTc5MCwKLSAgICAweDU3OTEsIDB4NTc5NCwgMHg1Nzk1LCAweDU3OTYsIDB4NTc5NywgMHg1Nzk4LCAweDU3OTksIDB4NTc5QSwKLSAgICAweDU3OUMsIDB4NTc5RCwgMHg1NzlFLCAweDU3OUYsIDB4NTdBNSwgMHg1N0E4LCAweDU3QUEsIDB4NTdBQywKLSAgICAweDU3QUYsIDB4NTdCMCwgMHg1N0IxLCAweDU3QjMsIDB4NTdCNSwgMHg1N0I2LCAweDU3QjcsIDB4NTdCOSwKLSAgICAweDU3QkEsIDB4NTdCQiwgMHg1N0JDLCAweDU3QkQsIDB4NTdCRSwgMHg1N0JGLCAweDU3QzAsIDB4NTdDMSwKLSAgICAweDU3QzQsIDB4NTdDNSwgMHg1N0M2LCAweDU3QzcsIDB4NTdDOCwgMHg1N0M5LCAweDU3Q0EsIDB4NTdDQywKLSAgICAweDU3Q0QsIDB4NTdEMCwgMHg1N0QxLCAweDU3RDMsIDB4NTdENiwgMHg1N0Q3LCAweDU3REIsIDB4NTdEQywKLSAgICAweDU3REUsIDB4NTdFMiwgMHg1N0UzLCAweDU3RTUsIDB4NTdFNiwgMHg1N0U3LCAweDU3RTgsIDB4NTdFOSwKLSAgICAweDU3RUEsIDB4NTdFQiwgMHg1N0VDLCAweDU3RUUsIDB4NTdGMCwgMHg1N0YxLCAweDU3RjIsIDB4NTdGMywKLSAgICAweDU3RjUsIDB4NTdGNiwgMHg1N0ZCLCAweDU3RkMsIDB4NTdGRSwgMHg1N0ZGLCAweDU4MDEsIDB4NTgwMywKLSAgICAweDU4MDQsIDB4NTgwOCwgMHg1ODA5LCAweDU4MEMsIDB4NTgwRSwgMHg1ODBGLCAweDU4MTAsIDB4NTgxMiwKLSAgICAweDU4MTMsIDB4NTgxNCwgMHg1ODE3LCAweDU4MTgsIDB4NTgxQSwgMHg1ODFCLCAweDU4MUMsIDB4NTgxRiwKLSAgICAweDU4MjIsIDB4NTgyMywgMHg1ODI1LCAweDU4MjYsIDB4NTgyNywgMHg1ODI4LCAweDU4MjksIDB4NTgyQiwKLSAgICAweDU4MkMsIDB4NTgyRCwgMHg1ODJFLCAweDU4MzIsIDB4NTgzMywgMHg1ODM2LCAweDU4MzcsIDB4NTgzOCwKLSAgICAweDU4MzksIDB4NTgzQSwgMHg1ODNCLCAweDU4M0MsIDB4NTgzRCwgMHg1ODNFLCAweDU4M0YsIDB4NTg0MCwKLSAgICAweDU4NDEsIDB4NTg0MiwgMHg1ODQzLCAweDU4NDUsIDB4NTg0NiwgMHg1ODQ3LCAweDU4NDgsIDB4NTg0OSwKLSAgICAweDU4NEUsIDB4NTg1MCwgMHg1ODUzLCAweDU4NTUsIDB4NTg1NiwgMHg1ODU5LCAweDU4NUEsIDB4NTg1QiwKLSAgICAweDU4NUMsIDB4NTg1RCwgMHg1ODVGLCAweDU4NjAsIDB4NTg2MSwgMHg1ODYzLCAweDU4NjYsIDB4NTg2NywKLSAgICAweDU4NjgsIDB4NTg2OSwgMHg1ODZBLCAweDU4NkQsIDB4NTg2RSwgMHg1ODZGLCAweDU4NzAsIDB4NTg3MSwKLSAgICAweDU4NzIsIDB4NTg3MywgMHg1ODc0LCAweDU4NzYsIDB4NTg3NywgMHg1ODc4LCAweDU4N0EsIDB4NTg3QiwKLSAgICAweDU4N0MsIDB4NTg3RCwgMHg1ODdGLCAweDU4ODIsIDB4NTg4NCwgMHg1ODg2LCAweDU4ODcsIDB4NTg4OCwKLSAgICAweDU4OEIsIDB4NTg4QywgMHg1ODhELCAweDU4OEUsIDB4NTg4RiwgMHg1ODkwLCAweDU4OTEsIDB4NTg5NCwKLSAgICAweDU4OTUsIDB4NTg5NiwgMHg1ODk3LCAweDU4OTgsIDB4NTg5QiwgMHg1ODlELCAweDU4QTAsIDB4NThBMSwKLSAgICAweDU4QTIsIDB4NThBMywgMHg1OEE0LCAweDU4QTUsIDB4NThBNiwgMHg1OEE3LCAweDU4QUEsIDB4NThBQiwKLSAgICAweDU4QUMsIDB4NThBRCwgMHg1OEFGLCAweDU4QjAsIDB4NThCMSwgMHg1OEIyLCAweDU4QjQsIDB4NThCNSwKLSAgICAweDU4QjYsIDB4NThCNywgMHg1OEI4LCAweDU4QjksIDB4NThCQSwgMHg1OEJELCAweDU4QkYsIDB4NThDMCwKLSAgICAweDU4QzIsIDB4NThDMywgMHg1OEM0LCAweDU4QzYsIDB4NThDOCwgMHg1OEM5LCAweDU4Q0EsIDB4NThDQiwKLSAgICAweDU4Q0MsIDB4NThDRCwgMHg1OENFLCAweDU4Q0YsIDB4NThEMCwgMHg1OEQyLCAweDU4RDQsIDB4NThENiwKLSAgICAweDU4RDcsIDB4NThEQiwgMHg1OERDLCAweDU4REQsIDB4NThFMSwgMHg1OEUzLCAweDU4RTUsIDB4NThFNiwKLSAgICAweDU4RTcsIDB4NThFOCwgMHg1OEVBLCAweDU4RUQsIDB4NThGMSwgMHg1OEYyLCAweDU4RjQsIDB4NThGNSwKLSAgICAweDU4RjcsIDB4NThGOCwgMHg1OEZCLCAweDU4RkMsIDB4NThGRSwgMHg1OEZGLCAweDU5MDAsIDB4NTkwMSwKLSAgICAweDU5MDMsIDB4NTkwNSwgMHg1OTA2LCAweDU5MDgsIDB4NTkwOSwgMHg1OTBBLCAweDU5MEIsIDB4NTkwQywKLSAgICAweDU5MEUsIDB4NTkxMCwgMHg1OTExLCAweDU5MTIsIDB4NTkxMywgMHg1OTE3LCAweDU5MTgsIDB4NTkxQiwKLSAgICAweDU5MUQsIDB4NTkxRSwgMHg1OTIwLCAweDU5MjEsIDB4NTkyMywgMHg1OTI2LCAweDU5MjgsIDB4NTkyQywKLSAgICAweDU5MzAsIDB4NTkzMiwgMHg1OTMzLCAweDU5MzUsIDB4NTkzNiwgMHg1OTNCLCAweDU5M0QsIDB4NTkzRiwKLSAgICAweDU5NDAsIDB4NTk0MywgMHg1OTQ1LCAweDU5NDYsIDB4NTk0QSwgMHg1OTRDLCAweDU5NEQsIDB4NTk1MCwKLSAgICAweDU5NTIsIDB4NTk1MywgMHg1OTU5LCAweDU5NUIsIDB4NTk1QywgMHg1OTVELCAweDU5NUUsIDB4NTk1RiwKLSAgICAweDU5NjEsIDB4NTk2MywgMHg1OTY0LCAweDU5NjYsIDB4NTk2NywgMHg1OTY4LCAweDU5NkIsIDB4NTk2RCwKLSAgICAweDU5NkYsIDB4NTk3MCwgMHg1OTcxLCAweDU5NzIsIDB4NTk3NSwgMHg1OTc3LCAweDU5N0EsIDB4NTk3QiwKLSAgICAweDU5N0MsIDB4NTk3RSwgMHg1OTdGLCAweDU5ODAsIDB4NTk4NSwgMHg1OTg5LCAweDU5OEIsIDB4NTk4QywKLSAgICAweDU5OEUsIDB4NTk4RiwgMHg1OTkwLCAweDU5OTEsIDB4NTk5NCwgMHg1OTk1LCAweDU5OTgsIDB4NTk5QSwKLSAgICAweDU5OUIsIDB4NTk5QywgMHg1OTlGLCAweDU5QTAsIDB4NTlBMSwgMHg1OUEyLCAweDU5QTYsIDB4NTlBNywKLSAgICAweDU5QUMsIDB4NTlBRCwgMHg1OUIwLCAweDU5QjEsIDB4NTlCMywgMHg1OUI0LCAweDU5QjUsIDB4NTlCNiwKLSAgICAweDU5QjcsIDB4NTlCOCwgMHg1OUJBLCAweDU5QkMsIDB4NTlCRCwgMHg1OUJGLCAweDU5QzAsIDB4NTlDMSwKLSAgICAweDU5QzIsIDB4NTlDMywgMHg1OUM0LCAweDU5QzUsIDB4NTlDNywgMHg1OUM4LCAweDU5QzksIDB4NTlDQywKLSAgICAweDU5Q0QsIDB4NTlDRSwgMHg1OUNGLCAweDU5RDUsIDB4NTlENiwgMHg1OUQ5LCAweDU5REIsIDB4NTlERSwKLSAgICAweDU5REYsIDB4NTlFMCwgMHg1OUUxLCAweDU5RTIsIDB4NTlFNCwgMHg1OUU2LCAweDU5RTcsIDB4NTlFOSwKLSAgICAweDU5RUEsIDB4NTlFQiwgMHg1OUVELCAweDU5RUUsIDB4NTlFRiwgMHg1OUYwLCAweDU5RjEsIDB4NTlGMiwKLSAgICAweDU5RjMsIDB4NTlGNCwgMHg1OUY1LCAweDU5RjYsIDB4NTlGNywgMHg1OUY4LCAweDU5RkEsIDB4NTlGQywKLSAgICAweDU5RkQsIDB4NTlGRSwgMHg1QTAwLCAweDVBMDIsIDB4NUEwQSwgMHg1QTBCLCAweDVBMEQsIDB4NUEwRSwKLSAgICAweDVBMEYsIDB4NUExMCwgMHg1QTEyLCAweDVBMTQsIDB4NUExNSwgMHg1QTE2LCAweDVBMTcsIDB4NUExOSwKLSAgICAweDVBMUEsIDB4NUExQiwgMHg1QTFELCAweDVBMUUsIDB4NUEyMSwgMHg1QTIyLCAweDVBMjQsIDB4NUEyNiwKLSAgICAweDVBMjcsIDB4NUEyOCwgMHg1QTJBLCAweDVBMkIsIDB4NUEyQywgMHg1QTJELCAweDVBMkUsIDB4NUEyRiwKLSAgICAweDVBMzAsIDB4NUEzMywgMHg1QTM1LCAweDVBMzcsIDB4NUEzOCwgMHg1QTM5LCAweDVBM0EsIDB4NUEzQiwKLSAgICAweDVBM0QsIDB4NUEzRSwgMHg1QTNGLCAweDVBNDIsIDB4NUE0MywgMHg1QTQ0LCAweDVBNDUsIDB4NUE0NywKLSAgICAweDVBNDgsIDB4NUE0QiwgMHg1QTRDLCAweDVBNEQsIDB4NUE0RSwgMHg1QTRGLCAweDVBNTAsIDB4NUE1MSwKLSAgICAweDVBNTIsIDB4NUE1MywgMHg1QTU0LCAweDVBNTYsIDB4NUE1NywgMHg1QTU4LCAweDVBNTksIDB4NUE1QiwKLSAgICAweDVBNUMsIDB4NUE1RCwgMHg1QTVFLCAweDVBNUYsIDB4NUE2MCwgMHg1QTYxLCAweDVBNjMsIDB4NUE2NCwKLSAgICAweDVBNjUsIDB4NUE2OCwgMHg1QTY5LCAweDVBNkIsIDB4NUE2QywgMHg1QTZFLCAweDVBNkYsIDB4NUE3MCwKLSAgICAweDVBNzEsIDB4NUE3MiwgMHg1QTczLCAweDVBNzgsIDB4NUE3OSwgMHg1QTdCLCAweDVBN0MsIDB4NUE3RCwKLSAgICAweDVBN0UsIDB4NUE4MCwgMHg1QTgxLCAweDVBODIsIDB4NUE4MywgMHg1QTg0LCAweDVBODUsIDB4NUE4NiwKLSAgICAweDVBODcsIDB4NUE4OCwgMHg1QTg5LCAweDVBOEEsIDB4NUE4QiwgMHg1QThDLCAweDVBOEQsIDB4NUE4RSwKLSAgICAweDVBOEYsIDB4NUE5MCwgMHg1QTkxLCAweDVBOTMsIDB4NUE5NCwgMHg1QTk1LCAweDVBOTYsIDB4NUE5NywKLSAgICAweDVBOTgsIDB4NUE5OSwgMHg1QTlDLCAweDVBOUQsIDB4NUE5RSwgMHg1QTlGLCAweDVBQTAsIDB4NUFBMSwKLSAgICAweDVBQTIsIDB4NUFBMywgMHg1QUE0LCAweDVBQTUsIDB4NUFBNiwgMHg1QUE4LCAweDVBQTksIDB4NUFBQiwKLSAgICAweDVBQUMsIDB4NUFBRCwgMHg1QUFFLCAweDVBQUYsIDB4NUFCMCwgMHg1QUIxLCAweDVBQjQsIDB4NUFCNiwKLSAgICAweDVBQjcsIDB4NUFCOSwgMHg1QUJBLCAweDVBQkIsIDB4NUFCQywgMHg1QUJGLCAweDVBQzAsIDB4NUFDMywKLSAgICAweDVBQzQsIDB4NUFDNSwgMHg1QUM2LCAweDVBQzcsIDB4NUFDOCwgMHg1QUNBLCAweDVBQ0IsIDB4NUFDRCwKLSAgICAweDVBQ0UsIDB4NUFDRiwgMHg1QUQwLCAweDVBRDEsIDB4NUFEMywgMHg1QUQ1LCAweDVBRDksIDB4NUFEQSwKLSAgICAweDVBREIsIDB4NUFERCwgMHg1QURFLCAweDVBREYsIDB4NUFFMiwgMHg1QUU0LCAweDVBRTUsIDB4NUFFNywKLSAgICAweDVBRTgsIDB4NUFFQSwgMHg1QUVDLCAweDVBRUQsIDB4NUFFRSwgMHg1QUVGLCAweDVBRjAsIDB4NUFGMiwKLSAgICAweDVBRjMsIDB4NUFGNCwgMHg1QUY2LCAweDVBRjcsIDB4NUFGOCwgMHg1QUY5LCAweDVBRkEsIDB4NUFGQywKLSAgICAweDVBRkQsIDB4NUFGRSwgMHg1QUZGLCAweDVCMDEsIDB4NUIwMiwgMHg1QjAzLCAweDVCMDQsIDB4NUIwNSwKLSAgICAweDVCMDYsIDB4NUIwNywgMHg1QjBBLCAweDVCMEQsIDB4NUIwRSwgMHg1QjBGLCAweDVCMTAsIDB4NUIxMSwKLSAgICAweDVCMTIsIDB4NUIxMywgMHg1QjE0LCAweDVCMTUsIDB4NUIxOCwgMHg1QjFBLCAweDVCMUIsIDB4NUIxQywKLSAgICAweDVCMUQsIDB4NUIxRSwgMHg1QjFGLCAweDVCMjAsIDB4NUIyMiwgMHg1QjIzLCAweDVCMjQsIDB4NUIyNSwKLSAgICAweDVCMjYsIDB4NUIyNywgMHg1QjI4LCAweDVCMjksIDB4NUIyQiwgMHg1QjJDLCAweDVCMkQsIDB4NUIyRSwKLSAgICAweDVCMkYsIDB4NUIzMSwgMHg1QjMzLCAweDVCMzUsIDB4NUIzNiwgMHg1QjM5LCAweDVCM0EsIDB4NUIzQiwKLSAgICAweDVCM0MsIDB4NUIzRCwgMHg1QjNFLCAweDVCM0YsIDB4NUI0MSwgMHg1QjQyLCAweDVCNDMsIDB4NUI0NCwKLSAgICAweDVCNDUsIDB4NUI0NiwgMHg1QjQ3LCAweDVCNDgsIDB4NUI0OSwgMHg1QjRBLCAweDVCNEIsIDB4NUI0RCwKLSAgICAweDVCNEUsIDB4NUI0RiwgMHg1QjUyLCAweDVCNTYsIDB4NUI1RSwgMHg1QjYwLCAweDVCNjEsIDB4NUI2NywKLSAgICAweDVCNjgsIDB4NUI2RCwgMHg1QjZFLCAweDVCNkYsIDB4NUI3MiwgMHg1Qjc0LCAweDVCNzYsIDB4NUI3NywKLSAgICAweDVCNzksIDB4NUI3QiwgMHg1QjdDLCAweDVCN0UsIDB4NUI4MiwgMHg1Qjg2LCAweDVCOEEsIDB4NUI4RCwKLSAgICAweDVCOEUsIDB4NUI5MCwgMHg1QjkxLCAweDVCOTIsIDB4NUI5NCwgMHg1Qjk2LCAweDVCOUYsIDB4NUJBNywKLSAgICAweDVCQTgsIDB4NUJBOSwgMHg1QkFDLCAweDVCQUQsIDB4NUJBRSwgMHg1QkFGLCAweDVCQjEsIDB4NUJCMiwKLSAgICAweDVCQjcsIDB4NUJCQSwgMHg1QkJCLCAweDVCQkMsIDB4NUJDMCwgMHg1QkMxLCAweDVCQzMsIDB4NUJDOCwKLSAgICAweDVCQzksIDB4NUJDQSwgMHg1QkNCLCAweDVCQ0QsIDB4NUJDRSwgMHg1QkNGLCAweDVCRDEsIDB4NUJENCwKLSAgICAweDVCRDUsIDB4NUJENiwgMHg1QkQ3LCAweDVCRDgsIDB4NUJEOSwgMHg1QkRBLCAweDVCREIsIDB4NUJEQywKLSAgICAweDVCRTAsIDB4NUJFMywgMHg1QkVBLCAweDVCRUQsIDB4NUJFRiwgMHg1QkYxLCAweDVCRjIsIDB4NUJGMywKLSAgICAweDVCRjQsIDB4NUJGNywgMHg1QkZELCAweDVCRkUsIDB4NUMwMCwgMHg1QzAyLCAweDVDMDMsIDB4NUMwNSwKLSAgICAweDVDMEMsIDB4NUMxMCwgMHg1QzEyLCAweDVDMTMsIDB4NUMxNywgMHg1QzE5LCAweDVDMUIsIDB4NUMxRSwKLSAgICAweDVDMUYsIDB4NUMyMCwgMHg1QzIxLCAweDVDMjMsIDB4NUMyNiwgMHg1QzI4LCAweDVDMjksIDB4NUMyQSwKLSAgICAweDVDMkIsIDB4NUMyRCwgMHg1QzJFLCAweDVDMkYsIDB4NUMzMCwgMHg1QzMyLCAweDVDMzMsIDB4NUMzNSwKLSAgICAweDVDMzYsIDB4NUM0MywgMHg1QzQ0LCAweDVDNDYsIDB4NUM0NywgMHg1QzRDLCAweDVDNEQsIDB4NUM1MiwKLSAgICAweDVDNTMsIDB4NUM1NCwgMHg1QzU2LCAweDVDNTcsIDB4NUM1OCwgMHg1QzVBLCAweDVDNUIsIDB4NUM1QywKLSAgICAweDVDNUQsIDB4NUM1RiwgMHg1QzY3LCAweDVDNjksIDB4NUM2QSwgMHg1QzZCLCAweDVDNkQsIDB4NUM3MCwKLSAgICAweDVDNzIsIDB4NUM3MywgMHg1Qzc0LCAweDVDNzUsIDB4NUM3NiwgMHg1Qzc3LCAweDVDNzgsIDB4NUM3QiwKLSAgICAweDVDN0MsIDB4NUM3RCwgMHg1QzdFLCAweDVDODAsIDB4NUM4MywgMHg1Qzg0LCAweDVDODUsIDB4NUM4NiwKLSAgICAweDVDODcsIDB4NUM4OSwgMHg1QzhBLCAweDVDOEIsIDB4NUM4RSwgMHg1QzhGLCAweDVDOTIsIDB4NUM5MywKLSAgICAweDVDOTUsIDB4NUM5RCwgMHg1QzlFLCAweDVDOUYsIDB4NUNBMCwgMHg1Q0E0LCAweDVDQTUsIDB4NUNBNiwKLSAgICAweDVDQTcsIDB4NUNBOCwgMHg1Q0FBLCAweDVDQUUsIDB4NUNBRiwgMHg1Q0IwLCAweDVDQjIsIDB4NUNCNCwKLSAgICAweDVDQjYsIDB4NUNCOSwgMHg1Q0JBLCAweDVDQkIsIDB4NUNCQywgMHg1Q0JFLCAweDVDQzAsIDB4NUNDMiwKLSAgICAweDVDQzMsIDB4NUNDNSwgMHg1Q0M2LCAweDVDQzcsIDB4NUNDOCwgMHg1Q0M5LCAweDVDQ0EsIDB4NUNDQywKLSAgICAweDVDQ0QsIDB4NUNDRSwgMHg1Q0NGLCAweDVDRDAsIDB4NUNEMSwgMHg1Q0QzLCAweDVDRDQsIDB4NUNENSwKLSAgICAweDVDRDYsIDB4NUNENywgMHg1Q0Q4LCAweDVDREEsIDB4NUNEQiwgMHg1Q0RDLCAweDVDREQsIDB4NUNERSwKLSAgICAweDVDREYsIDB4NUNFMCwgMHg1Q0UyLCAweDVDRTMsIDB4NUNFNywgMHg1Q0U5LCAweDVDRUIsIDB4NUNFQywKLSAgICAweDVDRUUsIDB4NUNFRiwgMHg1Q0YxLCAweDVDRjIsIDB4NUNGMywgMHg1Q0Y1LCAweDVDRjcsIDB4NUNGOCwKLSAgICAweDVDRjksIDB4NUNGQSwgMHg1Q0ZDLCAweDVDRkUsIDB4NUNGRiwgMHg1RDAwLCAweDVEMDEsIDB4NUQwNCwKLSAgICAweDVEMDUsIDB4NUQwOCwgMHg1RDA5LCAweDVEMEEsIDB4NUQwQiwgMHg1RDBDLCAweDVEMEYsIDB4NUQxMCwKLSAgICAweDVEMTEsIDB4NUQxMiwgMHg1RDEzLCAweDVEMTUsIDB4NUQxOCwgMHg1RDE5LCAweDVEMUEsIDB4NUQxQywKLSAgICAweDVEMUQsIDB4NUQxRiwgMHg1RDIwLCAweDVEMjEsIDB4NUQyMiwgMHg1RDIzLCAweDVEMjUsIDB4NUQyOCwKLSAgICAweDVEMkEsIDB4NUQyQiwgMHg1RDJGLCAweDVEMzAsIDB4NUQzMSwgMHg1RDMyLCAweDVEMzMsIDB4NUQzNSwKLSAgICAweDVEMzYsIDB4NUQzNywgMHg1RDM4LCAweDVEMzksIDB4NUQzQSwgMHg1RDNCLCAweDVEM0MsIDB4NUQzRiwKLSAgICAweDVENDAsIDB4NUQ0MSwgMHg1RDQyLCAweDVENDMsIDB4NUQ0NCwgMHg1RDQ1LCAweDVENDYsIDB4NUQ0OCwKLSAgICAweDVENDksIDB4NUQ0RCwgMHg1RDRFLCAweDVENEYsIDB4NUQ1MSwgMHg1RDUyLCAweDVENTMsIDB4NUQ1NCwKLSAgICAweDVENTUsIDB4NUQ1NiwgMHg1RDU3LCAweDVENTksIDB4NUQ1QSwgMHg1RDVDLCAweDVENUUsIDB4NUQ1RiwKLSAgICAweDVENjAsIDB4NUQ2MSwgMHg1RDYyLCAweDVENjMsIDB4NUQ2NCwgMHg1RDY1LCAweDVENjYsIDB4NUQ2NywKLSAgICAweDVENjgsIDB4NUQ2QSwgMHg1RDZELCAweDVENkUsIDB4NUQ3MCwgMHg1RDcxLCAweDVENzIsIDB4NUQ3MywKLSAgICAweDVENzUsIDB4NUQ3NiwgMHg1RDc3LCAweDVENzgsIDB4NUQ3OSwgMHg1RDdBLCAweDVEN0IsIDB4NUQ3QywKLSAgICAweDVEN0QsIDB4NUQ3RSwgMHg1RDdGLCAweDVEODAsIDB4NUQ4MywgMHg1RDg1LCAweDVEODYsIDB4NUQ4OCwKLSAgICAweDVEODksIDB4NUQ4QSwgMHg1RDhCLCAweDVEOEMsIDB4NUQ4RCwgMHg1RDhFLCAweDVEOEYsIDB4NUQ5MCwKLSAgICAweDVEOTEsIDB4NUQ5MiwgMHg1RDkzLCAweDVEOTQsIDB4NUQ5NSwgMHg1RDk2LCAweDVEOTgsIDB4NUQ5QSwKLSAgICAweDVEOUIsIDB4NUQ5QywgMHg1RDlFLCAweDVEOUYsIDB4NURBMSwgMHg1REEyLCAweDVEQTMsIDB4NURBNCwKLSAgICAweDVEQTUsIDB4NURBNiwgMHg1REE4LCAweDVEQTksIDB4NURBQSwgMHg1REFCLCAweDVEQUMsIDB4NURBRCwKLSAgICAweDVEQUUsIDB4NURBRiwgMHg1REIwLCAweDVEQjEsIDB4NURCMiwgMHg1REIzLCAweDVEQjQsIDB4NURCNSwKLSAgICAweDVEQjYsIDB4NURCOSwgMHg1REJCLCAweDVEQkQsIDB4NURCRSwgMHg1REJGLCAweDVEQzAsIDB4NURDMSwKLSAgICAweDVEQzIsIDB4NURDMywgMHg1REM0LCAweDVEQzYsIDB4NURDNywgMHg1REM4LCAweDVEQzksIDB4NURDQSwKLSAgICAweDVEQ0MsIDB4NURDRSwgMHg1RENGLCAweDVERDAsIDB4NUREMSwgMHg1REQzLCAweDVERDUsIDB4NURENiwKLSAgICAweDVERDcsIDB4NUREOCwgMHg1REQ5LCAweDVEREEsIDB4NUREQywgMHg1RERGLCAweDVERTAsIDB4NURFMywKLSAgICAweDVERTQsIDB4NURFQSwgMHg1REVDLCAweDVERUQsIDB4NURGNSwgMHg1REY2LCAweDVERjgsIDB4NURGOSwKLSAgICAweDVERkEsIDB4NURGQiwgMHg1REZDLCAweDVERkYsIDB4NUUwMCwgMHg1RTA0LCAweDVFMDcsIDB4NUUwOSwKLSAgICAweDVFMEEsIDB4NUUwQiwgMHg1RTBELCAweDVFMEUsIDB4NUUxMiwgMHg1RTEzLCAweDVFMTcsIDB4NUUxRSwKLSAgICAweDVFMUYsIDB4NUUyMCwgMHg1RTIxLCAweDVFMjIsIDB4NUUyMywgMHg1RTI0LCAweDVFMjgsIDB4NUUyOSwKLSAgICAweDVFMkEsIDB4NUUyQywgMHg1RTJGLCAweDVFMzAsIDB4NUUzMiwgMHg1RTM0LCAweDVFMzUsIDB4NUUzOSwKLSAgICAweDVFM0EsIDB4NUUzRSwgMHg1RTNGLCAweDVFNDEsIDB4NUU0NiwgMHg1RTQ3LCAweDVFNDgsIDB4NUU0OSwKLSAgICAweDVFNEEsIDB4NUU0QiwgMHg1RTRELCAweDVFNEUsIDB4NUU0RiwgMHg1RTUwLCAweDVFNTEsIDB4NUU1MiwKLSAgICAweDVFNTMsIDB4NUU1NiwgMHg1RTU5LCAweDVFNUEsIDB4NUU1QywgMHg1RTVELCAweDVFNjAsIDB4NUU2NCwKLSAgICAweDVFNjUsIDB4NUU2NiwgMHg1RTY3LCAweDVFNjgsIDB4NUU2OSwgMHg1RTZBLCAweDVFNkQsIDB4NUU2RSwKLSAgICAweDVFNkYsIDB4NUU3MCwgMHg1RTcxLCAweDVFNzUsIDB4NUU3NywgMHg1RTgxLCAweDVFODIsIDB4NUU4MywKLSAgICAweDVFODUsIDB4NUU4OCwgMHg1RTg5LCAweDVFOEMsIDB4NUU4RCwgMHg1RThFLCAweDVFOTIsIDB4NUU5OCwKLSAgICAweDVFOUIsIDB4NUU5RCwgMHg1RUExLCAweDVFQTIsIDB4NUVBMywgMHg1RUE0LCAweDVFQTgsIDB4NUVBOSwKLSAgICAweDVFQUEsIDB4NUVBQywgMHg1RUFFLCAweDVFQUYsIDB4NUVCMCwgMHg1RUIxLCAweDVFQjIsIDB4NUVCNCwKLSAgICAweDVFQkEsIDB4NUVCQiwgMHg1RUJDLCAweDVFQkQsIDB4NUVCRiwgMHg1RUMwLCAweDVFQzEsIDB4NUVDMiwKLSAgICAweDVFQzMsIDB4NUVDNCwgMHg1RUM1LCAweDVFQzYsIDB4NUVDNywgMHg1RUM4LCAweDVFQ0IsIDB4NUVDQywKLSAgICAweDVFQ0QsIDB4NUVDRSwgMHg1RUNGLCAweDVFRDAsIDB4NUVENCwgMHg1RUQ1LCAweDVFRDcsIDB4NUVEOCwKLSAgICAweDVFRDksIDB4NUVEQSwgMHg1RURDLCAweDVFREQsIDB4NUVERSwgMHg1RUU0LCAweDVFRTUsIDB4NUVFNiwKLSAgICAweDVFRTcsIDB4NUVFOSwgMHg1RUVCLCAweDVFRUQsIDB4NUVFRSwgMHg1RUVGLCAweDVFRjAsIDB4NUVGMSwKLSAgICAweDVFRjIsIDB4NUVGNSwgMHg1RUY4LCAweDVFRjksIDB4NUVGQiwgMHg1RUZDLCAweDVFRkQsIDB4NUYwNSwKLSAgICAweDVGMDYsIDB4NUYwNywgMHg1RjA5LCAweDVGMEMsIDB4NUYwRCwgMHg1RjBFLCAweDVGMTAsIDB4NUYxMiwKLSAgICAweDVGMTQsIDB4NUYxNiwgMHg1RjE5LCAweDVGMUEsIDB4NUYxQywgMHg1RjFELCAweDVGMUUsIDB4NUYyMSwKLSAgICAweDVGMjIsIDB4NUYyMywgMHg1RjI0LCAweDVGMjgsIDB4NUYyQiwgMHg1RjJDLCAweDVGMkUsIDB4NUYzMCwKLSAgICAweDVGMzIsIDB4NUYzNCwgMHg1RjM2LCAweDVGMzcsIDB4NUYzOCwgMHg1RjNCLCAweDVGM0QsIDB4NUYzRSwKLSAgICAweDVGM0YsIDB4NUY0MSwgMHg1RjQyLCAweDVGNDMsIDB4NUY0NCwgMHg1RjQ1LCAweDVGNDcsIDB4NUY0OSwKLSAgICAweDVGNEEsIDB4NUY0QiwgMHg1RjRELCAweDVGNEYsIDB4NUY1MSwgMHg1RjU0LCAweDVGNUEsIDB4NUY1QiwKLSAgICAweDVGNUMsIDB4NUY1RSwgMHg1RjVGLCAweDVGNjAsIDB4NUY2MywgMHg1RjY1LCAweDVGNjcsIDB4NUY2OCwKLSAgICAweDVGNkIsIDB4NUY2RSwgMHg1RjZGLCAweDVGNzIsIDB4NUY3NCwgMHg1Rjc1LCAweDVGNzYsIDB4NUY3OCwKLSAgICAweDVGN0EsIDB4NUY3RCwgMHg1RjdFLCAweDVGN0YsIDB4NUY4MywgMHg1Rjg2LCAweDVGOEQsIDB4NUY4RSwKLSAgICAweDVGOEYsIDB4NUY5MywgMHg1Rjk0LCAweDVGOTYsIDB4NUY5QSwgMHg1RjlCLCAweDVGOUQsIDB4NUY5RiwKLSAgICAweDVGQTIsIDB4NUZBMywgMHg1RkE0LCAweDVGQTUsIDB4NUZBNiwgMHg1RkE3LCAweDVGQUIsIDB4NUZBQywKLSAgICAweDVGQUYsIDB4NUZCMCwgMHg1RkIxLCAweDVGQjIsIDB4NUZCMywgMHg1RkI0LCAweDVGQjYsIDB4NUZCOCwKLSAgICAweDVGQkEsIDB4NUZCQiwgMHg1RkJFLCAweDVGQkYsIDB4NUZDMCwgMHg1RkMxLCAweDVGQzIsIDB4NUZDNywKLSAgICAweDVGQzgsIDB4NUZDQSwgMHg1RkNCLCAweDVGQ0UsIDB4NUZEMywgMHg1RkQ0LCAweDVGRDUsIDB4NUZEQSwKLSAgICAweDVGREIsIDB4NUZEQywgMHg1RkRFLCAweDVGREYsIDB4NUZFMiwgMHg1RkUzLCAweDVGRTUsIDB4NUZFNiwKLSAgICAweDVGRTgsIDB4NUZFOSwgMHg1RkVDLCAweDVGRUYsIDB4NUZGMCwgMHg1RkYyLCAweDVGRjMsIDB4NUZGNCwKLSAgICAweDVGRjYsIDB4NUZGNywgMHg1RkY5LCAweDVGRkEsIDB4NUZGQywgMHg2MDA3LCAweDYwMDgsIDB4NjAwOSwKLSAgICAweDYwMEIsIDB4NjAwQywgMHg2MDEwLCAweDYwMTEsIDB4NjAxMywgMHg2MDE3LCAweDYwMTgsIDB4NjAxQSwKLSAgICAweDYwMUUsIDB4NjAxRiwgMHg2MDIyLCAweDYwMjMsIDB4NjAyNCwgMHg2MDJDLCAweDYwMkQsIDB4NjAyRSwKLSAgICAweDYwMzAsIDB4NjAzMSwgMHg2MDMyLCAweDYwMzMsIDB4NjAzNCwgMHg2MDM2LCAweDYwMzcsIDB4NjAzOCwKLSAgICAweDYwMzksIDB4NjAzQSwgMHg2MDNELCAweDYwM0UsIDB4NjA0MCwgMHg2MDQ0LCAweDYwNDUsIDB4NjA0NiwKLSAgICAweDYwNDcsIDB4NjA0OCwgMHg2MDQ5LCAweDYwNEEsIDB4NjA0QywgMHg2MDRFLCAweDYwNEYsIDB4NjA1MSwKLSAgICAweDYwNTMsIDB4NjA1NCwgMHg2MDU2LCAweDYwNTcsIDB4NjA1OCwgMHg2MDVCLCAweDYwNUMsIDB4NjA1RSwKLSAgICAweDYwNUYsIDB4NjA2MCwgMHg2MDYxLCAweDYwNjUsIDB4NjA2NiwgMHg2MDZFLCAweDYwNzEsIDB4NjA3MiwKLSAgICAweDYwNzQsIDB4NjA3NSwgMHg2MDc3LCAweDYwN0UsIDB4NjA4MCwgMHg2MDgxLCAweDYwODIsIDB4NjA4NSwKLSAgICAweDYwODYsIDB4NjA4NywgMHg2MDg4LCAweDYwOEEsIDB4NjA4QiwgMHg2MDhFLCAweDYwOEYsIDB4NjA5MCwKLSAgICAweDYwOTEsIDB4NjA5MywgMHg2MDk1LCAweDYwOTcsIDB4NjA5OCwgMHg2MDk5LCAweDYwOUMsIDB4NjA5RSwKLSAgICAweDYwQTEsIDB4NjBBMiwgMHg2MEE0LCAweDYwQTUsIDB4NjBBNywgMHg2MEE5LCAweDYwQUEsIDB4NjBBRSwKLSAgICAweDYwQjAsIDB4NjBCMywgMHg2MEI3LCAweDYwQjksIDB4NjBCQSwgMHg2MEJELCAweDYwQkUsIDB4NjBCRiwKLSAgICAweDYwQzAsIDB4NjBDMSwgMHg2MEMyLCAweDYwQzMsIDB4NjBDNCwgMHg2MEM3LCAweDYwQzgsIDB4NjBDOSwKLSAgICAweDYwQ0MsIDB4NjBDRCwgMHg2MENFLCAweDYwQ0YsIDB4NjBEMCwgMHg2MEQyLCAweDYwRDMsIDB4NjBENCwKLSAgICAweDYwRDYsIDB4NjBENywgMHg2MEQ5LCAweDYwREIsIDB4NjBERSwgMHg2MEUyLCAweDYwRTMsIDB4NjBFNCwKLSAgICAweDYwRTUsIDB4NjBFQSwgMHg2MEY1LCAweDYwRjcsIDB4NjBGOCwgMHg2MEZDLCAweDYwRkQsIDB4NjBGRSwKLSAgICAweDYwRkYsIDB4NjEwMiwgMHg2MTAzLCAweDYxMDQsIDB4NjEwNSwgMHg2MTA3LCAweDYxMEEsIDB4NjEwQiwKLSAgICAweDYxMEMsIDB4NjExMCwgMHg2MTExLCAweDYxMTIsIDB4NjExMywgMHg2MTE0LCAweDYxMTYsIDB4NjExNywKLSAgICAweDYxMTgsIDB4NjExOSwgMHg2MTFELCAweDYxMUUsIDB4NjEyMSwgMHg2MTIyLCAweDYxMjUsIDB4NjEyOCwKLSAgICAweDYxMjksIDB4NjEyQSwgMHg2MTJDLCAweDYxMkQsIDB4NjEyRSwgMHg2MTJGLCAweDYxMzAsIDB4NjEzMSwKLSAgICAweDYxMzIsIDB4NjEzMywgMHg2MTM1LCAweDYxMzYsIDB4NjEzOCwgMHg2MTM5LCAweDYxM0EsIDB4NjEzQiwKLSAgICAweDYxM0MsIDB4NjEzRCwgMHg2MTQwLCAweDYxNDEsIDB4NjE0MiwgMHg2MTQzLCAweDYxNDQsIDB4NjE0NSwKLSAgICAweDYxNDYsIDB4NjE0NywgMHg2MTQ5LCAweDYxNEQsIDB4NjE0RiwgMHg2MTUwLCAweDYxNTIsIDB4NjE1MywKLSAgICAweDYxNTQsIDB4NjE1NiwgMHg2MTU3LCAweDYxNTksIDB4NjE1QiwgMHg2MTVDLCAweDYxNUUsIDB4NjE2MCwKLSAgICAweDYxNjEsIDB4NjE2NSwgMHg2MTY2LCAweDYxNjksIDB4NjE2QywgMHg2MTZELCAweDYxNkYsIDB4NjE3MSwKLSAgICAweDYxNzIsIDB4NjE3NCwgMHg2MTc4LCAweDYxNzksIDB4NjE3QSwgMHg2MTdCLCAweDYxN0MsIDB4NjE3RCwKLSAgICAweDYxN0UsIDB4NjE3RiwgMHg2MTgwLCAweDYxODEsIDB4NjE4MywgMHg2MTg0LCAweDYxODUsIDB4NjE4NiwKLSAgICAweDYxODcsIDB4NjE4OCwgMHg2MTg5LCAweDYxOEMsIDB4NjE4RCwgMHg2MThGLCAweDYxOTMsIDB4NjE5NSwKLSAgICAweDYxOTYsIDB4NjE5NywgMHg2MTk4LCAweDYxOTksIDB4NjE5QiwgMHg2MTlDLCAweDYxOUUsIDB4NjE5RiwKLSAgICAweDYxQTAsIDB4NjFBMSwgMHg2MUEyLCAweDYxQTMsIDB4NjFBNSwgMHg2MUE2LCAweDYxQUEsIDB4NjFBRCwKLSAgICAweDYxQUYsIDB4NjFCMCwgMHg2MUIxLCAweDYxQjMsIDB4NjFCNCwgMHg2MUI1LCAweDYxQjgsIDB4NjFCOSwKLSAgICAweDYxQkEsIDB4NjFCQiwgMHg2MUJDLCAweDYxQkQsIDB4NjFCRiwgMHg2MUMwLCAweDYxQzEsIDB4NjFDMywKLSAgICAweDYxQzQsIDB4NjFDNSwgMHg2MUM2LCAweDYxQ0QsIDB4NjFDRSwgMHg2MUNGLCAweDYxRDAsIDB4NjFEMywKLSAgICAweDYxRDUsIDB4NjFENiwgMHg2MUQ3LCAweDYxRDgsIDB4NjFEOSwgMHg2MURBLCAweDYxREIsIDB4NjFEQywKLSAgICAweDYxREQsIDB4NjFFMCwgMHg2MUUxLCAweDYxRTIsIDB4NjFFNCwgMHg2MUU1LCAweDYxRTcsIDB4NjFFOSwKLSAgICAweDYxRUEsIDB4NjFFQiwgMHg2MUVDLCAweDYxRUQsIDB4NjFFRSwgMHg2MUVGLCAweDYxRjAsIDB4NjFGMSwKLSAgICAweDYxRjMsIDB4NjFGNCwgMHg2MUY5LCAweDYxRkIsIDB4NjFGRCwgMHg2MjAxLCAweDYyMDIsIDB4NjIwMywKLSAgICAweDYyMDQsIDB4NjIwNSwgMHg2MjA5LCAweDYyMTMsIDB4NjIxOSwgMHg2MjFDLCAweDYyMUQsIDB4NjIxRSwKLSAgICAweDYyMjAsIDB4NjIyMywgMHg2MjI2LCAweDYyMjgsIDB4NjIyOSwgMHg2MjJCLCAweDYyMkQsIDB4NjIyRiwKLSAgICAweDYyMzEsIDB4NjIzNSwgMHg2MjM2LCAweDYyMzgsIDB4NjIzOSwgMHg2MjNBLCAweDYyM0IsIDB4NjIzQywKLSAgICAweDYyNDIsIDB4NjI0NCwgMHg2MjQ1LCAweDYyNDYsIDB4NjI0QSwgMHg2MjRGLCAweDYyNTAsIDB4NjI1NSwKLSAgICAweDYyNTYsIDB4NjI1NywgMHg2MjU5LCAweDYyNUEsIDB4NjI1QywgMHg2MjVELCAweDYyNUUsIDB4NjI1RiwKLSAgICAweDYyNjAsIDB4NjI2MSwgMHg2MjYyLCAweDYyNjQsIDB4NjI2NSwgMHg2MjY4LCAweDYyNzEsIDB4NjI3MiwKLSAgICAweDYyNzQsIDB4NjI3NSwgMHg2Mjc3LCAweDYyNzgsIDB4NjI3QSwgMHg2MjdCLCAweDYyN0QsIDB4NjI4MSwKLSAgICAweDYyODIsIDB4NjI4MywgMHg2Mjg1LCAweDYyODYsIDB4NjI4NywgMHg2Mjg4LCAweDYyOEIsIDB4NjI4QywKLSAgICAweDYyOEQsIDB4NjI4RSwgMHg2MjhGLCAweDYyOTAsIDB4NjI5NCwgMHg2Mjk5LCAweDYyOUMsIDB4NjI5RCwKLSAgICAweDYyOUUsIDB4NjJBMywgMHg2MkE2LCAweDYyQTcsIDB4NjJBOSwgMHg2MkFBLCAweDYyQUQsIDB4NjJBRSwKLSAgICAweDYyQUYsIDB4NjJCMCwgMHg2MkIyLCAweDYyQjMsIDB4NjJCNCwgMHg2MkI2LCAweDYyQjcsIDB4NjJCOCwKLSAgICAweDYyQkEsIDB4NjJCRSwgMHg2MkMwLCAweDYyQzEsIDB4NjJDMywgMHg2MkNCLCAweDYyQ0YsIDB4NjJEMSwKLSAgICAweDYyRDUsIDB4NjJERCwgMHg2MkRFLCAweDYyRTAsIDB4NjJFMSwgMHg2MkU0LCAweDYyRUEsIDB4NjJFQiwKLSAgICAweDYyRjAsIDB4NjJGMiwgMHg2MkY1LCAweDYyRjgsIDB4NjJGOSwgMHg2MkZBLCAweDYyRkIsIDB4NjMwMCwKLSAgICAweDYzMDMsIDB4NjMwNCwgMHg2MzA1LCAweDYzMDYsIDB4NjMwQSwgMHg2MzBCLCAweDYzMEMsIDB4NjMwRCwKLSAgICAweDYzMEYsIDB4NjMxMCwgMHg2MzEyLCAweDYzMTMsIDB4NjMxNCwgMHg2MzE1LCAweDYzMTcsIDB4NjMxOCwKLSAgICAweDYzMTksIDB4NjMxQywgMHg2MzI2LCAweDYzMjcsIDB4NjMyOSwgMHg2MzJDLCAweDYzMkQsIDB4NjMyRSwKLSAgICAweDYzMzAsIDB4NjMzMSwgMHg2MzMzLCAweDYzMzQsIDB4NjMzNSwgMHg2MzM2LCAweDYzMzcsIDB4NjMzOCwKLSAgICAweDYzM0IsIDB4NjMzQywgMHg2MzNGLCAweDYzNDAsIDB4NjM0MSwgMHg2MzQ0LCAweDYzNDcsIDB4NjM0OCwKLSAgICAweDYzNEEsIDB4NjM1MSwgMHg2MzUyLCAweDYzNTMsIDB4NjM1NCwgMHg2MzU2LCAweDYzNTcsIDB4NjM1OCwKLSAgICAweDYzNTksIDB4NjM1QSwgMHg2MzVCLCAweDYzNUMsIDB4NjM1RCwgMHg2MzYwLCAweDYzNjQsIDB4NjM2NSwKLSAgICAweDYzNjYsIDB4NjM2QSwgMHg2MzZDLCAweDYzNkYsIDB4NjM3MCwgMHg2MzczLCAweDYzNzQsIDB4NjM3NSwKLSAgICAweDYzNzgsIDB4NjM3OSwgMHg2MzdDLCAweDYzN0QsIDB4NjM3RSwgMHg2MzdGLCAweDYzODEsIDB4NjM4NSwKLSAgICAweDYzODYsIDB4NjM4QiwgMHg2MzhELCAweDYzOTEsIDB4NjM5MywgMHg2Mzk0LCAweDYzOTUsIDB4NjM5NywKLSAgICAweDYzOTksIDB4NjM5QSwgMHg2MzlCLCAweDYzOUMsIDB4NjM5RCwgMHg2MzlFLCAweDYzOUYsIDB4NjNBMSwKLSAgICAweDYzQTQsIDB4NjNBNiwgMHg2M0FCLCAweDYzQUYsIDB4NjNCMSwgMHg2M0IyLCAweDYzQjUsIDB4NjNCNiwKLSAgICAweDYzQjksIDB4NjNCQiwgMHg2M0JELCAweDYzQkYsIDB4NjNDMSwgMHg2M0MyLCAweDYzQzMsIDB4NjNDNSwKLSAgICAweDYzQzcsIDB4NjNDOCwgMHg2M0NBLCAweDYzQ0IsIDB4NjNDQywgMHg2M0QxLCAweDYzRDMsIDB4NjNENCwKLSAgICAweDYzRDUsIDB4NjNENywgMHg2M0Q4LCAweDYzRDksIDB4NjNEQiwgMHg2M0RDLCAweDYzREQsIDB4NjNERiwKLSAgICAweDYzRTIsIDB4NjNFNCwgMHg2M0U1LCAweDYzRTYsIDB4NjNFNywgMHg2M0U4LCAweDYzRUIsIDB4NjNFQywKLSAgICAweDYzRUYsIDB4NjNGMCwgMHg2M0YxLCAweDYzRjMsIDB4NjNGNSwgMHg2M0Y3LCAweDYzRjksIDB4NjNGQSwKLSAgICAweDYzRkIsIDB4NjNGQywgMHg2M0ZFLCAweDY0MDMsIDB4NjQwNCwgMHg2NDA2LCAweDY0MDcsIDB4NjQwOCwKLSAgICAweDY0MDksIDB4NjQwQSwgMHg2NDBFLCAweDY0MTEsIDB4NjQxMiwgMHg2NDE1LCAweDY0MTYsIDB4NjQxOCwKLSAgICAweDY0MTksIDB4NjQxQSwgMHg2NDFELCAweDY0MUYsIDB4NjQyMiwgMHg2NDIzLCAweDY0MjQsIDB4NjQyNSwKLSAgICAweDY0MjcsIDB4NjQyOCwgMHg2NDI5LCAweDY0MkIsIDB4NjQyRSwgMHg2NDJGLCAweDY0MzAsIDB4NjQzMSwKLSAgICAweDY0MzIsIDB4NjQzMywgMHg2NDM1LCAweDY0MzcsIDB4NjQzOCwgMHg2NDM5LCAweDY0M0IsIDB4NjQzQywKLSAgICAweDY0M0UsIDB4NjQ0MCwgMHg2NDQyLCAweDY0NDMsIDB4NjQ0OSwgMHg2NDRCLCAweDY0NEMsIDB4NjQ0RCwKLSAgICAweDY0NEUsIDB4NjQ0RiwgMHg2NDUwLCAweDY0NTMsIDB4NjQ1NSwgMHg2NDU2LCAweDY0NTcsIDB4NjQ1OSwKLSAgICAweDY0NUEsIDB4NjQ1QiwgMHg2NDVELCAweDY0NjAsIDB4NjQ2MSwgMHg2NDYyLCAweDY0NjMsIDB4NjQ2NCwKLSAgICAweDY0NjUsIDB4NjQ2NiwgMHg2NDY4LCAweDY0NkEsIDB4NjQ2QiwgMHg2NDZDLCAweDY0NkUsIDB4NjQ3MCwKLSAgICAweDY0NzEsIDB4NjQ3MiwgMHg2NDc0LCAweDY0NzUsIDB4NjQ3NywgMHg2NDdDLCAweDY0N0QsIDB4NjQ3RSwKLSAgICAweDY0N0YsIDB4NjQ4MCwgMHg2NDgxLCAweDY0ODMsIDB4NjQ4NiwgMHg2NDg5LCAweDY0OEEsIDB4NjQ4QiwKLSAgICAweDY0OEMsIDB4NjQ4RCwgMHg2NDhFLCAweDY0OEYsIDB4NjQ5MCwgMHg2NDk0LCAweDY0OTcsIDB4NjQ5OCwKLSAgICAweDY0OUEsIDB4NjQ5QiwgMHg2NDlDLCAweDY0OUQsIDB4NjRBMCwgMHg2NEExLCAweDY0QTIsIDB4NjRBNiwKLSAgICAweDY0QTcsIDB4NjRBOCwgMHg2NEFBLCAweDY0QUYsIDB4NjRCMSwgMHg2NEI0LCAweDY0QjYsIDB4NjRCOSwKLSAgICAweDY0QkQsIDB4NjRDMywgMHg2NEM2LCAweDY0QzgsIDB4NjRDOSwgMHg2NENDLCAweDY0Q0YsIDB4NjREMSwKLSAgICAweDY0RDMsIDB4NjRENSwgMHg2NEQ2LCAweDY0RDksIDB4NjREQiwgMHg2NERDLCAweDY0REQsIDB4NjRERiwKLSAgICAweDY0RTEsIDB4NjRFMywgMHg2NEU1LCAweDY0RTcsIDB4NjRFOCwgMHg2NEU5LCAweDY0RUEsIDB4NjRFQiwKLSAgICAweDY0RUQsIDB4NjRFRSwgMHg2NEYzLCAweDY0RjUsIDB4NjRGNiwgMHg2NEY4LCAweDY0RjksIDB4NjRGRCwKLSAgICAweDY0RkYsIDB4NjUwMSwgMHg2NTAyLCAweDY1MDMsIDB4NjUwNSwgMHg2NTA3LCAweDY1MDgsIDB4NjUwQSwKLSAgICAweDY1MEIsIDB4NjUwQywgMHg2NTBELCAweDY1MEUsIDB4NjUxMCwgMHg2NTExLCAweDY1MTMsIDB4NjUxNSwKLSAgICAweDY1MTcsIDB4NjUxQSwgMHg2NTFDLCAweDY1MUUsIDB4NjUxRiwgMHg2NTIwLCAweDY1MjEsIDB4NjUyNiwKLSAgICAweDY1MjcsIDB4NjUyOCwgMHg2NTI5LCAweDY1MkQsIDB4NjUzMCwgMHg2NTMxLCAweDY1MzIsIDB4NjUzMywKLSAgICAweDY1MzcsIDB4NjUzQSwgMHg2NTNDLCAweDY1M0QsIDB4NjU0MCwgMHg2NTQxLCAweDY1NDIsIDB4NjU0MywKLSAgICAweDY1NDQsIDB4NjU0NiwgMHg2NTQ3LCAweDY1NEEsIDB4NjU0QiwgMHg2NTRELCAweDY1NEUsIDB4NjU1MCwKLSAgICAweDY1NTIsIDB4NjU1MywgMHg2NTU0LCAweDY1NTgsIDB4NjU1QSwgMHg2NTVDLCAweDY1NUYsIDB4NjU2MCwKLSAgICAweDY1NjEsIDB4NjU2NCwgMHg2NTY1LCAweDY1NjcsIDB4NjU2OCwgMHg2NTY5LCAweDY1NkEsIDB4NjU2RCwKLSAgICAweDY1NkUsIDB4NjU2RiwgMHg2NTcxLCAweDY1NzMsIDB4NjU3NiwgMHg2NTc5LCAweDY1N0EsIDB4NjU3QiwKLSAgICAweDY1N0MsIDB4NjU3RCwgMHg2NTdFLCAweDY1N0YsIDB4NjU4MCwgMHg2NTgxLCAweDY1ODQsIDB4NjU4NSwKLSAgICAweDY1ODYsIDB4NjU4OCwgMHg2NTg5LCAweDY1OEEsIDB4NjU4RCwgMHg2NThFLCAweDY1OEYsIDB4NjU5MiwKLSAgICAweDY1OTQsIDB4NjU5NiwgMHg2NTk4LCAweDY1OUEsIDB4NjU5RCwgMHg2NTlFLCAweDY1QTAsIDB4NjVBMiwKLSAgICAweDY1QTMsIDB4NjVBNiwgMHg2NUE4LCAweDY1QUEsIDB4NjVBRSwgMHg2NUIxLCAweDY1QjIsIDB4NjVCMywKLSAgICAweDY1QjQsIDB4NjVCNSwgMHg2NUI2LCAweDY1QjgsIDB4NjVCQSwgMHg2NUJCLCAweDY1QkUsIDB4NjVCRiwKLSAgICAweDY1QzAsIDB4NjVDMiwgMHg2NUM3LCAweDY1QzgsIDB4NjVDOSwgMHg2NUNBLCAweDY1Q0QsIDB4NjVEMCwKLSAgICAweDY1RDEsIDB4NjVEMywgMHg2NUQ0LCAweDY1RDUsIDB4NjVEOCwgMHg2NUQ5LCAweDY1REEsIDB4NjVEQiwKLSAgICAweDY1REMsIDB4NjVERCwgMHg2NURFLCAweDY1REYsIDB4NjVFMSwgMHg2NUUzLCAweDY1RTQsIDB4NjVFQSwKLSAgICAweDY1RUIsIDB4NjVGMiwgMHg2NUYzLCAweDY1RjQsIDB4NjVGNSwgMHg2NUY4LCAweDY1RjksIDB4NjVGQiwKLSAgICAweDY1RkMsIDB4NjVGRCwgMHg2NUZFLCAweDY1RkYsIDB4NjYwMSwgMHg2NjA0LCAweDY2MDUsIDB4NjYwNywKLSAgICAweDY2MDgsIDB4NjYwOSwgMHg2NjBCLCAweDY2MEQsIDB4NjYxMCwgMHg2NjExLCAweDY2MTIsIDB4NjYxNiwKLSAgICAweDY2MTcsIDB4NjYxOCwgMHg2NjFBLCAweDY2MUIsIDB4NjYxQywgMHg2NjFFLCAweDY2MjEsIDB4NjYyMiwKLSAgICAweDY2MjMsIDB4NjYyNCwgMHg2NjI2LCAweDY2MjksIDB4NjYyQSwgMHg2NjJCLCAweDY2MkMsIDB4NjYyRSwKLSAgICAweDY2MzAsIDB4NjYzMiwgMHg2NjMzLCAweDY2MzcsIDB4NjYzOCwgMHg2NjM5LCAweDY2M0EsIDB4NjYzQiwKLSAgICAweDY2M0QsIDB4NjYzRiwgMHg2NjQwLCAweDY2NDQsIDB4NjY0NSwgMHg2NjQ2LCAweDY2NDcsIDB4NjY0OCwKLSAgICAweDY2NDksIDB4NjY0QSwgMHg2NjRELCAweDY2NEUsIDB4NjY1MCwgMHg2NjUxLCAweDY2NTgsIDB4NjY1OSwKLSAgICAweDY2NUIsIDB4NjY1QywgMHg2NjVFLCAweDY2NjAsIDB4NjY2MiwgMHg2NjYzLCAweDY2NjUsIDB4NjY2NywKLSAgICAweDY2NjksIDB4NjY2QSwgMHg2NjZCLCAweDY2NkMsIDB4NjY2RCwgMHg2NjcxLCAweDY2NzIsIDB4NjY3MywKLSAgICAweDY2NzUsIDB4NjY3OCwgMHg2Njc5LCAweDY2N0IsIDB4NjY3QywgMHg2NjdELCAweDY2N0YsIDB4NjY4MCwKLSAgICAweDY2ODEsIDB4NjY4MywgMHg2Njg1LCAweDY2ODYsIDB4NjY4QSwgMHg2NjhCLCAweDY2OEQsIDB4NjY4RSwKLSAgICAweDY2OEYsIDB4NjY5MCwgMHg2NjkyLCAweDY2OTMsIDB4NjY5NCwgMHg2Njk1LCAweDY2OTgsIDB4NjY5OSwKLSAgICAweDY2OUEsIDB4NjY5QiwgMHg2NjlDLCAweDY2OUUsIDB4NjY5RiwgMHg2NkEwLCAweDY2QTEsIDB4NjZBMywKLSAgICAweDY2QTQsIDB4NjZBNSwgMHg2NkE2LCAweDY2QTksIDB4NjZBQSwgMHg2NkFDLCAweDY2QUQsIDB4NjZBRiwKLSAgICAweDY2QjAsIDB4NjZCMSwgMHg2NkIyLCAweDY2QjMsIDB4NjZCNSwgMHg2NkI2LCAweDY2QjcsIDB4NjZCOCwKLSAgICAweDY2QkEsIDB4NjZCQiwgMHg2NkJDLCAweDY2QkQsIDB4NjZCRiwgMHg2NkMwLCAweDY2QzEsIDB4NjZDMiwKLSAgICAweDY2QzMsIDB4NjZDNSwgMHg2NkM4LCAweDY2Q0EsIDB4NjZDQiwgMHg2NkNDLCAweDY2Q0QsIDB4NjZDRSwKLSAgICAweDY2Q0YsIDB4NjZEMCwgMHg2NkQxLCAweDY2RDIsIDB4NjZEMywgMHg2NkQ0LCAweDY2RDUsIDB4NjZENywKLSAgICAweDY2RDgsIDB4NjZEQSwgMHg2NkRFLCAweDY2REYsIDB4NjZFMSwgMHg2NkUyLCAweDY2RTMsIDB4NjZFNCwKLSAgICAweDY2RTUsIDB4NjZFNywgMHg2NkU4LCAweDY2RUEsIDB4NjZFQiwgMHg2NkVELCAweDY2RUUsIDB4NjZFRiwKLSAgICAweDY2RjEsIDB4NjZGNSwgMHg2NkY2LCAweDY2RkEsIDB4NjZGQiwgMHg2NkZELCAweDY3MDEsIDB4NjcwMiwKLSAgICAweDY3MDQsIDB4NjcwNSwgMHg2NzA2LCAweDY3MDcsIDB4NjcwQywgMHg2NzBFLCAweDY3MEYsIDB4NjcxMSwKLSAgICAweDY3MTIsIDB4NjcxMywgMHg2NzE2LCAweDY3MTgsIDB4NjcxOSwgMHg2NzFBLCAweDY3MUMsIDB4NjcxRSwKLSAgICAweDY3MjAsIDB4NjcyMSwgMHg2NzIyLCAweDY3MjMsIDB4NjcyNCwgMHg2NzI1LCAweDY3MjksIDB4NjcyRSwKLSAgICAweDY3MzAsIDB4NjczMiwgMHg2NzMzLCAweDY3MzYsIDB4NjczNywgMHg2NzM4LCAweDY3MzksIDB4NjczQiwKLSAgICAweDY3M0MsIDB4NjczRSwgMHg2NzNGLCAweDY3NDEsIDB4Njc0NCwgMHg2NzQ1LCAweDY3NDcsIDB4Njc0QSwKLSAgICAweDY3NEIsIDB4Njc0RCwgMHg2NzUyLCAweDY3NTQsIDB4Njc1NSwgMHg2NzU3LCAweDY3NTgsIDB4Njc1OSwKLSAgICAweDY3NUEsIDB4Njc1QiwgMHg2NzVELCAweDY3NjIsIDB4Njc2MywgMHg2NzY0LCAweDY3NjYsIDB4Njc2NywKLSAgICAweDY3NkIsIDB4Njc2QywgMHg2NzZFLCAweDY3NzQsIDB4Njc3NiwgMHg2Nzc4LCAweDY3NzksIDB4Njc3QSwKLSAgICAweDY3N0IsIDB4Njc3RCwgMHg2NzgwLCAweDY3ODIsIDB4Njc4MywgMHg2Nzg1LCAweDY3ODYsIDB4Njc4OCwKLSAgICAweDY3OEEsIDB4Njc4QywgMHg2NzhELCAweDY3OEUsIDB4Njc4RiwgMHg2NzkxLCAweDY3OTIsIDB4Njc5MywKLSAgICAweDY3OTQsIDB4Njc5NiwgMHg2Nzk5LCAweDY3OUIsIDB4Njc5RiwgMHg2N0EwLCAweDY3QTEsIDB4NjdBNCwKLSAgICAweDY3QTYsIDB4NjdBOSwgMHg2N0FDLCAweDY3QUUsIDB4NjdCMSwgMHg2N0IyLCAweDY3QjQsIDB4NjdCOSwKLSAgICAweDY3QkEsIDB4NjdCQiwgMHg2N0JDLCAweDY3QkQsIDB4NjdCRSwgMHg2N0JGLCAweDY3QzAsIDB4NjdDMiwKLSAgICAweDY3QzUsIDB4NjdDNiwgMHg2N0M3LCAweDY3QzgsIDB4NjdDOSwgMHg2N0NBLCAweDY3Q0IsIDB4NjdDQywKLSAgICAweDY3Q0QsIDB4NjdDRSwgMHg2N0Q1LCAweDY3RDYsIDB4NjdENywgMHg2N0RCLCAweDY3REYsIDB4NjdFMSwKLSAgICAweDY3RTMsIDB4NjdFNCwgMHg2N0U2LCAweDY3RTcsIDB4NjdFOCwgMHg2N0VBLCAweDY3RUIsIDB4NjdFRCwKLSAgICAweDY3RUUsIDB4NjdGMiwgMHg2N0Y1LCAweDY3RjYsIDB4NjdGNywgMHg2N0Y4LCAweDY3RjksIDB4NjdGQSwKLSAgICAweDY3RkIsIDB4NjdGQywgMHg2N0ZFLCAweDY4MDEsIDB4NjgwMiwgMHg2ODAzLCAweDY4MDQsIDB4NjgwNiwKLSAgICAweDY4MEQsIDB4NjgxMCwgMHg2ODEyLCAweDY4MTQsIDB4NjgxNSwgMHg2ODE4LCAweDY4MTksIDB4NjgxQSwKLSAgICAweDY4MUIsIDB4NjgxQywgMHg2ODFFLCAweDY4MUYsIDB4NjgyMCwgMHg2ODIyLCAweDY4MjMsIDB4NjgyNCwKLSAgICAweDY4MjUsIDB4NjgyNiwgMHg2ODI3LCAweDY4MjgsIDB4NjgyQiwgMHg2ODJDLCAweDY4MkQsIDB4NjgyRSwKLSAgICAweDY4MkYsIDB4NjgzMCwgMHg2ODMxLCAweDY4MzQsIDB4NjgzNSwgMHg2ODM2LCAweDY4M0EsIDB4NjgzQiwKLSAgICAweDY4M0YsIDB4Njg0NywgMHg2ODRCLCAweDY4NEQsIDB4Njg0RiwgMHg2ODUyLCAweDY4NTYsIDB4Njg1NywKLSAgICAweDY4NTgsIDB4Njg1OSwgMHg2ODVBLCAweDY4NUIsIDB4Njg1QywgMHg2ODVELCAweDY4NUUsIDB4Njg1RiwKLSAgICAweDY4NkEsIDB4Njg2QywgMHg2ODZELCAweDY4NkUsIDB4Njg2RiwgMHg2ODcwLCAweDY4NzEsIDB4Njg3MiwKLSAgICAweDY4NzMsIDB4Njg3NSwgMHg2ODc4LCAweDY4NzksIDB4Njg3QSwgMHg2ODdCLCAweDY4N0MsIDB4Njg3RCwKLSAgICAweDY4N0UsIDB4Njg3RiwgMHg2ODgwLCAweDY4ODIsIDB4Njg4NCwgMHg2ODg3LCAweDY4ODgsIDB4Njg4OSwKLSAgICAweDY4OEEsIDB4Njg4QiwgMHg2ODhDLCAweDY4OEQsIDB4Njg4RSwgMHg2ODkwLCAweDY4OTEsIDB4Njg5MiwKLSAgICAweDY4OTQsIDB4Njg5NSwgMHg2ODk2LCAweDY4OTksIDB4Njg5QSwgMHg2ODlCLCAweDY4OUMsIDB4Njg5RSwKLSAgICAweDY4QTAsIDB4NjhBMSwgMHg2OEEzLCAweDY4QTQsIDB4NjhBNSwgMHg2OEE5LCAweDY4QUEsIDB4NjhBQiwKLSAgICAweDY4QUMsIDB4NjhBRSwgMHg2OEIxLCAweDY4QjIsIDB4NjhCNCwgMHg2OEI2LCAweDY4QjcsIDB4NjhCOCwKLSAgICAweDY4QjksIDB4NjhCQSwgMHg2OEJCLCAweDY4QkMsIDB4NjhCRCwgMHg2OEJFLCAweDY4QkYsIDB4NjhDMSwKLSAgICAweDY4QzMsIDB4NjhDNCwgMHg2OEM1LCAweDY4QzYsIDB4NjhDNywgMHg2OEM4LCAweDY4Q0EsIDB4NjhDQywKLSAgICAweDY4Q0UsIDB4NjhDRiwgMHg2OEQwLCAweDY4RDEsIDB4NjhEMywgMHg2OEQ0LCAweDY4RDksIDB4NjhEQiwKLSAgICAweDY4REMsIDB4NjhERCwgMHg2OERFLCAweDY4RTEsIDB4NjhFMiwgMHg2OEU0LCAweDY4RTUsIDB4NjhFNiwKLSAgICAweDY4RTgsIDB4NjhFOSwgMHg2OEVBLCAweDY4RUIsIDB4NjhFQywgMHg2OEVELCAweDY4RUYsIDB4NjhGMiwKLSAgICAweDY4RjMsIDB4NjhGNCwgMHg2OEY2LCAweDY4RjcsIDB4NjhGOCwgMHg2OEZCLCAweDY4RkQsIDB4NjhGRSwKLSAgICAweDY4RkYsIDB4NjkwMCwgMHg2OTAyLCAweDY5MDMsIDB4NjkwNCwgMHg2OTA2LCAweDY5MDcsIDB4NjkwOCwKLSAgICAweDY5MDksIDB4NjkwQSwgMHg2OTBDLCAweDY5MTEsIDB4NjkxMywgMHg2OTE0LCAweDY5MTUsIDB4NjkxNiwKLSAgICAweDY5MTcsIDB4NjkxOCwgMHg2OTE5LCAweDY5MUEsIDB4NjkxQiwgMHg2OTFDLCAweDY5MUQsIDB4NjkxRSwKLSAgICAweDY5MjEsIDB4NjkyMiwgMHg2OTIzLCAweDY5MjUsIDB4NjkyNiwgMHg2OTI3LCAweDY5MjgsIDB4NjkyOSwKLSAgICAweDY5MkEsIDB4NjkyQiwgMHg2OTJDLCAweDY5MkUsIDB4NjkyRiwgMHg2OTMxLCAweDY5MzIsIDB4NjkzMywKLSAgICAweDY5MzUsIDB4NjkzNiwgMHg2OTM3LCAweDY5MzgsIDB4NjkzQSwgMHg2OTNCLCAweDY5M0MsIDB4NjkzRSwKLSAgICAweDY5NDAsIDB4Njk0MSwgMHg2OTQzLCAweDY5NDQsIDB4Njk0NSwgMHg2OTQ2LCAweDY5NDcsIDB4Njk0OCwKLSAgICAweDY5NDksIDB4Njk0QiwgMHg2OTRDLCAweDY5NEQsIDB4Njk0RSwgMHg2OTRGLCAweDY5NTAsIDB4Njk1MSwKLSAgICAweDY5NTIsIDB4Njk1NSwgMHg2OTU2LCAweDY5NTgsIDB4Njk1OSwgMHg2OTVCLCAweDY5NUMsIDB4Njk1RiwKLSAgICAweDY5NjEsIDB4Njk2MiwgMHg2OTY0LCAweDY5NjUsIDB4Njk2NywgMHg2OTY5LCAweDY5NkEsIDB4Njk2QywKLSAgICAweDY5NkYsIDB4Njk3MCwgMHg2OTcyLCAweDY5NzMsIDB4Njk3NCwgMHg2OTc2LCAweDY5N0EsIDB4Njk3QiwKLSAgICAweDY5N0QsIDB4Njk3RSwgMHg2OTdGLCAweDY5ODEsIDB4Njk4MywgMHg2OTg1LCAweDY5OEEsIDB4Njk4QiwKLSAgICAweDY5OEMsIDB4Njk4RSwgMHg2OThGLCAweDY5OTAsIDB4Njk5MSwgMHg2OTkyLCAweDY5OTMsIDB4Njk5NiwKLSAgICAweDY5OTcsIDB4Njk5OSwgMHg2OTlBLCAweDY5OUQsIDB4Njk5RSwgMHg2OTlGLCAweDY5QTAsIDB4NjlBMSwKLSAgICAweDY5QTIsIDB4NjlBMywgMHg2OUE0LCAweDY5QTUsIDB4NjlBNiwgMHg2OUE5LCAweDY5QUMsIDB4NjlBRiwKLSAgICAweDY5QjAsIDB4NjlCMiwgMHg2OUIzLCAweDY5QjUsIDB4NjlCNiwgMHg2OUI4LCAweDY5QjksIDB4NjlCQSwKLSAgICAweDY5QkMsIDB4NjlCRCwgMHg2OUJFLCAweDY5QzAsIDB4NjlDMiwgMHg2OUMzLCAweDY5QzQsIDB4NjlDNSwKLSAgICAweDY5QzYsIDB4NjlDNywgMHg2OUM4LCAweDY5QzksIDB4NjlDRiwgMHg2OUQxLCAweDY5RDIsIDB4NjlEMywKLSAgICAweDY5RDUsIDB4NjlENiwgMHg2OUQ3LCAweDY5RDgsIDB4NjlEOSwgMHg2OURBLCAweDY5REMsIDB4NjlERCwKLSAgICAweDY5REUsIDB4NjlFMSwgMHg2OUUyLCAweDY5RTMsIDB4NjlFNCwgMHg2OUU1LCAweDY5RTYsIDB4NjlFOCwKLSAgICAweDY5RTksIDB4NjlFQSwgMHg2OUVCLCAweDY5RUMsIDB4NjlFRSwgMHg2OUVGLCAweDY5RjAsIDB4NjlGMSwKLSAgICAweDY5RjQsIDB4NjlGNSwgMHg2OUY2LCAweDY5RjcsIDB4NjlGOCwgMHg2OUY5LCAweDY5RkEsIDB4NjlGQiwKLSAgICAweDY5RkMsIDB4NjlGRSwgMHg2QTAwLCAweDZBMDMsIDB4NkEwNCwgMHg2QTA2LCAweDZBMDcsIDB4NkEwOCwKLSAgICAweDZBMDksIDB4NkEwQiwgMHg2QTBDLCAweDZBMEQsIDB4NkEwRSwgMHg2QTBGLCAweDZBMTAsIDB4NkExMSwKLSAgICAweDZBMTIsIDB4NkExNCwgMHg2QTE1LCAweDZBMTYsIDB4NkExQSwgMHg2QTFCLCAweDZBMUMsIDB4NkExRCwKLSAgICAweDZBMjAsIDB4NkEyMiwgMHg2QTI0LCAweDZBMjUsIDB4NkEyNiwgMHg2QTI3LCAweDZBMjksIDB4NkEyQiwKLSAgICAweDZBMkMsIDB4NkEyRCwgMHg2QTJFLCAweDZBMzAsIDB4NkEzMiwgMHg2QTMzLCAweDZBMzQsIDB4NkEzNiwKLSAgICAweDZBMzcsIDB4NkEzQiwgMHg2QTNDLCAweDZBM0YsIDB4NkE0MCwgMHg2QTQxLCAweDZBNDIsIDB4NkE0MywKLSAgICAweDZBNDUsIDB4NkE0NiwgMHg2QTQ5LCAweDZBNEEsIDB4NkE0QywgMHg2QTRELCAweDZBNEUsIDB4NkE0RiwKLSAgICAweDZBNTEsIDB4NkE1MiwgMHg2QTUzLCAweDZBNTQsIDB4NkE1NSwgMHg2QTU2LCAweDZBNTcsIDB4NkE1QSwKLSAgICAweDZBNUMsIDB4NkE1RCwgMHg2QTVFLCAweDZBNjAsIDB4NkE2MywgMHg2QTY0LCAweDZBNjYsIDB4NkE2NywKLSAgICAweDZBNjgsIDB4NkE2OSwgMHg2QTZBLCAweDZBNkIsIDB4NkE2QywgMHg2QTZELCAweDZBNkUsIDB4NkE2RiwKLSAgICAweDZBNzAsIDB4NkE3MiwgMHg2QTczLCAweDZBNzQsIDB4NkE3NSwgMHg2QTc2LCAweDZBNzcsIDB4NkE3OCwKLSAgICAweDZBN0EsIDB4NkE3QiwgMHg2QTdELCAweDZBN0UsIDB4NkE3RiwgMHg2QTgxLCAweDZBODIsIDB4NkE4MywKLSAgICAweDZBODUsIDB4NkE4NiwgMHg2QTg3LCAweDZBODgsIDB4NkE4QSwgMHg2QThCLCAweDZBOEMsIDB4NkE4RCwKLSAgICAweDZBOEYsIDB4NkE5MiwgMHg2QTkzLCAweDZBOTUsIDB4NkE5NiwgMHg2QTk4LCAweDZBOTksIDB4NkE5QSwKLSAgICAweDZBOUIsIDB4NkE5RCwgMHg2QTlFLCAweDZBOUYsIDB4NkFBMSwgMHg2QUE0LCAweDZBQTUsIDB4NkFBNiwKLSAgICAweDZBQTcsIDB4NkFBOCwgMHg2QUFBLCAweDZBQUQsIDB4NkFBRSwgMHg2QUIwLCAweDZBQjEsIDB4NkFCMiwKLSAgICAweDZBQjQsIDB4NkFCNSwgMHg2QUI2LCAweDZBQjcsIDB4NkFCOSwgMHg2QUJBLCAweDZBQkMsIDB4NkFCRCwKLSAgICAweDZBQkUsIDB4NkFCRiwgMHg2QUMwLCAweDZBQzEsIDB4NkFDMiwgMHg2QUM0LCAweDZBQzUsIDB4NkFDNiwKLSAgICAweDZBQzcsIDB4NkFDOCwgMHg2QUM5LCAweDZBQ0EsIDB4NkFDQiwgMHg2QUNDLCAweDZBQ0QsIDB4NkFDRSwKLSAgICAweDZBQ0YsIDB4NkFEMCwgMHg2QUQxLCAweDZBRDIsIDB4NkFENCwgMHg2QUQ1LCAweDZBRDYsIDB4NkFENywKLSAgICAweDZBRDgsIDB4NkFEOSwgMHg2QURDLCAweDZBRTAsIDB4NkFFMSwgMHg2QUUyLCAweDZBRTMsIDB4NkFFNCwKLSAgICAweDZBRTUsIDB4NkFFNiwgMHg2QUU5LCAweDZBRUIsIDB4NkFFRCwgMHg2QUVFLCAweDZBRUYsIDB4NkFGMCwKLSAgICAweDZBRjEsIDB4NkFGMiwgMHg2QUY0LCAweDZBRjUsIDB4NkFGNiwgMHg2QUY3LCAweDZBRjksIDB4NkFGQSwKLSAgICAweDZBRkMsIDB4NkFGRCwgMHg2QUZFLCAweDZBRkYsIDB4NkIwMCwgMHg2QjAxLCAweDZCMDIsIDB4NkIwMywKLSAgICAweDZCMDUsIDB4NkIwNiwgMHg2QjA3LCAweDZCMDgsIDB4NkIwOSwgMHg2QjBCLCAweDZCMEMsIDB4NkIwRCwKLSAgICAweDZCMEUsIDB4NkIxMCwgMHg2QjExLCAweDZCMTMsIDB4NkIxNCwgMHg2QjE1LCAweDZCMTcsIDB4NkIxOCwKLSAgICAweDZCMTksIDB4NkIxQSwgMHg2QjFCLCAweDZCMUMsIDB4NkIxRCwgMHg2QjFGLCAweDZCMjUsIDB4NkIyNiwKLSAgICAweDZCMjgsIDB4NkIyOSwgMHg2QjJBLCAweDZCMkIsIDB4NkIyQywgMHg2QjJELCAweDZCMkUsIDB4NkIyRiwKLSAgICAweDZCMzAsIDB4NkIzMSwgMHg2QjMzLCAweDZCMzQsIDB4NkIzNSwgMHg2QjM2LCAweDZCMzgsIDB4NkIzQiwKLSAgICAweDZCM0MsIDB4NkIzRiwgMHg2QjQwLCAweDZCNDEsIDB4NkI0MiwgMHg2QjQ0LCAweDZCNDUsIDB4NkI0OCwKLSAgICAweDZCNEEsIDB4NkI0QiwgMHg2QjRELCAweDZCNEUsIDB4NkI0RiwgMHg2QjUxLCAweDZCNTIsIDB4NkI1MywKLSAgICAweDZCNTQsIDB4NkI1NSwgMHg2QjU2LCAweDZCNTcsIDB4NkI1OCwgMHg2QjVBLCAweDZCNUIsIDB4NkI1QywKLSAgICAweDZCNUQsIDB4NkI1RSwgMHg2QjYwLCAweDZCNjgsIDB4NkI2OSwgMHg2QjZCLCAweDZCNkMsIDB4NkI2RCwKLSAgICAweDZCNkUsIDB4NkI2RiwgMHg2QjcwLCAweDZCNzEsIDB4NkI3MywgMHg2Qjc0LCAweDZCNzUsIDB4NkI3NiwKLSAgICAweDZCN0EsIDB4NkI3RCwgMHg2QjdFLCAweDZCN0YsIDB4NkI4MCwgMHg2Qjg1LCAweDZCODgsIDB4NkI4QywKLSAgICAweDZCOEUsIDB4NkI4RiwgMHg2QjkwLCAweDZCOTEsIDB4NkI5NCwgMHg2Qjk1LCAweDZCOTcsIDB4NkI5OSwKLSAgICAweDZCOUMsIDB4NkI5RCwgMHg2QjlGLCAweDZCQTAsIDB4NkJBMiwgMHg2QkEzLCAweDZCQTUsIDB4NkJBNiwKLSAgICAweDZCQTcsIDB4NkJBOCwgMHg2QkE5LCAweDZCQUMsIDB4NkJBRCwgMHg2QkIwLCAweDZCQjEsIDB4NkJCNiwKLSAgICAweDZCQjgsIDB4NkJCOSwgMHg2QkJDLCAweDZCQkQsIDB4NkJCRSwgMHg2QkMwLCAweDZCQzMsIDB4NkJDNCwKLSAgICAweDZCQzcsIDB4NkJDOCwgMHg2QkM5LCAweDZCQ0EsIDB4NkJDQywgMHg2QkNFLCAweDZCRDAsIDB4NkJEMSwKLSAgICAweDZCRDgsIDB4NkJEQSwgMHg2QkRDLCAweDZCREQsIDB4NkJERSwgMHg2QkRGLCAweDZCRTAsIDB4NkJFMiwKLSAgICAweDZCRTMsIDB4NkJFNCwgMHg2QkU1LCAweDZCRTYsIDB4NkJFNywgMHg2QkU4LCAweDZCRTksIDB4NkJFQywKLSAgICAweDZCRUQsIDB4NkJFRSwgMHg2QkYwLCAweDZCRjEsIDB4NkJGMiwgMHg2QkY0LCAweDZCRjYsIDB4NkJGNywKLSAgICAweDZCRjgsIDB4NkJGQSwgMHg2QkZCLCAweDZCRkMsIDB4NkJGRSwgMHg2QzAwLCAweDZDMDEsIDB4NkMwMiwKLSAgICAweDZDMDMsIDB4NkMwNCwgMHg2QzA5LCAweDZDMEEsIDB4NkMwQiwgMHg2QzBFLCAweDZDMTIsIDB4NkMxNywKLSAgICAweDZDMUMsIDB4NkMxRCwgMHg2QzFFLCAweDZDMjAsIDB4NkMyNSwgMHg2QzJELCAweDZDMzEsIDB4NkMzMywKLSAgICAweDZDMzYsIDB4NkMzNywgMHg2QzM5LCAweDZDM0EsIDB4NkMzQiwgMHg2QzNDLCAweDZDM0UsIDB4NkMzRiwKLSAgICAweDZDNDMsIDB4NkM0NCwgMHg2QzQ1LCAweDZDNDgsIDB4NkM0QiwgMHg2QzRDLCAweDZDNEQsIDB4NkM0RSwKLSAgICAweDZDNEYsIDB4NkM1MSwgMHg2QzUyLCAweDZDNTMsIDB4NkM1NiwgMHg2QzU4LCAweDZDNTksIDB4NkM1QSwKLSAgICAweDZDNjIsIDB4NkM2MywgMHg2QzY1LCAweDZDNjYsIDB4NkM2NywgMHg2QzZCLCAweDZDNkMsIDB4NkM2RCwKLSAgICAweDZDNkUsIDB4NkM2RiwgMHg2QzcxLCAweDZDNzMsIDB4NkM3NSwgMHg2Qzc3LCAweDZDNzgsIDB4NkM3QSwKLSAgICAweDZDN0IsIDB4NkM3QywgMHg2QzdGLCAweDZDODAsIDB4NkM4NCwgMHg2Qzg3LCAweDZDOEEsIDB4NkM4QiwKLSAgICAweDZDOEQsIDB4NkM4RSwgMHg2QzkxLCAweDZDOTIsIDB4NkM5NSwgMHg2Qzk2LCAweDZDOTcsIDB4NkM5OCwKLSAgICAweDZDOUEsIDB4NkM5QywgMHg2QzlELCAweDZDOUUsIDB4NkNBMCwgMHg2Q0EyLCAweDZDQTgsIDB4NkNBQywKLSAgICAweDZDQUYsIDB4NkNCMCwgMHg2Q0I0LCAweDZDQjUsIDB4NkNCNiwgMHg2Q0I3LCAweDZDQkEsIDB4NkNDMCwKLSAgICAweDZDQzEsIDB4NkNDMiwgMHg2Q0MzLCAweDZDQzYsIDB4NkNDNywgMHg2Q0M4LCAweDZDQ0IsIDB4NkNDRCwKLSAgICAweDZDQ0UsIDB4NkNDRiwgMHg2Q0QxLCAweDZDRDIsIDB4NkNEOCwgMHg2Q0Q5LCAweDZDREEsIDB4NkNEQywKLSAgICAweDZDREQsIDB4NkNERiwgMHg2Q0U0LCAweDZDRTYsIDB4NkNFNywgMHg2Q0U5LCAweDZDRUMsIDB4NkNFRCwKLSAgICAweDZDRjIsIDB4NkNGNCwgMHg2Q0Y5LCAweDZDRkYsIDB4NkQwMCwgMHg2RDAyLCAweDZEMDMsIDB4NkQwNSwKLSAgICAweDZEMDYsIDB4NkQwOCwgMHg2RDA5LCAweDZEMEEsIDB4NkQwRCwgMHg2RDBGLCAweDZEMTAsIDB4NkQxMSwKLSAgICAweDZEMTMsIDB4NkQxNCwgMHg2RDE1LCAweDZEMTYsIDB4NkQxOCwgMHg2RDFDLCAweDZEMUQsIDB4NkQxRiwKLSAgICAweDZEMjAsIDB4NkQyMSwgMHg2RDIyLCAweDZEMjMsIDB4NkQyNCwgMHg2RDI2LCAweDZEMjgsIDB4NkQyOSwKLSAgICAweDZEMkMsIDB4NkQyRCwgMHg2RDJGLCAweDZEMzAsIDB4NkQzNCwgMHg2RDM2LCAweDZEMzcsIDB4NkQzOCwKLSAgICAweDZEM0EsIDB4NkQzRiwgMHg2RDQwLCAweDZENDIsIDB4NkQ0NCwgMHg2RDQ5LCAweDZENEMsIDB4NkQ1MCwKLSAgICAweDZENTUsIDB4NkQ1NiwgMHg2RDU3LCAweDZENTgsIDB4NkQ1QiwgMHg2RDVELCAweDZENUYsIDB4NkQ2MSwKLSAgICAweDZENjIsIDB4NkQ2NCwgMHg2RDY1LCAweDZENjcsIDB4NkQ2OCwgMHg2RDZCLCAweDZENkMsIDB4NkQ2RCwKLSAgICAweDZENzAsIDB4NkQ3MSwgMHg2RDcyLCAweDZENzMsIDB4NkQ3NSwgMHg2RDc2LCAweDZEN0EsIDB4NkQ3QiwKLSAgICAweDZEN0QsIDB4NkQ3RSwgMHg2RDdGLCAweDZEODAsIDB4NkQ4MSwgMHg2RDgzLCAweDZEODQsIDB4NkQ4NiwKLSAgICAweDZEOEEsIDB4NkQ4QiwgMHg2RDhELCAweDZEOEYsIDB4NkQ5MCwgMHg2RDkyLCAweDZEOTYsIDB4NkQ5NywKLSAgICAweDZEOTgsIDB4NkQ5OSwgMHg2RDlBLCAweDZEOUMsIDB4NkRBMiwgMHg2REE1LCAweDZEQUMsIDB4NkRBRCwKLSAgICAweDZEQjAsIDB4NkRCMSwgMHg2REIzLCAweDZEQjQsIDB4NkRCNiwgMHg2REI3LCAweDZEQjksIDB4NkRCQSwKLSAgICAweDZEQkIsIDB4NkRCQywgMHg2REJELCAweDZEQkUsIDB4NkRDMSwgMHg2REMyLCAweDZEQzMsIDB4NkRDOCwKLSAgICAweDZEQzksIDB4NkRDQSwgMHg2RENELCAweDZEQ0UsIDB4NkRDRiwgMHg2REQwLCAweDZERDIsIDB4NkREMywKLSAgICAweDZERDQsIDB4NkRENSwgMHg2REQ3LCAweDZEREEsIDB4NkREQiwgMHg2RERDLCAweDZEREYsIDB4NkRFMiwKLSAgICAweDZERTMsIDB4NkRFNSwgMHg2REU3LCAweDZERTgsIDB4NkRFOSwgMHg2REVELCAweDZERUYsIDB4NkRGMCwKLSAgICAweDZERjIsIDB4NkRGNCwgMHg2REY4LCAweDZERkQsIDB4NkRGRSwgMHg2REZGLCAweDZFMDAsIDB4NkUwMSwKLSAgICAweDZFMDIsIDB4NkUwMywgMHg2RTA0LCAweDZFMDYsIDB4NkUwNywgMHg2RTA4LCAweDZFMDksIDB4NkUwQiwKLSAgICAweDZFMEYsIDB4NkUxMiwgMHg2RTEzLCAweDZFMTUsIDB4NkUxOCwgMHg2RTE5LCAweDZFMUIsIDB4NkUxQywKLSAgICAweDZFMUUsIDB4NkUxRiwgMHg2RTIyLCAweDZFMjcsIDB4NkUyOCwgMHg2RTJBLCAweDZFMkUsIDB4NkUzMCwKLSAgICAweDZFMzEsIDB4NkUzMywgMHg2RTM1LCAweDZFMzYsIDB4NkUzNywgMHg2RTM5LCAweDZFM0IsIDB4NkUzQywKLSAgICAweDZFM0QsIDB4NkUzRiwgMHg2RTQwLCAweDZFNDEsIDB4NkU0MiwgMHg2RTQ1LCAweDZFNDYsIDB4NkU0NywKLSAgICAweDZFNDgsIDB4NkU0OSwgMHg2RTRBLCAweDZFNEIsIDB4NkU0QywgMHg2RTRGLCAweDZFNTAsIDB4NkU1MSwKLSAgICAweDZFNTIsIDB4NkU1NSwgMHg2RTU3LCAweDZFNTksIDB4NkU1QSwgMHg2RTVDLCAweDZFNUQsIDB4NkU2MCwKLSAgICAweDZFNjEsIDB4NkU2MiwgMHg2RTYzLCAweDZFNjQsIDB4NkU2NSwgMHg2RTY2LCAweDZFNjcsIDB4NkU2OCwKLSAgICAweDZFNjksIDB4NkU2QSwgMHg2RTZDLCAweDZFNkQsIDB4NkU3MCwgMHg2RTcxLCAweDZFNzIsIDB4NkU3MywKLSAgICAweDZFNzQsIDB4NkU3NSwgMHg2RTc2LCAweDZFNzcsIDB4NkU3OCwgMHg2RTc5LCAweDZFN0EsIDB4NkU3QiwKLSAgICAweDZFN0MsIDB4NkU3RCwgMHg2RTgwLCAweDZFODEsIDB4NkU4MiwgMHg2RTg0LCAweDZFODcsIDB4NkU4OCwKLSAgICAweDZFOEEsIDB4NkU4QiwgMHg2RThDLCAweDZFOEQsIDB4NkU4RSwgMHg2RTkxLCAweDZFOTIsIDB4NkU5MywKLSAgICAweDZFOTQsIDB4NkU5NSwgMHg2RTk3LCAweDZFOTksIDB4NkU5QSwgMHg2RTlCLCAweDZFOUUsIDB4NkVBMCwKLSAgICAweDZFQTEsIDB4NkVBMywgMHg2RUE0LCAweDZFQTYsIDB4NkVBOCwgMHg2RUE5LCAweDZFQUIsIDB4NkVBQywKLSAgICAweDZFQUQsIDB4NkVBRSwgMHg2RUIwLCAweDZFQjMsIDB4NkVCNSwgMHg2RUI4LCAweDZFQjksIDB4NkVCQywKLSAgICAweDZFQkUsIDB4NkVCRiwgMHg2RUMwLCAweDZFQzMsIDB4NkVDNiwgMHg2RUM4LCAweDZFQzksIDB4NkVDQSwKLSAgICAweDZFQ0QsIDB4NkVEMCwgMHg2RUQyLCAweDZFRDYsIDB4NkVEOCwgMHg2RUQ5LCAweDZFREIsIDB4NkVEQywKLSAgICAweDZFREQsIDB4NkVFMywgMHg2RUU3LCAweDZFRUEsIDB4NkVFQiwgMHg2RUVELCAweDZFRUUsIDB4NkVGMCwKLSAgICAweDZFRjEsIDB4NkVGMywgMHg2RUY1LCAweDZFRjYsIDB4NkVGQSwgMHg2RUZCLCAweDZFRkMsIDB4NkVGRCwKLSAgICAweDZFRkUsIDB4NkYwMCwgMHg2RjAzLCAweDZGMDQsIDB4NkYwNSwgMHg2RjA3LCAweDZGMDgsIDB4NkYwQSwKLSAgICAweDZGMEIsIDB4NkYwQywgMHg2RjBELCAweDZGMEUsIDB4NkYxMCwgMHg2RjExLCAweDZGMTIsIDB4NkYxNiwKLSAgICAweDZGMTcsIDB4NkYxOCwgMHg2RjE5LCAweDZGMUIsIDB4NkYxQywgMHg2RjFELCAweDZGMUUsIDB4NkYxRiwKLSAgICAweDZGMjEsIDB4NkYyNSwgMHg2RjI2LCAweDZGMjcsIDB4NkYyOCwgMHg2RjJFLCAweDZGMzAsIDB4NkYzNCwKLSAgICAweDZGMzUsIDB4NkYzNywgMHg2RjM5LCAweDZGM0EsIDB4NkYzQiwgMHg2RjNDLCAweDZGM0QsIDB4NkY0MCwKLSAgICAweDZGNDIsIDB4NkY0MywgMHg2RjQ0LCAweDZGNDUsIDB4NkY0OCwgMHg2RjQ5LCAweDZGNEEsIDB4NkY0QywKLSAgICAweDZGNEUsIDB4NkY0RiwgMHg2RjUwLCAweDZGNTIsIDB4NkY1MywgMHg2RjU1LCAweDZGNTYsIDB4NkY1NywKLSAgICAweDZGNUEsIDB4NkY1QiwgMHg2RjVELCAweDZGNUYsIDB4NkY2MCwgMHg2RjYxLCAweDZGNjMsIDB4NkY2NSwKLSAgICAweDZGNjcsIDB4NkY2OCwgMHg2RjY5LCAweDZGNkEsIDB4NkY2QiwgMHg2RjZDLCAweDZGNzEsIDB4NkY3MywKLSAgICAweDZGNzUsIDB4NkY3NiwgMHg2Rjc5LCAweDZGN0IsIDB4NkY3RCwgMHg2RjdFLCAweDZGODEsIDB4NkY4MiwKLSAgICAweDZGODMsIDB4NkY4NSwgMHg2RjhBLCAweDZGOEIsIDB4NkY4RiwgMHg2RjkwLCAweDZGOTEsIDB4NkY5MiwKLSAgICAweDZGOTMsIDB4NkY5NCwgMHg2Rjk1LCAweDZGOTYsIDB4NkY5OCwgMHg2Rjk5LCAweDZGOUEsIDB4NkY5QiwKLSAgICAweDZGOUQsIDB4NkY5RSwgMHg2RjlGLCAweDZGQTIsIDB4NkZBMywgMHg2RkE1LCAweDZGQTYsIDB4NkZBOCwKLSAgICAweDZGQUEsIDB4NkZBQiwgMHg2RkFDLCAweDZGQUQsIDB4NkZBRiwgMHg2RkIwLCAweDZGQjIsIDB4NkZCNCwKLSAgICAweDZGQjUsIDB4NkZCNywgMHg2RkI4LCAweDZGQkEsIDB4NkZCQiwgMHg2RkJDLCAweDZGQkQsIDB4NkZCRSwKLSAgICAweDZGQkYsIDB4NkZDNCwgMHg2RkM1LCAweDZGQzYsIDB4NkZDNywgMHg2RkM4LCAweDZGQ0EsIDB4NkZDQiwKLSAgICAweDZGQ0MsIDB4NkZDRCwgMHg2RkNFLCAweDZGQ0YsIDB4NkZEMCwgMHg2RkQzLCAweDZGRDQsIDB4NkZENiwKLSAgICAweDZGRDcsIDB4NkZEOSwgMHg2RkRBLCAweDZGREMsIDB4NkZERCwgMHg2RkUyLCAweDZGRTMsIDB4NkZFNSwKLSAgICAweDZGRTYsIDB4NkZFNywgMHg2RkU4LCAweDZGRTksIDB4NkZFQSwgMHg2RkVDLCAweDZGRUQsIDB4NkZGMiwKLSAgICAweDZGRjMsIDB4NkZGNCwgMHg2RkY1LCAweDZGRjYsIDB4NkZGNywgMHg2RkY4LCAweDZGRjksIDB4NkZGQiwKLSAgICAweDZGRkQsIDB4NkZGRiwgMHg3MDAwLCAweDcwMDEsIDB4NzAwMiwgMHg3MDAzLCAweDcwMDQsIDB4NzAwNywKLSAgICAweDcwMDgsIDB4NzAwQSwgMHg3MDBDLCAweDcwMEQsIDB4NzAwRSwgMHg3MDEwLCAweDcwMTIsIDB4NzAxMywKLSAgICAweDcwMTQsIDB4NzAxNiwgMHg3MDE3LCAweDcwMTksIDB4NzAxQywgMHg3MDFFLCAweDcwMjEsIDB4NzAyMiwKLSAgICAweDcwMjQsIDB4NzAyNSwgMHg3MDI2LCAweDcwMjksIDB4NzAyQSwgMHg3MDJCLCAweDcwMkMsIDB4NzAyRCwKLSAgICAweDcwMkUsIDB4NzAyRiwgMHg3MDMxLCAweDcwMzMsIDB4NzAzNCwgMHg3MDM2LCAweDcwMzcsIDB4NzAzOCwKLSAgICAweDcwM0EsIDB4NzAzQiwgMHg3MDNDLCAweDcwM0QsIDB4NzAzRiwgMHg3MDQwLCAweDcwNDEsIDB4NzA0MiwKLSAgICAweDcwNDUsIDB4NzA0NiwgMHg3MDQ3LCAweDcwNDgsIDB4NzA0OSwgMHg3MDRBLCAweDcwNEIsIDB4NzA0RCwKLSAgICAweDcwNEUsIDB4NzA1MCwgMHg3MDUyLCAweDcwNTMsIDB4NzA1NCwgMHg3MDU2LCAweDcwNTcsIDB4NzA1OSwKLSAgICAweDcwNUEsIDB4NzA1QiwgMHg3MDVDLCAweDcwNUYsIDB4NzA2MCwgMHg3MDYxLCAweDcwNjIsIDB4NzA2NSwKLSAgICAweDcwNjYsIDB4NzA2OCwgMHg3MDY5LCAweDcwNkEsIDB4NzA2RSwgMHg3MDcxLCAweDcwNzIsIDB4NzA3MywKLSAgICAweDcwNzQsIDB4NzA3NywgMHg3MDc5LCAweDcwN0EsIDB4NzA3QiwgMHg3MDdELCAweDcwODEsIDB4NzA4MiwKLSAgICAweDcwODMsIDB4NzA4NCwgMHg3MDg2LCAweDcwODcsIDB4NzA4OCwgMHg3MDhCLCAweDcwOEMsIDB4NzA4RCwKLSAgICAweDcwOEYsIDB4NzA5MCwgMHg3MDkxLCAweDcwOTMsIDB4NzA5NywgMHg3MDk4LCAweDcwOUEsIDB4NzA5QiwKLSAgICAweDcwOUUsIDB4NzA5RiwgMHg3MEEwLCAweDcwQTEsIDB4NzBBMiwgMHg3MEEzLCAweDcwQTQsIDB4NzBBNSwKLSAgICAweDcwQTYsIDB4NzBBNywgMHg3MEE4LCAweDcwQTksIDB4NzBBQSwgMHg3MEIwLCAweDcwQjIsIDB4NzBCNCwKLSAgICAweDcwQjUsIDB4NzBCNiwgMHg3MEJBLCAweDcwQkUsIDB4NzBCRiwgMHg3MEM0LCAweDcwQzUsIDB4NzBDNiwKLSAgICAweDcwQzcsIDB4NzBDOSwgMHg3MENCLCAweDcwQ0MsIDB4NzBDRCwgMHg3MENFLCAweDcwRDAsIDB4NzBEMSwKLSAgICAweDcwRDIsIDB4NzBEMywgMHg3MEQ0LCAweDcwRDUsIDB4NzBENiwgMHg3MEQ3LCAweDcwREEsIDB4NzBEQywKLSAgICAweDcwREQsIDB4NzBERSwgMHg3MEUwLCAweDcwRTEsIDB4NzBFMiwgMHg3MEUzLCAweDcwRTUsIDB4NzBFQSwKLSAgICAweDcwRUUsIDB4NzBGMCwgMHg3MEYxLCAweDcwRjIsIDB4NzBGMywgMHg3MEY1LCAweDcwRjYsIDB4NzBGOCwKLSAgICAweDcwRkEsIDB4NzBGQiwgMHg3MEZDLCAweDcwRkUsIDB4NzBGRiwgMHg3MTAwLCAweDcxMDEsIDB4NzEwMiwKLSAgICAweDcxMDMsIDB4NzEwNCwgMHg3MTA1LCAweDcxMDYsIDB4NzEwNywgMHg3MTA4LCAweDcxMEIsIDB4NzEwQywKLSAgICAweDcxMEQsIDB4NzEwRSwgMHg3MTBGLCAweDcxMTEsIDB4NzExMiwgMHg3MTE0LCAweDcxMTcsIDB4NzExQiwKLSAgICAweDcxMUMsIDB4NzExRCwgMHg3MTFFLCAweDcxMUYsIDB4NzEyMCwgMHg3MTIyLCAweDcxMjMsIDB4NzEyNCwKLSAgICAweDcxMjUsIDB4NzEyNywgMHg3MTI4LCAweDcxMjksIDB4NzEyQSwgMHg3MTJCLCAweDcxMkMsIDB4NzEyRCwKLSAgICAweDcxMkUsIDB4NzEzMiwgMHg3MTMzLCAweDcxMzQsIDB4NzEzNSwgMHg3MTM3LCAweDcxMzgsIDB4NzEzOSwKLSAgICAweDcxM0EsIDB4NzEzQiwgMHg3MTNDLCAweDcxM0QsIDB4NzEzRSwgMHg3MTNGLCAweDcxNDAsIDB4NzE0MSwKLSAgICAweDcxNDIsIDB4NzE0MywgMHg3MTQ0LCAweDcxNDYsIDB4NzE0NywgMHg3MTQ4LCAweDcxNEIsIDB4NzE0RCwKLSAgICAweDcxNEYsIDB4NzE1MCwgMHg3MTUxLCAweDcxNTMsIDB4NzE1NCwgMHg3MTU1LCAweDcxNTYsIDB4NzE1NywKLSAgICAweDcxNTgsIDB4NzE1OSwgMHg3MTVBLCAweDcxNUIsIDB4NzE1RCwgMHg3MTVGLCAweDcxNjAsIDB4NzE2MSwKLSAgICAweDcxNjMsIDB4NzE2NSwgMHg3MTZBLCAweDcxNkIsIDB4NzE2RCwgMHg3MTZGLCAweDcxNzAsIDB4NzE3MSwKLSAgICAweDcxNzQsIDB4NzE3NSwgMHg3MTc2LCAweDcxNzcsIDB4NzE3OSwgMHg3MTdCLCAweDcxN0MsIDB4NzE3RSwKLSAgICAweDcxN0YsIDB4NzE4MCwgMHg3MTgxLCAweDcxODIsIDB4NzE4MywgMHg3MTg1LCAweDcxODYsIDB4NzE4NywKLSAgICAweDcxODgsIDB4NzE4OSwgMHg3MThCLCAweDcxOEMsIDB4NzE4RCwgMHg3MThFLCAweDcxOTAsIDB4NzE5MSwKLSAgICAweDcxOTMsIDB4NzE5NSwgMHg3MTk2LCAweDcxOUEsIDB4NzE5QiwgMHg3MTlDLCAweDcxOUQsIDB4NzE5RSwKLSAgICAweDcxQTEsIDB4NzFBMiwgMHg3MUEzLCAweDcxQTQsIDB4NzFBNSwgMHg3MUE2LCAweDcxQTcsIDB4NzFBOSwKLSAgICAweDcxQUEsIDB4NzFBQiwgMHg3MUFELCAweDcxQUUsIDB4NzFBRiwgMHg3MUIwLCAweDcxQjIsIDB4NzFCNCwKLSAgICAweDcxQjYsIDB4NzFCNywgMHg3MUI4LCAweDcxQkEsIDB4NzFCQiwgMHg3MUJDLCAweDcxQkQsIDB4NzFCRiwKLSAgICAweDcxQzAsIDB4NzFDMiwgMHg3MUM0LCAweDcxQzUsIDB4NzFDNiwgMHg3MUM3LCAweDcxQzksIDB4NzFDQSwKLSAgICAweDcxQ0IsIDB4NzFDQywgMHg3MUNELCAweDcxQ0YsIDB4NzFEMCwgMHg3MUQxLCAweDcxRDMsIDB4NzFENiwKLSAgICAweDcxRDcsIDB4NzFEOCwgMHg3MURBLCAweDcxREIsIDB4NzFERCwgMHg3MURFLCAweDcxRTEsIDB4NzFFMiwKLSAgICAweDcxRTMsIDB4NzFFNCwgMHg3MUU4LCAweDcxRTksIDB4NzFFQSwgMHg3MUVCLCAweDcxRUMsIDB4NzFFRiwKLSAgICAweDcxRjAsIDB4NzFGMSwgMHg3MUYyLCAweDcxRjMsIDB4NzFGNSwgMHg3MUY2LCAweDcxRjcsIDB4NzFGOCwKLSAgICAweDcxRkEsIDB4NzFGQiwgMHg3MUZELCAweDcxRkYsIDB4NzIwMCwgMHg3MjAxLCAweDcyMDIsIDB4NzIwMywKLSAgICAweDcyMDQsIDB4NzIwNSwgMHg3MjA3LCAweDcyMDgsIDB4NzIwOSwgMHg3MjBBLCAweDcyMEIsIDB4NzIwQywKLSAgICAweDcyMEUsIDB4NzIwRiwgMHg3MjExLCAweDcyMTIsIDB4NzIxMywgMHg3MjE0LCAweDcyMTUsIDB4NzIxNiwKLSAgICAweDcyMTcsIDB4NzIxOCwgMHg3MjE5LCAweDcyMUEsIDB4NzIxQywgMHg3MjFFLCAweDcyMUYsIDB4NzIyMCwKLSAgICAweDcyMjEsIDB4NzIyMiwgMHg3MjIzLCAweDcyMjQsIDB4NzIyNSwgMHg3MjI2LCAweDcyMjcsIDB4NzIyOSwKLSAgICAweDcyMkIsIDB4NzIyRCwgMHg3MjJFLCAweDcyMkYsIDB4NzIzMywgMHg3MjM0LCAweDcyM0MsIDB4NzI0MCwKLSAgICAweDcyNDEsIDB4NzI0MiwgMHg3MjQzLCAweDcyNDQsIDB4NzI0NSwgMHg3MjQ2LCAweDcyNDksIDB4NzI0QSwKLSAgICAweDcyNEIsIDB4NzI0RSwgMHg3MjRGLCAweDcyNTAsIDB4NzI1MSwgMHg3MjUzLCAweDcyNTQsIDB4NzI1NSwKLSAgICAweDcyNTcsIDB4NzI1QSwgMHg3MjVDLCAweDcyNUUsIDB4NzI2MCwgMHg3MjYzLCAweDcyNjQsIDB4NzI2NSwKLSAgICAweDcyNjgsIDB4NzI2QSwgMHg3MjZCLCAweDcyNkMsIDB4NzI2RCwgMHg3MjcwLCAweDcyNzEsIDB4NzI3MywKLSAgICAweDcyNzQsIDB4NzI3NiwgMHg3Mjc3LCAweDcyNzgsIDB4NzI3QiwgMHg3MjdDLCAweDcyODIsIDB4NzI4MywKLSAgICAweDcyODUsIDB4NzI4NiwgMHg3Mjg3LCAweDcyODgsIDB4NzI4OSwgMHg3MjhDLCAweDcyOEUsIDB4NzI5MCwKLSAgICAweDcyOTEsIDB4NzI5MywgMHg3Mjk0LCAweDcyOTUsIDB4NzI5NywgMHg3Mjk4LCAweDcyOTksIDB4NzI5QSwKLSAgICAweDcyOUIsIDB4NzI5QywgMHg3MjlELCAweDcyOUUsIDB4NzJBMCwgMHg3MkExLCAweDcyQTMsIDB4NzJBNCwKLSAgICAweDcyQTUsIDB4NzJBNiwgMHg3MkE4LCAweDcyQTksIDB4NzJBQSwgMHg3MkFCLCAweDcyQUUsIDB4NzJCMSwKLSAgICAweDcyQjIsIDB4NzJCMywgMHg3MkI1LCAweDcyQkEsIDB4NzJCQiwgMHg3MkJDLCAweDcyQkQsIDB4NzJCRSwKLSAgICAweDcyQkYsIDB4NzJDNSwgMHg3MkM2LCAweDcyQzcsIDB4NzJDOSwgMHg3MkNBLCAweDcyQ0IsIDB4NzJDQywKLSAgICAweDcyQ0YsIDB4NzJEMSwgMHg3MkQzLCAweDcyRDQsIDB4NzJENSwgMHg3MkQ2LCAweDcyRDgsIDB4NzJEQSwKLSAgICAweDcyREIsIDB4NzJEQywgMHg3MkRELCAweDcyREYsIDB4NzJFMiwgMHg3MkUzLCAweDcyRTQsIDB4NzJFNSwKLSAgICAweDcyRTYsIDB4NzJFNywgMHg3MkVBLCAweDcyRUIsIDB4NzJGNSwgMHg3MkY2LCAweDcyRkUsIDB4NzJGRiwKLSAgICAweDczMDAsIDB4NzMwMiwgMHg3MzA0LCAweDczMDUsIDB4NzMwNiwgMHg3MzA3LCAweDczMDgsIDB4NzMwOSwKLSAgICAweDczMEIsIDB4NzMwQywgMHg3MzBELCAweDczMEYsIDB4NzMxMCwgMHg3MzExLCAweDczMTIsIDB4NzMxNCwKLSAgICAweDczMTgsIDB4NzMxOSwgMHg3MzFBLCAweDczMUYsIDB4NzMyMCwgMHg3MzIzLCAweDczMjQsIDB4NzMyNiwKLSAgICAweDczMjcsIDB4NzMyOCwgMHg3MzJELCAweDczMkYsIDB4NzMzMCwgMHg3MzMyLCAweDczMzMsIDB4NzMzNSwKLSAgICAweDczM0EsIDB4NzMzQywgMHg3MzNELCAweDczNDAsIDB4NzM0MiwgMHg3MzQzLCAweDczNDYsIDB4NzM0NywKLSAgICAweDczNDgsIDB4NzM0OSwgMHg3MzRBLCAweDczNEIsIDB4NzM0QywgMHg3MzRFLCAweDczNEYsIDB4NzM1MSwKLSAgICAweDczNTMsIDB4NzM1NCwgMHg3MzU1LCAweDczNTYsIDB4NzM1OCwgMHg3MzU5LCAweDczNUEsIDB4NzM1QiwKLSAgICAweDczNUMsIDB4NzM1RCwgMHg3MzVFLCAweDczNUYsIDB4NzM2MSwgMHg3MzYyLCAweDczNjMsIDB4NzM2NCwKLSAgICAweDczNjUsIDB4NzM2NiwgMHg3MzY3LCAweDczNjksIDB4NzM2RSwgMHg3MzcxLCAweDczNzMsIDB4NzM3NCwKLSAgICAweDczNzYsIDB4NzM3OSwgMHg3MzdELCAweDczN0YsIDB4NzM4MSwgMHg3MzgyLCAweDczODMsIDB4NzM4NSwKLSAgICAweDczODYsIDB4NzM4OCwgMHg3MzhBLCAweDczOEMsIDB4NzM4RCwgMHg3MzhGLCAweDczOTAsIDB4NzM5MiwKLSAgICAweDczOTMsIDB4NzM5NCwgMHg3Mzk1LCAweDczOTcsIDB4NzM5OCwgMHg3Mzk5LCAweDczOUEsIDB4NzM5QywKLSAgICAweDczOUQsIDB4NzM5RSwgMHg3M0EwLCAweDczQTEsIDB4NzNBMywgMHg3M0E0LCAweDczQTUsIDB4NzNBNiwKLSAgICAweDczQTcsIDB4NzNBOCwgMHg3M0FBLCAweDczQUMsIDB4NzNBRCwgMHg3M0IxLCAweDczQjQsIDB4NzNCNSwKLSAgICAweDczQjYsIDB4NzNCOCwgMHg3M0I5LCAweDczQkMsIDB4NzNCRCwgMHg3M0JFLCAweDczQkYsIDB4NzNDMSwKLSAgICAweDczQzMsIDB4NzNDNCwgMHg3M0M1LCAweDczQzYsIDB4NzNDNywgMHg3M0NCLCAweDczQ0MsIDB4NzNDRSwKLSAgICAweDczRDIsIDB4NzNEMywgMHg3M0Q0LCAweDczRDUsIDB4NzNENiwgMHg3M0Q3LCAweDczRDgsIDB4NzNEQSwKLSAgICAweDczREIsIDB4NzNEQywgMHg3M0RELCAweDczREYsIDB4NzNFMSwgMHg3M0UyLCAweDczRTMsIDB4NzNFNCwKLSAgICAweDczRTYsIDB4NzNFOCwgMHg3M0VBLCAweDczRUIsIDB4NzNFQywgMHg3M0VFLCAweDczRUYsIDB4NzNGMCwKLSAgICAweDczRjEsIDB4NzNGMywgMHg3M0Y0LCAweDczRjUsIDB4NzNGNiwgMHg3M0Y3LCAweDczRjgsIDB4NzNGOSwKLSAgICAweDczRkEsIDB4NzNGQiwgMHg3M0ZDLCAweDczRkQsIDB4NzNGRiwgMHg3NDAwLCAweDc0MDEsIDB4NzQwMiwKLSAgICAweDc0MDQsIDB4NzQwNywgMHg3NDA4LCAweDc0MEIsIDB4NzQwQywgMHg3NDBELCAweDc0MEUsIDB4NzQxMSwKLSAgICAweDc0MTIsIDB4NzQxMywgMHg3NDE0LCAweDc0MTUsIDB4NzQxNiwgMHg3NDE3LCAweDc0MTgsIDB4NzQxOSwKLSAgICAweDc0MUMsIDB4NzQxRCwgMHg3NDFFLCAweDc0MUYsIDB4NzQyMCwgMHg3NDIxLCAweDc0MjMsIDB4NzQyNCwKLSAgICAweDc0MjcsIDB4NzQyOSwgMHg3NDJCLCAweDc0MkQsIDB4NzQyRiwgMHg3NDMxLCAweDc0MzIsIDB4NzQzNywKLSAgICAweDc0MzgsIDB4NzQzOSwgMHg3NDNBLCAweDc0M0IsIDB4NzQzRCwgMHg3NDNFLCAweDc0NDAsIDB4NzQ0MiwKLSAgICAweDc0NDMsIDB4NzQ0NCwgMHg3NDQ1LCAweDc0NDYsIDB4NzQ0NywgMHg3NDQ4LCAweDc0NDksIDB4NzQ0QSwKLSAgICAweDc0NEMsIDB4NzQ0RCwgMHg3NDRFLCAweDc0NEYsIDB4NzQ1MCwgMHg3NDUxLCAweDc0NTIsIDB4NzQ1MywKLSAgICAweDc0NTQsIDB4NzQ1NiwgMHg3NDU4LCAweDc0NUQsIDB4NzQ2MCwgMHg3NDYxLCAweDc0NjIsIDB4NzQ2NCwKLSAgICAweDc0NjUsIDB4NzQ2NiwgMHg3NDY3LCAweDc0NjgsIDB4NzQ2QiwgMHg3NDZDLCAweDc0NkUsIDB4NzQ2RiwKLSAgICAweDc0NzEsIDB4NzQ3MiwgMHg3NDczLCAweDc0NzQsIDB4NzQ3NSwgMHg3NDc4LCAweDc0NzksIDB4NzQ3QSwKLSAgICAweDc0N0IsIDB4NzQ3QywgMHg3NDdELCAweDc0N0YsIDB4NzQ4MiwgMHg3NDg0LCAweDc0ODUsIDB4NzQ4NiwKLSAgICAweDc0ODgsIDB4NzQ4QSwgMHg3NDhDLCAweDc0OEQsIDB4NzQ4RiwgMHg3NDkxLCAweDc0OTIsIDB4NzQ5MywKLSAgICAweDc0OTQsIDB4NzQ5NSwgMHg3NDk2LCAweDc0OTcsIDB4NzQ5OCwgMHg3NDk5LCAweDc0OUEsIDB4NzQ5QiwKLSAgICAweDc0OUQsIDB4NzQ5RiwgMHg3NEEwLCAweDc0QTEsIDB4NzRBMiwgMHg3NEE0LCAweDc0QTUsIDB4NzRBQSwKLSAgICAweDc0QUIsIDB4NzRBQywgMHg3NEFELCAweDc0QUUsIDB4NzRBRiwgMHg3NEIxLCAweDc0QjIsIDB4NzRCMywKLSAgICAweDc0QjQsIDB4NzRCNSwgMHg3NEI2LCAweDc0QjcsIDB4NzRCOCwgMHg3NEI5LCAweDc0QkIsIDB4NzRCQywKLSAgICAweDc0QkUsIDB4NzRCRiwgMHg3NEMwLCAweDc0QzEsIDB4NzRDMiwgMHg3NEMzLCAweDc0QzQsIDB4NzRDNSwKLSAgICAweDc0QzYsIDB4NzRDNywgMHg3NEM4LCAweDc0QzksIDB4NzRDQiwgMHg3NENDLCAweDc0Q0QsIDB4NzRDRSwKLSAgICAweDc0RDAsIDB4NzREMSwgMHg3NEQzLCAweDc0RDUsIDB4NzRENiwgMHg3NEQ3LCAweDc0RDgsIDB4NzREOSwKLSAgICAweDc0REIsIDB4NzRERCwgMHg3NERGLCAweDc0RTEsIDB4NzRFNSwgMHg3NEU3LCAweDc0RTgsIDB4NzRFOSwKLSAgICAweDc0RUEsIDB4NzRFQiwgMHg3NEVDLCAweDc0RUQsIDB4NzRGMCwgMHg3NEYxLCAweDc0RjIsIDB4NzRGMywKLSAgICAweDc0RjUsIDB4NzRGOCwgMHg3NEY5LCAweDc0RkEsIDB4NzRGQiwgMHg3NEZDLCAweDc0RkQsIDB4NzRGRSwKLSAgICAweDc1MDAsIDB4NzUwMSwgMHg3NTAyLCAweDc1MDMsIDB4NzUwNSwgMHg3NTA2LCAweDc1MDcsIDB4NzUwOCwKLSAgICAweDc1MDksIDB4NzUwQSwgMHg3NTBCLCAweDc1MEUsIDB4NzUxMCwgMHg3NTEyLCAweDc1MTQsIDB4NzUxNSwKLSAgICAweDc1MTYsIDB4NzUxNywgMHg3NTFCLCAweDc1MUQsIDB4NzUxRSwgMHg3NTIwLCAweDc1MjEsIDB4NzUyMiwKLSAgICAweDc1MjQsIDB4NzUyNiwgMHg3NTI3LCAweDc1MkEsIDB4NzUyRSwgMHg3NTM0LCAweDc1MzYsIDB4NzUzOSwKLSAgICAweDc1M0MsIDB4NzUzRCwgMHg3NTNGLCAweDc1NDEsIDB4NzU0MiwgMHg3NTQzLCAweDc1NDQsIDB4NzU0NiwKLSAgICAweDc1NDcsIDB4NzU0OSwgMHg3NTRBLCAweDc1NEQsIDB4NzU1MCwgMHg3NTUxLCAweDc1NTIsIDB4NzU1MywKLSAgICAweDc1NTUsIDB4NzU1NiwgMHg3NTU3LCAweDc1NTgsIDB4NzU1RSwgMHg3NTVGLCAweDc1NjAsIDB4NzU2MSwKLSAgICAweDc1NjMsIDB4NzU2NCwgMHg3NTY3LCAweDc1NjgsIDB4NzU2OSwgMHg3NTZDLCAweDc1NkQsIDB4NzU2RSwKLSAgICAweDc1NkYsIDB4NzU3MCwgMHg3NTcxLCAweDc1NzMsIDB4NzU3NSwgMHg3NTc3LCAweDc1N0EsIDB4NzU3QiwKLSAgICAweDc1N0MsIDB4NzU3RCwgMHg3NTdFLCAweDc1ODAsIDB4NzU4MSwgMHg3NTgyLCAweDc1ODQsIDB4NzU4NSwKLSAgICAweDc1ODgsIDB4NzU4OSwgMHg3NThBLCAweDc1OEMsIDB4NzU4RCwgMHg3NThFLCAweDc1OTAsIDB4NzU5MywKLSAgICAweDc1OTUsIDB4NzU5OCwgMHg3NTlCLCAweDc1OUMsIDB4NzU5RSwgMHg3NUEyLCAweDc1QTYsIDB4NzVBNywKLSAgICAweDc1QTgsIDB4NzVBOSwgMHg3NUFBLCAweDc1QUQsIDB4NzVCNiwgMHg3NUI3LCAweDc1QkEsIDB4NzVCQiwKLSAgICAweDc1QkYsIDB4NzVDMCwgMHg3NUMxLCAweDc1QzYsIDB4NzVDQiwgMHg3NUNDLCAweDc1Q0UsIDB4NzVDRiwKLSAgICAweDc1RDAsIDB4NzVEMSwgMHg3NUQzLCAweDc1RDcsIDB4NzVEQSwgMHg3NURDLCAweDc1REQsIDB4NzVERiwKLSAgICAweDc1RTAsIDB4NzVFMSwgMHg3NUU1LCAweDc1RTksIDB4NzVFQywgMHg3NUVELCAweDc1RUUsIDB4NzVFRiwKLSAgICAweDc1RjIsIDB4NzVGMywgMHg3NUY1LCAweDc1RjYsIDB4NzVGNywgMHg3NUY4LCAweDc1RkEsIDB4NzVGQiwKLSAgICAweDc1RkQsIDB4NzVGRSwgMHg3NjA0LCAweDc2MDYsIDB4NzYwNywgMHg3NjA4LCAweDc2MDksIDB4NzYwRSwKLSAgICAweDc2MEYsIDB4NzYxMSwgMHg3NjEyLCAweDc2MTMsIDB4NzYxNCwgMHg3NjE2LCAweDc2MUEsIDB4NzYxQywKLSAgICAweDc2MUQsIDB4NzYyMywgMHg3NjI4LCAweDc2MkMsIDB4NzYyRSwgMHg3NjJGLCAweDc2MzEsIDB4NzYzMiwKLSAgICAweDc2MzYsIDB4NzYzNywgMHg3NjM5LCAweDc2M0EsIDB4NzYzRCwgMHg3NjQxLCAweDc2NDQsIDB4NzY0NSwKLSAgICAweDc2NDgsIDB4NzY0QSwgMHg3NjRCLCAweDc2NEUsIDB4NzY0RiwgMHg3NjUwLCAweDc2NTEsIDB4NzY1MiwKLSAgICAweDc2NTMsIDB4NzY1NSwgMHg3NjU3LCAweDc2NTksIDB4NzY1QSwgMHg3NjVCLCAweDc2NUQsIDB4NzY2MCwKLSAgICAweDc2NjEsIDB4NzY2NiwgMHg3NjY4LCAweDc2NkEsIDB4NzY3MywgMHg3Njc0LCAweDc2NzUsIDB4NzY3NiwKLSAgICAweDc2NzcsIDB4NzY3OSwgMHg3NjdBLCAweDc2N0YsIDB4NzY4MCwgMHg3NjgxLCAweDc2ODMsIDB4NzY4NSwKLSAgICAweDc2ODksIDB4NzY4QSwgMHg3NjhDLCAweDc2OEQsIDB4NzY4RiwgMHg3NjkwLCAweDc2OTIsIDB4NzY5NCwKLSAgICAweDc2OTUsIDB4NzY5NywgMHg3Njk4LCAweDc2OUIsIDB4NzY5QywgMHg3NjlELCAweDc2OUUsIDB4NzY5RiwKLSAgICAweDc2QTAsIDB4NzZBMSwgMHg3NkEyLCAweDc2QTMsIDB4NzZBNSwgMHg3NkE2LCAweDc2QTcsIDB4NzZBOCwKLSAgICAweDc2QTksIDB4NzZBQSwgMHg3NkFCLCAweDc2QUMsIDB4NzZBRCwgMHg3NkFGLCAweDc2QjAsIDB4NzZCMywKLSAgICAweDc2QjUsIDB4NzZCNiwgMHg3NkI3LCAweDc2QjksIDB4NzZCQiwgMHg3NkJDLCAweDc2QkQsIDB4NzZCRSwKLSAgICAweDc2QzAsIDB4NzZDMSwgMHg3NkMzLCAweDc2QzQsIDB4NzZDNywgMHg3NkM5LCAweDc2Q0IsIDB4NzZDQywKLSAgICAweDc2RDMsIDB4NzZENSwgMHg3NkQ5LCAweDc2REEsIDB4NzZEQywgMHg3NkRELCAweDc2RTAsIDB4NzZFMiwKLSAgICAweDc2RTYsIDB4NzZFOCwgMHg3NkU5LCAweDc2RUEsIDB4NzZFQiwgMHg3NkVDLCAweDc2RUQsIDB4NzZGMCwKLSAgICAweDc2RjMsIDB4NzZGNSwgMHg3NkY2LCAweDc2RjcsIDB4NzZGQSwgMHg3NkZCLCAweDc2RkQsIDB4NzZGRiwKLSAgICAweDc3MDAsIDB4NzcwMiwgMHg3NzAzLCAweDc3MDUsIDB4NzcwNiwgMHg3NzBBLCAweDc3MEMsIDB4NzcwRSwKLSAgICAweDc3MEYsIDB4NzcxMCwgMHg3NzExLCAweDc3MTIsIDB4NzcxMywgMHg3NzE0LCAweDc3MTUsIDB4NzcxNiwKLSAgICAweDc3MTcsIDB4NzcxOCwgMHg3NzFCLCAweDc3MUMsIDB4NzcxRCwgMHg3NzFFLCAweDc3MjEsIDB4NzcyMywKLSAgICAweDc3MjQsIDB4NzcyNSwgMHg3NzI3LCAweDc3MkEsIDB4NzcyQiwgMHg3NzJDLCAweDc3MkUsIDB4NzczMCwKLSAgICAweDc3MzEsIDB4NzczMiwgMHg3NzMzLCAweDc3MzQsIDB4NzczOSwgMHg3NzNCLCAweDc3M0QsIDB4NzczRSwKLSAgICAweDc3M0YsIDB4Nzc0MiwgMHg3NzQ0LCAweDc3NDUsIDB4Nzc0NiwgMHg3NzQ4LCAweDc3NDksIDB4Nzc0QSwKLSAgICAweDc3NEIsIDB4Nzc0QywgMHg3NzRELCAweDc3NEUsIDB4Nzc1MiwgMHg3NzUzLCAweDc3NTQsIDB4Nzc1NSwKLSAgICAweDc3NTYsIDB4Nzc1NywgMHg3NzU4LCAweDc3NTksIDB4Nzc1QywgMHg3NzVELCAweDc3NUYsIDB4Nzc2MCwKLSAgICAweDc3NjQsIDB4Nzc2NywgMHg3NzY5LCAweDc3NkEsIDB4Nzc2RCwgMHg3NzZFLCAweDc3NkYsIDB4Nzc3MCwKLSAgICAweDc3NzEsIDB4Nzc3MiwgMHg3NzczLCAweDc3NzQsIDB4Nzc3NSwgMHg3Nzc2LCAweDc3NzcsIDB4Nzc3OCwKLSAgICAweDc3N0EsIDB4Nzc3QiwgMHg3NzdDLCAweDc3ODEsIDB4Nzc4MiwgMHg3NzgzLCAweDc3ODYsIDB4Nzc4NywKLSAgICAweDc3ODgsIDB4Nzc4OSwgMHg3NzhBLCAweDc3OEIsIDB4Nzc4RiwgMHg3NzkwLCAweDc3OTMsIDB4Nzc5NCwKLSAgICAweDc3OTUsIDB4Nzc5NiwgMHg3Nzk3LCAweDc3OTksIDB4Nzc5QSwgMHg3NzlCLCAweDc3OUMsIDB4Nzc5RCwKLSAgICAweDc3QTEsIDB4NzdBMywgMHg3N0E0LCAweDc3QTYsIDB4NzdBOCwgMHg3N0FCLCAweDc3QUUsIDB4NzdBRiwKLSAgICAweDc3QjEsIDB4NzdCMiwgMHg3N0I0LCAweDc3QjYsIDB4NzdCNywgMHg3N0I4LCAweDc3QjksIDB4NzdCQSwKLSAgICAweDc3QkUsIDB4NzdDMCwgMHg3N0MxLCAweDc3QzIsIDB4NzdDMywgMHg3N0M0LCAweDc3QzUsIDB4NzdDNiwKLSAgICAweDc3QzgsIDB4NzdDOSwgMHg3N0NBLCAweDc3Q0IsIDB4NzdDQywgMHg3N0NFLCAweDc3Q0YsIDB4NzdEMCwKLSAgICAweDc3RDEsIDB4NzdEMiwgMHg3N0QzLCAweDc3RDQsIDB4NzdENSwgMHg3N0Q2LCAweDc3RDgsIDB4NzdEOSwKLSAgICAweDc3REQsIDB4NzdERSwgMHg3N0RGLCAweDc3RTAsIDB4NzdFMSwgMHg3N0U0LCAweDc3RTYsIDB4NzdFOCwKLSAgICAweDc3RUEsIDB4NzdGMCwgMHg3N0YxLCAweDc3RjIsIDB4NzdGNCwgMHg3N0Y1LCAweDc3RjcsIDB4NzdGOSwKLSAgICAweDc3RkEsIDB4NzdGQiwgMHg3N0ZDLCAweDc4MDMsIDB4NzgwNCwgMHg3ODA1LCAweDc4MDYsIDB4NzgwNywKLSAgICAweDc4MDgsIDB4NzgwQSwgMHg3ODBCLCAweDc4MEUsIDB4NzgwRiwgMHg3ODEwLCAweDc4MTMsIDB4NzgxNSwKLSAgICAweDc4MTksIDB4NzgxQiwgMHg3ODFFLCAweDc4MjAsIDB4NzgyMSwgMHg3ODIyLCAweDc4MjQsIDB4NzgyOCwKLSAgICAweDc4MkEsIDB4NzgyQiwgMHg3ODJFLCAweDc4MkYsIDB4NzgzMSwgMHg3ODMyLCAweDc4MzMsIDB4NzgzNSwKLSAgICAweDc4MzYsIDB4NzgzRCwgMHg3ODNGLCAweDc4NDEsIDB4Nzg0MiwgMHg3ODQ0LCAweDc4NDYsIDB4Nzg0OCwKLSAgICAweDc4NDksIDB4Nzg0QSwgMHg3ODRCLCAweDc4NEQsIDB4Nzg0RiwgMHg3ODUxLCAweDc4NTMsIDB4Nzg1NCwKLSAgICAweDc4NTgsIDB4Nzg1OSwgMHg3ODVBLCAweDc4NUIsIDB4Nzg1QywgMHg3ODVFLCAweDc4NUYsIDB4Nzg2MCwKLSAgICAweDc4NjEsIDB4Nzg2MiwgMHg3ODYzLCAweDc4NjUsIDB4Nzg2NiwgMHg3ODY3LCAweDc4NjksIDB4Nzg3MCwKLSAgICAweDc4NzEsIDB4Nzg3MiwgMHg3ODczLCAweDc4NzQsIDB4Nzg3NSwgMHg3ODc2LCAweDc4NzgsIDB4Nzg3OSwKLSAgICAweDc4N0EsIDB4Nzg3QiwgMHg3ODdELCAweDc4N0UsIDB4Nzg3RiwgMHg3ODgwLCAweDc4ODEsIDB4Nzg4MiwKLSAgICAweDc4ODMsIDB4Nzg4NCwgMHg3ODg1LCAweDc4ODYsIDB4Nzg4OCwgMHg3ODhBLCAweDc4OEIsIDB4Nzg4RiwKLSAgICAweDc4OTAsIDB4Nzg5MiwgMHg3ODk0LCAweDc4OTUsIDB4Nzg5NiwgMHg3ODk5LCAweDc4OUQsIDB4Nzg5RSwKLSAgICAweDc4QTAsIDB4NzhBMiwgMHg3OEE0LCAweDc4QTYsIDB4NzhBOCwgMHg3OEFBLCAweDc4QUIsIDB4NzhBQywKLSAgICAweDc4QUUsIDB4NzhBRiwgMHg3OEI1LCAweDc4QjYsIDB4NzhCNywgMHg3OEJCLCAweDc4QkQsIDB4NzhCRiwKLSAgICAweDc4QzAsIDB4NzhDMiwgMHg3OEMzLCAweDc4QzQsIDB4NzhDNiwgMHg3OEM3LCAweDc4QzgsIDB4NzhDQywKLSAgICAweDc4Q0QsIDB4NzhDRSwgMHg3OENGLCAweDc4RDEsIDB4NzhEMiwgMHg3OEQzLCAweDc4RDYsIDB4NzhENywKLSAgICAweDc4RDgsIDB4NzhEQiwgMHg3OERDLCAweDc4REQsIDB4NzhERSwgMHg3OERGLCAweDc4RTAsIDB4NzhFMSwKLSAgICAweDc4RTIsIDB4NzhFNCwgMHg3OEU1LCAweDc4RTYsIDB4NzhFOSwgMHg3OEVBLCAweDc4RUIsIDB4NzhFRCwKLSAgICAweDc4RUUsIDB4NzhGMCwgMHg3OEYxLCAweDc4RjMsIDB4NzhGNSwgMHg3OEY2LCAweDc4RjgsIDB4NzhGOSwKLSAgICAweDc4RkIsIDB4NzhGQywgMHg3OEZFLCAweDc4RkYsIDB4NzkwMCwgMHg3OTAyLCAweDc5MDMsIDB4NzkwNCwKLSAgICAweDc5MDYsIDB4NzkwNywgMHg3OTA4LCAweDc5MDksIDB4NzkwQSwgMHg3OTBCLCAweDc5MEMsIDB4NzkwRCwKLSAgICAweDc5MEYsIDB4NzkxMCwgMHg3OTExLCAweDc5MTIsIDB4NzkxNCwgMHg3OTE1LCAweDc5MTYsIDB4NzkxNywKLSAgICAweDc5MTgsIDB4NzkxQSwgMHg3OTFCLCAweDc5MUMsIDB4NzkxRCwgMHg3OTFGLCAweDc5MjAsIDB4NzkyMSwKLSAgICAweDc5MjIsIDB4NzkyMywgMHg3OTI1LCAweDc5MjcsIDB4NzkyOCwgMHg3OTI5LCAweDc5MkQsIDB4NzkyRSwKLSAgICAweDc5MkYsIDB4NzkzMCwgMHg3OTMyLCAweDc5MzMsIDB4NzkzNSwgMHg3OTM2LCAweDc5MzcsIDB4NzkzOCwKLSAgICAweDc5MzksIDB4NzkzRCwgMHg3OTNGLCAweDc5NDIsIDB4Nzk0MywgMHg3OTQ0LCAweDc5NDUsIDB4Nzk0NywKLSAgICAweDc5NEEsIDB4Nzk0QiwgMHg3OTRDLCAweDc5NEQsIDB4Nzk0RSwgMHg3OTRGLCAweDc5NTAsIDB4Nzk1MSwKLSAgICAweDc5NTIsIDB4Nzk1NCwgMHg3OTU1LCAweDc5NTgsIDB4Nzk1OSwgMHg3OTYxLCAweDc5NjMsIDB4Nzk2NCwKLSAgICAweDc5NjYsIDB4Nzk2OSwgMHg3OTZBLCAweDc5NkIsIDB4Nzk2QywgMHg3OTZFLCAweDc5NzAsIDB4Nzk3MSwKLSAgICAweDc5NzIsIDB4Nzk3MywgMHg3OTc0LCAweDc5NzUsIDB4Nzk3NiwgMHg3OTc5LCAweDc5N0IsIDB4Nzk3QywKLSAgICAweDc5N0QsIDB4Nzk3RSwgMHg3OTdGLCAweDc5ODIsIDB4Nzk4MywgMHg3OTg2LCAweDc5ODcsIDB4Nzk4OCwKLSAgICAweDc5ODksIDB4Nzk4QiwgMHg3OThDLCAweDc5OTAsIDB4Nzk5MSwgMHg3OTkyLCAweDc5OTMsIDB4Nzk5NCwKLSAgICAweDc5OTUsIDB4Nzk5NiwgMHg3OTk3LCAweDc5OTgsIDB4Nzk5OSwgMHg3OTlCLCAweDc5OUMsIDB4Nzk5RCwKLSAgICAweDc5OUUsIDB4Nzk5RiwgMHg3OUEwLCAweDc5QTEsIDB4NzlBMiwgMHg3OUEzLCAweDc5QTQsIDB4NzlBNSwKLSAgICAweDc5QTgsIDB4NzlBOSwgMHg3OUFCLCAweDc5QUMsIDB4NzlBRCwgMHg3OUFGLCAweDc5QjIsIDB4NzlCNCwKLSAgICAweDc5QjUsIDB4NzlCNiwgMHg3OUI3LCAweDc5QjgsIDB4NzlCQywgMHg3OUJGLCAweDc5QzIsIDB4NzlDNCwKLSAgICAweDc5QzUsIDB4NzlDNywgMHg3OUM4LCAweDc5Q0EsIDB4NzlDQywgMHg3OUNFLCAweDc5Q0YsIDB4NzlEMCwKLSAgICAweDc5RDMsIDB4NzlENCwgMHg3OUQ2LCAweDc5RDcsIDB4NzlEOSwgMHg3OURBLCAweDc5REIsIDB4NzlEQywKLSAgICAweDc5REQsIDB4NzlERSwgMHg3OUUwLCAweDc5RTEsIDB4NzlFMiwgMHg3OUU1LCAweDc5RTgsIDB4NzlFQSwKLSAgICAweDc5RUMsIDB4NzlFRSwgMHg3OUYxLCAweDc5RjIsIDB4NzlGMywgMHg3OUY0LCAweDc5RjUsIDB4NzlGNiwKLSAgICAweDc5RjcsIDB4NzlGOSwgMHg3OUZBLCAweDc5RkMsIDB4NzlGRSwgMHg3OUZGLCAweDdBMDEsIDB4N0EwNCwKLSAgICAweDdBMDUsIDB4N0EwNywgMHg3QTA4LCAweDdBMDksIDB4N0EwQSwgMHg3QTBDLCAweDdBMEYsIDB4N0ExMCwKLSAgICAweDdBMTEsIDB4N0ExMiwgMHg3QTEzLCAweDdBMTUsIDB4N0ExNiwgMHg3QTE4LCAweDdBMTksIDB4N0ExQiwKLSAgICAweDdBMUMsIDB4N0ExRCwgMHg3QTFGLCAweDdBMjEsIDB4N0EyMiwgMHg3QTI0LCAweDdBMjUsIDB4N0EyNiwKLSAgICAweDdBMjcsIDB4N0EyOCwgMHg3QTI5LCAweDdBMkEsIDB4N0EyQiwgMHg3QTJDLCAweDdBMkQsIDB4N0EyRiwKLSAgICAweDdBMzAsIDB4N0EzMiwgMHg3QTM0LCAweDdBMzUsIDB4N0EzNiwgMHg3QTM4LCAweDdBM0EsIDB4N0EzRSwKLSAgICAweDdBNDEsIDB4N0E0MiwgMHg3QTQzLCAweDdBNDQsIDB4N0E0NSwgMHg3QTQ3LCAweDdBNDgsIDB4N0E0OSwKLSAgICAweDdBNEEsIDB4N0E0QiwgMHg3QTRGLCAweDdBNTAsIDB4N0E1MiwgMHg3QTUzLCAweDdBNTQsIDB4N0E1NSwKLSAgICAweDdBNTYsIDB4N0E1OCwgMHg3QTU5LCAweDdBNUEsIDB4N0E1QiwgMHg3QTVDLCAweDdBNUQsIDB4N0E1RSwKLSAgICAweDdBNUYsIDB4N0E2MCwgMHg3QTYzLCAweDdBNjQsIDB4N0E2NSwgMHg3QTY2LCAweDdBNjcsIDB4N0E2OCwKLSAgICAweDdBNkEsIDB4N0E2QywgMHg3QTZELCAweDdBNkUsIDB4N0E2RiwgMHg3QTcxLCAweDdBNzIsIDB4N0E3MywKLSAgICAweDdBNzUsIDB4N0E3QiwgMHg3QTdDLCAweDdBN0QsIDB4N0E3RSwgMHg3QTgyLCAweDdBODUsIDB4N0E4NywKLSAgICAweDdBODksIDB4N0E4QSwgMHg3QThCLCAweDdBOEMsIDB4N0E4RSwgMHg3QThGLCAweDdBOTAsIDB4N0E5MywKLSAgICAweDdBOTQsIDB4N0E5OSwgMHg3QTlBLCAweDdBOUIsIDB4N0E5RSwgMHg3QUExLCAweDdBQTIsIDB4N0FBMywKLSAgICAweDdBQTQsIDB4N0FBNywgMHg3QUFCLCAweDdBQUYsIDB4N0FCMCwgMHg3QUIxLCAweDdBQjIsIDB4N0FCNCwKLSAgICAweDdBQjUsIDB4N0FCNywgMHg3QUI4LCAweDdBQjksIDB4N0FCQiwgMHg3QUJDLCAweDdBQkQsIDB4N0FCRSwKLSAgICAweDdBQzAsIDB4N0FDMSwgMHg3QUMyLCAweDdBQzMsIDB4N0FDNiwgMHg3QUM5LCAweDdBQ0MsIDB4N0FDRCwKLSAgICAweDdBQ0UsIDB4N0FDRiwgMHg3QUQwLCAweDdBRDEsIDB4N0FEMiwgMHg3QUQzLCAweDdBRDQsIDB4N0FENSwKLSAgICAweDdBRDcsIDB4N0FEOCwgMHg3QURBLCAweDdBREIsIDB4N0FEQywgMHg3QURELCAweDdBRTEsIDB4N0FFMiwKLSAgICAweDdBRTQsIDB4N0FFNywgMHg3QUU4LCAweDdBRTksIDB4N0FFQiwgMHg3QUVDLCAweDdBRUUsIDB4N0FGMCwKLSAgICAweDdBRjEsIDB4N0FGMiwgMHg3QUYzLCAweDdBRjQsIDB4N0FGNSwgMHg3QUY3LCAweDdBRjgsIDB4N0FGQiwKLSAgICAweDdBRkMsIDB4N0FGRSwgMHg3QjAwLCAweDdCMDEsIDB4N0IwMiwgMHg3QjA1LCAweDdCMDcsIDB4N0IwOSwKLSAgICAweDdCMEMsIDB4N0IwRCwgMHg3QjBFLCAweDdCMTAsIDB4N0IxMiwgMHg3QjEzLCAweDdCMTYsIDB4N0IxNywKLSAgICAweDdCMTgsIDB4N0IxQSwgMHg3QjFDLCAweDdCMUQsIDB4N0IxRiwgMHg3QjIxLCAweDdCMjIsIDB4N0IyMywKLSAgICAweDdCMjcsIDB4N0IyOSwgMHg3QjJELCAweDdCMkYsIDB4N0IzMCwgMHg3QjMyLCAweDdCMzQsIDB4N0IzNSwKLSAgICAweDdCMzYsIDB4N0IzNywgMHg3QjM5LCAweDdCM0IsIDB4N0IzRCwgMHg3QjNGLCAweDdCNDAsIDB4N0I0MSwKLSAgICAweDdCNDIsIDB4N0I0MywgMHg3QjQ0LCAweDdCNDgsIDB4N0I0QSwgMHg3QjRELCAweDdCNEUsIDB4N0I1MywKLSAgICAweDdCNTUsIDB4N0I1NywgMHg3QjU5LCAweDdCNUMsIDB4N0I1RSwgMHg3QjVGLCAweDdCNjEsIDB4N0I2MywKLSAgICAweDdCNjQsIDB4N0I2NSwgMHg3QjY2LCAweDdCNjgsIDB4N0I2OSwgMHg3QjZBLCAweDdCNkIsIDB4N0I2QywKLSAgICAweDdCNkQsIDB4N0I2RiwgMHg3QjcwLCAweDdCNzMsIDB4N0I3NCwgMHg3Qjc2LCAweDdCNzgsIDB4N0I3QSwKLSAgICAweDdCN0MsIDB4N0I3RCwgMHg3QjdGLCAweDdCODEsIDB4N0I4MiwgMHg3QjgzLCAweDdCODQsIDB4N0I4NiwKLSAgICAweDdCODcsIDB4N0I4OCwgMHg3Qjg5LCAweDdCOEEsIDB4N0I4QywgMHg3QjhFLCAweDdCOEYsIDB4N0I5MSwKLSAgICAweDdCOTIsIDB4N0I5MywgMHg3Qjk2LCAweDdCOTgsIDB4N0I5OSwgMHg3QjlBLCAweDdCOUIsIDB4N0I5RSwKLSAgICAweDdCOUYsIDB4N0JBMCwgMHg3QkEzLCAweDdCQTQsIDB4N0JBNSwgMHg3QkFFLCAweDdCQUYsIDB4N0JCMCwKLSAgICAweDdCQjIsIDB4N0JCMywgMHg3QkI1LCAweDdCQjYsIDB4N0JCNywgMHg3QkI5LCAweDdCQkEsIDB4N0JCQiwKLSAgICAweDdCQkMsIDB4N0JCRCwgMHg3QkJFLCAweDdCQkYsIDB4N0JDMiwgMHg3QkMzLCAweDdCQzUsIDB4N0JDOCwKLSAgICAweDdCQ0EsIDB4N0JDRCwgMHg3QkNFLCAweDdCQ0YsIDB4N0JEMCwgMHg3QkQyLCAweDdCRDQsIDB4N0JENSwKLSAgICAweDdCRDYsIDB4N0JENywgMHg3QkQ4LCAweDdCREIsIDB4N0JEQywgMHg3QkRFLCAweDdCREYsIDB4N0JFMCwKLSAgICAweDdCRTIsIDB4N0JFMywgMHg3QkU3LCAweDdCRTgsIDB4N0JFQiwgMHg3QkVDLCAweDdCRUQsIDB4N0JFRiwKLSAgICAweDdCRjAsIDB4N0JGMiwgMHg3QkY0LCAweDdCRjUsIDB4N0JGNiwgMHg3QkY4LCAweDdCRjksIDB4N0JGQSwKLSAgICAweDdCRkIsIDB4N0JGRCwgMHg3QkZGLCAweDdDMDEsIDB4N0MwMiwgMHg3QzAzLCAweDdDMDQsIDB4N0MwNSwKLSAgICAweDdDMDYsIDB4N0MwOCwgMHg3QzA5LCAweDdDMEEsIDB4N0MwRSwgMHg3QzEwLCAweDdDMTEsIDB4N0MxMiwKLSAgICAweDdDMTMsIDB4N0MxNCwgMHg3QzE1LCAweDdDMTcsIDB4N0MxOCwgMHg3QzE5LCAweDdDMUEsIDB4N0MxQiwKLSAgICAweDdDMUMsIDB4N0MxRCwgMHg3QzIwLCAweDdDMjIsIDB4N0MyNCwgMHg3QzI1LCAweDdDMjgsIDB4N0MyOSwKLSAgICAweDdDMkMsIDB4N0MyRCwgMHg3QzJFLCAweDdDMkYsIDB4N0MzMCwgMHg3QzMxLCAweDdDMzIsIDB4N0MzMywKLSAgICAweDdDMzQsIDB4N0MzNSwgMHg3QzM2LCAweDdDMzcsIDB4N0MzOSwgMHg3QzNBLCAweDdDM0IsIDB4N0MzQywKLSAgICAweDdDNDIsIDB4N0M0NCwgMHg3QzQ1LCAweDdDNDYsIDB4N0M0NywgMHg3QzQ4LCAweDdDNDksIDB4N0M0QSwKLSAgICAweDdDNEIsIDB4N0M0RSwgMHg3QzRGLCAweDdDNTAsIDB4N0M1MSwgMHg3QzUyLCAweDdDNTMsIDB4N0M1NCwKLSAgICAweDdDNTUsIDB4N0M1NiwgMHg3QzU3LCAweDdDNTgsIDB4N0M1OSwgMHg3QzVBLCAweDdDNUIsIDB4N0M1RCwKLSAgICAweDdDNUUsIDB4N0M2MSwgMHg3QzYyLCAweDdDNjMsIDB4N0M2NSwgMHg3QzY2LCAweDdDNjcsIDB4N0M2OCwKLSAgICAweDdDNkIsIDB4N0M2RCwgMHg3QzZGLCAweDdDNzAsIDB4N0M3MSwgMHg3Qzc1LCAweDdDNzYsIDB4N0M3NywKLSAgICAweDdDNzgsIDB4N0M3OSwgMHg3QzdBLCAweDdDN0UsIDB4N0M3RiwgMHg3QzgwLCAweDdDODEsIDB4N0M4MiwKLSAgICAweDdDODMsIDB4N0M4NCwgMHg3Qzg1LCAweDdDODYsIDB4N0M4NywgMHg3Qzg4LCAweDdDOEEsIDB4N0M4QiwKLSAgICAweDdDOEMsIDB4N0M4RCwgMHg3QzhFLCAweDdDOEYsIDB4N0M5MCwgMHg3QzkzLCAweDdDOTQsIDB4N0M5NiwKLSAgICAweDdDOTksIDB4N0M5QSwgMHg3QzlCLCAweDdDQTAsIDB4N0NBMSwgMHg3Q0EzLCAweDdDQTYsIDB4N0NBNywKLSAgICAweDdDQTgsIDB4N0NBOSwgMHg3Q0FCLCAweDdDQUMsIDB4N0NBRCwgMHg3Q0FGLCAweDdDQjAsIDB4N0NCNCwKLSAgICAweDdDQjUsIDB4N0NCNiwgMHg3Q0I3LCAweDdDQjgsIDB4N0NCQSwgMHg3Q0JCLCAweDdDQkYsIDB4N0NDMCwKLSAgICAweDdDQzIsIDB4N0NDMywgMHg3Q0M0LCAweDdDQzYsIDB4N0NDOSwgMHg3Q0NCLCAweDdDQ0UsIDB4N0NDRiwKLSAgICAweDdDRDAsIDB4N0NEMSwgMHg3Q0QyLCAweDdDRDMsIDB4N0NENCwgMHg3Q0Q4LCAweDdDREEsIDB4N0NEQiwKLSAgICAweDdDRTEsIDB4N0NFMiwgMHg3Q0UzLCAweDdDRTQsIDB4N0NFNSwgMHg3Q0U2LCAweDdDRTksIDB4N0NFQSwKLSAgICAweDdDRUIsIDB4N0NFQywgMHg3Q0VELCAweDdDRUUsIDB4N0NGMSwgMHg3Q0YzLCAweDdDRjUsIDB4N0NGNywKLSAgICAweDdDRkEsIDB4N0NGQywgMHg3Q0ZELCAweDdDRkYsIDB4N0QwMSwgMHg3RDAzLCAweDdEMEMsIDB4N0QwRSwKLSAgICAweDdEMEYsIDB4N0QxMSwgMHg3RDEyLCAweDdEMTYsIDB4N0QxOCwgMHg3RDFELCAweDdEMUUsIDB4N0QxRiwKLSAgICAweDdEMjMsIDB4N0QyNCwgMHg3RDI1LCAweDdEMjYsIDB4N0QyOCwgMHg3RDI5LCAweDdEMkEsIDB4N0QyQywKLSAgICAweDdEMkQsIDB4N0QyRSwgMHg3RDM0LCAweDdEMzUsIDB4N0QzNiwgMHg3RDM3LCAweDdEMzgsIDB4N0QzQiwKLSAgICAweDdEM0QsIDB4N0QzRSwgMHg3RDQxLCAweDdENDMsIDB4N0Q0NSwgMHg3RDQ3LCAweDdENDgsIDB4N0Q0OSwKLSAgICAweDdENEEsIDB4N0Q0QiwgMHg3RDRDLCAweDdENEQsIDB4N0Q0RiwgMHg3RDUxLCAweDdENTIsIDB4N0Q1MywKLSAgICAweDdENTQsIDB4N0Q1NSwgMHg3RDU2LCAweDdENTcsIDB4N0Q1OCwgMHg3RDU5LCAweDdENUEsIDB4N0Q1QiwKLSAgICAweDdENUMsIDB4N0Q1RiwgMHg3RDYwLCAweDdENjMsIDB4N0Q2NCwgMHg3RDY1LCAweDdENjcsIDB4N0Q2OSwKLSAgICAweDdENkEsIDB4N0Q2QiwgMHg3RDZDLCAweDdENkQsIDB4N0Q2RiwgMHg3RDcwLCAweDdENzQsIDB4N0Q3NSwKLSAgICAweDdENzgsIDB4N0Q3QSwgMHg3RDdCLCAweDdEN0MsIDB4N0Q3RCwgMHg3RDdFLCAweDdEN0YsIDB4N0Q4MCwKLSAgICAweDdEODIsIDB4N0Q4NCwgMHg3RDg1LCAweDdEODcsIDB4N0Q4QSwgMHg3RDhCLCAweDdEOEMsIDB4N0Q4RCwKLSAgICAweDdEOEUsIDB4N0Q5MCwgMHg3RDkxLCAweDdEOTIsIDB4N0Q5NCwgMHg3RDk1LCAweDdEOTYsIDB4N0Q5NywKLSAgICAweDdEOTgsIDB4N0Q5OSwgMHg3RDlBLCAweDdEOUIsIDB4N0Q5RCwgMHg3RDlGLCAweDdEQTAsIDB4N0RBMSwKLSAgICAweDdEQTQsIDB4N0RBNSwgMHg3REE3LCAweDdEQTgsIDB4N0RBOSwgMHg3REFBLCAweDdEQUYsIDB4N0RCNSwKLSAgICAweDdEQjYsIDB4N0RCNywgMHg3REJDLCAweDdEQzAsIDB4N0RDMSwgMHg3REMyLCAweDdEQzMsIDB4N0RDNSwKLSAgICAweDdEQzYsIDB4N0RDOCwgMHg3REM5LCAweDdEQ0MsIDB4N0RDRCwgMHg3RENFLCAweDdEQ0YsIDB4N0REMCwKLSAgICAweDdERDMsIDB4N0RENSwgMHg3REQ2LCAweDdEREEsIDB4N0REQiwgMHg3RERDLCAweDdEREYsIDB4N0RFMiwKLSAgICAweDdERTQsIDB4N0RFNSwgMHg3REU3LCAweDdERUEsIDB4N0RFQiwgMHg3REVELCAweDdERUUsIDB4N0RGMCwKLSAgICAweDdERjMsIDB4N0RGNSwgMHg3REY3LCAweDdERjgsIDB4N0RGQSwgMHg3REZDLCAweDdERkQsIDB4N0RGRSwKLSAgICAweDdERkYsIDB4N0UwMCwgMHg3RTAxLCAweDdFMDIsIDB4N0UwMywgMHg3RTA0LCAweDdFMDUsIDB4N0UwNiwKLSAgICAweDdFMDcsIDB4N0UwQywgMHg3RTBELCAweDdFMEUsIDB4N0UwRiwgMHg3RTEyLCAweDdFMTMsIDB4N0UxNCwKLSAgICAweDdFMTUsIDB4N0UxNiwgMHg3RTE3LCAweDdFMTgsIDB4N0UxOSwgMHg3RTFBLCAweDdFMUMsIDB4N0UyMCwKLSAgICAweDdFMjEsIDB4N0UyMiwgMHg3RTI0LCAweDdFMjUsIDB4N0UyNiwgMHg3RTI4LCAweDdFMjksIDB4N0UyQSwKLSAgICAweDdFMkMsIDB4N0UyRiwgMHg3RTMwLCAweDdFMzMsIDB4N0UzOCwgMHg3RTNBLCAweDdFM0MsIDB4N0UzRiwKLSAgICAweDdFNDAsIDB4N0U0MiwgMHg3RTQzLCAweDdFNDQsIDB4N0U0OCwgMHg3RTQ5LCAweDdFNEEsIDB4N0U0QiwKLSAgICAweDdFNEMsIDB4N0U0RCwgMHg3RTRFLCAweDdFNEYsIDB4N0U1MCwgMHg3RTUxLCAweDdFNTMsIDB4N0U1NiwKLSAgICAweDdFNTcsIDB4N0U1OCwgMHg3RTU5LCAweDdFNUIsIDB4N0U1QywgMHg3RTVELCAweDdFNUYsIDB4N0U2MCwKLSAgICAweDdFNjEsIDB4N0U2MywgMHg3RTY0LCAweDdFNjUsIDB4N0U2NiwgMHg3RTY3LCAweDdFNjgsIDB4N0U2QywKLSAgICAweDdFNzEsIDB4N0U3MiwgMHg3RTc0LCAweDdFNzUsIDB4N0U3NiwgMHg3RTc3LCAweDdFNzgsIDB4N0U3QSwKLSAgICAweDdFN0IsIDB4N0U3RiwgMHg3RTgwLCAweDdFODEsIDB4N0U4MywgMHg3RTg0LCAweDdFODUsIDB4N0U4NiwKLSAgICAweDdFODcsIDB4N0U4OSwgMHg3RThCLCAweDdFOEUsIDB4N0U5MCwgMHg3RTkxLCAweDdFOTIsIDB4N0U5NSwKLSAgICAweDdFOTcsIDB4N0U5OSwgMHg3RTlBLCAweDdFOUQsIDB4N0U5RSwgMHg3RUFFLCAweDdFQjQsIDB4N0VCQiwKLSAgICAweDdFQkMsIDB4N0VENiwgMHg3RUU0LCAweDdFRUMsIDB4N0VGOSwgMHg3RjBBLCAweDdGMTAsIDB4N0YxRSwKLSAgICAweDdGMzcsIDB4N0YzOSwgMHg3RjNCLCAweDdGM0MsIDB4N0YzRCwgMHg3RjNFLCAweDdGM0YsIDB4N0Y0MCwKLSAgICAweDdGNDEsIDB4N0Y0MywgMHg3RjQ2LCAweDdGNDcsIDB4N0Y0OCwgMHg3RjQ5LCAweDdGNEEsIDB4N0Y0QiwKLSAgICAweDdGNEQsIDB4N0Y0RiwgMHg3RjUyLCAweDdGNTMsIDB4N0Y1NiwgMHg3RjU5LCAweDdGNUIsIDB4N0Y1QywKLSAgICAweDdGNUQsIDB4N0Y1RSwgMHg3RjYwLCAweDdGNjMsIDB4N0Y2NCwgMHg3RjY1LCAweDdGNjYsIDB4N0Y2NywKLSAgICAweDdGNkIsIDB4N0Y2QywgMHg3RjZELCAweDdGNkYsIDB4N0Y3MywgMHg3Rjc1LCAweDdGNzYsIDB4N0Y3OCwKLSAgICAweDdGN0EsIDB4N0Y3QiwgMHg3RjdDLCAweDdGN0QsIDB4N0Y3RiwgMHg3RjgwLCAweDdGODIsIDB4N0Y4MywKLSAgICAweDdGODQsIDB4N0Y4NywgMHg3Rjg5LCAweDdGOEIsIDB4N0Y4RCwgMHg3RjhGLCAweDdGOTAsIDB4N0Y5MSwKLSAgICAweDdGOTIsIDB4N0Y5MywgMHg3Rjk1LCAweDdGOTYsIDB4N0Y5NywgMHg3Rjk4LCAweDdGOTksIDB4N0Y5QiwKLSAgICAweDdGOUMsIDB4N0ZBMCwgMHg3RkEyLCAweDdGQTMsIDB4N0ZBNiwgMHg3RkE4LCAweDdGQUEsIDB4N0ZBQiwKLSAgICAweDdGQUMsIDB4N0ZBRCwgMHg3RkFFLCAweDdGQjEsIDB4N0ZCMywgMHg3RkI0LCAweDdGQjUsIDB4N0ZCNiwKLSAgICAweDdGQjcsIDB4N0ZCQSwgMHg3RkJCLCAweDdGQkUsIDB4N0ZDMCwgMHg3RkMyLCAweDdGQzMsIDB4N0ZDNCwKLSAgICAweDdGQzYsIDB4N0ZDNywgMHg3RkM4LCAweDdGQzksIDB4N0ZDQiwgMHg3RkNELCAweDdGQ0YsIDB4N0ZEMCwKLSAgICAweDdGRDEsIDB4N0ZEMywgMHg3RkQ2LCAweDdGRDcsIDB4N0ZEOSwgMHg3RkRBLCAweDdGREIsIDB4N0ZEQywKLSAgICAweDdGREQsIDB4N0ZERSwgMHg3RkUyLCAweDdGRTMsIDB4N0ZFNCwgMHg3RkU3LCAweDdGRTgsIDB4N0ZFQSwKLSAgICAweDdGRUIsIDB4N0ZFQywgMHg3RkVELCAweDdGRUYsIDB4N0ZGMiwgMHg3RkY0LCAweDdGRjUsIDB4N0ZGNiwKLSAgICAweDdGRjcsIDB4N0ZGOCwgMHg3RkZBLCAweDdGRkQsIDB4N0ZGRSwgMHg3RkZGLCAweDgwMDIsIDB4ODAwNywKLSAgICAweDgwMDgsIDB4ODAwOSwgMHg4MDBBLCAweDgwMEUsIDB4ODAwRiwgMHg4MDExLCAweDgwMTMsIDB4ODAxQSwKLSAgICAweDgwMUIsIDB4ODAxRCwgMHg4MDFFLCAweDgwMUYsIDB4ODAyMSwgMHg4MDIzLCAweDgwMjQsIDB4ODAyQiwKLSAgICAweDgwMkQsIDB4ODAyRiwgMHg4MDMwLCAweDgwMzIsIDB4ODAzNCwgMHg4MDM5LCAweDgwM0EsIDB4ODAzQywKLSAgICAweDgwM0UsIDB4ODA0MCwgMHg4MDQxLCAweDgwNDQsIDB4ODA0NSwgMHg4MDQ3LCAweDgwNDgsIDB4ODA0OSwKLSAgICAweDgwNEUsIDB4ODA0RiwgMHg4MDUwLCAweDgwNTEsIDB4ODA1MywgMHg4MDU1LCAweDgwNTcsIDB4ODA1OSwKLSAgICAweDgwNUIsIDB4ODA1QywgMHg4MDVELCAweDgwNUYsIDB4ODA2MCwgMHg4MDYxLCAweDgwNjIsIDB4ODA2MywKLSAgICAweDgwNjQsIDB4ODA2NSwgMHg4MDY2LCAweDgwNjcsIDB4ODA2OCwgMHg4MDZCLCAweDgwNkMsIDB4ODA2RCwKLSAgICAweDgwNkUsIDB4ODA3NCwgMHg4MDc4LCAweDgwN0EsIDB4ODA3QiwgMHg4MDdDLCAweDgwODEsIDB4ODA4MiwKLSAgICAweDgwODgsIDB4ODA4QSwgMHg4MDhELCAweDgwOEUsIDB4ODA4RiwgMHg4MDkwLCAweDgwOTEsIDB4ODA5MiwKLSAgICAweDgwOTQsIDB4ODA5NSwgMHg4MDk3LCAweDgwOTksIDB4ODA5RSwgMHg4MEEzLCAweDgwQTYsIDB4ODBBNywKLSAgICAweDgwQTgsIDB4ODBBQywgMHg4MEIwLCAweDgwQjMsIDB4ODBCNSwgMHg4MEI2LCAweDgwQjgsIDB4ODBCOSwKLSAgICAweDgwQkIsIDB4ODBDNSwgMHg4MEM3LCAweDgwQzgsIDB4ODBDOSwgMHg4MENBLCAweDgwQ0IsIDB4ODBDRiwKLSAgICAweDgwRDAsIDB4ODBEMSwgMHg4MEQyLCAweDgwRDMsIDB4ODBENCwgMHg4MEQ1LCAweDgwRDgsIDB4ODBERiwKLSAgICAweDgwRTAsIDB4ODBFMiwgMHg4MEUzLCAweDgwRTYsIDB4ODBFRSwgMHg4MEY1LCAweDgwRjcsIDB4ODBGOSwKLSAgICAweDgwRkIsIDB4ODBGRSwgMHg4MEZGLCAweDgxMDAsIDB4ODEwMSwgMHg4MTAzLCAweDgxMDQsIDB4ODEwNywKLSAgICAweDgxMDgsIDB4ODEwQiwgMHg4MTBDLCAweDgxMTUsIDB4ODExNywgMHg4MTE5LCAweDgxMUMsIDB4ODExRCwKLSAgICAweDgxMUYsIDB4ODEyMCwgMHg4MTIxLCAweDgxMjIsIDB4ODEyMywgMHg4MTI0LCAweDgxMjUsIDB4ODEyNiwKLSAgICAweDgxMjcsIDB4ODEyOCwgMHg4MTI5LCAweDgxMkEsIDB4ODEyQiwgMHg4MTJELCAweDgxMkUsIDB4ODEzMCwKLSAgICAweDgxMzMsIDB4ODEzNCwgMHg4MTM1LCAweDgxMzcsIDB4ODEzQSwgMHg4MTNCLCAweDgxM0MsIDB4ODEzRCwKLSAgICAweDgxM0YsIDB4ODE0MCwgMHg4MTQxLCAweDgxNDIsIDB4ODE0MywgMHg4MTQ0LCAweDgxNDUsIDB4ODE0NywKLSAgICAweDgxNDksIDB4ODE0RCwgMHg4MTRGLCAweDgxNTIsIDB4ODE1NywgMHg4MTU4LCAweDgxNUIsIDB4ODE1QywKLSAgICAweDgxNUQsIDB4ODE1RSwgMHg4MTVGLCAweDgxNjIsIDB4ODE2MywgMHg4MTY0LCAweDgxNjgsIDB4ODE2QSwKLSAgICAweDgxNkMsIDB4ODE2RiwgMHg4MTcyLCAweDgxNzMsIDB4ODE3NSwgMHg4MTc2LCAweDgxNzcsIDB4ODE4MSwKLSAgICAweDgxODMsIDB4ODE4NCwgMHg4MTg1LCAweDgxODYsIDB4ODE4NywgMHg4MTg5LCAweDgxOEIsIDB4ODE4QywKLSAgICAweDgxOEQsIDB4ODE4RSwgMHg4MTkwLCAweDgxOTIsIDB4ODE5MywgMHg4MTk0LCAweDgxOTUsIDB4ODE5NiwKLSAgICAweDgxOTcsIDB4ODE5OSwgMHg4MTlFLCAweDgxOUYsIDB4ODFBMSwgMHg4MUEyLCAweDgxQTQsIDB4ODFBNSwKLSAgICAweDgxQTcsIDB4ODFBQiwgMHg4MUFDLCAweDgxQUQsIDB4ODFBRSwgMHg4MUFGLCAweDgxQjAsIDB4ODFCMSwKLSAgICAweDgxQjIsIDB4ODFCNCwgMHg4MUI1LCAweDgxQjYsIDB4ODFCNywgMHg4MUI4LCAweDgxQjksIDB4ODFCQywKLSAgICAweDgxQzQsIDB4ODFDNSwgMHg4MUM3LCAweDgxQzgsIDB4ODFDQiwgMHg4MUNFLCAweDgxRDAsIDB4ODFEMSwKLSAgICAweDgxRDIsIDB4ODFEMywgMHg4MUQ0LCAweDgxRDUsIDB4ODFENiwgMHg4MUQ3LCAweDgxRDksIDB4ODFEQiwKLSAgICAweDgxREMsIDB4ODFERCwgMHg4MURFLCAweDgxRTEsIDB4ODFFMiwgMHg4MUU0LCAweDgxRTUsIDB4ODFFNiwKLSAgICAweDgxRTksIDB4ODFFQiwgMHg4MUVFLCAweDgxRUYsIDB4ODFGMCwgMHg4MUYxLCAweDgxRjIsIDB4ODFGNSwKLSAgICAweDgxRjYsIDB4ODFGNywgMHg4MUY4LCAweDgxRjksIDB4ODFGRCwgMHg4MUZGLCAweDgyMDMsIDB4ODIwQiwKLSAgICAweDgyMEUsIDB4ODIwRiwgMHg4MjExLCAweDgyMTMsIDB4ODIxNSwgMHg4MjE2LCAweDgyMTcsIDB4ODIxOCwKLSAgICAweDgyMTksIDB4ODIxQSwgMHg4MjFELCAweDgyMjAsIDB4ODIyNCwgMHg4MjI1LCAweDgyMjYsIDB4ODIyNywKLSAgICAweDgyMjksIDB4ODIyRSwgMHg4MjMyLCAweDgyM0EsIDB4ODIzQywgMHg4MjNELCAweDgyM0YsIDB4ODI0MCwKLSAgICAweDgyNDEsIDB4ODI0MiwgMHg4MjQzLCAweDgyNDUsIDB4ODI0NiwgMHg4MjQ4LCAweDgyNEEsIDB4ODI0QywKLSAgICAweDgyNEQsIDB4ODI0RSwgMHg4MjUwLCAweDgyNTEsIDB4ODI1MiwgMHg4MjUzLCAweDgyNTQsIDB4ODI1NSwKLSAgICAweDgyNTYsIDB4ODI1NywgMHg4MjVCLCAweDgyNUMsIDB4ODI1RCwgMHg4MjVFLCAweDgyNjAsIDB4ODI2MSwKLSAgICAweDgyNjIsIDB4ODI2MywgMHg4MjY1LCAweDgyNjcsIDB4ODI2OSwgMHg4MjZBLCAweDgyNkMsIDB4ODI2RCwKLSAgICAweDgyNzUsIDB4ODI3NiwgMHg4Mjc4LCAweDgyN0IsIDB4ODI3QywgMHg4MjgwLCAweDgyODEsIDB4ODI4MywKLSAgICAweDgyODUsIDB4ODI4NiwgMHg4Mjg3LCAweDgyODksIDB4ODI4QywgMHg4MjkwLCAweDgyOTMsIDB4ODI5NCwKLSAgICAweDgyOTUsIDB4ODI5NiwgMHg4MjlBLCAweDgyOUIsIDB4ODI5RSwgMHg4MkEwLCAweDgyQTIsIDB4ODJBMywKLSAgICAweDgyQTcsIDB4ODJCMiwgMHg4MkI1LCAweDgyQjYsIDB4ODJCQSwgMHg4MkJDLCAweDgyQkYsIDB4ODJDMCwKLSAgICAweDgyQzIsIDB4ODJDMywgMHg4MkM1LCAweDgyQzYsIDB4ODJDOSwgMHg4MkQwLCAweDgyRDYsIDB4ODJEOSwKLSAgICAweDgyREEsIDB4ODJERCwgMHg4MkUyLCAweDgyRTgsIDB4ODJFOSwgMHg4MkVBLCAweDgyRUMsIDB4ODJFRCwKLSAgICAweDgyRUUsIDB4ODJGMCwgMHg4MkYyLCAweDgyRjMsIDB4ODJGNSwgMHg4MkY2LCAweDgyRjgsIDB4ODJGQSwKLSAgICAweDgyRkMsIDB4ODJGRCwgMHg4MkZFLCAweDgyRkYsIDB4ODMwMCwgMHg4MzBBLCAweDgzMEIsIDB4ODMwRCwKLSAgICAweDgzMTAsIDB4ODMxMiwgMHg4MzEzLCAweDgzMTYsIDB4ODMxOCwgMHg4MzE5LCAweDgzMUQsIDB4ODMxRSwKLSAgICAweDgzMUYsIDB4ODMyMCwgMHg4MzIxLCAweDgzMjIsIDB4ODMyMywgMHg4MzI0LCAweDgzMjUsIDB4ODMyNiwKLSAgICAweDgzMjksIDB4ODMyQSwgMHg4MzJFLCAweDgzMzAsIDB4ODMzMiwgMHg4MzM3LCAweDgzM0IsIDB4ODMzRCwKLSAgICAweDgzM0UsIDB4ODMzRiwgMHg4MzQxLCAweDgzNDIsIDB4ODM0NCwgMHg4MzQ1LCAweDgzNDgsIDB4ODM0QSwKLSAgICAweDgzNEIsIDB4ODM0QywgMHg4MzRELCAweDgzNEUsIDB4ODM1MywgMHg4MzU1LCAweDgzNTYsIDB4ODM1NywKLSAgICAweDgzNTgsIDB4ODM1OSwgMHg4MzVELCAweDgzNjIsIDB4ODM3MCwgMHg4MzcxLCAweDgzNzIsIDB4ODM3MywKLSAgICAweDgzNzQsIDB4ODM3NSwgMHg4Mzc2LCAweDgzNzksIDB4ODM3QSwgMHg4MzdFLCAweDgzN0YsIDB4ODM4MCwKLSAgICAweDgzODEsIDB4ODM4MiwgMHg4MzgzLCAweDgzODQsIDB4ODM4NywgMHg4Mzg4LCAweDgzOEIsIDB4ODM4QywKLSAgICAweDgzOEQsIDB4ODM4RiwgMHg4MzkwLCAweDgzOTEsIDB4ODM5NCwgMHg4Mzk1LCAweDgzOTcsIDB4ODM5OSwKLSAgICAweDgzOUEsIDB4ODM5RCwgMHg4MzlGLCAweDgzQTEsIDB4ODNBMywgMHg4M0E0LCAweDgzQTUsIDB4ODNBNiwKLSAgICAweDgzQUMsIDB4ODNBRCwgMHg4M0FFLCAweDgzQUYsIDB4ODNCNSwgMHg4M0JCLCAweDgzQkUsIDB4ODNCRiwKLSAgICAweDgzQzIsIDB4ODNDMywgMHg4M0M0LCAweDgzQzYsIDB4ODNDOCwgMHg4M0M5LCAweDgzQ0IsIDB4ODNDRCwKLSAgICAweDgzQ0UsIDB4ODNEMCwgMHg4M0QxLCAweDgzRDIsIDB4ODNEMywgMHg4M0Q1LCAweDgzRDcsIDB4ODNEOSwKLSAgICAweDgzREEsIDB4ODNEQiwgMHg4M0RFLCAweDgzRTIsIDB4ODNFMywgMHg4M0U0LCAweDgzRTYsIDB4ODNFNywKLSAgICAweDgzRTgsIDB4ODNFQiwgMHg4M0VDLCAweDgzRUQsIDB4ODNFRSwgMHg4M0YzLCAweDgzRjQsIDB4ODNGNSwKLSAgICAweDgzRjYsIDB4ODNGNywgMHg4M0ZBLCAweDgzRkIsIDB4ODNGQywgMHg4M0ZFLCAweDgzRkYsIDB4ODQwMCwKLSAgICAweDg0MDIsIDB4ODQwNSwgMHg4NDA4LCAweDg0MDksIDB4ODQxMCwgMHg4NDEyLCAweDg0MTMsIDB4ODQxNCwKLSAgICAweDg0MTUsIDB4ODQxNiwgMHg4NDE3LCAweDg0MTksIDB4ODQxQSwgMHg4NDFCLCAweDg0MUUsIDB4ODQxRiwKLSAgICAweDg0MjAsIDB4ODQyMSwgMHg4NDIyLCAweDg0MjMsIDB4ODQyOSwgMHg4NDJBLCAweDg0MkIsIDB4ODQyRCwKLSAgICAweDg0MkUsIDB4ODQyRiwgMHg4NDMwLCAweDg0MzIsIDB4ODQzMywgMHg4NDM0LCAweDg0MzYsIDB4ODQzNywKLSAgICAweDg0MzksIDB4ODQzQSwgMHg4NDNCLCAweDg0M0UsIDB4ODQzRiwgMHg4NDQwLCAweDg0NDEsIDB4ODQ0MiwKLSAgICAweDg0NDMsIDB4ODQ0NCwgMHg4NDQ1LCAweDg0NDcsIDB4ODQ0OCwgMHg4NDRBLCAweDg0NEIsIDB4ODQ0QywKLSAgICAweDg0NEQsIDB4ODQ0RSwgMHg4NDRGLCAweDg0NTAsIDB4ODQ1MywgMHg4NDU0LCAweDg0NTUsIDB4ODQ1NiwKLSAgICAweDg0NTgsIDB4ODQ1RCwgMHg4NDVFLCAweDg0NUYsIDB4ODQ2MCwgMHg4NDYyLCAweDg0NjUsIDB4ODQ2NywKLSAgICAweDg0NjgsIDB4ODQ2QSwgMHg4NDZFLCAweDg0NzAsIDB4ODQ3MiwgMHg4NDc0LCAweDg0NzksIDB4ODQ3QiwKLSAgICAweDg0N0MsIDB4ODQ3RCwgMHg4NDdFLCAweDg0N0YsIDB4ODQ4MCwgMHg4NDgxLCAweDg0ODMsIDB4ODQ4NCwKLSAgICAweDg0ODUsIDB4ODQ4NiwgMHg4NDhBLCAweDg0OEQsIDB4ODQ4RiwgMHg4NDkwLCAweDg0OTEsIDB4ODQ5MiwKLSAgICAweDg0OTUsIDB4ODQ5NiwgMHg4NDk4LCAweDg0OUEsIDB4ODQ5QiwgMHg4NDlELCAweDg0OUUsIDB4ODQ5RiwKLSAgICAweDg0QTAsIDB4ODRBMiwgMHg4NEEzLCAweDg0QTQsIDB4ODRBNSwgMHg4NEE2LCAweDg0QTcsIDB4ODRBOCwKLSAgICAweDg0QTksIDB4ODRBQSwgMHg4NEFCLCAweDg0QUMsIDB4ODRBRCwgMHg4NEFFLCAweDg0QjAsIDB4ODRCMSwKLSAgICAweDg0QjMsIDB4ODRCNSwgMHg4NEI2LCAweDg0QjcsIDB4ODRCQiwgMHg4NEJFLCAweDg0QzIsIDB4ODRDMywKLSAgICAweDg0QzUsIDB4ODRDNiwgMHg4NEM3LCAweDg0QzgsIDB4ODRDQywgMHg4NENFLCAweDg0Q0YsIDB4ODREMiwKLSAgICAweDg0RDQsIDB4ODRENSwgMHg4NEQ3LCAweDg0RDgsIDB4ODREOSwgMHg4NERBLCAweDg0REIsIDB4ODREQywKLSAgICAweDg0REUsIDB4ODRFMSwgMHg4NEUyLCAweDg0RTQsIDB4ODRFNywgMHg4NEU4LCAweDg0RTksIDB4ODRFQSwKLSAgICAweDg0RUIsIDB4ODRFRCwgMHg4NEYxLCAweDg0RjIsIDB4ODRGMywgMHg4NEY0LCAweDg0RjUsIDB4ODRGNiwKLSAgICAweDg0RjcsIDB4ODRGOCwgMHg4NEY5LCAweDg0RkEsIDB4ODRGQiwgMHg4NEZFLCAweDg1MDAsIDB4ODUwMSwKLSAgICAweDg1MDIsIDB4ODUwMywgMHg4NTA0LCAweDg1MDUsIDB4ODUwNiwgMHg4NTA3LCAweDg1MDgsIDB4ODUwOSwKLSAgICAweDg1MEEsIDB4ODUwQiwgMHg4NTBELCAweDg1MEUsIDB4ODUwRiwgMHg4NTEwLCAweDg1MTIsIDB4ODUxNSwKLSAgICAweDg1MTYsIDB4ODUxOCwgMHg4NTE5LCAweDg1MUIsIDB4ODUxQywgMHg4NTFELCAweDg1MjAsIDB4ODUyMiwKLSAgICAweDg1MjQsIDB4ODUyNSwgMHg4NTI3LCAweDg1MjgsIDB4ODUyOSwgMHg4NTJBLCAweDg1MkUsIDB4ODUyRiwKLSAgICAweDg1MzAsIDB4ODUzMSwgMHg4NTMyLCAweDg1MzMsIDB4ODUzNCwgMHg4NTM1LCAweDg1MzYsIDB4ODUzRSwKLSAgICAweDg1M0YsIDB4ODU0MCwgMHg4NTQyLCAweDg1NDQsIDB4ODU0NSwgMHg4NTQ3LCAweDg1NEIsIDB4ODU0QywKLSAgICAweDg1NEQsIDB4ODU0RiwgMHg4NTUwLCAweDg1NTEsIDB4ODU1NCwgMHg4NTU3LCAweDg1NUEsIDB4ODU1QiwKLSAgICAweDg1NUMsIDB4ODU1RCwgMHg4NTVGLCAweDg1NjAsIDB4ODU2MSwgMHg4NTYzLCAweDg1NjUsIDB4ODU2NiwKLSAgICAweDg1NjcsIDB4ODU2QiwgMHg4NTZDLCAweDg1NkUsIDB4ODU2RiwgMHg4NTcwLCAweDg1NzEsIDB4ODU3MywKLSAgICAweDg1NzUsIDB4ODU3NiwgMHg4NTc4LCAweDg1N0MsIDB4ODU3RCwgMHg4NTdGLCAweDg1ODAsIDB4ODU4MSwKLSAgICAweDg1ODIsIDB4ODU4MywgMHg4NTg2LCAweDg1ODksIDB4ODU4QiwgMHg4NThELCAweDg1OEUsIDB4ODU5MCwKLSAgICAweDg1OTIsIDB4ODU5MywgMHg4NTk1LCAweDg1OTYsIDB4ODU5NywgMHg4NTk4LCAweDg1OTksIDB4ODU5QSwKLSAgICAweDg1OUQsIDB4ODU5RSwgMHg4NUEwLCAweDg1QTEsIDB4ODVBMiwgMHg4NUEzLCAweDg1QTUsIDB4ODVBNywKLSAgICAweDg1QUIsIDB4ODVBQywgMHg4NUFELCAweDg1QjEsIDB4ODVCMiwgMHg4NUIzLCAweDg1QjQsIDB4ODVCNSwKLSAgICAweDg1QjYsIDB4ODVCOCwgMHg4NUJCLCAweDg1QkMsIDB4ODVCRCwgMHg4NUJFLCAweDg1QkYsIDB4ODVDMCwKLSAgICAweDg1QzIsIDB4ODVDMywgMHg4NUM0LCAweDg1QzUsIDB4ODVDNiwgMHg4NUM3LCAweDg1QzgsIDB4ODVDQSwKLSAgICAweDg1Q0IsIDB4ODVDQywgMHg4NUQxLCAweDg1RDIsIDB4ODVENCwgMHg4NUQ2LCAweDg1RDcsIDB4ODVEOCwKLSAgICAweDg1RDksIDB4ODVEQSwgMHg4NURCLCAweDg1REUsIDB4ODVERiwgMHg4NUUwLCAweDg1RTEsIDB4ODVFMiwKLSAgICAweDg1RTMsIDB4ODVFNiwgMHg4NUU3LCAweDg1RTgsIDB4ODVFQiwgMHg4NUVDLCAweDg1RUQsIDB4ODVFRSwKLSAgICAweDg1RUYsIDB4ODVGMCwgMHg4NUYxLCAweDg1RjIsIDB4ODVGMywgMHg4NUY1LCAweDg1RjcsIDB4ODVGOCwKLSAgICAweDg1RkMsIDB4ODVGRCwgMHg4NUZFLCAweDg2MDAsIDB4ODYwMSwgMHg4NjAyLCAweDg2MDMsIDB4ODYwOCwKLSAgICAweDg2MDksIDB4ODYwQSwgMHg4NjBDLCAweDg2MEQsIDB4ODYwRSwgMHg4NjBGLCAweDg2MTAsIDB4ODYxMiwKLSAgICAweDg2MTMsIDB4ODYxNCwgMHg4NjE1LCAweDg2MTcsIDB4ODYxOCwgMHg4NjE5LCAweDg2MUIsIDB4ODYxQywKLSAgICAweDg2MUQsIDB4ODYxRiwgMHg4NjIwLCAweDg2MjEsIDB4ODYyMywgMHg4NjI0LCAweDg2MjUsIDB4ODYyNiwKLSAgICAweDg2MjgsIDB4ODYyQSwgMHg4NjJCLCAweDg2MkMsIDB4ODYyRSwgMHg4NjJGLCAweDg2MzAsIDB4ODYzMSwKLSAgICAweDg2MzIsIDB4ODYzMywgMHg4NjM0LCAweDg2MzUsIDB4ODYzNiwgMHg4NjM3LCAweDg2MzksIDB4ODYzQiwKLSAgICAweDg2M0QsIDB4ODYzRSwgMHg4NjQwLCAweDg2NDEsIDB4ODY0MiwgMHg4NjQzLCAweDg2NDQsIDB4ODY0NSwKLSAgICAweDg2NDYsIDB4ODY0NywgMHg4NjQ4LCAweDg2NDksIDB4ODY0QSwgMHg4NjRCLCAweDg2NEMsIDB4ODY1MiwKLSAgICAweDg2NTMsIDB4ODY1NiwgMHg4NjU3LCAweDg2NTgsIDB4ODY1OSwgMHg4NjVCLCAweDg2NUQsIDB4ODY2MCwKLSAgICAweDg2NjEsIDB4ODY2MywgMHg4NjY0LCAweDg2NjUsIDB4ODY2NiwgMHg4NjY4LCAweDg2NjksIDB4ODY2QSwKLSAgICAweDg2NkQsIDB4ODY2RiwgMHg4NjcwLCAweDg2NzIsIDB4ODY3MywgMHg4Njc0LCAweDg2NzUsIDB4ODY3NiwKLSAgICAweDg2NzcsIDB4ODY3OCwgMHg4NjgzLCAweDg2ODQsIDB4ODY4NSwgMHg4Njg2LCAweDg2ODcsIDB4ODY4OCwKLSAgICAweDg2ODksIDB4ODY4RSwgMHg4NjhGLCAweDg2OTAsIDB4ODY5MSwgMHg4NjkyLCAweDg2OTQsIDB4ODY5NiwKLSAgICAweDg2OTcsIDB4ODY5OCwgMHg4Njk5LCAweDg2OUEsIDB4ODY5QiwgMHg4NjlFLCAweDg2OUYsIDB4ODZBMCwKLSAgICAweDg2QTEsIDB4ODZBMiwgMHg4NkE1LCAweDg2QTYsIDB4ODZBQiwgMHg4NkFELCAweDg2QUUsIDB4ODZCMiwKLSAgICAweDg2QjMsIDB4ODZCNywgMHg4NkI4LCAweDg2QjksIDB4ODZCQiwgMHg4NkJDLCAweDg2QkQsIDB4ODZCRSwKLSAgICAweDg2QkYsIDB4ODZDMSwgMHg4NkMyLCAweDg2QzMsIDB4ODZDNSwgMHg4NkM4LCAweDg2Q0MsIDB4ODZDRCwKLSAgICAweDg2RDIsIDB4ODZEMywgMHg4NkQ1LCAweDg2RDYsIDB4ODZENywgMHg4NkRBLCAweDg2REMsIDB4ODZERCwKLSAgICAweDg2RTAsIDB4ODZFMSwgMHg4NkUyLCAweDg2RTMsIDB4ODZFNSwgMHg4NkU2LCAweDg2RTcsIDB4ODZFOCwKLSAgICAweDg2RUEsIDB4ODZFQiwgMHg4NkVDLCAweDg2RUYsIDB4ODZGNSwgMHg4NkY2LCAweDg2RjcsIDB4ODZGQiwKLSAgICAweDg2RkMsIDB4ODZGRCwgMHg4NkZGLCAweDg3MDEsIDB4ODcwNCwgMHg4NzA1LCAweDg3MEIsIDB4ODcwQywKLSAgICAweDg3MEUsIDB4ODcwRiwgMHg4NzEwLCAweDg3MTEsIDB4ODcxNCwgMHg4NzE2LCAweDg3MTksIDB4ODcxQiwKLSAgICAweDg3MUQsIDB4ODcxRiwgMHg4NzIwLCAweDg3MjQsIDB4ODcyNiwgMHg4NzI3LCAweDg3MjgsIDB4ODcyQSwKLSAgICAweDg3MkIsIDB4ODcyQywgMHg4NzJELCAweDg3MkYsIDB4ODczMCwgMHg4NzMyLCAweDg3MzMsIDB4ODczNSwKLSAgICAweDg3MzYsIDB4ODczOCwgMHg4NzM5LCAweDg3M0EsIDB4ODczQywgMHg4NzNELCAweDg3NDAsIDB4ODc0MSwKLSAgICAweDg3NDIsIDB4ODc0MywgMHg4NzQ0LCAweDg3NDUsIDB4ODc0NiwgMHg4NzRBLCAweDg3NEIsIDB4ODc0RCwKLSAgICAweDg3NEYsIDB4ODc1MCwgMHg4NzUxLCAweDg3NTIsIDB4ODc1NCwgMHg4NzU2LCAweDg3NTgsIDB4ODc1QSwKLSAgICAweDg3NUIsIDB4ODc1QywgMHg4NzVELCAweDg3NUUsIDB4ODc1RiwgMHg4NzYxLCAweDg3NjIsIDB4ODc2NywKLSAgICAweDg3NjgsIDB4ODc2OSwgMHg4NzZBLCAweDg3NkIsIDB4ODc2QywgMHg4NzZELCAweDg3NkYsIDB4ODc3MSwKLSAgICAweDg3NzIsIDB4ODc3MywgMHg4Nzc1LCAweDg3NzcsIDB4ODc3OSwgMHg4NzdBLCAweDg3N0YsIDB4ODc4MCwKLSAgICAweDg3ODEsIDB4ODc4NiwgMHg4Nzg3LCAweDg3ODksIDB4ODc4QSwgMHg4NzhDLCAweDg3OEUsIDB4ODc4RiwKLSAgICAweDg3OTAsIDB4ODc5MSwgMHg4NzkyLCAweDg3OTQsIDB4ODc5NSwgMHg4Nzk2LCAweDg3OTgsIDB4ODc5OSwKLSAgICAweDg3OUEsIDB4ODc5QiwgMHg4NzlDLCAweDg3OUQsIDB4ODdBMCwgMHg4N0ExLCAweDg3QTMsIDB4ODdBNCwKLSAgICAweDg3QTUsIDB4ODdBNiwgMHg4N0E3LCAweDg3QTksIDB4ODdBQSwgMHg4N0FFLCAweDg3QjAsIDB4ODdCMSwKLSAgICAweDg3QjIsIDB4ODdCNCwgMHg4N0I2LCAweDg3QjcsIDB4ODdCOCwgMHg4N0I5LCAweDg3QkMsIDB4ODdCRSwKLSAgICAweDg3QkYsIDB4ODdDMSwgMHg4N0MyLCAweDg3QzMsIDB4ODdDNSwgMHg4N0M3LCAweDg3QzksIDB4ODdDQywKLSAgICAweDg3Q0QsIDB4ODdDRiwgMHg4N0QwLCAweDg3RDQsIDB4ODdENSwgMHg4N0Q2LCAweDg3RDcsIDB4ODdEOCwKLSAgICAweDg3RDksIDB4ODdEQSwgMHg4N0RDLCAweDg3REQsIDB4ODdERSwgMHg4N0RGLCAweDg3RTEsIDB4ODdFMiwKLSAgICAweDg3RTQsIDB4ODdFNiwgMHg4N0U3LCAweDg3RTgsIDB4ODdFOSwgMHg4N0VCLCAweDg3RUQsIDB4ODdGMCwKLSAgICAweDg3RjEsIDB4ODdGMywgMHg4N0Y0LCAweDg3RjUsIDB4ODdGNywgMHg4N0Y4LCAweDg3RkEsIDB4ODdGQywKLSAgICAweDg3RkQsIDB4ODdGRiwgMHg4ODAwLCAweDg4MDEsIDB4ODgwMiwgMHg4ODA0LCAweDg4MDcsIDB4ODgwOCwKLSAgICAweDg4MDksIDB4ODgwQiwgMHg4ODBDLCAweDg4MEQsIDB4ODgwRSwgMHg4ODBGLCAweDg4MTIsIDB4ODgxNCwKLSAgICAweDg4MTcsIDB4ODgxOCwgMHg4ODE5LCAweDg4MUEsIDB4ODgxQywgMHg4ODFELCAweDg4MUUsIDB4ODgyMCwKLSAgICAweDg4MjQsIDB4ODgyNSwgMHg4ODI2LCAweDg4MjcsIDB4ODgyOCwgMHg4ODI5LCAweDg4MkEsIDB4ODgyQiwKLSAgICAweDg4MkMsIDB4ODgyRCwgMHg4ODJFLCAweDg4MkYsIDB4ODgzMCwgMHg4ODMzLCAweDg4MzQsIDB4ODgzNSwKLSAgICAweDg4MzcsIDB4ODgzOCwgMHg4ODNBLCAweDg4M0QsIDB4ODgzRSwgMHg4ODNGLCAweDg4NDEsIDB4ODg0MiwKLSAgICAweDg4NDMsIDB4ODg0NywgMHg4ODQ4LCAweDg4NDksIDB4ODg0QiwgMHg4ODRFLCAweDg4NEYsIDB4ODg1MCwKLSAgICAweDg4NTEsIDB4ODg1MiwgMHg4ODU1LCAweDg4NTYsIDB4ODg1OCwgMHg4ODVBLCAweDg4NUMsIDB4ODg1RSwKLSAgICAweDg4NUYsIDB4ODg2MCwgMHg4ODY2LCAweDg4NjcsIDB4ODg2QSwgMHg4ODZELCAweDg4NkYsIDB4ODg3MSwKLSAgICAweDg4NzMsIDB4ODg3NCwgMHg4ODc1LCAweDg4NzYsIDB4ODg3OCwgMHg4ODdBLCAweDg4N0IsIDB4ODg3QywKLSAgICAweDg4ODAsIDB4ODg4MywgMHg4ODg2LCAweDg4ODcsIDB4ODg4OSwgMHg4ODhBLCAweDg4OEMsIDB4ODg4RSwKLSAgICAweDg4OEYsIDB4ODg5MCwgMHg4ODkxLCAweDg4OTMsIDB4ODg5NCwgMHg4ODk1LCAweDg4OTcsIDB4ODg5OCwKLSAgICAweDg4OTksIDB4ODg5QSwgMHg4ODlCLCAweDg4OUQsIDB4ODg5RSwgMHg4ODlGLCAweDg4QTAsIDB4ODhBMSwKLSAgICAweDg4QTMsIDB4ODhBNSwgMHg4OEE2LCAweDg4QTcsIDB4ODhBOCwgMHg4OEE5LCAweDg4QUEsIDB4ODhBQywKLSAgICAweDg4QUUsIDB4ODhBRiwgMHg4OEIwLCAweDg4QjIsIDB4ODhCMywgMHg4OEI0LCAweDg4QjUsIDB4ODhCNiwKLSAgICAweDg4QjgsIDB4ODhCOSwgMHg4OEJBLCAweDg4QkIsIDB4ODhCRCwgMHg4OEJFLCAweDg4QkYsIDB4ODhDMCwKLSAgICAweDg4QzMsIDB4ODhDNCwgMHg4OEM3LCAweDg4QzgsIDB4ODhDQiwgMHg4OENDLCAweDg4Q0QsIDB4ODhEMCwKLSAgICAweDg4RDEsIDB4ODhEMywgMHg4OEQ2LCAweDg4RDcsIDB4ODhEQSwgMHg4OERCLCAweDg4REUsIDB4ODhFMCwKLSAgICAweDg4RTEsIDB4ODhFNiwgMHg4OEU3LCAweDg4RTksIDB4ODhFQSwgMHg4OEVCLCAweDg4RUMsIDB4ODhFRCwKLSAgICAweDg4RUUsIDB4ODhFRiwgMHg4OEYyLCAweDg4RjUsIDB4ODhGNiwgMHg4OEY3LCAweDg4RkEsIDB4ODhGQiwKLSAgICAweDg4RkYsIDB4ODkwMCwgMHg4OTAxLCAweDg5MDMsIDB4ODkwNCwgMHg4OTA1LCAweDg5MDYsIDB4ODkwOCwKLSAgICAweDg5MDksIDB4ODkwQiwgMHg4OTBDLCAweDg5MEQsIDB4ODkwRSwgMHg4OTBGLCAweDg5MTEsIDB4ODkxNCwKLSAgICAweDg5MTUsIDB4ODkxNiwgMHg4OTE3LCAweDg5MTgsIDB4ODkxQywgMHg4OTFELCAweDg5MUUsIDB4ODkxRiwKLSAgICAweDg5MjAsIDB4ODkyMiwgMHg4OTIzLCAweDg5MjQsIDB4ODkyNiwgMHg4OTI3LCAweDg5MjgsIDB4ODkyOSwKLSAgICAweDg5MkMsIDB4ODkyRCwgMHg4OTJFLCAweDg5MkYsIDB4ODkzMSwgMHg4OTM1LCAweDg5MzcsIDB4ODkzOSwKLSAgICAweDg5M0EsIDB4ODkzQywgMHg4OTNELCAweDg5M0UsIDB4ODkzRiwgMHg4OTQwLCAweDg5NDIsIDB4ODk0MywKLSAgICAweDg5NDUsIDB4ODk0NiwgMHg4OTQ4LCAweDg5NDksIDB4ODk0QSwgMHg4OTRCLCAweDg5NEMsIDB4ODk0RCwKLSAgICAweDg5NEUsIDB4ODk0RiwgMHg4OTUwLCAweDg5NTEsIDB4ODk1MiwgMHg4OTUzLCAweDg5NTQsIDB4ODk1NSwKLSAgICAweDg5NTcsIDB4ODk1OCwgMHg4OTU5LCAweDg5NUEsIDB4ODk1QiwgMHg4OTVDLCAweDg5NjEsIDB4ODk2MiwKLSAgICAweDg5NjMsIDB4ODk2NSwgMHg4OTY3LCAweDg5NjgsIDB4ODk2OSwgMHg4OTZCLCAweDg5NkQsIDB4ODk2RSwKLSAgICAweDg5NzAsIDB4ODk3MSwgMHg4OTczLCAweDg5NzQsIDB4ODk3NSwgMHg4OTc2LCAweDg5NzcsIDB4ODk3OCwKLSAgICAweDg5NzksIDB4ODk3QSwgMHg4OTdDLCAweDg5N0QsIDB4ODk3RSwgMHg4OTgwLCAweDg5ODIsIDB4ODk4NCwKLSAgICAweDg5ODUsIDB4ODk4NywgMHg4OTg4LCAweDg5ODksIDB4ODk4QSwgMHg4OThDLCAweDg5OEQsIDB4ODk4RSwKLSAgICAweDg5OTAsIDB4ODk5MSwgMHg4OTkyLCAweDg5OTQsIDB4ODk5NSwgMHg4OTk3LCAweDg5OTksIDB4ODk5QSwKLSAgICAweDg5OUIsIDB4ODk5QywgMHg4OTlELCAweDg5OUUsIDB4ODk5RiwgMHg4OUEwLCAweDg5QTIsIDB4ODlBMywKLSAgICAweDg5QTQsIDB4ODlBNSwgMHg4OUE3LCAweDg5QTgsIDB4ODlBOSwgMHg4OUFCLCAweDg5QUQsIDB4ODlBRSwKLSAgICAweDg5QjAsIDB4ODlCMSwgMHg4OUIzLCAweDg5QjQsIDB4ODlCNSwgMHg4OUI2LCAweDg5QjgsIDB4ODlCOSwKLSAgICAweDg5QkIsIDB4ODlCQywgMHg4OUJFLCAweDg5QzMsIDB4ODlDRCwgMHg4OUQzLCAweDg5RDQsIDB4ODlENSwKLSAgICAweDg5RDcsIDB4ODlEOCwgMHg4OUQ5LCAweDg5REIsIDB4ODlERCwgMHg4OURGLCAweDg5RTAsIDB4ODlFMSwKLSAgICAweDg5RTIsIDB4ODlFNCwgMHg4OUU3LCAweDg5RTgsIDB4ODlFOSwgMHg4OUVBLCAweDg5RUMsIDB4ODlFRCwKLSAgICAweDg5RUUsIDB4ODlGMCwgMHg4OUYxLCAweDg5RjIsIDB4ODlGNSwgMHg4OUY3LCAweDg5RjksIDB4ODlGQSwKLSAgICAweDg5RkIsIDB4ODlGQywgMHg4OUZELCAweDg5RkUsIDB4ODlGRiwgMHg4QTA0LCAweDhBMDUsIDB4OEEwNiwKLSAgICAweDhBMDksIDB4OEEwQiwgMHg4QTBELCAweDhBMEYsIDB4OEExMSwgMHg4QTEyLCAweDhBMTQsIDB4OEExNywKLSAgICAweDhBMTksIDB4OEExQSwgMHg4QTFDLCAweDhBMUUsIDB4OEEyMCwgMHg4QTIxLCAweDhBMjIsIDB4OEEyNCwKLSAgICAweDhBMjYsIDB4OEEyNywgMHg4QTI4LCAweDhBMjksIDB4OEEyQiwgMHg4QTJDLCAweDhBMkUsIDB4OEEyRiwKLSAgICAweDhBMzAsIDB4OEEzMiwgMHg4QTMzLCAweDhBMzUsIDB4OEEzNywgMHg4QTM4LCAweDhBMzksIDB4OEEzQiwKLSAgICAweDhBM0MsIDB4OEEzRCwgMHg4QTNGLCAweDhBNDAsIDB4OEE0MiwgMHg4QTQzLCAweDhBNDQsIDB4OEE0NSwKLSAgICAweDhBNDcsIDB4OEE0OSwgMHg4QTRBLCAweDhBNEIsIDB4OEE0QywgMHg4QTRELCAweDhBNEYsIDB4OEE1MSwKLSAgICAweDhBNTMsIDB4OEE1NiwgMHg4QTU3LCAweDhBNTksIDB4OEE1QSwgMHg4QTVDLCAweDhBNUQsIDB4OEE1RiwKLSAgICAweDhBNjAsIDB4OEE2NCwgMHg4QTY1LCAweDhBNjcsIDB4OEE2OCwgMHg4QTZBLCAweDhBNkYsIDB4OEE3NCwKLSAgICAweDhBNzYsIDB4OEE3NywgMHg4QTc4LCAweDhBN0EsIDB4OEE3QiwgMHg4QTdELCAweDhBN0UsIDB4OEE4MCwKLSAgICAweDhBODEsIDB4OEE4MiwgMHg4QTgzLCAweDhBODgsIDB4OEE4QiwgMHg4QThDLCAweDhBOEUsIDB4OEE4RiwKLSAgICAweDhBOTAsIDB4OEE5NCwgMHg4QTk2LCAweDhBOTcsIDB4OEE5OSwgMHg4QTlCLCAweDhBOUMsIDB4OEE5RCwKLSAgICAweDhBOUYsIDB4OEFBMiwgMHg4QUE3LCAweDhBQTksIDB4OEFBQSwgMHg4QUFCLCAweDhBQUQsIDB4OEFBRSwKLSAgICAweDhBQUYsIDB4OEFCMSwgMHg4QUIzLCAweDhBQjQsIDB4OEFCNSwgMHg4QUI3LCAweDhBQjgsIDB4OEFCQSwKLSAgICAweDhBQkIsIDB4OEFCRCwgMHg4QUJFLCAweDhBQzAsIDB4OEFDMSwgMHg4QUMzLCAweDhBQzUsIDB4OEFDNiwKLSAgICAweDhBQzgsIDB4OEFDQSwgMHg4QUNDLCAweDhBQ0UsIDB4OEFEMCwgMHg4QUQzLCAweDhBRDQsIDB4OEFENSwKLSAgICAweDhBRDgsIDB4OEFEOSwgMHg4QURBLCAweDhBREQsIDB4OEFERiwgMHg4QUUwLCAweDhBRTEsIDB4OEFFMywKLSAgICAweDhBRTUsIDB4OEFFOCwgMHg4QUU5LCAweDhBRUEsIDB4OEFFQywgMHg4QUVGLCAweDhBRjAsIDB4OEFGMiwKLSAgICAweDhBRjQsIDB4OEFGNSwgMHg4QUY5LCAweDhBRkIsIDB4OEFGRCwgMHg4QUZGLCAweDhCMDMsIDB4OEIwNiwKLSAgICAweDhCMDgsIDB4OEIwOSwgMHg4QjBCLCAweDhCMEMsIDB4OEIwRCwgMHg4QjBGLCAweDhCMTEsIDB4OEIxMiwKLSAgICAweDhCMTMsIDB4OEIxNSwgMHg4QjE4LCAweDhCMUMsIDB4OEIxRSwgMHg4QjFGLCAweDhCMjAsIDB4OEIyMiwKLSAgICAweDhCMjMsIDB4OEIyNCwgMHg4QjI1LCAweDhCMjcsIDB4OEIyOSwgMHg4QjJBLCAweDhCMkUsIDB4OEIyRiwKLSAgICAweDhCMzAsIDB4OEIzMSwgMHg4QjMyLCAweDhCMzQsIDB4OEIzNSwgMHg4QjM2LCAweDhCMzcsIDB4OEIzOCwKLSAgICAweDhCM0EsIDB4OEIzQiwgMHg4QjNDLCAweDhCM0QsIDB4OEIzRiwgMHg4QjQwLCAweDhCNDEsIDB4OEI0MiwKLSAgICAweDhCNDMsIDB4OEI0NCwgMHg4QjQ1LCAweDhCNDYsIDB4OEI0NywgMHg4QjQ4LCAweDhCNEEsIDB4OEI0QiwKLSAgICAweDhCNEMsIDB4OEI0RCwgMHg4QjUwLCAweDhCNTEsIDB4OEI1MiwgMHg4QjUzLCAweDhCNTQsIDB4OEI1NSwKLSAgICAweDhCNTcsIDB4OEI1QiwgMHg4QjVELCAweDhCNUUsIDB4OEI1RiwgMHg4QjYwLCAweDhCNjEsIDB4OEI2MiwKLSAgICAweDhCNjMsIDB4OEI2NCwgMHg4QjY1LCAweDhCNjcsIDB4OEI2OCwgMHg4QjY5LCAweDhCNkEsIDB4OEI2RCwKLSAgICAweDhCNkUsIDB4OEI3MSwgMHg4QjcyLCAweDhCNzMsIDB4OEI3NSwgMHg4Qjc2LCAweDhCNzgsIDB4OEI3OSwKLSAgICAweDhCN0EsIDB4OEI3QiwgMHg4QjdDLCAweDhCN0UsIDB4OEI3RiwgMHg4QjgxLCAweDhCODIsIDB4OEI4MywKLSAgICAweDhCODQsIDB4OEI4NSwgMHg4Qjg2LCAweDhCODcsIDB4OEI4OCwgMHg4Qjg5LCAweDhCOEIsIDB4OEI4QywKLSAgICAweDhCOEQsIDB4OEI4RiwgMHg4QjkwLCAweDhCOTEsIDB4OEI5NCwgMHg4Qjk3LCAweDhCOTgsIDB4OEI5OSwKLSAgICAweDhCOUEsIDB4OEI5QiwgMHg4QjlELCAweDhCOUYsIDB4OEJBQywgMHg4QkIxLCAweDhCQkIsIDB4OEJDNywKLSAgICAweDhCRDAsIDB4OEJFQSwgMHg4QzA5LCAweDhDMUUsIDB4OEMzOCwgMHg4QzM5LCAweDhDM0EsIDB4OEMzQiwKLSAgICAweDhDM0MsIDB4OEMzRCwgMHg4QzNFLCAweDhDM0YsIDB4OEM0MCwgMHg4QzQyLCAweDhDNDMsIDB4OEM0NCwKLSAgICAweDhDNDUsIDB4OEM0QSwgMHg4QzRCLCAweDhDNEQsIDB4OEM0RSwgMHg4QzRGLCAweDhDNTEsIDB4OEM1MiwKLSAgICAweDhDNTMsIDB4OEM1NCwgMHg4QzU2LCAweDhDNTcsIDB4OEM1OCwgMHg4QzU5LCAweDhDNUIsIDB4OEM1QywKLSAgICAweDhDNUQsIDB4OEM1RSwgMHg4QzVGLCAweDhDNjAsIDB4OEM2MywgMHg4QzY0LCAweDhDNjUsIDB4OEM2NiwKLSAgICAweDhDNjcsIDB4OEM2OCwgMHg4QzY5LCAweDhDNkMsIDB4OEM2RCwgMHg4QzZFLCAweDhDNkYsIDB4OEM3MCwKLSAgICAweDhDNzEsIDB4OEM3MiwgMHg4Qzc0LCAweDhDNzUsIDB4OEM3NiwgMHg4Qzc3LCAweDhDN0IsIDB4OEM3QywKLSAgICAweDhDN0QsIDB4OEM3RSwgMHg4QzdGLCAweDhDODAsIDB4OEM4MSwgMHg4QzgzLCAweDhDODQsIDB4OEM4NiwKLSAgICAweDhDODcsIDB4OEM4OCwgMHg4QzhCLCAweDhDOEQsIDB4OEM4RSwgMHg4QzhGLCAweDhDOTAsIDB4OEM5MSwKLSAgICAweDhDOTIsIDB4OEM5MywgMHg4Qzk1LCAweDhDOTYsIDB4OEM5NywgMHg4Qzk5LCAweDhDOUEsIDB4OEM5QiwKLSAgICAweDhDOUMsIDB4OEM5RiwgMHg4Q0EzLCAweDhDQTQsIDB4OENBNSwgMHg4Q0E2LCAweDhDQUQsIDB4OENBRSwKLSAgICAweDhDQjEsIDB4OENCNSwgMHg4Q0I5LCAweDhDQkUsIDB4OENDNiwgMHg4Q0M5LCAweDhDQ0IsIDB4OENDQywKLSAgICAweDhDQ0QsIDB4OENDRSwgMHg4Q0NGLCAweDhDRDAsIDB4OENENCwgMHg4Q0Q2LCAweDhDRDcsIDB4OENEOCwKLSAgICAweDhDRDksIDB4OENEQiwgMHg4Q0RELCAweDhDREYsIDB4OENFNSwgMHg4Q0U4LCAweDhDRTksIDB4OENFRSwKLSAgICAweDhDRUYsIDB4OENGMCwgMHg4Q0YxLCAweDhDRjIsIDB4OENGMywgMHg4Q0Y1LCAweDhDRjYsIDB4OENGNywKLSAgICAweDhDRjgsIDB4OENGOSwgMHg4Q0ZGLCAweDhEMDAsIDB4OEQwMSwgMHg4RDAyLCAweDhEMDMsIDB4OEQwNiwKLSAgICAweDhEMDcsIDB4OEQwOSwgMHg4RDBDLCAweDhEMEUsIDB4OEQxMSwgMHg4RDEyLCAweDhEMTMsIDB4OEQxNCwKLSAgICAweDhEMTUsIDB4OEQxNywgMHg4RDE4LCAweDhEMTksIDB4OEQxQSwgMHg4RDIwLCAweDhENTEsIDB4OEQ1MiwKLSAgICAweDhENTcsIDB4OEQ1RiwgMHg4RDY1LCAweDhENjgsIDB4OEQ2OSwgMHg4RDZBLCAweDhENkMsIDB4OEQ2RSwKLSAgICAweDhENkYsIDB4OEQ3MSwgMHg4RDcyLCAweDhENzgsIDB4OEQ3OSwgMHg4RDdBLCAweDhEN0IsIDB4OEQ3QywKLSAgICAweDhEN0QsIDB4OEQ3RSwgMHg4RDdGLCAweDhEODAsIDB4OEQ4MiwgMHg4RDgzLCAweDhEODYsIDB4OEQ4NywKLSAgICAweDhEODgsIDB4OEQ4OSwgMHg4RDhDLCAweDhEOEQsIDB4OEQ4RSwgMHg4RDhGLCAweDhEOTAsIDB4OEQ5MiwKLSAgICAweDhEOTMsIDB4OEQ5NiwgMHg4RDk3LCAweDhEOTgsIDB4OEQ5QSwgMHg4RDlCLCAweDhEOUMsIDB4OEQ5RCwKLSAgICAweDhEOUUsIDB4OERBMCwgMHg4REExLCAweDhEQTIsIDB4OERBNCwgMHg4REE1LCAweDhEQTYsIDB4OERBNywKLSAgICAweDhEQTksIDB4OERBQSwgMHg4REFCLCAweDhEQUMsIDB4OERBRCwgMHg4REFFLCAweDhEQUYsIDB4OERCMCwKLSAgICAweDhEQjYsIDB4OERCNywgMHg4REI5LCAweDhEQkIsIDB4OERCRCwgMHg4REMwLCAweDhEQzEsIDB4OERDMiwKLSAgICAweDhEQzUsIDB4OERDNywgMHg4REM4LCAweDhEQzksIDB4OERDQSwgMHg4RENELCAweDhERDAsIDB4OEREMiwKLSAgICAweDhERDMsIDB4OERENCwgMHg4REQ1LCAweDhERDgsIDB4OEREOSwgMHg4RERDLCAweDhERTAsIDB4OERFMSwKLSAgICAweDhERTIsIDB4OERFNSwgMHg4REU2LCAweDhERTcsIDB4OERFOSwgMHg4REVELCAweDhERUUsIDB4OERGMCwKLSAgICAweDhERjEsIDB4OERGMiwgMHg4REY0LCAweDhERjYsIDB4OERGQywgMHg4REZFLCAweDhERkYsIDB4OEUwMCwKLSAgICAweDhFMDEsIDB4OEUwMiwgMHg4RTAzLCAweDhFMDQsIDB4OEUwNiwgMHg4RTA3LCAweDhFMDgsIDB4OEUwQiwKLSAgICAweDhFMEQsIDB4OEUwRSwgMHg4RTExLCAweDhFMTIsIDB4OEUxMywgMHg4RTE1LCAweDhFMTYsIDB4OEUxNywKLSAgICAweDhFMTgsIDB4OEUxOSwgMHg4RTFBLCAweDhFMUIsIDB4OEUxQywgMHg4RTIwLCAweDhFMjEsIDB4OEUyNCwKLSAgICAweDhFMjUsIDB4OEUyNiwgMHg4RTI3LCAweDhFMjgsIDB4OEUyQiwgMHg4RTJELCAweDhFMzAsIDB4OEUzMiwKLSAgICAweDhFMzMsIDB4OEUzNiwgMHg4RTM3LCAweDhFMzgsIDB4OEUzQiwgMHg4RTNDLCAweDhFM0UsIDB4OEUzRiwKLSAgICAweDhFNDMsIDB4OEU0NSwgMHg4RTQ2LCAweDhFNEQsIDB4OEU0RSwgMHg4RTRGLCAweDhFNTAsIDB4OEU1MywKLSAgICAweDhFNTQsIDB4OEU1NiwgMHg4RTU3LCAweDhFNTgsIDB4OEU1QSwgMHg4RTVCLCAweDhFNUMsIDB4OEU1RCwKLSAgICAweDhFNUUsIDB4OEU1RiwgMHg4RTYwLCAweDhFNjEsIDB4OEU2MiwgMHg4RTY0LCAweDhFNjUsIDB4OEU2NywKLSAgICAweDhFNjgsIDB4OEU2QSwgMHg4RTZCLCAweDhFNkUsIDB4OEU3MSwgMHg4RTczLCAweDhFNzUsIDB4OEU3NywKLSAgICAweDhFNzgsIDB4OEU3OSwgMHg4RTdCLCAweDhFN0QsIDB4OEU3RSwgMHg4RTgwLCAweDhFODIsIDB4OEU4MywKLSAgICAweDhFODQsIDB4OEU4NiwgMHg4RTg4LCAweDhFOEMsIDB4OEU4RSwgMHg4RTk1LCAweDhFOTYsIDB4OEU5NywKLSAgICAweDhFOTgsIDB4OEU5OSwgMHg4RTlCLCAweDhFOUQsIDB4OEU5RiwgMHg4RUEwLCAweDhFQTIsIDB4OEVBMywKLSAgICAweDhFQTQsIDB4OEVBNywgMHg4RUE4LCAweDhFQTksIDB4OEVBRCwgMHg4RUFFLCAweDhFQjAsIDB4OEVCMSwKLSAgICAweDhFQjMsIDB4OEVCNCwgMHg4RUI1LCAweDhFQjYsIDB4OEVCNywgMHg4RUI4LCAweDhFQjksIDB4OEVCQiwKLSAgICAweDhFQkMsIDB4OEVCRCwgMHg4RUJFLCAweDhFQkYsIDB4OEVDMSwgMHg4RUMyLCAweDhFQzMsIDB4OEVDNCwKLSAgICAweDhFQzUsIDB4OEVDNiwgMHg4RUM3LCAweDhFQzgsIDB4OEVDOSwgMHg4RUNGLCAweDhFRDAsIDB4OEVEMSwKLSAgICAweDhFRDMsIDB4OEVENSwgMHg4RUQ2LCAweDhFRDcsIDB4OEVEOCwgMHg4RUQ5LCAweDhFREEsIDB4OEVEQywKLSAgICAweDhFREQsIDB4OEVERSwgMHg4RUUwLCAweDhFRTEsIDB4OEVFMiwgMHg4RUUzLCAweDhFRTUsIDB4OEVFNiwKLSAgICAweDhFRTcsIDB4OEVFOCwgMHg4RUU5LCAweDhFRUEsIDB4OEVFQywgMHg4RUVELCAweDhFRUUsIDB4OEVFRiwKLSAgICAweDhFRjAsIDB4OEVGMSwgMHg4RUYzLCAweDhFRjQsIDB4OEVGNSwgMHg4RUY2LCAweDhFRjcsIDB4OEVGRCwKLSAgICAweDhFRkYsIDB4OEYwMCwgMHg4RjAxLCAweDhGMDIsIDB4OEYwNCwgMHg4RjA2LCAweDhGMDgsIDB4OEYwQiwKLSAgICAweDhGMEMsIDB4OEYwRCwgMHg4RjBFLCAweDhGMEYsIDB4OEYxMCwgMHg4RjExLCAweDhGMTMsIDB4OEYxNiwKLSAgICAweDhGMTcsIDB4OEYxOCwgMHg4RjE5LCAweDhGMUEsIDB4OEYyMCwgMHg4RjIxLCAweDhGMjIsIDB4OEYyMywKLSAgICAweDhGMjQsIDB4OEYyNywgMHg4RjI4LCAweDhGMkIsIDB4OEYyQywgMHg4RjJELCAweDhGMkUsIDB4OEYzMCwKLSAgICAweDhGMzEsIDB4OEYzMiwgMHg4RjM0LCAweDhGMzUsIDB4OEYzNiwgMHg4RjM3LCAweDhGMzksIDB4OEYzQSwKLSAgICAweDhGM0MsIDB4OEYzRCwgMHg4RjQwLCAweDhGNDEsIDB4OEY0MywgMHg4RjQ3LCAweDhGNDgsIDB4OEY0QSwKLSAgICAweDhGNEIsIDB4OEY0QywgMHg4RjRGLCAweDhGNTAsIDB4OEY1MSwgMHg4RjUyLCAweDhGNTMsIDB4OEY1NSwKLSAgICAweDhGNTYsIDB4OEY1NywgMHg4RjU4LCAweDhGNTksIDB4OEY1QSwgMHg4RjVCLCAweDhGNUMsIDB4OEY1RCwKLSAgICAweDhGNUUsIDB4OEY2MCwgMHg4RjYzLCAweDhGNjUsIDB4OEY2QSwgMHg4RjgwLCAweDhGOEMsIDB4OEY5MiwKLSAgICAweDhGOUQsIDB4OEZBMCwgMHg4RkExLCAweDhGQTIsIDB4OEZBNCwgMHg4RkE1LCAweDhGQTcsIDB4OEZBQSwKLSAgICAweDhGQUMsIDB4OEZCMywgMHg4RkI0LCAweDhGQjUsIDB4OEZCNywgMHg4RkI4LCAweDhGQkEsIDB4OEZCQiwKLSAgICAweDhGQkMsIDB4OEZCRiwgMHg4RkMwLCAweDhGQzMsIDB4OEZDNiwgMHg4RkM5LCAweDhGQ0EsIDB4OEZDQiwKLSAgICAweDhGQ0MsIDB4OEZDRCwgMHg4RkNGLCAweDhGRDIsIDB4OEZENiwgMHg4RkQ3LCAweDhGREEsIDB4OEZFMCwKLSAgICAweDhGRTEsIDB4OEZFMywgMHg4RkU3LCAweDhGRUMsIDB4OEZFRiwgMHg4RkYxLCAweDhGRjIsIDB4OEZGNSwKLSAgICAweDhGRjYsIDB4OEZGQSwgMHg4RkZCLCAweDhGRkMsIDB4OEZGRSwgMHg4RkZGLCAweDkwMDcsIDB4OTAwOCwKLSAgICAweDkwMEMsIDB4OTAwRSwgMHg5MDEzLCAweDkwMTgsIDB4OTAxQywgMHg5MDI0LCAweDkwMjUsIDB4OTAyNywKLSAgICAweDkwMjgsIDB4OTAyOSwgMHg5MDJBLCAweDkwMkIsIDB4OTAyQywgMHg5MDMwLCAweDkwMzEsIDB4OTAzMywKLSAgICAweDkwMzQsIDB4OTAzNywgMHg5MDM5LCAweDkwM0EsIDB4OTAzRCwgMHg5MDNGLCAweDkwNDAsIDB4OTA0MywKLSAgICAweDkwNDUsIDB4OTA0NiwgMHg5MDQ4LCAweDkwNDksIDB4OTA0QSwgMHg5MDRDLCAweDkwNTYsIDB4OTA1OSwKLSAgICAweDkwNUEsIDB4OTA1RCwgMHg5MDVGLCAweDkwNjEsIDB4OTA2NCwgMHg5MDY2LCAweDkwNjcsIDB4OTA2QSwKLSAgICAweDkwNkIsIDB4OTA2QywgMHg5MDZGLCAweDkwNzAsIDB4OTA3MSwgMHg5MDczLCAweDkwNzYsIDB4OTA3OSwKLSAgICAweDkwN0IsIDB4OTA3RSwgMHg5MDg1LCAweDkwODYsIDB4OTA4OSwgMHg5MDhDLCAweDkwOEQsIDB4OTA4RSwKLSAgICAweDkwOTIsIDB4OTA5NCwgMHg5MDk2LCAweDkwOTgsIDB4OTA5QSwgMHg5MDlDLCAweDkwOUUsIDB4OTA5RiwKLSAgICAweDkwQTAsIDB4OTBBNCwgMHg5MEE1LCAweDkwQTcsIDB4OTBBOCwgMHg5MEE5LCAweDkwQUIsIDB4OTBBRCwKLSAgICAweDkwQjIsIDB4OTBCNywgMHg5MEJDLCAweDkwQkQsIDB4OTBCRiwgMHg5MEMwLCAweDkwQzIsIDB4OTBDMywKLSAgICAweDkwQzYsIDB4OTBDOCwgMHg5MEM5LCAweDkwQ0IsIDB4OTBDQywgMHg5MENELCAweDkwRDIsIDB4OTBENCwKLSAgICAweDkwRDUsIDB4OTBENiwgMHg5MEQ4LCAweDkwRDksIDB4OTBEQSwgMHg5MERFLCAweDkwRTAsIDB4OTBFMywKLSAgICAweDkwRTQsIDB4OTBFNSwgMHg5MEU5LCAweDkwRUEsIDB4OTBFQywgMHg5MEVFLCAweDkwRjAsIDB4OTBGMSwKLSAgICAweDkwRjIsIDB4OTBGMywgMHg5MEY2LCAweDkwRjcsIDB4OTBGOSwgMHg5MEZBLCAweDkwRkIsIDB4OTBGQywKLSAgICAweDkwRkYsIDB4OTEwMCwgMHg5MTAxLCAweDkxMDMsIDB4OTEwNSwgMHg5MTA3LCAweDkxMDgsIDB4OTEwQSwKLSAgICAweDkxMEIsIDB4OTEwQywgMHg5MTBELCAweDkxMEUsIDB4OTEwRiwgMHg5MTEwLCAweDkxMTEsIDB4OTExMywKLSAgICAweDkxMTUsIDB4OTExNywgMHg5MTE4LCAweDkxMUEsIDB4OTExQiwgMHg5MTFDLCAweDkxMUQsIDB4OTExRiwKLSAgICAweDkxMjAsIDB4OTEyMSwgMHg5MTI0LCAweDkxMjUsIDB4OTEyNiwgMHg5MTI4LCAweDkxMjksIDB4OTEyQSwKLSAgICAweDkxMkIsIDB4OTEyQywgMHg5MTJFLCAweDkxMzMsIDB4OTEzNSwgMHg5MTM3LCAweDkxMzgsIDB4OTEzQiwKLSAgICAweDkxM0MsIDB4OTEzRCwgMHg5MTNFLCAweDkxM0YsIDB4OTE0MCwgMHg5MTQxLCAweDkxNDIsIDB4OTE0NCwKLSAgICAweDkxNDUsIDB4OTE0NywgMHg5MTUxLCAweDkxNTMsIDB4OTE1NCwgMHg5MTU1LCAweDkxNTYsIDB4OTE1OCwKLSAgICAweDkxNTksIDB4OTE1QiwgMHg5MTVDLCAweDkxNUYsIDB4OTE2MCwgMHg5MTY2LCAweDkxNjcsIDB4OTE2OCwKLSAgICAweDkxNkIsIDB4OTE2RCwgMHg5MTczLCAweDkxN0EsIDB4OTE3QiwgMHg5MTdDLCAweDkxODAsIDB4OTE4MSwKLSAgICAweDkxODIsIDB4OTE4MywgMHg5MTg0LCAweDkxODYsIDB4OTE4OCwgMHg5MThBLCAweDkxOEUsIDB4OTE4RiwKLSAgICAweDkxOTMsIDB4OTE5NCwgMHg5MTk1LCAweDkxOTcsIDB4OTE5OCwgMHg5MTk5LCAweDkxOUQsIDB4OTE5RSwKLSAgICAweDkxOUYsIDB4OTFBMCwgMHg5MUExLCAweDkxQTQsIDB4OTFBNSwgMHg5MUE2LCAweDkxQTcsIDB4OTFBOCwKLSAgICAweDkxQTksIDB4OTFCMCwgMHg5MUIxLCAweDkxQjIsIDB4OTFCMywgMHg5MUI2LCAweDkxQjcsIDB4OTFCOCwKLSAgICAweDkxQjksIDB4OTFCQiwgMHg5MUJDLCAweDkxQkQsIDB4OTFCRSwgMHg5MUJGLCAweDkxQzIsIDB4OTFDNCwKLSAgICAweDkxQzYsIDB4OTFDOCwgMHg5MUQwLCAweDkxRDYsIDB4OTFEQSwgMHg5MURCLCAweDkxREUsIDB4OTFERiwKLSAgICAweDkxRTAsIDB4OTFFMSwgMHg5MUUyLCAweDkxRTUsIDB4OTFFNiwgMHg5MUU4LCAweDkxRUEsIDB4OTFFQiwKLSAgICAweDkxRUMsIDB4OTFFRCwgMHg5MUVFLCAweDkxRUYsIDB4OTFGMCwgMHg5MUYxLCAweDkxRjIsIDB4OTFGMywKLSAgICAweDkxRjQsIDB4OTFGNiwgMHg5MUY4LCAweDkxRkIsIDB4OTFGQywgMHg5MUZELCAweDkxRkUsIDB4OTFGRiwKLSAgICAweDkyMDIsIDB4OTIwMywgMHg5MjA1LCAweDkyMDYsIDB4OTIwNywgMHg5MjBBLCAweDkyMEIsIDB4OTIwQywKLSAgICAweDkyMEYsIDB4OTIxMiwgMHg5MjEzLCAweDkyMTYsIDB4OTIxNywgMHg5MjE4LCAweDkyMTksIDB4OTIxQSwKLSAgICAweDkyMUIsIDB4OTIxQywgMHg5MjFELCAweDkyMUYsIDB4OTIyMCwgMHg5MjIxLCAweDkyMjIsIDB4OTIyNCwKLSAgICAweDkyMjgsIDB4OTIyOSwgMHg5MjJBLCAweDkyMkIsIDB4OTIyQywgMHg5MjJELCAweDkyMkYsIDB4OTIzMSwKLSAgICAweDkyMzIsIDB4OTIzNSwgMHg5MjM2LCAweDkyM0IsIDB4OTIzQywgMHg5MjQxLCAweDkyNDIsIDB4OTI0MywKLSAgICAweDkyNDQsIDB4OTI0NiwgMHg5MjQ3LCAweDkyNEEsIDB4OTI0QiwgMHg5MjRDLCAweDkyNEUsIDB4OTI0RiwKLSAgICAweDkyNTAsIDB4OTI1MiwgMHg5MjUzLCAweDkyNTQsIDB4OTI1NiwgMHg5MjU4LCAweDkyNTksIDB4OTI1QywKLSAgICAweDkyNUQsIDB4OTI1RiwgMHg5MjYwLCAweDkyNjEsIDB4OTI2MywgMHg5MjY0LCAweDkyNjUsIDB4OTI2NywKLSAgICAweDkyNjgsIDB4OTI2OSwgMHg5MjZBLCAweDkyNkIsIDB4OTI2RSwgMHg5MjZGLCAweDkyNzAsIDB4OTI3MSwKLSAgICAweDkyNzIsIDB4OTI3MywgMHg5Mjc1LCAweDkyNzYsIDB4OTI3NywgMHg5Mjc5LCAweDkyN0MsIDB4OTI3RCwKLSAgICAweDkyN0UsIDB4OTI4MSwgMHg5MjgyLCAweDkyODQsIDB4OTI4NiwgMHg5Mjg3LCAweDkyODgsIDB4OTI4OSwKLSAgICAweDkyOEEsIDB4OTI4QiwgMHg5MjhDLCAweDkyOEQsIDB4OTI4RiwgMHg5MjkwLCAweDkyOTIsIDB4OTI5NCwKLSAgICAweDkyOTUsIDB4OTI5NywgMHg5Mjk5LCAweDkyOUIsIDB4OTI5RCwgMHg5MjlFLCAweDkyOUYsIDB4OTJBMSwKLSAgICAweDkyQTIsIDB4OTJBNCwgMHg5MkE3LCAweDkyQUQsIDB4OTJBRiwgMHg5MkIwLCAweDkyQjIsIDB4OTJCMywKLSAgICAweDkyQjQsIDB4OTJCNSwgMHg5MkI2LCAweDkyQjgsIDB4OTJCQSwgMHg5MkJELCAweDkyQkUsIDB4OTJCRiwKLSAgICAweDkyQzAsIDB4OTJDMiwgMHg5MkM0LCAweDkyQzYsIDB4OTJDOSwgMHg5MkNBLCAweDkyQ0IsIDB4OTJDRCwKLSAgICAweDkyQ0UsIDB4OTJEMCwgMHg5MkQxLCAweDkyRDMsIDB4OTJENCwgMHg5MkQ1LCAweDkyRDYsIDB4OTJENywKLSAgICAweDkyRDgsIDB4OTJEOSwgMHg5MkRBLCAweDkyREIsIDB4OTJEQywgMHg5MkRFLCAweDkyRTAsIDB4OTJFMSwKLSAgICAweDkyRTIsIDB4OTJFNywgMHg5MkU5LCAweDkyRUIsIDB4OTJFQywgMHg5MkYyLCAweDkyRjMsIDB4OTJGNCwKLSAgICAweDkyRjUsIDB4OTJGNywgMHg5MkY5LCAweDkyRkEsIDB4OTJGQiwgMHg5MkZELCAweDkyRkUsIDB4OTJGRiwKLSAgICAweDkzMDAsIDB4OTMwMiwgMHg5MzAzLCAweDkzMDQsIDB4OTMwNSwgMHg5MzA5LCAweDkzMEEsIDB4OTMwQiwKLSAgICAweDkzMEMsIDB4OTMwRCwgMHg5MzBFLCAweDkzMEYsIDB4OTMxMSwgMHg5MzEzLCAweDkzMTQsIDB4OTMxNiwKLSAgICAweDkzMTcsIDB4OTMxQywgMHg5MzFELCAweDkzMUUsIDB4OTMyMSwgMHg5MzIzLCAweDkzMjQsIDB4OTMyNSwKLSAgICAweDkzMjcsIDB4OTMyOSwgMHg5MzJBLCAweDkzMkMsIDB4OTMyRCwgMHg5MzMwLCAweDkzMzEsIDB4OTMzNCwKLSAgICAweDkzMzUsIDB4OTMzNywgMHg5MzM5LCAweDkzM0EsIDB4OTMzQiwgMHg5MzNDLCAweDkzM0QsIDB4OTMzRiwKLSAgICAweDkzNDIsIDB4OTM0NCwgMHg5MzQ1LCAweDkzNDgsIDB4OTM0OSwgMHg5MzRBLCAweDkzNEMsIDB4OTM0RSwKLSAgICAweDkzNEYsIDB4OTM1MCwgMHg5MzUxLCAweDkzNTIsIDB4OTM1MywgMHg5MzU1LCAweDkzNTYsIDB4OTM1NywKLSAgICAweDkzNTksIDB4OTM1QSwgMHg5MzVDLCAweDkzNUQsIDB4OTM1RSwgMHg5MzVGLCAweDkzNjAsIDB4OTM2MSwKLSAgICAweDkzNjIsIDB4OTM2MywgMHg5MzY2LCAweDkzNjcsIDB4OTM2OCwgMHg5MzZCLCAweDkzNkQsIDB4OTM2RSwKLSAgICAweDkzNkYsIDB4OTM3MSwgMHg5MzcyLCAweDkzNzMsIDB4OTM3NCwgMHg5Mzc3LCAweDkzNzgsIDB4OTM3OSwKLSAgICAweDkzN0IsIDB4OTM3QywgMHg5MzdELCAweDkzN0YsIDB4OTM4MCwgMHg5MzgxLCAweDkzODMsIDB4OTM4NSwKLSAgICAweDkzODYsIDB4OTM4OCwgMHg5Mzg5LCAweDkzOEIsIDB4OTM4QywgMHg5MzhELCAweDkzOEUsIDB4OTM5MCwKLSAgICAweDkzOTEsIDB4OTM5MiwgMHg5MzkzLCAweDkzOTQsIDB4OTM5NSwgMHg5Mzk3LCAweDkzOTksIDB4OTM5QSwKLSAgICAweDkzOUIsIDB4OTM5QywgMHg5MzlELCAweDkzOUUsIDB4OTM5RiwgMHg5M0EwLCAweDkzQTEsIDB4OTNBNCwKLSAgICAweDkzQTUsIDB4OTNBOCwgMHg5M0FCLCAweDkzQUQsIDB4OTNBRiwgMHg5M0IxLCAweDkzQjIsIDB4OTNCNCwKLSAgICAweDkzQjYsIDB4OTNCNywgMHg5M0I5LCAweDkzQkEsIDB4OTNCQiwgMHg5M0JDLCAweDkzQkQsIDB4OTNCRSwKLSAgICAweDkzQzAsIDB4OTNDMSwgMHg5M0MyLCAweDkzQzQsIDB4OTNDNSwgMHg5M0M2LCAweDkzQzksIDB4OTNDQiwKLSAgICAweDkzQ0UsIDB4OTNDRiwgMHg5M0QwLCAweDkzRDIsIDB4OTNEMywgMHg5M0Q0LCAweDkzRDUsIDB4OTNEOSwKLSAgICAweDkzREEsIDB4OTNEQiwgMHg5M0UwLCAweDkzRTMsIDB4OTNFNSwgMHg5M0U2LCAweDkzRTcsIDB4OTNFOSwKLSAgICAweDkzRUEsIDB4OTNFQiwgMHg5M0VDLCAweDkzRUQsIDB4OTNFRSwgMHg5M0VGLCAweDkzRjAsIDB4OTNGMSwKLSAgICAweDkzRjIsIDB4OTNGMywgMHg5M0Y0LCAweDkzRjYsIDB4OTNGOCwgMHg5M0ZBLCAweDkzRkIsIDB4OTNGQywKLSAgICAweDkzRkQsIDB4OTNGRSwgMHg5M0ZGLCAweDk0MDAsIDB4OTQwMSwgMHg5NDAyLCAweDk0MDQsIDB4OTQwNSwKLSAgICAweDk0MDYsIDB4OTQwNywgMHg5NDA4LCAweDk0MDksIDB4OTQwQSwgMHg5NDBDLCAweDk0MEQsIDB4OTQwRSwKLSAgICAweDk0MEYsIDB4OTQxMSwgMHg5NDE1LCAweDk0MTYsIDB4OTQxNywgMHg5NDFBLCAweDk0MUIsIDB4OTQxQywKLSAgICAweDk0MUUsIDB4OTQxRiwgMHg5NDIxLCAweDk0MjIsIDB4OTQyMywgMHg5NDI0LCAweDk0MjUsIDB4OTQyOSwKLSAgICAweDk0MkEsIDB4OTQyQiwgMHg5NDJDLCAweDk0MkQsIDB4OTQyRiwgMHg5NDMwLCAweDk0MzEsIDB4OTQzNCwKLSAgICAweDk0MzYsIDB4OTQzNywgMHg5NDM5LCAweDk0M0IsIDB4OTQzQywgMHg5NDNELCAweDk0NDAsIDB4OTQ0MSwKLSAgICAweDk0NDIsIDB4OTQ0MywgMHg5NDQ1LCAweDk0NDYsIDB4OTQ0NywgMHg5NDQ4LCAweDk0NDksIDB4OTQ0QiwKLSAgICAweDk0NEQsIDB4OTQ0RSwgMHg5NDRGLCAweDk0NTAsIDB4OTQ1MSwgMHg5NDUzLCAweDk0NTUsIDB4OTQ1NiwKLSAgICAweDk0NTcsIDB4OTQ1OCwgMHg5NDU5LCAweDk0NUEsIDB4OTQ1QiwgMHg5NDVDLCAweDk0NUQsIDB4OTQ1RSwKLSAgICAweDk0NUYsIDB4OTQ2MSwgMHg5NDYyLCAweDk0NjQsIDB4OTQ2NiwgMHg5NDY3LCAweDk0NjgsIDB4OTQ2OSwKLSAgICAweDk0NkEsIDB4OTQ2QywgMHg5NDZFLCAweDk0NkYsIDB4OTQ3MSwgMHg5NDczLCAweDk0NzQsIDB4OTQ3NSwKLSAgICAweDk0NzYsIDB4OTQ3OCwgMHg5NDdBLCAweDk0N0IsIDB4OTQ4MCwgMHg5NDgxLCAweDk0ODIsIDB4OTQ4MywKLSAgICAweDk0ODQsIDB4OTQ5MSwgMHg5NDk2LCAweDk0OTgsIDB4OTRDNywgMHg5NENGLCAweDk0RDMsIDB4OTRENCwKLSAgICAweDk0REEsIDB4OTRFNiwgMHg5NEZCLCAweDk1MUMsIDB4OTUyMCwgMHg5NTI3LCAweDk1MzMsIDB4OTUzRCwKLSAgICAweDk1NDMsIDB4OTU0OCwgMHg5NTRCLCAweDk1NTUsIDB4OTU1QSwgMHg5NTYwLCAweDk1NkUsIDB4OTU3NCwKLSAgICAweDk1NzUsIDB4OTU3OCwgMHg5NTc5LCAweDk1N0EsIDB4OTU3QiwgMHg5NTdDLCAweDk1N0QsIDB4OTU3RSwKLSAgICAweDk1ODEsIDB4OTU4NCwgMHg5NTg1LCAweDk1ODcsIDB4OTU4OCwgMHg5NThBLCAweDk1OEQsIDB4OTU5MCwKLSAgICAweDk1OTIsIDB4OTU5NSwgMHg5NTk2LCAweDk1OTcsIDB4OTU5OSwgMHg5NTlBLCAweDk1OUIsIDB4OTU5QywKLSAgICAweDk1OUQsIDB4OTU5RSwgMHg5NTlGLCAweDk1QTAsIDB4OTVBMiwgMHg5NUE2LCAweDk1QTcsIDB4OTVBQSwKLSAgICAweDk1QUUsIDB4OTVBRiwgMHg5NUIwLCAweDk1QjEsIDB4OTVCMywgMHg5NUI0LCAweDk1QjUsIDB4OTVCNywKLSAgICAweDk1QjgsIDB4OTVCQSwgMHg5NUMwLCAweDk1QzEsIDB4OTVDMiwgMHg5NUM0LCAweDk1QzUsIDB4OTVDNywKLSAgICAweDk1QzksIDB4OTVDRCwgMHg5NUNFLCAweDk1Q0YsIDB4OTVEMSwgMHg5NUQyLCAweDk1RDMsIDB4OTVENywKLSAgICAweDk1RDgsIDB4OTVEOSwgMHg5NURBLCAweDk1REIsIDB4OTVERCwgMHg5NURGLCAweDk1RTAsIDB4OTVFMywKLSAgICAweDk1RTQsIDB4OTVFNiwgMHg5NUU3LCAweDk1RUMsIDB4OTVGRiwgMHg5NjA3LCAweDk2MTMsIDB4OTYxOCwKLSAgICAweDk2MUIsIDB4OTYxRSwgMHg5NjIwLCAweDk2MjMsIDB4OTYyNCwgMHg5NjI1LCAweDk2MjYsIDB4OTYyNywKLSAgICAweDk2MjgsIDB4OTYyOSwgMHg5NjJCLCAweDk2MkMsIDB4OTYyRCwgMHg5NjJGLCAweDk2MzAsIDB4OTYzNywKLSAgICAweDk2MzgsIDB4OTYzOSwgMHg5NjNBLCAweDk2M0UsIDB4OTY0MSwgMHg5NjQzLCAweDk2NEEsIDB4OTY0RSwKLSAgICAweDk2NEYsIDB4OTY1MSwgMHg5NjUyLCAweDk2NTMsIDB4OTY1NiwgMHg5NjU3LCAweDk2NTksIDB4OTY1QSwKLSAgICAweDk2NUMsIDB4OTY1RSwgMHg5NjYwLCAweDk2NjUsIDB4OTY2NiwgMHg5NjZCLCAweDk2NkQsIDB4OTY2RSwKLSAgICAweDk2NkYsIDB4OTY3MSwgMHg5Njc5LCAweDk2N0EsIDB4OTY3QiwgMHg5NjdDLCAweDk2N0UsIDB4OTY3RiwKLSAgICAweDk2ODAsIDB4OTY4MSwgMHg5NjgyLCAweDk2ODMsIDB4OTY4NCwgMHg5Njg3LCAweDk2ODksIDB4OTY4QywKLSAgICAweDk2OTEsIDB4OTY5MiwgMHg5NjkzLCAweDk2OTYsIDB4OTY5QSwgMHg5NjlELCAweDk2OUUsIDB4OTY5RiwKLSAgICAweDk2QTAsIDB4OTZBMSwgMHg5NkEyLCAweDk2QTMsIDB4OTZBNCwgMHg5NkE1LCAweDk2QTYsIDB4OTZBOSwKLSAgICAweDk2QUIsIDB4OTZBQywgMHg5NkFELCAweDk2QUUsIDB4OTZBRiwgMHg5NkIyLCAweDk2QjUsIDB4OTZCNywKLSAgICAweDk2QkEsIDB4OTZCRiwgMHg5NkMyLCAweDk2QzMsIDB4OTZDOCwgMHg5NkNBLCAweDk2Q0IsIDB4OTZEMCwKLSAgICAweDk2RDEsIDB4OTZEMywgMHg5NkQ0LCAweDk2RDcsIDB4OTZEOCwgMHg5NkRBLCAweDk2REQsIDB4OTZERSwKLSAgICAweDk2REYsIDB4OTZFMSwgMHg5NkU0LCAweDk2RTUsIDB4OTZFNiwgMHg5NkU3LCAweDk2RUIsIDB4OTZFQywKLSAgICAweDk2RUQsIDB4OTZFRSwgMHg5NkYwLCAweDk2RjEsIDB4OTZGNCwgMHg5NkY1LCAweDk2RjgsIDB4OTZGQSwKLSAgICAweDk2RkMsIDB4OTZGRCwgMHg5NkZGLCAweDk3MDIsIDB4OTcwMywgMHg5NzA1LCAweDk3MEEsIDB4OTcwQiwKLSAgICAweDk3MEMsIDB4OTcxMCwgMHg5NzExLCAweDk3MTIsIDB4OTcxNCwgMHg5NzE1LCAweDk3MTcsIDB4OTcxOCwKLSAgICAweDk3MTksIDB4OTcxQSwgMHg5NzFCLCAweDk3MUQsIDB4OTcxRiwgMHg5NzIwLCAweDk3MjEsIDB4OTcyMiwKLSAgICAweDk3MjMsIDB4OTcyNCwgMHg5NzI1LCAweDk3MjYsIDB4OTcyOCwgMHg5NzI5LCAweDk3MkIsIDB4OTcyQywKLSAgICAweDk3MkUsIDB4OTcyRiwgMHg5NzMxLCAweDk3MzMsIDB4OTczNCwgMHg5NzM1LCAweDk3MzYsIDB4OTczNywKLSAgICAweDk3M0EsIDB4OTczQiwgMHg5NzNDLCAweDk3M0YsIDB4OTc0MCwgMHg5NzQxLCAweDk3NDMsIDB4OTc0NSwKLSAgICAweDk3NDYsIDB4OTc0NywgMHg5NzQ5LCAweDk3NEEsIDB4OTc0QiwgMHg5NzRDLCAweDk3NEQsIDB4OTc0RSwKLSAgICAweDk3NEYsIDB4OTc1MCwgMHg5NzUxLCAweDk3NTQsIDB4OTc1NSwgMHg5NzU3LCAweDk3NTgsIDB4OTc1QywKLSAgICAweDk3NUQsIDB4OTc1RiwgMHg5NzYzLCAweDk3NjQsIDB4OTc2NiwgMHg5NzY3LCAweDk3NkEsIDB4OTc2QiwKLSAgICAweDk3NkMsIDB4OTc2RCwgMHg5NzZFLCAweDk3NkYsIDB4OTc3MCwgMHg5NzcxLCAweDk3NzIsIDB4OTc3NSwKLSAgICAweDk3NzcsIDB4OTc3OCwgMHg5Nzc5LCAweDk3N0EsIDB4OTc3QiwgMHg5NzdELCAweDk3N0UsIDB4OTc3RiwKLSAgICAweDk3ODAsIDB4OTc4MSwgMHg5NzgyLCAweDk3ODMsIDB4OTc4NCwgMHg5Nzg2LCAweDk3ODcsIDB4OTc4OCwKLSAgICAweDk3ODksIDB4OTc4QSwgMHg5NzhDLCAweDk3OEUsIDB4OTc5MCwgMHg5NzkzLCAweDk3OTUsIDB4OTc5NiwKLSAgICAweDk3OTcsIDB4OTc5OSwgMHg5NzlBLCAweDk3OUIsIDB4OTc5QywgMHg5NzlELCAweDk3OUUsIDB4OTc5RiwKLSAgICAweDk3QTEsIDB4OTdBMiwgMHg5N0E0LCAweDk3QTUsIDB4OTdBNywgMHg5N0E4LCAweDk3QTksIDB4OTdBQSwKLSAgICAweDk3QUMsIDB4OTdBRSwgMHg5N0IwLCAweDk3QjEsIDB4OTdCMywgMHg5N0I1LCAweDk3QjYsIDB4OTdCNywKLSAgICAweDk3QjgsIDB4OTdCOSwgMHg5N0JBLCAweDk3QkIsIDB4OTdCQywgMHg5N0JFLCAweDk3QkYsIDB4OTdDMCwKLSAgICAweDk3QzEsIDB4OTdDMiwgMHg5N0M0LCAweDk3QzUsIDB4OTdDNywgMHg5N0M4LCAweDk3Q0EsIDB4OTdDRCwKLSAgICAweDk3Q0UsIDB4OTdDRiwgMHg5N0QwLCAweDk3RDEsIDB4OTdEMiwgMHg5N0Q0LCAweDk3RDUsIDB4OTdENiwKLSAgICAweDk3RDcsIDB4OTdEOCwgMHg5N0RBLCAweDk3REIsIDB4OTdERCwgMHg5N0RGLCAweDk3RTAsIDB4OTdFMSwKLSAgICAweDk3RTIsIDB4OTdFMywgMHg5N0U0LCAweDk3RTUsIDB4OTdFOCwgMHg5N0VFLCAweDk3RUYsIDB4OTdGMCwKLSAgICAweDk3RjEsIDB4OTdGMiwgMHg5N0Y0LCAweDk3RjcsIDB4OTdGOCwgMHg5N0Y5LCAweDk3RkEsIDB4OTdGQiwKLSAgICAweDk3RkMsIDB4OTdGRCwgMHg5N0ZFLCAweDk4MDAsIDB4OTgwNCwgMHg5ODA5LCAweDk4MEIsIDB4OTgwRCwKLSAgICAweDk4MTQsIDB4OTgxNSwgMHg5ODE2LCAweDk4MTksIDB4OTgxQSwgMHg5ODFCLCAweDk4MUQsIDB4OTgxRSwKLSAgICAweDk4MUYsIDB4OTgyMCwgMHg5ODIyLCAweDk4MjMsIDB4OTgyNSwgMHg5ODI3LCAweDk4MjgsIDB4OTgyOSwKLSAgICAweDk4MkEsIDB4OTgyQiwgMHg5ODJDLCAweDk4MkUsIDB4OTgyRiwgMHg5ODMxLCAweDk4MzIsIDB4OTgzMywKLSAgICAweDk4MzQsIDB4OTgzNSwgMHg5ODM2LCAweDk4MzksIDB4OTgzQSwgMHg5ODNDLCAweDk4M0UsIDB4OTgzRiwKLSAgICAweDk4NDAsIDB4OTg0MSwgMHg5ODQyLCAweDk4NDMsIDB4OTg0NCwgMHg5ODQ1LCAweDk4NDcsIDB4OTg0OCwKLSAgICAweDk4NDksIDB4OTg0QSwgMHg5ODRCLCAweDk4NEYsIDB4OTg1MCwgMHg5ODUxLCAweDk4NTIsIDB4OTg1NSwKLSAgICAweDk4NTYsIDB4OTg1NywgMHg5ODVBLCAweDk4NUMsIDB4OTg1RCwgMHg5ODVGLCAweDk4NjAsIDB4OTg2MSwKLSAgICAweDk4NjMsIDB4OTg2NCwgMHg5ODY2LCAweDk4NjgsIDB4OTg2OSwgMHg5ODZBLCAweDk4NkQsIDB4OTg2RSwKLSAgICAweDk4NzIsIDB4OTg4QiwgMHg5ODhFLCAweDk4OTIsIDB4OTg5NSwgMHg5ODk5LCAweDk4QTMsIDB4OThBOSwKLSAgICAweDk4QUEsIDB4OThBQiwgMHg5OEFDLCAweDk4QUQsIDB4OThCMCwgMHg5OEIyLCAweDk4QjQsIDB4OThCNSwKLSAgICAweDk4QjcsIDB4OThCOCwgMHg5OEI5LCAweDk4QkEsIDB4OThCQiwgMHg5OEJELCAweDk4QkUsIDB4OThCRiwKLSAgICAweDk4QzAsIDB4OThDMSwgMHg5OEMyLCAweDk4QzMsIDB4OThDNSwgMHg5OEM3LCAweDk4QzksIDB4OThDQSwKLSAgICAweDk4Q0IsIDB4OThDQywgMHg5OENELCAweDk4Q0YsIDB4OThEMCwgMHg5OEQ0LCAweDk4RDYsIDB4OThENywKLSAgICAweDk4REMsIDB4OThERCwgMHg5OEUxLCAweDk4RTMsIDB4OThFNCwgMHg5OEU1LCAweDk4RTYsIDB4OThFQywKLSAgICAweDk4RUUsIDB4OThGMCwgMHg5OEYxLCAweDk4RjMsIDB4OThGNSwgMHg5OEY2LCAweDk4RjcsIDB4OThGOCwKLSAgICAweDk4RjksIDB4OThGQSwgMHg5OEZCLCAweDk4RkYsIDB4OTkwMCwgMHg5OTAxLCAweDk5MDIsIDB4OTkwNCwKLSAgICAweDk5MDYsIDB4OTkwNywgMHg5OTA4LCAweDk5MEIsIDB4OTkwRSwgMHg5OTBGLCAweDk5MTQsIDB4OTkxNSwKLSAgICAweDk5MTYsIDB4OTkxNywgMHg5OTE5LCAweDk5MUEsIDB4OTkxQywgMHg5OTFELCAweDk5MUYsIDB4OTkyMCwKLSAgICAweDk5MjIsIDB4OTkyMywgMHg5OTI0LCAweDk5MjUsIDB4OTkyNiwgMHg5OTI3LCAweDk5MjksIDB4OTkyQSwKLSAgICAweDk5MkIsIDB4OTkyQywgMHg5OTJELCAweDk5MkYsIDB4OTkzMCwgMHg5OTMxLCAweDk5MzIsIDB4OTkzNCwKLSAgICAweDk5MzUsIDB4OTkzNiwgMHg5OTM4LCAweDk5MzksIDB4OTkzQSwgMHg5OTNCLCAweDk5M0QsIDB4OTk0MCwKLSAgICAweDk5NDEsIDB4OTk0MiwgMHg5OTQ0LCAweDk5NDYsIDB4OTk0NywgMHg5OTRELCAweDk5NEUsIDB4OTk0RiwKLSAgICAweDk5NTAsIDB4OTk1MywgMHg5OTU2LCAweDk5NTgsIDB4OTk1OSwgMHg5OTVBLCAweDk5NUIsIDB4OTk1RCwKLSAgICAweDk5NUYsIDB4OTk2MCwgMHg5OTYxLCAweDk5NjQsIDB4OTk2NiwgMHg5OTczLCAweDk5NzgsIDB4OTk3OSwKLSAgICAweDk5N0IsIDB4OTk3RSwgMHg5OTgyLCAweDk5ODMsIDB4OTk4OSwgMHg5OThDLCAweDk5OEUsIDB4OTk5QSwKLSAgICAweDk5OUIsIDB4OTk5QywgMHg5OTlELCAweDk5OUUsIDB4OTk5RiwgMHg5OUEwLCAweDk5QTEsIDB4OTlBMiwKLSAgICAweDk5QTMsIDB4OTlBNCwgMHg5OUE2LCAweDk5QTcsIDB4OTlBOSwgMHg5OUFBLCAweDk5QUIsIDB4OTlBRiwKLSAgICAweDk5QjAsIDB4OTlCMiwgMHg5OUI1LCAweDk5QjYsIDB4OTlCNywgMHg5OUI4LCAweDk5QjksIDB4OTlCQSwKLSAgICAweDk5QkIsIDB4OTlCQywgMHg5OUJELCAweDk5QkUsIDB4OTlCRiwgMHg5OUMwLCAweDk5QzIsIDB4OTlDMywKLSAgICAweDk5QzQsIDB4OTlDNSwgMHg5OUM2LCAweDk5QzcsIDB4OTlDOCwgMHg5OUM5LCAweDk5Q0EsIDB4OTlDQiwKLSAgICAweDk5Q0MsIDB4OTlDRCwgMHg5OUNFLCAweDk5Q0YsIDB4OTlEMywgMHg5OUQ2LCAweDk5RDcsIDB4OTlEQSwKLSAgICAweDk5REMsIDB4OTlERSwgMHg5OUUwLCAweDk5RTMsIDB4OTlFNCwgMHg5OUU1LCAweDk5RTYsIDB4OTlFNywKLSAgICAweDk5RTgsIDB4OTlFOSwgMHg5OUVBLCAweDk5RUIsIDB4OTlFQywgMHg5OUVFLCAweDk5RUYsIDB4OTlGMCwKLSAgICAweDk5RjIsIDB4OTlGMywgMHg5OUY0LCAweDk5RjUsIDB4OTlGNiwgMHg5OUY3LCAweDk5RjgsIDB4OTlGOSwKLSAgICAweDk5RkEsIDB4OTlGQiwgMHg5OUZDLCAweDk5RkQsIDB4OTlGRSwgMHg5QTAwLCAweDlBMDIsIDB4OUEwMywKLSAgICAweDlBMDQsIDB4OUEwNiwgMHg5QTA3LCAweDlBMDgsIDB4OUEwOSwgMHg5QTBBLCAweDlBMEIsIDB4OUEwQywKLSAgICAweDlBMTAsIDB4OUExMSwgMHg5QTEyLCAweDlBMTMsIDB4OUExNCwgMHg5QTE1LCAweDlBMTcsIDB4OUExOCwKLSAgICAweDlBMUEsIDB4OUExQiwgMHg5QTFDLCAweDlBMUQsIDB4OUExRSwgMHg5QTFGLCAweDlBMjAsIDB4OUEyMSwKLSAgICAweDlBMjIsIDB4OUEyMywgMHg5QTI0LCAweDlBMjUsIDB4OUEyNiwgMHg5QTI3LCAweDlBMjgsIDB4OUEyOSwKLSAgICAweDlBMkEsIDB4OUEyQywgMHg5QTJGLCAweDlBMzEsIDB4OUEzMiwgMHg5QTMzLCAweDlBMzQsIDB4OUEzNSwKLSAgICAweDlBMzksIDB4OUEzQSwgMHg5QTNCLCAweDlBM0MsIDB4OUEzRCwgMHg5QTNGLCAweDlBNDYsIDB4OUE0NywKLSAgICAweDlBNDgsIDB4OUE0OSwgMHg5QTRCLCAweDlBNEMsIDB4OUE0RSwgMHg5QTUwLCAweDlBNTEsIDB4OUE1MiwKLSAgICAweDlBNTMsIDB4OUE1NCwgMHg5QTU2LCAweDlBNTgsIDB4OUE1OSwgMHg5QTVDLCAweDlBNUQsIDB4OUE1RSwKLSAgICAweDlBNjAsIDB4OUE2MSwgMHg5QTYzLCAweDlBNjYsIDB4OUE2NywgMHg5QTY4LCAweDlBNjksIDB4OUE2QiwKLSAgICAweDlBNzIsIDB4OUE4MywgMHg5QTg5LCAweDlBOEQsIDB4OUE4RSwgMHg5QTk0LCAweDlBOTUsIDB4OUE5OSwKLSAgICAweDlBQTYsIDB4OUFBOSwgMHg5QUFBLCAweDlBQUIsIDB4OUFBQywgMHg5QUFELCAweDlBQUUsIDB4OUFCMiwKLSAgICAweDlBQjMsIDB4OUFCNCwgMHg5QUI1LCAweDlBQjksIDB4OUFCQiwgMHg5QUJELCAweDlBQkUsIDB4OUFCRiwKLSAgICAweDlBQzMsIDB4OUFDNCwgMHg5QUM2LCAweDlBQzcsIDB4OUFDOCwgMHg5QUM5LCAweDlBQ0EsIDB4OUFDRCwKLSAgICAweDlBQ0UsIDB4OUFEMCwgMHg5QUQ3LCAweDlBRDksIDB4OUFEQSwgMHg5QURCLCAweDlBREMsIDB4OUFERCwKLSAgICAweDlBREUsIDB4OUFFMCwgMHg5QUUyLCAweDlBRTMsIDB4OUFFNCwgMHg5QUU1LCAweDlBRTcsIDB4OUFFOCwKLSAgICAweDlBRTksIDB4OUFFQSwgMHg5QUVDLCAweDlBRjAsIDB4OUFGMSwgMHg5QUYyLCAweDlBRjMsIDB4OUFGNCwKLSAgICAweDlBRjUsIDB4OUFGNiwgMHg5QUY3LCAweDlBRjgsIDB4OUFGQSwgMHg5QUZDLCAweDlBRkQsIDB4OUFGRSwKLSAgICAweDlBRkYsIDB4OUIwMCwgMHg5QjAxLCAweDlCMDIsIDB4OUIwNCwgMHg5QjA1LCAweDlCMDcsIDB4OUIwOSwKLSAgICAweDlCMEEsIDB4OUIwQiwgMHg5QjBDLCAweDlCMEUsIDB4OUIxMCwgMHg5QjExLCAweDlCMTIsIDB4OUIxNCwKLSAgICAweDlCMTUsIDB4OUIxNiwgMHg5QjE3LCAweDlCMTgsIDB4OUIxOSwgMHg5QjFCLCAweDlCMUMsIDB4OUIxRCwKLSAgICAweDlCMUUsIDB4OUIyMCwgMHg5QjIxLCAweDlCMjQsIDB4OUIyNiwgMHg5QjI4LCAweDlCMkEsIDB4OUIyQiwKLSAgICAweDlCMkMsIDB4OUIyRCwgMHg5QjMwLCAweDlCMzMsIDB4OUIzNCwgMHg5QjM1LCAweDlCMzYsIDB4OUIzNywKLSAgICAweDlCMzgsIDB4OUIzOSwgMHg5QjNBLCAweDlCM0QsIDB4OUIzRSwgMHg5QjNGLCAweDlCNDAsIDB4OUI0NiwKLSAgICAweDlCNEEsIDB4OUI0QiwgMHg5QjRDLCAweDlCNTAsIDB4OUI1MiwgMHg5QjUzLCAweDlCNTUsIDB4OUI1NiwKLSAgICAweDlCNTcsIDB4OUI1OSwgMHg5QjVCLCAweDlCNUMsIDB4OUI1RCwgMHg5QjVFLCAweDlCNUYsIDB4OUI2MCwKLSAgICAweDlCNjEsIDB4OUI2MiwgMHg5QjYzLCAweDlCNjQsIDB4OUI2NSwgMHg5QjY2LCAweDlCNjcsIDB4OUI2OCwKLSAgICAweDlCNjksIDB4OUI2QSwgMHg5QjZCLCAweDlCNkMsIDB4OUI2RCwgMHg5QjZFLCAweDlCNzAsIDB4OUI3MSwKLSAgICAweDlCNzIsIDB4OUI3MywgMHg5Qjc1LCAweDlCNzYsIDB4OUI3OCwgMHg5Qjc5LCAweDlCN0EsIDB4OUI3QiwKLSAgICAweDlCN0MsIDB4OUI3RCwgMHg5QjdFLCAweDlCN0YsIDB4OUI4MCwgMHg5QjgyLCAweDlCODQsIDB4OUI4NSwKLSAgICAweDlCODYsIDB4OUI4NywgMHg5Qjg4LCAweDlCODksIDB4OUI4QSwgMHg5QjhCLCAweDlCOEMsIDB4OUI4RCwKLSAgICAweDlCOEYsIDB4OUI5MywgMHg5Qjk0LCAweDlCOTUsIDB4OUI5NiwgMHg5Qjk3LCAweDlCOTgsIDB4OUI5OSwKLSAgICAweDlCOUIsIDB4OUI5QywgMHg5QjlGLCAweDlCQTAsIDB4OUJBMSwgMHg5QkEyLCAweDlCQTMsIDB4OUJBNCwKLSAgICAweDlCQTUsIDB4OUJBNiwgMHg5QkE3LCAweDlCQTgsIDB4OUJBOSwgMHg5QkFDLCAweDlCQUYsIDB4OUJCMCwKLSAgICAweDlCQjEsIDB4OUJCMiwgMHg5QkIzLCAweDlCQjQsIDB4OUJCNSwgMHg5QkI2LCAweDlCQjcsIDB4OUJCOCwKLSAgICAweDlCQjksIDB4OUJCQSwgMHg5QkJCLCAweDlCQkMsIDB4OUJCRCwgMHg5QkJFLCAweDlCQkYsIDB4OUJDMiwKLSAgICAweDlCQzMsIDB4OUJDNCwgMHg5QkM1LCAweDlCQzYsIDB4OUJDOCwgMHg5QkNCLCAweDlCQ0MsIDB4OUJDRCwKLSAgICAweDlCQ0UsIDB4OUJDRiwgMHg5QkQwLCAweDlCRDEsIDB4OUJEMiwgMHg5QkQzLCAweDlCRDUsIDB4OUJENywKLSAgICAweDlCRDgsIDB4OUJEOSwgMHg5QkRBLCAweDlCREMsIDB4OUJERSwgMHg5QkRGLCAweDlCRTAsIDB4OUJFMywKLSAgICAweDlCRTUsIDB4OUJFNiwgMHg5QkU5LCAweDlCRUMsIDB4OUJFRCwgMHg5QkVFLCAweDlCRUYsIDB4OUJGMSwKLSAgICAweDlCRjIsIDB4OUJGMywgMHg5QkY1LCAweDlCRjYsIDB4OUJGNywgMHg5QkY4LCAweDlCRjksIDB4OUJGQSwKLSAgICAweDlCRkIsIDB4OUJGQywgMHg5QkZFLCAweDlDMDAsIDB4OUMwMSwgMHg5QzAyLCAweDlDMDMsIDB4OUMwNCwKLSAgICAweDlDMDUsIDB4OUMwNiwgMHg5QzA3LCAweDlDMEEsIDB4OUMwQiwgMHg5QzBDLCAweDlDMEUsIDB4OUMwRiwKLSAgICAweDlDMTEsIDB4OUMxNCwgMHg5QzE1LCAweDlDMTYsIDB4OUMxNywgMHg5QzE4LCAweDlDMTksIDB4OUMxQSwKLSAgICAweDlDMUIsIDB4OUMxQywgMHg5QzFELCAweDlDMUUsIDB4OUMxRiwgMHg5QzIxLCAweDlDMjIsIDB4OUMyNCwKLSAgICAweDlDMjYsIDB4OUMyNywgMHg5QzJBLCAweDlDMkIsIDB4OUMyQywgMHg5QzJFLCAweDlDMkYsIDB4OUMzMCwKLSAgICAweDlDMzQsIDB4OUMzNiwgMHg5QzM4LCAweDlDM0EsIDB4OUMzQywgMHg5QzNELCAweDlDM0YsIDB4OUM0MCwKLSAgICAweDlDNDEsIDB4OUM0MiwgMHg5QzQzLCAweDlDNDQsIDB4OUM0NiwgMHg5QzQ3LCAweDlDNEEsIDB4OUM0QiwKLSAgICAweDlDNEMsIDB4OUM0RCwgMHg5QzRFLCAweDlDNEYsIDB4OUM1MCwgMHg5QzUxLCAweDlDNTMsIDB4OUM1NSwKLSAgICAweDlDNTksIDB4OUM1QSwgMHg5QzVCLCAweDlDNUMsIDB4OUM1RSwgMHg5QzYwLCAweDlDNjEsIDB4OUM2MiwKLSAgICAweDlDNjMsIDB4OUM2NCwgMHg5QzY1LCAweDlDNjYsIDB4OUM2OCwgMHg5QzY5LCAweDlDNkEsIDB4OUM2QiwKLSAgICAweDlDNkMsIDB4OUM2RSwgMHg5QzZGLCAweDlDNzAsIDB4OUM3MSwgMHg5QzcyLCAweDlDNzMsIDB4OUM3NCwKLSAgICAweDlDNzUsIDB4OUM3NiwgMHg5Qzc3LCAweDlDNzksIDB4OUM3QiwgMHg5QzdELCAweDlDN0UsIDB4OUM4MCwKLSAgICAweDlDODMsIDB4OUM4NCwgMHg5Qzg5LCAweDlDOEEsIDB4OUM4QywgMHg5QzhGLCAweDlDOTMsIDB4OUM5NiwKLSAgICAweDlDOTcsIDB4OUM5OCwgMHg5Qzk5LCAweDlDOUQsIDB4OUNBQSwgMHg5Q0FDLCAweDlDQUYsIDB4OUNCOSwKLSAgICAweDlDQkUsIDB4OUNCRiwgMHg5Q0MwLCAweDlDQzEsIDB4OUNDMiwgMHg5Q0M4LCAweDlDQzksIDB4OUNEMSwKLSAgICAweDlDRDIsIDB4OUNEQSwgMHg5Q0RCLCAweDlDRTAsIDB4OUNFMSwgMHg5Q0UzLCAweDlDRTQsIDB4OUNFNiwKLSAgICAweDlDRTcsIDB4OUNFOCwgMHg5Q0VBLCAweDlDRUIsIDB4OUNFRCwgMHg5Q0VFLCAweDlDRUYsIDB4OUNGMCwKLSAgICAweDlDRjEsIDB4OUNGMiwgMHg5Q0Y1LCAweDlDRjcsIDB4OUNGOCwgMHg5Q0Y5LCAweDlDRkEsIDB4OUNGQiwKLSAgICAweDlDRkMsIDB4OUNGRCwgMHg5Q0ZFLCAweDlDRkYsIDB4OUQwMCwgMHg5RDAxLCAweDlEMDIsIDB4OUQwMywKLSAgICAweDlEMDQsIDB4OUQwNSwgMHg5RDA4LCAweDlEMEEsIDB4OUQwQiwgMHg5RDBDLCAweDlEMEQsIDB4OUQwRSwKLSAgICAweDlEMEYsIDB4OUQxMCwgMHg5RDExLCAweDlEMTIsIDB4OUQxMywgMHg5RDE0LCAweDlEMTYsIDB4OUQxNywKLSAgICAweDlEMTgsIDB4OUQxOSwgMHg5RDFBLCAweDlEMUMsIDB4OUQxRSwgMHg5RDIwLCAweDlEMjEsIDB4OUQyMiwKLSAgICAweDlEMjQsIDB4OUQyNSwgMHg5RDI3LCAweDlEMjksIDB4OUQyQSwgMHg5RDJCLCAweDlEMkMsIDB4OUQyRCwKLSAgICAweDlEMkUsIDB4OUQzMSwgMHg5RDMyLCAweDlEMzMsIDB4OUQzNCwgMHg5RDM1LCAweDlEMzYsIDB4OUQzNywKLSAgICAweDlEMzgsIDB4OUQzOSwgMHg5RDNBLCAweDlEM0MsIDB4OUQzRCwgMHg5RDNFLCAweDlENDAsIDB4OUQ0MSwKLSAgICAweDlENDMsIDB4OUQ0NCwgMHg5RDQ1LCAweDlENDYsIDB4OUQ0NywgMHg5RDQ4LCAweDlENDksIDB4OUQ0QSwKLSAgICAweDlENEIsIDB4OUQ0QywgMHg5RDRELCAweDlENEUsIDB4OUQ0RiwgMHg5RDUwLCAweDlENTQsIDB4OUQ1NSwKLSAgICAweDlENTYsIDB4OUQ1NywgMHg5RDU4LCAweDlENTksIDB4OUQ1QSwgMHg5RDVCLCAweDlENUUsIDB4OUQ1RiwKLSAgICAweDlENjIsIDB4OUQ2MywgMHg5RDY0LCAweDlENjUsIDB4OUQ2NiwgMHg5RDY3LCAweDlENjgsIDB4OUQ2OSwKLSAgICAweDlENkIsIDB4OUQ2RCwgMHg5RDZFLCAweDlENzAsIDB4OUQ3MSwgMHg5RDczLCAweDlENzQsIDB4OUQ3NSwKLSAgICAweDlENzYsIDB4OUQ3NywgMHg5RDc4LCAweDlENzksIDB4OUQ3QSwgMHg5RDdCLCAweDlEN0MsIDB4OUQ3RCwKLSAgICAweDlEN0UsIDB4OUQ3RiwgMHg5RDgwLCAweDlEODEsIDB4OUQ4MiwgMHg5RDgzLCAweDlEODQsIDB4OUQ4NSwKLSAgICAweDlEODYsIDB4OUQ4OCwgMHg5RDhBLCAweDlEOEIsIDB4OUQ4QywgMHg5RDhELCAweDlEOEUsIDB4OUQ4RiwKLSAgICAweDlEOTAsIDB4OUQ5MSwgMHg5RDkyLCAweDlEOTQsIDB4OUQ5NSwgMHg5RDk2LCAweDlEOTcsIDB4OUQ5OSwKLSAgICAweDlEOUIsIDB4OUQ5QywgMHg5RDlELCAweDlEOUUsIDB4OUQ5RiwgMHg5REEwLCAweDlEQTEsIDB4OURBMiwKLSAgICAweDlEQTMsIDB4OURBNCwgMHg5REE2LCAweDlEQTcsIDB4OURBOCwgMHg5REFBLCAweDlEQUIsIDB4OURBQywKLSAgICAweDlEQUQsIDB4OURBRSwgMHg5REIwLCAweDlEQjEsIDB4OURCMiwgMHg5REIzLCAweDlEQjUsIDB4OURCNiwKLSAgICAweDlEQjcsIDB4OURCOCwgMHg5REI5LCAweDlEQkEsIDB4OURCRCwgMHg5REJFLCAweDlEQkYsIDB4OURDMSwKLSAgICAweDlEQzMsIDB4OURDNSwgMHg5REM2LCAweDlEQzcsIDB4OURDOCwgMHg5REM5LCAweDlEQ0EsIDB4OURDQiwKLSAgICAweDlEQ0MsIDB4OURDRCwgMHg5RENFLCAweDlEQ0YsIDB4OUREMCwgMHg5REQxLCAweDlERDIsIDB4OURENCwKLSAgICAweDlERDUsIDB4OURENiwgMHg5REQ4LCAweDlEREIsIDB4OUREQywgMHg5RERELCAweDlEREUsIDB4OURERiwKLSAgICAweDlERTAsIDB4OURFMSwgMHg5REUyLCAweDlERTMsIDB4OURFNCwgMHg5REU3LCAweDlERTgsIDB4OURFOSwKLSAgICAweDlERUEsIDB4OURFQiwgMHg5REVDLCAweDlERUQsIDB4OURFRSwgMHg5REYwLCAweDlERjEsIDB4OURGNCwKLSAgICAweDlERjUsIDB4OURGNiwgMHg5REY3LCAweDlERkIsIDB4OURGQywgMHg5REZELCAweDlERkUsIDB4OURGRiwKLSAgICAweDlFMDAsIDB4OUUwMSwgMHg5RTAyLCAweDlFMDMsIDB4OUUwNCwgMHg5RTA1LCAweDlFMDYsIDB4OUUwNywKLSAgICAweDlFMDgsIDB4OUUwOSwgMHg5RTBBLCAweDlFMEIsIDB4OUUwRCwgMHg5RTBFLCAweDlFMEYsIDB4OUUxMCwKLSAgICAweDlFMTEsIDB4OUUxMiwgMHg5RTEzLCAweDlFMTQsIDB4OUUxNiwgMHg5RTE3LCAweDlFMTgsIDB4OUUxOSwKLSAgICAweDlFMUMsIDB4OUUyNCwgMHg5RTI3LCAweDlFMkUsIDB4OUUzMCwgMHg5RTM0LCAweDlFM0IsIDB4OUUzQywKLSAgICAweDlFNDAsIDB4OUU0RCwgMHg5RTUwLCAweDlFNTIsIDB4OUU1MywgMHg5RTU0LCAweDlFNTYsIDB4OUU1OSwKLSAgICAweDlFNUQsIDB4OUU1RiwgMHg5RTYwLCAweDlFNjEsIDB4OUU2MiwgMHg5RTY1LCAweDlFNkUsIDB4OUU2RiwKLSAgICAweDlFNzIsIDB4OUU3NCwgMHg5RTc2LCAweDlFNzcsIDB4OUU3OCwgMHg5RTdCLCAweDlFODAsIDB4OUU4MSwKLSAgICAweDlFODMsIDB4OUU4NCwgMHg5RTg1LCAweDlFODYsIDB4OUU4OSwgMHg5RThBLCAweDlFOEMsIDB4OUU4RCwKLSAgICAweDlFOEUsIDB4OUU4RiwgMHg5RTkwLCAweDlFOTEsIDB4OUU5NCwgMHg5RTk1LCAweDlFOTYsIDB4OUU5OCwKLSAgICAweDlFOTksIDB4OUU5QSwgMHg5RTlCLCAweDlFOUMsIDB4OUU5RSwgMHg5RUEwLCAweDlFQTEsIDB4OUVBMiwKLSAgICAweDlFQTMsIDB4OUVBNCwgMHg5RUE3LCAweDlFQTgsIDB4OUVBQSwgMHg5RUFCLCAweDlFQUMsIDB4OUVBRCwKLSAgICAweDlFQUUsIDB4OUVCMCwgMHg5RUIxLCAweDlFQjIsIDB4OUVCMywgMHg5RUI2LCAweDlFQjcsIDB4OUVCOSwKLSAgICAweDlFQkEsIDB4OUVCQywgMHg5RUJGLCAweDlFQzAsIDB4OUVDMSwgMHg5RUMyLCAweDlFQzMsIDB4OUVDNSwKLSAgICAweDlFQzYsIDB4OUVDNywgMHg5RUM4LCAweDlFQ0EsIDB4OUVDQiwgMHg5RUQwLCAweDlFRDIsIDB4OUVEMywKLSAgICAweDlFRDUsIDB4OUVENiwgMHg5RUQ3LCAweDlFRDksIDB4OUVEQSwgMHg5RUUxLCAweDlFRTMsIDB4OUVFNCwKLSAgICAweDlFRTYsIDB4OUVFQiwgMHg5RUVDLCAweDlFRUQsIDB4OUVFRSwgMHg5RUYwLCAweDlFRjEsIDB4OUVGMywKLSAgICAweDlFRjUsIDB4OUVGNiwgMHg5RUY4LCAweDlFRkEsIDB4OUYwMCwgMHg5RjAxLCAweDlGMDIsIDB4OUYwMywKLSAgICAweDlGMDQsIDB4OUYwNSwgMHg5RjA2LCAweDlGMDcsIDB4OUYwOCwgMHg5RjBBLCAweDlGMEMsIDB4OUYwRiwKLSAgICAweDlGMTEsIDB4OUYxMiwgMHg5RjE0LCAweDlGMTYsIDB4OUYxOCwgMHg5RjFBLCAweDlGMUIsIDB4OUYxQywKLSAgICAweDlGMUQsIDB4OUYxRSwgMHg5RjFGLCAweDlGMjEsIDB4OUYyMywgMHg5RjI0LCAweDlGMjUsIDB4OUYyNiwKLSAgICAweDlGMjcsIDB4OUYyOCwgMHg5RjI5LCAweDlGMkEsIDB4OUYyQiwgMHg5RjJELCAweDlGMkUsIDB4OUYzMCwKLSAgICAweDlGMzEsIDB4OUYzMiwgMHg5RjMzLCAweDlGMzQsIDB4OUYzNSwgMHg5RjM2LCAweDlGMzgsIDB4OUYzQSwKLSAgICAweDlGM0MsIDB4OUYzRiwgMHg5RjQwLCAweDlGNDEsIDB4OUY0MiwgMHg5RjQzLCAweDlGNDUsIDB4OUY0NiwKLSAgICAweDlGNDcsIDB4OUY0OCwgMHg5RjQ5LCAweDlGNEMsIDB4OUY0RCwgMHg5RjRFLCAweDlGNTMsIDB4OUY1NSwKLSAgICAweDlGNTYsIDB4OUY1NywgMHg5RjU4LCAweDlGNUEsIDB4OUY1QiwgMHg5RjVELCAweDlGNUUsIDB4OUY2MiwKLSAgICAweDlGNjQsIDB4OUY2NSwgMHg5RjY3LCAweDlGNjgsIDB4OUY2OSwgMHg5RjZCLCAweDlGNkQsIDB4OUY2RSwKLSAgICAweDlGNkYsIDB4OUY3MCwgMHg5RjcxLCAweDlGNzMsIDB4OUY3NCwgMHg5Rjc1LCAweDlGNzYsIDB4OUY3OCwKLSAgICAweDlGNzksIDB4OUY3QSwgMHg5RjdCLCAweDlGN0MsIDB4OUY3RCwgMHg5RjdFLCAweDlGODEsIDB4OUY4MiwKLSAgICAweDlGOEUsIDB4OUY4RiwgMHg5RjkxLCAweDlGOTIsIDB4OUY5MywgMHg5Rjk2LCAweDlGOTcsIDB4OUY5OCwKLSAgICAweDlGOUQsIDB4OUY5RSwgMHg5RkExLCAweDlGQTIsIDB4OUZBMywgMHg5RkE0LCAweDlGQTUsIDB4RjkyQywKLSAgICAweEZBMEQsIDB4RkEwRSwgMHhGQTBGLCAweEZBMTEsIDB4RkExMywgMHhGQTE0LCAweEZBMTgsIDB4RkExRiwKLSAgICAweEZBMjAsIDB4RkEyMSwgMHhGQTIzLCAweEZBMjQsIDB4RkEyNywgMHhGQTI4LCAweEZBMjksIDB4MkU4MSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDJFODQsIDB4MzQ3MywgMHgzNDQ3LCAweDJFODgsIDB4MkU4QiwKLSAgICAweDlGQjQsIDB4MzU5RSwgMHgzNjFBLCAweDM2MEUsIDB4MkU4QywgMHgyRTk3LCAweDM5NkUsIDB4MzkxOCwKLSAgICAweDlGQjUsIDB4MzlDRiwgMHgzOURGLCAweDNBNzMsIDB4MzlEMCwgMHg5RkI2LCAweDlGQjcsIDB4M0I0RSwKLSAgICAweDNDNkUsIDB4M0NFMCwgMHgyRUE3LCAweDAwMDAsIDB4OUZCOCwgMHgyRUFBLCAweDQwNTYsIDB4NDE1RiwKLSAgICAweDJFQUUsIDB4NDMzNywgMHgyRUIzLCAweDJFQjYsIDB4MkVCNywgMHgwMDAwLCAweDQzQjEsIDB4NDNBQywKLSAgICAweDJFQkIsIDB4NDNERCwgMHg0NEQ2LCAweDQ2NjEsIDB4NDY0QywgMHg5RkI5LCAweDQ3MjMsIDB4NDcyOSwKLSAgICAweDQ3N0MsIDB4NDc4RCwgMHgyRUNBLCAweDQ5NDcsIDB4NDk3QSwgMHg0OTdELCAweDQ5ODIsIDB4NDk4MywKLSAgICAweDQ5ODUsIDB4NDk4NiwgMHg0OTlGLCAweDQ5OUIsIDB4NDlCNywgMHg0OUI2LCAweDlGQkEsIDB4MDAwMCwKLSAgICAweDRDQTMsIDB4NEM5RiwgMHg0Q0EwLCAweDRDQTEsIDB4NEM3NywgMHg0Q0EyLCAweDREMTMsIDB4NEQxNCwKLSAgICAweDREMTUsIDB4NEQxNiwgMHg0RDE3LCAweDREMTgsIDB4NEQxOSwgMHg0REFFLCAweDlGQkIsIDB4MDAyMCwKLSAgICAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwKLSAgICAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwKLSAgICAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwKLSAgICAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwKLSAgICAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwKLSAgICAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwKLSAgICAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwKLSAgICAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwKLSAgICAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwKLSAgICAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwKLSAgICAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwKLSAgICAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLCAweDAwRkMsIDB4MDBBOSwKLSAgICAweDIxMjIsIDB4MjAyNiwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwKLSAgICAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwKLSAgICAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwKLSAgICAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwKLSAgICAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwKLSAgICAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwKLSAgICAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwKLSAgICAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsIDB4MDA1RSwKLSAgICAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwKLSAgICAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwKLSAgICAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwKLSAgICAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwKLSAgICAweDAxMDEsIDB4MDBFMSwgMHgwMUNFLCAweDAwRTAsIDB4MDExMywgMHgwMEU5LCAweDAxMUIsIDB4MDBFOCwKLSAgICAweDAxMkIsIDB4MDBFRCwgMHgwMUQwLCAweDAwRUMsIDB4MDE0RCwgMHgwMEYzLCAweDAxRDIsIDB4MDBGMiwKLSAgICAweDAxNkIsIDB4MDBGQSwgMHgwMUQ0LCAweDAwRjksIDB4MDFENiwgMHgwMUQ4LCAweDAxREEsIDB4MDFEQywKLSAgICAweDAwRkMsIDB4MDBFQSwgMHgwMjUxLCAweDFFM0YsIDB4MDE0NCwgMHgwMTQ4LCAweDAxRjksIDB4MDI2MSwKLSAgICAweDAwMjAsIDB4MjBBQywgMHgwMEE1LCAweDIwQUMsIDB4MDAyNCwgMHgzMDNGLCAweDIwQUMsIDB4MzA0MSwKLSAgICAweDMwNDcsIDB4MzA0MywgMHgzMDRCLCAweDMwNEIsIDB4MzA1MSwgMHgzMDUxLCAweDMwNTMsIDB4MzA1MywKLSAgICAweDMwNDksIDB4MzA2NCwgMHgzMDQ1LCAweDMwOEUsIDB4MzA4MywgMHgzMDg3LCAweDMwODUsIDB4MzA5NCwKLSAgICAweDMwQTEsIDB4MzBBNywgMHgzMEEzLCAweDMwRjUsIDB4MzBGNiwgMHgzMEIzLCAweDMwQjMsIDB4MzBBOSwKLSAgICAweDMwQzMsIDB4MzBBNSwgMHgzMEVFLCAweDMwRTMsIDB4MzBFNywgMHgzMEU1LCAweDMwRjcsIDB4MzBGOSwKLSAgICAweDMwRjgsIDB4MzBGQSwgMHgzMEZDLCAweDMwMzMsIDB4MzAzNCwgMHgzMDM1LCAweDMwMzgsIDB4MzAzOSwKLSAgICAweDMwM0EsIDB4MzEyQSwgMHgzMTJCLCAweDMxMkMsIDB4MzFBMCwgMHgzMUExLCAweDMxQTIsIDB4MzFBMywKLSAgICAweDMxQTQsIDB4MzFBNSwgMHgzMUE2LCAweDMxQTcsIDB4MzFBOCwgMHgzMUE5LCAweDMxQUEsIDB4MzFBQiwKLSAgICAweDMxQUMsIDB4MzFBRCwgMHgzMUFFLCAweDMxQUYsIDB4MzFCMCwgMHgzMUIxLCAweDMxQjIsIDB4MzFCMywKLSAgICAweDMxQjQsIDB4MzFCNSwgMHgzMUI2LCAweDMxQjcsIDB4MkU4MCwgMHgyRTgyLCAweDJFODMsIDB4MkU4NSwKLSAgICAweDJFODYsIDB4MkU4NywgMHgyRTg5LCAweDJFOEEsIDB4MkU4RCwgMHgyRThFLCAweDJFOEYsIDB4MkU5MCwKLSAgICAweDJFOTEsIDB4MkU5MiwgMHgyRTkzLCAweDJFOTQsIDB4MkU5NSwgMHgyRTk2LCAweDJFOTgsIDB4MkU5OSwKLSAgICAweDJFOUIsIDB4MkU5QywgMHgyRTlELCAweDJFOUUsIDB4MkU5RiwgMHgyRUEwLCAweDJFQTEsIDB4MkVBMiwKLSAgICAweDJFQTMsIDB4MkVBNCwgMHgyRUE1LCAweDJFQTYsIDB4MkVBOCwgMHgyRUE5LCAweDJFQUIsIDB4MkVBQywKLSAgICAweDJFQUQsIDB4MkVBRiwgMHgyRUIwLCAweDJFQjEsIDB4MkVCMiwgMHgyRUI0LCAweDJFQjUsIDB4MkVCOCwKLSAgICAweDJFQjksIDB4MkVCQSwgMHgyRUJDLCAweDJFQkQsIDB4MkVCRSwgMHgyRUJGLCAweDJFQzAsIDB4MkVDMSwKLSAgICAweDJFQzIsIDB4MkVDMywgMHgyRUM0LCAweDJFQzUsIDB4MkVDNiwgMHgyRUM3LCAweDJFQzgsIDB4MkVDOSwKLSAgICAweDJFQ0IsIDB4MkVDQywgMHgyRUNELCAweDJFQ0UsIDB4MkVDRiwgMHgyRUQwLCAweDJFRDEsIDB4MkVEMiwKLSAgICAweDJFRDMsIDB4MkVENCwgMHgyRUQ1LCAweDJFRDYsIDB4MkVENywgMHgyRUQ4LCAweDJFRDksIDB4MkVEQSwKLSAgICAweDJFREIsIDB4MkVEQywgMHgyRURELCAweDJFREUsIDB4MkVERiwgMHgyRUUwLCAweDJFRTEsIDB4MkVFMiwKLSAgICAweDJFRTMsIDB4MkVFNCwgMHgyRUU1LCAweDJFRTYsIDB4MkVFNywgMHgyRUU4LCAweDJFRTksIDB4MkVFQSwKLSAgICAweDJFRUIsIDB4MkVFQywgMHgyRUVELCAweDJFRUUsIDB4MkVFRiwgMHgyRUYwLCAweDJFRjEsIDB4MkVGMiwKLSAgICAweDJFRjMsIDB4MzQwMCwgMHgzNDAxLCAweDM0MDIsIDB4MzQwMywgMHgzNDA0LCAweDM0MDUsIDB4MzQwNiwKLSAgICAweDM0MDcsIDB4MzQwOCwgMHgzNDA5LCAweDM0MEEsIDB4MzQwQiwgMHgzNDBDLCAweDM0MEQsIDB4MzQwRSwKLSAgICAweDM0MEYsIDB4MzQxMCwgMHgzNDExLCAweDM0MTIsIDB4MzQxMywgMHgzNDE0LCAweDM0MTUsIDB4MzQxNiwKLSAgICAweDM0MTcsIDB4MzQxOCwgMHgzNDE5LCAweDM0MUEsIDB4MzQxQiwgMHgzNDFDLCAweDM0MUQsIDB4MzQxRSwKLSAgICAweDM0MUYsIDB4MzQyMCwgMHgzNDIxLCAweDM0MjIsIDB4MzQyMywgMHgzNDI0LCAweDM0MjUsIDB4MzQyNiwKLSAgICAweDM0MjcsIDB4MzQyOCwgMHgzNDI5LCAweDM0MkEsIDB4MzQyQiwgMHgzNDJDLCAweDM0MkQsIDB4MzQyRSwKLSAgICAweDM0MkYsIDB4MzQzMCwgMHgzNDMxLCAweDM0MzIsIDB4MzQzMywgMHgzNDM0LCAweDM0MzUsIDB4MzQzNiwKLSAgICAweDM0MzcsIDB4MzQzOCwgMHgzNDM5LCAweDM0M0EsIDB4MzQzQiwgMHgzNDNDLCAweDM0M0QsIDB4MzQzRSwKLSAgICAweDM0M0YsIDB4MzQ0MCwgMHgzNDQxLCAweDM0NDIsIDB4MzQ0MywgMHgzNDQ0LCAweDM0NDUsIDB4MzQ0NiwKLSAgICAweDM0NDgsIDB4MzQ0OSwgMHgzNDRBLCAweDM0NEIsIDB4MzQ0QywgMHgzNDRELCAweDM0NEUsIDB4MzQ0RiwKLSAgICAweDM0NTAsIDB4MzQ1MSwgMHgzNDUyLCAweDM0NTMsIDB4MzQ1NCwgMHgzNDU1LCAweDM0NTYsIDB4MzQ1NywKLSAgICAweDM0NTgsIDB4MzQ1OSwgMHgzNDVBLCAweDM0NUIsIDB4MzQ1QywgMHgzNDVELCAweDM0NUUsIDB4MzQ1RiwKLSAgICAweDM0NjAsIDB4MzQ2MSwgMHgzNDYyLCAweDM0NjMsIDB4MzQ2NCwgMHgzNDY1LCAweDM0NjYsIDB4MzQ2NywKLSAgICAweDM0NjgsIDB4MzQ2OSwgMHgzNDZBLCAweDM0NkIsIDB4MzQ2QywgMHgzNDZELCAweDM0NkUsIDB4MzQ2RiwKLSAgICAweDM0NzAsIDB4MzQ3MSwgMHgzNDcyLCAweDM0NzQsIDB4MzQ3NSwgMHgzNDc2LCAweDM0NzcsIDB4MzQ3OCwKLSAgICAweDM0NzksIDB4MzQ3QSwgMHgzNDdCLCAweDM0N0MsIDB4MzQ3RCwgMHgzNDdFLCAweDM0N0YsIDB4MzQ4MCwKLSAgICAweDM0ODEsIDB4MzQ4MiwgMHgzNDgzLCAweDM0ODQsIDB4MzQ4NSwgMHgzNDg2LCAweDM0ODcsIDB4MzQ4OCwKLSAgICAweDM0ODksIDB4MzQ4QSwgMHgzNDhCLCAweDM0OEMsIDB4MzQ4RCwgMHgzNDhFLCAweDM0OEYsIDB4MzQ5MCwKLSAgICAweDM0OTEsIDB4MzQ5MiwgMHgzNDkzLCAweDM0OTQsIDB4MzQ5NSwgMHgzNDk2LCAweDM0OTcsIDB4MzQ5OCwKLSAgICAweDM0OTksIDB4MzQ5QSwgMHgzNDlCLCAweDM0OUMsIDB4MzQ5RCwgMHgzNDlFLCAweDM0OUYsIDB4MzRBMCwKLSAgICAweDM0QTEsIDB4MzRBMiwgMHgzNEEzLCAweDM0QTQsIDB4MzRBNSwgMHgzNEE2LCAweDM0QTcsIDB4MzRBOCwKLSAgICAweDM0QTksIDB4MzRBQSwgMHgzNEFCLCAweDM0QUMsIDB4MzRBRCwgMHgzNEFFLCAweDM0QUYsIDB4MzRCMCwKLSAgICAweDM0QjEsIDB4MzRCMiwgMHgzNEIzLCAweDM0QjQsIDB4MzRCNSwgMHgzNEI2LCAweDM0QjcsIDB4MzRCOCwKLSAgICAweDM0QjksIDB4MzRCQSwgMHgzNEJCLCAweDM0QkMsIDB4MzRCRCwgMHgzNEJFLCAweDM0QkYsIDB4MzRDMCwKLSAgICAweDM0QzEsIDB4MzRDMiwgMHgzNEMzLCAweDM0QzQsIDB4MzRDNSwgMHgzNEM2LCAweDM0QzcsIDB4MzRDOCwKLSAgICAweDM0QzksIDB4MzRDQSwgMHgzNENCLCAweDM0Q0MsIDB4MzRDRCwgMHgzNENFLCAweDM0Q0YsIDB4MzREMCwKLSAgICAweDM0RDEsIDB4MzREMiwgMHgzNEQzLCAweDM0RDQsIDB4MzRENSwgMHgzNEQ2LCAweDM0RDcsIDB4MzREOCwKLSAgICAweDM0RDksIDB4MzREQSwgMHgzNERCLCAweDM0REMsIDB4MzRERCwgMHgzNERFLCAweDM0REYsIDB4MzRFMCwKLSAgICAweDM0RTEsIDB4MzRFMiwgMHgzNEUzLCAweDM0RTQsIDB4MzRFNSwgMHgzNEU2LCAweDM0RTcsIDB4MzRFOCwKLSAgICAweDM0RTksIDB4MzRFQSwgMHgzNEVCLCAweDM0RUMsIDB4MzRFRCwgMHgzNEVFLCAweDM0RUYsIDB4MzRGMCwKLSAgICAweDM0RjEsIDB4MzRGMiwgMHgzNEYzLCAweDM0RjQsIDB4MzRGNSwgMHgzNEY2LCAweDM0RjcsIDB4MzRGOCwKLSAgICAweDM0RjksIDB4MzRGQSwgMHgzNEZCLCAweDM0RkMsIDB4MzRGRCwgMHgzNEZFLCAweDM0RkYsIDB4MzUwMCwKLSAgICAweDM1MDEsIDB4MzUwMiwgMHgzNTAzLCAweDM1MDQsIDB4MzUwNSwgMHgzNTA2LCAweDM1MDcsIDB4MzUwOCwKLSAgICAweDM1MDksIDB4MzUwQSwgMHgzNTBCLCAweDM1MEMsIDB4MzUwRCwgMHgzNTBFLCAweDM1MEYsIDB4MzUxMCwKLSAgICAweDM1MTEsIDB4MzUxMiwgMHgzNTEzLCAweDM1MTQsIDB4MzUxNSwgMHgzNTE2LCAweDM1MTcsIDB4MzUxOCwKLSAgICAweDM1MTksIDB4MzUxQSwgMHgzNTFCLCAweDM1MUMsIDB4MzUxRCwgMHgzNTFFLCAweDM1MUYsIDB4MzUyMCwKLSAgICAweDM1MjEsIDB4MzUyMiwgMHgzNTIzLCAweDM1MjQsIDB4MzUyNSwgMHgzNTI2LCAweDM1MjcsIDB4MzUyOCwKLSAgICAweDM1MjksIDB4MzUyQSwgMHgzNTJCLCAweDM1MkMsIDB4MzUyRCwgMHgzNTJFLCAweDM1MkYsIDB4MzUzMCwKLSAgICAweDM1MzEsIDB4MzUzMiwgMHgzNTMzLCAweDM1MzQsIDB4MzUzNSwgMHgzNTM2LCAweDM1MzcsIDB4MzUzOCwKLSAgICAweDM1MzksIDB4MzUzQSwgMHgzNTNCLCAweDM1M0MsIDB4MzUzRCwgMHgzNTNFLCAweDM1M0YsIDB4MzU0MCwKLSAgICAweDM1NDEsIDB4MzU0MiwgMHgzNTQzLCAweDM1NDQsIDB4MzU0NSwgMHgzNTQ2LCAweDM1NDcsIDB4MzU0OCwKLSAgICAweDM1NDksIDB4MzU0QSwgMHgzNTRCLCAweDM1NEMsIDB4MzU0RCwgMHgzNTRFLCAweDM1NEYsIDB4MzU1MCwKLSAgICAweDM1NTEsIDB4MzU1MiwgMHgzNTUzLCAweDM1NTQsIDB4MzU1NSwgMHgzNTU2LCAweDM1NTcsIDB4MzU1OCwKLSAgICAweDM1NTksIDB4MzU1QSwgMHgzNTVCLCAweDM1NUMsIDB4MzU1RCwgMHgzNTVFLCAweDM1NUYsIDB4MzU2MCwKLSAgICAweDM1NjEsIDB4MzU2MiwgMHgzNTYzLCAweDM1NjQsIDB4MzU2NSwgMHgzNTY2LCAweDM1NjcsIDB4MzU2OCwKLSAgICAweDM1NjksIDB4MzU2QSwgMHgzNTZCLCAweDM1NkMsIDB4MzU2RCwgMHgzNTZFLCAweDM1NkYsIDB4MzU3MCwKLSAgICAweDM1NzEsIDB4MzU3MiwgMHgzNTczLCAweDM1NzQsIDB4MzU3NSwgMHgzNTc2LCAweDM1NzcsIDB4MzU3OCwKLSAgICAweDM1NzksIDB4MzU3QSwgMHgzNTdCLCAweDM1N0MsIDB4MzU3RCwgMHgzNTdFLCAweDM1N0YsIDB4MzU4MCwKLSAgICAweDM1ODEsIDB4MzU4MiwgMHgzNTgzLCAweDM1ODQsIDB4MzU4NSwgMHgzNTg2LCAweDM1ODcsIDB4MzU4OCwKLSAgICAweDM1ODksIDB4MzU4QSwgMHgzNThCLCAweDM1OEMsIDB4MzU4RCwgMHgzNThFLCAweDM1OEYsIDB4MzU5MCwKLSAgICAweDM1OTEsIDB4MzU5MiwgMHgzNTkzLCAweDM1OTQsIDB4MzU5NSwgMHgzNTk2LCAweDM1OTcsIDB4MzU5OCwKLSAgICAweDM1OTksIDB4MzU5QSwgMHgzNTlCLCAweDM1OUMsIDB4MzU5RCwgMHgzNTlGLCAweDM1QTAsIDB4MzVBMSwKLSAgICAweDM1QTIsIDB4MzVBMywgMHgzNUE0LCAweDM1QTUsIDB4MzVBNiwgMHgzNUE3LCAweDM1QTgsIDB4MzVBOSwKLSAgICAweDM1QUEsIDB4MzVBQiwgMHgzNUFDLCAweDM1QUQsIDB4MzVBRSwgMHgzNUFGLCAweDM1QjAsIDB4MzVCMSwKLSAgICAweDM1QjIsIDB4MzVCMywgMHgzNUI0LCAweDM1QjUsIDB4MzVCNiwgMHgzNUI3LCAweDM1QjgsIDB4MzVCOSwKLSAgICAweDM1QkEsIDB4MzVCQiwgMHgzNUJDLCAweDM1QkQsIDB4MzVCRSwgMHgzNUJGLCAweDM1QzAsIDB4MzVDMSwKLSAgICAweDM1QzIsIDB4MzVDMywgMHgzNUM0LCAweDM1QzUsIDB4MzVDNiwgMHgzNUM3LCAweDM1QzgsIDB4MzVDOSwKLSAgICAweDM1Q0EsIDB4MzVDQiwgMHgzNUNDLCAweDM1Q0QsIDB4MzVDRSwgMHgzNUNGLCAweDM1RDAsIDB4MzVEMSwKLSAgICAweDM1RDIsIDB4MzVEMywgMHgzNUQ0LCAweDM1RDUsIDB4MzVENiwgMHgzNUQ3LCAweDM1RDgsIDB4MzVEOSwKLSAgICAweDM1REEsIDB4MzVEQiwgMHgzNURDLCAweDM1REQsIDB4MzVERSwgMHgzNURGLCAweDM1RTAsIDB4MzVFMSwKLSAgICAweDM1RTIsIDB4MzVFMywgMHgzNUU0LCAweDM1RTUsIDB4MzVFNiwgMHgzNUU3LCAweDM1RTgsIDB4MzVFOSwKLSAgICAweDM1RUEsIDB4MzVFQiwgMHgzNUVDLCAweDM1RUQsIDB4MzVFRSwgMHgzNUVGLCAweDM1RjAsIDB4MzVGMSwKLSAgICAweDM1RjIsIDB4MzVGMywgMHgzNUY0LCAweDM1RjUsIDB4MzVGNiwgMHgzNUY3LCAweDM1RjgsIDB4MzVGOSwKLSAgICAweDM1RkEsIDB4MzVGQiwgMHgzNUZDLCAweDM1RkQsIDB4MzVGRSwgMHgzNUZGLCAweDM2MDAsIDB4MzYwMSwKLSAgICAweDM2MDIsIDB4MzYwMywgMHgzNjA0LCAweDM2MDUsIDB4MzYwNiwgMHgzNjA3LCAweDM2MDgsIDB4MzYwOSwKLSAgICAweDM2MEEsIDB4MzYwQiwgMHgzNjBDLCAweDM2MEQsIDB4MzYwRiwgMHgzNjEwLCAweDM2MTEsIDB4MzYxMiwKLSAgICAweDM2MTMsIDB4MzYxNCwgMHgzNjE1LCAweDM2MTYsIDB4MzYxNywgMHgzNjE4LCAweDM2MTksIDB4MzYxQiwKLSAgICAweDM2MUMsIDB4MzYxRCwgMHgzNjFFLCAweDM2MUYsIDB4MzYyMCwgMHgzNjIxLCAweDM2MjIsIDB4MzYyMywKLSAgICAweDM2MjQsIDB4MzYyNSwgMHgzNjI2LCAweDM2MjcsIDB4MzYyOCwgMHgzNjI5LCAweDM2MkEsIDB4MzYyQiwKLSAgICAweDM2MkMsIDB4MzYyRCwgMHgzNjJFLCAweDM2MkYsIDB4MzYzMCwgMHgzNjMxLCAweDM2MzIsIDB4MzYzMywKLSAgICAweDM2MzQsIDB4MzYzNSwgMHgzNjM2LCAweDM2MzcsIDB4MzYzOCwgMHgzNjM5LCAweDM2M0EsIDB4MzYzQiwKLSAgICAweDM2M0MsIDB4MzYzRCwgMHgzNjNFLCAweDM2M0YsIDB4MzY0MCwgMHgzNjQxLCAweDM2NDIsIDB4MzY0MywKLSAgICAweDM2NDQsIDB4MzY0NSwgMHgzNjQ2LCAweDM2NDcsIDB4MzY0OCwgMHgzNjQ5LCAweDM2NEEsIDB4MzY0QiwKLSAgICAweDM2NEMsIDB4MzY0RCwgMHgzNjRFLCAweDM2NEYsIDB4MzY1MCwgMHgzNjUxLCAweDM2NTIsIDB4MzY1MywKLSAgICAweDM2NTQsIDB4MzY1NSwgMHgzNjU2LCAweDM2NTcsIDB4MzY1OCwgMHgzNjU5LCAweDM2NUEsIDB4MzY1QiwKLSAgICAweDM2NUMsIDB4MzY1RCwgMHgzNjVFLCAweDM2NUYsIDB4MzY2MCwgMHgzNjYxLCAweDM2NjIsIDB4MzY2MywKLSAgICAweDM2NjQsIDB4MzY2NSwgMHgzNjY2LCAweDM2NjcsIDB4MzY2OCwgMHgzNjY5LCAweDM2NkEsIDB4MzY2QiwKLSAgICAweDM2NkMsIDB4MzY2RCwgMHgzNjZFLCAweDM2NkYsIDB4MzY3MCwgMHgzNjcxLCAweDM2NzIsIDB4MzY3MywKLSAgICAweDM2NzQsIDB4MzY3NSwgMHgzNjc2LCAweDM2NzcsIDB4MzY3OCwgMHgzNjc5LCAweDM2N0EsIDB4MzY3QiwKLSAgICAweDM2N0MsIDB4MzY3RCwgMHgzNjdFLCAweDM2N0YsIDB4MzY4MCwgMHgzNjgxLCAweDM2ODIsIDB4MzY4MywKLSAgICAweDM2ODQsIDB4MzY4NSwgMHgzNjg2LCAweDM2ODcsIDB4MzY4OCwgMHgzNjg5LCAweDM2OEEsIDB4MzY4QiwKLSAgICAweDM2OEMsIDB4MzY4RCwgMHgzNjhFLCAweDM2OEYsIDB4MzY5MCwgMHgzNjkxLCAweDM2OTIsIDB4MzY5MywKLSAgICAweDM2OTQsIDB4MzY5NSwgMHgzNjk2LCAweDM2OTcsIDB4MzY5OCwgMHgzNjk5LCAweDM2OUEsIDB4MzY5QiwKLSAgICAweDM2OUMsIDB4MzY5RCwgMHgzNjlFLCAweDM2OUYsIDB4MzZBMCwgMHgzNkExLCAweDM2QTIsIDB4MzZBMywKLSAgICAweDM2QTQsIDB4MzZBNSwgMHgzNkE2LCAweDM2QTcsIDB4MzZBOCwgMHgzNkE5LCAweDM2QUEsIDB4MzZBQiwKLSAgICAweDM2QUMsIDB4MzZBRCwgMHgzNkFFLCAweDM2QUYsIDB4MzZCMCwgMHgzNkIxLCAweDM2QjIsIDB4MzZCMywKLSAgICAweDM2QjQsIDB4MzZCNSwgMHgzNkI2LCAweDM2QjcsIDB4MzZCOCwgMHgzNkI5LCAweDM2QkEsIDB4MzZCQiwKLSAgICAweDM2QkMsIDB4MzZCRCwgMHgzNkJFLCAweDM2QkYsIDB4MzZDMCwgMHgzNkMxLCAweDM2QzIsIDB4MzZDMywKLSAgICAweDM2QzQsIDB4MzZDNSwgMHgzNkM2LCAweDM2QzcsIDB4MzZDOCwgMHgzNkM5LCAweDM2Q0EsIDB4MzZDQiwKLSAgICAweDM2Q0MsIDB4MzZDRCwgMHgzNkNFLCAweDM2Q0YsIDB4MzZEMCwgMHgzNkQxLCAweDM2RDIsIDB4MzZEMywKLSAgICAweDM2RDQsIDB4MzZENSwgMHgzNkQ2LCAweDM2RDcsIDB4MzZEOCwgMHgzNkQ5LCAweDM2REEsIDB4MzZEQiwKLSAgICAweDM2REMsIDB4MzZERCwgMHgzNkRFLCAweDM2REYsIDB4MzZFMCwgMHgzNkUxLCAweDM2RTIsIDB4MzZFMywKLSAgICAweDM2RTQsIDB4MzZFNSwgMHgzNkU2LCAweDM2RTcsIDB4MzZFOCwgMHgzNkU5LCAweDM2RUEsIDB4MzZFQiwKLSAgICAweDM2RUMsIDB4MzZFRCwgMHgzNkVFLCAweDM2RUYsIDB4MzZGMCwgMHgzNkYxLCAweDM2RjIsIDB4MzZGMywKLSAgICAweDM2RjQsIDB4MzZGNSwgMHgzNkY2LCAweDM2RjcsIDB4MzZGOCwgMHgzNkY5LCAweDM2RkEsIDB4MzZGQiwKLSAgICAweDM2RkMsIDB4MzZGRCwgMHgzNkZFLCAweDM2RkYsIDB4MzcwMCwgMHgzNzAxLCAweDM3MDIsIDB4MzcwMywKLSAgICAweDM3MDQsIDB4MzcwNSwgMHgzNzA2LCAweDM3MDcsIDB4MzcwOCwgMHgzNzA5LCAweDM3MEEsIDB4MzcwQiwKLSAgICAweDM3MEMsIDB4MzcwRCwgMHgzNzBFLCAweDM3MEYsIDB4MzcxMCwgMHgzNzExLCAweDM3MTIsIDB4MzcxMywKLSAgICAweDM3MTQsIDB4MzcxNSwgMHgzNzE2LCAweDM3MTcsIDB4MzcxOCwgMHgzNzE5LCAweDM3MUEsIDB4MzcxQiwKLSAgICAweDM3MUMsIDB4MzcxRCwgMHgzNzFFLCAweDM3MUYsIDB4MzcyMCwgMHgzNzIxLCAweDM3MjIsIDB4MzcyMywKLSAgICAweDM3MjQsIDB4MzcyNSwgMHgzNzI2LCAweDM3MjcsIDB4MzcyOCwgMHgzNzI5LCAweDM3MkEsIDB4MzcyQiwKLSAgICAweDM3MkMsIDB4MzcyRCwgMHgzNzJFLCAweDM3MkYsIDB4MzczMCwgMHgzNzMxLCAweDM3MzIsIDB4MzczMywKLSAgICAweDM3MzQsIDB4MzczNSwgMHgzNzM2LCAweDM3MzcsIDB4MzczOCwgMHgzNzM5LCAweDM3M0EsIDB4MzczQiwKLSAgICAweDM3M0MsIDB4MzczRCwgMHgzNzNFLCAweDM3M0YsIDB4Mzc0MCwgMHgzNzQxLCAweDM3NDIsIDB4Mzc0MywKLSAgICAweDM3NDQsIDB4Mzc0NSwgMHgzNzQ2LCAweDM3NDcsIDB4Mzc0OCwgMHgzNzQ5LCAweDM3NEEsIDB4Mzc0QiwKLSAgICAweDM3NEMsIDB4Mzc0RCwgMHgzNzRFLCAweDM3NEYsIDB4Mzc1MCwgMHgzNzUxLCAweDM3NTIsIDB4Mzc1MywKLSAgICAweDM3NTQsIDB4Mzc1NSwgMHgzNzU2LCAweDM3NTcsIDB4Mzc1OCwgMHgzNzU5LCAweDM3NUEsIDB4Mzc1QiwKLSAgICAweDM3NUMsIDB4Mzc1RCwgMHgzNzVFLCAweDM3NUYsIDB4Mzc2MCwgMHgzNzYxLCAweDM3NjIsIDB4Mzc2MywKLSAgICAweDM3NjQsIDB4Mzc2NSwgMHgzNzY2LCAweDM3NjcsIDB4Mzc2OCwgMHgzNzY5LCAweDM3NkEsIDB4Mzc2QiwKLSAgICAweDM3NkMsIDB4Mzc2RCwgMHgzNzZFLCAweDM3NkYsIDB4Mzc3MCwgMHgzNzcxLCAweDM3NzIsIDB4Mzc3MywKLSAgICAweDM3NzQsIDB4Mzc3NSwgMHgzNzc2LCAweDM3NzcsIDB4Mzc3OCwgMHgzNzc5LCAweDM3N0EsIDB4Mzc3QiwKLSAgICAweDM3N0MsIDB4Mzc3RCwgMHgzNzdFLCAweDM3N0YsIDB4Mzc4MCwgMHgzNzgxLCAweDM3ODIsIDB4Mzc4MywKLSAgICAweDM3ODQsIDB4Mzc4NSwgMHgzNzg2LCAweDM3ODcsIDB4Mzc4OCwgMHgzNzg5LCAweDM3OEEsIDB4Mzc4QiwKLSAgICAweDM3OEMsIDB4Mzc4RCwgMHgzNzhFLCAweDM3OEYsIDB4Mzc5MCwgMHgzNzkxLCAweDM3OTIsIDB4Mzc5MywKLSAgICAweDM3OTQsIDB4Mzc5NSwgMHgzNzk2LCAweDM3OTcsIDB4Mzc5OCwgMHgzNzk5LCAweDM3OUEsIDB4Mzc5QiwKLSAgICAweDM3OUMsIDB4Mzc5RCwgMHgzNzlFLCAweDM3OUYsIDB4MzdBMCwgMHgzN0ExLCAweDM3QTIsIDB4MzdBMywKLSAgICAweDM3QTQsIDB4MzdBNSwgMHgzN0E2LCAweDM3QTcsIDB4MzdBOCwgMHgzN0E5LCAweDM3QUEsIDB4MzdBQiwKLSAgICAweDM3QUMsIDB4MzdBRCwgMHgzN0FFLCAweDM3QUYsIDB4MzdCMCwgMHgzN0IxLCAweDM3QjIsIDB4MzdCMywKLSAgICAweDM3QjQsIDB4MzdCNSwgMHgzN0I2LCAweDM3QjcsIDB4MzdCOCwgMHgzN0I5LCAweDM3QkEsIDB4MzdCQiwKLSAgICAweDM3QkMsIDB4MzdCRCwgMHgzN0JFLCAweDM3QkYsIDB4MzdDMCwgMHgzN0MxLCAweDM3QzIsIDB4MzdDMywKLSAgICAweDM3QzQsIDB4MzdDNSwgMHgzN0M2LCAweDM3QzcsIDB4MzdDOCwgMHgzN0M5LCAweDM3Q0EsIDB4MzdDQiwKLSAgICAweDM3Q0MsIDB4MzdDRCwgMHgzN0NFLCAweDM3Q0YsIDB4MzdEMCwgMHgzN0QxLCAweDM3RDIsIDB4MzdEMywKLSAgICAweDM3RDQsIDB4MzdENSwgMHgzN0Q2LCAweDM3RDcsIDB4MzdEOCwgMHgzN0Q5LCAweDM3REEsIDB4MzdEQiwKLSAgICAweDM3REMsIDB4MzdERCwgMHgzN0RFLCAweDM3REYsIDB4MzdFMCwgMHgzN0UxLCAweDM3RTIsIDB4MzdFMywKLSAgICAweDM3RTQsIDB4MzdFNSwgMHgzN0U2LCAweDM3RTcsIDB4MzdFOCwgMHgzN0U5LCAweDM3RUEsIDB4MzdFQiwKLSAgICAweDM3RUMsIDB4MzdFRCwgMHgzN0VFLCAweDM3RUYsIDB4MzdGMCwgMHgzN0YxLCAweDM3RjIsIDB4MzdGMywKLSAgICAweDM3RjQsIDB4MzdGNSwgMHgzN0Y2LCAweDM3RjcsIDB4MzdGOCwgMHgzN0Y5LCAweDM3RkEsIDB4MzdGQiwKLSAgICAweDM3RkMsIDB4MzdGRCwgMHgzN0ZFLCAweDM3RkYsIDB4MzgwMCwgMHgzODAxLCAweDM4MDIsIDB4MzgwMywKLSAgICAweDM4MDQsIDB4MzgwNSwgMHgzODA2LCAweDM4MDcsIDB4MzgwOCwgMHgzODA5LCAweDM4MEEsIDB4MzgwQiwKLSAgICAweDM4MEMsIDB4MzgwRCwgMHgzODBFLCAweDM4MEYsIDB4MzgxMCwgMHgzODExLCAweDM4MTIsIDB4MzgxMywKLSAgICAweDM4MTQsIDB4MzgxNSwgMHgzODE2LCAweDM4MTcsIDB4MzgxOCwgMHgzODE5LCAweDM4MUEsIDB4MzgxQiwKLSAgICAweDM4MUMsIDB4MzgxRCwgMHgzODFFLCAweDM4MUYsIDB4MzgyMCwgMHgzODIxLCAweDM4MjIsIDB4MzgyMywKLSAgICAweDM4MjQsIDB4MzgyNSwgMHgzODI2LCAweDM4MjcsIDB4MzgyOCwgMHgzODI5LCAweDM4MkEsIDB4MzgyQiwKLSAgICAweDM4MkMsIDB4MzgyRCwgMHgzODJFLCAweDM4MkYsIDB4MzgzMCwgMHgzODMxLCAweDM4MzIsIDB4MzgzMywKLSAgICAweDM4MzQsIDB4MzgzNSwgMHgzODM2LCAweDM4MzcsIDB4MzgzOCwgMHgzODM5LCAweDM4M0EsIDB4MzgzQiwKLSAgICAweDM4M0MsIDB4MzgzRCwgMHgzODNFLCAweDM4M0YsIDB4Mzg0MCwgMHgzODQxLCAweDM4NDIsIDB4Mzg0MywKLSAgICAweDM4NDQsIDB4Mzg0NSwgMHgzODQ2LCAweDM4NDcsIDB4Mzg0OCwgMHgzODQ5LCAweDM4NEEsIDB4Mzg0QiwKLSAgICAweDM4NEMsIDB4Mzg0RCwgMHgzODRFLCAweDM4NEYsIDB4Mzg1MCwgMHgzODUxLCAweDM4NTIsIDB4Mzg1MywKLSAgICAweDM4NTQsIDB4Mzg1NSwgMHgzODU2LCAweDM4NTcsIDB4Mzg1OCwgMHgzODU5LCAweDM4NUEsIDB4Mzg1QiwKLSAgICAweDM4NUMsIDB4Mzg1RCwgMHgzODVFLCAweDM4NUYsIDB4Mzg2MCwgMHgzODYxLCAweDM4NjIsIDB4Mzg2MywKLSAgICAweDM4NjQsIDB4Mzg2NSwgMHgzODY2LCAweDM4NjcsIDB4Mzg2OCwgMHgzODY5LCAweDM4NkEsIDB4Mzg2QiwKLSAgICAweDM4NkMsIDB4Mzg2RCwgMHgzODZFLCAweDM4NkYsIDB4Mzg3MCwgMHgzODcxLCAweDM4NzIsIDB4Mzg3MywKLSAgICAweDM4NzQsIDB4Mzg3NSwgMHgzODc2LCAweDM4NzcsIDB4Mzg3OCwgMHgzODc5LCAweDM4N0EsIDB4Mzg3QiwKLSAgICAweDM4N0MsIDB4Mzg3RCwgMHgzODdFLCAweDM4N0YsIDB4Mzg4MCwgMHgzODgxLCAweDM4ODIsIDB4Mzg4MywKLSAgICAweDM4ODQsIDB4Mzg4NSwgMHgzODg2LCAweDM4ODcsIDB4Mzg4OCwgMHgzODg5LCAweDM4OEEsIDB4Mzg4QiwKLSAgICAweDM4OEMsIDB4Mzg4RCwgMHgzODhFLCAweDM4OEYsIDB4Mzg5MCwgMHgzODkxLCAweDM4OTIsIDB4Mzg5MywKLSAgICAweDM4OTQsIDB4Mzg5NSwgMHgzODk2LCAweDM4OTcsIDB4Mzg5OCwgMHgzODk5LCAweDM4OUEsIDB4Mzg5QiwKLSAgICAweDM4OUMsIDB4Mzg5RCwgMHgzODlFLCAweDM4OUYsIDB4MzhBMCwgMHgzOEExLCAweDM4QTIsIDB4MzhBMywKLSAgICAweDM4QTQsIDB4MzhBNSwgMHgzOEE2LCAweDM4QTcsIDB4MzhBOCwgMHgzOEE5LCAweDM4QUEsIDB4MzhBQiwKLSAgICAweDM4QUMsIDB4MzhBRCwgMHgzOEFFLCAweDM4QUYsIDB4MzhCMCwgMHgzOEIxLCAweDM4QjIsIDB4MzhCMywKLSAgICAweDM4QjQsIDB4MzhCNSwgMHgzOEI2LCAweDM4QjcsIDB4MzhCOCwgMHgzOEI5LCAweDM4QkEsIDB4MzhCQiwKLSAgICAweDM4QkMsIDB4MzhCRCwgMHgzOEJFLCAweDM4QkYsIDB4MzhDMCwgMHgzOEMxLCAweDM4QzIsIDB4MzhDMywKLSAgICAweDM4QzQsIDB4MzhDNSwgMHgzOEM2LCAweDM4QzcsIDB4MzhDOCwgMHgzOEM5LCAweDM4Q0EsIDB4MzhDQiwKLSAgICAweDM4Q0MsIDB4MzhDRCwgMHgzOENFLCAweDM4Q0YsIDB4MzhEMCwgMHgzOEQxLCAweDM4RDIsIDB4MzhEMywKLSAgICAweDM4RDQsIDB4MzhENSwgMHgzOEQ2LCAweDM4RDcsIDB4MzhEOCwgMHgzOEQ5LCAweDM4REEsIDB4MzhEQiwKLSAgICAweDM4REMsIDB4MzhERCwgMHgzOERFLCAweDM4REYsIDB4MzhFMCwgMHgzOEUxLCAweDM4RTIsIDB4MzhFMywKLSAgICAweDM4RTQsIDB4MzhFNSwgMHgzOEU2LCAweDM4RTcsIDB4MzhFOCwgMHgzOEU5LCAweDM4RUEsIDB4MzhFQiwKLSAgICAweDM4RUMsIDB4MzhFRCwgMHgzOEVFLCAweDM4RUYsIDB4MzhGMCwgMHgzOEYxLCAweDM4RjIsIDB4MzhGMywKLSAgICAweDM4RjQsIDB4MzhGNSwgMHgzOEY2LCAweDM4RjcsIDB4MzhGOCwgMHgzOEY5LCAweDM4RkEsIDB4MzhGQiwKLSAgICAweDM4RkMsIDB4MzhGRCwgMHgzOEZFLCAweDM4RkYsIDB4MzkwMCwgMHgzOTAxLCAweDM5MDIsIDB4MzkwMywKLSAgICAweDM5MDQsIDB4MzkwNSwgMHgzOTA2LCAweDM5MDcsIDB4MzkwOCwgMHgzOTA5LCAweDM5MEEsIDB4MzkwQiwKLSAgICAweDM5MEMsIDB4MzkwRCwgMHgzOTBFLCAweDM5MEYsIDB4MzkxMCwgMHgzOTExLCAweDM5MTIsIDB4MzkxMywKLSAgICAweDM5MTQsIDB4MzkxNSwgMHgzOTE2LCAweDM5MTcsIDB4MzkxOSwgMHgzOTFBLCAweDM5MUIsIDB4MzkxQywKLSAgICAweDM5MUQsIDB4MzkxRSwgMHgzOTFGLCAweDM5MjAsIDB4MzkyMSwgMHgzOTIyLCAweDM5MjMsIDB4MzkyNCwKLSAgICAweDM5MjUsIDB4MzkyNiwgMHgzOTI3LCAweDM5MjgsIDB4MzkyOSwgMHgzOTJBLCAweDM5MkIsIDB4MzkyQywKLSAgICAweDM5MkQsIDB4MzkyRSwgMHgzOTJGLCAweDM5MzAsIDB4MzkzMSwgMHgzOTMyLCAweDM5MzMsIDB4MzkzNCwKLSAgICAweDM5MzUsIDB4MzkzNiwgMHgzOTM3LCAweDM5MzgsIDB4MzkzOSwgMHgzOTNBLCAweDM5M0IsIDB4MzkzQywKLSAgICAweDM5M0QsIDB4MzkzRSwgMHgzOTNGLCAweDM5NDAsIDB4Mzk0MSwgMHgzOTQyLCAweDM5NDMsIDB4Mzk0NCwKLSAgICAweDM5NDUsIDB4Mzk0NiwgMHgzOTQ3LCAweDM5NDgsIDB4Mzk0OSwgMHgzOTRBLCAweDM5NEIsIDB4Mzk0QywKLSAgICAweDM5NEQsIDB4Mzk0RSwgMHgzOTRGLCAweDM5NTAsIDB4Mzk1MSwgMHgzOTUyLCAweDM5NTMsIDB4Mzk1NCwKLSAgICAweDM5NTUsIDB4Mzk1NiwgMHgzOTU3LCAweDM5NTgsIDB4Mzk1OSwgMHgzOTVBLCAweDM5NUIsIDB4Mzk1QywKLSAgICAweDM5NUQsIDB4Mzk1RSwgMHgzOTVGLCAweDM5NjAsIDB4Mzk2MSwgMHgzOTYyLCAweDM5NjMsIDB4Mzk2NCwKLSAgICAweDM5NjUsIDB4Mzk2NiwgMHgzOTY3LCAweDM5NjgsIDB4Mzk2OSwgMHgzOTZBLCAweDM5NkIsIDB4Mzk2QywKLSAgICAweDM5NkQsIDB4Mzk2RiwgMHgzOTcwLCAweDM5NzEsIDB4Mzk3MiwgMHgzOTczLCAweDM5NzQsIDB4Mzk3NSwKLSAgICAweDM5NzYsIDB4Mzk3NywgMHgzOTc4LCAweDM5NzksIDB4Mzk3QSwgMHgzOTdCLCAweDM5N0MsIDB4Mzk3RCwKLSAgICAweDM5N0UsIDB4Mzk3RiwgMHgzOTgwLCAweDM5ODEsIDB4Mzk4MiwgMHgzOTgzLCAweDM5ODQsIDB4Mzk4NSwKLSAgICAweDM5ODYsIDB4Mzk4NywgMHgzOTg4LCAweDM5ODksIDB4Mzk4QSwgMHgzOThCLCAweDM5OEMsIDB4Mzk4RCwKLSAgICAweDM5OEUsIDB4Mzk4RiwgMHgzOTkwLCAweDM5OTEsIDB4Mzk5MiwgMHgzOTkzLCAweDM5OTQsIDB4Mzk5NSwKLSAgICAweDM5OTYsIDB4Mzk5NywgMHgzOTk4LCAweDM5OTksIDB4Mzk5QSwgMHgzOTlCLCAweDM5OUMsIDB4Mzk5RCwKLSAgICAweDM5OUUsIDB4Mzk5RiwgMHgzOUEwLCAweDM5QTEsIDB4MzlBMiwgMHgzOUEzLCAweDM5QTQsIDB4MzlBNSwKLSAgICAweDM5QTYsIDB4MzlBNywgMHgzOUE4LCAweDM5QTksIDB4MzlBQSwgMHgzOUFCLCAweDM5QUMsIDB4MzlBRCwKLSAgICAweDM5QUUsIDB4MzlBRiwgMHgzOUIwLCAweDM5QjEsIDB4MzlCMiwgMHgzOUIzLCAweDM5QjQsIDB4MzlCNSwKLSAgICAweDM5QjYsIDB4MzlCNywgMHgzOUI4LCAweDM5QjksIDB4MzlCQSwgMHgzOUJCLCAweDM5QkMsIDB4MzlCRCwKLSAgICAweDM5QkUsIDB4MzlCRiwgMHgzOUMwLCAweDM5QzEsIDB4MzlDMiwgMHgzOUMzLCAweDM5QzQsIDB4MzlDNSwKLSAgICAweDM5QzYsIDB4MzlDNywgMHgzOUM4LCAweDM5QzksIDB4MzlDQSwgMHgzOUNCLCAweDM5Q0MsIDB4MzlDRCwKLSAgICAweDM5Q0UsIDB4MzlEMSwgMHgzOUQyLCAweDM5RDMsIDB4MzlENCwgMHgzOUQ1LCAweDM5RDYsIDB4MzlENywKLSAgICAweDM5RDgsIDB4MzlEOSwgMHgzOURBLCAweDM5REIsIDB4MzlEQywgMHgzOURELCAweDM5REUsIDB4MzlFMCwKLSAgICAweDM5RTEsIDB4MzlFMiwgMHgzOUUzLCAweDM5RTQsIDB4MzlFNSwgMHgzOUU2LCAweDM5RTcsIDB4MzlFOCwKLSAgICAweDM5RTksIDB4MzlFQSwgMHgzOUVCLCAweDM5RUMsIDB4MzlFRCwgMHgzOUVFLCAweDM5RUYsIDB4MzlGMCwKLSAgICAweDM5RjEsIDB4MzlGMiwgMHgzOUYzLCAweDM5RjQsIDB4MzlGNSwgMHgzOUY2LCAweDM5RjcsIDB4MzlGOCwKLSAgICAweDM5RjksIDB4MzlGQSwgMHgzOUZCLCAweDM5RkMsIDB4MzlGRCwgMHgzOUZFLCAweDM5RkYsIDB4M0EwMCwKLSAgICAweDNBMDEsIDB4M0EwMiwgMHgzQTAzLCAweDNBMDQsIDB4M0EwNSwgMHgzQTA2LCAweDNBMDcsIDB4M0EwOCwKLSAgICAweDNBMDksIDB4M0EwQSwgMHgzQTBCLCAweDNBMEMsIDB4M0EwRCwgMHgzQTBFLCAweDNBMEYsIDB4M0ExMCwKLSAgICAweDNBMTEsIDB4M0ExMiwgMHgzQTEzLCAweDNBMTQsIDB4M0ExNSwgMHgzQTE2LCAweDNBMTcsIDB4M0ExOCwKLSAgICAweDNBMTksIDB4M0ExQSwgMHgzQTFCLCAweDNBMUMsIDB4M0ExRCwgMHgzQTFFLCAweDNBMUYsIDB4M0EyMCwKLSAgICAweDNBMjEsIDB4M0EyMiwgMHgzQTIzLCAweDNBMjQsIDB4M0EyNSwgMHgzQTI2LCAweDNBMjcsIDB4M0EyOCwKLSAgICAweDNBMjksIDB4M0EyQSwgMHgzQTJCLCAweDNBMkMsIDB4M0EyRCwgMHgzQTJFLCAweDNBMkYsIDB4M0EzMCwKLSAgICAweDNBMzEsIDB4M0EzMiwgMHgzQTMzLCAweDNBMzQsIDB4M0EzNSwgMHgzQTM2LCAweDNBMzcsIDB4M0EzOCwKLSAgICAweDNBMzksIDB4M0EzQSwgMHgzQTNCLCAweDNBM0MsIDB4M0EzRCwgMHgzQTNFLCAweDNBM0YsIDB4M0E0MCwKLSAgICAweDNBNDEsIDB4M0E0MiwgMHgzQTQzLCAweDNBNDQsIDB4M0E0NSwgMHgzQTQ2LCAweDNBNDcsIDB4M0E0OCwKLSAgICAweDNBNDksIDB4M0E0QSwgMHgzQTRCLCAweDNBNEMsIDB4M0E0RCwgMHgzQTRFLCAweDNBNEYsIDB4M0E1MCwKLSAgICAweDNBNTEsIDB4M0E1MiwgMHgzQTUzLCAweDNBNTQsIDB4M0E1NSwgMHgzQTU2LCAweDNBNTcsIDB4M0E1OCwKLSAgICAweDNBNTksIDB4M0E1QSwgMHgzQTVCLCAweDNBNUMsIDB4M0E1RCwgMHgzQTVFLCAweDNBNUYsIDB4M0E2MCwKLSAgICAweDNBNjEsIDB4M0E2MiwgMHgzQTYzLCAweDNBNjQsIDB4M0E2NSwgMHgzQTY2LCAweDNBNjcsIDB4M0E2OCwKLSAgICAweDNBNjksIDB4M0E2QSwgMHgzQTZCLCAweDNBNkMsIDB4M0E2RCwgMHgzQTZFLCAweDNBNkYsIDB4M0E3MCwKLSAgICAweDNBNzEsIDB4M0E3MiwgMHgzQTc0LCAweDNBNzUsIDB4M0E3NiwgMHgzQTc3LCAweDNBNzgsIDB4M0E3OSwKLSAgICAweDNBN0EsIDB4M0E3QiwgMHgzQTdDLCAweDNBN0QsIDB4M0E3RSwgMHgzQTdGLCAweDNBODAsIDB4M0E4MSwKLSAgICAweDNBODIsIDB4M0E4MywgMHgzQTg0LCAweDNBODUsIDB4M0E4NiwgMHgzQTg3LCAweDNBODgsIDB4M0E4OSwKLSAgICAweDNBOEEsIDB4M0E4QiwgMHgzQThDLCAweDNBOEQsIDB4M0E4RSwgMHgzQThGLCAweDNBOTAsIDB4M0E5MSwKLSAgICAweDNBOTIsIDB4M0E5MywgMHgzQTk0LCAweDNBOTUsIDB4M0E5NiwgMHgzQTk3LCAweDNBOTgsIDB4M0E5OSwKLSAgICAweDNBOUEsIDB4M0E5QiwgMHgzQTlDLCAweDNBOUQsIDB4M0E5RSwgMHgzQTlGLCAweDNBQTAsIDB4M0FBMSwKLSAgICAweDNBQTIsIDB4M0FBMywgMHgzQUE0LCAweDNBQTUsIDB4M0FBNiwgMHgzQUE3LCAweDNBQTgsIDB4M0FBOSwKLSAgICAweDNBQUEsIDB4M0FBQiwgMHgzQUFDLCAweDNBQUQsIDB4M0FBRSwgMHgzQUFGLCAweDNBQjAsIDB4M0FCMSwKLSAgICAweDNBQjIsIDB4M0FCMywgMHgzQUI0LCAweDNBQjUsIDB4M0FCNiwgMHgzQUI3LCAweDNBQjgsIDB4M0FCOSwKLSAgICAweDNBQkEsIDB4M0FCQiwgMHgzQUJDLCAweDNBQkQsIDB4M0FCRSwgMHgzQUJGLCAweDNBQzAsIDB4M0FDMSwKLSAgICAweDNBQzIsIDB4M0FDMywgMHgzQUM0LCAweDNBQzUsIDB4M0FDNiwgMHgzQUM3LCAweDNBQzgsIDB4M0FDOSwKLSAgICAweDNBQ0EsIDB4M0FDQiwgMHgzQUNDLCAweDNBQ0QsIDB4M0FDRSwgMHgzQUNGLCAweDNBRDAsIDB4M0FEMSwKLSAgICAweDNBRDIsIDB4M0FEMywgMHgzQUQ0LCAweDNBRDUsIDB4M0FENiwgMHgzQUQ3LCAweDNBRDgsIDB4M0FEOSwKLSAgICAweDNBREEsIDB4M0FEQiwgMHgzQURDLCAweDNBREQsIDB4M0FERSwgMHgzQURGLCAweDNBRTAsIDB4M0FFMSwKLSAgICAweDNBRTIsIDB4M0FFMywgMHgzQUU0LCAweDNBRTUsIDB4M0FFNiwgMHgzQUU3LCAweDNBRTgsIDB4M0FFOSwKLSAgICAweDNBRUEsIDB4M0FFQiwgMHgzQUVDLCAweDNBRUQsIDB4M0FFRSwgMHgzQUVGLCAweDNBRjAsIDB4M0FGMSwKLSAgICAweDNBRjIsIDB4M0FGMywgMHgzQUY0LCAweDNBRjUsIDB4M0FGNiwgMHgzQUY3LCAweDNBRjgsIDB4M0FGOSwKLSAgICAweDNBRkEsIDB4M0FGQiwgMHgzQUZDLCAweDNBRkQsIDB4M0FGRSwgMHgzQUZGLCAweDNCMDAsIDB4M0IwMSwKLSAgICAweDNCMDIsIDB4M0IwMywgMHgzQjA0LCAweDNCMDUsIDB4M0IwNiwgMHgzQjA3LCAweDNCMDgsIDB4M0IwOSwKLSAgICAweDNCMEEsIDB4M0IwQiwgMHgzQjBDLCAweDNCMEQsIDB4M0IwRSwgMHgzQjBGLCAweDNCMTAsIDB4M0IxMSwKLSAgICAweDNCMTIsIDB4M0IxMywgMHgzQjE0LCAweDNCMTUsIDB4M0IxNiwgMHgzQjE3LCAweDNCMTgsIDB4M0IxOSwKLSAgICAweDNCMUEsIDB4M0IxQiwgMHgzQjFDLCAweDNCMUQsIDB4M0IxRSwgMHgzQjFGLCAweDNCMjAsIDB4M0IyMSwKLSAgICAweDNCMjIsIDB4M0IyMywgMHgzQjI0LCAweDNCMjUsIDB4M0IyNiwgMHgzQjI3LCAweDNCMjgsIDB4M0IyOSwKLSAgICAweDNCMkEsIDB4M0IyQiwgMHgzQjJDLCAweDNCMkQsIDB4M0IyRSwgMHgzQjJGLCAweDNCMzAsIDB4M0IzMSwKLSAgICAweDNCMzIsIDB4M0IzMywgMHgzQjM0LCAweDNCMzUsIDB4M0IzNiwgMHgzQjM3LCAweDNCMzgsIDB4M0IzOSwKLSAgICAweDNCM0EsIDB4M0IzQiwgMHgzQjNDLCAweDNCM0QsIDB4M0IzRSwgMHgzQjNGLCAweDNCNDAsIDB4M0I0MSwKLSAgICAweDNCNDIsIDB4M0I0MywgMHgzQjQ0LCAweDNCNDUsIDB4M0I0NiwgMHgzQjQ3LCAweDNCNDgsIDB4M0I0OSwKLSAgICAweDNCNEEsIDB4M0I0QiwgMHgzQjRDLCAweDNCNEQsIDB4M0I0RiwgMHgzQjUwLCAweDNCNTEsIDB4M0I1MiwKLSAgICAweDNCNTMsIDB4M0I1NCwgMHgzQjU1LCAweDNCNTYsIDB4M0I1NywgMHgzQjU4LCAweDNCNTksIDB4M0I1QSwKLSAgICAweDNCNUIsIDB4M0I1QywgMHgzQjVELCAweDNCNUUsIDB4M0I1RiwgMHgzQjYwLCAweDNCNjEsIDB4M0I2MiwKLSAgICAweDNCNjMsIDB4M0I2NCwgMHgzQjY1LCAweDNCNjYsIDB4M0I2NywgMHgzQjY4LCAweDNCNjksIDB4M0I2QSwKLSAgICAweDNCNkIsIDB4M0I2QywgMHgzQjZELCAweDNCNkUsIDB4M0I2RiwgMHgzQjcwLCAweDNCNzEsIDB4M0I3MiwKLSAgICAweDNCNzMsIDB4M0I3NCwgMHgzQjc1LCAweDNCNzYsIDB4M0I3NywgMHgzQjc4LCAweDNCNzksIDB4M0I3QSwKLSAgICAweDNCN0IsIDB4M0I3QywgMHgzQjdELCAweDNCN0UsIDB4M0I3RiwgMHgzQjgwLCAweDNCODEsIDB4M0I4MiwKLSAgICAweDNCODMsIDB4M0I4NCwgMHgzQjg1LCAweDNCODYsIDB4M0I4NywgMHgzQjg4LCAweDNCODksIDB4M0I4QSwKLSAgICAweDNCOEIsIDB4M0I4QywgMHgzQjhELCAweDNCOEUsIDB4M0I4RiwgMHgzQjkwLCAweDNCOTEsIDB4M0I5MiwKLSAgICAweDNCOTMsIDB4M0I5NCwgMHgzQjk1LCAweDNCOTYsIDB4M0I5NywgMHgzQjk4LCAweDNCOTksIDB4M0I5QSwKLSAgICAweDNCOUIsIDB4M0I5QywgMHgzQjlELCAweDNCOUUsIDB4M0I5RiwgMHgzQkEwLCAweDNCQTEsIDB4M0JBMiwKLSAgICAweDNCQTMsIDB4M0JBNCwgMHgzQkE1LCAweDNCQTYsIDB4M0JBNywgMHgzQkE4LCAweDNCQTksIDB4M0JBQSwKLSAgICAweDNCQUIsIDB4M0JBQywgMHgzQkFELCAweDNCQUUsIDB4M0JBRiwgMHgzQkIwLCAweDNCQjEsIDB4M0JCMiwKLSAgICAweDNCQjMsIDB4M0JCNCwgMHgzQkI1LCAweDNCQjYsIDB4M0JCNywgMHgzQkI4LCAweDNCQjksIDB4M0JCQSwKLSAgICAweDNCQkIsIDB4M0JCQywgMHgzQkJELCAweDNCQkUsIDB4M0JCRiwgMHgzQkMwLCAweDNCQzEsIDB4M0JDMiwKLSAgICAweDNCQzMsIDB4M0JDNCwgMHgzQkM1LCAweDNCQzYsIDB4M0JDNywgMHgzQkM4LCAweDNCQzksIDB4M0JDQSwKLSAgICAweDNCQ0IsIDB4M0JDQywgMHgzQkNELCAweDNCQ0UsIDB4M0JDRiwgMHgzQkQwLCAweDNCRDEsIDB4M0JEMiwKLSAgICAweDNCRDMsIDB4M0JENCwgMHgzQkQ1LCAweDNCRDYsIDB4M0JENywgMHgzQkQ4LCAweDNCRDksIDB4M0JEQSwKLSAgICAweDNCREIsIDB4M0JEQywgMHgzQkRELCAweDNCREUsIDB4M0JERiwgMHgzQkUwLCAweDNCRTEsIDB4M0JFMiwKLSAgICAweDNCRTMsIDB4M0JFNCwgMHgzQkU1LCAweDNCRTYsIDB4M0JFNywgMHgzQkU4LCAweDNCRTksIDB4M0JFQSwKLSAgICAweDNCRUIsIDB4M0JFQywgMHgzQkVELCAweDNCRUUsIDB4M0JFRiwgMHgzQkYwLCAweDNCRjEsIDB4M0JGMiwKLSAgICAweDNCRjMsIDB4M0JGNCwgMHgzQkY1LCAweDNCRjYsIDB4M0JGNywgMHgzQkY4LCAweDNCRjksIDB4M0JGQSwKLSAgICAweDNCRkIsIDB4M0JGQywgMHgzQkZELCAweDNCRkUsIDB4M0JGRiwgMHgzQzAwLCAweDNDMDEsIDB4M0MwMiwKLSAgICAweDNDMDMsIDB4M0MwNCwgMHgzQzA1LCAweDNDMDYsIDB4M0MwNywgMHgzQzA4LCAweDNDMDksIDB4M0MwQSwKLSAgICAweDNDMEIsIDB4M0MwQywgMHgzQzBELCAweDNDMEUsIDB4M0MwRiwgMHgzQzEwLCAweDNDMTEsIDB4M0MxMiwKLSAgICAweDNDMTMsIDB4M0MxNCwgMHgzQzE1LCAweDNDMTYsIDB4M0MxNywgMHgzQzE4LCAweDNDMTksIDB4M0MxQSwKLSAgICAweDNDMUIsIDB4M0MxQywgMHgzQzFELCAweDNDMUUsIDB4M0MxRiwgMHgzQzIwLCAweDNDMjEsIDB4M0MyMiwKLSAgICAweDNDMjMsIDB4M0MyNCwgMHgzQzI1LCAweDNDMjYsIDB4M0MyNywgMHgzQzI4LCAweDNDMjksIDB4M0MyQSwKLSAgICAweDNDMkIsIDB4M0MyQywgMHgzQzJELCAweDNDMkUsIDB4M0MyRiwgMHgzQzMwLCAweDNDMzEsIDB4M0MzMiwKLSAgICAweDNDMzMsIDB4M0MzNCwgMHgzQzM1LCAweDNDMzYsIDB4M0MzNywgMHgzQzM4LCAweDNDMzksIDB4M0MzQSwKLSAgICAweDNDM0IsIDB4M0MzQywgMHgzQzNELCAweDNDM0UsIDB4M0MzRiwgMHgzQzQwLCAweDNDNDEsIDB4M0M0MiwKLSAgICAweDNDNDMsIDB4M0M0NCwgMHgzQzQ1LCAweDNDNDYsIDB4M0M0NywgMHgzQzQ4LCAweDNDNDksIDB4M0M0QSwKLSAgICAweDNDNEIsIDB4M0M0QywgMHgzQzRELCAweDNDNEUsIDB4M0M0RiwgMHgzQzUwLCAweDNDNTEsIDB4M0M1MiwKLSAgICAweDNDNTMsIDB4M0M1NCwgMHgzQzU1LCAweDNDNTYsIDB4M0M1NywgMHgzQzU4LCAweDNDNTksIDB4M0M1QSwKLSAgICAweDNDNUIsIDB4M0M1QywgMHgzQzVELCAweDNDNUUsIDB4M0M1RiwgMHgzQzYwLCAweDNDNjEsIDB4M0M2MiwKLSAgICAweDNDNjMsIDB4M0M2NCwgMHgzQzY1LCAweDNDNjYsIDB4M0M2NywgMHgzQzY4LCAweDNDNjksIDB4M0M2QSwKLSAgICAweDNDNkIsIDB4M0M2QywgMHgzQzZELCAweDNDNkYsIDB4M0M3MCwgMHgzQzcxLCAweDNDNzIsIDB4M0M3MywKLSAgICAweDNDNzQsIDB4M0M3NSwgMHgzQzc2LCAweDNDNzcsIDB4M0M3OCwgMHgzQzc5LCAweDNDN0EsIDB4M0M3QiwKLSAgICAweDNDN0MsIDB4M0M3RCwgMHgzQzdFLCAweDNDN0YsIDB4M0M4MCwgMHgzQzgxLCAweDNDODIsIDB4M0M4MywKLSAgICAweDNDODQsIDB4M0M4NSwgMHgzQzg2LCAweDNDODcsIDB4M0M4OCwgMHgzQzg5LCAweDNDOEEsIDB4M0M4QiwKLSAgICAweDNDOEMsIDB4M0M4RCwgMHgzQzhFLCAweDNDOEYsIDB4M0M5MCwgMHgzQzkxLCAweDNDOTIsIDB4M0M5MywKLSAgICAweDNDOTQsIDB4M0M5NSwgMHgzQzk2LCAweDNDOTcsIDB4M0M5OCwgMHgzQzk5LCAweDNDOUEsIDB4M0M5QiwKLSAgICAweDNDOUMsIDB4M0M5RCwgMHgzQzlFLCAweDNDOUYsIDB4M0NBMCwgMHgzQ0ExLCAweDNDQTIsIDB4M0NBMywKLSAgICAweDNDQTQsIDB4M0NBNSwgMHgzQ0E2LCAweDNDQTcsIDB4M0NBOCwgMHgzQ0E5LCAweDNDQUEsIDB4M0NBQiwKLSAgICAweDNDQUMsIDB4M0NBRCwgMHgzQ0FFLCAweDNDQUYsIDB4M0NCMCwgMHgzQ0IxLCAweDNDQjIsIDB4M0NCMywKLSAgICAweDNDQjQsIDB4M0NCNSwgMHgzQ0I2LCAweDNDQjcsIDB4M0NCOCwgMHgzQ0I5LCAweDNDQkEsIDB4M0NCQiwKLSAgICAweDNDQkMsIDB4M0NCRCwgMHgzQ0JFLCAweDNDQkYsIDB4M0NDMCwgMHgzQ0MxLCAweDNDQzIsIDB4M0NDMywKLSAgICAweDNDQzQsIDB4M0NDNSwgMHgzQ0M2LCAweDNDQzcsIDB4M0NDOCwgMHgzQ0M5LCAweDNDQ0EsIDB4M0NDQiwKLSAgICAweDNDQ0MsIDB4M0NDRCwgMHgzQ0NFLCAweDNDQ0YsIDB4M0NEMCwgMHgzQ0QxLCAweDNDRDIsIDB4M0NEMywKLSAgICAweDNDRDQsIDB4M0NENSwgMHgzQ0Q2LCAweDNDRDcsIDB4M0NEOCwgMHgzQ0Q5LCAweDNDREEsIDB4M0NEQiwKLSAgICAweDNDREMsIDB4M0NERCwgMHgzQ0RFLCAweDNDREYsIDB4M0NFMSwgMHgzQ0UyLCAweDNDRTMsIDB4M0NFNCwKLSAgICAweDNDRTUsIDB4M0NFNiwgMHgzQ0U3LCAweDNDRTgsIDB4M0NFOSwgMHgzQ0VBLCAweDNDRUIsIDB4M0NFQywKLSAgICAweDNDRUQsIDB4M0NFRSwgMHgzQ0VGLCAweDNDRjAsIDB4M0NGMSwgMHgzQ0YyLCAweDNDRjMsIDB4M0NGNCwKLSAgICAweDNDRjUsIDB4M0NGNiwgMHgzQ0Y3LCAweDNDRjgsIDB4M0NGOSwgMHgzQ0ZBLCAweDNDRkIsIDB4M0NGQywKLSAgICAweDNDRkQsIDB4M0NGRSwgMHgzQ0ZGLCAweDNEMDAsIDB4M0QwMSwgMHgzRDAyLCAweDNEMDMsIDB4M0QwNCwKLSAgICAweDNEMDUsIDB4M0QwNiwgMHgzRDA3LCAweDNEMDgsIDB4M0QwOSwgMHgzRDBBLCAweDNEMEIsIDB4M0QwQywKLSAgICAweDNEMEQsIDB4M0QwRSwgMHgzRDBGLCAweDNEMTAsIDB4M0QxMSwgMHgzRDEyLCAweDNEMTMsIDB4M0QxNCwKLSAgICAweDNEMTUsIDB4M0QxNiwgMHgzRDE3LCAweDNEMTgsIDB4M0QxOSwgMHgzRDFBLCAweDNEMUIsIDB4M0QxQywKLSAgICAweDNEMUQsIDB4M0QxRSwgMHgzRDFGLCAweDNEMjAsIDB4M0QyMSwgMHgzRDIyLCAweDNEMjMsIDB4M0QyNCwKLSAgICAweDNEMjUsIDB4M0QyNiwgMHgzRDI3LCAweDNEMjgsIDB4M0QyOSwgMHgzRDJBLCAweDNEMkIsIDB4M0QyQywKLSAgICAweDNEMkQsIDB4M0QyRSwgMHgzRDJGLCAweDNEMzAsIDB4M0QzMSwgMHgzRDMyLCAweDNEMzMsIDB4M0QzNCwKLSAgICAweDNEMzUsIDB4M0QzNiwgMHgzRDM3LCAweDNEMzgsIDB4M0QzOSwgMHgzRDNBLCAweDNEM0IsIDB4M0QzQywKLSAgICAweDNEM0QsIDB4M0QzRSwgMHgzRDNGLCAweDNENDAsIDB4M0Q0MSwgMHgzRDQyLCAweDNENDMsIDB4M0Q0NCwKLSAgICAweDNENDUsIDB4M0Q0NiwgMHgzRDQ3LCAweDNENDgsIDB4M0Q0OSwgMHgzRDRBLCAweDNENEIsIDB4M0Q0QywKLSAgICAweDNENEQsIDB4M0Q0RSwgMHgzRDRGLCAweDNENTAsIDB4M0Q1MSwgMHgzRDUyLCAweDNENTMsIDB4M0Q1NCwKLSAgICAweDNENTUsIDB4M0Q1NiwgMHgzRDU3LCAweDNENTgsIDB4M0Q1OSwgMHgzRDVBLCAweDNENUIsIDB4M0Q1QywKLSAgICAweDNENUQsIDB4M0Q1RSwgMHgzRDVGLCAweDNENjAsIDB4M0Q2MSwgMHgzRDYyLCAweDNENjMsIDB4M0Q2NCwKLSAgICAweDNENjUsIDB4M0Q2NiwgMHgzRDY3LCAweDNENjgsIDB4M0Q2OSwgMHgzRDZBLCAweDNENkIsIDB4M0Q2QywKLSAgICAweDNENkQsIDB4M0Q2RSwgMHgzRDZGLCAweDNENzAsIDB4M0Q3MSwgMHgzRDcyLCAweDNENzMsIDB4M0Q3NCwKLSAgICAweDNENzUsIDB4M0Q3NiwgMHgzRDc3LCAweDNENzgsIDB4M0Q3OSwgMHgzRDdBLCAweDNEN0IsIDB4M0Q3QywKLSAgICAweDNEN0QsIDB4M0Q3RSwgMHgzRDdGLCAweDNEODAsIDB4M0Q4MSwgMHgzRDgyLCAweDNEODMsIDB4M0Q4NCwKLSAgICAweDNEODUsIDB4M0Q4NiwgMHgzRDg3LCAweDNEODgsIDB4M0Q4OSwgMHgzRDhBLCAweDNEOEIsIDB4M0Q4QywKLSAgICAweDNEOEQsIDB4M0Q4RSwgMHgzRDhGLCAweDNEOTAsIDB4M0Q5MSwgMHgzRDkyLCAweDNEOTMsIDB4M0Q5NCwKLSAgICAweDNEOTUsIDB4M0Q5NiwgMHgzRDk3LCAweDNEOTgsIDB4M0Q5OSwgMHgzRDlBLCAweDNEOUIsIDB4M0Q5QywKLSAgICAweDNEOUQsIDB4M0Q5RSwgMHgzRDlGLCAweDNEQTAsIDB4M0RBMSwgMHgzREEyLCAweDNEQTMsIDB4M0RBNCwKLSAgICAweDNEQTUsIDB4M0RBNiwgMHgzREE3LCAweDNEQTgsIDB4M0RBOSwgMHgzREFBLCAweDNEQUIsIDB4M0RBQywKLSAgICAweDNEQUQsIDB4M0RBRSwgMHgzREFGLCAweDNEQjAsIDB4M0RCMSwgMHgzREIyLCAweDNEQjMsIDB4M0RCNCwKLSAgICAweDNEQjUsIDB4M0RCNiwgMHgzREI3LCAweDNEQjgsIDB4M0RCOSwgMHgzREJBLCAweDNEQkIsIDB4M0RCQywKLSAgICAweDNEQkQsIDB4M0RCRSwgMHgzREJGLCAweDNEQzAsIDB4M0RDMSwgMHgzREMyLCAweDNEQzMsIDB4M0RDNCwKLSAgICAweDNEQzUsIDB4M0RDNiwgMHgzREM3LCAweDNEQzgsIDB4M0RDOSwgMHgzRENBLCAweDNEQ0IsIDB4M0RDQywKLSAgICAweDNEQ0QsIDB4M0RDRSwgMHgzRENGLCAweDNERDAsIDB4M0REMSwgMHgzREQyLCAweDNERDMsIDB4M0RENCwKLSAgICAweDNERDUsIDB4M0RENiwgMHgzREQ3LCAweDNERDgsIDB4M0REOSwgMHgzRERBLCAweDNEREIsIDB4M0REQywKLSAgICAweDNEREQsIDB4M0RERSwgMHgzRERGLCAweDNERTAsIDB4M0RFMSwgMHgzREUyLCAweDNERTMsIDB4M0RFNCwKLSAgICAweDNERTUsIDB4M0RFNiwgMHgzREU3LCAweDNERTgsIDB4M0RFOSwgMHgzREVBLCAweDNERUIsIDB4M0RFQywKLSAgICAweDNERUQsIDB4M0RFRSwgMHgzREVGLCAweDNERjAsIDB4M0RGMSwgMHgzREYyLCAweDNERjMsIDB4M0RGNCwKLSAgICAweDNERjUsIDB4M0RGNiwgMHgzREY3LCAweDNERjgsIDB4M0RGOSwgMHgzREZBLCAweDNERkIsIDB4M0RGQywKLSAgICAweDNERkQsIDB4M0RGRSwgMHgzREZGLCAweDNFMDAsIDB4M0UwMSwgMHgzRTAyLCAweDNFMDMsIDB4M0UwNCwKLSAgICAweDNFMDUsIDB4M0UwNiwgMHgzRTA3LCAweDNFMDgsIDB4M0UwOSwgMHgzRTBBLCAweDNFMEIsIDB4M0UwQywKLSAgICAweDNFMEQsIDB4M0UwRSwgMHgzRTBGLCAweDNFMTAsIDB4M0UxMSwgMHgzRTEyLCAweDNFMTMsIDB4M0UxNCwKLSAgICAweDNFMTUsIDB4M0UxNiwgMHgzRTE3LCAweDNFMTgsIDB4M0UxOSwgMHgzRTFBLCAweDNFMUIsIDB4M0UxQywKLSAgICAweDNFMUQsIDB4M0UxRSwgMHgzRTFGLCAweDNFMjAsIDB4M0UyMSwgMHgzRTIyLCAweDNFMjMsIDB4M0UyNCwKLSAgICAweDNFMjUsIDB4M0UyNiwgMHgzRTI3LCAweDNFMjgsIDB4M0UyOSwgMHgzRTJBLCAweDNFMkIsIDB4M0UyQywKLSAgICAweDNFMkQsIDB4M0UyRSwgMHgzRTJGLCAweDNFMzAsIDB4M0UzMSwgMHgzRTMyLCAweDNFMzMsIDB4M0UzNCwKLSAgICAweDNFMzUsIDB4M0UzNiwgMHgzRTM3LCAweDNFMzgsIDB4M0UzOSwgMHgzRTNBLCAweDNFM0IsIDB4M0UzQywKLSAgICAweDNFM0QsIDB4M0UzRSwgMHgzRTNGLCAweDNFNDAsIDB4M0U0MSwgMHgzRTQyLCAweDNFNDMsIDB4M0U0NCwKLSAgICAweDNFNDUsIDB4M0U0NiwgMHgzRTQ3LCAweDNFNDgsIDB4M0U0OSwgMHgzRTRBLCAweDNFNEIsIDB4M0U0QywKLSAgICAweDNFNEQsIDB4M0U0RSwgMHgzRTRGLCAweDNFNTAsIDB4M0U1MSwgMHgzRTUyLCAweDNFNTMsIDB4M0U1NCwKLSAgICAweDNFNTUsIDB4M0U1NiwgMHgzRTU3LCAweDNFNTgsIDB4M0U1OSwgMHgzRTVBLCAweDNFNUIsIDB4M0U1QywKLSAgICAweDNFNUQsIDB4M0U1RSwgMHgzRTVGLCAweDNFNjAsIDB4M0U2MSwgMHgzRTYyLCAweDNFNjMsIDB4M0U2NCwKLSAgICAweDNFNjUsIDB4M0U2NiwgMHgzRTY3LCAweDNFNjgsIDB4M0U2OSwgMHgzRTZBLCAweDNFNkIsIDB4M0U2QywKLSAgICAweDNFNkQsIDB4M0U2RSwgMHgzRTZGLCAweDNFNzAsIDB4M0U3MSwgMHgzRTcyLCAweDNFNzMsIDB4M0U3NCwKLSAgICAweDNFNzUsIDB4M0U3NiwgMHgzRTc3LCAweDNFNzgsIDB4M0U3OSwgMHgzRTdBLCAweDNFN0IsIDB4M0U3QywKLSAgICAweDNFN0QsIDB4M0U3RSwgMHgzRTdGLCAweDNFODAsIDB4M0U4MSwgMHgzRTgyLCAweDNFODMsIDB4M0U4NCwKLSAgICAweDNFODUsIDB4M0U4NiwgMHgzRTg3LCAweDNFODgsIDB4M0U4OSwgMHgzRThBLCAweDNFOEIsIDB4M0U4QywKLSAgICAweDNFOEQsIDB4M0U4RSwgMHgzRThGLCAweDNFOTAsIDB4M0U5MSwgMHgzRTkyLCAweDNFOTMsIDB4M0U5NCwKLSAgICAweDNFOTUsIDB4M0U5NiwgMHgzRTk3LCAweDNFOTgsIDB4M0U5OSwgMHgzRTlBLCAweDNFOUIsIDB4M0U5QywKLSAgICAweDNFOUQsIDB4M0U5RSwgMHgzRTlGLCAweDNFQTAsIDB4M0VBMSwgMHgzRUEyLCAweDNFQTMsIDB4M0VBNCwKLSAgICAweDNFQTUsIDB4M0VBNiwgMHgzRUE3LCAweDNFQTgsIDB4M0VBOSwgMHgzRUFBLCAweDNFQUIsIDB4M0VBQywKLSAgICAweDNFQUQsIDB4M0VBRSwgMHgzRUFGLCAweDNFQjAsIDB4M0VCMSwgMHgzRUIyLCAweDNFQjMsIDB4M0VCNCwKLSAgICAweDNFQjUsIDB4M0VCNiwgMHgzRUI3LCAweDNFQjgsIDB4M0VCOSwgMHgzRUJBLCAweDNFQkIsIDB4M0VCQywKLSAgICAweDNFQkQsIDB4M0VCRSwgMHgzRUJGLCAweDNFQzAsIDB4M0VDMSwgMHgzRUMyLCAweDNFQzMsIDB4M0VDNCwKLSAgICAweDNFQzUsIDB4M0VDNiwgMHgzRUM3LCAweDNFQzgsIDB4M0VDOSwgMHgzRUNBLCAweDNFQ0IsIDB4M0VDQywKLSAgICAweDNFQ0QsIDB4M0VDRSwgMHgzRUNGLCAweDNFRDAsIDB4M0VEMSwgMHgzRUQyLCAweDNFRDMsIDB4M0VENCwKLSAgICAweDNFRDUsIDB4M0VENiwgMHgzRUQ3LCAweDNFRDgsIDB4M0VEOSwgMHgzRURBLCAweDNFREIsIDB4M0VEQywKLSAgICAweDNFREQsIDB4M0VERSwgMHgzRURGLCAweDNFRTAsIDB4M0VFMSwgMHgzRUUyLCAweDNFRTMsIDB4M0VFNCwKLSAgICAweDNFRTUsIDB4M0VFNiwgMHgzRUU3LCAweDNFRTgsIDB4M0VFOSwgMHgzRUVBLCAweDNFRUIsIDB4M0VFQywKLSAgICAweDNFRUQsIDB4M0VFRSwgMHgzRUVGLCAweDNFRjAsIDB4M0VGMSwgMHgzRUYyLCAweDNFRjMsIDB4M0VGNCwKLSAgICAweDNFRjUsIDB4M0VGNiwgMHgzRUY3LCAweDNFRjgsIDB4M0VGOSwgMHgzRUZBLCAweDNFRkIsIDB4M0VGQywKLSAgICAweDNFRkQsIDB4M0VGRSwgMHgzRUZGLCAweDNGMDAsIDB4M0YwMSwgMHgzRjAyLCAweDNGMDMsIDB4M0YwNCwKLSAgICAweDNGMDUsIDB4M0YwNiwgMHgzRjA3LCAweDNGMDgsIDB4M0YwOSwgMHgzRjBBLCAweDNGMEIsIDB4M0YwQywKLSAgICAweDNGMEQsIDB4M0YwRSwgMHgzRjBGLCAweDNGMTAsIDB4M0YxMSwgMHgzRjEyLCAweDNGMTMsIDB4M0YxNCwKLSAgICAweDNGMTUsIDB4M0YxNiwgMHgzRjE3LCAweDNGMTgsIDB4M0YxOSwgMHgzRjFBLCAweDNGMUIsIDB4M0YxQywKLSAgICAweDNGMUQsIDB4M0YxRSwgMHgzRjFGLCAweDNGMjAsIDB4M0YyMSwgMHgzRjIyLCAweDNGMjMsIDB4M0YyNCwKLSAgICAweDNGMjUsIDB4M0YyNiwgMHgzRjI3LCAweDNGMjgsIDB4M0YyOSwgMHgzRjJBLCAweDNGMkIsIDB4M0YyQywKLSAgICAweDNGMkQsIDB4M0YyRSwgMHgzRjJGLCAweDNGMzAsIDB4M0YzMSwgMHgzRjMyLCAweDNGMzMsIDB4M0YzNCwKLSAgICAweDNGMzUsIDB4M0YzNiwgMHgzRjM3LCAweDNGMzgsIDB4M0YzOSwgMHgzRjNBLCAweDNGM0IsIDB4M0YzQywKLSAgICAweDNGM0QsIDB4M0YzRSwgMHgzRjNGLCAweDNGNDAsIDB4M0Y0MSwgMHgzRjQyLCAweDNGNDMsIDB4M0Y0NCwKLSAgICAweDNGNDUsIDB4M0Y0NiwgMHgzRjQ3LCAweDNGNDgsIDB4M0Y0OSwgMHgzRjRBLCAweDNGNEIsIDB4M0Y0QywKLSAgICAweDNGNEQsIDB4M0Y0RSwgMHgzRjRGLCAweDNGNTAsIDB4M0Y1MSwgMHgzRjUyLCAweDNGNTMsIDB4M0Y1NCwKLSAgICAweDNGNTUsIDB4M0Y1NiwgMHgzRjU3LCAweDNGNTgsIDB4M0Y1OSwgMHgzRjVBLCAweDNGNUIsIDB4M0Y1QywKLSAgICAweDNGNUQsIDB4M0Y1RSwgMHgzRjVGLCAweDNGNjAsIDB4M0Y2MSwgMHgzRjYyLCAweDNGNjMsIDB4M0Y2NCwKLSAgICAweDNGNjUsIDB4M0Y2NiwgMHgzRjY3LCAweDNGNjgsIDB4M0Y2OSwgMHgzRjZBLCAweDNGNkIsIDB4M0Y2QywKLSAgICAweDNGNkQsIDB4M0Y2RSwgMHgzRjZGLCAweDNGNzAsIDB4M0Y3MSwgMHgzRjcyLCAweDNGNzMsIDB4M0Y3NCwKLSAgICAweDNGNzUsIDB4M0Y3NiwgMHgzRjc3LCAweDNGNzgsIDB4M0Y3OSwgMHgzRjdBLCAweDNGN0IsIDB4M0Y3QywKLSAgICAweDNGN0QsIDB4M0Y3RSwgMHgzRjdGLCAweDNGODAsIDB4M0Y4MSwgMHgzRjgyLCAweDNGODMsIDB4M0Y4NCwKLSAgICAweDNGODUsIDB4M0Y4NiwgMHgzRjg3LCAweDNGODgsIDB4M0Y4OSwgMHgzRjhBLCAweDNGOEIsIDB4M0Y4QywKLSAgICAweDNGOEQsIDB4M0Y4RSwgMHgzRjhGLCAweDNGOTAsIDB4M0Y5MSwgMHgzRjkyLCAweDNGOTMsIDB4M0Y5NCwKLSAgICAweDNGOTUsIDB4M0Y5NiwgMHgzRjk3LCAweDNGOTgsIDB4M0Y5OSwgMHgzRjlBLCAweDNGOUIsIDB4M0Y5QywKLSAgICAweDNGOUQsIDB4M0Y5RSwgMHgzRjlGLCAweDNGQTAsIDB4M0ZBMSwgMHgzRkEyLCAweDNGQTMsIDB4M0ZBNCwKLSAgICAweDNGQTUsIDB4M0ZBNiwgMHgzRkE3LCAweDNGQTgsIDB4M0ZBOSwgMHgzRkFBLCAweDNGQUIsIDB4M0ZBQywKLSAgICAweDNGQUQsIDB4M0ZBRSwgMHgzRkFGLCAweDNGQjAsIDB4M0ZCMSwgMHgzRkIyLCAweDNGQjMsIDB4M0ZCNCwKLSAgICAweDNGQjUsIDB4M0ZCNiwgMHgzRkI3LCAweDNGQjgsIDB4M0ZCOSwgMHgzRkJBLCAweDNGQkIsIDB4M0ZCQywKLSAgICAweDNGQkQsIDB4M0ZCRSwgMHgzRkJGLCAweDNGQzAsIDB4M0ZDMSwgMHgzRkMyLCAweDNGQzMsIDB4M0ZDNCwKLSAgICAweDNGQzUsIDB4M0ZDNiwgMHgzRkM3LCAweDNGQzgsIDB4M0ZDOSwgMHgzRkNBLCAweDNGQ0IsIDB4M0ZDQywKLSAgICAweDNGQ0QsIDB4M0ZDRSwgMHgzRkNGLCAweDNGRDAsIDB4M0ZEMSwgMHgzRkQyLCAweDNGRDMsIDB4M0ZENCwKLSAgICAweDNGRDUsIDB4M0ZENiwgMHgzRkQ3LCAweDNGRDgsIDB4M0ZEOSwgMHgzRkRBLCAweDNGREIsIDB4M0ZEQywKLSAgICAweDNGREQsIDB4M0ZERSwgMHgzRkRGLCAweDNGRTAsIDB4M0ZFMSwgMHgzRkUyLCAweDNGRTMsIDB4M0ZFNCwKLSAgICAweDNGRTUsIDB4M0ZFNiwgMHgzRkU3LCAweDNGRTgsIDB4M0ZFOSwgMHgzRkVBLCAweDNGRUIsIDB4M0ZFQywKLSAgICAweDNGRUQsIDB4M0ZFRSwgMHgzRkVGLCAweDNGRjAsIDB4M0ZGMSwgMHgzRkYyLCAweDNGRjMsIDB4M0ZGNCwKLSAgICAweDNGRjUsIDB4M0ZGNiwgMHgzRkY3LCAweDNGRjgsIDB4M0ZGOSwgMHgzRkZBLCAweDNGRkIsIDB4M0ZGQywKLSAgICAweDNGRkQsIDB4M0ZGRSwgMHgzRkZGLCAweDQwMDAsIDB4NDAwMSwgMHg0MDAyLCAweDQwMDMsIDB4NDAwNCwKLSAgICAweDQwMDUsIDB4NDAwNiwgMHg0MDA3LCAweDQwMDgsIDB4NDAwOSwgMHg0MDBBLCAweDQwMEIsIDB4NDAwQywKLSAgICAweDQwMEQsIDB4NDAwRSwgMHg0MDBGLCAweDQwMTAsIDB4NDAxMSwgMHg0MDEyLCAweDQwMTMsIDB4NDAxNCwKLSAgICAweDQwMTUsIDB4NDAxNiwgMHg0MDE3LCAweDQwMTgsIDB4NDAxOSwgMHg0MDFBLCAweDQwMUIsIDB4NDAxQywKLSAgICAweDQwMUQsIDB4NDAxRSwgMHg0MDFGLCAweDQwMjAsIDB4NDAyMSwgMHg0MDIyLCAweDQwMjMsIDB4NDAyNCwKLSAgICAweDQwMjUsIDB4NDAyNiwgMHg0MDI3LCAweDQwMjgsIDB4NDAyOSwgMHg0MDJBLCAweDQwMkIsIDB4NDAyQywKLSAgICAweDQwMkQsIDB4NDAyRSwgMHg0MDJGLCAweDQwMzAsIDB4NDAzMSwgMHg0MDMyLCAweDQwMzMsIDB4NDAzNCwKLSAgICAweDQwMzUsIDB4NDAzNiwgMHg0MDM3LCAweDQwMzgsIDB4NDAzOSwgMHg0MDNBLCAweDQwM0IsIDB4NDAzQywKLSAgICAweDQwM0QsIDB4NDAzRSwgMHg0MDNGLCAweDQwNDAsIDB4NDA0MSwgMHg0MDQyLCAweDQwNDMsIDB4NDA0NCwKLSAgICAweDQwNDUsIDB4NDA0NiwgMHg0MDQ3LCAweDQwNDgsIDB4NDA0OSwgMHg0MDRBLCAweDQwNEIsIDB4NDA0QywKLSAgICAweDQwNEQsIDB4NDA0RSwgMHg0MDRGLCAweDQwNTAsIDB4NDA1MSwgMHg0MDUyLCAweDQwNTMsIDB4NDA1NCwKLSAgICAweDQwNTUsIDB4NDA1NywgMHg0MDU4LCAweDQwNTksIDB4NDA1QSwgMHg0MDVCLCAweDQwNUMsIDB4NDA1RCwKLSAgICAweDQwNUUsIDB4NDA1RiwgMHg0MDYwLCAweDQwNjEsIDB4NDA2MiwgMHg0MDYzLCAweDQwNjQsIDB4NDA2NSwKLSAgICAweDQwNjYsIDB4NDA2NywgMHg0MDY4LCAweDQwNjksIDB4NDA2QSwgMHg0MDZCLCAweDQwNkMsIDB4NDA2RCwKLSAgICAweDQwNkUsIDB4NDA2RiwgMHg0MDcwLCAweDQwNzEsIDB4NDA3MiwgMHg0MDczLCAweDQwNzQsIDB4NDA3NSwKLSAgICAweDQwNzYsIDB4NDA3NywgMHg0MDc4LCAweDQwNzksIDB4NDA3QSwgMHg0MDdCLCAweDQwN0MsIDB4NDA3RCwKLSAgICAweDQwN0UsIDB4NDA3RiwgMHg0MDgwLCAweDQwODEsIDB4NDA4MiwgMHg0MDgzLCAweDQwODQsIDB4NDA4NSwKLSAgICAweDQwODYsIDB4NDA4NywgMHg0MDg4LCAweDQwODksIDB4NDA4QSwgMHg0MDhCLCAweDQwOEMsIDB4NDA4RCwKLSAgICAweDQwOEUsIDB4NDA4RiwgMHg0MDkwLCAweDQwOTEsIDB4NDA5MiwgMHg0MDkzLCAweDQwOTQsIDB4NDA5NSwKLSAgICAweDQwOTYsIDB4NDA5NywgMHg0MDk4LCAweDQwOTksIDB4NDA5QSwgMHg0MDlCLCAweDQwOUMsIDB4NDA5RCwKLSAgICAweDQwOUUsIDB4NDA5RiwgMHg0MEEwLCAweDQwQTEsIDB4NDBBMiwgMHg0MEEzLCAweDQwQTQsIDB4NDBBNSwKLSAgICAweDQwQTYsIDB4NDBBNywgMHg0MEE4LCAweDQwQTksIDB4NDBBQSwgMHg0MEFCLCAweDQwQUMsIDB4NDBBRCwKLSAgICAweDQwQUUsIDB4NDBBRiwgMHg0MEIwLCAweDQwQjEsIDB4NDBCMiwgMHg0MEIzLCAweDQwQjQsIDB4NDBCNSwKLSAgICAweDQwQjYsIDB4NDBCNywgMHg0MEI4LCAweDQwQjksIDB4NDBCQSwgMHg0MEJCLCAweDQwQkMsIDB4NDBCRCwKLSAgICAweDQwQkUsIDB4NDBCRiwgMHg0MEMwLCAweDQwQzEsIDB4NDBDMiwgMHg0MEMzLCAweDQwQzQsIDB4NDBDNSwKLSAgICAweDQwQzYsIDB4NDBDNywgMHg0MEM4LCAweDQwQzksIDB4NDBDQSwgMHg0MENCLCAweDQwQ0MsIDB4NDBDRCwKLSAgICAweDQwQ0UsIDB4NDBDRiwgMHg0MEQwLCAweDQwRDEsIDB4NDBEMiwgMHg0MEQzLCAweDQwRDQsIDB4NDBENSwKLSAgICAweDQwRDYsIDB4NDBENywgMHg0MEQ4LCAweDQwRDksIDB4NDBEQSwgMHg0MERCLCAweDQwREMsIDB4NDBERCwKLSAgICAweDQwREUsIDB4NDBERiwgMHg0MEUwLCAweDQwRTEsIDB4NDBFMiwgMHg0MEUzLCAweDQwRTQsIDB4NDBFNSwKLSAgICAweDQwRTYsIDB4NDBFNywgMHg0MEU4LCAweDQwRTksIDB4NDBFQSwgMHg0MEVCLCAweDQwRUMsIDB4NDBFRCwKLSAgICAweDQwRUUsIDB4NDBFRiwgMHg0MEYwLCAweDQwRjEsIDB4NDBGMiwgMHg0MEYzLCAweDQwRjQsIDB4NDBGNSwKLSAgICAweDQwRjYsIDB4NDBGNywgMHg0MEY4LCAweDQwRjksIDB4NDBGQSwgMHg0MEZCLCAweDQwRkMsIDB4NDBGRCwKLSAgICAweDQwRkUsIDB4NDBGRiwgMHg0MTAwLCAweDQxMDEsIDB4NDEwMiwgMHg0MTAzLCAweDQxMDQsIDB4NDEwNSwKLSAgICAweDQxMDYsIDB4NDEwNywgMHg0MTA4LCAweDQxMDksIDB4NDEwQSwgMHg0MTBCLCAweDQxMEMsIDB4NDEwRCwKLSAgICAweDQxMEUsIDB4NDEwRiwgMHg0MTEwLCAweDQxMTEsIDB4NDExMiwgMHg0MTEzLCAweDQxMTQsIDB4NDExNSwKLSAgICAweDQxMTYsIDB4NDExNywgMHg0MTE4LCAweDQxMTksIDB4NDExQSwgMHg0MTFCLCAweDQxMUMsIDB4NDExRCwKLSAgICAweDQxMUUsIDB4NDExRiwgMHg0MTIwLCAweDQxMjEsIDB4NDEyMiwgMHg0MTIzLCAweDQxMjQsIDB4NDEyNSwKLSAgICAweDQxMjYsIDB4NDEyNywgMHg0MTI4LCAweDQxMjksIDB4NDEyQSwgMHg0MTJCLCAweDQxMkMsIDB4NDEyRCwKLSAgICAweDQxMkUsIDB4NDEyRiwgMHg0MTMwLCAweDQxMzEsIDB4NDEzMiwgMHg0MTMzLCAweDQxMzQsIDB4NDEzNSwKLSAgICAweDQxMzYsIDB4NDEzNywgMHg0MTM4LCAweDQxMzksIDB4NDEzQSwgMHg0MTNCLCAweDQxM0MsIDB4NDEzRCwKLSAgICAweDQxM0UsIDB4NDEzRiwgMHg0MTQwLCAweDQxNDEsIDB4NDE0MiwgMHg0MTQzLCAweDQxNDQsIDB4NDE0NSwKLSAgICAweDQxNDYsIDB4NDE0NywgMHg0MTQ4LCAweDQxNDksIDB4NDE0QSwgMHg0MTRCLCAweDQxNEMsIDB4NDE0RCwKLSAgICAweDQxNEUsIDB4NDE0RiwgMHg0MTUwLCAweDQxNTEsIDB4NDE1MiwgMHg0MTUzLCAweDQxNTQsIDB4NDE1NSwKLSAgICAweDQxNTYsIDB4NDE1NywgMHg0MTU4LCAweDQxNTksIDB4NDE1QSwgMHg0MTVCLCAweDQxNUMsIDB4NDE1RCwKLSAgICAweDQxNUUsIDB4NDE2MCwgMHg0MTYxLCAweDQxNjIsIDB4NDE2MywgMHg0MTY0LCAweDQxNjUsIDB4NDE2NiwKLSAgICAweDQxNjcsIDB4NDE2OCwgMHg0MTY5LCAweDQxNkEsIDB4NDE2QiwgMHg0MTZDLCAweDQxNkQsIDB4NDE2RSwKLSAgICAweDQxNkYsIDB4NDE3MCwgMHg0MTcxLCAweDQxNzIsIDB4NDE3MywgMHg0MTc0LCAweDQxNzUsIDB4NDE3NiwKLSAgICAweDQxNzcsIDB4NDE3OCwgMHg0MTc5LCAweDQxN0EsIDB4NDE3QiwgMHg0MTdDLCAweDQxN0QsIDB4NDE3RSwKLSAgICAweDQxN0YsIDB4NDE4MCwgMHg0MTgxLCAweDQxODIsIDB4NDE4MywgMHg0MTg0LCAweDQxODUsIDB4NDE4NiwKLSAgICAweDQxODcsIDB4NDE4OCwgMHg0MTg5LCAweDQxOEEsIDB4NDE4QiwgMHg0MThDLCAweDQxOEQsIDB4NDE4RSwKLSAgICAweDQxOEYsIDB4NDE5MCwgMHg0MTkxLCAweDQxOTIsIDB4NDE5MywgMHg0MTk0LCAweDQxOTUsIDB4NDE5NiwKLSAgICAweDQxOTcsIDB4NDE5OCwgMHg0MTk5LCAweDQxOUEsIDB4NDE5QiwgMHg0MTlDLCAweDQxOUQsIDB4NDE5RSwKLSAgICAweDQxOUYsIDB4NDFBMCwgMHg0MUExLCAweDQxQTIsIDB4NDFBMywgMHg0MUE0LCAweDQxQTUsIDB4NDFBNiwKLSAgICAweDQxQTcsIDB4NDFBOCwgMHg0MUE5LCAweDQxQUEsIDB4NDFBQiwgMHg0MUFDLCAweDQxQUQsIDB4NDFBRSwKLSAgICAweDQxQUYsIDB4NDFCMCwgMHg0MUIxLCAweDQxQjIsIDB4NDFCMywgMHg0MUI0LCAweDQxQjUsIDB4NDFCNiwKLSAgICAweDQxQjcsIDB4NDFCOCwgMHg0MUI5LCAweDQxQkEsIDB4NDFCQiwgMHg0MUJDLCAweDQxQkQsIDB4NDFCRSwKLSAgICAweDQxQkYsIDB4NDFDMCwgMHg0MUMxLCAweDQxQzIsIDB4NDFDMywgMHg0MUM0LCAweDQxQzUsIDB4NDFDNiwKLSAgICAweDQxQzcsIDB4NDFDOCwgMHg0MUM5LCAweDQxQ0EsIDB4NDFDQiwgMHg0MUNDLCAweDQxQ0QsIDB4NDFDRSwKLSAgICAweDQxQ0YsIDB4NDFEMCwgMHg0MUQxLCAweDQxRDIsIDB4NDFEMywgMHg0MUQ0LCAweDQxRDUsIDB4NDFENiwKLSAgICAweDQxRDcsIDB4NDFEOCwgMHg0MUQ5LCAweDQxREEsIDB4NDFEQiwgMHg0MURDLCAweDQxREQsIDB4NDFERSwKLSAgICAweDQxREYsIDB4NDFFMCwgMHg0MUUxLCAweDQxRTIsIDB4NDFFMywgMHg0MUU0LCAweDQxRTUsIDB4NDFFNiwKLSAgICAweDQxRTcsIDB4NDFFOCwgMHg0MUU5LCAweDQxRUEsIDB4NDFFQiwgMHg0MUVDLCAweDQxRUQsIDB4NDFFRSwKLSAgICAweDQxRUYsIDB4NDFGMCwgMHg0MUYxLCAweDQxRjIsIDB4NDFGMywgMHg0MUY0LCAweDQxRjUsIDB4NDFGNiwKLSAgICAweDQxRjcsIDB4NDFGOCwgMHg0MUY5LCAweDQxRkEsIDB4NDFGQiwgMHg0MUZDLCAweDQxRkQsIDB4NDFGRSwKLSAgICAweDQxRkYsIDB4NDIwMCwgMHg0MjAxLCAweDQyMDIsIDB4NDIwMywgMHg0MjA0LCAweDQyMDUsIDB4NDIwNiwKLSAgICAweDQyMDcsIDB4NDIwOCwgMHg0MjA5LCAweDQyMEEsIDB4NDIwQiwgMHg0MjBDLCAweDQyMEQsIDB4NDIwRSwKLSAgICAweDQyMEYsIDB4NDIxMCwgMHg0MjExLCAweDQyMTIsIDB4NDIxMywgMHg0MjE0LCAweDQyMTUsIDB4NDIxNiwKLSAgICAweDQyMTcsIDB4NDIxOCwgMHg0MjE5LCAweDQyMUEsIDB4NDIxQiwgMHg0MjFDLCAweDQyMUQsIDB4NDIxRSwKLSAgICAweDQyMUYsIDB4NDIyMCwgMHg0MjIxLCAweDQyMjIsIDB4NDIyMywgMHg0MjI0LCAweDQyMjUsIDB4NDIyNiwKLSAgICAweDQyMjcsIDB4NDIyOCwgMHg0MjI5LCAweDQyMkEsIDB4NDIyQiwgMHg0MjJDLCAweDQyMkQsIDB4NDIyRSwKLSAgICAweDQyMkYsIDB4NDIzMCwgMHg0MjMxLCAweDQyMzIsIDB4NDIzMywgMHg0MjM0LCAweDQyMzUsIDB4NDIzNiwKLSAgICAweDQyMzcsIDB4NDIzOCwgMHg0MjM5LCAweDQyM0EsIDB4NDIzQiwgMHg0MjNDLCAweDQyM0QsIDB4NDIzRSwKLSAgICAweDQyM0YsIDB4NDI0MCwgMHg0MjQxLCAweDQyNDIsIDB4NDI0MywgMHg0MjQ0LCAweDQyNDUsIDB4NDI0NiwKLSAgICAweDQyNDcsIDB4NDI0OCwgMHg0MjQ5LCAweDQyNEEsIDB4NDI0QiwgMHg0MjRDLCAweDQyNEQsIDB4NDI0RSwKLSAgICAweDQyNEYsIDB4NDI1MCwgMHg0MjUxLCAweDQyNTIsIDB4NDI1MywgMHg0MjU0LCAweDQyNTUsIDB4NDI1NiwKLSAgICAweDQyNTcsIDB4NDI1OCwgMHg0MjU5LCAweDQyNUEsIDB4NDI1QiwgMHg0MjVDLCAweDQyNUQsIDB4NDI1RSwKLSAgICAweDQyNUYsIDB4NDI2MCwgMHg0MjYxLCAweDQyNjIsIDB4NDI2MywgMHg0MjY0LCAweDQyNjUsIDB4NDI2NiwKLSAgICAweDQyNjcsIDB4NDI2OCwgMHg0MjY5LCAweDQyNkEsIDB4NDI2QiwgMHg0MjZDLCAweDQyNkQsIDB4NDI2RSwKLSAgICAweDQyNkYsIDB4NDI3MCwgMHg0MjcxLCAweDQyNzIsIDB4NDI3MywgMHg0Mjc0LCAweDQyNzUsIDB4NDI3NiwKLSAgICAweDQyNzcsIDB4NDI3OCwgMHg0Mjc5LCAweDQyN0EsIDB4NDI3QiwgMHg0MjdDLCAweDQyN0QsIDB4NDI3RSwKLSAgICAweDQyN0YsIDB4NDI4MCwgMHg0MjgxLCAweDQyODIsIDB4NDI4MywgMHg0Mjg0LCAweDQyODUsIDB4NDI4NiwKLSAgICAweDQyODcsIDB4NDI4OCwgMHg0Mjg5LCAweDQyOEEsIDB4NDI4QiwgMHg0MjhDLCAweDQyOEQsIDB4NDI4RSwKLSAgICAweDQyOEYsIDB4NDI5MCwgMHg0MjkxLCAweDQyOTIsIDB4NDI5MywgMHg0Mjk0LCAweDQyOTUsIDB4NDI5NiwKLSAgICAweDQyOTcsIDB4NDI5OCwgMHg0Mjk5LCAweDQyOUEsIDB4NDI5QiwgMHg0MjlDLCAweDQyOUQsIDB4NDI5RSwKLSAgICAweDQyOUYsIDB4NDJBMCwgMHg0MkExLCAweDQyQTIsIDB4NDJBMywgMHg0MkE0LCAweDQyQTUsIDB4NDJBNiwKLSAgICAweDQyQTcsIDB4NDJBOCwgMHg0MkE5LCAweDQyQUEsIDB4NDJBQiwgMHg0MkFDLCAweDQyQUQsIDB4NDJBRSwKLSAgICAweDQyQUYsIDB4NDJCMCwgMHg0MkIxLCAweDQyQjIsIDB4NDJCMywgMHg0MkI0LCAweDQyQjUsIDB4NDJCNiwKLSAgICAweDQyQjcsIDB4NDJCOCwgMHg0MkI5LCAweDQyQkEsIDB4NDJCQiwgMHg0MkJDLCAweDQyQkQsIDB4NDJCRSwKLSAgICAweDQyQkYsIDB4NDJDMCwgMHg0MkMxLCAweDQyQzIsIDB4NDJDMywgMHg0MkM0LCAweDQyQzUsIDB4NDJDNiwKLSAgICAweDQyQzcsIDB4NDJDOCwgMHg0MkM5LCAweDQyQ0EsIDB4NDJDQiwgMHg0MkNDLCAweDQyQ0QsIDB4NDJDRSwKLSAgICAweDQyQ0YsIDB4NDJEMCwgMHg0MkQxLCAweDQyRDIsIDB4NDJEMywgMHg0MkQ0LCAweDQyRDUsIDB4NDJENiwKLSAgICAweDQyRDcsIDB4NDJEOCwgMHg0MkQ5LCAweDQyREEsIDB4NDJEQiwgMHg0MkRDLCAweDQyREQsIDB4NDJERSwKLSAgICAweDQyREYsIDB4NDJFMCwgMHg0MkUxLCAweDQyRTIsIDB4NDJFMywgMHg0MkU0LCAweDQyRTUsIDB4NDJFNiwKLSAgICAweDQyRTcsIDB4NDJFOCwgMHg0MkU5LCAweDQyRUEsIDB4NDJFQiwgMHg0MkVDLCAweDQyRUQsIDB4NDJFRSwKLSAgICAweDQyRUYsIDB4NDJGMCwgMHg0MkYxLCAweDQyRjIsIDB4NDJGMywgMHg0MkY0LCAweDQyRjUsIDB4NDJGNiwKLSAgICAweDQyRjcsIDB4NDJGOCwgMHg0MkY5LCAweDQyRkEsIDB4NDJGQiwgMHg0MkZDLCAweDQyRkQsIDB4NDJGRSwKLSAgICAweDQyRkYsIDB4NDMwMCwgMHg0MzAxLCAweDQzMDIsIDB4NDMwMywgMHg0MzA0LCAweDQzMDUsIDB4NDMwNiwKLSAgICAweDQzMDcsIDB4NDMwOCwgMHg0MzA5LCAweDQzMEEsIDB4NDMwQiwgMHg0MzBDLCAweDQzMEQsIDB4NDMwRSwKLSAgICAweDQzMEYsIDB4NDMxMCwgMHg0MzExLCAweDQzMTIsIDB4NDMxMywgMHg0MzE0LCAweDQzMTUsIDB4NDMxNiwKLSAgICAweDQzMTcsIDB4NDMxOCwgMHg0MzE5LCAweDQzMUEsIDB4NDMxQiwgMHg0MzFDLCAweDQzMUQsIDB4NDMxRSwKLSAgICAweDQzMUYsIDB4NDMyMCwgMHg0MzIxLCAweDQzMjIsIDB4NDMyMywgMHg0MzI0LCAweDQzMjUsIDB4NDMyNiwKLSAgICAweDQzMjcsIDB4NDMyOCwgMHg0MzI5LCAweDQzMkEsIDB4NDMyQiwgMHg0MzJDLCAweDQzMkQsIDB4NDMyRSwKLSAgICAweDQzMkYsIDB4NDMzMCwgMHg0MzMxLCAweDQzMzIsIDB4NDMzMywgMHg0MzM0LCAweDQzMzUsIDB4NDMzNiwKLSAgICAweDQzMzgsIDB4NDMzOSwgMHg0MzNBLCAweDQzM0IsIDB4NDMzQywgMHg0MzNELCAweDQzM0UsIDB4NDMzRiwKLSAgICAweDQzNDAsIDB4NDM0MSwgMHg0MzQyLCAweDQzNDMsIDB4NDM0NCwgMHg0MzQ1LCAweDQzNDYsIDB4NDM0NywKLSAgICAweDQzNDgsIDB4NDM0OSwgMHg0MzRBLCAweDQzNEIsIDB4NDM0QywgMHg0MzRELCAweDQzNEUsIDB4NDM0RiwKLSAgICAweDQzNTAsIDB4NDM1MSwgMHg0MzUyLCAweDQzNTMsIDB4NDM1NCwgMHg0MzU1LCAweDQzNTYsIDB4NDM1NywKLSAgICAweDQzNTgsIDB4NDM1OSwgMHg0MzVBLCAweDQzNUIsIDB4NDM1QywgMHg0MzVELCAweDQzNUUsIDB4NDM1RiwKLSAgICAweDQzNjAsIDB4NDM2MSwgMHg0MzYyLCAweDQzNjMsIDB4NDM2NCwgMHg0MzY1LCAweDQzNjYsIDB4NDM2NywKLSAgICAweDQzNjgsIDB4NDM2OSwgMHg0MzZBLCAweDQzNkIsIDB4NDM2QywgMHg0MzZELCAweDQzNkUsIDB4NDM2RiwKLSAgICAweDQzNzAsIDB4NDM3MSwgMHg0MzcyLCAweDQzNzMsIDB4NDM3NCwgMHg0Mzc1LCAweDQzNzYsIDB4NDM3NywKLSAgICAweDQzNzgsIDB4NDM3OSwgMHg0MzdBLCAweDQzN0IsIDB4NDM3QywgMHg0MzdELCAweDQzN0UsIDB4NDM3RiwKLSAgICAweDQzODAsIDB4NDM4MSwgMHg0MzgyLCAweDQzODMsIDB4NDM4NCwgMHg0Mzg1LCAweDQzODYsIDB4NDM4NywKLSAgICAweDQzODgsIDB4NDM4OSwgMHg0MzhBLCAweDQzOEIsIDB4NDM4QywgMHg0MzhELCAweDQzOEUsIDB4NDM4RiwKLSAgICAweDQzOTAsIDB4NDM5MSwgMHg0MzkyLCAweDQzOTMsIDB4NDM5NCwgMHg0Mzk1LCAweDQzOTYsIDB4NDM5NywKLSAgICAweDQzOTgsIDB4NDM5OSwgMHg0MzlBLCAweDQzOUIsIDB4NDM5QywgMHg0MzlELCAweDQzOUUsIDB4NDM5RiwKLSAgICAweDQzQTAsIDB4NDNBMSwgMHg0M0EyLCAweDQzQTMsIDB4NDNBNCwgMHg0M0E1LCAweDQzQTYsIDB4NDNBNywKLSAgICAweDQzQTgsIDB4NDNBOSwgMHg0M0FBLCAweDQzQUIsIDB4NDNBRCwgMHg0M0FFLCAweDQzQUYsIDB4NDNCMCwKLSAgICAweDQzQjIsIDB4NDNCMywgMHg0M0I0LCAweDQzQjUsIDB4NDNCNiwgMHg0M0I3LCAweDQzQjgsIDB4NDNCOSwKLSAgICAweDQzQkEsIDB4NDNCQiwgMHg0M0JDLCAweDQzQkQsIDB4NDNCRSwgMHg0M0JGLCAweDQzQzAsIDB4NDNDMSwKLSAgICAweDQzQzIsIDB4NDNDMywgMHg0M0M0LCAweDQzQzUsIDB4NDNDNiwgMHg0M0M3LCAweDQzQzgsIDB4NDNDOSwKLSAgICAweDQzQ0EsIDB4NDNDQiwgMHg0M0NDLCAweDQzQ0QsIDB4NDNDRSwgMHg0M0NGLCAweDQzRDAsIDB4NDNEMSwKLSAgICAweDQzRDIsIDB4NDNEMywgMHg0M0Q0LCAweDQzRDUsIDB4NDNENiwgMHg0M0Q3LCAweDQzRDgsIDB4NDNEOSwKLSAgICAweDQzREEsIDB4NDNEQiwgMHg0M0RDLCAweDQzREUsIDB4NDNERiwgMHg0M0UwLCAweDQzRTEsIDB4NDNFMiwKLSAgICAweDQzRTMsIDB4NDNFNCwgMHg0M0U1LCAweDQzRTYsIDB4NDNFNywgMHg0M0U4LCAweDQzRTksIDB4NDNFQSwKLSAgICAweDQzRUIsIDB4NDNFQywgMHg0M0VELCAweDQzRUUsIDB4NDNFRiwgMHg0M0YwLCAweDQzRjEsIDB4NDNGMiwKLSAgICAweDQzRjMsIDB4NDNGNCwgMHg0M0Y1LCAweDQzRjYsIDB4NDNGNywgMHg0M0Y4LCAweDQzRjksIDB4NDNGQSwKLSAgICAweDQzRkIsIDB4NDNGQywgMHg0M0ZELCAweDQzRkUsIDB4NDNGRiwgMHg0NDAwLCAweDQ0MDEsIDB4NDQwMiwKLSAgICAweDQ0MDMsIDB4NDQwNCwgMHg0NDA1LCAweDQ0MDYsIDB4NDQwNywgMHg0NDA4LCAweDQ0MDksIDB4NDQwQSwKLSAgICAweDQ0MEIsIDB4NDQwQywgMHg0NDBELCAweDQ0MEUsIDB4NDQwRiwgMHg0NDEwLCAweDQ0MTEsIDB4NDQxMiwKLSAgICAweDQ0MTMsIDB4NDQxNCwgMHg0NDE1LCAweDQ0MTYsIDB4NDQxNywgMHg0NDE4LCAweDQ0MTksIDB4NDQxQSwKLSAgICAweDQ0MUIsIDB4NDQxQywgMHg0NDFELCAweDQ0MUUsIDB4NDQxRiwgMHg0NDIwLCAweDQ0MjEsIDB4NDQyMiwKLSAgICAweDQ0MjMsIDB4NDQyNCwgMHg0NDI1LCAweDQ0MjYsIDB4NDQyNywgMHg0NDI4LCAweDQ0MjksIDB4NDQyQSwKLSAgICAweDQ0MkIsIDB4NDQyQywgMHg0NDJELCAweDQ0MkUsIDB4NDQyRiwgMHg0NDMwLCAweDQ0MzEsIDB4NDQzMiwKLSAgICAweDQ0MzMsIDB4NDQzNCwgMHg0NDM1LCAweDQ0MzYsIDB4NDQzNywgMHg0NDM4LCAweDQ0MzksIDB4NDQzQSwKLSAgICAweDQ0M0IsIDB4NDQzQywgMHg0NDNELCAweDQ0M0UsIDB4NDQzRiwgMHg0NDQwLCAweDQ0NDEsIDB4NDQ0MiwKLSAgICAweDQ0NDMsIDB4NDQ0NCwgMHg0NDQ1LCAweDQ0NDYsIDB4NDQ0NywgMHg0NDQ4LCAweDQ0NDksIDB4NDQ0QSwKLSAgICAweDQ0NEIsIDB4NDQ0QywgMHg0NDRELCAweDQ0NEUsIDB4NDQ0RiwgMHg0NDUwLCAweDQ0NTEsIDB4NDQ1MiwKLSAgICAweDQ0NTMsIDB4NDQ1NCwgMHg0NDU1LCAweDQ0NTYsIDB4NDQ1NywgMHg0NDU4LCAweDQ0NTksIDB4NDQ1QSwKLSAgICAweDQ0NUIsIDB4NDQ1QywgMHg0NDVELCAweDQ0NUUsIDB4NDQ1RiwgMHg0NDYwLCAweDQ0NjEsIDB4NDQ2MiwKLSAgICAweDQ0NjMsIDB4NDQ2NCwgMHg0NDY1LCAweDQ0NjYsIDB4NDQ2NywgMHg0NDY4LCAweDQ0NjksIDB4NDQ2QSwKLSAgICAweDQ0NkIsIDB4NDQ2QywgMHg0NDZELCAweDQ0NkUsIDB4NDQ2RiwgMHg0NDcwLCAweDQ0NzEsIDB4NDQ3MiwKLSAgICAweDQ0NzMsIDB4NDQ3NCwgMHg0NDc1LCAweDQ0NzYsIDB4NDQ3NywgMHg0NDc4LCAweDQ0NzksIDB4NDQ3QSwKLSAgICAweDQ0N0IsIDB4NDQ3QywgMHg0NDdELCAweDQ0N0UsIDB4NDQ3RiwgMHg0NDgwLCAweDQ0ODEsIDB4NDQ4MiwKLSAgICAweDQ0ODMsIDB4NDQ4NCwgMHg0NDg1LCAweDQ0ODYsIDB4NDQ4NywgMHg0NDg4LCAweDQ0ODksIDB4NDQ4QSwKLSAgICAweDQ0OEIsIDB4NDQ4QywgMHg0NDhELCAweDQ0OEUsIDB4NDQ4RiwgMHg0NDkwLCAweDQ0OTEsIDB4NDQ5MiwKLSAgICAweDQ0OTMsIDB4NDQ5NCwgMHg0NDk1LCAweDQ0OTYsIDB4NDQ5NywgMHg0NDk4LCAweDQ0OTksIDB4NDQ5QSwKLSAgICAweDQ0OUIsIDB4NDQ5QywgMHg0NDlELCAweDQ0OUUsIDB4NDQ5RiwgMHg0NEEwLCAweDQ0QTEsIDB4NDRBMiwKLSAgICAweDQ0QTMsIDB4NDRBNCwgMHg0NEE1LCAweDQ0QTYsIDB4NDRBNywgMHg0NEE4LCAweDQ0QTksIDB4NDRBQSwKLSAgICAweDQ0QUIsIDB4NDRBQywgMHg0NEFELCAweDQ0QUUsIDB4NDRBRiwgMHg0NEIwLCAweDQ0QjEsIDB4NDRCMiwKLSAgICAweDQ0QjMsIDB4NDRCNCwgMHg0NEI1LCAweDQ0QjYsIDB4NDRCNywgMHg0NEI4LCAweDQ0QjksIDB4NDRCQSwKLSAgICAweDQ0QkIsIDB4NDRCQywgMHg0NEJELCAweDQ0QkUsIDB4NDRCRiwgMHg0NEMwLCAweDQ0QzEsIDB4NDRDMiwKLSAgICAweDQ0QzMsIDB4NDRDNCwgMHg0NEM1LCAweDQ0QzYsIDB4NDRDNywgMHg0NEM4LCAweDQ0QzksIDB4NDRDQSwKLSAgICAweDQ0Q0IsIDB4NDRDQywgMHg0NENELCAweDQ0Q0UsIDB4NDRDRiwgMHg0NEQwLCAweDQ0RDEsIDB4NDREMiwKLSAgICAweDQ0RDMsIDB4NDRENCwgMHg0NEQ1LCAweDQ0RDcsIDB4NDREOCwgMHg0NEQ5LCAweDQ0REEsIDB4NDREQiwKLSAgICAweDQ0REMsIDB4NDRERCwgMHg0NERFLCAweDQ0REYsIDB4NDRFMCwgMHg0NEUxLCAweDQ0RTIsIDB4NDRFMywKLSAgICAweDQ0RTQsIDB4NDRFNSwgMHg0NEU2LCAweDQ0RTcsIDB4NDRFOCwgMHg0NEU5LCAweDQ0RUEsIDB4NDRFQiwKLSAgICAweDQ0RUMsIDB4NDRFRCwgMHg0NEVFLCAweDQ0RUYsIDB4NDRGMCwgMHg0NEYxLCAweDQ0RjIsIDB4NDRGMywKLSAgICAweDQ0RjQsIDB4NDRGNSwgMHg0NEY2LCAweDQ0RjcsIDB4NDRGOCwgMHg0NEY5LCAweDQ0RkEsIDB4NDRGQiwKLSAgICAweDQ0RkMsIDB4NDRGRCwgMHg0NEZFLCAweDQ0RkYsIDB4NDUwMCwgMHg0NTAxLCAweDQ1MDIsIDB4NDUwMywKLSAgICAweDQ1MDQsIDB4NDUwNSwgMHg0NTA2LCAweDQ1MDcsIDB4NDUwOCwgMHg0NTA5LCAweDQ1MEEsIDB4NDUwQiwKLSAgICAweDQ1MEMsIDB4NDUwRCwgMHg0NTBFLCAweDQ1MEYsIDB4NDUxMCwgMHg0NTExLCAweDQ1MTIsIDB4NDUxMywKLSAgICAweDQ1MTQsIDB4NDUxNSwgMHg0NTE2LCAweDQ1MTcsIDB4NDUxOCwgMHg0NTE5LCAweDQ1MUEsIDB4NDUxQiwKLSAgICAweDQ1MUMsIDB4NDUxRCwgMHg0NTFFLCAweDQ1MUYsIDB4NDUyMCwgMHg0NTIxLCAweDQ1MjIsIDB4NDUyMywKLSAgICAweDQ1MjQsIDB4NDUyNSwgMHg0NTI2LCAweDQ1MjcsIDB4NDUyOCwgMHg0NTI5LCAweDQ1MkEsIDB4NDUyQiwKLSAgICAweDQ1MkMsIDB4NDUyRCwgMHg0NTJFLCAweDQ1MkYsIDB4NDUzMCwgMHg0NTMxLCAweDQ1MzIsIDB4NDUzMywKLSAgICAweDQ1MzQsIDB4NDUzNSwgMHg0NTM2LCAweDQ1MzcsIDB4NDUzOCwgMHg0NTM5LCAweDQ1M0EsIDB4NDUzQiwKLSAgICAweDQ1M0MsIDB4NDUzRCwgMHg0NTNFLCAweDQ1M0YsIDB4NDU0MCwgMHg0NTQxLCAweDQ1NDIsIDB4NDU0MywKLSAgICAweDQ1NDQsIDB4NDU0NSwgMHg0NTQ2LCAweDQ1NDcsIDB4NDU0OCwgMHg0NTQ5LCAweDQ1NEEsIDB4NDU0QiwKLSAgICAweDQ1NEMsIDB4NDU0RCwgMHg0NTRFLCAweDQ1NEYsIDB4NDU1MCwgMHg0NTUxLCAweDQ1NTIsIDB4NDU1MywKLSAgICAweDQ1NTQsIDB4NDU1NSwgMHg0NTU2LCAweDQ1NTcsIDB4NDU1OCwgMHg0NTU5LCAweDQ1NUEsIDB4NDU1QiwKLSAgICAweDQ1NUMsIDB4NDU1RCwgMHg0NTVFLCAweDQ1NUYsIDB4NDU2MCwgMHg0NTYxLCAweDQ1NjIsIDB4NDU2MywKLSAgICAweDQ1NjQsIDB4NDU2NSwgMHg0NTY2LCAweDQ1NjcsIDB4NDU2OCwgMHg0NTY5LCAweDQ1NkEsIDB4NDU2QiwKLSAgICAweDQ1NkMsIDB4NDU2RCwgMHg0NTZFLCAweDQ1NkYsIDB4NDU3MCwgMHg0NTcxLCAweDQ1NzIsIDB4NDU3MywKLSAgICAweDQ1NzQsIDB4NDU3NSwgMHg0NTc2LCAweDQ1NzcsIDB4NDU3OCwgMHg0NTc5LCAweDQ1N0EsIDB4NDU3QiwKLSAgICAweDQ1N0MsIDB4NDU3RCwgMHg0NTdFLCAweDQ1N0YsIDB4NDU4MCwgMHg0NTgxLCAweDQ1ODIsIDB4NDU4MywKLSAgICAweDQ1ODQsIDB4NDU4NSwgMHg0NTg2LCAweDQ1ODcsIDB4NDU4OCwgMHg0NTg5LCAweDQ1OEEsIDB4NDU4QiwKLSAgICAweDQ1OEMsIDB4NDU4RCwgMHg0NThFLCAweDQ1OEYsIDB4NDU5MCwgMHg0NTkxLCAweDQ1OTIsIDB4NDU5MywKLSAgICAweDQ1OTQsIDB4NDU5NSwgMHg0NTk2LCAweDQ1OTcsIDB4NDU5OCwgMHg0NTk5LCAweDQ1OUEsIDB4NDU5QiwKLSAgICAweDQ1OUMsIDB4NDU5RCwgMHg0NTlFLCAweDQ1OUYsIDB4NDVBMCwgMHg0NUExLCAweDQ1QTIsIDB4NDVBMywKLSAgICAweDQ1QTQsIDB4NDVBNSwgMHg0NUE2LCAweDQ1QTcsIDB4NDVBOCwgMHg0NUE5LCAweDQ1QUEsIDB4NDVBQiwKLSAgICAweDQ1QUMsIDB4NDVBRCwgMHg0NUFFLCAweDQ1QUYsIDB4NDVCMCwgMHg0NUIxLCAweDQ1QjIsIDB4NDVCMywKLSAgICAweDQ1QjQsIDB4NDVCNSwgMHg0NUI2LCAweDQ1QjcsIDB4NDVCOCwgMHg0NUI5LCAweDQ1QkEsIDB4NDVCQiwKLSAgICAweDQ1QkMsIDB4NDVCRCwgMHg0NUJFLCAweDQ1QkYsIDB4NDVDMCwgMHg0NUMxLCAweDQ1QzIsIDB4NDVDMywKLSAgICAweDQ1QzQsIDB4NDVDNSwgMHg0NUM2LCAweDQ1QzcsIDB4NDVDOCwgMHg0NUM5LCAweDQ1Q0EsIDB4NDVDQiwKLSAgICAweDQ1Q0MsIDB4NDVDRCwgMHg0NUNFLCAweDQ1Q0YsIDB4NDVEMCwgMHg0NUQxLCAweDQ1RDIsIDB4NDVEMywKLSAgICAweDQ1RDQsIDB4NDVENSwgMHg0NUQ2LCAweDQ1RDcsIDB4NDVEOCwgMHg0NUQ5LCAweDQ1REEsIDB4NDVEQiwKLSAgICAweDQ1REMsIDB4NDVERCwgMHg0NURFLCAweDQ1REYsIDB4NDVFMCwgMHg0NUUxLCAweDQ1RTIsIDB4NDVFMywKLSAgICAweDQ1RTQsIDB4NDVFNSwgMHg0NUU2LCAweDQ1RTcsIDB4NDVFOCwgMHg0NUU5LCAweDQ1RUEsIDB4NDVFQiwKLSAgICAweDQ1RUMsIDB4NDVFRCwgMHg0NUVFLCAweDQ1RUYsIDB4NDVGMCwgMHg0NUYxLCAweDQ1RjIsIDB4NDVGMywKLSAgICAweDQ1RjQsIDB4NDVGNSwgMHg0NUY2LCAweDQ1RjcsIDB4NDVGOCwgMHg0NUY5LCAweDQ1RkEsIDB4NDVGQiwKLSAgICAweDQ1RkMsIDB4NDVGRCwgMHg0NUZFLCAweDQ1RkYsIDB4NDYwMCwgMHg0NjAxLCAweDQ2MDIsIDB4NDYwMywKLSAgICAweDQ2MDQsIDB4NDYwNSwgMHg0NjA2LCAweDQ2MDcsIDB4NDYwOCwgMHg0NjA5LCAweDQ2MEEsIDB4NDYwQiwKLSAgICAweDQ2MEMsIDB4NDYwRCwgMHg0NjBFLCAweDQ2MEYsIDB4NDYxMCwgMHg0NjExLCAweDQ2MTIsIDB4NDYxMywKLSAgICAweDQ2MTQsIDB4NDYxNSwgMHg0NjE2LCAweDQ2MTcsIDB4NDYxOCwgMHg0NjE5LCAweDQ2MUEsIDB4NDYxQiwKLSAgICAweDQ2MUMsIDB4NDYxRCwgMHg0NjFFLCAweDQ2MUYsIDB4NDYyMCwgMHg0NjIxLCAweDQ2MjIsIDB4NDYyMywKLSAgICAweDQ2MjQsIDB4NDYyNSwgMHg0NjI2LCAweDQ2MjcsIDB4NDYyOCwgMHg0NjI5LCAweDQ2MkEsIDB4NDYyQiwKLSAgICAweDQ2MkMsIDB4NDYyRCwgMHg0NjJFLCAweDQ2MkYsIDB4NDYzMCwgMHg0NjMxLCAweDQ2MzIsIDB4NDYzMywKLSAgICAweDQ2MzQsIDB4NDYzNSwgMHg0NjM2LCAweDQ2MzcsIDB4NDYzOCwgMHg0NjM5LCAweDQ2M0EsIDB4NDYzQiwKLSAgICAweDQ2M0MsIDB4NDYzRCwgMHg0NjNFLCAweDQ2M0YsIDB4NDY0MCwgMHg0NjQxLCAweDQ2NDIsIDB4NDY0MywKLSAgICAweDQ2NDQsIDB4NDY0NSwgMHg0NjQ2LCAweDQ2NDcsIDB4NDY0OCwgMHg0NjQ5LCAweDQ2NEEsIDB4NDY0QiwKLSAgICAweDQ2NEQsIDB4NDY0RSwgMHg0NjRGLCAweDQ2NTAsIDB4NDY1MSwgMHg0NjUyLCAweDQ2NTMsIDB4NDY1NCwKLSAgICAweDQ2NTUsIDB4NDY1NiwgMHg0NjU3LCAweDQ2NTgsIDB4NDY1OSwgMHg0NjVBLCAweDQ2NUIsIDB4NDY1QywKLSAgICAweDQ2NUQsIDB4NDY1RSwgMHg0NjVGLCAweDQ2NjAsIDB4NDY2MiwgMHg0NjYzLCAweDQ2NjQsIDB4NDY2NSwKLSAgICAweDQ2NjYsIDB4NDY2NywgMHg0NjY4LCAweDQ2NjksIDB4NDY2QSwgMHg0NjZCLCAweDQ2NkMsIDB4NDY2RCwKLSAgICAweDQ2NkUsIDB4NDY2RiwgMHg0NjcwLCAweDQ2NzEsIDB4NDY3MiwgMHg0NjczLCAweDQ2NzQsIDB4NDY3NSwKLSAgICAweDQ2NzYsIDB4NDY3NywgMHg0Njc4LCAweDQ2NzksIDB4NDY3QSwgMHg0NjdCLCAweDQ2N0MsIDB4NDY3RCwKLSAgICAweDQ2N0UsIDB4NDY3RiwgMHg0NjgwLCAweDQ2ODEsIDB4NDY4MiwgMHg0NjgzLCAweDQ2ODQsIDB4NDY4NSwKLSAgICAweDQ2ODYsIDB4NDY4NywgMHg0Njg4LCAweDQ2ODksIDB4NDY4QSwgMHg0NjhCLCAweDQ2OEMsIDB4NDY4RCwKLSAgICAweDQ2OEUsIDB4NDY4RiwgMHg0NjkwLCAweDQ2OTEsIDB4NDY5MiwgMHg0NjkzLCAweDQ2OTQsIDB4NDY5NSwKLSAgICAweDQ2OTYsIDB4NDY5NywgMHg0Njk4LCAweDQ2OTksIDB4NDY5QSwgMHg0NjlCLCAweDQ2OUMsIDB4NDY5RCwKLSAgICAweDQ2OUUsIDB4NDY5RiwgMHg0NkEwLCAweDQ2QTEsIDB4NDZBMiwgMHg0NkEzLCAweDQ2QTQsIDB4NDZBNSwKLSAgICAweDQ2QTYsIDB4NDZBNywgMHg0NkE4LCAweDQ2QTksIDB4NDZBQSwgMHg0NkFCLCAweDQ2QUMsIDB4NDZBRCwKLSAgICAweDQ2QUUsIDB4NDZBRiwgMHg0NkIwLCAweDQ2QjEsIDB4NDZCMiwgMHg0NkIzLCAweDQ2QjQsIDB4NDZCNSwKLSAgICAweDQ2QjYsIDB4NDZCNywgMHg0NkI4LCAweDQ2QjksIDB4NDZCQSwgMHg0NkJCLCAweDQ2QkMsIDB4NDZCRCwKLSAgICAweDQ2QkUsIDB4NDZCRiwgMHg0NkMwLCAweDQ2QzEsIDB4NDZDMiwgMHg0NkMzLCAweDQ2QzQsIDB4NDZDNSwKLSAgICAweDQ2QzYsIDB4NDZDNywgMHg0NkM4LCAweDQ2QzksIDB4NDZDQSwgMHg0NkNCLCAweDQ2Q0MsIDB4NDZDRCwKLSAgICAweDQ2Q0UsIDB4NDZDRiwgMHg0NkQwLCAweDQ2RDEsIDB4NDZEMiwgMHg0NkQzLCAweDQ2RDQsIDB4NDZENSwKLSAgICAweDQ2RDYsIDB4NDZENywgMHg0NkQ4LCAweDQ2RDksIDB4NDZEQSwgMHg0NkRCLCAweDQ2REMsIDB4NDZERCwKLSAgICAweDQ2REUsIDB4NDZERiwgMHg0NkUwLCAweDQ2RTEsIDB4NDZFMiwgMHg0NkUzLCAweDQ2RTQsIDB4NDZFNSwKLSAgICAweDQ2RTYsIDB4NDZFNywgMHg0NkU4LCAweDQ2RTksIDB4NDZFQSwgMHg0NkVCLCAweDQ2RUMsIDB4NDZFRCwKLSAgICAweDQ2RUUsIDB4NDZFRiwgMHg0NkYwLCAweDQ2RjEsIDB4NDZGMiwgMHg0NkYzLCAweDQ2RjQsIDB4NDZGNSwKLSAgICAweDQ2RjYsIDB4NDZGNywgMHg0NkY4LCAweDQ2RjksIDB4NDZGQSwgMHg0NkZCLCAweDQ2RkMsIDB4NDZGRCwKLSAgICAweDQ2RkUsIDB4NDZGRiwgMHg0NzAwLCAweDQ3MDEsIDB4NDcwMiwgMHg0NzAzLCAweDQ3MDQsIDB4NDcwNSwKLSAgICAweDQ3MDYsIDB4NDcwNywgMHg0NzA4LCAweDQ3MDksIDB4NDcwQSwgMHg0NzBCLCAweDQ3MEMsIDB4NDcwRCwKLSAgICAweDQ3MEUsIDB4NDcwRiwgMHg0NzEwLCAweDQ3MTEsIDB4NDcxMiwgMHg0NzEzLCAweDQ3MTQsIDB4NDcxNSwKLSAgICAweDQ3MTYsIDB4NDcxNywgMHg0NzE4LCAweDQ3MTksIDB4NDcxQSwgMHg0NzFCLCAweDQ3MUMsIDB4NDcxRCwKLSAgICAweDQ3MUUsIDB4NDcxRiwgMHg0NzIwLCAweDQ3MjEsIDB4NDcyMiwgMHg0NzI0LCAweDQ3MjUsIDB4NDcyNiwKLSAgICAweDQ3MjcsIDB4NDcyOCwgMHg0NzJBLCAweDQ3MkIsIDB4NDcyQywgMHg0NzJELCAweDQ3MkUsIDB4NDcyRiwKLSAgICAweDQ3MzAsIDB4NDczMSwgMHg0NzMyLCAweDQ3MzMsIDB4NDczNCwgMHg0NzM1LCAweDQ3MzYsIDB4NDczNywKLSAgICAweDQ3MzgsIDB4NDczOSwgMHg0NzNBLCAweDQ3M0IsIDB4NDczQywgMHg0NzNELCAweDQ3M0UsIDB4NDczRiwKLSAgICAweDQ3NDAsIDB4NDc0MSwgMHg0NzQyLCAweDQ3NDMsIDB4NDc0NCwgMHg0NzQ1LCAweDQ3NDYsIDB4NDc0NywKLSAgICAweDQ3NDgsIDB4NDc0OSwgMHg0NzRBLCAweDQ3NEIsIDB4NDc0QywgMHg0NzRELCAweDQ3NEUsIDB4NDc0RiwKLSAgICAweDQ3NTAsIDB4NDc1MSwgMHg0NzUyLCAweDQ3NTMsIDB4NDc1NCwgMHg0NzU1LCAweDQ3NTYsIDB4NDc1NywKLSAgICAweDQ3NTgsIDB4NDc1OSwgMHg0NzVBLCAweDQ3NUIsIDB4NDc1QywgMHg0NzVELCAweDQ3NUUsIDB4NDc1RiwKLSAgICAweDQ3NjAsIDB4NDc2MSwgMHg0NzYyLCAweDQ3NjMsIDB4NDc2NCwgMHg0NzY1LCAweDQ3NjYsIDB4NDc2NywKLSAgICAweDQ3NjgsIDB4NDc2OSwgMHg0NzZBLCAweDQ3NkIsIDB4NDc2QywgMHg0NzZELCAweDQ3NkUsIDB4NDc2RiwKLSAgICAweDQ3NzAsIDB4NDc3MSwgMHg0NzcyLCAweDQ3NzMsIDB4NDc3NCwgMHg0Nzc1LCAweDQ3NzYsIDB4NDc3NywKLSAgICAweDQ3NzgsIDB4NDc3OSwgMHg0NzdBLCAweDQ3N0IsIDB4NDc3RCwgMHg0NzdFLCAweDQ3N0YsIDB4NDc4MCwKLSAgICAweDQ3ODEsIDB4NDc4MiwgMHg0NzgzLCAweDQ3ODQsIDB4NDc4NSwgMHg0Nzg2LCAweDQ3ODcsIDB4NDc4OCwKLSAgICAweDQ3ODksIDB4NDc4QSwgMHg0NzhCLCAweDQ3OEMsIDB4NDc4RSwgMHg0NzhGLCAweDQ3OTAsIDB4NDc5MSwKLSAgICAweDQ3OTIsIDB4NDc5MywgMHg0Nzk0LCAweDQ3OTUsIDB4NDc5NiwgMHg0Nzk3LCAweDQ3OTgsIDB4NDc5OSwKLSAgICAweDQ3OUEsIDB4NDc5QiwgMHg0NzlDLCAweDQ3OUQsIDB4NDc5RSwgMHg0NzlGLCAweDQ3QTAsIDB4NDdBMSwKLSAgICAweDQ3QTIsIDB4NDdBMywgMHg0N0E0LCAweDQ3QTUsIDB4NDdBNiwgMHg0N0E3LCAweDQ3QTgsIDB4NDdBOSwKLSAgICAweDQ3QUEsIDB4NDdBQiwgMHg0N0FDLCAweDQ3QUQsIDB4NDdBRSwgMHg0N0FGLCAweDQ3QjAsIDB4NDdCMSwKLSAgICAweDQ3QjIsIDB4NDdCMywgMHg0N0I0LCAweDQ3QjUsIDB4NDdCNiwgMHg0N0I3LCAweDQ3QjgsIDB4NDdCOSwKLSAgICAweDQ3QkEsIDB4NDdCQiwgMHg0N0JDLCAweDQ3QkQsIDB4NDdCRSwgMHg0N0JGLCAweDQ3QzAsIDB4NDdDMSwKLSAgICAweDQ3QzIsIDB4NDdDMywgMHg0N0M0LCAweDQ3QzUsIDB4NDdDNiwgMHg0N0M3LCAweDQ3QzgsIDB4NDdDOSwKLSAgICAweDQ3Q0EsIDB4NDdDQiwgMHg0N0NDLCAweDQ3Q0QsIDB4NDdDRSwgMHg0N0NGLCAweDQ3RDAsIDB4NDdEMSwKLSAgICAweDQ3RDIsIDB4NDdEMywgMHg0N0Q0LCAweDQ3RDUsIDB4NDdENiwgMHg0N0Q3LCAweDQ3RDgsIDB4NDdEOSwKLSAgICAweDQ3REEsIDB4NDdEQiwgMHg0N0RDLCAweDQ3REQsIDB4NDdERSwgMHg0N0RGLCAweDQ3RTAsIDB4NDdFMSwKLSAgICAweDQ3RTIsIDB4NDdFMywgMHg0N0U0LCAweDQ3RTUsIDB4NDdFNiwgMHg0N0U3LCAweDQ3RTgsIDB4NDdFOSwKLSAgICAweDQ3RUEsIDB4NDdFQiwgMHg0N0VDLCAweDQ3RUQsIDB4NDdFRSwgMHg0N0VGLCAweDQ3RjAsIDB4NDdGMSwKLSAgICAweDQ3RjIsIDB4NDdGMywgMHg0N0Y0LCAweDQ3RjUsIDB4NDdGNiwgMHg0N0Y3LCAweDQ3RjgsIDB4NDdGOSwKLSAgICAweDQ3RkEsIDB4NDdGQiwgMHg0N0ZDLCAweDQ3RkQsIDB4NDdGRSwgMHg0N0ZGLCAweDQ4MDAsIDB4NDgwMSwKLSAgICAweDQ4MDIsIDB4NDgwMywgMHg0ODA0LCAweDQ4MDUsIDB4NDgwNiwgMHg0ODA3LCAweDQ4MDgsIDB4NDgwOSwKLSAgICAweDQ4MEEsIDB4NDgwQiwgMHg0ODBDLCAweDQ4MEQsIDB4NDgwRSwgMHg0ODBGLCAweDQ4MTAsIDB4NDgxMSwKLSAgICAweDQ4MTIsIDB4NDgxMywgMHg0ODE0LCAweDQ4MTUsIDB4NDgxNiwgMHg0ODE3LCAweDQ4MTgsIDB4NDgxOSwKLSAgICAweDQ4MUEsIDB4NDgxQiwgMHg0ODFDLCAweDQ4MUQsIDB4NDgxRSwgMHg0ODFGLCAweDQ4MjAsIDB4NDgyMSwKLSAgICAweDQ4MjIsIDB4NDgyMywgMHg0ODI0LCAweDQ4MjUsIDB4NDgyNiwgMHg0ODI3LCAweDQ4MjgsIDB4NDgyOSwKLSAgICAweDQ4MkEsIDB4NDgyQiwgMHg0ODJDLCAweDQ4MkQsIDB4NDgyRSwgMHg0ODJGLCAweDQ4MzAsIDB4NDgzMSwKLSAgICAweDQ4MzIsIDB4NDgzMywgMHg0ODM0LCAweDQ4MzUsIDB4NDgzNiwgMHg0ODM3LCAweDQ4MzgsIDB4NDgzOSwKLSAgICAweDQ4M0EsIDB4NDgzQiwgMHg0ODNDLCAweDQ4M0QsIDB4NDgzRSwgMHg0ODNGLCAweDQ4NDAsIDB4NDg0MSwKLSAgICAweDQ4NDIsIDB4NDg0MywgMHg0ODQ0LCAweDQ4NDUsIDB4NDg0NiwgMHg0ODQ3LCAweDQ4NDgsIDB4NDg0OSwKLSAgICAweDQ4NEEsIDB4NDg0QiwgMHg0ODRDLCAweDQ4NEQsIDB4NDg0RSwgMHg0ODRGLCAweDQ4NTAsIDB4NDg1MSwKLSAgICAweDQ4NTIsIDB4NDg1MywgMHg0ODU0LCAweDQ4NTUsIDB4NDg1NiwgMHg0ODU3LCAweDQ4NTgsIDB4NDg1OSwKLSAgICAweDQ4NUEsIDB4NDg1QiwgMHg0ODVDLCAweDQ4NUQsIDB4NDg1RSwgMHg0ODVGLCAweDQ4NjAsIDB4NDg2MSwKLSAgICAweDQ4NjIsIDB4NDg2MywgMHg0ODY0LCAweDQ4NjUsIDB4NDg2NiwgMHg0ODY3LCAweDQ4NjgsIDB4NDg2OSwKLSAgICAweDQ4NkEsIDB4NDg2QiwgMHg0ODZDLCAweDQ4NkQsIDB4NDg2RSwgMHg0ODZGLCAweDQ4NzAsIDB4NDg3MSwKLSAgICAweDQ4NzIsIDB4NDg3MywgMHg0ODc0LCAweDQ4NzUsIDB4NDg3NiwgMHg0ODc3LCAweDQ4NzgsIDB4NDg3OSwKLSAgICAweDQ4N0EsIDB4NDg3QiwgMHg0ODdDLCAweDQ4N0QsIDB4NDg3RSwgMHg0ODdGLCAweDQ4ODAsIDB4NDg4MSwKLSAgICAweDQ4ODIsIDB4NDg4MywgMHg0ODg0LCAweDQ4ODUsIDB4NDg4NiwgMHg0ODg3LCAweDQ4ODgsIDB4NDg4OSwKLSAgICAweDQ4OEEsIDB4NDg4QiwgMHg0ODhDLCAweDQ4OEQsIDB4NDg4RSwgMHg0ODhGLCAweDQ4OTAsIDB4NDg5MSwKLSAgICAweDQ4OTIsIDB4NDg5MywgMHg0ODk0LCAweDQ4OTUsIDB4NDg5NiwgMHg0ODk3LCAweDQ4OTgsIDB4NDg5OSwKLSAgICAweDQ4OUEsIDB4NDg5QiwgMHg0ODlDLCAweDQ4OUQsIDB4NDg5RSwgMHg0ODlGLCAweDQ4QTAsIDB4NDhBMSwKLSAgICAweDQ4QTIsIDB4NDhBMywgMHg0OEE0LCAweDQ4QTUsIDB4NDhBNiwgMHg0OEE3LCAweDQ4QTgsIDB4NDhBOSwKLSAgICAweDQ4QUEsIDB4NDhBQiwgMHg0OEFDLCAweDQ4QUQsIDB4NDhBRSwgMHg0OEFGLCAweDQ4QjAsIDB4NDhCMSwKLSAgICAweDQ4QjIsIDB4NDhCMywgMHg0OEI0LCAweDQ4QjUsIDB4NDhCNiwgMHg0OEI3LCAweDQ4QjgsIDB4NDhCOSwKLSAgICAweDQ4QkEsIDB4NDhCQiwgMHg0OEJDLCAweDQ4QkQsIDB4NDhCRSwgMHg0OEJGLCAweDQ4QzAsIDB4NDhDMSwKLSAgICAweDQ4QzIsIDB4NDhDMywgMHg0OEM0LCAweDQ4QzUsIDB4NDhDNiwgMHg0OEM3LCAweDQ4QzgsIDB4NDhDOSwKLSAgICAweDQ4Q0EsIDB4NDhDQiwgMHg0OENDLCAweDQ4Q0QsIDB4NDhDRSwgMHg0OENGLCAweDQ4RDAsIDB4NDhEMSwKLSAgICAweDQ4RDIsIDB4NDhEMywgMHg0OEQ0LCAweDQ4RDUsIDB4NDhENiwgMHg0OEQ3LCAweDQ4RDgsIDB4NDhEOSwKLSAgICAweDQ4REEsIDB4NDhEQiwgMHg0OERDLCAweDQ4REQsIDB4NDhERSwgMHg0OERGLCAweDQ4RTAsIDB4NDhFMSwKLSAgICAweDQ4RTIsIDB4NDhFMywgMHg0OEU0LCAweDQ4RTUsIDB4NDhFNiwgMHg0OEU3LCAweDQ4RTgsIDB4NDhFOSwKLSAgICAweDQ4RUEsIDB4NDhFQiwgMHg0OEVDLCAweDQ4RUQsIDB4NDhFRSwgMHg0OEVGLCAweDQ4RjAsIDB4NDhGMSwKLSAgICAweDQ4RjIsIDB4NDhGMywgMHg0OEY0LCAweDQ4RjUsIDB4NDhGNiwgMHg0OEY3LCAweDQ4RjgsIDB4NDhGOSwKLSAgICAweDQ4RkEsIDB4NDhGQiwgMHg0OEZDLCAweDQ4RkQsIDB4NDhGRSwgMHg0OEZGLCAweDQ5MDAsIDB4NDkwMSwKLSAgICAweDQ5MDIsIDB4NDkwMywgMHg0OTA0LCAweDQ5MDUsIDB4NDkwNiwgMHg0OTA3LCAweDQ5MDgsIDB4NDkwOSwKLSAgICAweDQ5MEEsIDB4NDkwQiwgMHg0OTBDLCAweDQ5MEQsIDB4NDkwRSwgMHg0OTBGLCAweDQ5MTAsIDB4NDkxMSwKLSAgICAweDQ5MTIsIDB4NDkxMywgMHg0OTE0LCAweDQ5MTUsIDB4NDkxNiwgMHg0OTE3LCAweDQ5MTgsIDB4NDkxOSwKLSAgICAweDQ5MUEsIDB4NDkxQiwgMHg0OTFDLCAweDQ5MUQsIDB4NDkxRSwgMHg0OTFGLCAweDQ5MjAsIDB4NDkyMSwKLSAgICAweDQ5MjIsIDB4NDkyMywgMHg0OTI0LCAweDQ5MjUsIDB4NDkyNiwgMHg0OTI3LCAweDQ5MjgsIDB4NDkyOSwKLSAgICAweDQ5MkEsIDB4NDkyQiwgMHg0OTJDLCAweDQ5MkQsIDB4NDkyRSwgMHg0OTJGLCAweDQ5MzAsIDB4NDkzMSwKLSAgICAweDQ5MzIsIDB4NDkzMywgMHg0OTM0LCAweDQ5MzUsIDB4NDkzNiwgMHg0OTM3LCAweDQ5MzgsIDB4NDkzOSwKLSAgICAweDQ5M0EsIDB4NDkzQiwgMHg0OTNDLCAweDQ5M0QsIDB4NDkzRSwgMHg0OTNGLCAweDQ5NDAsIDB4NDk0MSwKLSAgICAweDQ5NDIsIDB4NDk0MywgMHg0OTQ0LCAweDQ5NDUsIDB4NDk0NiwgMHg0OTQ4LCAweDQ5NDksIDB4NDk0QSwKLSAgICAweDQ5NEIsIDB4NDk0QywgMHg0OTRELCAweDQ5NEUsIDB4NDk0RiwgMHg0OTUwLCAweDQ5NTEsIDB4NDk1MiwKLSAgICAweDQ5NTMsIDB4NDk1NCwgMHg0OTU1LCAweDQ5NTYsIDB4NDk1NywgMHg0OTU4LCAweDQ5NTksIDB4NDk1QSwKLSAgICAweDQ5NUIsIDB4NDk1QywgMHg0OTVELCAweDQ5NUUsIDB4NDk1RiwgMHg0OTYwLCAweDQ5NjEsIDB4NDk2MiwKLSAgICAweDQ5NjMsIDB4NDk2NCwgMHg0OTY1LCAweDQ5NjYsIDB4NDk2NywgMHg0OTY4LCAweDQ5NjksIDB4NDk2QSwKLSAgICAweDQ5NkIsIDB4NDk2QywgMHg0OTZELCAweDQ5NkUsIDB4NDk2RiwgMHg0OTcwLCAweDQ5NzEsIDB4NDk3MiwKLSAgICAweDQ5NzMsIDB4NDk3NCwgMHg0OTc1LCAweDQ5NzYsIDB4NDk3NywgMHg0OTc4LCAweDQ5NzksIDB4NDk3QiwKLSAgICAweDQ5N0MsIDB4NDk3RSwgMHg0OTdGLCAweDQ5ODAsIDB4NDk4MSwgMHg0OTg0LCAweDQ5ODcsIDB4NDk4OCwKLSAgICAweDQ5ODksIDB4NDk4QSwgMHg0OThCLCAweDQ5OEMsIDB4NDk4RCwgMHg0OThFLCAweDQ5OEYsIDB4NDk5MCwKLSAgICAweDQ5OTEsIDB4NDk5MiwgMHg0OTkzLCAweDQ5OTQsIDB4NDk5NSwgMHg0OTk2LCAweDQ5OTcsIDB4NDk5OCwKLSAgICAweDQ5OTksIDB4NDk5QSwgMHg0OTlDLCAweDQ5OUQsIDB4NDk5RSwgMHg0OUEwLCAweDQ5QTEsIDB4NDlBMiwKLSAgICAweDQ5QTMsIDB4NDlBNCwgMHg0OUE1LCAweDQ5QTYsIDB4NDlBNywgMHg0OUE4LCAweDQ5QTksIDB4NDlBQSwKLSAgICAweDQ5QUIsIDB4NDlBQywgMHg0OUFELCAweDQ5QUUsIDB4NDlBRiwgMHg0OUIwLCAweDQ5QjEsIDB4NDlCMiwKLSAgICAweDQ5QjMsIDB4NDlCNCwgMHg0OUI1LCAweDQ5QjgsIDB4NDlCOSwgMHg0OUJBLCAweDQ5QkIsIDB4NDlCQywKLSAgICAweDQ5QkQsIDB4NDlCRSwgMHg0OUJGLCAweDQ5QzAsIDB4NDlDMSwgMHg0OUMyLCAweDQ5QzMsIDB4NDlDNCwKLSAgICAweDQ5QzUsIDB4NDlDNiwgMHg0OUM3LCAweDQ5QzgsIDB4NDlDOSwgMHg0OUNBLCAweDQ5Q0IsIDB4NDlDQywKLSAgICAweDQ5Q0QsIDB4NDlDRSwgMHg0OUNGLCAweDQ5RDAsIDB4NDlEMSwgMHg0OUQyLCAweDQ5RDMsIDB4NDlENCwKLSAgICAweDQ5RDUsIDB4NDlENiwgMHg0OUQ3LCAweDQ5RDgsIDB4NDlEOSwgMHg0OURBLCAweDQ5REIsIDB4NDlEQywKLSAgICAweDQ5REQsIDB4NDlERSwgMHg0OURGLCAweDQ5RTAsIDB4NDlFMSwgMHg0OUUyLCAweDQ5RTMsIDB4NDlFNCwKLSAgICAweDQ5RTUsIDB4NDlFNiwgMHg0OUU3LCAweDQ5RTgsIDB4NDlFOSwgMHg0OUVBLCAweDQ5RUIsIDB4NDlFQywKLSAgICAweDQ5RUQsIDB4NDlFRSwgMHg0OUVGLCAweDQ5RjAsIDB4NDlGMSwgMHg0OUYyLCAweDQ5RjMsIDB4NDlGNCwKLSAgICAweDQ5RjUsIDB4NDlGNiwgMHg0OUY3LCAweDQ5RjgsIDB4NDlGOSwgMHg0OUZBLCAweDQ5RkIsIDB4NDlGQywKLSAgICAweDQ5RkQsIDB4NDlGRSwgMHg0OUZGLCAweDRBMDAsIDB4NEEwMSwgMHg0QTAyLCAweDRBMDMsIDB4NEEwNCwKLSAgICAweDRBMDUsIDB4NEEwNiwgMHg0QTA3LCAweDRBMDgsIDB4NEEwOSwgMHg0QTBBLCAweDRBMEIsIDB4NEEwQywKLSAgICAweDRBMEQsIDB4NEEwRSwgMHg0QTBGLCAweDRBMTAsIDB4NEExMSwgMHg0QTEyLCAweDRBMTMsIDB4NEExNCwKLSAgICAweDRBMTUsIDB4NEExNiwgMHg0QTE3LCAweDRBMTgsIDB4NEExOSwgMHg0QTFBLCAweDRBMUIsIDB4NEExQywKLSAgICAweDRBMUQsIDB4NEExRSwgMHg0QTFGLCAweDRBMjAsIDB4NEEyMSwgMHg0QTIyLCAweDRBMjMsIDB4NEEyNCwKLSAgICAweDRBMjUsIDB4NEEyNiwgMHg0QTI3LCAweDRBMjgsIDB4NEEyOSwgMHg0QTJBLCAweDRBMkIsIDB4NEEyQywKLSAgICAweDRBMkQsIDB4NEEyRSwgMHg0QTJGLCAweDRBMzAsIDB4NEEzMSwgMHg0QTMyLCAweDRBMzMsIDB4NEEzNCwKLSAgICAweDRBMzUsIDB4NEEzNiwgMHg0QTM3LCAweDRBMzgsIDB4NEEzOSwgMHg0QTNBLCAweDRBM0IsIDB4NEEzQywKLSAgICAweDRBM0QsIDB4NEEzRSwgMHg0QTNGLCAweDRBNDAsIDB4NEE0MSwgMHg0QTQyLCAweDRBNDMsIDB4NEE0NCwKLSAgICAweDRBNDUsIDB4NEE0NiwgMHg0QTQ3LCAweDRBNDgsIDB4NEE0OSwgMHg0QTRBLCAweDRBNEIsIDB4NEE0QywKLSAgICAweDRBNEQsIDB4NEE0RSwgMHg0QTRGLCAweDRBNTAsIDB4NEE1MSwgMHg0QTUyLCAweDRBNTMsIDB4NEE1NCwKLSAgICAweDRBNTUsIDB4NEE1NiwgMHg0QTU3LCAweDRBNTgsIDB4NEE1OSwgMHg0QTVBLCAweDRBNUIsIDB4NEE1QywKLSAgICAweDRBNUQsIDB4NEE1RSwgMHg0QTVGLCAweDRBNjAsIDB4NEE2MSwgMHg0QTYyLCAweDRBNjMsIDB4NEE2NCwKLSAgICAweDRBNjUsIDB4NEE2NiwgMHg0QTY3LCAweDRBNjgsIDB4NEE2OSwgMHg0QTZBLCAweDRBNkIsIDB4NEE2QywKLSAgICAweDRBNkQsIDB4NEE2RSwgMHg0QTZGLCAweDRBNzAsIDB4NEE3MSwgMHg0QTcyLCAweDRBNzMsIDB4NEE3NCwKLSAgICAweDRBNzUsIDB4NEE3NiwgMHg0QTc3LCAweDRBNzgsIDB4NEE3OSwgMHg0QTdBLCAweDRBN0IsIDB4NEE3QywKLSAgICAweDRBN0QsIDB4NEE3RSwgMHg0QTdGLCAweDRBODAsIDB4NEE4MSwgMHg0QTgyLCAweDRBODMsIDB4NEE4NCwKLSAgICAweDRBODUsIDB4NEE4NiwgMHg0QTg3LCAweDRBODgsIDB4NEE4OSwgMHg0QThBLCAweDRBOEIsIDB4NEE4QywKLSAgICAweDRBOEQsIDB4NEE4RSwgMHg0QThGLCAweDRBOTAsIDB4NEE5MSwgMHg0QTkyLCAweDRBOTMsIDB4NEE5NCwKLSAgICAweDRBOTUsIDB4NEE5NiwgMHg0QTk3LCAweDRBOTgsIDB4NEE5OSwgMHg0QTlBLCAweDRBOUIsIDB4NEE5QywKLSAgICAweDRBOUQsIDB4NEE5RSwgMHg0QTlGLCAweDRBQTAsIDB4NEFBMSwgMHg0QUEyLCAweDRBQTMsIDB4NEFBNCwKLSAgICAweDRBQTUsIDB4NEFBNiwgMHg0QUE3LCAweDRBQTgsIDB4NEFBOSwgMHg0QUFBLCAweDRBQUIsIDB4NEFBQywKLSAgICAweDRBQUQsIDB4NEFBRSwgMHg0QUFGLCAweDRBQjAsIDB4NEFCMSwgMHg0QUIyLCAweDRBQjMsIDB4NEFCNCwKLSAgICAweDRBQjUsIDB4NEFCNiwgMHg0QUI3LCAweDRBQjgsIDB4NEFCOSwgMHg0QUJBLCAweDRBQkIsIDB4NEFCQywKLSAgICAweDRBQkQsIDB4NEFCRSwgMHg0QUJGLCAweDRBQzAsIDB4NEFDMSwgMHg0QUMyLCAweDRBQzMsIDB4NEFDNCwKLSAgICAweDRBQzUsIDB4NEFDNiwgMHg0QUM3LCAweDRBQzgsIDB4NEFDOSwgMHg0QUNBLCAweDRBQ0IsIDB4NEFDQywKLSAgICAweDRBQ0QsIDB4NEFDRSwgMHg0QUNGLCAweDRBRDAsIDB4NEFEMSwgMHg0QUQyLCAweDRBRDMsIDB4NEFENCwKLSAgICAweDRBRDUsIDB4NEFENiwgMHg0QUQ3LCAweDRBRDgsIDB4NEFEOSwgMHg0QURBLCAweDRBREIsIDB4NEFEQywKLSAgICAweDRBREQsIDB4NEFERSwgMHg0QURGLCAweDRBRTAsIDB4NEFFMSwgMHg0QUUyLCAweDRBRTMsIDB4NEFFNCwKLSAgICAweDRBRTUsIDB4NEFFNiwgMHg0QUU3LCAweDRBRTgsIDB4NEFFOSwgMHg0QUVBLCAweDRBRUIsIDB4NEFFQywKLSAgICAweDRBRUQsIDB4NEFFRSwgMHg0QUVGLCAweDRBRjAsIDB4NEFGMSwgMHg0QUYyLCAweDRBRjMsIDB4NEFGNCwKLSAgICAweDRBRjUsIDB4NEFGNiwgMHg0QUY3LCAweDRBRjgsIDB4NEFGOSwgMHg0QUZBLCAweDRBRkIsIDB4NEFGQywKLSAgICAweDRBRkQsIDB4NEFGRSwgMHg0QUZGLCAweDRCMDAsIDB4NEIwMSwgMHg0QjAyLCAweDRCMDMsIDB4NEIwNCwKLSAgICAweDRCMDUsIDB4NEIwNiwgMHg0QjA3LCAweDRCMDgsIDB4NEIwOSwgMHg0QjBBLCAweDRCMEIsIDB4NEIwQywKLSAgICAweDRCMEQsIDB4NEIwRSwgMHg0QjBGLCAweDRCMTAsIDB4NEIxMSwgMHg0QjEyLCAweDRCMTMsIDB4NEIxNCwKLSAgICAweDRCMTUsIDB4NEIxNiwgMHg0QjE3LCAweDRCMTgsIDB4NEIxOSwgMHg0QjFBLCAweDRCMUIsIDB4NEIxQywKLSAgICAweDRCMUQsIDB4NEIxRSwgMHg0QjFGLCAweDRCMjAsIDB4NEIyMSwgMHg0QjIyLCAweDRCMjMsIDB4NEIyNCwKLSAgICAweDRCMjUsIDB4NEIyNiwgMHg0QjI3LCAweDRCMjgsIDB4NEIyOSwgMHg0QjJBLCAweDRCMkIsIDB4NEIyQywKLSAgICAweDRCMkQsIDB4NEIyRSwgMHg0QjJGLCAweDRCMzAsIDB4NEIzMSwgMHg0QjMyLCAweDRCMzMsIDB4NEIzNCwKLSAgICAweDRCMzUsIDB4NEIzNiwgMHg0QjM3LCAweDRCMzgsIDB4NEIzOSwgMHg0QjNBLCAweDRCM0IsIDB4NEIzQywKLSAgICAweDRCM0QsIDB4NEIzRSwgMHg0QjNGLCAweDRCNDAsIDB4NEI0MSwgMHg0QjQyLCAweDRCNDMsIDB4NEI0NCwKLSAgICAweDRCNDUsIDB4NEI0NiwgMHg0QjQ3LCAweDRCNDgsIDB4NEI0OSwgMHg0QjRBLCAweDRCNEIsIDB4NEI0QywKLSAgICAweDRCNEQsIDB4NEI0RSwgMHg0QjRGLCAweDRCNTAsIDB4NEI1MSwgMHg0QjUyLCAweDRCNTMsIDB4NEI1NCwKLSAgICAweDRCNTUsIDB4NEI1NiwgMHg0QjU3LCAweDRCNTgsIDB4NEI1OSwgMHg0QjVBLCAweDRCNUIsIDB4NEI1QywKLSAgICAweDRCNUQsIDB4NEI1RSwgMHg0QjVGLCAweDRCNjAsIDB4NEI2MSwgMHg0QjYyLCAweDRCNjMsIDB4NEI2NCwKLSAgICAweDRCNjUsIDB4NEI2NiwgMHg0QjY3LCAweDRCNjgsIDB4NEI2OSwgMHg0QjZBLCAweDRCNkIsIDB4NEI2QywKLSAgICAweDRCNkQsIDB4NEI2RSwgMHg0QjZGLCAweDRCNzAsIDB4NEI3MSwgMHg0QjcyLCAweDRCNzMsIDB4NEI3NCwKLSAgICAweDRCNzUsIDB4NEI3NiwgMHg0Qjc3LCAweDRCNzgsIDB4NEI3OSwgMHg0QjdBLCAweDRCN0IsIDB4NEI3QywKLSAgICAweDRCN0QsIDB4NEI3RSwgMHg0QjdGLCAweDRCODAsIDB4NEI4MSwgMHg0QjgyLCAweDRCODMsIDB4NEI4NCwKLSAgICAweDRCODUsIDB4NEI4NiwgMHg0Qjg3LCAweDRCODgsIDB4NEI4OSwgMHg0QjhBLCAweDRCOEIsIDB4NEI4QywKLSAgICAweDRCOEQsIDB4NEI4RSwgMHg0QjhGLCAweDRCOTAsIDB4NEI5MSwgMHg0QjkyLCAweDRCOTMsIDB4NEI5NCwKLSAgICAweDRCOTUsIDB4NEI5NiwgMHg0Qjk3LCAweDRCOTgsIDB4NEI5OSwgMHg0QjlBLCAweDRCOUIsIDB4NEI5QywKLSAgICAweDRCOUQsIDB4NEI5RSwgMHg0QjlGLCAweDRCQTAsIDB4NEJBMSwgMHg0QkEyLCAweDRCQTMsIDB4NEJBNCwKLSAgICAweDRCQTUsIDB4NEJBNiwgMHg0QkE3LCAweDRCQTgsIDB4NEJBOSwgMHg0QkFBLCAweDRCQUIsIDB4NEJBQywKLSAgICAweDRCQUQsIDB4NEJBRSwgMHg0QkFGLCAweDRCQjAsIDB4NEJCMSwgMHg0QkIyLCAweDRCQjMsIDB4NEJCNCwKLSAgICAweDRCQjUsIDB4NEJCNiwgMHg0QkI3LCAweDRCQjgsIDB4NEJCOSwgMHg0QkJBLCAweDRCQkIsIDB4NEJCQywKLSAgICAweDRCQkQsIDB4NEJCRSwgMHg0QkJGLCAweDRCQzAsIDB4NEJDMSwgMHg0QkMyLCAweDRCQzMsIDB4NEJDNCwKLSAgICAweDRCQzUsIDB4NEJDNiwgMHg0QkM3LCAweDRCQzgsIDB4NEJDOSwgMHg0QkNBLCAweDRCQ0IsIDB4NEJDQywKLSAgICAweDRCQ0QsIDB4NEJDRSwgMHg0QkNGLCAweDRCRDAsIDB4NEJEMSwgMHg0QkQyLCAweDRCRDMsIDB4NEJENCwKLSAgICAweDRCRDUsIDB4NEJENiwgMHg0QkQ3LCAweDRCRDgsIDB4NEJEOSwgMHg0QkRBLCAweDRCREIsIDB4NEJEQywKLSAgICAweDRCREQsIDB4NEJERSwgMHg0QkRGLCAweDRCRTAsIDB4NEJFMSwgMHg0QkUyLCAweDRCRTMsIDB4NEJFNCwKLSAgICAweDRCRTUsIDB4NEJFNiwgMHg0QkU3LCAweDRCRTgsIDB4NEJFOSwgMHg0QkVBLCAweDRCRUIsIDB4NEJFQywKLSAgICAweDRCRUQsIDB4NEJFRSwgMHg0QkVGLCAweDRCRjAsIDB4NEJGMSwgMHg0QkYyLCAweDRCRjMsIDB4NEJGNCwKLSAgICAweDRCRjUsIDB4NEJGNiwgMHg0QkY3LCAweDRCRjgsIDB4NEJGOSwgMHg0QkZBLCAweDRCRkIsIDB4NEJGQywKLSAgICAweDRCRkQsIDB4NEJGRSwgMHg0QkZGLCAweDRDMDAsIDB4NEMwMSwgMHg0QzAyLCAweDRDMDMsIDB4NEMwNCwKLSAgICAweDRDMDUsIDB4NEMwNiwgMHg0QzA3LCAweDRDMDgsIDB4NEMwOSwgMHg0QzBBLCAweDRDMEIsIDB4NEMwQywKLSAgICAweDRDMEQsIDB4NEMwRSwgMHg0QzBGLCAweDRDMTAsIDB4NEMxMSwgMHg0QzEyLCAweDRDMTMsIDB4NEMxNCwKLSAgICAweDRDMTUsIDB4NEMxNiwgMHg0QzE3LCAweDRDMTgsIDB4NEMxOSwgMHg0QzFBLCAweDRDMUIsIDB4NEMxQywKLSAgICAweDRDMUQsIDB4NEMxRSwgMHg0QzFGLCAweDRDMjAsIDB4NEMyMSwgMHg0QzIyLCAweDRDMjMsIDB4NEMyNCwKLSAgICAweDRDMjUsIDB4NEMyNiwgMHg0QzI3LCAweDRDMjgsIDB4NEMyOSwgMHg0QzJBLCAweDRDMkIsIDB4NEMyQywKLSAgICAweDRDMkQsIDB4NEMyRSwgMHg0QzJGLCAweDRDMzAsIDB4NEMzMSwgMHg0QzMyLCAweDRDMzMsIDB4NEMzNCwKLSAgICAweDRDMzUsIDB4NEMzNiwgMHg0QzM3LCAweDRDMzgsIDB4NEMzOSwgMHg0QzNBLCAweDRDM0IsIDB4NEMzQywKLSAgICAweDRDM0QsIDB4NEMzRSwgMHg0QzNGLCAweDRDNDAsIDB4NEM0MSwgMHg0QzQyLCAweDRDNDMsIDB4NEM0NCwKLSAgICAweDRDNDUsIDB4NEM0NiwgMHg0QzQ3LCAweDRDNDgsIDB4NEM0OSwgMHg0QzRBLCAweDRDNEIsIDB4NEM0QywKLSAgICAweDRDNEQsIDB4NEM0RSwgMHg0QzRGLCAweDRDNTAsIDB4NEM1MSwgMHg0QzUyLCAweDRDNTMsIDB4NEM1NCwKLSAgICAweDRDNTUsIDB4NEM1NiwgMHg0QzU3LCAweDRDNTgsIDB4NEM1OSwgMHg0QzVBLCAweDRDNUIsIDB4NEM1QywKLSAgICAweDRDNUQsIDB4NEM1RSwgMHg0QzVGLCAweDRDNjAsIDB4NEM2MSwgMHg0QzYyLCAweDRDNjMsIDB4NEM2NCwKLSAgICAweDRDNjUsIDB4NEM2NiwgMHg0QzY3LCAweDRDNjgsIDB4NEM2OSwgMHg0QzZBLCAweDRDNkIsIDB4NEM2QywKLSAgICAweDRDNkQsIDB4NEM2RSwgMHg0QzZGLCAweDRDNzAsIDB4NEM3MSwgMHg0QzcyLCAweDRDNzMsIDB4NEM3NCwKLSAgICAweDRDNzUsIDB4NEM3NiwgMHg0Qzc4LCAweDRDNzksIDB4NEM3QSwgMHg0QzdCLCAweDRDN0MsIDB4NEM3RCwKLSAgICAweDRDN0UsIDB4NEM3RiwgMHg0QzgwLCAweDRDODEsIDB4NEM4MiwgMHg0QzgzLCAweDRDODQsIDB4NEM4NSwKLSAgICAweDRDODYsIDB4NEM4NywgMHg0Qzg4LCAweDRDODksIDB4NEM4QSwgMHg0QzhCLCAweDRDOEMsIDB4NEM4RCwKLSAgICAweDRDOEUsIDB4NEM4RiwgMHg0QzkwLCAweDRDOTEsIDB4NEM5MiwgMHg0QzkzLCAweDRDOTQsIDB4NEM5NSwKLSAgICAweDRDOTYsIDB4NEM5NywgMHg0Qzk4LCAweDRDOTksIDB4NEM5QSwgMHg0QzlCLCAweDRDOUMsIDB4NEM5RCwKLSAgICAweDRDOUUsIDB4NENBNCwgMHg0Q0E1LCAweDRDQTYsIDB4NENBNywgMHg0Q0E4LCAweDRDQTksIDB4NENBQSwKLSAgICAweDRDQUIsIDB4NENBQywgMHg0Q0FELCAweDRDQUUsIDB4NENBRiwgMHg0Q0IwLCAweDRDQjEsIDB4NENCMiwKLSAgICAweDRDQjMsIDB4NENCNCwgMHg0Q0I1LCAweDRDQjYsIDB4NENCNywgMHg0Q0I4LCAweDRDQjksIDB4NENCQSwKLSAgICAweDRDQkIsIDB4NENCQywgMHg0Q0JELCAweDRDQkUsIDB4NENCRiwgMHg0Q0MwLCAweDRDQzEsIDB4NENDMiwKLSAgICAweDRDQzMsIDB4NENDNCwgMHg0Q0M1LCAweDRDQzYsIDB4NENDNywgMHg0Q0M4LCAweDRDQzksIDB4NENDQSwKLSAgICAweDRDQ0IsIDB4NENDQywgMHg0Q0NELCAweDRDQ0UsIDB4NENDRiwgMHg0Q0QwLCAweDRDRDEsIDB4NENEMiwKLSAgICAweDRDRDMsIDB4NENENCwgMHg0Q0Q1LCAweDRDRDYsIDB4NENENywgMHg0Q0Q4LCAweDRDRDksIDB4NENEQSwKLSAgICAweDRDREIsIDB4NENEQywgMHg0Q0RELCAweDRDREUsIDB4NENERiwgMHg0Q0UwLCAweDRDRTEsIDB4NENFMiwKLSAgICAweDRDRTMsIDB4NENFNCwgMHg0Q0U1LCAweDRDRTYsIDB4NENFNywgMHg0Q0U4LCAweDRDRTksIDB4NENFQSwKLSAgICAweDRDRUIsIDB4NENFQywgMHg0Q0VELCAweDRDRUUsIDB4NENFRiwgMHg0Q0YwLCAweDRDRjEsIDB4NENGMiwKLSAgICAweDRDRjMsIDB4NENGNCwgMHg0Q0Y1LCAweDRDRjYsIDB4NENGNywgMHg0Q0Y4LCAweDRDRjksIDB4NENGQSwKLSAgICAweDRDRkIsIDB4NENGQywgMHg0Q0ZELCAweDRDRkUsIDB4NENGRiwgMHg0RDAwLCAweDREMDEsIDB4NEQwMiwKLSAgICAweDREMDMsIDB4NEQwNCwgMHg0RDA1LCAweDREMDYsIDB4NEQwNywgMHg0RDA4LCAweDREMDksIDB4NEQwQSwKLSAgICAweDREMEIsIDB4NEQwQywgMHg0RDBELCAweDREMEUsIDB4NEQwRiwgMHg0RDEwLCAweDREMTEsIDB4NEQxMiwKLSAgICAweDREMUEsIDB4NEQxQiwgMHg0RDFDLCAweDREMUQsIDB4NEQxRSwgMHg0RDFGLCAweDREMjAsIDB4NEQyMSwKLSAgICAweDREMjIsIDB4NEQyMywgMHg0RDI0LCAweDREMjUsIDB4NEQyNiwgMHg0RDI3LCAweDREMjgsIDB4NEQyOSwKLSAgICAweDREMkEsIDB4NEQyQiwgMHg0RDJDLCAweDREMkQsIDB4NEQyRSwgMHg0RDJGLCAweDREMzAsIDB4NEQzMSwKLSAgICAweDREMzIsIDB4NEQzMywgMHg0RDM0LCAweDREMzUsIDB4NEQzNiwgMHg0RDM3LCAweDREMzgsIDB4NEQzOSwKLSAgICAweDREM0EsIDB4NEQzQiwgMHg0RDNDLCAweDREM0QsIDB4NEQzRSwgMHg0RDNGLCAweDRENDAsIDB4NEQ0MSwKLSAgICAweDRENDIsIDB4NEQ0MywgMHg0RDQ0LCAweDRENDUsIDB4NEQ0NiwgMHg0RDQ3LCAweDRENDgsIDB4NEQ0OSwKLSAgICAweDRENEEsIDB4NEQ0QiwgMHg0RDRDLCAweDRENEQsIDB4NEQ0RSwgMHg0RDRGLCAweDRENTAsIDB4NEQ1MSwKLSAgICAweDRENTIsIDB4NEQ1MywgMHg0RDU0LCAweDRENTUsIDB4NEQ1NiwgMHg0RDU3LCAweDRENTgsIDB4NEQ1OSwKLSAgICAweDRENUEsIDB4NEQ1QiwgMHg0RDVDLCAweDRENUQsIDB4NEQ1RSwgMHg0RDVGLCAweDRENjAsIDB4NEQ2MSwKLSAgICAweDRENjIsIDB4NEQ2MywgMHg0RDY0LCAweDRENjUsIDB4NEQ2NiwgMHg0RDY3LCAweDRENjgsIDB4NEQ2OSwKLSAgICAweDRENkEsIDB4NEQ2QiwgMHg0RDZDLCAweDRENkQsIDB4NEQ2RSwgMHg0RDZGLCAweDRENzAsIDB4NEQ3MSwKLSAgICAweDRENzIsIDB4NEQ3MywgMHg0RDc0LCAweDRENzUsIDB4NEQ3NiwgMHg0RDc3LCAweDRENzgsIDB4NEQ3OSwKLSAgICAweDREN0EsIDB4NEQ3QiwgMHg0RDdDLCAweDREN0QsIDB4NEQ3RSwgMHg0RDdGLCAweDREODAsIDB4NEQ4MSwKLSAgICAweDREODIsIDB4NEQ4MywgMHg0RDg0LCAweDREODUsIDB4NEQ4NiwgMHg0RDg3LCAweDREODgsIDB4NEQ4OSwKLSAgICAweDREOEEsIDB4NEQ4QiwgMHg0RDhDLCAweDREOEQsIDB4NEQ4RSwgMHg0RDhGLCAweDREOTAsIDB4NEQ5MSwKLSAgICAweDREOTIsIDB4NEQ5MywgMHg0RDk0LCAweDREOTUsIDB4NEQ5NiwgMHg0RDk3LCAweDREOTgsIDB4NEQ5OSwKLSAgICAweDREOUEsIDB4NEQ5QiwgMHg0RDlDLCAweDREOUQsIDB4NEQ5RSwgMHg0RDlGLCAweDREQTAsIDB4NERBMSwKLSAgICAweDREQTIsIDB4NERBMywgMHg0REE0LCAweDREQTUsIDB4NERBNiwgMHg0REE3LCAweDREQTgsIDB4NERBOSwKLSAgICAweDREQUEsIDB4NERBQiwgMHg0REFDLCAweDREQUQsIDB4NERBRiwgMHg0REIwLCAweDREQjEsIDB4NERCMiwKLSAgICAweDREQjMsIDB4NERCNCwgMHg0REI1LCAweDIwQUMsIDB4MDBBNSwgMHgyMEFDLCAweDAwMjQsIDB4MzAzRiwKLSAgICAweEEwMDAsIDB4QTAwMSwgMHhBMDAyLCAweEEwMDMsIDB4QTAwNCwgMHhBMDA1LCAweEEwMDYsIDB4QTAwNywKLSAgICAweEEwMDgsIDB4QTAwOSwgMHhBMDBBLCAweEEwMEIsIDB4QTAwQywgMHhBMDBELCAweEEwMEUsIDB4QTAwRiwKLSAgICAweEEwMTAsIDB4QTAxMSwgMHhBMDEyLCAweEEwMTMsIDB4QTAxNCwgMHhBMDE1LCAweEEwMTYsIDB4QTAxNywKLSAgICAweEEwMTgsIDB4QTAxOSwgMHhBMDFBLCAweEEwMUIsIDB4QTAxQywgMHhBMDFELCAweEEwMUUsIDB4QTAxRiwKLSAgICAweEEwMjAsIDB4QTAyMSwgMHhBMDIyLCAweEEwMjMsIDB4QTAyNCwgMHhBMDI1LCAweEEwMjYsIDB4QTAyNywKLSAgICAweEEwMjgsIDB4QTAyOSwgMHhBMDJBLCAweEEwMkIsIDB4QTAyQywgMHhBMDJELCAweEEwMkUsIDB4QTAyRiwKLSAgICAweEEwMzAsIDB4QTAzMSwgMHhBMDMyLCAweEEwMzMsIDB4QTAzNCwgMHhBMDM1LCAweEEwMzYsIDB4QTAzNywKLSAgICAweEEwMzgsIDB4QTAzOSwgMHhBMDNBLCAweEEwM0IsIDB4QTAzQywgMHhBMDNELCAweEEwM0UsIDB4QTAzRiwKLSAgICAweEEwNDAsIDB4QTA0MSwgMHhBMDQyLCAweEEwNDMsIDB4QTA0NCwgMHhBMDQ1LCAweEEwNDYsIDB4QTA0NywKLSAgICAweEEwNDgsIDB4QTA0OSwgMHhBMDRBLCAweEEwNEIsIDB4QTA0QywgMHhBMDRELCAweEEwNEUsIDB4QTA0RiwKLSAgICAweEEwNTAsIDB4QTA1MSwgMHhBMDUyLCAweEEwNTMsIDB4QTA1NCwgMHhBMDU1LCAweEEwNTYsIDB4QTA1NywKLSAgICAweEEwNTgsIDB4QTA1OSwgMHhBMDVBLCAweEEwNUIsIDB4QTA1QywgMHhBMDVELCAweEEwNUUsIDB4QTA1RiwKLSAgICAweEEwNjAsIDB4QTA2MSwgMHhBMDYyLCAweEEwNjMsIDB4QTA2NCwgMHhBMDY1LCAweEEwNjYsIDB4QTA2NywKLSAgICAweEEwNjgsIDB4QTA2OSwgMHhBMDZBLCAweEEwNkIsIDB4QTA2QywgMHhBMDZELCAweEEwNkUsIDB4QTA2RiwKLSAgICAweEEwNzAsIDB4QTA3MSwgMHhBMDcyLCAweEEwNzMsIDB4QTA3NCwgMHhBMDc1LCAweEEwNzYsIDB4QTA3NywKLSAgICAweEEwNzgsIDB4QTA3OSwgMHhBMDdBLCAweEEwN0IsIDB4QTA3QywgMHhBMDdELCAweEEwN0UsIDB4QTA3RiwKLSAgICAweEEwODAsIDB4QTA4MSwgMHhBMDgyLCAweEEwODMsIDB4QTA4NCwgMHhBMDg1LCAweEEwODYsIDB4QTA4NywKLSAgICAweEEwODgsIDB4QTA4OSwgMHhBMDhBLCAweEEwOEIsIDB4QTA4QywgMHhBMDhELCAweEEwOEUsIDB4QTA4RiwKLSAgICAweEEwOTAsIDB4QTA5MSwgMHhBMDkyLCAweEEwOTMsIDB4QTA5NCwgMHhBMDk1LCAweEEwOTYsIDB4QTA5NywKLSAgICAweEEwOTgsIDB4QTA5OSwgMHhBMDlBLCAweEEwOUIsIDB4QTA5QywgMHhBMDlELCAweEEwOUUsIDB4QTA5RiwKLSAgICAweEEwQTAsIDB4QTBBMSwgMHhBMEEyLCAweEEwQTMsIDB4QTBBNCwgMHhBMEE1LCAweEEwQTYsIDB4QTBBNywKLSAgICAweEEwQTgsIDB4QTBBOSwgMHhBMEFBLCAweEEwQUIsIDB4QTBBQywgMHhBMEFELCAweEEwQUUsIDB4QTBBRiwKLSAgICAweEEwQjAsIDB4QTBCMSwgMHhBMEIyLCAweEEwQjMsIDB4QTBCNCwgMHhBMEI1LCAweEEwQjYsIDB4QTBCNywKLSAgICAweEEwQjgsIDB4QTBCOSwgMHhBMEJBLCAweEEwQkIsIDB4QTBCQywgMHhBMEJELCAweEEwQkUsIDB4QTBCRiwKLSAgICAweEEwQzAsIDB4QTBDMSwgMHhBMEMyLCAweEEwQzMsIDB4QTBDNCwgMHhBMEM1LCAweEEwQzYsIDB4QTBDNywKLSAgICAweEEwQzgsIDB4QTBDOSwgMHhBMENBLCAweEEwQ0IsIDB4QTBDQywgMHhBMENELCAweEEwQ0UsIDB4QTBDRiwKLSAgICAweEEwRDAsIDB4QTBEMSwgMHhBMEQyLCAweEEwRDMsIDB4QTBENCwgMHhBMEQ1LCAweEEwRDYsIDB4QTBENywKLSAgICAweEEwRDgsIDB4QTBEOSwgMHhBMERBLCAweEEwREIsIDB4QTBEQywgMHhBMERELCAweEEwREUsIDB4QTBERiwKLSAgICAweEEwRTAsIDB4QTBFMSwgMHhBMEUyLCAweEEwRTMsIDB4QTBFNCwgMHhBMEU1LCAweEEwRTYsIDB4QTBFNywKLSAgICAweEEwRTgsIDB4QTBFOSwgMHhBMEVBLCAweEEwRUIsIDB4QTBFQywgMHhBMEVELCAweEEwRUUsIDB4QTBFRiwKLSAgICAweEEwRjAsIDB4QTBGMSwgMHhBMEYyLCAweEEwRjMsIDB4QTBGNCwgMHhBMEY1LCAweEEwRjYsIDB4QTBGNywKLSAgICAweEEwRjgsIDB4QTBGOSwgMHhBMEZBLCAweEEwRkIsIDB4QTBGQywgMHhBMEZELCAweEEwRkUsIDB4QTBGRiwKLSAgICAweEExMDAsIDB4QTEwMSwgMHhBMTAyLCAweEExMDMsIDB4QTEwNCwgMHhBMTA1LCAweEExMDYsIDB4QTEwNywKLSAgICAweEExMDgsIDB4QTEwOSwgMHhBMTBBLCAweEExMEIsIDB4QTEwQywgMHhBMTBELCAweEExMEUsIDB4QTEwRiwKLSAgICAweEExMTAsIDB4QTExMSwgMHhBMTEyLCAweEExMTMsIDB4QTExNCwgMHhBMTE1LCAweEExMTYsIDB4QTExNywKLSAgICAweEExMTgsIDB4QTExOSwgMHhBMTFBLCAweEExMUIsIDB4QTExQywgMHhBMTFELCAweEExMUUsIDB4QTExRiwKLSAgICAweEExMjAsIDB4QTEyMSwgMHhBMTIyLCAweEExMjMsIDB4QTEyNCwgMHhBMTI1LCAweEExMjYsIDB4QTEyNywKLSAgICAweEExMjgsIDB4QTEyOSwgMHhBMTJBLCAweEExMkIsIDB4QTEyQywgMHhBMTJELCAweEExMkUsIDB4QTEyRiwKLSAgICAweEExMzAsIDB4QTEzMSwgMHhBMTMyLCAweEExMzMsIDB4QTEzNCwgMHhBMTM1LCAweEExMzYsIDB4QTEzNywKLSAgICAweEExMzgsIDB4QTEzOSwgMHhBMTNBLCAweEExM0IsIDB4QTEzQywgMHhBMTNELCAweEExM0UsIDB4QTEzRiwKLSAgICAweEExNDAsIDB4QTE0MSwgMHhBMTQyLCAweEExNDMsIDB4QTE0NCwgMHhBMTQ1LCAweEExNDYsIDB4QTE0NywKLSAgICAweEExNDgsIDB4QTE0OSwgMHhBMTRBLCAweEExNEIsIDB4QTE0QywgMHhBMTRELCAweEExNEUsIDB4QTE0RiwKLSAgICAweEExNTAsIDB4QTE1MSwgMHhBMTUyLCAweEExNTMsIDB4QTE1NCwgMHhBMTU1LCAweEExNTYsIDB4QTE1NywKLSAgICAweEExNTgsIDB4QTE1OSwgMHhBMTVBLCAweEExNUIsIDB4QTE1QywgMHhBMTVELCAweEExNUUsIDB4QTE1RiwKLSAgICAweEExNjAsIDB4QTE2MSwgMHhBMTYyLCAweEExNjMsIDB4QTE2NCwgMHhBMTY1LCAweEExNjYsIDB4QTE2NywKLSAgICAweEExNjgsIDB4QTE2OSwgMHhBMTZBLCAweEExNkIsIDB4QTE2QywgMHhBMTZELCAweEExNkUsIDB4QTE2RiwKLSAgICAweEExNzAsIDB4QTE3MSwgMHhBMTcyLCAweEExNzMsIDB4QTE3NCwgMHhBMTc1LCAweEExNzYsIDB4QTE3NywKLSAgICAweEExNzgsIDB4QTE3OSwgMHhBMTdBLCAweEExN0IsIDB4QTE3QywgMHhBMTdELCAweEExN0UsIDB4QTE3RiwKLSAgICAweEExODAsIDB4QTE4MSwgMHhBMTgyLCAweEExODMsIDB4QTE4NCwgMHhBMTg1LCAweEExODYsIDB4QTE4NywKLSAgICAweEExODgsIDB4QTE4OSwgMHhBMThBLCAweEExOEIsIDB4QTE4QywgMHhBMThELCAweEExOEUsIDB4QTE4RiwKLSAgICAweEExOTAsIDB4QTE5MSwgMHhBMTkyLCAweEExOTMsIDB4QTE5NCwgMHhBMTk1LCAweEExOTYsIDB4QTE5NywKLSAgICAweEExOTgsIDB4QTE5OSwgMHhBMTlBLCAweEExOUIsIDB4QTE5QywgMHhBMTlELCAweEExOUUsIDB4QTE5RiwKLSAgICAweEExQTAsIDB4QTFBMSwgMHhBMUEyLCAweEExQTMsIDB4QTFBNCwgMHhBMUE1LCAweEExQTYsIDB4QTFBNywKLSAgICAweEExQTgsIDB4QTFBOSwgMHhBMUFBLCAweEExQUIsIDB4QTFBQywgMHhBMUFELCAweEExQUUsIDB4QTFBRiwKLSAgICAweEExQjAsIDB4QTFCMSwgMHhBMUIyLCAweEExQjMsIDB4QTFCNCwgMHhBMUI1LCAweEExQjYsIDB4QTFCNywKLSAgICAweEExQjgsIDB4QTFCOSwgMHhBMUJBLCAweEExQkIsIDB4QTFCQywgMHhBMUJELCAweEExQkUsIDB4QTFCRiwKLSAgICAweEExQzAsIDB4QTFDMSwgMHhBMUMyLCAweEExQzMsIDB4QTFDNCwgMHhBMUM1LCAweEExQzYsIDB4QTFDNywKLSAgICAweEExQzgsIDB4QTFDOSwgMHhBMUNBLCAweEExQ0IsIDB4QTFDQywgMHhBMUNELCAweEExQ0UsIDB4QTFDRiwKLSAgICAweEExRDAsIDB4QTFEMSwgMHhBMUQyLCAweEExRDMsIDB4QTFENCwgMHhBMUQ1LCAweEExRDYsIDB4QTFENywKLSAgICAweEExRDgsIDB4QTFEOSwgMHhBMURBLCAweEExREIsIDB4QTFEQywgMHhBMURELCAweEExREUsIDB4QTFERiwKLSAgICAweEExRTAsIDB4QTFFMSwgMHhBMUUyLCAweEExRTMsIDB4QTFFNCwgMHhBMUU1LCAweEExRTYsIDB4QTFFNywKLSAgICAweEExRTgsIDB4QTFFOSwgMHhBMUVBLCAweEExRUIsIDB4QTFFQywgMHhBMUVELCAweEExRUUsIDB4QTFFRiwKLSAgICAweEExRjAsIDB4QTFGMSwgMHhBMUYyLCAweEExRjMsIDB4QTFGNCwgMHhBMUY1LCAweEExRjYsIDB4QTFGNywKLSAgICAweEExRjgsIDB4QTFGOSwgMHhBMUZBLCAweEExRkIsIDB4QTFGQywgMHhBMUZELCAweEExRkUsIDB4QTFGRiwKLSAgICAweEEyMDAsIDB4QTIwMSwgMHhBMjAyLCAweEEyMDMsIDB4QTIwNCwgMHhBMjA1LCAweEEyMDYsIDB4QTIwNywKLSAgICAweEEyMDgsIDB4QTIwOSwgMHhBMjBBLCAweEEyMEIsIDB4QTIwQywgMHhBMjBELCAweEEyMEUsIDB4QTIwRiwKLSAgICAweEEyMTAsIDB4QTIxMSwgMHhBMjEyLCAweEEyMTMsIDB4QTIxNCwgMHhBMjE1LCAweEEyMTYsIDB4QTIxNywKLSAgICAweEEyMTgsIDB4QTIxOSwgMHhBMjFBLCAweEEyMUIsIDB4QTIxQywgMHhBMjFELCAweEEyMUUsIDB4QTIxRiwKLSAgICAweEEyMjAsIDB4QTIyMSwgMHhBMjIyLCAweEEyMjMsIDB4QTIyNCwgMHhBMjI1LCAweEEyMjYsIDB4QTIyNywKLSAgICAweEEyMjgsIDB4QTIyOSwgMHhBMjJBLCAweEEyMkIsIDB4QTIyQywgMHhBMjJELCAweEEyMkUsIDB4QTIyRiwKLSAgICAweEEyMzAsIDB4QTIzMSwgMHhBMjMyLCAweEEyMzMsIDB4QTIzNCwgMHhBMjM1LCAweEEyMzYsIDB4QTIzNywKLSAgICAweEEyMzgsIDB4QTIzOSwgMHhBMjNBLCAweEEyM0IsIDB4QTIzQywgMHhBMjNELCAweEEyM0UsIDB4QTIzRiwKLSAgICAweEEyNDAsIDB4QTI0MSwgMHhBMjQyLCAweEEyNDMsIDB4QTI0NCwgMHhBMjQ1LCAweEEyNDYsIDB4QTI0NywKLSAgICAweEEyNDgsIDB4QTI0OSwgMHhBMjRBLCAweEEyNEIsIDB4QTI0QywgMHhBMjRELCAweEEyNEUsIDB4QTI0RiwKLSAgICAweEEyNTAsIDB4QTI1MSwgMHhBMjUyLCAweEEyNTMsIDB4QTI1NCwgMHhBMjU1LCAweEEyNTYsIDB4QTI1NywKLSAgICAweEEyNTgsIDB4QTI1OSwgMHhBMjVBLCAweEEyNUIsIDB4QTI1QywgMHhBMjVELCAweEEyNUUsIDB4QTI1RiwKLSAgICAweEEyNjAsIDB4QTI2MSwgMHhBMjYyLCAweEEyNjMsIDB4QTI2NCwgMHhBMjY1LCAweEEyNjYsIDB4QTI2NywKLSAgICAweEEyNjgsIDB4QTI2OSwgMHhBMjZBLCAweEEyNkIsIDB4QTI2QywgMHhBMjZELCAweEEyNkUsIDB4QTI2RiwKLSAgICAweEEyNzAsIDB4QTI3MSwgMHhBMjcyLCAweEEyNzMsIDB4QTI3NCwgMHhBMjc1LCAweEEyNzYsIDB4QTI3NywKLSAgICAweEEyNzgsIDB4QTI3OSwgMHhBMjdBLCAweEEyN0IsIDB4QTI3QywgMHhBMjdELCAweEEyN0UsIDB4QTI3RiwKLSAgICAweEEyODAsIDB4QTI4MSwgMHhBMjgyLCAweEEyODMsIDB4QTI4NCwgMHhBMjg1LCAweEEyODYsIDB4QTI4NywKLSAgICAweEEyODgsIDB4QTI4OSwgMHhBMjhBLCAweEEyOEIsIDB4QTI4QywgMHhBMjhELCAweEEyOEUsIDB4QTI4RiwKLSAgICAweEEyOTAsIDB4QTI5MSwgMHhBMjkyLCAweEEyOTMsIDB4QTI5NCwgMHhBMjk1LCAweEEyOTYsIDB4QTI5NywKLSAgICAweEEyOTgsIDB4QTI5OSwgMHhBMjlBLCAweEEyOUIsIDB4QTI5QywgMHhBMjlELCAweEEyOUUsIDB4QTI5RiwKLSAgICAweEEyQTAsIDB4QTJBMSwgMHhBMkEyLCAweEEyQTMsIDB4QTJBNCwgMHhBMkE1LCAweEEyQTYsIDB4QTJBNywKLSAgICAweEEyQTgsIDB4QTJBOSwgMHhBMkFBLCAweEEyQUIsIDB4QTJBQywgMHhBMkFELCAweEEyQUUsIDB4QTJBRiwKLSAgICAweEEyQjAsIDB4QTJCMSwgMHhBMkIyLCAweEEyQjMsIDB4QTJCNCwgMHhBMkI1LCAweEEyQjYsIDB4QTJCNywKLSAgICAweEEyQjgsIDB4QTJCOSwgMHhBMkJBLCAweEEyQkIsIDB4QTJCQywgMHhBMkJELCAweEEyQkUsIDB4QTJCRiwKLSAgICAweEEyQzAsIDB4QTJDMSwgMHhBMkMyLCAweEEyQzMsIDB4QTJDNCwgMHhBMkM1LCAweEEyQzYsIDB4QTJDNywKLSAgICAweEEyQzgsIDB4QTJDOSwgMHhBMkNBLCAweEEyQ0IsIDB4QTJDQywgMHhBMkNELCAweEEyQ0UsIDB4QTJDRiwKLSAgICAweEEyRDAsIDB4QTJEMSwgMHhBMkQyLCAweEEyRDMsIDB4QTJENCwgMHhBMkQ1LCAweEEyRDYsIDB4QTJENywKLSAgICAweEEyRDgsIDB4QTJEOSwgMHhBMkRBLCAweEEyREIsIDB4QTJEQywgMHhBMkRELCAweEEyREUsIDB4QTJERiwKLSAgICAweEEyRTAsIDB4QTJFMSwgMHhBMkUyLCAweEEyRTMsIDB4QTJFNCwgMHhBMkU1LCAweEEyRTYsIDB4QTJFNywKLSAgICAweEEyRTgsIDB4QTJFOSwgMHhBMkVBLCAweEEyRUIsIDB4QTJFQywgMHhBMkVELCAweEEyRUUsIDB4QTJFRiwKLSAgICAweEEyRjAsIDB4QTJGMSwgMHhBMkYyLCAweEEyRjMsIDB4QTJGNCwgMHhBMkY1LCAweEEyRjYsIDB4QTJGNywKLSAgICAweEEyRjgsIDB4QTJGOSwgMHhBMkZBLCAweEEyRkIsIDB4QTJGQywgMHhBMkZELCAweEEyRkUsIDB4QTJGRiwKLSAgICAweEEzMDAsIDB4QTMwMSwgMHhBMzAyLCAweEEzMDMsIDB4QTMwNCwgMHhBMzA1LCAweEEzMDYsIDB4QTMwNywKLSAgICAweEEzMDgsIDB4QTMwOSwgMHhBMzBBLCAweEEzMEIsIDB4QTMwQywgMHhBMzBELCAweEEzMEUsIDB4QTMwRiwKLSAgICAweEEzMTAsIDB4QTMxMSwgMHhBMzEyLCAweEEzMTMsIDB4QTMxNCwgMHhBMzE1LCAweEEzMTYsIDB4QTMxNywKLSAgICAweEEzMTgsIDB4QTMxOSwgMHhBMzFBLCAweEEzMUIsIDB4QTMxQywgMHhBMzFELCAweEEzMUUsIDB4QTMxRiwKLSAgICAweEEzMjAsIDB4QTMyMSwgMHhBMzIyLCAweEEzMjMsIDB4QTMyNCwgMHhBMzI1LCAweEEzMjYsIDB4QTMyNywKLSAgICAweEEzMjgsIDB4QTMyOSwgMHhBMzJBLCAweEEzMkIsIDB4QTMyQywgMHhBMzJELCAweEEzMkUsIDB4QTMyRiwKLSAgICAweEEzMzAsIDB4QTMzMSwgMHhBMzMyLCAweEEzMzMsIDB4QTMzNCwgMHhBMzM1LCAweEEzMzYsIDB4QTMzNywKLSAgICAweEEzMzgsIDB4QTMzOSwgMHhBMzNBLCAweEEzM0IsIDB4QTMzQywgMHhBMzNELCAweEEzM0UsIDB4QTMzRiwKLSAgICAweEEzNDAsIDB4QTM0MSwgMHhBMzQyLCAweEEzNDMsIDB4QTM0NCwgMHhBMzQ1LCAweEEzNDYsIDB4QTM0NywKLSAgICAweEEzNDgsIDB4QTM0OSwgMHhBMzRBLCAweEEzNEIsIDB4QTM0QywgMHhBMzRELCAweEEzNEUsIDB4QTM0RiwKLSAgICAweEEzNTAsIDB4QTM1MSwgMHhBMzUyLCAweEEzNTMsIDB4QTM1NCwgMHhBMzU1LCAweEEzNTYsIDB4QTM1NywKLSAgICAweEEzNTgsIDB4QTM1OSwgMHhBMzVBLCAweEEzNUIsIDB4QTM1QywgMHhBMzVELCAweEEzNUUsIDB4QTM1RiwKLSAgICAweEEzNjAsIDB4QTM2MSwgMHhBMzYyLCAweEEzNjMsIDB4QTM2NCwgMHhBMzY1LCAweEEzNjYsIDB4QTM2NywKLSAgICAweEEzNjgsIDB4QTM2OSwgMHhBMzZBLCAweEEzNkIsIDB4QTM2QywgMHhBMzZELCAweEEzNkUsIDB4QTM2RiwKLSAgICAweEEzNzAsIDB4QTM3MSwgMHhBMzcyLCAweEEzNzMsIDB4QTM3NCwgMHhBMzc1LCAweEEzNzYsIDB4QTM3NywKLSAgICAweEEzNzgsIDB4QTM3OSwgMHhBMzdBLCAweEEzN0IsIDB4QTM3QywgMHhBMzdELCAweEEzN0UsIDB4QTM3RiwKLSAgICAweEEzODAsIDB4QTM4MSwgMHhBMzgyLCAweEEzODMsIDB4QTM4NCwgMHhBMzg1LCAweEEzODYsIDB4QTM4NywKLSAgICAweEEzODgsIDB4QTM4OSwgMHhBMzhBLCAweEEzOEIsIDB4QTM4QywgMHhBMzhELCAweEEzOEUsIDB4QTM4RiwKLSAgICAweEEzOTAsIDB4QTM5MSwgMHhBMzkyLCAweEEzOTMsIDB4QTM5NCwgMHhBMzk1LCAweEEzOTYsIDB4QTM5NywKLSAgICAweEEzOTgsIDB4QTM5OSwgMHhBMzlBLCAweEEzOUIsIDB4QTM5QywgMHhBMzlELCAweEEzOUUsIDB4QTM5RiwKLSAgICAweEEzQTAsIDB4QTNBMSwgMHhBM0EyLCAweEEzQTMsIDB4QTNBNCwgMHhBM0E1LCAweEEzQTYsIDB4QTNBNywKLSAgICAweEEzQTgsIDB4QTNBOSwgMHhBM0FBLCAweEEzQUIsIDB4QTNBQywgMHhBM0FELCAweEEzQUUsIDB4QTNBRiwKLSAgICAweEEzQjAsIDB4QTNCMSwgMHhBM0IyLCAweEEzQjMsIDB4QTNCNCwgMHhBM0I1LCAweEEzQjYsIDB4QTNCNywKLSAgICAweEEzQjgsIDB4QTNCOSwgMHhBM0JBLCAweEEzQkIsIDB4QTNCQywgMHhBM0JELCAweEEzQkUsIDB4QTNCRiwKLSAgICAweEEzQzAsIDB4QTNDMSwgMHhBM0MyLCAweEEzQzMsIDB4QTNDNCwgMHhBM0M1LCAweEEzQzYsIDB4QTNDNywKLSAgICAweEEzQzgsIDB4QTNDOSwgMHhBM0NBLCAweEEzQ0IsIDB4QTNDQywgMHhBM0NELCAweEEzQ0UsIDB4QTNDRiwKLSAgICAweEEzRDAsIDB4QTNEMSwgMHhBM0QyLCAweEEzRDMsIDB4QTNENCwgMHhBM0Q1LCAweEEzRDYsIDB4QTNENywKLSAgICAweEEzRDgsIDB4QTNEOSwgMHhBM0RBLCAweEEzREIsIDB4QTNEQywgMHhBM0RELCAweEEzREUsIDB4QTNERiwKLSAgICAweEEzRTAsIDB4QTNFMSwgMHhBM0UyLCAweEEzRTMsIDB4QTNFNCwgMHhBM0U1LCAweEEzRTYsIDB4QTNFNywKLSAgICAweEEzRTgsIDB4QTNFOSwgMHhBM0VBLCAweEEzRUIsIDB4QTNFQywgMHhBM0VELCAweEEzRUUsIDB4QTNFRiwKLSAgICAweEEzRjAsIDB4QTNGMSwgMHhBM0YyLCAweEEzRjMsIDB4QTNGNCwgMHhBM0Y1LCAweEEzRjYsIDB4QTNGNywKLSAgICAweEEzRjgsIDB4QTNGOSwgMHhBM0ZBLCAweEEzRkIsIDB4QTNGQywgMHhBM0ZELCAweEEzRkUsIDB4QTNGRiwKLSAgICAweEE0MDAsIDB4QTQwMSwgMHhBNDAyLCAweEE0MDMsIDB4QTQwNCwgMHhBNDA1LCAweEE0MDYsIDB4QTQwNywKLSAgICAweEE0MDgsIDB4QTQwOSwgMHhBNDBBLCAweEE0MEIsIDB4QTQwQywgMHhBNDBELCAweEE0MEUsIDB4QTQwRiwKLSAgICAweEE0MTAsIDB4QTQxMSwgMHhBNDEyLCAweEE0MTMsIDB4QTQxNCwgMHhBNDE1LCAweEE0MTYsIDB4QTQxNywKLSAgICAweEE0MTgsIDB4QTQxOSwgMHhBNDFBLCAweEE0MUIsIDB4QTQxQywgMHhBNDFELCAweEE0MUUsIDB4QTQxRiwKLSAgICAweEE0MjAsIDB4QTQyMSwgMHhBNDIyLCAweEE0MjMsIDB4QTQyNCwgMHhBNDI1LCAweEE0MjYsIDB4QTQyNywKLSAgICAweEE0MjgsIDB4QTQyOSwgMHhBNDJBLCAweEE0MkIsIDB4QTQyQywgMHhBNDJELCAweEE0MkUsIDB4QTQyRiwKLSAgICAweEE0MzAsIDB4QTQzMSwgMHhBNDMyLCAweEE0MzMsIDB4QTQzNCwgMHhBNDM1LCAweEE0MzYsIDB4QTQzNywKLSAgICAweEE0MzgsIDB4QTQzOSwgMHhBNDNBLCAweEE0M0IsIDB4QTQzQywgMHhBNDNELCAweEE0M0UsIDB4QTQzRiwKLSAgICAweEE0NDAsIDB4QTQ0MSwgMHhBNDQyLCAweEE0NDMsIDB4QTQ0NCwgMHhBNDQ1LCAweEE0NDYsIDB4QTQ0NywKLSAgICAweEE0NDgsIDB4QTQ0OSwgMHhBNDRBLCAweEE0NEIsIDB4QTQ0QywgMHhBNDRELCAweEE0NEUsIDB4QTQ0RiwKLSAgICAweEE0NTAsIDB4QTQ1MSwgMHhBNDUyLCAweEE0NTMsIDB4QTQ1NCwgMHhBNDU1LCAweEE0NTYsIDB4QTQ1NywKLSAgICAweEE0NTgsIDB4QTQ1OSwgMHhBNDVBLCAweEE0NUIsIDB4QTQ1QywgMHhBNDVELCAweEE0NUUsIDB4QTQ1RiwKLSAgICAweEE0NjAsIDB4QTQ2MSwgMHhBNDYyLCAweEE0NjMsIDB4QTQ2NCwgMHhBNDY1LCAweEE0NjYsIDB4QTQ2NywKLSAgICAweEE0NjgsIDB4QTQ2OSwgMHhBNDZBLCAweEE0NkIsIDB4QTQ2QywgMHhBNDZELCAweEE0NkUsIDB4QTQ2RiwKLSAgICAweEE0NzAsIDB4QTQ3MSwgMHhBNDcyLCAweEE0NzMsIDB4QTQ3NCwgMHhBNDc1LCAweEE0NzYsIDB4QTQ3NywKLSAgICAweEE0NzgsIDB4QTQ3OSwgMHhBNDdBLCAweEE0N0IsIDB4QTQ3QywgMHhBNDdELCAweEE0N0UsIDB4QTQ3RiwKLSAgICAweEE0ODAsIDB4QTQ4MSwgMHhBNDgyLCAweEE0ODMsIDB4QTQ4NCwgMHhBNDg1LCAweEE0ODYsIDB4QTQ4NywKLSAgICAweEE0ODgsIDB4QTQ4OSwgMHhBNDhBLCAweEE0OEIsIDB4QTQ4QywgMHhBNDkwLCAweEE0OTEsIDB4QTQ5MiwKLSAgICAweEE0OTMsIDB4QTQ5NCwgMHhBNDk1LCAweEE0OTYsIDB4QTQ5NywgMHhBNDk4LCAweEE0OTksIDB4QTQ5QSwKLSAgICAweEE0OUIsIDB4QTQ5QywgMHhBNDlELCAweEE0OUUsIDB4QTQ5RiwgMHhBNEEwLCAweEE0QTEsIDB4QTRBMiwKLSAgICAweEE0QTMsIDB4QTRBNCwgMHhBNEE1LCAweEE0QTYsIDB4QTRBNywgMHhBNEE4LCAweEE0QTksIDB4QTRBQSwKLSAgICAweEE0QUIsIDB4QTRBQywgMHhBNEFELCAweEE0QUUsIDB4QTRBRiwgMHhBNEIwLCAweEE0QjEsIDB4QTRCMiwKLSAgICAweEE0QjMsIDB4QTRCNCwgMHhBNEI1LCAweEE0QjYsIDB4QTRCNywgMHhBNEI4LCAweEE0QjksIDB4QTRCQSwKLSAgICAweEE0QkIsIDB4QTRCQywgMHhBNEJELCAweEE0QkUsIDB4QTRCRiwgMHhBNEMwLCAweEE0QzEsIDB4QTRDMiwKLSAgICAweEE0QzMsIDB4QTRDNCwgMHhBNEM1LCAweEE0QzYsCisgICAgMHhGRkZELCAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLAorICAgIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksCisgICAgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwKKyAgICAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLAorICAgIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsCisgICAgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwKKyAgICAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LAorICAgIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwKKyAgICAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLCAweDMwMDAsIDB4MzAwMSwgMHgzMDAyLAorICAgIDB4MDBCNywgMHgwMkM5LCAweDAyQzcsIDB4MDBBOCwgMHgzMDAzLCAweDMwMDUsIDB4MjAxNCwgMHhGRjVFLCAweDIwMTYsCisgICAgMHgyMDI2LCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MzAxNCwgMHgzMDE1LCAweDMwMDgsIDB4MzAwOSwKKyAgICAweDMwMEEsIDB4MzAwQiwgMHgzMDBDLCAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLCAweDMwMTYsIDB4MzAxNywgMHgzMDEwLAorICAgIDB4MzAxMSwgMHgwMEIxLCAweDAwRDcsIDB4MDBGNywgMHgyMjM2LCAweDIyMjcsIDB4MjIyOCwgMHgyMjExLCAweDIyMEYsCisgICAgMHgyMjJBLCAweDIyMjksIDB4MjIwOCwgMHgyMjM3LCAweDIyMUEsIDB4MjJBNSwgMHgyMjI1LCAweDIyMjAsIDB4MjMxMiwKKyAgICAweDIyOTksIDB4MjIyQiwgMHgyMjJFLCAweDIyNjEsIDB4MjI0QywgMHgyMjQ4LCAweDIyM0QsIDB4MjIxRCwgMHgyMjYwLAorICAgIDB4MjI2RSwgMHgyMjZGLCAweDIyNjQsIDB4MjI2NSwgMHgyMjFFLCAweDIyMzUsIDB4MjIzNCwgMHgyNjQyLCAweDI2NDAsCisgICAgMHgwMEIwLCAweDIwMzIsIDB4MjAzMywgMHgyMTAzLCAweEZGMDQsIDB4MDBBNCwgMHhGRkUwLCAweEZGRTEsIDB4MjAzMCwKKyAgICAweDAwQTcsIDB4MjExNiwgMHgyNjA2LCAweDI2MDUsIDB4MjVDQiwgMHgyNUNGLCAweDI1Q0UsIDB4MjVDNywgMHgyNUM2LAorICAgIDB4MjVBMSwgMHgyNUEwLCAweDI1QjMsIDB4MjVCMiwgMHgyMDNCLCAweDIxOTIsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTMsCisgICAgMHgzMDEzLCAweDI0ODgsIDB4MjQ4OSwgMHgyNDhBLCAweDI0OEIsIDB4MjQ4QywgMHgyNDhELCAweDI0OEUsIDB4MjQ4RiwKKyAgICAweDI0OTAsIDB4MjQ5MSwgMHgyNDkyLCAweDI0OTMsIDB4MjQ5NCwgMHgyNDk1LCAweDI0OTYsIDB4MjQ5NywgMHgyNDk4LAorICAgIDB4MjQ5OSwgMHgyNDlBLCAweDI0OUIsIDB4MjQ3NCwgMHgyNDc1LCAweDI0NzYsIDB4MjQ3NywgMHgyNDc4LCAweDI0NzksCisgICAgMHgyNDdBLCAweDI0N0IsIDB4MjQ3QywgMHgyNDdELCAweDI0N0UsIDB4MjQ3RiwgMHgyNDgwLCAweDI0ODEsIDB4MjQ4MiwKKyAgICAweDI0ODMsIDB4MjQ4NCwgMHgyNDg1LCAweDI0ODYsIDB4MjQ4NywgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLAorICAgIDB4MjQ2NCwgMHgyNDY1LCAweDI0NjYsIDB4MjQ2NywgMHgyNDY4LCAweDI0NjksIDB4MzIyMCwgMHgzMjIxLCAweDMyMjIsCisgICAgMHgzMjIzLCAweDMyMjQsIDB4MzIyNSwgMHgzMjI2LCAweDMyMjcsIDB4MzIyOCwgMHgzMjI5LCAweDIxNjAsIDB4MjE2MSwKKyAgICAweDIxNjIsIDB4MjE2MywgMHgyMTY0LCAweDIxNjUsIDB4MjE2NiwgMHgyMTY3LCAweDIxNjgsIDB4MjE2OSwgMHgyMTZBLAorICAgIDB4MjE2QiwgMHhGRjAxLCAweEZGMDIsIDB4RkYwMywgMHhGRkU1LCAweEZGMDUsIDB4RkYwNiwgMHhGRjA3LCAweEZGMDgsCisgICAgMHhGRjA5LCAweEZGMEEsIDB4RkYwQiwgMHhGRjBDLCAweEZGMEQsIDB4RkYwRSwgMHhGRjBGLCAweEZGMTAsIDB4RkYxMSwKKyAgICAweEZGMTIsIDB4RkYxMywgMHhGRjE0LCAweEZGMTUsIDB4RkYxNiwgMHhGRjE3LCAweEZGMTgsIDB4RkYxOSwgMHhGRjFBLAorICAgIDB4RkYxQiwgMHhGRjFDLCAweEZGMUQsIDB4RkYxRSwgMHhGRjFGLCAweEZGMjAsIDB4RkYyMSwgMHhGRjIyLCAweEZGMjMsCisgICAgMHhGRjI0LCAweEZGMjUsIDB4RkYyNiwgMHhGRjI3LCAweEZGMjgsIDB4RkYyOSwgMHhGRjJBLCAweEZGMkIsIDB4RkYyQywKKyAgICAweEZGMkQsIDB4RkYyRSwgMHhGRjJGLCAweEZGMzAsIDB4RkYzMSwgMHhGRjMyLCAweEZGMzMsIDB4RkYzNCwgMHhGRjM1LAorICAgIDB4RkYzNiwgMHhGRjM3LCAweEZGMzgsIDB4RkYzOSwgMHhGRjNBLCAweEZGM0IsIDB4RkYzQywgMHhGRjNELCAweEZGM0UsCisgICAgMHhGRjNGLCAweEZGNDAsIDB4RkY0MSwgMHhGRjQyLCAweEZGNDMsIDB4RkY0NCwgMHhGRjQ1LCAweEZGNDYsIDB4RkY0NywKKyAgICAweEZGNDgsIDB4RkY0OSwgMHhGRjRBLCAweEZGNEIsIDB4RkY0QywgMHhGRjRELCAweEZGNEUsIDB4RkY0RiwgMHhGRjUwLAorICAgIDB4RkY1MSwgMHhGRjUyLCAweEZGNTMsIDB4RkY1NCwgMHhGRjU1LCAweEZGNTYsIDB4RkY1NywgMHhGRjU4LCAweEZGNTksCisgICAgMHhGRjVBLCAweEZGNUIsIDB4RkY1QywgMHhGRjVELCAweEZGRTMsIDB4MzA0MSwgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwKKyAgICAweDMwNDUsIDB4MzA0NiwgMHgzMDQ3LCAweDMwNDgsIDB4MzA0OSwgMHgzMDRBLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELAorICAgIDB4MzA0RSwgMHgzMDRGLCAweDMwNTAsIDB4MzA1MSwgMHgzMDUyLCAweDMwNTMsIDB4MzA1NCwgMHgzMDU1LCAweDMwNTYsCisgICAgMHgzMDU3LCAweDMwNTgsIDB4MzA1OSwgMHgzMDVBLCAweDMwNUIsIDB4MzA1QywgMHgzMDVELCAweDMwNUUsIDB4MzA1RiwKKyAgICAweDMwNjAsIDB4MzA2MSwgMHgzMDYyLCAweDMwNjMsIDB4MzA2NCwgMHgzMDY1LCAweDMwNjYsIDB4MzA2NywgMHgzMDY4LAorICAgIDB4MzA2OSwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcwLCAweDMwNzEsCisgICAgMHgzMDcyLCAweDMwNzMsIDB4MzA3NCwgMHgzMDc1LCAweDMwNzYsIDB4MzA3NywgMHgzMDc4LCAweDMwNzksIDB4MzA3QSwKKyAgICAweDMwN0IsIDB4MzA3QywgMHgzMDdELCAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDgzLAorICAgIDB4MzA4NCwgMHgzMDg1LCAweDMwODYsIDB4MzA4NywgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsCisgICAgMHgzMDhELCAweDMwOEUsIDB4MzA4RiwgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLCAweDMwQTEsIDB4MzBBMiwKKyAgICAweDMwQTMsIDB4MzBBNCwgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywgMHgzMEE4LCAweDMwQTksIDB4MzBBQSwgMHgzMEFCLAorICAgIDB4MzBBQywgMHgzMEFELCAweDMwQUUsIDB4MzBBRiwgMHgzMEIwLCAweDMwQjEsIDB4MzBCMiwgMHgzMEIzLCAweDMwQjQsCisgICAgMHgzMEI1LCAweDMwQjYsIDB4MzBCNywgMHgzMEI4LCAweDMwQjksIDB4MzBCQSwgMHgzMEJCLCAweDMwQkMsIDB4MzBCRCwKKyAgICAweDMwQkUsIDB4MzBCRiwgMHgzMEMwLCAweDMwQzEsIDB4MzBDMiwgMHgzMEMzLCAweDMwQzQsIDB4MzBDNSwgMHgzMEM2LAorICAgIDB4MzBDNywgMHgzMEM4LCAweDMwQzksIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsCisgICAgMHgzMEQwLCAweDMwRDEsIDB4MzBEMiwgMHgzMEQzLCAweDMwRDQsIDB4MzBENSwgMHgzMEQ2LCAweDMwRDcsIDB4MzBEOCwKKyAgICAweDMwRDksIDB4MzBEQSwgMHgzMERCLCAweDMwREMsIDB4MzBERCwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLAorICAgIDB4MzBFMiwgMHgzMEUzLCAweDMwRTQsIDB4MzBFNSwgMHgzMEU2LCAweDMwRTcsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsCisgICAgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVFLCAweDMwRUYsIDB4MzBGMCwgMHgzMEYxLCAweDMwRjIsIDB4MzBGMywKKyAgICAweDMwRjQsIDB4MzBGNSwgMHgzMEY2LCAweDAzOTEsIDB4MDM5MiwgMHgwMzkzLCAweDAzOTQsIDB4MDM5NSwgMHgwMzk2LAorICAgIDB4MDM5NywgMHgwMzk4LCAweDAzOTksIDB4MDM5QSwgMHgwMzlCLCAweDAzOUMsIDB4MDM5RCwgMHgwMzlFLCAweDAzOUYsCisgICAgMHgwM0EwLCAweDAzQTEsIDB4MDNBMywgMHgwM0E0LCAweDAzQTUsIDB4MDNBNiwgMHgwM0E3LCAweDAzQTgsIDB4MDNBOSwKKyAgICAweDAzQjEsIDB4MDNCMiwgMHgwM0IzLCAweDAzQjQsIDB4MDNCNSwgMHgwM0I2LCAweDAzQjcsIDB4MDNCOCwgMHgwM0I5LAorICAgIDB4MDNCQSwgMHgwM0JCLCAweDAzQkMsIDB4MDNCRCwgMHgwM0JFLCAweDAzQkYsIDB4MDNDMCwgMHgwM0MxLCAweDAzQzMsCisgICAgMHgwM0M0LCAweDAzQzUsIDB4MDNDNiwgMHgwM0M3LCAweDAzQzgsIDB4MDNDOSwgMHhGRjBDLCAweDMwMDIsIDB4MzAwMSwKKyAgICAweEZGMUEsIDB4RkYxQiwgMHhGRjAxLCAweEZGMUYsIDB4RkUzNSwgMHhGRTM2LCAweEZFMzksIDB4RkUzQSwgMHhGRTNGLAorICAgIDB4RkU0MCwgMHhGRTNELCAweEZFM0UsIDB4RkU0MSwgMHhGRTQyLCAweEZFNDMsIDB4RkU0NCwgMHgzMDE2LCAweDMwMTcsCisgICAgMHhGRTNCLCAweEZFM0MsIDB4RkUzNywgMHhGRTM4LCAweEZFMzEsIDB4MjAyNiwgMHhGRTMzLCAweEZFMzQsIDB4MDQxMCwKKyAgICAweDA0MTEsIDB4MDQxMiwgMHgwNDEzLCAweDA0MTQsIDB4MDQxNSwgMHgwNDAxLCAweDA0MTYsIDB4MDQxNywgMHgwNDE4LAorICAgIDB4MDQxOSwgMHgwNDFBLCAweDA0MUIsIDB4MDQxQywgMHgwNDFELCAweDA0MUUsIDB4MDQxRiwgMHgwNDIwLCAweDA0MjEsCisgICAgMHgwNDIyLCAweDA0MjMsIDB4MDQyNCwgMHgwNDI1LCAweDA0MjYsIDB4MDQyNywgMHgwNDI4LCAweDA0MjksIDB4MDQyQSwKKyAgICAweDA0MkIsIDB4MDQyQywgMHgwNDJELCAweDA0MkUsIDB4MDQyRiwgMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLAorICAgIDB4MDQzNCwgMHgwNDM1LCAweDA0NTEsIDB4MDQzNiwgMHgwNDM3LCAweDA0MzgsIDB4MDQzOSwgMHgwNDNBLCAweDA0M0IsCisgICAgMHgwNDNDLCAweDA0M0QsIDB4MDQzRSwgMHgwNDNGLCAweDA0NDAsIDB4MDQ0MSwgMHgwNDQyLCAweDA0NDMsIDB4MDQ0NCwKKyAgICAweDA0NDUsIDB4MDQ0NiwgMHgwNDQ3LCAweDA0NDgsIDB4MDQ0OSwgMHgwNDRBLCAweDA0NEIsIDB4MDQ0QywgMHgwNDRELAorICAgIDB4MDQ0RSwgMHgwNDRGLCAweDAxMDEsIDB4MDBFMSwgMHgwMUNFLCAweDAwRTAsIDB4MDExMywgMHgwMEU5LCAweDAxMUIsCisgICAgMHgwMEU4LCAweDAxMkIsIDB4MDBFRCwgMHgwMUQwLCAweDAwRUMsIDB4MDE0RCwgMHgwMEYzLCAweDAxRDIsIDB4MDBGMiwKKyAgICAweDAxNkIsIDB4MDBGQSwgMHgwMUQ0LCAweDAwRjksIDB4MDFENiwgMHgwMUQ4LCAweDAxREEsIDB4MDFEQywgMHgwMEZDLAorICAgIDB4MDBFQSwgMHgwMjUxLCAweDFFM0YsIDB4MDE0NCwgMHgwMTQ4LCAweDAxRjksIDB4MDI2MSwgMHgzMTA1LCAweDMxMDYsCisgICAgMHgzMTA3LCAweDMxMDgsIDB4MzEwOSwgMHgzMTBBLCAweDMxMEIsIDB4MzEwQywgMHgzMTBELCAweDMxMEUsIDB4MzEwRiwKKyAgICAweDMxMTAsIDB4MzExMSwgMHgzMTEyLCAweDMxMTMsIDB4MzExNCwgMHgzMTE1LCAweDMxMTYsIDB4MzExNywgMHgzMTE4LAorICAgIDB4MzExOSwgMHgzMTFBLCAweDMxMUIsIDB4MzExQywgMHgzMTFELCAweDMxMUUsIDB4MzExRiwgMHgzMTIwLCAweDMxMjEsCisgICAgMHgzMTIyLCAweDMxMjMsIDB4MzEyNCwgMHgzMTI1LCAweDMxMjYsIDB4MzEyNywgMHgzMTI4LCAweDMxMjksIDB4RTdDRCwKKyAgICAweDI1MDAsIDB4MjUwMSwgMHgyNTAyLCAweDI1MDMsIDB4MjUwNCwgMHgyNTA1LCAweDI1MDYsIDB4MjUwNywgMHgyNTA4LAorICAgIDB4MjUwOSwgMHgyNTBBLCAweDI1MEIsIDB4MjUwQywgMHgyNTBELCAweDI1MEUsIDB4MjUwRiwgMHgyNTEwLCAweDI1MTEsCisgICAgMHgyNTEyLCAweDI1MTMsIDB4MjUxNCwgMHgyNTE1LCAweDI1MTYsIDB4MjUxNywgMHgyNTE4LCAweDI1MTksIDB4MjUxQSwKKyAgICAweDI1MUIsIDB4MjUxQywgMHgyNTFELCAweDI1MUUsIDB4MjUxRiwgMHgyNTIwLCAweDI1MjEsIDB4MjUyMiwgMHgyNTIzLAorICAgIDB4MjUyNCwgMHgyNTI1LCAweDI1MjYsIDB4MjUyNywgMHgyNTI4LCAweDI1MjksIDB4MjUyQSwgMHgyNTJCLCAweDI1MkMsCisgICAgMHgyNTJELCAweDI1MkUsIDB4MjUyRiwgMHgyNTMwLCAweDI1MzEsIDB4MjUzMiwgMHgyNTMzLCAweDI1MzQsIDB4MjUzNSwKKyAgICAweDI1MzYsIDB4MjUzNywgMHgyNTM4LCAweDI1MzksIDB4MjUzQSwgMHgyNTNCLCAweDI1M0MsIDB4MjUzRCwgMHgyNTNFLAorICAgIDB4MjUzRiwgMHgyNTQwLCAweDI1NDEsIDB4MjU0MiwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwgMHgyNTQ2LCAweDI1NDcsCisgICAgMHgyNTQ4LCAweDI1NDksIDB4MjU0QSwgMHgyNTRCLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwKKyAgICAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLAorICAgIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwKKyAgICAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LAorICAgIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsCisgICAgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwKKyAgICAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LAorICAgIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsCisgICAgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwKKyAgICAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwgMHgwMTAxLAorICAgIDB4MDBFMSwgMHgwMUNFLCAweDAwRTAsIDB4MDExMywgMHgwMEU5LCAweDAxMUIsIDB4MDBFOCwgMHgwMTJCLCAweDAwRUQsCisgICAgMHgwMUQwLCAweDAwRUMsIDB4MDE0RCwgMHgwMEYzLCAweDAxRDIsIDB4MDBGMiwgMHgwMTZCLCAweDAwRkEsIDB4MDFENCwKKyAgICAweDAwRjksIDB4MDFENiwgMHgwMUQ4LCAweDAxREEsIDB4MDFEQywgMHgwMEZDLCAweDAwRUEsIDB4MDI1MSwgMHgxRTNGLAorICAgIDB4MDE0NCwgMHgwMTQ4LCAweDAxRjksIDB4MDI2MSwgMHg1NTRBLCAweDk2M0YsIDB4NTdDMywgMHg2MzI4LCAweDU0Q0UsCisgICAgMHg1NTA5LCAweDU0QzAsIDB4NzY5MSwgMHg3NjRDLCAweDg1M0MsIDB4NzdFRSwgMHg4MjdFLCAweDc4OEQsIDB4NzIzMSwKKyAgICAweDk2OTgsIDB4OTc4RCwgMHg2QzI4LCAweDVCODksIDB4NEZGQSwgMHg2MzA5LCAweDY2OTcsIDB4NUNCOCwgMHg4MEZBLAorICAgIDB4Njg0OCwgMHg4MEFFLCAweDY2MDIsIDB4NzZDRSwgMHg1MUY5LCAweDY1NTYsIDB4NzFBQywgMHg3RkYxLCAweDg4ODQsCisgICAgMHg1MEIyLCAweDU5NjUsIDB4NjFDQSwgMHg2RkIzLCAweDgyQUQsIDB4NjM0QywgMHg2MjUyLCAweDUzRUQsIDB4NTQyNywKKyAgICAweDdCMDYsIDB4NTE2QiwgMHg3NUE0LCAweDVERjQsIDB4NjJENCwgMHg4RENCLCAweDk3NzYsIDB4NjI4QSwgMHg4MDE5LAorICAgIDB4NTc1RCwgMHg5NzM4LCAweDdGNjIsIDB4NzIzOCwgMHg3NjdELCAweDY3Q0YsIDB4NzY3RSwgMHg2NDQ2LCAweDRGNzAsCisgICAgMHg4RDI1LCAweDYyREMsIDB4N0ExNywgMHg2NTkxLCAweDczRUQsIDB4NjQyQywgMHg2MjczLCAweDgyMkMsIDB4OTg4MSwKKyAgICAweDY3N0YsIDB4NzI0OCwgMHg2MjZFLCAweDYyQ0MsIDB4NEYzNCwgMHg3NEUzLCAweDUzNEEsIDB4NTI5RSwgMHg3RUNBLAorICAgIDB4OTBBNiwgMHg1RTJFLCAweDY4ODYsIDB4Njk5QywgMHg4MTgwLCAweDdFRDEsIDB4NjhEMiwgMHg3OEM1LCAweDg2OEMsCisgICAgMHg5NTUxLCAweDUwOEQsIDB4OEMyNCwgMHg4MkRFLCAweDgwREUsIDB4NTMwNSwgMHg4OTEyLCAweDUyNjUsIDB4ODU4NCwKKyAgICAweDk2RjksIDB4NEZERCwgMHg1ODIxLCAweDk5NzEsIDB4NUI5RCwgMHg2MkIxLCAweDYyQTUsIDB4NjZCNCwgMHg4Qzc5LAorICAgIDB4OUM4RCwgMHg3MjA2LCAweDY3NkYsIDB4Nzg5MSwgMHg2MEIyLCAweDUzNTEsIDB4NTMxNywgMHg4Rjg4LCAweDgwQ0MsCisgICAgMHg4RDFELCAweDk0QTEsIDB4NTAwRCwgMHg3MkM4LCAweDU5MDcsIDB4NjBFQiwgMHg3MTE5LCAweDg4QUIsIDB4NTk1NCwKKyAgICAweDgyRUYsIDB4NjcyQywgMHg3QjI4LCAweDVEMjksIDB4N0VGNywgMHg3NTJELCAweDZDRjUsIDB4OEU2NiwgMHg4RkY4LAorICAgIDB4OTAzQywgMHg5RjNCLCAweDZCRDQsIDB4OTExOSwgMHg3QjE0LCAweDVGN0MsIDB4NzhBNywgMHg4NEQ2LCAweDg1M0QsCisgICAgMHg2QkQ1LCAweDZCRDksIDB4NkJENiwgMHg1RTAxLCAweDVFODcsIDB4NzVGOSwgMHg5NUVELCAweDY1NUQsIDB4NUYwQSwKKyAgICAweDVGQzUsIDB4OEY5RiwgMHg1OEMxLCAweDgxQzIsIDB4OTA3RiwgMHg5NjVCLCAweDk3QUQsIDB4OEZCOSwgMHg3RjE2LAorICAgIDB4OEQyQywgMHg2MjQxLCAweDRGQkYsIDB4NTNEOCwgMHg1MzVFLCAweDhGQTgsIDB4OEZBOSwgMHg4RkFCLCAweDkwNEQsCisgICAgMHg2ODA3LCAweDVGNkEsIDB4ODE5OCwgMHg4ODY4LCAweDlDRDYsIDB4NjE4QiwgMHg1MjJCLCAweDc2MkEsIDB4NUY2QywKKyAgICAweDY1OEMsIDB4NkZEMiwgMHg2RUU4LCAweDVCQkUsIDB4NjQ0OCwgMHg1MTc1LCAweDUxQjAsIDB4NjdDNCwgMHg0RTE5LAorICAgIDB4NzlDOSwgMHg5OTdDLCAweDcwQjMsIDB4NzVDNSwgMHg1RTc2LCAweDczQkIsIDB4ODNFMCwgMHg2NEFELCAweDYyRTgsCisgICAgMHg5NEI1LCAweDZDRTIsIDB4NTM1QSwgMHg1MkMzLCAweDY0MEYsIDB4OTRDMiwgMHg3Qjk0LCAweDRGMkYsIDB4NUUxQiwKKyAgICAweDgyMzYsIDB4ODExNiwgMHg4MThBLCAweDZFMjQsIDB4NkNDQSwgMHg5QTczLCAweDYzNTUsIDB4NTM1QywgMHg1NEZBLAorICAgIDB4ODg2NSwgMHg1N0UwLCAweDRFMEQsIDB4NUUwMywgMHg2QjY1LCAweDdDM0YsIDB4OTBFOCwgMHg2MDE2LCAweDY0RTYsCisgICAgMHg3MzFDLCAweDg4QzEsIDB4Njc1MCwgMHg2MjRELCAweDhEMjIsIDB4Nzc2QywgMHg4RTI5LCAweDkxQzcsIDB4NUY2OSwKKyAgICAweDgzREMsIDB4ODUyMSwgMHg5OTEwLCAweDUzQzIsIDB4ODY5NSwgMHg2QjhCLCAweDYwRUQsIDB4NjBFOCwgMHg3MDdGLAorICAgIDB4ODJDRCwgMHg4MjMxLCAweDRFRDMsIDB4NkNBNywgMHg4NUNGLCAweDY0Q0QsIDB4N0NEOSwgMHg2OUZELCAweDY2RjksCisgICAgMHg4MzQ5LCAweDUzOTUsIDB4N0I1NiwgMHg0RkE3LCAweDUxOEMsIDB4NkQ0QiwgMHg1QzQyLCAweDhFNkQsIDB4NjNEMiwKKyAgICAweDUzQzksIDB4ODMyQywgMHg4MzM2LCAweDY3RTUsIDB4NzhCNCwgMHg2NDNELCAweDVCREYsIDB4NUM5NCwgMHg1REVFLAorICAgIDB4OEJFNywgMHg2MkM2LCAweDY3RjQsIDB4OEM3QSwgMHg2NDAwLCAweDYzQkEsIDB4ODc0OSwgMHg5OThCLCAweDhDMTcsCisgICAgMHg3RjIwLCAweDk0RjIsIDB4NEVBNywgMHg5NjEwLCAweDk4QTQsIDB4NjYwQywgMHg3MzE2LCAweDU3M0EsIDB4NUMxRCwKKyAgICAweDVFMzgsIDB4OTU3RiwgMHg1MDdGLCAweDgwQTAsIDB4NTM4MiwgMHg2NTVFLCAweDc1NDUsIDB4NTUzMSwgMHg1MDIxLAorICAgIDB4OEQ4NSwgMHg2Mjg0LCAweDk0OUUsIDB4NjcxRCwgMHg1NjMyLCAweDZGNkUsIDB4NURFMiwgMHg1NDM1LCAweDcwOTIsCisgICAgMHg4RjY2LCAweDYyNkYsIDB4NjRBNCwgMHg2M0EzLCAweDVGN0IsIDB4NkY4OCwgMHg5MEY0LCAweDgxRTMsIDB4OEZCMCwKKyAgICAweDVDMTgsIDB4NjY2OCwgMHg1RkYxLCAweDZDODksIDB4OTY0OCwgMHg4RDgxLCAweDg4NkMsIDB4NjQ5MSwgMHg3OUYwLAorICAgIDB4NTdDRSwgMHg2QTU5LCAweDYyMTAsIDB4NTQ0OCwgMHg0RTU4LCAweDdBMEIsIDB4NjBFOSwgMHg2Rjg0LCAweDhCREEsCisgICAgMHg2MjdGLCAweDkwMUUsIDB4OUE4QiwgMHg3OUU0LCAweDU0MDMsIDB4NzVGNCwgMHg2MzAxLCAweDUzMTksIDB4NkM2MCwKKyAgICAweDhGREYsIDB4NUYxQiwgMHg5QTcwLCAweDgwM0IsIDB4OUY3RiwgMHg0Rjg4LCAweDVDM0EsIDB4OEQ2NCwgMHg3RkM1LAorICAgIDB4NjVBNSwgMHg3MEJELCAweDUxNDUsIDB4NTFCMiwgMHg4NjZCLCAweDVEMDcsIDB4NUJBMCwgMHg2MkJELCAweDkxNkMsCisgICAgMHg3NTc0LCAweDhFMEMsIDB4N0EyMCwgMHg2MTAxLCAweDdCNzksIDB4NEVDNywgMHg3RUY4LCAweDc3ODUsIDB4NEUxMSwKKyAgICAweDgxRUQsIDB4NTIxRCwgMHg1MUZBLCAweDZBNzEsIDB4NTNBOCwgMHg4RTg3LCAweDk1MDQsIDB4OTZDRiwgMHg2RUMxLAorICAgIDB4OTY2NCwgMHg2OTVBLCAweDc4NDAsIDB4NTBBOCwgMHg3N0Q3LCAweDY0MTAsIDB4ODlFNiwgMHg1OTA0LCAweDYzRTMsCisgICAgMHg1RERELCAweDdBN0YsIDB4NjkzRCwgMHg0RjIwLCAweDgyMzksIDB4NTU5OCwgMHg0RTMyLCAweDc1QUUsIDB4N0E5NywKKyAgICAweDVFNjIsIDB4NUU4QSwgMHg5NUVGLCAweDUyMUIsIDB4NTQzOSwgMHg3MDhBLCAweDYzNzYsIDB4OTUyNCwgMHg1NzgyLAorICAgIDB4NjYyNSwgMHg2OTNGLCAweDkxODcsIDB4NTUwNywgMHg2REYzLCAweDdFQUYsIDB4ODgyMiwgMHg2MjMzLCAweDdFRjAsCisgICAgMHg3NUI1LCAweDgzMjgsIDB4NzhDMSwgMHg5NkNDLCAweDhGOUUsIDB4NjE0OCwgMHg3NEY3LCAweDhCQ0QsIDB4NkI2NCwKKyAgICAweDUyM0EsIDB4OEQ1MCwgMHg2QjIxLCAweDgwNkEsIDB4ODQ3MSwgMHg1NkYxLCAweDUzMDYsIDB4NEVDRSwgMHg0RTFCLAorICAgIDB4NTFEMSwgMHg3Qzk3LCAweDkxOEIsIDB4N0MwNywgMHg0RkMzLCAweDhFN0YsIDB4N0JFMSwgMHg3QTlDLCAweDY0NjcsCisgICAgMHg1RDE0LCAweDUwQUMsIDB4ODEwNiwgMHg3NjAxLCAweDdDQjksIDB4NkRFQywgMHg3RkUwLCAweDY3NTEsIDB4NUI1OCwKKyAgICAweDVCRjgsIDB4NzhDQiwgMHg2NEFFLCAweDY0MTMsIDB4NjNBQSwgMHg2MzJCLCAweDk1MTksIDB4NjQyRCwgMHg4RkJFLAorICAgIDB4N0I1NCwgMHg3NjI5LCAweDYyNTMsIDB4NTkyNywgMHg1NDQ2LCAweDZCNzksIDB4NTBBMywgMHg2MjM0LCAweDVFMjYsCisgICAgMHg2Qjg2LCAweDRFRTMsIDB4OEQzNywgMHg4ODhCLCAweDVGODUsIDB4OTAyRSwgMHg2MDIwLCAweDgwM0QsIDB4NjJDNSwKKyAgICAweDRFMzksIDB4NTM1NSwgMHg5MEY4LCAweDYzQjgsIDB4ODBDNiwgMHg2NUU2LCAweDZDMkUsIDB4NEY0NiwgMHg2MEVFLAorICAgIDB4NkRFMSwgMHg4QkRFLCAweDVGMzksIDB4ODZDQiwgMHg1RjUzLCAweDYzMjEsIDB4NTE1QSwgMHg4MzYxLCAweDY4NjMsCisgICAgMHg1MjAwLCAweDYzNjMsIDB4OEU0OCwgMHg1MDEyLCAweDVDOUIsIDB4Nzk3NywgMHg1QkZDLCAweDUyMzAsIDB4N0EzQiwKKyAgICAweDYwQkMsIDB4OTA1MywgMHg3NkQ3LCAweDVGQjcsIDB4NUY5NywgMHg3Njg0LCAweDhFNkMsIDB4NzA2RiwgMHg3NjdCLAorICAgIDB4N0I0OSwgMHg3N0FBLCAweDUxRjMsIDB4OTA5MywgMHg1ODI0LCAweDRGNEUsIDB4NkVGNCwgMHg4RkVBLCAweDY1NEMsCisgICAgMHg3QjFCLCAweDcyQzQsIDB4NkRBNCwgMHg3RkRGLCAweDVBRTEsIDB4NjJCNSwgMHg1RTk1LCAweDU3MzAsIDB4ODQ4MiwKKyAgICAweDdCMkMsIDB4NUUxRCwgMHg1RjFGLCAweDkwMTIsIDB4N0YxNCwgMHg5OEEwLCAweDYzODIsIDB4NkVDNywgMHg3ODk4LAorICAgIDB4NzBCOSwgMHg1MTc4LCAweDk3NUIsIDB4NTdBQiwgMHg3NTM1LCAweDRGNDMsIDB4NzUzOCwgMHg1RTk3LCAweDYwRTYsCisgICAgMHg1OTYwLCAweDZEQzAsIDB4NkJCRiwgMHg3ODg5LCAweDUzRkMsIDB4OTZENSwgMHg1MUNCLCAweDUyMDEsIDB4NjM4OSwKKyAgICAweDU0MEEsIDB4OTQ5MywgMHg4QzAzLCAweDhEQ0MsIDB4NzIzOSwgMHg3ODlGLCAweDg3NzYsIDB4OEZFRCwgMHg4QzBELAorICAgIDB4NTNFMCwgMHg0RTAxLCAweDc2RUYsIDB4NTNFRSwgMHg5NDg5LCAweDk4NzYsIDB4OUYwRSwgMHg5NTJELCAweDVCOUEsCisgICAgMHg4QkEyLCAweDRFMjIsIDB4NEUxQywgMHg1MUFDLCAweDg0NjMsIDB4NjFDMiwgMHg1MkE4LCAweDY4MEIsIDB4NEY5NywKKyAgICAweDYwNkIsIDB4NTFCQiwgMHg2RDFFLCAweDUxNUMsIDB4NjI5NiwgMHg2NTk3LCAweDk2NjEsIDB4OEM0NiwgMHg5MDE3LAorICAgIDB4NzVEOCwgMHg5MEZELCAweDc3NjMsIDB4NkJEMiwgMHg3MjhBLCAweDcyRUMsIDB4OEJGQiwgMHg1ODM1LCAweDc3NzksCisgICAgMHg4RDRDLCAweDY3NUMsIDB4OTU0MCwgMHg4MDlBLCAweDVFQTYsIDB4NkUyMSwgMHg1OTkyLCAweDdBRUYsIDB4NzdFRCwKKyAgICAweDk1M0IsIDB4NkJCNSwgMHg2NUFELCAweDdGMEUsIDB4NTgwNiwgMHg1MTUxLCAweDk2MUYsIDB4NUJGOSwgMHg1OEE5LAorICAgIDB4NTQyOCwgMHg4RTcyLCAweDY1NjYsIDB4OTg3RiwgMHg1NkU0LCAweDk0OUQsIDB4NzZGRSwgMHg5MDQxLCAweDYzODcsCisgICAgMHg1NEM2LCAweDU5MUEsIDB4NTkzQSwgMHg1NzlCLCAweDhFQjIsIDB4NjczNSwgMHg4REZBLCAweDgyMzUsIDB4NTI0MSwKKyAgICAweDYwRjAsIDB4NTgxNSwgMHg4NkZFLCAweDVDRTgsIDB4OUU0NSwgMHg0RkM0LCAweDk4OUQsIDB4OEJCOSwgMHg1QTI1LAorICAgIDB4NjA3NiwgMHg1Mzg0LCAweDYyN0MsIDB4OTA0RiwgMHg5MTAyLCAweDk5N0YsIDB4NjA2OSwgMHg4MDBDLCAweDUxM0YsCisgICAgMHg4MDMzLCAweDVDMTQsIDB4OTk3NSwgMHg2RDMxLCAweDRFOEMsIDB4OEQzMCwgMHg1M0QxLCAweDdGNUEsIDB4N0I0RiwKKyAgICAweDRGMTAsIDB4NEU0RiwgMHg5NjAwLCAweDZDRDUsIDB4NzNEMCwgMHg4NUU5LCAweDVFMDYsIDB4NzU2QSwgMHg3RkZCLAorICAgIDB4NkEwQSwgMHg3N0ZFLCAweDk0OTIsIDB4N0U0MSwgMHg1MUUxLCAweDcwRTYsIDB4NTNDRCwgMHg4RkQ0LCAweDgzMDMsCisgICAgMHg4RDI5LCAweDcyQUYsIDB4OTk2RCwgMHg2Q0RCLCAweDU3NEEsIDB4ODJCMywgMHg2NUI5LCAweDgwQUEsIDB4NjIzRiwKKyAgICAweDk2MzIsIDB4NTlBOCwgMHg0RUZGLCAweDhCQkYsIDB4N0VCQSwgMHg2NTNFLCAweDgzRjIsIDB4OTc1RSwgMHg1NTYxLAorICAgIDB4OThERSwgMHg4MEE1LCAweDUzMkEsIDB4OEJGRCwgMHg1NDIwLCAweDgwQkEsIDB4NUU5RiwgMHg2Q0I4LCAweDhEMzksCisgICAgMHg4MkFDLCAweDkxNUEsIDB4NTQyOSwgMHg2QzFCLCAweDUyMDYsIDB4N0VCNywgMHg1NzVGLCAweDcxMUEsIDB4NkM3RSwKKyAgICAweDdDODksIDB4NTk0QiwgMHg0RUZELCAweDVGRkYsIDB4NjEyNCwgMHg3Q0FBLCAweDRFMzAsIDB4NUMwMSwgMHg2N0FCLAorICAgIDB4ODcwMiwgMHg1Q0YwLCAweDk1MEIsIDB4OThDRSwgMHg3NUFGLCAweDcwRkQsIDB4OTAyMiwgMHg1MUFGLCAweDdGMUQsCisgICAgMHg4QkJELCAweDU5NDksIDB4NTFFNCwgMHg0RjVCLCAweDU0MjYsIDB4NTkyQiwgMHg2NTc3LCAweDgwQTQsIDB4NUI3NSwKKyAgICAweDYyNzYsIDB4NjJDMiwgMHg4RjkwLCAweDVFNDUsIDB4NkMxRiwgMHg3QjI2LCAweDRGMEYsIDB4NEZEOCwgMHg2NzBELAorICAgIDB4NkQ2RSwgMHg2REFBLCAweDc5OEYsIDB4ODhCMSwgMHg1RjE3LCAweDc1MkIsIDB4NjI5QSwgMHg4Rjg1LCAweDRGRUYsCisgICAgMHg5MURDLCAweDY1QTcsIDB4ODEyRiwgMHg4MTUxLCAweDVFOUMsIDB4ODE1MCwgMHg4RDc0LCAweDUyNkYsIDB4ODk4NiwKKyAgICAweDhENEIsIDB4NTkwRCwgMHg1MDg1LCAweDRFRDgsIDB4OTYxQywgMHg3MjM2LCAweDgxNzksIDB4OEQxRiwgMHg1QkNDLAorICAgIDB4OEJBMywgMHg5NjQ0LCAweDU5ODcsIDB4N0YxQSwgMHg1NDkwLCAweDU2NzYsIDB4NTYwRSwgMHg4QkU1LCAweDY1MzksCisgICAgMHg2OTgyLCAweDk0OTksIDB4NzZENiwgMHg2RTg5LCAweDVFNzIsIDB4NzUxOCwgMHg2NzQ2LCAweDY3RDEsIDB4N0FGRiwKKyAgICAweDgwOUQsIDB4OEQ3NiwgMHg2MTFGLCAweDc5QzYsIDB4NjU2MiwgMHg4RDYzLCAweDUxODgsIDB4NTIxQSwgMHg5NEEyLAorICAgIDB4N0YzOCwgMHg4MDlCLCAweDdFQjIsIDB4NUM5NywgMHg2RTJGLCAweDY3NjAsIDB4N0JEOSwgMHg3NjhCLCAweDlBRDgsCisgICAgMHg4MThGLCAweDdGOTQsIDB4N0NENSwgMHg2NDFFLCAweDk1NTAsIDB4N0EzRiwgMHg1NDRBLCAweDU0RTUsIDB4NkI0QywKKyAgICAweDY0MDEsIDB4NjIwOCwgMHg5RTNELCAweDgwRjMsIDB4NzU5OSwgMHg1MjcyLCAweDk3NjksIDB4ODQ1QiwgMHg2ODNDLAorICAgIDB4ODZFNCwgMHg5NjAxLCAweDk2OTQsIDB4OTRFQywgMHg0RTJBLCAweDU0MDQsIDB4N0VEOSwgMHg2ODM5LCAweDhEREYsCisgICAgMHg4MDE1LCAweDY2RjQsIDB4NUU5QSwgMHg3RkI5LCAweDU3QzIsIDB4ODAzRiwgMHg2ODk3LCAweDVERTUsIDB4NjUzQiwKKyAgICAweDUyOUYsIDB4NjA2RCwgMHg5RjlBLCAweDRGOUIsIDB4OEVBQywgMHg1MTZDLCAweDVCQUIsIDB4NUYxMywgMHg1REU5LAorICAgIDB4NkM1RSwgMHg2MkYxLCAweDhEMjEsIDB4NTE3MSwgMHg5NEE5LCAweDUyRkUsIDB4NkM5RiwgMHg4MkRGLCAweDcyRDcsCisgICAgMHg1N0EyLCAweDY3ODQsIDB4OEQyRCwgMHg1OTFGLCAweDhGOUMsIDB4ODNDNywgMHg1NDk1LCAweDdCOEQsIDB4NEYzMCwKKyAgICAweDZDQkQsIDB4NUI2NCwgMHg1OUQxLCAweDlGMTMsIDB4NTNFNCwgMHg4NkNBLCAweDlBQTgsIDB4OEMzNywgMHg4MEExLAorICAgIDB4NjU0NSwgMHg5ODdFLCAweDU2RkEsIDB4OTZDNywgMHg1MjJFLCAweDc0REMsIDB4NTI1MCwgMHg1QkUxLCAweDYzMDIsCisgICAgMHg4OTAyLCAweDRFNTYsIDB4NjJEMCwgMHg2MDJBLCAweDY4RkEsIDB4NTE3MywgMHg1Qjk4LCAweDUxQTAsIDB4ODlDMiwKKyAgICAweDdCQTEsIDB4OTk4NiwgMHg3RjUwLCAweDYwRUYsIDB4NzA0QywgMHg4RDJGLCAweDUxNDksIDB4NUU3RiwgMHg5MDFCLAorICAgIDB4NzQ3MCwgMHg4OUM0LCAweDU3MkQsIDB4Nzg0NSwgMHg1RjUyLCAweDlGOUYsIDB4OTVGQSwgMHg4RjY4LCAweDlCM0MsCisgICAgMHg4QkUxLCAweDc2NzgsIDB4Njg0MiwgMHg2N0RDLCAweDhERUEsIDB4OEQzNSwgMHg1MjNELCAweDhGOEEsIDB4NkVEQSwKKyAgICAweDY4Q0QsIDB4OTUwNSwgMHg5MEVELCAweDU2RkQsIDB4Njc5QywgMHg4OEY5LCAweDhGQzcsIDB4NTRDOCwgMHg5QUI4LAorICAgIDB4NUI2OSwgMHg2RDc3LCAweDZDMjYsIDB4NEVBNSwgMHg1QkIzLCAweDlBODcsIDB4OTE2MywgMHg2MUE4LCAweDkwQUYsCisgICAgMHg5N0U5LCAweDU0MkIsIDB4NkRCNSwgMHg1QkQyLCAweDUxRkQsIDB4NTU4QSwgMHg3RjU1LCAweDdGRjAsIDB4NjRCQywKKyAgICAweDYzNEQsIDB4NjVGMSwgMHg2MUJFLCAweDYwOEQsIDB4NzEwQSwgMHg2QzU3LCAweDZDNDksIDB4NTkyRiwgMHg2NzZELAorICAgIDB4ODIyQSwgMHg1OEQ1LCAweDU2OEUsIDB4OEM2QSwgMHg2QkVCLCAweDkwREQsIDB4NTk3RCwgMHg4MDE3LCAweDUzRjcsCisgICAgMHg2RDY5LCAweDU0NzUsIDB4NTU5RCwgMHg4Mzc3LCAweDgzQ0YsIDB4NjgzOCwgMHg3OUJFLCAweDU0OEMsIDB4NEY1NSwKKyAgICAweDU0MDgsIDB4NzZEMiwgMHg4Qzg5LCAweDk2MDIsIDB4NkNCMywgMHg2REI4LCAweDhENkIsIDB4ODkxMCwgMHg5RTY0LAorICAgIDB4OEQzQSwgMHg1NjNGLCAweDlFRDEsIDB4NzVENSwgMHg1Rjg4LCAweDcyRTAsIDB4NjA2OCwgMHg1NEZDLCAweDRFQTgsCisgICAgMHg2QTJBLCAweDg4NjEsIDB4NjA1MiwgMHg4RjcwLCAweDU0QzQsIDB4NzBEOCwgMHg4Njc5LCAweDlFM0YsIDB4NkQyQSwKKyAgICAweDVCOEYsIDB4NUYxOCwgMHg3RUEyLCAweDU1ODksIDB4NEZBRiwgMHg3MzM0LCAweDU0M0MsIDB4NTM5QSwgMHg1MDE5LAorICAgIDB4NTQwRSwgMHg1NDdDLCAweDRFNEUsIDB4NUZGRCwgMHg3NDVBLCAweDU4RjYsIDB4ODQ2QiwgMHg4MEUxLCAweDg3NzQsCisgICAgMHg3MkQwLCAweDdDQ0EsIDB4NkU1NiwgMHg1RjI3LCAweDg2NEUsIDB4NTUyQywgMHg2MkE0LCAweDRFOTIsIDB4NkNBQSwKKyAgICAweDYyMzcsIDB4ODJCMSwgMHg1NEQ3LCAweDUzNEUsIDB4NzMzRSwgMHg2RUQxLCAweDc1M0IsIDB4NTIxMiwgMHg1MzE2LAorICAgIDB4OEJERCwgMHg2OUQwLCAweDVGOEEsIDB4NjAwMCwgMHg2REVFLCAweDU3NEYsIDB4NkIyMiwgMHg3M0FGLCAweDY4NTMsCisgICAgMHg4RkQ4LCAweDdGMTMsIDB4NjM2MiwgMHg2MEEzLCAweDU1MjQsIDB4NzVFQSwgMHg4QzYyLCAweDcxMTUsIDB4NkRBMywKKyAgICAweDVCQTYsIDB4NUU3QiwgMHg4MzUyLCAweDYxNEMsIDB4OUVDNCwgMHg3OEZBLCAweDg3NTcsIDB4N0MyNywgMHg3Njg3LAorICAgIDB4NTFGMCwgMHg2MEY2LCAweDcxNEMsIDB4NjY0MywgMHg1RTRDLCAweDYwNEQsIDB4OEMwRSwgMHg3MDcwLCAweDYzMjUsCisgICAgMHg4Rjg5LCAweDVGQkQsIDB4NjA2MiwgMHg4NkQ0LCAweDU2REUsIDB4NkJDMSwgMHg2MDk0LCAweDYxNjcsIDB4NTM0OSwKKyAgICAweDYwRTAsIDB4NjY2NiwgMHg4RDNGLCAweDc5RkQsIDB4NEYxQSwgMHg3MEU5LCAweDZDNDcsIDB4OEJCMywgMHg4QkYyLAorICAgIDB4N0VEOCwgMHg4MzY0LCAweDY2MEYsIDB4NUE1QSwgMHg5QjQyLCAweDZENTEsIDB4NkRGNywgMHg4QzQxLCAweDZEM0IsCisgICAgMHg0RjE5LCAweDcwNkIsIDB4ODNCNywgMHg2MjE2LCAweDYwRDEsIDB4OTcwRCwgMHg4RDI3LCAweDc5NzgsIDB4NTFGQiwKKyAgICAweDU3M0UsIDB4NTdGQSwgMHg2NzNBLCAweDc1NzgsIDB4N0EzRCwgMHg3OUVGLCAweDdCOTUsIDB4ODA4QywgMHg5OTY1LAorICAgIDB4OEZGOSwgMHg2RkMwLCAweDhCQTUsIDB4OUUyMSwgMHg1OUVDLCAweDdFRTksIDB4N0YwOSwgMHg1NDA5LCAweDY3ODEsCisgICAgMHg2OEQ4LCAweDhGOTEsIDB4N0M0RCwgMHg5NkM2LCAweDUzQ0EsIDB4NjAyNSwgMHg3NUJFLCAweDZDNzIsIDB4NTM3MywKKyAgICAweDVBQzksIDB4N0VBNywgMHg2MzI0LCAweDUxRTAsIDB4ODEwQSwgMHg1REYxLCAweDg0REYsIDB4NjI4MCwgMHg1MTgwLAorICAgIDB4NUI2MywgMHg0RjBFLCAweDc5NkQsIDB4NTI0MiwgMHg2MEI4LCAweDZENEUsIDB4NUJDNCwgMHg1QkMyLCAweDhCQTEsCisgICAgMHg4QkIwLCAweDY1RTIsIDB4NUZDQywgMHg5NjQ1LCAweDU5OTMsIDB4N0VFNywgMHg3RUFBLCAweDU2MDksIDB4NjdCNywKKyAgICAweDU5MzksIDB4NEY3MywgMHg1QkI2LCAweDUyQTAsIDB4ODM1QSwgMHg5ODhBLCAweDhEM0UsIDB4NzUzMiwgMHg5NEJFLAorICAgIDB4NTA0NywgMHg3QTNDLCAweDRFRjcsIDB4NjdCNiwgMHg5QTdFLCAweDVBQzEsIDB4NkI3QywgMHg3NkQxLCAweDU3NUEsCisgICAgMHg1QzE2LCAweDdCM0EsIDB4OTVGNCwgMHg3MTRFLCAweDUxN0MsIDB4ODBBOSwgMHg4MjcwLCAweDU5NzgsIDB4N0YwNCwKKyAgICAweDgzMjcsIDB4NjhDMCwgMHg2N0VDLCAweDc4QjEsIDB4Nzg3NywgMHg2MkUzLCAweDYzNjEsIDB4N0I4MCwgMHg0RkVELAorICAgIDB4NTI2QSwgMHg1MUNGLCAweDgzNTAsIDB4NjlEQiwgMHg5Mjc0LCAweDhERjUsIDB4OEQzMSwgMHg4OUMxLCAweDk1MkUsCisgICAgMHg3QkFELCAweDRFRjYsIDB4NTA2NSwgMHg4MjMwLCAweDUyNTEsIDB4OTk2RiwgMHg2RTEwLCAweDZFODUsIDB4NkRBNywKKyAgICAweDVFRkEsIDB4NTBGNSwgMHg1OURDLCAweDVDMDYsIDB4NkQ0NiwgMHg2QzVGLCAweDc1ODYsIDB4ODQ4QiwgMHg2ODY4LAorICAgIDB4NTk1NiwgMHg4QkIyLCAweDUzMjAsIDB4OTE3MSwgMHg5NjRELCAweDg1NDksIDB4NjkxMiwgMHg3OTAxLCAweDcxMjYsCisgICAgMHg4MEY2LCAweDRFQTQsIDB4OTBDQSwgMHg2RDQ3LCAweDlBODQsIDB4NUEwNywgMHg1NkJDLCAweDY0MDUsIDB4OTRGMCwKKyAgICAweDc3RUIsIDB4NEZBNSwgMHg4MTFBLCAweDcyRTEsIDB4ODlEMiwgMHg5OTdBLCAweDdGMzQsIDB4N0VERSwgMHg1MjdGLAorICAgIDB4NjU1OSwgMHg5MTc1LCAweDhGN0YsIDB4OEY4MywgMHg1M0VCLCAweDdBOTYsIDB4NjNFRCwgMHg2M0E1LCAweDc2ODYsCisgICAgMHg3OUY4LCAweDg4NTcsIDB4OTYzNiwgMHg2MjJBLCAweDUyQUIsIDB4ODI4MiwgMHg2ODU0LCAweDY3NzAsIDB4NjM3NywKKyAgICAweDc3NkIsIDB4N0FFRCwgMHg2RDAxLCAweDdFRDMsIDB4ODlFMywgMHg1OUQwLCAweDYyMTIsIDB4ODVDOSwgMHg4MkE1LAorICAgIDB4NzU0QywgMHg1MDFGLCAweDRFQ0IsIDB4NzVBNSwgMHg4QkVCLCAweDVDNEEsIDB4NURGRSwgMHg3QjRCLCAweDY1QTQsCisgICAgMHg5MUQxLCAweDRFQ0EsIDB4NkQyNSwgMHg4OTVGLCAweDdEMjcsIDB4OTUyNiwgMHg0RUM1LCAweDhDMjgsIDB4OEZEQiwKKyAgICAweDk3NzMsIDB4NjY0QiwgMHg3OTgxLCAweDhGRDEsIDB4NzBFQywgMHg2RDc4LCAweDVDM0QsIDB4NTJCMiwgMHg4MzQ2LAorICAgIDB4NTE2MiwgMHg4MzBFLCAweDc3NUIsIDB4NjY3NiwgMHg5Q0I4LCAweDRFQUMsIDB4NjBDQSwgMHg3Q0JFLCAweDdDQjMsCisgICAgMHg3RUNGLCAweDRFOTUsIDB4OEI2NiwgMHg2NjZGLCAweDk4ODgsIDB4OTc1OSwgMHg1ODgzLCAweDY1NkMsIDB4OTU1QywKKyAgICAweDVGODQsIDB4NzVDOSwgMHg5NzU2LCAweDdBREYsIDB4N0FERSwgMHg1MUMwLCAweDcwQUYsIDB4N0E5OCwgMHg2M0VBLAorICAgIDB4N0E3NiwgMHg3RUEwLCAweDczOTYsIDB4OTdFRCwgMHg0RTQ1LCAweDcwNzgsIDB4NEU1RCwgMHg5MTUyLCAweDUzQTksCisgICAgMHg2NTUxLCAweDY1RTcsIDB4ODFGQywgMHg4MjA1LCAweDU0OEUsIDB4NUMzMSwgMHg3NTlBLCAweDk3QTAsIDB4NjJEOCwKKyAgICAweDcyRDksIDB4NzVCRCwgMHg1QzQ1LCAweDlBNzksIDB4ODNDQSwgMHg1QzQwLCAweDU0ODAsIDB4NzdFOSwgMHg0RTNFLAorICAgIDB4NkNBRSwgMHg4MDVBLCAweDYyRDIsIDB4NjM2RSwgMHg1REU4LCAweDUxNzcsIDB4OERERCwgMHg4RTFFLCAweDk1MkYsCisgICAgMHg0RkYxLCAweDUzRTUsIDB4NjBFNywgMHg3MEFDLCAweDUyNjcsIDB4NjM1MCwgMHg5RTQzLCAweDVBMUYsIDB4NTAyNiwKKyAgICAweDc3MzcsIDB4NTM3NywgMHg3RUUyLCAweDY0ODUsIDB4NjUyQiwgMHg2Mjg5LCAweDYzOTgsIDB4NTAxNCwgMHg3MjM1LAorICAgIDB4ODlDOSwgMHg1MUIzLCAweDhCQzAsIDB4N0VERCwgMHg1NzQ3LCAweDgzQ0MsIDB4OTRBNywgMHg1MTlCLCAweDU0MUIsCisgICAgMHg1Q0ZCLCAweDRGQ0EsIDB4N0FFMywgMHg2RDVBLCAweDkwRTEsIDB4OUE4RiwgMHg1NTgwLCAweDU0OTYsIDB4NTM2MSwKKyAgICAweDU0QUYsIDB4NUYwMCwgMHg2M0U5LCAweDY5NzcsIDB4NTFFRiwgMHg2MTY4LCAweDUyMEEsIDB4NTgyQSwgMHg1MkQ4LAorICAgIDB4NTc0RSwgMHg3ODBELCAweDc3MEIsIDB4NUVCNywgMHg2MTc3LCAweDdDRTAsIDB4NjI1QiwgMHg2Mjk3LCAweDRFQTIsCisgICAgMHg3MDk1LCAweDgwMDMsIDB4NjJGNywgMHg3MEU0LCAweDk3NjAsIDB4NTc3NywgMHg4MkRCLCAweDY3RUYsIDB4NjhGNSwKKyAgICAweDc4RDUsIDB4OTg5NywgMHg3OUQxLCAweDU4RjMsIDB4NTRCMywgMHg1M0VGLCAweDZFMzQsIDB4NTE0QiwgMHg1MjNCLAorICAgIDB4NUJBMiwgMHg4QkZFLCAweDgwQUYsIDB4NTU0MywgMHg1N0E2LCAweDYwNzMsIDB4NTc1MSwgMHg1NDJELCAweDdBN0EsCisgICAgMHg2MDUwLCAweDVCNTQsIDB4NjNBNywgMHg2MkEwLCAweDUzRTMsIDB4NjI2MywgMHg1QkM3LCAweDY3QUYsIDB4NTRFRCwKKyAgICAweDdBOUYsIDB4ODJFNiwgMHg5MTc3LCAweDVFOTMsIDB4ODhFNCwgMHg1OTM4LCAweDU3QUUsIDB4NjMwRSwgMHg4REU4LAorICAgIDB4ODBFRiwgMHg1NzU3LCAweDdCNzcsIDB4NEZBOSwgMHg1RkVCLCAweDVCQkQsIDB4NkIzRSwgMHg1MzIxLCAweDdCNTAsCisgICAgMHg3MkMyLCAweDY4NDYsIDB4NzdGRiwgMHg3NzM2LCAweDY1RjcsIDB4NTFCNSwgMHg0RThGLCAweDc2RDQsIDB4NUNCRiwKKyAgICAweDdBQTUsIDB4ODQ3NSwgMHg1OTRFLCAweDlCNDEsIDB4NTA4MCwgMHg5OTg4LCAweDYxMjcsIDB4NkU4MywgMHg1NzY0LAorICAgIDB4NjYwNiwgMHg2MzQ2LCAweDU2RjAsIDB4NjJFQywgMHg2MjY5LCAweDVFRDMsIDB4OTYxNCwgMHg1NzgzLCAweDYyQzksCisgICAgMHg1NTg3LCAweDg3MjEsIDB4ODE0QSwgMHg4RkEzLCAweDU1NjYsIDB4ODNCMSwgMHg2NzY1LCAweDhENTYsIDB4ODRERCwKKyAgICAweDVBNkEsIDB4NjgwRiwgMHg2MkU2LCAweDdCRUUsIDB4OTYxMSwgMHg1MTcwLCAweDZGOUMsIDB4OEMzMCwgMHg2M0ZELAorICAgIDB4ODlDOCwgMHg2MUQyLCAweDdGMDYsIDB4NzBDMiwgMHg2RUU1LCAweDc0MDUsIDB4Njk5NCwgMHg3MkZDLCAweDVFQ0EsCisgICAgMHg5MENFLCAweDY3MTcsIDB4NkQ2QSwgMHg2MzVFLCAweDUyQjMsIDB4NzI2MiwgMHg4MDAxLCAweDRGNkMsIDB4NTlFNSwKKyAgICAweDkxNkEsIDB4NzBEOSwgMHg2RDlELCAweDUyRDIsIDB4NEU1MCwgMHg5NkY3LCAweDk1NkQsIDB4ODU3RSwgMHg3OENBLAorICAgIDB4N0QyRiwgMHg1MTIxLCAweDU3OTIsIDB4NjRDMiwgMHg4MDhCLCAweDdDN0IsIDB4NkNFQSwgMHg2OEYxLCAweDY5NUUsCisgICAgMHg1MUI3LCAweDUzOTgsIDB4NjhBOCwgMHg3MjgxLCAweDlFQ0UsIDB4N0JGMSwgMHg3MkY4LCAweDc5QkIsIDB4NkYxMywKKyAgICAweDc0MDYsIDB4Njc0RSwgMHg5MUNDLCAweDlDQTQsIDB4NzkzQywgMHg4Mzg5LCAweDgzNTQsIDB4NTQwRiwgMHg2ODE3LAorICAgIDB4NEUzRCwgMHg1Mzg5LCAweDUyQjEsIDB4NzgzRSwgMHg1Mzg2LCAweDUyMjksIDB4NTA4OCwgMHg0RjhCLCAweDRGRDAsCisgICAgMHg3NUUyLCAweDdBQ0IsIDB4N0M5MiwgMHg2Q0E1LCAweDk2QjYsIDB4NTI5QiwgMHg3NDgzLCAweDU0RTksIDB4NEZFOSwKKyAgICAweDgwNTQsIDB4ODNCMiwgMHg4RkRFLCAweDk1NzAsIDB4NUVDOSwgMHg2MDFDLCAweDZEOUYsIDB4NUUxOCwgMHg2NTVCLAorICAgIDB4ODEzOCwgMHg5NEZFLCAweDYwNEIsIDB4NzBCQywgMHg3RUMzLCAweDdDQUUsIDB4NTFDOSwgMHg2ODgxLCAweDdDQjEsCisgICAgMHg4MjZGLCAweDRFMjQsIDB4OEY4NiwgMHg5MUNGLCAweDY2N0UsIDB4NEVBRSwgMHg4QzA1LCAweDY0QTksIDB4ODA0QSwKKyAgICAweDUwREEsIDB4NzU5NywgMHg3MUNFLCAweDVCRTUsIDB4OEZCRCwgMHg2RjY2LCAweDRFODYsIDB4NjQ4MiwgMHg5NTYzLAorICAgIDB4NUVENiwgMHg2NTk5LCAweDUyMTcsIDB4ODhDMiwgMHg3MEM4LCAweDUyQTMsIDB4NzMwRSwgMHg3NDMzLCAweDY3OTcsCisgICAgMHg3OEY3LCAweDk3MTYsIDB4NEUzNCwgMHg5MEJCLCAweDlDREUsIDB4NkRDQiwgMHg1MURCLCAweDhENDEsIDB4NTQxRCwKKyAgICAweDYyQ0UsIDB4NzNCMiwgMHg4M0YxLCAweDk2RjYsIDB4OUY4NCwgMHg5NEMzLCAweDRGMzYsIDB4N0Y5QSwgMHg1MUNDLAorICAgIDB4NzA3NSwgMHg5Njc1LCAweDVDQUQsIDB4OTg4NiwgMHg1M0U2LCAweDRFRTQsIDB4NkU5QywgMHg3NDA5LCAweDY5QjQsCisgICAgMHg3ODZCLCAweDk5OEYsIDB4NzU1OSwgMHg1MjE4LCAweDc2MjQsIDB4NkQ0MSwgMHg2N0YzLCAweDUxNkQsIDB4OUY5OSwKKyAgICAweDgwNEIsIDB4NTQ5OSwgMHg3QjNDLCAweDdBQkYsIDB4OTY4NiwgMHg1Nzg0LCAweDYyRTIsIDB4OTY0NywgMHg2OTdDLAorICAgIDB4NUEwNCwgMHg2NDAyLCAweDdCRDMsIDB4NkYwRiwgMHg5NjRCLCAweDgyQTYsIDB4NTM2MiwgMHg5ODg1LCAweDVFOTAsCisgICAgMHg3MDg5LCAweDYzQjMsIDB4NTM2NCwgMHg4NjRGLCAweDlDODEsIDB4OUU5MywgMHg3ODhDLCAweDk3MzIsIDB4OERFRiwKKyAgICAweDhENDIsIDB4OUU3RiwgMHg2RjVFLCAweDc5ODQsIDB4NUY1NSwgMHg5NjQ2LCAweDYyMkUsIDB4OUE3NCwgMHg1NDE1LAorICAgIDB4OTRERCwgMHg0RkEzLCAweDY1QzUsIDB4NUM2NSwgMHg1QzYxLCAweDdGMTUsIDB4ODY1MSwgMHg2QzJGLCAweDVGOEIsCisgICAgMHg3Mzg3LCAweDZFRTQsIDB4N0VGRiwgMHg1Q0U2LCAweDYzMUIsIDB4NUI2QSwgMHg2RUU2LCAweDUzNzUsIDB4NEU3MSwKKyAgICAweDYzQTAsIDB4NzU2NSwgMHg2MkExLCAweDhGNkUsIDB4NEYyNiwgMHg0RUQxLCAweDZDQTYsIDB4N0VCNiwgMHg4QkJBLAorICAgIDB4ODQxRCwgMHg4N0JBLCAweDdGNTcsIDB4OTAzQiwgMHg5NTIzLCAweDdCQTksIDB4OUFBMSwgMHg4OEY4LCAweDg0M0QsCisgICAgMHg2RDFCLCAweDlBODYsIDB4N0VEQywgMHg1OTg4LCAweDlFQkIsIDB4NzM5QiwgMHg3ODAxLCAweDg2ODIsIDB4OUE2QywKKyAgICAweDlBODIsIDB4NTYxQiwgMHg1NDE3LCAweDU3Q0IsIDB4NEU3MCwgMHg5RUE2LCAweDUzNTYsIDB4OEZDOCwgMHg4MTA5LAorICAgIDB4Nzc5MiwgMHg5OTkyLCAweDg2RUUsIDB4NkVFMSwgMHg4NTEzLCAweDY2RkMsIDB4NjE2MiwgMHg2RjJCLCAweDhDMjksCisgICAgMHg4MjkyLCAweDgzMkIsIDB4NzZGMiwgMHg2QzEzLCAweDVGRDksIDB4ODNCRCwgMHg3MzJCLCAweDgzMDUsIDB4OTUxQSwKKyAgICAweDZCREIsIDB4NzdEQiwgMHg5NEM2LCAweDUzNkYsIDB4ODMwMiwgMHg1MTkyLCAweDVFM0QsIDB4OEM4QywgMHg4RDM4LAorICAgIDB4NEU0OCwgMHg3M0FCLCAweDY3OUEsIDB4Njg4NSwgMHg5MTc2LCAweDk3MDksIDB4NzE2NCwgMHg2Q0ExLCAweDc3MDksCisgICAgMHg1QTkyLCAweDk1NDEsIDB4NkJDRiwgMHg3RjhFLCAweDY2MjcsIDB4NUJEMCwgMHg1OUI5LCAweDVBOUEsIDB4OTVFOCwKKyAgICAweDk1RjcsIDB4NEVFQywgMHg4NDBDLCAweDg0OTksIDB4NkFBQywgMHg3NkRGLCAweDk1MzAsIDB4NzMxQiwgMHg2OEE2LAorICAgIDB4NUI1RiwgMHg3NzJGLCAweDkxOUEsIDB4OTc2MSwgMHg3Q0RDLCAweDhGRjcsIDB4OEMxQywgMHg1RjI1LCAweDdDNzMsCisgICAgMHg3OUQ4LCAweDg5QzUsIDB4NkNDQywgMHg4NzFDLCAweDVCQzYsIDB4NUU0MiwgMHg2OEM5LCAweDc3MjAsIDB4N0VGNSwKKyAgICAweDUxOTUsIDB4NTE0RCwgMHg1MkM5LCAweDVBMjksIDB4N0YwNSwgMHg5NzYyLCAweDgyRDcsIDB4NjNDRiwgMHg3Nzg0LAorICAgIDB4ODVEMCwgMHg3OUQyLCAweDZFM0EsIDB4NUU5OSwgMHg1OTk5LCAweDg1MTEsIDB4NzA2RCwgMHg2QzExLCAweDYyQkYsCisgICAgMHg3NkJGLCAweDY1NEYsIDB4NjBBRiwgMHg5NUZELCAweDY2MEUsIDB4ODc5RiwgMHg5RTIzLCAweDk0RUQsIDB4NTQwRCwKKyAgICAweDU0N0QsIDB4OEMyQywgMHg2NDc4LCAweDY0NzksIDB4ODYxMSwgMHg2QTIxLCAweDgxOUMsIDB4NzhFOCwgMHg2NDY5LAorICAgIDB4OUI1NCwgMHg2MkI5LCAweDY3MkIsIDB4ODNBQiwgMHg1OEE4LCAweDlFRDgsIDB4NkNBQiwgMHg2RjIwLCAweDVCREUsCisgICAgMHg5NjRDLCAweDhDMEIsIDB4NzI1RiwgMHg2N0QwLCAweDYyQzcsIDB4NzI2MSwgMHg0RUE5LCAweDU5QzYsIDB4NkJDRCwKKyAgICAweDU4OTMsIDB4NjZBRSwgMHg1RTU1LCAweDUyREYsIDB4NjE1NSwgMHg2NzI4LCAweDc2RUUsIDB4Nzc2NiwgMHg3MjY3LAorICAgIDB4N0E0NiwgMHg2MkZGLCAweDU0RUEsIDB4NTQ1MCwgMHg5NEEwLCAweDkwQTMsIDB4NUExQywgMHg3RUIzLCAweDZDMTYsCisgICAgMHg0RTQzLCAweDU5NzYsIDB4ODAxMCwgMHg1OTQ4LCAweDUzNTcsIDB4NzUzNywgMHg5NkJFLCAweDU2Q0EsIDB4NjMyMCwKKyAgICAweDgxMTEsIDB4NjA3QywgMHg5NUY5LCAweDZERDYsIDB4NTQ2MiwgMHg5OTgxLCAweDUxODUsIDB4NUFFOSwgMHg4MEZELAorICAgIDB4NTlBRSwgMHg5NzEzLCAweDUwMkEsIDB4NkNFNSwgMHg1QzNDLCAweDYyREYsIDB4NEY2MCwgMHg1MzNGLCAweDgxN0IsCisgICAgMHg5MDA2LCAweDZFQkEsIDB4ODUyQiwgMHg2MkM4LCAweDVFNzQsIDB4NzhCRSwgMHg2NEI1LCAweDYzN0IsIDB4NUZGNSwKKyAgICAweDVBMTgsIDB4OTE3RiwgMHg5RTFGLCAweDVDM0YsIDB4NjM0RiwgMHg4MDQyLCAweDVCN0QsIDB4NTU2RSwgMHg5NTRBLAorICAgIDB4OTU0RCwgMHg2RDg1LCAweDYwQTgsIDB4NjdFMCwgMHg3MkRFLCAweDUxREQsIDB4NUI4MSwgMHg2MkU3LCAweDZDREUsCisgICAgMHg3MjVCLCAweDYyNkQsIDB4OTRBRSwgMHg3RUJELCAweDgxMTMsIDB4NkQ1MywgMHg1MTlDLCAweDVGMDQsIDB4NTk3NCwKKyAgICAweDUyQUEsIDB4NjAxMiwgMHg1OTczLCAweDY2OTYsIDB4ODY1MCwgMHg3NTlGLCAweDYzMkEsIDB4NjFFNiwgMHg3Q0VGLAorICAgIDB4OEJGQSwgMHg1NEU2LCAweDZCMjcsIDB4OUUyNSwgMHg2QkI0LCAweDg1RDUsIDB4NTQ1NSwgMHg1MDc2LCAweDZDQTQsCisgICAgMHg1NTZBLCAweDhEQjQsIDB4NzIyQywgMHg1RTE1LCAweDYwMTUsIDB4NzQzNiwgMHg2MkNELCAweDYzOTIsIDB4NzI0QywKKyAgICAweDVGOTgsIDB4NkU0MywgMHg2RDNFLCAweDY1MDAsIDB4NkY1OCwgMHg3NkQ4LCAweDc4RDAsIDB4NzZGQywgMHg3NTU0LAorICAgIDB4NTIyNCwgMHg1M0RCLCAweDRFNTMsIDB4NUU5RSwgMHg2NUMxLCAweDgwMkEsIDB4ODBENiwgMHg2MjlCLCAweDU0ODYsCisgICAgMHg1MjI4LCAweDcwQUUsIDB4ODg4RCwgMHg4REQxLCAweDZDRTEsIDB4NTQ3OCwgMHg4MERBLCAweDU3RjksIDB4ODhGNCwKKyAgICAweDhENTQsIDB4OTY2QSwgMHg5MTRELCAweDRGNjksIDB4NkM5QiwgMHg1NUI3LCAweDc2QzYsIDB4NzgzMCwgMHg2MkE4LAorICAgIDB4NzBGOSwgMHg2RjhFLCAweDVGNkQsIDB4ODRFQywgMHg2OERBLCAweDc4N0MsIDB4N0JGNywgMHg4MUE4LCAweDY3MEIsCisgICAgMHg5RTRGLCAweDYzNjcsIDB4NzhCMCwgMHg1NzZGLCAweDc4MTIsIDB4OTczOSwgMHg2Mjc5LCAweDYyQUIsIDB4NTI4OCwKKyAgICAweDc0MzUsIDB4NkJENywgMHg1NTY0LCAweDgxM0UsIDB4NzVCMiwgMHg3NkFFLCAweDUzMzksIDB4NzVERSwgMHg1MEZCLAorICAgIDB4NUM0MSwgMHg4QjZDLCAweDdCQzcsIDB4NTA0RiwgMHg3MjQ3LCAweDlBOTcsIDB4OThEOCwgMHg2RjAyLCAweDc0RTIsCisgICAgMHg3OTY4LCAweDY0ODcsIDB4NzdBNSwgMHg2MkZDLCAweDk4OTEsIDB4OEQyQiwgMHg1NEMxLCAweDgwNTgsIDB4NEU1MiwKKyAgICAweDU3NkEsIDB4ODJGOSwgMHg4NDBELCAweDVFNzMsIDB4NTFFRCwgMHg3NEY2LCAweDhCQzQsIDB4NUM0RiwgMHg1NzYxLAorICAgIDB4NkNGQywgMHg5ODg3LCAweDVBNDYsIDB4NzgzNCwgMHg5QjQ0LCAweDhGRUIsIDB4N0M5NSwgMHg1MjU2LCAweDYyNTEsCisgICAgMHg5NEZBLCAweDRFQzYsIDB4ODM4NiwgMHg4NDYxLCAweDgzRTksIDB4ODRCMiwgMHg1N0Q0LCAweDY3MzQsIDB4NTcwMywKKyAgICAweDY2NkUsIDB4NkQ2NiwgMHg4QzMxLCAweDY2REQsIDB4NzAxMSwgMHg2NzFGLCAweDZCM0EsIDB4NjgxNiwgMHg2MjFBLAorICAgIDB4NTlCQiwgMHg0RTAzLCAweDUxQzQsIDB4NkYwNiwgMHg2N0QyLCAweDZDOEYsIDB4NTE3NiwgMHg2OENCLCAweDU5NDcsCisgICAgMHg2QjY3LCAweDc1NjYsIDB4NUQwRSwgMHg4MTEwLCAweDlGNTAsIDB4NjVENywgMHg3OTQ4LCAweDc5NDEsIDB4OUE5MSwKKyAgICAweDhENzcsIDB4NUM4MiwgMHg0RTVFLCAweDRGMDEsIDB4NTQyRiwgMHg1OTUxLCAweDc4MEMsIDB4NTY2OCwgMHg2QzE0LAorICAgIDB4OEZDNCwgMHg1RjAzLCAweDZDN0QsIDB4NkNFMywgMHg4QkFCLCAweDYzOTAsIDB4NjA3MCwgMHg2RDNELCAweDcyNzUsCisgICAgMHg2MjY2LCAweDk0OEUsIDB4OTRDNSwgMHg1MzQzLCAweDhGQzEsIDB4N0I3RSwgMHg0RURGLCAweDhDMjYsIDB4NEU3RSwKKyAgICAweDlFRDQsIDB4OTRCMSwgMHg5NEIzLCAweDUyNEQsIDB4NkY1QywgMHg5MDYzLCAweDZENDUsIDB4OEMzNCwgMHg1ODExLAorICAgIDB4NUQ0QywgMHg2QjIwLCAweDZCNDksIDB4NjdBQSwgMHg1NDVCLCAweDgxNTQsIDB4N0Y4QywgMHg1ODk5LCAweDg1MzcsCisgICAgMHg1RjNBLCAweDYyQTIsIDB4NkE0NywgMHg5NTM5LCAweDY1NzIsIDB4NjA4NCwgMHg2ODY1LCAweDc3QTcsIDB4NEU1NCwKKyAgICAweDRGQTgsIDB4NURFNywgMHg5Nzk4LCAweDY0QUMsIDB4N0ZEOCwgMHg1Q0VELCAweDRGQ0YsIDB4N0E4RCwgMHg1MjA3LAorICAgIDB4ODMwNCwgMHg0RTE0LCAweDYwMkYsIDB4N0E4MywgMHg5NEE2LCAweDRGQjUsIDB4NEVCMiwgMHg3OUU2LCAweDc0MzQsCisgICAgMHg1MkU0LCAweDgyQjksIDB4NjREMiwgMHg3OUJELCAweDVCREQsIDB4NkM4MSwgMHg5NzUyLCAweDhGN0IsIDB4NkMyMiwKKyAgICAweDUwM0UsIDB4NTM3RiwgMHg2RTA1LCAweDY0Q0UsIDB4NjY3NCwgMHg2QzMwLCAweDYwQzUsIDB4OTg3NywgMHg4QkY3LAorICAgIDB4NUU4NiwgMHg3NDNDLCAweDdBNzcsIDB4NzlDQiwgMHg0RTE4LCAweDkwQjEsIDB4NzQwMywgMHg2QzQyLCAweDU2REEsCisgICAgMHg5MTRCLCAweDZDQzUsIDB4OEQ4QiwgMHg1MzNBLCAweDg2QzYsIDB4NjZGMiwgMHg4RUFGLCAweDVDNDgsIDB4OUE3MSwKKyAgICAweDZFMjAsIDB4NTNENiwgMHg1QTM2LCAweDlGOEIsIDB4OERBMywgMHg1M0JCLCAweDU3MDgsIDB4OThBNywgMHg2NzQzLAorICAgIDB4OTE5QiwgMHg2Q0M5LCAweDUxNjgsIDB4NzVDQSwgMHg2MkYzLCAweDcyQUMsIDB4NTIzOCwgMHg1MjlELCAweDdGM0EsCisgICAgMHg3MDk0LCAweDc2MzgsIDB4NTM3NCwgMHg5RTRBLCAweDY5QjcsIDB4Nzg2RSwgMHg5NkMwLCAweDg4RDksIDB4N0ZBNCwKKyAgICAweDcxMzYsIDB4NzFDMywgMHg1MTg5LCAweDY3RDMsIDB4NzRFNCwgMHg1OEU0LCAweDY1MTgsIDB4NTZCNywgMHg4QkE5LAorICAgIDB4OTk3NiwgMHg2MjcwLCAweDdFRDUsIDB4NjBGOSwgMHg3MEVELCAweDU4RUMsIDB4NEVDMSwgMHg0RUJBLCAweDVGQ0QsCisgICAgMHg5N0U3LCAweDRFRkIsIDB4OEJBNCwgMHg1MjAzLCAweDU5OEEsIDB4N0VBQiwgMHg2MjU0LCAweDRFQ0QsIDB4NjVFNSwKKyAgICAweDYyMEUsIDB4ODMzOCwgMHg4NEM5LCAweDgzNjMsIDB4ODc4RCwgMHg3MTk0LCAweDZFQjYsIDB4NUJCOSwgMHg3RUQyLAorICAgIDB4NTE5NywgMHg2M0M5LCAweDY3RDQsIDB4ODA4OSwgMHg4MzM5LCAweDg4MTUsIDB4NTExMiwgMHg1QjdBLCAweDU5ODIsCisgICAgMHg4RkIxLCAweDRFNzMsIDB4NkM1RCwgMHg1MTY1LCAweDg5MjUsIDB4OEY2RiwgMHg5NjJFLCAweDg1NEEsIDB4NzQ1RSwKKyAgICAweDk1MTAsIDB4OTVGMCwgMHg2REE2LCAweDgyRTUsIDB4NUYzMSwgMHg2NDkyLCAweDZEMTIsIDB4ODQyOCwgMHg4MTZFLAorICAgIDB4OUNDMywgMHg1ODVFLCAweDhENUIsIDB4NEUwOSwgMHg1M0MxLCAweDRGMUUsIDB4NjU2MywgMHg2ODUxLCAweDU1RDMsCisgICAgMHg0RTI3LCAweDY0MTQsIDB4OUE5QSwgMHg2MjZCLCAweDVBQzIsIDB4NzQ1RiwgMHg4MjcyLCAweDZEQTksIDB4NjhFRSwKKyAgICAweDUwRTcsIDB4ODM4RSwgMHg3ODAyLCAweDY3NDAsIDB4NTIzOSwgMHg2Qzk5LCAweDdFQjEsIDB4NTBCQiwgMHg1NTY1LAorICAgIDB4NzE1RSwgMHg3QjVCLCAweDY2NTIsIDB4NzNDQSwgMHg4MkVCLCAweDY3NDksIDB4NUM3MSwgMHg1MjIwLCAweDcxN0QsCisgICAgMHg4ODZCLCAweDk1RUEsIDB4OTY1NSwgMHg2NEM1LCAweDhENjEsIDB4ODFCMywgMHg1NTg0LCAweDZDNTUsIDB4NjI0NywKKyAgICAweDdGMkUsIDB4NTg5MiwgMHg0RjI0LCAweDU1NDYsIDB4OEQ0RiwgMHg2NjRDLCAweDRFMEEsIDB4NUMxQSwgMHg4OEYzLAorICAgIDB4NjhBMiwgMHg2MzRFLCAweDdBMEQsIDB4NzBFNywgMHg4MjhELCAweDUyRkEsIDB4OTdGNiwgMHg1QzExLCAweDU0RTgsCisgICAgMHg5MEI1LCAweDdFQ0QsIDB4NTk2MiwgMHg4RDRBLCAweDg2QzcsIDB4ODIwQywgMHg4MjBELCAweDhENjYsIDB4NjQ0NCwKKyAgICAweDVDMDQsIDB4NjE1MSwgMHg2RDg5LCAweDc5M0UsIDB4OEJCRSwgMHg3ODM3LCAweDc1MzMsIDB4NTQ3QiwgMHg0RjM4LAorICAgIDB4OEVBQiwgMHg2REYxLCAweDVBMjAsIDB4N0VDNSwgMHg3OTVFLCAweDZDODgsIDB4NUJBMSwgMHg1QTc2LCAweDc1MUEsCisgICAgMHg4MEJFLCAweDYxNEUsIDB4NkUxNywgMHg1OEYwLCAweDc1MUYsIDB4NzUyNSwgMHg3MjcyLCAweDUzNDcsIDB4N0VGMywKKyAgICAweDc3MDEsIDB4NzZEQiwgMHg1MjY5LCAweDgwREMsIDB4NTcyMywgMHg1RTA4LCAweDU5MzEsIDB4NzJFRSwgMHg2NUJELAorICAgIDB4NkU3RiwgMHg4QkQ3LCAweDVDMzgsIDB4ODY3MSwgMHg1MzQxLCAweDc3RjMsIDB4NjJGRSwgMHg2NUY2LCAweDRFQzAsCisgICAgMHg5OERGLCAweDg2ODAsIDB4NUI5RSwgMHg4QkM2LCAweDUzRjIsIDB4NzdFMiwgMHg0RjdGLCAweDVDNEUsIDB4OUE3NiwKKyAgICAweDU5Q0IsIDB4NUYwRiwgMHg3OTNBLCAweDU4RUIsIDB4NEUxNiwgMHg2N0ZGLCAweDRFOEIsIDB4NjJFRCwgMHg4QTkzLAorICAgIDB4OTAxRCwgMHg1MkJGLCAweDY2MkYsIDB4NTVEQywgMHg1NjZDLCAweDkwMDIsIDB4NEVENSwgMHg0RjhELCAweDkxQ0EsCisgICAgMHg5OTcwLCAweDZDMEYsIDB4NUUwMiwgMHg2MDQzLCAweDVCQTQsIDB4ODlDNiwgMHg4QkQ1LCAweDY1MzYsIDB4NjI0QiwKKyAgICAweDk5OTYsIDB4NUI4OCwgMHg1QkZGLCAweDYzODgsIDB4NTUyRSwgMHg1M0Q3LCAweDc2MjYsIDB4NTE3RCwgMHg4NTJDLAorICAgIDB4NjdBMiwgMHg2OEIzLCAweDZCOEEsIDB4NjI5MiwgMHg4RjkzLCAweDUzRDQsIDB4ODIxMiwgMHg2REQxLCAweDc1OEYsCisgICAgMHg0RTY2LCAweDhENEUsIDB4NUI3MCwgMHg3MTlGLCAweDg1QUYsIDB4NjY5MSwgMHg2NkQ5LCAweDdGNzIsIDB4ODcwMCwKKyAgICAweDlFQ0QsIDB4OUYyMCwgMHg1QzVFLCAweDY3MkYsIDB4OEZGMCwgMHg2ODExLCAweDY3NUYsIDB4NjIwRCwgMHg3QUQ2LAorICAgIDB4NTg4NSwgMHg1RUI2LCAweDY1NzAsIDB4NkYzMSwgMHg2MDU1LCAweDUyMzcsIDB4ODAwRCwgMHg2NDU0LCAweDg4NzAsCisgICAgMHg3NTI5LCAweDVFMDUsIDB4NjgxMywgMHg2MkY0LCAweDk3MUMsIDB4NTNDQywgMHg3MjNELCAweDhDMDEsIDB4NkMzNCwKKyAgICAweDc3NjEsIDB4N0EwRSwgMHg1NDJFLCAweDc3QUMsIDB4OTg3QSwgMHg4MjFDLCAweDhCRjQsIDB4Nzg1NSwgMHg2NzE0LAorICAgIDB4NzBDMSwgMHg2NUFGLCAweDY0OTUsIDB4NTYzNiwgMHg2MDFELCAweDc5QzEsIDB4NTNGOCwgMHg0RTFELCAweDZCN0IsCisgICAgMHg4MDg2LCAweDVCRkEsIDB4NTVFMywgMHg1NkRCLCAweDRGM0EsIDB4NEYzQywgMHg5OTcyLCAweDVERjMsIDB4Njc3RSwKKyAgICAweDgwMzgsIDB4NjAwMiwgMHg5ODgyLCAweDkwMDEsIDB4NUI4QiwgMHg4QkJDLCAweDhCRjUsIDB4NjQxQywgMHg4MjU4LAorICAgIDB4NjRERSwgMHg1NUZELCAweDgyQ0YsIDB4OTE2NSwgMHg0RkQ3LCAweDdEMjAsIDB4OTAxRiwgMHg3QzlGLCAweDUwRjMsCisgICAgMHg1ODUxLCAweDZFQUYsIDB4NUJCRiwgMHg4QkM5LCAweDgwODMsIDB4OTE3OCwgMHg4NDlDLCAweDdCOTcsIDB4ODY3RCwKKyAgICAweDk2OEIsIDB4OTY4RiwgMHg3RUU1LCAweDlBRDMsIDB4Nzg4RSwgMHg1QzgxLCAweDdBNTcsIDB4OTA0MiwgMHg5NkE3LAorICAgIDB4Nzk1RiwgMHg1QjU5LCAweDYzNUYsIDB4N0IwQiwgMHg4NEQxLCAweDY4QUQsIDB4NTUwNiwgMHg3RjI5LCAweDc0MTAsCisgICAgMHg3RDIyLCAweDk1MDEsIDB4NjI0MCwgMHg1ODRDLCAweDRFRDYsIDB4NUI4MywgMHg1OTc5LCAweDU4NTQsIDB4NzM2RCwKKyAgICAweDYzMUUsIDB4OEU0QiwgMHg4RTBGLCAweDgwQ0UsIDB4ODJENCwgMHg2MkFDLCAweDUzRjAsIDB4NkNGMCwgMHg5MTVFLAorICAgIDB4NTkyQSwgMHg2MDAxLCAweDZDNzAsIDB4NTc0RCwgMHg2NDRBLCAweDhEMkEsIDB4NzYyQiwgMHg2RUU5LCAweDU3NUIsCisgICAgMHg2QTgwLCAweDc1RjAsIDB4NkY2RCwgMHg4QzJELCAweDhDMDgsIDB4NTc2NiwgMHg2QkVGLCAweDg4OTIsIDB4NzhCMywKKyAgICAweDYzQTIsIDB4NTNGOSwgMHg3MEFELCAweDZDNjQsIDB4NTg1OCwgMHg2NDJBLCAweDU4MDIsIDB4NjhFMCwgMHg4MTlCLAorICAgIDB4NTUxMCwgMHg3Q0Q2LCAweDUwMTgsIDB4OEVCQSwgMHg2RENDLCAweDhEOUYsIDB4NzBFQiwgMHg2MzhGLCAweDZEOUIsCisgICAgMHg2RUQ0LCAweDdFRTYsIDB4ODQwNCwgMHg2ODQzLCAweDkwMDMsIDB4NkREOCwgMHg5Njc2LCAweDhCQTgsIDB4NTk1NywKKyAgICAweDcyNzksIDB4ODVFNCwgMHg4MTdFLCAweDc1QkMsIDB4OEE4QSwgMHg2OEFGLCAweDUyNTQsIDB4OEUyMiwgMHg5NTExLAorICAgIDB4NjNEMCwgMHg5ODk4LCAweDhFNDQsIDB4NTU3QywgMHg0RjUzLCAweDY2RkYsIDB4NTY4RiwgMHg2MEQ1LCAweDZEOTUsCisgICAgMHg1MjQzLCAweDVDNDksIDB4NTkyOSwgMHg2REZCLCAweDU4NkIsIDB4NzUzMCwgMHg3NTFDLCAweDYwNkMsIDB4ODIxNCwKKyAgICAweDgxNDYsIDB4NjMxMSwgMHg2NzYxLCAweDhGRTIsIDB4NzczQSwgMHg4REYzLCAweDhEMzQsIDB4OTRDMSwgMHg1RTE2LAorICAgIDB4NTM4NSwgMHg1NDJDLCAweDcwQzMsIDB4NkM0MCwgMHg1RUY3LCAweDUwNUMsIDB4NEVBRCwgMHg1RUFELCAweDYzM0EsCisgICAgMHg4MjQ3LCAweDkwMUEsIDB4Njg1MCwgMHg5MTZFLCAweDc3QjMsIDB4NTQwQywgMHg5NERDLCAweDVGNjQsIDB4N0FFNSwKKyAgICAweDY4NzYsIDB4NjM0NSwgMHg3QjUyLCAweDdFREYsIDB4NzVEQiwgMHg1MDc3LCAweDYyOTUsIDB4NTkzNCwgMHg5MDBGLAorICAgIDB4NTFGOCwgMHg3OUMzLCAweDdBODEsIDB4NTZGRSwgMHg1RjkyLCAweDkwMTQsIDB4NkQ4MiwgMHg1QzYwLCAweDU3MUYsCisgICAgMHg1NDEwLCAweDUxNTQsIDB4NkU0RCwgMHg1NkUyLCAweDYzQTgsIDB4OTg5MywgMHg4MTdGLCAweDg3MTUsIDB4ODkyQSwKKyAgICAweDkwMDAsIDB4NTQxRSwgMHg1QzZGLCAweDgxQzAsIDB4NjJENiwgMHg2MjU4LCAweDgxMzEsIDB4OUUzNSwgMHg5NjQwLAorICAgIDB4OUE2RSwgMHg5QTdDLCAweDY5MkQsIDB4NTlBNSwgMHg2MkQzLCAweDU1M0UsIDB4NjMxNiwgMHg1NEM3LCAweDg2RDksCisgICAgMHg2RDNDLCAweDVBMDMsIDB4NzRFNiwgMHg4ODlDLCAweDZCNkEsIDB4NTkxNiwgMHg4QzRDLCAweDVGMkYsIDB4NkU3RSwKKyAgICAweDczQTksIDB4OTg3RCwgMHg0RTM4LCAweDcwRjcsIDB4NUI4QywgMHg3ODk3LCAweDYzM0QsIDB4NjY1QSwgMHg3Njk2LAorICAgIDB4NjBDQiwgMHg1QjlCLCAweDVBNDksIDB4NEUwNywgMHg4MTU1LCAweDZDNkEsIDB4NzM4QiwgMHg0RUExLCAweDY3ODksCisgICAgMHg3RjUxLCAweDVGODAsIDB4NjVGQSwgMHg2NzFCLCAweDVGRDgsIDB4NTk4NCwgMHg1QTAxLCAweDVEQ0QsIDB4NUZBRSwKKyAgICAweDUzNzEsIDB4OTdFNiwgMHg4RkRELCAweDY4NDUsIDB4NTZGNCwgMHg1NTJGLCAweDYwREYsIDB4NEUzQSwgMHg2RjRELAorICAgIDB4N0VGNCwgMHg4MkM3LCAweDg0MEUsIDB4NTlENCwgMHg0RjFGLCAweDRGMkEsIDB4NUMzRSwgMHg3RUFDLCAweDY3MkEsCisgICAgMHg4NTFBLCAweDU0NzMsIDB4NzU0RiwgMHg4MEMzLCAweDU1ODIsIDB4OUI0RiwgMHg0RjRELCAweDZFMkQsIDB4OEMxMywKKyAgICAweDVDMDksIDB4NjE3MCwgMHg1MzZCLCAweDc2MUYsIDB4NkUyOSwgMHg4NjhBLCAweDY1ODcsIDB4OTVGQiwgMHg3RUI5LAorICAgIDB4NTQzQiwgMHg3QTMzLCAweDdEMEEsIDB4OTVFRSwgMHg1NUUxLCAweDdGQzEsIDB4NzRFRSwgMHg2MzFELCAweDg3MTcsCisgICAgMHg2REExLCAweDdBOUQsIDB4NjIxMSwgMHg2NUExLCAweDUzNjcsIDB4NjNFMSwgMHg2QzgzLCAweDVERUIsIDB4NTQ1QywKKyAgICAweDk0QTgsIDB4NEU0QywgMHg2QzYxLCAweDhCRUMsIDB4NUM0QiwgMHg2NUUwLCAweDgyOUMsIDB4NjhBNywgMHg1NDNFLAorICAgIDB4NTQzNCwgMHg2QkNCLCAweDZCNjYsIDB4NEU5NCwgMHg2MzQyLCAweDUzNDgsIDB4ODIxRSwgMHg0RjBELCAweDRGQUUsCisgICAgMHg1NzVFLCAweDYyMEEsIDB4OTZGRSwgMHg2NjY0LCAweDcyNjksIDB4NTJGRiwgMHg1MkExLCAweDYwOUYsIDB4OEJFRiwKKyAgICAweDY2MTQsIDB4NzE5OSwgMHg2NzkwLCAweDg5N0YsIDB4Nzg1MiwgMHg3N0ZELCAweDY2NzAsIDB4NTYzQiwgMHg1NDM4LAorICAgIDB4OTUyMSwgMHg3MjdBLCAweDdBMDAsIDB4NjA2RiwgMHg1RTBDLCAweDYwODksIDB4ODE5RCwgMHg1OTE1LCAweDYwREMsCisgICAgMHg3MTg0LCAweDcwRUYsIDB4NkVBQSwgMHg2QzUwLCAweDcyODAsIDB4NkE4NCwgMHg4OEFELCAweDVFMkQsIDB4NEU2MCwKKyAgICAweDVBQjMsIDB4NTU5QywgMHg5NEUzLCAweDZEMTcsIDB4N0NGQiwgMHg5Njk5LCAweDYyMEYsIDB4N0VDNiwgMHg3NzhFLAorICAgIDB4ODY3RSwgMHg1MzIzLCAweDk3MUUsIDB4OEY5NiwgMHg2Njg3LCAweDVDRTEsIDB4NEZBMCwgMHg3MkVELCAweDRFMEIsCisgICAgMHg1M0E2LCAweDU5MEYsIDB4NTQxMywgMHg2MzgwLCAweDk1MjgsIDB4NTE0OCwgMHg0RUQ5LCAweDlDOUMsIDB4N0VBNCwKKyAgICAweDU0QjgsIDB4OEQyNCwgMHg4ODU0LCAweDgyMzcsIDB4OTVGMiwgMHg2RDhFLCAweDVGMjYsIDB4NUFDQywgMHg2NjNFLAorICAgIDB4OTY2OSwgMHg3M0IwLCAweDczMkUsIDB4NTNCRiwgMHg4MTdBLCAweDk5ODUsIDB4N0ZBMSwgMHg1QkFBLCAweDk2NzcsCisgICAgMHg5NjUwLCAweDdFQkYsIDB4NzZGOCwgMHg1M0EyLCAweDk1NzYsIDB4OTk5OSwgMHg3QkIxLCAweDg5NDQsIDB4NkU1OCwKKyAgICAweDRFNjEsIDB4N0ZENCwgMHg3OTY1LCAweDhCRTYsIDB4NjBGMywgMHg1NENELCAweDRFQUIsIDB4OTg3OSwgMHg1REY3LAorICAgIDB4NkE2MSwgMHg1MENGLCAweDU0MTEsIDB4OEM2MSwgMHg4NDI3LCAweDc4NUQsIDB4OTcwNCwgMHg1MjRBLCAweDU0RUUsCisgICAgMHg1NkEzLCAweDk1MDAsIDB4NkQ4OCwgMHg1QkI1LCAweDZEQzYsIDB4NjY1MywgMHg1QzBGLCAweDVCNUQsIDB4NjgyMSwKKyAgICAweDgwOTYsIDB4NTU3OCwgMHg3QjExLCAweDY1NDgsIDB4Njk1NCwgMHg0RTlCLCAweDZCNDcsIDB4ODc0RSwgMHg5NzhCLAorICAgIDB4NTM0RiwgMHg2MzFGLCAweDY0M0EsIDB4OTBBQSwgMHg2NTlDLCAweDgwQzEsIDB4OEMxMCwgMHg1MTk5LCAweDY4QjAsCisgICAgMHg1Mzc4LCAweDg3RjksIDB4NjFDOCwgMHg2Q0M0LCAweDZDRkIsIDB4OEMyMiwgMHg1QzUxLCAweDg1QUEsIDB4ODJBRiwKKyAgICAweDk1MEMsIDB4NkIyMywgMHg4RjlCLCAweDY1QjAsIDB4NUZGQiwgMHg1RkMzLCAweDRGRTEsIDB4ODg0NSwgMHg2NjFGLAorICAgIDB4ODE2NSwgMHg3MzI5LCAweDYwRkEsIDB4NTE3NCwgMHg1MjExLCAweDU3OEIsIDB4NUY2MiwgMHg5MEEyLCAweDg4NEMsCisgICAgMHg5MTkyLCAweDVFNzgsIDB4Njc0RiwgMHg2MDI3LCAweDU5RDMsIDB4NTE0NCwgMHg1MUY2LCAweDgwRjgsIDB4NTMwOCwKKyAgICAweDZDNzksIDB4OTZDNCwgMHg3MThBLCAweDRGMTEsIDB4NEZFRSwgMHg3RjlFLCAweDY3M0QsIDB4NTVDNSwgMHg5NTA4LAorICAgIDB4NzlDMCwgMHg4ODk2LCAweDdFRTMsIDB4NTg5RiwgMHg2MjBDLCAweDk3MDAsIDB4ODY1QSwgMHg1NjE4LCAweDk4N0IsCisgICAgMHg1RjkwLCAweDhCQjgsIDB4ODRDNCwgMHg5MTU3LCAweDUzRDksIDB4NjVFRCwgMHg1RThGLCAweDc1NUMsIDB4NjA2NCwKKyAgICAweDdENkUsIDB4NUE3RiwgMHg3RUVBLCAweDdFRUQsIDB4OEY2OSwgMHg1NUE3LCAweDVCQTMsIDB4NjBBQywgMHg2NUNCLAorICAgIDB4NzM4NCwgMHg5MDA5LCAweDc2NjMsIDB4NzcyOSwgMHg3RURBLCAweDk3NzQsIDB4ODU5QiwgMHg1QjY2LCAweDdBNzQsCisgICAgMHg5NkVBLCAweDg4NDAsIDB4NTJDQiwgMHg3MThGLCAweDVGQUEsIDB4NjVFQywgMHg4QkUyLCAweDVCRkIsIDB4OUE2RiwKKyAgICAweDVERTEsIDB4NkI4OSwgMHg2QzVCLCAweDhCQUQsIDB4OEJBRiwgMHg5MDBBLCAweDhGQzUsIDB4NTM4QiwgMHg2MkJDLAorICAgIDB4OUUyNiwgMHg5RTJELCAweDU0NDAsIDB4NEUyQiwgMHg4MkJELCAweDcyNTksIDB4ODY5QywgMHg1RDE2LCAweDg4NTksCisgICAgMHg2REFGLCAweDk2QzUsIDB4NTREMSwgMHg0RTlBLCAweDhCQjYsIDB4NzEwOSwgMHg1NEJELCAweDk2MDksIDB4NzBERiwKKyAgICAweDZERjksIDB4NzZEMCwgMHg0RTI1LCAweDc4MTQsIDB4ODcxMiwgMHg1Q0E5LCAweDVFRjYsIDB4OEEwMCwgMHg5ODlDLAorICAgIDB4OTYwRSwgMHg3MDhFLCAweDZDQkYsIDB4NTk0NCwgMHg2M0E5LCAweDc3M0MsIDB4ODg0RCwgMHg2RjE0LCAweDgyNzMsCisgICAgMHg1ODMwLCAweDcxRDUsIDB4NTM4QywgMHg3ODFBLCAweDk2QzEsIDB4NTUwMSwgMHg1RjY2LCAweDcxMzAsIDB4NUJCNCwKKyAgICAweDhDMUEsIDB4OUE4QywgMHg2QjgzLCAweDU5MkUsIDB4OUUyRiwgMHg3OUU3LCAweDY3NjgsIDB4NjI2QywgMHg0RjZGLAorICAgIDB4NzVBMSwgMHg3RjhBLCAweDZEMEIsIDB4OTYzMywgMHg2QzI3LCAweDRFRjAsIDB4NzVEMiwgMHg1MTdCLCAweDY4MzcsCisgICAgMHg2RjNFLCAweDkwODAsIDB4ODE3MCwgMHg1OTk2LCAweDc0NzYsIDB4NjQ0NywgMHg1QzI3LCAweDkwNjUsIDB4N0E5MSwKKyAgICAweDhDMjMsIDB4NTlEQSwgMHg1NEFDLCAweDgyMDAsIDB4ODM2RiwgMHg4OTgxLCAweDgwMDAsIDB4NjkzMCwgMHg1NjRFLAorICAgIDB4ODAzNiwgMHg3MjM3LCAweDkxQ0UsIDB4NTFCNiwgMHg0RTVGLCAweDk4NzUsIDB4NjM5NiwgMHg0RTFBLCAweDUzRjYsCisgICAgMHg2NkYzLCAweDgxNEIsIDB4NTkxQywgMHg2REIyLCAweDRFMDAsIDB4NThGOSwgMHg1MzNCLCAweDYzRDYsIDB4OTRGMSwKKyAgICAweDRGOUQsIDB4NEYwQSwgMHg4ODYzLCAweDk4OTAsIDB4NTkzNywgMHg5MDU3LCAweDc5RkIsIDB4NEVFQSwgMHg4MEYwLAorICAgIDB4NzU5MSwgMHg2QzgyLCAweDVCOUMsIDB4NTlFOCwgMHg1RjVELCAweDY5MDUsIDB4ODY4MSwgMHg1MDFBLCAweDVERjIsCisgICAgMHg0RTU5LCAweDc3RTMsIDB4NEVFNSwgMHg4MjdBLCAweDYyOTEsIDB4NjYxMywgMHg5MDkxLCAweDVDNzksIDB4NEVCRiwKKyAgICAweDVGNzksIDB4ODFDNiwgMHg5MDM4LCAweDgwODQsIDB4NzVBQiwgMHg0RUE2LCAweDg4RDQsIDB4NjEwRiwgMHg2QkM1LAorICAgIDB4NUZDNiwgMHg0RTQ5LCAweDc2Q0EsIDB4NkVBMiwgMHg4QkUzLCAweDhCQUUsIDB4OEMwQSwgMHg4QkQxLCAweDVGMDIsCisgICAgMHg3RkZDLCAweDdGQ0MsIDB4N0VDRSwgMHg4MzM1LCAweDgzNkIsIDB4NTZFMCwgMHg2QkI3LCAweDk3RjMsIDB4OTYzNCwKKyAgICAweDU5RkIsIDB4NTQxRiwgMHg5NEY2LCAweDZERUIsIDB4NUJDNSwgMHg5OTZFLCAweDVDMzksIDB4NUYxNSwgMHg5NjkwLAorICAgIDB4NTM3MCwgMHg4MkYxLCAweDZBMzEsIDB4NUE3NCwgMHg5RTcwLCAweDVFOTQsIDB4N0YyOCwgMHg4M0I5LCAweDg0MjQsCisgICAgMHg4NDI1LCAweDgzNjcsIDB4ODc0NywgMHg4RkNFLCAweDhENjIsIDB4NzZDOCwgMHg1RjcxLCAweDk4OTYsIDB4Nzg2QywKKyAgICAweDY2MjAsIDB4NTRERiwgMHg2MkU1LCAweDRGNjMsIDB4ODFDMywgMHg3NUM4LCAweDVFQjgsIDB4OTZDRCwgMHg4RTBBLAorICAgIDB4ODZGOSwgMHg1NDhGLCAweDZDRjMsIDB4NkQ4QywgMHg2QzM4LCAweDYwN0YsIDB4NTJDNywgMHg3NTI4LCAweDVFN0QsCisgICAgMHg0RjE4LCAweDYwQTAsIDB4NUZFNywgMHg1QzI0LCAweDc1MzEsIDB4OTBBRSwgMHg5NEMwLCAweDcyQjksIDB4NkNCOSwKKyAgICAweDZFMzgsIDB4OTE0OSwgMHg2NzA5LCAweDUzQ0IsIDB4NTNGMywgMHg0RjUxLCAweDkxQzksIDB4OEJGMSwgMHg1M0M4LAorICAgIDB4NUU3QywgMHg4RkMyLCAweDZERTQsIDB4NEU4RSwgMHg3NkMyLCAweDY5ODYsIDB4ODY1RSwgMHg2MTFBLCAweDgyMDYsCisgICAgMHg0RjU5LCAweDRGREUsIDB4OTAzRSwgMHg5QzdDLCAweDYxMDksIDB4NkUxRCwgMHg2RTE0LCAweDk2ODUsIDB4NEU4OCwKKyAgICAweDVBMzEsIDB4OTZFOCwgMHg0RTBFLCAweDVDN0YsIDB4NzlCOSwgMHg1Qjg3LCAweDhCRUQsIDB4N0ZCRCwgMHg3Mzg5LAorICAgIDB4NTdERiwgMHg4MjhCLCAweDkwQzEsIDB4NTQwMSwgMHg5MDQ3LCAweDU1QkIsIDB4NUNFQSwgMHg1RkExLCAweDYxMDgsCisgICAgMHg2QjMyLCAweDcyRjEsIDB4ODBCMiwgMHg4QTg5LCAweDZENzQsIDB4NUJEMywgMHg4OEQ1LCAweDk4ODQsIDB4OEM2QiwKKyAgICAweDlBNkQsIDB4OUUzMywgMHg2RTBBLCAweDUxQTQsIDB4NTE0MywgMHg1N0EzLCAweDg4ODEsIDB4NTM5RiwgMHg2M0Y0LAorICAgIDB4OEY5NSwgMHg1NkVELCAweDU0NTgsIDB4NTcwNiwgMHg3MzNGLCAweDZFOTAsIDB4N0YxOCwgMHg4RkRDLCAweDgyRDEsCisgICAgMHg2MTNGLCAweDYwMjgsIDB4OTY2MiwgMHg2NkYwLCAweDdFQTYsIDB4OEQ4QSwgMHg4REMzLCAweDk0QTUsIDB4NUNCMywKKyAgICAweDdDQTQsIDB4NjcwOCwgMHg2MEE2LCAweDk2MDUsIDB4ODAxOCwgMHg0RTkxLCAweDkwRTcsIDB4NTMwMCwgMHg5NjY4LAorICAgIDB4NTE0MSwgMHg4RkQwLCAweDg1NzQsIDB4OTE1RCwgMHg2NjU1LCAweDk3RjUsIDB4NUI1NSwgMHg1MzFELCAweDc4MzgsCisgICAgMHg2NzQyLCAweDY4M0QsIDB4NTRDOSwgMHg3MDdFLCAweDVCQjAsIDB4OEY3RCwgMHg1MThELCAweDU3MjgsIDB4NTRCMSwKKyAgICAweDY1MTIsIDB4NjY4MiwgMHg4RDVFLCAweDhENDMsIDB4ODEwRiwgMHg4NDZDLCAweDkwNkQsIDB4N0NERiwgMHg1MUZGLAorICAgIDB4ODVGQiwgMHg2N0EzLCAweDY1RTksIDB4NkZBMSwgMHg4NkE0LCAweDhFODEsIDB4NTY2QSwgMHg5MDIwLCAweDc2ODIsCisgICAgMHg3MDc2LCAweDcxRTUsIDB4OEQyMywgMHg2MkU5LCAweDUyMTksIDB4NkNGRCwgMHg4RDNDLCAweDYwMEUsIDB4NTg5RSwKKyAgICAweDYxOEUsIDB4NjZGRSwgMHg4RDYwLCAweDYyNEUsIDB4NTVCMywgMHg2RTIzLCAweDY3MkQsIDB4OEY2NywgMHg5NEUxLAorICAgIDB4OTVGOCwgMHg3NzI4LCAweDY4MDUsIDB4NjlBOCwgMHg1NDhCLCAweDRFNEQsIDB4NzBCOCwgMHg4QkM4LCAweDY0NTgsCisgICAgMHg2NThCLCAweDVCODUsIDB4N0E4NCwgMHg1MDNBLCAweDVCRTgsIDB4NzdCQiwgMHg2QkUxLCAweDhBNzksIDB4N0M5OCwKKyAgICAweDZDQkUsIDB4NzZDRiwgMHg2NUE5LCAweDhGOTcsIDB4NUQyRCwgMHg1QzU1LCAweDg2MzgsIDB4NjgwOCwgMHg1MzYwLAorICAgIDB4NjIxOCwgMHg3QUQ5LCAweDZFNUIsIDB4N0VGRCwgMHg2QTFGLCAweDdBRTAsIDB4NUY3MCwgMHg2RjMzLCAweDVGMjAsCisgICAgMHg2MzhDLCAweDZEQTgsIDB4Njc1NiwgMHg0RTA4LCAweDVFMTAsIDB4OEQyNiwgMHg0RUQ3LCAweDgwQzAsIDB4NzYzNCwKKyAgICAweDk2OUMsIDB4NjJEQiwgMHg2NjJELCAweDYyN0UsIDB4NkNCQywgMHg4RDc1LCAweDcxNjcsIDB4N0Y2OSwgMHg1MTQ2LAorICAgIDB4ODA4NywgMHg1M0VDLCAweDkwNkUsIDB4NjI5OCwgMHg1NEYyLCAweDg2RjAsIDB4OEY5OSwgMHg4MDA1LCAweDk1MTcsCisgICAgMHg4NTE3LCAweDhGRDksIDB4NkQ1OSwgMHg3M0NELCAweDY1OUYsIDB4NzcxRiwgMHg3NTA0LCAweDc4MjcsIDB4ODFGQiwKKyAgICAweDhEMUUsIDB4OTQ4OCwgMHg0RkE2LCAweDY3OTUsIDB4NzVCOSwgMHg4QkNBLCAweDk3MDcsIDB4NjMyRiwgMHg5NTQ3LAorICAgIDB4OTYzNSwgMHg4NEI4LCAweDYzMjMsIDB4Nzc0MSwgMHg1RjgxLCAweDcyRjAsIDB4NEU4OSwgMHg2MDE0LCAweDY1NzQsCisgICAgMHg2MkVGLCAweDZCNjMsIDB4NjUzRiwgMHg1RTI3LCAweDc1QzcsIDB4OTBEMSwgMHg4QkMxLCAweDgyOUQsIDB4Njc5RCwKKyAgICAweDY1MkYsIDB4NTQzMSwgMHg4NzE4LCAweDc3RTUsIDB4ODBBMiwgMHg4MTAyLCAweDZDNDEsIDB4NEU0QiwgMHg3RUM3LAorICAgIDB4ODA0QywgMHg3NkY0LCAweDY5MEQsIDB4NkI5NiwgMHg2MjY3LCAweDUwM0MsIDB4NEY4NCwgMHg1NzQwLCAweDYzMDcsCisgICAgMHg2QjYyLCAweDhEQkUsIDB4NTNFQSwgMHg2NUU4LCAweDdFQjgsIDB4NUZENywgMHg2MzFBLCAweDYzQjcsIDB4ODFGMywKKyAgICAweDgxRjQsIDB4N0Y2RSwgMHg1RTFDLCAweDVDRDksIDB4NTIzNiwgMHg2NjdBLCAweDc5RTksIDB4N0ExQSwgMHg4RDI4LAorICAgIDB4NzA5OSwgMHg3NUQ0LCAweDZFREUsIDB4NkNCQiwgMHg3QTkyLCAweDRFMkQsIDB4NzZDNSwgMHg1RkUwLCAweDk0OUYsCisgICAgMHg4ODc3LCAweDdFQzgsIDB4NzlDRCwgMHg4MEJGLCAweDkxQ0QsIDB4NEVGMiwgMHg0RjE3LCAweDgyMUYsIDB4NTQ2OCwKKyAgICAweDVEREUsIDB4NkQzMiwgMHg4QkNDLCAweDdDQTUsIDB4OEY3NCwgMHg4MDk4LCAweDVFMUEsIDB4NTQ5MiwgMHg3NkIxLAorICAgIDB4NUI5OSwgMHg2NjNDLCAweDlBQTQsIDB4NzNFMCwgMHg2ODJBLCAweDg2REIsIDB4NjczMSwgMHg3MzJBLCAweDhCRjgsCisgICAgMHg4QkRCLCAweDkwMTAsIDB4N0FGOSwgMHg3MERCLCAweDcxNkUsIDB4NjJDNCwgMHg3N0E5LCAweDU2MzEsIDB4NEUzQiwKKyAgICAweDg0NTcsIDB4NjdGMSwgMHg1MkE5LCAweDg2QzAsIDB4OEQyRSwgMHg5NEY4LCAweDdCNTEsIDB4NEY0RiwgMHg2Q0U4LAorICAgIDB4Nzk1RCwgMHg5QTdCLCAweDYyOTMsIDB4NzIyQSwgMHg2MkZELCAweDRFMTMsIDB4NzgxNiwgMHg4RjZDLCAweDY0QjAsCisgICAgMHg4RDVBLCAweDdCQzYsIDB4Njg2OSwgMHg1RTg0LCAweDg4QzUsIDB4NTk4NiwgMHg2NDlFLCAweDU4RUUsIDB4NzJCNiwKKyAgICAweDY5MEUsIDB4OTUyNSwgMHg4RkZELCAweDhENTgsIDB4NTc2MCwgMHg3RjAwLCAweDhDMDYsIDB4NTFDNiwgMHg2MzQ5LAorICAgIDB4NjJEOSwgMHg1MzUzLCAweDY4NEMsIDB4NzQyMiwgMHg4MzAxLCAweDkxNEMsIDB4NTU0NCwgMHg3NzQwLCAweDcwN0MsCisgICAgMHg2RDRBLCAweDUxNzksIDB4NTRBOCwgMHg4RDQ0LCAweDU5RkYsIDB4NkVDQiwgMHg2REM0LCAweDVCNUMsIDB4N0QyQiwKKyAgICAweDRFRDQsIDB4N0M3RCwgMHg2RUQzLCAweDVCNTAsIDB4ODFFQSwgMHg2RTBELCAweDVCNTcsIDB4OUIwMywgMHg2OEQ1LAorICAgIDB4OEUyQSwgMHg1Qjk3LCAweDdFRkMsIDB4NjAzQiwgMHg3RUI1LCAweDkwQjksIDB4OEQ3MCwgMHg1OTRGLCAweDYzQ0QsCisgICAgMHg3OURGLCAweDhEQjMsIDB4NTM1MiwgMHg2NUNGLCAweDc5NTYsIDB4OEJDNSwgMHg5NjNCLCAweDdFQzQsIDB4OTRCQiwKKyAgICAweDdFODIsIDB4NTYzNCwgMHg5MTg5LCAweDY3MDAsIDB4N0Y2QSwgMHg1QzBBLCAweDkwNzUsIDB4NjYyOCwgMHg1REU2LAorICAgIDB4NEY1MCwgMHg2N0RFLCAweDUwNUEsIDB4NEY1QywgMHg1NzUwLCAweDVFQTcsIDB4NEU4RCwgMHg0RTBDLCAweDUxNDAsCisgICAgMHg0RTEwLCAweDVFRkYsIDB4NTM0NSwgMHg0RTE1LCAweDRFOTgsIDB4NEUxRSwgMHg5QjMyLCAweDVCNkMsIDB4NTY2OSwKKyAgICAweDRFMjgsIDB4NzlCQSwgMHg0RTNGLCAweDUzMTUsIDB4NEU0NywgMHg1OTJELCAweDcyM0IsIDB4NTM2RSwgMHg2QzEwLAorICAgIDB4NTZERiwgMHg4MEU0LCAweDk5OTcsIDB4NkJEMywgMHg3NzdFLCAweDlGMTcsIDB4NEUzNiwgMHg0RTlGLCAweDlGMTAsCisgICAgMHg0RTVDLCAweDRFNjksIDB4NEU5MywgMHg4Mjg4LCAweDVCNUIsIDB4NTU2QywgMHg1NjBGLCAweDRFQzQsIDB4NTM4RCwKKyAgICAweDUzOUQsIDB4NTNBMywgMHg1M0E1LCAweDUzQUUsIDB4OTc2NSwgMHg4RDVELCAweDUzMUEsIDB4NTNGNSwgMHg1MzI2LAorICAgIDB4NTMyRSwgMHg1MzNFLCAweDhENUMsIDB4NTM2NiwgMHg1MzYzLCAweDUyMDIsIDB4NTIwOCwgMHg1MjBFLCAweDUyMkQsCisgICAgMHg1MjMzLCAweDUyM0YsIDB4NTI0MCwgMHg1MjRDLCAweDUyNUUsIDB4NTI2MSwgMHg1MjVDLCAweDg0QUYsIDB4NTI3RCwKKyAgICAweDUyODIsIDB4NTI4MSwgMHg1MjkwLCAweDUyOTMsIDB4NTE4MiwgMHg3RjU0LCAweDRFQkIsIDB4NEVDMywgMHg0RUM5LAorICAgIDB4NEVDMiwgMHg0RUU4LCAweDRFRTEsIDB4NEVFQiwgMHg0RURFLCAweDRGMUIsIDB4NEVGMywgMHg0RjIyLCAweDRGNjQsCisgICAgMHg0RUY1LCAweDRGMjUsIDB4NEYyNywgMHg0RjA5LCAweDRGMkIsIDB4NEY1RSwgMHg0RjY3LCAweDY1MzgsIDB4NEY1QSwKKyAgICAweDRGNUQsIDB4NEY1RiwgMHg0RjU3LCAweDRGMzIsIDB4NEYzRCwgMHg0Rjc2LCAweDRGNzQsIDB4NEY5MSwgMHg0Rjg5LAorICAgIDB4NEY4MywgMHg0RjhGLCAweDRGN0UsIDB4NEY3QiwgMHg0RkFBLCAweDRGN0MsIDB4NEZBQywgMHg0Rjk0LCAweDRGRTYsCisgICAgMHg0RkU4LCAweDRGRUEsIDB4NEZDNSwgMHg0RkRBLCAweDRGRTMsIDB4NEZEQywgMHg0RkQxLCAweDRGREYsIDB4NEZGOCwKKyAgICAweDUwMjksIDB4NTA0QywgMHg0RkYzLCAweDUwMkMsIDB4NTAwRiwgMHg1MDJFLCAweDUwMkQsIDB4NEZGRSwgMHg1MDFDLAorICAgIDB4NTAwQywgMHg1MDI1LCAweDUwMjgsIDB4NTA3RSwgMHg1MDQzLCAweDUwNTUsIDB4NTA0OCwgMHg1MDRFLCAweDUwNkMsCisgICAgMHg1MDdCLCAweDUwQTUsIDB4NTBBNywgMHg1MEE5LCAweDUwQkEsIDB4NTBENiwgMHg1MTA2LCAweDUwRUQsIDB4NTBFQywKKyAgICAweDUwRTYsIDB4NTBFRSwgMHg1MTA3LCAweDUxMEIsIDB4NEVERCwgMHg2QzNELCAweDRGNTgsIDB4NEY2NSwgMHg0RkNFLAorICAgIDB4OUZBMCwgMHg2QzQ2LCAweDdDNzQsIDB4NTE2RSwgMHg1REZELCAweDlFQzksIDB4OTk5OCwgMHg1MTgxLCAweDU5MTQsCisgICAgMHg1MkY5LCAweDUzMEQsIDB4OEEwNywgMHg1MzEwLCAweDUxRUIsIDB4NTkxOSwgMHg1MTU1LCAweDRFQTAsIDB4NTE1NiwKKyAgICAweDRFQjMsIDB4ODg2RSwgMHg4OEE0LCAweDRFQjUsIDB4ODExNCwgMHg4OEQyLCAweDc5ODAsIDB4NUIzNCwgMHg4ODAzLAorICAgIDB4N0ZCOCwgMHg1MUFCLCAweDUxQjEsIDB4NTFCRCwgMHg1MUJDLCAweDUxQzcsIDB4NTE5NiwgMHg1MUEyLCAweDUxQTUsCisgICAgMHg4QkEwLCAweDhCQTYsIDB4OEJBNywgMHg4QkFBLCAweDhCQjQsIDB4OEJCNSwgMHg4QkI3LCAweDhCQzIsIDB4OEJDMywKKyAgICAweDhCQ0IsIDB4OEJDRiwgMHg4QkNFLCAweDhCRDIsIDB4OEJEMywgMHg4QkQ0LCAweDhCRDYsIDB4OEJEOCwgMHg4QkQ5LAorICAgIDB4OEJEQywgMHg4QkRGLCAweDhCRTAsIDB4OEJFNCwgMHg4QkU4LCAweDhCRTksIDB4OEJFRSwgMHg4QkYwLCAweDhCRjMsCisgICAgMHg4QkY2LCAweDhCRjksIDB4OEJGQywgMHg4QkZGLCAweDhDMDAsIDB4OEMwMiwgMHg4QzA0LCAweDhDMDcsIDB4OEMwQywKKyAgICAweDhDMEYsIDB4OEMxMSwgMHg4QzEyLCAweDhDMTQsIDB4OEMxNSwgMHg4QzE2LCAweDhDMTksIDB4OEMxQiwgMHg4QzE4LAorICAgIDB4OEMxRCwgMHg4QzFGLCAweDhDMjAsIDB4OEMyMSwgMHg4QzI1LCAweDhDMjcsIDB4OEMyQSwgMHg4QzJCLCAweDhDMkUsCisgICAgMHg4QzJGLCAweDhDMzIsIDB4OEMzMywgMHg4QzM1LCAweDhDMzYsIDB4NTM2OSwgMHg1MzdBLCAweDk2MUQsIDB4OTYyMiwKKyAgICAweDk2MjEsIDB4OTYzMSwgMHg5NjJBLCAweDk2M0QsIDB4OTYzQywgMHg5NjQyLCAweDk2NDksIDB4OTY1NCwgMHg5NjVGLAorICAgIDB4OTY2NywgMHg5NjZDLCAweDk2NzIsIDB4OTY3NCwgMHg5Njg4LCAweDk2OEQsIDB4OTY5NywgMHg5NkIwLCAweDkwOTcsCisgICAgMHg5MDlCLCAweDkwOUQsIDB4OTA5OSwgMHg5MEFDLCAweDkwQTEsIDB4OTBCNCwgMHg5MEIzLCAweDkwQjYsIDB4OTBCQSwKKyAgICAweDkwQjgsIDB4OTBCMCwgMHg5MENGLCAweDkwQzUsIDB4OTBCRSwgMHg5MEQwLCAweDkwQzQsIDB4OTBDNywgMHg5MEQzLAorICAgIDB4OTBFNiwgMHg5MEUyLCAweDkwREMsIDB4OTBENywgMHg5MERCLCAweDkwRUIsIDB4OTBFRiwgMHg5MEZFLCAweDkxMDQsCisgICAgMHg5MTIyLCAweDkxMUUsIDB4OTEyMywgMHg5MTMxLCAweDkxMkYsIDB4OTEzOSwgMHg5MTQzLCAweDkxNDYsIDB4NTIwRCwKKyAgICAweDU5NDIsIDB4NTJBMiwgMHg1MkFDLCAweDUyQUQsIDB4NTJCRSwgMHg1NEZGLCAweDUyRDAsIDB4NTJENiwgMHg1MkYwLAorICAgIDB4NTNERiwgMHg3MUVFLCAweDc3Q0QsIDB4NUVGNCwgMHg1MUY1LCAweDUxRkMsIDB4OUIyRiwgMHg1M0I2LCAweDVGMDEsCisgICAgMHg3NTVBLCAweDVERUYsIDB4NTc0QywgMHg1N0E5LCAweDU3QTEsIDB4NTg3RSwgMHg1OEJDLCAweDU4QzUsIDB4NThEMSwKKyAgICAweDU3MjksIDB4NTcyQywgMHg1NzJBLCAweDU3MzMsIDB4NTczOSwgMHg1NzJFLCAweDU3MkYsIDB4NTc1QywgMHg1NzNCLAorICAgIDB4NTc0MiwgMHg1NzY5LCAweDU3ODUsIDB4NTc2QiwgMHg1Nzg2LCAweDU3N0MsIDB4NTc3QiwgMHg1NzY4LCAweDU3NkQsCisgICAgMHg1Nzc2LCAweDU3NzMsIDB4NTdBRCwgMHg1N0E0LCAweDU3OEMsIDB4NTdCMiwgMHg1N0NGLCAweDU3QTcsIDB4NTdCNCwKKyAgICAweDU3OTMsIDB4NTdBMCwgMHg1N0Q1LCAweDU3RDgsIDB4NTdEQSwgMHg1N0Q5LCAweDU3RDIsIDB4NTdCOCwgMHg1N0Y0LAorICAgIDB4NTdFRiwgMHg1N0Y4LCAweDU3RTQsIDB4NTdERCwgMHg1ODBCLCAweDU4MEQsIDB4NTdGRCwgMHg1N0VELCAweDU4MDAsCisgICAgMHg1ODFFLCAweDU4MTksIDB4NTg0NCwgMHg1ODIwLCAweDU4NjUsIDB4NTg2QywgMHg1ODgxLCAweDU4ODksIDB4NTg5QSwKKyAgICAweDU4ODAsIDB4OTlBOCwgMHg5RjE5LCAweDYxRkYsIDB4ODI3OSwgMHg4MjdELCAweDgyN0YsIDB4ODI4RiwgMHg4MjhBLAorICAgIDB4ODJBOCwgMHg4Mjg0LCAweDgyOEUsIDB4ODI5MSwgMHg4Mjk3LCAweDgyOTksIDB4ODJBQiwgMHg4MkI4LCAweDgyQkUsCisgICAgMHg4MkIwLCAweDgyQzgsIDB4ODJDQSwgMHg4MkUzLCAweDgyOTgsIDB4ODJCNywgMHg4MkFFLCAweDgyQ0IsIDB4ODJDQywKKyAgICAweDgyQzEsIDB4ODJBOSwgMHg4MkI0LCAweDgyQTEsIDB4ODJBQSwgMHg4MjlGLCAweDgyQzQsIDB4ODJDRSwgMHg4MkE0LAorICAgIDB4ODJFMSwgMHg4MzA5LCAweDgyRjcsIDB4ODJFNCwgMHg4MzBGLCAweDgzMDcsIDB4ODJEQywgMHg4MkY0LCAweDgyRDIsCisgICAgMHg4MkQ4LCAweDgzMEMsIDB4ODJGQiwgMHg4MkQzLCAweDgzMTEsIDB4ODMxQSwgMHg4MzA2LCAweDgzMTQsIDB4ODMxNSwKKyAgICAweDgyRTAsIDB4ODJENSwgMHg4MzFDLCAweDgzNTEsIDB4ODM1QiwgMHg4MzVDLCAweDgzMDgsIDB4ODM5MiwgMHg4MzNDLAorICAgIDB4ODMzNCwgMHg4MzMxLCAweDgzOUIsIDB4ODM1RSwgMHg4MzJGLCAweDgzNEYsIDB4ODM0NywgMHg4MzQzLCAweDgzNUYsCisgICAgMHg4MzQwLCAweDgzMTcsIDB4ODM2MCwgMHg4MzJELCAweDgzM0EsIDB4ODMzMywgMHg4MzY2LCAweDgzNjUsIDB4ODM2OCwKKyAgICAweDgzMUIsIDB4ODM2OSwgMHg4MzZDLCAweDgzNkEsIDB4ODM2RCwgMHg4MzZFLCAweDgzQjAsIDB4ODM3OCwgMHg4M0IzLAorICAgIDB4ODNCNCwgMHg4M0EwLCAweDgzQUEsIDB4ODM5MywgMHg4MzlDLCAweDgzODUsIDB4ODM3QywgMHg4M0I2LCAweDgzQTksCisgICAgMHg4MzdELCAweDgzQjgsIDB4ODM3QiwgMHg4Mzk4LCAweDgzOUUsIDB4ODNBOCwgMHg4M0JBLCAweDgzQkMsIDB4ODNDMSwKKyAgICAweDg0MDEsIDB4ODNFNSwgMHg4M0Q4LCAweDU4MDcsIDB4ODQxOCwgMHg4NDBCLCAweDgzREQsIDB4ODNGRCwgMHg4M0Q2LAorICAgIDB4ODQxQywgMHg4NDM4LCAweDg0MTEsIDB4ODQwNiwgMHg4M0Q0LCAweDgzREYsIDB4ODQwRiwgMHg4NDAzLCAweDgzRjgsCisgICAgMHg4M0Y5LCAweDgzRUEsIDB4ODNDNSwgMHg4M0MwLCAweDg0MjYsIDB4ODNGMCwgMHg4M0UxLCAweDg0NUMsIDB4ODQ1MSwKKyAgICAweDg0NUEsIDB4ODQ1OSwgMHg4NDczLCAweDg0ODcsIDB4ODQ4OCwgMHg4NDdBLCAweDg0ODksIDB4ODQ3OCwgMHg4NDNDLAorICAgIDB4ODQ0NiwgMHg4NDY5LCAweDg0NzYsIDB4ODQ4QywgMHg4NDhFLCAweDg0MzEsIDB4ODQ2RCwgMHg4NEMxLCAweDg0Q0QsCisgICAgMHg4NEQwLCAweDg0RTYsIDB4ODRCRCwgMHg4NEQzLCAweDg0Q0EsIDB4ODRCRiwgMHg4NEJBLCAweDg0RTAsIDB4ODRBMSwKKyAgICAweDg0QjksIDB4ODRCNCwgMHg4NDk3LCAweDg0RTUsIDB4ODRFMywgMHg4NTBDLCAweDc1MEQsIDB4ODUzOCwgMHg4NEYwLAorICAgIDB4ODUzOSwgMHg4NTFGLCAweDg1M0EsIDB4ODU1NiwgMHg4NTNCLCAweDg0RkYsIDB4ODRGQywgMHg4NTU5LCAweDg1NDgsCisgICAgMHg4NTY4LCAweDg1NjQsIDB4ODU1RSwgMHg4NTdBLCAweDc3QTIsIDB4ODU0MywgMHg4NTcyLCAweDg1N0IsIDB4ODVBNCwKKyAgICAweDg1QTgsIDB4ODU4NywgMHg4NThGLCAweDg1NzksIDB4ODVBRSwgMHg4NTlDLCAweDg1ODUsIDB4ODVCOSwgMHg4NUI3LAorICAgIDB4ODVCMCwgMHg4NUQzLCAweDg1QzEsIDB4ODVEQywgMHg4NUZGLCAweDg2MjcsIDB4ODYwNSwgMHg4NjI5LCAweDg2MTYsCisgICAgMHg4NjNDLCAweDVFRkUsIDB4NUYwOCwgMHg1OTNDLCAweDU5NDEsIDB4ODAzNywgMHg1OTU1LCAweDU5NUEsIDB4NTk1OCwKKyAgICAweDUzMEYsIDB4NUMyMiwgMHg1QzI1LCAweDVDMkMsIDB4NUMzNCwgMHg2MjRDLCAweDYyNkEsIDB4NjI5RiwgMHg2MkJCLAorICAgIDB4NjJDQSwgMHg2MkRBLCAweDYyRDcsIDB4NjJFRSwgMHg2MzIyLCAweDYyRjYsIDB4NjMzOSwgMHg2MzRCLCAweDYzNDMsCisgICAgMHg2M0FELCAweDYzRjYsIDB4NjM3MSwgMHg2MzdBLCAweDYzOEUsIDB4NjNCNCwgMHg2MzZELCAweDYzQUMsIDB4NjM4QSwKKyAgICAweDYzNjksIDB4NjNBRSwgMHg2M0JDLCAweDYzRjIsIDB4NjNGOCwgMHg2M0UwLCAweDYzRkYsIDB4NjNDNCwgMHg2M0RFLAorICAgIDB4NjNDRSwgMHg2NDUyLCAweDYzQzYsIDB4NjNCRSwgMHg2NDQ1LCAweDY0NDEsIDB4NjQwQiwgMHg2NDFCLCAweDY0MjAsCisgICAgMHg2NDBDLCAweDY0MjYsIDB4NjQyMSwgMHg2NDVFLCAweDY0ODQsIDB4NjQ2RCwgMHg2NDk2LCAweDY0N0EsIDB4NjRCNywKKyAgICAweDY0QjgsIDB4NjQ5OSwgMHg2NEJBLCAweDY0QzAsIDB4NjREMCwgMHg2NEQ3LCAweDY0RTQsIDB4NjRFMiwgMHg2NTA5LAorICAgIDB4NjUyNSwgMHg2NTJFLCAweDVGMEIsIDB4NUZEMiwgMHg3NTE5LCAweDVGMTEsIDB4NTM1RiwgMHg1M0YxLCAweDUzRkQsCisgICAgMHg1M0U5LCAweDUzRTgsIDB4NTNGQiwgMHg1NDEyLCAweDU0MTYsIDB4NTQwNiwgMHg1NDRCLCAweDU0NTIsIDB4NTQ1MywKKyAgICAweDU0NTQsIDB4NTQ1NiwgMHg1NDQzLCAweDU0MjEsIDB4NTQ1NywgMHg1NDU5LCAweDU0MjMsIDB4NTQzMiwgMHg1NDgyLAorICAgIDB4NTQ5NCwgMHg1NDc3LCAweDU0NzEsIDB4NTQ2NCwgMHg1NDlBLCAweDU0OUIsIDB4NTQ4NCwgMHg1NDc2LCAweDU0NjYsCisgICAgMHg1NDlELCAweDU0RDAsIDB4NTRBRCwgMHg1NEMyLCAweDU0QjQsIDB4NTREMiwgMHg1NEE3LCAweDU0QTYsIDB4NTREMywKKyAgICAweDU0RDQsIDB4NTQ3MiwgMHg1NEEzLCAweDU0RDUsIDB4NTRCQiwgMHg1NEJGLCAweDU0Q0MsIDB4NTREOSwgMHg1NERBLAorICAgIDB4NTREQywgMHg1NEE5LCAweDU0QUEsIDB4NTRBNCwgMHg1NERELCAweDU0Q0YsIDB4NTRERSwgMHg1NTFCLCAweDU0RTcsCisgICAgMHg1NTIwLCAweDU0RkQsIDB4NTUxNCwgMHg1NEYzLCAweDU1MjIsIDB4NTUyMywgMHg1NTBGLCAweDU1MTEsIDB4NTUyNywKKyAgICAweDU1MkEsIDB4NTU2NywgMHg1NThGLCAweDU1QjUsIDB4NTU0OSwgMHg1NTZELCAweDU1NDEsIDB4NTU1NSwgMHg1NTNGLAorICAgIDB4NTU1MCwgMHg1NTNDLCAweDU1MzcsIDB4NTU1NiwgMHg1NTc1LCAweDU1NzYsIDB4NTU3NywgMHg1NTMzLCAweDU1MzAsCisgICAgMHg1NTVDLCAweDU1OEIsIDB4NTVEMiwgMHg1NTgzLCAweDU1QjEsIDB4NTVCOSwgMHg1NTg4LCAweDU1ODEsIDB4NTU5RiwKKyAgICAweDU1N0UsIDB4NTVENiwgMHg1NTkxLCAweDU1N0IsIDB4NTVERiwgMHg1NUJELCAweDU1QkUsIDB4NTU5NCwgMHg1NTk5LAorICAgIDB4NTVFQSwgMHg1NUY3LCAweDU1QzksIDB4NTYxRiwgMHg1NUQxLCAweDU1RUIsIDB4NTVFQywgMHg1NUQ0LCAweDU1RTYsCisgICAgMHg1NURELCAweDU1QzQsIDB4NTVFRiwgMHg1NUU1LCAweDU1RjIsIDB4NTVGMywgMHg1NUNDLCAweDU1Q0QsIDB4NTVFOCwKKyAgICAweDU1RjUsIDB4NTVFNCwgMHg4Rjk0LCAweDU2MUUsIDB4NTYwOCwgMHg1NjBDLCAweDU2MDEsIDB4NTYyNCwgMHg1NjIzLAorICAgIDB4NTVGRSwgMHg1NjAwLCAweDU2MjcsIDB4NTYyRCwgMHg1NjU4LCAweDU2MzksIDB4NTY1NywgMHg1NjJDLCAweDU2NEQsCisgICAgMHg1NjYyLCAweDU2NTksIDB4NTY1QywgMHg1NjRDLCAweDU2NTQsIDB4NTY4NiwgMHg1NjY0LCAweDU2NzEsIDB4NTY2QiwKKyAgICAweDU2N0IsIDB4NTY3QywgMHg1Njg1LCAweDU2OTMsIDB4NTZBRiwgMHg1NkQ0LCAweDU2RDcsIDB4NTZERCwgMHg1NkUxLAorICAgIDB4NTZGNSwgMHg1NkVCLCAweDU2RjksIDB4NTZGRiwgMHg1NzA0LCAweDU3MEEsIDB4NTcwOSwgMHg1NzFDLCAweDVFMEYsCisgICAgMHg1RTE5LCAweDVFMTQsIDB4NUUxMSwgMHg1RTMxLCAweDVFM0IsIDB4NUUzQywgMHg1RTM3LCAweDVFNDQsIDB4NUU1NCwKKyAgICAweDVFNUIsIDB4NUU1RSwgMHg1RTYxLCAweDVDOEMsIDB4NUM3QSwgMHg1QzhELCAweDVDOTAsIDB4NUM5NiwgMHg1Qzg4LAorICAgIDB4NUM5OCwgMHg1Qzk5LCAweDVDOTEsIDB4NUM5QSwgMHg1QzlDLCAweDVDQjUsIDB4NUNBMiwgMHg1Q0JELCAweDVDQUMsCisgICAgMHg1Q0FCLCAweDVDQjEsIDB4NUNBMywgMHg1Q0MxLCAweDVDQjcsIDB4NUNDNCwgMHg1Q0QyLCAweDVDRTQsIDB4NUNDQiwKKyAgICAweDVDRTUsIDB4NUQwMiwgMHg1RDAzLCAweDVEMjcsIDB4NUQyNiwgMHg1RDJFLCAweDVEMjQsIDB4NUQxRSwgMHg1RDA2LAorICAgIDB4NUQxQiwgMHg1RDU4LCAweDVEM0UsIDB4NUQzNCwgMHg1RDNELCAweDVENkMsIDB4NUQ1QiwgMHg1RDZGLCAweDVENUQsCisgICAgMHg1RDZCLCAweDVENEIsIDB4NUQ0QSwgMHg1RDY5LCAweDVENzQsIDB4NUQ4MiwgMHg1RDk5LCAweDVEOUQsIDB4OEM3MywKKyAgICAweDVEQjcsIDB4NURDNSwgMHg1RjczLCAweDVGNzcsIDB4NUY4MiwgMHg1Rjg3LCAweDVGODksIDB4NUY4QywgMHg1Rjk1LAorICAgIDB4NUY5OSwgMHg1RjlDLCAweDVGQTgsIDB4NUZBRCwgMHg1RkI1LCAweDVGQkMsIDB4ODg2MiwgMHg1RjYxLCAweDcyQUQsCisgICAgMHg3MkIwLCAweDcyQjQsIDB4NzJCNywgMHg3MkI4LCAweDcyQzMsIDB4NzJDMSwgMHg3MkNFLCAweDcyQ0QsIDB4NzJEMiwKKyAgICAweDcyRTgsIDB4NzJFRiwgMHg3MkU5LCAweDcyRjIsIDB4NzJGNCwgMHg3MkY3LCAweDczMDEsIDB4NzJGMywgMHg3MzAzLAorICAgIDB4NzJGQSwgMHg3MkZCLCAweDczMTcsIDB4NzMxMywgMHg3MzIxLCAweDczMEEsIDB4NzMxRSwgMHg3MzFELCAweDczMTUsCisgICAgMHg3MzIyLCAweDczMzksIDB4NzMyNSwgMHg3MzJDLCAweDczMzgsIDB4NzMzMSwgMHg3MzUwLCAweDczNEQsIDB4NzM1NywKKyAgICAweDczNjAsIDB4NzM2QywgMHg3MzZGLCAweDczN0UsIDB4ODIxQiwgMHg1OTI1LCAweDk4RTcsIDB4NTkyNCwgMHg1OTAyLAorICAgIDB4OTk2MywgMHg5OTY3LCAweDk5NjgsIDB4OTk2OSwgMHg5OTZBLCAweDk5NkIsIDB4OTk2QywgMHg5OTc0LCAweDk5NzcsCisgICAgMHg5OTdELCAweDk5ODAsIDB4OTk4NCwgMHg5OTg3LCAweDk5OEEsIDB4OTk4RCwgMHg5OTkwLCAweDk5OTEsIDB4OTk5MywKKyAgICAweDk5OTQsIDB4OTk5NSwgMHg1RTgwLCAweDVFOTEsIDB4NUU4QiwgMHg1RTk2LCAweDVFQTUsIDB4NUVBMCwgMHg1RUI5LAorICAgIDB4NUVCNSwgMHg1RUJFLCAweDVFQjMsIDB4OEQ1MywgMHg1RUQyLCAweDVFRDEsIDB4NUVEQiwgMHg1RUU4LCAweDVFRUEsCisgICAgMHg4MUJBLCAweDVGQzQsIDB4NUZDOSwgMHg1RkQ2LCAweDVGQ0YsIDB4NjAwMywgMHg1RkVFLCAweDYwMDQsIDB4NUZFMSwKKyAgICAweDVGRTQsIDB4NUZGRSwgMHg2MDA1LCAweDYwMDYsIDB4NUZFQSwgMHg1RkVELCAweDVGRjgsIDB4NjAxOSwgMHg2MDM1LAorICAgIDB4NjAyNiwgMHg2MDFCLCAweDYwMEYsIDB4NjAwRCwgMHg2MDI5LCAweDYwMkIsIDB4NjAwQSwgMHg2MDNGLCAweDYwMjEsCisgICAgMHg2MDc4LCAweDYwNzksIDB4NjA3QiwgMHg2MDdBLCAweDYwNDIsIDB4NjA2QSwgMHg2MDdELCAweDYwOTYsIDB4NjA5QSwKKyAgICAweDYwQUQsIDB4NjA5RCwgMHg2MDgzLCAweDYwOTIsIDB4NjA4QywgMHg2MDlCLCAweDYwRUMsIDB4NjBCQiwgMHg2MEIxLAorICAgIDB4NjBERCwgMHg2MEQ4LCAweDYwQzYsIDB4NjBEQSwgMHg2MEI0LCAweDYxMjAsIDB4NjEyNiwgMHg2MTE1LCAweDYxMjMsCisgICAgMHg2MEY0LCAweDYxMDAsIDB4NjEwRSwgMHg2MTJCLCAweDYxNEEsIDB4NjE3NSwgMHg2MUFDLCAweDYxOTQsIDB4NjFBNywKKyAgICAweDYxQjcsIDB4NjFENCwgMHg2MUY1LCAweDVGREQsIDB4OTZCMywgMHg5NUU5LCAweDk1RUIsIDB4OTVGMSwgMHg5NUYzLAorICAgIDB4OTVGNSwgMHg5NUY2LCAweDk1RkMsIDB4OTVGRSwgMHg5NjAzLCAweDk2MDQsIDB4OTYwNiwgMHg5NjA4LCAweDk2MEEsCisgICAgMHg5NjBCLCAweDk2MEMsIDB4OTYwRCwgMHg5NjBGLCAweDk2MTIsIDB4OTYxNSwgMHg5NjE2LCAweDk2MTcsIDB4OTYxOSwKKyAgICAweDk2MUEsIDB4NEUyQywgMHg3MjNGLCAweDYyMTUsIDB4NkMzNSwgMHg2QzU0LCAweDZDNUMsIDB4NkM0QSwgMHg2Q0EzLAorICAgIDB4NkM4NSwgMHg2QzkwLCAweDZDOTQsIDB4NkM4QywgMHg2QzY4LCAweDZDNjksIDB4NkM3NCwgMHg2Qzc2LCAweDZDODYsCisgICAgMHg2Q0E5LCAweDZDRDAsIDB4NkNENCwgMHg2Q0FELCAweDZDRjcsIDB4NkNGOCwgMHg2Q0YxLCAweDZDRDcsIDB4NkNCMiwKKyAgICAweDZDRTAsIDB4NkNENiwgMHg2Q0ZBLCAweDZDRUIsIDB4NkNFRSwgMHg2Q0IxLCAweDZDRDMsIDB4NkNFRiwgMHg2Q0ZFLAorICAgIDB4NkQzOSwgMHg2RDI3LCAweDZEMEMsIDB4NkQ0MywgMHg2RDQ4LCAweDZEMDcsIDB4NkQwNCwgMHg2RDE5LCAweDZEMEUsCisgICAgMHg2RDJCLCAweDZENEQsIDB4NkQyRSwgMHg2RDM1LCAweDZEMUEsIDB4NkQ0RiwgMHg2RDUyLCAweDZENTQsIDB4NkQzMywKKyAgICAweDZEOTEsIDB4NkQ2RiwgMHg2RDlFLCAweDZEQTAsIDB4NkQ1RSwgMHg2RDkzLCAweDZEOTQsIDB4NkQ1QywgMHg2RDYwLAorICAgIDB4NkQ3QywgMHg2RDYzLCAweDZFMUEsIDB4NkRDNywgMHg2REM1LCAweDZEREUsIDB4NkUwRSwgMHg2REJGLCAweDZERTAsCisgICAgMHg2RTExLCAweDZERTYsIDB4NkRERCwgMHg2REQ5LCAweDZFMTYsIDB4NkRBQiwgMHg2RTBDLCAweDZEQUUsIDB4NkUyQiwKKyAgICAweDZFNkUsIDB4NkU0RSwgMHg2RTZCLCAweDZFQjIsIDB4NkU1RiwgMHg2RTg2LCAweDZFNTMsIDB4NkU1NCwgMHg2RTMyLAorICAgIDB4NkUyNSwgMHg2RTQ0LCAweDZFREYsIDB4NkVCMSwgMHg2RTk4LCAweDZFRTAsIDB4NkYyRCwgMHg2RUUyLCAweDZFQTUsCisgICAgMHg2RUE3LCAweDZFQkQsIDB4NkVCQiwgMHg2RUI3LCAweDZFRDcsIDB4NkVCNCwgMHg2RUNGLCAweDZFOEYsIDB4NkVDMiwKKyAgICAweDZFOUYsIDB4NkY2MiwgMHg2RjQ2LCAweDZGNDcsIDB4NkYyNCwgMHg2RjE1LCAweDZFRjksIDB4NkYyRiwgMHg2RjM2LAorICAgIDB4NkY0QiwgMHg2Rjc0LCAweDZGMkEsIDB4NkYwOSwgMHg2RjI5LCAweDZGODksIDB4NkY4RCwgMHg2RjhDLCAweDZGNzgsCisgICAgMHg2RjcyLCAweDZGN0MsIDB4NkY3QSwgMHg2RkQxLCAweDZGQzksIDB4NkZBNywgMHg2RkI5LCAweDZGQjYsIDB4NkZDMiwKKyAgICAweDZGRTEsIDB4NkZFRSwgMHg2RkRFLCAweDZGRTAsIDB4NkZFRiwgMHg3MDFBLCAweDcwMjMsIDB4NzAxQiwgMHg3MDM5LAorICAgIDB4NzAzNSwgMHg3MDRGLCAweDcwNUUsIDB4NUI4MCwgMHg1Qjg0LCAweDVCOTUsIDB4NUI5MywgMHg1QkE1LCAweDVCQjgsCisgICAgMHg3NTJGLCAweDlBOUUsIDB4NjQzNCwgMHg1QkU0LCAweDVCRUUsIDB4ODkzMCwgMHg1QkYwLCAweDhFNDcsIDB4OEIwNywKKyAgICAweDhGQjYsIDB4OEZEMywgMHg4RkQ1LCAweDhGRTUsIDB4OEZFRSwgMHg4RkU0LCAweDhGRTksIDB4OEZFNiwgMHg4RkYzLAorICAgIDB4OEZFOCwgMHg5MDA1LCAweDkwMDQsIDB4OTAwQiwgMHg5MDI2LCAweDkwMTEsIDB4OTAwRCwgMHg5MDE2LCAweDkwMjEsCisgICAgMHg5MDM1LCAweDkwMzYsIDB4OTAyRCwgMHg5MDJGLCAweDkwNDQsIDB4OTA1MSwgMHg5MDUyLCAweDkwNTAsIDB4OTA2OCwKKyAgICAweDkwNTgsIDB4OTA2MiwgMHg5MDVCLCAweDY2QjksIDB4OTA3NCwgMHg5MDdELCAweDkwODIsIDB4OTA4OCwgMHg5MDgzLAorICAgIDB4OTA4QiwgMHg1RjUwLCAweDVGNTcsIDB4NUY1NiwgMHg1RjU4LCAweDVDM0IsIDB4NTRBQiwgMHg1QzUwLCAweDVDNTksCisgICAgMHg1QjcxLCAweDVDNjMsIDB4NUM2NiwgMHg3RkJDLCAweDVGMkEsIDB4NUYyOSwgMHg1RjJELCAweDgyNzQsIDB4NUYzQywKKyAgICAweDlCM0IsIDB4NUM2RSwgMHg1OTgxLCAweDU5ODMsIDB4NTk4RCwgMHg1OUE5LCAweDU5QUEsIDB4NTlBMywgMHg1OTk3LAorICAgIDB4NTlDQSwgMHg1OUFCLCAweDU5OUUsIDB4NTlBNCwgMHg1OUQyLCAweDU5QjIsIDB4NTlBRiwgMHg1OUQ3LCAweDU5QkUsCisgICAgMHg1QTA1LCAweDVBMDYsIDB4NTlERCwgMHg1QTA4LCAweDU5RTMsIDB4NTlEOCwgMHg1OUY5LCAweDVBMEMsIDB4NUEwOSwKKyAgICAweDVBMzIsIDB4NUEzNCwgMHg1QTExLCAweDVBMjMsIDB4NUExMywgMHg1QTQwLCAweDVBNjcsIDB4NUE0QSwgMHg1QTU1LAorICAgIDB4NUEzQywgMHg1QTYyLCAweDVBNzUsIDB4ODBFQywgMHg1QUFBLCAweDVBOUIsIDB4NUE3NywgMHg1QTdBLCAweDVBQkUsCisgICAgMHg1QUVCLCAweDVBQjIsIDB4NUFEMiwgMHg1QUQ0LCAweDVBQjgsIDB4NUFFMCwgMHg1QUUzLCAweDVBRjEsIDB4NUFENiwKKyAgICAweDVBRTYsIDB4NUFEOCwgMHg1QURDLCAweDVCMDksIDB4NUIxNywgMHg1QjE2LCAweDVCMzIsIDB4NUIzNywgMHg1QjQwLAorICAgIDB4NUMxNSwgMHg1QzFDLCAweDVCNUEsIDB4NUI2NSwgMHg1QjczLCAweDVCNTEsIDB4NUI1MywgMHg1QjYyLCAweDlBNzUsCisgICAgMHg5QTc3LCAweDlBNzgsIDB4OUE3QSwgMHg5QTdGLCAweDlBN0QsIDB4OUE4MCwgMHg5QTgxLCAweDlBODUsIDB4OUE4OCwKKyAgICAweDlBOEEsIDB4OUE5MCwgMHg5QTkyLCAweDlBOTMsIDB4OUE5NiwgMHg5QTk4LCAweDlBOUIsIDB4OUE5QywgMHg5QTlELAorICAgIDB4OUE5RiwgMHg5QUEwLCAweDlBQTIsIDB4OUFBMywgMHg5QUE1LCAweDlBQTcsIDB4N0U5RiwgMHg3RUExLCAweDdFQTMsCisgICAgMHg3RUE1LCAweDdFQTgsIDB4N0VBOSwgMHg3RUFELCAweDdFQjAsIDB4N0VCRSwgMHg3RUMwLCAweDdFQzEsIDB4N0VDMiwKKyAgICAweDdFQzksIDB4N0VDQiwgMHg3RUNDLCAweDdFRDAsIDB4N0VENCwgMHg3RUQ3LCAweDdFREIsIDB4N0VFMCwgMHg3RUUxLAorICAgIDB4N0VFOCwgMHg3RUVCLCAweDdFRUUsIDB4N0VFRiwgMHg3RUYxLCAweDdFRjIsIDB4N0YwRCwgMHg3RUY2LCAweDdFRkEsCisgICAgMHg3RUZCLCAweDdFRkUsIDB4N0YwMSwgMHg3RjAyLCAweDdGMDMsIDB4N0YwNywgMHg3RjA4LCAweDdGMEIsIDB4N0YwQywKKyAgICAweDdGMEYsIDB4N0YxMSwgMHg3RjEyLCAweDdGMTcsIDB4N0YxOSwgMHg3RjFDLCAweDdGMUIsIDB4N0YxRiwgMHg3RjIxLAorICAgIDB4N0YyMiwgMHg3RjIzLCAweDdGMjQsIDB4N0YyNSwgMHg3RjI2LCAweDdGMjcsIDB4N0YyQSwgMHg3RjJCLCAweDdGMkMsCisgICAgMHg3RjJELCAweDdGMkYsIDB4N0YzMCwgMHg3RjMxLCAweDdGMzIsIDB4N0YzMywgMHg3RjM1LCAweDVFN0EsIDB4NzU3RiwKKyAgICAweDVEREIsIDB4NzUzRSwgMHg5MDk1LCAweDczOEUsIDB4NzM5MSwgMHg3M0FFLCAweDczQTIsIDB4NzM5RiwgMHg3M0NGLAorICAgIDB4NzNDMiwgMHg3M0QxLCAweDczQjcsIDB4NzNCMywgMHg3M0MwLCAweDczQzksIDB4NzNDOCwgMHg3M0U1LCAweDczRDksCisgICAgMHg5ODdDLCAweDc0MEEsIDB4NzNFOSwgMHg3M0U3LCAweDczREUsIDB4NzNCQSwgMHg3M0YyLCAweDc0MEYsIDB4NzQyQSwKKyAgICAweDc0NUIsIDB4NzQyNiwgMHg3NDI1LCAweDc0MjgsIDB4NzQzMCwgMHg3NDJFLCAweDc0MkMsIDB4NzQxQiwgMHg3NDFBLAorICAgIDB4NzQ0MSwgMHg3NDVDLCAweDc0NTcsIDB4NzQ1NSwgMHg3NDU5LCAweDc0NzcsIDB4NzQ2RCwgMHg3NDdFLCAweDc0OUMsCisgICAgMHg3NDhFLCAweDc0ODAsIDB4NzQ4MSwgMHg3NDg3LCAweDc0OEIsIDB4NzQ5RSwgMHg3NEE4LCAweDc0QTksIDB4NzQ5MCwKKyAgICAweDc0QTcsIDB4NzREMiwgMHg3NEJBLCAweDk3RUEsIDB4OTdFQiwgMHg5N0VDLCAweDY3NEMsIDB4Njc1MywgMHg2NzVFLAorICAgIDB4Njc0OCwgMHg2NzY5LCAweDY3QTUsIDB4Njc4NywgMHg2NzZBLCAweDY3NzMsIDB4Njc5OCwgMHg2N0E3LCAweDY3NzUsCisgICAgMHg2N0E4LCAweDY3OUUsIDB4NjdBRCwgMHg2NzhCLCAweDY3NzcsIDB4Njc3QywgMHg2N0YwLCAweDY4MDksIDB4NjdEOCwKKyAgICAweDY4MEEsIDB4NjdFOSwgMHg2N0IwLCAweDY4MEMsIDB4NjdEOSwgMHg2N0I1LCAweDY3REEsIDB4NjdCMywgMHg2N0RELAorICAgIDB4NjgwMCwgMHg2N0MzLCAweDY3QjgsIDB4NjdFMiwgMHg2ODBFLCAweDY3QzEsIDB4NjdGRCwgMHg2ODMyLCAweDY4MzMsCisgICAgMHg2ODYwLCAweDY4NjEsIDB4Njg0RSwgMHg2ODYyLCAweDY4NDQsIDB4Njg2NCwgMHg2ODgzLCAweDY4MUQsIDB4Njg1NSwKKyAgICAweDY4NjYsIDB4Njg0MSwgMHg2ODY3LCAweDY4NDAsIDB4NjgzRSwgMHg2ODRBLCAweDY4NDksIDB4NjgyOSwgMHg2OEI1LAorICAgIDB4Njg4RiwgMHg2ODc0LCAweDY4NzcsIDB4Njg5MywgMHg2ODZCLCAweDY4QzIsIDB4Njk2RSwgMHg2OEZDLCAweDY5MUYsCisgICAgMHg2OTIwLCAweDY4RjksIDB4NjkyNCwgMHg2OEYwLCAweDY5MEIsIDB4NjkwMSwgMHg2OTU3LCAweDY4RTMsIDB4NjkxMCwKKyAgICAweDY5NzEsIDB4NjkzOSwgMHg2OTYwLCAweDY5NDIsIDB4Njk1RCwgMHg2OTg0LCAweDY5NkIsIDB4Njk4MCwgMHg2OTk4LAorICAgIDB4Njk3OCwgMHg2OTM0LCAweDY5Q0MsIDB4Njk4NywgMHg2OTg4LCAweDY5Q0UsIDB4Njk4OSwgMHg2OTY2LCAweDY5NjMsCisgICAgMHg2OTc5LCAweDY5OUIsIDB4NjlBNywgMHg2OUJCLCAweDY5QUIsIDB4NjlBRCwgMHg2OUQ0LCAweDY5QjEsIDB4NjlDMSwKKyAgICAweDY5Q0EsIDB4NjlERiwgMHg2OTk1LCAweDY5RTAsIDB4Njk4RCwgMHg2OUZGLCAweDZBMkYsIDB4NjlFRCwgMHg2QTE3LAorICAgIDB4NkExOCwgMHg2QTY1LCAweDY5RjIsIDB4NkE0NCwgMHg2QTNFLCAweDZBQTAsIDB4NkE1MCwgMHg2QTVCLCAweDZBMzUsCisgICAgMHg2QThFLCAweDZBNzksIDB4NkEzRCwgMHg2QTI4LCAweDZBNTgsIDB4NkE3QywgMHg2QTkxLCAweDZBOTAsIDB4NkFBOSwKKyAgICAweDZBOTcsIDB4NkFBQiwgMHg3MzM3LCAweDczNTIsIDB4NkI4MSwgMHg2QjgyLCAweDZCODcsIDB4NkI4NCwgMHg2QjkyLAorICAgIDB4NkI5MywgMHg2QjhELCAweDZCOUEsIDB4NkI5QiwgMHg2QkExLCAweDZCQUEsIDB4OEY2QiwgMHg4RjZELCAweDhGNzEsCisgICAgMHg4RjcyLCAweDhGNzMsIDB4OEY3NSwgMHg4Rjc2LCAweDhGNzgsIDB4OEY3NywgMHg4Rjc5LCAweDhGN0EsIDB4OEY3QywKKyAgICAweDhGN0UsIDB4OEY4MSwgMHg4RjgyLCAweDhGODQsIDB4OEY4NywgMHg4RjhCLCAweDhGOEQsIDB4OEY4RSwgMHg4RjhGLAorICAgIDB4OEY5OCwgMHg4RjlBLCAweDhFQ0UsIDB4NjIwQiwgMHg2MjE3LCAweDYyMUIsIDB4NjIxRiwgMHg2MjIyLCAweDYyMjEsCisgICAgMHg2MjI1LCAweDYyMjQsIDB4NjIyQywgMHg4MUU3LCAweDc0RUYsIDB4NzRGNCwgMHg3NEZGLCAweDc1MEYsIDB4NzUxMSwKKyAgICAweDc1MTMsIDB4NjUzNCwgMHg2NUVFLCAweDY1RUYsIDB4NjVGMCwgMHg2NjBBLCAweDY2MTksIDB4Njc3MiwgMHg2NjAzLAorICAgIDB4NjYxNSwgMHg2NjAwLCAweDcwODUsIDB4NjZGNywgMHg2NjFELCAweDY2MzQsIDB4NjYzMSwgMHg2NjM2LCAweDY2MzUsCisgICAgMHg4MDA2LCAweDY2NUYsIDB4NjY1NCwgMHg2NjQxLCAweDY2NEYsIDB4NjY1NiwgMHg2NjYxLCAweDY2NTcsIDB4NjY3NywKKyAgICAweDY2ODQsIDB4NjY4QywgMHg2NkE3LCAweDY2OUQsIDB4NjZCRSwgMHg2NkRCLCAweDY2REMsIDB4NjZFNiwgMHg2NkU5LAorICAgIDB4OEQzMiwgMHg4RDMzLCAweDhEMzYsIDB4OEQzQiwgMHg4RDNELCAweDhENDAsIDB4OEQ0NSwgMHg4RDQ2LCAweDhENDgsCisgICAgMHg4RDQ5LCAweDhENDcsIDB4OEQ0RCwgMHg4RDU1LCAweDhENTksIDB4ODlDNywgMHg4OUNBLCAweDg5Q0IsIDB4ODlDQywKKyAgICAweDg5Q0UsIDB4ODlDRiwgMHg4OUQwLCAweDg5RDEsIDB4NzI2RSwgMHg3MjlGLCAweDcyNUQsIDB4NzI2NiwgMHg3MjZGLAorICAgIDB4NzI3RSwgMHg3MjdGLCAweDcyODQsIDB4NzI4QiwgMHg3MjhELCAweDcyOEYsIDB4NzI5MiwgMHg2MzA4LCAweDYzMzIsCisgICAgMHg2M0IwLCAweDY0M0YsIDB4NjREOCwgMHg4MDA0LCAweDZCRUEsIDB4NkJGMywgMHg2QkZELCAweDZCRjUsIDB4NkJGOSwKKyAgICAweDZDMDUsIDB4NkMwNywgMHg2QzA2LCAweDZDMEQsIDB4NkMxNSwgMHg2QzE4LCAweDZDMTksIDB4NkMxQSwgMHg2QzIxLAorICAgIDB4NkMyOSwgMHg2QzI0LCAweDZDMkEsIDB4NkMzMiwgMHg2NTM1LCAweDY1NTUsIDB4NjU2QiwgMHg3MjRELCAweDcyNTIsCisgICAgMHg3MjU2LCAweDcyMzAsIDB4ODY2MiwgMHg1MjE2LCAweDgwOUYsIDB4ODA5QywgMHg4MDkzLCAweDgwQkMsIDB4NjcwQSwKKyAgICAweDgwQkQsIDB4ODBCMSwgMHg4MEFCLCAweDgwQUQsIDB4ODBCNCwgMHg4MEI3LCAweDgwRTcsIDB4ODBFOCwgMHg4MEU5LAorICAgIDB4ODBFQSwgMHg4MERCLCAweDgwQzIsIDB4ODBDNCwgMHg4MEQ5LCAweDgwQ0QsIDB4ODBENywgMHg2NzEwLCAweDgwREQsCisgICAgMHg4MEVCLCAweDgwRjEsIDB4ODBGNCwgMHg4MEVELCAweDgxMEQsIDB4ODEwRSwgMHg4MEYyLCAweDgwRkMsIDB4NjcxNSwKKyAgICAweDgxMTIsIDB4OEM1QSwgMHg4MTM2LCAweDgxMUUsIDB4ODEyQywgMHg4MTE4LCAweDgxMzIsIDB4ODE0OCwgMHg4MTRDLAorICAgIDB4ODE1MywgMHg4MTc0LCAweDgxNTksIDB4ODE1QSwgMHg4MTcxLCAweDgxNjAsIDB4ODE2OSwgMHg4MTdDLCAweDgxN0QsCisgICAgMHg4MTZELCAweDgxNjcsIDB4NTg0RCwgMHg1QUI1LCAweDgxODgsIDB4ODE4MiwgMHg4MTkxLCAweDZFRDUsIDB4ODFBMywKKyAgICAweDgxQUEsIDB4ODFDQywgMHg2NzI2LCAweDgxQ0EsIDB4ODFCQiwgMHg4MUMxLCAweDgxQTYsIDB4NkIyNCwgMHg2QjM3LAorICAgIDB4NkIzOSwgMHg2QjQzLCAweDZCNDYsIDB4NkI1OSwgMHg5OEQxLCAweDk4RDIsIDB4OThEMywgMHg5OEQ1LCAweDk4RDksCisgICAgMHg5OERBLCAweDZCQjMsIDB4NUY0MCwgMHg2QkMyLCAweDg5RjMsIDB4NjU5MCwgMHg5RjUxLCAweDY1OTMsIDB4NjVCQywKKyAgICAweDY1QzYsIDB4NjVDNCwgMHg2NUMzLCAweDY1Q0MsIDB4NjVDRSwgMHg2NUQyLCAweDY1RDYsIDB4NzA4MCwgMHg3MDlDLAorICAgIDB4NzA5NiwgMHg3MDlELCAweDcwQkIsIDB4NzBDMCwgMHg3MEI3LCAweDcwQUIsIDB4NzBCMSwgMHg3MEU4LCAweDcwQ0EsCisgICAgMHg3MTEwLCAweDcxMTMsIDB4NzExNiwgMHg3MTJGLCAweDcxMzEsIDB4NzE3MywgMHg3MTVDLCAweDcxNjgsIDB4NzE0NSwKKyAgICAweDcxNzIsIDB4NzE0QSwgMHg3MTc4LCAweDcxN0EsIDB4NzE5OCwgMHg3MUIzLCAweDcxQjUsIDB4NzFBOCwgMHg3MUEwLAorICAgIDB4NzFFMCwgMHg3MUQ0LCAweDcxRTcsIDB4NzFGOSwgMHg3MjFELCAweDcyMjgsIDB4NzA2QywgMHg3MTE4LCAweDcxNjYsCisgICAgMHg3MUI5LCAweDYyM0UsIDB4NjIzRCwgMHg2MjQzLCAweDYyNDgsIDB4NjI0OSwgMHg3OTNCLCAweDc5NDAsIDB4Nzk0NiwKKyAgICAweDc5NDksIDB4Nzk1QiwgMHg3OTVDLCAweDc5NTMsIDB4Nzk1QSwgMHg3OTYyLCAweDc5NTcsIDB4Nzk2MCwgMHg3OTZGLAorICAgIDB4Nzk2NywgMHg3OTdBLCAweDc5ODUsIDB4Nzk4QSwgMHg3OTlBLCAweDc5QTcsIDB4NzlCMywgMHg1RkQxLCAweDVGRDAsCisgICAgMHg2MDNDLCAweDYwNUQsIDB4NjA1QSwgMHg2MDY3LCAweDYwNDEsIDB4NjA1OSwgMHg2MDYzLCAweDYwQUIsIDB4NjEwNiwKKyAgICAweDYxMEQsIDB4NjE1RCwgMHg2MUE5LCAweDYxOUQsIDB4NjFDQiwgMHg2MUQxLCAweDYyMDYsIDB4ODA4MCwgMHg4MDdGLAorICAgIDB4NkM5MywgMHg2Q0Y2LCAweDZERkMsIDB4NzdGNiwgMHg3N0Y4LCAweDc4MDAsIDB4NzgwOSwgMHg3ODE3LCAweDc4MTgsCisgICAgMHg3ODExLCAweDY1QUIsIDB4NzgyRCwgMHg3ODFDLCAweDc4MUQsIDB4NzgzOSwgMHg3ODNBLCAweDc4M0IsIDB4NzgxRiwKKyAgICAweDc4M0MsIDB4NzgyNSwgMHg3ODJDLCAweDc4MjMsIDB4NzgyOSwgMHg3ODRFLCAweDc4NkQsIDB4Nzg1NiwgMHg3ODU3LAorICAgIDB4NzgyNiwgMHg3ODUwLCAweDc4NDcsIDB4Nzg0QywgMHg3ODZBLCAweDc4OUIsIDB4Nzg5MywgMHg3ODlBLCAweDc4ODcsCisgICAgMHg3ODlDLCAweDc4QTEsIDB4NzhBMywgMHg3OEIyLCAweDc4QjksIDB4NzhBNSwgMHg3OEQ0LCAweDc4RDksIDB4NzhDOSwKKyAgICAweDc4RUMsIDB4NzhGMiwgMHg3OTA1LCAweDc4RjQsIDB4NzkxMywgMHg3OTI0LCAweDc5MUUsIDB4NzkzNCwgMHg5RjlCLAorICAgIDB4OUVGOSwgMHg5RUZCLCAweDlFRkMsIDB4NzZGMSwgMHg3NzA0LCAweDc3MEQsIDB4NzZGOSwgMHg3NzA3LCAweDc3MDgsCisgICAgMHg3NzFBLCAweDc3MjIsIDB4NzcxOSwgMHg3NzJELCAweDc3MjYsIDB4NzczNSwgMHg3NzM4LCAweDc3NTAsIDB4Nzc1MSwKKyAgICAweDc3NDcsIDB4Nzc0MywgMHg3NzVBLCAweDc3NjgsIDB4Nzc2MiwgMHg3NzY1LCAweDc3N0YsIDB4Nzc4RCwgMHg3NzdELAorICAgIDB4Nzc4MCwgMHg3NzhDLCAweDc3OTEsIDB4Nzc5RiwgMHg3N0EwLCAweDc3QjAsIDB4NzdCNSwgMHg3N0JELCAweDc1M0EsCisgICAgMHg3NTQwLCAweDc1NEUsIDB4NzU0QiwgMHg3NTQ4LCAweDc1NUIsIDB4NzU3MiwgMHg3NTc5LCAweDc1ODMsIDB4N0Y1OCwKKyAgICAweDdGNjEsIDB4N0Y1RiwgMHg4QTQ4LCAweDdGNjgsIDB4N0Y3NCwgMHg3RjcxLCAweDdGNzksIDB4N0Y4MSwgMHg3RjdFLAorICAgIDB4NzZDRCwgMHg3NkU1LCAweDg4MzIsIDB4OTQ4NSwgMHg5NDg2LCAweDk0ODcsIDB4OTQ4QiwgMHg5NDhBLCAweDk0OEMsCisgICAgMHg5NDhELCAweDk0OEYsIDB4OTQ5MCwgMHg5NDk0LCAweDk0OTcsIDB4OTQ5NSwgMHg5NDlBLCAweDk0OUIsIDB4OTQ5QywKKyAgICAweDk0QTMsIDB4OTRBNCwgMHg5NEFCLCAweDk0QUEsIDB4OTRBRCwgMHg5NEFDLCAweDk0QUYsIDB4OTRCMCwgMHg5NEIyLAorICAgIDB4OTRCNCwgMHg5NEI2LCAweDk0QjcsIDB4OTRCOCwgMHg5NEI5LCAweDk0QkEsIDB4OTRCQywgMHg5NEJELCAweDk0QkYsCisgICAgMHg5NEM0LCAweDk0QzgsIDB4OTRDOSwgMHg5NENBLCAweDk0Q0IsIDB4OTRDQywgMHg5NENELCAweDk0Q0UsIDB4OTREMCwKKyAgICAweDk0RDEsIDB4OTREMiwgMHg5NEQ1LCAweDk0RDYsIDB4OTRENywgMHg5NEQ5LCAweDk0RDgsIDB4OTREQiwgMHg5NERFLAorICAgIDB4OTRERiwgMHg5NEUwLCAweDk0RTIsIDB4OTRFNCwgMHg5NEU1LCAweDk0RTcsIDB4OTRFOCwgMHg5NEVBLCAweDk0RTksCisgICAgMHg5NEVCLCAweDk0RUUsIDB4OTRFRiwgMHg5NEYzLCAweDk0RjQsIDB4OTRGNSwgMHg5NEY3LCAweDk0RjksIDB4OTRGQywKKyAgICAweDk0RkQsIDB4OTRGRiwgMHg5NTAzLCAweDk1MDIsIDB4OTUwNiwgMHg5NTA3LCAweDk1MDksIDB4OTUwQSwgMHg5NTBELAorICAgIDB4OTUwRSwgMHg5NTBGLCAweDk1MTIsIDB4OTUxMywgMHg5NTE0LCAweDk1MTUsIDB4OTUxNiwgMHg5NTE4LCAweDk1MUIsCisgICAgMHg5NTFELCAweDk1MUUsIDB4OTUxRiwgMHg5NTIyLCAweDk1MkEsIDB4OTUyQiwgMHg5NTI5LCAweDk1MkMsIDB4OTUzMSwKKyAgICAweDk1MzIsIDB4OTUzNCwgMHg5NTM2LCAweDk1MzcsIDB4OTUzOCwgMHg5NTNDLCAweDk1M0UsIDB4OTUzRiwgMHg5NTQyLAorICAgIDB4OTUzNSwgMHg5NTQ0LCAweDk1NDUsIDB4OTU0NiwgMHg5NTQ5LCAweDk1NEMsIDB4OTU0RSwgMHg5NTRGLCAweDk1NTIsCisgICAgMHg5NTUzLCAweDk1NTQsIDB4OTU1NiwgMHg5NTU3LCAweDk1NTgsIDB4OTU1OSwgMHg5NTVCLCAweDk1NUUsIDB4OTU1RiwKKyAgICAweDk1NUQsIDB4OTU2MSwgMHg5NTYyLCAweDk1NjQsIDB4OTU2NSwgMHg5NTY2LCAweDk1NjcsIDB4OTU2OCwgMHg5NTY5LAorICAgIDB4OTU2QSwgMHg5NTZCLCAweDk1NkMsIDB4OTU2RiwgMHg5NTcxLCAweDk1NzIsIDB4OTU3MywgMHg5NTNBLCAweDc3RTcsCisgICAgMHg3N0VDLCAweDk2QzksIDB4NzlENSwgMHg3OUVELCAweDc5RTMsIDB4NzlFQiwgMHg3QTA2LCAweDVENDcsIDB4N0EwMywKKyAgICAweDdBMDIsIDB4N0ExRSwgMHg3QTE0LCAweDdBMzksIDB4N0EzNywgMHg3QTUxLCAweDlFQ0YsIDB4OTlBNSwgMHg3QTcwLAorICAgIDB4NzY4OCwgMHg3NjhFLCAweDc2OTMsIDB4NzY5OSwgMHg3NkE0LCAweDc0REUsIDB4NzRFMCwgMHg3NTJDLCAweDlFMjAsCisgICAgMHg5RTIyLCAweDlFMjgsIDB4OUUyOSwgMHg5RTJBLCAweDlFMkIsIDB4OUUyQywgMHg5RTMyLCAweDlFMzEsIDB4OUUzNiwKKyAgICAweDlFMzgsIDB4OUUzNywgMHg5RTM5LCAweDlFM0EsIDB4OUUzRSwgMHg5RTQxLCAweDlFNDIsIDB4OUU0NCwgMHg5RTQ2LAorICAgIDB4OUU0NywgMHg5RTQ4LCAweDlFNDksIDB4OUU0QiwgMHg5RTRDLCAweDlFNEUsIDB4OUU1MSwgMHg5RTU1LCAweDlFNTcsCisgICAgMHg5RTVBLCAweDlFNUIsIDB4OUU1QywgMHg5RTVFLCAweDlFNjMsIDB4OUU2NiwgMHg5RTY3LCAweDlFNjgsIDB4OUU2OSwKKyAgICAweDlFNkEsIDB4OUU2QiwgMHg5RTZDLCAweDlFNzEsIDB4OUU2RCwgMHg5RTczLCAweDc1OTIsIDB4NzU5NCwgMHg3NTk2LAorICAgIDB4NzVBMCwgMHg3NTlELCAweDc1QUMsIDB4NzVBMywgMHg3NUIzLCAweDc1QjQsIDB4NzVCOCwgMHg3NUM0LCAweDc1QjEsCisgICAgMHg3NUIwLCAweDc1QzMsIDB4NzVDMiwgMHg3NUQ2LCAweDc1Q0QsIDB4NzVFMywgMHg3NUU4LCAweDc1RTYsIDB4NzVFNCwKKyAgICAweDc1RUIsIDB4NzVFNywgMHg3NjAzLCAweDc1RjEsIDB4NzVGQywgMHg3NUZGLCAweDc2MTAsIDB4NzYwMCwgMHg3NjA1LAorICAgIDB4NzYwQywgMHg3NjE3LCAweDc2MEEsIDB4NzYyNSwgMHg3NjE4LCAweDc2MTUsIDB4NzYxOSwgMHg3NjFCLCAweDc2M0MsCisgICAgMHg3NjIyLCAweDc2MjAsIDB4NzY0MCwgMHg3NjJELCAweDc2MzAsIDB4NzYzRiwgMHg3NjM1LCAweDc2NDMsIDB4NzYzRSwKKyAgICAweDc2MzMsIDB4NzY0RCwgMHg3NjVFLCAweDc2NTQsIDB4NzY1QywgMHg3NjU2LCAweDc2NkIsIDB4NzY2RiwgMHg3RkNBLAorICAgIDB4N0FFNiwgMHg3QTc4LCAweDdBNzksIDB4N0E4MCwgMHg3QTg2LCAweDdBODgsIDB4N0E5NSwgMHg3QUE2LCAweDdBQTAsCisgICAgMHg3QUFDLCAweDdBQTgsIDB4N0FBRCwgMHg3QUIzLCAweDg4NjQsIDB4ODg2OSwgMHg4ODcyLCAweDg4N0QsIDB4ODg3RiwKKyAgICAweDg4ODIsIDB4ODhBMiwgMHg4OEM2LCAweDg4QjcsIDB4ODhCQywgMHg4OEM5LCAweDg4RTIsIDB4ODhDRSwgMHg4OEUzLAorICAgIDB4ODhFNSwgMHg4OEYxLCAweDg5MUEsIDB4ODhGQywgMHg4OEU4LCAweDg4RkUsIDB4ODhGMCwgMHg4OTIxLCAweDg5MTksCisgICAgMHg4OTEzLCAweDg5MUIsIDB4ODkwQSwgMHg4OTM0LCAweDg5MkIsIDB4ODkzNiwgMHg4OTQxLCAweDg5NjYsIDB4ODk3QiwKKyAgICAweDc1OEIsIDB4ODBFNSwgMHg3NkIyLCAweDc2QjQsIDB4NzdEQywgMHg4MDEyLCAweDgwMTQsIDB4ODAxNiwgMHg4MDFDLAorICAgIDB4ODAyMCwgMHg4MDIyLCAweDgwMjUsIDB4ODAyNiwgMHg4MDI3LCAweDgwMjksIDB4ODAyOCwgMHg4MDMxLCAweDgwMEIsCisgICAgMHg4MDM1LCAweDgwNDMsIDB4ODA0NiwgMHg4MDRELCAweDgwNTIsIDB4ODA2OSwgMHg4MDcxLCAweDg5ODMsIDB4OTg3OCwKKyAgICAweDk4ODAsIDB4OTg4MywgMHg5ODg5LCAweDk4OEMsIDB4OTg4RCwgMHg5ODhGLCAweDk4OTQsIDB4OTg5QSwgMHg5ODlCLAorICAgIDB4OTg5RSwgMHg5ODlGLCAweDk4QTEsIDB4OThBMiwgMHg5OEE1LCAweDk4QTYsIDB4ODY0RCwgMHg4NjU0LCAweDg2NkMsCisgICAgMHg4NjZFLCAweDg2N0YsIDB4ODY3QSwgMHg4NjdDLCAweDg2N0IsIDB4ODZBOCwgMHg4NjhELCAweDg2OEIsIDB4ODZBQywKKyAgICAweDg2OUQsIDB4ODZBNywgMHg4NkEzLCAweDg2QUEsIDB4ODY5MywgMHg4NkE5LCAweDg2QjYsIDB4ODZDNCwgMHg4NkI1LAorICAgIDB4ODZDRSwgMHg4NkIwLCAweDg2QkEsIDB4ODZCMSwgMHg4NkFGLCAweDg2QzksIDB4ODZDRiwgMHg4NkI0LCAweDg2RTksCisgICAgMHg4NkYxLCAweDg2RjIsIDB4ODZFRCwgMHg4NkYzLCAweDg2RDAsIDB4ODcxMywgMHg4NkRFLCAweDg2RjQsIDB4ODZERiwKKyAgICAweDg2RDgsIDB4ODZEMSwgMHg4NzAzLCAweDg3MDcsIDB4ODZGOCwgMHg4NzA4LCAweDg3MEEsIDB4ODcwRCwgMHg4NzA5LAorICAgIDB4ODcyMywgMHg4NzNCLCAweDg3MUUsIDB4ODcyNSwgMHg4NzJFLCAweDg3MUEsIDB4ODczRSwgMHg4NzQ4LCAweDg3MzQsCisgICAgMHg4NzMxLCAweDg3MjksIDB4ODczNywgMHg4NzNGLCAweDg3ODIsIDB4ODcyMiwgMHg4NzdELCAweDg3N0UsIDB4ODc3QiwKKyAgICAweDg3NjAsIDB4ODc3MCwgMHg4NzRDLCAweDg3NkUsIDB4ODc4QiwgMHg4NzUzLCAweDg3NjMsIDB4ODc3QywgMHg4NzY0LAorICAgIDB4ODc1OSwgMHg4NzY1LCAweDg3OTMsIDB4ODdBRiwgMHg4N0E4LCAweDg3RDIsIDB4ODdDNiwgMHg4Nzg4LCAweDg3ODUsCisgICAgMHg4N0FELCAweDg3OTcsIDB4ODc4MywgMHg4N0FCLCAweDg3RTUsIDB4ODdBQywgMHg4N0I1LCAweDg3QjMsIDB4ODdDQiwKKyAgICAweDg3RDMsIDB4ODdCRCwgMHg4N0QxLCAweDg3QzAsIDB4ODdDQSwgMHg4N0RCLCAweDg3RUEsIDB4ODdFMCwgMHg4N0VFLAorICAgIDB4ODgxNiwgMHg4ODEzLCAweDg3RkUsIDB4ODgwQSwgMHg4ODFCLCAweDg4MjEsIDB4ODgzOSwgMHg4ODNDLCAweDdGMzYsCisgICAgMHg3RjQyLCAweDdGNDQsIDB4N0Y0NSwgMHg4MjEwLCAweDdBRkEsIDB4N0FGRCwgMHg3QjA4LCAweDdCMDMsIDB4N0IwNCwKKyAgICAweDdCMTUsIDB4N0IwQSwgMHg3QjJCLCAweDdCMEYsIDB4N0I0NywgMHg3QjM4LCAweDdCMkEsIDB4N0IxOSwgMHg3QjJFLAorICAgIDB4N0IzMSwgMHg3QjIwLCAweDdCMjUsIDB4N0IyNCwgMHg3QjMzLCAweDdCM0UsIDB4N0IxRSwgMHg3QjU4LCAweDdCNUEsCisgICAgMHg3QjQ1LCAweDdCNzUsIDB4N0I0QywgMHg3QjVELCAweDdCNjAsIDB4N0I2RSwgMHg3QjdCLCAweDdCNjIsIDB4N0I3MiwKKyAgICAweDdCNzEsIDB4N0I5MCwgMHg3QkE2LCAweDdCQTcsIDB4N0JCOCwgMHg3QkFDLCAweDdCOUQsIDB4N0JBOCwgMHg3Qjg1LAorICAgIDB4N0JBQSwgMHg3QjlDLCAweDdCQTIsIDB4N0JBQiwgMHg3QkI0LCAweDdCRDEsIDB4N0JDMSwgMHg3QkNDLCAweDdCREQsCisgICAgMHg3QkRBLCAweDdCRTUsIDB4N0JFNiwgMHg3QkVBLCAweDdDMEMsIDB4N0JGRSwgMHg3QkZDLCAweDdDMEYsIDB4N0MxNiwKKyAgICAweDdDMEIsIDB4N0MxRiwgMHg3QzJBLCAweDdDMjYsIDB4N0MzOCwgMHg3QzQxLCAweDdDNDAsIDB4ODFGRSwgMHg4MjAxLAorICAgIDB4ODIwMiwgMHg4MjA0LCAweDgxRUMsIDB4ODg0NCwgMHg4MjIxLCAweDgyMjIsIDB4ODIyMywgMHg4MjJELCAweDgyMkYsCisgICAgMHg4MjI4LCAweDgyMkIsIDB4ODIzOCwgMHg4MjNCLCAweDgyMzMsIDB4ODIzNCwgMHg4MjNFLCAweDgyNDQsIDB4ODI0OSwKKyAgICAweDgyNEIsIDB4ODI0RiwgMHg4MjVBLCAweDgyNUYsIDB4ODI2OCwgMHg4ODdFLCAweDg4ODUsIDB4ODg4OCwgMHg4OEQ4LAorICAgIDB4ODhERiwgMHg4OTVFLCAweDdGOUQsIDB4N0Y5RiwgMHg3RkE3LCAweDdGQUYsIDB4N0ZCMCwgMHg3RkIyLCAweDdDN0MsCisgICAgMHg2NTQ5LCAweDdDOTEsIDB4N0M5RCwgMHg3QzlDLCAweDdDOUUsIDB4N0NBMiwgMHg3Q0IyLCAweDdDQkMsIDB4N0NCRCwKKyAgICAweDdDQzEsIDB4N0NDNywgMHg3Q0NDLCAweDdDQ0QsIDB4N0NDOCwgMHg3Q0M1LCAweDdDRDcsIDB4N0NFOCwgMHg4MjZFLAorICAgIDB4NjZBOCwgMHg3RkJGLCAweDdGQ0UsIDB4N0ZENSwgMHg3RkU1LCAweDdGRTEsIDB4N0ZFNiwgMHg3RkU5LCAweDdGRUUsCisgICAgMHg3RkYzLCAweDdDRjgsIDB4N0Q3NywgMHg3REE2LCAweDdEQUUsIDB4N0U0NywgMHg3RTlCLCAweDlFQjgsIDB4OUVCNCwKKyAgICAweDhENzMsIDB4OEQ4NCwgMHg4RDk0LCAweDhEOTEsIDB4OERCMSwgMHg4RDY3LCAweDhENkQsIDB4OEM0NywgMHg4QzQ5LAorICAgIDB4OTE0QSwgMHg5MTUwLCAweDkxNEUsIDB4OTE0RiwgMHg5MTY0LCAweDkxNjIsIDB4OTE2MSwgMHg5MTcwLCAweDkxNjksCisgICAgMHg5MTZGLCAweDkxN0QsIDB4OTE3RSwgMHg5MTcyLCAweDkxNzQsIDB4OTE3OSwgMHg5MThDLCAweDkxODUsIDB4OTE5MCwKKyAgICAweDkxOEQsIDB4OTE5MSwgMHg5MUEyLCAweDkxQTMsIDB4OTFBQSwgMHg5MUFELCAweDkxQUUsIDB4OTFBRiwgMHg5MUI1LAorICAgIDB4OTFCNCwgMHg5MUJBLCAweDhDNTUsIDB4OUU3RSwgMHg4REI4LCAweDhERUIsIDB4OEUwNSwgMHg4RTU5LCAweDhFNjksCisgICAgMHg4REI1LCAweDhEQkYsIDB4OERCQywgMHg4REJBLCAweDhEQzQsIDB4OERENiwgMHg4REQ3LCAweDhEREEsIDB4OERERSwKKyAgICAweDhEQ0UsIDB4OERDRiwgMHg4RERCLCAweDhEQzYsIDB4OERFQywgMHg4REY3LCAweDhERjgsIDB4OERFMywgMHg4REY5LAorICAgIDB4OERGQiwgMHg4REU0LCAweDhFMDksIDB4OERGRCwgMHg4RTE0LCAweDhFMUQsIDB4OEUxRiwgMHg4RTJDLCAweDhFMkUsCisgICAgMHg4RTIzLCAweDhFMkYsIDB4OEUzQSwgMHg4RTQwLCAweDhFMzksIDB4OEUzNSwgMHg4RTNELCAweDhFMzEsIDB4OEU0OSwKKyAgICAweDhFNDEsIDB4OEU0MiwgMHg4RTUxLCAweDhFNTIsIDB4OEU0QSwgMHg4RTcwLCAweDhFNzYsIDB4OEU3QywgMHg4RTZGLAorICAgIDB4OEU3NCwgMHg4RTg1LCAweDhFOEYsIDB4OEU5NCwgMHg4RTkwLCAweDhFOUMsIDB4OEU5RSwgMHg4Qzc4LCAweDhDODIsCisgICAgMHg4QzhBLCAweDhDODUsIDB4OEM5OCwgMHg4Qzk0LCAweDY1OUIsIDB4ODlENiwgMHg4OURFLCAweDg5REEsIDB4ODlEQywKKyAgICAweDg5RTUsIDB4ODlFQiwgMHg4OUVGLCAweDhBM0UsIDB4OEIyNiwgMHg5NzUzLCAweDk2RTksIDB4OTZGMywgMHg5NkVGLAorICAgIDB4OTcwNiwgMHg5NzAxLCAweDk3MDgsIDB4OTcwRiwgMHg5NzBFLCAweDk3MkEsIDB4OTcyRCwgMHg5NzMwLCAweDk3M0UsCisgICAgMHg5RjgwLCAweDlGODMsIDB4OUY4NSwgMHg5Rjg2LCAweDlGODcsIDB4OUY4OCwgMHg5Rjg5LCAweDlGOEEsIDB4OUY4QywKKyAgICAweDlFRkUsIDB4OUYwQiwgMHg5RjBELCAweDk2QjksIDB4OTZCQywgMHg5NkJELCAweDk2Q0UsIDB4OTZEMiwgMHg3N0JGLAorICAgIDB4OTZFMCwgMHg5MjhFLCAweDkyQUUsIDB4OTJDOCwgMHg5MzNFLCAweDkzNkEsIDB4OTNDQSwgMHg5MzhGLCAweDk0M0UsCisgICAgMHg5NDZCLCAweDlDN0YsIDB4OUM4MiwgMHg5Qzg1LCAweDlDODYsIDB4OUM4NywgMHg5Qzg4LCAweDdBMjMsIDB4OUM4QiwKKyAgICAweDlDOEUsIDB4OUM5MCwgMHg5QzkxLCAweDlDOTIsIDB4OUM5NCwgMHg5Qzk1LCAweDlDOUEsIDB4OUM5QiwgMHg5QzlFLAorICAgIDB4OUM5RiwgMHg5Q0EwLCAweDlDQTEsIDB4OUNBMiwgMHg5Q0EzLCAweDlDQTUsIDB4OUNBNiwgMHg5Q0E3LCAweDlDQTgsCisgICAgMHg5Q0E5LCAweDlDQUIsIDB4OUNBRCwgMHg5Q0FFLCAweDlDQjAsIDB4OUNCMSwgMHg5Q0IyLCAweDlDQjMsIDB4OUNCNCwKKyAgICAweDlDQjUsIDB4OUNCNiwgMHg5Q0I3LCAweDlDQkEsIDB4OUNCQiwgMHg5Q0JDLCAweDlDQkQsIDB4OUNDNCwgMHg5Q0M1LAorICAgIDB4OUNDNiwgMHg5Q0M3LCAweDlDQ0EsIDB4OUNDQiwgMHg5Q0NDLCAweDlDQ0QsIDB4OUNDRSwgMHg5Q0NGLCAweDlDRDAsCisgICAgMHg5Q0QzLCAweDlDRDQsIDB4OUNENSwgMHg5Q0Q3LCAweDlDRDgsIDB4OUNEOSwgMHg5Q0RDLCAweDlDREQsIDB4OUNERiwKKyAgICAweDlDRTIsIDB4OTc3QywgMHg5Nzg1LCAweDk3OTEsIDB4OTc5MiwgMHg5Nzk0LCAweDk3QUYsIDB4OTdBQiwgMHg5N0EzLAorICAgIDB4OTdCMiwgMHg5N0I0LCAweDlBQjEsIDB4OUFCMCwgMHg5QUI3LCAweDlFNTgsIDB4OUFCNiwgMHg5QUJBLCAweDlBQkMsCisgICAgMHg5QUMxLCAweDlBQzAsIDB4OUFDNSwgMHg5QUMyLCAweDlBQ0IsIDB4OUFDQywgMHg5QUQxLCAweDlCNDUsIDB4OUI0MywKKyAgICAweDlCNDcsIDB4OUI0OSwgMHg5QjQ4LCAweDlCNEQsIDB4OUI1MSwgMHg5OEU4LCAweDk5MEQsIDB4OTkyRSwgMHg5OTU1LAorICAgIDB4OTk1NCwgMHg5QURGLCAweDlBRTEsIDB4OUFFNiwgMHg5QUVGLCAweDlBRUIsIDB4OUFGQiwgMHg5QUVELCAweDlBRjksCisgICAgMHg5QjA4LCAweDlCMEYsIDB4OUIxMywgMHg5QjFGLCAweDlCMjMsIDB4OUVCRCwgMHg5RUJFLCAweDdFM0IsIDB4OUU4MiwKKyAgICAweDlFODcsIDB4OUU4OCwgMHg5RThCLCAweDlFOTIsIDB4OTNENiwgMHg5RTlELCAweDlFOUYsIDB4OUVEQiwgMHg5RURDLAorICAgIDB4OUVERCwgMHg5RUUwLCAweDlFREYsIDB4OUVFMiwgMHg5RUU5LCAweDlFRTcsIDB4OUVFNSwgMHg5RUVBLCAweDlFRUYsCisgICAgMHg5RjIyLCAweDlGMkMsIDB4OUYyRiwgMHg5RjM5LCAweDlGMzcsIDB4OUYzRCwgMHg5RjNFLCAweDlGNDQsIDB4MzAwNywKKyAgICAweEZGNUUsIDB4MjAxNiwgMHgzMDEzLCAweEZGMEUsIDB4RkYxRCwgMHhGRjNCLCAweEZGM0QsIDB4RkZFMywgMHgwMEZDLAorICAgIDB4MDBBOSwgMHgyMTIyLCAweDIwMjYsIDB4MDAyMCwgMHg3NjlBLCAweDg1RjksIDB4NzkxOSwgMHg2MTFCLCAweDlBQUYsCisgICAgMHg4OTU2LCAweDU4RTksIDB4N0Y3NywgMHg2NEZBLCAweDY1NTcsIDB4OTgxMiwgMHg4RkE2LCAweDdENDYsIDB4NUU2QiwKKyAgICAweDdEODEsIDB4OTM4QSwgMHg4QjE3LCAweDk4RkQsIDB4NUJGNiwgMHg1ODMxLCAweDlCOTEsIDB4OEYyOSwgMHg4QzlELAorICAgIDB4OTJDNywgMHg3MkZELCAweDUwOTksIDB4NjE4QSwgMHg3REIzLCAweDdCNDYsIDB4NzU2MiwgMHg2NTgzLCAweDVFNjMsCisgICAgMHg5NTg5LCAweDkwOEEsIDB4N0RFOCwgMHg4Q0I2LCAweDhCOEEsIDB4OEZBRiwgMHg4RkFFLCAweDZBMTksIDB4OUM0OSwKKyAgICAweDc2NUYsIDB4NzAxNSwgMHg2RkYxLCAweDhDRDMsIDB4NjRFRiwgMHg5OTA1LCAweDY0QTUsIDB4OTI2MiwgMHg5MjUxLAorICAgIDB4OTlDMSwgMHg4OERDLCAweDhDQTEsIDB4NTNDMywgMHg4ODM2LCAweDZCOTgsIDB4NjE1QSwgMHg2MTU4LCAweDcxRTYsCisgICAgMHg4NEJDLCAweDgyNTksIDB4NTAwOSwgMHg2RUM0LCAweDUzQTAsIDB4NTA3NCwgMHg2RTJDLCAweDVDNjQsIDB4OEE2QiwKKyAgICAweDY1MTksIDB4NjQ3QiwgMHg4N0VDLCAweDk5NUUsIDB4OEI5MiwgMHg3RThGLCAweDkzREYsIDB4NzUyMywgMHg5NUUxLAorICAgIDB4OTg2QiwgMHg1ODM0LCAweDU2MTcsIDB4OTU3NywgMHg1MTFGLCAweDgxNzgsIDB4NUVFMCwgMHg2NkEyLCAweDkyMTQsCisgICAgMHg4RUNBLCAweDVGQjksIDB4NTg3NSwgMHg5NjczLCAweDg5NkYsIDB4N0EzMSwgMHg2MUYyLCAweDhBQTAsIDB4OUEwMSwKKyAgICAweDkwNzIsIDB4OTlCMywgMHg5RjUyLCAweDcxQkUsIDB4ODg1RCwgMHg4N0YyLCAweDVCRjUsIDB4NzU4NywgMHg4RThBLAorICAgIDB4N0M0QywgMHg3REEyLCAweDkxOUMsIDB4OTJFNCwgMHg5NkRCLCAweDc5MEUsIDB4NTEzMiwgMHg4OUY4LCAweDg2NTUsCisgICAgMHg1MEIzLCAweDc2MjEsIDB4OTVENiwgMHg1Mjc1LCAweDkzMTgsIDB4N0QxNCwgMHg3REJELCAweDhGQUQsIDB4OEE1RSwKKyAgICAweDhDREMsIDB4ODA3MCwgMHg1RjlFLCAweDUzRTIsIDB4OEVBNSwgMHg3QUM0LCAweDkzMkYsIDB4OTA1NCwgMHg1RTM2LAorICAgIDB4OENCOCwgMHg2NEQ0LCAweDU1QUUsIDB4OTEzMiwgMHg2NEEzLCAweDgxQkQsIDB4NjE5QSwgMHg4QTk1LCAweDVGNDgsCisgICAgMHg3NTc2LCAweDY0Q0IsIDB4OUVFOCwgMHg4NTY5LCAweDZBOTQsIDB4NjQxNywgMHg1Q0Y2LCAweDc5QjEsIDB4NUMwRSwKKyAgICAweDcxQzgsIDB4OTEyNywgMHg2NTc1LCAweDZFQ0MsIDB4OTA1RSwgMHg3REUwLCAweDk4NUIsIDB4OUVERSwgMHg1ODhBLAorICAgIDB4OTZGQiwgMHg2RkIxLCAweDkxRTMsIDB4OEFCRiwgMHg4QURDLCAweDkxRDgsIDB4OTgwMiwgMHg5MzIwLCAweDhBMDIsCisgICAgMHg2NzcxLCAweDUyRDUsIDB4NjhERiwgMHg1MUNELCAweDlCMjUsIDB4NzJBMiwgMHg3MzY4LCAweDhCODAsIDB4OENFRCwKKyAgICAweDkzNEQsIDB4OTM1QiwgMHg2NUI3LCAweDdEREUsIDB4OTY4QSwgMHg1QzBELCAweDU2NzgsIDB4OTgxMywgMHg5MjBELAorICAgIDB4NTk2QSwgMHg1OEFFLCAweDlENUQsIDB4OTg0RCwgMHg4QTFCLCAweDYwRTEsIDB4OTkxMywgMHg1MTUyLCAweDcyM0UsCisgICAgMHg5OTBDLCAweDhDQjMsIDB4NzY3QywgMHg3RjcwLCAweDk1QTUsIDB4NzkyQywgMHg5MUU5LCAweDcxNjksIDB4N0JDNCwKKyAgICAweDhDQTksIDB4OThFRiwgMHg4QTJBLCAweDdEMjEsIDB4OThEQiwgMHg4QUI5LCAweDVFRTIsIDB4OENCQiwgMHg3RDFCLAorICAgIDB4NThCMywgMHg1OTZFLCAweDYxQTQsIDB4N0NERSwgMHg4QzUwLCAweDY5NTMsIDB4OTJEMiwgMHg5OEE4LCAweDc2MEIsCisgICAgMHg5OUFFLCAweDdFMkIsIDB4OEFGNywgMHg5Q0YzLCAweDgxOUEsIDB4OEYzQiwgMHg2NEFCLCAweDhGMTQsIDB4OENFNiwKKyAgICAweDVGQTksIDB4OENBMCwgMHg4QTAzLCAweDVBNjYsIDB4N0UxQiwgMHg4QTcyLCAweDkyMjMsIDB4ODRDQiwgMHg1RTc5LAorICAgIDB4OEQ5NSwgMHg4RDFCLCAweDVDQTEsIDB4NTI1QiwgMHg5MkZDLCAweDdEQjEsIDB4NUQxNywgMHg5M0FDLCAweDY0RjEsCisgICAgMHg5RDNGLCAweDk1QTMsIDB4OTI3QiwgMHg1MDBCLCAweDdENjYsIDB4OUY5NCwgMHg5NzhGLCAweDhDQTIsIDB4OTIwRSwKKyAgICAweDZFOUQsIDB4NjlDQiwgMHg4Q0ZDLCAweDg4MzEsIDB4OTg2NywgMHg1MjZFLCAweDk1REMsIDB4ODlDMCwgMHg5OTI4LAorICAgIDB4NjE2MywgMHg4Q0FCLCAweDVFRTMsIDB4ODk4RiwgMHg2Qjc4LCAweDlGOUMsIDB4OTVBOCwgMHg4RUNDLCAweDhBNkQsCisgICAgMHg2QUMzLCAweDhDQjQsIDB4NTI4QSwgMHg4RjI1LCAweDkzNEIsIDB4NTcwQiwgMHg5MDRFLCAweDk5RUQsIDB4OTdEMywKKyAgICAweDZGMjIsIDB4ODY1RiwgMHg5NUExLCAweDlEQjQsIDB4OENDMCwgMHg4RjVGLCAweDlEM0IsIDB4N0QwNSwgMHg1OEZBLAorICAgIDB4OEI3NywgMHg2RUVDLCAweDU2MjksIDB4ODNFRiwgMHg3NTZCLCAweDUyODMsIDB4OEE3MSwgMHg2MUY3LCAweDU4REUsCisgICAgMHg2QjYxLCAweDc0QjAsIDB4OTA4NCwgMHg3REU5LCAweDhCMEEsIDB4NjNFRSwgMHg4RjFELCAweDhDQzQsIDB4N0E2MiwKKyAgICAweDY3MDMsIDB4NzFGNCwgMHg1MzJGLCAweDhBRjEsIDB4OEFBOCwgMHg3RTZBLCAweDg0NzcsIDB4NkUzRSwgMHg3MzcyLAorICAgIDB4OENBOCwgMHg3OThELCAweDY0Q0EsIDB4NkE1RiwgMHg3QTRELCAweDk5NTEsIDB4OEI0RiwgMHg5REM0LCAweDdFM0UsCisgICAgMHg3RERELCAweDY5NzUsIDB4OEYyRiwgMHg3RDFBLCAweDY0RTAsIDB4NUU3RSwgMHg4NThBLCAweDUyOTEsIDB4NkZERiwKKyAgICAweDhBMDgsIDB4OEExOCwgMHg5NjlCLCAweDdFN0MsIDB4N0QwMCwgMHg1OTNFLCAweDgzQTIsIDB4OTgzMCwgMHg4Q0M4LAorICAgIDB4OTI0MCwgMHg1MEY5LCAweDk5RDUsIDB4NkJCMiwgMHg3NkUzLCAweDU4MDUsIDB4N0I4QiwgMHg5NTkzLCAweDgyNzEsCisgICAgMHg3REQ4LCAweDdFNkQsIDB4NkFBMiwgMHg5RTdDLCAweDYzQzAsIDB4NjRCRiwgMHg3QzIxLCAweDUxMDksIDB4ODVBNiwKKyAgICAweDZBQkIsIDB4OTQ1MiwgMHg4RTEwLCAweDhDRTQsIDB4ODk4QiwgMHg5Mzc1LCAweDgyNjYsIDB4NTI4RCwgMHg5OTFFLAorICAgIDB4NkYzOCwgMHg2RkZBLCAweDZGOTcsIDB4NUMwNywgMHg2RjNGLCAweDg1MjMsIDB4NjlGMywgMHg1OTZDLCAweDhCMUIsCisgICAgMHg5MUFDLCAweDgxQTAsIDB4NkY4NiwgMHg5QTU1LCAweDVCMEMsIDB4NjUyQSwgMHg5Mjc4LCAweDc3RUYsIDB4NTBFNSwKKyAgICAweDk5MDMsIDB4N0U3MywgMHg3RDVFLCAweDhGNEUsIDB4OEYwMywgMHg5NjhFLCAweDdCQzAsIDB4NkY1NCwgMHg3RDUwLAorICAgIDB4OEFBMSwgMHg3RENBLCAweDkzMjYsIDB4NTBDNSwgMHg4QjM5LCAweDkwMzIsIDB4NzFGQywgMHg3NkUxLCAweDUyQzEsCisgICAgMHg4Mzk2LCAweDlCRTgsIDB4OUE1QSwgMHg3RDkzLCAweDk4MzgsIDB4OTNFMSwgMHg1RjkxLCAweDc1RDksIDB4N0FGNiwKKyAgICAweDdDRkUsIDB4ODIwQSwgMHg5OUQyLCAweDgyMDksIDB4NjREQSwgMHg5MkY4LCAweDYxRkMsIDB4NTI4NywgMHg5RDUxLAorICAgIDB4N0Q3OSwgMHg4OUJBLCAweDhBMjMsIDB4N0Q3NiwgMHg5MjFFLCAweDhFQ0QsIDB4OTlGRiwgMHg5NThCLCAweDUxRjEsCisgICAgMHg5ODQ2LCAweDZCQkIsIDB4OEFCMiwgMHg1OEJFLCAweDYxQzcsIDB4NjQ3MywgMHg1RUFCLCAweDg5MzIsIDB4OEE4NywKKyAgICAweDU4NEEsIDB4NTEwOCwgMHg1QkVDLCAweDc5MjYsIDB4NjZFMCwgMHg4NjY3LCAweDVEQ0IsIDB4N0FCQSwgMHg5OTRCLAorICAgIDB4NkY3MCwgMHg2NEY0LCAweDk1Q0EsIDB4ODgxRiwgMHg4MUQ4LCAweDg0MEEsIDB4NEY4NiwgMHg4Q0Y0LCAweDg1Q0QsCisgICAgMHg2QjA0LCAweDY1MTQsIDB4N0M0MywgMHg5NUNDLCAweDg2MkQsIDB4NzAzRSwgMHg4Qjk1LCAweDY1MkMsIDB4ODlCRCwKKyAgICAweDYxRjYsIDB4N0U5QywgMHg3MjFCLCAweDZGRUIsIDB4NjQ4OCwgMHg1MkRFLCAweDZGODcsIDB4NkEwMiwgMHg5NDMzLAorICAgIDB4NThEOCwgMHg5ODVFLCAweDdDNkMsIDB4OTZFMiwgMHg3MDU1LCAweDg4Q0YsIDB4OUJDOSwgMHg3OUFFLCAweDlFOTcsCisgICAgMHg1M0IyLCAweDUyRjUsIDB4NzkyQiwgMHg2Qjc3LCAweDcwMUQsIDB4OTZCOCwgMHg1MDA2LCAweDgwNkYsIDB4ODRFRSwKKyAgICAweDkwMjMsIDB4OTQyRSwgMHg2MTkwLCAweDZGMjMsIDB4N0MzRSwgMHg2NTgyLCAweDgxQzksIDB4OTNDOCwgMHg2MjAwLAorICAgIDB4NzE0OSwgMHg3REY0LCAweDdDRTcsIDB4NTE2OSwgMHg4RjFCLCAweDhBRDIsIDB4NzY0MiwgMHg5MDdDLCAweDk0MTAsCisgICAgMHg3Mzc1LCAweDgxRTgsIDB4OTEzMCwgMHg5QzU3LCAweDhDQzMsIDB4OUY2MSwgMHg5MjM0LCAweDk3NDgsIDB4NURCQSwKKyAgICAweDk4MTgsIDB4OTkzRSwgMHg1Mjg5LCAweDlGOEQsIDB4ODA3RSwgMHg1NkE4LCAweDdDNjAsIDB4NThERiwgMHg2NTBGLAorICAgIDB4OTZCNCwgMHg2QTEzLCAweDVBNDEsIDB4NjQ1RiwgMHg3QzBELCAweDg2MDYsIDB4NzZFNywgMHg5ODcxLCAweDVFRUMsCisgICAgMHg3MjEwLCAweDY0QzQsIDB4NkVGNywgMHg4NjVDLCAweDlCNkYsIDB4OENDMiwgMHg5MzMyLCAweDk2NzgsIDB4OUE2MiwKKyAgICAweDkyQzEsIDB4NUM2MiwgMHg3RTM3LCAweDYxNkUsIDB4NkZGRSwgMHg3REQxLCAweDVERDIsIDB4NjUyMywgMHg1QjdGLAorICAgIDB4NzA2NCwgMHg0RTgyLCAweDYzODQsIDB4OEYyQSwgMHg1MDJCLCAweDRGOTYsIDB4NkRFQSwgMHg3REI4LCAweDhBRDYsCisgICAgMHg4NjNGLCAweDdGODUsIDB4OTA4RiwgMHg5NDdDLCAweDdDNkUsIDB4OUEzRSwgMHg5OUYxLCAweDdENjEsIDB4NUFCRCwKKyAgICAweDc0NkEsIDB4NzhCQywgMHg4NzlFLCAweDk5QUMsIDB4OTlFMSwgMHg1NUNFLCAweDhDQjcsIDB4OUVBNSwgMHg4Q0UzLAorICAgIDB4OTA4MSwgMHg3NzlFLCAweDk5NDUsIDB4ODgzQiwgMHg2RUZGLCAweDhCM0UsIDB4OTMyOCwgMHg5MjVBLCAweDhDQkYsCisgICAgMHg5MzgyLCAweDk1ODAsIDB4NjBCNiwgMHg1MDExLCAweDkzMzMsIDB4NTkyMiwgMHg4QjBFLCAweDVGNEMsIDB4ODk5MywKKyAgICAweDdEQkYsIDB4N0RFQywgMHg1RURGLCAweDZFQzUsIDB4NjFBQiwgMHg5NUE5LCAweDlDRjQsIDB4OTI5OCwgMHg4QjJDLAorICAgIDB4OEIwMCwgMHg3NTVELCAweDkyMDksIDB4N0QwRCwgMHg5NkUzLCAweDY0OTMsIDB4ODE2NiwgMHg2MEYxLCAweDlCMjcsCisgICAgMHg5OTEyLCAweDY0RUMsIDB4ODFBOSwgMHg2NTA2LCAweDkxQzAsIDB4OUNFNSwgMHg4MDc2LCAweDU2OTksIDB4OTQ3NywKKyAgICAweDkzQjMsIDB4NkFCOCwgMHg3MzcwLCAweDVCRTcsIDB4NjRGMCwgMHg2RkQ4LCAweDkyMTUsIDB4N0QxMCwgMHg4MUJGLAorICAgIDB4NkZDMywgMHg4RkIyLCAweDc2MjcsIDB4OEFGRSwgMHg2QjUwLCAweDlERDcsIDB4NkJDNiwgMHg1NjE0LCAweDZGMUEsCisgICAgMHg3NkU0LCAweDlGOTAsIDB4OENFMCwgMHg1Njc0LCAweDlENkMsIDB4OUExOSwgMHg5OEM0LCAweDk4M0IsIDB4OENBNywKKyAgICAweDg2MEIsIDB4NjE5MSwgMHg4QTU1LCAweDZGNTEsIDB4OTgxNywgMHg2NEIyLCAweDkyRUEsIDB4NTBENSwgMHg2QTM4LAorICAgIDB4OEI1QywgMHg4MUNELCAweDlGNEEsIDB4OUEwRSwgMHg4QzQ4LCAweDU1NTMsIDB4NkMyMywgMHg4QTE2LCAweDcyN0QsCisgICAgMHg5MUZBLCAweDkyNUIsIDB4OTA3NywgMHg3QzNELCAweDhCMTksIDB4OTMyMiwgMHg5MjU3LCAweDZERkEsIDB4OEI3NCwKKyAgICAweDU4NzksIDB4NjlDRCwgMHg1NUM2LCAweDU4QkIsIDB4ODU5NCwgMHg2NDM2LCAweDkzNkMsIDB4NkE0QiwgMHg1NUFDLAorICAgIDB4NTBEMSwgMHg3RkY5LCAweDdBQzUsIDB4N0FDQSwgMHg2QjNELCAweDg5QUEsIDB4NUJFMiwgMHg4RjE1LCAweDZDMkIsCisgICAgMHg1MEJFLCAweDk4MDMsIDB4OEFDQiwgMHg2MTc2LCAweDc0Q0EsIDB4N0FBRSwgMHg4REE4LCAweDUzNDAsIDB4OEVDMCwKKyAgICAweDlBNDUsIDB4OUY3MiwgMHg5ODc0LCAweDZCMEEsIDB4NTJGOCwgMHg5RDcyLCAweDc4QkEsIDB4OEI5MywgMHg5OTUyLAorICAgIDB4NjRGRSwgMHg3RTVFLCAweDcxQjEsIDB4OTdDQywgMHg4QThELCAweDdEMDksIDB4NjlBRSwgMHg3RDY4LCAweDhFREYsCisgICAgMHg5MkVELCAweDk1OEYsIDB4NkY2NCwgMHg3MDUxLCAweDg1QTksIDB4OUMxMywgMHg4Q0ZELCAweDUwOTgsIDB4NTVBQSwKKyAgICAweDlBMzcsIDB4NjM4MywgMHg2RjgwLCAweDZCQkEsIDB4N0QxNywgMHg3QkU5LCAweDY2RUMsIDB4OTU4MywgMHg5NjVELAorICAgIDB4OEQwRCwgMHg3RTU1LCAweDUwQjcsIDB4OENERSwgMHg3MUQyLCAweDdEMzksIDB4OENEMiwgMHg2MzY4LCAweDY1MUQsCisgICAgMHg2MUZFLCAweDhBMkQsIDB4N0QzMywgMHg1QkU5LCAweDVCMzgsIDB4ODE0RSwgMHg2RUYyLCAweDgwNzIsIDB4N0U2OSwKKyAgICAweDUyREQsIDB4ODA1NiwgMHg1RTJCLCAweDczNDUsIDB4NkZENSwgMHg4QTY5LCAweDY2NDIsIDB4ODc1NSwgMHg1QkU2LAorICAgIDB4OEI1OCwgMHg5OURCLCAweDUyRTIsIDB4OTA2OSwgMHg5MUNCLCAweDk4RkUsIDB4ODk5NiwgMHg4QTY2LCAweDU4RkQsCisgICAgMHg3Mzc4LCAweDZBMUUsIDB4OEYzOCwgMHg2NkY4LCAweDhEMTYsIDB4NUM2QywgMHg4ODUzLCAweDZBMzksIDB4N0FFQSwKKyAgICAweDY1NzgsIDB4NUUyNSwgMHg5NkQ5LCAweDhBQjAsIDB4OTgwNiwgMHg4QUFDLCAweDc4QTksIDB4NzIwRCwgMHg3RDcyLAorICAgIDB4OThGQywgMHg5QjA2LCAweDgwNzMsIDB4NjE2QiwgMHg5ODBDLCAweDhBMUYsIDB4OEFBNiwgMHg2NEZCLCAweDg2MDcsCisgICAgMHg4QTM0LCAweDgwODUsIDB4OTZENiwgMHg5NkE4LCAweDdEOEYsIDB4NkI3MiwgMHg1QjZCLCAweDY0MEQsIDB4N0UyRSwKKyAgICAweDc0NjMsIDB4OTM5NiwgMHg3MzdBLCAweDY0QkIsIDB4ODFGQSwgMHg2MTRCLCAweDY1MjQsIDB4OENBQSwgMHg3NjcxLAorICAgIDB4NzA1OCwgMHg1OEM3LCAweDhCNUEsIDB4OEFDNywgMHg1NjA2LCAweDZFNkYsIDB4NzFEOSwgMHg2RkU0LCAweDdFMjcsCisgICAgMHg4QTBFLCAweDlBMzAsIDB4OEIwNCwgMHg5MkJCLCAweDk4NEMsIDB4OUFENCwgMHg2ODlELCAweDhDQkMsIDB4OTQzNSwKKyAgICAweDVFRjMsIDB4ODA3RCwgMHg3MEY0LCAweDkyODUsIDB4N0Q3MSwgMHg5ODJELCAweDU3MTYsIDB4NTg1NywgMHg1NzE4LAorICAgIDB4OTgzRCwgMHg5RDE1LCAweDk5QjEsIDB4OTlERCwgMHg2QTYyLCAweDdBQUEsIDB4ODk2QSwgMHg1RjRFLCAweDcwNjMsCisgICAgMHg5ODExLCAweDg0MkMsIDB4N0RCMiwgMHg5N0NCLCAweDkwNTUsIDB4NTcwRCwgMHg3MjMyLCAweDZGRjAsIDB4N0RBRCwKKyAgICAweDg0NjYsIDB4NTA0OSwgMHg1MERFLCAweDdERUYsIDB4OEIwMiwgMHg4ODVCLCAweDgwNUUsIDB4N0QwQiwgMHg3QTY5LAorICAgIDB4NTU0RiwgMHg2NEJFLCAweDg3NzgsIDB4NkUyNiwgMHg3QUE5LCAweDU1REEsIDB4OTNBMiwgMHg3MENGLCAweDhBQTMsCisgICAgMHg3MTIxLCAweDg1NkEsIDB4NTg2MiwgMHg5NzI3LCAweDUyRDksIDB4OEFBNCwgMHg5MzJCLCAweDcyQTcsIDB4ODk3MiwKKyAgICAweDdGRDIsIDB4OTI5MSwgMHg2MjMyLCAweDdEMzAsIDB4ODc2NiwgMHg4RjQ0LCAweDVDRkQsIDB4NEZFMCwgMHg3MkY5LAorICAgIDB4NTY4NywgMHg5MzQxLCAweDlCQUUsIDB4N0U5NiwgMHg4Q0UyLCAweDkyOUMsIDB4OTU5MSwgMHg5ODZGLCAweDk2QUEsCisgICAgMHg3M0ZFLCAweDczN0IsIDB4N0UyMywgMHg5OTIxLCAweDYxQjIsIDB4N0RBQiwgMHg5NDcyLCAweDkxMDksIDB4OEE3MywKKyAgICAweDk3RkYsIDB4OTgwNSwgMHg4NTZELCAweDU2QzIsIDB4OTJCNywgMHg2NkM5LCAweDU2MkYsIDB4NTM1NCwgMHg2MzNFLAorICAgIDB4ODEwNSwgMHg4QUU3LCAweDVCRUIsIDB4NzAwOSwgMHg4QjFELCAweDkyQzUsIDB4OTFDMSwgMHg4MjA4LCAweDkyQjksCisgICAgMHg3RDg5LCAweDk4MDgsIDB4OEEzMSwgMHg3REQyLCAweDdFOEMsIDB4OEVEMiwgMHg2MUY4LCAweDkwNzgsIDB4NzY2QywKKyAgICAweDdENjIsIDB4NUI3OCwgMHg1MkRCLCAweDhBNjIsIDB4NUMwQiwgMHg5OUI0LCAweDhBMTMsIDB4OEEwQSwgMHg5MDVDLAorICAgIDB4NThEMywgMHg5RDA5LCAweDlEMjgsIDB4NTU1RSwgMHg0RTlFLCAweDhBMUQsIDB4OTVCOSwgMHg5RTdELCAweDU2QjQsCisgICAgMHg5ODU0LCAweDk1QkIsIDB4ODI3NywgMHg1M0FELCAweDc4NkYsIDB4OEFGQSwgMHg5QTU3LCAweDlEMjYsIDB4Njk0QSwKKyAgICAweDYzREEsIDB4NzYwRCwgMHg5NjdELCAweDc2NjIsIDB4OTkwQSwgMHg2QTIzLCAweDU4MkYsIDB4OEIyMSwgMHg4NUU1LAorICAgIDB4NzIzQSwgMHg5ODAxLCAweDY5NkQsIDB4ODQ0OSwgMHg5MUFCLCAweDkyQTUsIDB4OTgyNCwgMHg5MDdBLCAweDUxMDAsCisgICAgMHg4N0ZCLCAweDg1REQsIDB4NTEwNCwgMHg2MUI2LCAweDdGQTksIDB4OEE2MywgMHg4QjcwLCAweDhBQkMsIDB4OEI2RiwKKyAgICAweDdFNzksIDB4ODUyRCwgMHg5NjcwLCAweDkyODAsIDB4OThGMiwgMHg5NkIxLCAweDZBRkIsIDB4NUIzMCwgMHg5REY5LAorICAgIDB4NjFDOSwgMHg3RTkzLCAweDc0NjksIDB4ODdBMiwgMHg3MURGLCAweDcxOTIsIDB4ODgwNSwgMHg4RDBGLCAweDdBNEUsCisgICAgMHg1NUIyLCAweDY0QzEsIDB4NTBBRCwgMHg3NjcwLCAweDhFMzQsIDB4NTEyQSwgMHg2MTgyLCAweDkwRjUsIDB4OTIzRSwKKyAgICAweDczMzYsIDB4OEE5OCwgMHg4RjNGLCAweDk5MTgsIDB4OUI1QSwgMHg2RjAxLCAweDgyMDcsIDB4NURCQywgMHg4QTlFLAorICAgIDB4OUIzMSwgMHg3MzQ0LCAweDhCN0QsIDB4OTgxMCwgMHg5OUFELCAweDlEMUIsIDB4NkRGNSwgMHg4RjQ1LCAweDU3MTIsCisgICAgMHg1NEUxLCAweDU3MTMsIDB4N0RFMywgMHg5MDYwLCAweDk4NTgsIDB4N0QwNCwgMHg4RThELCAweDk0NzAsIDB4OTVCMiwKKyAgICAweDk2RjIsIDB4OTExNiwgMHg5Njk1LCAweDkwNEIsIDB4ODVGNCwgMHg5MTk2LCAweDY2ODgsIDB4OTZEQywgMHg4RjA5LAorICAgIDB4NjUyMiwgMHg2NkFCLCAweDhEMEEsIDB4OEQxQywgMHg4MURGLCAweDk0N0YsIDB4NjhENywgMHg3QUM4LCAweDhDQUMsCisgICAgMHg2NEM3LCAweDUyNDcsIDB4NkZBNCwgMHg4Q0NBLCAweDhEMDgsIDB4OEVDQiwgMHg5MzU4LCAweDk1OTgsIDB4OEE1MCwKKyAgICAweDlGNEIsIDB4NTBCNSwgMHg2QzA4LCAweDc2REUsIDB4NjVBQywgMHg4RjNFLCAweDVEODQsIDB4NjhFNywgMHg2MjMwLAorICAgIDB4N0RCQiwgMHg1RjM1LCAweDZGMzIsIDB4NUUzMywgMHg4Q0VDLCAweDgxMzksIDB4OEQ5OSwgMHg4N0M0LCAweDhGNEQsCisgICAgMHg5MzdBLCAweDkwMTksIDB4OEM5RSwgMHg5MURELCAweDUwNzUsIDB4OEEzQSwgMHg5M0FFLCAweDk2NjMsIDB4NUU0MCwKKyAgICAweDc2NjUsIDB4OTEyRCwgMHg4QjQ5LCAweDdFNTQsIDB4ODA3NywgMHg1N0Y3LCAweDg4NzksIDB4N0QxOSwgMHg2NDZGLAorICAgIDB4NjRGMiwgMHg1RTVGLCAweDhDRUEsIDB4NkVFRiwgMHg5NDE4LCAweDdENDIsIDB4N0EyRSwgMHg4MTZCLCAweDg4NDYsCisgICAgMHg4QjA1LCAweDhFRjgsIDB4NzZCQSwgMHg2NjVELCAweDlBNUYsIDB4OEFGOCwgMHg4QTg1LCAweDcxRUQsIDB4NzdEQSwKKyAgICAweDU2RDEsIDB4OENBRiwgMHg5NDQ0LCAweDdCQzksIDB4OTlEMCwgMHg1QzA4LCAweDc4REEsIDB4OEY0OSwgMHg4Q0ZBLAorICAgIDB4NkEwMSwgMHg4MzhBLCAweDg4REQsIDB4NTk5RCwgMHg1OEVGLCAweDcyQzAsIDB4OTMxMCwgMHg4RDA1LCAweDU4OUMsCisgICAgMHg3REI0LCAweDhBQzQsIDB4NkU5NiwgMHg2RkMxLCAweDhDQzcsIDB4NkYyQywgMHg3RDlDLCAweDdFM0QsIDB4N0UzMSwKKyAgICAweDkxMTIsIDB4OEE1QiwgMHg3RDQ0LCAweDk0N0QsIDB4NTVDNywgMHg1Mzk5LCAweDUzQjQsIDB4OTc2OCwgMHg4RDBCLAorICAgIDB4NTMyRCwgMHg1MzMxLCAweDhDRkUsIDB4NTI0NCwgMHg1MjhDLCAweDUyNzQsIDB4NTBCNCwgMHg1MDAwLCAweDUwOTYsCisgICAgMHg1MTE1LCAweDUxMDIsIDB4NTExNCwgMHg1MTNDLCAweDUxMzcsIDB4NTBFOCwgMHg1MEMyLCAweDUxM0IsIDB4NTExMCwKKyAgICAweDUxM0EsIDB4NTBDOSwgMHg3Q0Y0LCAweDlFQ0MsIDB4NTZDNSwgMHg5Q0VDLCAweDg5M0IsIDB4ODFFMCwgMHg4QTAxLAorICAgIDB4OEExMCwgMHg4QTBDLCAweDhBMTUsIDB4OEIzMywgMHg4QTRFLCAweDhBMjUsIDB4OEE0MSwgMHg4QTM2LCAweDhBNDYsCisgICAgMHg4QTU0LCAweDhBNTgsIDB4OEE1MiwgMHg4QTg2LCAweDhBODQsIDB4OEE3RiwgMHg4QTcwLCAweDhBN0MsIDB4OEE3NSwKKyAgICAweDhBNkMsIDB4OEE2RSwgMHg4QUNELCAweDhBRTIsIDB4OEE2MSwgMHg4QTlBLCAweDhBQTUsIDB4OEE5MSwgMHg4QTkyLAorICAgIDB4OEFDRiwgMHg4QUQxLCAweDhBQzksIDB4OEFEQiwgMHg4QUQ3LCAweDhBQzIsIDB4OEFCNiwgMHg4QUY2LCAweDhBRUIsCisgICAgMHg4QjE0LCAweDhCMDEsIDB4OEFFNCwgMHg4QUVELCAweDhBRkMsIDB4OEFGMywgMHg4QUU2LCAweDhBRUUsIDB4OEFERSwKKyAgICAweDhCMjgsIDB4OEI5QywgMHg4QjE2LCAweDhCMUEsIDB4OEIxMCwgMHg4QjJCLCAweDhCMkQsIDB4OEI1NiwgMHg4QjU5LAorICAgIDB4OEI0RSwgMHg4QjlFLCAweDhCNkIsIDB4OEI5NiwgMHg5NjU4LCAweDkxM0EsIDB4OTExNCwgMHg5MTM0LCAweDkwREYsCisgICAgMHg5MTM2LCAweDkxMDYsIDB4OTE0OCwgMHg4MkJCLCAweDUyRjEsIDB4NURGMCwgMHg1ODBBLCAweDU4RDksIDB4NThFMiwKKyAgICAweDU4RTAsIDB4NThEQSwgMHg1N0UxLCAweDU4NEYsIDB4NTgxNiwgMHg1ODUyLCAweDU4MUQsIDB4NTg2NCwgMHg4NThDLAorICAgIDB4ODU1MywgMHg4NUY2LCAweDgzQTcsIDB4ODQwNywgMHg4NEVGLCAweDgyRTcsIDB4ODYyMiwgMHg4NTI2LCAweDU4NEIsCisgICAgMHg3MTYyLCAweDg1NTgsIDB4ODRGRCwgMHg4NTRFLCAweDg1ODgsIDB4ODVCQSwgMHg3Mjk2LCAweDZFQ0UsIDB4ODU0MSwKKyAgICAweDg1Q0UsIDB4ODU1MiwgMHg4NEMwLCAweDg0NTIsIDB4ODQ2NCwgMHg4NDk0LCAweDg0MzUsIDB4ODU5RiwgMHg4NTU1LAorICAgIDB4OURBRiwgMHg4NDkzLCAweDdFMDgsIDB4ODU0NiwgMHg4NTYyLCAweDg1MUUsIDB4OUE0MCwgMHg4NjNBLCAweDkzQTMsCisgICAgMHg4NTc3LCAweDg2MUUsIDB4ODVGQSwgMHg4NjA0LCAweDg1RUEsIDB4ODYxQSwgMHg1OTY5LCAweDVDMzcsIDB4NjM2QiwKKyAgICAweDY0NzYsIDB4NjQ5RiwgMHg2NDUxLCAweDY0NUMsIDB4NjRCMywgMHg2NTA0LCAweDY1MTYsIDB4NjRGNywgMHg2NEZDLAorICAgIDB4NjUxQiwgMHg1NjMwLCAweDU2MzgsIDB4NTZDOCwgMHg1NkE2LCAweDU1MDQsIDB4NTRCQywgMHg1NjgwLCAweDU2NUQsCisgICAgMHg1NjYwLCAweDU2MzUsIDB4NTVGNiwgMHg1NjY2LCAweDU2NzIsIDB4NTY4QywgMHg1NjY1LCAweDU2MUMsIDB4NTYyRSwKKyAgICAweDU1RTksIDB4NTYxNiwgMHg1NkMwLCAweDU2MEQsIDB4NTZCMywgMHg1NkMxLCAweDU2NkYsIDB4OEY2MSwgMHg1NkI2LAorICAgIDB4NTY5NSwgMHg1NzA3LCAweDVFNDMsIDB4NUU2QywgMHg1RTU4LCAweDVFNTcsIDB4NUQ4NywgMHg1Q0Y0LCAweDVENTAsCisgICAgMHg1RDJDLCAweDVEQTcsIDB4NURBMCwgMHg1RDk3LCAweDVEMEQsIDB4NURCOCwgMHg1RDgxLCAweDVERDQsIDB4NUZBMCwKKyAgICAweDczNzcsIDB4NzM0MSwgMHg3MzZBLCAweDczM0IsIDB4NzM2QiwgMHg3MzgwLCAweDczN0MsIDB4OThFMCwgMHg5OTMzLAorICAgIDB4OThFOSwgMHg5OTNDLCAweDk4RUEsIDB4OThFQiwgMHg5OEVELCAweDk4RjQsIDB4OTkwOSwgMHg5OTExLCAweDk5MUIsCisgICAgMHg5OTM3LCAweDk5M0YsIDB4OTk0MywgMHg5OTQ4LCAweDk5NDksIDB4OTk0QSwgMHg5OTRDLCAweDk5NjIsIDB4NUVFMSwKKyAgICAweDhDRTEsIDB4NjFGQSwgMHg2MUFFLCAweDYxNkEsIDB4NjEzRSwgMHg2MEI1LCAweDYxMzQsIDB4NjFDQywgMHg2MTVGLAorICAgIDB4NjFFOCwgMHg2MEZCLCAweDYxMzcsIDB4NjBGMiwgMHg2MTczLCAweDYxMUMsIDB4NjE5MiwgMHg5NTgyLCAweDk1ODYsCisgICAgMHg5NUM4LCAweDk1OEUsIDB4OTU5NCwgMHg5NThDLCAweDk1RTUsIDB4OTVBRCwgMHg5NUFCLCAweDlCMkUsIDB4OTVBQywKKyAgICAweDk1QkUsIDB4OTVCNiwgMHg5QjI5LCAweDk1QkYsIDB4OTVCRCwgMHg5NUJDLCAweDk1QzMsIDB4OTVDQiwgMHg5NUQ0LAorICAgIDB4OTVEMCwgMHg5NUQ1LCAweDk1REUsIDB4NzA0MywgMHg2RjU5LCAweDcwMjcsIDB4NzAxOCwgMHg2RkZDLCAweDZEODcsCisgICAgMHg2RDc5LCAweDZFNUUsIDB4NkZBRSwgMHg3MDBGLCAweDZFRjgsIDB4NkY2RiwgMHg2REY2LCAweDZGN0YsIDB4NzAwNiwKKyAgICAweDZGQTAsIDB4NzAwQiwgMHg3MDY3LCAweDcwNDQsIDB4NzAwNSwgMHg2Rjc3LCAweDcwMjAsIDB4NzAxRiwgMHg3MDMyLAorICAgIDB4NzAyOCwgMHg3MDVELCAweDlBMkIsIDB4OTA4NywgMHg5MDE1LCAweDkwOTAsIDB4NUM2OCwgMHg1RjMzLCAweDVBRjUsCisgICAgMHg1QUQ3LCAweDVCMDAsIDB4NUE2RCwgMHg1QjA4LCAweDVCNEMsIDB4NUFBNywgMHg1QUZCLCAweDVCMEIsIDB4NUIyMSwKKyAgICAweDVCMkEsIDB4NUIxOSwgMHg5OUQ0LCAweDk5REYsIDB4OTlEOSwgMHg5QTM2LCAweDlBNUIsIDB4OTlEMSwgMHg5OUQ4LAorICAgIDB4OUE0RCwgMHg5QTRBLCAweDk5RTIsIDB4OUE2QSwgMHg5QTBGLCAweDlBMEQsIDB4OUEwNSwgMHg5QTQyLCAweDlBMkQsCisgICAgMHg5QTE2LCAweDlBNDEsIDB4OUEyRSwgMHg5QTM4LCAweDlBNDMsIDB4OUE0NCwgMHg5QTRGLCAweDlBNjUsIDB4OUE2NCwKKyAgICAweDdDRjksIDB4N0QwNiwgMHg3RDAyLCAweDdEMDcsIDB4N0QwOCwgMHg3RThBLCAweDdEMUMsIDB4N0QxNSwgMHg3RDEzLAorICAgIDB4N0QzQSwgMHg3RDMyLCAweDdEMzEsIDB4N0UxMCwgMHg3RDNDLCAweDdENDAsIDB4N0QzRiwgMHg3RDVELCAweDdENEUsCisgICAgMHg3RDczLCAweDdEODYsIDB4N0Q4MywgMHg3RDg4LCAweDdEQkUsIDB4N0RCQSwgMHg3RENCLCAweDdERDQsIDB4N0RDNCwKKyAgICAweDdEOUUsIDB4N0RBQywgMHg3REI5LCAweDdEQTMsIDB4N0RCMCwgMHg3REM3LCAweDdERDksIDB4N0RENywgMHg3REY5LAorICAgIDB4N0RGMiwgMHg3RTYyLCAweDdERTYsIDB4N0RGNiwgMHg3REYxLCAweDdFMEIsIDB4N0RFMSwgMHg3RTA5LCAweDdFMUQsCisgICAgMHg3RTFGLCAweDdFMUUsIDB4N0UyRCwgMHg3RTBBLCAweDdFMTEsIDB4N0U3RCwgMHg3RTM5LCAweDdFMzUsIDB4N0UzMiwKKyAgICAweDdFNDYsIDB4N0U0NSwgMHg3RTg4LCAweDdFNUEsIDB4N0U1MiwgMHg3RTZFLCAweDdFN0UsIDB4N0U3MCwgMHg3RTZGLAorICAgIDB4N0U5OCwgMHg3NEEzLCAweDc0NEIsIDB4NzRDRiwgMHg5ODBBLCAweDc0QkQsIDB4NzQzRiwgMHg3NDg5LCAweDc0QTYsCisgICAgMHg3NEQ0LCAweDc0REEsIDB4OTdEOSwgMHg5N0RFLCAweDk3REMsIDB4NjlBQSwgMHg2QUVBLCAweDY4OTgsIDB4NjhENiwKKyAgICAweDZBMDUsIDB4Njg5RiwgMHg2QURCLCAweDZBRjMsIDB4NkFFOCwgMHg2QURGLCAweDZBODksIDB4NjkwRiwgMHg2QTQ4LAorICAgIDB4Njk2OCwgMHg2OUJGLCAweDZBM0EsIDB4NkE5QywgMHg2QjEyLCAweDZCMUUsIDB4NkFERCwgMHg2OUU3LCAweDZCMEYsCisgICAgMHg2QjE2LCAweDZBRUMsIDB4NkFEQSwgMHg2QUY4LCAweDZBQjMsIDB4NkFFNywgMHg2QUEzLCAweDZBRDMsIDB4NkFERSwKKyAgICAweDZCQTQsIDB4NkI5RSwgMHg2QkFFLCAweDZCQUIsIDB4NkJBRiwgMHg4RUQ0LCAweDhFREIsIDB4OEVGMiwgMHg4RUZCLAorICAgIDB4OEY2NCwgMHg4RUY5LCAweDhFRkMsIDB4OEVFQiwgMHg4RUU0LCAweDhGNjIsIDB4OEVGQSwgMHg4RUZFLCAweDhGMEEsCisgICAgMHg4RjA3LCAweDhGMDUsIDB4OEYxMiwgMHg4RjI2LCAweDhGMUUsIDB4OEYxRiwgMHg4RjFDLCAweDhGMzMsIDB4OEY0NiwKKyAgICAweDhGNTQsIDB4NjIxNCwgMHg2MjI3LCAweDc1MEMsIDB4NjZDNywgMHg2NkM0LCAweDY2ODksIDB4NjZENiwgMHg4Q0MxLAorICAgIDB4OENCMCwgMHg4Q0JBLCAweDhDQkQsIDB4OEQwNCwgMHg4Q0IyLCAweDhDQzUsIDB4OEQxMCwgMHg4Q0QxLCAweDhDREEsCisgICAgMHg4Q0Q1LCAweDhDRUIsIDB4OENFNywgMHg4Q0ZCLCAweDg5OTgsIDB4ODlBQywgMHg4OUExLCAweDg5QkYsIDB4ODlBNiwKKyAgICAweDg5QUYsIDB4ODlCMiwgMHg4OUI3LCAweDZCRkYsIDB4NkMwQywgMHg2QzJDLCAweDcyNTgsIDB4NjcyNywgMHg4MTU2LAorICAgIDB4ODFEQSwgMHg4MTFCLCAweDgxQkUsIDB4ODE2MSwgMHg4MUNGLCAweDZCNUYsIDB4OThBRSwgMHg5OEFGLCAweDk4QjYsCisgICAgMHg5OEJDLCAweDk4QzYsIDB4OThDOCwgMHg4RjQyLCAweDlGNEYsIDB4NjU5NSwgMHg3MTZDLCAweDcxNTIsIDB4NzE5NywKKyAgICAweDcxQzEsIDB4NzFEQywgMHg3MUZFLCAweDc5QjAsIDB4Nzk4RSwgMHg3OUFBLCAweDYxREYsIDB4NjE2NCwgMHg2MUUzLAorICAgIDB4NjIwNywgMHg2RkE5LCAweDc4RUYsIDB4NzhBRCwgMHg3ODY4LCAweDc4QjgsIDB4NzkyQSwgMHg3OTMxLCAweDc4NjQsCisgICAgMHg3OEZELCAweDc4RTcsIDB4NzhFMywgMHg5Rjk1LCAweDc3OTgsIDB4Nzc1RSwgMHg3N0JDLCAweDdGODYsIDB4N0Y4OCwKKyAgICAweDkxRDIsIDB4OTFEMywgMHg5MUQ0LCAweDkxRDksIDB4OTFENywgMHg5MUQ1LCAweDkxRjcsIDB4OTFFNywgMHg5MUU0LAorICAgIDB4OTM0NiwgMHg5MUY1LCAweDkxRjksIDB4OTIwOCwgMHg5MjI2LCAweDkyNDUsIDB4OTIxMSwgMHg5MjEwLCAweDkyMDEsCisgICAgMHg5MjI3LCAweDkyMDQsIDB4OTIyNSwgMHg5MjAwLCAweDkyM0EsIDB4OTI2NiwgMHg5MjM3LCAweDkyMzMsIDB4OTI1NSwKKyAgICAweDkyM0QsIDB4OTIzOCwgMHg5MjVFLCAweDkyNkMsIDB4OTI2RCwgMHg5MjNGLCAweDk0NjAsIDB4OTIzMCwgMHg5MjQ5LAorICAgIDB4OTI0OCwgMHg5MjRELCAweDkyMkUsIDB4OTIzOSwgMHg5NDM4LCAweDkyQUMsIDB4OTJBMCwgMHg5MjdBLCAweDkyQUEsCisgICAgMHg5MkVFLCAweDkyQ0YsIDB4OTQwMywgMHg5MkUzLCAweDk0M0EsIDB4OTJCMSwgMHg5MkE2LCAweDkzQTcsIDB4OTI5NiwKKyAgICAweDkyQ0MsIDB4OTJBOSwgMHg5M0Y1LCAweDkyOTMsIDB4OTI3RiwgMHg5M0E5LCAweDkyOUEsIDB4OTMxQSwgMHg5MkFCLAorICAgIDB4OTI4MywgMHg5NDBCLCAweDkyQTgsIDB4OTJBMywgMHg5NDEyLCAweDkzMzgsIDB4OTJGMSwgMHg5M0Q3LCAweDkyRTUsCisgICAgMHg5MkYwLCAweDkyRUYsIDB4OTJFOCwgMHg5MkJDLCAweDkyREQsIDB4OTJGNiwgMHg5NDI2LCAweDk0MjcsIDB4OTJDMywKKyAgICAweDkyREYsIDB4OTJFNiwgMHg5MzEyLCAweDkzMDYsIDB4OTM2OSwgMHg5MzFCLCAweDkzNDAsIDB4OTMwMSwgMHg5MzE1LAorICAgIDB4OTMyRSwgMHg5MzQzLCAweDkzMDcsIDB4OTMwOCwgMHg5MzFGLCAweDkzMTksIDB4OTM2NSwgMHg5MzQ3LCAweDkzNzYsCisgICAgMHg5MzU0LCAweDkzNjQsIDB4OTNBQSwgMHg5MzcwLCAweDkzODQsIDB4OTNFNCwgMHg5M0Q4LCAweDk0MjgsIDB4OTM4NywKKyAgICAweDkzQ0MsIDB4OTM5OCwgMHg5M0I4LCAweDkzQkYsIDB4OTNBNiwgMHg5M0IwLCAweDkzQjUsIDB4OTQ0QywgMHg5M0UyLAorICAgIDB4OTNEQywgMHg5M0RELCAweDkzQ0QsIDB4OTNERSwgMHg5M0MzLCAweDkzQzcsIDB4OTNEMSwgMHg5NDE0LCAweDk0MUQsCisgICAgMHg5M0Y3LCAweDk0NjUsIDB4OTQxMywgMHg5NDZELCAweDk0MjAsIDB4OTQ3OSwgMHg5M0Y5LCAweDk0MTksIDB4OTQ0QSwKKyAgICAweDk0MzIsIDB4OTQzRiwgMHg5NDU0LCAweDk0NjMsIDB4OTM3RSwgMHg3QTYxLCAweDlDRTksIDB4OUNGNiwgMHg5RDA3LAorICAgIDB4OUQwNiwgMHg5RDIzLCAweDlEODcsIDB4OUUxNSwgMHg5RDFELCAweDlEMUYsIDB4OURFNSwgMHg5RDJGLCAweDlERDksCisgICAgMHg5RDMwLCAweDlENDIsIDB4OUUxRSwgMHg5RDUzLCAweDlFMUQsIDB4OUQ2MCwgMHg5RDUyLCAweDlERjMsIDB4OUQ1QywKKyAgICAweDlENjEsIDB4OUQ5MywgMHg5RDZBLCAweDlENkYsIDB4OUQ4OSwgMHg5RDk4LCAweDlEOUEsIDB4OURDMCwgMHg5REE1LAorICAgIDB4OURBOSwgMHg5REMyLCAweDlEQkMsIDB4OUUxQSwgMHg5REQzLCAweDlEREEsIDB4OURFRiwgMHg5REU2LCAweDlERjIsCisgICAgMHg5REY4LCAweDlFMEMsIDB4OURGQSwgMHg5RTFCLCAweDc2NjQsIDB4NzY1OCwgMHg3NjY3LCAweDc2MDIsIDB4NzY0NiwKKyAgICAweDc2NDcsIDB4NzY0OSwgMHg3NjFFLCAweDc2M0IsIDB4NzY2RCwgMHg3NjZFLCAweDc2NjksIDB4NzY3MiwgMHg3QUM3LAorICAgIDB4N0FCNiwgMHg4OTYwLCAweDg5MzMsIDB4ODk1RCwgMHg4OTQ3LCAweDg5MzgsIDB4ODk2NCwgMHg3NkI4LCAweDgwMkUsCisgICAgMHg4MDJDLCAweDgwNzksIDB4ODA3NSwgMHg5ODA3LCAweDk4MEUsIDB4OTgwRiwgMHg5ODIxLCAweDk4MUMsIDB4NkY0MSwKKyAgICAweDk4MjYsIDB4OTgzNywgMHg5ODRFLCAweDk4NTMsIDB4OTg3MywgMHg5ODYyLCAweDk4NTksIDB4OTg2NSwgMHg5ODZDLAorICAgIDB4OTg3MCwgMHg4N0UzLCAweDg4MDYsIDB4ODcwNiwgMHg4ODIzLCAweDg3RjYsIDB4ODZGQSwgMHg4N0VGLCAweDg3ODQsCisgICAgMHg4ODEwLCAweDg3QzgsIDB4ODgxMSwgMHg4N0JCLCAweDg3Q0UsIDB4N0Y0QywgMHg3QkU0LCAweDdCNjcsIDB4N0M2OSwKKyAgICAweDdCRjMsIDB4N0MwMCwgMHg3QkNCLCAweDdDNUMsIDB4N0MxRSwgMHg3QzJCLCAweDdDMjMsIDB4N0M2QSwgMHg3QzVGLAorICAgIDB4ODI2NCwgMHg4MjZCLCAweDg4Q0EsIDB4N0ZBNSwgMHg3Q0YyLCAweDdDRjYsIDB4N0NERCwgMHg3RTM2LCAweDlFQTksCisgICAgMHg4REIyLCAweDkxQzUsIDB4OTFDMywgMHg5RTdBLCAweDhFODksIDB4OEU0QywgMHg4RTkyLCAweDhFN0EsIDB4OEU1NSwKKyAgICAweDhFOUEsIDB4OEU4QiwgMHg4RTkzLCAweDhFOTEsIDB4OEVBMSwgMHg4RTYzLCAweDhFQUEsIDB4OEVBNiwgMHg4OUY0LAorICAgIDB4ODlGNiwgMHg5NzVBLCAweDk3NDIsIDB4OTczRCwgMHg5NzQ0LCAweDlGNTQsIDB4OUY1RiwgMHg5RjU5LCAweDlGNjAsCisgICAgMHg5RjVDLCAweDlGNjYsIDB4OUY2QywgMHg5RjZBLCAweDlGNzcsIDB4OUVGRCwgMHg5RUZGLCAweDlGMDksIDB4OEI4RSwKKyAgICAweDk0N0UsIDB4OTNFOCwgMHg5Qjc3LCAweDlCNzQsIDB4OUI4MSwgMHg5QjgzLCAweDlCOEUsIDB4OUM3OCwgMHg3QTRDLAorICAgIDB4OUI5MiwgMHg5QzVGLCAweDlCOTAsIDB4OUJBRCwgMHg5QjlBLCAweDlCQUEsIDB4OUI5RSwgMHg5QzZELCAweDlCQUIsCisgICAgMHg5QjlELCAweDlDNTgsIDB4OUJDMSwgMHg5QzdBLCAweDlDMzEsIDB4OUMzOSwgMHg5QzIzLCAweDlDMzcsIDB4OUJDMCwKKyAgICAweDlCQ0EsIDB4OUJDNywgMHg5QkZELCAweDlCRDYsIDB4OUJFQSwgMHg5QkVCLCAweDlCRTEsIDB4OUJFNCwgMHg5QkU3LAorICAgIDB4OUJERCwgMHg5QkUyLCAweDlCRjAsIDB4OUJEQiwgMHg5QkY0LCAweDlCRDQsIDB4OUM1RCwgMHg5QzA4LCAweDlDMTAsCisgICAgMHg5QzBELCAweDlDMTIsIDB4OUMwOSwgMHg5QkZGLCAweDlDMjAsIDB4OUMzMiwgMHg5QzJELCAweDlDMjgsIDB4OUMyNSwKKyAgICAweDlDMjksIDB4OUMzMywgMHg5QzNFLCAweDlDNDgsIDB4OUMzQiwgMHg5QzM1LCAweDlDNDUsIDB4OUM1NiwgMHg5QzU0LAorICAgIDB4OUM1MiwgMHg5QzY3LCAweDk3QzMsIDB4OTdCRCwgMHg5N0M5LCAweDlEQkIsIDB4OUFDRiwgMHg5QUQ2LCAweDlBRDUsCisgICAgMHg5QjU4LCAweDlCNEUsIDB4OTk1NywgMHg5OTVDLCAweDlCMjIsIDB4OUVGNywgMHg5RUYyLCAweDg5NkMsIDB4OTVDNiwKKyAgICAweDkzMzYsIDB4NUY0NiwgMHg4NTE0LCAweDdFOTQsIDB4OUY2MywgMHg1Njc5LCAweDlGMTUsIDB4NTY0MSwgMHg5QUVFLAorICAgIDB4ODkwNywgMHg3QTQwLCAweDk4QjMsIDB4OTVBNCwgMHg5QjBELCAweDhGRjQsIDB4NUY1OSwgMHg3QTZCLCAweDk4RTIsCisgICAgMHg1MEEyLCAweDg1OTEsIDB4NTExOCwgMHg2MzcyLCAweDUyNEIsIDB4Nzc0RiwgMHg3RThELCAweDY2QzYsIDB4NzdBRCwKKyAgICAweDlFNzUsIDB4NTZDOSwgMHg5RUY0LCAweDZGREIsIDB4NjFERSwgMHg3N0M3LCAweDcwMzAsIDB4OUVCNSwgMHg4ODRBLAorICAgIDB4OTVFMiwgMHg5N0M2LCAweDdDNjQsIDB4N0UzNCwgMHg5N0E2LCAweDlFQUYsIDB4NTZDQywgMHg5OEIxLCAweDZBQUYsCisgICAgMHg3RjRFLCAweDdDRjAsIDB4NEZDMiwgMHg3RTZCLCAweDlFNzksIDB4NTZBRSwgMHg5QjFBLCAweDg0NkYsIDB4NzlBNiwKKyAgICAweDdDNzIsIDB4OUFEMiwgMHg5NkJCLCAweDdERkIsIDB4ODhGRCwgMHg3ODQzLCAweDIxNzAsIDB4MjE3MSwgMHgyMTcyLAorICAgIDB4MjE3MywgMHgyMTc0LCAweDIxNzUsIDB4MjE3NiwgMHgyMTc3LCAweDIxNzgsIDB4MjE3OSwgMHgwMkNBLCAweDAyQ0IsCisgICAgMHgwMkQ5LCAweDIwMTMsIDB4MjAxNSwgMHgyMDI1LCAweDIwMzUsIDB4MjEwNSwgMHgyMTA5LCAweDIxOTYsIDB4MjE5NywKKyAgICAweDIxOTgsIDB4MjE5OSwgMHgyMjE1LCAweDIyMUYsIDB4MjIyMywgMHgyMjUyLCAweDIyNjYsIDB4MjI2NywgMHgyMkJGLAorICAgIDB4MjU1MCwgMHgyNTUxLCAweDI1NTIsIDB4MjU1MywgMHgyNTU0LCAweDI1NTUsIDB4MjU1NiwgMHgyNTU3LCAweDI1NTgsCisgICAgMHgyNTU5LCAweDI1NUEsIDB4MjU1QiwgMHgyNTVDLCAweDI1NUQsIDB4MjU1RSwgMHgyNTVGLCAweDI1NjAsIDB4MjU2MSwKKyAgICAweDI1NjIsIDB4MjU2MywgMHgyNTY0LCAweDI1NjUsIDB4MjU2NiwgMHgyNTY3LCAweDI1NjgsIDB4MjU2OSwgMHgyNTZBLAorICAgIDB4MjU2QiwgMHgyNTZDLCAweDI1NkQsIDB4MjU2RSwgMHgyNTZGLCAweDI1NzAsIDB4MjU3MSwgMHgyNTcyLCAweDI1NzMsCisgICAgMHgyNTgxLCAweDI1ODIsIDB4MjU4MywgMHgyNTg0LCAweDI1ODUsIDB4MjU4NiwgMHgyNTg3LCAweDI1ODgsIDB4MjU4OSwKKyAgICAweDI1OEEsIDB4MjU4QiwgMHgyNThDLCAweDI1OEQsIDB4MjU4RSwgMHgyNThGLCAweDI1OTMsIDB4MjU5NCwgMHgyNTk1LAorICAgIDB4MjVCQywgMHgyNUJELCAweDI1RTIsIDB4MjVFMywgMHgyNUU0LCAweDI1RTUsIDB4MjYwOSwgMHgyMjk1LCAweDMwMTIsCisgICAgMHgzMDFELCAweDMwMUUsIDB4MzAyMSwgMHgzMDIyLCAweDMwMjMsIDB4MzAyNCwgMHgzMDI1LCAweDMwMjYsIDB4MzAyNywKKyAgICAweDMwMjgsIDB4MzAyOSwgMHgzMkEzLCAweDMzOEUsIDB4MzM4RiwgMHgzMzlDLCAweDMzOUQsIDB4MzM5RSwgMHgzM0ExLAorICAgIDB4MzNDNCwgMHgzM0NFLCAweDMzRDEsIDB4MzNEMiwgMHgzM0Q1LCAweEZFMzAsIDB4RkZFMiwgMHhGRkU0LCAweDIxMjEsCisgICAgMHgzMjMxLCAweDIwMTAsIDB4MzBGQywgMHgzMDlCLCAweDMwOUMsIDB4MzBGRCwgMHgzMEZFLCAweDMwMDYsIDB4MzA5RCwKKyAgICAweDMwOUUsIDB4RkU0OSwgMHhGRTRBLCAweEZFNEIsIDB4RkU0QywgMHhGRTRELCAweEZFNEUsIDB4RkU0RiwgMHhGRTUwLAorICAgIDB4RkU1MSwgMHhGRTUyLCAweEZFNTQsIDB4RkU1NSwgMHhGRTU2LCAweEZFNTcsIDB4RkU1OSwgMHhGRTVBLCAweEZFNUIsCisgICAgMHhGRTVDLCAweEZFNUQsIDB4RkU1RSwgMHhGRTVGLCAweEZFNjAsIDB4RkU2MSwgMHhGRTYyLCAweEZFNjMsIDB4RkU2NCwKKyAgICAweEZFNjUsIDB4RkU2NiwgMHhGRTY4LCAweEZFNjksIDB4RkU2QSwgMHhGRTZCLCAweDMwM0UsIDB4MkZGMCwgMHgyRkYxLAorICAgIDB4MkZGMiwgMHgyRkYzLCAweDJGRjQsIDB4MkZGNSwgMHgyRkY2LCAweDJGRjcsIDB4MkZGOCwgMHgyRkY5LCAweDJGRkEsCisgICAgMHgyRkZCLCAweDRFMDIsIDB4NEUwNCwgMHg0RTA1LCAweDRFMDYsIDB4NEUwRiwgMHg0RTEyLCAweDRFMTcsIDB4NEUxRiwKKyAgICAweDRFMjAsIDB4NEUyMSwgMHg0RTIzLCAweDRFMjYsIDB4NEUyOSwgMHg0RTJFLCAweDRFMkYsIDB4NEUzMSwgMHg0RTMzLAorICAgIDB4NEUzNSwgMHg0RTM3LCAweDRFM0MsIDB4NEU0MCwgMHg0RTQxLCAweDRFNDIsIDB4NEU0NCwgMHg0RTQ2LCAweDRFNEEsCisgICAgMHg0RTUxLCAweDRFNTUsIDB4NEU1NywgMHg0RTVBLCAweDRFNUIsIDB4NEU2MiwgMHg0RTYzLCAweDRFNjQsIDB4NEU2NSwKKyAgICAweDRFNjcsIDB4NEU2OCwgMHg0RTZBLCAweDRFNkIsIDB4NEU2QywgMHg0RTZELCAweDRFNkUsIDB4NEU2RiwgMHg0RTcyLAorICAgIDB4NEU3NCwgMHg0RTc1LCAweDRFNzYsIDB4NEU3NywgMHg0RTc4LCAweDRFNzksIDB4NEU3QSwgMHg0RTdCLCAweDRFN0MsCisgICAgMHg0RTdELCAweDRFN0YsIDB4NEU4MCwgMHg0RTgxLCAweDRFODMsIDB4NEU4NCwgMHg0RTg1LCAweDRFODcsIDB4NEU4QSwKKyAgICAweDRFOTAsIDB4NEU5NiwgMHg0RTk3LCAweDRFOTksIDB4NEU5QywgMHg0RTlELCAweDRFQTMsIDB4NEVBQSwgMHg0RUFGLAorICAgIDB4NEVCMCwgMHg0RUIxLCAweDRFQjQsIDB4NEVCNiwgMHg0RUI3LCAweDRFQjgsIDB4NEVCOSwgMHg0RUJDLCAweDRFQkQsCisgICAgMHg0RUJFLCAweDRFQzgsIDB4NEVDQywgMHg0RUNGLCAweDRFRDAsIDB4NEVEMiwgMHg0RURBLCAweDRFREIsIDB4NEVEQywKKyAgICAweDRFRTAsIDB4NEVFMiwgMHg0RUU2LCAweDRFRTcsIDB4NEVFOSwgMHg0RUVELCAweDRFRUUsIDB4NEVFRiwgMHg0RUYxLAorICAgIDB4NEVGNCwgMHg0RUY4LCAweDRFRjksIDB4NEVGQSwgMHg0RUZDLCAweDRFRkUsIDB4NEYwMCwgMHg0RjAyLCAweDRGMDMsCisgICAgMHg0RjA0LCAweDRGMDUsIDB4NEYwNiwgMHg0RjA3LCAweDRGMDgsIDB4NEYwQiwgMHg0RjBDLCAweDRGMTIsIDB4NEYxMywKKyAgICAweDRGMTQsIDB4NEYxNSwgMHg0RjE2LCAweDRGMUMsIDB4NEYxRCwgMHg0RjIxLCAweDRGMjMsIDB4NEYyOCwgMHg0RjI5LAorICAgIDB4NEYyQywgMHg0RjJELCAweDRGMkUsIDB4NEYzMSwgMHg0RjMzLCAweDRGMzUsIDB4NEYzNywgMHg0RjM5LCAweDRGM0IsCisgICAgMHg0RjNFLCAweDRGM0YsIDB4NEY0MCwgMHg0RjQxLCAweDRGNDIsIDB4NEY0NCwgMHg0RjQ1LCAweDRGNDcsIDB4NEY0OCwKKyAgICAweDRGNDksIDB4NEY0QSwgMHg0RjRCLCAweDRGNEMsIDB4NEY1MiwgMHg0RjU0LCAweDRGNTYsIDB4NEY2MSwgMHg0RjYyLAorICAgIDB4NEY2NiwgMHg0RjY4LCAweDRGNkEsIDB4NEY2QiwgMHg0RjZELCAweDRGNkUsIDB4NEY3MSwgMHg0RjcyLCAweDRGNzUsCisgICAgMHg0Rjc3LCAweDRGNzgsIDB4NEY3OSwgMHg0RjdBLCAweDRGN0QsIDB4NEY4MCwgMHg0RjgxLCAweDRGODIsIDB4NEY4NSwKKyAgICAweDRGODcsIDB4NEY4QSwgMHg0RjhDLCAweDRGOEUsIDB4NEY5MCwgMHg0RjkyLCAweDRGOTMsIDB4NEY5NSwgMHg0Rjk4LAorICAgIDB4NEY5OSwgMHg0RjlBLCAweDRGOUMsIDB4NEY5RSwgMHg0RjlGLCAweDRGQTEsIDB4NEZBMiwgMHg0RkE0LCAweDRGQUIsCisgICAgMHg0RkFELCAweDRGQjAsIDB4NEZCMSwgMHg0RkIyLCAweDRGQjMsIDB4NEZCNCwgMHg0RkI2LCAweDRGQjcsIDB4NEZCOCwKKyAgICAweDRGQjksIDB4NEZCQSwgMHg0RkJCLCAweDRGQkMsIDB4NEZCRCwgMHg0RkJFLCAweDRGQzAsIDB4NEZDMSwgMHg0RkM2LAorICAgIDB4NEZDNywgMHg0RkM4LCAweDRGQzksIDB4NEZDQiwgMHg0RkNDLCAweDRGQ0QsIDB4NEZEMiwgMHg0RkQzLCAweDRGRDQsCisgICAgMHg0RkQ1LCAweDRGRDYsIDB4NEZEOSwgMHg0RkRCLCAweDRGRTIsIDB4NEZFNCwgMHg0RkU1LCAweDRGRTcsIDB4NEZFQiwKKyAgICAweDRGRUMsIDB4NEZGMCwgMHg0RkYyLCAweDRGRjQsIDB4NEZGNSwgMHg0RkY2LCAweDRGRjcsIDB4NEZGOSwgMHg0RkZCLAorICAgIDB4NEZGQywgMHg0RkZELCAweDRGRkYsIDB4NTAwMSwgMHg1MDAyLCAweDUwMDMsIDB4NTAwNCwgMHg1MDA1LCAweDUwMDcsCisgICAgMHg1MDA4LCAweDUwMEEsIDB4NTAwRSwgMHg1MDEwLCAweDUwMTMsIDB4NTAxNSwgMHg1MDE2LCAweDUwMTcsIDB4NTAxQiwKKyAgICAweDUwMUQsIDB4NTAxRSwgMHg1MDIwLCAweDUwMjIsIDB4NTAyMywgMHg1MDI0LCAweDUwMjcsIDB4NTAyRiwgMHg1MDMwLAorICAgIDB4NTAzMSwgMHg1MDMyLCAweDUwMzMsIDB4NTAzNCwgMHg1MDM1LCAweDUwMzYsIDB4NTAzNywgMHg1MDM4LCAweDUwMzksCisgICAgMHg1MDNCLCAweDUwM0QsIDB4NTAzRiwgMHg1MDQwLCAweDUwNDEsIDB4NTA0MiwgMHg1MDQ0LCAweDUwNDUsIDB4NTA0NiwKKyAgICAweDUwNEEsIDB4NTA0QiwgMHg1MDRELCAweDUwNTAsIDB4NTA1MSwgMHg1MDUyLCAweDUwNTMsIDB4NTA1NCwgMHg1MDU2LAorICAgIDB4NTA1NywgMHg1MDU4LCAweDUwNTksIDB4NTA1QiwgMHg1MDVELCAweDUwNUUsIDB4NTA1RiwgMHg1MDYwLCAweDUwNjEsCisgICAgMHg1MDYyLCAweDUwNjMsIDB4NTA2NCwgMHg1MDY2LCAweDUwNjcsIDB4NTA2OCwgMHg1MDY5LCAweDUwNkEsIDB4NTA2QiwKKyAgICAweDUwNkQsIDB4NTA2RSwgMHg1MDZGLCAweDUwNzAsIDB4NTA3MSwgMHg1MDcyLCAweDUwNzMsIDB4NTA3OCwgMHg1MDc5LAorICAgIDB4NTA3QSwgMHg1MDdDLCAweDUwN0QsIDB4NTA4MSwgMHg1MDgyLCAweDUwODMsIDB4NTA4NCwgMHg1MDg2LCAweDUwODcsCisgICAgMHg1MDg5LCAweDUwOEEsIDB4NTA4QiwgMHg1MDhDLCAweDUwOEUsIDB4NTA4RiwgMHg1MDkwLCAweDUwOTEsIDB4NTA5MiwKKyAgICAweDUwOTMsIDB4NTA5NCwgMHg1MDk1LCAweDUwOTcsIDB4NTA5QSwgMHg1MDlCLCAweDUwOUMsIDB4NTA5RCwgMHg1MDlFLAorICAgIDB4NTA5RiwgMHg1MEEwLCAweDUwQTEsIDB4NTBBNCwgMHg1MEE2LCAweDUwQUEsIDB4NTBBQiwgMHg1MEFFLCAweDUwQUYsCisgICAgMHg1MEIwLCAweDUwQjEsIDB4NTBCNiwgMHg1MEI4LCAweDUwQjksIDB4NTBCQywgMHg1MEJELCAweDUwQkYsIDB4NTBDMCwKKyAgICAweDUwQzEsIDB4NTBDMywgMHg1MEM0LCAweDUwQzYsIDB4NTBDNywgMHg1MEM4LCAweDUwQ0EsIDB4NTBDQiwgMHg1MENDLAorICAgIDB4NTBDRCwgMHg1MENFLCAweDUwRDAsIDB4NTBEMiwgMHg1MEQzLCAweDUwRDQsIDB4NTBENywgMHg1MEQ4LCAweDUwRDksCisgICAgMHg1MERCLCAweDUwREMsIDB4NTBERCwgMHg1MERGLCAweDUwRTAsIDB4NTBFMSwgMHg1MEUyLCAweDUwRTMsIDB4NTBFNCwKKyAgICAweDUwRTksIDB4NTBFQSwgMHg1MEVCLCAweDUwRUYsIDB4NTBGMCwgMHg1MEYxLCAweDUwRjIsIDB4NTBGNCwgMHg1MEY2LAorICAgIDB4NTBGNywgMHg1MEY4LCAweDUwRkEsIDB4NTBGQywgMHg1MEZELCAweDUwRkUsIDB4NTBGRiwgMHg1MTAxLCAweDUxMDMsCisgICAgMHg1MTA1LCAweDUxMEEsIDB4NTEwQywgMHg1MTBELCAweDUxMEUsIDB4NTEwRiwgMHg1MTExLCAweDUxMTMsIDB4NTExNiwKKyAgICAweDUxMTcsIDB4NTExOSwgMHg1MTFBLCAweDUxMUIsIDB4NTExQywgMHg1MTFELCAweDUxMUUsIDB4NTEyMCwgMHg1MTIyLAorICAgIDB4NTEyMywgMHg1MTI0LCAweDUxMjUsIDB4NTEyNiwgMHg1MTI3LCAweDUxMjgsIDB4NTEyOSwgMHg1MTJCLCAweDUxMkMsCisgICAgMHg1MTJELCAweDUxMkUsIDB4NTEyRiwgMHg1MTMwLCAweDUxMzEsIDB4NTEzMywgMHg1MTM0LCAweDUxMzUsIDB4NTEzNiwKKyAgICAweDUxMzgsIDB4NTEzOSwgMHg1MTNELCAweDUxM0UsIDB4NTE0MiwgMHg1MTQ3LCAweDUxNEEsIDB4NTE0QywgMHg1MTRFLAorICAgIDB4NTE0RiwgMHg1MTUwLCAweDUxNTMsIDB4NTE1NywgMHg1MTU4LCAweDUxNTksIDB4NTE1QiwgMHg1MTVELCAweDUxNUUsCisgICAgMHg1MTVGLCAweDUxNjAsIDB4NTE2MSwgMHg1MTYzLCAweDUxNjQsIDB4NTE2NiwgMHg1MTY3LCAweDUxNkEsIDB4NTE2RiwKKyAgICAweDUxNzIsIDB4NTE3QSwgMHg1MTdFLCAweDUxN0YsIDB4NTE4MywgMHg1MTg0LCAweDUxODYsIDB4NTE4NywgMHg1MThBLAorICAgIDB4NTE4QiwgMHg1MThFLCAweDUxOEYsIDB4NTE5MCwgMHg1MTkxLCAweDUxOTMsIDB4NTE5NCwgMHg1MTk4LCAweDUxOUEsCisgICAgMHg1MTlELCAweDUxOUUsIDB4NTE5RiwgMHg1MUExLCAweDUxQTMsIDB4NTFBNiwgMHg1MUE3LCAweDUxQTgsIDB4NTFBOSwKKyAgICAweDUxQUEsIDB4NTFBRCwgMHg1MUFFLCAweDUxQjQsIDB4NTFCOCwgMHg1MUI5LCAweDUxQkEsIDB4NTFCRSwgMHg1MUJGLAorICAgIDB4NTFDMSwgMHg1MUMyLCAweDUxQzMsIDB4NTFDNSwgMHg1MUM4LCAweDUxQ0EsIDB4NTFDRSwgMHg1MUQwLCAweDUxRDIsCisgICAgMHg1MUQzLCAweDUxRDQsIDB4NTFENSwgMHg1MUQ2LCAweDUxRDcsIDB4NTFEOCwgMHg1MUQ5LCAweDUxREEsIDB4NTFEQywKKyAgICAweDUxREUsIDB4NTFERiwgMHg1MUUyLCAweDUxRTMsIDB4NTFFNSwgMHg1MUU2LCAweDUxRTcsIDB4NTFFOCwgMHg1MUU5LAorICAgIDB4NTFFQSwgMHg1MUVDLCAweDUxRUUsIDB4NTFGMiwgMHg1MUY0LCAweDUxRjcsIDB4NTFGRSwgMHg1MjA0LCAweDUyMDUsCisgICAgMHg1MjA5LCAweDUyMEIsIDB4NTIwQywgMHg1MjBGLCAweDUyMTAsIDB4NTIxMywgMHg1MjE0LCAweDUyMTUsIDB4NTIxQywKKyAgICAweDUyMUUsIDB4NTIxRiwgMHg1MjIxLCAweDUyMjIsIDB4NTIyMywgMHg1MjI1LCAweDUyMjYsIDB4NTIyNywgMHg1MjJBLAorICAgIDB4NTIyQywgMHg1MjJGLCAweDUyMzEsIDB4NTIzMiwgMHg1MjM0LCAweDUyMzUsIDB4NTIzQywgMHg1MjNFLCAweDUyNDUsCisgICAgMHg1MjQ2LCAweDUyNDgsIDB4NTI0OSwgMHg1MjRFLCAweDUyNEYsIDB4NTI1MiwgMHg1MjUzLCAweDUyNTUsIDB4NTI1NywKKyAgICAweDUyNTgsIDB4NTI1OSwgMHg1MjVBLCAweDUyNUQsIDB4NTI1RiwgMHg1MjYwLCAweDUyNjIsIDB4NTI2MywgMHg1MjY0LAorICAgIDB4NTI2NiwgMHg1MjY4LCAweDUyNkIsIDB4NTI2QywgMHg1MjZELCAweDUyNzAsIDB4NTI3MSwgMHg1MjczLCAweDUyNzYsCisgICAgMHg1Mjc3LCAweDUyNzgsIDB4NTI3OSwgMHg1MjdBLCAweDUyN0IsIDB4NTI3QywgMHg1MjdFLCAweDUyODAsIDB4NTI4NCwKKyAgICAweDUyODUsIDB4NTI4NiwgMHg1MjhCLCAweDUyOEUsIDB4NTI4RiwgMHg1MjkyLCAweDUyOTQsIDB4NTI5NSwgMHg1Mjk2LAorICAgIDB4NTI5NywgMHg1Mjk4LCAweDUyOTksIDB4NTI5QSwgMHg1MjlDLCAweDUyQTQsIDB4NTJBNSwgMHg1MkE2LCAweDUyQTcsCisgICAgMHg1MkFFLCAweDUyQUYsIDB4NTJCMCwgMHg1MkI0LCAweDUyQjUsIDB4NTJCNiwgMHg1MkI3LCAweDUyQjgsIDB4NTJCOSwKKyAgICAweDUyQkEsIDB4NTJCQiwgMHg1MkJDLCAweDUyQkQsIDB4NTJDMCwgMHg1MkMyLCAweDUyQzQsIDB4NTJDNSwgMHg1MkM2LAorICAgIDB4NTJDOCwgMHg1MkNBLCAweDUyQ0MsIDB4NTJDRCwgMHg1MkNFLCAweDUyQ0YsIDB4NTJEMSwgMHg1MkQzLCAweDUyRDQsCisgICAgMHg1MkQ3LCAweDUyREEsIDB4NTJEQywgMHg1MkUwLCAweDUyRTEsIDB4NTJFMywgMHg1MkU1LCAweDUyRTYsIDB4NTJFNywKKyAgICAweDUyRTgsIDB4NTJFOSwgMHg1MkVBLCAweDUyRUIsIDB4NTJFQywgMHg1MkVELCAweDUyRUUsIDB4NTJFRiwgMHg1MkYyLAorICAgIDB4NTJGMywgMHg1MkY0LCAweDUyRjYsIDB4NTJGNywgMHg1MkZCLCAweDUyRkMsIDB4NTJGRCwgMHg1MzAxLCAweDUzMDIsCisgICAgMHg1MzAzLCAweDUzMDQsIDB4NTMwNywgMHg1MzA5LCAweDUzMEEsIDB4NTMwQiwgMHg1MzBDLCAweDUzMEUsIDB4NTMxMSwKKyAgICAweDUzMTIsIDB4NTMxMywgMHg1MzE0LCAweDUzMTgsIDB4NTMxQiwgMHg1MzFDLCAweDUzMUUsIDB4NTMxRiwgMHg1MzIyLAorICAgIDB4NTMyNCwgMHg1MzI1LCAweDUzMjcsIDB4NTMyOCwgMHg1MzI5LCAweDUzMkIsIDB4NTMyQywgMHg1MzMwLCAweDUzMzIsCisgICAgMHg1MzMzLCAweDUzMzQsIDB4NTMzNSwgMHg1MzM2LCAweDUzMzcsIDB4NTMzOCwgMHg1MzNDLCAweDUzM0QsIDB4NTM0MiwKKyAgICAweDUzNDQsIDB4NTM0NiwgMHg1MzRCLCAweDUzNEMsIDB4NTM0RCwgMHg1MzUwLCAweDUzNTgsIDB4NTM1OSwgMHg1MzVCLAorICAgIDB4NTM1RCwgMHg1MzY1LCAweDUzNjgsIDB4NTM2QSwgMHg1MzZDLCAweDUzNkQsIDB4NTM3MiwgMHg1Mzc2LCAweDUzNzksCisgICAgMHg1MzdCLCAweDUzN0MsIDB4NTM3RCwgMHg1MzdFLCAweDUzODAsIDB4NTM4MSwgMHg1MzgzLCAweDUzODcsIDB4NTM4OCwKKyAgICAweDUzOEEsIDB4NTM4RSwgMHg1MzhGLCAweDUzOTAsIDB4NTM5MSwgMHg1MzkyLCAweDUzOTMsIDB4NTM5NCwgMHg1Mzk2LAorICAgIDB4NTM5NywgMHg1MzlCLCAweDUzOUMsIDB4NTM5RSwgMHg1M0ExLCAweDUzQTQsIDB4NTNBNywgMHg1M0FBLCAweDUzQUIsCisgICAgMHg1M0FDLCAweDUzQUYsIDB4NTNCMCwgMHg1M0IxLCAweDUzQjMsIDB4NTNCNSwgMHg1M0I3LCAweDUzQjgsIDB4NTNCOSwKKyAgICAweDUzQkEsIDB4NTNCQywgMHg1M0JELCAweDUzQkUsIDB4NTNDMCwgMHg1M0M0LCAweDUzQzUsIDB4NTNDNiwgMHg1M0M3LAorICAgIDB4NTNDRSwgMHg1M0NGLCAweDUzRDAsIDB4NTNEMiwgMHg1M0QzLCAweDUzRDUsIDB4NTNEQSwgMHg1M0RDLCAweDUzREQsCisgICAgMHg1M0RFLCAweDUzRTEsIDB4NTNFNywgMHg1M0Y0LCAweDUzRkEsIDB4NTNGRSwgMHg1M0ZGLCAweDU0MDAsIDB4NTQwMiwKKyAgICAweDU0MDUsIDB4NTQwNywgMHg1NDBCLCAweDU0MTQsIDB4NTQxOCwgMHg1NDE5LCAweDU0MUEsIDB4NTQxQywgMHg1NDIyLAorICAgIDB4NTQyNCwgMHg1NDI1LCAweDU0MkEsIDB4NTQzMCwgMHg1NDMzLCAweDU0MzYsIDB4NTQzNywgMHg1NDNBLCAweDU0M0QsCisgICAgMHg1NDNGLCAweDU0NDEsIDB4NTQ0MiwgMHg1NDQ0LCAweDU0NDUsIDB4NTQ0NywgMHg1NDQ5LCAweDU0NEMsIDB4NTQ0RCwKKyAgICAweDU0NEUsIDB4NTQ0RiwgMHg1NDUxLCAweDU0NUEsIDB4NTQ1RCwgMHg1NDVFLCAweDU0NUYsIDB4NTQ2MCwgMHg1NDYxLAorICAgIDB4NTQ2MywgMHg1NDY1LCAweDU0NjcsIDB4NTQ2OSwgMHg1NDZBLCAweDU0NkIsIDB4NTQ2QywgMHg1NDZELCAweDU0NkUsCisgICAgMHg1NDZGLCAweDU0NzAsIDB4NTQ3NCwgMHg1NDc5LCAweDU0N0EsIDB4NTQ3RSwgMHg1NDdGLCAweDU0ODEsIDB4NTQ4MywKKyAgICAweDU0ODUsIDB4NTQ4NywgMHg1NDg4LCAweDU0ODksIDB4NTQ4QSwgMHg1NDhELCAweDU0OTEsIDB4NTQ5MywgMHg1NDk3LAorICAgIDB4NTQ5OCwgMHg1NDlDLCAweDU0OUUsIDB4NTQ5RiwgMHg1NEEwLCAweDU0QTEsIDB4NTRBMiwgMHg1NEE1LCAweDU0QUUsCisgICAgMHg1NEIwLCAweDU0QjIsIDB4NTRCNSwgMHg1NEI2LCAweDU0QjcsIDB4NTRCOSwgMHg1NEJBLCAweDU0QkUsIDB4NTRDMywKKyAgICAweDU0QzUsIDB4NTRDQSwgMHg1NENCLCAweDU0RDYsIDB4NTREOCwgMHg1NERCLCAweDU0RTAsIDB4NTRFMiwgMHg1NEUzLAorICAgIDB4NTRFNCwgMHg1NEVCLCAweDU0RUMsIDB4NTRFRiwgMHg1NEYwLCAweDU0RjEsIDB4NTRGNCwgMHg1NEY1LCAweDU0RjYsCisgICAgMHg1NEY3LCAweDU0RjgsIDB4NTRGOSwgMHg1NEZCLCAweDU0RkUsIDB4NTUwMCwgMHg1NTAyLCAweDU1MDMsIDB4NTUwNSwKKyAgICAweDU1MDgsIDB4NTUwQSwgMHg1NTBCLCAweDU1MEMsIDB4NTUwRCwgMHg1NTBFLCAweDU1MTIsIDB4NTUxMywgMHg1NTE1LAorICAgIDB4NTUxNiwgMHg1NTE3LCAweDU1MTgsIDB4NTUxOSwgMHg1NTFBLCAweDU1MUMsIDB4NTUxRCwgMHg1NTFFLCAweDU1MUYsCisgICAgMHg1NTIxLCAweDU1MjUsIDB4NTUyNiwgMHg1NTI4LCAweDU1MjksIDB4NTUyQiwgMHg1NTJELCAweDU1MzIsIDB4NTUzNCwKKyAgICAweDU1MzUsIDB4NTUzNiwgMHg1NTM4LCAweDU1MzksIDB4NTUzQSwgMHg1NTNCLCAweDU1M0QsIDB4NTU0MCwgMHg1NTQyLAorICAgIDB4NTU0NSwgMHg1NTQ3LCAweDU1NDgsIDB4NTU0QiwgMHg1NTRDLCAweDU1NEQsIDB4NTU0RSwgMHg1NTUxLCAweDU1NTIsCisgICAgMHg1NTU0LCAweDU1NTcsIDB4NTU1OCwgMHg1NTU5LCAweDU1NUEsIDB4NTU1QiwgMHg1NTVELCAweDU1NUYsIDB4NTU2MCwKKyAgICAweDU1NjIsIDB4NTU2MywgMHg1NTY4LCAweDU1NjksIDB4NTU2QiwgMHg1NTZGLCAweDU1NzAsIDB4NTU3MSwgMHg1NTcyLAorICAgIDB4NTU3MywgMHg1NTc0LCAweDU1NzksIDB4NTU3QSwgMHg1NTdELCAweDU1N0YsIDB4NTU4NSwgMHg1NTg2LCAweDU1OEMsCisgICAgMHg1NThELCAweDU1OEUsIDB4NTU5MCwgMHg1NTkyLCAweDU1OTMsIDB4NTU5NSwgMHg1NTk2LCAweDU1OTcsIDB4NTU5QSwKKyAgICAweDU1OUIsIDB4NTU5RSwgMHg1NUEwLCAweDU1QTEsIDB4NTVBMiwgMHg1NUEzLCAweDU1QTQsIDB4NTVBNSwgMHg1NUE2LAorICAgIDB4NTVBOCwgMHg1NUE5LCAweDU1QUIsIDB4NTVBRCwgMHg1NUFGLCAweDU1QjAsIDB4NTVCNCwgMHg1NUI2LCAweDU1QjgsCisgICAgMHg1NUJBLCAweDU1QkMsIDB4NTVCRiwgMHg1NUMwLCAweDU1QzEsIDB4NTVDMiwgMHg1NUMzLCAweDU1QzgsIDB4NTVDQSwKKyAgICAweDU1Q0IsIDB4NTVDRiwgMHg1NUQwLCAweDU1RDUsIDB4NTVENywgMHg1NUQ4LCAweDU1RDksIDB4NTVEQiwgMHg1NURFLAorICAgIDB4NTVFMCwgMHg1NUUyLCAweDU1RTcsIDB4NTVFRCwgMHg1NUVFLCAweDU1RjAsIDB4NTVGMSwgMHg1NUY0LCAweDU1RjgsCisgICAgMHg1NUY5LCAweDU1RkEsIDB4NTVGQiwgMHg1NUZDLCAweDU1RkYsIDB4NTYwMiwgMHg1NjAzLCAweDU2MDQsIDB4NTYwNSwKKyAgICAweDU2MDcsIDB4NTYwQSwgMHg1NjBCLCAweDU2MTAsIDB4NTYxMSwgMHg1NjEyLCAweDU2MTMsIDB4NTYxNSwgMHg1NjE5LAorICAgIDB4NTYxQSwgMHg1NjFELCAweDU2MjAsIDB4NTYyMSwgMHg1NjIyLCAweDU2MjUsIDB4NTYyNiwgMHg1NjI4LCAweDU2MkEsCisgICAgMHg1NjJCLCAweDU2MzMsIDB4NTYzNywgMHg1NjNBLCAweDU2M0MsIDB4NTYzRCwgMHg1NjNFLCAweDU2NDAsIDB4NTY0MiwKKyAgICAweDU2NDMsIDB4NTY0NCwgMHg1NjQ1LCAweDU2NDYsIDB4NTY0NywgMHg1NjQ4LCAweDU2NDksIDB4NTY0QSwgMHg1NjRCLAorICAgIDB4NTY0RiwgMHg1NjUwLCAweDU2NTEsIDB4NTY1MiwgMHg1NjUzLCAweDU2NTUsIDB4NTY1NiwgMHg1NjVBLCAweDU2NUIsCisgICAgMHg1NjVFLCAweDU2NUYsIDB4NTY2MSwgMHg1NjYzLCAweDU2NjcsIDB4NTY2RCwgMHg1NjZFLCAweDU2NzAsIDB4NTY3MywKKyAgICAweDU2NzUsIDB4NTY3NywgMHg1NjdBLCAweDU2N0QsIDB4NTY3RSwgMHg1NjdGLCAweDU2ODEsIDB4NTY4MiwgMHg1NjgzLAorICAgIDB4NTY4NCwgMHg1Njg4LCAweDU2ODksIDB4NTY4QSwgMHg1NjhCLCAweDU2OEQsIDB4NTY5MCwgMHg1NjkxLCAweDU2OTIsCisgICAgMHg1Njk0LCAweDU2OTYsIDB4NTY5NywgMHg1Njk4LCAweDU2OUEsIDB4NTY5QiwgMHg1NjlDLCAweDU2OUQsIDB4NTY5RSwKKyAgICAweDU2OUYsIDB4NTZBMCwgMHg1NkExLCAweDU2QTIsIDB4NTZBNCwgMHg1NkE1LCAweDU2QTcsIDB4NTZBOSwgMHg1NkFBLAorICAgIDB4NTZBQiwgMHg1NkFDLCAweDU2QUQsIDB4NTZCMCwgMHg1NkIxLCAweDU2QjIsIDB4NTZCNSwgMHg1NkI4LCAweDU2QjksCisgICAgMHg1NkJBLCAweDU2QkIsIDB4NTZCRCwgMHg1NkJFLCAweDU2QkYsIDB4NTZDMywgMHg1NkM0LCAweDU2QzYsIDB4NTZDNywKKyAgICAweDU2Q0IsIDB4NTZDRCwgMHg1NkNFLCAweDU2Q0YsIDB4NTZEMCwgMHg1NkQyLCAweDU2RDMsIDB4NTZENSwgMHg1NkQ2LAorICAgIDB4NTZEOCwgMHg1NkQ5LCAweDU2REMsIDB4NTZFMywgMHg1NkU1LCAweDU2RTYsIDB4NTZFNywgMHg1NkU4LCAweDU2RTksCisgICAgMHg1NkVBLCAweDU2RUMsIDB4NTZFRSwgMHg1NkVGLCAweDU2RjIsIDB4NTZGMywgMHg1NkY2LCAweDU2RjcsIDB4NTZGOCwKKyAgICAweDU2RkIsIDB4NTZGQywgMHg1NzAwLCAweDU3MDEsIDB4NTcwMiwgMHg1NzA1LCAweDU3MEMsIDB4NTcwRSwgMHg1NzBGLAorICAgIDB4NTcxMCwgMHg1NzExLCAweDU3MTQsIDB4NTcxNSwgMHg1NzE3LCAweDU3MTksIDB4NTcxQSwgMHg1NzFCLCAweDU3MUQsCisgICAgMHg1NzFFLCAweDU3MjAsIDB4NTcyMSwgMHg1NzIyLCAweDU3MjQsIDB4NTcyNSwgMHg1NzI2LCAweDU3MjcsIDB4NTcyQiwKKyAgICAweDU3MzEsIDB4NTczMiwgMHg1NzM0LCAweDU3MzUsIDB4NTczNiwgMHg1NzM3LCAweDU3MzgsIDB4NTczQywgMHg1NzNELAorICAgIDB4NTczRiwgMHg1NzQxLCAweDU3NDMsIDB4NTc0NCwgMHg1NzQ1LCAweDU3NDYsIDB4NTc0OCwgMHg1NzQ5LCAweDU3NEIsCisgICAgMHg1NzUyLCAweDU3NTMsIDB4NTc1NCwgMHg1NzU1LCAweDU3NTYsIDB4NTc1OCwgMHg1NzU5LCAweDU3NjIsIDB4NTc2MywKKyAgICAweDU3NjUsIDB4NTc2NywgMHg1NzZDLCAweDU3NkUsIDB4NTc3MCwgMHg1NzcxLCAweDU3NzIsIDB4NTc3NCwgMHg1Nzc1LAorICAgIDB4NTc3OCwgMHg1Nzc5LCAweDU3N0EsIDB4NTc3RCwgMHg1NzdFLCAweDU3N0YsIDB4NTc4MCwgMHg1NzgxLCAweDU3ODcsCisgICAgMHg1Nzg4LCAweDU3ODksIDB4NTc4QSwgMHg1NzhELCAweDU3OEUsIDB4NTc4RiwgMHg1NzkwLCAweDU3OTEsIDB4NTc5NCwKKyAgICAweDU3OTUsIDB4NTc5NiwgMHg1Nzk3LCAweDU3OTgsIDB4NTc5OSwgMHg1NzlBLCAweDU3OUMsIDB4NTc5RCwgMHg1NzlFLAorICAgIDB4NTc5RiwgMHg1N0E1LCAweDU3QTgsIDB4NTdBQSwgMHg1N0FDLCAweDU3QUYsIDB4NTdCMCwgMHg1N0IxLCAweDU3QjMsCisgICAgMHg1N0I1LCAweDU3QjYsIDB4NTdCNywgMHg1N0I5LCAweDU3QkEsIDB4NTdCQiwgMHg1N0JDLCAweDU3QkQsIDB4NTdCRSwKKyAgICAweDU3QkYsIDB4NTdDMCwgMHg1N0MxLCAweDU3QzQsIDB4NTdDNSwgMHg1N0M2LCAweDU3QzcsIDB4NTdDOCwgMHg1N0M5LAorICAgIDB4NTdDQSwgMHg1N0NDLCAweDU3Q0QsIDB4NTdEMCwgMHg1N0QxLCAweDU3RDMsIDB4NTdENiwgMHg1N0Q3LCAweDU3REIsCisgICAgMHg1N0RDLCAweDU3REUsIDB4NTdFMiwgMHg1N0UzLCAweDU3RTUsIDB4NTdFNiwgMHg1N0U3LCAweDU3RTgsIDB4NTdFOSwKKyAgICAweDU3RUEsIDB4NTdFQiwgMHg1N0VDLCAweDU3RUUsIDB4NTdGMCwgMHg1N0YxLCAweDU3RjIsIDB4NTdGMywgMHg1N0Y1LAorICAgIDB4NTdGNiwgMHg1N0ZCLCAweDU3RkMsIDB4NTdGRSwgMHg1N0ZGLCAweDU4MDEsIDB4NTgwMywgMHg1ODA0LCAweDU4MDgsCisgICAgMHg1ODA5LCAweDU4MEMsIDB4NTgwRSwgMHg1ODBGLCAweDU4MTAsIDB4NTgxMiwgMHg1ODEzLCAweDU4MTQsIDB4NTgxNywKKyAgICAweDU4MTgsIDB4NTgxQSwgMHg1ODFCLCAweDU4MUMsIDB4NTgxRiwgMHg1ODIyLCAweDU4MjMsIDB4NTgyNSwgMHg1ODI2LAorICAgIDB4NTgyNywgMHg1ODI4LCAweDU4MjksIDB4NTgyQiwgMHg1ODJDLCAweDU4MkQsIDB4NTgyRSwgMHg1ODMyLCAweDU4MzMsCisgICAgMHg1ODM2LCAweDU4MzcsIDB4NTgzOCwgMHg1ODM5LCAweDU4M0EsIDB4NTgzQiwgMHg1ODNDLCAweDU4M0QsIDB4NTgzRSwKKyAgICAweDU4M0YsIDB4NTg0MCwgMHg1ODQxLCAweDU4NDIsIDB4NTg0MywgMHg1ODQ1LCAweDU4NDYsIDB4NTg0NywgMHg1ODQ4LAorICAgIDB4NTg0OSwgMHg1ODRFLCAweDU4NTAsIDB4NTg1MywgMHg1ODU1LCAweDU4NTYsIDB4NTg1OSwgMHg1ODVBLCAweDU4NUIsCisgICAgMHg1ODVDLCAweDU4NUQsIDB4NTg1RiwgMHg1ODYwLCAweDU4NjEsIDB4NTg2MywgMHg1ODY2LCAweDU4NjcsIDB4NTg2OCwKKyAgICAweDU4NjksIDB4NTg2QSwgMHg1ODZELCAweDU4NkUsIDB4NTg2RiwgMHg1ODcwLCAweDU4NzEsIDB4NTg3MiwgMHg1ODczLAorICAgIDB4NTg3NCwgMHg1ODc2LCAweDU4NzcsIDB4NTg3OCwgMHg1ODdBLCAweDU4N0IsIDB4NTg3QywgMHg1ODdELCAweDU4N0YsCisgICAgMHg1ODgyLCAweDU4ODQsIDB4NTg4NiwgMHg1ODg3LCAweDU4ODgsIDB4NTg4QiwgMHg1ODhDLCAweDU4OEQsIDB4NTg4RSwKKyAgICAweDU4OEYsIDB4NTg5MCwgMHg1ODkxLCAweDU4OTQsIDB4NTg5NSwgMHg1ODk2LCAweDU4OTcsIDB4NTg5OCwgMHg1ODlCLAorICAgIDB4NTg5RCwgMHg1OEEwLCAweDU4QTEsIDB4NThBMiwgMHg1OEEzLCAweDU4QTQsIDB4NThBNSwgMHg1OEE2LCAweDU4QTcsCisgICAgMHg1OEFBLCAweDU4QUIsIDB4NThBQywgMHg1OEFELCAweDU4QUYsIDB4NThCMCwgMHg1OEIxLCAweDU4QjIsIDB4NThCNCwKKyAgICAweDU4QjUsIDB4NThCNiwgMHg1OEI3LCAweDU4QjgsIDB4NThCOSwgMHg1OEJBLCAweDU4QkQsIDB4NThCRiwgMHg1OEMwLAorICAgIDB4NThDMiwgMHg1OEMzLCAweDU4QzQsIDB4NThDNiwgMHg1OEM4LCAweDU4QzksIDB4NThDQSwgMHg1OENCLCAweDU4Q0MsCisgICAgMHg1OENELCAweDU4Q0UsIDB4NThDRiwgMHg1OEQwLCAweDU4RDIsIDB4NThENCwgMHg1OEQ2LCAweDU4RDcsIDB4NThEQiwKKyAgICAweDU4REMsIDB4NThERCwgMHg1OEUxLCAweDU4RTMsIDB4NThFNSwgMHg1OEU2LCAweDU4RTcsIDB4NThFOCwgMHg1OEVBLAorICAgIDB4NThFRCwgMHg1OEYxLCAweDU4RjIsIDB4NThGNCwgMHg1OEY1LCAweDU4RjcsIDB4NThGOCwgMHg1OEZCLCAweDU4RkMsCisgICAgMHg1OEZFLCAweDU4RkYsIDB4NTkwMCwgMHg1OTAxLCAweDU5MDMsIDB4NTkwNSwgMHg1OTA2LCAweDU5MDgsIDB4NTkwOSwKKyAgICAweDU5MEEsIDB4NTkwQiwgMHg1OTBDLCAweDU5MEUsIDB4NTkxMCwgMHg1OTExLCAweDU5MTIsIDB4NTkxMywgMHg1OTE3LAorICAgIDB4NTkxOCwgMHg1OTFCLCAweDU5MUQsIDB4NTkxRSwgMHg1OTIwLCAweDU5MjEsIDB4NTkyMywgMHg1OTI2LCAweDU5MjgsCisgICAgMHg1OTJDLCAweDU5MzAsIDB4NTkzMiwgMHg1OTMzLCAweDU5MzUsIDB4NTkzNiwgMHg1OTNCLCAweDU5M0QsIDB4NTkzRiwKKyAgICAweDU5NDAsIDB4NTk0MywgMHg1OTQ1LCAweDU5NDYsIDB4NTk0QSwgMHg1OTRDLCAweDU5NEQsIDB4NTk1MCwgMHg1OTUyLAorICAgIDB4NTk1MywgMHg1OTU5LCAweDU5NUIsIDB4NTk1QywgMHg1OTVELCAweDU5NUUsIDB4NTk1RiwgMHg1OTYxLCAweDU5NjMsCisgICAgMHg1OTY0LCAweDU5NjYsIDB4NTk2NywgMHg1OTY4LCAweDU5NkIsIDB4NTk2RCwgMHg1OTZGLCAweDU5NzAsIDB4NTk3MSwKKyAgICAweDU5NzIsIDB4NTk3NSwgMHg1OTc3LCAweDU5N0EsIDB4NTk3QiwgMHg1OTdDLCAweDU5N0UsIDB4NTk3RiwgMHg1OTgwLAorICAgIDB4NTk4NSwgMHg1OTg5LCAweDU5OEIsIDB4NTk4QywgMHg1OThFLCAweDU5OEYsIDB4NTk5MCwgMHg1OTkxLCAweDU5OTQsCisgICAgMHg1OTk1LCAweDU5OTgsIDB4NTk5QSwgMHg1OTlCLCAweDU5OUMsIDB4NTk5RiwgMHg1OUEwLCAweDU5QTEsIDB4NTlBMiwKKyAgICAweDU5QTYsIDB4NTlBNywgMHg1OUFDLCAweDU5QUQsIDB4NTlCMCwgMHg1OUIxLCAweDU5QjMsIDB4NTlCNCwgMHg1OUI1LAorICAgIDB4NTlCNiwgMHg1OUI3LCAweDU5QjgsIDB4NTlCQSwgMHg1OUJDLCAweDU5QkQsIDB4NTlCRiwgMHg1OUMwLCAweDU5QzEsCisgICAgMHg1OUMyLCAweDU5QzMsIDB4NTlDNCwgMHg1OUM1LCAweDU5QzcsIDB4NTlDOCwgMHg1OUM5LCAweDU5Q0MsIDB4NTlDRCwKKyAgICAweDU5Q0UsIDB4NTlDRiwgMHg1OUQ1LCAweDU5RDYsIDB4NTlEOSwgMHg1OURCLCAweDU5REUsIDB4NTlERiwgMHg1OUUwLAorICAgIDB4NTlFMSwgMHg1OUUyLCAweDU5RTQsIDB4NTlFNiwgMHg1OUU3LCAweDU5RTksIDB4NTlFQSwgMHg1OUVCLCAweDU5RUQsCisgICAgMHg1OUVFLCAweDU5RUYsIDB4NTlGMCwgMHg1OUYxLCAweDU5RjIsIDB4NTlGMywgMHg1OUY0LCAweDU5RjUsIDB4NTlGNiwKKyAgICAweDU5RjcsIDB4NTlGOCwgMHg1OUZBLCAweDU5RkMsIDB4NTlGRCwgMHg1OUZFLCAweDVBMDAsIDB4NUEwMiwgMHg1QTBBLAorICAgIDB4NUEwQiwgMHg1QTBELCAweDVBMEUsIDB4NUEwRiwgMHg1QTEwLCAweDVBMTIsIDB4NUExNCwgMHg1QTE1LCAweDVBMTYsCisgICAgMHg1QTE3LCAweDVBMTksIDB4NUExQSwgMHg1QTFCLCAweDVBMUQsIDB4NUExRSwgMHg1QTIxLCAweDVBMjIsIDB4NUEyNCwKKyAgICAweDVBMjYsIDB4NUEyNywgMHg1QTI4LCAweDVBMkEsIDB4NUEyQiwgMHg1QTJDLCAweDVBMkQsIDB4NUEyRSwgMHg1QTJGLAorICAgIDB4NUEzMCwgMHg1QTMzLCAweDVBMzUsIDB4NUEzNywgMHg1QTM4LCAweDVBMzksIDB4NUEzQSwgMHg1QTNCLCAweDVBM0QsCisgICAgMHg1QTNFLCAweDVBM0YsIDB4NUE0MiwgMHg1QTQzLCAweDVBNDQsIDB4NUE0NSwgMHg1QTQ3LCAweDVBNDgsIDB4NUE0QiwKKyAgICAweDVBNEMsIDB4NUE0RCwgMHg1QTRFLCAweDVBNEYsIDB4NUE1MCwgMHg1QTUxLCAweDVBNTIsIDB4NUE1MywgMHg1QTU0LAorICAgIDB4NUE1NiwgMHg1QTU3LCAweDVBNTgsIDB4NUE1OSwgMHg1QTVCLCAweDVBNUMsIDB4NUE1RCwgMHg1QTVFLCAweDVBNUYsCisgICAgMHg1QTYwLCAweDVBNjEsIDB4NUE2MywgMHg1QTY0LCAweDVBNjUsIDB4NUE2OCwgMHg1QTY5LCAweDVBNkIsIDB4NUE2QywKKyAgICAweDVBNkUsIDB4NUE2RiwgMHg1QTcwLCAweDVBNzEsIDB4NUE3MiwgMHg1QTczLCAweDVBNzgsIDB4NUE3OSwgMHg1QTdCLAorICAgIDB4NUE3QywgMHg1QTdELCAweDVBN0UsIDB4NUE4MCwgMHg1QTgxLCAweDVBODIsIDB4NUE4MywgMHg1QTg0LCAweDVBODUsCisgICAgMHg1QTg2LCAweDVBODcsIDB4NUE4OCwgMHg1QTg5LCAweDVBOEEsIDB4NUE4QiwgMHg1QThDLCAweDVBOEQsIDB4NUE4RSwKKyAgICAweDVBOEYsIDB4NUE5MCwgMHg1QTkxLCAweDVBOTMsIDB4NUE5NCwgMHg1QTk1LCAweDVBOTYsIDB4NUE5NywgMHg1QTk4LAorICAgIDB4NUE5OSwgMHg1QTlDLCAweDVBOUQsIDB4NUE5RSwgMHg1QTlGLCAweDVBQTAsIDB4NUFBMSwgMHg1QUEyLCAweDVBQTMsCisgICAgMHg1QUE0LCAweDVBQTUsIDB4NUFBNiwgMHg1QUE4LCAweDVBQTksIDB4NUFBQiwgMHg1QUFDLCAweDVBQUQsIDB4NUFBRSwKKyAgICAweDVBQUYsIDB4NUFCMCwgMHg1QUIxLCAweDVBQjQsIDB4NUFCNiwgMHg1QUI3LCAweDVBQjksIDB4NUFCQSwgMHg1QUJCLAorICAgIDB4NUFCQywgMHg1QUJGLCAweDVBQzAsIDB4NUFDMywgMHg1QUM0LCAweDVBQzUsIDB4NUFDNiwgMHg1QUM3LCAweDVBQzgsCisgICAgMHg1QUNBLCAweDVBQ0IsIDB4NUFDRCwgMHg1QUNFLCAweDVBQ0YsIDB4NUFEMCwgMHg1QUQxLCAweDVBRDMsIDB4NUFENSwKKyAgICAweDVBRDksIDB4NUFEQSwgMHg1QURCLCAweDVBREQsIDB4NUFERSwgMHg1QURGLCAweDVBRTIsIDB4NUFFNCwgMHg1QUU1LAorICAgIDB4NUFFNywgMHg1QUU4LCAweDVBRUEsIDB4NUFFQywgMHg1QUVELCAweDVBRUUsIDB4NUFFRiwgMHg1QUYwLCAweDVBRjIsCisgICAgMHg1QUYzLCAweDVBRjQsIDB4NUFGNiwgMHg1QUY3LCAweDVBRjgsIDB4NUFGOSwgMHg1QUZBLCAweDVBRkMsIDB4NUFGRCwKKyAgICAweDVBRkUsIDB4NUFGRiwgMHg1QjAxLCAweDVCMDIsIDB4NUIwMywgMHg1QjA0LCAweDVCMDUsIDB4NUIwNiwgMHg1QjA3LAorICAgIDB4NUIwQSwgMHg1QjBELCAweDVCMEUsIDB4NUIwRiwgMHg1QjEwLCAweDVCMTEsIDB4NUIxMiwgMHg1QjEzLCAweDVCMTQsCisgICAgMHg1QjE1LCAweDVCMTgsIDB4NUIxQSwgMHg1QjFCLCAweDVCMUMsIDB4NUIxRCwgMHg1QjFFLCAweDVCMUYsIDB4NUIyMCwKKyAgICAweDVCMjIsIDB4NUIyMywgMHg1QjI0LCAweDVCMjUsIDB4NUIyNiwgMHg1QjI3LCAweDVCMjgsIDB4NUIyOSwgMHg1QjJCLAorICAgIDB4NUIyQywgMHg1QjJELCAweDVCMkUsIDB4NUIyRiwgMHg1QjMxLCAweDVCMzMsIDB4NUIzNSwgMHg1QjM2LCAweDVCMzksCisgICAgMHg1QjNBLCAweDVCM0IsIDB4NUIzQywgMHg1QjNELCAweDVCM0UsIDB4NUIzRiwgMHg1QjQxLCAweDVCNDIsIDB4NUI0MywKKyAgICAweDVCNDQsIDB4NUI0NSwgMHg1QjQ2LCAweDVCNDcsIDB4NUI0OCwgMHg1QjQ5LCAweDVCNEEsIDB4NUI0QiwgMHg1QjRELAorICAgIDB4NUI0RSwgMHg1QjRGLCAweDVCNTIsIDB4NUI1NiwgMHg1QjVFLCAweDVCNjAsIDB4NUI2MSwgMHg1QjY3LCAweDVCNjgsCisgICAgMHg1QjZELCAweDVCNkUsIDB4NUI2RiwgMHg1QjcyLCAweDVCNzQsIDB4NUI3NiwgMHg1Qjc3LCAweDVCNzksIDB4NUI3QiwKKyAgICAweDVCN0MsIDB4NUI3RSwgMHg1QjgyLCAweDVCODYsIDB4NUI4QSwgMHg1QjhELCAweDVCOEUsIDB4NUI5MCwgMHg1QjkxLAorICAgIDB4NUI5MiwgMHg1Qjk0LCAweDVCOTYsIDB4NUI5RiwgMHg1QkE3LCAweDVCQTgsIDB4NUJBOSwgMHg1QkFDLCAweDVCQUQsCisgICAgMHg1QkFFLCAweDVCQUYsIDB4NUJCMSwgMHg1QkIyLCAweDVCQjcsIDB4NUJCQSwgMHg1QkJCLCAweDVCQkMsIDB4NUJDMCwKKyAgICAweDVCQzEsIDB4NUJDMywgMHg1QkM4LCAweDVCQzksIDB4NUJDQSwgMHg1QkNCLCAweDVCQ0QsIDB4NUJDRSwgMHg1QkNGLAorICAgIDB4NUJEMSwgMHg1QkQ0LCAweDVCRDUsIDB4NUJENiwgMHg1QkQ3LCAweDVCRDgsIDB4NUJEOSwgMHg1QkRBLCAweDVCREIsCisgICAgMHg1QkRDLCAweDVCRTAsIDB4NUJFMywgMHg1QkVBLCAweDVCRUQsIDB4NUJFRiwgMHg1QkYxLCAweDVCRjIsIDB4NUJGMywKKyAgICAweDVCRjQsIDB4NUJGNywgMHg1QkZELCAweDVCRkUsIDB4NUMwMCwgMHg1QzAyLCAweDVDMDMsIDB4NUMwNSwgMHg1QzBDLAorICAgIDB4NUMxMCwgMHg1QzEyLCAweDVDMTMsIDB4NUMxNywgMHg1QzE5LCAweDVDMUIsIDB4NUMxRSwgMHg1QzFGLCAweDVDMjAsCisgICAgMHg1QzIxLCAweDVDMjMsIDB4NUMyNiwgMHg1QzI4LCAweDVDMjksIDB4NUMyQSwgMHg1QzJCLCAweDVDMkQsIDB4NUMyRSwKKyAgICAweDVDMkYsIDB4NUMzMCwgMHg1QzMyLCAweDVDMzMsIDB4NUMzNSwgMHg1QzM2LCAweDVDNDMsIDB4NUM0NCwgMHg1QzQ2LAorICAgIDB4NUM0NywgMHg1QzRDLCAweDVDNEQsIDB4NUM1MiwgMHg1QzUzLCAweDVDNTQsIDB4NUM1NiwgMHg1QzU3LCAweDVDNTgsCisgICAgMHg1QzVBLCAweDVDNUIsIDB4NUM1QywgMHg1QzVELCAweDVDNUYsIDB4NUM2NywgMHg1QzY5LCAweDVDNkEsIDB4NUM2QiwKKyAgICAweDVDNkQsIDB4NUM3MCwgMHg1QzcyLCAweDVDNzMsIDB4NUM3NCwgMHg1Qzc1LCAweDVDNzYsIDB4NUM3NywgMHg1Qzc4LAorICAgIDB4NUM3QiwgMHg1QzdDLCAweDVDN0QsIDB4NUM3RSwgMHg1QzgwLCAweDVDODMsIDB4NUM4NCwgMHg1Qzg1LCAweDVDODYsCisgICAgMHg1Qzg3LCAweDVDODksIDB4NUM4QSwgMHg1QzhCLCAweDVDOEUsIDB4NUM4RiwgMHg1QzkyLCAweDVDOTMsIDB4NUM5NSwKKyAgICAweDVDOUQsIDB4NUM5RSwgMHg1QzlGLCAweDVDQTAsIDB4NUNBNCwgMHg1Q0E1LCAweDVDQTYsIDB4NUNBNywgMHg1Q0E4LAorICAgIDB4NUNBQSwgMHg1Q0FFLCAweDVDQUYsIDB4NUNCMCwgMHg1Q0IyLCAweDVDQjQsIDB4NUNCNiwgMHg1Q0I5LCAweDVDQkEsCisgICAgMHg1Q0JCLCAweDVDQkMsIDB4NUNCRSwgMHg1Q0MwLCAweDVDQzIsIDB4NUNDMywgMHg1Q0M1LCAweDVDQzYsIDB4NUNDNywKKyAgICAweDVDQzgsIDB4NUNDOSwgMHg1Q0NBLCAweDVDQ0MsIDB4NUNDRCwgMHg1Q0NFLCAweDVDQ0YsIDB4NUNEMCwgMHg1Q0QxLAorICAgIDB4NUNEMywgMHg1Q0Q0LCAweDVDRDUsIDB4NUNENiwgMHg1Q0Q3LCAweDVDRDgsIDB4NUNEQSwgMHg1Q0RCLCAweDVDREMsCisgICAgMHg1Q0RELCAweDVDREUsIDB4NUNERiwgMHg1Q0UwLCAweDVDRTIsIDB4NUNFMywgMHg1Q0U3LCAweDVDRTksIDB4NUNFQiwKKyAgICAweDVDRUMsIDB4NUNFRSwgMHg1Q0VGLCAweDVDRjEsIDB4NUNGMiwgMHg1Q0YzLCAweDVDRjUsIDB4NUNGNywgMHg1Q0Y4LAorICAgIDB4NUNGOSwgMHg1Q0ZBLCAweDVDRkMsIDB4NUNGRSwgMHg1Q0ZGLCAweDVEMDAsIDB4NUQwMSwgMHg1RDA0LCAweDVEMDUsCisgICAgMHg1RDA4LCAweDVEMDksIDB4NUQwQSwgMHg1RDBCLCAweDVEMEMsIDB4NUQwRiwgMHg1RDEwLCAweDVEMTEsIDB4NUQxMiwKKyAgICAweDVEMTMsIDB4NUQxNSwgMHg1RDE4LCAweDVEMTksIDB4NUQxQSwgMHg1RDFDLCAweDVEMUQsIDB4NUQxRiwgMHg1RDIwLAorICAgIDB4NUQyMSwgMHg1RDIyLCAweDVEMjMsIDB4NUQyNSwgMHg1RDI4LCAweDVEMkEsIDB4NUQyQiwgMHg1RDJGLCAweDVEMzAsCisgICAgMHg1RDMxLCAweDVEMzIsIDB4NUQzMywgMHg1RDM1LCAweDVEMzYsIDB4NUQzNywgMHg1RDM4LCAweDVEMzksIDB4NUQzQSwKKyAgICAweDVEM0IsIDB4NUQzQywgMHg1RDNGLCAweDVENDAsIDB4NUQ0MSwgMHg1RDQyLCAweDVENDMsIDB4NUQ0NCwgMHg1RDQ1LAorICAgIDB4NUQ0NiwgMHg1RDQ4LCAweDVENDksIDB4NUQ0RCwgMHg1RDRFLCAweDVENEYsIDB4NUQ1MSwgMHg1RDUyLCAweDVENTMsCisgICAgMHg1RDU0LCAweDVENTUsIDB4NUQ1NiwgMHg1RDU3LCAweDVENTksIDB4NUQ1QSwgMHg1RDVDLCAweDVENUUsIDB4NUQ1RiwKKyAgICAweDVENjAsIDB4NUQ2MSwgMHg1RDYyLCAweDVENjMsIDB4NUQ2NCwgMHg1RDY1LCAweDVENjYsIDB4NUQ2NywgMHg1RDY4LAorICAgIDB4NUQ2QSwgMHg1RDZELCAweDVENkUsIDB4NUQ3MCwgMHg1RDcxLCAweDVENzIsIDB4NUQ3MywgMHg1RDc1LCAweDVENzYsCisgICAgMHg1RDc3LCAweDVENzgsIDB4NUQ3OSwgMHg1RDdBLCAweDVEN0IsIDB4NUQ3QywgMHg1RDdELCAweDVEN0UsIDB4NUQ3RiwKKyAgICAweDVEODAsIDB4NUQ4MywgMHg1RDg1LCAweDVEODYsIDB4NUQ4OCwgMHg1RDg5LCAweDVEOEEsIDB4NUQ4QiwgMHg1RDhDLAorICAgIDB4NUQ4RCwgMHg1RDhFLCAweDVEOEYsIDB4NUQ5MCwgMHg1RDkxLCAweDVEOTIsIDB4NUQ5MywgMHg1RDk0LCAweDVEOTUsCisgICAgMHg1RDk2LCAweDVEOTgsIDB4NUQ5QSwgMHg1RDlCLCAweDVEOUMsIDB4NUQ5RSwgMHg1RDlGLCAweDVEQTEsIDB4NURBMiwKKyAgICAweDVEQTMsIDB4NURBNCwgMHg1REE1LCAweDVEQTYsIDB4NURBOCwgMHg1REE5LCAweDVEQUEsIDB4NURBQiwgMHg1REFDLAorICAgIDB4NURBRCwgMHg1REFFLCAweDVEQUYsIDB4NURCMCwgMHg1REIxLCAweDVEQjIsIDB4NURCMywgMHg1REI0LCAweDVEQjUsCisgICAgMHg1REI2LCAweDVEQjksIDB4NURCQiwgMHg1REJELCAweDVEQkUsIDB4NURCRiwgMHg1REMwLCAweDVEQzEsIDB4NURDMiwKKyAgICAweDVEQzMsIDB4NURDNCwgMHg1REM2LCAweDVEQzcsIDB4NURDOCwgMHg1REM5LCAweDVEQ0EsIDB4NURDQywgMHg1RENFLAorICAgIDB4NURDRiwgMHg1REQwLCAweDVERDEsIDB4NUREMywgMHg1REQ1LCAweDVERDYsIDB4NURENywgMHg1REQ4LCAweDVERDksCisgICAgMHg1RERBLCAweDVEREMsIDB4NURERiwgMHg1REUwLCAweDVERTMsIDB4NURFNCwgMHg1REVBLCAweDVERUMsIDB4NURFRCwKKyAgICAweDVERjUsIDB4NURGNiwgMHg1REY4LCAweDVERjksIDB4NURGQSwgMHg1REZCLCAweDVERkMsIDB4NURGRiwgMHg1RTAwLAorICAgIDB4NUUwNCwgMHg1RTA3LCAweDVFMDksIDB4NUUwQSwgMHg1RTBCLCAweDVFMEQsIDB4NUUwRSwgMHg1RTEyLCAweDVFMTMsCisgICAgMHg1RTE3LCAweDVFMUUsIDB4NUUxRiwgMHg1RTIwLCAweDVFMjEsIDB4NUUyMiwgMHg1RTIzLCAweDVFMjQsIDB4NUUyOCwKKyAgICAweDVFMjksIDB4NUUyQSwgMHg1RTJDLCAweDVFMkYsIDB4NUUzMCwgMHg1RTMyLCAweDVFMzQsIDB4NUUzNSwgMHg1RTM5LAorICAgIDB4NUUzQSwgMHg1RTNFLCAweDVFM0YsIDB4NUU0MSwgMHg1RTQ2LCAweDVFNDcsIDB4NUU0OCwgMHg1RTQ5LCAweDVFNEEsCisgICAgMHg1RTRCLCAweDVFNEQsIDB4NUU0RSwgMHg1RTRGLCAweDVFNTAsIDB4NUU1MSwgMHg1RTUyLCAweDVFNTMsIDB4NUU1NiwKKyAgICAweDVFNTksIDB4NUU1QSwgMHg1RTVDLCAweDVFNUQsIDB4NUU2MCwgMHg1RTY0LCAweDVFNjUsIDB4NUU2NiwgMHg1RTY3LAorICAgIDB4NUU2OCwgMHg1RTY5LCAweDVFNkEsIDB4NUU2RCwgMHg1RTZFLCAweDVFNkYsIDB4NUU3MCwgMHg1RTcxLCAweDVFNzUsCisgICAgMHg1RTc3LCAweDVFODEsIDB4NUU4MiwgMHg1RTgzLCAweDVFODUsIDB4NUU4OCwgMHg1RTg5LCAweDVFOEMsIDB4NUU4RCwKKyAgICAweDVFOEUsIDB4NUU5MiwgMHg1RTk4LCAweDVFOUIsIDB4NUU5RCwgMHg1RUExLCAweDVFQTIsIDB4NUVBMywgMHg1RUE0LAorICAgIDB4NUVBOCwgMHg1RUE5LCAweDVFQUEsIDB4NUVBQywgMHg1RUFFLCAweDVFQUYsIDB4NUVCMCwgMHg1RUIxLCAweDVFQjIsCisgICAgMHg1RUI0LCAweDVFQkEsIDB4NUVCQiwgMHg1RUJDLCAweDVFQkQsIDB4NUVCRiwgMHg1RUMwLCAweDVFQzEsIDB4NUVDMiwKKyAgICAweDVFQzMsIDB4NUVDNCwgMHg1RUM1LCAweDVFQzYsIDB4NUVDNywgMHg1RUM4LCAweDVFQ0IsIDB4NUVDQywgMHg1RUNELAorICAgIDB4NUVDRSwgMHg1RUNGLCAweDVFRDAsIDB4NUVENCwgMHg1RUQ1LCAweDVFRDcsIDB4NUVEOCwgMHg1RUQ5LCAweDVFREEsCisgICAgMHg1RURDLCAweDVFREQsIDB4NUVERSwgMHg1RUU0LCAweDVFRTUsIDB4NUVFNiwgMHg1RUU3LCAweDVFRTksIDB4NUVFQiwKKyAgICAweDVFRUQsIDB4NUVFRSwgMHg1RUVGLCAweDVFRjAsIDB4NUVGMSwgMHg1RUYyLCAweDVFRjUsIDB4NUVGOCwgMHg1RUY5LAorICAgIDB4NUVGQiwgMHg1RUZDLCAweDVFRkQsIDB4NUYwNSwgMHg1RjA2LCAweDVGMDcsIDB4NUYwOSwgMHg1RjBDLCAweDVGMEQsCisgICAgMHg1RjBFLCAweDVGMTAsIDB4NUYxMiwgMHg1RjE0LCAweDVGMTYsIDB4NUYxOSwgMHg1RjFBLCAweDVGMUMsIDB4NUYxRCwKKyAgICAweDVGMUUsIDB4NUYyMSwgMHg1RjIyLCAweDVGMjMsIDB4NUYyNCwgMHg1RjI4LCAweDVGMkIsIDB4NUYyQywgMHg1RjJFLAorICAgIDB4NUYzMCwgMHg1RjMyLCAweDVGMzQsIDB4NUYzNiwgMHg1RjM3LCAweDVGMzgsIDB4NUYzQiwgMHg1RjNELCAweDVGM0UsCisgICAgMHg1RjNGLCAweDVGNDEsIDB4NUY0MiwgMHg1RjQzLCAweDVGNDQsIDB4NUY0NSwgMHg1RjQ3LCAweDVGNDksIDB4NUY0QSwKKyAgICAweDVGNEIsIDB4NUY0RCwgMHg1RjRGLCAweDVGNTEsIDB4NUY1NCwgMHg1RjVBLCAweDVGNUIsIDB4NUY1QywgMHg1RjVFLAorICAgIDB4NUY1RiwgMHg1RjYwLCAweDVGNjMsIDB4NUY2NSwgMHg1RjY3LCAweDVGNjgsIDB4NUY2QiwgMHg1RjZFLCAweDVGNkYsCisgICAgMHg1RjcyLCAweDVGNzQsIDB4NUY3NSwgMHg1Rjc2LCAweDVGNzgsIDB4NUY3QSwgMHg1RjdELCAweDVGN0UsIDB4NUY3RiwKKyAgICAweDVGODMsIDB4NUY4NiwgMHg1RjhELCAweDVGOEUsIDB4NUY4RiwgMHg1RjkzLCAweDVGOTQsIDB4NUY5NiwgMHg1RjlBLAorICAgIDB4NUY5QiwgMHg1RjlELCAweDVGOUYsIDB4NUZBMiwgMHg1RkEzLCAweDVGQTQsIDB4NUZBNSwgMHg1RkE2LCAweDVGQTcsCisgICAgMHg1RkFCLCAweDVGQUMsIDB4NUZBRiwgMHg1RkIwLCAweDVGQjEsIDB4NUZCMiwgMHg1RkIzLCAweDVGQjQsIDB4NUZCNiwKKyAgICAweDVGQjgsIDB4NUZCQSwgMHg1RkJCLCAweDVGQkUsIDB4NUZCRiwgMHg1RkMwLCAweDVGQzEsIDB4NUZDMiwgMHg1RkM3LAorICAgIDB4NUZDOCwgMHg1RkNBLCAweDVGQ0IsIDB4NUZDRSwgMHg1RkQzLCAweDVGRDQsIDB4NUZENSwgMHg1RkRBLCAweDVGREIsCisgICAgMHg1RkRDLCAweDVGREUsIDB4NUZERiwgMHg1RkUyLCAweDVGRTMsIDB4NUZFNSwgMHg1RkU2LCAweDVGRTgsIDB4NUZFOSwKKyAgICAweDVGRUMsIDB4NUZFRiwgMHg1RkYwLCAweDVGRjIsIDB4NUZGMywgMHg1RkY0LCAweDVGRjYsIDB4NUZGNywgMHg1RkY5LAorICAgIDB4NUZGQSwgMHg1RkZDLCAweDYwMDcsIDB4NjAwOCwgMHg2MDA5LCAweDYwMEIsIDB4NjAwQywgMHg2MDEwLCAweDYwMTEsCisgICAgMHg2MDEzLCAweDYwMTcsIDB4NjAxOCwgMHg2MDFBLCAweDYwMUUsIDB4NjAxRiwgMHg2MDIyLCAweDYwMjMsIDB4NjAyNCwKKyAgICAweDYwMkMsIDB4NjAyRCwgMHg2MDJFLCAweDYwMzAsIDB4NjAzMSwgMHg2MDMyLCAweDYwMzMsIDB4NjAzNCwgMHg2MDM2LAorICAgIDB4NjAzNywgMHg2MDM4LCAweDYwMzksIDB4NjAzQSwgMHg2MDNELCAweDYwM0UsIDB4NjA0MCwgMHg2MDQ0LCAweDYwNDUsCisgICAgMHg2MDQ2LCAweDYwNDcsIDB4NjA0OCwgMHg2MDQ5LCAweDYwNEEsIDB4NjA0QywgMHg2MDRFLCAweDYwNEYsIDB4NjA1MSwKKyAgICAweDYwNTMsIDB4NjA1NCwgMHg2MDU2LCAweDYwNTcsIDB4NjA1OCwgMHg2MDVCLCAweDYwNUMsIDB4NjA1RSwgMHg2MDVGLAorICAgIDB4NjA2MCwgMHg2MDYxLCAweDYwNjUsIDB4NjA2NiwgMHg2MDZFLCAweDYwNzEsIDB4NjA3MiwgMHg2MDc0LCAweDYwNzUsCisgICAgMHg2MDc3LCAweDYwN0UsIDB4NjA4MCwgMHg2MDgxLCAweDYwODIsIDB4NjA4NSwgMHg2MDg2LCAweDYwODcsIDB4NjA4OCwKKyAgICAweDYwOEEsIDB4NjA4QiwgMHg2MDhFLCAweDYwOEYsIDB4NjA5MCwgMHg2MDkxLCAweDYwOTMsIDB4NjA5NSwgMHg2MDk3LAorICAgIDB4NjA5OCwgMHg2MDk5LCAweDYwOUMsIDB4NjA5RSwgMHg2MEExLCAweDYwQTIsIDB4NjBBNCwgMHg2MEE1LCAweDYwQTcsCisgICAgMHg2MEE5LCAweDYwQUEsIDB4NjBBRSwgMHg2MEIwLCAweDYwQjMsIDB4NjBCNywgMHg2MEI5LCAweDYwQkEsIDB4NjBCRCwKKyAgICAweDYwQkUsIDB4NjBCRiwgMHg2MEMwLCAweDYwQzEsIDB4NjBDMiwgMHg2MEMzLCAweDYwQzQsIDB4NjBDNywgMHg2MEM4LAorICAgIDB4NjBDOSwgMHg2MENDLCAweDYwQ0QsIDB4NjBDRSwgMHg2MENGLCAweDYwRDAsIDB4NjBEMiwgMHg2MEQzLCAweDYwRDQsCisgICAgMHg2MEQ2LCAweDYwRDcsIDB4NjBEOSwgMHg2MERCLCAweDYwREUsIDB4NjBFMiwgMHg2MEUzLCAweDYwRTQsIDB4NjBFNSwKKyAgICAweDYwRUEsIDB4NjBGNSwgMHg2MEY3LCAweDYwRjgsIDB4NjBGQywgMHg2MEZELCAweDYwRkUsIDB4NjBGRiwgMHg2MTAyLAorICAgIDB4NjEwMywgMHg2MTA0LCAweDYxMDUsIDB4NjEwNywgMHg2MTBBLCAweDYxMEIsIDB4NjEwQywgMHg2MTEwLCAweDYxMTEsCisgICAgMHg2MTEyLCAweDYxMTMsIDB4NjExNCwgMHg2MTE2LCAweDYxMTcsIDB4NjExOCwgMHg2MTE5LCAweDYxMUQsIDB4NjExRSwKKyAgICAweDYxMjEsIDB4NjEyMiwgMHg2MTI1LCAweDYxMjgsIDB4NjEyOSwgMHg2MTJBLCAweDYxMkMsIDB4NjEyRCwgMHg2MTJFLAorICAgIDB4NjEyRiwgMHg2MTMwLCAweDYxMzEsIDB4NjEzMiwgMHg2MTMzLCAweDYxMzUsIDB4NjEzNiwgMHg2MTM4LCAweDYxMzksCisgICAgMHg2MTNBLCAweDYxM0IsIDB4NjEzQywgMHg2MTNELCAweDYxNDAsIDB4NjE0MSwgMHg2MTQyLCAweDYxNDMsIDB4NjE0NCwKKyAgICAweDYxNDUsIDB4NjE0NiwgMHg2MTQ3LCAweDYxNDksIDB4NjE0RCwgMHg2MTRGLCAweDYxNTAsIDB4NjE1MiwgMHg2MTUzLAorICAgIDB4NjE1NCwgMHg2MTU2LCAweDYxNTcsIDB4NjE1OSwgMHg2MTVCLCAweDYxNUMsIDB4NjE1RSwgMHg2MTYwLCAweDYxNjEsCisgICAgMHg2MTY1LCAweDYxNjYsIDB4NjE2OSwgMHg2MTZDLCAweDYxNkQsIDB4NjE2RiwgMHg2MTcxLCAweDYxNzIsIDB4NjE3NCwKKyAgICAweDYxNzgsIDB4NjE3OSwgMHg2MTdBLCAweDYxN0IsIDB4NjE3QywgMHg2MTdELCAweDYxN0UsIDB4NjE3RiwgMHg2MTgwLAorICAgIDB4NjE4MSwgMHg2MTgzLCAweDYxODQsIDB4NjE4NSwgMHg2MTg2LCAweDYxODcsIDB4NjE4OCwgMHg2MTg5LCAweDYxOEMsCisgICAgMHg2MThELCAweDYxOEYsIDB4NjE5MywgMHg2MTk1LCAweDYxOTYsIDB4NjE5NywgMHg2MTk4LCAweDYxOTksIDB4NjE5QiwKKyAgICAweDYxOUMsIDB4NjE5RSwgMHg2MTlGLCAweDYxQTAsIDB4NjFBMSwgMHg2MUEyLCAweDYxQTMsIDB4NjFBNSwgMHg2MUE2LAorICAgIDB4NjFBQSwgMHg2MUFELCAweDYxQUYsIDB4NjFCMCwgMHg2MUIxLCAweDYxQjMsIDB4NjFCNCwgMHg2MUI1LCAweDYxQjgsCisgICAgMHg2MUI5LCAweDYxQkEsIDB4NjFCQiwgMHg2MUJDLCAweDYxQkQsIDB4NjFCRiwgMHg2MUMwLCAweDYxQzEsIDB4NjFDMywKKyAgICAweDYxQzQsIDB4NjFDNSwgMHg2MUM2LCAweDYxQ0QsIDB4NjFDRSwgMHg2MUNGLCAweDYxRDAsIDB4NjFEMywgMHg2MUQ1LAorICAgIDB4NjFENiwgMHg2MUQ3LCAweDYxRDgsIDB4NjFEOSwgMHg2MURBLCAweDYxREIsIDB4NjFEQywgMHg2MURELCAweDYxRTAsCisgICAgMHg2MUUxLCAweDYxRTIsIDB4NjFFNCwgMHg2MUU1LCAweDYxRTcsIDB4NjFFOSwgMHg2MUVBLCAweDYxRUIsIDB4NjFFQywKKyAgICAweDYxRUQsIDB4NjFFRSwgMHg2MUVGLCAweDYxRjAsIDB4NjFGMSwgMHg2MUYzLCAweDYxRjQsIDB4NjFGOSwgMHg2MUZCLAorICAgIDB4NjFGRCwgMHg2MjAxLCAweDYyMDIsIDB4NjIwMywgMHg2MjA0LCAweDYyMDUsIDB4NjIwOSwgMHg2MjEzLCAweDYyMTksCisgICAgMHg2MjFDLCAweDYyMUQsIDB4NjIxRSwgMHg2MjIwLCAweDYyMjMsIDB4NjIyNiwgMHg2MjI4LCAweDYyMjksIDB4NjIyQiwKKyAgICAweDYyMkQsIDB4NjIyRiwgMHg2MjMxLCAweDYyMzUsIDB4NjIzNiwgMHg2MjM4LCAweDYyMzksIDB4NjIzQSwgMHg2MjNCLAorICAgIDB4NjIzQywgMHg2MjQyLCAweDYyNDQsIDB4NjI0NSwgMHg2MjQ2LCAweDYyNEEsIDB4NjI0RiwgMHg2MjUwLCAweDYyNTUsCisgICAgMHg2MjU2LCAweDYyNTcsIDB4NjI1OSwgMHg2MjVBLCAweDYyNUMsIDB4NjI1RCwgMHg2MjVFLCAweDYyNUYsIDB4NjI2MCwKKyAgICAweDYyNjEsIDB4NjI2MiwgMHg2MjY0LCAweDYyNjUsIDB4NjI2OCwgMHg2MjcxLCAweDYyNzIsIDB4NjI3NCwgMHg2Mjc1LAorICAgIDB4NjI3NywgMHg2Mjc4LCAweDYyN0EsIDB4NjI3QiwgMHg2MjdELCAweDYyODEsIDB4NjI4MiwgMHg2MjgzLCAweDYyODUsCisgICAgMHg2Mjg2LCAweDYyODcsIDB4NjI4OCwgMHg2MjhCLCAweDYyOEMsIDB4NjI4RCwgMHg2MjhFLCAweDYyOEYsIDB4NjI5MCwKKyAgICAweDYyOTQsIDB4NjI5OSwgMHg2MjlDLCAweDYyOUQsIDB4NjI5RSwgMHg2MkEzLCAweDYyQTYsIDB4NjJBNywgMHg2MkE5LAorICAgIDB4NjJBQSwgMHg2MkFELCAweDYyQUUsIDB4NjJBRiwgMHg2MkIwLCAweDYyQjIsIDB4NjJCMywgMHg2MkI0LCAweDYyQjYsCisgICAgMHg2MkI3LCAweDYyQjgsIDB4NjJCQSwgMHg2MkJFLCAweDYyQzAsIDB4NjJDMSwgMHg2MkMzLCAweDYyQ0IsIDB4NjJDRiwKKyAgICAweDYyRDEsIDB4NjJENSwgMHg2MkRELCAweDYyREUsIDB4NjJFMCwgMHg2MkUxLCAweDYyRTQsIDB4NjJFQSwgMHg2MkVCLAorICAgIDB4NjJGMCwgMHg2MkYyLCAweDYyRjUsIDB4NjJGOCwgMHg2MkY5LCAweDYyRkEsIDB4NjJGQiwgMHg2MzAwLCAweDYzMDMsCisgICAgMHg2MzA0LCAweDYzMDUsIDB4NjMwNiwgMHg2MzBBLCAweDYzMEIsIDB4NjMwQywgMHg2MzBELCAweDYzMEYsIDB4NjMxMCwKKyAgICAweDYzMTIsIDB4NjMxMywgMHg2MzE0LCAweDYzMTUsIDB4NjMxNywgMHg2MzE4LCAweDYzMTksIDB4NjMxQywgMHg2MzI2LAorICAgIDB4NjMyNywgMHg2MzI5LCAweDYzMkMsIDB4NjMyRCwgMHg2MzJFLCAweDYzMzAsIDB4NjMzMSwgMHg2MzMzLCAweDYzMzQsCisgICAgMHg2MzM1LCAweDYzMzYsIDB4NjMzNywgMHg2MzM4LCAweDYzM0IsIDB4NjMzQywgMHg2MzNGLCAweDYzNDAsIDB4NjM0MSwKKyAgICAweDYzNDQsIDB4NjM0NywgMHg2MzQ4LCAweDYzNEEsIDB4NjM1MSwgMHg2MzUyLCAweDYzNTMsIDB4NjM1NCwgMHg2MzU2LAorICAgIDB4NjM1NywgMHg2MzU4LCAweDYzNTksIDB4NjM1QSwgMHg2MzVCLCAweDYzNUMsIDB4NjM1RCwgMHg2MzYwLCAweDYzNjQsCisgICAgMHg2MzY1LCAweDYzNjYsIDB4NjM2QSwgMHg2MzZDLCAweDYzNkYsIDB4NjM3MCwgMHg2MzczLCAweDYzNzQsIDB4NjM3NSwKKyAgICAweDYzNzgsIDB4NjM3OSwgMHg2MzdDLCAweDYzN0QsIDB4NjM3RSwgMHg2MzdGLCAweDYzODEsIDB4NjM4NSwgMHg2Mzg2LAorICAgIDB4NjM4QiwgMHg2MzhELCAweDYzOTEsIDB4NjM5MywgMHg2Mzk0LCAweDYzOTUsIDB4NjM5NywgMHg2Mzk5LCAweDYzOUEsCisgICAgMHg2MzlCLCAweDYzOUMsIDB4NjM5RCwgMHg2MzlFLCAweDYzOUYsIDB4NjNBMSwgMHg2M0E0LCAweDYzQTYsIDB4NjNBQiwKKyAgICAweDYzQUYsIDB4NjNCMSwgMHg2M0IyLCAweDYzQjUsIDB4NjNCNiwgMHg2M0I5LCAweDYzQkIsIDB4NjNCRCwgMHg2M0JGLAorICAgIDB4NjNDMSwgMHg2M0MyLCAweDYzQzMsIDB4NjNDNSwgMHg2M0M3LCAweDYzQzgsIDB4NjNDQSwgMHg2M0NCLCAweDYzQ0MsCisgICAgMHg2M0QxLCAweDYzRDMsIDB4NjNENCwgMHg2M0Q1LCAweDYzRDcsIDB4NjNEOCwgMHg2M0Q5LCAweDYzREIsIDB4NjNEQywKKyAgICAweDYzREQsIDB4NjNERiwgMHg2M0UyLCAweDYzRTQsIDB4NjNFNSwgMHg2M0U2LCAweDYzRTcsIDB4NjNFOCwgMHg2M0VCLAorICAgIDB4NjNFQywgMHg2M0VGLCAweDYzRjAsIDB4NjNGMSwgMHg2M0YzLCAweDYzRjUsIDB4NjNGNywgMHg2M0Y5LCAweDYzRkEsCisgICAgMHg2M0ZCLCAweDYzRkMsIDB4NjNGRSwgMHg2NDAzLCAweDY0MDQsIDB4NjQwNiwgMHg2NDA3LCAweDY0MDgsIDB4NjQwOSwKKyAgICAweDY0MEEsIDB4NjQwRSwgMHg2NDExLCAweDY0MTIsIDB4NjQxNSwgMHg2NDE2LCAweDY0MTgsIDB4NjQxOSwgMHg2NDFBLAorICAgIDB4NjQxRCwgMHg2NDFGLCAweDY0MjIsIDB4NjQyMywgMHg2NDI0LCAweDY0MjUsIDB4NjQyNywgMHg2NDI4LCAweDY0MjksCisgICAgMHg2NDJCLCAweDY0MkUsIDB4NjQyRiwgMHg2NDMwLCAweDY0MzEsIDB4NjQzMiwgMHg2NDMzLCAweDY0MzUsIDB4NjQzNywKKyAgICAweDY0MzgsIDB4NjQzOSwgMHg2NDNCLCAweDY0M0MsIDB4NjQzRSwgMHg2NDQwLCAweDY0NDIsIDB4NjQ0MywgMHg2NDQ5LAorICAgIDB4NjQ0QiwgMHg2NDRDLCAweDY0NEQsIDB4NjQ0RSwgMHg2NDRGLCAweDY0NTAsIDB4NjQ1MywgMHg2NDU1LCAweDY0NTYsCisgICAgMHg2NDU3LCAweDY0NTksIDB4NjQ1QSwgMHg2NDVCLCAweDY0NUQsIDB4NjQ2MCwgMHg2NDYxLCAweDY0NjIsIDB4NjQ2MywKKyAgICAweDY0NjQsIDB4NjQ2NSwgMHg2NDY2LCAweDY0NjgsIDB4NjQ2QSwgMHg2NDZCLCAweDY0NkMsIDB4NjQ2RSwgMHg2NDcwLAorICAgIDB4NjQ3MSwgMHg2NDcyLCAweDY0NzQsIDB4NjQ3NSwgMHg2NDc3LCAweDY0N0MsIDB4NjQ3RCwgMHg2NDdFLCAweDY0N0YsCisgICAgMHg2NDgwLCAweDY0ODEsIDB4NjQ4MywgMHg2NDg2LCAweDY0ODksIDB4NjQ4QSwgMHg2NDhCLCAweDY0OEMsIDB4NjQ4RCwKKyAgICAweDY0OEUsIDB4NjQ4RiwgMHg2NDkwLCAweDY0OTQsIDB4NjQ5NywgMHg2NDk4LCAweDY0OUEsIDB4NjQ5QiwgMHg2NDlDLAorICAgIDB4NjQ5RCwgMHg2NEEwLCAweDY0QTEsIDB4NjRBMiwgMHg2NEE2LCAweDY0QTcsIDB4NjRBOCwgMHg2NEFBLCAweDY0QUYsCisgICAgMHg2NEIxLCAweDY0QjQsIDB4NjRCNiwgMHg2NEI5LCAweDY0QkQsIDB4NjRDMywgMHg2NEM2LCAweDY0QzgsIDB4NjRDOSwKKyAgICAweDY0Q0MsIDB4NjRDRiwgMHg2NEQxLCAweDY0RDMsIDB4NjRENSwgMHg2NEQ2LCAweDY0RDksIDB4NjREQiwgMHg2NERDLAorICAgIDB4NjRERCwgMHg2NERGLCAweDY0RTEsIDB4NjRFMywgMHg2NEU1LCAweDY0RTcsIDB4NjRFOCwgMHg2NEU5LCAweDY0RUEsCisgICAgMHg2NEVCLCAweDY0RUQsIDB4NjRFRSwgMHg2NEYzLCAweDY0RjUsIDB4NjRGNiwgMHg2NEY4LCAweDY0RjksIDB4NjRGRCwKKyAgICAweDY0RkYsIDB4NjUwMSwgMHg2NTAyLCAweDY1MDMsIDB4NjUwNSwgMHg2NTA3LCAweDY1MDgsIDB4NjUwQSwgMHg2NTBCLAorICAgIDB4NjUwQywgMHg2NTBELCAweDY1MEUsIDB4NjUxMCwgMHg2NTExLCAweDY1MTMsIDB4NjUxNSwgMHg2NTE3LCAweDY1MUEsCisgICAgMHg2NTFDLCAweDY1MUUsIDB4NjUxRiwgMHg2NTIwLCAweDY1MjEsIDB4NjUyNiwgMHg2NTI3LCAweDY1MjgsIDB4NjUyOSwKKyAgICAweDY1MkQsIDB4NjUzMCwgMHg2NTMxLCAweDY1MzIsIDB4NjUzMywgMHg2NTM3LCAweDY1M0EsIDB4NjUzQywgMHg2NTNELAorICAgIDB4NjU0MCwgMHg2NTQxLCAweDY1NDIsIDB4NjU0MywgMHg2NTQ0LCAweDY1NDYsIDB4NjU0NywgMHg2NTRBLCAweDY1NEIsCisgICAgMHg2NTRELCAweDY1NEUsIDB4NjU1MCwgMHg2NTUyLCAweDY1NTMsIDB4NjU1NCwgMHg2NTU4LCAweDY1NUEsIDB4NjU1QywKKyAgICAweDY1NUYsIDB4NjU2MCwgMHg2NTYxLCAweDY1NjQsIDB4NjU2NSwgMHg2NTY3LCAweDY1NjgsIDB4NjU2OSwgMHg2NTZBLAorICAgIDB4NjU2RCwgMHg2NTZFLCAweDY1NkYsIDB4NjU3MSwgMHg2NTczLCAweDY1NzYsIDB4NjU3OSwgMHg2NTdBLCAweDY1N0IsCisgICAgMHg2NTdDLCAweDY1N0QsIDB4NjU3RSwgMHg2NTdGLCAweDY1ODAsIDB4NjU4MSwgMHg2NTg0LCAweDY1ODUsIDB4NjU4NiwKKyAgICAweDY1ODgsIDB4NjU4OSwgMHg2NThBLCAweDY1OEQsIDB4NjU4RSwgMHg2NThGLCAweDY1OTIsIDB4NjU5NCwgMHg2NTk2LAorICAgIDB4NjU5OCwgMHg2NTlBLCAweDY1OUQsIDB4NjU5RSwgMHg2NUEwLCAweDY1QTIsIDB4NjVBMywgMHg2NUE2LCAweDY1QTgsCisgICAgMHg2NUFBLCAweDY1QUUsIDB4NjVCMSwgMHg2NUIyLCAweDY1QjMsIDB4NjVCNCwgMHg2NUI1LCAweDY1QjYsIDB4NjVCOCwKKyAgICAweDY1QkEsIDB4NjVCQiwgMHg2NUJFLCAweDY1QkYsIDB4NjVDMCwgMHg2NUMyLCAweDY1QzcsIDB4NjVDOCwgMHg2NUM5LAorICAgIDB4NjVDQSwgMHg2NUNELCAweDY1RDAsIDB4NjVEMSwgMHg2NUQzLCAweDY1RDQsIDB4NjVENSwgMHg2NUQ4LCAweDY1RDksCisgICAgMHg2NURBLCAweDY1REIsIDB4NjVEQywgMHg2NURELCAweDY1REUsIDB4NjVERiwgMHg2NUUxLCAweDY1RTMsIDB4NjVFNCwKKyAgICAweDY1RUEsIDB4NjVFQiwgMHg2NUYyLCAweDY1RjMsIDB4NjVGNCwgMHg2NUY1LCAweDY1RjgsIDB4NjVGOSwgMHg2NUZCLAorICAgIDB4NjVGQywgMHg2NUZELCAweDY1RkUsIDB4NjVGRiwgMHg2NjAxLCAweDY2MDQsIDB4NjYwNSwgMHg2NjA3LCAweDY2MDgsCisgICAgMHg2NjA5LCAweDY2MEIsIDB4NjYwRCwgMHg2NjEwLCAweDY2MTEsIDB4NjYxMiwgMHg2NjE2LCAweDY2MTcsIDB4NjYxOCwKKyAgICAweDY2MUEsIDB4NjYxQiwgMHg2NjFDLCAweDY2MUUsIDB4NjYyMSwgMHg2NjIyLCAweDY2MjMsIDB4NjYyNCwgMHg2NjI2LAorICAgIDB4NjYyOSwgMHg2NjJBLCAweDY2MkIsIDB4NjYyQywgMHg2NjJFLCAweDY2MzAsIDB4NjYzMiwgMHg2NjMzLCAweDY2MzcsCisgICAgMHg2NjM4LCAweDY2MzksIDB4NjYzQSwgMHg2NjNCLCAweDY2M0QsIDB4NjYzRiwgMHg2NjQwLCAweDY2NDQsIDB4NjY0NSwKKyAgICAweDY2NDYsIDB4NjY0NywgMHg2NjQ4LCAweDY2NDksIDB4NjY0QSwgMHg2NjRELCAweDY2NEUsIDB4NjY1MCwgMHg2NjUxLAorICAgIDB4NjY1OCwgMHg2NjU5LCAweDY2NUIsIDB4NjY1QywgMHg2NjVFLCAweDY2NjAsIDB4NjY2MiwgMHg2NjYzLCAweDY2NjUsCisgICAgMHg2NjY3LCAweDY2NjksIDB4NjY2QSwgMHg2NjZCLCAweDY2NkMsIDB4NjY2RCwgMHg2NjcxLCAweDY2NzIsIDB4NjY3MywKKyAgICAweDY2NzUsIDB4NjY3OCwgMHg2Njc5LCAweDY2N0IsIDB4NjY3QywgMHg2NjdELCAweDY2N0YsIDB4NjY4MCwgMHg2NjgxLAorICAgIDB4NjY4MywgMHg2Njg1LCAweDY2ODYsIDB4NjY4QSwgMHg2NjhCLCAweDY2OEQsIDB4NjY4RSwgMHg2NjhGLCAweDY2OTAsCisgICAgMHg2NjkyLCAweDY2OTMsIDB4NjY5NCwgMHg2Njk1LCAweDY2OTgsIDB4NjY5OSwgMHg2NjlBLCAweDY2OUIsIDB4NjY5QywKKyAgICAweDY2OUUsIDB4NjY5RiwgMHg2NkEwLCAweDY2QTEsIDB4NjZBMywgMHg2NkE0LCAweDY2QTUsIDB4NjZBNiwgMHg2NkE5LAorICAgIDB4NjZBQSwgMHg2NkFDLCAweDY2QUQsIDB4NjZBRiwgMHg2NkIwLCAweDY2QjEsIDB4NjZCMiwgMHg2NkIzLCAweDY2QjUsCisgICAgMHg2NkI2LCAweDY2QjcsIDB4NjZCOCwgMHg2NkJBLCAweDY2QkIsIDB4NjZCQywgMHg2NkJELCAweDY2QkYsIDB4NjZDMCwKKyAgICAweDY2QzEsIDB4NjZDMiwgMHg2NkMzLCAweDY2QzUsIDB4NjZDOCwgMHg2NkNBLCAweDY2Q0IsIDB4NjZDQywgMHg2NkNELAorICAgIDB4NjZDRSwgMHg2NkNGLCAweDY2RDAsIDB4NjZEMSwgMHg2NkQyLCAweDY2RDMsIDB4NjZENCwgMHg2NkQ1LCAweDY2RDcsCisgICAgMHg2NkQ4LCAweDY2REEsIDB4NjZERSwgMHg2NkRGLCAweDY2RTEsIDB4NjZFMiwgMHg2NkUzLCAweDY2RTQsIDB4NjZFNSwKKyAgICAweDY2RTcsIDB4NjZFOCwgMHg2NkVBLCAweDY2RUIsIDB4NjZFRCwgMHg2NkVFLCAweDY2RUYsIDB4NjZGMSwgMHg2NkY1LAorICAgIDB4NjZGNiwgMHg2NkZBLCAweDY2RkIsIDB4NjZGRCwgMHg2NzAxLCAweDY3MDIsIDB4NjcwNCwgMHg2NzA1LCAweDY3MDYsCisgICAgMHg2NzA3LCAweDY3MEMsIDB4NjcwRSwgMHg2NzBGLCAweDY3MTEsIDB4NjcxMiwgMHg2NzEzLCAweDY3MTYsIDB4NjcxOCwKKyAgICAweDY3MTksIDB4NjcxQSwgMHg2NzFDLCAweDY3MUUsIDB4NjcyMCwgMHg2NzIxLCAweDY3MjIsIDB4NjcyMywgMHg2NzI0LAorICAgIDB4NjcyNSwgMHg2NzI5LCAweDY3MkUsIDB4NjczMCwgMHg2NzMyLCAweDY3MzMsIDB4NjczNiwgMHg2NzM3LCAweDY3MzgsCisgICAgMHg2NzM5LCAweDY3M0IsIDB4NjczQywgMHg2NzNFLCAweDY3M0YsIDB4Njc0MSwgMHg2NzQ0LCAweDY3NDUsIDB4Njc0NywKKyAgICAweDY3NEEsIDB4Njc0QiwgMHg2NzRELCAweDY3NTIsIDB4Njc1NCwgMHg2NzU1LCAweDY3NTcsIDB4Njc1OCwgMHg2NzU5LAorICAgIDB4Njc1QSwgMHg2NzVCLCAweDY3NUQsIDB4Njc2MiwgMHg2NzYzLCAweDY3NjQsIDB4Njc2NiwgMHg2NzY3LCAweDY3NkIsCisgICAgMHg2NzZDLCAweDY3NkUsIDB4Njc3NCwgMHg2Nzc2LCAweDY3NzgsIDB4Njc3OSwgMHg2NzdBLCAweDY3N0IsIDB4Njc3RCwKKyAgICAweDY3ODAsIDB4Njc4MiwgMHg2NzgzLCAweDY3ODUsIDB4Njc4NiwgMHg2Nzg4LCAweDY3OEEsIDB4Njc4QywgMHg2NzhELAorICAgIDB4Njc4RSwgMHg2NzhGLCAweDY3OTEsIDB4Njc5MiwgMHg2NzkzLCAweDY3OTQsIDB4Njc5NiwgMHg2Nzk5LCAweDY3OUIsCisgICAgMHg2NzlGLCAweDY3QTAsIDB4NjdBMSwgMHg2N0E0LCAweDY3QTYsIDB4NjdBOSwgMHg2N0FDLCAweDY3QUUsIDB4NjdCMSwKKyAgICAweDY3QjIsIDB4NjdCNCwgMHg2N0I5LCAweDY3QkEsIDB4NjdCQiwgMHg2N0JDLCAweDY3QkQsIDB4NjdCRSwgMHg2N0JGLAorICAgIDB4NjdDMCwgMHg2N0MyLCAweDY3QzUsIDB4NjdDNiwgMHg2N0M3LCAweDY3QzgsIDB4NjdDOSwgMHg2N0NBLCAweDY3Q0IsCisgICAgMHg2N0NDLCAweDY3Q0QsIDB4NjdDRSwgMHg2N0Q1LCAweDY3RDYsIDB4NjdENywgMHg2N0RCLCAweDY3REYsIDB4NjdFMSwKKyAgICAweDY3RTMsIDB4NjdFNCwgMHg2N0U2LCAweDY3RTcsIDB4NjdFOCwgMHg2N0VBLCAweDY3RUIsIDB4NjdFRCwgMHg2N0VFLAorICAgIDB4NjdGMiwgMHg2N0Y1LCAweDY3RjYsIDB4NjdGNywgMHg2N0Y4LCAweDY3RjksIDB4NjdGQSwgMHg2N0ZCLCAweDY3RkMsCisgICAgMHg2N0ZFLCAweDY4MDEsIDB4NjgwMiwgMHg2ODAzLCAweDY4MDQsIDB4NjgwNiwgMHg2ODBELCAweDY4MTAsIDB4NjgxMiwKKyAgICAweDY4MTQsIDB4NjgxNSwgMHg2ODE4LCAweDY4MTksIDB4NjgxQSwgMHg2ODFCLCAweDY4MUMsIDB4NjgxRSwgMHg2ODFGLAorICAgIDB4NjgyMCwgMHg2ODIyLCAweDY4MjMsIDB4NjgyNCwgMHg2ODI1LCAweDY4MjYsIDB4NjgyNywgMHg2ODI4LCAweDY4MkIsCisgICAgMHg2ODJDLCAweDY4MkQsIDB4NjgyRSwgMHg2ODJGLCAweDY4MzAsIDB4NjgzMSwgMHg2ODM0LCAweDY4MzUsIDB4NjgzNiwKKyAgICAweDY4M0EsIDB4NjgzQiwgMHg2ODNGLCAweDY4NDcsIDB4Njg0QiwgMHg2ODRELCAweDY4NEYsIDB4Njg1MiwgMHg2ODU2LAorICAgIDB4Njg1NywgMHg2ODU4LCAweDY4NTksIDB4Njg1QSwgMHg2ODVCLCAweDY4NUMsIDB4Njg1RCwgMHg2ODVFLCAweDY4NUYsCisgICAgMHg2ODZBLCAweDY4NkMsIDB4Njg2RCwgMHg2ODZFLCAweDY4NkYsIDB4Njg3MCwgMHg2ODcxLCAweDY4NzIsIDB4Njg3MywKKyAgICAweDY4NzUsIDB4Njg3OCwgMHg2ODc5LCAweDY4N0EsIDB4Njg3QiwgMHg2ODdDLCAweDY4N0QsIDB4Njg3RSwgMHg2ODdGLAorICAgIDB4Njg4MCwgMHg2ODgyLCAweDY4ODQsIDB4Njg4NywgMHg2ODg4LCAweDY4ODksIDB4Njg4QSwgMHg2ODhCLCAweDY4OEMsCisgICAgMHg2ODhELCAweDY4OEUsIDB4Njg5MCwgMHg2ODkxLCAweDY4OTIsIDB4Njg5NCwgMHg2ODk1LCAweDY4OTYsIDB4Njg5OSwKKyAgICAweDY4OUEsIDB4Njg5QiwgMHg2ODlDLCAweDY4OUUsIDB4NjhBMCwgMHg2OEExLCAweDY4QTMsIDB4NjhBNCwgMHg2OEE1LAorICAgIDB4NjhBOSwgMHg2OEFBLCAweDY4QUIsIDB4NjhBQywgMHg2OEFFLCAweDY4QjEsIDB4NjhCMiwgMHg2OEI0LCAweDY4QjYsCisgICAgMHg2OEI3LCAweDY4QjgsIDB4NjhCOSwgMHg2OEJBLCAweDY4QkIsIDB4NjhCQywgMHg2OEJELCAweDY4QkUsIDB4NjhCRiwKKyAgICAweDY4QzEsIDB4NjhDMywgMHg2OEM0LCAweDY4QzUsIDB4NjhDNiwgMHg2OEM3LCAweDY4QzgsIDB4NjhDQSwgMHg2OENDLAorICAgIDB4NjhDRSwgMHg2OENGLCAweDY4RDAsIDB4NjhEMSwgMHg2OEQzLCAweDY4RDQsIDB4NjhEOSwgMHg2OERCLCAweDY4REMsCisgICAgMHg2OERELCAweDY4REUsIDB4NjhFMSwgMHg2OEUyLCAweDY4RTQsIDB4NjhFNSwgMHg2OEU2LCAweDY4RTgsIDB4NjhFOSwKKyAgICAweDY4RUEsIDB4NjhFQiwgMHg2OEVDLCAweDY4RUQsIDB4NjhFRiwgMHg2OEYyLCAweDY4RjMsIDB4NjhGNCwgMHg2OEY2LAorICAgIDB4NjhGNywgMHg2OEY4LCAweDY4RkIsIDB4NjhGRCwgMHg2OEZFLCAweDY4RkYsIDB4NjkwMCwgMHg2OTAyLCAweDY5MDMsCisgICAgMHg2OTA0LCAweDY5MDYsIDB4NjkwNywgMHg2OTA4LCAweDY5MDksIDB4NjkwQSwgMHg2OTBDLCAweDY5MTEsIDB4NjkxMywKKyAgICAweDY5MTQsIDB4NjkxNSwgMHg2OTE2LCAweDY5MTcsIDB4NjkxOCwgMHg2OTE5LCAweDY5MUEsIDB4NjkxQiwgMHg2OTFDLAorICAgIDB4NjkxRCwgMHg2OTFFLCAweDY5MjEsIDB4NjkyMiwgMHg2OTIzLCAweDY5MjUsIDB4NjkyNiwgMHg2OTI3LCAweDY5MjgsCisgICAgMHg2OTI5LCAweDY5MkEsIDB4NjkyQiwgMHg2OTJDLCAweDY5MkUsIDB4NjkyRiwgMHg2OTMxLCAweDY5MzIsIDB4NjkzMywKKyAgICAweDY5MzUsIDB4NjkzNiwgMHg2OTM3LCAweDY5MzgsIDB4NjkzQSwgMHg2OTNCLCAweDY5M0MsIDB4NjkzRSwgMHg2OTQwLAorICAgIDB4Njk0MSwgMHg2OTQzLCAweDY5NDQsIDB4Njk0NSwgMHg2OTQ2LCAweDY5NDcsIDB4Njk0OCwgMHg2OTQ5LCAweDY5NEIsCisgICAgMHg2OTRDLCAweDY5NEQsIDB4Njk0RSwgMHg2OTRGLCAweDY5NTAsIDB4Njk1MSwgMHg2OTUyLCAweDY5NTUsIDB4Njk1NiwKKyAgICAweDY5NTgsIDB4Njk1OSwgMHg2OTVCLCAweDY5NUMsIDB4Njk1RiwgMHg2OTYxLCAweDY5NjIsIDB4Njk2NCwgMHg2OTY1LAorICAgIDB4Njk2NywgMHg2OTY5LCAweDY5NkEsIDB4Njk2QywgMHg2OTZGLCAweDY5NzAsIDB4Njk3MiwgMHg2OTczLCAweDY5NzQsCisgICAgMHg2OTc2LCAweDY5N0EsIDB4Njk3QiwgMHg2OTdELCAweDY5N0UsIDB4Njk3RiwgMHg2OTgxLCAweDY5ODMsIDB4Njk4NSwKKyAgICAweDY5OEEsIDB4Njk4QiwgMHg2OThDLCAweDY5OEUsIDB4Njk4RiwgMHg2OTkwLCAweDY5OTEsIDB4Njk5MiwgMHg2OTkzLAorICAgIDB4Njk5NiwgMHg2OTk3LCAweDY5OTksIDB4Njk5QSwgMHg2OTlELCAweDY5OUUsIDB4Njk5RiwgMHg2OUEwLCAweDY5QTEsCisgICAgMHg2OUEyLCAweDY5QTMsIDB4NjlBNCwgMHg2OUE1LCAweDY5QTYsIDB4NjlBOSwgMHg2OUFDLCAweDY5QUYsIDB4NjlCMCwKKyAgICAweDY5QjIsIDB4NjlCMywgMHg2OUI1LCAweDY5QjYsIDB4NjlCOCwgMHg2OUI5LCAweDY5QkEsIDB4NjlCQywgMHg2OUJELAorICAgIDB4NjlCRSwgMHg2OUMwLCAweDY5QzIsIDB4NjlDMywgMHg2OUM0LCAweDY5QzUsIDB4NjlDNiwgMHg2OUM3LCAweDY5QzgsCisgICAgMHg2OUM5LCAweDY5Q0YsIDB4NjlEMSwgMHg2OUQyLCAweDY5RDMsIDB4NjlENSwgMHg2OUQ2LCAweDY5RDcsIDB4NjlEOCwKKyAgICAweDY5RDksIDB4NjlEQSwgMHg2OURDLCAweDY5REQsIDB4NjlERSwgMHg2OUUxLCAweDY5RTIsIDB4NjlFMywgMHg2OUU0LAorICAgIDB4NjlFNSwgMHg2OUU2LCAweDY5RTgsIDB4NjlFOSwgMHg2OUVBLCAweDY5RUIsIDB4NjlFQywgMHg2OUVFLCAweDY5RUYsCisgICAgMHg2OUYwLCAweDY5RjEsIDB4NjlGNCwgMHg2OUY1LCAweDY5RjYsIDB4NjlGNywgMHg2OUY4LCAweDY5RjksIDB4NjlGQSwKKyAgICAweDY5RkIsIDB4NjlGQywgMHg2OUZFLCAweDZBMDAsIDB4NkEwMywgMHg2QTA0LCAweDZBMDYsIDB4NkEwNywgMHg2QTA4LAorICAgIDB4NkEwOSwgMHg2QTBCLCAweDZBMEMsIDB4NkEwRCwgMHg2QTBFLCAweDZBMEYsIDB4NkExMCwgMHg2QTExLCAweDZBMTIsCisgICAgMHg2QTE0LCAweDZBMTUsIDB4NkExNiwgMHg2QTFBLCAweDZBMUIsIDB4NkExQywgMHg2QTFELCAweDZBMjAsIDB4NkEyMiwKKyAgICAweDZBMjQsIDB4NkEyNSwgMHg2QTI2LCAweDZBMjcsIDB4NkEyOSwgMHg2QTJCLCAweDZBMkMsIDB4NkEyRCwgMHg2QTJFLAorICAgIDB4NkEzMCwgMHg2QTMyLCAweDZBMzMsIDB4NkEzNCwgMHg2QTM2LCAweDZBMzcsIDB4NkEzQiwgMHg2QTNDLCAweDZBM0YsCisgICAgMHg2QTQwLCAweDZBNDEsIDB4NkE0MiwgMHg2QTQzLCAweDZBNDUsIDB4NkE0NiwgMHg2QTQ5LCAweDZBNEEsIDB4NkE0QywKKyAgICAweDZBNEQsIDB4NkE0RSwgMHg2QTRGLCAweDZBNTEsIDB4NkE1MiwgMHg2QTUzLCAweDZBNTQsIDB4NkE1NSwgMHg2QTU2LAorICAgIDB4NkE1NywgMHg2QTVBLCAweDZBNUMsIDB4NkE1RCwgMHg2QTVFLCAweDZBNjAsIDB4NkE2MywgMHg2QTY0LCAweDZBNjYsCisgICAgMHg2QTY3LCAweDZBNjgsIDB4NkE2OSwgMHg2QTZBLCAweDZBNkIsIDB4NkE2QywgMHg2QTZELCAweDZBNkUsIDB4NkE2RiwKKyAgICAweDZBNzAsIDB4NkE3MiwgMHg2QTczLCAweDZBNzQsIDB4NkE3NSwgMHg2QTc2LCAweDZBNzcsIDB4NkE3OCwgMHg2QTdBLAorICAgIDB4NkE3QiwgMHg2QTdELCAweDZBN0UsIDB4NkE3RiwgMHg2QTgxLCAweDZBODIsIDB4NkE4MywgMHg2QTg1LCAweDZBODYsCisgICAgMHg2QTg3LCAweDZBODgsIDB4NkE4QSwgMHg2QThCLCAweDZBOEMsIDB4NkE4RCwgMHg2QThGLCAweDZBOTIsIDB4NkE5MywKKyAgICAweDZBOTUsIDB4NkE5NiwgMHg2QTk4LCAweDZBOTksIDB4NkE5QSwgMHg2QTlCLCAweDZBOUQsIDB4NkE5RSwgMHg2QTlGLAorICAgIDB4NkFBMSwgMHg2QUE0LCAweDZBQTUsIDB4NkFBNiwgMHg2QUE3LCAweDZBQTgsIDB4NkFBQSwgMHg2QUFELCAweDZBQUUsCisgICAgMHg2QUIwLCAweDZBQjEsIDB4NkFCMiwgMHg2QUI0LCAweDZBQjUsIDB4NkFCNiwgMHg2QUI3LCAweDZBQjksIDB4NkFCQSwKKyAgICAweDZBQkMsIDB4NkFCRCwgMHg2QUJFLCAweDZBQkYsIDB4NkFDMCwgMHg2QUMxLCAweDZBQzIsIDB4NkFDNCwgMHg2QUM1LAorICAgIDB4NkFDNiwgMHg2QUM3LCAweDZBQzgsIDB4NkFDOSwgMHg2QUNBLCAweDZBQ0IsIDB4NkFDQywgMHg2QUNELCAweDZBQ0UsCisgICAgMHg2QUNGLCAweDZBRDAsIDB4NkFEMSwgMHg2QUQyLCAweDZBRDQsIDB4NkFENSwgMHg2QUQ2LCAweDZBRDcsIDB4NkFEOCwKKyAgICAweDZBRDksIDB4NkFEQywgMHg2QUUwLCAweDZBRTEsIDB4NkFFMiwgMHg2QUUzLCAweDZBRTQsIDB4NkFFNSwgMHg2QUU2LAorICAgIDB4NkFFOSwgMHg2QUVCLCAweDZBRUQsIDB4NkFFRSwgMHg2QUVGLCAweDZBRjAsIDB4NkFGMSwgMHg2QUYyLCAweDZBRjQsCisgICAgMHg2QUY1LCAweDZBRjYsIDB4NkFGNywgMHg2QUY5LCAweDZBRkEsIDB4NkFGQywgMHg2QUZELCAweDZBRkUsIDB4NkFGRiwKKyAgICAweDZCMDAsIDB4NkIwMSwgMHg2QjAyLCAweDZCMDMsIDB4NkIwNSwgMHg2QjA2LCAweDZCMDcsIDB4NkIwOCwgMHg2QjA5LAorICAgIDB4NkIwQiwgMHg2QjBDLCAweDZCMEQsIDB4NkIwRSwgMHg2QjEwLCAweDZCMTEsIDB4NkIxMywgMHg2QjE0LCAweDZCMTUsCisgICAgMHg2QjE3LCAweDZCMTgsIDB4NkIxOSwgMHg2QjFBLCAweDZCMUIsIDB4NkIxQywgMHg2QjFELCAweDZCMUYsIDB4NkIyNSwKKyAgICAweDZCMjYsIDB4NkIyOCwgMHg2QjI5LCAweDZCMkEsIDB4NkIyQiwgMHg2QjJDLCAweDZCMkQsIDB4NkIyRSwgMHg2QjJGLAorICAgIDB4NkIzMCwgMHg2QjMxLCAweDZCMzMsIDB4NkIzNCwgMHg2QjM1LCAweDZCMzYsIDB4NkIzOCwgMHg2QjNCLCAweDZCM0MsCisgICAgMHg2QjNGLCAweDZCNDAsIDB4NkI0MSwgMHg2QjQyLCAweDZCNDQsIDB4NkI0NSwgMHg2QjQ4LCAweDZCNEEsIDB4NkI0QiwKKyAgICAweDZCNEQsIDB4NkI0RSwgMHg2QjRGLCAweDZCNTEsIDB4NkI1MiwgMHg2QjUzLCAweDZCNTQsIDB4NkI1NSwgMHg2QjU2LAorICAgIDB4NkI1NywgMHg2QjU4LCAweDZCNUEsIDB4NkI1QiwgMHg2QjVDLCAweDZCNUQsIDB4NkI1RSwgMHg2QjYwLCAweDZCNjgsCisgICAgMHg2QjY5LCAweDZCNkIsIDB4NkI2QywgMHg2QjZELCAweDZCNkUsIDB4NkI2RiwgMHg2QjcwLCAweDZCNzEsIDB4NkI3MywKKyAgICAweDZCNzQsIDB4NkI3NSwgMHg2Qjc2LCAweDZCN0EsIDB4NkI3RCwgMHg2QjdFLCAweDZCN0YsIDB4NkI4MCwgMHg2Qjg1LAorICAgIDB4NkI4OCwgMHg2QjhDLCAweDZCOEUsIDB4NkI4RiwgMHg2QjkwLCAweDZCOTEsIDB4NkI5NCwgMHg2Qjk1LCAweDZCOTcsCisgICAgMHg2Qjk5LCAweDZCOUMsIDB4NkI5RCwgMHg2QjlGLCAweDZCQTAsIDB4NkJBMiwgMHg2QkEzLCAweDZCQTUsIDB4NkJBNiwKKyAgICAweDZCQTcsIDB4NkJBOCwgMHg2QkE5LCAweDZCQUMsIDB4NkJBRCwgMHg2QkIwLCAweDZCQjEsIDB4NkJCNiwgMHg2QkI4LAorICAgIDB4NkJCOSwgMHg2QkJDLCAweDZCQkQsIDB4NkJCRSwgMHg2QkMwLCAweDZCQzMsIDB4NkJDNCwgMHg2QkM3LCAweDZCQzgsCisgICAgMHg2QkM5LCAweDZCQ0EsIDB4NkJDQywgMHg2QkNFLCAweDZCRDAsIDB4NkJEMSwgMHg2QkQ4LCAweDZCREEsIDB4NkJEQywKKyAgICAweDZCREQsIDB4NkJERSwgMHg2QkRGLCAweDZCRTAsIDB4NkJFMiwgMHg2QkUzLCAweDZCRTQsIDB4NkJFNSwgMHg2QkU2LAorICAgIDB4NkJFNywgMHg2QkU4LCAweDZCRTksIDB4NkJFQywgMHg2QkVELCAweDZCRUUsIDB4NkJGMCwgMHg2QkYxLCAweDZCRjIsCisgICAgMHg2QkY0LCAweDZCRjYsIDB4NkJGNywgMHg2QkY4LCAweDZCRkEsIDB4NkJGQiwgMHg2QkZDLCAweDZCRkUsIDB4NkMwMCwKKyAgICAweDZDMDEsIDB4NkMwMiwgMHg2QzAzLCAweDZDMDQsIDB4NkMwOSwgMHg2QzBBLCAweDZDMEIsIDB4NkMwRSwgMHg2QzEyLAorICAgIDB4NkMxNywgMHg2QzFDLCAweDZDMUQsIDB4NkMxRSwgMHg2QzIwLCAweDZDMjUsIDB4NkMyRCwgMHg2QzMxLCAweDZDMzMsCisgICAgMHg2QzM2LCAweDZDMzcsIDB4NkMzOSwgMHg2QzNBLCAweDZDM0IsIDB4NkMzQywgMHg2QzNFLCAweDZDM0YsIDB4NkM0MywKKyAgICAweDZDNDQsIDB4NkM0NSwgMHg2QzQ4LCAweDZDNEIsIDB4NkM0QywgMHg2QzRELCAweDZDNEUsIDB4NkM0RiwgMHg2QzUxLAorICAgIDB4NkM1MiwgMHg2QzUzLCAweDZDNTYsIDB4NkM1OCwgMHg2QzU5LCAweDZDNUEsIDB4NkM2MiwgMHg2QzYzLCAweDZDNjUsCisgICAgMHg2QzY2LCAweDZDNjcsIDB4NkM2QiwgMHg2QzZDLCAweDZDNkQsIDB4NkM2RSwgMHg2QzZGLCAweDZDNzEsIDB4NkM3MywKKyAgICAweDZDNzUsIDB4NkM3NywgMHg2Qzc4LCAweDZDN0EsIDB4NkM3QiwgMHg2QzdDLCAweDZDN0YsIDB4NkM4MCwgMHg2Qzg0LAorICAgIDB4NkM4NywgMHg2QzhBLCAweDZDOEIsIDB4NkM4RCwgMHg2QzhFLCAweDZDOTEsIDB4NkM5MiwgMHg2Qzk1LCAweDZDOTYsCisgICAgMHg2Qzk3LCAweDZDOTgsIDB4NkM5QSwgMHg2QzlDLCAweDZDOUQsIDB4NkM5RSwgMHg2Q0EwLCAweDZDQTIsIDB4NkNBOCwKKyAgICAweDZDQUMsIDB4NkNBRiwgMHg2Q0IwLCAweDZDQjQsIDB4NkNCNSwgMHg2Q0I2LCAweDZDQjcsIDB4NkNCQSwgMHg2Q0MwLAorICAgIDB4NkNDMSwgMHg2Q0MyLCAweDZDQzMsIDB4NkNDNiwgMHg2Q0M3LCAweDZDQzgsIDB4NkNDQiwgMHg2Q0NELCAweDZDQ0UsCisgICAgMHg2Q0NGLCAweDZDRDEsIDB4NkNEMiwgMHg2Q0Q4LCAweDZDRDksIDB4NkNEQSwgMHg2Q0RDLCAweDZDREQsIDB4NkNERiwKKyAgICAweDZDRTQsIDB4NkNFNiwgMHg2Q0U3LCAweDZDRTksIDB4NkNFQywgMHg2Q0VELCAweDZDRjIsIDB4NkNGNCwgMHg2Q0Y5LAorICAgIDB4NkNGRiwgMHg2RDAwLCAweDZEMDIsIDB4NkQwMywgMHg2RDA1LCAweDZEMDYsIDB4NkQwOCwgMHg2RDA5LCAweDZEMEEsCisgICAgMHg2RDBELCAweDZEMEYsIDB4NkQxMCwgMHg2RDExLCAweDZEMTMsIDB4NkQxNCwgMHg2RDE1LCAweDZEMTYsIDB4NkQxOCwKKyAgICAweDZEMUMsIDB4NkQxRCwgMHg2RDFGLCAweDZEMjAsIDB4NkQyMSwgMHg2RDIyLCAweDZEMjMsIDB4NkQyNCwgMHg2RDI2LAorICAgIDB4NkQyOCwgMHg2RDI5LCAweDZEMkMsIDB4NkQyRCwgMHg2RDJGLCAweDZEMzAsIDB4NkQzNCwgMHg2RDM2LCAweDZEMzcsCisgICAgMHg2RDM4LCAweDZEM0EsIDB4NkQzRiwgMHg2RDQwLCAweDZENDIsIDB4NkQ0NCwgMHg2RDQ5LCAweDZENEMsIDB4NkQ1MCwKKyAgICAweDZENTUsIDB4NkQ1NiwgMHg2RDU3LCAweDZENTgsIDB4NkQ1QiwgMHg2RDVELCAweDZENUYsIDB4NkQ2MSwgMHg2RDYyLAorICAgIDB4NkQ2NCwgMHg2RDY1LCAweDZENjcsIDB4NkQ2OCwgMHg2RDZCLCAweDZENkMsIDB4NkQ2RCwgMHg2RDcwLCAweDZENzEsCisgICAgMHg2RDcyLCAweDZENzMsIDB4NkQ3NSwgMHg2RDc2LCAweDZEN0EsIDB4NkQ3QiwgMHg2RDdELCAweDZEN0UsIDB4NkQ3RiwKKyAgICAweDZEODAsIDB4NkQ4MSwgMHg2RDgzLCAweDZEODQsIDB4NkQ4NiwgMHg2RDhBLCAweDZEOEIsIDB4NkQ4RCwgMHg2RDhGLAorICAgIDB4NkQ5MCwgMHg2RDkyLCAweDZEOTYsIDB4NkQ5NywgMHg2RDk4LCAweDZEOTksIDB4NkQ5QSwgMHg2RDlDLCAweDZEQTIsCisgICAgMHg2REE1LCAweDZEQUMsIDB4NkRBRCwgMHg2REIwLCAweDZEQjEsIDB4NkRCMywgMHg2REI0LCAweDZEQjYsIDB4NkRCNywKKyAgICAweDZEQjksIDB4NkRCQSwgMHg2REJCLCAweDZEQkMsIDB4NkRCRCwgMHg2REJFLCAweDZEQzEsIDB4NkRDMiwgMHg2REMzLAorICAgIDB4NkRDOCwgMHg2REM5LCAweDZEQ0EsIDB4NkRDRCwgMHg2RENFLCAweDZEQ0YsIDB4NkREMCwgMHg2REQyLCAweDZERDMsCisgICAgMHg2REQ0LCAweDZERDUsIDB4NkRENywgMHg2RERBLCAweDZEREIsIDB4NkREQywgMHg2RERGLCAweDZERTIsIDB4NkRFMywKKyAgICAweDZERTUsIDB4NkRFNywgMHg2REU4LCAweDZERTksIDB4NkRFRCwgMHg2REVGLCAweDZERjAsIDB4NkRGMiwgMHg2REY0LAorICAgIDB4NkRGOCwgMHg2REZELCAweDZERkUsIDB4NkRGRiwgMHg2RTAwLCAweDZFMDEsIDB4NkUwMiwgMHg2RTAzLCAweDZFMDQsCisgICAgMHg2RTA2LCAweDZFMDcsIDB4NkUwOCwgMHg2RTA5LCAweDZFMEIsIDB4NkUwRiwgMHg2RTEyLCAweDZFMTMsIDB4NkUxNSwKKyAgICAweDZFMTgsIDB4NkUxOSwgMHg2RTFCLCAweDZFMUMsIDB4NkUxRSwgMHg2RTFGLCAweDZFMjIsIDB4NkUyNywgMHg2RTI4LAorICAgIDB4NkUyQSwgMHg2RTJFLCAweDZFMzAsIDB4NkUzMSwgMHg2RTMzLCAweDZFMzUsIDB4NkUzNiwgMHg2RTM3LCAweDZFMzksCisgICAgMHg2RTNCLCAweDZFM0MsIDB4NkUzRCwgMHg2RTNGLCAweDZFNDAsIDB4NkU0MSwgMHg2RTQyLCAweDZFNDUsIDB4NkU0NiwKKyAgICAweDZFNDcsIDB4NkU0OCwgMHg2RTQ5LCAweDZFNEEsIDB4NkU0QiwgMHg2RTRDLCAweDZFNEYsIDB4NkU1MCwgMHg2RTUxLAorICAgIDB4NkU1MiwgMHg2RTU1LCAweDZFNTcsIDB4NkU1OSwgMHg2RTVBLCAweDZFNUMsIDB4NkU1RCwgMHg2RTYwLCAweDZFNjEsCisgICAgMHg2RTYyLCAweDZFNjMsIDB4NkU2NCwgMHg2RTY1LCAweDZFNjYsIDB4NkU2NywgMHg2RTY4LCAweDZFNjksIDB4NkU2QSwKKyAgICAweDZFNkMsIDB4NkU2RCwgMHg2RTcwLCAweDZFNzEsIDB4NkU3MiwgMHg2RTczLCAweDZFNzQsIDB4NkU3NSwgMHg2RTc2LAorICAgIDB4NkU3NywgMHg2RTc4LCAweDZFNzksIDB4NkU3QSwgMHg2RTdCLCAweDZFN0MsIDB4NkU3RCwgMHg2RTgwLCAweDZFODEsCisgICAgMHg2RTgyLCAweDZFODQsIDB4NkU4NywgMHg2RTg4LCAweDZFOEEsIDB4NkU4QiwgMHg2RThDLCAweDZFOEQsIDB4NkU4RSwKKyAgICAweDZFOTEsIDB4NkU5MiwgMHg2RTkzLCAweDZFOTQsIDB4NkU5NSwgMHg2RTk3LCAweDZFOTksIDB4NkU5QSwgMHg2RTlCLAorICAgIDB4NkU5RSwgMHg2RUEwLCAweDZFQTEsIDB4NkVBMywgMHg2RUE0LCAweDZFQTYsIDB4NkVBOCwgMHg2RUE5LCAweDZFQUIsCisgICAgMHg2RUFDLCAweDZFQUQsIDB4NkVBRSwgMHg2RUIwLCAweDZFQjMsIDB4NkVCNSwgMHg2RUI4LCAweDZFQjksIDB4NkVCQywKKyAgICAweDZFQkUsIDB4NkVCRiwgMHg2RUMwLCAweDZFQzMsIDB4NkVDNiwgMHg2RUM4LCAweDZFQzksIDB4NkVDQSwgMHg2RUNELAorICAgIDB4NkVEMCwgMHg2RUQyLCAweDZFRDYsIDB4NkVEOCwgMHg2RUQ5LCAweDZFREIsIDB4NkVEQywgMHg2RURELCAweDZFRTMsCisgICAgMHg2RUU3LCAweDZFRUEsIDB4NkVFQiwgMHg2RUVELCAweDZFRUUsIDB4NkVGMCwgMHg2RUYxLCAweDZFRjMsIDB4NkVGNSwKKyAgICAweDZFRjYsIDB4NkVGQSwgMHg2RUZCLCAweDZFRkMsIDB4NkVGRCwgMHg2RUZFLCAweDZGMDAsIDB4NkYwMywgMHg2RjA0LAorICAgIDB4NkYwNSwgMHg2RjA3LCAweDZGMDgsIDB4NkYwQSwgMHg2RjBCLCAweDZGMEMsIDB4NkYwRCwgMHg2RjBFLCAweDZGMTAsCisgICAgMHg2RjExLCAweDZGMTIsIDB4NkYxNiwgMHg2RjE3LCAweDZGMTgsIDB4NkYxOSwgMHg2RjFCLCAweDZGMUMsIDB4NkYxRCwKKyAgICAweDZGMUUsIDB4NkYxRiwgMHg2RjIxLCAweDZGMjUsIDB4NkYyNiwgMHg2RjI3LCAweDZGMjgsIDB4NkYyRSwgMHg2RjMwLAorICAgIDB4NkYzNCwgMHg2RjM1LCAweDZGMzcsIDB4NkYzOSwgMHg2RjNBLCAweDZGM0IsIDB4NkYzQywgMHg2RjNELCAweDZGNDAsCisgICAgMHg2RjQyLCAweDZGNDMsIDB4NkY0NCwgMHg2RjQ1LCAweDZGNDgsIDB4NkY0OSwgMHg2RjRBLCAweDZGNEMsIDB4NkY0RSwKKyAgICAweDZGNEYsIDB4NkY1MCwgMHg2RjUyLCAweDZGNTMsIDB4NkY1NSwgMHg2RjU2LCAweDZGNTcsIDB4NkY1QSwgMHg2RjVCLAorICAgIDB4NkY1RCwgMHg2RjVGLCAweDZGNjAsIDB4NkY2MSwgMHg2RjYzLCAweDZGNjUsIDB4NkY2NywgMHg2RjY4LCAweDZGNjksCisgICAgMHg2RjZBLCAweDZGNkIsIDB4NkY2QywgMHg2RjcxLCAweDZGNzMsIDB4NkY3NSwgMHg2Rjc2LCAweDZGNzksIDB4NkY3QiwKKyAgICAweDZGN0QsIDB4NkY3RSwgMHg2RjgxLCAweDZGODIsIDB4NkY4MywgMHg2Rjg1LCAweDZGOEEsIDB4NkY4QiwgMHg2RjhGLAorICAgIDB4NkY5MCwgMHg2RjkxLCAweDZGOTIsIDB4NkY5MywgMHg2Rjk0LCAweDZGOTUsIDB4NkY5NiwgMHg2Rjk4LCAweDZGOTksCisgICAgMHg2RjlBLCAweDZGOUIsIDB4NkY5RCwgMHg2RjlFLCAweDZGOUYsIDB4NkZBMiwgMHg2RkEzLCAweDZGQTUsIDB4NkZBNiwKKyAgICAweDZGQTgsIDB4NkZBQSwgMHg2RkFCLCAweDZGQUMsIDB4NkZBRCwgMHg2RkFGLCAweDZGQjAsIDB4NkZCMiwgMHg2RkI0LAorICAgIDB4NkZCNSwgMHg2RkI3LCAweDZGQjgsIDB4NkZCQSwgMHg2RkJCLCAweDZGQkMsIDB4NkZCRCwgMHg2RkJFLCAweDZGQkYsCisgICAgMHg2RkM0LCAweDZGQzUsIDB4NkZDNiwgMHg2RkM3LCAweDZGQzgsIDB4NkZDQSwgMHg2RkNCLCAweDZGQ0MsIDB4NkZDRCwKKyAgICAweDZGQ0UsIDB4NkZDRiwgMHg2RkQwLCAweDZGRDMsIDB4NkZENCwgMHg2RkQ2LCAweDZGRDcsIDB4NkZEOSwgMHg2RkRBLAorICAgIDB4NkZEQywgMHg2RkRELCAweDZGRTIsIDB4NkZFMywgMHg2RkU1LCAweDZGRTYsIDB4NkZFNywgMHg2RkU4LCAweDZGRTksCisgICAgMHg2RkVBLCAweDZGRUMsIDB4NkZFRCwgMHg2RkYyLCAweDZGRjMsIDB4NkZGNCwgMHg2RkY1LCAweDZGRjYsIDB4NkZGNywKKyAgICAweDZGRjgsIDB4NkZGOSwgMHg2RkZCLCAweDZGRkQsIDB4NkZGRiwgMHg3MDAwLCAweDcwMDEsIDB4NzAwMiwgMHg3MDAzLAorICAgIDB4NzAwNCwgMHg3MDA3LCAweDcwMDgsIDB4NzAwQSwgMHg3MDBDLCAweDcwMEQsIDB4NzAwRSwgMHg3MDEwLCAweDcwMTIsCisgICAgMHg3MDEzLCAweDcwMTQsIDB4NzAxNiwgMHg3MDE3LCAweDcwMTksIDB4NzAxQywgMHg3MDFFLCAweDcwMjEsIDB4NzAyMiwKKyAgICAweDcwMjQsIDB4NzAyNSwgMHg3MDI2LCAweDcwMjksIDB4NzAyQSwgMHg3MDJCLCAweDcwMkMsIDB4NzAyRCwgMHg3MDJFLAorICAgIDB4NzAyRiwgMHg3MDMxLCAweDcwMzMsIDB4NzAzNCwgMHg3MDM2LCAweDcwMzcsIDB4NzAzOCwgMHg3MDNBLCAweDcwM0IsCisgICAgMHg3MDNDLCAweDcwM0QsIDB4NzAzRiwgMHg3MDQwLCAweDcwNDEsIDB4NzA0MiwgMHg3MDQ1LCAweDcwNDYsIDB4NzA0NywKKyAgICAweDcwNDgsIDB4NzA0OSwgMHg3MDRBLCAweDcwNEIsIDB4NzA0RCwgMHg3MDRFLCAweDcwNTAsIDB4NzA1MiwgMHg3MDUzLAorICAgIDB4NzA1NCwgMHg3MDU2LCAweDcwNTcsIDB4NzA1OSwgMHg3MDVBLCAweDcwNUIsIDB4NzA1QywgMHg3MDVGLCAweDcwNjAsCisgICAgMHg3MDYxLCAweDcwNjIsIDB4NzA2NSwgMHg3MDY2LCAweDcwNjgsIDB4NzA2OSwgMHg3MDZBLCAweDcwNkUsIDB4NzA3MSwKKyAgICAweDcwNzIsIDB4NzA3MywgMHg3MDc0LCAweDcwNzcsIDB4NzA3OSwgMHg3MDdBLCAweDcwN0IsIDB4NzA3RCwgMHg3MDgxLAorICAgIDB4NzA4MiwgMHg3MDgzLCAweDcwODQsIDB4NzA4NiwgMHg3MDg3LCAweDcwODgsIDB4NzA4QiwgMHg3MDhDLCAweDcwOEQsCisgICAgMHg3MDhGLCAweDcwOTAsIDB4NzA5MSwgMHg3MDkzLCAweDcwOTcsIDB4NzA5OCwgMHg3MDlBLCAweDcwOUIsIDB4NzA5RSwKKyAgICAweDcwOUYsIDB4NzBBMCwgMHg3MEExLCAweDcwQTIsIDB4NzBBMywgMHg3MEE0LCAweDcwQTUsIDB4NzBBNiwgMHg3MEE3LAorICAgIDB4NzBBOCwgMHg3MEE5LCAweDcwQUEsIDB4NzBCMCwgMHg3MEIyLCAweDcwQjQsIDB4NzBCNSwgMHg3MEI2LCAweDcwQkEsCisgICAgMHg3MEJFLCAweDcwQkYsIDB4NzBDNCwgMHg3MEM1LCAweDcwQzYsIDB4NzBDNywgMHg3MEM5LCAweDcwQ0IsIDB4NzBDQywKKyAgICAweDcwQ0QsIDB4NzBDRSwgMHg3MEQwLCAweDcwRDEsIDB4NzBEMiwgMHg3MEQzLCAweDcwRDQsIDB4NzBENSwgMHg3MEQ2LAorICAgIDB4NzBENywgMHg3MERBLCAweDcwREMsIDB4NzBERCwgMHg3MERFLCAweDcwRTAsIDB4NzBFMSwgMHg3MEUyLCAweDcwRTMsCisgICAgMHg3MEU1LCAweDcwRUEsIDB4NzBFRSwgMHg3MEYwLCAweDcwRjEsIDB4NzBGMiwgMHg3MEYzLCAweDcwRjUsIDB4NzBGNiwKKyAgICAweDcwRjgsIDB4NzBGQSwgMHg3MEZCLCAweDcwRkMsIDB4NzBGRSwgMHg3MEZGLCAweDcxMDAsIDB4NzEwMSwgMHg3MTAyLAorICAgIDB4NzEwMywgMHg3MTA0LCAweDcxMDUsIDB4NzEwNiwgMHg3MTA3LCAweDcxMDgsIDB4NzEwQiwgMHg3MTBDLCAweDcxMEQsCisgICAgMHg3MTBFLCAweDcxMEYsIDB4NzExMSwgMHg3MTEyLCAweDcxMTQsIDB4NzExNywgMHg3MTFCLCAweDcxMUMsIDB4NzExRCwKKyAgICAweDcxMUUsIDB4NzExRiwgMHg3MTIwLCAweDcxMjIsIDB4NzEyMywgMHg3MTI0LCAweDcxMjUsIDB4NzEyNywgMHg3MTI4LAorICAgIDB4NzEyOSwgMHg3MTJBLCAweDcxMkIsIDB4NzEyQywgMHg3MTJELCAweDcxMkUsIDB4NzEzMiwgMHg3MTMzLCAweDcxMzQsCisgICAgMHg3MTM1LCAweDcxMzcsIDB4NzEzOCwgMHg3MTM5LCAweDcxM0EsIDB4NzEzQiwgMHg3MTNDLCAweDcxM0QsIDB4NzEzRSwKKyAgICAweDcxM0YsIDB4NzE0MCwgMHg3MTQxLCAweDcxNDIsIDB4NzE0MywgMHg3MTQ0LCAweDcxNDYsIDB4NzE0NywgMHg3MTQ4LAorICAgIDB4NzE0QiwgMHg3MTRELCAweDcxNEYsIDB4NzE1MCwgMHg3MTUxLCAweDcxNTMsIDB4NzE1NCwgMHg3MTU1LCAweDcxNTYsCisgICAgMHg3MTU3LCAweDcxNTgsIDB4NzE1OSwgMHg3MTVBLCAweDcxNUIsIDB4NzE1RCwgMHg3MTVGLCAweDcxNjAsIDB4NzE2MSwKKyAgICAweDcxNjMsIDB4NzE2NSwgMHg3MTZBLCAweDcxNkIsIDB4NzE2RCwgMHg3MTZGLCAweDcxNzAsIDB4NzE3MSwgMHg3MTc0LAorICAgIDB4NzE3NSwgMHg3MTc2LCAweDcxNzcsIDB4NzE3OSwgMHg3MTdCLCAweDcxN0MsIDB4NzE3RSwgMHg3MTdGLCAweDcxODAsCisgICAgMHg3MTgxLCAweDcxODIsIDB4NzE4MywgMHg3MTg1LCAweDcxODYsIDB4NzE4NywgMHg3MTg4LCAweDcxODksIDB4NzE4QiwKKyAgICAweDcxOEMsIDB4NzE4RCwgMHg3MThFLCAweDcxOTAsIDB4NzE5MSwgMHg3MTkzLCAweDcxOTUsIDB4NzE5NiwgMHg3MTlBLAorICAgIDB4NzE5QiwgMHg3MTlDLCAweDcxOUQsIDB4NzE5RSwgMHg3MUExLCAweDcxQTIsIDB4NzFBMywgMHg3MUE0LCAweDcxQTUsCisgICAgMHg3MUE2LCAweDcxQTcsIDB4NzFBOSwgMHg3MUFBLCAweDcxQUIsIDB4NzFBRCwgMHg3MUFFLCAweDcxQUYsIDB4NzFCMCwKKyAgICAweDcxQjIsIDB4NzFCNCwgMHg3MUI2LCAweDcxQjcsIDB4NzFCOCwgMHg3MUJBLCAweDcxQkIsIDB4NzFCQywgMHg3MUJELAorICAgIDB4NzFCRiwgMHg3MUMwLCAweDcxQzIsIDB4NzFDNCwgMHg3MUM1LCAweDcxQzYsIDB4NzFDNywgMHg3MUM5LCAweDcxQ0EsCisgICAgMHg3MUNCLCAweDcxQ0MsIDB4NzFDRCwgMHg3MUNGLCAweDcxRDAsIDB4NzFEMSwgMHg3MUQzLCAweDcxRDYsIDB4NzFENywKKyAgICAweDcxRDgsIDB4NzFEQSwgMHg3MURCLCAweDcxREQsIDB4NzFERSwgMHg3MUUxLCAweDcxRTIsIDB4NzFFMywgMHg3MUU0LAorICAgIDB4NzFFOCwgMHg3MUU5LCAweDcxRUEsIDB4NzFFQiwgMHg3MUVDLCAweDcxRUYsIDB4NzFGMCwgMHg3MUYxLCAweDcxRjIsCisgICAgMHg3MUYzLCAweDcxRjUsIDB4NzFGNiwgMHg3MUY3LCAweDcxRjgsIDB4NzFGQSwgMHg3MUZCLCAweDcxRkQsIDB4NzFGRiwKKyAgICAweDcyMDAsIDB4NzIwMSwgMHg3MjAyLCAweDcyMDMsIDB4NzIwNCwgMHg3MjA1LCAweDcyMDcsIDB4NzIwOCwgMHg3MjA5LAorICAgIDB4NzIwQSwgMHg3MjBCLCAweDcyMEMsIDB4NzIwRSwgMHg3MjBGLCAweDcyMTEsIDB4NzIxMiwgMHg3MjEzLCAweDcyMTQsCisgICAgMHg3MjE1LCAweDcyMTYsIDB4NzIxNywgMHg3MjE4LCAweDcyMTksIDB4NzIxQSwgMHg3MjFDLCAweDcyMUUsIDB4NzIxRiwKKyAgICAweDcyMjAsIDB4NzIyMSwgMHg3MjIyLCAweDcyMjMsIDB4NzIyNCwgMHg3MjI1LCAweDcyMjYsIDB4NzIyNywgMHg3MjI5LAorICAgIDB4NzIyQiwgMHg3MjJELCAweDcyMkUsIDB4NzIyRiwgMHg3MjMzLCAweDcyMzQsIDB4NzIzQywgMHg3MjQwLCAweDcyNDEsCisgICAgMHg3MjQyLCAweDcyNDMsIDB4NzI0NCwgMHg3MjQ1LCAweDcyNDYsIDB4NzI0OSwgMHg3MjRBLCAweDcyNEIsIDB4NzI0RSwKKyAgICAweDcyNEYsIDB4NzI1MCwgMHg3MjUxLCAweDcyNTMsIDB4NzI1NCwgMHg3MjU1LCAweDcyNTcsIDB4NzI1QSwgMHg3MjVDLAorICAgIDB4NzI1RSwgMHg3MjYwLCAweDcyNjMsIDB4NzI2NCwgMHg3MjY1LCAweDcyNjgsIDB4NzI2QSwgMHg3MjZCLCAweDcyNkMsCisgICAgMHg3MjZELCAweDcyNzAsIDB4NzI3MSwgMHg3MjczLCAweDcyNzQsIDB4NzI3NiwgMHg3Mjc3LCAweDcyNzgsIDB4NzI3QiwKKyAgICAweDcyN0MsIDB4NzI4MiwgMHg3MjgzLCAweDcyODUsIDB4NzI4NiwgMHg3Mjg3LCAweDcyODgsIDB4NzI4OSwgMHg3MjhDLAorICAgIDB4NzI4RSwgMHg3MjkwLCAweDcyOTEsIDB4NzI5MywgMHg3Mjk0LCAweDcyOTUsIDB4NzI5NywgMHg3Mjk4LCAweDcyOTksCisgICAgMHg3MjlBLCAweDcyOUIsIDB4NzI5QywgMHg3MjlELCAweDcyOUUsIDB4NzJBMCwgMHg3MkExLCAweDcyQTMsIDB4NzJBNCwKKyAgICAweDcyQTUsIDB4NzJBNiwgMHg3MkE4LCAweDcyQTksIDB4NzJBQSwgMHg3MkFCLCAweDcyQUUsIDB4NzJCMSwgMHg3MkIyLAorICAgIDB4NzJCMywgMHg3MkI1LCAweDcyQkEsIDB4NzJCQiwgMHg3MkJDLCAweDcyQkQsIDB4NzJCRSwgMHg3MkJGLCAweDcyQzUsCisgICAgMHg3MkM2LCAweDcyQzcsIDB4NzJDOSwgMHg3MkNBLCAweDcyQ0IsIDB4NzJDQywgMHg3MkNGLCAweDcyRDEsIDB4NzJEMywKKyAgICAweDcyRDQsIDB4NzJENSwgMHg3MkQ2LCAweDcyRDgsIDB4NzJEQSwgMHg3MkRCLCAweDcyREMsIDB4NzJERCwgMHg3MkRGLAorICAgIDB4NzJFMiwgMHg3MkUzLCAweDcyRTQsIDB4NzJFNSwgMHg3MkU2LCAweDcyRTcsIDB4NzJFQSwgMHg3MkVCLCAweDcyRjUsCisgICAgMHg3MkY2LCAweDcyRkUsIDB4NzJGRiwgMHg3MzAwLCAweDczMDIsIDB4NzMwNCwgMHg3MzA1LCAweDczMDYsIDB4NzMwNywKKyAgICAweDczMDgsIDB4NzMwOSwgMHg3MzBCLCAweDczMEMsIDB4NzMwRCwgMHg3MzBGLCAweDczMTAsIDB4NzMxMSwgMHg3MzEyLAorICAgIDB4NzMxNCwgMHg3MzE4LCAweDczMTksIDB4NzMxQSwgMHg3MzFGLCAweDczMjAsIDB4NzMyMywgMHg3MzI0LCAweDczMjYsCisgICAgMHg3MzI3LCAweDczMjgsIDB4NzMyRCwgMHg3MzJGLCAweDczMzAsIDB4NzMzMiwgMHg3MzMzLCAweDczMzUsIDB4NzMzQSwKKyAgICAweDczM0MsIDB4NzMzRCwgMHg3MzQwLCAweDczNDIsIDB4NzM0MywgMHg3MzQ2LCAweDczNDcsIDB4NzM0OCwgMHg3MzQ5LAorICAgIDB4NzM0QSwgMHg3MzRCLCAweDczNEMsIDB4NzM0RSwgMHg3MzRGLCAweDczNTEsIDB4NzM1MywgMHg3MzU0LCAweDczNTUsCisgICAgMHg3MzU2LCAweDczNTgsIDB4NzM1OSwgMHg3MzVBLCAweDczNUIsIDB4NzM1QywgMHg3MzVELCAweDczNUUsIDB4NzM1RiwKKyAgICAweDczNjEsIDB4NzM2MiwgMHg3MzYzLCAweDczNjQsIDB4NzM2NSwgMHg3MzY2LCAweDczNjcsIDB4NzM2OSwgMHg3MzZFLAorICAgIDB4NzM3MSwgMHg3MzczLCAweDczNzQsIDB4NzM3NiwgMHg3Mzc5LCAweDczN0QsIDB4NzM3RiwgMHg3MzgxLCAweDczODIsCisgICAgMHg3MzgzLCAweDczODUsIDB4NzM4NiwgMHg3Mzg4LCAweDczOEEsIDB4NzM4QywgMHg3MzhELCAweDczOEYsIDB4NzM5MCwKKyAgICAweDczOTIsIDB4NzM5MywgMHg3Mzk0LCAweDczOTUsIDB4NzM5NywgMHg3Mzk4LCAweDczOTksIDB4NzM5QSwgMHg3MzlDLAorICAgIDB4NzM5RCwgMHg3MzlFLCAweDczQTAsIDB4NzNBMSwgMHg3M0EzLCAweDczQTQsIDB4NzNBNSwgMHg3M0E2LCAweDczQTcsCisgICAgMHg3M0E4LCAweDczQUEsIDB4NzNBQywgMHg3M0FELCAweDczQjEsIDB4NzNCNCwgMHg3M0I1LCAweDczQjYsIDB4NzNCOCwKKyAgICAweDczQjksIDB4NzNCQywgMHg3M0JELCAweDczQkUsIDB4NzNCRiwgMHg3M0MxLCAweDczQzMsIDB4NzNDNCwgMHg3M0M1LAorICAgIDB4NzNDNiwgMHg3M0M3LCAweDczQ0IsIDB4NzNDQywgMHg3M0NFLCAweDczRDIsIDB4NzNEMywgMHg3M0Q0LCAweDczRDUsCisgICAgMHg3M0Q2LCAweDczRDcsIDB4NzNEOCwgMHg3M0RBLCAweDczREIsIDB4NzNEQywgMHg3M0RELCAweDczREYsIDB4NzNFMSwKKyAgICAweDczRTIsIDB4NzNFMywgMHg3M0U0LCAweDczRTYsIDB4NzNFOCwgMHg3M0VBLCAweDczRUIsIDB4NzNFQywgMHg3M0VFLAorICAgIDB4NzNFRiwgMHg3M0YwLCAweDczRjEsIDB4NzNGMywgMHg3M0Y0LCAweDczRjUsIDB4NzNGNiwgMHg3M0Y3LCAweDczRjgsCisgICAgMHg3M0Y5LCAweDczRkEsIDB4NzNGQiwgMHg3M0ZDLCAweDczRkQsIDB4NzNGRiwgMHg3NDAwLCAweDc0MDEsIDB4NzQwMiwKKyAgICAweDc0MDQsIDB4NzQwNywgMHg3NDA4LCAweDc0MEIsIDB4NzQwQywgMHg3NDBELCAweDc0MEUsIDB4NzQxMSwgMHg3NDEyLAorICAgIDB4NzQxMywgMHg3NDE0LCAweDc0MTUsIDB4NzQxNiwgMHg3NDE3LCAweDc0MTgsIDB4NzQxOSwgMHg3NDFDLCAweDc0MUQsCisgICAgMHg3NDFFLCAweDc0MUYsIDB4NzQyMCwgMHg3NDIxLCAweDc0MjMsIDB4NzQyNCwgMHg3NDI3LCAweDc0MjksIDB4NzQyQiwKKyAgICAweDc0MkQsIDB4NzQyRiwgMHg3NDMxLCAweDc0MzIsIDB4NzQzNywgMHg3NDM4LCAweDc0MzksIDB4NzQzQSwgMHg3NDNCLAorICAgIDB4NzQzRCwgMHg3NDNFLCAweDc0NDAsIDB4NzQ0MiwgMHg3NDQzLCAweDc0NDQsIDB4NzQ0NSwgMHg3NDQ2LCAweDc0NDcsCisgICAgMHg3NDQ4LCAweDc0NDksIDB4NzQ0QSwgMHg3NDRDLCAweDc0NEQsIDB4NzQ0RSwgMHg3NDRGLCAweDc0NTAsIDB4NzQ1MSwKKyAgICAweDc0NTIsIDB4NzQ1MywgMHg3NDU0LCAweDc0NTYsIDB4NzQ1OCwgMHg3NDVELCAweDc0NjAsIDB4NzQ2MSwgMHg3NDYyLAorICAgIDB4NzQ2NCwgMHg3NDY1LCAweDc0NjYsIDB4NzQ2NywgMHg3NDY4LCAweDc0NkIsIDB4NzQ2QywgMHg3NDZFLCAweDc0NkYsCisgICAgMHg3NDcxLCAweDc0NzIsIDB4NzQ3MywgMHg3NDc0LCAweDc0NzUsIDB4NzQ3OCwgMHg3NDc5LCAweDc0N0EsIDB4NzQ3QiwKKyAgICAweDc0N0MsIDB4NzQ3RCwgMHg3NDdGLCAweDc0ODIsIDB4NzQ4NCwgMHg3NDg1LCAweDc0ODYsIDB4NzQ4OCwgMHg3NDhBLAorICAgIDB4NzQ4QywgMHg3NDhELCAweDc0OEYsIDB4NzQ5MSwgMHg3NDkyLCAweDc0OTMsIDB4NzQ5NCwgMHg3NDk1LCAweDc0OTYsCisgICAgMHg3NDk3LCAweDc0OTgsIDB4NzQ5OSwgMHg3NDlBLCAweDc0OUIsIDB4NzQ5RCwgMHg3NDlGLCAweDc0QTAsIDB4NzRBMSwKKyAgICAweDc0QTIsIDB4NzRBNCwgMHg3NEE1LCAweDc0QUEsIDB4NzRBQiwgMHg3NEFDLCAweDc0QUQsIDB4NzRBRSwgMHg3NEFGLAorICAgIDB4NzRCMSwgMHg3NEIyLCAweDc0QjMsIDB4NzRCNCwgMHg3NEI1LCAweDc0QjYsIDB4NzRCNywgMHg3NEI4LCAweDc0QjksCisgICAgMHg3NEJCLCAweDc0QkMsIDB4NzRCRSwgMHg3NEJGLCAweDc0QzAsIDB4NzRDMSwgMHg3NEMyLCAweDc0QzMsIDB4NzRDNCwKKyAgICAweDc0QzUsIDB4NzRDNiwgMHg3NEM3LCAweDc0QzgsIDB4NzRDOSwgMHg3NENCLCAweDc0Q0MsIDB4NzRDRCwgMHg3NENFLAorICAgIDB4NzREMCwgMHg3NEQxLCAweDc0RDMsIDB4NzRENSwgMHg3NEQ2LCAweDc0RDcsIDB4NzREOCwgMHg3NEQ5LCAweDc0REIsCisgICAgMHg3NERELCAweDc0REYsIDB4NzRFMSwgMHg3NEU1LCAweDc0RTcsIDB4NzRFOCwgMHg3NEU5LCAweDc0RUEsIDB4NzRFQiwKKyAgICAweDc0RUMsIDB4NzRFRCwgMHg3NEYwLCAweDc0RjEsIDB4NzRGMiwgMHg3NEYzLCAweDc0RjUsIDB4NzRGOCwgMHg3NEY5LAorICAgIDB4NzRGQSwgMHg3NEZCLCAweDc0RkMsIDB4NzRGRCwgMHg3NEZFLCAweDc1MDAsIDB4NzUwMSwgMHg3NTAyLCAweDc1MDMsCisgICAgMHg3NTA1LCAweDc1MDYsIDB4NzUwNywgMHg3NTA4LCAweDc1MDksIDB4NzUwQSwgMHg3NTBCLCAweDc1MEUsIDB4NzUxMCwKKyAgICAweDc1MTIsIDB4NzUxNCwgMHg3NTE1LCAweDc1MTYsIDB4NzUxNywgMHg3NTFCLCAweDc1MUQsIDB4NzUxRSwgMHg3NTIwLAorICAgIDB4NzUyMSwgMHg3NTIyLCAweDc1MjQsIDB4NzUyNiwgMHg3NTI3LCAweDc1MkEsIDB4NzUyRSwgMHg3NTM0LCAweDc1MzYsCisgICAgMHg3NTM5LCAweDc1M0MsIDB4NzUzRCwgMHg3NTNGLCAweDc1NDEsIDB4NzU0MiwgMHg3NTQzLCAweDc1NDQsIDB4NzU0NiwKKyAgICAweDc1NDcsIDB4NzU0OSwgMHg3NTRBLCAweDc1NEQsIDB4NzU1MCwgMHg3NTUxLCAweDc1NTIsIDB4NzU1MywgMHg3NTU1LAorICAgIDB4NzU1NiwgMHg3NTU3LCAweDc1NTgsIDB4NzU1RSwgMHg3NTVGLCAweDc1NjAsIDB4NzU2MSwgMHg3NTYzLCAweDc1NjQsCisgICAgMHg3NTY3LCAweDc1NjgsIDB4NzU2OSwgMHg3NTZDLCAweDc1NkQsIDB4NzU2RSwgMHg3NTZGLCAweDc1NzAsIDB4NzU3MSwKKyAgICAweDc1NzMsIDB4NzU3NSwgMHg3NTc3LCAweDc1N0EsIDB4NzU3QiwgMHg3NTdDLCAweDc1N0QsIDB4NzU3RSwgMHg3NTgwLAorICAgIDB4NzU4MSwgMHg3NTgyLCAweDc1ODQsIDB4NzU4NSwgMHg3NTg4LCAweDc1ODksIDB4NzU4QSwgMHg3NThDLCAweDc1OEQsCisgICAgMHg3NThFLCAweDc1OTAsIDB4NzU5MywgMHg3NTk1LCAweDc1OTgsIDB4NzU5QiwgMHg3NTlDLCAweDc1OUUsIDB4NzVBMiwKKyAgICAweDc1QTYsIDB4NzVBNywgMHg3NUE4LCAweDc1QTksIDB4NzVBQSwgMHg3NUFELCAweDc1QjYsIDB4NzVCNywgMHg3NUJBLAorICAgIDB4NzVCQiwgMHg3NUJGLCAweDc1QzAsIDB4NzVDMSwgMHg3NUM2LCAweDc1Q0IsIDB4NzVDQywgMHg3NUNFLCAweDc1Q0YsCisgICAgMHg3NUQwLCAweDc1RDEsIDB4NzVEMywgMHg3NUQ3LCAweDc1REEsIDB4NzVEQywgMHg3NURELCAweDc1REYsIDB4NzVFMCwKKyAgICAweDc1RTEsIDB4NzVFNSwgMHg3NUU5LCAweDc1RUMsIDB4NzVFRCwgMHg3NUVFLCAweDc1RUYsIDB4NzVGMiwgMHg3NUYzLAorICAgIDB4NzVGNSwgMHg3NUY2LCAweDc1RjcsIDB4NzVGOCwgMHg3NUZBLCAweDc1RkIsIDB4NzVGRCwgMHg3NUZFLCAweDc2MDQsCisgICAgMHg3NjA2LCAweDc2MDcsIDB4NzYwOCwgMHg3NjA5LCAweDc2MEUsIDB4NzYwRiwgMHg3NjExLCAweDc2MTIsIDB4NzYxMywKKyAgICAweDc2MTQsIDB4NzYxNiwgMHg3NjFBLCAweDc2MUMsIDB4NzYxRCwgMHg3NjIzLCAweDc2MjgsIDB4NzYyQywgMHg3NjJFLAorICAgIDB4NzYyRiwgMHg3NjMxLCAweDc2MzIsIDB4NzYzNiwgMHg3NjM3LCAweDc2MzksIDB4NzYzQSwgMHg3NjNELCAweDc2NDEsCisgICAgMHg3NjQ0LCAweDc2NDUsIDB4NzY0OCwgMHg3NjRBLCAweDc2NEIsIDB4NzY0RSwgMHg3NjRGLCAweDc2NTAsIDB4NzY1MSwKKyAgICAweDc2NTIsIDB4NzY1MywgMHg3NjU1LCAweDc2NTcsIDB4NzY1OSwgMHg3NjVBLCAweDc2NUIsIDB4NzY1RCwgMHg3NjYwLAorICAgIDB4NzY2MSwgMHg3NjY2LCAweDc2NjgsIDB4NzY2QSwgMHg3NjczLCAweDc2NzQsIDB4NzY3NSwgMHg3Njc2LCAweDc2NzcsCisgICAgMHg3Njc5LCAweDc2N0EsIDB4NzY3RiwgMHg3NjgwLCAweDc2ODEsIDB4NzY4MywgMHg3Njg1LCAweDc2ODksIDB4NzY4QSwKKyAgICAweDc2OEMsIDB4NzY4RCwgMHg3NjhGLCAweDc2OTAsIDB4NzY5MiwgMHg3Njk0LCAweDc2OTUsIDB4NzY5NywgMHg3Njk4LAorICAgIDB4NzY5QiwgMHg3NjlDLCAweDc2OUQsIDB4NzY5RSwgMHg3NjlGLCAweDc2QTAsIDB4NzZBMSwgMHg3NkEyLCAweDc2QTMsCisgICAgMHg3NkE1LCAweDc2QTYsIDB4NzZBNywgMHg3NkE4LCAweDc2QTksIDB4NzZBQSwgMHg3NkFCLCAweDc2QUMsIDB4NzZBRCwKKyAgICAweDc2QUYsIDB4NzZCMCwgMHg3NkIzLCAweDc2QjUsIDB4NzZCNiwgMHg3NkI3LCAweDc2QjksIDB4NzZCQiwgMHg3NkJDLAorICAgIDB4NzZCRCwgMHg3NkJFLCAweDc2QzAsIDB4NzZDMSwgMHg3NkMzLCAweDc2QzQsIDB4NzZDNywgMHg3NkM5LCAweDc2Q0IsCisgICAgMHg3NkNDLCAweDc2RDMsIDB4NzZENSwgMHg3NkQ5LCAweDc2REEsIDB4NzZEQywgMHg3NkRELCAweDc2RTAsIDB4NzZFMiwKKyAgICAweDc2RTYsIDB4NzZFOCwgMHg3NkU5LCAweDc2RUEsIDB4NzZFQiwgMHg3NkVDLCAweDc2RUQsIDB4NzZGMCwgMHg3NkYzLAorICAgIDB4NzZGNSwgMHg3NkY2LCAweDc2RjcsIDB4NzZGQSwgMHg3NkZCLCAweDc2RkQsIDB4NzZGRiwgMHg3NzAwLCAweDc3MDIsCisgICAgMHg3NzAzLCAweDc3MDUsIDB4NzcwNiwgMHg3NzBBLCAweDc3MEMsIDB4NzcwRSwgMHg3NzBGLCAweDc3MTAsIDB4NzcxMSwKKyAgICAweDc3MTIsIDB4NzcxMywgMHg3NzE0LCAweDc3MTUsIDB4NzcxNiwgMHg3NzE3LCAweDc3MTgsIDB4NzcxQiwgMHg3NzFDLAorICAgIDB4NzcxRCwgMHg3NzFFLCAweDc3MjEsIDB4NzcyMywgMHg3NzI0LCAweDc3MjUsIDB4NzcyNywgMHg3NzJBLCAweDc3MkIsCisgICAgMHg3NzJDLCAweDc3MkUsIDB4NzczMCwgMHg3NzMxLCAweDc3MzIsIDB4NzczMywgMHg3NzM0LCAweDc3MzksIDB4NzczQiwKKyAgICAweDc3M0QsIDB4NzczRSwgMHg3NzNGLCAweDc3NDIsIDB4Nzc0NCwgMHg3NzQ1LCAweDc3NDYsIDB4Nzc0OCwgMHg3NzQ5LAorICAgIDB4Nzc0QSwgMHg3NzRCLCAweDc3NEMsIDB4Nzc0RCwgMHg3NzRFLCAweDc3NTIsIDB4Nzc1MywgMHg3NzU0LCAweDc3NTUsCisgICAgMHg3NzU2LCAweDc3NTcsIDB4Nzc1OCwgMHg3NzU5LCAweDc3NUMsIDB4Nzc1RCwgMHg3NzVGLCAweDc3NjAsIDB4Nzc2NCwKKyAgICAweDc3NjcsIDB4Nzc2OSwgMHg3NzZBLCAweDc3NkQsIDB4Nzc2RSwgMHg3NzZGLCAweDc3NzAsIDB4Nzc3MSwgMHg3NzcyLAorICAgIDB4Nzc3MywgMHg3Nzc0LCAweDc3NzUsIDB4Nzc3NiwgMHg3Nzc3LCAweDc3NzgsIDB4Nzc3QSwgMHg3NzdCLCAweDc3N0MsCisgICAgMHg3NzgxLCAweDc3ODIsIDB4Nzc4MywgMHg3Nzg2LCAweDc3ODcsIDB4Nzc4OCwgMHg3Nzg5LCAweDc3OEEsIDB4Nzc4QiwKKyAgICAweDc3OEYsIDB4Nzc5MCwgMHg3NzkzLCAweDc3OTQsIDB4Nzc5NSwgMHg3Nzk2LCAweDc3OTcsIDB4Nzc5OSwgMHg3NzlBLAorICAgIDB4Nzc5QiwgMHg3NzlDLCAweDc3OUQsIDB4NzdBMSwgMHg3N0EzLCAweDc3QTQsIDB4NzdBNiwgMHg3N0E4LCAweDc3QUIsCisgICAgMHg3N0FFLCAweDc3QUYsIDB4NzdCMSwgMHg3N0IyLCAweDc3QjQsIDB4NzdCNiwgMHg3N0I3LCAweDc3QjgsIDB4NzdCOSwKKyAgICAweDc3QkEsIDB4NzdCRSwgMHg3N0MwLCAweDc3QzEsIDB4NzdDMiwgMHg3N0MzLCAweDc3QzQsIDB4NzdDNSwgMHg3N0M2LAorICAgIDB4NzdDOCwgMHg3N0M5LCAweDc3Q0EsIDB4NzdDQiwgMHg3N0NDLCAweDc3Q0UsIDB4NzdDRiwgMHg3N0QwLCAweDc3RDEsCisgICAgMHg3N0QyLCAweDc3RDMsIDB4NzdENCwgMHg3N0Q1LCAweDc3RDYsIDB4NzdEOCwgMHg3N0Q5LCAweDc3REQsIDB4NzdERSwKKyAgICAweDc3REYsIDB4NzdFMCwgMHg3N0UxLCAweDc3RTQsIDB4NzdFNiwgMHg3N0U4LCAweDc3RUEsIDB4NzdGMCwgMHg3N0YxLAorICAgIDB4NzdGMiwgMHg3N0Y0LCAweDc3RjUsIDB4NzdGNywgMHg3N0Y5LCAweDc3RkEsIDB4NzdGQiwgMHg3N0ZDLCAweDc4MDMsCisgICAgMHg3ODA0LCAweDc4MDUsIDB4NzgwNiwgMHg3ODA3LCAweDc4MDgsIDB4NzgwQSwgMHg3ODBCLCAweDc4MEUsIDB4NzgwRiwKKyAgICAweDc4MTAsIDB4NzgxMywgMHg3ODE1LCAweDc4MTksIDB4NzgxQiwgMHg3ODFFLCAweDc4MjAsIDB4NzgyMSwgMHg3ODIyLAorICAgIDB4NzgyNCwgMHg3ODI4LCAweDc4MkEsIDB4NzgyQiwgMHg3ODJFLCAweDc4MkYsIDB4NzgzMSwgMHg3ODMyLCAweDc4MzMsCisgICAgMHg3ODM1LCAweDc4MzYsIDB4NzgzRCwgMHg3ODNGLCAweDc4NDEsIDB4Nzg0MiwgMHg3ODQ0LCAweDc4NDYsIDB4Nzg0OCwKKyAgICAweDc4NDksIDB4Nzg0QSwgMHg3ODRCLCAweDc4NEQsIDB4Nzg0RiwgMHg3ODUxLCAweDc4NTMsIDB4Nzg1NCwgMHg3ODU4LAorICAgIDB4Nzg1OSwgMHg3ODVBLCAweDc4NUIsIDB4Nzg1QywgMHg3ODVFLCAweDc4NUYsIDB4Nzg2MCwgMHg3ODYxLCAweDc4NjIsCisgICAgMHg3ODYzLCAweDc4NjUsIDB4Nzg2NiwgMHg3ODY3LCAweDc4NjksIDB4Nzg3MCwgMHg3ODcxLCAweDc4NzIsIDB4Nzg3MywKKyAgICAweDc4NzQsIDB4Nzg3NSwgMHg3ODc2LCAweDc4NzgsIDB4Nzg3OSwgMHg3ODdBLCAweDc4N0IsIDB4Nzg3RCwgMHg3ODdFLAorICAgIDB4Nzg3RiwgMHg3ODgwLCAweDc4ODEsIDB4Nzg4MiwgMHg3ODgzLCAweDc4ODQsIDB4Nzg4NSwgMHg3ODg2LCAweDc4ODgsCisgICAgMHg3ODhBLCAweDc4OEIsIDB4Nzg4RiwgMHg3ODkwLCAweDc4OTIsIDB4Nzg5NCwgMHg3ODk1LCAweDc4OTYsIDB4Nzg5OSwKKyAgICAweDc4OUQsIDB4Nzg5RSwgMHg3OEEwLCAweDc4QTIsIDB4NzhBNCwgMHg3OEE2LCAweDc4QTgsIDB4NzhBQSwgMHg3OEFCLAorICAgIDB4NzhBQywgMHg3OEFFLCAweDc4QUYsIDB4NzhCNSwgMHg3OEI2LCAweDc4QjcsIDB4NzhCQiwgMHg3OEJELCAweDc4QkYsCisgICAgMHg3OEMwLCAweDc4QzIsIDB4NzhDMywgMHg3OEM0LCAweDc4QzYsIDB4NzhDNywgMHg3OEM4LCAweDc4Q0MsIDB4NzhDRCwKKyAgICAweDc4Q0UsIDB4NzhDRiwgMHg3OEQxLCAweDc4RDIsIDB4NzhEMywgMHg3OEQ2LCAweDc4RDcsIDB4NzhEOCwgMHg3OERCLAorICAgIDB4NzhEQywgMHg3OERELCAweDc4REUsIDB4NzhERiwgMHg3OEUwLCAweDc4RTEsIDB4NzhFMiwgMHg3OEU0LCAweDc4RTUsCisgICAgMHg3OEU2LCAweDc4RTksIDB4NzhFQSwgMHg3OEVCLCAweDc4RUQsIDB4NzhFRSwgMHg3OEYwLCAweDc4RjEsIDB4NzhGMywKKyAgICAweDc4RjUsIDB4NzhGNiwgMHg3OEY4LCAweDc4RjksIDB4NzhGQiwgMHg3OEZDLCAweDc4RkUsIDB4NzhGRiwgMHg3OTAwLAorICAgIDB4NzkwMiwgMHg3OTAzLCAweDc5MDQsIDB4NzkwNiwgMHg3OTA3LCAweDc5MDgsIDB4NzkwOSwgMHg3OTBBLCAweDc5MEIsCisgICAgMHg3OTBDLCAweDc5MEQsIDB4NzkwRiwgMHg3OTEwLCAweDc5MTEsIDB4NzkxMiwgMHg3OTE0LCAweDc5MTUsIDB4NzkxNiwKKyAgICAweDc5MTcsIDB4NzkxOCwgMHg3OTFBLCAweDc5MUIsIDB4NzkxQywgMHg3OTFELCAweDc5MUYsIDB4NzkyMCwgMHg3OTIxLAorICAgIDB4NzkyMiwgMHg3OTIzLCAweDc5MjUsIDB4NzkyNywgMHg3OTI4LCAweDc5MjksIDB4NzkyRCwgMHg3OTJFLCAweDc5MkYsCisgICAgMHg3OTMwLCAweDc5MzIsIDB4NzkzMywgMHg3OTM1LCAweDc5MzYsIDB4NzkzNywgMHg3OTM4LCAweDc5MzksIDB4NzkzRCwKKyAgICAweDc5M0YsIDB4Nzk0MiwgMHg3OTQzLCAweDc5NDQsIDB4Nzk0NSwgMHg3OTQ3LCAweDc5NEEsIDB4Nzk0QiwgMHg3OTRDLAorICAgIDB4Nzk0RCwgMHg3OTRFLCAweDc5NEYsIDB4Nzk1MCwgMHg3OTUxLCAweDc5NTIsIDB4Nzk1NCwgMHg3OTU1LCAweDc5NTgsCisgICAgMHg3OTU5LCAweDc5NjEsIDB4Nzk2MywgMHg3OTY0LCAweDc5NjYsIDB4Nzk2OSwgMHg3OTZBLCAweDc5NkIsIDB4Nzk2QywKKyAgICAweDc5NkUsIDB4Nzk3MCwgMHg3OTcxLCAweDc5NzIsIDB4Nzk3MywgMHg3OTc0LCAweDc5NzUsIDB4Nzk3NiwgMHg3OTc5LAorICAgIDB4Nzk3QiwgMHg3OTdDLCAweDc5N0QsIDB4Nzk3RSwgMHg3OTdGLCAweDc5ODIsIDB4Nzk4MywgMHg3OTg2LCAweDc5ODcsCisgICAgMHg3OTg4LCAweDc5ODksIDB4Nzk4QiwgMHg3OThDLCAweDc5OTAsIDB4Nzk5MSwgMHg3OTkyLCAweDc5OTMsIDB4Nzk5NCwKKyAgICAweDc5OTUsIDB4Nzk5NiwgMHg3OTk3LCAweDc5OTgsIDB4Nzk5OSwgMHg3OTlCLCAweDc5OUMsIDB4Nzk5RCwgMHg3OTlFLAorICAgIDB4Nzk5RiwgMHg3OUEwLCAweDc5QTEsIDB4NzlBMiwgMHg3OUEzLCAweDc5QTQsIDB4NzlBNSwgMHg3OUE4LCAweDc5QTksCisgICAgMHg3OUFCLCAweDc5QUMsIDB4NzlBRCwgMHg3OUFGLCAweDc5QjIsIDB4NzlCNCwgMHg3OUI1LCAweDc5QjYsIDB4NzlCNywKKyAgICAweDc5QjgsIDB4NzlCQywgMHg3OUJGLCAweDc5QzIsIDB4NzlDNCwgMHg3OUM1LCAweDc5QzcsIDB4NzlDOCwgMHg3OUNBLAorICAgIDB4NzlDQywgMHg3OUNFLCAweDc5Q0YsIDB4NzlEMCwgMHg3OUQzLCAweDc5RDQsIDB4NzlENiwgMHg3OUQ3LCAweDc5RDksCisgICAgMHg3OURBLCAweDc5REIsIDB4NzlEQywgMHg3OURELCAweDc5REUsIDB4NzlFMCwgMHg3OUUxLCAweDc5RTIsIDB4NzlFNSwKKyAgICAweDc5RTgsIDB4NzlFQSwgMHg3OUVDLCAweDc5RUUsIDB4NzlGMSwgMHg3OUYyLCAweDc5RjMsIDB4NzlGNCwgMHg3OUY1LAorICAgIDB4NzlGNiwgMHg3OUY3LCAweDc5RjksIDB4NzlGQSwgMHg3OUZDLCAweDc5RkUsIDB4NzlGRiwgMHg3QTAxLCAweDdBMDQsCisgICAgMHg3QTA1LCAweDdBMDcsIDB4N0EwOCwgMHg3QTA5LCAweDdBMEEsIDB4N0EwQywgMHg3QTBGLCAweDdBMTAsIDB4N0ExMSwKKyAgICAweDdBMTIsIDB4N0ExMywgMHg3QTE1LCAweDdBMTYsIDB4N0ExOCwgMHg3QTE5LCAweDdBMUIsIDB4N0ExQywgMHg3QTFELAorICAgIDB4N0ExRiwgMHg3QTIxLCAweDdBMjIsIDB4N0EyNCwgMHg3QTI1LCAweDdBMjYsIDB4N0EyNywgMHg3QTI4LCAweDdBMjksCisgICAgMHg3QTJBLCAweDdBMkIsIDB4N0EyQywgMHg3QTJELCAweDdBMkYsIDB4N0EzMCwgMHg3QTMyLCAweDdBMzQsIDB4N0EzNSwKKyAgICAweDdBMzYsIDB4N0EzOCwgMHg3QTNBLCAweDdBM0UsIDB4N0E0MSwgMHg3QTQyLCAweDdBNDMsIDB4N0E0NCwgMHg3QTQ1LAorICAgIDB4N0E0NywgMHg3QTQ4LCAweDdBNDksIDB4N0E0QSwgMHg3QTRCLCAweDdBNEYsIDB4N0E1MCwgMHg3QTUyLCAweDdBNTMsCisgICAgMHg3QTU0LCAweDdBNTUsIDB4N0E1NiwgMHg3QTU4LCAweDdBNTksIDB4N0E1QSwgMHg3QTVCLCAweDdBNUMsIDB4N0E1RCwKKyAgICAweDdBNUUsIDB4N0E1RiwgMHg3QTYwLCAweDdBNjMsIDB4N0E2NCwgMHg3QTY1LCAweDdBNjYsIDB4N0E2NywgMHg3QTY4LAorICAgIDB4N0E2QSwgMHg3QTZDLCAweDdBNkQsIDB4N0E2RSwgMHg3QTZGLCAweDdBNzEsIDB4N0E3MiwgMHg3QTczLCAweDdBNzUsCisgICAgMHg3QTdCLCAweDdBN0MsIDB4N0E3RCwgMHg3QTdFLCAweDdBODIsIDB4N0E4NSwgMHg3QTg3LCAweDdBODksIDB4N0E4QSwKKyAgICAweDdBOEIsIDB4N0E4QywgMHg3QThFLCAweDdBOEYsIDB4N0E5MCwgMHg3QTkzLCAweDdBOTQsIDB4N0E5OSwgMHg3QTlBLAorICAgIDB4N0E5QiwgMHg3QTlFLCAweDdBQTEsIDB4N0FBMiwgMHg3QUEzLCAweDdBQTQsIDB4N0FBNywgMHg3QUFCLCAweDdBQUYsCisgICAgMHg3QUIwLCAweDdBQjEsIDB4N0FCMiwgMHg3QUI0LCAweDdBQjUsIDB4N0FCNywgMHg3QUI4LCAweDdBQjksIDB4N0FCQiwKKyAgICAweDdBQkMsIDB4N0FCRCwgMHg3QUJFLCAweDdBQzAsIDB4N0FDMSwgMHg3QUMyLCAweDdBQzMsIDB4N0FDNiwgMHg3QUM5LAorICAgIDB4N0FDQywgMHg3QUNELCAweDdBQ0UsIDB4N0FDRiwgMHg3QUQwLCAweDdBRDEsIDB4N0FEMiwgMHg3QUQzLCAweDdBRDQsCisgICAgMHg3QUQ1LCAweDdBRDcsIDB4N0FEOCwgMHg3QURBLCAweDdBREIsIDB4N0FEQywgMHg3QURELCAweDdBRTEsIDB4N0FFMiwKKyAgICAweDdBRTQsIDB4N0FFNywgMHg3QUU4LCAweDdBRTksIDB4N0FFQiwgMHg3QUVDLCAweDdBRUUsIDB4N0FGMCwgMHg3QUYxLAorICAgIDB4N0FGMiwgMHg3QUYzLCAweDdBRjQsIDB4N0FGNSwgMHg3QUY3LCAweDdBRjgsIDB4N0FGQiwgMHg3QUZDLCAweDdBRkUsCisgICAgMHg3QjAwLCAweDdCMDEsIDB4N0IwMiwgMHg3QjA1LCAweDdCMDcsIDB4N0IwOSwgMHg3QjBDLCAweDdCMEQsIDB4N0IwRSwKKyAgICAweDdCMTAsIDB4N0IxMiwgMHg3QjEzLCAweDdCMTYsIDB4N0IxNywgMHg3QjE4LCAweDdCMUEsIDB4N0IxQywgMHg3QjFELAorICAgIDB4N0IxRiwgMHg3QjIxLCAweDdCMjIsIDB4N0IyMywgMHg3QjI3LCAweDdCMjksIDB4N0IyRCwgMHg3QjJGLCAweDdCMzAsCisgICAgMHg3QjMyLCAweDdCMzQsIDB4N0IzNSwgMHg3QjM2LCAweDdCMzcsIDB4N0IzOSwgMHg3QjNCLCAweDdCM0QsIDB4N0IzRiwKKyAgICAweDdCNDAsIDB4N0I0MSwgMHg3QjQyLCAweDdCNDMsIDB4N0I0NCwgMHg3QjQ4LCAweDdCNEEsIDB4N0I0RCwgMHg3QjRFLAorICAgIDB4N0I1MywgMHg3QjU1LCAweDdCNTcsIDB4N0I1OSwgMHg3QjVDLCAweDdCNUUsIDB4N0I1RiwgMHg3QjYxLCAweDdCNjMsCisgICAgMHg3QjY0LCAweDdCNjUsIDB4N0I2NiwgMHg3QjY4LCAweDdCNjksIDB4N0I2QSwgMHg3QjZCLCAweDdCNkMsIDB4N0I2RCwKKyAgICAweDdCNkYsIDB4N0I3MCwgMHg3QjczLCAweDdCNzQsIDB4N0I3NiwgMHg3Qjc4LCAweDdCN0EsIDB4N0I3QywgMHg3QjdELAorICAgIDB4N0I3RiwgMHg3QjgxLCAweDdCODIsIDB4N0I4MywgMHg3Qjg0LCAweDdCODYsIDB4N0I4NywgMHg3Qjg4LCAweDdCODksCisgICAgMHg3QjhBLCAweDdCOEMsIDB4N0I4RSwgMHg3QjhGLCAweDdCOTEsIDB4N0I5MiwgMHg3QjkzLCAweDdCOTYsIDB4N0I5OCwKKyAgICAweDdCOTksIDB4N0I5QSwgMHg3QjlCLCAweDdCOUUsIDB4N0I5RiwgMHg3QkEwLCAweDdCQTMsIDB4N0JBNCwgMHg3QkE1LAorICAgIDB4N0JBRSwgMHg3QkFGLCAweDdCQjAsIDB4N0JCMiwgMHg3QkIzLCAweDdCQjUsIDB4N0JCNiwgMHg3QkI3LCAweDdCQjksCisgICAgMHg3QkJBLCAweDdCQkIsIDB4N0JCQywgMHg3QkJELCAweDdCQkUsIDB4N0JCRiwgMHg3QkMyLCAweDdCQzMsIDB4N0JDNSwKKyAgICAweDdCQzgsIDB4N0JDQSwgMHg3QkNELCAweDdCQ0UsIDB4N0JDRiwgMHg3QkQwLCAweDdCRDIsIDB4N0JENCwgMHg3QkQ1LAorICAgIDB4N0JENiwgMHg3QkQ3LCAweDdCRDgsIDB4N0JEQiwgMHg3QkRDLCAweDdCREUsIDB4N0JERiwgMHg3QkUwLCAweDdCRTIsCisgICAgMHg3QkUzLCAweDdCRTcsIDB4N0JFOCwgMHg3QkVCLCAweDdCRUMsIDB4N0JFRCwgMHg3QkVGLCAweDdCRjAsIDB4N0JGMiwKKyAgICAweDdCRjQsIDB4N0JGNSwgMHg3QkY2LCAweDdCRjgsIDB4N0JGOSwgMHg3QkZBLCAweDdCRkIsIDB4N0JGRCwgMHg3QkZGLAorICAgIDB4N0MwMSwgMHg3QzAyLCAweDdDMDMsIDB4N0MwNCwgMHg3QzA1LCAweDdDMDYsIDB4N0MwOCwgMHg3QzA5LCAweDdDMEEsCisgICAgMHg3QzBFLCAweDdDMTAsIDB4N0MxMSwgMHg3QzEyLCAweDdDMTMsIDB4N0MxNCwgMHg3QzE1LCAweDdDMTcsIDB4N0MxOCwKKyAgICAweDdDMTksIDB4N0MxQSwgMHg3QzFCLCAweDdDMUMsIDB4N0MxRCwgMHg3QzIwLCAweDdDMjIsIDB4N0MyNCwgMHg3QzI1LAorICAgIDB4N0MyOCwgMHg3QzI5LCAweDdDMkMsIDB4N0MyRCwgMHg3QzJFLCAweDdDMkYsIDB4N0MzMCwgMHg3QzMxLCAweDdDMzIsCisgICAgMHg3QzMzLCAweDdDMzQsIDB4N0MzNSwgMHg3QzM2LCAweDdDMzcsIDB4N0MzOSwgMHg3QzNBLCAweDdDM0IsIDB4N0MzQywKKyAgICAweDdDNDIsIDB4N0M0NCwgMHg3QzQ1LCAweDdDNDYsIDB4N0M0NywgMHg3QzQ4LCAweDdDNDksIDB4N0M0QSwgMHg3QzRCLAorICAgIDB4N0M0RSwgMHg3QzRGLCAweDdDNTAsIDB4N0M1MSwgMHg3QzUyLCAweDdDNTMsIDB4N0M1NCwgMHg3QzU1LCAweDdDNTYsCisgICAgMHg3QzU3LCAweDdDNTgsIDB4N0M1OSwgMHg3QzVBLCAweDdDNUIsIDB4N0M1RCwgMHg3QzVFLCAweDdDNjEsIDB4N0M2MiwKKyAgICAweDdDNjMsIDB4N0M2NSwgMHg3QzY2LCAweDdDNjcsIDB4N0M2OCwgMHg3QzZCLCAweDdDNkQsIDB4N0M2RiwgMHg3QzcwLAorICAgIDB4N0M3MSwgMHg3Qzc1LCAweDdDNzYsIDB4N0M3NywgMHg3Qzc4LCAweDdDNzksIDB4N0M3QSwgMHg3QzdFLCAweDdDN0YsCisgICAgMHg3QzgwLCAweDdDODEsIDB4N0M4MiwgMHg3QzgzLCAweDdDODQsIDB4N0M4NSwgMHg3Qzg2LCAweDdDODcsIDB4N0M4OCwKKyAgICAweDdDOEEsIDB4N0M4QiwgMHg3QzhDLCAweDdDOEQsIDB4N0M4RSwgMHg3QzhGLCAweDdDOTAsIDB4N0M5MywgMHg3Qzk0LAorICAgIDB4N0M5NiwgMHg3Qzk5LCAweDdDOUEsIDB4N0M5QiwgMHg3Q0EwLCAweDdDQTEsIDB4N0NBMywgMHg3Q0E2LCAweDdDQTcsCisgICAgMHg3Q0E4LCAweDdDQTksIDB4N0NBQiwgMHg3Q0FDLCAweDdDQUQsIDB4N0NBRiwgMHg3Q0IwLCAweDdDQjQsIDB4N0NCNSwKKyAgICAweDdDQjYsIDB4N0NCNywgMHg3Q0I4LCAweDdDQkEsIDB4N0NCQiwgMHg3Q0JGLCAweDdDQzAsIDB4N0NDMiwgMHg3Q0MzLAorICAgIDB4N0NDNCwgMHg3Q0M2LCAweDdDQzksIDB4N0NDQiwgMHg3Q0NFLCAweDdDQ0YsIDB4N0NEMCwgMHg3Q0QxLCAweDdDRDIsCisgICAgMHg3Q0QzLCAweDdDRDQsIDB4N0NEOCwgMHg3Q0RBLCAweDdDREIsIDB4N0NFMSwgMHg3Q0UyLCAweDdDRTMsIDB4N0NFNCwKKyAgICAweDdDRTUsIDB4N0NFNiwgMHg3Q0U5LCAweDdDRUEsIDB4N0NFQiwgMHg3Q0VDLCAweDdDRUQsIDB4N0NFRSwgMHg3Q0YxLAorICAgIDB4N0NGMywgMHg3Q0Y1LCAweDdDRjcsIDB4N0NGQSwgMHg3Q0ZDLCAweDdDRkQsIDB4N0NGRiwgMHg3RDAxLCAweDdEMDMsCisgICAgMHg3RDBDLCAweDdEMEUsIDB4N0QwRiwgMHg3RDExLCAweDdEMTIsIDB4N0QxNiwgMHg3RDE4LCAweDdEMUQsIDB4N0QxRSwKKyAgICAweDdEMUYsIDB4N0QyMywgMHg3RDI0LCAweDdEMjUsIDB4N0QyNiwgMHg3RDI4LCAweDdEMjksIDB4N0QyQSwgMHg3RDJDLAorICAgIDB4N0QyRCwgMHg3RDJFLCAweDdEMzQsIDB4N0QzNSwgMHg3RDM2LCAweDdEMzcsIDB4N0QzOCwgMHg3RDNCLCAweDdEM0QsCisgICAgMHg3RDNFLCAweDdENDEsIDB4N0Q0MywgMHg3RDQ1LCAweDdENDcsIDB4N0Q0OCwgMHg3RDQ5LCAweDdENEEsIDB4N0Q0QiwKKyAgICAweDdENEMsIDB4N0Q0RCwgMHg3RDRGLCAweDdENTEsIDB4N0Q1MiwgMHg3RDUzLCAweDdENTQsIDB4N0Q1NSwgMHg3RDU2LAorICAgIDB4N0Q1NywgMHg3RDU4LCAweDdENTksIDB4N0Q1QSwgMHg3RDVCLCAweDdENUMsIDB4N0Q1RiwgMHg3RDYwLCAweDdENjMsCisgICAgMHg3RDY0LCAweDdENjUsIDB4N0Q2NywgMHg3RDY5LCAweDdENkEsIDB4N0Q2QiwgMHg3RDZDLCAweDdENkQsIDB4N0Q2RiwKKyAgICAweDdENzAsIDB4N0Q3NCwgMHg3RDc1LCAweDdENzgsIDB4N0Q3QSwgMHg3RDdCLCAweDdEN0MsIDB4N0Q3RCwgMHg3RDdFLAorICAgIDB4N0Q3RiwgMHg3RDgwLCAweDdEODIsIDB4N0Q4NCwgMHg3RDg1LCAweDdEODcsIDB4N0Q4QSwgMHg3RDhCLCAweDdEOEMsCisgICAgMHg3RDhELCAweDdEOEUsIDB4N0Q5MCwgMHg3RDkxLCAweDdEOTIsIDB4N0Q5NCwgMHg3RDk1LCAweDdEOTYsIDB4N0Q5NywKKyAgICAweDdEOTgsIDB4N0Q5OSwgMHg3RDlBLCAweDdEOUIsIDB4N0Q5RCwgMHg3RDlGLCAweDdEQTAsIDB4N0RBMSwgMHg3REE0LAorICAgIDB4N0RBNSwgMHg3REE3LCAweDdEQTgsIDB4N0RBOSwgMHg3REFBLCAweDdEQUYsIDB4N0RCNSwgMHg3REI2LCAweDdEQjcsCisgICAgMHg3REJDLCAweDdEQzAsIDB4N0RDMSwgMHg3REMyLCAweDdEQzMsIDB4N0RDNSwgMHg3REM2LCAweDdEQzgsIDB4N0RDOSwKKyAgICAweDdEQ0MsIDB4N0RDRCwgMHg3RENFLCAweDdEQ0YsIDB4N0REMCwgMHg3REQzLCAweDdERDUsIDB4N0RENiwgMHg3RERBLAorICAgIDB4N0REQiwgMHg3RERDLCAweDdEREYsIDB4N0RFMiwgMHg3REU0LCAweDdERTUsIDB4N0RFNywgMHg3REVBLCAweDdERUIsCisgICAgMHg3REVELCAweDdERUUsIDB4N0RGMCwgMHg3REYzLCAweDdERjUsIDB4N0RGNywgMHg3REY4LCAweDdERkEsIDB4N0RGQywKKyAgICAweDdERkQsIDB4N0RGRSwgMHg3REZGLCAweDdFMDAsIDB4N0UwMSwgMHg3RTAyLCAweDdFMDMsIDB4N0UwNCwgMHg3RTA1LAorICAgIDB4N0UwNiwgMHg3RTA3LCAweDdFMEMsIDB4N0UwRCwgMHg3RTBFLCAweDdFMEYsIDB4N0UxMiwgMHg3RTEzLCAweDdFMTQsCisgICAgMHg3RTE1LCAweDdFMTYsIDB4N0UxNywgMHg3RTE4LCAweDdFMTksIDB4N0UxQSwgMHg3RTFDLCAweDdFMjAsIDB4N0UyMSwKKyAgICAweDdFMjIsIDB4N0UyNCwgMHg3RTI1LCAweDdFMjYsIDB4N0UyOCwgMHg3RTI5LCAweDdFMkEsIDB4N0UyQywgMHg3RTJGLAorICAgIDB4N0UzMCwgMHg3RTMzLCAweDdFMzgsIDB4N0UzQSwgMHg3RTNDLCAweDdFM0YsIDB4N0U0MCwgMHg3RTQyLCAweDdFNDMsCisgICAgMHg3RTQ0LCAweDdFNDgsIDB4N0U0OSwgMHg3RTRBLCAweDdFNEIsIDB4N0U0QywgMHg3RTRELCAweDdFNEUsIDB4N0U0RiwKKyAgICAweDdFNTAsIDB4N0U1MSwgMHg3RTUzLCAweDdFNTYsIDB4N0U1NywgMHg3RTU4LCAweDdFNTksIDB4N0U1QiwgMHg3RTVDLAorICAgIDB4N0U1RCwgMHg3RTVGLCAweDdFNjAsIDB4N0U2MSwgMHg3RTYzLCAweDdFNjQsIDB4N0U2NSwgMHg3RTY2LCAweDdFNjcsCisgICAgMHg3RTY4LCAweDdFNkMsIDB4N0U3MSwgMHg3RTcyLCAweDdFNzQsIDB4N0U3NSwgMHg3RTc2LCAweDdFNzcsIDB4N0U3OCwKKyAgICAweDdFN0EsIDB4N0U3QiwgMHg3RTdGLCAweDdFODAsIDB4N0U4MSwgMHg3RTgzLCAweDdFODQsIDB4N0U4NSwgMHg3RTg2LAorICAgIDB4N0U4NywgMHg3RTg5LCAweDdFOEIsIDB4N0U4RSwgMHg3RTkwLCAweDdFOTEsIDB4N0U5MiwgMHg3RTk1LCAweDdFOTcsCisgICAgMHg3RTk5LCAweDdFOUEsIDB4N0U5RCwgMHg3RTlFLCAweDdFQUUsIDB4N0VCNCwgMHg3RUJCLCAweDdFQkMsIDB4N0VENiwKKyAgICAweDdFRTQsIDB4N0VFQywgMHg3RUY5LCAweDdGMEEsIDB4N0YxMCwgMHg3RjFFLCAweDdGMzcsIDB4N0YzOSwgMHg3RjNCLAorICAgIDB4N0YzQywgMHg3RjNELCAweDdGM0UsIDB4N0YzRiwgMHg3RjQwLCAweDdGNDEsIDB4N0Y0MywgMHg3RjQ2LCAweDdGNDcsCisgICAgMHg3RjQ4LCAweDdGNDksIDB4N0Y0QSwgMHg3RjRCLCAweDdGNEQsIDB4N0Y0RiwgMHg3RjUyLCAweDdGNTMsIDB4N0Y1NiwKKyAgICAweDdGNTksIDB4N0Y1QiwgMHg3RjVDLCAweDdGNUQsIDB4N0Y1RSwgMHg3RjYwLCAweDdGNjMsIDB4N0Y2NCwgMHg3RjY1LAorICAgIDB4N0Y2NiwgMHg3RjY3LCAweDdGNkIsIDB4N0Y2QywgMHg3RjZELCAweDdGNkYsIDB4N0Y3MywgMHg3Rjc1LCAweDdGNzYsCisgICAgMHg3Rjc4LCAweDdGN0EsIDB4N0Y3QiwgMHg3RjdDLCAweDdGN0QsIDB4N0Y3RiwgMHg3RjgwLCAweDdGODIsIDB4N0Y4MywKKyAgICAweDdGODQsIDB4N0Y4NywgMHg3Rjg5LCAweDdGOEIsIDB4N0Y4RCwgMHg3RjhGLCAweDdGOTAsIDB4N0Y5MSwgMHg3RjkyLAorICAgIDB4N0Y5MywgMHg3Rjk1LCAweDdGOTYsIDB4N0Y5NywgMHg3Rjk4LCAweDdGOTksIDB4N0Y5QiwgMHg3RjlDLCAweDdGQTAsCisgICAgMHg3RkEyLCAweDdGQTMsIDB4N0ZBNiwgMHg3RkE4LCAweDdGQUEsIDB4N0ZBQiwgMHg3RkFDLCAweDdGQUQsIDB4N0ZBRSwKKyAgICAweDdGQjEsIDB4N0ZCMywgMHg3RkI0LCAweDdGQjUsIDB4N0ZCNiwgMHg3RkI3LCAweDdGQkEsIDB4N0ZCQiwgMHg3RkJFLAorICAgIDB4N0ZDMCwgMHg3RkMyLCAweDdGQzMsIDB4N0ZDNCwgMHg3RkM2LCAweDdGQzcsIDB4N0ZDOCwgMHg3RkM5LCAweDdGQ0IsCisgICAgMHg3RkNELCAweDdGQ0YsIDB4N0ZEMCwgMHg3RkQxLCAweDdGRDMsIDB4N0ZENiwgMHg3RkQ3LCAweDdGRDksIDB4N0ZEQSwKKyAgICAweDdGREIsIDB4N0ZEQywgMHg3RkRELCAweDdGREUsIDB4N0ZFMiwgMHg3RkUzLCAweDdGRTQsIDB4N0ZFNywgMHg3RkU4LAorICAgIDB4N0ZFQSwgMHg3RkVCLCAweDdGRUMsIDB4N0ZFRCwgMHg3RkVGLCAweDdGRjIsIDB4N0ZGNCwgMHg3RkY1LCAweDdGRjYsCisgICAgMHg3RkY3LCAweDdGRjgsIDB4N0ZGQSwgMHg3RkZELCAweDdGRkUsIDB4N0ZGRiwgMHg4MDAyLCAweDgwMDcsIDB4ODAwOCwKKyAgICAweDgwMDksIDB4ODAwQSwgMHg4MDBFLCAweDgwMEYsIDB4ODAxMSwgMHg4MDEzLCAweDgwMUEsIDB4ODAxQiwgMHg4MDFELAorICAgIDB4ODAxRSwgMHg4MDFGLCAweDgwMjEsIDB4ODAyMywgMHg4MDI0LCAweDgwMkIsIDB4ODAyRCwgMHg4MDJGLCAweDgwMzAsCisgICAgMHg4MDMyLCAweDgwMzQsIDB4ODAzOSwgMHg4MDNBLCAweDgwM0MsIDB4ODAzRSwgMHg4MDQwLCAweDgwNDEsIDB4ODA0NCwKKyAgICAweDgwNDUsIDB4ODA0NywgMHg4MDQ4LCAweDgwNDksIDB4ODA0RSwgMHg4MDRGLCAweDgwNTAsIDB4ODA1MSwgMHg4MDUzLAorICAgIDB4ODA1NSwgMHg4MDU3LCAweDgwNTksIDB4ODA1QiwgMHg4MDVDLCAweDgwNUQsIDB4ODA1RiwgMHg4MDYwLCAweDgwNjEsCisgICAgMHg4MDYyLCAweDgwNjMsIDB4ODA2NCwgMHg4MDY1LCAweDgwNjYsIDB4ODA2NywgMHg4MDY4LCAweDgwNkIsIDB4ODA2QywKKyAgICAweDgwNkQsIDB4ODA2RSwgMHg4MDc0LCAweDgwNzgsIDB4ODA3QSwgMHg4MDdCLCAweDgwN0MsIDB4ODA4MSwgMHg4MDgyLAorICAgIDB4ODA4OCwgMHg4MDhBLCAweDgwOEQsIDB4ODA4RSwgMHg4MDhGLCAweDgwOTAsIDB4ODA5MSwgMHg4MDkyLCAweDgwOTQsCisgICAgMHg4MDk1LCAweDgwOTcsIDB4ODA5OSwgMHg4MDlFLCAweDgwQTMsIDB4ODBBNiwgMHg4MEE3LCAweDgwQTgsIDB4ODBBQywKKyAgICAweDgwQjAsIDB4ODBCMywgMHg4MEI1LCAweDgwQjYsIDB4ODBCOCwgMHg4MEI5LCAweDgwQkIsIDB4ODBDNSwgMHg4MEM3LAorICAgIDB4ODBDOCwgMHg4MEM5LCAweDgwQ0EsIDB4ODBDQiwgMHg4MENGLCAweDgwRDAsIDB4ODBEMSwgMHg4MEQyLCAweDgwRDMsCisgICAgMHg4MEQ0LCAweDgwRDUsIDB4ODBEOCwgMHg4MERGLCAweDgwRTAsIDB4ODBFMiwgMHg4MEUzLCAweDgwRTYsIDB4ODBFRSwKKyAgICAweDgwRjUsIDB4ODBGNywgMHg4MEY5LCAweDgwRkIsIDB4ODBGRSwgMHg4MEZGLCAweDgxMDAsIDB4ODEwMSwgMHg4MTAzLAorICAgIDB4ODEwNCwgMHg4MTA3LCAweDgxMDgsIDB4ODEwQiwgMHg4MTBDLCAweDgxMTUsIDB4ODExNywgMHg4MTE5LCAweDgxMUMsCisgICAgMHg4MTFELCAweDgxMUYsIDB4ODEyMCwgMHg4MTIxLCAweDgxMjIsIDB4ODEyMywgMHg4MTI0LCAweDgxMjUsIDB4ODEyNiwKKyAgICAweDgxMjcsIDB4ODEyOCwgMHg4MTI5LCAweDgxMkEsIDB4ODEyQiwgMHg4MTJELCAweDgxMkUsIDB4ODEzMCwgMHg4MTMzLAorICAgIDB4ODEzNCwgMHg4MTM1LCAweDgxMzcsIDB4ODEzQSwgMHg4MTNCLCAweDgxM0MsIDB4ODEzRCwgMHg4MTNGLCAweDgxNDAsCisgICAgMHg4MTQxLCAweDgxNDIsIDB4ODE0MywgMHg4MTQ0LCAweDgxNDUsIDB4ODE0NywgMHg4MTQ5LCAweDgxNEQsIDB4ODE0RiwKKyAgICAweDgxNTIsIDB4ODE1NywgMHg4MTU4LCAweDgxNUIsIDB4ODE1QywgMHg4MTVELCAweDgxNUUsIDB4ODE1RiwgMHg4MTYyLAorICAgIDB4ODE2MywgMHg4MTY0LCAweDgxNjgsIDB4ODE2QSwgMHg4MTZDLCAweDgxNkYsIDB4ODE3MiwgMHg4MTczLCAweDgxNzUsCisgICAgMHg4MTc2LCAweDgxNzcsIDB4ODE4MSwgMHg4MTgzLCAweDgxODQsIDB4ODE4NSwgMHg4MTg2LCAweDgxODcsIDB4ODE4OSwKKyAgICAweDgxOEIsIDB4ODE4QywgMHg4MThELCAweDgxOEUsIDB4ODE5MCwgMHg4MTkyLCAweDgxOTMsIDB4ODE5NCwgMHg4MTk1LAorICAgIDB4ODE5NiwgMHg4MTk3LCAweDgxOTksIDB4ODE5RSwgMHg4MTlGLCAweDgxQTEsIDB4ODFBMiwgMHg4MUE0LCAweDgxQTUsCisgICAgMHg4MUE3LCAweDgxQUIsIDB4ODFBQywgMHg4MUFELCAweDgxQUUsIDB4ODFBRiwgMHg4MUIwLCAweDgxQjEsIDB4ODFCMiwKKyAgICAweDgxQjQsIDB4ODFCNSwgMHg4MUI2LCAweDgxQjcsIDB4ODFCOCwgMHg4MUI5LCAweDgxQkMsIDB4ODFDNCwgMHg4MUM1LAorICAgIDB4ODFDNywgMHg4MUM4LCAweDgxQ0IsIDB4ODFDRSwgMHg4MUQwLCAweDgxRDEsIDB4ODFEMiwgMHg4MUQzLCAweDgxRDQsCisgICAgMHg4MUQ1LCAweDgxRDYsIDB4ODFENywgMHg4MUQ5LCAweDgxREIsIDB4ODFEQywgMHg4MURELCAweDgxREUsIDB4ODFFMSwKKyAgICAweDgxRTIsIDB4ODFFNCwgMHg4MUU1LCAweDgxRTYsIDB4ODFFOSwgMHg4MUVCLCAweDgxRUUsIDB4ODFFRiwgMHg4MUYwLAorICAgIDB4ODFGMSwgMHg4MUYyLCAweDgxRjUsIDB4ODFGNiwgMHg4MUY3LCAweDgxRjgsIDB4ODFGOSwgMHg4MUZELCAweDgxRkYsCisgICAgMHg4MjAzLCAweDgyMEIsIDB4ODIwRSwgMHg4MjBGLCAweDgyMTEsIDB4ODIxMywgMHg4MjE1LCAweDgyMTYsIDB4ODIxNywKKyAgICAweDgyMTgsIDB4ODIxOSwgMHg4MjFBLCAweDgyMUQsIDB4ODIyMCwgMHg4MjI0LCAweDgyMjUsIDB4ODIyNiwgMHg4MjI3LAorICAgIDB4ODIyOSwgMHg4MjJFLCAweDgyMzIsIDB4ODIzQSwgMHg4MjNDLCAweDgyM0QsIDB4ODIzRiwgMHg4MjQwLCAweDgyNDEsCisgICAgMHg4MjQyLCAweDgyNDMsIDB4ODI0NSwgMHg4MjQ2LCAweDgyNDgsIDB4ODI0QSwgMHg4MjRDLCAweDgyNEQsIDB4ODI0RSwKKyAgICAweDgyNTAsIDB4ODI1MSwgMHg4MjUyLCAweDgyNTMsIDB4ODI1NCwgMHg4MjU1LCAweDgyNTYsIDB4ODI1NywgMHg4MjVCLAorICAgIDB4ODI1QywgMHg4MjVELCAweDgyNUUsIDB4ODI2MCwgMHg4MjYxLCAweDgyNjIsIDB4ODI2MywgMHg4MjY1LCAweDgyNjcsCisgICAgMHg4MjY5LCAweDgyNkEsIDB4ODI2QywgMHg4MjZELCAweDgyNzUsIDB4ODI3NiwgMHg4Mjc4LCAweDgyN0IsIDB4ODI3QywKKyAgICAweDgyODAsIDB4ODI4MSwgMHg4MjgzLCAweDgyODUsIDB4ODI4NiwgMHg4Mjg3LCAweDgyODksIDB4ODI4QywgMHg4MjkwLAorICAgIDB4ODI5MywgMHg4Mjk0LCAweDgyOTUsIDB4ODI5NiwgMHg4MjlBLCAweDgyOUIsIDB4ODI5RSwgMHg4MkEwLCAweDgyQTIsCisgICAgMHg4MkEzLCAweDgyQTcsIDB4ODJCMiwgMHg4MkI1LCAweDgyQjYsIDB4ODJCQSwgMHg4MkJDLCAweDgyQkYsIDB4ODJDMCwKKyAgICAweDgyQzIsIDB4ODJDMywgMHg4MkM1LCAweDgyQzYsIDB4ODJDOSwgMHg4MkQwLCAweDgyRDYsIDB4ODJEOSwgMHg4MkRBLAorICAgIDB4ODJERCwgMHg4MkUyLCAweDgyRTgsIDB4ODJFOSwgMHg4MkVBLCAweDgyRUMsIDB4ODJFRCwgMHg4MkVFLCAweDgyRjAsCisgICAgMHg4MkYyLCAweDgyRjMsIDB4ODJGNSwgMHg4MkY2LCAweDgyRjgsIDB4ODJGQSwgMHg4MkZDLCAweDgyRkQsIDB4ODJGRSwKKyAgICAweDgyRkYsIDB4ODMwMCwgMHg4MzBBLCAweDgzMEIsIDB4ODMwRCwgMHg4MzEwLCAweDgzMTIsIDB4ODMxMywgMHg4MzE2LAorICAgIDB4ODMxOCwgMHg4MzE5LCAweDgzMUQsIDB4ODMxRSwgMHg4MzFGLCAweDgzMjAsIDB4ODMyMSwgMHg4MzIyLCAweDgzMjMsCisgICAgMHg4MzI0LCAweDgzMjUsIDB4ODMyNiwgMHg4MzI5LCAweDgzMkEsIDB4ODMyRSwgMHg4MzMwLCAweDgzMzIsIDB4ODMzNywKKyAgICAweDgzM0IsIDB4ODMzRCwgMHg4MzNFLCAweDgzM0YsIDB4ODM0MSwgMHg4MzQyLCAweDgzNDQsIDB4ODM0NSwgMHg4MzQ4LAorICAgIDB4ODM0QSwgMHg4MzRCLCAweDgzNEMsIDB4ODM0RCwgMHg4MzRFLCAweDgzNTMsIDB4ODM1NSwgMHg4MzU2LCAweDgzNTcsCisgICAgMHg4MzU4LCAweDgzNTksIDB4ODM1RCwgMHg4MzYyLCAweDgzNzAsIDB4ODM3MSwgMHg4MzcyLCAweDgzNzMsIDB4ODM3NCwKKyAgICAweDgzNzUsIDB4ODM3NiwgMHg4Mzc5LCAweDgzN0EsIDB4ODM3RSwgMHg4MzdGLCAweDgzODAsIDB4ODM4MSwgMHg4MzgyLAorICAgIDB4ODM4MywgMHg4Mzg0LCAweDgzODcsIDB4ODM4OCwgMHg4MzhCLCAweDgzOEMsIDB4ODM4RCwgMHg4MzhGLCAweDgzOTAsCisgICAgMHg4MzkxLCAweDgzOTQsIDB4ODM5NSwgMHg4Mzk3LCAweDgzOTksIDB4ODM5QSwgMHg4MzlELCAweDgzOUYsIDB4ODNBMSwKKyAgICAweDgzQTMsIDB4ODNBNCwgMHg4M0E1LCAweDgzQTYsIDB4ODNBQywgMHg4M0FELCAweDgzQUUsIDB4ODNBRiwgMHg4M0I1LAorICAgIDB4ODNCQiwgMHg4M0JFLCAweDgzQkYsIDB4ODNDMiwgMHg4M0MzLCAweDgzQzQsIDB4ODNDNiwgMHg4M0M4LCAweDgzQzksCisgICAgMHg4M0NCLCAweDgzQ0QsIDB4ODNDRSwgMHg4M0QwLCAweDgzRDEsIDB4ODNEMiwgMHg4M0QzLCAweDgzRDUsIDB4ODNENywKKyAgICAweDgzRDksIDB4ODNEQSwgMHg4M0RCLCAweDgzREUsIDB4ODNFMiwgMHg4M0UzLCAweDgzRTQsIDB4ODNFNiwgMHg4M0U3LAorICAgIDB4ODNFOCwgMHg4M0VCLCAweDgzRUMsIDB4ODNFRCwgMHg4M0VFLCAweDgzRjMsIDB4ODNGNCwgMHg4M0Y1LCAweDgzRjYsCisgICAgMHg4M0Y3LCAweDgzRkEsIDB4ODNGQiwgMHg4M0ZDLCAweDgzRkUsIDB4ODNGRiwgMHg4NDAwLCAweDg0MDIsIDB4ODQwNSwKKyAgICAweDg0MDgsIDB4ODQwOSwgMHg4NDEwLCAweDg0MTIsIDB4ODQxMywgMHg4NDE0LCAweDg0MTUsIDB4ODQxNiwgMHg4NDE3LAorICAgIDB4ODQxOSwgMHg4NDFBLCAweDg0MUIsIDB4ODQxRSwgMHg4NDFGLCAweDg0MjAsIDB4ODQyMSwgMHg4NDIyLCAweDg0MjMsCisgICAgMHg4NDI5LCAweDg0MkEsIDB4ODQyQiwgMHg4NDJELCAweDg0MkUsIDB4ODQyRiwgMHg4NDMwLCAweDg0MzIsIDB4ODQzMywKKyAgICAweDg0MzQsIDB4ODQzNiwgMHg4NDM3LCAweDg0MzksIDB4ODQzQSwgMHg4NDNCLCAweDg0M0UsIDB4ODQzRiwgMHg4NDQwLAorICAgIDB4ODQ0MSwgMHg4NDQyLCAweDg0NDMsIDB4ODQ0NCwgMHg4NDQ1LCAweDg0NDcsIDB4ODQ0OCwgMHg4NDRBLCAweDg0NEIsCisgICAgMHg4NDRDLCAweDg0NEQsIDB4ODQ0RSwgMHg4NDRGLCAweDg0NTAsIDB4ODQ1MywgMHg4NDU0LCAweDg0NTUsIDB4ODQ1NiwKKyAgICAweDg0NTgsIDB4ODQ1RCwgMHg4NDVFLCAweDg0NUYsIDB4ODQ2MCwgMHg4NDYyLCAweDg0NjUsIDB4ODQ2NywgMHg4NDY4LAorICAgIDB4ODQ2QSwgMHg4NDZFLCAweDg0NzAsIDB4ODQ3MiwgMHg4NDc0LCAweDg0NzksIDB4ODQ3QiwgMHg4NDdDLCAweDg0N0QsCisgICAgMHg4NDdFLCAweDg0N0YsIDB4ODQ4MCwgMHg4NDgxLCAweDg0ODMsIDB4ODQ4NCwgMHg4NDg1LCAweDg0ODYsIDB4ODQ4QSwKKyAgICAweDg0OEQsIDB4ODQ4RiwgMHg4NDkwLCAweDg0OTEsIDB4ODQ5MiwgMHg4NDk1LCAweDg0OTYsIDB4ODQ5OCwgMHg4NDlBLAorICAgIDB4ODQ5QiwgMHg4NDlELCAweDg0OUUsIDB4ODQ5RiwgMHg4NEEwLCAweDg0QTIsIDB4ODRBMywgMHg4NEE0LCAweDg0QTUsCisgICAgMHg4NEE2LCAweDg0QTcsIDB4ODRBOCwgMHg4NEE5LCAweDg0QUEsIDB4ODRBQiwgMHg4NEFDLCAweDg0QUQsIDB4ODRBRSwKKyAgICAweDg0QjAsIDB4ODRCMSwgMHg4NEIzLCAweDg0QjUsIDB4ODRCNiwgMHg4NEI3LCAweDg0QkIsIDB4ODRCRSwgMHg4NEMyLAorICAgIDB4ODRDMywgMHg4NEM1LCAweDg0QzYsIDB4ODRDNywgMHg4NEM4LCAweDg0Q0MsIDB4ODRDRSwgMHg4NENGLCAweDg0RDIsCisgICAgMHg4NEQ0LCAweDg0RDUsIDB4ODRENywgMHg4NEQ4LCAweDg0RDksIDB4ODREQSwgMHg4NERCLCAweDg0REMsIDB4ODRERSwKKyAgICAweDg0RTEsIDB4ODRFMiwgMHg4NEU0LCAweDg0RTcsIDB4ODRFOCwgMHg4NEU5LCAweDg0RUEsIDB4ODRFQiwgMHg4NEVELAorICAgIDB4ODRGMSwgMHg4NEYyLCAweDg0RjMsIDB4ODRGNCwgMHg4NEY1LCAweDg0RjYsIDB4ODRGNywgMHg4NEY4LCAweDg0RjksCisgICAgMHg4NEZBLCAweDg0RkIsIDB4ODRGRSwgMHg4NTAwLCAweDg1MDEsIDB4ODUwMiwgMHg4NTAzLCAweDg1MDQsIDB4ODUwNSwKKyAgICAweDg1MDYsIDB4ODUwNywgMHg4NTA4LCAweDg1MDksIDB4ODUwQSwgMHg4NTBCLCAweDg1MEQsIDB4ODUwRSwgMHg4NTBGLAorICAgIDB4ODUxMCwgMHg4NTEyLCAweDg1MTUsIDB4ODUxNiwgMHg4NTE4LCAweDg1MTksIDB4ODUxQiwgMHg4NTFDLCAweDg1MUQsCisgICAgMHg4NTIwLCAweDg1MjIsIDB4ODUyNCwgMHg4NTI1LCAweDg1MjcsIDB4ODUyOCwgMHg4NTI5LCAweDg1MkEsIDB4ODUyRSwKKyAgICAweDg1MkYsIDB4ODUzMCwgMHg4NTMxLCAweDg1MzIsIDB4ODUzMywgMHg4NTM0LCAweDg1MzUsIDB4ODUzNiwgMHg4NTNFLAorICAgIDB4ODUzRiwgMHg4NTQwLCAweDg1NDIsIDB4ODU0NCwgMHg4NTQ1LCAweDg1NDcsIDB4ODU0QiwgMHg4NTRDLCAweDg1NEQsCisgICAgMHg4NTRGLCAweDg1NTAsIDB4ODU1MSwgMHg4NTU0LCAweDg1NTcsIDB4ODU1QSwgMHg4NTVCLCAweDg1NUMsIDB4ODU1RCwKKyAgICAweDg1NUYsIDB4ODU2MCwgMHg4NTYxLCAweDg1NjMsIDB4ODU2NSwgMHg4NTY2LCAweDg1NjcsIDB4ODU2QiwgMHg4NTZDLAorICAgIDB4ODU2RSwgMHg4NTZGLCAweDg1NzAsIDB4ODU3MSwgMHg4NTczLCAweDg1NzUsIDB4ODU3NiwgMHg4NTc4LCAweDg1N0MsCisgICAgMHg4NTdELCAweDg1N0YsIDB4ODU4MCwgMHg4NTgxLCAweDg1ODIsIDB4ODU4MywgMHg4NTg2LCAweDg1ODksIDB4ODU4QiwKKyAgICAweDg1OEQsIDB4ODU4RSwgMHg4NTkwLCAweDg1OTIsIDB4ODU5MywgMHg4NTk1LCAweDg1OTYsIDB4ODU5NywgMHg4NTk4LAorICAgIDB4ODU5OSwgMHg4NTlBLCAweDg1OUQsIDB4ODU5RSwgMHg4NUEwLCAweDg1QTEsIDB4ODVBMiwgMHg4NUEzLCAweDg1QTUsCisgICAgMHg4NUE3LCAweDg1QUIsIDB4ODVBQywgMHg4NUFELCAweDg1QjEsIDB4ODVCMiwgMHg4NUIzLCAweDg1QjQsIDB4ODVCNSwKKyAgICAweDg1QjYsIDB4ODVCOCwgMHg4NUJCLCAweDg1QkMsIDB4ODVCRCwgMHg4NUJFLCAweDg1QkYsIDB4ODVDMCwgMHg4NUMyLAorICAgIDB4ODVDMywgMHg4NUM0LCAweDg1QzUsIDB4ODVDNiwgMHg4NUM3LCAweDg1QzgsIDB4ODVDQSwgMHg4NUNCLCAweDg1Q0MsCisgICAgMHg4NUQxLCAweDg1RDIsIDB4ODVENCwgMHg4NUQ2LCAweDg1RDcsIDB4ODVEOCwgMHg4NUQ5LCAweDg1REEsIDB4ODVEQiwKKyAgICAweDg1REUsIDB4ODVERiwgMHg4NUUwLCAweDg1RTEsIDB4ODVFMiwgMHg4NUUzLCAweDg1RTYsIDB4ODVFNywgMHg4NUU4LAorICAgIDB4ODVFQiwgMHg4NUVDLCAweDg1RUQsIDB4ODVFRSwgMHg4NUVGLCAweDg1RjAsIDB4ODVGMSwgMHg4NUYyLCAweDg1RjMsCisgICAgMHg4NUY1LCAweDg1RjcsIDB4ODVGOCwgMHg4NUZDLCAweDg1RkQsIDB4ODVGRSwgMHg4NjAwLCAweDg2MDEsIDB4ODYwMiwKKyAgICAweDg2MDMsIDB4ODYwOCwgMHg4NjA5LCAweDg2MEEsIDB4ODYwQywgMHg4NjBELCAweDg2MEUsIDB4ODYwRiwgMHg4NjEwLAorICAgIDB4ODYxMiwgMHg4NjEzLCAweDg2MTQsIDB4ODYxNSwgMHg4NjE3LCAweDg2MTgsIDB4ODYxOSwgMHg4NjFCLCAweDg2MUMsCisgICAgMHg4NjFELCAweDg2MUYsIDB4ODYyMCwgMHg4NjIxLCAweDg2MjMsIDB4ODYyNCwgMHg4NjI1LCAweDg2MjYsIDB4ODYyOCwKKyAgICAweDg2MkEsIDB4ODYyQiwgMHg4NjJDLCAweDg2MkUsIDB4ODYyRiwgMHg4NjMwLCAweDg2MzEsIDB4ODYzMiwgMHg4NjMzLAorICAgIDB4ODYzNCwgMHg4NjM1LCAweDg2MzYsIDB4ODYzNywgMHg4NjM5LCAweDg2M0IsIDB4ODYzRCwgMHg4NjNFLCAweDg2NDAsCisgICAgMHg4NjQxLCAweDg2NDIsIDB4ODY0MywgMHg4NjQ0LCAweDg2NDUsIDB4ODY0NiwgMHg4NjQ3LCAweDg2NDgsIDB4ODY0OSwKKyAgICAweDg2NEEsIDB4ODY0QiwgMHg4NjRDLCAweDg2NTIsIDB4ODY1MywgMHg4NjU2LCAweDg2NTcsIDB4ODY1OCwgMHg4NjU5LAorICAgIDB4ODY1QiwgMHg4NjVELCAweDg2NjAsIDB4ODY2MSwgMHg4NjYzLCAweDg2NjQsIDB4ODY2NSwgMHg4NjY2LCAweDg2NjgsCisgICAgMHg4NjY5LCAweDg2NkEsIDB4ODY2RCwgMHg4NjZGLCAweDg2NzAsIDB4ODY3MiwgMHg4NjczLCAweDg2NzQsIDB4ODY3NSwKKyAgICAweDg2NzYsIDB4ODY3NywgMHg4Njc4LCAweDg2ODMsIDB4ODY4NCwgMHg4Njg1LCAweDg2ODYsIDB4ODY4NywgMHg4Njg4LAorICAgIDB4ODY4OSwgMHg4NjhFLCAweDg2OEYsIDB4ODY5MCwgMHg4NjkxLCAweDg2OTIsIDB4ODY5NCwgMHg4Njk2LCAweDg2OTcsCisgICAgMHg4Njk4LCAweDg2OTksIDB4ODY5QSwgMHg4NjlCLCAweDg2OUUsIDB4ODY5RiwgMHg4NkEwLCAweDg2QTEsIDB4ODZBMiwKKyAgICAweDg2QTUsIDB4ODZBNiwgMHg4NkFCLCAweDg2QUQsIDB4ODZBRSwgMHg4NkIyLCAweDg2QjMsIDB4ODZCNywgMHg4NkI4LAorICAgIDB4ODZCOSwgMHg4NkJCLCAweDg2QkMsIDB4ODZCRCwgMHg4NkJFLCAweDg2QkYsIDB4ODZDMSwgMHg4NkMyLCAweDg2QzMsCisgICAgMHg4NkM1LCAweDg2QzgsIDB4ODZDQywgMHg4NkNELCAweDg2RDIsIDB4ODZEMywgMHg4NkQ1LCAweDg2RDYsIDB4ODZENywKKyAgICAweDg2REEsIDB4ODZEQywgMHg4NkRELCAweDg2RTAsIDB4ODZFMSwgMHg4NkUyLCAweDg2RTMsIDB4ODZFNSwgMHg4NkU2LAorICAgIDB4ODZFNywgMHg4NkU4LCAweDg2RUEsIDB4ODZFQiwgMHg4NkVDLCAweDg2RUYsIDB4ODZGNSwgMHg4NkY2LCAweDg2RjcsCisgICAgMHg4NkZCLCAweDg2RkMsIDB4ODZGRCwgMHg4NkZGLCAweDg3MDEsIDB4ODcwNCwgMHg4NzA1LCAweDg3MEIsIDB4ODcwQywKKyAgICAweDg3MEUsIDB4ODcwRiwgMHg4NzEwLCAweDg3MTEsIDB4ODcxNCwgMHg4NzE2LCAweDg3MTksIDB4ODcxQiwgMHg4NzFELAorICAgIDB4ODcxRiwgMHg4NzIwLCAweDg3MjQsIDB4ODcyNiwgMHg4NzI3LCAweDg3MjgsIDB4ODcyQSwgMHg4NzJCLCAweDg3MkMsCisgICAgMHg4NzJELCAweDg3MkYsIDB4ODczMCwgMHg4NzMyLCAweDg3MzMsIDB4ODczNSwgMHg4NzM2LCAweDg3MzgsIDB4ODczOSwKKyAgICAweDg3M0EsIDB4ODczQywgMHg4NzNELCAweDg3NDAsIDB4ODc0MSwgMHg4NzQyLCAweDg3NDMsIDB4ODc0NCwgMHg4NzQ1LAorICAgIDB4ODc0NiwgMHg4NzRBLCAweDg3NEIsIDB4ODc0RCwgMHg4NzRGLCAweDg3NTAsIDB4ODc1MSwgMHg4NzUyLCAweDg3NTQsCisgICAgMHg4NzU2LCAweDg3NTgsIDB4ODc1QSwgMHg4NzVCLCAweDg3NUMsIDB4ODc1RCwgMHg4NzVFLCAweDg3NUYsIDB4ODc2MSwKKyAgICAweDg3NjIsIDB4ODc2NywgMHg4NzY4LCAweDg3NjksIDB4ODc2QSwgMHg4NzZCLCAweDg3NkMsIDB4ODc2RCwgMHg4NzZGLAorICAgIDB4ODc3MSwgMHg4NzcyLCAweDg3NzMsIDB4ODc3NSwgMHg4Nzc3LCAweDg3NzksIDB4ODc3QSwgMHg4NzdGLCAweDg3ODAsCisgICAgMHg4NzgxLCAweDg3ODYsIDB4ODc4NywgMHg4Nzg5LCAweDg3OEEsIDB4ODc4QywgMHg4NzhFLCAweDg3OEYsIDB4ODc5MCwKKyAgICAweDg3OTEsIDB4ODc5MiwgMHg4Nzk0LCAweDg3OTUsIDB4ODc5NiwgMHg4Nzk4LCAweDg3OTksIDB4ODc5QSwgMHg4NzlCLAorICAgIDB4ODc5QywgMHg4NzlELCAweDg3QTAsIDB4ODdBMSwgMHg4N0EzLCAweDg3QTQsIDB4ODdBNSwgMHg4N0E2LCAweDg3QTcsCisgICAgMHg4N0E5LCAweDg3QUEsIDB4ODdBRSwgMHg4N0IwLCAweDg3QjEsIDB4ODdCMiwgMHg4N0I0LCAweDg3QjYsIDB4ODdCNywKKyAgICAweDg3QjgsIDB4ODdCOSwgMHg4N0JDLCAweDg3QkUsIDB4ODdCRiwgMHg4N0MxLCAweDg3QzIsIDB4ODdDMywgMHg4N0M1LAorICAgIDB4ODdDNywgMHg4N0M5LCAweDg3Q0MsIDB4ODdDRCwgMHg4N0NGLCAweDg3RDAsIDB4ODdENCwgMHg4N0Q1LCAweDg3RDYsCisgICAgMHg4N0Q3LCAweDg3RDgsIDB4ODdEOSwgMHg4N0RBLCAweDg3REMsIDB4ODdERCwgMHg4N0RFLCAweDg3REYsIDB4ODdFMSwKKyAgICAweDg3RTIsIDB4ODdFNCwgMHg4N0U2LCAweDg3RTcsIDB4ODdFOCwgMHg4N0U5LCAweDg3RUIsIDB4ODdFRCwgMHg4N0YwLAorICAgIDB4ODdGMSwgMHg4N0YzLCAweDg3RjQsIDB4ODdGNSwgMHg4N0Y3LCAweDg3RjgsIDB4ODdGQSwgMHg4N0ZDLCAweDg3RkQsCisgICAgMHg4N0ZGLCAweDg4MDAsIDB4ODgwMSwgMHg4ODAyLCAweDg4MDQsIDB4ODgwNywgMHg4ODA4LCAweDg4MDksIDB4ODgwQiwKKyAgICAweDg4MEMsIDB4ODgwRCwgMHg4ODBFLCAweDg4MEYsIDB4ODgxMiwgMHg4ODE0LCAweDg4MTcsIDB4ODgxOCwgMHg4ODE5LAorICAgIDB4ODgxQSwgMHg4ODFDLCAweDg4MUQsIDB4ODgxRSwgMHg4ODIwLCAweDg4MjQsIDB4ODgyNSwgMHg4ODI2LCAweDg4MjcsCisgICAgMHg4ODI4LCAweDg4MjksIDB4ODgyQSwgMHg4ODJCLCAweDg4MkMsIDB4ODgyRCwgMHg4ODJFLCAweDg4MkYsIDB4ODgzMCwKKyAgICAweDg4MzMsIDB4ODgzNCwgMHg4ODM1LCAweDg4MzcsIDB4ODgzOCwgMHg4ODNBLCAweDg4M0QsIDB4ODgzRSwgMHg4ODNGLAorICAgIDB4ODg0MSwgMHg4ODQyLCAweDg4NDMsIDB4ODg0NywgMHg4ODQ4LCAweDg4NDksIDB4ODg0QiwgMHg4ODRFLCAweDg4NEYsCisgICAgMHg4ODUwLCAweDg4NTEsIDB4ODg1MiwgMHg4ODU1LCAweDg4NTYsIDB4ODg1OCwgMHg4ODVBLCAweDg4NUMsIDB4ODg1RSwKKyAgICAweDg4NUYsIDB4ODg2MCwgMHg4ODY2LCAweDg4NjcsIDB4ODg2QSwgMHg4ODZELCAweDg4NkYsIDB4ODg3MSwgMHg4ODczLAorICAgIDB4ODg3NCwgMHg4ODc1LCAweDg4NzYsIDB4ODg3OCwgMHg4ODdBLCAweDg4N0IsIDB4ODg3QywgMHg4ODgwLCAweDg4ODMsCisgICAgMHg4ODg2LCAweDg4ODcsIDB4ODg4OSwgMHg4ODhBLCAweDg4OEMsIDB4ODg4RSwgMHg4ODhGLCAweDg4OTAsIDB4ODg5MSwKKyAgICAweDg4OTMsIDB4ODg5NCwgMHg4ODk1LCAweDg4OTcsIDB4ODg5OCwgMHg4ODk5LCAweDg4OUEsIDB4ODg5QiwgMHg4ODlELAorICAgIDB4ODg5RSwgMHg4ODlGLCAweDg4QTAsIDB4ODhBMSwgMHg4OEEzLCAweDg4QTUsIDB4ODhBNiwgMHg4OEE3LCAweDg4QTgsCisgICAgMHg4OEE5LCAweDg4QUEsIDB4ODhBQywgMHg4OEFFLCAweDg4QUYsIDB4ODhCMCwgMHg4OEIyLCAweDg4QjMsIDB4ODhCNCwKKyAgICAweDg4QjUsIDB4ODhCNiwgMHg4OEI4LCAweDg4QjksIDB4ODhCQSwgMHg4OEJCLCAweDg4QkQsIDB4ODhCRSwgMHg4OEJGLAorICAgIDB4ODhDMCwgMHg4OEMzLCAweDg4QzQsIDB4ODhDNywgMHg4OEM4LCAweDg4Q0IsIDB4ODhDQywgMHg4OENELCAweDg4RDAsCisgICAgMHg4OEQxLCAweDg4RDMsIDB4ODhENiwgMHg4OEQ3LCAweDg4REEsIDB4ODhEQiwgMHg4OERFLCAweDg4RTAsIDB4ODhFMSwKKyAgICAweDg4RTYsIDB4ODhFNywgMHg4OEU5LCAweDg4RUEsIDB4ODhFQiwgMHg4OEVDLCAweDg4RUQsIDB4ODhFRSwgMHg4OEVGLAorICAgIDB4ODhGMiwgMHg4OEY1LCAweDg4RjYsIDB4ODhGNywgMHg4OEZBLCAweDg4RkIsIDB4ODhGRiwgMHg4OTAwLCAweDg5MDEsCisgICAgMHg4OTAzLCAweDg5MDQsIDB4ODkwNSwgMHg4OTA2LCAweDg5MDgsIDB4ODkwOSwgMHg4OTBCLCAweDg5MEMsIDB4ODkwRCwKKyAgICAweDg5MEUsIDB4ODkwRiwgMHg4OTExLCAweDg5MTQsIDB4ODkxNSwgMHg4OTE2LCAweDg5MTcsIDB4ODkxOCwgMHg4OTFDLAorICAgIDB4ODkxRCwgMHg4OTFFLCAweDg5MUYsIDB4ODkyMCwgMHg4OTIyLCAweDg5MjMsIDB4ODkyNCwgMHg4OTI2LCAweDg5MjcsCisgICAgMHg4OTI4LCAweDg5MjksIDB4ODkyQywgMHg4OTJELCAweDg5MkUsIDB4ODkyRiwgMHg4OTMxLCAweDg5MzUsIDB4ODkzNywKKyAgICAweDg5MzksIDB4ODkzQSwgMHg4OTNDLCAweDg5M0QsIDB4ODkzRSwgMHg4OTNGLCAweDg5NDAsIDB4ODk0MiwgMHg4OTQzLAorICAgIDB4ODk0NSwgMHg4OTQ2LCAweDg5NDgsIDB4ODk0OSwgMHg4OTRBLCAweDg5NEIsIDB4ODk0QywgMHg4OTRELCAweDg5NEUsCisgICAgMHg4OTRGLCAweDg5NTAsIDB4ODk1MSwgMHg4OTUyLCAweDg5NTMsIDB4ODk1NCwgMHg4OTU1LCAweDg5NTcsIDB4ODk1OCwKKyAgICAweDg5NTksIDB4ODk1QSwgMHg4OTVCLCAweDg5NUMsIDB4ODk2MSwgMHg4OTYyLCAweDg5NjMsIDB4ODk2NSwgMHg4OTY3LAorICAgIDB4ODk2OCwgMHg4OTY5LCAweDg5NkIsIDB4ODk2RCwgMHg4OTZFLCAweDg5NzAsIDB4ODk3MSwgMHg4OTczLCAweDg5NzQsCisgICAgMHg4OTc1LCAweDg5NzYsIDB4ODk3NywgMHg4OTc4LCAweDg5NzksIDB4ODk3QSwgMHg4OTdDLCAweDg5N0QsIDB4ODk3RSwKKyAgICAweDg5ODAsIDB4ODk4MiwgMHg4OTg0LCAweDg5ODUsIDB4ODk4NywgMHg4OTg4LCAweDg5ODksIDB4ODk4QSwgMHg4OThDLAorICAgIDB4ODk4RCwgMHg4OThFLCAweDg5OTAsIDB4ODk5MSwgMHg4OTkyLCAweDg5OTQsIDB4ODk5NSwgMHg4OTk3LCAweDg5OTksCisgICAgMHg4OTlBLCAweDg5OUIsIDB4ODk5QywgMHg4OTlELCAweDg5OUUsIDB4ODk5RiwgMHg4OUEwLCAweDg5QTIsIDB4ODlBMywKKyAgICAweDg5QTQsIDB4ODlBNSwgMHg4OUE3LCAweDg5QTgsIDB4ODlBOSwgMHg4OUFCLCAweDg5QUQsIDB4ODlBRSwgMHg4OUIwLAorICAgIDB4ODlCMSwgMHg4OUIzLCAweDg5QjQsIDB4ODlCNSwgMHg4OUI2LCAweDg5QjgsIDB4ODlCOSwgMHg4OUJCLCAweDg5QkMsCisgICAgMHg4OUJFLCAweDg5QzMsIDB4ODlDRCwgMHg4OUQzLCAweDg5RDQsIDB4ODlENSwgMHg4OUQ3LCAweDg5RDgsIDB4ODlEOSwKKyAgICAweDg5REIsIDB4ODlERCwgMHg4OURGLCAweDg5RTAsIDB4ODlFMSwgMHg4OUUyLCAweDg5RTQsIDB4ODlFNywgMHg4OUU4LAorICAgIDB4ODlFOSwgMHg4OUVBLCAweDg5RUMsIDB4ODlFRCwgMHg4OUVFLCAweDg5RjAsIDB4ODlGMSwgMHg4OUYyLCAweDg5RjUsCisgICAgMHg4OUY3LCAweDg5RjksIDB4ODlGQSwgMHg4OUZCLCAweDg5RkMsIDB4ODlGRCwgMHg4OUZFLCAweDg5RkYsIDB4OEEwNCwKKyAgICAweDhBMDUsIDB4OEEwNiwgMHg4QTA5LCAweDhBMEIsIDB4OEEwRCwgMHg4QTBGLCAweDhBMTEsIDB4OEExMiwgMHg4QTE0LAorICAgIDB4OEExNywgMHg4QTE5LCAweDhBMUEsIDB4OEExQywgMHg4QTFFLCAweDhBMjAsIDB4OEEyMSwgMHg4QTIyLCAweDhBMjQsCisgICAgMHg4QTI2LCAweDhBMjcsIDB4OEEyOCwgMHg4QTI5LCAweDhBMkIsIDB4OEEyQywgMHg4QTJFLCAweDhBMkYsIDB4OEEzMCwKKyAgICAweDhBMzIsIDB4OEEzMywgMHg4QTM1LCAweDhBMzcsIDB4OEEzOCwgMHg4QTM5LCAweDhBM0IsIDB4OEEzQywgMHg4QTNELAorICAgIDB4OEEzRiwgMHg4QTQwLCAweDhBNDIsIDB4OEE0MywgMHg4QTQ0LCAweDhBNDUsIDB4OEE0NywgMHg4QTQ5LCAweDhBNEEsCisgICAgMHg4QTRCLCAweDhBNEMsIDB4OEE0RCwgMHg4QTRGLCAweDhBNTEsIDB4OEE1MywgMHg4QTU2LCAweDhBNTcsIDB4OEE1OSwKKyAgICAweDhBNUEsIDB4OEE1QywgMHg4QTVELCAweDhBNUYsIDB4OEE2MCwgMHg4QTY0LCAweDhBNjUsIDB4OEE2NywgMHg4QTY4LAorICAgIDB4OEE2QSwgMHg4QTZGLCAweDhBNzQsIDB4OEE3NiwgMHg4QTc3LCAweDhBNzgsIDB4OEE3QSwgMHg4QTdCLCAweDhBN0QsCisgICAgMHg4QTdFLCAweDhBODAsIDB4OEE4MSwgMHg4QTgyLCAweDhBODMsIDB4OEE4OCwgMHg4QThCLCAweDhBOEMsIDB4OEE4RSwKKyAgICAweDhBOEYsIDB4OEE5MCwgMHg4QTk0LCAweDhBOTYsIDB4OEE5NywgMHg4QTk5LCAweDhBOUIsIDB4OEE5QywgMHg4QTlELAorICAgIDB4OEE5RiwgMHg4QUEyLCAweDhBQTcsIDB4OEFBOSwgMHg4QUFBLCAweDhBQUIsIDB4OEFBRCwgMHg4QUFFLCAweDhBQUYsCisgICAgMHg4QUIxLCAweDhBQjMsIDB4OEFCNCwgMHg4QUI1LCAweDhBQjcsIDB4OEFCOCwgMHg4QUJBLCAweDhBQkIsIDB4OEFCRCwKKyAgICAweDhBQkUsIDB4OEFDMCwgMHg4QUMxLCAweDhBQzMsIDB4OEFDNSwgMHg4QUM2LCAweDhBQzgsIDB4OEFDQSwgMHg4QUNDLAorICAgIDB4OEFDRSwgMHg4QUQwLCAweDhBRDMsIDB4OEFENCwgMHg4QUQ1LCAweDhBRDgsIDB4OEFEOSwgMHg4QURBLCAweDhBREQsCisgICAgMHg4QURGLCAweDhBRTAsIDB4OEFFMSwgMHg4QUUzLCAweDhBRTUsIDB4OEFFOCwgMHg4QUU5LCAweDhBRUEsIDB4OEFFQywKKyAgICAweDhBRUYsIDB4OEFGMCwgMHg4QUYyLCAweDhBRjQsIDB4OEFGNSwgMHg4QUY5LCAweDhBRkIsIDB4OEFGRCwgMHg4QUZGLAorICAgIDB4OEIwMywgMHg4QjA2LCAweDhCMDgsIDB4OEIwOSwgMHg4QjBCLCAweDhCMEMsIDB4OEIwRCwgMHg4QjBGLCAweDhCMTEsCisgICAgMHg4QjEyLCAweDhCMTMsIDB4OEIxNSwgMHg4QjE4LCAweDhCMUMsIDB4OEIxRSwgMHg4QjFGLCAweDhCMjAsIDB4OEIyMiwKKyAgICAweDhCMjMsIDB4OEIyNCwgMHg4QjI1LCAweDhCMjcsIDB4OEIyOSwgMHg4QjJBLCAweDhCMkUsIDB4OEIyRiwgMHg4QjMwLAorICAgIDB4OEIzMSwgMHg4QjMyLCAweDhCMzQsIDB4OEIzNSwgMHg4QjM2LCAweDhCMzcsIDB4OEIzOCwgMHg4QjNBLCAweDhCM0IsCisgICAgMHg4QjNDLCAweDhCM0QsIDB4OEIzRiwgMHg4QjQwLCAweDhCNDEsIDB4OEI0MiwgMHg4QjQzLCAweDhCNDQsIDB4OEI0NSwKKyAgICAweDhCNDYsIDB4OEI0NywgMHg4QjQ4LCAweDhCNEEsIDB4OEI0QiwgMHg4QjRDLCAweDhCNEQsIDB4OEI1MCwgMHg4QjUxLAorICAgIDB4OEI1MiwgMHg4QjUzLCAweDhCNTQsIDB4OEI1NSwgMHg4QjU3LCAweDhCNUIsIDB4OEI1RCwgMHg4QjVFLCAweDhCNUYsCisgICAgMHg4QjYwLCAweDhCNjEsIDB4OEI2MiwgMHg4QjYzLCAweDhCNjQsIDB4OEI2NSwgMHg4QjY3LCAweDhCNjgsIDB4OEI2OSwKKyAgICAweDhCNkEsIDB4OEI2RCwgMHg4QjZFLCAweDhCNzEsIDB4OEI3MiwgMHg4QjczLCAweDhCNzUsIDB4OEI3NiwgMHg4Qjc4LAorICAgIDB4OEI3OSwgMHg4QjdBLCAweDhCN0IsIDB4OEI3QywgMHg4QjdFLCAweDhCN0YsIDB4OEI4MSwgMHg4QjgyLCAweDhCODMsCisgICAgMHg4Qjg0LCAweDhCODUsIDB4OEI4NiwgMHg4Qjg3LCAweDhCODgsIDB4OEI4OSwgMHg4QjhCLCAweDhCOEMsIDB4OEI4RCwKKyAgICAweDhCOEYsIDB4OEI5MCwgMHg4QjkxLCAweDhCOTQsIDB4OEI5NywgMHg4Qjk4LCAweDhCOTksIDB4OEI5QSwgMHg4QjlCLAorICAgIDB4OEI5RCwgMHg4QjlGLCAweDhCQUMsIDB4OEJCMSwgMHg4QkJCLCAweDhCQzcsIDB4OEJEMCwgMHg4QkVBLCAweDhDMDksCisgICAgMHg4QzFFLCAweDhDMzgsIDB4OEMzOSwgMHg4QzNBLCAweDhDM0IsIDB4OEMzQywgMHg4QzNELCAweDhDM0UsIDB4OEMzRiwKKyAgICAweDhDNDAsIDB4OEM0MiwgMHg4QzQzLCAweDhDNDQsIDB4OEM0NSwgMHg4QzRBLCAweDhDNEIsIDB4OEM0RCwgMHg4QzRFLAorICAgIDB4OEM0RiwgMHg4QzUxLCAweDhDNTIsIDB4OEM1MywgMHg4QzU0LCAweDhDNTYsIDB4OEM1NywgMHg4QzU4LCAweDhDNTksCisgICAgMHg4QzVCLCAweDhDNUMsIDB4OEM1RCwgMHg4QzVFLCAweDhDNUYsIDB4OEM2MCwgMHg4QzYzLCAweDhDNjQsIDB4OEM2NSwKKyAgICAweDhDNjYsIDB4OEM2NywgMHg4QzY4LCAweDhDNjksIDB4OEM2QywgMHg4QzZELCAweDhDNkUsIDB4OEM2RiwgMHg4QzcwLAorICAgIDB4OEM3MSwgMHg4QzcyLCAweDhDNzQsIDB4OEM3NSwgMHg4Qzc2LCAweDhDNzcsIDB4OEM3QiwgMHg4QzdDLCAweDhDN0QsCisgICAgMHg4QzdFLCAweDhDN0YsIDB4OEM4MCwgMHg4QzgxLCAweDhDODMsIDB4OEM4NCwgMHg4Qzg2LCAweDhDODcsIDB4OEM4OCwKKyAgICAweDhDOEIsIDB4OEM4RCwgMHg4QzhFLCAweDhDOEYsIDB4OEM5MCwgMHg4QzkxLCAweDhDOTIsIDB4OEM5MywgMHg4Qzk1LAorICAgIDB4OEM5NiwgMHg4Qzk3LCAweDhDOTksIDB4OEM5QSwgMHg4QzlCLCAweDhDOUMsIDB4OEM5RiwgMHg4Q0EzLCAweDhDQTQsCisgICAgMHg4Q0E1LCAweDhDQTYsIDB4OENBRCwgMHg4Q0FFLCAweDhDQjEsIDB4OENCNSwgMHg4Q0I5LCAweDhDQkUsIDB4OENDNiwKKyAgICAweDhDQzksIDB4OENDQiwgMHg4Q0NDLCAweDhDQ0QsIDB4OENDRSwgMHg4Q0NGLCAweDhDRDAsIDB4OENENCwgMHg4Q0Q2LAorICAgIDB4OENENywgMHg4Q0Q4LCAweDhDRDksIDB4OENEQiwgMHg4Q0RELCAweDhDREYsIDB4OENFNSwgMHg4Q0U4LCAweDhDRTksCisgICAgMHg4Q0VFLCAweDhDRUYsIDB4OENGMCwgMHg4Q0YxLCAweDhDRjIsIDB4OENGMywgMHg4Q0Y1LCAweDhDRjYsIDB4OENGNywKKyAgICAweDhDRjgsIDB4OENGOSwgMHg4Q0ZGLCAweDhEMDAsIDB4OEQwMSwgMHg4RDAyLCAweDhEMDMsIDB4OEQwNiwgMHg4RDA3LAorICAgIDB4OEQwOSwgMHg4RDBDLCAweDhEMEUsIDB4OEQxMSwgMHg4RDEyLCAweDhEMTMsIDB4OEQxNCwgMHg4RDE1LCAweDhEMTcsCisgICAgMHg4RDE4LCAweDhEMTksIDB4OEQxQSwgMHg4RDIwLCAweDhENTEsIDB4OEQ1MiwgMHg4RDU3LCAweDhENUYsIDB4OEQ2NSwKKyAgICAweDhENjgsIDB4OEQ2OSwgMHg4RDZBLCAweDhENkMsIDB4OEQ2RSwgMHg4RDZGLCAweDhENzEsIDB4OEQ3MiwgMHg4RDc4LAorICAgIDB4OEQ3OSwgMHg4RDdBLCAweDhEN0IsIDB4OEQ3QywgMHg4RDdELCAweDhEN0UsIDB4OEQ3RiwgMHg4RDgwLCAweDhEODIsCisgICAgMHg4RDgzLCAweDhEODYsIDB4OEQ4NywgMHg4RDg4LCAweDhEODksIDB4OEQ4QywgMHg4RDhELCAweDhEOEUsIDB4OEQ4RiwKKyAgICAweDhEOTAsIDB4OEQ5MiwgMHg4RDkzLCAweDhEOTYsIDB4OEQ5NywgMHg4RDk4LCAweDhEOUEsIDB4OEQ5QiwgMHg4RDlDLAorICAgIDB4OEQ5RCwgMHg4RDlFLCAweDhEQTAsIDB4OERBMSwgMHg4REEyLCAweDhEQTQsIDB4OERBNSwgMHg4REE2LCAweDhEQTcsCisgICAgMHg4REE5LCAweDhEQUEsIDB4OERBQiwgMHg4REFDLCAweDhEQUQsIDB4OERBRSwgMHg4REFGLCAweDhEQjAsIDB4OERCNiwKKyAgICAweDhEQjcsIDB4OERCOSwgMHg4REJCLCAweDhEQkQsIDB4OERDMCwgMHg4REMxLCAweDhEQzIsIDB4OERDNSwgMHg4REM3LAorICAgIDB4OERDOCwgMHg4REM5LCAweDhEQ0EsIDB4OERDRCwgMHg4REQwLCAweDhERDIsIDB4OEREMywgMHg4REQ0LCAweDhERDUsCisgICAgMHg4REQ4LCAweDhERDksIDB4OEREQywgMHg4REUwLCAweDhERTEsIDB4OERFMiwgMHg4REU1LCAweDhERTYsIDB4OERFNywKKyAgICAweDhERTksIDB4OERFRCwgMHg4REVFLCAweDhERjAsIDB4OERGMSwgMHg4REYyLCAweDhERjQsIDB4OERGNiwgMHg4REZDLAorICAgIDB4OERGRSwgMHg4REZGLCAweDhFMDAsIDB4OEUwMSwgMHg4RTAyLCAweDhFMDMsIDB4OEUwNCwgMHg4RTA2LCAweDhFMDcsCisgICAgMHg4RTA4LCAweDhFMEIsIDB4OEUwRCwgMHg4RTBFLCAweDhFMTEsIDB4OEUxMiwgMHg4RTEzLCAweDhFMTUsIDB4OEUxNiwKKyAgICAweDhFMTcsIDB4OEUxOCwgMHg4RTE5LCAweDhFMUEsIDB4OEUxQiwgMHg4RTFDLCAweDhFMjAsIDB4OEUyMSwgMHg4RTI0LAorICAgIDB4OEUyNSwgMHg4RTI2LCAweDhFMjcsIDB4OEUyOCwgMHg4RTJCLCAweDhFMkQsIDB4OEUzMCwgMHg4RTMyLCAweDhFMzMsCisgICAgMHg4RTM2LCAweDhFMzcsIDB4OEUzOCwgMHg4RTNCLCAweDhFM0MsIDB4OEUzRSwgMHg4RTNGLCAweDhFNDMsIDB4OEU0NSwKKyAgICAweDhFNDYsIDB4OEU0RCwgMHg4RTRFLCAweDhFNEYsIDB4OEU1MCwgMHg4RTUzLCAweDhFNTQsIDB4OEU1NiwgMHg4RTU3LAorICAgIDB4OEU1OCwgMHg4RTVBLCAweDhFNUIsIDB4OEU1QywgMHg4RTVELCAweDhFNUUsIDB4OEU1RiwgMHg4RTYwLCAweDhFNjEsCisgICAgMHg4RTYyLCAweDhFNjQsIDB4OEU2NSwgMHg4RTY3LCAweDhFNjgsIDB4OEU2QSwgMHg4RTZCLCAweDhFNkUsIDB4OEU3MSwKKyAgICAweDhFNzMsIDB4OEU3NSwgMHg4RTc3LCAweDhFNzgsIDB4OEU3OSwgMHg4RTdCLCAweDhFN0QsIDB4OEU3RSwgMHg4RTgwLAorICAgIDB4OEU4MiwgMHg4RTgzLCAweDhFODQsIDB4OEU4NiwgMHg4RTg4LCAweDhFOEMsIDB4OEU4RSwgMHg4RTk1LCAweDhFOTYsCisgICAgMHg4RTk3LCAweDhFOTgsIDB4OEU5OSwgMHg4RTlCLCAweDhFOUQsIDB4OEU5RiwgMHg4RUEwLCAweDhFQTIsIDB4OEVBMywKKyAgICAweDhFQTQsIDB4OEVBNywgMHg4RUE4LCAweDhFQTksIDB4OEVBRCwgMHg4RUFFLCAweDhFQjAsIDB4OEVCMSwgMHg4RUIzLAorICAgIDB4OEVCNCwgMHg4RUI1LCAweDhFQjYsIDB4OEVCNywgMHg4RUI4LCAweDhFQjksIDB4OEVCQiwgMHg4RUJDLCAweDhFQkQsCisgICAgMHg4RUJFLCAweDhFQkYsIDB4OEVDMSwgMHg4RUMyLCAweDhFQzMsIDB4OEVDNCwgMHg4RUM1LCAweDhFQzYsIDB4OEVDNywKKyAgICAweDhFQzgsIDB4OEVDOSwgMHg4RUNGLCAweDhFRDAsIDB4OEVEMSwgMHg4RUQzLCAweDhFRDUsIDB4OEVENiwgMHg4RUQ3LAorICAgIDB4OEVEOCwgMHg4RUQ5LCAweDhFREEsIDB4OEVEQywgMHg4RURELCAweDhFREUsIDB4OEVFMCwgMHg4RUUxLCAweDhFRTIsCisgICAgMHg4RUUzLCAweDhFRTUsIDB4OEVFNiwgMHg4RUU3LCAweDhFRTgsIDB4OEVFOSwgMHg4RUVBLCAweDhFRUMsIDB4OEVFRCwKKyAgICAweDhFRUUsIDB4OEVFRiwgMHg4RUYwLCAweDhFRjEsIDB4OEVGMywgMHg4RUY0LCAweDhFRjUsIDB4OEVGNiwgMHg4RUY3LAorICAgIDB4OEVGRCwgMHg4RUZGLCAweDhGMDAsIDB4OEYwMSwgMHg4RjAyLCAweDhGMDQsIDB4OEYwNiwgMHg4RjA4LCAweDhGMEIsCisgICAgMHg4RjBDLCAweDhGMEQsIDB4OEYwRSwgMHg4RjBGLCAweDhGMTAsIDB4OEYxMSwgMHg4RjEzLCAweDhGMTYsIDB4OEYxNywKKyAgICAweDhGMTgsIDB4OEYxOSwgMHg4RjFBLCAweDhGMjAsIDB4OEYyMSwgMHg4RjIyLCAweDhGMjMsIDB4OEYyNCwgMHg4RjI3LAorICAgIDB4OEYyOCwgMHg4RjJCLCAweDhGMkMsIDB4OEYyRCwgMHg4RjJFLCAweDhGMzAsIDB4OEYzMSwgMHg4RjMyLCAweDhGMzQsCisgICAgMHg4RjM1LCAweDhGMzYsIDB4OEYzNywgMHg4RjM5LCAweDhGM0EsIDB4OEYzQywgMHg4RjNELCAweDhGNDAsIDB4OEY0MSwKKyAgICAweDhGNDMsIDB4OEY0NywgMHg4RjQ4LCAweDhGNEEsIDB4OEY0QiwgMHg4RjRDLCAweDhGNEYsIDB4OEY1MCwgMHg4RjUxLAorICAgIDB4OEY1MiwgMHg4RjUzLCAweDhGNTUsIDB4OEY1NiwgMHg4RjU3LCAweDhGNTgsIDB4OEY1OSwgMHg4RjVBLCAweDhGNUIsCisgICAgMHg4RjVDLCAweDhGNUQsIDB4OEY1RSwgMHg4RjYwLCAweDhGNjMsIDB4OEY2NSwgMHg4RjZBLCAweDhGODAsIDB4OEY4QywKKyAgICAweDhGOTIsIDB4OEY5RCwgMHg4RkEwLCAweDhGQTEsIDB4OEZBMiwgMHg4RkE0LCAweDhGQTUsIDB4OEZBNywgMHg4RkFBLAorICAgIDB4OEZBQywgMHg4RkIzLCAweDhGQjQsIDB4OEZCNSwgMHg4RkI3LCAweDhGQjgsIDB4OEZCQSwgMHg4RkJCLCAweDhGQkMsCisgICAgMHg4RkJGLCAweDhGQzAsIDB4OEZDMywgMHg4RkM2LCAweDhGQzksIDB4OEZDQSwgMHg4RkNCLCAweDhGQ0MsIDB4OEZDRCwKKyAgICAweDhGQ0YsIDB4OEZEMiwgMHg4RkQ2LCAweDhGRDcsIDB4OEZEQSwgMHg4RkUwLCAweDhGRTEsIDB4OEZFMywgMHg4RkU3LAorICAgIDB4OEZFQywgMHg4RkVGLCAweDhGRjEsIDB4OEZGMiwgMHg4RkY1LCAweDhGRjYsIDB4OEZGQSwgMHg4RkZCLCAweDhGRkMsCisgICAgMHg4RkZFLCAweDhGRkYsIDB4OTAwNywgMHg5MDA4LCAweDkwMEMsIDB4OTAwRSwgMHg5MDEzLCAweDkwMTgsIDB4OTAxQywKKyAgICAweDkwMjQsIDB4OTAyNSwgMHg5MDI3LCAweDkwMjgsIDB4OTAyOSwgMHg5MDJBLCAweDkwMkIsIDB4OTAyQywgMHg5MDMwLAorICAgIDB4OTAzMSwgMHg5MDMzLCAweDkwMzQsIDB4OTAzNywgMHg5MDM5LCAweDkwM0EsIDB4OTAzRCwgMHg5MDNGLCAweDkwNDAsCisgICAgMHg5MDQzLCAweDkwNDUsIDB4OTA0NiwgMHg5MDQ4LCAweDkwNDksIDB4OTA0QSwgMHg5MDRDLCAweDkwNTYsIDB4OTA1OSwKKyAgICAweDkwNUEsIDB4OTA1RCwgMHg5MDVGLCAweDkwNjEsIDB4OTA2NCwgMHg5MDY2LCAweDkwNjcsIDB4OTA2QSwgMHg5MDZCLAorICAgIDB4OTA2QywgMHg5MDZGLCAweDkwNzAsIDB4OTA3MSwgMHg5MDczLCAweDkwNzYsIDB4OTA3OSwgMHg5MDdCLCAweDkwN0UsCisgICAgMHg5MDg1LCAweDkwODYsIDB4OTA4OSwgMHg5MDhDLCAweDkwOEQsIDB4OTA4RSwgMHg5MDkyLCAweDkwOTQsIDB4OTA5NiwKKyAgICAweDkwOTgsIDB4OTA5QSwgMHg5MDlDLCAweDkwOUUsIDB4OTA5RiwgMHg5MEEwLCAweDkwQTQsIDB4OTBBNSwgMHg5MEE3LAorICAgIDB4OTBBOCwgMHg5MEE5LCAweDkwQUIsIDB4OTBBRCwgMHg5MEIyLCAweDkwQjcsIDB4OTBCQywgMHg5MEJELCAweDkwQkYsCisgICAgMHg5MEMwLCAweDkwQzIsIDB4OTBDMywgMHg5MEM2LCAweDkwQzgsIDB4OTBDOSwgMHg5MENCLCAweDkwQ0MsIDB4OTBDRCwKKyAgICAweDkwRDIsIDB4OTBENCwgMHg5MEQ1LCAweDkwRDYsIDB4OTBEOCwgMHg5MEQ5LCAweDkwREEsIDB4OTBERSwgMHg5MEUwLAorICAgIDB4OTBFMywgMHg5MEU0LCAweDkwRTUsIDB4OTBFOSwgMHg5MEVBLCAweDkwRUMsIDB4OTBFRSwgMHg5MEYwLCAweDkwRjEsCisgICAgMHg5MEYyLCAweDkwRjMsIDB4OTBGNiwgMHg5MEY3LCAweDkwRjksIDB4OTBGQSwgMHg5MEZCLCAweDkwRkMsIDB4OTBGRiwKKyAgICAweDkxMDAsIDB4OTEwMSwgMHg5MTAzLCAweDkxMDUsIDB4OTEwNywgMHg5MTA4LCAweDkxMEEsIDB4OTEwQiwgMHg5MTBDLAorICAgIDB4OTEwRCwgMHg5MTBFLCAweDkxMEYsIDB4OTExMCwgMHg5MTExLCAweDkxMTMsIDB4OTExNSwgMHg5MTE3LCAweDkxMTgsCisgICAgMHg5MTFBLCAweDkxMUIsIDB4OTExQywgMHg5MTFELCAweDkxMUYsIDB4OTEyMCwgMHg5MTIxLCAweDkxMjQsIDB4OTEyNSwKKyAgICAweDkxMjYsIDB4OTEyOCwgMHg5MTI5LCAweDkxMkEsIDB4OTEyQiwgMHg5MTJDLCAweDkxMkUsIDB4OTEzMywgMHg5MTM1LAorICAgIDB4OTEzNywgMHg5MTM4LCAweDkxM0IsIDB4OTEzQywgMHg5MTNELCAweDkxM0UsIDB4OTEzRiwgMHg5MTQwLCAweDkxNDEsCisgICAgMHg5MTQyLCAweDkxNDQsIDB4OTE0NSwgMHg5MTQ3LCAweDkxNTEsIDB4OTE1MywgMHg5MTU0LCAweDkxNTUsIDB4OTE1NiwKKyAgICAweDkxNTgsIDB4OTE1OSwgMHg5MTVCLCAweDkxNUMsIDB4OTE1RiwgMHg5MTYwLCAweDkxNjYsIDB4OTE2NywgMHg5MTY4LAorICAgIDB4OTE2QiwgMHg5MTZELCAweDkxNzMsIDB4OTE3QSwgMHg5MTdCLCAweDkxN0MsIDB4OTE4MCwgMHg5MTgxLCAweDkxODIsCisgICAgMHg5MTgzLCAweDkxODQsIDB4OTE4NiwgMHg5MTg4LCAweDkxOEEsIDB4OTE4RSwgMHg5MThGLCAweDkxOTMsIDB4OTE5NCwKKyAgICAweDkxOTUsIDB4OTE5NywgMHg5MTk4LCAweDkxOTksIDB4OTE5RCwgMHg5MTlFLCAweDkxOUYsIDB4OTFBMCwgMHg5MUExLAorICAgIDB4OTFBNCwgMHg5MUE1LCAweDkxQTYsIDB4OTFBNywgMHg5MUE4LCAweDkxQTksIDB4OTFCMCwgMHg5MUIxLCAweDkxQjIsCisgICAgMHg5MUIzLCAweDkxQjYsIDB4OTFCNywgMHg5MUI4LCAweDkxQjksIDB4OTFCQiwgMHg5MUJDLCAweDkxQkQsIDB4OTFCRSwKKyAgICAweDkxQkYsIDB4OTFDMiwgMHg5MUM0LCAweDkxQzYsIDB4OTFDOCwgMHg5MUQwLCAweDkxRDYsIDB4OTFEQSwgMHg5MURCLAorICAgIDB4OTFERSwgMHg5MURGLCAweDkxRTAsIDB4OTFFMSwgMHg5MUUyLCAweDkxRTUsIDB4OTFFNiwgMHg5MUU4LCAweDkxRUEsCisgICAgMHg5MUVCLCAweDkxRUMsIDB4OTFFRCwgMHg5MUVFLCAweDkxRUYsIDB4OTFGMCwgMHg5MUYxLCAweDkxRjIsIDB4OTFGMywKKyAgICAweDkxRjQsIDB4OTFGNiwgMHg5MUY4LCAweDkxRkIsIDB4OTFGQywgMHg5MUZELCAweDkxRkUsIDB4OTFGRiwgMHg5MjAyLAorICAgIDB4OTIwMywgMHg5MjA1LCAweDkyMDYsIDB4OTIwNywgMHg5MjBBLCAweDkyMEIsIDB4OTIwQywgMHg5MjBGLCAweDkyMTIsCisgICAgMHg5MjEzLCAweDkyMTYsIDB4OTIxNywgMHg5MjE4LCAweDkyMTksIDB4OTIxQSwgMHg5MjFCLCAweDkyMUMsIDB4OTIxRCwKKyAgICAweDkyMUYsIDB4OTIyMCwgMHg5MjIxLCAweDkyMjIsIDB4OTIyNCwgMHg5MjI4LCAweDkyMjksIDB4OTIyQSwgMHg5MjJCLAorICAgIDB4OTIyQywgMHg5MjJELCAweDkyMkYsIDB4OTIzMSwgMHg5MjMyLCAweDkyMzUsIDB4OTIzNiwgMHg5MjNCLCAweDkyM0MsCisgICAgMHg5MjQxLCAweDkyNDIsIDB4OTI0MywgMHg5MjQ0LCAweDkyNDYsIDB4OTI0NywgMHg5MjRBLCAweDkyNEIsIDB4OTI0QywKKyAgICAweDkyNEUsIDB4OTI0RiwgMHg5MjUwLCAweDkyNTIsIDB4OTI1MywgMHg5MjU0LCAweDkyNTYsIDB4OTI1OCwgMHg5MjU5LAorICAgIDB4OTI1QywgMHg5MjVELCAweDkyNUYsIDB4OTI2MCwgMHg5MjYxLCAweDkyNjMsIDB4OTI2NCwgMHg5MjY1LCAweDkyNjcsCisgICAgMHg5MjY4LCAweDkyNjksIDB4OTI2QSwgMHg5MjZCLCAweDkyNkUsIDB4OTI2RiwgMHg5MjcwLCAweDkyNzEsIDB4OTI3MiwKKyAgICAweDkyNzMsIDB4OTI3NSwgMHg5Mjc2LCAweDkyNzcsIDB4OTI3OSwgMHg5MjdDLCAweDkyN0QsIDB4OTI3RSwgMHg5MjgxLAorICAgIDB4OTI4MiwgMHg5Mjg0LCAweDkyODYsIDB4OTI4NywgMHg5Mjg4LCAweDkyODksIDB4OTI4QSwgMHg5MjhCLCAweDkyOEMsCisgICAgMHg5MjhELCAweDkyOEYsIDB4OTI5MCwgMHg5MjkyLCAweDkyOTQsIDB4OTI5NSwgMHg5Mjk3LCAweDkyOTksIDB4OTI5QiwKKyAgICAweDkyOUQsIDB4OTI5RSwgMHg5MjlGLCAweDkyQTEsIDB4OTJBMiwgMHg5MkE0LCAweDkyQTcsIDB4OTJBRCwgMHg5MkFGLAorICAgIDB4OTJCMCwgMHg5MkIyLCAweDkyQjMsIDB4OTJCNCwgMHg5MkI1LCAweDkyQjYsIDB4OTJCOCwgMHg5MkJBLCAweDkyQkQsCisgICAgMHg5MkJFLCAweDkyQkYsIDB4OTJDMCwgMHg5MkMyLCAweDkyQzQsIDB4OTJDNiwgMHg5MkM5LCAweDkyQ0EsIDB4OTJDQiwKKyAgICAweDkyQ0QsIDB4OTJDRSwgMHg5MkQwLCAweDkyRDEsIDB4OTJEMywgMHg5MkQ0LCAweDkyRDUsIDB4OTJENiwgMHg5MkQ3LAorICAgIDB4OTJEOCwgMHg5MkQ5LCAweDkyREEsIDB4OTJEQiwgMHg5MkRDLCAweDkyREUsIDB4OTJFMCwgMHg5MkUxLCAweDkyRTIsCisgICAgMHg5MkU3LCAweDkyRTksIDB4OTJFQiwgMHg5MkVDLCAweDkyRjIsIDB4OTJGMywgMHg5MkY0LCAweDkyRjUsIDB4OTJGNywKKyAgICAweDkyRjksIDB4OTJGQSwgMHg5MkZCLCAweDkyRkQsIDB4OTJGRSwgMHg5MkZGLCAweDkzMDAsIDB4OTMwMiwgMHg5MzAzLAorICAgIDB4OTMwNCwgMHg5MzA1LCAweDkzMDksIDB4OTMwQSwgMHg5MzBCLCAweDkzMEMsIDB4OTMwRCwgMHg5MzBFLCAweDkzMEYsCisgICAgMHg5MzExLCAweDkzMTMsIDB4OTMxNCwgMHg5MzE2LCAweDkzMTcsIDB4OTMxQywgMHg5MzFELCAweDkzMUUsIDB4OTMyMSwKKyAgICAweDkzMjMsIDB4OTMyNCwgMHg5MzI1LCAweDkzMjcsIDB4OTMyOSwgMHg5MzJBLCAweDkzMkMsIDB4OTMyRCwgMHg5MzMwLAorICAgIDB4OTMzMSwgMHg5MzM0LCAweDkzMzUsIDB4OTMzNywgMHg5MzM5LCAweDkzM0EsIDB4OTMzQiwgMHg5MzNDLCAweDkzM0QsCisgICAgMHg5MzNGLCAweDkzNDIsIDB4OTM0NCwgMHg5MzQ1LCAweDkzNDgsIDB4OTM0OSwgMHg5MzRBLCAweDkzNEMsIDB4OTM0RSwKKyAgICAweDkzNEYsIDB4OTM1MCwgMHg5MzUxLCAweDkzNTIsIDB4OTM1MywgMHg5MzU1LCAweDkzNTYsIDB4OTM1NywgMHg5MzU5LAorICAgIDB4OTM1QSwgMHg5MzVDLCAweDkzNUQsIDB4OTM1RSwgMHg5MzVGLCAweDkzNjAsIDB4OTM2MSwgMHg5MzYyLCAweDkzNjMsCisgICAgMHg5MzY2LCAweDkzNjcsIDB4OTM2OCwgMHg5MzZCLCAweDkzNkQsIDB4OTM2RSwgMHg5MzZGLCAweDkzNzEsIDB4OTM3MiwKKyAgICAweDkzNzMsIDB4OTM3NCwgMHg5Mzc3LCAweDkzNzgsIDB4OTM3OSwgMHg5MzdCLCAweDkzN0MsIDB4OTM3RCwgMHg5MzdGLAorICAgIDB4OTM4MCwgMHg5MzgxLCAweDkzODMsIDB4OTM4NSwgMHg5Mzg2LCAweDkzODgsIDB4OTM4OSwgMHg5MzhCLCAweDkzOEMsCisgICAgMHg5MzhELCAweDkzOEUsIDB4OTM5MCwgMHg5MzkxLCAweDkzOTIsIDB4OTM5MywgMHg5Mzk0LCAweDkzOTUsIDB4OTM5NywKKyAgICAweDkzOTksIDB4OTM5QSwgMHg5MzlCLCAweDkzOUMsIDB4OTM5RCwgMHg5MzlFLCAweDkzOUYsIDB4OTNBMCwgMHg5M0ExLAorICAgIDB4OTNBNCwgMHg5M0E1LCAweDkzQTgsIDB4OTNBQiwgMHg5M0FELCAweDkzQUYsIDB4OTNCMSwgMHg5M0IyLCAweDkzQjQsCisgICAgMHg5M0I2LCAweDkzQjcsIDB4OTNCOSwgMHg5M0JBLCAweDkzQkIsIDB4OTNCQywgMHg5M0JELCAweDkzQkUsIDB4OTNDMCwKKyAgICAweDkzQzEsIDB4OTNDMiwgMHg5M0M0LCAweDkzQzUsIDB4OTNDNiwgMHg5M0M5LCAweDkzQ0IsIDB4OTNDRSwgMHg5M0NGLAorICAgIDB4OTNEMCwgMHg5M0QyLCAweDkzRDMsIDB4OTNENCwgMHg5M0Q1LCAweDkzRDksIDB4OTNEQSwgMHg5M0RCLCAweDkzRTAsCisgICAgMHg5M0UzLCAweDkzRTUsIDB4OTNFNiwgMHg5M0U3LCAweDkzRTksIDB4OTNFQSwgMHg5M0VCLCAweDkzRUMsIDB4OTNFRCwKKyAgICAweDkzRUUsIDB4OTNFRiwgMHg5M0YwLCAweDkzRjEsIDB4OTNGMiwgMHg5M0YzLCAweDkzRjQsIDB4OTNGNiwgMHg5M0Y4LAorICAgIDB4OTNGQSwgMHg5M0ZCLCAweDkzRkMsIDB4OTNGRCwgMHg5M0ZFLCAweDkzRkYsIDB4OTQwMCwgMHg5NDAxLCAweDk0MDIsCisgICAgMHg5NDA0LCAweDk0MDUsIDB4OTQwNiwgMHg5NDA3LCAweDk0MDgsIDB4OTQwOSwgMHg5NDBBLCAweDk0MEMsIDB4OTQwRCwKKyAgICAweDk0MEUsIDB4OTQwRiwgMHg5NDExLCAweDk0MTUsIDB4OTQxNiwgMHg5NDE3LCAweDk0MUEsIDB4OTQxQiwgMHg5NDFDLAorICAgIDB4OTQxRSwgMHg5NDFGLCAweDk0MjEsIDB4OTQyMiwgMHg5NDIzLCAweDk0MjQsIDB4OTQyNSwgMHg5NDI5LCAweDk0MkEsCisgICAgMHg5NDJCLCAweDk0MkMsIDB4OTQyRCwgMHg5NDJGLCAweDk0MzAsIDB4OTQzMSwgMHg5NDM0LCAweDk0MzYsIDB4OTQzNywKKyAgICAweDk0MzksIDB4OTQzQiwgMHg5NDNDLCAweDk0M0QsIDB4OTQ0MCwgMHg5NDQxLCAweDk0NDIsIDB4OTQ0MywgMHg5NDQ1LAorICAgIDB4OTQ0NiwgMHg5NDQ3LCAweDk0NDgsIDB4OTQ0OSwgMHg5NDRCLCAweDk0NEQsIDB4OTQ0RSwgMHg5NDRGLCAweDk0NTAsCisgICAgMHg5NDUxLCAweDk0NTMsIDB4OTQ1NSwgMHg5NDU2LCAweDk0NTcsIDB4OTQ1OCwgMHg5NDU5LCAweDk0NUEsIDB4OTQ1QiwKKyAgICAweDk0NUMsIDB4OTQ1RCwgMHg5NDVFLCAweDk0NUYsIDB4OTQ2MSwgMHg5NDYyLCAweDk0NjQsIDB4OTQ2NiwgMHg5NDY3LAorICAgIDB4OTQ2OCwgMHg5NDY5LCAweDk0NkEsIDB4OTQ2QywgMHg5NDZFLCAweDk0NkYsIDB4OTQ3MSwgMHg5NDczLCAweDk0NzQsCisgICAgMHg5NDc1LCAweDk0NzYsIDB4OTQ3OCwgMHg5NDdBLCAweDk0N0IsIDB4OTQ4MCwgMHg5NDgxLCAweDk0ODIsIDB4OTQ4MywKKyAgICAweDk0ODQsIDB4OTQ5MSwgMHg5NDk2LCAweDk0OTgsIDB4OTRDNywgMHg5NENGLCAweDk0RDMsIDB4OTRENCwgMHg5NERBLAorICAgIDB4OTRFNiwgMHg5NEZCLCAweDk1MUMsIDB4OTUyMCwgMHg5NTI3LCAweDk1MzMsIDB4OTUzRCwgMHg5NTQzLCAweDk1NDgsCisgICAgMHg5NTRCLCAweDk1NTUsIDB4OTU1QSwgMHg5NTYwLCAweDk1NkUsIDB4OTU3NCwgMHg5NTc1LCAweDk1NzgsIDB4OTU3OSwKKyAgICAweDk1N0EsIDB4OTU3QiwgMHg5NTdDLCAweDk1N0QsIDB4OTU3RSwgMHg5NTgxLCAweDk1ODQsIDB4OTU4NSwgMHg5NTg3LAorICAgIDB4OTU4OCwgMHg5NThBLCAweDk1OEQsIDB4OTU5MCwgMHg5NTkyLCAweDk1OTUsIDB4OTU5NiwgMHg5NTk3LCAweDk1OTksCisgICAgMHg5NTlBLCAweDk1OUIsIDB4OTU5QywgMHg5NTlELCAweDk1OUUsIDB4OTU5RiwgMHg5NUEwLCAweDk1QTIsIDB4OTVBNiwKKyAgICAweDk1QTcsIDB4OTVBQSwgMHg5NUFFLCAweDk1QUYsIDB4OTVCMCwgMHg5NUIxLCAweDk1QjMsIDB4OTVCNCwgMHg5NUI1LAorICAgIDB4OTVCNywgMHg5NUI4LCAweDk1QkEsIDB4OTVDMCwgMHg5NUMxLCAweDk1QzIsIDB4OTVDNCwgMHg5NUM1LCAweDk1QzcsCisgICAgMHg5NUM5LCAweDk1Q0QsIDB4OTVDRSwgMHg5NUNGLCAweDk1RDEsIDB4OTVEMiwgMHg5NUQzLCAweDk1RDcsIDB4OTVEOCwKKyAgICAweDk1RDksIDB4OTVEQSwgMHg5NURCLCAweDk1REQsIDB4OTVERiwgMHg5NUUwLCAweDk1RTMsIDB4OTVFNCwgMHg5NUU2LAorICAgIDB4OTVFNywgMHg5NUVDLCAweDk1RkYsIDB4OTYwNywgMHg5NjEzLCAweDk2MTgsIDB4OTYxQiwgMHg5NjFFLCAweDk2MjAsCisgICAgMHg5NjIzLCAweDk2MjQsIDB4OTYyNSwgMHg5NjI2LCAweDk2MjcsIDB4OTYyOCwgMHg5NjI5LCAweDk2MkIsIDB4OTYyQywKKyAgICAweDk2MkQsIDB4OTYyRiwgMHg5NjMwLCAweDk2MzcsIDB4OTYzOCwgMHg5NjM5LCAweDk2M0EsIDB4OTYzRSwgMHg5NjQxLAorICAgIDB4OTY0MywgMHg5NjRBLCAweDk2NEUsIDB4OTY0RiwgMHg5NjUxLCAweDk2NTIsIDB4OTY1MywgMHg5NjU2LCAweDk2NTcsCisgICAgMHg5NjU5LCAweDk2NUEsIDB4OTY1QywgMHg5NjVFLCAweDk2NjAsIDB4OTY2NSwgMHg5NjY2LCAweDk2NkIsIDB4OTY2RCwKKyAgICAweDk2NkUsIDB4OTY2RiwgMHg5NjcxLCAweDk2NzksIDB4OTY3QSwgMHg5NjdCLCAweDk2N0MsIDB4OTY3RSwgMHg5NjdGLAorICAgIDB4OTY4MCwgMHg5NjgxLCAweDk2ODIsIDB4OTY4MywgMHg5Njg0LCAweDk2ODcsIDB4OTY4OSwgMHg5NjhDLCAweDk2OTEsCisgICAgMHg5NjkyLCAweDk2OTMsIDB4OTY5NiwgMHg5NjlBLCAweDk2OUQsIDB4OTY5RSwgMHg5NjlGLCAweDk2QTAsIDB4OTZBMSwKKyAgICAweDk2QTIsIDB4OTZBMywgMHg5NkE0LCAweDk2QTUsIDB4OTZBNiwgMHg5NkE5LCAweDk2QUIsIDB4OTZBQywgMHg5NkFELAorICAgIDB4OTZBRSwgMHg5NkFGLCAweDk2QjIsIDB4OTZCNSwgMHg5NkI3LCAweDk2QkEsIDB4OTZCRiwgMHg5NkMyLCAweDk2QzMsCisgICAgMHg5NkM4LCAweDk2Q0EsIDB4OTZDQiwgMHg5NkQwLCAweDk2RDEsIDB4OTZEMywgMHg5NkQ0LCAweDk2RDcsIDB4OTZEOCwKKyAgICAweDk2REEsIDB4OTZERCwgMHg5NkRFLCAweDk2REYsIDB4OTZFMSwgMHg5NkU0LCAweDk2RTUsIDB4OTZFNiwgMHg5NkU3LAorICAgIDB4OTZFQiwgMHg5NkVDLCAweDk2RUQsIDB4OTZFRSwgMHg5NkYwLCAweDk2RjEsIDB4OTZGNCwgMHg5NkY1LCAweDk2RjgsCisgICAgMHg5NkZBLCAweDk2RkMsIDB4OTZGRCwgMHg5NkZGLCAweDk3MDIsIDB4OTcwMywgMHg5NzA1LCAweDk3MEEsIDB4OTcwQiwKKyAgICAweDk3MEMsIDB4OTcxMCwgMHg5NzExLCAweDk3MTIsIDB4OTcxNCwgMHg5NzE1LCAweDk3MTcsIDB4OTcxOCwgMHg5NzE5LAorICAgIDB4OTcxQSwgMHg5NzFCLCAweDk3MUQsIDB4OTcxRiwgMHg5NzIwLCAweDk3MjEsIDB4OTcyMiwgMHg5NzIzLCAweDk3MjQsCisgICAgMHg5NzI1LCAweDk3MjYsIDB4OTcyOCwgMHg5NzI5LCAweDk3MkIsIDB4OTcyQywgMHg5NzJFLCAweDk3MkYsIDB4OTczMSwKKyAgICAweDk3MzMsIDB4OTczNCwgMHg5NzM1LCAweDk3MzYsIDB4OTczNywgMHg5NzNBLCAweDk3M0IsIDB4OTczQywgMHg5NzNGLAorICAgIDB4OTc0MCwgMHg5NzQxLCAweDk3NDMsIDB4OTc0NSwgMHg5NzQ2LCAweDk3NDcsIDB4OTc0OSwgMHg5NzRBLCAweDk3NEIsCisgICAgMHg5NzRDLCAweDk3NEQsIDB4OTc0RSwgMHg5NzRGLCAweDk3NTAsIDB4OTc1MSwgMHg5NzU0LCAweDk3NTUsIDB4OTc1NywKKyAgICAweDk3NTgsIDB4OTc1QywgMHg5NzVELCAweDk3NUYsIDB4OTc2MywgMHg5NzY0LCAweDk3NjYsIDB4OTc2NywgMHg5NzZBLAorICAgIDB4OTc2QiwgMHg5NzZDLCAweDk3NkQsIDB4OTc2RSwgMHg5NzZGLCAweDk3NzAsIDB4OTc3MSwgMHg5NzcyLCAweDk3NzUsCisgICAgMHg5Nzc3LCAweDk3NzgsIDB4OTc3OSwgMHg5NzdBLCAweDk3N0IsIDB4OTc3RCwgMHg5NzdFLCAweDk3N0YsIDB4OTc4MCwKKyAgICAweDk3ODEsIDB4OTc4MiwgMHg5NzgzLCAweDk3ODQsIDB4OTc4NiwgMHg5Nzg3LCAweDk3ODgsIDB4OTc4OSwgMHg5NzhBLAorICAgIDB4OTc4QywgMHg5NzhFLCAweDk3OTAsIDB4OTc5MywgMHg5Nzk1LCAweDk3OTYsIDB4OTc5NywgMHg5Nzk5LCAweDk3OUEsCisgICAgMHg5NzlCLCAweDk3OUMsIDB4OTc5RCwgMHg5NzlFLCAweDk3OUYsIDB4OTdBMSwgMHg5N0EyLCAweDk3QTQsIDB4OTdBNSwKKyAgICAweDk3QTcsIDB4OTdBOCwgMHg5N0E5LCAweDk3QUEsIDB4OTdBQywgMHg5N0FFLCAweDk3QjAsIDB4OTdCMSwgMHg5N0IzLAorICAgIDB4OTdCNSwgMHg5N0I2LCAweDk3QjcsIDB4OTdCOCwgMHg5N0I5LCAweDk3QkEsIDB4OTdCQiwgMHg5N0JDLCAweDk3QkUsCisgICAgMHg5N0JGLCAweDk3QzAsIDB4OTdDMSwgMHg5N0MyLCAweDk3QzQsIDB4OTdDNSwgMHg5N0M3LCAweDk3QzgsIDB4OTdDQSwKKyAgICAweDk3Q0QsIDB4OTdDRSwgMHg5N0NGLCAweDk3RDAsIDB4OTdEMSwgMHg5N0QyLCAweDk3RDQsIDB4OTdENSwgMHg5N0Q2LAorICAgIDB4OTdENywgMHg5N0Q4LCAweDk3REEsIDB4OTdEQiwgMHg5N0RELCAweDk3REYsIDB4OTdFMCwgMHg5N0UxLCAweDk3RTIsCisgICAgMHg5N0UzLCAweDk3RTQsIDB4OTdFNSwgMHg5N0U4LCAweDk3RUUsIDB4OTdFRiwgMHg5N0YwLCAweDk3RjEsIDB4OTdGMiwKKyAgICAweDk3RjQsIDB4OTdGNywgMHg5N0Y4LCAweDk3RjksIDB4OTdGQSwgMHg5N0ZCLCAweDk3RkMsIDB4OTdGRCwgMHg5N0ZFLAorICAgIDB4OTgwMCwgMHg5ODA0LCAweDk4MDksIDB4OTgwQiwgMHg5ODBELCAweDk4MTQsIDB4OTgxNSwgMHg5ODE2LCAweDk4MTksCisgICAgMHg5ODFBLCAweDk4MUIsIDB4OTgxRCwgMHg5ODFFLCAweDk4MUYsIDB4OTgyMCwgMHg5ODIyLCAweDk4MjMsIDB4OTgyNSwKKyAgICAweDk4MjcsIDB4OTgyOCwgMHg5ODI5LCAweDk4MkEsIDB4OTgyQiwgMHg5ODJDLCAweDk4MkUsIDB4OTgyRiwgMHg5ODMxLAorICAgIDB4OTgzMiwgMHg5ODMzLCAweDk4MzQsIDB4OTgzNSwgMHg5ODM2LCAweDk4MzksIDB4OTgzQSwgMHg5ODNDLCAweDk4M0UsCisgICAgMHg5ODNGLCAweDk4NDAsIDB4OTg0MSwgMHg5ODQyLCAweDk4NDMsIDB4OTg0NCwgMHg5ODQ1LCAweDk4NDcsIDB4OTg0OCwKKyAgICAweDk4NDksIDB4OTg0QSwgMHg5ODRCLCAweDk4NEYsIDB4OTg1MCwgMHg5ODUxLCAweDk4NTIsIDB4OTg1NSwgMHg5ODU2LAorICAgIDB4OTg1NywgMHg5ODVBLCAweDk4NUMsIDB4OTg1RCwgMHg5ODVGLCAweDk4NjAsIDB4OTg2MSwgMHg5ODYzLCAweDk4NjQsCisgICAgMHg5ODY2LCAweDk4NjgsIDB4OTg2OSwgMHg5ODZBLCAweDk4NkQsIDB4OTg2RSwgMHg5ODcyLCAweDk4OEIsIDB4OTg4RSwKKyAgICAweDk4OTIsIDB4OTg5NSwgMHg5ODk5LCAweDk4QTMsIDB4OThBOSwgMHg5OEFBLCAweDk4QUIsIDB4OThBQywgMHg5OEFELAorICAgIDB4OThCMCwgMHg5OEIyLCAweDk4QjQsIDB4OThCNSwgMHg5OEI3LCAweDk4QjgsIDB4OThCOSwgMHg5OEJBLCAweDk4QkIsCisgICAgMHg5OEJELCAweDk4QkUsIDB4OThCRiwgMHg5OEMwLCAweDk4QzEsIDB4OThDMiwgMHg5OEMzLCAweDk4QzUsIDB4OThDNywKKyAgICAweDk4QzksIDB4OThDQSwgMHg5OENCLCAweDk4Q0MsIDB4OThDRCwgMHg5OENGLCAweDk4RDAsIDB4OThENCwgMHg5OEQ2LAorICAgIDB4OThENywgMHg5OERDLCAweDk4REQsIDB4OThFMSwgMHg5OEUzLCAweDk4RTQsIDB4OThFNSwgMHg5OEU2LCAweDk4RUMsCisgICAgMHg5OEVFLCAweDk4RjAsIDB4OThGMSwgMHg5OEYzLCAweDk4RjUsIDB4OThGNiwgMHg5OEY3LCAweDk4RjgsIDB4OThGOSwKKyAgICAweDk4RkEsIDB4OThGQiwgMHg5OEZGLCAweDk5MDAsIDB4OTkwMSwgMHg5OTAyLCAweDk5MDQsIDB4OTkwNiwgMHg5OTA3LAorICAgIDB4OTkwOCwgMHg5OTBCLCAweDk5MEUsIDB4OTkwRiwgMHg5OTE0LCAweDk5MTUsIDB4OTkxNiwgMHg5OTE3LCAweDk5MTksCisgICAgMHg5OTFBLCAweDk5MUMsIDB4OTkxRCwgMHg5OTFGLCAweDk5MjAsIDB4OTkyMiwgMHg5OTIzLCAweDk5MjQsIDB4OTkyNSwKKyAgICAweDk5MjYsIDB4OTkyNywgMHg5OTI5LCAweDk5MkEsIDB4OTkyQiwgMHg5OTJDLCAweDk5MkQsIDB4OTkyRiwgMHg5OTMwLAorICAgIDB4OTkzMSwgMHg5OTMyLCAweDk5MzQsIDB4OTkzNSwgMHg5OTM2LCAweDk5MzgsIDB4OTkzOSwgMHg5OTNBLCAweDk5M0IsCisgICAgMHg5OTNELCAweDk5NDAsIDB4OTk0MSwgMHg5OTQyLCAweDk5NDQsIDB4OTk0NiwgMHg5OTQ3LCAweDk5NEQsIDB4OTk0RSwKKyAgICAweDk5NEYsIDB4OTk1MCwgMHg5OTUzLCAweDk5NTYsIDB4OTk1OCwgMHg5OTU5LCAweDk5NUEsIDB4OTk1QiwgMHg5OTVELAorICAgIDB4OTk1RiwgMHg5OTYwLCAweDk5NjEsIDB4OTk2NCwgMHg5OTY2LCAweDk5NzMsIDB4OTk3OCwgMHg5OTc5LCAweDk5N0IsCisgICAgMHg5OTdFLCAweDk5ODIsIDB4OTk4MywgMHg5OTg5LCAweDk5OEMsIDB4OTk4RSwgMHg5OTlBLCAweDk5OUIsIDB4OTk5QywKKyAgICAweDk5OUQsIDB4OTk5RSwgMHg5OTlGLCAweDk5QTAsIDB4OTlBMSwgMHg5OUEyLCAweDk5QTMsIDB4OTlBNCwgMHg5OUE2LAorICAgIDB4OTlBNywgMHg5OUE5LCAweDk5QUEsIDB4OTlBQiwgMHg5OUFGLCAweDk5QjAsIDB4OTlCMiwgMHg5OUI1LCAweDk5QjYsCisgICAgMHg5OUI3LCAweDk5QjgsIDB4OTlCOSwgMHg5OUJBLCAweDk5QkIsIDB4OTlCQywgMHg5OUJELCAweDk5QkUsIDB4OTlCRiwKKyAgICAweDk5QzAsIDB4OTlDMiwgMHg5OUMzLCAweDk5QzQsIDB4OTlDNSwgMHg5OUM2LCAweDk5QzcsIDB4OTlDOCwgMHg5OUM5LAorICAgIDB4OTlDQSwgMHg5OUNCLCAweDk5Q0MsIDB4OTlDRCwgMHg5OUNFLCAweDk5Q0YsIDB4OTlEMywgMHg5OUQ2LCAweDk5RDcsCisgICAgMHg5OURBLCAweDk5REMsIDB4OTlERSwgMHg5OUUwLCAweDk5RTMsIDB4OTlFNCwgMHg5OUU1LCAweDk5RTYsIDB4OTlFNywKKyAgICAweDk5RTgsIDB4OTlFOSwgMHg5OUVBLCAweDk5RUIsIDB4OTlFQywgMHg5OUVFLCAweDk5RUYsIDB4OTlGMCwgMHg5OUYyLAorICAgIDB4OTlGMywgMHg5OUY0LCAweDk5RjUsIDB4OTlGNiwgMHg5OUY3LCAweDk5RjgsIDB4OTlGOSwgMHg5OUZBLCAweDk5RkIsCisgICAgMHg5OUZDLCAweDk5RkQsIDB4OTlGRSwgMHg5QTAwLCAweDlBMDIsIDB4OUEwMywgMHg5QTA0LCAweDlBMDYsIDB4OUEwNywKKyAgICAweDlBMDgsIDB4OUEwOSwgMHg5QTBBLCAweDlBMEIsIDB4OUEwQywgMHg5QTEwLCAweDlBMTEsIDB4OUExMiwgMHg5QTEzLAorICAgIDB4OUExNCwgMHg5QTE1LCAweDlBMTcsIDB4OUExOCwgMHg5QTFBLCAweDlBMUIsIDB4OUExQywgMHg5QTFELCAweDlBMUUsCisgICAgMHg5QTFGLCAweDlBMjAsIDB4OUEyMSwgMHg5QTIyLCAweDlBMjMsIDB4OUEyNCwgMHg5QTI1LCAweDlBMjYsIDB4OUEyNywKKyAgICAweDlBMjgsIDB4OUEyOSwgMHg5QTJBLCAweDlBMkMsIDB4OUEyRiwgMHg5QTMxLCAweDlBMzIsIDB4OUEzMywgMHg5QTM0LAorICAgIDB4OUEzNSwgMHg5QTM5LCAweDlBM0EsIDB4OUEzQiwgMHg5QTNDLCAweDlBM0QsIDB4OUEzRiwgMHg5QTQ2LCAweDlBNDcsCisgICAgMHg5QTQ4LCAweDlBNDksIDB4OUE0QiwgMHg5QTRDLCAweDlBNEUsIDB4OUE1MCwgMHg5QTUxLCAweDlBNTIsIDB4OUE1MywKKyAgICAweDlBNTQsIDB4OUE1NiwgMHg5QTU4LCAweDlBNTksIDB4OUE1QywgMHg5QTVELCAweDlBNUUsIDB4OUE2MCwgMHg5QTYxLAorICAgIDB4OUE2MywgMHg5QTY2LCAweDlBNjcsIDB4OUE2OCwgMHg5QTY5LCAweDlBNkIsIDB4OUE3MiwgMHg5QTgzLCAweDlBODksCisgICAgMHg5QThELCAweDlBOEUsIDB4OUE5NCwgMHg5QTk1LCAweDlBOTksIDB4OUFBNiwgMHg5QUE5LCAweDlBQUEsIDB4OUFBQiwKKyAgICAweDlBQUMsIDB4OUFBRCwgMHg5QUFFLCAweDlBQjIsIDB4OUFCMywgMHg5QUI0LCAweDlBQjUsIDB4OUFCOSwgMHg5QUJCLAorICAgIDB4OUFCRCwgMHg5QUJFLCAweDlBQkYsIDB4OUFDMywgMHg5QUM0LCAweDlBQzYsIDB4OUFDNywgMHg5QUM4LCAweDlBQzksCisgICAgMHg5QUNBLCAweDlBQ0QsIDB4OUFDRSwgMHg5QUQwLCAweDlBRDcsIDB4OUFEOSwgMHg5QURBLCAweDlBREIsIDB4OUFEQywKKyAgICAweDlBREQsIDB4OUFERSwgMHg5QUUwLCAweDlBRTIsIDB4OUFFMywgMHg5QUU0LCAweDlBRTUsIDB4OUFFNywgMHg5QUU4LAorICAgIDB4OUFFOSwgMHg5QUVBLCAweDlBRUMsIDB4OUFGMCwgMHg5QUYxLCAweDlBRjIsIDB4OUFGMywgMHg5QUY0LCAweDlBRjUsCisgICAgMHg5QUY2LCAweDlBRjcsIDB4OUFGOCwgMHg5QUZBLCAweDlBRkMsIDB4OUFGRCwgMHg5QUZFLCAweDlBRkYsIDB4OUIwMCwKKyAgICAweDlCMDEsIDB4OUIwMiwgMHg5QjA0LCAweDlCMDUsIDB4OUIwNywgMHg5QjA5LCAweDlCMEEsIDB4OUIwQiwgMHg5QjBDLAorICAgIDB4OUIwRSwgMHg5QjEwLCAweDlCMTEsIDB4OUIxMiwgMHg5QjE0LCAweDlCMTUsIDB4OUIxNiwgMHg5QjE3LCAweDlCMTgsCisgICAgMHg5QjE5LCAweDlCMUIsIDB4OUIxQywgMHg5QjFELCAweDlCMUUsIDB4OUIyMCwgMHg5QjIxLCAweDlCMjQsIDB4OUIyNiwKKyAgICAweDlCMjgsIDB4OUIyQSwgMHg5QjJCLCAweDlCMkMsIDB4OUIyRCwgMHg5QjMwLCAweDlCMzMsIDB4OUIzNCwgMHg5QjM1LAorICAgIDB4OUIzNiwgMHg5QjM3LCAweDlCMzgsIDB4OUIzOSwgMHg5QjNBLCAweDlCM0QsIDB4OUIzRSwgMHg5QjNGLCAweDlCNDAsCisgICAgMHg5QjQ2LCAweDlCNEEsIDB4OUI0QiwgMHg5QjRDLCAweDlCNTAsIDB4OUI1MiwgMHg5QjUzLCAweDlCNTUsIDB4OUI1NiwKKyAgICAweDlCNTcsIDB4OUI1OSwgMHg5QjVCLCAweDlCNUMsIDB4OUI1RCwgMHg5QjVFLCAweDlCNUYsIDB4OUI2MCwgMHg5QjYxLAorICAgIDB4OUI2MiwgMHg5QjYzLCAweDlCNjQsIDB4OUI2NSwgMHg5QjY2LCAweDlCNjcsIDB4OUI2OCwgMHg5QjY5LCAweDlCNkEsCisgICAgMHg5QjZCLCAweDlCNkMsIDB4OUI2RCwgMHg5QjZFLCAweDlCNzAsIDB4OUI3MSwgMHg5QjcyLCAweDlCNzMsIDB4OUI3NSwKKyAgICAweDlCNzYsIDB4OUI3OCwgMHg5Qjc5LCAweDlCN0EsIDB4OUI3QiwgMHg5QjdDLCAweDlCN0QsIDB4OUI3RSwgMHg5QjdGLAorICAgIDB4OUI4MCwgMHg5QjgyLCAweDlCODQsIDB4OUI4NSwgMHg5Qjg2LCAweDlCODcsIDB4OUI4OCwgMHg5Qjg5LCAweDlCOEEsCisgICAgMHg5QjhCLCAweDlCOEMsIDB4OUI4RCwgMHg5QjhGLCAweDlCOTMsIDB4OUI5NCwgMHg5Qjk1LCAweDlCOTYsIDB4OUI5NywKKyAgICAweDlCOTgsIDB4OUI5OSwgMHg5QjlCLCAweDlCOUMsIDB4OUI5RiwgMHg5QkEwLCAweDlCQTEsIDB4OUJBMiwgMHg5QkEzLAorICAgIDB4OUJBNCwgMHg5QkE1LCAweDlCQTYsIDB4OUJBNywgMHg5QkE4LCAweDlCQTksIDB4OUJBQywgMHg5QkFGLCAweDlCQjAsCisgICAgMHg5QkIxLCAweDlCQjIsIDB4OUJCMywgMHg5QkI0LCAweDlCQjUsIDB4OUJCNiwgMHg5QkI3LCAweDlCQjgsIDB4OUJCOSwKKyAgICAweDlCQkEsIDB4OUJCQiwgMHg5QkJDLCAweDlCQkQsIDB4OUJCRSwgMHg5QkJGLCAweDlCQzIsIDB4OUJDMywgMHg5QkM0LAorICAgIDB4OUJDNSwgMHg5QkM2LCAweDlCQzgsIDB4OUJDQiwgMHg5QkNDLCAweDlCQ0QsIDB4OUJDRSwgMHg5QkNGLCAweDlCRDAsCisgICAgMHg5QkQxLCAweDlCRDIsIDB4OUJEMywgMHg5QkQ1LCAweDlCRDcsIDB4OUJEOCwgMHg5QkQ5LCAweDlCREEsIDB4OUJEQywKKyAgICAweDlCREUsIDB4OUJERiwgMHg5QkUwLCAweDlCRTMsIDB4OUJFNSwgMHg5QkU2LCAweDlCRTksIDB4OUJFQywgMHg5QkVELAorICAgIDB4OUJFRSwgMHg5QkVGLCAweDlCRjEsIDB4OUJGMiwgMHg5QkYzLCAweDlCRjUsIDB4OUJGNiwgMHg5QkY3LCAweDlCRjgsCisgICAgMHg5QkY5LCAweDlCRkEsIDB4OUJGQiwgMHg5QkZDLCAweDlCRkUsIDB4OUMwMCwgMHg5QzAxLCAweDlDMDIsIDB4OUMwMywKKyAgICAweDlDMDQsIDB4OUMwNSwgMHg5QzA2LCAweDlDMDcsIDB4OUMwQSwgMHg5QzBCLCAweDlDMEMsIDB4OUMwRSwgMHg5QzBGLAorICAgIDB4OUMxMSwgMHg5QzE0LCAweDlDMTUsIDB4OUMxNiwgMHg5QzE3LCAweDlDMTgsIDB4OUMxOSwgMHg5QzFBLCAweDlDMUIsCisgICAgMHg5QzFDLCAweDlDMUQsIDB4OUMxRSwgMHg5QzFGLCAweDlDMjEsIDB4OUMyMiwgMHg5QzI0LCAweDlDMjYsIDB4OUMyNywKKyAgICAweDlDMkEsIDB4OUMyQiwgMHg5QzJDLCAweDlDMkUsIDB4OUMyRiwgMHg5QzMwLCAweDlDMzQsIDB4OUMzNiwgMHg5QzM4LAorICAgIDB4OUMzQSwgMHg5QzNDLCAweDlDM0QsIDB4OUMzRiwgMHg5QzQwLCAweDlDNDEsIDB4OUM0MiwgMHg5QzQzLCAweDlDNDQsCisgICAgMHg5QzQ2LCAweDlDNDcsIDB4OUM0QSwgMHg5QzRCLCAweDlDNEMsIDB4OUM0RCwgMHg5QzRFLCAweDlDNEYsIDB4OUM1MCwKKyAgICAweDlDNTEsIDB4OUM1MywgMHg5QzU1LCAweDlDNTksIDB4OUM1QSwgMHg5QzVCLCAweDlDNUMsIDB4OUM1RSwgMHg5QzYwLAorICAgIDB4OUM2MSwgMHg5QzYyLCAweDlDNjMsIDB4OUM2NCwgMHg5QzY1LCAweDlDNjYsIDB4OUM2OCwgMHg5QzY5LCAweDlDNkEsCisgICAgMHg5QzZCLCAweDlDNkMsIDB4OUM2RSwgMHg5QzZGLCAweDlDNzAsIDB4OUM3MSwgMHg5QzcyLCAweDlDNzMsIDB4OUM3NCwKKyAgICAweDlDNzUsIDB4OUM3NiwgMHg5Qzc3LCAweDlDNzksIDB4OUM3QiwgMHg5QzdELCAweDlDN0UsIDB4OUM4MCwgMHg5QzgzLAorICAgIDB4OUM4NCwgMHg5Qzg5LCAweDlDOEEsIDB4OUM4QywgMHg5QzhGLCAweDlDOTMsIDB4OUM5NiwgMHg5Qzk3LCAweDlDOTgsCisgICAgMHg5Qzk5LCAweDlDOUQsIDB4OUNBQSwgMHg5Q0FDLCAweDlDQUYsIDB4OUNCOSwgMHg5Q0JFLCAweDlDQkYsIDB4OUNDMCwKKyAgICAweDlDQzEsIDB4OUNDMiwgMHg5Q0M4LCAweDlDQzksIDB4OUNEMSwgMHg5Q0QyLCAweDlDREEsIDB4OUNEQiwgMHg5Q0UwLAorICAgIDB4OUNFMSwgMHg5Q0UzLCAweDlDRTQsIDB4OUNFNiwgMHg5Q0U3LCAweDlDRTgsIDB4OUNFQSwgMHg5Q0VCLCAweDlDRUQsCisgICAgMHg5Q0VFLCAweDlDRUYsIDB4OUNGMCwgMHg5Q0YxLCAweDlDRjIsIDB4OUNGNSwgMHg5Q0Y3LCAweDlDRjgsIDB4OUNGOSwKKyAgICAweDlDRkEsIDB4OUNGQiwgMHg5Q0ZDLCAweDlDRkQsIDB4OUNGRSwgMHg5Q0ZGLCAweDlEMDAsIDB4OUQwMSwgMHg5RDAyLAorICAgIDB4OUQwMywgMHg5RDA0LCAweDlEMDUsIDB4OUQwOCwgMHg5RDBBLCAweDlEMEIsIDB4OUQwQywgMHg5RDBELCAweDlEMEUsCisgICAgMHg5RDBGLCAweDlEMTAsIDB4OUQxMSwgMHg5RDEyLCAweDlEMTMsIDB4OUQxNCwgMHg5RDE2LCAweDlEMTcsIDB4OUQxOCwKKyAgICAweDlEMTksIDB4OUQxQSwgMHg5RDFDLCAweDlEMUUsIDB4OUQyMCwgMHg5RDIxLCAweDlEMjIsIDB4OUQyNCwgMHg5RDI1LAorICAgIDB4OUQyNywgMHg5RDI5LCAweDlEMkEsIDB4OUQyQiwgMHg5RDJDLCAweDlEMkQsIDB4OUQyRSwgMHg5RDMxLCAweDlEMzIsCisgICAgMHg5RDMzLCAweDlEMzQsIDB4OUQzNSwgMHg5RDM2LCAweDlEMzcsIDB4OUQzOCwgMHg5RDM5LCAweDlEM0EsIDB4OUQzQywKKyAgICAweDlEM0QsIDB4OUQzRSwgMHg5RDQwLCAweDlENDEsIDB4OUQ0MywgMHg5RDQ0LCAweDlENDUsIDB4OUQ0NiwgMHg5RDQ3LAorICAgIDB4OUQ0OCwgMHg5RDQ5LCAweDlENEEsIDB4OUQ0QiwgMHg5RDRDLCAweDlENEQsIDB4OUQ0RSwgMHg5RDRGLCAweDlENTAsCisgICAgMHg5RDU0LCAweDlENTUsIDB4OUQ1NiwgMHg5RDU3LCAweDlENTgsIDB4OUQ1OSwgMHg5RDVBLCAweDlENUIsIDB4OUQ1RSwKKyAgICAweDlENUYsIDB4OUQ2MiwgMHg5RDYzLCAweDlENjQsIDB4OUQ2NSwgMHg5RDY2LCAweDlENjcsIDB4OUQ2OCwgMHg5RDY5LAorICAgIDB4OUQ2QiwgMHg5RDZELCAweDlENkUsIDB4OUQ3MCwgMHg5RDcxLCAweDlENzMsIDB4OUQ3NCwgMHg5RDc1LCAweDlENzYsCisgICAgMHg5RDc3LCAweDlENzgsIDB4OUQ3OSwgMHg5RDdBLCAweDlEN0IsIDB4OUQ3QywgMHg5RDdELCAweDlEN0UsIDB4OUQ3RiwKKyAgICAweDlEODAsIDB4OUQ4MSwgMHg5RDgyLCAweDlEODMsIDB4OUQ4NCwgMHg5RDg1LCAweDlEODYsIDB4OUQ4OCwgMHg5RDhBLAorICAgIDB4OUQ4QiwgMHg5RDhDLCAweDlEOEQsIDB4OUQ4RSwgMHg5RDhGLCAweDlEOTAsIDB4OUQ5MSwgMHg5RDkyLCAweDlEOTQsCisgICAgMHg5RDk1LCAweDlEOTYsIDB4OUQ5NywgMHg5RDk5LCAweDlEOUIsIDB4OUQ5QywgMHg5RDlELCAweDlEOUUsIDB4OUQ5RiwKKyAgICAweDlEQTAsIDB4OURBMSwgMHg5REEyLCAweDlEQTMsIDB4OURBNCwgMHg5REE2LCAweDlEQTcsIDB4OURBOCwgMHg5REFBLAorICAgIDB4OURBQiwgMHg5REFDLCAweDlEQUQsIDB4OURBRSwgMHg5REIwLCAweDlEQjEsIDB4OURCMiwgMHg5REIzLCAweDlEQjUsCisgICAgMHg5REI2LCAweDlEQjcsIDB4OURCOCwgMHg5REI5LCAweDlEQkEsIDB4OURCRCwgMHg5REJFLCAweDlEQkYsIDB4OURDMSwKKyAgICAweDlEQzMsIDB4OURDNSwgMHg5REM2LCAweDlEQzcsIDB4OURDOCwgMHg5REM5LCAweDlEQ0EsIDB4OURDQiwgMHg5RENDLAorICAgIDB4OURDRCwgMHg5RENFLCAweDlEQ0YsIDB4OUREMCwgMHg5REQxLCAweDlERDIsIDB4OURENCwgMHg5REQ1LCAweDlERDYsCisgICAgMHg5REQ4LCAweDlEREIsIDB4OUREQywgMHg5RERELCAweDlEREUsIDB4OURERiwgMHg5REUwLCAweDlERTEsIDB4OURFMiwKKyAgICAweDlERTMsIDB4OURFNCwgMHg5REU3LCAweDlERTgsIDB4OURFOSwgMHg5REVBLCAweDlERUIsIDB4OURFQywgMHg5REVELAorICAgIDB4OURFRSwgMHg5REYwLCAweDlERjEsIDB4OURGNCwgMHg5REY1LCAweDlERjYsIDB4OURGNywgMHg5REZCLCAweDlERkMsCisgICAgMHg5REZELCAweDlERkUsIDB4OURGRiwgMHg5RTAwLCAweDlFMDEsIDB4OUUwMiwgMHg5RTAzLCAweDlFMDQsIDB4OUUwNSwKKyAgICAweDlFMDYsIDB4OUUwNywgMHg5RTA4LCAweDlFMDksIDB4OUUwQSwgMHg5RTBCLCAweDlFMEQsIDB4OUUwRSwgMHg5RTBGLAorICAgIDB4OUUxMCwgMHg5RTExLCAweDlFMTIsIDB4OUUxMywgMHg5RTE0LCAweDlFMTYsIDB4OUUxNywgMHg5RTE4LCAweDlFMTksCisgICAgMHg5RTFDLCAweDlFMjQsIDB4OUUyNywgMHg5RTJFLCAweDlFMzAsIDB4OUUzNCwgMHg5RTNCLCAweDlFM0MsIDB4OUU0MCwKKyAgICAweDlFNEQsIDB4OUU1MCwgMHg5RTUyLCAweDlFNTMsIDB4OUU1NCwgMHg5RTU2LCAweDlFNTksIDB4OUU1RCwgMHg5RTVGLAorICAgIDB4OUU2MCwgMHg5RTYxLCAweDlFNjIsIDB4OUU2NSwgMHg5RTZFLCAweDlFNkYsIDB4OUU3MiwgMHg5RTc0LCAweDlFNzYsCisgICAgMHg5RTc3LCAweDlFNzgsIDB4OUU3QiwgMHg5RTgwLCAweDlFODEsIDB4OUU4MywgMHg5RTg0LCAweDlFODUsIDB4OUU4NiwKKyAgICAweDlFODksIDB4OUU4QSwgMHg5RThDLCAweDlFOEQsIDB4OUU4RSwgMHg5RThGLCAweDlFOTAsIDB4OUU5MSwgMHg5RTk0LAorICAgIDB4OUU5NSwgMHg5RTk2LCAweDlFOTgsIDB4OUU5OSwgMHg5RTlBLCAweDlFOUIsIDB4OUU5QywgMHg5RTlFLCAweDlFQTAsCisgICAgMHg5RUExLCAweDlFQTIsIDB4OUVBMywgMHg5RUE0LCAweDlFQTcsIDB4OUVBOCwgMHg5RUFBLCAweDlFQUIsIDB4OUVBQywKKyAgICAweDlFQUQsIDB4OUVBRSwgMHg5RUIwLCAweDlFQjEsIDB4OUVCMiwgMHg5RUIzLCAweDlFQjYsIDB4OUVCNywgMHg5RUI5LAorICAgIDB4OUVCQSwgMHg5RUJDLCAweDlFQkYsIDB4OUVDMCwgMHg5RUMxLCAweDlFQzIsIDB4OUVDMywgMHg5RUM1LCAweDlFQzYsCisgICAgMHg5RUM3LCAweDlFQzgsIDB4OUVDQSwgMHg5RUNCLCAweDlFRDAsIDB4OUVEMiwgMHg5RUQzLCAweDlFRDUsIDB4OUVENiwKKyAgICAweDlFRDcsIDB4OUVEOSwgMHg5RURBLCAweDlFRTEsIDB4OUVFMywgMHg5RUU0LCAweDlFRTYsIDB4OUVFQiwgMHg5RUVDLAorICAgIDB4OUVFRCwgMHg5RUVFLCAweDlFRjAsIDB4OUVGMSwgMHg5RUYzLCAweDlFRjUsIDB4OUVGNiwgMHg5RUY4LCAweDlFRkEsCisgICAgMHg5RjAwLCAweDlGMDEsIDB4OUYwMiwgMHg5RjAzLCAweDlGMDQsIDB4OUYwNSwgMHg5RjA2LCAweDlGMDcsIDB4OUYwOCwKKyAgICAweDlGMEEsIDB4OUYwQywgMHg5RjBGLCAweDlGMTEsIDB4OUYxMiwgMHg5RjE0LCAweDlGMTYsIDB4OUYxOCwgMHg5RjFBLAorICAgIDB4OUYxQiwgMHg5RjFDLCAweDlGMUQsIDB4OUYxRSwgMHg5RjFGLCAweDlGMjEsIDB4OUYyMywgMHg5RjI0LCAweDlGMjUsCisgICAgMHg5RjI2LCAweDlGMjcsIDB4OUYyOCwgMHg5RjI5LCAweDlGMkEsIDB4OUYyQiwgMHg5RjJELCAweDlGMkUsIDB4OUYzMCwKKyAgICAweDlGMzEsIDB4OUYzMiwgMHg5RjMzLCAweDlGMzQsIDB4OUYzNSwgMHg5RjM2LCAweDlGMzgsIDB4OUYzQSwgMHg5RjNDLAorICAgIDB4OUYzRiwgMHg5RjQwLCAweDlGNDEsIDB4OUY0MiwgMHg5RjQzLCAweDlGNDUsIDB4OUY0NiwgMHg5RjQ3LCAweDlGNDgsCisgICAgMHg5RjQ5LCAweDlGNEMsIDB4OUY0RCwgMHg5RjRFLCAweDlGNTMsIDB4OUY1NSwgMHg5RjU2LCAweDlGNTcsIDB4OUY1OCwKKyAgICAweDlGNUEsIDB4OUY1QiwgMHg5RjVELCAweDlGNUUsIDB4OUY2MiwgMHg5RjY0LCAweDlGNjUsIDB4OUY2NywgMHg5RjY4LAorICAgIDB4OUY2OSwgMHg5RjZCLCAweDlGNkQsIDB4OUY2RSwgMHg5RjZGLCAweDlGNzAsIDB4OUY3MSwgMHg5RjczLCAweDlGNzQsCisgICAgMHg5Rjc1LCAweDlGNzYsIDB4OUY3OCwgMHg5Rjc5LCAweDlGN0EsIDB4OUY3QiwgMHg5RjdDLCAweDlGN0QsIDB4OUY3RSwKKyAgICAweDlGODEsIDB4OUY4MiwgMHg5RjhFLCAweDlGOEYsIDB4OUY5MSwgMHg5RjkyLCAweDlGOTMsIDB4OUY5NiwgMHg5Rjk3LAorICAgIDB4OUY5OCwgMHg5RjlELCAweDlGOUUsIDB4OUZBMSwgMHg5RkEyLCAweDlGQTMsIDB4OUZBNCwgMHg5RkE1LCAweEY5MkMsCisgICAgMHhGQTBELCAweEZBMEUsIDB4RkEwRiwgMHhGQTExLCAweEZBMTMsIDB4RkExNCwgMHhGQTE4LCAweEZBMUYsIDB4RkEyMCwKKyAgICAweEZBMjEsIDB4RkEyMywgMHhGQTI0LCAweEZBMjcsIDB4RkEyOCwgMHhGQTI5LCAweDJFODEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgyRTg0LCAweDM0NzMsIDB4MzQ0NywgMHgyRTg4LCAweDJFOEIsIDB4OUZCNCwgMHgzNTlFLCAweDM2MUEsCisgICAgMHgzNjBFLCAweDJFOEMsIDB4MkU5NywgMHgzOTZFLCAweDM5MTgsIDB4OUZCNSwgMHgzOUNGLCAweDM5REYsIDB4M0E3MywKKyAgICAweDM5RDAsIDB4OUZCNiwgMHg5RkI3LCAweDNCNEUsIDB4M0M2RSwgMHgzQ0UwLCAweDJFQTcsIDB4MDAwMCwgMHg5RkI4LAorICAgIDB4MkVBQSwgMHg0MDU2LCAweDQxNUYsIDB4MkVBRSwgMHg0MzM3LCAweDJFQjMsIDB4MkVCNiwgMHgyRUI3LCAweDAwMDAsCisgICAgMHg0M0IxLCAweDQzQUMsIDB4MkVCQiwgMHg0M0RELCAweDQ0RDYsIDB4NDY2MSwgMHg0NjRDLCAweDlGQjksIDB4NDcyMywKKyAgICAweDQ3MjksIDB4NDc3QywgMHg0NzhELCAweDJFQ0EsIDB4NDk0NywgMHg0OTdBLCAweDQ5N0QsIDB4NDk4MiwgMHg0OTgzLAorICAgIDB4NDk4NSwgMHg0OTg2LCAweDQ5OUYsIDB4NDk5QiwgMHg0OUI3LCAweDQ5QjYsIDB4OUZCQSwgMHgwMDAwLCAweDRDQTMsCisgICAgMHg0QzlGLCAweDRDQTAsIDB4NENBMSwgMHg0Qzc3LCAweDRDQTIsIDB4NEQxMywgMHg0RDE0LCAweDREMTUsIDB4NEQxNiwKKyAgICAweDREMTcsIDB4NEQxOCwgMHg0RDE5LCAweDREQUUsIDB4OUZCQiwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorICAgIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsCisgICAgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwKKyAgICAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLAorICAgIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwKKyAgICAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAorICAgIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsCisgICAgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwKKyAgICAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LAorICAgIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsCisgICAgMHgwMDdFLCAweDAwRkMsIDB4MDBBOSwgMHgyMTIyLCAweDIwMjYsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwKKyAgICAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELAorICAgIDB4MDAyRSwgMHgwMDJGLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsCisgICAgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LAorICAgIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsCisgICAgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwKKyAgICAweDAwNUIsIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorICAgIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsCisgICAgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwKKyAgICAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLAorICAgIDB4MDEwMSwgMHgwMEUxLCAweDAxQ0UsIDB4MDBFMCwgMHgwMTEzLCAweDAwRTksIDB4MDExQiwgMHgwMEU4LCAweDAxMkIsCisgICAgMHgwMEVELCAweDAxRDAsIDB4MDBFQywgMHgwMTRELCAweDAwRjMsIDB4MDFEMiwgMHgwMEYyLCAweDAxNkIsIDB4MDBGQSwKKyAgICAweDAxRDQsIDB4MDBGOSwgMHgwMUQ2LCAweDAxRDgsIDB4MDFEQSwgMHgwMURDLCAweDAwRkMsIDB4MDBFQSwgMHgwMjUxLAorICAgIDB4MUUzRiwgMHgwMTQ0LCAweDAxNDgsIDB4MDFGOSwgMHgwMjYxLCAweDAwMjAsIDB4MjBBQywgMHgwMEE1LCAweDIwQUMsCisgICAgMHgwMDI0LCAweDMwM0YsIDB4MjBBQywgMHgzMDQxLCAweDMwNDcsIDB4MzA0MywgMHgzMDRCLCAweDMwNEIsIDB4MzA1MSwKKyAgICAweDMwNTEsIDB4MzA1MywgMHgzMDUzLCAweDMwNDksIDB4MzA2NCwgMHgzMDQ1LCAweDMwOEUsIDB4MzA4MywgMHgzMDg3LAorICAgIDB4MzA4NSwgMHgzMDk0LCAweDMwQTEsIDB4MzBBNywgMHgzMEEzLCAweDMwRjUsIDB4MzBGNiwgMHgzMEIzLCAweDMwQjMsCisgICAgMHgzMEE5LCAweDMwQzMsIDB4MzBBNSwgMHgzMEVFLCAweDMwRTMsIDB4MzBFNywgMHgzMEU1LCAweDMwRjcsIDB4MzBGOSwKKyAgICAweDMwRjgsIDB4MzBGQSwgMHgzMEZDLCAweDMwMzMsIDB4MzAzNCwgMHgzMDM1LCAweDMwMzgsIDB4MzAzOSwgMHgzMDNBLAorICAgIDB4MzEyQSwgMHgzMTJCLCAweDMxMkMsIDB4MzFBMCwgMHgzMUExLCAweDMxQTIsIDB4MzFBMywgMHgzMUE0LCAweDMxQTUsCisgICAgMHgzMUE2LCAweDMxQTcsIDB4MzFBOCwgMHgzMUE5LCAweDMxQUEsIDB4MzFBQiwgMHgzMUFDLCAweDMxQUQsIDB4MzFBRSwKKyAgICAweDMxQUYsIDB4MzFCMCwgMHgzMUIxLCAweDMxQjIsIDB4MzFCMywgMHgzMUI0LCAweDMxQjUsIDB4MzFCNiwgMHgzMUI3LAorICAgIDB4MkU4MCwgMHgyRTgyLCAweDJFODMsIDB4MkU4NSwgMHgyRTg2LCAweDJFODcsIDB4MkU4OSwgMHgyRThBLCAweDJFOEQsCisgICAgMHgyRThFLCAweDJFOEYsIDB4MkU5MCwgMHgyRTkxLCAweDJFOTIsIDB4MkU5MywgMHgyRTk0LCAweDJFOTUsIDB4MkU5NiwKKyAgICAweDJFOTgsIDB4MkU5OSwgMHgyRTlCLCAweDJFOUMsIDB4MkU5RCwgMHgyRTlFLCAweDJFOUYsIDB4MkVBMCwgMHgyRUExLAorICAgIDB4MkVBMiwgMHgyRUEzLCAweDJFQTQsIDB4MkVBNSwgMHgyRUE2LCAweDJFQTgsIDB4MkVBOSwgMHgyRUFCLCAweDJFQUMsCisgICAgMHgyRUFELCAweDJFQUYsIDB4MkVCMCwgMHgyRUIxLCAweDJFQjIsIDB4MkVCNCwgMHgyRUI1LCAweDJFQjgsIDB4MkVCOSwKKyAgICAweDJFQkEsIDB4MkVCQywgMHgyRUJELCAweDJFQkUsIDB4MkVCRiwgMHgyRUMwLCAweDJFQzEsIDB4MkVDMiwgMHgyRUMzLAorICAgIDB4MkVDNCwgMHgyRUM1LCAweDJFQzYsIDB4MkVDNywgMHgyRUM4LCAweDJFQzksIDB4MkVDQiwgMHgyRUNDLCAweDJFQ0QsCisgICAgMHgyRUNFLCAweDJFQ0YsIDB4MkVEMCwgMHgyRUQxLCAweDJFRDIsIDB4MkVEMywgMHgyRUQ0LCAweDJFRDUsIDB4MkVENiwKKyAgICAweDJFRDcsIDB4MkVEOCwgMHgyRUQ5LCAweDJFREEsIDB4MkVEQiwgMHgyRURDLCAweDJFREQsIDB4MkVERSwgMHgyRURGLAorICAgIDB4MkVFMCwgMHgyRUUxLCAweDJFRTIsIDB4MkVFMywgMHgyRUU0LCAweDJFRTUsIDB4MkVFNiwgMHgyRUU3LCAweDJFRTgsCisgICAgMHgyRUU5LCAweDJFRUEsIDB4MkVFQiwgMHgyRUVDLCAweDJFRUQsIDB4MkVFRSwgMHgyRUVGLCAweDJFRjAsIDB4MkVGMSwKKyAgICAweDJFRjIsIDB4MkVGMywgMHgzNDAwLCAweDM0MDEsIDB4MzQwMiwgMHgzNDAzLCAweDM0MDQsIDB4MzQwNSwgMHgzNDA2LAorICAgIDB4MzQwNywgMHgzNDA4LCAweDM0MDksIDB4MzQwQSwgMHgzNDBCLCAweDM0MEMsIDB4MzQwRCwgMHgzNDBFLCAweDM0MEYsCisgICAgMHgzNDEwLCAweDM0MTEsIDB4MzQxMiwgMHgzNDEzLCAweDM0MTQsIDB4MzQxNSwgMHgzNDE2LCAweDM0MTcsIDB4MzQxOCwKKyAgICAweDM0MTksIDB4MzQxQSwgMHgzNDFCLCAweDM0MUMsIDB4MzQxRCwgMHgzNDFFLCAweDM0MUYsIDB4MzQyMCwgMHgzNDIxLAorICAgIDB4MzQyMiwgMHgzNDIzLCAweDM0MjQsIDB4MzQyNSwgMHgzNDI2LCAweDM0MjcsIDB4MzQyOCwgMHgzNDI5LCAweDM0MkEsCisgICAgMHgzNDJCLCAweDM0MkMsIDB4MzQyRCwgMHgzNDJFLCAweDM0MkYsIDB4MzQzMCwgMHgzNDMxLCAweDM0MzIsIDB4MzQzMywKKyAgICAweDM0MzQsIDB4MzQzNSwgMHgzNDM2LCAweDM0MzcsIDB4MzQzOCwgMHgzNDM5LCAweDM0M0EsIDB4MzQzQiwgMHgzNDNDLAorICAgIDB4MzQzRCwgMHgzNDNFLCAweDM0M0YsIDB4MzQ0MCwgMHgzNDQxLCAweDM0NDIsIDB4MzQ0MywgMHgzNDQ0LCAweDM0NDUsCisgICAgMHgzNDQ2LCAweDM0NDgsIDB4MzQ0OSwgMHgzNDRBLCAweDM0NEIsIDB4MzQ0QywgMHgzNDRELCAweDM0NEUsIDB4MzQ0RiwKKyAgICAweDM0NTAsIDB4MzQ1MSwgMHgzNDUyLCAweDM0NTMsIDB4MzQ1NCwgMHgzNDU1LCAweDM0NTYsIDB4MzQ1NywgMHgzNDU4LAorICAgIDB4MzQ1OSwgMHgzNDVBLCAweDM0NUIsIDB4MzQ1QywgMHgzNDVELCAweDM0NUUsIDB4MzQ1RiwgMHgzNDYwLCAweDM0NjEsCisgICAgMHgzNDYyLCAweDM0NjMsIDB4MzQ2NCwgMHgzNDY1LCAweDM0NjYsIDB4MzQ2NywgMHgzNDY4LCAweDM0NjksIDB4MzQ2QSwKKyAgICAweDM0NkIsIDB4MzQ2QywgMHgzNDZELCAweDM0NkUsIDB4MzQ2RiwgMHgzNDcwLCAweDM0NzEsIDB4MzQ3MiwgMHgzNDc0LAorICAgIDB4MzQ3NSwgMHgzNDc2LCAweDM0NzcsIDB4MzQ3OCwgMHgzNDc5LCAweDM0N0EsIDB4MzQ3QiwgMHgzNDdDLCAweDM0N0QsCisgICAgMHgzNDdFLCAweDM0N0YsIDB4MzQ4MCwgMHgzNDgxLCAweDM0ODIsIDB4MzQ4MywgMHgzNDg0LCAweDM0ODUsIDB4MzQ4NiwKKyAgICAweDM0ODcsIDB4MzQ4OCwgMHgzNDg5LCAweDM0OEEsIDB4MzQ4QiwgMHgzNDhDLCAweDM0OEQsIDB4MzQ4RSwgMHgzNDhGLAorICAgIDB4MzQ5MCwgMHgzNDkxLCAweDM0OTIsIDB4MzQ5MywgMHgzNDk0LCAweDM0OTUsIDB4MzQ5NiwgMHgzNDk3LCAweDM0OTgsCisgICAgMHgzNDk5LCAweDM0OUEsIDB4MzQ5QiwgMHgzNDlDLCAweDM0OUQsIDB4MzQ5RSwgMHgzNDlGLCAweDM0QTAsIDB4MzRBMSwKKyAgICAweDM0QTIsIDB4MzRBMywgMHgzNEE0LCAweDM0QTUsIDB4MzRBNiwgMHgzNEE3LCAweDM0QTgsIDB4MzRBOSwgMHgzNEFBLAorICAgIDB4MzRBQiwgMHgzNEFDLCAweDM0QUQsIDB4MzRBRSwgMHgzNEFGLCAweDM0QjAsIDB4MzRCMSwgMHgzNEIyLCAweDM0QjMsCisgICAgMHgzNEI0LCAweDM0QjUsIDB4MzRCNiwgMHgzNEI3LCAweDM0QjgsIDB4MzRCOSwgMHgzNEJBLCAweDM0QkIsIDB4MzRCQywKKyAgICAweDM0QkQsIDB4MzRCRSwgMHgzNEJGLCAweDM0QzAsIDB4MzRDMSwgMHgzNEMyLCAweDM0QzMsIDB4MzRDNCwgMHgzNEM1LAorICAgIDB4MzRDNiwgMHgzNEM3LCAweDM0QzgsIDB4MzRDOSwgMHgzNENBLCAweDM0Q0IsIDB4MzRDQywgMHgzNENELCAweDM0Q0UsCisgICAgMHgzNENGLCAweDM0RDAsIDB4MzREMSwgMHgzNEQyLCAweDM0RDMsIDB4MzRENCwgMHgzNEQ1LCAweDM0RDYsIDB4MzRENywKKyAgICAweDM0RDgsIDB4MzREOSwgMHgzNERBLCAweDM0REIsIDB4MzREQywgMHgzNERELCAweDM0REUsIDB4MzRERiwgMHgzNEUwLAorICAgIDB4MzRFMSwgMHgzNEUyLCAweDM0RTMsIDB4MzRFNCwgMHgzNEU1LCAweDM0RTYsIDB4MzRFNywgMHgzNEU4LCAweDM0RTksCisgICAgMHgzNEVBLCAweDM0RUIsIDB4MzRFQywgMHgzNEVELCAweDM0RUUsIDB4MzRFRiwgMHgzNEYwLCAweDM0RjEsIDB4MzRGMiwKKyAgICAweDM0RjMsIDB4MzRGNCwgMHgzNEY1LCAweDM0RjYsIDB4MzRGNywgMHgzNEY4LCAweDM0RjksIDB4MzRGQSwgMHgzNEZCLAorICAgIDB4MzRGQywgMHgzNEZELCAweDM0RkUsIDB4MzRGRiwgMHgzNTAwLCAweDM1MDEsIDB4MzUwMiwgMHgzNTAzLCAweDM1MDQsCisgICAgMHgzNTA1LCAweDM1MDYsIDB4MzUwNywgMHgzNTA4LCAweDM1MDksIDB4MzUwQSwgMHgzNTBCLCAweDM1MEMsIDB4MzUwRCwKKyAgICAweDM1MEUsIDB4MzUwRiwgMHgzNTEwLCAweDM1MTEsIDB4MzUxMiwgMHgzNTEzLCAweDM1MTQsIDB4MzUxNSwgMHgzNTE2LAorICAgIDB4MzUxNywgMHgzNTE4LCAweDM1MTksIDB4MzUxQSwgMHgzNTFCLCAweDM1MUMsIDB4MzUxRCwgMHgzNTFFLCAweDM1MUYsCisgICAgMHgzNTIwLCAweDM1MjEsIDB4MzUyMiwgMHgzNTIzLCAweDM1MjQsIDB4MzUyNSwgMHgzNTI2LCAweDM1MjcsIDB4MzUyOCwKKyAgICAweDM1MjksIDB4MzUyQSwgMHgzNTJCLCAweDM1MkMsIDB4MzUyRCwgMHgzNTJFLCAweDM1MkYsIDB4MzUzMCwgMHgzNTMxLAorICAgIDB4MzUzMiwgMHgzNTMzLCAweDM1MzQsIDB4MzUzNSwgMHgzNTM2LCAweDM1MzcsIDB4MzUzOCwgMHgzNTM5LCAweDM1M0EsCisgICAgMHgzNTNCLCAweDM1M0MsIDB4MzUzRCwgMHgzNTNFLCAweDM1M0YsIDB4MzU0MCwgMHgzNTQxLCAweDM1NDIsIDB4MzU0MywKKyAgICAweDM1NDQsIDB4MzU0NSwgMHgzNTQ2LCAweDM1NDcsIDB4MzU0OCwgMHgzNTQ5LCAweDM1NEEsIDB4MzU0QiwgMHgzNTRDLAorICAgIDB4MzU0RCwgMHgzNTRFLCAweDM1NEYsIDB4MzU1MCwgMHgzNTUxLCAweDM1NTIsIDB4MzU1MywgMHgzNTU0LCAweDM1NTUsCisgICAgMHgzNTU2LCAweDM1NTcsIDB4MzU1OCwgMHgzNTU5LCAweDM1NUEsIDB4MzU1QiwgMHgzNTVDLCAweDM1NUQsIDB4MzU1RSwKKyAgICAweDM1NUYsIDB4MzU2MCwgMHgzNTYxLCAweDM1NjIsIDB4MzU2MywgMHgzNTY0LCAweDM1NjUsIDB4MzU2NiwgMHgzNTY3LAorICAgIDB4MzU2OCwgMHgzNTY5LCAweDM1NkEsIDB4MzU2QiwgMHgzNTZDLCAweDM1NkQsIDB4MzU2RSwgMHgzNTZGLCAweDM1NzAsCisgICAgMHgzNTcxLCAweDM1NzIsIDB4MzU3MywgMHgzNTc0LCAweDM1NzUsIDB4MzU3NiwgMHgzNTc3LCAweDM1NzgsIDB4MzU3OSwKKyAgICAweDM1N0EsIDB4MzU3QiwgMHgzNTdDLCAweDM1N0QsIDB4MzU3RSwgMHgzNTdGLCAweDM1ODAsIDB4MzU4MSwgMHgzNTgyLAorICAgIDB4MzU4MywgMHgzNTg0LCAweDM1ODUsIDB4MzU4NiwgMHgzNTg3LCAweDM1ODgsIDB4MzU4OSwgMHgzNThBLCAweDM1OEIsCisgICAgMHgzNThDLCAweDM1OEQsIDB4MzU4RSwgMHgzNThGLCAweDM1OTAsIDB4MzU5MSwgMHgzNTkyLCAweDM1OTMsIDB4MzU5NCwKKyAgICAweDM1OTUsIDB4MzU5NiwgMHgzNTk3LCAweDM1OTgsIDB4MzU5OSwgMHgzNTlBLCAweDM1OUIsIDB4MzU5QywgMHgzNTlELAorICAgIDB4MzU5RiwgMHgzNUEwLCAweDM1QTEsIDB4MzVBMiwgMHgzNUEzLCAweDM1QTQsIDB4MzVBNSwgMHgzNUE2LCAweDM1QTcsCisgICAgMHgzNUE4LCAweDM1QTksIDB4MzVBQSwgMHgzNUFCLCAweDM1QUMsIDB4MzVBRCwgMHgzNUFFLCAweDM1QUYsIDB4MzVCMCwKKyAgICAweDM1QjEsIDB4MzVCMiwgMHgzNUIzLCAweDM1QjQsIDB4MzVCNSwgMHgzNUI2LCAweDM1QjcsIDB4MzVCOCwgMHgzNUI5LAorICAgIDB4MzVCQSwgMHgzNUJCLCAweDM1QkMsIDB4MzVCRCwgMHgzNUJFLCAweDM1QkYsIDB4MzVDMCwgMHgzNUMxLCAweDM1QzIsCisgICAgMHgzNUMzLCAweDM1QzQsIDB4MzVDNSwgMHgzNUM2LCAweDM1QzcsIDB4MzVDOCwgMHgzNUM5LCAweDM1Q0EsIDB4MzVDQiwKKyAgICAweDM1Q0MsIDB4MzVDRCwgMHgzNUNFLCAweDM1Q0YsIDB4MzVEMCwgMHgzNUQxLCAweDM1RDIsIDB4MzVEMywgMHgzNUQ0LAorICAgIDB4MzVENSwgMHgzNUQ2LCAweDM1RDcsIDB4MzVEOCwgMHgzNUQ5LCAweDM1REEsIDB4MzVEQiwgMHgzNURDLCAweDM1REQsCisgICAgMHgzNURFLCAweDM1REYsIDB4MzVFMCwgMHgzNUUxLCAweDM1RTIsIDB4MzVFMywgMHgzNUU0LCAweDM1RTUsIDB4MzVFNiwKKyAgICAweDM1RTcsIDB4MzVFOCwgMHgzNUU5LCAweDM1RUEsIDB4MzVFQiwgMHgzNUVDLCAweDM1RUQsIDB4MzVFRSwgMHgzNUVGLAorICAgIDB4MzVGMCwgMHgzNUYxLCAweDM1RjIsIDB4MzVGMywgMHgzNUY0LCAweDM1RjUsIDB4MzVGNiwgMHgzNUY3LCAweDM1RjgsCisgICAgMHgzNUY5LCAweDM1RkEsIDB4MzVGQiwgMHgzNUZDLCAweDM1RkQsIDB4MzVGRSwgMHgzNUZGLCAweDM2MDAsIDB4MzYwMSwKKyAgICAweDM2MDIsIDB4MzYwMywgMHgzNjA0LCAweDM2MDUsIDB4MzYwNiwgMHgzNjA3LCAweDM2MDgsIDB4MzYwOSwgMHgzNjBBLAorICAgIDB4MzYwQiwgMHgzNjBDLCAweDM2MEQsIDB4MzYwRiwgMHgzNjEwLCAweDM2MTEsIDB4MzYxMiwgMHgzNjEzLCAweDM2MTQsCisgICAgMHgzNjE1LCAweDM2MTYsIDB4MzYxNywgMHgzNjE4LCAweDM2MTksIDB4MzYxQiwgMHgzNjFDLCAweDM2MUQsIDB4MzYxRSwKKyAgICAweDM2MUYsIDB4MzYyMCwgMHgzNjIxLCAweDM2MjIsIDB4MzYyMywgMHgzNjI0LCAweDM2MjUsIDB4MzYyNiwgMHgzNjI3LAorICAgIDB4MzYyOCwgMHgzNjI5LCAweDM2MkEsIDB4MzYyQiwgMHgzNjJDLCAweDM2MkQsIDB4MzYyRSwgMHgzNjJGLCAweDM2MzAsCisgICAgMHgzNjMxLCAweDM2MzIsIDB4MzYzMywgMHgzNjM0LCAweDM2MzUsIDB4MzYzNiwgMHgzNjM3LCAweDM2MzgsIDB4MzYzOSwKKyAgICAweDM2M0EsIDB4MzYzQiwgMHgzNjNDLCAweDM2M0QsIDB4MzYzRSwgMHgzNjNGLCAweDM2NDAsIDB4MzY0MSwgMHgzNjQyLAorICAgIDB4MzY0MywgMHgzNjQ0LCAweDM2NDUsIDB4MzY0NiwgMHgzNjQ3LCAweDM2NDgsIDB4MzY0OSwgMHgzNjRBLCAweDM2NEIsCisgICAgMHgzNjRDLCAweDM2NEQsIDB4MzY0RSwgMHgzNjRGLCAweDM2NTAsIDB4MzY1MSwgMHgzNjUyLCAweDM2NTMsIDB4MzY1NCwKKyAgICAweDM2NTUsIDB4MzY1NiwgMHgzNjU3LCAweDM2NTgsIDB4MzY1OSwgMHgzNjVBLCAweDM2NUIsIDB4MzY1QywgMHgzNjVELAorICAgIDB4MzY1RSwgMHgzNjVGLCAweDM2NjAsIDB4MzY2MSwgMHgzNjYyLCAweDM2NjMsIDB4MzY2NCwgMHgzNjY1LCAweDM2NjYsCisgICAgMHgzNjY3LCAweDM2NjgsIDB4MzY2OSwgMHgzNjZBLCAweDM2NkIsIDB4MzY2QywgMHgzNjZELCAweDM2NkUsIDB4MzY2RiwKKyAgICAweDM2NzAsIDB4MzY3MSwgMHgzNjcyLCAweDM2NzMsIDB4MzY3NCwgMHgzNjc1LCAweDM2NzYsIDB4MzY3NywgMHgzNjc4LAorICAgIDB4MzY3OSwgMHgzNjdBLCAweDM2N0IsIDB4MzY3QywgMHgzNjdELCAweDM2N0UsIDB4MzY3RiwgMHgzNjgwLCAweDM2ODEsCisgICAgMHgzNjgyLCAweDM2ODMsIDB4MzY4NCwgMHgzNjg1LCAweDM2ODYsIDB4MzY4NywgMHgzNjg4LCAweDM2ODksIDB4MzY4QSwKKyAgICAweDM2OEIsIDB4MzY4QywgMHgzNjhELCAweDM2OEUsIDB4MzY4RiwgMHgzNjkwLCAweDM2OTEsIDB4MzY5MiwgMHgzNjkzLAorICAgIDB4MzY5NCwgMHgzNjk1LCAweDM2OTYsIDB4MzY5NywgMHgzNjk4LCAweDM2OTksIDB4MzY5QSwgMHgzNjlCLCAweDM2OUMsCisgICAgMHgzNjlELCAweDM2OUUsIDB4MzY5RiwgMHgzNkEwLCAweDM2QTEsIDB4MzZBMiwgMHgzNkEzLCAweDM2QTQsIDB4MzZBNSwKKyAgICAweDM2QTYsIDB4MzZBNywgMHgzNkE4LCAweDM2QTksIDB4MzZBQSwgMHgzNkFCLCAweDM2QUMsIDB4MzZBRCwgMHgzNkFFLAorICAgIDB4MzZBRiwgMHgzNkIwLCAweDM2QjEsIDB4MzZCMiwgMHgzNkIzLCAweDM2QjQsIDB4MzZCNSwgMHgzNkI2LCAweDM2QjcsCisgICAgMHgzNkI4LCAweDM2QjksIDB4MzZCQSwgMHgzNkJCLCAweDM2QkMsIDB4MzZCRCwgMHgzNkJFLCAweDM2QkYsIDB4MzZDMCwKKyAgICAweDM2QzEsIDB4MzZDMiwgMHgzNkMzLCAweDM2QzQsIDB4MzZDNSwgMHgzNkM2LCAweDM2QzcsIDB4MzZDOCwgMHgzNkM5LAorICAgIDB4MzZDQSwgMHgzNkNCLCAweDM2Q0MsIDB4MzZDRCwgMHgzNkNFLCAweDM2Q0YsIDB4MzZEMCwgMHgzNkQxLCAweDM2RDIsCisgICAgMHgzNkQzLCAweDM2RDQsIDB4MzZENSwgMHgzNkQ2LCAweDM2RDcsIDB4MzZEOCwgMHgzNkQ5LCAweDM2REEsIDB4MzZEQiwKKyAgICAweDM2REMsIDB4MzZERCwgMHgzNkRFLCAweDM2REYsIDB4MzZFMCwgMHgzNkUxLCAweDM2RTIsIDB4MzZFMywgMHgzNkU0LAorICAgIDB4MzZFNSwgMHgzNkU2LCAweDM2RTcsIDB4MzZFOCwgMHgzNkU5LCAweDM2RUEsIDB4MzZFQiwgMHgzNkVDLCAweDM2RUQsCisgICAgMHgzNkVFLCAweDM2RUYsIDB4MzZGMCwgMHgzNkYxLCAweDM2RjIsIDB4MzZGMywgMHgzNkY0LCAweDM2RjUsIDB4MzZGNiwKKyAgICAweDM2RjcsIDB4MzZGOCwgMHgzNkY5LCAweDM2RkEsIDB4MzZGQiwgMHgzNkZDLCAweDM2RkQsIDB4MzZGRSwgMHgzNkZGLAorICAgIDB4MzcwMCwgMHgzNzAxLCAweDM3MDIsIDB4MzcwMywgMHgzNzA0LCAweDM3MDUsIDB4MzcwNiwgMHgzNzA3LCAweDM3MDgsCisgICAgMHgzNzA5LCAweDM3MEEsIDB4MzcwQiwgMHgzNzBDLCAweDM3MEQsIDB4MzcwRSwgMHgzNzBGLCAweDM3MTAsIDB4MzcxMSwKKyAgICAweDM3MTIsIDB4MzcxMywgMHgzNzE0LCAweDM3MTUsIDB4MzcxNiwgMHgzNzE3LCAweDM3MTgsIDB4MzcxOSwgMHgzNzFBLAorICAgIDB4MzcxQiwgMHgzNzFDLCAweDM3MUQsIDB4MzcxRSwgMHgzNzFGLCAweDM3MjAsIDB4MzcyMSwgMHgzNzIyLCAweDM3MjMsCisgICAgMHgzNzI0LCAweDM3MjUsIDB4MzcyNiwgMHgzNzI3LCAweDM3MjgsIDB4MzcyOSwgMHgzNzJBLCAweDM3MkIsIDB4MzcyQywKKyAgICAweDM3MkQsIDB4MzcyRSwgMHgzNzJGLCAweDM3MzAsIDB4MzczMSwgMHgzNzMyLCAweDM3MzMsIDB4MzczNCwgMHgzNzM1LAorICAgIDB4MzczNiwgMHgzNzM3LCAweDM3MzgsIDB4MzczOSwgMHgzNzNBLCAweDM3M0IsIDB4MzczQywgMHgzNzNELCAweDM3M0UsCisgICAgMHgzNzNGLCAweDM3NDAsIDB4Mzc0MSwgMHgzNzQyLCAweDM3NDMsIDB4Mzc0NCwgMHgzNzQ1LCAweDM3NDYsIDB4Mzc0NywKKyAgICAweDM3NDgsIDB4Mzc0OSwgMHgzNzRBLCAweDM3NEIsIDB4Mzc0QywgMHgzNzRELCAweDM3NEUsIDB4Mzc0RiwgMHgzNzUwLAorICAgIDB4Mzc1MSwgMHgzNzUyLCAweDM3NTMsIDB4Mzc1NCwgMHgzNzU1LCAweDM3NTYsIDB4Mzc1NywgMHgzNzU4LCAweDM3NTksCisgICAgMHgzNzVBLCAweDM3NUIsIDB4Mzc1QywgMHgzNzVELCAweDM3NUUsIDB4Mzc1RiwgMHgzNzYwLCAweDM3NjEsIDB4Mzc2MiwKKyAgICAweDM3NjMsIDB4Mzc2NCwgMHgzNzY1LCAweDM3NjYsIDB4Mzc2NywgMHgzNzY4LCAweDM3NjksIDB4Mzc2QSwgMHgzNzZCLAorICAgIDB4Mzc2QywgMHgzNzZELCAweDM3NkUsIDB4Mzc2RiwgMHgzNzcwLCAweDM3NzEsIDB4Mzc3MiwgMHgzNzczLCAweDM3NzQsCisgICAgMHgzNzc1LCAweDM3NzYsIDB4Mzc3NywgMHgzNzc4LCAweDM3NzksIDB4Mzc3QSwgMHgzNzdCLCAweDM3N0MsIDB4Mzc3RCwKKyAgICAweDM3N0UsIDB4Mzc3RiwgMHgzNzgwLCAweDM3ODEsIDB4Mzc4MiwgMHgzNzgzLCAweDM3ODQsIDB4Mzc4NSwgMHgzNzg2LAorICAgIDB4Mzc4NywgMHgzNzg4LCAweDM3ODksIDB4Mzc4QSwgMHgzNzhCLCAweDM3OEMsIDB4Mzc4RCwgMHgzNzhFLCAweDM3OEYsCisgICAgMHgzNzkwLCAweDM3OTEsIDB4Mzc5MiwgMHgzNzkzLCAweDM3OTQsIDB4Mzc5NSwgMHgzNzk2LCAweDM3OTcsIDB4Mzc5OCwKKyAgICAweDM3OTksIDB4Mzc5QSwgMHgzNzlCLCAweDM3OUMsIDB4Mzc5RCwgMHgzNzlFLCAweDM3OUYsIDB4MzdBMCwgMHgzN0ExLAorICAgIDB4MzdBMiwgMHgzN0EzLCAweDM3QTQsIDB4MzdBNSwgMHgzN0E2LCAweDM3QTcsIDB4MzdBOCwgMHgzN0E5LCAweDM3QUEsCisgICAgMHgzN0FCLCAweDM3QUMsIDB4MzdBRCwgMHgzN0FFLCAweDM3QUYsIDB4MzdCMCwgMHgzN0IxLCAweDM3QjIsIDB4MzdCMywKKyAgICAweDM3QjQsIDB4MzdCNSwgMHgzN0I2LCAweDM3QjcsIDB4MzdCOCwgMHgzN0I5LCAweDM3QkEsIDB4MzdCQiwgMHgzN0JDLAorICAgIDB4MzdCRCwgMHgzN0JFLCAweDM3QkYsIDB4MzdDMCwgMHgzN0MxLCAweDM3QzIsIDB4MzdDMywgMHgzN0M0LCAweDM3QzUsCisgICAgMHgzN0M2LCAweDM3QzcsIDB4MzdDOCwgMHgzN0M5LCAweDM3Q0EsIDB4MzdDQiwgMHgzN0NDLCAweDM3Q0QsIDB4MzdDRSwKKyAgICAweDM3Q0YsIDB4MzdEMCwgMHgzN0QxLCAweDM3RDIsIDB4MzdEMywgMHgzN0Q0LCAweDM3RDUsIDB4MzdENiwgMHgzN0Q3LAorICAgIDB4MzdEOCwgMHgzN0Q5LCAweDM3REEsIDB4MzdEQiwgMHgzN0RDLCAweDM3REQsIDB4MzdERSwgMHgzN0RGLCAweDM3RTAsCisgICAgMHgzN0UxLCAweDM3RTIsIDB4MzdFMywgMHgzN0U0LCAweDM3RTUsIDB4MzdFNiwgMHgzN0U3LCAweDM3RTgsIDB4MzdFOSwKKyAgICAweDM3RUEsIDB4MzdFQiwgMHgzN0VDLCAweDM3RUQsIDB4MzdFRSwgMHgzN0VGLCAweDM3RjAsIDB4MzdGMSwgMHgzN0YyLAorICAgIDB4MzdGMywgMHgzN0Y0LCAweDM3RjUsIDB4MzdGNiwgMHgzN0Y3LCAweDM3RjgsIDB4MzdGOSwgMHgzN0ZBLCAweDM3RkIsCisgICAgMHgzN0ZDLCAweDM3RkQsIDB4MzdGRSwgMHgzN0ZGLCAweDM4MDAsIDB4MzgwMSwgMHgzODAyLCAweDM4MDMsIDB4MzgwNCwKKyAgICAweDM4MDUsIDB4MzgwNiwgMHgzODA3LCAweDM4MDgsIDB4MzgwOSwgMHgzODBBLCAweDM4MEIsIDB4MzgwQywgMHgzODBELAorICAgIDB4MzgwRSwgMHgzODBGLCAweDM4MTAsIDB4MzgxMSwgMHgzODEyLCAweDM4MTMsIDB4MzgxNCwgMHgzODE1LCAweDM4MTYsCisgICAgMHgzODE3LCAweDM4MTgsIDB4MzgxOSwgMHgzODFBLCAweDM4MUIsIDB4MzgxQywgMHgzODFELCAweDM4MUUsIDB4MzgxRiwKKyAgICAweDM4MjAsIDB4MzgyMSwgMHgzODIyLCAweDM4MjMsIDB4MzgyNCwgMHgzODI1LCAweDM4MjYsIDB4MzgyNywgMHgzODI4LAorICAgIDB4MzgyOSwgMHgzODJBLCAweDM4MkIsIDB4MzgyQywgMHgzODJELCAweDM4MkUsIDB4MzgyRiwgMHgzODMwLCAweDM4MzEsCisgICAgMHgzODMyLCAweDM4MzMsIDB4MzgzNCwgMHgzODM1LCAweDM4MzYsIDB4MzgzNywgMHgzODM4LCAweDM4MzksIDB4MzgzQSwKKyAgICAweDM4M0IsIDB4MzgzQywgMHgzODNELCAweDM4M0UsIDB4MzgzRiwgMHgzODQwLCAweDM4NDEsIDB4Mzg0MiwgMHgzODQzLAorICAgIDB4Mzg0NCwgMHgzODQ1LCAweDM4NDYsIDB4Mzg0NywgMHgzODQ4LCAweDM4NDksIDB4Mzg0QSwgMHgzODRCLCAweDM4NEMsCisgICAgMHgzODRELCAweDM4NEUsIDB4Mzg0RiwgMHgzODUwLCAweDM4NTEsIDB4Mzg1MiwgMHgzODUzLCAweDM4NTQsIDB4Mzg1NSwKKyAgICAweDM4NTYsIDB4Mzg1NywgMHgzODU4LCAweDM4NTksIDB4Mzg1QSwgMHgzODVCLCAweDM4NUMsIDB4Mzg1RCwgMHgzODVFLAorICAgIDB4Mzg1RiwgMHgzODYwLCAweDM4NjEsIDB4Mzg2MiwgMHgzODYzLCAweDM4NjQsIDB4Mzg2NSwgMHgzODY2LCAweDM4NjcsCisgICAgMHgzODY4LCAweDM4NjksIDB4Mzg2QSwgMHgzODZCLCAweDM4NkMsIDB4Mzg2RCwgMHgzODZFLCAweDM4NkYsIDB4Mzg3MCwKKyAgICAweDM4NzEsIDB4Mzg3MiwgMHgzODczLCAweDM4NzQsIDB4Mzg3NSwgMHgzODc2LCAweDM4NzcsIDB4Mzg3OCwgMHgzODc5LAorICAgIDB4Mzg3QSwgMHgzODdCLCAweDM4N0MsIDB4Mzg3RCwgMHgzODdFLCAweDM4N0YsIDB4Mzg4MCwgMHgzODgxLCAweDM4ODIsCisgICAgMHgzODgzLCAweDM4ODQsIDB4Mzg4NSwgMHgzODg2LCAweDM4ODcsIDB4Mzg4OCwgMHgzODg5LCAweDM4OEEsIDB4Mzg4QiwKKyAgICAweDM4OEMsIDB4Mzg4RCwgMHgzODhFLCAweDM4OEYsIDB4Mzg5MCwgMHgzODkxLCAweDM4OTIsIDB4Mzg5MywgMHgzODk0LAorICAgIDB4Mzg5NSwgMHgzODk2LCAweDM4OTcsIDB4Mzg5OCwgMHgzODk5LCAweDM4OUEsIDB4Mzg5QiwgMHgzODlDLCAweDM4OUQsCisgICAgMHgzODlFLCAweDM4OUYsIDB4MzhBMCwgMHgzOEExLCAweDM4QTIsIDB4MzhBMywgMHgzOEE0LCAweDM4QTUsIDB4MzhBNiwKKyAgICAweDM4QTcsIDB4MzhBOCwgMHgzOEE5LCAweDM4QUEsIDB4MzhBQiwgMHgzOEFDLCAweDM4QUQsIDB4MzhBRSwgMHgzOEFGLAorICAgIDB4MzhCMCwgMHgzOEIxLCAweDM4QjIsIDB4MzhCMywgMHgzOEI0LCAweDM4QjUsIDB4MzhCNiwgMHgzOEI3LCAweDM4QjgsCisgICAgMHgzOEI5LCAweDM4QkEsIDB4MzhCQiwgMHgzOEJDLCAweDM4QkQsIDB4MzhCRSwgMHgzOEJGLCAweDM4QzAsIDB4MzhDMSwKKyAgICAweDM4QzIsIDB4MzhDMywgMHgzOEM0LCAweDM4QzUsIDB4MzhDNiwgMHgzOEM3LCAweDM4QzgsIDB4MzhDOSwgMHgzOENBLAorICAgIDB4MzhDQiwgMHgzOENDLCAweDM4Q0QsIDB4MzhDRSwgMHgzOENGLCAweDM4RDAsIDB4MzhEMSwgMHgzOEQyLCAweDM4RDMsCisgICAgMHgzOEQ0LCAweDM4RDUsIDB4MzhENiwgMHgzOEQ3LCAweDM4RDgsIDB4MzhEOSwgMHgzOERBLCAweDM4REIsIDB4MzhEQywKKyAgICAweDM4REQsIDB4MzhERSwgMHgzOERGLCAweDM4RTAsIDB4MzhFMSwgMHgzOEUyLCAweDM4RTMsIDB4MzhFNCwgMHgzOEU1LAorICAgIDB4MzhFNiwgMHgzOEU3LCAweDM4RTgsIDB4MzhFOSwgMHgzOEVBLCAweDM4RUIsIDB4MzhFQywgMHgzOEVELCAweDM4RUUsCisgICAgMHgzOEVGLCAweDM4RjAsIDB4MzhGMSwgMHgzOEYyLCAweDM4RjMsIDB4MzhGNCwgMHgzOEY1LCAweDM4RjYsIDB4MzhGNywKKyAgICAweDM4RjgsIDB4MzhGOSwgMHgzOEZBLCAweDM4RkIsIDB4MzhGQywgMHgzOEZELCAweDM4RkUsIDB4MzhGRiwgMHgzOTAwLAorICAgIDB4MzkwMSwgMHgzOTAyLCAweDM5MDMsIDB4MzkwNCwgMHgzOTA1LCAweDM5MDYsIDB4MzkwNywgMHgzOTA4LCAweDM5MDksCisgICAgMHgzOTBBLCAweDM5MEIsIDB4MzkwQywgMHgzOTBELCAweDM5MEUsIDB4MzkwRiwgMHgzOTEwLCAweDM5MTEsIDB4MzkxMiwKKyAgICAweDM5MTMsIDB4MzkxNCwgMHgzOTE1LCAweDM5MTYsIDB4MzkxNywgMHgzOTE5LCAweDM5MUEsIDB4MzkxQiwgMHgzOTFDLAorICAgIDB4MzkxRCwgMHgzOTFFLCAweDM5MUYsIDB4MzkyMCwgMHgzOTIxLCAweDM5MjIsIDB4MzkyMywgMHgzOTI0LCAweDM5MjUsCisgICAgMHgzOTI2LCAweDM5MjcsIDB4MzkyOCwgMHgzOTI5LCAweDM5MkEsIDB4MzkyQiwgMHgzOTJDLCAweDM5MkQsIDB4MzkyRSwKKyAgICAweDM5MkYsIDB4MzkzMCwgMHgzOTMxLCAweDM5MzIsIDB4MzkzMywgMHgzOTM0LCAweDM5MzUsIDB4MzkzNiwgMHgzOTM3LAorICAgIDB4MzkzOCwgMHgzOTM5LCAweDM5M0EsIDB4MzkzQiwgMHgzOTNDLCAweDM5M0QsIDB4MzkzRSwgMHgzOTNGLCAweDM5NDAsCisgICAgMHgzOTQxLCAweDM5NDIsIDB4Mzk0MywgMHgzOTQ0LCAweDM5NDUsIDB4Mzk0NiwgMHgzOTQ3LCAweDM5NDgsIDB4Mzk0OSwKKyAgICAweDM5NEEsIDB4Mzk0QiwgMHgzOTRDLCAweDM5NEQsIDB4Mzk0RSwgMHgzOTRGLCAweDM5NTAsIDB4Mzk1MSwgMHgzOTUyLAorICAgIDB4Mzk1MywgMHgzOTU0LCAweDM5NTUsIDB4Mzk1NiwgMHgzOTU3LCAweDM5NTgsIDB4Mzk1OSwgMHgzOTVBLCAweDM5NUIsCisgICAgMHgzOTVDLCAweDM5NUQsIDB4Mzk1RSwgMHgzOTVGLCAweDM5NjAsIDB4Mzk2MSwgMHgzOTYyLCAweDM5NjMsIDB4Mzk2NCwKKyAgICAweDM5NjUsIDB4Mzk2NiwgMHgzOTY3LCAweDM5NjgsIDB4Mzk2OSwgMHgzOTZBLCAweDM5NkIsIDB4Mzk2QywgMHgzOTZELAorICAgIDB4Mzk2RiwgMHgzOTcwLCAweDM5NzEsIDB4Mzk3MiwgMHgzOTczLCAweDM5NzQsIDB4Mzk3NSwgMHgzOTc2LCAweDM5NzcsCisgICAgMHgzOTc4LCAweDM5NzksIDB4Mzk3QSwgMHgzOTdCLCAweDM5N0MsIDB4Mzk3RCwgMHgzOTdFLCAweDM5N0YsIDB4Mzk4MCwKKyAgICAweDM5ODEsIDB4Mzk4MiwgMHgzOTgzLCAweDM5ODQsIDB4Mzk4NSwgMHgzOTg2LCAweDM5ODcsIDB4Mzk4OCwgMHgzOTg5LAorICAgIDB4Mzk4QSwgMHgzOThCLCAweDM5OEMsIDB4Mzk4RCwgMHgzOThFLCAweDM5OEYsIDB4Mzk5MCwgMHgzOTkxLCAweDM5OTIsCisgICAgMHgzOTkzLCAweDM5OTQsIDB4Mzk5NSwgMHgzOTk2LCAweDM5OTcsIDB4Mzk5OCwgMHgzOTk5LCAweDM5OUEsIDB4Mzk5QiwKKyAgICAweDM5OUMsIDB4Mzk5RCwgMHgzOTlFLCAweDM5OUYsIDB4MzlBMCwgMHgzOUExLCAweDM5QTIsIDB4MzlBMywgMHgzOUE0LAorICAgIDB4MzlBNSwgMHgzOUE2LCAweDM5QTcsIDB4MzlBOCwgMHgzOUE5LCAweDM5QUEsIDB4MzlBQiwgMHgzOUFDLCAweDM5QUQsCisgICAgMHgzOUFFLCAweDM5QUYsIDB4MzlCMCwgMHgzOUIxLCAweDM5QjIsIDB4MzlCMywgMHgzOUI0LCAweDM5QjUsIDB4MzlCNiwKKyAgICAweDM5QjcsIDB4MzlCOCwgMHgzOUI5LCAweDM5QkEsIDB4MzlCQiwgMHgzOUJDLCAweDM5QkQsIDB4MzlCRSwgMHgzOUJGLAorICAgIDB4MzlDMCwgMHgzOUMxLCAweDM5QzIsIDB4MzlDMywgMHgzOUM0LCAweDM5QzUsIDB4MzlDNiwgMHgzOUM3LCAweDM5QzgsCisgICAgMHgzOUM5LCAweDM5Q0EsIDB4MzlDQiwgMHgzOUNDLCAweDM5Q0QsIDB4MzlDRSwgMHgzOUQxLCAweDM5RDIsIDB4MzlEMywKKyAgICAweDM5RDQsIDB4MzlENSwgMHgzOUQ2LCAweDM5RDcsIDB4MzlEOCwgMHgzOUQ5LCAweDM5REEsIDB4MzlEQiwgMHgzOURDLAorICAgIDB4MzlERCwgMHgzOURFLCAweDM5RTAsIDB4MzlFMSwgMHgzOUUyLCAweDM5RTMsIDB4MzlFNCwgMHgzOUU1LCAweDM5RTYsCisgICAgMHgzOUU3LCAweDM5RTgsIDB4MzlFOSwgMHgzOUVBLCAweDM5RUIsIDB4MzlFQywgMHgzOUVELCAweDM5RUUsIDB4MzlFRiwKKyAgICAweDM5RjAsIDB4MzlGMSwgMHgzOUYyLCAweDM5RjMsIDB4MzlGNCwgMHgzOUY1LCAweDM5RjYsIDB4MzlGNywgMHgzOUY4LAorICAgIDB4MzlGOSwgMHgzOUZBLCAweDM5RkIsIDB4MzlGQywgMHgzOUZELCAweDM5RkUsIDB4MzlGRiwgMHgzQTAwLCAweDNBMDEsCisgICAgMHgzQTAyLCAweDNBMDMsIDB4M0EwNCwgMHgzQTA1LCAweDNBMDYsIDB4M0EwNywgMHgzQTA4LCAweDNBMDksIDB4M0EwQSwKKyAgICAweDNBMEIsIDB4M0EwQywgMHgzQTBELCAweDNBMEUsIDB4M0EwRiwgMHgzQTEwLCAweDNBMTEsIDB4M0ExMiwgMHgzQTEzLAorICAgIDB4M0ExNCwgMHgzQTE1LCAweDNBMTYsIDB4M0ExNywgMHgzQTE4LCAweDNBMTksIDB4M0ExQSwgMHgzQTFCLCAweDNBMUMsCisgICAgMHgzQTFELCAweDNBMUUsIDB4M0ExRiwgMHgzQTIwLCAweDNBMjEsIDB4M0EyMiwgMHgzQTIzLCAweDNBMjQsIDB4M0EyNSwKKyAgICAweDNBMjYsIDB4M0EyNywgMHgzQTI4LCAweDNBMjksIDB4M0EyQSwgMHgzQTJCLCAweDNBMkMsIDB4M0EyRCwgMHgzQTJFLAorICAgIDB4M0EyRiwgMHgzQTMwLCAweDNBMzEsIDB4M0EzMiwgMHgzQTMzLCAweDNBMzQsIDB4M0EzNSwgMHgzQTM2LCAweDNBMzcsCisgICAgMHgzQTM4LCAweDNBMzksIDB4M0EzQSwgMHgzQTNCLCAweDNBM0MsIDB4M0EzRCwgMHgzQTNFLCAweDNBM0YsIDB4M0E0MCwKKyAgICAweDNBNDEsIDB4M0E0MiwgMHgzQTQzLCAweDNBNDQsIDB4M0E0NSwgMHgzQTQ2LCAweDNBNDcsIDB4M0E0OCwgMHgzQTQ5LAorICAgIDB4M0E0QSwgMHgzQTRCLCAweDNBNEMsIDB4M0E0RCwgMHgzQTRFLCAweDNBNEYsIDB4M0E1MCwgMHgzQTUxLCAweDNBNTIsCisgICAgMHgzQTUzLCAweDNBNTQsIDB4M0E1NSwgMHgzQTU2LCAweDNBNTcsIDB4M0E1OCwgMHgzQTU5LCAweDNBNUEsIDB4M0E1QiwKKyAgICAweDNBNUMsIDB4M0E1RCwgMHgzQTVFLCAweDNBNUYsIDB4M0E2MCwgMHgzQTYxLCAweDNBNjIsIDB4M0E2MywgMHgzQTY0LAorICAgIDB4M0E2NSwgMHgzQTY2LCAweDNBNjcsIDB4M0E2OCwgMHgzQTY5LCAweDNBNkEsIDB4M0E2QiwgMHgzQTZDLCAweDNBNkQsCisgICAgMHgzQTZFLCAweDNBNkYsIDB4M0E3MCwgMHgzQTcxLCAweDNBNzIsIDB4M0E3NCwgMHgzQTc1LCAweDNBNzYsIDB4M0E3NywKKyAgICAweDNBNzgsIDB4M0E3OSwgMHgzQTdBLCAweDNBN0IsIDB4M0E3QywgMHgzQTdELCAweDNBN0UsIDB4M0E3RiwgMHgzQTgwLAorICAgIDB4M0E4MSwgMHgzQTgyLCAweDNBODMsIDB4M0E4NCwgMHgzQTg1LCAweDNBODYsIDB4M0E4NywgMHgzQTg4LCAweDNBODksCisgICAgMHgzQThBLCAweDNBOEIsIDB4M0E4QywgMHgzQThELCAweDNBOEUsIDB4M0E4RiwgMHgzQTkwLCAweDNBOTEsIDB4M0E5MiwKKyAgICAweDNBOTMsIDB4M0E5NCwgMHgzQTk1LCAweDNBOTYsIDB4M0E5NywgMHgzQTk4LCAweDNBOTksIDB4M0E5QSwgMHgzQTlCLAorICAgIDB4M0E5QywgMHgzQTlELCAweDNBOUUsIDB4M0E5RiwgMHgzQUEwLCAweDNBQTEsIDB4M0FBMiwgMHgzQUEzLCAweDNBQTQsCisgICAgMHgzQUE1LCAweDNBQTYsIDB4M0FBNywgMHgzQUE4LCAweDNBQTksIDB4M0FBQSwgMHgzQUFCLCAweDNBQUMsIDB4M0FBRCwKKyAgICAweDNBQUUsIDB4M0FBRiwgMHgzQUIwLCAweDNBQjEsIDB4M0FCMiwgMHgzQUIzLCAweDNBQjQsIDB4M0FCNSwgMHgzQUI2LAorICAgIDB4M0FCNywgMHgzQUI4LCAweDNBQjksIDB4M0FCQSwgMHgzQUJCLCAweDNBQkMsIDB4M0FCRCwgMHgzQUJFLCAweDNBQkYsCisgICAgMHgzQUMwLCAweDNBQzEsIDB4M0FDMiwgMHgzQUMzLCAweDNBQzQsIDB4M0FDNSwgMHgzQUM2LCAweDNBQzcsIDB4M0FDOCwKKyAgICAweDNBQzksIDB4M0FDQSwgMHgzQUNCLCAweDNBQ0MsIDB4M0FDRCwgMHgzQUNFLCAweDNBQ0YsIDB4M0FEMCwgMHgzQUQxLAorICAgIDB4M0FEMiwgMHgzQUQzLCAweDNBRDQsIDB4M0FENSwgMHgzQUQ2LCAweDNBRDcsIDB4M0FEOCwgMHgzQUQ5LCAweDNBREEsCisgICAgMHgzQURCLCAweDNBREMsIDB4M0FERCwgMHgzQURFLCAweDNBREYsIDB4M0FFMCwgMHgzQUUxLCAweDNBRTIsIDB4M0FFMywKKyAgICAweDNBRTQsIDB4M0FFNSwgMHgzQUU2LCAweDNBRTcsIDB4M0FFOCwgMHgzQUU5LCAweDNBRUEsIDB4M0FFQiwgMHgzQUVDLAorICAgIDB4M0FFRCwgMHgzQUVFLCAweDNBRUYsIDB4M0FGMCwgMHgzQUYxLCAweDNBRjIsIDB4M0FGMywgMHgzQUY0LCAweDNBRjUsCisgICAgMHgzQUY2LCAweDNBRjcsIDB4M0FGOCwgMHgzQUY5LCAweDNBRkEsIDB4M0FGQiwgMHgzQUZDLCAweDNBRkQsIDB4M0FGRSwKKyAgICAweDNBRkYsIDB4M0IwMCwgMHgzQjAxLCAweDNCMDIsIDB4M0IwMywgMHgzQjA0LCAweDNCMDUsIDB4M0IwNiwgMHgzQjA3LAorICAgIDB4M0IwOCwgMHgzQjA5LCAweDNCMEEsIDB4M0IwQiwgMHgzQjBDLCAweDNCMEQsIDB4M0IwRSwgMHgzQjBGLCAweDNCMTAsCisgICAgMHgzQjExLCAweDNCMTIsIDB4M0IxMywgMHgzQjE0LCAweDNCMTUsIDB4M0IxNiwgMHgzQjE3LCAweDNCMTgsIDB4M0IxOSwKKyAgICAweDNCMUEsIDB4M0IxQiwgMHgzQjFDLCAweDNCMUQsIDB4M0IxRSwgMHgzQjFGLCAweDNCMjAsIDB4M0IyMSwgMHgzQjIyLAorICAgIDB4M0IyMywgMHgzQjI0LCAweDNCMjUsIDB4M0IyNiwgMHgzQjI3LCAweDNCMjgsIDB4M0IyOSwgMHgzQjJBLCAweDNCMkIsCisgICAgMHgzQjJDLCAweDNCMkQsIDB4M0IyRSwgMHgzQjJGLCAweDNCMzAsIDB4M0IzMSwgMHgzQjMyLCAweDNCMzMsIDB4M0IzNCwKKyAgICAweDNCMzUsIDB4M0IzNiwgMHgzQjM3LCAweDNCMzgsIDB4M0IzOSwgMHgzQjNBLCAweDNCM0IsIDB4M0IzQywgMHgzQjNELAorICAgIDB4M0IzRSwgMHgzQjNGLCAweDNCNDAsIDB4M0I0MSwgMHgzQjQyLCAweDNCNDMsIDB4M0I0NCwgMHgzQjQ1LCAweDNCNDYsCisgICAgMHgzQjQ3LCAweDNCNDgsIDB4M0I0OSwgMHgzQjRBLCAweDNCNEIsIDB4M0I0QywgMHgzQjRELCAweDNCNEYsIDB4M0I1MCwKKyAgICAweDNCNTEsIDB4M0I1MiwgMHgzQjUzLCAweDNCNTQsIDB4M0I1NSwgMHgzQjU2LCAweDNCNTcsIDB4M0I1OCwgMHgzQjU5LAorICAgIDB4M0I1QSwgMHgzQjVCLCAweDNCNUMsIDB4M0I1RCwgMHgzQjVFLCAweDNCNUYsIDB4M0I2MCwgMHgzQjYxLCAweDNCNjIsCisgICAgMHgzQjYzLCAweDNCNjQsIDB4M0I2NSwgMHgzQjY2LCAweDNCNjcsIDB4M0I2OCwgMHgzQjY5LCAweDNCNkEsIDB4M0I2QiwKKyAgICAweDNCNkMsIDB4M0I2RCwgMHgzQjZFLCAweDNCNkYsIDB4M0I3MCwgMHgzQjcxLCAweDNCNzIsIDB4M0I3MywgMHgzQjc0LAorICAgIDB4M0I3NSwgMHgzQjc2LCAweDNCNzcsIDB4M0I3OCwgMHgzQjc5LCAweDNCN0EsIDB4M0I3QiwgMHgzQjdDLCAweDNCN0QsCisgICAgMHgzQjdFLCAweDNCN0YsIDB4M0I4MCwgMHgzQjgxLCAweDNCODIsIDB4M0I4MywgMHgzQjg0LCAweDNCODUsIDB4M0I4NiwKKyAgICAweDNCODcsIDB4M0I4OCwgMHgzQjg5LCAweDNCOEEsIDB4M0I4QiwgMHgzQjhDLCAweDNCOEQsIDB4M0I4RSwgMHgzQjhGLAorICAgIDB4M0I5MCwgMHgzQjkxLCAweDNCOTIsIDB4M0I5MywgMHgzQjk0LCAweDNCOTUsIDB4M0I5NiwgMHgzQjk3LCAweDNCOTgsCisgICAgMHgzQjk5LCAweDNCOUEsIDB4M0I5QiwgMHgzQjlDLCAweDNCOUQsIDB4M0I5RSwgMHgzQjlGLCAweDNCQTAsIDB4M0JBMSwKKyAgICAweDNCQTIsIDB4M0JBMywgMHgzQkE0LCAweDNCQTUsIDB4M0JBNiwgMHgzQkE3LCAweDNCQTgsIDB4M0JBOSwgMHgzQkFBLAorICAgIDB4M0JBQiwgMHgzQkFDLCAweDNCQUQsIDB4M0JBRSwgMHgzQkFGLCAweDNCQjAsIDB4M0JCMSwgMHgzQkIyLCAweDNCQjMsCisgICAgMHgzQkI0LCAweDNCQjUsIDB4M0JCNiwgMHgzQkI3LCAweDNCQjgsIDB4M0JCOSwgMHgzQkJBLCAweDNCQkIsIDB4M0JCQywKKyAgICAweDNCQkQsIDB4M0JCRSwgMHgzQkJGLCAweDNCQzAsIDB4M0JDMSwgMHgzQkMyLCAweDNCQzMsIDB4M0JDNCwgMHgzQkM1LAorICAgIDB4M0JDNiwgMHgzQkM3LCAweDNCQzgsIDB4M0JDOSwgMHgzQkNBLCAweDNCQ0IsIDB4M0JDQywgMHgzQkNELCAweDNCQ0UsCisgICAgMHgzQkNGLCAweDNCRDAsIDB4M0JEMSwgMHgzQkQyLCAweDNCRDMsIDB4M0JENCwgMHgzQkQ1LCAweDNCRDYsIDB4M0JENywKKyAgICAweDNCRDgsIDB4M0JEOSwgMHgzQkRBLCAweDNCREIsIDB4M0JEQywgMHgzQkRELCAweDNCREUsIDB4M0JERiwgMHgzQkUwLAorICAgIDB4M0JFMSwgMHgzQkUyLCAweDNCRTMsIDB4M0JFNCwgMHgzQkU1LCAweDNCRTYsIDB4M0JFNywgMHgzQkU4LCAweDNCRTksCisgICAgMHgzQkVBLCAweDNCRUIsIDB4M0JFQywgMHgzQkVELCAweDNCRUUsIDB4M0JFRiwgMHgzQkYwLCAweDNCRjEsIDB4M0JGMiwKKyAgICAweDNCRjMsIDB4M0JGNCwgMHgzQkY1LCAweDNCRjYsIDB4M0JGNywgMHgzQkY4LCAweDNCRjksIDB4M0JGQSwgMHgzQkZCLAorICAgIDB4M0JGQywgMHgzQkZELCAweDNCRkUsIDB4M0JGRiwgMHgzQzAwLCAweDNDMDEsIDB4M0MwMiwgMHgzQzAzLCAweDNDMDQsCisgICAgMHgzQzA1LCAweDNDMDYsIDB4M0MwNywgMHgzQzA4LCAweDNDMDksIDB4M0MwQSwgMHgzQzBCLCAweDNDMEMsIDB4M0MwRCwKKyAgICAweDNDMEUsIDB4M0MwRiwgMHgzQzEwLCAweDNDMTEsIDB4M0MxMiwgMHgzQzEzLCAweDNDMTQsIDB4M0MxNSwgMHgzQzE2LAorICAgIDB4M0MxNywgMHgzQzE4LCAweDNDMTksIDB4M0MxQSwgMHgzQzFCLCAweDNDMUMsIDB4M0MxRCwgMHgzQzFFLCAweDNDMUYsCisgICAgMHgzQzIwLCAweDNDMjEsIDB4M0MyMiwgMHgzQzIzLCAweDNDMjQsIDB4M0MyNSwgMHgzQzI2LCAweDNDMjcsIDB4M0MyOCwKKyAgICAweDNDMjksIDB4M0MyQSwgMHgzQzJCLCAweDNDMkMsIDB4M0MyRCwgMHgzQzJFLCAweDNDMkYsIDB4M0MzMCwgMHgzQzMxLAorICAgIDB4M0MzMiwgMHgzQzMzLCAweDNDMzQsIDB4M0MzNSwgMHgzQzM2LCAweDNDMzcsIDB4M0MzOCwgMHgzQzM5LCAweDNDM0EsCisgICAgMHgzQzNCLCAweDNDM0MsIDB4M0MzRCwgMHgzQzNFLCAweDNDM0YsIDB4M0M0MCwgMHgzQzQxLCAweDNDNDIsIDB4M0M0MywKKyAgICAweDNDNDQsIDB4M0M0NSwgMHgzQzQ2LCAweDNDNDcsIDB4M0M0OCwgMHgzQzQ5LCAweDNDNEEsIDB4M0M0QiwgMHgzQzRDLAorICAgIDB4M0M0RCwgMHgzQzRFLCAweDNDNEYsIDB4M0M1MCwgMHgzQzUxLCAweDNDNTIsIDB4M0M1MywgMHgzQzU0LCAweDNDNTUsCisgICAgMHgzQzU2LCAweDNDNTcsIDB4M0M1OCwgMHgzQzU5LCAweDNDNUEsIDB4M0M1QiwgMHgzQzVDLCAweDNDNUQsIDB4M0M1RSwKKyAgICAweDNDNUYsIDB4M0M2MCwgMHgzQzYxLCAweDNDNjIsIDB4M0M2MywgMHgzQzY0LCAweDNDNjUsIDB4M0M2NiwgMHgzQzY3LAorICAgIDB4M0M2OCwgMHgzQzY5LCAweDNDNkEsIDB4M0M2QiwgMHgzQzZDLCAweDNDNkQsIDB4M0M2RiwgMHgzQzcwLCAweDNDNzEsCisgICAgMHgzQzcyLCAweDNDNzMsIDB4M0M3NCwgMHgzQzc1LCAweDNDNzYsIDB4M0M3NywgMHgzQzc4LCAweDNDNzksIDB4M0M3QSwKKyAgICAweDNDN0IsIDB4M0M3QywgMHgzQzdELCAweDNDN0UsIDB4M0M3RiwgMHgzQzgwLCAweDNDODEsIDB4M0M4MiwgMHgzQzgzLAorICAgIDB4M0M4NCwgMHgzQzg1LCAweDNDODYsIDB4M0M4NywgMHgzQzg4LCAweDNDODksIDB4M0M4QSwgMHgzQzhCLCAweDNDOEMsCisgICAgMHgzQzhELCAweDNDOEUsIDB4M0M4RiwgMHgzQzkwLCAweDNDOTEsIDB4M0M5MiwgMHgzQzkzLCAweDNDOTQsIDB4M0M5NSwKKyAgICAweDNDOTYsIDB4M0M5NywgMHgzQzk4LCAweDNDOTksIDB4M0M5QSwgMHgzQzlCLCAweDNDOUMsIDB4M0M5RCwgMHgzQzlFLAorICAgIDB4M0M5RiwgMHgzQ0EwLCAweDNDQTEsIDB4M0NBMiwgMHgzQ0EzLCAweDNDQTQsIDB4M0NBNSwgMHgzQ0E2LCAweDNDQTcsCisgICAgMHgzQ0E4LCAweDNDQTksIDB4M0NBQSwgMHgzQ0FCLCAweDNDQUMsIDB4M0NBRCwgMHgzQ0FFLCAweDNDQUYsIDB4M0NCMCwKKyAgICAweDNDQjEsIDB4M0NCMiwgMHgzQ0IzLCAweDNDQjQsIDB4M0NCNSwgMHgzQ0I2LCAweDNDQjcsIDB4M0NCOCwgMHgzQ0I5LAorICAgIDB4M0NCQSwgMHgzQ0JCLCAweDNDQkMsIDB4M0NCRCwgMHgzQ0JFLCAweDNDQkYsIDB4M0NDMCwgMHgzQ0MxLCAweDNDQzIsCisgICAgMHgzQ0MzLCAweDNDQzQsIDB4M0NDNSwgMHgzQ0M2LCAweDNDQzcsIDB4M0NDOCwgMHgzQ0M5LCAweDNDQ0EsIDB4M0NDQiwKKyAgICAweDNDQ0MsIDB4M0NDRCwgMHgzQ0NFLCAweDNDQ0YsIDB4M0NEMCwgMHgzQ0QxLCAweDNDRDIsIDB4M0NEMywgMHgzQ0Q0LAorICAgIDB4M0NENSwgMHgzQ0Q2LCAweDNDRDcsIDB4M0NEOCwgMHgzQ0Q5LCAweDNDREEsIDB4M0NEQiwgMHgzQ0RDLCAweDNDREQsCisgICAgMHgzQ0RFLCAweDNDREYsIDB4M0NFMSwgMHgzQ0UyLCAweDNDRTMsIDB4M0NFNCwgMHgzQ0U1LCAweDNDRTYsIDB4M0NFNywKKyAgICAweDNDRTgsIDB4M0NFOSwgMHgzQ0VBLCAweDNDRUIsIDB4M0NFQywgMHgzQ0VELCAweDNDRUUsIDB4M0NFRiwgMHgzQ0YwLAorICAgIDB4M0NGMSwgMHgzQ0YyLCAweDNDRjMsIDB4M0NGNCwgMHgzQ0Y1LCAweDNDRjYsIDB4M0NGNywgMHgzQ0Y4LCAweDNDRjksCisgICAgMHgzQ0ZBLCAweDNDRkIsIDB4M0NGQywgMHgzQ0ZELCAweDNDRkUsIDB4M0NGRiwgMHgzRDAwLCAweDNEMDEsIDB4M0QwMiwKKyAgICAweDNEMDMsIDB4M0QwNCwgMHgzRDA1LCAweDNEMDYsIDB4M0QwNywgMHgzRDA4LCAweDNEMDksIDB4M0QwQSwgMHgzRDBCLAorICAgIDB4M0QwQywgMHgzRDBELCAweDNEMEUsIDB4M0QwRiwgMHgzRDEwLCAweDNEMTEsIDB4M0QxMiwgMHgzRDEzLCAweDNEMTQsCisgICAgMHgzRDE1LCAweDNEMTYsIDB4M0QxNywgMHgzRDE4LCAweDNEMTksIDB4M0QxQSwgMHgzRDFCLCAweDNEMUMsIDB4M0QxRCwKKyAgICAweDNEMUUsIDB4M0QxRiwgMHgzRDIwLCAweDNEMjEsIDB4M0QyMiwgMHgzRDIzLCAweDNEMjQsIDB4M0QyNSwgMHgzRDI2LAorICAgIDB4M0QyNywgMHgzRDI4LCAweDNEMjksIDB4M0QyQSwgMHgzRDJCLCAweDNEMkMsIDB4M0QyRCwgMHgzRDJFLCAweDNEMkYsCisgICAgMHgzRDMwLCAweDNEMzEsIDB4M0QzMiwgMHgzRDMzLCAweDNEMzQsIDB4M0QzNSwgMHgzRDM2LCAweDNEMzcsIDB4M0QzOCwKKyAgICAweDNEMzksIDB4M0QzQSwgMHgzRDNCLCAweDNEM0MsIDB4M0QzRCwgMHgzRDNFLCAweDNEM0YsIDB4M0Q0MCwgMHgzRDQxLAorICAgIDB4M0Q0MiwgMHgzRDQzLCAweDNENDQsIDB4M0Q0NSwgMHgzRDQ2LCAweDNENDcsIDB4M0Q0OCwgMHgzRDQ5LCAweDNENEEsCisgICAgMHgzRDRCLCAweDNENEMsIDB4M0Q0RCwgMHgzRDRFLCAweDNENEYsIDB4M0Q1MCwgMHgzRDUxLCAweDNENTIsIDB4M0Q1MywKKyAgICAweDNENTQsIDB4M0Q1NSwgMHgzRDU2LCAweDNENTcsIDB4M0Q1OCwgMHgzRDU5LCAweDNENUEsIDB4M0Q1QiwgMHgzRDVDLAorICAgIDB4M0Q1RCwgMHgzRDVFLCAweDNENUYsIDB4M0Q2MCwgMHgzRDYxLCAweDNENjIsIDB4M0Q2MywgMHgzRDY0LCAweDNENjUsCisgICAgMHgzRDY2LCAweDNENjcsIDB4M0Q2OCwgMHgzRDY5LCAweDNENkEsIDB4M0Q2QiwgMHgzRDZDLCAweDNENkQsIDB4M0Q2RSwKKyAgICAweDNENkYsIDB4M0Q3MCwgMHgzRDcxLCAweDNENzIsIDB4M0Q3MywgMHgzRDc0LCAweDNENzUsIDB4M0Q3NiwgMHgzRDc3LAorICAgIDB4M0Q3OCwgMHgzRDc5LCAweDNEN0EsIDB4M0Q3QiwgMHgzRDdDLCAweDNEN0QsIDB4M0Q3RSwgMHgzRDdGLCAweDNEODAsCisgICAgMHgzRDgxLCAweDNEODIsIDB4M0Q4MywgMHgzRDg0LCAweDNEODUsIDB4M0Q4NiwgMHgzRDg3LCAweDNEODgsIDB4M0Q4OSwKKyAgICAweDNEOEEsIDB4M0Q4QiwgMHgzRDhDLCAweDNEOEQsIDB4M0Q4RSwgMHgzRDhGLCAweDNEOTAsIDB4M0Q5MSwgMHgzRDkyLAorICAgIDB4M0Q5MywgMHgzRDk0LCAweDNEOTUsIDB4M0Q5NiwgMHgzRDk3LCAweDNEOTgsIDB4M0Q5OSwgMHgzRDlBLCAweDNEOUIsCisgICAgMHgzRDlDLCAweDNEOUQsIDB4M0Q5RSwgMHgzRDlGLCAweDNEQTAsIDB4M0RBMSwgMHgzREEyLCAweDNEQTMsIDB4M0RBNCwKKyAgICAweDNEQTUsIDB4M0RBNiwgMHgzREE3LCAweDNEQTgsIDB4M0RBOSwgMHgzREFBLCAweDNEQUIsIDB4M0RBQywgMHgzREFELAorICAgIDB4M0RBRSwgMHgzREFGLCAweDNEQjAsIDB4M0RCMSwgMHgzREIyLCAweDNEQjMsIDB4M0RCNCwgMHgzREI1LCAweDNEQjYsCisgICAgMHgzREI3LCAweDNEQjgsIDB4M0RCOSwgMHgzREJBLCAweDNEQkIsIDB4M0RCQywgMHgzREJELCAweDNEQkUsIDB4M0RCRiwKKyAgICAweDNEQzAsIDB4M0RDMSwgMHgzREMyLCAweDNEQzMsIDB4M0RDNCwgMHgzREM1LCAweDNEQzYsIDB4M0RDNywgMHgzREM4LAorICAgIDB4M0RDOSwgMHgzRENBLCAweDNEQ0IsIDB4M0RDQywgMHgzRENELCAweDNEQ0UsIDB4M0RDRiwgMHgzREQwLCAweDNERDEsCisgICAgMHgzREQyLCAweDNERDMsIDB4M0RENCwgMHgzREQ1LCAweDNERDYsIDB4M0RENywgMHgzREQ4LCAweDNERDksIDB4M0REQSwKKyAgICAweDNEREIsIDB4M0REQywgMHgzRERELCAweDNEREUsIDB4M0RERiwgMHgzREUwLCAweDNERTEsIDB4M0RFMiwgMHgzREUzLAorICAgIDB4M0RFNCwgMHgzREU1LCAweDNERTYsIDB4M0RFNywgMHgzREU4LCAweDNERTksIDB4M0RFQSwgMHgzREVCLCAweDNERUMsCisgICAgMHgzREVELCAweDNERUUsIDB4M0RFRiwgMHgzREYwLCAweDNERjEsIDB4M0RGMiwgMHgzREYzLCAweDNERjQsIDB4M0RGNSwKKyAgICAweDNERjYsIDB4M0RGNywgMHgzREY4LCAweDNERjksIDB4M0RGQSwgMHgzREZCLCAweDNERkMsIDB4M0RGRCwgMHgzREZFLAorICAgIDB4M0RGRiwgMHgzRTAwLCAweDNFMDEsIDB4M0UwMiwgMHgzRTAzLCAweDNFMDQsIDB4M0UwNSwgMHgzRTA2LCAweDNFMDcsCisgICAgMHgzRTA4LCAweDNFMDksIDB4M0UwQSwgMHgzRTBCLCAweDNFMEMsIDB4M0UwRCwgMHgzRTBFLCAweDNFMEYsIDB4M0UxMCwKKyAgICAweDNFMTEsIDB4M0UxMiwgMHgzRTEzLCAweDNFMTQsIDB4M0UxNSwgMHgzRTE2LCAweDNFMTcsIDB4M0UxOCwgMHgzRTE5LAorICAgIDB4M0UxQSwgMHgzRTFCLCAweDNFMUMsIDB4M0UxRCwgMHgzRTFFLCAweDNFMUYsIDB4M0UyMCwgMHgzRTIxLCAweDNFMjIsCisgICAgMHgzRTIzLCAweDNFMjQsIDB4M0UyNSwgMHgzRTI2LCAweDNFMjcsIDB4M0UyOCwgMHgzRTI5LCAweDNFMkEsIDB4M0UyQiwKKyAgICAweDNFMkMsIDB4M0UyRCwgMHgzRTJFLCAweDNFMkYsIDB4M0UzMCwgMHgzRTMxLCAweDNFMzIsIDB4M0UzMywgMHgzRTM0LAorICAgIDB4M0UzNSwgMHgzRTM2LCAweDNFMzcsIDB4M0UzOCwgMHgzRTM5LCAweDNFM0EsIDB4M0UzQiwgMHgzRTNDLCAweDNFM0QsCisgICAgMHgzRTNFLCAweDNFM0YsIDB4M0U0MCwgMHgzRTQxLCAweDNFNDIsIDB4M0U0MywgMHgzRTQ0LCAweDNFNDUsIDB4M0U0NiwKKyAgICAweDNFNDcsIDB4M0U0OCwgMHgzRTQ5LCAweDNFNEEsIDB4M0U0QiwgMHgzRTRDLCAweDNFNEQsIDB4M0U0RSwgMHgzRTRGLAorICAgIDB4M0U1MCwgMHgzRTUxLCAweDNFNTIsIDB4M0U1MywgMHgzRTU0LCAweDNFNTUsIDB4M0U1NiwgMHgzRTU3LCAweDNFNTgsCisgICAgMHgzRTU5LCAweDNFNUEsIDB4M0U1QiwgMHgzRTVDLCAweDNFNUQsIDB4M0U1RSwgMHgzRTVGLCAweDNFNjAsIDB4M0U2MSwKKyAgICAweDNFNjIsIDB4M0U2MywgMHgzRTY0LCAweDNFNjUsIDB4M0U2NiwgMHgzRTY3LCAweDNFNjgsIDB4M0U2OSwgMHgzRTZBLAorICAgIDB4M0U2QiwgMHgzRTZDLCAweDNFNkQsIDB4M0U2RSwgMHgzRTZGLCAweDNFNzAsIDB4M0U3MSwgMHgzRTcyLCAweDNFNzMsCisgICAgMHgzRTc0LCAweDNFNzUsIDB4M0U3NiwgMHgzRTc3LCAweDNFNzgsIDB4M0U3OSwgMHgzRTdBLCAweDNFN0IsIDB4M0U3QywKKyAgICAweDNFN0QsIDB4M0U3RSwgMHgzRTdGLCAweDNFODAsIDB4M0U4MSwgMHgzRTgyLCAweDNFODMsIDB4M0U4NCwgMHgzRTg1LAorICAgIDB4M0U4NiwgMHgzRTg3LCAweDNFODgsIDB4M0U4OSwgMHgzRThBLCAweDNFOEIsIDB4M0U4QywgMHgzRThELCAweDNFOEUsCisgICAgMHgzRThGLCAweDNFOTAsIDB4M0U5MSwgMHgzRTkyLCAweDNFOTMsIDB4M0U5NCwgMHgzRTk1LCAweDNFOTYsIDB4M0U5NywKKyAgICAweDNFOTgsIDB4M0U5OSwgMHgzRTlBLCAweDNFOUIsIDB4M0U5QywgMHgzRTlELCAweDNFOUUsIDB4M0U5RiwgMHgzRUEwLAorICAgIDB4M0VBMSwgMHgzRUEyLCAweDNFQTMsIDB4M0VBNCwgMHgzRUE1LCAweDNFQTYsIDB4M0VBNywgMHgzRUE4LCAweDNFQTksCisgICAgMHgzRUFBLCAweDNFQUIsIDB4M0VBQywgMHgzRUFELCAweDNFQUUsIDB4M0VBRiwgMHgzRUIwLCAweDNFQjEsIDB4M0VCMiwKKyAgICAweDNFQjMsIDB4M0VCNCwgMHgzRUI1LCAweDNFQjYsIDB4M0VCNywgMHgzRUI4LCAweDNFQjksIDB4M0VCQSwgMHgzRUJCLAorICAgIDB4M0VCQywgMHgzRUJELCAweDNFQkUsIDB4M0VCRiwgMHgzRUMwLCAweDNFQzEsIDB4M0VDMiwgMHgzRUMzLCAweDNFQzQsCisgICAgMHgzRUM1LCAweDNFQzYsIDB4M0VDNywgMHgzRUM4LCAweDNFQzksIDB4M0VDQSwgMHgzRUNCLCAweDNFQ0MsIDB4M0VDRCwKKyAgICAweDNFQ0UsIDB4M0VDRiwgMHgzRUQwLCAweDNFRDEsIDB4M0VEMiwgMHgzRUQzLCAweDNFRDQsIDB4M0VENSwgMHgzRUQ2LAorICAgIDB4M0VENywgMHgzRUQ4LCAweDNFRDksIDB4M0VEQSwgMHgzRURCLCAweDNFREMsIDB4M0VERCwgMHgzRURFLCAweDNFREYsCisgICAgMHgzRUUwLCAweDNFRTEsIDB4M0VFMiwgMHgzRUUzLCAweDNFRTQsIDB4M0VFNSwgMHgzRUU2LCAweDNFRTcsIDB4M0VFOCwKKyAgICAweDNFRTksIDB4M0VFQSwgMHgzRUVCLCAweDNFRUMsIDB4M0VFRCwgMHgzRUVFLCAweDNFRUYsIDB4M0VGMCwgMHgzRUYxLAorICAgIDB4M0VGMiwgMHgzRUYzLCAweDNFRjQsIDB4M0VGNSwgMHgzRUY2LCAweDNFRjcsIDB4M0VGOCwgMHgzRUY5LCAweDNFRkEsCisgICAgMHgzRUZCLCAweDNFRkMsIDB4M0VGRCwgMHgzRUZFLCAweDNFRkYsIDB4M0YwMCwgMHgzRjAxLCAweDNGMDIsIDB4M0YwMywKKyAgICAweDNGMDQsIDB4M0YwNSwgMHgzRjA2LCAweDNGMDcsIDB4M0YwOCwgMHgzRjA5LCAweDNGMEEsIDB4M0YwQiwgMHgzRjBDLAorICAgIDB4M0YwRCwgMHgzRjBFLCAweDNGMEYsIDB4M0YxMCwgMHgzRjExLCAweDNGMTIsIDB4M0YxMywgMHgzRjE0LCAweDNGMTUsCisgICAgMHgzRjE2LCAweDNGMTcsIDB4M0YxOCwgMHgzRjE5LCAweDNGMUEsIDB4M0YxQiwgMHgzRjFDLCAweDNGMUQsIDB4M0YxRSwKKyAgICAweDNGMUYsIDB4M0YyMCwgMHgzRjIxLCAweDNGMjIsIDB4M0YyMywgMHgzRjI0LCAweDNGMjUsIDB4M0YyNiwgMHgzRjI3LAorICAgIDB4M0YyOCwgMHgzRjI5LCAweDNGMkEsIDB4M0YyQiwgMHgzRjJDLCAweDNGMkQsIDB4M0YyRSwgMHgzRjJGLCAweDNGMzAsCisgICAgMHgzRjMxLCAweDNGMzIsIDB4M0YzMywgMHgzRjM0LCAweDNGMzUsIDB4M0YzNiwgMHgzRjM3LCAweDNGMzgsIDB4M0YzOSwKKyAgICAweDNGM0EsIDB4M0YzQiwgMHgzRjNDLCAweDNGM0QsIDB4M0YzRSwgMHgzRjNGLCAweDNGNDAsIDB4M0Y0MSwgMHgzRjQyLAorICAgIDB4M0Y0MywgMHgzRjQ0LCAweDNGNDUsIDB4M0Y0NiwgMHgzRjQ3LCAweDNGNDgsIDB4M0Y0OSwgMHgzRjRBLCAweDNGNEIsCisgICAgMHgzRjRDLCAweDNGNEQsIDB4M0Y0RSwgMHgzRjRGLCAweDNGNTAsIDB4M0Y1MSwgMHgzRjUyLCAweDNGNTMsIDB4M0Y1NCwKKyAgICAweDNGNTUsIDB4M0Y1NiwgMHgzRjU3LCAweDNGNTgsIDB4M0Y1OSwgMHgzRjVBLCAweDNGNUIsIDB4M0Y1QywgMHgzRjVELAorICAgIDB4M0Y1RSwgMHgzRjVGLCAweDNGNjAsIDB4M0Y2MSwgMHgzRjYyLCAweDNGNjMsIDB4M0Y2NCwgMHgzRjY1LCAweDNGNjYsCisgICAgMHgzRjY3LCAweDNGNjgsIDB4M0Y2OSwgMHgzRjZBLCAweDNGNkIsIDB4M0Y2QywgMHgzRjZELCAweDNGNkUsIDB4M0Y2RiwKKyAgICAweDNGNzAsIDB4M0Y3MSwgMHgzRjcyLCAweDNGNzMsIDB4M0Y3NCwgMHgzRjc1LCAweDNGNzYsIDB4M0Y3NywgMHgzRjc4LAorICAgIDB4M0Y3OSwgMHgzRjdBLCAweDNGN0IsIDB4M0Y3QywgMHgzRjdELCAweDNGN0UsIDB4M0Y3RiwgMHgzRjgwLCAweDNGODEsCisgICAgMHgzRjgyLCAweDNGODMsIDB4M0Y4NCwgMHgzRjg1LCAweDNGODYsIDB4M0Y4NywgMHgzRjg4LCAweDNGODksIDB4M0Y4QSwKKyAgICAweDNGOEIsIDB4M0Y4QywgMHgzRjhELCAweDNGOEUsIDB4M0Y4RiwgMHgzRjkwLCAweDNGOTEsIDB4M0Y5MiwgMHgzRjkzLAorICAgIDB4M0Y5NCwgMHgzRjk1LCAweDNGOTYsIDB4M0Y5NywgMHgzRjk4LCAweDNGOTksIDB4M0Y5QSwgMHgzRjlCLCAweDNGOUMsCisgICAgMHgzRjlELCAweDNGOUUsIDB4M0Y5RiwgMHgzRkEwLCAweDNGQTEsIDB4M0ZBMiwgMHgzRkEzLCAweDNGQTQsIDB4M0ZBNSwKKyAgICAweDNGQTYsIDB4M0ZBNywgMHgzRkE4LCAweDNGQTksIDB4M0ZBQSwgMHgzRkFCLCAweDNGQUMsIDB4M0ZBRCwgMHgzRkFFLAorICAgIDB4M0ZBRiwgMHgzRkIwLCAweDNGQjEsIDB4M0ZCMiwgMHgzRkIzLCAweDNGQjQsIDB4M0ZCNSwgMHgzRkI2LCAweDNGQjcsCisgICAgMHgzRkI4LCAweDNGQjksIDB4M0ZCQSwgMHgzRkJCLCAweDNGQkMsIDB4M0ZCRCwgMHgzRkJFLCAweDNGQkYsIDB4M0ZDMCwKKyAgICAweDNGQzEsIDB4M0ZDMiwgMHgzRkMzLCAweDNGQzQsIDB4M0ZDNSwgMHgzRkM2LCAweDNGQzcsIDB4M0ZDOCwgMHgzRkM5LAorICAgIDB4M0ZDQSwgMHgzRkNCLCAweDNGQ0MsIDB4M0ZDRCwgMHgzRkNFLCAweDNGQ0YsIDB4M0ZEMCwgMHgzRkQxLCAweDNGRDIsCisgICAgMHgzRkQzLCAweDNGRDQsIDB4M0ZENSwgMHgzRkQ2LCAweDNGRDcsIDB4M0ZEOCwgMHgzRkQ5LCAweDNGREEsIDB4M0ZEQiwKKyAgICAweDNGREMsIDB4M0ZERCwgMHgzRkRFLCAweDNGREYsIDB4M0ZFMCwgMHgzRkUxLCAweDNGRTIsIDB4M0ZFMywgMHgzRkU0LAorICAgIDB4M0ZFNSwgMHgzRkU2LCAweDNGRTcsIDB4M0ZFOCwgMHgzRkU5LCAweDNGRUEsIDB4M0ZFQiwgMHgzRkVDLCAweDNGRUQsCisgICAgMHgzRkVFLCAweDNGRUYsIDB4M0ZGMCwgMHgzRkYxLCAweDNGRjIsIDB4M0ZGMywgMHgzRkY0LCAweDNGRjUsIDB4M0ZGNiwKKyAgICAweDNGRjcsIDB4M0ZGOCwgMHgzRkY5LCAweDNGRkEsIDB4M0ZGQiwgMHgzRkZDLCAweDNGRkQsIDB4M0ZGRSwgMHgzRkZGLAorICAgIDB4NDAwMCwgMHg0MDAxLCAweDQwMDIsIDB4NDAwMywgMHg0MDA0LCAweDQwMDUsIDB4NDAwNiwgMHg0MDA3LCAweDQwMDgsCisgICAgMHg0MDA5LCAweDQwMEEsIDB4NDAwQiwgMHg0MDBDLCAweDQwMEQsIDB4NDAwRSwgMHg0MDBGLCAweDQwMTAsIDB4NDAxMSwKKyAgICAweDQwMTIsIDB4NDAxMywgMHg0MDE0LCAweDQwMTUsIDB4NDAxNiwgMHg0MDE3LCAweDQwMTgsIDB4NDAxOSwgMHg0MDFBLAorICAgIDB4NDAxQiwgMHg0MDFDLCAweDQwMUQsIDB4NDAxRSwgMHg0MDFGLCAweDQwMjAsIDB4NDAyMSwgMHg0MDIyLCAweDQwMjMsCisgICAgMHg0MDI0LCAweDQwMjUsIDB4NDAyNiwgMHg0MDI3LCAweDQwMjgsIDB4NDAyOSwgMHg0MDJBLCAweDQwMkIsIDB4NDAyQywKKyAgICAweDQwMkQsIDB4NDAyRSwgMHg0MDJGLCAweDQwMzAsIDB4NDAzMSwgMHg0MDMyLCAweDQwMzMsIDB4NDAzNCwgMHg0MDM1LAorICAgIDB4NDAzNiwgMHg0MDM3LCAweDQwMzgsIDB4NDAzOSwgMHg0MDNBLCAweDQwM0IsIDB4NDAzQywgMHg0MDNELCAweDQwM0UsCisgICAgMHg0MDNGLCAweDQwNDAsIDB4NDA0MSwgMHg0MDQyLCAweDQwNDMsIDB4NDA0NCwgMHg0MDQ1LCAweDQwNDYsIDB4NDA0NywKKyAgICAweDQwNDgsIDB4NDA0OSwgMHg0MDRBLCAweDQwNEIsIDB4NDA0QywgMHg0MDRELCAweDQwNEUsIDB4NDA0RiwgMHg0MDUwLAorICAgIDB4NDA1MSwgMHg0MDUyLCAweDQwNTMsIDB4NDA1NCwgMHg0MDU1LCAweDQwNTcsIDB4NDA1OCwgMHg0MDU5LCAweDQwNUEsCisgICAgMHg0MDVCLCAweDQwNUMsIDB4NDA1RCwgMHg0MDVFLCAweDQwNUYsIDB4NDA2MCwgMHg0MDYxLCAweDQwNjIsIDB4NDA2MywKKyAgICAweDQwNjQsIDB4NDA2NSwgMHg0MDY2LCAweDQwNjcsIDB4NDA2OCwgMHg0MDY5LCAweDQwNkEsIDB4NDA2QiwgMHg0MDZDLAorICAgIDB4NDA2RCwgMHg0MDZFLCAweDQwNkYsIDB4NDA3MCwgMHg0MDcxLCAweDQwNzIsIDB4NDA3MywgMHg0MDc0LCAweDQwNzUsCisgICAgMHg0MDc2LCAweDQwNzcsIDB4NDA3OCwgMHg0MDc5LCAweDQwN0EsIDB4NDA3QiwgMHg0MDdDLCAweDQwN0QsIDB4NDA3RSwKKyAgICAweDQwN0YsIDB4NDA4MCwgMHg0MDgxLCAweDQwODIsIDB4NDA4MywgMHg0MDg0LCAweDQwODUsIDB4NDA4NiwgMHg0MDg3LAorICAgIDB4NDA4OCwgMHg0MDg5LCAweDQwOEEsIDB4NDA4QiwgMHg0MDhDLCAweDQwOEQsIDB4NDA4RSwgMHg0MDhGLCAweDQwOTAsCisgICAgMHg0MDkxLCAweDQwOTIsIDB4NDA5MywgMHg0MDk0LCAweDQwOTUsIDB4NDA5NiwgMHg0MDk3LCAweDQwOTgsIDB4NDA5OSwKKyAgICAweDQwOUEsIDB4NDA5QiwgMHg0MDlDLCAweDQwOUQsIDB4NDA5RSwgMHg0MDlGLCAweDQwQTAsIDB4NDBBMSwgMHg0MEEyLAorICAgIDB4NDBBMywgMHg0MEE0LCAweDQwQTUsIDB4NDBBNiwgMHg0MEE3LCAweDQwQTgsIDB4NDBBOSwgMHg0MEFBLCAweDQwQUIsCisgICAgMHg0MEFDLCAweDQwQUQsIDB4NDBBRSwgMHg0MEFGLCAweDQwQjAsIDB4NDBCMSwgMHg0MEIyLCAweDQwQjMsIDB4NDBCNCwKKyAgICAweDQwQjUsIDB4NDBCNiwgMHg0MEI3LCAweDQwQjgsIDB4NDBCOSwgMHg0MEJBLCAweDQwQkIsIDB4NDBCQywgMHg0MEJELAorICAgIDB4NDBCRSwgMHg0MEJGLCAweDQwQzAsIDB4NDBDMSwgMHg0MEMyLCAweDQwQzMsIDB4NDBDNCwgMHg0MEM1LCAweDQwQzYsCisgICAgMHg0MEM3LCAweDQwQzgsIDB4NDBDOSwgMHg0MENBLCAweDQwQ0IsIDB4NDBDQywgMHg0MENELCAweDQwQ0UsIDB4NDBDRiwKKyAgICAweDQwRDAsIDB4NDBEMSwgMHg0MEQyLCAweDQwRDMsIDB4NDBENCwgMHg0MEQ1LCAweDQwRDYsIDB4NDBENywgMHg0MEQ4LAorICAgIDB4NDBEOSwgMHg0MERBLCAweDQwREIsIDB4NDBEQywgMHg0MERELCAweDQwREUsIDB4NDBERiwgMHg0MEUwLCAweDQwRTEsCisgICAgMHg0MEUyLCAweDQwRTMsIDB4NDBFNCwgMHg0MEU1LCAweDQwRTYsIDB4NDBFNywgMHg0MEU4LCAweDQwRTksIDB4NDBFQSwKKyAgICAweDQwRUIsIDB4NDBFQywgMHg0MEVELCAweDQwRUUsIDB4NDBFRiwgMHg0MEYwLCAweDQwRjEsIDB4NDBGMiwgMHg0MEYzLAorICAgIDB4NDBGNCwgMHg0MEY1LCAweDQwRjYsIDB4NDBGNywgMHg0MEY4LCAweDQwRjksIDB4NDBGQSwgMHg0MEZCLCAweDQwRkMsCisgICAgMHg0MEZELCAweDQwRkUsIDB4NDBGRiwgMHg0MTAwLCAweDQxMDEsIDB4NDEwMiwgMHg0MTAzLCAweDQxMDQsIDB4NDEwNSwKKyAgICAweDQxMDYsIDB4NDEwNywgMHg0MTA4LCAweDQxMDksIDB4NDEwQSwgMHg0MTBCLCAweDQxMEMsIDB4NDEwRCwgMHg0MTBFLAorICAgIDB4NDEwRiwgMHg0MTEwLCAweDQxMTEsIDB4NDExMiwgMHg0MTEzLCAweDQxMTQsIDB4NDExNSwgMHg0MTE2LCAweDQxMTcsCisgICAgMHg0MTE4LCAweDQxMTksIDB4NDExQSwgMHg0MTFCLCAweDQxMUMsIDB4NDExRCwgMHg0MTFFLCAweDQxMUYsIDB4NDEyMCwKKyAgICAweDQxMjEsIDB4NDEyMiwgMHg0MTIzLCAweDQxMjQsIDB4NDEyNSwgMHg0MTI2LCAweDQxMjcsIDB4NDEyOCwgMHg0MTI5LAorICAgIDB4NDEyQSwgMHg0MTJCLCAweDQxMkMsIDB4NDEyRCwgMHg0MTJFLCAweDQxMkYsIDB4NDEzMCwgMHg0MTMxLCAweDQxMzIsCisgICAgMHg0MTMzLCAweDQxMzQsIDB4NDEzNSwgMHg0MTM2LCAweDQxMzcsIDB4NDEzOCwgMHg0MTM5LCAweDQxM0EsIDB4NDEzQiwKKyAgICAweDQxM0MsIDB4NDEzRCwgMHg0MTNFLCAweDQxM0YsIDB4NDE0MCwgMHg0MTQxLCAweDQxNDIsIDB4NDE0MywgMHg0MTQ0LAorICAgIDB4NDE0NSwgMHg0MTQ2LCAweDQxNDcsIDB4NDE0OCwgMHg0MTQ5LCAweDQxNEEsIDB4NDE0QiwgMHg0MTRDLCAweDQxNEQsCisgICAgMHg0MTRFLCAweDQxNEYsIDB4NDE1MCwgMHg0MTUxLCAweDQxNTIsIDB4NDE1MywgMHg0MTU0LCAweDQxNTUsIDB4NDE1NiwKKyAgICAweDQxNTcsIDB4NDE1OCwgMHg0MTU5LCAweDQxNUEsIDB4NDE1QiwgMHg0MTVDLCAweDQxNUQsIDB4NDE1RSwgMHg0MTYwLAorICAgIDB4NDE2MSwgMHg0MTYyLCAweDQxNjMsIDB4NDE2NCwgMHg0MTY1LCAweDQxNjYsIDB4NDE2NywgMHg0MTY4LCAweDQxNjksCisgICAgMHg0MTZBLCAweDQxNkIsIDB4NDE2QywgMHg0MTZELCAweDQxNkUsIDB4NDE2RiwgMHg0MTcwLCAweDQxNzEsIDB4NDE3MiwKKyAgICAweDQxNzMsIDB4NDE3NCwgMHg0MTc1LCAweDQxNzYsIDB4NDE3NywgMHg0MTc4LCAweDQxNzksIDB4NDE3QSwgMHg0MTdCLAorICAgIDB4NDE3QywgMHg0MTdELCAweDQxN0UsIDB4NDE3RiwgMHg0MTgwLCAweDQxODEsIDB4NDE4MiwgMHg0MTgzLCAweDQxODQsCisgICAgMHg0MTg1LCAweDQxODYsIDB4NDE4NywgMHg0MTg4LCAweDQxODksIDB4NDE4QSwgMHg0MThCLCAweDQxOEMsIDB4NDE4RCwKKyAgICAweDQxOEUsIDB4NDE4RiwgMHg0MTkwLCAweDQxOTEsIDB4NDE5MiwgMHg0MTkzLCAweDQxOTQsIDB4NDE5NSwgMHg0MTk2LAorICAgIDB4NDE5NywgMHg0MTk4LCAweDQxOTksIDB4NDE5QSwgMHg0MTlCLCAweDQxOUMsIDB4NDE5RCwgMHg0MTlFLCAweDQxOUYsCisgICAgMHg0MUEwLCAweDQxQTEsIDB4NDFBMiwgMHg0MUEzLCAweDQxQTQsIDB4NDFBNSwgMHg0MUE2LCAweDQxQTcsIDB4NDFBOCwKKyAgICAweDQxQTksIDB4NDFBQSwgMHg0MUFCLCAweDQxQUMsIDB4NDFBRCwgMHg0MUFFLCAweDQxQUYsIDB4NDFCMCwgMHg0MUIxLAorICAgIDB4NDFCMiwgMHg0MUIzLCAweDQxQjQsIDB4NDFCNSwgMHg0MUI2LCAweDQxQjcsIDB4NDFCOCwgMHg0MUI5LCAweDQxQkEsCisgICAgMHg0MUJCLCAweDQxQkMsIDB4NDFCRCwgMHg0MUJFLCAweDQxQkYsIDB4NDFDMCwgMHg0MUMxLCAweDQxQzIsIDB4NDFDMywKKyAgICAweDQxQzQsIDB4NDFDNSwgMHg0MUM2LCAweDQxQzcsIDB4NDFDOCwgMHg0MUM5LCAweDQxQ0EsIDB4NDFDQiwgMHg0MUNDLAorICAgIDB4NDFDRCwgMHg0MUNFLCAweDQxQ0YsIDB4NDFEMCwgMHg0MUQxLCAweDQxRDIsIDB4NDFEMywgMHg0MUQ0LCAweDQxRDUsCisgICAgMHg0MUQ2LCAweDQxRDcsIDB4NDFEOCwgMHg0MUQ5LCAweDQxREEsIDB4NDFEQiwgMHg0MURDLCAweDQxREQsIDB4NDFERSwKKyAgICAweDQxREYsIDB4NDFFMCwgMHg0MUUxLCAweDQxRTIsIDB4NDFFMywgMHg0MUU0LCAweDQxRTUsIDB4NDFFNiwgMHg0MUU3LAorICAgIDB4NDFFOCwgMHg0MUU5LCAweDQxRUEsIDB4NDFFQiwgMHg0MUVDLCAweDQxRUQsIDB4NDFFRSwgMHg0MUVGLCAweDQxRjAsCisgICAgMHg0MUYxLCAweDQxRjIsIDB4NDFGMywgMHg0MUY0LCAweDQxRjUsIDB4NDFGNiwgMHg0MUY3LCAweDQxRjgsIDB4NDFGOSwKKyAgICAweDQxRkEsIDB4NDFGQiwgMHg0MUZDLCAweDQxRkQsIDB4NDFGRSwgMHg0MUZGLCAweDQyMDAsIDB4NDIwMSwgMHg0MjAyLAorICAgIDB4NDIwMywgMHg0MjA0LCAweDQyMDUsIDB4NDIwNiwgMHg0MjA3LCAweDQyMDgsIDB4NDIwOSwgMHg0MjBBLCAweDQyMEIsCisgICAgMHg0MjBDLCAweDQyMEQsIDB4NDIwRSwgMHg0MjBGLCAweDQyMTAsIDB4NDIxMSwgMHg0MjEyLCAweDQyMTMsIDB4NDIxNCwKKyAgICAweDQyMTUsIDB4NDIxNiwgMHg0MjE3LCAweDQyMTgsIDB4NDIxOSwgMHg0MjFBLCAweDQyMUIsIDB4NDIxQywgMHg0MjFELAorICAgIDB4NDIxRSwgMHg0MjFGLCAweDQyMjAsIDB4NDIyMSwgMHg0MjIyLCAweDQyMjMsIDB4NDIyNCwgMHg0MjI1LCAweDQyMjYsCisgICAgMHg0MjI3LCAweDQyMjgsIDB4NDIyOSwgMHg0MjJBLCAweDQyMkIsIDB4NDIyQywgMHg0MjJELCAweDQyMkUsIDB4NDIyRiwKKyAgICAweDQyMzAsIDB4NDIzMSwgMHg0MjMyLCAweDQyMzMsIDB4NDIzNCwgMHg0MjM1LCAweDQyMzYsIDB4NDIzNywgMHg0MjM4LAorICAgIDB4NDIzOSwgMHg0MjNBLCAweDQyM0IsIDB4NDIzQywgMHg0MjNELCAweDQyM0UsIDB4NDIzRiwgMHg0MjQwLCAweDQyNDEsCisgICAgMHg0MjQyLCAweDQyNDMsIDB4NDI0NCwgMHg0MjQ1LCAweDQyNDYsIDB4NDI0NywgMHg0MjQ4LCAweDQyNDksIDB4NDI0QSwKKyAgICAweDQyNEIsIDB4NDI0QywgMHg0MjRELCAweDQyNEUsIDB4NDI0RiwgMHg0MjUwLCAweDQyNTEsIDB4NDI1MiwgMHg0MjUzLAorICAgIDB4NDI1NCwgMHg0MjU1LCAweDQyNTYsIDB4NDI1NywgMHg0MjU4LCAweDQyNTksIDB4NDI1QSwgMHg0MjVCLCAweDQyNUMsCisgICAgMHg0MjVELCAweDQyNUUsIDB4NDI1RiwgMHg0MjYwLCAweDQyNjEsIDB4NDI2MiwgMHg0MjYzLCAweDQyNjQsIDB4NDI2NSwKKyAgICAweDQyNjYsIDB4NDI2NywgMHg0MjY4LCAweDQyNjksIDB4NDI2QSwgMHg0MjZCLCAweDQyNkMsIDB4NDI2RCwgMHg0MjZFLAorICAgIDB4NDI2RiwgMHg0MjcwLCAweDQyNzEsIDB4NDI3MiwgMHg0MjczLCAweDQyNzQsIDB4NDI3NSwgMHg0Mjc2LCAweDQyNzcsCisgICAgMHg0Mjc4LCAweDQyNzksIDB4NDI3QSwgMHg0MjdCLCAweDQyN0MsIDB4NDI3RCwgMHg0MjdFLCAweDQyN0YsIDB4NDI4MCwKKyAgICAweDQyODEsIDB4NDI4MiwgMHg0MjgzLCAweDQyODQsIDB4NDI4NSwgMHg0Mjg2LCAweDQyODcsIDB4NDI4OCwgMHg0Mjg5LAorICAgIDB4NDI4QSwgMHg0MjhCLCAweDQyOEMsIDB4NDI4RCwgMHg0MjhFLCAweDQyOEYsIDB4NDI5MCwgMHg0MjkxLCAweDQyOTIsCisgICAgMHg0MjkzLCAweDQyOTQsIDB4NDI5NSwgMHg0Mjk2LCAweDQyOTcsIDB4NDI5OCwgMHg0Mjk5LCAweDQyOUEsIDB4NDI5QiwKKyAgICAweDQyOUMsIDB4NDI5RCwgMHg0MjlFLCAweDQyOUYsIDB4NDJBMCwgMHg0MkExLCAweDQyQTIsIDB4NDJBMywgMHg0MkE0LAorICAgIDB4NDJBNSwgMHg0MkE2LCAweDQyQTcsIDB4NDJBOCwgMHg0MkE5LCAweDQyQUEsIDB4NDJBQiwgMHg0MkFDLCAweDQyQUQsCisgICAgMHg0MkFFLCAweDQyQUYsIDB4NDJCMCwgMHg0MkIxLCAweDQyQjIsIDB4NDJCMywgMHg0MkI0LCAweDQyQjUsIDB4NDJCNiwKKyAgICAweDQyQjcsIDB4NDJCOCwgMHg0MkI5LCAweDQyQkEsIDB4NDJCQiwgMHg0MkJDLCAweDQyQkQsIDB4NDJCRSwgMHg0MkJGLAorICAgIDB4NDJDMCwgMHg0MkMxLCAweDQyQzIsIDB4NDJDMywgMHg0MkM0LCAweDQyQzUsIDB4NDJDNiwgMHg0MkM3LCAweDQyQzgsCisgICAgMHg0MkM5LCAweDQyQ0EsIDB4NDJDQiwgMHg0MkNDLCAweDQyQ0QsIDB4NDJDRSwgMHg0MkNGLCAweDQyRDAsIDB4NDJEMSwKKyAgICAweDQyRDIsIDB4NDJEMywgMHg0MkQ0LCAweDQyRDUsIDB4NDJENiwgMHg0MkQ3LCAweDQyRDgsIDB4NDJEOSwgMHg0MkRBLAorICAgIDB4NDJEQiwgMHg0MkRDLCAweDQyREQsIDB4NDJERSwgMHg0MkRGLCAweDQyRTAsIDB4NDJFMSwgMHg0MkUyLCAweDQyRTMsCisgICAgMHg0MkU0LCAweDQyRTUsIDB4NDJFNiwgMHg0MkU3LCAweDQyRTgsIDB4NDJFOSwgMHg0MkVBLCAweDQyRUIsIDB4NDJFQywKKyAgICAweDQyRUQsIDB4NDJFRSwgMHg0MkVGLCAweDQyRjAsIDB4NDJGMSwgMHg0MkYyLCAweDQyRjMsIDB4NDJGNCwgMHg0MkY1LAorICAgIDB4NDJGNiwgMHg0MkY3LCAweDQyRjgsIDB4NDJGOSwgMHg0MkZBLCAweDQyRkIsIDB4NDJGQywgMHg0MkZELCAweDQyRkUsCisgICAgMHg0MkZGLCAweDQzMDAsIDB4NDMwMSwgMHg0MzAyLCAweDQzMDMsIDB4NDMwNCwgMHg0MzA1LCAweDQzMDYsIDB4NDMwNywKKyAgICAweDQzMDgsIDB4NDMwOSwgMHg0MzBBLCAweDQzMEIsIDB4NDMwQywgMHg0MzBELCAweDQzMEUsIDB4NDMwRiwgMHg0MzEwLAorICAgIDB4NDMxMSwgMHg0MzEyLCAweDQzMTMsIDB4NDMxNCwgMHg0MzE1LCAweDQzMTYsIDB4NDMxNywgMHg0MzE4LCAweDQzMTksCisgICAgMHg0MzFBLCAweDQzMUIsIDB4NDMxQywgMHg0MzFELCAweDQzMUUsIDB4NDMxRiwgMHg0MzIwLCAweDQzMjEsIDB4NDMyMiwKKyAgICAweDQzMjMsIDB4NDMyNCwgMHg0MzI1LCAweDQzMjYsIDB4NDMyNywgMHg0MzI4LCAweDQzMjksIDB4NDMyQSwgMHg0MzJCLAorICAgIDB4NDMyQywgMHg0MzJELCAweDQzMkUsIDB4NDMyRiwgMHg0MzMwLCAweDQzMzEsIDB4NDMzMiwgMHg0MzMzLCAweDQzMzQsCisgICAgMHg0MzM1LCAweDQzMzYsIDB4NDMzOCwgMHg0MzM5LCAweDQzM0EsIDB4NDMzQiwgMHg0MzNDLCAweDQzM0QsIDB4NDMzRSwKKyAgICAweDQzM0YsIDB4NDM0MCwgMHg0MzQxLCAweDQzNDIsIDB4NDM0MywgMHg0MzQ0LCAweDQzNDUsIDB4NDM0NiwgMHg0MzQ3LAorICAgIDB4NDM0OCwgMHg0MzQ5LCAweDQzNEEsIDB4NDM0QiwgMHg0MzRDLCAweDQzNEQsIDB4NDM0RSwgMHg0MzRGLCAweDQzNTAsCisgICAgMHg0MzUxLCAweDQzNTIsIDB4NDM1MywgMHg0MzU0LCAweDQzNTUsIDB4NDM1NiwgMHg0MzU3LCAweDQzNTgsIDB4NDM1OSwKKyAgICAweDQzNUEsIDB4NDM1QiwgMHg0MzVDLCAweDQzNUQsIDB4NDM1RSwgMHg0MzVGLCAweDQzNjAsIDB4NDM2MSwgMHg0MzYyLAorICAgIDB4NDM2MywgMHg0MzY0LCAweDQzNjUsIDB4NDM2NiwgMHg0MzY3LCAweDQzNjgsIDB4NDM2OSwgMHg0MzZBLCAweDQzNkIsCisgICAgMHg0MzZDLCAweDQzNkQsIDB4NDM2RSwgMHg0MzZGLCAweDQzNzAsIDB4NDM3MSwgMHg0MzcyLCAweDQzNzMsIDB4NDM3NCwKKyAgICAweDQzNzUsIDB4NDM3NiwgMHg0Mzc3LCAweDQzNzgsIDB4NDM3OSwgMHg0MzdBLCAweDQzN0IsIDB4NDM3QywgMHg0MzdELAorICAgIDB4NDM3RSwgMHg0MzdGLCAweDQzODAsIDB4NDM4MSwgMHg0MzgyLCAweDQzODMsIDB4NDM4NCwgMHg0Mzg1LCAweDQzODYsCisgICAgMHg0Mzg3LCAweDQzODgsIDB4NDM4OSwgMHg0MzhBLCAweDQzOEIsIDB4NDM4QywgMHg0MzhELCAweDQzOEUsIDB4NDM4RiwKKyAgICAweDQzOTAsIDB4NDM5MSwgMHg0MzkyLCAweDQzOTMsIDB4NDM5NCwgMHg0Mzk1LCAweDQzOTYsIDB4NDM5NywgMHg0Mzk4LAorICAgIDB4NDM5OSwgMHg0MzlBLCAweDQzOUIsIDB4NDM5QywgMHg0MzlELCAweDQzOUUsIDB4NDM5RiwgMHg0M0EwLCAweDQzQTEsCisgICAgMHg0M0EyLCAweDQzQTMsIDB4NDNBNCwgMHg0M0E1LCAweDQzQTYsIDB4NDNBNywgMHg0M0E4LCAweDQzQTksIDB4NDNBQSwKKyAgICAweDQzQUIsIDB4NDNBRCwgMHg0M0FFLCAweDQzQUYsIDB4NDNCMCwgMHg0M0IyLCAweDQzQjMsIDB4NDNCNCwgMHg0M0I1LAorICAgIDB4NDNCNiwgMHg0M0I3LCAweDQzQjgsIDB4NDNCOSwgMHg0M0JBLCAweDQzQkIsIDB4NDNCQywgMHg0M0JELCAweDQzQkUsCisgICAgMHg0M0JGLCAweDQzQzAsIDB4NDNDMSwgMHg0M0MyLCAweDQzQzMsIDB4NDNDNCwgMHg0M0M1LCAweDQzQzYsIDB4NDNDNywKKyAgICAweDQzQzgsIDB4NDNDOSwgMHg0M0NBLCAweDQzQ0IsIDB4NDNDQywgMHg0M0NELCAweDQzQ0UsIDB4NDNDRiwgMHg0M0QwLAorICAgIDB4NDNEMSwgMHg0M0QyLCAweDQzRDMsIDB4NDNENCwgMHg0M0Q1LCAweDQzRDYsIDB4NDNENywgMHg0M0Q4LCAweDQzRDksCisgICAgMHg0M0RBLCAweDQzREIsIDB4NDNEQywgMHg0M0RFLCAweDQzREYsIDB4NDNFMCwgMHg0M0UxLCAweDQzRTIsIDB4NDNFMywKKyAgICAweDQzRTQsIDB4NDNFNSwgMHg0M0U2LCAweDQzRTcsIDB4NDNFOCwgMHg0M0U5LCAweDQzRUEsIDB4NDNFQiwgMHg0M0VDLAorICAgIDB4NDNFRCwgMHg0M0VFLCAweDQzRUYsIDB4NDNGMCwgMHg0M0YxLCAweDQzRjIsIDB4NDNGMywgMHg0M0Y0LCAweDQzRjUsCisgICAgMHg0M0Y2LCAweDQzRjcsIDB4NDNGOCwgMHg0M0Y5LCAweDQzRkEsIDB4NDNGQiwgMHg0M0ZDLCAweDQzRkQsIDB4NDNGRSwKKyAgICAweDQzRkYsIDB4NDQwMCwgMHg0NDAxLCAweDQ0MDIsIDB4NDQwMywgMHg0NDA0LCAweDQ0MDUsIDB4NDQwNiwgMHg0NDA3LAorICAgIDB4NDQwOCwgMHg0NDA5LCAweDQ0MEEsIDB4NDQwQiwgMHg0NDBDLCAweDQ0MEQsIDB4NDQwRSwgMHg0NDBGLCAweDQ0MTAsCisgICAgMHg0NDExLCAweDQ0MTIsIDB4NDQxMywgMHg0NDE0LCAweDQ0MTUsIDB4NDQxNiwgMHg0NDE3LCAweDQ0MTgsIDB4NDQxOSwKKyAgICAweDQ0MUEsIDB4NDQxQiwgMHg0NDFDLCAweDQ0MUQsIDB4NDQxRSwgMHg0NDFGLCAweDQ0MjAsIDB4NDQyMSwgMHg0NDIyLAorICAgIDB4NDQyMywgMHg0NDI0LCAweDQ0MjUsIDB4NDQyNiwgMHg0NDI3LCAweDQ0MjgsIDB4NDQyOSwgMHg0NDJBLCAweDQ0MkIsCisgICAgMHg0NDJDLCAweDQ0MkQsIDB4NDQyRSwgMHg0NDJGLCAweDQ0MzAsIDB4NDQzMSwgMHg0NDMyLCAweDQ0MzMsIDB4NDQzNCwKKyAgICAweDQ0MzUsIDB4NDQzNiwgMHg0NDM3LCAweDQ0MzgsIDB4NDQzOSwgMHg0NDNBLCAweDQ0M0IsIDB4NDQzQywgMHg0NDNELAorICAgIDB4NDQzRSwgMHg0NDNGLCAweDQ0NDAsIDB4NDQ0MSwgMHg0NDQyLCAweDQ0NDMsIDB4NDQ0NCwgMHg0NDQ1LCAweDQ0NDYsCisgICAgMHg0NDQ3LCAweDQ0NDgsIDB4NDQ0OSwgMHg0NDRBLCAweDQ0NEIsIDB4NDQ0QywgMHg0NDRELCAweDQ0NEUsIDB4NDQ0RiwKKyAgICAweDQ0NTAsIDB4NDQ1MSwgMHg0NDUyLCAweDQ0NTMsIDB4NDQ1NCwgMHg0NDU1LCAweDQ0NTYsIDB4NDQ1NywgMHg0NDU4LAorICAgIDB4NDQ1OSwgMHg0NDVBLCAweDQ0NUIsIDB4NDQ1QywgMHg0NDVELCAweDQ0NUUsIDB4NDQ1RiwgMHg0NDYwLCAweDQ0NjEsCisgICAgMHg0NDYyLCAweDQ0NjMsIDB4NDQ2NCwgMHg0NDY1LCAweDQ0NjYsIDB4NDQ2NywgMHg0NDY4LCAweDQ0NjksIDB4NDQ2QSwKKyAgICAweDQ0NkIsIDB4NDQ2QywgMHg0NDZELCAweDQ0NkUsIDB4NDQ2RiwgMHg0NDcwLCAweDQ0NzEsIDB4NDQ3MiwgMHg0NDczLAorICAgIDB4NDQ3NCwgMHg0NDc1LCAweDQ0NzYsIDB4NDQ3NywgMHg0NDc4LCAweDQ0NzksIDB4NDQ3QSwgMHg0NDdCLCAweDQ0N0MsCisgICAgMHg0NDdELCAweDQ0N0UsIDB4NDQ3RiwgMHg0NDgwLCAweDQ0ODEsIDB4NDQ4MiwgMHg0NDgzLCAweDQ0ODQsIDB4NDQ4NSwKKyAgICAweDQ0ODYsIDB4NDQ4NywgMHg0NDg4LCAweDQ0ODksIDB4NDQ4QSwgMHg0NDhCLCAweDQ0OEMsIDB4NDQ4RCwgMHg0NDhFLAorICAgIDB4NDQ4RiwgMHg0NDkwLCAweDQ0OTEsIDB4NDQ5MiwgMHg0NDkzLCAweDQ0OTQsIDB4NDQ5NSwgMHg0NDk2LCAweDQ0OTcsCisgICAgMHg0NDk4LCAweDQ0OTksIDB4NDQ5QSwgMHg0NDlCLCAweDQ0OUMsIDB4NDQ5RCwgMHg0NDlFLCAweDQ0OUYsIDB4NDRBMCwKKyAgICAweDQ0QTEsIDB4NDRBMiwgMHg0NEEzLCAweDQ0QTQsIDB4NDRBNSwgMHg0NEE2LCAweDQ0QTcsIDB4NDRBOCwgMHg0NEE5LAorICAgIDB4NDRBQSwgMHg0NEFCLCAweDQ0QUMsIDB4NDRBRCwgMHg0NEFFLCAweDQ0QUYsIDB4NDRCMCwgMHg0NEIxLCAweDQ0QjIsCisgICAgMHg0NEIzLCAweDQ0QjQsIDB4NDRCNSwgMHg0NEI2LCAweDQ0QjcsIDB4NDRCOCwgMHg0NEI5LCAweDQ0QkEsIDB4NDRCQiwKKyAgICAweDQ0QkMsIDB4NDRCRCwgMHg0NEJFLCAweDQ0QkYsIDB4NDRDMCwgMHg0NEMxLCAweDQ0QzIsIDB4NDRDMywgMHg0NEM0LAorICAgIDB4NDRDNSwgMHg0NEM2LCAweDQ0QzcsIDB4NDRDOCwgMHg0NEM5LCAweDQ0Q0EsIDB4NDRDQiwgMHg0NENDLCAweDQ0Q0QsCisgICAgMHg0NENFLCAweDQ0Q0YsIDB4NDREMCwgMHg0NEQxLCAweDQ0RDIsIDB4NDREMywgMHg0NEQ0LCAweDQ0RDUsIDB4NDRENywKKyAgICAweDQ0RDgsIDB4NDREOSwgMHg0NERBLCAweDQ0REIsIDB4NDREQywgMHg0NERELCAweDQ0REUsIDB4NDRERiwgMHg0NEUwLAorICAgIDB4NDRFMSwgMHg0NEUyLCAweDQ0RTMsIDB4NDRFNCwgMHg0NEU1LCAweDQ0RTYsIDB4NDRFNywgMHg0NEU4LCAweDQ0RTksCisgICAgMHg0NEVBLCAweDQ0RUIsIDB4NDRFQywgMHg0NEVELCAweDQ0RUUsIDB4NDRFRiwgMHg0NEYwLCAweDQ0RjEsIDB4NDRGMiwKKyAgICAweDQ0RjMsIDB4NDRGNCwgMHg0NEY1LCAweDQ0RjYsIDB4NDRGNywgMHg0NEY4LCAweDQ0RjksIDB4NDRGQSwgMHg0NEZCLAorICAgIDB4NDRGQywgMHg0NEZELCAweDQ0RkUsIDB4NDRGRiwgMHg0NTAwLCAweDQ1MDEsIDB4NDUwMiwgMHg0NTAzLCAweDQ1MDQsCisgICAgMHg0NTA1LCAweDQ1MDYsIDB4NDUwNywgMHg0NTA4LCAweDQ1MDksIDB4NDUwQSwgMHg0NTBCLCAweDQ1MEMsIDB4NDUwRCwKKyAgICAweDQ1MEUsIDB4NDUwRiwgMHg0NTEwLCAweDQ1MTEsIDB4NDUxMiwgMHg0NTEzLCAweDQ1MTQsIDB4NDUxNSwgMHg0NTE2LAorICAgIDB4NDUxNywgMHg0NTE4LCAweDQ1MTksIDB4NDUxQSwgMHg0NTFCLCAweDQ1MUMsIDB4NDUxRCwgMHg0NTFFLCAweDQ1MUYsCisgICAgMHg0NTIwLCAweDQ1MjEsIDB4NDUyMiwgMHg0NTIzLCAweDQ1MjQsIDB4NDUyNSwgMHg0NTI2LCAweDQ1MjcsIDB4NDUyOCwKKyAgICAweDQ1MjksIDB4NDUyQSwgMHg0NTJCLCAweDQ1MkMsIDB4NDUyRCwgMHg0NTJFLCAweDQ1MkYsIDB4NDUzMCwgMHg0NTMxLAorICAgIDB4NDUzMiwgMHg0NTMzLCAweDQ1MzQsIDB4NDUzNSwgMHg0NTM2LCAweDQ1MzcsIDB4NDUzOCwgMHg0NTM5LCAweDQ1M0EsCisgICAgMHg0NTNCLCAweDQ1M0MsIDB4NDUzRCwgMHg0NTNFLCAweDQ1M0YsIDB4NDU0MCwgMHg0NTQxLCAweDQ1NDIsIDB4NDU0MywKKyAgICAweDQ1NDQsIDB4NDU0NSwgMHg0NTQ2LCAweDQ1NDcsIDB4NDU0OCwgMHg0NTQ5LCAweDQ1NEEsIDB4NDU0QiwgMHg0NTRDLAorICAgIDB4NDU0RCwgMHg0NTRFLCAweDQ1NEYsIDB4NDU1MCwgMHg0NTUxLCAweDQ1NTIsIDB4NDU1MywgMHg0NTU0LCAweDQ1NTUsCisgICAgMHg0NTU2LCAweDQ1NTcsIDB4NDU1OCwgMHg0NTU5LCAweDQ1NUEsIDB4NDU1QiwgMHg0NTVDLCAweDQ1NUQsIDB4NDU1RSwKKyAgICAweDQ1NUYsIDB4NDU2MCwgMHg0NTYxLCAweDQ1NjIsIDB4NDU2MywgMHg0NTY0LCAweDQ1NjUsIDB4NDU2NiwgMHg0NTY3LAorICAgIDB4NDU2OCwgMHg0NTY5LCAweDQ1NkEsIDB4NDU2QiwgMHg0NTZDLCAweDQ1NkQsIDB4NDU2RSwgMHg0NTZGLCAweDQ1NzAsCisgICAgMHg0NTcxLCAweDQ1NzIsIDB4NDU3MywgMHg0NTc0LCAweDQ1NzUsIDB4NDU3NiwgMHg0NTc3LCAweDQ1NzgsIDB4NDU3OSwKKyAgICAweDQ1N0EsIDB4NDU3QiwgMHg0NTdDLCAweDQ1N0QsIDB4NDU3RSwgMHg0NTdGLCAweDQ1ODAsIDB4NDU4MSwgMHg0NTgyLAorICAgIDB4NDU4MywgMHg0NTg0LCAweDQ1ODUsIDB4NDU4NiwgMHg0NTg3LCAweDQ1ODgsIDB4NDU4OSwgMHg0NThBLCAweDQ1OEIsCisgICAgMHg0NThDLCAweDQ1OEQsIDB4NDU4RSwgMHg0NThGLCAweDQ1OTAsIDB4NDU5MSwgMHg0NTkyLCAweDQ1OTMsIDB4NDU5NCwKKyAgICAweDQ1OTUsIDB4NDU5NiwgMHg0NTk3LCAweDQ1OTgsIDB4NDU5OSwgMHg0NTlBLCAweDQ1OUIsIDB4NDU5QywgMHg0NTlELAorICAgIDB4NDU5RSwgMHg0NTlGLCAweDQ1QTAsIDB4NDVBMSwgMHg0NUEyLCAweDQ1QTMsIDB4NDVBNCwgMHg0NUE1LCAweDQ1QTYsCisgICAgMHg0NUE3LCAweDQ1QTgsIDB4NDVBOSwgMHg0NUFBLCAweDQ1QUIsIDB4NDVBQywgMHg0NUFELCAweDQ1QUUsIDB4NDVBRiwKKyAgICAweDQ1QjAsIDB4NDVCMSwgMHg0NUIyLCAweDQ1QjMsIDB4NDVCNCwgMHg0NUI1LCAweDQ1QjYsIDB4NDVCNywgMHg0NUI4LAorICAgIDB4NDVCOSwgMHg0NUJBLCAweDQ1QkIsIDB4NDVCQywgMHg0NUJELCAweDQ1QkUsIDB4NDVCRiwgMHg0NUMwLCAweDQ1QzEsCisgICAgMHg0NUMyLCAweDQ1QzMsIDB4NDVDNCwgMHg0NUM1LCAweDQ1QzYsIDB4NDVDNywgMHg0NUM4LCAweDQ1QzksIDB4NDVDQSwKKyAgICAweDQ1Q0IsIDB4NDVDQywgMHg0NUNELCAweDQ1Q0UsIDB4NDVDRiwgMHg0NUQwLCAweDQ1RDEsIDB4NDVEMiwgMHg0NUQzLAorICAgIDB4NDVENCwgMHg0NUQ1LCAweDQ1RDYsIDB4NDVENywgMHg0NUQ4LCAweDQ1RDksIDB4NDVEQSwgMHg0NURCLCAweDQ1REMsCisgICAgMHg0NURELCAweDQ1REUsIDB4NDVERiwgMHg0NUUwLCAweDQ1RTEsIDB4NDVFMiwgMHg0NUUzLCAweDQ1RTQsIDB4NDVFNSwKKyAgICAweDQ1RTYsIDB4NDVFNywgMHg0NUU4LCAweDQ1RTksIDB4NDVFQSwgMHg0NUVCLCAweDQ1RUMsIDB4NDVFRCwgMHg0NUVFLAorICAgIDB4NDVFRiwgMHg0NUYwLCAweDQ1RjEsIDB4NDVGMiwgMHg0NUYzLCAweDQ1RjQsIDB4NDVGNSwgMHg0NUY2LCAweDQ1RjcsCisgICAgMHg0NUY4LCAweDQ1RjksIDB4NDVGQSwgMHg0NUZCLCAweDQ1RkMsIDB4NDVGRCwgMHg0NUZFLCAweDQ1RkYsIDB4NDYwMCwKKyAgICAweDQ2MDEsIDB4NDYwMiwgMHg0NjAzLCAweDQ2MDQsIDB4NDYwNSwgMHg0NjA2LCAweDQ2MDcsIDB4NDYwOCwgMHg0NjA5LAorICAgIDB4NDYwQSwgMHg0NjBCLCAweDQ2MEMsIDB4NDYwRCwgMHg0NjBFLCAweDQ2MEYsIDB4NDYxMCwgMHg0NjExLCAweDQ2MTIsCisgICAgMHg0NjEzLCAweDQ2MTQsIDB4NDYxNSwgMHg0NjE2LCAweDQ2MTcsIDB4NDYxOCwgMHg0NjE5LCAweDQ2MUEsIDB4NDYxQiwKKyAgICAweDQ2MUMsIDB4NDYxRCwgMHg0NjFFLCAweDQ2MUYsIDB4NDYyMCwgMHg0NjIxLCAweDQ2MjIsIDB4NDYyMywgMHg0NjI0LAorICAgIDB4NDYyNSwgMHg0NjI2LCAweDQ2MjcsIDB4NDYyOCwgMHg0NjI5LCAweDQ2MkEsIDB4NDYyQiwgMHg0NjJDLCAweDQ2MkQsCisgICAgMHg0NjJFLCAweDQ2MkYsIDB4NDYzMCwgMHg0NjMxLCAweDQ2MzIsIDB4NDYzMywgMHg0NjM0LCAweDQ2MzUsIDB4NDYzNiwKKyAgICAweDQ2MzcsIDB4NDYzOCwgMHg0NjM5LCAweDQ2M0EsIDB4NDYzQiwgMHg0NjNDLCAweDQ2M0QsIDB4NDYzRSwgMHg0NjNGLAorICAgIDB4NDY0MCwgMHg0NjQxLCAweDQ2NDIsIDB4NDY0MywgMHg0NjQ0LCAweDQ2NDUsIDB4NDY0NiwgMHg0NjQ3LCAweDQ2NDgsCisgICAgMHg0NjQ5LCAweDQ2NEEsIDB4NDY0QiwgMHg0NjRELCAweDQ2NEUsIDB4NDY0RiwgMHg0NjUwLCAweDQ2NTEsIDB4NDY1MiwKKyAgICAweDQ2NTMsIDB4NDY1NCwgMHg0NjU1LCAweDQ2NTYsIDB4NDY1NywgMHg0NjU4LCAweDQ2NTksIDB4NDY1QSwgMHg0NjVCLAorICAgIDB4NDY1QywgMHg0NjVELCAweDQ2NUUsIDB4NDY1RiwgMHg0NjYwLCAweDQ2NjIsIDB4NDY2MywgMHg0NjY0LCAweDQ2NjUsCisgICAgMHg0NjY2LCAweDQ2NjcsIDB4NDY2OCwgMHg0NjY5LCAweDQ2NkEsIDB4NDY2QiwgMHg0NjZDLCAweDQ2NkQsIDB4NDY2RSwKKyAgICAweDQ2NkYsIDB4NDY3MCwgMHg0NjcxLCAweDQ2NzIsIDB4NDY3MywgMHg0Njc0LCAweDQ2NzUsIDB4NDY3NiwgMHg0Njc3LAorICAgIDB4NDY3OCwgMHg0Njc5LCAweDQ2N0EsIDB4NDY3QiwgMHg0NjdDLCAweDQ2N0QsIDB4NDY3RSwgMHg0NjdGLCAweDQ2ODAsCisgICAgMHg0NjgxLCAweDQ2ODIsIDB4NDY4MywgMHg0Njg0LCAweDQ2ODUsIDB4NDY4NiwgMHg0Njg3LCAweDQ2ODgsIDB4NDY4OSwKKyAgICAweDQ2OEEsIDB4NDY4QiwgMHg0NjhDLCAweDQ2OEQsIDB4NDY4RSwgMHg0NjhGLCAweDQ2OTAsIDB4NDY5MSwgMHg0NjkyLAorICAgIDB4NDY5MywgMHg0Njk0LCAweDQ2OTUsIDB4NDY5NiwgMHg0Njk3LCAweDQ2OTgsIDB4NDY5OSwgMHg0NjlBLCAweDQ2OUIsCisgICAgMHg0NjlDLCAweDQ2OUQsIDB4NDY5RSwgMHg0NjlGLCAweDQ2QTAsIDB4NDZBMSwgMHg0NkEyLCAweDQ2QTMsIDB4NDZBNCwKKyAgICAweDQ2QTUsIDB4NDZBNiwgMHg0NkE3LCAweDQ2QTgsIDB4NDZBOSwgMHg0NkFBLCAweDQ2QUIsIDB4NDZBQywgMHg0NkFELAorICAgIDB4NDZBRSwgMHg0NkFGLCAweDQ2QjAsIDB4NDZCMSwgMHg0NkIyLCAweDQ2QjMsIDB4NDZCNCwgMHg0NkI1LCAweDQ2QjYsCisgICAgMHg0NkI3LCAweDQ2QjgsIDB4NDZCOSwgMHg0NkJBLCAweDQ2QkIsIDB4NDZCQywgMHg0NkJELCAweDQ2QkUsIDB4NDZCRiwKKyAgICAweDQ2QzAsIDB4NDZDMSwgMHg0NkMyLCAweDQ2QzMsIDB4NDZDNCwgMHg0NkM1LCAweDQ2QzYsIDB4NDZDNywgMHg0NkM4LAorICAgIDB4NDZDOSwgMHg0NkNBLCAweDQ2Q0IsIDB4NDZDQywgMHg0NkNELCAweDQ2Q0UsIDB4NDZDRiwgMHg0NkQwLCAweDQ2RDEsCisgICAgMHg0NkQyLCAweDQ2RDMsIDB4NDZENCwgMHg0NkQ1LCAweDQ2RDYsIDB4NDZENywgMHg0NkQ4LCAweDQ2RDksIDB4NDZEQSwKKyAgICAweDQ2REIsIDB4NDZEQywgMHg0NkRELCAweDQ2REUsIDB4NDZERiwgMHg0NkUwLCAweDQ2RTEsIDB4NDZFMiwgMHg0NkUzLAorICAgIDB4NDZFNCwgMHg0NkU1LCAweDQ2RTYsIDB4NDZFNywgMHg0NkU4LCAweDQ2RTksIDB4NDZFQSwgMHg0NkVCLCAweDQ2RUMsCisgICAgMHg0NkVELCAweDQ2RUUsIDB4NDZFRiwgMHg0NkYwLCAweDQ2RjEsIDB4NDZGMiwgMHg0NkYzLCAweDQ2RjQsIDB4NDZGNSwKKyAgICAweDQ2RjYsIDB4NDZGNywgMHg0NkY4LCAweDQ2RjksIDB4NDZGQSwgMHg0NkZCLCAweDQ2RkMsIDB4NDZGRCwgMHg0NkZFLAorICAgIDB4NDZGRiwgMHg0NzAwLCAweDQ3MDEsIDB4NDcwMiwgMHg0NzAzLCAweDQ3MDQsIDB4NDcwNSwgMHg0NzA2LCAweDQ3MDcsCisgICAgMHg0NzA4LCAweDQ3MDksIDB4NDcwQSwgMHg0NzBCLCAweDQ3MEMsIDB4NDcwRCwgMHg0NzBFLCAweDQ3MEYsIDB4NDcxMCwKKyAgICAweDQ3MTEsIDB4NDcxMiwgMHg0NzEzLCAweDQ3MTQsIDB4NDcxNSwgMHg0NzE2LCAweDQ3MTcsIDB4NDcxOCwgMHg0NzE5LAorICAgIDB4NDcxQSwgMHg0NzFCLCAweDQ3MUMsIDB4NDcxRCwgMHg0NzFFLCAweDQ3MUYsIDB4NDcyMCwgMHg0NzIxLCAweDQ3MjIsCisgICAgMHg0NzI0LCAweDQ3MjUsIDB4NDcyNiwgMHg0NzI3LCAweDQ3MjgsIDB4NDcyQSwgMHg0NzJCLCAweDQ3MkMsIDB4NDcyRCwKKyAgICAweDQ3MkUsIDB4NDcyRiwgMHg0NzMwLCAweDQ3MzEsIDB4NDczMiwgMHg0NzMzLCAweDQ3MzQsIDB4NDczNSwgMHg0NzM2LAorICAgIDB4NDczNywgMHg0NzM4LCAweDQ3MzksIDB4NDczQSwgMHg0NzNCLCAweDQ3M0MsIDB4NDczRCwgMHg0NzNFLCAweDQ3M0YsCisgICAgMHg0NzQwLCAweDQ3NDEsIDB4NDc0MiwgMHg0NzQzLCAweDQ3NDQsIDB4NDc0NSwgMHg0NzQ2LCAweDQ3NDcsIDB4NDc0OCwKKyAgICAweDQ3NDksIDB4NDc0QSwgMHg0NzRCLCAweDQ3NEMsIDB4NDc0RCwgMHg0NzRFLCAweDQ3NEYsIDB4NDc1MCwgMHg0NzUxLAorICAgIDB4NDc1MiwgMHg0NzUzLCAweDQ3NTQsIDB4NDc1NSwgMHg0NzU2LCAweDQ3NTcsIDB4NDc1OCwgMHg0NzU5LCAweDQ3NUEsCisgICAgMHg0NzVCLCAweDQ3NUMsIDB4NDc1RCwgMHg0NzVFLCAweDQ3NUYsIDB4NDc2MCwgMHg0NzYxLCAweDQ3NjIsIDB4NDc2MywKKyAgICAweDQ3NjQsIDB4NDc2NSwgMHg0NzY2LCAweDQ3NjcsIDB4NDc2OCwgMHg0NzY5LCAweDQ3NkEsIDB4NDc2QiwgMHg0NzZDLAorICAgIDB4NDc2RCwgMHg0NzZFLCAweDQ3NkYsIDB4NDc3MCwgMHg0NzcxLCAweDQ3NzIsIDB4NDc3MywgMHg0Nzc0LCAweDQ3NzUsCisgICAgMHg0Nzc2LCAweDQ3NzcsIDB4NDc3OCwgMHg0Nzc5LCAweDQ3N0EsIDB4NDc3QiwgMHg0NzdELCAweDQ3N0UsIDB4NDc3RiwKKyAgICAweDQ3ODAsIDB4NDc4MSwgMHg0NzgyLCAweDQ3ODMsIDB4NDc4NCwgMHg0Nzg1LCAweDQ3ODYsIDB4NDc4NywgMHg0Nzg4LAorICAgIDB4NDc4OSwgMHg0NzhBLCAweDQ3OEIsIDB4NDc4QywgMHg0NzhFLCAweDQ3OEYsIDB4NDc5MCwgMHg0NzkxLCAweDQ3OTIsCisgICAgMHg0NzkzLCAweDQ3OTQsIDB4NDc5NSwgMHg0Nzk2LCAweDQ3OTcsIDB4NDc5OCwgMHg0Nzk5LCAweDQ3OUEsIDB4NDc5QiwKKyAgICAweDQ3OUMsIDB4NDc5RCwgMHg0NzlFLCAweDQ3OUYsIDB4NDdBMCwgMHg0N0ExLCAweDQ3QTIsIDB4NDdBMywgMHg0N0E0LAorICAgIDB4NDdBNSwgMHg0N0E2LCAweDQ3QTcsIDB4NDdBOCwgMHg0N0E5LCAweDQ3QUEsIDB4NDdBQiwgMHg0N0FDLCAweDQ3QUQsCisgICAgMHg0N0FFLCAweDQ3QUYsIDB4NDdCMCwgMHg0N0IxLCAweDQ3QjIsIDB4NDdCMywgMHg0N0I0LCAweDQ3QjUsIDB4NDdCNiwKKyAgICAweDQ3QjcsIDB4NDdCOCwgMHg0N0I5LCAweDQ3QkEsIDB4NDdCQiwgMHg0N0JDLCAweDQ3QkQsIDB4NDdCRSwgMHg0N0JGLAorICAgIDB4NDdDMCwgMHg0N0MxLCAweDQ3QzIsIDB4NDdDMywgMHg0N0M0LCAweDQ3QzUsIDB4NDdDNiwgMHg0N0M3LCAweDQ3QzgsCisgICAgMHg0N0M5LCAweDQ3Q0EsIDB4NDdDQiwgMHg0N0NDLCAweDQ3Q0QsIDB4NDdDRSwgMHg0N0NGLCAweDQ3RDAsIDB4NDdEMSwKKyAgICAweDQ3RDIsIDB4NDdEMywgMHg0N0Q0LCAweDQ3RDUsIDB4NDdENiwgMHg0N0Q3LCAweDQ3RDgsIDB4NDdEOSwgMHg0N0RBLAorICAgIDB4NDdEQiwgMHg0N0RDLCAweDQ3REQsIDB4NDdERSwgMHg0N0RGLCAweDQ3RTAsIDB4NDdFMSwgMHg0N0UyLCAweDQ3RTMsCisgICAgMHg0N0U0LCAweDQ3RTUsIDB4NDdFNiwgMHg0N0U3LCAweDQ3RTgsIDB4NDdFOSwgMHg0N0VBLCAweDQ3RUIsIDB4NDdFQywKKyAgICAweDQ3RUQsIDB4NDdFRSwgMHg0N0VGLCAweDQ3RjAsIDB4NDdGMSwgMHg0N0YyLCAweDQ3RjMsIDB4NDdGNCwgMHg0N0Y1LAorICAgIDB4NDdGNiwgMHg0N0Y3LCAweDQ3RjgsIDB4NDdGOSwgMHg0N0ZBLCAweDQ3RkIsIDB4NDdGQywgMHg0N0ZELCAweDQ3RkUsCisgICAgMHg0N0ZGLCAweDQ4MDAsIDB4NDgwMSwgMHg0ODAyLCAweDQ4MDMsIDB4NDgwNCwgMHg0ODA1LCAweDQ4MDYsIDB4NDgwNywKKyAgICAweDQ4MDgsIDB4NDgwOSwgMHg0ODBBLCAweDQ4MEIsIDB4NDgwQywgMHg0ODBELCAweDQ4MEUsIDB4NDgwRiwgMHg0ODEwLAorICAgIDB4NDgxMSwgMHg0ODEyLCAweDQ4MTMsIDB4NDgxNCwgMHg0ODE1LCAweDQ4MTYsIDB4NDgxNywgMHg0ODE4LCAweDQ4MTksCisgICAgMHg0ODFBLCAweDQ4MUIsIDB4NDgxQywgMHg0ODFELCAweDQ4MUUsIDB4NDgxRiwgMHg0ODIwLCAweDQ4MjEsIDB4NDgyMiwKKyAgICAweDQ4MjMsIDB4NDgyNCwgMHg0ODI1LCAweDQ4MjYsIDB4NDgyNywgMHg0ODI4LCAweDQ4MjksIDB4NDgyQSwgMHg0ODJCLAorICAgIDB4NDgyQywgMHg0ODJELCAweDQ4MkUsIDB4NDgyRiwgMHg0ODMwLCAweDQ4MzEsIDB4NDgzMiwgMHg0ODMzLCAweDQ4MzQsCisgICAgMHg0ODM1LCAweDQ4MzYsIDB4NDgzNywgMHg0ODM4LCAweDQ4MzksIDB4NDgzQSwgMHg0ODNCLCAweDQ4M0MsIDB4NDgzRCwKKyAgICAweDQ4M0UsIDB4NDgzRiwgMHg0ODQwLCAweDQ4NDEsIDB4NDg0MiwgMHg0ODQzLCAweDQ4NDQsIDB4NDg0NSwgMHg0ODQ2LAorICAgIDB4NDg0NywgMHg0ODQ4LCAweDQ4NDksIDB4NDg0QSwgMHg0ODRCLCAweDQ4NEMsIDB4NDg0RCwgMHg0ODRFLCAweDQ4NEYsCisgICAgMHg0ODUwLCAweDQ4NTEsIDB4NDg1MiwgMHg0ODUzLCAweDQ4NTQsIDB4NDg1NSwgMHg0ODU2LCAweDQ4NTcsIDB4NDg1OCwKKyAgICAweDQ4NTksIDB4NDg1QSwgMHg0ODVCLCAweDQ4NUMsIDB4NDg1RCwgMHg0ODVFLCAweDQ4NUYsIDB4NDg2MCwgMHg0ODYxLAorICAgIDB4NDg2MiwgMHg0ODYzLCAweDQ4NjQsIDB4NDg2NSwgMHg0ODY2LCAweDQ4NjcsIDB4NDg2OCwgMHg0ODY5LCAweDQ4NkEsCisgICAgMHg0ODZCLCAweDQ4NkMsIDB4NDg2RCwgMHg0ODZFLCAweDQ4NkYsIDB4NDg3MCwgMHg0ODcxLCAweDQ4NzIsIDB4NDg3MywKKyAgICAweDQ4NzQsIDB4NDg3NSwgMHg0ODc2LCAweDQ4NzcsIDB4NDg3OCwgMHg0ODc5LCAweDQ4N0EsIDB4NDg3QiwgMHg0ODdDLAorICAgIDB4NDg3RCwgMHg0ODdFLCAweDQ4N0YsIDB4NDg4MCwgMHg0ODgxLCAweDQ4ODIsIDB4NDg4MywgMHg0ODg0LCAweDQ4ODUsCisgICAgMHg0ODg2LCAweDQ4ODcsIDB4NDg4OCwgMHg0ODg5LCAweDQ4OEEsIDB4NDg4QiwgMHg0ODhDLCAweDQ4OEQsIDB4NDg4RSwKKyAgICAweDQ4OEYsIDB4NDg5MCwgMHg0ODkxLCAweDQ4OTIsIDB4NDg5MywgMHg0ODk0LCAweDQ4OTUsIDB4NDg5NiwgMHg0ODk3LAorICAgIDB4NDg5OCwgMHg0ODk5LCAweDQ4OUEsIDB4NDg5QiwgMHg0ODlDLCAweDQ4OUQsIDB4NDg5RSwgMHg0ODlGLCAweDQ4QTAsCisgICAgMHg0OEExLCAweDQ4QTIsIDB4NDhBMywgMHg0OEE0LCAweDQ4QTUsIDB4NDhBNiwgMHg0OEE3LCAweDQ4QTgsIDB4NDhBOSwKKyAgICAweDQ4QUEsIDB4NDhBQiwgMHg0OEFDLCAweDQ4QUQsIDB4NDhBRSwgMHg0OEFGLCAweDQ4QjAsIDB4NDhCMSwgMHg0OEIyLAorICAgIDB4NDhCMywgMHg0OEI0LCAweDQ4QjUsIDB4NDhCNiwgMHg0OEI3LCAweDQ4QjgsIDB4NDhCOSwgMHg0OEJBLCAweDQ4QkIsCisgICAgMHg0OEJDLCAweDQ4QkQsIDB4NDhCRSwgMHg0OEJGLCAweDQ4QzAsIDB4NDhDMSwgMHg0OEMyLCAweDQ4QzMsIDB4NDhDNCwKKyAgICAweDQ4QzUsIDB4NDhDNiwgMHg0OEM3LCAweDQ4QzgsIDB4NDhDOSwgMHg0OENBLCAweDQ4Q0IsIDB4NDhDQywgMHg0OENELAorICAgIDB4NDhDRSwgMHg0OENGLCAweDQ4RDAsIDB4NDhEMSwgMHg0OEQyLCAweDQ4RDMsIDB4NDhENCwgMHg0OEQ1LCAweDQ4RDYsCisgICAgMHg0OEQ3LCAweDQ4RDgsIDB4NDhEOSwgMHg0OERBLCAweDQ4REIsIDB4NDhEQywgMHg0OERELCAweDQ4REUsIDB4NDhERiwKKyAgICAweDQ4RTAsIDB4NDhFMSwgMHg0OEUyLCAweDQ4RTMsIDB4NDhFNCwgMHg0OEU1LCAweDQ4RTYsIDB4NDhFNywgMHg0OEU4LAorICAgIDB4NDhFOSwgMHg0OEVBLCAweDQ4RUIsIDB4NDhFQywgMHg0OEVELCAweDQ4RUUsIDB4NDhFRiwgMHg0OEYwLCAweDQ4RjEsCisgICAgMHg0OEYyLCAweDQ4RjMsIDB4NDhGNCwgMHg0OEY1LCAweDQ4RjYsIDB4NDhGNywgMHg0OEY4LCAweDQ4RjksIDB4NDhGQSwKKyAgICAweDQ4RkIsIDB4NDhGQywgMHg0OEZELCAweDQ4RkUsIDB4NDhGRiwgMHg0OTAwLCAweDQ5MDEsIDB4NDkwMiwgMHg0OTAzLAorICAgIDB4NDkwNCwgMHg0OTA1LCAweDQ5MDYsIDB4NDkwNywgMHg0OTA4LCAweDQ5MDksIDB4NDkwQSwgMHg0OTBCLCAweDQ5MEMsCisgICAgMHg0OTBELCAweDQ5MEUsIDB4NDkwRiwgMHg0OTEwLCAweDQ5MTEsIDB4NDkxMiwgMHg0OTEzLCAweDQ5MTQsIDB4NDkxNSwKKyAgICAweDQ5MTYsIDB4NDkxNywgMHg0OTE4LCAweDQ5MTksIDB4NDkxQSwgMHg0OTFCLCAweDQ5MUMsIDB4NDkxRCwgMHg0OTFFLAorICAgIDB4NDkxRiwgMHg0OTIwLCAweDQ5MjEsIDB4NDkyMiwgMHg0OTIzLCAweDQ5MjQsIDB4NDkyNSwgMHg0OTI2LCAweDQ5MjcsCisgICAgMHg0OTI4LCAweDQ5MjksIDB4NDkyQSwgMHg0OTJCLCAweDQ5MkMsIDB4NDkyRCwgMHg0OTJFLCAweDQ5MkYsIDB4NDkzMCwKKyAgICAweDQ5MzEsIDB4NDkzMiwgMHg0OTMzLCAweDQ5MzQsIDB4NDkzNSwgMHg0OTM2LCAweDQ5MzcsIDB4NDkzOCwgMHg0OTM5LAorICAgIDB4NDkzQSwgMHg0OTNCLCAweDQ5M0MsIDB4NDkzRCwgMHg0OTNFLCAweDQ5M0YsIDB4NDk0MCwgMHg0OTQxLCAweDQ5NDIsCisgICAgMHg0OTQzLCAweDQ5NDQsIDB4NDk0NSwgMHg0OTQ2LCAweDQ5NDgsIDB4NDk0OSwgMHg0OTRBLCAweDQ5NEIsIDB4NDk0QywKKyAgICAweDQ5NEQsIDB4NDk0RSwgMHg0OTRGLCAweDQ5NTAsIDB4NDk1MSwgMHg0OTUyLCAweDQ5NTMsIDB4NDk1NCwgMHg0OTU1LAorICAgIDB4NDk1NiwgMHg0OTU3LCAweDQ5NTgsIDB4NDk1OSwgMHg0OTVBLCAweDQ5NUIsIDB4NDk1QywgMHg0OTVELCAweDQ5NUUsCisgICAgMHg0OTVGLCAweDQ5NjAsIDB4NDk2MSwgMHg0OTYyLCAweDQ5NjMsIDB4NDk2NCwgMHg0OTY1LCAweDQ5NjYsIDB4NDk2NywKKyAgICAweDQ5NjgsIDB4NDk2OSwgMHg0OTZBLCAweDQ5NkIsIDB4NDk2QywgMHg0OTZELCAweDQ5NkUsIDB4NDk2RiwgMHg0OTcwLAorICAgIDB4NDk3MSwgMHg0OTcyLCAweDQ5NzMsIDB4NDk3NCwgMHg0OTc1LCAweDQ5NzYsIDB4NDk3NywgMHg0OTc4LCAweDQ5NzksCisgICAgMHg0OTdCLCAweDQ5N0MsIDB4NDk3RSwgMHg0OTdGLCAweDQ5ODAsIDB4NDk4MSwgMHg0OTg0LCAweDQ5ODcsIDB4NDk4OCwKKyAgICAweDQ5ODksIDB4NDk4QSwgMHg0OThCLCAweDQ5OEMsIDB4NDk4RCwgMHg0OThFLCAweDQ5OEYsIDB4NDk5MCwgMHg0OTkxLAorICAgIDB4NDk5MiwgMHg0OTkzLCAweDQ5OTQsIDB4NDk5NSwgMHg0OTk2LCAweDQ5OTcsIDB4NDk5OCwgMHg0OTk5LCAweDQ5OUEsCisgICAgMHg0OTlDLCAweDQ5OUQsIDB4NDk5RSwgMHg0OUEwLCAweDQ5QTEsIDB4NDlBMiwgMHg0OUEzLCAweDQ5QTQsIDB4NDlBNSwKKyAgICAweDQ5QTYsIDB4NDlBNywgMHg0OUE4LCAweDQ5QTksIDB4NDlBQSwgMHg0OUFCLCAweDQ5QUMsIDB4NDlBRCwgMHg0OUFFLAorICAgIDB4NDlBRiwgMHg0OUIwLCAweDQ5QjEsIDB4NDlCMiwgMHg0OUIzLCAweDQ5QjQsIDB4NDlCNSwgMHg0OUI4LCAweDQ5QjksCisgICAgMHg0OUJBLCAweDQ5QkIsIDB4NDlCQywgMHg0OUJELCAweDQ5QkUsIDB4NDlCRiwgMHg0OUMwLCAweDQ5QzEsIDB4NDlDMiwKKyAgICAweDQ5QzMsIDB4NDlDNCwgMHg0OUM1LCAweDQ5QzYsIDB4NDlDNywgMHg0OUM4LCAweDQ5QzksIDB4NDlDQSwgMHg0OUNCLAorICAgIDB4NDlDQywgMHg0OUNELCAweDQ5Q0UsIDB4NDlDRiwgMHg0OUQwLCAweDQ5RDEsIDB4NDlEMiwgMHg0OUQzLCAweDQ5RDQsCisgICAgMHg0OUQ1LCAweDQ5RDYsIDB4NDlENywgMHg0OUQ4LCAweDQ5RDksIDB4NDlEQSwgMHg0OURCLCAweDQ5REMsIDB4NDlERCwKKyAgICAweDQ5REUsIDB4NDlERiwgMHg0OUUwLCAweDQ5RTEsIDB4NDlFMiwgMHg0OUUzLCAweDQ5RTQsIDB4NDlFNSwgMHg0OUU2LAorICAgIDB4NDlFNywgMHg0OUU4LCAweDQ5RTksIDB4NDlFQSwgMHg0OUVCLCAweDQ5RUMsIDB4NDlFRCwgMHg0OUVFLCAweDQ5RUYsCisgICAgMHg0OUYwLCAweDQ5RjEsIDB4NDlGMiwgMHg0OUYzLCAweDQ5RjQsIDB4NDlGNSwgMHg0OUY2LCAweDQ5RjcsIDB4NDlGOCwKKyAgICAweDQ5RjksIDB4NDlGQSwgMHg0OUZCLCAweDQ5RkMsIDB4NDlGRCwgMHg0OUZFLCAweDQ5RkYsIDB4NEEwMCwgMHg0QTAxLAorICAgIDB4NEEwMiwgMHg0QTAzLCAweDRBMDQsIDB4NEEwNSwgMHg0QTA2LCAweDRBMDcsIDB4NEEwOCwgMHg0QTA5LCAweDRBMEEsCisgICAgMHg0QTBCLCAweDRBMEMsIDB4NEEwRCwgMHg0QTBFLCAweDRBMEYsIDB4NEExMCwgMHg0QTExLCAweDRBMTIsIDB4NEExMywKKyAgICAweDRBMTQsIDB4NEExNSwgMHg0QTE2LCAweDRBMTcsIDB4NEExOCwgMHg0QTE5LCAweDRBMUEsIDB4NEExQiwgMHg0QTFDLAorICAgIDB4NEExRCwgMHg0QTFFLCAweDRBMUYsIDB4NEEyMCwgMHg0QTIxLCAweDRBMjIsIDB4NEEyMywgMHg0QTI0LCAweDRBMjUsCisgICAgMHg0QTI2LCAweDRBMjcsIDB4NEEyOCwgMHg0QTI5LCAweDRBMkEsIDB4NEEyQiwgMHg0QTJDLCAweDRBMkQsIDB4NEEyRSwKKyAgICAweDRBMkYsIDB4NEEzMCwgMHg0QTMxLCAweDRBMzIsIDB4NEEzMywgMHg0QTM0LCAweDRBMzUsIDB4NEEzNiwgMHg0QTM3LAorICAgIDB4NEEzOCwgMHg0QTM5LCAweDRBM0EsIDB4NEEzQiwgMHg0QTNDLCAweDRBM0QsIDB4NEEzRSwgMHg0QTNGLCAweDRBNDAsCisgICAgMHg0QTQxLCAweDRBNDIsIDB4NEE0MywgMHg0QTQ0LCAweDRBNDUsIDB4NEE0NiwgMHg0QTQ3LCAweDRBNDgsIDB4NEE0OSwKKyAgICAweDRBNEEsIDB4NEE0QiwgMHg0QTRDLCAweDRBNEQsIDB4NEE0RSwgMHg0QTRGLCAweDRBNTAsIDB4NEE1MSwgMHg0QTUyLAorICAgIDB4NEE1MywgMHg0QTU0LCAweDRBNTUsIDB4NEE1NiwgMHg0QTU3LCAweDRBNTgsIDB4NEE1OSwgMHg0QTVBLCAweDRBNUIsCisgICAgMHg0QTVDLCAweDRBNUQsIDB4NEE1RSwgMHg0QTVGLCAweDRBNjAsIDB4NEE2MSwgMHg0QTYyLCAweDRBNjMsIDB4NEE2NCwKKyAgICAweDRBNjUsIDB4NEE2NiwgMHg0QTY3LCAweDRBNjgsIDB4NEE2OSwgMHg0QTZBLCAweDRBNkIsIDB4NEE2QywgMHg0QTZELAorICAgIDB4NEE2RSwgMHg0QTZGLCAweDRBNzAsIDB4NEE3MSwgMHg0QTcyLCAweDRBNzMsIDB4NEE3NCwgMHg0QTc1LCAweDRBNzYsCisgICAgMHg0QTc3LCAweDRBNzgsIDB4NEE3OSwgMHg0QTdBLCAweDRBN0IsIDB4NEE3QywgMHg0QTdELCAweDRBN0UsIDB4NEE3RiwKKyAgICAweDRBODAsIDB4NEE4MSwgMHg0QTgyLCAweDRBODMsIDB4NEE4NCwgMHg0QTg1LCAweDRBODYsIDB4NEE4NywgMHg0QTg4LAorICAgIDB4NEE4OSwgMHg0QThBLCAweDRBOEIsIDB4NEE4QywgMHg0QThELCAweDRBOEUsIDB4NEE4RiwgMHg0QTkwLCAweDRBOTEsCisgICAgMHg0QTkyLCAweDRBOTMsIDB4NEE5NCwgMHg0QTk1LCAweDRBOTYsIDB4NEE5NywgMHg0QTk4LCAweDRBOTksIDB4NEE5QSwKKyAgICAweDRBOUIsIDB4NEE5QywgMHg0QTlELCAweDRBOUUsIDB4NEE5RiwgMHg0QUEwLCAweDRBQTEsIDB4NEFBMiwgMHg0QUEzLAorICAgIDB4NEFBNCwgMHg0QUE1LCAweDRBQTYsIDB4NEFBNywgMHg0QUE4LCAweDRBQTksIDB4NEFBQSwgMHg0QUFCLCAweDRBQUMsCisgICAgMHg0QUFELCAweDRBQUUsIDB4NEFBRiwgMHg0QUIwLCAweDRBQjEsIDB4NEFCMiwgMHg0QUIzLCAweDRBQjQsIDB4NEFCNSwKKyAgICAweDRBQjYsIDB4NEFCNywgMHg0QUI4LCAweDRBQjksIDB4NEFCQSwgMHg0QUJCLCAweDRBQkMsIDB4NEFCRCwgMHg0QUJFLAorICAgIDB4NEFCRiwgMHg0QUMwLCAweDRBQzEsIDB4NEFDMiwgMHg0QUMzLCAweDRBQzQsIDB4NEFDNSwgMHg0QUM2LCAweDRBQzcsCisgICAgMHg0QUM4LCAweDRBQzksIDB4NEFDQSwgMHg0QUNCLCAweDRBQ0MsIDB4NEFDRCwgMHg0QUNFLCAweDRBQ0YsIDB4NEFEMCwKKyAgICAweDRBRDEsIDB4NEFEMiwgMHg0QUQzLCAweDRBRDQsIDB4NEFENSwgMHg0QUQ2LCAweDRBRDcsIDB4NEFEOCwgMHg0QUQ5LAorICAgIDB4NEFEQSwgMHg0QURCLCAweDRBREMsIDB4NEFERCwgMHg0QURFLCAweDRBREYsIDB4NEFFMCwgMHg0QUUxLCAweDRBRTIsCisgICAgMHg0QUUzLCAweDRBRTQsIDB4NEFFNSwgMHg0QUU2LCAweDRBRTcsIDB4NEFFOCwgMHg0QUU5LCAweDRBRUEsIDB4NEFFQiwKKyAgICAweDRBRUMsIDB4NEFFRCwgMHg0QUVFLCAweDRBRUYsIDB4NEFGMCwgMHg0QUYxLCAweDRBRjIsIDB4NEFGMywgMHg0QUY0LAorICAgIDB4NEFGNSwgMHg0QUY2LCAweDRBRjcsIDB4NEFGOCwgMHg0QUY5LCAweDRBRkEsIDB4NEFGQiwgMHg0QUZDLCAweDRBRkQsCisgICAgMHg0QUZFLCAweDRBRkYsIDB4NEIwMCwgMHg0QjAxLCAweDRCMDIsIDB4NEIwMywgMHg0QjA0LCAweDRCMDUsIDB4NEIwNiwKKyAgICAweDRCMDcsIDB4NEIwOCwgMHg0QjA5LCAweDRCMEEsIDB4NEIwQiwgMHg0QjBDLCAweDRCMEQsIDB4NEIwRSwgMHg0QjBGLAorICAgIDB4NEIxMCwgMHg0QjExLCAweDRCMTIsIDB4NEIxMywgMHg0QjE0LCAweDRCMTUsIDB4NEIxNiwgMHg0QjE3LCAweDRCMTgsCisgICAgMHg0QjE5LCAweDRCMUEsIDB4NEIxQiwgMHg0QjFDLCAweDRCMUQsIDB4NEIxRSwgMHg0QjFGLCAweDRCMjAsIDB4NEIyMSwKKyAgICAweDRCMjIsIDB4NEIyMywgMHg0QjI0LCAweDRCMjUsIDB4NEIyNiwgMHg0QjI3LCAweDRCMjgsIDB4NEIyOSwgMHg0QjJBLAorICAgIDB4NEIyQiwgMHg0QjJDLCAweDRCMkQsIDB4NEIyRSwgMHg0QjJGLCAweDRCMzAsIDB4NEIzMSwgMHg0QjMyLCAweDRCMzMsCisgICAgMHg0QjM0LCAweDRCMzUsIDB4NEIzNiwgMHg0QjM3LCAweDRCMzgsIDB4NEIzOSwgMHg0QjNBLCAweDRCM0IsIDB4NEIzQywKKyAgICAweDRCM0QsIDB4NEIzRSwgMHg0QjNGLCAweDRCNDAsIDB4NEI0MSwgMHg0QjQyLCAweDRCNDMsIDB4NEI0NCwgMHg0QjQ1LAorICAgIDB4NEI0NiwgMHg0QjQ3LCAweDRCNDgsIDB4NEI0OSwgMHg0QjRBLCAweDRCNEIsIDB4NEI0QywgMHg0QjRELCAweDRCNEUsCisgICAgMHg0QjRGLCAweDRCNTAsIDB4NEI1MSwgMHg0QjUyLCAweDRCNTMsIDB4NEI1NCwgMHg0QjU1LCAweDRCNTYsIDB4NEI1NywKKyAgICAweDRCNTgsIDB4NEI1OSwgMHg0QjVBLCAweDRCNUIsIDB4NEI1QywgMHg0QjVELCAweDRCNUUsIDB4NEI1RiwgMHg0QjYwLAorICAgIDB4NEI2MSwgMHg0QjYyLCAweDRCNjMsIDB4NEI2NCwgMHg0QjY1LCAweDRCNjYsIDB4NEI2NywgMHg0QjY4LCAweDRCNjksCisgICAgMHg0QjZBLCAweDRCNkIsIDB4NEI2QywgMHg0QjZELCAweDRCNkUsIDB4NEI2RiwgMHg0QjcwLCAweDRCNzEsIDB4NEI3MiwKKyAgICAweDRCNzMsIDB4NEI3NCwgMHg0Qjc1LCAweDRCNzYsIDB4NEI3NywgMHg0Qjc4LCAweDRCNzksIDB4NEI3QSwgMHg0QjdCLAorICAgIDB4NEI3QywgMHg0QjdELCAweDRCN0UsIDB4NEI3RiwgMHg0QjgwLCAweDRCODEsIDB4NEI4MiwgMHg0QjgzLCAweDRCODQsCisgICAgMHg0Qjg1LCAweDRCODYsIDB4NEI4NywgMHg0Qjg4LCAweDRCODksIDB4NEI4QSwgMHg0QjhCLCAweDRCOEMsIDB4NEI4RCwKKyAgICAweDRCOEUsIDB4NEI4RiwgMHg0QjkwLCAweDRCOTEsIDB4NEI5MiwgMHg0QjkzLCAweDRCOTQsIDB4NEI5NSwgMHg0Qjk2LAorICAgIDB4NEI5NywgMHg0Qjk4LCAweDRCOTksIDB4NEI5QSwgMHg0QjlCLCAweDRCOUMsIDB4NEI5RCwgMHg0QjlFLCAweDRCOUYsCisgICAgMHg0QkEwLCAweDRCQTEsIDB4NEJBMiwgMHg0QkEzLCAweDRCQTQsIDB4NEJBNSwgMHg0QkE2LCAweDRCQTcsIDB4NEJBOCwKKyAgICAweDRCQTksIDB4NEJBQSwgMHg0QkFCLCAweDRCQUMsIDB4NEJBRCwgMHg0QkFFLCAweDRCQUYsIDB4NEJCMCwgMHg0QkIxLAorICAgIDB4NEJCMiwgMHg0QkIzLCAweDRCQjQsIDB4NEJCNSwgMHg0QkI2LCAweDRCQjcsIDB4NEJCOCwgMHg0QkI5LCAweDRCQkEsCisgICAgMHg0QkJCLCAweDRCQkMsIDB4NEJCRCwgMHg0QkJFLCAweDRCQkYsIDB4NEJDMCwgMHg0QkMxLCAweDRCQzIsIDB4NEJDMywKKyAgICAweDRCQzQsIDB4NEJDNSwgMHg0QkM2LCAweDRCQzcsIDB4NEJDOCwgMHg0QkM5LCAweDRCQ0EsIDB4NEJDQiwgMHg0QkNDLAorICAgIDB4NEJDRCwgMHg0QkNFLCAweDRCQ0YsIDB4NEJEMCwgMHg0QkQxLCAweDRCRDIsIDB4NEJEMywgMHg0QkQ0LCAweDRCRDUsCisgICAgMHg0QkQ2LCAweDRCRDcsIDB4NEJEOCwgMHg0QkQ5LCAweDRCREEsIDB4NEJEQiwgMHg0QkRDLCAweDRCREQsIDB4NEJERSwKKyAgICAweDRCREYsIDB4NEJFMCwgMHg0QkUxLCAweDRCRTIsIDB4NEJFMywgMHg0QkU0LCAweDRCRTUsIDB4NEJFNiwgMHg0QkU3LAorICAgIDB4NEJFOCwgMHg0QkU5LCAweDRCRUEsIDB4NEJFQiwgMHg0QkVDLCAweDRCRUQsIDB4NEJFRSwgMHg0QkVGLCAweDRCRjAsCisgICAgMHg0QkYxLCAweDRCRjIsIDB4NEJGMywgMHg0QkY0LCAweDRCRjUsIDB4NEJGNiwgMHg0QkY3LCAweDRCRjgsIDB4NEJGOSwKKyAgICAweDRCRkEsIDB4NEJGQiwgMHg0QkZDLCAweDRCRkQsIDB4NEJGRSwgMHg0QkZGLCAweDRDMDAsIDB4NEMwMSwgMHg0QzAyLAorICAgIDB4NEMwMywgMHg0QzA0LCAweDRDMDUsIDB4NEMwNiwgMHg0QzA3LCAweDRDMDgsIDB4NEMwOSwgMHg0QzBBLCAweDRDMEIsCisgICAgMHg0QzBDLCAweDRDMEQsIDB4NEMwRSwgMHg0QzBGLCAweDRDMTAsIDB4NEMxMSwgMHg0QzEyLCAweDRDMTMsIDB4NEMxNCwKKyAgICAweDRDMTUsIDB4NEMxNiwgMHg0QzE3LCAweDRDMTgsIDB4NEMxOSwgMHg0QzFBLCAweDRDMUIsIDB4NEMxQywgMHg0QzFELAorICAgIDB4NEMxRSwgMHg0QzFGLCAweDRDMjAsIDB4NEMyMSwgMHg0QzIyLCAweDRDMjMsIDB4NEMyNCwgMHg0QzI1LCAweDRDMjYsCisgICAgMHg0QzI3LCAweDRDMjgsIDB4NEMyOSwgMHg0QzJBLCAweDRDMkIsIDB4NEMyQywgMHg0QzJELCAweDRDMkUsIDB4NEMyRiwKKyAgICAweDRDMzAsIDB4NEMzMSwgMHg0QzMyLCAweDRDMzMsIDB4NEMzNCwgMHg0QzM1LCAweDRDMzYsIDB4NEMzNywgMHg0QzM4LAorICAgIDB4NEMzOSwgMHg0QzNBLCAweDRDM0IsIDB4NEMzQywgMHg0QzNELCAweDRDM0UsIDB4NEMzRiwgMHg0QzQwLCAweDRDNDEsCisgICAgMHg0QzQyLCAweDRDNDMsIDB4NEM0NCwgMHg0QzQ1LCAweDRDNDYsIDB4NEM0NywgMHg0QzQ4LCAweDRDNDksIDB4NEM0QSwKKyAgICAweDRDNEIsIDB4NEM0QywgMHg0QzRELCAweDRDNEUsIDB4NEM0RiwgMHg0QzUwLCAweDRDNTEsIDB4NEM1MiwgMHg0QzUzLAorICAgIDB4NEM1NCwgMHg0QzU1LCAweDRDNTYsIDB4NEM1NywgMHg0QzU4LCAweDRDNTksIDB4NEM1QSwgMHg0QzVCLCAweDRDNUMsCisgICAgMHg0QzVELCAweDRDNUUsIDB4NEM1RiwgMHg0QzYwLCAweDRDNjEsIDB4NEM2MiwgMHg0QzYzLCAweDRDNjQsIDB4NEM2NSwKKyAgICAweDRDNjYsIDB4NEM2NywgMHg0QzY4LCAweDRDNjksIDB4NEM2QSwgMHg0QzZCLCAweDRDNkMsIDB4NEM2RCwgMHg0QzZFLAorICAgIDB4NEM2RiwgMHg0QzcwLCAweDRDNzEsIDB4NEM3MiwgMHg0QzczLCAweDRDNzQsIDB4NEM3NSwgMHg0Qzc2LCAweDRDNzgsCisgICAgMHg0Qzc5LCAweDRDN0EsIDB4NEM3QiwgMHg0QzdDLCAweDRDN0QsIDB4NEM3RSwgMHg0QzdGLCAweDRDODAsIDB4NEM4MSwKKyAgICAweDRDODIsIDB4NEM4MywgMHg0Qzg0LCAweDRDODUsIDB4NEM4NiwgMHg0Qzg3LCAweDRDODgsIDB4NEM4OSwgMHg0QzhBLAorICAgIDB4NEM4QiwgMHg0QzhDLCAweDRDOEQsIDB4NEM4RSwgMHg0QzhGLCAweDRDOTAsIDB4NEM5MSwgMHg0QzkyLCAweDRDOTMsCisgICAgMHg0Qzk0LCAweDRDOTUsIDB4NEM5NiwgMHg0Qzk3LCAweDRDOTgsIDB4NEM5OSwgMHg0QzlBLCAweDRDOUIsIDB4NEM5QywKKyAgICAweDRDOUQsIDB4NEM5RSwgMHg0Q0E0LCAweDRDQTUsIDB4NENBNiwgMHg0Q0E3LCAweDRDQTgsIDB4NENBOSwgMHg0Q0FBLAorICAgIDB4NENBQiwgMHg0Q0FDLCAweDRDQUQsIDB4NENBRSwgMHg0Q0FGLCAweDRDQjAsIDB4NENCMSwgMHg0Q0IyLCAweDRDQjMsCisgICAgMHg0Q0I0LCAweDRDQjUsIDB4NENCNiwgMHg0Q0I3LCAweDRDQjgsIDB4NENCOSwgMHg0Q0JBLCAweDRDQkIsIDB4NENCQywKKyAgICAweDRDQkQsIDB4NENCRSwgMHg0Q0JGLCAweDRDQzAsIDB4NENDMSwgMHg0Q0MyLCAweDRDQzMsIDB4NENDNCwgMHg0Q0M1LAorICAgIDB4NENDNiwgMHg0Q0M3LCAweDRDQzgsIDB4NENDOSwgMHg0Q0NBLCAweDRDQ0IsIDB4NENDQywgMHg0Q0NELCAweDRDQ0UsCisgICAgMHg0Q0NGLCAweDRDRDAsIDB4NENEMSwgMHg0Q0QyLCAweDRDRDMsIDB4NENENCwgMHg0Q0Q1LCAweDRDRDYsIDB4NENENywKKyAgICAweDRDRDgsIDB4NENEOSwgMHg0Q0RBLCAweDRDREIsIDB4NENEQywgMHg0Q0RELCAweDRDREUsIDB4NENERiwgMHg0Q0UwLAorICAgIDB4NENFMSwgMHg0Q0UyLCAweDRDRTMsIDB4NENFNCwgMHg0Q0U1LCAweDRDRTYsIDB4NENFNywgMHg0Q0U4LCAweDRDRTksCisgICAgMHg0Q0VBLCAweDRDRUIsIDB4NENFQywgMHg0Q0VELCAweDRDRUUsIDB4NENFRiwgMHg0Q0YwLCAweDRDRjEsIDB4NENGMiwKKyAgICAweDRDRjMsIDB4NENGNCwgMHg0Q0Y1LCAweDRDRjYsIDB4NENGNywgMHg0Q0Y4LCAweDRDRjksIDB4NENGQSwgMHg0Q0ZCLAorICAgIDB4NENGQywgMHg0Q0ZELCAweDRDRkUsIDB4NENGRiwgMHg0RDAwLCAweDREMDEsIDB4NEQwMiwgMHg0RDAzLCAweDREMDQsCisgICAgMHg0RDA1LCAweDREMDYsIDB4NEQwNywgMHg0RDA4LCAweDREMDksIDB4NEQwQSwgMHg0RDBCLCAweDREMEMsIDB4NEQwRCwKKyAgICAweDREMEUsIDB4NEQwRiwgMHg0RDEwLCAweDREMTEsIDB4NEQxMiwgMHg0RDFBLCAweDREMUIsIDB4NEQxQywgMHg0RDFELAorICAgIDB4NEQxRSwgMHg0RDFGLCAweDREMjAsIDB4NEQyMSwgMHg0RDIyLCAweDREMjMsIDB4NEQyNCwgMHg0RDI1LCAweDREMjYsCisgICAgMHg0RDI3LCAweDREMjgsIDB4NEQyOSwgMHg0RDJBLCAweDREMkIsIDB4NEQyQywgMHg0RDJELCAweDREMkUsIDB4NEQyRiwKKyAgICAweDREMzAsIDB4NEQzMSwgMHg0RDMyLCAweDREMzMsIDB4NEQzNCwgMHg0RDM1LCAweDREMzYsIDB4NEQzNywgMHg0RDM4LAorICAgIDB4NEQzOSwgMHg0RDNBLCAweDREM0IsIDB4NEQzQywgMHg0RDNELCAweDREM0UsIDB4NEQzRiwgMHg0RDQwLCAweDRENDEsCisgICAgMHg0RDQyLCAweDRENDMsIDB4NEQ0NCwgMHg0RDQ1LCAweDRENDYsIDB4NEQ0NywgMHg0RDQ4LCAweDRENDksIDB4NEQ0QSwKKyAgICAweDRENEIsIDB4NEQ0QywgMHg0RDRELCAweDRENEUsIDB4NEQ0RiwgMHg0RDUwLCAweDRENTEsIDB4NEQ1MiwgMHg0RDUzLAorICAgIDB4NEQ1NCwgMHg0RDU1LCAweDRENTYsIDB4NEQ1NywgMHg0RDU4LCAweDRENTksIDB4NEQ1QSwgMHg0RDVCLCAweDRENUMsCisgICAgMHg0RDVELCAweDRENUUsIDB4NEQ1RiwgMHg0RDYwLCAweDRENjEsIDB4NEQ2MiwgMHg0RDYzLCAweDRENjQsIDB4NEQ2NSwKKyAgICAweDRENjYsIDB4NEQ2NywgMHg0RDY4LCAweDRENjksIDB4NEQ2QSwgMHg0RDZCLCAweDRENkMsIDB4NEQ2RCwgMHg0RDZFLAorICAgIDB4NEQ2RiwgMHg0RDcwLCAweDRENzEsIDB4NEQ3MiwgMHg0RDczLCAweDRENzQsIDB4NEQ3NSwgMHg0RDc2LCAweDRENzcsCisgICAgMHg0RDc4LCAweDRENzksIDB4NEQ3QSwgMHg0RDdCLCAweDREN0MsIDB4NEQ3RCwgMHg0RDdFLCAweDREN0YsIDB4NEQ4MCwKKyAgICAweDREODEsIDB4NEQ4MiwgMHg0RDgzLCAweDREODQsIDB4NEQ4NSwgMHg0RDg2LCAweDREODcsIDB4NEQ4OCwgMHg0RDg5LAorICAgIDB4NEQ4QSwgMHg0RDhCLCAweDREOEMsIDB4NEQ4RCwgMHg0RDhFLCAweDREOEYsIDB4NEQ5MCwgMHg0RDkxLCAweDREOTIsCisgICAgMHg0RDkzLCAweDREOTQsIDB4NEQ5NSwgMHg0RDk2LCAweDREOTcsIDB4NEQ5OCwgMHg0RDk5LCAweDREOUEsIDB4NEQ5QiwKKyAgICAweDREOUMsIDB4NEQ5RCwgMHg0RDlFLCAweDREOUYsIDB4NERBMCwgMHg0REExLCAweDREQTIsIDB4NERBMywgMHg0REE0LAorICAgIDB4NERBNSwgMHg0REE2LCAweDREQTcsIDB4NERBOCwgMHg0REE5LCAweDREQUEsIDB4NERBQiwgMHg0REFDLCAweDREQUQsCisgICAgMHg0REFGLCAweDREQjAsIDB4NERCMSwgMHg0REIyLCAweDREQjMsIDB4NERCNCwgMHg0REI1LCAweDIwQUMsIDB4MDBBNSwKKyAgICAweDIwQUMsIDB4MDAyNCwgMHgzMDNGLCAweEEwMDAsIDB4QTAwMSwgMHhBMDAyLCAweEEwMDMsIDB4QTAwNCwgMHhBMDA1LAorICAgIDB4QTAwNiwgMHhBMDA3LCAweEEwMDgsIDB4QTAwOSwgMHhBMDBBLCAweEEwMEIsIDB4QTAwQywgMHhBMDBELCAweEEwMEUsCisgICAgMHhBMDBGLCAweEEwMTAsIDB4QTAxMSwgMHhBMDEyLCAweEEwMTMsIDB4QTAxNCwgMHhBMDE1LCAweEEwMTYsIDB4QTAxNywKKyAgICAweEEwMTgsIDB4QTAxOSwgMHhBMDFBLCAweEEwMUIsIDB4QTAxQywgMHhBMDFELCAweEEwMUUsIDB4QTAxRiwgMHhBMDIwLAorICAgIDB4QTAyMSwgMHhBMDIyLCAweEEwMjMsIDB4QTAyNCwgMHhBMDI1LCAweEEwMjYsIDB4QTAyNywgMHhBMDI4LCAweEEwMjksCisgICAgMHhBMDJBLCAweEEwMkIsIDB4QTAyQywgMHhBMDJELCAweEEwMkUsIDB4QTAyRiwgMHhBMDMwLCAweEEwMzEsIDB4QTAzMiwKKyAgICAweEEwMzMsIDB4QTAzNCwgMHhBMDM1LCAweEEwMzYsIDB4QTAzNywgMHhBMDM4LCAweEEwMzksIDB4QTAzQSwgMHhBMDNCLAorICAgIDB4QTAzQywgMHhBMDNELCAweEEwM0UsIDB4QTAzRiwgMHhBMDQwLCAweEEwNDEsIDB4QTA0MiwgMHhBMDQzLCAweEEwNDQsCisgICAgMHhBMDQ1LCAweEEwNDYsIDB4QTA0NywgMHhBMDQ4LCAweEEwNDksIDB4QTA0QSwgMHhBMDRCLCAweEEwNEMsIDB4QTA0RCwKKyAgICAweEEwNEUsIDB4QTA0RiwgMHhBMDUwLCAweEEwNTEsIDB4QTA1MiwgMHhBMDUzLCAweEEwNTQsIDB4QTA1NSwgMHhBMDU2LAorICAgIDB4QTA1NywgMHhBMDU4LCAweEEwNTksIDB4QTA1QSwgMHhBMDVCLCAweEEwNUMsIDB4QTA1RCwgMHhBMDVFLCAweEEwNUYsCisgICAgMHhBMDYwLCAweEEwNjEsIDB4QTA2MiwgMHhBMDYzLCAweEEwNjQsIDB4QTA2NSwgMHhBMDY2LCAweEEwNjcsIDB4QTA2OCwKKyAgICAweEEwNjksIDB4QTA2QSwgMHhBMDZCLCAweEEwNkMsIDB4QTA2RCwgMHhBMDZFLCAweEEwNkYsIDB4QTA3MCwgMHhBMDcxLAorICAgIDB4QTA3MiwgMHhBMDczLCAweEEwNzQsIDB4QTA3NSwgMHhBMDc2LCAweEEwNzcsIDB4QTA3OCwgMHhBMDc5LCAweEEwN0EsCisgICAgMHhBMDdCLCAweEEwN0MsIDB4QTA3RCwgMHhBMDdFLCAweEEwN0YsIDB4QTA4MCwgMHhBMDgxLCAweEEwODIsIDB4QTA4MywKKyAgICAweEEwODQsIDB4QTA4NSwgMHhBMDg2LCAweEEwODcsIDB4QTA4OCwgMHhBMDg5LCAweEEwOEEsIDB4QTA4QiwgMHhBMDhDLAorICAgIDB4QTA4RCwgMHhBMDhFLCAweEEwOEYsIDB4QTA5MCwgMHhBMDkxLCAweEEwOTIsIDB4QTA5MywgMHhBMDk0LCAweEEwOTUsCisgICAgMHhBMDk2LCAweEEwOTcsIDB4QTA5OCwgMHhBMDk5LCAweEEwOUEsIDB4QTA5QiwgMHhBMDlDLCAweEEwOUQsIDB4QTA5RSwKKyAgICAweEEwOUYsIDB4QTBBMCwgMHhBMEExLCAweEEwQTIsIDB4QTBBMywgMHhBMEE0LCAweEEwQTUsIDB4QTBBNiwgMHhBMEE3LAorICAgIDB4QTBBOCwgMHhBMEE5LCAweEEwQUEsIDB4QTBBQiwgMHhBMEFDLCAweEEwQUQsIDB4QTBBRSwgMHhBMEFGLCAweEEwQjAsCisgICAgMHhBMEIxLCAweEEwQjIsIDB4QTBCMywgMHhBMEI0LCAweEEwQjUsIDB4QTBCNiwgMHhBMEI3LCAweEEwQjgsIDB4QTBCOSwKKyAgICAweEEwQkEsIDB4QTBCQiwgMHhBMEJDLCAweEEwQkQsIDB4QTBCRSwgMHhBMEJGLCAweEEwQzAsIDB4QTBDMSwgMHhBMEMyLAorICAgIDB4QTBDMywgMHhBMEM0LCAweEEwQzUsIDB4QTBDNiwgMHhBMEM3LCAweEEwQzgsIDB4QTBDOSwgMHhBMENBLCAweEEwQ0IsCisgICAgMHhBMENDLCAweEEwQ0QsIDB4QTBDRSwgMHhBMENGLCAweEEwRDAsIDB4QTBEMSwgMHhBMEQyLCAweEEwRDMsIDB4QTBENCwKKyAgICAweEEwRDUsIDB4QTBENiwgMHhBMEQ3LCAweEEwRDgsIDB4QTBEOSwgMHhBMERBLCAweEEwREIsIDB4QTBEQywgMHhBMERELAorICAgIDB4QTBERSwgMHhBMERGLCAweEEwRTAsIDB4QTBFMSwgMHhBMEUyLCAweEEwRTMsIDB4QTBFNCwgMHhBMEU1LCAweEEwRTYsCisgICAgMHhBMEU3LCAweEEwRTgsIDB4QTBFOSwgMHhBMEVBLCAweEEwRUIsIDB4QTBFQywgMHhBMEVELCAweEEwRUUsIDB4QTBFRiwKKyAgICAweEEwRjAsIDB4QTBGMSwgMHhBMEYyLCAweEEwRjMsIDB4QTBGNCwgMHhBMEY1LCAweEEwRjYsIDB4QTBGNywgMHhBMEY4LAorICAgIDB4QTBGOSwgMHhBMEZBLCAweEEwRkIsIDB4QTBGQywgMHhBMEZELCAweEEwRkUsIDB4QTBGRiwgMHhBMTAwLCAweEExMDEsCisgICAgMHhBMTAyLCAweEExMDMsIDB4QTEwNCwgMHhBMTA1LCAweEExMDYsIDB4QTEwNywgMHhBMTA4LCAweEExMDksIDB4QTEwQSwKKyAgICAweEExMEIsIDB4QTEwQywgMHhBMTBELCAweEExMEUsIDB4QTEwRiwgMHhBMTEwLCAweEExMTEsIDB4QTExMiwgMHhBMTEzLAorICAgIDB4QTExNCwgMHhBMTE1LCAweEExMTYsIDB4QTExNywgMHhBMTE4LCAweEExMTksIDB4QTExQSwgMHhBMTFCLCAweEExMUMsCisgICAgMHhBMTFELCAweEExMUUsIDB4QTExRiwgMHhBMTIwLCAweEExMjEsIDB4QTEyMiwgMHhBMTIzLCAweEExMjQsIDB4QTEyNSwKKyAgICAweEExMjYsIDB4QTEyNywgMHhBMTI4LCAweEExMjksIDB4QTEyQSwgMHhBMTJCLCAweEExMkMsIDB4QTEyRCwgMHhBMTJFLAorICAgIDB4QTEyRiwgMHhBMTMwLCAweEExMzEsIDB4QTEzMiwgMHhBMTMzLCAweEExMzQsIDB4QTEzNSwgMHhBMTM2LCAweEExMzcsCisgICAgMHhBMTM4LCAweEExMzksIDB4QTEzQSwgMHhBMTNCLCAweEExM0MsIDB4QTEzRCwgMHhBMTNFLCAweEExM0YsIDB4QTE0MCwKKyAgICAweEExNDEsIDB4QTE0MiwgMHhBMTQzLCAweEExNDQsIDB4QTE0NSwgMHhBMTQ2LCAweEExNDcsIDB4QTE0OCwgMHhBMTQ5LAorICAgIDB4QTE0QSwgMHhBMTRCLCAweEExNEMsIDB4QTE0RCwgMHhBMTRFLCAweEExNEYsIDB4QTE1MCwgMHhBMTUxLCAweEExNTIsCisgICAgMHhBMTUzLCAweEExNTQsIDB4QTE1NSwgMHhBMTU2LCAweEExNTcsIDB4QTE1OCwgMHhBMTU5LCAweEExNUEsIDB4QTE1QiwKKyAgICAweEExNUMsIDB4QTE1RCwgMHhBMTVFLCAweEExNUYsIDB4QTE2MCwgMHhBMTYxLCAweEExNjIsIDB4QTE2MywgMHhBMTY0LAorICAgIDB4QTE2NSwgMHhBMTY2LCAweEExNjcsIDB4QTE2OCwgMHhBMTY5LCAweEExNkEsIDB4QTE2QiwgMHhBMTZDLCAweEExNkQsCisgICAgMHhBMTZFLCAweEExNkYsIDB4QTE3MCwgMHhBMTcxLCAweEExNzIsIDB4QTE3MywgMHhBMTc0LCAweEExNzUsIDB4QTE3NiwKKyAgICAweEExNzcsIDB4QTE3OCwgMHhBMTc5LCAweEExN0EsIDB4QTE3QiwgMHhBMTdDLCAweEExN0QsIDB4QTE3RSwgMHhBMTdGLAorICAgIDB4QTE4MCwgMHhBMTgxLCAweEExODIsIDB4QTE4MywgMHhBMTg0LCAweEExODUsIDB4QTE4NiwgMHhBMTg3LCAweEExODgsCisgICAgMHhBMTg5LCAweEExOEEsIDB4QTE4QiwgMHhBMThDLCAweEExOEQsIDB4QTE4RSwgMHhBMThGLCAweEExOTAsIDB4QTE5MSwKKyAgICAweEExOTIsIDB4QTE5MywgMHhBMTk0LCAweEExOTUsIDB4QTE5NiwgMHhBMTk3LCAweEExOTgsIDB4QTE5OSwgMHhBMTlBLAorICAgIDB4QTE5QiwgMHhBMTlDLCAweEExOUQsIDB4QTE5RSwgMHhBMTlGLCAweEExQTAsIDB4QTFBMSwgMHhBMUEyLCAweEExQTMsCisgICAgMHhBMUE0LCAweEExQTUsIDB4QTFBNiwgMHhBMUE3LCAweEExQTgsIDB4QTFBOSwgMHhBMUFBLCAweEExQUIsIDB4QTFBQywKKyAgICAweEExQUQsIDB4QTFBRSwgMHhBMUFGLCAweEExQjAsIDB4QTFCMSwgMHhBMUIyLCAweEExQjMsIDB4QTFCNCwgMHhBMUI1LAorICAgIDB4QTFCNiwgMHhBMUI3LCAweEExQjgsIDB4QTFCOSwgMHhBMUJBLCAweEExQkIsIDB4QTFCQywgMHhBMUJELCAweEExQkUsCisgICAgMHhBMUJGLCAweEExQzAsIDB4QTFDMSwgMHhBMUMyLCAweEExQzMsIDB4QTFDNCwgMHhBMUM1LCAweEExQzYsIDB4QTFDNywKKyAgICAweEExQzgsIDB4QTFDOSwgMHhBMUNBLCAweEExQ0IsIDB4QTFDQywgMHhBMUNELCAweEExQ0UsIDB4QTFDRiwgMHhBMUQwLAorICAgIDB4QTFEMSwgMHhBMUQyLCAweEExRDMsIDB4QTFENCwgMHhBMUQ1LCAweEExRDYsIDB4QTFENywgMHhBMUQ4LCAweEExRDksCisgICAgMHhBMURBLCAweEExREIsIDB4QTFEQywgMHhBMURELCAweEExREUsIDB4QTFERiwgMHhBMUUwLCAweEExRTEsIDB4QTFFMiwKKyAgICAweEExRTMsIDB4QTFFNCwgMHhBMUU1LCAweEExRTYsIDB4QTFFNywgMHhBMUU4LCAweEExRTksIDB4QTFFQSwgMHhBMUVCLAorICAgIDB4QTFFQywgMHhBMUVELCAweEExRUUsIDB4QTFFRiwgMHhBMUYwLCAweEExRjEsIDB4QTFGMiwgMHhBMUYzLCAweEExRjQsCisgICAgMHhBMUY1LCAweEExRjYsIDB4QTFGNywgMHhBMUY4LCAweEExRjksIDB4QTFGQSwgMHhBMUZCLCAweEExRkMsIDB4QTFGRCwKKyAgICAweEExRkUsIDB4QTFGRiwgMHhBMjAwLCAweEEyMDEsIDB4QTIwMiwgMHhBMjAzLCAweEEyMDQsIDB4QTIwNSwgMHhBMjA2LAorICAgIDB4QTIwNywgMHhBMjA4LCAweEEyMDksIDB4QTIwQSwgMHhBMjBCLCAweEEyMEMsIDB4QTIwRCwgMHhBMjBFLCAweEEyMEYsCisgICAgMHhBMjEwLCAweEEyMTEsIDB4QTIxMiwgMHhBMjEzLCAweEEyMTQsIDB4QTIxNSwgMHhBMjE2LCAweEEyMTcsIDB4QTIxOCwKKyAgICAweEEyMTksIDB4QTIxQSwgMHhBMjFCLCAweEEyMUMsIDB4QTIxRCwgMHhBMjFFLCAweEEyMUYsIDB4QTIyMCwgMHhBMjIxLAorICAgIDB4QTIyMiwgMHhBMjIzLCAweEEyMjQsIDB4QTIyNSwgMHhBMjI2LCAweEEyMjcsIDB4QTIyOCwgMHhBMjI5LCAweEEyMkEsCisgICAgMHhBMjJCLCAweEEyMkMsIDB4QTIyRCwgMHhBMjJFLCAweEEyMkYsIDB4QTIzMCwgMHhBMjMxLCAweEEyMzIsIDB4QTIzMywKKyAgICAweEEyMzQsIDB4QTIzNSwgMHhBMjM2LCAweEEyMzcsIDB4QTIzOCwgMHhBMjM5LCAweEEyM0EsIDB4QTIzQiwgMHhBMjNDLAorICAgIDB4QTIzRCwgMHhBMjNFLCAweEEyM0YsIDB4QTI0MCwgMHhBMjQxLCAweEEyNDIsIDB4QTI0MywgMHhBMjQ0LCAweEEyNDUsCisgICAgMHhBMjQ2LCAweEEyNDcsIDB4QTI0OCwgMHhBMjQ5LCAweEEyNEEsIDB4QTI0QiwgMHhBMjRDLCAweEEyNEQsIDB4QTI0RSwKKyAgICAweEEyNEYsIDB4QTI1MCwgMHhBMjUxLCAweEEyNTIsIDB4QTI1MywgMHhBMjU0LCAweEEyNTUsIDB4QTI1NiwgMHhBMjU3LAorICAgIDB4QTI1OCwgMHhBMjU5LCAweEEyNUEsIDB4QTI1QiwgMHhBMjVDLCAweEEyNUQsIDB4QTI1RSwgMHhBMjVGLCAweEEyNjAsCisgICAgMHhBMjYxLCAweEEyNjIsIDB4QTI2MywgMHhBMjY0LCAweEEyNjUsIDB4QTI2NiwgMHhBMjY3LCAweEEyNjgsIDB4QTI2OSwKKyAgICAweEEyNkEsIDB4QTI2QiwgMHhBMjZDLCAweEEyNkQsIDB4QTI2RSwgMHhBMjZGLCAweEEyNzAsIDB4QTI3MSwgMHhBMjcyLAorICAgIDB4QTI3MywgMHhBMjc0LCAweEEyNzUsIDB4QTI3NiwgMHhBMjc3LCAweEEyNzgsIDB4QTI3OSwgMHhBMjdBLCAweEEyN0IsCisgICAgMHhBMjdDLCAweEEyN0QsIDB4QTI3RSwgMHhBMjdGLCAweEEyODAsIDB4QTI4MSwgMHhBMjgyLCAweEEyODMsIDB4QTI4NCwKKyAgICAweEEyODUsIDB4QTI4NiwgMHhBMjg3LCAweEEyODgsIDB4QTI4OSwgMHhBMjhBLCAweEEyOEIsIDB4QTI4QywgMHhBMjhELAorICAgIDB4QTI4RSwgMHhBMjhGLCAweEEyOTAsIDB4QTI5MSwgMHhBMjkyLCAweEEyOTMsIDB4QTI5NCwgMHhBMjk1LCAweEEyOTYsCisgICAgMHhBMjk3LCAweEEyOTgsIDB4QTI5OSwgMHhBMjlBLCAweEEyOUIsIDB4QTI5QywgMHhBMjlELCAweEEyOUUsIDB4QTI5RiwKKyAgICAweEEyQTAsIDB4QTJBMSwgMHhBMkEyLCAweEEyQTMsIDB4QTJBNCwgMHhBMkE1LCAweEEyQTYsIDB4QTJBNywgMHhBMkE4LAorICAgIDB4QTJBOSwgMHhBMkFBLCAweEEyQUIsIDB4QTJBQywgMHhBMkFELCAweEEyQUUsIDB4QTJBRiwgMHhBMkIwLCAweEEyQjEsCisgICAgMHhBMkIyLCAweEEyQjMsIDB4QTJCNCwgMHhBMkI1LCAweEEyQjYsIDB4QTJCNywgMHhBMkI4LCAweEEyQjksIDB4QTJCQSwKKyAgICAweEEyQkIsIDB4QTJCQywgMHhBMkJELCAweEEyQkUsIDB4QTJCRiwgMHhBMkMwLCAweEEyQzEsIDB4QTJDMiwgMHhBMkMzLAorICAgIDB4QTJDNCwgMHhBMkM1LCAweEEyQzYsIDB4QTJDNywgMHhBMkM4LCAweEEyQzksIDB4QTJDQSwgMHhBMkNCLCAweEEyQ0MsCisgICAgMHhBMkNELCAweEEyQ0UsIDB4QTJDRiwgMHhBMkQwLCAweEEyRDEsIDB4QTJEMiwgMHhBMkQzLCAweEEyRDQsIDB4QTJENSwKKyAgICAweEEyRDYsIDB4QTJENywgMHhBMkQ4LCAweEEyRDksIDB4QTJEQSwgMHhBMkRCLCAweEEyREMsIDB4QTJERCwgMHhBMkRFLAorICAgIDB4QTJERiwgMHhBMkUwLCAweEEyRTEsIDB4QTJFMiwgMHhBMkUzLCAweEEyRTQsIDB4QTJFNSwgMHhBMkU2LCAweEEyRTcsCisgICAgMHhBMkU4LCAweEEyRTksIDB4QTJFQSwgMHhBMkVCLCAweEEyRUMsIDB4QTJFRCwgMHhBMkVFLCAweEEyRUYsIDB4QTJGMCwKKyAgICAweEEyRjEsIDB4QTJGMiwgMHhBMkYzLCAweEEyRjQsIDB4QTJGNSwgMHhBMkY2LCAweEEyRjcsIDB4QTJGOCwgMHhBMkY5LAorICAgIDB4QTJGQSwgMHhBMkZCLCAweEEyRkMsIDB4QTJGRCwgMHhBMkZFLCAweEEyRkYsIDB4QTMwMCwgMHhBMzAxLCAweEEzMDIsCisgICAgMHhBMzAzLCAweEEzMDQsIDB4QTMwNSwgMHhBMzA2LCAweEEzMDcsIDB4QTMwOCwgMHhBMzA5LCAweEEzMEEsIDB4QTMwQiwKKyAgICAweEEzMEMsIDB4QTMwRCwgMHhBMzBFLCAweEEzMEYsIDB4QTMxMCwgMHhBMzExLCAweEEzMTIsIDB4QTMxMywgMHhBMzE0LAorICAgIDB4QTMxNSwgMHhBMzE2LCAweEEzMTcsIDB4QTMxOCwgMHhBMzE5LCAweEEzMUEsIDB4QTMxQiwgMHhBMzFDLCAweEEzMUQsCisgICAgMHhBMzFFLCAweEEzMUYsIDB4QTMyMCwgMHhBMzIxLCAweEEzMjIsIDB4QTMyMywgMHhBMzI0LCAweEEzMjUsIDB4QTMyNiwKKyAgICAweEEzMjcsIDB4QTMyOCwgMHhBMzI5LCAweEEzMkEsIDB4QTMyQiwgMHhBMzJDLCAweEEzMkQsIDB4QTMyRSwgMHhBMzJGLAorICAgIDB4QTMzMCwgMHhBMzMxLCAweEEzMzIsIDB4QTMzMywgMHhBMzM0LCAweEEzMzUsIDB4QTMzNiwgMHhBMzM3LCAweEEzMzgsCisgICAgMHhBMzM5LCAweEEzM0EsIDB4QTMzQiwgMHhBMzNDLCAweEEzM0QsIDB4QTMzRSwgMHhBMzNGLCAweEEzNDAsIDB4QTM0MSwKKyAgICAweEEzNDIsIDB4QTM0MywgMHhBMzQ0LCAweEEzNDUsIDB4QTM0NiwgMHhBMzQ3LCAweEEzNDgsIDB4QTM0OSwgMHhBMzRBLAorICAgIDB4QTM0QiwgMHhBMzRDLCAweEEzNEQsIDB4QTM0RSwgMHhBMzRGLCAweEEzNTAsIDB4QTM1MSwgMHhBMzUyLCAweEEzNTMsCisgICAgMHhBMzU0LCAweEEzNTUsIDB4QTM1NiwgMHhBMzU3LCAweEEzNTgsIDB4QTM1OSwgMHhBMzVBLCAweEEzNUIsIDB4QTM1QywKKyAgICAweEEzNUQsIDB4QTM1RSwgMHhBMzVGLCAweEEzNjAsIDB4QTM2MSwgMHhBMzYyLCAweEEzNjMsIDB4QTM2NCwgMHhBMzY1LAorICAgIDB4QTM2NiwgMHhBMzY3LCAweEEzNjgsIDB4QTM2OSwgMHhBMzZBLCAweEEzNkIsIDB4QTM2QywgMHhBMzZELCAweEEzNkUsCisgICAgMHhBMzZGLCAweEEzNzAsIDB4QTM3MSwgMHhBMzcyLCAweEEzNzMsIDB4QTM3NCwgMHhBMzc1LCAweEEzNzYsIDB4QTM3NywKKyAgICAweEEzNzgsIDB4QTM3OSwgMHhBMzdBLCAweEEzN0IsIDB4QTM3QywgMHhBMzdELCAweEEzN0UsIDB4QTM3RiwgMHhBMzgwLAorICAgIDB4QTM4MSwgMHhBMzgyLCAweEEzODMsIDB4QTM4NCwgMHhBMzg1LCAweEEzODYsIDB4QTM4NywgMHhBMzg4LCAweEEzODksCisgICAgMHhBMzhBLCAweEEzOEIsIDB4QTM4QywgMHhBMzhELCAweEEzOEUsIDB4QTM4RiwgMHhBMzkwLCAweEEzOTEsIDB4QTM5MiwKKyAgICAweEEzOTMsIDB4QTM5NCwgMHhBMzk1LCAweEEzOTYsIDB4QTM5NywgMHhBMzk4LCAweEEzOTksIDB4QTM5QSwgMHhBMzlCLAorICAgIDB4QTM5QywgMHhBMzlELCAweEEzOUUsIDB4QTM5RiwgMHhBM0EwLCAweEEzQTEsIDB4QTNBMiwgMHhBM0EzLCAweEEzQTQsCisgICAgMHhBM0E1LCAweEEzQTYsIDB4QTNBNywgMHhBM0E4LCAweEEzQTksIDB4QTNBQSwgMHhBM0FCLCAweEEzQUMsIDB4QTNBRCwKKyAgICAweEEzQUUsIDB4QTNBRiwgMHhBM0IwLCAweEEzQjEsIDB4QTNCMiwgMHhBM0IzLCAweEEzQjQsIDB4QTNCNSwgMHhBM0I2LAorICAgIDB4QTNCNywgMHhBM0I4LCAweEEzQjksIDB4QTNCQSwgMHhBM0JCLCAweEEzQkMsIDB4QTNCRCwgMHhBM0JFLCAweEEzQkYsCisgICAgMHhBM0MwLCAweEEzQzEsIDB4QTNDMiwgMHhBM0MzLCAweEEzQzQsIDB4QTNDNSwgMHhBM0M2LCAweEEzQzcsIDB4QTNDOCwKKyAgICAweEEzQzksIDB4QTNDQSwgMHhBM0NCLCAweEEzQ0MsIDB4QTNDRCwgMHhBM0NFLCAweEEzQ0YsIDB4QTNEMCwgMHhBM0QxLAorICAgIDB4QTNEMiwgMHhBM0QzLCAweEEzRDQsIDB4QTNENSwgMHhBM0Q2LCAweEEzRDcsIDB4QTNEOCwgMHhBM0Q5LCAweEEzREEsCisgICAgMHhBM0RCLCAweEEzREMsIDB4QTNERCwgMHhBM0RFLCAweEEzREYsIDB4QTNFMCwgMHhBM0UxLCAweEEzRTIsIDB4QTNFMywKKyAgICAweEEzRTQsIDB4QTNFNSwgMHhBM0U2LCAweEEzRTcsIDB4QTNFOCwgMHhBM0U5LCAweEEzRUEsIDB4QTNFQiwgMHhBM0VDLAorICAgIDB4QTNFRCwgMHhBM0VFLCAweEEzRUYsIDB4QTNGMCwgMHhBM0YxLCAweEEzRjIsIDB4QTNGMywgMHhBM0Y0LCAweEEzRjUsCisgICAgMHhBM0Y2LCAweEEzRjcsIDB4QTNGOCwgMHhBM0Y5LCAweEEzRkEsIDB4QTNGQiwgMHhBM0ZDLCAweEEzRkQsIDB4QTNGRSwKKyAgICAweEEzRkYsIDB4QTQwMCwgMHhBNDAxLCAweEE0MDIsIDB4QTQwMywgMHhBNDA0LCAweEE0MDUsIDB4QTQwNiwgMHhBNDA3LAorICAgIDB4QTQwOCwgMHhBNDA5LCAweEE0MEEsIDB4QTQwQiwgMHhBNDBDLCAweEE0MEQsIDB4QTQwRSwgMHhBNDBGLCAweEE0MTAsCisgICAgMHhBNDExLCAweEE0MTIsIDB4QTQxMywgMHhBNDE0LCAweEE0MTUsIDB4QTQxNiwgMHhBNDE3LCAweEE0MTgsIDB4QTQxOSwKKyAgICAweEE0MUEsIDB4QTQxQiwgMHhBNDFDLCAweEE0MUQsIDB4QTQxRSwgMHhBNDFGLCAweEE0MjAsIDB4QTQyMSwgMHhBNDIyLAorICAgIDB4QTQyMywgMHhBNDI0LCAweEE0MjUsIDB4QTQyNiwgMHhBNDI3LCAweEE0MjgsIDB4QTQyOSwgMHhBNDJBLCAweEE0MkIsCisgICAgMHhBNDJDLCAweEE0MkQsIDB4QTQyRSwgMHhBNDJGLCAweEE0MzAsIDB4QTQzMSwgMHhBNDMyLCAweEE0MzMsIDB4QTQzNCwKKyAgICAweEE0MzUsIDB4QTQzNiwgMHhBNDM3LCAweEE0MzgsIDB4QTQzOSwgMHhBNDNBLCAweEE0M0IsIDB4QTQzQywgMHhBNDNELAorICAgIDB4QTQzRSwgMHhBNDNGLCAweEE0NDAsIDB4QTQ0MSwgMHhBNDQyLCAweEE0NDMsIDB4QTQ0NCwgMHhBNDQ1LCAweEE0NDYsCisgICAgMHhBNDQ3LCAweEE0NDgsIDB4QTQ0OSwgMHhBNDRBLCAweEE0NEIsIDB4QTQ0QywgMHhBNDRELCAweEE0NEUsIDB4QTQ0RiwKKyAgICAweEE0NTAsIDB4QTQ1MSwgMHhBNDUyLCAweEE0NTMsIDB4QTQ1NCwgMHhBNDU1LCAweEE0NTYsIDB4QTQ1NywgMHhBNDU4LAorICAgIDB4QTQ1OSwgMHhBNDVBLCAweEE0NUIsIDB4QTQ1QywgMHhBNDVELCAweEE0NUUsIDB4QTQ1RiwgMHhBNDYwLCAweEE0NjEsCisgICAgMHhBNDYyLCAweEE0NjMsIDB4QTQ2NCwgMHhBNDY1LCAweEE0NjYsIDB4QTQ2NywgMHhBNDY4LCAweEE0NjksIDB4QTQ2QSwKKyAgICAweEE0NkIsIDB4QTQ2QywgMHhBNDZELCAweEE0NkUsIDB4QTQ2RiwgMHhBNDcwLCAweEE0NzEsIDB4QTQ3MiwgMHhBNDczLAorICAgIDB4QTQ3NCwgMHhBNDc1LCAweEE0NzYsIDB4QTQ3NywgMHhBNDc4LCAweEE0NzksIDB4QTQ3QSwgMHhBNDdCLCAweEE0N0MsCisgICAgMHhBNDdELCAweEE0N0UsIDB4QTQ3RiwgMHhBNDgwLCAweEE0ODEsIDB4QTQ4MiwgMHhBNDgzLCAweEE0ODQsIDB4QTQ4NSwKKyAgICAweEE0ODYsIDB4QTQ4NywgMHhBNDg4LCAweEE0ODksIDB4QTQ4QSwgMHhBNDhCLCAweEE0OEMsIDB4QTQ5MCwgMHhBNDkxLAorICAgIDB4QTQ5MiwgMHhBNDkzLCAweEE0OTQsIDB4QTQ5NSwgMHhBNDk2LCAweEE0OTcsIDB4QTQ5OCwgMHhBNDk5LCAweEE0OUEsCisgICAgMHhBNDlCLCAweEE0OUMsIDB4QTQ5RCwgMHhBNDlFLCAweEE0OUYsIDB4QTRBMCwgMHhBNEExLCAweEE0QTIsIDB4QTRBMywKKyAgICAweEE0QTQsIDB4QTRBNSwgMHhBNEE2LCAweEE0QTcsIDB4QTRBOCwgMHhBNEE5LCAweEE0QUEsIDB4QTRBQiwgMHhBNEFDLAorICAgIDB4QTRBRCwgMHhBNEFFLCAweEE0QUYsIDB4QTRCMCwgMHhBNEIxLCAweEE0QjIsIDB4QTRCMywgMHhBNEI0LCAweEE0QjUsCisgICAgMHhBNEI2LCAweEE0QjcsIDB4QTRCOCwgMHhBNEI5LCAweEE0QkEsIDB4QTRCQiwgMHhBNEJDLCAweEE0QkQsIDB4QTRCRSwKKyAgICAweEE0QkYsIDB4QTRDMCwgMHhBNEMxLCAweEE0QzIsIDB4QTRDMywgMHhBNEM0LCAweEE0QzUsIDB4QTRDNiwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCSzJLLUhfNS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCSzJLLUhfNS5jcHAKaW5kZXggMDE1NTVhNi4uNDc1MTRkMyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQksySy1IXzUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLMkstSF81LmNwcApAQCAtMTM2NywzNDMgKzEzNjcsNDU2IEBACiB9OwogCiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCSzJLX0hfNV9EV29yZFsxMDE3ICogNF0gPSB7Ci0gICAgMHg4MTMwLCAweDg0MzYsIDB4ODQzNiwgMHg1NzUyLCAweDgxMzgsIDB4RkQzOCwgMHhGRDM5LCAweDU3OUMsIDB4ODEzOCwgMHhGRTMwLCAweEZFMzksIDB4NTc5RSwKLSAgICAweDgxMzksIDB4ODEzMCwgMHg4MTM3LCAweDU3QTgsIDB4ODEzOSwgMHg4MTM5LCAweDgxMzksIDB4NTdCMCwgMHg4MTM5LCAweDgyMzAsIDB4ODIzOSwgMHg1N0IxLAotICAgIDB4ODEzOSwgMHg4MzMwLCAweDgzMzksIDB4NTdCQiwgMHg4MTM5LCAweDg0MzAsIDB4ODQzOSwgMHg1N0M1LCAweDgxMzksIDB4ODUzMCwgMHg4NTM5LCAweDU3Q0YsCi0gICAgMHg4MTM5LCAweDg2MzAsIDB4ODYzOSwgMHg1N0Q5LCAweDgxMzksIDB4ODczMCwgMHg4NzM5LCAweDU3RTMsIDB4ODEzOSwgMHg4ODMwLCAweDg4MzksIDB4NTdFRCwKLSAgICAweDgxMzksIDB4ODkzMCwgMHg4OTM5LCAweDU3RjcsIDB4ODEzOSwgMHg4QjMyLCAweDhCMzIsIDB4MTA0MiwgMHg4MTM5LCAweDhCMzMsIDB4OEIzMywgMHgxMjYzLAotICAgIDB4ODEzOSwgMHg4QjM0LCAweDhCMzQsIDB4MTI3MiwgMHg4MTM5LCAweDhCMzUsIDB4OEIzNSwgMHgxMjY1LCAweDgxMzksIDB4OEIzNiwgMHg4QjM2LCAweDEwNTksCi0gICAgMHg4MTM5LCAweDhCMzcsIDB4OEIzNywgMHgyNzkzLCAweDgxMzksIDB4OEIzOCwgMHg4QjM4LCAweDA2M0QsIDB4ODEzOSwgMHg4QjM5LCAweDhCMzksIDB4MTMwMywKLSAgICAweDgxMzksIDB4OEMzMCwgMHg4QzMwLCAweDBDQTYsIDB4ODEzOSwgMHg4QzMxLCAweDhDMzEsIDB4MDYzOCwgMHg4MTM5LCAweDhDMzIsIDB4OEMzMiwgMHgwQ0M2LAotICAgIDB4ODEzOSwgMHg4QzMzLCAweDhDMzMsIDB4MDNENiwgMHg4MTM5LCAweDhDMzQsIDB4OEMzNCwgMHgxMjlELCAweDgxMzksIDB4OEMzNSwgMHg4QzM1LCAweDEzMTQsCi0gICAgMHg4MTM5LCAweDhDMzYsIDB4OEMzNiwgMHgxMzBGLCAweDgxMzksIDB4OEMzNywgMHg4QzM3LCAweDA4MkIsIDB4ODEzOSwgMHg4QzM4LCAweDhDMzgsIDB4MTM5OSwKLSAgICAweDgxMzksIDB4OEMzOSwgMHg4QzM5LCAweDA1OTcsIDB4ODEzOSwgMHg4RDMwLCAweDhEMzAsIDB4MDlFRiwgMHg4MTM5LCAweDhEMzEsIDB4OEQzMSwgMHgxMkZDLAotICAgIDB4ODEzOSwgMHg4RDMyLCAweDhEMzIsIDB4MTI2NiwgMHg4MTM5LCAweDhEMzMsIDB4OEQzMywgMHgxMjg0LCAweDgxMzksIDB4OEQzNCwgMHg4RDM0LCAweDJBMUEsCi0gICAgMHg4MTM5LCAweDhEMzUsIDB4OEQzNSwgMHgwRDQ1LCAweDgxMzksIDB4OEQzNiwgMHg4RDM2LCAweDA0N0UsIDB4ODEzOSwgMHg4RDM3LCAweDhEMzcsIDB4MTM1MiwKLSAgICAweDgxMzksIDB4OEQzOCwgMHg4RDM4LCAweDA0Q0MsIDB4ODEzOSwgMHg4RDM5LCAweDhEMzksIDB4MTM5QywgMHg4MTM5LCAweDhFMzAsIDB4OEUzMCwgMHgxMEJCLAotICAgIDB4ODEzOSwgMHg4RTMxLCAweDhFMzEsIDB4MDk2NywgMHg4MTM5LCAweDhFMzIsIDB4OEUzMiwgMHgxNTkzLCAweDgxMzksIDB4OEUzMywgMHg4RTMzLCAweDBFNzIsCi0gICAgMHg4MTM5LCAweDhFMzQsIDB4OEUzNCwgMHgwRDU2LCAweDgxMzksIDB4OEUzNSwgMHg4RTM1LCAweDE2MUMsIDB4ODEzOSwgMHg4RTM2LCAweDhFMzYsIDB4MkQyRCwKLSAgICAweDgxMzksIDB4OEUzNywgMHg4RTM3LCAweDBGMTMsIDB4ODEzOSwgMHg4RTM4LCAweDhFMzgsIDB4MDU3NiwgMHg4MTM5LCAweDhFMzksIDB4OEUzOSwgMHgwQjZGLAotICAgIDB4ODEzOSwgMHg4RjMwLCAweDhGMzAsIDB4MTIzMCwgMHg4MTM5LCAweDhGMzEsIDB4OEYzMSwgMHgxNzJFLCAweDgxMzksIDB4OEYzMiwgMHg4RjMyLCAweDA1NkEsCi0gICAgMHg4MTM5LCAweDhGMzMsIDB4OEYzMywgMHgwRjZDLCAweDgxMzksIDB4OEYzNCwgMHg4RjM0LCAweDE0QjYsIDB4ODEzOSwgMHg4RjM1LCAweDhGMzUsIDB4MEQ0MywKLSAgICAweDgxMzksIDB4OEYzNiwgMHg4RjM2LCAweDE3NzQsIDB4ODEzOSwgMHg4RjM3LCAweDhGMzcsIDB4MENGNiwgMHg4MTM5LCAweDhGMzgsIDB4OEYzOCwgMHgxODE1LAotICAgIDB4ODEzOSwgMHg4RjM5LCAweDhGMzksIDB4MDZGRCwgMHg4MTM5LCAweDkwMzAsIDB4OTAzMCwgMHgwODJELCAweDgxMzksIDB4OTAzMSwgMHg5MDMxLCAweDA4QkUsCi0gICAgMHg4MTM5LCAweDkwMzIsIDB4OTAzMiwgMHgwNkM0LCAweDgxMzksIDB4OTAzMywgMHg5MDMzLCAweDE4MTMsIDB4ODEzOSwgMHg5MDM0LCAweDkwMzQsIDB4MDczQywKLSAgICAweDgxMzksIDB4OTAzNSwgMHg5MDM1LCAweDEzOTgsIDB4ODEzOSwgMHg5MDM2LCAweDkwMzYsIDB4MTRBRCwgMHg4MTM5LCAweDkwMzcsIDB4OTAzNywgMHgxNEY2LAotICAgIDB4ODEzOSwgMHg5MDM4LCAweDkwMzgsIDB4MDcwNiwgMHg4MTM5LCAweDkwMzksIDB4OTAzOSwgMHgxNzYyLCAweDgxMzksIDB4OTEzMCwgMHg5MTMwLCAweDE1RUUsCi0gICAgMHg4MTM5LCAweDkxMzEsIDB4OTEzMSwgMHgxNUUwLCAweDgxMzksIDB4OTEzMiwgMHg5MTMyLCAweDBGOEYsIDB4ODEzOSwgMHg5MTMzLCAweDkxMzMsIDB4MDZFNSwKLSAgICAweDgxMzksIDB4OTEzNCwgMHg5MTM0LCAweDMyOTIsIDB4ODEzOSwgMHg5MTM1LCAweDkxMzUsIDB4MEQ2RCwgMHg4MTM5LCAweDkxMzYsIDB4OTEzNiwgMHgxMUE2LAotICAgIDB4ODEzOSwgMHg5MTM3LCAweDkxMzcsIDB4MTkwOSwgMHg4MTM5LCAweDkxMzgsIDB4OTEzOCwgMHgwRUQzLCAweDgxMzksIDB4OTEzOSwgMHg5MTM5LCAweDA1RjYsCi0gICAgMHg4MTM5LCAweDkyMzAsIDB4OTIzMCwgMHgwOEMwLCAweDgxMzksIDB4OTIzMSwgMHg5MjMxLCAweDA2NUEsIDB4ODEzOSwgMHg5MjMyLCAweDkyMzIsIDB4MEVFRCwKLSAgICAweDgxMzksIDB4OTIzMywgMHg5MjMzLCAweDBDQjAsIDB4ODEzOSwgMHg5MjM0LCAweDkyMzQsIDB4MTBGRSwgMHg4MTM5LCAweDkyMzUsIDB4OTIzNSwgMHgxMTA1LAotICAgIDB4ODEzOSwgMHg5MjM2LCAweDkyMzYsIDB4MEIyMSwgMHg4MTM5LCAweDkyMzcsIDB4OTIzNywgMHgwQzM0LCAweDgxMzksIDB4OTIzOCwgMHg5MjM4LCAweDExQjgsCi0gICAgMHg4MTM5LCAweDkyMzksIDB4OTIzOSwgMHgwNTc4LCAweDgxMzksIDB4OTMzMCwgMHg5MzMwLCAweDE5QkQsIDB4ODEzOSwgMHg5MzMxLCAweDkzMzEsIDB4MEVGMiwKLSAgICAweDgxMzksIDB4OTMzMiwgMHg5MzMyLCAweDA0MzEsIDB4ODEzOSwgMHg5MzMzLCAweDkzMzMsIDB4MEFCMCwgMHg4MTM5LCAweDkzMzQsIDB4OTMzNCwgMHgwRDY2LAotICAgIDB4ODEzOSwgMHg5MzM1LCAweDkzMzUsIDB4MEMxNywgMHg4MTM5LCAweDkzMzYsIDB4OTMzNiwgMHgwREEzLCAweDgxMzksIDB4OTMzNywgMHg5MzM3LCAweDA4MDUsCi0gICAgMHg4MTM5LCAweDkzMzgsIDB4OTMzOCwgMHgxMjAzLCAweDgxMzksIDB4OTMzOSwgMHg5MzM5LCAweDA2QjMsIDB4ODEzOSwgMHg5NDMwLCAweDk0MzAsIDB4MTI2OSwKLSAgICAweDgxMzksIDB4OTQzMSwgMHg5NDMxLCAweDE2OUQsIDB4ODEzOSwgMHg5NDMyLCAweDk0MzIsIDB4MEJDQiwgMHg4MTM5LCAweDk0MzMsIDB4OTQzMywgMHgwRkU5LAotICAgIDB4ODEzOSwgMHg5NDM0LCAweDk0MzQsIDB4MEI2NCwgMHg4MTM5LCAweDk0MzUsIDB4OTQzNSwgMHgwQzg5LCAweDgxMzksIDB4OTQzNiwgMHg5NDM2LCAweDBGQzksCi0gICAgMHg4MTM5LCAweDk0MzcsIDB4OTQzNywgMHgxMEQ2LCAweDgxMzksIDB4OTQzOCwgMHg5NDM4LCAweDA3MjgsIDB4ODEzOSwgMHg5NDM5LCAweDk0MzksIDB4MEU5MCwKLSAgICAweDgxMzksIDB4OTUzMCwgMHg5NTMwLCAweDA2QzUsIDB4ODEzOSwgMHg5NTMxLCAweDk1MzEsIDB4MEQzMywgMHg4MTM5LCAweDk1MzIsIDB4OTUzMiwgMHgxMEE4LAotICAgIDB4ODEzOSwgMHg5NTMzLCAweDk1MzMsIDB4MEU0MiwgMHg4MTM5LCAweDk1MzQsIDB4OTUzNCwgMHgxQkM2LCAweDgxMzksIDB4OTUzNSwgMHg5NTM1LCAweDFCNjAsCi0gICAgMHg4MTM5LCAweDk1MzYsIDB4OTUzNiwgMHgzRUJGLCAweDgxMzksIDB4OTUzNywgMHg5NTM3LCAweDAzRTIsIDB4ODEzOSwgMHg5NTM4LCAweDk1MzgsIDB4MEJDMywKLSAgICAweDgxMzksIDB4OTUzOSwgMHg5NTM5LCAweDBBRjgsIDB4ODEzOSwgMHg5NjMwLCAweDk2MzAsIDB4MEIyMiwgMHg4MTM5LCAweDk2MzEsIDB4OTYzMSwgMHgwQUIxLAotICAgIDB4ODEzOSwgMHg5NjMyLCAweDk2MzIsIDB4MEQ0RiwgMHg4MTM5LCAweDk2MzMsIDB4OTYzMywgMHgwRDQ2LCAweDgxMzksIDB4OTYzNCwgMHg5NjM0LCAweDBENTUsCi0gICAgMHg4MTM5LCAweDk2MzUsIDB4OTYzNSwgMHg0MENCLCAweDgxMzksIDB4OTYzNiwgMHg5NjM2LCAweDA3ODMsIDB4ODEzOSwgMHg5NjM3LCAweDk2MzcsIDB4MEZEMSwKLSAgICAweDgxMzksIDB4OTYzOCwgMHg5NjM4LCAweDA5RUIsIDB4ODEzOSwgMHg5NjM5LCAweDk2MzksIDB4MTFGMCwgMHg4MTM5LCAweDk3MzAsIDB4OTczMCwgMHgwQURDLAotICAgIDB4ODEzOSwgMHg5NzMxLCAweDk3MzEsIDB4MUNFNywgMHg4MTM5LCAweDk3MzIsIDB4OTczMiwgMHgxQzVFLCAweDgxMzksIDB4OTczMywgMHg5NzMzLCAweDBFQTksCi0gICAgMHg4MTM5LCAweDk3MzQsIDB4OTczNCwgMHgxMDFCLCAweDgxMzksIDB4OTczNSwgMHg5NzM1LCAweDEwRDUsIDB4ODEzOSwgMHg5NzM2LCAweDk3MzYsIDB4MDlCQSwKLSAgICAweDgxMzksIDB4OTczNywgMHg5NzM3LCAweDA2MzcsIDB4ODEzOSwgMHg5NzM4LCAweDk3MzgsIDB4MUJDQiwgMHg4MTM5LCAweDk3MzksIDB4OTczOSwgMHgwNjM5LAotICAgIDB4ODEzOSwgMHg5ODMwLCAweDk4MzAsIDB4MUExRSwgMHg4MTM5LCAweDk4MzEsIDB4OTgzMSwgMHgwQ0JELCAweDgxMzksIDB4OTgzMiwgMHg5ODMyLCAweDA0RTEsCi0gICAgMHg4MTM5LCAweDk4MzMsIDB4OTgzMywgMHgxMjMxLCAweDgxMzksIDB4OTgzNCwgMHg5ODM0LCAweDExQzAsIDB4ODEzOSwgMHg5ODM1LCAweDk4MzUsIDB4MDhGOSwKLSAgICAweDgxMzksIDB4OTgzNiwgMHg5ODM2LCAweDBEMTksIDB4ODEzOSwgMHg5ODM3LCAweDk4MzcsIDB4MTYxOCwgMHg4MTM5LCAweDk4MzgsIDB4OTgzOCwgMHgxMURBLAotICAgIDB4ODEzOSwgMHg5ODM5LCAweDk4MzksIDB4MUNEQywgMHg4MTM5LCAweDk5MzAsIDB4OTkzMCwgMHgwQ0U0LCAweDgxMzksIDB4OTkzMSwgMHg5OTMxLCAweDQ1QTIsCi0gICAgMHg4MTM5LCAweDk5MzIsIDB4OTkzMiwgMHgxQkYwLCAweDgxMzksIDB4OTkzMywgMHg5OTMzLCAweDA1MEIsIDB4ODEzOSwgMHg5OTM0LCAweDk5MzQsIDB4MEZEMywKLSAgICAweDgxMzksIDB4OTkzNSwgMHg5OTM1LCAweDBGOUIsIDB4ODEzOSwgMHg5OTM2LCAweDk5MzYsIDB4MTA0OSwgMHg4MTM5LCAweDk5MzcsIDB4OTkzNywgMHg0OURDLAotICAgIDB4ODEzOSwgMHg5OTM4LCAweDk5MzgsIDB4MUY5NiwgMHg4MTM5LCAweDk5MzksIDB4OTkzOSwgMHgwODk4LCAweDgxMzksIDB4OUEzMCwgMHg5QTMwLCAweDBGRkQsCi0gICAgMHg4MTM5LCAweDlBMzEsIDB4OUEzMSwgMHgwNzIxLCAweDgxMzksIDB4OUEzMiwgMHg5QTMyLCAweDA1RjgsIDB4ODEzOSwgMHg5QTMzLCAweDlBMzMsIDB4MUQxNSwKLSAgICAweDgxMzksIDB4OUEzNCwgMHg5QTM0LCAweDFENTAsIDB4ODEzOSwgMHg5QTM1LCAweDlBMzUsIDB4MUUzQiwgMHg4MTM5LCAweDlBMzYsIDB4OUEzNiwgMHgwNTA1LAotICAgIDB4ODEzOSwgMHg5QTM3LCAweDlBMzcsIDB4MTIzQywgMHg4MTM5LCAweDlBMzgsIDB4OUEzOCwgMHgxMjQwLCAweDgxMzksIDB4OUEzOSwgMHg5QTM5LCAweDBEMjYsCi0gICAgMHg4MTM5LCAweDlCMzAsIDB4OUIzMCwgMHgxRTdCLCAweDgxMzksIDB4OUIzMSwgMHg5QjMxLCAweDBGOEMsIDB4ODEzOSwgMHg5QjMyLCAweDlCMzIsIDB4MDRFMiwKLSAgICAweDgxMzksIDB4OUIzMywgMHg5QjMzLCAweDREMTMsIDB4ODEzOSwgMHg5QjM0LCAweDlCMzQsIDB4MTA1RiwgMHg4MTM5LCAweDlCMzUsIDB4OUIzNSwgMHgxMEI0LAotICAgIDB4ODEzOSwgMHg5QjM2LCAweDlCMzYsIDB4NEUxOCwgMHg4MTM5LCAweDlCMzcsIDB4OUIzNywgMHgwOURBLCAweDgxMzksIDB4OUIzOCwgMHg5QjM4LCAweDA4QzEsCi0gICAgMHg4MTM5LCAweDlCMzksIDB4OUIzOSwgMHgxRTc1LCAweDgxMzksIDB4OUMzMCwgMHg5QzMwLCAweDIwN0QsIDB4ODEzOSwgMHg5QzMxLCAweDlDMzEsIDB4MDZCMiwKLSAgICAweDgxMzksIDB4OUMzMiwgMHg5QzMyLCAweDA5RUUsIDB4ODEzOSwgMHg5QzMzLCAweDlDMzMsIDB4MUQ3OSwgMHg4MTM5LCAweDlDMzQsIDB4OUMzNCwgMHgxMENGLAotICAgIDB4ODEzOSwgMHg5QzM1LCAweDlDMzUsIDB4NTBFQSwgMHg4MTM5LCAweDlDMzYsIDB4OUMzNiwgMHgwNjY0LCAweDgxMzksIDB4OUMzNywgMHg5QzM3LCAweDBBRUIsCi0gICAgMHg4MTM5LCAweDlDMzgsIDB4OUMzOCwgMHgwNkVBLCAweDgxMzksIDB4OUMzOSwgMHg5QzM5LCAweDIxOEQsIDB4ODEzOSwgMHg5RDMwLCAweDlEMzAsIDB4MDhGMSwKLSAgICAweDgxMzksIDB4OUQzMSwgMHg5RDMxLCAweDEwN0IsIDB4ODEzOSwgMHg5RDMyLCAweDlEMzIsIDB4MjIwOSwgMHg4MTM5LCAweDlEMzMsIDB4OUQzMywgMHgxRjAwLAotICAgIDB4ODEzOSwgMHg5RDM0LCAweDlEMzQsIDB4MUVGNCwgMHg4MTM5LCAweDlEMzUsIDB4OUQzNSwgMHgwRDRBLCAweDgxMzksIDB4OUQzNiwgMHg5RDM2LCAweDBENkUsCi0gICAgMHg4MTM5LCAweDlEMzcsIDB4OUQzNywgMHgwRjUwLCAweDgxMzksIDB4OUQzOCwgMHg5RDM4LCAweDIwNkQsIDB4ODEzOSwgMHg5RDM5LCAweDlEMzksIDB4MDcyMCwKLSAgICAweDgxMzksIDB4OUUzMCwgMHg5RTMwLCAweDA2REEsIDB4ODEzOSwgMHg5RTMxLCAweDlFMzEsIDB4MURFQywgMHg4MTM5LCAweDlFMzIsIDB4OUUzMiwgMHgxRUQwLAotICAgIDB4ODEzOSwgMHg5RTMzLCAweDlFMzMsIDB4MTM5QiwgMHg4MTM5LCAweDlFMzQsIDB4OUUzNCwgMHgxMjYwLCAweDgxMzksIDB4OUUzNSwgMHg5RTM1LCAweDA3NDYsCi0gICAgMHg4MTM5LCAweDlFMzYsIDB4OUUzNiwgMHgyMjM5LCAweDgxMzksIDB4OUUzNywgMHg5RTM3LCAweDIwOUMsIDB4ODEzOSwgMHg5RTM4LCAweDlFMzgsIDB4MjY4OCwKLSAgICAweDgxMzksIDB4OUUzOSwgMHg5RTM5LCAweDBBNjAsIDB4ODEzOSwgMHg5RjMwLCAweDlGMzAsIDB4MjA3MSwgMHg4MTM5LCAweDlGMzEsIDB4OUYzMSwgMHgwQTkwLAotICAgIDB4ODEzOSwgMHg5RjMyLCAweDlGMzIsIDB4NTU4NiwgMHg4MTM5LCAweDlGMzMsIDB4OUYzMywgMHgwRDg5LCAweDgxMzksIDB4OUYzNCwgMHg5RjM0LCAweDA3OTEsCi0gICAgMHg4MTM5LCAweDlGMzUsIDB4OUYzNSwgMHgxQTU1LCAweDgxMzksIDB4OUYzNiwgMHg5RjM2LCAweDI2MTgsIDB4ODEzOSwgMHg5RjM3LCAweDlGMzcsIDB4MDVFNSwKLSAgICAweDgxMzksIDB4OUYzOCwgMHg5RjM4LCAweDA3MUQsIDB4ODEzOSwgMHg5RjM5LCAweDlGMzksIDB4MEQ4QSwgMHg4MTM5LCAweEEwMzAsIDB4QTAzMCwgMHgwNDMwLAotICAgIDB4ODEzOSwgMHhBMDMxLCAweEEwMzEsIDB4MjBDNiwgMHg4MTM5LCAweEEwMzIsIDB4QTAzMiwgMHgxRTg2LCAweDgxMzksIDB4QTAzMywgMHhBMDMzLCAweDIwMzcsCi0gICAgMHg4MTM5LCAweEEwMzQsIDB4QTAzNCwgMHgxRjM0LCAweDgxMzksIDB4QTAzNSwgMHhBMDM1LCAweDEyRjMsIDB4ODEzOSwgMHhBNTMzLCAweEE1MzUsIDB4NTc3QiwKLSAgICAweDgxMzksIDB4QTUzOCwgMHhBNTM5LCAweDU3N0UsIDB4ODEzOSwgMHhBNjMwLCAweEE2MzAsIDB4NTc4MCwgMHg4MTM5LCAweEE2MzQsIDB4QTYzNCwgMHg1NzU1LAotICAgIDB4ODEzOSwgMHhBNjM2LCAweEE2MzYsIDB4NTc2NywgMHg4MTM5LCAweEE3MzUsIDB4QTczNSwgMHg1Nzc2LCAweDgxMzksIDB4QTczNiwgMHhBNzM2LCAweDU3NzgsCi0gICAgMHg4MTM5LCAweEE3MzcsIDB4QTczNywgMHg1Nzc3LCAweDgxMzksIDB4QTczOCwgMHhBNzM4LCAweDU3NzksIDB4ODEzOSwgMHhBODM2LCAweEE4MzgsIDB4NTc4MSwKLSAgICAweDgxMzksIDB4QjQzNCwgMHhCNDM5LCAweDU3ODQsIDB4ODEzOSwgMHhCNTMwLCAweEI1MzksIDB4NTc4QSwgMHg4MTM5LCAweEI2MzAsIDB4QjYzNywgMHg1Nzk0LAotICAgIDB4ODEzOSwgMHhFRTM5LCAweEVFMzksIDB4NTgwMSwgMHg4MTM5LCAweEVGMzAsIDB4RUYzOSwgMHg1ODAyLCAweDgxMzksIDB4RjAzMCwgMHhGMDM5LCAweDU4MEMsCi0gICAgMHg4MTM5LCAweEYxMzAsIDB4RjEzOSwgMHg1ODE2LCAweDgxMzksIDB4RjIzMCwgMHhGMjM5LCAweDU4MjAsIDB4ODEzOSwgMHhGMzMwLCAweEYzMzksIDB4NTgyQSwKLSAgICAweDgxMzksIDB4RjQzMCwgMHhGNDM5LCAweDU4MzQsIDB4ODEzOSwgMHhGNTMwLCAweEY1MzksIDB4NTgzRSwgMHg4MTM5LCAweEY2MzAsIDB4RjYzOSwgMHg1ODQ4LAotICAgIDB4ODEzOSwgMHhGNzMwLCAweEY3MzksIDB4NTg1MiwgMHg4MTM5LCAweEY4MzAsIDB4RjgzOSwgMHg1ODVDLCAweDgxMzksIDB4RjkzMCwgMHhGOTM5LCAweDU4NjYsCi0gICAgMHg4MTM5LCAweEZBMzAsIDB4RkEzOSwgMHg1ODcwLCAweDgxMzksIDB4RkIzMCwgMHhGQjM5LCAweDU4N0EsIDB4ODEzOSwgMHhGQzMwLCAweEZDMzksIDB4NTg4NCwKLSAgICAweDgxMzksIDB4RkQzMCwgMHhGRDM5LCAweDU4OEUsIDB4ODEzOSwgMHhGRTMwLCAweEZFMzksIDB4NTg5OCwgMHg4MjMwLCAweDgxMzAsIDB4ODEzOSwgMHg1OEEyLAotICAgIDB4ODIzMCwgMHg4MjMwLCAweDgyMzksIDB4NThBQywgMHg4MjMwLCAweDgzMzAsIDB4ODMzOSwgMHg1OEI2LCAweDgyMzAsIDB4ODQzMCwgMHg4NDM5LCAweDU4QzAsCi0gICAgMHg4MjMwLCAweDg1MzAsIDB4ODUzOSwgMHg1OENBLCAweDgyMzAsIDB4ODYzMCwgMHg4NjM5LCAweDU4RDQsIDB4ODIzMCwgMHg4NzMwLCAweDg3MzksIDB4NThERSwKLSAgICAweDgyMzAsIDB4ODgzMCwgMHg4ODM5LCAweDU4RTgsIDB4ODIzMCwgMHg4OTMwLCAweDg5MzksIDB4NThGMiwgMHg4MjMwLCAweDhBMzAsIDB4OEEzOSwgMHg1OEZDLAotICAgIDB4ODIzMCwgMHg4QjMwLCAweDhCMzksIDB4NTkwNiwgMHg4MjMwLCAweDhDMzAsIDB4OEMzOSwgMHg1OTEwLCAweDgyMzAsIDB4OEQzMCwgMHg4RDM5LCAweDU5MUEsCi0gICAgMHg4MjMwLCAweDhFMzAsIDB4OEUzOSwgMHg1OTI0LCAweDgyMzAsIDB4OEYzMCwgMHg4RjM5LCAweDU5MkUsIDB4ODIzMCwgMHg5MDMwLCAweDkwMzksIDB4NTkzOCwKLSAgICAweDgyMzAsIDB4OTEzMCwgMHg5MTM5LCAweDU5NDIsIDB4ODIzMCwgMHg5MjMwLCAweDkyMzksIDB4NTk0QywgMHg4MjMwLCAweDkzMzAsIDB4OTMzOSwgMHg1OTU2LAotICAgIDB4ODIzMCwgMHg5NDMwLCAweDk0MzksIDB4NTk2MCwgMHg4MjMwLCAweDk1MzAsIDB4OTUzOSwgMHg1OTZBLCAweDgyMzAsIDB4OTYzMCwgMHg5NjM5LCAweDU5NzQsCi0gICAgMHg4MjMwLCAweDk3MzAsIDB4OTczOSwgMHg1OTdFLCAweDgyMzAsIDB4OTgzMCwgMHg5ODM5LCAweDU5ODgsIDB4ODIzMCwgMHg5OTMwLCAweDk5MzksIDB4NTk5MiwKLSAgICAweDgyMzAsIDB4OUEzMCwgMHg5QTM5LCAweDU5OUMsIDB4ODIzMCwgMHg5QjMwLCAweDlCMzksIDB4NTlBNiwgMHg4MjMwLCAweDlDMzAsIDB4OUMzOSwgMHg1OUIwLAotICAgIDB4ODIzMCwgMHg5RDMwLCAweDlEMzksIDB4NTlCQSwgMHg4MjMwLCAweDlFMzAsIDB4OUUzOSwgMHg1OUM0LCAweDgyMzAsIDB4OUYzMCwgMHg5RjM5LCAweDU5Q0UsCi0gICAgMHg4MjMwLCAweEEwMzAsIDB4QTAzOSwgMHg1OUQ4LCAweDgyMzAsIDB4QTEzMCwgMHhBMTM5LCAweDU5RTIsIDB4ODIzMCwgMHhBMjMwLCAweEEyMzksIDB4NTlFQywKLSAgICAweDgyMzAsIDB4QTMzMCwgMHhBMzM5LCAweDU5RjYsIDB4ODIzMCwgMHhBNDMwLCAweEE0MzksIDB4NUEwMCwgMHg4MjMwLCAweEE1MzAsIDB4QTUzOSwgMHg1QTBBLAotICAgIDB4ODIzMCwgMHhBNjMwLCAweEE2MzksIDB4NUExNCwgMHg4MjMwLCAweEE3MzAsIDB4QTczOSwgMHg1QTFFLCAweDgyMzAsIDB4QTgzMCwgMHhBODM5LCAweDVBMjgsCi0gICAgMHg4MjMwLCAweEE5MzAsIDB4QTkzOSwgMHg1QTMyLCAweDgyMzAsIDB4QUEzMCwgMHhBQTM5LCAweDVBM0MsIDB4ODIzMCwgMHhBQjMwLCAweEFCMzksIDB4NUE0NiwKLSAgICAweDgyMzAsIDB4QUMzMCwgMHhBQzM5LCAweDVBNTAsIDB4ODIzMCwgMHhBRDMwLCAweEFEMzksIDB4NUE1QSwgMHg4MjMwLCAweEFFMzAsIDB4QUUzOSwgMHg1QTY0LAotICAgIDB4ODIzMCwgMHhBRjMwLCAweEFGMzksIDB4NUE2RSwgMHg4MjMwLCAweEIwMzAsIDB4QjAzOSwgMHg1QTc4LCAweDgyMzAsIDB4QjEzMCwgMHhCMTM5LCAweDVBODIsCi0gICAgMHg4MjMwLCAweEIyMzAsIDB4QjIzOSwgMHg1QThDLCAweDgyMzAsIDB4QjMzMCwgMHhCMzM5LCAweDVBOTYsIDB4ODIzMCwgMHhCNDMwLCAweEI0MzksIDB4NUFBMCwKLSAgICAweDgyMzAsIDB4QjUzMCwgMHhCNTM5LCAweDVBQUEsIDB4ODIzMCwgMHhCNjMwLCAweEI2MzksIDB4NUFCNCwgMHg4MjMwLCAweEI3MzAsIDB4QjczOSwgMHg1QUJFLAotICAgIDB4ODIzMCwgMHhCODMwLCAweEI4MzksIDB4NUFDOCwgMHg4MjMwLCAweEI5MzAsIDB4QjkzOSwgMHg1QUQyLCAweDgyMzAsIDB4QkEzMCwgMHhCQTM5LCAweDVBREMsCi0gICAgMHg4MjMwLCAweEJCMzAsIDB4QkIzOSwgMHg1QUU2LCAweDgyMzAsIDB4QkMzMCwgMHhCQzM5LCAweDVBRjAsIDB4ODIzMCwgMHhCRDMwLCAweEJEMzksIDB4NUFGQSwKLSAgICAweDgyMzAsIDB4QkUzMCwgMHhCRTM5LCAweDVCMDQsIDB4ODIzMCwgMHhCRjMwLCAweEJGMzksIDB4NUIwRSwgMHg4MjMwLCAweEMwMzAsIDB4QzAzOSwgMHg1QjE4LAotICAgIDB4ODIzMCwgMHhDMTMwLCAweEMxMzksIDB4NUIyMiwgMHg4MjMwLCAweEMyMzAsIDB4QzIzOSwgMHg1QjJDLCAweDgyMzAsIDB4QzMzMCwgMHhDMzM5LCAweDVCMzYsCi0gICAgMHg4MjMwLCAweEM0MzAsIDB4QzQzOSwgMHg1QjQwLCAweDgyMzAsIDB4QzUzMCwgMHhDNTM5LCAweDVCNEEsIDB4ODIzMCwgMHhDNjMwLCAweEM2MzksIDB4NUI1NCwKLSAgICAweDgyMzAsIDB4QzczMCwgMHhDNzM5LCAweDVCNUUsIDB4ODIzMCwgMHhDODMwLCAweEM4MzksIDB4NUI2OCwgMHg4MjMwLCAweEM5MzAsIDB4QzkzOSwgMHg1QjcyLAotICAgIDB4ODIzMCwgMHhDQTMwLCAweENBMzksIDB4NUI3QywgMHg4MjMwLCAweENCMzAsIDB4Q0IzOSwgMHg1Qjg2LCAweDgyMzAsIDB4Q0MzMCwgMHhDQzM5LCAweDVCOTAsCi0gICAgMHg4MjMwLCAweENEMzAsIDB4Q0QzOSwgMHg1QjlBLCAweDgyMzAsIDB4Q0UzMCwgMHhDRTM5LCAweDVCQTQsIDB4ODIzMCwgMHhDRjMwLCAweENGMzksIDB4NUJBRSwKLSAgICAweDgyMzAsIDB4RDAzMCwgMHhEMDM5LCAweDVCQjgsIDB4ODIzMCwgMHhEMTMwLCAweEQxMzksIDB4NUJDMiwgMHg4MjMwLCAweEQyMzAsIDB4RDIzOSwgMHg1QkNDLAotICAgIDB4ODIzMCwgMHhEMzMwLCAweEQzMzksIDB4NUJENiwgMHg4MjMwLCAweEQ0MzAsIDB4RDQzOSwgMHg1QkUwLCAweDgyMzAsIDB4RDUzMCwgMHhENTM5LCAweDVCRUEsCi0gICAgMHg4MjMwLCAweEQ2MzAsIDB4RDYzOSwgMHg1QkY0LCAweDgyMzAsIDB4RDczMCwgMHhENzM5LCAweDVCRkUsIDB4ODIzMCwgMHhEODMwLCAweEQ4MzksIDB4NUMwOCwKLSAgICAweDgyMzAsIDB4RDkzMCwgMHhEOTM5LCAweDVDMTIsIDB4ODIzMCwgMHhEQTMwLCAweERBMzksIDB4NUMxQywgMHg4MjMwLCAweERCMzAsIDB4REIzOSwgMHg1QzI2LAotICAgIDB4ODIzMCwgMHhEQzMwLCAweERDMzksIDB4NUMzMCwgMHg4MjMwLCAweEREMzAsIDB4REQzOSwgMHg1QzNBLCAweDgyMzAsIDB4REUzMCwgMHhERTM5LCAweDVDNDQsCi0gICAgMHg4MjMwLCAweERGMzAsIDB4REYzOSwgMHg1QzRFLCAweDgyMzAsIDB4RTAzMCwgMHhFMDM5LCAweDVDNTgsIDB4ODIzMCwgMHhFMTMwLCAweEUxMzksIDB4NUM2MiwKLSAgICAweDgyMzAsIDB4RTIzMCwgMHhFMjM5LCAweDVDNkMsIDB4ODIzMCwgMHhFMzMwLCAweEUzMzksIDB4NUM3NiwgMHg4MjMwLCAweEU0MzAsIDB4RTQzOSwgMHg1QzgwLAotICAgIDB4ODIzMCwgMHhFNTMwLCAweEU1MzksIDB4NUM4QSwgMHg4MjMwLCAweEU2MzAsIDB4RTYzOSwgMHg1Qzk0LCAweDgyMzAsIDB4RTczMCwgMHhFNzM5LCAweDVDOUUsCi0gICAgMHg4MjMwLCAweEU4MzAsIDB4RTgzOSwgMHg1Q0E4LCAweDgyMzAsIDB4RTkzMCwgMHhFOTM5LCAweDVDQjIsIDB4ODIzMCwgMHhFQTMwLCAweEVBMzksIDB4NUNCQywKLSAgICAweDgyMzAsIDB4RUIzMCwgMHhFQjM5LCAweDVDQzYsIDB4ODIzMCwgMHhFQzMwLCAweEVDMzksIDB4NUNEMCwgMHg4MjMwLCAweEVEMzAsIDB4RUQzOSwgMHg1Q0RBLAotICAgIDB4ODIzMCwgMHhFRTMwLCAweEVFMzksIDB4NUNFNCwgMHg4MjMwLCAweEVGMzAsIDB4RUYzOSwgMHg1Q0VFLCAweDgyMzAsIDB4RjAzMCwgMHhGMDM5LCAweDVDRjgsCi0gICAgMHg4MjMwLCAweEYxMzAsIDB4RjEzOSwgMHg1RDAyLCAweDgyMzAsIDB4RjIzMCwgMHhGMjM5LCAweDVEMEMsIDB4ODIzMCwgMHhGMzMwLCAweEYzMzksIDB4NUQxNiwKLSAgICAweDgyMzAsIDB4RjQzMCwgMHhGNDM5LCAweDVEMjAsIDB4ODIzMCwgMHhGNTMwLCAweEY1MzksIDB4NUQyQSwgMHg4MjMwLCAweEY2MzAsIDB4RjYzOSwgMHg1RDM0LAotICAgIDB4ODIzMCwgMHhGNzMwLCAweEY3MzksIDB4NUQzRSwgMHg4MjMwLCAweEY4MzAsIDB4RjgzOSwgMHg1RDQ4LCAweDgyMzAsIDB4RjkzMCwgMHhGOTM5LCAweDVENTIsCi0gICAgMHg4MjMwLCAweEZBMzAsIDB4RkEzOSwgMHg1RDVDLCAweDgyMzAsIDB4RkIzMCwgMHhGQjM5LCAweDVENjYsIDB4ODIzMCwgMHhGQzMwLCAweEZDMzksIDB4NUQ3MCwKLSAgICAweDgyMzAsIDB4RkQzMCwgMHhGRDM5LCAweDVEN0EsIDB4ODIzMCwgMHhGRTMwLCAweEZFMzksIDB4NUQ4NCwgMHg4MjMxLCAweDgxMzAsIDB4ODEzOSwgMHg1RDhFLAotICAgIDB4ODIzMSwgMHg4MjMwLCAweDgyMzksIDB4NUQ5OCwgMHg4MjMxLCAweDgzMzAsIDB4ODMzOSwgMHg1REEyLCAweDgyMzEsIDB4ODQzMCwgMHg4NDM5LCAweDVEQUMsCi0gICAgMHg4MjMxLCAweDg1MzAsIDB4ODUzOSwgMHg1REI2LCAweDgyMzEsIDB4ODYzMCwgMHg4NjM5LCAweDVEQzAsIDB4ODIzMSwgMHg4NzMwLCAweDg3MzksIDB4NURDQSwKLSAgICAweDgyMzEsIDB4ODgzMCwgMHg4ODM5LCAweDVERDQsIDB4ODIzMSwgMHg4OTMwLCAweDg5MzksIDB4NURERSwgMHg4MjMxLCAweDhBMzAsIDB4OEEzOSwgMHg1REU4LAotICAgIDB4ODIzMSwgMHg4QjMwLCAweDhCMzksIDB4NURGMiwgMHg4MjMxLCAweDhDMzAsIDB4OEMzOSwgMHg1REZDLCAweDgyMzEsIDB4OEQzMCwgMHg4RDM5LCAweDVFMDYsCi0gICAgMHg4MjMxLCAweDhFMzAsIDB4OEUzOSwgMHg1RTEwLCAweDgyMzEsIDB4OEYzMCwgMHg4RjM5LCAweDVFMUEsIDB4ODIzMSwgMHg5MDMwLCAweDkwMzksIDB4NUUyNCwKLSAgICAweDgyMzEsIDB4OTEzMCwgMHg5MTM5LCAweDVFMkUsIDB4ODIzMSwgMHg5MjMwLCAweDkyMzksIDB4NUUzOCwgMHg4MjMxLCAweDkzMzAsIDB4OTMzOSwgMHg1RTQyLAotICAgIDB4ODIzMSwgMHg5NDMwLCAweDk0MzksIDB4NUU0QywgMHg4MjMxLCAweDk1MzAsIDB4OTUzOSwgMHg1RTU2LCAweDgyMzEsIDB4OTYzMCwgMHg5NjM5LCAweDVFNjAsCi0gICAgMHg4MjMxLCAweDk3MzAsIDB4OTczOSwgMHg1RTZBLCAweDgyMzEsIDB4OTgzMCwgMHg5ODM5LCAweDVFNzQsIDB4ODIzMSwgMHg5OTMwLCAweDk5MzksIDB4NUU3RSwKLSAgICAweDgyMzEsIDB4OUEzMCwgMHg5QTM5LCAweDVFODgsIDB4ODIzMSwgMHg5QjMwLCAweDlCMzksIDB4NUU5MiwgMHg4MjMxLCAweDlDMzAsIDB4OUMzOSwgMHg1RTlDLAotICAgIDB4ODIzMSwgMHg5RDMwLCAweDlEMzksIDB4NUVBNiwgMHg4MjMxLCAweDlFMzAsIDB4OUUzOSwgMHg1RUIwLCAweDgyMzEsIDB4OUYzMCwgMHg5RjM5LCAweDVFQkEsCi0gICAgMHg4MjMxLCAweEEwMzAsIDB4QTAzOSwgMHg1RUM0LCAweDgyMzEsIDB4QTEzMCwgMHhBMTM5LCAweDVFQ0UsIDB4ODIzMSwgMHhBMjMwLCAweEEyMzksIDB4NUVEOCwKLSAgICAweDgyMzEsIDB4QTMzMCwgMHhBMzM5LCAweDVFRTIsIDB4ODIzMSwgMHhBNDMwLCAweEE0MzksIDB4NUVFQywgMHg4MjMxLCAweEE1MzAsIDB4QTUzOSwgMHg1RUY2LAotICAgIDB4ODIzMSwgMHhBNjMwLCAweEE2MzksIDB4NUYwMCwgMHg4MjMxLCAweEE3MzAsIDB4QTczOSwgMHg1RjBBLCAweDgyMzEsIDB4QTgzMCwgMHhBODM5LCAweDVGMTQsCi0gICAgMHg4MjMxLCAweEE5MzAsIDB4QTkzOSwgMHg1RjFFLCAweDgyMzEsIDB4QUEzMCwgMHhBQTM5LCAweDVGMjgsIDB4ODIzMSwgMHhBQjMwLCAweEFCMzksIDB4NUYzMiwKLSAgICAweDgyMzEsIDB4QUMzMCwgMHhBQzM5LCAweDVGM0MsIDB4ODIzMSwgMHhBRDMwLCAweEFEMzksIDB4NUY0NiwgMHg4MjMxLCAweEFFMzAsIDB4QUUzOSwgMHg1RjUwLAotICAgIDB4ODIzMSwgMHhBRjMwLCAweEFGMzksIDB4NUY1QSwgMHg4MjMxLCAweEIwMzAsIDB4QjAzOSwgMHg1RjY0LCAweDgyMzEsIDB4QjEzMCwgMHhCMTM5LCAweDVGNkUsCi0gICAgMHg4MjMxLCAweEIyMzAsIDB4QjIzOSwgMHg1Rjc4LCAweDgyMzEsIDB4QjMzMCwgMHhCMzM5LCAweDVGODIsIDB4ODIzMSwgMHhCNDMwLCAweEI0MzksIDB4NUY4QywKLSAgICAweDgyMzEsIDB4QjUzMCwgMHhCNTM5LCAweDVGOTYsIDB4ODIzMSwgMHhCNjMwLCAweEI2MzksIDB4NUZBMCwgMHg4MjMxLCAweEI3MzAsIDB4QjczOSwgMHg1RkFBLAotICAgIDB4ODIzMSwgMHhCODMwLCAweEI4MzksIDB4NUZCNCwgMHg4MjMxLCAweEI5MzAsIDB4QjkzOSwgMHg1RkJFLCAweDgyMzEsIDB4QkEzMCwgMHhCQTM5LCAweDVGQzgsCi0gICAgMHg4MjMxLCAweEJCMzAsIDB4QkIzOSwgMHg1RkQyLCAweDgyMzEsIDB4QkMzMCwgMHhCQzM5LCAweDVGREMsIDB4ODIzMSwgMHhCRDMwLCAweEJEMzksIDB4NUZFNiwKLSAgICAweDgyMzEsIDB4QkUzMCwgMHhCRTM5LCAweDVGRjAsIDB4ODIzMSwgMHhCRjMwLCAweEJGMzksIDB4NUZGQSwgMHg4MjMxLCAweEMwMzAsIDB4QzAzOSwgMHg2MDA0LAotICAgIDB4ODIzMSwgMHhDMTMwLCAweEMxMzksIDB4NjAwRSwgMHg4MjMxLCAweEMyMzAsIDB4QzIzOSwgMHg2MDE4LCAweDgyMzEsIDB4QzMzMCwgMHhDMzM5LCAweDYwMjIsCi0gICAgMHg4MjMxLCAweEM0MzAsIDB4QzQzOSwgMHg2MDJDLCAweDgyMzEsIDB4QzUzMCwgMHhDNTM5LCAweDYwMzYsIDB4ODIzMSwgMHhDNjMwLCAweEM2MzksIDB4NjA0MCwKLSAgICAweDgyMzEsIDB4QzczMCwgMHhDNzM5LCAweDYwNEEsIDB4ODIzMSwgMHhDODMwLCAweEM4MzksIDB4NjA1NCwgMHg4MjMxLCAweEM5MzAsIDB4QzkzOSwgMHg2MDVFLAotICAgIDB4ODIzMSwgMHhDQTMwLCAweENBMzksIDB4NjA2OCwgMHg4MjMxLCAweENCMzAsIDB4Q0IzOSwgMHg2MDcyLCAweDgyMzEsIDB4Q0MzMCwgMHhDQzM5LCAweDYwN0MsCi0gICAgMHg4MjMxLCAweENEMzAsIDB4Q0QzOSwgMHg2MDg2LCAweDgyMzEsIDB4Q0UzMCwgMHhDRTM5LCAweDYwOTAsIDB4ODIzMSwgMHhDRjMwLCAweENGMzksIDB4NjA5QSwKLSAgICAweDgyMzEsIDB4RDAzMCwgMHhEMDM5LCAweDYwQTQsIDB4ODIzMSwgMHhEMTMwLCAweEQxMzksIDB4NjBBRSwgMHg4MjMxLCAweEQyMzAsIDB4RDIzOSwgMHg2MEI4LAotICAgIDB4ODIzMSwgMHhEMzMwLCAweEQzMzksIDB4NjBDMiwgMHg4MjMxLCAweEQ0MzAsIDB4RDQzOSwgMHg2MENDLCAweDgyMzEsIDB4RDUzMCwgMHhENTM5LCAweDYwRDYsCi0gICAgMHg4MjMxLCAweEQ2MzAsIDB4RDYzOSwgMHg2MEUwLCAweDgyMzEsIDB4RDczMCwgMHhENzM5LCAweDYwRUEsIDB4ODIzMSwgMHhEODMwLCAweEQ4MzksIDB4NjBGNCwKLSAgICAweDgyMzEsIDB4RDkzMCwgMHhEOTM5LCAweDYwRkUsIDB4ODIzMSwgMHhEQTMwLCAweERBMzksIDB4NjEwOCwgMHg4MjMxLCAweERCMzAsIDB4REIzOSwgMHg2MTEyLAotICAgIDB4ODIzMSwgMHhEQzMwLCAweERDMzksIDB4NjExQywgMHg4MjMxLCAweEREMzAsIDB4REQzOSwgMHg2MTI2LCAweDgyMzEsIDB4REUzMCwgMHhERTM5LCAweDYxMzAsCi0gICAgMHg4MjMxLCAweERGMzAsIDB4REYzOSwgMHg2MTNBLCAweDgyMzEsIDB4RTAzMCwgMHhFMDM5LCAweDYxNDQsIDB4ODIzMSwgMHhFMTMwLCAweEUxMzksIDB4NjE0RSwKLSAgICAweDgyMzEsIDB4RTIzMCwgMHhFMjM5LCAweDYxNTgsIDB4ODIzMSwgMHhFMzMwLCAweEUzMzksIDB4NjE2MiwgMHg4MjMxLCAweEU0MzAsIDB4RTQzOSwgMHg2MTZDLAotICAgIDB4ODIzMSwgMHhFNTMwLCAweEU1MzksIDB4NjE3NiwgMHg4MjMxLCAweEU2MzAsIDB4RTYzOSwgMHg2MTgwLCAweDgyMzEsIDB4RTczMCwgMHhFNzM5LCAweDYxOEEsCi0gICAgMHg4MjMxLCAweEU4MzAsIDB4RTgzOSwgMHg2MTk0LCAweDgyMzEsIDB4RTkzMCwgMHhFOTM5LCAweDYxOUUsIDB4ODIzMSwgMHhFQTMwLCAweEVBMzksIDB4NjFBOCwKLSAgICAweDgyMzEsIDB4RUIzMCwgMHhFQjM5LCAweDYxQjIsIDB4ODIzMSwgMHhFQzMwLCAweEVDMzksIDB4NjFCQywgMHg4MjMxLCAweEVEMzAsIDB4RUQzOSwgMHg2MUM2LAotICAgIDB4ODIzMSwgMHhFRTMwLCAweEVFMzksIDB4NjFEMCwgMHg4MjMxLCAweEVGMzAsIDB4RUYzOSwgMHg2MURBLCAweDgyMzEsIDB4RjAzMCwgMHhGMDM5LCAweDYxRTQsCi0gICAgMHg4MjMxLCAweEYxMzAsIDB4RjEzOSwgMHg2MUVFLCAweDgyMzEsIDB4RjIzMCwgMHhGMjM5LCAweDYxRjgsIDB4ODIzMSwgMHhGMzMwLCAweEYzMzksIDB4NjIwMiwKLSAgICAweDgyMzEsIDB4RjQzMCwgMHhGNDM5LCAweDYyMEMsIDB4ODIzMSwgMHhGNTMwLCAweEY1MzksIDB4NjIxNiwgMHg4MjMxLCAweEY2MzAsIDB4RjYzOSwgMHg2MjIwLAotICAgIDB4ODIzMSwgMHhGNzMwLCAweEY3MzksIDB4NjIyQSwgMHg4MjMxLCAweEY4MzAsIDB4RjgzOSwgMHg2MjM0LCAweDgyMzEsIDB4RjkzMCwgMHhGOTM5LCAweDYyM0UsCi0gICAgMHg4MjMxLCAweEZBMzAsIDB4RkEzOSwgMHg2MjQ4LCAweDgyMzEsIDB4RkIzMCwgMHhGQjM5LCAweDYyNTIsIDB4ODIzMSwgMHhGQzMwLCAweEZDMzksIDB4NjI1QywKLSAgICAweDgyMzEsIDB4RkQzMCwgMHhGRDM5LCAweDYyNjYsIDB4ODIzMSwgMHhGRTMwLCAweEZFMzksIDB4NjI3MCwgMHg4MjMyLCAweDgxMzAsIDB4ODEzOSwgMHg2MjdBLAotICAgIDB4ODIzMiwgMHg4MjMwLCAweDgyMzksIDB4NjI4NCwgMHg4MjMyLCAweDgzMzAsIDB4ODMzOSwgMHg2MjhFLCAweDgyMzIsIDB4ODQzMCwgMHg4NDM5LCAweDYyOTgsCi0gICAgMHg4MjMyLCAweDg1MzAsIDB4ODUzOSwgMHg2MkEyLCAweDgyMzIsIDB4ODYzMCwgMHg4NjM5LCAweDYyQUMsIDB4ODIzMiwgMHg4NzMwLCAweDg3MzksIDB4NjJCNiwKLSAgICAweDgyMzIsIDB4ODgzMCwgMHg4ODM5LCAweDYyQzAsIDB4ODIzMiwgMHg4OTMwLCAweDg5MzksIDB4NjJDQSwgMHg4MjMyLCAweDhBMzAsIDB4OEEzOSwgMHg2MkQ0LAotICAgIDB4ODIzMiwgMHg4QjMwLCAweDhCMzksIDB4NjJERSwgMHg4MjMyLCAweDhDMzAsIDB4OEMzOSwgMHg2MkU4LCAweDgyMzIsIDB4OEQzMCwgMHg4RDM5LCAweDYyRjIsCi0gICAgMHg4MjMyLCAweDhFMzAsIDB4OEUzOSwgMHg2MkZDLCAweDgyMzIsIDB4OEYzMCwgMHg4RjM5LCAweDYzMDYsIDB4ODIzMiwgMHg5MDMwLCAweDkwMzksIDB4NjMxMCwKLSAgICAweDgyMzIsIDB4OTEzMCwgMHg5MTM5LCAweDYzMUEsIDB4ODIzMiwgMHg5MjMwLCAweDkyMzksIDB4NjMyNCwgMHg4MjMyLCAweDkzMzAsIDB4OTMzOSwgMHg2MzJFLAotICAgIDB4ODIzMiwgMHg5NDMwLCAweDk0MzksIDB4NjMzOCwgMHg4MjMyLCAweDk1MzAsIDB4OTUzOSwgMHg2MzQyLCAweDgyMzIsIDB4OTYzMCwgMHg5NjM5LCAweDYzNEMsCi0gICAgMHg4MjMyLCAweDk3MzAsIDB4OTczOSwgMHg2MzU2LCAweDgyMzIsIDB4OTgzMCwgMHg5ODM5LCAweDYzNjAsIDB4ODIzMiwgMHg5OTMwLCAweDk5MzksIDB4NjM2QSwKLSAgICAweDgyMzIsIDB4OUEzMCwgMHg5QTM5LCAweDYzNzQsIDB4ODIzMiwgMHg5QjMwLCAweDlCMzksIDB4NjM3RSwgMHg4MjMyLCAweDlDMzAsIDB4OUMzOSwgMHg2Mzg4LAotICAgIDB4ODIzMiwgMHg5RDMwLCAweDlEMzksIDB4NjM5MiwgMHg4MjMyLCAweDlFMzAsIDB4OUUzOSwgMHg2MzlDLCAweDgyMzIsIDB4OUYzMCwgMHg5RjM5LCAweDYzQTYsCi0gICAgMHg4MjMyLCAweEEwMzAsIDB4QTAzOSwgMHg2M0IwLCAweDgyMzIsIDB4QTEzMCwgMHhBMTM5LCAweDYzQkEsIDB4ODIzMiwgMHhBMjMwLCAweEEyMzksIDB4NjNDNCwKLSAgICAweDgyMzIsIDB4QTMzMCwgMHhBMzM5LCAweDYzQ0UsIDB4ODIzMiwgMHhBNDMwLCAweEE0MzksIDB4NjNEOCwgMHg4MjMyLCAweEE1MzAsIDB4QTUzOSwgMHg2M0UyLAotICAgIDB4ODIzMiwgMHhBNjMwLCAweEE2MzksIDB4NjNFQywgMHg4MjMyLCAweEE3MzAsIDB4QTczOSwgMHg2M0Y2LCAweDgyMzIsIDB4QTgzMCwgMHhBODM5LCAweDY0MDAsCi0gICAgMHg4MjMyLCAweEE5MzAsIDB4QTkzOSwgMHg2NDBBLCAweDgyMzIsIDB4QUEzMCwgMHhBQTM5LCAweDY0MTQsIDB4ODIzMiwgMHhBQjMwLCAweEFCMzksIDB4NjQxRSwKLSAgICAweDgyMzIsIDB4QUMzMCwgMHhBQzM5LCAweDY0MjgsIDB4ODIzMiwgMHhBRDMwLCAweEFEMzksIDB4NjQzMiwgMHg4MjMyLCAweEFFMzAsIDB4QUUzOSwgMHg2NDNDLAotICAgIDB4ODIzMiwgMHhBRjMwLCAweEFGMzksIDB4NjQ0NiwgMHg4MjMyLCAweEIwMzAsIDB4QjAzOSwgMHg2NDUwLCAweDgyMzIsIDB4QjEzMCwgMHhCMTM5LCAweDY0NUEsCi0gICAgMHg4MjMyLCAweEIyMzAsIDB4QjIzOSwgMHg2NDY0LCAweDgyMzIsIDB4QjMzMCwgMHhCMzM5LCAweDY0NkUsIDB4ODIzMiwgMHhCNDMwLCAweEI0MzksIDB4NjQ3OCwKLSAgICAweDgyMzIsIDB4QjUzMCwgMHhCNTM5LCAweDY0ODIsIDB4ODIzMiwgMHhCNjMwLCAweEI2MzksIDB4NjQ4QywgMHg4MjMyLCAweEI3MzAsIDB4QjczOSwgMHg2NDk2LAotICAgIDB4ODIzMiwgMHhCODMwLCAweEI4MzksIDB4NjRBMCwgMHg4MjMyLCAweEI5MzAsIDB4QjkzOSwgMHg2NEFBLCAweDgyMzIsIDB4QkEzMCwgMHhCQTM5LCAweDY0QjQsCi0gICAgMHg4MjMyLCAweEJCMzAsIDB4QkIzOSwgMHg2NEJFLCAweDgyMzIsIDB4QkMzMCwgMHhCQzM5LCAweDY0QzgsIDB4ODIzMiwgMHhCRDMwLCAweEJEMzksIDB4NjREMiwKLSAgICAweDgyMzIsIDB4QkUzMCwgMHhCRTM5LCAweDY0REMsIDB4ODIzMiwgMHhCRjMwLCAweEJGMzksIDB4NjRFNiwgMHg4MjMyLCAweEMwMzAsIDB4QzAzOSwgMHg2NEYwLAotICAgIDB4ODIzMiwgMHhDMTMwLCAweEMxMzksIDB4NjRGQSwgMHg4MjMyLCAweEMyMzAsIDB4QzIzOSwgMHg2NTA0LCAweDgyMzIsIDB4QzMzMCwgMHhDMzM5LCAweDY1MEUsCi0gICAgMHg4MjMyLCAweEM0MzAsIDB4QzQzOSwgMHg2NTE4LCAweDgyMzIsIDB4QzUzMCwgMHhDNTM5LCAweDY1MjIsIDB4ODIzMiwgMHhDNjMwLCAweEM2MzksIDB4NjUyQywKLSAgICAweDgyMzIsIDB4QzczMCwgMHhDNzM5LCAweDY1MzYsIDB4ODIzMiwgMHhDODMwLCAweEM4MzksIDB4NjU0MCwgMHg4MjMyLCAweEM5MzAsIDB4QzkzOSwgMHg2NTRBLAotICAgIDB4ODIzMiwgMHhDQTMwLCAweENBMzksIDB4NjU1NCwgMHg4MjMyLCAweENCMzAsIDB4Q0IzOSwgMHg2NTVFLCAweDgyMzIsIDB4Q0MzMCwgMHhDQzM5LCAweDY1NjgsCi0gICAgMHg4MjMyLCAweENEMzAsIDB4Q0QzOSwgMHg2NTcyLCAweDgyMzIsIDB4Q0UzMCwgMHhDRTM5LCAweDY1N0MsIDB4ODIzMiwgMHhDRjMwLCAweENGMzksIDB4NjU4NiwKLSAgICAweDgyMzIsIDB4RDAzMCwgMHhEMDM5LCAweDY1OTAsIDB4ODIzMiwgMHhEMTMwLCAweEQxMzksIDB4NjU5QSwgMHg4MjMyLCAweEQyMzAsIDB4RDIzOSwgMHg2NUE0LAotICAgIDB4ODIzMiwgMHhEMzMwLCAweEQzMzksIDB4NjVBRSwgMHg4MjMyLCAweEQ0MzAsIDB4RDQzOSwgMHg2NUI4LCAweDgyMzIsIDB4RDUzMCwgMHhENTM5LCAweDY1QzIsCi0gICAgMHg4MjMyLCAweEQ2MzAsIDB4RDYzOSwgMHg2NUNDLCAweDgyMzIsIDB4RDczMCwgMHhENzM5LCAweDY1RDYsIDB4ODIzMiwgMHhEODMwLCAweEQ4MzksIDB4NjVFMCwKLSAgICAweDgyMzIsIDB4RDkzMCwgMHhEOTM5LCAweDY1RUEsIDB4ODIzMiwgMHhEQTMwLCAweERBMzksIDB4NjVGNCwgMHg4MjMyLCAweERCMzAsIDB4REIzOSwgMHg2NUZFLAotICAgIDB4ODIzMiwgMHhEQzMwLCAweERDMzksIDB4NjYwOCwgMHg4MjMyLCAweEREMzAsIDB4REQzOSwgMHg2NjEyLCAweDgyMzIsIDB4REUzMCwgMHhERTM5LCAweDY2MUMsCi0gICAgMHg4MjMyLCAweERGMzAsIDB4REYzOSwgMHg2NjI2LCAweDgyMzIsIDB4RTAzMCwgMHhFMDM5LCAweDY2MzAsIDB4ODIzMiwgMHhFMTMwLCAweEUxMzksIDB4NjYzQSwKLSAgICAweDgyMzIsIDB4RTIzMCwgMHhFMjM5LCAweDY2NDQsIDB4ODIzMiwgMHhFMzMwLCAweEUzMzksIDB4NjY0RSwgMHg4MjMyLCAweEU0MzAsIDB4RTQzOSwgMHg2NjU4LAotICAgIDB4ODIzMiwgMHhFNTMwLCAweEU1MzksIDB4NjY2MiwgMHg4MjMyLCAweEU2MzAsIDB4RTYzOSwgMHg2NjZDLCAweDgyMzIsIDB4RTczMCwgMHhFNzM5LCAweDY2NzYsCi0gICAgMHg4MjMyLCAweEU4MzAsIDB4RTgzOSwgMHg2NjgwLCAweDgyMzIsIDB4RTkzMCwgMHhFOTM5LCAweDY2OEEsIDB4ODIzMiwgMHhFQTMwLCAweEVBMzksIDB4NjY5NCwKLSAgICAweDgyMzIsIDB4RUIzMCwgMHhFQjM5LCAweDY2OUUsIDB4ODIzMiwgMHhFQzMwLCAweEVDMzksIDB4NjZBOCwgMHg4MjMyLCAweEVEMzAsIDB4RUQzOSwgMHg2NkIyLAotICAgIDB4ODIzMiwgMHhFRTMwLCAweEVFMzksIDB4NjZCQywgMHg4MjMyLCAweEVGMzAsIDB4RUYzOSwgMHg2NkM2LCAweDgyMzIsIDB4RjAzMCwgMHhGMDM5LCAweDY2RDAsCi0gICAgMHg4MjMyLCAweEYxMzAsIDB4RjEzOSwgMHg2NkRBLCAweDgyMzIsIDB4RjIzMCwgMHhGMjM5LCAweDY2RTQsIDB4ODIzMiwgMHhGMzMwLCAweEYzMzksIDB4NjZFRSwKLSAgICAweDgyMzIsIDB4RjQzMCwgMHhGNDM5LCAweDY2RjgsIDB4ODIzMiwgMHhGNTMwLCAweEY1MzksIDB4NjcwMiwgMHg4MjMyLCAweEY2MzAsIDB4RjYzOSwgMHg2NzBDLAotICAgIDB4ODIzMiwgMHhGNzMwLCAweEY3MzksIDB4NjcxNiwgMHg4MjMyLCAweEY4MzAsIDB4RjgzOSwgMHg2NzIwLCAweDgyMzIsIDB4RjkzMCwgMHhGOTM5LCAweDY3MkEsCi0gICAgMHg4MjMyLCAweEZBMzAsIDB4RkEzOSwgMHg2NzM0LCAweDgyMzIsIDB4RkIzMCwgMHhGQjM5LCAweDY3M0UsIDB4ODIzMiwgMHhGQzMwLCAweEZDMzksIDB4Njc0OCwKLSAgICAweDgyMzIsIDB4RkQzMCwgMHhGRDM5LCAweDY3NTIsIDB4ODIzMiwgMHhGRTMwLCAweEZFMzksIDB4Njc1QywgMHg4MjMzLCAweDgxMzAsIDB4ODEzOSwgMHg2NzY2LAotICAgIDB4ODIzMywgMHg4MjMwLCAweDgyMzksIDB4Njc3MCwgMHg4MjMzLCAweDgzMzAsIDB4ODMzOSwgMHg2NzdBLCAweDgyMzMsIDB4ODQzMCwgMHg4NDM5LCAweDY3ODQsCi0gICAgMHg4MjMzLCAweDg1MzAsIDB4ODUzOSwgMHg2NzhFLCAweDgyMzMsIDB4ODYzMCwgMHg4NjM5LCAweDY3OTgsIDB4ODIzMywgMHg4NzMwLCAweDg3MzksIDB4NjdBMiwKLSAgICAweDgyMzMsIDB4ODgzMCwgMHg4ODM5LCAweDY3QUMsIDB4ODIzMywgMHg4OTMwLCAweDg5MzksIDB4NjdCNiwgMHg4MjMzLCAweDhBMzAsIDB4OEEzOSwgMHg2N0MwLAotICAgIDB4ODIzMywgMHg4QjMwLCAweDhCMzksIDB4NjdDQSwgMHg4MjMzLCAweDhDMzAsIDB4OEMzOSwgMHg2N0Q0LCAweDgyMzMsIDB4OEQzMCwgMHg4RDM5LCAweDY3REUsCi0gICAgMHg4MjMzLCAweDhFMzAsIDB4OEUzOSwgMHg2N0U4LCAweDgyMzMsIDB4OEYzMCwgMHg4RjM5LCAweDY3RjIsIDB4ODIzMywgMHg5MDMwLCAweDkwMzksIDB4NjdGQywKLSAgICAweDgyMzMsIDB4OTEzMCwgMHg5MTM5LCAweDY4MDYsIDB4ODIzMywgMHg5MjMwLCAweDkyMzksIDB4NjgxMCwgMHg4MjMzLCAweDkzMzAsIDB4OTMzOSwgMHg2ODFBLAotICAgIDB4ODIzMywgMHg5NDMwLCAweDk0MzksIDB4NjgyNCwgMHg4MjMzLCAweDk1MzAsIDB4OTUzOSwgMHg2ODJFLCAweDgyMzMsIDB4OTYzMCwgMHg5NjM5LCAweDY4MzgsCi0gICAgMHg4MjMzLCAweDk3MzAsIDB4OTczOSwgMHg2ODQyLCAweDgyMzMsIDB4OTgzMCwgMHg5ODM5LCAweDY4NEMsIDB4ODIzMywgMHg5OTMwLCAweDk5MzksIDB4Njg1NiwKLSAgICAweDgyMzMsIDB4OUEzMCwgMHg5QTM5LCAweDY4NjAsIDB4ODIzMywgMHg5QjMwLCAweDlCMzksIDB4Njg2QSwgMHg4MjMzLCAweDlDMzAsIDB4OUMzOSwgMHg2ODc0LAotICAgIDB4ODIzMywgMHg5RDMwLCAweDlEMzksIDB4Njg3RSwgMHg4MjMzLCAweDlFMzAsIDB4OUUzOSwgMHg2ODg4LCAweDgyMzMsIDB4OUYzMCwgMHg5RjM5LCAweDY4OTIsCi0gICAgMHg4MjMzLCAweEEwMzAsIDB4QTAzOSwgMHg2ODlDLCAweDgyMzMsIDB4QTEzMCwgMHhBMTM5LCAweDY4QTYsIDB4ODIzMywgMHhBMjMwLCAweEEyMzksIDB4NjhCMCwKLSAgICAweDgyMzMsIDB4QTMzMCwgMHhBMzM5LCAweDY4QkEsIDB4ODIzMywgMHhBNDMwLCAweEE0MzksIDB4NjhDNCwgMHg4MjMzLCAweEE1MzAsIDB4QTUzOSwgMHg2OENFLAotICAgIDB4ODIzMywgMHhBNjMwLCAweEE2MzksIDB4NjhEOCwgMHg4MjMzLCAweEE3MzAsIDB4QTczOSwgMHg2OEUyLCAweDgyMzMsIDB4QTgzMCwgMHhBODM5LCAweDY4RUMsCi0gICAgMHg4MjMzLCAweEE5MzAsIDB4QTkzOSwgMHg2OEY2LCAweDgyMzMsIDB4QUEzMCwgMHhBQTM5LCAweDY5MDAsIDB4ODIzMywgMHhBQjMwLCAweEFCMzksIDB4NjkwQSwKLSAgICAweDgyMzMsIDB4QUMzMCwgMHhBQzM5LCAweDY5MTQsIDB4ODIzMywgMHhBRDMwLCAweEFEMzksIDB4NjkxRSwgMHg4MjMzLCAweEFFMzAsIDB4QUUzOSwgMHg2OTI4LAotICAgIDB4ODIzMywgMHhBRjMwLCAweEFGMzksIDB4NjkzMiwgMHg4MjMzLCAweEIwMzAsIDB4QjAzOSwgMHg2OTNDLCAweDgyMzMsIDB4QjEzMCwgMHhCMTM5LCAweDY5NDYsCi0gICAgMHg4MjMzLCAweEIyMzAsIDB4QjIzOSwgMHg2OTUwLCAweDgyMzMsIDB4QjMzMCwgMHhCMzM5LCAweDY5NUEsIDB4ODIzMywgMHhCNDMwLCAweEI0MzksIDB4Njk2NCwKLSAgICAweDgyMzMsIDB4QjUzMCwgMHhCNTM5LCAweDY5NkUsIDB4ODIzMywgMHhCNjMwLCAweEI2MzksIDB4Njk3OCwgMHg4MjMzLCAweEI3MzAsIDB4QjczOSwgMHg2OTgyLAotICAgIDB4ODIzMywgMHhCODMwLCAweEI4MzksIDB4Njk4QywgMHg4MjMzLCAweEI5MzAsIDB4QjkzOSwgMHg2OTk2LCAweDgyMzMsIDB4QkEzMCwgMHhCQTM5LCAweDY5QTAsCi0gICAgMHg4MjMzLCAweEJCMzAsIDB4QkIzOSwgMHg2OUFBLCAweDgyMzMsIDB4QkMzMCwgMHhCQzM5LCAweDY5QjQsIDB4ODIzMywgMHhCRDMwLCAweEJEMzksIDB4NjlCRSwKLSAgICAweDgyMzMsIDB4QkUzMCwgMHhCRTM5LCAweDY5QzgsIDB4ODIzMywgMHhCRjMwLCAweEJGMzksIDB4NjlEMiwgMHg4MjMzLCAweEMwMzAsIDB4QzAzOSwgMHg2OURDLAotICAgIDB4ODIzMywgMHhDMTMwLCAweEMxMzksIDB4NjlFNiwgMHg4MjMzLCAweEMyMzAsIDB4QzIzOSwgMHg2OUYwLCAweDgyMzMsIDB4QzMzMCwgMHhDMzM5LCAweDY5RkEsCi0gICAgMHg4MjMzLCAweEM0MzAsIDB4QzQzOSwgMHg2QTA0LCAweDgyMzMsIDB4QzUzMCwgMHhDNTM5LCAweDZBMEUsIDB4ODIzMywgMHhDNjMwLCAweEM2MzksIDB4NkExOCwKLSAgICAweDgyMzMsIDB4QzczMCwgMHhDNzM5LCAweDZBMjIsIDB4ODIzMywgMHhDODMwLCAweEM4MzksIDB4NkEyQywgMHg4MjMzLCAweEM5MzAsIDB4QzkzOSwgMHg2QTM2LAotICAgIDB4ODIzMywgMHhDQTMwLCAweENBMzksIDB4NkE0MCwgMHg4MjMzLCAweENCMzAsIDB4Q0IzOSwgMHg2QTRBLCAweDgyMzMsIDB4Q0MzMCwgMHhDQzM5LCAweDZBNTQsCi0gICAgMHg4MjMzLCAweENEMzAsIDB4Q0QzOSwgMHg2QTVFLCAweDgyMzMsIDB4Q0UzMCwgMHhDRTM5LCAweDZBNjgsIDB4ODIzMywgMHhDRjMwLCAweENGMzksIDB4NkE3MiwKLSAgICAweDgyMzMsIDB4RDAzMCwgMHhEMDM5LCAweDZBN0MsIDB4ODIzMywgMHhEMTMwLCAweEQxMzksIDB4NkE4NiwgMHg4MjMzLCAweEQyMzAsIDB4RDIzOSwgMHg2QTkwLAotICAgIDB4ODIzMywgMHhEMzMwLCAweEQzMzksIDB4NkE5QSwgMHg4MjMzLCAweEQ0MzAsIDB4RDQzOSwgMHg2QUE0LCAweDgyMzMsIDB4RDUzMCwgMHhENTM5LCAweDZBQUUsCi0gICAgMHg4MjMzLCAweEQ2MzAsIDB4RDYzOSwgMHg2QUI4LCAweDgyMzMsIDB4RDczMCwgMHhENzM5LCAweDZBQzIsIDB4ODIzMywgMHhEODMwLCAweEQ4MzksIDB4NkFDQywKLSAgICAweDgyMzMsIDB4RDkzMCwgMHhEOTM5LCAweDZBRDYsIDB4ODIzMywgMHhEQTMwLCAweERBMzksIDB4NkFFMCwgMHg4MjMzLCAweERCMzAsIDB4REIzOSwgMHg2QUVBLAotICAgIDB4ODIzMywgMHhEQzMwLCAweERDMzksIDB4NkFGNCwgMHg4MjMzLCAweEREMzAsIDB4REQzOSwgMHg2QUZFLCAweDgyMzMsIDB4REUzMCwgMHhERTM5LCAweDZCMDgsCi0gICAgMHg4MjMzLCAweERGMzAsIDB4REYzOSwgMHg2QjEyLCAweDgyMzMsIDB4RTAzMCwgMHhFMDM5LCAweDZCMUMsIDB4ODIzMywgMHhFMTMwLCAweEUxMzksIDB4NkIyNiwKLSAgICAweDgyMzMsIDB4RTIzMCwgMHhFMjM5LCAweDZCMzAsIDB4ODIzMywgMHhFMzMwLCAweEUzMzksIDB4NkIzQSwgMHg4MjMzLCAweEU0MzAsIDB4RTQzOSwgMHg2QjQ0LAotICAgIDB4ODIzMywgMHhFNTMwLCAweEU1MzksIDB4NkI0RSwgMHg4MjMzLCAweEU2MzAsIDB4RTYzOSwgMHg2QjU4LCAweDgyMzMsIDB4RTczMCwgMHhFNzM5LCAweDZCNjIsCi0gICAgMHg4MjMzLCAweEU4MzAsIDB4RTgzOSwgMHg2QjZDLCAweDgyMzMsIDB4RTkzMCwgMHhFOTM5LCAweDZCNzYsIDB4ODIzMywgMHhFQTMwLCAweEVBMzksIDB4NkI4MCwKLSAgICAweDgyMzMsIDB4RUIzMCwgMHhFQjM5LCAweDZCOEEsIDB4ODIzMywgMHhFQzMwLCAweEVDMzksIDB4NkI5NCwgMHg4MjMzLCAweEVEMzAsIDB4RUQzOSwgMHg2QjlFLAotICAgIDB4ODIzMywgMHhFRTMwLCAweEVFMzksIDB4NkJBOCwgMHg4MjMzLCAweEVGMzAsIDB4RUYzOSwgMHg2QkIyLCAweDgyMzMsIDB4RjAzMCwgMHhGMDM5LCAweDZCQkMsCi0gICAgMHg4MjMzLCAweEYxMzAsIDB4RjEzOSwgMHg2QkM2LCAweDgyMzMsIDB4RjIzMCwgMHhGMjM5LCAweDZCRDAsIDB4ODIzMywgMHhGMzMwLCAweEYzMzksIDB4NkJEQSwKLSAgICAweDgyMzMsIDB4RjQzMCwgMHhGNDM5LCAweDZCRTQsIDB4ODIzMywgMHhGNTMwLCAweEY1MzksIDB4NkJFRSwgMHg4MjMzLCAweEY2MzAsIDB4RjYzOSwgMHg2QkY4LAotICAgIDB4ODIzMywgMHhGNzMwLCAweEY3MzksIDB4NkMwMiwgMHg4MjMzLCAweEY4MzAsIDB4RjgzOSwgMHg2QzBDLCAweDgyMzMsIDB4RjkzMCwgMHhGOTM5LCAweDZDMTYsCi0gICAgMHg4MjMzLCAweEZBMzAsIDB4RkEzOSwgMHg2QzIwLCAweDgyMzMsIDB4RkIzMCwgMHhGQjM5LCAweDZDMkEsIDB4ODIzMywgMHhGQzMwLCAweEZDMzksIDB4NkMzNCwKLSAgICAweDgyMzMsIDB4RkQzMCwgMHhGRDM5LCAweDZDM0UsIDB4ODIzMywgMHhGRTMwLCAweEZFMzksIDB4NkM0OCwgMHg4MjM0LCAweDgxMzAsIDB4ODEzOSwgMHg2QzUyLAotICAgIDB4ODIzNCwgMHg4MjMwLCAweDgyMzksIDB4NkM1QywgMHg4MjM0LCAweDgzMzAsIDB4ODMzOSwgMHg2QzY2LCAweDgyMzQsIDB4ODQzMCwgMHg4NDM5LCAweDZDNzAsCi0gICAgMHg4MjM0LCAweDg1MzAsIDB4ODUzOSwgMHg2QzdBLCAweDgyMzQsIDB4ODYzMCwgMHg4NjM5LCAweDZDODQsIDB4ODIzNCwgMHg4NzMwLCAweDg3MzksIDB4NkM4RSwKLSAgICAweDgyMzQsIDB4ODgzMCwgMHg4ODM5LCAweDZDOTgsIDB4ODIzNCwgMHg4OTMwLCAweDg5MzksIDB4NkNBMiwgMHg4MjM0LCAweDhBMzAsIDB4OEEzOSwgMHg2Q0FDLAotICAgIDB4ODIzNCwgMHg4QjMwLCAweDhCMzksIDB4NkNCNiwgMHg4MjM0LCAweDhDMzAsIDB4OEMzOSwgMHg2Q0MwLCAweDgyMzQsIDB4OEQzMCwgMHg4RDM5LCAweDZDQ0EsCi0gICAgMHg4MjM0LCAweDhFMzAsIDB4OEUzOSwgMHg2Q0Q0LCAweDgyMzQsIDB4OEYzMCwgMHg4RjM5LCAweDZDREUsIDB4ODIzNCwgMHg5MDMwLCAweDkwMzksIDB4NkNFOCwKLSAgICAweDgyMzQsIDB4OTEzMCwgMHg5MTM5LCAweDZDRjIsIDB4ODIzNCwgMHg5MjMwLCAweDkyMzksIDB4NkNGQywgMHg4MjM0LCAweDkzMzAsIDB4OTMzOSwgMHg2RDA2LAotICAgIDB4ODIzNCwgMHg5NDMwLCAweDk0MzksIDB4NkQxMCwgMHg4MjM0LCAweDk1MzAsIDB4OTUzOSwgMHg2RDFBLCAweDgyMzQsIDB4OTYzMCwgMHg5NjM5LCAweDZEMjQsCi0gICAgMHg4MjM0LCAweDk3MzAsIDB4OTczOSwgMHg2RDJFLCAweDgyMzQsIDB4OTgzMCwgMHg5ODM5LCAweDZEMzgsIDB4ODIzNCwgMHg5OTMwLCAweDk5MzksIDB4NkQ0MiwKLSAgICAweDgyMzQsIDB4OUEzMCwgMHg5QTM5LCAweDZENEMsIDB4ODIzNCwgMHg5QjMwLCAweDlCMzksIDB4NkQ1NiwgMHg4MjM0LCAweDlDMzAsIDB4OUMzOSwgMHg2RDYwLAotICAgIDB4ODIzNCwgMHg5RDMwLCAweDlEMzksIDB4NkQ2QSwgMHg4MjM0LCAweDlFMzAsIDB4OUUzOSwgMHg2RDc0LCAweDgyMzQsIDB4OUYzMCwgMHg5RjM5LCAweDZEN0UsCi0gICAgMHg4MjM0LCAweEEwMzAsIDB4QTAzOSwgMHg2RDg4LCAweDgyMzQsIDB4QTEzMCwgMHhBMTM5LCAweDZEOTIsIDB4ODIzNCwgMHhBMjMwLCAweEEyMzksIDB4NkQ5QywKLSAgICAweDgyMzQsIDB4QTMzMCwgMHhBMzM5LCAweDZEQTYsIDB4ODIzNCwgMHhBNDMwLCAweEE0MzksIDB4NkRCMCwgMHg4MjM0LCAweEE1MzAsIDB4QTUzOSwgMHg2REJBLAotICAgIDB4ODIzNCwgMHhBNjMwLCAweEE2MzksIDB4NkRDNCwgMHg4MjM0LCAweEE3MzAsIDB4QTczOSwgMHg2RENFLCAweDgyMzQsIDB4QTgzMCwgMHhBODM5LCAweDZERDgsCi0gICAgMHg4MjM0LCAweEE5MzAsIDB4QTkzOSwgMHg2REUyLCAweDgyMzQsIDB4QUEzMCwgMHhBQTM5LCAweDZERUMsIDB4ODIzNCwgMHhBQjMwLCAweEFCMzksIDB4NkRGNiwKLSAgICAweDgyMzQsIDB4QUMzMCwgMHhBQzM5LCAweDZFMDAsIDB4ODIzNCwgMHhBRDMwLCAweEFEMzksIDB4NkUwQSwgMHg4MjM0LCAweEFFMzAsIDB4QUUzOSwgMHg2RTE0LAotICAgIDB4ODIzNCwgMHhBRjMwLCAweEFGMzksIDB4NkUxRSwgMHg4MjM0LCAweEIwMzAsIDB4QjAzOSwgMHg2RTI4LCAweDgyMzQsIDB4QjEzMCwgMHhCMTM5LCAweDZFMzIsCi0gICAgMHg4MjM0LCAweEIyMzAsIDB4QjIzOSwgMHg2RTNDLCAweDgyMzQsIDB4QjMzMCwgMHhCMzM5LCAweDZFNDYsIDB4ODIzNCwgMHhCNDMwLCAweEI0MzksIDB4NkU1MCwKLSAgICAweDgyMzQsIDB4QjUzMCwgMHhCNTM5LCAweDZFNUEsIDB4ODIzNCwgMHhCNjMwLCAweEI2MzksIDB4NkU2NCwgMHg4MjM0LCAweEI3MzAsIDB4QjczOSwgMHg2RTZFLAotICAgIDB4ODIzNCwgMHhCODMwLCAweEI4MzksIDB4NkU3OCwgMHg4MjM0LCAweEI5MzAsIDB4QjkzOSwgMHg2RTgyLCAweDgyMzQsIDB4QkEzMCwgMHhCQTM5LCAweDZFOEMsCi0gICAgMHg4MjM0LCAweEJCMzAsIDB4QkIzOSwgMHg2RTk2LCAweDgyMzQsIDB4QkMzMCwgMHhCQzM5LCAweDZFQTAsIDB4ODIzNCwgMHhCRDMwLCAweEJEMzksIDB4NkVBQSwKLSAgICAweDgyMzQsIDB4QkUzMCwgMHhCRTM5LCAweDZFQjQsIDB4ODIzNCwgMHhCRjMwLCAweEJGMzksIDB4NkVCRSwgMHg4MjM0LCAweEMwMzAsIDB4QzAzOSwgMHg2RUM4LAotICAgIDB4ODIzNCwgMHhDMTMwLCAweEMxMzksIDB4NkVEMiwgMHg4MjM0LCAweEMyMzAsIDB4QzIzOSwgMHg2RURDLCAweDgyMzQsIDB4QzMzMCwgMHhDMzM5LCAweDZFRTYsCi0gICAgMHg4MjM0LCAweEM0MzAsIDB4QzQzOSwgMHg2RUYwLCAweDgyMzQsIDB4QzUzMCwgMHhDNTM5LCAweDZFRkEsIDB4ODIzNCwgMHhDNjMwLCAweEM2MzksIDB4NkYwNCwKLSAgICAweDgyMzQsIDB4QzczMCwgMHhDNzM5LCAweDZGMEUsIDB4ODIzNCwgMHhDODMwLCAweEM4MzksIDB4NkYxOCwgMHg4MjM0LCAweEM5MzAsIDB4QzkzOSwgMHg2RjIyLAotICAgIDB4ODIzNCwgMHhDQTMwLCAweENBMzksIDB4NkYyQywgMHg4MjM0LCAweENCMzAsIDB4Q0IzOSwgMHg2RjM2LCAweDgyMzQsIDB4Q0MzMCwgMHhDQzM5LCAweDZGNDAsCi0gICAgMHg4MjM0LCAweENEMzAsIDB4Q0QzOSwgMHg2RjRBLCAweDgyMzQsIDB4Q0UzMCwgMHhDRTM5LCAweDZGNTQsIDB4ODIzNCwgMHhDRjMwLCAweENGMzksIDB4NkY1RSwKLSAgICAweDgyMzQsIDB4RDAzMCwgMHhEMDM5LCAweDZGNjgsIDB4ODIzNCwgMHhEMTMwLCAweEQxMzksIDB4NkY3MiwgMHg4MjM0LCAweEQyMzAsIDB4RDIzOSwgMHg2RjdDLAotICAgIDB4ODIzNCwgMHhEMzMwLCAweEQzMzksIDB4NkY4NiwgMHg4MjM0LCAweEQ0MzAsIDB4RDQzOSwgMHg2RjkwLCAweDgyMzQsIDB4RDUzMCwgMHhENTM5LCAweDZGOUEsCi0gICAgMHg4MjM0LCAweEQ2MzAsIDB4RDYzOSwgMHg2RkE0LCAweDgyMzQsIDB4RDczMCwgMHhENzM5LCAweDZGQUUsIDB4ODIzNCwgMHhEODMwLCAweEQ4MzksIDB4NkZCOCwKLSAgICAweDgyMzQsIDB4RDkzMCwgMHhEOTM5LCAweDZGQzIsIDB4ODIzNCwgMHhEQTMwLCAweERBMzksIDB4NkZDQywgMHg4MjM0LCAweERCMzAsIDB4REIzOSwgMHg2RkQ2LAotICAgIDB4ODIzNCwgMHhEQzMwLCAweERDMzksIDB4NkZFMCwgMHg4MjM0LCAweEREMzAsIDB4REQzOSwgMHg2RkVBLCAweDgyMzQsIDB4REUzMCwgMHhERTM5LCAweDZGRjQsCi0gICAgMHg4MjM0LCAweERGMzAsIDB4REYzOSwgMHg2RkZFLCAweDgyMzQsIDB4RTAzMCwgMHhFMDM5LCAweDcwMDgsIDB4ODIzNCwgMHhFMTMwLCAweEUxMzksIDB4NzAxMiwKLSAgICAweDgyMzQsIDB4RTIzMCwgMHhFMjM5LCAweDcwMUMsIDB4ODIzNCwgMHhFMzMwLCAweEUzMzksIDB4NzAyNiwgMHg4MjM0LCAweEU0MzAsIDB4RTQzOSwgMHg3MDMwLAotICAgIDB4ODIzNCwgMHhFNTMwLCAweEU1MzksIDB4NzAzQSwgMHg4MjM0LCAweEU2MzAsIDB4RTYzOSwgMHg3MDQ0LCAweDgyMzQsIDB4RTczMCwgMHhFNzM5LCAweDcwNEUsCi0gICAgMHg4MjM0LCAweEU4MzAsIDB4RTgzOSwgMHg3MDU4LCAweDgyMzQsIDB4RTkzMCwgMHhFOTM5LCAweDcwNjIsIDB4ODIzNCwgMHhFQTMwLCAweEVBMzksIDB4NzA2QywKLSAgICAweDgyMzQsIDB4RUIzMCwgMHhFQjM5LCAweDcwNzYsIDB4ODIzNCwgMHhFQzMwLCAweEVDMzksIDB4NzA4MCwgMHg4MjM0LCAweEVEMzAsIDB4RUQzOSwgMHg3MDhBLAotICAgIDB4ODIzNCwgMHhFRTMwLCAweEVFMzksIDB4NzA5NCwgMHg4MjM0LCAweEVGMzAsIDB4RUYzOSwgMHg3MDlFLCAweDgyMzQsIDB4RjAzMCwgMHhGMDM5LCAweDcwQTgsCi0gICAgMHg4MjM0LCAweEYxMzAsIDB4RjEzOSwgMHg3MEIyLCAweDgyMzQsIDB4RjIzMCwgMHhGMjM5LCAweDcwQkMsIDB4ODIzNCwgMHhGMzMwLCAweEYzMzksIDB4NzBDNiwKLSAgICAweDgyMzQsIDB4RjQzMCwgMHhGNDM5LCAweDcwRDAsIDB4ODIzNCwgMHhGNTMwLCAweEY1MzksIDB4NzBEQSwgMHg4MjM0LCAweEY2MzAsIDB4RjYzOSwgMHg3MEU0LAotICAgIDB4ODIzNCwgMHhGNzMwLCAweEY3MzksIDB4NzBFRSwgMHg4MjM0LCAweEY4MzAsIDB4RjgzOSwgMHg3MEY4LCAweDgyMzQsIDB4RjkzMCwgMHhGOTM5LCAweDcxMDIsCi0gICAgMHg4MjM0LCAweEZBMzAsIDB4RkEzOSwgMHg3MTBDLCAweDgyMzQsIDB4RkIzMCwgMHhGQjM5LCAweDcxMTYsIDB4ODIzNCwgMHhGQzMwLCAweEZDMzksIDB4NzEyMCwKLSAgICAweDgyMzQsIDB4RkQzMCwgMHhGRDM5LCAweDcxMkEsIDB4ODIzNCwgMHhGRTMwLCAweEZFMzksIDB4NzEzNCwgMHg4MjM1LCAweDgxMzAsIDB4ODEzOSwgMHg3MTNFLAotICAgIDB4ODIzNSwgMHg4MjMwLCAweDgyMzksIDB4NzE0OCwgMHg4MjM1LCAweDgzMzAsIDB4ODMzOSwgMHg3MTUyLCAweDgyMzUsIDB4ODQzMCwgMHg4NDM5LCAweDcxNUMsCi0gICAgMHg4MjM1LCAweDg1MzAsIDB4ODUzOSwgMHg3MTY2LCAweDgyMzUsIDB4ODYzMCwgMHg4NjM5LCAweDcxNzAsIDB4ODIzNSwgMHg4NzMwLCAweDg3MzgsIDB4NzE3QSwKLSAgICAweDgyMzUsIDB4OTgzMywgMHg5ODM5LCAweDcxODgsIDB4ODIzNSwgMHg5OTMwLCAweDk5MzksIDB4NzE4RiwgMHg4MjM1LCAweDlBMzAsIDB4OUEzOSwgMHg3MTk5LAotICAgIDB4ODIzNSwgMHg5QjMwLCAweDlCMzksIDB4NzFBMywgMHg4MjM1LCAweDlDMzAsIDB4OUMzOSwgMHg3MUFELCAweDgyMzUsIDB4OUQzMCwgMHg5RDM5LCAweDcxQjcsCi0gICAgMHg4MjM1LCAweDlFMzAsIDB4OUUzOSwgMHg3MUMxLCAweDgyMzUsIDB4OUYzMCwgMHg5RjM5LCAweDcxQ0IsIDB4ODIzNSwgMHhBMDMwLCAweEEwMzksIDB4NzFENSwKLSAgICAweDgyMzUsIDB4QTEzMCwgMHhBMTM5LCAweDcxREYsIDB4ODIzNSwgMHhBMjMwLCAweEEyMzksIDB4NzFFOSwgMHg4MjM1LCAweEEzMzAsIDB4QTMzOSwgMHg3MUYzLAotICAgIDB4ODIzNSwgMHhBNDMwLCAweEE0MzksIDB4NzFGRCwgMHg4MjM1LCAweEE1MzAsIDB4QTUzOSwgMHg3MjA3LCAweDgyMzUsIDB4QTYzMCwgMHhBNjM5LCAweDcyMTEsCi0gICAgMHg4MjM1LCAweEE3MzAsIDB4QTczOSwgMHg3MjFCLCAweDgyMzUsIDB4QTgzMCwgMHhBODM5LCAweDcyMjUsIDB4ODIzNSwgMHhBOTMwLCAweEE5MzksIDB4NzIyRiwKLSAgICAweDgyMzUsIDB4QUEzMCwgMHhBQTM5LCAweDcyMzksIDB4ODIzNSwgMHhBQjMwLCAweEFCMzksIDB4NzI0MywgMHg4MjM1LCAweEFDMzAsIDB4QUMzOSwgMHg3MjRELAotICAgIDB4ODIzNSwgMHhBRDMwLCAweEFEMzksIDB4NzI1NywgMHg4MjM1LCAweEFFMzAsIDB4QUUzOSwgMHg3MjYxLCAweDgyMzUsIDB4QUYzMCwgMHhBRjM5LCAweDcyNkIsCi0gICAgMHg4MjM1LCAweEIwMzAsIDB4QjAzOSwgMHg3Mjc1LCAweDgyMzUsIDB4QjEzMCwgMHhCMTM5LCAweDcyN0YsIDB4ODIzNSwgMHhCMjMwLCAweEIyMzksIDB4NzI4OSwKLSAgICAweDgyMzUsIDB4QjMzMCwgMHhCMzM5LCAweDcyOTMsIDB4ODIzNSwgMHhCNDMwLCAweEI0MzksIDB4NzI5RCwgMHg4MjM1LCAweEI1MzAsIDB4QjUzOSwgMHg3MkE3LAotICAgIDB4ODIzNSwgMHhCNjMwLCAweEI2MzksIDB4NzJCMSwgMHg4MjM1LCAweEI3MzAsIDB4QjczOSwgMHg3MkJCLCAweDgyMzUsIDB4QjgzMCwgMHhCODM5LCAweDcyQzUsCi0gICAgMHg4MjM1LCAweEI5MzAsIDB4QjkzOSwgMHg3MkNGLCAweDgyMzUsIDB4QkEzMCwgMHhCQTM5LCAweDcyRDksIDB4ODIzNSwgMHhCQjMwLCAweEJCMzksIDB4NzJFMywKLSAgICAweDgyMzUsIDB4QkMzMCwgMHhCQzM5LCAweDcyRUQsIDB4ODIzNSwgMHhCRDMwLCAweEJEMzksIDB4NzJGNywgMHg4MjM1LCAweEJFMzAsIDB4QkUzOSwgMHg3MzAxLAotICAgIDB4ODIzNSwgMHhCRjMwLCAweEJGMzksIDB4NzMwQiwgMHg4MjM1LCAweEMwMzAsIDB4QzAzOSwgMHg3MzE1LCAweDgyMzUsIDB4QzEzMCwgMHhDMTM5LCAweDczMUYsCi0gICAgMHg4MjM1LCAweEMyMzAsIDB4QzIzOSwgMHg3MzI5LCAweDgyMzUsIDB4QzMzMCwgMHhDMzM5LCAweDczMzMsIDB4ODIzNSwgMHhDNDMwLCAweEM0MzksIDB4NzMzRCwKLSAgICAweDgyMzUsIDB4QzUzMCwgMHhDNTM5LCAweDczNDcsIDB4ODIzNSwgMHhDNjMwLCAweEM2MzksIDB4NzM1MSwgMHg4MjM1LCAweEM3MzAsIDB4QzczOSwgMHg3MzVCLAotICAgIDB4ODIzNSwgMHhDODMwLCAweEM4MzksIDB4NzM2NSwgMHg4MjM1LCAweEM5MzAsIDB4QzkzOSwgMHg3MzZGLCAweDgyMzUsIDB4Q0EzMCwgMHhDQTM5LCAweDczNzksCi0gICAgMHg4MjM1LCAweENCMzAsIDB4Q0IzOSwgMHg3MzgzLCAweDgyMzUsIDB4Q0MzMCwgMHhDQzM5LCAweDczOEQsIDB4ODIzNSwgMHhDRDMwLCAweENEMzksIDB4NzM5NywKLSAgICAweDgyMzUsIDB4Q0UzMCwgMHhDRTM5LCAweDczQTEsIDB4ODIzNSwgMHhDRjMwLCAweENGMzksIDB4NzNBQiwgMHg4MjM1LCAweEQwMzAsIDB4RDAzOSwgMHg3M0I1LAotICAgIDB4ODIzNSwgMHhEMTMwLCAweEQxMzksIDB4NzNCRiwgMHg4MjM1LCAweEQyMzAsIDB4RDIzOSwgMHg3M0M5LCAweDgyMzUsIDB4RDMzMCwgMHhEMzM5LCAweDczRDMsCi0gICAgMHg4MjM1LCAweEQ0MzAsIDB4RDQzOSwgMHg3M0RELCAweDgyMzUsIDB4RDUzMCwgMHhENTM5LCAweDczRTcsIDB4ODIzNSwgMHhENjMwLCAweEQ2MzksIDB4NzNGMSwKLSAgICAweDgyMzUsIDB4RDczMCwgMHhENzM5LCAweDczRkIsIDB4ODIzNSwgMHhEODMwLCAweEQ4MzksIDB4NzQwNSwgMHg4MjM1LCAweEQ5MzAsIDB4RDkzOSwgMHg3NDBGLAotICAgIDB4ODIzNSwgMHhEQTMwLCAweERBMzksIDB4NzQxOSwgMHg4MjM1LCAweERCMzAsIDB4REIzOSwgMHg3NDIzLCAweDgyMzUsIDB4REMzMCwgMHhEQzM5LCAweDc0MkQsCi0gICAgMHg4MjM1LCAweEREMzAsIDB4REQzOSwgMHg3NDM3LCAweDgyMzUsIDB4REUzMCwgMHhERTM5LCAweDc0NDEsIDB4ODIzNSwgMHhERjMwLCAweERGMzksIDB4NzQ0QiwKLSAgICAweDgyMzUsIDB4RTAzMCwgMHhFMDM5LCAweDc0NTUsIDB4ODIzNSwgMHhFMTMwLCAweEUxMzksIDB4NzQ1RiwgMHg4MjM1LCAweEUyMzAsIDB4RTIzOSwgMHg3NDY5LAotICAgIDB4ODIzNSwgMHhFMzMwLCAweEUzMzksIDB4NzQ3MywgMHg4MjM1LCAweEU0MzAsIDB4RTQzOSwgMHg3NDdELCAweDgyMzUsIDB4RTUzMCwgMHhFNTM5LCAweDc0ODcsCi0gICAgMHg4MjM1LCAweEU2MzAsIDB4RTYzOSwgMHg3NDkxLCAweDgyMzUsIDB4RTczMCwgMHhFNzM5LCAweDc0OUIsIDB4ODIzNSwgMHhFODMwLCAweEU4MzksIDB4NzRBNSwKLSAgICAweDgyMzUsIDB4RTkzMCwgMHhFOTM5LCAweDc0QUYsIDB4ODIzNSwgMHhFQTMwLCAweEVBMzksIDB4NzRCOSwgMHg4MjM1LCAweEVCMzAsIDB4RUIzOSwgMHg3NEMzLAotICAgIDB4ODIzNSwgMHhFQzMwLCAweEVDMzksIDB4NzRDRCwgMHg4MjM1LCAweEVEMzAsIDB4RUQzOSwgMHg3NEQ3LCAweDgyMzUsIDB4RUUzMCwgMHhFRTM5LCAweDc0RTEsCi0gICAgMHg4MjM1LCAweEVGMzAsIDB4RUYzOSwgMHg3NEVCLCAweDgyMzUsIDB4RjAzMCwgMHhGMDM5LCAweDc0RjUsIDB4ODIzNSwgMHhGMTMwLCAweEYxMzksIDB4NzRGRiwKLSAgICAweDgyMzUsIDB4RjIzMCwgMHhGMjM5LCAweDc1MDksIDB4ODIzNSwgMHhGMzMwLCAweEYzMzksIDB4NzUxMywgMHg4MjM1LCAweEY0MzAsIDB4RjQzOSwgMHg3NTFELAotICAgIDB4ODIzNSwgMHhGNTMwLCAweEY1MzksIDB4NzUyNywgMHg4MjM1LCAweEY2MzAsIDB4RjYzOSwgMHg3NTMxLCAweDgyMzUsIDB4RjczMCwgMHhGNzM5LCAweDc1M0IsCi0gICAgMHg4MjM1LCAweEY4MzAsIDB4RjgzOSwgMHg3NTQ1LCAweDgyMzUsIDB4RjkzMCwgMHhGOTM5LCAweDc1NEYsIDB4ODIzNSwgMHhGQTMwLCAweEZBMzksIDB4NzU1OSwKLSAgICAweDgyMzUsIDB4RkIzMCwgMHhGQjM5LCAweDc1NjMsIDB4ODIzNSwgMHhGQzMwLCAweEZDMzksIDB4NzU2RCwgMHg4MjM1LCAweEZEMzAsIDB4RkQzOSwgMHg3NTc3LAotICAgIDB4ODIzNSwgMHhGRTMwLCAweEZFMzksIDB4NzU4MSwgMHg4MjM2LCAweDgxMzAsIDB4ODEzOSwgMHg3NThCLCAweDgyMzYsIDB4ODIzMCwgMHg4MjM5LCAweDc1OTUsCi0gICAgMHg4MjM2LCAweDgzMzAsIDB4ODMzOSwgMHg3NTlGLCAweDgyMzYsIDB4ODQzMCwgMHg4NDM5LCAweDc1QTksIDB4ODIzNiwgMHg4NTMwLCAweDg1MzksIDB4NzVCMywKLSAgICAweDgyMzYsIDB4ODYzMCwgMHg4NjM5LCAweDc1QkQsIDB4ODIzNiwgMHg4NzMwLCAweDg3MzksIDB4NzVDNywgMHg4MjM2LCAweDg4MzAsIDB4ODgzOSwgMHg3NUQxLAotICAgIDB4ODIzNiwgMHg4OTMwLCAweDg5MzksIDB4NzVEQiwgMHg4MjM2LCAweDhBMzAsIDB4OEEzOSwgMHg3NUU1LCAweDgyMzYsIDB4OEIzMCwgMHg4QjM5LCAweDc1RUYsCi0gICAgMHg4MjM2LCAweDhDMzAsIDB4OEMzOSwgMHg3NUY5LCAweDgyMzYsIDB4OEQzMCwgMHg4RDM5LCAweDc2MDMsIDB4ODIzNiwgMHg4RTMwLCAweDhFMzcsIDB4NzYwRCwKLSAgICAweDgyMzYsIDB4OEYzMSwgMHg4RjM5LCAweDc2MTUsIDB4ODIzNiwgMHg5MDMwLCAweDkwMzksIDB4NzYxRSwgMHg4MjM2LCAweDkxMzAsIDB4OTEzOSwgMHg3NjI4LAotICAgIDB4ODIzNiwgMHg5MjMwLCAweDkyMzksIDB4NzYzMiwgMHg4MjM2LCAweDkzMzAsIDB4OTMzOSwgMHg3NjNDLCAweDgyMzYsIDB4OTQzMCwgMHg5NDM1LCAweDc2NDYsCisgICAgMHg4MTMwLCAweDg0MzYsIDB4ODQzNiwgMHg1NzUyLCAweDgxMzgsIDB4RkQzOCwgMHhGRDM5LCAweDU3OUMsIDB4ODEzOCwKKyAgICAweEZFMzAsIDB4RkUzOSwgMHg1NzlFLCAweDgxMzksIDB4ODEzMCwgMHg4MTM3LCAweDU3QTgsIDB4ODEzOSwgMHg4MTM5LAorICAgIDB4ODEzOSwgMHg1N0IwLCAweDgxMzksIDB4ODIzMCwgMHg4MjM5LCAweDU3QjEsIDB4ODEzOSwgMHg4MzMwLCAweDgzMzksCisgICAgMHg1N0JCLCAweDgxMzksIDB4ODQzMCwgMHg4NDM5LCAweDU3QzUsIDB4ODEzOSwgMHg4NTMwLCAweDg1MzksIDB4NTdDRiwKKyAgICAweDgxMzksIDB4ODYzMCwgMHg4NjM5LCAweDU3RDksIDB4ODEzOSwgMHg4NzMwLCAweDg3MzksIDB4NTdFMywgMHg4MTM5LAorICAgIDB4ODgzMCwgMHg4ODM5LCAweDU3RUQsIDB4ODEzOSwgMHg4OTMwLCAweDg5MzksIDB4NTdGNywgMHg4MTM5LCAweDhCMzIsCisgICAgMHg4QjMyLCAweDEwNDIsIDB4ODEzOSwgMHg4QjMzLCAweDhCMzMsIDB4MTI2MywgMHg4MTM5LCAweDhCMzQsIDB4OEIzNCwKKyAgICAweDEyNzIsIDB4ODEzOSwgMHg4QjM1LCAweDhCMzUsIDB4MTI2NSwgMHg4MTM5LCAweDhCMzYsIDB4OEIzNiwgMHgxMDU5LAorICAgIDB4ODEzOSwgMHg4QjM3LCAweDhCMzcsIDB4Mjc5MywgMHg4MTM5LCAweDhCMzgsIDB4OEIzOCwgMHgwNjNELCAweDgxMzksCisgICAgMHg4QjM5LCAweDhCMzksIDB4MTMwMywgMHg4MTM5LCAweDhDMzAsIDB4OEMzMCwgMHgwQ0E2LCAweDgxMzksIDB4OEMzMSwKKyAgICAweDhDMzEsIDB4MDYzOCwgMHg4MTM5LCAweDhDMzIsIDB4OEMzMiwgMHgwQ0M2LCAweDgxMzksIDB4OEMzMywgMHg4QzMzLAorICAgIDB4MDNENiwgMHg4MTM5LCAweDhDMzQsIDB4OEMzNCwgMHgxMjlELCAweDgxMzksIDB4OEMzNSwgMHg4QzM1LCAweDEzMTQsCisgICAgMHg4MTM5LCAweDhDMzYsIDB4OEMzNiwgMHgxMzBGLCAweDgxMzksIDB4OEMzNywgMHg4QzM3LCAweDA4MkIsIDB4ODEzOSwKKyAgICAweDhDMzgsIDB4OEMzOCwgMHgxMzk5LCAweDgxMzksIDB4OEMzOSwgMHg4QzM5LCAweDA1OTcsIDB4ODEzOSwgMHg4RDMwLAorICAgIDB4OEQzMCwgMHgwOUVGLCAweDgxMzksIDB4OEQzMSwgMHg4RDMxLCAweDEyRkMsIDB4ODEzOSwgMHg4RDMyLCAweDhEMzIsCisgICAgMHgxMjY2LCAweDgxMzksIDB4OEQzMywgMHg4RDMzLCAweDEyODQsIDB4ODEzOSwgMHg4RDM0LCAweDhEMzQsIDB4MkExQSwKKyAgICAweDgxMzksIDB4OEQzNSwgMHg4RDM1LCAweDBENDUsIDB4ODEzOSwgMHg4RDM2LCAweDhEMzYsIDB4MDQ3RSwgMHg4MTM5LAorICAgIDB4OEQzNywgMHg4RDM3LCAweDEzNTIsIDB4ODEzOSwgMHg4RDM4LCAweDhEMzgsIDB4MDRDQywgMHg4MTM5LCAweDhEMzksCisgICAgMHg4RDM5LCAweDEzOUMsIDB4ODEzOSwgMHg4RTMwLCAweDhFMzAsIDB4MTBCQiwgMHg4MTM5LCAweDhFMzEsIDB4OEUzMSwKKyAgICAweDA5NjcsIDB4ODEzOSwgMHg4RTMyLCAweDhFMzIsIDB4MTU5MywgMHg4MTM5LCAweDhFMzMsIDB4OEUzMywgMHgwRTcyLAorICAgIDB4ODEzOSwgMHg4RTM0LCAweDhFMzQsIDB4MEQ1NiwgMHg4MTM5LCAweDhFMzUsIDB4OEUzNSwgMHgxNjFDLCAweDgxMzksCisgICAgMHg4RTM2LCAweDhFMzYsIDB4MkQyRCwgMHg4MTM5LCAweDhFMzcsIDB4OEUzNywgMHgwRjEzLCAweDgxMzksIDB4OEUzOCwKKyAgICAweDhFMzgsIDB4MDU3NiwgMHg4MTM5LCAweDhFMzksIDB4OEUzOSwgMHgwQjZGLCAweDgxMzksIDB4OEYzMCwgMHg4RjMwLAorICAgIDB4MTIzMCwgMHg4MTM5LCAweDhGMzEsIDB4OEYzMSwgMHgxNzJFLCAweDgxMzksIDB4OEYzMiwgMHg4RjMyLCAweDA1NkEsCisgICAgMHg4MTM5LCAweDhGMzMsIDB4OEYzMywgMHgwRjZDLCAweDgxMzksIDB4OEYzNCwgMHg4RjM0LCAweDE0QjYsIDB4ODEzOSwKKyAgICAweDhGMzUsIDB4OEYzNSwgMHgwRDQzLCAweDgxMzksIDB4OEYzNiwgMHg4RjM2LCAweDE3NzQsIDB4ODEzOSwgMHg4RjM3LAorICAgIDB4OEYzNywgMHgwQ0Y2LCAweDgxMzksIDB4OEYzOCwgMHg4RjM4LCAweDE4MTUsIDB4ODEzOSwgMHg4RjM5LCAweDhGMzksCisgICAgMHgwNkZELCAweDgxMzksIDB4OTAzMCwgMHg5MDMwLCAweDA4MkQsIDB4ODEzOSwgMHg5MDMxLCAweDkwMzEsIDB4MDhCRSwKKyAgICAweDgxMzksIDB4OTAzMiwgMHg5MDMyLCAweDA2QzQsIDB4ODEzOSwgMHg5MDMzLCAweDkwMzMsIDB4MTgxMywgMHg4MTM5LAorICAgIDB4OTAzNCwgMHg5MDM0LCAweDA3M0MsIDB4ODEzOSwgMHg5MDM1LCAweDkwMzUsIDB4MTM5OCwgMHg4MTM5LCAweDkwMzYsCisgICAgMHg5MDM2LCAweDE0QUQsIDB4ODEzOSwgMHg5MDM3LCAweDkwMzcsIDB4MTRGNiwgMHg4MTM5LCAweDkwMzgsIDB4OTAzOCwKKyAgICAweDA3MDYsIDB4ODEzOSwgMHg5MDM5LCAweDkwMzksIDB4MTc2MiwgMHg4MTM5LCAweDkxMzAsIDB4OTEzMCwgMHgxNUVFLAorICAgIDB4ODEzOSwgMHg5MTMxLCAweDkxMzEsIDB4MTVFMCwgMHg4MTM5LCAweDkxMzIsIDB4OTEzMiwgMHgwRjhGLCAweDgxMzksCisgICAgMHg5MTMzLCAweDkxMzMsIDB4MDZFNSwgMHg4MTM5LCAweDkxMzQsIDB4OTEzNCwgMHgzMjkyLCAweDgxMzksIDB4OTEzNSwKKyAgICAweDkxMzUsIDB4MEQ2RCwgMHg4MTM5LCAweDkxMzYsIDB4OTEzNiwgMHgxMUE2LCAweDgxMzksIDB4OTEzNywgMHg5MTM3LAorICAgIDB4MTkwOSwgMHg4MTM5LCAweDkxMzgsIDB4OTEzOCwgMHgwRUQzLCAweDgxMzksIDB4OTEzOSwgMHg5MTM5LCAweDA1RjYsCisgICAgMHg4MTM5LCAweDkyMzAsIDB4OTIzMCwgMHgwOEMwLCAweDgxMzksIDB4OTIzMSwgMHg5MjMxLCAweDA2NUEsIDB4ODEzOSwKKyAgICAweDkyMzIsIDB4OTIzMiwgMHgwRUVELCAweDgxMzksIDB4OTIzMywgMHg5MjMzLCAweDBDQjAsIDB4ODEzOSwgMHg5MjM0LAorICAgIDB4OTIzNCwgMHgxMEZFLCAweDgxMzksIDB4OTIzNSwgMHg5MjM1LCAweDExMDUsIDB4ODEzOSwgMHg5MjM2LCAweDkyMzYsCisgICAgMHgwQjIxLCAweDgxMzksIDB4OTIzNywgMHg5MjM3LCAweDBDMzQsIDB4ODEzOSwgMHg5MjM4LCAweDkyMzgsIDB4MTFCOCwKKyAgICAweDgxMzksIDB4OTIzOSwgMHg5MjM5LCAweDA1NzgsIDB4ODEzOSwgMHg5MzMwLCAweDkzMzAsIDB4MTlCRCwgMHg4MTM5LAorICAgIDB4OTMzMSwgMHg5MzMxLCAweDBFRjIsIDB4ODEzOSwgMHg5MzMyLCAweDkzMzIsIDB4MDQzMSwgMHg4MTM5LCAweDkzMzMsCisgICAgMHg5MzMzLCAweDBBQjAsIDB4ODEzOSwgMHg5MzM0LCAweDkzMzQsIDB4MEQ2NiwgMHg4MTM5LCAweDkzMzUsIDB4OTMzNSwKKyAgICAweDBDMTcsIDB4ODEzOSwgMHg5MzM2LCAweDkzMzYsIDB4MERBMywgMHg4MTM5LCAweDkzMzcsIDB4OTMzNywgMHgwODA1LAorICAgIDB4ODEzOSwgMHg5MzM4LCAweDkzMzgsIDB4MTIwMywgMHg4MTM5LCAweDkzMzksIDB4OTMzOSwgMHgwNkIzLCAweDgxMzksCisgICAgMHg5NDMwLCAweDk0MzAsIDB4MTI2OSwgMHg4MTM5LCAweDk0MzEsIDB4OTQzMSwgMHgxNjlELCAweDgxMzksIDB4OTQzMiwKKyAgICAweDk0MzIsIDB4MEJDQiwgMHg4MTM5LCAweDk0MzMsIDB4OTQzMywgMHgwRkU5LCAweDgxMzksIDB4OTQzNCwgMHg5NDM0LAorICAgIDB4MEI2NCwgMHg4MTM5LCAweDk0MzUsIDB4OTQzNSwgMHgwQzg5LCAweDgxMzksIDB4OTQzNiwgMHg5NDM2LCAweDBGQzksCisgICAgMHg4MTM5LCAweDk0MzcsIDB4OTQzNywgMHgxMEQ2LCAweDgxMzksIDB4OTQzOCwgMHg5NDM4LCAweDA3MjgsIDB4ODEzOSwKKyAgICAweDk0MzksIDB4OTQzOSwgMHgwRTkwLCAweDgxMzksIDB4OTUzMCwgMHg5NTMwLCAweDA2QzUsIDB4ODEzOSwgMHg5NTMxLAorICAgIDB4OTUzMSwgMHgwRDMzLCAweDgxMzksIDB4OTUzMiwgMHg5NTMyLCAweDEwQTgsIDB4ODEzOSwgMHg5NTMzLCAweDk1MzMsCisgICAgMHgwRTQyLCAweDgxMzksIDB4OTUzNCwgMHg5NTM0LCAweDFCQzYsIDB4ODEzOSwgMHg5NTM1LCAweDk1MzUsIDB4MUI2MCwKKyAgICAweDgxMzksIDB4OTUzNiwgMHg5NTM2LCAweDNFQkYsIDB4ODEzOSwgMHg5NTM3LCAweDk1MzcsIDB4MDNFMiwgMHg4MTM5LAorICAgIDB4OTUzOCwgMHg5NTM4LCAweDBCQzMsIDB4ODEzOSwgMHg5NTM5LCAweDk1MzksIDB4MEFGOCwgMHg4MTM5LCAweDk2MzAsCisgICAgMHg5NjMwLCAweDBCMjIsIDB4ODEzOSwgMHg5NjMxLCAweDk2MzEsIDB4MEFCMSwgMHg4MTM5LCAweDk2MzIsIDB4OTYzMiwKKyAgICAweDBENEYsIDB4ODEzOSwgMHg5NjMzLCAweDk2MzMsIDB4MEQ0NiwgMHg4MTM5LCAweDk2MzQsIDB4OTYzNCwgMHgwRDU1LAorICAgIDB4ODEzOSwgMHg5NjM1LCAweDk2MzUsIDB4NDBDQiwgMHg4MTM5LCAweDk2MzYsIDB4OTYzNiwgMHgwNzgzLCAweDgxMzksCisgICAgMHg5NjM3LCAweDk2MzcsIDB4MEZEMSwgMHg4MTM5LCAweDk2MzgsIDB4OTYzOCwgMHgwOUVCLCAweDgxMzksIDB4OTYzOSwKKyAgICAweDk2MzksIDB4MTFGMCwgMHg4MTM5LCAweDk3MzAsIDB4OTczMCwgMHgwQURDLCAweDgxMzksIDB4OTczMSwgMHg5NzMxLAorICAgIDB4MUNFNywgMHg4MTM5LCAweDk3MzIsIDB4OTczMiwgMHgxQzVFLCAweDgxMzksIDB4OTczMywgMHg5NzMzLCAweDBFQTksCisgICAgMHg4MTM5LCAweDk3MzQsIDB4OTczNCwgMHgxMDFCLCAweDgxMzksIDB4OTczNSwgMHg5NzM1LCAweDEwRDUsIDB4ODEzOSwKKyAgICAweDk3MzYsIDB4OTczNiwgMHgwOUJBLCAweDgxMzksIDB4OTczNywgMHg5NzM3LCAweDA2MzcsIDB4ODEzOSwgMHg5NzM4LAorICAgIDB4OTczOCwgMHgxQkNCLCAweDgxMzksIDB4OTczOSwgMHg5NzM5LCAweDA2MzksIDB4ODEzOSwgMHg5ODMwLCAweDk4MzAsCisgICAgMHgxQTFFLCAweDgxMzksIDB4OTgzMSwgMHg5ODMxLCAweDBDQkQsIDB4ODEzOSwgMHg5ODMyLCAweDk4MzIsIDB4MDRFMSwKKyAgICAweDgxMzksIDB4OTgzMywgMHg5ODMzLCAweDEyMzEsIDB4ODEzOSwgMHg5ODM0LCAweDk4MzQsIDB4MTFDMCwgMHg4MTM5LAorICAgIDB4OTgzNSwgMHg5ODM1LCAweDA4RjksIDB4ODEzOSwgMHg5ODM2LCAweDk4MzYsIDB4MEQxOSwgMHg4MTM5LCAweDk4MzcsCisgICAgMHg5ODM3LCAweDE2MTgsIDB4ODEzOSwgMHg5ODM4LCAweDk4MzgsIDB4MTFEQSwgMHg4MTM5LCAweDk4MzksIDB4OTgzOSwKKyAgICAweDFDREMsIDB4ODEzOSwgMHg5OTMwLCAweDk5MzAsIDB4MENFNCwgMHg4MTM5LCAweDk5MzEsIDB4OTkzMSwgMHg0NUEyLAorICAgIDB4ODEzOSwgMHg5OTMyLCAweDk5MzIsIDB4MUJGMCwgMHg4MTM5LCAweDk5MzMsIDB4OTkzMywgMHgwNTBCLCAweDgxMzksCisgICAgMHg5OTM0LCAweDk5MzQsIDB4MEZEMywgMHg4MTM5LCAweDk5MzUsIDB4OTkzNSwgMHgwRjlCLCAweDgxMzksIDB4OTkzNiwKKyAgICAweDk5MzYsIDB4MTA0OSwgMHg4MTM5LCAweDk5MzcsIDB4OTkzNywgMHg0OURDLCAweDgxMzksIDB4OTkzOCwgMHg5OTM4LAorICAgIDB4MUY5NiwgMHg4MTM5LCAweDk5MzksIDB4OTkzOSwgMHgwODk4LCAweDgxMzksIDB4OUEzMCwgMHg5QTMwLCAweDBGRkQsCisgICAgMHg4MTM5LCAweDlBMzEsIDB4OUEzMSwgMHgwNzIxLCAweDgxMzksIDB4OUEzMiwgMHg5QTMyLCAweDA1RjgsIDB4ODEzOSwKKyAgICAweDlBMzMsIDB4OUEzMywgMHgxRDE1LCAweDgxMzksIDB4OUEzNCwgMHg5QTM0LCAweDFENTAsIDB4ODEzOSwgMHg5QTM1LAorICAgIDB4OUEzNSwgMHgxRTNCLCAweDgxMzksIDB4OUEzNiwgMHg5QTM2LCAweDA1MDUsIDB4ODEzOSwgMHg5QTM3LCAweDlBMzcsCisgICAgMHgxMjNDLCAweDgxMzksIDB4OUEzOCwgMHg5QTM4LCAweDEyNDAsIDB4ODEzOSwgMHg5QTM5LCAweDlBMzksIDB4MEQyNiwKKyAgICAweDgxMzksIDB4OUIzMCwgMHg5QjMwLCAweDFFN0IsIDB4ODEzOSwgMHg5QjMxLCAweDlCMzEsIDB4MEY4QywgMHg4MTM5LAorICAgIDB4OUIzMiwgMHg5QjMyLCAweDA0RTIsIDB4ODEzOSwgMHg5QjMzLCAweDlCMzMsIDB4NEQxMywgMHg4MTM5LCAweDlCMzQsCisgICAgMHg5QjM0LCAweDEwNUYsIDB4ODEzOSwgMHg5QjM1LCAweDlCMzUsIDB4MTBCNCwgMHg4MTM5LCAweDlCMzYsIDB4OUIzNiwKKyAgICAweDRFMTgsIDB4ODEzOSwgMHg5QjM3LCAweDlCMzcsIDB4MDlEQSwgMHg4MTM5LCAweDlCMzgsIDB4OUIzOCwgMHgwOEMxLAorICAgIDB4ODEzOSwgMHg5QjM5LCAweDlCMzksIDB4MUU3NSwgMHg4MTM5LCAweDlDMzAsIDB4OUMzMCwgMHgyMDdELCAweDgxMzksCisgICAgMHg5QzMxLCAweDlDMzEsIDB4MDZCMiwgMHg4MTM5LCAweDlDMzIsIDB4OUMzMiwgMHgwOUVFLCAweDgxMzksIDB4OUMzMywKKyAgICAweDlDMzMsIDB4MUQ3OSwgMHg4MTM5LCAweDlDMzQsIDB4OUMzNCwgMHgxMENGLCAweDgxMzksIDB4OUMzNSwgMHg5QzM1LAorICAgIDB4NTBFQSwgMHg4MTM5LCAweDlDMzYsIDB4OUMzNiwgMHgwNjY0LCAweDgxMzksIDB4OUMzNywgMHg5QzM3LCAweDBBRUIsCisgICAgMHg4MTM5LCAweDlDMzgsIDB4OUMzOCwgMHgwNkVBLCAweDgxMzksIDB4OUMzOSwgMHg5QzM5LCAweDIxOEQsIDB4ODEzOSwKKyAgICAweDlEMzAsIDB4OUQzMCwgMHgwOEYxLCAweDgxMzksIDB4OUQzMSwgMHg5RDMxLCAweDEwN0IsIDB4ODEzOSwgMHg5RDMyLAorICAgIDB4OUQzMiwgMHgyMjA5LCAweDgxMzksIDB4OUQzMywgMHg5RDMzLCAweDFGMDAsIDB4ODEzOSwgMHg5RDM0LCAweDlEMzQsCisgICAgMHgxRUY0LCAweDgxMzksIDB4OUQzNSwgMHg5RDM1LCAweDBENEEsIDB4ODEzOSwgMHg5RDM2LCAweDlEMzYsIDB4MEQ2RSwKKyAgICAweDgxMzksIDB4OUQzNywgMHg5RDM3LCAweDBGNTAsIDB4ODEzOSwgMHg5RDM4LCAweDlEMzgsIDB4MjA2RCwgMHg4MTM5LAorICAgIDB4OUQzOSwgMHg5RDM5LCAweDA3MjAsIDB4ODEzOSwgMHg5RTMwLCAweDlFMzAsIDB4MDZEQSwgMHg4MTM5LCAweDlFMzEsCisgICAgMHg5RTMxLCAweDFERUMsIDB4ODEzOSwgMHg5RTMyLCAweDlFMzIsIDB4MUVEMCwgMHg4MTM5LCAweDlFMzMsIDB4OUUzMywKKyAgICAweDEzOUIsIDB4ODEzOSwgMHg5RTM0LCAweDlFMzQsIDB4MTI2MCwgMHg4MTM5LCAweDlFMzUsIDB4OUUzNSwgMHgwNzQ2LAorICAgIDB4ODEzOSwgMHg5RTM2LCAweDlFMzYsIDB4MjIzOSwgMHg4MTM5LCAweDlFMzcsIDB4OUUzNywgMHgyMDlDLCAweDgxMzksCisgICAgMHg5RTM4LCAweDlFMzgsIDB4MjY4OCwgMHg4MTM5LCAweDlFMzksIDB4OUUzOSwgMHgwQTYwLCAweDgxMzksIDB4OUYzMCwKKyAgICAweDlGMzAsIDB4MjA3MSwgMHg4MTM5LCAweDlGMzEsIDB4OUYzMSwgMHgwQTkwLCAweDgxMzksIDB4OUYzMiwgMHg5RjMyLAorICAgIDB4NTU4NiwgMHg4MTM5LCAweDlGMzMsIDB4OUYzMywgMHgwRDg5LCAweDgxMzksIDB4OUYzNCwgMHg5RjM0LCAweDA3OTEsCisgICAgMHg4MTM5LCAweDlGMzUsIDB4OUYzNSwgMHgxQTU1LCAweDgxMzksIDB4OUYzNiwgMHg5RjM2LCAweDI2MTgsIDB4ODEzOSwKKyAgICAweDlGMzcsIDB4OUYzNywgMHgwNUU1LCAweDgxMzksIDB4OUYzOCwgMHg5RjM4LCAweDA3MUQsIDB4ODEzOSwgMHg5RjM5LAorICAgIDB4OUYzOSwgMHgwRDhBLCAweDgxMzksIDB4QTAzMCwgMHhBMDMwLCAweDA0MzAsIDB4ODEzOSwgMHhBMDMxLCAweEEwMzEsCisgICAgMHgyMEM2LCAweDgxMzksIDB4QTAzMiwgMHhBMDMyLCAweDFFODYsIDB4ODEzOSwgMHhBMDMzLCAweEEwMzMsIDB4MjAzNywKKyAgICAweDgxMzksIDB4QTAzNCwgMHhBMDM0LCAweDFGMzQsIDB4ODEzOSwgMHhBMDM1LCAweEEwMzUsIDB4MTJGMywgMHg4MTM5LAorICAgIDB4QTUzMywgMHhBNTM1LCAweDU3N0IsIDB4ODEzOSwgMHhBNTM4LCAweEE1MzksIDB4NTc3RSwgMHg4MTM5LCAweEE2MzAsCisgICAgMHhBNjMwLCAweDU3ODAsIDB4ODEzOSwgMHhBNjM0LCAweEE2MzQsIDB4NTc1NSwgMHg4MTM5LCAweEE2MzYsIDB4QTYzNiwKKyAgICAweDU3NjcsIDB4ODEzOSwgMHhBNzM1LCAweEE3MzUsIDB4NTc3NiwgMHg4MTM5LCAweEE3MzYsIDB4QTczNiwgMHg1Nzc4LAorICAgIDB4ODEzOSwgMHhBNzM3LCAweEE3MzcsIDB4NTc3NywgMHg4MTM5LCAweEE3MzgsIDB4QTczOCwgMHg1Nzc5LCAweDgxMzksCisgICAgMHhBODM2LCAweEE4MzgsIDB4NTc4MSwgMHg4MTM5LCAweEI0MzQsIDB4QjQzOSwgMHg1Nzg0LCAweDgxMzksIDB4QjUzMCwKKyAgICAweEI1MzksIDB4NTc4QSwgMHg4MTM5LCAweEI2MzAsIDB4QjYzNywgMHg1Nzk0LCAweDgxMzksIDB4RUUzOSwgMHhFRTM5LAorICAgIDB4NTgwMSwgMHg4MTM5LCAweEVGMzAsIDB4RUYzOSwgMHg1ODAyLCAweDgxMzksIDB4RjAzMCwgMHhGMDM5LCAweDU4MEMsCisgICAgMHg4MTM5LCAweEYxMzAsIDB4RjEzOSwgMHg1ODE2LCAweDgxMzksIDB4RjIzMCwgMHhGMjM5LCAweDU4MjAsIDB4ODEzOSwKKyAgICAweEYzMzAsIDB4RjMzOSwgMHg1ODJBLCAweDgxMzksIDB4RjQzMCwgMHhGNDM5LCAweDU4MzQsIDB4ODEzOSwgMHhGNTMwLAorICAgIDB4RjUzOSwgMHg1ODNFLCAweDgxMzksIDB4RjYzMCwgMHhGNjM5LCAweDU4NDgsIDB4ODEzOSwgMHhGNzMwLCAweEY3MzksCisgICAgMHg1ODUyLCAweDgxMzksIDB4RjgzMCwgMHhGODM5LCAweDU4NUMsIDB4ODEzOSwgMHhGOTMwLCAweEY5MzksIDB4NTg2NiwKKyAgICAweDgxMzksIDB4RkEzMCwgMHhGQTM5LCAweDU4NzAsIDB4ODEzOSwgMHhGQjMwLCAweEZCMzksIDB4NTg3QSwgMHg4MTM5LAorICAgIDB4RkMzMCwgMHhGQzM5LCAweDU4ODQsIDB4ODEzOSwgMHhGRDMwLCAweEZEMzksIDB4NTg4RSwgMHg4MTM5LCAweEZFMzAsCisgICAgMHhGRTM5LCAweDU4OTgsIDB4ODIzMCwgMHg4MTMwLCAweDgxMzksIDB4NThBMiwgMHg4MjMwLCAweDgyMzAsIDB4ODIzOSwKKyAgICAweDU4QUMsIDB4ODIzMCwgMHg4MzMwLCAweDgzMzksIDB4NThCNiwgMHg4MjMwLCAweDg0MzAsIDB4ODQzOSwgMHg1OEMwLAorICAgIDB4ODIzMCwgMHg4NTMwLCAweDg1MzksIDB4NThDQSwgMHg4MjMwLCAweDg2MzAsIDB4ODYzOSwgMHg1OEQ0LCAweDgyMzAsCisgICAgMHg4NzMwLCAweDg3MzksIDB4NThERSwgMHg4MjMwLCAweDg4MzAsIDB4ODgzOSwgMHg1OEU4LCAweDgyMzAsIDB4ODkzMCwKKyAgICAweDg5MzksIDB4NThGMiwgMHg4MjMwLCAweDhBMzAsIDB4OEEzOSwgMHg1OEZDLCAweDgyMzAsIDB4OEIzMCwgMHg4QjM5LAorICAgIDB4NTkwNiwgMHg4MjMwLCAweDhDMzAsIDB4OEMzOSwgMHg1OTEwLCAweDgyMzAsIDB4OEQzMCwgMHg4RDM5LCAweDU5MUEsCisgICAgMHg4MjMwLCAweDhFMzAsIDB4OEUzOSwgMHg1OTI0LCAweDgyMzAsIDB4OEYzMCwgMHg4RjM5LCAweDU5MkUsIDB4ODIzMCwKKyAgICAweDkwMzAsIDB4OTAzOSwgMHg1OTM4LCAweDgyMzAsIDB4OTEzMCwgMHg5MTM5LCAweDU5NDIsIDB4ODIzMCwgMHg5MjMwLAorICAgIDB4OTIzOSwgMHg1OTRDLCAweDgyMzAsIDB4OTMzMCwgMHg5MzM5LCAweDU5NTYsIDB4ODIzMCwgMHg5NDMwLCAweDk0MzksCisgICAgMHg1OTYwLCAweDgyMzAsIDB4OTUzMCwgMHg5NTM5LCAweDU5NkEsIDB4ODIzMCwgMHg5NjMwLCAweDk2MzksIDB4NTk3NCwKKyAgICAweDgyMzAsIDB4OTczMCwgMHg5NzM5LCAweDU5N0UsIDB4ODIzMCwgMHg5ODMwLCAweDk4MzksIDB4NTk4OCwgMHg4MjMwLAorICAgIDB4OTkzMCwgMHg5OTM5LCAweDU5OTIsIDB4ODIzMCwgMHg5QTMwLCAweDlBMzksIDB4NTk5QywgMHg4MjMwLCAweDlCMzAsCisgICAgMHg5QjM5LCAweDU5QTYsIDB4ODIzMCwgMHg5QzMwLCAweDlDMzksIDB4NTlCMCwgMHg4MjMwLCAweDlEMzAsIDB4OUQzOSwKKyAgICAweDU5QkEsIDB4ODIzMCwgMHg5RTMwLCAweDlFMzksIDB4NTlDNCwgMHg4MjMwLCAweDlGMzAsIDB4OUYzOSwgMHg1OUNFLAorICAgIDB4ODIzMCwgMHhBMDMwLCAweEEwMzksIDB4NTlEOCwgMHg4MjMwLCAweEExMzAsIDB4QTEzOSwgMHg1OUUyLCAweDgyMzAsCisgICAgMHhBMjMwLCAweEEyMzksIDB4NTlFQywgMHg4MjMwLCAweEEzMzAsIDB4QTMzOSwgMHg1OUY2LCAweDgyMzAsIDB4QTQzMCwKKyAgICAweEE0MzksIDB4NUEwMCwgMHg4MjMwLCAweEE1MzAsIDB4QTUzOSwgMHg1QTBBLCAweDgyMzAsIDB4QTYzMCwgMHhBNjM5LAorICAgIDB4NUExNCwgMHg4MjMwLCAweEE3MzAsIDB4QTczOSwgMHg1QTFFLCAweDgyMzAsIDB4QTgzMCwgMHhBODM5LCAweDVBMjgsCisgICAgMHg4MjMwLCAweEE5MzAsIDB4QTkzOSwgMHg1QTMyLCAweDgyMzAsIDB4QUEzMCwgMHhBQTM5LCAweDVBM0MsIDB4ODIzMCwKKyAgICAweEFCMzAsIDB4QUIzOSwgMHg1QTQ2LCAweDgyMzAsIDB4QUMzMCwgMHhBQzM5LCAweDVBNTAsIDB4ODIzMCwgMHhBRDMwLAorICAgIDB4QUQzOSwgMHg1QTVBLCAweDgyMzAsIDB4QUUzMCwgMHhBRTM5LCAweDVBNjQsIDB4ODIzMCwgMHhBRjMwLCAweEFGMzksCisgICAgMHg1QTZFLCAweDgyMzAsIDB4QjAzMCwgMHhCMDM5LCAweDVBNzgsIDB4ODIzMCwgMHhCMTMwLCAweEIxMzksIDB4NUE4MiwKKyAgICAweDgyMzAsIDB4QjIzMCwgMHhCMjM5LCAweDVBOEMsIDB4ODIzMCwgMHhCMzMwLCAweEIzMzksIDB4NUE5NiwgMHg4MjMwLAorICAgIDB4QjQzMCwgMHhCNDM5LCAweDVBQTAsIDB4ODIzMCwgMHhCNTMwLCAweEI1MzksIDB4NUFBQSwgMHg4MjMwLCAweEI2MzAsCisgICAgMHhCNjM5LCAweDVBQjQsIDB4ODIzMCwgMHhCNzMwLCAweEI3MzksIDB4NUFCRSwgMHg4MjMwLCAweEI4MzAsIDB4QjgzOSwKKyAgICAweDVBQzgsIDB4ODIzMCwgMHhCOTMwLCAweEI5MzksIDB4NUFEMiwgMHg4MjMwLCAweEJBMzAsIDB4QkEzOSwgMHg1QURDLAorICAgIDB4ODIzMCwgMHhCQjMwLCAweEJCMzksIDB4NUFFNiwgMHg4MjMwLCAweEJDMzAsIDB4QkMzOSwgMHg1QUYwLCAweDgyMzAsCisgICAgMHhCRDMwLCAweEJEMzksIDB4NUFGQSwgMHg4MjMwLCAweEJFMzAsIDB4QkUzOSwgMHg1QjA0LCAweDgyMzAsIDB4QkYzMCwKKyAgICAweEJGMzksIDB4NUIwRSwgMHg4MjMwLCAweEMwMzAsIDB4QzAzOSwgMHg1QjE4LCAweDgyMzAsIDB4QzEzMCwgMHhDMTM5LAorICAgIDB4NUIyMiwgMHg4MjMwLCAweEMyMzAsIDB4QzIzOSwgMHg1QjJDLCAweDgyMzAsIDB4QzMzMCwgMHhDMzM5LCAweDVCMzYsCisgICAgMHg4MjMwLCAweEM0MzAsIDB4QzQzOSwgMHg1QjQwLCAweDgyMzAsIDB4QzUzMCwgMHhDNTM5LCAweDVCNEEsIDB4ODIzMCwKKyAgICAweEM2MzAsIDB4QzYzOSwgMHg1QjU0LCAweDgyMzAsIDB4QzczMCwgMHhDNzM5LCAweDVCNUUsIDB4ODIzMCwgMHhDODMwLAorICAgIDB4QzgzOSwgMHg1QjY4LCAweDgyMzAsIDB4QzkzMCwgMHhDOTM5LCAweDVCNzIsIDB4ODIzMCwgMHhDQTMwLCAweENBMzksCisgICAgMHg1QjdDLCAweDgyMzAsIDB4Q0IzMCwgMHhDQjM5LCAweDVCODYsIDB4ODIzMCwgMHhDQzMwLCAweENDMzksIDB4NUI5MCwKKyAgICAweDgyMzAsIDB4Q0QzMCwgMHhDRDM5LCAweDVCOUEsIDB4ODIzMCwgMHhDRTMwLCAweENFMzksIDB4NUJBNCwgMHg4MjMwLAorICAgIDB4Q0YzMCwgMHhDRjM5LCAweDVCQUUsIDB4ODIzMCwgMHhEMDMwLCAweEQwMzksIDB4NUJCOCwgMHg4MjMwLCAweEQxMzAsCisgICAgMHhEMTM5LCAweDVCQzIsIDB4ODIzMCwgMHhEMjMwLCAweEQyMzksIDB4NUJDQywgMHg4MjMwLCAweEQzMzAsIDB4RDMzOSwKKyAgICAweDVCRDYsIDB4ODIzMCwgMHhENDMwLCAweEQ0MzksIDB4NUJFMCwgMHg4MjMwLCAweEQ1MzAsIDB4RDUzOSwgMHg1QkVBLAorICAgIDB4ODIzMCwgMHhENjMwLCAweEQ2MzksIDB4NUJGNCwgMHg4MjMwLCAweEQ3MzAsIDB4RDczOSwgMHg1QkZFLCAweDgyMzAsCisgICAgMHhEODMwLCAweEQ4MzksIDB4NUMwOCwgMHg4MjMwLCAweEQ5MzAsIDB4RDkzOSwgMHg1QzEyLCAweDgyMzAsIDB4REEzMCwKKyAgICAweERBMzksIDB4NUMxQywgMHg4MjMwLCAweERCMzAsIDB4REIzOSwgMHg1QzI2LCAweDgyMzAsIDB4REMzMCwgMHhEQzM5LAorICAgIDB4NUMzMCwgMHg4MjMwLCAweEREMzAsIDB4REQzOSwgMHg1QzNBLCAweDgyMzAsIDB4REUzMCwgMHhERTM5LCAweDVDNDQsCisgICAgMHg4MjMwLCAweERGMzAsIDB4REYzOSwgMHg1QzRFLCAweDgyMzAsIDB4RTAzMCwgMHhFMDM5LCAweDVDNTgsIDB4ODIzMCwKKyAgICAweEUxMzAsIDB4RTEzOSwgMHg1QzYyLCAweDgyMzAsIDB4RTIzMCwgMHhFMjM5LCAweDVDNkMsIDB4ODIzMCwgMHhFMzMwLAorICAgIDB4RTMzOSwgMHg1Qzc2LCAweDgyMzAsIDB4RTQzMCwgMHhFNDM5LCAweDVDODAsIDB4ODIzMCwgMHhFNTMwLCAweEU1MzksCisgICAgMHg1QzhBLCAweDgyMzAsIDB4RTYzMCwgMHhFNjM5LCAweDVDOTQsIDB4ODIzMCwgMHhFNzMwLCAweEU3MzksIDB4NUM5RSwKKyAgICAweDgyMzAsIDB4RTgzMCwgMHhFODM5LCAweDVDQTgsIDB4ODIzMCwgMHhFOTMwLCAweEU5MzksIDB4NUNCMiwgMHg4MjMwLAorICAgIDB4RUEzMCwgMHhFQTM5LCAweDVDQkMsIDB4ODIzMCwgMHhFQjMwLCAweEVCMzksIDB4NUNDNiwgMHg4MjMwLCAweEVDMzAsCisgICAgMHhFQzM5LCAweDVDRDAsIDB4ODIzMCwgMHhFRDMwLCAweEVEMzksIDB4NUNEQSwgMHg4MjMwLCAweEVFMzAsIDB4RUUzOSwKKyAgICAweDVDRTQsIDB4ODIzMCwgMHhFRjMwLCAweEVGMzksIDB4NUNFRSwgMHg4MjMwLCAweEYwMzAsIDB4RjAzOSwgMHg1Q0Y4LAorICAgIDB4ODIzMCwgMHhGMTMwLCAweEYxMzksIDB4NUQwMiwgMHg4MjMwLCAweEYyMzAsIDB4RjIzOSwgMHg1RDBDLCAweDgyMzAsCisgICAgMHhGMzMwLCAweEYzMzksIDB4NUQxNiwgMHg4MjMwLCAweEY0MzAsIDB4RjQzOSwgMHg1RDIwLCAweDgyMzAsIDB4RjUzMCwKKyAgICAweEY1MzksIDB4NUQyQSwgMHg4MjMwLCAweEY2MzAsIDB4RjYzOSwgMHg1RDM0LCAweDgyMzAsIDB4RjczMCwgMHhGNzM5LAorICAgIDB4NUQzRSwgMHg4MjMwLCAweEY4MzAsIDB4RjgzOSwgMHg1RDQ4LCAweDgyMzAsIDB4RjkzMCwgMHhGOTM5LCAweDVENTIsCisgICAgMHg4MjMwLCAweEZBMzAsIDB4RkEzOSwgMHg1RDVDLCAweDgyMzAsIDB4RkIzMCwgMHhGQjM5LCAweDVENjYsIDB4ODIzMCwKKyAgICAweEZDMzAsIDB4RkMzOSwgMHg1RDcwLCAweDgyMzAsIDB4RkQzMCwgMHhGRDM5LCAweDVEN0EsIDB4ODIzMCwgMHhGRTMwLAorICAgIDB4RkUzOSwgMHg1RDg0LCAweDgyMzEsIDB4ODEzMCwgMHg4MTM5LCAweDVEOEUsIDB4ODIzMSwgMHg4MjMwLCAweDgyMzksCisgICAgMHg1RDk4LCAweDgyMzEsIDB4ODMzMCwgMHg4MzM5LCAweDVEQTIsIDB4ODIzMSwgMHg4NDMwLCAweDg0MzksIDB4NURBQywKKyAgICAweDgyMzEsIDB4ODUzMCwgMHg4NTM5LCAweDVEQjYsIDB4ODIzMSwgMHg4NjMwLCAweDg2MzksIDB4NURDMCwgMHg4MjMxLAorICAgIDB4ODczMCwgMHg4NzM5LCAweDVEQ0EsIDB4ODIzMSwgMHg4ODMwLCAweDg4MzksIDB4NURENCwgMHg4MjMxLCAweDg5MzAsCisgICAgMHg4OTM5LCAweDVEREUsIDB4ODIzMSwgMHg4QTMwLCAweDhBMzksIDB4NURFOCwgMHg4MjMxLCAweDhCMzAsIDB4OEIzOSwKKyAgICAweDVERjIsIDB4ODIzMSwgMHg4QzMwLCAweDhDMzksIDB4NURGQywgMHg4MjMxLCAweDhEMzAsIDB4OEQzOSwgMHg1RTA2LAorICAgIDB4ODIzMSwgMHg4RTMwLCAweDhFMzksIDB4NUUxMCwgMHg4MjMxLCAweDhGMzAsIDB4OEYzOSwgMHg1RTFBLCAweDgyMzEsCisgICAgMHg5MDMwLCAweDkwMzksIDB4NUUyNCwgMHg4MjMxLCAweDkxMzAsIDB4OTEzOSwgMHg1RTJFLCAweDgyMzEsIDB4OTIzMCwKKyAgICAweDkyMzksIDB4NUUzOCwgMHg4MjMxLCAweDkzMzAsIDB4OTMzOSwgMHg1RTQyLCAweDgyMzEsIDB4OTQzMCwgMHg5NDM5LAorICAgIDB4NUU0QywgMHg4MjMxLCAweDk1MzAsIDB4OTUzOSwgMHg1RTU2LCAweDgyMzEsIDB4OTYzMCwgMHg5NjM5LCAweDVFNjAsCisgICAgMHg4MjMxLCAweDk3MzAsIDB4OTczOSwgMHg1RTZBLCAweDgyMzEsIDB4OTgzMCwgMHg5ODM5LCAweDVFNzQsIDB4ODIzMSwKKyAgICAweDk5MzAsIDB4OTkzOSwgMHg1RTdFLCAweDgyMzEsIDB4OUEzMCwgMHg5QTM5LCAweDVFODgsIDB4ODIzMSwgMHg5QjMwLAorICAgIDB4OUIzOSwgMHg1RTkyLCAweDgyMzEsIDB4OUMzMCwgMHg5QzM5LCAweDVFOUMsIDB4ODIzMSwgMHg5RDMwLCAweDlEMzksCisgICAgMHg1RUE2LCAweDgyMzEsIDB4OUUzMCwgMHg5RTM5LCAweDVFQjAsIDB4ODIzMSwgMHg5RjMwLCAweDlGMzksIDB4NUVCQSwKKyAgICAweDgyMzEsIDB4QTAzMCwgMHhBMDM5LCAweDVFQzQsIDB4ODIzMSwgMHhBMTMwLCAweEExMzksIDB4NUVDRSwgMHg4MjMxLAorICAgIDB4QTIzMCwgMHhBMjM5LCAweDVFRDgsIDB4ODIzMSwgMHhBMzMwLCAweEEzMzksIDB4NUVFMiwgMHg4MjMxLCAweEE0MzAsCisgICAgMHhBNDM5LCAweDVFRUMsIDB4ODIzMSwgMHhBNTMwLCAweEE1MzksIDB4NUVGNiwgMHg4MjMxLCAweEE2MzAsIDB4QTYzOSwKKyAgICAweDVGMDAsIDB4ODIzMSwgMHhBNzMwLCAweEE3MzksIDB4NUYwQSwgMHg4MjMxLCAweEE4MzAsIDB4QTgzOSwgMHg1RjE0LAorICAgIDB4ODIzMSwgMHhBOTMwLCAweEE5MzksIDB4NUYxRSwgMHg4MjMxLCAweEFBMzAsIDB4QUEzOSwgMHg1RjI4LCAweDgyMzEsCisgICAgMHhBQjMwLCAweEFCMzksIDB4NUYzMiwgMHg4MjMxLCAweEFDMzAsIDB4QUMzOSwgMHg1RjNDLCAweDgyMzEsIDB4QUQzMCwKKyAgICAweEFEMzksIDB4NUY0NiwgMHg4MjMxLCAweEFFMzAsIDB4QUUzOSwgMHg1RjUwLCAweDgyMzEsIDB4QUYzMCwgMHhBRjM5LAorICAgIDB4NUY1QSwgMHg4MjMxLCAweEIwMzAsIDB4QjAzOSwgMHg1RjY0LCAweDgyMzEsIDB4QjEzMCwgMHhCMTM5LCAweDVGNkUsCisgICAgMHg4MjMxLCAweEIyMzAsIDB4QjIzOSwgMHg1Rjc4LCAweDgyMzEsIDB4QjMzMCwgMHhCMzM5LCAweDVGODIsIDB4ODIzMSwKKyAgICAweEI0MzAsIDB4QjQzOSwgMHg1RjhDLCAweDgyMzEsIDB4QjUzMCwgMHhCNTM5LCAweDVGOTYsIDB4ODIzMSwgMHhCNjMwLAorICAgIDB4QjYzOSwgMHg1RkEwLCAweDgyMzEsIDB4QjczMCwgMHhCNzM5LCAweDVGQUEsIDB4ODIzMSwgMHhCODMwLCAweEI4MzksCisgICAgMHg1RkI0LCAweDgyMzEsIDB4QjkzMCwgMHhCOTM5LCAweDVGQkUsIDB4ODIzMSwgMHhCQTMwLCAweEJBMzksIDB4NUZDOCwKKyAgICAweDgyMzEsIDB4QkIzMCwgMHhCQjM5LCAweDVGRDIsIDB4ODIzMSwgMHhCQzMwLCAweEJDMzksIDB4NUZEQywgMHg4MjMxLAorICAgIDB4QkQzMCwgMHhCRDM5LCAweDVGRTYsIDB4ODIzMSwgMHhCRTMwLCAweEJFMzksIDB4NUZGMCwgMHg4MjMxLCAweEJGMzAsCisgICAgMHhCRjM5LCAweDVGRkEsIDB4ODIzMSwgMHhDMDMwLCAweEMwMzksIDB4NjAwNCwgMHg4MjMxLCAweEMxMzAsIDB4QzEzOSwKKyAgICAweDYwMEUsIDB4ODIzMSwgMHhDMjMwLCAweEMyMzksIDB4NjAxOCwgMHg4MjMxLCAweEMzMzAsIDB4QzMzOSwgMHg2MDIyLAorICAgIDB4ODIzMSwgMHhDNDMwLCAweEM0MzksIDB4NjAyQywgMHg4MjMxLCAweEM1MzAsIDB4QzUzOSwgMHg2MDM2LCAweDgyMzEsCisgICAgMHhDNjMwLCAweEM2MzksIDB4NjA0MCwgMHg4MjMxLCAweEM3MzAsIDB4QzczOSwgMHg2MDRBLCAweDgyMzEsIDB4QzgzMCwKKyAgICAweEM4MzksIDB4NjA1NCwgMHg4MjMxLCAweEM5MzAsIDB4QzkzOSwgMHg2MDVFLCAweDgyMzEsIDB4Q0EzMCwgMHhDQTM5LAorICAgIDB4NjA2OCwgMHg4MjMxLCAweENCMzAsIDB4Q0IzOSwgMHg2MDcyLCAweDgyMzEsIDB4Q0MzMCwgMHhDQzM5LCAweDYwN0MsCisgICAgMHg4MjMxLCAweENEMzAsIDB4Q0QzOSwgMHg2MDg2LCAweDgyMzEsIDB4Q0UzMCwgMHhDRTM5LCAweDYwOTAsIDB4ODIzMSwKKyAgICAweENGMzAsIDB4Q0YzOSwgMHg2MDlBLCAweDgyMzEsIDB4RDAzMCwgMHhEMDM5LCAweDYwQTQsIDB4ODIzMSwgMHhEMTMwLAorICAgIDB4RDEzOSwgMHg2MEFFLCAweDgyMzEsIDB4RDIzMCwgMHhEMjM5LCAweDYwQjgsIDB4ODIzMSwgMHhEMzMwLCAweEQzMzksCisgICAgMHg2MEMyLCAweDgyMzEsIDB4RDQzMCwgMHhENDM5LCAweDYwQ0MsIDB4ODIzMSwgMHhENTMwLCAweEQ1MzksIDB4NjBENiwKKyAgICAweDgyMzEsIDB4RDYzMCwgMHhENjM5LCAweDYwRTAsIDB4ODIzMSwgMHhENzMwLCAweEQ3MzksIDB4NjBFQSwgMHg4MjMxLAorICAgIDB4RDgzMCwgMHhEODM5LCAweDYwRjQsIDB4ODIzMSwgMHhEOTMwLCAweEQ5MzksIDB4NjBGRSwgMHg4MjMxLCAweERBMzAsCisgICAgMHhEQTM5LCAweDYxMDgsIDB4ODIzMSwgMHhEQjMwLCAweERCMzksIDB4NjExMiwgMHg4MjMxLCAweERDMzAsIDB4REMzOSwKKyAgICAweDYxMUMsIDB4ODIzMSwgMHhERDMwLCAweEREMzksIDB4NjEyNiwgMHg4MjMxLCAweERFMzAsIDB4REUzOSwgMHg2MTMwLAorICAgIDB4ODIzMSwgMHhERjMwLCAweERGMzksIDB4NjEzQSwgMHg4MjMxLCAweEUwMzAsIDB4RTAzOSwgMHg2MTQ0LCAweDgyMzEsCisgICAgMHhFMTMwLCAweEUxMzksIDB4NjE0RSwgMHg4MjMxLCAweEUyMzAsIDB4RTIzOSwgMHg2MTU4LCAweDgyMzEsIDB4RTMzMCwKKyAgICAweEUzMzksIDB4NjE2MiwgMHg4MjMxLCAweEU0MzAsIDB4RTQzOSwgMHg2MTZDLCAweDgyMzEsIDB4RTUzMCwgMHhFNTM5LAorICAgIDB4NjE3NiwgMHg4MjMxLCAweEU2MzAsIDB4RTYzOSwgMHg2MTgwLCAweDgyMzEsIDB4RTczMCwgMHhFNzM5LCAweDYxOEEsCisgICAgMHg4MjMxLCAweEU4MzAsIDB4RTgzOSwgMHg2MTk0LCAweDgyMzEsIDB4RTkzMCwgMHhFOTM5LCAweDYxOUUsIDB4ODIzMSwKKyAgICAweEVBMzAsIDB4RUEzOSwgMHg2MUE4LCAweDgyMzEsIDB4RUIzMCwgMHhFQjM5LCAweDYxQjIsIDB4ODIzMSwgMHhFQzMwLAorICAgIDB4RUMzOSwgMHg2MUJDLCAweDgyMzEsIDB4RUQzMCwgMHhFRDM5LCAweDYxQzYsIDB4ODIzMSwgMHhFRTMwLCAweEVFMzksCisgICAgMHg2MUQwLCAweDgyMzEsIDB4RUYzMCwgMHhFRjM5LCAweDYxREEsIDB4ODIzMSwgMHhGMDMwLCAweEYwMzksIDB4NjFFNCwKKyAgICAweDgyMzEsIDB4RjEzMCwgMHhGMTM5LCAweDYxRUUsIDB4ODIzMSwgMHhGMjMwLCAweEYyMzksIDB4NjFGOCwgMHg4MjMxLAorICAgIDB4RjMzMCwgMHhGMzM5LCAweDYyMDIsIDB4ODIzMSwgMHhGNDMwLCAweEY0MzksIDB4NjIwQywgMHg4MjMxLCAweEY1MzAsCisgICAgMHhGNTM5LCAweDYyMTYsIDB4ODIzMSwgMHhGNjMwLCAweEY2MzksIDB4NjIyMCwgMHg4MjMxLCAweEY3MzAsIDB4RjczOSwKKyAgICAweDYyMkEsIDB4ODIzMSwgMHhGODMwLCAweEY4MzksIDB4NjIzNCwgMHg4MjMxLCAweEY5MzAsIDB4RjkzOSwgMHg2MjNFLAorICAgIDB4ODIzMSwgMHhGQTMwLCAweEZBMzksIDB4NjI0OCwgMHg4MjMxLCAweEZCMzAsIDB4RkIzOSwgMHg2MjUyLCAweDgyMzEsCisgICAgMHhGQzMwLCAweEZDMzksIDB4NjI1QywgMHg4MjMxLCAweEZEMzAsIDB4RkQzOSwgMHg2MjY2LCAweDgyMzEsIDB4RkUzMCwKKyAgICAweEZFMzksIDB4NjI3MCwgMHg4MjMyLCAweDgxMzAsIDB4ODEzOSwgMHg2MjdBLCAweDgyMzIsIDB4ODIzMCwgMHg4MjM5LAorICAgIDB4NjI4NCwgMHg4MjMyLCAweDgzMzAsIDB4ODMzOSwgMHg2MjhFLCAweDgyMzIsIDB4ODQzMCwgMHg4NDM5LCAweDYyOTgsCisgICAgMHg4MjMyLCAweDg1MzAsIDB4ODUzOSwgMHg2MkEyLCAweDgyMzIsIDB4ODYzMCwgMHg4NjM5LCAweDYyQUMsIDB4ODIzMiwKKyAgICAweDg3MzAsIDB4ODczOSwgMHg2MkI2LCAweDgyMzIsIDB4ODgzMCwgMHg4ODM5LCAweDYyQzAsIDB4ODIzMiwgMHg4OTMwLAorICAgIDB4ODkzOSwgMHg2MkNBLCAweDgyMzIsIDB4OEEzMCwgMHg4QTM5LCAweDYyRDQsIDB4ODIzMiwgMHg4QjMwLCAweDhCMzksCisgICAgMHg2MkRFLCAweDgyMzIsIDB4OEMzMCwgMHg4QzM5LCAweDYyRTgsIDB4ODIzMiwgMHg4RDMwLCAweDhEMzksIDB4NjJGMiwKKyAgICAweDgyMzIsIDB4OEUzMCwgMHg4RTM5LCAweDYyRkMsIDB4ODIzMiwgMHg4RjMwLCAweDhGMzksIDB4NjMwNiwgMHg4MjMyLAorICAgIDB4OTAzMCwgMHg5MDM5LCAweDYzMTAsIDB4ODIzMiwgMHg5MTMwLCAweDkxMzksIDB4NjMxQSwgMHg4MjMyLCAweDkyMzAsCisgICAgMHg5MjM5LCAweDYzMjQsIDB4ODIzMiwgMHg5MzMwLCAweDkzMzksIDB4NjMyRSwgMHg4MjMyLCAweDk0MzAsIDB4OTQzOSwKKyAgICAweDYzMzgsIDB4ODIzMiwgMHg5NTMwLCAweDk1MzksIDB4NjM0MiwgMHg4MjMyLCAweDk2MzAsIDB4OTYzOSwgMHg2MzRDLAorICAgIDB4ODIzMiwgMHg5NzMwLCAweDk3MzksIDB4NjM1NiwgMHg4MjMyLCAweDk4MzAsIDB4OTgzOSwgMHg2MzYwLCAweDgyMzIsCisgICAgMHg5OTMwLCAweDk5MzksIDB4NjM2QSwgMHg4MjMyLCAweDlBMzAsIDB4OUEzOSwgMHg2Mzc0LCAweDgyMzIsIDB4OUIzMCwKKyAgICAweDlCMzksIDB4NjM3RSwgMHg4MjMyLCAweDlDMzAsIDB4OUMzOSwgMHg2Mzg4LCAweDgyMzIsIDB4OUQzMCwgMHg5RDM5LAorICAgIDB4NjM5MiwgMHg4MjMyLCAweDlFMzAsIDB4OUUzOSwgMHg2MzlDLCAweDgyMzIsIDB4OUYzMCwgMHg5RjM5LCAweDYzQTYsCisgICAgMHg4MjMyLCAweEEwMzAsIDB4QTAzOSwgMHg2M0IwLCAweDgyMzIsIDB4QTEzMCwgMHhBMTM5LCAweDYzQkEsIDB4ODIzMiwKKyAgICAweEEyMzAsIDB4QTIzOSwgMHg2M0M0LCAweDgyMzIsIDB4QTMzMCwgMHhBMzM5LCAweDYzQ0UsIDB4ODIzMiwgMHhBNDMwLAorICAgIDB4QTQzOSwgMHg2M0Q4LCAweDgyMzIsIDB4QTUzMCwgMHhBNTM5LCAweDYzRTIsIDB4ODIzMiwgMHhBNjMwLCAweEE2MzksCisgICAgMHg2M0VDLCAweDgyMzIsIDB4QTczMCwgMHhBNzM5LCAweDYzRjYsIDB4ODIzMiwgMHhBODMwLCAweEE4MzksIDB4NjQwMCwKKyAgICAweDgyMzIsIDB4QTkzMCwgMHhBOTM5LCAweDY0MEEsIDB4ODIzMiwgMHhBQTMwLCAweEFBMzksIDB4NjQxNCwgMHg4MjMyLAorICAgIDB4QUIzMCwgMHhBQjM5LCAweDY0MUUsIDB4ODIzMiwgMHhBQzMwLCAweEFDMzksIDB4NjQyOCwgMHg4MjMyLCAweEFEMzAsCisgICAgMHhBRDM5LCAweDY0MzIsIDB4ODIzMiwgMHhBRTMwLCAweEFFMzksIDB4NjQzQywgMHg4MjMyLCAweEFGMzAsIDB4QUYzOSwKKyAgICAweDY0NDYsIDB4ODIzMiwgMHhCMDMwLCAweEIwMzksIDB4NjQ1MCwgMHg4MjMyLCAweEIxMzAsIDB4QjEzOSwgMHg2NDVBLAorICAgIDB4ODIzMiwgMHhCMjMwLCAweEIyMzksIDB4NjQ2NCwgMHg4MjMyLCAweEIzMzAsIDB4QjMzOSwgMHg2NDZFLCAweDgyMzIsCisgICAgMHhCNDMwLCAweEI0MzksIDB4NjQ3OCwgMHg4MjMyLCAweEI1MzAsIDB4QjUzOSwgMHg2NDgyLCAweDgyMzIsIDB4QjYzMCwKKyAgICAweEI2MzksIDB4NjQ4QywgMHg4MjMyLCAweEI3MzAsIDB4QjczOSwgMHg2NDk2LCAweDgyMzIsIDB4QjgzMCwgMHhCODM5LAorICAgIDB4NjRBMCwgMHg4MjMyLCAweEI5MzAsIDB4QjkzOSwgMHg2NEFBLCAweDgyMzIsIDB4QkEzMCwgMHhCQTM5LCAweDY0QjQsCisgICAgMHg4MjMyLCAweEJCMzAsIDB4QkIzOSwgMHg2NEJFLCAweDgyMzIsIDB4QkMzMCwgMHhCQzM5LCAweDY0QzgsIDB4ODIzMiwKKyAgICAweEJEMzAsIDB4QkQzOSwgMHg2NEQyLCAweDgyMzIsIDB4QkUzMCwgMHhCRTM5LCAweDY0REMsIDB4ODIzMiwgMHhCRjMwLAorICAgIDB4QkYzOSwgMHg2NEU2LCAweDgyMzIsIDB4QzAzMCwgMHhDMDM5LCAweDY0RjAsIDB4ODIzMiwgMHhDMTMwLCAweEMxMzksCisgICAgMHg2NEZBLCAweDgyMzIsIDB4QzIzMCwgMHhDMjM5LCAweDY1MDQsIDB4ODIzMiwgMHhDMzMwLCAweEMzMzksIDB4NjUwRSwKKyAgICAweDgyMzIsIDB4QzQzMCwgMHhDNDM5LCAweDY1MTgsIDB4ODIzMiwgMHhDNTMwLCAweEM1MzksIDB4NjUyMiwgMHg4MjMyLAorICAgIDB4QzYzMCwgMHhDNjM5LCAweDY1MkMsIDB4ODIzMiwgMHhDNzMwLCAweEM3MzksIDB4NjUzNiwgMHg4MjMyLCAweEM4MzAsCisgICAgMHhDODM5LCAweDY1NDAsIDB4ODIzMiwgMHhDOTMwLCAweEM5MzksIDB4NjU0QSwgMHg4MjMyLCAweENBMzAsIDB4Q0EzOSwKKyAgICAweDY1NTQsIDB4ODIzMiwgMHhDQjMwLCAweENCMzksIDB4NjU1RSwgMHg4MjMyLCAweENDMzAsIDB4Q0MzOSwgMHg2NTY4LAorICAgIDB4ODIzMiwgMHhDRDMwLCAweENEMzksIDB4NjU3MiwgMHg4MjMyLCAweENFMzAsIDB4Q0UzOSwgMHg2NTdDLCAweDgyMzIsCisgICAgMHhDRjMwLCAweENGMzksIDB4NjU4NiwgMHg4MjMyLCAweEQwMzAsIDB4RDAzOSwgMHg2NTkwLCAweDgyMzIsIDB4RDEzMCwKKyAgICAweEQxMzksIDB4NjU5QSwgMHg4MjMyLCAweEQyMzAsIDB4RDIzOSwgMHg2NUE0LCAweDgyMzIsIDB4RDMzMCwgMHhEMzM5LAorICAgIDB4NjVBRSwgMHg4MjMyLCAweEQ0MzAsIDB4RDQzOSwgMHg2NUI4LCAweDgyMzIsIDB4RDUzMCwgMHhENTM5LCAweDY1QzIsCisgICAgMHg4MjMyLCAweEQ2MzAsIDB4RDYzOSwgMHg2NUNDLCAweDgyMzIsIDB4RDczMCwgMHhENzM5LCAweDY1RDYsIDB4ODIzMiwKKyAgICAweEQ4MzAsIDB4RDgzOSwgMHg2NUUwLCAweDgyMzIsIDB4RDkzMCwgMHhEOTM5LCAweDY1RUEsIDB4ODIzMiwgMHhEQTMwLAorICAgIDB4REEzOSwgMHg2NUY0LCAweDgyMzIsIDB4REIzMCwgMHhEQjM5LCAweDY1RkUsIDB4ODIzMiwgMHhEQzMwLCAweERDMzksCisgICAgMHg2NjA4LCAweDgyMzIsIDB4REQzMCwgMHhERDM5LCAweDY2MTIsIDB4ODIzMiwgMHhERTMwLCAweERFMzksIDB4NjYxQywKKyAgICAweDgyMzIsIDB4REYzMCwgMHhERjM5LCAweDY2MjYsIDB4ODIzMiwgMHhFMDMwLCAweEUwMzksIDB4NjYzMCwgMHg4MjMyLAorICAgIDB4RTEzMCwgMHhFMTM5LCAweDY2M0EsIDB4ODIzMiwgMHhFMjMwLCAweEUyMzksIDB4NjY0NCwgMHg4MjMyLCAweEUzMzAsCisgICAgMHhFMzM5LCAweDY2NEUsIDB4ODIzMiwgMHhFNDMwLCAweEU0MzksIDB4NjY1OCwgMHg4MjMyLCAweEU1MzAsIDB4RTUzOSwKKyAgICAweDY2NjIsIDB4ODIzMiwgMHhFNjMwLCAweEU2MzksIDB4NjY2QywgMHg4MjMyLCAweEU3MzAsIDB4RTczOSwgMHg2Njc2LAorICAgIDB4ODIzMiwgMHhFODMwLCAweEU4MzksIDB4NjY4MCwgMHg4MjMyLCAweEU5MzAsIDB4RTkzOSwgMHg2NjhBLCAweDgyMzIsCisgICAgMHhFQTMwLCAweEVBMzksIDB4NjY5NCwgMHg4MjMyLCAweEVCMzAsIDB4RUIzOSwgMHg2NjlFLCAweDgyMzIsIDB4RUMzMCwKKyAgICAweEVDMzksIDB4NjZBOCwgMHg4MjMyLCAweEVEMzAsIDB4RUQzOSwgMHg2NkIyLCAweDgyMzIsIDB4RUUzMCwgMHhFRTM5LAorICAgIDB4NjZCQywgMHg4MjMyLCAweEVGMzAsIDB4RUYzOSwgMHg2NkM2LCAweDgyMzIsIDB4RjAzMCwgMHhGMDM5LCAweDY2RDAsCisgICAgMHg4MjMyLCAweEYxMzAsIDB4RjEzOSwgMHg2NkRBLCAweDgyMzIsIDB4RjIzMCwgMHhGMjM5LCAweDY2RTQsIDB4ODIzMiwKKyAgICAweEYzMzAsIDB4RjMzOSwgMHg2NkVFLCAweDgyMzIsIDB4RjQzMCwgMHhGNDM5LCAweDY2RjgsIDB4ODIzMiwgMHhGNTMwLAorICAgIDB4RjUzOSwgMHg2NzAyLCAweDgyMzIsIDB4RjYzMCwgMHhGNjM5LCAweDY3MEMsIDB4ODIzMiwgMHhGNzMwLCAweEY3MzksCisgICAgMHg2NzE2LCAweDgyMzIsIDB4RjgzMCwgMHhGODM5LCAweDY3MjAsIDB4ODIzMiwgMHhGOTMwLCAweEY5MzksIDB4NjcyQSwKKyAgICAweDgyMzIsIDB4RkEzMCwgMHhGQTM5LCAweDY3MzQsIDB4ODIzMiwgMHhGQjMwLCAweEZCMzksIDB4NjczRSwgMHg4MjMyLAorICAgIDB4RkMzMCwgMHhGQzM5LCAweDY3NDgsIDB4ODIzMiwgMHhGRDMwLCAweEZEMzksIDB4Njc1MiwgMHg4MjMyLCAweEZFMzAsCisgICAgMHhGRTM5LCAweDY3NUMsIDB4ODIzMywgMHg4MTMwLCAweDgxMzksIDB4Njc2NiwgMHg4MjMzLCAweDgyMzAsIDB4ODIzOSwKKyAgICAweDY3NzAsIDB4ODIzMywgMHg4MzMwLCAweDgzMzksIDB4Njc3QSwgMHg4MjMzLCAweDg0MzAsIDB4ODQzOSwgMHg2Nzg0LAorICAgIDB4ODIzMywgMHg4NTMwLCAweDg1MzksIDB4Njc4RSwgMHg4MjMzLCAweDg2MzAsIDB4ODYzOSwgMHg2Nzk4LCAweDgyMzMsCisgICAgMHg4NzMwLCAweDg3MzksIDB4NjdBMiwgMHg4MjMzLCAweDg4MzAsIDB4ODgzOSwgMHg2N0FDLCAweDgyMzMsIDB4ODkzMCwKKyAgICAweDg5MzksIDB4NjdCNiwgMHg4MjMzLCAweDhBMzAsIDB4OEEzOSwgMHg2N0MwLCAweDgyMzMsIDB4OEIzMCwgMHg4QjM5LAorICAgIDB4NjdDQSwgMHg4MjMzLCAweDhDMzAsIDB4OEMzOSwgMHg2N0Q0LCAweDgyMzMsIDB4OEQzMCwgMHg4RDM5LCAweDY3REUsCisgICAgMHg4MjMzLCAweDhFMzAsIDB4OEUzOSwgMHg2N0U4LCAweDgyMzMsIDB4OEYzMCwgMHg4RjM5LCAweDY3RjIsIDB4ODIzMywKKyAgICAweDkwMzAsIDB4OTAzOSwgMHg2N0ZDLCAweDgyMzMsIDB4OTEzMCwgMHg5MTM5LCAweDY4MDYsIDB4ODIzMywgMHg5MjMwLAorICAgIDB4OTIzOSwgMHg2ODEwLCAweDgyMzMsIDB4OTMzMCwgMHg5MzM5LCAweDY4MUEsIDB4ODIzMywgMHg5NDMwLCAweDk0MzksCisgICAgMHg2ODI0LCAweDgyMzMsIDB4OTUzMCwgMHg5NTM5LCAweDY4MkUsIDB4ODIzMywgMHg5NjMwLCAweDk2MzksIDB4NjgzOCwKKyAgICAweDgyMzMsIDB4OTczMCwgMHg5NzM5LCAweDY4NDIsIDB4ODIzMywgMHg5ODMwLCAweDk4MzksIDB4Njg0QywgMHg4MjMzLAorICAgIDB4OTkzMCwgMHg5OTM5LCAweDY4NTYsIDB4ODIzMywgMHg5QTMwLCAweDlBMzksIDB4Njg2MCwgMHg4MjMzLCAweDlCMzAsCisgICAgMHg5QjM5LCAweDY4NkEsIDB4ODIzMywgMHg5QzMwLCAweDlDMzksIDB4Njg3NCwgMHg4MjMzLCAweDlEMzAsIDB4OUQzOSwKKyAgICAweDY4N0UsIDB4ODIzMywgMHg5RTMwLCAweDlFMzksIDB4Njg4OCwgMHg4MjMzLCAweDlGMzAsIDB4OUYzOSwgMHg2ODkyLAorICAgIDB4ODIzMywgMHhBMDMwLCAweEEwMzksIDB4Njg5QywgMHg4MjMzLCAweEExMzAsIDB4QTEzOSwgMHg2OEE2LCAweDgyMzMsCisgICAgMHhBMjMwLCAweEEyMzksIDB4NjhCMCwgMHg4MjMzLCAweEEzMzAsIDB4QTMzOSwgMHg2OEJBLCAweDgyMzMsIDB4QTQzMCwKKyAgICAweEE0MzksIDB4NjhDNCwgMHg4MjMzLCAweEE1MzAsIDB4QTUzOSwgMHg2OENFLCAweDgyMzMsIDB4QTYzMCwgMHhBNjM5LAorICAgIDB4NjhEOCwgMHg4MjMzLCAweEE3MzAsIDB4QTczOSwgMHg2OEUyLCAweDgyMzMsIDB4QTgzMCwgMHhBODM5LCAweDY4RUMsCisgICAgMHg4MjMzLCAweEE5MzAsIDB4QTkzOSwgMHg2OEY2LCAweDgyMzMsIDB4QUEzMCwgMHhBQTM5LCAweDY5MDAsIDB4ODIzMywKKyAgICAweEFCMzAsIDB4QUIzOSwgMHg2OTBBLCAweDgyMzMsIDB4QUMzMCwgMHhBQzM5LCAweDY5MTQsIDB4ODIzMywgMHhBRDMwLAorICAgIDB4QUQzOSwgMHg2OTFFLCAweDgyMzMsIDB4QUUzMCwgMHhBRTM5LCAweDY5MjgsIDB4ODIzMywgMHhBRjMwLCAweEFGMzksCisgICAgMHg2OTMyLCAweDgyMzMsIDB4QjAzMCwgMHhCMDM5LCAweDY5M0MsIDB4ODIzMywgMHhCMTMwLCAweEIxMzksIDB4Njk0NiwKKyAgICAweDgyMzMsIDB4QjIzMCwgMHhCMjM5LCAweDY5NTAsIDB4ODIzMywgMHhCMzMwLCAweEIzMzksIDB4Njk1QSwgMHg4MjMzLAorICAgIDB4QjQzMCwgMHhCNDM5LCAweDY5NjQsIDB4ODIzMywgMHhCNTMwLCAweEI1MzksIDB4Njk2RSwgMHg4MjMzLCAweEI2MzAsCisgICAgMHhCNjM5LCAweDY5NzgsIDB4ODIzMywgMHhCNzMwLCAweEI3MzksIDB4Njk4MiwgMHg4MjMzLCAweEI4MzAsIDB4QjgzOSwKKyAgICAweDY5OEMsIDB4ODIzMywgMHhCOTMwLCAweEI5MzksIDB4Njk5NiwgMHg4MjMzLCAweEJBMzAsIDB4QkEzOSwgMHg2OUEwLAorICAgIDB4ODIzMywgMHhCQjMwLCAweEJCMzksIDB4NjlBQSwgMHg4MjMzLCAweEJDMzAsIDB4QkMzOSwgMHg2OUI0LCAweDgyMzMsCisgICAgMHhCRDMwLCAweEJEMzksIDB4NjlCRSwgMHg4MjMzLCAweEJFMzAsIDB4QkUzOSwgMHg2OUM4LCAweDgyMzMsIDB4QkYzMCwKKyAgICAweEJGMzksIDB4NjlEMiwgMHg4MjMzLCAweEMwMzAsIDB4QzAzOSwgMHg2OURDLCAweDgyMzMsIDB4QzEzMCwgMHhDMTM5LAorICAgIDB4NjlFNiwgMHg4MjMzLCAweEMyMzAsIDB4QzIzOSwgMHg2OUYwLCAweDgyMzMsIDB4QzMzMCwgMHhDMzM5LCAweDY5RkEsCisgICAgMHg4MjMzLCAweEM0MzAsIDB4QzQzOSwgMHg2QTA0LCAweDgyMzMsIDB4QzUzMCwgMHhDNTM5LCAweDZBMEUsIDB4ODIzMywKKyAgICAweEM2MzAsIDB4QzYzOSwgMHg2QTE4LCAweDgyMzMsIDB4QzczMCwgMHhDNzM5LCAweDZBMjIsIDB4ODIzMywgMHhDODMwLAorICAgIDB4QzgzOSwgMHg2QTJDLCAweDgyMzMsIDB4QzkzMCwgMHhDOTM5LCAweDZBMzYsIDB4ODIzMywgMHhDQTMwLCAweENBMzksCisgICAgMHg2QTQwLCAweDgyMzMsIDB4Q0IzMCwgMHhDQjM5LCAweDZBNEEsIDB4ODIzMywgMHhDQzMwLCAweENDMzksIDB4NkE1NCwKKyAgICAweDgyMzMsIDB4Q0QzMCwgMHhDRDM5LCAweDZBNUUsIDB4ODIzMywgMHhDRTMwLCAweENFMzksIDB4NkE2OCwgMHg4MjMzLAorICAgIDB4Q0YzMCwgMHhDRjM5LCAweDZBNzIsIDB4ODIzMywgMHhEMDMwLCAweEQwMzksIDB4NkE3QywgMHg4MjMzLCAweEQxMzAsCisgICAgMHhEMTM5LCAweDZBODYsIDB4ODIzMywgMHhEMjMwLCAweEQyMzksIDB4NkE5MCwgMHg4MjMzLCAweEQzMzAsIDB4RDMzOSwKKyAgICAweDZBOUEsIDB4ODIzMywgMHhENDMwLCAweEQ0MzksIDB4NkFBNCwgMHg4MjMzLCAweEQ1MzAsIDB4RDUzOSwgMHg2QUFFLAorICAgIDB4ODIzMywgMHhENjMwLCAweEQ2MzksIDB4NkFCOCwgMHg4MjMzLCAweEQ3MzAsIDB4RDczOSwgMHg2QUMyLCAweDgyMzMsCisgICAgMHhEODMwLCAweEQ4MzksIDB4NkFDQywgMHg4MjMzLCAweEQ5MzAsIDB4RDkzOSwgMHg2QUQ2LCAweDgyMzMsIDB4REEzMCwKKyAgICAweERBMzksIDB4NkFFMCwgMHg4MjMzLCAweERCMzAsIDB4REIzOSwgMHg2QUVBLCAweDgyMzMsIDB4REMzMCwgMHhEQzM5LAorICAgIDB4NkFGNCwgMHg4MjMzLCAweEREMzAsIDB4REQzOSwgMHg2QUZFLCAweDgyMzMsIDB4REUzMCwgMHhERTM5LCAweDZCMDgsCisgICAgMHg4MjMzLCAweERGMzAsIDB4REYzOSwgMHg2QjEyLCAweDgyMzMsIDB4RTAzMCwgMHhFMDM5LCAweDZCMUMsIDB4ODIzMywKKyAgICAweEUxMzAsIDB4RTEzOSwgMHg2QjI2LCAweDgyMzMsIDB4RTIzMCwgMHhFMjM5LCAweDZCMzAsIDB4ODIzMywgMHhFMzMwLAorICAgIDB4RTMzOSwgMHg2QjNBLCAweDgyMzMsIDB4RTQzMCwgMHhFNDM5LCAweDZCNDQsIDB4ODIzMywgMHhFNTMwLCAweEU1MzksCisgICAgMHg2QjRFLCAweDgyMzMsIDB4RTYzMCwgMHhFNjM5LCAweDZCNTgsIDB4ODIzMywgMHhFNzMwLCAweEU3MzksIDB4NkI2MiwKKyAgICAweDgyMzMsIDB4RTgzMCwgMHhFODM5LCAweDZCNkMsIDB4ODIzMywgMHhFOTMwLCAweEU5MzksIDB4NkI3NiwgMHg4MjMzLAorICAgIDB4RUEzMCwgMHhFQTM5LCAweDZCODAsIDB4ODIzMywgMHhFQjMwLCAweEVCMzksIDB4NkI4QSwgMHg4MjMzLCAweEVDMzAsCisgICAgMHhFQzM5LCAweDZCOTQsIDB4ODIzMywgMHhFRDMwLCAweEVEMzksIDB4NkI5RSwgMHg4MjMzLCAweEVFMzAsIDB4RUUzOSwKKyAgICAweDZCQTgsIDB4ODIzMywgMHhFRjMwLCAweEVGMzksIDB4NkJCMiwgMHg4MjMzLCAweEYwMzAsIDB4RjAzOSwgMHg2QkJDLAorICAgIDB4ODIzMywgMHhGMTMwLCAweEYxMzksIDB4NkJDNiwgMHg4MjMzLCAweEYyMzAsIDB4RjIzOSwgMHg2QkQwLCAweDgyMzMsCisgICAgMHhGMzMwLCAweEYzMzksIDB4NkJEQSwgMHg4MjMzLCAweEY0MzAsIDB4RjQzOSwgMHg2QkU0LCAweDgyMzMsIDB4RjUzMCwKKyAgICAweEY1MzksIDB4NkJFRSwgMHg4MjMzLCAweEY2MzAsIDB4RjYzOSwgMHg2QkY4LCAweDgyMzMsIDB4RjczMCwgMHhGNzM5LAorICAgIDB4NkMwMiwgMHg4MjMzLCAweEY4MzAsIDB4RjgzOSwgMHg2QzBDLCAweDgyMzMsIDB4RjkzMCwgMHhGOTM5LCAweDZDMTYsCisgICAgMHg4MjMzLCAweEZBMzAsIDB4RkEzOSwgMHg2QzIwLCAweDgyMzMsIDB4RkIzMCwgMHhGQjM5LCAweDZDMkEsIDB4ODIzMywKKyAgICAweEZDMzAsIDB4RkMzOSwgMHg2QzM0LCAweDgyMzMsIDB4RkQzMCwgMHhGRDM5LCAweDZDM0UsIDB4ODIzMywgMHhGRTMwLAorICAgIDB4RkUzOSwgMHg2QzQ4LCAweDgyMzQsIDB4ODEzMCwgMHg4MTM5LCAweDZDNTIsIDB4ODIzNCwgMHg4MjMwLCAweDgyMzksCisgICAgMHg2QzVDLCAweDgyMzQsIDB4ODMzMCwgMHg4MzM5LCAweDZDNjYsIDB4ODIzNCwgMHg4NDMwLCAweDg0MzksIDB4NkM3MCwKKyAgICAweDgyMzQsIDB4ODUzMCwgMHg4NTM5LCAweDZDN0EsIDB4ODIzNCwgMHg4NjMwLCAweDg2MzksIDB4NkM4NCwgMHg4MjM0LAorICAgIDB4ODczMCwgMHg4NzM5LCAweDZDOEUsIDB4ODIzNCwgMHg4ODMwLCAweDg4MzksIDB4NkM5OCwgMHg4MjM0LCAweDg5MzAsCisgICAgMHg4OTM5LCAweDZDQTIsIDB4ODIzNCwgMHg4QTMwLCAweDhBMzksIDB4NkNBQywgMHg4MjM0LCAweDhCMzAsIDB4OEIzOSwKKyAgICAweDZDQjYsIDB4ODIzNCwgMHg4QzMwLCAweDhDMzksIDB4NkNDMCwgMHg4MjM0LCAweDhEMzAsIDB4OEQzOSwgMHg2Q0NBLAorICAgIDB4ODIzNCwgMHg4RTMwLCAweDhFMzksIDB4NkNENCwgMHg4MjM0LCAweDhGMzAsIDB4OEYzOSwgMHg2Q0RFLCAweDgyMzQsCisgICAgMHg5MDMwLCAweDkwMzksIDB4NkNFOCwgMHg4MjM0LCAweDkxMzAsIDB4OTEzOSwgMHg2Q0YyLCAweDgyMzQsIDB4OTIzMCwKKyAgICAweDkyMzksIDB4NkNGQywgMHg4MjM0LCAweDkzMzAsIDB4OTMzOSwgMHg2RDA2LCAweDgyMzQsIDB4OTQzMCwgMHg5NDM5LAorICAgIDB4NkQxMCwgMHg4MjM0LCAweDk1MzAsIDB4OTUzOSwgMHg2RDFBLCAweDgyMzQsIDB4OTYzMCwgMHg5NjM5LCAweDZEMjQsCisgICAgMHg4MjM0LCAweDk3MzAsIDB4OTczOSwgMHg2RDJFLCAweDgyMzQsIDB4OTgzMCwgMHg5ODM5LCAweDZEMzgsIDB4ODIzNCwKKyAgICAweDk5MzAsIDB4OTkzOSwgMHg2RDQyLCAweDgyMzQsIDB4OUEzMCwgMHg5QTM5LCAweDZENEMsIDB4ODIzNCwgMHg5QjMwLAorICAgIDB4OUIzOSwgMHg2RDU2LCAweDgyMzQsIDB4OUMzMCwgMHg5QzM5LCAweDZENjAsIDB4ODIzNCwgMHg5RDMwLCAweDlEMzksCisgICAgMHg2RDZBLCAweDgyMzQsIDB4OUUzMCwgMHg5RTM5LCAweDZENzQsIDB4ODIzNCwgMHg5RjMwLCAweDlGMzksIDB4NkQ3RSwKKyAgICAweDgyMzQsIDB4QTAzMCwgMHhBMDM5LCAweDZEODgsIDB4ODIzNCwgMHhBMTMwLCAweEExMzksIDB4NkQ5MiwgMHg4MjM0LAorICAgIDB4QTIzMCwgMHhBMjM5LCAweDZEOUMsIDB4ODIzNCwgMHhBMzMwLCAweEEzMzksIDB4NkRBNiwgMHg4MjM0LCAweEE0MzAsCisgICAgMHhBNDM5LCAweDZEQjAsIDB4ODIzNCwgMHhBNTMwLCAweEE1MzksIDB4NkRCQSwgMHg4MjM0LCAweEE2MzAsIDB4QTYzOSwKKyAgICAweDZEQzQsIDB4ODIzNCwgMHhBNzMwLCAweEE3MzksIDB4NkRDRSwgMHg4MjM0LCAweEE4MzAsIDB4QTgzOSwgMHg2REQ4LAorICAgIDB4ODIzNCwgMHhBOTMwLCAweEE5MzksIDB4NkRFMiwgMHg4MjM0LCAweEFBMzAsIDB4QUEzOSwgMHg2REVDLCAweDgyMzQsCisgICAgMHhBQjMwLCAweEFCMzksIDB4NkRGNiwgMHg4MjM0LCAweEFDMzAsIDB4QUMzOSwgMHg2RTAwLCAweDgyMzQsIDB4QUQzMCwKKyAgICAweEFEMzksIDB4NkUwQSwgMHg4MjM0LCAweEFFMzAsIDB4QUUzOSwgMHg2RTE0LCAweDgyMzQsIDB4QUYzMCwgMHhBRjM5LAorICAgIDB4NkUxRSwgMHg4MjM0LCAweEIwMzAsIDB4QjAzOSwgMHg2RTI4LCAweDgyMzQsIDB4QjEzMCwgMHhCMTM5LCAweDZFMzIsCisgICAgMHg4MjM0LCAweEIyMzAsIDB4QjIzOSwgMHg2RTNDLCAweDgyMzQsIDB4QjMzMCwgMHhCMzM5LCAweDZFNDYsIDB4ODIzNCwKKyAgICAweEI0MzAsIDB4QjQzOSwgMHg2RTUwLCAweDgyMzQsIDB4QjUzMCwgMHhCNTM5LCAweDZFNUEsIDB4ODIzNCwgMHhCNjMwLAorICAgIDB4QjYzOSwgMHg2RTY0LCAweDgyMzQsIDB4QjczMCwgMHhCNzM5LCAweDZFNkUsIDB4ODIzNCwgMHhCODMwLCAweEI4MzksCisgICAgMHg2RTc4LCAweDgyMzQsIDB4QjkzMCwgMHhCOTM5LCAweDZFODIsIDB4ODIzNCwgMHhCQTMwLCAweEJBMzksIDB4NkU4QywKKyAgICAweDgyMzQsIDB4QkIzMCwgMHhCQjM5LCAweDZFOTYsIDB4ODIzNCwgMHhCQzMwLCAweEJDMzksIDB4NkVBMCwgMHg4MjM0LAorICAgIDB4QkQzMCwgMHhCRDM5LCAweDZFQUEsIDB4ODIzNCwgMHhCRTMwLCAweEJFMzksIDB4NkVCNCwgMHg4MjM0LCAweEJGMzAsCisgICAgMHhCRjM5LCAweDZFQkUsIDB4ODIzNCwgMHhDMDMwLCAweEMwMzksIDB4NkVDOCwgMHg4MjM0LCAweEMxMzAsIDB4QzEzOSwKKyAgICAweDZFRDIsIDB4ODIzNCwgMHhDMjMwLCAweEMyMzksIDB4NkVEQywgMHg4MjM0LCAweEMzMzAsIDB4QzMzOSwgMHg2RUU2LAorICAgIDB4ODIzNCwgMHhDNDMwLCAweEM0MzksIDB4NkVGMCwgMHg4MjM0LCAweEM1MzAsIDB4QzUzOSwgMHg2RUZBLCAweDgyMzQsCisgICAgMHhDNjMwLCAweEM2MzksIDB4NkYwNCwgMHg4MjM0LCAweEM3MzAsIDB4QzczOSwgMHg2RjBFLCAweDgyMzQsIDB4QzgzMCwKKyAgICAweEM4MzksIDB4NkYxOCwgMHg4MjM0LCAweEM5MzAsIDB4QzkzOSwgMHg2RjIyLCAweDgyMzQsIDB4Q0EzMCwgMHhDQTM5LAorICAgIDB4NkYyQywgMHg4MjM0LCAweENCMzAsIDB4Q0IzOSwgMHg2RjM2LCAweDgyMzQsIDB4Q0MzMCwgMHhDQzM5LCAweDZGNDAsCisgICAgMHg4MjM0LCAweENEMzAsIDB4Q0QzOSwgMHg2RjRBLCAweDgyMzQsIDB4Q0UzMCwgMHhDRTM5LCAweDZGNTQsIDB4ODIzNCwKKyAgICAweENGMzAsIDB4Q0YzOSwgMHg2RjVFLCAweDgyMzQsIDB4RDAzMCwgMHhEMDM5LCAweDZGNjgsIDB4ODIzNCwgMHhEMTMwLAorICAgIDB4RDEzOSwgMHg2RjcyLCAweDgyMzQsIDB4RDIzMCwgMHhEMjM5LCAweDZGN0MsIDB4ODIzNCwgMHhEMzMwLCAweEQzMzksCisgICAgMHg2Rjg2LCAweDgyMzQsIDB4RDQzMCwgMHhENDM5LCAweDZGOTAsIDB4ODIzNCwgMHhENTMwLCAweEQ1MzksIDB4NkY5QSwKKyAgICAweDgyMzQsIDB4RDYzMCwgMHhENjM5LCAweDZGQTQsIDB4ODIzNCwgMHhENzMwLCAweEQ3MzksIDB4NkZBRSwgMHg4MjM0LAorICAgIDB4RDgzMCwgMHhEODM5LCAweDZGQjgsIDB4ODIzNCwgMHhEOTMwLCAweEQ5MzksIDB4NkZDMiwgMHg4MjM0LCAweERBMzAsCisgICAgMHhEQTM5LCAweDZGQ0MsIDB4ODIzNCwgMHhEQjMwLCAweERCMzksIDB4NkZENiwgMHg4MjM0LCAweERDMzAsIDB4REMzOSwKKyAgICAweDZGRTAsIDB4ODIzNCwgMHhERDMwLCAweEREMzksIDB4NkZFQSwgMHg4MjM0LCAweERFMzAsIDB4REUzOSwgMHg2RkY0LAorICAgIDB4ODIzNCwgMHhERjMwLCAweERGMzksIDB4NkZGRSwgMHg4MjM0LCAweEUwMzAsIDB4RTAzOSwgMHg3MDA4LCAweDgyMzQsCisgICAgMHhFMTMwLCAweEUxMzksIDB4NzAxMiwgMHg4MjM0LCAweEUyMzAsIDB4RTIzOSwgMHg3MDFDLCAweDgyMzQsIDB4RTMzMCwKKyAgICAweEUzMzksIDB4NzAyNiwgMHg4MjM0LCAweEU0MzAsIDB4RTQzOSwgMHg3MDMwLCAweDgyMzQsIDB4RTUzMCwgMHhFNTM5LAorICAgIDB4NzAzQSwgMHg4MjM0LCAweEU2MzAsIDB4RTYzOSwgMHg3MDQ0LCAweDgyMzQsIDB4RTczMCwgMHhFNzM5LCAweDcwNEUsCisgICAgMHg4MjM0LCAweEU4MzAsIDB4RTgzOSwgMHg3MDU4LCAweDgyMzQsIDB4RTkzMCwgMHhFOTM5LCAweDcwNjIsIDB4ODIzNCwKKyAgICAweEVBMzAsIDB4RUEzOSwgMHg3MDZDLCAweDgyMzQsIDB4RUIzMCwgMHhFQjM5LCAweDcwNzYsIDB4ODIzNCwgMHhFQzMwLAorICAgIDB4RUMzOSwgMHg3MDgwLCAweDgyMzQsIDB4RUQzMCwgMHhFRDM5LCAweDcwOEEsIDB4ODIzNCwgMHhFRTMwLCAweEVFMzksCisgICAgMHg3MDk0LCAweDgyMzQsIDB4RUYzMCwgMHhFRjM5LCAweDcwOUUsIDB4ODIzNCwgMHhGMDMwLCAweEYwMzksIDB4NzBBOCwKKyAgICAweDgyMzQsIDB4RjEzMCwgMHhGMTM5LCAweDcwQjIsIDB4ODIzNCwgMHhGMjMwLCAweEYyMzksIDB4NzBCQywgMHg4MjM0LAorICAgIDB4RjMzMCwgMHhGMzM5LCAweDcwQzYsIDB4ODIzNCwgMHhGNDMwLCAweEY0MzksIDB4NzBEMCwgMHg4MjM0LCAweEY1MzAsCisgICAgMHhGNTM5LCAweDcwREEsIDB4ODIzNCwgMHhGNjMwLCAweEY2MzksIDB4NzBFNCwgMHg4MjM0LCAweEY3MzAsIDB4RjczOSwKKyAgICAweDcwRUUsIDB4ODIzNCwgMHhGODMwLCAweEY4MzksIDB4NzBGOCwgMHg4MjM0LCAweEY5MzAsIDB4RjkzOSwgMHg3MTAyLAorICAgIDB4ODIzNCwgMHhGQTMwLCAweEZBMzksIDB4NzEwQywgMHg4MjM0LCAweEZCMzAsIDB4RkIzOSwgMHg3MTE2LCAweDgyMzQsCisgICAgMHhGQzMwLCAweEZDMzksIDB4NzEyMCwgMHg4MjM0LCAweEZEMzAsIDB4RkQzOSwgMHg3MTJBLCAweDgyMzQsIDB4RkUzMCwKKyAgICAweEZFMzksIDB4NzEzNCwgMHg4MjM1LCAweDgxMzAsIDB4ODEzOSwgMHg3MTNFLCAweDgyMzUsIDB4ODIzMCwgMHg4MjM5LAorICAgIDB4NzE0OCwgMHg4MjM1LCAweDgzMzAsIDB4ODMzOSwgMHg3MTUyLCAweDgyMzUsIDB4ODQzMCwgMHg4NDM5LCAweDcxNUMsCisgICAgMHg4MjM1LCAweDg1MzAsIDB4ODUzOSwgMHg3MTY2LCAweDgyMzUsIDB4ODYzMCwgMHg4NjM5LCAweDcxNzAsIDB4ODIzNSwKKyAgICAweDg3MzAsIDB4ODczOCwgMHg3MTdBLCAweDgyMzUsIDB4OTgzMywgMHg5ODM5LCAweDcxODgsIDB4ODIzNSwgMHg5OTMwLAorICAgIDB4OTkzOSwgMHg3MThGLCAweDgyMzUsIDB4OUEzMCwgMHg5QTM5LCAweDcxOTksIDB4ODIzNSwgMHg5QjMwLCAweDlCMzksCisgICAgMHg3MUEzLCAweDgyMzUsIDB4OUMzMCwgMHg5QzM5LCAweDcxQUQsIDB4ODIzNSwgMHg5RDMwLCAweDlEMzksIDB4NzFCNywKKyAgICAweDgyMzUsIDB4OUUzMCwgMHg5RTM5LCAweDcxQzEsIDB4ODIzNSwgMHg5RjMwLCAweDlGMzksIDB4NzFDQiwgMHg4MjM1LAorICAgIDB4QTAzMCwgMHhBMDM5LCAweDcxRDUsIDB4ODIzNSwgMHhBMTMwLCAweEExMzksIDB4NzFERiwgMHg4MjM1LCAweEEyMzAsCisgICAgMHhBMjM5LCAweDcxRTksIDB4ODIzNSwgMHhBMzMwLCAweEEzMzksIDB4NzFGMywgMHg4MjM1LCAweEE0MzAsIDB4QTQzOSwKKyAgICAweDcxRkQsIDB4ODIzNSwgMHhBNTMwLCAweEE1MzksIDB4NzIwNywgMHg4MjM1LCAweEE2MzAsIDB4QTYzOSwgMHg3MjExLAorICAgIDB4ODIzNSwgMHhBNzMwLCAweEE3MzksIDB4NzIxQiwgMHg4MjM1LCAweEE4MzAsIDB4QTgzOSwgMHg3MjI1LCAweDgyMzUsCisgICAgMHhBOTMwLCAweEE5MzksIDB4NzIyRiwgMHg4MjM1LCAweEFBMzAsIDB4QUEzOSwgMHg3MjM5LCAweDgyMzUsIDB4QUIzMCwKKyAgICAweEFCMzksIDB4NzI0MywgMHg4MjM1LCAweEFDMzAsIDB4QUMzOSwgMHg3MjRELCAweDgyMzUsIDB4QUQzMCwgMHhBRDM5LAorICAgIDB4NzI1NywgMHg4MjM1LCAweEFFMzAsIDB4QUUzOSwgMHg3MjYxLCAweDgyMzUsIDB4QUYzMCwgMHhBRjM5LCAweDcyNkIsCisgICAgMHg4MjM1LCAweEIwMzAsIDB4QjAzOSwgMHg3Mjc1LCAweDgyMzUsIDB4QjEzMCwgMHhCMTM5LCAweDcyN0YsIDB4ODIzNSwKKyAgICAweEIyMzAsIDB4QjIzOSwgMHg3Mjg5LCAweDgyMzUsIDB4QjMzMCwgMHhCMzM5LCAweDcyOTMsIDB4ODIzNSwgMHhCNDMwLAorICAgIDB4QjQzOSwgMHg3MjlELCAweDgyMzUsIDB4QjUzMCwgMHhCNTM5LCAweDcyQTcsIDB4ODIzNSwgMHhCNjMwLCAweEI2MzksCisgICAgMHg3MkIxLCAweDgyMzUsIDB4QjczMCwgMHhCNzM5LCAweDcyQkIsIDB4ODIzNSwgMHhCODMwLCAweEI4MzksIDB4NzJDNSwKKyAgICAweDgyMzUsIDB4QjkzMCwgMHhCOTM5LCAweDcyQ0YsIDB4ODIzNSwgMHhCQTMwLCAweEJBMzksIDB4NzJEOSwgMHg4MjM1LAorICAgIDB4QkIzMCwgMHhCQjM5LCAweDcyRTMsIDB4ODIzNSwgMHhCQzMwLCAweEJDMzksIDB4NzJFRCwgMHg4MjM1LCAweEJEMzAsCisgICAgMHhCRDM5LCAweDcyRjcsIDB4ODIzNSwgMHhCRTMwLCAweEJFMzksIDB4NzMwMSwgMHg4MjM1LCAweEJGMzAsIDB4QkYzOSwKKyAgICAweDczMEIsIDB4ODIzNSwgMHhDMDMwLCAweEMwMzksIDB4NzMxNSwgMHg4MjM1LCAweEMxMzAsIDB4QzEzOSwgMHg3MzFGLAorICAgIDB4ODIzNSwgMHhDMjMwLCAweEMyMzksIDB4NzMyOSwgMHg4MjM1LCAweEMzMzAsIDB4QzMzOSwgMHg3MzMzLCAweDgyMzUsCisgICAgMHhDNDMwLCAweEM0MzksIDB4NzMzRCwgMHg4MjM1LCAweEM1MzAsIDB4QzUzOSwgMHg3MzQ3LCAweDgyMzUsIDB4QzYzMCwKKyAgICAweEM2MzksIDB4NzM1MSwgMHg4MjM1LCAweEM3MzAsIDB4QzczOSwgMHg3MzVCLCAweDgyMzUsIDB4QzgzMCwgMHhDODM5LAorICAgIDB4NzM2NSwgMHg4MjM1LCAweEM5MzAsIDB4QzkzOSwgMHg3MzZGLCAweDgyMzUsIDB4Q0EzMCwgMHhDQTM5LCAweDczNzksCisgICAgMHg4MjM1LCAweENCMzAsIDB4Q0IzOSwgMHg3MzgzLCAweDgyMzUsIDB4Q0MzMCwgMHhDQzM5LCAweDczOEQsIDB4ODIzNSwKKyAgICAweENEMzAsIDB4Q0QzOSwgMHg3Mzk3LCAweDgyMzUsIDB4Q0UzMCwgMHhDRTM5LCAweDczQTEsIDB4ODIzNSwgMHhDRjMwLAorICAgIDB4Q0YzOSwgMHg3M0FCLCAweDgyMzUsIDB4RDAzMCwgMHhEMDM5LCAweDczQjUsIDB4ODIzNSwgMHhEMTMwLCAweEQxMzksCisgICAgMHg3M0JGLCAweDgyMzUsIDB4RDIzMCwgMHhEMjM5LCAweDczQzksIDB4ODIzNSwgMHhEMzMwLCAweEQzMzksIDB4NzNEMywKKyAgICAweDgyMzUsIDB4RDQzMCwgMHhENDM5LCAweDczREQsIDB4ODIzNSwgMHhENTMwLCAweEQ1MzksIDB4NzNFNywgMHg4MjM1LAorICAgIDB4RDYzMCwgMHhENjM5LCAweDczRjEsIDB4ODIzNSwgMHhENzMwLCAweEQ3MzksIDB4NzNGQiwgMHg4MjM1LCAweEQ4MzAsCisgICAgMHhEODM5LCAweDc0MDUsIDB4ODIzNSwgMHhEOTMwLCAweEQ5MzksIDB4NzQwRiwgMHg4MjM1LCAweERBMzAsIDB4REEzOSwKKyAgICAweDc0MTksIDB4ODIzNSwgMHhEQjMwLCAweERCMzksIDB4NzQyMywgMHg4MjM1LCAweERDMzAsIDB4REMzOSwgMHg3NDJELAorICAgIDB4ODIzNSwgMHhERDMwLCAweEREMzksIDB4NzQzNywgMHg4MjM1LCAweERFMzAsIDB4REUzOSwgMHg3NDQxLCAweDgyMzUsCisgICAgMHhERjMwLCAweERGMzksIDB4NzQ0QiwgMHg4MjM1LCAweEUwMzAsIDB4RTAzOSwgMHg3NDU1LCAweDgyMzUsIDB4RTEzMCwKKyAgICAweEUxMzksIDB4NzQ1RiwgMHg4MjM1LCAweEUyMzAsIDB4RTIzOSwgMHg3NDY5LCAweDgyMzUsIDB4RTMzMCwgMHhFMzM5LAorICAgIDB4NzQ3MywgMHg4MjM1LCAweEU0MzAsIDB4RTQzOSwgMHg3NDdELCAweDgyMzUsIDB4RTUzMCwgMHhFNTM5LCAweDc0ODcsCisgICAgMHg4MjM1LCAweEU2MzAsIDB4RTYzOSwgMHg3NDkxLCAweDgyMzUsIDB4RTczMCwgMHhFNzM5LCAweDc0OUIsIDB4ODIzNSwKKyAgICAweEU4MzAsIDB4RTgzOSwgMHg3NEE1LCAweDgyMzUsIDB4RTkzMCwgMHhFOTM5LCAweDc0QUYsIDB4ODIzNSwgMHhFQTMwLAorICAgIDB4RUEzOSwgMHg3NEI5LCAweDgyMzUsIDB4RUIzMCwgMHhFQjM5LCAweDc0QzMsIDB4ODIzNSwgMHhFQzMwLCAweEVDMzksCisgICAgMHg3NENELCAweDgyMzUsIDB4RUQzMCwgMHhFRDM5LCAweDc0RDcsIDB4ODIzNSwgMHhFRTMwLCAweEVFMzksIDB4NzRFMSwKKyAgICAweDgyMzUsIDB4RUYzMCwgMHhFRjM5LCAweDc0RUIsIDB4ODIzNSwgMHhGMDMwLCAweEYwMzksIDB4NzRGNSwgMHg4MjM1LAorICAgIDB4RjEzMCwgMHhGMTM5LCAweDc0RkYsIDB4ODIzNSwgMHhGMjMwLCAweEYyMzksIDB4NzUwOSwgMHg4MjM1LCAweEYzMzAsCisgICAgMHhGMzM5LCAweDc1MTMsIDB4ODIzNSwgMHhGNDMwLCAweEY0MzksIDB4NzUxRCwgMHg4MjM1LCAweEY1MzAsIDB4RjUzOSwKKyAgICAweDc1MjcsIDB4ODIzNSwgMHhGNjMwLCAweEY2MzksIDB4NzUzMSwgMHg4MjM1LCAweEY3MzAsIDB4RjczOSwgMHg3NTNCLAorICAgIDB4ODIzNSwgMHhGODMwLCAweEY4MzksIDB4NzU0NSwgMHg4MjM1LCAweEY5MzAsIDB4RjkzOSwgMHg3NTRGLCAweDgyMzUsCisgICAgMHhGQTMwLCAweEZBMzksIDB4NzU1OSwgMHg4MjM1LCAweEZCMzAsIDB4RkIzOSwgMHg3NTYzLCAweDgyMzUsIDB4RkMzMCwKKyAgICAweEZDMzksIDB4NzU2RCwgMHg4MjM1LCAweEZEMzAsIDB4RkQzOSwgMHg3NTc3LCAweDgyMzUsIDB4RkUzMCwgMHhGRTM5LAorICAgIDB4NzU4MSwgMHg4MjM2LCAweDgxMzAsIDB4ODEzOSwgMHg3NThCLCAweDgyMzYsIDB4ODIzMCwgMHg4MjM5LCAweDc1OTUsCisgICAgMHg4MjM2LCAweDgzMzAsIDB4ODMzOSwgMHg3NTlGLCAweDgyMzYsIDB4ODQzMCwgMHg4NDM5LCAweDc1QTksIDB4ODIzNiwKKyAgICAweDg1MzAsIDB4ODUzOSwgMHg3NUIzLCAweDgyMzYsIDB4ODYzMCwgMHg4NjM5LCAweDc1QkQsIDB4ODIzNiwgMHg4NzMwLAorICAgIDB4ODczOSwgMHg3NUM3LCAweDgyMzYsIDB4ODgzMCwgMHg4ODM5LCAweDc1RDEsIDB4ODIzNiwgMHg4OTMwLCAweDg5MzksCisgICAgMHg3NURCLCAweDgyMzYsIDB4OEEzMCwgMHg4QTM5LCAweDc1RTUsIDB4ODIzNiwgMHg4QjMwLCAweDhCMzksIDB4NzVFRiwKKyAgICAweDgyMzYsIDB4OEMzMCwgMHg4QzM5LCAweDc1RjksIDB4ODIzNiwgMHg4RDMwLCAweDhEMzksIDB4NzYwMywgMHg4MjM2LAorICAgIDB4OEUzMCwgMHg4RTM3LCAweDc2MEQsIDB4ODIzNiwgMHg4RjMxLCAweDhGMzksIDB4NzYxNSwgMHg4MjM2LCAweDkwMzAsCisgICAgMHg5MDM5LCAweDc2MUUsIDB4ODIzNiwgMHg5MTMwLCAweDkxMzksIDB4NzYyOCwgMHg4MjM2LCAweDkyMzAsIDB4OTIzOSwKKyAgICAweDc2MzIsIDB4ODIzNiwgMHg5MzMwLCAweDkzMzksIDB4NzYzQywgMHg4MjM2LCAweDk0MzAsIDB4OTQzNSwgMHg3NjQ2LAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvY21hcHNfZ2IxLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvY21hcHNfZ2IxLmNwcAppbmRleCAyNmQ0Y2Q2Li5iZjc5Y2VkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL2NtYXBzX2diMS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9jbWFwc19nYjEuY3BwCkBAIC0xMiwyNyArMTIsNDMgQEAKICNpbmNsdWRlICJjbWFwc19nYjEuaCIKIAogc3RhdGljIGNvbnN0IEZYQ01BUF9DTWFwIGdfRlhDTUFQX0dCMV9jbWFwc1tdID0gewotICAgIHsgIkdCLUVVQy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQl9FVUNfSF8wLCA5MCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJHQi1FVUMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JfRVVDX1ZfMCwgMjAsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIkdCcGMtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCcGNfRVVDX0hfMCwgOTEsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwIH0sCi0gICAgeyAiR0JwYy1FVUMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JwY19FVUNfVl8wLCAyMCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiR0JLLUVVQy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQktfRVVDX0hfMiwgNDA3MSwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJHQkstRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCS19FVUNfVl8yLCAyMCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiR0JLcC1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JLcF9FVUNfSF8yLCA0MDcwLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTIgfSwKLSAgICB7ICJHQktwLUVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQktwX0VVQ19WXzIsIDIwLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJHQksySy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQksyS19IXzUsIDQwNzEsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX0dCSzJLX0hfNV9EV29yZCwgMTAxNywgLTQgfSwKLSAgICB7ICJHQksySy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQksyS19WXzUsIDQxLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJVbmlHQi1VQ1MyLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUdCX1VDUzJfSF80LCAxMzgyNSwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJVbmlHQi1VQ1MyLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUdCX1VDUzJfVl80LCAyNCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiVW5pR0ItVVRGMTYtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pR0JfVUNTMl9IXzQsIDEzODI1LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIlVuaUdCLVVURjE2LVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUdCX1VDUzJfVl80LCAyNCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCisgICAgeyJHQi1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JfRVVDX0hfMCwgOTAsIEZYQ01BUF9DTWFwOjpOb25lLAorICAgICBOVUxMLCAwLCAwfSwKKyAgICB7IkdCLUVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQl9FVUNfVl8wLCAyMCwgRlhDTUFQX0NNYXA6Ok5vbmUsCisgICAgIE5VTEwsIDAsIC0xfSwKKyAgICB7IkdCcGMtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCcGNfRVVDX0hfMCwgOTEsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IkdCcGMtRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCcGNfRVVDX1ZfMCwgMjAsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJHQkstRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCS19FVUNfSF8yLCA0MDcxLAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMH0sCisgICAgeyJHQkstRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCS19FVUNfVl8yLCAyMCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IkdCS3AtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCS3BfRVVDX0hfMiwgNDA3MCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0yfSwKKyAgICB7IkdCS3AtRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCS3BfRVVDX1ZfMiwgMjAsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJHQksySy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQksyS19IXzUsIDQwNzEsCisgICAgIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX0dCSzJLX0hfNV9EV29yZCwgMTAxNywgLTR9LAorICAgIHsiR0JLMkstViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JLMktfVl81LCA0MSwgRlhDTUFQX0NNYXA6Ok5vbmUsCisgICAgIE5VTEwsIDAsIC0xfSwKKyAgICB7IlVuaUdCLVVDUzItSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pR0JfVUNTMl9IXzQsIDEzODI1LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMH0sCisgICAgeyJVbmlHQi1VQ1MyLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUdCX1VDUzJfVl80LCAyNCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IlVuaUdCLVVURjE2LUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUdCX1VDUzJfSF80LCAxMzgyNSwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDB9LAorICAgIHsiVW5pR0ItVVRGMTYtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pR0JfVUNTMl9WXzQsIDI0LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAogfTsKIAotdm9pZCBDUERGX01vZHVsZU1ncjo6TG9hZEVtYmVkZGVkR0IxQ01hcHMoKQotewotICAgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOwotICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9HQjFdLm1fcE1hcExpc3QgPSBnX0ZYQ01BUF9HQjFfY21hcHM7Ci0gICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0dCMV0ubV9Db3VudCA9IEZYX0FycmF5U2l6ZShnX0ZYQ01BUF9HQjFfY21hcHMpOwotICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0dCMV0ubV9wTWFwID0gZ19GWENNQVBfR0IxQ0lEMlVuaWNvZGVfNTsKLSAgICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9HQjFdLm1fQ291bnQgPSAzMDI4NDsKK3ZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkxvYWRFbWJlZGRlZEdCMUNNYXBzKCkgeworICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPQorICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9HQjFdLm1fcE1hcExpc3QgPSBnX0ZYQ01BUF9HQjFfY21hcHM7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9HQjFdLm1fQ291bnQgPQorICAgICAgRlhfQXJyYXlTaXplKGdfRlhDTUFQX0dCMV9jbWFwcyk7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0dCMV0ubV9wTWFwID0KKyAgICAgIGdfRlhDTUFQX0dCMUNJRDJVbmljb2RlXzU7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0dCMV0ubV9Db3VudCA9IDMwMjg0OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9BZG9iZS1KYXBhbjEtVUNTMl80LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvQWRvYmUtSmFwYW4xLVVDUzJfNC5jcHAKaW5kZXggOTRlMmNkMi4uZDZkYWRkNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9BZG9iZS1KYXBhbjEtVUNTMl80LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0Fkb2JlLUphcGFuMS1VQ1MyXzQuY3BwCkBAIC03LDE5MzUgKzcsMTcyMCBAQAogI2luY2x1ZGUgImNtYXBzX2phcGFuMS5oIgogCiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0phcGFuMUNJRDJVbmljb2RlXzRbMTU0NDRdID0gewotICAgIDB4RkZGRCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LAotICAgIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLAotICAgIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LAotICAgIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLAotICAgIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LAotICAgIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLAotICAgIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LAotICAgIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwQTUsIDB4MDA1RCwgMHgwMDVFLAotICAgIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LAotICAgIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLAotICAgIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LAotICAgIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwQTYsIDB4MDA3RCwgMHgwMzAzLAotICAgIDB4MDJCQywgMHgwMDVDLCAweDAyQkIsIDB4MDA3QywgMHgwMDdFLCAweDAwQTEsIDB4MDBBMiwgMHgwMEEzLAotICAgIDB4MjA0NCwgMHgwMTkyLCAweDAwQTcsIDB4MDBBNCwgMHgyMDFDLCAweDAwQUIsIDB4MjAzOSwgMHgyMDNBLAotICAgIDB4RkIwMSwgMHhGQjAyLCAweDIwMTIsIDB4MjAyMCwgMHgyMDIxLCAweDAwQjcsIDB4MDBCNiwgMHgyMDIyLAotICAgIDB4MjAxQSwgMHgyMDFFLCAweDIwMUQsIDB4MDBCQiwgMHgyMDI2LCAweDIwMzAsIDB4MDBCRiwgMHgwMzAxLAotICAgIDB4MDMwMiwgMHgwMEFGLCAweDAzMDYsIDB4MDMwNywgMHgwMzA4LCAweDAzMEEsIDB4MDBCOCwgMHgwMzBCLAotICAgIDB4MDMyOCwgMHgwMzBDLCAweDAzMzYsIDB4MDBDNiwgMHgwMEFBLCAweDAxNDEsIDB4MDBEOCwgMHgwMTUyLAotICAgIDB4MDBCQSwgMHgwMEU2LCAweDAxMzEsIDB4MDE0MiwgMHgwMEY4LCAweDAxNTMsIDB4MDBERiwgMHgwMDJELAotICAgIDB4MDBBOSwgMHgwMEFDLCAweDAwQUUsIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI1LAotICAgIDB4MDBCOSwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEMwLCAweDAwQzEsIDB4MDBDMiwgMHgwMEMzLAotICAgIDB4MDBDNCwgMHgwMEM1LCAweDAwQzcsIDB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLAotICAgIDB4MDBDRCwgMHgwMENFLCAweDAwQ0YsIDB4MDBEMCwgMHgwMEQxLCAweDAwRDIsIDB4MDBEMywgMHgwMEQ0LAotICAgIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsIDB4MDBEOSwgMHgwMERBLCAweDAwREIsIDB4MDBEQywgMHgwMERELAotICAgIDB4MDBERSwgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLCAweDAwRTQsIDB4MDBFNSwgMHgwMEU3LAotICAgIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLCAweDAwRUQsIDB4MDBFRSwgMHgwMEVGLAotICAgIDB4MDBGMCwgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LAotICAgIDB4MDBGOSwgMHgwMEZBLCAweDAwRkIsIDB4MDBGQywgMHgwMEZELCAweDAwRkUsIDB4MDBGRiwgMHgwMTYwLAotICAgIDB4MDE3OCwgMHgwMTdELCAweDAzMDUsIDB4MDE2MSwgMHgyMTIyLCAweDAxN0UsIDB4MDAzMCwgMHgwMDIwLAotICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LAotICAgIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLAotICAgIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LAotICAgIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLAotICAgIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LAotICAgIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLAotICAgIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LAotICAgIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDBBNSwgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLAotICAgIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LAotICAgIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLAotICAgIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LAotICAgIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDIwM0UsIDB4RkY2MCwgMHhGRjYxLAotICAgIDB4RkY2MiwgMHhGRjYzLCAweEZGNjQsIDB4RkY2NSwgMHhGRjY2LCAweEZGNjcsIDB4RkY2OCwgMHhGRjY5LAotICAgIDB4RkY2QSwgMHhGRjZCLCAweEZGNkMsIDB4RkY2RCwgMHhGRjZFLCAweEZGNkYsIDB4RkY3MCwgMHhGRjcxLAotICAgIDB4RkY3MiwgMHhGRjczLCAweEZGNzQsIDB4RkY3NSwgMHhGRjc2LCAweEZGNzcsIDB4RkY3OCwgMHhGRjc5LAotICAgIDB4RkY3QSwgMHhGRjdCLCAweEZGN0MsIDB4RkY3RCwgMHhGRjdFLCAweEZGN0YsIDB4RkY4MCwgMHhGRjgxLAotICAgIDB4RkY4MiwgMHhGRjgzLCAweEZGODQsIDB4RkY4NSwgMHhGRjg2LCAweEZGODcsIDB4RkY4OCwgMHhGRjg5LAotICAgIDB4RkY4QSwgMHhGRjhCLCAweEZGOEMsIDB4RkY4RCwgMHhGRjhFLCAweEZGOEYsIDB4RkY5MCwgMHhGRjkxLAotICAgIDB4RkY5MiwgMHhGRjkzLCAweEZGOTQsIDB4RkY5NSwgMHhGRjk2LCAweEZGOTcsIDB4RkY5OCwgMHhGRjk5LAotICAgIDB4RkY5QSwgMHhGRjlCLCAweEZGOUMsIDB4RkY5RCwgMHhGRjlFLCAweEZGOUYsIDB4RkY0MCwgMHgzMEYwLAotICAgIDB4MzBGMSwgMHgzMEVFLCAweDMwQUIsIDB4MzBCMSwgMHgzMEY0LCAweDMwQUMsIDB4MzBBRSwgMHgzMEIwLAotICAgIDB4MzBCMiwgMHgzMEI0LCAweDMwQjYsIDB4MzBCOCwgMHgzMEJBLCAweDMwQkMsIDB4MzBCRSwgMHgzMEMwLAotICAgIDB4MzBDMiwgMHgzMEM1LCAweDMwQzcsIDB4MzBDOSwgMHgzMEQwLCAweDMwRDEsIDB4MzBEMywgMHgzMEQ0LAotICAgIDB4MzBENiwgMHgzMEQ3LCAweDMwRDksIDB4MzBEQSwgMHgzMERDLCAweDMwREQsIDB4RkY2MCwgMHgzMDFELAotICAgIDB4MzAxRSwgMHgyNTAwLCAweDI1MDEsIDB4MjUwMiwgMHgyNTAzLCAweDI1MDQsIDB4MjUwNSwgMHgyNTA2LAotICAgIDB4MjUwNywgMHgyNTA4LCAweDI1MDksIDB4MjUwQSwgMHgyNTBCLCAweDI1MEMsIDB4MjUwRCwgMHgyNTBFLAotICAgIDB4MjUwRiwgMHgyNTEwLCAweDI1MTEsIDB4MjUxMiwgMHgyNTEzLCAweDI1MTQsIDB4MjUxNSwgMHgyNTE2LAotICAgIDB4MjUxNywgMHgyNTE4LCAweDI1MTksIDB4MjUxQSwgMHgyNTFCLCAweDI1MUMsIDB4MjUxRCwgMHgyNTFFLAotICAgIDB4MjUxRiwgMHgyNTIwLCAweDI1MjEsIDB4MjUyMiwgMHgyNTIzLCAweDI1MjQsIDB4MjUyNSwgMHgyNTI2LAotICAgIDB4MjUyNywgMHgyNTI4LCAweDI1MjksIDB4MjUyQSwgMHgyNTJCLCAweDI1MkMsIDB4MjUyRCwgMHgyNTJFLAotICAgIDB4MjUyRiwgMHgyNTMwLCAweDI1MzEsIDB4MjUzMiwgMHgyNTMzLCAweDI1MzQsIDB4MjUzNSwgMHgyNTM2LAotICAgIDB4MjUzNywgMHgyNTM4LCAweDI1MzksIDB4MjUzQSwgMHgyNTNCLCAweDI1M0MsIDB4MjUzRCwgMHgyNTNFLAotICAgIDB4MjUzRiwgMHgyNTQwLCAweDI1NDEsIDB4MjU0MiwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwgMHgyNTQ2LAotICAgIDB4MjU0NywgMHgyNTQ4LCAweDI1NDksIDB4MjU0QSwgMHgyNTRCLCAweDIwMzIsIDB4MDBBOCwgMHgyMDM2LAotICAgIDB4MDA1QiwgMHgwMDVELCAweDMwMDgsIDB4MzAwOSwgMHgzMDBBLCAweDMwMEIsIDB4MzAwRSwgMHgzMDBGLAotICAgIDB4MzAxMCwgMHgzMDExLCAweDIwMTIsIDB4RkY2MCwgMHgzMDkyLCAweDMwNDEsIDB4MzA0MywgMHgzMDQ1LAotICAgIDB4MzA0NywgMHgzMDQ5LCAweDMwODMsIDB4MzA4NSwgMHgzMDg3LCAweDMwNjMsIDB4MzA0MiwgMHgzMDQ0LAotICAgIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsIDB4MzA1MSwgMHgzMDUzLAotICAgIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwgMHgzMDY0LAotICAgIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAotICAgIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLAotICAgIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAotICAgIDB4MzA4RCwgMHgzMDhGLCAweDMwOTMsIDB4MzA5MCwgMHgzMDkxLCAweDMwOEUsIDB4MzA0QywgMHgzMDRFLAotICAgIDB4MzA1MCwgMHgzMDUyLCAweDMwNTQsIDB4MzA1NiwgMHgzMDY4LCAweDMwNUEsIDB4MzA1QywgMHgzMDVFLAotICAgIDB4MzA2MCwgMHgzMDYyLCAweDMwNjUsIDB4MzA2NywgMHgzMDY5LCAweDMwNzAsIDB4MzA3MSwgMHgzMDczLAotICAgIDB4MzA3NCwgMHgzMDc2LCAweDMwNzcsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0MsIDB4MzA3RCwgMHgwMEM0LAotICAgIDB4MDBGOSwgMHgwMEU5LCAweDAwRUQsIDB4MDBERiwgMHgwMEU3LCAweDAwQzcsIDB4MDBEMSwgMHgwMEYxLAotICAgIDB4MDBBMiwgMHgwMEEzLCAweDAwRjMsIDB4MDBGQSwgMHgwMEExLCAweDAwQkYsIDB4MDBCRCwgMHgwMEQ2LAotICAgIDB4MDBEQywgMHgwMEU0LCAweDAwRUIsIDB4MDBFRiwgMHgwMEY2LCAweDAwREMsIDB4MDBFMiwgMHgwMEVBLAotICAgIDB4MDBFRSwgMHgwMEY0LCAweDAwRkMsIDB4MDBFMCwgMHgwMEU5LCAweDI1QjIsIDB4MDBFMSwgMHgwMDdFLAotICAgIDB4MDAzMCwgMHgzMDAwLCAweDMwMDEsIDB4MzAwMiwgMHhGRjBDLCAweEZGMEUsIDB4MzBGQiwgMHhGRjFBLAotICAgIDB4RkYxQiwgMHhGRjFGLCAweEZGMDEsIDB4MzA5QiwgMHgzMDlDLCAweDAwQjQsIDB4RkY0MCwgMHgwMEE4LAotICAgIDB4RkYzRSwgMHgyMDNFLCAweEZGM0YsIDB4MzBGRCwgMHgzMEZFLCAweDMwOUQsIDB4MzA5RSwgMHgzMDAzLAotICAgIDB4NEVERCwgMHgzMDA1LCAweDMwMDYsIDB4MzAwNywgMHgzMEZDLCAweDIwMTUsIDB4MjAxMCwgMHhGRjBGLAotICAgIDB4RkYzQywgMHhGRjVFLCAweDIwMTYsIDB4RkY1QywgMHgyMDI2LCAweDIwMjUsIDB4MjAxOCwgMHgyMDE5LAotICAgIDB4MjAxQywgMHgyMDFELCAweEZGMDgsIDB4RkYwOSwgMHgzMDE0LCAweDMwMTUsIDB4RkYzQiwgMHhGRjNELAotICAgIDB4RkY1QiwgMHhGRjVELCAweDMwMDgsIDB4MzAwOSwgMHgzMDBBLCAweDMwMEIsIDB4MzAwQywgMHgzMDBELAotICAgIDB4MzAwRSwgMHgzMDBGLCAweDMwMTAsIDB4MzAxMSwgMHhGRjBCLCAweEZGMEQsIDB4MDBCMSwgMHgwMEQ3LAotICAgIDB4MDBGNywgMHhGRjFELCAweDIyNjAsIDB4RkYxQywgMHhGRjFFLCAweDIyNjYsIDB4MjI2NywgMHgyMjFFLAotICAgIDB4MjIzNCwgMHgyNjQyLCAweDI2NDAsIDB4MDBCMCwgMHgyMDMyLCAweDIwMzMsIDB4MjEwMywgMHhGRkU1LAotICAgIDB4RkYwNCwgMHgwMEEyLCAweDAwQTMsIDB4RkYwNSwgMHhGRjAzLCAweEZGMDYsIDB4RkYwQSwgMHhGRjIwLAotICAgIDB4MDBBNywgMHgyNjA2LCAweDI2MDUsIDB4MjVDQiwgMHgyNUNGLCAweDI1Q0UsIDB4MjVDNywgMHgyNUM2LAotICAgIDB4MjVBMSwgMHgyNUEwLCAweDI1QjMsIDB4MjVCMiwgMHgyNUJELCAweDI1QkMsIDB4MjAzQiwgMHgzMDEyLAotICAgIDB4MjE5MiwgMHgyMTkwLCAweDIxOTEsIDB4MjE5MywgMHgzMDEzLCAweDIyMDgsIDB4MjIwQiwgMHgyMjg2LAotICAgIDB4MjI4NywgMHgyMjgyLCAweDIyODMsIDB4MjIyQSwgMHgyMjI5LCAweDIyMjcsIDB4MjIyOCwgMHgwMEFDLAotICAgIDB4MjFEMiwgMHgyMUQ0LCAweDIyMDAsIDB4MjIwMywgMHgyMjIwLCAweDIyQTUsIDB4MjMxMiwgMHgyMjAyLAotICAgIDB4MjIwNywgMHgyMjYxLCAweDIyNTIsIDB4MjI2QSwgMHgyMjZCLCAweDIyMUEsIDB4MjIzRCwgMHgyMjFELAotICAgIDB4MjIzNSwgMHgyMjJCLCAweDIyMkMsIDB4MjEyQiwgMHgyMDMwLCAweDI2NkYsIDB4MjY2RCwgMHgyNjZBLAotICAgIDB4MjAyMCwgMHgyMDIxLCAweDAwQjYsIDB4MjVFRiwgMHhGRjEwLCAweEZGMTEsIDB4RkYxMiwgMHhGRjEzLAotICAgIDB4RkYxNCwgMHhGRjE1LCAweEZGMTYsIDB4RkYxNywgMHhGRjE4LCAweEZGMTksIDB4RkYyMSwgMHhGRjIyLAotICAgIDB4RkYyMywgMHhGRjI0LCAweEZGMjUsIDB4RkYyNiwgMHhGRjI3LCAweEZGMjgsIDB4RkYyOSwgMHhGRjJBLAotICAgIDB4RkYyQiwgMHhGRjJDLCAweEZGMkQsIDB4RkYyRSwgMHhGRjJGLCAweEZGMzAsIDB4RkYzMSwgMHhGRjMyLAotICAgIDB4RkYzMywgMHhGRjM0LCAweEZGMzUsIDB4RkYzNiwgMHhGRjM3LCAweEZGMzgsIDB4RkYzOSwgMHhGRjNBLAotICAgIDB4RkY0MSwgMHhGRjQyLCAweEZGNDMsIDB4RkY0NCwgMHhGRjQ1LCAweEZGNDYsIDB4RkY0NywgMHhGRjQ4LAotICAgIDB4RkY0OSwgMHhGRjRBLCAweEZGNEIsIDB4RkY0QywgMHhGRjRELCAweEZGNEUsIDB4RkY0RiwgMHhGRjUwLAotICAgIDB4RkY1MSwgMHhGRjUyLCAweEZGNTMsIDB4RkY1NCwgMHhGRjU1LCAweEZGNTYsIDB4RkY1NywgMHhGRjU4LAotICAgIDB4RkY1OSwgMHhGRjVBLCAweDMwNDEsIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LAotICAgIDB4MzA0NywgMHgzMDQ4LCAweDMwNDksIDB4MzA0QSwgMHgzMDRCLCAweDMwNEMsIDB4MzA0RCwgMHgzMDRFLAotICAgIDB4MzA0RiwgMHgzMDUwLCAweDMwNTEsIDB4MzA1MiwgMHgzMDUzLCAweDMwNTQsIDB4MzA1NSwgMHgzMDU2LAotICAgIDB4MzA1NywgMHgzMDU4LCAweDMwNTksIDB4MzA1QSwgMHgzMDVCLCAweDMwNUMsIDB4MzA1RCwgMHgzMDVFLAotICAgIDB4MzA1RiwgMHgzMDYwLCAweDMwNjEsIDB4MzA2MiwgMHgzMDYzLCAweDMwNjQsIDB4MzA2NSwgMHgzMDY2LAotICAgIDB4MzA2NywgMHgzMDY4LCAweDMwNjksIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLAotICAgIDB4MzA2RiwgMHgzMDcwLCAweDMwNzEsIDB4MzA3MiwgMHgzMDczLCAweDMwNzQsIDB4MzA3NSwgMHgzMDc2LAotICAgIDB4MzA3NywgMHgzMDc4LCAweDMwNzksIDB4MzA3QSwgMHgzMDdCLCAweDMwN0MsIDB4MzA3RCwgMHgzMDdFLAotICAgIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDgzLCAweDMwODQsIDB4MzA4NSwgMHgzMDg2LAotICAgIDB4MzA4NywgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhFLAotICAgIDB4MzA4RiwgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLCAweDMwQTEsIDB4MzBBMiwgMHgzMEEzLAotICAgIDB4MzBBNCwgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywgMHgzMEE4LCAweDMwQTksIDB4MzBBQSwgMHgzMEFCLAotICAgIDB4MzBBQywgMHgzMEFELCAweDMwQUUsIDB4MzBBRiwgMHgzMEIwLCAweDMwQjEsIDB4MzBCMiwgMHgzMEIzLAotICAgIDB4MzBCNCwgMHgzMEI1LCAweDMwQjYsIDB4MzBCNywgMHgzMEI4LCAweDMwQjksIDB4MzBCQSwgMHgzMEJCLAotICAgIDB4MzBCQywgMHgzMEJELCAweDMwQkUsIDB4MzBCRiwgMHgzMEMwLCAweDMwQzEsIDB4MzBDMiwgMHgzMEMzLAotICAgIDB4MzBDNCwgMHgzMEM1LCAweDMwQzYsIDB4MzBDNywgMHgzMEM4LCAweDMwQzksIDB4MzBDQSwgMHgzMENCLAotICAgIDB4MzBDQywgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwgMHgzMEQwLCAweDMwRDEsIDB4MzBEMiwgMHgzMEQzLAotICAgIDB4MzBENCwgMHgzMEQ1LCAweDMwRDYsIDB4MzBENywgMHgzMEQ4LCAweDMwRDksIDB4MzBEQSwgMHgzMERCLAotICAgIDB4MzBEQywgMHgzMERELCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEUzLAotICAgIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsIDB4MzBFNywgMHgzMEU4LCAweDMwRTksIDB4MzBFQSwgMHgzMEVCLAotICAgIDB4MzBFQywgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLAotICAgIDB4MzBGNCwgMHgzMEY1LCAweDMwRjYsIDB4MDM5MSwgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwgMHgwMzk1LAotICAgIDB4MDM5NiwgMHgwMzk3LCAweDAzOTgsIDB4MDM5OSwgMHgwMzlBLCAweDAzOUIsIDB4MDM5QywgMHgwMzlELAotICAgIDB4MDM5RSwgMHgwMzlGLCAweDAzQTAsIDB4MDNBMSwgMHgwM0EzLCAweDAzQTQsIDB4MDNBNSwgMHgwM0E2LAotICAgIDB4MDNBNywgMHgwM0E4LCAweDAzQTksIDB4MDNCMSwgMHgwM0IyLCAweDAzQjMsIDB4MDNCNCwgMHgwM0I1LAotICAgIDB4MDNCNiwgMHgwM0I3LCAweDAzQjgsIDB4MDNCOSwgMHgwM0JBLCAweDAzQkIsIDB4MDNCQywgMHgwM0JELAotICAgIDB4MDNCRSwgMHgwM0JGLCAweDAzQzAsIDB4MDNDMSwgMHgwM0MzLCAweDAzQzQsIDB4MDNDNSwgMHgwM0M2LAotICAgIDB4MDNDNywgMHgwM0M4LCAweDAzQzksIDB4MDQxMCwgMHgwNDExLCAweDA0MTIsIDB4MDQxMywgMHgwNDE0LAotICAgIDB4MDQxNSwgMHgwNDAxLCAweDA0MTYsIDB4MDQxNywgMHgwNDE4LCAweDA0MTksIDB4MDQxQSwgMHgwNDFCLAotICAgIDB4MDQxQywgMHgwNDFELCAweDA0MUUsIDB4MDQxRiwgMHgwNDIwLCAweDA0MjEsIDB4MDQyMiwgMHgwNDIzLAotICAgIDB4MDQyNCwgMHgwNDI1LCAweDA0MjYsIDB4MDQyNywgMHgwNDI4LCAweDA0MjksIDB4MDQyQSwgMHgwNDJCLAotICAgIDB4MDQyQywgMHgwNDJELCAweDA0MkUsIDB4MDQyRiwgMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLAotICAgIDB4MDQzNCwgMHgwNDM1LCAweDA0NTEsIDB4MDQzNiwgMHgwNDM3LCAweDA0MzgsIDB4MDQzOSwgMHgwNDNBLAotICAgIDB4MDQzQiwgMHgwNDNDLCAweDA0M0QsIDB4MDQzRSwgMHgwNDNGLCAweDA0NDAsIDB4MDQ0MSwgMHgwNDQyLAotICAgIDB4MDQ0MywgMHgwNDQ0LCAweDA0NDUsIDB4MDQ0NiwgMHgwNDQ3LCAweDA0NDgsIDB4MDQ0OSwgMHgwNDRBLAotICAgIDB4MDQ0QiwgMHgwNDRDLCAweDA0NEQsIDB4MDQ0RSwgMHgwNDRGLCAweDRFOUMsIDB4NTUxNiwgMHg1QTAzLAotICAgIDB4OTYzRiwgMHg1NEMwLCAweDYxMUIsIDB4NjMyOCwgMHg1OUY2LCAweDkwMjIsIDB4ODQ3NSwgMHg4MzFDLAotICAgIDB4N0E1MCwgMHg2MEFBLCAweDYzRTEsIDB4NkUyNSwgMHg2NUVELCAweDg0NjYsIDB4ODJBNiwgMHg5QkY1LAotICAgIDB4Njg5MywgMHg1NzI3LCAweDY1QTEsIDB4NjI3MSwgMHg1QjlCLCAweDU5RDAsIDB4ODY3QiwgMHg5OEY0LAotICAgIDB4N0Q2MiwgMHg3REJFLCAweDlCOEUsIDB4NjIxNiwgMHg3QzlGLCAweDg4QjcsIDB4NUI4OSwgMHg1RUI1LAotICAgIDB4NjMwOSwgMHg2Njk3LCAweDY4NDgsIDB4OTVDNywgMHg5NzhELCAweDY3NEYsIDB4NEVFNSwgMHg0RjBBLAotICAgIDB4NEY0RCwgMHg0RjlELCAweDUwNDksIDB4NTZGMiwgMHg1OTM3LCAweDU5RDQsIDB4NUEwMSwgMHg1QzA5LAotICAgIDB4NjBERiwgMHg2MTBGLCAweDYxNzAsIDB4NjYxMywgMHg2OTA1LCAweDcwQkEsIDB4NzU0RiwgMHg3NTcwLAotICAgIDB4NzlGQiwgMHg3REFELCAweDdERUYsIDB4ODBDMywgMHg4NDBFLCAweDg4NjMsIDB4OEIwMiwgMHg5MDU1LAotICAgIDB4OTA3QSwgMHg1MzNCLCAweDRFOTUsIDB4NEVBNSwgMHg1N0RGLCAweDgwQjIsIDB4OTBDMSwgMHg3OEVGLAotICAgIDB4NEUwMCwgMHg1OEYxLCAweDZFQTIsIDB4OTAzOCwgMHg3QTMyLCAweDgzMjgsIDB4ODI4QiwgMHg5QzJGLAotICAgIDB4NTE0MSwgMHg1MzcwLCAweDU0QkQsIDB4NTRFMSwgMHg1NkUwLCAweDU5RkIsIDB4NUYxNSwgMHg5OEYyLAotICAgIDB4NkRFQiwgMHg4MEU0LCAweDg1MkQsIDB4OTY2MiwgMHg5NjcwLCAweDk2QTAsIDB4OTdGQiwgMHg1NDBCLAotICAgIDB4NTNGMywgMHg1Qjg3LCAweDcwQ0YsIDB4N0ZCRCwgMHg4RkMyLCAweDk2RTgsIDB4NTM2RiwgMHg5RDVDLAotICAgIDB4N0FCQSwgMHg0RTExLCAweDc4OTMsIDB4ODFGQywgMHg2RTI2LCAweDU2MTgsIDB4NTUwNCwgMHg2QjFELAotICAgIDB4ODUxQSwgMHg5QzNCLCAweDU5RTUsIDB4NTNBOSwgMHg2RDY2LCAweDc0REMsIDB4OTU4RiwgMHg1NjQyLAotICAgIDB4NEU5MSwgMHg5MDRCLCAweDk2RjIsIDB4ODM0RiwgMHg5OTBDLCAweDUzRTEsIDB4NTVCNiwgMHg1QjMwLAotICAgIDB4NUY3MSwgMHg2NjIwLCAweDY2RjMsIDB4NjgwNCwgMHg2QzM4LCAweDZDRjMsIDB4NkQyOSwgMHg3NDVCLAotICAgIDB4NzZDOCwgMHg3QTRFLCAweDk4MzQsIDB4ODJGMSwgMHg4ODVCLCAweDhBNjAsIDB4OTJFRCwgMHg2REIyLAotICAgIDB4NzVBQiwgMHg3NkNBLCAweDk5QzUsIDB4NjBBNiwgMHg4QjAxLCAweDhEOEEsIDB4OTVCMiwgMHg2OThFLAotICAgIDB4NTNBRCwgMHg1MTg2LCAweDU3MTIsIDB4NTgzMCwgMHg1OTQ0LCAweDVCQjQsIDB4NUVGNiwgMHg2MDI4LAotICAgIDB4NjNBOSwgMHg2M0Y0LCAweDZDQkYsIDB4NkYxNCwgMHg3MDhFLCAweDcxMTQsIDB4NzE1OSwgMHg3MUQ1LAotICAgIDB4NzMzRiwgMHg3RTAxLCAweDgyNzYsIDB4ODJEMSwgMHg4NTk3LCAweDkwNjAsIDB4OTI1QiwgMHg5RDFCLAotICAgIDB4NTg2OSwgMHg2NUJDLCAweDZDNUEsIDB4NzUyNSwgMHg1MUY5LCAweDU5MkUsIDB4NTk2NSwgMHg1RjgwLAotICAgIDB4NUZEQywgMHg2MkJDLCAweDY1RkEsIDB4NkEyQSwgMHg2QjI3LCAweDZCQjQsIDB4NzM4QiwgMHg3RkMxLAotICAgIDB4ODk1NiwgMHg5RDJDLCAweDlEMEUsIDB4OUVDNCwgMHg1Q0ExLCAweDZDOTYsIDB4ODM3QiwgMHg1MTA0LAotICAgIDB4NUM0QiwgMHg2MUI2LCAweDgxQzYsIDB4Njg3NiwgMHg3MjYxLCAweDRFNTksIDB4NEZGQSwgMHg1Mzc4LAotICAgIDB4NjA2OSwgMHg2RTI5LCAweDdBNEYsIDB4OTdGMywgMHg0RTBCLCAweDUzMTYsIDB4NEVFRSwgMHg0RjU1LAotICAgIDB4NEYzRCwgMHg0RkExLCAweDRGNzMsIDB4NTJBMCwgMHg1M0VGLCAweDU2MDksIDB4NTkwRiwgMHg1QUMxLAotICAgIDB4NUJCNiwgMHg1QkUxLCAweDc5RDEsIDB4NjY4NywgMHg2NzlDLCAweDY3QjYsIDB4NkI0QywgMHg2Q0IzLAotICAgIDB4NzA2QiwgMHg3M0MyLCAweDc5OEQsIDB4NzlCRSwgMHg3QTNDLCAweDdCODcsIDB4ODJCMSwgMHg4MkRCLAotICAgIDB4ODMwNCwgMHg4Mzc3LCAweDgzRUYsIDB4ODNEMywgMHg4NzY2LCAweDhBQjIsIDB4NTYyOSwgMHg4Q0E4LAotICAgIDB4OEZFNiwgMHg5MDRFLCAweDk3MUUsIDB4ODY4QSwgMHg0RkM0LCAweDVDRTgsIDB4NjIxMSwgMHg3MjU5LAotICAgIDB4NzUzQiwgMHg4MUU1LCAweDgyQkQsIDB4ODZGRSwgMHg4Q0MwLCAweDk2QzUsIDB4OTkxMywgMHg5OUQ1LAotICAgIDB4NEVDQiwgMHg0RjFBLCAweDg5RTMsIDB4NTZERSwgMHg1ODRBLCAweDU4Q0EsIDB4NUVGQiwgMHg1RkVCLAotICAgIDB4NjAyQSwgMHg2MDk0LCAweDYwNjIsIDB4NjFEMCwgMHg2MjEyLCAweDYyRDAsIDB4NjUzOSwgMHg5QjQxLAotICAgIDB4NjY2NiwgMHg2OEIwLCAweDZENzcsIDB4NzA3MCwgMHg3NTRDLCAweDc2ODYsIDB4N0Q3NSwgMHg4MkE1LAotICAgIDB4ODdGOSwgMHg5NThCLCAweDk2OEUsIDB4OEM5RCwgMHg1MUYxLCAweDUyQkUsIDB4NTkxNiwgMHg1NEIzLAotICAgIDB4NUJCMywgMHg1RDE2LCAweDYxNjgsIDB4Njk4MiwgMHg2REFGLCAweDc4OEQsIDB4ODRDQiwgMHg4ODU3LAotICAgIDB4OEE3MiwgMHg5M0E3LCAweDlBQjgsIDB4NkQ2QywgMHg5OUE4LCAweDg2RDksIDB4NTdBMywgMHg2N0ZGLAotICAgIDB4ODZDRSwgMHg5MjBFLCAweDUyODMsIDB4NTY4NywgMHg1NDA0LCAweDVFRDMsIDB4NjJFMSwgMHg2NEI5LAotICAgIDB4NjgzQywgMHg2ODM4LCAweDZCQkIsIDB4NzM3MiwgMHg3OEJBLCAweDdBNkIsIDB4ODk5QSwgMHg4OUQyLAotICAgIDB4OEQ2QiwgMHg4RjAzLCAweDkwRUQsIDB4OTVBMywgMHg5Njk0LCAweDk3NjksIDB4NUI2NiwgMHg1Q0IzLAotICAgIDB4Njk3RCwgMHg5ODRELCAweDk4NEUsIDB4NjM5QiwgMHg3QjIwLCAweDZBMkIsIDB4NkE3RiwgMHg2OEI2LAotICAgIDB4OUMwRCwgMHg2RjVGLCAweDUyNzIsIDB4NTU5RCwgMHg2MDcwLCAweDYyRUMsIDB4NkQzQiwgMHg2RTA3LAotICAgIDB4NkVEMSwgMHg4NDVCLCAweDg5MTAsIDB4OEY0NCwgMHg0RTE0LCAweDlDMzksIDB4NTNGNiwgMHg2OTFCLAotICAgIDB4NkEzQSwgMHg5Nzg0LCAweDY4MkEsIDB4NTE1QywgMHg3QUMzLCAweDg0QjIsIDB4OTFEQywgMHg5MzhDLAotICAgIDB4NTY1QiwgMHg5RDI4LCAweDY4MjIsIDB4ODMwNSwgMHg4NDMxLCAweDdDQTUsIDB4NTIwOCwgMHg4MkM1LAotICAgIDB4NzRFNiwgMHg0RTdFLCAweDRGODMsIDB4NTFBMCwgMHg1QkQyLCAweDUyMEEsIDB4NTJEOCwgMHg1MkU3LAotICAgIDB4NURGQiwgMHg1NTlBLCAweDU4MkEsIDB4NTlFNiwgMHg1QjhDLCAweDVCOTgsIDB4NUJEQiwgMHg1RTcyLAotICAgIDB4NUU3OSwgMHg2MEEzLCAweDYxMUYsIDB4NjE2MywgMHg2MUJFLCAweDYzREIsIDB4NjU2MiwgMHg2N0QxLAotICAgIDB4Njg1MywgMHg2OEZBLCAweDZCM0UsIDB4NkI1MywgMHg2QzU3LCAweDZGMjIsIDB4NkY5NywgMHg2RjQ1LAotICAgIDB4NzRCMCwgMHg3NTE4LCAweDc2RTMsIDB4NzcwQiwgMHg3QUZGLCAweDdCQTEsIDB4N0MyMSwgMHg3REU5LAotICAgIDB4N0YzNiwgMHg3RkYwLCAweDgwOUQsIDB4ODI2NiwgMHg4MzlFLCAweDg5QjMsIDB4OEFDQywgMHg4Q0FCLAotICAgIDB4OTA4NCwgMHg5NDUxLCAweDk1OTMsIDB4OTU5MSwgMHg5NUEyLCAweDk2NjUsIDB4OTdEMywgMHg5OTI4LAotICAgIDB4ODIxOCwgMHg0RTM4LCAweDU0MkIsIDB4NUNCOCwgMHg1RENDLCAweDczQTksIDB4NzY0QywgMHg3NzNDLAotICAgIDB4NUNBOSwgMHg3RkVCLCAweDhEMEIsIDB4OTZDMSwgMHg5ODExLCAweDk4NTQsIDB4OTg1OCwgMHg0RjAxLAotICAgIDB4NEYwRSwgMHg1MzcxLCAweDU1OUMsIDB4NTY2OCwgMHg1N0ZBLCAweDU5NDcsIDB4NUIwOSwgMHg1QkM0LAotICAgIDB4NUM5MCwgMHg1RTBDLCAweDVFN0UsIDB4NUZDQywgMHg2M0VFLCAweDY3M0EsIDB4NjVENywgMHg2NUUyLAotICAgIDB4NjcxRiwgMHg2OENCLCAweDY4QzQsIDB4NkE1RiwgMHg1RTMwLCAweDZCQzUsIDB4NkMxNywgMHg2QzdELAotICAgIDB4NzU3RiwgMHg3OTQ4LCAweDVCNjMsIDB4N0EwMCwgMHg3RDAwLCAweDVGQkQsIDB4ODk4RiwgMHg4QTE4LAotICAgIDB4OENCNCwgMHg4RDc3LCAweDhFQ0MsIDB4OEYxRCwgMHg5OEUyLCAweDlBMEUsIDB4OUIzQywgMHg0RTgwLAotICAgIDB4NTA3RCwgMHg1MTAwLCAweDU5OTMsIDB4NUI5QywgMHg2MjJGLCAweDYyODAsIDB4NjRFQywgMHg2QjNBLAotICAgIDB4NzJBMCwgMHg3NTkxLCAweDc5NDcsIDB4N0ZBOSwgMHg4N0ZCLCAweDhBQkMsIDB4OEI3MCwgMHg2M0FDLAotICAgIDB4ODNDQSwgMHg5N0EwLCAweDU0MDksIDB4NTQwMywgMHg1NUFCLCAweDY4NTQsIDB4NkE1OCwgMHg4QTcwLAotICAgIDB4NzgyNywgMHg2Nzc1LCAweDlFQ0QsIDB4NTM3NCwgMHg1QkEyLCAweDgxMUEsIDB4ODY1MCwgMHg5MDA2LAotICAgIDB4NEUxOCwgMHg0RTQ1LCAweDRFQzcsIDB4NEYxMSwgMHg1M0NBLCAweDU0MzgsIDB4NUJBRSwgMHg1RjEzLAotICAgIDB4NjAyNSwgMHg2NTUxLCAweDY3M0QsIDB4NkM0MiwgMHg2QzcyLCAweDZDRTMsIDB4NzA3OCwgMHg3NDAzLAotICAgIDB4N0E3NiwgMHg3QUFFLCAweDdCMDgsIDB4N0QxQSwgMHg3Q0ZFLCAweDdENjYsIDB4NjVFNywgMHg3MjVCLAotICAgIDB4NTNCQiwgMHg1QzQ1LCAweDVERTgsIDB4NjJEMiwgMHg2MkUwLCAweDYzMTksIDB4NkUyMCwgMHg4NjVBLAotICAgIDB4OEEzMSwgMHg4RERELCAweDkyRjgsIDB4NkYwMSwgMHg3OUE2LCAweDlCNUEsIDB4NEVBOCwgMHg0RUFCLAotICAgIDB4NEVBQywgMHg0RjlCLCAweDRGQTAsIDB4NTBEMSwgMHg1MTQ3LCAweDdBRjYsIDB4NTE3MSwgMHg1MUY2LAotICAgIDB4NTM1NCwgMHg1MzIxLCAweDUzN0YsIDB4NTNFQiwgMHg1NUFDLCAweDU4ODMsIDB4NUNFMSwgMHg1RjM3LAotICAgIDB4NUY0QSwgMHg2MDJGLCAweDYwNTAsIDB4NjA2RCwgMHg2MzFGLCAweDY1NTksIDB4NkE0QiwgMHg2Q0MxLAotICAgIDB4NzJDMiwgMHg3MkVELCAweDc3RUYsIDB4ODBGOCwgMHg4MTA1LCAweDgyMDgsIDB4ODU0RSwgMHg5MEY3LAotICAgIDB4OTNFMSwgMHg5N0ZGLCAweDk5NTcsIDB4OUE1QSwgMHg0RUYwLCAweDUxREQsIDB4NUMyRCwgMHg2NjgxLAotICAgIDB4Njk2RCwgMHg1QzQwLCAweDY2RjIsIDB4Njk3NSwgMHg3Mzg5LCAweDY4NTAsIDB4N0M4MSwgMHg1MEM1LAotICAgIDB4NTJFNCwgMHg1NzQ3LCAweDVERkUsIDB4OTMyNiwgMHg2NUE0LCAweDZCMjMsIDB4NkIzRCwgMHg3NDM0LAotICAgIDB4Nzk4MSwgMHg3OUJELCAweDdCNEIsIDB4N0RDQSwgMHg4MkI5LCAweDgzQ0MsIDB4ODg3RiwgMHg4OTVGLAotICAgIDB4OEIzOSwgMHg4RkQxLCAweDkxRDEsIDB4NTQxRiwgMHg5MjgwLCAweDRFNUQsIDB4NTAzNiwgMHg1M0U1LAotICAgIDB4NTMzQSwgMHg3MkQ3LCAweDczOTYsIDB4NzdFOSwgMHg4MkU2LCAweDhFQUYsIDB4OTlDNiwgMHg5OUM4LAotICAgIDB4OTlEMiwgMHg1MTc3LCAweDYxMUEsIDB4ODY1RSwgMHg1NUIwLCAweDdBN0EsIDB4NTA3NiwgMHg1QkQzLAotICAgIDB4OTA0NywgMHg5Njg1LCAweDRFMzIsIDB4NkFEQiwgMHg5MUU3LCAweDVDNTEsIDB4NUM0OCwgMHg2Mzk4LAotICAgIDB4N0E5RiwgMHg2QzkzLCAweDk3NzQsIDB4OEY2MSwgMHg3QUFBLCAweDcxOEEsIDB4OTY4OCwgMHg3QzgyLAotICAgIDB4NjgxNywgMHg3RTcwLCAweDY4NTEsIDB4OTM2QywgMHg1MkYyLCAweDU0MUIsIDB4ODVBQiwgMHg4QTEzLAotICAgIDB4N0ZBNCwgMHg4RUNELCAweDkwRTEsIDB4NTM2NiwgMHg4ODg4LCAweDc5NDEsIDB4NEZDMiwgMHg1MEJFLAotICAgIDB4NTIxMSwgMHg1MTQ0LCAweDU1NTMsIDB4NTcyRCwgMHg3M0VBLCAweDU3OEIsIDB4NTk1MSwgMHg1RjYyLAotICAgIDB4NUY4NCwgMHg2MDc1LCAweDYxNzYsIDB4NjE2NywgMHg2MUE5LCAweDYzQjIsIDB4NjQzQSwgMHg2NTZDLAotICAgIDB4NjY2RiwgMHg2ODQyLCAweDZFMTMsIDB4NzU2NiwgMHg3QTNELCAweDdDRkIsIDB4N0Q0QywgMHg3RDk5LAotICAgIDB4N0U0QiwgMHg3RjZCLCAweDgzMEUsIDB4ODM0QSwgMHg4NkNELCAweDhBMDgsIDB4OEE2MywgMHg4QjY2LAotICAgIDB4OEVGRCwgMHg5ODFBLCAweDlEOEYsIDB4ODJCOCwgMHg4RkNFLCAweDlCRTgsIDB4NTI4NywgMHg2MjFGLAotICAgIDB4NjQ4MywgMHg2RkMwLCAweDk2OTksIDB4Njg0MSwgMHg1MDkxLCAweDZCMjAsIDB4NkM3QSwgMHg2RjU0LAotICAgIDB4N0E3NCwgMHg3RDUwLCAweDg4NDAsIDB4OEEyMywgMHg2NzA4LCAweDRFRjYsIDB4NTAzOSwgMHg1MDI2LAotICAgIDB4NTA2NSwgMHg1MTdDLCAweDUyMzgsIDB4NTI2MywgMHg1NUE3LCAweDU3MEYsIDB4NTgwNSwgMHg1QUNDLAotICAgIDB4NUVGQSwgMHg2MUIyLCAweDYxRjgsIDB4NjJGMywgMHg2MzcyLCAweDY5MUMsIDB4NkEyOSwgMHg3MjdELAotICAgIDB4NzJBQywgMHg3MzJFLCAweDc4MTQsIDB4Nzg2RiwgMHg3RDc5LCAweDc3MEMsIDB4ODBBOSwgMHg4OThCLAotICAgIDB4OEIxOSwgMHg4Q0UyLCAweDhFRDIsIDB4OTA2MywgMHg5Mzc1LCAweDk2N0EsIDB4OTg1NSwgMHg5QTEzLAotICAgIDB4OUU3OCwgMHg1MTQzLCAweDUzOUYsIDB4NTNCMywgMHg1RTdCLCAweDVGMjYsIDB4NkUxQiwgMHg2RTkwLAotICAgIDB4NzM4NCwgMHg3M0ZFLCAweDdENDMsIDB4ODIzNywgMHg4QTAwLCAweDhBRkEsIDB4OTY1MCwgMHg0RTRFLAotICAgIDB4NTAwQiwgMHg1M0U0LCAweDU0N0MsIDB4NTZGQSwgMHg1OUQxLCAweDVCNjQsIDB4NURGMSwgMHg1RUFCLAotICAgIDB4NUYyNywgMHg2MjM4LCAweDY1NDUsIDB4NjdBRiwgMHg2RTU2LCAweDcyRDAsIDB4N0NDQSwgMHg4OEI0LAotICAgIDB4ODBBMSwgMHg4MEUxLCAweDgzRjAsIDB4ODY0RSwgMHg4QTg3LCAweDhERTgsIDB4OTIzNywgMHg5NkM3LAotICAgIDB4OTg2NywgMHg5RjEzLCAweDRFOTQsIDB4NEU5MiwgMHg0RjBELCAweDUzNDgsIDB4NTQ0OSwgMHg1NDNFLAotICAgIDB4NUEyRiwgMHg1RjhDLCAweDVGQTEsIDB4NjA5RiwgMHg2OEE3LCAweDZBOEUsIDB4NzQ1QSwgMHg3ODgxLAotICAgIDB4OEE5RSwgMHg4QUE0LCAweDhCNzcsIDB4OTE5MCwgMHg0RTVFLCAweDlCQzksIDB4NEVBNCwgMHg0RjdDLAotICAgIDB4NEZBRiwgMHg1MDE5LCAweDUwMTYsIDB4NTE0OSwgMHg1MTZDLCAweDUyOUYsIDB4NTJCOSwgMHg1MkZFLAotICAgIDB4NTM5QSwgMHg1M0UzLCAweDU0MTEsIDB4NTQwRSwgMHg1NTg5LCAweDU3NTEsIDB4NTdBMiwgMHg1OTdELAotICAgIDB4NUI1NCwgMHg1QjVELCAweDVCOEYsIDB4NURFNSwgMHg1REU3LCAweDVERjcsIDB4NUU3OCwgMHg1RTgzLAotICAgIDB4NUU5QSwgMHg1RUI3LCAweDVGMTgsIDB4NjA1MiwgMHg2MTRDLCAweDYyOTcsIDB4NjJEOCwgMHg2M0E3LAotICAgIDB4NjUzQiwgMHg2NjAyLCAweDY2NDMsIDB4NjZGNCwgMHg2NzZELCAweDY4MjEsIDB4Njg5NywgMHg2OUNCLAotICAgIDB4NkM1RiwgMHg2RDJBLCAweDZENjksIDB4NkUyRiwgMHg2RTlELCAweDc1MzIsIDB4NzY4NywgMHg3ODZDLAotICAgIDB4N0EzRiwgMHg3Q0UwLCAweDdEMDUsIDB4N0QxOCwgMHg3RDVFLCAweDdEQjEsIDB4ODAxNSwgMHg4MDAzLAotICAgIDB4ODBBRiwgMHg4MEIxLCAweDgxNTQsIDB4ODE4RiwgMHg4MjJBLCAweDgzNTIsIDB4ODg0QywgMHg4ODYxLAotICAgIDB4OEIxQiwgMHg4Q0EyLCAweDhDRkMsIDB4OTBDQSwgMHg5MTc1LCAweDkyNzEsIDB4NzgzRiwgMHg5MkZDLAotICAgIDB4OTVBNCwgMHg5NjRELCAweDk4MDUsIDB4OTk5OSwgMHg5QUQ4LCAweDlEM0IsIDB4NTI1QiwgMHg1MkFCLAotICAgIDB4NTNGNywgMHg1NDA4LCAweDU4RDUsIDB4NjJGNywgMHg2RkUwLCAweDhDNkEsIDB4OEY1RiwgMHg5RUI5LAotICAgIDB4NTE0QiwgMHg1MjNCLCAweDU0NEEsIDB4NTZGRCwgMHg3QTQwLCAweDkxNzcsIDB4OUQ2MCwgMHg5RUQyLAotICAgIDB4NzM0NCwgMHg2RjA5LCAweDgxNzAsIDB4NzUxMSwgMHg1RkZELCAweDYwREEsIDB4OUFBOCwgMHg3MkRCLAotICAgIDB4OEZCQywgMHg2QjY0LCAweDk4MDMsIDB4NEVDQSwgMHg1NkYwLCAweDU3NjQsIDB4NThCRSwgMHg1QTVBLAotICAgIDB4NjA2OCwgMHg2MUM3LCAweDY2MEYsIDB4NjYwNiwgMHg2ODM5LCAweDY4QjEsIDB4NkRGNywgMHg3NUQ1LAotICAgIDB4N0QzQSwgMHg4MjZFLCAweDlCNDIsIDB4NEU5QiwgMHg0RjUwLCAweDUzQzksIDB4NTUwNiwgMHg1RDZGLAotICAgIDB4NURFNiwgMHg1REVFLCAweDY3RkIsIDB4NkM5OSwgMHg3NDczLCAweDc4MDIsIDB4OEE1MCwgMHg5Mzk2LAotICAgIDB4ODhERiwgMHg1NzUwLCAweDVFQTcsIDB4NjMyQiwgMHg1MEI1LCAweDUwQUMsIDB4NTE4RCwgMHg2NzAwLAotICAgIDB4NTRDOSwgMHg1ODVFLCAweDU5QkIsIDB4NUJCMCwgMHg1RjY5LCAweDYyNEQsIDB4NjNBMSwgMHg2ODNELAotICAgIDB4NkI3MywgMHg2RTA4LCAweDcwN0QsIDB4OTFDNywgMHg3MjgwLCAweDc4MTUsIDB4NzgyNiwgMHg3OTZELAotICAgIDB4NjU4RSwgMHg3RDMwLCAweDgzREMsIDB4ODhDMSwgMHg4RjA5LCAweDk2OUIsIDB4NTI2NCwgMHg1NzI4LAotICAgIDB4Njc1MCwgMHg3RjZBLCAweDhDQTEsIDB4NTFCNCwgMHg1NzQyLCAweDk2MkEsIDB4NTgzQSwgMHg2OThBLAotICAgIDB4ODBCNCwgMHg1NEIyLCAweDVEMEUsIDB4NTdGQywgMHg3ODk1LCAweDlERkEsIDB4NEY1QywgMHg1MjRBLAotICAgIDB4NTQ4QiwgMHg2NDNFLCAweDY2MjgsIDB4NjcxNCwgMHg2N0Y1LCAweDdBODQsIDB4N0I1NiwgMHg3RDIyLAotICAgIDB4OTMyRiwgMHg2ODVDLCAweDlCQUQsIDB4N0IzOSwgMHg1MzE5LCAweDUxOEEsIDB4NTIzNywgMHg1QkRGLAotICAgIDB4NjJGNiwgMHg2NEFFLCAweDY0RTYsIDB4NjcyRCwgMHg2QkJBLCAweDg1QTksIDB4OTZEMSwgMHg3NjkwLAotICAgIDB4OUJENiwgMHg2MzRDLCAweDkzMDYsIDB4OUJBQiwgMHg3NkJGLCAweDY2NTIsIDB4NEUwOSwgMHg1MDk4LAotICAgIDB4NTNDMiwgMHg1QzcxLCAweDYwRTgsIDB4NjQ5MiwgMHg2NTYzLCAweDY4NUYsIDB4NzFFNiwgMHg3M0NBLAotICAgIDB4NzUyMywgMHg3Qjk3LCAweDdFODIsIDB4ODY5NSwgMHg4QjgzLCAweDhDREIsIDB4OTE3OCwgMHg5OTEwLAotICAgIDB4NjVBQywgMHg2NkFCLCAweDZCOEIsIDB4NEVENSwgMHg0RUQ0LCAweDRGM0EsIDB4NEY3RiwgMHg1MjNBLAotICAgIDB4NTNGOCwgMHg1M0YyLCAweDU1RTMsIDB4NTZEQiwgMHg1OEVCLCAweDU5Q0IsIDB4NTlDOSwgMHg1OUZGLAotICAgIDB4NUI1MCwgMHg1QzRELCAweDVFMDIsIDB4NUUyQiwgMHg1RkQ3LCAweDYwMUQsIDB4NjMwNywgMHg2NTJGLAotICAgIDB4NUI1QywgMHg2NUFGLCAweDY1QkQsIDB4NjVFOCwgMHg2NzlELCAweDZCNjIsIDB4NkI3QiwgMHg2QzBGLAotICAgIDB4NzM0NSwgMHg3OTQ5LCAweDc5QzEsIDB4N0NGOCwgMHg3RDE5LCAweDdEMkIsIDB4ODBBMiwgMHg4MTAyLAotICAgIDB4ODFGMywgMHg4OTk2LCAweDhBNUUsIDB4OEE2OSwgMHg4QTY2LCAweDhBOEMsIDB4OEFFRSwgMHg4Q0M3LAotICAgIDB4OENEQywgMHg5NkNDLCAweDk4RkMsIDB4NkI2RiwgMHg0RThCLCAweDRGM0MsIDB4NEY4RCwgMHg1MTUwLAotICAgIDB4NUI1NywgMHg1QkZBLCAweDYxNDgsIDB4NjMwMSwgMHg2NjQyLCAweDZCMjEsIDB4NkVDQiwgMHg2Q0JCLAotICAgIDB4NzIzRSwgMHg3NEJELCAweDc1RDQsIDB4NzhDMSwgMHg3OTNBLCAweDgwMEMsIDB4ODAzMywgMHg4MUVBLAotICAgIDB4ODQ5NCwgMHg4RjlFLCAweDZDNTAsIDB4OUU3RiwgMHg1RjBGLCAweDhCNTgsIDB4OUQyQiwgMHg3QUZBLAotICAgIDB4OEVGOCwgMHg1QjhELCAweDk2RUIsIDB4NEUwMywgMHg1M0YxLCAweDU3RjcsIDB4NTkzMSwgMHg1QUM5LAotICAgIDB4NUJBNCwgMHg2MDg5LCAweDZFN0YsIDB4NkYwNiwgMHg3NUJFLCAweDhDRUEsIDB4NUI5RiwgMHg4NTAwLAotICAgIDB4N0JFMCwgMHg1MDcyLCAweDY3RjQsIDB4ODI5RCwgMHg1QzYxLCAweDg1NEEsIDB4N0UxRSwgMHg4MjBFLAotICAgIDB4NTE5OSwgMHg1QzA0LCAweDYzNjgsIDB4OEQ2NiwgMHg2NTlDLCAweDcxNkUsIDB4NzkzRSwgMHg3RDE3LAotICAgIDB4ODAwNSwgMHg4QjFELCAweDhFQ0EsIDB4OTA2RSwgMHg4NkM3LCAweDkwQUEsIDB4NTAxRiwgMHg1MkZBLAotICAgIDB4NUMzQSwgMHg2NzUzLCAweDcwN0MsIDB4NzIzNSwgMHg5MTRDLCAweDkxQzgsIDB4OTMyQiwgMHg4MkU1LAotICAgIDB4NUJDMiwgMHg1RjMxLCAweDYwRjksIDB4NEUzQiwgMHg1M0Q2LCAweDVCODgsIDB4NjI0QiwgMHg2NzMxLAotICAgIDB4NkI4QSwgMHg3MkU5LCAweDczRTAsIDB4N0EyRSwgMHg4MTZCLCAweDhEQTMsIDB4OTE1MiwgMHg5OTk2LAotICAgIDB4NTExMiwgMHg1M0Q3LCAweDU0NkEsIDB4NUJGRiwgMHg2Mzg4LCAweDZBMzksIDB4N0RBQywgMHg5NzAwLAotICAgIDB4NTZEQSwgMHg1M0NFLCAweDU0NjgsIDB4NUI5NywgMHg1QzMxLCAweDVEREUsIDB4NEZFRSwgMHg2MTAxLAotICAgIDB4NjJGRSwgMHg2RDMyLCAweDc5QzAsIDB4NzlDQiwgMHg3RDQyLCAweDdFNEQsIDB4N0ZEMiwgMHg4MUVELAotICAgIDB4ODIxRiwgMHg4NDkwLCAweDg4NDYsIDB4ODk3MiwgMHg4QjkwLCAweDhFNzQsIDB4OEYyRiwgMHg5MDMxLAotICAgIDB4OTE0QiwgMHg5MTZDLCAweDk2QzYsIDB4OTE5QywgMHg0RUMwLCAweDRGNEYsIDB4NTE0NSwgMHg1MzQxLAotICAgIDB4NUY5MywgMHg2MjBFLCAweDY3RDQsIDB4NkM0MSwgMHg2RTBCLCAweDczNjMsIDB4N0UyNiwgMHg5MUNELAotICAgIDB4OTI4MywgMHg1M0Q0LCAweDU5MTksIDB4NUJCRiwgMHg2REQxLCAweDc5NUQsIDB4N0UyRSwgMHg3QzlCLAotICAgIDB4NTg3RSwgMHg3MTlGLCAweDUxRkEsIDB4ODg1MywgMHg4RkYwLCAweDRGQ0EsIDB4NUNGQiwgMHg2NjI1LAotICAgIDB4NzdBQywgMHg3QUUzLCAweDgyMUMsIDB4OTlGRiwgMHg1MUM2LCAweDVGQUEsIDB4NjVFQywgMHg2OTZGLAotICAgIDB4NkI4OSwgMHg2REYzLCAweDZFOTYsIDB4NkY2NCwgMHg3NkZFLCAweDdEMTQsIDB4NURFMSwgMHg5MDc1LAotICAgIDB4OTE4NywgMHg5ODA2LCAweDUxRTYsIDB4NTIxRCwgMHg2MjQwLCAweDY2OTEsIDB4NjZEOSwgMHg2RTFBLAotICAgIDB4NUVCNiwgMHg3REQyLCAweDdGNzIsIDB4NjZGOCwgMHg4NUFGLCAweDg1RjcsIDB4OEFGOCwgMHg1MkE5LAotICAgIDB4NTNEOSwgMHg1OTczLCAweDVFOEYsIDB4NUY5MCwgMHg2MDU1LCAweDkyRTQsIDB4OTY2NCwgMHg1MEI3LAotICAgIDB4NTExRiwgMHg1MkRELCAweDUzMjAsIDB4NTM0NywgMHg1M0VDLCAweDU0RTgsIDB4NTU0NiwgMHg1NTMxLAotICAgIDB4NTYxNywgMHg1OTY4LCAweDU5QkUsIDB4NUEzQywgMHg1QkI1LCAweDVDMDYsIDB4NUMwRiwgMHg1QzExLAotICAgIDB4NUMxQSwgMHg1RTg0LCAweDVFOEEsIDB4NUVFMCwgMHg1RjcwLCAweDYyN0YsIDB4NjI4NCwgMHg2MkRCLAotICAgIDB4NjM4QywgMHg2Mzc3LCAweDY2MDcsIDB4NjYwQywgMHg2NjJELCAweDY2NzYsIDB4Njc3RSwgMHg2OEEyLAotICAgIDB4NkExRiwgMHg2QTM1LCAweDZDQkMsIDB4NkQ4OCwgMHg2RTA5LCAweDZFNTgsIDB4NzEzQywgMHg3MTI2LAotICAgIDB4NzE2NywgMHg3NUM3LCAweDc3MDEsIDB4Nzg1RCwgMHg3OTAxLCAweDc5NjUsIDB4NzlGMCwgMHg3QUUwLAotICAgIDB4N0IxMSwgMHg3Q0E3LCAweDdEMzksIDB4ODA5NiwgMHg4M0Q2LCAweDg0OEIsIDB4ODU0OSwgMHg4ODVELAotICAgIDB4ODhGMywgMHg4QTFGLCAweDhBM0MsIDB4OEE1NCwgMHg4QTczLCAweDhDNjEsIDB4OENERSwgMHg5MUE0LAotICAgIDB4OTI2NiwgMHg5MzdFLCAweDk0MTgsIDB4OTY5QywgMHg5Nzk4LCAweDRFMEEsIDB4NEUwOCwgMHg0RTFFLAotICAgIDB4NEU1NywgMHg1MTk3LCAweDUyNzAsIDB4NTdDRSwgMHg1ODM0LCAweDU4Q0MsIDB4NUIyMiwgMHg1RTM4LAotICAgIDB4NjBDNSwgMHg2NEZFLCAweDY3NjEsIDB4Njc1NiwgMHg2RDQ0LCAweDcyQjYsIDB4NzU3MywgMHg3QTYzLAotICAgIDB4ODRCOCwgMHg4QjcyLCAweDkxQjgsIDB4OTMyMCwgMHg1NjMxLCAweDU3RjQsIDB4OThGRSwgMHg2MkVELAotICAgIDB4NjkwRCwgMHg2Qjk2LCAweDcxRUQsIDB4N0U1NCwgMHg4MDc3LCAweDgyNzIsIDB4ODlFNiwgMHg5OERGLAotICAgIDB4ODc1NSwgMHg4RkIxLCAweDVDM0IsIDB4NEYzOCwgMHg0RkUxLCAweDRGQjUsIDB4NTUwNywgMHg1QTIwLAotICAgIDB4NUJERCwgMHg1QkU5LCAweDVGQzMsIDB4NjE0RSwgMHg2MzJGLCAweDY1QjAsIDB4NjY0QiwgMHg2OEVFLAotICAgIDB4Njk5QiwgMHg2RDc4LCAweDZERjEsIDB4NzUzMywgMHg3NUI5LCAweDc3MUYsIDB4Nzk1RSwgMHg3OUU2LAotICAgIDB4N0QzMywgMHg4MUUzLCAweDgyQUYsIDB4ODVBQSwgMHg4OUFBLCAweDhBM0EsIDB4OEVBQiwgMHg4RjlCLAotICAgIDB4OTAzMiwgMHg5MURELCAweDk3MDcsIDB4NEVCQSwgMHg0RUMxLCAweDUyMDMsIDB4NTg3NSwgMHg1OEVDLAotICAgIDB4NUMwQiwgMHg3NTFBLCAweDVDM0QsIDB4ODE0RSwgMHg4QTBBLCAweDhGQzUsIDB4OTY2MywgMHg5NzZELAotICAgIDB4N0IyNSwgMHg4QUNGLCAweDk4MDgsIDB4OTE2MiwgMHg1NkYzLCAweDUzQTgsIDB4OTAxNywgMHg1NDM5LAotICAgIDB4NTc4MiwgMHg1RTI1LCAweDYzQTgsIDB4NkMzNCwgMHg3MDhBLCAweDc3NjEsIDB4N0M4QiwgMHg3RkUwLAotICAgIDB4ODg3MCwgMHg5MDQyLCAweDkxNTQsIDB4OTMxMCwgMHg5MzE4LCAweDk2OEYsIDB4NzQ1RSwgMHg5QUM0LAotICAgIDB4NUQwNywgMHg1RDY5LCAweDY1NzAsIDB4NjdBMiwgMHg4REE4LCAweDk2REIsIDB4NjM2RSwgMHg2NzQ5LAotICAgIDB4NjkxOSwgMHg4M0M1LCAweDk4MTcsIDB4OTZDMCwgMHg4OEZFLCAweDZGODQsIDB4NjQ3QSwgMHg1QkY4LAotICAgIDB4NEUxNiwgMHg3MDJDLCAweDc1NUQsIDB4NjYyRiwgMHg1MUM0LCAweDUyMzYsIDB4NTJFMiwgMHg1OUQzLAotICAgIDB4NUY4MSwgMHg2MDI3LCAweDYyMTAsIDB4NjUzRiwgMHg2NTc0LCAweDY2MUYsIDB4NjY3NCwgMHg2OEYyLAotICAgIDB4NjgxNiwgMHg2QjYzLCAweDZFMDUsIDB4NzI3MiwgMHg3NTFGLCAweDc2REIsIDB4N0NCRSwgMHg4MDU2LAotICAgIDB4NThGMCwgMHg4OEZELCAweDg5N0YsIDB4OEFBMCwgMHg4QTkzLCAweDhBQ0IsIDB4OTAxRCwgMHg5MTkyLAotICAgIDB4OTc1MiwgMHg5NzU5LCAweDY1ODksIDB4N0EwRSwgMHg4MTA2LCAweDk2QkIsIDB4NUUyRCwgMHg2MERDLAotICAgIDB4NjIxQSwgMHg2NUE1LCAweDY2MTQsIDB4Njc5MCwgMHg3N0YzLCAweDdBNEQsIDB4N0M0RCwgMHg3RTNFLAotICAgIDB4ODEwQSwgMHg4Q0FDLCAweDhENjQsIDB4OERFMSwgMHg4RTVGLCAweDc4QTksIDB4NTIwNywgMHg2MkQ5LAotICAgIDB4NjNBNSwgMHg2NDQyLCAweDYyOTgsIDB4OEEyRCwgMHg3QTgzLCAweDdCQzAsIDB4OEFBQywgMHg5NkVBLAotICAgIDB4N0Q3NiwgMHg4MjBDLCAweDg3NDksIDB4NEVEOSwgMHg1MTQ4LCAweDUzNDMsIDB4NTM2MCwgMHg1QkEzLAotICAgIDB4NUMwMiwgMHg1QzE2LCAweDVEREQsIDB4NjIyNiwgMHg2MjQ3LCAweDY0QjAsIDB4NjgxMywgMHg2ODM0LAotICAgIDB4NkNDOSwgMHg2RDQ1LCAweDZEMTcsIDB4NjdEMywgMHg2RjVDLCAweDcxNEUsIDB4NzE3RCwgMHg2NUNCLAotICAgIDB4N0E3RiwgMHg3QkFELCAweDdEREEsIDB4N0U0QSwgMHg3RkE4LCAweDgxN0EsIDB4ODIxQiwgMHg4MjM5LAotICAgIDB4ODVBNiwgMHg4QTZFLCAweDhDQ0UsIDB4OERGNSwgMHg5MDc4LCAweDkwNzcsIDB4OTJBRCwgMHg5MjkxLAotICAgIDB4OTU4MywgMHg5QkFFLCAweDUyNEQsIDB4NTU4NCwgMHg2RjM4LCAweDcxMzYsIDB4NTE2OCwgMHg3OTg1LAotICAgIDB4N0U1NSwgMHg4MUIzLCAweDdDQ0UsIDB4NTY0QywgMHg1ODUxLCAweDVDQTgsIDB4NjNBQSwgMHg2NkZFLAotICAgIDB4NjZGRCwgMHg2OTVBLCAweDcyRDksIDB4NzU4RiwgMHg3NThFLCAweDc5MEUsIDB4Nzk1NiwgMHg3OURGLAotICAgIDB4N0M5NywgMHg3RDIwLCAweDdENDQsIDB4ODYwNywgMHg4QTM0LCAweDk2M0IsIDB4OTA2MSwgMHg5RjIwLAotICAgIDB4NTBFNywgMHg1Mjc1LCAweDUzQ0MsIDB4NTNFMiwgMHg1MDA5LCAweDU1QUEsIDB4NThFRSwgMHg1OTRGLAotICAgIDB4NzIzRCwgMHg1QjhCLCAweDVDNjQsIDB4NTMxRCwgMHg2MEUzLCAweDYwRjMsIDB4NjM1QywgMHg2MzgzLAotICAgIDB4NjMzRiwgMHg2M0JCLCAweDY0Q0QsIDB4NjVFOSwgMHg2NkY5LCAweDVERTMsIDB4NjlDRCwgMHg2OUZELAotICAgIDB4NkYxNSwgMHg3MUU1LCAweDRFODksIDB4NzVFOSwgMHg3NkY4LCAweDdBOTMsIDB4N0NERiwgMHg3RENGLAotICAgIDB4N0Q5QywgMHg4MDYxLCAweDgzNDksIDB4ODM1OCwgMHg4NDZDLCAweDg0QkMsIDB4ODVGQiwgMHg4OEM1LAotICAgIDB4OEQ3MCwgMHg5MDAxLCAweDkwNkQsIDB4OTM5NywgMHg5NzFDLCAweDlBMTIsIDB4NTBDRiwgMHg1ODk3LAotICAgIDB4NjE4RSwgMHg4MUQzLCAweDg1MzUsIDB4OEQwOCwgMHg5MDIwLCAweDRGQzMsIDB4NTA3NCwgMHg1MjQ3LAotICAgIDB4NTM3MywgMHg2MDZGLCAweDYzNDksIDB4Njc1RiwgMHg2RTJDLCAweDhEQjMsIDB4OTAxRiwgMHg0RkQ3LAotICAgIDB4NUM1RSwgMHg4Q0NBLCAweDY1Q0YsIDB4N0Q5QSwgMHg1MzUyLCAweDg4OTYsIDB4NTE3NiwgMHg2M0MzLAotICAgIDB4NUI1OCwgMHg1QjZCLCAweDVDMEEsIDB4NjQwRCwgMHg2NzUxLCAweDkwNUMsIDB4NEVENiwgMHg1OTFBLAotICAgIDB4NTkyQSwgMHg2QzcwLCAweDhBNTEsIDB4NTUzRSwgMHg1ODE1LCAweDU5QTUsIDB4NjBGMCwgMHg2MjUzLAotICAgIDB4NjdDMSwgMHg4MjM1LCAweDY5NTUsIDB4OTY0MCwgMHg5OUM0LCAweDlBMjgsIDB4NEY1MywgMHg1ODA2LAotICAgIDB4NUJGRSwgMHg4MDEwLCAweDVDQjEsIDB4NUUyRiwgMHg1Rjg1LCAweDYwMjAsIDB4NjE0QiwgMHg2MjM0LAotICAgIDB4NjZGRiwgMHg2Q0YwLCAweDZFREUsIDB4ODBDRSwgMHg4MTdGLCAweDgyRDQsIDB4ODg4QiwgMHg4Q0I4LAotICAgIDB4OTAwMCwgMHg5MDJFLCAweDk2OEEsIDB4OUVEQiwgMHg5QkRCLCAweDRFRTMsIDB4NTNGMCwgMHg1OTI3LAotICAgIDB4N0IyQywgMHg5MThELCAweDk4NEMsIDB4OURGOSwgMHg2RURELCAweDcwMjcsIDB4NTM1MywgMHg1NTQ0LAotICAgIDB4NUI4NSwgMHg2MjU4LCAweDYyOUUsIDB4NjJEMywgMHg2Q0EyLCAweDZGRUYsIDB4NzQyMiwgMHg4QTE3LAotICAgIDB4OTQzOCwgMHg2RkMxLCAweDhBRkUsIDB4ODMzOCwgMHg1MUU3LCAweDg2RjgsIDB4NTNFQSwgMHg1M0U5LAotICAgIDB4NEY0NiwgMHg5MDU0LCAweDhGQjAsIDB4NTk2QSwgMHg4MTMxLCAweDVERkQsIDB4N0FFQSwgMHg4RkJGLAotICAgIDB4NjhEQSwgMHg4QzM3LCAweDcyRjgsIDB4OUM0OCwgMHg2QTNELCAweDhBQjAsIDB4NEUzOSwgMHg1MzU4LAotICAgIDB4NTYwNiwgMHg1NzY2LCAweDYyQzUsIDB4NjNBMiwgMHg2NUU2LCAweDZCNEUsIDB4NkRFMSwgMHg2RTVCLAotICAgIDB4NzBBRCwgMHg3N0VELCAweDdBRUYsIDB4N0JBQSwgMHg3REJCLCAweDgwM0QsIDB4ODBDNiwgMHg4NkNCLAotICAgIDB4OEE5NSwgMHg5MzVCLCAweDU2RTMsIDB4NThDNywgMHg1RjNFLCAweDY1QUQsIDB4NjY5NiwgMHg2QTgwLAotICAgIDB4NkJCNSwgMHg3NTM3LCAweDhBQzcsIDB4NTAyNCwgMHg3N0U1LCAweDU3MzAsIDB4NUYxQiwgMHg2MDY1LAotICAgIDB4NjY3QSwgMHg2QzYwLCAweDc1RjQsIDB4N0ExQSwgMHg3RjZFLCAweDgxRjQsIDB4ODcxOCwgMHg5MDQ1LAotICAgIDB4OTlCMywgMHg3QkM5LCAweDc1NUMsIDB4N0FGOSwgMHg3QjUxLCAweDg0QzQsIDB4OTAxMCwgMHg3OUU5LAotICAgIDB4N0E5MiwgMHg4MzM2LCAweDVBRTEsIDB4Nzc0MCwgMHg0RTJELCAweDRFRjIsIDB4NUI5OSwgMHg1RkUwLAotICAgIDB4NjJCRCwgMHg2NjNDLCAweDY3RjEsIDB4NkNFOCwgMHg4NjZCLCAweDg4NzcsIDB4OEEzQiwgMHg5MTRFLAotICAgIDB4OTJGMywgMHg5OUQwLCAweDZBMTcsIDB4NzAyNiwgMHg3MzJBLCAweDgyRTcsIDB4ODQ1NywgMHg4Q0FGLAotICAgIDB4NEUwMSwgMHg1MTQ2LCAweDUxQ0IsIDB4NTU4QiwgMHg1QkY1LCAweDVFMTYsIDB4NUUzMywgMHg1RTgxLAotICAgIDB4NUYxNCwgMHg1RjM1LCAweDVGNkIsIDB4NUZCNCwgMHg2MUYyLCAweDYzMTEsIDB4NjZBMiwgMHg2NzFELAotICAgIDB4NkY2RSwgMHg3MjUyLCAweDc1M0EsIDB4NzczQSwgMHg4MDc0LCAweDgxMzksIDB4ODE3OCwgMHg4Nzc2LAotICAgIDB4OEFCRiwgMHg4QURDLCAweDhEODUsIDB4OERGMywgMHg5MjlBLCAweDk1NzcsIDB4OTgwMiwgMHg5Q0U1LAotICAgIDB4NTJDNSwgMHg2MzU3LCAweDc2RjQsIDB4NjcxNSwgMHg2Qzg4LCAweDczQ0QsIDB4OENDMywgMHg5M0FFLAotICAgIDB4OTY3MywgMHg2RDI1LCAweDU4OUMsIDB4NjkwRSwgMHg2OUNDLCAweDhGRkQsIDB4OTM5QSwgMHg3NURCLAotICAgIDB4OTAxQSwgMHg1ODVBLCAweDY4MDIsIDB4NjNCNCwgMHg2OUZCLCAweDRGNDMsIDB4NkYyQywgMHg2N0Q4LAotICAgIDB4OEZCQiwgMHg4NTI2LCAweDdEQjQsIDB4OTM1NCwgMHg2OTNGLCAweDZGNzAsIDB4NTc2QSwgMHg1OEY3LAotICAgIDB4NUIyQywgMHg3RDJDLCAweDcyMkEsIDB4NTQwQSwgMHg5MUUzLCAweDlEQjQsIDB4NEVBRCwgMHg0RjRFLAotICAgIDB4NTA1QywgMHg1MDc1LCAweDUyNDMsIDB4OEM5RSwgMHg1NDQ4LCAweDU4MjQsIDB4NUI5QSwgMHg1RTFELAotICAgIDB4NUU5NSwgMHg1RUFELCAweDVFRjcsIDB4NUYxRiwgMHg2MDhDLCAweDYyQjUsIDB4NjMzQSwgMHg2M0QwLAotICAgIDB4NjhBRiwgMHg2QzQwLCAweDc4ODcsIDB4Nzk4RSwgMHg3QTBCLCAweDdERTAsIDB4ODI0NywgMHg4QTAyLAotICAgIDB4OEFFNiwgMHg4RTQ0LCAweDkwMTMsIDB4OTBCOCwgMHg5MTJELCAweDkxRDgsIDB4OUYwRSwgMHg2Q0U1LAotICAgIDB4NjQ1OCwgMHg2NEUyLCAweDY1NzUsIDB4NkVGNCwgMHg3Njg0LCAweDdCMUIsIDB4OTA2OSwgMHg5M0QxLAotICAgIDB4NkVCQSwgMHg1NEYyLCAweDVGQjksIDB4NjRBNCwgMHg4RjRELCAweDhGRUQsIDB4OTI0NCwgMHg1MTc4LAotICAgIDB4NTg2QiwgMHg1OTI5LCAweDVDNTUsIDB4NUU5NywgMHg2REZCLCAweDdFOEYsIDB4NzUxQywgMHg4Q0JDLAotICAgIDB4OEVFMiwgMHg5ODVCLCAweDcwQjksIDB4NEYxRCwgMHg2QkJGLCAweDZGQjEsIDB4NzUzMCwgMHg5NkZCLAotICAgIDB4NTE0RSwgMHg1NDEwLCAweDU4MzUsIDB4NTg1NywgMHg1OUFDLCAweDVDNjAsIDB4NUY5MiwgMHg2NTk3LAotICAgIDB4Njc1QywgMHg2RTIxLCAweDc2N0IsIDB4ODNERiwgMHg4Q0VELCAweDkwMTQsIDB4OTBGRCwgMHg5MzRELAotICAgIDB4NzgyNSwgMHg3ODNBLCAweDUyQUEsIDB4NUVBNiwgMHg1NzFGLCAweDU5NzQsIDB4NjAxMiwgMHg1MDEyLAotICAgIDB4NTE1QSwgMHg1MUFDLCAweDUxQ0QsIDB4NTIwMCwgMHg1NTEwLCAweDU4NTQsIDB4NTg1OCwgMHg1OTU3LAotICAgIDB4NUI5NSwgMHg1Q0Y2LCAweDVEOEIsIDB4NjBCQywgMHg2Mjk1LCAweDY0MkQsIDB4Njc3MSwgMHg2ODQzLAotICAgIDB4NjhCQywgMHg2OERGLCAweDc2RDcsIDB4NkREOCwgMHg2RTZGLCAweDZEOUIsIDB4NzA2RiwgMHg3MUM4LAotICAgIDB4NUY1MywgMHg3NUQ4LCAweDc5NzcsIDB4N0I0OSwgMHg3QjU0LCAweDdCNTIsIDB4N0NENiwgMHg3RDcxLAotICAgIDB4NTIzMCwgMHg4NDYzLCAweDg1NjksIDB4ODVFNCwgMHg4QTBFLCAweDhCMDQsIDB4OEM0NiwgMHg4RTBGLAotICAgIDB4OTAwMywgMHg5MDBGLCAweDk0MTksIDB4OTY3NiwgMHg5ODJELCAweDlBMzAsIDB4OTVEOCwgMHg1MENELAotICAgIDB4NTJENSwgMHg1NDBDLCAweDU4MDIsIDB4NUMwRSwgMHg2MUE3LCAweDY0OUUsIDB4NkQxRSwgMHg3N0IzLAotICAgIDB4N0FFNSwgMHg4MEY0LCAweDg0MDQsIDB4OTA1MywgMHg5Mjg1LCAweDVDRTAsIDB4OUQwNywgMHg1MzNGLAotICAgIDB4NUY5NywgMHg1RkIzLCAweDZEOUMsIDB4NzI3OSwgMHg3NzYzLCAweDc5QkYsIDB4N0JFNCwgMHg2QkQyLAotICAgIDB4NzJFQywgMHg4QUFELCAweDY4MDMsIDB4NkE2MSwgMHg1MUY4LCAweDdBODEsIDB4NjkzNCwgMHg1QzRBLAotICAgIDB4OUNGNiwgMHg4MkVCLCAweDVCQzUsIDB4OTE0OSwgMHg3MDFFLCAweDU2NzgsIDB4NUM2RiwgMHg2MEM3LAotICAgIDB4NjU2NiwgMHg2QzhDLCAweDhDNUEsIDB4OTA0MSwgMHg5ODEzLCAweDU0NTEsIDB4NjZDNywgMHg5MjBELAotICAgIDB4NTk0OCwgMHg5MEEzLCAweDUxODUsIDB4NEU0RCwgMHg1MUVBLCAweDg1OTksIDB4OEIwRSwgMHg3MDU4LAotICAgIDB4NjM3QSwgMHg5MzRCLCAweDY5NjIsIDB4OTlCNCwgMHg3RTA0LCAweDc1NzcsIDB4NTM1NywgMHg2OTYwLAotICAgIDB4OEVERiwgMHg5NkUzLCAweDZDNUQsIDB4NEU4QywgMHg1QzNDLCAweDVGMTAsIDB4OEZFOSwgMHg1MzAyLAotICAgIDB4OENEMSwgMHg4MDg5LCAweDg2NzksIDB4NUVGRiwgMHg2NUU1LCAweDRFNzMsIDB4NTE2NSwgMHg1OTgyLAotICAgIDB4NUMzRiwgMHg5N0VFLCAweDRFRkIsIDB4NTk4QSwgMHg1RkNELCAweDhBOEQsIDB4NkZFMSwgMHg3OUIwLAotICAgIDB4Nzk2MiwgMHg1QkU3LCAweDg0NzEsIDB4NzMyQiwgMHg3MUIxLCAweDVFNzQsIDB4NUZGNSwgMHg2MzdCLAotICAgIDB4NjQ5QSwgMHg3MUMzLCAweDdDOTgsIDB4NEU0MywgMHg1RUZDLCAweDRFNEIsIDB4NTdEQywgMHg1NkEyLAotICAgIDB4NjBBOSwgMHg2RkMzLCAweDdEMEQsIDB4ODBGRCwgMHg4MTMzLCAweDgxQkYsIDB4OEZCMiwgMHg4OTk3LAotICAgIDB4ODZBNCwgMHg1REY0LCAweDYyOEEsIDB4NjRBRCwgMHg4OTg3LCAweDY3NzcsIDB4NkNFMiwgMHg2RDNFLAotICAgIDB4NzQzNiwgMHg3ODM0LCAweDVBNDYsIDB4N0Y3NSwgMHg4MkFELCAweDk5QUMsIDB4NEZGMywgMHg1RUMzLAotICAgIDB4NjJERCwgMHg2MzkyLCAweDY1NTcsIDB4Njc2RiwgMHg3NkMzLCAweDcyNEMsIDB4ODBDQywgMHg4MEJBLAotICAgIDB4OEYyOSwgMHg5MTRELCAweDUwMEQsIDB4NTdGOSwgMHg1QTkyLCAweDY4ODUsIDB4Njk3MywgMHg3MTY0LAotICAgIDB4NzJGRCwgMHg4Q0I3LCAweDU4RjIsIDB4OENFMCwgMHg5NjZBLCAweDkwMTksIDB4ODc3RiwgMHg3OUU0LAotICAgIDB4NzdFNywgMHg4NDI5LCAweDRGMkYsIDB4NTI2NSwgMHg1MzVBLCAweDYyQ0QsIDB4NjdDRiwgMHg2Q0NBLAotICAgIDB4NzY3RCwgMHg3Qjk0LCAweDdDOTUsIDB4ODIzNiwgMHg4NTg0LCAweDhGRUIsIDB4NjZERCwgMHg2RjIwLAotICAgIDB4NzIwNiwgMHg3RTFCLCAweDgzQUIsIDB4OTlDMSwgMHg5RUE2LCAweDUxRkQsIDB4N0JCMSwgMHg3ODcyLAotICAgIDB4N0JCOCwgMHg4MDg3LCAweDdCNDgsIDB4NkFFOCwgMHg1RTYxLCAweDgwOEMsIDB4NzU1MSwgMHg3NTYwLAotICAgIDB4NTE2QiwgMHg5MjYyLCAweDZFOEMsIDB4NzY3QSwgMHg5MTk3LCAweDlBRUEsIDB4NEYxMCwgMHg3RjcwLAotICAgIDB4NjI5QywgMHg3QjRGLCAweDk1QTUsIDB4OUNFOSwgMHg1NjdBLCAweDU4NTksIDB4ODZFNCwgMHg5NkJDLAotICAgIDB4NEYzNCwgMHg1MjI0LCAweDUzNEEsIDB4NTNDRCwgMHg1M0RCLCAweDVFMDYsIDB4NjQyQywgMHg2NTkxLAotICAgIDB4Njc3RiwgMHg2QzNFLCAweDZDNEUsIDB4NzI0OCwgMHg3MkFGLCAweDczRUQsIDB4NzU1NCwgMHg3RTQxLAotICAgIDB4ODIyQywgMHg4NUU5LCAweDhDQTksIDB4N0JDNCwgMHg5MUM2LCAweDcxNjksIDB4OTgxMiwgMHg5OEVGLAotICAgIDB4NjMzRCwgMHg2NjY5LCAweDc1NkEsIDB4NzZFNCwgMHg3OEQwLCAweDg1NDMsIDB4ODZFRSwgMHg1MzJBLAotICAgIDB4NTM1MSwgMHg1NDI2LCAweDU5ODMsIDB4NUU4NywgMHg1RjdDLCAweDYwQjIsIDB4NjI0OSwgMHg2Mjc5LAotICAgIDB4NjJBQiwgMHg2NTkwLCAweDZCRDQsIDB4NkNDQywgMHg3NUIyLCAweDc2QUUsIDB4Nzg5MSwgMHg3OUQ4LAotICAgIDB4N0RDQiwgMHg3Rjc3LCAweDgwQTUsIDB4ODhBQiwgMHg4QUI5LCAweDhDQkIsIDB4OTA3RiwgMHg5NzVFLAotICAgIDB4OThEQiwgMHg2QTBCLCAweDdDMzgsIDB4NTA5OSwgMHg1QzNFLCAweDVGQUUsIDB4Njc4NywgMHg2QkQ4LAotICAgIDB4NzQzNSwgMHg3NzA5LCAweDdGOEUsIDB4OUYzQiwgMHg2N0NBLCAweDdBMTcsIDB4NTMzOSwgMHg3NThCLAotICAgIDB4OUFFRCwgMHg1RjY2LCAweDgxOUQsIDB4ODNGMSwgMHg4MDk4LCAweDVGM0MsIDB4NUZDNSwgMHg3NTYyLAotICAgIDB4N0I0NiwgMHg5MDNDLCAweDY4NjcsIDB4NTlFQiwgMHg1QTlCLCAweDdEMTAsIDB4NzY3RSwgMHg4QjJDLAotICAgIDB4NEZGNSwgMHg1RjZBLCAweDZBMTksIDB4NkMzNywgMHg2RjAyLCAweDc0RTIsIDB4Nzk2OCwgMHg4ODY4LAotICAgIDB4OEE1NSwgMHg4Qzc5LCAweDVFREYsIDB4NjNDRiwgMHg3NUM1LCAweDc5RDIsIDB4ODJENywgMHg5MzI4LAotICAgIDB4OTJGMiwgMHg4NDlDLCAweDg2RUQsIDB4OUMyRCwgMHg1NEMxLCAweDVGNkMsIDB4NjU4QywgMHg2RDVDLAotICAgIDB4NzAxNSwgMHg4Q0E3LCAweDhDRDMsIDB4OTgzQiwgMHg2NTRGLCAweDc0RjYsIDB4NEUwRCwgMHg0RUQ4LAotICAgIDB4NTdFMCwgMHg1OTJCLCAweDVBNjYsIDB4NUJDQywgMHg1MUE4LCAweDVFMDMsIDB4NUU5QywgMHg2MDE2LAotICAgIDB4NjI3NiwgMHg2NTc3LCAweDY1QTcsIDB4NjY2RSwgMHg2RDZFLCAweDcyMzYsIDB4N0IyNiwgMHg4MTUwLAotICAgIDB4ODE5QSwgMHg4Mjk5LCAweDhCNUMsIDB4OENBMCwgMHg4Q0U2LCAweDhENzQsIDB4OTYxQywgMHg5NjQ0LAotICAgIDB4NEZBRSwgMHg2NEFCLCAweDZCNjYsIDB4ODIxRSwgMHg4NDYxLCAweDg1NkEsIDB4OTBFOCwgMHg1QzAxLAotICAgIDB4Njk1MywgMHg5OEE4LCAweDg0N0EsIDB4ODU1NywgMHg0RjBGLCAweDUyNkYsIDB4NUZBOSwgMHg1RTQ1LAotICAgIDB4NjcwRCwgMHg3OThGLCAweDgxNzksIDB4ODkwNywgMHg4OTg2LCAweDZERjUsIDB4NUYxNywgMHg2MjU1LAotICAgIDB4NkNCOCwgMHg0RUNGLCAweDcyNjksIDB4OUI5MiwgMHg1MjA2LCAweDU0M0IsIDB4NTY3NCwgMHg1OEIzLAotICAgIDB4NjFBNCwgMHg2MjZFLCAweDcxMUEsIDB4NTk2RSwgMHg3Qzg5LCAweDdDREUsIDB4N0QxQiwgMHg5NkYwLAotICAgIDB4NjU4NywgMHg4MDVFLCAweDRFMTksIDB4NEY3NSwgMHg1MTc1LCAweDU4NDAsIDB4NUU2MywgMHg1RTczLAotICAgIDB4NUYwQSwgMHg2N0M0LCAweDRFMjYsIDB4ODUzRCwgMHg5NTg5LCAweDk2NUIsIDB4N0M3MywgMHg5ODAxLAotICAgIDB4NTBGQiwgMHg1OEMxLCAweDc2NTYsIDB4NzhBNywgMHg1MjI1LCAweDc3QTUsIDB4ODUxMSwgMHg3Qjg2LAotICAgIDB4NTA0RiwgMHg1OTA5LCAweDcyNDcsIDB4N0JDNywgMHg3REU4LCAweDhGQkEsIDB4OEZENCwgMHg5MDRELAotICAgIDB4NEZCRiwgMHg1MkM5LCAweDVBMjksIDB4NUYwMSwgMHg5N0FELCAweDRGREQsIDB4ODIxNywgMHg5MkVBLAotICAgIDB4NTcwMywgMHg2MzU1LCAweDZCNjksIDB4NzUyQiwgMHg4OERDLCAweDhGMTQsIDB4N0E0MiwgMHg1MkRGLAotICAgIDB4NTg5MywgMHg2MTU1LCAweDYyMEEsIDB4NjZBRSwgMHg2QkNELCAweDdDM0YsIDB4ODNFOSwgMHg1MDIzLAotICAgIDB4NEZGOCwgMHg1MzA1LCAweDU0NDYsIDB4NTgzMSwgMHg1OTQ5LCAweDVCOUQsIDB4NUNGMCwgMHg1Q0VGLAotICAgIDB4NUQyOSwgMHg1RTk2LCAweDYyQjEsIDB4NjM2NywgMHg2NTNFLCAweDY1QjksIDB4NjcwQiwgMHg2Q0Q1LAotICAgIDB4NkNFMSwgMHg3MEY5LCAweDc4MzIsIDB4N0UyQiwgMHg4MERFLCAweDgyQjMsIDB4ODQwQywgMHg4NEVDLAotICAgIDB4ODcwMiwgMHg4OTEyLCAweDhBMkEsIDB4OEM0QSwgMHg5MEE2LCAweDkyRDIsIDB4OThGRCwgMHg5Q0YzLAotICAgIDB4OUQ2QywgMHg0RTRGLCAweDRFQTEsIDB4NTA4RCwgMHg1MjU2LCAweDU3NEEsIDB4NTlBOCwgMHg1RTNELAotICAgIDB4NUZEOCwgMHg1RkQ5LCAweDYyM0YsIDB4NjZCNCwgMHg2NzFCLCAweDY3RDAsIDB4NjhEMiwgMHg1MTkyLAotICAgIDB4N0QyMSwgMHg4MEFBLCAweDgxQTgsIDB4OEIwMCwgMHg4QzhDLCAweDhDQkYsIDB4OTI3RSwgMHg5NjMyLAotICAgIDB4NTQyMCwgMHg5ODJDLCAweDUzMTcsIDB4NTBENSwgMHg1MzVDLCAweDU4QTgsIDB4NjRCMiwgMHg2NzM0LAotICAgIDB4NzI2NywgMHg3NzY2LCAweDdBNDYsIDB4OTFFNiwgMHg1MkMzLCAweDZDQTEsIDB4NkI4NiwgMHg1ODAwLAotICAgIDB4NUU0QywgMHg1OTU0LCAweDY3MkMsIDB4N0ZGQiwgMHg1MUUxLCAweDc2QzYsIDB4NjQ2OSwgMHg3OEU4LAotICAgIDB4OUI1NCwgMHg5RUJCLCAweDU3Q0IsIDB4NTlCOSwgMHg2NjI3LCAweDY3OUEsIDB4NkJDRSwgMHg1NEU5LAotICAgIDB4NjlEOSwgMHg1RTU1LCAweDgxOUMsIDB4Njc5NSwgMHg5QkFBLCAweDY3RkUsIDB4OUM1MiwgMHg2ODVELAotICAgIDB4NEVBNiwgMHg0RkUzLCAweDUzQzgsIDB4NjJCOSwgMHg2NzJCLCAweDZDQUIsIDB4OEZDNCwgMHg0RkFELAotICAgIDB4N0U2RCwgMHg5RUJGLCAweDRFMDcsIDB4NjE2MiwgMHg2RTgwLCAweDZGMkIsIDB4ODUxMywgMHg1NDczLAotICAgIDB4NjcyQSwgMHg5QjQ1LCAweDVERjMsIDB4N0I5NSwgMHg1Q0FDLCAweDVCQzYsIDB4ODcxQywgMHg2RTRBLAotICAgIDB4ODREMSwgMHg3QTE0LCAweDgxMDgsIDB4NTk5OSwgMHg3QzhELCAweDZDMTEsIDB4NzcyMCwgMHg1MkQ5LAotICAgIDB4NTkyMiwgMHg3MTIxLCAweDcyNUYsIDB4NzdEQiwgMHg5NzI3LCAweDlENjEsIDB4NjkwQiwgMHg1QTdGLAotICAgIDB4NUExOCwgMHg1MUE1LCAweDU0MEQsIDB4NTQ3RCwgMHg2NjBFLCAweDc2REYsIDB4OEZGNywgMHg5Mjk4LAotICAgIDB4OUNGNCwgMHg1OUVBLCAweDcyNUQsIDB4NkVDNSwgMHg1MTRELCAweDY4QzksIDB4N0RCRiwgMHg3REVDLAotICAgIDB4OTc2MiwgMHg5RUJBLCAweDY0NzgsIDB4NkEyMSwgMHg4MzAyLCAweDU5ODQsIDB4NUI1RiwgMHg2QkRCLAotICAgIDB4NzMxQiwgMHg3NkYyLCAweDdEQjIsIDB4ODAxNywgMHg4NDk5LCAweDUxMzIsIDB4NjcyOCwgMHg5RUQ5LAotICAgIDB4NzZFRSwgMHg2NzYyLCAweDUyRkYsIDB4OTkwNSwgMHg1QzI0LCAweDYyM0IsIDB4N0M3RSwgMHg4Q0IwLAotICAgIDB4NTU0RiwgMHg2MEI2LCAweDdEMEIsIDB4OTU4MCwgMHg1MzAxLCAweDRFNUYsIDB4NTFCNiwgMHg1OTFDLAotICAgIDB4NzIzQSwgMHg4MDM2LCAweDkxQ0UsIDB4NUYyNSwgMHg3N0UyLCAweDUzODQsIDB4NUY3OSwgMHg3RDA0LAotICAgIDB4ODVBQywgMHg4QTMzLCAweDhFOEQsIDB4OTc1NiwgMHg2N0YzLCAweDg1QUUsIDB4OTQ1MywgMHg2MTA5LAotICAgIDB4NjEwOCwgMHg2Q0I5LCAweDc2NTIsIDB4OEFFRCwgMHg4RjM4LCAweDU1MkYsIDB4NEY1MSwgMHg1MTJBLAotICAgIDB4NTJDNywgMHg1M0NCLCAweDVCQTUsIDB4NUU3RCwgMHg2MEEwLCAweDYxODIsIDB4NjNENiwgMHg2NzA5LAotICAgIDB4NjdEQSwgMHg2RTY3LCAweDZEOEMsIDB4NzMzNiwgMHg3MzM3LCAweDc1MzEsIDB4Nzk1MCwgMHg4OEQ1LAotICAgIDB4OEE5OCwgMHg5MDRBLCAweDkwOTEsIDB4OTBGNSwgMHg5NkM0LCAweDg3OEQsIDB4NTkxNSwgMHg0RTg4LAotICAgIDB4NEY1OSwgMHg0RTBFLCAweDhBODksIDB4OEYzRiwgMHg5ODEwLCAweDUwQUQsIDB4NUU3QywgMHg1OTk2LAotICAgIDB4NUJCOSwgMHg1RUI4LCAweDYzREEsIDB4NjNGQSwgMHg2NEMxLCAweDY2REMsIDB4Njk0QSwgMHg2OUQ4LAotICAgIDB4NkQwQiwgMHg2RUI2LCAweDcxOTQsIDB4NzUyOCwgMHg3QUFGLCAweDdGOEEsIDB4ODAwMCwgMHg4NDQ5LAotICAgIDB4ODRDOSwgMHg4OTgxLCAweDhCMjEsIDB4OEUwQSwgMHg5MDY1LCAweDk2N0QsIDB4OTkwQSwgMHg2MTdFLAotICAgIDB4NjI5MSwgMHg2QjMyLCAweDZDODMsIDB4NkQ3NCwgMHg3RkNDLCAweDdGRkMsIDB4NkRDMCwgMHg3Rjg1LAotICAgIDB4ODdCQSwgMHg4OEY4LCAweDY3NjUsIDB4ODNCMSwgMHg5ODNDLCAweDk2RjcsIDB4NkQxQiwgMHg3RDYxLAotICAgIDB4ODQzRCwgMHg5MTZBLCAweDRFNzEsIDB4NTM3NSwgMHg1RDUwLCAweDZCMDQsIDB4NkZFQiwgMHg4NUNELAotICAgIDB4ODYyRCwgMHg4OUE3LCAweDUyMjksIDB4NTQwRiwgMHg1QzY1LCAweDY3NEUsIDB4NjhBOCwgMHg3NDA2LAotICAgIDB4NzQ4MywgMHg3NUUyLCAweDg4Q0YsIDB4ODhFMSwgMHg5MUNDLCAweDk2RTIsIDB4OTY3OCwgMHg1RjhCLAotICAgIDB4NzM4NywgMHg3QUNCLCAweDg0NEUsIDB4NjNBMCwgMHg3NTY1LCAweDUyODksIDB4NkQ0MSwgMHg2RTlDLAotICAgIDB4NzQwOSwgMHg3NTU5LCAweDc4NkIsIDB4N0M5MiwgMHg5Njg2LCAweDdBREMsIDB4OUY4RCwgMHg0RkI2LAotICAgIDB4NjE2RSwgMHg2NUM1LCAweDg2NUMsIDB4NEU4NiwgMHg0RUFFLCAweDUwREEsIDB4NEUyMSwgMHg1MUNDLAotICAgIDB4NUJFRSwgMHg2NTk5LCAweDY4ODEsIDB4NkRCQywgMHg3MzFGLCAweDc2NDIsIDB4NzdBRCwgMHg3QTFDLAotICAgIDB4N0NFNywgMHg4MjZGLCAweDhBRDIsIDB4OTA3QywgMHg5MUNGLCAweDk2NzUsIDB4OTgxOCwgMHg1MjlCLAotICAgIDB4N0REMSwgMHg1MDJCLCAweDUzOTgsIDB4Njc5NywgMHg2RENCLCAweDcxRDAsIDB4NzQzMywgMHg4MUU4LAotICAgIDB4OEYyQSwgMHg5NkEzLCAweDlDNTcsIDB4OUU5RiwgMHg3NDYwLCAweDU4NDEsIDB4NkQ5OSwgMHg3RDJGLAotICAgIDB4OTg1RSwgMHg0RUU0LCAweDRGMzYsIDB4NEY4QiwgMHg1MUI3LCAweDUyQjEsIDB4NURCQSwgMHg2MDFDLAotICAgIDB4NzNCMiwgMHg3OTNDLCAweDgyRDMsIDB4OTIzNCwgMHg5NkI3LCAweDk2RjYsIDB4OTcwQSwgMHg5RTk3LAotICAgIDB4OUY2MiwgMHg2NkE2LCAweDZCNzQsIDB4NTIxNywgMHg1MkEzLCAweDcwQzgsIDB4ODhDMiwgMHg1RUM5LAotICAgIDB4NjA0QiwgMHg2MTkwLCAweDZGMjMsIDB4NzE0OSwgMHg3QzNFLCAweDdERjQsIDB4ODA2RiwgMHg4NEVFLAotICAgIDB4OTAyMywgMHg5MzJDLCAweDU0NDIsIDB4OUI2RiwgMHg2QUQzLCAweDcwODksIDB4OENDMiwgMHg4REVGLAotICAgIDB4OTczMiwgMHg1MkI0LCAweDVBNDEsIDB4NUVDQSwgMHg1RjA0LCAweDY3MTcsIDB4Njk3QywgMHg2OTk0LAotICAgIDB4NkQ2QSwgMHg2RjBGLCAweDcyNjIsIDB4NzJGQywgMHg3QkVELCAweDgwMDEsIDB4ODA3RSwgMHg4NzRCLAotICAgIDB4OTBDRSwgMHg1MTZELCAweDlFOTMsIDB4Nzk4NCwgMHg4MDhCLCAweDkzMzIsIDB4OEFENiwgMHg1MDJELAotICAgIDB4NTQ4QywgMHg4QTcxLCAweDZCNkEsIDB4OENDNCwgMHg4MTA3LCAweDYwRDEsIDB4NjdBMCwgMHg5REYyLAotICAgIDB4NEU5OSwgMHg0RTk4LCAweDlDMTAsIDB4OEE2QiwgMHg4NUMxLCAweDg1NjgsIDB4NjkwMCwgMHg2RTdFLAotICAgIDB4Nzg5NywgMHg4MTU1LCAweDVGMEMsIDB4NEUxMCwgMHg0RTE1LCAweDRFMkEsIDB4NEUzMSwgMHg0RTM2LAotICAgIDB4NEUzQywgMHg0RTNGLCAweDRFNDIsIDB4NEU1NiwgMHg0RTU4LCAweDRFODIsIDB4NEU4NSwgMHg4QzZCLAotICAgIDB4NEU4QSwgMHg4MjEyLCAweDVGMEQsIDB4NEU4RSwgMHg0RTlFLCAweDRFOUYsIDB4NEVBMCwgMHg0RUEyLAotICAgIDB4NEVCMCwgMHg0RUIzLCAweDRFQjYsIDB4NEVDRSwgMHg0RUNELCAweDRFQzQsIDB4NEVDNiwgMHg0RUMyLAotICAgIDB4NEVENywgMHg0RURFLCAweDRFRUQsIDB4NEVERiwgMHg0RUY3LCAweDRGMDksIDB4NEY1QSwgMHg0RjMwLAotICAgIDB4NEY1QiwgMHg0RjVELCAweDRGNTcsIDB4NEY0NywgMHg0Rjc2LCAweDRGODgsIDB4NEY4RiwgMHg0Rjk4LAotICAgIDB4NEY3QiwgMHg0RjY5LCAweDRGNzAsIDB4NEY5MSwgMHg0RjZGLCAweDRGODYsIDB4NEY5NiwgMHg1MTE4LAotICAgIDB4NEZENCwgMHg0RkRGLCAweDRGQ0UsIDB4NEZEOCwgMHg0RkRCLCAweDRGRDEsIDB4NEZEQSwgMHg0RkQwLAotICAgIDB4NEZFNCwgMHg0RkU1LCAweDUwMUEsIDB4NTAyOCwgMHg1MDE0LCAweDUwMkEsIDB4NTAyNSwgMHg1MDA1LAotICAgIDB4NEYxQywgMHg0RkY2LCAweDUwMjEsIDB4NTAyOSwgMHg1MDJDLCAweDRGRkUsIDB4NEZFRiwgMHg1MDExLAotICAgIDB4NTAwNiwgMHg1MDQzLCAweDUwNDcsIDB4NjcwMywgMHg1MDU1LCAweDUwNTAsIDB4NTA0OCwgMHg1MDVBLAotICAgIDB4NTA1NiwgMHg1MDZDLCAweDUwNzgsIDB4NTA4MCwgMHg1MDlBLCAweDUwODUsIDB4NTBCNCwgMHg1MEIyLAotICAgIDB4NTBDOSwgMHg1MENBLCAweDUwQjMsIDB4NTBDMiwgMHg1MEQ2LCAweDUwREUsIDB4NTBFNSwgMHg1MEVELAotICAgIDB4NTBFMywgMHg1MEVFLCAweDUwRjksIDB4NTBGNSwgMHg1MTA5LCAweDUxMDEsIDB4NTEwMiwgMHg1MTE2LAotICAgIDB4NTExNSwgMHg1MTE0LCAweDUxMUEsIDB4NTEyMSwgMHg1MTNBLCAweDUxMzcsIDB4NTEzQywgMHg1MTNCLAotICAgIDB4NTEzRiwgMHg1MTQwLCAweDUxNTIsIDB4NTE0QywgMHg1MTU0LCAweDUxNjIsIDB4N0FGOCwgMHg1MTY5LAotICAgIDB4NTE2QSwgMHg1MTZFLCAweDUxODAsIDB4NTE4MiwgMHg1NkQ4LCAweDUxOEMsIDB4NTE4OSwgMHg1MThGLAotICAgIDB4NTE5MSwgMHg1MTkzLCAweDUxOTUsIDB4NTE5NiwgMHg1MUE0LCAweDUxQTYsIDB4NTFBMiwgMHg1MUE5LAotICAgIDB4NTFBQSwgMHg1MUFCLCAweDUxQjMsIDB4NTFCMSwgMHg1MUIyLCAweDUxQjAsIDB4NTFCNSwgMHg1MUJELAotICAgIDB4NTFDNSwgMHg1MUM5LCAweDUxREIsIDB4NTFFMCwgMHg4NjU1LCAweDUxRTksIDB4NTFFRCwgMHg1MUYwLAotICAgIDB4NTFGNSwgMHg1MUZFLCAweDUyMDQsIDB4NTIwQiwgMHg1MjE0LCAweDUyMEUsIDB4NTIyNywgMHg1MjJBLAotICAgIDB4NTIyRSwgMHg1MjMzLCAweDUyMzksIDB4NTI0RiwgMHg1MjQ0LCAweDUyNEIsIDB4NTI0QywgMHg1MjVFLAotICAgIDB4NTI1NCwgMHg1MjZBLCAweDUyNzQsIDB4NTI2OSwgMHg1MjczLCAweDUyN0YsIDB4NTI3RCwgMHg1MjhELAotICAgIDB4NTI5NCwgMHg1MjkyLCAweDUyNzEsIDB4NTI4OCwgMHg1MjkxLCAweDhGQTgsIDB4OEZBNywgMHg1MkFDLAotICAgIDB4NTJBRCwgMHg1MkJDLCAweDUyQjUsIDB4NTJDMSwgMHg1MkNELCAweDUyRDcsIDB4NTJERSwgMHg1MkUzLAotICAgIDB4NTJFNiwgMHg5OEVELCAweDUyRTAsIDB4NTJGMywgMHg1MkY1LCAweDUyRjgsIDB4NTJGOSwgMHg1MzA2LAotICAgIDB4NTMwOCwgMHg3NTM4LCAweDUzMEQsIDB4NTMxMCwgMHg1MzBGLCAweDUzMTUsIDB4NTMxQSwgMHg1MzIzLAotICAgIDB4NTMyRiwgMHg1MzMxLCAweDUzMzMsIDB4NTMzOCwgMHg1MzQwLCAweDUzNDYsIDB4NTM0NSwgMHg0RTE3LAotICAgIDB4NTM0OSwgMHg1MzRELCAweDUxRDYsIDB4NTM1RSwgMHg1MzY5LCAweDUzNkUsIDB4NTkxOCwgMHg1MzdCLAotICAgIDB4NTM3NywgMHg1MzgyLCAweDUzOTYsIDB4NTNBMCwgMHg1M0E2LCAweDUzQTUsIDB4NTNBRSwgMHg1M0IwLAotICAgIDB4NTNCNiwgMHg1M0MzLCAweDdDMTIsIDB4OTZEOSwgMHg1M0RGLCAweDY2RkMsIDB4NzFFRSwgMHg1M0VFLAotICAgIDB4NTNFOCwgMHg1M0VELCAweDUzRkEsIDB4NTQwMSwgMHg1NDNELCAweDU0NDAsIDB4NTQyQywgMHg1NDJELAotICAgIDB4NTQzQywgMHg1NDJFLCAweDU0MzYsIDB4NTQyOSwgMHg1NDFELCAweDU0NEUsIDB4NTQ4RiwgMHg1NDc1LAotICAgIDB4NTQ4RSwgMHg1NDVGLCAweDU0NzEsIDB4NTQ3NywgMHg1NDcwLCAweDU0OTIsIDB4NTQ3QiwgMHg1NDgwLAotICAgIDB4NTQ3NiwgMHg1NDg0LCAweDU0OTAsIDB4NTQ4NiwgMHg1NEM3LCAweDU0QTIsIDB4NTRCOCwgMHg1NEE1LAotICAgIDB4NTRBQywgMHg1NEM0LCAweDU0QzgsIDB4NTRBOCwgMHg1NEFCLCAweDU0QzIsIDB4NTRBNCwgMHg1NEJFLAotICAgIDB4NTRCQywgMHg1NEQ4LCAweDU0RTUsIDB4NTRFNiwgMHg1NTBGLCAweDU1MTQsIDB4NTRGRCwgMHg1NEVFLAotICAgIDB4NTRFRCwgMHg1NEZBLCAweDU0RTIsIDB4NTUzOSwgMHg1NTQwLCAweDU1NjMsIDB4NTU0QywgMHg1NTJFLAotICAgIDB4NTU1QywgMHg1NTQ1LCAweDU1NTYsIDB4NTU1NywgMHg1NTM4LCAweDU1MzMsIDB4NTU1RCwgMHg1NTk5LAotICAgIDB4NTU4MCwgMHg1NEFGLCAweDU1OEEsIDB4NTU5RiwgMHg1NTdCLCAweDU1N0UsIDB4NTU5OCwgMHg1NTlFLAotICAgIDB4NTVBRSwgMHg1NTdDLCAweDU1ODMsIDB4NTVBOSwgMHg1NTg3LCAweDU1QTgsIDB4NTVEQSwgMHg1NUM1LAotICAgIDB4NTVERiwgMHg1NUM0LCAweDU1REMsIDB4NTVFNCwgMHg1NUQ0LCAweDU2MTQsIDB4NTVGNywgMHg1NjE2LAotICAgIDB4NTVGRSwgMHg1NUZELCAweDU2MUIsIDB4NTVGOSwgMHg1NjRFLCAweDU2NTAsIDB4NzFERiwgMHg1NjM0LAotICAgIDB4NTYzNiwgMHg1NjMyLCAweDU2MzgsIDB4NTY2QiwgMHg1NjY0LCAweDU2MkYsIDB4NTY2QywgMHg1NjZBLAotICAgIDB4NTY4NiwgMHg1NjgwLCAweDU2OEEsIDB4NTZBMCwgMHg1Njk0LCAweDU2OEYsIDB4NTZBNSwgMHg1NkFFLAotICAgIDB4NTZCNiwgMHg1NkI0LCAweDU2QzIsIDB4NTZCQywgMHg1NkMxLCAweDU2QzMsIDB4NTZDMCwgMHg1NkM4LAotICAgIDB4NTZDRSwgMHg1NkQxLCAweDU2RDMsIDB4NTZENywgMHg1NkVFLCAweDU2RjksIDB4NTcwMCwgMHg1NkZGLAotICAgIDB4NTcwNCwgMHg1NzA5LCAweDU3MDgsIDB4NTcwQiwgMHg1NzBELCAweDU3MTMsIDB4NTcxOCwgMHg1NzE2LAotICAgIDB4NTVDNywgMHg1NzFDLCAweDU3MjYsIDB4NTczNywgMHg1NzM4LCAweDU3NEUsIDB4NTczQiwgMHg1NzQwLAotICAgIDB4NTc0RiwgMHg1NzY5LCAweDU3QzAsIDB4NTc4OCwgMHg1NzYxLCAweDU3N0YsIDB4NTc4OSwgMHg1NzkzLAotICAgIDB4NTdBMCwgMHg1N0IzLCAweDU3QTQsIDB4NTdBQSwgMHg1N0IwLCAweDU3QzMsIDB4NTdDNiwgMHg1N0Q0LAotICAgIDB4NTdEMiwgMHg1N0QzLCAweDU4MEEsIDB4NTdENiwgMHg1N0UzLCAweDU4MEIsIDB4NTgxOSwgMHg1ODFELAotICAgIDB4NTg3MiwgMHg1ODIxLCAweDU4NjIsIDB4NTg0QiwgMHg1ODcwLCAweDZCQzAsIDB4NTg1MiwgMHg1ODNELAotICAgIDB4NTg3OSwgMHg1ODg1LCAweDU4QjksIDB4NTg5RiwgMHg1OEFCLCAweDU4QkEsIDB4NThERSwgMHg1OEJCLAotICAgIDB4NThCOCwgMHg1OEFFLCAweDU4QzUsIDB4NThEMywgMHg1OEQxLCAweDU4RDcsIDB4NThEOSwgMHg1OEQ4LAotICAgIDB4NThFNSwgMHg1OERDLCAweDU4RTQsIDB4NThERiwgMHg1OEVGLCAweDU4RkEsIDB4NThGOSwgMHg1OEZCLAotICAgIDB4NThGQywgMHg1OEZELCAweDU5MDIsIDB4NTkwQSwgMHg1OTEwLCAweDU5MUIsIDB4NjhBNiwgMHg1OTI1LAotICAgIDB4NTkyQywgMHg1OTJELCAweDU5MzIsIDB4NTkzOCwgMHg1OTNFLCAweDdBRDIsIDB4NTk1NSwgMHg1OTUwLAotICAgIDB4NTk0RSwgMHg1OTVBLCAweDU5NTgsIDB4NTk2MiwgMHg1OTYwLCAweDU5NjcsIDB4NTk2QywgMHg1OTY5LAotICAgIDB4NTk3OCwgMHg1OTgxLCAweDU5OUQsIDB4NEY1RSwgMHg0RkFCLCAweDU5QTMsIDB4NTlCMiwgMHg1OUM2LAotICAgIDB4NTlFOCwgMHg1OURDLCAweDU5OEQsIDB4NTlEOSwgMHg1OURBLCAweDVBMjUsIDB4NUExRiwgMHg1QTExLAotICAgIDB4NUExQywgMHg1QTA5LCAweDVBMUEsIDB4NUE0MCwgMHg1QTZDLCAweDVBNDksIDB4NUEzNSwgMHg1QTM2LAotICAgIDB4NUE2MiwgMHg1QTZBLCAweDVBOUEsIDB4NUFCQywgMHg1QUJFLCAweDVBQ0IsIDB4NUFDMiwgMHg1QUJELAotICAgIDB4NUFFMywgMHg1QUQ3LCAweDVBRTYsIDB4NUFFOSwgMHg1QUQ2LCAweDVBRkEsIDB4NUFGQiwgMHg1QjBDLAotICAgIDB4NUIwQiwgMHg1QjE2LCAweDVCMzIsIDB4NUFEMCwgMHg1QjJBLCAweDVCMzYsIDB4NUIzRSwgMHg1QjQzLAotICAgIDB4NUI0NSwgMHg1QjQwLCAweDVCNTEsIDB4NUI1NSwgMHg1QjVBLCAweDVCNUIsIDB4NUI2NSwgMHg1QjY5LAotICAgIDB4NUI3MCwgMHg1QjczLCAweDVCNzUsIDB4NUI3OCwgMHg2NTg4LCAweDVCN0EsIDB4NUI4MCwgMHg1QjgzLAotICAgIDB4NUJBNiwgMHg1QkI4LCAweDVCQzMsIDB4NUJDNywgMHg1QkM5LCAweDVCRDQsIDB4NUJEMCwgMHg1QkU0LAotICAgIDB4NUJFNiwgMHg1QkUyLCAweDVCREUsIDB4NUJFNSwgMHg1QkVCLCAweDVCRjAsIDB4NUJGNiwgMHg1QkYzLAotICAgIDB4NUMwNSwgMHg1QzA3LCAweDVDMDgsIDB4NUMwRCwgMHg1QzEzLCAweDVDMjAsIDB4NUMyMiwgMHg1QzI4LAotICAgIDB4NUMzOCwgMHg1QzM5LCAweDVDNDEsIDB4NUM0NiwgMHg1QzRFLCAweDVDNTMsIDB4NUM1MCwgMHg1QzRGLAotICAgIDB4NUI3MSwgMHg1QzZDLCAweDVDNkUsIDB4NEU2MiwgMHg1Qzc2LCAweDVDNzksIDB4NUM4QywgMHg1QzkxLAotICAgIDB4NUM5NCwgMHg1OTlCLCAweDVDQUIsIDB4NUNCQiwgMHg1Q0I2LCAweDVDQkMsIDB4NUNCNywgMHg1Q0M1LAotICAgIDB4NUNCRSwgMHg1Q0M3LCAweDVDRDksIDB4NUNFOSwgMHg1Q0ZELCAweDVDRkEsIDB4NUNFRCwgMHg1RDhDLAotICAgIDB4NUNFQSwgMHg1RDBCLCAweDVEMTUsIDB4NUQxNywgMHg1RDVDLCAweDVEMUYsIDB4NUQxQiwgMHg1RDExLAotICAgIDB4NUQxNCwgMHg1RDIyLCAweDVEMUEsIDB4NUQxOSwgMHg1RDE4LCAweDVENEMsIDB4NUQ1MiwgMHg1RDRFLAotICAgIDB4NUQ0QiwgMHg1RDZDLCAweDVENzMsIDB4NUQ3NiwgMHg1RDg3LCAweDVEODQsIDB4NUQ4MiwgMHg1REEyLAotICAgIDB4NUQ5RCwgMHg1REFDLCAweDVEQUUsIDB4NURCRCwgMHg1RDkwLCAweDVEQjcsIDB4NURCQywgMHg1REM5LAotICAgIDB4NURDRCwgMHg1REQzLCAweDVERDIsIDB4NURENiwgMHg1RERCLCAweDVERUIsIDB4NURGMiwgMHg1REY1LAotICAgIDB4NUUwQiwgMHg1RTFBLCAweDVFMTksIDB4NUUxMSwgMHg1RTFCLCAweDVFMzYsIDB4NUUzNywgMHg1RTQ0LAotICAgIDB4NUU0MywgMHg1RTQwLCAweDVFNEUsIDB4NUU1NywgMHg1RTU0LCAweDVFNUYsIDB4NUU2MiwgMHg1RTY0LAotICAgIDB4NUU0NywgMHg1RTc1LCAweDVFNzYsIDB4NUU3QSwgMHg5RUJDLCAweDVFN0YsIDB4NUVBMCwgMHg1RUMxLAotICAgIDB4NUVDMiwgMHg1RUM4LCAweDVFRDAsIDB4NUVDRiwgMHg1RUQ2LCAweDVFRTMsIDB4NUVERCwgMHg1RURBLAotICAgIDB4NUVEQiwgMHg1RUUyLCAweDVFRTEsIDB4NUVFOCwgMHg1RUU5LCAweDVFRUMsIDB4NUVGMSwgMHg1RUYzLAotICAgIDB4NUVGMCwgMHg1RUY0LCAweDVFRjgsIDB4NUVGRSwgMHg1RjAzLCAweDVGMDksIDB4NUY1RCwgMHg1RjVDLAotICAgIDB4NUYwQiwgMHg1RjExLCAweDVGMTYsIDB4NUYyOSwgMHg1RjJELCAweDVGMzgsIDB4NUY0MSwgMHg1RjQ4LAotICAgIDB4NUY0QywgMHg1RjRFLCAweDVGMkYsIDB4NUY1MSwgMHg1RjU2LCAweDVGNTcsIDB4NUY1OSwgMHg1RjYxLAotICAgIDB4NUY2RCwgMHg1RjczLCAweDVGNzcsIDB4NUY4MywgMHg1RjgyLCAweDVGN0YsIDB4NUY4QSwgMHg1Rjg4LAotICAgIDB4NUY5MSwgMHg1Rjg3LCAweDVGOUUsIDB4NUY5OSwgMHg1Rjk4LCAweDVGQTAsIDB4NUZBOCwgMHg1RkFELAotICAgIDB4NUZCQywgMHg1RkQ2LCAweDVGRkIsIDB4NUZFNCwgMHg1RkY4LCAweDVGRjEsIDB4NUZERCwgMHg2MEIzLAotICAgIDB4NUZGRiwgMHg2MDIxLCAweDYwNjAsIDB4NjAxOSwgMHg2MDEwLCAweDYwMjksIDB4NjAwRSwgMHg2MDMxLAotICAgIDB4NjAxQiwgMHg2MDE1LCAweDYwMkIsIDB4NjAyNiwgMHg2MDBGLCAweDYwM0EsIDB4NjA1QSwgMHg2MDQxLAotICAgIDB4NjA2QSwgMHg2MDc3LCAweDYwNUYsIDB4NjA0QSwgMHg2MDQ2LCAweDYwNEQsIDB4NjA2MywgMHg2MDQzLAotICAgIDB4NjA2NCwgMHg2MDQyLCAweDYwNkMsIDB4NjA2QiwgMHg2MDU5LCAweDYwODEsIDB4NjA4RCwgMHg2MEU3LAotICAgIDB4NjA4MywgMHg2MDlBLCAweDYwODQsIDB4NjA5QiwgMHg2MDk2LCAweDYwOTcsIDB4NjA5MiwgMHg2MEE3LAotICAgIDB4NjA4QiwgMHg2MEUxLCAweDYwQjgsIDB4NjBFMCwgMHg2MEQzLCAweDYwQjQsIDB4NUZGMCwgMHg2MEJELAotICAgIDB4NjBDNiwgMHg2MEI1LCAweDYwRDgsIDB4NjE0RCwgMHg2MTE1LCAweDYxMDYsIDB4NjBGNiwgMHg2MEY3LAotICAgIDB4NjEwMCwgMHg2MEY0LCAweDYwRkEsIDB4NjEwMywgMHg2MTIxLCAweDYwRkIsIDB4NjBGMSwgMHg2MTBELAotICAgIDB4NjEwRSwgMHg2MTQ3LCAweDYxM0UsIDB4NjEyOCwgMHg2MTI3LCAweDYxNEEsIDB4NjEzRiwgMHg2MTNDLAotICAgIDB4NjEyQywgMHg2MTM0LCAweDYxM0QsIDB4NjE0MiwgMHg2MTQ0LCAweDYxNzMsIDB4NjE3NywgMHg2MTU4LAotICAgIDB4NjE1OSwgMHg2MTVBLCAweDYxNkIsIDB4NjE3NCwgMHg2MTZGLCAweDYxNjUsIDB4NjE3MSwgMHg2MTVGLAotICAgIDB4NjE1RCwgMHg2MTUzLCAweDYxNzUsIDB4NjE5OSwgMHg2MTk2LCAweDYxODcsIDB4NjFBQywgMHg2MTk0LAotICAgIDB4NjE5QSwgMHg2MThBLCAweDYxOTEsIDB4NjFBQiwgMHg2MUFFLCAweDYxQ0MsIDB4NjFDQSwgMHg2MUM5LAotICAgIDB4NjFGNywgMHg2MUM4LCAweDYxQzMsIDB4NjFDNiwgMHg2MUJBLCAweDYxQ0IsIDB4N0Y3OSwgMHg2MUNELAotICAgIDB4NjFFNiwgMHg2MUUzLCAweDYxRjYsIDB4NjFGQSwgMHg2MUY0LCAweDYxRkYsIDB4NjFGRCwgMHg2MUZDLAotICAgIDB4NjFGRSwgMHg2MjAwLCAweDYyMDgsIDB4NjIwOSwgMHg2MjBELCAweDYyMEMsIDB4NjIxNCwgMHg2MjFCLAotICAgIDB4NjIxRSwgMHg2MjIxLCAweDYyMkEsIDB4NjIyRSwgMHg2MjMwLCAweDYyMzIsIDB4NjIzMywgMHg2MjQxLAotICAgIDB4NjI0RSwgMHg2MjVFLCAweDYyNjMsIDB4NjI1QiwgMHg2MjYwLCAweDYyNjgsIDB4NjI3QywgMHg2MjgyLAotICAgIDB4NjI4OSwgMHg2MjdFLCAweDYyOTIsIDB4NjI5MywgMHg2Mjk2LCAweDYyRDQsIDB4NjI4MywgMHg2Mjk0LAotICAgIDB4NjJENywgMHg2MkQxLCAweDYyQkIsIDB4NjJDRiwgMHg2MkZGLCAweDYyQzYsIDB4NjRENCwgMHg2MkM4LAotICAgIDB4NjJEQywgMHg2MkNDLCAweDYyQ0EsIDB4NjJDMiwgMHg2MkM3LCAweDYyOUIsIDB4NjJDOSwgMHg2MzBDLAotICAgIDB4NjJFRSwgMHg2MkYxLCAweDYzMjcsIDB4NjMwMiwgMHg2MzA4LCAweDYyRUYsIDB4NjJGNSwgMHg2MzUwLAotICAgIDB4NjMzRSwgMHg2MzRELCAweDY0MUMsIDB4NjM0RiwgMHg2Mzk2LCAweDYzOEUsIDB4NjM4MCwgMHg2M0FCLAotICAgIDB4NjM3NiwgMHg2M0EzLCAweDYzOEYsIDB4NjM4OSwgMHg2MzlGLCAweDYzQjUsIDB4NjM2QiwgMHg2MzY5LAotICAgIDB4NjNCRSwgMHg2M0U5LCAweDYzQzAsIDB4NjNDNiwgMHg2M0UzLCAweDYzQzksIDB4NjNEMiwgMHg2M0Y2LAotICAgIDB4NjNDNCwgMHg2NDE2LCAweDY0MzQsIDB4NjQwNiwgMHg2NDEzLCAweDY0MjYsIDB4NjQzNiwgMHg2NTFELAotICAgIDB4NjQxNywgMHg2NDI4LCAweDY0MEYsIDB4NjQ2NywgMHg2NDZGLCAweDY0NzYsIDB4NjQ0RSwgMHg2NTJBLAotICAgIDB4NjQ5NSwgMHg2NDkzLCAweDY0QTUsIDB4NjRBOSwgMHg2NDg4LCAweDY0QkMsIDB4NjREQSwgMHg2NEQyLAotICAgIDB4NjRDNSwgMHg2NEM3LCAweDY0QkIsIDB4NjREOCwgMHg2NEMyLCAweDY0RjEsIDB4NjRFNywgMHg4MjA5LAotICAgIDB4NjRFMCwgMHg2NEUxLCAweDYyQUMsIDB4NjRFMywgMHg2NEVGLCAweDY1MkMsIDB4NjRGNiwgMHg2NEY0LAotICAgIDB4NjRGMiwgMHg2NEZBLCAweDY1MDAsIDB4NjRGRCwgMHg2NTE4LCAweDY1MUMsIDB4NjUwNSwgMHg2NTI0LAotICAgIDB4NjUyMywgMHg2NTJCLCAweDY1MzQsIDB4NjUzNSwgMHg2NTM3LCAweDY1MzYsIDB4NjUzOCwgMHg3NTRCLAotICAgIDB4NjU0OCwgMHg2NTU2LCAweDY1NTUsIDB4NjU0RCwgMHg2NTU4LCAweDY1NUUsIDB4NjU1RCwgMHg2NTcyLAotICAgIDB4NjU3OCwgMHg2NTgyLCAweDY1ODMsIDB4OEI4QSwgMHg2NTlCLCAweDY1OUYsIDB4NjVBQiwgMHg2NUI3LAotICAgIDB4NjVDMywgMHg2NUM2LCAweDY1QzEsIDB4NjVDNCwgMHg2NUNDLCAweDY1RDIsIDB4NjVEQiwgMHg2NUQ5LAotICAgIDB4NjVFMCwgMHg2NUUxLCAweDY1RjEsIDB4Njc3MiwgMHg2NjBBLCAweDY2MDMsIDB4NjVGQiwgMHg2NzczLAotICAgIDB4NjYzNSwgMHg2NjM2LCAweDY2MzQsIDB4NjYxQywgMHg2NjRGLCAweDY2NDQsIDB4NjY0OSwgMHg2NjQxLAotICAgIDB4NjY1RSwgMHg2NjVELCAweDY2NjQsIDB4NjY2NywgMHg2NjY4LCAweDY2NUYsIDB4NjY2MiwgMHg2NjcwLAotICAgIDB4NjY4MywgMHg2Njg4LCAweDY2OEUsIDB4NjY4OSwgMHg2Njg0LCAweDY2OTgsIDB4NjY5RCwgMHg2NkMxLAotICAgIDB4NjZCOSwgMHg2NkM5LCAweDY2QkUsIDB4NjZCQywgMHg2NkM0LCAweDY2QjgsIDB4NjZENiwgMHg2NkRBLAotICAgIDB4NjZFMCwgMHg2NjNGLCAweDY2RTYsIDB4NjZFOSwgMHg2NkYwLCAweDY2RjUsIDB4NjZGNywgMHg2NzBGLAotICAgIDB4NjcxNiwgMHg2NzFFLCAweDY3MjYsIDB4NjcyNywgMHg5NzM4LCAweDY3MkUsIDB4NjczRiwgMHg2NzM2LAotICAgIDB4Njc0MSwgMHg2NzM4LCAweDY3MzcsIDB4Njc0NiwgMHg2NzVFLCAweDY3NjAsIDB4Njc1OSwgMHg2NzYzLAotICAgIDB4Njc2NCwgMHg2Nzg5LCAweDY3NzAsIDB4NjdBOSwgMHg2NzdDLCAweDY3NkEsIDB4Njc4QywgMHg2NzhCLAotICAgIDB4NjdBNiwgMHg2N0ExLCAweDY3ODUsIDB4NjdCNywgMHg2N0VGLCAweDY3QjQsIDB4NjdFQywgMHg2N0IzLAotICAgIDB4NjdFOSwgMHg2N0I4LCAweDY3RTQsIDB4NjdERSwgMHg2N0RELCAweDY3RTIsIDB4NjdFRSwgMHg2N0I5LAotICAgIDB4NjdDRSwgMHg2N0M2LCAweDY3RTcsIDB4NkE5QywgMHg2ODFFLCAweDY4NDYsIDB4NjgyOSwgMHg2ODQwLAotICAgIDB4Njg0RCwgMHg2ODMyLCAweDY4NEUsIDB4NjhCMywgMHg2ODJCLCAweDY4NTksIDB4Njg2MywgMHg2ODc3LAotICAgIDB4Njg3RiwgMHg2ODlGLCAweDY4OEYsIDB4NjhBRCwgMHg2ODk0LCAweDY4OUQsIDB4Njg5QiwgMHg2ODgzLAotICAgIDB4NkFBRSwgMHg2OEI5LCAweDY4NzQsIDB4NjhCNSwgMHg2OEEwLCAweDY4QkEsIDB4NjkwRiwgMHg2ODhELAotICAgIDB4Njg3RSwgMHg2OTAxLCAweDY4Q0EsIDB4NjkwOCwgMHg2OEQ4LCAweDY5MjIsIDB4NjkyNiwgMHg2OEUxLAotICAgIDB4NjkwQywgMHg2OENELCAweDY4RDQsIDB4NjhFNywgMHg2OEQ1LCAweDY5MzYsIDB4NjkxMiwgMHg2OTA0LAotICAgIDB4NjhENywgMHg2OEUzLCAweDY5MjUsIDB4NjhGOSwgMHg2OEUwLCAweDY4RUYsIDB4NjkyOCwgMHg2OTJBLAotICAgIDB4NjkxQSwgMHg2OTIzLCAweDY5MjEsIDB4NjhDNiwgMHg2OTc5LCAweDY5NzcsIDB4Njk1QywgMHg2OTc4LAotICAgIDB4Njk2QiwgMHg2OTU0LCAweDY5N0UsIDB4Njk2RSwgMHg2OTM5LCAweDY5NzQsIDB4NjkzRCwgMHg2OTU5LAotICAgIDB4NjkzMCwgMHg2OTYxLCAweDY5NUUsIDB4Njk1RCwgMHg2OTgxLCAweDY5NkEsIDB4NjlCMiwgMHg2OUFFLAotICAgIDB4NjlEMCwgMHg2OUJGLCAweDY5QzEsIDB4NjlEMywgMHg2OUJFLCAweDY5Q0UsIDB4NUJFOCwgMHg2OUNBLAotICAgIDB4NjlERCwgMHg2OUJCLCAweDY5QzMsIDB4NjlBNywgMHg2QTJFLCAweDY5OTEsIDB4NjlBMCwgMHg2OTlDLAotICAgIDB4Njk5NSwgMHg2OUI0LCAweDY5REUsIDB4NjlFOCwgMHg2QTAyLCAweDZBMUIsIDB4NjlGRiwgMHg2QjBBLAotICAgIDB4NjlGOSwgMHg2OUYyLCAweDY5RTcsIDB4NkEwNSwgMHg2OUIxLCAweDZBMUUsIDB4NjlFRCwgMHg2QTE0LAotICAgIDB4NjlFQiwgMHg2QTBBLCAweDZBMTIsIDB4NkFDMSwgMHg2QTIzLCAweDZBMTMsIDB4NkE0NCwgMHg2QTBDLAotICAgIDB4NkE3MiwgMHg2QTM2LCAweDZBNzgsIDB4NkE0NywgMHg2QTYyLCAweDZBNTksIDB4NkE2NiwgMHg2QTQ4LAotICAgIDB4NkEzOCwgMHg2QTIyLCAweDZBOTAsIDB4NkE4RCwgMHg2QUEwLCAweDZBODQsIDB4NkFBMiwgMHg2QUEzLAotICAgIDB4NkE5NywgMHg4NjE3LCAweDZBQkIsIDB4NkFDMywgMHg2QUMyLCAweDZBQjgsIDB4NkFCMywgMHg2QUFDLAotICAgIDB4NkFERSwgMHg2QUQxLCAweDZBREYsIDB4NkFBQSwgMHg2QURBLCAweDZBRUEsIDB4NkFGQiwgMHg2QjA1LAotICAgIDB4ODYxNiwgMHg2QUZBLCAweDZCMTIsIDB4NkIxNiwgMHg5QjMxLCAweDZCMUYsIDB4NkIzOCwgMHg2QjM3LAotICAgIDB4NzZEQywgMHg2QjM5LCAweDk4RUUsIDB4NkI0NywgMHg2QjQzLCAweDZCNDksIDB4NkI1MCwgMHg2QjU5LAotICAgIDB4NkI1NCwgMHg2QjVCLCAweDZCNUYsIDB4NkI2MSwgMHg2Qjc4LCAweDZCNzksIDB4NkI3RiwgMHg2QjgwLAotICAgIDB4NkI4NCwgMHg2QjgzLCAweDZCOEQsIDB4NkI5OCwgMHg2Qjk1LCAweDZCOUUsIDB4NkJBNCwgMHg2QkFBLAotICAgIDB4NkJBQiwgMHg2QkFGLCAweDZCQjIsIDB4NkJCMSwgMHg2QkIzLCAweDZCQjcsIDB4NkJCQywgMHg2QkM2LAotICAgIDB4NkJDQiwgMHg2QkQzLCAweDZCREYsIDB4NkJFQywgMHg2QkVCLCAweDZCRjMsIDB4NkJFRiwgMHg5RUJFLAotICAgIDB4NkMwOCwgMHg2QzEzLCAweDZDMTQsIDB4NkMxQiwgMHg2QzI0LCAweDZDMjMsIDB4NkM1RSwgMHg2QzU1LAotICAgIDB4NkM2MiwgMHg2QzZBLCAweDZDODIsIDB4NkM4RCwgMHg2QzlBLCAweDZDODEsIDB4NkM5QiwgMHg2QzdFLAotICAgIDB4NkM2OCwgMHg2QzczLCAweDZDOTIsIDB4NkM5MCwgMHg2Q0M0LCAweDZDRjEsIDB4NkNEMywgMHg2Q0JELAotICAgIDB4NkNENywgMHg2Q0M1LCAweDZDREQsIDB4NkNBRSwgMHg2Q0IxLCAweDZDQkUsIDB4NkNCQSwgMHg2Q0RCLAotICAgIDB4NkNFRiwgMHg2Q0Q5LCAweDZDRUEsIDB4NkQxRiwgMHg4ODRELCAweDZEMzYsIDB4NkQyQiwgMHg2RDNELAotICAgIDB4NkQzOCwgMHg2RDE5LCAweDZEMzUsIDB4NkQzMywgMHg2RDEyLCAweDZEMEMsIDB4NkQ2MywgMHg2RDkzLAotICAgIDB4NkQ2NCwgMHg2RDVBLCAweDZENzksIDB4NkQ1OSwgMHg2RDhFLCAweDZEOTUsIDB4NkZFNCwgMHg2RDg1LAotICAgIDB4NkRGOSwgMHg2RTE1LCAweDZFMEEsIDB4NkRCNSwgMHg2REM3LCAweDZERTYsIDB4NkRCOCwgMHg2REM2LAotICAgIDB4NkRFQywgMHg2RERFLCAweDZEQ0MsIDB4NkRFOCwgMHg2REQyLCAweDZEQzUsIDB4NkRGQSwgMHg2REQ5LAotICAgIDB4NkRFNCwgMHg2REQ1LCAweDZERUEsIDB4NkRFRSwgMHg2RTJELCAweDZFNkUsIDB4NkUyRSwgMHg2RTE5LAotICAgIDB4NkU3MiwgMHg2RTVGLCAweDZFM0UsIDB4NkUyMywgMHg2RTZCLCAweDZFMkIsIDB4NkU3NiwgMHg2RTRELAotICAgIDB4NkUxRiwgMHg2RTQzLCAweDZFM0EsIDB4NkU0RSwgMHg2RTI0LCAweDZFRkYsIDB4NkUxRCwgMHg2RTM4LAotICAgIDB4NkU4MiwgMHg2RUFBLCAweDZFOTgsIDB4NkVDOSwgMHg2RUI3LCAweDZFRDMsIDB4NkVCRCwgMHg2RUFGLAotICAgIDB4NkVDNCwgMHg2RUIyLCAweDZFRDQsIDB4NkVENSwgMHg2RThGLCAweDZFQTUsIDB4NkVDMiwgMHg2RTlGLAotICAgIDB4NkY0MSwgMHg2RjExLCAweDcwNEMsIDB4NkVFQywgMHg2RUY4LCAweDZFRkUsIDB4NkYzRiwgMHg2RUYyLAotICAgIDB4NkYzMSwgMHg2RUVGLCAweDZGMzIsIDB4NkVDQywgMHg2RjNFLCAweDZGMTMsIDB4NkVGNywgMHg2Rjg2LAotICAgIDB4NkY3QSwgMHg2Rjc4LCAweDZGODEsIDB4NkY4MCwgMHg2RjZGLCAweDZGNUIsIDB4NkZGMywgMHg2RjZELAotICAgIDB4NkY4MiwgMHg2RjdDLCAweDZGNTgsIDB4NkY4RSwgMHg2RjkxLCAweDZGQzIsIDB4NkY2NiwgMHg2RkIzLAotICAgIDB4NkZBMywgMHg2RkExLCAweDZGQTQsIDB4NkZCOSwgMHg2RkM2LCAweDZGQUEsIDB4NkZERiwgMHg2RkQ1LAotICAgIDB4NkZFQywgMHg2RkQ0LCAweDZGRDgsIDB4NkZGMSwgMHg2RkVFLCAweDZGREIsIDB4NzAwOSwgMHg3MDBCLAotICAgIDB4NkZGQSwgMHg3MDExLCAweDcwMDEsIDB4NzAwRiwgMHg2RkZFLCAweDcwMUIsIDB4NzAxQSwgMHg2Rjc0LAotICAgIDB4NzAxRCwgMHg3MDE4LCAweDcwMUYsIDB4NzAzMCwgMHg3MDNFLCAweDcwMzIsIDB4NzA1MSwgMHg3MDYzLAotICAgIDB4NzA5OSwgMHg3MDkyLCAweDcwQUYsIDB4NzBGMSwgMHg3MEFDLCAweDcwQjgsIDB4NzBCMywgMHg3MEFFLAotICAgIDB4NzBERiwgMHg3MENCLCAweDcwREQsIDB4NzBEOSwgMHg3MTA5LCAweDcwRkQsIDB4NzExQywgMHg3MTE5LAotICAgIDB4NzE2NSwgMHg3MTU1LCAweDcxODgsIDB4NzE2NiwgMHg3MTYyLCAweDcxNEMsIDB4NzE1NiwgMHg3MTZDLAotICAgIDB4NzE4RiwgMHg3MUZCLCAweDcxODQsIDB4NzE5NSwgMHg3MUE4LCAweDcxQUMsIDB4NzFENywgMHg3MUI5LAotICAgIDB4NzFCRSwgMHg3MUQyLCAweDcxQzksIDB4NzFENCwgMHg3MUNFLCAweDcxRTAsIDB4NzFFQywgMHg3MUU3LAotICAgIDB4NzFGNSwgMHg3MUZDLCAweDcxRjksIDB4NzFGRiwgMHg3MjBELCAweDcyMTAsIDB4NzIxQiwgMHg3MjI4LAotICAgIDB4NzIyRCwgMHg3MjJDLCAweDcyMzAsIDB4NzIzMiwgMHg3MjNCLCAweDcyM0MsIDB4NzIzRiwgMHg3MjQwLAotICAgIDB4NzI0NiwgMHg3MjRCLCAweDcyNTgsIDB4NzI3NCwgMHg3MjdFLCAweDcyODIsIDB4NzI4MSwgMHg3Mjg3LAotICAgIDB4NzI5MiwgMHg3Mjk2LCAweDcyQTIsIDB4NzJBNywgMHg3MkI5LCAweDcyQjIsIDB4NzJDMywgMHg3MkM2LAotICAgIDB4NzJDNCwgMHg3MkNFLCAweDcyRDIsIDB4NzJFMiwgMHg3MkUwLCAweDcyRTEsIDB4NzJGOSwgMHg3MkY3LAotICAgIDB4NTAwRiwgMHg3MzE3LCAweDczMEEsIDB4NzMxQywgMHg3MzE2LCAweDczMUQsIDB4NzMzNCwgMHg3MzJGLAotICAgIDB4NzMyOSwgMHg3MzI1LCAweDczM0UsIDB4NzM0RSwgMHg3MzRGLCAweDlFRDgsIDB4NzM1NywgMHg3MzZBLAotICAgIDB4NzM2OCwgMHg3MzcwLCAweDczNzgsIDB4NzM3NSwgMHg3MzdCLCAweDczN0EsIDB4NzNDOCwgMHg3M0IzLAotICAgIDB4NzNDRSwgMHg3M0JCLCAweDczQzAsIDB4NzNFNSwgMHg3M0VFLCAweDczREUsIDB4NzRBMiwgMHg3NDA1LAotICAgIDB4NzQ2RiwgMHg3NDI1LCAweDczRjgsIDB4NzQzMiwgMHg3NDNBLCAweDc0NTUsIDB4NzQzRiwgMHg3NDVGLAotICAgIDB4NzQ1OSwgMHg3NDQxLCAweDc0NUMsIDB4NzQ2OSwgMHg3NDcwLCAweDc0NjMsIDB4NzQ2QSwgMHg3NDc2LAotICAgIDB4NzQ3RSwgMHg3NDhCLCAweDc0OUUsIDB4NzRBNywgMHg3NENBLCAweDc0Q0YsIDB4NzRENCwgMHg3M0YxLAotICAgIDB4NzRFMCwgMHg3NEUzLCAweDc0RTcsIDB4NzRFOSwgMHg3NEVFLCAweDc0RjIsIDB4NzRGMCwgMHg3NEYxLAotICAgIDB4NzRGOCwgMHg3NEY3LCAweDc1MDQsIDB4NzUwMywgMHg3NTA1LCAweDc1MEMsIDB4NzUwRSwgMHg3NTBELAotICAgIDB4NzUxNSwgMHg3NTEzLCAweDc1MUUsIDB4NzUyNiwgMHg3NTJDLCAweDc1M0MsIDB4NzU0NCwgMHg3NTRELAotICAgIDB4NzU0QSwgMHg3NTQ5LCAweDc1NUIsIDB4NzU0NiwgMHg3NTVBLCAweDc1NjksIDB4NzU2NCwgMHg3NTY3LAotICAgIDB4NzU2QiwgMHg3NTZELCAweDc1NzgsIDB4NzU3NiwgMHg3NTg2LCAweDc1ODcsIDB4NzU3NCwgMHg3NThBLAotICAgIDB4NzU4OSwgMHg3NTgyLCAweDc1OTQsIDB4NzU5QSwgMHg3NTlELCAweDc1QTUsIDB4NzVBMywgMHg3NUMyLAotICAgIDB4NzVCMywgMHg3NUMzLCAweDc1QjUsIDB4NzVCRCwgMHg3NUI4LCAweDc1QkMsIDB4NzVCMSwgMHg3NUNELAotICAgIDB4NzVDQSwgMHg3NUQyLCAweDc1RDksIDB4NzVFMywgMHg3NURFLCAweDc1RkUsIDB4NzVGRiwgMHg3NUZDLAotICAgIDB4NzYwMSwgMHg3NUYwLCAweDc1RkEsIDB4NzVGMiwgMHg3NUYzLCAweDc2MEIsIDB4NzYwRCwgMHg3NjA5LAotICAgIDB4NzYxRiwgMHg3NjI3LCAweDc2MjAsIDB4NzYyMSwgMHg3NjIyLCAweDc2MjQsIDB4NzYzNCwgMHg3NjMwLAotICAgIDB4NzYzQiwgMHg3NjQ3LCAweDc2NDgsIDB4NzY0NiwgMHg3NjVDLCAweDc2NTgsIDB4NzY2MSwgMHg3NjYyLAotICAgIDB4NzY2OCwgMHg3NjY5LCAweDc2NkEsIDB4NzY2NywgMHg3NjZDLCAweDc2NzAsIDB4NzY3MiwgMHg3Njc2LAotICAgIDB4NzY3OCwgMHg3NjdDLCAweDc2ODAsIDB4NzY4MywgMHg3Njg4LCAweDc2OEIsIDB4NzY4RSwgMHg3Njk2LAotICAgIDB4NzY5MywgMHg3Njk5LCAweDc2OUEsIDB4NzZCMCwgMHg3NkI0LCAweDc2QjgsIDB4NzZCOSwgMHg3NkJBLAotICAgIDB4NzZDMiwgMHg3NkNELCAweDc2RDYsIDB4NzZEMiwgMHg3NkRFLCAweDc2RTEsIDB4NzZFNSwgMHg3NkU3LAotICAgIDB4NzZFQSwgMHg4NjJGLCAweDc2RkIsIDB4NzcwOCwgMHg3NzA3LCAweDc3MDQsIDB4NzcyOSwgMHg3NzI0LAotICAgIDB4NzcxRSwgMHg3NzI1LCAweDc3MjYsIDB4NzcxQiwgMHg3NzM3LCAweDc3MzgsIDB4Nzc0NywgMHg3NzVBLAotICAgIDB4Nzc2OCwgMHg3NzZCLCAweDc3NUIsIDB4Nzc2NSwgMHg3NzdGLCAweDc3N0UsIDB4Nzc3OSwgMHg3NzhFLAotICAgIDB4Nzc4QiwgMHg3NzkxLCAweDc3QTAsIDB4Nzc5RSwgMHg3N0IwLCAweDc3QjYsIDB4NzdCOSwgMHg3N0JGLAotICAgIDB4NzdCQywgMHg3N0JELCAweDc3QkIsIDB4NzdDNywgMHg3N0NELCAweDc3RDcsIDB4NzdEQSwgMHg3N0RDLAotICAgIDB4NzdFMywgMHg3N0VFLCAweDc3RkMsIDB4NzgwQywgMHg3ODEyLCAweDc5MjYsIDB4NzgyMCwgMHg3OTJBLAotICAgIDB4Nzg0NSwgMHg3ODhFLCAweDc4NzQsIDB4Nzg4NiwgMHg3ODdDLCAweDc4OUEsIDB4Nzg4QywgMHg3OEEzLAotICAgIDB4NzhCNSwgMHg3OEFBLCAweDc4QUYsIDB4NzhEMSwgMHg3OEM2LCAweDc4Q0IsIDB4NzhENCwgMHg3OEJFLAotICAgIDB4NzhCQywgMHg3OEM1LCAweDc4Q0EsIDB4NzhFQywgMHg3OEU3LCAweDc4REEsIDB4NzhGRCwgMHg3OEY0LAotICAgIDB4NzkwNywgMHg3OTEyLCAweDc5MTEsIDB4NzkxOSwgMHg3OTJDLCAweDc5MkIsIDB4Nzk0MCwgMHg3OTYwLAotICAgIDB4Nzk1NywgMHg3OTVGLCAweDc5NUEsIDB4Nzk1NSwgMHg3OTUzLCAweDc5N0EsIDB4Nzk3RiwgMHg3OThBLAotICAgIDB4Nzk5RCwgMHg3OUE3LCAweDlGNEIsIDB4NzlBQSwgMHg3OUFFLCAweDc5QjMsIDB4NzlCOSwgMHg3OUJBLAotICAgIDB4NzlDOSwgMHg3OUQ1LCAweDc5RTcsIDB4NzlFQywgMHg3OUUxLCAweDc5RTMsIDB4N0EwOCwgMHg3QTBELAotICAgIDB4N0ExOCwgMHg3QTE5LCAweDdBMjAsIDB4N0ExRiwgMHg3OTgwLCAweDdBMzEsIDB4N0EzQiwgMHg3QTNFLAotICAgIDB4N0EzNywgMHg3QTQzLCAweDdBNTcsIDB4N0E0OSwgMHg3QTYxLCAweDdBNjIsIDB4N0E2OSwgMHg5RjlELAotICAgIDB4N0E3MCwgMHg3QTc5LCAweDdBN0QsIDB4N0E4OCwgMHg3QTk3LCAweDdBOTUsIDB4N0E5OCwgMHg3QTk2LAotICAgIDB4N0FBOSwgMHg3QUM4LCAweDdBQjAsIDB4N0FCNiwgMHg3QUM1LCAweDdBQzQsIDB4N0FCRiwgMHg5MDgzLAotICAgIDB4N0FDNywgMHg3QUNBLCAweDdBQ0QsIDB4N0FDRiwgMHg3QUQ1LCAweDdBRDMsIDB4N0FEOSwgMHg3QURBLAotICAgIDB4N0FERCwgMHg3QUUxLCAweDdBRTIsIDB4N0FFNiwgMHg3QUVELCAweDdBRjAsIDB4N0IwMiwgMHg3QjBGLAotICAgIDB4N0IwQSwgMHg3QjA2LCAweDdCMzMsIDB4N0IxOCwgMHg3QjE5LCAweDdCMUUsIDB4N0IzNSwgMHg3QjI4LAotICAgIDB4N0IzNiwgMHg3QjUwLCAweDdCN0EsIDB4N0IwNCwgMHg3QjRELCAweDdCMEIsIDB4N0I0QywgMHg3QjQ1LAotICAgIDB4N0I3NSwgMHg3QjY1LCAweDdCNzQsIDB4N0I2NywgMHg3QjcwLCAweDdCNzEsIDB4N0I2QywgMHg3QjZFLAotICAgIDB4N0I5RCwgMHg3Qjk4LCAweDdCOUYsIDB4N0I4RCwgMHg3QjlDLCAweDdCOUEsIDB4N0I4QiwgMHg3QjkyLAotICAgIDB4N0I4RiwgMHg3QjVELCAweDdCOTksIDB4N0JDQiwgMHg3QkMxLCAweDdCQ0MsIDB4N0JDRiwgMHg3QkI0LAotICAgIDB4N0JDNiwgMHg3QkRELCAweDdCRTksIDB4N0MxMSwgMHg3QzE0LCAweDdCRTYsIDB4N0JFNSwgMHg3QzYwLAotICAgIDB4N0MwMCwgMHg3QzA3LCAweDdDMTMsIDB4N0JGMywgMHg3QkY3LCAweDdDMTcsIDB4N0MwRCwgMHg3QkY2LAotICAgIDB4N0MyMywgMHg3QzI3LCAweDdDMkEsIDB4N0MxRiwgMHg3QzM3LCAweDdDMkIsIDB4N0MzRCwgMHg3QzRDLAotICAgIDB4N0M0MywgMHg3QzU0LCAweDdDNEYsIDB4N0M0MCwgMHg3QzUwLCAweDdDNTgsIDB4N0M1RiwgMHg3QzY0LAotICAgIDB4N0M1NiwgMHg3QzY1LCAweDdDNkMsIDB4N0M3NSwgMHg3QzgzLCAweDdDOTAsIDB4N0NBNCwgMHg3Q0FELAotICAgIDB4N0NBMiwgMHg3Q0FCLCAweDdDQTEsIDB4N0NBOCwgMHg3Q0IzLCAweDdDQjIsIDB4N0NCMSwgMHg3Q0FFLAotICAgIDB4N0NCOSwgMHg3Q0JELCAweDdDQzAsIDB4N0NDNSwgMHg3Q0MyLCAweDdDRDgsIDB4N0NEMiwgMHg3Q0RDLAotICAgIDB4N0NFMiwgMHg5QjNCLCAweDdDRUYsIDB4N0NGMiwgMHg3Q0Y0LCAweDdDRjYsIDB4N0NGQSwgMHg3RDA2LAotICAgIDB4N0QwMiwgMHg3RDFDLCAweDdEMTUsIDB4N0QwQSwgMHg3RDQ1LCAweDdENEIsIDB4N0QyRSwgMHg3RDMyLAotICAgIDB4N0QzRiwgMHg3RDM1LCAweDdENDYsIDB4N0Q3MywgMHg3RDU2LCAweDdENEUsIDB4N0Q3MiwgMHg3RDY4LAotICAgIDB4N0Q2RSwgMHg3RDRGLCAweDdENjMsIDB4N0Q5MywgMHg3RDg5LCAweDdENUIsIDB4N0Q4RiwgMHg3RDdELAotICAgIDB4N0Q5QiwgMHg3REJBLCAweDdEQUUsIDB4N0RBMywgMHg3REI1LCAweDdEQzcsIDB4N0RCRCwgMHg3REFCLAotICAgIDB4N0UzRCwgMHg3REEyLCAweDdEQUYsIDB4N0REQywgMHg3REI4LCAweDdEOUYsIDB4N0RCMCwgMHg3REQ4LAotICAgIDB4N0RERCwgMHg3REU0LCAweDdEREUsIDB4N0RGQiwgMHg3REYyLCAweDdERTEsIDB4N0UwNSwgMHg3RTBBLAotICAgIDB4N0UyMywgMHg3RTIxLCAweDdFMTIsIDB4N0UzMSwgMHg3RTFGLCAweDdFMDksIDB4N0UwQiwgMHg3RTIyLAotICAgIDB4N0U0NiwgMHg3RTY2LCAweDdFM0IsIDB4N0UzNSwgMHg3RTM5LCAweDdFNDMsIDB4N0UzNywgMHg3RTMyLAotICAgIDB4N0UzQSwgMHg3RTY3LCAweDdFNUQsIDB4N0U1NiwgMHg3RTVFLCAweDdFNTksIDB4N0U1QSwgMHg3RTc5LAotICAgIDB4N0U2QSwgMHg3RTY5LCAweDdFN0MsIDB4N0U3QiwgMHg3RTgzLCAweDdERDUsIDB4N0U3RCwgMHg4RkFFLAotICAgIDB4N0U3RiwgMHg3RTg4LCAweDdFODksIDB4N0U4QywgMHg3RTkyLCAweDdFOTAsIDB4N0U5MywgMHg3RTk0LAotICAgIDB4N0U5NiwgMHg3RThFLCAweDdFOUIsIDB4N0U5QywgMHg3RjM4LCAweDdGM0EsIDB4N0Y0NSwgMHg3RjRDLAotICAgIDB4N0Y0RCwgMHg3RjRFLCAweDdGNTAsIDB4N0Y1MSwgMHg3RjU1LCAweDdGNTQsIDB4N0Y1OCwgMHg3RjVGLAotICAgIDB4N0Y2MCwgMHg3RjY4LCAweDdGNjksIDB4N0Y2NywgMHg3Rjc4LCAweDdGODIsIDB4N0Y4NiwgMHg3RjgzLAotICAgIDB4N0Y4OCwgMHg3Rjg3LCAweDdGOEMsIDB4N0Y5NCwgMHg3RjlFLCAweDdGOUQsIDB4N0Y5QSwgMHg3RkEzLAotICAgIDB4N0ZBRiwgMHg3RkIyLCAweDdGQjksIDB4N0ZBRSwgMHg3RkI2LCAweDdGQjgsIDB4OEI3MSwgMHg3RkM1LAotICAgIDB4N0ZDNiwgMHg3RkNBLCAweDdGRDUsIDB4N0ZENCwgMHg3RkUxLCAweDdGRTYsIDB4N0ZFOSwgMHg3RkYzLAotICAgIDB4N0ZGOSwgMHg5OERDLCAweDgwMDYsIDB4ODAwNCwgMHg4MDBCLCAweDgwMTIsIDB4ODAxOCwgMHg4MDE5LAotICAgIDB4ODAxQywgMHg4MDIxLCAweDgwMjgsIDB4ODAzRiwgMHg4MDNCLCAweDgwNEEsIDB4ODA0NiwgMHg4MDUyLAotICAgIDB4ODA1OCwgMHg4MDVBLCAweDgwNUYsIDB4ODA2MiwgMHg4MDY4LCAweDgwNzMsIDB4ODA3MiwgMHg4MDcwLAotICAgIDB4ODA3NiwgMHg4MDc5LCAweDgwN0QsIDB4ODA3RiwgMHg4MDg0LCAweDgwODYsIDB4ODA4NSwgMHg4MDlCLAotICAgIDB4ODA5MywgMHg4MDlBLCAweDgwQUQsIDB4NTE5MCwgMHg4MEFDLCAweDgwREIsIDB4ODBFNSwgMHg4MEQ5LAotICAgIDB4ODBERCwgMHg4MEM0LCAweDgwREEsIDB4ODBENiwgMHg4MTA5LCAweDgwRUYsIDB4ODBGMSwgMHg4MTFCLAotICAgIDB4ODEyOSwgMHg4MTIzLCAweDgxMkYsIDB4ODE0QiwgMHg5NjhCLCAweDgxNDYsIDB4ODEzRSwgMHg4MTUzLAotICAgIDB4ODE1MSwgMHg4MEZDLCAweDgxNzEsIDB4ODE2RSwgMHg4MTY1LCAweDgxNjYsIDB4ODE3NCwgMHg4MTgzLAotICAgIDB4ODE4OCwgMHg4MThBLCAweDgxODAsIDB4ODE4MiwgMHg4MUEwLCAweDgxOTUsIDB4ODFBNCwgMHg4MUEzLAotICAgIDB4ODE1RiwgMHg4MTkzLCAweDgxQTksIDB4ODFCMCwgMHg4MUI1LCAweDgxQkUsIDB4ODFCOCwgMHg4MUJELAotICAgIDB4ODFDMCwgMHg4MUMyLCAweDgxQkEsIDB4ODFDOSwgMHg4MUNELCAweDgxRDEsIDB4ODFEOSwgMHg4MUQ4LAotICAgIDB4ODFDOCwgMHg4MURBLCAweDgxREYsIDB4ODFFMCwgMHg4MUU3LCAweDgxRkEsIDB4ODFGQiwgMHg4MUZFLAotICAgIDB4ODIwMSwgMHg4MjAyLCAweDgyMDUsIDB4ODIwNywgMHg4MjBBLCAweDgyMEQsIDB4ODIxMCwgMHg4MjE2LAotICAgIDB4ODIyOSwgMHg4MjJCLCAweDgyMzgsIDB4ODIzMywgMHg4MjQwLCAweDgyNTksIDB4ODI1OCwgMHg4MjVELAotICAgIDB4ODI1QSwgMHg4MjVGLCAweDgyNjQsIDB4ODI2MiwgMHg4MjY4LCAweDgyNkEsIDB4ODI2QiwgMHg4MjJFLAotICAgIDB4ODI3MSwgMHg4Mjc3LCAweDgyNzgsIDB4ODI3RSwgMHg4MjhELCAweDgyOTIsIDB4ODJBQiwgMHg4MjlGLAotICAgIDB4ODJCQiwgMHg4MkFDLCAweDgyRTEsIDB4ODJFMywgMHg4MkRGLCAweDgyRDIsIDB4ODJGNCwgMHg4MkYzLAotICAgIDB4ODJGQSwgMHg4MzkzLCAweDgzMDMsIDB4ODJGQiwgMHg4MkY5LCAweDgyREUsIDB4ODMwNiwgMHg4MkRDLAotICAgIDB4ODMwOSwgMHg4MkQ5LCAweDgzMzUsIDB4ODMzNCwgMHg4MzE2LCAweDgzMzIsIDB4ODMzMSwgMHg4MzQwLAotICAgIDB4ODMzOSwgMHg4MzUwLCAweDgzNDUsIDB4ODMyRiwgMHg4MzJCLCAweDgzMTcsIDB4ODMxOCwgMHg4Mzg1LAotICAgIDB4ODM5QSwgMHg4M0FBLCAweDgzOUYsIDB4ODNBMiwgMHg4Mzk2LCAweDgzMjMsIDB4ODM4RSwgMHg4Mzg3LAotICAgIDB4ODM4QSwgMHg4MzdDLCAweDgzQjUsIDB4ODM3MywgMHg4Mzc1LCAweDgzQTAsIDB4ODM4OSwgMHg4M0E4LAotICAgIDB4ODNGNCwgMHg4NDEzLCAweDgzRUIsIDB4ODNDRSwgMHg4M0ZELCAweDg0MDMsIDB4ODNEOCwgMHg4NDBCLAotICAgIDB4ODNDMSwgMHg4M0Y3LCAweDg0MDcsIDB4ODNFMCwgMHg4M0YyLCAweDg0MEQsIDB4ODQyMiwgMHg4NDIwLAotICAgIDB4ODNCRCwgMHg4NDM4LCAweDg1MDYsIDB4ODNGQiwgMHg4NDZELCAweDg0MkEsIDB4ODQzQywgMHg4NTVBLAotICAgIDB4ODQ4NCwgMHg4NDc3LCAweDg0NkIsIDB4ODRBRCwgMHg4NDZFLCAweDg0ODIsIDB4ODQ2OSwgMHg4NDQ2LAotICAgIDB4ODQyQywgMHg4NDZGLCAweDg0NzksIDB4ODQzNSwgMHg4NENBLCAweDg0NjIsIDB4ODRCOSwgMHg4NEJGLAotICAgIDB4ODQ5RiwgMHg4NEQ5LCAweDg0Q0QsIDB4ODRCQiwgMHg4NERBLCAweDg0RDAsIDB4ODRDMSwgMHg4NEM2LAotICAgIDB4ODRENiwgMHg4NEExLCAweDg1MjEsIDB4ODRGRiwgMHg4NEY0LCAweDg1MTcsIDB4ODUxOCwgMHg4NTJDLAotICAgIDB4ODUxRiwgMHg4NTE1LCAweDg1MTQsIDB4ODRGQywgMHg4NTQwLCAweDg1NjMsIDB4ODU1OCwgMHg4NTQ4LAotICAgIDB4ODU0MSwgMHg4NjAyLCAweDg1NEIsIDB4ODU1NSwgMHg4NTgwLCAweDg1QTQsIDB4ODU4OCwgMHg4NTkxLAotICAgIDB4ODU4QSwgMHg4NUE4LCAweDg1NkQsIDB4ODU5NCwgMHg4NTlCLCAweDg1RUEsIDB4ODU4NywgMHg4NTlDLAotICAgIDB4ODU3NywgMHg4NTdFLCAweDg1OTAsIDB4ODVDOSwgMHg4NUJBLCAweDg1Q0YsIDB4ODVCOSwgMHg4NUQwLAotICAgIDB4ODVENSwgMHg4NURELCAweDg1RTUsIDB4ODVEQywgMHg4NUY5LCAweDg2MEEsIDB4ODYxMywgMHg4NjBCLAotICAgIDB4ODVGRSwgMHg4NUZBLCAweDg2MDYsIDB4ODYyMiwgMHg4NjFBLCAweDg2MzAsIDB4ODYzRiwgMHg4NjRELAotICAgIDB4NEU1NSwgMHg4NjU0LCAweDg2NUYsIDB4ODY2NywgMHg4NjcxLCAweDg2OTMsIDB4ODZBMywgMHg4NkE5LAotICAgIDB4ODZBQSwgMHg4NjhCLCAweDg2OEMsIDB4ODZCNiwgMHg4NkFGLCAweDg2QzQsIDB4ODZDNiwgMHg4NkIwLAotICAgIDB4ODZDOSwgMHg4ODIzLCAweDg2QUIsIDB4ODZENCwgMHg4NkRFLCAweDg2RTksIDB4ODZFQywgMHg4NkRGLAotICAgIDB4ODZEQiwgMHg4NkVGLCAweDg3MTIsIDB4ODcwNiwgMHg4NzA4LCAweDg3MDAsIDB4ODcwMywgMHg4NkZCLAotICAgIDB4ODcxMSwgMHg4NzA5LCAweDg3MEQsIDB4ODZGOSwgMHg4NzBBLCAweDg3MzQsIDB4ODczRiwgMHg4NzM3LAotICAgIDB4ODczQiwgMHg4NzI1LCAweDg3MjksIDB4ODcxQSwgMHg4NzYwLCAweDg3NUYsIDB4ODc3OCwgMHg4NzRDLAotICAgIDB4ODc0RSwgMHg4Nzc0LCAweDg3NTcsIDB4ODc2OCwgMHg4NzZFLCAweDg3NTksIDB4ODc1MywgMHg4NzYzLAotICAgIDB4ODc2QSwgMHg4ODA1LCAweDg3QTIsIDB4ODc5RiwgMHg4NzgyLCAweDg3QUYsIDB4ODdDQiwgMHg4N0JELAotICAgIDB4ODdDMCwgMHg4N0QwLCAweDk2RDYsIDB4ODdBQiwgMHg4N0M0LCAweDg3QjMsIDB4ODdDNywgMHg4N0M2LAotICAgIDB4ODdCQiwgMHg4N0VGLCAweDg3RjIsIDB4ODdFMCwgMHg4ODBGLCAweDg4MEQsIDB4ODdGRSwgMHg4N0Y2LAotICAgIDB4ODdGNywgMHg4ODBFLCAweDg3RDIsIDB4ODgxMSwgMHg4ODE2LCAweDg4MTUsIDB4ODgyMiwgMHg4ODIxLAotICAgIDB4ODgzMSwgMHg4ODM2LCAweDg4MzksIDB4ODgyNywgMHg4ODNCLCAweDg4NDQsIDB4ODg0MiwgMHg4ODUyLAotICAgIDB4ODg1OSwgMHg4ODVFLCAweDg4NjIsIDB4ODg2QiwgMHg4ODgxLCAweDg4N0UsIDB4ODg5RSwgMHg4ODc1LAotICAgIDB4ODg3RCwgMHg4OEI1LCAweDg4NzIsIDB4ODg4MiwgMHg4ODk3LCAweDg4OTIsIDB4ODhBRSwgMHg4ODk5LAotICAgIDB4ODhBMiwgMHg4ODhELCAweDg4QTQsIDB4ODhCMCwgMHg4OEJGLCAweDg4QjEsIDB4ODhDMywgMHg4OEM0LAotICAgIDB4ODhENCwgMHg4OEQ4LCAweDg4RDksIDB4ODhERCwgMHg4OEY5LCAweDg5MDIsIDB4ODhGQywgMHg4OEY0LAotICAgIDB4ODhFOCwgMHg4OEYyLCAweDg5MDQsIDB4ODkwQywgMHg4OTBBLCAweDg5MTMsIDB4ODk0MywgMHg4OTFFLAotICAgIDB4ODkyNSwgMHg4OTJBLCAweDg5MkIsIDB4ODk0MSwgMHg4OTQ0LCAweDg5M0IsIDB4ODkzNiwgMHg4OTM4LAotICAgIDB4ODk0QywgMHg4OTFELCAweDg5NjAsIDB4ODk1RSwgMHg4OTY2LCAweDg5NjQsIDB4ODk2RCwgMHg4OTZBLAotICAgIDB4ODk2RiwgMHg4OTc0LCAweDg5NzcsIDB4ODk3RSwgMHg4OTgzLCAweDg5ODgsIDB4ODk4QSwgMHg4OTkzLAotICAgIDB4ODk5OCwgMHg4OUExLCAweDg5QTksIDB4ODlBNiwgMHg4OUFDLCAweDg5QUYsIDB4ODlCMiwgMHg4OUJBLAotICAgIDB4ODlCRCwgMHg4OUJGLCAweDg5QzAsIDB4ODlEQSwgMHg4OURDLCAweDg5REQsIDB4ODlFNywgMHg4OUY0LAotICAgIDB4ODlGOCwgMHg4QTAzLCAweDhBMTYsIDB4OEExMCwgMHg4QTBDLCAweDhBMUIsIDB4OEExRCwgMHg4QTI1LAotICAgIDB4OEEzNiwgMHg4QTQxLCAweDhBNUIsIDB4OEE1MiwgMHg4QTQ2LCAweDhBNDgsIDB4OEE3QywgMHg4QTZELAotICAgIDB4OEE2QywgMHg4QTYyLCAweDhBODUsIDB4OEE4MiwgMHg4QTg0LCAweDhBQTgsIDB4OEFBMSwgMHg4QTkxLAotICAgIDB4OEFBNSwgMHg4QUE2LCAweDhBOUEsIDB4OEFBMywgMHg4QUM0LCAweDhBQ0QsIDB4OEFDMiwgMHg4QURBLAotICAgIDB4OEFFQiwgMHg4QUYzLCAweDhBRTcsIDB4OEFFNCwgMHg4QUYxLCAweDhCMTQsIDB4OEFFMCwgMHg4QUUyLAotICAgIDB4OEFGNywgMHg4QURFLCAweDhBREIsIDB4OEIwQywgMHg4QjA3LCAweDhCMUEsIDB4OEFFMSwgMHg4QjE2LAotICAgIDB4OEIxMCwgMHg4QjE3LCAweDhCMjAsIDB4OEIzMywgMHg5N0FCLCAweDhCMjYsIDB4OEIyQiwgMHg4QjNFLAotICAgIDB4OEIyOCwgMHg4QjQxLCAweDhCNEMsIDB4OEI0RiwgMHg4QjRFLCAweDhCNDksIDB4OEI1NiwgMHg4QjVCLAotICAgIDB4OEI1QSwgMHg4QjZCLCAweDhCNUYsIDB4OEI2QywgMHg4QjZGLCAweDhCNzQsIDB4OEI3RCwgMHg4QjgwLAotICAgIDB4OEI4QywgMHg4QjhFLCAweDhCOTIsIDB4OEI5MywgMHg4Qjk2LCAweDhCOTksIDB4OEI5QSwgMHg4QzNBLAotICAgIDB4OEM0MSwgMHg4QzNGLCAweDhDNDgsIDB4OEM0QywgMHg4QzRFLCAweDhDNTAsIDB4OEM1NSwgMHg4QzYyLAotICAgIDB4OEM2QywgMHg4Qzc4LCAweDhDN0EsIDB4OEM4MiwgMHg4Qzg5LCAweDhDODUsIDB4OEM4QSwgMHg4QzhELAotICAgIDB4OEM4RSwgMHg4Qzk0LCAweDhDN0MsIDB4OEM5OCwgMHg2MjFELCAweDhDQUQsIDB4OENBQSwgMHg4Q0JELAotICAgIDB4OENCMiwgMHg4Q0IzLCAweDhDQUUsIDB4OENCNiwgMHg4Q0M4LCAweDhDQzEsIDB4OENFNCwgMHg4Q0UzLAotICAgIDB4OENEQSwgMHg4Q0ZELCAweDhDRkEsIDB4OENGQiwgMHg4RDA0LCAweDhEMDUsIDB4OEQwQSwgMHg4RDA3LAotICAgIDB4OEQwRiwgMHg4RDBELCAweDhEMTAsIDB4OUY0RSwgMHg4RDEzLCAweDhDQ0QsIDB4OEQxNCwgMHg4RDE2LAotICAgIDB4OEQ2NywgMHg4RDZELCAweDhENzEsIDB4OEQ3MywgMHg4RDgxLCAweDhEOTksIDB4OERDMiwgMHg4REJFLAotICAgIDB4OERCQSwgMHg4RENGLCAweDhEREEsIDB4OERENiwgMHg4RENDLCAweDhEREIsIDB4OERDQiwgMHg4REVBLAotICAgIDB4OERFQiwgMHg4RERGLCAweDhERTMsIDB4OERGQywgMHg4RTA4LCAweDhFMDksIDB4OERGRiwgMHg4RTFELAotICAgIDB4OEUxRSwgMHg4RTEwLCAweDhFMUYsIDB4OEU0MiwgMHg4RTM1LCAweDhFMzAsIDB4OEUzNCwgMHg4RTRBLAotICAgIDB4OEU0NywgMHg4RTQ5LCAweDhFNEMsIDB4OEU1MCwgMHg4RTQ4LCAweDhFNTksIDB4OEU2NCwgMHg4RTYwLAotICAgIDB4OEUyQSwgMHg4RTYzLCAweDhFNTUsIDB4OEU3NiwgMHg4RTcyLCAweDhFN0MsIDB4OEU4MSwgMHg4RTg3LAotICAgIDB4OEU4NSwgMHg4RTg0LCAweDhFOEIsIDB4OEU4QSwgMHg4RTkzLCAweDhFOTEsIDB4OEU5NCwgMHg4RTk5LAotICAgIDB4OEVBQSwgMHg4RUExLCAweDhFQUMsIDB4OEVCMCwgMHg4RUM2LCAweDhFQjEsIDB4OEVCRSwgMHg4RUM1LAotICAgIDB4OEVDOCwgMHg4RUNCLCAweDhFREIsIDB4OEVFMywgMHg4RUZDLCAweDhFRkIsIDB4OEVFQiwgMHg4RUZFLAotICAgIDB4OEYwQSwgMHg4RjA1LCAweDhGMTUsIDB4OEYxMiwgMHg4RjE5LCAweDhGMTMsIDB4OEYxQywgMHg4RjFGLAotICAgIDB4OEYxQiwgMHg4RjBDLCAweDhGMjYsIDB4OEYzMywgMHg4RjNCLCAweDhGMzksIDB4OEY0NSwgMHg4RjQyLAotICAgIDB4OEYzRSwgMHg4RjRDLCAweDhGNDksIDB4OEY0NiwgMHg4RjRFLCAweDhGNTcsIDB4OEY1QywgMHg4RjYyLAotICAgIDB4OEY2MywgMHg4RjY0LCAweDhGOUMsIDB4OEY5RiwgMHg4RkEzLCAweDhGQUQsIDB4OEZBRiwgMHg4RkI3LAotICAgIDB4OEZEQSwgMHg4RkU1LCAweDhGRTIsIDB4OEZFQSwgMHg4RkVGLCAweDkwODcsIDB4OEZGNCwgMHg5MDA1LAotICAgIDB4OEZGOSwgMHg4RkZBLCAweDkwMTEsIDB4OTAxNSwgMHg5MDIxLCAweDkwMEQsIDB4OTAxRSwgMHg5MDE2LAotICAgIDB4OTAwQiwgMHg5MDI3LCAweDkwMzYsIDB4OTAzNSwgMHg5MDM5LCAweDhGRjgsIDB4OTA0RiwgMHg5MDUwLAotICAgIDB4OTA1MSwgMHg5MDUyLCAweDkwMEUsIDB4OTA0OSwgMHg5MDNFLCAweDkwNTYsIDB4OTA1OCwgMHg5MDVFLAotICAgIDB4OTA2OCwgMHg5MDZGLCAweDkwNzYsIDB4OTZBOCwgMHg5MDcyLCAweDkwODIsIDB4OTA3RCwgMHg5MDgxLAotICAgIDB4OTA4MCwgMHg5MDhBLCAweDkwODksIDB4OTA4RiwgMHg5MEE4LCAweDkwQUYsIDB4OTBCMSwgMHg5MEI1LAotICAgIDB4OTBFMiwgMHg5MEU0LCAweDYyNDgsIDB4OTBEQiwgMHg5MTAyLCAweDkxMTIsIDB4OTExOSwgMHg5MTMyLAotICAgIDB4OTEzMCwgMHg5MTRBLCAweDkxNTYsIDB4OTE1OCwgMHg5MTYzLCAweDkxNjUsIDB4OTE2OSwgMHg5MTczLAotICAgIDB4OTE3MiwgMHg5MThCLCAweDkxODksIDB4OTE4MiwgMHg5MUEyLCAweDkxQUIsIDB4OTFBRiwgMHg5MUFBLAotICAgIDB4OTFCNSwgMHg5MUI0LCAweDkxQkEsIDB4OTFDMCwgMHg5MUMxLCAweDkxQzksIDB4OTFDQiwgMHg5MUQwLAotICAgIDB4OTFENiwgMHg5MURGLCAweDkxRTEsIDB4OTFEQiwgMHg5MUZDLCAweDkxRjUsIDB4OTFGNiwgMHg5MjFFLAotICAgIDB4OTFGRiwgMHg5MjE0LCAweDkyMkMsIDB4OTIxNSwgMHg5MjExLCAweDkyNUUsIDB4OTI1NywgMHg5MjQ1LAotICAgIDB4OTI0OSwgMHg5MjY0LCAweDkyNDgsIDB4OTI5NSwgMHg5MjNGLCAweDkyNEIsIDB4OTI1MCwgMHg5MjlDLAotICAgIDB4OTI5NiwgMHg5MjkzLCAweDkyOUIsIDB4OTI1QSwgMHg5MkNGLCAweDkyQjksIDB4OTJCNywgMHg5MkU5LAotICAgIDB4OTMwRiwgMHg5MkZBLCAweDkzNDQsIDB4OTMyRSwgMHg5MzE5LCAweDkzMjIsIDB4OTMxQSwgMHg5MzIzLAotICAgIDB4OTMzQSwgMHg5MzM1LCAweDkzM0IsIDB4OTM1QywgMHg5MzYwLCAweDkzN0MsIDB4OTM2RSwgMHg5MzU2LAotICAgIDB4OTNCMCwgMHg5M0FDLCAweDkzQUQsIDB4OTM5NCwgMHg5M0I5LCAweDkzRDYsIDB4OTNENywgMHg5M0U4LAotICAgIDB4OTNFNSwgMHg5M0Q4LCAweDkzQzMsIDB4OTNERCwgMHg5M0QwLCAweDkzQzgsIDB4OTNFNCwgMHg5NDFBLAotICAgIDB4OTQxNCwgMHg5NDEzLCAweDk0MDMsIDB4OTQwNywgMHg5NDEwLCAweDk0MzYsIDB4OTQyQiwgMHg5NDM1LAotICAgIDB4OTQyMSwgMHg5NDNBLCAweDk0NDEsIDB4OTQ1MiwgMHg5NDQ0LCAweDk0NUIsIDB4OTQ2MCwgMHg5NDYyLAotICAgIDB4OTQ1RSwgMHg5NDZBLCAweDkyMjksIDB4OTQ3MCwgMHg5NDc1LCAweDk0NzcsIDB4OTQ3RCwgMHg5NDVBLAotICAgIDB4OTQ3QywgMHg5NDdFLCAweDk0ODEsIDB4OTQ3RiwgMHg5NTgyLCAweDk1ODcsIDB4OTU4QSwgMHg5NTk0LAotICAgIDB4OTU5NiwgMHg5NTk4LCAweDk1OTksIDB4OTVBMCwgMHg5NUE4LCAweDk1QTcsIDB4OTVBRCwgMHg5NUJDLAotICAgIDB4OTVCQiwgMHg5NUI5LCAweDk1QkUsIDB4OTVDQSwgMHg2RkY2LCAweDk1QzMsIDB4OTVDRCwgMHg5NUNDLAotICAgIDB4OTVENSwgMHg5NUQ0LCAweDk1RDYsIDB4OTVEQywgMHg5NUUxLCAweDk1RTUsIDB4OTVFMiwgMHg5NjIxLAotICAgIDB4OTYyOCwgMHg5NjJFLCAweDk2MkYsIDB4OTY0MiwgMHg5NjRDLCAweDk2NEYsIDB4OTY0QiwgMHg5Njc3LAotICAgIDB4OTY1QywgMHg5NjVFLCAweDk2NUQsIDB4OTY1RiwgMHg5NjY2LCAweDk2NzIsIDB4OTY2QywgMHg5NjhELAotICAgIDB4OTY5OCwgMHg5Njk1LCAweDk2OTcsIDB4OTZBQSwgMHg5NkE3LCAweDk2QjEsIDB4OTZCMiwgMHg5NkIwLAotICAgIDB4OTZCNCwgMHg5NkI2LCAweDk2QjgsIDB4OTZCOSwgMHg5NkNFLCAweDk2Q0IsIDB4OTZDOSwgMHg5NkNELAotICAgIDB4ODk0RCwgMHg5NkRDLCAweDk3MEQsIDB4OTZENSwgMHg5NkY5LCAweDk3MDQsIDB4OTcwNiwgMHg5NzA4LAotICAgIDB4OTcxMywgMHg5NzBFLCAweDk3MTEsIDB4OTcwRiwgMHg5NzE2LCAweDk3MTksIDB4OTcyNCwgMHg5NzJBLAotICAgIDB4OTczMCwgMHg5NzM5LCAweDk3M0QsIDB4OTczRSwgMHg5NzQ0LCAweDk3NDYsIDB4OTc0OCwgMHg5NzQyLAotICAgIDB4OTc0OSwgMHg5NzVDLCAweDk3NjAsIDB4OTc2NCwgMHg5NzY2LCAweDk3NjgsIDB4NTJEMiwgMHg5NzZCLAotICAgIDB4OTc3MSwgMHg5Nzc5LCAweDk3ODUsIDB4OTc3QywgMHg5NzgxLCAweDk3N0EsIDB4OTc4NiwgMHg5NzhCLAotICAgIDB4OTc4RiwgMHg5NzkwLCAweDk3OUMsIDB4OTdBOCwgMHg5N0E2LCAweDk3QTMsIDB4OTdCMywgMHg5N0I0LAotICAgIDB4OTdDMywgMHg5N0M2LCAweDk3QzgsIDB4OTdDQiwgMHg5N0RDLCAweDk3RUQsIDB4OUY0RiwgMHg5N0YyLAotICAgIDB4N0FERiwgMHg5N0Y2LCAweDk3RjUsIDB4OTgwRiwgMHg5ODBDLCAweDk4MzgsIDB4OTgyNCwgMHg5ODIxLAotICAgIDB4OTgzNywgMHg5ODNELCAweDk4NDYsIDB4OTg0RiwgMHg5ODRCLCAweDk4NkIsIDB4OTg2RiwgMHg5ODcwLAotICAgIDB4OTg3MSwgMHg5ODc0LCAweDk4NzMsIDB4OThBQSwgMHg5OEFGLCAweDk4QjEsIDB4OThCNiwgMHg5OEM0LAotICAgIDB4OThDMywgMHg5OEM2LCAweDk4RTksIDB4OThFQiwgMHg5OTAzLCAweDk5MDksIDB4OTkxMiwgMHg5OTE0LAotICAgIDB4OTkxOCwgMHg5OTIxLCAweDk5MUQsIDB4OTkxRSwgMHg5OTI0LCAweDk5MjAsIDB4OTkyQywgMHg5OTJFLAotICAgIDB4OTkzRCwgMHg5OTNFLCAweDk5NDIsIDB4OTk0OSwgMHg5OTQ1LCAweDk5NTAsIDB4OTk0QiwgMHg5OTUxLAotICAgIDB4OTk1MiwgMHg5OTRDLCAweDk5NTUsIDB4OTk5NywgMHg5OTk4LCAweDk5QTUsIDB4OTlBRCwgMHg5OUFFLAotICAgIDB4OTlCQywgMHg5OURGLCAweDk5REIsIDB4OTlERCwgMHg5OUQ4LCAweDk5RDEsIDB4OTlFRCwgMHg5OUVFLAotICAgIDB4OTlGMSwgMHg5OUYyLCAweDk5RkIsIDB4OTlGOCwgMHg5QTAxLCAweDlBMEYsIDB4OUEwNSwgMHg5OUUyLAotICAgIDB4OUExOSwgMHg5QTJCLCAweDlBMzcsIDB4OUE0NSwgMHg5QTQyLCAweDlBNDAsIDB4OUE0MywgMHg5QTNFLAotICAgIDB4OUE1NSwgMHg5QTRELCAweDlBNUIsIDB4OUE1NywgMHg5QTVGLCAweDlBNjIsIDB4OUE2NSwgMHg5QTY0LAotICAgIDB4OUE2OSwgMHg5QTZCLCAweDlBNkEsIDB4OUFBRCwgMHg5QUIwLCAweDlBQkMsIDB4OUFDMCwgMHg5QUNGLAotICAgIDB4OUFEMSwgMHg5QUQzLCAweDlBRDQsIDB4OUFERSwgMHg5QURGLCAweDlBRTIsIDB4OUFFMywgMHg5QUU2LAotICAgIDB4OUFFRiwgMHg5QUVCLCAweDlBRUUsIDB4OUFGNCwgMHg5QUYxLCAweDlBRjcsIDB4OUFGQiwgMHg5QjA2LAotICAgIDB4OUIxOCwgMHg5QjFBLCAweDlCMUYsIDB4OUIyMiwgMHg5QjIzLCAweDlCMjUsIDB4OUIyNywgMHg5QjI4LAotICAgIDB4OUIyOSwgMHg5QjJBLCAweDlCMkUsIDB4OUIyRiwgMHg5QjMyLCAweDlCNDQsIDB4OUI0MywgMHg5QjRGLAotICAgIDB4OUI0RCwgMHg5QjRFLCAweDlCNTEsIDB4OUI1OCwgMHg5Qjc0LCAweDlCOTMsIDB4OUI4MywgMHg5QjkxLAotICAgIDB4OUI5NiwgMHg5Qjk3LCAweDlCOUYsIDB4OUJBMCwgMHg5QkE4LCAweDlCQjQsIDB4OUJDMCwgMHg5QkNBLAotICAgIDB4OUJCOSwgMHg5QkM2LCAweDlCQ0YsIDB4OUJEMSwgMHg5QkQyLCAweDlCRTMsIDB4OUJFMiwgMHg5QkU0LAotICAgIDB4OUJENCwgMHg5QkUxLCAweDlDM0EsIDB4OUJGMiwgMHg5QkYxLCAweDlCRjAsIDB4OUMxNSwgMHg5QzE0LAotICAgIDB4OUMwOSwgMHg5QzEzLCAweDlDMEMsIDB4OUMwNiwgMHg5QzA4LCAweDlDMTIsIDB4OUMwQSwgMHg5QzA0LAotICAgIDB4OUMyRSwgMHg5QzFCLCAweDlDMjUsIDB4OUMyNCwgMHg5QzIxLCAweDlDMzAsIDB4OUM0NywgMHg5QzMyLAotICAgIDB4OUM0NiwgMHg5QzNFLCAweDlDNUEsIDB4OUM2MCwgMHg5QzY3LCAweDlDNzYsIDB4OUM3OCwgMHg5Q0U3LAotICAgIDB4OUNFQywgMHg5Q0YwLCAweDlEMDksIDB4OUQwOCwgMHg5Q0VCLCAweDlEMDMsIDB4OUQwNiwgMHg5RDJBLAotICAgIDB4OUQyNiwgMHg5REFGLCAweDlEMjMsIDB4OUQxRiwgMHg5RDQ0LCAweDlEMTUsIDB4OUQxMiwgMHg5RDQxLAotICAgIDB4OUQzRiwgMHg5RDNFLCAweDlENDYsIDB4OUQ0OCwgMHg5RDVELCAweDlENUUsIDB4OUQ2NCwgMHg5RDUxLAotICAgIDB4OUQ1MCwgMHg5RDU5LCAweDlENzIsIDB4OUQ4OSwgMHg5RDg3LCAweDlEQUIsIDB4OUQ2RiwgMHg5RDdBLAotICAgIDB4OUQ5QSwgMHg5REE0LCAweDlEQTksIDB4OURCMiwgMHg5REM0LCAweDlEQzEsIDB4OURCQiwgMHg5REI4LAotICAgIDB4OURCQSwgMHg5REM2LCAweDlEQ0YsIDB4OURDMiwgMHg5REQ5LCAweDlERDMsIDB4OURGOCwgMHg5REU2LAotICAgIDB4OURFRCwgMHg5REVGLCAweDlERkQsIDB4OUUxQSwgMHg5RTFCLCAweDlFMUUsIDB4OUU3NSwgMHg5RTc5LAotICAgIDB4OUU3RCwgMHg5RTgxLCAweDlFODgsIDB4OUU4QiwgMHg5RThDLCAweDlFOTIsIDB4OUU5NSwgMHg5RTkxLAotICAgIDB4OUU5RCwgMHg5RUE1LCAweDlFQTksIDB4OUVCOCwgMHg5RUFBLCAweDlFQUQsIDB4OTc2MSwgMHg5RUNDLAotICAgIDB4OUVDRSwgMHg5RUNGLCAweDlFRDAsIDB4OUVENCwgMHg5RURDLCAweDlFREUsIDB4OUVERCwgMHg5RUUwLAotICAgIDB4OUVFNSwgMHg5RUU4LCAweDlFRUYsIDB4OUVGNCwgMHg5RUY2LCAweDlFRjcsIDB4OUVGOSwgMHg5RUZCLAotICAgIDB4OUVGQywgMHg5RUZELCAweDlGMDcsIDB4OUYwOCwgMHg3NkI3LCAweDlGMTUsIDB4OUYyMSwgMHg5RjJDLAotICAgIDB4OUYzRSwgMHg5RjRBLCAweDlGNTIsIDB4OUY1NCwgMHg5RjYzLCAweDlGNUYsIDB4OUY2MCwgMHg5RjYxLAotICAgIDB4OUY2NiwgMHg5RjY3LCAweDlGNkMsIDB4OUY2QSwgMHg5Rjc3LCAweDlGNzIsIDB4OUY3NiwgMHg5Rjk1LAotICAgIDB4OUY5QywgMHg5RkEwLCAweDU4MkYsIDB4NjlDNywgMHg5MDU5LCAweDc0NjQsIDB4MjY0MiwgMHgyNTAwLAotICAgIDB4MjUwMSwgMHgyNTAyLCAweDI1MDMsIDB4MjUwNCwgMHgyNTA1LCAweDI1MDYsIDB4MjUwNywgMHgyNTA4LAotICAgIDB4MjUwOSwgMHgyNTBBLCAweDI1MEIsIDB4MjUwQywgMHgyNTBELCAweDI1MEUsIDB4MjUwRiwgMHgyNTEwLAotICAgIDB4MjUxMSwgMHgyNTEyLCAweDI1MTMsIDB4MjUxNCwgMHgyNTE1LCAweDI1MTYsIDB4MjUxNywgMHgyNTE4LAotICAgIDB4MjUxOSwgMHgyNTFBLCAweDI1MUIsIDB4MjUxQywgMHgyNTFELCAweDI1MUUsIDB4MjUxRiwgMHgyNTIwLAotICAgIDB4MjUyMSwgMHgyNTIyLCAweDI1MjMsIDB4MjUyNCwgMHgyNTI1LCAweDI1MjYsIDB4MjUyNywgMHgyNTI4LAotICAgIDB4MjUyOSwgMHgyNTJBLCAweDI1MkIsIDB4MjUyQywgMHgyNTJELCAweDI1MkUsIDB4MjUyRiwgMHgyNTMwLAotICAgIDB4MjUzMSwgMHgyNTMyLCAweDI1MzMsIDB4MjUzNCwgMHgyNTM1LCAweDI1MzYsIDB4MjUzNywgMHgyNTM4LAotICAgIDB4MjUzOSwgMHgyNTNBLCAweDI1M0IsIDB4MjUzQywgMHgyNTNELCAweDI1M0UsIDB4MjUzRiwgMHgyNTQwLAotICAgIDB4MjU0MSwgMHgyNTQyLCAweDI1NDMsIDB4MjU0NCwgMHgyNTQ1LCAweDI1NDYsIDB4MjU0NywgMHgyNTQ4LAotICAgIDB4MjU0OSwgMHgyNTRBLCAweDI1NEIsIDB4MjQ2MCwgMHgyNDYxLCAweDI0NjIsIDB4MjQ2MywgMHgyNDY0LAotICAgIDB4MjQ2NSwgMHgyNDY2LCAweDI0NjcsIDB4MjQ2OCwgMHgyNDY5LCAweDI0NkEsIDB4MjQ2QiwgMHgyNDZDLAotICAgIDB4MjQ2RCwgMHgyNDZFLCAweDI0NkYsIDB4MjQ3MCwgMHgyNDcxLCAweDI0NzIsIDB4MjQ3MywgMHgyMTYwLAotICAgIDB4MjE2MSwgMHgyMTYyLCAweDIxNjMsIDB4MjE2NCwgMHgyMTY1LCAweDIxNjYsIDB4MjE2NywgMHgyMTY4LAotICAgIDB4MjE2OSwgMHgzMzQ5LCAweDMzMTQsIDB4MzMyMiwgMHgzMzRELCAweDMzMTgsIDB4MzMyNywgMHgzMzAzLAotICAgIDB4MzMzNiwgMHgzMzUxLCAweDMzNTcsIDB4MzMwRCwgMHgzMzI2LCAweDMzMjMsIDB4MzMyQiwgMHgzMzRBLAotICAgIDB4MzMzQiwgMHgzMzlDLCAweDMzOUQsIDB4MzM5RSwgMHgzMzhFLCAweDMzOEYsIDB4MzNDNCwgMHgzM0ExLAotICAgIDB4MzAxRCwgMHgzMDFGLCAweDIxMTYsIDB4MzNDRCwgMHgyMTIxLCAweDMyQTQsIDB4MzJBNSwgMHgzMkE2LAotICAgIDB4MzJBNywgMHgzMkE4LCAweDMyMzEsIDB4MzIzMiwgMHgzMjM5LCAweDMzN0UsIDB4MzM3RCwgMHgzMzdDLAotICAgIDB4MjIyRSwgMHgyMjExLCAweDIyMUEsIDB4MjJBNSwgMHgyMjIwLCAweDIyMUYsIDB4MjJCRiwgMHgyMjI5LAotICAgIDB4MjIyQSwgMHg1NTVFLCAweDk4RjQsIDB4NkVBMiwgMHg5QzJGLCAweDZERUIsIDB4OEZDMiwgMHg2QjFELAotICAgIDB4NTNBOSwgMHg5NThGLCAweDU2NDIsIDB4OTkwQywgMHg3MTMwLCAweDg5NTYsIDB4OURENywgMHg4RkU2LAotICAgIDB4NjA2MiwgMHg2MkQwLCAweDY2NjYsIDB4NTU5RCwgMHg4NDVCLCAweDk3ODQsIDB4NTY5OSwgMHg2Rjk3LAotICAgIDB4N0ZGMCwgMHg3RkVCLCAweDVGQkQsIDB4Nzk0NywgMHg0RkUwLCAweDUzN0YsIDB4NTBDNSwgMHg4RUMwLAotICAgIDB4NTVCMCwgMHg2QURCLCAweDVDNTEsIDB4OTc3NCwgMHg3OTQxLCAweDYxNjcsIDB4N0EzRCwgMHg3RTZCLAotICAgIDB4ODM0QSwgMHg5Njk5LCAweDUwMjYsIDB4NUFDQywgMHg2MzcyLCAweDlFN0MsIDB4OEFGQSwgMHg1REY3LAotICAgIDB4NjYzQiwgMHg2RTlELCAweDlFQjQsIDB4OUQ2MCwgMHg3NTExLCAweDkxQzcsIDB4Njk4QSwgMHg2ODA1LAotICAgIDB4ODVBOSwgMHg5QkQ2LCAweDkzMDYsIDB4NzNDQSwgMHg1M0YxLCAweDVDNjIsIDB4OTA2RSwgMHg2NzUzLAotICAgIDB4NzA3QywgMHg3RTYxLCAweDkxNEIsIDB4NjZEOSwgMHg2RTFBLCAweDg1QUYsIDB4ODVGNywgMHg1NEU4LAotICAgIDB4NUVFMCwgMHg2OEEyLCAweDg1MjMsIDB4OTFBQywgMHg5Nzk4LCAweDg3NTUsIDB4OTc3MSwgMHg5MDE3LAotICAgIDB4N0ZFMCwgMHg2NDdBLCAweDkwMUQsIDB4ODdFQywgMHg2NEIwLCAweDY4MTMsIDB4NzE0RSwgMHg3MTdELAotICAgIDB4OEE2RSwgMHg1NjRDLCAweDkwNjEsIDB4NTI3NSwgMHg2NDE0LCAweDc2MjYsIDB4OTA1QywgMHg5QTUyLAotICAgIDB4ODE3RiwgMHg5RURCLCAweDU1NDQsIDB4NkZFRiwgMHg3NDIyLCAweDg2RjgsIDB4NURGRCwgMHg4RkJGLAotICAgIDB4NjhEQSwgMHg5QzQ4LCAweDZBM0QsIDB4N0MxRSwgMHg4QTNCLCAweDcwMjYsIDB4NTFDQiwgMHg2MzU3LAotICAgIDB4NjlDQywgMHg5MzlBLCAweDU4NUEsIDB4NjQ1MSwgMHg5MTJELCAweDY0RTIsIDB4NkVCQSwgMHg1ODYxLAotICAgIDB4OTg1QSwgMHg1ODM1LCAweDVDNjAsIDB4ODNERiwgMHg4Q0VELCAweDU4NTgsIDB4NzlCMSwgMHg5RDA3LAotICAgIDB4NzAwNiwgMHg3MDFFLCAweDU2NzgsIDB4OTA0MSwgMHg5ODEzLCAweDkwQTMsIDB4OEIwRSwgMHg3MDU4LAotICAgIDB4Njk2MiwgMHg3OUIwLCAweDU2Q0EsIDB4NzI0QywgMHg5MDE5LCAweDc5RTQsIDB4NTI1RCwgMHg3QkI4LAotICAgIDB4NkY1MSwgMHg5MUIxLCAweDYzM0QsIDB4NjI0OSwgMHg2QTBCLCAweDY3Q0EsIDB4N0ExNywgMHg5MDNDLAotICAgIDB4NUE5QiwgMHg4QjJDLCAweDVFREYsIDB4NzAxNSwgMHg5ODNCLCAweDg1M0QsIDB4NzdBNSwgMHg1QTI5LAotICAgIDB4NUU5NiwgMHg2Q0UxLCAweDg0RUMsIDB4OTgzMCwgMHg5QzUyLCAweDlFQjUsIDB4NTEzMiwgMHg5OTA1LAotICAgIDB4N0M3RSwgMHg5NDUzLCAweDYxMDgsIDB4NzY1MiwgMHg3MzM3LCAweDcxOTQsIDB4ODAwMCwgMHg4NDBBLAotICAgIDB4OTA3QywgMHg2RjIzLCAweDcxNDksIDB4ODRFRSwgMHg2OTk0LCAweDg4MUYsIDB4NTE1NCwgMHg1MTg5LAotICAgIDB4NTE5NSwgMHg1MUE0LCAweDU1MzksIDB4NTUzMywgMHg1NUU0LCAweDU2MzIsIDB4NTZBNSwgMHg1ODBCLAotICAgIDB4NUFCRSwgMHg1QkMzLCAweDVDNUIsIDB4NUU2NCwgMHg2MDk3LCAweDYzNjksIDB4NjQwNiwgMHg2NTIyLAotICAgIDB4NjU4MywgMHg2N0E2LCAweDY3QjQsIDB4Njg5QiwgMHg2ODhFLCAweDZFNkUsIDB4NzFENywgMHg3MjI4LAotICAgIDB4NzNDRSwgMHg3NTA0LCAweDc1MEQsIDB4NzUxNSwgMHg3NjkzLCAweDc4N0MsIDB4N0EzMSwgMHg5RjlELAotICAgIDB4N0I5OSwgMHg3QzkwLCAweDdDQUUsIDB4N0Q5QiwgMHg3REFFLCAweDdEOUYsIDB4N0ZENCwgMHg4MjJFLAotICAgIDB4ODI4RCwgMHg4MkQyLCAweDgzMjMsIDB4ODM3NSwgMHg4NTE3LCAweDg1M0UsIDB4ODc4MiwgMHg4N0QyLAotICAgIDB4ODkwQSwgMHg4OUFGLCAweDhBREUsIDB4OEI0MSwgMHg4RERBLCAweDhFMDksIDB4OEYxMywgMHg4RkVBLAotICAgIDB4OEZFOSwgMHg5MDU4LCAweDYyNDgsIDB4OTFDMSwgMHg5NUJCLCAweDc3NjIsIDB4OTcyNCwgMHg5NzYwLAotICAgIDB4OTc2RCwgMHg5ODI0LCAweDlCMkUsIDB4OUI5NywgMHg5QkYyLCAweDlFQUEsIDB4OUY5QywgMHgzMDAxLAotICAgIDB4MzAwMiwgMHgyMDNFLCAweEZGM0YsIDB4MzBGQywgMHgyMDE1LCAweDIwMTAsIDB4MzAxQywgMHgyMDE2LAotICAgIDB4RkY1QywgMHgyMDI2LCAweDIwMjUsIDB4RkYwOCwgMHhGRjA5LCAweDMwMTQsIDB4MzAxNSwgMHhGRjNCLAotICAgIDB4RkYzRCwgMHhGRjVCLCAweEZGNUQsIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwgMHgzMDBDLAotICAgIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MzAxMCwgMHgzMDExLCAweEZGMUQsIDB4MzA0MSwgMHgzMDQzLAotICAgIDB4MzA0NSwgMHgzMDQ3LCAweDMwNDksIDB4MzA2MywgMHgzMDgzLCAweDMwODUsIDB4MzA4NywgMHgzMDhFLAotICAgIDB4MzBBMSwgMHgzMEEzLCAweDMwQTUsIDB4MzBBNywgMHgzMEE5LCAweDMwQzMsIDB4MzBFMywgMHgzMEU1LAotICAgIDB4MzBFNywgMHgzMEVFLCAweDMwRjUsIDB4MzBGNiwgMHgzMzQ5LCAweDMzMTQsIDB4MzMyMiwgMHgzMzRELAotICAgIDB4MzMxOCwgMHgzMzI3LCAweDMzMDMsIDB4MzMzNiwgMHgzMzUxLCAweDMzNTcsIDB4MzMwRCwgMHgzMzI2LAotICAgIDB4MzMyMywgMHgzMzJCLCAweDMzNEEsIDB4MzMzQiwgMHgzMDFELCAweDMwMUUsIDB4MzA5NCwgMHgzMDRCLAotICAgIDB4MzA1MSwgMHg4MkE2LCAweDgzMjgsIDB4NTY1MywgMHg1M0E5LCAweDcyNTksIDB4NkM3MiwgMHg3QjA4LAotICAgIDB4OTk1NywgMHg2MkYzLCAweDk5MTAsIDB4OTc2RCwgMHg3MTdELCAweDdBN0YsIDB4N0JBRCwgMHg2M0MzLAotICAgIDB4ODNERiwgMHg3OTYyLCAweDUzREIsIDB4N0JDNywgMHg4RkM0LCAweDdDM0UsIDB4NTBDQSwgMHg1MzE1LAotICAgIDB4NTVBOSwgMHg1NkFFLCAweDU4MTksIDB4NTkxQiwgMHg1QzI4LCAweDVFRDAsIDB4NUVDRiwgMHg2MjQxLAotICAgIDB4NjZDMSwgMHg2QzA4LCAweDZFMjMsIDB4NkVFQywgMHg3QTk3LCAweDdCREQsIDB4N0ZFOSwgMHg4NDIyLAotICAgIDB4ODc1OSwgMHg4ODBFLCAweDg3RDIsIDB4OUExOSwgMHg5RUFELCAweEZGRTQsIDB4RkYwNywgMHhGRjAyLAotICAgIDB4MTFBOCwgMHgyNUMxLCAweDI1QjcsIDB4MjFFOSwgMHgyMUU3LCAweDIxRTYsIDB4MjFFOCwgMHgyNUEyLAotICAgIDB4MjY2NywgMHgyNjYxLCAweDI2NjQsIDB4MjY2MiwgMHgzM0EwLCAweDMzQTIsIDB4MzNBNCwgMHgzM0E1LAotICAgIDB4MzM5NywgMHgyMTEzLCAweDMzOTgsIDB4MzNCMywgMHgzM0IyLCAweDMzQjEsIDB4MzNCMCwgMHgzMzg1LAotICAgIDB4MzM4NiwgMHgzMzg3LCAweDMzQ0IsIDB4MzM5MCwgMHgzM0Q0LCAweDMzOTYsIDB4MzMyMiwgMHgzMzE2LAotICAgIDB4MzMxOCwgMHgzMzE1LCAweDMzMDMsIDB4MzMyMywgMHgzMzU3LCAweDMzNDIsIDB4MzMzOSwgMHgzMzNCLAotICAgIDB4MzMwMCwgMHgzMzMxLCAweDMzNDcsIDB4MzMxRSwgMHgzMzJBLCAweDMzQ0QsIDB4MzM3RiwgMHgyMTIxLAotICAgIDB4MjYwRSwgMHgzMDM2LCAweDMwMjAsIDB4MDBBOSwgMHgwMEFFLCAweDAwMDAsIDB4MjQ4OCwgMHgyNDg5LAotICAgIDB4MjQ4QSwgMHgyNDhCLCAweDI0OEMsIDB4MjQ4RCwgMHgyNDhFLCAweDI0OEYsIDB4MjQ5MCwgMHgyNDc0LAotICAgIDB4MjQ3NSwgMHgyNDc2LCAweDI0NzcsIDB4MjQ3OCwgMHgyNDc5LCAweDI0N0EsIDB4MjQ3QiwgMHgyNDdDLAotICAgIDB4MjQ3RCwgMHgyNDdFLCAweDI0N0YsIDB4MjQ4MCwgMHgyNDgxLCAweDI0ODIsIDB4MjQ4MywgMHgyNDg0LAotICAgIDB4MjQ4NSwgMHgyNDg2LCAweDI0ODcsIDB4MzI1MSwgMHgyMTcwLCAweDIxNzEsIDB4MjE3MiwgMHgyMTczLAotICAgIDB4MjE3NCwgMHgyMTc1LCAweDIxNzYsIDB4MjE3NywgMHgyMTc4LCAweDIxNzksIDB4MzI1MiwgMHgzMjUzLAotICAgIDB4MzI1NCwgMHgzMjU1LCAweDMyNTYsIDB4MzI1NywgMHgzMjU4LCAweDMyNTksIDB4MzI1QSwgMHgzMjVCLAotICAgIDB4MjQ5QywgMHgyNDlELCAweDI0OUUsIDB4MjQ5RiwgMHgyNEEwLCAweDI0QTEsIDB4MjRBMiwgMHgyNEEzLAotICAgIDB4MjRBNCwgMHgyNEE1LCAweDI0QTYsIDB4MjRBNywgMHgyNEE4LCAweDI0QTksIDB4MjRBQSwgMHgyNEFCLAotICAgIDB4MjRBQywgMHgyNEFELCAweDI0QUUsIDB4MjRBRiwgMHgyNEIwLCAweDI0QjEsIDB4MjRCMiwgMHgyNEIzLAotICAgIDB4MjRCNCwgMHgyNEI1LCAweDMyNDMsIDB4MzIzRCwgMHgzMjNGLCAweDMyMzQsIDB4MzIzOCwgMHgzMjMzLAotICAgIDB4MzIzQywgMHgzMjQyLCAweDMyM0UsIDB4MzIzNiwgMHgzMjM1LCAweDMyM0IsIDB4MzI0MCwgMHgzMjNBLAotICAgIDB4MzJCMCwgMHgzMkFELCAweDMyQTksIDB4MzJBRiwgMHgzMjk0LCAweDMyQUEsIDB4MzI5OCwgMHgzMkFCLAotICAgIDB4MzI5MiwgMHgzMjkxLCAweDMyOTMsIDB4MzJBQywgMHgzMkFFLCAweDMyOTYsIDB4MjNBOSwgMHgyM0E4LAotICAgIDB4MjNBNywgMHhGRTM4LCAweDIzQUQsIDB4MjNBQywgMHgyM0FCLCAweEZFMzgsIDB4MjNBQiwgMHgyM0FDLAotICAgIDB4MjNBRCwgMHhGRTM4LCAweDIzQTcsIDB4MjNBOCwgMHgyM0E5LCAweEZFMzgsIDB4MzNDQywgMHgzMzA1LAotICAgIDB4MDBCRCwgMHgwMEJDLCAweDMzOUYsIDB4MzNBMywgMHgzM0E2LCAweEZGRkQsIDB4RkZGRCwgMHgzMjlFLAotICAgIDB4MzM4OCwgMHgzMzg5LCAweDMzQzgsIDB4MjIyRCwgMHg1MzcwLCAweDMyMzAsIDB4MzIyQSwgMHgzMjJCLAotICAgIDB4MzIyQywgMHgzMjJELCAweDMyMkUsIDB4MzIyRiwgMHgzMjM3LCAweDMyNDEsIDB4MjdBMSwgMHgyMUU2LAotICAgIDB4MjFFNywgMHgyMUU5LCAweDI1QzksIDB4MjY2MCwgMHgyNjY1LCAweDI2NjMsIDB4MjY2NiwgMHgyNjAwLAotICAgIDB4MjYwMSwgMHgyNjAyLCAweDI2MDMsIDB4MjYxRSwgMHgyNjFDLCAweDI2MUQsIDB4MjYxRiwgMHgzMjk5LAotICAgIDB4MjRFQSwgMHgyMTZBLCAweDIxNkIsIDB4RkYxMCwgMHhGRjEwLCAweDMwMDAsIDB4MjU4MSwgMHgyNTgyLAotICAgIDB4MjU4MywgMHgyNTg0LCAweDI1ODUsIDB4MjU4NiwgMHgyNTg3LCAweDI1ODgsIDB4MjU4RiwgMHgyNThFLAotICAgIDB4MjU4RCwgMHgyNThDLCAweDI1OEIsIDB4MjU4QSwgMHgyNTg5LCAweDI1OTQsIDB4MjU5NSwgMHgyNTZELAotICAgIDB4MjU2RSwgMHgyNTcwLCAweDI1NkYsIDB4MjU1MCwgMHgyNTVFLCAweDI1NkEsIDB4MjU2MSwgMHgyNUUyLAotICAgIDB4MjVFMywgMHgyNUU1LCAweDI1RTQsIDB4MjVDRiwgMHgwRUQwLCAweDI1NzEsIDB4MjU3MiwgMHgyNTczLAotICAgIDB4MzA0QiwgMHgzMDUxLCAweDkwMjIsIDB4OEZCQiwgMHhGRjBDLCAweDAwQjAsIDB4MzAxMywgMHgzMDlDLAotICAgIDB4MzA5QiwgMHgwMkNGLCAweEZGMEUsIDB4MjAxOCwgMHgyMDE5LCAweDIwMUMsIDB4MjAxRCwgMHgyMDFDLAotICAgIDB4MjAxRSwgMHgyMDE4LCAweDIwMUEsIDB4MDJCQSwgMHg1MURDLCAweDcxOTksIDB4Mjc3NiwgMHgyNzc3LAotICAgIDB4Mjc3OCwgMHgyNzc5LCAweDI3N0EsIDB4Mjc3QiwgMHgyNzdDLCAweDI3N0QsIDB4Mjc3RSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDIxN0EsIDB4MjE3QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTdGLAotICAgIDB4MjEwQSwgMHgyMTA5LCAweDAwMDAsIDB4MDAwMCwgMHgzMDA0LCAweDIxQzYsIDB4MjFDNCwgMHgyMUM1LAotICAgIDB4MDAwMCwgMHgzMEY3LCAweDMwRjgsIDB4MzBGOSwgMHgzMEZBLCAweDU5MjcsIDB4NUMwRiwgMHgzMjlELAotICAgIDB4NjNBNywgMHgwMDAwLCAweDAwMDAsIDB4MzM3QiwgMHgzMzdGLCAweDAwMDAsIDB4MDAwMCwgMHgzMzMzLAotICAgIDB4MzM0RSwgMHgzMzIyLCAweDMzMTYsIDB4MzMwNSwgMHgzMzA1LCAweDMzMDUsIDB4MzMzMywgMHgzMzRFLAotICAgIDB4MzM0RSwgMHgzMzRFLCAweDMzMDMsIDB4MzMxOCwgMHgzMzE1LCAweDMzMzksIDB4MzMzOSwgMHgzMzM5LAotICAgIDB4MzM1NywgMHgzMzQyLCAweDMzNDIsIDB4MzM0MiwgMHgzMzIzLCAweDMzM0IsIDB4MzMwMCwgMHgzMzFFLAotICAgIDB4MzMxRSwgMHgzMzFFLCAweDMzMkEsIDB4MzMyQSwgMHgzMzJBLCAweDMzNDcsIDB4MzMzMSwgMHg3RThBLAotICAgIDB4ODkxQywgMHg5MzQ4LCAweDkyODgsIDB4ODREQywgMHg0RkM5LCAweDcwQkIsIDB4NjYzMSwgMHg2OEM4LAotICAgIDB4OTJGOSwgMHg2NkZCLCAweDVGNDUsIDB4NEUyOCwgMHg0RUUxLCAweDRFRkMsIDB4NEYwMCwgMHg0RjAzLAotICAgIDB4NEYzOSwgMHg0RjU2LCAweDRGOTIsIDB4NEY4QSwgMHg0RjlBLCAweDRGOTQsIDB4NEZDRCwgMHg1MDQwLAotICAgIDB4NTAyMiwgMHg0RkZGLCAweDUwMUUsIDB4NTA0NiwgMHg1MDcwLCAweDUwNDIsIDB4NTA5NCwgMHg1MEY0LAotICAgIDB4NTBEOCwgMHg1MTRBLCAweDUxNjQsIDB4NTE5RCwgMHg1MUJFLCAweDUxRUMsIDB4NTIxNSwgMHg1MjlDLAotICAgIDB4NTJBNiwgMHg1MkMwLCAweDUyREIsIDB4NTMwMCwgMHg1MzA3LCAweDUzMjQsIDB4NTM3MiwgMHg1MzkzLAotICAgIDB4NTNCMiwgMHg1M0RELCAweEZBMEUsIDB4NTQ5QywgMHg1NDhBLCAweDU0QTksIDB4NTRGRiwgMHg1NTg2LAotICAgIDB4NTc1OSwgMHg1NzY1LCAweDU3QUMsIDB4NTdDOCwgMHg1N0M3LCAweEZBMEYsIDB4RkExMCwgMHg1ODlFLAotICAgIDB4NThCMiwgMHg1OTBCLCAweDU5NTMsIDB4NTk1QiwgMHg1OTVELCAweDU5NjMsIDB4NTlBNCwgMHg1OUJBLAotICAgIDB4NUI1NiwgMHg1QkMwLCAweDc1MkYsIDB4NUJEOCwgMHg1QkVDLCAweDVDMUUsIDB4NUNBNiwgMHg1Q0JBLAotICAgIDB4NUNGNSwgMHg1RDI3LCAweDVENTMsIDB4RkExMSwgMHg1RDQyLCAweDVENkQsIDB4NURCOCwgMHg1REI5LAotICAgIDB4NUREMCwgMHg1RjIxLCAweDVGMzQsIDB4NUY2NywgMHg1RkI3LCAweDVGREUsIDB4NjA1RCwgMHg2MDg1LAotICAgIDB4NjA4QSwgMHg2MERFLCAweDYwRDUsIDB4NjEyMCwgMHg2MEYyLCAweDYxMTEsIDB4NjEzNywgMHg2MTMwLAotICAgIDB4NjE5OCwgMHg2MjEzLCAweDYyQTYsIDB4NjNGNSwgMHg2NDYwLCAweDY0OUQsIDB4NjRDRSwgMHg2NTRFLAotICAgIDB4NjYwMCwgMHg2NjE1LCAweDY2MDksIDB4NjYyRSwgMHg2NjFFLCAweDY2MjQsIDB4NjY2NSwgMHg2NjU3LAotICAgIDB4NjY1OSwgMHhGQTEyLCAweDY2NzMsIDB4NjY5OSwgMHg2NkEwLCAweDY2QjIsIDB4NjZCRiwgMHg2NkZBLAotICAgIDB4NjcwRSwgMHhGOTI5LCAweDY3NjYsIDB4NjdCQiwgMHg2ODUyLCAweDY3QzAsIDB4NjgwMSwgMHg2ODQ0LAotICAgIDB4NjhDRiwgMHhGQTEzLCAweDY5NjgsIDB4RkExNCwgMHg2OTk4LCAweDY5RTIsIDB4NkEzMCwgMHg2QTZCLAotICAgIDB4NkE0NiwgMHg2QTczLCAweDZBN0UsIDB4NkFFMiwgMHg2QUU0LCAweDZCRDYsIDB4NkMzRiwgMHg2QzVDLAotICAgIDB4NkM4NiwgMHg2QzZGLCAweDZDREEsIDB4NkQwNCwgMHg2RDg3LCAweDZENkYsIDB4NkQ5NiwgMHg2REFDLAotICAgIDB4NkRDRiwgMHg2REY4LCAweDZERjIsIDB4NkRGQywgMHg2RTM5LCAweDZFNUMsIDB4NkUyNywgMHg2RTNDLAotICAgIDB4NkVCRiwgMHg2Rjg4LCAweDZGQjUsIDB4NkZGNSwgMHg3MDA1LCAweDcwMDcsIDB4NzAyOCwgMHg3MDg1LAotICAgIDB4NzBBQiwgMHg3MTBGLCAweDcxMDQsIDB4NzE1QywgMHg3MTQ2LCAweDcxNDcsIDB4RkExNSwgMHg3MUMxLAotICAgIDB4NzFGRSwgMHg3MkIxLCAweDcyQkUsIDB4NzMyNCwgMHhGQTE2LCAweDczNzcsIDB4NzNCRCwgMHg3M0M5LAotICAgIDB4NzNENiwgMHg3M0UzLCAweDczRDIsIDB4NzQwNywgMHg3M0Y1LCAweDc0MjYsIDB4NzQyQSwgMHg3NDI5LAotICAgIDB4NzQyRSwgMHg3NDYyLCAweDc0ODksIDB4NzQ5RiwgMHg3NTAxLCAweDc1NkYsIDB4NzY4MiwgMHg3NjlDLAotICAgIDB4NzY5RSwgMHg3NjlCLCAweDc2QTYsIDB4RkExNywgMHg3NzQ2LCAweDUyQUYsIDB4NzgyMSwgMHg3ODRFLAotICAgIDB4Nzg2NCwgMHg3ODdBLCAweDc5MzAsIDB4RkExOCwgMHhGQTE5LCAweEZBMUEsIDB4Nzk5NCwgMHhGQTFCLAotICAgIDB4Nzk5QiwgMHg3QUQxLCAweDdBRTcsIDB4RkExQywgMHg3QUVCLCAweDdCOUUsIDB4RkExRCwgMHg3RDQ4LAotICAgIDB4N0Q1QywgMHg3REI3LCAweDdEQTAsIDB4N0RENiwgMHg3RTUyLCAweDdGNDcsIDB4N0ZBMSwgMHhGQTFFLAotICAgIDB4ODMwMSwgMHg4MzYyLCAweDgzN0YsIDB4ODNDNywgMHg4M0Y2LCAweDg0NDgsIDB4ODRCNCwgMHg4NTUzLAotICAgIDB4ODU1OSwgMHg4NTZCLCAweEZBMUYsIDB4ODVCMCwgMHhGQTIwLCAweEZBMjEsIDB4ODgwNywgMHg4OEY1LAotICAgIDB4OEExMiwgMHg4QTM3LCAweDhBNzksIDB4OEFBNywgMHg4QUJFLCAweDhBREYsIDB4RkEyMiwgMHg4QUY2LAotICAgIDB4OEI1MywgMHg4QjdGLCAweDhDRjAsIDB4OENGNCwgMHg4RDEyLCAweDhENzYsIDB4RkEyMywgMHg4RUNGLAotICAgIDB4RkEyNCwgMHhGQTI1LCAweDkwNjcsIDB4OTBERSwgMHhGQTI2LCAweDkxMTUsIDB4OTEyNywgMHg5MURBLAotICAgIDB4OTFENywgMHg5MURFLCAweDkxRUQsIDB4OTFFRSwgMHg5MUU0LCAweDkxRTUsIDB4OTIwNiwgMHg5MjEwLAotICAgIDB4OTIwQSwgMHg5MjNBLCAweDkyNDAsIDB4OTIzQywgMHg5MjRFLCAweDkyNTksIDB4OTI1MSwgMHg5MjM5LAotICAgIDB4OTI2NywgMHg5MkE3LCAweDkyNzcsIDB4OTI3OCwgMHg5MkU3LCAweDkyRDcsIDB4OTJEOSwgMHg5MkQwLAotICAgIDB4RkEyNywgMHg5MkQ1LCAweDkyRTAsIDB4OTJEMywgMHg5MzI1LCAweDkzMjEsIDB4OTJGQiwgMHhGQTI4LAotICAgIDB4OTMxRSwgMHg5MkZGLCAweDkzMUQsIDB4OTMwMiwgMHg5MzcwLCAweDkzNTcsIDB4OTNBNCwgMHg5M0M2LAotICAgIDB4OTNERSwgMHg5M0Y4LCAweDk0MzEsIDB4OTQ0NSwgMHg5NDQ4LCAweDk1OTIsIDB4RjlEQywgMHhGQTI5LAotICAgIDB4OTY5RCwgMHg5NkFGLCAweDk3MzMsIDB4OTczQiwgMHg5NzQzLCAweDk3NEQsIDB4OTc0RiwgMHg5NzUxLAotICAgIDB4OTc1NSwgMHg5ODU3LCAweDk4NjUsIDB4RkEyQSwgMHhGQTJCLCAweDk5MjcsIDB4RkEyQywgMHg5OTlFLAotICAgIDB4OUE0RSwgMHg5QUQ5LCAweDlBREMsIDB4OUI3NSwgMHg5QjcyLCAweDlCOEYsIDB4OUJCMSwgMHg5QkJCLAotICAgIDB4OUMwMCwgMHg5RDcwLCAweDlENkIsIDB4RkEyRCwgMHg5RTE5LCAweDlFRDEsIDB4MDBBQywgMHgwMDVDLAotICAgIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAotICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLAotICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAotICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLAotICAgIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAotICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLAotICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAotICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMEE1LCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLAotICAgIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAotICAgIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAotICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAotICAgIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMEE2LCAweDAwN0QsIDB4MDMwMywgMHgwMkJDLAotICAgIDB4MDA1QywgMHgwMkJCLCAweDAwN0MsIDB4MDA3RSwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgyMDQ0LAotICAgIDB4MDE5MiwgMHgwMEE3LCAweDAwQTQsIDB4MjAxQywgMHgwMEFCLCAweDIwMzksIDB4MjAzQSwgMHhGQjAxLAotICAgIDB4RkIwMiwgMHgyMDEyLCAweDIwMjAsIDB4MjAyMSwgMHgwMEI3LCAweDAwQjYsIDB4MjAyMiwgMHgyMDFBLAotICAgIDB4MjAxRSwgMHgyMDFELCAweDAwQkIsIDB4MjAyNiwgMHgyMDMwLCAweDAwQkYsIDB4MDMwMSwgMHgwMzAyLAotICAgIDB4MDBBRiwgMHgwMzA2LCAweDAzMDcsIDB4MDMwOCwgMHgwMzBBLCAweDAwQjgsIDB4MDMwQiwgMHgwMzI4LAotICAgIDB4MDMwQywgMHgwMzM2LCAweDAwQzYsIDB4MDBBQSwgMHgwMTQxLCAweDAwRDgsIDB4MDE1MiwgMHgwMEJBLAotICAgIDB4MDBFNiwgMHgwMTMxLCAweDAxNDIsIDB4MDBGOCwgMHgwMTUzLCAweDAwREYsIDB4MDAyRCwgMHgwMEE5LAotICAgIDB4MDBBQywgMHgwMEFFLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNSwgMHgwMEI5LAotICAgIDB4MDBCQywgMHgwMEJELCAweDAwQkUsIDB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LAotICAgIDB4MDBDNSwgMHgwMEM3LCAweDAwQzgsIDB4MDBDOSwgMHgwMENBLCAweDAwQ0IsIDB4MDBDQywgMHgwMENELAotICAgIDB4MDBDRSwgMHgwMENGLCAweDAwRDAsIDB4MDBEMSwgMHgwMEQyLCAweDAwRDMsIDB4MDBENCwgMHgwMEQ1LAotICAgIDB4MDBENiwgMHgwMEQ3LCAweDAwRDksIDB4MDBEQSwgMHgwMERCLCAweDAwREMsIDB4MDBERCwgMHgwMERFLAotICAgIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LCAweDAwRTUsIDB4MDBFNywgMHgwMEU4LAotICAgIDB4MDBFOSwgMHgwMEVBLCAweDAwRUIsIDB4MDBFQywgMHgwMEVELCAweDAwRUUsIDB4MDBFRiwgMHgwMEYwLAotICAgIDB4MDBGMSwgMHgwMEYyLCAweDAwRjMsIDB4MDBGNCwgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywgMHgwMEY5LAotICAgIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsIDB4MDE2MCwgMHgwMTc4LAotICAgIDB4MDE3RCwgMHgwMzA1LCAweDAxNjEsIDB4MjEyMiwgMHgwMTdFLCAweDAwMzAsIDB4MjAwMiwgMHgwMDIxLAotICAgIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LAotICAgIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LAotICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLAotICAgIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LAotICAgIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLAotICAgIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAotICAgIDB4MDA1QSwgMHgwMDVCLCAweDAwQTUsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLAotICAgIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LAotICAgIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLAotICAgIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LAotICAgIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgyMDNFLCAweEZGNDAsIDB4MjAzMiwgMHgwMEE4LAotICAgIDB4MjAzNiwgMHgwMEM0LCAweDAwRjksIDB4MDBFOSwgMHgwMEVELCAweDAwREYsIDB4MDBFNywgMHgwMEM3LAotICAgIDB4MDBEMSwgMHgwMEYxLCAweDAwQTIsIDB4MDBBMywgMHgwMEYzLCAweDAwRkEsIDB4MDBBMSwgMHgwMEJGLAotICAgIDB4MDBCRCwgMHgwMEQ2LCAweDAwREMsIDB4MDBFNCwgMHgwMEVCLCAweDAwRUYsIDB4MDBGNiwgMHgwMERDLAotICAgIDB4MDBFMiwgMHgwMEVBLCAweDAwRUUsIDB4MDBGNCwgMHgwMEZDLCAweDAwRTAsIDB4MDBFOSwgMHgwMEUxLAotICAgIDB4MDA3RSwgMHgwMDMwLCAweDAwQUMsIDB4MDA1QywgMHhGRjYwLCAweEZGNjEsIDB4RkY2MiwgMHhGRjYzLAotICAgIDB4RkY2NCwgMHhGRjY1LCAweEZGNjYsIDB4RkY2NywgMHhGRjY4LCAweEZGNjksIDB4RkY2QSwgMHhGRjZCLAotICAgIDB4RkY2QywgMHhGRjZELCAweEZGNkUsIDB4RkY2RiwgMHhGRjcwLCAweEZGNzEsIDB4RkY3MiwgMHhGRjczLAotICAgIDB4RkY3NCwgMHhGRjc1LCAweEZGNzYsIDB4RkY3NywgMHhGRjc4LCAweEZGNzksIDB4RkY3QSwgMHhGRjdCLAotICAgIDB4RkY3QywgMHhGRjdELCAweEZGN0UsIDB4RkY3RiwgMHhGRjgwLCAweEZGODEsIDB4RkY4MiwgMHhGRjgzLAotICAgIDB4RkY4NCwgMHhGRjg1LCAweEZGODYsIDB4RkY4NywgMHhGRjg4LCAweEZGODksIDB4RkY4QSwgMHhGRjhCLAotICAgIDB4RkY4QywgMHhGRjhELCAweEZGOEUsIDB4RkY4RiwgMHhGRjkwLCAweEZGOTEsIDB4RkY5MiwgMHhGRjkzLAotICAgIDB4RkY5NCwgMHhGRjk1LCAweEZGOTYsIDB4RkY5NywgMHhGRjk4LCAweEZGOTksIDB4RkY5QSwgMHhGRjlCLAotICAgIDB4RkY5QywgMHhGRjlELCAweEZGOUUsIDB4RkY5RiwgMHgzMEYwLCAweDMwRjEsIDB4MzBFRSwgMHgzMEFCLAotICAgIDB4MzBCMSwgMHgzMEY0LCAweDMwQUMsIDB4MzBBRSwgMHgzMEIwLCAweDMwQjIsIDB4MzBCNCwgMHgzMEI2LAotICAgIDB4MzBCOCwgMHgzMEJBLCAweDMwQkMsIDB4MzBCRSwgMHgzMEMwLCAweDMwQzIsIDB4MzBDNSwgMHgzMEM3LAotICAgIDB4MzBDOSwgMHgzMEQwLCAweDMwRDEsIDB4MzBEMywgMHgzMEQ0LCAweDMwRDYsIDB4MzBENywgMHgzMEQ5LAotICAgIDB4MzBEQSwgMHgzMERDLCAweDMwREQsIDB4RkY2MCwgMHgzMDkyLCAweDMwNDEsIDB4MzA0MywgMHgzMDQ1LAotICAgIDB4MzA0NywgMHgzMDQ5LCAweDMwODMsIDB4MzA4NSwgMHgzMDg3LCAweDMwNjMsIDB4MzA0MiwgMHgzMDQ0LAotICAgIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsIDB4MzA1MSwgMHgzMDUzLAotICAgIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwgMHgzMDY0LAotICAgIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAotICAgIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLAotICAgIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAotICAgIDB4MzA4RCwgMHgzMDhGLCAweDMwOTMsIDB4MzA5MCwgMHgzMDkxLCAweDMwOEUsIDB4MzA0QywgMHgzMDRFLAotICAgIDB4MzA1MCwgMHgzMDUyLCAweDMwNTQsIDB4MzA1NiwgMHgzMDY4LCAweDMwNUEsIDB4MzA1QywgMHgzMDVFLAotICAgIDB4MzA2MCwgMHgzMDYyLCAweDMwNjUsIDB4MzA2NywgMHgzMDY5LCAweDMwNzAsIDB4MzA3MSwgMHgzMDczLAotICAgIDB4MzA3NCwgMHgzMDc2LCAweDMwNzcsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0MsIDB4MzA3RCwgMHgzMDFELAotICAgIDB4MzAxRSwgMHgwMDVCLCAweDAwNUQsIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwgMHgzMDBFLAotICAgIDB4MzAwRiwgMHgzMDEwLCAweDMwMTEsIDB4MjAxMiwgMHhGRjYwLCAweDI1MDAsIDB4MjUwMSwgMHgyNTAyLAotICAgIDB4MjUwMywgMHgyNTA0LCAweDI1MDUsIDB4MjUwNiwgMHgyNTA3LCAweDI1MDgsIDB4MjUwOSwgMHgyNTBBLAotICAgIDB4MjUwQiwgMHgyNTBDLCAweDI1MEQsIDB4MjUwRSwgMHgyNTBGLCAweDI1MTAsIDB4MjUxMSwgMHgyNTEyLAotICAgIDB4MjUxMywgMHgyNTE0LCAweDI1MTUsIDB4MjUxNiwgMHgyNTE3LCAweDI1MTgsIDB4MjUxOSwgMHgyNTFBLAotICAgIDB4MjUxQiwgMHgyNTFDLCAweDI1MUQsIDB4MjUxRSwgMHgyNTFGLCAweDI1MjAsIDB4MjUyMSwgMHgyNTIyLAotICAgIDB4MjUyMywgMHgyNTI0LCAweDI1MjUsIDB4MjUyNiwgMHgyNTI3LCAweDI1MjgsIDB4MjUyOSwgMHgyNTJBLAotICAgIDB4MjUyQiwgMHgyNTJDLCAweDI1MkQsIDB4MjUyRSwgMHgyNTJGLCAweDI1MzAsIDB4MjUzMSwgMHgyNTMyLAotICAgIDB4MjUzMywgMHgyNTM0LCAweDI1MzUsIDB4MjUzNiwgMHgyNTM3LCAweDI1MzgsIDB4MjUzOSwgMHgyNTNBLAotICAgIDB4MjUzQiwgMHgyNTNDLCAweDI1M0QsIDB4MjUzRSwgMHgyNTNGLCAweDI1NDAsIDB4MjU0MSwgMHgyNTQyLAotICAgIDB4MjU0MywgMHgyNTQ0LCAweDI1NDUsIDB4MjU0NiwgMHgyNTQ3LCAweDI1NDgsIDB4MjU0OSwgMHgyNTRBLAotICAgIDB4MjU0QiwgMHgyNUIyLCAweDIwQUMsIDB4MjEyNiwgMHgyMDMyLCAweDIwMzMsIDB4RkIwMCwgMHhGQjAzLAotICAgIDB4RkIwNCwgMHgwMTAxLCAweDAxMkIsIDB4MDE2QiwgMHgwMTEzLCAweDAxNEQsIDB4MDEwMCwgMHgwMTJBLAotICAgIDB4MDE2QSwgMHgwMTEyLCAweDAxNEMsIDB4MjE1QiwgMHgyMTVDLCAweDIxNUQsIDB4MjE1RSwgMHgyMTUzLAotICAgIDB4MjE1NCwgMHgyMDcwLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsIDB4MjA3OCwgMHgyMDc5LAotICAgIDB4MjA4MCwgMHgyMDgxLCAweDIwODIsIDB4MjA4MywgMHgyMDg0LCAweDIwODUsIDB4MjA4NiwgMHgyMDg3LAotICAgIDB4MjA4OCwgMHgyMDg5LCAweDAxQ0QsIDB4MDExQSwgMHgwMDAwLCAweDFFQkMsIDB4MDFDRiwgMHgwMDAwLAotICAgIDB4MDEyOCwgMHgwMUQxLCAweDAwMDAsIDB4MDFEMywgMHgwMTZFLCAweDAxNjgsIDB4MDFDRSwgMHgwMTFCLAotICAgIDB4MDAwMCwgMHgxRUJELCAweDAxRDAsIDB4MDAwMCwgMHgwMTI5LCAweDAxRDIsIDB4MDAwMCwgMHgwMUQ0LAotICAgIDB4MDE2RiwgMHgwMTY5LCAweDAyNTEsIDB4MDI1MSwgMHgwMjUxLCAweDAxRkQsIDB4MDBFNiwgMHgwMjU0LAotICAgIDB4MDI1NCwgMHgwMjU0LCAweDAyNTksIDB4MDI1OSwgMHgwMjU5LCAweDAyNUEsIDB4MDI1QSwgMHgwMjVBLAotICAgIDB4MDI1QiwgMHgwMjVCLCAweDAyNUIsIDB4MDA2QSwgMHgwMTRCLCAweDAyNzUsIDB4MDI4QywgMHgwMjhDLAotICAgIDB4MDI4QywgMHgwMjkyLCAweDAyODMsIDB4MDJEMCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAotICAgIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLAotICAgIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAotICAgIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLAotICAgIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAotICAgIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLAotICAgIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAotICAgIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLAotICAgIDB4MDBBNSwgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAotICAgIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLAotICAgIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAotICAgIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLAotICAgIDB4MDBBNiwgMHgwMDdELCAweDAzMDMsIDB4MDJCQywgMHgwMDVDLCAweDAyQkIsIDB4MDA3QywgMHgwMDdFLAotICAgIDB4MDBBMSwgMHgwMEEyLCAweDAwQTMsIDB4MjA0NCwgMHgwMTkyLCAweDAwQTcsIDB4MDBBNCwgMHgyMDFDLAotICAgIDB4MDBBQiwgMHgyMDM5LCAweDIwM0EsIDB4RkIwMSwgMHhGQjAyLCAweDIwMTIsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDBCNywgMHgwMEI2LCAweDIwMjIsIDB4MjAxQSwgMHgyMDFFLCAweDIwMUQsIDB4MDBCQiwgMHgyMDI2LAotICAgIDB4MjAzMCwgMHgwMEJGLCAweDAzMDEsIDB4MDMwMiwgMHgwMEFGLCAweDAzMDYsIDB4MDMwNywgMHgwMzA4LAotICAgIDB4MDMwQSwgMHgwMEI4LCAweDAzMEIsIDB4MDMyOCwgMHgwMzBDLCAweDAzMzYsIDB4MDBDNiwgMHgwMEFBLAotICAgIDB4MDE0MSwgMHgwMEQ4LCAweDAxNTIsIDB4MDBCQSwgMHgwMEU2LCAweDAxMzEsIDB4MDE0MiwgMHgwMEY4LAotICAgIDB4MDE1MywgMHgwMERGLCAweDAwMkQsIDB4MDBBOSwgMHgwMEFDLCAweDAwQUUsIDB4MDBCMCwgMHgwMEIxLAotICAgIDB4MDBCMiwgMHgwMEIzLCAweDAwQjUsIDB4MDBCOSwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEMwLAotICAgIDB4MDBDMSwgMHgwMEMyLCAweDAwQzMsIDB4MDBDNCwgMHgwMEM1LCAweDAwQzcsIDB4MDBDOCwgMHgwMEM5LAotICAgIDB4MDBDQSwgMHgwMENCLCAweDAwQ0MsIDB4MDBDRCwgMHgwMENFLCAweDAwQ0YsIDB4MDBEMCwgMHgwMEQxLAotICAgIDB4MDBEMiwgMHgwMEQzLCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsIDB4MDBEOSwgMHgwMERBLAotICAgIDB4MDBEQiwgMHgwMERDLCAweDAwREQsIDB4MDBERSwgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLAotICAgIDB4MDBFNCwgMHgwMEU1LCAweDAwRTcsIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLAotICAgIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsIDB4MDBGMCwgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LAotICAgIDB4MDBGNSwgMHgwMEY2LCAweDAwRjcsIDB4MDBGOSwgMHgwMEZBLCAweDAwRkIsIDB4MDBGQywgMHgwMEZELAotICAgIDB4MDBGRSwgMHgwMEZGLCAweDAxNjAsIDB4MDE3OCwgMHgwMTdELCAweDAzMDUsIDB4MDE2MSwgMHgyMTIyLAotICAgIDB4MDE3RSwgMHgwMDMwLCAweDIwQUMsIDB4MjEyNiwgMHgyMDMyLCAweDIwMzMsIDB4RkIwMCwgMHhGQjAzLAotICAgIDB4RkIwNCwgMHgwMTAxLCAweDAxMkIsIDB4MDE2QiwgMHgwMTEzLCAweDAxNEQsIDB4MDEwMCwgMHgwMTJBLAotICAgIDB4MDE2QSwgMHgwMTEyLCAweDAxNEMsIDB4MjE1QiwgMHgyMTVDLCAweDIxNUQsIDB4MjE1RSwgMHgyMTUzLAotICAgIDB4MjE1NCwgMHgyMDcwLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsIDB4MjA3OCwgMHgyMDc5LAotICAgIDB4MjA4MCwgMHgyMDgxLCAweDIwODIsIDB4MjA4MywgMHgyMDg0LCAweDIwODUsIDB4MjA4NiwgMHgyMDg3LAotICAgIDB4MjA4OCwgMHgyMDg5LCAweDAxQ0QsIDB4MDExQSwgMHgwMDAwLCAweDFFQkMsIDB4MDFDRiwgMHgwMDAwLAotICAgIDB4MDEyOCwgMHgwMUQxLCAweDAwMDAsIDB4MDFEMywgMHgwMTZFLCAweDAxNjgsIDB4MDFDRSwgMHgwMTFCLAotICAgIDB4MDAwMCwgMHgxRUJELCAweDAxRDAsIDB4MDAwMCwgMHgwMTI5LCAweDAxRDIsIDB4MDAwMCwgMHgwMUQ0LAotICAgIDB4MDE2RiwgMHgwMTY5LCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LAotICAgIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMzM2LCAweDAwMkQsIDB4MDAzRCwgMHgwMDJDLAotICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkUsIDB4MDAyRiwgMHgwMDNBLCAweDAwM0IsIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LAotICAgIDB4MDMzNiwgMHgwMDJELCAweDAwM0QsIDB4MDAyQywgMHgwMDI4LCAweDAwMjksIDB4MDAyRSwgMHgwMDJGLAotICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwQjcsIDB4MjBBQywgMHgwMDAwLCAweDIxNTMsIDB4MjE1NCwgMHgwMEJFLAotICAgIDB4MjE1NSwgMHgyMTU2LCAweDIxNTcsIDB4MjE1OCwgMHgyMTU5LCAweDIxNUEsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTVCLCAweDIxNUMsIDB4MjE1RCwgMHgyMTVFLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAotICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwMzAsIDB4MjE2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjE3MCwgMHgyMTcxLAotICAgIDB4MjE3MiwgMHgyMTczLCAweDIxNzQsIDB4MjE3NSwgMHgyMTc2LCAweDIxNzcsIDB4MjE3OCwgMHgyMTc5LAotICAgIDB4MjE3QSwgMHgyMTdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxNjAsIDB4MjE2MSwgMHgyMTYyLAotICAgIDB4MjE2MywgMHgyMTY0LCAweDIxNjUsIDB4MjE2NiwgMHgyMTY3LCAweDIxNjgsIDB4MjE2OSwgMHgyMTZBLAotICAgIDB4MjE2QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LAotICAgIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLAotICAgIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LAotICAgIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MzA0MiwgMHgzMDQ0LAotICAgIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsIDB4MzA1MSwgMHgzMDUzLAotICAgIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwgMHgzMDY0LAotICAgIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAotICAgIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLAotICAgIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAotICAgIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMiwgMHgzMEE0LAotICAgIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLAotICAgIDB4MzBCNSwgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LAotICAgIDB4MzBDNiwgMHgzMEM4LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLAotICAgIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLAotICAgIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLAotICAgIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4MzIyMCwgMHgzMjIxLAotICAgIDB4MzIyMiwgMHgzMjIzLCAweDMyMjQsIDB4MzIyNSwgMHgzMjI2LCAweDMyMjcsIDB4MzIyOCwgMHgzMjI5LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDU1QjYsIDB4NTQwOCwgMHg2Q0VCLCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLAotICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAotICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LAotICAgIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgzMDYzLCAweDYyNEQsIDB4MzAwNywgMHg0RTAwLAotICAgIDB4NEU4QywgMHg0RTA5LCAweDU2REIsIDB4NEU5NCwgMHg1MTZELCAweDRFMDMsIDB4NTE2QiwgMHg0RTVELAotICAgIDB4NTM0MSwgMHgzMDA3LCAweDRFMDAsIDB4NEU4QywgMHg0RTA5LCAweDU2REIsIDB4NEU5NCwgMHg1MTZELAotICAgIDB4NEUwMywgMHg1MTZCLCAweDRFNUQsIDB4NTM0MSwgMHgzMDA3LCAweDRFMDAsIDB4NEU4QywgMHg0RTA5LAotICAgIDB4NTZEQiwgMHg0RTk0LCAweDUxNkQsIDB4NEUwMywgMHg1MTZCLCAweDRFNUQsIDB4MzA2NCwgMHg2MjRELAotICAgIDB4NEUwMCwgMHg0RThDLCAweDRFMDksIDB4NTZEQiwgMHg0RTk0LCAweDUxNkQsIDB4NEUwMywgMHg1MTZCLAotICAgIDB4NEU1RCwgMHg1MzQxLCAweDMwMDcsIDB4NEUwMCwgMHg0RThDLCAweDRFMDksIDB4NTZEQiwgMHg0RTk0LAotICAgIDB4NTE2RCwgMHg0RTAzLCAweDUxNkIsIDB4NEU1RCwgMHg1MzQxLCAweDMwQjMsIDB4MzA2MywgMHgzMEMzLAotICAgIDB4MzBBOSwgMHgwMDAwLCAweDAwMDAsIDB4MjQ2MCwgMHgyNDYxLCAweDI0NjIsIDB4MjQ2MywgMHgyNDY0LAotICAgIDB4MjQ2NSwgMHgyNDY2LCAweDI0NjcsIDB4MjQ2OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyNEQwLCAweDI0RDEsIDB4MjREMiwgMHgyNEQzLCAweDI0RDQsIDB4MjRENSwgMHgyNEQ2LAotICAgIDB4MjRENywgMHgyNEQ4LCAweDI0RDksIDB4MjREQSwgMHgyNERCLCAweDI0REMsIDB4MjRERCwgMHgyNERFLAotICAgIDB4MjRERiwgMHgyNEUwLCAweDI0RTEsIDB4MjRFMiwgMHgyNEUzLCAweDI0RTQsIDB4MjRFNSwgMHgyNEU2LAotICAgIDB4MjRFNywgMHgyNEU4LCAweDI0RTksIDB4MjRCNiwgMHgyNEI3LCAweDI0QjgsIDB4MjRCOSwgMHgyNEJBLAotICAgIDB4MjRCQiwgMHgyNEJDLCAweDI0QkQsIDB4MjRCRSwgMHgyNEJGLCAweDI0QzAsIDB4MjRDMSwgMHgyNEMyLAotICAgIDB4MjRDMywgMHgyNEM0LCAweDI0QzUsIDB4MjRDNiwgMHgyNEM3LCAweDI0QzgsIDB4MjRDOSwgMHgyNENBLAotICAgIDB4MjRDQiwgMHgyNENDLCAweDI0Q0QsIDB4MjRDRSwgMHgyNENGLCAweDMwNDIsIDB4MzA0NCwgMHgzMDQ2LAotICAgIDB4MzA0OCwgMHgzMDRBLCAweDMwNEIsIDB4MzA0RCwgMHgzMDRGLCAweDMwNTEsIDB4MzA1MywgMHgzMDU1LAotICAgIDB4MzA1NywgMHgzMDU5LCAweDMwNUIsIDB4MzA1RCwgMHgzMDVGLCAweDMwNjEsIDB4MzA2NCwgMHgzMDY2LAotICAgIDB4MzA2OCwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcyLAotICAgIDB4MzA3NSwgMHgzMDc4LCAweDMwN0IsIDB4MzA3RSwgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLAotICAgIDB4MzA4NCwgMHgzMDg2LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLCAweDMwOEIsIDB4MzA4QywgMHgzMDhELAotICAgIDB4MzA4RiwgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLCAweDMyRDAsIDB4MzJEMSwgMHgzMkQyLAotICAgIDB4MzJEMywgMHgzMkQ0LCAweDMyRDUsIDB4MzJENiwgMHgzMkQ3LCAweDMyRDgsIDB4MzJEOSwgMHgzMkRBLAotICAgIDB4MzJEQiwgMHgzMkRDLCAweDMyREQsIDB4MzJERSwgMHgzMkRGLCAweDMyRTAsIDB4MzJFMSwgMHgzMkUyLAotICAgIDB4MzJFMywgMHgzMkU0LCAweDMyRTUsIDB4MzJFNiwgMHgzMkU3LCAweDMyRTgsIDB4MzJFOSwgMHgzMkVBLAotICAgIDB4MzJFQiwgMHgzMkVDLCAweDMyRUQsIDB4MzJFRSwgMHgzMkVGLCAweDMyRjAsIDB4MzJGMSwgMHgzMkYyLAotICAgIDB4MzJGMywgMHgzMkY0LCAweDMyRjUsIDB4MzJGNiwgMHgzMkY3LCAweDMyRjgsIDB4MzJGOSwgMHgzMkZBLAotICAgIDB4MzJGQiwgMHgzMkZDLCAweDMyRkQsIDB4MzJGRSwgMHgzMEYzLCAweDMyODAsIDB4MzI4MSwgMHgzMjgyLAotICAgIDB4MzI4MywgMHgzMjg0LCAweDMyODUsIDB4MzI4NiwgMHgzMjg3LCAweDMyODgsIDB4MzI4OSwgMHgzMjkwLAotICAgIDB4MzI4QSwgMHgzMjhCLCAweDMyOEMsIDB4MzI4RCwgMHgzMjhFLCAweDMyOEYsIDB4OEFCRiwgMHgzMjlGLAotICAgIDB4NTI2RiwgMHg2RTFCLCAweDZBMTksIDB4NkIyMCwgMHg1N0ZBLCAweDc5ODEsIDB4MzJBMCwgMHgzMkExLAotICAgIDB4MzI5QiwgMHgzMjlBLCAweDMyQTMsIDB4MzJBMiwgMHgzMjk3LCAweDUxRkEsIDB4MzI5QywgMHgzMjk1LAotICAgIDB4NkUwOCwgMHg1ODk3LCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLCAweDk2RkIsIDB4MjVDQywgMHgwMDMwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAotICAgIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLAotICAgIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAotICAgIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDQxLAotICAgIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LAotICAgIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLAotICAgIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAotICAgIDB4MDA1QSwgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELAotICAgIDB4MzA0RiwgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELAotICAgIDB4MzA1RiwgMHgzMDYxLCAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLAotICAgIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLAotICAgIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LAotICAgIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLAotICAgIDB4MzA5MywgMHgzMEEyLCAweDMwQTQsIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELAotICAgIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwgMHgzMEJELAotICAgIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLAotICAgIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLAotICAgIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LAotICAgIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLAotICAgIDB4MzBGMywgMHg2NUU1LCAweDY3MDgsIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLAotICAgIDB4NTU0RiwgMHg3QjU0LCAweDRGOEIsIDB4MjVDRiwgMHgwMDMwLCAweDAwMDAsIDB4MDAzMSwgMHgwMDAwLAotICAgIDB4MDAzMiwgMHgwMDAwLCAweDAwMzMsIDB4MDAwMCwgMHgwMDM0LCAweDAwMDAsIDB4MDAzNSwgMHgwMDAwLAotICAgIDB4MDAzNiwgMHgwMDAwLCAweDAwMzcsIDB4MDAwMCwgMHgwMDM4LCAweDAwMDAsIDB4MDAzOSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LAotICAgIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELAotICAgIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LAotICAgIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAotICAgIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLAotICAgIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAotICAgIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgzMDQyLAotICAgIDB4MzA0NCwgMHgzMDQ2LCAweDMwNDgsIDB4MzA0QSwgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwgMHgzMDUxLAotICAgIDB4MzA1MywgMHgzMDU1LCAweDMwNTcsIDB4MzA1OSwgMHgzMDVCLCAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLAotICAgIDB4MzA2NCwgMHgzMDY2LCAweDMwNjgsIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLAotICAgIDB4MzA2RiwgMHgzMDcyLCAweDMwNzUsIDB4MzA3OCwgMHgzMDdCLCAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLAotICAgIDB4MzA4MSwgMHgzMDgyLCAweDMwODQsIDB4MzA4NiwgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLAotICAgIDB4MzA4QywgMHgzMDhELCAweDMwOEYsIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMEEyLAotICAgIDB4MzBBNCwgMHgzMEE2LCAweDMwQTgsIDB4MzBBQSwgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLAotICAgIDB4MzBCMywgMHgzMEI1LCAweDMwQjcsIDB4MzBCOSwgMHgzMEJCLCAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLAotICAgIDB4MzBDNCwgMHgzMEM2LCAweDMwQzgsIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLAotICAgIDB4MzBDRiwgMHgzMEQyLCAweDMwRDUsIDB4MzBEOCwgMHgzMERCLCAweDMwREUsIDB4MzBERiwgMHgzMEUwLAotICAgIDB4MzBFMSwgMHgzMEUyLCAweDMwRTQsIDB4MzBFNiwgMHgzMEU4LCAweDMwRTksIDB4MzBFQSwgMHgzMEVCLAotICAgIDB4MzBFQywgMHgzMEVELCAweDMwRUYsIDB4MzBGMCwgMHgzMEYxLCAweDMwRjIsIDB4MzBGMywgMHg2NUU1LAotICAgIDB4NjcwOCwgMHg3MDZCLCAweDZDMzQsIDB4NjcyOCwgMHg5MUQxLCAweDU3MUYsIDB4OENBMCwgMHg1MkRELAotICAgIDB4NTU0RiwgMHg3QjU0LCAweDRGOEIsIDB4MjVBMSwgMHgyNUExLCAweDAwMzAsIDB4MDAwMCwgMHgwMDMxLAotICAgIDB4MDAwMCwgMHgwMDMyLCAweDAwMDAsIDB4MDAzMywgMHgwMDAwLCAweDAwMzQsIDB4MDAwMCwgMHgwMDM1LAotICAgIDB4MDAwMCwgMHgwMDM2LCAweDAwMDAsIDB4MDAzNywgMHgwMDAwLCAweDAwMzgsIDB4MDAwMCwgMHgwMDM5LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LAotICAgIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLAotICAgIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LAotICAgIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA0MSwgMHgwMDQyLAotICAgIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLAotICAgIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLAotICAgIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLAotICAgIDB4MzA0MiwgMHgzMDQ0LCAweDMwNDYsIDB4MzA0OCwgMHgzMDRBLCAweDMwNEIsIDB4MzA0RCwgMHgzMDRGLAotICAgIDB4MzA1MSwgMHgzMDUzLCAweDMwNTUsIDB4MzA1NywgMHgzMDU5LCAweDMwNUIsIDB4MzA1RCwgMHgzMDVGLAotICAgIDB4MzA2MSwgMHgzMDY0LCAweDMwNjYsIDB4MzA2OCwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywgMHgzMDZELAotICAgIDB4MzA2RSwgMHgzMDZGLCAweDMwNzIsIDB4MzA3NSwgMHgzMDc4LCAweDMwN0IsIDB4MzA3RSwgMHgzMDdGLAotICAgIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsIDB4MzA4NCwgMHgzMDg2LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLAotICAgIDB4MzA4QiwgMHgzMDhDLCAweDMwOEQsIDB4MzA4RiwgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLAotICAgIDB4MzBBMiwgMHgzMEE0LCAweDMwQTYsIDB4MzBBOCwgMHgzMEFBLCAweDMwQUIsIDB4MzBBRCwgMHgzMEFGLAotICAgIDB4MzBCMSwgMHgzMEIzLCAweDMwQjUsIDB4MzBCNywgMHgzMEI5LCAweDMwQkIsIDB4MzBCRCwgMHgzMEJGLAotICAgIDB4MzBDMSwgMHgzMEM0LCAweDMwQzYsIDB4MzBDOCwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELAotICAgIDB4MzBDRSwgMHgzMENGLCAweDMwRDIsIDB4MzBENSwgMHgzMEQ4LCAweDMwREIsIDB4MzBERSwgMHgzMERGLAotICAgIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFNCwgMHgzMEU2LCAweDMwRTgsIDB4MzBFOSwgMHgzMEVBLAotICAgIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLAotICAgIDB4NjVFNSwgMHg2NzA4LCAweDcwNkIsIDB4NkMzNCwgMHg2NzI4LCAweDkxRDEsIDB4NTcxRiwgMHg1NTRGLAotICAgIDB4N0I1NCwgMHg0RjhCLCAweDI1QTAsIDB4MDAzMCwgMHgwMDAwLCAweDAwMzEsIDB4MDAwMCwgMHgwMDMyLAotICAgIDB4MDAwMCwgMHgwMDMzLCAweDAwMDAsIDB4MDAzNCwgMHgwMDAwLCAweDAwMzUsIDB4MDAwMCwgMHgwMDM2LAotICAgIDB4MDAwMCwgMHgwMDM3LCAweDAwMDAsIDB4MDAzOCwgMHgwMDAwLCAweDAwMzksIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LAotICAgIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLAotICAgIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LAotICAgIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LAotICAgIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLAotICAgIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LAotICAgIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MzA0MiwgMHgzMDQ0LAotICAgIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsIDB4MzA1MSwgMHgzMDUzLAotICAgIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwgMHgzMDY0LAotICAgIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAotICAgIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLAotICAgIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAotICAgIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMiwgMHgzMEE0LAotICAgIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLAotICAgIDB4MzBCNSwgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LAotICAgIDB4MzBDNiwgMHgzMEM4LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLAotICAgIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLAotICAgIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLAotICAgIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4NjVFNSwgMHg2NzA4LAotICAgIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLAotICAgIDB4MDAzMCwgMHgwMDAwLCAweDAwMzEsIDB4MDAwMCwgMHgwMDMyLCAweDAwMDAsIDB4MDAzMywgMHgwMDAwLAotICAgIDB4MDAzNCwgMHgwMDAwLCAweDAwMzUsIDB4MDAwMCwgMHgwMDM2LCAweDAwMDAsIDB4MDAzNywgMHgwMDAwLAotICAgIDB4MDAzOCwgMHgwMDAwLCAweDAwMzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLAotICAgIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LAotICAgIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLAotICAgIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LAotICAgIDB4MDA3QSwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAotICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLAotICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAotICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MzA0MiwgMHgzMDQ0LCAweDMwNDYsIDB4MzA0OCwgMHgzMDRBLAotICAgIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsIDB4MzA1MSwgMHgzMDUzLCAweDMwNTUsIDB4MzA1NywgMHgzMDU5LAotICAgIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwgMHgzMDY0LCAweDMwNjYsIDB4MzA2OCwgMHgzMDZBLAotICAgIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLCAweDMwNzIsIDB4MzA3NSwgMHgzMDc4LAotICAgIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsIDB4MzA4NCwgMHgzMDg2LAotICAgIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLCAweDMwOEQsIDB4MzA4RiwgMHgzMDkwLAotICAgIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMiwgMHgzMEE0LCAweDMwQTYsIDB4MzBBOCwgMHgzMEFBLAotICAgIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLCAweDMwQjUsIDB4MzBCNywgMHgzMEI5LAotICAgIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LCAweDMwQzYsIDB4MzBDOCwgMHgzMENBLAotICAgIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDIsIDB4MzBENSwgMHgzMEQ4LAotICAgIDB4MzBEQiwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFNCwgMHgzMEU2LAotICAgIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwgMHgzMEYwLAotICAgIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4NjVFNSwgMHg2NzA4LCAweDcwNkIsIDB4NkMzNCwgMHg2NzI4LAotICAgIDB4OTFEMSwgMHg1NzFGLCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLCAweDI1QTAsIDB4MzNDMiwgMHgzM0NELAotICAgIDB4MjExNiwgMHgwMDAwLCAweDMzRDgsIDB4MzNEQSwgMHgyMTIxLCAweDIxMjIsIDB4MDAwMCwgMHgyMTAwLAotICAgIDB4MzNDMiwgMHgwMDAwLCAweDMzQzQsIDB4MjEwNSwgMHgzMzk3LCAweDMzNzEsIDB4MzM5OCwgMHgyMTEzLAotICAgIDB4MzM4RCwgMHgzMzlCLCAweDMzOTYsIDB4MDAwMCwgMHgwMDAwLCAweDMzRDcsIDB4MzNEOCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzMDEsIDB4MzMwMiwgMHgzMzA0LCAweDMzMDYsIDB4MDAwMCwgMHgzMzA4LAotICAgIDB4MDAwMCwgMHgzMzA3LCAweDMzMEEsIDB4MDAwMCwgMHgzMzA5LCAweDAwMDAsIDB4MzMwQiwgMHgwMDAwLAotICAgIDB4MzMwQywgMHgzMzBFLCAweDMzMEYsIDB4MzMxMCwgMHgzMzExLCAweDMzMTIsIDB4MzMxMywgMHgwMDAwLAotICAgIDB4MzMxNywgMHgwMDAwLCAweDMzMTksIDB4MDAwMCwgMHgzMzFBLCAweDMzMUIsIDB4MzMxQywgMHgzMzFELAotICAgIDB4MzMxRiwgMHgzMzIwLCAweDMzMjEsIDB4MzMyNCwgMHgwMDAwLCAweDMzMjUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MzMyOCwgMHgzMzI5LCAweDAwMDAsIDB4MzMyRCwgMHgwMDAwLCAweDAwMDAsIDB4MzMyRSwgMHgzMzJGLAotICAgIDB4MzMzMCwgMHgzMzMyLCAweDAwMDAsIDB4MDAwMCwgMHgzMzM0LCAweDMzMzUsIDB4MzMzQywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzMzcsIDB4MDAwMCwgMHgzMzM4LCAweDMzM0EsIDB4MzMzRCwgMHgzMzQxLAotICAgIDB4MzMzRSwgMHgzMzNGLCAweDMzNDAsIDB4MzM0MywgMHgzMzQ0LCAweDMzNDUsIDB4MzM0NiwgMHgzMzQ4LAotICAgIDB4MzM0QiwgMHgzMzRDLCAweDMzNEYsIDB4MzM1MCwgMHgwMDAwLCAweDAwMDAsIDB4MzM1MiwgMHgzMzU0LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzNTMsIDB4MzM1NSwgMHgzMzU2LCAweDAwMDAsIDB4MzMwMSwgMHgzMzAyLAotICAgIDB4MzMwNCwgMHgzMzA2LCAweDAwMDAsIDB4MzMwOCwgMHgwMDAwLCAweDMzMDcsIDB4MzMwQSwgMHgwMDAwLAotICAgIDB4MzMwOSwgMHgwMDAwLCAweDMzMEIsIDB4MDAwMCwgMHgzMzBDLCAweDMzMEUsIDB4MzMwRiwgMHgzMzEwLAotICAgIDB4MzMxMSwgMHgzMzEyLCAweDMzMTMsIDB4MDAwMCwgMHgzMzE3LCAweDAwMDAsIDB4MzMxOSwgMHgwMDAwLAotICAgIDB4MzMxQSwgMHgzMzFCLCAweDMzMUMsIDB4MzMxRCwgMHgzMzFGLCAweDMzMjAsIDB4MzMyMSwgMHgzMzI0LAotICAgIDB4MDAwMCwgMHgzMzI1LCAweDAwMDAsIDB4MDAwMCwgMHgzMzI4LCAweDMzMjksIDB4MDAwMCwgMHgzMzJELAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzMkUsIDB4MzMyRiwgMHgzMzMwLCAweDMzMzIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MzMzNCwgMHgzMzM1LCAweDMzM0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzMzNywgMHgwMDAwLAotICAgIDB4MzMzOCwgMHgzMzNBLCAweDMzM0QsIDB4MzM0MSwgMHgzMzNFLCAweDMzM0YsIDB4MzM0MCwgMHgzMzQzLAotICAgIDB4MzM0NCwgMHgzMzQ1LCAweDMzNDYsIDB4MzM0OCwgMHgzMzRCLCAweDMzNEMsIDB4MzM0RiwgMHgzMzUwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzNTIsIDB4MzM1NCwgMHgwMDAwLCAweDAwMDAsIDB4MzM1MywgMHgzMzU1LAotICAgIDB4MzM1NiwgMHgzMzdFLCAweDMzN0QsIDB4MzM3QywgMHgzMzdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDJELAotICAgIDB4MDAzRCwgMHgyMTAzLCAweDI2NDAsIDB4MjY0MiwgMHgzMDEzLCAweDMwMTIsIDB4MzAwQywgMHgzMDBELAotICAgIDB4MzAwRSwgMHgzMDBGLCAweDMwMUEsIDB4MzAxQiwgMHgzMDE4LCAweDMwMTksIDB4RkYwOCwgMHhGRjA5LAotICAgIDB4MzAxRCwgMHgzMDFFLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MDAyNywgMHgwMDIyLAotICAgIDB4MDAwMCwgMHgyMTM1LCAweDAzRDAsIDB4MjIwQSwgMHgyMTBGLCAweDAwQjUsIDB4MDNDNiwgMHgwM0RCLAotICAgIDB4MDNEMSwgMHhGRkZELCAweDI2NjgsIDB4MjY2OSwgMHgyNjZDLCAweEZGMUEsIDB4MDBBOSwgMHgwMEE5LAotICAgIDB4MDBBRSwgMHgwMEFFLCAweDMwM0IsIDB4MzAzQiwgMHgzMDMzLCAweDMwMzQsIDB4MzAzNSwgMHgyMDNDLAotICAgIDB4MjA0OSwgMHgwMDIxLCAweDIwM0MsIDB4MjA0OSwgMHgyNDRBLCAweDAwMDAsIDB4MjIxMywgMHgyMjYwLAotICAgIDB4MjI0MywgMHgyMjcyLCAweDIyNzMsIDB4MzAwQywgMHgzMDBELCAweDMwMEUsIDB4MzAwRiwgMHgzMDFBLAotICAgIDB4MzAxQiwgMHgzMDE4LCAweDMwMTksIDB4RkY1RiwgMHhGRjYwLCAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLAotICAgIDB4MzAwRiwgMHgzMDFBLCAweDMwMUIsIDB4MzAxOCwgMHgzMDE5LCAweEZGNUYsIDB4RkY2MCwgMHgyMzlCLAotICAgIDB4MjM5RCwgMHgyMzlFLCAweDIzQTAsIDB4MjM5RCwgMHgyMzlCLCAweDIzQTAsIDB4MjM5RSwgMHgyM0ExLAotICAgIDB4MjNBMywgMHgyM0E0LCAweDIzQTYsIDB4MjNBMywgMHgyM0ExLCAweDIzQTYsIDB4MjNBNCwgMHgyM0ExLAotICAgIDB4MjNBMywgMHgyM0E0LCAweDIzQTYsIDB4MjNBMywgMHgyM0ExLCAweDIzQTYsIDB4MjNBNCwgMHhGRjVDLAotICAgIDB4MjAxNSwgMHgzMDFELCAweDMwMUUsIDB4MjAxOCwgMHgyMDE5LCAweDIwMTgsIDB4MjAxOSwgMHgyNzAyLAotICAgIDB4MjcwMiwgMHgyNzAyLCAweDI3MDIsIDB4MzAzRCwgMHgzMDEyLCAweDMwOUYsIDB4NTM0RCwgMHgyMjA3LAotICAgIDB4MjIwNSwgMHgyMkEwLCAweDIyOTYsIDB4MjI5OCwgMHgyMjk1LCAweDIyOTcsIDB4MjI5RSwgMHgyMjk1LAotICAgIDB4MDAyMSwgMHgyNUIzLCAweDI1QzAsIDB4MjVCNiwgMHgyMUU2LCAweDIxRTgsIDB4MjFFNywgMHgyMUU5LAotICAgIDB4MjFEMCwgMHgyMTk0LCAweDIxOTgsIDB4MjE5OSwgMHgyMTk2LCAweDIxOTcsIDB4MjFDQywgMHgyMUM2LAotICAgIDB4MjFDNCwgMHgyMUM1LCAweDIxOTAsIDB4MjE5MiwgMHgyMTkxLCAweDIxOTMsIDB4MjE5NCwgMHgyMTk1LAotICAgIDB4MjUwNCwgMHgyNTA2LCAweDMwMzAsIDB4MjMwNywgMHgzMDMwLCAweDIzMDcsIDB4MzAzMCwgMHgyMzA3LAotICAgIDB4MzAzMCwgMHgyMzA3LCAweDMwMzAsIDB4MjMwNywgMHgyNzQwLCAweDI3M0YsIDB4MjVBMSwgMHgyNUEwLAotICAgIDB4MjVBMSwgMHgyNUExLCAweDI1QTEsIDB4MjVBMSwgMHgyNUExLCAweDI1QUIsIDB4MjVBMCwgMHgyNUFBLAotICAgIDB4MjcxQSwgMHgyNzFBLCAweDI1QzcsIDB4MjVDNiwgMHgyNUM3LCAweDI1QzcsIDB4MjVDNywgMHgyNUM3LAotICAgIDB4MjVDNywgMHgyNUM2LCAweDI1QzYsIDB4MjVDRSwgMHgyNUM5LCAweDI1Q0IsIDB4MjVFNiwgMHgyNUNGLAotICAgIDB4MjAyMiwgMHgyNzU2LCAweDI3NTYsIDB4Mjc1NiwgMHgyNzU2LCAweDMwMDgsIDB4MzAwOSwgMHgzMDA4LAotICAgIDB4MzAwOSwgMHgzMDBBLCAweDMwMEIsIDB4MzAwQSwgMHgzMDBCLCAweDMwNTMsIDB4MzA1MywgMHgzMEIzLAotICAgIDB4MzBCMywgMHgzMDlELCAweDMwOUUsIDB4MzA0MSwgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwgMHgzMDQ1LAotICAgIDB4MzA0NiwgMHgzMDQ3LCAweDMwNDgsIDB4MzA0OSwgMHgzMDRBLCAweDMwNEIsIDB4MzA0QiwgMHgzMDRDLAotICAgIDB4MzA0RCwgMHgzMDRFLCAweDMwNEYsIDB4MzA1MCwgMHgzMDUxLCAweDMwNTEsIDB4MzA1MiwgMHgzMDUzLAotICAgIDB4MzA1MywgMHgzMDU0LCAweDMwNTUsIDB4MzA1NiwgMHgzMDU3LCAweDMwNTgsIDB4MzA1OSwgMHgzMDVBLAotICAgIDB4MzA1QiwgMHgzMDVDLCAweDMwNUQsIDB4MzA1RSwgMHgzMDVGLCAweDMwNjAsIDB4MzA2MSwgMHgzMDYyLAotICAgIDB4MzA2MywgMHgzMDY0LCAweDMwNjUsIDB4MzA2NiwgMHgzMDY3LCAweDMwNjgsIDB4MzA2OSwgMHgzMDZBLAotICAgIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLCAweDMwNzAsIDB4MzA3MSwgMHgzMDcyLAotICAgIDB4MzA3MywgMHgzMDc0LCAweDMwNzUsIDB4MzA3NiwgMHgzMDc3LCAweDMwNzgsIDB4MzA3OSwgMHgzMDdBLAotICAgIDB4MzA3QiwgMHgzMDdDLCAweDMwN0QsIDB4MzA3RSwgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLAotICAgIDB4MzA4MywgMHgzMDg0LCAweDMwODUsIDB4MzA4NiwgMHgzMDg3LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLAotICAgIDB4MzA4QiwgMHgzMDhDLCAweDMwOEQsIDB4MzA4RSwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLAotICAgIDB4MzA5MywgMHgzMDk0LCAweDMwRkQsIDB4MzBGRSwgMHgzMEZDLCAweDMwQTEsIDB4MzBBMiwgMHgzMEEzLAotICAgIDB4MzBBNCwgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywgMHgzMEE4LCAweDMwQTksIDB4MzBBQSwgMHgzMEY1LAotICAgIDB4MzBBQiwgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsIDB4MzBGNiwgMHgzMEIxLAotICAgIDB4MzBCMiwgMHgzMEIzLCAweDMwQjMsIDB4MzBCNCwgMHgzMEI1LCAweDMwQjYsIDB4MzBCNywgMHgzMEI4LAotICAgIDB4MzBCOSwgMHgzMEJBLCAweDMwQkIsIDB4MzBCQywgMHgzMEJELCAweDMwQkUsIDB4MzBCRiwgMHgzMEMwLAotICAgIDB4MzBDMSwgMHgzMEMyLCAweDMwQzMsIDB4MzBDNCwgMHgzMEM1LCAweDMwQzYsIDB4MzBDNywgMHgzMEM4LAotICAgIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwgMHgzMEQwLAotICAgIDB4MzBEMSwgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwgMHgzMEQ1LCAweDMwRDYsIDB4MzBENywgMHgzMEQ4LAotICAgIDB4MzBEOSwgMHgzMERBLCAweDMwREIsIDB4MzBEQywgMHgzMERELCAweDMwREUsIDB4MzBERiwgMHgzMEUwLAotICAgIDB4MzBFMSwgMHgzMEUyLCAweDMwRTMsIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsIDB4MzBFNywgMHgzMEU4LAotICAgIDB4MzBFOSwgMHgzMEVBLCAweDMwRUIsIDB4MzBFQywgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwgMHgzMEYwLAotICAgIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4MzBGNCwgMHgzMEY3LCAweDMwRjgsIDB4MzBGOSwgMHgzMEZBLAotICAgIDB4MzA5RCwgMHgzMDlFLCAweDMwNDEsIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LAotICAgIDB4MzA0NywgMHgzMDQ4LCAweDMwNDksIDB4MzA0QSwgMHgzMDRCLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELAotICAgIDB4MzA0RSwgMHgzMDRGLCAweDMwNTAsIDB4MzA1MSwgMHgzMDUxLCAweDMwNTIsIDB4MzA1MywgMHgzMDUzLAotICAgIDB4MzA1NCwgMHgzMDU1LCAweDMwNTYsIDB4MzA1NywgMHgzMDU4LCAweDMwNTksIDB4MzA1QSwgMHgzMDVCLAotICAgIDB4MzA1QywgMHgzMDVELCAweDMwNUUsIDB4MzA1RiwgMHgzMDYwLCAweDMwNjEsIDB4MzA2MiwgMHgzMDYzLAotICAgIDB4MzA2NCwgMHgzMDY1LCAweDMwNjYsIDB4MzA2NywgMHgzMDY4LCAweDMwNjksIDB4MzA2QSwgMHgzMDZCLAotICAgIDB4MzA2QywgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcwLCAweDMwNzEsIDB4MzA3MiwgMHgzMDczLAotICAgIDB4MzA3NCwgMHgzMDc1LCAweDMwNzYsIDB4MzA3NywgMHgzMDc4LCAweDMwNzksIDB4MzA3QSwgMHgzMDdCLAotICAgIDB4MzA3QywgMHgzMDdELCAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDgzLAotICAgIDB4MzA4NCwgMHgzMDg1LCAweDMwODYsIDB4MzA4NywgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLAotICAgIDB4MzA4QywgMHgzMDhELCAweDMwOEUsIDB4MzA4RiwgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLAotICAgIDB4MzA5NCwgMHgzMEZELCAweDMwRkUsIDB4MzBGQywgMHgzMEExLCAweDMwQTIsIDB4MzBBMywgMHgzMEE0LAotICAgIDB4MzBBNSwgMHgzMEE2LCAweDMwQTcsIDB4MzBBOCwgMHgzMEE5LCAweDMwQUEsIDB4MzBGNSwgMHgzMEFCLAotICAgIDB4MzBBQywgMHgzMEFELCAweDMwQUUsIDB4MzBBRiwgMHgzMEIwLCAweDMwRjYsIDB4MzBCMSwgMHgzMEIyLAotICAgIDB4MzBCMywgMHgzMEIzLCAweDMwQjQsIDB4MzBCNSwgMHgzMEI2LCAweDMwQjcsIDB4MzBCOCwgMHgzMEI5LAotICAgIDB4MzBCQSwgMHgzMEJCLCAweDMwQkMsIDB4MzBCRCwgMHgzMEJFLCAweDMwQkYsIDB4MzBDMCwgMHgzMEMxLAotICAgIDB4MzBDMiwgMHgzMEMzLCAweDMwQzQsIDB4MzBDNSwgMHgzMEM2LCAweDMwQzcsIDB4MzBDOCwgMHgzMEM5LAotICAgIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMCwgMHgzMEQxLAotICAgIDB4MzBEMiwgMHgzMEQzLCAweDMwRDQsIDB4MzBENSwgMHgzMEQ2LCAweDMwRDcsIDB4MzBEOCwgMHgzMEQ5LAotICAgIDB4MzBEQSwgMHgzMERCLCAweDMwREMsIDB4MzBERCwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLAotICAgIDB4MzBFMiwgMHgzMEUzLCAweDMwRTQsIDB4MzBFNSwgMHgzMEU2LCAweDMwRTcsIDB4MzBFOCwgMHgzMEU5LAotICAgIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVFLCAweDMwRUYsIDB4MzBGMCwgMHgzMEYxLAotICAgIDB4MzBGMiwgMHgzMEYzLCAweDMwRjQsIDB4MzBGNywgMHgzMEY4LCAweDMwRjksIDB4MzBGQSwgMHgzMDAxLAotICAgIDB4MzAwMiwgMHgzMEZCLCAweEZGMEEsIDB4MjAzQiwgMHgyNUNCLCAweDI1Q0UsIDB4MjVDOSwgMHgyNUIzLAotICAgIDB4MjVCMiwgMHgzMEZELCAweDMwRkUsIDB4MzA5RCwgMHgzMDlFLCAweEZGMDgsIDB4RkYwOSwgMHgzMDE0LAotICAgIDB4MzAxNSwgMHhGRjA4LCAweEZGMDksIDB4MzAxNCwgMHgzMDE1LCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLAotICAgIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgzMDQxLAotICAgIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsIDB4MzA0OCwgMHgzMDQ5LAotICAgIDB4MzA0QSwgMHgzMDRCLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELCAweDMwNEUsIDB4MzA0RiwgMHgzMDUwLAotICAgIDB4MzA1MSwgMHgzMDUxLCAweDMwNTIsIDB4MzA1MywgMHgzMDU0LCAweDMwNTUsIDB4MzA1NiwgMHgzMDU3LAotICAgIDB4MzA1OCwgMHgzMDU5LCAweDMwNUEsIDB4MzA1QiwgMHgzMDVDLCAweDMwNUQsIDB4MzA1RSwgMHgzMDVGLAotICAgIDB4MzA2MCwgMHgzMDYxLCAweDMwNjIsIDB4MzA2MywgMHgzMDY0LCAweDMwNjUsIDB4MzA2NiwgMHgzMDY3LAotICAgIDB4MzA2OCwgMHgzMDY5LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAotICAgIDB4MzA3MCwgMHgzMDcxLCAweDMwNzIsIDB4MzA3MywgMHgzMDc0LCAweDMwNzUsIDB4MzA3NiwgMHgzMDc3LAotICAgIDB4MzA3OCwgMHgzMDc5LCAweDMwN0EsIDB4MzA3QiwgMHgzMDdDLCAweDMwN0QsIDB4MzA3RSwgMHgzMDdGLAotICAgIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsIDB4MzA4MywgMHgzMDg0LCAweDMwODUsIDB4MzA4NiwgMHgzMDg3LAotICAgIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLCAweDMwOEQsIDB4MzA4RSwgMHgzMDhGLAotICAgIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMDk0LCAweDMwNDEsIDB4MzA0MywgMHgzMDQ1LAotICAgIDB4MzA0NywgMHgzMDQ5LCAweDMwNEIsIDB4MzA1MSwgMHgzMDYzLCAweDMwODMsIDB4MzA4NSwgMHgzMDg3LAotICAgIDB4MzA4RSwgMHgzMEExLCAweDMwQTIsIDB4MzBBMywgMHgzMEE0LCAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LAotICAgIDB4MzBBOCwgMHgzMEE5LCAweDMwQUEsIDB4MzBBQiwgMHgzMEY1LCAweDMwQUMsIDB4MzBBRCwgMHgzMEFFLAotICAgIDB4MzBBRiwgMHgzMEIwLCAweDMwQjEsIDB4MzBGNiwgMHgzMEIyLCAweDMwQjMsIDB4MzBCNCwgMHgzMEI1LAotICAgIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwgMHgzMEJBLCAweDMwQkIsIDB4MzBCQywgMHgzMEJELAotICAgIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLCAweDMwQzMsIDB4MzBDNCwgMHgzMEM1LAotICAgIDB4MzBDNiwgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELAotICAgIDB4MzBDRSwgMHgzMENGLCAweDMwRDAsIDB4MzBEMSwgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwgMHgzMEQ1LAotICAgIDB4MzBENiwgMHgzMEQ3LCAweDMwRDgsIDB4MzBEOSwgMHgzMERBLCAweDMwREIsIDB4MzBEQywgMHgzMERELAotICAgIDB4MzBERSwgMHgzMERGLCAweDMwRTAsIDB4MzBFMSwgMHgzMEUyLCAweDMwRTMsIDB4MzBFNCwgMHgzMEU1LAotICAgIDB4MzBFNiwgMHgzMEU3LCAweDMwRTgsIDB4MzBFOSwgMHgzMEVBLCAweDMwRUIsIDB4MzBFQywgMHgzMEVELAotICAgIDB4MzBFRSwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4MzBGNCwgMHgzMEExLAotICAgIDB4MzBBMywgMHgzMEE1LCAweDMwQTcsIDB4MzBBOSwgMHgzMEY1LCAweDMwRjYsIDB4MzBDMywgMHgzMEUzLAotICAgIDB4MzBFNSwgMHgzMEU3LCAweDMwRUUsIDB4MzBGQywgMHgzMEZDLCAweDZDRTgsIDB4MjBBQywgMHgyMTI2LAotICAgIDB4MjAzMiwgMHgyMDMzLCAweEZCMDAsIDB4RkIwMywgMHhGQjA0LCAweDAxMDEsIDB4MDEyQiwgMHgwMTZCLAotICAgIDB4MDExMywgMHgwMTRELCAweDAxMDAsIDB4MDEyQSwgMHgwMTZBLCAweDAxMTIsIDB4MDE0QywgMHgyMTVCLAotICAgIDB4MjE1QywgMHgyMTVELCAweDIxNUUsIDB4MjE1MywgMHgyMTU0LCAweDIwNzAsIDB4MjA3NCwgMHgyMDc1LAotICAgIDB4MjA3NiwgMHgyMDc3LCAweDIwNzgsIDB4MjA3OSwgMHgyMDgwLCAweDIwODEsIDB4MjA4MiwgMHgyMDgzLAotICAgIDB4MjA4NCwgMHgyMDg1LCAweDIwODYsIDB4MjA4NywgMHgyMDg4LCAweDIwODksIDB4MDFDRCwgMHgwMTFBLAotICAgIDB4MDAwMCwgMHgxRUJDLCAweDAxQ0YsIDB4MDAwMCwgMHgwMTI4LCAweDAxRDEsIDB4MDAwMCwgMHgwMUQzLAotICAgIDB4MDE2RSwgMHgwMTY4LCAweDAxQ0UsIDB4MDExQiwgMHgwMDAwLCAweDFFQkQsIDB4MDFEMCwgMHgwMDAwLAotICAgIDB4MDEyOSwgMHgwMUQyLCAweDAwMDAsIDB4MDFENCwgMHgwMTZGLCAweDAxNjksIDB4MDI1MSwgMHgwMjUxLAotICAgIDB4MDI1MSwgMHgwMUZELCAweDAwRTYsIDB4MDI1NCwgMHgwMjU0LCAweDAyNTQsIDB4MDI1OSwgMHgwMjU5LAotICAgIDB4MDI1OSwgMHgwMjVBLCAweDAyNUEsIDB4MDI1QSwgMHgwMjVCLCAweDAyNUIsIDB4MDI1QiwgMHgwMDZBLAotICAgIDB4MDE0QiwgMHgwMjc1LCAweDAyOEMsIDB4MDI4QywgMHgwMjhDLCAweDAyOTIsIDB4MDI4MywgMHgwMkQwLAotICAgIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAotICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLAotICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAotICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLAotICAgIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAotICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLAotICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAotICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMEE1LCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLAotICAgIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAotICAgIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAotICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAotICAgIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMEE2LCAweDAwN0QsIDB4MDMwMywgMHgwMkJDLAotICAgIDB4MDA1QywgMHgwMkJCLCAweDAwN0MsIDB4MDA3RSwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgyMDQ0LAotICAgIDB4MDE5MiwgMHgwMEE3LCAweDAwQTQsIDB4MjAxQywgMHgwMEFCLCAweDIwMzksIDB4MjAzQSwgMHhGQjAxLAotICAgIDB4RkIwMiwgMHgyMDEyLCAweDIwMjAsIDB4MjAyMSwgMHgwMEI3LCAweDAwQjYsIDB4MjAyMiwgMHgyMDFBLAotICAgIDB4MjAxRSwgMHgyMDFELCAweDAwQkIsIDB4MjAyNiwgMHgyMDMwLCAweDAwQkYsIDB4MDMwMSwgMHgwMzAyLAotICAgIDB4MDBBRiwgMHgwMzA2LCAweDAzMDcsIDB4MDMwOCwgMHgwMzBBLCAweDAwQjgsIDB4MDMwQiwgMHgwMzI4LAotICAgIDB4MDMwQywgMHgwMzM2LCAweDAwQzYsIDB4MDBBQSwgMHgwMTQxLCAweDAwRDgsIDB4MDE1MiwgMHgwMEJBLAotICAgIDB4MDBFNiwgMHgwMTMxLCAweDAxNDIsIDB4MDBGOCwgMHgwMTUzLCAweDAwREYsIDB4MDAyRCwgMHgwMEE5LAotICAgIDB4MDBBQywgMHgwMEFFLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNSwgMHgwMEI5LAotICAgIDB4MDBCQywgMHgwMEJELCAweDAwQkUsIDB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LAotICAgIDB4MDBDNSwgMHgwMEM3LCAweDAwQzgsIDB4MDBDOSwgMHgwMENBLCAweDAwQ0IsIDB4MDBDQywgMHgwMENELAotICAgIDB4MDBDRSwgMHgwMENGLCAweDAwRDAsIDB4MDBEMSwgMHgwMEQyLCAweDAwRDMsIDB4MDBENCwgMHgwMEQ1LAotICAgIDB4MDBENiwgMHgwMEQ3LCAweDAwRDksIDB4MDBEQSwgMHgwMERCLCAweDAwREMsIDB4MDBERCwgMHgwMERFLAotICAgIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LCAweDAwRTUsIDB4MDBFNywgMHgwMEU4LAotICAgIDB4MDBFOSwgMHgwMEVBLCAweDAwRUIsIDB4MDBFQywgMHgwMEVELCAweDAwRUUsIDB4MDBFRiwgMHgwMEYwLAotICAgIDB4MDBGMSwgMHgwMEYyLCAweDAwRjMsIDB4MDBGNCwgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywgMHgwMEY5LAotICAgIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsIDB4MDE2MCwgMHgwMTc4LAotICAgIDB4MDE3RCwgMHgwMzA1LCAweDAxNjEsIDB4MjEyMiwgMHgwMTdFLCAweDAwMzAsIDB4MjBBQywgMHgyMTI2LAotICAgIDB4MjAzMiwgMHgyMDMzLCAweEZCMDAsIDB4RkIwMywgMHhGQjA0LCAweDAxMDEsIDB4MDEyQiwgMHgwMTZCLAotICAgIDB4MDExMywgMHgwMTRELCAweDAxMDAsIDB4MDEyQSwgMHgwMTZBLCAweDAxMTIsIDB4MDE0QywgMHgyMTVCLAotICAgIDB4MjE1QywgMHgyMTVELCAweDIxNUUsIDB4MjE1MywgMHgyMTU0LCAweDIwNzAsIDB4MjA3NCwgMHgyMDc1LAotICAgIDB4MjA3NiwgMHgyMDc3LCAweDIwNzgsIDB4MjA3OSwgMHgyMDgwLCAweDIwODEsIDB4MjA4MiwgMHgyMDgzLAotICAgIDB4MjA4NCwgMHgyMDg1LCAweDIwODYsIDB4MjA4NywgMHgyMDg4LCAweDIwODksIDB4MDFDRCwgMHgwMTFBLAotICAgIDB4MDAwMCwgMHgxRUJDLCAweDAxQ0YsIDB4MDAwMCwgMHgwMTI4LCAweDAxRDEsIDB4MDAwMCwgMHgwMUQzLAotICAgIDB4MDE2RSwgMHgwMTY4LCAweDAxQ0UsIDB4MDExQiwgMHgwMDAwLCAweDFFQkQsIDB4MDFEMCwgMHgwMDAwLAotICAgIDB4MDEyOSwgMHgwMUQyLCAweDAwMDAsIDB4MDFENCwgMHgwMTZGLCAweDAxNjksIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LAotICAgIDB4MDMzNiwgMHgwMDJELCAweDAwM0QsIDB4MDAyQywgMHgwMDI4LCAweDAwMjksIDB4MDAyRSwgMHgwMDJGLAotICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LAotICAgIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMzM2LCAweDAwMkQsIDB4MDAzRCwgMHgwMDJDLAotICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkUsIDB4MDAyRiwgMHgwMDNBLCAweDAwM0IsIDB4MDBCNywgMHgwMDJELAotICAgIDB4MDAzRCwgMHgyMTAzLCAweDI2NDAsIDB4MjY0MiwgMHgzMDEzLCAweDMwMTIsIDB4MzAwQywgMHgzMDBELAotICAgIDB4MzAwRSwgMHgzMDBGLCAweDMwMUEsIDB4MzAxQiwgMHgzMDE4LCAweDMwMTksIDB4RkYwOCwgMHhGRjA5LAotICAgIDB4MzAxRCwgMHgzMDFFLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MDAyNywgMHgwMDIyLAotICAgIDB4OTAzOCwgMHg4QjAxLCAweDdERTMsIDB4OUVDMywgMHg2RUFCLCAweDc5OEQsIDB4NjA5NCwgMHg2RDc3LAotICAgIDB4NjE2OCwgMHg2OTgyLCAweDZFMzQsIDB4ODkxMCwgMHg2RjIyLCAweDU2NjgsIDB4NjVFMiwgMHg3OTQ4LAotICAgIDB4ODY1QiwgMHg5N0ZGLCAweDUyRTQsIDB4OEIzOSwgMHg2M0VELCAweDY0Q0EsIDB4Nzg0RiwgMHg3QTQwLAotICAgIDB4NkJCQSwgMHg3OTQ5LCAweDg5OTYsIDB4NzE2RSwgMHg3OTNFLCAweDgwMDUsIDB4ODFFRCwgMHg3OTVELAotICAgIDB4NjY5MSwgMHg3RjcyLCAweDZEODksIDB4NzJDMCwgMHg2MTNDLCAweDc3MUUsIDB4N0JDMCwgMHg3OTU2LAotICAgIDB4NTBFNywgMHg1QzY0LCAweDVERTIsIDB4NjE4RSwgMHg4RDA4LCAweDUzN0QsIDB4NTYwNiwgMHg4NDU3LAotICAgIDB4NUZCNSwgMHg2MUYyLCAweDkzQUQsIDB4Nzk4RSwgMHg5QjJELCAweDdBODEsIDB4OTZFMywgMHg2ODg1LAotICAgIDB4N0U0MSwgMHg2NjY5LCAweDUzNTEsIDB4Nzg5MSwgMHg4Q0QzLCAweDY1NEYsIDB4NEZBRSwgMHg1MDAyLAotICAgIDB4NTg0MCwgMHg1MkM5LCAweDZCNjUsIDB4NThBOCwgMHg2QkNGLCAweDUxNEQsIDB4NjIzRSwgMHg3OTUwLAotICAgIDB4NkIwNCwgMHg5Njg2LCAweDg2NUMsIDB4NkREQSwgMHg5ODVFLCAweDY2QzYsIDB4NkI3NywgMHg3REY0LAotICAgIDB4OTM0QSwgMHg1RUNBLCAweDkzMDQsIDB4Njk4MiwgMHg1MUI0LCAweDYzNEMsIDB4ODZEQiwgMHg5MDg5LAotICAgIDB4OTAyMiwgMHg1MDQ5LCAweDdERUYsIDB4OTA1NSwgMHg1M0E5LCAweDk5MEMsIDB4ODg1QiwgMHg1RUY2LAotICAgIDB4NkNCRiwgMHg5MjVCLCAweDdGQzEsIDB4ODJCRCwgMHg5NkM1LCAweDVCQjMsIDB4NjE2OCwgMHg2OTgyLAotICAgIDB4NkJCQiwgMHg2NTYyLCAweDhDQUIsIDB4NURDQywgMHg5ODExLCAweDVFMzAsIDB4OEVDQywgMHg3QUFFLAotICAgIDB4NTc0NywgMHg1MDkxLCAweDdBNzQsIDB4NTA2NSwgMHg1RUZBLCAweDkyMzcsIDB4NkE4RSwgMHg0RUE0LAotICAgIDB4NTE2QywgMHg2NkY0LCAweDY4MjEsIDB4Nzg2QywgMHg3RDVFLCAweDgwMDMsIDB4OENGQywgMHg5NjRELAotICAgIDB4NjJGNywgMHg3RjZBLCAweDRGN0YsIDB4NTNGMiwgMHg1OUM5LCAweDhCMUQsIDB4OTBBQSwgMHg1M0NFLAotICAgIDB4OEYyRiwgMHg2N0Q0LCAweDc3QUMsIDB4ODIxQywgMHg2OTZGLCAweDY3N0UsIDB4OEExRiwgMHg0RTA4LAotICAgIDB4NTdGNCwgMHg2OTBELCAweDgwNzcsIDB4ODlBQSwgMHg5MDQyLCAweDYzNkUsIDB4NjQ0MiwgMHg4MjM5LAotICAgIDB4N0RDRiwgMHg4MDYxLCAweDUwQ0YsIDB4OEE5NSwgMHg2MDY1LCAweDUxNDYsIDB4NzczQSwgMHg4MDc0LAotICAgIDB4OERGMywgMHg1RUFELCAweDVFRjcsIDB4ODI0NywgMHg2ODQzLCAweDkwMDMsIDB4NkQzRSwgMHg2MzkyLAotICAgIDB4OEYyOSwgMHg3M0VELCAweDk4MTIsIDB4NjBCMiwgMHg2MjQ5LCAweDY1OTAsIDB4N0RDQiwgMHg4QUI5LAotICAgIDB4OENBNywgMHg3MjM2LCAweDg0N0EsIDB4NTIwNiwgMHg1Njc0LCAweDYxQTQsIDB4N0M4OSwgMHg3RDFCLAotICAgIDB4OTZGMCwgMHg4NTNELCAweDRGQkYsIDB4NjM2NywgMHg3NkM2LCAweDY4NUQsIDB4ODEwOCwgMHg4MDM2LAotICAgIDB4N0ZGQywgMHg1NDBGLCAweDk2QTMsIDB4OUU5RiwgMHg5RTk3LCAweDgwNkYsIDB4ODA3RSwgMHg2RTdFLAotICAgIDB4NTA4NSwgMHg1MTkzLCAweDUxREIsIDB4NTMxNSwgMHg1MzQwLCAweDk2RDksIDB4NTVBOSwgMHg1NkMxLAotICAgIDB4NTcwRCwgMHg1OEFCLCAweDU5REEsIDB4NUEzNiwgMHg1QUJFLCAweDVENEUsIDB4NUQ4NywgMHg1REM5LAotICAgIDB4NUREMywgMHg1RjJELCAweDVGOTgsIDB4NjBEOCwgMHg2MTNELCAweDYxRkUsIDB4NjI2OCwgMHg2MkNGLAotICAgIDB4NjUxRCwgMHg2NDBGLCAweDY0RjIsIDB4NjU1RCwgMHg2NjVGLCAweDY3QTksIDB4NjdFNywgMHg2OTZCLAotICAgIDB4NjkzMCwgMHg2OUE3LCAweDZBNDQsIDB4NkE5MCwgMHg2QzA4LCAweDZDMTMsIDB4NkUyMywgMHg2RjExLAotICAgIDB4NkVGRSwgMHg2RjNFLCAweDcxRkYsIDB4NzNFNSwgMHg3NDMyLCAweDc0NUYsIDB4NzRFMCwgMHg3NTBDLAotICAgIDB4NzY3MiwgMHg3OTJBLCAweDc4RDQsIDB4NzlCQSwgMHg3QTE5LCAweDdBOTUsIDB4N0NGMiwgMHg3RDczLAotICAgIDB4N0RERCwgMHg3RTM1LCAweDdGQUUsIDB4N0ZFMSwgMHg4MDVBLCAweDgwNUYsIDB4ODA3MywgMHg4MDcwLAotICAgIDB4ODA3NiwgMHg4MTUzLCAweDgxOEEsIDB4ODFCNSwgMHg4MUNELCAweDgzRjIsIDB4ODU1NSwgMHg4NUQ1LAotICAgIDB4ODcxQSwgMHg4ODM2LCAweDg4OUUsIDB4ODhEOCwgMHg4OEY0LCAweDg5MkIsIDB4ODkzQiwgMHg4OTZBLAotICAgIDB4ODk2RiwgMHg4QTFELCAweDhEMDUsIDB4OEQwRiwgMHg5RjRFLCAweDhFOTEsIDB4OEVBMSwgMHg5MDUyLAotICAgIDB4OTAwRSwgMHg5MTMwLCAweDkxNTYsIDB4OTE1OCwgMHg5MTY1LCAweDkxNzMsIDB4OTE3MiwgMHg5MUEyLAotICAgIDB4OTFBRiwgMHg5MUFBLCAweDkxQjQsIDB4OTFCQSwgMHg5NDc3LCAweDk2OTgsIDB4OTczRCwgMHg5NzYwLAotICAgIDB4OTc3MSwgMHg5ODBDLCAweDk4NzMsIDB4OThDMywgMHg5QTQ1LCAweDlCNEQsIDB4OUI1OCwgMHg5QkM2LAotICAgIDB4OUJFMSwgMHg5QkYxLCAweDlENDgsIDB4OURDRiwgMHg5RjA4LCAweDYyNzEsIDB4NjY5NywgMHg2MTBGLAotICAgIDB4ODg2MywgMHg5MDU1LCAweDkwN0EsIDB4NzhFRiwgMHg1NEUxLCAweDJFRDcsIDB4MkVCRCwgMHg1M0E5LAotICAgIDB4NzREQywgMHg5MDRCLCAweDk5MEMsIDB4ODg1RSwgMHg5MkIzLCAweDk1QjEsIDB4NUVGNiwgMHg2M0Y0LAotICAgIDB4NkNCRiwgMHg3MTU5LCAweDkwNjAsIDB4OTI1QiwgMHg2NUJDLCAweDVGODAsIDB4N0ZDMSwgMHg1Mzc4LAotICAgIDB4OTdGMywgMHg1MzE2LCAweDgyQjEsIDB4ODNEMywgMHg4Q0E4LCAweDkwNEUsIDB4ODJCRCwgMHg5NkM1LAotICAgIDB4OTkxMywgMHg1RUZCLCAweDcwNzAsIDB4NUJCMywgMHg2MTY4LCAweDYxNjgsIDB4NjE2OCwgMHg2OUVBLAotICAgIDB4Njk4MiwgMHg2NzZFLCAweDg5RDIsIDB4OTY5NCwgMHg1MjcyLCAweDhGNDQsIDB4OTM4QywgMHg4MkM1LAotICAgIDB4NUJEMiwgMHg3NEIwLCAweDdERTksIDB4N0YzNiwgMHg5MDg0LCAweDk1OTIsIDB4OTdEMywgMHg4MjE4LAotICAgIDB4NTM3MSwgMHg1NTlDLCAweDM0MDIsIDB4MzQwMiwgMHg1RTdFLCAweDY1RTMsIDB4NjcxRiwgMHg2QTVGLAotICAgIDB4OEQ3NywgMHg5OEUyLCAweDU0MDksIDB4NTVBQiwgMHg4NjUwLCAweDkwMDYsIDB4NTNDQSwgMHg1NDM4LAotICAgIDB4NjAyNSwgMHg3RDFBLCAweDVERTgsIDB4NjJEMiwgMHg4RERELCAweDlCNUEsIDB4OUI1QSwgMHg1MzdGLAotICAgIDB4NUYzQSwgMHg2MDUwLCAweDY5QzEsIDB4NkE0QiwgMHg2QTRCLCAweDkxMTUsIDB4OTdGRiwgMHg5OTU3LAotICAgIDB4NjY4MSwgMHgyRUE5LCAweDhGRDEsIDB4NTAzNiwgMHg3N0U5LCAweDUxNzcsIDB4ODY1RSwgMHg3QTdBLAotICAgIDB4OTA0NywgMHg2QURCLCAweDU1NTMsIDB4NTk1MSwgMHg2MDc1LCAweDYxNjcsIDB4OEZDRSwgMHg1MDkxLAotICAgIDB4NkY1NCwgMHg3QTc0LCAweDJFQkMsIDB4MkVCQywgMHg1MTdDLCAweDUyMzgsIDB4NjFCMiwgMHg2NzQzLAotICAgIDB4ODBBOSwgMHg4QjE5LCAweDkwNjMsIDB4NTM5RiwgMHg4QTAxLCAweDYyMzYsIDB4OTZDNywgMHg5ODY3LAotICAgIDB4NTQzMywgMHg1QTFCLCAweDhBQTQsIDB4NURFNSwgMHg2MTRDLCAweDYyODUsIDB4NjNBNywgMHg2OUNCLAotICAgIDB4NkQ2OSwgMHg2RTJGLCAweDgwMTUsIDB4ODE1NCwgMHg4MzUyLCAweDhCMUIsIDB4OENGQywgMHg1NDNGLAotICAgIDB4OTE3NywgMHg4MTcwLCAweDc1MTEsIDB4OEZCQywgMHg0RUNBLCAweDkzOTYsIDB4NUVBNywgMHg1RjY5LAotICAgIDB4NjNBMSwgMHg2QjcyLCAweDgzREMsIDB4NTFCNCwgMHg1NEIyLCAweDUyNEEsIDB4NzUyMiwgMHg5OTEwLAotICAgIDB4NTlGRiwgMHg1OUZGLCAweDVERkYsIDB4OEFFRSwgMHg4QUVFLCAweDhDQzcsIDB4OENDNywgMHg2QjIxLAotICAgIDB4NkIyMSwgMHg2RUNCLCAweDczQkEsIDB4NTNGMSwgMHg2MzY4LCAweDY1OUMsIDB4OTBBQSwgMHg1MkZBLAotICAgIDB4NzIzNSwgMHg3MjM1LCAweDkxNEMsIDB4NUYzMSwgMHg0RTNCLCAweDUzRDcsIDB4NjM4OCwgMHg1NDY4LAotICAgIDB4N0Q0MiwgMHg3RkQyLCAweDg4NDYsIDB4OTAzMSwgMHg0RjRGLCAweDg4NTMsIDB4OEZGMCwgMHg1REUxLAotICAgIDB4OTA3NSwgMHg5MDc1LCAweDYyNDAsIDB4NjZGOCwgMHg1OTczLCAweDUyREQsIDB4NTU0NiwgMHg1QkI1LAotICAgIDB4NUMwNiwgMHgyRThDLCAweDJFOEQsIDB4NUMxOSwgMHg2RDg4LCAweDc4NUQsIDB4ODA5NiwgMHg0RTA4LAotICAgIDB4NUI4MiwgMHg1N0NFLCAweDYwQzUsIDB4NTdGNCwgMHg5OEZFLCAweDY5MEQsIDB4NkI5NiwgMHg5OERGLAotICAgIDB4OThFMCwgMHgyRURFLCAweDM3OEQsIDB4NEZCNSwgMHgyRTk3LCAweDZENzgsIDB4NzcxRiwgMHg5MDMyLAotICAgIDB4NEVCQiwgMHg0RUJBLCAweDUyMDMsIDB4NUMwQiwgMHg4QTBBLCAweDhBMEEsIDB4OEZDNSwgMHg4ODcwLAotICAgIDB4OTA0MiwgMHgzNTFGLCAweDUyRTIsIDB4NjIxMCwgMHg3NkRCLCAweDgwNTYsIDB4ODk4MCwgMHg4QUEwLAotICAgIDB4OEFDQiwgMHg5NzVDLCAweDk3NUMsIDB4N0EwNSwgMHg4MTA2LCAweDk2QkIsIDB4N0M0RCwgMHg3QkMwLAotICAgIDB4OEFBQSwgMHg5NkVBLCAweDdENzYsIDB4NjI0NywgMHg2Rjk4LCAweDdGQTEsIDB4ODIzOSwgMHg5MDc4LAotICAgIDB4OTA3NywgMHg1MjRELCAweDUxNjgsIDB4NjM4MywgMHg2M0Y3LCAweDc2MjYsIDB4OEQ3MCwgMHg5MDAxLAotICAgIDB4OTA2RCwgMHg5MDIwLCAweDJFQ0EsIDB4OTAxRiwgMHg4Q0NBLCAweDVDMEEsIDB4NUMwQSwgMHg1OUE1LAotICAgIDB4NkNGMCwgMHg5MDAwLCAweDkwMkUsIDB4OTY4QSwgMHg5QkRCLCAweDU5MjcsIDB4MzQyNywgMHg3MDI3LAotICAgIDB4OTA1NCwgMHg4MTJCLCAweDRFMzksIDB4NkI0RSwgMHg3MEFELCAweDhBOTUsIDB4NjY5NiwgMHg1MDI0LAotICAgIDB4N0Y2RSwgMHg3QkM5LCAweDJFQUUsIDB4N0I1MSwgMHg5MDEwLCAweDY3RjEsIDB4NkNFOCwgMHg5OUQwLAotICAgIDB4NUY2QiwgMHg1RkI1LCAweDYxRjIsIDB4NjcxRCwgMHg2RjZFLCAweDhBQkYsIDB4NzZGNCwgMHg2NzE1LAotICAgIDB4NjcxNSwgMHg1ODlDLCAweDhGRkQsIDB4OTAxQSwgMHg1NzZBLCAweDkxRTMsIDB4NTQ0OCwgMHg1RTFELAotICAgIDB4N0EwQiwgMHg3Njg0LCAweDkwNjksIDB4OEZFRCwgMHg2REZCLCAweDUxNEUsIDB4OTAxNCwgMHg3ODNBLAotICAgIDB4NTcyMSwgMHg1NzFGLCAweDUxQUMsIDB4NTUxMCwgMHg3Q0Q2LCAweDg1RTQsIDB4OEIwNCwgMHg5MDAzLAotICAgIDB4OTAwRiwgMHg5QTMwLCAweDVDMEUsIDB4OTA1MywgMHg1NDUxLCAweDNCODgsIDB4NTE2NywgMHg4MDg5LAotICAgIDB4NEU3MywgMHg1RkNELCAweDhBOEQsIDB4NUJFNywgMHg3RDBELCAweDg5ODcsIDB4NkQzRSwgMHg4MEJBLAotICAgIDB4NTM1QSwgMHg4NTg0LCAweDhGRUIsIDB4N0UxQiwgMHg4MDg3LCAweDRFMzcsIDB4NkY1MSwgMHg5MUIxLAotICAgIDB4NEYzNCwgMHg1MjI0LCAweDUzNEEsIDB4NUUwNiwgMHg3NTU0LCAweDY2NjksIDB4ODU0MywgMHg5MDdGLAotICAgIDB4NUZBRSwgMHg5RjNCLCAweDUzMzksIDB4MkVBQSwgMHg1RjY1LCAweDU5RUMsIDB4NTlFQiwgMHg4QTU1LAotICAgIDB4NUU5OSwgMHg3NUM1LCAweDVBNjYsIDB4NjU3NywgMHg2RDZFLCAweDhDQTAsIDB4OENBMCwgMHg2NzBELAotICAgIDB4ODk4NiwgMHg0RTE5LCAweDVFNjMsIDB4NUU3MywgMHg1RjBBLCAweDg1MTEsIDB4NTA0RiwgMHg3REU4LAotICAgIDB4OEZENCwgMHg5MDRELCAweDdDM0YsIDB4NTMwNSwgMHg1RDI5LCAweDYyQjEsIDB4NjcwQiwgMHg3ODMyLAotICAgIDB4N0UyQiwgMHg4MERFLCAweDg0MEMsIDB4OTBBNiwgMHg5MEE2LCAweDk4RkQsIDB4OUQ2QywgMHg0RUExLAotICAgIDB4NUUzRCwgMHg1RkQ4LCAweDVGRDksIDB4NjIzRiwgMHg2NzFCLCAweDY3MUIsIDB4NTE5MiwgMHg2NDY5LAotICAgIDB4N0ZGQiwgMHg1MUUxLCAweDc4RTgsIDB4OUI1NCwgMHgyRkM3LCAweDY5RDksIDB4Njg1RCwgMHg0RkUzLAotICAgIDB4NTNDOCwgMHg3RTZELCAweDlFQkYsIDB4ODEwOCwgMHg2NjBFLCAweDc2REYsIDB4OEZGNywgMHg1OTg0LAotICAgIDB4NTJEMCwgMHg3NkYyLCAweDgwMTcsIDB4NjIzRSwgMHg3RDBCLCAweDk1ODAsIDB4N0QwNCwgMHg4RThELAotICAgIDB4Njg3QSwgMHg2ODdBLCAweDY4MDEsIDB4NjEwOSwgMHg4QUVELCAweDhGMzgsIDB4NTJDNywgMHg2NzA5LAotICAgIDB4NzMzNiwgMHg3MzM2LCAweDczMzcsIDB4ODhENSwgMHg5MDRBLCAweDY2REMsIDB4MkVCNywgMHg4OTgxLAotICAgIDB4OTkwQSwgMHg3RkNDLCAweDdGRkMsIDB4OEVCNiwgMHg4NjJELCAweDczODcsIDB4OUY4RCwgMHg5RjhELAotICAgIDB4NjVDNSwgMHg2ODgxLCAweDcxRDAsIDB4OTZBMywgMHg5QzU3LCAweDlFOUYsIDB4N0M3QiwgMHg1RUM5LAotICAgIDB4NjE5MCwgMHg5MDIzLCAweDY3MTcsIDB4ODAwMiwgMHg4MTA3LCAweDUwQ0EsIDB4NTExQSwgMHg1MTU0LAotICAgIDB4NTE5NSwgMHgyRTg3LCAweDUyOEQsIDB4NTJENywgMHg1MkY5LCAweDUzNDksIDB4MzUzRSwgMHg1M0RGLAotICAgIDB4NjZGQywgMHg1NTMzLCAweDU1RTQsIDB4NTQ1NSwgMHg1NkMwLCAweDU5MzksIDB4NUExQywgMHg1QUMyLAotICAgIDB4NUI3MywgMHg1QkMzLCAweDVDMTQsIDB4MzdFMiwgMHg1Q0U2LCAweDVFNTQsIDB4NEU0OCwgMHg1RUUzLAotICAgIDB4NjA5NywgMHg2MkQ0LCAweDYyQ0MsIDB4NjQxQywgMHg2M0M2LCAweDY0MjgsIDB4ODIwOSwgMHg2MzFCLAotICAgIDB4NjY1RiwgMHg2NjVGLCAweDY2NjMsIDB4NjZGNSwgMHg2NzVFLCAweDY4OUQsIDB4Njg4RCwgMHg2OUY2LAotICAgIDB4Njk2MSwgMHg1QkU4LCAweDVCRTgsIDB4NjlCQiwgMHg2QkNDLCAweDZGMTEsIDB4NkUxNywgMHg2Rjk4LAotICAgIDB4NkNBQSwgMHg2Q0FBLCAweDcwMUIsIDB4NzE2MiwgMHg3MjNCLCAweDRFMkMsIDB4NzMxQywgMHg3NENBLAotICAgIDB4NzRFRiwgMHg3NTc1LCAweDc1RUMsIDB4NzY0RSwgMHgzRkIxLCAweDc3NkEsIDB4NzdBOSwgMHg3OTQwLAotICAgIDB4Nzk1MywgMHg3OTUzLCAweDlGNEIsIDB4NzlBRSwgMHg5MDgzLCAweDdCNTMsIDB4N0MxMSwgMHg3QzE0LAotICAgIDB4NDI2NCwgMHg3QzUwLCAweDdDNTgsIDB4N0Q0NiwgMHg3RDYzLCAweDdFMjIsIDB4N0UyMiwgMHg3RTQ4LAotICAgIDB4N0UzNSwgMHg3RTQzLCAweDdFOEMsIDB4N0Y1MCwgMHg3RjUxLCAweDdGNTEsIDB4N0Y1MSwgMHg3RkM1LAotICAgIDB4N0ZDNiwgMHg3RkU5LCAweDgxNDEsIDB4NDQ1MywgMHg4MjU4LCAweDgyNzksIDB4MkVCRiwgMHgyRUMwLAotICAgIDB4ODJFMywgMHg1MTc5LCAweDgzQTIsIDB4ODQyMCwgMHg4M0JELCAweDg0RjQsIDB4ODU2RCwgMHg4NTg3LAotICAgIDB4ODVGNCwgMHg0RTU1LCAweDg3MzcsIDB4ODczQiwgMHg4ODA1LCAweDg3QkQsIDB4ODY3RCwgMHg4ODM2LAotICAgIDB4ODk0NCwgMHg4OEM2LCAweDg5QkQsIDB4OEFEQiwgMHg4QjNFLCAweDhCNUEsIDB4OEQ3MywgMHg4RDk5LAotICAgIDB4OERDQiwgMHg4RTM0LCAweDhFNEEsIDB4OEZFRiwgMHg5MDg3LCAweDhGRkEsIDB4OTAxRSwgMHg5MDM1LAotICAgIDB4OTA1MCwgMHg4RkM4LCAweDkwODEsIDB4OTA4QSwgMHg5MDhBLCAweDkwOEEsIDB4OTA4QSwgMHg5MDhBLAotICAgIDB4OTA4QSwgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MDg5LAotICAgIDB4OTA4OSwgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MDg5LCAweDkyQ0YsIDB4OTNERCwgMHg5NUJDLAotICAgIDB4OTYyMSwgMHg5NkIyLCAweDk3NUMsIDB4OTgzOSwgMHg5OEVCLCAweDk5MDMsIDB4OTkwOSwgMHg5OTQ1LAotICAgIDB4OTk0NSwgMHg5OTRCLCAweDlBMDgsIDB4OUE1RiwgMHg5QTY1LCAweDlBRUYsIDB4OUIxOCwgMHg5QkRGLAotICAgIDB4OUQwOSwgMHg5RDA4LCAweDlFQTUsIDB4OUVDQywgMHg5RjA4LCAweDlGNEEsIDB4OUY2MywgMHg5RjY3LAotICAgIDB4OUY2QywgMHg3MTk5LCAweDcxOTksIDB4ODkxQywgMHg2OEM4LCAweDY2RkIsIDB4NUY0NSwgMHg1MzAwLAotICAgIDB4NTM4OSwgMHg1OTUzLCAweEZBMTEsIDB4Njg1MiwgMHg2QTczLCAweDZEODcsIDB4RkExNSwgMHg4QTEyLAotICAgIDB4NEUwNCwgMHg0RTA1LCAweDRFMUYsIDB4NEUyQiwgMHg0RTJGLCAweDRFMzAsIDB4NEU0MCwgMHg0RTQxLAotICAgIDB4NEU0NCwgMHg0RTVBLCAweDRFN0YsIDB4NEU4RCwgMHg0RTk2LCAweDRFQjksIDB4NEVEMCwgMHg0RUUwLAotICAgIDB4NEVGRCwgMHg0RUZGLCAweDRGMEIsIDB4NEYxNSwgMHg0RjYwLCAweDRGM0IsIDB4NEY0OSwgMHg0RjU0LAotICAgIDB4NEY3QSwgMHg0RjdELCAweDRGN0UsIDB4NEY5NywgMHg0RkJFLCAweDRGQ0YsIDB4NEZGRCwgMHg1MDAwLAotICAgIDB4NTAwMSwgMHg1MDEwLCAweDUwMUIsIDB4NTAyNywgMHg1MDJFLCAweDUwNTcsIDB4NTA2NiwgMHg1MDZBLAotICAgIDB4NTAzQiwgMHg1MDhGLCAweDUwOTYsIDB4NTA5QywgMHg1MENDLCAweDUwRTYsIDB4NTBFOSwgMHg1MEVGLAotICAgIDB4NTEwOCwgMHg1MTBCLCAweDUxMTAsIDB4NTExQiwgMHg1MTFFLCAweDUxNUYsIDB4NTFBMSwgMHg1MUJDLAotICAgIDB4NTFERSwgMHg1MUVFLCAweDUxRjQsIDB4NTIwMSwgMHg1MjAyLCAweDUyMTMsIDB4NTI0OSwgMHg1MjYxLAotICAgIDB4NTI2NiwgMHg1MjkzLCAweDUyQzgsIDB4NTJGMCwgMHg1MzBBLCAweDUzMEIsIDB4NTMzRSwgMHg1MzRDLAotICAgIDB4NTM0QiwgMHg1MzYxLCAweDUzNkMsIDB4NTNBQiwgMHg1M0RBLCAweDUzRTYsIDB4NTNGNSwgMHg1NDI3LAotICAgIDB4NTQ0RCwgMHg1NDY2LCAweDU0NkIsIDB4NTQ3NCwgMHg1NDhELCAweDU0OTYsIDB4NTRBMSwgMHg1NEFELAotICAgIDB4NTRCOSwgMHg1NEJGLCAweDU0QzYsIDB4NTRDRCwgMHg1NTBFLCAweDU1MkIsIDB4NTUzNSwgMHg1NTRBLAotICAgIDB4NTU2MCwgMHg1NTYxLCAweDU1ODgsIDB4NTU4RSwgMHg1NjA4LCAweDU2MEUsIDB4NTYwRiwgMHg1NjM3LAotICAgIDB4NTYzRiwgMHg1NjQ5LCAweDU2NEIsIDB4NTY0RiwgMHg1NjY2LCAweDU2NjksIDB4NTY2RiwgMHg1NjcxLAotICAgIDB4NTY3MiwgMHg1Njk1LCAweDU2OUEsIDB4NTZBQywgMHg1NkFELCAweDU2QjEsIDB4NTZDOSwgMHg1NkRELAotICAgIDB4NTZFNCwgMHg1NzBBLCAweDU3MTUsIDB4NTcyMywgMHg1NzJGLCAweDU3MzMsIDB4NTczNCwgMHg1NzRDLAotICAgIDB4NTc3MCwgMHg1NzhDLCAweDU3OUMsIDB4NTdCOCwgMHg1N0U2LCAweDU3RUQsIDB4NTdGNSwgMHg1N0Y2LAotICAgIDB4NTdGRiwgMHg1ODA5LCAweDU4MjAsIDB4NTgzMiwgMHg1ODdDLCAweDU4ODAsIDB4NThBOSwgMHg1OENFLAotICAgIDB4NThEMCwgMHg1OEQ0LCAweDU4REEsIDB4NThFOSwgMHg1OTBDLCAweDU5MjQsIDB4NTkyRiwgMHg1OTYxLAotICAgIDB4NTk2RCwgMHg1OUNBLCAweDU5RDIsIDB4NTlERCwgMHg1OUUzLCAweDU5RTQsIDB4NUEwNCwgMHg1QTBDLAotICAgIDB4NUEyMywgMHg1QTQ3LCAweDVBNTUsIDB4NUE2MywgMHg1QTZELCAweDVBN0UsIDB4NUE5RSwgMHg1QUE3LAotICAgIDB4NUFBQywgMHg1QUIzLCAweDVBRTAsIDB4NUIwMCwgMHg1QjE5LCAweDVCMjUsIDB4NUIyRCwgMHg1QjQxLAotICAgIDB4NUI3QywgMHg1QjdFLCAweDVCN0YsIDB4NUI4QSwgMHg1QzIzLCAweDVDMkIsIDB4NUMzMCwgMHg1QzYzLAotICAgIDB4NUM2OSwgMHg1QzdDLCAweDVDQ0IsIDB4NUNEMiwgMHg1Q0Y0LCAweDVEMjQsIDB4NUQyNiwgMHg1RDQzLAotICAgIDB4NUQ0NiwgMHg1RDRBLCAweDVEOTIsIDB4NUQ5NCwgMHg1RDk5LCAweDVEQTAsIDB4NUREOCwgMHg1REUwLAotICAgIDB4NURGOCwgMHg1RTAwLCAweDVFMTIsIDB4NUUxNCwgMHg1RTE1LCAweDVFMTgsIDB4NUUyRSwgMHg1RTU4LAotICAgIDB4NUU2QiwgMHg1RTZDLCAweDVFQTgsIDB4NUVBQSwgMHg1RUJFLCAweDVFQkYsIDB4NUVDQiwgMHg1RUQyLAotICAgIDB4NUYwNywgMHg1RjBFLCAweDVGMUMsIDB4NUYxRCwgMHg1RjIyLCAweDVGMjgsIDB4NUYzNiwgMHg1RjNCLAotICAgIDB4NUY0MCwgMHg1RjUwLCAweDVGNTgsIDB4NUY2NCwgMHg1Rjg5LCAweDVGOUMsIDB4NUZBNywgMHg1RkE0LAotICAgIDB4NUZBRiwgMHg1RkI4LCAweDVGQzQsIDB4NUZDOSwgMHg1RkUxLCAweDVGRTksIDB4NUZFRCwgMHg1RkZDLAotICAgIDB4NjAxNywgMHg2MDFBLCAweDYwMzMsIDB4NjA2MSwgMHg2MDdGLCAweDYwOUUsIDB4NjBBNCwgMHg2MEIwLAotICAgIDB4NjBDQiwgMHg2MERCLCAweDYwRjgsIDB4NjExMiwgMHg2MTEzLCAweDYxMTQsIDB4NjExQywgMHg2MTdDLAotICAgIDB4NjE4RCwgMHg2MTlGLCAweDYxQTgsIDB4NjFDMiwgMHg2MURGLCAweDYyMTUsIDB4NjIyOSwgMHg2MjQzLAotICAgIDB4NjI0NiwgMHg2MjRDLCAweDYyNTEsIDB4NjI1NiwgMHg2MkM0LCAweDYyRkMsIDB4NjMwQSwgMHg2MzBELAotICAgIDB4NjMxOCwgMHg2MzM5LCAweDYzNDIsIDB4NjM0MywgMHg2MzY1LCAweDYzNzQsIDB4NjM3RCwgMHg2Mzg0LAotICAgIDB4NjM4NywgMHg2MzkwLCAweDYzOUUsIDB4NjNEMSwgMHg2M0RDLCAweDY0MDksIDB4NjQxMCwgMHg2NDIyLAotICAgIDB4NjQ1NCwgMHg2NDVCLCAweDY0NkQsIDB4NjQ3QiwgMHg2NEJFLCAweDY0QkYsIDB4NjRFNSwgMHg2NEY3LAotICAgIDB4NjRGQiwgMHg2NTA0LCAweDY1MTYsIDB4NjUxOSwgMHg2NTQ3LCAweDY1NjcsIDB4NjU4MSwgMHg2NTg1LAotICAgIDB4NjVDMiwgMHg2NUYwLCAweDY1RjIsIDB4NjYyQywgMHg2NjRDLCAweDY2NUIsIDB4NjY1QywgMHg2NjYxLAotICAgIDB4NjY2QiwgMHg2Njc3LCAweDY2QTQsIDB4NjZDOCwgMHg2NkVDLCAweDY3MDUsIDB4NjcxMywgMHg2NzMzLAotICAgIDB4Njc0OCwgMHg2NzRDLCAweDY3NzYsIDB4Njc3QiwgMHg2N0IwLCAweDY3QjIsIDB4NjdGOSwgMHg2N0Q3LAotICAgIDB4NjdEOSwgMHg2N0YwLCAweDY4MkMsIDB4NjgzMCwgMHg2ODMxLCAweDY4NUIsIDB4Njg3MiwgMHg2ODc1LAotICAgIDB4Njg3QSwgMHg2ODg0LCAweDY4QTUsIDB4NjhCMiwgMHg2OEQwLCAweDY4RDYsIDB4NjhFOCwgMHg2OEVELAotICAgIDB4NjhGMCwgMHg2OEYxLCAweDY4RkMsIDB4NjkxMSwgMHg2OTEzLCAweDY5MzUsIDB4NjkzQiwgMHg2OTU3LAotICAgIDB4Njk2MywgMHg2OTcyLCAweDY5N0YsIDB4Njk4MCwgMHg2OUE2LCAweDY5QUQsIDB4NjlCNywgMHg2OUQ2LAotICAgIDB4NjlENywgMHg2QTAxLCAweDZBMEYsIDB4NkExNSwgMHg2QTI4LCAweDZBMzQsIDB4NkEzRSwgMHg2QTQ1LAotICAgIDB4NkE1MCwgMHg2QTUxLCAweDZBNTYsIDB4NkE1QiwgMHg2QTgzLCAweDZBODksIDB4NkE5MSwgMHg2QTlELAotICAgIDB4NkE5RSwgMHg2QTlGLCAweDZBREMsIDB4NkFFNywgMHg2QUVDLCAweDZCMUUsIDB4NkIyNCwgMHg2QjM1LAotICAgIDB4NkI0NiwgMHg2QjU2LCAweDZCNjAsIDB4NkI4MiwgMHg2QkJFLCAweDZCRTEsIDB4NkJGMSwgMHg2QzEwLAotICAgIDB4NkMzMywgMHg2QzM1LCAweDZDM0EsIDB4NkM1OSwgMHg2Qzc2LCAweDZDN0IsIDB4NkM4NSwgMHg2Qzk1LAotICAgIDB4NkM5QywgMHg2Q0QwLCAweDZDRDQsIDB4NkNENiwgMHg2Q0UwLCAweDZDRUIsIDB4NkNFQywgMHg2Q0VFLAotICAgIDB4NkQwQSwgMHg2RDBFLCAweDZEMTEsIDB4NkQyRSwgMHg2RDU3LCAweDZENUUsIDB4NkQ2NSwgMHg2RDgyLAotICAgIDB4NkRCRiwgMHg2REM0LCAweDZEQ0EsIDB4NkRENiwgMHg2REU5LCAweDZFMjIsIDB4NkU1MSwgMHg2RUM3LAotICAgIDB4NkVDQSwgMHg2RUNFLCAweDZFRkQsIDB4NkYxQSwgMHg2RjJBLCAweDZGMkYsIDB4NkYzMywgMHg2RjVBLAotICAgIDB4NkY1RSwgMHg2RjYyLCAweDZGN0QsIDB4NkY4QiwgMHg2RjhELCAweDZGOTIsIDB4NkY5NCwgMHg2RjlBLAotICAgIDB4NkZBNywgMHg2RkE4LCAweDZGQjYsIDB4NkZEQSwgMHg2RkRFLCAweDZGRjksIDB4NzAzOSwgMHg3MDNDLAotICAgIDB4NzA0QSwgMHg3MDU0LCAweDcwNUQsIDB4NzA1RSwgMHg3MDY0LCAweDcwNkMsIDB4NzA3RSwgMHg3MDgxLAotICAgIDB4NzA5NSwgMHg3MEI3LCAweDcwRDMsIDB4NzBENCwgMHg3MEQ4LCAweDcwREMsIDB4NzEwNywgMHg3MTIwLAotICAgIDB4NzEzMSwgMHg3MTRBLCAweDcxNTIsIDB4NzE2MCwgMHg3MTc5LCAweDcxOTIsIDB4NzFCMywgMHg3MUNCLAotICAgIDB4NzFEMywgMHg3MUQ2LCAweDcyMDAsIDB4NzIxRCwgMHg3MjJCLCAweDcyMzgsIDB4NzI0MSwgMHg3MjUzLAotICAgIDB4NzI1NSwgMHg3MjU2LCAweDcyNUMsIDB4NzI4RCwgMHg3MkFELCAweDcyQjQsIDB4NzJDNywgMHg3MkZCLAotICAgIDB4NzMwNCwgMHg3MzA1LCAweDczMjgsIDB4NzMzMSwgMHg3MzQzLCAweDczNkMsIDB4NzM3QywgMHg3MzgzLAotICAgIDB4NzM4NSwgMHg3Mzg2LCAweDczOTUsIDB4NzM5RSwgMHg3MzlGLCAweDczQTAsIDB4NzNBNiwgMHg3M0FCLAotICAgIDB4NzNCNSwgMHg3M0I3LCAweDczQkMsIDB4NzNDRiwgMHg3M0Q5LCAweDczRTksIDB4NzNGNCwgMHg3M0ZELAotICAgIDB4NzQwNCwgMHg3NDBBLCAweDc0MUEsIDB4NzQxQiwgMHg3NDI0LCAweDc0MjgsIDB4NzQyQywgMHg3NDJGLAotICAgIDB4NzQzMCwgMHg3NDMxLCAweDc0MzksIDB4NzQ0NCwgMHg3NDQ3LCAweDc0NEIsIDB4NzQ0RCwgMHg3NDUxLAotICAgIDB4NzQ1NywgMHg3NDY2LCAweDc0NkIsIDB4NzQ3MSwgMHg3NDgwLCAweDc0ODUsIDB4NzQ4NiwgMHg3NDg3LAotICAgIDB4NzQ5MCwgMHg3NDk4LCAweDc0OUMsIDB4NzRBMCwgMHg3NEEzLCAweDc0QTgsIDB4NzRBQiwgMHg3NEI1LAotICAgIDB4NzRCRiwgMHg3NEM4LCAweDc0REEsIDB4NzRERSwgMHg3NTRFLCAweDc1NzksIDB4NzU4MSwgMHg3NTkwLAotICAgIDB4NzU5MiwgMHg3NTkzLCAweDc1QjQsIDB4NzVFNCwgMHg3NUY5LCAweDc2MDAsIDB4NzYwQSwgMHg3NjE1LAotICAgIDB4NzYxNiwgMHg3NjE5LCAweDc2MUUsIDB4NzYyRCwgMHg3NjM1LCAweDc2NDMsIDB4NzY0QiwgMHg3NjY1LAotICAgIDB4NzY2RCwgMHg3NjZGLCAweDc2NzEsIDB4NzY3NCwgMHg3NkE0LCAweDc2QTUsIDB4NzZDNSwgMHg3NkNDLAotICAgIDB4NzZFQywgMHg3NkZDLCAweDc3MzQsIDB4NzczNiwgMHg3NzVDLCAweDc3NUYsIDB4Nzc2MCwgMHg3NzcyLAotICAgIDB4Nzc3RCwgMHg3Nzk1LCAweDc3QUEsIDB4NzdFNiwgMHg3N0YwLCAweDc3RjQsIDB4NzgwNiwgMHg3ODIyLAotICAgIDB4NzgyRCwgMHg3ODJFLCAweDc4MzAsIDB4NzgzNSwgMHg3ODY4LCAweDc4OUUsIDB4NzhDOCwgMHg3OENDLAotICAgIDB4NzhDRSwgMHg3OEU0LCAweDc4RTAsIDB4NzhFMSwgMHg3OEYyLCAweDc4RjcsIDB4NzhGQiwgMHg3OTMxLAotICAgIDB4NzkzNCwgMHg3OTNCLCAweDc5M0QsIDB4Nzk0NSwgMHg3OTVCLCAweDc5NUMsIDB4Nzk4QiwgMHg3OTk2LAotICAgIDB4Nzk5OCwgMHg3OUI4LCAweDc5QkIsIDB4NzlDQSwgMHg3OURBLCAweDdBMDMsIDB4N0EwOSwgMHg3QTExLAotICAgIDB4N0ExRSwgMHg3QTJELCAweDdBMzksIDB4N0E0NSwgMHg3QTRDLCAweDdBNUQsIDB4N0E2MCwgMHg3QTZELAotICAgIDB4N0E3OCwgMHg3QUEwLCAweDdBQTMsIDB4N0FCMywgMHg3QUJCLCAweDdBQkMsIDB4N0FDNiwgMHg3QjA3LAotICAgIDB4N0IxNCwgMHg3QjI3LCAweDdCMzEsIDB4N0I0NywgMHg3QjRFLCAweDdCNjAsIDB4N0I2OSwgMHg3QjZELAotICAgIDB4N0I3MiwgMHg3QjkxLCAweDdCQUYsIDB4N0JENywgMHg3QkQ5LCAweDdDMEIsIDB4N0MwRiwgMHg3QzIwLAotICAgIDB4N0MyNiwgMHg3QzMxLCAweDdDMzYsIDB4N0M1MSwgMHg3QzU5LCAweDdDNjcsIDB4N0M2RSwgMHg3QzcwLAotICAgIDB4N0NCQywgMHg3Q0JGLCAweDdDQzgsIDB4N0NDOSwgMHg3Q0Q3LCAweDdDRDksIDB4N0NERCwgMHg3Q0VCLAotICAgIDB4N0QwNywgMHg3RDA4LCAweDdEMDksIDB4N0QxMywgMHg3RDFELCAweDdEMjMsIDB4N0Q0MSwgMHg3RDUzLAotICAgIDB4N0Q1OSwgMHg3RDVELCAweDdEN0EsIDB4N0Q4NiwgMHg3RDhCLCAweDdEOEMsIDB4N0RDQywgMHg3REVCLAotICAgIDB4N0RGMSwgMHg3REY5LCAweDdFMDgsIDB4N0UxMSwgMHg3RTE1LCAweDdFMjAsIDB4N0U0NywgMHg3RTYyLAotICAgIDB4N0U2RSwgMHg3RTczLCAweDdFOEQsIDB4N0U5MSwgMHg3RTk4LCAweDdGNDQsIDB4N0Y0RiwgMHg3RjUyLAotICAgIDB4N0Y1MywgMHg3RjYxLCAweDdGOTEsIDB4N0ZCRiwgMHg3RkNFLCAweDdGREYsIDB4N0ZFNSwgMHg3RkVDLAotICAgIDB4N0ZFRSwgMHg3RkVGLCAweDdGRkEsIDB4ODAwRSwgMHg4MDExLCAweDgwMTQsIDB4ODAyNCwgMHg4MDI2LAotICAgIDB4ODAzQSwgMHg4MDNDLCAweDgwNjAsIDB4ODA3MSwgMHg4MDc1LCAweDgwOUUsIDB4ODBBNiwgMHg4MEFCLAotICAgIDB4ODBENywgMHg4MEQ4LCAweDgxMTYsIDB4ODExOCwgMHg4MTNBLCAweDgxNEEsIDB4ODE0QywgMHg4MTgxLAotICAgIDB4ODE4NCwgMHg4MUI0LCAweDgxQ0YsIDB4ODFGOSwgMHg4MjAzLCAweDgyMjEsIDB4ODIzMiwgMHg4MjM0LAotICAgIDB4ODI0NiwgMHg4MjRCLCAweDgyNEYsIDB4ODI4RSwgMHg4MkFFLCAweDgyQjcsIDB4ODJCRSwgMHg4MkM2LAotICAgIDB4ODJGRSwgMHg4MzQzLCAweDgzNTEsIDB4ODM1NSwgMHg4Mzg2LCAweDgzOEQsIDB4ODM5MiwgMHg4Mzk4LAotICAgIDB4ODNBOSwgMHg4M0JGLCAweDgzQzAsIDB4ODNFQSwgMHg4NDBGLCAweDg0MTEsIDB4ODQ0QSwgMHg4NDc2LAotICAgIDB4ODRBOCwgMHg4NEFGLCAweDg0QzAsIDB4ODRDMiwgMHg4NEYwLCAweDg0RkQsIDB4ODUwQywgMHg4NTM0LAotICAgIDB4ODU1RSwgMHg4NThGLCAweDg1QjcsIDB4ODVDRSwgMHg4NUFELCAweDg2MTIsIDB4ODYyOSwgMHg4NjUyLAotICAgIDB4ODY2MywgMHg4NjZDLCAweDg2NkYsIDB4ODY3QSwgMHg4NjhELCAweDg2OTEsIDB4ODY5OCwgMHg4NkE3LAotICAgIDB4ODZBOCwgMHg4NkZBLCAweDg2RkQsIDB4ODcwQiwgMHg4NzEzLCAweDg3MTksIDB4ODcxRSwgMHg4NzI4LAotICAgIDB4ODczRSwgMHg4NzcxLCAweDg3ODgsIDB4ODc5OSwgMHg4N0FDLCAweDg3QUQsIDB4ODdCNSwgMHg4N0Q2LAotICAgIDB4ODdFQiwgMHg4N0VELCAweDg4MDEsIDB4ODgwMywgMHg4ODA2LCAweDg4MEIsIDB4ODgxNCwgMHg4ODFDLAotICAgIDB4ODg1NiwgMHg4ODVGLCAweDg4NjQsIDB4ODg5OCwgMHg4OEFBLCAweDg4QkQsIDB4ODhCRSwgMHg4OENBLAotICAgIDB4ODhEMiwgMHg4OERCLCAweDg4RjAsIDB4ODhGMSwgMHg4OTA2LCAweDg5MTgsIDB4ODkxOSwgMHg4OTFBLAotICAgIDB4ODkyNywgMHg4OTMwLCAweDg5M0UsIDB4ODk3QiwgMHg4OUQ0LCAweDg5RDYsIDB4ODlFNSwgMHg4OUYxLAotICAgIDB4OEEwNywgMHg4QTBGLCAweDhBMTUsIDB4OEEyMiwgMHg4QTRFLCAweDhBN0YsIDB4OEFGNCwgMHg4QjFGLAotICAgIDB4OEIzNywgMHg4QjQzLCAweDhCNDQsIDB4OEI1NCwgMHg4QjlDLCAweDhCOUUsIDB4OEM0NywgMHg4QzU0LAotICAgIDB4OEM3MywgMHg4Q0E0LCAweDhDRDksIDB4OENFMSwgMHg4Q0Y4LCAweDhDRkUsIDB4OEQxQiwgMHg4RDY5LAotICAgIDB4OEQ2QywgMHg4RDg0LCAweDhEOEQsIDB4OEQ5NSwgMHg4REE2LCAweDhEQzYsIDB4OERDRSwgMHg4REU0LAotICAgIDB4OERFQywgMHg4RTIwLCAweDhFNEIsIDB4OEU2QywgMHg4RTcwLCAweDhFN0EsIDB4OEU5MiwgMHg4RUFFLAotICAgIDB4OEVCMywgMHg4RUQxLCAweDhFRDQsIDB4OEVGOSwgMHg4RjE3LCAweDhGMzYsIDB4OEZBNiwgMHg4RkI1LAotICAgIDB4OEZCNiwgMHg4RkM2LCAweDhGRTAsIDB4OEZFNCwgMHg4RkY2LCAweDkwMDIsIDB4OTAyQywgMHg5MDQ0LAotICAgIDB4OTA4OCwgMHg5MDk1LCAweDkwOTksIDB4OTA5QiwgMHg5MEEyLCAweDkwQjQsIDB4OTBENywgMHg5MERELAotICAgIDB4OTBGNCwgMHg5MTE3LCAweDkxMUMsIDB4OTEzMSwgMHg5MTNBLCAweDkxM0QsIDB4OTE0OCwgMHg5MTVCLAotICAgIDB4OTE2MSwgMHg5MTY0LCAweDkxOEUsIDB4OTE5RSwgMHg5MUE4LCAweDkxQUQsIDB4OTFBRSwgMHg5MUIyLAotICAgIDB4OTFCQywgMHg5MUYwLCAweDkxRjcsIDB4OTFGQiwgMHg5MjA3LCAweDkyMjgsIDB4OTIzMywgMHg5MjM4LAotICAgIDB4OTI0MywgMHg5MjQ3LCAweDkyNEYsIDB4OTI2MCwgMHg5MkMyLCAweDkyQ0IsIDB4OTJDQywgMHg5MkRGLAotICAgIDB4OTMwRCwgMHg5MzE1LCAweDkzMUYsIDB4OTMyNywgMHg5MzQ3LCAweDkzNTIsIDB4OTM2NSwgMHg5MzZBLAotICAgIDB4OTM2RCwgMHg5MzlCLCAweDkzQkEsIDB4OTNBOSwgMHg5M0MxLCAweDkzQ0EsIDB4OTNFMiwgMHg5M0ZBLAotICAgIDB4OTNGRCwgMHg5NDBGLCAweDk0MzQsIDB4OTQzRiwgMHg5NDU1LCAweDk0NkIsIDB4OTQ3MiwgMHg5NTc4LAotICAgIDB4OTVBNiwgMHg5NUE5LCAweDk1QUIsIDB4OTVCNCwgMHg5NUJELCAweDk1REEsIDB4OTYxRCwgMHg5NjQxLAotICAgIDB4OTY1OCwgMHg5Njg0LCAweDk2QTQsIDB4OTZBOSwgMHg5NkQyLCAweDVEQjIsIDB4OTZERSwgMHg5NkU5LAotICAgIDB4OTZGMSwgMHg5NzAyLCAweDk3MDksIDB4OTc1QSwgMHg5NzYzLCAweDk3NkUsIDB4OTc3MywgMHg5NzlBLAotICAgIDB4OTdBMiwgMHg5N0I1LCAweDk3QjYsIDB4OTdEOSwgMHg5N0RFLCAweDk3RjQsIDB4OTgwQSwgMHg5ODBFLAotICAgIDB4OTgxRSwgMHg5ODIzLCAweDk4MkIsIDB4OTgzRSwgMHg5ODUyLCAweDk4NTMsIDB4OTg1OSwgMHg5ODZDLAotICAgIDB4OThCOCwgMHg5OEJBLCAweDk4QkYsIDB4OThDOCwgMHg5OEU1LCAweDk5MzIsIDB4OTkzMywgMHg5OTQwLAotICAgIDB4OTk0RCwgMHg5OTVDLCAweDk5NUYsIDB4OTlCMSwgMHg5OUI5LCAweDk5QkEsIDB4OTlDOSwgMHg5QTAyLAotICAgIDB4OUExNiwgMHg5QTI0LCAweDlBMjcsIDB4OUEyRCwgMHg5QTJFLCAweDlBMzYsIDB4OUEzOCwgMHg5QTRBLAotICAgIDB4OUE1NiwgMHg5QUI1LCAweDlBQjYsIDB4OUFGOSwgMHg5QjAzLCAweDlCMjAsIDB4OUIzMywgMHg5QjM0LAotICAgIDB4OUI3MywgMHg5Qjc5LCAweDlCQTcsIDB4OUJDMSwgMHg5QkM3LCAweDlCRDcsIDB4OUJFNywgMHg5QkVCLAotICAgIDB4OUJGNywgMHg5QkZBLCAweDlCRkQsIDB4OUMwQiwgMHg5QzI3LCAweDlDMkEsIDB4OUMzNiwgMHg5QzQxLAotICAgIDB4OUM1MywgMHg5QzYzLCAweDlDNkEsIDB4OUM3NywgMHg5RDAyLCAweDlENDIsIDB4OUQ0NywgMHg5RDYzLAotICAgIDB4OUQ2OSwgMHg5RDdDLCAweDlEN0UsIDB4OUQ4RCwgMHg5REIxLCAweDlEQzMsIDB4OURDNywgMHg5REQ2LAotICAgIDB4OURERiwgMHg5REVCLCAweDlERjQsIDB4OUUxNSwgMHg5RTFELCAweDlFQTQsIDB4OUVBOCwgMHg5RUFDLAotICAgIDB4OUVFNywgMHg5RUVFLCAweDlGMTAsIDB4OUYxMiwgMHg5RjE3LCAweDlGMTksIDB4OUYyRiwgMHg5RjM3LAotICAgIDB4OUYzOSwgMHg5RjQxLCAweDlGNDUsIDB4OUY1NywgMHg5RjY4LCAweDlGNzEsIDB4OUY3NSwgMHg5RjkwLAotICAgIDB4OUY5NCwgMHg5RkEyLCAweDRFMzAsIDB4MzQwNSwgMHg0RjYwLCAweDU2MjAsIDB4NUVDQiwgMHgyRTk1LAotICAgIDB4NjBBNCwgMHg2OUQ3LCAweDZCMjQsIDB4NkZGOSwgMHg2RUU2LCAweDcxQjMsIDB4MkVBNCwgMHg3QUM2LAotICAgIDB4N0Y2MSwgMHg4MDcxLCAweDgwOUUsIDB4MkVDQywgMHg5MUYwLCAweDVEQjIsIDB4OTdERSwgMHg0RkQzLAotICAgIDB4NTBEOSwgMHg1MEYwLCAweDUxQzMsIDB4NTY3NiwgMHg2QTU0LCAweDZEMDEsIDB4NkREMCwgMHg2RTQyLAotICAgIDB4NkVEOSwgMHg3M0U0LCAweDc0MjEsIDB4NzU2QywgMHg3ODUxLCAweDg3RjUsIDB4RkZGRCwgMHg3M0E4LAotICAgIDB4M0FGMywgMHgzNERCLCAweDQ0MEMsIDB4M0U4QSwgMHhGRkZELCAweEZGRkQsIDB4NEJFOCwgMHhGRkZELAotICAgIDB4M0VEQSwgMHgzQjIyLCAweEZGRkQsIDB4NDU3QSwgMHg0MDkzLCAweEZGRkQsIDB4NDY2NSwgMHg0MTAzLAotICAgIDB4NDI5MywgMHg0NkFFLCAweDM0ODgsIDB4RkZGRCwKKyAgICAweEZGRkQsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLCAweDAwMzAsCisgICAgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwKKyAgICAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLCAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLAorICAgIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsCisgICAgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwKKyAgICAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDBBNSwgMHgwMDVELAorICAgIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsCisgICAgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LAorICAgIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDBBNiwgMHgwMDdELCAweDAzMDMsIDB4MDJCQywgMHgwMDVDLCAweDAyQkIsCisgICAgMHgwMDdDLCAweDAwN0UsIDB4MDBBMSwgMHgwMEEyLCAweDAwQTMsIDB4MjA0NCwgMHgwMTkyLCAweDAwQTcsIDB4MDBBNCwKKyAgICAweDIwMUMsIDB4MDBBQiwgMHgyMDM5LCAweDIwM0EsIDB4RkIwMSwgMHhGQjAyLCAweDIwMTIsIDB4MjAyMCwgMHgyMDIxLAorICAgIDB4MDBCNywgMHgwMEI2LCAweDIwMjIsIDB4MjAxQSwgMHgyMDFFLCAweDIwMUQsIDB4MDBCQiwgMHgyMDI2LCAweDIwMzAsCisgICAgMHgwMEJGLCAweDAzMDEsIDB4MDMwMiwgMHgwMEFGLCAweDAzMDYsIDB4MDMwNywgMHgwMzA4LCAweDAzMEEsIDB4MDBCOCwKKyAgICAweDAzMEIsIDB4MDMyOCwgMHgwMzBDLCAweDAzMzYsIDB4MDBDNiwgMHgwMEFBLCAweDAxNDEsIDB4MDBEOCwgMHgwMTUyLAorICAgIDB4MDBCQSwgMHgwMEU2LCAweDAxMzEsIDB4MDE0MiwgMHgwMEY4LCAweDAxNTMsIDB4MDBERiwgMHgwMDJELCAweDAwQTksCisgICAgMHgwMEFDLCAweDAwQUUsIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI1LCAweDAwQjksIDB4MDBCQywKKyAgICAweDAwQkQsIDB4MDBCRSwgMHgwMEMwLCAweDAwQzEsIDB4MDBDMiwgMHgwMEMzLCAweDAwQzQsIDB4MDBDNSwgMHgwMEM3LAorICAgIDB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLCAweDAwQ0QsIDB4MDBDRSwgMHgwMENGLCAweDAwRDAsCisgICAgMHgwMEQxLCAweDAwRDIsIDB4MDBEMywgMHgwMEQ0LCAweDAwRDUsIDB4MDBENiwgMHgwMEQ3LCAweDAwRDksIDB4MDBEQSwKKyAgICAweDAwREIsIDB4MDBEQywgMHgwMERELCAweDAwREUsIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LAorICAgIDB4MDBFNSwgMHgwMEU3LCAweDAwRTgsIDB4MDBFOSwgMHgwMEVBLCAweDAwRUIsIDB4MDBFQywgMHgwMEVELCAweDAwRUUsCisgICAgMHgwMEVGLCAweDAwRjAsIDB4MDBGMSwgMHgwMEYyLCAweDAwRjMsIDB4MDBGNCwgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywKKyAgICAweDAwRjksIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsIDB4MDE2MCwgMHgwMTc4LAorICAgIDB4MDE3RCwgMHgwMzA1LCAweDAxNjEsIDB4MjEyMiwgMHgwMTdFLCAweDAwMzAsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsCisgICAgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwKKyAgICAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LAorICAgIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsCisgICAgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwKKyAgICAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLAorICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsCisgICAgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMEE1LCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwKKyAgICAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLAorICAgIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisgICAgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywKKyAgICAweDAwN0QsIDB4MjAzRSwgMHhGRjYwLCAweEZGNjEsIDB4RkY2MiwgMHhGRjYzLCAweEZGNjQsIDB4RkY2NSwgMHhGRjY2LAorICAgIDB4RkY2NywgMHhGRjY4LCAweEZGNjksIDB4RkY2QSwgMHhGRjZCLCAweEZGNkMsIDB4RkY2RCwgMHhGRjZFLCAweEZGNkYsCisgICAgMHhGRjcwLCAweEZGNzEsIDB4RkY3MiwgMHhGRjczLCAweEZGNzQsIDB4RkY3NSwgMHhGRjc2LCAweEZGNzcsIDB4RkY3OCwKKyAgICAweEZGNzksIDB4RkY3QSwgMHhGRjdCLCAweEZGN0MsIDB4RkY3RCwgMHhGRjdFLCAweEZGN0YsIDB4RkY4MCwgMHhGRjgxLAorICAgIDB4RkY4MiwgMHhGRjgzLCAweEZGODQsIDB4RkY4NSwgMHhGRjg2LCAweEZGODcsIDB4RkY4OCwgMHhGRjg5LCAweEZGOEEsCisgICAgMHhGRjhCLCAweEZGOEMsIDB4RkY4RCwgMHhGRjhFLCAweEZGOEYsIDB4RkY5MCwgMHhGRjkxLCAweEZGOTIsIDB4RkY5MywKKyAgICAweEZGOTQsIDB4RkY5NSwgMHhGRjk2LCAweEZGOTcsIDB4RkY5OCwgMHhGRjk5LCAweEZGOUEsIDB4RkY5QiwgMHhGRjlDLAorICAgIDB4RkY5RCwgMHhGRjlFLCAweEZGOUYsIDB4RkY0MCwgMHgzMEYwLCAweDMwRjEsIDB4MzBFRSwgMHgzMEFCLCAweDMwQjEsCisgICAgMHgzMEY0LCAweDMwQUMsIDB4MzBBRSwgMHgzMEIwLCAweDMwQjIsIDB4MzBCNCwgMHgzMEI2LCAweDMwQjgsIDB4MzBCQSwKKyAgICAweDMwQkMsIDB4MzBCRSwgMHgzMEMwLCAweDMwQzIsIDB4MzBDNSwgMHgzMEM3LCAweDMwQzksIDB4MzBEMCwgMHgzMEQxLAorICAgIDB4MzBEMywgMHgzMEQ0LCAweDMwRDYsIDB4MzBENywgMHgzMEQ5LCAweDMwREEsIDB4MzBEQywgMHgzMERELCAweEZGNjAsCisgICAgMHgzMDFELCAweDMwMUUsIDB4MjUwMCwgMHgyNTAxLCAweDI1MDIsIDB4MjUwMywgMHgyNTA0LCAweDI1MDUsIDB4MjUwNiwKKyAgICAweDI1MDcsIDB4MjUwOCwgMHgyNTA5LCAweDI1MEEsIDB4MjUwQiwgMHgyNTBDLCAweDI1MEQsIDB4MjUwRSwgMHgyNTBGLAorICAgIDB4MjUxMCwgMHgyNTExLCAweDI1MTIsIDB4MjUxMywgMHgyNTE0LCAweDI1MTUsIDB4MjUxNiwgMHgyNTE3LCAweDI1MTgsCisgICAgMHgyNTE5LCAweDI1MUEsIDB4MjUxQiwgMHgyNTFDLCAweDI1MUQsIDB4MjUxRSwgMHgyNTFGLCAweDI1MjAsIDB4MjUyMSwKKyAgICAweDI1MjIsIDB4MjUyMywgMHgyNTI0LCAweDI1MjUsIDB4MjUyNiwgMHgyNTI3LCAweDI1MjgsIDB4MjUyOSwgMHgyNTJBLAorICAgIDB4MjUyQiwgMHgyNTJDLCAweDI1MkQsIDB4MjUyRSwgMHgyNTJGLCAweDI1MzAsIDB4MjUzMSwgMHgyNTMyLCAweDI1MzMsCisgICAgMHgyNTM0LCAweDI1MzUsIDB4MjUzNiwgMHgyNTM3LCAweDI1MzgsIDB4MjUzOSwgMHgyNTNBLCAweDI1M0IsIDB4MjUzQywKKyAgICAweDI1M0QsIDB4MjUzRSwgMHgyNTNGLCAweDI1NDAsIDB4MjU0MSwgMHgyNTQyLCAweDI1NDMsIDB4MjU0NCwgMHgyNTQ1LAorICAgIDB4MjU0NiwgMHgyNTQ3LCAweDI1NDgsIDB4MjU0OSwgMHgyNTRBLCAweDI1NEIsIDB4MjAzMiwgMHgwMEE4LCAweDIwMzYsCisgICAgMHgwMDVCLCAweDAwNUQsIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwgMHgzMDBFLCAweDMwMEYsIDB4MzAxMCwKKyAgICAweDMwMTEsIDB4MjAxMiwgMHhGRjYwLCAweDMwOTIsIDB4MzA0MSwgMHgzMDQzLCAweDMwNDUsIDB4MzA0NywgMHgzMDQ5LAorICAgIDB4MzA4MywgMHgzMDg1LCAweDMwODcsIDB4MzA2MywgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsCisgICAgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwKKyAgICAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLCAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLAorICAgIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsCisgICAgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwKKyAgICAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLCAweDMwOTMsIDB4MzA5MCwgMHgzMDkxLCAweDMwOEUsIDB4MzA0QywgMHgzMDRFLAorICAgIDB4MzA1MCwgMHgzMDUyLCAweDMwNTQsIDB4MzA1NiwgMHgzMDY4LCAweDMwNUEsIDB4MzA1QywgMHgzMDVFLCAweDMwNjAsCisgICAgMHgzMDYyLCAweDMwNjUsIDB4MzA2NywgMHgzMDY5LCAweDMwNzAsIDB4MzA3MSwgMHgzMDczLCAweDMwNzQsIDB4MzA3NiwKKyAgICAweDMwNzcsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0MsIDB4MzA3RCwgMHgwMEM0LCAweDAwRjksIDB4MDBFOSwgMHgwMEVELAorICAgIDB4MDBERiwgMHgwMEU3LCAweDAwQzcsIDB4MDBEMSwgMHgwMEYxLCAweDAwQTIsIDB4MDBBMywgMHgwMEYzLCAweDAwRkEsCisgICAgMHgwMEExLCAweDAwQkYsIDB4MDBCRCwgMHgwMEQ2LCAweDAwREMsIDB4MDBFNCwgMHgwMEVCLCAweDAwRUYsIDB4MDBGNiwKKyAgICAweDAwREMsIDB4MDBFMiwgMHgwMEVBLCAweDAwRUUsIDB4MDBGNCwgMHgwMEZDLCAweDAwRTAsIDB4MDBFOSwgMHgyNUIyLAorICAgIDB4MDBFMSwgMHgwMDdFLCAweDAwMzAsIDB4MzAwMCwgMHgzMDAxLCAweDMwMDIsIDB4RkYwQywgMHhGRjBFLCAweDMwRkIsCisgICAgMHhGRjFBLCAweEZGMUIsIDB4RkYxRiwgMHhGRjAxLCAweDMwOUIsIDB4MzA5QywgMHgwMEI0LCAweEZGNDAsIDB4MDBBOCwKKyAgICAweEZGM0UsIDB4MjAzRSwgMHhGRjNGLCAweDMwRkQsIDB4MzBGRSwgMHgzMDlELCAweDMwOUUsIDB4MzAwMywgMHg0RURELAorICAgIDB4MzAwNSwgMHgzMDA2LCAweDMwMDcsIDB4MzBGQywgMHgyMDE1LCAweDIwMTAsIDB4RkYwRiwgMHhGRjNDLCAweEZGNUUsCisgICAgMHgyMDE2LCAweEZGNUMsIDB4MjAyNiwgMHgyMDI1LCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4RkYwOCwKKyAgICAweEZGMDksIDB4MzAxNCwgMHgzMDE1LCAweEZGM0IsIDB4RkYzRCwgMHhGRjVCLCAweEZGNUQsIDB4MzAwOCwgMHgzMDA5LAorICAgIDB4MzAwQSwgMHgzMDBCLCAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MzAxMCwgMHgzMDExLCAweEZGMEIsCisgICAgMHhGRjBELCAweDAwQjEsIDB4MDBENywgMHgwMEY3LCAweEZGMUQsIDB4MjI2MCwgMHhGRjFDLCAweEZGMUUsIDB4MjI2NiwKKyAgICAweDIyNjcsIDB4MjIxRSwgMHgyMjM0LCAweDI2NDIsIDB4MjY0MCwgMHgwMEIwLCAweDIwMzIsIDB4MjAzMywgMHgyMTAzLAorICAgIDB4RkZFNSwgMHhGRjA0LCAweDAwQTIsIDB4MDBBMywgMHhGRjA1LCAweEZGMDMsIDB4RkYwNiwgMHhGRjBBLCAweEZGMjAsCisgICAgMHgwMEE3LCAweDI2MDYsIDB4MjYwNSwgMHgyNUNCLCAweDI1Q0YsIDB4MjVDRSwgMHgyNUM3LCAweDI1QzYsIDB4MjVBMSwKKyAgICAweDI1QTAsIDB4MjVCMywgMHgyNUIyLCAweDI1QkQsIDB4MjVCQywgMHgyMDNCLCAweDMwMTIsIDB4MjE5MiwgMHgyMTkwLAorICAgIDB4MjE5MSwgMHgyMTkzLCAweDMwMTMsIDB4MjIwOCwgMHgyMjBCLCAweDIyODYsIDB4MjI4NywgMHgyMjgyLCAweDIyODMsCisgICAgMHgyMjJBLCAweDIyMjksIDB4MjIyNywgMHgyMjI4LCAweDAwQUMsIDB4MjFEMiwgMHgyMUQ0LCAweDIyMDAsIDB4MjIwMywKKyAgICAweDIyMjAsIDB4MjJBNSwgMHgyMzEyLCAweDIyMDIsIDB4MjIwNywgMHgyMjYxLCAweDIyNTIsIDB4MjI2QSwgMHgyMjZCLAorICAgIDB4MjIxQSwgMHgyMjNELCAweDIyMUQsIDB4MjIzNSwgMHgyMjJCLCAweDIyMkMsIDB4MjEyQiwgMHgyMDMwLCAweDI2NkYsCisgICAgMHgyNjZELCAweDI2NkEsIDB4MjAyMCwgMHgyMDIxLCAweDAwQjYsIDB4MjVFRiwgMHhGRjEwLCAweEZGMTEsIDB4RkYxMiwKKyAgICAweEZGMTMsIDB4RkYxNCwgMHhGRjE1LCAweEZGMTYsIDB4RkYxNywgMHhGRjE4LCAweEZGMTksIDB4RkYyMSwgMHhGRjIyLAorICAgIDB4RkYyMywgMHhGRjI0LCAweEZGMjUsIDB4RkYyNiwgMHhGRjI3LCAweEZGMjgsIDB4RkYyOSwgMHhGRjJBLCAweEZGMkIsCisgICAgMHhGRjJDLCAweEZGMkQsIDB4RkYyRSwgMHhGRjJGLCAweEZGMzAsIDB4RkYzMSwgMHhGRjMyLCAweEZGMzMsIDB4RkYzNCwKKyAgICAweEZGMzUsIDB4RkYzNiwgMHhGRjM3LCAweEZGMzgsIDB4RkYzOSwgMHhGRjNBLCAweEZGNDEsIDB4RkY0MiwgMHhGRjQzLAorICAgIDB4RkY0NCwgMHhGRjQ1LCAweEZGNDYsIDB4RkY0NywgMHhGRjQ4LCAweEZGNDksIDB4RkY0QSwgMHhGRjRCLCAweEZGNEMsCisgICAgMHhGRjRELCAweEZGNEUsIDB4RkY0RiwgMHhGRjUwLCAweEZGNTEsIDB4RkY1MiwgMHhGRjUzLCAweEZGNTQsIDB4RkY1NSwKKyAgICAweEZGNTYsIDB4RkY1NywgMHhGRjU4LCAweEZGNTksIDB4RkY1QSwgMHgzMDQxLCAweDMwNDIsIDB4MzA0MywgMHgzMDQ0LAorICAgIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsIDB4MzA0OCwgMHgzMDQ5LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRDLCAweDMwNEQsCisgICAgMHgzMDRFLCAweDMwNEYsIDB4MzA1MCwgMHgzMDUxLCAweDMwNTIsIDB4MzA1MywgMHgzMDU0LCAweDMwNTUsIDB4MzA1NiwKKyAgICAweDMwNTcsIDB4MzA1OCwgMHgzMDU5LCAweDMwNUEsIDB4MzA1QiwgMHgzMDVDLCAweDMwNUQsIDB4MzA1RSwgMHgzMDVGLAorICAgIDB4MzA2MCwgMHgzMDYxLCAweDMwNjIsIDB4MzA2MywgMHgzMDY0LCAweDMwNjUsIDB4MzA2NiwgMHgzMDY3LCAweDMwNjgsCisgICAgMHgzMDY5LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLCAweDMwNzAsIDB4MzA3MSwKKyAgICAweDMwNzIsIDB4MzA3MywgMHgzMDc0LCAweDMwNzUsIDB4MzA3NiwgMHgzMDc3LCAweDMwNzgsIDB4MzA3OSwgMHgzMDdBLAorICAgIDB4MzA3QiwgMHgzMDdDLCAweDMwN0QsIDB4MzA3RSwgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODMsCisgICAgMHgzMDg0LCAweDMwODUsIDB4MzA4NiwgMHgzMDg3LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLCAweDMwOEIsIDB4MzA4QywKKyAgICAweDMwOEQsIDB4MzA4RSwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMSwgMHgzMEEyLAorICAgIDB4MzBBMywgMHgzMEE0LCAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LCAweDMwQTgsIDB4MzBBOSwgMHgzMEFBLCAweDMwQUIsCisgICAgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsIDB4MzBCMSwgMHgzMEIyLCAweDMwQjMsIDB4MzBCNCwKKyAgICAweDMwQjUsIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwgMHgzMEJBLCAweDMwQkIsIDB4MzBCQywgMHgzMEJELAorICAgIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLCAweDMwQzMsIDB4MzBDNCwgMHgzMEM1LCAweDMwQzYsCisgICAgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwKKyAgICAweDMwRDAsIDB4MzBEMSwgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwgMHgzMEQ1LCAweDMwRDYsIDB4MzBENywgMHgzMEQ4LAorICAgIDB4MzBEOSwgMHgzMERBLCAweDMwREIsIDB4MzBEQywgMHgzMERELCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsCisgICAgMHgzMEUyLCAweDMwRTMsIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsIDB4MzBFNywgMHgzMEU4LCAweDMwRTksIDB4MzBFQSwKKyAgICAweDMwRUIsIDB4MzBFQywgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLAorICAgIDB4MzBGNCwgMHgzMEY1LCAweDMwRjYsIDB4MDM5MSwgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwgMHgwMzk1LCAweDAzOTYsCisgICAgMHgwMzk3LCAweDAzOTgsIDB4MDM5OSwgMHgwMzlBLCAweDAzOUIsIDB4MDM5QywgMHgwMzlELCAweDAzOUUsIDB4MDM5RiwKKyAgICAweDAzQTAsIDB4MDNBMSwgMHgwM0EzLCAweDAzQTQsIDB4MDNBNSwgMHgwM0E2LCAweDAzQTcsIDB4MDNBOCwgMHgwM0E5LAorICAgIDB4MDNCMSwgMHgwM0IyLCAweDAzQjMsIDB4MDNCNCwgMHgwM0I1LCAweDAzQjYsIDB4MDNCNywgMHgwM0I4LCAweDAzQjksCisgICAgMHgwM0JBLCAweDAzQkIsIDB4MDNCQywgMHgwM0JELCAweDAzQkUsIDB4MDNCRiwgMHgwM0MwLCAweDAzQzEsIDB4MDNDMywKKyAgICAweDAzQzQsIDB4MDNDNSwgMHgwM0M2LCAweDAzQzcsIDB4MDNDOCwgMHgwM0M5LCAweDA0MTAsIDB4MDQxMSwgMHgwNDEyLAorICAgIDB4MDQxMywgMHgwNDE0LCAweDA0MTUsIDB4MDQwMSwgMHgwNDE2LCAweDA0MTcsIDB4MDQxOCwgMHgwNDE5LCAweDA0MUEsCisgICAgMHgwNDFCLCAweDA0MUMsIDB4MDQxRCwgMHgwNDFFLCAweDA0MUYsIDB4MDQyMCwgMHgwNDIxLCAweDA0MjIsIDB4MDQyMywKKyAgICAweDA0MjQsIDB4MDQyNSwgMHgwNDI2LCAweDA0MjcsIDB4MDQyOCwgMHgwNDI5LCAweDA0MkEsIDB4MDQyQiwgMHgwNDJDLAorICAgIDB4MDQyRCwgMHgwNDJFLCAweDA0MkYsIDB4MDQzMCwgMHgwNDMxLCAweDA0MzIsIDB4MDQzMywgMHgwNDM0LCAweDA0MzUsCisgICAgMHgwNDUxLCAweDA0MzYsIDB4MDQzNywgMHgwNDM4LCAweDA0MzksIDB4MDQzQSwgMHgwNDNCLCAweDA0M0MsIDB4MDQzRCwKKyAgICAweDA0M0UsIDB4MDQzRiwgMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LAorICAgIDB4MDQ0NywgMHgwNDQ4LCAweDA0NDksIDB4MDQ0QSwgMHgwNDRCLCAweDA0NEMsIDB4MDQ0RCwgMHgwNDRFLCAweDA0NEYsCisgICAgMHg0RTlDLCAweDU1MTYsIDB4NUEwMywgMHg5NjNGLCAweDU0QzAsIDB4NjExQiwgMHg2MzI4LCAweDU5RjYsIDB4OTAyMiwKKyAgICAweDg0NzUsIDB4ODMxQywgMHg3QTUwLCAweDYwQUEsIDB4NjNFMSwgMHg2RTI1LCAweDY1RUQsIDB4ODQ2NiwgMHg4MkE2LAorICAgIDB4OUJGNSwgMHg2ODkzLCAweDU3MjcsIDB4NjVBMSwgMHg2MjcxLCAweDVCOUIsIDB4NTlEMCwgMHg4NjdCLCAweDk4RjQsCisgICAgMHg3RDYyLCAweDdEQkUsIDB4OUI4RSwgMHg2MjE2LCAweDdDOUYsIDB4ODhCNywgMHg1Qjg5LCAweDVFQjUsIDB4NjMwOSwKKyAgICAweDY2OTcsIDB4Njg0OCwgMHg5NUM3LCAweDk3OEQsIDB4Njc0RiwgMHg0RUU1LCAweDRGMEEsIDB4NEY0RCwgMHg0RjlELAorICAgIDB4NTA0OSwgMHg1NkYyLCAweDU5MzcsIDB4NTlENCwgMHg1QTAxLCAweDVDMDksIDB4NjBERiwgMHg2MTBGLCAweDYxNzAsCisgICAgMHg2NjEzLCAweDY5MDUsIDB4NzBCQSwgMHg3NTRGLCAweDc1NzAsIDB4NzlGQiwgMHg3REFELCAweDdERUYsIDB4ODBDMywKKyAgICAweDg0MEUsIDB4ODg2MywgMHg4QjAyLCAweDkwNTUsIDB4OTA3QSwgMHg1MzNCLCAweDRFOTUsIDB4NEVBNSwgMHg1N0RGLAorICAgIDB4ODBCMiwgMHg5MEMxLCAweDc4RUYsIDB4NEUwMCwgMHg1OEYxLCAweDZFQTIsIDB4OTAzOCwgMHg3QTMyLCAweDgzMjgsCisgICAgMHg4MjhCLCAweDlDMkYsIDB4NTE0MSwgMHg1MzcwLCAweDU0QkQsIDB4NTRFMSwgMHg1NkUwLCAweDU5RkIsIDB4NUYxNSwKKyAgICAweDk4RjIsIDB4NkRFQiwgMHg4MEU0LCAweDg1MkQsIDB4OTY2MiwgMHg5NjcwLCAweDk2QTAsIDB4OTdGQiwgMHg1NDBCLAorICAgIDB4NTNGMywgMHg1Qjg3LCAweDcwQ0YsIDB4N0ZCRCwgMHg4RkMyLCAweDk2RTgsIDB4NTM2RiwgMHg5RDVDLCAweDdBQkEsCisgICAgMHg0RTExLCAweDc4OTMsIDB4ODFGQywgMHg2RTI2LCAweDU2MTgsIDB4NTUwNCwgMHg2QjFELCAweDg1MUEsIDB4OUMzQiwKKyAgICAweDU5RTUsIDB4NTNBOSwgMHg2RDY2LCAweDc0REMsIDB4OTU4RiwgMHg1NjQyLCAweDRFOTEsIDB4OTA0QiwgMHg5NkYyLAorICAgIDB4ODM0RiwgMHg5OTBDLCAweDUzRTEsIDB4NTVCNiwgMHg1QjMwLCAweDVGNzEsIDB4NjYyMCwgMHg2NkYzLCAweDY4MDQsCisgICAgMHg2QzM4LCAweDZDRjMsIDB4NkQyOSwgMHg3NDVCLCAweDc2QzgsIDB4N0E0RSwgMHg5ODM0LCAweDgyRjEsIDB4ODg1QiwKKyAgICAweDhBNjAsIDB4OTJFRCwgMHg2REIyLCAweDc1QUIsIDB4NzZDQSwgMHg5OUM1LCAweDYwQTYsIDB4OEIwMSwgMHg4RDhBLAorICAgIDB4OTVCMiwgMHg2OThFLCAweDUzQUQsIDB4NTE4NiwgMHg1NzEyLCAweDU4MzAsIDB4NTk0NCwgMHg1QkI0LCAweDVFRjYsCisgICAgMHg2MDI4LCAweDYzQTksIDB4NjNGNCwgMHg2Q0JGLCAweDZGMTQsIDB4NzA4RSwgMHg3MTE0LCAweDcxNTksIDB4NzFENSwKKyAgICAweDczM0YsIDB4N0UwMSwgMHg4Mjc2LCAweDgyRDEsIDB4ODU5NywgMHg5MDYwLCAweDkyNUIsIDB4OUQxQiwgMHg1ODY5LAorICAgIDB4NjVCQywgMHg2QzVBLCAweDc1MjUsIDB4NTFGOSwgMHg1OTJFLCAweDU5NjUsIDB4NUY4MCwgMHg1RkRDLCAweDYyQkMsCisgICAgMHg2NUZBLCAweDZBMkEsIDB4NkIyNywgMHg2QkI0LCAweDczOEIsIDB4N0ZDMSwgMHg4OTU2LCAweDlEMkMsIDB4OUQwRSwKKyAgICAweDlFQzQsIDB4NUNBMSwgMHg2Qzk2LCAweDgzN0IsIDB4NTEwNCwgMHg1QzRCLCAweDYxQjYsIDB4ODFDNiwgMHg2ODc2LAorICAgIDB4NzI2MSwgMHg0RTU5LCAweDRGRkEsIDB4NTM3OCwgMHg2MDY5LCAweDZFMjksIDB4N0E0RiwgMHg5N0YzLCAweDRFMEIsCisgICAgMHg1MzE2LCAweDRFRUUsIDB4NEY1NSwgMHg0RjNELCAweDRGQTEsIDB4NEY3MywgMHg1MkEwLCAweDUzRUYsIDB4NTYwOSwKKyAgICAweDU5MEYsIDB4NUFDMSwgMHg1QkI2LCAweDVCRTEsIDB4NzlEMSwgMHg2Njg3LCAweDY3OUMsIDB4NjdCNiwgMHg2QjRDLAorICAgIDB4NkNCMywgMHg3MDZCLCAweDczQzIsIDB4Nzk4RCwgMHg3OUJFLCAweDdBM0MsIDB4N0I4NywgMHg4MkIxLCAweDgyREIsCisgICAgMHg4MzA0LCAweDgzNzcsIDB4ODNFRiwgMHg4M0QzLCAweDg3NjYsIDB4OEFCMiwgMHg1NjI5LCAweDhDQTgsIDB4OEZFNiwKKyAgICAweDkwNEUsIDB4OTcxRSwgMHg4NjhBLCAweDRGQzQsIDB4NUNFOCwgMHg2MjExLCAweDcyNTksIDB4NzUzQiwgMHg4MUU1LAorICAgIDB4ODJCRCwgMHg4NkZFLCAweDhDQzAsIDB4OTZDNSwgMHg5OTEzLCAweDk5RDUsIDB4NEVDQiwgMHg0RjFBLCAweDg5RTMsCisgICAgMHg1NkRFLCAweDU4NEEsIDB4NThDQSwgMHg1RUZCLCAweDVGRUIsIDB4NjAyQSwgMHg2MDk0LCAweDYwNjIsIDB4NjFEMCwKKyAgICAweDYyMTIsIDB4NjJEMCwgMHg2NTM5LCAweDlCNDEsIDB4NjY2NiwgMHg2OEIwLCAweDZENzcsIDB4NzA3MCwgMHg3NTRDLAorICAgIDB4NzY4NiwgMHg3RDc1LCAweDgyQTUsIDB4ODdGOSwgMHg5NThCLCAweDk2OEUsIDB4OEM5RCwgMHg1MUYxLCAweDUyQkUsCisgICAgMHg1OTE2LCAweDU0QjMsIDB4NUJCMywgMHg1RDE2LCAweDYxNjgsIDB4Njk4MiwgMHg2REFGLCAweDc4OEQsIDB4ODRDQiwKKyAgICAweDg4NTcsIDB4OEE3MiwgMHg5M0E3LCAweDlBQjgsIDB4NkQ2QywgMHg5OUE4LCAweDg2RDksIDB4NTdBMywgMHg2N0ZGLAorICAgIDB4ODZDRSwgMHg5MjBFLCAweDUyODMsIDB4NTY4NywgMHg1NDA0LCAweDVFRDMsIDB4NjJFMSwgMHg2NEI5LCAweDY4M0MsCisgICAgMHg2ODM4LCAweDZCQkIsIDB4NzM3MiwgMHg3OEJBLCAweDdBNkIsIDB4ODk5QSwgMHg4OUQyLCAweDhENkIsIDB4OEYwMywKKyAgICAweDkwRUQsIDB4OTVBMywgMHg5Njk0LCAweDk3NjksIDB4NUI2NiwgMHg1Q0IzLCAweDY5N0QsIDB4OTg0RCwgMHg5ODRFLAorICAgIDB4NjM5QiwgMHg3QjIwLCAweDZBMkIsIDB4NkE3RiwgMHg2OEI2LCAweDlDMEQsIDB4NkY1RiwgMHg1MjcyLCAweDU1OUQsCisgICAgMHg2MDcwLCAweDYyRUMsIDB4NkQzQiwgMHg2RTA3LCAweDZFRDEsIDB4ODQ1QiwgMHg4OTEwLCAweDhGNDQsIDB4NEUxNCwKKyAgICAweDlDMzksIDB4NTNGNiwgMHg2OTFCLCAweDZBM0EsIDB4OTc4NCwgMHg2ODJBLCAweDUxNUMsIDB4N0FDMywgMHg4NEIyLAorICAgIDB4OTFEQywgMHg5MzhDLCAweDU2NUIsIDB4OUQyOCwgMHg2ODIyLCAweDgzMDUsIDB4ODQzMSwgMHg3Q0E1LCAweDUyMDgsCisgICAgMHg4MkM1LCAweDc0RTYsIDB4NEU3RSwgMHg0RjgzLCAweDUxQTAsIDB4NUJEMiwgMHg1MjBBLCAweDUyRDgsIDB4NTJFNywKKyAgICAweDVERkIsIDB4NTU5QSwgMHg1ODJBLCAweDU5RTYsIDB4NUI4QywgMHg1Qjk4LCAweDVCREIsIDB4NUU3MiwgMHg1RTc5LAorICAgIDB4NjBBMywgMHg2MTFGLCAweDYxNjMsIDB4NjFCRSwgMHg2M0RCLCAweDY1NjIsIDB4NjdEMSwgMHg2ODUzLCAweDY4RkEsCisgICAgMHg2QjNFLCAweDZCNTMsIDB4NkM1NywgMHg2RjIyLCAweDZGOTcsIDB4NkY0NSwgMHg3NEIwLCAweDc1MTgsIDB4NzZFMywKKyAgICAweDc3MEIsIDB4N0FGRiwgMHg3QkExLCAweDdDMjEsIDB4N0RFOSwgMHg3RjM2LCAweDdGRjAsIDB4ODA5RCwgMHg4MjY2LAorICAgIDB4ODM5RSwgMHg4OUIzLCAweDhBQ0MsIDB4OENBQiwgMHg5MDg0LCAweDk0NTEsIDB4OTU5MywgMHg5NTkxLCAweDk1QTIsCisgICAgMHg5NjY1LCAweDk3RDMsIDB4OTkyOCwgMHg4MjE4LCAweDRFMzgsIDB4NTQyQiwgMHg1Q0I4LCAweDVEQ0MsIDB4NzNBOSwKKyAgICAweDc2NEMsIDB4NzczQywgMHg1Q0E5LCAweDdGRUIsIDB4OEQwQiwgMHg5NkMxLCAweDk4MTEsIDB4OTg1NCwgMHg5ODU4LAorICAgIDB4NEYwMSwgMHg0RjBFLCAweDUzNzEsIDB4NTU5QywgMHg1NjY4LCAweDU3RkEsIDB4NTk0NywgMHg1QjA5LCAweDVCQzQsCisgICAgMHg1QzkwLCAweDVFMEMsIDB4NUU3RSwgMHg1RkNDLCAweDYzRUUsIDB4NjczQSwgMHg2NUQ3LCAweDY1RTIsIDB4NjcxRiwKKyAgICAweDY4Q0IsIDB4NjhDNCwgMHg2QTVGLCAweDVFMzAsIDB4NkJDNSwgMHg2QzE3LCAweDZDN0QsIDB4NzU3RiwgMHg3OTQ4LAorICAgIDB4NUI2MywgMHg3QTAwLCAweDdEMDAsIDB4NUZCRCwgMHg4OThGLCAweDhBMTgsIDB4OENCNCwgMHg4RDc3LCAweDhFQ0MsCisgICAgMHg4RjFELCAweDk4RTIsIDB4OUEwRSwgMHg5QjNDLCAweDRFODAsIDB4NTA3RCwgMHg1MTAwLCAweDU5OTMsIDB4NUI5QywKKyAgICAweDYyMkYsIDB4NjI4MCwgMHg2NEVDLCAweDZCM0EsIDB4NzJBMCwgMHg3NTkxLCAweDc5NDcsIDB4N0ZBOSwgMHg4N0ZCLAorICAgIDB4OEFCQywgMHg4QjcwLCAweDYzQUMsIDB4ODNDQSwgMHg5N0EwLCAweDU0MDksIDB4NTQwMywgMHg1NUFCLCAweDY4NTQsCisgICAgMHg2QTU4LCAweDhBNzAsIDB4NzgyNywgMHg2Nzc1LCAweDlFQ0QsIDB4NTM3NCwgMHg1QkEyLCAweDgxMUEsIDB4ODY1MCwKKyAgICAweDkwMDYsIDB4NEUxOCwgMHg0RTQ1LCAweDRFQzcsIDB4NEYxMSwgMHg1M0NBLCAweDU0MzgsIDB4NUJBRSwgMHg1RjEzLAorICAgIDB4NjAyNSwgMHg2NTUxLCAweDY3M0QsIDB4NkM0MiwgMHg2QzcyLCAweDZDRTMsIDB4NzA3OCwgMHg3NDAzLCAweDdBNzYsCisgICAgMHg3QUFFLCAweDdCMDgsIDB4N0QxQSwgMHg3Q0ZFLCAweDdENjYsIDB4NjVFNywgMHg3MjVCLCAweDUzQkIsIDB4NUM0NSwKKyAgICAweDVERTgsIDB4NjJEMiwgMHg2MkUwLCAweDYzMTksIDB4NkUyMCwgMHg4NjVBLCAweDhBMzEsIDB4OERERCwgMHg5MkY4LAorICAgIDB4NkYwMSwgMHg3OUE2LCAweDlCNUEsIDB4NEVBOCwgMHg0RUFCLCAweDRFQUMsIDB4NEY5QiwgMHg0RkEwLCAweDUwRDEsCisgICAgMHg1MTQ3LCAweDdBRjYsIDB4NTE3MSwgMHg1MUY2LCAweDUzNTQsIDB4NTMyMSwgMHg1MzdGLCAweDUzRUIsIDB4NTVBQywKKyAgICAweDU4ODMsIDB4NUNFMSwgMHg1RjM3LCAweDVGNEEsIDB4NjAyRiwgMHg2MDUwLCAweDYwNkQsIDB4NjMxRiwgMHg2NTU5LAorICAgIDB4NkE0QiwgMHg2Q0MxLCAweDcyQzIsIDB4NzJFRCwgMHg3N0VGLCAweDgwRjgsIDB4ODEwNSwgMHg4MjA4LCAweDg1NEUsCisgICAgMHg5MEY3LCAweDkzRTEsIDB4OTdGRiwgMHg5OTU3LCAweDlBNUEsIDB4NEVGMCwgMHg1MURELCAweDVDMkQsIDB4NjY4MSwKKyAgICAweDY5NkQsIDB4NUM0MCwgMHg2NkYyLCAweDY5NzUsIDB4NzM4OSwgMHg2ODUwLCAweDdDODEsIDB4NTBDNSwgMHg1MkU0LAorICAgIDB4NTc0NywgMHg1REZFLCAweDkzMjYsIDB4NjVBNCwgMHg2QjIzLCAweDZCM0QsIDB4NzQzNCwgMHg3OTgxLCAweDc5QkQsCisgICAgMHg3QjRCLCAweDdEQ0EsIDB4ODJCOSwgMHg4M0NDLCAweDg4N0YsIDB4ODk1RiwgMHg4QjM5LCAweDhGRDEsIDB4OTFEMSwKKyAgICAweDU0MUYsIDB4OTI4MCwgMHg0RTVELCAweDUwMzYsIDB4NTNFNSwgMHg1MzNBLCAweDcyRDcsIDB4NzM5NiwgMHg3N0U5LAorICAgIDB4ODJFNiwgMHg4RUFGLCAweDk5QzYsIDB4OTlDOCwgMHg5OUQyLCAweDUxNzcsIDB4NjExQSwgMHg4NjVFLCAweDU1QjAsCisgICAgMHg3QTdBLCAweDUwNzYsIDB4NUJEMywgMHg5MDQ3LCAweDk2ODUsIDB4NEUzMiwgMHg2QURCLCAweDkxRTcsIDB4NUM1MSwKKyAgICAweDVDNDgsIDB4NjM5OCwgMHg3QTlGLCAweDZDOTMsIDB4OTc3NCwgMHg4RjYxLCAweDdBQUEsIDB4NzE4QSwgMHg5Njg4LAorICAgIDB4N0M4MiwgMHg2ODE3LCAweDdFNzAsIDB4Njg1MSwgMHg5MzZDLCAweDUyRjIsIDB4NTQxQiwgMHg4NUFCLCAweDhBMTMsCisgICAgMHg3RkE0LCAweDhFQ0QsIDB4OTBFMSwgMHg1MzY2LCAweDg4ODgsIDB4Nzk0MSwgMHg0RkMyLCAweDUwQkUsIDB4NTIxMSwKKyAgICAweDUxNDQsIDB4NTU1MywgMHg1NzJELCAweDczRUEsIDB4NTc4QiwgMHg1OTUxLCAweDVGNjIsIDB4NUY4NCwgMHg2MDc1LAorICAgIDB4NjE3NiwgMHg2MTY3LCAweDYxQTksIDB4NjNCMiwgMHg2NDNBLCAweDY1NkMsIDB4NjY2RiwgMHg2ODQyLCAweDZFMTMsCisgICAgMHg3NTY2LCAweDdBM0QsIDB4N0NGQiwgMHg3RDRDLCAweDdEOTksIDB4N0U0QiwgMHg3RjZCLCAweDgzMEUsIDB4ODM0QSwKKyAgICAweDg2Q0QsIDB4OEEwOCwgMHg4QTYzLCAweDhCNjYsIDB4OEVGRCwgMHg5ODFBLCAweDlEOEYsIDB4ODJCOCwgMHg4RkNFLAorICAgIDB4OUJFOCwgMHg1Mjg3LCAweDYyMUYsIDB4NjQ4MywgMHg2RkMwLCAweDk2OTksIDB4Njg0MSwgMHg1MDkxLCAweDZCMjAsCisgICAgMHg2QzdBLCAweDZGNTQsIDB4N0E3NCwgMHg3RDUwLCAweDg4NDAsIDB4OEEyMywgMHg2NzA4LCAweDRFRjYsIDB4NTAzOSwKKyAgICAweDUwMjYsIDB4NTA2NSwgMHg1MTdDLCAweDUyMzgsIDB4NTI2MywgMHg1NUE3LCAweDU3MEYsIDB4NTgwNSwgMHg1QUNDLAorICAgIDB4NUVGQSwgMHg2MUIyLCAweDYxRjgsIDB4NjJGMywgMHg2MzcyLCAweDY5MUMsIDB4NkEyOSwgMHg3MjdELCAweDcyQUMsCisgICAgMHg3MzJFLCAweDc4MTQsIDB4Nzg2RiwgMHg3RDc5LCAweDc3MEMsIDB4ODBBOSwgMHg4OThCLCAweDhCMTksIDB4OENFMiwKKyAgICAweDhFRDIsIDB4OTA2MywgMHg5Mzc1LCAweDk2N0EsIDB4OTg1NSwgMHg5QTEzLCAweDlFNzgsIDB4NTE0MywgMHg1MzlGLAorICAgIDB4NTNCMywgMHg1RTdCLCAweDVGMjYsIDB4NkUxQiwgMHg2RTkwLCAweDczODQsIDB4NzNGRSwgMHg3RDQzLCAweDgyMzcsCisgICAgMHg4QTAwLCAweDhBRkEsIDB4OTY1MCwgMHg0RTRFLCAweDUwMEIsIDB4NTNFNCwgMHg1NDdDLCAweDU2RkEsIDB4NTlEMSwKKyAgICAweDVCNjQsIDB4NURGMSwgMHg1RUFCLCAweDVGMjcsIDB4NjIzOCwgMHg2NTQ1LCAweDY3QUYsIDB4NkU1NiwgMHg3MkQwLAorICAgIDB4N0NDQSwgMHg4OEI0LCAweDgwQTEsIDB4ODBFMSwgMHg4M0YwLCAweDg2NEUsIDB4OEE4NywgMHg4REU4LCAweDkyMzcsCisgICAgMHg5NkM3LCAweDk4NjcsIDB4OUYxMywgMHg0RTk0LCAweDRFOTIsIDB4NEYwRCwgMHg1MzQ4LCAweDU0NDksIDB4NTQzRSwKKyAgICAweDVBMkYsIDB4NUY4QywgMHg1RkExLCAweDYwOUYsIDB4NjhBNywgMHg2QThFLCAweDc0NUEsIDB4Nzg4MSwgMHg4QTlFLAorICAgIDB4OEFBNCwgMHg4Qjc3LCAweDkxOTAsIDB4NEU1RSwgMHg5QkM5LCAweDRFQTQsIDB4NEY3QywgMHg0RkFGLCAweDUwMTksCisgICAgMHg1MDE2LCAweDUxNDksIDB4NTE2QywgMHg1MjlGLCAweDUyQjksIDB4NTJGRSwgMHg1MzlBLCAweDUzRTMsIDB4NTQxMSwKKyAgICAweDU0MEUsIDB4NTU4OSwgMHg1NzUxLCAweDU3QTIsIDB4NTk3RCwgMHg1QjU0LCAweDVCNUQsIDB4NUI4RiwgMHg1REU1LAorICAgIDB4NURFNywgMHg1REY3LCAweDVFNzgsIDB4NUU4MywgMHg1RTlBLCAweDVFQjcsIDB4NUYxOCwgMHg2MDUyLCAweDYxNEMsCisgICAgMHg2Mjk3LCAweDYyRDgsIDB4NjNBNywgMHg2NTNCLCAweDY2MDIsIDB4NjY0MywgMHg2NkY0LCAweDY3NkQsIDB4NjgyMSwKKyAgICAweDY4OTcsIDB4NjlDQiwgMHg2QzVGLCAweDZEMkEsIDB4NkQ2OSwgMHg2RTJGLCAweDZFOUQsIDB4NzUzMiwgMHg3Njg3LAorICAgIDB4Nzg2QywgMHg3QTNGLCAweDdDRTAsIDB4N0QwNSwgMHg3RDE4LCAweDdENUUsIDB4N0RCMSwgMHg4MDE1LCAweDgwMDMsCisgICAgMHg4MEFGLCAweDgwQjEsIDB4ODE1NCwgMHg4MThGLCAweDgyMkEsIDB4ODM1MiwgMHg4ODRDLCAweDg4NjEsIDB4OEIxQiwKKyAgICAweDhDQTIsIDB4OENGQywgMHg5MENBLCAweDkxNzUsIDB4OTI3MSwgMHg3ODNGLCAweDkyRkMsIDB4OTVBNCwgMHg5NjRELAorICAgIDB4OTgwNSwgMHg5OTk5LCAweDlBRDgsIDB4OUQzQiwgMHg1MjVCLCAweDUyQUIsIDB4NTNGNywgMHg1NDA4LCAweDU4RDUsCisgICAgMHg2MkY3LCAweDZGRTAsIDB4OEM2QSwgMHg4RjVGLCAweDlFQjksIDB4NTE0QiwgMHg1MjNCLCAweDU0NEEsIDB4NTZGRCwKKyAgICAweDdBNDAsIDB4OTE3NywgMHg5RDYwLCAweDlFRDIsIDB4NzM0NCwgMHg2RjA5LCAweDgxNzAsIDB4NzUxMSwgMHg1RkZELAorICAgIDB4NjBEQSwgMHg5QUE4LCAweDcyREIsIDB4OEZCQywgMHg2QjY0LCAweDk4MDMsIDB4NEVDQSwgMHg1NkYwLCAweDU3NjQsCisgICAgMHg1OEJFLCAweDVBNUEsIDB4NjA2OCwgMHg2MUM3LCAweDY2MEYsIDB4NjYwNiwgMHg2ODM5LCAweDY4QjEsIDB4NkRGNywKKyAgICAweDc1RDUsIDB4N0QzQSwgMHg4MjZFLCAweDlCNDIsIDB4NEU5QiwgMHg0RjUwLCAweDUzQzksIDB4NTUwNiwgMHg1RDZGLAorICAgIDB4NURFNiwgMHg1REVFLCAweDY3RkIsIDB4NkM5OSwgMHg3NDczLCAweDc4MDIsIDB4OEE1MCwgMHg5Mzk2LCAweDg4REYsCisgICAgMHg1NzUwLCAweDVFQTcsIDB4NjMyQiwgMHg1MEI1LCAweDUwQUMsIDB4NTE4RCwgMHg2NzAwLCAweDU0QzksIDB4NTg1RSwKKyAgICAweDU5QkIsIDB4NUJCMCwgMHg1RjY5LCAweDYyNEQsIDB4NjNBMSwgMHg2ODNELCAweDZCNzMsIDB4NkUwOCwgMHg3MDdELAorICAgIDB4OTFDNywgMHg3MjgwLCAweDc4MTUsIDB4NzgyNiwgMHg3OTZELCAweDY1OEUsIDB4N0QzMCwgMHg4M0RDLCAweDg4QzEsCisgICAgMHg4RjA5LCAweDk2OUIsIDB4NTI2NCwgMHg1NzI4LCAweDY3NTAsIDB4N0Y2QSwgMHg4Q0ExLCAweDUxQjQsIDB4NTc0MiwKKyAgICAweDk2MkEsIDB4NTgzQSwgMHg2OThBLCAweDgwQjQsIDB4NTRCMiwgMHg1RDBFLCAweDU3RkMsIDB4Nzg5NSwgMHg5REZBLAorICAgIDB4NEY1QywgMHg1MjRBLCAweDU0OEIsIDB4NjQzRSwgMHg2NjI4LCAweDY3MTQsIDB4NjdGNSwgMHg3QTg0LCAweDdCNTYsCisgICAgMHg3RDIyLCAweDkzMkYsIDB4Njg1QywgMHg5QkFELCAweDdCMzksIDB4NTMxOSwgMHg1MThBLCAweDUyMzcsIDB4NUJERiwKKyAgICAweDYyRjYsIDB4NjRBRSwgMHg2NEU2LCAweDY3MkQsIDB4NkJCQSwgMHg4NUE5LCAweDk2RDEsIDB4NzY5MCwgMHg5QkQ2LAorICAgIDB4NjM0QywgMHg5MzA2LCAweDlCQUIsIDB4NzZCRiwgMHg2NjUyLCAweDRFMDksIDB4NTA5OCwgMHg1M0MyLCAweDVDNzEsCisgICAgMHg2MEU4LCAweDY0OTIsIDB4NjU2MywgMHg2ODVGLCAweDcxRTYsIDB4NzNDQSwgMHg3NTIzLCAweDdCOTcsIDB4N0U4MiwKKyAgICAweDg2OTUsIDB4OEI4MywgMHg4Q0RCLCAweDkxNzgsIDB4OTkxMCwgMHg2NUFDLCAweDY2QUIsIDB4NkI4QiwgMHg0RUQ1LAorICAgIDB4NEVENCwgMHg0RjNBLCAweDRGN0YsIDB4NTIzQSwgMHg1M0Y4LCAweDUzRjIsIDB4NTVFMywgMHg1NkRCLCAweDU4RUIsCisgICAgMHg1OUNCLCAweDU5QzksIDB4NTlGRiwgMHg1QjUwLCAweDVDNEQsIDB4NUUwMiwgMHg1RTJCLCAweDVGRDcsIDB4NjAxRCwKKyAgICAweDYzMDcsIDB4NjUyRiwgMHg1QjVDLCAweDY1QUYsIDB4NjVCRCwgMHg2NUU4LCAweDY3OUQsIDB4NkI2MiwgMHg2QjdCLAorICAgIDB4NkMwRiwgMHg3MzQ1LCAweDc5NDksIDB4NzlDMSwgMHg3Q0Y4LCAweDdEMTksIDB4N0QyQiwgMHg4MEEyLCAweDgxMDIsCisgICAgMHg4MUYzLCAweDg5OTYsIDB4OEE1RSwgMHg4QTY5LCAweDhBNjYsIDB4OEE4QywgMHg4QUVFLCAweDhDQzcsIDB4OENEQywKKyAgICAweDk2Q0MsIDB4OThGQywgMHg2QjZGLCAweDRFOEIsIDB4NEYzQywgMHg0RjhELCAweDUxNTAsIDB4NUI1NywgMHg1QkZBLAorICAgIDB4NjE0OCwgMHg2MzAxLCAweDY2NDIsIDB4NkIyMSwgMHg2RUNCLCAweDZDQkIsIDB4NzIzRSwgMHg3NEJELCAweDc1RDQsCisgICAgMHg3OEMxLCAweDc5M0EsIDB4ODAwQywgMHg4MDMzLCAweDgxRUEsIDB4ODQ5NCwgMHg4RjlFLCAweDZDNTAsIDB4OUU3RiwKKyAgICAweDVGMEYsIDB4OEI1OCwgMHg5RDJCLCAweDdBRkEsIDB4OEVGOCwgMHg1QjhELCAweDk2RUIsIDB4NEUwMywgMHg1M0YxLAorICAgIDB4NTdGNywgMHg1OTMxLCAweDVBQzksIDB4NUJBNCwgMHg2MDg5LCAweDZFN0YsIDB4NkYwNiwgMHg3NUJFLCAweDhDRUEsCisgICAgMHg1QjlGLCAweDg1MDAsIDB4N0JFMCwgMHg1MDcyLCAweDY3RjQsIDB4ODI5RCwgMHg1QzYxLCAweDg1NEEsIDB4N0UxRSwKKyAgICAweDgyMEUsIDB4NTE5OSwgMHg1QzA0LCAweDYzNjgsIDB4OEQ2NiwgMHg2NTlDLCAweDcxNkUsIDB4NzkzRSwgMHg3RDE3LAorICAgIDB4ODAwNSwgMHg4QjFELCAweDhFQ0EsIDB4OTA2RSwgMHg4NkM3LCAweDkwQUEsIDB4NTAxRiwgMHg1MkZBLCAweDVDM0EsCisgICAgMHg2NzUzLCAweDcwN0MsIDB4NzIzNSwgMHg5MTRDLCAweDkxQzgsIDB4OTMyQiwgMHg4MkU1LCAweDVCQzIsIDB4NUYzMSwKKyAgICAweDYwRjksIDB4NEUzQiwgMHg1M0Q2LCAweDVCODgsIDB4NjI0QiwgMHg2NzMxLCAweDZCOEEsIDB4NzJFOSwgMHg3M0UwLAorICAgIDB4N0EyRSwgMHg4MTZCLCAweDhEQTMsIDB4OTE1MiwgMHg5OTk2LCAweDUxMTIsIDB4NTNENywgMHg1NDZBLCAweDVCRkYsCisgICAgMHg2Mzg4LCAweDZBMzksIDB4N0RBQywgMHg5NzAwLCAweDU2REEsIDB4NTNDRSwgMHg1NDY4LCAweDVCOTcsIDB4NUMzMSwKKyAgICAweDVEREUsIDB4NEZFRSwgMHg2MTAxLCAweDYyRkUsIDB4NkQzMiwgMHg3OUMwLCAweDc5Q0IsIDB4N0Q0MiwgMHg3RTRELAorICAgIDB4N0ZEMiwgMHg4MUVELCAweDgyMUYsIDB4ODQ5MCwgMHg4ODQ2LCAweDg5NzIsIDB4OEI5MCwgMHg4RTc0LCAweDhGMkYsCisgICAgMHg5MDMxLCAweDkxNEIsIDB4OTE2QywgMHg5NkM2LCAweDkxOUMsIDB4NEVDMCwgMHg0RjRGLCAweDUxNDUsIDB4NTM0MSwKKyAgICAweDVGOTMsIDB4NjIwRSwgMHg2N0Q0LCAweDZDNDEsIDB4NkUwQiwgMHg3MzYzLCAweDdFMjYsIDB4OTFDRCwgMHg5MjgzLAorICAgIDB4NTNENCwgMHg1OTE5LCAweDVCQkYsIDB4NkREMSwgMHg3OTVELCAweDdFMkUsIDB4N0M5QiwgMHg1ODdFLCAweDcxOUYsCisgICAgMHg1MUZBLCAweDg4NTMsIDB4OEZGMCwgMHg0RkNBLCAweDVDRkIsIDB4NjYyNSwgMHg3N0FDLCAweDdBRTMsIDB4ODIxQywKKyAgICAweDk5RkYsIDB4NTFDNiwgMHg1RkFBLCAweDY1RUMsIDB4Njk2RiwgMHg2Qjg5LCAweDZERjMsIDB4NkU5NiwgMHg2RjY0LAorICAgIDB4NzZGRSwgMHg3RDE0LCAweDVERTEsIDB4OTA3NSwgMHg5MTg3LCAweDk4MDYsIDB4NTFFNiwgMHg1MjFELCAweDYyNDAsCisgICAgMHg2NjkxLCAweDY2RDksIDB4NkUxQSwgMHg1RUI2LCAweDdERDIsIDB4N0Y3MiwgMHg2NkY4LCAweDg1QUYsIDB4ODVGNywKKyAgICAweDhBRjgsIDB4NTJBOSwgMHg1M0Q5LCAweDU5NzMsIDB4NUU4RiwgMHg1RjkwLCAweDYwNTUsIDB4OTJFNCwgMHg5NjY0LAorICAgIDB4NTBCNywgMHg1MTFGLCAweDUyREQsIDB4NTMyMCwgMHg1MzQ3LCAweDUzRUMsIDB4NTRFOCwgMHg1NTQ2LCAweDU1MzEsCisgICAgMHg1NjE3LCAweDU5NjgsIDB4NTlCRSwgMHg1QTNDLCAweDVCQjUsIDB4NUMwNiwgMHg1QzBGLCAweDVDMTEsIDB4NUMxQSwKKyAgICAweDVFODQsIDB4NUU4QSwgMHg1RUUwLCAweDVGNzAsIDB4NjI3RiwgMHg2Mjg0LCAweDYyREIsIDB4NjM4QywgMHg2Mzc3LAorICAgIDB4NjYwNywgMHg2NjBDLCAweDY2MkQsIDB4NjY3NiwgMHg2NzdFLCAweDY4QTIsIDB4NkExRiwgMHg2QTM1LCAweDZDQkMsCisgICAgMHg2RDg4LCAweDZFMDksIDB4NkU1OCwgMHg3MTNDLCAweDcxMjYsIDB4NzE2NywgMHg3NUM3LCAweDc3MDEsIDB4Nzg1RCwKKyAgICAweDc5MDEsIDB4Nzk2NSwgMHg3OUYwLCAweDdBRTAsIDB4N0IxMSwgMHg3Q0E3LCAweDdEMzksIDB4ODA5NiwgMHg4M0Q2LAorICAgIDB4ODQ4QiwgMHg4NTQ5LCAweDg4NUQsIDB4ODhGMywgMHg4QTFGLCAweDhBM0MsIDB4OEE1NCwgMHg4QTczLCAweDhDNjEsCisgICAgMHg4Q0RFLCAweDkxQTQsIDB4OTI2NiwgMHg5MzdFLCAweDk0MTgsIDB4OTY5QywgMHg5Nzk4LCAweDRFMEEsIDB4NEUwOCwKKyAgICAweDRFMUUsIDB4NEU1NywgMHg1MTk3LCAweDUyNzAsIDB4NTdDRSwgMHg1ODM0LCAweDU4Q0MsIDB4NUIyMiwgMHg1RTM4LAorICAgIDB4NjBDNSwgMHg2NEZFLCAweDY3NjEsIDB4Njc1NiwgMHg2RDQ0LCAweDcyQjYsIDB4NzU3MywgMHg3QTYzLCAweDg0QjgsCisgICAgMHg4QjcyLCAweDkxQjgsIDB4OTMyMCwgMHg1NjMxLCAweDU3RjQsIDB4OThGRSwgMHg2MkVELCAweDY5MEQsIDB4NkI5NiwKKyAgICAweDcxRUQsIDB4N0U1NCwgMHg4MDc3LCAweDgyNzIsIDB4ODlFNiwgMHg5OERGLCAweDg3NTUsIDB4OEZCMSwgMHg1QzNCLAorICAgIDB4NEYzOCwgMHg0RkUxLCAweDRGQjUsIDB4NTUwNywgMHg1QTIwLCAweDVCREQsIDB4NUJFOSwgMHg1RkMzLCAweDYxNEUsCisgICAgMHg2MzJGLCAweDY1QjAsIDB4NjY0QiwgMHg2OEVFLCAweDY5OUIsIDB4NkQ3OCwgMHg2REYxLCAweDc1MzMsIDB4NzVCOSwKKyAgICAweDc3MUYsIDB4Nzk1RSwgMHg3OUU2LCAweDdEMzMsIDB4ODFFMywgMHg4MkFGLCAweDg1QUEsIDB4ODlBQSwgMHg4QTNBLAorICAgIDB4OEVBQiwgMHg4RjlCLCAweDkwMzIsIDB4OTFERCwgMHg5NzA3LCAweDRFQkEsIDB4NEVDMSwgMHg1MjAzLCAweDU4NzUsCisgICAgMHg1OEVDLCAweDVDMEIsIDB4NzUxQSwgMHg1QzNELCAweDgxNEUsIDB4OEEwQSwgMHg4RkM1LCAweDk2NjMsIDB4OTc2RCwKKyAgICAweDdCMjUsIDB4OEFDRiwgMHg5ODA4LCAweDkxNjIsIDB4NTZGMywgMHg1M0E4LCAweDkwMTcsIDB4NTQzOSwgMHg1NzgyLAorICAgIDB4NUUyNSwgMHg2M0E4LCAweDZDMzQsIDB4NzA4QSwgMHg3NzYxLCAweDdDOEIsIDB4N0ZFMCwgMHg4ODcwLCAweDkwNDIsCisgICAgMHg5MTU0LCAweDkzMTAsIDB4OTMxOCwgMHg5NjhGLCAweDc0NUUsIDB4OUFDNCwgMHg1RDA3LCAweDVENjksIDB4NjU3MCwKKyAgICAweDY3QTIsIDB4OERBOCwgMHg5NkRCLCAweDYzNkUsIDB4Njc0OSwgMHg2OTE5LCAweDgzQzUsIDB4OTgxNywgMHg5NkMwLAorICAgIDB4ODhGRSwgMHg2Rjg0LCAweDY0N0EsIDB4NUJGOCwgMHg0RTE2LCAweDcwMkMsIDB4NzU1RCwgMHg2NjJGLCAweDUxQzQsCisgICAgMHg1MjM2LCAweDUyRTIsIDB4NTlEMywgMHg1RjgxLCAweDYwMjcsIDB4NjIxMCwgMHg2NTNGLCAweDY1NzQsIDB4NjYxRiwKKyAgICAweDY2NzQsIDB4NjhGMiwgMHg2ODE2LCAweDZCNjMsIDB4NkUwNSwgMHg3MjcyLCAweDc1MUYsIDB4NzZEQiwgMHg3Q0JFLAorICAgIDB4ODA1NiwgMHg1OEYwLCAweDg4RkQsIDB4ODk3RiwgMHg4QUEwLCAweDhBOTMsIDB4OEFDQiwgMHg5MDFELCAweDkxOTIsCisgICAgMHg5NzUyLCAweDk3NTksIDB4NjU4OSwgMHg3QTBFLCAweDgxMDYsIDB4OTZCQiwgMHg1RTJELCAweDYwREMsIDB4NjIxQSwKKyAgICAweDY1QTUsIDB4NjYxNCwgMHg2NzkwLCAweDc3RjMsIDB4N0E0RCwgMHg3QzRELCAweDdFM0UsIDB4ODEwQSwgMHg4Q0FDLAorICAgIDB4OEQ2NCwgMHg4REUxLCAweDhFNUYsIDB4NzhBOSwgMHg1MjA3LCAweDYyRDksIDB4NjNBNSwgMHg2NDQyLCAweDYyOTgsCisgICAgMHg4QTJELCAweDdBODMsIDB4N0JDMCwgMHg4QUFDLCAweDk2RUEsIDB4N0Q3NiwgMHg4MjBDLCAweDg3NDksIDB4NEVEOSwKKyAgICAweDUxNDgsIDB4NTM0MywgMHg1MzYwLCAweDVCQTMsIDB4NUMwMiwgMHg1QzE2LCAweDVEREQsIDB4NjIyNiwgMHg2MjQ3LAorICAgIDB4NjRCMCwgMHg2ODEzLCAweDY4MzQsIDB4NkNDOSwgMHg2RDQ1LCAweDZEMTcsIDB4NjdEMywgMHg2RjVDLCAweDcxNEUsCisgICAgMHg3MTdELCAweDY1Q0IsIDB4N0E3RiwgMHg3QkFELCAweDdEREEsIDB4N0U0QSwgMHg3RkE4LCAweDgxN0EsIDB4ODIxQiwKKyAgICAweDgyMzksIDB4ODVBNiwgMHg4QTZFLCAweDhDQ0UsIDB4OERGNSwgMHg5MDc4LCAweDkwNzcsIDB4OTJBRCwgMHg5MjkxLAorICAgIDB4OTU4MywgMHg5QkFFLCAweDUyNEQsIDB4NTU4NCwgMHg2RjM4LCAweDcxMzYsIDB4NTE2OCwgMHg3OTg1LCAweDdFNTUsCisgICAgMHg4MUIzLCAweDdDQ0UsIDB4NTY0QywgMHg1ODUxLCAweDVDQTgsIDB4NjNBQSwgMHg2NkZFLCAweDY2RkQsIDB4Njk1QSwKKyAgICAweDcyRDksIDB4NzU4RiwgMHg3NThFLCAweDc5MEUsIDB4Nzk1NiwgMHg3OURGLCAweDdDOTcsIDB4N0QyMCwgMHg3RDQ0LAorICAgIDB4ODYwNywgMHg4QTM0LCAweDk2M0IsIDB4OTA2MSwgMHg5RjIwLCAweDUwRTcsIDB4NTI3NSwgMHg1M0NDLCAweDUzRTIsCisgICAgMHg1MDA5LCAweDU1QUEsIDB4NThFRSwgMHg1OTRGLCAweDcyM0QsIDB4NUI4QiwgMHg1QzY0LCAweDUzMUQsIDB4NjBFMywKKyAgICAweDYwRjMsIDB4NjM1QywgMHg2MzgzLCAweDYzM0YsIDB4NjNCQiwgMHg2NENELCAweDY1RTksIDB4NjZGOSwgMHg1REUzLAorICAgIDB4NjlDRCwgMHg2OUZELCAweDZGMTUsIDB4NzFFNSwgMHg0RTg5LCAweDc1RTksIDB4NzZGOCwgMHg3QTkzLCAweDdDREYsCisgICAgMHg3RENGLCAweDdEOUMsIDB4ODA2MSwgMHg4MzQ5LCAweDgzNTgsIDB4ODQ2QywgMHg4NEJDLCAweDg1RkIsIDB4ODhDNSwKKyAgICAweDhENzAsIDB4OTAwMSwgMHg5MDZELCAweDkzOTcsIDB4OTcxQywgMHg5QTEyLCAweDUwQ0YsIDB4NTg5NywgMHg2MThFLAorICAgIDB4ODFEMywgMHg4NTM1LCAweDhEMDgsIDB4OTAyMCwgMHg0RkMzLCAweDUwNzQsIDB4NTI0NywgMHg1MzczLCAweDYwNkYsCisgICAgMHg2MzQ5LCAweDY3NUYsIDB4NkUyQywgMHg4REIzLCAweDkwMUYsIDB4NEZENywgMHg1QzVFLCAweDhDQ0EsIDB4NjVDRiwKKyAgICAweDdEOUEsIDB4NTM1MiwgMHg4ODk2LCAweDUxNzYsIDB4NjNDMywgMHg1QjU4LCAweDVCNkIsIDB4NUMwQSwgMHg2NDBELAorICAgIDB4Njc1MSwgMHg5MDVDLCAweDRFRDYsIDB4NTkxQSwgMHg1OTJBLCAweDZDNzAsIDB4OEE1MSwgMHg1NTNFLCAweDU4MTUsCisgICAgMHg1OUE1LCAweDYwRjAsIDB4NjI1MywgMHg2N0MxLCAweDgyMzUsIDB4Njk1NSwgMHg5NjQwLCAweDk5QzQsIDB4OUEyOCwKKyAgICAweDRGNTMsIDB4NTgwNiwgMHg1QkZFLCAweDgwMTAsIDB4NUNCMSwgMHg1RTJGLCAweDVGODUsIDB4NjAyMCwgMHg2MTRCLAorICAgIDB4NjIzNCwgMHg2NkZGLCAweDZDRjAsIDB4NkVERSwgMHg4MENFLCAweDgxN0YsIDB4ODJENCwgMHg4ODhCLCAweDhDQjgsCisgICAgMHg5MDAwLCAweDkwMkUsIDB4OTY4QSwgMHg5RURCLCAweDlCREIsIDB4NEVFMywgMHg1M0YwLCAweDU5MjcsIDB4N0IyQywKKyAgICAweDkxOEQsIDB4OTg0QywgMHg5REY5LCAweDZFREQsIDB4NzAyNywgMHg1MzUzLCAweDU1NDQsIDB4NUI4NSwgMHg2MjU4LAorICAgIDB4NjI5RSwgMHg2MkQzLCAweDZDQTIsIDB4NkZFRiwgMHg3NDIyLCAweDhBMTcsIDB4OTQzOCwgMHg2RkMxLCAweDhBRkUsCisgICAgMHg4MzM4LCAweDUxRTcsIDB4ODZGOCwgMHg1M0VBLCAweDUzRTksIDB4NEY0NiwgMHg5MDU0LCAweDhGQjAsIDB4NTk2QSwKKyAgICAweDgxMzEsIDB4NURGRCwgMHg3QUVBLCAweDhGQkYsIDB4NjhEQSwgMHg4QzM3LCAweDcyRjgsIDB4OUM0OCwgMHg2QTNELAorICAgIDB4OEFCMCwgMHg0RTM5LCAweDUzNTgsIDB4NTYwNiwgMHg1NzY2LCAweDYyQzUsIDB4NjNBMiwgMHg2NUU2LCAweDZCNEUsCisgICAgMHg2REUxLCAweDZFNUIsIDB4NzBBRCwgMHg3N0VELCAweDdBRUYsIDB4N0JBQSwgMHg3REJCLCAweDgwM0QsIDB4ODBDNiwKKyAgICAweDg2Q0IsIDB4OEE5NSwgMHg5MzVCLCAweDU2RTMsIDB4NThDNywgMHg1RjNFLCAweDY1QUQsIDB4NjY5NiwgMHg2QTgwLAorICAgIDB4NkJCNSwgMHg3NTM3LCAweDhBQzcsIDB4NTAyNCwgMHg3N0U1LCAweDU3MzAsIDB4NUYxQiwgMHg2MDY1LCAweDY2N0EsCisgICAgMHg2QzYwLCAweDc1RjQsIDB4N0ExQSwgMHg3RjZFLCAweDgxRjQsIDB4ODcxOCwgMHg5MDQ1LCAweDk5QjMsIDB4N0JDOSwKKyAgICAweDc1NUMsIDB4N0FGOSwgMHg3QjUxLCAweDg0QzQsIDB4OTAxMCwgMHg3OUU5LCAweDdBOTIsIDB4ODMzNiwgMHg1QUUxLAorICAgIDB4Nzc0MCwgMHg0RTJELCAweDRFRjIsIDB4NUI5OSwgMHg1RkUwLCAweDYyQkQsIDB4NjYzQywgMHg2N0YxLCAweDZDRTgsCisgICAgMHg4NjZCLCAweDg4NzcsIDB4OEEzQiwgMHg5MTRFLCAweDkyRjMsIDB4OTlEMCwgMHg2QTE3LCAweDcwMjYsIDB4NzMyQSwKKyAgICAweDgyRTcsIDB4ODQ1NywgMHg4Q0FGLCAweDRFMDEsIDB4NTE0NiwgMHg1MUNCLCAweDU1OEIsIDB4NUJGNSwgMHg1RTE2LAorICAgIDB4NUUzMywgMHg1RTgxLCAweDVGMTQsIDB4NUYzNSwgMHg1RjZCLCAweDVGQjQsIDB4NjFGMiwgMHg2MzExLCAweDY2QTIsCisgICAgMHg2NzFELCAweDZGNkUsIDB4NzI1MiwgMHg3NTNBLCAweDc3M0EsIDB4ODA3NCwgMHg4MTM5LCAweDgxNzgsIDB4ODc3NiwKKyAgICAweDhBQkYsIDB4OEFEQywgMHg4RDg1LCAweDhERjMsIDB4OTI5QSwgMHg5NTc3LCAweDk4MDIsIDB4OUNFNSwgMHg1MkM1LAorICAgIDB4NjM1NywgMHg3NkY0LCAweDY3MTUsIDB4NkM4OCwgMHg3M0NELCAweDhDQzMsIDB4OTNBRSwgMHg5NjczLCAweDZEMjUsCisgICAgMHg1ODlDLCAweDY5MEUsIDB4NjlDQywgMHg4RkZELCAweDkzOUEsIDB4NzVEQiwgMHg5MDFBLCAweDU4NUEsIDB4NjgwMiwKKyAgICAweDYzQjQsIDB4NjlGQiwgMHg0RjQzLCAweDZGMkMsIDB4NjdEOCwgMHg4RkJCLCAweDg1MjYsIDB4N0RCNCwgMHg5MzU0LAorICAgIDB4NjkzRiwgMHg2RjcwLCAweDU3NkEsIDB4NThGNywgMHg1QjJDLCAweDdEMkMsIDB4NzIyQSwgMHg1NDBBLCAweDkxRTMsCisgICAgMHg5REI0LCAweDRFQUQsIDB4NEY0RSwgMHg1MDVDLCAweDUwNzUsIDB4NTI0MywgMHg4QzlFLCAweDU0NDgsIDB4NTgyNCwKKyAgICAweDVCOUEsIDB4NUUxRCwgMHg1RTk1LCAweDVFQUQsIDB4NUVGNywgMHg1RjFGLCAweDYwOEMsIDB4NjJCNSwgMHg2MzNBLAorICAgIDB4NjNEMCwgMHg2OEFGLCAweDZDNDAsIDB4Nzg4NywgMHg3OThFLCAweDdBMEIsIDB4N0RFMCwgMHg4MjQ3LCAweDhBMDIsCisgICAgMHg4QUU2LCAweDhFNDQsIDB4OTAxMywgMHg5MEI4LCAweDkxMkQsIDB4OTFEOCwgMHg5RjBFLCAweDZDRTUsIDB4NjQ1OCwKKyAgICAweDY0RTIsIDB4NjU3NSwgMHg2RUY0LCAweDc2ODQsIDB4N0IxQiwgMHg5MDY5LCAweDkzRDEsIDB4NkVCQSwgMHg1NEYyLAorICAgIDB4NUZCOSwgMHg2NEE0LCAweDhGNEQsIDB4OEZFRCwgMHg5MjQ0LCAweDUxNzgsIDB4NTg2QiwgMHg1OTI5LCAweDVDNTUsCisgICAgMHg1RTk3LCAweDZERkIsIDB4N0U4RiwgMHg3NTFDLCAweDhDQkMsIDB4OEVFMiwgMHg5ODVCLCAweDcwQjksIDB4NEYxRCwKKyAgICAweDZCQkYsIDB4NkZCMSwgMHg3NTMwLCAweDk2RkIsIDB4NTE0RSwgMHg1NDEwLCAweDU4MzUsIDB4NTg1NywgMHg1OUFDLAorICAgIDB4NUM2MCwgMHg1RjkyLCAweDY1OTcsIDB4Njc1QywgMHg2RTIxLCAweDc2N0IsIDB4ODNERiwgMHg4Q0VELCAweDkwMTQsCisgICAgMHg5MEZELCAweDkzNEQsIDB4NzgyNSwgMHg3ODNBLCAweDUyQUEsIDB4NUVBNiwgMHg1NzFGLCAweDU5NzQsIDB4NjAxMiwKKyAgICAweDUwMTIsIDB4NTE1QSwgMHg1MUFDLCAweDUxQ0QsIDB4NTIwMCwgMHg1NTEwLCAweDU4NTQsIDB4NTg1OCwgMHg1OTU3LAorICAgIDB4NUI5NSwgMHg1Q0Y2LCAweDVEOEIsIDB4NjBCQywgMHg2Mjk1LCAweDY0MkQsIDB4Njc3MSwgMHg2ODQzLCAweDY4QkMsCisgICAgMHg2OERGLCAweDc2RDcsIDB4NkREOCwgMHg2RTZGLCAweDZEOUIsIDB4NzA2RiwgMHg3MUM4LCAweDVGNTMsIDB4NzVEOCwKKyAgICAweDc5NzcsIDB4N0I0OSwgMHg3QjU0LCAweDdCNTIsIDB4N0NENiwgMHg3RDcxLCAweDUyMzAsIDB4ODQ2MywgMHg4NTY5LAorICAgIDB4ODVFNCwgMHg4QTBFLCAweDhCMDQsIDB4OEM0NiwgMHg4RTBGLCAweDkwMDMsIDB4OTAwRiwgMHg5NDE5LCAweDk2NzYsCisgICAgMHg5ODJELCAweDlBMzAsIDB4OTVEOCwgMHg1MENELCAweDUyRDUsIDB4NTQwQywgMHg1ODAyLCAweDVDMEUsIDB4NjFBNywKKyAgICAweDY0OUUsIDB4NkQxRSwgMHg3N0IzLCAweDdBRTUsIDB4ODBGNCwgMHg4NDA0LCAweDkwNTMsIDB4OTI4NSwgMHg1Q0UwLAorICAgIDB4OUQwNywgMHg1MzNGLCAweDVGOTcsIDB4NUZCMywgMHg2RDlDLCAweDcyNzksIDB4Nzc2MywgMHg3OUJGLCAweDdCRTQsCisgICAgMHg2QkQyLCAweDcyRUMsIDB4OEFBRCwgMHg2ODAzLCAweDZBNjEsIDB4NTFGOCwgMHg3QTgxLCAweDY5MzQsIDB4NUM0QSwKKyAgICAweDlDRjYsIDB4ODJFQiwgMHg1QkM1LCAweDkxNDksIDB4NzAxRSwgMHg1Njc4LCAweDVDNkYsIDB4NjBDNywgMHg2NTY2LAorICAgIDB4NkM4QywgMHg4QzVBLCAweDkwNDEsIDB4OTgxMywgMHg1NDUxLCAweDY2QzcsIDB4OTIwRCwgMHg1OTQ4LCAweDkwQTMsCisgICAgMHg1MTg1LCAweDRFNEQsIDB4NTFFQSwgMHg4NTk5LCAweDhCMEUsIDB4NzA1OCwgMHg2MzdBLCAweDkzNEIsIDB4Njk2MiwKKyAgICAweDk5QjQsIDB4N0UwNCwgMHg3NTc3LCAweDUzNTcsIDB4Njk2MCwgMHg4RURGLCAweDk2RTMsIDB4NkM1RCwgMHg0RThDLAorICAgIDB4NUMzQywgMHg1RjEwLCAweDhGRTksIDB4NTMwMiwgMHg4Q0QxLCAweDgwODksIDB4ODY3OSwgMHg1RUZGLCAweDY1RTUsCisgICAgMHg0RTczLCAweDUxNjUsIDB4NTk4MiwgMHg1QzNGLCAweDk3RUUsIDB4NEVGQiwgMHg1OThBLCAweDVGQ0QsIDB4OEE4RCwKKyAgICAweDZGRTEsIDB4NzlCMCwgMHg3OTYyLCAweDVCRTcsIDB4ODQ3MSwgMHg3MzJCLCAweDcxQjEsIDB4NUU3NCwgMHg1RkY1LAorICAgIDB4NjM3QiwgMHg2NDlBLCAweDcxQzMsIDB4N0M5OCwgMHg0RTQzLCAweDVFRkMsIDB4NEU0QiwgMHg1N0RDLCAweDU2QTIsCisgICAgMHg2MEE5LCAweDZGQzMsIDB4N0QwRCwgMHg4MEZELCAweDgxMzMsIDB4ODFCRiwgMHg4RkIyLCAweDg5OTcsIDB4ODZBNCwKKyAgICAweDVERjQsIDB4NjI4QSwgMHg2NEFELCAweDg5ODcsIDB4Njc3NywgMHg2Q0UyLCAweDZEM0UsIDB4NzQzNiwgMHg3ODM0LAorICAgIDB4NUE0NiwgMHg3Rjc1LCAweDgyQUQsIDB4OTlBQywgMHg0RkYzLCAweDVFQzMsIDB4NjJERCwgMHg2MzkyLCAweDY1NTcsCisgICAgMHg2NzZGLCAweDc2QzMsIDB4NzI0QywgMHg4MENDLCAweDgwQkEsIDB4OEYyOSwgMHg5MTRELCAweDUwMEQsIDB4NTdGOSwKKyAgICAweDVBOTIsIDB4Njg4NSwgMHg2OTczLCAweDcxNjQsIDB4NzJGRCwgMHg4Q0I3LCAweDU4RjIsIDB4OENFMCwgMHg5NjZBLAorICAgIDB4OTAxOSwgMHg4NzdGLCAweDc5RTQsIDB4NzdFNywgMHg4NDI5LCAweDRGMkYsIDB4NTI2NSwgMHg1MzVBLCAweDYyQ0QsCisgICAgMHg2N0NGLCAweDZDQ0EsIDB4NzY3RCwgMHg3Qjk0LCAweDdDOTUsIDB4ODIzNiwgMHg4NTg0LCAweDhGRUIsIDB4NjZERCwKKyAgICAweDZGMjAsIDB4NzIwNiwgMHg3RTFCLCAweDgzQUIsIDB4OTlDMSwgMHg5RUE2LCAweDUxRkQsIDB4N0JCMSwgMHg3ODcyLAorICAgIDB4N0JCOCwgMHg4MDg3LCAweDdCNDgsIDB4NkFFOCwgMHg1RTYxLCAweDgwOEMsIDB4NzU1MSwgMHg3NTYwLCAweDUxNkIsCisgICAgMHg5MjYyLCAweDZFOEMsIDB4NzY3QSwgMHg5MTk3LCAweDlBRUEsIDB4NEYxMCwgMHg3RjcwLCAweDYyOUMsIDB4N0I0RiwKKyAgICAweDk1QTUsIDB4OUNFOSwgMHg1NjdBLCAweDU4NTksIDB4ODZFNCwgMHg5NkJDLCAweDRGMzQsIDB4NTIyNCwgMHg1MzRBLAorICAgIDB4NTNDRCwgMHg1M0RCLCAweDVFMDYsIDB4NjQyQywgMHg2NTkxLCAweDY3N0YsIDB4NkMzRSwgMHg2QzRFLCAweDcyNDgsCisgICAgMHg3MkFGLCAweDczRUQsIDB4NzU1NCwgMHg3RTQxLCAweDgyMkMsIDB4ODVFOSwgMHg4Q0E5LCAweDdCQzQsIDB4OTFDNiwKKyAgICAweDcxNjksIDB4OTgxMiwgMHg5OEVGLCAweDYzM0QsIDB4NjY2OSwgMHg3NTZBLCAweDc2RTQsIDB4NzhEMCwgMHg4NTQzLAorICAgIDB4ODZFRSwgMHg1MzJBLCAweDUzNTEsIDB4NTQyNiwgMHg1OTgzLCAweDVFODcsIDB4NUY3QywgMHg2MEIyLCAweDYyNDksCisgICAgMHg2Mjc5LCAweDYyQUIsIDB4NjU5MCwgMHg2QkQ0LCAweDZDQ0MsIDB4NzVCMiwgMHg3NkFFLCAweDc4OTEsIDB4NzlEOCwKKyAgICAweDdEQ0IsIDB4N0Y3NywgMHg4MEE1LCAweDg4QUIsIDB4OEFCOSwgMHg4Q0JCLCAweDkwN0YsIDB4OTc1RSwgMHg5OERCLAorICAgIDB4NkEwQiwgMHg3QzM4LCAweDUwOTksIDB4NUMzRSwgMHg1RkFFLCAweDY3ODcsIDB4NkJEOCwgMHg3NDM1LCAweDc3MDksCisgICAgMHg3RjhFLCAweDlGM0IsIDB4NjdDQSwgMHg3QTE3LCAweDUzMzksIDB4NzU4QiwgMHg5QUVELCAweDVGNjYsIDB4ODE5RCwKKyAgICAweDgzRjEsIDB4ODA5OCwgMHg1RjNDLCAweDVGQzUsIDB4NzU2MiwgMHg3QjQ2LCAweDkwM0MsIDB4Njg2NywgMHg1OUVCLAorICAgIDB4NUE5QiwgMHg3RDEwLCAweDc2N0UsIDB4OEIyQywgMHg0RkY1LCAweDVGNkEsIDB4NkExOSwgMHg2QzM3LCAweDZGMDIsCisgICAgMHg3NEUyLCAweDc5NjgsIDB4ODg2OCwgMHg4QTU1LCAweDhDNzksIDB4NUVERiwgMHg2M0NGLCAweDc1QzUsIDB4NzlEMiwKKyAgICAweDgyRDcsIDB4OTMyOCwgMHg5MkYyLCAweDg0OUMsIDB4ODZFRCwgMHg5QzJELCAweDU0QzEsIDB4NUY2QywgMHg2NThDLAorICAgIDB4NkQ1QywgMHg3MDE1LCAweDhDQTcsIDB4OENEMywgMHg5ODNCLCAweDY1NEYsIDB4NzRGNiwgMHg0RTBELCAweDRFRDgsCisgICAgMHg1N0UwLCAweDU5MkIsIDB4NUE2NiwgMHg1QkNDLCAweDUxQTgsIDB4NUUwMywgMHg1RTlDLCAweDYwMTYsIDB4NjI3NiwKKyAgICAweDY1NzcsIDB4NjVBNywgMHg2NjZFLCAweDZENkUsIDB4NzIzNiwgMHg3QjI2LCAweDgxNTAsIDB4ODE5QSwgMHg4Mjk5LAorICAgIDB4OEI1QywgMHg4Q0EwLCAweDhDRTYsIDB4OEQ3NCwgMHg5NjFDLCAweDk2NDQsIDB4NEZBRSwgMHg2NEFCLCAweDZCNjYsCisgICAgMHg4MjFFLCAweDg0NjEsIDB4ODU2QSwgMHg5MEU4LCAweDVDMDEsIDB4Njk1MywgMHg5OEE4LCAweDg0N0EsIDB4ODU1NywKKyAgICAweDRGMEYsIDB4NTI2RiwgMHg1RkE5LCAweDVFNDUsIDB4NjcwRCwgMHg3OThGLCAweDgxNzksIDB4ODkwNywgMHg4OTg2LAorICAgIDB4NkRGNSwgMHg1RjE3LCAweDYyNTUsIDB4NkNCOCwgMHg0RUNGLCAweDcyNjksIDB4OUI5MiwgMHg1MjA2LCAweDU0M0IsCisgICAgMHg1Njc0LCAweDU4QjMsIDB4NjFBNCwgMHg2MjZFLCAweDcxMUEsIDB4NTk2RSwgMHg3Qzg5LCAweDdDREUsIDB4N0QxQiwKKyAgICAweDk2RjAsIDB4NjU4NywgMHg4MDVFLCAweDRFMTksIDB4NEY3NSwgMHg1MTc1LCAweDU4NDAsIDB4NUU2MywgMHg1RTczLAorICAgIDB4NUYwQSwgMHg2N0M0LCAweDRFMjYsIDB4ODUzRCwgMHg5NTg5LCAweDk2NUIsIDB4N0M3MywgMHg5ODAxLCAweDUwRkIsCisgICAgMHg1OEMxLCAweDc2NTYsIDB4NzhBNywgMHg1MjI1LCAweDc3QTUsIDB4ODUxMSwgMHg3Qjg2LCAweDUwNEYsIDB4NTkwOSwKKyAgICAweDcyNDcsIDB4N0JDNywgMHg3REU4LCAweDhGQkEsIDB4OEZENCwgMHg5MDRELCAweDRGQkYsIDB4NTJDOSwgMHg1QTI5LAorICAgIDB4NUYwMSwgMHg5N0FELCAweDRGREQsIDB4ODIxNywgMHg5MkVBLCAweDU3MDMsIDB4NjM1NSwgMHg2QjY5LCAweDc1MkIsCisgICAgMHg4OERDLCAweDhGMTQsIDB4N0E0MiwgMHg1MkRGLCAweDU4OTMsIDB4NjE1NSwgMHg2MjBBLCAweDY2QUUsIDB4NkJDRCwKKyAgICAweDdDM0YsIDB4ODNFOSwgMHg1MDIzLCAweDRGRjgsIDB4NTMwNSwgMHg1NDQ2LCAweDU4MzEsIDB4NTk0OSwgMHg1QjlELAorICAgIDB4NUNGMCwgMHg1Q0VGLCAweDVEMjksIDB4NUU5NiwgMHg2MkIxLCAweDYzNjcsIDB4NjUzRSwgMHg2NUI5LCAweDY3MEIsCisgICAgMHg2Q0Q1LCAweDZDRTEsIDB4NzBGOSwgMHg3ODMyLCAweDdFMkIsIDB4ODBERSwgMHg4MkIzLCAweDg0MEMsIDB4ODRFQywKKyAgICAweDg3MDIsIDB4ODkxMiwgMHg4QTJBLCAweDhDNEEsIDB4OTBBNiwgMHg5MkQyLCAweDk4RkQsIDB4OUNGMywgMHg5RDZDLAorICAgIDB4NEU0RiwgMHg0RUExLCAweDUwOEQsIDB4NTI1NiwgMHg1NzRBLCAweDU5QTgsIDB4NUUzRCwgMHg1RkQ4LCAweDVGRDksCisgICAgMHg2MjNGLCAweDY2QjQsIDB4NjcxQiwgMHg2N0QwLCAweDY4RDIsIDB4NTE5MiwgMHg3RDIxLCAweDgwQUEsIDB4ODFBOCwKKyAgICAweDhCMDAsIDB4OEM4QywgMHg4Q0JGLCAweDkyN0UsIDB4OTYzMiwgMHg1NDIwLCAweDk4MkMsIDB4NTMxNywgMHg1MEQ1LAorICAgIDB4NTM1QywgMHg1OEE4LCAweDY0QjIsIDB4NjczNCwgMHg3MjY3LCAweDc3NjYsIDB4N0E0NiwgMHg5MUU2LCAweDUyQzMsCisgICAgMHg2Q0ExLCAweDZCODYsIDB4NTgwMCwgMHg1RTRDLCAweDU5NTQsIDB4NjcyQywgMHg3RkZCLCAweDUxRTEsIDB4NzZDNiwKKyAgICAweDY0NjksIDB4NzhFOCwgMHg5QjU0LCAweDlFQkIsIDB4NTdDQiwgMHg1OUI5LCAweDY2MjcsIDB4Njc5QSwgMHg2QkNFLAorICAgIDB4NTRFOSwgMHg2OUQ5LCAweDVFNTUsIDB4ODE5QywgMHg2Nzk1LCAweDlCQUEsIDB4NjdGRSwgMHg5QzUyLCAweDY4NUQsCisgICAgMHg0RUE2LCAweDRGRTMsIDB4NTNDOCwgMHg2MkI5LCAweDY3MkIsIDB4NkNBQiwgMHg4RkM0LCAweDRGQUQsIDB4N0U2RCwKKyAgICAweDlFQkYsIDB4NEUwNywgMHg2MTYyLCAweDZFODAsIDB4NkYyQiwgMHg4NTEzLCAweDU0NzMsIDB4NjcyQSwgMHg5QjQ1LAorICAgIDB4NURGMywgMHg3Qjk1LCAweDVDQUMsIDB4NUJDNiwgMHg4NzFDLCAweDZFNEEsIDB4ODREMSwgMHg3QTE0LCAweDgxMDgsCisgICAgMHg1OTk5LCAweDdDOEQsIDB4NkMxMSwgMHg3NzIwLCAweDUyRDksIDB4NTkyMiwgMHg3MTIxLCAweDcyNUYsIDB4NzdEQiwKKyAgICAweDk3MjcsIDB4OUQ2MSwgMHg2OTBCLCAweDVBN0YsIDB4NUExOCwgMHg1MUE1LCAweDU0MEQsIDB4NTQ3RCwgMHg2NjBFLAorICAgIDB4NzZERiwgMHg4RkY3LCAweDkyOTgsIDB4OUNGNCwgMHg1OUVBLCAweDcyNUQsIDB4NkVDNSwgMHg1MTRELCAweDY4QzksCisgICAgMHg3REJGLCAweDdERUMsIDB4OTc2MiwgMHg5RUJBLCAweDY0NzgsIDB4NkEyMSwgMHg4MzAyLCAweDU5ODQsIDB4NUI1RiwKKyAgICAweDZCREIsIDB4NzMxQiwgMHg3NkYyLCAweDdEQjIsIDB4ODAxNywgMHg4NDk5LCAweDUxMzIsIDB4NjcyOCwgMHg5RUQ5LAorICAgIDB4NzZFRSwgMHg2NzYyLCAweDUyRkYsIDB4OTkwNSwgMHg1QzI0LCAweDYyM0IsIDB4N0M3RSwgMHg4Q0IwLCAweDU1NEYsCisgICAgMHg2MEI2LCAweDdEMEIsIDB4OTU4MCwgMHg1MzAxLCAweDRFNUYsIDB4NTFCNiwgMHg1OTFDLCAweDcyM0EsIDB4ODAzNiwKKyAgICAweDkxQ0UsIDB4NUYyNSwgMHg3N0UyLCAweDUzODQsIDB4NUY3OSwgMHg3RDA0LCAweDg1QUMsIDB4OEEzMywgMHg4RThELAorICAgIDB4OTc1NiwgMHg2N0YzLCAweDg1QUUsIDB4OTQ1MywgMHg2MTA5LCAweDYxMDgsIDB4NkNCOSwgMHg3NjUyLCAweDhBRUQsCisgICAgMHg4RjM4LCAweDU1MkYsIDB4NEY1MSwgMHg1MTJBLCAweDUyQzcsIDB4NTNDQiwgMHg1QkE1LCAweDVFN0QsIDB4NjBBMCwKKyAgICAweDYxODIsIDB4NjNENiwgMHg2NzA5LCAweDY3REEsIDB4NkU2NywgMHg2RDhDLCAweDczMzYsIDB4NzMzNywgMHg3NTMxLAorICAgIDB4Nzk1MCwgMHg4OEQ1LCAweDhBOTgsIDB4OTA0QSwgMHg5MDkxLCAweDkwRjUsIDB4OTZDNCwgMHg4NzhELCAweDU5MTUsCisgICAgMHg0RTg4LCAweDRGNTksIDB4NEUwRSwgMHg4QTg5LCAweDhGM0YsIDB4OTgxMCwgMHg1MEFELCAweDVFN0MsIDB4NTk5NiwKKyAgICAweDVCQjksIDB4NUVCOCwgMHg2M0RBLCAweDYzRkEsIDB4NjRDMSwgMHg2NkRDLCAweDY5NEEsIDB4NjlEOCwgMHg2RDBCLAorICAgIDB4NkVCNiwgMHg3MTk0LCAweDc1MjgsIDB4N0FBRiwgMHg3RjhBLCAweDgwMDAsIDB4ODQ0OSwgMHg4NEM5LCAweDg5ODEsCisgICAgMHg4QjIxLCAweDhFMEEsIDB4OTA2NSwgMHg5NjdELCAweDk5MEEsIDB4NjE3RSwgMHg2MjkxLCAweDZCMzIsIDB4NkM4MywKKyAgICAweDZENzQsIDB4N0ZDQywgMHg3RkZDLCAweDZEQzAsIDB4N0Y4NSwgMHg4N0JBLCAweDg4RjgsIDB4Njc2NSwgMHg4M0IxLAorICAgIDB4OTgzQywgMHg5NkY3LCAweDZEMUIsIDB4N0Q2MSwgMHg4NDNELCAweDkxNkEsIDB4NEU3MSwgMHg1Mzc1LCAweDVENTAsCisgICAgMHg2QjA0LCAweDZGRUIsIDB4ODVDRCwgMHg4NjJELCAweDg5QTcsIDB4NTIyOSwgMHg1NDBGLCAweDVDNjUsIDB4Njc0RSwKKyAgICAweDY4QTgsIDB4NzQwNiwgMHg3NDgzLCAweDc1RTIsIDB4ODhDRiwgMHg4OEUxLCAweDkxQ0MsIDB4OTZFMiwgMHg5Njc4LAorICAgIDB4NUY4QiwgMHg3Mzg3LCAweDdBQ0IsIDB4ODQ0RSwgMHg2M0EwLCAweDc1NjUsIDB4NTI4OSwgMHg2RDQxLCAweDZFOUMsCisgICAgMHg3NDA5LCAweDc1NTksIDB4Nzg2QiwgMHg3QzkyLCAweDk2ODYsIDB4N0FEQywgMHg5RjhELCAweDRGQjYsIDB4NjE2RSwKKyAgICAweDY1QzUsIDB4ODY1QywgMHg0RTg2LCAweDRFQUUsIDB4NTBEQSwgMHg0RTIxLCAweDUxQ0MsIDB4NUJFRSwgMHg2NTk5LAorICAgIDB4Njg4MSwgMHg2REJDLCAweDczMUYsIDB4NzY0MiwgMHg3N0FELCAweDdBMUMsIDB4N0NFNywgMHg4MjZGLCAweDhBRDIsCisgICAgMHg5MDdDLCAweDkxQ0YsIDB4OTY3NSwgMHg5ODE4LCAweDUyOUIsIDB4N0REMSwgMHg1MDJCLCAweDUzOTgsIDB4Njc5NywKKyAgICAweDZEQ0IsIDB4NzFEMCwgMHg3NDMzLCAweDgxRTgsIDB4OEYyQSwgMHg5NkEzLCAweDlDNTcsIDB4OUU5RiwgMHg3NDYwLAorICAgIDB4NTg0MSwgMHg2RDk5LCAweDdEMkYsIDB4OTg1RSwgMHg0RUU0LCAweDRGMzYsIDB4NEY4QiwgMHg1MUI3LCAweDUyQjEsCisgICAgMHg1REJBLCAweDYwMUMsIDB4NzNCMiwgMHg3OTNDLCAweDgyRDMsIDB4OTIzNCwgMHg5NkI3LCAweDk2RjYsIDB4OTcwQSwKKyAgICAweDlFOTcsIDB4OUY2MiwgMHg2NkE2LCAweDZCNzQsIDB4NTIxNywgMHg1MkEzLCAweDcwQzgsIDB4ODhDMiwgMHg1RUM5LAorICAgIDB4NjA0QiwgMHg2MTkwLCAweDZGMjMsIDB4NzE0OSwgMHg3QzNFLCAweDdERjQsIDB4ODA2RiwgMHg4NEVFLCAweDkwMjMsCisgICAgMHg5MzJDLCAweDU0NDIsIDB4OUI2RiwgMHg2QUQzLCAweDcwODksIDB4OENDMiwgMHg4REVGLCAweDk3MzIsIDB4NTJCNCwKKyAgICAweDVBNDEsIDB4NUVDQSwgMHg1RjA0LCAweDY3MTcsIDB4Njk3QywgMHg2OTk0LCAweDZENkEsIDB4NkYwRiwgMHg3MjYyLAorICAgIDB4NzJGQywgMHg3QkVELCAweDgwMDEsIDB4ODA3RSwgMHg4NzRCLCAweDkwQ0UsIDB4NTE2RCwgMHg5RTkzLCAweDc5ODQsCisgICAgMHg4MDhCLCAweDkzMzIsIDB4OEFENiwgMHg1MDJELCAweDU0OEMsIDB4OEE3MSwgMHg2QjZBLCAweDhDQzQsIDB4ODEwNywKKyAgICAweDYwRDEsIDB4NjdBMCwgMHg5REYyLCAweDRFOTksIDB4NEU5OCwgMHg5QzEwLCAweDhBNkIsIDB4ODVDMSwgMHg4NTY4LAorICAgIDB4NjkwMCwgMHg2RTdFLCAweDc4OTcsIDB4ODE1NSwgMHg1RjBDLCAweDRFMTAsIDB4NEUxNSwgMHg0RTJBLCAweDRFMzEsCisgICAgMHg0RTM2LCAweDRFM0MsIDB4NEUzRiwgMHg0RTQyLCAweDRFNTYsIDB4NEU1OCwgMHg0RTgyLCAweDRFODUsIDB4OEM2QiwKKyAgICAweDRFOEEsIDB4ODIxMiwgMHg1RjBELCAweDRFOEUsIDB4NEU5RSwgMHg0RTlGLCAweDRFQTAsIDB4NEVBMiwgMHg0RUIwLAorICAgIDB4NEVCMywgMHg0RUI2LCAweDRFQ0UsIDB4NEVDRCwgMHg0RUM0LCAweDRFQzYsIDB4NEVDMiwgMHg0RUQ3LCAweDRFREUsCisgICAgMHg0RUVELCAweDRFREYsIDB4NEVGNywgMHg0RjA5LCAweDRGNUEsIDB4NEYzMCwgMHg0RjVCLCAweDRGNUQsIDB4NEY1NywKKyAgICAweDRGNDcsIDB4NEY3NiwgMHg0Rjg4LCAweDRGOEYsIDB4NEY5OCwgMHg0RjdCLCAweDRGNjksIDB4NEY3MCwgMHg0RjkxLAorICAgIDB4NEY2RiwgMHg0Rjg2LCAweDRGOTYsIDB4NTExOCwgMHg0RkQ0LCAweDRGREYsIDB4NEZDRSwgMHg0RkQ4LCAweDRGREIsCisgICAgMHg0RkQxLCAweDRGREEsIDB4NEZEMCwgMHg0RkU0LCAweDRGRTUsIDB4NTAxQSwgMHg1MDI4LCAweDUwMTQsIDB4NTAyQSwKKyAgICAweDUwMjUsIDB4NTAwNSwgMHg0RjFDLCAweDRGRjYsIDB4NTAyMSwgMHg1MDI5LCAweDUwMkMsIDB4NEZGRSwgMHg0RkVGLAorICAgIDB4NTAxMSwgMHg1MDA2LCAweDUwNDMsIDB4NTA0NywgMHg2NzAzLCAweDUwNTUsIDB4NTA1MCwgMHg1MDQ4LCAweDUwNUEsCisgICAgMHg1MDU2LCAweDUwNkMsIDB4NTA3OCwgMHg1MDgwLCAweDUwOUEsIDB4NTA4NSwgMHg1MEI0LCAweDUwQjIsIDB4NTBDOSwKKyAgICAweDUwQ0EsIDB4NTBCMywgMHg1MEMyLCAweDUwRDYsIDB4NTBERSwgMHg1MEU1LCAweDUwRUQsIDB4NTBFMywgMHg1MEVFLAorICAgIDB4NTBGOSwgMHg1MEY1LCAweDUxMDksIDB4NTEwMSwgMHg1MTAyLCAweDUxMTYsIDB4NTExNSwgMHg1MTE0LCAweDUxMUEsCisgICAgMHg1MTIxLCAweDUxM0EsIDB4NTEzNywgMHg1MTNDLCAweDUxM0IsIDB4NTEzRiwgMHg1MTQwLCAweDUxNTIsIDB4NTE0QywKKyAgICAweDUxNTQsIDB4NTE2MiwgMHg3QUY4LCAweDUxNjksIDB4NTE2QSwgMHg1MTZFLCAweDUxODAsIDB4NTE4MiwgMHg1NkQ4LAorICAgIDB4NTE4QywgMHg1MTg5LCAweDUxOEYsIDB4NTE5MSwgMHg1MTkzLCAweDUxOTUsIDB4NTE5NiwgMHg1MUE0LCAweDUxQTYsCisgICAgMHg1MUEyLCAweDUxQTksIDB4NTFBQSwgMHg1MUFCLCAweDUxQjMsIDB4NTFCMSwgMHg1MUIyLCAweDUxQjAsIDB4NTFCNSwKKyAgICAweDUxQkQsIDB4NTFDNSwgMHg1MUM5LCAweDUxREIsIDB4NTFFMCwgMHg4NjU1LCAweDUxRTksIDB4NTFFRCwgMHg1MUYwLAorICAgIDB4NTFGNSwgMHg1MUZFLCAweDUyMDQsIDB4NTIwQiwgMHg1MjE0LCAweDUyMEUsIDB4NTIyNywgMHg1MjJBLCAweDUyMkUsCisgICAgMHg1MjMzLCAweDUyMzksIDB4NTI0RiwgMHg1MjQ0LCAweDUyNEIsIDB4NTI0QywgMHg1MjVFLCAweDUyNTQsIDB4NTI2QSwKKyAgICAweDUyNzQsIDB4NTI2OSwgMHg1MjczLCAweDUyN0YsIDB4NTI3RCwgMHg1MjhELCAweDUyOTQsIDB4NTI5MiwgMHg1MjcxLAorICAgIDB4NTI4OCwgMHg1MjkxLCAweDhGQTgsIDB4OEZBNywgMHg1MkFDLCAweDUyQUQsIDB4NTJCQywgMHg1MkI1LCAweDUyQzEsCisgICAgMHg1MkNELCAweDUyRDcsIDB4NTJERSwgMHg1MkUzLCAweDUyRTYsIDB4OThFRCwgMHg1MkUwLCAweDUyRjMsIDB4NTJGNSwKKyAgICAweDUyRjgsIDB4NTJGOSwgMHg1MzA2LCAweDUzMDgsIDB4NzUzOCwgMHg1MzBELCAweDUzMTAsIDB4NTMwRiwgMHg1MzE1LAorICAgIDB4NTMxQSwgMHg1MzIzLCAweDUzMkYsIDB4NTMzMSwgMHg1MzMzLCAweDUzMzgsIDB4NTM0MCwgMHg1MzQ2LCAweDUzNDUsCisgICAgMHg0RTE3LCAweDUzNDksIDB4NTM0RCwgMHg1MUQ2LCAweDUzNUUsIDB4NTM2OSwgMHg1MzZFLCAweDU5MTgsIDB4NTM3QiwKKyAgICAweDUzNzcsIDB4NTM4MiwgMHg1Mzk2LCAweDUzQTAsIDB4NTNBNiwgMHg1M0E1LCAweDUzQUUsIDB4NTNCMCwgMHg1M0I2LAorICAgIDB4NTNDMywgMHg3QzEyLCAweDk2RDksIDB4NTNERiwgMHg2NkZDLCAweDcxRUUsIDB4NTNFRSwgMHg1M0U4LCAweDUzRUQsCisgICAgMHg1M0ZBLCAweDU0MDEsIDB4NTQzRCwgMHg1NDQwLCAweDU0MkMsIDB4NTQyRCwgMHg1NDNDLCAweDU0MkUsIDB4NTQzNiwKKyAgICAweDU0MjksIDB4NTQxRCwgMHg1NDRFLCAweDU0OEYsIDB4NTQ3NSwgMHg1NDhFLCAweDU0NUYsIDB4NTQ3MSwgMHg1NDc3LAorICAgIDB4NTQ3MCwgMHg1NDkyLCAweDU0N0IsIDB4NTQ4MCwgMHg1NDc2LCAweDU0ODQsIDB4NTQ5MCwgMHg1NDg2LCAweDU0QzcsCisgICAgMHg1NEEyLCAweDU0QjgsIDB4NTRBNSwgMHg1NEFDLCAweDU0QzQsIDB4NTRDOCwgMHg1NEE4LCAweDU0QUIsIDB4NTRDMiwKKyAgICAweDU0QTQsIDB4NTRCRSwgMHg1NEJDLCAweDU0RDgsIDB4NTRFNSwgMHg1NEU2LCAweDU1MEYsIDB4NTUxNCwgMHg1NEZELAorICAgIDB4NTRFRSwgMHg1NEVELCAweDU0RkEsIDB4NTRFMiwgMHg1NTM5LCAweDU1NDAsIDB4NTU2MywgMHg1NTRDLCAweDU1MkUsCisgICAgMHg1NTVDLCAweDU1NDUsIDB4NTU1NiwgMHg1NTU3LCAweDU1MzgsIDB4NTUzMywgMHg1NTVELCAweDU1OTksIDB4NTU4MCwKKyAgICAweDU0QUYsIDB4NTU4QSwgMHg1NTlGLCAweDU1N0IsIDB4NTU3RSwgMHg1NTk4LCAweDU1OUUsIDB4NTVBRSwgMHg1NTdDLAorICAgIDB4NTU4MywgMHg1NUE5LCAweDU1ODcsIDB4NTVBOCwgMHg1NURBLCAweDU1QzUsIDB4NTVERiwgMHg1NUM0LCAweDU1REMsCisgICAgMHg1NUU0LCAweDU1RDQsIDB4NTYxNCwgMHg1NUY3LCAweDU2MTYsIDB4NTVGRSwgMHg1NUZELCAweDU2MUIsIDB4NTVGOSwKKyAgICAweDU2NEUsIDB4NTY1MCwgMHg3MURGLCAweDU2MzQsIDB4NTYzNiwgMHg1NjMyLCAweDU2MzgsIDB4NTY2QiwgMHg1NjY0LAorICAgIDB4NTYyRiwgMHg1NjZDLCAweDU2NkEsIDB4NTY4NiwgMHg1NjgwLCAweDU2OEEsIDB4NTZBMCwgMHg1Njk0LCAweDU2OEYsCisgICAgMHg1NkE1LCAweDU2QUUsIDB4NTZCNiwgMHg1NkI0LCAweDU2QzIsIDB4NTZCQywgMHg1NkMxLCAweDU2QzMsIDB4NTZDMCwKKyAgICAweDU2QzgsIDB4NTZDRSwgMHg1NkQxLCAweDU2RDMsIDB4NTZENywgMHg1NkVFLCAweDU2RjksIDB4NTcwMCwgMHg1NkZGLAorICAgIDB4NTcwNCwgMHg1NzA5LCAweDU3MDgsIDB4NTcwQiwgMHg1NzBELCAweDU3MTMsIDB4NTcxOCwgMHg1NzE2LCAweDU1QzcsCisgICAgMHg1NzFDLCAweDU3MjYsIDB4NTczNywgMHg1NzM4LCAweDU3NEUsIDB4NTczQiwgMHg1NzQwLCAweDU3NEYsIDB4NTc2OSwKKyAgICAweDU3QzAsIDB4NTc4OCwgMHg1NzYxLCAweDU3N0YsIDB4NTc4OSwgMHg1NzkzLCAweDU3QTAsIDB4NTdCMywgMHg1N0E0LAorICAgIDB4NTdBQSwgMHg1N0IwLCAweDU3QzMsIDB4NTdDNiwgMHg1N0Q0LCAweDU3RDIsIDB4NTdEMywgMHg1ODBBLCAweDU3RDYsCisgICAgMHg1N0UzLCAweDU4MEIsIDB4NTgxOSwgMHg1ODFELCAweDU4NzIsIDB4NTgyMSwgMHg1ODYyLCAweDU4NEIsIDB4NTg3MCwKKyAgICAweDZCQzAsIDB4NTg1MiwgMHg1ODNELCAweDU4NzksIDB4NTg4NSwgMHg1OEI5LCAweDU4OUYsIDB4NThBQiwgMHg1OEJBLAorICAgIDB4NThERSwgMHg1OEJCLCAweDU4QjgsIDB4NThBRSwgMHg1OEM1LCAweDU4RDMsIDB4NThEMSwgMHg1OEQ3LCAweDU4RDksCisgICAgMHg1OEQ4LCAweDU4RTUsIDB4NThEQywgMHg1OEU0LCAweDU4REYsIDB4NThFRiwgMHg1OEZBLCAweDU4RjksIDB4NThGQiwKKyAgICAweDU4RkMsIDB4NThGRCwgMHg1OTAyLCAweDU5MEEsIDB4NTkxMCwgMHg1OTFCLCAweDY4QTYsIDB4NTkyNSwgMHg1OTJDLAorICAgIDB4NTkyRCwgMHg1OTMyLCAweDU5MzgsIDB4NTkzRSwgMHg3QUQyLCAweDU5NTUsIDB4NTk1MCwgMHg1OTRFLCAweDU5NUEsCisgICAgMHg1OTU4LCAweDU5NjIsIDB4NTk2MCwgMHg1OTY3LCAweDU5NkMsIDB4NTk2OSwgMHg1OTc4LCAweDU5ODEsIDB4NTk5RCwKKyAgICAweDRGNUUsIDB4NEZBQiwgMHg1OUEzLCAweDU5QjIsIDB4NTlDNiwgMHg1OUU4LCAweDU5REMsIDB4NTk4RCwgMHg1OUQ5LAorICAgIDB4NTlEQSwgMHg1QTI1LCAweDVBMUYsIDB4NUExMSwgMHg1QTFDLCAweDVBMDksIDB4NUExQSwgMHg1QTQwLCAweDVBNkMsCisgICAgMHg1QTQ5LCAweDVBMzUsIDB4NUEzNiwgMHg1QTYyLCAweDVBNkEsIDB4NUE5QSwgMHg1QUJDLCAweDVBQkUsIDB4NUFDQiwKKyAgICAweDVBQzIsIDB4NUFCRCwgMHg1QUUzLCAweDVBRDcsIDB4NUFFNiwgMHg1QUU5LCAweDVBRDYsIDB4NUFGQSwgMHg1QUZCLAorICAgIDB4NUIwQywgMHg1QjBCLCAweDVCMTYsIDB4NUIzMiwgMHg1QUQwLCAweDVCMkEsIDB4NUIzNiwgMHg1QjNFLCAweDVCNDMsCisgICAgMHg1QjQ1LCAweDVCNDAsIDB4NUI1MSwgMHg1QjU1LCAweDVCNUEsIDB4NUI1QiwgMHg1QjY1LCAweDVCNjksIDB4NUI3MCwKKyAgICAweDVCNzMsIDB4NUI3NSwgMHg1Qjc4LCAweDY1ODgsIDB4NUI3QSwgMHg1QjgwLCAweDVCODMsIDB4NUJBNiwgMHg1QkI4LAorICAgIDB4NUJDMywgMHg1QkM3LCAweDVCQzksIDB4NUJENCwgMHg1QkQwLCAweDVCRTQsIDB4NUJFNiwgMHg1QkUyLCAweDVCREUsCisgICAgMHg1QkU1LCAweDVCRUIsIDB4NUJGMCwgMHg1QkY2LCAweDVCRjMsIDB4NUMwNSwgMHg1QzA3LCAweDVDMDgsIDB4NUMwRCwKKyAgICAweDVDMTMsIDB4NUMyMCwgMHg1QzIyLCAweDVDMjgsIDB4NUMzOCwgMHg1QzM5LCAweDVDNDEsIDB4NUM0NiwgMHg1QzRFLAorICAgIDB4NUM1MywgMHg1QzUwLCAweDVDNEYsIDB4NUI3MSwgMHg1QzZDLCAweDVDNkUsIDB4NEU2MiwgMHg1Qzc2LCAweDVDNzksCisgICAgMHg1QzhDLCAweDVDOTEsIDB4NUM5NCwgMHg1OTlCLCAweDVDQUIsIDB4NUNCQiwgMHg1Q0I2LCAweDVDQkMsIDB4NUNCNywKKyAgICAweDVDQzUsIDB4NUNCRSwgMHg1Q0M3LCAweDVDRDksIDB4NUNFOSwgMHg1Q0ZELCAweDVDRkEsIDB4NUNFRCwgMHg1RDhDLAorICAgIDB4NUNFQSwgMHg1RDBCLCAweDVEMTUsIDB4NUQxNywgMHg1RDVDLCAweDVEMUYsIDB4NUQxQiwgMHg1RDExLCAweDVEMTQsCisgICAgMHg1RDIyLCAweDVEMUEsIDB4NUQxOSwgMHg1RDE4LCAweDVENEMsIDB4NUQ1MiwgMHg1RDRFLCAweDVENEIsIDB4NUQ2QywKKyAgICAweDVENzMsIDB4NUQ3NiwgMHg1RDg3LCAweDVEODQsIDB4NUQ4MiwgMHg1REEyLCAweDVEOUQsIDB4NURBQywgMHg1REFFLAorICAgIDB4NURCRCwgMHg1RDkwLCAweDVEQjcsIDB4NURCQywgMHg1REM5LCAweDVEQ0QsIDB4NUREMywgMHg1REQyLCAweDVERDYsCisgICAgMHg1RERCLCAweDVERUIsIDB4NURGMiwgMHg1REY1LCAweDVFMEIsIDB4NUUxQSwgMHg1RTE5LCAweDVFMTEsIDB4NUUxQiwKKyAgICAweDVFMzYsIDB4NUUzNywgMHg1RTQ0LCAweDVFNDMsIDB4NUU0MCwgMHg1RTRFLCAweDVFNTcsIDB4NUU1NCwgMHg1RTVGLAorICAgIDB4NUU2MiwgMHg1RTY0LCAweDVFNDcsIDB4NUU3NSwgMHg1RTc2LCAweDVFN0EsIDB4OUVCQywgMHg1RTdGLCAweDVFQTAsCisgICAgMHg1RUMxLCAweDVFQzIsIDB4NUVDOCwgMHg1RUQwLCAweDVFQ0YsIDB4NUVENiwgMHg1RUUzLCAweDVFREQsIDB4NUVEQSwKKyAgICAweDVFREIsIDB4NUVFMiwgMHg1RUUxLCAweDVFRTgsIDB4NUVFOSwgMHg1RUVDLCAweDVFRjEsIDB4NUVGMywgMHg1RUYwLAorICAgIDB4NUVGNCwgMHg1RUY4LCAweDVFRkUsIDB4NUYwMywgMHg1RjA5LCAweDVGNUQsIDB4NUY1QywgMHg1RjBCLCAweDVGMTEsCisgICAgMHg1RjE2LCAweDVGMjksIDB4NUYyRCwgMHg1RjM4LCAweDVGNDEsIDB4NUY0OCwgMHg1RjRDLCAweDVGNEUsIDB4NUYyRiwKKyAgICAweDVGNTEsIDB4NUY1NiwgMHg1RjU3LCAweDVGNTksIDB4NUY2MSwgMHg1RjZELCAweDVGNzMsIDB4NUY3NywgMHg1RjgzLAorICAgIDB4NUY4MiwgMHg1RjdGLCAweDVGOEEsIDB4NUY4OCwgMHg1RjkxLCAweDVGODcsIDB4NUY5RSwgMHg1Rjk5LCAweDVGOTgsCisgICAgMHg1RkEwLCAweDVGQTgsIDB4NUZBRCwgMHg1RkJDLCAweDVGRDYsIDB4NUZGQiwgMHg1RkU0LCAweDVGRjgsIDB4NUZGMSwKKyAgICAweDVGREQsIDB4NjBCMywgMHg1RkZGLCAweDYwMjEsIDB4NjA2MCwgMHg2MDE5LCAweDYwMTAsIDB4NjAyOSwgMHg2MDBFLAorICAgIDB4NjAzMSwgMHg2MDFCLCAweDYwMTUsIDB4NjAyQiwgMHg2MDI2LCAweDYwMEYsIDB4NjAzQSwgMHg2MDVBLCAweDYwNDEsCisgICAgMHg2MDZBLCAweDYwNzcsIDB4NjA1RiwgMHg2MDRBLCAweDYwNDYsIDB4NjA0RCwgMHg2MDYzLCAweDYwNDMsIDB4NjA2NCwKKyAgICAweDYwNDIsIDB4NjA2QywgMHg2MDZCLCAweDYwNTksIDB4NjA4MSwgMHg2MDhELCAweDYwRTcsIDB4NjA4MywgMHg2MDlBLAorICAgIDB4NjA4NCwgMHg2MDlCLCAweDYwOTYsIDB4NjA5NywgMHg2MDkyLCAweDYwQTcsIDB4NjA4QiwgMHg2MEUxLCAweDYwQjgsCisgICAgMHg2MEUwLCAweDYwRDMsIDB4NjBCNCwgMHg1RkYwLCAweDYwQkQsIDB4NjBDNiwgMHg2MEI1LCAweDYwRDgsIDB4NjE0RCwKKyAgICAweDYxMTUsIDB4NjEwNiwgMHg2MEY2LCAweDYwRjcsIDB4NjEwMCwgMHg2MEY0LCAweDYwRkEsIDB4NjEwMywgMHg2MTIxLAorICAgIDB4NjBGQiwgMHg2MEYxLCAweDYxMEQsIDB4NjEwRSwgMHg2MTQ3LCAweDYxM0UsIDB4NjEyOCwgMHg2MTI3LCAweDYxNEEsCisgICAgMHg2MTNGLCAweDYxM0MsIDB4NjEyQywgMHg2MTM0LCAweDYxM0QsIDB4NjE0MiwgMHg2MTQ0LCAweDYxNzMsIDB4NjE3NywKKyAgICAweDYxNTgsIDB4NjE1OSwgMHg2MTVBLCAweDYxNkIsIDB4NjE3NCwgMHg2MTZGLCAweDYxNjUsIDB4NjE3MSwgMHg2MTVGLAorICAgIDB4NjE1RCwgMHg2MTUzLCAweDYxNzUsIDB4NjE5OSwgMHg2MTk2LCAweDYxODcsIDB4NjFBQywgMHg2MTk0LCAweDYxOUEsCisgICAgMHg2MThBLCAweDYxOTEsIDB4NjFBQiwgMHg2MUFFLCAweDYxQ0MsIDB4NjFDQSwgMHg2MUM5LCAweDYxRjcsIDB4NjFDOCwKKyAgICAweDYxQzMsIDB4NjFDNiwgMHg2MUJBLCAweDYxQ0IsIDB4N0Y3OSwgMHg2MUNELCAweDYxRTYsIDB4NjFFMywgMHg2MUY2LAorICAgIDB4NjFGQSwgMHg2MUY0LCAweDYxRkYsIDB4NjFGRCwgMHg2MUZDLCAweDYxRkUsIDB4NjIwMCwgMHg2MjA4LCAweDYyMDksCisgICAgMHg2MjBELCAweDYyMEMsIDB4NjIxNCwgMHg2MjFCLCAweDYyMUUsIDB4NjIyMSwgMHg2MjJBLCAweDYyMkUsIDB4NjIzMCwKKyAgICAweDYyMzIsIDB4NjIzMywgMHg2MjQxLCAweDYyNEUsIDB4NjI1RSwgMHg2MjYzLCAweDYyNUIsIDB4NjI2MCwgMHg2MjY4LAorICAgIDB4NjI3QywgMHg2MjgyLCAweDYyODksIDB4NjI3RSwgMHg2MjkyLCAweDYyOTMsIDB4NjI5NiwgMHg2MkQ0LCAweDYyODMsCisgICAgMHg2Mjk0LCAweDYyRDcsIDB4NjJEMSwgMHg2MkJCLCAweDYyQ0YsIDB4NjJGRiwgMHg2MkM2LCAweDY0RDQsIDB4NjJDOCwKKyAgICAweDYyREMsIDB4NjJDQywgMHg2MkNBLCAweDYyQzIsIDB4NjJDNywgMHg2MjlCLCAweDYyQzksIDB4NjMwQywgMHg2MkVFLAorICAgIDB4NjJGMSwgMHg2MzI3LCAweDYzMDIsIDB4NjMwOCwgMHg2MkVGLCAweDYyRjUsIDB4NjM1MCwgMHg2MzNFLCAweDYzNEQsCisgICAgMHg2NDFDLCAweDYzNEYsIDB4NjM5NiwgMHg2MzhFLCAweDYzODAsIDB4NjNBQiwgMHg2Mzc2LCAweDYzQTMsIDB4NjM4RiwKKyAgICAweDYzODksIDB4NjM5RiwgMHg2M0I1LCAweDYzNkIsIDB4NjM2OSwgMHg2M0JFLCAweDYzRTksIDB4NjNDMCwgMHg2M0M2LAorICAgIDB4NjNFMywgMHg2M0M5LCAweDYzRDIsIDB4NjNGNiwgMHg2M0M0LCAweDY0MTYsIDB4NjQzNCwgMHg2NDA2LCAweDY0MTMsCisgICAgMHg2NDI2LCAweDY0MzYsIDB4NjUxRCwgMHg2NDE3LCAweDY0MjgsIDB4NjQwRiwgMHg2NDY3LCAweDY0NkYsIDB4NjQ3NiwKKyAgICAweDY0NEUsIDB4NjUyQSwgMHg2NDk1LCAweDY0OTMsIDB4NjRBNSwgMHg2NEE5LCAweDY0ODgsIDB4NjRCQywgMHg2NERBLAorICAgIDB4NjREMiwgMHg2NEM1LCAweDY0QzcsIDB4NjRCQiwgMHg2NEQ4LCAweDY0QzIsIDB4NjRGMSwgMHg2NEU3LCAweDgyMDksCisgICAgMHg2NEUwLCAweDY0RTEsIDB4NjJBQywgMHg2NEUzLCAweDY0RUYsIDB4NjUyQywgMHg2NEY2LCAweDY0RjQsIDB4NjRGMiwKKyAgICAweDY0RkEsIDB4NjUwMCwgMHg2NEZELCAweDY1MTgsIDB4NjUxQywgMHg2NTA1LCAweDY1MjQsIDB4NjUyMywgMHg2NTJCLAorICAgIDB4NjUzNCwgMHg2NTM1LCAweDY1MzcsIDB4NjUzNiwgMHg2NTM4LCAweDc1NEIsIDB4NjU0OCwgMHg2NTU2LCAweDY1NTUsCisgICAgMHg2NTRELCAweDY1NTgsIDB4NjU1RSwgMHg2NTVELCAweDY1NzIsIDB4NjU3OCwgMHg2NTgyLCAweDY1ODMsIDB4OEI4QSwKKyAgICAweDY1OUIsIDB4NjU5RiwgMHg2NUFCLCAweDY1QjcsIDB4NjVDMywgMHg2NUM2LCAweDY1QzEsIDB4NjVDNCwgMHg2NUNDLAorICAgIDB4NjVEMiwgMHg2NURCLCAweDY1RDksIDB4NjVFMCwgMHg2NUUxLCAweDY1RjEsIDB4Njc3MiwgMHg2NjBBLCAweDY2MDMsCisgICAgMHg2NUZCLCAweDY3NzMsIDB4NjYzNSwgMHg2NjM2LCAweDY2MzQsIDB4NjYxQywgMHg2NjRGLCAweDY2NDQsIDB4NjY0OSwKKyAgICAweDY2NDEsIDB4NjY1RSwgMHg2NjVELCAweDY2NjQsIDB4NjY2NywgMHg2NjY4LCAweDY2NUYsIDB4NjY2MiwgMHg2NjcwLAorICAgIDB4NjY4MywgMHg2Njg4LCAweDY2OEUsIDB4NjY4OSwgMHg2Njg0LCAweDY2OTgsIDB4NjY5RCwgMHg2NkMxLCAweDY2QjksCisgICAgMHg2NkM5LCAweDY2QkUsIDB4NjZCQywgMHg2NkM0LCAweDY2QjgsIDB4NjZENiwgMHg2NkRBLCAweDY2RTAsIDB4NjYzRiwKKyAgICAweDY2RTYsIDB4NjZFOSwgMHg2NkYwLCAweDY2RjUsIDB4NjZGNywgMHg2NzBGLCAweDY3MTYsIDB4NjcxRSwgMHg2NzI2LAorICAgIDB4NjcyNywgMHg5NzM4LCAweDY3MkUsIDB4NjczRiwgMHg2NzM2LCAweDY3NDEsIDB4NjczOCwgMHg2NzM3LCAweDY3NDYsCisgICAgMHg2NzVFLCAweDY3NjAsIDB4Njc1OSwgMHg2NzYzLCAweDY3NjQsIDB4Njc4OSwgMHg2NzcwLCAweDY3QTksIDB4Njc3QywKKyAgICAweDY3NkEsIDB4Njc4QywgMHg2NzhCLCAweDY3QTYsIDB4NjdBMSwgMHg2Nzg1LCAweDY3QjcsIDB4NjdFRiwgMHg2N0I0LAorICAgIDB4NjdFQywgMHg2N0IzLCAweDY3RTksIDB4NjdCOCwgMHg2N0U0LCAweDY3REUsIDB4NjdERCwgMHg2N0UyLCAweDY3RUUsCisgICAgMHg2N0I5LCAweDY3Q0UsIDB4NjdDNiwgMHg2N0U3LCAweDZBOUMsIDB4NjgxRSwgMHg2ODQ2LCAweDY4MjksIDB4Njg0MCwKKyAgICAweDY4NEQsIDB4NjgzMiwgMHg2ODRFLCAweDY4QjMsIDB4NjgyQiwgMHg2ODU5LCAweDY4NjMsIDB4Njg3NywgMHg2ODdGLAorICAgIDB4Njg5RiwgMHg2ODhGLCAweDY4QUQsIDB4Njg5NCwgMHg2ODlELCAweDY4OUIsIDB4Njg4MywgMHg2QUFFLCAweDY4QjksCisgICAgMHg2ODc0LCAweDY4QjUsIDB4NjhBMCwgMHg2OEJBLCAweDY5MEYsIDB4Njg4RCwgMHg2ODdFLCAweDY5MDEsIDB4NjhDQSwKKyAgICAweDY5MDgsIDB4NjhEOCwgMHg2OTIyLCAweDY5MjYsIDB4NjhFMSwgMHg2OTBDLCAweDY4Q0QsIDB4NjhENCwgMHg2OEU3LAorICAgIDB4NjhENSwgMHg2OTM2LCAweDY5MTIsIDB4NjkwNCwgMHg2OEQ3LCAweDY4RTMsIDB4NjkyNSwgMHg2OEY5LCAweDY4RTAsCisgICAgMHg2OEVGLCAweDY5MjgsIDB4NjkyQSwgMHg2OTFBLCAweDY5MjMsIDB4NjkyMSwgMHg2OEM2LCAweDY5NzksIDB4Njk3NywKKyAgICAweDY5NUMsIDB4Njk3OCwgMHg2OTZCLCAweDY5NTQsIDB4Njk3RSwgMHg2OTZFLCAweDY5MzksIDB4Njk3NCwgMHg2OTNELAorICAgIDB4Njk1OSwgMHg2OTMwLCAweDY5NjEsIDB4Njk1RSwgMHg2OTVELCAweDY5ODEsIDB4Njk2QSwgMHg2OUIyLCAweDY5QUUsCisgICAgMHg2OUQwLCAweDY5QkYsIDB4NjlDMSwgMHg2OUQzLCAweDY5QkUsIDB4NjlDRSwgMHg1QkU4LCAweDY5Q0EsIDB4NjlERCwKKyAgICAweDY5QkIsIDB4NjlDMywgMHg2OUE3LCAweDZBMkUsIDB4Njk5MSwgMHg2OUEwLCAweDY5OUMsIDB4Njk5NSwgMHg2OUI0LAorICAgIDB4NjlERSwgMHg2OUU4LCAweDZBMDIsIDB4NkExQiwgMHg2OUZGLCAweDZCMEEsIDB4NjlGOSwgMHg2OUYyLCAweDY5RTcsCisgICAgMHg2QTA1LCAweDY5QjEsIDB4NkExRSwgMHg2OUVELCAweDZBMTQsIDB4NjlFQiwgMHg2QTBBLCAweDZBMTIsIDB4NkFDMSwKKyAgICAweDZBMjMsIDB4NkExMywgMHg2QTQ0LCAweDZBMEMsIDB4NkE3MiwgMHg2QTM2LCAweDZBNzgsIDB4NkE0NywgMHg2QTYyLAorICAgIDB4NkE1OSwgMHg2QTY2LCAweDZBNDgsIDB4NkEzOCwgMHg2QTIyLCAweDZBOTAsIDB4NkE4RCwgMHg2QUEwLCAweDZBODQsCisgICAgMHg2QUEyLCAweDZBQTMsIDB4NkE5NywgMHg4NjE3LCAweDZBQkIsIDB4NkFDMywgMHg2QUMyLCAweDZBQjgsIDB4NkFCMywKKyAgICAweDZBQUMsIDB4NkFERSwgMHg2QUQxLCAweDZBREYsIDB4NkFBQSwgMHg2QURBLCAweDZBRUEsIDB4NkFGQiwgMHg2QjA1LAorICAgIDB4ODYxNiwgMHg2QUZBLCAweDZCMTIsIDB4NkIxNiwgMHg5QjMxLCAweDZCMUYsIDB4NkIzOCwgMHg2QjM3LCAweDc2REMsCisgICAgMHg2QjM5LCAweDk4RUUsIDB4NkI0NywgMHg2QjQzLCAweDZCNDksIDB4NkI1MCwgMHg2QjU5LCAweDZCNTQsIDB4NkI1QiwKKyAgICAweDZCNUYsIDB4NkI2MSwgMHg2Qjc4LCAweDZCNzksIDB4NkI3RiwgMHg2QjgwLCAweDZCODQsIDB4NkI4MywgMHg2QjhELAorICAgIDB4NkI5OCwgMHg2Qjk1LCAweDZCOUUsIDB4NkJBNCwgMHg2QkFBLCAweDZCQUIsIDB4NkJBRiwgMHg2QkIyLCAweDZCQjEsCisgICAgMHg2QkIzLCAweDZCQjcsIDB4NkJCQywgMHg2QkM2LCAweDZCQ0IsIDB4NkJEMywgMHg2QkRGLCAweDZCRUMsIDB4NkJFQiwKKyAgICAweDZCRjMsIDB4NkJFRiwgMHg5RUJFLCAweDZDMDgsIDB4NkMxMywgMHg2QzE0LCAweDZDMUIsIDB4NkMyNCwgMHg2QzIzLAorICAgIDB4NkM1RSwgMHg2QzU1LCAweDZDNjIsIDB4NkM2QSwgMHg2QzgyLCAweDZDOEQsIDB4NkM5QSwgMHg2QzgxLCAweDZDOUIsCisgICAgMHg2QzdFLCAweDZDNjgsIDB4NkM3MywgMHg2QzkyLCAweDZDOTAsIDB4NkNDNCwgMHg2Q0YxLCAweDZDRDMsIDB4NkNCRCwKKyAgICAweDZDRDcsIDB4NkNDNSwgMHg2Q0RELCAweDZDQUUsIDB4NkNCMSwgMHg2Q0JFLCAweDZDQkEsIDB4NkNEQiwgMHg2Q0VGLAorICAgIDB4NkNEOSwgMHg2Q0VBLCAweDZEMUYsIDB4ODg0RCwgMHg2RDM2LCAweDZEMkIsIDB4NkQzRCwgMHg2RDM4LCAweDZEMTksCisgICAgMHg2RDM1LCAweDZEMzMsIDB4NkQxMiwgMHg2RDBDLCAweDZENjMsIDB4NkQ5MywgMHg2RDY0LCAweDZENUEsIDB4NkQ3OSwKKyAgICAweDZENTksIDB4NkQ4RSwgMHg2RDk1LCAweDZGRTQsIDB4NkQ4NSwgMHg2REY5LCAweDZFMTUsIDB4NkUwQSwgMHg2REI1LAorICAgIDB4NkRDNywgMHg2REU2LCAweDZEQjgsIDB4NkRDNiwgMHg2REVDLCAweDZEREUsIDB4NkRDQywgMHg2REU4LCAweDZERDIsCisgICAgMHg2REM1LCAweDZERkEsIDB4NkREOSwgMHg2REU0LCAweDZERDUsIDB4NkRFQSwgMHg2REVFLCAweDZFMkQsIDB4NkU2RSwKKyAgICAweDZFMkUsIDB4NkUxOSwgMHg2RTcyLCAweDZFNUYsIDB4NkUzRSwgMHg2RTIzLCAweDZFNkIsIDB4NkUyQiwgMHg2RTc2LAorICAgIDB4NkU0RCwgMHg2RTFGLCAweDZFNDMsIDB4NkUzQSwgMHg2RTRFLCAweDZFMjQsIDB4NkVGRiwgMHg2RTFELCAweDZFMzgsCisgICAgMHg2RTgyLCAweDZFQUEsIDB4NkU5OCwgMHg2RUM5LCAweDZFQjcsIDB4NkVEMywgMHg2RUJELCAweDZFQUYsIDB4NkVDNCwKKyAgICAweDZFQjIsIDB4NkVENCwgMHg2RUQ1LCAweDZFOEYsIDB4NkVBNSwgMHg2RUMyLCAweDZFOUYsIDB4NkY0MSwgMHg2RjExLAorICAgIDB4NzA0QywgMHg2RUVDLCAweDZFRjgsIDB4NkVGRSwgMHg2RjNGLCAweDZFRjIsIDB4NkYzMSwgMHg2RUVGLCAweDZGMzIsCisgICAgMHg2RUNDLCAweDZGM0UsIDB4NkYxMywgMHg2RUY3LCAweDZGODYsIDB4NkY3QSwgMHg2Rjc4LCAweDZGODEsIDB4NkY4MCwKKyAgICAweDZGNkYsIDB4NkY1QiwgMHg2RkYzLCAweDZGNkQsIDB4NkY4MiwgMHg2RjdDLCAweDZGNTgsIDB4NkY4RSwgMHg2RjkxLAorICAgIDB4NkZDMiwgMHg2RjY2LCAweDZGQjMsIDB4NkZBMywgMHg2RkExLCAweDZGQTQsIDB4NkZCOSwgMHg2RkM2LCAweDZGQUEsCisgICAgMHg2RkRGLCAweDZGRDUsIDB4NkZFQywgMHg2RkQ0LCAweDZGRDgsIDB4NkZGMSwgMHg2RkVFLCAweDZGREIsIDB4NzAwOSwKKyAgICAweDcwMEIsIDB4NkZGQSwgMHg3MDExLCAweDcwMDEsIDB4NzAwRiwgMHg2RkZFLCAweDcwMUIsIDB4NzAxQSwgMHg2Rjc0LAorICAgIDB4NzAxRCwgMHg3MDE4LCAweDcwMUYsIDB4NzAzMCwgMHg3MDNFLCAweDcwMzIsIDB4NzA1MSwgMHg3MDYzLCAweDcwOTksCisgICAgMHg3MDkyLCAweDcwQUYsIDB4NzBGMSwgMHg3MEFDLCAweDcwQjgsIDB4NzBCMywgMHg3MEFFLCAweDcwREYsIDB4NzBDQiwKKyAgICAweDcwREQsIDB4NzBEOSwgMHg3MTA5LCAweDcwRkQsIDB4NzExQywgMHg3MTE5LCAweDcxNjUsIDB4NzE1NSwgMHg3MTg4LAorICAgIDB4NzE2NiwgMHg3MTYyLCAweDcxNEMsIDB4NzE1NiwgMHg3MTZDLCAweDcxOEYsIDB4NzFGQiwgMHg3MTg0LCAweDcxOTUsCisgICAgMHg3MUE4LCAweDcxQUMsIDB4NzFENywgMHg3MUI5LCAweDcxQkUsIDB4NzFEMiwgMHg3MUM5LCAweDcxRDQsIDB4NzFDRSwKKyAgICAweDcxRTAsIDB4NzFFQywgMHg3MUU3LCAweDcxRjUsIDB4NzFGQywgMHg3MUY5LCAweDcxRkYsIDB4NzIwRCwgMHg3MjEwLAorICAgIDB4NzIxQiwgMHg3MjI4LCAweDcyMkQsIDB4NzIyQywgMHg3MjMwLCAweDcyMzIsIDB4NzIzQiwgMHg3MjNDLCAweDcyM0YsCisgICAgMHg3MjQwLCAweDcyNDYsIDB4NzI0QiwgMHg3MjU4LCAweDcyNzQsIDB4NzI3RSwgMHg3MjgyLCAweDcyODEsIDB4NzI4NywKKyAgICAweDcyOTIsIDB4NzI5NiwgMHg3MkEyLCAweDcyQTcsIDB4NzJCOSwgMHg3MkIyLCAweDcyQzMsIDB4NzJDNiwgMHg3MkM0LAorICAgIDB4NzJDRSwgMHg3MkQyLCAweDcyRTIsIDB4NzJFMCwgMHg3MkUxLCAweDcyRjksIDB4NzJGNywgMHg1MDBGLCAweDczMTcsCisgICAgMHg3MzBBLCAweDczMUMsIDB4NzMxNiwgMHg3MzFELCAweDczMzQsIDB4NzMyRiwgMHg3MzI5LCAweDczMjUsIDB4NzMzRSwKKyAgICAweDczNEUsIDB4NzM0RiwgMHg5RUQ4LCAweDczNTcsIDB4NzM2QSwgMHg3MzY4LCAweDczNzAsIDB4NzM3OCwgMHg3Mzc1LAorICAgIDB4NzM3QiwgMHg3MzdBLCAweDczQzgsIDB4NzNCMywgMHg3M0NFLCAweDczQkIsIDB4NzNDMCwgMHg3M0U1LCAweDczRUUsCisgICAgMHg3M0RFLCAweDc0QTIsIDB4NzQwNSwgMHg3NDZGLCAweDc0MjUsIDB4NzNGOCwgMHg3NDMyLCAweDc0M0EsIDB4NzQ1NSwKKyAgICAweDc0M0YsIDB4NzQ1RiwgMHg3NDU5LCAweDc0NDEsIDB4NzQ1QywgMHg3NDY5LCAweDc0NzAsIDB4NzQ2MywgMHg3NDZBLAorICAgIDB4NzQ3NiwgMHg3NDdFLCAweDc0OEIsIDB4NzQ5RSwgMHg3NEE3LCAweDc0Q0EsIDB4NzRDRiwgMHg3NEQ0LCAweDczRjEsCisgICAgMHg3NEUwLCAweDc0RTMsIDB4NzRFNywgMHg3NEU5LCAweDc0RUUsIDB4NzRGMiwgMHg3NEYwLCAweDc0RjEsIDB4NzRGOCwKKyAgICAweDc0RjcsIDB4NzUwNCwgMHg3NTAzLCAweDc1MDUsIDB4NzUwQywgMHg3NTBFLCAweDc1MEQsIDB4NzUxNSwgMHg3NTEzLAorICAgIDB4NzUxRSwgMHg3NTI2LCAweDc1MkMsIDB4NzUzQywgMHg3NTQ0LCAweDc1NEQsIDB4NzU0QSwgMHg3NTQ5LCAweDc1NUIsCisgICAgMHg3NTQ2LCAweDc1NUEsIDB4NzU2OSwgMHg3NTY0LCAweDc1NjcsIDB4NzU2QiwgMHg3NTZELCAweDc1NzgsIDB4NzU3NiwKKyAgICAweDc1ODYsIDB4NzU4NywgMHg3NTc0LCAweDc1OEEsIDB4NzU4OSwgMHg3NTgyLCAweDc1OTQsIDB4NzU5QSwgMHg3NTlELAorICAgIDB4NzVBNSwgMHg3NUEzLCAweDc1QzIsIDB4NzVCMywgMHg3NUMzLCAweDc1QjUsIDB4NzVCRCwgMHg3NUI4LCAweDc1QkMsCisgICAgMHg3NUIxLCAweDc1Q0QsIDB4NzVDQSwgMHg3NUQyLCAweDc1RDksIDB4NzVFMywgMHg3NURFLCAweDc1RkUsIDB4NzVGRiwKKyAgICAweDc1RkMsIDB4NzYwMSwgMHg3NUYwLCAweDc1RkEsIDB4NzVGMiwgMHg3NUYzLCAweDc2MEIsIDB4NzYwRCwgMHg3NjA5LAorICAgIDB4NzYxRiwgMHg3NjI3LCAweDc2MjAsIDB4NzYyMSwgMHg3NjIyLCAweDc2MjQsIDB4NzYzNCwgMHg3NjMwLCAweDc2M0IsCisgICAgMHg3NjQ3LCAweDc2NDgsIDB4NzY0NiwgMHg3NjVDLCAweDc2NTgsIDB4NzY2MSwgMHg3NjYyLCAweDc2NjgsIDB4NzY2OSwKKyAgICAweDc2NkEsIDB4NzY2NywgMHg3NjZDLCAweDc2NzAsIDB4NzY3MiwgMHg3Njc2LCAweDc2NzgsIDB4NzY3QywgMHg3NjgwLAorICAgIDB4NzY4MywgMHg3Njg4LCAweDc2OEIsIDB4NzY4RSwgMHg3Njk2LCAweDc2OTMsIDB4NzY5OSwgMHg3NjlBLCAweDc2QjAsCisgICAgMHg3NkI0LCAweDc2QjgsIDB4NzZCOSwgMHg3NkJBLCAweDc2QzIsIDB4NzZDRCwgMHg3NkQ2LCAweDc2RDIsIDB4NzZERSwKKyAgICAweDc2RTEsIDB4NzZFNSwgMHg3NkU3LCAweDc2RUEsIDB4ODYyRiwgMHg3NkZCLCAweDc3MDgsIDB4NzcwNywgMHg3NzA0LAorICAgIDB4NzcyOSwgMHg3NzI0LCAweDc3MUUsIDB4NzcyNSwgMHg3NzI2LCAweDc3MUIsIDB4NzczNywgMHg3NzM4LCAweDc3NDcsCisgICAgMHg3NzVBLCAweDc3NjgsIDB4Nzc2QiwgMHg3NzVCLCAweDc3NjUsIDB4Nzc3RiwgMHg3NzdFLCAweDc3NzksIDB4Nzc4RSwKKyAgICAweDc3OEIsIDB4Nzc5MSwgMHg3N0EwLCAweDc3OUUsIDB4NzdCMCwgMHg3N0I2LCAweDc3QjksIDB4NzdCRiwgMHg3N0JDLAorICAgIDB4NzdCRCwgMHg3N0JCLCAweDc3QzcsIDB4NzdDRCwgMHg3N0Q3LCAweDc3REEsIDB4NzdEQywgMHg3N0UzLCAweDc3RUUsCisgICAgMHg3N0ZDLCAweDc4MEMsIDB4NzgxMiwgMHg3OTI2LCAweDc4MjAsIDB4NzkyQSwgMHg3ODQ1LCAweDc4OEUsIDB4Nzg3NCwKKyAgICAweDc4ODYsIDB4Nzg3QywgMHg3ODlBLCAweDc4OEMsIDB4NzhBMywgMHg3OEI1LCAweDc4QUEsIDB4NzhBRiwgMHg3OEQxLAorICAgIDB4NzhDNiwgMHg3OENCLCAweDc4RDQsIDB4NzhCRSwgMHg3OEJDLCAweDc4QzUsIDB4NzhDQSwgMHg3OEVDLCAweDc4RTcsCisgICAgMHg3OERBLCAweDc4RkQsIDB4NzhGNCwgMHg3OTA3LCAweDc5MTIsIDB4NzkxMSwgMHg3OTE5LCAweDc5MkMsIDB4NzkyQiwKKyAgICAweDc5NDAsIDB4Nzk2MCwgMHg3OTU3LCAweDc5NUYsIDB4Nzk1QSwgMHg3OTU1LCAweDc5NTMsIDB4Nzk3QSwgMHg3OTdGLAorICAgIDB4Nzk4QSwgMHg3OTlELCAweDc5QTcsIDB4OUY0QiwgMHg3OUFBLCAweDc5QUUsIDB4NzlCMywgMHg3OUI5LCAweDc5QkEsCisgICAgMHg3OUM5LCAweDc5RDUsIDB4NzlFNywgMHg3OUVDLCAweDc5RTEsIDB4NzlFMywgMHg3QTA4LCAweDdBMEQsIDB4N0ExOCwKKyAgICAweDdBMTksIDB4N0EyMCwgMHg3QTFGLCAweDc5ODAsIDB4N0EzMSwgMHg3QTNCLCAweDdBM0UsIDB4N0EzNywgMHg3QTQzLAorICAgIDB4N0E1NywgMHg3QTQ5LCAweDdBNjEsIDB4N0E2MiwgMHg3QTY5LCAweDlGOUQsIDB4N0E3MCwgMHg3QTc5LCAweDdBN0QsCisgICAgMHg3QTg4LCAweDdBOTcsIDB4N0E5NSwgMHg3QTk4LCAweDdBOTYsIDB4N0FBOSwgMHg3QUM4LCAweDdBQjAsIDB4N0FCNiwKKyAgICAweDdBQzUsIDB4N0FDNCwgMHg3QUJGLCAweDkwODMsIDB4N0FDNywgMHg3QUNBLCAweDdBQ0QsIDB4N0FDRiwgMHg3QUQ1LAorICAgIDB4N0FEMywgMHg3QUQ5LCAweDdBREEsIDB4N0FERCwgMHg3QUUxLCAweDdBRTIsIDB4N0FFNiwgMHg3QUVELCAweDdBRjAsCisgICAgMHg3QjAyLCAweDdCMEYsIDB4N0IwQSwgMHg3QjA2LCAweDdCMzMsIDB4N0IxOCwgMHg3QjE5LCAweDdCMUUsIDB4N0IzNSwKKyAgICAweDdCMjgsIDB4N0IzNiwgMHg3QjUwLCAweDdCN0EsIDB4N0IwNCwgMHg3QjRELCAweDdCMEIsIDB4N0I0QywgMHg3QjQ1LAorICAgIDB4N0I3NSwgMHg3QjY1LCAweDdCNzQsIDB4N0I2NywgMHg3QjcwLCAweDdCNzEsIDB4N0I2QywgMHg3QjZFLCAweDdCOUQsCisgICAgMHg3Qjk4LCAweDdCOUYsIDB4N0I4RCwgMHg3QjlDLCAweDdCOUEsIDB4N0I4QiwgMHg3QjkyLCAweDdCOEYsIDB4N0I1RCwKKyAgICAweDdCOTksIDB4N0JDQiwgMHg3QkMxLCAweDdCQ0MsIDB4N0JDRiwgMHg3QkI0LCAweDdCQzYsIDB4N0JERCwgMHg3QkU5LAorICAgIDB4N0MxMSwgMHg3QzE0LCAweDdCRTYsIDB4N0JFNSwgMHg3QzYwLCAweDdDMDAsIDB4N0MwNywgMHg3QzEzLCAweDdCRjMsCisgICAgMHg3QkY3LCAweDdDMTcsIDB4N0MwRCwgMHg3QkY2LCAweDdDMjMsIDB4N0MyNywgMHg3QzJBLCAweDdDMUYsIDB4N0MzNywKKyAgICAweDdDMkIsIDB4N0MzRCwgMHg3QzRDLCAweDdDNDMsIDB4N0M1NCwgMHg3QzRGLCAweDdDNDAsIDB4N0M1MCwgMHg3QzU4LAorICAgIDB4N0M1RiwgMHg3QzY0LCAweDdDNTYsIDB4N0M2NSwgMHg3QzZDLCAweDdDNzUsIDB4N0M4MywgMHg3QzkwLCAweDdDQTQsCisgICAgMHg3Q0FELCAweDdDQTIsIDB4N0NBQiwgMHg3Q0ExLCAweDdDQTgsIDB4N0NCMywgMHg3Q0IyLCAweDdDQjEsIDB4N0NBRSwKKyAgICAweDdDQjksIDB4N0NCRCwgMHg3Q0MwLCAweDdDQzUsIDB4N0NDMiwgMHg3Q0Q4LCAweDdDRDIsIDB4N0NEQywgMHg3Q0UyLAorICAgIDB4OUIzQiwgMHg3Q0VGLCAweDdDRjIsIDB4N0NGNCwgMHg3Q0Y2LCAweDdDRkEsIDB4N0QwNiwgMHg3RDAyLCAweDdEMUMsCisgICAgMHg3RDE1LCAweDdEMEEsIDB4N0Q0NSwgMHg3RDRCLCAweDdEMkUsIDB4N0QzMiwgMHg3RDNGLCAweDdEMzUsIDB4N0Q0NiwKKyAgICAweDdENzMsIDB4N0Q1NiwgMHg3RDRFLCAweDdENzIsIDB4N0Q2OCwgMHg3RDZFLCAweDdENEYsIDB4N0Q2MywgMHg3RDkzLAorICAgIDB4N0Q4OSwgMHg3RDVCLCAweDdEOEYsIDB4N0Q3RCwgMHg3RDlCLCAweDdEQkEsIDB4N0RBRSwgMHg3REEzLCAweDdEQjUsCisgICAgMHg3REM3LCAweDdEQkQsIDB4N0RBQiwgMHg3RTNELCAweDdEQTIsIDB4N0RBRiwgMHg3RERDLCAweDdEQjgsIDB4N0Q5RiwKKyAgICAweDdEQjAsIDB4N0REOCwgMHg3RERELCAweDdERTQsIDB4N0RERSwgMHg3REZCLCAweDdERjIsIDB4N0RFMSwgMHg3RTA1LAorICAgIDB4N0UwQSwgMHg3RTIzLCAweDdFMjEsIDB4N0UxMiwgMHg3RTMxLCAweDdFMUYsIDB4N0UwOSwgMHg3RTBCLCAweDdFMjIsCisgICAgMHg3RTQ2LCAweDdFNjYsIDB4N0UzQiwgMHg3RTM1LCAweDdFMzksIDB4N0U0MywgMHg3RTM3LCAweDdFMzIsIDB4N0UzQSwKKyAgICAweDdFNjcsIDB4N0U1RCwgMHg3RTU2LCAweDdFNUUsIDB4N0U1OSwgMHg3RTVBLCAweDdFNzksIDB4N0U2QSwgMHg3RTY5LAorICAgIDB4N0U3QywgMHg3RTdCLCAweDdFODMsIDB4N0RENSwgMHg3RTdELCAweDhGQUUsIDB4N0U3RiwgMHg3RTg4LCAweDdFODksCisgICAgMHg3RThDLCAweDdFOTIsIDB4N0U5MCwgMHg3RTkzLCAweDdFOTQsIDB4N0U5NiwgMHg3RThFLCAweDdFOUIsIDB4N0U5QywKKyAgICAweDdGMzgsIDB4N0YzQSwgMHg3RjQ1LCAweDdGNEMsIDB4N0Y0RCwgMHg3RjRFLCAweDdGNTAsIDB4N0Y1MSwgMHg3RjU1LAorICAgIDB4N0Y1NCwgMHg3RjU4LCAweDdGNUYsIDB4N0Y2MCwgMHg3RjY4LCAweDdGNjksIDB4N0Y2NywgMHg3Rjc4LCAweDdGODIsCisgICAgMHg3Rjg2LCAweDdGODMsIDB4N0Y4OCwgMHg3Rjg3LCAweDdGOEMsIDB4N0Y5NCwgMHg3RjlFLCAweDdGOUQsIDB4N0Y5QSwKKyAgICAweDdGQTMsIDB4N0ZBRiwgMHg3RkIyLCAweDdGQjksIDB4N0ZBRSwgMHg3RkI2LCAweDdGQjgsIDB4OEI3MSwgMHg3RkM1LAorICAgIDB4N0ZDNiwgMHg3RkNBLCAweDdGRDUsIDB4N0ZENCwgMHg3RkUxLCAweDdGRTYsIDB4N0ZFOSwgMHg3RkYzLCAweDdGRjksCisgICAgMHg5OERDLCAweDgwMDYsIDB4ODAwNCwgMHg4MDBCLCAweDgwMTIsIDB4ODAxOCwgMHg4MDE5LCAweDgwMUMsIDB4ODAyMSwKKyAgICAweDgwMjgsIDB4ODAzRiwgMHg4MDNCLCAweDgwNEEsIDB4ODA0NiwgMHg4MDUyLCAweDgwNTgsIDB4ODA1QSwgMHg4MDVGLAorICAgIDB4ODA2MiwgMHg4MDY4LCAweDgwNzMsIDB4ODA3MiwgMHg4MDcwLCAweDgwNzYsIDB4ODA3OSwgMHg4MDdELCAweDgwN0YsCisgICAgMHg4MDg0LCAweDgwODYsIDB4ODA4NSwgMHg4MDlCLCAweDgwOTMsIDB4ODA5QSwgMHg4MEFELCAweDUxOTAsIDB4ODBBQywKKyAgICAweDgwREIsIDB4ODBFNSwgMHg4MEQ5LCAweDgwREQsIDB4ODBDNCwgMHg4MERBLCAweDgwRDYsIDB4ODEwOSwgMHg4MEVGLAorICAgIDB4ODBGMSwgMHg4MTFCLCAweDgxMjksIDB4ODEyMywgMHg4MTJGLCAweDgxNEIsIDB4OTY4QiwgMHg4MTQ2LCAweDgxM0UsCisgICAgMHg4MTUzLCAweDgxNTEsIDB4ODBGQywgMHg4MTcxLCAweDgxNkUsIDB4ODE2NSwgMHg4MTY2LCAweDgxNzQsIDB4ODE4MywKKyAgICAweDgxODgsIDB4ODE4QSwgMHg4MTgwLCAweDgxODIsIDB4ODFBMCwgMHg4MTk1LCAweDgxQTQsIDB4ODFBMywgMHg4MTVGLAorICAgIDB4ODE5MywgMHg4MUE5LCAweDgxQjAsIDB4ODFCNSwgMHg4MUJFLCAweDgxQjgsIDB4ODFCRCwgMHg4MUMwLCAweDgxQzIsCisgICAgMHg4MUJBLCAweDgxQzksIDB4ODFDRCwgMHg4MUQxLCAweDgxRDksIDB4ODFEOCwgMHg4MUM4LCAweDgxREEsIDB4ODFERiwKKyAgICAweDgxRTAsIDB4ODFFNywgMHg4MUZBLCAweDgxRkIsIDB4ODFGRSwgMHg4MjAxLCAweDgyMDIsIDB4ODIwNSwgMHg4MjA3LAorICAgIDB4ODIwQSwgMHg4MjBELCAweDgyMTAsIDB4ODIxNiwgMHg4MjI5LCAweDgyMkIsIDB4ODIzOCwgMHg4MjMzLCAweDgyNDAsCisgICAgMHg4MjU5LCAweDgyNTgsIDB4ODI1RCwgMHg4MjVBLCAweDgyNUYsIDB4ODI2NCwgMHg4MjYyLCAweDgyNjgsIDB4ODI2QSwKKyAgICAweDgyNkIsIDB4ODIyRSwgMHg4MjcxLCAweDgyNzcsIDB4ODI3OCwgMHg4MjdFLCAweDgyOEQsIDB4ODI5MiwgMHg4MkFCLAorICAgIDB4ODI5RiwgMHg4MkJCLCAweDgyQUMsIDB4ODJFMSwgMHg4MkUzLCAweDgyREYsIDB4ODJEMiwgMHg4MkY0LCAweDgyRjMsCisgICAgMHg4MkZBLCAweDgzOTMsIDB4ODMwMywgMHg4MkZCLCAweDgyRjksIDB4ODJERSwgMHg4MzA2LCAweDgyREMsIDB4ODMwOSwKKyAgICAweDgyRDksIDB4ODMzNSwgMHg4MzM0LCAweDgzMTYsIDB4ODMzMiwgMHg4MzMxLCAweDgzNDAsIDB4ODMzOSwgMHg4MzUwLAorICAgIDB4ODM0NSwgMHg4MzJGLCAweDgzMkIsIDB4ODMxNywgMHg4MzE4LCAweDgzODUsIDB4ODM5QSwgMHg4M0FBLCAweDgzOUYsCisgICAgMHg4M0EyLCAweDgzOTYsIDB4ODMyMywgMHg4MzhFLCAweDgzODcsIDB4ODM4QSwgMHg4MzdDLCAweDgzQjUsIDB4ODM3MywKKyAgICAweDgzNzUsIDB4ODNBMCwgMHg4Mzg5LCAweDgzQTgsIDB4ODNGNCwgMHg4NDEzLCAweDgzRUIsIDB4ODNDRSwgMHg4M0ZELAorICAgIDB4ODQwMywgMHg4M0Q4LCAweDg0MEIsIDB4ODNDMSwgMHg4M0Y3LCAweDg0MDcsIDB4ODNFMCwgMHg4M0YyLCAweDg0MEQsCisgICAgMHg4NDIyLCAweDg0MjAsIDB4ODNCRCwgMHg4NDM4LCAweDg1MDYsIDB4ODNGQiwgMHg4NDZELCAweDg0MkEsIDB4ODQzQywKKyAgICAweDg1NUEsIDB4ODQ4NCwgMHg4NDc3LCAweDg0NkIsIDB4ODRBRCwgMHg4NDZFLCAweDg0ODIsIDB4ODQ2OSwgMHg4NDQ2LAorICAgIDB4ODQyQywgMHg4NDZGLCAweDg0NzksIDB4ODQzNSwgMHg4NENBLCAweDg0NjIsIDB4ODRCOSwgMHg4NEJGLCAweDg0OUYsCisgICAgMHg4NEQ5LCAweDg0Q0QsIDB4ODRCQiwgMHg4NERBLCAweDg0RDAsIDB4ODRDMSwgMHg4NEM2LCAweDg0RDYsIDB4ODRBMSwKKyAgICAweDg1MjEsIDB4ODRGRiwgMHg4NEY0LCAweDg1MTcsIDB4ODUxOCwgMHg4NTJDLCAweDg1MUYsIDB4ODUxNSwgMHg4NTE0LAorICAgIDB4ODRGQywgMHg4NTQwLCAweDg1NjMsIDB4ODU1OCwgMHg4NTQ4LCAweDg1NDEsIDB4ODYwMiwgMHg4NTRCLCAweDg1NTUsCisgICAgMHg4NTgwLCAweDg1QTQsIDB4ODU4OCwgMHg4NTkxLCAweDg1OEEsIDB4ODVBOCwgMHg4NTZELCAweDg1OTQsIDB4ODU5QiwKKyAgICAweDg1RUEsIDB4ODU4NywgMHg4NTlDLCAweDg1NzcsIDB4ODU3RSwgMHg4NTkwLCAweDg1QzksIDB4ODVCQSwgMHg4NUNGLAorICAgIDB4ODVCOSwgMHg4NUQwLCAweDg1RDUsIDB4ODVERCwgMHg4NUU1LCAweDg1REMsIDB4ODVGOSwgMHg4NjBBLCAweDg2MTMsCisgICAgMHg4NjBCLCAweDg1RkUsIDB4ODVGQSwgMHg4NjA2LCAweDg2MjIsIDB4ODYxQSwgMHg4NjMwLCAweDg2M0YsIDB4ODY0RCwKKyAgICAweDRFNTUsIDB4ODY1NCwgMHg4NjVGLCAweDg2NjcsIDB4ODY3MSwgMHg4NjkzLCAweDg2QTMsIDB4ODZBOSwgMHg4NkFBLAorICAgIDB4ODY4QiwgMHg4NjhDLCAweDg2QjYsIDB4ODZBRiwgMHg4NkM0LCAweDg2QzYsIDB4ODZCMCwgMHg4NkM5LCAweDg4MjMsCisgICAgMHg4NkFCLCAweDg2RDQsIDB4ODZERSwgMHg4NkU5LCAweDg2RUMsIDB4ODZERiwgMHg4NkRCLCAweDg2RUYsIDB4ODcxMiwKKyAgICAweDg3MDYsIDB4ODcwOCwgMHg4NzAwLCAweDg3MDMsIDB4ODZGQiwgMHg4NzExLCAweDg3MDksIDB4ODcwRCwgMHg4NkY5LAorICAgIDB4ODcwQSwgMHg4NzM0LCAweDg3M0YsIDB4ODczNywgMHg4NzNCLCAweDg3MjUsIDB4ODcyOSwgMHg4NzFBLCAweDg3NjAsCisgICAgMHg4NzVGLCAweDg3NzgsIDB4ODc0QywgMHg4NzRFLCAweDg3NzQsIDB4ODc1NywgMHg4NzY4LCAweDg3NkUsIDB4ODc1OSwKKyAgICAweDg3NTMsIDB4ODc2MywgMHg4NzZBLCAweDg4MDUsIDB4ODdBMiwgMHg4NzlGLCAweDg3ODIsIDB4ODdBRiwgMHg4N0NCLAorICAgIDB4ODdCRCwgMHg4N0MwLCAweDg3RDAsIDB4OTZENiwgMHg4N0FCLCAweDg3QzQsIDB4ODdCMywgMHg4N0M3LCAweDg3QzYsCisgICAgMHg4N0JCLCAweDg3RUYsIDB4ODdGMiwgMHg4N0UwLCAweDg4MEYsIDB4ODgwRCwgMHg4N0ZFLCAweDg3RjYsIDB4ODdGNywKKyAgICAweDg4MEUsIDB4ODdEMiwgMHg4ODExLCAweDg4MTYsIDB4ODgxNSwgMHg4ODIyLCAweDg4MjEsIDB4ODgzMSwgMHg4ODM2LAorICAgIDB4ODgzOSwgMHg4ODI3LCAweDg4M0IsIDB4ODg0NCwgMHg4ODQyLCAweDg4NTIsIDB4ODg1OSwgMHg4ODVFLCAweDg4NjIsCisgICAgMHg4ODZCLCAweDg4ODEsIDB4ODg3RSwgMHg4ODlFLCAweDg4NzUsIDB4ODg3RCwgMHg4OEI1LCAweDg4NzIsIDB4ODg4MiwKKyAgICAweDg4OTcsIDB4ODg5MiwgMHg4OEFFLCAweDg4OTksIDB4ODhBMiwgMHg4ODhELCAweDg4QTQsIDB4ODhCMCwgMHg4OEJGLAorICAgIDB4ODhCMSwgMHg4OEMzLCAweDg4QzQsIDB4ODhENCwgMHg4OEQ4LCAweDg4RDksIDB4ODhERCwgMHg4OEY5LCAweDg5MDIsCisgICAgMHg4OEZDLCAweDg4RjQsIDB4ODhFOCwgMHg4OEYyLCAweDg5MDQsIDB4ODkwQywgMHg4OTBBLCAweDg5MTMsIDB4ODk0MywKKyAgICAweDg5MUUsIDB4ODkyNSwgMHg4OTJBLCAweDg5MkIsIDB4ODk0MSwgMHg4OTQ0LCAweDg5M0IsIDB4ODkzNiwgMHg4OTM4LAorICAgIDB4ODk0QywgMHg4OTFELCAweDg5NjAsIDB4ODk1RSwgMHg4OTY2LCAweDg5NjQsIDB4ODk2RCwgMHg4OTZBLCAweDg5NkYsCisgICAgMHg4OTc0LCAweDg5NzcsIDB4ODk3RSwgMHg4OTgzLCAweDg5ODgsIDB4ODk4QSwgMHg4OTkzLCAweDg5OTgsIDB4ODlBMSwKKyAgICAweDg5QTksIDB4ODlBNiwgMHg4OUFDLCAweDg5QUYsIDB4ODlCMiwgMHg4OUJBLCAweDg5QkQsIDB4ODlCRiwgMHg4OUMwLAorICAgIDB4ODlEQSwgMHg4OURDLCAweDg5REQsIDB4ODlFNywgMHg4OUY0LCAweDg5RjgsIDB4OEEwMywgMHg4QTE2LCAweDhBMTAsCisgICAgMHg4QTBDLCAweDhBMUIsIDB4OEExRCwgMHg4QTI1LCAweDhBMzYsIDB4OEE0MSwgMHg4QTVCLCAweDhBNTIsIDB4OEE0NiwKKyAgICAweDhBNDgsIDB4OEE3QywgMHg4QTZELCAweDhBNkMsIDB4OEE2MiwgMHg4QTg1LCAweDhBODIsIDB4OEE4NCwgMHg4QUE4LAorICAgIDB4OEFBMSwgMHg4QTkxLCAweDhBQTUsIDB4OEFBNiwgMHg4QTlBLCAweDhBQTMsIDB4OEFDNCwgMHg4QUNELCAweDhBQzIsCisgICAgMHg4QURBLCAweDhBRUIsIDB4OEFGMywgMHg4QUU3LCAweDhBRTQsIDB4OEFGMSwgMHg4QjE0LCAweDhBRTAsIDB4OEFFMiwKKyAgICAweDhBRjcsIDB4OEFERSwgMHg4QURCLCAweDhCMEMsIDB4OEIwNywgMHg4QjFBLCAweDhBRTEsIDB4OEIxNiwgMHg4QjEwLAorICAgIDB4OEIxNywgMHg4QjIwLCAweDhCMzMsIDB4OTdBQiwgMHg4QjI2LCAweDhCMkIsIDB4OEIzRSwgMHg4QjI4LCAweDhCNDEsCisgICAgMHg4QjRDLCAweDhCNEYsIDB4OEI0RSwgMHg4QjQ5LCAweDhCNTYsIDB4OEI1QiwgMHg4QjVBLCAweDhCNkIsIDB4OEI1RiwKKyAgICAweDhCNkMsIDB4OEI2RiwgMHg4Qjc0LCAweDhCN0QsIDB4OEI4MCwgMHg4QjhDLCAweDhCOEUsIDB4OEI5MiwgMHg4QjkzLAorICAgIDB4OEI5NiwgMHg4Qjk5LCAweDhCOUEsIDB4OEMzQSwgMHg4QzQxLCAweDhDM0YsIDB4OEM0OCwgMHg4QzRDLCAweDhDNEUsCisgICAgMHg4QzUwLCAweDhDNTUsIDB4OEM2MiwgMHg4QzZDLCAweDhDNzgsIDB4OEM3QSwgMHg4QzgyLCAweDhDODksIDB4OEM4NSwKKyAgICAweDhDOEEsIDB4OEM4RCwgMHg4QzhFLCAweDhDOTQsIDB4OEM3QywgMHg4Qzk4LCAweDYyMUQsIDB4OENBRCwgMHg4Q0FBLAorICAgIDB4OENCRCwgMHg4Q0IyLCAweDhDQjMsIDB4OENBRSwgMHg4Q0I2LCAweDhDQzgsIDB4OENDMSwgMHg4Q0U0LCAweDhDRTMsCisgICAgMHg4Q0RBLCAweDhDRkQsIDB4OENGQSwgMHg4Q0ZCLCAweDhEMDQsIDB4OEQwNSwgMHg4RDBBLCAweDhEMDcsIDB4OEQwRiwKKyAgICAweDhEMEQsIDB4OEQxMCwgMHg5RjRFLCAweDhEMTMsIDB4OENDRCwgMHg4RDE0LCAweDhEMTYsIDB4OEQ2NywgMHg4RDZELAorICAgIDB4OEQ3MSwgMHg4RDczLCAweDhEODEsIDB4OEQ5OSwgMHg4REMyLCAweDhEQkUsIDB4OERCQSwgMHg4RENGLCAweDhEREEsCisgICAgMHg4REQ2LCAweDhEQ0MsIDB4OEREQiwgMHg4RENCLCAweDhERUEsIDB4OERFQiwgMHg4RERGLCAweDhERTMsIDB4OERGQywKKyAgICAweDhFMDgsIDB4OEUwOSwgMHg4REZGLCAweDhFMUQsIDB4OEUxRSwgMHg4RTEwLCAweDhFMUYsIDB4OEU0MiwgMHg4RTM1LAorICAgIDB4OEUzMCwgMHg4RTM0LCAweDhFNEEsIDB4OEU0NywgMHg4RTQ5LCAweDhFNEMsIDB4OEU1MCwgMHg4RTQ4LCAweDhFNTksCisgICAgMHg4RTY0LCAweDhFNjAsIDB4OEUyQSwgMHg4RTYzLCAweDhFNTUsIDB4OEU3NiwgMHg4RTcyLCAweDhFN0MsIDB4OEU4MSwKKyAgICAweDhFODcsIDB4OEU4NSwgMHg4RTg0LCAweDhFOEIsIDB4OEU4QSwgMHg4RTkzLCAweDhFOTEsIDB4OEU5NCwgMHg4RTk5LAorICAgIDB4OEVBQSwgMHg4RUExLCAweDhFQUMsIDB4OEVCMCwgMHg4RUM2LCAweDhFQjEsIDB4OEVCRSwgMHg4RUM1LCAweDhFQzgsCisgICAgMHg4RUNCLCAweDhFREIsIDB4OEVFMywgMHg4RUZDLCAweDhFRkIsIDB4OEVFQiwgMHg4RUZFLCAweDhGMEEsIDB4OEYwNSwKKyAgICAweDhGMTUsIDB4OEYxMiwgMHg4RjE5LCAweDhGMTMsIDB4OEYxQywgMHg4RjFGLCAweDhGMUIsIDB4OEYwQywgMHg4RjI2LAorICAgIDB4OEYzMywgMHg4RjNCLCAweDhGMzksIDB4OEY0NSwgMHg4RjQyLCAweDhGM0UsIDB4OEY0QywgMHg4RjQ5LCAweDhGNDYsCisgICAgMHg4RjRFLCAweDhGNTcsIDB4OEY1QywgMHg4RjYyLCAweDhGNjMsIDB4OEY2NCwgMHg4RjlDLCAweDhGOUYsIDB4OEZBMywKKyAgICAweDhGQUQsIDB4OEZBRiwgMHg4RkI3LCAweDhGREEsIDB4OEZFNSwgMHg4RkUyLCAweDhGRUEsIDB4OEZFRiwgMHg5MDg3LAorICAgIDB4OEZGNCwgMHg5MDA1LCAweDhGRjksIDB4OEZGQSwgMHg5MDExLCAweDkwMTUsIDB4OTAyMSwgMHg5MDBELCAweDkwMUUsCisgICAgMHg5MDE2LCAweDkwMEIsIDB4OTAyNywgMHg5MDM2LCAweDkwMzUsIDB4OTAzOSwgMHg4RkY4LCAweDkwNEYsIDB4OTA1MCwKKyAgICAweDkwNTEsIDB4OTA1MiwgMHg5MDBFLCAweDkwNDksIDB4OTAzRSwgMHg5MDU2LCAweDkwNTgsIDB4OTA1RSwgMHg5MDY4LAorICAgIDB4OTA2RiwgMHg5MDc2LCAweDk2QTgsIDB4OTA3MiwgMHg5MDgyLCAweDkwN0QsIDB4OTA4MSwgMHg5MDgwLCAweDkwOEEsCisgICAgMHg5MDg5LCAweDkwOEYsIDB4OTBBOCwgMHg5MEFGLCAweDkwQjEsIDB4OTBCNSwgMHg5MEUyLCAweDkwRTQsIDB4NjI0OCwKKyAgICAweDkwREIsIDB4OTEwMiwgMHg5MTEyLCAweDkxMTksIDB4OTEzMiwgMHg5MTMwLCAweDkxNEEsIDB4OTE1NiwgMHg5MTU4LAorICAgIDB4OTE2MywgMHg5MTY1LCAweDkxNjksIDB4OTE3MywgMHg5MTcyLCAweDkxOEIsIDB4OTE4OSwgMHg5MTgyLCAweDkxQTIsCisgICAgMHg5MUFCLCAweDkxQUYsIDB4OTFBQSwgMHg5MUI1LCAweDkxQjQsIDB4OTFCQSwgMHg5MUMwLCAweDkxQzEsIDB4OTFDOSwKKyAgICAweDkxQ0IsIDB4OTFEMCwgMHg5MUQ2LCAweDkxREYsIDB4OTFFMSwgMHg5MURCLCAweDkxRkMsIDB4OTFGNSwgMHg5MUY2LAorICAgIDB4OTIxRSwgMHg5MUZGLCAweDkyMTQsIDB4OTIyQywgMHg5MjE1LCAweDkyMTEsIDB4OTI1RSwgMHg5MjU3LCAweDkyNDUsCisgICAgMHg5MjQ5LCAweDkyNjQsIDB4OTI0OCwgMHg5Mjk1LCAweDkyM0YsIDB4OTI0QiwgMHg5MjUwLCAweDkyOUMsIDB4OTI5NiwKKyAgICAweDkyOTMsIDB4OTI5QiwgMHg5MjVBLCAweDkyQ0YsIDB4OTJCOSwgMHg5MkI3LCAweDkyRTksIDB4OTMwRiwgMHg5MkZBLAorICAgIDB4OTM0NCwgMHg5MzJFLCAweDkzMTksIDB4OTMyMiwgMHg5MzFBLCAweDkzMjMsIDB4OTMzQSwgMHg5MzM1LCAweDkzM0IsCisgICAgMHg5MzVDLCAweDkzNjAsIDB4OTM3QywgMHg5MzZFLCAweDkzNTYsIDB4OTNCMCwgMHg5M0FDLCAweDkzQUQsIDB4OTM5NCwKKyAgICAweDkzQjksIDB4OTNENiwgMHg5M0Q3LCAweDkzRTgsIDB4OTNFNSwgMHg5M0Q4LCAweDkzQzMsIDB4OTNERCwgMHg5M0QwLAorICAgIDB4OTNDOCwgMHg5M0U0LCAweDk0MUEsIDB4OTQxNCwgMHg5NDEzLCAweDk0MDMsIDB4OTQwNywgMHg5NDEwLCAweDk0MzYsCisgICAgMHg5NDJCLCAweDk0MzUsIDB4OTQyMSwgMHg5NDNBLCAweDk0NDEsIDB4OTQ1MiwgMHg5NDQ0LCAweDk0NUIsIDB4OTQ2MCwKKyAgICAweDk0NjIsIDB4OTQ1RSwgMHg5NDZBLCAweDkyMjksIDB4OTQ3MCwgMHg5NDc1LCAweDk0NzcsIDB4OTQ3RCwgMHg5NDVBLAorICAgIDB4OTQ3QywgMHg5NDdFLCAweDk0ODEsIDB4OTQ3RiwgMHg5NTgyLCAweDk1ODcsIDB4OTU4QSwgMHg5NTk0LCAweDk1OTYsCisgICAgMHg5NTk4LCAweDk1OTksIDB4OTVBMCwgMHg5NUE4LCAweDk1QTcsIDB4OTVBRCwgMHg5NUJDLCAweDk1QkIsIDB4OTVCOSwKKyAgICAweDk1QkUsIDB4OTVDQSwgMHg2RkY2LCAweDk1QzMsIDB4OTVDRCwgMHg5NUNDLCAweDk1RDUsIDB4OTVENCwgMHg5NUQ2LAorICAgIDB4OTVEQywgMHg5NUUxLCAweDk1RTUsIDB4OTVFMiwgMHg5NjIxLCAweDk2MjgsIDB4OTYyRSwgMHg5NjJGLCAweDk2NDIsCisgICAgMHg5NjRDLCAweDk2NEYsIDB4OTY0QiwgMHg5Njc3LCAweDk2NUMsIDB4OTY1RSwgMHg5NjVELCAweDk2NUYsIDB4OTY2NiwKKyAgICAweDk2NzIsIDB4OTY2QywgMHg5NjhELCAweDk2OTgsIDB4OTY5NSwgMHg5Njk3LCAweDk2QUEsIDB4OTZBNywgMHg5NkIxLAorICAgIDB4OTZCMiwgMHg5NkIwLCAweDk2QjQsIDB4OTZCNiwgMHg5NkI4LCAweDk2QjksIDB4OTZDRSwgMHg5NkNCLCAweDk2QzksCisgICAgMHg5NkNELCAweDg5NEQsIDB4OTZEQywgMHg5NzBELCAweDk2RDUsIDB4OTZGOSwgMHg5NzA0LCAweDk3MDYsIDB4OTcwOCwKKyAgICAweDk3MTMsIDB4OTcwRSwgMHg5NzExLCAweDk3MEYsIDB4OTcxNiwgMHg5NzE5LCAweDk3MjQsIDB4OTcyQSwgMHg5NzMwLAorICAgIDB4OTczOSwgMHg5NzNELCAweDk3M0UsIDB4OTc0NCwgMHg5NzQ2LCAweDk3NDgsIDB4OTc0MiwgMHg5NzQ5LCAweDk3NUMsCisgICAgMHg5NzYwLCAweDk3NjQsIDB4OTc2NiwgMHg5NzY4LCAweDUyRDIsIDB4OTc2QiwgMHg5NzcxLCAweDk3NzksIDB4OTc4NSwKKyAgICAweDk3N0MsIDB4OTc4MSwgMHg5NzdBLCAweDk3ODYsIDB4OTc4QiwgMHg5NzhGLCAweDk3OTAsIDB4OTc5QywgMHg5N0E4LAorICAgIDB4OTdBNiwgMHg5N0EzLCAweDk3QjMsIDB4OTdCNCwgMHg5N0MzLCAweDk3QzYsIDB4OTdDOCwgMHg5N0NCLCAweDk3REMsCisgICAgMHg5N0VELCAweDlGNEYsIDB4OTdGMiwgMHg3QURGLCAweDk3RjYsIDB4OTdGNSwgMHg5ODBGLCAweDk4MEMsIDB4OTgzOCwKKyAgICAweDk4MjQsIDB4OTgyMSwgMHg5ODM3LCAweDk4M0QsIDB4OTg0NiwgMHg5ODRGLCAweDk4NEIsIDB4OTg2QiwgMHg5ODZGLAorICAgIDB4OTg3MCwgMHg5ODcxLCAweDk4NzQsIDB4OTg3MywgMHg5OEFBLCAweDk4QUYsIDB4OThCMSwgMHg5OEI2LCAweDk4QzQsCisgICAgMHg5OEMzLCAweDk4QzYsIDB4OThFOSwgMHg5OEVCLCAweDk5MDMsIDB4OTkwOSwgMHg5OTEyLCAweDk5MTQsIDB4OTkxOCwKKyAgICAweDk5MjEsIDB4OTkxRCwgMHg5OTFFLCAweDk5MjQsIDB4OTkyMCwgMHg5OTJDLCAweDk5MkUsIDB4OTkzRCwgMHg5OTNFLAorICAgIDB4OTk0MiwgMHg5OTQ5LCAweDk5NDUsIDB4OTk1MCwgMHg5OTRCLCAweDk5NTEsIDB4OTk1MiwgMHg5OTRDLCAweDk5NTUsCisgICAgMHg5OTk3LCAweDk5OTgsIDB4OTlBNSwgMHg5OUFELCAweDk5QUUsIDB4OTlCQywgMHg5OURGLCAweDk5REIsIDB4OTlERCwKKyAgICAweDk5RDgsIDB4OTlEMSwgMHg5OUVELCAweDk5RUUsIDB4OTlGMSwgMHg5OUYyLCAweDk5RkIsIDB4OTlGOCwgMHg5QTAxLAorICAgIDB4OUEwRiwgMHg5QTA1LCAweDk5RTIsIDB4OUExOSwgMHg5QTJCLCAweDlBMzcsIDB4OUE0NSwgMHg5QTQyLCAweDlBNDAsCisgICAgMHg5QTQzLCAweDlBM0UsIDB4OUE1NSwgMHg5QTRELCAweDlBNUIsIDB4OUE1NywgMHg5QTVGLCAweDlBNjIsIDB4OUE2NSwKKyAgICAweDlBNjQsIDB4OUE2OSwgMHg5QTZCLCAweDlBNkEsIDB4OUFBRCwgMHg5QUIwLCAweDlBQkMsIDB4OUFDMCwgMHg5QUNGLAorICAgIDB4OUFEMSwgMHg5QUQzLCAweDlBRDQsIDB4OUFERSwgMHg5QURGLCAweDlBRTIsIDB4OUFFMywgMHg5QUU2LCAweDlBRUYsCisgICAgMHg5QUVCLCAweDlBRUUsIDB4OUFGNCwgMHg5QUYxLCAweDlBRjcsIDB4OUFGQiwgMHg5QjA2LCAweDlCMTgsIDB4OUIxQSwKKyAgICAweDlCMUYsIDB4OUIyMiwgMHg5QjIzLCAweDlCMjUsIDB4OUIyNywgMHg5QjI4LCAweDlCMjksIDB4OUIyQSwgMHg5QjJFLAorICAgIDB4OUIyRiwgMHg5QjMyLCAweDlCNDQsIDB4OUI0MywgMHg5QjRGLCAweDlCNEQsIDB4OUI0RSwgMHg5QjUxLCAweDlCNTgsCisgICAgMHg5Qjc0LCAweDlCOTMsIDB4OUI4MywgMHg5QjkxLCAweDlCOTYsIDB4OUI5NywgMHg5QjlGLCAweDlCQTAsIDB4OUJBOCwKKyAgICAweDlCQjQsIDB4OUJDMCwgMHg5QkNBLCAweDlCQjksIDB4OUJDNiwgMHg5QkNGLCAweDlCRDEsIDB4OUJEMiwgMHg5QkUzLAorICAgIDB4OUJFMiwgMHg5QkU0LCAweDlCRDQsIDB4OUJFMSwgMHg5QzNBLCAweDlCRjIsIDB4OUJGMSwgMHg5QkYwLCAweDlDMTUsCisgICAgMHg5QzE0LCAweDlDMDksIDB4OUMxMywgMHg5QzBDLCAweDlDMDYsIDB4OUMwOCwgMHg5QzEyLCAweDlDMEEsIDB4OUMwNCwKKyAgICAweDlDMkUsIDB4OUMxQiwgMHg5QzI1LCAweDlDMjQsIDB4OUMyMSwgMHg5QzMwLCAweDlDNDcsIDB4OUMzMiwgMHg5QzQ2LAorICAgIDB4OUMzRSwgMHg5QzVBLCAweDlDNjAsIDB4OUM2NywgMHg5Qzc2LCAweDlDNzgsIDB4OUNFNywgMHg5Q0VDLCAweDlDRjAsCisgICAgMHg5RDA5LCAweDlEMDgsIDB4OUNFQiwgMHg5RDAzLCAweDlEMDYsIDB4OUQyQSwgMHg5RDI2LCAweDlEQUYsIDB4OUQyMywKKyAgICAweDlEMUYsIDB4OUQ0NCwgMHg5RDE1LCAweDlEMTIsIDB4OUQ0MSwgMHg5RDNGLCAweDlEM0UsIDB4OUQ0NiwgMHg5RDQ4LAorICAgIDB4OUQ1RCwgMHg5RDVFLCAweDlENjQsIDB4OUQ1MSwgMHg5RDUwLCAweDlENTksIDB4OUQ3MiwgMHg5RDg5LCAweDlEODcsCisgICAgMHg5REFCLCAweDlENkYsIDB4OUQ3QSwgMHg5RDlBLCAweDlEQTQsIDB4OURBOSwgMHg5REIyLCAweDlEQzQsIDB4OURDMSwKKyAgICAweDlEQkIsIDB4OURCOCwgMHg5REJBLCAweDlEQzYsIDB4OURDRiwgMHg5REMyLCAweDlERDksIDB4OUREMywgMHg5REY4LAorICAgIDB4OURFNiwgMHg5REVELCAweDlERUYsIDB4OURGRCwgMHg5RTFBLCAweDlFMUIsIDB4OUUxRSwgMHg5RTc1LCAweDlFNzksCisgICAgMHg5RTdELCAweDlFODEsIDB4OUU4OCwgMHg5RThCLCAweDlFOEMsIDB4OUU5MiwgMHg5RTk1LCAweDlFOTEsIDB4OUU5RCwKKyAgICAweDlFQTUsIDB4OUVBOSwgMHg5RUI4LCAweDlFQUEsIDB4OUVBRCwgMHg5NzYxLCAweDlFQ0MsIDB4OUVDRSwgMHg5RUNGLAorICAgIDB4OUVEMCwgMHg5RUQ0LCAweDlFREMsIDB4OUVERSwgMHg5RURELCAweDlFRTAsIDB4OUVFNSwgMHg5RUU4LCAweDlFRUYsCisgICAgMHg5RUY0LCAweDlFRjYsIDB4OUVGNywgMHg5RUY5LCAweDlFRkIsIDB4OUVGQywgMHg5RUZELCAweDlGMDcsIDB4OUYwOCwKKyAgICAweDc2QjcsIDB4OUYxNSwgMHg5RjIxLCAweDlGMkMsIDB4OUYzRSwgMHg5RjRBLCAweDlGNTIsIDB4OUY1NCwgMHg5RjYzLAorICAgIDB4OUY1RiwgMHg5RjYwLCAweDlGNjEsIDB4OUY2NiwgMHg5RjY3LCAweDlGNkMsIDB4OUY2QSwgMHg5Rjc3LCAweDlGNzIsCisgICAgMHg5Rjc2LCAweDlGOTUsIDB4OUY5QywgMHg5RkEwLCAweDU4MkYsIDB4NjlDNywgMHg5MDU5LCAweDc0NjQsIDB4MjY0MiwKKyAgICAweDI1MDAsIDB4MjUwMSwgMHgyNTAyLCAweDI1MDMsIDB4MjUwNCwgMHgyNTA1LCAweDI1MDYsIDB4MjUwNywgMHgyNTA4LAorICAgIDB4MjUwOSwgMHgyNTBBLCAweDI1MEIsIDB4MjUwQywgMHgyNTBELCAweDI1MEUsIDB4MjUwRiwgMHgyNTEwLCAweDI1MTEsCisgICAgMHgyNTEyLCAweDI1MTMsIDB4MjUxNCwgMHgyNTE1LCAweDI1MTYsIDB4MjUxNywgMHgyNTE4LCAweDI1MTksIDB4MjUxQSwKKyAgICAweDI1MUIsIDB4MjUxQywgMHgyNTFELCAweDI1MUUsIDB4MjUxRiwgMHgyNTIwLCAweDI1MjEsIDB4MjUyMiwgMHgyNTIzLAorICAgIDB4MjUyNCwgMHgyNTI1LCAweDI1MjYsIDB4MjUyNywgMHgyNTI4LCAweDI1MjksIDB4MjUyQSwgMHgyNTJCLCAweDI1MkMsCisgICAgMHgyNTJELCAweDI1MkUsIDB4MjUyRiwgMHgyNTMwLCAweDI1MzEsIDB4MjUzMiwgMHgyNTMzLCAweDI1MzQsIDB4MjUzNSwKKyAgICAweDI1MzYsIDB4MjUzNywgMHgyNTM4LCAweDI1MzksIDB4MjUzQSwgMHgyNTNCLCAweDI1M0MsIDB4MjUzRCwgMHgyNTNFLAorICAgIDB4MjUzRiwgMHgyNTQwLCAweDI1NDEsIDB4MjU0MiwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwgMHgyNTQ2LCAweDI1NDcsCisgICAgMHgyNTQ4LCAweDI1NDksIDB4MjU0QSwgMHgyNTRCLCAweDI0NjAsIDB4MjQ2MSwgMHgyNDYyLCAweDI0NjMsIDB4MjQ2NCwKKyAgICAweDI0NjUsIDB4MjQ2NiwgMHgyNDY3LCAweDI0NjgsIDB4MjQ2OSwgMHgyNDZBLCAweDI0NkIsIDB4MjQ2QywgMHgyNDZELAorICAgIDB4MjQ2RSwgMHgyNDZGLCAweDI0NzAsIDB4MjQ3MSwgMHgyNDcyLCAweDI0NzMsIDB4MjE2MCwgMHgyMTYxLCAweDIxNjIsCisgICAgMHgyMTYzLCAweDIxNjQsIDB4MjE2NSwgMHgyMTY2LCAweDIxNjcsIDB4MjE2OCwgMHgyMTY5LCAweDMzNDksIDB4MzMxNCwKKyAgICAweDMzMjIsIDB4MzM0RCwgMHgzMzE4LCAweDMzMjcsIDB4MzMwMywgMHgzMzM2LCAweDMzNTEsIDB4MzM1NywgMHgzMzBELAorICAgIDB4MzMyNiwgMHgzMzIzLCAweDMzMkIsIDB4MzM0QSwgMHgzMzNCLCAweDMzOUMsIDB4MzM5RCwgMHgzMzlFLCAweDMzOEUsCisgICAgMHgzMzhGLCAweDMzQzQsIDB4MzNBMSwgMHgzMDFELCAweDMwMUYsIDB4MjExNiwgMHgzM0NELCAweDIxMjEsIDB4MzJBNCwKKyAgICAweDMyQTUsIDB4MzJBNiwgMHgzMkE3LCAweDMyQTgsIDB4MzIzMSwgMHgzMjMyLCAweDMyMzksIDB4MzM3RSwgMHgzMzdELAorICAgIDB4MzM3QywgMHgyMjJFLCAweDIyMTEsIDB4MjIxQSwgMHgyMkE1LCAweDIyMjAsIDB4MjIxRiwgMHgyMkJGLCAweDIyMjksCisgICAgMHgyMjJBLCAweDU1NUUsIDB4OThGNCwgMHg2RUEyLCAweDlDMkYsIDB4NkRFQiwgMHg4RkMyLCAweDZCMUQsIDB4NTNBOSwKKyAgICAweDk1OEYsIDB4NTY0MiwgMHg5OTBDLCAweDcxMzAsIDB4ODk1NiwgMHg5REQ3LCAweDhGRTYsIDB4NjA2MiwgMHg2MkQwLAorICAgIDB4NjY2NiwgMHg1NTlELCAweDg0NUIsIDB4OTc4NCwgMHg1Njk5LCAweDZGOTcsIDB4N0ZGMCwgMHg3RkVCLCAweDVGQkQsCisgICAgMHg3OTQ3LCAweDRGRTAsIDB4NTM3RiwgMHg1MEM1LCAweDhFQzAsIDB4NTVCMCwgMHg2QURCLCAweDVDNTEsIDB4OTc3NCwKKyAgICAweDc5NDEsIDB4NjE2NywgMHg3QTNELCAweDdFNkIsIDB4ODM0QSwgMHg5Njk5LCAweDUwMjYsIDB4NUFDQywgMHg2MzcyLAorICAgIDB4OUU3QywgMHg4QUZBLCAweDVERjcsIDB4NjYzQiwgMHg2RTlELCAweDlFQjQsIDB4OUQ2MCwgMHg3NTExLCAweDkxQzcsCisgICAgMHg2OThBLCAweDY4MDUsIDB4ODVBOSwgMHg5QkQ2LCAweDkzMDYsIDB4NzNDQSwgMHg1M0YxLCAweDVDNjIsIDB4OTA2RSwKKyAgICAweDY3NTMsIDB4NzA3QywgMHg3RTYxLCAweDkxNEIsIDB4NjZEOSwgMHg2RTFBLCAweDg1QUYsIDB4ODVGNywgMHg1NEU4LAorICAgIDB4NUVFMCwgMHg2OEEyLCAweDg1MjMsIDB4OTFBQywgMHg5Nzk4LCAweDg3NTUsIDB4OTc3MSwgMHg5MDE3LCAweDdGRTAsCisgICAgMHg2NDdBLCAweDkwMUQsIDB4ODdFQywgMHg2NEIwLCAweDY4MTMsIDB4NzE0RSwgMHg3MTdELCAweDhBNkUsIDB4NTY0QywKKyAgICAweDkwNjEsIDB4NTI3NSwgMHg2NDE0LCAweDc2MjYsIDB4OTA1QywgMHg5QTUyLCAweDgxN0YsIDB4OUVEQiwgMHg1NTQ0LAorICAgIDB4NkZFRiwgMHg3NDIyLCAweDg2RjgsIDB4NURGRCwgMHg4RkJGLCAweDY4REEsIDB4OUM0OCwgMHg2QTNELCAweDdDMUUsCisgICAgMHg4QTNCLCAweDcwMjYsIDB4NTFDQiwgMHg2MzU3LCAweDY5Q0MsIDB4OTM5QSwgMHg1ODVBLCAweDY0NTEsIDB4OTEyRCwKKyAgICAweDY0RTIsIDB4NkVCQSwgMHg1ODYxLCAweDk4NUEsIDB4NTgzNSwgMHg1QzYwLCAweDgzREYsIDB4OENFRCwgMHg1ODU4LAorICAgIDB4NzlCMSwgMHg5RDA3LCAweDcwMDYsIDB4NzAxRSwgMHg1Njc4LCAweDkwNDEsIDB4OTgxMywgMHg5MEEzLCAweDhCMEUsCisgICAgMHg3MDU4LCAweDY5NjIsIDB4NzlCMCwgMHg1NkNBLCAweDcyNEMsIDB4OTAxOSwgMHg3OUU0LCAweDUyNUQsIDB4N0JCOCwKKyAgICAweDZGNTEsIDB4OTFCMSwgMHg2MzNELCAweDYyNDksIDB4NkEwQiwgMHg2N0NBLCAweDdBMTcsIDB4OTAzQywgMHg1QTlCLAorICAgIDB4OEIyQywgMHg1RURGLCAweDcwMTUsIDB4OTgzQiwgMHg4NTNELCAweDc3QTUsIDB4NUEyOSwgMHg1RTk2LCAweDZDRTEsCisgICAgMHg4NEVDLCAweDk4MzAsIDB4OUM1MiwgMHg5RUI1LCAweDUxMzIsIDB4OTkwNSwgMHg3QzdFLCAweDk0NTMsIDB4NjEwOCwKKyAgICAweDc2NTIsIDB4NzMzNywgMHg3MTk0LCAweDgwMDAsIDB4ODQwQSwgMHg5MDdDLCAweDZGMjMsIDB4NzE0OSwgMHg4NEVFLAorICAgIDB4Njk5NCwgMHg4ODFGLCAweDUxNTQsIDB4NTE4OSwgMHg1MTk1LCAweDUxQTQsIDB4NTUzOSwgMHg1NTMzLCAweDU1RTQsCisgICAgMHg1NjMyLCAweDU2QTUsIDB4NTgwQiwgMHg1QUJFLCAweDVCQzMsIDB4NUM1QiwgMHg1RTY0LCAweDYwOTcsIDB4NjM2OSwKKyAgICAweDY0MDYsIDB4NjUyMiwgMHg2NTgzLCAweDY3QTYsIDB4NjdCNCwgMHg2ODlCLCAweDY4OEUsIDB4NkU2RSwgMHg3MUQ3LAorICAgIDB4NzIyOCwgMHg3M0NFLCAweDc1MDQsIDB4NzUwRCwgMHg3NTE1LCAweDc2OTMsIDB4Nzg3QywgMHg3QTMxLCAweDlGOUQsCisgICAgMHg3Qjk5LCAweDdDOTAsIDB4N0NBRSwgMHg3RDlCLCAweDdEQUUsIDB4N0Q5RiwgMHg3RkQ0LCAweDgyMkUsIDB4ODI4RCwKKyAgICAweDgyRDIsIDB4ODMyMywgMHg4Mzc1LCAweDg1MTcsIDB4ODUzRSwgMHg4NzgyLCAweDg3RDIsIDB4ODkwQSwgMHg4OUFGLAorICAgIDB4OEFERSwgMHg4QjQxLCAweDhEREEsIDB4OEUwOSwgMHg4RjEzLCAweDhGRUEsIDB4OEZFOSwgMHg5MDU4LCAweDYyNDgsCisgICAgMHg5MUMxLCAweDk1QkIsIDB4Nzc2MiwgMHg5NzI0LCAweDk3NjAsIDB4OTc2RCwgMHg5ODI0LCAweDlCMkUsIDB4OUI5NywKKyAgICAweDlCRjIsIDB4OUVBQSwgMHg5RjlDLCAweDMwMDEsIDB4MzAwMiwgMHgyMDNFLCAweEZGM0YsIDB4MzBGQywgMHgyMDE1LAorICAgIDB4MjAxMCwgMHgzMDFDLCAweDIwMTYsIDB4RkY1QywgMHgyMDI2LCAweDIwMjUsIDB4RkYwOCwgMHhGRjA5LCAweDMwMTQsCisgICAgMHgzMDE1LCAweEZGM0IsIDB4RkYzRCwgMHhGRjVCLCAweEZGNUQsIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwKKyAgICAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MzAxMCwgMHgzMDExLCAweEZGMUQsIDB4MzA0MSwgMHgzMDQzLAorICAgIDB4MzA0NSwgMHgzMDQ3LCAweDMwNDksIDB4MzA2MywgMHgzMDgzLCAweDMwODUsIDB4MzA4NywgMHgzMDhFLCAweDMwQTEsCisgICAgMHgzMEEzLCAweDMwQTUsIDB4MzBBNywgMHgzMEE5LCAweDMwQzMsIDB4MzBFMywgMHgzMEU1LCAweDMwRTcsIDB4MzBFRSwKKyAgICAweDMwRjUsIDB4MzBGNiwgMHgzMzQ5LCAweDMzMTQsIDB4MzMyMiwgMHgzMzRELCAweDMzMTgsIDB4MzMyNywgMHgzMzAzLAorICAgIDB4MzMzNiwgMHgzMzUxLCAweDMzNTcsIDB4MzMwRCwgMHgzMzI2LCAweDMzMjMsIDB4MzMyQiwgMHgzMzRBLCAweDMzM0IsCisgICAgMHgzMDFELCAweDMwMUUsIDB4MzA5NCwgMHgzMDRCLCAweDMwNTEsIDB4ODJBNiwgMHg4MzI4LCAweDU2NTMsIDB4NTNBOSwKKyAgICAweDcyNTksIDB4NkM3MiwgMHg3QjA4LCAweDk5NTcsIDB4NjJGMywgMHg5OTEwLCAweDk3NkQsIDB4NzE3RCwgMHg3QTdGLAorICAgIDB4N0JBRCwgMHg2M0MzLCAweDgzREYsIDB4Nzk2MiwgMHg1M0RCLCAweDdCQzcsIDB4OEZDNCwgMHg3QzNFLCAweDUwQ0EsCisgICAgMHg1MzE1LCAweDU1QTksIDB4NTZBRSwgMHg1ODE5LCAweDU5MUIsIDB4NUMyOCwgMHg1RUQwLCAweDVFQ0YsIDB4NjI0MSwKKyAgICAweDY2QzEsIDB4NkMwOCwgMHg2RTIzLCAweDZFRUMsIDB4N0E5NywgMHg3QkRELCAweDdGRTksIDB4ODQyMiwgMHg4NzU5LAorICAgIDB4ODgwRSwgMHg4N0QyLCAweDlBMTksIDB4OUVBRCwgMHhGRkU0LCAweEZGMDcsIDB4RkYwMiwgMHgxMUE4LCAweDI1QzEsCisgICAgMHgyNUI3LCAweDIxRTksIDB4MjFFNywgMHgyMUU2LCAweDIxRTgsIDB4MjVBMiwgMHgyNjY3LCAweDI2NjEsIDB4MjY2NCwKKyAgICAweDI2NjIsIDB4MzNBMCwgMHgzM0EyLCAweDMzQTQsIDB4MzNBNSwgMHgzMzk3LCAweDIxMTMsIDB4MzM5OCwgMHgzM0IzLAorICAgIDB4MzNCMiwgMHgzM0IxLCAweDMzQjAsIDB4MzM4NSwgMHgzMzg2LCAweDMzODcsIDB4MzNDQiwgMHgzMzkwLCAweDMzRDQsCisgICAgMHgzMzk2LCAweDMzMjIsIDB4MzMxNiwgMHgzMzE4LCAweDMzMTUsIDB4MzMwMywgMHgzMzIzLCAweDMzNTcsIDB4MzM0MiwKKyAgICAweDMzMzksIDB4MzMzQiwgMHgzMzAwLCAweDMzMzEsIDB4MzM0NywgMHgzMzFFLCAweDMzMkEsIDB4MzNDRCwgMHgzMzdGLAorICAgIDB4MjEyMSwgMHgyNjBFLCAweDMwMzYsIDB4MzAyMCwgMHgwMEE5LCAweDAwQUUsIDB4MDAwMCwgMHgyNDg4LCAweDI0ODksCisgICAgMHgyNDhBLCAweDI0OEIsIDB4MjQ4QywgMHgyNDhELCAweDI0OEUsIDB4MjQ4RiwgMHgyNDkwLCAweDI0NzQsIDB4MjQ3NSwKKyAgICAweDI0NzYsIDB4MjQ3NywgMHgyNDc4LCAweDI0NzksIDB4MjQ3QSwgMHgyNDdCLCAweDI0N0MsIDB4MjQ3RCwgMHgyNDdFLAorICAgIDB4MjQ3RiwgMHgyNDgwLCAweDI0ODEsIDB4MjQ4MiwgMHgyNDgzLCAweDI0ODQsIDB4MjQ4NSwgMHgyNDg2LCAweDI0ODcsCisgICAgMHgzMjUxLCAweDIxNzAsIDB4MjE3MSwgMHgyMTcyLCAweDIxNzMsIDB4MjE3NCwgMHgyMTc1LCAweDIxNzYsIDB4MjE3NywKKyAgICAweDIxNzgsIDB4MjE3OSwgMHgzMjUyLCAweDMyNTMsIDB4MzI1NCwgMHgzMjU1LCAweDMyNTYsIDB4MzI1NywgMHgzMjU4LAorICAgIDB4MzI1OSwgMHgzMjVBLCAweDMyNUIsIDB4MjQ5QywgMHgyNDlELCAweDI0OUUsIDB4MjQ5RiwgMHgyNEEwLCAweDI0QTEsCisgICAgMHgyNEEyLCAweDI0QTMsIDB4MjRBNCwgMHgyNEE1LCAweDI0QTYsIDB4MjRBNywgMHgyNEE4LCAweDI0QTksIDB4MjRBQSwKKyAgICAweDI0QUIsIDB4MjRBQywgMHgyNEFELCAweDI0QUUsIDB4MjRBRiwgMHgyNEIwLCAweDI0QjEsIDB4MjRCMiwgMHgyNEIzLAorICAgIDB4MjRCNCwgMHgyNEI1LCAweDMyNDMsIDB4MzIzRCwgMHgzMjNGLCAweDMyMzQsIDB4MzIzOCwgMHgzMjMzLCAweDMyM0MsCisgICAgMHgzMjQyLCAweDMyM0UsIDB4MzIzNiwgMHgzMjM1LCAweDMyM0IsIDB4MzI0MCwgMHgzMjNBLCAweDMyQjAsIDB4MzJBRCwKKyAgICAweDMyQTksIDB4MzJBRiwgMHgzMjk0LCAweDMyQUEsIDB4MzI5OCwgMHgzMkFCLCAweDMyOTIsIDB4MzI5MSwgMHgzMjkzLAorICAgIDB4MzJBQywgMHgzMkFFLCAweDMyOTYsIDB4MjNBOSwgMHgyM0E4LCAweDIzQTcsIDB4RkUzOCwgMHgyM0FELCAweDIzQUMsCisgICAgMHgyM0FCLCAweEZFMzgsIDB4MjNBQiwgMHgyM0FDLCAweDIzQUQsIDB4RkUzOCwgMHgyM0E3LCAweDIzQTgsIDB4MjNBOSwKKyAgICAweEZFMzgsIDB4MzNDQywgMHgzMzA1LCAweDAwQkQsIDB4MDBCQywgMHgzMzlGLCAweDMzQTMsIDB4MzNBNiwgMHhGRkZELAorICAgIDB4RkZGRCwgMHgzMjlFLCAweDMzODgsIDB4MzM4OSwgMHgzM0M4LCAweDIyMkQsIDB4NTM3MCwgMHgzMjMwLCAweDMyMkEsCisgICAgMHgzMjJCLCAweDMyMkMsIDB4MzIyRCwgMHgzMjJFLCAweDMyMkYsIDB4MzIzNywgMHgzMjQxLCAweDI3QTEsIDB4MjFFNiwKKyAgICAweDIxRTcsIDB4MjFFOSwgMHgyNUM5LCAweDI2NjAsIDB4MjY2NSwgMHgyNjYzLCAweDI2NjYsIDB4MjYwMCwgMHgyNjAxLAorICAgIDB4MjYwMiwgMHgyNjAzLCAweDI2MUUsIDB4MjYxQywgMHgyNjFELCAweDI2MUYsIDB4MzI5OSwgMHgyNEVBLCAweDIxNkEsCisgICAgMHgyMTZCLCAweEZGMTAsIDB4RkYxMCwgMHgzMDAwLCAweDI1ODEsIDB4MjU4MiwgMHgyNTgzLCAweDI1ODQsIDB4MjU4NSwKKyAgICAweDI1ODYsIDB4MjU4NywgMHgyNTg4LCAweDI1OEYsIDB4MjU4RSwgMHgyNThELCAweDI1OEMsIDB4MjU4QiwgMHgyNThBLAorICAgIDB4MjU4OSwgMHgyNTk0LCAweDI1OTUsIDB4MjU2RCwgMHgyNTZFLCAweDI1NzAsIDB4MjU2RiwgMHgyNTUwLCAweDI1NUUsCisgICAgMHgyNTZBLCAweDI1NjEsIDB4MjVFMiwgMHgyNUUzLCAweDI1RTUsIDB4MjVFNCwgMHgyNUNGLCAweDBFRDAsIDB4MjU3MSwKKyAgICAweDI1NzIsIDB4MjU3MywgMHgzMDRCLCAweDMwNTEsIDB4OTAyMiwgMHg4RkJCLCAweEZGMEMsIDB4MDBCMCwgMHgzMDEzLAorICAgIDB4MzA5QywgMHgzMDlCLCAweDAyQ0YsIDB4RkYwRSwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMUMsCisgICAgMHgyMDFFLCAweDIwMTgsIDB4MjAxQSwgMHgwMkJBLCAweDUxREMsIDB4NzE5OSwgMHgyNzc2LCAweDI3NzcsIDB4Mjc3OCwKKyAgICAweDI3NzksIDB4Mjc3QSwgMHgyNzdCLCAweDI3N0MsIDB4Mjc3RCwgMHgyNzdFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MjE3QSwgMHgyMTdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxN0YsIDB4MjEwQSwgMHgyMTA5LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDMwMDQsIDB4MjFDNiwgMHgyMUM0LCAweDIxQzUsIDB4MDAwMCwgMHgzMEY3LCAweDMwRjgsIDB4MzBGOSwKKyAgICAweDMwRkEsIDB4NTkyNywgMHg1QzBGLCAweDMyOUQsIDB4NjNBNywgMHgwMDAwLCAweDAwMDAsIDB4MzM3QiwgMHgzMzdGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzMzMsIDB4MzM0RSwgMHgzMzIyLCAweDMzMTYsIDB4MzMwNSwgMHgzMzA1LCAweDMzMDUsCisgICAgMHgzMzMzLCAweDMzNEUsIDB4MzM0RSwgMHgzMzRFLCAweDMzMDMsIDB4MzMxOCwgMHgzMzE1LCAweDMzMzksIDB4MzMzOSwKKyAgICAweDMzMzksIDB4MzM1NywgMHgzMzQyLCAweDMzNDIsIDB4MzM0MiwgMHgzMzIzLCAweDMzM0IsIDB4MzMwMCwgMHgzMzFFLAorICAgIDB4MzMxRSwgMHgzMzFFLCAweDMzMkEsIDB4MzMyQSwgMHgzMzJBLCAweDMzNDcsIDB4MzMzMSwgMHg3RThBLCAweDg5MUMsCisgICAgMHg5MzQ4LCAweDkyODgsIDB4ODREQywgMHg0RkM5LCAweDcwQkIsIDB4NjYzMSwgMHg2OEM4LCAweDkyRjksIDB4NjZGQiwKKyAgICAweDVGNDUsIDB4NEUyOCwgMHg0RUUxLCAweDRFRkMsIDB4NEYwMCwgMHg0RjAzLCAweDRGMzksIDB4NEY1NiwgMHg0RjkyLAorICAgIDB4NEY4QSwgMHg0RjlBLCAweDRGOTQsIDB4NEZDRCwgMHg1MDQwLCAweDUwMjIsIDB4NEZGRiwgMHg1MDFFLCAweDUwNDYsCisgICAgMHg1MDcwLCAweDUwNDIsIDB4NTA5NCwgMHg1MEY0LCAweDUwRDgsIDB4NTE0QSwgMHg1MTY0LCAweDUxOUQsIDB4NTFCRSwKKyAgICAweDUxRUMsIDB4NTIxNSwgMHg1MjlDLCAweDUyQTYsIDB4NTJDMCwgMHg1MkRCLCAweDUzMDAsIDB4NTMwNywgMHg1MzI0LAorICAgIDB4NTM3MiwgMHg1MzkzLCAweDUzQjIsIDB4NTNERCwgMHhGQTBFLCAweDU0OUMsIDB4NTQ4QSwgMHg1NEE5LCAweDU0RkYsCisgICAgMHg1NTg2LCAweDU3NTksIDB4NTc2NSwgMHg1N0FDLCAweDU3QzgsIDB4NTdDNywgMHhGQTBGLCAweEZBMTAsIDB4NTg5RSwKKyAgICAweDU4QjIsIDB4NTkwQiwgMHg1OTUzLCAweDU5NUIsIDB4NTk1RCwgMHg1OTYzLCAweDU5QTQsIDB4NTlCQSwgMHg1QjU2LAorICAgIDB4NUJDMCwgMHg3NTJGLCAweDVCRDgsIDB4NUJFQywgMHg1QzFFLCAweDVDQTYsIDB4NUNCQSwgMHg1Q0Y1LCAweDVEMjcsCisgICAgMHg1RDUzLCAweEZBMTEsIDB4NUQ0MiwgMHg1RDZELCAweDVEQjgsIDB4NURCOSwgMHg1REQwLCAweDVGMjEsIDB4NUYzNCwKKyAgICAweDVGNjcsIDB4NUZCNywgMHg1RkRFLCAweDYwNUQsIDB4NjA4NSwgMHg2MDhBLCAweDYwREUsIDB4NjBENSwgMHg2MTIwLAorICAgIDB4NjBGMiwgMHg2MTExLCAweDYxMzcsIDB4NjEzMCwgMHg2MTk4LCAweDYyMTMsIDB4NjJBNiwgMHg2M0Y1LCAweDY0NjAsCisgICAgMHg2NDlELCAweDY0Q0UsIDB4NjU0RSwgMHg2NjAwLCAweDY2MTUsIDB4NjYwOSwgMHg2NjJFLCAweDY2MUUsIDB4NjYyNCwKKyAgICAweDY2NjUsIDB4NjY1NywgMHg2NjU5LCAweEZBMTIsIDB4NjY3MywgMHg2Njk5LCAweDY2QTAsIDB4NjZCMiwgMHg2NkJGLAorICAgIDB4NjZGQSwgMHg2NzBFLCAweEY5MjksIDB4Njc2NiwgMHg2N0JCLCAweDY4NTIsIDB4NjdDMCwgMHg2ODAxLCAweDY4NDQsCisgICAgMHg2OENGLCAweEZBMTMsIDB4Njk2OCwgMHhGQTE0LCAweDY5OTgsIDB4NjlFMiwgMHg2QTMwLCAweDZBNkIsIDB4NkE0NiwKKyAgICAweDZBNzMsIDB4NkE3RSwgMHg2QUUyLCAweDZBRTQsIDB4NkJENiwgMHg2QzNGLCAweDZDNUMsIDB4NkM4NiwgMHg2QzZGLAorICAgIDB4NkNEQSwgMHg2RDA0LCAweDZEODcsIDB4NkQ2RiwgMHg2RDk2LCAweDZEQUMsIDB4NkRDRiwgMHg2REY4LCAweDZERjIsCisgICAgMHg2REZDLCAweDZFMzksIDB4NkU1QywgMHg2RTI3LCAweDZFM0MsIDB4NkVCRiwgMHg2Rjg4LCAweDZGQjUsIDB4NkZGNSwKKyAgICAweDcwMDUsIDB4NzAwNywgMHg3MDI4LCAweDcwODUsIDB4NzBBQiwgMHg3MTBGLCAweDcxMDQsIDB4NzE1QywgMHg3MTQ2LAorICAgIDB4NzE0NywgMHhGQTE1LCAweDcxQzEsIDB4NzFGRSwgMHg3MkIxLCAweDcyQkUsIDB4NzMyNCwgMHhGQTE2LCAweDczNzcsCisgICAgMHg3M0JELCAweDczQzksIDB4NzNENiwgMHg3M0UzLCAweDczRDIsIDB4NzQwNywgMHg3M0Y1LCAweDc0MjYsIDB4NzQyQSwKKyAgICAweDc0MjksIDB4NzQyRSwgMHg3NDYyLCAweDc0ODksIDB4NzQ5RiwgMHg3NTAxLCAweDc1NkYsIDB4NzY4MiwgMHg3NjlDLAorICAgIDB4NzY5RSwgMHg3NjlCLCAweDc2QTYsIDB4RkExNywgMHg3NzQ2LCAweDUyQUYsIDB4NzgyMSwgMHg3ODRFLCAweDc4NjQsCisgICAgMHg3ODdBLCAweDc5MzAsIDB4RkExOCwgMHhGQTE5LCAweEZBMUEsIDB4Nzk5NCwgMHhGQTFCLCAweDc5OUIsIDB4N0FEMSwKKyAgICAweDdBRTcsIDB4RkExQywgMHg3QUVCLCAweDdCOUUsIDB4RkExRCwgMHg3RDQ4LCAweDdENUMsIDB4N0RCNywgMHg3REEwLAorICAgIDB4N0RENiwgMHg3RTUyLCAweDdGNDcsIDB4N0ZBMSwgMHhGQTFFLCAweDgzMDEsIDB4ODM2MiwgMHg4MzdGLCAweDgzQzcsCisgICAgMHg4M0Y2LCAweDg0NDgsIDB4ODRCNCwgMHg4NTUzLCAweDg1NTksIDB4ODU2QiwgMHhGQTFGLCAweDg1QjAsIDB4RkEyMCwKKyAgICAweEZBMjEsIDB4ODgwNywgMHg4OEY1LCAweDhBMTIsIDB4OEEzNywgMHg4QTc5LCAweDhBQTcsIDB4OEFCRSwgMHg4QURGLAorICAgIDB4RkEyMiwgMHg4QUY2LCAweDhCNTMsIDB4OEI3RiwgMHg4Q0YwLCAweDhDRjQsIDB4OEQxMiwgMHg4RDc2LCAweEZBMjMsCisgICAgMHg4RUNGLCAweEZBMjQsIDB4RkEyNSwgMHg5MDY3LCAweDkwREUsIDB4RkEyNiwgMHg5MTE1LCAweDkxMjcsIDB4OTFEQSwKKyAgICAweDkxRDcsIDB4OTFERSwgMHg5MUVELCAweDkxRUUsIDB4OTFFNCwgMHg5MUU1LCAweDkyMDYsIDB4OTIxMCwgMHg5MjBBLAorICAgIDB4OTIzQSwgMHg5MjQwLCAweDkyM0MsIDB4OTI0RSwgMHg5MjU5LCAweDkyNTEsIDB4OTIzOSwgMHg5MjY3LCAweDkyQTcsCisgICAgMHg5Mjc3LCAweDkyNzgsIDB4OTJFNywgMHg5MkQ3LCAweDkyRDksIDB4OTJEMCwgMHhGQTI3LCAweDkyRDUsIDB4OTJFMCwKKyAgICAweDkyRDMsIDB4OTMyNSwgMHg5MzIxLCAweDkyRkIsIDB4RkEyOCwgMHg5MzFFLCAweDkyRkYsIDB4OTMxRCwgMHg5MzAyLAorICAgIDB4OTM3MCwgMHg5MzU3LCAweDkzQTQsIDB4OTNDNiwgMHg5M0RFLCAweDkzRjgsIDB4OTQzMSwgMHg5NDQ1LCAweDk0NDgsCisgICAgMHg5NTkyLCAweEY5REMsIDB4RkEyOSwgMHg5NjlELCAweDk2QUYsIDB4OTczMywgMHg5NzNCLCAweDk3NDMsIDB4OTc0RCwKKyAgICAweDk3NEYsIDB4OTc1MSwgMHg5NzU1LCAweDk4NTcsIDB4OTg2NSwgMHhGQTJBLCAweEZBMkIsIDB4OTkyNywgMHhGQTJDLAorICAgIDB4OTk5RSwgMHg5QTRFLCAweDlBRDksIDB4OUFEQywgMHg5Qjc1LCAweDlCNzIsIDB4OUI4RiwgMHg5QkIxLCAweDlCQkIsCisgICAgMHg5QzAwLCAweDlENzAsIDB4OUQ2QiwgMHhGQTJELCAweDlFMTksIDB4OUVEMSwgMHgwMEFDLCAweDAwNUMsIDB4MDAyMCwKKyAgICAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LAorICAgIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsCisgICAgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwKKyAgICAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LAorICAgIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsCisgICAgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwKKyAgICAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMEE1LCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLAorICAgIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsCisgICAgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwKKyAgICAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLAorICAgIDB4MDA3QiwgMHgwMEE2LCAweDAwN0QsIDB4MDMwMywgMHgwMkJDLCAweDAwNUMsIDB4MDJCQiwgMHgwMDdDLCAweDAwN0UsCisgICAgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgyMDQ0LCAweDAxOTIsIDB4MDBBNywgMHgwMEE0LCAweDIwMUMsIDB4MDBBQiwKKyAgICAweDIwMzksIDB4MjAzQSwgMHhGQjAxLCAweEZCMDIsIDB4MjAxMiwgMHgyMDIwLCAweDIwMjEsIDB4MDBCNywgMHgwMEI2LAorICAgIDB4MjAyMiwgMHgyMDFBLCAweDIwMUUsIDB4MjAxRCwgMHgwMEJCLCAweDIwMjYsIDB4MjAzMCwgMHgwMEJGLCAweDAzMDEsCisgICAgMHgwMzAyLCAweDAwQUYsIDB4MDMwNiwgMHgwMzA3LCAweDAzMDgsIDB4MDMwQSwgMHgwMEI4LCAweDAzMEIsIDB4MDMyOCwKKyAgICAweDAzMEMsIDB4MDMzNiwgMHgwMEM2LCAweDAwQUEsIDB4MDE0MSwgMHgwMEQ4LCAweDAxNTIsIDB4MDBCQSwgMHgwMEU2LAorICAgIDB4MDEzMSwgMHgwMTQyLCAweDAwRjgsIDB4MDE1MywgMHgwMERGLCAweDAwMkQsIDB4MDBBOSwgMHgwMEFDLCAweDAwQUUsCisgICAgMHgwMEIwLCAweDAwQjEsIDB4MDBCMiwgMHgwMEIzLCAweDAwQjUsIDB4MDBCOSwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwKKyAgICAweDAwQzAsIDB4MDBDMSwgMHgwMEMyLCAweDAwQzMsIDB4MDBDNCwgMHgwMEM1LCAweDAwQzcsIDB4MDBDOCwgMHgwMEM5LAorICAgIDB4MDBDQSwgMHgwMENCLCAweDAwQ0MsIDB4MDBDRCwgMHgwMENFLCAweDAwQ0YsIDB4MDBEMCwgMHgwMEQxLCAweDAwRDIsCisgICAgMHgwMEQzLCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsIDB4MDBEOSwgMHgwMERBLCAweDAwREIsIDB4MDBEQywKKyAgICAweDAwREQsIDB4MDBERSwgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLCAweDAwRTQsIDB4MDBFNSwgMHgwMEU3LAorICAgIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLCAweDAwRUQsIDB4MDBFRSwgMHgwMEVGLCAweDAwRjAsCisgICAgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LCAweDAwRjksIDB4MDBGQSwKKyAgICAweDAwRkIsIDB4MDBGQywgMHgwMEZELCAweDAwRkUsIDB4MDBGRiwgMHgwMTYwLCAweDAxNzgsIDB4MDE3RCwgMHgwMzA1LAorICAgIDB4MDE2MSwgMHgyMTIyLCAweDAxN0UsIDB4MDAzMCwgMHgyMDAyLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsCisgICAgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwKKyAgICAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LAorICAgIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsCisgICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwKKyAgICAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLAorICAgIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsCisgICAgMHgwMDVCLCAweDAwQTUsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKyAgICAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLAorICAgIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsCisgICAgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MjAzRSwKKyAgICAweEZGNDAsIDB4MjAzMiwgMHgwMEE4LCAweDIwMzYsIDB4MDBDNCwgMHgwMEY5LCAweDAwRTksIDB4MDBFRCwgMHgwMERGLAorICAgIDB4MDBFNywgMHgwMEM3LCAweDAwRDEsIDB4MDBGMSwgMHgwMEEyLCAweDAwQTMsIDB4MDBGMywgMHgwMEZBLCAweDAwQTEsCisgICAgMHgwMEJGLCAweDAwQkQsIDB4MDBENiwgMHgwMERDLCAweDAwRTQsIDB4MDBFQiwgMHgwMEVGLCAweDAwRjYsIDB4MDBEQywKKyAgICAweDAwRTIsIDB4MDBFQSwgMHgwMEVFLCAweDAwRjQsIDB4MDBGQywgMHgwMEUwLCAweDAwRTksIDB4MDBFMSwgMHgwMDdFLAorICAgIDB4MDAzMCwgMHgwMEFDLCAweDAwNUMsIDB4RkY2MCwgMHhGRjYxLCAweEZGNjIsIDB4RkY2MywgMHhGRjY0LCAweEZGNjUsCisgICAgMHhGRjY2LCAweEZGNjcsIDB4RkY2OCwgMHhGRjY5LCAweEZGNkEsIDB4RkY2QiwgMHhGRjZDLCAweEZGNkQsIDB4RkY2RSwKKyAgICAweEZGNkYsIDB4RkY3MCwgMHhGRjcxLCAweEZGNzIsIDB4RkY3MywgMHhGRjc0LCAweEZGNzUsIDB4RkY3NiwgMHhGRjc3LAorICAgIDB4RkY3OCwgMHhGRjc5LCAweEZGN0EsIDB4RkY3QiwgMHhGRjdDLCAweEZGN0QsIDB4RkY3RSwgMHhGRjdGLCAweEZGODAsCisgICAgMHhGRjgxLCAweEZGODIsIDB4RkY4MywgMHhGRjg0LCAweEZGODUsIDB4RkY4NiwgMHhGRjg3LCAweEZGODgsIDB4RkY4OSwKKyAgICAweEZGOEEsIDB4RkY4QiwgMHhGRjhDLCAweEZGOEQsIDB4RkY4RSwgMHhGRjhGLCAweEZGOTAsIDB4RkY5MSwgMHhGRjkyLAorICAgIDB4RkY5MywgMHhGRjk0LCAweEZGOTUsIDB4RkY5NiwgMHhGRjk3LCAweEZGOTgsIDB4RkY5OSwgMHhGRjlBLCAweEZGOUIsCisgICAgMHhGRjlDLCAweEZGOUQsIDB4RkY5RSwgMHhGRjlGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEVFLCAweDMwQUIsIDB4MzBCMSwKKyAgICAweDMwRjQsIDB4MzBBQywgMHgzMEFFLCAweDMwQjAsIDB4MzBCMiwgMHgzMEI0LCAweDMwQjYsIDB4MzBCOCwgMHgzMEJBLAorICAgIDB4MzBCQywgMHgzMEJFLCAweDMwQzAsIDB4MzBDMiwgMHgzMEM1LCAweDMwQzcsIDB4MzBDOSwgMHgzMEQwLCAweDMwRDEsCisgICAgMHgzMEQzLCAweDMwRDQsIDB4MzBENiwgMHgzMEQ3LCAweDMwRDksIDB4MzBEQSwgMHgzMERDLCAweDMwREQsIDB4RkY2MCwKKyAgICAweDMwOTIsIDB4MzA0MSwgMHgzMDQzLCAweDMwNDUsIDB4MzA0NywgMHgzMDQ5LCAweDMwODMsIDB4MzA4NSwgMHgzMDg3LAorICAgIDB4MzA2MywgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsCisgICAgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwKKyAgICAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAorICAgIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsCisgICAgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLCAweDMwOEQsIDB4MzA4RiwKKyAgICAweDMwOTMsIDB4MzA5MCwgMHgzMDkxLCAweDMwOEUsIDB4MzA0QywgMHgzMDRFLCAweDMwNTAsIDB4MzA1MiwgMHgzMDU0LAorICAgIDB4MzA1NiwgMHgzMDY4LCAweDMwNUEsIDB4MzA1QywgMHgzMDVFLCAweDMwNjAsIDB4MzA2MiwgMHgzMDY1LCAweDMwNjcsCisgICAgMHgzMDY5LCAweDMwNzAsIDB4MzA3MSwgMHgzMDczLCAweDMwNzQsIDB4MzA3NiwgMHgzMDc3LCAweDMwNzksIDB4MzA3QSwKKyAgICAweDMwN0MsIDB4MzA3RCwgMHgzMDFELCAweDMwMUUsIDB4MDA1QiwgMHgwMDVELCAweDMwMDgsIDB4MzAwOSwgMHgzMDBBLAorICAgIDB4MzAwQiwgMHgzMDBFLCAweDMwMEYsIDB4MzAxMCwgMHgzMDExLCAweDIwMTIsIDB4RkY2MCwgMHgyNTAwLCAweDI1MDEsCisgICAgMHgyNTAyLCAweDI1MDMsIDB4MjUwNCwgMHgyNTA1LCAweDI1MDYsIDB4MjUwNywgMHgyNTA4LCAweDI1MDksIDB4MjUwQSwKKyAgICAweDI1MEIsIDB4MjUwQywgMHgyNTBELCAweDI1MEUsIDB4MjUwRiwgMHgyNTEwLCAweDI1MTEsIDB4MjUxMiwgMHgyNTEzLAorICAgIDB4MjUxNCwgMHgyNTE1LCAweDI1MTYsIDB4MjUxNywgMHgyNTE4LCAweDI1MTksIDB4MjUxQSwgMHgyNTFCLCAweDI1MUMsCisgICAgMHgyNTFELCAweDI1MUUsIDB4MjUxRiwgMHgyNTIwLCAweDI1MjEsIDB4MjUyMiwgMHgyNTIzLCAweDI1MjQsIDB4MjUyNSwKKyAgICAweDI1MjYsIDB4MjUyNywgMHgyNTI4LCAweDI1MjksIDB4MjUyQSwgMHgyNTJCLCAweDI1MkMsIDB4MjUyRCwgMHgyNTJFLAorICAgIDB4MjUyRiwgMHgyNTMwLCAweDI1MzEsIDB4MjUzMiwgMHgyNTMzLCAweDI1MzQsIDB4MjUzNSwgMHgyNTM2LCAweDI1MzcsCisgICAgMHgyNTM4LCAweDI1MzksIDB4MjUzQSwgMHgyNTNCLCAweDI1M0MsIDB4MjUzRCwgMHgyNTNFLCAweDI1M0YsIDB4MjU0MCwKKyAgICAweDI1NDEsIDB4MjU0MiwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwgMHgyNTQ2LCAweDI1NDcsIDB4MjU0OCwgMHgyNTQ5LAorICAgIDB4MjU0QSwgMHgyNTRCLCAweDI1QjIsIDB4MjBBQywgMHgyMTI2LCAweDIwMzIsIDB4MjAzMywgMHhGQjAwLCAweEZCMDMsCisgICAgMHhGQjA0LCAweDAxMDEsIDB4MDEyQiwgMHgwMTZCLCAweDAxMTMsIDB4MDE0RCwgMHgwMTAwLCAweDAxMkEsIDB4MDE2QSwKKyAgICAweDAxMTIsIDB4MDE0QywgMHgyMTVCLCAweDIxNUMsIDB4MjE1RCwgMHgyMTVFLCAweDIxNTMsIDB4MjE1NCwgMHgyMDcwLAorICAgIDB4MjA3NCwgMHgyMDc1LCAweDIwNzYsIDB4MjA3NywgMHgyMDc4LCAweDIwNzksIDB4MjA4MCwgMHgyMDgxLCAweDIwODIsCisgICAgMHgyMDgzLCAweDIwODQsIDB4MjA4NSwgMHgyMDg2LCAweDIwODcsIDB4MjA4OCwgMHgyMDg5LCAweDAxQ0QsIDB4MDExQSwKKyAgICAweDAwMDAsIDB4MUVCQywgMHgwMUNGLCAweDAwMDAsIDB4MDEyOCwgMHgwMUQxLCAweDAwMDAsIDB4MDFEMywgMHgwMTZFLAorICAgIDB4MDE2OCwgMHgwMUNFLCAweDAxMUIsIDB4MDAwMCwgMHgxRUJELCAweDAxRDAsIDB4MDAwMCwgMHgwMTI5LCAweDAxRDIsCisgICAgMHgwMDAwLCAweDAxRDQsIDB4MDE2RiwgMHgwMTY5LCAweDAyNTEsIDB4MDI1MSwgMHgwMjUxLCAweDAxRkQsIDB4MDBFNiwKKyAgICAweDAyNTQsIDB4MDI1NCwgMHgwMjU0LCAweDAyNTksIDB4MDI1OSwgMHgwMjU5LCAweDAyNUEsIDB4MDI1QSwgMHgwMjVBLAorICAgIDB4MDI1QiwgMHgwMjVCLCAweDAyNUIsIDB4MDA2QSwgMHgwMTRCLCAweDAyNzUsIDB4MDI4QywgMHgwMjhDLCAweDAyOEMsCisgICAgMHgwMjkyLCAweDAyODMsIDB4MDJEMCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwKKyAgICAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLAorICAgIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwKKyAgICAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LAorICAgIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsCisgICAgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwKKyAgICAweDAwQTUsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LAorICAgIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsCisgICAgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwKKyAgICAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMEE2LCAweDAwN0QsIDB4MDMwMywgMHgwMkJDLAorICAgIDB4MDA1QywgMHgwMkJCLCAweDAwN0MsIDB4MDA3RSwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgyMDQ0LCAweDAxOTIsCisgICAgMHgwMEE3LCAweDAwQTQsIDB4MjAxQywgMHgwMEFCLCAweDIwMzksIDB4MjAzQSwgMHhGQjAxLCAweEZCMDIsIDB4MjAxMiwKKyAgICAweDIwMjAsIDB4MjAyMSwgMHgwMEI3LCAweDAwQjYsIDB4MjAyMiwgMHgyMDFBLCAweDIwMUUsIDB4MjAxRCwgMHgwMEJCLAorICAgIDB4MjAyNiwgMHgyMDMwLCAweDAwQkYsIDB4MDMwMSwgMHgwMzAyLCAweDAwQUYsIDB4MDMwNiwgMHgwMzA3LCAweDAzMDgsCisgICAgMHgwMzBBLCAweDAwQjgsIDB4MDMwQiwgMHgwMzI4LCAweDAzMEMsIDB4MDMzNiwgMHgwMEM2LCAweDAwQUEsIDB4MDE0MSwKKyAgICAweDAwRDgsIDB4MDE1MiwgMHgwMEJBLCAweDAwRTYsIDB4MDEzMSwgMHgwMTQyLCAweDAwRjgsIDB4MDE1MywgMHgwMERGLAorICAgIDB4MDAyRCwgMHgwMEE5LCAweDAwQUMsIDB4MDBBRSwgMHgwMEIwLCAweDAwQjEsIDB4MDBCMiwgMHgwMEIzLCAweDAwQjUsCisgICAgMHgwMEI5LCAweDAwQkMsIDB4MDBCRCwgMHgwMEJFLCAweDAwQzAsIDB4MDBDMSwgMHgwMEMyLCAweDAwQzMsIDB4MDBDNCwKKyAgICAweDAwQzUsIDB4MDBDNywgMHgwMEM4LCAweDAwQzksIDB4MDBDQSwgMHgwMENCLCAweDAwQ0MsIDB4MDBDRCwgMHgwMENFLAorICAgIDB4MDBDRiwgMHgwMEQwLCAweDAwRDEsIDB4MDBEMiwgMHgwMEQzLCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsCisgICAgMHgwMEQ5LCAweDAwREEsIDB4MDBEQiwgMHgwMERDLCAweDAwREQsIDB4MDBERSwgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwKKyAgICAweDAwRTMsIDB4MDBFNCwgMHgwMEU1LCAweDAwRTcsIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLAorICAgIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsIDB4MDBGMCwgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsCisgICAgMHgwMEY2LCAweDAwRjcsIDB4MDBGOSwgMHgwMEZBLCAweDAwRkIsIDB4MDBGQywgMHgwMEZELCAweDAwRkUsIDB4MDBGRiwKKyAgICAweDAxNjAsIDB4MDE3OCwgMHgwMTdELCAweDAzMDUsIDB4MDE2MSwgMHgyMTIyLCAweDAxN0UsIDB4MDAzMCwgMHgyMEFDLAorICAgIDB4MjEyNiwgMHgyMDMyLCAweDIwMzMsIDB4RkIwMCwgMHhGQjAzLCAweEZCMDQsIDB4MDEwMSwgMHgwMTJCLCAweDAxNkIsCisgICAgMHgwMTEzLCAweDAxNEQsIDB4MDEwMCwgMHgwMTJBLCAweDAxNkEsIDB4MDExMiwgMHgwMTRDLCAweDIxNUIsIDB4MjE1QywKKyAgICAweDIxNUQsIDB4MjE1RSwgMHgyMTUzLCAweDIxNTQsIDB4MjA3MCwgMHgyMDc0LCAweDIwNzUsIDB4MjA3NiwgMHgyMDc3LAorICAgIDB4MjA3OCwgMHgyMDc5LCAweDIwODAsIDB4MjA4MSwgMHgyMDgyLCAweDIwODMsIDB4MjA4NCwgMHgyMDg1LCAweDIwODYsCisgICAgMHgyMDg3LCAweDIwODgsIDB4MjA4OSwgMHgwMUNELCAweDAxMUEsIDB4MDAwMCwgMHgxRUJDLCAweDAxQ0YsIDB4MDAwMCwKKyAgICAweDAxMjgsIDB4MDFEMSwgMHgwMDAwLCAweDAxRDMsIDB4MDE2RSwgMHgwMTY4LCAweDAxQ0UsIDB4MDExQiwgMHgwMDAwLAorICAgIDB4MUVCRCwgMHgwMUQwLCAweDAwMDAsIDB4MDEyOSwgMHgwMUQyLCAweDAwMDAsIDB4MDFENCwgMHgwMTZGLCAweDAxNjksCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwKKyAgICAweDAwMzksIDB4MDMzNiwgMHgwMDJELCAweDAwM0QsIDB4MDAyQywgMHgwMDI4LCAweDAwMjksIDB4MDAyRSwgMHgwMDJGLAorICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsCisgICAgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMzM2LCAweDAwMkQsIDB4MDAzRCwgMHgwMDJDLCAweDAwMjgsIDB4MDAyOSwKKyAgICAweDAwMkUsIDB4MDAyRiwgMHgwMDNBLCAweDAwM0IsIDB4MDBCNywgMHgyMEFDLCAweDAwMDAsIDB4MjE1MywgMHgyMTU0LAorICAgIDB4MDBCRSwgMHgyMTU1LCAweDIxNTYsIDB4MjE1NywgMHgyMTU4LCAweDIxNTksIDB4MjE1QSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxNUIsIDB4MjE1QywgMHgyMTVELCAweDIxNUUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMzAsCisgICAgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwKKyAgICAweDAwMzAsIDB4MjE2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDIxNzAsIDB4MjE3MSwgMHgyMTcyLCAweDIxNzMsIDB4MjE3NCwgMHgyMTc1LCAweDIxNzYsCisgICAgMHgyMTc3LCAweDIxNzgsIDB4MjE3OSwgMHgyMTdBLCAweDIxN0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjE2MCwKKyAgICAweDIxNjEsIDB4MjE2MiwgMHgyMTYzLCAweDIxNjQsIDB4MjE2NSwgMHgyMTY2LCAweDIxNjcsIDB4MjE2OCwgMHgyMTY5LAorICAgIDB4MjE2QSwgMHgyMTZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsCisgICAgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwKKyAgICAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LAorICAgIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsCisgICAgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwKKyAgICAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLCAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLAorICAgIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsCisgICAgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwKKyAgICAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMiwgMHgzMEE0LAorICAgIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLCAweDMwQjUsCisgICAgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LCAweDMwQzYsIDB4MzBDOCwKKyAgICAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDIsIDB4MzBENSwgMHgzMEQ4LAorICAgIDB4MzBEQiwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFNCwgMHgzMEU2LCAweDMwRTgsCisgICAgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwKKyAgICAweDMwRjMsIDB4MzIyMCwgMHgzMjIxLCAweDMyMjIsIDB4MzIyMywgMHgzMjI0LCAweDMyMjUsIDB4MzIyNiwgMHgzMjI3LAorICAgIDB4MzIyOCwgMHgzMjI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NUI2LCAweDU0MDgsIDB4NkNFQiwgMHg1NTRGLCAweDdCNTQsIDB4NEY4QiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LAorICAgIDB4MDAzOSwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MzA2MywgMHg2MjRELCAweDMwMDcsIDB4NEUwMCwgMHg0RThDLCAweDRFMDksIDB4NTZEQiwKKyAgICAweDRFOTQsIDB4NTE2RCwgMHg0RTAzLCAweDUxNkIsIDB4NEU1RCwgMHg1MzQxLCAweDMwMDcsIDB4NEUwMCwgMHg0RThDLAorICAgIDB4NEUwOSwgMHg1NkRCLCAweDRFOTQsIDB4NTE2RCwgMHg0RTAzLCAweDUxNkIsIDB4NEU1RCwgMHg1MzQxLCAweDMwMDcsCisgICAgMHg0RTAwLCAweDRFOEMsIDB4NEUwOSwgMHg1NkRCLCAweDRFOTQsIDB4NTE2RCwgMHg0RTAzLCAweDUxNkIsIDB4NEU1RCwKKyAgICAweDMwNjQsIDB4NjI0RCwgMHg0RTAwLCAweDRFOEMsIDB4NEUwOSwgMHg1NkRCLCAweDRFOTQsIDB4NTE2RCwgMHg0RTAzLAorICAgIDB4NTE2QiwgMHg0RTVELCAweDUzNDEsIDB4MzAwNywgMHg0RTAwLCAweDRFOEMsIDB4NEUwOSwgMHg1NkRCLCAweDRFOTQsCisgICAgMHg1MTZELCAweDRFMDMsIDB4NTE2QiwgMHg0RTVELCAweDUzNDEsIDB4MzBCMywgMHgzMDYzLCAweDMwQzMsIDB4MzBBOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLCAweDI0NjQsIDB4MjQ2NSwgMHgyNDY2LAorICAgIDB4MjQ2NywgMHgyNDY4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjREMCwKKyAgICAweDI0RDEsIDB4MjREMiwgMHgyNEQzLCAweDI0RDQsIDB4MjRENSwgMHgyNEQ2LCAweDI0RDcsIDB4MjREOCwgMHgyNEQ5LAorICAgIDB4MjREQSwgMHgyNERCLCAweDI0REMsIDB4MjRERCwgMHgyNERFLCAweDI0REYsIDB4MjRFMCwgMHgyNEUxLCAweDI0RTIsCisgICAgMHgyNEUzLCAweDI0RTQsIDB4MjRFNSwgMHgyNEU2LCAweDI0RTcsIDB4MjRFOCwgMHgyNEU5LCAweDI0QjYsIDB4MjRCNywKKyAgICAweDI0QjgsIDB4MjRCOSwgMHgyNEJBLCAweDI0QkIsIDB4MjRCQywgMHgyNEJELCAweDI0QkUsIDB4MjRCRiwgMHgyNEMwLAorICAgIDB4MjRDMSwgMHgyNEMyLCAweDI0QzMsIDB4MjRDNCwgMHgyNEM1LCAweDI0QzYsIDB4MjRDNywgMHgyNEM4LCAweDI0QzksCisgICAgMHgyNENBLCAweDI0Q0IsIDB4MjRDQywgMHgyNENELCAweDI0Q0UsIDB4MjRDRiwgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwKKyAgICAweDMwNDgsIDB4MzA0QSwgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LAorICAgIDB4MzA1OSwgMHgzMDVCLCAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLCAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsCisgICAgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwKKyAgICAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LAorICAgIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsCisgICAgMHgzMkQwLCAweDMyRDEsIDB4MzJEMiwgMHgzMkQzLCAweDMyRDQsIDB4MzJENSwgMHgzMkQ2LCAweDMyRDcsIDB4MzJEOCwKKyAgICAweDMyRDksIDB4MzJEQSwgMHgzMkRCLCAweDMyREMsIDB4MzJERCwgMHgzMkRFLCAweDMyREYsIDB4MzJFMCwgMHgzMkUxLAorICAgIDB4MzJFMiwgMHgzMkUzLCAweDMyRTQsIDB4MzJFNSwgMHgzMkU2LCAweDMyRTcsIDB4MzJFOCwgMHgzMkU5LCAweDMyRUEsCisgICAgMHgzMkVCLCAweDMyRUMsIDB4MzJFRCwgMHgzMkVFLCAweDMyRUYsIDB4MzJGMCwgMHgzMkYxLCAweDMyRjIsIDB4MzJGMywKKyAgICAweDMyRjQsIDB4MzJGNSwgMHgzMkY2LCAweDMyRjcsIDB4MzJGOCwgMHgzMkY5LCAweDMyRkEsIDB4MzJGQiwgMHgzMkZDLAorICAgIDB4MzJGRCwgMHgzMkZFLCAweDMwRjMsIDB4MzI4MCwgMHgzMjgxLCAweDMyODIsIDB4MzI4MywgMHgzMjg0LCAweDMyODUsCisgICAgMHgzMjg2LCAweDMyODcsIDB4MzI4OCwgMHgzMjg5LCAweDMyOTAsIDB4MzI4QSwgMHgzMjhCLCAweDMyOEMsIDB4MzI4RCwKKyAgICAweDMyOEUsIDB4MzI4RiwgMHg4QUJGLCAweDMyOUYsIDB4NTI2RiwgMHg2RTFCLCAweDZBMTksIDB4NkIyMCwgMHg1N0ZBLAorICAgIDB4Nzk4MSwgMHgzMkEwLCAweDMyQTEsIDB4MzI5QiwgMHgzMjlBLCAweDMyQTMsIDB4MzJBMiwgMHgzMjk3LCAweDUxRkEsCisgICAgMHgzMjlDLCAweDMyOTUsIDB4NkUwOCwgMHg1ODk3LCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLCAweDk2RkIsIDB4MjVDQywKKyAgICAweDAwMzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwKKyAgICAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAorICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsCisgICAgMHgwMDc5LCAweDAwN0EsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLAorICAgIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksCisgICAgMHgwMDVBLCAweDMwNDIsIDB4MzA0NCwgMHgzMDQ2LCAweDMwNDgsIDB4MzA0QSwgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwKKyAgICAweDMwNTEsIDB4MzA1MywgMHgzMDU1LCAweDMwNTcsIDB4MzA1OSwgMHgzMDVCLCAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLAorICAgIDB4MzA2NCwgMHgzMDY2LCAweDMwNjgsIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsCisgICAgMHgzMDcyLCAweDMwNzUsIDB4MzA3OCwgMHgzMDdCLCAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwKKyAgICAweDMwODQsIDB4MzA4NiwgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLAorICAgIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMEEyLCAweDMwQTQsIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsCisgICAgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwKKyAgICAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLAorICAgIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwREYsCisgICAgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwKKyAgICAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4NjVFNSwgMHg2NzA4LAorICAgIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLCAweDI1Q0YsCisgICAgMHgwMDMwLCAweDAwMDAsIDB4MDAzMSwgMHgwMDAwLCAweDAwMzIsIDB4MDAwMCwgMHgwMDMzLCAweDAwMDAsIDB4MDAzNCwKKyAgICAweDAwMDAsIDB4MDAzNSwgMHgwMDAwLCAweDAwMzYsIDB4MDAwMCwgMHgwMDM3LCAweDAwMDAsIDB4MDAzOCwgMHgwMDAwLAorICAgIDB4MDAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwKKyAgICAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAorICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsCisgICAgMHgwMDc5LCAweDAwN0EsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLAorICAgIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksCisgICAgMHgwMDVBLCAweDMwNDIsIDB4MzA0NCwgMHgzMDQ2LCAweDMwNDgsIDB4MzA0QSwgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwKKyAgICAweDMwNTEsIDB4MzA1MywgMHgzMDU1LCAweDMwNTcsIDB4MzA1OSwgMHgzMDVCLCAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLAorICAgIDB4MzA2NCwgMHgzMDY2LCAweDMwNjgsIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsCisgICAgMHgzMDcyLCAweDMwNzUsIDB4MzA3OCwgMHgzMDdCLCAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwKKyAgICAweDMwODQsIDB4MzA4NiwgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLAorICAgIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMEEyLCAweDMwQTQsIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsCisgICAgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwKKyAgICAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLAorICAgIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwREYsCisgICAgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwKKyAgICAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4NjVFNSwgMHg2NzA4LAorICAgIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLCAweDhDQTAsIDB4NTJERCwgMHg1NTRGLCAweDdCNTQsCisgICAgMHg0RjhCLCAweDI1QTEsIDB4MjVBMSwgMHgwMDMwLCAweDAwMDAsIDB4MDAzMSwgMHgwMDAwLCAweDAwMzIsIDB4MDAwMCwKKyAgICAweDAwMzMsIDB4MDAwMCwgMHgwMDM0LCAweDAwMDAsIDB4MDAzNSwgMHgwMDAwLCAweDAwMzYsIDB4MDAwMCwgMHgwMDM3LAorICAgIDB4MDAwMCwgMHgwMDM4LCAweDAwMDAsIDB4MDAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKyAgICAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLAorICAgIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsCisgICAgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwKKyAgICAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELAorICAgIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsCisgICAgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDMwNDIsIDB4MzA0NCwgMHgzMDQ2LCAweDMwNDgsIDB4MzA0QSwKKyAgICAweDMwNEIsIDB4MzA0RCwgMHgzMDRGLCAweDMwNTEsIDB4MzA1MywgMHgzMDU1LCAweDMwNTcsIDB4MzA1OSwgMHgzMDVCLAorICAgIDB4MzA1RCwgMHgzMDVGLCAweDMwNjEsIDB4MzA2NCwgMHgzMDY2LCAweDMwNjgsIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsCisgICAgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcyLCAweDMwNzUsIDB4MzA3OCwgMHgzMDdCLCAweDMwN0UsIDB4MzA3RiwKKyAgICAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODQsIDB4MzA4NiwgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLAorICAgIDB4MzA4QywgMHgzMDhELCAweDMwOEYsIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMEEyLCAweDMwQTQsCisgICAgMHgzMEE2LCAweDMwQTgsIDB4MzBBQSwgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwKKyAgICAweDMwQjcsIDB4MzBCOSwgMHgzMEJCLCAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LAorICAgIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsCisgICAgMHgzMERCLCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwKKyAgICAweDMwRTksIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLAorICAgIDB4MzBGMywgMHg2NUU1LCAweDY3MDgsIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLCAweDU1NEYsCisgICAgMHg3QjU0LCAweDRGOEIsIDB4MjVBMCwgMHgwMDMwLCAweDAwMDAsIDB4MDAzMSwgMHgwMDAwLCAweDAwMzIsIDB4MDAwMCwKKyAgICAweDAwMzMsIDB4MDAwMCwgMHgwMDM0LCAweDAwMDAsIDB4MDAzNSwgMHgwMDAwLCAweDAwMzYsIDB4MDAwMCwgMHgwMDM3LAorICAgIDB4MDAwMCwgMHgwMDM4LCAweDAwMDAsIDB4MDAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKyAgICAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLAorICAgIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsCisgICAgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwKKyAgICAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELAorICAgIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsCisgICAgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDMwNDIsIDB4MzA0NCwgMHgzMDQ2LCAweDMwNDgsIDB4MzA0QSwKKyAgICAweDMwNEIsIDB4MzA0RCwgMHgzMDRGLCAweDMwNTEsIDB4MzA1MywgMHgzMDU1LCAweDMwNTcsIDB4MzA1OSwgMHgzMDVCLAorICAgIDB4MzA1RCwgMHgzMDVGLCAweDMwNjEsIDB4MzA2NCwgMHgzMDY2LCAweDMwNjgsIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsCisgICAgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcyLCAweDMwNzUsIDB4MzA3OCwgMHgzMDdCLCAweDMwN0UsIDB4MzA3RiwKKyAgICAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODQsIDB4MzA4NiwgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLAorICAgIDB4MzA4QywgMHgzMDhELCAweDMwOEYsIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMEEyLCAweDMwQTQsCisgICAgMHgzMEE2LCAweDMwQTgsIDB4MzBBQSwgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwKKyAgICAweDMwQjcsIDB4MzBCOSwgMHgzMEJCLCAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LAorICAgIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsCisgICAgMHgzMERCLCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwKKyAgICAweDMwRTksIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLAorICAgIDB4MzBGMywgMHg2NUU1LCAweDY3MDgsIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLCAweDU1NEYsCisgICAgMHg3QjU0LCAweDRGOEIsIDB4MDAzMCwgMHgwMDAwLCAweDAwMzEsIDB4MDAwMCwgMHgwMDMyLCAweDAwMDAsIDB4MDAzMywKKyAgICAweDAwMDAsIDB4MDAzNCwgMHgwMDAwLCAweDAwMzUsIDB4MDAwMCwgMHgwMDM2LCAweDAwMDAsIDB4MDAzNywgMHgwMDAwLAorICAgIDB4MDAzOCwgMHgwMDAwLCAweDAwMzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwKKyAgICAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELAorICAgIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsCisgICAgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwKKyAgICAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLAorICAgIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwKKyAgICAweDMwNEQsIDB4MzA0RiwgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELAorICAgIDB4MzA1RiwgMHgzMDYxLCAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsCisgICAgMHgzMDZFLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwKKyAgICAweDMwODEsIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAorICAgIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMiwgMHgzMEE0LCAweDMwQTYsCisgICAgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLCAweDMwQjUsIDB4MzBCNywKKyAgICAweDMwQjksIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LCAweDMwQzYsIDB4MzBDOCwgMHgzMENBLAorICAgIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDIsIDB4MzBENSwgMHgzMEQ4LCAweDMwREIsCisgICAgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFNCwgMHgzMEU2LCAweDMwRTgsIDB4MzBFOSwKKyAgICAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLAorICAgIDB4NjVFNSwgMHg2NzA4LCAweDcwNkIsIDB4NkMzNCwgMHg2NzI4LCAweDkxRDEsIDB4NTcxRiwgMHg1NTRGLCAweDdCNTQsCisgICAgMHg0RjhCLCAweDI1QTAsIDB4MzNDMiwgMHgzM0NELCAweDIxMTYsIDB4MDAwMCwgMHgzM0Q4LCAweDMzREEsIDB4MjEyMSwKKyAgICAweDIxMjIsIDB4MDAwMCwgMHgyMTAwLCAweDMzQzIsIDB4MDAwMCwgMHgzM0M0LCAweDIxMDUsIDB4MzM5NywgMHgzMzcxLAorICAgIDB4MzM5OCwgMHgyMTEzLCAweDMzOEQsIDB4MzM5QiwgMHgzMzk2LCAweDAwMDAsIDB4MDAwMCwgMHgzM0Q3LCAweDMzRDgsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzMzAxLCAweDMzMDIsIDB4MzMwNCwgMHgzMzA2LCAweDAwMDAsIDB4MzMwOCwKKyAgICAweDAwMDAsIDB4MzMwNywgMHgzMzBBLCAweDAwMDAsIDB4MzMwOSwgMHgwMDAwLCAweDMzMEIsIDB4MDAwMCwgMHgzMzBDLAorICAgIDB4MzMwRSwgMHgzMzBGLCAweDMzMTAsIDB4MzMxMSwgMHgzMzEyLCAweDMzMTMsIDB4MDAwMCwgMHgzMzE3LCAweDAwMDAsCisgICAgMHgzMzE5LCAweDAwMDAsIDB4MzMxQSwgMHgzMzFCLCAweDMzMUMsIDB4MzMxRCwgMHgzMzFGLCAweDMzMjAsIDB4MzMyMSwKKyAgICAweDMzMjQsIDB4MDAwMCwgMHgzMzI1LCAweDAwMDAsIDB4MDAwMCwgMHgzMzI4LCAweDMzMjksIDB4MDAwMCwgMHgzMzJELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzMkUsIDB4MzMyRiwgMHgzMzMwLCAweDMzMzIsIDB4MDAwMCwgMHgwMDAwLCAweDMzMzQsCisgICAgMHgzMzM1LCAweDMzM0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzMzNywgMHgwMDAwLCAweDMzMzgsIDB4MzMzQSwKKyAgICAweDMzM0QsIDB4MzM0MSwgMHgzMzNFLCAweDMzM0YsIDB4MzM0MCwgMHgzMzQzLCAweDMzNDQsIDB4MzM0NSwgMHgzMzQ2LAorICAgIDB4MzM0OCwgMHgzMzRCLCAweDMzNEMsIDB4MzM0RiwgMHgzMzUwLCAweDAwMDAsIDB4MDAwMCwgMHgzMzUyLCAweDMzNTQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MzM1MywgMHgzMzU1LCAweDMzNTYsIDB4MDAwMCwgMHgzMzAxLCAweDMzMDIsIDB4MzMwNCwKKyAgICAweDMzMDYsIDB4MDAwMCwgMHgzMzA4LCAweDAwMDAsIDB4MzMwNywgMHgzMzBBLCAweDAwMDAsIDB4MzMwOSwgMHgwMDAwLAorICAgIDB4MzMwQiwgMHgwMDAwLCAweDMzMEMsIDB4MzMwRSwgMHgzMzBGLCAweDMzMTAsIDB4MzMxMSwgMHgzMzEyLCAweDMzMTMsCisgICAgMHgwMDAwLCAweDMzMTcsIDB4MDAwMCwgMHgzMzE5LCAweDAwMDAsIDB4MzMxQSwgMHgzMzFCLCAweDMzMUMsIDB4MzMxRCwKKyAgICAweDMzMUYsIDB4MzMyMCwgMHgzMzIxLCAweDMzMjQsIDB4MDAwMCwgMHgzMzI1LCAweDAwMDAsIDB4MDAwMCwgMHgzMzI4LAorICAgIDB4MzMyOSwgMHgwMDAwLCAweDMzMkQsIDB4MDAwMCwgMHgwMDAwLCAweDMzMkUsIDB4MzMyRiwgMHgzMzMwLCAweDMzMzIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MzMzNCwgMHgzMzM1LCAweDMzM0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzMzNywKKyAgICAweDAwMDAsIDB4MzMzOCwgMHgzMzNBLCAweDMzM0QsIDB4MzM0MSwgMHgzMzNFLCAweDMzM0YsIDB4MzM0MCwgMHgzMzQzLAorICAgIDB4MzM0NCwgMHgzMzQ1LCAweDMzNDYsIDB4MzM0OCwgMHgzMzRCLCAweDMzNEMsIDB4MzM0RiwgMHgzMzUwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDMzNTIsIDB4MzM1NCwgMHgwMDAwLCAweDAwMDAsIDB4MzM1MywgMHgzMzU1LCAweDMzNTYsIDB4MzM3RSwKKyAgICAweDMzN0QsIDB4MzM3QywgMHgzMzdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDJELCAweDAwM0QsIDB4MjEwMywgMHgyNjQwLCAweDI2NDIsIDB4MzAxMywKKyAgICAweDMwMTIsIDB4MzAwQywgMHgzMDBELCAweDMwMEUsIDB4MzAwRiwgMHgzMDFBLCAweDMwMUIsIDB4MzAxOCwgMHgzMDE5LAorICAgIDB4RkYwOCwgMHhGRjA5LCAweDMwMUQsIDB4MzAxRSwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDAwMjcsCisgICAgMHgwMDIyLCAweDAwMDAsIDB4MjEzNSwgMHgwM0QwLCAweDIyMEEsIDB4MjEwRiwgMHgwMEI1LCAweDAzQzYsIDB4MDNEQiwKKyAgICAweDAzRDEsIDB4RkZGRCwgMHgyNjY4LCAweDI2NjksIDB4MjY2QywgMHhGRjFBLCAweDAwQTksIDB4MDBBOSwgMHgwMEFFLAorICAgIDB4MDBBRSwgMHgzMDNCLCAweDMwM0IsIDB4MzAzMywgMHgzMDM0LCAweDMwMzUsIDB4MjAzQywgMHgyMDQ5LCAweDAwMjEsCisgICAgMHgyMDNDLCAweDIwNDksIDB4MjQ0QSwgMHgwMDAwLCAweDIyMTMsIDB4MjI2MCwgMHgyMjQzLCAweDIyNzIsIDB4MjI3MywKKyAgICAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MzAxQSwgMHgzMDFCLCAweDMwMTgsIDB4MzAxOSwgMHhGRjVGLAorICAgIDB4RkY2MCwgMHgzMDBDLCAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLCAweDMwMUEsIDB4MzAxQiwgMHgzMDE4LCAweDMwMTksCisgICAgMHhGRjVGLCAweEZGNjAsIDB4MjM5QiwgMHgyMzlELCAweDIzOUUsIDB4MjNBMCwgMHgyMzlELCAweDIzOUIsIDB4MjNBMCwKKyAgICAweDIzOUUsIDB4MjNBMSwgMHgyM0EzLCAweDIzQTQsIDB4MjNBNiwgMHgyM0EzLCAweDIzQTEsIDB4MjNBNiwgMHgyM0E0LAorICAgIDB4MjNBMSwgMHgyM0EzLCAweDIzQTQsIDB4MjNBNiwgMHgyM0EzLCAweDIzQTEsIDB4MjNBNiwgMHgyM0E0LCAweEZGNUMsCisgICAgMHgyMDE1LCAweDMwMUQsIDB4MzAxRSwgMHgyMDE4LCAweDIwMTksIDB4MjAxOCwgMHgyMDE5LCAweDI3MDIsIDB4MjcwMiwKKyAgICAweDI3MDIsIDB4MjcwMiwgMHgzMDNELCAweDMwMTIsIDB4MzA5RiwgMHg1MzRELCAweDIyMDcsIDB4MjIwNSwgMHgyMkEwLAorICAgIDB4MjI5NiwgMHgyMjk4LCAweDIyOTUsIDB4MjI5NywgMHgyMjlFLCAweDIyOTUsIDB4MDAyMSwgMHgyNUIzLCAweDI1QzAsCisgICAgMHgyNUI2LCAweDIxRTYsIDB4MjFFOCwgMHgyMUU3LCAweDIxRTksIDB4MjFEMCwgMHgyMTk0LCAweDIxOTgsIDB4MjE5OSwKKyAgICAweDIxOTYsIDB4MjE5NywgMHgyMUNDLCAweDIxQzYsIDB4MjFDNCwgMHgyMUM1LCAweDIxOTAsIDB4MjE5MiwgMHgyMTkxLAorICAgIDB4MjE5MywgMHgyMTk0LCAweDIxOTUsIDB4MjUwNCwgMHgyNTA2LCAweDMwMzAsIDB4MjMwNywgMHgzMDMwLCAweDIzMDcsCisgICAgMHgzMDMwLCAweDIzMDcsIDB4MzAzMCwgMHgyMzA3LCAweDMwMzAsIDB4MjMwNywgMHgyNzQwLCAweDI3M0YsIDB4MjVBMSwKKyAgICAweDI1QTAsIDB4MjVBMSwgMHgyNUExLCAweDI1QTEsIDB4MjVBMSwgMHgyNUExLCAweDI1QUIsIDB4MjVBMCwgMHgyNUFBLAorICAgIDB4MjcxQSwgMHgyNzFBLCAweDI1QzcsIDB4MjVDNiwgMHgyNUM3LCAweDI1QzcsIDB4MjVDNywgMHgyNUM3LCAweDI1QzcsCisgICAgMHgyNUM2LCAweDI1QzYsIDB4MjVDRSwgMHgyNUM5LCAweDI1Q0IsIDB4MjVFNiwgMHgyNUNGLCAweDIwMjIsIDB4Mjc1NiwKKyAgICAweDI3NTYsIDB4Mjc1NiwgMHgyNzU2LCAweDMwMDgsIDB4MzAwOSwgMHgzMDA4LCAweDMwMDksIDB4MzAwQSwgMHgzMDBCLAorICAgIDB4MzAwQSwgMHgzMDBCLCAweDMwNTMsIDB4MzA1MywgMHgzMEIzLCAweDMwQjMsIDB4MzA5RCwgMHgzMDlFLCAweDMwNDEsCisgICAgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwgMHgzMDQ1LCAweDMwNDYsIDB4MzA0NywgMHgzMDQ4LCAweDMwNDksIDB4MzA0QSwKKyAgICAweDMwNEIsIDB4MzA0QiwgMHgzMDRDLCAweDMwNEQsIDB4MzA0RSwgMHgzMDRGLCAweDMwNTAsIDB4MzA1MSwgMHgzMDUxLAorICAgIDB4MzA1MiwgMHgzMDUzLCAweDMwNTMsIDB4MzA1NCwgMHgzMDU1LCAweDMwNTYsIDB4MzA1NywgMHgzMDU4LCAweDMwNTksCisgICAgMHgzMDVBLCAweDMwNUIsIDB4MzA1QywgMHgzMDVELCAweDMwNUUsIDB4MzA1RiwgMHgzMDYwLCAweDMwNjEsIDB4MzA2MiwKKyAgICAweDMwNjMsIDB4MzA2NCwgMHgzMDY1LCAweDMwNjYsIDB4MzA2NywgMHgzMDY4LCAweDMwNjksIDB4MzA2QSwgMHgzMDZCLAorICAgIDB4MzA2QywgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcwLCAweDMwNzEsIDB4MzA3MiwgMHgzMDczLCAweDMwNzQsCisgICAgMHgzMDc1LCAweDMwNzYsIDB4MzA3NywgMHgzMDc4LCAweDMwNzksIDB4MzA3QSwgMHgzMDdCLCAweDMwN0MsIDB4MzA3RCwKKyAgICAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDgzLCAweDMwODQsIDB4MzA4NSwgMHgzMDg2LAorICAgIDB4MzA4NywgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhFLCAweDMwOEYsCisgICAgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLCAweDMwOTQsIDB4MzBGRCwgMHgzMEZFLCAweDMwRkMsIDB4MzBBMSwKKyAgICAweDMwQTIsIDB4MzBBMywgMHgzMEE0LCAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LCAweDMwQTgsIDB4MzBBOSwgMHgzMEFBLAorICAgIDB4MzBGNSwgMHgzMEFCLCAweDMwQUMsIDB4MzBBRCwgMHgzMEFFLCAweDMwQUYsIDB4MzBCMCwgMHgzMEY2LCAweDMwQjEsCisgICAgMHgzMEIyLCAweDMwQjMsIDB4MzBCMywgMHgzMEI0LCAweDMwQjUsIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwKKyAgICAweDMwQkEsIDB4MzBCQiwgMHgzMEJDLCAweDMwQkQsIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLAorICAgIDB4MzBDMywgMHgzMEM0LCAweDMwQzUsIDB4MzBDNiwgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsCisgICAgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDAsIDB4MzBEMSwgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwKKyAgICAweDMwRDUsIDB4MzBENiwgMHgzMEQ3LCAweDMwRDgsIDB4MzBEOSwgMHgzMERBLCAweDMwREIsIDB4MzBEQywgMHgzMERELAorICAgIDB4MzBERSwgMHgzMERGLCAweDMwRTAsIDB4MzBFMSwgMHgzMEUyLCAweDMwRTMsIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsCisgICAgMHgzMEU3LCAweDMwRTgsIDB4MzBFOSwgMHgzMEVBLCAweDMwRUIsIDB4MzBFQywgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwKKyAgICAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4MzBGNCwgMHgzMEY3LCAweDMwRjgsIDB4MzBGOSwgMHgzMEZBLAorICAgIDB4MzA5RCwgMHgzMDlFLCAweDMwNDEsIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsCisgICAgMHgzMDQ4LCAweDMwNDksIDB4MzA0QSwgMHgzMDRCLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELCAweDMwNEUsIDB4MzA0RiwKKyAgICAweDMwNTAsIDB4MzA1MSwgMHgzMDUxLCAweDMwNTIsIDB4MzA1MywgMHgzMDUzLCAweDMwNTQsIDB4MzA1NSwgMHgzMDU2LAorICAgIDB4MzA1NywgMHgzMDU4LCAweDMwNTksIDB4MzA1QSwgMHgzMDVCLCAweDMwNUMsIDB4MzA1RCwgMHgzMDVFLCAweDMwNUYsCisgICAgMHgzMDYwLCAweDMwNjEsIDB4MzA2MiwgMHgzMDYzLCAweDMwNjQsIDB4MzA2NSwgMHgzMDY2LCAweDMwNjcsIDB4MzA2OCwKKyAgICAweDMwNjksIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsIDB4MzA3MCwgMHgzMDcxLAorICAgIDB4MzA3MiwgMHgzMDczLCAweDMwNzQsIDB4MzA3NSwgMHgzMDc2LCAweDMwNzcsIDB4MzA3OCwgMHgzMDc5LCAweDMwN0EsCisgICAgMHgzMDdCLCAweDMwN0MsIDB4MzA3RCwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsIDB4MzA4MywKKyAgICAweDMwODQsIDB4MzA4NSwgMHgzMDg2LCAweDMwODcsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAorICAgIDB4MzA4RCwgMHgzMDhFLCAweDMwOEYsIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMDk0LCAweDMwRkQsCisgICAgMHgzMEZFLCAweDMwRkMsIDB4MzBBMSwgMHgzMEEyLCAweDMwQTMsIDB4MzBBNCwgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywKKyAgICAweDMwQTgsIDB4MzBBOSwgMHgzMEFBLCAweDMwRjUsIDB4MzBBQiwgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLAorICAgIDB4MzBCMCwgMHgzMEY2LCAweDMwQjEsIDB4MzBCMiwgMHgzMEIzLCAweDMwQjMsIDB4MzBCNCwgMHgzMEI1LCAweDMwQjYsCisgICAgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwgMHgzMEJBLCAweDMwQkIsIDB4MzBCQywgMHgzMEJELCAweDMwQkUsIDB4MzBCRiwKKyAgICAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLCAweDMwQzMsIDB4MzBDNCwgMHgzMEM1LCAweDMwQzYsIDB4MzBDNywgMHgzMEM4LAorICAgIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwgMHgzMEQwLCAweDMwRDEsCisgICAgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwgMHgzMEQ1LCAweDMwRDYsIDB4MzBENywgMHgzMEQ4LCAweDMwRDksIDB4MzBEQSwKKyAgICAweDMwREIsIDB4MzBEQywgMHgzMERELCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEUzLAorICAgIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsIDB4MzBFNywgMHgzMEU4LCAweDMwRTksIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsCisgICAgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLCAweDMwRjQsIDB4MzBGNywKKyAgICAweDMwRjgsIDB4MzBGOSwgMHgzMEZBLCAweDMwMDEsIDB4MzAwMiwgMHgzMEZCLCAweEZGMEEsIDB4MjAzQiwgMHgyNUNCLAorICAgIDB4MjVDRSwgMHgyNUM5LCAweDI1QjMsIDB4MjVCMiwgMHgzMEZELCAweDMwRkUsIDB4MzA5RCwgMHgzMDlFLCAweEZGMDgsCisgICAgMHhGRjA5LCAweDMwMTQsIDB4MzAxNSwgMHhGRjA4LCAweEZGMDksIDB4MzAxNCwgMHgzMDE1LCAweDAwMzAsIDB4MDAzMSwKKyAgICAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgzMDQxLAorICAgIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsIDB4MzA0OCwgMHgzMDQ5LCAweDMwNEEsCisgICAgMHgzMDRCLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELCAweDMwNEUsIDB4MzA0RiwgMHgzMDUwLCAweDMwNTEsIDB4MzA1MSwKKyAgICAweDMwNTIsIDB4MzA1MywgMHgzMDU0LCAweDMwNTUsIDB4MzA1NiwgMHgzMDU3LCAweDMwNTgsIDB4MzA1OSwgMHgzMDVBLAorICAgIDB4MzA1QiwgMHgzMDVDLCAweDMwNUQsIDB4MzA1RSwgMHgzMDVGLCAweDMwNjAsIDB4MzA2MSwgMHgzMDYyLCAweDMwNjMsCisgICAgMHgzMDY0LCAweDMwNjUsIDB4MzA2NiwgMHgzMDY3LCAweDMwNjgsIDB4MzA2OSwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywKKyAgICAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLCAweDMwNzAsIDB4MzA3MSwgMHgzMDcyLCAweDMwNzMsIDB4MzA3NCwgMHgzMDc1LAorICAgIDB4MzA3NiwgMHgzMDc3LCAweDMwNzgsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0IsIDB4MzA3QywgMHgzMDdELCAweDMwN0UsCisgICAgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODMsIDB4MzA4NCwgMHgzMDg1LCAweDMwODYsIDB4MzA4NywKKyAgICAweDMwODgsIDB4MzA4OSwgMHgzMDhBLCAweDMwOEIsIDB4MzA4QywgMHgzMDhELCAweDMwOEUsIDB4MzA4RiwgMHgzMDkwLAorICAgIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzA5NCwgMHgzMDQxLCAweDMwNDMsIDB4MzA0NSwgMHgzMDQ3LCAweDMwNDksCisgICAgMHgzMDRCLCAweDMwNTEsIDB4MzA2MywgMHgzMDgzLCAweDMwODUsIDB4MzA4NywgMHgzMDhFLCAweDMwQTEsIDB4MzBBMiwKKyAgICAweDMwQTMsIDB4MzBBNCwgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywgMHgzMEE4LCAweDMwQTksIDB4MzBBQSwgMHgzMEFCLAorICAgIDB4MzBGNSwgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsIDB4MzBCMSwgMHgzMEY2LCAweDMwQjIsCisgICAgMHgzMEIzLCAweDMwQjQsIDB4MzBCNSwgMHgzMEI2LCAweDMwQjcsIDB4MzBCOCwgMHgzMEI5LCAweDMwQkEsIDB4MzBCQiwKKyAgICAweDMwQkMsIDB4MzBCRCwgMHgzMEJFLCAweDMwQkYsIDB4MzBDMCwgMHgzMEMxLCAweDMwQzIsIDB4MzBDMywgMHgzMEM0LAorICAgIDB4MzBDNSwgMHgzMEM2LCAweDMwQzcsIDB4MzBDOCwgMHgzMEM5LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsCisgICAgMHgzMENFLCAweDMwQ0YsIDB4MzBEMCwgMHgzMEQxLCAweDMwRDIsIDB4MzBEMywgMHgzMEQ0LCAweDMwRDUsIDB4MzBENiwKKyAgICAweDMwRDcsIDB4MzBEOCwgMHgzMEQ5LCAweDMwREEsIDB4MzBEQiwgMHgzMERDLCAweDMwREQsIDB4MzBERSwgMHgzMERGLAorICAgIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFMywgMHgzMEU0LCAweDMwRTUsIDB4MzBFNiwgMHgzMEU3LCAweDMwRTgsCisgICAgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRSwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwKKyAgICAweDMwRjIsIDB4MzBGMywgMHgzMEY0LCAweDMwQTEsIDB4MzBBMywgMHgzMEE1LCAweDMwQTcsIDB4MzBBOSwgMHgzMEY1LAorICAgIDB4MzBGNiwgMHgzMEMzLCAweDMwRTMsIDB4MzBFNSwgMHgzMEU3LCAweDMwRUUsIDB4MzBGQywgMHgzMEZDLCAweDZDRTgsCisgICAgMHgyMEFDLCAweDIxMjYsIDB4MjAzMiwgMHgyMDMzLCAweEZCMDAsIDB4RkIwMywgMHhGQjA0LCAweDAxMDEsIDB4MDEyQiwKKyAgICAweDAxNkIsIDB4MDExMywgMHgwMTRELCAweDAxMDAsIDB4MDEyQSwgMHgwMTZBLCAweDAxMTIsIDB4MDE0QywgMHgyMTVCLAorICAgIDB4MjE1QywgMHgyMTVELCAweDIxNUUsIDB4MjE1MywgMHgyMTU0LCAweDIwNzAsIDB4MjA3NCwgMHgyMDc1LCAweDIwNzYsCisgICAgMHgyMDc3LCAweDIwNzgsIDB4MjA3OSwgMHgyMDgwLCAweDIwODEsIDB4MjA4MiwgMHgyMDgzLCAweDIwODQsIDB4MjA4NSwKKyAgICAweDIwODYsIDB4MjA4NywgMHgyMDg4LCAweDIwODksIDB4MDFDRCwgMHgwMTFBLCAweDAwMDAsIDB4MUVCQywgMHgwMUNGLAorICAgIDB4MDAwMCwgMHgwMTI4LCAweDAxRDEsIDB4MDAwMCwgMHgwMUQzLCAweDAxNkUsIDB4MDE2OCwgMHgwMUNFLCAweDAxMUIsCisgICAgMHgwMDAwLCAweDFFQkQsIDB4MDFEMCwgMHgwMDAwLCAweDAxMjksIDB4MDFEMiwgMHgwMDAwLCAweDAxRDQsIDB4MDE2RiwKKyAgICAweDAxNjksIDB4MDI1MSwgMHgwMjUxLCAweDAyNTEsIDB4MDFGRCwgMHgwMEU2LCAweDAyNTQsIDB4MDI1NCwgMHgwMjU0LAorICAgIDB4MDI1OSwgMHgwMjU5LCAweDAyNTksIDB4MDI1QSwgMHgwMjVBLCAweDAyNUEsIDB4MDI1QiwgMHgwMjVCLCAweDAyNUIsCisgICAgMHgwMDZBLCAweDAxNEIsIDB4MDI3NSwgMHgwMjhDLCAweDAyOEMsIDB4MDI4QywgMHgwMjkyLCAweDAyODMsIDB4MDJEMCwKKyAgICAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LAorICAgIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsCisgICAgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwKKyAgICAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorICAgIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsCisgICAgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwKKyAgICAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwQTUsIDB4MDA1RCwgMHgwMDVFLAorICAgIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwKKyAgICAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LAorICAgIDB4MDA3QSwgMHgwMDdCLCAweDAwQTYsIDB4MDA3RCwgMHgwMzAzLCAweDAyQkMsIDB4MDA1QywgMHgwMkJCLCAweDAwN0MsCisgICAgMHgwMDdFLCAweDAwQTEsIDB4MDBBMiwgMHgwMEEzLCAweDIwNDQsIDB4MDE5MiwgMHgwMEE3LCAweDAwQTQsIDB4MjAxQywKKyAgICAweDAwQUIsIDB4MjAzOSwgMHgyMDNBLCAweEZCMDEsIDB4RkIwMiwgMHgyMDEyLCAweDIwMjAsIDB4MjAyMSwgMHgwMEI3LAorICAgIDB4MDBCNiwgMHgyMDIyLCAweDIwMUEsIDB4MjAxRSwgMHgyMDFELCAweDAwQkIsIDB4MjAyNiwgMHgyMDMwLCAweDAwQkYsCisgICAgMHgwMzAxLCAweDAzMDIsIDB4MDBBRiwgMHgwMzA2LCAweDAzMDcsIDB4MDMwOCwgMHgwMzBBLCAweDAwQjgsIDB4MDMwQiwKKyAgICAweDAzMjgsIDB4MDMwQywgMHgwMzM2LCAweDAwQzYsIDB4MDBBQSwgMHgwMTQxLCAweDAwRDgsIDB4MDE1MiwgMHgwMEJBLAorICAgIDB4MDBFNiwgMHgwMTMxLCAweDAxNDIsIDB4MDBGOCwgMHgwMTUzLCAweDAwREYsIDB4MDAyRCwgMHgwMEE5LCAweDAwQUMsCisgICAgMHgwMEFFLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNSwgMHgwMEI5LCAweDAwQkMsIDB4MDBCRCwKKyAgICAweDAwQkUsIDB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LCAweDAwQzUsIDB4MDBDNywgMHgwMEM4LAorICAgIDB4MDBDOSwgMHgwMENBLCAweDAwQ0IsIDB4MDBDQywgMHgwMENELCAweDAwQ0UsIDB4MDBDRiwgMHgwMEQwLCAweDAwRDEsCisgICAgMHgwMEQyLCAweDAwRDMsIDB4MDBENCwgMHgwMEQ1LCAweDAwRDYsIDB4MDBENywgMHgwMEQ5LCAweDAwREEsIDB4MDBEQiwKKyAgICAweDAwREMsIDB4MDBERCwgMHgwMERFLCAweDAwRTAsIDB4MDBFMSwgMHgwMEUyLCAweDAwRTMsIDB4MDBFNCwgMHgwMEU1LAorICAgIDB4MDBFNywgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLCAweDAwRUMsIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsCisgICAgMHgwMEYwLCAweDAwRjEsIDB4MDBGMiwgMHgwMEYzLCAweDAwRjQsIDB4MDBGNSwgMHgwMEY2LCAweDAwRjcsIDB4MDBGOSwKKyAgICAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLCAweDAwRkQsIDB4MDBGRSwgMHgwMEZGLCAweDAxNjAsIDB4MDE3OCwgMHgwMTdELAorICAgIDB4MDMwNSwgMHgwMTYxLCAweDIxMjIsIDB4MDE3RSwgMHgwMDMwLCAweDIwQUMsIDB4MjEyNiwgMHgyMDMyLCAweDIwMzMsCisgICAgMHhGQjAwLCAweEZCMDMsIDB4RkIwNCwgMHgwMTAxLCAweDAxMkIsIDB4MDE2QiwgMHgwMTEzLCAweDAxNEQsIDB4MDEwMCwKKyAgICAweDAxMkEsIDB4MDE2QSwgMHgwMTEyLCAweDAxNEMsIDB4MjE1QiwgMHgyMTVDLCAweDIxNUQsIDB4MjE1RSwgMHgyMTUzLAorICAgIDB4MjE1NCwgMHgyMDcwLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsIDB4MjA3OCwgMHgyMDc5LCAweDIwODAsCisgICAgMHgyMDgxLCAweDIwODIsIDB4MjA4MywgMHgyMDg0LCAweDIwODUsIDB4MjA4NiwgMHgyMDg3LCAweDIwODgsIDB4MjA4OSwKKyAgICAweDAxQ0QsIDB4MDExQSwgMHgwMDAwLCAweDFFQkMsIDB4MDFDRiwgMHgwMDAwLCAweDAxMjgsIDB4MDFEMSwgMHgwMDAwLAorICAgIDB4MDFEMywgMHgwMTZFLCAweDAxNjgsIDB4MDFDRSwgMHgwMTFCLCAweDAwMDAsIDB4MUVCRCwgMHgwMUQwLCAweDAwMDAsCisgICAgMHgwMTI5LCAweDAxRDIsIDB4MDAwMCwgMHgwMUQ0LCAweDAxNkYsIDB4MDE2OSwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwKKyAgICAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDMzNiwgMHgwMDJELAorICAgIDB4MDAzRCwgMHgwMDJDLCAweDAwMjgsIDB4MDAyOSwgMHgwMDJFLCAweDAwMkYsIDB4MDAzQSwgMHgwMDNCLCAweDAwMzAsCisgICAgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwKKyAgICAweDAzMzYsIDB4MDAyRCwgMHgwMDNELCAweDAwMkMsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkUsIDB4MDAyRiwgMHgwMDNBLAorICAgIDB4MDAzQiwgMHgwMEI3LCAweDAwMkQsIDB4MDAzRCwgMHgyMTAzLCAweDI2NDAsIDB4MjY0MiwgMHgzMDEzLCAweDMwMTIsCisgICAgMHgzMDBDLCAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLCAweDMwMUEsIDB4MzAxQiwgMHgzMDE4LCAweDMwMTksIDB4RkYwOCwKKyAgICAweEZGMDksIDB4MzAxRCwgMHgzMDFFLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MDAyNywgMHgwMDIyLAorICAgIDB4OTAzOCwgMHg4QjAxLCAweDdERTMsIDB4OUVDMywgMHg2RUFCLCAweDc5OEQsIDB4NjA5NCwgMHg2RDc3LCAweDYxNjgsCisgICAgMHg2OTgyLCAweDZFMzQsIDB4ODkxMCwgMHg2RjIyLCAweDU2NjgsIDB4NjVFMiwgMHg3OTQ4LCAweDg2NUIsIDB4OTdGRiwKKyAgICAweDUyRTQsIDB4OEIzOSwgMHg2M0VELCAweDY0Q0EsIDB4Nzg0RiwgMHg3QTQwLCAweDZCQkEsIDB4Nzk0OSwgMHg4OTk2LAorICAgIDB4NzE2RSwgMHg3OTNFLCAweDgwMDUsIDB4ODFFRCwgMHg3OTVELCAweDY2OTEsIDB4N0Y3MiwgMHg2RDg5LCAweDcyQzAsCisgICAgMHg2MTNDLCAweDc3MUUsIDB4N0JDMCwgMHg3OTU2LCAweDUwRTcsIDB4NUM2NCwgMHg1REUyLCAweDYxOEUsIDB4OEQwOCwKKyAgICAweDUzN0QsIDB4NTYwNiwgMHg4NDU3LCAweDVGQjUsIDB4NjFGMiwgMHg5M0FELCAweDc5OEUsIDB4OUIyRCwgMHg3QTgxLAorICAgIDB4OTZFMywgMHg2ODg1LCAweDdFNDEsIDB4NjY2OSwgMHg1MzUxLCAweDc4OTEsIDB4OENEMywgMHg2NTRGLCAweDRGQUUsCisgICAgMHg1MDAyLCAweDU4NDAsIDB4NTJDOSwgMHg2QjY1LCAweDU4QTgsIDB4NkJDRiwgMHg1MTRELCAweDYyM0UsIDB4Nzk1MCwKKyAgICAweDZCMDQsIDB4OTY4NiwgMHg4NjVDLCAweDZEREEsIDB4OTg1RSwgMHg2NkM2LCAweDZCNzcsIDB4N0RGNCwgMHg5MzRBLAorICAgIDB4NUVDQSwgMHg5MzA0LCAweDY5ODIsIDB4NTFCNCwgMHg2MzRDLCAweDg2REIsIDB4OTA4OSwgMHg5MDIyLCAweDUwNDksCisgICAgMHg3REVGLCAweDkwNTUsIDB4NTNBOSwgMHg5OTBDLCAweDg4NUIsIDB4NUVGNiwgMHg2Q0JGLCAweDkyNUIsIDB4N0ZDMSwKKyAgICAweDgyQkQsIDB4OTZDNSwgMHg1QkIzLCAweDYxNjgsIDB4Njk4MiwgMHg2QkJCLCAweDY1NjIsIDB4OENBQiwgMHg1RENDLAorICAgIDB4OTgxMSwgMHg1RTMwLCAweDhFQ0MsIDB4N0FBRSwgMHg1NzQ3LCAweDUwOTEsIDB4N0E3NCwgMHg1MDY1LCAweDVFRkEsCisgICAgMHg5MjM3LCAweDZBOEUsIDB4NEVBNCwgMHg1MTZDLCAweDY2RjQsIDB4NjgyMSwgMHg3ODZDLCAweDdENUUsIDB4ODAwMywKKyAgICAweDhDRkMsIDB4OTY0RCwgMHg2MkY3LCAweDdGNkEsIDB4NEY3RiwgMHg1M0YyLCAweDU5QzksIDB4OEIxRCwgMHg5MEFBLAorICAgIDB4NTNDRSwgMHg4RjJGLCAweDY3RDQsIDB4NzdBQywgMHg4MjFDLCAweDY5NkYsIDB4Njc3RSwgMHg4QTFGLCAweDRFMDgsCisgICAgMHg1N0Y0LCAweDY5MEQsIDB4ODA3NywgMHg4OUFBLCAweDkwNDIsIDB4NjM2RSwgMHg2NDQyLCAweDgyMzksIDB4N0RDRiwKKyAgICAweDgwNjEsIDB4NTBDRiwgMHg4QTk1LCAweDYwNjUsIDB4NTE0NiwgMHg3NzNBLCAweDgwNzQsIDB4OERGMywgMHg1RUFELAorICAgIDB4NUVGNywgMHg4MjQ3LCAweDY4NDMsIDB4OTAwMywgMHg2RDNFLCAweDYzOTIsIDB4OEYyOSwgMHg3M0VELCAweDk4MTIsCisgICAgMHg2MEIyLCAweDYyNDksIDB4NjU5MCwgMHg3RENCLCAweDhBQjksIDB4OENBNywgMHg3MjM2LCAweDg0N0EsIDB4NTIwNiwKKyAgICAweDU2NzQsIDB4NjFBNCwgMHg3Qzg5LCAweDdEMUIsIDB4OTZGMCwgMHg4NTNELCAweDRGQkYsIDB4NjM2NywgMHg3NkM2LAorICAgIDB4Njg1RCwgMHg4MTA4LCAweDgwMzYsIDB4N0ZGQywgMHg1NDBGLCAweDk2QTMsIDB4OUU5RiwgMHg5RTk3LCAweDgwNkYsCisgICAgMHg4MDdFLCAweDZFN0UsIDB4NTA4NSwgMHg1MTkzLCAweDUxREIsIDB4NTMxNSwgMHg1MzQwLCAweDk2RDksIDB4NTVBOSwKKyAgICAweDU2QzEsIDB4NTcwRCwgMHg1OEFCLCAweDU5REEsIDB4NUEzNiwgMHg1QUJFLCAweDVENEUsIDB4NUQ4NywgMHg1REM5LAorICAgIDB4NUREMywgMHg1RjJELCAweDVGOTgsIDB4NjBEOCwgMHg2MTNELCAweDYxRkUsIDB4NjI2OCwgMHg2MkNGLCAweDY1MUQsCisgICAgMHg2NDBGLCAweDY0RjIsIDB4NjU1RCwgMHg2NjVGLCAweDY3QTksIDB4NjdFNywgMHg2OTZCLCAweDY5MzAsIDB4NjlBNywKKyAgICAweDZBNDQsIDB4NkE5MCwgMHg2QzA4LCAweDZDMTMsIDB4NkUyMywgMHg2RjExLCAweDZFRkUsIDB4NkYzRSwgMHg3MUZGLAorICAgIDB4NzNFNSwgMHg3NDMyLCAweDc0NUYsIDB4NzRFMCwgMHg3NTBDLCAweDc2NzIsIDB4NzkyQSwgMHg3OEQ0LCAweDc5QkEsCisgICAgMHg3QTE5LCAweDdBOTUsIDB4N0NGMiwgMHg3RDczLCAweDdEREQsIDB4N0UzNSwgMHg3RkFFLCAweDdGRTEsIDB4ODA1QSwKKyAgICAweDgwNUYsIDB4ODA3MywgMHg4MDcwLCAweDgwNzYsIDB4ODE1MywgMHg4MThBLCAweDgxQjUsIDB4ODFDRCwgMHg4M0YyLAorICAgIDB4ODU1NSwgMHg4NUQ1LCAweDg3MUEsIDB4ODgzNiwgMHg4ODlFLCAweDg4RDgsIDB4ODhGNCwgMHg4OTJCLCAweDg5M0IsCisgICAgMHg4OTZBLCAweDg5NkYsIDB4OEExRCwgMHg4RDA1LCAweDhEMEYsIDB4OUY0RSwgMHg4RTkxLCAweDhFQTEsIDB4OTA1MiwKKyAgICAweDkwMEUsIDB4OTEzMCwgMHg5MTU2LCAweDkxNTgsIDB4OTE2NSwgMHg5MTczLCAweDkxNzIsIDB4OTFBMiwgMHg5MUFGLAorICAgIDB4OTFBQSwgMHg5MUI0LCAweDkxQkEsIDB4OTQ3NywgMHg5Njk4LCAweDk3M0QsIDB4OTc2MCwgMHg5NzcxLCAweDk4MEMsCisgICAgMHg5ODczLCAweDk4QzMsIDB4OUE0NSwgMHg5QjRELCAweDlCNTgsIDB4OUJDNiwgMHg5QkUxLCAweDlCRjEsIDB4OUQ0OCwKKyAgICAweDlEQ0YsIDB4OUYwOCwgMHg2MjcxLCAweDY2OTcsIDB4NjEwRiwgMHg4ODYzLCAweDkwNTUsIDB4OTA3QSwgMHg3OEVGLAorICAgIDB4NTRFMSwgMHgyRUQ3LCAweDJFQkQsIDB4NTNBOSwgMHg3NERDLCAweDkwNEIsIDB4OTkwQywgMHg4ODVFLCAweDkyQjMsCisgICAgMHg5NUIxLCAweDVFRjYsIDB4NjNGNCwgMHg2Q0JGLCAweDcxNTksIDB4OTA2MCwgMHg5MjVCLCAweDY1QkMsIDB4NUY4MCwKKyAgICAweDdGQzEsIDB4NTM3OCwgMHg5N0YzLCAweDUzMTYsIDB4ODJCMSwgMHg4M0QzLCAweDhDQTgsIDB4OTA0RSwgMHg4MkJELAorICAgIDB4OTZDNSwgMHg5OTEzLCAweDVFRkIsIDB4NzA3MCwgMHg1QkIzLCAweDYxNjgsIDB4NjE2OCwgMHg2MTY4LCAweDY5RUEsCisgICAgMHg2OTgyLCAweDY3NkUsIDB4ODlEMiwgMHg5Njk0LCAweDUyNzIsIDB4OEY0NCwgMHg5MzhDLCAweDgyQzUsIDB4NUJEMiwKKyAgICAweDc0QjAsIDB4N0RFOSwgMHg3RjM2LCAweDkwODQsIDB4OTU5MiwgMHg5N0QzLCAweDgyMTgsIDB4NTM3MSwgMHg1NTlDLAorICAgIDB4MzQwMiwgMHgzNDAyLCAweDVFN0UsIDB4NjVFMywgMHg2NzFGLCAweDZBNUYsIDB4OEQ3NywgMHg5OEUyLCAweDU0MDksCisgICAgMHg1NUFCLCAweDg2NTAsIDB4OTAwNiwgMHg1M0NBLCAweDU0MzgsIDB4NjAyNSwgMHg3RDFBLCAweDVERTgsIDB4NjJEMiwKKyAgICAweDhEREQsIDB4OUI1QSwgMHg5QjVBLCAweDUzN0YsIDB4NUYzQSwgMHg2MDUwLCAweDY5QzEsIDB4NkE0QiwgMHg2QTRCLAorICAgIDB4OTExNSwgMHg5N0ZGLCAweDk5NTcsIDB4NjY4MSwgMHgyRUE5LCAweDhGRDEsIDB4NTAzNiwgMHg3N0U5LCAweDUxNzcsCisgICAgMHg4NjVFLCAweDdBN0EsIDB4OTA0NywgMHg2QURCLCAweDU1NTMsIDB4NTk1MSwgMHg2MDc1LCAweDYxNjcsIDB4OEZDRSwKKyAgICAweDUwOTEsIDB4NkY1NCwgMHg3QTc0LCAweDJFQkMsIDB4MkVCQywgMHg1MTdDLCAweDUyMzgsIDB4NjFCMiwgMHg2NzQzLAorICAgIDB4ODBBOSwgMHg4QjE5LCAweDkwNjMsIDB4NTM5RiwgMHg4QTAxLCAweDYyMzYsIDB4OTZDNywgMHg5ODY3LCAweDU0MzMsCisgICAgMHg1QTFCLCAweDhBQTQsIDB4NURFNSwgMHg2MTRDLCAweDYyODUsIDB4NjNBNywgMHg2OUNCLCAweDZENjksIDB4NkUyRiwKKyAgICAweDgwMTUsIDB4ODE1NCwgMHg4MzUyLCAweDhCMUIsIDB4OENGQywgMHg1NDNGLCAweDkxNzcsIDB4ODE3MCwgMHg3NTExLAorICAgIDB4OEZCQywgMHg0RUNBLCAweDkzOTYsIDB4NUVBNywgMHg1RjY5LCAweDYzQTEsIDB4NkI3MiwgMHg4M0RDLCAweDUxQjQsCisgICAgMHg1NEIyLCAweDUyNEEsIDB4NzUyMiwgMHg5OTEwLCAweDU5RkYsIDB4NTlGRiwgMHg1REZGLCAweDhBRUUsIDB4OEFFRSwKKyAgICAweDhDQzcsIDB4OENDNywgMHg2QjIxLCAweDZCMjEsIDB4NkVDQiwgMHg3M0JBLCAweDUzRjEsIDB4NjM2OCwgMHg2NTlDLAorICAgIDB4OTBBQSwgMHg1MkZBLCAweDcyMzUsIDB4NzIzNSwgMHg5MTRDLCAweDVGMzEsIDB4NEUzQiwgMHg1M0Q3LCAweDYzODgsCisgICAgMHg1NDY4LCAweDdENDIsIDB4N0ZEMiwgMHg4ODQ2LCAweDkwMzEsIDB4NEY0RiwgMHg4ODUzLCAweDhGRjAsIDB4NURFMSwKKyAgICAweDkwNzUsIDB4OTA3NSwgMHg2MjQwLCAweDY2RjgsIDB4NTk3MywgMHg1MkRELCAweDU1NDYsIDB4NUJCNSwgMHg1QzA2LAorICAgIDB4MkU4QywgMHgyRThELCAweDVDMTksIDB4NkQ4OCwgMHg3ODVELCAweDgwOTYsIDB4NEUwOCwgMHg1QjgyLCAweDU3Q0UsCisgICAgMHg2MEM1LCAweDU3RjQsIDB4OThGRSwgMHg2OTBELCAweDZCOTYsIDB4OThERiwgMHg5OEUwLCAweDJFREUsIDB4Mzc4RCwKKyAgICAweDRGQjUsIDB4MkU5NywgMHg2RDc4LCAweDc3MUYsIDB4OTAzMiwgMHg0RUJCLCAweDRFQkEsIDB4NTIwMywgMHg1QzBCLAorICAgIDB4OEEwQSwgMHg4QTBBLCAweDhGQzUsIDB4ODg3MCwgMHg5MDQyLCAweDM1MUYsIDB4NTJFMiwgMHg2MjEwLCAweDc2REIsCisgICAgMHg4MDU2LCAweDg5ODAsIDB4OEFBMCwgMHg4QUNCLCAweDk3NUMsIDB4OTc1QywgMHg3QTA1LCAweDgxMDYsIDB4OTZCQiwKKyAgICAweDdDNEQsIDB4N0JDMCwgMHg4QUFBLCAweDk2RUEsIDB4N0Q3NiwgMHg2MjQ3LCAweDZGOTgsIDB4N0ZBMSwgMHg4MjM5LAorICAgIDB4OTA3OCwgMHg5MDc3LCAweDUyNEQsIDB4NTE2OCwgMHg2MzgzLCAweDYzRjcsIDB4NzYyNiwgMHg4RDcwLCAweDkwMDEsCisgICAgMHg5MDZELCAweDkwMjAsIDB4MkVDQSwgMHg5MDFGLCAweDhDQ0EsIDB4NUMwQSwgMHg1QzBBLCAweDU5QTUsIDB4NkNGMCwKKyAgICAweDkwMDAsIDB4OTAyRSwgMHg5NjhBLCAweDlCREIsIDB4NTkyNywgMHgzNDI3LCAweDcwMjcsIDB4OTA1NCwgMHg4MTJCLAorICAgIDB4NEUzOSwgMHg2QjRFLCAweDcwQUQsIDB4OEE5NSwgMHg2Njk2LCAweDUwMjQsIDB4N0Y2RSwgMHg3QkM5LCAweDJFQUUsCisgICAgMHg3QjUxLCAweDkwMTAsIDB4NjdGMSwgMHg2Q0U4LCAweDk5RDAsIDB4NUY2QiwgMHg1RkI1LCAweDYxRjIsIDB4NjcxRCwKKyAgICAweDZGNkUsIDB4OEFCRiwgMHg3NkY0LCAweDY3MTUsIDB4NjcxNSwgMHg1ODlDLCAweDhGRkQsIDB4OTAxQSwgMHg1NzZBLAorICAgIDB4OTFFMywgMHg1NDQ4LCAweDVFMUQsIDB4N0EwQiwgMHg3Njg0LCAweDkwNjksIDB4OEZFRCwgMHg2REZCLCAweDUxNEUsCisgICAgMHg5MDE0LCAweDc4M0EsIDB4NTcyMSwgMHg1NzFGLCAweDUxQUMsIDB4NTUxMCwgMHg3Q0Q2LCAweDg1RTQsIDB4OEIwNCwKKyAgICAweDkwMDMsIDB4OTAwRiwgMHg5QTMwLCAweDVDMEUsIDB4OTA1MywgMHg1NDUxLCAweDNCODgsIDB4NTE2NywgMHg4MDg5LAorICAgIDB4NEU3MywgMHg1RkNELCAweDhBOEQsIDB4NUJFNywgMHg3RDBELCAweDg5ODcsIDB4NkQzRSwgMHg4MEJBLCAweDUzNUEsCisgICAgMHg4NTg0LCAweDhGRUIsIDB4N0UxQiwgMHg4MDg3LCAweDRFMzcsIDB4NkY1MSwgMHg5MUIxLCAweDRGMzQsIDB4NTIyNCwKKyAgICAweDUzNEEsIDB4NUUwNiwgMHg3NTU0LCAweDY2NjksIDB4ODU0MywgMHg5MDdGLCAweDVGQUUsIDB4OUYzQiwgMHg1MzM5LAorICAgIDB4MkVBQSwgMHg1RjY1LCAweDU5RUMsIDB4NTlFQiwgMHg4QTU1LCAweDVFOTksIDB4NzVDNSwgMHg1QTY2LCAweDY1NzcsCisgICAgMHg2RDZFLCAweDhDQTAsIDB4OENBMCwgMHg2NzBELCAweDg5ODYsIDB4NEUxOSwgMHg1RTYzLCAweDVFNzMsIDB4NUYwQSwKKyAgICAweDg1MTEsIDB4NTA0RiwgMHg3REU4LCAweDhGRDQsIDB4OTA0RCwgMHg3QzNGLCAweDUzMDUsIDB4NUQyOSwgMHg2MkIxLAorICAgIDB4NjcwQiwgMHg3ODMyLCAweDdFMkIsIDB4ODBERSwgMHg4NDBDLCAweDkwQTYsIDB4OTBBNiwgMHg5OEZELCAweDlENkMsCisgICAgMHg0RUExLCAweDVFM0QsIDB4NUZEOCwgMHg1RkQ5LCAweDYyM0YsIDB4NjcxQiwgMHg2NzFCLCAweDUxOTIsIDB4NjQ2OSwKKyAgICAweDdGRkIsIDB4NTFFMSwgMHg3OEU4LCAweDlCNTQsIDB4MkZDNywgMHg2OUQ5LCAweDY4NUQsIDB4NEZFMywgMHg1M0M4LAorICAgIDB4N0U2RCwgMHg5RUJGLCAweDgxMDgsIDB4NjYwRSwgMHg3NkRGLCAweDhGRjcsIDB4NTk4NCwgMHg1MkQwLCAweDc2RjIsCisgICAgMHg4MDE3LCAweDYyM0UsIDB4N0QwQiwgMHg5NTgwLCAweDdEMDQsIDB4OEU4RCwgMHg2ODdBLCAweDY4N0EsIDB4NjgwMSwKKyAgICAweDYxMDksIDB4OEFFRCwgMHg4RjM4LCAweDUyQzcsIDB4NjcwOSwgMHg3MzM2LCAweDczMzYsIDB4NzMzNywgMHg4OEQ1LAorICAgIDB4OTA0QSwgMHg2NkRDLCAweDJFQjcsIDB4ODk4MSwgMHg5OTBBLCAweDdGQ0MsIDB4N0ZGQywgMHg4RUI2LCAweDg2MkQsCisgICAgMHg3Mzg3LCAweDlGOEQsIDB4OUY4RCwgMHg2NUM1LCAweDY4ODEsIDB4NzFEMCwgMHg5NkEzLCAweDlDNTcsIDB4OUU5RiwKKyAgICAweDdDN0IsIDB4NUVDOSwgMHg2MTkwLCAweDkwMjMsIDB4NjcxNywgMHg4MDAyLCAweDgxMDcsIDB4NTBDQSwgMHg1MTFBLAorICAgIDB4NTE1NCwgMHg1MTk1LCAweDJFODcsIDB4NTI4RCwgMHg1MkQ3LCAweDUyRjksIDB4NTM0OSwgMHgzNTNFLCAweDUzREYsCisgICAgMHg2NkZDLCAweDU1MzMsIDB4NTVFNCwgMHg1NDU1LCAweDU2QzAsIDB4NTkzOSwgMHg1QTFDLCAweDVBQzIsIDB4NUI3MywKKyAgICAweDVCQzMsIDB4NUMxNCwgMHgzN0UyLCAweDVDRTYsIDB4NUU1NCwgMHg0RTQ4LCAweDVFRTMsIDB4NjA5NywgMHg2MkQ0LAorICAgIDB4NjJDQywgMHg2NDFDLCAweDYzQzYsIDB4NjQyOCwgMHg4MjA5LCAweDYzMUIsIDB4NjY1RiwgMHg2NjVGLCAweDY2NjMsCisgICAgMHg2NkY1LCAweDY3NUUsIDB4Njg5RCwgMHg2ODhELCAweDY5RjYsIDB4Njk2MSwgMHg1QkU4LCAweDVCRTgsIDB4NjlCQiwKKyAgICAweDZCQ0MsIDB4NkYxMSwgMHg2RTE3LCAweDZGOTgsIDB4NkNBQSwgMHg2Q0FBLCAweDcwMUIsIDB4NzE2MiwgMHg3MjNCLAorICAgIDB4NEUyQywgMHg3MzFDLCAweDc0Q0EsIDB4NzRFRiwgMHg3NTc1LCAweDc1RUMsIDB4NzY0RSwgMHgzRkIxLCAweDc3NkEsCisgICAgMHg3N0E5LCAweDc5NDAsIDB4Nzk1MywgMHg3OTUzLCAweDlGNEIsIDB4NzlBRSwgMHg5MDgzLCAweDdCNTMsIDB4N0MxMSwKKyAgICAweDdDMTQsIDB4NDI2NCwgMHg3QzUwLCAweDdDNTgsIDB4N0Q0NiwgMHg3RDYzLCAweDdFMjIsIDB4N0UyMiwgMHg3RTQ4LAorICAgIDB4N0UzNSwgMHg3RTQzLCAweDdFOEMsIDB4N0Y1MCwgMHg3RjUxLCAweDdGNTEsIDB4N0Y1MSwgMHg3RkM1LCAweDdGQzYsCisgICAgMHg3RkU5LCAweDgxNDEsIDB4NDQ1MywgMHg4MjU4LCAweDgyNzksIDB4MkVCRiwgMHgyRUMwLCAweDgyRTMsIDB4NTE3OSwKKyAgICAweDgzQTIsIDB4ODQyMCwgMHg4M0JELCAweDg0RjQsIDB4ODU2RCwgMHg4NTg3LCAweDg1RjQsIDB4NEU1NSwgMHg4NzM3LAorICAgIDB4ODczQiwgMHg4ODA1LCAweDg3QkQsIDB4ODY3RCwgMHg4ODM2LCAweDg5NDQsIDB4ODhDNiwgMHg4OUJELCAweDhBREIsCisgICAgMHg4QjNFLCAweDhCNUEsIDB4OEQ3MywgMHg4RDk5LCAweDhEQ0IsIDB4OEUzNCwgMHg4RTRBLCAweDhGRUYsIDB4OTA4NywKKyAgICAweDhGRkEsIDB4OTAxRSwgMHg5MDM1LCAweDkwNTAsIDB4OEZDOCwgMHg5MDgxLCAweDkwOEEsIDB4OTA4QSwgMHg5MDhBLAorICAgIDB4OTA4QSwgMHg5MDhBLCAweDkwOEEsIDB4OTA4OSwgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MDg5LCAweDkwODksCisgICAgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MkNGLCAweDkzREQsIDB4OTVCQywKKyAgICAweDk2MjEsIDB4OTZCMiwgMHg5NzVDLCAweDk4MzksIDB4OThFQiwgMHg5OTAzLCAweDk5MDksIDB4OTk0NSwgMHg5OTQ1LAorICAgIDB4OTk0QiwgMHg5QTA4LCAweDlBNUYsIDB4OUE2NSwgMHg5QUVGLCAweDlCMTgsIDB4OUJERiwgMHg5RDA5LCAweDlEMDgsCisgICAgMHg5RUE1LCAweDlFQ0MsIDB4OUYwOCwgMHg5RjRBLCAweDlGNjMsIDB4OUY2NywgMHg5RjZDLCAweDcxOTksIDB4NzE5OSwKKyAgICAweDg5MUMsIDB4NjhDOCwgMHg2NkZCLCAweDVGNDUsIDB4NTMwMCwgMHg1Mzg5LCAweDU5NTMsIDB4RkExMSwgMHg2ODUyLAorICAgIDB4NkE3MywgMHg2RDg3LCAweEZBMTUsIDB4OEExMiwgMHg0RTA0LCAweDRFMDUsIDB4NEUxRiwgMHg0RTJCLCAweDRFMkYsCisgICAgMHg0RTMwLCAweDRFNDAsIDB4NEU0MSwgMHg0RTQ0LCAweDRFNUEsIDB4NEU3RiwgMHg0RThELCAweDRFOTYsIDB4NEVCOSwKKyAgICAweDRFRDAsIDB4NEVFMCwgMHg0RUZELCAweDRFRkYsIDB4NEYwQiwgMHg0RjE1LCAweDRGNjAsIDB4NEYzQiwgMHg0RjQ5LAorICAgIDB4NEY1NCwgMHg0RjdBLCAweDRGN0QsIDB4NEY3RSwgMHg0Rjk3LCAweDRGQkUsIDB4NEZDRiwgMHg0RkZELCAweDUwMDAsCisgICAgMHg1MDAxLCAweDUwMTAsIDB4NTAxQiwgMHg1MDI3LCAweDUwMkUsIDB4NTA1NywgMHg1MDY2LCAweDUwNkEsIDB4NTAzQiwKKyAgICAweDUwOEYsIDB4NTA5NiwgMHg1MDlDLCAweDUwQ0MsIDB4NTBFNiwgMHg1MEU5LCAweDUwRUYsIDB4NTEwOCwgMHg1MTBCLAorICAgIDB4NTExMCwgMHg1MTFCLCAweDUxMUUsIDB4NTE1RiwgMHg1MUExLCAweDUxQkMsIDB4NTFERSwgMHg1MUVFLCAweDUxRjQsCisgICAgMHg1MjAxLCAweDUyMDIsIDB4NTIxMywgMHg1MjQ5LCAweDUyNjEsIDB4NTI2NiwgMHg1MjkzLCAweDUyQzgsIDB4NTJGMCwKKyAgICAweDUzMEEsIDB4NTMwQiwgMHg1MzNFLCAweDUzNEMsIDB4NTM0QiwgMHg1MzYxLCAweDUzNkMsIDB4NTNBQiwgMHg1M0RBLAorICAgIDB4NTNFNiwgMHg1M0Y1LCAweDU0MjcsIDB4NTQ0RCwgMHg1NDY2LCAweDU0NkIsIDB4NTQ3NCwgMHg1NDhELCAweDU0OTYsCisgICAgMHg1NEExLCAweDU0QUQsIDB4NTRCOSwgMHg1NEJGLCAweDU0QzYsIDB4NTRDRCwgMHg1NTBFLCAweDU1MkIsIDB4NTUzNSwKKyAgICAweDU1NEEsIDB4NTU2MCwgMHg1NTYxLCAweDU1ODgsIDB4NTU4RSwgMHg1NjA4LCAweDU2MEUsIDB4NTYwRiwgMHg1NjM3LAorICAgIDB4NTYzRiwgMHg1NjQ5LCAweDU2NEIsIDB4NTY0RiwgMHg1NjY2LCAweDU2NjksIDB4NTY2RiwgMHg1NjcxLCAweDU2NzIsCisgICAgMHg1Njk1LCAweDU2OUEsIDB4NTZBQywgMHg1NkFELCAweDU2QjEsIDB4NTZDOSwgMHg1NkRELCAweDU2RTQsIDB4NTcwQSwKKyAgICAweDU3MTUsIDB4NTcyMywgMHg1NzJGLCAweDU3MzMsIDB4NTczNCwgMHg1NzRDLCAweDU3NzAsIDB4NTc4QywgMHg1NzlDLAorICAgIDB4NTdCOCwgMHg1N0U2LCAweDU3RUQsIDB4NTdGNSwgMHg1N0Y2LCAweDU3RkYsIDB4NTgwOSwgMHg1ODIwLCAweDU4MzIsCisgICAgMHg1ODdDLCAweDU4ODAsIDB4NThBOSwgMHg1OENFLCAweDU4RDAsIDB4NThENCwgMHg1OERBLCAweDU4RTksIDB4NTkwQywKKyAgICAweDU5MjQsIDB4NTkyRiwgMHg1OTYxLCAweDU5NkQsIDB4NTlDQSwgMHg1OUQyLCAweDU5REQsIDB4NTlFMywgMHg1OUU0LAorICAgIDB4NUEwNCwgMHg1QTBDLCAweDVBMjMsIDB4NUE0NywgMHg1QTU1LCAweDVBNjMsIDB4NUE2RCwgMHg1QTdFLCAweDVBOUUsCisgICAgMHg1QUE3LCAweDVBQUMsIDB4NUFCMywgMHg1QUUwLCAweDVCMDAsIDB4NUIxOSwgMHg1QjI1LCAweDVCMkQsIDB4NUI0MSwKKyAgICAweDVCN0MsIDB4NUI3RSwgMHg1QjdGLCAweDVCOEEsIDB4NUMyMywgMHg1QzJCLCAweDVDMzAsIDB4NUM2MywgMHg1QzY5LAorICAgIDB4NUM3QywgMHg1Q0NCLCAweDVDRDIsIDB4NUNGNCwgMHg1RDI0LCAweDVEMjYsIDB4NUQ0MywgMHg1RDQ2LCAweDVENEEsCisgICAgMHg1RDkyLCAweDVEOTQsIDB4NUQ5OSwgMHg1REEwLCAweDVERDgsIDB4NURFMCwgMHg1REY4LCAweDVFMDAsIDB4NUUxMiwKKyAgICAweDVFMTQsIDB4NUUxNSwgMHg1RTE4LCAweDVFMkUsIDB4NUU1OCwgMHg1RTZCLCAweDVFNkMsIDB4NUVBOCwgMHg1RUFBLAorICAgIDB4NUVCRSwgMHg1RUJGLCAweDVFQ0IsIDB4NUVEMiwgMHg1RjA3LCAweDVGMEUsIDB4NUYxQywgMHg1RjFELCAweDVGMjIsCisgICAgMHg1RjI4LCAweDVGMzYsIDB4NUYzQiwgMHg1RjQwLCAweDVGNTAsIDB4NUY1OCwgMHg1RjY0LCAweDVGODksIDB4NUY5QywKKyAgICAweDVGQTcsIDB4NUZBNCwgMHg1RkFGLCAweDVGQjgsIDB4NUZDNCwgMHg1RkM5LCAweDVGRTEsIDB4NUZFOSwgMHg1RkVELAorICAgIDB4NUZGQywgMHg2MDE3LCAweDYwMUEsIDB4NjAzMywgMHg2MDYxLCAweDYwN0YsIDB4NjA5RSwgMHg2MEE0LCAweDYwQjAsCisgICAgMHg2MENCLCAweDYwREIsIDB4NjBGOCwgMHg2MTEyLCAweDYxMTMsIDB4NjExNCwgMHg2MTFDLCAweDYxN0MsIDB4NjE4RCwKKyAgICAweDYxOUYsIDB4NjFBOCwgMHg2MUMyLCAweDYxREYsIDB4NjIxNSwgMHg2MjI5LCAweDYyNDMsIDB4NjI0NiwgMHg2MjRDLAorICAgIDB4NjI1MSwgMHg2MjU2LCAweDYyQzQsIDB4NjJGQywgMHg2MzBBLCAweDYzMEQsIDB4NjMxOCwgMHg2MzM5LCAweDYzNDIsCisgICAgMHg2MzQzLCAweDYzNjUsIDB4NjM3NCwgMHg2MzdELCAweDYzODQsIDB4NjM4NywgMHg2MzkwLCAweDYzOUUsIDB4NjNEMSwKKyAgICAweDYzREMsIDB4NjQwOSwgMHg2NDEwLCAweDY0MjIsIDB4NjQ1NCwgMHg2NDVCLCAweDY0NkQsIDB4NjQ3QiwgMHg2NEJFLAorICAgIDB4NjRCRiwgMHg2NEU1LCAweDY0RjcsIDB4NjRGQiwgMHg2NTA0LCAweDY1MTYsIDB4NjUxOSwgMHg2NTQ3LCAweDY1NjcsCisgICAgMHg2NTgxLCAweDY1ODUsIDB4NjVDMiwgMHg2NUYwLCAweDY1RjIsIDB4NjYyQywgMHg2NjRDLCAweDY2NUIsIDB4NjY1QywKKyAgICAweDY2NjEsIDB4NjY2QiwgMHg2Njc3LCAweDY2QTQsIDB4NjZDOCwgMHg2NkVDLCAweDY3MDUsIDB4NjcxMywgMHg2NzMzLAorICAgIDB4Njc0OCwgMHg2NzRDLCAweDY3NzYsIDB4Njc3QiwgMHg2N0IwLCAweDY3QjIsIDB4NjdGOSwgMHg2N0Q3LCAweDY3RDksCisgICAgMHg2N0YwLCAweDY4MkMsIDB4NjgzMCwgMHg2ODMxLCAweDY4NUIsIDB4Njg3MiwgMHg2ODc1LCAweDY4N0EsIDB4Njg4NCwKKyAgICAweDY4QTUsIDB4NjhCMiwgMHg2OEQwLCAweDY4RDYsIDB4NjhFOCwgMHg2OEVELCAweDY4RjAsIDB4NjhGMSwgMHg2OEZDLAorICAgIDB4NjkxMSwgMHg2OTEzLCAweDY5MzUsIDB4NjkzQiwgMHg2OTU3LCAweDY5NjMsIDB4Njk3MiwgMHg2OTdGLCAweDY5ODAsCisgICAgMHg2OUE2LCAweDY5QUQsIDB4NjlCNywgMHg2OUQ2LCAweDY5RDcsIDB4NkEwMSwgMHg2QTBGLCAweDZBMTUsIDB4NkEyOCwKKyAgICAweDZBMzQsIDB4NkEzRSwgMHg2QTQ1LCAweDZBNTAsIDB4NkE1MSwgMHg2QTU2LCAweDZBNUIsIDB4NkE4MywgMHg2QTg5LAorICAgIDB4NkE5MSwgMHg2QTlELCAweDZBOUUsIDB4NkE5RiwgMHg2QURDLCAweDZBRTcsIDB4NkFFQywgMHg2QjFFLCAweDZCMjQsCisgICAgMHg2QjM1LCAweDZCNDYsIDB4NkI1NiwgMHg2QjYwLCAweDZCODIsIDB4NkJCRSwgMHg2QkUxLCAweDZCRjEsIDB4NkMxMCwKKyAgICAweDZDMzMsIDB4NkMzNSwgMHg2QzNBLCAweDZDNTksIDB4NkM3NiwgMHg2QzdCLCAweDZDODUsIDB4NkM5NSwgMHg2QzlDLAorICAgIDB4NkNEMCwgMHg2Q0Q0LCAweDZDRDYsIDB4NkNFMCwgMHg2Q0VCLCAweDZDRUMsIDB4NkNFRSwgMHg2RDBBLCAweDZEMEUsCisgICAgMHg2RDExLCAweDZEMkUsIDB4NkQ1NywgMHg2RDVFLCAweDZENjUsIDB4NkQ4MiwgMHg2REJGLCAweDZEQzQsIDB4NkRDQSwKKyAgICAweDZERDYsIDB4NkRFOSwgMHg2RTIyLCAweDZFNTEsIDB4NkVDNywgMHg2RUNBLCAweDZFQ0UsIDB4NkVGRCwgMHg2RjFBLAorICAgIDB4NkYyQSwgMHg2RjJGLCAweDZGMzMsIDB4NkY1QSwgMHg2RjVFLCAweDZGNjIsIDB4NkY3RCwgMHg2RjhCLCAweDZGOEQsCisgICAgMHg2RjkyLCAweDZGOTQsIDB4NkY5QSwgMHg2RkE3LCAweDZGQTgsIDB4NkZCNiwgMHg2RkRBLCAweDZGREUsIDB4NkZGOSwKKyAgICAweDcwMzksIDB4NzAzQywgMHg3MDRBLCAweDcwNTQsIDB4NzA1RCwgMHg3MDVFLCAweDcwNjQsIDB4NzA2QywgMHg3MDdFLAorICAgIDB4NzA4MSwgMHg3MDk1LCAweDcwQjcsIDB4NzBEMywgMHg3MEQ0LCAweDcwRDgsIDB4NzBEQywgMHg3MTA3LCAweDcxMjAsCisgICAgMHg3MTMxLCAweDcxNEEsIDB4NzE1MiwgMHg3MTYwLCAweDcxNzksIDB4NzE5MiwgMHg3MUIzLCAweDcxQ0IsIDB4NzFEMywKKyAgICAweDcxRDYsIDB4NzIwMCwgMHg3MjFELCAweDcyMkIsIDB4NzIzOCwgMHg3MjQxLCAweDcyNTMsIDB4NzI1NSwgMHg3MjU2LAorICAgIDB4NzI1QywgMHg3MjhELCAweDcyQUQsIDB4NzJCNCwgMHg3MkM3LCAweDcyRkIsIDB4NzMwNCwgMHg3MzA1LCAweDczMjgsCisgICAgMHg3MzMxLCAweDczNDMsIDB4NzM2QywgMHg3MzdDLCAweDczODMsIDB4NzM4NSwgMHg3Mzg2LCAweDczOTUsIDB4NzM5RSwKKyAgICAweDczOUYsIDB4NzNBMCwgMHg3M0E2LCAweDczQUIsIDB4NzNCNSwgMHg3M0I3LCAweDczQkMsIDB4NzNDRiwgMHg3M0Q5LAorICAgIDB4NzNFOSwgMHg3M0Y0LCAweDczRkQsIDB4NzQwNCwgMHg3NDBBLCAweDc0MUEsIDB4NzQxQiwgMHg3NDI0LCAweDc0MjgsCisgICAgMHg3NDJDLCAweDc0MkYsIDB4NzQzMCwgMHg3NDMxLCAweDc0MzksIDB4NzQ0NCwgMHg3NDQ3LCAweDc0NEIsIDB4NzQ0RCwKKyAgICAweDc0NTEsIDB4NzQ1NywgMHg3NDY2LCAweDc0NkIsIDB4NzQ3MSwgMHg3NDgwLCAweDc0ODUsIDB4NzQ4NiwgMHg3NDg3LAorICAgIDB4NzQ5MCwgMHg3NDk4LCAweDc0OUMsIDB4NzRBMCwgMHg3NEEzLCAweDc0QTgsIDB4NzRBQiwgMHg3NEI1LCAweDc0QkYsCisgICAgMHg3NEM4LCAweDc0REEsIDB4NzRERSwgMHg3NTRFLCAweDc1NzksIDB4NzU4MSwgMHg3NTkwLCAweDc1OTIsIDB4NzU5MywKKyAgICAweDc1QjQsIDB4NzVFNCwgMHg3NUY5LCAweDc2MDAsIDB4NzYwQSwgMHg3NjE1LCAweDc2MTYsIDB4NzYxOSwgMHg3NjFFLAorICAgIDB4NzYyRCwgMHg3NjM1LCAweDc2NDMsIDB4NzY0QiwgMHg3NjY1LCAweDc2NkQsIDB4NzY2RiwgMHg3NjcxLCAweDc2NzQsCisgICAgMHg3NkE0LCAweDc2QTUsIDB4NzZDNSwgMHg3NkNDLCAweDc2RUMsIDB4NzZGQywgMHg3NzM0LCAweDc3MzYsIDB4Nzc1QywKKyAgICAweDc3NUYsIDB4Nzc2MCwgMHg3NzcyLCAweDc3N0QsIDB4Nzc5NSwgMHg3N0FBLCAweDc3RTYsIDB4NzdGMCwgMHg3N0Y0LAorICAgIDB4NzgwNiwgMHg3ODIyLCAweDc4MkQsIDB4NzgyRSwgMHg3ODMwLCAweDc4MzUsIDB4Nzg2OCwgMHg3ODlFLCAweDc4QzgsCisgICAgMHg3OENDLCAweDc4Q0UsIDB4NzhFNCwgMHg3OEUwLCAweDc4RTEsIDB4NzhGMiwgMHg3OEY3LCAweDc4RkIsIDB4NzkzMSwKKyAgICAweDc5MzQsIDB4NzkzQiwgMHg3OTNELCAweDc5NDUsIDB4Nzk1QiwgMHg3OTVDLCAweDc5OEIsIDB4Nzk5NiwgMHg3OTk4LAorICAgIDB4NzlCOCwgMHg3OUJCLCAweDc5Q0EsIDB4NzlEQSwgMHg3QTAzLCAweDdBMDksIDB4N0ExMSwgMHg3QTFFLCAweDdBMkQsCisgICAgMHg3QTM5LCAweDdBNDUsIDB4N0E0QywgMHg3QTVELCAweDdBNjAsIDB4N0E2RCwgMHg3QTc4LCAweDdBQTAsIDB4N0FBMywKKyAgICAweDdBQjMsIDB4N0FCQiwgMHg3QUJDLCAweDdBQzYsIDB4N0IwNywgMHg3QjE0LCAweDdCMjcsIDB4N0IzMSwgMHg3QjQ3LAorICAgIDB4N0I0RSwgMHg3QjYwLCAweDdCNjksIDB4N0I2RCwgMHg3QjcyLCAweDdCOTEsIDB4N0JBRiwgMHg3QkQ3LCAweDdCRDksCisgICAgMHg3QzBCLCAweDdDMEYsIDB4N0MyMCwgMHg3QzI2LCAweDdDMzEsIDB4N0MzNiwgMHg3QzUxLCAweDdDNTksIDB4N0M2NywKKyAgICAweDdDNkUsIDB4N0M3MCwgMHg3Q0JDLCAweDdDQkYsIDB4N0NDOCwgMHg3Q0M5LCAweDdDRDcsIDB4N0NEOSwgMHg3Q0RELAorICAgIDB4N0NFQiwgMHg3RDA3LCAweDdEMDgsIDB4N0QwOSwgMHg3RDEzLCAweDdEMUQsIDB4N0QyMywgMHg3RDQxLCAweDdENTMsCisgICAgMHg3RDU5LCAweDdENUQsIDB4N0Q3QSwgMHg3RDg2LCAweDdEOEIsIDB4N0Q4QywgMHg3RENDLCAweDdERUIsIDB4N0RGMSwKKyAgICAweDdERjksIDB4N0UwOCwgMHg3RTExLCAweDdFMTUsIDB4N0UyMCwgMHg3RTQ3LCAweDdFNjIsIDB4N0U2RSwgMHg3RTczLAorICAgIDB4N0U4RCwgMHg3RTkxLCAweDdFOTgsIDB4N0Y0NCwgMHg3RjRGLCAweDdGNTIsIDB4N0Y1MywgMHg3RjYxLCAweDdGOTEsCisgICAgMHg3RkJGLCAweDdGQ0UsIDB4N0ZERiwgMHg3RkU1LCAweDdGRUMsIDB4N0ZFRSwgMHg3RkVGLCAweDdGRkEsIDB4ODAwRSwKKyAgICAweDgwMTEsIDB4ODAxNCwgMHg4MDI0LCAweDgwMjYsIDB4ODAzQSwgMHg4MDNDLCAweDgwNjAsIDB4ODA3MSwgMHg4MDc1LAorICAgIDB4ODA5RSwgMHg4MEE2LCAweDgwQUIsIDB4ODBENywgMHg4MEQ4LCAweDgxMTYsIDB4ODExOCwgMHg4MTNBLCAweDgxNEEsCisgICAgMHg4MTRDLCAweDgxODEsIDB4ODE4NCwgMHg4MUI0LCAweDgxQ0YsIDB4ODFGOSwgMHg4MjAzLCAweDgyMjEsIDB4ODIzMiwKKyAgICAweDgyMzQsIDB4ODI0NiwgMHg4MjRCLCAweDgyNEYsIDB4ODI4RSwgMHg4MkFFLCAweDgyQjcsIDB4ODJCRSwgMHg4MkM2LAorICAgIDB4ODJGRSwgMHg4MzQzLCAweDgzNTEsIDB4ODM1NSwgMHg4Mzg2LCAweDgzOEQsIDB4ODM5MiwgMHg4Mzk4LCAweDgzQTksCisgICAgMHg4M0JGLCAweDgzQzAsIDB4ODNFQSwgMHg4NDBGLCAweDg0MTEsIDB4ODQ0QSwgMHg4NDc2LCAweDg0QTgsIDB4ODRBRiwKKyAgICAweDg0QzAsIDB4ODRDMiwgMHg4NEYwLCAweDg0RkQsIDB4ODUwQywgMHg4NTM0LCAweDg1NUUsIDB4ODU4RiwgMHg4NUI3LAorICAgIDB4ODVDRSwgMHg4NUFELCAweDg2MTIsIDB4ODYyOSwgMHg4NjUyLCAweDg2NjMsIDB4ODY2QywgMHg4NjZGLCAweDg2N0EsCisgICAgMHg4NjhELCAweDg2OTEsIDB4ODY5OCwgMHg4NkE3LCAweDg2QTgsIDB4ODZGQSwgMHg4NkZELCAweDg3MEIsIDB4ODcxMywKKyAgICAweDg3MTksIDB4ODcxRSwgMHg4NzI4LCAweDg3M0UsIDB4ODc3MSwgMHg4Nzg4LCAweDg3OTksIDB4ODdBQywgMHg4N0FELAorICAgIDB4ODdCNSwgMHg4N0Q2LCAweDg3RUIsIDB4ODdFRCwgMHg4ODAxLCAweDg4MDMsIDB4ODgwNiwgMHg4ODBCLCAweDg4MTQsCisgICAgMHg4ODFDLCAweDg4NTYsIDB4ODg1RiwgMHg4ODY0LCAweDg4OTgsIDB4ODhBQSwgMHg4OEJELCAweDg4QkUsIDB4ODhDQSwKKyAgICAweDg4RDIsIDB4ODhEQiwgMHg4OEYwLCAweDg4RjEsIDB4ODkwNiwgMHg4OTE4LCAweDg5MTksIDB4ODkxQSwgMHg4OTI3LAorICAgIDB4ODkzMCwgMHg4OTNFLCAweDg5N0IsIDB4ODlENCwgMHg4OUQ2LCAweDg5RTUsIDB4ODlGMSwgMHg4QTA3LCAweDhBMEYsCisgICAgMHg4QTE1LCAweDhBMjIsIDB4OEE0RSwgMHg4QTdGLCAweDhBRjQsIDB4OEIxRiwgMHg4QjM3LCAweDhCNDMsIDB4OEI0NCwKKyAgICAweDhCNTQsIDB4OEI5QywgMHg4QjlFLCAweDhDNDcsIDB4OEM1NCwgMHg4QzczLCAweDhDQTQsIDB4OENEOSwgMHg4Q0UxLAorICAgIDB4OENGOCwgMHg4Q0ZFLCAweDhEMUIsIDB4OEQ2OSwgMHg4RDZDLCAweDhEODQsIDB4OEQ4RCwgMHg4RDk1LCAweDhEQTYsCisgICAgMHg4REM2LCAweDhEQ0UsIDB4OERFNCwgMHg4REVDLCAweDhFMjAsIDB4OEU0QiwgMHg4RTZDLCAweDhFNzAsIDB4OEU3QSwKKyAgICAweDhFOTIsIDB4OEVBRSwgMHg4RUIzLCAweDhFRDEsIDB4OEVENCwgMHg4RUY5LCAweDhGMTcsIDB4OEYzNiwgMHg4RkE2LAorICAgIDB4OEZCNSwgMHg4RkI2LCAweDhGQzYsIDB4OEZFMCwgMHg4RkU0LCAweDhGRjYsIDB4OTAwMiwgMHg5MDJDLCAweDkwNDQsCisgICAgMHg5MDg4LCAweDkwOTUsIDB4OTA5OSwgMHg5MDlCLCAweDkwQTIsIDB4OTBCNCwgMHg5MEQ3LCAweDkwREQsIDB4OTBGNCwKKyAgICAweDkxMTcsIDB4OTExQywgMHg5MTMxLCAweDkxM0EsIDB4OTEzRCwgMHg5MTQ4LCAweDkxNUIsIDB4OTE2MSwgMHg5MTY0LAorICAgIDB4OTE4RSwgMHg5MTlFLCAweDkxQTgsIDB4OTFBRCwgMHg5MUFFLCAweDkxQjIsIDB4OTFCQywgMHg5MUYwLCAweDkxRjcsCisgICAgMHg5MUZCLCAweDkyMDcsIDB4OTIyOCwgMHg5MjMzLCAweDkyMzgsIDB4OTI0MywgMHg5MjQ3LCAweDkyNEYsIDB4OTI2MCwKKyAgICAweDkyQzIsIDB4OTJDQiwgMHg5MkNDLCAweDkyREYsIDB4OTMwRCwgMHg5MzE1LCAweDkzMUYsIDB4OTMyNywgMHg5MzQ3LAorICAgIDB4OTM1MiwgMHg5MzY1LCAweDkzNkEsIDB4OTM2RCwgMHg5MzlCLCAweDkzQkEsIDB4OTNBOSwgMHg5M0MxLCAweDkzQ0EsCisgICAgMHg5M0UyLCAweDkzRkEsIDB4OTNGRCwgMHg5NDBGLCAweDk0MzQsIDB4OTQzRiwgMHg5NDU1LCAweDk0NkIsIDB4OTQ3MiwKKyAgICAweDk1NzgsIDB4OTVBNiwgMHg5NUE5LCAweDk1QUIsIDB4OTVCNCwgMHg5NUJELCAweDk1REEsIDB4OTYxRCwgMHg5NjQxLAorICAgIDB4OTY1OCwgMHg5Njg0LCAweDk2QTQsIDB4OTZBOSwgMHg5NkQyLCAweDVEQjIsIDB4OTZERSwgMHg5NkU5LCAweDk2RjEsCisgICAgMHg5NzAyLCAweDk3MDksIDB4OTc1QSwgMHg5NzYzLCAweDk3NkUsIDB4OTc3MywgMHg5NzlBLCAweDk3QTIsIDB4OTdCNSwKKyAgICAweDk3QjYsIDB4OTdEOSwgMHg5N0RFLCAweDk3RjQsIDB4OTgwQSwgMHg5ODBFLCAweDk4MUUsIDB4OTgyMywgMHg5ODJCLAorICAgIDB4OTgzRSwgMHg5ODUyLCAweDk4NTMsIDB4OTg1OSwgMHg5ODZDLCAweDk4QjgsIDB4OThCQSwgMHg5OEJGLCAweDk4QzgsCisgICAgMHg5OEU1LCAweDk5MzIsIDB4OTkzMywgMHg5OTQwLCAweDk5NEQsIDB4OTk1QywgMHg5OTVGLCAweDk5QjEsIDB4OTlCOSwKKyAgICAweDk5QkEsIDB4OTlDOSwgMHg5QTAyLCAweDlBMTYsIDB4OUEyNCwgMHg5QTI3LCAweDlBMkQsIDB4OUEyRSwgMHg5QTM2LAorICAgIDB4OUEzOCwgMHg5QTRBLCAweDlBNTYsIDB4OUFCNSwgMHg5QUI2LCAweDlBRjksIDB4OUIwMywgMHg5QjIwLCAweDlCMzMsCisgICAgMHg5QjM0LCAweDlCNzMsIDB4OUI3OSwgMHg5QkE3LCAweDlCQzEsIDB4OUJDNywgMHg5QkQ3LCAweDlCRTcsIDB4OUJFQiwKKyAgICAweDlCRjcsIDB4OUJGQSwgMHg5QkZELCAweDlDMEIsIDB4OUMyNywgMHg5QzJBLCAweDlDMzYsIDB4OUM0MSwgMHg5QzUzLAorICAgIDB4OUM2MywgMHg5QzZBLCAweDlDNzcsIDB4OUQwMiwgMHg5RDQyLCAweDlENDcsIDB4OUQ2MywgMHg5RDY5LCAweDlEN0MsCisgICAgMHg5RDdFLCAweDlEOEQsIDB4OURCMSwgMHg5REMzLCAweDlEQzcsIDB4OURENiwgMHg5RERGLCAweDlERUIsIDB4OURGNCwKKyAgICAweDlFMTUsIDB4OUUxRCwgMHg5RUE0LCAweDlFQTgsIDB4OUVBQywgMHg5RUU3LCAweDlFRUUsIDB4OUYxMCwgMHg5RjEyLAorICAgIDB4OUYxNywgMHg5RjE5LCAweDlGMkYsIDB4OUYzNywgMHg5RjM5LCAweDlGNDEsIDB4OUY0NSwgMHg5RjU3LCAweDlGNjgsCisgICAgMHg5RjcxLCAweDlGNzUsIDB4OUY5MCwgMHg5Rjk0LCAweDlGQTIsIDB4NEUzMCwgMHgzNDA1LCAweDRGNjAsIDB4NTYyMCwKKyAgICAweDVFQ0IsIDB4MkU5NSwgMHg2MEE0LCAweDY5RDcsIDB4NkIyNCwgMHg2RkY5LCAweDZFRTYsIDB4NzFCMywgMHgyRUE0LAorICAgIDB4N0FDNiwgMHg3RjYxLCAweDgwNzEsIDB4ODA5RSwgMHgyRUNDLCAweDkxRjAsIDB4NURCMiwgMHg5N0RFLCAweDRGRDMsCisgICAgMHg1MEQ5LCAweDUwRjAsIDB4NTFDMywgMHg1Njc2LCAweDZBNTQsIDB4NkQwMSwgMHg2REQwLCAweDZFNDIsIDB4NkVEOSwKKyAgICAweDczRTQsIDB4NzQyMSwgMHg3NTZDLCAweDc4NTEsIDB4ODdGNSwgMHhGRkZELCAweDczQTgsIDB4M0FGMywgMHgzNERCLAorICAgIDB4NDQwQywgMHgzRThBLCAweEZGRkQsIDB4RkZGRCwgMHg0QkU4LCAweEZGRkQsIDB4M0VEQSwgMHgzQjIyLCAweEZGRkQsCisgICAgMHg0NTdBLCAweDQwOTMsIDB4RkZGRCwgMHg0NjY1LCAweDQxMDMsIDB4NDI5MywgMHg0NkFFLCAweDM0ODgsIDB4RkZGRCwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLUhXLUhfNC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLUhXLUhfNC5jcHAKaW5kZXggYjhmODQyZC4uODM2YTFmMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1IVy1IXzQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItSFctSF80LmNwcApAQCAtNyw2ICs3LDYgQEAKICNpbmNsdWRlICJjbWFwc19qYXBhbjEuaCIKIAogY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9IV19IXzRbNCAqIDNdID0gewotICAgIDB4MDAyMCwgMHgwMDVCLCAweDAwRTcsIDB4MDA1QywgMHgwMDVDLCAweDIyMEYsIDB4MDA1RCwgMHgwMDdFLCAweDAxMjQsCi0gICAgMHgwMEE1LCAweDAwQTUsIDB4MDEyMywKKyAgICAweDAwMjAsIDB4MDA1QiwgMHgwMEU3LCAweDAwNUMsIDB4MDA1QywgMHgyMjBGLAorICAgIDB4MDA1RCwgMHgwMDdFLCAweDAxMjQsIDB4MDBBNSwgMHgwMEE1LCAweDAxMjMsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1IXzQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1IXzQuY3BwCmluZGV4IDRkNTdlY2IuLjY3NzQ1YWYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItSF80LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLUhfNC5jcHAKQEAgLTcsMjQ0NyArNywyMTc2IEBACiAjaW5jbHVkZSAiY21hcHNfamFwYW4xLmgiCiAKIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pSklTX1VDUzJfSF80Wzk3NzIgKiAyXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwMSwgMHgwMDIxLCAweDAwMDIsIDB4MDAyMiwgMHgwMDAzLCAweDAwMjMsIDB4MDAwNCwKLSAgICAweDAwMjQsIDB4MDAwNSwgMHgwMDI1LCAweDAwMDYsIDB4MDAyNiwgMHgwMDA3LCAweDAwMjcsIDB4MDAwOCwKLSAgICAweDAwMjgsIDB4MDAwOSwgMHgwMDI5LCAweDAwMEEsIDB4MDAyQSwgMHgwMDBCLCAweDAwMkIsIDB4MDAwQywKLSAgICAweDAwMkMsIDB4MDAwRCwgMHgwMDJELCAweDAwMEUsIDB4MDAyRSwgMHgwMDBGLCAweDAwMkYsIDB4MDAxMCwKLSAgICAweDAwMzAsIDB4MDAxMSwgMHgwMDMxLCAweDAwMTIsIDB4MDAzMiwgMHgwMDEzLCAweDAwMzMsIDB4MDAxNCwKLSAgICAweDAwMzQsIDB4MDAxNSwgMHgwMDM1LCAweDAwMTYsIDB4MDAzNiwgMHgwMDE3LCAweDAwMzcsIDB4MDAxOCwKLSAgICAweDAwMzgsIDB4MDAxOSwgMHgwMDM5LCAweDAwMUEsIDB4MDAzQSwgMHgwMDFCLCAweDAwM0IsIDB4MDAxQywKLSAgICAweDAwM0MsIDB4MDAxRCwgMHgwMDNELCAweDAwMUUsIDB4MDAzRSwgMHgwMDFGLCAweDAwM0YsIDB4MDAyMCwKLSAgICAweDAwNDAsIDB4MDAyMSwgMHgwMDQxLCAweDAwMjIsIDB4MDA0MiwgMHgwMDIzLCAweDAwNDMsIDB4MDAyNCwKLSAgICAweDAwNDQsIDB4MDAyNSwgMHgwMDQ1LCAweDAwMjYsIDB4MDA0NiwgMHgwMDI3LCAweDAwNDcsIDB4MDAyOCwKLSAgICAweDAwNDgsIDB4MDAyOSwgMHgwMDQ5LCAweDAwMkEsIDB4MDA0QSwgMHgwMDJCLCAweDAwNEIsIDB4MDAyQywKLSAgICAweDAwNEMsIDB4MDAyRCwgMHgwMDRELCAweDAwMkUsIDB4MDA0RSwgMHgwMDJGLCAweDAwNEYsIDB4MDAzMCwKLSAgICAweDAwNTAsIDB4MDAzMSwgMHgwMDUxLCAweDAwMzIsIDB4MDA1MiwgMHgwMDMzLCAweDAwNTMsIDB4MDAzNCwKLSAgICAweDAwNTQsIDB4MDAzNSwgMHgwMDU1LCAweDAwMzYsIDB4MDA1NiwgMHgwMDM3LCAweDAwNTcsIDB4MDAzOCwKLSAgICAweDAwNTgsIDB4MDAzOSwgMHgwMDU5LCAweDAwM0EsIDB4MDA1QSwgMHgwMDNCLCAweDAwNUIsIDB4MDAzQywKLSAgICAweDAwNUMsIDB4MDA2MSwgMHgwMDVELCAweDAwM0UsIDB4MDA1RSwgMHgwMDNGLCAweDAwNUYsIDB4MDA0MCwKLSAgICAweDAwNjAsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDIsIDB4MDA2MiwgMHgwMDQzLCAweDAwNjMsIDB4MDA0NCwKLSAgICAweDAwNjQsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDYsIDB4MDA2NiwgMHgwMDQ3LCAweDAwNjcsIDB4MDA0OCwKLSAgICAweDAwNjgsIDB4MDA0OSwgMHgwMDY5LCAweDAwNEEsIDB4MDA2QSwgMHgwMDRCLCAweDAwNkIsIDB4MDA0QywKLSAgICAweDAwNkMsIDB4MDA0RCwgMHgwMDZELCAweDAwNEUsIDB4MDA2RSwgMHgwMDRGLCAweDAwNkYsIDB4MDA1MCwKLSAgICAweDAwNzAsIDB4MDA1MSwgMHgwMDcxLCAweDAwNTIsIDB4MDA3MiwgMHgwMDUzLCAweDAwNzMsIDB4MDA1NCwKLSAgICAweDAwNzQsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTYsIDB4MDA3NiwgMHgwMDU3LCAweDAwNzcsIDB4MDA1OCwKLSAgICAweDAwNzgsIDB4MDA1OSwgMHgwMDc5LCAweDAwNUEsIDB4MDA3QSwgMHgwMDVCLCAweDAwN0IsIDB4MDA1QywKLSAgICAweDAwN0MsIDB4MDA1RCwgMHgwMDdELCAweDAwNUUsIDB4MDA3RSwgMHgwMDVGLCAweDAwQTEsIDB4MDA2NSwKLSAgICAweDAwQTIsIDB4MDA2NiwgMHgwMEEzLCAweDAwNjcsIDB4MDBBNCwgMHgwMDZCLCAweDAwQTUsIDB4MDAzRCwKLSAgICAweDAwQTYsIDB4MDA2MywgMHgwMEE3LCAweDAyRDAsIDB4MDBBOCwgMHgwMjg3LCAweDAwQTksIDB4MDA5OCwKLSAgICAweDAwQUEsIDB4MDA4QywgMHgwMEFCLCAweDAwNkQsIDB4MDBBQywgMHgwMDk5LCAweDAwQUQsIDB4MDA5NywKLSAgICAweDAwQUUsIDB4MDA5QSwgMHgwMEFGLCAweDAwODEsIDB4MDBCMCwgMHgwMkMzLCAweDAwQjEsIDB4MDJCNiwKLSAgICAweDAwQjIsIDB4MDA5RCwgMHgwMEIzLCAweDAwOUUsIDB4MDBCNCwgMHgwMjg1LCAweDAwQjUsIDB4MDA5RiwKLSAgICAweDAwQjYsIDB4MDMwQSwgMHgwMEI3LCAweDAwNzUsIDB4MDBCOCwgMHgwMDg2LCAweDAwQjksIDB4MDBBMCwKLSAgICAweDAwQkEsIDB4MDA5MCwgMHgwMEJCLCAweDAwN0IsIDB4MDBCQywgMHgwMEExLCAweDAwQkQsIDB4MDBBMiwKLSAgICAweDAwQkUsIDB4MDBBMywgMHgwMEJGLCAweDAwN0UsIDB4MDBDMCwgMHgwMEE0LCAweDAwQzEsIDB4MDBBNSwKLSAgICAweDAwQzIsIDB4MDBBNiwgMHgwMEMzLCAweDAwQTcsIDB4MDBDNCwgMHgwMEE4LCAweDAwQzUsIDB4MDBBOSwKLSAgICAweDAwQzYsIDB4MDA4QiwgMHgwMEM3LCAweDAwQUEsIDB4MDBDOCwgMHgwMEFCLCAweDAwQzksIDB4MDBBQywKLSAgICAweDAwQ0EsIDB4MDBBRCwgMHgwMENCLCAweDAwQUUsIDB4MDBDQywgMHgwMEFGLCAweDAwQ0QsIDB4MDBCMCwKLSAgICAweDAwQ0UsIDB4MDBCMSwgMHgwMENGLCAweDAwQjIsIDB4MDBEMCwgMHgwMEIzLCAweDAwRDEsIDB4MDBCNCwKLSAgICAweDAwRDIsIDB4MDBCNSwgMHgwMEQzLCAweDAwQjYsIDB4MDBENCwgMHgwMEI3LCAweDAwRDUsIDB4MDBCOCwKLSAgICAweDAwRDYsIDB4MDBCOSwgMHgwMEQ3LCAweDAyQjcsIDB4MDBEOCwgMHgwMDhFLCAweDAwRDksIDB4MDBCQiwKLSAgICAweDAwREEsIDB4MDBCQywgMHgwMERCLCAweDAwQkQsIDB4MDBEQywgMHgwMEJFLCAweDAwREQsIDB4MDBCRiwKLSAgICAweDAwREUsIDB4MDBDMCwgMHgwMERGLCAweDAwOTYsIDB4MDBFMCwgMHgwMEMxLCAweDAwRTEsIDB4MDBDMiwKLSAgICAweDAwRTIsIDB4MDBDMywgMHgwMEUzLCAweDAwQzQsIDB4MDBFNCwgMHgwMEM1LCAweDAwRTUsIDB4MDBDNiwKLSAgICAweDAwRTYsIDB4MDA5MSwgMHgwMEU3LCAweDAwQzcsIDB4MDBFOCwgMHgwMEM4LCAweDAwRTksIDB4MDBDOSwKLSAgICAweDAwRUEsIDB4MDBDQSwgMHgwMEVCLCAweDAwQ0IsIDB4MDBFQywgMHgwMENDLCAweDAwRUQsIDB4MDBDRCwKLSAgICAweDAwRUUsIDB4MDBDRSwgMHgwMEVGLCAweDAwQ0YsIDB4MDBGMCwgMHgwMEQwLCAweDAwRjEsIDB4MDBEMSwKLSAgICAweDAwRjIsIDB4MDBEMiwgMHgwMEYzLCAweDAwRDMsIDB4MDBGNCwgMHgwMEQ0LCAweDAwRjUsIDB4MDBENSwKLSAgICAweDAwRjYsIDB4MDBENiwgMHgwMEY3LCAweDAyQjgsIDB4MDBGOCwgMHgwMDk0LCAweDAwRjksIDB4MDBEOCwKLSAgICAweDAwRkEsIDB4MDBEOSwgMHgwMEZCLCAweDAwREEsIDB4MDBGQywgMHgwMERCLCAweDAwRkQsIDB4MDBEQywKLSAgICAweDAwRkUsIDB4MDBERCwgMHgwMEZGLCAweDAwREUsIDB4MDEwMCwgMHgyNDk2LCAweDAxMDEsIDB4MjQ5MSwKLSAgICAweDAxMTIsIDB4MjQ5OSwgMHgwMTEzLCAweDI0OTQsIDB4MDExQSwgMHgyNEIzLCAweDAxMUIsIDB4MjRCRiwKLSAgICAweDAxMjcsIDB4MkYzQywgMHgwMTI4LCAweDI0QjgsIDB4MDEyOSwgMHgyNEM0LCAweDAxMkEsIDB4MjQ5NywKLSAgICAweDAxMkIsIDB4MjQ5MiwgMHgwMTMxLCAweDAwOTIsIDB4MDE0MSwgMHgwMDhELCAweDAxNDIsIDB4MDA5MywKLSAgICAweDAxNEIsIDB4MjREQywgMHgwMTRDLCAweDI0OUEsIDB4MDE0RCwgMHgyNDk1LCAweDAxNTIsIDB4MDA4RiwKLSAgICAweDAxNTMsIDB4MDA5NSwgMHgwMTYwLCAweDAwREYsIDB4MDE2MSwgMHgwMEUzLCAweDAxNjgsIDB4MjRCRCwKLSAgICAweDAxNjksIDB4MjRDOSwgMHgwMTZBLCAweDI0OTgsIDB4MDE2QiwgMHgyNDkzLCAweDAxNkUsIDB4MjRCQywKLSAgICAweDAxNkYsIDB4MjRDOCwgMHgwMTc4LCAweDAwRTAsIDB4MDE3RCwgMHgwMEUxLCAweDAxN0UsIDB4MDBFNSwKLSAgICAweDAxQzAsIDB4MDA2MywgMHgwMUNELCAweDI0QjIsIDB4MDFDRSwgMHgyNEJFLCAweDAxQ0YsIDB4MjRCNiwKLSAgICAweDAxRDAsIDB4MjRDMiwgMHgwMUQxLCAweDI0QjksIDB4MDFEMiwgMHgyNEM1LCAweDAxRDMsIDB4MjRCQiwKLSAgICAweDAxRDQsIDB4MjRDNywgMHgwMUZELCAweDI0Q0QsIDB4MDI1MSwgMHgyNENBLCAweDAyNTQsIDB4MjRDRiwKLSAgICAweDAyNTksIDB4MjREMiwgMHgwMjVBLCAweDI0RDUsIDB4MDI1QiwgMHgyNEQ4LCAweDAyNzUsIDB4MjRERCwKLSAgICAweDAyODMsIDB4MjRFMiwgMHgwMjhDLCAweDI0REUsIDB4MDI5MiwgMHgyNEUxLCAweDAyRDAsIDB4MjRFMywKLSAgICAweDAzMDAsIDB4MDA0MSwgMHgwMzAxLCAweDAwN0YsIDB4MDMwMiwgMHgwMDgwLCAweDAzMDMsIDB4MDA1RiwKLSAgICAweDAzMDQsIDB4MDA4MSwgMHgwMzA1LCAweDAwRTIsIDB4MDMwNiwgMHgwMDgyLCAweDAzMDcsIDB4MDA4MywKLSAgICAweDAzMDgsIDB4MDA4NCwgMHgwMzBBLCAweDAwODUsIDB4MDMwQiwgMHgwMDg3LCAweDAzMEMsIDB4MDA4OSwKLSAgICAweDAzMjcsIDB4MDA4NiwgMHgwMzI4LCAweDAwODgsIDB4MDMzMiwgMHgwMDQwLCAweDAzMzYsIDB4MDA4QSwKLSAgICAweDAzNjEsIDB4MDJGNiwgMHgwMzkxLCAweDAzRjMsIDB4MDM5MiwgMHgwM0Y0LCAweDAzOTMsIDB4MDNGNSwKLSAgICAweDAzOTQsIDB4MDNGNiwgMHgwMzk1LCAweDAzRjcsIDB4MDM5NiwgMHgwM0Y4LCAweDAzOTcsIDB4MDNGOSwKLSAgICAweDAzOTgsIDB4MDNGQSwgMHgwMzk5LCAweDAzRkIsIDB4MDM5QSwgMHgwM0ZDLCAweDAzOUIsIDB4MDNGRCwKLSAgICAweDAzOUMsIDB4MDNGRSwgMHgwMzlELCAweDAzRkYsIDB4MDM5RSwgMHgwNDAwLCAweDAzOUYsIDB4MDQwMSwKLSAgICAweDAzQTAsIDB4MDQwMiwgMHgwM0ExLCAweDA0MDMsIDB4MDNBMywgMHgwNDA0LCAweDAzQTQsIDB4MDQwNSwKLSAgICAweDAzQTUsIDB4MDQwNiwgMHgwM0E2LCAweDA0MDcsIDB4MDNBNywgMHgwNDA4LCAweDAzQTgsIDB4MDQwOSwKLSAgICAweDAzQTksIDB4MDQwQSwgMHgwM0IxLCAweDA0MEIsIDB4MDNCMiwgMHgwNDBDLCAweDAzQjMsIDB4MDQwRCwKLSAgICAweDAzQjQsIDB4MDQwRSwgMHgwM0I1LCAweDA0MEYsIDB4MDNCNiwgMHgwNDEwLCAweDAzQjcsIDB4MDQxMSwKLSAgICAweDAzQjgsIDB4MDQxMiwgMHgwM0I5LCAweDA0MTMsIDB4MDNCQSwgMHgwNDE0LCAweDAzQkIsIDB4MDQxNSwKLSAgICAweDAzQkMsIDB4MDQxNiwgMHgwM0JELCAweDA0MTcsIDB4MDNCRSwgMHgwNDE4LCAweDAzQkYsIDB4MDQxOSwKLSAgICAweDAzQzAsIDB4MDQxQSwgMHgwM0MxLCAweDA0MUIsIDB4MDNDMywgMHgwNDFDLCAweDAzQzQsIDB4MDQxRCwKLSAgICAweDAzQzUsIDB4MDQxRSwgMHgwM0M2LCAweDA0MUYsIDB4MDNDNywgMHgwNDIwLCAweDAzQzgsIDB4MDQyMSwKLSAgICAweDAzQzksIDB4MDQyMiwgMHgwM0QwLCAweDJGM0EsIDB4MDNEMSwgMHgyRjQwLCAweDAzREIsIDB4MkYzRiwKLSAgICAweDA0MDEsIDB4MDQyOSwgMHgwNDEwLCAweDA0MjMsIDB4MDQxMSwgMHgwNDI0LCAweDA0MTIsIDB4MDQyNSwKLSAgICAweDA0MTMsIDB4MDQyNiwgMHgwNDE0LCAweDA0MjcsIDB4MDQxNSwgMHgwNDI4LCAweDA0MTYsIDB4MDQyQSwKLSAgICAweDA0MTcsIDB4MDQyQiwgMHgwNDE4LCAweDA0MkMsIDB4MDQxOSwgMHgwNDJELCAweDA0MUEsIDB4MDQyRSwKLSAgICAweDA0MUIsIDB4MDQyRiwgMHgwNDFDLCAweDA0MzAsIDB4MDQxRCwgMHgwNDMxLCAweDA0MUUsIDB4MDQzMiwKLSAgICAweDA0MUYsIDB4MDQzMywgMHgwNDIwLCAweDA0MzQsIDB4MDQyMSwgMHgwNDM1LCAweDA0MjIsIDB4MDQzNiwKLSAgICAweDA0MjMsIDB4MDQzNywgMHgwNDI0LCAweDA0MzgsIDB4MDQyNSwgMHgwNDM5LCAweDA0MjYsIDB4MDQzQSwKLSAgICAweDA0MjcsIDB4MDQzQiwgMHgwNDI4LCAweDA0M0MsIDB4MDQyOSwgMHgwNDNELCAweDA0MkEsIDB4MDQzRSwKLSAgICAweDA0MkIsIDB4MDQzRiwgMHgwNDJDLCAweDA0NDAsIDB4MDQyRCwgMHgwNDQxLCAweDA0MkUsIDB4MDQ0MiwKLSAgICAweDA0MkYsIDB4MDQ0MywgMHgwNDMwLCAweDA0NDQsIDB4MDQzMSwgMHgwNDQ1LCAweDA0MzIsIDB4MDQ0NiwKLSAgICAweDA0MzMsIDB4MDQ0NywgMHgwNDM0LCAweDA0NDgsIDB4MDQzNSwgMHgwNDQ5LCAweDA0MzYsIDB4MDQ0QiwKLSAgICAweDA0MzcsIDB4MDQ0QywgMHgwNDM4LCAweDA0NEQsIDB4MDQzOSwgMHgwNDRFLCAweDA0M0EsIDB4MDQ0RiwKLSAgICAweDA0M0IsIDB4MDQ1MCwgMHgwNDNDLCAweDA0NTEsIDB4MDQzRCwgMHgwNDUyLCAweDA0M0UsIDB4MDQ1MywKLSAgICAweDA0M0YsIDB4MDQ1NCwgMHgwNDQwLCAweDA0NTUsIDB4MDQ0MSwgMHgwNDU2LCAweDA0NDIsIDB4MDQ1NywKLSAgICAweDA0NDMsIDB4MDQ1OCwgMHgwNDQ0LCAweDA0NTksIDB4MDQ0NSwgMHgwNDVBLCAweDA0NDYsIDB4MDQ1QiwKLSAgICAweDA0NDcsIDB4MDQ1QywgMHgwNDQ4LCAweDA0NUQsIDB4MDQ0OSwgMHgwNDVFLCAweDA0NEEsIDB4MDQ1RiwKLSAgICAweDA0NEIsIDB4MDQ2MCwgMHgwNDRDLCAweDA0NjEsIDB4MDQ0RCwgMHgwNDYyLCAweDA0NEUsIDB4MDQ2MywKLSAgICAweDA0NEYsIDB4MDQ2NCwgMHgwNDUxLCAweDA0NEEsIDB4MDQ1QiwgMHgyRjNDLCAweDFFQkMsIDB4MjRCNSwKLSAgICAweDFFQkQsIDB4MjRDMSwgMHgyMDAyLCAweDAwRTcsIDB4MjAwMywgMHgwMjc5LCAweDIwMTAsIDB4MDI5NiwKLSAgICAweDIwMTEsIDB4MDAwRSwgMHgyMDEyLCAweDAwNzIsIDB4MjAxMywgMHgwMDcyLCAweDIwMTQsIDB4MDA4QSwKLSAgICAweDIwMTUsIDB4MDI5NSwgMHgyMDE2LCAweDAyOUEsIDB4MjAxOCwgMHgwMjlFLCAweDIwMTksIDB4MDI5RiwKLSAgICAweDIwMUEsIDB4MDA3OCwgMHgyMDFDLCAweDAyQTAsIDB4MjAxRCwgMHgwMkExLCAweDIwMUUsIDB4MDA3OSwKLSAgICAweDIwMjAsIDB4MDMwOCwgMHgyMDIxLCAweDAzMDksIDB4MjAyMiwgMHgwMDc3LCAweDIwMjUsIDB4MDI5RCwKLSAgICAweDIwMjYsIDB4MDI5QywgMHgyMDMwLCAweDAzMDQsIDB4MjAzMiwgMHgwMkM0LCAweDIwMzMsIDB4MDJDNSwKLSAgICAweDIwMzksIDB4MDA2RSwgMHgyMDNBLCAweDAwNkYsIDB4MjAzQiwgMHgwMkRFLCAweDIwM0MsIDB4MkY0RiwKLSAgICAweDIwM0UsIDB4MDE0NSwgMHgyMDQ0LCAweDAwNjgsIDB4MjA0OSwgMHgyRjUwLCAweDIwNzAsIDB4MjRBMSwKLSAgICAweDIwNzQsIDB4MjRBMiwgMHgyMDc1LCAweDI0QTMsIDB4MjA3NiwgMHgyNEE0LCAweDIwNzcsIDB4MjRBNSwKLSAgICAweDIwNzgsIDB4MjRBNiwgMHgyMDc5LCAweDI0QTcsIDB4MjA4MCwgMHgyNEE4LCAweDIwODEsIDB4MjRBOSwKLSAgICAweDIwODIsIDB4MjRBQSwgMHgyMDgzLCAweDI0QUIsIDB4MjA4NCwgMHgyNEFDLCAweDIwODUsIDB4MjRBRCwKLSAgICAweDIwODYsIDB4MjRBRSwgMHgyMDg3LCAweDI0QUYsIDB4MjA4OCwgMHgyNEIwLCAweDIwODksIDB4MjRCMSwKLSAgICAweDIwQUMsIDB4MjQ4QSwgMHgyMERELCAweDAzMEIsIDB4MjEwMCwgMHgyRTRGLCAweDIxMDMsIDB4MDJDNiwKLSAgICAweDIxMDUsIDB4MkU1MywgMHgyMTA5LCAweDIwNzEsIDB4MjEwQSwgMHgyMDcwLCAweDIxMEYsIDB4MkYzQywKLSAgICAweDIxMTMsIDB4MUY1OSwgMHgyMTE2LCAweDFEQkEsIDB4MjEyMSwgMHgxRjc3LCAweDIxMjIsIDB4MDBFNCwKLSAgICAweDIxMjYsIDB4MjQ4QiwgMHgyMTJCLCAweDAzMDMsIDB4MjEzNSwgMHgyRjM5LCAweDIxNTMsIDB4MjQ5RiwKLSAgICAweDIxNTQsIDB4MjRBMCwgMHgyMTVCLCAweDI0OUIsIDB4MjE1QywgMHgyNDlDLCAweDIxNUQsIDB4MjQ5RCwKLSAgICAweDIxNUUsIDB4MjQ5RSwgMHgyMTYwLCAweDFEOTcsIDB4MjE2MSwgMHgxRDk4LCAweDIxNjIsIDB4MUQ5OSwKLSAgICAweDIxNjMsIDB4MUQ5QSwgMHgyMTY0LCAweDFEOUIsIDB4MjE2NSwgMHgxRDlDLCAweDIxNjYsIDB4MUQ5RCwKLSAgICAweDIxNjcsIDB4MUQ5RSwgMHgyMTY4LCAweDFEOUYsIDB4MjE2OSwgMHgxREEwLCAweDIxNkEsIDB4MjAyMSwKLSAgICAweDIxNkIsIDB4MjAyMiwgMHgyMTcwLCAweDFGOUMsIDB4MjE3MSwgMHgxRjlELCAweDIxNzIsIDB4MUY5RSwKLSAgICAweDIxNzMsIDB4MUY5RiwgMHgyMTc0LCAweDFGQTAsIDB4MjE3NSwgMHgxRkExLCAweDIxNzYsIDB4MUZBMiwKLSAgICAweDIxNzcsIDB4MUZBMywgMHgyMTc4LCAweDFGQTQsIDB4MjE3OSwgMHgxRkE1LCAweDIxN0EsIDB4MjA2QSwKLSAgICAweDIxN0IsIDB4MjA2QiwgMHgyMTdGLCAweDIwNkYsIDB4MjE5MCwgMHgwMkUxLCAweDIxOTEsIDB4MDJFMiwKLSAgICAweDIxOTIsIDB4MDJFMCwgMHgyMTkzLCAweDAyRTMsIDB4MjE5NCwgMHgyRkE5LCAweDIxOTUsIDB4MkZCNywKLSAgICAweDIxOTYsIDB4MkZBQywgMHgyMTk3LCAweDJGQUQsIDB4MjE5OCwgMHgyRkFBLCAweDIxOTksIDB4MkZBQiwKLSAgICAweDIxQzQsIDB4MjA3NiwgMHgyMUM1LCAweDIwNzcsIDB4MjFDNiwgMHgyMDc1LCAweDIxQ0MsIDB4MkZBRSwKLSAgICAweDIxRDAsIDB4MkZBOCwgMHgyMUQyLCAweDAyRjAsIDB4MjFENCwgMHgwMkYxLCAweDIxRTYsIDB4MUY0RCwKLSAgICAweDIxRTcsIDB4MUY0QywgMHgyMUU4LCAweDFGNEUsIDB4MjFFOSwgMHgxRjRCLCAweDIyMDAsIDB4MDJGMiwKLSAgICAweDIyMDIsIDB4MDJGNywgMHgyMjAzLCAweDAyRjMsIDB4MjIwNSwgMHgyRjk4LCAweDIyMDcsIDB4MDJGOCwKLSAgICAweDIyMDgsIDB4MDJFNSwgMHgyMjBBLCAweDJGM0IsIDB4MjIwQiwgMHgwMkU2LCAweDIyMTEsIDB4MURDOSwKLSAgICAweDIyMTIsIDB4MDJCNSwgMHgyMjEzLCAweDJGNTYsIDB4MjIxQSwgMHgwMkZELCAweDIyMUQsIDB4MDJGRiwKLSAgICAweDIyMUUsIDB4MDJCRiwgMHgyMjFGLCAweDFEQ0QsIDB4MjIyMCwgMHgwMkY0LCAweDIyMjUsIDB4MDI5QSwKLSAgICAweDIyMjcsIDB4MDJFRCwgMHgyMjI4LCAweDAyRUUsIDB4MjIyOSwgMHgwMkVDLCAweDIyMkEsIDB4MDJFQiwKLSAgICAweDIyMkIsIDB4MDMwMSwgMHgyMjJDLCAweDAzMDIsIDB4MjIyRCwgMHgyMDAzLCAweDIyMkUsIDB4MURDOCwKLSAgICAweDIyMzQsIDB4MDJDMCwgMHgyMjM1LCAweDAzMDAsIDB4MjIzQywgMHgwMjk5LCAweDIyM0QsIDB4MDJGRSwKLSAgICAweDIyNDMsIDB4MkY1OCwgMHgyMjUyLCAweDAyRkEsIDB4MjI2MCwgMHgwMkJBLCAweDIyNjEsIDB4MDJGOSwKLSAgICAweDIyNjYsIDB4MDJCRCwgMHgyMjY3LCAweDAyQkUsIDB4MjI2QSwgMHgwMkZCLCAweDIyNkIsIDB4MDJGQywKLSAgICAweDIyNzIsIDB4MkY1OSwgMHgyMjczLCAweDJGNUEsIDB4MjI4MiwgMHgwMkU5LCAweDIyODMsIDB4MDJFQSwKLSAgICAweDIyODYsIDB4MDJFNywgMHgyMjg3LCAweDAyRTgsIDB4MjI5NSwgMHgyRjlDLCAweDIyOTYsIDB4MkY5QSwKLSAgICAweDIyOTcsIDB4MkY5RCwgMHgyMjk4LCAweDJGOUIsIDB4MjI5RCwgMHgyRjlBLCAweDIyOUUsIDB4MkY5RSwKLSAgICAweDIyQTAsIDB4MkY5OSwgMHgyMkE1LCAweDAyRjUsIDB4MjJCRiwgMHgxRENFLCAweDIyRUUsIDB4MUVEOSwKLSAgICAweDIyRUYsIDB4MDI5QywgMHgyMzAwLCAweDJGOTgsIDB4MjMwNywgMHgyRkJCLCAweDIzMTIsIDB4MDJGNiwKLSAgICAweDI0NEEsIDB4MkY1NCwgMHgyNDYwLCAweDFEODMsIDB4MjQ2MSwgMHgxRDg0LCAweDI0NjIsIDB4MUQ4NSwKLSAgICAweDI0NjMsIDB4MUQ4NiwgMHgyNDY0LCAweDFEODcsIDB4MjQ2NSwgMHgxRDg4LCAweDI0NjYsIDB4MUQ4OSwKLSAgICAweDI0NjcsIDB4MUQ4QSwgMHgyNDY4LCAweDFEOEIsIDB4MjQ2OSwgMHgxRDhDLCAweDI0NkEsIDB4MUQ4RCwKLSAgICAweDI0NkIsIDB4MUQ4RSwgMHgyNDZDLCAweDFEOEYsIDB4MjQ2RCwgMHgxRDkwLCAweDI0NkUsIDB4MUQ5MSwKLSAgICAweDI0NkYsIDB4MUQ5MiwgMHgyNDcwLCAweDFEOTMsIDB4MjQ3MSwgMHgxRDk0LCAweDI0NzIsIDB4MUQ5NSwKLSAgICAweDI0NzMsIDB4MUQ5NiwgMHgyNDc0LCAweDFGODcsIDB4MjQ3NSwgMHgxRjg4LCAweDI0NzYsIDB4MUY4OSwKLSAgICAweDI0NzcsIDB4MUY4QSwgMHgyNDc4LCAweDFGOEIsIDB4MjQ3OSwgMHgxRjhDLCAweDI0N0EsIDB4MUY4RCwKLSAgICAweDI0N0IsIDB4MUY4RSwgMHgyNDdDLCAweDFGOEYsIDB4MjQ3RCwgMHgxRjkwLCAweDI0N0UsIDB4MUY5MSwKLSAgICAweDI0N0YsIDB4MUY5MiwgMHgyNDgwLCAweDFGOTMsIDB4MjQ4MSwgMHgxRjk0LCAweDI0ODIsIDB4MUY5NSwKLSAgICAweDI0ODMsIDB4MUY5NiwgMHgyNDg0LCAweDFGOTcsIDB4MjQ4NSwgMHgxRjk4LCAweDI0ODYsIDB4MUY5OSwKLSAgICAweDI0ODcsIDB4MUY5QSwgMHgyNDg4LCAweDFGN0UsIDB4MjQ4OSwgMHgxRjdGLCAweDI0OEEsIDB4MUY4MCwKLSAgICAweDI0OEIsIDB4MUY4MSwgMHgyNDhDLCAweDFGODIsIDB4MjQ4RCwgMHgxRjgzLCAweDI0OEUsIDB4MUY4NCwKLSAgICAweDI0OEYsIDB4MUY4NSwgMHgyNDkwLCAweDFGODYsIDB4MjQ5QywgMHgxRkIwLCAweDI0OUQsIDB4MUZCMSwKLSAgICAweDI0OUUsIDB4MUZCMiwgMHgyNDlGLCAweDFGQjMsIDB4MjRBMCwgMHgxRkI0LCAweDI0QTEsIDB4MUZCNSwKLSAgICAweDI0QTIsIDB4MUZCNiwgMHgyNEEzLCAweDFGQjcsIDB4MjRBNCwgMHgxRkI4LCAweDI0QTUsIDB4MUZCOSwKLSAgICAweDI0QTYsIDB4MUZCQSwgMHgyNEE3LCAweDFGQkIsIDB4MjRBOCwgMHgxRkJDLCAweDI0QTksIDB4MUZCRCwKLSAgICAweDI0QUEsIDB4MUZCRSwgMHgyNEFCLCAweDFGQkYsIDB4MjRBQywgMHgxRkMwLCAweDI0QUQsIDB4MUZDMSwKLSAgICAweDI0QUUsIDB4MUZDMiwgMHgyNEFGLCAweDFGQzMsIDB4MjRCMCwgMHgxRkM0LCAweDI0QjEsIDB4MUZDNSwKLSAgICAweDI0QjIsIDB4MUZDNiwgMHgyNEIzLCAweDFGQzcsIDB4MjRCNCwgMHgxRkM4LCAweDI0QjUsIDB4MUZDOSwKLSAgICAweDI0QjYsIDB4Mjg2MywgMHgyNEI3LCAweDI4NjQsIDB4MjRCOCwgMHgyODY1LCAweDI0QjksIDB4Mjg2NiwKLSAgICAweDI0QkEsIDB4Mjg2NywgMHgyNEJCLCAweDI4NjgsIDB4MjRCQywgMHgyODY5LCAweDI0QkQsIDB4Mjg2QSwKLSAgICAweDI0QkUsIDB4Mjg2QiwgMHgyNEJGLCAweDI4NkMsIDB4MjRDMCwgMHgyODZELCAweDI0QzEsIDB4Mjg2RSwKLSAgICAweDI0QzIsIDB4Mjg2RiwgMHgyNEMzLCAweDI4NzAsIDB4MjRDNCwgMHgyODcxLCAweDI0QzUsIDB4Mjg3MiwKLSAgICAweDI0QzYsIDB4Mjg3MywgMHgyNEM3LCAweDI4NzQsIDB4MjRDOCwgMHgyODc1LCAweDI0QzksIDB4Mjg3NiwKLSAgICAweDI0Q0EsIDB4Mjg3NywgMHgyNENCLCAweDI4NzgsIDB4MjRDQywgMHgyODc5LCAweDI0Q0QsIDB4Mjg3QSwKLSAgICAweDI0Q0UsIDB4Mjg3QiwgMHgyNENGLCAweDI4N0MsIDB4MjREMCwgMHgyODQ5LCAweDI0RDEsIDB4Mjg0QSwKLSAgICAweDI0RDIsIDB4Mjg0QiwgMHgyNEQzLCAweDI4NEMsIDB4MjRENCwgMHgyODRELCAweDI0RDUsIDB4Mjg0RSwKLSAgICAweDI0RDYsIDB4Mjg0RiwgMHgyNEQ3LCAweDI4NTAsIDB4MjREOCwgMHgyODUxLCAweDI0RDksIDB4Mjg1MiwKLSAgICAweDI0REEsIDB4Mjg1MywgMHgyNERCLCAweDI4NTQsIDB4MjREQywgMHgyODU1LCAweDI0REQsIDB4Mjg1NiwKLSAgICAweDI0REUsIDB4Mjg1NywgMHgyNERGLCAweDI4NTgsIDB4MjRFMCwgMHgyODU5LCAweDI0RTEsIDB4Mjg1QSwKLSAgICAweDI0RTIsIDB4Mjg1QiwgMHgyNEUzLCAweDI4NUMsIDB4MjRFNCwgMHgyODVELCAweDI0RTUsIDB4Mjg1RSwKLSAgICAweDI0RTYsIDB4Mjg1RiwgMHgyNEU3LCAweDI4NjAsIDB4MjRFOCwgMHgyODYxLCAweDI0RTksIDB4Mjg2MiwKLSAgICAweDI0RUEsIDB4MjAyMCwgMHgyNTAwLCAweDFEMzcsIDB4MjUwMSwgMHgxRDM4LCAweDI1MDIsIDB4MUQzOSwKLSAgICAweDI1MDMsIDB4MUQzQSwgMHgyNTA0LCAweDFEM0IsIDB4MjUwNSwgMHgxRDNDLCAweDI1MDYsIDB4MUQzRCwKLSAgICAweDI1MDcsIDB4MUQzRSwgMHgyNTA4LCAweDFEM0YsIDB4MjUwOSwgMHgxRDQwLCAweDI1MEEsIDB4MUQ0MSwKLSAgICAweDI1MEIsIDB4MUQ0MiwgMHgyNTBDLCAweDFENDMsIDB4MjUwRCwgMHgxRDQ0LCAweDI1MEUsIDB4MUQ0NSwKLSAgICAweDI1MEYsIDB4MUQ0NiwgMHgyNTEwLCAweDFENDcsIDB4MjUxMSwgMHgxRDQ4LCAweDI1MTIsIDB4MUQ0OSwKLSAgICAweDI1MTMsIDB4MUQ0QSwgMHgyNTE0LCAweDFENEIsIDB4MjUxNSwgMHgxRDRDLCAweDI1MTYsIDB4MUQ0RCwKLSAgICAweDI1MTcsIDB4MUQ0RSwgMHgyNTE4LCAweDFENEYsIDB4MjUxOSwgMHgxRDUwLCAweDI1MUEsIDB4MUQ1MSwKLSAgICAweDI1MUIsIDB4MUQ1MiwgMHgyNTFDLCAweDFENTMsIDB4MjUxRCwgMHgxRDU0LCAweDI1MUUsIDB4MUQ1NSwKLSAgICAweDI1MUYsIDB4MUQ1NiwgMHgyNTIwLCAweDFENTcsIDB4MjUyMSwgMHgxRDU4LCAweDI1MjIsIDB4MUQ1OSwKLSAgICAweDI1MjMsIDB4MUQ1QSwgMHgyNTI0LCAweDFENUIsIDB4MjUyNSwgMHgxRDVDLCAweDI1MjYsIDB4MUQ1RCwKLSAgICAweDI1MjcsIDB4MUQ1RSwgMHgyNTI4LCAweDFENUYsIDB4MjUyOSwgMHgxRDYwLCAweDI1MkEsIDB4MUQ2MSwKLSAgICAweDI1MkIsIDB4MUQ2MiwgMHgyNTJDLCAweDFENjMsIDB4MjUyRCwgMHgxRDY0LCAweDI1MkUsIDB4MUQ2NSwKLSAgICAweDI1MkYsIDB4MUQ2NiwgMHgyNTMwLCAweDFENjcsIDB4MjUzMSwgMHgxRDY4LCAweDI1MzIsIDB4MUQ2OSwKLSAgICAweDI1MzMsIDB4MUQ2QSwgMHgyNTM0LCAweDFENkIsIDB4MjUzNSwgMHgxRDZDLCAweDI1MzYsIDB4MUQ2RCwKLSAgICAweDI1MzcsIDB4MUQ2RSwgMHgyNTM4LCAweDFENkYsIDB4MjUzOSwgMHgxRDcwLCAweDI1M0EsIDB4MUQ3MSwKLSAgICAweDI1M0IsIDB4MUQ3MiwgMHgyNTNDLCAweDFENzMsIDB4MjUzRCwgMHgxRDc0LCAweDI1M0UsIDB4MUQ3NSwKLSAgICAweDI1M0YsIDB4MUQ3NiwgMHgyNTQwLCAweDFENzcsIDB4MjU0MSwgMHgxRDc4LCAweDI1NDIsIDB4MUQ3OSwKLSAgICAweDI1NDMsIDB4MUQ3QSwgMHgyNTQ0LCAweDFEN0IsIDB4MjU0NSwgMHgxRDdDLCAweDI1NDYsIDB4MUQ3RCwKLSAgICAweDI1NDcsIDB4MUQ3RSwgMHgyNTQ4LCAweDFEN0YsIDB4MjU0OSwgMHgxRDgwLCAweDI1NEEsIDB4MUQ4MSwKLSAgICAweDI1NEIsIDB4MUQ4MiwgMHgyNTUwLCAweDIwM0IsIDB4MjU1RSwgMHgyMDNDLCAweDI1NjEsIDB4MjAzRSwKLSAgICAweDI1NkEsIDB4MjAzRCwgMHgyNTZELCAweDIwMzcsIDB4MjU2RSwgMHgyMDM4LCAweDI1NkYsIDB4MjAzQSwKLSAgICAweDI1NzAsIDB4MjAzOSwgMHgyNTcxLCAweDIwNDUsIDB4MjU3MiwgMHgyMDQ2LCAweDI1NzMsIDB4MjA0NywKLSAgICAweDI1ODEsIDB4MjAyNiwgMHgyNTgyLCAweDIwMjcsIDB4MjU4MywgMHgyMDI4LCAweDI1ODQsIDB4MjAyOSwKLSAgICAweDI1ODUsIDB4MjAyQSwgMHgyNTg2LCAweDIwMkIsIDB4MjU4NywgMHgyMDJDLCAweDI1ODgsIDB4MjAyRCwKLSAgICAweDI1ODksIDB4MjAzNCwgMHgyNThBLCAweDIwMzMsIDB4MjU4QiwgMHgyMDMyLCAweDI1OEMsIDB4MjAzMSwKLSAgICAweDI1OEQsIDB4MjAzMCwgMHgyNThFLCAweDIwMkYsIDB4MjU4RiwgMHgyMDJFLCAweDI1OTQsIDB4MjAzNSwKLSAgICAweDI1OTUsIDB4MjAzNiwgMHgyNUEwLCAweDAyRDksIDB4MjVBMSwgMHgwMkQ4LCAweDI1QTIsIDB4MUY0RiwKLSAgICAweDI1QUEsIDB4MkZDRiwgMHgyNUFCLCAweDJGQ0QsIDB4MjVCMiwgMHgwMkRCLCAweDI1QjMsIDB4MDJEQSwKLSAgICAweDI1QjYsIDB4MkZBMywgMHgyNUI3LCAweDFGNEEsIDB4MjVCQywgMHgwMkRELCAweDI1QkQsIDB4MDJEQywKLSAgICAweDI1QzAsIDB4MkZBMiwgMHgyNUMxLCAweDFGNDksIDB4MjVDNiwgMHgwMkQ3LCAweDI1QzcsIDB4MDJENiwKLSAgICAweDI1QzksIDB4MjAxMiwgMHgyNUNCLCAweDAyRDMsIDB4MjVDQywgMHgyOTA2LCAweDI1Q0UsIDB4MDJENSwKLSAgICAweDI1Q0YsIDB4MDJENCwgMHgyNUUyLCAweDIwM0YsIDB4MjVFMywgMHgyMDQwLCAweDI1RTQsIDB4MjA0MiwKLSAgICAweDI1RTUsIDB4MjA0MSwgMHgyNUU2LCAweDJGREUsIDB4MjVFRiwgMHgwMzBCLCAweDI2MDAsIDB4MjAxNywKLSAgICAweDI2MDEsIDB4MjAxOCwgMHgyNjAyLCAweDIwMTksIDB4MjYwMywgMHgyMDFBLCAweDI2MDUsIDB4MDJEMiwKLSAgICAweDI2MDYsIDB4MDJEMSwgMHgyNjBFLCAweDFGNzgsIDB4MjYxMiwgMHgyRjk5LCAweDI2MUMsIDB4MjAxQywKLSAgICAweDI2MUQsIDB4MjAxRCwgMHgyNjFFLCAweDIwMUIsIDB4MjYxRiwgMHgyMDFFLCAweDI2NDAsIDB4MDJDMiwKLSAgICAweDI2NDIsIDB4MDJDMSwgMHgyNjYwLCAweDIwMTMsIDB4MjY2MSwgMHgxRjUxLCAweDI2NjIsIDB4MUY1MywKLSAgICAweDI2NjMsIDB4MjAxNSwgMHgyNjY0LCAweDFGNTIsIDB4MjY2NSwgMHgyMDE0LCAweDI2NjYsIDB4MjAxNiwKLSAgICAweDI2NjcsIDB4MUY1MCwgMHgyNjY4LCAweDJGNDIsIDB4MjY2OSwgMHgyRjQzLCAweDI2NkEsIDB4MDMwNywKLSAgICAweDI2NkMsIDB4MkY0NCwgMHgyNjZELCAweDAzMDYsIDB4MjY2RiwgMHgwMzA1LCAweDI3MDIsIDB4MkY5MCwKLSAgICAweDI3MUEsIDB4MkZEMSwgMHgyNzU2LCAweDJGRTMsIDB4Mjc3NiwgMHgyMDVFLCAweDI3NzcsIDB4MjA1RiwKLSAgICAweDI3NzgsIDB4MjA2MCwgMHgyNzc5LCAweDIwNjEsIDB4Mjc3QSwgMHgyMDYyLCAweDI3N0IsIDB4MjA2MywKLSAgICAweDI3N0MsIDB4MjA2NCwgMHgyNzdELCAweDIwNjUsIDB4Mjc3RSwgMHgyMDY2LCAweDI3QTEsIDB4MjAwRSwKLSAgICAweDJFODMsIDB4MzdFMSwgMHgyRTg1LCAweDM2MjAsIDB4MkU4NywgMHgzNzE5LCAweDJFODksIDB4MzgxNCwKLSAgICAweDJFOEIsIDB4MzcxRSwgMHgyRThDLCAweDM2MDksIDB4MkU4RCwgMHgzNjBBLCAweDJFOEUsIDB4MTA3MSwKLSAgICAweDJFOEYsIDB4Mzg4QywgMHgyRTkwLCAweDEyMjYsIDB4MkU5MiwgMHgwRUIyLCAweDJFOTMsIDB4MTI4MywKLSAgICAweDJFOTQsIDB4MTJBQiwgMHgyRTk1LCAweDNDMUYsIDB4MkU5NiwgMHgzOEMyLCAweDJFOTcsIDB4MzYxQywKLSAgICAweDJFOTgsIDB4MzhFMSwgMHgyRTk5LCAweDEzQzMsIDB4MkU5QiwgMHgxM0UxLCAweDJFOUYsIDB4MEUzQywKLSAgICAweDJFQTAsIDB4MEVCRCwgMHgyRUExLCAweDM5NjEsIDB4MkVBMiwgMHgzOTYyLCAweDJFQTMsIDB4Mzk5RCwKLSAgICAweDJFQTQsIDB4M0MyNiwgMHgyRUE2LCAweDM3NEQsIDB4MkVBOCwgMHgzOUJDLCAweDJFQTksIDB4MzVBMSwKLSAgICAweDJFQUEsIDB4MzZBQiwgMHgyRUFCLCAweDNBOTcsIDB4MkVBQywgMHgwOEQ0LCAweDJFQUQsIDB4M0EzOSwKLSAgICAweDJFQUUsIDB4MzY2MiwgMHgyRUIxLCAweDNBOTgsIDB4MkVCMiwgMHgzQTk3LCAweDJFQjMsIDB4Mzc2RCwKLSAgICAweDJFQjcsIDB4MzZGRSwgMHgyRUI5LCAweDM3MTMsIDB4MkVCQywgMHgzNUIzLCAweDJFQkQsIDB4MzU0RSwKLSAgICAweDJFQkUsIDB4Mzc3NSwgMHgyRUJGLCAweDM3NzYsIDB4MkVDMCwgMHgzNzc3LCAweDJFQzEsIDB4MDc4QiwKLSAgICAweDJFQzIsIDB4M0IwQSwgMHgyRUMzLCAweDM2MkUsIDB4MkVDNCwgMHgwQTYyLCAweDJFQzYsIDB4MzU3MiwKLSAgICAweDJFQ0EsIDB4MzY0QSwgMHgyRUNDLCAweDNDMkIsIDB4MkVDRCwgMHgzQjUwLCAweDJFQ0YsIDB4M0I5RSwKLSAgICAweDJFRDEsIDB4MEJENSwgMHgyRUQyLCAweDNCOTcsIDB4MkVENiwgMHgzQjlFLCAweDJFRDcsIDB4MzU0RCwKLSAgICAweDJFRDgsIDB4MEE2OCwgMHgyRURELCAweDM2MTcsIDB4MkVERSwgMHgzNjE5LCAweDJFREYsIDB4MzYxOCwKLSAgICAweDJFRTQsIDB4MDY0RSwgMHgyRUU4LCAweDBEMzQsIDB4MkVFOSwgMHgwNTJCLCAweDJFRUIsIDB4MEE2QSwKLSAgICAweDJFRUQsIDB4MDhDMywgMHgyRUVGLCAweDBGN0QsIDB4MkVGMiwgMHgwNjRGLCAweDJGMDAsIDB4MDRCMCwKLSAgICAweDJGMDEsIDB4MjBCMywgMHgyRjAyLCAweDBGRkYsIDB4MkYwMywgMHgxMDAxLCAweDJGMDQsIDB4MDUzNSwKLSAgICAweDJGMDUsIDB4MTAwNiwgMHgyRjA2LCAweDBDQ0IsIDB4MkYwNywgMHgxMDBFLCAweDJGMDgsIDB4MEExMywKLSAgICAweDJGMDksIDB4MTA3MCwgMHgyRjBBLCAweDBDRDYsIDB4MkYwQiwgMHgwRDQwLCAweDJGMEMsIDB4MTA3QiwKLSAgICAweDJGMEQsIDB4MTA4MywgMHgyRjBFLCAweDEwODksIDB4MkYwRiwgMHgxMDkzLCAweDJGMTAsIDB4MTA5OCwKLSAgICAweDJGMTEsIDB4MEM1QiwgMHgyRjEyLCAweDBGOTcsIDB4MkYxMywgMHgxMEM2LCAweDJGMTQsIDB4MTBDRCwKLSAgICAweDJGMTUsIDB4MTBDRSwgMHgyRjE2LCAweDEwRDMsIDB4MkYxNywgMHgwOTQ3LCAweDJGMTgsIDB4MEU3QywKLSAgICAweDJGMTksIDB4MTBEQywgMHgyRjFBLCAweDEwRTEsIDB4MkYxQiwgMHgxMEU4LCAweDJGMUMsIDB4MEVBMiwKLSAgICAweDJGMUQsIDB4MDdCMSwgMHgyRjFFLCAweDExNkIsIDB4MkYxRiwgMHgwQzU0LCAweDJGMjAsIDB4MDg5QywKLSAgICAweDJGMjEsIDB4MTFCQSwgMHgyRjIyLCAweDExQkIsIDB4MkYyMywgMHgwRjI2LCAweDJGMjQsIDB4MEI0NywKLSAgICAweDJGMjUsIDB4MDk4MSwgMHgyRjI2LCAweDA4QTAsIDB4MkYyNywgMHgxMjBFLCAweDJGMjgsIDB4MEE0NywKLSAgICAweDJGMjksIDB4MDk5NiwgMHgyRjJBLCAweDEyMjYsIDB4MkYyQiwgMHgxMjI4LCAweDJGMkMsIDB4MTIzMiwKLSAgICAweDJGMkQsIDB4MDg4MSwgMHgyRjJFLCAweDEyNkMsIDB4MkYyRiwgMHgwN0JCLCAweDJGMzAsIDB4MDc3RSwKLSAgICAweDJGMzEsIDB4MDZDQSwgMHgyRjMyLCAweDA1RUYsIDB4MkYzMywgMHgxMjgzLCAweDJGMzQsIDB4MTI4NSwKLSAgICAweDJGMzUsIDB4MTI5OSwgMHgyRjM2LCAweDEyOUIsIDB4MkYzNywgMHgxMkEwLCAweDJGMzgsIDB4MDY3NywKLSAgICAweDJGMzksIDB4MzhCOSwgMHgyRjNBLCAweDEyQUYsIDB4MkYzQiwgMHgxMkIxLCAweDJGM0MsIDB4MDlGQSwKLSAgICAweDJGM0QsIDB4MTM0MiwgMHgyRjNFLCAweDA3ODEsIDB4MkYzRiwgMHgwOTE2LCAweDJGNDAsIDB4MDhBNywKLSAgICAweDJGNDEsIDB4MTNDMiwgMHgyRjQyLCAweDBFMDgsIDB4MkY0MywgMHgwQzQ3LCAweDJGNDQsIDB4MDZDQywKLSAgICAweDJGNDUsIDB4MEU0RCwgMHgyRjQ2LCAweDEzRTAsIDB4MkY0NywgMHgwQ0Q0LCAweDJGNDgsIDB4MTQwQywKLSAgICAweDJGNDksIDB4MDc0NCwgMHgyRjRBLCAweDBFRTYsIDB4MkY0QiwgMHgwNzNELCAweDJGNEMsIDB4MDhBRCwKLSAgICAweDJGNEQsIDB4MTRFNSwgMHgyRjRFLCAweDE0RjQsIDB4MkY0RiwgMHgxNEY4LCAweDJGNTAsIDB4MEQ3QSwKLSAgICAweDJGNTEsIDB4MEVERiwgMHgyRjUyLCAweDA4QUYsIDB4MkY1MywgMHgxNTAyLCAweDJGNTQsIDB4MEEyQiwKLSAgICAweDJGNTUsIDB4MDU1MCwgMHgyRjU2LCAweDBCRkEsIDB4MkY1NywgMHgwREQ1LCAweDJGNTgsIDB4MTVFNCwKLSAgICAweDJGNTksIDB4MTVFNiwgMHgyRjVBLCAweDBFMjIsIDB4MkY1QiwgMHgwNTY3LCAweDJGNUMsIDB4MDY4NywKLSAgICAweDJGNUQsIDB4MDc1OCwgMHgyRjVFLCAweDA3NzAsIDB4MkY1RiwgMHgwNkM0LCAweDJGNjAsIDB4MDRERCwKLSAgICAweDJGNjEsIDB4MDVFMCwgMHgyRjYyLCAweDA2MDEsIDB4MkY2MywgMHgwQTVDLCAweDJGNjQsIDB4MEYzQiwKLSAgICAweDJGNjUsIDB4MEMzRSwgMHgyRjY2LCAweDBEOTcsIDB4MkY2NywgMHgzQTAwLCAweDJGNjgsIDB4MTY5NywKLSAgICAweDJGNjksIDB4MEQyOCwgMHgyRjZBLCAweDBEN0QsIDB4MkY2QiwgMHgwODdDLCAweDJGNkMsIDB4MEVFOCwKLSAgICAweDJGNkQsIDB4MEVDMywgMHgyRjZFLCAweDBFRkMsIDB4MkY2RiwgMHgwQTc0LCAweDJGNzAsIDB4MDhENCwKLSAgICAweDJGNzEsIDB4M0E0MSwgMHgyRjcyLCAweDA1NTMsIDB4MkY3MywgMHgwNzQwLCAweDJGNzQsIDB4MEY3MSwKLSAgICAweDJGNzUsIDB4MEI5QiwgMHgyRjc2LCAweDBFMTYsIDB4MkY3NywgMHgwOEIzLCAweDJGNzgsIDB4MDYwOCwKLSAgICAweDJGNzksIDB4MTgxMywgMHgyRjdBLCAweDBGM0QsIDB4MkY3QiwgMHgwNENCLCAweDJGN0MsIDB4MEZERCwKLSAgICAweDJGN0QsIDB4MDhENSwgMHgyRjdFLCAweDE4M0QsIDB4MkY3RiwgMHgwOEQ2LCAweDJGODAsIDB4MTg1MywKLSAgICAweDJGODEsIDB4MENEMSwgMHgyRjgyLCAweDBBMDksIDB4MkY4MywgMHgwOEQ3LCAweDJGODQsIDB4MDhCOCwKLSAgICAweDJGODUsIDB4MDREMywgMHgyRjg2LCAweDBBODksIDB4MkY4NywgMHgwQUE2LCAweDJGODgsIDB4MDkzOCwKLSAgICAweDJGODksIDB4MDgyMSwgMHgyRjhBLCAweDA5RUQsIDB4MkY4QiwgMHgxOEIyLCAweDJGOEMsIDB4MTk0RiwKLSAgICAweDJGOEQsIDB4MEJBQywgMHgyRjhFLCAweDA3NDIsIDB4MkY4RiwgMHgwN0U2LCAweDJGOTAsIDB4MDRBNSwKLSAgICAweDJGOTEsIDB4MTlFQiwgMHgyRjkyLCAweDA3NUYsIDB4MkY5MywgMHgwNUFGLCAweDJGOTQsIDB4MDc3NCwKLSAgICAweDJGOTUsIDB4MEI2OSwgMHgyRjk2LCAweDBDN0UsIDB4MkY5NywgMHgxQTU2LCAweDJGOTgsIDB4MUE1OSwKLSAgICAweDJGOTksIDB4MDU4QiwgMHgyRjlBLCAweDBBN0EsIDB4MkY5QiwgMHgwQUY4LCAweDJGOUMsIDB4MEIwRCwKLSAgICAweDJGOUQsIDB4MEEwRSwgMHgyRjlFLCAweDA5MDIsIDB4MkY5RiwgMHgwQTBGLCAweDJGQTAsIDB4MEI2MiwKLSAgICAweDJGQTEsIDB4M0I0RiwgMHgyRkEyLCAweDBGMjIsIDB4MkZBMywgMHgwQ0FCLCAweDJGQTQsIDB4MEQ2NCwKLSAgICAweDJGQTUsIDB4MEY2QywgMHgyRkE2LCAweDA2REEsIDB4MkZBNywgMHgwQkQ1LCAweDJGQTgsIDB4MEVGMywKLSAgICAweDJGQTksIDB4MERERSwgMHgyRkFBLCAweDFCQzksIDB4MkZBQiwgMHgxQkNCLCAweDJGQUMsIDB4MDRDRCwKLSAgICAweDJGQUQsIDB4MjFGNywgMHgyRkFFLCAweDBEODcsIDB4MkZBRiwgMHgwRUQ4LCAweDJGQjAsIDB4MDVCNSwKLSAgICAweDJGQjEsIDB4MUMwMywgMHgyRkIyLCAweDFDMDUsIDB4MkZCMywgMHgwNTNCLCAweDJGQjQsIDB4MEUxNywKLSAgICAweDJGQjUsIDB4MERFOSwgMHgyRkI2LCAweDBEODgsIDB4MkZCNywgMHgwOUVGLCAweDJGQjgsIDB4MDkxRiwKLSAgICAweDJGQjksIDB4MDdGMywgMHgyRkJBLCAweDBEMDUsIDB4MkZCQiwgMHgwODBFLCAweDJGQkMsIDB4MDdGNCwKLSAgICAweDJGQkQsIDB4MUM2QywgMHgyRkJFLCAweDFDN0QsIDB4MkZCRiwgMHgxQzgzLCAweDJGQzAsIDB4MUM4NCwKLSAgICAweDJGQzEsIDB4MDY0RSwgMHgyRkMyLCAweDA2OTUsIDB4MkZDMywgMHgwQkQ3LCAweDJGQzQsIDB4MUNGNiwKLSAgICAweDJGQzUsIDB4MDhEQiwgMHgyRkM2LCAweDFEMDEsIDB4MkZDNywgMHgwRTkxLCAweDJGQzgsIDB4MzQwQiwKLSAgICAweDJGQzksIDB4MDY2QSwgMHgyRkNBLCAweDA4MDcsIDB4MkZDQiwgMHgxRDE2LCAweDJGQ0MsIDB4MUQxOSwKLSAgICAweDJGQ0QsIDB4MEMxRSwgMHgyRkNFLCAweDA3OTEsIDB4MkZDRiwgMHgwQUNGLCAweDJGRDAsIDB4MEQ5MywKLSAgICAweDJGRDEsIDB4MUQyMSwgMHgyRkQyLCAweDFEMjIsIDB4MkZEMywgMHgwRjdFLCAweDJGRDQsIDB4MUQzMCwKLSAgICAweDJGRDUsIDB4MUQzMSwgMHgzMDAwLCAweDAyNzksIDB4MzAwMSwgMHgwMjdBLCAweDMwMDIsIDB4MDI3QiwKLSAgICAweDMwMDMsIDB4MDI4RiwgMHgzMDA0LCAweDIwNzQsIDB4MzAwNSwgMHgwMjkxLCAweDMwMDYsIDB4MDI5MiwKLSAgICAweDMwMDcsIDB4MDI5MywgMHgzMDA4LCAweDAyQUEsIDB4MzAwOSwgMHgwMkFCLCAweDMwMEEsIDB4MDJBQywKLSAgICAweDMwMEIsIDB4MDJBRCwgMHgzMDBDLCAweDAyQUUsIDB4MzAwRCwgMHgwMkFGLCAweDMwMEUsIDB4MDJCMCwKLSAgICAweDMwMEYsIDB4MDJCMSwgMHgzMDEwLCAweDAyQjIsIDB4MzAxMSwgMHgwMkIzLCAweDMwMTIsIDB4MDJERiwKLSAgICAweDMwMTMsIDB4MDJFNCwgMHgzMDE0LCAweDAyQTQsIDB4MzAxNSwgMHgwMkE1LCAweDMwMUMsIDB4MDI5OSwKLSAgICAweDMwMUQsIDB4MURCOCwgMHgzMDFGLCAweDFEQjksIDB4MzAyMCwgMHgxRjdBLCAweDMwMzAsIDB4MkZCQSwKLSAgICAweDMwMzMsIDB4MkY0QywgMHgzMDM0LCAweDJGNEQsIDB4MzAzNSwgMHgyRjRFLCAweDMwMzYsIDB4MUY3OSwKLSAgICAweDMwNDEsIDB4MDM0QSwgMHgzMDQyLCAweDAzNEIsIDB4MzA0MywgMHgwMzRDLCAweDMwNDQsIDB4MDM0RCwKLSAgICAweDMwNDUsIDB4MDM0RSwgMHgzMDQ2LCAweDAzNEYsIDB4MzA0NywgMHgwMzUwLCAweDMwNDgsIDB4MDM1MSwKLSAgICAweDMwNDksIDB4MDM1MiwgMHgzMDRBLCAweDAzNTMsIDB4MzA0QiwgMHgwMzU0LCAweDMwNEMsIDB4MDM1NSwKLSAgICAweDMwNEQsIDB4MDM1NiwgMHgzMDRFLCAweDAzNTcsIDB4MzA0RiwgMHgwMzU4LCAweDMwNTAsIDB4MDM1OSwKLSAgICAweDMwNTEsIDB4MDM1QSwgMHgzMDUyLCAweDAzNUIsIDB4MzA1MywgMHgwMzVDLCAweDMwNTQsIDB4MDM1RCwKLSAgICAweDMwNTUsIDB4MDM1RSwgMHgzMDU2LCAweDAzNUYsIDB4MzA1NywgMHgwMzYwLCAweDMwNTgsIDB4MDM2MSwKLSAgICAweDMwNTksIDB4MDM2MiwgMHgzMDVBLCAweDAzNjMsIDB4MzA1QiwgMHgwMzY0LCAweDMwNUMsIDB4MDM2NSwKLSAgICAweDMwNUQsIDB4MDM2NiwgMHgzMDVFLCAweDAzNjcsIDB4MzA1RiwgMHgwMzY4LCAweDMwNjAsIDB4MDM2OSwKLSAgICAweDMwNjEsIDB4MDM2QSwgMHgzMDYyLCAweDAzNkIsIDB4MzA2MywgMHgwMzZDLCAweDMwNjQsIDB4MDM2RCwKLSAgICAweDMwNjUsIDB4MDM2RSwgMHgzMDY2LCAweDAzNkYsIDB4MzA2NywgMHgwMzcwLCAweDMwNjgsIDB4MDM3MSwKLSAgICAweDMwNjksIDB4MDM3MiwgMHgzMDZBLCAweDAzNzMsIDB4MzA2QiwgMHgwMzc0LCAweDMwNkMsIDB4MDM3NSwKLSAgICAweDMwNkQsIDB4MDM3NiwgMHgzMDZFLCAweDAzNzcsIDB4MzA2RiwgMHgwMzc4LCAweDMwNzAsIDB4MDM3OSwKLSAgICAweDMwNzEsIDB4MDM3QSwgMHgzMDcyLCAweDAzN0IsIDB4MzA3MywgMHgwMzdDLCAweDMwNzQsIDB4MDM3RCwKLSAgICAweDMwNzUsIDB4MDM3RSwgMHgzMDc2LCAweDAzN0YsIDB4MzA3NywgMHgwMzgwLCAweDMwNzgsIDB4MDM4MSwKLSAgICAweDMwNzksIDB4MDM4MiwgMHgzMDdBLCAweDAzODMsIDB4MzA3QiwgMHgwMzg0LCAweDMwN0MsIDB4MDM4NSwKLSAgICAweDMwN0QsIDB4MDM4NiwgMHgzMDdFLCAweDAzODcsIDB4MzA3RiwgMHgwMzg4LCAweDMwODAsIDB4MDM4OSwKLSAgICAweDMwODEsIDB4MDM4QSwgMHgzMDgyLCAweDAzOEIsIDB4MzA4MywgMHgwMzhDLCAweDMwODQsIDB4MDM4RCwKLSAgICAweDMwODUsIDB4MDM4RSwgMHgzMDg2LCAweDAzOEYsIDB4MzA4NywgMHgwMzkwLCAweDMwODgsIDB4MDM5MSwKLSAgICAweDMwODksIDB4MDM5MiwgMHgzMDhBLCAweDAzOTMsIDB4MzA4QiwgMHgwMzk0LCAweDMwOEMsIDB4MDM5NSwKLSAgICAweDMwOEQsIDB4MDM5NiwgMHgzMDhFLCAweDAzOTcsIDB4MzA4RiwgMHgwMzk4LCAweDMwOTAsIDB4MDM5OSwKLSAgICAweDMwOTEsIDB4MDM5QSwgMHgzMDkyLCAweDAzOUIsIDB4MzA5MywgMHgwMzlDLCAweDMwOTQsIDB4MUYxNiwKLSAgICAweDMwOUIsIDB4MDI4MywgMHgzMDlDLCAweDAyODQsIDB4MzA5RCwgMHgwMjhELCAweDMwOUUsIDB4MDI4RSwKLSAgICAweDMwQTEsIDB4MDM5RCwgMHgzMEEyLCAweDAzOUUsIDB4MzBBMywgMHgwMzlGLCAweDMwQTQsIDB4MDNBMCwKLSAgICAweDMwQTUsIDB4MDNBMSwgMHgzMEE2LCAweDAzQTIsIDB4MzBBNywgMHgwM0EzLCAweDMwQTgsIDB4MDNBNCwKLSAgICAweDMwQTksIDB4MDNBNSwgMHgzMEFBLCAweDAzQTYsIDB4MzBBQiwgMHgwM0E3LCAweDMwQUMsIDB4MDNBOCwKLSAgICAweDMwQUQsIDB4MDNBOSwgMHgzMEFFLCAweDAzQUEsIDB4MzBBRiwgMHgwM0FCLCAweDMwQjAsIDB4MDNBQywKLSAgICAweDMwQjEsIDB4MDNBRCwgMHgzMEIyLCAweDAzQUUsIDB4MzBCMywgMHgwM0FGLCAweDMwQjQsIDB4MDNCMCwKLSAgICAweDMwQjUsIDB4MDNCMSwgMHgzMEI2LCAweDAzQjIsIDB4MzBCNywgMHgwM0IzLCAweDMwQjgsIDB4MDNCNCwKLSAgICAweDMwQjksIDB4MDNCNSwgMHgzMEJBLCAweDAzQjYsIDB4MzBCQiwgMHgwM0I3LCAweDMwQkMsIDB4MDNCOCwKLSAgICAweDMwQkQsIDB4MDNCOSwgMHgzMEJFLCAweDAzQkEsIDB4MzBCRiwgMHgwM0JCLCAweDMwQzAsIDB4MDNCQywKLSAgICAweDMwQzEsIDB4MDNCRCwgMHgzMEMyLCAweDAzQkUsIDB4MzBDMywgMHgwM0JGLCAweDMwQzQsIDB4MDNDMCwKLSAgICAweDMwQzUsIDB4MDNDMSwgMHgzMEM2LCAweDAzQzIsIDB4MzBDNywgMHgwM0MzLCAweDMwQzgsIDB4MDNDNCwKLSAgICAweDMwQzksIDB4MDNDNSwgMHgzMENBLCAweDAzQzYsIDB4MzBDQiwgMHgwM0M3LCAweDMwQ0MsIDB4MDNDOCwKLSAgICAweDMwQ0QsIDB4MDNDOSwgMHgzMENFLCAweDAzQ0EsIDB4MzBDRiwgMHgwM0NCLCAweDMwRDAsIDB4MDNDQywKLSAgICAweDMwRDEsIDB4MDNDRCwgMHgzMEQyLCAweDAzQ0UsIDB4MzBEMywgMHgwM0NGLCAweDMwRDQsIDB4MDNEMCwKLSAgICAweDMwRDUsIDB4MDNEMSwgMHgzMEQ2LCAweDAzRDIsIDB4MzBENywgMHgwM0QzLCAweDMwRDgsIDB4MDNENCwKLSAgICAweDMwRDksIDB4MDNENSwgMHgzMERBLCAweDAzRDYsIDB4MzBEQiwgMHgwM0Q3LCAweDMwREMsIDB4MDNEOCwKLSAgICAweDMwREQsIDB4MDNEOSwgMHgzMERFLCAweDAzREEsIDB4MzBERiwgMHgwM0RCLCAweDMwRTAsIDB4MDNEQywKLSAgICAweDMwRTEsIDB4MDNERCwgMHgzMEUyLCAweDAzREUsIDB4MzBFMywgMHgwM0RGLCAweDMwRTQsIDB4MDNFMCwKLSAgICAweDMwRTUsIDB4MDNFMSwgMHgzMEU2LCAweDAzRTIsIDB4MzBFNywgMHgwM0UzLCAweDMwRTgsIDB4MDNFNCwKLSAgICAweDMwRTksIDB4MDNFNSwgMHgzMEVBLCAweDAzRTYsIDB4MzBFQiwgMHgwM0U3LCAweDMwRUMsIDB4MDNFOCwKLSAgICAweDMwRUQsIDB4MDNFOSwgMHgzMEVFLCAweDAzRUEsIDB4MzBFRiwgMHgwM0VCLCAweDMwRjAsIDB4MDNFQywKLSAgICAweDMwRjEsIDB4MDNFRCwgMHgzMEYyLCAweDAzRUUsIDB4MzBGMywgMHgwM0VGLCAweDMwRjQsIDB4MDNGMCwKLSAgICAweDMwRjUsIDB4MDNGMSwgMHgzMEY2LCAweDAzRjIsIDB4MzBGNywgMHgyMDc5LCAweDMwRjgsIDB4MjA3QSwKLSAgICAweDMwRjksIDB4MjA3QiwgMHgzMEZBLCAweDIwN0MsIDB4MzBGQiwgMHgwMjdFLCAweDMwRkMsIDB4MDI5NCwKLSAgICAweDMwRkQsIDB4MDI4QiwgMHgzMEZFLCAweDAyOEMsIDB4MzIyMCwgMHgyNzhFLCAweDMyMjEsIDB4Mjc4RiwKLSAgICAweDMyMjIsIDB4Mjc5MCwgMHgzMjIzLCAweDI3OTEsIDB4MzIyNCwgMHgyNzkyLCAweDMyMjUsIDB4Mjc5MywKLSAgICAweDMyMjYsIDB4Mjc5NCwgMHgzMjI3LCAweDI3OTUsIDB4MzIyOCwgMHgyNzk2LCAweDMyMjksIDB4Mjc5NywKLSAgICAweDMyMkEsIDB4MjAwNiwgMHgzMjJCLCAweDIwMDcsIDB4MzIyQywgMHgyMDA4LCAweDMyMkQsIDB4MjAwOSwKLSAgICAweDMyMkUsIDB4MjAwQSwgMHgzMjJGLCAweDIwMEIsIDB4MzIzMCwgMHgyMDA1LCAweDMyMzEsIDB4MURDMiwKLSAgICAweDMyMzIsIDB4MURDMywgMHgzMjMzLCAweDFGQ0YsIDB4MzIzNCwgMHgxRkNELCAweDMyMzUsIDB4MUZENCwKLSAgICAweDMyMzYsIDB4MUZEMywgMHgzMjM3LCAweDIwMEMsIDB4MzIzOCwgMHgxRkNFLCAweDMyMzksIDB4MURDNCwKLSAgICAweDMyM0EsIDB4MUZENywgMHgzMjNCLCAweDFGRDUsIDB4MzIzQywgMHgxRkQwLCAweDMyM0QsIDB4MUZDQiwKLSAgICAweDMyM0UsIDB4MUZEMiwgMHgzMjNGLCAweDFGQ0MsIDB4MzI0MCwgMHgxRkQ2LCAweDMyNDEsIDB4MjAwRCwKLSAgICAweDMyNDIsIDB4MUZEMSwgMHgzMjQzLCAweDFGQ0EsIDB4MzI4MCwgMHgyOERELCAweDMyODEsIDB4MjhERSwKLSAgICAweDMyODIsIDB4MjhERiwgMHgzMjgzLCAweDI4RTAsIDB4MzI4NCwgMHgyOEUxLCAweDMyODUsIDB4MjhFMiwKLSAgICAweDMyODYsIDB4MjhFMywgMHgzMjg3LCAweDI4RTQsIDB4MzI4OCwgMHgyOEU1LCAweDMyODksIDB4MjhFNiwKLSAgICAweDMyOEEsIDB4MjhFOCwgMHgzMjhCLCAweDI4RTksIDB4MzI4QywgMHgyOEVBLCAweDMyOEQsIDB4MjhFQiwKLSAgICAweDMyOEUsIDB4MjhFQywgMHgzMjhGLCAweDI4RUQsIDB4MzI5MCwgMHgyOEU3LCAweDMyOTEsIDB4MUZFMSwKLSAgICAweDMyOTIsIDB4MUZFMCwgMHgzMjkzLCAweDFGRTIsIDB4MzI5NCwgMHgxRkRDLCAweDMyOTUsIDB4MjhGRiwKLSAgICAweDMyOTYsIDB4MUZFNSwgMHgzMjk3LCAweDI4RkMsIDB4MzI5OCwgMHgxRkRFLCAweDMyOTksIDB4MjAxRiwKLSAgICAweDMyOUEsIDB4MjhGOSwgMHgzMjlCLCAweDI4RjgsIDB4MzI5QywgMHgyOEZFLCAweDMyOUQsIDB4MjA3RiwKLSAgICAweDMyOUUsIDB4MUZGRiwgMHgzMjlGLCAweDI4RUYsIDB4MzJBMCwgMHgyOEY2LCAweDMyQTEsIDB4MjhGNywKLSAgICAweDMyQTIsIDB4MjhGQiwgMHgzMkEzLCAweDI4RkEsIDB4MzJBNCwgMHgxREJELCAweDMyQTUsIDB4MURCRSwKLSAgICAweDMyQTYsIDB4MURCRiwgMHgzMkE3LCAweDFEQzAsIDB4MzJBOCwgMHgxREMxLCAweDMyQTksIDB4MUZEQSwKLSAgICAweDMyQUEsIDB4MUZERCwgMHgzMkFCLCAweDFGREYsIDB4MzJBQywgMHgxRkUzLCAweDMyQUQsIDB4MUZEOSwKLSAgICAweDMyQUUsIDB4MUZFNCwgMHgzMkFGLCAweDFGREIsIDB4MzJCMCwgMHgxRkQ4LCAweDMyRDAsIDB4MjhBRCwKLSAgICAweDMyRDEsIDB4MjhBRSwgMHgzMkQyLCAweDI4QUYsIDB4MzJEMywgMHgyOEIwLCAweDMyRDQsIDB4MjhCMSwKLSAgICAweDMyRDUsIDB4MjhCMiwgMHgzMkQ2LCAweDI4QjMsIDB4MzJENywgMHgyOEI0LCAweDMyRDgsIDB4MjhCNSwKLSAgICAweDMyRDksIDB4MjhCNiwgMHgzMkRBLCAweDI4QjcsIDB4MzJEQiwgMHgyOEI4LCAweDMyREMsIDB4MjhCOSwKLSAgICAweDMyREQsIDB4MjhCQSwgMHgzMkRFLCAweDI4QkIsIDB4MzJERiwgMHgyOEJDLCAweDMyRTAsIDB4MjhCRCwKLSAgICAweDMyRTEsIDB4MjhCRSwgMHgzMkUyLCAweDI4QkYsIDB4MzJFMywgMHgyOEMwLCAweDMyRTQsIDB4MjhDMSwKLSAgICAweDMyRTUsIDB4MjhDMiwgMHgzMkU2LCAweDI4QzMsIDB4MzJFNywgMHgyOEM0LCAweDMyRTgsIDB4MjhDNSwKLSAgICAweDMyRTksIDB4MjhDNiwgMHgzMkVBLCAweDI4QzcsIDB4MzJFQiwgMHgyOEM4LCAweDMyRUMsIDB4MjhDOSwKLSAgICAweDMyRUQsIDB4MjhDQSwgMHgzMkVFLCAweDI4Q0IsIDB4MzJFRiwgMHgyOENDLCAweDMyRjAsIDB4MjhDRCwKLSAgICAweDMyRjEsIDB4MjhDRSwgMHgzMkYyLCAweDI4Q0YsIDB4MzJGMywgMHgyOEQwLCAweDMyRjQsIDB4MjhEMSwKLSAgICAweDMyRjUsIDB4MjhEMiwgMHgzMkY2LCAweDI4RDMsIDB4MzJGNywgMHgyOEQ0LCAweDMyRjgsIDB4MjhENSwKLSAgICAweDMyRjksIDB4MjhENiwgMHgzMkZBLCAweDI4RDcsIDB4MzJGQiwgMHgyOEQ4LCAweDMyRkMsIDB4MjhEOSwKLSAgICAweDMyRkQsIDB4MjhEQSwgMHgzMkZFLCAweDI4REIsIDB4MzMwMCwgMHgxRjcwLCAweDMzMDEsIDB4MkU2MiwKLSAgICAweDMzMDIsIDB4MkU2MywgMHgzMzAzLCAweDFGNkEsIDB4MzMwNCwgMHgyRTY0LCAweDMzMDUsIDB4MUZGNywKLSAgICAweDMzMDYsIDB4MkU2NSwgMHgzMzA3LCAweDJFNjksIDB4MzMwOCwgMHgyRTY3LCAweDMzMDksIDB4MkU2QywKLSAgICAweDMzMEEsIDB4MkU2QSwgMHgzMzBCLCAweDJFNkUsIDB4MzMwQywgMHgyRTcwLCAweDMzMEQsIDB4MURBQiwKLSAgICAweDMzMEUsIDB4MkU3MSwgMHgzMzBGLCAweDJFNzIsIDB4MzMxMCwgMHgyRTczLCAweDMzMTEsIDB4MkU3NCwKLSAgICAweDMzMTIsIDB4MkU3NSwgMHgzMzEzLCAweDJFNzYsIDB4MzMxNCwgMHgxREEyLCAweDMzMTUsIDB4MUY2OSwKLSAgICAweDMzMTYsIDB4MUY2NywgMHgzMzE3LCAweDJFNzgsIDB4MzMxOCwgMHgxRjY4LCAweDMzMTksIDB4MkU3QSwKLSAgICAweDMzMUEsIDB4MkU3QywgMHgzMzFCLCAweDJFN0QsIDB4MzMxQywgMHgyRTdFLCAweDMzMUQsIDB4MkU3RiwKLSAgICAweDMzMUUsIDB4MUY3MywgMHgzMzFGLCAweDJFODAsIDB4MzMyMCwgMHgyRTgxLCAweDMzMjEsIDB4MkU4MiwKLSAgICAweDMzMjIsIDB4MUY2NiwgMHgzMzIzLCAweDFGNkIsIDB4MzMyNCwgMHgyRTgzLCAweDMzMjUsIDB4MkU4NSwKLSAgICAweDMzMjYsIDB4MURBQywgMHgzMzI3LCAweDFEQTYsIDB4MzMyOCwgMHgyRTg4LCAweDMzMjksIDB4MkU4OSwKLSAgICAweDMzMkEsIDB4MUY3NCwgMHgzMzJCLCAweDFEQUUsIDB4MzMyRCwgMHgyRThCLCAweDMzMkUsIDB4MkU4RSwKLSAgICAweDMzMkYsIDB4MkU4RiwgMHgzMzMwLCAweDJFOTAsIDB4MzMzMSwgMHgxRjcxLCAweDMzMzIsIDB4MkU5MSwKLSAgICAweDMzMzMsIDB4MjA4NywgMHgzMzM0LCAweDJFOTQsIDB4MzMzNSwgMHgyRTk1LCAweDMzMzYsIDB4MURBOCwKLSAgICAweDMzMzcsIDB4MkU5QSwgMHgzMzM4LCAweDJFOUMsIDB4MzMzOSwgMHgxRjZFLCAweDMzM0EsIDB4MkU5RCwKLSAgICAweDMzM0IsIDB4MUY2RiwgMHgzMzNDLCAweDJFOTYsIDB4MzMzRCwgMHgyRTlFLCAweDMzM0UsIDB4MkVBMCwKLSAgICAweDMzM0YsIDB4MkVBMSwgMHgzMzQwLCAweDJFQTIsIDB4MzM0MSwgMHgyRTlGLCAweDMzNDIsIDB4MUY2RCwKLSAgICAweDMzNDMsIDB4MkVBMywgMHgzMzQ0LCAweDJFQTQsIDB4MzM0NSwgMHgyRUE1LCAweDMzNDYsIDB4MkVBNiwKLSAgICAweDMzNDcsIDB4MUY3MiwgMHgzMzQ4LCAweDJFQTcsIDB4MzM0OSwgMHgxREExLCAweDMzNEEsIDB4MURBRiwKLSAgICAweDMzNEIsIDB4MkVBOCwgMHgzMzRDLCAweDJFQTksIDB4MzM0RCwgMHgxREE0LCAweDMzNEUsIDB4MjA4OCwKLSAgICAweDMzNEYsIDB4MkVBQSwgMHgzMzUwLCAweDJFQUIsIDB4MzM1MSwgMHgxREE5LCAweDMzNTIsIDB4MkVBRSwKLSAgICAweDMzNTMsIDB4MkVCMiwgMHgzMzU0LCAweDJFQUYsIDB4MzM1NSwgMHgyRUIzLCAweDMzNTYsIDB4MkVCNCwKLSAgICAweDMzNTcsIDB4MUY2QywgMHgzMzcxLCAweDJFNTUsIDB4MzM3QiwgMHgyMDgzLCAweDMzN0MsIDB4MURDNywKLSAgICAweDMzN0QsIDB4MURDNiwgMHgzMzdFLCAweDFEQzUsIDB4MzM3RiwgMHgxRjc2LCAweDMzODUsIDB4MUY1RiwKLSAgICAweDMzODYsIDB4MUY2MCwgMHgzMzg3LCAweDFGNjEsIDB4MzM4OCwgMHgyMDAwLCAweDMzODksIDB4MjAwMSwKLSAgICAweDMzOEQsIDB4MkU1OCwgMHgzMzhFLCAweDFEQjQsIDB4MzM4RiwgMHgxREI1LCAweDMzOTAsIDB4MUY2MywKLSAgICAweDMzOTYsIDB4MUY2NSwgMHgzMzk3LCAweDFGNTgsIDB4MzM5OCwgMHgxRjVBLCAweDMzOUIsIDB4MkU1OSwKLSAgICAweDMzOUMsIDB4MURCMSwgMHgzMzlELCAweDFEQjIsIDB4MzM5RSwgMHgxREIzLCAweDMzOUYsIDB4MUZGQSwKLSAgICAweDMzQTAsIDB4MUY1NCwgMHgzM0ExLCAweDFEQjcsIDB4MzNBMiwgMHgxRjU1LCAweDMzQTMsIDB4MUZGQiwKLSAgICAweDMzQTQsIDB4MUY1NiwgMHgzM0E1LCAweDFGNTcsIDB4MzNBNiwgMHgxRkZDLCAweDMzQjAsIDB4MUY1RSwKLSAgICAweDMzQjEsIDB4MUY1RCwgMHgzM0IyLCAweDFGNUMsIDB4MzNCMywgMHgxRjVCLCAweDMzQzIsIDB4MkU1MCwKLSAgICAweDMzQzQsIDB4MURCNiwgMHgzM0M4LCAweDIwMDIsIDB4MzNDQiwgMHgxRjYyLCAweDMzQ0MsIDB4MUZGNiwKLSAgICAweDMzQ0QsIDB4MURCQiwgMHgzM0Q0LCAweDFGNjQsIDB4MzNENywgMHgyRTVELCAweDMzRDgsIDB4MkU1RSwKLSAgICAweDMzREEsIDB4MkU0QiwgMHgzNDAyLCAweDM1ODIsIDB4MzQwNSwgMHgzQzFCLCAweDM0MjcsIDB4MzY1NiwKLSAgICAweDM0ODgsIDB4M0M1MiwgMHgzNERCLCAweDNDNDEsIDB4MzUxRiwgMHgzNjI5LCAweDM1M0UsIDB4MzcxRSwKLSAgICAweDM3OEQsIDB4MzYxQSwgMHgzN0UyLCAweDM3MkIsIDB4M0FGMywgMHgzQzQwLCAweDNCMjIsIDB4M0M0OSwKLSAgICAweDNCODgsIDB4MzY4RCwgMHgzRThBLCAweDNDNDMsIDB4M0VEQSwgMHgzQzQ4LCAweDNGQjEsIDB4Mzc1NCwKLSAgICAweDQwOTMsIDB4M0M0QywgMHg0MTAzLCAweDNDNEYsIDB4NDI2NCwgMHgzNzYwLCAweDQyOTMsIDB4M0M1MCwKLSAgICAweDQ0MEMsIDB4M0M0MiwgMHg0NDUzLCAweDM3NzMsIDB4NDU3QSwgMHgzQzRCLCAweDQ2NjUsIDB4M0M0RSwKLSAgICAweDQ2QUUsIDB4M0M1MSwgMHg0QkU4LCAweDNDNDYsIDB4NEUwMCwgMHgwNEIwLCAweDRFMDEsIDB4MEJCOCwKLSAgICAweDRFMDMsIDB4MDhFMywgMHg0RTA0LCAweDM3RDgsIDB4NEUwNSwgMHgzN0Q5LCAweDRFMDcsIDB4MEVBQSwKLSAgICAweDRFMDgsIDB4MDlDRSwgMHg0RTA5LCAweDA4N0UsIDB4NEUwQSwgMHgwOUNELCAweDRFMEIsIDB4MDUzQywKLSAgICAweDRFMEQsIDB4MERDNiwgMHg0RTBFLCAweDBGMjksIDB4NEUxMCwgMHgwRkZCLCAweDRFMTEsIDB4MDREMSwKLSAgICAweDRFMTQsIDB4MDVDQywgMHg0RTE1LCAweDBGRkMsIDB4NEUxNiwgMHgwQTQ4LCAweDRFMTcsIDB4MTBENywKLSAgICAweDRFMTgsIDB4MDY3MCwgMHg0RTE5LCAweDBFMEEsIDB4NEUxRSwgMHgwOUNGLCAweDRFMUYsIDB4MzdEQSwKLSAgICAweDRFMjEsIDB4MEY4NiwgMHg0RTI2LCAweDBFMTIsIDB4NEUyOCwgMHgyMEIzLCAweDRFMkEsIDB4MEZGRCwKLSAgICAweDRFMkIsIDB4MzdEQiwgMHg0RTJDLCAweDM3NEQsIDB4NEUyRCwgMHgwQkE0LCAweDRFMkYsIDB4MzdEQywKLSAgICAweDRFMzAsIDB4MzdERCwgMHg0RTMxLCAweDBGRkUsIDB4NEUzMiwgMHgwNkYyLCAweDRFMzYsIDB4MEZGRiwKLSAgICAweDRFMzcsIDB4MzY5RCwgMHg0RTM4LCAweDA2MTksIDB4NEUzOSwgMHgwQjZFLCAweDRFM0IsIDB4MDkxMywKLSAgICAweDRFM0MsIDB4MTAwMCwgMHg0RTNGLCAweDEwMDEsIDB4NEU0MCwgMHgzN0RFLCAweDRFNDEsIDB4MzdERiwKLSAgICAweDRFNDIsIDB4MTAwMiwgMHg0RTQzLCAweDBDRUIsIDB4NEU0NCwgMHgzN0UwLCAweDRFNDUsIDB4MDY3MSwKLSAgICAweDRFNDgsIDB4MzcyRSwgMHg0RTRCLCAweDBDRUQsIDB4NEU0RCwgMHgwQ0JCLCAweDRFNEUsIDB4MDc3NywKLSAgICAweDRFNEYsIDB4MEU2MSwgMHg0RTU1LCAweDE5NTAsIDB4NEU1NiwgMHgxMDAzLCAweDRFNTcsIDB4MDlEMCwKLSAgICAweDRFNTgsIDB4MTAwNCwgMHg0RTU5LCAweDA1MzUsIDB4NEU1QSwgMHgzN0UxLCAweDRFNUQsIDB4MDZERCwKLSAgICAweDRFNUUsIDB4MDdBNCwgMHg0RTVGLCAweDBFRjUsIDB4NEU2MiwgMHgxMjMzLCAweDRFNzEsIDB4MEY1QSwKLSAgICAweDRFNzMsIDB4MENENSwgMHg0RTdFLCAweDA1RTEsIDB4NEU3RiwgMHgzN0UyLCAweDRFODAsIDB4MDY0RiwKLSAgICAweDRFODIsIDB4MTAwNSwgMHg0RTg1LCAweDEwMDYsIDB4NEU4NiwgMHgwRjgzLCAweDRFODgsIDB4MEYyNywKLSAgICAweDRFODksIDB4MEFFQSwgMHg0RThBLCAweDEwMDgsIDB4NEU4QiwgMHgwOEM0LCAweDRFOEMsIDB4MENDQiwKLSAgICAweDRFOEQsIDB4MzdFMywgMHg0RThFLCAweDEwMEIsIDB4NEU5MSwgMHgwNEUwLCAweDRFOTIsIDB4MDc5MywKLSAgICAweDRFOTQsIDB4MDc5MiwgMHg0RTk1LCAweDA0QUEsIDB4NEU5NiwgMHgzN0U0LCAweDRFOTgsIDB4MEZGMSwKLSAgICAweDRFOTksIDB4MEZGMCwgMHg0RTlCLCAweDA4MjMsIDB4NEU5QywgMHgwNDY1LCAweDRFOUUsIDB4MTAwQywKLSAgICAweDRFOUYsIDB4MTAwRCwgMHg0RUEwLCAweDEwMEUsIDB4NEVBMSwgMHgwRTYyLCAweDRFQTIsIDB4MTAwRiwKLSAgICAweDRFQTQsIDB4MDdBNiwgMHg0RUE1LCAweDA0QUIsIDB4NEVBNiwgMHgwRUEwLCAweDRFQTgsIDB4MDY5NiwKLSAgICAweDRFQUIsIDB4MDY5NywgMHg0RUFDLCAweDA2OTgsIDB4NEVBRCwgMHgwQkZFLCAweDRFQUUsIDB4MEY4NCwKLSAgICAweDRFQjAsIDB4MTAxMCwgMHg0RUIzLCAweDEwMTEsIDB4NEVCNiwgMHgxMDEyLCAweDRFQjksIDB4MzdFNSwKLSAgICAweDRFQkEsIDB4MEExMywgMHg0RUJCLCAweDM2MjAsIDB4NEVDMCwgMHgwOTQ0LCAweDRFQzEsIDB4MEExNCwKLSAgICAweDRFQzIsIDB4MTAxNywgMHg0RUM0LCAweDEwMTUsIDB4NEVDNiwgMHgxMDE2LCAweDRFQzcsIDB4MDY3MiwKLSAgICAweDRFQ0EsIDB4MDgxMywgMHg0RUNCLCAweDA1NzAsIDB4NEVDRCwgMHgxMDE0LCAweDRFQ0UsIDB4MTAxMywKLSAgICAweDRFQ0YsIDB4MERGOSwgMHg0RUQwLCAweDM3RTYsIDB4NEVENCwgMHgwODk0LCAweDRFRDUsIDB4MDg5MywKLSAgICAweDRFRDYsIDB4MEIxRSwgMHg0RUQ3LCAweDEwMTgsIDB4NEVEOCwgMHgwREM3LCAweDRFRDksIDB4MEE4QiwKLSAgICAweDRFREQsIDB4MDI5MCwgMHg0RURFLCAweDEwMTksIDB4NEVERiwgMHgxMDFCLCAweDRFRTAsIDB4MzdFNywKLSAgICAweDRFRTEsIDB4MjBCNCwgMHg0RUUzLCAweDBCNDUsIDB4NEVFNCwgMHgwRkE5LCAweDRFRTUsIDB4MDQ4RSwKLSAgICAweDRFRUQsIDB4MTAxQSwgMHg0RUVFLCAweDA1M0UsIDB4NEVGMCwgMHgwNkJDLCAweDRFRjIsIDB4MEJBNSwKLSAgICAweDRFRjYsIDB4MDc0NSwgMHg0RUY3LCAweDEwMUMsIDB4NEVGQiwgMHgwQ0RBLCAweDRFRkMsIDB4MjBCNSwKLSAgICAweDRFRkQsIDB4MzdFOCwgMHg0RUZGLCAweDM3RTksIDB4NEYwMCwgMHgyMEI2LCAweDRGMDEsIDB4MDYyNywKLSAgICAweDRGMDMsIDB4MjBCNywgMHg0RjA5LCAweDEwMUQsIDB4NEYwQSwgMHgwNDhGLCAweDRGMEIsIDB4MzdFQSwKLSAgICAweDRGMEQsIDB4MDc5NCwgMHg0RjBFLCAweDA2MjgsIDB4NEYwRiwgMHgwREVDLCAweDRGMTAsIDB4MEQ0NiwKLSAgICAweDRGMTEsIDB4MDY3MywgMHg0RjE1LCAweDM3RUIsIDB4NEYxQSwgMHgwNTcxLCAweDRGMUMsIDB4MTA0MCwKLSAgICAweDRGMUQsIDB4MEMzQiwgMHg0RjJGLCAweDBEMjIsIDB4NEYzMCwgMHgxMDFGLCAweDRGMzQsIDB4MEQ1MCwKLSAgICAweDRGMzYsIDB4MEZBQSwgMHg0RjM4LCAweDA5RjMsIDB4NEYzOSwgMHgyMEI4LCAweDRGM0EsIDB4MDg5NSwKLSAgICAweDRGM0IsIDB4MzdFRCwgMHg0RjNDLCAweDA4QzUsIDB4NEYzRCwgMHgwNTQwLCAweDRGNDMsIDB4MEJFRCwKLSAgICAweDRGNDYsIDB4MEI2MCwgMHg0RjQ3LCAweDEwMjMsIDB4NEY0OSwgMHgzN0VFLCAweDRGNEQsIDB4MDQ5MCwKLSAgICAweDRGNEUsIDB4MEJGRiwgMHg0RjRGLCAweDA5NDUsIDB4NEY1MCwgMHgwODI0LCAweDRGNTEsIDB4MEYwRSwKLSAgICAweDRGNTMsIDB4MEIyRSwgMHg0RjU0LCAweDM3RUYsIDB4NEY1NSwgMHgwNTNGLCAweDRGNTYsIDB4MjBCOSwKLSAgICAweDRGNTcsIDB4MTAyMiwgMHg0RjU5LCAweDBGMjgsIDB4NEY1QSwgMHgxMDFFLCAweDRGNUIsIDB4MTAyMCwKLSAgICAweDRGNUMsIDB4MDg1RSwgMHg0RjVELCAweDEwMjEsIDB4NEY1RSwgMHgxMUQzLCAweDRGNjAsIDB4MzdFQywKLSAgICAweDRGNjksIDB4MTAyOSwgMHg0RjZGLCAweDEwMkMsIDB4NEY3MCwgMHgxMDJBLCAweDRGNzMsIDB4MDU0MiwKLSAgICAweDRGNzUsIDB4MEUwQiwgMHg0Rjc2LCAweDEwMjQsIDB4NEY3QSwgMHgzN0YwLCAweDRGN0IsIDB4MTAyOCwKLSAgICAweDRGN0MsIDB4MDdBNywgMHg0RjdELCAweDM3RjEsIDB4NEY3RSwgMHgzN0YyLCAweDRGN0YsIDB4MDg5NiwKLSAgICAweDRGODMsIDB4MDVFMiwgMHg0Rjg2LCAweDEwMkQsIDB4NEY4OCwgMHgxMDI1LCAweDRGOEEsIDB4MjBCQiwKLSAgICAweDRGOEIsIDB4MEZBQiwgMHg0RjhELCAweDA4QzYsIDB4NEY4RiwgMHgxMDI2LCAweDRGOTEsIDB4MTAyQiwKLSAgICAweDRGOTIsIDB4MjBCQSwgMHg0Rjk0LCAweDIwQkQsIDB4NEY5NiwgMHgxMDJFLCAweDRGOTcsIDB4MzdGMywKLSAgICAweDRGOTgsIDB4MTAyNywgMHg0RjlBLCAweDIwQkMsIDB4NEY5QiwgMHgwNjk5LCAweDRGOUQsIDB4MDQ5MSwKLSAgICAweDRGQTAsIDB4MDY5QSwgMHg0RkExLCAweDA1NDEsIDB4NEZBQiwgMHgxMUQ0LCAweDRGQUQsIDB4MEVBNywKLSAgICAweDRGQUUsIDB4MERFMCwgMHg0RkFGLCAweDA3QTgsIDB4NEZCNSwgMHgwOUY1LCAweDRGQjYsIDB4MEY3RiwKLSAgICAweDRGQkUsIDB4MzdGNCwgMHg0RkJGLCAweDBFMjgsIDB4NEZDMiwgMHgwNzBFLCAweDRGQzMsIDB4MEIwNSwKLSAgICAweDRGQzQsIDB4MDU2NCwgMHg0RkM5LCAweDIwQUMsIDB4NEZDQSwgMHgwOTVELCAweDRGQ0QsIDB4MjBCRSwKLSAgICAweDRGQ0UsIDB4MTAzMiwgMHg0RkNGLCAweDM3RjUsIDB4NEZEMCwgMHgxMDM3LCAweDRGRDEsIDB4MTAzNSwKLSAgICAweDRGRDMsIDB4M0MyRiwgMHg0RkQ0LCAweDEwMzAsIDB4NEZENywgMHgwQjBGLCAweDRGRDgsIDB4MTAzMywKLSAgICAweDRGREEsIDB4MTAzNiwgMHg0RkRCLCAweDEwMzQsIDB4NEZERCwgMHgwRTJELCAweDRGREYsIDB4MTAzMSwKLSAgICAweDRGRTAsIDB4MURFQywgMHg0RkUxLCAweDA5RjQsIDB4NEZFMywgMHgwRUExLCAweDRGRTQsIDB4MTAzOCwKLSAgICAweDRGRTUsIDB4MTAzOSwgMHg0RkVFLCAweDA5MkUsIDB4NEZFRiwgMHgxMDQ2LCAweDRGRjMsIDB4MEQwNiwKLSAgICAweDRGRjUsIDB4MERBOCwgMHg0RkY2LCAweDEwNDEsIDB4NEZGOCwgMHgwRTQwLCAweDRGRkEsIDB4MDUzNiwKLSAgICAweDRGRkQsIDB4MzdGNiwgMHg0RkZFLCAweDEwNDUsIDB4NEZGRiwgMHgyMEMxLCAweDUwMDAsIDB4MzdGNywKLSAgICAweDUwMDEsIDB4MzdGOCwgMHg1MDAyLCAweDM0NDcsIDB4NTAwNSwgMHgxMDNGLCAweDUwMDYsIDB4MTA0OCwKLSAgICAweDUwMDksIDB4MEFENCwgMHg1MDBCLCAweDA3NzgsIDB4NTAwRCwgMHgwRDEyLCAweDUwMEYsIDB4MTYwMCwKLSAgICAweDUwMTAsIDB4MzdGOSwgMHg1MDExLCAweDEwNDcsIDB4NTAxMiwgMHgwQzU3LCAweDUwMTQsIDB4MTAzQywKLSAgICAweDUwMTYsIDB4MDdBQSwgMHg1MDE5LCAweDA3QTksIDB4NTAxQSwgMHgxMDNBLCAweDUwMUIsIDB4MzdGQSwKLSAgICAweDUwMUUsIDB4MjBDMiwgMHg1MDFGLCAweDA5MDYsIDB4NTAyMSwgMHgxMDQyLCAweDUwMjIsIDB4MjBDMCwKLSAgICAweDUwMjMsIDB4MEUzRiwgMHg1MDI0LCAweDBCOEIsIDB4NTAyNSwgMHgxMDNFLCAweDUwMjYsIDB4MDc0NywKLSAgICAweDUwMjcsIDB4MzdGQiwgMHg1MDI4LCAweDEwM0IsIDB4NTAyOSwgMHgxMDQzLCAweDUwMkEsIDB4MTAzRCwKLSAgICAweDUwMkIsIDB4MEY5OSwgMHg1MDJDLCAweDEwNDQsIDB4NTAyRCwgMHgwRkU3LCAweDUwMkUsIDB4MzdGQywKLSAgICAweDUwMzYsIDB4MDZERSwgMHg1MDM5LCAweDA3NDYsIDB4NTAzQiwgMHgzODAwLCAweDUwNDAsIDB4MjBCRiwKLSAgICAweDUwNDIsIDB4MjBDNSwgMHg1MDQzLCAweDEwNDksIDB4NTA0NiwgMHgyMEMzLCAweDUwNDcsIDB4MTA0QSwKLSAgICAweDUwNDgsIDB4MTA0RSwgMHg1MDQ5LCAweDA0OTIsIDB4NTA0RiwgMHgwRTIwLCAweDUwNTAsIDB4MTA0RCwKLSAgICAweDUwNTUsIDB4MTA0QywgMHg1MDU2LCAweDEwNTAsIDB4NTA1NywgMHgzN0ZELCAweDUwNUEsIDB4MTA0RiwKLSAgICAweDUwNUMsIDB4MEMwMCwgMHg1MDY1LCAweDA3NDgsIDB4NTA2NiwgMHgzN0ZFLCAweDUwNkEsIDB4MzdGRiwKLSAgICAweDUwNkMsIDB4MTA1MSwgMHg1MDcwLCAweDIwQzQsIDB4NTA3MiwgMHgwOEYxLCAweDUwNzQsIDB4MEIwNiwKLSAgICAweDUwNzUsIDB4MEMwMSwgMHg1MDc2LCAweDA2RUUsIDB4NTA3OCwgMHgxMDUyLCAweDUwN0QsIDB4MDY1MCwKLSAgICAweDUwODAsIDB4MTA1MywgMHg1MDg1LCAweDEwNTUsIDB4NTA4RCwgMHgwRTYzLCAweDUwOEYsIDB4MzgwMSwKLSAgICAweDUwOTEsIDB4MDczQywgMHg1MDk0LCAweDIwQzYsIDB4NTA5NiwgMHgzODAyLCAweDUwOTgsIDB4MDg3RiwKLSAgICAweDUwOTksIDB4MEQ4QiwgMHg1MDlBLCAweDEwNTQsIDB4NTA5QywgMHgzODAzLCAweDUwQUMsIDB4MDgzNSwKLSAgICAweDUwQUQsIDB4MEYyRCwgMHg1MEIyLCAweDEwNTcsIDB4NTBCMywgMHgxMDVBLCAweDUwQjQsIDB4MTA1NiwKLSAgICAweDUwQjUsIDB4MDgzNCwgMHg1MEI3LCAweDA5ODcsIDB4NTBCRSwgMHgwNzBGLCAweDUwQzIsIDB4MTA1QiwKLSAgICAweDUwQzUsIDB4MDZDNywgMHg1MEM5LCAweDEwNTgsIDB4NTBDQSwgMHgxMDU5LCAweDUwQ0MsIDB4MzgwNCwKLSAgICAweDUwQ0QsIDB4MEM4NywgMHg1MENGLCAweDBBRkUsIDB4NTBEMSwgMHgwNjlCLCAweDUwRDUsIDB4MEU3QiwKLSAgICAweDUwRDYsIDB4MTA1QywgMHg1MEQ4LCAweDIwQzgsIDB4NTBEOSwgMHgzQzMwLCAweDUwREEsIDB4MEY4NSwKLSAgICAweDUwREUsIDB4MTA1RCwgMHg1MEUzLCAweDEwNjAsIDB4NTBFNSwgMHgxMDVFLCAweDUwRTYsIDB4MzgwNSwKLSAgICAweDUwRTcsIDB4MEFEMCwgMHg1MEU5LCAweDM4MDYsIDB4NTBFRCwgMHgxMDVGLCAweDUwRUUsIDB4MTA2MSwKLSAgICAweDUwRUYsIDB4MzgwNywgMHg1MEYwLCAweDNDMzEsIDB4NTBGNCwgMHgyMEM3LCAweDUwRjUsIDB4MTA2MywKLSAgICAweDUwRjksIDB4MTA2MiwgMHg1MEZCLCAweDBFMTgsIDB4NTEwMCwgMHgwNjUxLCAweDUxMDEsIDB4MTA2NSwKLSAgICAweDUxMDIsIDB4MTA2NiwgMHg1MTA0LCAweDA1MkYsIDB4NTEwOCwgMHgzODA4LCAweDUxMDksIDB4MTA2NCwKLSAgICAweDUxMEIsIDB4MzgwOSwgMHg1MTEwLCAweDM4MEEsIDB4NTExMiwgMHgwOTIwLCAweDUxMTQsIDB4MTA2OSwKLSAgICAweDUxMTUsIDB4MTA2OCwgMHg1MTE2LCAweDEwNjcsIDB4NTExOCwgMHgxMDJGLCAweDUxMUEsIDB4MTA2QSwKLSAgICAweDUxMUIsIDB4MzgwQiwgMHg1MTFFLCAweDM4MEMsIDB4NTExRiwgMHgwOTg4LCAweDUxMjEsIDB4MTA2QiwKLSAgICAweDUxMkEsIDB4MEYwRiwgMHg1MTMyLCAweDBFRTUsIDB4NTEzNywgMHgxMDZELCAweDUxM0EsIDB4MTA2QywKLSAgICAweDUxM0IsIDB4MTA2RiwgMHg1MTNDLCAweDEwNkUsIDB4NTEzRiwgMHgxMDcwLCAweDUxNDAsIDB4MTA3MSwKLSAgICAweDUxNDEsIDB4MDRCOCwgMHg1MTQzLCAweDA3NjksIDB4NTE0NCwgMHgwNzExLCAweDUxNDUsIDB4MDk0NiwKLSAgICAweDUxNDYsIDB4MEJCOSwgMHg1MTQ3LCAweDA2OUMsIDB4NTE0OCwgMHgwQThDLCAweDUxNDksIDB4MDdBQiwKLSAgICAweDUxNEEsIDB4MjBDOSwgMHg1MTRCLCAweDA4MDAsIDB4NTE0QywgMHgxMDczLCAweDUxNEQsIDB4MEVENCwKLSAgICAweDUxNEUsIDB4MEM0MCwgMHg1MTUwLCAweDA4QzcsIDB4NTE1MiwgMHgxMDcyLCAweDUxNTQsIDB4MTA3NCwKLSAgICAweDUxNUEsIDB4MEM1OCwgMHg1MTVDLCAweDA1RDMsIDB4NTE1RiwgMHgzODBELCAweDUxNjIsIDB4MTA3NSwKLSAgICAweDUxNjQsIDB4MjBDQSwgMHg1MTY1LCAweDBDRDYsIDB4NTE2NywgMHgzNjhFLCAweDUxNjgsIDB4MEFCNiwKLSAgICAweDUxNjksIDB4MTA3NywgMHg1MTZBLCAweDEwNzgsIDB4NTE2QiwgMHgwRDQwLCAweDUxNkMsIDB4MDdBQywKLSAgICAweDUxNkQsIDB4MEZFMSwgMHg1MTZFLCAweDEwNzksIDB4NTE3MSwgMHgwNjlFLCAweDUxNzUsIDB4MEUwQywKLSAgICAweDUxNzYsIDB4MEIxNiwgMHg1MTc3LCAweDA2RTksIDB4NTE3OCwgMHgwQzJGLCAweDUxNzksIDB4Mzc3OSwKLSAgICAweDUxN0MsIDB4MDc0OSwgMHg1MTgwLCAweDEwN0EsIDB4NTE4MiwgMHgxMDdCLCAweDUxODUsIDB4MENCQSwKLSAgICAweDUxODYsIDB4MDUwMSwgMHg1MTg5LCAweDEwN0UsIDB4NTE4QSwgMHgwODZELCAweDUxOEMsIDB4MTA3RCwKLSAgICAweDUxOEQsIDB4MDgzNiwgMHg1MThGLCAweDEwN0YsIDB4NTE5MCwgMHgxODVCLCAweDUxOTEsIDB4MTA4MCwKLSAgICAweDUxOTIsIDB4MEU2RiwgMHg1MTkzLCAweDEwODEsIDB4NTE5NSwgMHgxMDgyLCAweDUxOTYsIDB4MTA4MywKLSAgICAweDUxOTcsIDB4MDlEMSwgMHg1MTk5LCAweDA4RjgsIDB4NTE5RCwgMHgyMENCLCAweDUxQTAsIDB4MDVFMywKLSAgICAweDUxQTEsIDB4MzgwRSwgMHg1MUEyLCAweDEwODYsIDB4NTFBNCwgMHgxMDg0LCAweDUxQTUsIDB4MEVDOSwKLSAgICAweDUxQTYsIDB4MTA4NSwgMHg1MUE4LCAweDBEQ0MsIDB4NTFBOSwgMHgxMDg3LCAweDUxQUEsIDB4MTA4OCwKLSAgICAweDUxQUIsIDB4MTA4OSwgMHg1MUFDLCAweDBDNTksIDB4NTFCMCwgMHgxMDhELCAweDUxQjEsIDB4MTA4QiwKLSAgICAweDUxQjIsIDB4MTA4QywgMHg1MUIzLCAweDEwOEEsIDB4NTFCNCwgMHgwODUzLCAweDUxQjUsIDB4MTA4RSwKLSAgICAweDUxQjYsIDB4MEVGNiwgMHg1MUI3LCAweDBGQUMsIDB4NTFCQywgMHgzODBGLCAweDUxQkQsIDB4MTA4RiwKLSAgICAweDUxQkUsIDB4MjBDQywgMHg1MUMzLCAweDNDMzIsIDB4NTFDNCwgMHgwQTRDLCAweDUxQzUsIDB4MTA5MCwKLSAgICAweDUxQzYsIDB4MDk2NCwgMHg1MUM5LCAweDEwOTEsIDB4NTFDQiwgMHgwQkJBLCAweDUxQ0MsIDB4MEY4NywKLSAgICAweDUxQ0QsIDB4MEM1QSwgMHg1MUQ2LCAweDEwREEsIDB4NTFEQiwgMHgxMDkyLCAweDUxREMsIDB4MjA1QywKLSAgICAweDUxREQsIDB4MDZCRCwgMHg1MURFLCAweDM4MTAsIDB4NTFFMCwgMHgxMDkzLCAweDUxRTEsIDB4MEU4QywKLSAgICAweDUxRTYsIDB4MDk3MiwgMHg1MUU3LCAweDBCNUMsIDB4NTFFOSwgMHgxMDk1LCAweDUxRUEsIDB4MENCQywKLSAgICAweDUxRUMsIDB4MjBDRCwgMHg1MUVELCAweDEwOTYsIDB4NTFFRSwgMHgzODExLCAweDUxRjAsIDB4MTA5NywKLSAgICAweDUxRjEsIDB4MDU4QywgMHg1MUY0LCAweDM4MTIsIDB4NTFGNSwgMHgxMDk4LCAweDUxRjYsIDB4MDY5RiwKLSAgICAweDUxRjgsIDB4MENBNCwgMHg1MUY5LCAweDA1MUMsIDB4NTFGQSwgMHgwOTVBLCAweDUxRkQsIDB4MEQzNSwKLSAgICAweDUxRkUsIDB4MTA5OSwgMHg1MjAwLCAweDBDNUIsIDB4NTIwMSwgMHgzODEzLCAweDUyMDIsIDB4MzgxNCwKLSAgICAweDUyMDMsIDB4MEExNSwgMHg1MjA0LCAweDEwOUEsIDB4NTIwNiwgMHgwREZDLCAweDUyMDcsIDB4MEE3RSwKLSAgICAweDUyMDgsIDB4MDVERSwgMHg1MjBBLCAweDA1RTUsIDB4NTIwQiwgMHgxMDlCLCAweDUyMEUsIDB4MTA5RCwKLSAgICAweDUyMTEsIDB4MDcxMCwgMHg1MjEzLCAweDM4MTUsIDB4NTIxNCwgMHgxMDlDLCAweDUyMTUsIDB4MjBDRSwKLSAgICAweDUyMTcsIDB4MEZCQiwgMHg1MjFELCAweDA5NzMsIDB4NTIyNCwgMHgwRDUxLCAweDUyMjUsIDB4MEUxQywKLSAgICAweDUyMjcsIDB4MTA5RSwgMHg1MjI5LCAweDBGNjIsIDB4NTIyQSwgMHgxMDlGLCAweDUyMkUsIDB4MTBBMCwKLSAgICAweDUyMzAsIDB4MEM3OCwgMHg1MjMzLCAweDEwQTEsIDB4NTIzNiwgMHgwQTRELCAweDUyMzcsIDB4MDg2RSwKLSAgICAweDUyMzgsIDB4MDc0QSwgMHg1MjM5LCAweDEwQTIsIDB4NTIzQSwgMHgwODk3LCAweDUyM0IsIDB4MDgwMSwKLSAgICAweDUyNDMsIDB4MEMwMiwgMHg1MjQ0LCAweDEwQTQsIDB4NTI0NywgMHgwQjA3LCAweDUyNDksIDB4MzgxNiwKLSAgICAweDUyNEEsIDB4MDg1RiwgMHg1MjRCLCAweDEwQTUsIDB4NTI0QywgMHgxMEE2LCAweDUyNEQsIDB4MEFCMiwKLSAgICAweDUyNEYsIDB4MTBBMywgMHg1MjU0LCAweDEwQTgsIDB4NTI1NiwgMHgwRTY0LCAweDUyNUIsIDB4MDdGNiwKLSAgICAweDUyNUQsIDB4MUU1RSwgMHg1MjVFLCAweDEwQTcsIDB4NTI2MSwgMHgzODE3LCAweDUyNjMsIDB4MDc0QiwKLSAgICAweDUyNjQsIDB4MDg0RSwgMHg1MjY1LCAweDBEMjMsIDB4NTI2NiwgMHgzODE4LCAweDUyNjksIDB4MTBBQiwKLSAgICAweDUyNkEsIDB4MTBBOSwgMHg1MjZGLCAweDBERUQsIDB4NTI3MCwgMHgwOUQyLCAweDUyNzEsIDB4MTBCMiwKLSAgICAweDUyNzIsIDB4MDVDMiwgMHg1MjczLCAweDEwQUMsIDB4NTI3NCwgMHgxMEFBLCAweDUyNzUsIDB4MEFEMSwKLSAgICAweDUyN0QsIDB4MTBBRSwgMHg1MjdGLCAweDEwQUQsIDB4NTI4MywgMHgwNUEyLCAweDUyODcsIDB4MDczNiwKLSAgICAweDUyODgsIDB4MTBCMywgMHg1Mjg5LCAweDBGNzUsIDB4NTI4RCwgMHgxMEFGLCAweDUyOTEsIDB4MTBCNCwKLSAgICAweDUyOTIsIDB4MTBCMSwgMHg1MjkzLCAweDM4MTksIDB4NTI5NCwgMHgxMEIwLCAweDUyOUIsIDB4MEY5NywKLSAgICAweDUyOUMsIDB4MjBDRiwgMHg1MjlGLCAweDA3QUQsIDB4NTJBMCwgMHgwNTQzLCAweDUyQTMsIDB4MEZCQywKLSAgICAweDUyQTYsIDB4MjBEMCwgMHg1MkE5LCAweDA5N0YsIDB4NTJBQSwgMHgwQzUyLCAweDUyQUIsIDB4MDdGNywKLSAgICAweDUyQUMsIDB4MTBCNywgMHg1MkFELCAweDEwQjgsIDB4NTJBRiwgMHgyMTdELCAweDUyQjEsIDB4MEZBRCwKLSAgICAweDUyQjQsIDB4MEZEMSwgMHg1MkI1LCAweDEwQkEsIDB4NTJCOSwgMHgwN0FFLCAweDUyQkMsIDB4MTBCOSwKLSAgICAweDUyQkUsIDB4MDU4RCwgMHg1MkMwLCAweDIwRDEsIDB4NTJDMSwgMHgxMEJCLCAweDUyQzMsIDB4MEU4NCwKLSAgICAweDUyQzUsIDB4MEJEOCwgMHg1MkM3LCAweDBGMTAsIDB4NTJDOCwgMHgzODFBLCAweDUyQzksIDB4MEUyOSwKLSAgICAweDUyQ0QsIDB4MTBCQywgMHg1MkQwLCAweDM2RTgsIDB4NTJEMiwgMHgxQkVFLCAweDUyRDUsIDB4MEM4OCwKLSAgICAweDUyRDcsIDB4MTBCRCwgMHg1MkQ4LCAweDA1RTYsIDB4NTJEOSwgMHgwRUJGLCAweDUyREIsIDB4MjBEMiwKLSAgICAweDUyREQsIDB4MDk4OSwgMHg1MkRFLCAweDEwQkUsIDB4NTJERiwgMHgwRTM3LCAweDUyRTAsIDB4MTBDMiwKLSAgICAweDUyRTIsIDB4MEE0RSwgMHg1MkUzLCAweDEwQkYsIDB4NTJFNCwgMHgwNkM4LCAweDUyRTYsIDB4MTBDMCwKLSAgICAweDUyRTcsIDB4MDVFNywgMHg1MkYwLCAweDM4MUIsIDB4NTJGMiwgMHgwNzA0LCAweDUyRjMsIDB4MTBDMywKLSAgICAweDUyRjUsIDB4MTBDNCwgMHg1MkY4LCAweDEwQzUsIDB4NTJGOSwgMHgxMEM2LCAweDUyRkEsIDB4MDkwNywKLSAgICAweDUyRkUsIDB4MDdBRiwgMHg1MkZGLCAweDBFRUEsIDB4NTMwMCwgMHgyMEQzLCAweDUzMDEsIDB4MEVGNCwKLSAgICAweDUzMDIsIDB4MENDRiwgMHg1MzA1LCAweDBFNDEsIDB4NTMwNiwgMHgxMEM3LCAweDUzMDcsIDB4MjBENCwKLSAgICAweDUzMDgsIDB4MTBDOCwgMHg1MzBBLCAweDM4MUMsIDB4NTMwQiwgMHgzODFELCAweDUzMEQsIDB4MTBDQSwKLSAgICAweDUzMEYsIDB4MTBDQywgMHg1MzEwLCAweDEwQ0IsIDB4NTMxNSwgMHgxMENELCAweDUzMTYsIDB4MDUzRCwKLSAgICAweDUzMTcsIDB4MEU3QSwgMHg1MzE5LCAweDA4NkMsIDB4NTMxQSwgMHgxMENFLCAweDUzMUQsIDB4MEFEQiwKLSAgICAweDUzMjAsIDB4MDk4QSwgMHg1MzIxLCAweDA2QTEsIDB4NTMyMywgMHgxMENGLCAweDUzMjQsIDB4MjBENSwKLSAgICAweDUzMkEsIDB4MEQ2RiwgMHg1MzJGLCAweDEwRDAsIDB4NTMzMSwgMHgxMEQxLCAweDUzMzMsIDB4MTBEMiwKLSAgICAweDUzMzgsIDB4MTBEMywgMHg1MzM5LCAweDBEOTYsIDB4NTMzQSwgMHgwNkUwLCAweDUzM0IsIDB4MDRBOSwKLSAgICAweDUzM0UsIDB4MzgxRSwgMHg1MzNGLCAweDBDOTcsIDB4NTM0MCwgMHgxMEQ0LCAweDUzNDEsIDB4MDk0NywKLSAgICAweDUzNDMsIDB4MEE4RCwgMHg1MzQ1LCAweDEwRDYsIDB4NTM0NiwgMHgxMEQ1LCAweDUzNDcsIDB4MDk4QiwKLSAgICAweDUzNDgsIDB4MDc5NSwgMHg1MzQ5LCAweDEwRDgsIDB4NTM0QSwgMHgwRDUyLCAweDUzNEIsIDB4MzgyMCwKLSAgICAweDUzNEMsIDB4MzgxRiwgMHg1MzRELCAweDEwRDksIDB4NTM1MSwgMHgwRDcwLCAweDUzNTIsIDB4MEIxNCwKLSAgICAweDUzNTMsIDB4MEI0RSwgMHg1MzU0LCAweDA2QTAsIDB4NTM1NywgMHgwQ0M2LCAweDUzNTgsIDB4MEI2RiwKLSAgICAweDUzNUEsIDB4MEQyNCwgMHg1MzVDLCAweDBFN0MsIDB4NTM1RSwgMHgxMERCLCAweDUzNjAsIDB4MEE4RSwKLSAgICAweDUzNjEsIDB4MzgyMSwgMHg1MzY2LCAweDA3MEIsIDB4NTM2OSwgMHgxMERDLCAweDUzNkMsIDB4MzgyMiwKLSAgICAweDUzNkUsIDB4MTBERCwgMHg1MzZGLCAweDA0Q0UsIDB4NTM3MCwgMHgwNEI5LCAweDUzNzEsIDB4MDYyOSwKLSAgICAweDUzNzIsIDB4MjBENiwgMHg1MzczLCAweDBCMDgsIDB4NTM3NCwgMHgwNjZCLCAweDUzNzUsIDB4MEY1QiwKLSAgICAweDUzNzcsIDB4MTBFMCwgMHg1Mzc4LCAweDA1MzcsIDB4NTM3QiwgMHgxMERGLCAweDUzN0QsIDB4MzQzNSwKLSAgICAweDUzN0YsIDB4MDZBMiwgMHg1MzgyLCAweDEwRTEsIDB4NTM4NCwgMHgwRUZELCAweDUzODksIDB4MzdEMCwKLSAgICAweDUzOTMsIDB4MjBENywgMHg1Mzk2LCAweDEwRTIsIDB4NTM5OCwgMHgwRjlBLCAweDUzOUEsIDB4MDdCMCwKLSAgICAweDUzOUYsIDB4MDc2QSwgMHg1M0EwLCAweDEwRTMsIDB4NTNBNSwgMHgxMEU1LCAweDUzQTYsIDB4MTBFNCwKLSAgICAweDUzQTgsIDB4MEEyNSwgMHg1M0E5LCAweDA0REIsIDB4NTNBQiwgMHgzODIzLCAweDUzQUQsIDB4MDUwMCwKLSAgICAweDUzQUUsIDB4MTBFNiwgMHg1M0IwLCAweDEwRTcsIDB4NTNCMiwgMHgyMEQ4LCAweDUzQjMsIDB4MDc2QiwKLSAgICAweDUzQjYsIDB4MTBFOCwgMHg1M0JCLCAweDA2ODgsIDB4NTNDMiwgMHgwODgwLCAweDUzQzMsIDB4MTBFOSwKLSAgICAweDUzQzgsIDB4MEVBMiwgMHg1M0M5LCAweDA4MjUsIDB4NTNDQSwgMHgwNjc0LCAweDUzQ0IsIDB4MEYxMSwKLSAgICAweDUzQ0MsIDB4MEFEMiwgMHg1M0NELCAweDBENTMsIDB4NTNDRSwgMHgwOTI5LCAweDUzRDQsIDB4MDk1MSwKLSAgICAweDUzRDYsIDB4MDkxNCwgMHg1M0Q3LCAweDA5MjEsIDB4NTNEOSwgMHgwOTgwLCAweDUzREEsIDB4MzgyNCwKLSAgICAweDUzREIsIDB4MEQ1NCwgMHg1M0RELCAweDIwRDksIDB4NTNERiwgMHgxMEVDLCAweDUzRTEsIDB4MDRFNSwKLSAgICAweDUzRTIsIDB4MEFEMywgMHg1M0UzLCAweDA3QjEsIDB4NTNFNCwgMHgwNzc5LCAweDUzRTUsIDB4MDZERiwKLSAgICAweDUzRTYsIDB4MzgyNSwgMHg1M0U4LCAweDEwRjAsIDB4NTNFOSwgMHgwQjVGLCAweDUzRUEsIDB4MEI1RSwKLSAgICAweDUzRUIsIDB4MDZBMywgMHg1M0VDLCAweDA5OEMsIDB4NTNFRCwgMHgxMEYxLCAweDUzRUUsIDB4MTBFRiwKLSAgICAweDUzRUYsIDB4MDU0NCwgMHg1M0YwLCAweDBCNDYsIDB4NTNGMSwgMHgwOEU0LCAweDUzRjIsIDB4MDg5OSwKLSAgICAweDUzRjMsIDB4MDRDOCwgMHg1M0Y1LCAweDM4MjYsIDB4NTNGNiwgMHgwNUNFLCAweDUzRjcsIDB4MDdGOCwKLSAgICAweDUzRjgsIDB4MDg5OCwgMHg1M0ZBLCAweDEwRjIsIDB4NTQwMSwgMHgxMEYzLCAweDU0MDMsIDB4MDY2MywKLSAgICAweDU0MDQsIDB4MDVBNCwgMHg1NDA4LCAweDA3RjksIDB4NTQwOSwgMHgwNjYyLCAweDU0MEEsIDB4MEJGQiwKLSAgICAweDU0MEIsIDB4MDRDNywgMHg1NDBDLCAweDBDODksIDB4NTQwRCwgMHgwRUNBLCAweDU0MEUsIDB4MDdCMywKLSAgICAweDU0MEYsIDB4MEY2MywgMHg1NDEwLCAweDBDNDEsIDB4NTQxMSwgMHgwN0IyLCAweDU0MUIsIDB4MDcwNSwKLSAgICAweDU0MUQsIDB4MTBGQywgMHg1NDFGLCAweDA2REIsIDB4NTQyMCwgMHgwRTc4LCAweDU0MjYsIDB4MEQ3MSwKLSAgICAweDU0MjcsIDB4MzgyNywgMHg1NDI5LCAweDEwRkIsIDB4NTQyQiwgMHgwNjFBLCAweDU0MkMsIDB4MTBGNiwKLSAgICAweDU0MkQsIDB4MTBGNywgMHg1NDJFLCAweDEwRjksIDB4NTQzMywgMHgzNUMwLCAweDU0MzYsIDB4MTBGQSwKLSAgICAweDU0MzgsIDB4MDY3NSwgMHg1NDM5LCAweDBBMjcsIDB4NTQzQiwgMHgwREZELCAweDU0M0MsIDB4MTBGOCwKLSAgICAweDU0M0QsIDB4MTBGNCwgMHg1NDNFLCAweDA3OTcsIDB4NTQzRiwgMHgzNUNGLCAweDU0NDAsIDB4MTBGNSwKLSAgICAweDU0NDIsIDB4MEZDQSwgMHg1NDQ2LCAweDBFNDIsIDB4NTQ0OCwgMHgwQzA0LCAweDU0NDksIDB4MDc5NiwKLSAgICAweDU0NEEsIDB4MDgwMiwgMHg1NDRELCAweDM4MjgsIDB4NTQ0RSwgMHgxMEZELCAweDU0NTEsIDB4MENCNSwKLSAgICAweDU0NTUsIDB4MzcyMywgMHg1NDVGLCAweDExMDEsIDB4NTQ2NiwgMHgzODI5LCAweDU0NjgsIDB4MDkyQSwKLSAgICAweDU0NkEsIDB4MDkyMiwgMHg1NDZCLCAweDM4MkEsIDB4NTQ3MCwgMHgxMTA0LCAweDU0NzEsIDB4MTEwMiwKLSAgICAweDU0NzMsIDB4MEVBRiwgMHg1NDc0LCAweDM4MkIsIDB4NTQ3NSwgMHgxMEZGLCAweDU0NzYsIDB4MTEwOCwKLSAgICAweDU0NzcsIDB4MTEwMywgMHg1NDdCLCAweDExMDYsIDB4NTQ3QywgMHgwNzdBLCAweDU0N0QsIDB4MEVDQiwKLSAgICAweDU0ODAsIDB4MTEwNywgMHg1NDg0LCAweDExMDksIDB4NTQ4NiwgMHgxMTBCLCAweDU0OEEsIDB4MjBEQywKLSAgICAweDU0OEIsIDB4MDg2MCwgMHg1NDhDLCAweDBGRTgsIDB4NTQ4RCwgMHgzODJDLCAweDU0OEUsIDB4MTEwMCwKLSAgICAweDU0OEYsIDB4MTBGRSwgMHg1NDkwLCAweDExMEEsIDB4NTQ5MiwgMHgxMTA1LCAweDU0OTYsIDB4MzgyRCwKLSAgICAweDU0OUMsIDB4MjBEQiwgMHg1NEExLCAweDM4MkUsIDB4NTRBMiwgMHgxMTBELCAweDU0QTQsIDB4MTExNiwKLSAgICAweDU0QTUsIDB4MTEwRiwgMHg1NEE4LCAweDExMTMsIDB4NTRBOSwgMHgyMERELCAweDU0QUIsIDB4MTExNCwKLSAgICAweDU0QUMsIDB4MTExMCwgMHg1NEFELCAweDM4MkYsIDB4NTRBRiwgMHgxMTMxLCAweDU0QjIsIDB4MDg1OSwKLSAgICAweDU0QjMsIDB4MDU4RiwgMHg1NEI4LCAweDExMEUsIDB4NTRCOSwgMHgzODMwLCAweDU0QkMsIDB4MTExOCwKLSAgICAweDU0QkQsIDB4MDRCQSwgMHg1NEJFLCAweDExMTcsIDB4NTRCRiwgMHgzODMxLCAweDU0QzAsIDB4MDQ2OSwKLSAgICAweDU0QzEsIDB4MERCQywgMHg1NEMyLCAweDExMTUsIDB4NTRDNCwgMHgxMTExLCAweDU0QzYsIDB4MzgzMiwKLSAgICAweDU0QzcsIDB4MTEwQywgMHg1NEM4LCAweDExMTIsIDB4NTRDOSwgMHgwODM4LCAweDU0Q0QsIDB4MzgzMywKLSAgICAweDU0RDgsIDB4MTExOSwgMHg1NEUxLCAweDA0QkIsIDB4NTRFMiwgMHgxMTIyLCAweDU0RTUsIDB4MTExQSwKLSAgICAweDU0RTYsIDB4MTExQiwgMHg1NEU4LCAweDA5OEQsIDB4NTRFOSwgMHgwRTk3LCAweDU0RUQsIDB4MTEyMCwKLSAgICAweDU0RUUsIDB4MTExRiwgMHg1NEYyLCAweDBDMjksIDB4NTRGQSwgMHgxMTIxLCAweDU0RkQsIDB4MTExRSwKLSAgICAweDU0RkYsIDB4MjBERSwgMHg1NTA0LCAweDA0RDYsIDB4NTUwNiwgMHgwODI2LCAweDU1MDcsIDB4MDlGNiwKLSAgICAweDU1MEUsIDB4MzgzNCwgMHg1NTBGLCAweDExMUMsIDB4NTUxMCwgMHgwQzVDLCAweDU1MTQsIDB4MTExRCwKLSAgICAweDU1MTYsIDB4MDQ2NiwgMHg1NTJCLCAweDM4MzUsIDB4NTUyRSwgMHgxMTI3LCAweDU1MkYsIDB4MEYwRCwKLSAgICAweDU1MzEsIDB4MDk4RiwgMHg1NTMzLCAweDExMkQsIDB4NTUzNSwgMHgzODM2LCAweDU1MzgsIDB4MTEyQywKLSAgICAweDU1MzksIDB4MTEyMywgMHg1NTNFLCAweDBCMjMsIDB4NTU0MCwgMHgxMTI0LCAweDU1NDQsIDB4MEI0RiwKLSAgICAweDU1NDUsIDB4MTEyOSwgMHg1NTQ2LCAweDA5OEUsIDB4NTU0QSwgMHgzODM3LCAweDU1NEMsIDB4MTEyNiwKLSAgICAweDU1NEYsIDB4MEVGMCwgMHg1NTUzLCAweDA3MTIsIDB4NTU1NiwgMHgxMTJBLCAweDU1NTcsIDB4MTEyQiwKLSAgICAweDU1NUMsIDB4MTEyOCwgMHg1NTVELCAweDExMkUsIDB4NTU1RSwgMHgxREQxLCAweDU1NjAsIDB4MzgzOCwKLSAgICAweDU1NjEsIDB4MzgzOSwgMHg1NTYzLCAweDExMjUsIDB4NTU3QiwgMHgxMTM0LCAweDU1N0MsIDB4MTEzOSwKLSAgICAweDU1N0UsIDB4MTEzNSwgMHg1NTgwLCAweDExMzAsIDB4NTU4MywgMHgxMTNBLCAweDU1ODQsIDB4MEFCMywKLSAgICAweDU1ODYsIDB4MjBERiwgMHg1NTg3LCAweDExM0MsIDB4NTU4OCwgMHgzODNBLCAweDU1ODksIDB4MDdCNCwKLSAgICAweDU1OEEsIDB4MTEzMiwgMHg1NThCLCAweDBCQkIsIDB4NTU4RSwgMHgzODNCLCAweDU1OTgsIDB4MTEzNiwKLSAgICAweDU1OTksIDB4MTEyRiwgMHg1NTlBLCAweDA1RTksIDB4NTU5QywgMHgwNjJBLCAweDU1OUQsIDB4MDVDMywKLSAgICAweDU1OUUsIDB4MTEzNywgMHg1NTlGLCAweDExMzMsIDB4NTVBNywgMHgwNzRDLCAweDU1QTgsIDB4MTEzRCwKLSAgICAweDU1QTksIDB4MTEzQiwgMHg1NUFBLCAweDBBRDUsIDB4NTVBQiwgMHgwNjY0LCAweDU1QUMsIDB4MDZBNCwKLSAgICAweDU1QUUsIDB4MTEzOCwgMHg1NUIwLCAweDA2RUMsIDB4NTVCNiwgMHgwNEU2LCAweDU1QzQsIDB4MTE0MSwKLSAgICAweDU1QzUsIDB4MTEzRiwgMHg1NUM3LCAweDExNzgsIDB4NTVENCwgMHgxMTQ0LCAweDU1REEsIDB4MTEzRSwKLSAgICAweDU1REMsIDB4MTE0MiwgMHg1NURGLCAweDExNDAsIDB4NTVFMywgMHgwODlBLCAweDU1RTQsIDB4MTE0MywKLSAgICAweDU1RjcsIDB4MTE0NiwgMHg1NUY5LCAweDExNEIsIDB4NTVGRCwgMHgxMTQ5LCAweDU1RkUsIDB4MTE0OCwKLSAgICAweDU2MDYsIDB4MEI3MCwgMHg1NjA4LCAweDM4M0MsIDB4NTYwOSwgMHgwNTQ1LCAweDU2MEUsIDB4MzgzRCwKLSAgICAweDU2MEYsIDB4MzgzRSwgMHg1NjE0LCAweDExNDUsIDB4NTYxNiwgMHgxMTQ3LCAweDU2MTcsIDB4MDk5MCwKLSAgICAweDU2MTgsIDB4MDRENSwgMHg1NjFCLCAweDExNEEsIDB4NTYyMCwgMHgzQzFELCAweDU2MjksIDB4MDU1RSwKLSAgICAweDU2MkYsIDB4MTE1NSwgMHg1NjMxLCAweDA5RTQsIDB4NTYzMiwgMHgxMTUxLCAweDU2MzQsIDB4MTE0RiwKLSAgICAweDU2MzYsIDB4MTE1MCwgMHg1NjM3LCAweDM4M0YsIDB4NTYzOCwgMHgxMTUyLCAweDU2M0YsIDB4Mzg0MCwKLSAgICAweDU2NDIsIDB4MDRERiwgMHg1NjQ5LCAweDM4NDEsIDB4NTY0QiwgMHgzODQyLCAweDU2NEMsIDB4MEFCQiwKLSAgICAweDU2NEUsIDB4MTE0QywgMHg1NjRGLCAweDM4NDMsIDB4NTY1MCwgMHgxMTRELCAweDU2NTMsIDB4MUYxQiwKLSAgICAweDU2NUIsIDB4MDVEOCwgMHg1NjY0LCAweDExNTQsIDB4NTY2NiwgMHgzODQ0LCAweDU2NjgsIDB4MDYyQiwKLSAgICAweDU2NjksIDB4Mzg0NSwgMHg1NjZBLCAweDExNTcsIDB4NTY2QiwgMHgxMTUzLCAweDU2NkMsIDB4MTE1NiwKLSAgICAweDU2NkYsIDB4Mzg0NiwgMHg1NjcxLCAweDM4NDcsIDB4NTY3MiwgMHgzODQ4LCAweDU2NzQsIDB4MERGRSwKLSAgICAweDU2NzYsIDB4M0MzMywgMHg1Njc4LCAweDBDQUQsIDB4NTY3QSwgMHgwRDRDLCAweDU2ODAsIDB4MTE1OSwKLSAgICAweDU2ODYsIDB4MTE1OCwgMHg1Njg3LCAweDA1QTMsIDB4NTY4QSwgMHgxMTVBLCAweDU2OEYsIDB4MTE1RCwKLSAgICAweDU2OTQsIDB4MTE1QywgMHg1Njk1LCAweDM4NDksIDB4NTY5OSwgMHgxREU2LCAweDU2OUEsIDB4Mzg0QSwKLSAgICAweDU2QTAsIDB4MTE1QiwgMHg1NkEyLCAweDBDRUYsIDB4NTZBNSwgMHgxMTVFLCAweDU2QUMsIDB4Mzg0QiwKLSAgICAweDU2QUQsIDB4Mzg0QywgMHg1NkFFLCAweDExNUYsIDB4NTZCMSwgMHgzODRELCAweDU2QjQsIDB4MTE2MSwKLSAgICAweDU2QjYsIDB4MTE2MCwgMHg1NkJDLCAweDExNjMsIDB4NTZDMCwgMHgxMTY2LCAweDU2QzEsIDB4MTE2NCwKLSAgICAweDU2QzIsIDB4MTE2MiwgMHg1NkMzLCAweDExNjUsIDB4NTZDOCwgMHgxMTY3LCAweDU2QzksIDB4Mzg0RSwKLSAgICAweDU2Q0EsIDB4MUU1QSwgMHg1NkNFLCAweDExNjgsIDB4NTZEMSwgMHgxMTY5LCAweDU2RDMsIDB4MTE2QSwKLSAgICAweDU2RDcsIDB4MTE2QiwgMHg1NkQ4LCAweDEwN0MsIDB4NTZEQSwgMHgwOTI4LCAweDU2REIsIDB4MDg5QiwKLSAgICAweDU2REQsIDB4Mzg0RiwgMHg1NkRFLCAweDA1NzMsIDB4NTZFMCwgMHgwNEJDLCAweDU2RTMsIDB4MEI4MiwKLSAgICAweDU2RTQsIDB4Mzg1MCwgMHg1NkVFLCAweDExNkMsIDB4NTZGMCwgMHgwODE0LCAweDU2RjIsIDB4MDQ5MywKLSAgICAweDU2RjMsIDB4MEEyNCwgMHg1NkY5LCAweDExNkQsIDB4NTZGQSwgMHgwNzdCLCAweDU2RkQsIDB4MDgwMywKLSAgICAweDU2RkYsIDB4MTE2RiwgMHg1NzAwLCAweDExNkUsIDB4NTcwMywgMHgwRTMwLCAweDU3MDQsIDB4MTE3MCwKLSAgICAweDU3MDgsIDB4MTE3MiwgMHg1NzA5LCAweDExNzEsIDB4NTcwQSwgMHgzODUxLCAweDU3MEIsIDB4MTE3MywKLSAgICAweDU3MEQsIDB4MTE3NCwgMHg1NzBGLCAweDA3NEQsIDB4NTcxMiwgMHgwNTAyLCAweDU3MTMsIDB4MTE3NSwKLSAgICAweDU3MTUsIDB4Mzg1MiwgMHg1NzE2LCAweDExNzcsIDB4NTcxOCwgMHgxMTc2LCAweDU3MUMsIDB4MTE3OSwKLSAgICAweDU3MUYsIDB4MEM1NCwgMHg1NzIxLCAweDM2ODAsIDB4NTcyMywgMHgzODUzLCAweDU3MjYsIDB4MTE3QSwKLSAgICAweDU3MjcsIDB4MDQ3OSwgMHg1NzI4LCAweDA4NEYsIDB4NTcyRCwgMHgwNzEzLCAweDU3MkYsIDB4Mzg1NCwKLSAgICAweDU3MzAsIDB4MEI4RCwgMHg1NzMzLCAweDM4NTUsIDB4NTczNCwgMHgzODU2LCAweDU3MzcsIDB4MTE3QiwKLSAgICAweDU3MzgsIDB4MTE3QywgMHg1NzNCLCAweDExN0UsIDB4NTc0MCwgMHgxMTdGLCAweDU3NDIsIDB4MDg1NCwKLSAgICAweDU3NDcsIDB4MDZDOSwgMHg1NzRBLCAweDBFNjUsIDB4NTc0QywgMHgzODU3LCAweDU3NEUsIDB4MTE3RCwKLSAgICAweDU3NEYsIDB4MTE4MCwgMHg1NzUwLCAweDA4MzEsIDB4NTc1MSwgMHgwN0I1LCAweDU3NTksIDB4MjBFMCwKLSAgICAweDU3NjEsIDB4MTE4NCwgMHg1NzY0LCAweDA4MTUsIDB4NTc2NSwgMHgyMEUxLCAweDU3NjYsIDB4MEI3MSwKLSAgICAweDU3NjksIDB4MTE4MSwgMHg1NzZBLCAweDBCRjYsIDB4NTc3MCwgMHgzODU4LCAweDU3N0YsIDB4MTE4NSwKLSAgICAweDU3ODIsIDB4MEEyOCwgMHg1Nzg4LCAweDExODMsIDB4NTc4OSwgMHgxMTg2LCAweDU3OEIsIDB4MDcxNSwKLSAgICAweDU3OEMsIDB4Mzg1OSwgMHg1NzkzLCAweDExODcsIDB4NTc5QywgMHgzODVBLCAweDU3QTAsIDB4MTE4OCwKLSAgICAweDU3QTIsIDB4MDdCNiwgMHg1N0EzLCAweDA1OUUsIDB4NTdBNCwgMHgxMThBLCAweDU3QUEsIDB4MTE4QiwKLSAgICAweDU3QUMsIDB4MjBFMiwgMHg1N0IwLCAweDExOEMsIDB4NTdCMywgMHgxMTg5LCAweDU3QjgsIDB4Mzg1QiwKLSAgICAweDU3QzAsIDB4MTE4MiwgMHg1N0MzLCAweDExOEQsIDB4NTdDNiwgMHgxMThFLCAweDU3QzcsIDB4MjBFNCwKLSAgICAweDU3QzgsIDB4MjBFMywgMHg1N0NCLCAweDBFOTIsIDB4NTdDRSwgMHgwOUQzLCAweDU3RDIsIDB4MTE5MCwKLSAgICAweDU3RDMsIDB4MTE5MSwgMHg1N0Q0LCAweDExOEYsIDB4NTdENiwgMHgxMTkzLCAweDU3REMsIDB4MENFRSwKLSAgICAweDU3REYsIDB4MDRBQywgMHg1N0UwLCAweDBEQzgsIDB4NTdFMywgMHgxMTk0LCAweDU3RTYsIDB4Mzg1QywKLSAgICAweDU3RUQsIDB4Mzg1RCwgMHg1N0Y0LCAweDA5RTUsIDB4NTdGNSwgMHgzODVFLCAweDU3RjYsIDB4Mzg1RiwKLSAgICAweDU3RjcsIDB4MDhFNSwgMHg1N0Y5LCAweDBEMTMsIDB4NTdGQSwgMHgwNjJDLCAweDU3RkMsIDB4MDg1QiwKLSAgICAweDU3RkYsIDB4Mzg2MCwgMHg1ODAwLCAweDBFODcsIDB4NTgwMiwgMHgwQzhBLCAweDU4MDUsIDB4MDc0RSwKLSAgICAweDU4MDYsIDB4MEIyRiwgMHg1ODA5LCAweDM4NjEsIDB4NTgwQSwgMHgxMTkyLCAweDU4MEIsIDB4MTE5NSwKLSAgICAweDU4MTUsIDB4MEIyNCwgMHg1ODE5LCAweDExOTYsIDB4NTgxRCwgMHgxMTk3LCAweDU4MjAsIDB4Mzg2MiwKLSAgICAweDU4MjEsIDB4MTE5OSwgMHg1ODI0LCAweDBDMDUsIDB4NTgyQSwgMHgwNUVBLCAweDU4MkYsIDB4MUQzMiwKLSAgICAweDU4MzAsIDB4MDUwMywgMHg1ODMxLCAweDBFNDMsIDB4NTgzMiwgMHgzODYzLCAweDU4MzQsIDB4MDlENCwKLSAgICAweDU4MzUsIDB4MEM0MiwgMHg1ODNBLCAweDA4NTYsIDB4NTgzRCwgMHgxMTlGLCAweDU4NDAsIDB4MEUwRCwKLSAgICAweDU4NDEsIDB4MEZBNSwgMHg1ODRBLCAweDA1NzQsIDB4NTg0QiwgMHgxMTlCLCAweDU4NTEsIDB4MEFCQywKLSAgICAweDU4NTIsIDB4MTE5RSwgMHg1ODU0LCAweDBDNUQsIDB4NTg1NywgMHgwQzQzLCAweDU4NTgsIDB4MEM1RSwKLSAgICAweDU4NTksIDB4MEQ0RCwgMHg1ODVBLCAweDBCRTksIDB4NTg1RSwgMHgwODM5LCAweDU4NjEsIDB4MUU0NywKLSAgICAweDU4NjIsIDB4MTE5QSwgMHg1ODY5LCAweDA1MTgsIDB4NTg2QiwgMHgwQzMwLCAweDU4NzAsIDB4MTE5QywKLSAgICAweDU4NzIsIDB4MTE5OCwgMHg1ODc1LCAweDBBMTYsIDB4NTg3OSwgMHgxMUEwLCAweDU4N0MsIDB4Mzg2NCwKLSAgICAweDU4N0UsIDB4MDk1OCwgMHg1ODgwLCAweDM4NjUsIDB4NTg4MywgMHgwNkE1LCAweDU4ODUsIDB4MTFBMSwKLSAgICAweDU4OTMsIDB4MEUzOCwgMHg1ODk3LCAweDBBRkYsIDB4NTg5QywgMHgwQkUyLCAweDU4OUUsIDB4MjBFNywKLSAgICAweDU4OUYsIDB4MTFBMywgMHg1OEE4LCAweDBFN0QsIDB4NThBOSwgMHgzODY2LCAweDU4QUIsIDB4MTFBNCwKLSAgICAweDU4QUUsIDB4MTFBOSwgMHg1OEIyLCAweDIwRTgsIDB4NThCMywgMHgwREZGLCAweDU4QjgsIDB4MTFBOCwKLSAgICAweDU4QjksIDB4MTFBMiwgMHg1OEJBLCAweDExQTUsIDB4NThCQiwgMHgxMUE3LCAweDU4QkUsIDB4MDgxNiwKLSAgICAweDU4QzEsIDB4MEUxOSwgMHg1OEM1LCAweDExQUEsIDB4NThDNywgMHgwQjgzLCAweDU4Q0EsIDB4MDU3NSwKLSAgICAweDU4Q0MsIDB4MDlENSwgMHg1OENFLCAweDM4NjcsIDB4NThEMCwgMHgzODY4LCAweDU4RDEsIDB4MTFBQywKLSAgICAweDU4RDMsIDB4MTFBQiwgMHg1OEQ0LCAweDM4NjksIDB4NThENSwgMHgwN0ZBLCAweDU4RDcsIDB4MTFBRCwKLSAgICAweDU4RDgsIDB4MTFBRiwgMHg1OEQ5LCAweDExQUUsIDB4NThEQSwgMHgzODZBLCAweDU4REMsIDB4MTFCMSwKLSAgICAweDU4REUsIDB4MTFBNiwgMHg1OERGLCAweDExQjMsIDB4NThFNCwgMHgxMUIyLCAweDU4RTUsIDB4MTFCMCwKLSAgICAweDU4RTksIDB4Mzg2QiwgMHg1OEVCLCAweDA4OUMsIDB4NThFQywgMHgwQTE3LCAweDU4RUUsIDB4MEFENiwKLSAgICAweDU4RUYsIDB4MTFCNCwgMHg1OEYwLCAweDBBNjAsIDB4NThGMSwgMHgwNEIxLCAweDU4RjIsIDB4MEQxQSwKLSAgICAweDU4RjcsIDB4MEJGNywgMHg1OEY5LCAweDExQjYsIDB4NThGQSwgMHgxMUI1LCAweDU4RkIsIDB4MTFCNywKLSAgICAweDU4RkMsIDB4MTFCOCwgMHg1OEZELCAweDExQjksIDB4NTkwMiwgMHgxMUJBLCAweDU5MDksIDB4MEUyMSwKLSAgICAweDU5MEEsIDB4MTFCQiwgMHg1OTBCLCAweDIwRTksIDB4NTkwQywgMHgzODZDLCAweDU5MEYsIDB4MDU0NiwKLSAgICAweDU5MTAsIDB4MTFCQywgMHg1OTE1LCAweDBGMjYsIDB4NTkxNiwgMHgwNThFLCAweDU5MTgsIDB4MTBERSwKLSAgICAweDU5MTksIDB4MDk1MiwgMHg1OTFBLCAweDBCMUYsIDB4NTkxQiwgMHgxMUJELCAweDU5MUMsIDB4MEVGNywKLSAgICAweDU5MjIsIDB4MEVDMCwgMHg1OTI0LCAweDM4NkQsIDB4NTkyNSwgMHgxMUJGLCAweDU5MjcsIDB4MEI0NywKLSAgICAweDU5MjksIDB4MEMzMSwgMHg1OTJBLCAweDBCMjAsIDB4NTkyQiwgMHgwREM5LCAweDU5MkMsIDB4MTFDMCwKLSAgICAweDU5MkQsIDB4MTFDMSwgMHg1OTJFLCAweDA1MUQsIDB4NTkyRiwgMHgzODZFLCAweDU5MzEsIDB4MDhFNiwKLSAgICAweDU5MzIsIDB4MTFDMiwgMHg1OTM3LCAweDA0OTQsIDB4NTkzOCwgMHgxMUMzLCAweDU5MzksIDB4MzcyNSwKLSAgICAweDU5M0UsIDB4MTFDNCwgMHg1OTQ0LCAweDA1MDQsIDB4NTk0NywgMHgwNjJELCAweDU5NDgsIDB4MENCOCwKLSAgICAweDU5NDksIDB4MEU0NCwgMHg1OTRFLCAweDExQzgsIDB4NTk0RiwgMHgwQUQ3LCAweDU5NTAsIDB4MTFDNywKLSAgICAweDU5NTEsIDB4MDcxNiwgMHg1OTUzLCAweDIwRUEsIDB4NTk1NCwgMHgwRTg5LCAweDU5NTUsIDB4MTFDNiwKLSAgICAweDU5NTcsIDB4MEM1RiwgMHg1OTU4LCAweDExQ0EsIDB4NTk1QSwgMHgxMUM5LCAweDU5NUIsIDB4MjBFQiwKLSAgICAweDU5NUQsIDB4MjBFQywgMHg1OTYwLCAweDExQ0MsIDB4NTk2MSwgMHgzODZGLCAweDU5NjIsIDB4MTFDQiwKLSAgICAweDU5NjMsIDB4MjBFRCwgMHg1OTY1LCAweDA1MUUsIDB4NTk2NywgMHgxMUNELCAweDU5NjgsIDB4MDk5MSwKLSAgICAweDU5NjksIDB4MTFDRiwgMHg1OTZBLCAweDBCNjMsIDB4NTk2QywgMHgxMUNFLCAweDU5NkQsIDB4Mzg3MCwKLSAgICAweDU5NkUsIDB4MEUwMywgMHg1OTczLCAweDA5ODEsIDB4NTk3NCwgMHgwQzU1LCAweDU5NzgsIDB4MTFEMCwKLSAgICAweDU5N0QsIDB4MDdCNywgMHg1OTgxLCAweDExRDEsIDB4NTk4MiwgMHgwQ0Q3LCAweDU5ODMsIDB4MEQ3MiwKLSAgICAweDU5ODQsIDB4MEVERCwgMHg1OThBLCAweDBDREIsIDB4NTk4RCwgMHgxMURBLCAweDU5OTMsIDB4MDY1MiwKLSAgICAweDU5OTYsIDB4MEYyRiwgMHg1OTk5LCAweDBFQkIsIDB4NTk5QiwgMHgxMjM5LCAweDU5OUQsIDB4MTFEMiwKLSAgICAweDU5QTMsIDB4MTFENSwgMHg1OUE0LCAweDIwRUUsIDB4NTlBNSwgMHgwQjI1LCAweDU5QTgsIDB4MEU2NiwKLSAgICAweDU5QUMsIDB4MEM0NCwgMHg1OUIyLCAweDExRDYsIDB4NTlCOSwgMHgwRTkzLCAweDU5QkEsIDB4MjBFRiwKLSAgICAweDU5QkIsIDB4MDgzQSwgMHg1OUJFLCAweDA5OTIsIDB4NTlDNiwgMHgxMUQ3LCAweDU5QzksIDB4MDg5RSwKLSAgICAweDU5Q0EsIDB4Mzg3MSwgMHg1OUNCLCAweDA4OUQsIDB4NTlEMCwgMHgwNDdELCAweDU5RDEsIDB4MDc3QywKLSAgICAweDU5RDIsIDB4Mzg3MiwgMHg1OUQzLCAweDBBNEYsIDB4NTlENCwgMHgwNDk1LCAweDU5RDksIDB4MTFEQiwKLSAgICAweDU5REEsIDB4MTFEQywgMHg1OURDLCAweDExRDksIDB4NTlERCwgMHgzODczLCAweDU5RTMsIDB4Mzg3NCwKLSAgICAweDU5RTQsIDB4Mzg3NSwgMHg1OUU1LCAweDA0REEsIDB4NTlFNiwgMHgwNUVCLCAweDU5RTgsIDB4MTFEOCwKLSAgICAweDU5RUEsIDB4MEVEMSwgMHg1OUVCLCAweDBEQTMsIDB4NTlFQywgMHgzNkFELCAweDU5RjYsIDB4MDQ2QywKLSAgICAweDU5RkIsIDB4MDRCRCwgMHg1OUZGLCAweDA4OUYsIDB4NUEwMSwgMHgwNDk2LCAweDVBMDMsIDB4MDQ2NywKLSAgICAweDVBMDQsIDB4Mzg3NiwgMHg1QTA5LCAweDExRTEsIDB4NUEwQywgMHgzODc3LCAweDVBMTEsIDB4MTFERiwKLSAgICAweDVBMTgsIDB4MEVDOCwgMHg1QTFBLCAweDExRTIsIDB4NUExQiwgMHgzNUMxLCAweDVBMUMsIDB4MTFFMCwKLSAgICAweDVBMUYsIDB4MTFERSwgMHg1QTIwLCAweDA5RjcsIDB4NUEyMywgMHgzODc4LCAweDVBMjUsIDB4MTFERCwKLSAgICAweDVBMjksIDB4MEUyQSwgMHg1QTJGLCAweDA3OTgsIDB4NUEzNSwgMHgxMUU2LCAweDVBMzYsIDB4MTFFNywKLSAgICAweDVBM0MsIDB4MDk5MywgMHg1QTQwLCAweDExRTMsIDB4NUE0MSwgMHgwRkQyLCAweDVBNDYsIDB4MEQwMiwKLSAgICAweDVBNDcsIDB4Mzg3OSwgMHg1QTQ5LCAweDExRTUsIDB4NUE1NSwgMHgzODdBLCAweDVBNUEsIDB4MDgxNywKLSAgICAweDVBNjIsIDB4MTFFOCwgMHg1QTYzLCAweDM4N0IsIDB4NUE2NiwgMHgwRENBLCAweDVBNkEsIDB4MTFFOSwKLSAgICAweDVBNkMsIDB4MTFFNCwgMHg1QTZELCAweDM4N0MsIDB4NUE3RSwgMHgzODdELCAweDVBN0YsIDB4MEVDNywKLSAgICAweDVBOTIsIDB4MEQxNCwgMHg1QTlBLCAweDExRUEsIDB4NUE5QiwgMHgwREE0LCAweDVBOUUsIDB4Mzg3RSwKLSAgICAweDVBQTcsIDB4Mzg3RiwgMHg1QUFDLCAweDM4ODAsIDB4NUFCMywgMHgzODgxLCAweDVBQkMsIDB4MTFFQiwKLSAgICAweDVBQkQsIDB4MTFFRiwgMHg1QUJFLCAweDExRUMsIDB4NUFDMSwgMHgwNTQ3LCAweDVBQzIsIDB4MTFFRSwKLSAgICAweDVBQzksIDB4MDhFNywgMHg1QUNCLCAweDExRUQsIDB4NUFDQywgMHgwNzRGLCAweDVBRDAsIDB4MTFGQiwKLSAgICAweDVBRDYsIDB4MTFGNCwgMHg1QUQ3LCAweDExRjEsIDB4NUFFMCwgMHgzODgyLCAweDVBRTEsIDB4MEJBMiwKLSAgICAweDVBRTMsIDB4MTFGMCwgMHg1QUU2LCAweDExRjIsIDB4NUFFOSwgMHgxMUYzLCAweDVBRkEsIDB4MTFGNSwKLSAgICAweDVBRkIsIDB4MTFGNiwgMHg1QjAwLCAweDM4ODMsIDB4NUIwOSwgMHgwNjJFLCAweDVCMEIsIDB4MTFGOCwKLSAgICAweDVCMEMsIDB4MTFGNywgMHg1QjE2LCAweDExRjksIDB4NUIxOSwgMHgzODg0LCAweDVCMjIsIDB4MDlENiwKLSAgICAweDVCMjUsIDB4Mzg4NSwgMHg1QjJBLCAweDExRkMsIDB4NUIyQywgMHgwQkY4LCAweDVCMkQsIDB4Mzg4NiwKLSAgICAweDVCMzAsIDB4MDRFNywgMHg1QjMyLCAweDExRkEsIDB4NUIzNiwgMHgxMUZELCAweDVCM0UsIDB4MTFGRSwKLSAgICAweDVCNDAsIDB4MTIwMSwgMHg1QjQxLCAweDM4ODcsIDB4NUI0MywgMHgxMUZGLCAweDVCNDUsIDB4MTIwMCwKLSAgICAweDVCNTAsIDB4MDhBMCwgMHg1QjUxLCAweDEyMDIsIDB4NUI1NCwgMHgwN0I4LCAweDVCNTUsIDB4MTIwMywKLSAgICAweDVCNTYsIDB4MjBGMCwgMHg1QjU3LCAweDA4QzgsIDB4NUI1OCwgMHgwQjE4LCAweDVCNUEsIDB4MTIwNCwKLSAgICAweDVCNUIsIDB4MTIwNSwgMHg1QjVDLCAweDA4QTgsIDB4NUI1RCwgMHgwN0I5LCAweDVCNUYsIDB4MEVERSwKLSAgICAweDVCNjMsIDB4MDY0MiwgMHg1QjY0LCAweDA3N0QsIDB4NUI2NSwgMHgxMjA2LCAweDVCNjYsIDB4MDVCNiwKLSAgICAweDVCNjksIDB4MTIwNywgMHg1QjZCLCAweDBCMTksIDB4NUI3MCwgMHgxMjA4LCAweDVCNzEsIDB4MTIzMCwKLSAgICAweDVCNzMsIDB4MTIwOSwgMHg1Qjc1LCAweDEyMEEsIDB4NUI3OCwgMHgxMjBCLCAweDVCN0EsIDB4MTIwRCwKLSAgICAweDVCN0MsIDB4Mzg4OCwgMHg1QjdFLCAweDM4ODksIDB4NUI3RiwgMHgzODhBLCAweDVCODAsIDB4MTIwRSwKLSAgICAweDVCODIsIDB4MzYxMCwgMHg1QjgzLCAweDEyMEYsIDB4NUI4NSwgMHgwQjUwLCAweDVCODcsIDB4MDRDOSwKLSAgICAweDVCODgsIDB4MDkxNSwgMHg1Qjg5LCAweDA0ODYsIDB4NUI4QSwgMHgzODhCLCAweDVCOEIsIDB4MEFEOSwKLSAgICAweDVCOEMsIDB4MDVFQywgMHg1QjhELCAweDA4RTEsIDB4NUI4RiwgMHgwN0JBLCAweDVCOTUsIDB4MEM2MCwKLSAgICAweDVCOTcsIDB4MDkyQiwgMHg1Qjk4LCAweDA1RUQsIDB4NUI5OSwgMHgwQkE2LCAweDVCOUEsIDB4MEMwNiwKLSAgICAweDVCOUIsIDB4MDQ3QywgMHg1QjlDLCAweDA2NTMsIDB4NUI5RCwgMHgwRTQ1LCAweDVCOUYsIDB4MDhFRSwKLSAgICAweDVCQTIsIDB4MDY2QywgMHg1QkEzLCAweDBBOEYsIDB4NUJBNCwgMHgwOEU4LCAweDVCQTUsIDB4MEYxMiwKLSAgICAweDVCQTYsIDB4MTIxMCwgMHg1QkFFLCAweDA2NzYsIDB4NUJCMCwgMHgwODNCLCAweDVCQjMsIDB4MDU5MCwKLSAgICAweDVCQjQsIDB4MDUwNSwgMHg1QkI1LCAweDA5OTQsIDB4NUJCNiwgMHgwNTQ4LCAweDVCQjgsIDB4MTIxMSwKLSAgICAweDVCQjksIDB4MEYzMCwgMHg1QkJGLCAweDA5NTMsIDB4NUJDMCwgMHgyMEYxLCAweDVCQzIsIDB4MDkxMCwKLSAgICAweDVCQzMsIDB4MTIxMiwgMHg1QkM0LCAweDA2MkYsIDB4NUJDNSwgMHgwQ0FBLCAweDVCQzYsIDB4MEVCNSwKLSAgICAweDVCQzcsIDB4MTIxMywgMHg1QkM5LCAweDEyMTQsIDB4NUJDQywgMHgwRENCLCAweDVCRDAsIDB4MTIxNiwKLSAgICAweDVCRDIsIDB4MDVFNCwgMHg1QkQzLCAweDA2RUYsIDB4NUJENCwgMHgxMjE1LCAweDVCRDgsIDB4MjBGMywKLSAgICAweDVCREIsIDB4MDVFRSwgMHg1QkRELCAweDA5RjgsIDB4NUJERSwgMHgxMjFBLCAweDVCREYsIDB4MDg2RiwKLSAgICAweDVCRTEsIDB4MDU0OSwgMHg1QkUyLCAweDEyMTksIDB4NUJFNCwgMHgxMjE3LCAweDVCRTUsIDB4MTIxQiwKLSAgICAweDVCRTYsIDB4MTIxOCwgMHg1QkU3LCAweDBDRTEsIDB4NUJFOCwgMHgxNDhFLCAweDVCRTksIDB4MDlGOSwKLSAgICAweDVCRUIsIDB4MTIxQywgMHg1QkVDLCAweDIwRjQsIDB4NUJFRSwgMHgwRjg4LCAweDVCRjAsIDB4MTIxRCwKLSAgICAweDVCRjMsIDB4MTIxRiwgMHg1QkY1LCAweDBCQkMsIDB4NUJGNiwgMHgxMjFFLCAweDVCRjgsIDB4MEE0NywKLSAgICAweDVCRkEsIDB4MDhDOSwgMHg1QkZFLCAweDBCMzAsIDB4NUJGRiwgMHgwOTIzLCAweDVDMDEsIDB4MERFNywKLSAgICAweDVDMDIsIDB4MEE5MCwgMHg1QzA0LCAweDA4RjksIDB4NUMwNSwgMHgxMjIwLCAweDVDMDYsIDB4MDk5NSwKLSAgICAweDVDMDcsIDB4MTIyMSwgMHg1QzA4LCAweDEyMjIsIDB4NUMwOSwgMHgwNDk3LCAweDVDMEEsIDB4MEIxQSwKLSAgICAweDVDMEIsIDB4MEExOCwgMHg1QzBELCAweDEyMjMsIDB4NUMwRSwgMHgwQzhCLCAweDVDMEYsIDB4MDk5NiwKLSAgICAweDVDMTEsIDB4MDk5NywgMHg1QzEzLCAweDEyMjQsIDB4NUMxNCwgMHgzNzJBLCAweDVDMTYsIDB4MEE5MSwKLSAgICAweDVDMTksIDB4MzYwQiwgMHg1QzFBLCAweDA5OTgsIDB4NUMxRSwgMHgyMEY1LCAweDVDMjAsIDB4MTIyNSwKLSAgICAweDVDMjIsIDB4MTIyNiwgMHg1QzIzLCAweDM4OEMsIDB4NUMyNCwgMHgwRUVDLCAweDVDMjgsIDB4MTIyNywKLSAgICAweDVDMkIsIDB4Mzg4RCwgMHg1QzJELCAweDA2QkUsIDB4NUMzMCwgMHgzODhFLCAweDVDMzEsIDB4MDkyQywKLSAgICAweDVDMzgsIDB4MTIyOCwgMHg1QzM5LCAweDEyMjksIDB4NUMzQSwgMHgwOTA4LCAweDVDM0IsIDB4MDlGMiwKLSAgICAweDVDM0MsIDB4MENDQywgMHg1QzNELCAweDBBMUEsIDB4NUMzRSwgMHgwRDhDLCAweDVDM0YsIDB4MENEOCwKLSAgICAweDVDNDAsIDB4MDZDMSwgMHg1QzQxLCAweDEyMkEsIDB4NUM0NSwgMHgwNjg5LCAweDVDNDYsIDB4MTIyQiwKLSAgICAweDVDNDgsIDB4MDZGNiwgMHg1QzRBLCAweDBDQTcsIDB4NUM0QiwgMHgwNTMwLCAweDVDNEQsIDB4MDhBMSwKLSAgICAweDVDNEUsIDB4MTIyQywgMHg1QzRGLCAweDEyMkYsIDB4NUM1MCwgMHgxMjJFLCAweDVDNTEsIDB4MDZGNSwKLSAgICAweDVDNTMsIDB4MTIyRCwgMHg1QzU1LCAweDBDMzIsIDB4NUM1QiwgMHgxRTkyLCAweDVDNUUsIDB4MEIxMCwKLSAgICAweDVDNjAsIDB4MEM0NSwgMHg1QzYxLCAweDA4RjQsIDB4NUM2MiwgMHgxRTBELCAweDVDNjMsIDB4Mzg4RiwKLSAgICAweDVDNjQsIDB4MEFEQSwgMHg1QzY1LCAweDBGNjQsIDB4NUM2OSwgMHgzODkwLCAweDVDNkMsIDB4MTIzMSwKLSAgICAweDVDNkUsIDB4MTIzMiwgMHg1QzZGLCAweDBDQUUsIDB4NUM3MSwgMHgwODgxLCAweDVDNzYsIDB4MTIzNCwKLSAgICAweDVDNzksIDB4MTIzNSwgMHg1QzdDLCAweDM4OTEsIDB4NUM4QywgMHgxMjM2LCAweDVDOTAsIDB4MDYzMCwKLSAgICAweDVDOTEsIDB4MTIzNywgMHg1Qzk0LCAweDEyMzgsIDB4NUNBMSwgMHgwNTJDLCAweDVDQTYsIDB4MjBGNiwKLSAgICAweDVDQTgsIDB4MEFCRCwgMHg1Q0E5LCAweDA2MjAsIDB4NUNBQiwgMHgxMjNBLCAweDVDQUMsIDB4MEVCNCwKLSAgICAweDVDQjEsIDB4MEIzMiwgMHg1Q0IzLCAweDA1QjcsIDB4NUNCNiwgMHgxMjNDLCAweDVDQjcsIDB4MTIzRSwKLSAgICAweDVDQjgsIDB4MDYxQiwgMHg1Q0JBLCAweDIwRjcsIDB4NUNCQiwgMHgxMjNCLCAweDVDQkMsIDB4MTIzRCwKLSAgICAweDVDQkUsIDB4MTI0MCwgMHg1Q0M1LCAweDEyM0YsIDB4NUNDNywgMHgxMjQxLCAweDVDQ0IsIDB4Mzg5MiwKLSAgICAweDVDRDIsIDB4Mzg5MywgMHg1Q0Q5LCAweDEyNDIsIDB4NUNFMCwgMHgwQzk1LCAweDVDRTEsIDB4MDZBNiwKLSAgICAweDVDRTYsIDB4MzcyQywgMHg1Q0U4LCAweDA1NjUsIDB4NUNFOSwgMHgxMjQzLCAweDVDRUEsIDB4MTI0OCwKLSAgICAweDVDRUQsIDB4MTI0NiwgMHg1Q0VGLCAweDBFNDcsIDB4NUNGMCwgMHgwRTQ2LCAweDVDRjQsIDB4Mzg5NCwKLSAgICAweDVDRjUsIDB4MjBGOCwgMHg1Q0Y2LCAweDBDNjEsIDB4NUNGQSwgMHgxMjQ1LCAweDVDRkIsIDB4MDk1RSwKLSAgICAweDVDRkQsIDB4MTI0NCwgMHg1RDA3LCAweDBBMzgsIDB4NUQwQiwgMHgxMjQ5LCAweDVEMEUsIDB4MDg1QSwKLSAgICAweDVEMTEsIDB4MTI0RiwgMHg1RDE0LCAweDEyNTAsIDB4NUQxNSwgMHgxMjRBLCAweDVEMTYsIDB4MDU5MSwKLSAgICAweDVEMTcsIDB4MTI0QiwgMHg1RDE4LCAweDEyNTQsIDB4NUQxOSwgMHgxMjUzLCAweDVEMUEsIDB4MTI1MiwKLSAgICAweDVEMUIsIDB4MTI0RSwgMHg1RDFGLCAweDEyNEQsIDB4NUQyMiwgMHgxMjUxLCAweDVEMjQsIDB4Mzg5NSwKLSAgICAweDVEMjYsIDB4Mzg5NiwgMHg1RDI3LCAweDIwRjksIDB4NUQyOSwgMHgwRTQ4LCAweDVENDIsIDB4MjBGQywKLSAgICAweDVENDMsIDB4Mzg5NywgMHg1RDQ2LCAweDM4OTgsIDB4NUQ0QSwgMHgzODk5LCAweDVENEIsIDB4MTI1OCwKLSAgICAweDVENEMsIDB4MTI1NSwgMHg1RDRFLCAweDEyNTcsIDB4NUQ1MCwgMHgwRjVDLCAweDVENTIsIDB4MTI1NiwKLSAgICAweDVENTMsIDB4MjBGQSwgMHg1RDVDLCAweDEyNEMsIDB4NUQ2OSwgMHgwQTM5LCAweDVENkMsIDB4MTI1OSwKLSAgICAweDVENkQsIDB4MjBGRCwgMHg1RDZGLCAweDA4MjcsIDB4NUQ3MywgMHgxMjVBLCAweDVENzYsIDB4MTI1QiwKLSAgICAweDVEODIsIDB4MTI1RSwgMHg1RDg0LCAweDEyNUQsIDB4NUQ4NywgMHgxMjVDLCAweDVEOEIsIDB4MEM2MiwKLSAgICAweDVEOEMsIDB4MTI0NywgMHg1RDkwLCAweDEyNjQsIDB4NUQ5MiwgMHgzODlBLCAweDVEOTQsIDB4Mzg5QiwKLSAgICAweDVEOTksIDB4Mzg5QywgMHg1RDlELCAweDEyNjAsIDB4NURBMCwgMHgzODlELCAweDVEQTIsIDB4MTI1RiwKLSAgICAweDVEQUMsIDB4MTI2MSwgMHg1REFFLCAweDEyNjIsIDB4NURCMiwgMHgzQkE1LCAweDVEQjcsIDB4MTI2NSwKLSAgICAweDVEQjgsIDB4MjBGRSwgMHg1REI5LCAweDIwRkYsIDB4NURCQSwgMHgwRkFFLCAweDVEQkMsIDB4MTI2NiwKLSAgICAweDVEQkQsIDB4MTI2MywgMHg1REM5LCAweDEyNjcsIDB4NURDQywgMHgwNjFDLCAweDVEQ0QsIDB4MTI2OCwKLSAgICAweDVERDAsIDB4MjEwMCwgMHg1REQyLCAweDEyNkEsIDB4NUREMywgMHgxMjY5LCAweDVERDYsIDB4MTI2QiwKLSAgICAweDVERDgsIDB4Mzg5RSwgMHg1RERCLCAweDEyNkMsIDB4NURERCwgMHgwQTkyLCAweDVEREUsIDB4MDkyRCwKLSAgICAweDVERTAsIDB4Mzg5RiwgMHg1REUxLCAweDA5NkUsIDB4NURFMiwgMHgzNDMyLCAweDVERTMsIDB4MEFFNSwKLSAgICAweDVERTUsIDB4MDdCQiwgMHg1REU2LCAweDA4MjgsIDB4NURFNywgMHgwN0JDLCAweDVERTgsIDB4MDY4QSwKLSAgICAweDVERUIsIDB4MTI2RCwgMHg1REVFLCAweDA4MjksIDB4NURGMSwgMHgwNzdFLCAweDVERjIsIDB4MTI2RSwKLSAgICAweDVERjMsIDB4MEVCMiwgMHg1REY0LCAweDBDRjksIDB4NURGNSwgMHgxMjZGLCAweDVERjcsIDB4MDdCRCwKLSAgICAweDVERjgsIDB4MzhBMCwgMHg1REZCLCAweDA1RTgsIDB4NURGRCwgMHgwQjY1LCAweDVERkUsIDB4MDZDQSwKLSAgICAweDVERkYsIDB4MzVFMiwgMHg1RTAwLCAweDM4QTEsIDB4NUUwMiwgMHgwOEEyLCAweDVFMDMsIDB4MERDRCwKLSAgICAweDVFMDYsIDB4MEQ1NSwgMHg1RTBCLCAweDEyNzAsIDB4NUUwQywgMHgwNjMxLCAweDVFMTEsIDB4MTI3MywKLSAgICAweDVFMTIsIDB4MzhBMiwgMHg1RTE0LCAweDM4QTMsIDB4NUUxNSwgMHgzOEE0LCAweDVFMTYsIDB4MEJCRCwKLSAgICAweDVFMTgsIDB4MzhBNSwgMHg1RTE5LCAweDEyNzIsIDB4NUUxQSwgMHgxMjcxLCAweDVFMUIsIDB4MTI3NCwKLSAgICAweDVFMUQsIDB4MEMwNywgMHg1RTI1LCAweDBBMjksIDB4NUUyQiwgMHgwOEEzLCAweDVFMkQsIDB4MEE2RSwKLSAgICAweDVFMkUsIDB4MzhBNiwgMHg1RTJGLCAweDBCMzMsIDB4NUUzMCwgMHgwNjNDLCAweDVFMzMsIDB4MEJCRSwKLSAgICAweDVFMzYsIDB4MTI3NSwgMHg1RTM3LCAweDEyNzYsIDB4NUUzOCwgMHgwOUQ3LCAweDVFM0QsIDB4MEU2NywKLSAgICAweDVFNDAsIDB4MTI3OSwgMHg1RTQzLCAweDEyNzgsIDB4NUU0NCwgMHgxMjc3LCAweDVFNDUsIDB4MERFRiwKLSAgICAweDVFNDcsIDB4MTI4MCwgMHg1RTRDLCAweDBFODgsIDB4NUU0RSwgMHgxMjdBLCAweDVFNTQsIDB4MTI3QywKLSAgICAweDVFNTUsIDB4MEU5OSwgMHg1RTU3LCAweDEyN0IsIDB4NUU1OCwgMHgzOEE3LCAweDVFNUYsIDB4MTI3RCwKLSAgICAweDVFNjEsIDB4MEQzQywgMHg1RTYyLCAweDEyN0UsIDB4NUU2MywgMHgwRTBFLCAweDVFNjQsIDB4MTI3RiwKLSAgICAweDVFNkIsIDB4MzhBOCwgMHg1RTZDLCAweDM4QTksIDB4NUU3MiwgMHgwNUVGLCAweDVFNzMsIDB4MEUwRiwKLSAgICAweDVFNzQsIDB4MENFNSwgMHg1RTc1LCAweDEyODEsIDB4NUU3NiwgMHgxMjgyLCAweDVFNzgsIDB4MDdCRSwKLSAgICAweDVFNzksIDB4MDVGMCwgMHg1RTdBLCAweDEyODMsIDB4NUU3QiwgMHgwNzZDLCAweDVFN0MsIDB4MEYyRSwKLSAgICAweDVFN0QsIDB4MEYxMywgMHg1RTdFLCAweDA2MzIsIDB4NUU3RiwgMHgxMjg1LCAweDVFODEsIDB4MEJCRiwKLSAgICAweDVFODMsIDB4MDdCRiwgMHg1RTg0LCAweDA5OTksIDB4NUU4NywgMHgwRDczLCAweDVFOEEsIDB4MDk5QSwKLSAgICAweDVFOEYsIDB4MDk4MiwgMHg1RTk1LCAweDBDMDgsIDB4NUU5NiwgMHgwRTQ5LCAweDVFOTcsIDB4MEMzMywKLSAgICAweDVFOTksIDB4MzZCMCwgMHg1RTlBLCAweDA3QzAsIDB4NUU5QywgMHgwRENFLCAweDVFQTAsIDB4MTI4NiwKLSAgICAweDVFQTYsIDB4MEM1MywgMHg1RUE3LCAweDA4MzIsIDB4NUVBOCwgMHgzOEFBLCAweDVFQUEsIDB4MzhBQiwKLSAgICAweDVFQUIsIDB4MDc3RiwgMHg1RUFELCAweDBDMDksIDB4NUVCNSwgMHgwNDg3LCAweDVFQjYsIDB4MDk3OCwKLSAgICAweDVFQjcsIDB4MDdDMSwgMHg1RUI4LCAweDBGMzEsIDB4NUVCRSwgMHgzOEFDLCAweDVFQkYsIDB4MzhBRCwKLSAgICAweDVFQzEsIDB4MTI4NywgMHg1RUMyLCAweDEyODgsIDB4NUVDMywgMHgwRDA3LCAweDVFQzgsIDB4MTI4OSwKLSAgICAweDVFQzksIDB4MEZCRiwgMHg1RUNBLCAweDBGRDMsIDB4NUVDQiwgMHgzOEFFLCAweDVFQ0YsIDB4MTI4QiwKLSAgICAweDVFRDAsIDB4MTI4QSwgMHg1RUQyLCAweDM4QUYsIDB4NUVEMywgMHgwNUE1LCAweDVFRDYsIDB4MTI4QywKLSAgICAweDVFREEsIDB4MTI4RiwgMHg1RURCLCAweDEyOTAsIDB4NUVERCwgMHgxMjhFLCAweDVFREYsIDB4MERCMiwKLSAgICAweDVFRTAsIDB4MDk5QiwgMHg1RUUxLCAweDEyOTIsIDB4NUVFMiwgMHgxMjkxLCAweDVFRTMsIDB4MTI4RCwKLSAgICAweDVFRTgsIDB4MTI5MywgMHg1RUU5LCAweDEyOTQsIDB4NUVFQywgMHgxMjk1LCAweDVFRjAsIDB4MTI5OCwKLSAgICAweDVFRjEsIDB4MTI5NiwgMHg1RUYzLCAweDEyOTcsIDB4NUVGNCwgMHgxMjk5LCAweDVFRjYsIDB4MDUwNiwKLSAgICAweDVFRjcsIDB4MEMwQSwgMHg1RUY4LCAweDEyOUEsIDB4NUVGQSwgMHgwNzUwLCAweDVFRkIsIDB4MDU3NiwKLSAgICAweDVFRkMsIDB4MENFQywgMHg1RUZFLCAweDEyOUIsIDB4NUVGRiwgMHgwQ0QzLCAweDVGMDEsIDB4MEUyQiwKLSAgICAweDVGMDMsIDB4MTI5QywgMHg1RjA0LCAweDBGRDQsIDB4NUYwNywgMHgzOEIwLCAweDVGMDksIDB4MTI5RCwKLSAgICAweDVGMEEsIDB4MEUxMCwgMHg1RjBCLCAweDEyQTAsIDB4NUYwQywgMHgwRkZBLCAweDVGMEQsIDB4MTAwQSwKLSAgICAweDVGMEUsIDB4MzhCMSwgMHg1RjBGLCAweDA4REMsIDB4NUYxMCwgMHgwQ0NELCAweDVGMTEsIDB4MTJBMSwKLSAgICAweDVGMTMsIDB4MDY3NywgMHg1RjE0LCAweDBCQzAsIDB4NUYxNSwgMHgwNEJFLCAweDVGMTYsIDB4MTJBMiwKLSAgICAweDVGMTcsIDB4MERGNiwgMHg1RjE4LCAweDA3QzIsIDB4NUYxQiwgMHgwQjhFLCAweDVGMUMsIDB4MzhCMiwKLSAgICAweDVGMUQsIDB4MzhCMywgMHg1RjFGLCAweDBDMEIsIDB4NUYyMSwgMHgyMTAxLCAweDVGMjIsIDB4MzhCNCwKLSAgICAweDVGMjUsIDB4MEVGQiwgMHg1RjI2LCAweDA3NkQsIDB4NUYyNywgMHgwNzgwLCAweDVGMjgsIDB4MzhCNSwKLSAgICAweDVGMjksIDB4MTJBMywgMHg1RjJELCAweDEyQTQsIDB4NUYyRiwgMHgxMkFBLCAweDVGMzEsIDB4MDkxMSwKLSAgICAweDVGMzQsIDB4MjEwMiwgMHg1RjM1LCAweDBCQzEsIDB4NUYzNiwgMHgzOEI2LCAweDVGMzcsIDB4MDZBNywKLSAgICAweDVGMzgsIDB4MTJBNSwgMHg1RjNBLCAweDM1OTgsIDB4NUYzQiwgMHgzOEI3LCAweDVGM0MsIDB4MEQ5RCwKLSAgICAweDVGM0UsIDB4MEI4NCwgMHg1RjQwLCAweDM4QjgsIDB4NUY0MSwgMHgxMkE2LCAweDVGNDUsIDB4MjBCMiwKLSAgICAweDVGNDgsIDB4MTJBNywgMHg1RjRBLCAweDA2QTgsIDB4NUY0QywgMHgxMkE4LCAweDVGNEUsIDB4MTJBOSwKLSAgICAweDVGNTAsIDB4MzhCOSwgMHg1RjUxLCAweDEyQUIsIDB4NUY1MywgMHgwQzcwLCAweDVGNTYsIDB4MTJBQywKLSAgICAweDVGNTcsIDB4MTJBRCwgMHg1RjU4LCAweDM4QkEsIDB4NUY1OSwgMHgxMkFFLCAweDVGNUMsIDB4MTI5RiwKLSAgICAweDVGNUQsIDB4MTI5RSwgMHg1RjYxLCAweDEyQUYsIDB4NUY2MiwgMHgwNzE3LCAweDVGNjQsIDB4MzhCQiwKLSAgICAweDVGNjUsIDB4MzZBQywgMHg1RjY2LCAweDBEOTksIDB4NUY2NywgMHgyMTAzLCAweDVGNjksIDB4MDgzQywKLSAgICAweDVGNkEsIDB4MERBOSwgMHg1RjZCLCAweDBCQzIsIDB4NUY2QywgMHgwREJELCAweDVGNkQsIDB4MTJCMCwKLSAgICAweDVGNzAsIDB4MDk5QywgMHg1RjcxLCAweDA0RTgsIDB4NUY3MywgMHgxMkIxLCAweDVGNzcsIDB4MTJCMiwKLSAgICAweDVGNzksIDB4MEVGRSwgMHg1RjdDLCAweDBENzQsIDB4NUY3RiwgMHgxMkI1LCAweDVGODAsIDB4MDUxRiwKLSAgICAweDVGODEsIDB4MEE1MCwgMHg1RjgyLCAweDEyQjQsIDB4NUY4MywgMHgxMkIzLCAweDVGODQsIDB4MDcxOCwKLSAgICAweDVGODUsIDB4MEIzNCwgMHg1Rjg3LCAweDEyQjksIDB4NUY4OCwgMHgxMkI3LCAweDVGODksIDB4MzhCQywKLSAgICAweDVGOEEsIDB4MTJCNiwgMHg1RjhCLCAweDBGNkYsIDB4NUY4QywgMHgwNzk5LCAweDVGOTAsIDB4MDk4MywKLSAgICAweDVGOTEsIDB4MTJCOCwgMHg1RjkyLCAweDBDNDYsIDB4NUY5MywgMHgwOTQ4LCAweDVGOTcsIDB4MEM5OCwKLSAgICAweDVGOTgsIDB4MTJCQywgMHg1Rjk5LCAweDEyQkIsIDB4NUY5QywgMHgzOEJELCAweDVGOUUsIDB4MTJCQSwKLSAgICAweDVGQTAsIDB4MTJCRCwgMHg1RkExLCAweDA3OUEsIDB4NUZBNCwgMHgzOEJGLCAweDVGQTcsIDB4MzhCRSwKLSAgICAweDVGQTgsIDB4MTJCRSwgMHg1RkE5LCAweDBERUUsIDB4NUZBQSwgMHgwOTY1LCAweDVGQUQsIDB4MTJCRiwKLSAgICAweDVGQUUsIDB4MEQ4RCwgMHg1RkFGLCAweDM4QzAsIDB4NUZCMywgMHgwQzk5LCAweDVGQjQsIDB4MEJDMywKLSAgICAweDVGQjUsIDB4MzQzOCwgMHg1RkI3LCAweDIxMDQsIDB4NUZCOCwgMHgzOEMxLCAweDVGQjksIDB4MEMyQSwKLSAgICAweDVGQkMsIDB4MTJDMCwgMHg1RkJELCAweDA2NDUsIDB4NUZDMywgMHgwOUZBLCAweDVGQzQsIDB4MzhDMiwKLSAgICAweDVGQzUsIDB4MEQ5RSwgMHg1RkM5LCAweDM4QzMsIDB4NUZDQywgMHgwNjMzLCAweDVGQ0QsIDB4MENEQywKLSAgICAweDVGRDYsIDB4MTJDMSwgMHg1RkQ3LCAweDA4QTQsIDB4NUZEOCwgMHgwRTY4LCAweDVGRDksIDB4MEU2OSwKLSAgICAweDVGREMsIDB4MDUyMCwgMHg1RkRELCAweDEyQzYsIDB4NUZERSwgMHgyMTA1LCAweDVGRTAsIDB4MEJBNywKLSAgICAweDVGRTEsIDB4MzhDNCwgMHg1RkU0LCAweDEyQzMsIDB4NUZFOSwgMHgzOEM1LCAweDVGRUIsIDB4MDU3NywKLSAgICAweDVGRUQsIDB4MzhDNiwgMHg1RkYwLCAweDEyRjYsIDB4NUZGMSwgMHgxMkM1LCAweDVGRjUsIDB4MENFNiwKLSAgICAweDVGRjgsIDB4MTJDNCwgMHg1RkZCLCAweDEyQzIsIDB4NUZGQywgMHgzOEM3LCAweDVGRkQsIDB4MDgwQywKLSAgICAweDVGRkYsIDB4MTJDOCwgMHg2MDBFLCAweDEyQ0UsIDB4NjAwRiwgMHgxMkQ0LCAweDYwMTAsIDB4MTJDQywKLSAgICAweDYwMTIsIDB4MEM1NiwgMHg2MDE1LCAweDEyRDEsIDB4NjAxNiwgMHgwRENGLCAweDYwMTcsIDB4MzhDOCwKLSAgICAweDYwMTksIDB4MTJDQiwgMHg2MDFBLCAweDM4QzksIDB4NjAxQiwgMHgxMkQwLCAweDYwMUMsIDB4MEZBRiwKLSAgICAweDYwMUQsIDB4MDhBNSwgMHg2MDIwLCAweDBCMzUsIDB4NjAyMSwgMHgxMkM5LCAweDYwMjUsIDB4MDY3OCwKLSAgICAweDYwMjYsIDB4MTJEMywgMHg2MDI3LCAweDBBNTEsIDB4NjAyOCwgMHgwNTA3LCAweDYwMjksIDB4MTJDRCwKLSAgICAweDYwMkEsIDB4MDU3OCwgMHg2MDJCLCAweDEyRDIsIDB4NjAyRiwgMHgwNkE5LCAweDYwMzEsIDB4MTJDRiwKLSAgICAweDYwMzMsIDB4MzhDQSwgMHg2MDNBLCAweDEyRDUsIDB4NjA0MSwgMHgxMkQ3LCAweDYwNDIsIDB4MTJFMSwKLSAgICAweDYwNDMsIDB4MTJERiwgMHg2MDQ2LCAweDEyREMsIDB4NjA0QSwgMHgxMkRCLCAweDYwNEIsIDB4MEZDMCwKLSAgICAweDYwNEQsIDB4MTJERCwgMHg2MDUwLCAweDA2QUEsIDB4NjA1MiwgMHgwN0MzLCAweDYwNTUsIDB4MDk4NCwKLSAgICAweDYwNTksIDB4MTJFNCwgMHg2MDVBLCAweDEyRDYsIDB4NjA1RCwgMHgyMTA2LCAweDYwNUYsIDB4MTJEQSwKLSAgICAweDYwNjAsIDB4MTJDQSwgMHg2MDYxLCAweDM4Q0IsIDB4NjA2MiwgMHgwNTdBLCAweDYwNjMsIDB4MTJERSwKLSAgICAweDYwNjQsIDB4MTJFMCwgMHg2MDY1LCAweDBCOEYsIDB4NjA2OCwgMHgwODE4LCAweDYwNjksIDB4MDUzOCwKLSAgICAweDYwNkEsIDB4MTJEOCwgMHg2MDZCLCAweDEyRTMsIDB4NjA2QywgMHgxMkUyLCAweDYwNkQsIDB4MDZBQiwKLSAgICAweDYwNkYsIDB4MEIwOSwgMHg2MDcwLCAweDA1QzQsIDB4NjA3NSwgMHgwNzE5LCAweDYwNzcsIDB4MTJEOSwKLSAgICAweDYwN0YsIDB4MzhDQywgMHg2MDgxLCAweDEyRTUsIDB4NjA4MywgMHgxMkU4LCAweDYwODQsIDB4MTJFQSwKLSAgICAweDYwODUsIDB4MjEwNywgMHg2MDg5LCAweDA4RTksIDB4NjA4QSwgMHgyMTA4LCAweDYwOEIsIDB4MTJGMCwKLSAgICAweDYwOEMsIDB4MEMwQywgMHg2MDhELCAweDEyRTYsIDB4NjA5MiwgMHgxMkVFLCAweDYwOTQsIDB4MDU3OSwKLSAgICAweDYwOTYsIDB4MTJFQywgMHg2MDk3LCAweDEyRUQsIDB4NjA5QSwgMHgxMkU5LCAweDYwOUIsIDB4MTJFQiwKLSAgICAweDYwOUUsIDB4MzhDRCwgMHg2MDlGLCAweDA3OUIsIDB4NjBBMCwgMHgwRjE0LCAweDYwQTMsIDB4MDVGMSwKLSAgICAweDYwQTQsIDB4MzhDRSwgMHg2MEE2LCAweDA0RkIsIDB4NjBBNywgMHgxMkVGLCAweDYwQTksIDB4MENGMCwKLSAgICAweDYwQUEsIDB4MDQ3MSwgMHg2MEIwLCAweDM4Q0YsIDB4NjBCMiwgMHgwRDc1LCAweDYwQjMsIDB4MTJDNywKLSAgICAweDYwQjQsIDB4MTJGNSwgMHg2MEI1LCAweDEyRjksIDB4NjBCNiwgMHgwRUYxLCAweDYwQjgsIDB4MTJGMiwKLSAgICAweDYwQkMsIDB4MEM2MywgMHg2MEJELCAweDEyRjcsIDB4NjBDNSwgMHgwOUQ4LCAweDYwQzYsIDB4MTJGOCwKLSAgICAweDYwQzcsIDB4MENBRiwgMHg2MENCLCAweDM4RDAsIDB4NjBEMSwgMHgwRkVELCAweDYwRDMsIDB4MTJGNCwKLSAgICAweDYwRDUsIDB4MjEwQSwgMHg2MEQ4LCAweDEyRkEsIDB4NjBEQSwgMHgwODBELCAweDYwREIsIDB4MzhEMSwKLSAgICAweDYwREMsIDB4MEE2RiwgMHg2MERFLCAweDIxMDksIDB4NjBERiwgMHgwNDk4LCAweDYwRTAsIDB4MTJGMywKLSAgICAweDYwRTEsIDB4MTJGMSwgMHg2MEUzLCAweDBBREMsIDB4NjBFNywgMHgxMkU3LCAweDYwRTgsIDB4MDg4MiwKLSAgICAweDYwRjAsIDB4MEIyNiwgMHg2MEYxLCAweDEzMDYsIDB4NjBGMiwgMHgyMTBDLCAweDYwRjMsIDB4MEFERCwKLSAgICAweDYwRjQsIDB4MTMwMSwgMHg2MEY2LCAweDEyRkUsIDB4NjBGNywgMHgxMkZGLCAweDYwRjgsIDB4MzhEMiwKLSAgICAweDYwRjksIDB4MDkxMiwgMHg2MEZBLCAweDEzMDIsIDB4NjBGQiwgMHgxMzA1LCAweDYxMDAsIDB4MTMwMCwKLSAgICAweDYxMDEsIDB4MDkyRiwgMHg2MTAzLCAweDEzMDMsIDB4NjEwNiwgMHgxMkZELCAweDYxMDgsIDB4MEYwOCwKLSAgICAweDYxMDksIDB4MEYwNywgMHg2MTBELCAweDEzMDcsIDB4NjEwRSwgMHgxMzA4LCAweDYxMEYsIDB4MDQ5OSwKLSAgICAweDYxMTEsIDB4MjEwRCwgMHg2MTEyLCAweDM4RDMsIDB4NjExMywgMHgzOEQ0LCAweDYxMTQsIDB4MzhENSwKLSAgICAweDYxMTUsIDB4MTJGQywgMHg2MTFBLCAweDA2RUEsIDB4NjExQiwgMHgwNDZBLCAweDYxMUMsIDB4MzhENiwKLSAgICAweDYxMUYsIDB4MDVGMiwgMHg2MTIwLCAweDIxMEIsIDB4NjEyMSwgMHgxMzA0LCAweDYxMjcsIDB4MTMwQywKLSAgICAweDYxMjgsIDB4MTMwQiwgMHg2MTJDLCAweDEzMTAsIDB4NjEzMCwgMHgyMTBGLCAweDYxMzQsIDB4MTMxMSwKLSAgICAweDYxMzcsIDB4MjEwRSwgMHg2MTNDLCAweDEzMEYsIDB4NjEzRCwgMHgxMzEyLCAweDYxM0UsIDB4MTMwQSwKLSAgICAweDYxM0YsIDB4MTMwRSwgMHg2MTQyLCAweDEzMTMsIDB4NjE0NCwgMHgxMzE0LCAweDYxNDcsIDB4MTMwOSwKLSAgICAweDYxNDgsIDB4MDhDQSwgMHg2MTRBLCAweDEzMEQsIDB4NjE0QiwgMHgwQjM2LCAweDYxNEMsIDB4MDdDNCwKLSAgICAweDYxNEQsIDB4MTJGQiwgMHg2MTRFLCAweDA5RkIsIDB4NjE1MywgMHgxMzIxLCAweDYxNTUsIDB4MEUzOSwKLSAgICAweDYxNTgsIDB4MTMxNywgMHg2MTU5LCAweDEzMTgsIDB4NjE1QSwgMHgxMzE5LCAweDYxNUQsIDB4MTMyMCwKLSAgICAweDYxNUYsIDB4MTMxRiwgMHg2MTYyLCAweDBFQUIsIDB4NjE2MywgMHgwNUYzLCAweDYxNjUsIDB4MTMxRCwKLSAgICAweDYxNjcsIDB4MDcxQiwgMHg2MTY4LCAweDA1OTIsIDB4NjE2QiwgMHgxMzFBLCAweDYxNkUsIDB4MEY4MCwKLSAgICAweDYxNkYsIDB4MTMxQywgMHg2MTcwLCAweDA0OUEsIDB4NjE3MSwgMHgxMzFFLCAweDYxNzMsIDB4MTMxNSwKLSAgICAweDYxNzQsIDB4MTMxQiwgMHg2MTc1LCAweDEzMjIsIDB4NjE3NiwgMHgwNzFBLCAweDYxNzcsIDB4MTMxNiwKLSAgICAweDYxN0MsIDB4MzhENywgMHg2MTdFLCAweDBGNDcsIDB4NjE4MiwgMHgwRjE1LCAweDYxODcsIDB4MTMyNSwKLSAgICAweDYxOEEsIDB4MTMyOSwgMHg2MThELCAweDM4RDgsIDB4NjE4RSwgMHgwQjAwLCAweDYxOTAsIDB4MEZDMSwKLSAgICAweDYxOTEsIDB4MTMyQSwgMHg2MTk0LCAweDEzMjcsIDB4NjE5NiwgMHgxMzI0LCAweDYxOTgsIDB4MjExMCwKLSAgICAweDYxOTksIDB4MTMyMywgMHg2MTlBLCAweDEzMjgsIDB4NjE5RiwgMHgzOEQ5LCAweDYxQTQsIDB4MEUwMCwKLSAgICAweDYxQTcsIDB4MEM4QywgMHg2MUE4LCAweDM4REEsIDB4NjFBOSwgMHgwNzFDLCAweDYxQUIsIDB4MTMyQiwKLSAgICAweDYxQUMsIDB4MTMyNiwgMHg2MUFFLCAweDEzMkMsIDB4NjFCMiwgMHgwNzUxLCAweDYxQjYsIDB4MDUzMSwKLSAgICAweDYxQkEsIDB4MTMzNCwgMHg2MUJFLCAweDA1RjQsIDB4NjFDMiwgMHgzOERCLCAweDYxQzMsIDB4MTMzMiwKLSAgICAweDYxQzYsIDB4MTMzMywgMHg2MUM3LCAweDA4MTksIDB4NjFDOCwgMHgxMzMxLCAweDYxQzksIDB4MTMyRiwKLSAgICAweDYxQ0EsIDB4MTMyRSwgMHg2MUNCLCAweDEzMzUsIDB4NjFDQywgMHgxMzJELCAweDYxQ0QsIDB4MTMzNywKLSAgICAweDYxRDAsIDB4MDU3QiwgMHg2MURGLCAweDM4REMsIDB4NjFFMywgMHgxMzM5LCAweDYxRTYsIDB4MTMzOCwKLSAgICAweDYxRjIsIDB4MEJDNCwgMHg2MUY0LCAweDEzM0MsIDB4NjFGNiwgMHgxMzNBLCAweDYxRjcsIDB4MTMzMCwKLSAgICAweDYxRjgsIDB4MDc1MiwgMHg2MUZBLCAweDEzM0IsIDB4NjFGQywgMHgxMzNGLCAweDYxRkQsIDB4MTMzRSwKLSAgICAweDYxRkUsIDB4MTM0MCwgMHg2MUZGLCAweDEzM0QsIDB4NjIwMCwgMHgxMzQxLCAweDYyMDgsIDB4MTM0MiwKLSAgICAweDYyMDksIDB4MTM0MywgMHg2MjBBLCAweDBFM0EsIDB4NjIwQywgMHgxMzQ1LCAweDYyMEQsIDB4MTM0NCwKLSAgICAweDYyMEUsIDB4MDk0OSwgMHg2MjEwLCAweDBBNTIsIDB4NjIxMSwgMHgwNTY2LCAweDYyMTIsIDB4MDU3QywKLSAgICAweDYyMTMsIDB4MjExMSwgMHg2MjE0LCAweDEzNDYsIDB4NjIxNSwgMHgzOERELCAweDYyMTYsIDB4MDQ4MywKLSAgICAweDYyMUEsIDB4MEE3MCwgMHg2MjFCLCAweDEzNDcsIDB4NjIxRCwgMHgxQTY0LCAweDYyMUUsIDB4MTM0OCwKLSAgICAweDYyMUYsIDB4MDczNywgMHg2MjIxLCAweDEzNDksIDB4NjIyNiwgMHgwQTkzLCAweDYyMjksIDB4MzhERSwKLSAgICAweDYyMkEsIDB4MTM0QSwgMHg2MjJFLCAweDEzNEIsIDB4NjIyRiwgMHgwNjU0LCAweDYyMzAsIDB4MTM0QywKLSAgICAweDYyMzIsIDB4MTM0RCwgMHg2MjMzLCAweDEzNEUsIDB4NjIzNCwgMHgwQjM3LCAweDYyMzYsIDB4MzVCRCwKLSAgICAweDYyMzgsIDB4MDc4MSwgMHg2MjNCLCAweDBFRUQsIDB4NjIzRSwgMHgzNDRFLCAweDYyM0YsIDB4MEU2QSwKLSAgICAweDYyNDAsIDB4MDk3NCwgMHg2MjQxLCAweDEzNEYsIDB4NjI0MywgMHgzOERGLCAweDYyNDYsIDB4MzhFMCwKLSAgICAweDYyNDcsIDB4MEE5NCwgMHg2MjQ4LCAweDFCMUEsIDB4NjI0OSwgMHgwRDc2LCAweDYyNEIsIDB4MDkxNiwKLSAgICAweDYyNEMsIDB4MzhFMSwgMHg2MjRELCAweDA4M0QsIDB4NjI0RSwgMHgxMzUwLCAweDYyNTEsIDB4MzhFMiwKLSAgICAweDYyNTMsIDB4MEIyNywgMHg2MjU1LCAweDBERjcsIDB4NjI1NiwgMHgzOEUzLCAweDYyNTgsIDB4MEI1MSwKLSAgICAweDYyNUIsIDB4MTM1MywgMHg2MjVFLCAweDEzNTEsIDB4NjI2MCwgMHgxMzU0LCAweDYyNjMsIDB4MTM1MiwKLSAgICAweDYyNjgsIDB4MTM1NSwgMHg2MjZFLCAweDBFMDEsIDB4NjI3MSwgMHgwNDdCLCAweDYyNzYsIDB4MEREMCwKLSAgICAweDYyNzksIDB4MEQ3NywgMHg2MjdDLCAweDEzNTYsIDB4NjI3RSwgMHgxMzU5LCAweDYyN0YsIDB4MDk5RCwKLSAgICAweDYyODAsIDB4MDY1NSwgMHg2MjgyLCAweDEzNTcsIDB4NjI4MywgMHgxMzVFLCAweDYyODQsIDB4MDk5RSwKLSAgICAweDYyODUsIDB4MzVDNSwgMHg2Mjg5LCAweDEzNTgsIDB4NjI4QSwgMHgwQ0ZBLCAweDYyOTEsIDB4MEY0OCwKLSAgICAweDYyOTIsIDB4MTM1QSwgMHg2MjkzLCAweDEzNUIsIDB4NjI5NCwgMHgxMzVGLCAweDYyOTUsIDB4MEM2NCwKLSAgICAweDYyOTYsIDB4MTM1QywgMHg2Mjk3LCAweDA3QzUsIDB4NjI5OCwgMHgwQTgyLCAweDYyOUIsIDB4MTM2RCwKLSAgICAweDYyOUMsIDB4MEQ0OCwgMHg2MjlFLCAweDBCNTIsIDB4NjJBNiwgMHgyMTEyLCAweDYyQUIsIDB4MEQ3OCwKLSAgICAweDYyQUMsIDB4MTNCMiwgMHg2MkIxLCAweDBFNEEsIDB4NjJCNSwgMHgwQzBELCAweDYyQjksIDB4MEVBMywKLSAgICAweDYyQkIsIDB4MTM2MiwgMHg2MkJDLCAweDA1MjEsIDB4NjJCRCwgMHgwQkE4LCAweDYyQzIsIDB4MTM2QiwKLSAgICAweDYyQzQsIDB4MzhFNCwgMHg2MkM1LCAweDBCNzIsIDB4NjJDNiwgMHgxMzY1LCAweDYyQzcsIDB4MTM2QywKLSAgICAweDYyQzgsIDB4MTM2NywgMHg2MkM5LCAweDEzNkUsIDB4NjJDQSwgMHgxMzZBLCAweDYyQ0MsIDB4MTM2OSwKLSAgICAweDYyQ0QsIDB4MEQyNSwgMHg2MkNGLCAweDEzNjMsIDB4NjJEMCwgMHgwNTdELCAweDYyRDEsIDB4MTM2MSwKLSAgICAweDYyRDIsIDB4MDY4QiwgMHg2MkQzLCAweDBCNTMsIDB4NjJENCwgMHgxMzVELCAweDYyRDcsIDB4MTM2MCwKLSAgICAweDYyRDgsIDB4MDdDNiwgMHg2MkQ5LCAweDBBN0YsIDB4NjJEQiwgMHgwOTlGLCAweDYyREMsIDB4MTM2OCwKLSAgICAweDYyREQsIDB4MEQwOCwgMHg2MkUwLCAweDA2OEMsIDB4NjJFMSwgMHgwNUE2LCAweDYyRUMsIDB4MDVDNSwKLSAgICAweDYyRUQsIDB4MDlFNywgMHg2MkVFLCAweDEzNzAsIDB4NjJFRiwgMHgxMzc1LCAweDYyRjEsIDB4MTM3MSwKLSAgICAweDYyRjMsIDB4MDc1MywgMHg2MkY1LCAweDEzNzYsIDB4NjJGNiwgMHgwODcwLCAweDYyRjcsIDB4MDdGQiwKLSAgICAweDYyRkMsIDB4MzhFNSwgMHg2MkZFLCAweDA5MzAsIDB4NjJGRiwgMHgxMzY0LCAweDYzMDEsIDB4MDhDQiwKLSAgICAweDYzMDIsIDB4MTM3MywgMHg2MzA3LCAweDA4QTYsIDB4NjMwOCwgMHgxMzc0LCAweDYzMDksIDB4MDQ4OCwKLSAgICAweDYzMEEsIDB4MzhFNiwgMHg2MzBDLCAweDEzNkYsIDB4NjMwRCwgMHgzOEU3LCAweDYzMTEsIDB4MEJDNSwKLSAgICAweDYzMTgsIDB4MzhFOCwgMHg2MzE5LCAweDA2OEQsIDB4NjMxQiwgMHgzNzM3LCAweDYzMUYsIDB4MDZBQywKLSAgICAweDYzMjcsIDB4MTM3MiwgMHg2MzI4LCAweDA0NkIsIDB4NjMyQiwgMHgwODMzLCAweDYzMkYsIDB4MDlGQywKLSAgICAweDYzMzksIDB4MzhFOSwgMHg2MzNBLCAweDBDMEUsIDB4NjMzRCwgMHgwRDY4LCAweDYzM0UsIDB4MTM3OCwKLSAgICAweDYzM0YsIDB4MEFFMCwgMHg2MzQyLCAweDM4RUEsIDB4NjM0MywgMHgzOEVCLCAweDYzNDksIDB4MEIwQSwKLSAgICAweDYzNEMsIDB4MDg3OSwgMHg2MzRELCAweDEzNzksIDB4NjM0RiwgMHgxMzdCLCAweDYzNTAsIDB4MTM3NywKLSAgICAweDYzNTUsIDB4MEUzMSwgMHg2MzU3LCAweDBCRDksIDB4NjM1QywgMHgwQURFLCAweDYzNjUsIDB4MzhFQywKLSAgICAweDYzNjcsIDB4MEU0QiwgMHg2MzY4LCAweDA4RkEsIDB4NjM2OSwgMHgxMzg3LCAweDYzNkIsIDB4MTM4NiwKLSAgICAweDYzNkUsIDB4MEEzRSwgMHg2MzcyLCAweDA3NTQsIDB4NjM3NCwgMHgzOEVELCAweDYzNzYsIDB4MTM4MCwKLSAgICAweDYzNzcsIDB4MDlBMSwgMHg2MzdBLCAweDBDQzAsIDB4NjM3QiwgMHgwQ0U3LCAweDYzN0QsIDB4MzhFRSwKLSAgICAweDYzODAsIDB4MTM3RSwgMHg2MzgzLCAweDBBREYsIDB4NjM4NCwgMHgzOEVGLCAweDYzODcsIDB4MzhGMCwKLSAgICAweDYzODgsIDB4MDkyNCwgMHg2Mzg5LCAweDEzODMsIDB4NjM4QywgMHgwOUEwLCAweDYzOEUsIDB4MTM3RCwKLSAgICAweDYzOEYsIDB4MTM4MiwgMHg2MzkwLCAweDM4RjEsIDB4NjM5MiwgMHgwRDA5LCAweDYzOTYsIDB4MTM3QywKLSAgICAweDYzOTgsIDB4MDZGNywgMHg2MzlCLCAweDA1QkIsIDB4NjM5RSwgMHgzOEYyLCAweDYzOUYsIDB4MTM4NCwKLSAgICAweDYzQTAsIDB4MEY3MywgMHg2M0ExLCAweDA4M0UsIDB4NjNBMiwgMHgwQjczLCAweDYzQTMsIDB4MTM4MSwKLSAgICAweDYzQTUsIDB4MEE4MCwgMHg2M0E3LCAweDA3QzcsIDB4NjNBOCwgMHgwQTJBLCAweDYzQTksIDB4MDUwOCwKLSAgICAweDYzQUEsIDB4MEFCRSwgMHg2M0FCLCAweDEzN0YsIDB4NjNBQywgMHgwNjVGLCAweDYzQjIsIDB4MDcxRCwKLSAgICAweDYzQjQsIDB4MEJFQiwgMHg2M0I1LCAweDEzODUsIDB4NjNCQiwgMHgwQUUxLCAweDYzQkUsIDB4MTM4OCwKLSAgICAweDYzQzAsIDB4MTM4QSwgMHg2M0MzLCAweDBCMTcsIDB4NjNDNCwgMHgxMzkwLCAweDYzQzYsIDB4MTM4QiwKLSAgICAweDYzQzksIDB4MTM4RCwgMHg2M0NGLCAweDBEQjMsIDB4NjNEMCwgMHgwQzBGLCAweDYzRDEsIDB4MzhGMywKLSAgICAweDYzRDIsIDB4MTM4RSwgMHg2M0Q2LCAweDBGMTYsIDB4NjNEQSwgMHgwRjMyLCAweDYzREIsIDB4MDVGNSwKLSAgICAweDYzREMsIDB4MzhGNCwgMHg2M0UxLCAweDA0NzIsIDB4NjNFMywgMHgxMzhDLCAweDYzRTksIDB4MTM4OSwKLSAgICAweDYzRUQsIDB4MzQxQywgMHg2M0VFLCAweDA2MzQsIDB4NjNGNCwgMHgwNTA5LCAweDYzRjUsIDB4MjExMywKLSAgICAweDYzRjYsIDB4MTM4RiwgMHg2M0Y3LCAweDM2NDQsIDB4NjNGQSwgMHgwRjMzLCAweDY0MDYsIDB4MTM5MywKLSAgICAweDY0MDksIDB4MzhGNSwgMHg2NDBELCAweDBCMUIsIDB4NjQwRiwgMHgxMzlBLCAweDY0MTAsIDB4MzhGNiwKLSAgICAweDY0MTMsIDB4MTM5NCwgMHg2NDE0LCAweDFFMkMsIDB4NjQxNiwgMHgxMzkxLCAweDY0MTcsIDB4MTM5OCwKLSAgICAweDY0MUMsIDB4MTM3QSwgMHg2NDIyLCAweDM4RjcsIDB4NjQyNiwgMHgxMzk1LCAweDY0MjgsIDB4MTM5OSwKLSAgICAweDY0MkMsIDB4MEQ1NiwgMHg2NDJELCAweDBDNjUsIDB4NjQzNCwgMHgxMzkyLCAweDY0MzYsIDB4MTM5NiwKLSAgICAweDY0M0EsIDB4MDcxRSwgMHg2NDNFLCAweDA4NjEsIDB4NjQ0MiwgMHgwQTgxLCAweDY0NEUsIDB4MTM5RSwKLSAgICAweDY0NTEsIDB4MUU0MywgMHg2NDU0LCAweDM4RjgsIDB4NjQ1OCwgMHgwQzIwLCAweDY0NUIsIDB4MzhGOSwKLSAgICAweDY0NjAsIDB4MjExNCwgMHg2NDY3LCAweDEzOUIsIDB4NjQ2OSwgMHgwRThFLCAweDY0NkQsIDB4MzhGQSwKLSAgICAweDY0NkYsIDB4MTM5QywgMHg2NDc2LCAweDEzOUQsIDB4NjQ3OCwgMHgwRURBLCAweDY0N0EsIDB4MEE0NiwKLSAgICAweDY0N0IsIDB4MzhGQiwgMHg2NDgzLCAweDA3MzgsIDB4NjQ4OCwgMHgxM0E0LCAweDY0OTIsIDB4MDg4MywKLSAgICAweDY0OTMsIDB4MTNBMSwgMHg2NDk1LCAweDEzQTAsIDB4NjQ5QSwgMHgwQ0U4LCAweDY0OUQsIDB4MjExNSwKLSAgICAweDY0OUUsIDB4MEM4RCwgMHg2NEE0LCAweDBDMkIsIDB4NjRBNSwgMHgxM0EyLCAweDY0QTksIDB4MTNBMywKLSAgICAweDY0QUIsIDB4MERFMSwgMHg2NEFELCAweDBDRkIsIDB4NjRBRSwgMHgwODcxLCAweDY0QjAsIDB4MEE5NSwKLSAgICAweDY0QjIsIDB4MEU3RSwgMHg2NEI5LCAweDA1QTcsIDB4NjRCQiwgMHgxM0FBLCAweDY0QkMsIDB4MTNBNSwKLSAgICAweDY0QkUsIDB4MzhGQywgMHg2NEJGLCAweDM4RkQsIDB4NjRDMSwgMHgwRjM0LCAweDY0QzIsIDB4MTNBQywKLSAgICAweDY0QzUsIDB4MTNBOCwgMHg2NEM3LCAweDEzQTksIDB4NjRDQSwgMHgzNDFELCAweDY0Q0QsIDB4MEFFMiwKLSAgICAweDY0Q0UsIDB4MjExNiwgMHg2NEQyLCAweDEzQTcsIDB4NjRENCwgMHgxMzY2LCAweDY0RDgsIDB4MTNBQiwKLSAgICAweDY0REEsIDB4MTNBNiwgMHg2NEUwLCAweDEzQjAsIDB4NjRFMSwgMHgxM0IxLCAweDY0RTIsIDB4MEMyMSwKLSAgICAweDY0RTMsIDB4MTNCMywgMHg2NEU1LCAweDM4RkUsIDB4NjRFNiwgMHgwODcyLCAweDY0RTcsIDB4MTNBRSwKLSAgICAweDY0RUMsIDB4MDY1NiwgMHg2NEVGLCAweDEzQjQsIDB4NjRGMSwgMHgxM0FELCAweDY0RjIsIDB4MTNCOCwKLSAgICAweDY0RjQsIDB4MTNCNywgMHg2NEY2LCAweDEzQjYsIDB4NjRGNywgMHgzOEZGLCAweDY0RkEsIDB4MTNCOSwKLSAgICAweDY0RkIsIDB4MzkwMCwgMHg2NEZELCAweDEzQkIsIDB4NjRGRSwgMHgwOUQ5LCAweDY1MDAsIDB4MTNCQSwKLSAgICAweDY1MDQsIDB4MzkwMSwgMHg2NTA1LCAweDEzQkUsIDB4NjUxNiwgMHgzOTAyLCAweDY1MTgsIDB4MTNCQywKLSAgICAweDY1MTksIDB4MzkwMywgMHg2NTFDLCAweDEzQkQsIDB4NjUxRCwgMHgxMzk3LCAweDY1MjIsIDB4MUU5NywKLSAgICAweDY1MjMsIDB4MTNDMCwgMHg2NTI0LCAweDEzQkYsIDB4NjUyQSwgMHgxMzlGLCAweDY1MkIsIDB4MTNDMSwKLSAgICAweDY1MkMsIDB4MTNCNSwgMHg2NTJGLCAweDA4QTcsIDB4NjUzNCwgMHgxM0MyLCAweDY1MzUsIDB4MTNDMywKLSAgICAweDY1MzYsIDB4MTNDNSwgMHg2NTM3LCAweDEzQzQsIDB4NjUzOCwgMHgxM0M2LCAweDY1MzksIDB4MDU3RSwKLSAgICAweDY1M0IsIDB4MDdDOCwgMHg2NTNFLCAweDBFNEMsIDB4NjUzRiwgMHgwQTUzLCAweDY1NDUsIDB4MDc4MiwKLSAgICAweDY1NDcsIDB4MzkwNCwgMHg2NTQ4LCAweDEzQzgsIDB4NjU0RCwgMHgxM0NCLCAweDY1NEUsIDB4MjExNywKLSAgICAweDY1NEYsIDB4MERDNCwgMHg2NTUxLCAweDA2NzksIDB4NjU1NSwgMHgxM0NBLCAweDY1NTYsIDB4MTNDOSwKLSAgICAweDY1NTcsIDB4MEQwQSwgMHg2NTU4LCAweDEzQ0MsIDB4NjU1OSwgMHgwNkFELCAweDY1NUQsIDB4MTNDRSwKLSAgICAweDY1NUUsIDB4MTNDRCwgMHg2NTYyLCAweDA1RjYsIDB4NjU2MywgMHgwODg0LCAweDY1NjYsIDB4MENCMCwKLSAgICAweDY1NjcsIDB4MzkwNSwgMHg2NTZDLCAweDA3MUYsIDB4NjU3MCwgMHgwQTNBLCAweDY1NzIsIDB4MTNDRiwKLSAgICAweDY1NzQsIDB4MEE1NCwgMHg2NTc1LCAweDBDMjIsIDB4NjU3NywgMHgwREQxLCAweDY1NzgsIDB4MTNEMCwKLSAgICAweDY1ODEsIDB4MzkwNiwgMHg2NTgyLCAweDEzRDEsIDB4NjU4MywgMHgxM0QyLCAweDY1ODUsIDB4MzkwNywKLSAgICAweDY1ODcsIDB4MEUwOCwgMHg2NTg4LCAweDEyMEMsIDB4NjU4OSwgMHgwQTZBLCAweDY1OEMsIDB4MERCRSwKLSAgICAweDY1OEUsIDB4MDg0OCwgMHg2NTkwLCAweDBENzksIDB4NjU5MSwgMHgwRDU3LCAweDY1OTcsIDB4MEM0NywKLSAgICAweDY1OTksIDB4MEY4OSwgMHg2NTlCLCAweDEzRDQsIDB4NjU5QywgMHgwOEZDLCAweDY1OUYsIDB4MTNENSwKLSAgICAweDY1QTEsIDB4MDQ3QSwgMHg2NUE0LCAweDA2Q0MsIDB4NjVBNSwgMHgwQTcxLCAweDY1QTcsIDB4MEREMiwKLSAgICAweDY1QUIsIDB4MTNENiwgMHg2NUFDLCAweDA4OTAsIDB4NjVBRCwgMHgwQjg1LCAweDY1QUYsIDB4MDhBOSwKLSAgICAweDY1QjAsIDB4MDlGRCwgMHg2NUI3LCAweDEzRDcsIDB4NjVCOSwgMHgwRTRELCAweDY1QkMsIDB4MDUxOSwKLSAgICAweDY1QkQsIDB4MDhBQSwgMHg2NUMxLCAweDEzREEsIDB4NjVDMiwgMHgzOTA4LCAweDY1QzMsIDB4MTNEOCwKLSAgICAweDY1QzQsIDB4MTNEQiwgMHg2NUM1LCAweDBGODEsIDB4NjVDNiwgMHgxM0Q5LCAweDY1Q0IsIDB4MEE5RiwKLSAgICAweDY1Q0MsIDB4MTNEQywgMHg2NUNGLCAweDBCMTIsIDB4NjVEMiwgMHgxM0RELCAweDY1RDcsIDB4MDYzNiwKLSAgICAweDY1RDksIDB4MTNERiwgMHg2NURCLCAweDEzREUsIDB4NjVFMCwgMHgxM0UwLCAweDY1RTEsIDB4MTNFMSwKLSAgICAweDY1RTIsIDB4MDYzNywgMHg2NUUzLCAweDM1ODUsIDB4NjVFNSwgMHgwQ0Q0LCAweDY1RTYsIDB4MEI3NCwKLSAgICAweDY1RTcsIDB4MDY4NiwgMHg2NUU4LCAweDA4QUIsIDB4NjVFOSwgMHgwQUUzLCAweDY1RUMsIDB4MDk2NiwKLSAgICAweDY1RUQsIDB4MDQ3NCwgMHg2NUYwLCAweDM5MDksIDB4NjVGMSwgMHgxM0UyLCAweDY1RjIsIDB4MzkwQSwKLSAgICAweDY1RkEsIDB4MDUyMiwgMHg2NUZCLCAweDEzRTYsIDB4NjYwMCwgMHgyMTE4LCAweDY2MDIsIDB4MDdDOSwKLSAgICAweDY2MDMsIDB4MTNFNSwgMHg2NjA2LCAweDA4MUIsIDB4NjYwNywgMHgwOUEyLCAweDY2MDksIDB4MjExQSwKLSAgICAweDY2MEEsIDB4MTNFNCwgMHg2NjBDLCAweDA5QTMsIDB4NjYwRSwgMHgwRUNDLCAweDY2MEYsIDB4MDgxQSwKLSAgICAweDY2MTMsIDB4MDQ5QiwgMHg2NjE0LCAweDBBNzIsIDB4NjYxNSwgMHgyMTE5LCAweDY2MUMsIDB4MTNFQiwKLSAgICAweDY2MUUsIDB4MjExQywgMHg2NjFGLCAweDBBNTUsIDB4NjYyMCwgMHgwNEU5LCAweDY2MjQsIDB4MjExRCwKLSAgICAweDY2MjUsIDB4MDk1RiwgMHg2NjI3LCAweDBFOTQsIDB4NjYyOCwgMHgwODYyLCAweDY2MkMsIDB4MzkwQiwKLSAgICAweDY2MkQsIDB4MDlBNCwgMHg2NjJFLCAweDIxMUIsIDB4NjYyRiwgMHgwQTRCLCAweDY2MzEsIDB4MjBBRSwKLSAgICAweDY2MzQsIDB4MTNFQSwgMHg2NjM1LCAweDEzRTgsIDB4NjYzNiwgMHgxM0U5LCAweDY2M0IsIDB4MUUwMCwKLSAgICAweDY2M0MsIDB4MEJBOSwgMHg2NjNGLCAweDE0MDksIDB4NjY0MSwgMHgxM0VGLCAweDY2NDIsIDB4MDhDQywKLSAgICAweDY2NDMsIDB4MDdDQSwgMHg2NjQ0LCAweDEzRUQsIDB4NjY0OSwgMHgxM0VFLCAweDY2NEIsIDB4MDlGRSwKLSAgICAweDY2NEMsIDB4MzkwQywgMHg2NjRGLCAweDEzRUMsIDB4NjY1MiwgMHgwODdELCAweDY2NTcsIDB4MjExRiwKLSAgICAweDY2NTksIDB4MjEyMCwgMHg2NjVCLCAweDM5MEQsIDB4NjY1QywgMHgzOTBFLCAweDY2NUQsIDB4MTNGMSwKLSAgICAweDY2NUUsIDB4MTNGMCwgMHg2NjVGLCAweDEzRjUsIDB4NjY2MSwgMHgzOTBGLCAweDY2NjIsIDB4MTNGNiwKLSAgICAweDY2NjMsIDB4MzczQSwgMHg2NjY0LCAweDEzRjIsIDB4NjY2NSwgMHgyMTFFLCAweDY2NjYsIDB4MDU4MCwKLSAgICAweDY2NjcsIDB4MTNGMywgMHg2NjY4LCAweDEzRjQsIDB4NjY2OSwgMHgwRDY5LCAweDY2NkIsIDB4MzkxMCwKLSAgICAweDY2NkUsIDB4MEREMywgMHg2NjZGLCAweDA3MjAsIDB4NjY3MCwgMHgxM0Y3LCAweDY2NzMsIDB4MjEyMiwKLSAgICAweDY2NzQsIDB4MEE1NiwgMHg2Njc2LCAweDA5QTUsIDB4NjY3NywgMHgzOTExLCAweDY2N0EsIDB4MEI5MCwKLSAgICAweDY2ODEsIDB4MDZCRiwgMHg2NjgzLCAweDEzRjgsIDB4NjY4NCwgMHgxM0ZDLCAweDY2ODcsIDB4MDU0QiwKLSAgICAweDY2ODgsIDB4MTNGOSwgMHg2Njg5LCAweDEzRkIsIDB4NjY4RSwgMHgxM0ZBLCAweDY2OTEsIDB4MDk3NSwKLSAgICAweDY2OTYsIDB4MEI4NiwgMHg2Njk3LCAweDA0ODksIDB4NjY5OCwgMHgxM0ZELCAweDY2OTksIDB4MjEyMywKLSAgICAweDY2OUQsIDB4MTNGRSwgMHg2NkEwLCAweDIxMjQsIDB4NjZBMiwgMHgwQkM2LCAweDY2QTQsIDB4MzkxMiwKLSAgICAweDY2QTYsIDB4MEZCOSwgMHg2NkFCLCAweDA4OTEsIDB4NjZBRSwgMHgwRTNCLCAweDY2QjIsIDB4MjEyNSwKLSAgICAweDY2QjQsIDB4MEU2QiwgMHg2NkI4LCAweDE0MDUsIDB4NjZCOSwgMHgxNDAwLCAweDY2QkMsIDB4MTQwMywKLSAgICAweDY2QkUsIDB4MTQwMiwgMHg2NkJGLCAweDIxMjYsIDB4NjZDMSwgMHgxM0ZGLCAweDY2QzQsIDB4MTQwNCwKLSAgICAweDY2QzYsIDB4MzQ1NSwgMHg2NkM3LCAweDBDQjYsIDB4NjZDOCwgMHgzOTEzLCAweDY2QzksIDB4MTQwMSwKLSAgICAweDY2RDYsIDB4MTQwNiwgMHg2NkQ5LCAweDA5NzYsIDB4NjZEQSwgMHgxNDA3LCAweDY2REMsIDB4MEYzNSwKLSAgICAweDY2REQsIDB4MEQyRSwgMHg2NkUwLCAweDE0MDgsIDB4NjZFNiwgMHgxNDBBLCAweDY2RTksIDB4MTQwQiwKLSAgICAweDY2RUMsIDB4MzkxNCwgMHg2NkYwLCAweDE0MEMsIDB4NjZGMiwgMHgwNkMyLCAweDY2RjMsIDB4MDRFQSwKLSAgICAweDY2RjQsIDB4MDdDQiwgMHg2NkY1LCAweDE0MEQsIDB4NjZGNywgMHgxNDBFLCAweDY2RjgsIDB4MDk3QiwKLSAgICAweDY2RjksIDB4MEFFNCwgMHg2NkZBLCAweDIxMjcsIDB4NjZGQiwgMHgyMEIxLCAweDY2RkMsIDB4MTBFRCwKLSAgICAweDY2RkQsIDB4MEFDMCwgMHg2NkZFLCAweDBBQkYsIDB4NjZGRiwgMHgwQjM4LCAweDY3MDAsIDB4MDgzNywKLSAgICAweDY3MDMsIDB4MTA0QiwgMHg2NzA1LCAweDM5MTUsIDB4NjcwOCwgMHgwNzQ0LCAweDY3MDksIDB4MEYxNywKLSAgICAweDY3MEIsIDB4MEU0RSwgMHg2NzBELCAweDBERjAsIDB4NjcwRSwgMHgyMTI4LCAweDY3MEYsIDB4MTQwRiwKLSAgICAweDY3MTMsIDB4MzkxNiwgMHg2NzE0LCAweDA4NjMsIDB4NjcxNSwgMHgwQkRCLCAweDY3MTYsIDB4MTQxMCwKLSAgICAweDY3MTcsIDB4MEZENSwgMHg2NzFCLCAweDBFNkMsIDB4NjcxRCwgMHgwQkM3LCAweDY3MUUsIDB4MTQxMSwKLSAgICAweDY3MUYsIDB4MDYzOCwgMHg2NzI2LCAweDE0MTIsIDB4NjcyNywgMHgxNDEzLCAweDY3MjgsIDB4MEVFNiwKLSAgICAweDY3MkEsIDB4MEVCMCwgMHg2NzJCLCAweDBFQTQsIDB4NjcyQywgMHgwRThBLCAweDY3MkQsIDB4MDg3MywKLSAgICAweDY3MkUsIDB4MTQxNSwgMHg2NzMxLCAweDA5MTcsIDB4NjczMywgMHgzOTE3LCAweDY3MzQsIDB4MEU3RiwKLSAgICAweDY3MzYsIDB4MTQxNywgMHg2NzM3LCAweDE0MUEsIDB4NjczOCwgMHgxNDE5LCAweDY3M0EsIDB4MDYzNSwKLSAgICAweDY3M0QsIDB4MDY3QSwgMHg2NzNGLCAweDE0MTYsIDB4Njc0MSwgMHgxNDE4LCAweDY3NDMsIDB4MzVCNywKLSAgICAweDY3NDYsIDB4MTQxQiwgMHg2NzQ4LCAweDM5MTgsIDB4Njc0OSwgMHgwQTNGLCAweDY3NEMsIDB4MzkxOSwKLSAgICAweDY3NEUsIDB4MEY2NSwgMHg2NzRGLCAweDA0OEQsIDB4Njc1MCwgMHgwODUwLCAweDY3NTEsIDB4MEIxQywKLSAgICAweDY3NTMsIDB4MDkwOSwgMHg2NzU2LCAweDA5REIsIDB4Njc1OSwgMHgxNDFFLCAweDY3NUMsIDB4MEM0OCwKLSAgICAweDY3NUUsIDB4MTQxQywgMHg2NzVGLCAweDBCMEIsIDB4Njc2MCwgMHgxNDFELCAweDY3NjEsIDB4MDlEQSwKLSAgICAweDY3NjIsIDB4MEVFOSwgMHg2NzYzLCAweDE0MUYsIDB4Njc2NCwgMHgxNDIwLCAweDY3NjUsIDB4MEY1MiwKLSAgICAweDY3NjYsIDB4MjEyQSwgMHg2NzZBLCAweDE0MjUsIDB4Njc2RCwgMHgwN0NDLCAweDY3NkUsIDB4MzU3MSwKLSAgICAweDY3NkYsIDB4MEQwQiwgMHg2NzcwLCAweDE0MjIsIDB4Njc3MSwgMHgwQzY2LCAweDY3NzIsIDB4MTNFMywKLSAgICAweDY3NzMsIDB4MTNFNywgMHg2Nzc1LCAweDA2NjksIDB4Njc3NiwgMHgzOTFBLCAweDY3NzcsIDB4MENGRCwKLSAgICAweDY3N0IsIDB4MzkxQiwgMHg2NzdDLCAweDE0MjQsIDB4Njc3RSwgMHgwOUE2LCAweDY3N0YsIDB4MEQ1OCwKLSAgICAweDY3ODUsIDB4MTQyQSwgMHg2Nzg3LCAweDBEOEUsIDB4Njc4OSwgMHgxNDIxLCAweDY3OEIsIDB4MTQyNywKLSAgICAweDY3OEMsIDB4MTQyNiwgMHg2NzkwLCAweDBBNzMsIDB4Njc5NSwgMHgwRTlCLCAweDY3OTcsIDB4MEY5QiwKLSAgICAweDY3OUEsIDB4MEU5NSwgMHg2NzlDLCAweDA1NEMsIDB4Njc5RCwgMHgwOEFDLCAweDY3QTAsIDB4MEZFRSwKLSAgICAweDY3QTEsIDB4MTQyOSwgMHg2N0EyLCAweDBBM0IsIDB4NjdBNiwgMHgxNDI4LCAweDY3QTksIDB4MTQyMywKLSAgICAweDY3QUYsIDB4MDc4MywgMHg2N0IwLCAweDM5MUMsIDB4NjdCMiwgMHgzOTFELCAweDY3QjMsIDB4MTQyRiwKLSAgICAweDY3QjQsIDB4MTQyRCwgMHg2N0I2LCAweDA1NEQsIDB4NjdCNywgMHgxNDJCLCAweDY3QjgsIDB4MTQzMSwKLSAgICAweDY3QjksIDB4MTQzNywgMHg2N0JCLCAweDIxMkIsIDB4NjdDMCwgMHgyMTJELCAweDY3QzEsIDB4MEIyOCwKLSAgICAweDY3QzQsIDB4MEUxMSwgMHg2N0M2LCAweDE0MzksIDB4NjdDQSwgMHgwRDk0LCAweDY3Q0UsIDB4MTQzOCwKLSAgICAweDY3Q0YsIDB4MEQyNiwgMHg2N0QwLCAweDBFNkQsIDB4NjdEMSwgMHgwNUY3LCAweDY3RDMsIDB4MEE5QiwKLSAgICAweDY3RDQsIDB4MDk0QSwgMHg2N0Q3LCAweDM5MUYsIDB4NjdEOCwgMHgwQkVGLCAweDY3RDksIDB4MzkyMCwKLSAgICAweDY3REEsIDB4MEYxOCwgMHg2N0RELCAweDE0MzQsIDB4NjdERSwgMHgxNDMzLCAweDY3RTIsIDB4MTQzNSwKLSAgICAweDY3RTQsIDB4MTQzMiwgMHg2N0U3LCAweDE0M0EsIDB4NjdFOSwgMHgxNDMwLCAweDY3RUMsIDB4MTQyRSwKLSAgICAweDY3RUUsIDB4MTQzNiwgMHg2N0VGLCAweDE0MkMsIDB4NjdGMCwgMHgzOTIxLCAweDY3RjEsIDB4MEJBQSwKLSAgICAweDY3RjMsIDB4MEYwNCwgMHg2N0Y0LCAweDA4RjIsIDB4NjdGNSwgMHgwODY0LCAweDY3RjksIDB4MzkxRSwKLSAgICAweDY3RkIsIDB4MDgyQSwgMHg2N0ZFLCAweDBFOUQsIDB4NjdGRiwgMHgwNTlGLCAweDY4MDEsIDB4MjEyRSwKLSAgICAweDY4MDIsIDB4MEJFQSwgMHg2ODAzLCAweDBDQTIsIDB4NjgwNCwgMHgwNEVCLCAweDY4MDUsIDB4MUUwNywKLSAgICAweDY4MTMsIDB4MEE5NiwgMHg2ODE2LCAweDBBNTgsIDB4NjgxNywgMHgwNzAwLCAweDY4MUUsIDB4MTQzQywKLSAgICAweDY4MjEsIDB4MDdDRCwgMHg2ODIyLCAweDA1REEsIDB4NjgyOSwgMHgxNDNFLCAweDY4MkEsIDB4MDVEMiwKLSAgICAweDY4MkIsIDB4MTQ0NCwgMHg2ODJDLCAweDM5MjIsIDB4NjgzMCwgMHgzOTIzLCAweDY4MzEsIDB4MzkyNCwKLSAgICAweDY4MzIsIDB4MTQ0MSwgMHg2ODM0LCAweDBBOTcsIDB4NjgzOCwgMHgwNUE5LCAweDY4MzksIDB4MDgxQywKLSAgICAweDY4M0MsIDB4MDVBOCwgMHg2ODNELCAweDA4M0YsIDB4Njg0MCwgMHgxNDNGLCAweDY4NDEsIDB4MDczQiwKLSAgICAweDY4NDIsIDB4MDcyMSwgMHg2ODQzLCAweDBDNjcsIDB4Njg0NCwgMHgyMTJGLCAweDY4NDYsIDB4MTQzRCwKLSAgICAweDY4NDgsIDB4MDQ4QSwgMHg2ODRELCAweDE0NDAsIDB4Njg0RSwgMHgxNDQyLCAweDY4NTAsIDB4MDZDNSwKLSAgICAweDY4NTEsIDB4MDcwMiwgMHg2ODUyLCAweDIxMkMsIDB4Njg1MywgMHgwNUY4LCAweDY4NTQsIDB4MDY2NSwKLSAgICAweDY4NTksIDB4MTQ0NSwgMHg2ODVCLCAweDM5MjUsIDB4Njg1QywgMHgwODY5LCAweDY4NUQsIDB4MEU5RiwKLSAgICAweDY4NUYsIDB4MDg4NSwgMHg2ODYzLCAweDE0NDYsIDB4Njg2NywgMHgwREEyLCAweDY4NzIsIDB4MzkyNiwKLSAgICAweDY4NzQsIDB4MTQ1MiwgMHg2ODc1LCAweDM5MjcsIDB4Njg3NiwgMHgwNTMzLCAweDY4NzcsIDB4MTQ0NywKLSAgICAweDY4N0EsIDB4MzkyOCwgMHg2ODdFLCAweDE0NTgsIDB4Njg3RiwgMHgxNDQ4LCAweDY4ODEsIDB4MEY4QSwKLSAgICAweDY4ODMsIDB4MTQ0RiwgMHg2ODg0LCAweDM5MjksIDB4Njg4NSwgMHgwRDE1LCAweDY4OEQsIDB4MTQ1NywKLSAgICAweDY4OEUsIDB4MUU5QywgMHg2ODhGLCAweDE0NEEsIDB4Njg5MywgMHgwNDc4LCAweDY4OTQsIDB4MTQ0QywKLSAgICAweDY4OTcsIDB4MDdDRSwgMHg2ODlCLCAweDE0NEUsIDB4Njg5RCwgMHgxNDRELCAweDY4OUYsIDB4MTQ0OSwKLSAgICAweDY4QTAsIDB4MTQ1NCwgMHg2OEEyLCAweDA5QTcsIDB4NjhBNSwgMHgzOTJBLCAweDY4QTYsIDB4MTFCRSwKLSAgICAweDY4QTcsIDB4MDc5QywgMHg2OEE4LCAweDBGNjYsIDB4NjhBRCwgMHgxNDRCLCAweDY4QUYsIDB4MEMxMCwKLSAgICAweDY4QjAsIDB4MDU4MSwgMHg2OEIxLCAweDA4MUQsIDB4NjhCMiwgMHgzOTJCLCAweDY4QjMsIDB4MTQ0MywKLSAgICAweDY4QjUsIDB4MTQ1MywgMHg2OEI2LCAweDA1QkYsIDB4NjhCOSwgMHgxNDUxLCAweDY4QkEsIDB4MTQ1NSwKLSAgICAweDY4QkMsIDB4MEM2OCwgMHg2OEM0LCAweDA2M0EsIDB4NjhDNiwgMHgxNDczLCAweDY4QzgsIDB4MjBBRiwKLSAgICAweDY4QzksIDB4MEVENSwgMHg2OENBLCAweDE0NUEsIDB4NjhDQiwgMHgwNjM5LCAweDY4Q0QsIDB4MTQ2MSwKLSAgICAweDY4Q0YsIDB4MjEzMCwgMHg2OEQwLCAweDM5MkMsIDB4NjhEMiwgMHgwRTZFLCAweDY4RDQsIDB4MTQ2MiwKLSAgICAweDY4RDUsIDB4MTQ2NCwgMHg2OEQ2LCAweDM5MkQsIDB4NjhENywgMHgxNDY4LCAweDY4RDgsIDB4MTQ1QywKLSAgICAweDY4REEsIDB4MEI2OCwgMHg2OERGLCAweDBDNjksIDB4NjhFMCwgMHgxNDZDLCAweDY4RTEsIDB4MTQ1RiwKLSAgICAweDY4RTMsIDB4MTQ2OSwgMHg2OEU3LCAweDE0NjMsIDB4NjhFOCwgMHgzOTJFLCAweDY4RUQsIDB4MzkyRiwKLSAgICAweDY4RUUsIDB4MDlGRiwgMHg2OEVGLCAweDE0NkQsIDB4NjhGMCwgMHgzOTMwLCAweDY4RjEsIDB4MzkzMSwKLSAgICAweDY4RjIsIDB4MEE1NywgMHg2OEY5LCAweDE0NkIsIDB4NjhGQSwgMHgwNUY5LCAweDY4RkMsIDB4MzkzMiwKLSAgICAweDY5MDAsIDB4MEZGNiwgMHg2OTAxLCAweDE0NTksIDB4NjkwNCwgMHgxNDY3LCAweDY5MDUsIDB4MDQ5QywKLSAgICAweDY5MDgsIDB4MTQ1QiwgMHg2OTBCLCAweDBFQzYsIDB4NjkwQywgMHgxNDYwLCAweDY5MEQsIDB4MDlFOCwKLSAgICAweDY5MEUsIDB4MEJFMywgMHg2OTBGLCAweDE0NTYsIDB4NjkxMSwgMHgzOTMzLCAweDY5MTIsIDB4MTQ2NiwKLSAgICAweDY5MTMsIDB4MzkzNCwgMHg2OTE5LCAweDBBNDAsIDB4NjkxQSwgMHgxNDcwLCAweDY5MUIsIDB4MDVDRiwKLSAgICAweDY5MUMsIDB4MDc1NSwgMHg2OTIxLCAweDE0NzIsIDB4NjkyMiwgMHgxNDVELCAweDY5MjMsIDB4MTQ3MSwKLSAgICAweDY5MjUsIDB4MTQ2QSwgMHg2OTI2LCAweDE0NUUsIDB4NjkyOCwgMHgxNDZFLCAweDY5MkEsIDB4MTQ2RiwKLSAgICAweDY5MzAsIDB4MTQ4MCwgMHg2OTM0LCAweDBDQTYsIDB4NjkzNSwgMHgzOTM1LCAweDY5MzYsIDB4MTQ2NSwKLSAgICAweDY5MzksIDB4MTQ3QywgMHg2OTNCLCAweDM5MzYsIDB4NjkzRCwgMHgxNDdFLCAweDY5M0YsIDB4MEJGNCwKLSAgICAweDY5NEEsIDB4MEYzNiwgMHg2OTUzLCAweDBERTgsIDB4Njk1NCwgMHgxNDc5LCAweDY5NTUsIDB4MEIyQSwKLSAgICAweDY5NTcsIDB4MzkzNywgMHg2OTU5LCAweDE0N0YsIDB4Njk1QSwgMHgwQUMxLCAweDY5NUMsIDB4MTQ3NiwKLSAgICAweDY5NUQsIDB4MTQ4MywgMHg2OTVFLCAweDE0ODIsIDB4Njk2MCwgMHgwQ0M3LCAweDY5NjEsIDB4MTQ4MSwKLSAgICAweDY5NjIsIDB4MENDMiwgMHg2OTYzLCAweDM5MzgsIDB4Njk2OCwgMHgyMTMyLCAweDY5NkEsIDB4MTQ4NSwKLSAgICAweDY5NkIsIDB4MTQ3OCwgMHg2OTZELCAweDA2QzAsIDB4Njk2RSwgMHgxNDdCLCAweDY5NkYsIDB4MDk2NywKLSAgICAweDY5NzIsIDB4MzkzOSwgMHg2OTczLCAweDBEMTYsIDB4Njk3NCwgMHgxNDdELCAweDY5NzUsIDB4MDZDMywKLSAgICAweDY5NzcsIDB4MTQ3NSwgMHg2OTc4LCAweDE0NzcsIDB4Njk3OSwgMHgxNDc0LCAweDY5N0MsIDB4MEZENiwKLSAgICAweDY5N0QsIDB4MDVCOCwgMHg2OTdFLCAweDE0N0EsIDB4Njk3RiwgMHgzOTNBLCAweDY5ODAsIDB4MzkzQiwKLSAgICAweDY5ODEsIDB4MTQ4NCwgMHg2OTgyLCAweDA1OTMsIDB4Njk4QSwgMHgwODU3LCAweDY5OEUsIDB4MDRGRiwKLSAgICAweDY5OTEsIDB4MTQ5NSwgMHg2OTk0LCAweDBGRDcsIDB4Njk5NSwgMHgxNDk4LCAweDY5OTgsIDB4MjEzNCwKLSAgICAweDY5OUIsIDB4MEEwMCwgMHg2OTlDLCAweDE0OTcsIDB4NjlBMCwgMHgxNDk2LCAweDY5QTYsIDB4MzkzQywKLSAgICAweDY5QTcsIDB4MTQ5MywgMHg2OUFELCAweDM5M0QsIDB4NjlBRSwgMHgxNDg3LCAweDY5QjEsIDB4MTRBNCwKLSAgICAweDY5QjIsIDB4MTQ4NiwgMHg2OUI0LCAweDE0OTksIDB4NjlCNywgMHgzOTNFLCAweDY5QkIsIDB4MTQ5MSwKLSAgICAweDY5QkUsIDB4MTQ4QywgMHg2OUJGLCAweDE0ODksIDB4NjlDMSwgMHgxNDhBLCAweDY5QzMsIDB4MTQ5MiwKLSAgICAweDY5QzcsIDB4MUQzMywgMHg2OUNBLCAweDE0OEYsIDB4NjlDQiwgMHgwN0NGLCAweDY5Q0MsIDB4MEJFNCwKLSAgICAweDY5Q0QsIDB4MEFFNiwgMHg2OUNFLCAweDE0OEQsIDB4NjlEMCwgMHgxNDg4LCAweDY5RDMsIDB4MTQ4QiwKLSAgICAweDY5RDYsIDB4MzkzRiwgMHg2OUQ3LCAweDM5NDAsIDB4NjlEOCwgMHgwRjM3LCAweDY5RDksIDB4MEU5OCwKLSAgICAweDY5REQsIDB4MTQ5MCwgMHg2OURFLCAweDE0OUEsIDB4NjlFMiwgMHgyMTM1LCAweDY5RTcsIDB4MTRBMiwKLSAgICAweDY5RTgsIDB4MTQ5QiwgMHg2OUVBLCAweDM1NkYsIDB4NjlFQiwgMHgxNEE4LCAweDY5RUQsIDB4MTRBNiwKLSAgICAweDY5RjIsIDB4MTRBMSwgMHg2OUY2LCAweDM3M0YsIDB4NjlGOSwgMHgxNEEwLCAweDY5RkIsIDB4MEJFQywKLSAgICAweDY5RkQsIDB4MEFFNywgMHg2OUZGLCAweDE0OUUsIDB4NkEwMSwgMHgzOTQxLCAweDZBMDIsIDB4MTQ5QywKLSAgICAweDZBMDUsIDB4MTRBMywgMHg2QTBBLCAweDE0QTksIDB4NkEwQiwgMHgwRDg5LCAweDZBMEMsIDB4MTRBRiwKLSAgICAweDZBMEYsIDB4Mzk0MiwgMHg2QTEyLCAweDE0QUEsIDB4NkExMywgMHgxNEFELCAweDZBMTQsIDB4MTRBNywKLSAgICAweDZBMTUsIDB4Mzk0MywgMHg2QTE3LCAweDBCQjIsIDB4NkExOSwgMHgwREFBLCAweDZBMUIsIDB4MTQ5RCwKLSAgICAweDZBMUUsIDB4MTRBNSwgMHg2QTFGLCAweDA5QTgsIDB4NkEyMSwgMHgwRURCLCAweDZBMjIsIDB4MTRCOSwKLSAgICAweDZBMjMsIDB4MTRBQywgMHg2QTI4LCAweDM5NDQsIDB4NkEyOSwgMHgwNzU2LCAweDZBMkEsIDB4MDUyMywKLSAgICAweDZBMkIsIDB4MDVCRCwgMHg2QTJFLCAweDE0OTQsIDB4NkEzMCwgMHgyMTM2LCAweDZBMzQsIDB4Mzk0NSwKLSAgICAweDZBMzUsIDB4MDlBOSwgMHg2QTM2LCAweDE0QjEsIDB4NkEzOCwgMHgxNEI4LCAweDZBMzksIDB4MDkyNSwKLSAgICAweDZBM0EsIDB4MDVEMCwgMHg2QTNELCAweDBCNkMsIDB4NkEzRSwgMHgzOTQ2LCAweDZBNDQsIDB4MTRBRSwKLSAgICAweDZBNDUsIDB4Mzk0NywgMHg2QTQ2LCAweDIxMzgsIDB4NkE0NywgMHgxNEIzLCAweDZBNDgsIDB4MTRCNywKLSAgICAweDZBNEIsIDB4MDZBRSwgMHg2QTUwLCAweDM5NDgsIDB4NkE1MSwgMHgzOTQ5LCAweDZBNTQsIDB4M0MzNCwKLSAgICAweDZBNTYsIDB4Mzk0QSwgMHg2QTU4LCAweDA2NjYsIDB4NkE1OSwgMHgxNEI1LCAweDZBNUIsIDB4Mzk0QiwKLSAgICAweDZBNUYsIDB4MDYzQiwgMHg2QTYxLCAweDBDQTMsIDB4NkE2MiwgMHgxNEI0LCAweDZBNjYsIDB4MTRCNiwKLSAgICAweDZBNkIsIDB4MjEzNywgMHg2QTcyLCAweDE0QjAsIDB4NkE3MywgMHgyMTM5LCAweDZBNzgsIDB4MTRCMiwKLSAgICAweDZBN0UsIDB4MjEzQSwgMHg2QTdGLCAweDA1QkUsIDB4NkE4MCwgMHgwQjg3LCAweDZBODMsIDB4Mzk0QywKLSAgICAweDZBODQsIDB4MTRCRCwgMHg2QTg5LCAweDM5NEQsIDB4NkE4RCwgMHgxNEJCLCAweDZBOEUsIDB4MDc5RCwKLSAgICAweDZBOTAsIDB4MTRCQSwgMHg2QTkxLCAweDM5NEUsIDB4NkE5NywgMHgxNEMwLCAweDZBOUMsIDB4MTQzQiwKLSAgICAweDZBOUQsIDB4Mzk0RiwgMHg2QTlFLCAweDM5NTAsIDB4NkE5RiwgMHgzOTUxLCAweDZBQTAsIDB4MTRCQywKLSAgICAweDZBQTIsIDB4MTRCRSwgMHg2QUEzLCAweDE0QkYsIDB4NkFBQSwgMHgxNENCLCAweDZBQUMsIDB4MTRDNywKLSAgICAweDZBQUUsIDB4MTQ1MCwgMHg2QUIzLCAweDE0QzYsIDB4NkFCOCwgMHgxNEM1LCAweDZBQkIsIDB4MTRDMiwKLSAgICAweDZBQzEsIDB4MTRBQiwgMHg2QUMyLCAweDE0QzQsIDB4NkFDMywgMHgxNEMzLCAweDZBRDEsIDB4MTRDOSwKLSAgICAweDZBRDMsIDB4MEZDQywgMHg2QURBLCAweDE0Q0MsIDB4NkFEQiwgMHgwNkYzLCAweDZBREMsIDB4Mzk1MiwKLSAgICAweDZBREUsIDB4MTRDOCwgMHg2QURGLCAweDE0Q0EsIDB4NkFFMiwgMHgyMTNCLCAweDZBRTQsIDB4MjEzQywKLSAgICAweDZBRTcsIDB4Mzk1MywgMHg2QUU4LCAweDBEM0IsIDB4NkFFQSwgMHgxNENELCAweDZBRUMsIDB4Mzk1NCwKLSAgICAweDZBRkEsIDB4MTREMSwgMHg2QUZCLCAweDE0Q0UsIDB4NkIwNCwgMHgwRjVELCAweDZCMDUsIDB4MTRDRiwKLSAgICAweDZCMEEsIDB4MTQ5RiwgMHg2QjEyLCAweDE0RDIsIDB4NkIxNiwgMHgxNEQzLCAweDZCMUQsIDB4MDRENywKLSAgICAweDZCMUUsIDB4Mzk1NSwgMHg2QjFGLCAweDE0RDUsIDB4NkIyMCwgMHgwNzNELCAweDZCMjEsIDB4MDhDRCwKLSAgICAweDZCMjMsIDB4MDZDRCwgMHg2QjI0LCAweDM5NTYsIDB4NkIyNywgMHgwNTI0LCAweDZCMzIsIDB4MEY0OSwKLSAgICAweDZCMzUsIDB4Mzk1NywgMHg2QjM3LCAweDE0RDcsIDB4NkIzOCwgMHgxNEQ2LCAweDZCMzksIDB4MTREOSwKLSAgICAweDZCM0EsIDB4MDY1NywgMHg2QjNELCAweDA2Q0UsIDB4NkIzRSwgMHgwNUZBLCAweDZCNDMsIDB4MTREQywKLSAgICAweDZCNDYsIDB4Mzk1OCwgMHg2QjQ3LCAweDE0REIsIDB4NkI0OSwgMHgxNERELCAweDZCNEMsIDB4MDU0RSwKLSAgICAweDZCNEUsIDB4MEI3NSwgMHg2QjUwLCAweDE0REUsIDB4NkI1MywgMHgwNUZCLCAweDZCNTQsIDB4MTRFMCwKLSAgICAweDZCNTYsIDB4Mzk1OSwgMHg2QjU5LCAweDE0REYsIDB4NkI1QiwgMHgxNEUxLCAweDZCNUYsIDB4MTRFMiwKLSAgICAweDZCNjAsIDB4Mzk1QSwgMHg2QjYxLCAweDE0RTMsIDB4NkI2MiwgMHgwOEFELCAweDZCNjMsIDB4MEE1OSwKLSAgICAweDZCNjQsIDB4MDgxMSwgMHg2QjY1LCAweDM0NEEsIDB4NkI2NiwgMHgwREUyLCAweDZCNjksIDB4MEUzMiwKLSAgICAweDZCNkEsIDB4MEZFQSwgMHg2QjZGLCAweDA4QzMsIDB4NkI3MiwgMHgzNUQ5LCAweDZCNzMsIDB4MDg0MCwKLSAgICAweDZCNzQsIDB4MEZCQSwgMHg2Qjc3LCAweDM0NTYsIDB4NkI3OCwgMHgxNEU0LCAweDZCNzksIDB4MTRFNSwKLSAgICAweDZCN0IsIDB4MDhBRSwgMHg2QjdGLCAweDE0RTYsIDB4NkI4MCwgMHgxNEU3LCAweDZCODIsIDB4Mzk1QiwKLSAgICAweDZCODMsIDB4MTRFOSwgMHg2Qjg0LCAweDE0RTgsIDB4NkI4NiwgMHgwRTg2LCAweDZCODksIDB4MDk2OCwKLSAgICAweDZCOEEsIDB4MDkxOCwgMHg2QjhCLCAweDA4OTIsIDB4NkI4RCwgMHgxNEVBLCAweDZCOTUsIDB4MTRFQywKLSAgICAweDZCOTYsIDB4MDlFOSwgMHg2Qjk4LCAweDE0RUIsIDB4NkI5RSwgMHgxNEVELCAweDZCQTQsIDB4MTRFRSwKLSAgICAweDZCQUEsIDB4MTRFRiwgMHg2QkFCLCAweDE0RjAsIDB4NkJBRiwgMHgxNEYxLCAweDZCQjEsIDB4MTRGMywKLSAgICAweDZCQjIsIDB4MTRGMiwgMHg2QkIzLCAweDE0RjQsIDB4NkJCNCwgMHgwNTI1LCAweDZCQjUsIDB4MEI4OCwKLSAgICAweDZCQjcsIDB4MTRGNSwgMHg2QkJBLCAweDA4NzQsIDB4NkJCQiwgMHgwNUFBLCAweDZCQkMsIDB4MTRGNiwKLSAgICAweDZCQkUsIDB4Mzk1QywgMHg2QkJGLCAweDBDM0MsIDB4NkJDMCwgMHgxMTlELCAweDZCQzUsIDB4MDYzRCwKLSAgICAweDZCQzYsIDB4MTRGNywgMHg2QkNCLCAweDE0RjgsIDB4NkJDQywgMHgzNzQ0LCAweDZCQ0QsIDB4MEUzQywKLSAgICAweDZCQ0UsIDB4MEU5NiwgMHg2QkNGLCAweDM0NEMsIDB4NkJEMiwgMHgwQzlGLCAweDZCRDMsIDB4MTRGOSwKLSAgICAweDZCRDQsIDB4MEQ3QSwgMHg2QkQ2LCAweDIxM0QsIDB4NkJEOCwgMHgwRDhGLCAweDZCREIsIDB4MEVERiwKLSAgICAweDZCREYsIDB4MTRGQSwgMHg2QkUxLCAweDM5NUQsIDB4NkJFQiwgMHgxNEZDLCAweDZCRUMsIDB4MTRGQiwKLSAgICAweDZCRUYsIDB4MTRGRSwgMHg2QkYxLCAweDM5NUUsIDB4NkJGMywgMHgxNEZELCAweDZDMDgsIDB4MTUwMCwKLSAgICAweDZDMEYsIDB4MDhBRiwgMHg2QzEwLCAweDM5NUYsIDB4NkMxMSwgMHgwRUJELCAweDZDMTMsIDB4MTUwMSwKLSAgICAweDZDMTQsIDB4MTUwMiwgMHg2QzE3LCAweDA2M0UsIDB4NkMxQiwgMHgxNTAzLCAweDZDMjMsIDB4MTUwNSwKLSAgICAweDZDMjQsIDB4MTUwNCwgMHg2QzMzLCAweDM5NjAsIDB4NkMzNCwgMHgwQTJCLCAweDZDMzUsIDB4Mzk2MSwKLSAgICAweDZDMzcsIDB4MERBQiwgMHg2QzM4LCAweDA0RUMsIDB4NkMzQSwgMHgzOTYyLCAweDZDM0UsIDB4MEQ1OSwKLSAgICAweDZDM0YsIDB4MjEzRSwgMHg2QzQwLCAweDBDMTEsIDB4NkM0MSwgMHgwOTRCLCAweDZDNDIsIDB4MDY3QiwKLSAgICAweDZDNEUsIDB4MEQ1QSwgMHg2QzUwLCAweDA4REEsIDB4NkM1NSwgMHgxNTA3LCAweDZDNTcsIDB4MDVGQywKLSAgICAweDZDNTksIDB4Mzk2MywgMHg2QzVBLCAweDA1MUEsIDB4NkM1QywgMHgyMTNGLCAweDZDNUQsIDB4MENDQSwKLSAgICAweDZDNUUsIDB4MTUwNiwgMHg2QzVGLCAweDA3RDAsIDB4NkM2MCwgMHgwQjkxLCAweDZDNjIsIDB4MTUwOCwKLSAgICAweDZDNjgsIDB4MTUxMCwgMHg2QzZBLCAweDE1MDksIDB4NkM2RiwgMHgyMTQxLCAweDZDNzAsIDB4MEIyMSwKLSAgICAweDZDNzIsIDB4MDY3QywgMHg2QzczLCAweDE1MTEsIDB4NkM3NiwgMHgzOTY0LCAweDZDN0EsIDB4MDczRSwKLSAgICAweDZDN0IsIDB4Mzk2NSwgMHg2QzdELCAweDA2M0YsIDB4NkM3RSwgMHgxNTBGLCAweDZDODEsIDB4MTUwRCwKLSAgICAweDZDODIsIDB4MTUwQSwgMHg2QzgzLCAweDBGNEEsIDB4NkM4NSwgMHgzOTY2LCAweDZDODYsIDB4MjE0MCwKLSAgICAweDZDODgsIDB4MEJEQywgMHg2QzhDLCAweDBDQjEsIDB4NkM4RCwgMHgxNTBCLCAweDZDOTAsIDB4MTUxMywKLSAgICAweDZDOTIsIDB4MTUxMiwgMHg2QzkzLCAweDA2RjksIDB4NkM5NSwgMHgzOTY3LCAweDZDOTYsIDB4MDUyRCwKLSAgICAweDZDOTksIDB4MDgyQiwgMHg2QzlBLCAweDE1MEMsIDB4NkM5QiwgMHgxNTBFLCAweDZDOUMsIDB4Mzk2OCwKLSAgICAweDZDQTEsIDB4MEU4NSwgMHg2Q0EyLCAweDBCNTQsIDB4NkNBQSwgMHgzNzQ5LCAweDZDQUIsIDB4MEVBNSwKLSAgICAweDZDQUUsIDB4MTUxQiwgMHg2Q0IxLCAweDE1MUMsIDB4NkNCMywgMHgwNTRGLCAweDZDQjgsIDB4MERGOCwKLSAgICAweDZDQjksIDB4MEYwOSwgMHg2Q0JBLCAweDE1MUUsIDB4NkNCQiwgMHgwOENGLCAweDZDQkMsIDB4MDlBQSwKLSAgICAweDZDQkQsIDB4MTUxNywgMHg2Q0JFLCAweDE1MUQsIDB4NkNCRiwgMHgwNTBBLCAweDZDQzEsIDB4MDZBRiwKLSAgICAweDZDQzQsIDB4MTUxNCwgMHg2Q0M1LCAweDE1MTksIDB4NkNDOSwgMHgwQTk4LCAweDZDQ0EsIDB4MEQyNywKLSAgICAweDZDQ0MsIDB4MEQ3QiwgMHg2Q0QwLCAweDM5NjksIDB4NkNEMywgMHgxNTE2LCAweDZDRDQsIDB4Mzk2QSwKLSAgICAweDZDRDUsIDB4MEU0RiwgMHg2Q0Q2LCAweDM5NkIsIDB4NkNENywgMHgxNTE4LCAweDZDRDksIDB4MTUyMSwKLSAgICAweDZDREEsIDB4MjE0MiwgMHg2Q0RCLCAweDE1MUYsIDB4NkNERCwgMHgxNTFBLCAweDZDRTAsIDB4Mzk2QywKLSAgICAweDZDRTEsIDB4MEU1MCwgMHg2Q0UyLCAweDBDRkUsIDB4NkNFMywgMHgwNjdELCAweDZDRTUsIDB4MEMxRiwKLSAgICAweDZDRTgsIDB4MEJBQiwgMHg2Q0VBLCAweDE1MjIsIDB4NkNFQiwgMHgzOTZELCAweDZDRUMsIDB4Mzk2RSwKLSAgICAweDZDRUUsIDB4Mzk2RiwgMHg2Q0VGLCAweDE1MjAsIDB4NkNGMCwgMHgwQjM5LCAweDZDRjEsIDB4MTUxNSwKLSAgICAweDZDRjMsIDB4MDRFRCwgMHg2RDAxLCAweDNDMzUsIDB4NkQwNCwgMHgyMTQzLCAweDZEMEEsIDB4Mzk3MCwKLSAgICAweDZEMEIsIDB4MEYzOCwgMHg2RDBDLCAweDE1MkQsIDB4NkQwRSwgMHgzOTcxLCAweDZEMTEsIDB4Mzk3MiwKLSAgICAweDZEMTIsIDB4MTUyQywgMHg2RDE3LCAweDBBOUEsIDB4NkQxOSwgMHgxNTI5LCAweDZEMUIsIDB4MEY1NiwKLSAgICAweDZEMUUsIDB4MEM4RSwgMHg2RDFGLCAweDE1MjMsIDB4NkQyNSwgMHgwQkUxLCAweDZEMjksIDB4MDRFRSwKLSAgICAweDZEMkEsIDB4MDdEMSwgMHg2RDJCLCAweDE1MjYsIDB4NkQyRSwgMHgzOTczLCAweDZEMzIsIDB4MDkzMSwKLSAgICAweDZEMzMsIDB4MTUyQiwgMHg2RDM1LCAweDE1MkEsIDB4NkQzNiwgMHgxNTI1LCAweDZEMzgsIDB4MTUyOCwKLSAgICAweDZEM0IsIDB4MDVDNiwgMHg2RDNELCAweDE1MjcsIDB4NkQzRSwgMHgwQ0ZGLCAweDZENDEsIDB4MEY3NiwKLSAgICAweDZENDQsIDB4MDlEQywgMHg2RDQ1LCAweDBBOTksIDB4NkQ1NywgMHgzOTc0LCAweDZENTksIDB4MTUzMywKLSAgICAweDZENUEsIDB4MTUzMSwgMHg2RDVDLCAweDBEQkYsIDB4NkQ1RSwgMHgzOTc1LCAweDZENjMsIDB4MTUyRSwKLSAgICAweDZENjQsIDB4MTUzMCwgMHg2RDY1LCAweDM5NzYsIDB4NkQ2NiwgMHgwNERDLCAweDZENjksIDB4MDdEMiwKLSAgICAweDZENkEsIDB4MEZEOCwgMHg2RDZDLCAweDA1OUIsIDB4NkQ2RSwgMHgwREQ0LCAweDZENkYsIDB4MjE0NSwKLSAgICAweDZENzQsIDB4MEY0QiwgMHg2RDc3LCAweDA1ODIsIDB4NkQ3OCwgMHgwQTAxLCAweDZENzksIDB4MTUzMiwKLSAgICAweDZEODIsIDB4Mzk3NywgMHg2RDg1LCAweDE1MzcsIDB4NkQ4NywgMHgyMTQ0LCAweDZEODgsIDB4MDlBQiwKLSAgICAweDZEODksIDB4MzQyQSwgMHg2RDhDLCAweDBGMUEsIDB4NkQ4RSwgMHgxNTM0LCAweDZEOTMsIDB4MTUyRiwKLSAgICAweDZEOTUsIDB4MTUzNSwgMHg2RDk2LCAweDIxNDYsIDB4NkQ5OSwgMHgwRkE2LCAweDZEOUIsIDB4MEM2RCwKLSAgICAweDZEOUMsIDB4MEM5QSwgMHg2REFDLCAweDIxNDcsIDB4NkRBRiwgMHgwNTk0LCAweDZEQjIsIDB4MDRGNywKLSAgICAweDZEQjUsIDB4MTUzQiwgMHg2REI4LCAweDE1M0UsIDB4NkRCQywgMHgwRjhCLCAweDZEQkYsIDB4Mzk3OCwKLSAgICAweDZEQzAsIDB4MEY0RSwgMHg2REM0LCAweDM5NzksIDB4NkRDNSwgMHgxNTQ1LCAweDZEQzYsIDB4MTUzRiwKLSAgICAweDZEQzcsIDB4MTUzQywgMHg2RENBLCAweDM5N0EsIDB4NkRDQiwgMHgwRjlDLCAweDZEQ0MsIDB4MTU0MiwKLSAgICAweDZEQ0YsIDB4MjE0OCwgMHg2REQwLCAweDNDMzYsIDB4NkREMSwgMHgwOTU0LCAweDZERDIsIDB4MTU0NCwKLSAgICAweDZERDUsIDB4MTU0OSwgMHg2REQ2LCAweDM5N0IsIDB4NkREOCwgMHgwQzZCLCAweDZERDksIDB4MTU0NywKLSAgICAweDZEREEsIDB4MzQ1MywgMHg2RERFLCAweDE1NDEsIDB4NkRFMSwgMHgwQjc2LCAweDZERTQsIDB4MTU0OCwKLSAgICAweDZERTYsIDB4MTUzRCwgMHg2REU4LCAweDE1NDMsIDB4NkRFOSwgMHgzOTdDLCAweDZERUEsIDB4MTU0QSwKLSAgICAweDZERUIsIDB4MDRDMCwgMHg2REVDLCAweDE1NDAsIDB4NkRFRSwgMHgxNTRCLCAweDZERjEsIDB4MEEwMiwKLSAgICAweDZERjIsIDB4MjE0QSwgMHg2REYzLCAweDA5NjksIDB4NkRGNSwgMHgwREY1LCAweDZERjcsIDB4MDgxRSwKLSAgICAweDZERjgsIDB4MjE0OSwgMHg2REY5LCAweDE1MzgsIDB4NkRGQSwgMHgxNTQ2LCAweDZERkIsIDB4MEMzNCwKLSAgICAweDZERkMsIDB4MjE0QiwgMHg2RTA1LCAweDBBNUEsIDB4NkUwNywgMHgwNUM3LCAweDZFMDgsIDB4MDg0MSwKLSAgICAweDZFMDksIDB4MDlBQywgMHg2RTBBLCAweDE1M0EsIDB4NkUwQiwgMHgwOTRDLCAweDZFMTMsIDB4MDcyMiwKLSAgICAweDZFMTUsIDB4MTUzOSwgMHg2RTE3LCAweDM3NDYsIDB4NkUxOSwgMHgxNTRGLCAweDZFMUEsIDB4MDk3NywKLSAgICAweDZFMUIsIDB4MDc2RSwgMHg2RTFELCAweDE1NUUsIDB4NkUxRiwgMHgxNTU4LCAweDZFMjAsIDB4MDY4RSwKLSAgICAweDZFMjEsIDB4MEM0OSwgMHg2RTIyLCAweDM5N0QsIDB4NkUyMywgMHgxNTUzLCAweDZFMjQsIDB4MTU1QywKLSAgICAweDZFMjUsIDB4MDQ3MywgMHg2RTI2LCAweDA0RDQsIDB4NkUyNywgMHgyMTRFLCAweDZFMjksIDB4MDUzOSwKLSAgICAweDZFMkIsIDB4MTU1NSwgMHg2RTJDLCAweDBCMEMsIDB4NkUyRCwgMHgxNTRDLCAweDZFMkUsIDB4MTU0RSwKLSAgICAweDZFMkYsIDB4MDdEMywgMHg2RTM0LCAweDM0MTIsIDB4NkUzOCwgMHgxNTVGLCAweDZFMzksIDB4MjE0QywKLSAgICAweDZFM0EsIDB4MTU1QSwgMHg2RTNDLCAweDIxNEYsIDB4NkUzRSwgMHgxNTUyLCAweDZFNDIsIDB4M0MzNywKLSAgICAweDZFNDMsIDB4MTU1OSwgMHg2RTRBLCAweDBFQjcsIDB4NkU0RCwgMHgxNTU3LCAweDZFNEUsIDB4MTU1QiwKLSAgICAweDZFNTEsIDB4Mzk3RSwgMHg2RTU2LCAweDA3ODQsIDB4NkU1OCwgMHgwOUFELCAweDZFNUIsIDB4MEI3NywKLSAgICAweDZFNUMsIDB4MjE0RCwgMHg2RTVGLCAweDE1NTEsIDB4NkU2NywgMHgwRjE5LCAweDZFNkIsIDB4MTU1NCwKLSAgICAweDZFNkUsIDB4MTU0RCwgMHg2RTZGLCAweDBDNkMsIDB4NkU3MiwgMHgxNTUwLCAweDZFNzYsIDB4MTU1NiwKLSAgICAweDZFN0UsIDB4MEZGNywgMHg2RTdGLCAweDA4RUEsIDB4NkU4MCwgMHgwRUFDLCAweDZFODIsIDB4MTU2MCwKLSAgICAweDZFOEMsIDB4MEQ0MiwgMHg2RThGLCAweDE1NkMsIDB4NkU5MCwgMHgwNzZGLCAweDZFOTYsIDB4MDk2QSwKLSAgICAweDZFOTgsIDB4MTU2MiwgMHg2RTlDLCAweDBGNzcsIDB4NkU5RCwgMHgwN0Q0LCAweDZFOUYsIDB4MTU2RiwKLSAgICAweDZFQTIsIDB4MDRCMiwgMHg2RUE1LCAweDE1NkQsIDB4NkVBQSwgMHgxNTYxLCAweDZFQUIsIDB4MzQwQywKLSAgICAweDZFQUYsIDB4MTU2NywgMHg2RUIyLCAweDE1NjksIDB4NkVCNiwgMHgwRjM5LCAweDZFQjcsIDB4MTU2NCwKLSAgICAweDZFQkEsIDB4MEMyOCwgMHg2RUJELCAweDE1NjYsIDB4NkVCRiwgMHgyMTUwLCAweDZFQzIsIDB4MTU2RSwKLSAgICAweDZFQzQsIDB4MTU2OCwgMHg2RUM1LCAweDBFRDMsIDB4NkVDNywgMHgzOTdGLCAweDZFQzksIDB4MTU2MywKLSAgICAweDZFQ0EsIDB4Mzk4MCwgMHg2RUNCLCAweDA4Q0UsIDB4NkVDQywgMHgxNTdCLCAweDZFQ0UsIDB4Mzk4MSwKLSAgICAweDZFRDEsIDB4MDVDOCwgMHg2RUQzLCAweDE1NjUsIDB4NkVENCwgMHgxNTZBLCAweDZFRDUsIDB4MTU2QiwKLSAgICAweDZFRDksIDB4M0MzOCwgMHg2RURELCAweDBCNEMsIDB4NkVERSwgMHgwQjNBLCAweDZFRTYsIDB4M0MyNCwKLSAgICAweDZFRUMsIDB4MTU3MywgMHg2RUVGLCAweDE1NzksIDB4NkVGMiwgMHgxNTc3LCAweDZFRjQsIDB4MEMyMywKLSAgICAweDZFRjcsIDB4MTU3RSwgMHg2RUY4LCAweDE1NzQsIDB4NkVGRCwgMHgzOTgyLCAweDZFRkUsIDB4MTU3NSwKLSAgICAweDZFRkYsIDB4MTU1RCwgMHg2RjAxLCAweDA2OTMsIDB4NkYwMiwgMHgwREFDLCAweDZGMDYsIDB4MDhFQiwKLSAgICAweDZGMDksIDB4MDgwOSwgMHg2RjBGLCAweDBGRDksIDB4NkYxMSwgMHgxNTcxLCAweDZGMTMsIDB4MTU3RCwKLSAgICAweDZGMTQsIDB4MDUwQiwgMHg2RjE1LCAweDBBRTgsIDB4NkYxQSwgMHgzOTgzLCAweDZGMjAsIDB4MEQyRiwKLSAgICAweDZGMjIsIDB4MDVGRCwgMHg2RjIzLCAweDBGQzIsIDB4NkYyQSwgMHgzOTg0LCAweDZGMkIsIDB4MEVBRCwKLSAgICAweDZGMkMsIDB4MEJFRSwgMHg2RjJGLCAweDM5ODUsIDB4NkYzMSwgMHgxNTc4LCAweDZGMzIsIDB4MTU3QSwKLSAgICAweDZGMzMsIDB4Mzk4NiwgMHg2RjM4LCAweDBBQjQsIDB4NkYzRSwgMHgxNTdDLCAweDZGM0YsIDB4MTU3NiwKLSAgICAweDZGNDEsIDB4MTU3MCwgMHg2RjQ1LCAweDA1RkYsIDB4NkY1MSwgMHgxRTYwLCAweDZGNTQsIDB4MDczRiwKLSAgICAweDZGNTgsIDB4MTU4QSwgMHg2RjVBLCAweDM5ODcsIDB4NkY1QiwgMHgxNTg1LCAweDZGNUMsIDB4MEE5QywKLSAgICAweDZGNUUsIDB4Mzk4OCwgMHg2RjVGLCAweDA1QzEsIDB4NkY2MiwgMHgzOTg5LCAweDZGNjQsIDB4MDk2QiwKLSAgICAweDZGNjYsIDB4MTU4RSwgMHg2RjZELCAweDE1ODcsIDB4NkY2RSwgMHgwQkM4LCAweDZGNkYsIDB4MTU4NCwKLSAgICAweDZGNzAsIDB4MEJGNSwgMHg2Rjc0LCAweDE1QTcsIDB4NkY3OCwgMHgxNTgxLCAweDZGN0EsIDB4MTU4MCwKLSAgICAweDZGN0MsIDB4MTU4OSwgMHg2RjdELCAweDM5OEEsIDB4NkY4MCwgMHgxNTgzLCAweDZGODEsIDB4MTU4MiwKLSAgICAweDZGODIsIDB4MTU4OCwgMHg2Rjg0LCAweDBBNDUsIDB4NkY4NiwgMHgxNTdGLCAweDZGODgsIDB4MjE1MSwKLSAgICAweDZGOEIsIDB4Mzk4QiwgMHg2RjhELCAweDM5OEMsIDB4NkY4RSwgMHgxNThCLCAweDZGOTEsIDB4MTU4QywKLSAgICAweDZGOTIsIDB4Mzk4RCwgMHg2Rjk0LCAweDM5OEUsIDB4NkY5NywgMHgwNUZFLCAweDZGOTgsIDB4MzYzQywKLSAgICAweDZGOUEsIDB4Mzk4RiwgMHg2RkExLCAweDE1OTEsIDB4NkZBMywgMHgxNTkwLCAweDZGQTQsIDB4MTU5MiwKLSAgICAweDZGQTcsIDB4Mzk5MCwgMHg2RkE4LCAweDM5OTEsIDB4NkZBQSwgMHgxNTk1LCAweDZGQjEsIDB4MEMzRCwKLSAgICAweDZGQjMsIDB4MTU4RiwgMHg2RkI1LCAweDIxNTIsIDB4NkZCNiwgMHgzOTkyLCAweDZGQjksIDB4MTU5MywKLSAgICAweDZGQzAsIDB4MDczOSwgMHg2RkMxLCAweDBCNTksIDB4NkZDMiwgMHgxNThELCAweDZGQzMsIDB4MENGMSwKLSAgICAweDZGQzYsIDB4MTU5NCwgMHg2RkQ0LCAweDE1OTksIDB4NkZENSwgMHgxNTk3LCAweDZGRDgsIDB4MTU5QSwKLSAgICAweDZGREEsIDB4Mzk5MywgMHg2RkRCLCAweDE1OUQsIDB4NkZERSwgMHgzOTk0LCAweDZGREYsIDB4MTU5NiwKLSAgICAweDZGRTAsIDB4MDdGQywgMHg2RkUxLCAweDBDREUsIDB4NkZFNCwgMHgxNTM2LCAweDZGRUIsIDB4MEY1RSwKLSAgICAweDZGRUMsIDB4MTU5OCwgMHg2RkVFLCAweDE1OUMsIDB4NkZFRiwgMHgwQjU1LCAweDZGRjEsIDB4MTU5QiwKLSAgICAweDZGRjMsIDB4MTU4NiwgMHg2RkY1LCAweDIxNTMsIDB4NkZGNiwgMHgxQkE0LCAweDZGRjksIDB4Mzk5NSwKLSAgICAweDZGRkEsIDB4MTVBMCwgMHg2RkZFLCAweDE1QTQsIDB4NzAwMSwgMHgxNUEyLCAweDcwMDUsIDB4MjE1NCwKLSAgICAweDcwMDYsIDB4MUU1MCwgMHg3MDA3LCAweDIxNTUsIDB4NzAwOSwgMHgxNTlFLCAweDcwMEIsIDB4MTU5RiwKLSAgICAweDcwMEYsIDB4MTVBMywgMHg3MDExLCAweDE1QTEsIDB4NzAxNSwgMHgwREMwLCAweDcwMTgsIDB4MTVBOSwKLSAgICAweDcwMUEsIDB4MTVBNiwgMHg3MDFCLCAweDE1QTUsIDB4NzAxRCwgMHgxNUE4LCAweDcwMUUsIDB4MENBQywKLSAgICAweDcwMUYsIDB4MTVBQSwgMHg3MDI2LCAweDBCQjMsIDB4NzAyNywgMHgwQjRELCAweDcwMjgsIDB4MjE1NiwKLSAgICAweDcwMkMsIDB4MEE0OSwgMHg3MDMwLCAweDE1QUIsIDB4NzAzMiwgMHgxNUFELCAweDcwMzksIDB4Mzk5NiwKLSAgICAweDcwM0MsIDB4Mzk5NywgMHg3MDNFLCAweDE1QUMsIDB4NzA0QSwgMHgzOTk4LCAweDcwNEMsIDB4MTU3MiwKLSAgICAweDcwNTEsIDB4MTVBRSwgMHg3MDU0LCAweDM5OTksIDB4NzA1OCwgMHgwQ0JGLCAweDcwNUQsIDB4Mzk5QSwKLSAgICAweDcwNUUsIDB4Mzk5QiwgMHg3MDYzLCAweDE1QUYsIDB4NzA2NCwgMHgzOTlDLCAweDcwNkIsIDB4MDU1MCwKLSAgICAweDcwNkMsIDB4Mzk5RCwgMHg3MDZGLCAweDBDNkUsIDB4NzA3MCwgMHgwNTgzLCAweDcwNzgsIDB4MDY3RSwKLSAgICAweDcwN0MsIDB4MDkwQSwgMHg3MDdELCAweDA4NDIsIDB4NzA3RSwgMHgzOTlFLCAweDcwODEsIDB4Mzk5RiwKLSAgICAweDcwODUsIDB4MjE1NywgMHg3MDg5LCAweDBGQ0QsIDB4NzA4QSwgMHgwQTJDLCAweDcwOEUsIDB4MDUwQywKLSAgICAweDcwOTIsIDB4MTVCMSwgMHg3MDk1LCAweDM5QTAsIDB4NzA5OSwgMHgxNUIwLCAweDcwQUIsIDB4MjE1OCwKLSAgICAweDcwQUMsIDB4MTVCNCwgMHg3MEFELCAweDBCNzgsIDB4NzBBRSwgMHgxNUI3LCAweDcwQUYsIDB4MTVCMiwKLSAgICAweDcwQjMsIDB4MTVCNiwgMHg3MEI3LCAweDM5QTEsIDB4NzBCOCwgMHgxNUI1LCAweDcwQjksIDB4MEMzQSwKLSAgICAweDcwQkEsIDB4MDQ5RCwgMHg3MEJCLCAweDIwQUQsIDB4NzBDOCwgMHgwRkJELCAweDcwQ0IsIDB4MTVCOSwKLSAgICAweDcwQ0YsIDB4MDRDQSwgMHg3MEQzLCAweDM5QTIsIDB4NzBENCwgMHgzOUEzLCAweDcwRDgsIDB4MzlBNCwKLSAgICAweDcwRDksIDB4MTVCQiwgMHg3MERDLCAweDM5QTUsIDB4NzBERCwgMHgxNUJBLCAweDcwREYsIDB4MTVCOCwKLSAgICAweDcwRjEsIDB4MTVCMywgMHg3MEY5LCAweDBFNTEsIDB4NzBGRCwgMHgxNUJELCAweDcxMDQsIDB4MjE1QSwKLSAgICAweDcxMDcsIDB4MzlBNiwgMHg3MTA5LCAweDE1QkMsIDB4NzEwRiwgMHgyMTU5LCAweDcxMTQsIDB4MDUwRCwKLSAgICAweDcxMTksIDB4MTVCRiwgMHg3MTFBLCAweDBFMDIsIDB4NzExQywgMHgxNUJFLCAweDcxMjAsIDB4MzlBNywKLSAgICAweDcxMjEsIDB4MEVDMSwgMHg3MTI2LCAweDA5QUYsIDB4NzEzMCwgMHgxRERDLCAweDcxMzEsIDB4MzlBOCwKLSAgICAweDcxMzYsIDB4MEFCNSwgMHg3MTNDLCAweDA5QUUsIDB4NzE0NiwgMHgyMTVDLCAweDcxNDcsIDB4MjE1RCwKLSAgICAweDcxNDksIDB4MEZDMywgMHg3MTRBLCAweDM5QTksIDB4NzE0QywgMHgxNUM1LCAweDcxNEUsIDB4MEE5RCwKLSAgICAweDcxNTIsIDB4MzlBQSwgMHg3MTU1LCAweDE1QzEsIDB4NzE1NiwgMHgxNUM2LCAweDcxNTksIDB4MDUwRSwKLSAgICAweDcxNUMsIDB4MjE1QiwgMHg3MTYwLCAweDM5QUIsIDB4NzE2MiwgMHgxNUM0LCAweDcxNjQsIDB4MEQxNywKLSAgICAweDcxNjUsIDB4MTVDMCwgMHg3MTY2LCAweDE1QzMsIDB4NzE2NywgMHgwOUIwLCAweDcxNjksIDB4MEQ2NSwKLSAgICAweDcxNkMsIDB4MTVDNywgMHg3MTZFLCAweDA4RkQsIDB4NzE3OSwgMHgzOUFDLCAweDcxN0QsIDB4MEE5RSwKLSAgICAweDcxODQsIDB4MTVDQSwgMHg3MTg4LCAweDE1QzIsIDB4NzE4QSwgMHgwNkZELCAweDcxOEYsIDB4MTVDOCwKLSAgICAweDcxOTIsIDB4MzlBRCwgMHg3MTk0LCAweDBGM0EsIDB4NzE5NSwgMHgxNUNCLCAweDcxOTksIDB4MjA1RCwKLSAgICAweDcxOUYsIDB4MDk1OSwgMHg3MUE4LCAweDE1Q0MsIDB4NzFBQywgMHgxNUNELCAweDcxQjEsIDB4MENFNCwKLSAgICAweDcxQjMsIDB4MzlBRSwgMHg3MUI5LCAweDE1Q0YsIDB4NzFCRSwgMHgxNUQwLCAweDcxQzEsIDB4MjE1RiwKLSAgICAweDcxQzMsIDB4MENFOSwgMHg3MUM4LCAweDBDNkYsIDB4NzFDOSwgMHgxNUQyLCAweDcxQ0IsIDB4MzlBRiwKLSAgICAweDcxQ0UsIDB4MTVENCwgMHg3MUQwLCAweDBGOUQsIDB4NzFEMiwgMHgxNUQxLCAweDcxRDMsIDB4MzlCMCwKLSAgICAweDcxRDQsIDB4MTVEMywgMHg3MUQ1LCAweDA1MEYsIDB4NzFENiwgMHgzOUIxLCAweDcxRDcsIDB4MTVDRSwKLSAgICAweDcxREYsIDB4MTE0RSwgMHg3MUUwLCAweDE1RDUsIDB4NzFFNSwgMHgwQUU5LCAweDcxRTYsIDB4MDg4NiwKLSAgICAweDcxRTcsIDB4MTVENywgMHg3MUVDLCAweDE1RDYsIDB4NzFFRCwgMHgwOUVBLCAweDcxRUUsIDB4MTBFRSwKLSAgICAweDcxRjUsIDB4MTVEOCwgMHg3MUY5LCAweDE1REEsIDB4NzFGQiwgMHgxNUM5LCAweDcxRkMsIDB4MTVEOSwKLSAgICAweDcxRkUsIDB4MjE2MCwgMHg3MUZGLCAweDE1REIsIDB4NzIwMCwgMHgzOUIyLCAweDcyMDYsIDB4MEQzMCwKLSAgICAweDcyMEQsIDB4MTVEQywgMHg3MjEwLCAweDE1REQsIDB4NzIxQiwgMHgxNURFLCAweDcyMUQsIDB4MzlCMywKLSAgICAweDcyMjgsIDB4MTVERiwgMHg3MjJBLCAweDBCRkEsIDB4NzIyQiwgMHgzOUI0LCAweDcyMkMsIDB4MTVFMSwKLSAgICAweDcyMkQsIDB4MTVFMCwgMHg3MjMwLCAweDE1RTIsIDB4NzIzMiwgMHgxNUUzLCAweDcyMzUsIDB4MDkwQiwKLSAgICAweDcyMzYsIDB4MERENSwgMHg3MjM4LCAweDM5QjUsIDB4NzIzQSwgMHgwRUY4LCAweDcyM0IsIDB4MTVFNCwKLSAgICAweDcyM0MsIDB4MTVFNSwgMHg3MjNELCAweDBBRDgsIDB4NzIzRSwgMHgwOEQwLCAweDcyM0YsIDB4MTVFNiwKLSAgICAweDcyNDAsIDB4MTVFNywgMHg3MjQxLCAweDM5QjYsIDB4NzI0NiwgMHgxNUU4LCAweDcyNDcsIDB4MEUyMiwKLSAgICAweDcyNDgsIDB4MEQ1QiwgMHg3MjRCLCAweDE1RTksIDB4NzI0QywgMHgwRDBELCAweDcyNTIsIDB4MEJDOSwKLSAgICAweDcyNTMsIDB4MzlCNywgMHg3MjU1LCAweDM5QjgsIDB4NzI1NiwgMHgzOUI5LCAweDcyNTgsIDB4MTVFQSwKLSAgICAweDcyNTksIDB4MDU2NywgMHg3MjVCLCAweDA2ODcsIDB4NzI1QywgMHgzOUJBLCAweDcyNUQsIDB4MEVEMiwKLSAgICAweDcyNUYsIDB4MEVDMiwgMHg3MjYxLCAweDA1MzQsIDB4NzI2MiwgMHgwRkRBLCAweDcyNjcsIDB4MEU4MCwKLSAgICAweDcyNjksIDB4MERGQSwgMHg3MjcyLCAweDBBNUIsIDB4NzI3NCwgMHgxNUVCLCAweDcyNzksIDB4MEM5QiwKLSAgICAweDcyN0QsIDB4MDc1NywgMHg3MjdFLCAweDE1RUMsIDB4NzI4MCwgMHgwODQ0LCAweDcyODEsIDB4MTVFRSwKLSAgICAweDcyODIsIDB4MTVFRCwgMHg3Mjg3LCAweDE1RUYsIDB4NzI4RCwgMHgzOUJCLCAweDcyOTIsIDB4MTVGMCwKLSAgICAweDcyOTYsIDB4MTVGMSwgMHg3MkEwLCAweDA2NTgsIDB4NzJBMiwgMHgxNUYyLCAweDcyQTcsIDB4MTVGMywKLSAgICAweDcyQUMsIDB4MDc1OCwgMHg3MkFELCAweDM5QkMsIDB4NzJBRiwgMHgwRDVDLCAweDcyQjEsIDB4MjE2MSwKLSAgICAweDcyQjIsIDB4MTVGNSwgMHg3MkI0LCAweDM5QkQsIDB4NzJCNiwgMHgwOURELCAweDcyQjksIDB4MTVGNCwKLSAgICAweDcyQkUsIDB4MjE2MiwgMHg3MkMwLCAweDM0MkIsIDB4NzJDMiwgMHgwNkIwLCAweDcyQzMsIDB4MTVGNiwKLSAgICAweDcyQzQsIDB4MTVGOCwgMHg3MkM2LCAweDE1RjcsIDB4NzJDNywgMHgzOUJFLCAweDcyQ0UsIDB4MTVGOSwKLSAgICAweDcyRDAsIDB4MDc4NSwgMHg3MkQyLCAweDE1RkEsIDB4NzJENywgMHgwNkUxLCAweDcyRDksIDB4MEFDMiwKLSAgICAweDcyREIsIDB4MDgwRiwgMHg3MkUwLCAweDE1RkMsIDB4NzJFMSwgMHgxNUZELCAweDcyRTIsIDB4MTVGQiwKLSAgICAweDcyRTksIDB4MDkxOSwgMHg3MkVDLCAweDBDQTAsIDB4NzJFRCwgMHgwNkIxLCAweDcyRjcsIDB4MTVGRiwKLSAgICAweDcyRjgsIDB4MEI2QSwgMHg3MkY5LCAweDE1RkUsIDB4NzJGQiwgMHgzOUJGLCAweDcyRkMsIDB4MEZEQiwKLSAgICAweDcyRkQsIDB4MEQxOCwgMHg3MzA0LCAweDM5QzAsIDB4NzMwNSwgMHgzOUMxLCAweDczMEEsIDB4MTYwMiwKLSAgICAweDczMTYsIDB4MTYwNCwgMHg3MzE3LCAweDE2MDEsIDB4NzMxQiwgMHgwRUUwLCAweDczMUMsIDB4MTYwMywKLSAgICAweDczMUQsIDB4MTYwNSwgMHg3MzFGLCAweDBGOEMsIDB4NzMyNCwgMHgyMTYzLCAweDczMjUsIDB4MTYwOSwKLSAgICAweDczMjgsIDB4MzlDMiwgMHg3MzI5LCAweDE2MDgsIDB4NzMyQSwgMHgwQkI0LCAweDczMkIsIDB4MENFMywKLSAgICAweDczMkUsIDB4MDc1OSwgMHg3MzJGLCAweDE2MDcsIDB4NzMzMSwgMHgzOUMzLCAweDczMzQsIDB4MTYwNiwKLSAgICAweDczMzYsIDB4MEYxQiwgMHg3MzM3LCAweDBGMUMsIDB4NzMzRSwgMHgxNjBBLCAweDczM0YsIDB4MDUxMCwKLSAgICAweDczNDMsIDB4MzlDNCwgMHg3MzQ0LCAweDA4MDgsIDB4NzM0NSwgMHgwOEIwLCAweDczNEUsIDB4MTYwQiwKLSAgICAweDczNEYsIDB4MTYwQywgMHg3MzU3LCAweDE2MEUsIDB4NzM2MywgMHgwOTRELCAweDczNjgsIDB4MTYxMCwKLSAgICAweDczNkEsIDB4MTYwRiwgMHg3MzZDLCAweDM5QzUsIDB4NzM3MCwgMHgxNjExLCAweDczNzIsIDB4MDVBQiwKLSAgICAweDczNzUsIDB4MTYxMywgMHg3Mzc3LCAweDIxNjUsIDB4NzM3OCwgMHgxNjEyLCAweDczN0EsIDB4MTYxNSwKLSAgICAweDczN0IsIDB4MTYxNCwgMHg3MzdDLCAweDM5QzYsIDB4NzM4MywgMHgzOUM3LCAweDczODQsIDB4MDc3MCwKLSAgICAweDczODUsIDB4MzlDOCwgMHg3Mzg2LCAweDM5QzksIDB4NzM4NywgMHgwRjcwLCAweDczODksIDB4MDZDNCwKLSAgICAweDczOEIsIDB4MDUyNiwgMHg3Mzk1LCAweDM5Q0EsIDB4NzM5NiwgMHgwNkUyLCAweDczOUUsIDB4MzlDQiwKLSAgICAweDczOUYsIDB4MzlDQywgMHg3M0EwLCAweDM5Q0QsIDB4NzNBNiwgMHgzOUNFLCAweDczQTgsIDB4M0MzRiwKLSAgICAweDczQTksIDB4MDYxRCwgMHg3M0FCLCAweDM5Q0YsIDB4NzNCMiwgMHgwRkIwLCAweDczQjMsIDB4MTYxNywKLSAgICAweDczQjUsIDB4MzlEMCwgMHg3M0I3LCAweDM5RDEsIDB4NzNCQSwgMHgzNUVBLCAweDczQkIsIDB4MTYxOSwKLSAgICAweDczQkMsIDB4MzlEMiwgMHg3M0JELCAweDIxNjYsIDB4NzNDMCwgMHgxNjFBLCAweDczQzIsIDB4MDU1MSwKLSAgICAweDczQzgsIDB4MTYxNiwgMHg3M0M5LCAweDIxNjcsIDB4NzNDQSwgMHgwODg3LCAweDczQ0QsIDB4MEJERCwKLSAgICAweDczQ0UsIDB4MTYxOCwgMHg3M0NGLCAweDM5RDMsIDB4NzNEMiwgMHgyMTZBLCAweDczRDYsIDB4MjE2OCwKLSAgICAweDczRDksIDB4MzlENCwgMHg3M0RFLCAweDE2MUQsIDB4NzNFMCwgMHgwOTFBLCAweDczRTMsIDB4MjE2OSwKLSAgICAweDczRTQsIDB4M0MzOSwgMHg3M0U1LCAweDE2MUIsIDB4NzNFOSwgMHgzOUQ1LCAweDczRUEsIDB4MDcxNCwKLSAgICAweDczRUQsIDB4MEQ1RCwgMHg3M0VFLCAweDE2MUMsIDB4NzNGMSwgMHgxNjM3LCAweDczRjQsIDB4MzlENiwKLSAgICAweDczRjUsIDB4MjE2QywgMHg3M0Y4LCAweDE2MjIsIDB4NzNGRCwgMHgzOUQ3LCAweDczRkUsIDB4MDc3MSwKLSAgICAweDc0MDMsIDB4MDY3RiwgMHg3NDA0LCAweDM5RDgsIDB4NzQwNSwgMHgxNjFGLCAweDc0MDYsIDB4MEY2NywKLSAgICAweDc0MDcsIDB4MjE2QiwgMHg3NDA5LCAweDBGNzgsIDB4NzQwQSwgMHgzOUQ5LCAweDc0MUEsIDB4MzlEQSwKLSAgICAweDc0MUIsIDB4MzlEQiwgMHg3NDIxLCAweDNDM0EsIDB4NzQyMiwgMHgwQjU2LCAweDc0MjQsIDB4MzlEQywKLSAgICAweDc0MjUsIDB4MTYyMSwgMHg3NDI2LCAweDIxNkQsIDB4NzQyOCwgMHgzOURELCAweDc0MjksIDB4MjE2RiwKLSAgICAweDc0MkEsIDB4MjE2RSwgMHg3NDJDLCAweDM5REUsIDB4NzQyRSwgMHgyMTcwLCAweDc0MkYsIDB4MzlERiwKLSAgICAweDc0MzAsIDB4MzlFMCwgMHg3NDMxLCAweDM5RTEsIDB4NzQzMiwgMHgxNjIzLCAweDc0MzMsIDB4MEY5RSwKLSAgICAweDc0MzQsIDB4MDZDRiwgMHg3NDM1LCAweDBEOTAsIDB4NzQzNiwgMHgwRDAwLCAweDc0MzksIDB4MzlFMiwKLSAgICAweDc0M0EsIDB4MTYyNCwgMHg3NDNGLCAweDE2MjYsIDB4NzQ0MSwgMHgxNjI5LCAweDc0NDQsIDB4MzlFMywKLSAgICAweDc0NDcsIDB4MzlFNCwgMHg3NDRCLCAweDM5RTUsIDB4NzQ0RCwgMHgzOUU2LCAweDc0NTEsIDB4MzlFNywKLSAgICAweDc0NTUsIDB4MTYyNSwgMHg3NDU3LCAweDM5RTgsIDB4NzQ1OSwgMHgxNjI4LCAweDc0NUEsIDB4MDc5RSwKLSAgICAweDc0NUIsIDB4MDRFRiwgMHg3NDVDLCAweDE2MkEsIDB4NzQ1RSwgMHgwQTM2LCAweDc0NUYsIDB4MTYyNywKLSAgICAweDc0NjAsIDB4MEZBNCwgMHg3NDYyLCAweDIxNzEsIDB4NzQ2MywgMHgxNjJELCAweDc0NjQsIDB4MUQzNSwKLSAgICAweDc0NjYsIDB4MzlFOSwgMHg3NDY5LCAweDE2MkIsIDB4NzQ2QSwgMHgxNjJFLCAweDc0NkIsIDB4MzlFQSwKLSAgICAweDc0NkYsIDB4MTYyMCwgMHg3NDcwLCAweDE2MkMsIDB4NzQ3MSwgMHgzOUVCLCAweDc0NzMsIDB4MDgyQywKLSAgICAweDc0NzYsIDB4MTYyRiwgMHg3NDdFLCAweDE2MzAsIDB4NzQ4MCwgMHgzOUVDLCAweDc0ODMsIDB4MEY2OCwKLSAgICAweDc0ODUsIDB4MzlFRCwgMHg3NDg2LCAweDM5RUUsIDB4NzQ4NywgMHgzOUVGLCAweDc0ODksIDB4MjE3MiwKLSAgICAweDc0OEIsIDB4MTYzMSwgMHg3NDkwLCAweDM5RjAsIDB4NzQ5OCwgMHgzOUYxLCAweDc0OUMsIDB4MzlGMiwKLSAgICAweDc0OUUsIDB4MTYzMiwgMHg3NDlGLCAweDIxNzMsIDB4NzRBMCwgMHgzOUYzLCAweDc0QTIsIDB4MTYxRSwKLSAgICAweDc0QTMsIDB4MzlGNCwgMHg3NEE3LCAweDE2MzMsIDB4NzRBOCwgMHgzOUY1LCAweDc0QUIsIDB4MzlGNiwKLSAgICAweDc0QjAsIDB4MDYwMCwgMHg3NEI1LCAweDM5RjcsIDB4NzRCRCwgMHgwOEQxLCAweDc0QkYsIDB4MzlGOCwKLSAgICAweDc0QzgsIDB4MzlGOSwgMHg3NENBLCAweDE2MzQsIDB4NzRDRiwgMHgxNjM1LCAweDc0RDQsIDB4MTYzNiwKLSAgICAweDc0REEsIDB4MzlGQSwgMHg3NERDLCAweDA0REQsIDB4NzRERSwgMHgzOUZCLCAweDc0RTAsIDB4MTYzOCwKLSAgICAweDc0RTIsIDB4MERBRCwgMHg3NEUzLCAweDE2MzksIDB4NzRFNiwgMHgwNUUwLCAweDc0RTcsIDB4MTYzQSwKLSAgICAweDc0RTksIDB4MTYzQiwgMHg3NEVFLCAweDE2M0MsIDB4NzRFRiwgMHgzNzUwLCAweDc0RjAsIDB4MTYzRSwKLSAgICAweDc0RjEsIDB4MTYzRiwgMHg3NEYyLCAweDE2M0QsIDB4NzRGNiwgMHgwREM1LCAweDc0RjcsIDB4MTY0MSwKLSAgICAweDc0RjgsIDB4MTY0MCwgMHg3NTAxLCAweDIxNzQsIDB4NzUwMywgMHgxNjQzLCAweDc1MDQsIDB4MTY0MiwKLSAgICAweDc1MDUsIDB4MTY0NCwgMHg3NTBDLCAweDE2NDUsIDB4NzUwRCwgMHgxNjQ3LCAweDc1MEUsIDB4MTY0NiwKLSAgICAweDc1MTEsIDB4MDgwQiwgMHg3NTEzLCAweDE2NDksIDB4NzUxNSwgMHgxNjQ4LCAweDc1MTgsIDB4MDYwMSwKLSAgICAweDc1MUEsIDB4MEExOSwgMHg3NTFDLCAweDBDMzYsIDB4NzUxRSwgMHgxNjRBLCAweDc1MUYsIDB4MEE1QywKLSAgICAweDc1MjIsIDB4MzVERSwgMHg3NTIzLCAweDA4ODgsIDB4NzUyNSwgMHgwNTFCLCAweDc1MjYsIDB4MTY0QiwKLSAgICAweDc1MjgsIDB4MEYzQiwgMHg3NTJCLCAweDBFMzMsIDB4NzUyQywgMHgxNjRDLCAweDc1MkYsIDB4MjBGMiwKLSAgICAweDc1MzAsIDB4MEMzRSwgMHg3NTMxLCAweDBGMUQsIDB4NzUzMiwgMHgwN0Q1LCAweDc1MzMsIDB4MEEwMywKLSAgICAweDc1MzcsIDB4MEI4OSwgMHg3NTM4LCAweDEwQzksIDB4NzUzQSwgMHgwQkNBLCAweDc1M0IsIDB4MDU2OCwKLSAgICAweDc1M0MsIDB4MTY0RCwgMHg3NTQ0LCAweDE2NEUsIDB4NzU0NiwgMHgxNjUzLCAweDc1NDksIDB4MTY1MSwKLSAgICAweDc1NEEsIDB4MTY1MCwgMHg3NTRCLCAweDEzQzcsIDB4NzU0QywgMHgwNTg0LCAweDc1NEQsIDB4MTY0RiwKLSAgICAweDc1NEUsIDB4MzlGQywgMHg3NTRGLCAweDA0OUUsIDB4NzU1MSwgMHgwRDNFLCAweDc1NTQsIDB4MEQ1RSwKLSAgICAweDc1NTksIDB4MEY3OSwgMHg3NTVBLCAweDE2NTQsIDB4NzU1QiwgMHgxNjUyLCAweDc1NUMsIDB4MEI5QSwKLSAgICAweDc1NUQsIDB4MEE0QSwgMHg3NTYwLCAweDBEM0YsIDB4NzU2MiwgMHgwRDlGLCAweDc1NjQsIDB4MTY1NiwKLSAgICAweDc1NjUsIDB4MEY3NCwgMHg3NTY2LCAweDA3MjMsIDB4NzU2NywgMHgxNjU3LCAweDc1NjksIDB4MTY1NSwKLSAgICAweDc1NkEsIDB4MEQ2QSwgMHg3NTZCLCAweDE2NTgsIDB4NzU2QywgMHgzQzNCLCAweDc1NkQsIDB4MTY1OSwKLSAgICAweDc1NkYsIDB4MjE3NSwgMHg3NTcwLCAweDA0OUYsIDB4NzU3MywgMHgwOURFLCAweDc1NzQsIDB4MTY1RSwKLSAgICAweDc1NzUsIDB4Mzc1MSwgMHg3NTc2LCAweDE2NUIsIDB4NzU3NywgMHgwQ0M1LCAweDc1NzgsIDB4MTY1QSwKLSAgICAweDc1NzksIDB4MzlGRCwgMHg3NTdGLCAweDA2NDAsIDB4NzU4MSwgMHgzOUZFLCAweDc1ODIsIDB4MTY2MSwKLSAgICAweDc1ODYsIDB4MTY1QywgMHg3NTg3LCAweDE2NUQsIDB4NzU4OSwgMHgxNjYwLCAweDc1OEEsIDB4MTY1RiwKLSAgICAweDc1OEIsIDB4MEQ5NywgMHg3NThFLCAweDBBQzQsIDB4NzU4RiwgMHgwQUMzLCAweDc1OTAsIDB4MzlGRiwKLSAgICAweDc1OTEsIDB4MDY1OSwgMHg3NTkyLCAweDNBMDAsIDB4NzU5MywgMHgzQTAxLCAweDc1OTQsIDB4MTY2MiwKLSAgICAweDc1OUEsIDB4MTY2MywgMHg3NTlELCAweDE2NjQsIDB4NzVBMywgMHgxNjY2LCAweDc1QTUsIDB4MTY2NSwKLSAgICAweDc1QUIsIDB4MDRGOCwgMHg3NUIxLCAweDE2NkUsIDB4NzVCMiwgMHgwRDdDLCAweDc1QjMsIDB4MTY2OCwKLSAgICAweDc1QjQsIDB4M0EwMiwgMHg3NUI1LCAweDE2NkEsIDB4NzVCOCwgMHgxNjZDLCAweDc1QjksIDB4MEEwNCwKLSAgICAweDc1QkMsIDB4MTY2RCwgMHg3NUJELCAweDE2NkIsIDB4NzVCRSwgMHgwOEVDLCAweDc1QzIsIDB4MTY2NywKLSAgICAweDc1QzMsIDB4MTY2OSwgMHg3NUM1LCAweDBEQjQsIDB4NzVDNywgMHgwOUIxLCAweDc1Q0EsIDB4MTY3MCwKLSAgICAweDc1Q0QsIDB4MTY2RiwgMHg3NUQyLCAweDE2NzEsIDB4NzVENCwgMHgwOEQyLCAweDc1RDUsIDB4MDgxRiwKLSAgICAweDc1RDgsIDB4MEM3MSwgMHg3NUQ5LCAweDE2NzIsIDB4NzVEQiwgMHgwQkU3LCAweDc1REUsIDB4MTY3NCwKLSAgICAweDc1RTIsIDB4MEY2OSwgMHg3NUUzLCAweDE2NzMsIDB4NzVFNCwgMHgzQTAzLCAweDc1RTksIDB4MEFFQiwKLSAgICAweDc1RUMsIDB4Mzc1MiwgMHg3NUYwLCAweDE2NzksIDB4NzVGMiwgMHgxNjdCLCAweDc1RjMsIDB4MTY3QywKLSAgICAweDc1RjQsIDB4MEI5MiwgMHg3NUY5LCAweDNBMDQsIDB4NzVGQSwgMHgxNjdBLCAweDc1RkMsIDB4MTY3NywKLSAgICAweDc1RkUsIDB4MTY3NSwgMHg3NUZGLCAweDE2NzYsIDB4NzYwMCwgMHgzQTA1LCAweDc2MDEsIDB4MTY3OCwKLSAgICAweDc2MDksIDB4MTY3RiwgMHg3NjBBLCAweDNBMDYsIDB4NzYwQiwgMHgxNjdELCAweDc2MEQsIDB4MTY3RSwKLSAgICAweDc2MTUsIDB4M0EwNywgMHg3NjE2LCAweDNBMDgsIDB4NzYxOSwgMHgzQTA5LCAweDc2MUUsIDB4M0EwQSwKLSAgICAweDc2MUYsIDB4MTY4MCwgMHg3NjIwLCAweDE2ODIsIDB4NzYyMSwgMHgxNjgzLCAweDc2MjIsIDB4MTY4NCwKLSAgICAweDc2MjQsIDB4MTY4NSwgMHg3NjI2LCAweDFFMkQsIDB4NzYyNywgMHgxNjgxLCAweDc2MkQsIDB4M0EwQiwKLSAgICAweDc2MzAsIDB4MTY4NywgMHg3NjM0LCAweDE2ODYsIDB4NzYzNSwgMHgzQTBDLCAweDc2M0IsIDB4MTY4OCwKLSAgICAweDc2NDIsIDB4MEY4RCwgMHg3NjQzLCAweDNBMEQsIDB4NzY0NiwgMHgxNjhCLCAweDc2NDcsIDB4MTY4OSwKLSAgICAweDc2NDgsIDB4MTY4QSwgMHg3NjRCLCAweDNBMEUsIDB4NzY0QywgMHgwNjFFLCAweDc2NEUsIDB4Mzc1MywKLSAgICAweDc2NTIsIDB4MEYwQSwgMHg3NjU2LCAweDBFMUEsIDB4NzY1OCwgMHgxNjhELCAweDc2NUMsIDB4MTY4QywKLSAgICAweDc2NjEsIDB4MTY4RSwgMHg3NjYyLCAweDE2OEYsIDB4NzY2NSwgMHgzQTBGLCAweDc2NjcsIDB4MTY5MywKLSAgICAweDc2NjgsIDB4MTY5MCwgMHg3NjY5LCAweDE2OTEsIDB4NzY2QSwgMHgxNjkyLCAweDc2NkMsIDB4MTY5NCwKLSAgICAweDc2NkQsIDB4M0ExMCwgMHg3NjZGLCAweDNBMTEsIDB4NzY3MCwgMHgxNjk1LCAweDc2NzEsIDB4M0ExMiwKLSAgICAweDc2NzIsIDB4MTY5NiwgMHg3Njc0LCAweDNBMTMsIDB4NzY3NiwgMHgxNjk3LCAweDc2NzgsIDB4MTY5OCwKLSAgICAweDc2N0EsIDB4MEQ0MywgMHg3NjdCLCAweDBDNEEsIDB4NzY3QywgMHgxNjk5LCAweDc2N0QsIDB4MEQyOCwKLSAgICAweDc2N0UsIDB4MERBNiwgMHg3NjgwLCAweDE2OUEsIDB4NzY4MiwgMHgyMTc2LCAweDc2ODMsIDB4MTY5QiwKLSAgICAweDc2ODQsIDB4MEMyNCwgMHg3Njg2LCAweDA1ODUsIDB4NzY4NywgMHgwN0Q2LCAweDc2ODgsIDB4MTY5QywKLSAgICAweDc2OEIsIDB4MTY5RCwgMHg3NjhFLCAweDE2OUUsIDB4NzY5MCwgMHgwODc3LCAweDc2OTMsIDB4MTZBMCwKLSAgICAweDc2OTYsIDB4MTY5RiwgMHg3Njk5LCAweDE2QTEsIDB4NzY5QSwgMHgxNkEyLCAweDc2OUIsIDB4MjE3OSwKLSAgICAweDc2OUMsIDB4MjE3NywgMHg3NjlFLCAweDIxNzgsIDB4NzZBNCwgMHgzQTE0LCAweDc2QTUsIDB4M0ExNSwKLSAgICAweDc2QTYsIDB4MjE3QSwgMHg3NkFFLCAweDBEN0QsIDB4NzZCMCwgMHgxNkEzLCAweDc2QjQsIDB4MTZBNCwKLSAgICAweDc2QjcsIDB4MUQxQywgMHg3NkI4LCAweDE2QTUsIDB4NzZCOSwgMHgxNkE2LCAweDc2QkEsIDB4MTZBNywKLSAgICAweDc2QkYsIDB4MDg3QywgMHg3NkMyLCAweDE2QTgsIDB4NzZDMywgMHgwRDBDLCAweDc2QzUsIDB4M0ExNiwKLSAgICAweDc2QzYsIDB4MEU4RCwgMHg3NkM4LCAweDA0RjAsIDB4NzZDQSwgMHgwNEY5LCAweDc2Q0MsIDB4M0ExNywKLSAgICAweDc2Q0QsIDB4MTZBOSwgMHg3NkQyLCAweDE2QUIsIDB4NzZENiwgMHgxNkFBLCAweDc2RDcsIDB4MEM2QSwKLSAgICAweDc2REIsIDB4MEE1RCwgMHg3NkRDLCAweDE0RDgsIDB4NzZERSwgMHgxNkFDLCAweDc2REYsIDB4MEVDRCwKLSAgICAweDc2RTEsIDB4MTZBRCwgMHg3NkUzLCAweDA2MDIsIDB4NzZFNCwgMHgwRDZCLCAweDc2RTUsIDB4MTZBRSwKLSAgICAweDc2RTcsIDB4MTZBRiwgMHg3NkVBLCAweDE2QjAsIDB4NzZFQywgMHgzQTE4LCAweDc2RUUsIDB4MEVFOCwKLSAgICAweDc2RjIsIDB4MEVFMSwgMHg3NkY0LCAweDBCREEsIDB4NzZGOCwgMHgwQUVDLCAweDc2RkIsIDB4MTZCMiwKLSAgICAweDc2RkMsIDB4M0ExOSwgMHg3NkZFLCAweDA5NkMsIDB4NzcwMSwgMHgwOUIyLCAweDc3MDQsIDB4MTZCNSwKLSAgICAweDc3MDcsIDB4MTZCNCwgMHg3NzA4LCAweDE2QjMsIDB4NzcwOSwgMHgwRDkxLCAweDc3MEIsIDB4MDYwMywKLSAgICAweDc3MEMsIDB4MDc1RCwgMHg3NzFCLCAweDE2QkIsIDB4NzcxRSwgMHgxNkI4LCAweDc3MUYsIDB4MEEwNSwKLSAgICAweDc3MjAsIDB4MEVCRSwgMHg3NzI0LCAweDE2QjcsIDB4NzcyNSwgMHgxNkI5LCAweDc3MjYsIDB4MTZCQSwKLSAgICAweDc3MjksIDB4MTZCNiwgMHg3NzM0LCAweDNBMUEsIDB4NzczNiwgMHgzQTFCLCAweDc3MzcsIDB4MTZCQywKLSAgICAweDc3MzgsIDB4MTZCRCwgMHg3NzNBLCAweDBCQ0IsIDB4NzczQywgMHgwNjFGLCAweDc3NDAsIDB4MEJBMywKLSAgICAweDc3NDYsIDB4MjE3QywgMHg3NzQ3LCAweDE2QkUsIDB4Nzc1QSwgMHgxNkJGLCAweDc3NUIsIDB4MTZDMiwKLSAgICAweDc3NUMsIDB4M0ExQywgMHg3NzVGLCAweDNBMUQsIDB4Nzc2MCwgMHgzQTFFLCAweDc3NjEsIDB4MEEyRCwKLSAgICAweDc3NjIsIDB4MUVDNSwgMHg3NzYzLCAweDBDOUMsIDB4Nzc2NSwgMHgxNkMzLCAweDc3NjYsIDB4MEU4MSwKLSAgICAweDc3NjgsIDB4MTZDMCwgMHg3NzZBLCAweDM3NTUsIDB4Nzc2QiwgMHgxNkMxLCAweDc3NzIsIDB4M0ExRiwKLSAgICAweDc3NzksIDB4MTZDNiwgMHg3NzdELCAweDNBMjAsIDB4Nzc3RSwgMHgxNkM1LCAweDc3N0YsIDB4MTZDNCwKLSAgICAweDc3OEIsIDB4MTZDOCwgMHg3NzhFLCAweDE2QzcsIDB4Nzc5MSwgMHgxNkM5LCAweDc3OTUsIDB4M0EyMSwKLSAgICAweDc3OUUsIDB4MTZDQiwgMHg3N0EwLCAweDE2Q0EsIDB4NzdBNSwgMHgwRTFELCAweDc3QTksIDB4Mzc1NiwKLSAgICAweDc3QUEsIDB4M0EyMiwgMHg3N0FDLCAweDA5NjAsIDB4NzdBRCwgMHgwRjhFLCAweDc3QjAsIDB4MTZDQywKLSAgICAweDc3QjMsIDB4MEM4RiwgMHg3N0I2LCAweDE2Q0QsIDB4NzdCOSwgMHgxNkNFLCAweDc3QkIsIDB4MTZEMiwKLSAgICAweDc3QkMsIDB4MTZEMCwgMHg3N0JELCAweDE2RDEsIDB4NzdCRiwgMHgxNkNGLCAweDc3QzcsIDB4MTZEMywKLSAgICAweDc3Q0QsIDB4MTZENCwgMHg3N0Q3LCAweDE2RDUsIDB4NzdEQSwgMHgxNkQ2LCAweDc3REIsIDB4MEVDMywKLSAgICAweDc3REMsIDB4MTZENywgMHg3N0UyLCAweDBFRkMsIDB4NzdFMywgMHgxNkQ4LCAweDc3RTUsIDB4MEI4QywKLSAgICAweDc3RTYsIDB4M0EyMywgMHg3N0U3LCAweDBEMjAsIDB4NzdFOSwgMHgwNkUzLCAweDc3RUQsIDB4MEI3OSwKLSAgICAweDc3RUUsIDB4MTZEOSwgMHg3N0VGLCAweDA2QjIsIDB4NzdGMCwgMHgzQTI0LCAweDc3RjMsIDB4MEE3NCwKLSAgICAweDc3RjQsIDB4M0EyNSwgMHg3N0ZDLCAweDE2REEsIDB4NzgwMiwgMHgwODJELCAweDc4MDYsIDB4M0EyNiwKLSAgICAweDc4MEMsIDB4MTZEQiwgMHg3ODEyLCAweDE2REMsIDB4NzgxNCwgMHgwNzVBLCAweDc4MTUsIDB4MDg0NSwKLSAgICAweDc4MjAsIDB4MTZERSwgMHg3ODIxLCAweDIxN0UsIDB4NzgyMiwgMHgzQTI3LCAweDc4MjUsIDB4MEM1MCwKLSAgICAweDc4MjYsIDB4MDg0NiwgMHg3ODI3LCAweDA2NjgsIDB4NzgyRCwgMHgzQTI4LCAweDc4MkUsIDB4M0EyOSwKLSAgICAweDc4MzAsIDB4M0EyQSwgMHg3ODMyLCAweDBFNTIsIDB4NzgzNCwgMHgwRDAxLCAweDc4MzUsIDB4M0EyQiwKLSAgICAweDc4M0EsIDB4MEM1MSwgMHg3ODNGLCAweDA3RUUsIDB4Nzg0NSwgMHgxNkUwLCAweDc4NEUsIDB4MjE3RiwKLSAgICAweDc4NEYsIDB4MzQxRSwgMHg3ODUxLCAweDNDM0MsIDB4Nzg1RCwgMHgwOUIzLCAweDc4NjQsIDB4MjE4MCwKLSAgICAweDc4NjgsIDB4M0EyQywgMHg3ODZCLCAweDBGN0EsIDB4Nzg2QywgMHgwN0Q3LCAweDc4NkYsIDB4MDc1QiwKLSAgICAweDc4NzIsIDB4MEQzNywgMHg3ODc0LCAweDE2RTIsIDB4Nzg3QSwgMHgyMTgxLCAweDc4N0MsIDB4MTZFNCwKLSAgICAweDc4ODEsIDB4MDc5RiwgMHg3ODg2LCAweDE2RTMsIDB4Nzg4NywgMHgwQzEyLCAweDc4OEMsIDB4MTZFNiwKLSAgICAweDc4OEQsIDB4MDU5NSwgMHg3ODhFLCAweDE2RTEsIDB4Nzg5MSwgMHgwRDdFLCAweDc4OTMsIDB4MDREMiwKLSAgICAweDc4OTUsIDB4MDg1QywgMHg3ODk3LCAweDBGRjgsIDB4Nzg5QSwgMHgxNkU1LCAweDc4OUUsIDB4M0EyRCwKLSAgICAweDc4QTMsIDB4MTZFNywgMHg3OEE3LCAweDBFMUIsIDB4NzhBOSwgMHgwQTdELCAweDc4QUEsIDB4MTZFOSwKLSAgICAweDc4QUYsIDB4MTZFQSwgMHg3OEI1LCAweDE2RTgsIDB4NzhCQSwgMHgwNUFDLCAweDc4QkMsIDB4MTZGMCwKLSAgICAweDc4QkUsIDB4MTZFRiwgMHg3OEMxLCAweDA4RDMsIDB4NzhDNSwgMHgxNkYxLCAweDc4QzYsIDB4MTZFQywKLSAgICAweDc4QzgsIDB4M0EyRSwgMHg3OENBLCAweDE2RjIsIDB4NzhDQiwgMHgxNkVELCAweDc4Q0MsIDB4M0EyRiwKLSAgICAweDc4Q0UsIDB4M0EzMCwgMHg3OEQwLCAweDBENkMsIDB4NzhEMSwgMHgxNkVCLCAweDc4RDQsIDB4MTZFRSwKLSAgICAweDc4REEsIDB4MTZGNSwgMHg3OEUwLCAweDNBMzIsIDB4NzhFMSwgMHgzQTMzLCAweDc4RTQsIDB4M0EzMSwKLSAgICAweDc4RTcsIDB4MTZGNCwgMHg3OEU4LCAweDBFOEYsIDB4NzhFQywgMHgxNkYzLCAweDc4RUYsIDB4MDRBRiwKLSAgICAweDc4RjIsIDB4M0EzNCwgMHg3OEY0LCAweDE2RjcsIDB4NzhGNywgMHgzQTM1LCAweDc4RkIsIDB4M0EzNiwKLSAgICAweDc4RkQsIDB4MTZGNiwgMHg3OTAxLCAweDA5QjQsIDB4NzkwNywgMHgxNkY4LCAweDc5MEUsIDB4MEFDNSwKLSAgICAweDc5MTEsIDB4MTZGQSwgMHg3OTEyLCAweDE2RjksIDB4NzkxOSwgMHgxNkZCLCAweDc5MjYsIDB4MTZERCwKLSAgICAweDc5MkEsIDB4MTZERiwgMHg3OTJCLCAweDE2RkQsIDB4NzkyQywgMHgxNkZDLCAweDc5MzAsIDB4MjE4MiwKLSAgICAweDc5MzEsIDB4M0EzNywgMHg3OTM0LCAweDNBMzgsIDB4NzkzQSwgMHgwOEQ0LCAweDc5M0IsIDB4M0EzOSwKLSAgICAweDc5M0MsIDB4MEZCMSwgMHg3OTNELCAweDNBM0EsIDB4NzkzRSwgMHgwOEZFLCAweDc5NDAsIDB4MTZGRSwKLSAgICAweDc5NDEsIDB4MDcwRCwgMHg3OTQ1LCAweDNBM0IsIDB4Nzk0NywgMHgwNjVBLCAweDc5NDgsIDB4MDY0MSwKLSAgICAweDc5NDksIDB4MDhCMSwgMHg3OTUwLCAweDBGMUUsIDB4Nzk1MywgMHgxNzA0LCAweDc5NTUsIDB4MTcwMywKLSAgICAweDc5NTYsIDB4MEFDNiwgMHg3OTU3LCAweDE3MDAsIDB4Nzk1QSwgMHgxNzAyLCAweDc5NUIsIDB4M0EzQywKLSAgICAweDc5NUMsIDB4M0EzRCwgMHg3OTVELCAweDA5NTUsIDB4Nzk1RSwgMHgwQTA2LCAweDc5NUYsIDB4MTcwMSwKLSAgICAweDc5NjAsIDB4MTZGRiwgMHg3OTYyLCAweDBDRTAsIDB4Nzk2NSwgMHgwOUI1LCAweDc5NjgsIDB4MERBRSwKLSAgICAweDc5NkQsIDB4MDg0NywgMHg3OTc3LCAweDBDNzIsIDB4Nzk3QSwgMHgxNzA1LCAweDc5N0YsIDB4MTcwNiwKLSAgICAweDc5ODAsIDB4MTcxQywgMHg3OTgxLCAweDA2RDAsIDB4Nzk4NCwgMHgwRkUzLCAweDc5ODUsIDB4MEFCNywKLSAgICAweDc5OEEsIDB4MTcwNywgMHg3OThCLCAweDNBM0UsIDB4Nzk4RCwgMHgwNTUyLCAweDc5OEUsIDB4MEMxMywKLSAgICAweDc5OEYsIDB4MERGMSwgMHg3OTk0LCAweDIxODYsIDB4Nzk5NiwgMHgzQTNGLCAweDc5OTgsIDB4M0E0MCwKLSAgICAweDc5OUIsIDB4MjE4OCwgMHg3OTlELCAweDE3MDgsIDB4NzlBNiwgMHgwNjk0LCAweDc5QTcsIDB4MTcwOSwKLSAgICAweDc5QUEsIDB4MTcwQiwgMHg3OUFFLCAweDE3MEMsIDB4NzlCMCwgMHgwQ0RGLCAweDc5QjEsIDB4MUU0RSwKLSAgICAweDc5QjMsIDB4MTcwRCwgMHg3OUI4LCAweDNBNDEsIDB4NzlCOSwgMHgxNzBFLCAweDc5QkEsIDB4MTcwRiwKLSAgICAweDc5QkIsIDB4M0E0MiwgMHg3OUJELCAweDA2RDEsIDB4NzlCRSwgMHgwNTUzLCAweDc5QkYsIDB4MEM5RCwKLSAgICAweDc5QzAsIDB4MDkzMiwgMHg3OUMxLCAweDA4QjIsIDB4NzlDOSwgMHgxNzEwLCAweDc5Q0EsIDB4M0E0MywKLSAgICAweDc5Q0IsIDB4MDkzMywgMHg3OUQxLCAweDA1NEEsIDB4NzlEMiwgMHgwREI1LCAweDc5RDUsIDB4MTcxMSwKLSAgICAweDc5RDgsIDB4MEQ3RiwgMHg3OURBLCAweDNBNDQsIDB4NzlERiwgMHgwQUM3LCAweDc5RTEsIDB4MTcxNCwKLSAgICAweDc5RTMsIDB4MTcxNSwgMHg3OUU0LCAweDBEMUYsIDB4NzlFNiwgMHgwQTA3LCAweDc5RTcsIDB4MTcxMiwKLSAgICAweDc5RTksIDB4MEI5RiwgMHg3OUVDLCAweDE3MTMsIDB4NzlGMCwgMHgwOUI2LCAweDc5RkIsIDB4MDRBMCwKLSAgICAweDdBMDAsIDB4MDY0MywgMHg3QTAzLCAweDNBNDUsIDB4N0EwNSwgMHgzNjMzLCAweDdBMDgsIDB4MTcxNiwKLSAgICAweDdBMDksIDB4M0E0NiwgMHg3QTBCLCAweDBDMTQsIDB4N0EwRCwgMHgxNzE3LCAweDdBMEUsIDB4MEE2QiwKLSAgICAweDdBMTEsIDB4M0E0NywgMHg3QTE0LCAweDBFQjksIDB4N0ExNywgMHgwRDk1LCAweDdBMTgsIDB4MTcxOCwKLSAgICAweDdBMTksIDB4MTcxOSwgMHg3QTFBLCAweDBCOTMsIDB4N0ExQywgMHgwRjhGLCAweDdBMUUsIDB4M0E0OCwKLSAgICAweDdBMUYsIDB4MTcxQiwgMHg3QTIwLCAweDE3MUEsIDB4N0EyRCwgMHgzQTQ5LCAweDdBMkUsIDB4MDkxQiwKLSAgICAweDdBMzEsIDB4MTcxRCwgMHg3QTMyLCAweDA0QjQsIDB4N0EzNywgMHgxNzIwLCAweDdBMzksIDB4M0E0QSwKLSAgICAweDdBM0IsIDB4MTcxRSwgMHg3QTNDLCAweDA1NTQsIDB4N0EzRCwgMHgwNzI0LCAweDdBM0UsIDB4MTcxRiwKLSAgICAweDdBM0YsIDB4MDdEOCwgMHg3QTQwLCAweDA4MDQsIDB4N0E0MiwgMHgwRTM2LCAweDdBNDMsIDB4MTcyMSwKLSAgICAweDdBNDUsIDB4M0E0QiwgMHg3QTQ2LCAweDBFODIsIDB4N0E0OSwgMHgxNzIzLCAweDdBNEMsIDB4M0E0QywKLSAgICAweDdBNEQsIDB4MEE3NSwgMHg3QTRFLCAweDA0RjEsIDB4N0E0RiwgMHgwNTNBLCAweDdBNTAsIDB4MDQ3MCwKLSAgICAweDdBNTcsIDB4MTcyMiwgMHg3QTVELCAweDNBNEQsIDB4N0E2MCwgMHgzQTRFLCAweDdBNjEsIDB4MTcyNCwKLSAgICAweDdBNjIsIDB4MTcyNSwgMHg3QTYzLCAweDA5REYsIDB4N0E2OSwgMHgxNzI2LCAweDdBNkIsIDB4MDVBRCwKLSAgICAweDdBNkQsIDB4M0E0RiwgMHg3QTcwLCAweDE3MjgsIDB4N0E3NCwgMHgwNzQwLCAweDdBNzYsIDB4MDY4MCwKLSAgICAweDdBNzgsIDB4M0E1MCwgMHg3QTc5LCAweDE3MjksIDB4N0E3QSwgMHgwNkVELCAweDdBN0QsIDB4MTcyQSwKLSAgICAweDdBN0YsIDB4MEFBMCwgMHg3QTgxLCAweDBDQTUsIDB4N0E4MywgMHgwQTg0LCAweDdBODQsIDB4MDg2NSwKLSAgICAweDdBODgsIDB4MTcyQiwgMHg3QTkyLCAweDBCQTAsIDB4N0E5MywgMHgwQUVELCAweDdBOTUsIDB4MTcyRCwKLSAgICAweDdBOTYsIDB4MTcyRiwgMHg3QTk3LCAweDE3MkMsIDB4N0E5OCwgMHgxNzJFLCAweDdBOUYsIDB4MDZGOCwKLSAgICAweDdBQTAsIDB4M0E1MSwgMHg3QUEzLCAweDNBNTIsIDB4N0FBOSwgMHgxNzMwLCAweDdBQUEsIDB4MDZGQywKLSAgICAweDdBQUUsIDB4MDY4MSwgMHg3QUFGLCAweDBGM0MsIDB4N0FCMCwgMHgxNzMyLCAweDdBQjMsIDB4M0E1MywKLSAgICAweDdBQjYsIDB4MTczMywgMHg3QUJBLCAweDA0RDAsIDB4N0FCQiwgMHgzQTU0LCAweDdBQkMsIDB4M0E1NSwKLSAgICAweDdBQkYsIDB4MTczNiwgMHg3QUMzLCAweDA1RDQsIDB4N0FDNCwgMHgxNzM1LCAweDdBQzUsIDB4MTczNCwKLSAgICAweDdBQzYsIDB4M0E1NiwgMHg3QUM3LCAweDE3MzgsIDB4N0FDOCwgMHgxNzMxLCAweDdBQ0EsIDB4MTczOSwKLSAgICAweDdBQ0IsIDB4MEY3MSwgMHg3QUNELCAweDE3M0EsIDB4N0FDRiwgMHgxNzNCLCAweDdBRDEsIDB4MjE4OSwKLSAgICAweDdBRDIsIDB4MTFDNSwgMHg3QUQzLCAweDE3M0QsIDB4N0FENSwgMHgxNzNDLCAweDdBRDksIDB4MTczRSwKLSAgICAweDdBREEsIDB4MTczRiwgMHg3QURDLCAweDBGN0QsIDB4N0FERCwgMHgxNzQwLCAweDdBREYsIDB4MUMwOCwKLSAgICAweDdBRTAsIDB4MDlCNywgMHg3QUUxLCAweDE3NDEsIDB4N0FFMiwgMHgxNzQyLCAweDdBRTMsIDB4MDk2MSwKLSAgICAweDdBRTUsIDB4MEM5MCwgMHg3QUU2LCAweDE3NDMsIDB4N0FFNywgMHgyMThBLCAweDdBRUEsIDB4MEI2NiwKLSAgICAweDdBRUIsIDB4MjE4QywgMHg3QUVELCAweDE3NDQsIDB4N0FFRiwgMHgwQjdBLCAweDdBRjAsIDB4MTc0NSwKLSAgICAweDdBRjYsIDB4MDY5RCwgMHg3QUY4LCAweDEwNzYsIDB4N0FGOSwgMHgwQjlCLCAweDdBRkEsIDB4MDhERiwKLSAgICAweDdBRkYsIDB4MDYwNCwgMHg3QjAyLCAweDE3NDYsIDB4N0IwNCwgMHgxNzUzLCAweDdCMDYsIDB4MTc0OSwKLSAgICAweDdCMDcsIDB4M0E1NywgMHg3QjA4LCAweDA2ODIsIDB4N0IwQSwgMHgxNzQ4LCAweDdCMEIsIDB4MTc1NSwKLSAgICAweDdCMEYsIDB4MTc0NywgMHg3QjExLCAweDA5QjgsIDB4N0IxNCwgMHgzQTU4LCAweDdCMTgsIDB4MTc0QiwKLSAgICAweDdCMTksIDB4MTc0QywgMHg3QjFCLCAweDBDMjUsIDB4N0IxRSwgMHgxNzRELCAweDdCMjAsIDB4MDVCQywKLSAgICAweDdCMjUsIDB4MEEyMCwgMHg3QjI2LCAweDBERDYsIDB4N0IyNywgMHgzQTU5LCAweDdCMjgsIDB4MTc0RiwKLSAgICAweDdCMkMsIDB4MEI0OCwgMHg3QjMxLCAweDNBNUEsIDB4N0IzMywgMHgxNzRBLCAweDdCMzUsIDB4MTc0RSwKLSAgICAweDdCMzYsIDB4MTc1MCwgMHg3QjM5LCAweDA4NkIsIDB4N0I0NSwgMHgxNzU3LCAweDdCNDYsIDB4MERBMCwKLSAgICAweDdCNDcsIDB4M0E1QiwgMHg3QjQ4LCAweDBEM0EsIDB4N0I0OSwgMHgwQzczLCAweDdCNEIsIDB4MDZEMiwKLSAgICAweDdCNEMsIDB4MTc1NiwgMHg3QjRELCAweDE3NTQsIDB4N0I0RSwgMHgzQTVDLCAweDdCNEYsIDB4MEQ0OSwKLSAgICAweDdCNTAsIDB4MTc1MSwgMHg3QjUxLCAweDBCOUMsIDB4N0I1MiwgMHgwQzc1LCAweDdCNTMsIDB4Mzc1RCwKLSAgICAweDdCNTQsIDB4MEM3NCwgMHg3QjU2LCAweDA4NjYsIDB4N0I1RCwgMHgxNzY5LCAweDdCNjAsIDB4M0E1RCwKLSAgICAweDdCNjUsIDB4MTc1OSwgMHg3QjY3LCAweDE3NUIsIDB4N0I2OSwgMHgzQTVFLCAweDdCNkMsIDB4MTc1RSwKLSAgICAweDdCNkQsIDB4M0E1RiwgMHg3QjZFLCAweDE3NUYsIDB4N0I3MCwgMHgxNzVDLCAweDdCNzEsIDB4MTc1RCwKLSAgICAweDdCNzIsIDB4M0E2MCwgMHg3Qjc0LCAweDE3NUEsIDB4N0I3NSwgMHgxNzU4LCAweDdCN0EsIDB4MTc1MiwKLSAgICAweDdCODYsIDB4MEUxRiwgMHg3Qjg3LCAweDA1NTUsIDB4N0I4QiwgMHgxNzY2LCAweDdCOEQsIDB4MTc2MywKLSAgICAweDdCOEYsIDB4MTc2OCwgMHg3QjkxLCAweDNBNjEsIDB4N0I5MiwgMHgxNzY3LCAweDdCOTQsIDB4MEQyOSwKLSAgICAweDdCOTUsIDB4MEVCMywgMHg3Qjk3LCAweDA4ODksIDB4N0I5OCwgMHgxNzYxLCAweDdCOTksIDB4MTc2QSwKLSAgICAweDdCOUEsIDB4MTc2NSwgMHg3QjlDLCAweDE3NjQsIDB4N0I5RCwgMHgxNzYwLCAweDdCOUUsIDB4MjE4RCwKLSAgICAweDdCOUYsIDB4MTc2MiwgMHg3QkExLCAweDA2MDUsIDB4N0JBQSwgMHgwQjdCLCAweDdCQUQsIDB4MEFBMSwKLSAgICAweDdCQUYsIDB4M0E2MiwgMHg3QkIxLCAweDBEMzYsIDB4N0JCNCwgMHgxNzZGLCAweDdCQjgsIDB4MEQzOCwKLSAgICAweDdCQzAsIDB4MEE4NSwgMHg3QkMxLCAweDE3NkMsIDB4N0JDNCwgMHgwRDYzLCAweDdCQzYsIDB4MTc3MCwKLSAgICAweDdCQzcsIDB4MEUyMywgMHg3QkM5LCAweDBCOTksIDB4N0JDQiwgMHgxNzZCLCAweDdCQ0MsIDB4MTc2RCwKLSAgICAweDdCQ0YsIDB4MTc2RSwgMHg3QkQ3LCAweDNBNjMsIDB4N0JEOSwgMHgzQTY0LCAweDdCREQsIDB4MTc3MSwKLSAgICAweDdCRTAsIDB4MDhGMCwgMHg3QkU0LCAweDBDOUUsIDB4N0JFNSwgMHgxNzc2LCAweDdCRTYsIDB4MTc3NSwKLSAgICAweDdCRTksIDB4MTc3MiwgMHg3QkVELCAweDBGREMsIDB4N0JGMywgMHgxNzdCLCAweDdCRjYsIDB4MTc3RiwKLSAgICAweDdCRjcsIDB4MTc3QywgMHg3QzAwLCAweDE3NzgsIDB4N0MwNywgMHgxNzc5LCAweDdDMEIsIDB4M0E2NSwKLSAgICAweDdDMEQsIDB4MTc3RSwgMHg3QzBGLCAweDNBNjYsIDB4N0MxMSwgMHgxNzczLCAweDdDMTIsIDB4MTBFQSwKLSAgICAweDdDMTMsIDB4MTc3QSwgMHg3QzE0LCAweDE3NzQsIDB4N0MxNywgMHgxNzdELCAweDdDMUUsIDB4MUUzQiwKLSAgICAweDdDMUYsIDB4MTc4MywgMHg3QzIwLCAweDNBNjcsIDB4N0MyMSwgMHgwNjA2LCAweDdDMjMsIDB4MTc4MCwKLSAgICAweDdDMjYsIDB4M0E2OCwgMHg3QzI3LCAweDE3ODEsIDB4N0MyQSwgMHgxNzgyLCAweDdDMkIsIDB4MTc4NSwKLSAgICAweDdDMzEsIDB4M0E2OSwgMHg3QzM2LCAweDNBNkEsIDB4N0MzNywgMHgxNzg0LCAweDdDMzgsIDB4MEQ4QSwKLSAgICAweDdDM0QsIDB4MTc4NiwgMHg3QzNFLCAweDBGQzQsIDB4N0MzRiwgMHgwRTNELCAweDdDNDAsIDB4MTc4QiwKLSAgICAweDdDNDMsIDB4MTc4OCwgMHg3QzRDLCAweDE3ODcsIDB4N0M0RCwgMHgwQTc2LCAweDdDNEYsIDB4MTc4QSwKLSAgICAweDdDNTAsIDB4MTc4QywgMHg3QzUxLCAweDNBNkIsIDB4N0M1NCwgMHgxNzg5LCAweDdDNTYsIDB4MTc5MCwKLSAgICAweDdDNTgsIDB4MTc4RCwgMHg3QzU5LCAweDNBNkMsIDB4N0M1RiwgMHgxNzhFLCAweDdDNjAsIDB4MTc3NywKLSAgICAweDdDNjQsIDB4MTc4RiwgMHg3QzY1LCAweDE3OTEsIDB4N0M2NywgMHgzQTZELCAweDdDNkMsIDB4MTc5MiwKLSAgICAweDdDNkUsIDB4M0E2RSwgMHg3QzcwLCAweDNBNkYsIDB4N0M3MywgMHgwRTE2LCAweDdDNzUsIDB4MTc5MywKLSAgICAweDdDN0IsIDB4MzcwRSwgMHg3QzdFLCAweDBFRUUsIDB4N0M4MSwgMHgwNkM2LCAweDdDODIsIDB4MDZGRiwKLSAgICAweDdDODMsIDB4MTc5NCwgMHg3Qzg5LCAweDBFMDQsIDB4N0M4QiwgMHgwQTJFLCAweDdDOEQsIDB4MEVCQywKLSAgICAweDdDOTAsIDB4MTc5NSwgMHg3QzkyLCAweDBGN0IsIDB4N0M5NSwgMHgwRDJBLCAweDdDOTcsIDB4MEFDOCwKLSAgICAweDdDOTgsIDB4MENFQSwgMHg3QzlCLCAweDA5NTcsIDB4N0M5RiwgMHgwNDg0LCAweDdDQTEsIDB4MTc5QSwKLSAgICAweDdDQTIsIDB4MTc5OCwgMHg3Q0E0LCAweDE3OTYsIDB4N0NBNSwgMHgwNURELCAweDdDQTcsIDB4MDlCOSwKLSAgICAweDdDQTgsIDB4MTc5QiwgMHg3Q0FCLCAweDE3OTksIDB4N0NBRCwgMHgxNzk3LCAweDdDQUUsIDB4MTc5RiwKLSAgICAweDdDQjEsIDB4MTc5RSwgMHg3Q0IyLCAweDE3OUQsIDB4N0NCMywgMHgxNzlDLCAweDdDQjksIDB4MTdBMCwKLSAgICAweDdDQkMsIDB4M0E3MCwgMHg3Q0JELCAweDE3QTEsIDB4N0NCRSwgMHgwQTVFLCAweDdDQkYsIDB4M0E3MSwKLSAgICAweDdDQzAsIDB4MTdBMiwgMHg3Q0MyLCAweDE3QTQsIDB4N0NDNSwgMHgxN0EzLCAweDdDQzgsIDB4M0E3MiwKLSAgICAweDdDQzksIDB4M0E3MywgMHg3Q0NBLCAweDA3ODYsIDB4N0NDRSwgMHgwQUJBLCAweDdDRDIsIDB4MTdBNiwKLSAgICAweDdDRDYsIDB4MEM3NiwgMHg3Q0Q3LCAweDNBNzQsIDB4N0NEOCwgMHgxN0E1LCAweDdDRDksIDB4M0E3NSwKLSAgICAweDdDREMsIDB4MTdBNywgMHg3Q0RELCAweDNBNzYsIDB4N0NERSwgMHgwRTA1LCAweDdDREYsIDB4MEFFRSwKLSAgICAweDdDRTAsIDB4MDdEOSwgMHg3Q0UyLCAweDE3QTgsIDB4N0NFNywgMHgwRjkwLCAweDdDRUIsIDB4M0E3NywKLSAgICAweDdDRUYsIDB4MTdBQSwgMHg3Q0YyLCAweDE3QUIsIDB4N0NGNCwgMHgxN0FDLCAweDdDRjYsIDB4MTdBRCwKLSAgICAweDdDRjgsIDB4MDhCMywgMHg3Q0ZBLCAweDE3QUUsIDB4N0NGQiwgMHgwNzI1LCAweDdDRkUsIDB4MDY4NCwKLSAgICAweDdEMDAsIDB4MDY0NCwgMHg3RDAyLCAweDE3QjAsIDB4N0QwNCwgMHgwRUZGLCAweDdEMDUsIDB4MDdEQSwKLSAgICAweDdEMDYsIDB4MTdBRiwgMHg3RDA3LCAweDNBNzgsIDB4N0QwOCwgMHgzQTc5LCAweDdEMDksIDB4M0E3QSwKLSAgICAweDdEMEEsIDB4MTdCMywgMHg3RDBCLCAweDBFRjIsIDB4N0QwRCwgMHgwQ0YyLCAweDdEMTAsIDB4MERBNSwKLSAgICAweDdEMTMsIDB4M0E3QiwgMHg3RDE0LCAweDA5NkQsIDB4N0QxNSwgMHgxN0IyLCAweDdEMTcsIDB4MDhGRiwKLSAgICAweDdEMTgsIDB4MDdEQiwgMHg3RDE5LCAweDA4QjQsIDB4N0QxQSwgMHgwNjgzLCAweDdEMUIsIDB4MEUwNiwKLSAgICAweDdEMUMsIDB4MTdCMSwgMHg3RDFELCAweDNBN0MsIDB4N0QyMCwgMHgwQUM5LCAweDdEMjEsIDB4MEU3MCwKLSAgICAweDdEMjIsIDB4MDg2NywgMHg3RDIzLCAweDNBN0QsIDB4N0QyQiwgMHgwOEI1LCAweDdEMkMsIDB4MEJGOSwKLSAgICAweDdEMkUsIDB4MTdCNiwgMHg3RDJGLCAweDBGQTcsIDB4N0QzMCwgMHgwODQ5LCAweDdEMzIsIDB4MTdCNywKLSAgICAweDdEMzMsIDB4MEEwOCwgMHg3RDM1LCAweDE3QjksIDB4N0QzOSwgMHgwOUJBLCAweDdEM0EsIDB4MDgyMCwKLSAgICAweDdEM0YsIDB4MTdCOCwgMHg3RDQxLCAweDNBN0UsIDB4N0Q0MiwgMHgwOTM0LCAweDdENDMsIDB4MDc3MiwKLSAgICAweDdENDQsIDB4MEFDQSwgMHg3RDQ1LCAweDE3QjQsIDB4N0Q0NiwgMHgxN0JBLCAweDdENDgsIDB4MjE4RiwKLSAgICAweDdENEIsIDB4MTdCNSwgMHg3RDRDLCAweDA3MjYsIDB4N0Q0RSwgMHgxN0JELCAweDdENEYsIDB4MTdDMSwKLSAgICAweDdENTAsIDB4MDc0MSwgMHg3RDUzLCAweDNBN0YsIDB4N0Q1NiwgMHgxN0JDLCAweDdENTksIDB4M0E4MCwKLSAgICAweDdENUIsIDB4MTdDNSwgMHg3RDVDLCAweDIxOTAsIDB4N0Q1RCwgMHgzQTgxLCAweDdENUUsIDB4MDdEQywKLSAgICAweDdENjEsIDB4MEY1NywgMHg3RDYyLCAweDA0ODAsIDB4N0Q2MywgMHgxN0MyLCAweDdENjYsIDB4MDY4NSwKLSAgICAweDdENjgsIDB4MTdCRiwgMHg3RDZFLCAweDE3QzAsIDB4N0Q3MSwgMHgwQzc3LCAweDdENzIsIDB4MTdCRSwKLSAgICAweDdENzMsIDB4MTdCQiwgMHg3RDc1LCAweDA1ODYsIDB4N0Q3NiwgMHgwQTg4LCAweDdENzksIDB4MDc1QywKLSAgICAweDdEN0EsIDB4M0E4MiwgMHg3RDdELCAweDE3QzcsIDB4N0Q4NiwgMHgzQTgzLCAweDdEODksIDB4MTdDNCwKLSAgICAweDdEOEIsIDB4M0E4NCwgMHg3RDhDLCAweDNBODUsIDB4N0Q4RiwgMHgxN0M2LCAweDdEOTMsIDB4MTdDMywKLSAgICAweDdEOTksIDB4MDcyNywgMHg3RDlBLCAweDBCMTMsIDB4N0Q5QiwgMHgxN0M4LCAweDdEOUMsIDB4MEFGMCwKLSAgICAweDdEOUYsIDB4MTdENSwgMHg3REEwLCAweDIxOTIsIDB4N0RBMiwgMHgxN0QxLCAweDdEQTMsIDB4MTdDQiwKLSAgICAweDdEQUIsIDB4MTdDRiwgMHg3REFDLCAweDA5MjYsIDB4N0RBRCwgMHgwNEExLCAweDdEQUUsIDB4MTdDQSwKLSAgICAweDdEQUYsIDB4MTdEMiwgMHg3REIwLCAweDE3RDYsIDB4N0RCMSwgMHgwN0RELCAweDdEQjIsIDB4MEVFMiwKLSAgICAweDdEQjQsIDB4MEJGMiwgMHg3REI1LCAweDE3Q0MsIDB4N0RCNywgMHgyMTkxLCAweDdEQjgsIDB4MTdENCwKLSAgICAweDdEQkEsIDB4MTdDOSwgMHg3REJCLCAweDBCN0MsIDB4N0RCRCwgMHgxN0NFLCAweDdEQkUsIDB4MDQ4MSwKLSAgICAweDdEQkYsIDB4MEVENiwgMHg3REM3LCAweDE3Q0QsIDB4N0RDQSwgMHgwNkQzLCAweDdEQ0IsIDB4MEQ4MCwKLSAgICAweDdEQ0MsIDB4M0E4NiwgMHg3RENGLCAweDBBRUYsIDB4N0REMSwgMHgwRjk4LCAweDdERDIsIDB4MDk3OSwKLSAgICAweDdERDUsIDB4MTdGRCwgMHg3REQ2LCAweDIxOTMsIDB4N0REOCwgMHgxN0Q3LCAweDdEREEsIDB4MEFBMiwKLSAgICAweDdEREMsIDB4MTdEMywgMHg3RERELCAweDE3RDgsIDB4N0RERSwgMHgxN0RBLCAweDdERTAsIDB4MEMxNSwKLSAgICAweDdERTEsIDB4MTdERCwgMHg3REUzLCAweDM0MEEsIDB4N0RFNCwgMHgxN0Q5LCAweDdERTgsIDB4MEUyNCwKLSAgICAweDdERTksIDB4MDYwNywgMHg3REVCLCAweDNBODcsIDB4N0RFQywgMHgwRUQ3LCAweDdERUYsIDB4MDRBMiwKLSAgICAweDdERjEsIDB4M0E4OCwgMHg3REYyLCAweDE3REMsIDB4N0RGNCwgMHgwRkM1LCAweDdERjksIDB4M0E4OSwKLSAgICAweDdERkIsIDB4MTdEQiwgMHg3RTAxLCAweDA1MTEsIDB4N0UwNCwgMHgwQ0M0LCAweDdFMDUsIDB4MTdERSwKLSAgICAweDdFMDgsIDB4M0E4QSwgMHg3RTA5LCAweDE3RTUsIDB4N0UwQSwgMHgxN0RGLCAweDdFMEIsIDB4MTdFNiwKLSAgICAweDdFMTEsIDB4M0E4QiwgMHg3RTEyLCAweDE3RTIsIDB4N0UxNSwgMHgzQThDLCAweDdFMUIsIDB4MEQzMSwKLSAgICAweDdFMUUsIDB4MDhGNiwgMHg3RTFGLCAweDE3RTQsIDB4N0UyMCwgMHgzQThELCAweDdFMjEsIDB4MTdFMSwKLSAgICAweDdFMjIsIDB4MTdFNywgMHg3RTIzLCAweDE3RTAsIDB4N0UyNiwgMHgwOTRFLCAweDdFMkIsIDB4MEU1MywKLSAgICAweDdFMkUsIDB4MDk1NiwgMHg3RTMxLCAweDE3RTMsIDB4N0UzMiwgMHgxN0VGLCAweDdFMzUsIDB4MTdFQiwKLSAgICAweDdFMzcsIDB4MTdFRSwgMHg3RTM5LCAweDE3RUMsIDB4N0UzQSwgMHgxN0YwLCAweDdFM0IsIDB4MTdFQSwKLSAgICAweDdFM0QsIDB4MTdEMCwgMHg3RTNFLCAweDBBNzcsIDB4N0U0MSwgMHgwRDVGLCAweDdFNDMsIDB4MTdFRCwKLSAgICAweDdFNDYsIDB4MTdFOCwgMHg3RTQ3LCAweDNBOEUsIDB4N0U0OCwgMHgzNzY3LCAweDdFNEEsIDB4MEFBMywKLSAgICAweDdFNEIsIDB4MDcyOCwgMHg3RTRELCAweDA5MzUsIDB4N0U1MiwgMHgyMTk0LCAweDdFNTQsIDB4MDlFQiwKLSAgICAweDdFNTUsIDB4MEFCOCwgMHg3RTU2LCAweDE3RjMsIDB4N0U1OSwgMHgxN0Y1LCAweDdFNUEsIDB4MTdGNiwKLSAgICAweDdFNUQsIDB4MTdGMiwgMHg3RTVFLCAweDE3RjQsIDB4N0U2MSwgMHgxRTExLCAweDdFNjIsIDB4M0E4RiwKLSAgICAweDdFNjYsIDB4MTdFOSwgMHg3RTY3LCAweDE3RjEsIDB4N0U2OSwgMHgxN0Y5LCAweDdFNkEsIDB4MTdGOCwKLSAgICAweDdFNkIsIDB4MURGNywgMHg3RTZELCAweDBFQTgsIDB4N0U2RSwgMHgzQTkwLCAweDdFNzAsIDB4MDcwMSwKLSAgICAweDdFNzMsIDB4M0E5MSwgMHg3RTc5LCAweDE3RjcsIDB4N0U3QiwgMHgxN0ZCLCAweDdFN0MsIDB4MTdGQSwKLSAgICAweDdFN0QsIDB4MTdGRSwgMHg3RTdGLCAweDE4MDAsIDB4N0U4MiwgMHgwODhBLCAweDdFODMsIDB4MTdGQywKLSAgICAweDdFODgsIDB4MTgwMSwgMHg3RTg5LCAweDE4MDIsIDB4N0U4QSwgMHgyMEE3LCAweDdFOEMsIDB4MTgwMywKLSAgICAweDdFOEQsIDB4M0E5MiwgMHg3RThFLCAweDE4MDksIDB4N0U4RiwgMHgwQzM1LCAweDdFOTAsIDB4MTgwNSwKLSAgICAweDdFOTEsIDB4M0E5MywgMHg3RTkyLCAweDE4MDQsIDB4N0U5MywgMHgxODA2LCAweDdFOTQsIDB4MTgwNywKLSAgICAweDdFOTYsIDB4MTgwOCwgMHg3RTk4LCAweDNBOTQsIDB4N0U5QiwgMHgxODBBLCAweDdFOUMsIDB4MTgwQiwKLSAgICAweDdGMzYsIDB4MDYwOCwgMHg3RjM4LCAweDE4MEMsIDB4N0YzQSwgMHgxODBELCAweDdGNDQsIDB4M0E5NSwKLSAgICAweDdGNDUsIDB4MTgwRSwgMHg3RjQ3LCAweDIxOTUsIDB4N0Y0QywgMHgxODBGLCAweDdGNEQsIDB4MTgxMCwKLSAgICAweDdGNEUsIDB4MTgxMSwgMHg3RjRGLCAweDNBOTYsIDB4N0Y1MCwgMHgxODEyLCAweDdGNTEsIDB4MTgxMywKLSAgICAweDdGNTIsIDB4M0E5NywgMHg3RjUzLCAweDNBOTgsIDB4N0Y1NCwgMHgxODE1LCAweDdGNTUsIDB4MTgxNCwKLSAgICAweDdGNTgsIDB4MTgxNiwgMHg3RjVGLCAweDE4MTcsIDB4N0Y2MCwgMHgxODE4LCAweDdGNjEsIDB4M0E5OSwKLSAgICAweDdGNjcsIDB4MTgxQiwgMHg3RjY4LCAweDE4MTksIDB4N0Y2OSwgMHgxODFBLCAweDdGNkEsIDB4MDg1MSwKLSAgICAweDdGNkIsIDB4MDcyOSwgMHg3RjZFLCAweDBCOTQsIDB4N0Y3MCwgMHgwRDQ3LCAweDdGNzIsIDB4MDk3QSwKLSAgICAweDdGNzUsIDB4MEQwMywgMHg3Rjc3LCAweDBEODEsIDB4N0Y3OCwgMHgxODFDLCAweDdGNzksIDB4MTMzNiwKLSAgICAweDdGODIsIDB4MTgxRCwgMHg3RjgzLCAweDE4MUYsIDB4N0Y4NSwgMHgwRjRGLCAweDdGODYsIDB4MTgxRSwKLSAgICAweDdGODcsIDB4MTgyMSwgMHg3Rjg4LCAweDE4MjAsIDB4N0Y4QSwgMHgwRjNELCAweDdGOEMsIDB4MTgyMiwKLSAgICAweDdGOEUsIDB4MEQ5MiwgMHg3RjkxLCAweDNBOUEsIDB4N0Y5NCwgMHgxODIzLCAweDdGOUEsIDB4MTgyNiwKLSAgICAweDdGOUQsIDB4MTgyNSwgMHg3RjlFLCAweDE4MjQsIDB4N0ZBMSwgMHgyMTk2LCAweDdGQTMsIDB4MTgyNywKLSAgICAweDdGQTQsIDB4MDcwOCwgMHg3RkE4LCAweDBBQTQsIDB4N0ZBOSwgMHgwNjVCLCAweDdGQUUsIDB4MTgyQiwKLSAgICAweDdGQUYsIDB4MTgyOCwgMHg3RkIyLCAweDE4MjksIDB4N0ZCNiwgMHgxODJDLCAweDdGQjgsIDB4MTgyRCwKLSAgICAweDdGQjksIDB4MTgyQSwgMHg3RkJELCAweDA0Q0IsIDB4N0ZCRiwgMHgzQTlCLCAweDdGQzEsIDB4MDUyNywKLSAgICAweDdGQzUsIDB4MTgyRiwgMHg3RkM2LCAweDE4MzAsIDB4N0ZDQSwgMHgxODMxLCAweDdGQ0MsIDB4MEY0QywKLSAgICAweDdGQ0UsIDB4M0E5QywgMHg3RkQyLCAweDA5MzYsIDB4N0ZENCwgMHgxODMzLCAweDdGRDUsIDB4MTgzMiwKLSAgICAweDdGREYsIDB4M0E5RCwgMHg3RkUwLCAweDBBMkYsIDB4N0ZFMSwgMHgxODM0LCAweDdGRTUsIDB4M0E5RSwKLSAgICAweDdGRTYsIDB4MTgzNSwgMHg3RkU5LCAweDE4MzYsIDB4N0ZFQiwgMHgwNjIxLCAweDdGRUMsIDB4M0E5RiwKLSAgICAweDdGRUUsIDB4M0FBMCwgMHg3RkVGLCAweDNBQTEsIDB4N0ZGMCwgMHgwNjA5LCAweDdGRjMsIDB4MTgzNywKLSAgICAweDdGRjksIDB4MTgzOCwgMHg3RkZBLCAweDNBQTIsIDB4N0ZGQiwgMHgwRThCLCAweDdGRkMsIDB4MEY0RCwKLSAgICAweDgwMDAsIDB4MEYzRSwgMHg4MDAxLCAweDBGREQsIDB4ODAwMiwgMHgzNzEzLCAweDgwMDMsIDB4MDdERiwKLSAgICAweDgwMDQsIDB4MTgzQiwgMHg4MDA1LCAweDA5MDAsIDB4ODAwNiwgMHgxODNBLCAweDgwMEIsIDB4MTgzQywKLSAgICAweDgwMEMsIDB4MDhENSwgMHg4MDBFLCAweDNBQTMsIDB4ODAxMCwgMHgwQjMxLCAweDgwMTEsIDB4M0FBNCwKLSAgICAweDgwMTIsIDB4MTgzRCwgMHg4MDE0LCAweDNBQTUsIDB4ODAxNSwgMHgwN0RFLCAweDgwMTcsIDB4MEVFMywKLSAgICAweDgwMTgsIDB4MTgzRSwgMHg4MDE5LCAweDE4M0YsIDB4ODAxQywgMHgxODQwLCAweDgwMjEsIDB4MTg0MSwKLSAgICAweDgwMjQsIDB4M0FBNiwgMHg4MDI2LCAweDNBQTcsIDB4ODAyOCwgMHgxODQyLCAweDgwMzMsIDB4MDhENiwKLSAgICAweDgwMzYsIDB4MEVGOSwgMHg4MDNBLCAweDNBQTgsIDB4ODAzQiwgMHgxODQ0LCAweDgwM0MsIDB4M0FBOSwKLSAgICAweDgwM0QsIDB4MEI3RCwgMHg4MDNGLCAweDE4NDMsIDB4ODA0NiwgMHgxODQ2LCAweDgwNEEsIDB4MTg0NSwKLSAgICAweDgwNTIsIDB4MTg0NywgMHg4MDU2LCAweDBBNUYsIDB4ODA1OCwgMHgxODQ4LCAweDgwNUEsIDB4MTg0OSwKLSAgICAweDgwNUUsIDB4MEUwOSwgMHg4MDVGLCAweDE4NEEsIDB4ODA2MCwgMHgzQUFBLCAweDgwNjEsIDB4MEFGMSwKLSAgICAweDgwNjIsIDB4MTg0QiwgMHg4MDY4LCAweDE4NEMsIDB4ODA2RiwgMHgwRkM2LCAweDgwNzAsIDB4MTg0RiwKLSAgICAweDgwNzEsIDB4M0FBQiwgMHg4MDcyLCAweDE4NEUsIDB4ODA3MywgMHgxODRELCAweDgwNzQsIDB4MEJDQywKLSAgICAweDgwNzUsIDB4M0FBQywgMHg4MDc2LCAweDE4NTAsIDB4ODA3NywgMHgwOUVDLCAweDgwNzksIDB4MTg1MSwKLSAgICAweDgwN0QsIDB4MTg1MiwgMHg4MDdFLCAweDBGREUsIDB4ODA3RiwgMHgxODUzLCAweDgwODQsIDB4MTg1NCwKLSAgICAweDgwODUsIDB4MTg1NiwgMHg4MDg2LCAweDE4NTUsIDB4ODA4NywgMHgwRDM5LCAweDgwODksIDB4MENEMSwKLSAgICAweDgwOEIsIDB4MEZFNCwgMHg4MDhDLCAweDBEM0QsIDB4ODA5MywgMHgxODU4LCAweDgwOTYsIDB4MDlCQiwKLSAgICAweDgwOTgsIDB4MEQ5QywgMHg4MDlBLCAweDE4NTksIDB4ODA5QiwgMHgxODU3LCAweDgwOUQsIDB4MDYwQSwKLSAgICAweDgwOUUsIDB4M0FBRCwgMHg4MEExLCAweDA3ODgsIDB4ODBBMiwgMHgwOEI2LCAweDgwQTUsIDB4MEQ4MiwKLSAgICAweDgwQTYsIDB4M0FBRSwgMHg4MEE5LCAweDA3NUUsIDB4ODBBQSwgMHgwRTcxLCAweDgwQUIsIDB4M0FBRiwKLSAgICAweDgwQUMsIDB4MTg1QywgMHg4MEFELCAweDE4NUEsIDB4ODBBRiwgMHgwN0UwLCAweDgwQjEsIDB4MDdFMSwKLSAgICAweDgwQjIsIDB4MDRBRCwgMHg4MEI0LCAweDA4NTgsIDB4ODBCQSwgMHgwRDBGLCAweDgwQzMsIDB4MDRBMywKLSAgICAweDgwQzQsIDB4MTg2MSwgMHg4MEM2LCAweDBCN0UsIDB4ODBDQywgMHgwRDBFLCAweDgwQ0UsIDB4MEIzQiwKLSAgICAweDgwRDYsIDB4MTg2MywgMHg4MEQ3LCAweDNBQjAsIDB4ODBEOCwgMHgzQUIxLCAweDgwRDksIDB4MTg1RiwKLSAgICAweDgwREEsIDB4MTg2MiwgMHg4MERCLCAweDE4NUQsIDB4ODBERCwgMHgxODYwLCAweDgwREUsIDB4MEU1NCwKLSAgICAweDgwRTEsIDB4MDc4OSwgMHg4MEU0LCAweDA0QzEsIDB4ODBFNSwgMHgxODVFLCAweDgwRUYsIDB4MTg2NSwKLSAgICAweDgwRjEsIDB4MTg2NiwgMHg4MEY0LCAweDBDOTEsIDB4ODBGOCwgMHgwNkIzLCAweDgwRkMsIDB4MTg3MSwKLSAgICAweDgwRkQsIDB4MENGMywgMHg4MTAyLCAweDA4QjcsIDB4ODEwNSwgMHgwNkI0LCAweDgxMDYsIDB4MEE2QywKLSAgICAweDgxMDcsIDB4MEZFQywgMHg4MTA4LCAweDBFQkEsIDB4ODEwOSwgMHgxODY0LCAweDgxMEEsIDB4MEE3OCwKLSAgICAweDgxMTYsIDB4M0FCMiwgMHg4MTE4LCAweDNBQjMsIDB4ODExQSwgMHgwNjZELCAweDgxMUIsIDB4MTg2NywKLSAgICAweDgxMjMsIDB4MTg2OSwgMHg4MTI5LCAweDE4NjgsIDB4ODEyQiwgMHgzNjU5LCAweDgxMkYsIDB4MTg2QSwKLSAgICAweDgxMzEsIDB4MEI2NCwgMHg4MTMzLCAweDBDRjQsIDB4ODEzOSwgMHgwQkNELCAweDgxM0EsIDB4M0FCNCwKLSAgICAweDgxM0UsIDB4MTg2RSwgMHg4MTQxLCAweDM3NzIsIDB4ODE0NiwgMHgxODZELCAweDgxNEEsIDB4M0FCNSwKLSAgICAweDgxNEIsIDB4MTg2QiwgMHg4MTRDLCAweDNBQjYsIDB4ODE0RSwgMHgwQTFCLCAweDgxNTAsIDB4MERENywKLSAgICAweDgxNTEsIDB4MTg3MCwgMHg4MTUzLCAweDE4NkYsIDB4ODE1NCwgMHgwN0UyLCAweDgxNTUsIDB4MEZGOSwKLSAgICAweDgxNUYsIDB4MTg4MCwgMHg4MTY1LCAweDE4NzQsIDB4ODE2NiwgMHgxODc1LCAweDgxNkIsIDB4MDkxQywKLSAgICAweDgxNkUsIDB4MTg3MywgMHg4MTcwLCAweDA4MEEsIDB4ODE3MSwgMHgxODcyLCAweDgxNzQsIDB4MTg3NiwKLSAgICAweDgxNzgsIDB4MEJDRSwgMHg4MTc5LCAweDBERjIsIDB4ODE3QSwgMHgwQUE1LCAweDgxN0YsIDB4MEIzQywKLSAgICAweDgxODAsIDB4MTg3QSwgMHg4MTgxLCAweDNBQjcsIDB4ODE4MiwgMHgxODdCLCAweDgxODMsIDB4MTg3NywKLSAgICAweDgxODQsIDB4M0FCOCwgMHg4MTg4LCAweDE4NzgsIDB4ODE4QSwgMHgxODc5LCAweDgxOEYsIDB4MDdFMywKLSAgICAweDgxOTMsIDB4MTg4MSwgMHg4MTk1LCAweDE4N0QsIDB4ODE5QSwgMHgwREQ4LCAweDgxOUMsIDB4MEU5QSwKLSAgICAweDgxOUQsIDB4MEQ5QSwgMHg4MUEwLCAweDE4N0MsIDB4ODFBMywgMHgxODdGLCAweDgxQTQsIDB4MTg3RSwKLSAgICAweDgxQTgsIDB4MEU3MiwgMHg4MUE5LCAweDE4ODIsIDB4ODFCMCwgMHgxODgzLCAweDgxQjMsIDB4MEFCOSwKLSAgICAweDgxQjQsIDB4M0FCOSwgMHg4MUI1LCAweDE4ODQsIDB4ODFCOCwgMHgxODg2LCAweDgxQkEsIDB4MTg4QSwKLSAgICAweDgxQkQsIDB4MTg4NywgMHg4MUJFLCAweDE4ODUsIDB4ODFCRiwgMHgwQ0Y1LCAweDgxQzAsIDB4MTg4OCwKLSAgICAweDgxQzIsIDB4MTg4OSwgMHg4MUM2LCAweDA1MzIsIDB4ODFDOCwgMHgxODkwLCAweDgxQzksIDB4MTg4QiwKLSAgICAweDgxQ0QsIDB4MTg4QywgMHg4MUNGLCAweDNBQkEsIDB4ODFEMSwgMHgxODhELCAweDgxRDMsIDB4MEIwMSwKLSAgICAweDgxRDgsIDB4MTg4RiwgMHg4MUQ5LCAweDE4OEUsIDB4ODFEQSwgMHgxODkxLCAweDgxREYsIDB4MTg5MiwKLSAgICAweDgxRTAsIDB4MTg5MywgMHg4MUUzLCAweDBBMDksIDB4ODFFNSwgMHgwNTY5LCAweDgxRTcsIDB4MTg5NCwKLSAgICAweDgxRTgsIDB4MEY5RiwgMHg4MUVBLCAweDA4RDcsIDB4ODFFRCwgMHgwOTM3LCAweDgxRjMsIDB4MDhCOCwKLSAgICAweDgxRjQsIDB4MEI5NSwgMHg4MUY5LCAweDNBQkIsIDB4ODFGQSwgMHgxODk1LCAweDgxRkIsIDB4MTg5NiwKLSAgICAweDgxRkMsIDB4MDREMywgMHg4MUZFLCAweDE4OTcsIDB4ODIwMSwgMHgxODk4LCAweDgyMDIsIDB4MTg5OSwKLSAgICAweDgyMDMsIDB4M0FCQywgMHg4MjA1LCAweDE4OUEsIDB4ODIwNywgMHgxODlCLCAweDgyMDgsIDB4MDZCNSwKLSAgICAweDgyMDksIDB4MTNBRiwgMHg4MjBBLCAweDE4OUMsIDB4ODIwQywgMHgwQTg5LCAweDgyMEQsIDB4MTg5RCwKLSAgICAweDgyMEUsIDB4MDhGNywgMHg4MjEwLCAweDE4OUUsIDB4ODIxMiwgMHgxMDA5LCAweDgyMTYsIDB4MTg5RiwKLSAgICAweDgyMTcsIDB4MEUyRSwgMHg4MjE4LCAweDA2MTgsIDB4ODIxQiwgMHgwQUE2LCAweDgyMUMsIDB4MDk2MiwKLSAgICAweDgyMUUsIDB4MERFMywgMHg4MjFGLCAweDA5MzgsIDB4ODIyMSwgMHgzQUJELCAweDgyMjksIDB4MThBMCwKLSAgICAweDgyMkEsIDB4MDdFNCwgMHg4MjJCLCAweDE4QTEsIDB4ODIyQywgMHgwRDYwLCAweDgyMkUsIDB4MThBRiwKLSAgICAweDgyMzIsIDB4M0FCRSwgMHg4MjMzLCAweDE4QTMsIDB4ODIzNCwgMHgzQUJGLCAweDgyMzUsIDB4MEIyOSwKLSAgICAweDgyMzYsIDB4MEQyQiwgMHg4MjM3LCAweDA3NzMsIDB4ODIzOCwgMHgxOEEyLCAweDgyMzksIDB4MEFBNywKLSAgICAweDgyNDAsIDB4MThBNCwgMHg4MjQ2LCAweDNBQzAsIDB4ODI0NywgMHgwQzE2LCAweDgyNEIsIDB4M0FDMSwKLSAgICAweDgyNEYsIDB4M0FDMiwgMHg4MjU4LCAweDE4QTYsIDB4ODI1OSwgMHgxOEE1LCAweDgyNUEsIDB4MThBOCwKLSAgICAweDgyNUQsIDB4MThBNywgMHg4MjVGLCAweDE4QTksIDB4ODI2MiwgMHgxOEFCLCAweDgyNjQsIDB4MThBQSwKLSAgICAweDgyNjYsIDB4MDYwQiwgMHg4MjY4LCAweDE4QUMsIDB4ODI2QSwgMHgxOEFELCAweDgyNkIsIDB4MThBRSwKLSAgICAweDgyNkUsIDB4MDgyMSwgMHg4MjZGLCAweDBGOTEsIDB4ODI3MSwgMHgxOEIwLCAweDgyNzIsIDB4MDlFRCwKLSAgICAweDgyNzYsIDB4MDUxMiwgMHg4Mjc3LCAweDE4QjEsIDB4ODI3OCwgMHgxOEIyLCAweDgyNzksIDB4Mzc3NSwKLSAgICAweDgyN0UsIDB4MThCMywgMHg4MjhCLCAweDA0QjYsIDB4ODI4RCwgMHgxOEI0LCAweDgyOEUsIDB4M0FDMywKLSAgICAweDgyOTIsIDB4MThCNSwgMHg4Mjk5LCAweDBERDksIDB4ODI5RCwgMHgwOEYzLCAweDgyOUYsIDB4MThCNywKLSAgICAweDgyQTUsIDB4MDU4NywgMHg4MkE2LCAweDA0NzYsIDB4ODJBQiwgMHgxOEI2LCAweDgyQUMsIDB4MThCOSwKLSAgICAweDgyQUQsIDB4MEQwNCwgMHg4MkFFLCAweDNBQzQsIDB4ODJBRiwgMHgwQTBBLCAweDgyQjEsIDB4MDU1NiwKLSAgICAweDgyQjMsIDB4MEU1NSwgMHg4MkI3LCAweDNBQzUsIDB4ODJCOCwgMHgwNzMzLCAweDgyQjksIDB4MDZENCwKLSAgICAweDgyQkIsIDB4MThCOCwgMHg4MkJELCAweDA1NkEsIDB4ODJCRSwgMHgzQUM2LCAweDgyQzUsIDB4MDVERiwKLSAgICAweDgyQzYsIDB4M0FDNywgMHg4MkQxLCAweDA1MTMsIDB4ODJEMiwgMHgxOEJELCAweDgyRDMsIDB4MEZCMiwKLSAgICAweDgyRDQsIDB4MEIzRCwgMHg4MkQ3LCAweDBEQjYsIDB4ODJEOSwgMHgxOEM5LCAweDgyREIsIDB4MDU1NywKLSAgICAweDgyREMsIDB4MThDNywgMHg4MkRFLCAweDE4QzUsIDB4ODJERiwgMHgxOEJDLCAweDgyRTEsIDB4MThCQSwKLSAgICAweDgyRTMsIDB4MThCQiwgMHg4MkU1LCAweDA5MEYsIDB4ODJFNiwgMHgwNkU0LCAweDgyRTcsIDB4MEJCNSwKLSAgICAweDgyRUIsIDB4MENBOSwgMHg4MkYxLCAweDA0RjMsIDB4ODJGMywgMHgxOEJGLCAweDgyRjQsIDB4MThCRSwKLSAgICAweDgyRjksIDB4MThDNCwgMHg4MkZBLCAweDE4QzAsIDB4ODJGQiwgMHgxOEMzLCAweDgyRkUsIDB4M0FDOCwKLSAgICAweDgzMDEsIDB4MjE5OCwgMHg4MzAyLCAweDBFREMsIDB4ODMwMywgMHgxOEMyLCAweDgzMDQsIDB4MDU1OCwKLSAgICAweDgzMDUsIDB4MDVEQiwgMHg4MzA2LCAweDE4QzYsIDB4ODMwOSwgMHgxOEM4LCAweDgzMEUsIDB4MDcyQSwKLSAgICAweDgzMTYsIDB4MThDQywgMHg4MzE3LCAweDE4RDUsIDB4ODMxOCwgMHgxOEQ2LCAweDgzMUMsIDB4MDQ2RiwKLSAgICAweDgzMjMsIDB4MThERCwgMHg4MzI4LCAweDA0QjUsIDB4ODMyQiwgMHgxOEQ0LCAweDgzMkYsIDB4MThEMywKLSAgICAweDgzMzEsIDB4MThDRSwgMHg4MzMyLCAweDE4Q0QsIDB4ODMzNCwgMHgxOENCLCAweDgzMzUsIDB4MThDQSwKLSAgICAweDgzMzYsIDB4MEJBMSwgMHg4MzM4LCAweDBCNUIsIDB4ODMzOSwgMHgxOEQwLCAweDgzNDAsIDB4MThDRiwKLSAgICAweDgzNDMsIDB4M0FDOSwgMHg4MzQ1LCAweDE4RDIsIDB4ODM0OSwgMHgwQUYyLCAweDgzNEEsIDB4MDcyQiwKLSAgICAweDgzNEYsIDB4MDRFMywgMHg4MzUwLCAweDE4RDEsIDB4ODM1MSwgMHgzQUNBLCAweDgzNTIsIDB4MDdFNSwKLSAgICAweDgzNTUsIDB4M0FDQiwgMHg4MzU4LCAweDBBRjMsIDB4ODM2MiwgMHgyMTk5LCAweDgzNzMsIDB4MThFMywKLSAgICAweDgzNzUsIDB4MThFNCwgMHg4Mzc3LCAweDA1NTksIDB4ODM3QiwgMHgwNTJFLCAweDgzN0MsIDB4MThFMSwKLSAgICAweDgzN0YsIDB4MjE5QSwgMHg4Mzg1LCAweDE4RDcsIDB4ODM4NiwgMHgzQUNDLCAweDgzODcsIDB4MThERiwKLSAgICAweDgzODksIDB4MThFNiwgMHg4MzhBLCAweDE4RTAsIDB4ODM4RCwgMHgzQUNELCAweDgzOEUsIDB4MThERSwKLSAgICAweDgzOTIsIDB4M0FDRSwgMHg4MzkzLCAweDE4QzEsIDB4ODM5NiwgMHgxOERDLCAweDgzOTgsIDB4M0FDRiwKLSAgICAweDgzOUEsIDB4MThEOCwgMHg4MzlFLCAweDA2MEMsIDB4ODM5RiwgMHgxOERBLCAweDgzQTAsIDB4MThFNSwKLSAgICAweDgzQTIsIDB4MThEQiwgMHg4M0E4LCAweDE4RTcsIDB4ODNBOSwgMHgzQUQwLCAweDgzQUEsIDB4MThEOSwKLSAgICAweDgzQUIsIDB4MEQzMiwgMHg4M0IxLCAweDBGNTMsIDB4ODNCNSwgMHgxOEUyLCAweDgzQkQsIDB4MThGOCwKLSAgICAweDgzQkYsIDB4M0FEMSwgMHg4M0MwLCAweDNBRDIsIDB4ODNDMSwgMHgxOEYwLCAweDgzQzUsIDB4MEE0MSwKLSAgICAweDgzQzcsIDB4MjE5QiwgMHg4M0NBLCAweDA2NjAsIDB4ODNDQywgMHgwNkQ1LCAweDgzQ0UsIDB4MThFQiwKLSAgICAweDgzRDMsIDB4MDU1QiwgMHg4M0Q2LCAweDA5QkMsIDB4ODNEOCwgMHgxOEVFLCAweDgzREMsIDB4MDg0QSwKLSAgICAweDgzREYsIDB4MEM0QiwgMHg4M0UwLCAweDE4RjMsIDB4ODNFOSwgMHgwRTNFLCAweDgzRUEsIDB4M0FEMywKLSAgICAweDgzRUIsIDB4MThFQSwgMHg4M0VGLCAweDA1NUEsIDB4ODNGMCwgMHgwNzhBLCAweDgzRjEsIDB4MEQ5QiwKLSAgICAweDgzRjIsIDB4MThGNCwgMHg4M0Y0LCAweDE4RTgsIDB4ODNGNiwgMHgyMTlDLCAweDgzRjcsIDB4MThGMSwKLSAgICAweDgzRkIsIDB4MThGQiwgMHg4M0ZELCAweDE4RUMsIDB4ODQwMywgMHgxOEVELCAweDg0MDQsIDB4MEM5MiwKLSAgICAweDg0MDcsIDB4MThGMiwgMHg4NDBBLCAweDFFN0YsIDB4ODQwQiwgMHgxOEVGLCAweDg0MEMsIDB4MEU1NiwKLSAgICAweDg0MEQsIDB4MThGNSwgMHg4NDBFLCAweDA0QTQsIDB4ODQwRiwgMHgzQUQ0LCAweDg0MTEsIDB4M0FENSwKLSAgICAweDg0MTMsIDB4MThFOSwgMHg4NDIwLCAweDE4RjcsIDB4ODQyMiwgMHgxOEY2LCAweDg0MjksIDB4MEQyMSwKLSAgICAweDg0MkEsIDB4MThGRCwgMHg4NDJDLCAweDE5MDgsIDB4ODQzMSwgMHgwNURDLCAweDg0MzUsIDB4MTkwQiwKLSAgICAweDg0MzgsIDB4MThGOSwgMHg4NDNDLCAweDE4RkUsIDB4ODQzRCwgMHgwRjU4LCAweDg0NDYsIDB4MTkwNywKLSAgICAweDg0NDgsIDB4MjE5RCwgMHg4NDQ5LCAweDBGM0YsIDB4ODQ0QSwgMHgzQUQ2LCAweDg0NEUsIDB4MEY3MiwKLSAgICAweDg0NTcsIDB4MEJCNiwgMHg4NDVCLCAweDA1QzksIDB4ODQ2MSwgMHgwREU0LCAweDg0NjIsIDB4MTkwRCwKLSAgICAweDg0NjMsIDB4MEM3OSwgMHg4NDY2LCAweDA0NzUsIDB4ODQ2OSwgMHgxOTA2LCAweDg0NkIsIDB4MTkwMiwKLSAgICAweDg0NkMsIDB4MEFGNCwgMHg4NDZELCAweDE4RkMsIDB4ODQ2RSwgMHgxOTA0LCAweDg0NkYsIDB4MTkwOSwKLSAgICAweDg0NzEsIDB4MENFMiwgMHg4NDc1LCAweDA0NkUsIDB4ODQ3NiwgMHgzQUQ3LCAweDg0NzcsIDB4MTkwMSwKLSAgICAweDg0NzksIDB4MTkwQSwgMHg4NDdBLCAweDBERUEsIDB4ODQ4MiwgMHgxOTA1LCAweDg0ODQsIDB4MTkwMCwKLSAgICAweDg0OEIsIDB4MDlCRCwgMHg4NDkwLCAweDA5MzksIDB4ODQ5NCwgMHgwOEQ4LCAweDg0OTksIDB4MEVFNCwKLSAgICAweDg0OUMsIDB4MERCOSwgMHg4NDlGLCAweDE5MTAsIDB4ODRBMSwgMHgxOTE5LCAweDg0QTgsIDB4M0FEOCwKLSAgICAweDg0QUQsIDB4MTkwMywgMHg4NEFGLCAweDNBRDksIDB4ODRCMiwgMHgwNUQ1LCAweDg0QjQsIDB4MjE5RSwKLSAgICAweDg0QjgsIDB4MDlFMCwgMHg4NEI5LCAweDE5MEUsIDB4ODRCQiwgMHgxOTEzLCAweDg0QkMsIDB4MEFGNSwKLSAgICAweDg0QkYsIDB4MTkwRiwgMHg4NEMwLCAweDNBREEsIDB4ODRDMSwgMHgxOTE2LCAweDg0QzIsIDB4M0FEQiwKLSAgICAweDg0QzQsIDB4MEI5RCwgMHg4NEM2LCAweDE5MTcsIDB4ODRDOSwgMHgwRjQwLCAweDg0Q0EsIDB4MTkwQywKLSAgICAweDg0Q0IsIDB4MDU5NiwgMHg4NENELCAweDE5MTIsIDB4ODREMCwgMHgxOTE1LCAweDg0RDEsIDB4MEVCOCwKLSAgICAweDg0RDYsIDB4MTkxOCwgMHg4NEQ5LCAweDE5MTEsIDB4ODREQSwgMHgxOTE0LCAweDg0REMsIDB4MjBBQiwKLSAgICAweDg0RUMsIDB4MEU1NywgMHg4NEVFLCAweDBGQzcsIDB4ODRGMCwgMHgzQURDLCAweDg0RjQsIDB4MTkxQywKLSAgICAweDg0RkMsIDB4MTkyMywgMHg4NEZELCAweDNBREQsIDB4ODRGRiwgMHgxOTFCLCAweDg1MDAsIDB4MDhFRiwKLSAgICAweDg1MDYsIDB4MThGQSwgMHg4NTBDLCAweDNBREUsIDB4ODUxMSwgMHgwRTFFLCAweDg1MTMsIDB4MEVBRSwKLSAgICAweDg1MTQsIDB4MTkyMiwgMHg4NTE1LCAweDE5MjEsIDB4ODUxNywgMHgxOTFELCAweDg1MTgsIDB4MTkxRSwKLSAgICAweDg1MUEsIDB4MDREOCwgMHg4NTFGLCAweDE5MjAsIDB4ODUyMSwgMHgxOTFBLCAweDg1MjMsIDB4MUUxQSwKLSAgICAweDg1MjYsIDB4MEJGMSwgMHg4NTJDLCAweDE5MUYsIDB4ODUyRCwgMHgwNEMyLCAweDg1MzQsIDB4M0FERiwKLSAgICAweDg1MzUsIDB4MEIwMiwgMHg4NTNELCAweDBFMTMsIDB4ODUzRSwgMHgxRUI1LCAweDg1NDAsIDB4MTkyNCwKLSAgICAweDg1NDEsIDB4MTkyOCwgMHg4NTQzLCAweDBENkQsIDB4ODU0OCwgMHgxOTI3LCAweDg1NDksIDB4MDlCRSwKLSAgICAweDg1NEEsIDB4MDhGNSwgMHg4NTRCLCAweDE5MkEsIDB4ODU0RSwgMHgwNkI2LCAweDg1NTMsIDB4MjE5RiwKLSAgICAweDg1NTUsIDB4MTkyQiwgMHg4NTU3LCAweDBERUIsIDB4ODU1OCwgMHgxOTI2LCAweDg1NTksIDB4MjFBMCwKLSAgICAweDg1NUEsIDB4MThGRiwgMHg4NTVFLCAweDNBRTAsIDB4ODU2MywgMHgxOTI1LCAweDg1NjgsIDB4MEZGNSwKLSAgICAweDg1NjksIDB4MEM3QSwgMHg4NTZBLCAweDBERTUsIDB4ODU2QiwgMHgyMUExLCAweDg1NkQsIDB4MTkzMiwKLSAgICAweDg1NzcsIDB4MTkzOCwgMHg4NTdFLCAweDE5MzksIDB4ODU4MCwgMHgxOTJDLCAweDg1ODQsIDB4MEQyQywKLSAgICAweDg1ODcsIDB4MTkzNiwgMHg4NTg4LCAweDE5MkUsIDB4ODU4QSwgMHgxOTMwLCAweDg1OEYsIDB4M0FFMSwKLSAgICAweDg1OTAsIDB4MTkzQSwgMHg4NTkxLCAweDE5MkYsIDB4ODU5NCwgMHgxOTMzLCAweDg1OTcsIDB4MDUxNCwKLSAgICAweDg1OTksIDB4MENCRCwgMHg4NTlCLCAweDE5MzQsIDB4ODU5QywgMHgxOTM3LCAweDg1QTQsIDB4MTkyRCwKLSAgICAweDg1QTYsIDB4MEFBOCwgMHg4NUE4LCAweDE5MzEsIDB4ODVBOSwgMHgwODc1LCAweDg1QUEsIDB4MEEwQiwKLSAgICAweDg1QUIsIDB4MDcwNiwgMHg4NUFDLCAweDBGMDAsIDB4ODVBRCwgMHgzQUU0LCAweDg1QUUsIDB4MEYwNSwKLSAgICAweDg1QUYsIDB4MDk3QywgMHg4NUIwLCAweDIxQTMsIDB4ODVCNywgMHgzQUUyLCAweDg1QjksIDB4MTkzRSwKLSAgICAweDg1QkEsIDB4MTkzQywgMHg4NUMxLCAweDBGRjQsIDB4ODVDOSwgMHgxOTNCLCAweDg1Q0QsIDB4MEY1RiwKLSAgICAweDg1Q0UsIDB4M0FFMywgMHg4NUNGLCAweDE5M0QsIDB4ODVEMCwgMHgxOTNGLCAweDg1RDUsIDB4MTk0MCwKLSAgICAweDg1REMsIDB4MTk0MywgMHg4NURELCAweDE5NDEsIDB4ODVFNCwgMHgwQzdCLCAweDg1RTUsIDB4MTk0MiwKLSAgICAweDg1RTksIDB4MEQ2MSwgMHg4NUVBLCAweDE5MzUsIDB4ODVGNCwgMHgzNzgwLCAweDg1RjcsIDB4MDk3RCwKLSAgICAweDg1RjksIDB4MTk0NCwgMHg4NUZBLCAweDE5NDksIDB4ODVGQiwgMHgwQUY2LCAweDg1RkUsIDB4MTk0OCwKLSAgICAweDg2MDIsIDB4MTkyOSwgMHg4NjA2LCAweDE5NEEsIDB4ODYwNywgMHgwQUNCLCAweDg2MEEsIDB4MTk0NSwKLSAgICAweDg2MEIsIDB4MTk0NywgMHg4NjEyLCAweDNBRTUsIDB4ODYxMywgMHgxOTQ2LCAweDg2MTYsIDB4MTREMCwKLSAgICAweDg2MTcsIDB4MTRDMSwgMHg4NjFBLCAweDE5NEMsIDB4ODYyMiwgMHgxOTRCLCAweDg2MjksIDB4M0FFNiwKLSAgICAweDg2MkQsIDB4MEY2MCwgMHg4NjJGLCAweDE2QjEsIDB4ODYzMCwgMHgxOTRELCAweDg2M0YsIDB4MTk0RSwKLSAgICAweDg2NEQsIDB4MTk0RiwgMHg4NjRFLCAweDA3OEIsIDB4ODY1MCwgMHgwNjZFLCAweDg2NTIsIDB4M0FFNywKLSAgICAweDg2NTQsIDB4MTk1MSwgMHg4NjU1LCAweDEwOTQsIDB4ODY1QSwgMHgwNjhGLCAweDg2NUIsIDB4MzQxOCwKLSAgICAweDg2NUMsIDB4MEY4MiwgMHg4NjVFLCAweDA2RUIsIDB4ODY1RiwgMHgxOTUyLCAweDg2NjMsIDB4M0FFOCwKLSAgICAweDg2NjcsIDB4MTk1MywgMHg4NjZCLCAweDBCQUMsIDB4ODY2QywgMHgzQUU5LCAweDg2NkYsIDB4M0FFQSwKLSAgICAweDg2NzEsIDB4MTk1NCwgMHg4Njc5LCAweDBDRDIsIDB4ODY3QSwgMHgzQUVCLCAweDg2N0IsIDB4MDQ3RSwKLSAgICAweDg2N0QsIDB4Mzc4NiwgMHg4NjhBLCAweDA1NjMsIDB4ODY4QiwgMHgxOTU5LCAweDg2OEMsIDB4MTk1QSwKLSAgICAweDg2OEQsIDB4M0FFQywgMHg4NjkxLCAweDNBRUQsIDB4ODY5MywgMHgxOTU1LCAweDg2OTUsIDB4MDg4QiwKLSAgICAweDg2OTgsIDB4M0FFRSwgMHg4NkEzLCAweDE5NTYsIDB4ODZBNCwgMHgwQ0Y4LCAweDg2QTcsIDB4M0FFRiwKLSAgICAweDg2QTgsIDB4M0FGMCwgMHg4NkE5LCAweDE5NTcsIDB4ODZBQSwgMHgxOTU4LCAweDg2QUIsIDB4MTk2MiwKLSAgICAweDg2QUYsIDB4MTk1QywgMHg4NkIwLCAweDE5NUYsIDB4ODZCNiwgMHgxOTVCLCAweDg2QzQsIDB4MTk1RCwKLSAgICAweDg2QzYsIDB4MTk1RSwgMHg4NkM3LCAweDA5MDQsIDB4ODZDOSwgMHgxOTYwLCAweDg2Q0IsIDB4MEI3RiwKLSAgICAweDg2Q0QsIDB4MDcyQywgMHg4NkNFLCAweDA1QTAsIDB4ODZENCwgMHgxOTYzLCAweDg2RDksIDB4MDU5RCwKLSAgICAweDg2REIsIDB4MTk2OCwgMHg4NkRFLCAweDE5NjQsIDB4ODZERiwgMHgxOTY3LCAweDg2RTQsIDB4MEQ0RSwKLSAgICAweDg2RTksIDB4MTk2NSwgMHg4NkVDLCAweDE5NjYsIDB4ODZFRCwgMHgwREJBLCAweDg2RUUsIDB4MEQ2RSwKLSAgICAweDg2RUYsIDB4MTk2OSwgMHg4NkY4LCAweDBCNUQsIDB4ODZGOSwgMHgxOTczLCAweDg2RkEsIDB4M0FGMSwKLSAgICAweDg2RkIsIDB4MTk2RiwgMHg4NkZELCAweDNBRjIsIDB4ODZGRSwgMHgwNTZCLCAweDg3MDAsIDB4MTk2RCwKLSAgICAweDg3MDIsIDB4MEU1OCwgMHg4NzAzLCAweDE5NkUsIDB4ODcwNiwgMHgxOTZCLCAweDg3MDgsIDB4MTk2QywKLSAgICAweDg3MDksIDB4MTk3MSwgMHg4NzBBLCAweDE5NzQsIDB4ODcwQiwgMHgzQUYzLCAweDg3MEQsIDB4MTk3MiwKLSAgICAweDg3MTEsIDB4MTk3MCwgMHg4NzEyLCAweDE5NkEsIDB4ODcxMywgMHgzQUY0LCAweDg3MTgsIDB4MEI5NiwKLSAgICAweDg3MTksIDB4M0FGNSwgMHg4NzFBLCAweDE5N0IsIDB4ODcxQywgMHgwRUI2LCAweDg3MUUsIDB4M0FGNiwKLSAgICAweDg3MjUsIDB4MTk3OSwgMHg4NzI4LCAweDNBRjcsIDB4ODcyOSwgMHgxOTdBLCAweDg3MzQsIDB4MTk3NSwKLSAgICAweDg3MzcsIDB4MTk3NywgMHg4NzNCLCAweDE5NzgsIDB4ODczRSwgMHgzQUY4LCAweDg3M0YsIDB4MTk3NiwKLSAgICAweDg3NDksIDB4MEE4QSwgMHg4NzRCLCAweDBGREYsIDB4ODc0QywgMHgxOTdGLCAweDg3NEUsIDB4MTk4MCwKLSAgICAweDg3NTMsIDB4MTk4NiwgMHg4NzU1LCAweDA5RjAsIDB4ODc1NywgMHgxOTgyLCAweDg3NTksIDB4MTk4NSwKLSAgICAweDg3NUYsIDB4MTk3RCwgMHg4NzYwLCAweDE5N0MsIDB4ODc2MywgMHgxOTg3LCAweDg3NjYsIDB4MDU1QywKLSAgICAweDg3NjgsIDB4MTk4MywgMHg4NzZBLCAweDE5ODgsIDB4ODc2RSwgMHgxOTg0LCAweDg3NzEsIDB4M0FGOSwKLSAgICAweDg3NzQsIDB4MTk4MSwgMHg4Nzc2LCAweDBCQ0YsIDB4ODc3OCwgMHgxOTdFLCAweDg3N0YsIDB4MEQxRSwKLSAgICAweDg3ODIsIDB4MTk4QywgMHg4Nzg4LCAweDNBRkEsIDB4ODc4RCwgMHgwRjI1LCAweDg3OTksIDB4M0FGQiwKLSAgICAweDg3OUYsIDB4MTk4QiwgMHg4N0EyLCAweDE5OEEsIDB4ODdBQiwgMHgxOTkzLCAweDg3QUMsIDB4M0FGQywKLSAgICAweDg3QUQsIDB4M0FGRCwgMHg4N0FGLCAweDE5OEQsIDB4ODdCMywgMHgxOTk1LCAweDg3QjUsIDB4M0FGRSwKLSAgICAweDg3QkEsIDB4MEY1MCwgMHg4N0JCLCAweDE5OTgsIDB4ODdCRCwgMHgxOThGLCAweDg3QzAsIDB4MTk5MCwKLSAgICAweDg3QzQsIDB4MTk5NCwgMHg4N0M2LCAweDE5OTcsIDB4ODdDNywgMHgxOTk2LCAweDg3Q0IsIDB4MTk4RSwKLSAgICAweDg3RDAsIDB4MTk5MSwgMHg4N0QyLCAweDE5QTIsIDB4ODdENiwgMHgzQUZGLCAweDg3RTAsIDB4MTk5QiwKLSAgICAweDg3RUIsIDB4M0IwMCwgMHg4N0VDLCAweDFFMjMsIDB4ODdFRCwgMHgzQjAxLCAweDg3RUYsIDB4MTk5OSwKLSAgICAweDg3RjIsIDB4MTk5QSwgMHg4N0Y1LCAweDNDM0QsIDB4ODdGNiwgMHgxOTlGLCAweDg3RjcsIDB4MTlBMCwKLSAgICAweDg3RjksIDB4MDU4OCwgMHg4N0ZCLCAweDA2NUMsIDB4ODdGRSwgMHgxOTlFLCAweDg4MDEsIDB4M0IwMiwKLSAgICAweDg4MDMsIDB4M0IwMywgMHg4ODA1LCAweDE5ODksIDB4ODgwNiwgMHgzQjA0LCAweDg4MDcsIDB4MjFBNiwKLSAgICAweDg4MEIsIDB4M0IwNSwgMHg4ODBELCAweDE5OUQsIDB4ODgwRSwgMHgxOUExLCAweDg4MEYsIDB4MTk5QywKLSAgICAweDg4MTEsIDB4MTlBMywgMHg4ODE0LCAweDNCMDYsIDB4ODgxNSwgMHgxOUE1LCAweDg4MTYsIDB4MTlBNCwKLSAgICAweDg4MUMsIDB4M0IwNywgMHg4ODFGLCAweDFFODUsIDB4ODgyMSwgMHgxOUE3LCAweDg4MjIsIDB4MTlBNiwKLSAgICAweDg4MjMsIDB4MTk2MSwgMHg4ODI3LCAweDE5QUIsIDB4ODgzMSwgMHgxOUE4LCAweDg4MzYsIDB4MTlBOSwKLSAgICAweDg4MzksIDB4MTlBQSwgMHg4ODNCLCAweDE5QUMsIDB4ODg0MCwgMHgwNzQyLCAweDg4NDIsIDB4MTlBRSwKLSAgICAweDg4NDQsIDB4MTlBRCwgMHg4ODQ2LCAweDA5M0EsIDB4ODg0QywgMHgwN0U2LCAweDg4NEQsIDB4MTUyNCwKLSAgICAweDg4NTIsIDB4MTlBRiwgMHg4ODUzLCAweDA5NUIsIDB4ODg1NiwgMHgzQjA4LCAweDg4NTcsIDB4MDU5NywKLSAgICAweDg4NTksIDB4MTlCMCwgMHg4ODVCLCAweDA0RjQsIDB4ODg1RCwgMHgwOUJGLCAweDg4NUUsIDB4MTlCMSwKLSAgICAweDg4NUYsIDB4M0IwOSwgMHg4ODYxLCAweDA3RTcsIDB4ODg2MiwgMHgxOUIyLCAweDg4NjMsIDB4MDRBNSwKLSAgICAweDg4NjQsIDB4M0IwQSwgMHg4ODY4LCAweDBEQUYsIDB4ODg2QiwgMHgxOUIzLCAweDg4NzAsIDB4MEEzMCwKLSAgICAweDg4NzIsIDB4MTlCQSwgMHg4ODc1LCAweDE5QjcsIDB4ODg3NywgMHgwQkFELCAweDg4N0QsIDB4MTlCOCwKLSAgICAweDg4N0UsIDB4MTlCNSwgMHg4ODdGLCAweDA2RDYsIDB4ODg4MSwgMHgxOUI0LCAweDg4ODIsIDB4MTlCQiwKLSAgICAweDg4ODgsIDB4MDcwQywgMHg4ODhCLCAweDBCM0UsIDB4ODg4RCwgMHgxOUMxLCAweDg4OTIsIDB4MTlCRCwKLSAgICAweDg4OTYsIDB4MEIxNSwgMHg4ODk3LCAweDE5QkMsIDB4ODg5OCwgMHgzQjBCLCAweDg4OTksIDB4MTlCRiwKLSAgICAweDg4OUUsIDB4MTlCNiwgMHg4OEEyLCAweDE5QzAsIDB4ODhBNCwgMHgxOUMyLCAweDg4QUEsIDB4M0IwQywKLSAgICAweDg4QUIsIDB4MEQ4MywgMHg4OEFFLCAweDE5QkUsIDB4ODhCMCwgMHgxOUMzLCAweDg4QjEsIDB4MTlDNSwKLSAgICAweDg4QjQsIDB4MDc4NywgMHg4OEI1LCAweDE5QjksIDB4ODhCNywgMHgwNDg1LCAweDg4QkQsIDB4M0IwRCwKLSAgICAweDg4QkUsIDB4M0IwRSwgMHg4OEJGLCAweDE5QzQsIDB4ODhDMSwgMHgwODRCLCAweDg4QzIsIDB4MEZCRSwKLSAgICAweDg4QzMsIDB4MTlDNiwgMHg4OEM0LCAweDE5QzcsIDB4ODhDNSwgMHgwQUY3LCAweDg4QzYsIDB4Mzc4OSwKLSAgICAweDg4Q0EsIDB4M0IwRiwgMHg4OENGLCAweDBGNkEsIDB4ODhEMiwgMHgzQjEwLCAweDg4RDQsIDB4MTlDOCwKLSAgICAweDg4RDUsIDB4MEYxRiwgMHg4OEQ4LCAweDE5QzksIDB4ODhEOSwgMHgxOUNBLCAweDg4REIsIDB4M0IxMSwKLSAgICAweDg4REMsIDB4MEUzNCwgMHg4OERELCAweDE5Q0IsIDB4ODhERiwgMHgwODMwLCAweDg4RTEsIDB4MEY2QiwKLSAgICAweDg4RTgsIDB4MTlEMCwgMHg4OEYwLCAweDNCMTIsIDB4ODhGMSwgMHgzQjEzLCAweDg4RjIsIDB4MTlEMSwKLSAgICAweDg4RjMsIDB4MDlDMCwgMHg4OEY0LCAweDE5Q0YsIDB4ODhGNSwgMHgyMUE3LCAweDg4RjgsIDB4MEY1MSwKLSAgICAweDg4RjksIDB4MTlDQywgMHg4OEZDLCAweDE5Q0UsIDB4ODhGRCwgMHgwQTYxLCAweDg4RkUsIDB4MEE0NCwKLSAgICAweDg5MDIsIDB4MTlDRCwgMHg4OTA0LCAweDE5RDIsIDB4ODkwNiwgMHgzQjE0LCAweDg5MDcsIDB4MERGMywKLSAgICAweDg5MEEsIDB4MTlENCwgMHg4OTBDLCAweDE5RDMsIDB4ODkxMCwgMHgwNUNBLCAweDg5MTIsIDB4MEU1OSwKLSAgICAweDg5MTMsIDB4MTlENSwgMHg4OTE4LCAweDNCMTUsIDB4ODkxOSwgMHgzQjE2LCAweDg5MUEsIDB4M0IxNywKLSAgICAweDg5MUMsIDB4MjBBOCwgMHg4OTFELCAweDE5RTEsIDB4ODkxRSwgMHgxOUQ3LCAweDg5MjUsIDB4MTlEOCwKLSAgICAweDg5MjcsIDB4M0IxOCwgMHg4OTJBLCAweDE5RDksIDB4ODkyQiwgMHgxOURBLCAweDg5MzAsIDB4M0IxOSwKLSAgICAweDg5MzYsIDB4MTlERSwgMHg4OTM4LCAweDE5REYsIDB4ODkzQiwgMHgxOURELCAweDg5M0UsIDB4M0IxQSwKLSAgICAweDg5NDEsIDB4MTlEQiwgMHg4OTQzLCAweDE5RDYsIDB4ODk0NCwgMHgxOURDLCAweDg5NEMsIDB4MTlFMCwKLSAgICAweDg5NEQsIDB4MUJEMCwgMHg4OTU2LCAweDA1MjgsIDB4ODk1RSwgMHgxOUUzLCAweDg5NUYsIDB4MDZENywKLSAgICAweDg5NjAsIDB4MTlFMiwgMHg4OTY0LCAweDE5RTUsIDB4ODk2NiwgMHgxOUU0LCAweDg5NkEsIDB4MTlFNywKLSAgICAweDg5NkQsIDB4MTlFNiwgMHg4OTZGLCAweDE5RTgsIDB4ODk3MiwgMHgwOTNCLCAweDg5NzQsIDB4MTlFOSwKLSAgICAweDg5NzcsIDB4MTlFQSwgMHg4OTdCLCAweDNCMUIsIDB4ODk3RSwgMHgxOUVCLCAweDg5N0YsIDB4MEE2MiwKLSAgICAweDg5ODAsIDB4MzYyRSwgMHg4OTgxLCAweDBGNDEsIDB4ODk4MywgMHgxOUVDLCAweDg5ODYsIDB4MERGNCwKLSAgICAweDg5ODcsIDB4MENGQywgMHg4OTg4LCAweDE5RUQsIDB4ODk4QSwgMHgxOUVFLCAweDg5OEIsIDB4MDc1RiwKLSAgICAweDg5OEYsIDB4MDY0NiwgMHg4OTkzLCAweDE5RUYsIDB4ODk5NiwgMHgwOEI5LCAweDg5OTcsIDB4MENGNywKLSAgICAweDg5OTgsIDB4MTlGMCwgMHg4OTlBLCAweDA1QUUsIDB4ODlBMSwgMHgxOUYxLCAweDg5QTYsIDB4MTlGMywKLSAgICAweDg5QTcsIDB4MEY2MSwgMHg4OUE5LCAweDE5RjIsIDB4ODlBQSwgMHgwQTBDLCAweDg5QUMsIDB4MTlGNCwKLSAgICAweDg5QUYsIDB4MTlGNSwgMHg4OUIyLCAweDE5RjYsIDB4ODlCMywgMHgwNjBELCAweDg5QkEsIDB4MTlGNywKLSAgICAweDg5QkQsIDB4MTlGOCwgMHg4OUJGLCAweDE5RjksIDB4ODlDMCwgMHgxOUZBLCAweDg5RDIsIDB4MDVBRiwKLSAgICAweDg5RDQsIDB4M0IxQywgMHg4OUQ2LCAweDNCMUQsIDB4ODlEQSwgMHgxOUZCLCAweDg5REMsIDB4MTlGQywKLSAgICAweDg5REQsIDB4MTlGRCwgMHg4OUUzLCAweDA1NzIsIDB4ODlFNSwgMHgzQjFFLCAweDg5RTYsIDB4MDlFRSwKLSAgICAweDg5RTcsIDB4MTlGRSwgMHg4OUYxLCAweDNCMUYsIDB4ODlGNCwgMHgxOUZGLCAweDg5RjgsIDB4MUEwMCwKLSAgICAweDhBMDAsIDB4MDc3NCwgMHg4QTAxLCAweDM1QkMsIDB4OEEwMiwgMHgwQzE3LCAweDhBMDMsIDB4MUEwMSwKLSAgICAweDhBMDcsIDB4M0IyMCwgMHg4QTA4LCAweDA3MkQsIDB4OEEwQSwgMHgwQTFDLCAweDhBMEMsIDB4MUEwNCwKLSAgICAweDhBMEUsIDB4MEM3QywgMHg4QTBGLCAweDNCMjEsIDB4OEExMCwgMHgxQTAzLCAweDhBMTIsIDB4MjFBOCwKLSAgICAweDhBMTMsIDB4MDcwNywgMHg4QTE1LCAweDNCMjIsIDB4OEExNiwgMHgxQTAyLCAweDhBMTcsIDB4MEI1NywKLSAgICAweDhBMTgsIDB4MDY0NywgMHg4QTFCLCAweDFBMDUsIDB4OEExRCwgMHgxQTA2LCAweDhBMUYsIDB4MDlDMSwKLSAgICAweDhBMjIsIDB4M0IyMywgMHg4QTIzLCAweDA3NDMsIDB4OEEyNSwgMHgxQTA3LCAweDhBMkEsIDB4MEU1QSwKLSAgICAweDhBMkQsIDB4MEE4MywgMHg4QTMxLCAweDA2OTAsIDB4OEEzMywgMHgwRjAxLCAweDhBMzQsIDB4MEFDQywKLSAgICAweDhBMzYsIDB4MUEwOCwgMHg4QTM3LCAweDIxQTksIDB4OEEzQSwgMHgwQTBELCAweDhBM0IsIDB4MEJBRSwKLSAgICAweDhBM0MsIDB4MDlDMiwgMHg4QTQxLCAweDFBMDksIDB4OEE0NiwgMHgxQTBDLCAweDhBNDgsIDB4MUEwRCwKLSAgICAweDhBNEUsIDB4M0IyNCwgMHg4QTUwLCAweDA4MkUsIDB4OEE1MSwgMHgwQjIyLCAweDhBNTIsIDB4MUEwQiwKLSAgICAweDhBNTQsIDB4MDlDMywgMHg4QTU1LCAweDBEQjAsIDB4OEE1QiwgMHgxQTBBLCAweDhBNUUsIDB4MDhCQSwKLSAgICAweDhBNjAsIDB4MDRGNSwgMHg4QTYyLCAweDFBMTEsIDB4OEE2MywgMHgwNzJFLCAweDhBNjYsIDB4MDhCQywKLSAgICAweDhBNjksIDB4MDhCQiwgMHg4QTZCLCAweDBGRjMsIDB4OEE2QywgMHgxQTEwLCAweDhBNkQsIDB4MUEwRiwKLSAgICAweDhBNkUsIDB4MEFBOSwgMHg4QTcwLCAweDA2NjcsIDB4OEE3MSwgMHgwRkU5LCAweDhBNzIsIDB4MDU5OCwKLSAgICAweDhBNzMsIDB4MDlDNCwgMHg4QTc5LCAweDIxQUEsIDB4OEE3QywgMHgxQTBFLCAweDhBN0YsIDB4M0IyNSwKLSAgICAweDhBODIsIDB4MUExMywgMHg4QTg0LCAweDFBMTQsIDB4OEE4NSwgMHgxQTEyLCAweDhBODcsIDB4MDc4QywKLSAgICAweDhBODksIDB4MEYyQSwgMHg4QThDLCAweDA4QkQsIDB4OEE4RCwgMHgwQ0RELCAweDhBOTEsIDB4MUExNywKLSAgICAweDhBOTMsIDB4MEE2NCwgMHg4QTk1LCAweDBCODAsIDB4OEE5OCwgMHgwRjIwLCAweDhBOUEsIDB4MUExQSwKLSAgICAweDhBOUUsIDB4MDdBMCwgMHg4QUEwLCAweDBBNjMsIDB4OEFBMSwgMHgxQTE2LCAweDhBQTMsIDB4MUExQiwKLSAgICAweDhBQTQsIDB4MDdBMSwgMHg4QUE1LCAweDFBMTgsIDB4OEFBNiwgMHgxQTE5LCAweDhBQTcsIDB4MjFBQiwKLSAgICAweDhBQTgsIDB4MUExNSwgMHg4QUFBLCAweDM2MzgsIDB4OEFBQywgMHgwQTg2LCAweDhBQUQsIDB4MENBMSwKLSAgICAweDhBQjAsIDB4MEI2RCwgMHg4QUIyLCAweDA1NUQsIDB4OEFCOSwgMHgwRDg0LCAweDhBQkMsIDB4MDY1RCwKLSAgICAweDhBQkUsIDB4MjFBQywgMHg4QUJGLCAweDBCRDAsIDB4OEFDMiwgMHgxQTFFLCAweDhBQzQsIDB4MUExQywKLSAgICAweDhBQzcsIDB4MEI4QSwgMHg4QUNCLCAweDBBNjUsIDB4OEFDQywgMHgwNjBFLCAweDhBQ0QsIDB4MUExRCwKLSAgICAweDhBQ0YsIDB4MEEyMSwgMHg4QUQyLCAweDBGOTIsIDB4OEFENiwgMHgwRkU2LCAweDhBREEsIDB4MUExRiwKLSAgICAweDhBREIsIDB4MUEyQSwgMHg4QURDLCAweDBCRDEsIDB4OEFERSwgMHgxQTI5LCAweDhBREYsIDB4MjFBRCwKLSAgICAweDhBRTAsIDB4MUEyNiwgMHg4QUUxLCAweDFBMkUsIDB4OEFFMiwgMHgxQTI3LCAweDhBRTQsIDB4MUEyMywKLSAgICAweDhBRTYsIDB4MEMxOCwgMHg4QUU3LCAweDFBMjIsIDB4OEFFQiwgMHgxQTIwLCAweDhBRUQsIDB4MEYwQiwKLSAgICAweDhBRUUsIDB4MDhCRSwgMHg4QUYxLCAweDFBMjQsIDB4OEFGMywgMHgxQTIxLCAweDhBRjQsIDB4M0IyNiwKLSAgICAweDhBRjYsIDB4MjFBRiwgMHg4QUY3LCAweDFBMjgsIDB4OEFGOCwgMHgwOTdFLCAweDhBRkEsIDB4MDc3NSwKLSAgICAweDhBRkUsIDB4MEI1QSwgMHg4QjAwLCAweDBFNzMsIDB4OEIwMSwgMHgwNEZDLCAweDhCMDIsIDB4MDRBNiwKLSAgICAweDhCMDQsIDB4MEM3RCwgMHg4QjA3LCAweDFBMkMsIDB4OEIwQywgMHgxQTJCLCAweDhCMEUsIDB4MENCRSwKLSAgICAweDhCMTAsIDB4MUEzMCwgMHg4QjE0LCAweDFBMjUsIDB4OEIxNiwgMHgxQTJGLCAweDhCMTcsIDB4MUEzMSwKLSAgICAweDhCMTksIDB4MDc2MCwgMHg4QjFBLCAweDFBMkQsIDB4OEIxQiwgMHgwN0U4LCAweDhCMUQsIDB4MDkwMSwKLSAgICAweDhCMUYsIDB4M0IyNywgMHg4QjIwLCAweDFBMzIsIDB4OEIyMSwgMHgwRjQyLCAweDhCMjYsIDB4MUEzNSwKLSAgICAweDhCMjgsIDB4MUEzOCwgMHg4QjJCLCAweDFBMzYsIDB4OEIyQywgMHgwREE3LCAweDhCMzMsIDB4MUEzMywKLSAgICAweDhCMzcsIDB4M0IyOCwgMHg4QjM5LCAweDA2RDgsIDB4OEIzRSwgMHgxQTM3LCAweDhCNDEsIDB4MUEzOSwKLSAgICAweDhCNDMsIDB4M0IyOSwgMHg4QjQ0LCAweDNCMkEsIDB4OEI0OSwgMHgxQTNELCAweDhCNEMsIDB4MUEzQSwKLSAgICAweDhCNEUsIDB4MUEzQywgMHg4QjRGLCAweDFBM0IsIDB4OEI1MywgMHgyMUIwLCAweDhCNTQsIDB4M0IyQiwKLSAgICAweDhCNTYsIDB4MUEzRSwgMHg4QjU4LCAweDA4REQsIDB4OEI1QSwgMHgxQTQwLCAweDhCNUIsIDB4MUEzRiwKLSAgICAweDhCNUMsIDB4MEREQSwgMHg4QjVGLCAweDFBNDIsIDB4OEI2NiwgMHgwNzJGLCAweDhCNkIsIDB4MUE0MSwKLSAgICAweDhCNkMsIDB4MUE0MywgMHg4QjZGLCAweDFBNDQsIDB4OEI3MCwgMHgwNjVFLCAweDhCNzEsIDB4MTgyRSwKLSAgICAweDhCNzIsIDB4MDlFMSwgMHg4Qjc0LCAweDFBNDUsIDB4OEI3NywgMHgwN0EyLCAweDhCN0QsIDB4MUE0NiwKLSAgICAweDhCN0YsIDB4MjFCMSwgMHg4QjgwLCAweDFBNDcsIDB4OEI4MywgMHgwODhDLCAweDhCOEEsIDB4MTNEMywKLSAgICAweDhCOEMsIDB4MUE0OCwgMHg4QjhFLCAweDFBNDksIDB4OEI5MCwgMHgwOTNDLCAweDhCOTIsIDB4MUE0QSwKLSAgICAweDhCOTMsIDB4MUE0QiwgMHg4Qjk2LCAweDFBNEMsIDB4OEI5OSwgMHgxQTRELCAweDhCOUEsIDB4MUE0RSwKLSAgICAweDhCOUMsIDB4M0IyQywgMHg4QjlFLCAweDNCMkQsIDB4OEMzNywgMHgwQjY5LCAweDhDM0EsIDB4MUE0RiwKLSAgICAweDhDM0YsIDB4MUE1MSwgMHg4QzQxLCAweDFBNTAsIDB4OEM0NiwgMHgwQzdFLCAweDhDNDcsIDB4M0IyRSwKLSAgICAweDhDNDgsIDB4MUE1MiwgMHg4QzRBLCAweDBFNUIsIDB4OEM0QywgMHgxQTUzLCAweDhDNEUsIDB4MUE1NCwKLSAgICAweDhDNTAsIDB4MUE1NSwgMHg4QzU0LCAweDNCMkYsIDB4OEM1NSwgMHgxQTU2LCAweDhDNUEsIDB4MENCMiwKLSAgICAweDhDNjEsIDB4MDlDNSwgMHg4QzYyLCAweDFBNTcsIDB4OEM2QSwgMHgwN0ZELCAweDhDNkIsIDB4MTAwNywKLSAgICAweDhDNkMsIDB4MUE1OCwgMHg4QzczLCAweDNCMzAsIDB4OEM3OCwgMHgxQTU5LCAweDhDNzksIDB4MERCMSwKLSAgICAweDhDN0EsIDB4MUE1QSwgMHg4QzdDLCAweDFBNjIsIDB4OEM4MiwgMHgxQTVCLCAweDhDODUsIDB4MUE1RCwKLSAgICAweDhDODksIDB4MUE1QywgMHg4QzhBLCAweDFBNUUsIDB4OEM4QywgMHgwRTc0LCAweDhDOEQsIDB4MUE1RiwKLSAgICAweDhDOEUsIDB4MUE2MCwgMHg4Qzk0LCAweDFBNjEsIDB4OEM5OCwgMHgxQTYzLCAweDhDOUQsIDB4MDU4QiwKLSAgICAweDhDOUUsIDB4MEMwMywgMHg4Q0EwLCAweDBEREIsIDB4OENBMSwgMHgwODUyLCAweDhDQTIsIDB4MDdFOSwKLSAgICAweDhDQTQsIDB4M0IzMSwgMHg4Q0E3LCAweDBEQzEsIDB4OENBOCwgMHgwNTVGLCAweDhDQTksIDB4MEQ2MiwKLSAgICAweDhDQUEsIDB4MUE2NiwgMHg4Q0FCLCAweDA2MEYsIDB4OENBQywgMHgwQTc5LCAweDhDQUQsIDB4MUE2NSwKLSAgICAweDhDQUUsIDB4MUE2QSwgMHg4Q0FGLCAweDBCQjcsIDB4OENCMCwgMHgwRUVGLCAweDhDQjIsIDB4MUE2OCwKLSAgICAweDhDQjMsIDB4MUE2OSwgMHg4Q0I0LCAweDA2NDgsIDB4OENCNiwgMHgxQTZCLCAweDhDQjcsIDB4MEQxOSwKLSAgICAweDhDQjgsIDB4MEIzRiwgMHg4Q0JCLCAweDBEODUsIDB4OENCQywgMHgwQzM3LCAweDhDQkQsIDB4MUE2NywKLSAgICAweDhDQkYsIDB4MEU3NSwgMHg4Q0MwLCAweDA1NkMsIDB4OENDMSwgMHgxQTZELCAweDhDQzIsIDB4MEZDRSwKLSAgICAweDhDQzMsIDB4MEJERSwgMHg4Q0M0LCAweDBGRUIsIDB4OENDNywgMHgwOEJGLCAweDhDQzgsIDB4MUE2QywKLSAgICAweDhDQ0EsIDB4MEIxMSwgMHg4Q0NELCAweDFBN0QsIDB4OENDRSwgMHgwQUFBLCAweDhDRDEsIDB4MENEMCwKLSAgICAweDhDRDMsIDB4MERDMiwgMHg4Q0Q5LCAweDNCMzIsIDB4OENEQSwgMHgxQTcwLCAweDhDREIsIDB4MDg4RCwKLSAgICAweDhDREMsIDB4MDhDMCwgMHg4Q0RFLCAweDA5QzYsIDB4OENFMCwgMHgwRDFCLCAweDhDRTEsIDB4M0IzMywKLSAgICAweDhDRTIsIDB4MDc2MSwgMHg4Q0UzLCAweDFBNkYsIDB4OENFNCwgMHgxQTZFLCAweDhDRTYsIDB4MEREQywKLSAgICAweDhDRUEsIDB4MDhFRCwgMHg4Q0VELCAweDBDNEMsIDB4OENGMCwgMHgyMUIyLCAweDhDRjQsIDB4MjFCMywKLSAgICAweDhDRjgsIDB4M0IzNCwgMHg4Q0ZBLCAweDFBNzIsIDB4OENGQiwgMHgxQTczLCAweDhDRkMsIDB4MDdFQSwKLSAgICAweDhDRkQsIDB4MUE3MSwgMHg4Q0ZFLCAweDNCMzUsIDB4OEQwNCwgMHgxQTc0LCAweDhEMDUsIDB4MUE3NSwKLSAgICAweDhEMDcsIDB4MUE3NywgMHg4RDA4LCAweDBCMDMsIDB4OEQwQSwgMHgxQTc2LCAweDhEMEIsIDB4MDYyMiwKLSAgICAweDhEMEQsIDB4MUE3OSwgMHg4RDBGLCAweDFBNzgsIDB4OEQxMCwgMHgxQTdBLCAweDhEMTIsIDB4MjFCNCwKLSAgICAweDhEMTMsIDB4MUE3QywgMHg4RDE0LCAweDFBN0UsIDB4OEQxNiwgMHgxQTdGLCAweDhEMUIsIDB4M0IzNiwKLSAgICAweDhENjQsIDB4MEE3QSwgMHg4RDY2LCAweDA4RkIsIDB4OEQ2NywgMHgxQTgwLCAweDhENjksIDB4M0IzNywKLSAgICAweDhENkIsIDB4MDVCMCwgMHg4RDZDLCAweDNCMzgsIDB4OEQ2RCwgMHgxQTgxLCAweDhENzAsIDB4MEFGOCwKLSAgICAweDhENzEsIDB4MUE4MiwgMHg4RDczLCAweDFBODMsIDB4OEQ3NCwgMHgwRERELCAweDhENzYsIDB4MjFCNSwKLSAgICAweDhENzcsIDB4MDY0OSwgMHg4RDgxLCAweDFBODQsIDB4OEQ4NCwgMHgzQjM5LCAweDhEODUsIDB4MEJEMiwKLSAgICAweDhEOEEsIDB4MDRGRCwgMHg4RDhELCAweDNCM0EsIDB4OEQ5NSwgMHgzQjNCLCAweDhEOTksIDB4MUE4NSwKLSAgICAweDhEQTMsIDB4MDkxRCwgMHg4REE2LCAweDNCM0MsIDB4OERBOCwgMHgwQTNDLCAweDhEQjMsIDB4MEIwRCwKLSAgICAweDhEQkEsIDB4MUE4OCwgMHg4REJFLCAweDFBODcsIDB4OERDMiwgMHgxQTg2LCAweDhEQzYsIDB4M0IzRCwKLSAgICAweDhEQ0IsIDB4MUE4RSwgMHg4RENDLCAweDFBOEMsIDB4OERDRSwgMHgzQjNFLCAweDhEQ0YsIDB4MUE4OSwKLSAgICAweDhERDYsIDB4MUE4QiwgMHg4RERBLCAweDFBOEEsIDB4OEREQiwgMHgxQThELCAweDhEREQsIDB4MDY5MSwKLSAgICAweDhEREYsIDB4MUE5MSwgMHg4REUxLCAweDBBN0IsIDB4OERFMywgMHgxQTkyLCAweDhERTQsIDB4M0IzRiwKLSAgICAweDhERTgsIDB4MDc4RCwgMHg4REVBLCAweDFBOEYsIDB4OERFQiwgMHgxQTkwLCAweDhERUMsIDB4M0I0MCwKLSAgICAweDhERUYsIDB4MEZDRiwgMHg4REYzLCAweDBCRDMsIDB4OERGNSwgMHgwQUFCLCAweDhERkMsIDB4MUE5MywKLSAgICAweDhERkYsIDB4MUE5NiwgMHg4RTA4LCAweDFBOTQsIDB4OEUwOSwgMHgxQTk1LCAweDhFMEEsIDB4MEY0MywKLSAgICAweDhFMEYsIDB4MEM3RiwgMHg4RTEwLCAweDFBOTksIDB4OEUxRCwgMHgxQTk3LCAweDhFMUUsIDB4MUE5OCwKLSAgICAweDhFMUYsIDB4MUE5QSwgMHg4RTIwLCAweDNCNDEsIDB4OEUyQSwgMHgxQUE4LCAweDhFMzAsIDB4MUE5RCwKLSAgICAweDhFMzQsIDB4MUE5RSwgMHg4RTM1LCAweDFBOUMsIDB4OEU0MiwgMHgxQTlCLCAweDhFNDQsIDB4MEMxOSwKLSAgICAweDhFNDcsIDB4MUFBMCwgMHg4RTQ4LCAweDFBQTQsIDB4OEU0OSwgMHgxQUExLCAweDhFNEEsIDB4MUE5RiwKLSAgICAweDhFNEIsIDB4M0I0MiwgMHg4RTRDLCAweDFBQTIsIDB4OEU1MCwgMHgxQUEzLCAweDhFNTUsIDB4MUFBQSwKLSAgICAweDhFNTksIDB4MUFBNSwgMHg4RTVGLCAweDBBN0MsIDB4OEU2MCwgMHgxQUE3LCAweDhFNjMsIDB4MUFBOSwKLSAgICAweDhFNjQsIDB4MUFBNiwgMHg4RTZDLCAweDNCNDMsIDB4OEU3MCwgMHgzQjQ0LCAweDhFNzIsIDB4MUFBQywKLSAgICAweDhFNzQsIDB4MDkzRCwgMHg4RTc2LCAweDFBQUIsIDB4OEU3QSwgMHgzQjQ1LCAweDhFN0MsIDB4MUFBRCwKLSAgICAweDhFODEsIDB4MUFBRSwgMHg4RTg0LCAweDFBQjEsIDB4OEU4NSwgMHgxQUIwLCAweDhFODcsIDB4MUFBRiwKLSAgICAweDhFOEEsIDB4MUFCMywgMHg4RThCLCAweDFBQjIsIDB4OEU4RCwgMHgwRjAyLCAweDhFOTEsIDB4MUFCNSwKLSAgICAweDhFOTIsIDB4M0I0NiwgMHg4RTkzLCAweDFBQjQsIDB4OEU5NCwgMHgxQUI2LCAweDhFOTksIDB4MUFCNywKLSAgICAweDhFQTEsIDB4MUFCOSwgMHg4RUFBLCAweDFBQjgsIDB4OEVBQiwgMHgwQTBFLCAweDhFQUMsIDB4MUFCQSwKLSAgICAweDhFQUUsIDB4M0I0NywgMHg4RUFGLCAweDA2RTUsIDB4OEVCMCwgMHgxQUJCLCAweDhFQjEsIDB4MUFCRCwKLSAgICAweDhFQjMsIDB4M0I0OCwgMHg4RUI2LCAweDM3MDMsIDB4OEVCRSwgMHgxQUJFLCAweDhFQzAsIDB4MURFRiwKLSAgICAweDhFQzUsIDB4MUFCRiwgMHg4RUM2LCAweDFBQkMsIDB4OEVDOCwgMHgxQUMwLCAweDhFQ0EsIDB4MDkwMiwKLSAgICAweDhFQ0IsIDB4MUFDMSwgMHg4RUNDLCAweDA2NEEsIDB4OEVDRCwgMHgwNzA5LCAweDhFQ0YsIDB4MjFCNywKLSAgICAweDhFRDEsIDB4M0I0OSwgMHg4RUQyLCAweDA3NjIsIDB4OEVENCwgMHgzQjRBLCAweDhFREIsIDB4MUFDMiwKLSAgICAweDhFREYsIDB4MENDOCwgMHg4RUUyLCAweDBDMzgsIDB4OEVFMywgMHgxQUMzLCAweDhFRUIsIDB4MUFDNiwKLSAgICAweDhFRjgsIDB4MDhFMCwgMHg4RUY5LCAweDNCNEIsIDB4OEVGQiwgMHgxQUM1LCAweDhFRkMsIDB4MUFDNCwKLSAgICAweDhFRkQsIDB4MDczMCwgMHg4RUZFLCAweDFBQzcsIDB4OEYwMywgMHgwNUIxLCAweDhGMDUsIDB4MUFDOSwKLSAgICAweDhGMDksIDB4MDg0QywgMHg4RjBBLCAweDFBQzgsIDB4OEYwQywgMHgxQUQxLCAweDhGMTIsIDB4MUFDQiwKLSAgICAweDhGMTMsIDB4MUFDRCwgMHg4RjE0LCAweDBFMzUsIDB4OEYxNSwgMHgxQUNBLCAweDhGMTcsIDB4M0I0QywKLSAgICAweDhGMTksIDB4MUFDQywgMHg4RjFCLCAweDFBRDAsIDB4OEYxQywgMHgxQUNFLCAweDhGMUQsIDB4MDY0QiwKLSAgICAweDhGMUYsIDB4MUFDRiwgMHg4RjI2LCAweDFBRDIsIDB4OEYyOSwgMHgwRDEwLCAweDhGMkEsIDB4MEZBMCwKLSAgICAweDhGMkYsIDB4MDkzRSwgMHg4RjMzLCAweDFBRDMsIDB4OEYzNiwgMHgzQjRELCAweDhGMzgsIDB4MEYwQywKLSAgICAweDhGMzksIDB4MUFENSwgMHg4RjNCLCAweDFBRDQsIDB4OEYzRSwgMHgxQUQ4LCAweDhGM0YsIDB4MEYyQiwKLSAgICAweDhGNDIsIDB4MUFENywgMHg4RjQ0LCAweDA1Q0IsIDB4OEY0NSwgMHgxQUQ2LCAweDhGNDYsIDB4MUFEQiwKLSAgICAweDhGNDksIDB4MUFEQSwgMHg4RjRDLCAweDFBRDksIDB4OEY0RCwgMHgwQzJDLCAweDhGNEUsIDB4MUFEQywKLSAgICAweDhGNTcsIDB4MUFERCwgMHg4RjVDLCAweDFBREUsIDB4OEY1RiwgMHgwN0ZFLCAweDhGNjEsIDB4MDZGQiwKLSAgICAweDhGNjIsIDB4MUFERiwgMHg4RjYzLCAweDFBRTAsIDB4OEY2NCwgMHgxQUUxLCAweDhGOUIsIDB4MEEwRiwKLSAgICAweDhGOUMsIDB4MUFFMiwgMHg4RjlFLCAweDA4RDksIDB4OEY5RiwgMHgxQUUzLCAweDhGQTMsIDB4MUFFNCwKLSAgICAweDhGQTYsIDB4M0I0RSwgMHg4RkE3LCAweDEwQjYsIDB4OEZBOCwgMHgxMEI1LCAweDhGQUQsIDB4MUFFNSwKLSAgICAweDhGQUUsIDB4MTdGRiwgMHg4RkFGLCAweDFBRTYsIDB4OEZCMCwgMHgwQjYyLCAweDhGQjEsIDB4MDlGMSwKLSAgICAweDhGQjIsIDB4MENGNiwgMHg4RkI1LCAweDNCNEYsIDB4OEZCNiwgMHgzQjUwLCAweDhGQjcsIDB4MUFFNywKLSAgICAweDhGQkEsIDB4MEUyNSwgMHg4RkJCLCAweDBCRjAsIDB4OEZCQywgMHgwODEwLCAweDhGQkYsIDB4MEI2NywKLSAgICAweDhGQzIsIDB4MDRDQywgMHg4RkM0LCAweDBFQTYsIDB4OEZDNSwgMHgwQTFELCAweDhGQzYsIDB4M0I1MSwKLSAgICAweDhGQzgsIDB4Mzc5OSwgMHg4RkNFLCAweDA3MzQsIDB4OEZEMSwgMHgwNkQ5LCAweDhGRDQsIDB4MEUyNiwKLSAgICAweDhGREEsIDB4MUFFOCwgMHg4RkUwLCAweDNCNTIsIDB4OEZFMiwgMHgxQUVBLCAweDhGRTQsIDB4M0I1MywKLSAgICAweDhGRTUsIDB4MUFFOSwgMHg4RkU2LCAweDA1NjAsIDB4OEZFOSwgMHgwQ0NFLCAweDhGRUEsIDB4MUFFQiwKLSAgICAweDhGRUIsIDB4MEQyRCwgMHg4RkVELCAweDBDMkQsIDB4OEZFRiwgMHgxQUVDLCAweDhGRjAsIDB4MDk1QywKLSAgICAweDhGRjQsIDB4MUFFRSwgMHg4RkY2LCAweDNCNTQsIDB4OEZGNywgMHgwRUNFLCAweDhGRjgsIDB4MUFGRCwKLSAgICAweDhGRjksIDB4MUFGMCwgMHg4RkZBLCAweDFBRjEsIDB4OEZGRCwgMHgwQkU1LCAweDkwMDAsIDB4MEI0MCwKLSAgICAweDkwMDEsIDB4MEFGOSwgMHg5MDAyLCAweDNCNTUsIDB4OTAwMywgMHgwQzgwLCAweDkwMDUsIDB4MUFFRiwKLSAgICAweDkwMDYsIDB4MDY2RiwgMHg5MDBCLCAweDFBRjgsIDB4OTAwRCwgMHgxQUY1LCAweDkwMEUsIDB4MUIwMiwKLSAgICAweDkwMEYsIDB4MEM4MSwgMHg5MDEwLCAweDBCOUUsIDB4OTAxMSwgMHgxQUYyLCAweDkwMTMsIDB4MEMxQSwKLSAgICAweDkwMTQsIDB4MEM0RCwgMHg5MDE1LCAweDFBRjMsIDB4OTAxNiwgMHgxQUY3LCAweDkwMTcsIDB4MEEyNiwKLSAgICAweDkwMTksIDB4MEQxRCwgMHg5MDFBLCAweDBCRTgsIDB4OTAxRCwgMHgwQTY2LCAweDkwMUUsIDB4MUFGNiwKLSAgICAweDkwMUYsIDB4MEIwRSwgMHg5MDIwLCAweDBCMDQsIDB4OTAyMSwgMHgxQUY0LCAweDkwMjIsIDB4MDQ2RCwKLSAgICAweDkwMjMsIDB4MEZDOCwgMHg5MDI3LCAweDFBRjksIDB4OTAyQywgMHgzQjU2LCAweDkwMkUsIDB4MEI0MSwKLSAgICAweDkwMzEsIDB4MDkzRiwgMHg5MDMyLCAweDBBMTAsIDB4OTAzNSwgMHgxQUZCLCAweDkwMzYsIDB4MUFGQSwKLSAgICAweDkwMzgsIDB4MDRCMywgMHg5MDM5LCAweDFBRkMsIDB4OTAzQywgMHgwREExLCAweDkwM0UsIDB4MUIwNCwKLSAgICAweDkwNDEsIDB4MENCMywgMHg5MDQyLCAweDBBMzEsIDB4OTA0NCwgMHgzQjU3LCAweDkwNDUsIDB4MEI5NywKLSAgICAweDkwNDcsIDB4MDZGMCwgMHg5MDQ5LCAweDFCMDMsIDB4OTA0QSwgMHgwRjIxLCAweDkwNEIsIDB4MDRFMSwKLSAgICAweDkwNEQsIDB4MEUyNywgMHg5MDRFLCAweDA1NjEsIDB4OTA0RiwgMHgxQUZFLCAweDkwNTAsIDB4MUFGRiwKLSAgICAweDkwNTEsIDB4MUIwMCwgMHg5MDUyLCAweDFCMDEsIDB4OTA1MywgMHgwQzkzLCAweDkwNTQsIDB4MEI2MSwKLSAgICAweDkwNTUsIDB4MDRBNywgMHg5MDU2LCAweDFCMDUsIDB4OTA1OCwgMHgxQjA2LCAweDkwNTksIDB4MUQzNCwKLSAgICAweDkwNUMsIDB4MEIxRCwgMHg5MDVFLCAweDFCMDcsIDB4OTA2MCwgMHgwNTE1LCAweDkwNjEsIDB4MEFDRSwKLSAgICAweDkwNjMsIDB4MDc2MywgMHg5MDY1LCAweDBGNDQsIDB4OTA2NywgMHgyMUJBLCAweDkwNjgsIDB4MUIwOCwKLSAgICAweDkwNjksIDB4MEMyNiwgMHg5MDZELCAweDBBRkEsIDB4OTA2RSwgMHgwOTAzLCAweDkwNkYsIDB4MUIwOSwKLSAgICAweDkwNzIsIDB4MUIwQywgMHg5MDc1LCAweDA5NkYsIDB4OTA3NiwgMHgxQjBBLCAweDkwNzcsIDB4MEFBRCwKLSAgICAweDkwNzgsIDB4MEFBQywgMHg5MDdBLCAweDA0QTgsIDB4OTA3QywgMHgwRjkzLCAweDkwN0QsIDB4MUIwRSwKLSAgICAweDkwN0YsIDB4MEQ4NiwgMHg5MDgwLCAweDFCMTAsIDB4OTA4MSwgMHgxQjBGLCAweDkwODIsIDB4MUIwRCwKLSAgICAweDkwODMsIDB4MTczNywgMHg5MDg0LCAweDA2MTAsIDB4OTA4NywgMHgxQUVELCAweDkwODgsIDB4M0I1OCwKLSAgICAweDkwODksIDB4MUIxMiwgMHg5MDhBLCAweDFCMTEsIDB4OTA4RiwgMHgxQjEzLCAweDkwOTEsIDB4MEYyMiwKLSAgICAweDkwOTUsIDB4M0I1OSwgMHg5MDk5LCAweDNCNUEsIDB4OTA5QiwgMHgzQjVCLCAweDkwQTIsIDB4M0I1QywKLSAgICAweDkwQTMsIDB4MENCOSwgMHg5MEE2LCAweDBFNUMsIDB4OTBBOCwgMHgxQjE0LCAweDkwQUEsIDB4MDkwNSwKLSAgICAweDkwQUYsIDB4MUIxNSwgMHg5MEIxLCAweDFCMTYsIDB4OTBCNCwgMHgzQjVELCAweDkwQjUsIDB4MUIxNywKLSAgICAweDkwQjgsIDB4MEMxQiwgMHg5MEMxLCAweDA0QUUsIDB4OTBDQSwgMHgwN0VCLCAweDkwQ0UsIDB4MEZFMCwKLSAgICAweDkwRDcsIDB4M0I1RSwgMHg5MERCLCAweDFCMUIsIDB4OTBERCwgMHgzQjVGLCAweDkwREUsIDB4MjFCQiwKLSAgICAweDkwRTEsIDB4MDcwQSwgMHg5MEUyLCAweDFCMTgsIDB4OTBFNCwgMHgxQjE5LCAweDkwRTgsIDB4MERFNiwKLSAgICAweDkwRUQsIDB4MDVCMiwgMHg5MEY0LCAweDNCNjAsIDB4OTBGNSwgMHgwRjIzLCAweDkwRjcsIDB4MDZCNywKLSAgICAweDkwRkQsIDB4MEM0RSwgMHg5MTAyLCAweDFCMUMsIDB4OTExMiwgMHgxQjFELCAweDkxMTUsIDB4MjFCRCwKLSAgICAweDkxMTcsIDB4M0I2MSwgMHg5MTE5LCAweDFCMUUsIDB4OTExQywgMHgzQjYyLCAweDkxMjcsIDB4MjFCRSwKLSAgICAweDkxMkQsIDB4MEMxQywgMHg5MTMwLCAweDFCMjAsIDB4OTEzMSwgMHgzQjYzLCAweDkxMzIsIDB4MUIxRiwKLSAgICAweDkxM0EsIDB4M0I2NCwgMHg5MTNELCAweDNCNjUsIDB4OTE0OCwgMHgzQjY2LCAweDkxNDksIDB4MENBQiwKLSAgICAweDkxNEEsIDB4MUIyMSwgMHg5MTRCLCAweDA5NDAsIDB4OTE0QywgMHgwOTBDLCAweDkxNEQsIDB4MEQxMSwKLSAgICAweDkxNEUsIDB4MEJBRiwgMHg5MTUyLCAweDA5MUUsIDB4OTE1NCwgMHgwQTMyLCAweDkxNTYsIDB4MUIyMiwKLSAgICAweDkxNTgsIDB4MUIyMywgMHg5MTVCLCAweDNCNjcsIDB4OTE2MSwgMHgzQjY4LCAweDkxNjIsIDB4MEEyMywKLSAgICAweDkxNjMsIDB4MUIyNCwgMHg5MTY0LCAweDNCNjksIDB4OTE2NSwgMHgxQjI1LCAweDkxNjksIDB4MUIyNiwKLSAgICAweDkxNkEsIDB4MEY1OSwgMHg5MTZDLCAweDA5NDEsIDB4OTE3MiwgMHgxQjI4LCAweDkxNzMsIDB4MUIyNywKLSAgICAweDkxNzUsIDB4MDdFQywgMHg5MTc3LCAweDA4MDUsIDB4OTE3OCwgMHgwODhFLCAweDkxODIsIDB4MUIyQiwKLSAgICAweDkxODcsIDB4MDk3MCwgMHg5MTg5LCAweDFCMkEsIDB4OTE4QiwgMHgxQjI5LCAweDkxOEQsIDB4MEI0OSwKLSAgICAweDkxOEUsIDB4M0I2QSwgMHg5MTkwLCAweDA3QTMsIDB4OTE5MiwgMHgwQTY3LCAweDkxOTcsIDB4MEQ0NCwKLSAgICAweDkxOUMsIDB4MDk0MywgMHg5MTlFLCAweDNCNkIsIDB4OTFBMiwgMHgxQjJDLCAweDkxQTQsIDB4MDlDNywKLSAgICAweDkxQTgsIDB4M0I2QywgMHg5MUFBLCAweDFCMkYsIDB4OTFBQiwgMHgxQjJELCAweDkxQUMsIDB4MUUxQiwKLSAgICAweDkxQUQsIDB4M0I2RCwgMHg5MUFFLCAweDNCNkUsIDB4OTFBRiwgMHgxQjJFLCAweDkxQjEsIDB4MUU2MSwKLSAgICAweDkxQjIsIDB4M0I2RiwgMHg5MUI0LCAweDFCMzEsIDB4OTFCNSwgMHgxQjMwLCAweDkxQjgsIDB4MDlFMiwKLSAgICAweDkxQkEsIDB4MUIzMiwgMHg5MUJDLCAweDNCNzAsIDB4OTFDMCwgMHgxQjMzLCAweDkxQzEsIDB4MUIzNCwKLSAgICAweDkxQzYsIDB4MEQ2NCwgMHg5MUM3LCAweDA4NDMsIDB4OTFDOCwgMHgwOTBELCAweDkxQzksIDB4MUIzNSwKLSAgICAweDkxQ0IsIDB4MUIzNiwgMHg5MUNDLCAweDBGNkMsIDB4OTFDRCwgMHgwOTRGLCAweDkxQ0UsIDB4MEVGQSwKLSAgICAweDkxQ0YsIDB4MEY5NCwgMHg5MUQwLCAweDFCMzcsIDB4OTFEMSwgMHgwNkRBLCAweDkxRDYsIDB4MUIzOCwKLSAgICAweDkxRDcsIDB4MjFDMCwgMHg5MUQ4LCAweDBDMUQsIDB4OTFEQSwgMHgyMUJGLCAweDkxREIsIDB4MUIzQiwKLSAgICAweDkxREMsIDB4MDVENiwgMHg5MURELCAweDBBMTEsIDB4OTFERSwgMHgyMUMxLCAweDkxREYsIDB4MUIzOSwKLSAgICAweDkxRTEsIDB4MUIzQSwgMHg5MUUzLCAweDBCRkMsIDB4OTFFNCwgMHgyMUM0LCAweDkxRTUsIDB4MjFDNSwKLSAgICAweDkxRTYsIDB4MEU4MywgMHg5MUU3LCAweDA2RjQsIDB4OTFFRCwgMHgyMUMyLCAweDkxRUUsIDB4MjFDMywKLSAgICAweDkxRjAsIDB4M0I3MSwgMHg5MUY1LCAweDFCM0QsIDB4OTFGNiwgMHgxQjNFLCAweDkxRjcsIDB4M0I3MiwKLSAgICAweDkxRkIsIDB4M0I3MywgMHg5MUZDLCAweDFCM0MsIDB4OTFGRiwgMHgxQjQwLCAweDkyMDYsIDB4MjFDNiwKLSAgICAweDkyMDcsIDB4M0I3NCwgMHg5MjBBLCAweDIxQzgsIDB4OTIwRCwgMHgwQ0I3LCAweDkyMEUsIDB4MDVBMSwKLSAgICAweDkyMTAsIDB4MjFDNywgMHg5MjExLCAweDFCNDQsIDB4OTIxNCwgMHgxQjQxLCAweDkyMTUsIDB4MUI0MywKLSAgICAweDkyMUUsIDB4MUIzRiwgMHg5MjI4LCAweDNCNzUsIDB4OTIyOSwgMHgxQjhBLCAweDkyMkMsIDB4MUI0MiwKLSAgICAweDkyMzMsIDB4M0I3NiwgMHg5MjM0LCAweDBGQjMsIDB4OTIzNywgMHgwNzhFLCAweDkyMzgsIDB4M0I3NywKLSAgICAweDkyMzksIDB4MjFDRiwgMHg5MjNBLCAweDIxQzksIDB4OTIzQywgMHgyMUNCLCAweDkyM0YsIDB4MUI0QywKLSAgICAweDkyNDAsIDB4MjFDQSwgMHg5MjQzLCAweDNCNzgsIDB4OTI0NCwgMHgwQzJFLCAweDkyNDUsIDB4MUI0NywKLSAgICAweDkyNDcsIDB4M0I3OSwgMHg5MjQ4LCAweDFCNEEsIDB4OTI0OSwgMHgxQjQ4LCAweDkyNEIsIDB4MUI0RCwKLSAgICAweDkyNEUsIDB4MjFDQywgMHg5MjRGLCAweDNCN0EsIDB4OTI1MCwgMHgxQjRFLCAweDkyNTEsIDB4MjFDRSwKLSAgICAweDkyNTcsIDB4MUI0NiwgMHg5MjU5LCAweDIxQ0QsIDB4OTI1QSwgMHgxQjUzLCAweDkyNUIsIDB4MDUxNiwKLSAgICAweDkyNUUsIDB4MUI0NSwgMHg5MjYwLCAweDNCN0IsIDB4OTI2MiwgMHgwRDQxLCAweDkyNjQsIDB4MUI0OSwKLSAgICAweDkyNjYsIDB4MDlDOCwgMHg5MjY3LCAweDIxRDAsIDB4OTI3MSwgMHgwN0VELCAweDkyNzcsIDB4MjFEMiwKLSAgICAweDkyNzgsIDB4MjFEMywgMHg5MjdFLCAweDBFNzYsIDB4OTI4MCwgMHgwNkRDLCAweDkyODMsIDB4MDk1MCwKLSAgICAweDkyODUsIDB4MEM5NCwgMHg5Mjg4LCAweDIwQUEsIDB4OTI5MSwgMHgwQUFGLCAweDkyOTMsIDB4MUI1MSwKLSAgICAweDkyOTUsIDB4MUI0QiwgMHg5Mjk2LCAweDFCNTAsIDB4OTI5OCwgMHgwRUNGLCAweDkyOUEsIDB4MEJENCwKLSAgICAweDkyOUIsIDB4MUI1MiwgMHg5MjlDLCAweDFCNEYsIDB4OTJBNywgMHgyMUQxLCAweDkyQUQsIDB4MEFBRSwKLSAgICAweDkyQjMsIDB4MzU1NCwgMHg5MkI3LCAweDFCNTYsIDB4OTJCOSwgMHgxQjU1LCAweDkyQzIsIDB4M0I3QywKLSAgICAweDkyQ0IsIDB4M0I3RCwgMHg5MkNDLCAweDNCN0UsIDB4OTJDRiwgMHgxQjU0LCAweDkyRDAsIDB4MjFENywKLSAgICAweDkyRDIsIDB4MEU1RCwgMHg5MkQzLCAweDIxREIsIDB4OTJENSwgMHgyMUQ5LCAweDkyRDcsIDB4MjFENSwKLSAgICAweDkyRDksIDB4MjFENiwgMHg5MkRGLCAweDNCN0YsIDB4OTJFMCwgMHgyMURBLCAweDkyRTQsIDB4MDk4NSwKLSAgICAweDkyRTcsIDB4MjFENCwgMHg5MkU5LCAweDFCNTcsIDB4OTJFQSwgMHgwRTJGLCAweDkyRUQsIDB4MDRGNiwKLSAgICAweDkyRjIsIDB4MERCOCwgMHg5MkYzLCAweDBCQjAsIDB4OTJGOCwgMHgwNjkyLCAweDkyRjksIDB4MjBCMCwKLSAgICAweDkyRkEsIDB4MUI1OSwgMHg5MkZCLCAweDIxREUsIDB4OTJGQywgMHgwN0VGLCAweDkyRkYsIDB4MjFFMSwKLSAgICAweDkzMDIsIDB4MjFFMywgMHg5MzA0LCAweDM0NUEsIDB4OTMwNiwgMHgwODdBLCAweDkzMEQsIDB4M0I4MCwKLSAgICAweDkzMEYsIDB4MUI1OCwgMHg5MzEwLCAweDBBMzMsIDB4OTMxNSwgMHgzQjgxLCAweDkzMTgsIDB4MEEzNCwKLSAgICAweDkzMTksIDB4MUI1QywgMHg5MzFBLCAweDFCNUUsIDB4OTMxRCwgMHgyMUUyLCAweDkzMUUsIDB4MjFFMCwKLSAgICAweDkzMUYsIDB4M0I4MiwgMHg5MzIwLCAweDA5RTMsIDB4OTMyMSwgMHgyMURELCAweDkzMjIsIDB4MUI1RCwKLSAgICAweDkzMjMsIDB4MUI1RiwgMHg5MzI1LCAweDIxREMsIDB4OTMyNiwgMHgwNkNCLCAweDkzMjcsIDB4M0I4MywKLSAgICAweDkzMjgsIDB4MERCNywgMHg5MzJCLCAweDA5MEUsIDB4OTMyQywgMHgwRkM5LCAweDkzMkUsIDB4MUI1QiwKLSAgICAweDkzMkYsIDB4MDg2OCwgMHg5MzMyLCAweDBGRTUsIDB4OTMzNSwgMHgxQjYxLCAweDkzM0EsIDB4MUI2MCwKLSAgICAweDkzM0IsIDB4MUI2MiwgMHg5MzQ0LCAweDFCNUEsIDB4OTM0NywgMHgzQjg0LCAweDkzNDgsIDB4MjBBOSwKLSAgICAweDkzNEEsIDB4MzQ1OCwgMHg5MzRCLCAweDBDQzEsIDB4OTM0RCwgMHgwQzRGLCAweDkzNTIsIDB4M0I4NSwKLSAgICAweDkzNTQsIDB4MEJGMywgMHg5MzU2LCAweDFCNjcsIDB4OTM1NywgMHgyMUU1LCAweDkzNUIsIDB4MEI4MSwKLSAgICAweDkzNUMsIDB4MUI2MywgMHg5MzYwLCAweDFCNjQsIDB4OTM2NSwgMHgzQjg2LCAweDkzNkEsIDB4M0I4NywKLSAgICAweDkzNkMsIDB4MDcwMywgMHg5MzZELCAweDNCODgsIDB4OTM2RSwgMHgxQjY2LCAweDkzNzAsIDB4MjFFNCwKLSAgICAweDkzNzUsIDB4MDc2NCwgMHg5MzdDLCAweDFCNjUsIDB4OTM3RSwgMHgwOUM5LCAweDkzOEMsIDB4MDVENywKLSAgICAweDkzOTQsIDB4MUI2QiwgMHg5Mzk2LCAweDA4MkYsIDB4OTM5NywgMHgwQUZCLCAweDkzOUEsIDB4MEJFNiwKLSAgICAweDkzOUIsIDB4M0I4OSwgMHg5M0E0LCAweDIxRTYsIDB4OTNBNywgMHgwNTk5LCAweDkzQTksIDB4M0I4QiwKLSAgICAweDkzQUMsIDB4MUI2OSwgMHg5M0FELCAweDFCNkEsIDB4OTNBRSwgMHgwQkRGLCAweDkzQjAsIDB4MUI2OCwKLSAgICAweDkzQjksIDB4MUI2QywgMHg5M0JBLCAweDNCOEEsIDB4OTNDMSwgMHgzQjhDLCAweDkzQzMsIDB4MUI3MiwKLSAgICAweDkzQzYsIDB4MjFFNywgMHg5M0M4LCAweDFCNzUsIDB4OTNDQSwgMHgzQjhELCAweDkzRDAsIDB4MUI3NCwKLSAgICAweDkzRDEsIDB4MEMyNywgMHg5M0Q2LCAweDFCNkQsIDB4OTNENywgMHgxQjZFLCAweDkzRDgsIDB4MUI3MSwKLSAgICAweDkzREQsIDB4MUI3MywgMHg5M0RFLCAweDIxRTgsIDB4OTNFMSwgMHgwNkI4LCAweDkzRTIsIDB4M0I4RSwKLSAgICAweDkzRTQsIDB4MUI3NiwgMHg5M0U1LCAweDFCNzAsIDB4OTNFOCwgMHgxQjZGLCAweDkzRjgsIDB4MjFFOSwKLSAgICAweDkzRkEsIDB4M0I4RiwgMHg5M0ZELCAweDNCOTAsIDB4OTQwMywgMHgxQjdBLCAweDk0MDcsIDB4MUI3QiwKLSAgICAweDk0MEYsIDB4M0I5MSwgMHg5NDEwLCAweDFCN0MsIDB4OTQxMywgMHgxQjc5LCAweDk0MTQsIDB4MUI3OCwKLSAgICAweDk0MTgsIDB4MDlDQSwgMHg5NDE5LCAweDBDODIsIDB4OTQxQSwgMHgxQjc3LCAweDk0MjEsIDB4MUI4MCwKLSAgICAweDk0MkIsIDB4MUI3RSwgMHg5NDMxLCAweDIxRUEsIDB4OTQzNCwgMHgzQjkyLCAweDk0MzUsIDB4MUI3RiwKLSAgICAweDk0MzYsIDB4MUI3RCwgMHg5NDM4LCAweDBCNTgsIDB4OTQzQSwgMHgxQjgxLCAweDk0M0YsIDB4M0I5MywKLSAgICAweDk0NDEsIDB4MUI4MiwgMHg5NDQ0LCAweDFCODQsIDB4OTQ0NSwgMHgyMUVCLCAweDk0NDgsIDB4MjFFQywKLSAgICAweDk0NTEsIDB4MDYxMSwgMHg5NDUyLCAweDFCODMsIDB4OTQ1MywgMHgwRjA2LCAweDk0NTUsIDB4M0I5NCwKLSAgICAweDk0NUEsIDB4MUI4RiwgMHg5NDVCLCAweDFCODUsIDB4OTQ1RSwgMHgxQjg4LCAweDk0NjAsIDB4MUI4NiwKLSAgICAweDk0NjIsIDB4MUI4NywgMHg5NDZBLCAweDFCODksIDB4OTQ2QiwgMHgzQjk1LCAweDk0NzAsIDB4MUI4QiwKLSAgICAweDk0NzIsIDB4M0I5NiwgMHg5NDc1LCAweDFCOEMsIDB4OTQ3NywgMHgxQjhELCAweDk0N0MsIDB4MUI5MCwKLSAgICAweDk0N0QsIDB4MUI4RSwgMHg5NDdFLCAweDFCOTEsIDB4OTQ3RiwgMHgxQjkzLCAweDk0ODEsIDB4MUI5MiwKLSAgICAweDk1NzcsIDB4MEJENSwgMHg5NTc4LCAweDNCOTcsIDB4OTU4MCwgMHgwRUYzLCAweDk1ODIsIDB4MUI5NCwKLSAgICAweDk1ODMsIDB4MEFCMCwgMHg5NTg3LCAweDFCOTUsIDB4OTU4OSwgMHgwRTE0LCAweDk1OEEsIDB4MUI5NiwKLSAgICAweDk1OEIsIDB4MDU4OSwgMHg5NThGLCAweDA0REUsIDB4OTU5MSwgMHgwNjEzLCAweDk1OTIsIDB4MjFFRCwKLSAgICAweDk1OTMsIDB4MDYxMiwgMHg5NTk0LCAweDFCOTcsIDB4OTU5NiwgMHgxQjk4LCAweDk1OTgsIDB4MUI5OSwKLSAgICAweDk1OTksIDB4MUI5QSwgMHg5NUEwLCAweDFCOUIsIDB4OTVBMiwgMHgwNjE0LCAweDk1QTMsIDB4MDVCMywKLSAgICAweDk1QTQsIDB4MDdGMCwgMHg5NUE1LCAweDBENEEsIDB4OTVBNiwgMHgzQjk4LCAweDk1QTcsIDB4MUI5RCwKLSAgICAweDk1QTgsIDB4MUI5QywgMHg5NUE5LCAweDNCOTksIDB4OTVBQiwgMHgzQjlBLCAweDk1QUQsIDB4MUI5RSwKLSAgICAweDk1QjEsIDB4MzU1NSwgMHg5NUIyLCAweDA0RkUsIDB4OTVCNCwgMHgzQjlCLCAweDk1QjksIDB4MUJBMSwKLSAgICAweDk1QkIsIDB4MUJBMCwgMHg5NUJDLCAweDFCOUYsIDB4OTVCRCwgMHgzQjlDLCAweDk1QkUsIDB4MUJBMiwKLSAgICAweDk1QzMsIDB4MUJBNSwgMHg5NUM3LCAweDA0OEIsIDB4OTVDQSwgMHgxQkEzLCAweDk1Q0MsIDB4MUJBNywKLSAgICAweDk1Q0QsIDB4MUJBNiwgMHg5NUQ0LCAweDFCQTksIDB4OTVENSwgMHgxQkE4LCAweDk1RDYsIDB4MUJBQSwKLSAgICAweDk1RDgsIDB4MEM4NiwgMHg5NURBLCAweDNCOUQsIDB4OTVEQywgMHgxQkFCLCAweDk1RTEsIDB4MUJBQywKLSAgICAweDk1RTIsIDB4MUJBRSwgMHg5NUU1LCAweDFCQUQsIDB4OTYxQywgMHgwRERFLCAweDk2MUQsIDB4M0I5RSwKLSAgICAweDk2MjEsIDB4MUJBRiwgMHg5NjI4LCAweDFCQjAsIDB4OTYyQSwgMHgwODU1LCAweDk2MkUsIDB4MUJCMSwKLSAgICAweDk2MkYsIDB4MUJCMiwgMHg5NjMyLCAweDBFNzcsIDB4OTYzQiwgMHgwQUNELCAweDk2M0YsIDB4MDQ2OCwKLSAgICAweDk2NDAsIDB4MEIyQiwgMHg5NjQxLCAweDNCOUYsIDB4OTY0MiwgMHgxQkIzLCAweDk2NDQsIDB4MERERiwKLSAgICAweDk2NEIsIDB4MUJCNiwgMHg5NjRDLCAweDFCQjQsIDB4OTY0RCwgMHgwN0YxLCAweDk2NEYsIDB4MUJCNSwKLSAgICAweDk2NTAsIDB4MDc3NiwgMHg5NjU4LCAweDNCQTAsIDB4OTY1QiwgMHgwRTE1LCAweDk2NUMsIDB4MUJCOCwKLSAgICAweDk2NUQsIDB4MUJCQSwgMHg5NjVFLCAweDFCQjksIDB4OTY1RiwgMHgxQkJCLCAweDk2NjIsIDB4MDRDMywKLSAgICAweDk2NjMsIDB4MEExRSwgMHg5NjY0LCAweDA5ODYsIDB4OTY2NSwgMHgwNjE1LCAweDk2NjYsIDB4MUJCQywKLSAgICAweDk2NkEsIDB4MEQxQywgMHg5NjZDLCAweDFCQkUsIDB4OTY3MCwgMHgwNEM0LCAweDk2NzIsIDB4MUJCRCwKLSAgICAweDk2NzMsIDB4MEJFMCwgMHg5Njc1LCAweDBGOTUsIDB4OTY3NiwgMHgwQzgzLCAweDk2NzcsIDB4MUJCNywKLSAgICAweDk2NzgsIDB4MEY2RSwgMHg5NjdBLCAweDA3NjUsIDB4OTY3RCwgMHgwRjQ1LCAweDk2ODQsIDB4M0JBMSwKLSAgICAweDk2ODUsIDB4MDZGMSwgMHg5Njg2LCAweDBGN0MsIDB4OTY4OCwgMHgwNkZFLCAweDk2OEEsIDB4MEI0MiwKLSAgICAweDk2OEIsIDB4MTg2QywgMHg5NjhELCAweDFCQkYsIDB4OTY4RSwgMHgwNThBLCAweDk2OEYsIDB4MEEzNSwKLSAgICAweDk2OTQsIDB4MDVCNCwgMHg5Njk1LCAweDFCQzEsIDB4OTY5NywgMHgxQkMyLCAweDk2OTgsIDB4MUJDMCwKLSAgICAweDk2OTksIDB4MDczQSwgMHg5NjlCLCAweDA4NEQsIDB4OTY5QywgMHgwOUNCLCAweDk2OUQsIDB4MjFGMCwKLSAgICAweDk2QTAsIDB4MDRDNSwgMHg5NkEzLCAweDBGQTEsIDB4OTZBNCwgMHgzQkEyLCAweDk2QTcsIDB4MUJDNCwKLSAgICAweDk2QTgsIDB4MUIwQiwgMHg5NkE5LCAweDNCQTMsIDB4OTZBQSwgMHgxQkMzLCAweDk2QUYsIDB4MjFGMSwKLSAgICAweDk2QjAsIDB4MUJDNywgMHg5NkIxLCAweDFCQzUsIDB4OTZCMiwgMHgxQkM2LCAweDk2QjQsIDB4MUJDOCwKLSAgICAweDk2QjYsIDB4MUJDOSwgMHg5NkI3LCAweDBGQjQsIDB4OTZCOCwgMHgxQkNBLCAweDk2QjksIDB4MUJDQiwKLSAgICAweDk2QkIsIDB4MEE2RCwgMHg5NkJDLCAweDBENEYsIDB4OTZDMCwgMHgwQTQzLCAweDk2QzEsIDB4MDYyMywKLSAgICAweDk2QzQsIDB4MEYyNCwgMHg5NkM1LCAweDA1NkQsIDB4OTZDNiwgMHgwOTQyLCAweDk2QzcsIDB4MDc4RiwKLSAgICAweDk2QzksIDB4MUJDRSwgMHg5NkNCLCAweDFCQ0QsIDB4OTZDQywgMHgwOEMxLCAweDk2Q0QsIDB4MUJDRiwKLSAgICAweDk2Q0UsIDB4MUJDQywgMHg5NkQxLCAweDA4NzYsIDB4OTZEMiwgMHgzQkE0LCAweDk2RDUsIDB4MUJEMywKLSAgICAweDk2RDYsIDB4MTk5MiwgMHg5NkQ5LCAweDEwRUIsIDB4OTZEQiwgMHgwQTNELCAweDk2REMsIDB4MUJEMSwKLSAgICAweDk2REUsIDB4M0JBNiwgMHg5NkUyLCAweDBGNkQsIDB4OTZFMywgMHgwQ0M5LCAweDk2RTgsIDB4MDRDRCwKLSAgICAweDk2RTksIDB4M0JBNywgMHg5NkVBLCAweDBBODcsIDB4OTZFQiwgMHgwOEUyLCAweDk2RjAsIDB4MEUwNywKLSAgICAweDk2RjEsIDB4M0JBOCwgMHg5NkYyLCAweDA0RTIsIDB4OTZGNiwgMHgwRkI1LCAweDk2RjcsIDB4MEY1NSwKLSAgICAweDk2RjksIDB4MUJENCwgMHg5NkZCLCAweDBDM0YsIDB4OTcwMCwgMHgwOTI3LCAweDk3MDIsIDB4M0JBOSwKLSAgICAweDk3MDQsIDB4MUJENSwgMHg5NzA2LCAweDFCRDYsIDB4OTcwNywgMHgwQTEyLCAweDk3MDgsIDB4MUJENywKLSAgICAweDk3MDksIDB4M0JBQSwgMHg5NzBBLCAweDBGQjYsIDB4OTcwRCwgMHgxQkQyLCAweDk3MEUsIDB4MUJEOSwKLSAgICAweDk3MEYsIDB4MUJEQiwgMHg5NzExLCAweDFCREEsIDB4OTcxMywgMHgxQkQ4LCAweDk3MTYsIDB4MUJEQywKLSAgICAweDk3MTksIDB4MUJERCwgMHg5NzFDLCAweDBBRkMsIDB4OTcxRSwgMHgwNTYyLCAweDk3MjQsIDB4MUJERSwKLSAgICAweDk3MjcsIDB4MEVDNCwgMHg5NzJBLCAweDFCREYsIDB4OTczMCwgMHgxQkUwLCAweDk3MzIsIDB4MEZEMCwKLSAgICAweDk3MzMsIDB4MjFGMiwgMHg5NzM4LCAweDE0MTQsIDB4OTczOSwgMHgxQkUxLCAweDk3M0IsIDB4MjFGMywKLSAgICAweDk3M0QsIDB4MUJFMiwgMHg5NzNFLCAweDFCRTMsIDB4OTc0MiwgMHgxQkU3LCAweDk3NDMsIDB4MjFGNCwKLSAgICAweDk3NDQsIDB4MUJFNCwgMHg5NzQ2LCAweDFCRTUsIDB4OTc0OCwgMHgxQkU2LCAweDk3NDksIDB4MUJFOCwKLSAgICAweDk3NEQsIDB4MjFGNSwgMHg5NzRGLCAweDIxRjYsIDB4OTc1MSwgMHgyMUY3LCAweDk3NTIsIDB4MEE2OCwKLSAgICAweDk3NTUsIDB4MjFGOCwgMHg5NzU2LCAweDBGMDMsIDB4OTc1OSwgMHgwQTY5LCAweDk3NUEsIDB4M0JBQiwKLSAgICAweDk3NUMsIDB4MUJFOSwgMHg5NzVFLCAweDBEODcsIDB4OTc2MCwgMHgxQkVBLCAweDk3NjEsIDB4MUQwNiwKLSAgICAweDk3NjIsIDB4MEVEOCwgMHg5NzYzLCAweDNCQUMsIDB4OTc2NCwgMHgxQkVCLCAweDk3NjYsIDB4MUJFQywKLSAgICAweDk3NjgsIDB4MUJFRCwgMHg5NzY5LCAweDA1QjUsIDB4OTc2QiwgMHgxQkVGLCAweDk3NkQsIDB4MEExRiwKLSAgICAweDk3NkUsIDB4M0JBRCwgMHg5NzcxLCAweDFCRjAsIDB4OTc3MywgMHgzQkFFLCAweDk3NzQsIDB4MDZGQSwKLSAgICAweDk3NzksIDB4MUJGMSwgMHg5NzdBLCAweDFCRjUsIDB4OTc3QywgMHgxQkYzLCAweDk3ODEsIDB4MUJGNCwKLSAgICAweDk3ODQsIDB4MDVEMSwgMHg5Nzg1LCAweDFCRjIsIDB4OTc4NiwgMHgxQkY2LCAweDk3OEIsIDB4MUJGNywKLSAgICAweDk3OEQsIDB4MDQ4QywgMHg5NzhGLCAweDFCRjgsIDB4OTc5MCwgMHgxQkY5LCAweDk3OTgsIDB4MDlDQywKLSAgICAweDk3OUEsIDB4M0JBRiwgMHg5NzlDLCAweDFCRkEsIDB4OTdBMCwgMHgwNjYxLCAweDk3QTIsIDB4M0JCMCwKLSAgICAweDk3QTMsIDB4MUJGRCwgMHg5N0E2LCAweDFCRkMsIDB4OTdBOCwgMHgxQkZCLCAweDk3QUIsIDB4MUEzNCwKLSAgICAweDk3QUQsIDB4MEUyQywgMHg5N0IzLCAweDFCRkUsIDB4OTdCNCwgMHgxQkZGLCAweDk3QjUsIDB4M0JCMSwKLSAgICAweDk3QjYsIDB4M0JCMiwgMHg5N0MzLCAweDFDMDAsIDB4OTdDNiwgMHgxQzAxLCAweDk3QzgsIDB4MUMwMiwKLSAgICAweDk3Q0IsIDB4MUMwMywgMHg5N0QzLCAweDA2MTYsIDB4OTdEOSwgMHgzQkIzLCAweDk3REMsIDB4MUMwNCwKLSAgICAweDk3REUsIDB4M0JCNCwgMHg5N0VELCAweDFDMDUsIDB4OTdFRSwgMHgwQ0Q5LCAweDk3RjIsIDB4MUMwNywKLSAgICAweDk3RjMsIDB4MDUzQiwgMHg5N0Y0LCAweDNCQjUsIDB4OTdGNSwgMHgxQzBBLCAweDk3RjYsIDB4MUMwOSwKLSAgICAweDk3RkIsIDB4MDRDNiwgMHg5N0ZGLCAweDA2QjksIDB4OTgwMSwgMHgwRTE3LCAweDk4MDIsIDB4MEJENiwKLSAgICAweDk4MDMsIDB4MDgxMiwgMHg5ODA1LCAweDA3RjIsIDB4OTgwNiwgMHgwOTcxLCAweDk4MDgsIDB4MEEyMiwKLSAgICAweDk4MEEsIDB4M0JCNiwgMHg5ODBDLCAweDFDMEMsIDB4OTgwRSwgMHgzQkI3LCAweDk4MEYsIDB4MUMwQiwKLSAgICAweDk4MTAsIDB4MEYyQywgMHg5ODExLCAweDA2MjQsIDB4OTgxMiwgMHgwRDY2LCAweDk4MTMsIDB4MENCNCwKLSAgICAweDk4MTcsIDB4MEE0MiwgMHg5ODE4LCAweDBGOTYsIDB4OTgxQSwgMHgwNzMxLCAweDk4MUUsIDB4M0JCOCwKLSAgICAweDk4MjEsIDB4MUMwRiwgMHg5ODIzLCAweDNCQjksIDB4OTgyNCwgMHgxQzBFLCAweDk4MkIsIDB4M0JCQSwKLSAgICAweDk4MkMsIDB4MEU3OSwgMHg5ODJELCAweDBDODQsIDB4OTgzMCwgMHgxRTczLCAweDk4MzQsIDB4MDRGMiwKLSAgICAweDk4MzcsIDB4MUMxMCwgMHg5ODM4LCAweDFDMEQsIDB4OTgzOSwgMHgzN0IzLCAweDk4M0IsIDB4MERDMywKLSAgICAweDk4M0MsIDB4MEY1NCwgMHg5ODNELCAweDFDMTEsIDB4OTgzRSwgMHgzQkJCLCAweDk4NDYsIDB4MUMxMiwKLSAgICAweDk4NEIsIDB4MUMxNCwgMHg5ODRDLCAweDBCNEEsIDB4OTg0RCwgMHgwNUI5LCAweDk4NEUsIDB4MDVCQSwKLSAgICAweDk4NEYsIDB4MUMxMywgMHg5ODUyLCAweDNCQkMsIDB4OTg1MywgMHgzQkJELCAweDk4NTQsIDB4MDYyNSwKLSAgICAweDk4NTUsIDB4MDc2NiwgMHg5ODU3LCAweDIxRjksIDB4OTg1OCwgMHgwNjI2LCAweDk4NTksIDB4M0JCRSwKLSAgICAweDk4NUEsIDB4MUU0OCwgMHg5ODVCLCAweDBDMzksIDB4OTg1RSwgMHgwRkE4LCAweDk4NjUsIDB4MjFGQSwKLSAgICAweDk4NjcsIDB4MDc5MCwgMHg5ODZCLCAweDFDMTUsIDB4OTg2QywgMHgzQkJGLCAweDk4NkYsIDB4MUMxNiwKLSAgICAweDk4NzAsIDB4MUMxNywgMHg5ODcxLCAweDFDMTgsIDB4OTg3MywgMHgxQzFBLCAweDk4NzQsIDB4MUMxOSwKLSAgICAweDk4QTgsIDB4MERFOSwgMHg5OEFBLCAweDFDMUIsIDB4OThBRiwgMHgxQzFDLCAweDk4QjEsIDB4MUMxRCwKLSAgICAweDk4QjYsIDB4MUMxRSwgMHg5OEI4LCAweDNCQzAsIDB4OThCQSwgMHgzQkMxLCAweDk4QkYsIDB4M0JDMiwKLSAgICAweDk4QzMsIDB4MUMyMCwgMHg5OEM0LCAweDFDMUYsIDB4OThDNiwgMHgxQzIxLCAweDk4QzgsIDB4M0JDMywKLSAgICAweDk4REIsIDB4MEQ4OCwgMHg5OERDLCAweDE4MzksIDB4OThERiwgMHgwOUVGLCAweDk4RTAsIDB4MzYxOCwKLSAgICAweDk4RTIsIDB4MDY0QywgMHg5OEU1LCAweDNCQzQsIDB4OThFOSwgMHgxQzIyLCAweDk4RUIsIDB4MUMyMywKLSAgICAweDk4RUQsIDB4MTBDMSwgMHg5OEVFLCAweDE0REEsIDB4OThFRiwgMHgwRDY3LCAweDk4RjIsIDB4MDRCRiwKLSAgICAweDk4RjQsIDB4MDQ3RiwgMHg5OEZDLCAweDA4QzIsIDB4OThGRCwgMHgwRTVFLCAweDk4RkUsIDB4MDlFNiwKLSAgICAweDk5MDMsIDB4MUMyNCwgMHg5OTA1LCAweDBFRUIsIDB4OTkwOSwgMHgxQzI1LCAweDk5MEEsIDB4MEY0NiwKLSAgICAweDk5MEMsIDB4MDRFNCwgMHg5OTEwLCAweDA4OEYsIDB4OTkxMiwgMHgxQzI2LCAweDk5MTMsIDB4MDU2RSwKLSAgICAweDk5MTQsIDB4MUMyNywgMHg5OTE4LCAweDFDMjgsIDB4OTkxRCwgMHgxQzJBLCAweDk5MUUsIDB4MUMyQiwKLSAgICAweDk5MjAsIDB4MUMyRCwgMHg5OTIxLCAweDFDMjksIDB4OTkyNCwgMHgxQzJDLCAweDk5MjcsIDB4MjFGRCwKLSAgICAweDk5MjgsIDB4MDYxNywgMHg5OTJDLCAweDFDMkUsIDB4OTkyRSwgMHgxQzJGLCAweDk5MzIsIDB4M0JDNSwKLSAgICAweDk5MzMsIDB4M0JDNiwgMHg5OTNELCAweDFDMzAsIDB4OTkzRSwgMHgxQzMxLCAweDk5NDAsIDB4M0JDNywKLSAgICAweDk5NDIsIDB4MUMzMiwgMHg5OTQ1LCAweDFDMzQsIDB4OTk0OSwgMHgxQzMzLCAweDk5NEIsIDB4MUMzNiwKLSAgICAweDk5NEMsIDB4MUMzOSwgMHg5OTRELCAweDNCQzgsIDB4OTk1MCwgMHgxQzM1LCAweDk5NTEsIDB4MUMzNywKLSAgICAweDk5NTIsIDB4MUMzOCwgMHg5OTU1LCAweDFDM0EsIDB4OTk1NywgMHgwNkJBLCAweDk5NUMsIDB4M0JDOSwKLSAgICAweDk5NUYsIDB4M0JDQSwgMHg5OTk2LCAweDA5MUYsIDB4OTk5NywgMHgxQzNCLCAweDk5OTgsIDB4MUMzQywKLSAgICAweDk5OTksIDB4MDdGMywgMHg5OTlFLCAweDIxRkYsIDB4OTlBNSwgMHgxQzNELCAweDk5QTgsIDB4MDU5QywKLSAgICAweDk5QUMsIDB4MEQwNSwgMHg5OUFELCAweDFDM0UsIDB4OTlBRSwgMHgxQzNGLCAweDk5QjEsIDB4M0JDQiwKLSAgICAweDk5QjMsIDB4MEI5OCwgMHg5OUI0LCAweDBDQzMsIDB4OTlCOSwgMHgzQkNDLCAweDk5QkEsIDB4M0JDRCwKLSAgICAweDk5QkMsIDB4MUM0MCwgMHg5OUMxLCAweDBEMzMsIDB4OTlDNCwgMHgwQjJDLCAweDk5QzUsIDB4MDRGQSwKLSAgICAweDk5QzYsIDB4MDZFNiwgMHg5OUM4LCAweDA2RTcsIDB4OTlDOSwgMHgzQkNFLCAweDk5RDAsIDB4MEJCMSwKLSAgICAweDk5RDEsIDB4MUM0NSwgMHg5OUQyLCAweDA2RTgsIDB4OTlENSwgMHgwNTZGLCAweDk5RDgsIDB4MUM0NCwKLSAgICAweDk5REIsIDB4MUM0MiwgMHg5OURELCAweDFDNDMsIDB4OTlERiwgMHgxQzQxLCAweDk5RTIsIDB4MUM0RiwKLSAgICAweDk5RUQsIDB4MUM0NiwgMHg5OUVFLCAweDFDNDcsIDB4OTlGMSwgMHgxQzQ4LCAweDk5RjIsIDB4MUM0OSwKLSAgICAweDk5RjgsIDB4MUM0QiwgMHg5OUZCLCAweDFDNEEsIDB4OTlGRiwgMHgwOTYzLCAweDlBMDEsIDB4MUM0QywKLSAgICAweDlBMDIsIDB4M0JDRiwgMHg5QTA1LCAweDFDNEUsIDB4OUEwOCwgMHgzN0JBLCAweDlBMEUsIDB4MDY0RCwKLSAgICAweDlBMEYsIDB4MUM0RCwgMHg5QTEyLCAweDBBRkQsIDB4OUExMywgMHgwNzY3LCAweDlBMTYsIDB4M0JEMCwKLSAgICAweDlBMTksIDB4MUM1MCwgMHg5QTI0LCAweDNCRDEsIDB4OUEyNywgMHgzQkQyLCAweDlBMjgsIDB4MEIyRCwKLSAgICAweDlBMkIsIDB4MUM1MSwgMHg5QTJELCAweDNCRDMsIDB4OUEyRSwgMHgzQkQ0LCAweDlBMzAsIDB4MEM4NSwKLSAgICAweDlBMzYsIDB4M0JENSwgMHg5QTM3LCAweDFDNTIsIDB4OUEzOCwgMHgzQkQ2LCAweDlBM0UsIDB4MUM1NywKLSAgICAweDlBNDAsIDB4MUM1NSwgMHg5QTQyLCAweDFDNTQsIDB4OUE0MywgMHgxQzU2LCAweDlBNDUsIDB4MUM1MywKLSAgICAweDlBNEEsIDB4M0JENywgMHg5QTRELCAweDFDNTksIDB4OUE0RSwgMHgyMjAwLCAweDlBNTIsIDB4MUUyRiwKLSAgICAweDlBNTUsIDB4MUM1OCwgMHg5QTU2LCAweDNCRDgsIDB4OUE1NywgMHgxQzVCLCAweDlBNUEsIDB4MDZCQiwKLSAgICAweDlBNUIsIDB4MUM1QSwgMHg5QTVGLCAweDFDNUMsIDB4OUE2MiwgMHgxQzVELCAweDlBNjQsIDB4MUM1RiwKLSAgICAweDlBNjUsIDB4MUM1RSwgMHg5QTY5LCAweDFDNjAsIDB4OUE2QSwgMHgxQzYyLCAweDlBNkIsIDB4MUM2MSwKLSAgICAweDlBQTgsIDB4MDgwRSwgMHg5QUFELCAweDFDNjMsIDB4OUFCMCwgMHgxQzY0LCAweDlBQjUsIDB4M0JEOSwKLSAgICAweDlBQjYsIDB4M0JEQSwgMHg5QUI4LCAweDA1OUEsIDB4OUFCQywgMHgxQzY1LCAweDlBQzAsIDB4MUM2NiwKLSAgICAweDlBQzQsIDB4MEEzNywgMHg5QUNGLCAweDFDNjcsIDB4OUFEMSwgMHgxQzY4LCAweDlBRDMsIDB4MUM2OSwKLSAgICAweDlBRDQsIDB4MUM2QSwgMHg5QUQ4LCAweDA3RjQsIDB4OUFEOSwgMHgyMjAxLCAweDlBREMsIDB4MjIwMiwKLSAgICAweDlBREUsIDB4MUM2QiwgMHg5QURGLCAweDFDNkMsIDB4OUFFMiwgMHgxQzZELCAweDlBRTMsIDB4MUM2RSwKLSAgICAweDlBRTYsIDB4MUM2RiwgMHg5QUVBLCAweDBENDUsIDB4OUFFQiwgMHgxQzcxLCAweDlBRUQsIDB4MEQ5OCwKLSAgICAweDlBRUUsIDB4MUM3MiwgMHg5QUVGLCAweDFDNzAsIDB4OUFGMSwgMHgxQzc0LCAweDlBRjQsIDB4MUM3MywKLSAgICAweDlBRjcsIDB4MUM3NSwgMHg5QUY5LCAweDNCREIsIDB4OUFGQiwgMHgxQzc2LCAweDlCMDMsIDB4M0JEQywKLSAgICAweDlCMDYsIDB4MUM3NywgMHg5QjE4LCAweDFDNzgsIDB4OUIxQSwgMHgxQzc5LCAweDlCMUYsIDB4MUM3QSwKLSAgICAweDlCMjAsIDB4M0JERCwgMHg5QjIyLCAweDFDN0IsIDB4OUIyMywgMHgxQzdDLCAweDlCMjUsIDB4MUM3RCwKLSAgICAweDlCMjcsIDB4MUM3RSwgMHg5QjI4LCAweDFDN0YsIDB4OUIyOSwgMHgxQzgwLCAweDlCMkEsIDB4MUM4MSwKLSAgICAweDlCMkQsIDB4MzQzQywgMHg5QjJFLCAweDFDODIsIDB4OUIyRiwgMHgxQzgzLCAweDlCMzEsIDB4MTRENCwKLSAgICAweDlCMzIsIDB4MUM4NCwgMHg5QjMzLCAweDNCREUsIDB4OUIzNCwgMHgzQkRGLCAweDlCM0IsIDB4MTdBOSwKLSAgICAweDlCM0MsIDB4MDY0RSwgMHg5QjQxLCAweDA1N0YsIDB4OUI0MiwgMHgwODIyLCAweDlCNDMsIDB4MUM4NiwKLSAgICAweDlCNDQsIDB4MUM4NSwgMHg5QjQ1LCAweDBFQjEsIDB4OUI0RCwgMHgxQzg4LCAweDlCNEUsIDB4MUM4OSwKLSAgICAweDlCNEYsIDB4MUM4NywgMHg5QjUxLCAweDFDOEEsIDB4OUI1NCwgMHgwRTkwLCAweDlCNTgsIDB4MUM4QiwKLSAgICAweDlCNUEsIDB4MDY5NSwgMHg5QjZGLCAweDBGQ0IsIDB4OUI3MiwgMHgyMjA0LCAweDlCNzMsIDB4M0JFMCwKLSAgICAweDlCNzQsIDB4MUM4QywgMHg5Qjc1LCAweDIyMDMsIDB4OUI3OSwgMHgzQkUxLCAweDlCODMsIDB4MUM4RSwKLSAgICAweDlCOEUsIDB4MDQ4MiwgMHg5QjhGLCAweDIyMDUsIDB4OUI5MSwgMHgxQzhGLCAweDlCOTIsIDB4MERGQiwKLSAgICAweDlCOTMsIDB4MUM4RCwgMHg5Qjk2LCAweDFDOTAsIDB4OUI5NywgMHgxQzkxLCAweDlCOUYsIDB4MUM5MiwKLSAgICAweDlCQTAsIDB4MUM5MywgMHg5QkE3LCAweDNCRTIsIDB4OUJBOCwgMHgxQzk0LCAweDlCQUEsIDB4MEU5QywKLSAgICAweDlCQUIsIDB4MDg3QiwgMHg5QkFELCAweDA4NkEsIDB4OUJBRSwgMHgwQUIxLCAweDlCQjEsIDB4MjIwNiwKLSAgICAweDlCQjQsIDB4MUM5NSwgMHg5QkI5LCAweDFDOTgsIDB4OUJCQiwgMHgyMjA3LCAweDlCQzAsIDB4MUM5NiwKLSAgICAweDlCQzEsIDB4M0JFMywgMHg5QkM2LCAweDFDOTksIDB4OUJDNywgMHgzQkU0LCAweDlCQzksIDB4MDdBNSwKLSAgICAweDlCQ0EsIDB4MUM5NywgMHg5QkNGLCAweDFDOUEsIDB4OUJEMSwgMHgxQzlCLCAweDlCRDIsIDB4MUM5QywKLSAgICAweDlCRDQsIDB4MUNBMCwgMHg5QkQ2LCAweDA4NzgsIDB4OUJENywgMHgzQkU1LCAweDlCREIsIDB4MEI0NCwKLSAgICAweDlCREYsIDB4MzdCRiwgMHg5QkUxLCAweDFDQTEsIDB4OUJFMiwgMHgxQzlFLCAweDlCRTMsIDB4MUM5RCwKLSAgICAweDlCRTQsIDB4MUM5RiwgMHg5QkU3LCAweDNCRTYsIDB4OUJFOCwgMHgwNzM1LCAweDlCRUIsIDB4M0JFNywKLSAgICAweDlCRjAsIDB4MUNBNSwgMHg5QkYxLCAweDFDQTQsIDB4OUJGMiwgMHgxQ0EzLCAweDlCRjUsIDB4MDQ3NywKLSAgICAweDlCRjcsIDB4M0JFOCwgMHg5QkZBLCAweDNCRTksIDB4OUJGRCwgMHgzQkVBLCAweDlDMDAsIDB4MjIwOCwKLSAgICAweDlDMDQsIDB4MUNBRiwgMHg5QzA2LCAweDFDQUIsIDB4OUMwOCwgMHgxQ0FDLCAweDlDMDksIDB4MUNBOCwKLSAgICAweDlDMEEsIDB4MUNBRSwgMHg5QzBCLCAweDNCRUIsIDB4OUMwQywgMHgxQ0FBLCAweDlDMEQsIDB4MDVDMCwKLSAgICAweDlDMTAsIDB4MEZGMiwgMHg5QzEyLCAweDFDQUQsIDB4OUMxMywgMHgxQ0E5LCAweDlDMTQsIDB4MUNBNywKLSAgICAweDlDMTUsIDB4MUNBNiwgMHg5QzFCLCAweDFDQjEsIDB4OUMyMSwgMHgxQ0I0LCAweDlDMjQsIDB4MUNCMywKLSAgICAweDlDMjUsIDB4MUNCMiwgMHg5QzI3LCAweDNCRUMsIDB4OUMyQSwgMHgzQkVELCAweDlDMkQsIDB4MERCQiwKLSAgICAweDlDMkUsIDB4MUNCMCwgMHg5QzJGLCAweDA0QjcsIDB4OUMzMCwgMHgxQ0I1LCAweDlDMzIsIDB4MUNCNywKLSAgICAweDlDMzYsIDB4M0JFRSwgMHg5QzM5LCAweDA1Q0QsIDB4OUMzQSwgMHgxQ0EyLCAweDlDM0IsIDB4MDREOSwKLSAgICAweDlDM0UsIDB4MUNCOSwgMHg5QzQxLCAweDNCRUYsIDB4OUM0NiwgMHgxQ0I4LCAweDlDNDcsIDB4MUNCNiwKLSAgICAweDlDNDgsIDB4MEI2QiwgMHg5QzUyLCAweDBFOUUsIDB4OUM1MywgMHgzQkYwLCAweDlDNTcsIDB4MEZBMiwKLSAgICAweDlDNUEsIDB4MUNCQSwgMHg5QzYwLCAweDFDQkIsIDB4OUM2MywgMHgzQkYxLCAweDlDNjcsIDB4MUNCQywKLSAgICAweDlDNkEsIDB4M0JGMiwgMHg5Qzc2LCAweDFDQkQsIDB4OUM3NywgMHgzQkYzLCAweDlDNzgsIDB4MUNCRSwKLSAgICAweDlDRTUsIDB4MEJENywgMHg5Q0U3LCAweDFDQkYsIDB4OUNFOSwgMHgwRDRCLCAweDlDRUIsIDB4MUNDNCwKLSAgICAweDlDRUMsIDB4MUNDMCwgMHg5Q0YwLCAweDFDQzEsIDB4OUNGMywgMHgwRTVGLCAweDlDRjQsIDB4MEVEMCwKLSAgICAweDlDRjYsIDB4MENBOCwgMHg5RDAyLCAweDNCRjQsIDB4OUQwMywgMHgxQ0M1LCAweDlEMDYsIDB4MUNDNiwKLSAgICAweDlEMDcsIDB4MEM5NiwgMHg5RDA4LCAweDFDQzMsIDB4OUQwOSwgMHgxQ0MyLCAweDlEMEUsIDB4MDUyQSwKLSAgICAweDlEMTIsIDB4MUNDRSwgMHg5RDE1LCAweDFDQ0QsIDB4OUQxQiwgMHgwNTE3LCAweDlEMUYsIDB4MUNDQiwKLSAgICAweDlEMjMsIDB4MUNDQSwgMHg5RDI2LCAweDFDQzgsIDB4OUQyOCwgMHgwNUQ5LCAweDlEMkEsIDB4MUNDNywKLSAgICAweDlEMkIsIDB4MDhERSwgMHg5RDJDLCAweDA1MjksIDB4OUQzQiwgMHgwN0Y1LCAweDlEM0UsIDB4MUNEMSwKLSAgICAweDlEM0YsIDB4MUNEMCwgMHg5RDQxLCAweDFDQ0YsIDB4OUQ0MiwgMHgzQkY1LCAweDlENDQsIDB4MUNDQywKLSAgICAweDlENDYsIDB4MUNEMiwgMHg5RDQ3LCAweDNCRjYsIDB4OUQ0OCwgMHgxQ0QzLCAweDlENTAsIDB4MUNEOCwKLSAgICAweDlENTEsIDB4MUNENywgMHg5RDU5LCAweDFDRDksIDB4OUQ1QywgMHgwNENGLCAweDlENUQsIDB4MUNENCwKLSAgICAweDlENUUsIDB4MUNENSwgMHg5RDYwLCAweDA4MDYsIDB4OUQ2MSwgMHgwRUM1LCAweDlENjMsIDB4M0JGNywKLSAgICAweDlENjQsIDB4MUNENiwgMHg5RDY5LCAweDNCRjgsIDB4OUQ2QiwgMHgyMjBBLCAweDlENkMsIDB4MEU2MCwKLSAgICAweDlENkYsIDB4MUNERSwgMHg5RDcwLCAweDIyMDksIDB4OUQ3MiwgMHgxQ0RBLCAweDlEN0EsIDB4MUNERiwKLSAgICAweDlEN0MsIDB4M0JGOSwgMHg5RDdFLCAweDNCRkEsIDB4OUQ4NywgMHgxQ0RDLCAweDlEODksIDB4MUNEQiwKLSAgICAweDlEOEQsIDB4M0JGQiwgMHg5RDhGLCAweDA3MzIsIDB4OUQ5QSwgMHgxQ0UwLCAweDlEQTQsIDB4MUNFMSwKLSAgICAweDlEQTksIDB4MUNFMiwgMHg5REFCLCAweDFDREQsIDB4OURBRiwgMHgxQ0M5LCAweDlEQjEsIDB4M0JGQywKLSAgICAweDlEQjIsIDB4MUNFMywgMHg5REI0LCAweDBCRkQsIDB4OURCOCwgMHgxQ0U3LCAweDlEQkEsIDB4MUNFOCwKLSAgICAweDlEQkIsIDB4MUNFNiwgMHg5REMxLCAweDFDRTUsIDB4OURDMiwgMHgxQ0VCLCAweDlEQzMsIDB4M0JGRCwKLSAgICAweDlEQzQsIDB4MUNFNCwgMHg5REM2LCAweDFDRTksIDB4OURDNywgMHgzQkZFLCAweDlEQ0YsIDB4MUNFQSwKLSAgICAweDlERDMsIDB4MUNFRCwgMHg5REQ2LCAweDNCRkYsIDB4OURENywgMHgxRERFLCAweDlERDksIDB4MUNFQywKLSAgICAweDlEREYsIDB4M0MwMCwgMHg5REU2LCAweDFDRUYsIDB4OURFQiwgMHgzQzAxLCAweDlERUQsIDB4MUNGMCwKLSAgICAweDlERUYsIDB4MUNGMSwgMHg5REYyLCAweDBGRUYsIDB4OURGNCwgMHgzQzAyLCAweDlERjgsIDB4MUNFRSwKLSAgICAweDlERjksIDB4MEI0QiwgMHg5REZBLCAweDA4NUQsIDB4OURGRCwgMHgxQ0YyLCAweDlFMTUsIDB4M0MwMywKLSAgICAweDlFMTksIDB4MjIwQywgMHg5RTFBLCAweDFDRjMsIDB4OUUxQiwgMHgxQ0Y0LCAweDlFMUQsIDB4M0MwNCwKLSAgICAweDlFMUUsIDB4MUNGNSwgMHg5RTc1LCAweDFDRjYsIDB4OUU3OCwgMHgwNzY4LCAweDlFNzksIDB4MUNGNywKLSAgICAweDlFN0MsIDB4MURGRCwgMHg5RTdELCAweDFDRjgsIDB4OUU3RiwgMHgwOERCLCAweDlFODEsIDB4MUNGOSwKLSAgICAweDlFODgsIDB4MUNGQSwgMHg5RThCLCAweDFDRkIsIDB4OUU4QywgMHgxQ0ZDLCAweDlFOTEsIDB4MUNGRiwKLSAgICAweDlFOTIsIDB4MUNGRCwgMHg5RTkzLCAweDBGRTIsIDB4OUU5NSwgMHgxQ0ZFLCAweDlFOTcsIDB4MEZCNywKLSAgICAweDlFOUQsIDB4MUQwMCwgMHg5RTlGLCAweDBGQTMsIDB4OUVBNCwgMHgzQzA1LCAweDlFQTUsIDB4MUQwMSwKLSAgICAweDlFQTYsIDB4MEQzNCwgMHg5RUE4LCAweDNDMDYsIDB4OUVBOSwgMHgxRDAyLCAweDlFQUEsIDB4MUQwNCwKLSAgICAweDlFQUMsIDB4M0MwNywgMHg5RUFELCAweDFEMDUsIDB4OUVCNCwgMHgxRTAyLCAweDlFQjUsIDB4MUU3NSwKLSAgICAweDlFQjgsIDB4MUQwMywgMHg5RUI5LCAweDA3RkYsIDB4OUVCQSwgMHgwRUQ5LCAweDlFQkIsIDB4MEU5MSwKLSAgICAweDlFQkMsIDB4MTI4NCwgMHg5RUJFLCAweDE0RkYsIDB4OUVCRiwgMHgwRUE5LCAweDlFQzMsIDB4MzQwQiwKLSAgICAweDlFQzQsIDB4MDUyQiwgMHg5RUNDLCAweDFEMDcsIDB4OUVDRCwgMHgwNjZBLCAweDlFQ0UsIDB4MUQwOCwKLSAgICAweDlFQ0YsIDB4MUQwOSwgMHg5RUQwLCAweDFEMEEsIDB4OUVEMSwgMHgyMjBELCAweDlFRDIsIDB4MDgwNywKLSAgICAweDlFRDQsIDB4MUQwQiwgMHg5RUQ4LCAweDE2MEQsIDB4OUVEOSwgMHgwRUU3LCAweDlFREIsIDB4MEI0MywKLSAgICAweDlFREMsIDB4MUQwQywgMHg5RURELCAweDFEMEUsIDB4OUVERSwgMHgxRDBELCAweDlFRTAsIDB4MUQwRiwKLSAgICAweDlFRTUsIDB4MUQxMCwgMHg5RUU3LCAweDNDMDgsIDB4OUVFOCwgMHgxRDExLCAweDlFRUUsIDB4M0MwOSwKLSAgICAweDlFRUYsIDB4MUQxMiwgMHg5RUY0LCAweDFEMTMsIDB4OUVGNiwgMHgxRDE0LCAweDlFRjcsIDB4MUQxNSwKLSAgICAweDlFRjksIDB4MUQxNiwgMHg5RUZCLCAweDFEMTcsIDB4OUVGQywgMHgxRDE4LCAweDlFRkQsIDB4MUQxOSwKLSAgICAweDlGMDcsIDB4MUQxQSwgMHg5RjA4LCAweDFEMUIsIDB4OUYwRSwgMHgwQzFFLCAweDlGMTAsIDB4M0MwQSwKLSAgICAweDlGMTIsIDB4M0MwQiwgMHg5RjEzLCAweDA3OTEsIDB4OUYxNSwgMHgxRDFELCAweDlGMTcsIDB4M0MwQywKLSAgICAweDlGMTksIDB4M0MwRCwgMHg5RjIwLCAweDBBQ0YsIDB4OUYyMSwgMHgxRDFFLCAweDlGMkMsIDB4MUQxRiwKLSAgICAweDlGMkYsIDB4M0MwRSwgMHg5RjM3LCAweDNDMEYsIDB4OUYzOSwgMHgzQzEwLCAweDlGM0IsIDB4MEQ5MywKLSAgICAweDlGM0UsIDB4MUQyMCwgMHg5RjQxLCAweDNDMTEsIDB4OUY0NSwgMHgzQzEyLCAweDlGNEEsIDB4MUQyMSwKLSAgICAweDlGNEIsIDB4MTcwQSwgMHg5RjRFLCAweDFBN0IsIDB4OUY0RiwgMHgxQzA2LCAweDlGNTIsIDB4MUQyMiwKLSAgICAweDlGNTQsIDB4MUQyMywgMHg5RjU3LCAweDNDMTMsIDB4OUY1RiwgMHgxRDI1LCAweDlGNjAsIDB4MUQyNiwKLSAgICAweDlGNjEsIDB4MUQyNywgMHg5RjYyLCAweDBGQjgsIDB4OUY2MywgMHgxRDI0LCAweDlGNjYsIDB4MUQyOCwKLSAgICAweDlGNjcsIDB4MUQyOSwgMHg5RjY4LCAweDNDMTQsIDB4OUY2QSwgMHgxRDJCLCAweDlGNkMsIDB4MUQyQSwKLSAgICAweDlGNzEsIDB4M0MxNSwgMHg5RjcyLCAweDFEMkQsIDB4OUY3NSwgMHgzQzE2LCAweDlGNzYsIDB4MUQyRSwKLSAgICAweDlGNzcsIDB4MUQyQywgMHg5RjhELCAweDBGN0UsIDB4OUY5MCwgMHgzQzE3LCAweDlGOTQsIDB4M0MxOCwKLSAgICAweDlGOTUsIDB4MUQyRiwgMHg5RjlDLCAweDFEMzAsIDB4OUY5RCwgMHgxNzI3LCAweDlGQTAsIDB4MUQzMSwKLSAgICAweDlGQTIsIDB4M0MxOSwgMHhGOTI5LCAweDIxMjksIDB4RjlEQywgMHgyMUVFLCAweEZBMEUsIDB4MjBEQSwKLSAgICAweEZBMEYsIDB4MjBFNSwgMHhGQTEwLCAweDIwRTYsIDB4RkExMSwgMHgyMEZCLCAweEZBMTIsIDB4MjEyMSwKLSAgICAweEZBMTMsIDB4MjEzMSwgMHhGQTE0LCAweDIxMzMsIDB4RkExNSwgMHgyMTVFLCAweEZBMTYsIDB4MjE2NCwKLSAgICAweEZBMTcsIDB4MjE3QiwgMHhGQTE4LCAweDIxODMsIDB4RkExOSwgMHgyMTg0LCAweEZBMUEsIDB4MjE4NSwKLSAgICAweEZBMUIsIDB4MjE4NywgMHhGQTFDLCAweDIxOEIsIDB4RkExRCwgMHgyMThFLCAweEZBMUUsIDB4MjE5NywKLSAgICAweEZBMUYsIDB4MjFBMiwgMHhGQTIwLCAweDIxQTQsIDB4RkEyMSwgMHgyMUE1LCAweEZBMjIsIDB4MjFBRSwKLSAgICAweEZBMjMsIDB4MjFCNiwgMHhGQTI0LCAweDIxQjgsIDB4RkEyNSwgMHgyMUI5LCAweEZBMjYsIDB4MjFCQywKLSAgICAweEZBMjcsIDB4MjFEOCwgMHhGQTI4LCAweDIxREYsIDB4RkEyOSwgMHgyMUVGLCAweEZBMkEsIDB4MjFGQiwKLSAgICAweEZBMkIsIDB4MjFGQywgMHhGQTJDLCAweDIxRkUsIDB4RkEyRCwgMHgyMjBCLCAweEZCMDAsIDB4MjQ4RSwKLSAgICAweEZCMDEsIDB4MDA3MCwgMHhGQjAyLCAweDAwNzEsIDB4RkIwMywgMHgyNDhGLCAweEZCMDQsIDB4MjQ5MCwKLSAgICAweEZFMzAsIDB4MUVEQSwgMHhGRTMxLCAweDFFRDQsIDB4RkUzMiwgMHgxRUQ1LCAweEZFMzMsIDB4MUVEMiwKLSAgICAweEZFMzUsIDB4MUVEQiwgMHhGRTM2LCAweDFFREMsIDB4RkUzNywgMHgxRUUxLCAweEZFMzgsIDB4MUVFMiwKLSAgICAweEZFMzksIDB4MUVERCwgMHhGRTNBLCAweDFFREUsIDB4RkUzQiwgMHgxRUVCLCAweEZFM0MsIDB4MUVFQywKLSAgICAweEZFM0QsIDB4MUVFNSwgMHhGRTNFLCAweDFFRTYsIDB4RkUzRiwgMHgxRUUzLCAweEZFNDAsIDB4MUVFNCwKLSAgICAweEZFNDEsIDB4MUVFNywgMHhGRTQyLCAweDFFRTgsIDB4RkU0MywgMHgxRUU5LCAweEZFNDQsIDB4MUVFQSwKLSAgICAweEZGMDEsIDB4MDI4MiwgMHhGRjAyLCAweDFGNDcsIDB4RkYwMywgMHgwMkNDLCAweEZGMDQsIDB4MDJDOCwKLSAgICAweEZGMDUsIDB4MDJDQiwgMHhGRjA2LCAweDAyQ0QsIDB4RkYwNywgMHgxRjQ2LCAweEZGMDgsIDB4MDJBMiwKLSAgICAweEZGMDksIDB4MDJBMywgMHhGRjBBLCAweDAyQ0UsIDB4RkYwQiwgMHgwMkI0LCAweEZGMEMsIDB4MDI3QywKLSAgICAweEZGMEQsIDB4MDJCNSwgMHhGRjBFLCAweDAyN0QsIDB4RkYwRiwgMHgwMjk3LCAweEZGMTAsIDB4MDMwQywKLSAgICAweEZGMTEsIDB4MDMwRCwgMHhGRjEyLCAweDAzMEUsIDB4RkYxMywgMHgwMzBGLCAweEZGMTQsIDB4MDMxMCwKLSAgICAweEZGMTUsIDB4MDMxMSwgMHhGRjE2LCAweDAzMTIsIDB4RkYxNywgMHgwMzEzLCAweEZGMTgsIDB4MDMxNCwKLSAgICAweEZGMTksIDB4MDMxNSwgMHhGRjFBLCAweDAyN0YsIDB4RkYxQiwgMHgwMjgwLCAweEZGMUMsIDB4MDJCQiwKLSAgICAweEZGMUQsIDB4MDJCOSwgMHhGRjFFLCAweDAyQkMsIDB4RkYxRiwgMHgwMjgxLCAweEZGMjAsIDB4MDJDRiwKLSAgICAweEZGMjEsIDB4MDMxNiwgMHhGRjIyLCAweDAzMTcsIDB4RkYyMywgMHgwMzE4LCAweEZGMjQsIDB4MDMxOSwKLSAgICAweEZGMjUsIDB4MDMxQSwgMHhGRjI2LCAweDAzMUIsIDB4RkYyNywgMHgwMzFDLCAweEZGMjgsIDB4MDMxRCwKLSAgICAweEZGMjksIDB4MDMxRSwgMHhGRjJBLCAweDAzMUYsIDB4RkYyQiwgMHgwMzIwLCAweEZGMkMsIDB4MDMyMSwKLSAgICAweEZGMkQsIDB4MDMyMiwgMHhGRjJFLCAweDAzMjMsIDB4RkYyRiwgMHgwMzI0LCAweEZGMzAsIDB4MDMyNSwKLSAgICAweEZGMzEsIDB4MDMyNiwgMHhGRjMyLCAweDAzMjcsIDB4RkYzMywgMHgwMzI4LCAweEZGMzQsIDB4MDMyOSwKLSAgICAweEZGMzUsIDB4MDMyQSwgMHhGRjM2LCAweDAzMkIsIDB4RkYzNywgMHgwMzJDLCAweEZGMzgsIDB4MDMyRCwKLSAgICAweEZGMzksIDB4MDMyRSwgMHhGRjNBLCAweDAzMkYsIDB4RkYzQiwgMHgwMkE2LCAweEZGM0MsIDB4MDI5OCwKLSAgICAweEZGM0QsIDB4MDJBNywgMHhGRjNFLCAweDAyODgsIDB4RkYzRiwgMHgwMjhBLCAweEZGNDAsIDB4MDI4NiwKLSAgICAweEZGNDEsIDB4MDMzMCwgMHhGRjQyLCAweDAzMzEsIDB4RkY0MywgMHgwMzMyLCAweEZGNDQsIDB4MDMzMywKLSAgICAweEZGNDUsIDB4MDMzNCwgMHhGRjQ2LCAweDAzMzUsIDB4RkY0NywgMHgwMzM2LCAweEZGNDgsIDB4MDMzNywKLSAgICAweEZGNDksIDB4MDMzOCwgMHhGRjRBLCAweDAzMzksIDB4RkY0QiwgMHgwMzNBLCAweEZGNEMsIDB4MDMzQiwKLSAgICAweEZGNEQsIDB4MDMzQywgMHhGRjRFLCAweDAzM0QsIDB4RkY0RiwgMHgwMzNFLCAweEZGNTAsIDB4MDMzRiwKLSAgICAweEZGNTEsIDB4MDM0MCwgMHhGRjUyLCAweDAzNDEsIDB4RkY1MywgMHgwMzQyLCAweEZGNTQsIDB4MDM0MywKLSAgICAweEZGNTUsIDB4MDM0NCwgMHhGRjU2LCAweDAzNDUsIDB4RkY1NywgMHgwMzQ2LCAweEZGNTgsIDB4MDM0NywKLSAgICAweEZGNTksIDB4MDM0OCwgMHhGRjVBLCAweDAzNDksIDB4RkY1QiwgMHgwMkE4LCAweEZGNUMsIDB4MDI5QiwKLSAgICAweEZGNUQsIDB4MDJBOSwgMHhGRjVFLCAweDAyOTksIDB4RkY2MSwgMHgwMTQ3LCAweEZGNjIsIDB4MDE0OCwKLSAgICAweEZGNjMsIDB4MDE0OSwgMHhGRjY0LCAweDAxNEEsIDB4RkY2NSwgMHgwMTRCLCAweEZGNjYsIDB4MDE0QywKLSAgICAweEZGNjcsIDB4MDE0RCwgMHhGRjY4LCAweDAxNEUsIDB4RkY2OSwgMHgwMTRGLCAweEZGNkEsIDB4MDE1MCwKLSAgICAweEZGNkIsIDB4MDE1MSwgMHhGRjZDLCAweDAxNTIsIDB4RkY2RCwgMHgwMTUzLCAweEZGNkUsIDB4MDE1NCwKLSAgICAweEZGNkYsIDB4MDE1NSwgMHhGRjcwLCAweDAxNTYsIDB4RkY3MSwgMHgwMTU3LCAweEZGNzIsIDB4MDE1OCwKLSAgICAweEZGNzMsIDB4MDE1OSwgMHhGRjc0LCAweDAxNUEsIDB4RkY3NSwgMHgwMTVCLCAweEZGNzYsIDB4MDE1QywKLSAgICAweEZGNzcsIDB4MDE1RCwgMHhGRjc4LCAweDAxNUUsIDB4RkY3OSwgMHgwMTVGLCAweEZGN0EsIDB4MDE2MCwKLSAgICAweEZGN0IsIDB4MDE2MSwgMHhGRjdDLCAweDAxNjIsIDB4RkY3RCwgMHgwMTYzLCAweEZGN0UsIDB4MDE2NCwKLSAgICAweEZGN0YsIDB4MDE2NSwgMHhGRjgwLCAweDAxNjYsIDB4RkY4MSwgMHgwMTY3LCAweEZGODIsIDB4MDE2OCwKLSAgICAweEZGODMsIDB4MDE2OSwgMHhGRjg0LCAweDAxNkEsIDB4RkY4NSwgMHgwMTZCLCAweEZGODYsIDB4MDE2QywKLSAgICAweEZGODcsIDB4MDE2RCwgMHhGRjg4LCAweDAxNkUsIDB4RkY4OSwgMHgwMTZGLCAweEZGOEEsIDB4MDE3MCwKLSAgICAweEZGOEIsIDB4MDE3MSwgMHhGRjhDLCAweDAxNzIsIDB4RkY4RCwgMHgwMTczLCAweEZGOEUsIDB4MDE3NCwKLSAgICAweEZGOEYsIDB4MDE3NSwgMHhGRjkwLCAweDAxNzYsIDB4RkY5MSwgMHgwMTc3LCAweEZGOTIsIDB4MDE3OCwKLSAgICAweEZGOTMsIDB4MDE3OSwgMHhGRjk0LCAweDAxN0EsIDB4RkY5NSwgMHgwMTdCLCAweEZGOTYsIDB4MDE3QywKLSAgICAweEZGOTcsIDB4MDE3RCwgMHhGRjk4LCAweDAxN0UsIDB4RkY5OSwgMHgwMTdGLCAweEZGOUEsIDB4MDE4MCwKLSAgICAweEZGOUIsIDB4MDE4MSwgMHhGRjlDLCAweDAxODIsIDB4RkY5RCwgMHgwMTgzLCAweEZGOUUsIDB4MDE4NCwKLSAgICAweEZGOUYsIDB4MDE4NSwgMHhGRkUwLCAweDAyQzksIDB4RkZFMSwgMHgwMkNBLCAweEZGRTIsIDB4MDJFRiwKLSAgICAweEZGRTMsIDB4MDI4OSwgMHhGRkU0LCAweDFGNDUsIDB4RkZFNSwgMHgwMkM3LCAweEZGRTgsIDB4MDE0MywKKyAgICAweDAwMjAsIDB4MDAwMSwgMHgwMDIxLCAweDAwMDIsIDB4MDAyMiwgMHgwMDAzLCAweDAwMjMsIDB4MDAwNCwgMHgwMDI0LAorICAgIDB4MDAwNSwgMHgwMDI1LCAweDAwMDYsIDB4MDAyNiwgMHgwMDA3LCAweDAwMjcsIDB4MDAwOCwgMHgwMDI4LCAweDAwMDksCisgICAgMHgwMDI5LCAweDAwMEEsIDB4MDAyQSwgMHgwMDBCLCAweDAwMkIsIDB4MDAwQywgMHgwMDJDLCAweDAwMEQsIDB4MDAyRCwKKyAgICAweDAwMEUsIDB4MDAyRSwgMHgwMDBGLCAweDAwMkYsIDB4MDAxMCwgMHgwMDMwLCAweDAwMTEsIDB4MDAzMSwgMHgwMDEyLAorICAgIDB4MDAzMiwgMHgwMDEzLCAweDAwMzMsIDB4MDAxNCwgMHgwMDM0LCAweDAwMTUsIDB4MDAzNSwgMHgwMDE2LCAweDAwMzYsCisgICAgMHgwMDE3LCAweDAwMzcsIDB4MDAxOCwgMHgwMDM4LCAweDAwMTksIDB4MDAzOSwgMHgwMDFBLCAweDAwM0EsIDB4MDAxQiwKKyAgICAweDAwM0IsIDB4MDAxQywgMHgwMDNDLCAweDAwMUQsIDB4MDAzRCwgMHgwMDFFLCAweDAwM0UsIDB4MDAxRiwgMHgwMDNGLAorICAgIDB4MDAyMCwgMHgwMDQwLCAweDAwMjEsIDB4MDA0MSwgMHgwMDIyLCAweDAwNDIsIDB4MDAyMywgMHgwMDQzLCAweDAwMjQsCisgICAgMHgwMDQ0LCAweDAwMjUsIDB4MDA0NSwgMHgwMDI2LCAweDAwNDYsIDB4MDAyNywgMHgwMDQ3LCAweDAwMjgsIDB4MDA0OCwKKyAgICAweDAwMjksIDB4MDA0OSwgMHgwMDJBLCAweDAwNEEsIDB4MDAyQiwgMHgwMDRCLCAweDAwMkMsIDB4MDA0QywgMHgwMDJELAorICAgIDB4MDA0RCwgMHgwMDJFLCAweDAwNEUsIDB4MDAyRiwgMHgwMDRGLCAweDAwMzAsIDB4MDA1MCwgMHgwMDMxLCAweDAwNTEsCisgICAgMHgwMDMyLCAweDAwNTIsIDB4MDAzMywgMHgwMDUzLCAweDAwMzQsIDB4MDA1NCwgMHgwMDM1LCAweDAwNTUsIDB4MDAzNiwKKyAgICAweDAwNTYsIDB4MDAzNywgMHgwMDU3LCAweDAwMzgsIDB4MDA1OCwgMHgwMDM5LCAweDAwNTksIDB4MDAzQSwgMHgwMDVBLAorICAgIDB4MDAzQiwgMHgwMDVCLCAweDAwM0MsIDB4MDA1QywgMHgwMDYxLCAweDAwNUQsIDB4MDAzRSwgMHgwMDVFLCAweDAwM0YsCisgICAgMHgwMDVGLCAweDAwNDAsIDB4MDA2MCwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MiwgMHgwMDYyLCAweDAwNDMsIDB4MDA2MywKKyAgICAweDAwNDQsIDB4MDA2NCwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NiwgMHgwMDY2LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ4LAorICAgIDB4MDA2OCwgMHgwMDQ5LCAweDAwNjksIDB4MDA0QSwgMHgwMDZBLCAweDAwNEIsIDB4MDA2QiwgMHgwMDRDLCAweDAwNkMsCisgICAgMHgwMDRELCAweDAwNkQsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEYsIDB4MDA2RiwgMHgwMDUwLCAweDAwNzAsIDB4MDA1MSwKKyAgICAweDAwNzEsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTMsIDB4MDA3MywgMHgwMDU0LCAweDAwNzQsIDB4MDA1NSwgMHgwMDc1LAorICAgIDB4MDA1NiwgMHgwMDc2LCAweDAwNTcsIDB4MDA3NywgMHgwMDU4LCAweDAwNzgsIDB4MDA1OSwgMHgwMDc5LCAweDAwNUEsCisgICAgMHgwMDdBLCAweDAwNUIsIDB4MDA3QiwgMHgwMDVDLCAweDAwN0MsIDB4MDA1RCwgMHgwMDdELCAweDAwNUUsIDB4MDA3RSwKKyAgICAweDAwNUYsIDB4MDBBMSwgMHgwMDY1LCAweDAwQTIsIDB4MDA2NiwgMHgwMEEzLCAweDAwNjcsIDB4MDBBNCwgMHgwMDZCLAorICAgIDB4MDBBNSwgMHgwMDNELCAweDAwQTYsIDB4MDA2MywgMHgwMEE3LCAweDAyRDAsIDB4MDBBOCwgMHgwMjg3LCAweDAwQTksCisgICAgMHgwMDk4LCAweDAwQUEsIDB4MDA4QywgMHgwMEFCLCAweDAwNkQsIDB4MDBBQywgMHgwMDk5LCAweDAwQUQsIDB4MDA5NywKKyAgICAweDAwQUUsIDB4MDA5QSwgMHgwMEFGLCAweDAwODEsIDB4MDBCMCwgMHgwMkMzLCAweDAwQjEsIDB4MDJCNiwgMHgwMEIyLAorICAgIDB4MDA5RCwgMHgwMEIzLCAweDAwOUUsIDB4MDBCNCwgMHgwMjg1LCAweDAwQjUsIDB4MDA5RiwgMHgwMEI2LCAweDAzMEEsCisgICAgMHgwMEI3LCAweDAwNzUsIDB4MDBCOCwgMHgwMDg2LCAweDAwQjksIDB4MDBBMCwgMHgwMEJBLCAweDAwOTAsIDB4MDBCQiwKKyAgICAweDAwN0IsIDB4MDBCQywgMHgwMEExLCAweDAwQkQsIDB4MDBBMiwgMHgwMEJFLCAweDAwQTMsIDB4MDBCRiwgMHgwMDdFLAorICAgIDB4MDBDMCwgMHgwMEE0LCAweDAwQzEsIDB4MDBBNSwgMHgwMEMyLCAweDAwQTYsIDB4MDBDMywgMHgwMEE3LCAweDAwQzQsCisgICAgMHgwMEE4LCAweDAwQzUsIDB4MDBBOSwgMHgwMEM2LCAweDAwOEIsIDB4MDBDNywgMHgwMEFBLCAweDAwQzgsIDB4MDBBQiwKKyAgICAweDAwQzksIDB4MDBBQywgMHgwMENBLCAweDAwQUQsIDB4MDBDQiwgMHgwMEFFLCAweDAwQ0MsIDB4MDBBRiwgMHgwMENELAorICAgIDB4MDBCMCwgMHgwMENFLCAweDAwQjEsIDB4MDBDRiwgMHgwMEIyLCAweDAwRDAsIDB4MDBCMywgMHgwMEQxLCAweDAwQjQsCisgICAgMHgwMEQyLCAweDAwQjUsIDB4MDBEMywgMHgwMEI2LCAweDAwRDQsIDB4MDBCNywgMHgwMEQ1LCAweDAwQjgsIDB4MDBENiwKKyAgICAweDAwQjksIDB4MDBENywgMHgwMkI3LCAweDAwRDgsIDB4MDA4RSwgMHgwMEQ5LCAweDAwQkIsIDB4MDBEQSwgMHgwMEJDLAorICAgIDB4MDBEQiwgMHgwMEJELCAweDAwREMsIDB4MDBCRSwgMHgwMERELCAweDAwQkYsIDB4MDBERSwgMHgwMEMwLCAweDAwREYsCisgICAgMHgwMDk2LCAweDAwRTAsIDB4MDBDMSwgMHgwMEUxLCAweDAwQzIsIDB4MDBFMiwgMHgwMEMzLCAweDAwRTMsIDB4MDBDNCwKKyAgICAweDAwRTQsIDB4MDBDNSwgMHgwMEU1LCAweDAwQzYsIDB4MDBFNiwgMHgwMDkxLCAweDAwRTcsIDB4MDBDNywgMHgwMEU4LAorICAgIDB4MDBDOCwgMHgwMEU5LCAweDAwQzksIDB4MDBFQSwgMHgwMENBLCAweDAwRUIsIDB4MDBDQiwgMHgwMEVDLCAweDAwQ0MsCisgICAgMHgwMEVELCAweDAwQ0QsIDB4MDBFRSwgMHgwMENFLCAweDAwRUYsIDB4MDBDRiwgMHgwMEYwLCAweDAwRDAsIDB4MDBGMSwKKyAgICAweDAwRDEsIDB4MDBGMiwgMHgwMEQyLCAweDAwRjMsIDB4MDBEMywgMHgwMEY0LCAweDAwRDQsIDB4MDBGNSwgMHgwMEQ1LAorICAgIDB4MDBGNiwgMHgwMEQ2LCAweDAwRjcsIDB4MDJCOCwgMHgwMEY4LCAweDAwOTQsIDB4MDBGOSwgMHgwMEQ4LCAweDAwRkEsCisgICAgMHgwMEQ5LCAweDAwRkIsIDB4MDBEQSwgMHgwMEZDLCAweDAwREIsIDB4MDBGRCwgMHgwMERDLCAweDAwRkUsIDB4MDBERCwKKyAgICAweDAwRkYsIDB4MDBERSwgMHgwMTAwLCAweDI0OTYsIDB4MDEwMSwgMHgyNDkxLCAweDAxMTIsIDB4MjQ5OSwgMHgwMTEzLAorICAgIDB4MjQ5NCwgMHgwMTFBLCAweDI0QjMsIDB4MDExQiwgMHgyNEJGLCAweDAxMjcsIDB4MkYzQywgMHgwMTI4LCAweDI0QjgsCisgICAgMHgwMTI5LCAweDI0QzQsIDB4MDEyQSwgMHgyNDk3LCAweDAxMkIsIDB4MjQ5MiwgMHgwMTMxLCAweDAwOTIsIDB4MDE0MSwKKyAgICAweDAwOEQsIDB4MDE0MiwgMHgwMDkzLCAweDAxNEIsIDB4MjREQywgMHgwMTRDLCAweDI0OUEsIDB4MDE0RCwgMHgyNDk1LAorICAgIDB4MDE1MiwgMHgwMDhGLCAweDAxNTMsIDB4MDA5NSwgMHgwMTYwLCAweDAwREYsIDB4MDE2MSwgMHgwMEUzLCAweDAxNjgsCisgICAgMHgyNEJELCAweDAxNjksIDB4MjRDOSwgMHgwMTZBLCAweDI0OTgsIDB4MDE2QiwgMHgyNDkzLCAweDAxNkUsIDB4MjRCQywKKyAgICAweDAxNkYsIDB4MjRDOCwgMHgwMTc4LCAweDAwRTAsIDB4MDE3RCwgMHgwMEUxLCAweDAxN0UsIDB4MDBFNSwgMHgwMUMwLAorICAgIDB4MDA2MywgMHgwMUNELCAweDI0QjIsIDB4MDFDRSwgMHgyNEJFLCAweDAxQ0YsIDB4MjRCNiwgMHgwMUQwLCAweDI0QzIsCisgICAgMHgwMUQxLCAweDI0QjksIDB4MDFEMiwgMHgyNEM1LCAweDAxRDMsIDB4MjRCQiwgMHgwMUQ0LCAweDI0QzcsIDB4MDFGRCwKKyAgICAweDI0Q0QsIDB4MDI1MSwgMHgyNENBLCAweDAyNTQsIDB4MjRDRiwgMHgwMjU5LCAweDI0RDIsIDB4MDI1QSwgMHgyNEQ1LAorICAgIDB4MDI1QiwgMHgyNEQ4LCAweDAyNzUsIDB4MjRERCwgMHgwMjgzLCAweDI0RTIsIDB4MDI4QywgMHgyNERFLCAweDAyOTIsCisgICAgMHgyNEUxLCAweDAyRDAsIDB4MjRFMywgMHgwMzAwLCAweDAwNDEsIDB4MDMwMSwgMHgwMDdGLCAweDAzMDIsIDB4MDA4MCwKKyAgICAweDAzMDMsIDB4MDA1RiwgMHgwMzA0LCAweDAwODEsIDB4MDMwNSwgMHgwMEUyLCAweDAzMDYsIDB4MDA4MiwgMHgwMzA3LAorICAgIDB4MDA4MywgMHgwMzA4LCAweDAwODQsIDB4MDMwQSwgMHgwMDg1LCAweDAzMEIsIDB4MDA4NywgMHgwMzBDLCAweDAwODksCisgICAgMHgwMzI3LCAweDAwODYsIDB4MDMyOCwgMHgwMDg4LCAweDAzMzIsIDB4MDA0MCwgMHgwMzM2LCAweDAwOEEsIDB4MDM2MSwKKyAgICAweDAyRjYsIDB4MDM5MSwgMHgwM0YzLCAweDAzOTIsIDB4MDNGNCwgMHgwMzkzLCAweDAzRjUsIDB4MDM5NCwgMHgwM0Y2LAorICAgIDB4MDM5NSwgMHgwM0Y3LCAweDAzOTYsIDB4MDNGOCwgMHgwMzk3LCAweDAzRjksIDB4MDM5OCwgMHgwM0ZBLCAweDAzOTksCisgICAgMHgwM0ZCLCAweDAzOUEsIDB4MDNGQywgMHgwMzlCLCAweDAzRkQsIDB4MDM5QywgMHgwM0ZFLCAweDAzOUQsIDB4MDNGRiwKKyAgICAweDAzOUUsIDB4MDQwMCwgMHgwMzlGLCAweDA0MDEsIDB4MDNBMCwgMHgwNDAyLCAweDAzQTEsIDB4MDQwMywgMHgwM0EzLAorICAgIDB4MDQwNCwgMHgwM0E0LCAweDA0MDUsIDB4MDNBNSwgMHgwNDA2LCAweDAzQTYsIDB4MDQwNywgMHgwM0E3LCAweDA0MDgsCisgICAgMHgwM0E4LCAweDA0MDksIDB4MDNBOSwgMHgwNDBBLCAweDAzQjEsIDB4MDQwQiwgMHgwM0IyLCAweDA0MEMsIDB4MDNCMywKKyAgICAweDA0MEQsIDB4MDNCNCwgMHgwNDBFLCAweDAzQjUsIDB4MDQwRiwgMHgwM0I2LCAweDA0MTAsIDB4MDNCNywgMHgwNDExLAorICAgIDB4MDNCOCwgMHgwNDEyLCAweDAzQjksIDB4MDQxMywgMHgwM0JBLCAweDA0MTQsIDB4MDNCQiwgMHgwNDE1LCAweDAzQkMsCisgICAgMHgwNDE2LCAweDAzQkQsIDB4MDQxNywgMHgwM0JFLCAweDA0MTgsIDB4MDNCRiwgMHgwNDE5LCAweDAzQzAsIDB4MDQxQSwKKyAgICAweDAzQzEsIDB4MDQxQiwgMHgwM0MzLCAweDA0MUMsIDB4MDNDNCwgMHgwNDFELCAweDAzQzUsIDB4MDQxRSwgMHgwM0M2LAorICAgIDB4MDQxRiwgMHgwM0M3LCAweDA0MjAsIDB4MDNDOCwgMHgwNDIxLCAweDAzQzksIDB4MDQyMiwgMHgwM0QwLCAweDJGM0EsCisgICAgMHgwM0QxLCAweDJGNDAsIDB4MDNEQiwgMHgyRjNGLCAweDA0MDEsIDB4MDQyOSwgMHgwNDEwLCAweDA0MjMsIDB4MDQxMSwKKyAgICAweDA0MjQsIDB4MDQxMiwgMHgwNDI1LCAweDA0MTMsIDB4MDQyNiwgMHgwNDE0LCAweDA0MjcsIDB4MDQxNSwgMHgwNDI4LAorICAgIDB4MDQxNiwgMHgwNDJBLCAweDA0MTcsIDB4MDQyQiwgMHgwNDE4LCAweDA0MkMsIDB4MDQxOSwgMHgwNDJELCAweDA0MUEsCisgICAgMHgwNDJFLCAweDA0MUIsIDB4MDQyRiwgMHgwNDFDLCAweDA0MzAsIDB4MDQxRCwgMHgwNDMxLCAweDA0MUUsIDB4MDQzMiwKKyAgICAweDA0MUYsIDB4MDQzMywgMHgwNDIwLCAweDA0MzQsIDB4MDQyMSwgMHgwNDM1LCAweDA0MjIsIDB4MDQzNiwgMHgwNDIzLAorICAgIDB4MDQzNywgMHgwNDI0LCAweDA0MzgsIDB4MDQyNSwgMHgwNDM5LCAweDA0MjYsIDB4MDQzQSwgMHgwNDI3LCAweDA0M0IsCisgICAgMHgwNDI4LCAweDA0M0MsIDB4MDQyOSwgMHgwNDNELCAweDA0MkEsIDB4MDQzRSwgMHgwNDJCLCAweDA0M0YsIDB4MDQyQywKKyAgICAweDA0NDAsIDB4MDQyRCwgMHgwNDQxLCAweDA0MkUsIDB4MDQ0MiwgMHgwNDJGLCAweDA0NDMsIDB4MDQzMCwgMHgwNDQ0LAorICAgIDB4MDQzMSwgMHgwNDQ1LCAweDA0MzIsIDB4MDQ0NiwgMHgwNDMzLCAweDA0NDcsIDB4MDQzNCwgMHgwNDQ4LCAweDA0MzUsCisgICAgMHgwNDQ5LCAweDA0MzYsIDB4MDQ0QiwgMHgwNDM3LCAweDA0NEMsIDB4MDQzOCwgMHgwNDRELCAweDA0MzksIDB4MDQ0RSwKKyAgICAweDA0M0EsIDB4MDQ0RiwgMHgwNDNCLCAweDA0NTAsIDB4MDQzQywgMHgwNDUxLCAweDA0M0QsIDB4MDQ1MiwgMHgwNDNFLAorICAgIDB4MDQ1MywgMHgwNDNGLCAweDA0NTQsIDB4MDQ0MCwgMHgwNDU1LCAweDA0NDEsIDB4MDQ1NiwgMHgwNDQyLCAweDA0NTcsCisgICAgMHgwNDQzLCAweDA0NTgsIDB4MDQ0NCwgMHgwNDU5LCAweDA0NDUsIDB4MDQ1QSwgMHgwNDQ2LCAweDA0NUIsIDB4MDQ0NywKKyAgICAweDA0NUMsIDB4MDQ0OCwgMHgwNDVELCAweDA0NDksIDB4MDQ1RSwgMHgwNDRBLCAweDA0NUYsIDB4MDQ0QiwgMHgwNDYwLAorICAgIDB4MDQ0QywgMHgwNDYxLCAweDA0NEQsIDB4MDQ2MiwgMHgwNDRFLCAweDA0NjMsIDB4MDQ0RiwgMHgwNDY0LCAweDA0NTEsCisgICAgMHgwNDRBLCAweDA0NUIsIDB4MkYzQywgMHgxRUJDLCAweDI0QjUsIDB4MUVCRCwgMHgyNEMxLCAweDIwMDIsIDB4MDBFNywKKyAgICAweDIwMDMsIDB4MDI3OSwgMHgyMDEwLCAweDAyOTYsIDB4MjAxMSwgMHgwMDBFLCAweDIwMTIsIDB4MDA3MiwgMHgyMDEzLAorICAgIDB4MDA3MiwgMHgyMDE0LCAweDAwOEEsIDB4MjAxNSwgMHgwMjk1LCAweDIwMTYsIDB4MDI5QSwgMHgyMDE4LCAweDAyOUUsCisgICAgMHgyMDE5LCAweDAyOUYsIDB4MjAxQSwgMHgwMDc4LCAweDIwMUMsIDB4MDJBMCwgMHgyMDFELCAweDAyQTEsIDB4MjAxRSwKKyAgICAweDAwNzksIDB4MjAyMCwgMHgwMzA4LCAweDIwMjEsIDB4MDMwOSwgMHgyMDIyLCAweDAwNzcsIDB4MjAyNSwgMHgwMjlELAorICAgIDB4MjAyNiwgMHgwMjlDLCAweDIwMzAsIDB4MDMwNCwgMHgyMDMyLCAweDAyQzQsIDB4MjAzMywgMHgwMkM1LCAweDIwMzksCisgICAgMHgwMDZFLCAweDIwM0EsIDB4MDA2RiwgMHgyMDNCLCAweDAyREUsIDB4MjAzQywgMHgyRjRGLCAweDIwM0UsIDB4MDE0NSwKKyAgICAweDIwNDQsIDB4MDA2OCwgMHgyMDQ5LCAweDJGNTAsIDB4MjA3MCwgMHgyNEExLCAweDIwNzQsIDB4MjRBMiwgMHgyMDc1LAorICAgIDB4MjRBMywgMHgyMDc2LCAweDI0QTQsIDB4MjA3NywgMHgyNEE1LCAweDIwNzgsIDB4MjRBNiwgMHgyMDc5LCAweDI0QTcsCisgICAgMHgyMDgwLCAweDI0QTgsIDB4MjA4MSwgMHgyNEE5LCAweDIwODIsIDB4MjRBQSwgMHgyMDgzLCAweDI0QUIsIDB4MjA4NCwKKyAgICAweDI0QUMsIDB4MjA4NSwgMHgyNEFELCAweDIwODYsIDB4MjRBRSwgMHgyMDg3LCAweDI0QUYsIDB4MjA4OCwgMHgyNEIwLAorICAgIDB4MjA4OSwgMHgyNEIxLCAweDIwQUMsIDB4MjQ4QSwgMHgyMERELCAweDAzMEIsIDB4MjEwMCwgMHgyRTRGLCAweDIxMDMsCisgICAgMHgwMkM2LCAweDIxMDUsIDB4MkU1MywgMHgyMTA5LCAweDIwNzEsIDB4MjEwQSwgMHgyMDcwLCAweDIxMEYsIDB4MkYzQywKKyAgICAweDIxMTMsIDB4MUY1OSwgMHgyMTE2LCAweDFEQkEsIDB4MjEyMSwgMHgxRjc3LCAweDIxMjIsIDB4MDBFNCwgMHgyMTI2LAorICAgIDB4MjQ4QiwgMHgyMTJCLCAweDAzMDMsIDB4MjEzNSwgMHgyRjM5LCAweDIxNTMsIDB4MjQ5RiwgMHgyMTU0LCAweDI0QTAsCisgICAgMHgyMTVCLCAweDI0OUIsIDB4MjE1QywgMHgyNDlDLCAweDIxNUQsIDB4MjQ5RCwgMHgyMTVFLCAweDI0OUUsIDB4MjE2MCwKKyAgICAweDFEOTcsIDB4MjE2MSwgMHgxRDk4LCAweDIxNjIsIDB4MUQ5OSwgMHgyMTYzLCAweDFEOUEsIDB4MjE2NCwgMHgxRDlCLAorICAgIDB4MjE2NSwgMHgxRDlDLCAweDIxNjYsIDB4MUQ5RCwgMHgyMTY3LCAweDFEOUUsIDB4MjE2OCwgMHgxRDlGLCAweDIxNjksCisgICAgMHgxREEwLCAweDIxNkEsIDB4MjAyMSwgMHgyMTZCLCAweDIwMjIsIDB4MjE3MCwgMHgxRjlDLCAweDIxNzEsIDB4MUY5RCwKKyAgICAweDIxNzIsIDB4MUY5RSwgMHgyMTczLCAweDFGOUYsIDB4MjE3NCwgMHgxRkEwLCAweDIxNzUsIDB4MUZBMSwgMHgyMTc2LAorICAgIDB4MUZBMiwgMHgyMTc3LCAweDFGQTMsIDB4MjE3OCwgMHgxRkE0LCAweDIxNzksIDB4MUZBNSwgMHgyMTdBLCAweDIwNkEsCisgICAgMHgyMTdCLCAweDIwNkIsIDB4MjE3RiwgMHgyMDZGLCAweDIxOTAsIDB4MDJFMSwgMHgyMTkxLCAweDAyRTIsIDB4MjE5MiwKKyAgICAweDAyRTAsIDB4MjE5MywgMHgwMkUzLCAweDIxOTQsIDB4MkZBOSwgMHgyMTk1LCAweDJGQjcsIDB4MjE5NiwgMHgyRkFDLAorICAgIDB4MjE5NywgMHgyRkFELCAweDIxOTgsIDB4MkZBQSwgMHgyMTk5LCAweDJGQUIsIDB4MjFDNCwgMHgyMDc2LCAweDIxQzUsCisgICAgMHgyMDc3LCAweDIxQzYsIDB4MjA3NSwgMHgyMUNDLCAweDJGQUUsIDB4MjFEMCwgMHgyRkE4LCAweDIxRDIsIDB4MDJGMCwKKyAgICAweDIxRDQsIDB4MDJGMSwgMHgyMUU2LCAweDFGNEQsIDB4MjFFNywgMHgxRjRDLCAweDIxRTgsIDB4MUY0RSwgMHgyMUU5LAorICAgIDB4MUY0QiwgMHgyMjAwLCAweDAyRjIsIDB4MjIwMiwgMHgwMkY3LCAweDIyMDMsIDB4MDJGMywgMHgyMjA1LCAweDJGOTgsCisgICAgMHgyMjA3LCAweDAyRjgsIDB4MjIwOCwgMHgwMkU1LCAweDIyMEEsIDB4MkYzQiwgMHgyMjBCLCAweDAyRTYsIDB4MjIxMSwKKyAgICAweDFEQzksIDB4MjIxMiwgMHgwMkI1LCAweDIyMTMsIDB4MkY1NiwgMHgyMjFBLCAweDAyRkQsIDB4MjIxRCwgMHgwMkZGLAorICAgIDB4MjIxRSwgMHgwMkJGLCAweDIyMUYsIDB4MURDRCwgMHgyMjIwLCAweDAyRjQsIDB4MjIyNSwgMHgwMjlBLCAweDIyMjcsCisgICAgMHgwMkVELCAweDIyMjgsIDB4MDJFRSwgMHgyMjI5LCAweDAyRUMsIDB4MjIyQSwgMHgwMkVCLCAweDIyMkIsIDB4MDMwMSwKKyAgICAweDIyMkMsIDB4MDMwMiwgMHgyMjJELCAweDIwMDMsIDB4MjIyRSwgMHgxREM4LCAweDIyMzQsIDB4MDJDMCwgMHgyMjM1LAorICAgIDB4MDMwMCwgMHgyMjNDLCAweDAyOTksIDB4MjIzRCwgMHgwMkZFLCAweDIyNDMsIDB4MkY1OCwgMHgyMjUyLCAweDAyRkEsCisgICAgMHgyMjYwLCAweDAyQkEsIDB4MjI2MSwgMHgwMkY5LCAweDIyNjYsIDB4MDJCRCwgMHgyMjY3LCAweDAyQkUsIDB4MjI2QSwKKyAgICAweDAyRkIsIDB4MjI2QiwgMHgwMkZDLCAweDIyNzIsIDB4MkY1OSwgMHgyMjczLCAweDJGNUEsIDB4MjI4MiwgMHgwMkU5LAorICAgIDB4MjI4MywgMHgwMkVBLCAweDIyODYsIDB4MDJFNywgMHgyMjg3LCAweDAyRTgsIDB4MjI5NSwgMHgyRjlDLCAweDIyOTYsCisgICAgMHgyRjlBLCAweDIyOTcsIDB4MkY5RCwgMHgyMjk4LCAweDJGOUIsIDB4MjI5RCwgMHgyRjlBLCAweDIyOUUsIDB4MkY5RSwKKyAgICAweDIyQTAsIDB4MkY5OSwgMHgyMkE1LCAweDAyRjUsIDB4MjJCRiwgMHgxRENFLCAweDIyRUUsIDB4MUVEOSwgMHgyMkVGLAorICAgIDB4MDI5QywgMHgyMzAwLCAweDJGOTgsIDB4MjMwNywgMHgyRkJCLCAweDIzMTIsIDB4MDJGNiwgMHgyNDRBLCAweDJGNTQsCisgICAgMHgyNDYwLCAweDFEODMsIDB4MjQ2MSwgMHgxRDg0LCAweDI0NjIsIDB4MUQ4NSwgMHgyNDYzLCAweDFEODYsIDB4MjQ2NCwKKyAgICAweDFEODcsIDB4MjQ2NSwgMHgxRDg4LCAweDI0NjYsIDB4MUQ4OSwgMHgyNDY3LCAweDFEOEEsIDB4MjQ2OCwgMHgxRDhCLAorICAgIDB4MjQ2OSwgMHgxRDhDLCAweDI0NkEsIDB4MUQ4RCwgMHgyNDZCLCAweDFEOEUsIDB4MjQ2QywgMHgxRDhGLCAweDI0NkQsCisgICAgMHgxRDkwLCAweDI0NkUsIDB4MUQ5MSwgMHgyNDZGLCAweDFEOTIsIDB4MjQ3MCwgMHgxRDkzLCAweDI0NzEsIDB4MUQ5NCwKKyAgICAweDI0NzIsIDB4MUQ5NSwgMHgyNDczLCAweDFEOTYsIDB4MjQ3NCwgMHgxRjg3LCAweDI0NzUsIDB4MUY4OCwgMHgyNDc2LAorICAgIDB4MUY4OSwgMHgyNDc3LCAweDFGOEEsIDB4MjQ3OCwgMHgxRjhCLCAweDI0NzksIDB4MUY4QywgMHgyNDdBLCAweDFGOEQsCisgICAgMHgyNDdCLCAweDFGOEUsIDB4MjQ3QywgMHgxRjhGLCAweDI0N0QsIDB4MUY5MCwgMHgyNDdFLCAweDFGOTEsIDB4MjQ3RiwKKyAgICAweDFGOTIsIDB4MjQ4MCwgMHgxRjkzLCAweDI0ODEsIDB4MUY5NCwgMHgyNDgyLCAweDFGOTUsIDB4MjQ4MywgMHgxRjk2LAorICAgIDB4MjQ4NCwgMHgxRjk3LCAweDI0ODUsIDB4MUY5OCwgMHgyNDg2LCAweDFGOTksIDB4MjQ4NywgMHgxRjlBLCAweDI0ODgsCisgICAgMHgxRjdFLCAweDI0ODksIDB4MUY3RiwgMHgyNDhBLCAweDFGODAsIDB4MjQ4QiwgMHgxRjgxLCAweDI0OEMsIDB4MUY4MiwKKyAgICAweDI0OEQsIDB4MUY4MywgMHgyNDhFLCAweDFGODQsIDB4MjQ4RiwgMHgxRjg1LCAweDI0OTAsIDB4MUY4NiwgMHgyNDlDLAorICAgIDB4MUZCMCwgMHgyNDlELCAweDFGQjEsIDB4MjQ5RSwgMHgxRkIyLCAweDI0OUYsIDB4MUZCMywgMHgyNEEwLCAweDFGQjQsCisgICAgMHgyNEExLCAweDFGQjUsIDB4MjRBMiwgMHgxRkI2LCAweDI0QTMsIDB4MUZCNywgMHgyNEE0LCAweDFGQjgsIDB4MjRBNSwKKyAgICAweDFGQjksIDB4MjRBNiwgMHgxRkJBLCAweDI0QTcsIDB4MUZCQiwgMHgyNEE4LCAweDFGQkMsIDB4MjRBOSwgMHgxRkJELAorICAgIDB4MjRBQSwgMHgxRkJFLCAweDI0QUIsIDB4MUZCRiwgMHgyNEFDLCAweDFGQzAsIDB4MjRBRCwgMHgxRkMxLCAweDI0QUUsCisgICAgMHgxRkMyLCAweDI0QUYsIDB4MUZDMywgMHgyNEIwLCAweDFGQzQsIDB4MjRCMSwgMHgxRkM1LCAweDI0QjIsIDB4MUZDNiwKKyAgICAweDI0QjMsIDB4MUZDNywgMHgyNEI0LCAweDFGQzgsIDB4MjRCNSwgMHgxRkM5LCAweDI0QjYsIDB4Mjg2MywgMHgyNEI3LAorICAgIDB4Mjg2NCwgMHgyNEI4LCAweDI4NjUsIDB4MjRCOSwgMHgyODY2LCAweDI0QkEsIDB4Mjg2NywgMHgyNEJCLCAweDI4NjgsCisgICAgMHgyNEJDLCAweDI4NjksIDB4MjRCRCwgMHgyODZBLCAweDI0QkUsIDB4Mjg2QiwgMHgyNEJGLCAweDI4NkMsIDB4MjRDMCwKKyAgICAweDI4NkQsIDB4MjRDMSwgMHgyODZFLCAweDI0QzIsIDB4Mjg2RiwgMHgyNEMzLCAweDI4NzAsIDB4MjRDNCwgMHgyODcxLAorICAgIDB4MjRDNSwgMHgyODcyLCAweDI0QzYsIDB4Mjg3MywgMHgyNEM3LCAweDI4NzQsIDB4MjRDOCwgMHgyODc1LCAweDI0QzksCisgICAgMHgyODc2LCAweDI0Q0EsIDB4Mjg3NywgMHgyNENCLCAweDI4NzgsIDB4MjRDQywgMHgyODc5LCAweDI0Q0QsIDB4Mjg3QSwKKyAgICAweDI0Q0UsIDB4Mjg3QiwgMHgyNENGLCAweDI4N0MsIDB4MjREMCwgMHgyODQ5LCAweDI0RDEsIDB4Mjg0QSwgMHgyNEQyLAorICAgIDB4Mjg0QiwgMHgyNEQzLCAweDI4NEMsIDB4MjRENCwgMHgyODRELCAweDI0RDUsIDB4Mjg0RSwgMHgyNEQ2LCAweDI4NEYsCisgICAgMHgyNEQ3LCAweDI4NTAsIDB4MjREOCwgMHgyODUxLCAweDI0RDksIDB4Mjg1MiwgMHgyNERBLCAweDI4NTMsIDB4MjREQiwKKyAgICAweDI4NTQsIDB4MjREQywgMHgyODU1LCAweDI0REQsIDB4Mjg1NiwgMHgyNERFLCAweDI4NTcsIDB4MjRERiwgMHgyODU4LAorICAgIDB4MjRFMCwgMHgyODU5LCAweDI0RTEsIDB4Mjg1QSwgMHgyNEUyLCAweDI4NUIsIDB4MjRFMywgMHgyODVDLCAweDI0RTQsCisgICAgMHgyODVELCAweDI0RTUsIDB4Mjg1RSwgMHgyNEU2LCAweDI4NUYsIDB4MjRFNywgMHgyODYwLCAweDI0RTgsIDB4Mjg2MSwKKyAgICAweDI0RTksIDB4Mjg2MiwgMHgyNEVBLCAweDIwMjAsIDB4MjUwMCwgMHgxRDM3LCAweDI1MDEsIDB4MUQzOCwgMHgyNTAyLAorICAgIDB4MUQzOSwgMHgyNTAzLCAweDFEM0EsIDB4MjUwNCwgMHgxRDNCLCAweDI1MDUsIDB4MUQzQywgMHgyNTA2LCAweDFEM0QsCisgICAgMHgyNTA3LCAweDFEM0UsIDB4MjUwOCwgMHgxRDNGLCAweDI1MDksIDB4MUQ0MCwgMHgyNTBBLCAweDFENDEsIDB4MjUwQiwKKyAgICAweDFENDIsIDB4MjUwQywgMHgxRDQzLCAweDI1MEQsIDB4MUQ0NCwgMHgyNTBFLCAweDFENDUsIDB4MjUwRiwgMHgxRDQ2LAorICAgIDB4MjUxMCwgMHgxRDQ3LCAweDI1MTEsIDB4MUQ0OCwgMHgyNTEyLCAweDFENDksIDB4MjUxMywgMHgxRDRBLCAweDI1MTQsCisgICAgMHgxRDRCLCAweDI1MTUsIDB4MUQ0QywgMHgyNTE2LCAweDFENEQsIDB4MjUxNywgMHgxRDRFLCAweDI1MTgsIDB4MUQ0RiwKKyAgICAweDI1MTksIDB4MUQ1MCwgMHgyNTFBLCAweDFENTEsIDB4MjUxQiwgMHgxRDUyLCAweDI1MUMsIDB4MUQ1MywgMHgyNTFELAorICAgIDB4MUQ1NCwgMHgyNTFFLCAweDFENTUsIDB4MjUxRiwgMHgxRDU2LCAweDI1MjAsIDB4MUQ1NywgMHgyNTIxLCAweDFENTgsCisgICAgMHgyNTIyLCAweDFENTksIDB4MjUyMywgMHgxRDVBLCAweDI1MjQsIDB4MUQ1QiwgMHgyNTI1LCAweDFENUMsIDB4MjUyNiwKKyAgICAweDFENUQsIDB4MjUyNywgMHgxRDVFLCAweDI1MjgsIDB4MUQ1RiwgMHgyNTI5LCAweDFENjAsIDB4MjUyQSwgMHgxRDYxLAorICAgIDB4MjUyQiwgMHgxRDYyLCAweDI1MkMsIDB4MUQ2MywgMHgyNTJELCAweDFENjQsIDB4MjUyRSwgMHgxRDY1LCAweDI1MkYsCisgICAgMHgxRDY2LCAweDI1MzAsIDB4MUQ2NywgMHgyNTMxLCAweDFENjgsIDB4MjUzMiwgMHgxRDY5LCAweDI1MzMsIDB4MUQ2QSwKKyAgICAweDI1MzQsIDB4MUQ2QiwgMHgyNTM1LCAweDFENkMsIDB4MjUzNiwgMHgxRDZELCAweDI1MzcsIDB4MUQ2RSwgMHgyNTM4LAorICAgIDB4MUQ2RiwgMHgyNTM5LCAweDFENzAsIDB4MjUzQSwgMHgxRDcxLCAweDI1M0IsIDB4MUQ3MiwgMHgyNTNDLCAweDFENzMsCisgICAgMHgyNTNELCAweDFENzQsIDB4MjUzRSwgMHgxRDc1LCAweDI1M0YsIDB4MUQ3NiwgMHgyNTQwLCAweDFENzcsIDB4MjU0MSwKKyAgICAweDFENzgsIDB4MjU0MiwgMHgxRDc5LCAweDI1NDMsIDB4MUQ3QSwgMHgyNTQ0LCAweDFEN0IsIDB4MjU0NSwgMHgxRDdDLAorICAgIDB4MjU0NiwgMHgxRDdELCAweDI1NDcsIDB4MUQ3RSwgMHgyNTQ4LCAweDFEN0YsIDB4MjU0OSwgMHgxRDgwLCAweDI1NEEsCisgICAgMHgxRDgxLCAweDI1NEIsIDB4MUQ4MiwgMHgyNTUwLCAweDIwM0IsIDB4MjU1RSwgMHgyMDNDLCAweDI1NjEsIDB4MjAzRSwKKyAgICAweDI1NkEsIDB4MjAzRCwgMHgyNTZELCAweDIwMzcsIDB4MjU2RSwgMHgyMDM4LCAweDI1NkYsIDB4MjAzQSwgMHgyNTcwLAorICAgIDB4MjAzOSwgMHgyNTcxLCAweDIwNDUsIDB4MjU3MiwgMHgyMDQ2LCAweDI1NzMsIDB4MjA0NywgMHgyNTgxLCAweDIwMjYsCisgICAgMHgyNTgyLCAweDIwMjcsIDB4MjU4MywgMHgyMDI4LCAweDI1ODQsIDB4MjAyOSwgMHgyNTg1LCAweDIwMkEsIDB4MjU4NiwKKyAgICAweDIwMkIsIDB4MjU4NywgMHgyMDJDLCAweDI1ODgsIDB4MjAyRCwgMHgyNTg5LCAweDIwMzQsIDB4MjU4QSwgMHgyMDMzLAorICAgIDB4MjU4QiwgMHgyMDMyLCAweDI1OEMsIDB4MjAzMSwgMHgyNThELCAweDIwMzAsIDB4MjU4RSwgMHgyMDJGLCAweDI1OEYsCisgICAgMHgyMDJFLCAweDI1OTQsIDB4MjAzNSwgMHgyNTk1LCAweDIwMzYsIDB4MjVBMCwgMHgwMkQ5LCAweDI1QTEsIDB4MDJEOCwKKyAgICAweDI1QTIsIDB4MUY0RiwgMHgyNUFBLCAweDJGQ0YsIDB4MjVBQiwgMHgyRkNELCAweDI1QjIsIDB4MDJEQiwgMHgyNUIzLAorICAgIDB4MDJEQSwgMHgyNUI2LCAweDJGQTMsIDB4MjVCNywgMHgxRjRBLCAweDI1QkMsIDB4MDJERCwgMHgyNUJELCAweDAyREMsCisgICAgMHgyNUMwLCAweDJGQTIsIDB4MjVDMSwgMHgxRjQ5LCAweDI1QzYsIDB4MDJENywgMHgyNUM3LCAweDAyRDYsIDB4MjVDOSwKKyAgICAweDIwMTIsIDB4MjVDQiwgMHgwMkQzLCAweDI1Q0MsIDB4MjkwNiwgMHgyNUNFLCAweDAyRDUsIDB4MjVDRiwgMHgwMkQ0LAorICAgIDB4MjVFMiwgMHgyMDNGLCAweDI1RTMsIDB4MjA0MCwgMHgyNUU0LCAweDIwNDIsIDB4MjVFNSwgMHgyMDQxLCAweDI1RTYsCisgICAgMHgyRkRFLCAweDI1RUYsIDB4MDMwQiwgMHgyNjAwLCAweDIwMTcsIDB4MjYwMSwgMHgyMDE4LCAweDI2MDIsIDB4MjAxOSwKKyAgICAweDI2MDMsIDB4MjAxQSwgMHgyNjA1LCAweDAyRDIsIDB4MjYwNiwgMHgwMkQxLCAweDI2MEUsIDB4MUY3OCwgMHgyNjEyLAorICAgIDB4MkY5OSwgMHgyNjFDLCAweDIwMUMsIDB4MjYxRCwgMHgyMDFELCAweDI2MUUsIDB4MjAxQiwgMHgyNjFGLCAweDIwMUUsCisgICAgMHgyNjQwLCAweDAyQzIsIDB4MjY0MiwgMHgwMkMxLCAweDI2NjAsIDB4MjAxMywgMHgyNjYxLCAweDFGNTEsIDB4MjY2MiwKKyAgICAweDFGNTMsIDB4MjY2MywgMHgyMDE1LCAweDI2NjQsIDB4MUY1MiwgMHgyNjY1LCAweDIwMTQsIDB4MjY2NiwgMHgyMDE2LAorICAgIDB4MjY2NywgMHgxRjUwLCAweDI2NjgsIDB4MkY0MiwgMHgyNjY5LCAweDJGNDMsIDB4MjY2QSwgMHgwMzA3LCAweDI2NkMsCisgICAgMHgyRjQ0LCAweDI2NkQsIDB4MDMwNiwgMHgyNjZGLCAweDAzMDUsIDB4MjcwMiwgMHgyRjkwLCAweDI3MUEsIDB4MkZEMSwKKyAgICAweDI3NTYsIDB4MkZFMywgMHgyNzc2LCAweDIwNUUsIDB4Mjc3NywgMHgyMDVGLCAweDI3NzgsIDB4MjA2MCwgMHgyNzc5LAorICAgIDB4MjA2MSwgMHgyNzdBLCAweDIwNjIsIDB4Mjc3QiwgMHgyMDYzLCAweDI3N0MsIDB4MjA2NCwgMHgyNzdELCAweDIwNjUsCisgICAgMHgyNzdFLCAweDIwNjYsIDB4MjdBMSwgMHgyMDBFLCAweDJFODMsIDB4MzdFMSwgMHgyRTg1LCAweDM2MjAsIDB4MkU4NywKKyAgICAweDM3MTksIDB4MkU4OSwgMHgzODE0LCAweDJFOEIsIDB4MzcxRSwgMHgyRThDLCAweDM2MDksIDB4MkU4RCwgMHgzNjBBLAorICAgIDB4MkU4RSwgMHgxMDcxLCAweDJFOEYsIDB4Mzg4QywgMHgyRTkwLCAweDEyMjYsIDB4MkU5MiwgMHgwRUIyLCAweDJFOTMsCisgICAgMHgxMjgzLCAweDJFOTQsIDB4MTJBQiwgMHgyRTk1LCAweDNDMUYsIDB4MkU5NiwgMHgzOEMyLCAweDJFOTcsIDB4MzYxQywKKyAgICAweDJFOTgsIDB4MzhFMSwgMHgyRTk5LCAweDEzQzMsIDB4MkU5QiwgMHgxM0UxLCAweDJFOUYsIDB4MEUzQywgMHgyRUEwLAorICAgIDB4MEVCRCwgMHgyRUExLCAweDM5NjEsIDB4MkVBMiwgMHgzOTYyLCAweDJFQTMsIDB4Mzk5RCwgMHgyRUE0LCAweDNDMjYsCisgICAgMHgyRUE2LCAweDM3NEQsIDB4MkVBOCwgMHgzOUJDLCAweDJFQTksIDB4MzVBMSwgMHgyRUFBLCAweDM2QUIsIDB4MkVBQiwKKyAgICAweDNBOTcsIDB4MkVBQywgMHgwOEQ0LCAweDJFQUQsIDB4M0EzOSwgMHgyRUFFLCAweDM2NjIsIDB4MkVCMSwgMHgzQTk4LAorICAgIDB4MkVCMiwgMHgzQTk3LCAweDJFQjMsIDB4Mzc2RCwgMHgyRUI3LCAweDM2RkUsIDB4MkVCOSwgMHgzNzEzLCAweDJFQkMsCisgICAgMHgzNUIzLCAweDJFQkQsIDB4MzU0RSwgMHgyRUJFLCAweDM3NzUsIDB4MkVCRiwgMHgzNzc2LCAweDJFQzAsIDB4Mzc3NywKKyAgICAweDJFQzEsIDB4MDc4QiwgMHgyRUMyLCAweDNCMEEsIDB4MkVDMywgMHgzNjJFLCAweDJFQzQsIDB4MEE2MiwgMHgyRUM2LAorICAgIDB4MzU3MiwgMHgyRUNBLCAweDM2NEEsIDB4MkVDQywgMHgzQzJCLCAweDJFQ0QsIDB4M0I1MCwgMHgyRUNGLCAweDNCOUUsCisgICAgMHgyRUQxLCAweDBCRDUsIDB4MkVEMiwgMHgzQjk3LCAweDJFRDYsIDB4M0I5RSwgMHgyRUQ3LCAweDM1NEQsIDB4MkVEOCwKKyAgICAweDBBNjgsIDB4MkVERCwgMHgzNjE3LCAweDJFREUsIDB4MzYxOSwgMHgyRURGLCAweDM2MTgsIDB4MkVFNCwgMHgwNjRFLAorICAgIDB4MkVFOCwgMHgwRDM0LCAweDJFRTksIDB4MDUyQiwgMHgyRUVCLCAweDBBNkEsIDB4MkVFRCwgMHgwOEMzLCAweDJFRUYsCisgICAgMHgwRjdELCAweDJFRjIsIDB4MDY0RiwgMHgyRjAwLCAweDA0QjAsIDB4MkYwMSwgMHgyMEIzLCAweDJGMDIsIDB4MEZGRiwKKyAgICAweDJGMDMsIDB4MTAwMSwgMHgyRjA0LCAweDA1MzUsIDB4MkYwNSwgMHgxMDA2LCAweDJGMDYsIDB4MENDQiwgMHgyRjA3LAorICAgIDB4MTAwRSwgMHgyRjA4LCAweDBBMTMsIDB4MkYwOSwgMHgxMDcwLCAweDJGMEEsIDB4MENENiwgMHgyRjBCLCAweDBENDAsCisgICAgMHgyRjBDLCAweDEwN0IsIDB4MkYwRCwgMHgxMDgzLCAweDJGMEUsIDB4MTA4OSwgMHgyRjBGLCAweDEwOTMsIDB4MkYxMCwKKyAgICAweDEwOTgsIDB4MkYxMSwgMHgwQzVCLCAweDJGMTIsIDB4MEY5NywgMHgyRjEzLCAweDEwQzYsIDB4MkYxNCwgMHgxMENELAorICAgIDB4MkYxNSwgMHgxMENFLCAweDJGMTYsIDB4MTBEMywgMHgyRjE3LCAweDA5NDcsIDB4MkYxOCwgMHgwRTdDLCAweDJGMTksCisgICAgMHgxMERDLCAweDJGMUEsIDB4MTBFMSwgMHgyRjFCLCAweDEwRTgsIDB4MkYxQywgMHgwRUEyLCAweDJGMUQsIDB4MDdCMSwKKyAgICAweDJGMUUsIDB4MTE2QiwgMHgyRjFGLCAweDBDNTQsIDB4MkYyMCwgMHgwODlDLCAweDJGMjEsIDB4MTFCQSwgMHgyRjIyLAorICAgIDB4MTFCQiwgMHgyRjIzLCAweDBGMjYsIDB4MkYyNCwgMHgwQjQ3LCAweDJGMjUsIDB4MDk4MSwgMHgyRjI2LCAweDA4QTAsCisgICAgMHgyRjI3LCAweDEyMEUsIDB4MkYyOCwgMHgwQTQ3LCAweDJGMjksIDB4MDk5NiwgMHgyRjJBLCAweDEyMjYsIDB4MkYyQiwKKyAgICAweDEyMjgsIDB4MkYyQywgMHgxMjMyLCAweDJGMkQsIDB4MDg4MSwgMHgyRjJFLCAweDEyNkMsIDB4MkYyRiwgMHgwN0JCLAorICAgIDB4MkYzMCwgMHgwNzdFLCAweDJGMzEsIDB4MDZDQSwgMHgyRjMyLCAweDA1RUYsIDB4MkYzMywgMHgxMjgzLCAweDJGMzQsCisgICAgMHgxMjg1LCAweDJGMzUsIDB4MTI5OSwgMHgyRjM2LCAweDEyOUIsIDB4MkYzNywgMHgxMkEwLCAweDJGMzgsIDB4MDY3NywKKyAgICAweDJGMzksIDB4MzhCOSwgMHgyRjNBLCAweDEyQUYsIDB4MkYzQiwgMHgxMkIxLCAweDJGM0MsIDB4MDlGQSwgMHgyRjNELAorICAgIDB4MTM0MiwgMHgyRjNFLCAweDA3ODEsIDB4MkYzRiwgMHgwOTE2LCAweDJGNDAsIDB4MDhBNywgMHgyRjQxLCAweDEzQzIsCisgICAgMHgyRjQyLCAweDBFMDgsIDB4MkY0MywgMHgwQzQ3LCAweDJGNDQsIDB4MDZDQywgMHgyRjQ1LCAweDBFNEQsIDB4MkY0NiwKKyAgICAweDEzRTAsIDB4MkY0NywgMHgwQ0Q0LCAweDJGNDgsIDB4MTQwQywgMHgyRjQ5LCAweDA3NDQsIDB4MkY0QSwgMHgwRUU2LAorICAgIDB4MkY0QiwgMHgwNzNELCAweDJGNEMsIDB4MDhBRCwgMHgyRjRELCAweDE0RTUsIDB4MkY0RSwgMHgxNEY0LCAweDJGNEYsCisgICAgMHgxNEY4LCAweDJGNTAsIDB4MEQ3QSwgMHgyRjUxLCAweDBFREYsIDB4MkY1MiwgMHgwOEFGLCAweDJGNTMsIDB4MTUwMiwKKyAgICAweDJGNTQsIDB4MEEyQiwgMHgyRjU1LCAweDA1NTAsIDB4MkY1NiwgMHgwQkZBLCAweDJGNTcsIDB4MERENSwgMHgyRjU4LAorICAgIDB4MTVFNCwgMHgyRjU5LCAweDE1RTYsIDB4MkY1QSwgMHgwRTIyLCAweDJGNUIsIDB4MDU2NywgMHgyRjVDLCAweDA2ODcsCisgICAgMHgyRjVELCAweDA3NTgsIDB4MkY1RSwgMHgwNzcwLCAweDJGNUYsIDB4MDZDNCwgMHgyRjYwLCAweDA0REQsIDB4MkY2MSwKKyAgICAweDA1RTAsIDB4MkY2MiwgMHgwNjAxLCAweDJGNjMsIDB4MEE1QywgMHgyRjY0LCAweDBGM0IsIDB4MkY2NSwgMHgwQzNFLAorICAgIDB4MkY2NiwgMHgwRDk3LCAweDJGNjcsIDB4M0EwMCwgMHgyRjY4LCAweDE2OTcsIDB4MkY2OSwgMHgwRDI4LCAweDJGNkEsCisgICAgMHgwRDdELCAweDJGNkIsIDB4MDg3QywgMHgyRjZDLCAweDBFRTgsIDB4MkY2RCwgMHgwRUMzLCAweDJGNkUsIDB4MEVGQywKKyAgICAweDJGNkYsIDB4MEE3NCwgMHgyRjcwLCAweDA4RDQsIDB4MkY3MSwgMHgzQTQxLCAweDJGNzIsIDB4MDU1MywgMHgyRjczLAorICAgIDB4MDc0MCwgMHgyRjc0LCAweDBGNzEsIDB4MkY3NSwgMHgwQjlCLCAweDJGNzYsIDB4MEUxNiwgMHgyRjc3LCAweDA4QjMsCisgICAgMHgyRjc4LCAweDA2MDgsIDB4MkY3OSwgMHgxODEzLCAweDJGN0EsIDB4MEYzRCwgMHgyRjdCLCAweDA0Q0IsIDB4MkY3QywKKyAgICAweDBGREQsIDB4MkY3RCwgMHgwOEQ1LCAweDJGN0UsIDB4MTgzRCwgMHgyRjdGLCAweDA4RDYsIDB4MkY4MCwgMHgxODUzLAorICAgIDB4MkY4MSwgMHgwQ0QxLCAweDJGODIsIDB4MEEwOSwgMHgyRjgzLCAweDA4RDcsIDB4MkY4NCwgMHgwOEI4LCAweDJGODUsCisgICAgMHgwNEQzLCAweDJGODYsIDB4MEE4OSwgMHgyRjg3LCAweDBBQTYsIDB4MkY4OCwgMHgwOTM4LCAweDJGODksIDB4MDgyMSwKKyAgICAweDJGOEEsIDB4MDlFRCwgMHgyRjhCLCAweDE4QjIsIDB4MkY4QywgMHgxOTRGLCAweDJGOEQsIDB4MEJBQywgMHgyRjhFLAorICAgIDB4MDc0MiwgMHgyRjhGLCAweDA3RTYsIDB4MkY5MCwgMHgwNEE1LCAweDJGOTEsIDB4MTlFQiwgMHgyRjkyLCAweDA3NUYsCisgICAgMHgyRjkzLCAweDA1QUYsIDB4MkY5NCwgMHgwNzc0LCAweDJGOTUsIDB4MEI2OSwgMHgyRjk2LCAweDBDN0UsIDB4MkY5NywKKyAgICAweDFBNTYsIDB4MkY5OCwgMHgxQTU5LCAweDJGOTksIDB4MDU4QiwgMHgyRjlBLCAweDBBN0EsIDB4MkY5QiwgMHgwQUY4LAorICAgIDB4MkY5QywgMHgwQjBELCAweDJGOUQsIDB4MEEwRSwgMHgyRjlFLCAweDA5MDIsIDB4MkY5RiwgMHgwQTBGLCAweDJGQTAsCisgICAgMHgwQjYyLCAweDJGQTEsIDB4M0I0RiwgMHgyRkEyLCAweDBGMjIsIDB4MkZBMywgMHgwQ0FCLCAweDJGQTQsIDB4MEQ2NCwKKyAgICAweDJGQTUsIDB4MEY2QywgMHgyRkE2LCAweDA2REEsIDB4MkZBNywgMHgwQkQ1LCAweDJGQTgsIDB4MEVGMywgMHgyRkE5LAorICAgIDB4MERERSwgMHgyRkFBLCAweDFCQzksIDB4MkZBQiwgMHgxQkNCLCAweDJGQUMsIDB4MDRDRCwgMHgyRkFELCAweDIxRjcsCisgICAgMHgyRkFFLCAweDBEODcsIDB4MkZBRiwgMHgwRUQ4LCAweDJGQjAsIDB4MDVCNSwgMHgyRkIxLCAweDFDMDMsIDB4MkZCMiwKKyAgICAweDFDMDUsIDB4MkZCMywgMHgwNTNCLCAweDJGQjQsIDB4MEUxNywgMHgyRkI1LCAweDBERTksIDB4MkZCNiwgMHgwRDg4LAorICAgIDB4MkZCNywgMHgwOUVGLCAweDJGQjgsIDB4MDkxRiwgMHgyRkI5LCAweDA3RjMsIDB4MkZCQSwgMHgwRDA1LCAweDJGQkIsCisgICAgMHgwODBFLCAweDJGQkMsIDB4MDdGNCwgMHgyRkJELCAweDFDNkMsIDB4MkZCRSwgMHgxQzdELCAweDJGQkYsIDB4MUM4MywKKyAgICAweDJGQzAsIDB4MUM4NCwgMHgyRkMxLCAweDA2NEUsIDB4MkZDMiwgMHgwNjk1LCAweDJGQzMsIDB4MEJENywgMHgyRkM0LAorICAgIDB4MUNGNiwgMHgyRkM1LCAweDA4REIsIDB4MkZDNiwgMHgxRDAxLCAweDJGQzcsIDB4MEU5MSwgMHgyRkM4LCAweDM0MEIsCisgICAgMHgyRkM5LCAweDA2NkEsIDB4MkZDQSwgMHgwODA3LCAweDJGQ0IsIDB4MUQxNiwgMHgyRkNDLCAweDFEMTksIDB4MkZDRCwKKyAgICAweDBDMUUsIDB4MkZDRSwgMHgwNzkxLCAweDJGQ0YsIDB4MEFDRiwgMHgyRkQwLCAweDBEOTMsIDB4MkZEMSwgMHgxRDIxLAorICAgIDB4MkZEMiwgMHgxRDIyLCAweDJGRDMsIDB4MEY3RSwgMHgyRkQ0LCAweDFEMzAsIDB4MkZENSwgMHgxRDMxLCAweDMwMDAsCisgICAgMHgwMjc5LCAweDMwMDEsIDB4MDI3QSwgMHgzMDAyLCAweDAyN0IsIDB4MzAwMywgMHgwMjhGLCAweDMwMDQsIDB4MjA3NCwKKyAgICAweDMwMDUsIDB4MDI5MSwgMHgzMDA2LCAweDAyOTIsIDB4MzAwNywgMHgwMjkzLCAweDMwMDgsIDB4MDJBQSwgMHgzMDA5LAorICAgIDB4MDJBQiwgMHgzMDBBLCAweDAyQUMsIDB4MzAwQiwgMHgwMkFELCAweDMwMEMsIDB4MDJBRSwgMHgzMDBELCAweDAyQUYsCisgICAgMHgzMDBFLCAweDAyQjAsIDB4MzAwRiwgMHgwMkIxLCAweDMwMTAsIDB4MDJCMiwgMHgzMDExLCAweDAyQjMsIDB4MzAxMiwKKyAgICAweDAyREYsIDB4MzAxMywgMHgwMkU0LCAweDMwMTQsIDB4MDJBNCwgMHgzMDE1LCAweDAyQTUsIDB4MzAxQywgMHgwMjk5LAorICAgIDB4MzAxRCwgMHgxREI4LCAweDMwMUYsIDB4MURCOSwgMHgzMDIwLCAweDFGN0EsIDB4MzAzMCwgMHgyRkJBLCAweDMwMzMsCisgICAgMHgyRjRDLCAweDMwMzQsIDB4MkY0RCwgMHgzMDM1LCAweDJGNEUsIDB4MzAzNiwgMHgxRjc5LCAweDMwNDEsIDB4MDM0QSwKKyAgICAweDMwNDIsIDB4MDM0QiwgMHgzMDQzLCAweDAzNEMsIDB4MzA0NCwgMHgwMzRELCAweDMwNDUsIDB4MDM0RSwgMHgzMDQ2LAorICAgIDB4MDM0RiwgMHgzMDQ3LCAweDAzNTAsIDB4MzA0OCwgMHgwMzUxLCAweDMwNDksIDB4MDM1MiwgMHgzMDRBLCAweDAzNTMsCisgICAgMHgzMDRCLCAweDAzNTQsIDB4MzA0QywgMHgwMzU1LCAweDMwNEQsIDB4MDM1NiwgMHgzMDRFLCAweDAzNTcsIDB4MzA0RiwKKyAgICAweDAzNTgsIDB4MzA1MCwgMHgwMzU5LCAweDMwNTEsIDB4MDM1QSwgMHgzMDUyLCAweDAzNUIsIDB4MzA1MywgMHgwMzVDLAorICAgIDB4MzA1NCwgMHgwMzVELCAweDMwNTUsIDB4MDM1RSwgMHgzMDU2LCAweDAzNUYsIDB4MzA1NywgMHgwMzYwLCAweDMwNTgsCisgICAgMHgwMzYxLCAweDMwNTksIDB4MDM2MiwgMHgzMDVBLCAweDAzNjMsIDB4MzA1QiwgMHgwMzY0LCAweDMwNUMsIDB4MDM2NSwKKyAgICAweDMwNUQsIDB4MDM2NiwgMHgzMDVFLCAweDAzNjcsIDB4MzA1RiwgMHgwMzY4LCAweDMwNjAsIDB4MDM2OSwgMHgzMDYxLAorICAgIDB4MDM2QSwgMHgzMDYyLCAweDAzNkIsIDB4MzA2MywgMHgwMzZDLCAweDMwNjQsIDB4MDM2RCwgMHgzMDY1LCAweDAzNkUsCisgICAgMHgzMDY2LCAweDAzNkYsIDB4MzA2NywgMHgwMzcwLCAweDMwNjgsIDB4MDM3MSwgMHgzMDY5LCAweDAzNzIsIDB4MzA2QSwKKyAgICAweDAzNzMsIDB4MzA2QiwgMHgwMzc0LCAweDMwNkMsIDB4MDM3NSwgMHgzMDZELCAweDAzNzYsIDB4MzA2RSwgMHgwMzc3LAorICAgIDB4MzA2RiwgMHgwMzc4LCAweDMwNzAsIDB4MDM3OSwgMHgzMDcxLCAweDAzN0EsIDB4MzA3MiwgMHgwMzdCLCAweDMwNzMsCisgICAgMHgwMzdDLCAweDMwNzQsIDB4MDM3RCwgMHgzMDc1LCAweDAzN0UsIDB4MzA3NiwgMHgwMzdGLCAweDMwNzcsIDB4MDM4MCwKKyAgICAweDMwNzgsIDB4MDM4MSwgMHgzMDc5LCAweDAzODIsIDB4MzA3QSwgMHgwMzgzLCAweDMwN0IsIDB4MDM4NCwgMHgzMDdDLAorICAgIDB4MDM4NSwgMHgzMDdELCAweDAzODYsIDB4MzA3RSwgMHgwMzg3LCAweDMwN0YsIDB4MDM4OCwgMHgzMDgwLCAweDAzODksCisgICAgMHgzMDgxLCAweDAzOEEsIDB4MzA4MiwgMHgwMzhCLCAweDMwODMsIDB4MDM4QywgMHgzMDg0LCAweDAzOEQsIDB4MzA4NSwKKyAgICAweDAzOEUsIDB4MzA4NiwgMHgwMzhGLCAweDMwODcsIDB4MDM5MCwgMHgzMDg4LCAweDAzOTEsIDB4MzA4OSwgMHgwMzkyLAorICAgIDB4MzA4QSwgMHgwMzkzLCAweDMwOEIsIDB4MDM5NCwgMHgzMDhDLCAweDAzOTUsIDB4MzA4RCwgMHgwMzk2LCAweDMwOEUsCisgICAgMHgwMzk3LCAweDMwOEYsIDB4MDM5OCwgMHgzMDkwLCAweDAzOTksIDB4MzA5MSwgMHgwMzlBLCAweDMwOTIsIDB4MDM5QiwKKyAgICAweDMwOTMsIDB4MDM5QywgMHgzMDk0LCAweDFGMTYsIDB4MzA5QiwgMHgwMjgzLCAweDMwOUMsIDB4MDI4NCwgMHgzMDlELAorICAgIDB4MDI4RCwgMHgzMDlFLCAweDAyOEUsIDB4MzBBMSwgMHgwMzlELCAweDMwQTIsIDB4MDM5RSwgMHgzMEEzLCAweDAzOUYsCisgICAgMHgzMEE0LCAweDAzQTAsIDB4MzBBNSwgMHgwM0ExLCAweDMwQTYsIDB4MDNBMiwgMHgzMEE3LCAweDAzQTMsIDB4MzBBOCwKKyAgICAweDAzQTQsIDB4MzBBOSwgMHgwM0E1LCAweDMwQUEsIDB4MDNBNiwgMHgzMEFCLCAweDAzQTcsIDB4MzBBQywgMHgwM0E4LAorICAgIDB4MzBBRCwgMHgwM0E5LCAweDMwQUUsIDB4MDNBQSwgMHgzMEFGLCAweDAzQUIsIDB4MzBCMCwgMHgwM0FDLCAweDMwQjEsCisgICAgMHgwM0FELCAweDMwQjIsIDB4MDNBRSwgMHgzMEIzLCAweDAzQUYsIDB4MzBCNCwgMHgwM0IwLCAweDMwQjUsIDB4MDNCMSwKKyAgICAweDMwQjYsIDB4MDNCMiwgMHgzMEI3LCAweDAzQjMsIDB4MzBCOCwgMHgwM0I0LCAweDMwQjksIDB4MDNCNSwgMHgzMEJBLAorICAgIDB4MDNCNiwgMHgzMEJCLCAweDAzQjcsIDB4MzBCQywgMHgwM0I4LCAweDMwQkQsIDB4MDNCOSwgMHgzMEJFLCAweDAzQkEsCisgICAgMHgzMEJGLCAweDAzQkIsIDB4MzBDMCwgMHgwM0JDLCAweDMwQzEsIDB4MDNCRCwgMHgzMEMyLCAweDAzQkUsIDB4MzBDMywKKyAgICAweDAzQkYsIDB4MzBDNCwgMHgwM0MwLCAweDMwQzUsIDB4MDNDMSwgMHgzMEM2LCAweDAzQzIsIDB4MzBDNywgMHgwM0MzLAorICAgIDB4MzBDOCwgMHgwM0M0LCAweDMwQzksIDB4MDNDNSwgMHgzMENBLCAweDAzQzYsIDB4MzBDQiwgMHgwM0M3LCAweDMwQ0MsCisgICAgMHgwM0M4LCAweDMwQ0QsIDB4MDNDOSwgMHgzMENFLCAweDAzQ0EsIDB4MzBDRiwgMHgwM0NCLCAweDMwRDAsIDB4MDNDQywKKyAgICAweDMwRDEsIDB4MDNDRCwgMHgzMEQyLCAweDAzQ0UsIDB4MzBEMywgMHgwM0NGLCAweDMwRDQsIDB4MDNEMCwgMHgzMEQ1LAorICAgIDB4MDNEMSwgMHgzMEQ2LCAweDAzRDIsIDB4MzBENywgMHgwM0QzLCAweDMwRDgsIDB4MDNENCwgMHgzMEQ5LCAweDAzRDUsCisgICAgMHgzMERBLCAweDAzRDYsIDB4MzBEQiwgMHgwM0Q3LCAweDMwREMsIDB4MDNEOCwgMHgzMERELCAweDAzRDksIDB4MzBERSwKKyAgICAweDAzREEsIDB4MzBERiwgMHgwM0RCLCAweDMwRTAsIDB4MDNEQywgMHgzMEUxLCAweDAzREQsIDB4MzBFMiwgMHgwM0RFLAorICAgIDB4MzBFMywgMHgwM0RGLCAweDMwRTQsIDB4MDNFMCwgMHgzMEU1LCAweDAzRTEsIDB4MzBFNiwgMHgwM0UyLCAweDMwRTcsCisgICAgMHgwM0UzLCAweDMwRTgsIDB4MDNFNCwgMHgzMEU5LCAweDAzRTUsIDB4MzBFQSwgMHgwM0U2LCAweDMwRUIsIDB4MDNFNywKKyAgICAweDMwRUMsIDB4MDNFOCwgMHgzMEVELCAweDAzRTksIDB4MzBFRSwgMHgwM0VBLCAweDMwRUYsIDB4MDNFQiwgMHgzMEYwLAorICAgIDB4MDNFQywgMHgzMEYxLCAweDAzRUQsIDB4MzBGMiwgMHgwM0VFLCAweDMwRjMsIDB4MDNFRiwgMHgzMEY0LCAweDAzRjAsCisgICAgMHgzMEY1LCAweDAzRjEsIDB4MzBGNiwgMHgwM0YyLCAweDMwRjcsIDB4MjA3OSwgMHgzMEY4LCAweDIwN0EsIDB4MzBGOSwKKyAgICAweDIwN0IsIDB4MzBGQSwgMHgyMDdDLCAweDMwRkIsIDB4MDI3RSwgMHgzMEZDLCAweDAyOTQsIDB4MzBGRCwgMHgwMjhCLAorICAgIDB4MzBGRSwgMHgwMjhDLCAweDMyMjAsIDB4Mjc4RSwgMHgzMjIxLCAweDI3OEYsIDB4MzIyMiwgMHgyNzkwLCAweDMyMjMsCisgICAgMHgyNzkxLCAweDMyMjQsIDB4Mjc5MiwgMHgzMjI1LCAweDI3OTMsIDB4MzIyNiwgMHgyNzk0LCAweDMyMjcsIDB4Mjc5NSwKKyAgICAweDMyMjgsIDB4Mjc5NiwgMHgzMjI5LCAweDI3OTcsIDB4MzIyQSwgMHgyMDA2LCAweDMyMkIsIDB4MjAwNywgMHgzMjJDLAorICAgIDB4MjAwOCwgMHgzMjJELCAweDIwMDksIDB4MzIyRSwgMHgyMDBBLCAweDMyMkYsIDB4MjAwQiwgMHgzMjMwLCAweDIwMDUsCisgICAgMHgzMjMxLCAweDFEQzIsIDB4MzIzMiwgMHgxREMzLCAweDMyMzMsIDB4MUZDRiwgMHgzMjM0LCAweDFGQ0QsIDB4MzIzNSwKKyAgICAweDFGRDQsIDB4MzIzNiwgMHgxRkQzLCAweDMyMzcsIDB4MjAwQywgMHgzMjM4LCAweDFGQ0UsIDB4MzIzOSwgMHgxREM0LAorICAgIDB4MzIzQSwgMHgxRkQ3LCAweDMyM0IsIDB4MUZENSwgMHgzMjNDLCAweDFGRDAsIDB4MzIzRCwgMHgxRkNCLCAweDMyM0UsCisgICAgMHgxRkQyLCAweDMyM0YsIDB4MUZDQywgMHgzMjQwLCAweDFGRDYsIDB4MzI0MSwgMHgyMDBELCAweDMyNDIsIDB4MUZEMSwKKyAgICAweDMyNDMsIDB4MUZDQSwgMHgzMjgwLCAweDI4REQsIDB4MzI4MSwgMHgyOERFLCAweDMyODIsIDB4MjhERiwgMHgzMjgzLAorICAgIDB4MjhFMCwgMHgzMjg0LCAweDI4RTEsIDB4MzI4NSwgMHgyOEUyLCAweDMyODYsIDB4MjhFMywgMHgzMjg3LCAweDI4RTQsCisgICAgMHgzMjg4LCAweDI4RTUsIDB4MzI4OSwgMHgyOEU2LCAweDMyOEEsIDB4MjhFOCwgMHgzMjhCLCAweDI4RTksIDB4MzI4QywKKyAgICAweDI4RUEsIDB4MzI4RCwgMHgyOEVCLCAweDMyOEUsIDB4MjhFQywgMHgzMjhGLCAweDI4RUQsIDB4MzI5MCwgMHgyOEU3LAorICAgIDB4MzI5MSwgMHgxRkUxLCAweDMyOTIsIDB4MUZFMCwgMHgzMjkzLCAweDFGRTIsIDB4MzI5NCwgMHgxRkRDLCAweDMyOTUsCisgICAgMHgyOEZGLCAweDMyOTYsIDB4MUZFNSwgMHgzMjk3LCAweDI4RkMsIDB4MzI5OCwgMHgxRkRFLCAweDMyOTksIDB4MjAxRiwKKyAgICAweDMyOUEsIDB4MjhGOSwgMHgzMjlCLCAweDI4RjgsIDB4MzI5QywgMHgyOEZFLCAweDMyOUQsIDB4MjA3RiwgMHgzMjlFLAorICAgIDB4MUZGRiwgMHgzMjlGLCAweDI4RUYsIDB4MzJBMCwgMHgyOEY2LCAweDMyQTEsIDB4MjhGNywgMHgzMkEyLCAweDI4RkIsCisgICAgMHgzMkEzLCAweDI4RkEsIDB4MzJBNCwgMHgxREJELCAweDMyQTUsIDB4MURCRSwgMHgzMkE2LCAweDFEQkYsIDB4MzJBNywKKyAgICAweDFEQzAsIDB4MzJBOCwgMHgxREMxLCAweDMyQTksIDB4MUZEQSwgMHgzMkFBLCAweDFGREQsIDB4MzJBQiwgMHgxRkRGLAorICAgIDB4MzJBQywgMHgxRkUzLCAweDMyQUQsIDB4MUZEOSwgMHgzMkFFLCAweDFGRTQsIDB4MzJBRiwgMHgxRkRCLCAweDMyQjAsCisgICAgMHgxRkQ4LCAweDMyRDAsIDB4MjhBRCwgMHgzMkQxLCAweDI4QUUsIDB4MzJEMiwgMHgyOEFGLCAweDMyRDMsIDB4MjhCMCwKKyAgICAweDMyRDQsIDB4MjhCMSwgMHgzMkQ1LCAweDI4QjIsIDB4MzJENiwgMHgyOEIzLCAweDMyRDcsIDB4MjhCNCwgMHgzMkQ4LAorICAgIDB4MjhCNSwgMHgzMkQ5LCAweDI4QjYsIDB4MzJEQSwgMHgyOEI3LCAweDMyREIsIDB4MjhCOCwgMHgzMkRDLCAweDI4QjksCisgICAgMHgzMkRELCAweDI4QkEsIDB4MzJERSwgMHgyOEJCLCAweDMyREYsIDB4MjhCQywgMHgzMkUwLCAweDI4QkQsIDB4MzJFMSwKKyAgICAweDI4QkUsIDB4MzJFMiwgMHgyOEJGLCAweDMyRTMsIDB4MjhDMCwgMHgzMkU0LCAweDI4QzEsIDB4MzJFNSwgMHgyOEMyLAorICAgIDB4MzJFNiwgMHgyOEMzLCAweDMyRTcsIDB4MjhDNCwgMHgzMkU4LCAweDI4QzUsIDB4MzJFOSwgMHgyOEM2LCAweDMyRUEsCisgICAgMHgyOEM3LCAweDMyRUIsIDB4MjhDOCwgMHgzMkVDLCAweDI4QzksIDB4MzJFRCwgMHgyOENBLCAweDMyRUUsIDB4MjhDQiwKKyAgICAweDMyRUYsIDB4MjhDQywgMHgzMkYwLCAweDI4Q0QsIDB4MzJGMSwgMHgyOENFLCAweDMyRjIsIDB4MjhDRiwgMHgzMkYzLAorICAgIDB4MjhEMCwgMHgzMkY0LCAweDI4RDEsIDB4MzJGNSwgMHgyOEQyLCAweDMyRjYsIDB4MjhEMywgMHgzMkY3LCAweDI4RDQsCisgICAgMHgzMkY4LCAweDI4RDUsIDB4MzJGOSwgMHgyOEQ2LCAweDMyRkEsIDB4MjhENywgMHgzMkZCLCAweDI4RDgsIDB4MzJGQywKKyAgICAweDI4RDksIDB4MzJGRCwgMHgyOERBLCAweDMyRkUsIDB4MjhEQiwgMHgzMzAwLCAweDFGNzAsIDB4MzMwMSwgMHgyRTYyLAorICAgIDB4MzMwMiwgMHgyRTYzLCAweDMzMDMsIDB4MUY2QSwgMHgzMzA0LCAweDJFNjQsIDB4MzMwNSwgMHgxRkY3LCAweDMzMDYsCisgICAgMHgyRTY1LCAweDMzMDcsIDB4MkU2OSwgMHgzMzA4LCAweDJFNjcsIDB4MzMwOSwgMHgyRTZDLCAweDMzMEEsIDB4MkU2QSwKKyAgICAweDMzMEIsIDB4MkU2RSwgMHgzMzBDLCAweDJFNzAsIDB4MzMwRCwgMHgxREFCLCAweDMzMEUsIDB4MkU3MSwgMHgzMzBGLAorICAgIDB4MkU3MiwgMHgzMzEwLCAweDJFNzMsIDB4MzMxMSwgMHgyRTc0LCAweDMzMTIsIDB4MkU3NSwgMHgzMzEzLCAweDJFNzYsCisgICAgMHgzMzE0LCAweDFEQTIsIDB4MzMxNSwgMHgxRjY5LCAweDMzMTYsIDB4MUY2NywgMHgzMzE3LCAweDJFNzgsIDB4MzMxOCwKKyAgICAweDFGNjgsIDB4MzMxOSwgMHgyRTdBLCAweDMzMUEsIDB4MkU3QywgMHgzMzFCLCAweDJFN0QsIDB4MzMxQywgMHgyRTdFLAorICAgIDB4MzMxRCwgMHgyRTdGLCAweDMzMUUsIDB4MUY3MywgMHgzMzFGLCAweDJFODAsIDB4MzMyMCwgMHgyRTgxLCAweDMzMjEsCisgICAgMHgyRTgyLCAweDMzMjIsIDB4MUY2NiwgMHgzMzIzLCAweDFGNkIsIDB4MzMyNCwgMHgyRTgzLCAweDMzMjUsIDB4MkU4NSwKKyAgICAweDMzMjYsIDB4MURBQywgMHgzMzI3LCAweDFEQTYsIDB4MzMyOCwgMHgyRTg4LCAweDMzMjksIDB4MkU4OSwgMHgzMzJBLAorICAgIDB4MUY3NCwgMHgzMzJCLCAweDFEQUUsIDB4MzMyRCwgMHgyRThCLCAweDMzMkUsIDB4MkU4RSwgMHgzMzJGLCAweDJFOEYsCisgICAgMHgzMzMwLCAweDJFOTAsIDB4MzMzMSwgMHgxRjcxLCAweDMzMzIsIDB4MkU5MSwgMHgzMzMzLCAweDIwODcsIDB4MzMzNCwKKyAgICAweDJFOTQsIDB4MzMzNSwgMHgyRTk1LCAweDMzMzYsIDB4MURBOCwgMHgzMzM3LCAweDJFOUEsIDB4MzMzOCwgMHgyRTlDLAorICAgIDB4MzMzOSwgMHgxRjZFLCAweDMzM0EsIDB4MkU5RCwgMHgzMzNCLCAweDFGNkYsIDB4MzMzQywgMHgyRTk2LCAweDMzM0QsCisgICAgMHgyRTlFLCAweDMzM0UsIDB4MkVBMCwgMHgzMzNGLCAweDJFQTEsIDB4MzM0MCwgMHgyRUEyLCAweDMzNDEsIDB4MkU5RiwKKyAgICAweDMzNDIsIDB4MUY2RCwgMHgzMzQzLCAweDJFQTMsIDB4MzM0NCwgMHgyRUE0LCAweDMzNDUsIDB4MkVBNSwgMHgzMzQ2LAorICAgIDB4MkVBNiwgMHgzMzQ3LCAweDFGNzIsIDB4MzM0OCwgMHgyRUE3LCAweDMzNDksIDB4MURBMSwgMHgzMzRBLCAweDFEQUYsCisgICAgMHgzMzRCLCAweDJFQTgsIDB4MzM0QywgMHgyRUE5LCAweDMzNEQsIDB4MURBNCwgMHgzMzRFLCAweDIwODgsIDB4MzM0RiwKKyAgICAweDJFQUEsIDB4MzM1MCwgMHgyRUFCLCAweDMzNTEsIDB4MURBOSwgMHgzMzUyLCAweDJFQUUsIDB4MzM1MywgMHgyRUIyLAorICAgIDB4MzM1NCwgMHgyRUFGLCAweDMzNTUsIDB4MkVCMywgMHgzMzU2LCAweDJFQjQsIDB4MzM1NywgMHgxRjZDLCAweDMzNzEsCisgICAgMHgyRTU1LCAweDMzN0IsIDB4MjA4MywgMHgzMzdDLCAweDFEQzcsIDB4MzM3RCwgMHgxREM2LCAweDMzN0UsIDB4MURDNSwKKyAgICAweDMzN0YsIDB4MUY3NiwgMHgzMzg1LCAweDFGNUYsIDB4MzM4NiwgMHgxRjYwLCAweDMzODcsIDB4MUY2MSwgMHgzMzg4LAorICAgIDB4MjAwMCwgMHgzMzg5LCAweDIwMDEsIDB4MzM4RCwgMHgyRTU4LCAweDMzOEUsIDB4MURCNCwgMHgzMzhGLCAweDFEQjUsCisgICAgMHgzMzkwLCAweDFGNjMsIDB4MzM5NiwgMHgxRjY1LCAweDMzOTcsIDB4MUY1OCwgMHgzMzk4LCAweDFGNUEsIDB4MzM5QiwKKyAgICAweDJFNTksIDB4MzM5QywgMHgxREIxLCAweDMzOUQsIDB4MURCMiwgMHgzMzlFLCAweDFEQjMsIDB4MzM5RiwgMHgxRkZBLAorICAgIDB4MzNBMCwgMHgxRjU0LCAweDMzQTEsIDB4MURCNywgMHgzM0EyLCAweDFGNTUsIDB4MzNBMywgMHgxRkZCLCAweDMzQTQsCisgICAgMHgxRjU2LCAweDMzQTUsIDB4MUY1NywgMHgzM0E2LCAweDFGRkMsIDB4MzNCMCwgMHgxRjVFLCAweDMzQjEsIDB4MUY1RCwKKyAgICAweDMzQjIsIDB4MUY1QywgMHgzM0IzLCAweDFGNUIsIDB4MzNDMiwgMHgyRTUwLCAweDMzQzQsIDB4MURCNiwgMHgzM0M4LAorICAgIDB4MjAwMiwgMHgzM0NCLCAweDFGNjIsIDB4MzNDQywgMHgxRkY2LCAweDMzQ0QsIDB4MURCQiwgMHgzM0Q0LCAweDFGNjQsCisgICAgMHgzM0Q3LCAweDJFNUQsIDB4MzNEOCwgMHgyRTVFLCAweDMzREEsIDB4MkU0QiwgMHgzNDAyLCAweDM1ODIsIDB4MzQwNSwKKyAgICAweDNDMUIsIDB4MzQyNywgMHgzNjU2LCAweDM0ODgsIDB4M0M1MiwgMHgzNERCLCAweDNDNDEsIDB4MzUxRiwgMHgzNjI5LAorICAgIDB4MzUzRSwgMHgzNzFFLCAweDM3OEQsIDB4MzYxQSwgMHgzN0UyLCAweDM3MkIsIDB4M0FGMywgMHgzQzQwLCAweDNCMjIsCisgICAgMHgzQzQ5LCAweDNCODgsIDB4MzY4RCwgMHgzRThBLCAweDNDNDMsIDB4M0VEQSwgMHgzQzQ4LCAweDNGQjEsIDB4Mzc1NCwKKyAgICAweDQwOTMsIDB4M0M0QywgMHg0MTAzLCAweDNDNEYsIDB4NDI2NCwgMHgzNzYwLCAweDQyOTMsIDB4M0M1MCwgMHg0NDBDLAorICAgIDB4M0M0MiwgMHg0NDUzLCAweDM3NzMsIDB4NDU3QSwgMHgzQzRCLCAweDQ2NjUsIDB4M0M0RSwgMHg0NkFFLCAweDNDNTEsCisgICAgMHg0QkU4LCAweDNDNDYsIDB4NEUwMCwgMHgwNEIwLCAweDRFMDEsIDB4MEJCOCwgMHg0RTAzLCAweDA4RTMsIDB4NEUwNCwKKyAgICAweDM3RDgsIDB4NEUwNSwgMHgzN0Q5LCAweDRFMDcsIDB4MEVBQSwgMHg0RTA4LCAweDA5Q0UsIDB4NEUwOSwgMHgwODdFLAorICAgIDB4NEUwQSwgMHgwOUNELCAweDRFMEIsIDB4MDUzQywgMHg0RTBELCAweDBEQzYsIDB4NEUwRSwgMHgwRjI5LCAweDRFMTAsCisgICAgMHgwRkZCLCAweDRFMTEsIDB4MDREMSwgMHg0RTE0LCAweDA1Q0MsIDB4NEUxNSwgMHgwRkZDLCAweDRFMTYsIDB4MEE0OCwKKyAgICAweDRFMTcsIDB4MTBENywgMHg0RTE4LCAweDA2NzAsIDB4NEUxOSwgMHgwRTBBLCAweDRFMUUsIDB4MDlDRiwgMHg0RTFGLAorICAgIDB4MzdEQSwgMHg0RTIxLCAweDBGODYsIDB4NEUyNiwgMHgwRTEyLCAweDRFMjgsIDB4MjBCMywgMHg0RTJBLCAweDBGRkQsCisgICAgMHg0RTJCLCAweDM3REIsIDB4NEUyQywgMHgzNzRELCAweDRFMkQsIDB4MEJBNCwgMHg0RTJGLCAweDM3REMsIDB4NEUzMCwKKyAgICAweDM3REQsIDB4NEUzMSwgMHgwRkZFLCAweDRFMzIsIDB4MDZGMiwgMHg0RTM2LCAweDBGRkYsIDB4NEUzNywgMHgzNjlELAorICAgIDB4NEUzOCwgMHgwNjE5LCAweDRFMzksIDB4MEI2RSwgMHg0RTNCLCAweDA5MTMsIDB4NEUzQywgMHgxMDAwLCAweDRFM0YsCisgICAgMHgxMDAxLCAweDRFNDAsIDB4MzdERSwgMHg0RTQxLCAweDM3REYsIDB4NEU0MiwgMHgxMDAyLCAweDRFNDMsIDB4MENFQiwKKyAgICAweDRFNDQsIDB4MzdFMCwgMHg0RTQ1LCAweDA2NzEsIDB4NEU0OCwgMHgzNzJFLCAweDRFNEIsIDB4MENFRCwgMHg0RTRELAorICAgIDB4MENCQiwgMHg0RTRFLCAweDA3NzcsIDB4NEU0RiwgMHgwRTYxLCAweDRFNTUsIDB4MTk1MCwgMHg0RTU2LCAweDEwMDMsCisgICAgMHg0RTU3LCAweDA5RDAsIDB4NEU1OCwgMHgxMDA0LCAweDRFNTksIDB4MDUzNSwgMHg0RTVBLCAweDM3RTEsIDB4NEU1RCwKKyAgICAweDA2REQsIDB4NEU1RSwgMHgwN0E0LCAweDRFNUYsIDB4MEVGNSwgMHg0RTYyLCAweDEyMzMsIDB4NEU3MSwgMHgwRjVBLAorICAgIDB4NEU3MywgMHgwQ0Q1LCAweDRFN0UsIDB4MDVFMSwgMHg0RTdGLCAweDM3RTIsIDB4NEU4MCwgMHgwNjRGLCAweDRFODIsCisgICAgMHgxMDA1LCAweDRFODUsIDB4MTAwNiwgMHg0RTg2LCAweDBGODMsIDB4NEU4OCwgMHgwRjI3LCAweDRFODksIDB4MEFFQSwKKyAgICAweDRFOEEsIDB4MTAwOCwgMHg0RThCLCAweDA4QzQsIDB4NEU4QywgMHgwQ0NCLCAweDRFOEQsIDB4MzdFMywgMHg0RThFLAorICAgIDB4MTAwQiwgMHg0RTkxLCAweDA0RTAsIDB4NEU5MiwgMHgwNzkzLCAweDRFOTQsIDB4MDc5MiwgMHg0RTk1LCAweDA0QUEsCisgICAgMHg0RTk2LCAweDM3RTQsIDB4NEU5OCwgMHgwRkYxLCAweDRFOTksIDB4MEZGMCwgMHg0RTlCLCAweDA4MjMsIDB4NEU5QywKKyAgICAweDA0NjUsIDB4NEU5RSwgMHgxMDBDLCAweDRFOUYsIDB4MTAwRCwgMHg0RUEwLCAweDEwMEUsIDB4NEVBMSwgMHgwRTYyLAorICAgIDB4NEVBMiwgMHgxMDBGLCAweDRFQTQsIDB4MDdBNiwgMHg0RUE1LCAweDA0QUIsIDB4NEVBNiwgMHgwRUEwLCAweDRFQTgsCisgICAgMHgwNjk2LCAweDRFQUIsIDB4MDY5NywgMHg0RUFDLCAweDA2OTgsIDB4NEVBRCwgMHgwQkZFLCAweDRFQUUsIDB4MEY4NCwKKyAgICAweDRFQjAsIDB4MTAxMCwgMHg0RUIzLCAweDEwMTEsIDB4NEVCNiwgMHgxMDEyLCAweDRFQjksIDB4MzdFNSwgMHg0RUJBLAorICAgIDB4MEExMywgMHg0RUJCLCAweDM2MjAsIDB4NEVDMCwgMHgwOTQ0LCAweDRFQzEsIDB4MEExNCwgMHg0RUMyLCAweDEwMTcsCisgICAgMHg0RUM0LCAweDEwMTUsIDB4NEVDNiwgMHgxMDE2LCAweDRFQzcsIDB4MDY3MiwgMHg0RUNBLCAweDA4MTMsIDB4NEVDQiwKKyAgICAweDA1NzAsIDB4NEVDRCwgMHgxMDE0LCAweDRFQ0UsIDB4MTAxMywgMHg0RUNGLCAweDBERjksIDB4NEVEMCwgMHgzN0U2LAorICAgIDB4NEVENCwgMHgwODk0LCAweDRFRDUsIDB4MDg5MywgMHg0RUQ2LCAweDBCMUUsIDB4NEVENywgMHgxMDE4LCAweDRFRDgsCisgICAgMHgwREM3LCAweDRFRDksIDB4MEE4QiwgMHg0RURELCAweDAyOTAsIDB4NEVERSwgMHgxMDE5LCAweDRFREYsIDB4MTAxQiwKKyAgICAweDRFRTAsIDB4MzdFNywgMHg0RUUxLCAweDIwQjQsIDB4NEVFMywgMHgwQjQ1LCAweDRFRTQsIDB4MEZBOSwgMHg0RUU1LAorICAgIDB4MDQ4RSwgMHg0RUVELCAweDEwMUEsIDB4NEVFRSwgMHgwNTNFLCAweDRFRjAsIDB4MDZCQywgMHg0RUYyLCAweDBCQTUsCisgICAgMHg0RUY2LCAweDA3NDUsIDB4NEVGNywgMHgxMDFDLCAweDRFRkIsIDB4MENEQSwgMHg0RUZDLCAweDIwQjUsIDB4NEVGRCwKKyAgICAweDM3RTgsIDB4NEVGRiwgMHgzN0U5LCAweDRGMDAsIDB4MjBCNiwgMHg0RjAxLCAweDA2MjcsIDB4NEYwMywgMHgyMEI3LAorICAgIDB4NEYwOSwgMHgxMDFELCAweDRGMEEsIDB4MDQ4RiwgMHg0RjBCLCAweDM3RUEsIDB4NEYwRCwgMHgwNzk0LCAweDRGMEUsCisgICAgMHgwNjI4LCAweDRGMEYsIDB4MERFQywgMHg0RjEwLCAweDBENDYsIDB4NEYxMSwgMHgwNjczLCAweDRGMTUsIDB4MzdFQiwKKyAgICAweDRGMUEsIDB4MDU3MSwgMHg0RjFDLCAweDEwNDAsIDB4NEYxRCwgMHgwQzNCLCAweDRGMkYsIDB4MEQyMiwgMHg0RjMwLAorICAgIDB4MTAxRiwgMHg0RjM0LCAweDBENTAsIDB4NEYzNiwgMHgwRkFBLCAweDRGMzgsIDB4MDlGMywgMHg0RjM5LCAweDIwQjgsCisgICAgMHg0RjNBLCAweDA4OTUsIDB4NEYzQiwgMHgzN0VELCAweDRGM0MsIDB4MDhDNSwgMHg0RjNELCAweDA1NDAsIDB4NEY0MywKKyAgICAweDBCRUQsIDB4NEY0NiwgMHgwQjYwLCAweDRGNDcsIDB4MTAyMywgMHg0RjQ5LCAweDM3RUUsIDB4NEY0RCwgMHgwNDkwLAorICAgIDB4NEY0RSwgMHgwQkZGLCAweDRGNEYsIDB4MDk0NSwgMHg0RjUwLCAweDA4MjQsIDB4NEY1MSwgMHgwRjBFLCAweDRGNTMsCisgICAgMHgwQjJFLCAweDRGNTQsIDB4MzdFRiwgMHg0RjU1LCAweDA1M0YsIDB4NEY1NiwgMHgyMEI5LCAweDRGNTcsIDB4MTAyMiwKKyAgICAweDRGNTksIDB4MEYyOCwgMHg0RjVBLCAweDEwMUUsIDB4NEY1QiwgMHgxMDIwLCAweDRGNUMsIDB4MDg1RSwgMHg0RjVELAorICAgIDB4MTAyMSwgMHg0RjVFLCAweDExRDMsIDB4NEY2MCwgMHgzN0VDLCAweDRGNjksIDB4MTAyOSwgMHg0RjZGLCAweDEwMkMsCisgICAgMHg0RjcwLCAweDEwMkEsIDB4NEY3MywgMHgwNTQyLCAweDRGNzUsIDB4MEUwQiwgMHg0Rjc2LCAweDEwMjQsIDB4NEY3QSwKKyAgICAweDM3RjAsIDB4NEY3QiwgMHgxMDI4LCAweDRGN0MsIDB4MDdBNywgMHg0RjdELCAweDM3RjEsIDB4NEY3RSwgMHgzN0YyLAorICAgIDB4NEY3RiwgMHgwODk2LCAweDRGODMsIDB4MDVFMiwgMHg0Rjg2LCAweDEwMkQsIDB4NEY4OCwgMHgxMDI1LCAweDRGOEEsCisgICAgMHgyMEJCLCAweDRGOEIsIDB4MEZBQiwgMHg0RjhELCAweDA4QzYsIDB4NEY4RiwgMHgxMDI2LCAweDRGOTEsIDB4MTAyQiwKKyAgICAweDRGOTIsIDB4MjBCQSwgMHg0Rjk0LCAweDIwQkQsIDB4NEY5NiwgMHgxMDJFLCAweDRGOTcsIDB4MzdGMywgMHg0Rjk4LAorICAgIDB4MTAyNywgMHg0RjlBLCAweDIwQkMsIDB4NEY5QiwgMHgwNjk5LCAweDRGOUQsIDB4MDQ5MSwgMHg0RkEwLCAweDA2OUEsCisgICAgMHg0RkExLCAweDA1NDEsIDB4NEZBQiwgMHgxMUQ0LCAweDRGQUQsIDB4MEVBNywgMHg0RkFFLCAweDBERTAsIDB4NEZBRiwKKyAgICAweDA3QTgsIDB4NEZCNSwgMHgwOUY1LCAweDRGQjYsIDB4MEY3RiwgMHg0RkJFLCAweDM3RjQsIDB4NEZCRiwgMHgwRTI4LAorICAgIDB4NEZDMiwgMHgwNzBFLCAweDRGQzMsIDB4MEIwNSwgMHg0RkM0LCAweDA1NjQsIDB4NEZDOSwgMHgyMEFDLCAweDRGQ0EsCisgICAgMHgwOTVELCAweDRGQ0QsIDB4MjBCRSwgMHg0RkNFLCAweDEwMzIsIDB4NEZDRiwgMHgzN0Y1LCAweDRGRDAsIDB4MTAzNywKKyAgICAweDRGRDEsIDB4MTAzNSwgMHg0RkQzLCAweDNDMkYsIDB4NEZENCwgMHgxMDMwLCAweDRGRDcsIDB4MEIwRiwgMHg0RkQ4LAorICAgIDB4MTAzMywgMHg0RkRBLCAweDEwMzYsIDB4NEZEQiwgMHgxMDM0LCAweDRGREQsIDB4MEUyRCwgMHg0RkRGLCAweDEwMzEsCisgICAgMHg0RkUwLCAweDFERUMsIDB4NEZFMSwgMHgwOUY0LCAweDRGRTMsIDB4MEVBMSwgMHg0RkU0LCAweDEwMzgsIDB4NEZFNSwKKyAgICAweDEwMzksIDB4NEZFRSwgMHgwOTJFLCAweDRGRUYsIDB4MTA0NiwgMHg0RkYzLCAweDBEMDYsIDB4NEZGNSwgMHgwREE4LAorICAgIDB4NEZGNiwgMHgxMDQxLCAweDRGRjgsIDB4MEU0MCwgMHg0RkZBLCAweDA1MzYsIDB4NEZGRCwgMHgzN0Y2LCAweDRGRkUsCisgICAgMHgxMDQ1LCAweDRGRkYsIDB4MjBDMSwgMHg1MDAwLCAweDM3RjcsIDB4NTAwMSwgMHgzN0Y4LCAweDUwMDIsIDB4MzQ0NywKKyAgICAweDUwMDUsIDB4MTAzRiwgMHg1MDA2LCAweDEwNDgsIDB4NTAwOSwgMHgwQUQ0LCAweDUwMEIsIDB4MDc3OCwgMHg1MDBELAorICAgIDB4MEQxMiwgMHg1MDBGLCAweDE2MDAsIDB4NTAxMCwgMHgzN0Y5LCAweDUwMTEsIDB4MTA0NywgMHg1MDEyLCAweDBDNTcsCisgICAgMHg1MDE0LCAweDEwM0MsIDB4NTAxNiwgMHgwN0FBLCAweDUwMTksIDB4MDdBOSwgMHg1MDFBLCAweDEwM0EsIDB4NTAxQiwKKyAgICAweDM3RkEsIDB4NTAxRSwgMHgyMEMyLCAweDUwMUYsIDB4MDkwNiwgMHg1MDIxLCAweDEwNDIsIDB4NTAyMiwgMHgyMEMwLAorICAgIDB4NTAyMywgMHgwRTNGLCAweDUwMjQsIDB4MEI4QiwgMHg1MDI1LCAweDEwM0UsIDB4NTAyNiwgMHgwNzQ3LCAweDUwMjcsCisgICAgMHgzN0ZCLCAweDUwMjgsIDB4MTAzQiwgMHg1MDI5LCAweDEwNDMsIDB4NTAyQSwgMHgxMDNELCAweDUwMkIsIDB4MEY5OSwKKyAgICAweDUwMkMsIDB4MTA0NCwgMHg1MDJELCAweDBGRTcsIDB4NTAyRSwgMHgzN0ZDLCAweDUwMzYsIDB4MDZERSwgMHg1MDM5LAorICAgIDB4MDc0NiwgMHg1MDNCLCAweDM4MDAsIDB4NTA0MCwgMHgyMEJGLCAweDUwNDIsIDB4MjBDNSwgMHg1MDQzLCAweDEwNDksCisgICAgMHg1MDQ2LCAweDIwQzMsIDB4NTA0NywgMHgxMDRBLCAweDUwNDgsIDB4MTA0RSwgMHg1MDQ5LCAweDA0OTIsIDB4NTA0RiwKKyAgICAweDBFMjAsIDB4NTA1MCwgMHgxMDRELCAweDUwNTUsIDB4MTA0QywgMHg1MDU2LCAweDEwNTAsIDB4NTA1NywgMHgzN0ZELAorICAgIDB4NTA1QSwgMHgxMDRGLCAweDUwNUMsIDB4MEMwMCwgMHg1MDY1LCAweDA3NDgsIDB4NTA2NiwgMHgzN0ZFLCAweDUwNkEsCisgICAgMHgzN0ZGLCAweDUwNkMsIDB4MTA1MSwgMHg1MDcwLCAweDIwQzQsIDB4NTA3MiwgMHgwOEYxLCAweDUwNzQsIDB4MEIwNiwKKyAgICAweDUwNzUsIDB4MEMwMSwgMHg1MDc2LCAweDA2RUUsIDB4NTA3OCwgMHgxMDUyLCAweDUwN0QsIDB4MDY1MCwgMHg1MDgwLAorICAgIDB4MTA1MywgMHg1MDg1LCAweDEwNTUsIDB4NTA4RCwgMHgwRTYzLCAweDUwOEYsIDB4MzgwMSwgMHg1MDkxLCAweDA3M0MsCisgICAgMHg1MDk0LCAweDIwQzYsIDB4NTA5NiwgMHgzODAyLCAweDUwOTgsIDB4MDg3RiwgMHg1MDk5LCAweDBEOEIsIDB4NTA5QSwKKyAgICAweDEwNTQsIDB4NTA5QywgMHgzODAzLCAweDUwQUMsIDB4MDgzNSwgMHg1MEFELCAweDBGMkQsIDB4NTBCMiwgMHgxMDU3LAorICAgIDB4NTBCMywgMHgxMDVBLCAweDUwQjQsIDB4MTA1NiwgMHg1MEI1LCAweDA4MzQsIDB4NTBCNywgMHgwOTg3LCAweDUwQkUsCisgICAgMHgwNzBGLCAweDUwQzIsIDB4MTA1QiwgMHg1MEM1LCAweDA2QzcsIDB4NTBDOSwgMHgxMDU4LCAweDUwQ0EsIDB4MTA1OSwKKyAgICAweDUwQ0MsIDB4MzgwNCwgMHg1MENELCAweDBDODcsIDB4NTBDRiwgMHgwQUZFLCAweDUwRDEsIDB4MDY5QiwgMHg1MEQ1LAorICAgIDB4MEU3QiwgMHg1MEQ2LCAweDEwNUMsIDB4NTBEOCwgMHgyMEM4LCAweDUwRDksIDB4M0MzMCwgMHg1MERBLCAweDBGODUsCisgICAgMHg1MERFLCAweDEwNUQsIDB4NTBFMywgMHgxMDYwLCAweDUwRTUsIDB4MTA1RSwgMHg1MEU2LCAweDM4MDUsIDB4NTBFNywKKyAgICAweDBBRDAsIDB4NTBFOSwgMHgzODA2LCAweDUwRUQsIDB4MTA1RiwgMHg1MEVFLCAweDEwNjEsIDB4NTBFRiwgMHgzODA3LAorICAgIDB4NTBGMCwgMHgzQzMxLCAweDUwRjQsIDB4MjBDNywgMHg1MEY1LCAweDEwNjMsIDB4NTBGOSwgMHgxMDYyLCAweDUwRkIsCisgICAgMHgwRTE4LCAweDUxMDAsIDB4MDY1MSwgMHg1MTAxLCAweDEwNjUsIDB4NTEwMiwgMHgxMDY2LCAweDUxMDQsIDB4MDUyRiwKKyAgICAweDUxMDgsIDB4MzgwOCwgMHg1MTA5LCAweDEwNjQsIDB4NTEwQiwgMHgzODA5LCAweDUxMTAsIDB4MzgwQSwgMHg1MTEyLAorICAgIDB4MDkyMCwgMHg1MTE0LCAweDEwNjksIDB4NTExNSwgMHgxMDY4LCAweDUxMTYsIDB4MTA2NywgMHg1MTE4LCAweDEwMkYsCisgICAgMHg1MTFBLCAweDEwNkEsIDB4NTExQiwgMHgzODBCLCAweDUxMUUsIDB4MzgwQywgMHg1MTFGLCAweDA5ODgsIDB4NTEyMSwKKyAgICAweDEwNkIsIDB4NTEyQSwgMHgwRjBGLCAweDUxMzIsIDB4MEVFNSwgMHg1MTM3LCAweDEwNkQsIDB4NTEzQSwgMHgxMDZDLAorICAgIDB4NTEzQiwgMHgxMDZGLCAweDUxM0MsIDB4MTA2RSwgMHg1MTNGLCAweDEwNzAsIDB4NTE0MCwgMHgxMDcxLCAweDUxNDEsCisgICAgMHgwNEI4LCAweDUxNDMsIDB4MDc2OSwgMHg1MTQ0LCAweDA3MTEsIDB4NTE0NSwgMHgwOTQ2LCAweDUxNDYsIDB4MEJCOSwKKyAgICAweDUxNDcsIDB4MDY5QywgMHg1MTQ4LCAweDBBOEMsIDB4NTE0OSwgMHgwN0FCLCAweDUxNEEsIDB4MjBDOSwgMHg1MTRCLAorICAgIDB4MDgwMCwgMHg1MTRDLCAweDEwNzMsIDB4NTE0RCwgMHgwRUQ0LCAweDUxNEUsIDB4MEM0MCwgMHg1MTUwLCAweDA4QzcsCisgICAgMHg1MTUyLCAweDEwNzIsIDB4NTE1NCwgMHgxMDc0LCAweDUxNUEsIDB4MEM1OCwgMHg1MTVDLCAweDA1RDMsIDB4NTE1RiwKKyAgICAweDM4MEQsIDB4NTE2MiwgMHgxMDc1LCAweDUxNjQsIDB4MjBDQSwgMHg1MTY1LCAweDBDRDYsIDB4NTE2NywgMHgzNjhFLAorICAgIDB4NTE2OCwgMHgwQUI2LCAweDUxNjksIDB4MTA3NywgMHg1MTZBLCAweDEwNzgsIDB4NTE2QiwgMHgwRDQwLCAweDUxNkMsCisgICAgMHgwN0FDLCAweDUxNkQsIDB4MEZFMSwgMHg1MTZFLCAweDEwNzksIDB4NTE3MSwgMHgwNjlFLCAweDUxNzUsIDB4MEUwQywKKyAgICAweDUxNzYsIDB4MEIxNiwgMHg1MTc3LCAweDA2RTksIDB4NTE3OCwgMHgwQzJGLCAweDUxNzksIDB4Mzc3OSwgMHg1MTdDLAorICAgIDB4MDc0OSwgMHg1MTgwLCAweDEwN0EsIDB4NTE4MiwgMHgxMDdCLCAweDUxODUsIDB4MENCQSwgMHg1MTg2LCAweDA1MDEsCisgICAgMHg1MTg5LCAweDEwN0UsIDB4NTE4QSwgMHgwODZELCAweDUxOEMsIDB4MTA3RCwgMHg1MThELCAweDA4MzYsIDB4NTE4RiwKKyAgICAweDEwN0YsIDB4NTE5MCwgMHgxODVCLCAweDUxOTEsIDB4MTA4MCwgMHg1MTkyLCAweDBFNkYsIDB4NTE5MywgMHgxMDgxLAorICAgIDB4NTE5NSwgMHgxMDgyLCAweDUxOTYsIDB4MTA4MywgMHg1MTk3LCAweDA5RDEsIDB4NTE5OSwgMHgwOEY4LCAweDUxOUQsCisgICAgMHgyMENCLCAweDUxQTAsIDB4MDVFMywgMHg1MUExLCAweDM4MEUsIDB4NTFBMiwgMHgxMDg2LCAweDUxQTQsIDB4MTA4NCwKKyAgICAweDUxQTUsIDB4MEVDOSwgMHg1MUE2LCAweDEwODUsIDB4NTFBOCwgMHgwRENDLCAweDUxQTksIDB4MTA4NywgMHg1MUFBLAorICAgIDB4MTA4OCwgMHg1MUFCLCAweDEwODksIDB4NTFBQywgMHgwQzU5LCAweDUxQjAsIDB4MTA4RCwgMHg1MUIxLCAweDEwOEIsCisgICAgMHg1MUIyLCAweDEwOEMsIDB4NTFCMywgMHgxMDhBLCAweDUxQjQsIDB4MDg1MywgMHg1MUI1LCAweDEwOEUsIDB4NTFCNiwKKyAgICAweDBFRjYsIDB4NTFCNywgMHgwRkFDLCAweDUxQkMsIDB4MzgwRiwgMHg1MUJELCAweDEwOEYsIDB4NTFCRSwgMHgyMENDLAorICAgIDB4NTFDMywgMHgzQzMyLCAweDUxQzQsIDB4MEE0QywgMHg1MUM1LCAweDEwOTAsIDB4NTFDNiwgMHgwOTY0LCAweDUxQzksCisgICAgMHgxMDkxLCAweDUxQ0IsIDB4MEJCQSwgMHg1MUNDLCAweDBGODcsIDB4NTFDRCwgMHgwQzVBLCAweDUxRDYsIDB4MTBEQSwKKyAgICAweDUxREIsIDB4MTA5MiwgMHg1MURDLCAweDIwNUMsIDB4NTFERCwgMHgwNkJELCAweDUxREUsIDB4MzgxMCwgMHg1MUUwLAorICAgIDB4MTA5MywgMHg1MUUxLCAweDBFOEMsIDB4NTFFNiwgMHgwOTcyLCAweDUxRTcsIDB4MEI1QywgMHg1MUU5LCAweDEwOTUsCisgICAgMHg1MUVBLCAweDBDQkMsIDB4NTFFQywgMHgyMENELCAweDUxRUQsIDB4MTA5NiwgMHg1MUVFLCAweDM4MTEsIDB4NTFGMCwKKyAgICAweDEwOTcsIDB4NTFGMSwgMHgwNThDLCAweDUxRjQsIDB4MzgxMiwgMHg1MUY1LCAweDEwOTgsIDB4NTFGNiwgMHgwNjlGLAorICAgIDB4NTFGOCwgMHgwQ0E0LCAweDUxRjksIDB4MDUxQywgMHg1MUZBLCAweDA5NUEsIDB4NTFGRCwgMHgwRDM1LCAweDUxRkUsCisgICAgMHgxMDk5LCAweDUyMDAsIDB4MEM1QiwgMHg1MjAxLCAweDM4MTMsIDB4NTIwMiwgMHgzODE0LCAweDUyMDMsIDB4MEExNSwKKyAgICAweDUyMDQsIDB4MTA5QSwgMHg1MjA2LCAweDBERkMsIDB4NTIwNywgMHgwQTdFLCAweDUyMDgsIDB4MDVERSwgMHg1MjBBLAorICAgIDB4MDVFNSwgMHg1MjBCLCAweDEwOUIsIDB4NTIwRSwgMHgxMDlELCAweDUyMTEsIDB4MDcxMCwgMHg1MjEzLCAweDM4MTUsCisgICAgMHg1MjE0LCAweDEwOUMsIDB4NTIxNSwgMHgyMENFLCAweDUyMTcsIDB4MEZCQiwgMHg1MjFELCAweDA5NzMsIDB4NTIyNCwKKyAgICAweDBENTEsIDB4NTIyNSwgMHgwRTFDLCAweDUyMjcsIDB4MTA5RSwgMHg1MjI5LCAweDBGNjIsIDB4NTIyQSwgMHgxMDlGLAorICAgIDB4NTIyRSwgMHgxMEEwLCAweDUyMzAsIDB4MEM3OCwgMHg1MjMzLCAweDEwQTEsIDB4NTIzNiwgMHgwQTRELCAweDUyMzcsCisgICAgMHgwODZFLCAweDUyMzgsIDB4MDc0QSwgMHg1MjM5LCAweDEwQTIsIDB4NTIzQSwgMHgwODk3LCAweDUyM0IsIDB4MDgwMSwKKyAgICAweDUyNDMsIDB4MEMwMiwgMHg1MjQ0LCAweDEwQTQsIDB4NTI0NywgMHgwQjA3LCAweDUyNDksIDB4MzgxNiwgMHg1MjRBLAorICAgIDB4MDg1RiwgMHg1MjRCLCAweDEwQTUsIDB4NTI0QywgMHgxMEE2LCAweDUyNEQsIDB4MEFCMiwgMHg1MjRGLCAweDEwQTMsCisgICAgMHg1MjU0LCAweDEwQTgsIDB4NTI1NiwgMHgwRTY0LCAweDUyNUIsIDB4MDdGNiwgMHg1MjVELCAweDFFNUUsIDB4NTI1RSwKKyAgICAweDEwQTcsIDB4NTI2MSwgMHgzODE3LCAweDUyNjMsIDB4MDc0QiwgMHg1MjY0LCAweDA4NEUsIDB4NTI2NSwgMHgwRDIzLAorICAgIDB4NTI2NiwgMHgzODE4LCAweDUyNjksIDB4MTBBQiwgMHg1MjZBLCAweDEwQTksIDB4NTI2RiwgMHgwREVELCAweDUyNzAsCisgICAgMHgwOUQyLCAweDUyNzEsIDB4MTBCMiwgMHg1MjcyLCAweDA1QzIsIDB4NTI3MywgMHgxMEFDLCAweDUyNzQsIDB4MTBBQSwKKyAgICAweDUyNzUsIDB4MEFEMSwgMHg1MjdELCAweDEwQUUsIDB4NTI3RiwgMHgxMEFELCAweDUyODMsIDB4MDVBMiwgMHg1Mjg3LAorICAgIDB4MDczNiwgMHg1Mjg4LCAweDEwQjMsIDB4NTI4OSwgMHgwRjc1LCAweDUyOEQsIDB4MTBBRiwgMHg1MjkxLCAweDEwQjQsCisgICAgMHg1MjkyLCAweDEwQjEsIDB4NTI5MywgMHgzODE5LCAweDUyOTQsIDB4MTBCMCwgMHg1MjlCLCAweDBGOTcsIDB4NTI5QywKKyAgICAweDIwQ0YsIDB4NTI5RiwgMHgwN0FELCAweDUyQTAsIDB4MDU0MywgMHg1MkEzLCAweDBGQkMsIDB4NTJBNiwgMHgyMEQwLAorICAgIDB4NTJBOSwgMHgwOTdGLCAweDUyQUEsIDB4MEM1MiwgMHg1MkFCLCAweDA3RjcsIDB4NTJBQywgMHgxMEI3LCAweDUyQUQsCisgICAgMHgxMEI4LCAweDUyQUYsIDB4MjE3RCwgMHg1MkIxLCAweDBGQUQsIDB4NTJCNCwgMHgwRkQxLCAweDUyQjUsIDB4MTBCQSwKKyAgICAweDUyQjksIDB4MDdBRSwgMHg1MkJDLCAweDEwQjksIDB4NTJCRSwgMHgwNThELCAweDUyQzAsIDB4MjBEMSwgMHg1MkMxLAorICAgIDB4MTBCQiwgMHg1MkMzLCAweDBFODQsIDB4NTJDNSwgMHgwQkQ4LCAweDUyQzcsIDB4MEYxMCwgMHg1MkM4LCAweDM4MUEsCisgICAgMHg1MkM5LCAweDBFMjksIDB4NTJDRCwgMHgxMEJDLCAweDUyRDAsIDB4MzZFOCwgMHg1MkQyLCAweDFCRUUsIDB4NTJENSwKKyAgICAweDBDODgsIDB4NTJENywgMHgxMEJELCAweDUyRDgsIDB4MDVFNiwgMHg1MkQ5LCAweDBFQkYsIDB4NTJEQiwgMHgyMEQyLAorICAgIDB4NTJERCwgMHgwOTg5LCAweDUyREUsIDB4MTBCRSwgMHg1MkRGLCAweDBFMzcsIDB4NTJFMCwgMHgxMEMyLCAweDUyRTIsCisgICAgMHgwQTRFLCAweDUyRTMsIDB4MTBCRiwgMHg1MkU0LCAweDA2QzgsIDB4NTJFNiwgMHgxMEMwLCAweDUyRTcsIDB4MDVFNywKKyAgICAweDUyRjAsIDB4MzgxQiwgMHg1MkYyLCAweDA3MDQsIDB4NTJGMywgMHgxMEMzLCAweDUyRjUsIDB4MTBDNCwgMHg1MkY4LAorICAgIDB4MTBDNSwgMHg1MkY5LCAweDEwQzYsIDB4NTJGQSwgMHgwOTA3LCAweDUyRkUsIDB4MDdBRiwgMHg1MkZGLCAweDBFRUEsCisgICAgMHg1MzAwLCAweDIwRDMsIDB4NTMwMSwgMHgwRUY0LCAweDUzMDIsIDB4MENDRiwgMHg1MzA1LCAweDBFNDEsIDB4NTMwNiwKKyAgICAweDEwQzcsIDB4NTMwNywgMHgyMEQ0LCAweDUzMDgsIDB4MTBDOCwgMHg1MzBBLCAweDM4MUMsIDB4NTMwQiwgMHgzODFELAorICAgIDB4NTMwRCwgMHgxMENBLCAweDUzMEYsIDB4MTBDQywgMHg1MzEwLCAweDEwQ0IsIDB4NTMxNSwgMHgxMENELCAweDUzMTYsCisgICAgMHgwNTNELCAweDUzMTcsIDB4MEU3QSwgMHg1MzE5LCAweDA4NkMsIDB4NTMxQSwgMHgxMENFLCAweDUzMUQsIDB4MEFEQiwKKyAgICAweDUzMjAsIDB4MDk4QSwgMHg1MzIxLCAweDA2QTEsIDB4NTMyMywgMHgxMENGLCAweDUzMjQsIDB4MjBENSwgMHg1MzJBLAorICAgIDB4MEQ2RiwgMHg1MzJGLCAweDEwRDAsIDB4NTMzMSwgMHgxMEQxLCAweDUzMzMsIDB4MTBEMiwgMHg1MzM4LCAweDEwRDMsCisgICAgMHg1MzM5LCAweDBEOTYsIDB4NTMzQSwgMHgwNkUwLCAweDUzM0IsIDB4MDRBOSwgMHg1MzNFLCAweDM4MUUsIDB4NTMzRiwKKyAgICAweDBDOTcsIDB4NTM0MCwgMHgxMEQ0LCAweDUzNDEsIDB4MDk0NywgMHg1MzQzLCAweDBBOEQsIDB4NTM0NSwgMHgxMEQ2LAorICAgIDB4NTM0NiwgMHgxMEQ1LCAweDUzNDcsIDB4MDk4QiwgMHg1MzQ4LCAweDA3OTUsIDB4NTM0OSwgMHgxMEQ4LCAweDUzNEEsCisgICAgMHgwRDUyLCAweDUzNEIsIDB4MzgyMCwgMHg1MzRDLCAweDM4MUYsIDB4NTM0RCwgMHgxMEQ5LCAweDUzNTEsIDB4MEQ3MCwKKyAgICAweDUzNTIsIDB4MEIxNCwgMHg1MzUzLCAweDBCNEUsIDB4NTM1NCwgMHgwNkEwLCAweDUzNTcsIDB4MENDNiwgMHg1MzU4LAorICAgIDB4MEI2RiwgMHg1MzVBLCAweDBEMjQsIDB4NTM1QywgMHgwRTdDLCAweDUzNUUsIDB4MTBEQiwgMHg1MzYwLCAweDBBOEUsCisgICAgMHg1MzYxLCAweDM4MjEsIDB4NTM2NiwgMHgwNzBCLCAweDUzNjksIDB4MTBEQywgMHg1MzZDLCAweDM4MjIsIDB4NTM2RSwKKyAgICAweDEwREQsIDB4NTM2RiwgMHgwNENFLCAweDUzNzAsIDB4MDRCOSwgMHg1MzcxLCAweDA2MjksIDB4NTM3MiwgMHgyMEQ2LAorICAgIDB4NTM3MywgMHgwQjA4LCAweDUzNzQsIDB4MDY2QiwgMHg1Mzc1LCAweDBGNUIsIDB4NTM3NywgMHgxMEUwLCAweDUzNzgsCisgICAgMHgwNTM3LCAweDUzN0IsIDB4MTBERiwgMHg1MzdELCAweDM0MzUsIDB4NTM3RiwgMHgwNkEyLCAweDUzODIsIDB4MTBFMSwKKyAgICAweDUzODQsIDB4MEVGRCwgMHg1Mzg5LCAweDM3RDAsIDB4NTM5MywgMHgyMEQ3LCAweDUzOTYsIDB4MTBFMiwgMHg1Mzk4LAorICAgIDB4MEY5QSwgMHg1MzlBLCAweDA3QjAsIDB4NTM5RiwgMHgwNzZBLCAweDUzQTAsIDB4MTBFMywgMHg1M0E1LCAweDEwRTUsCisgICAgMHg1M0E2LCAweDEwRTQsIDB4NTNBOCwgMHgwQTI1LCAweDUzQTksIDB4MDREQiwgMHg1M0FCLCAweDM4MjMsIDB4NTNBRCwKKyAgICAweDA1MDAsIDB4NTNBRSwgMHgxMEU2LCAweDUzQjAsIDB4MTBFNywgMHg1M0IyLCAweDIwRDgsIDB4NTNCMywgMHgwNzZCLAorICAgIDB4NTNCNiwgMHgxMEU4LCAweDUzQkIsIDB4MDY4OCwgMHg1M0MyLCAweDA4ODAsIDB4NTNDMywgMHgxMEU5LCAweDUzQzgsCisgICAgMHgwRUEyLCAweDUzQzksIDB4MDgyNSwgMHg1M0NBLCAweDA2NzQsIDB4NTNDQiwgMHgwRjExLCAweDUzQ0MsIDB4MEFEMiwKKyAgICAweDUzQ0QsIDB4MEQ1MywgMHg1M0NFLCAweDA5MjksIDB4NTNENCwgMHgwOTUxLCAweDUzRDYsIDB4MDkxNCwgMHg1M0Q3LAorICAgIDB4MDkyMSwgMHg1M0Q5LCAweDA5ODAsIDB4NTNEQSwgMHgzODI0LCAweDUzREIsIDB4MEQ1NCwgMHg1M0RELCAweDIwRDksCisgICAgMHg1M0RGLCAweDEwRUMsIDB4NTNFMSwgMHgwNEU1LCAweDUzRTIsIDB4MEFEMywgMHg1M0UzLCAweDA3QjEsIDB4NTNFNCwKKyAgICAweDA3NzksIDB4NTNFNSwgMHgwNkRGLCAweDUzRTYsIDB4MzgyNSwgMHg1M0U4LCAweDEwRjAsIDB4NTNFOSwgMHgwQjVGLAorICAgIDB4NTNFQSwgMHgwQjVFLCAweDUzRUIsIDB4MDZBMywgMHg1M0VDLCAweDA5OEMsIDB4NTNFRCwgMHgxMEYxLCAweDUzRUUsCisgICAgMHgxMEVGLCAweDUzRUYsIDB4MDU0NCwgMHg1M0YwLCAweDBCNDYsIDB4NTNGMSwgMHgwOEU0LCAweDUzRjIsIDB4MDg5OSwKKyAgICAweDUzRjMsIDB4MDRDOCwgMHg1M0Y1LCAweDM4MjYsIDB4NTNGNiwgMHgwNUNFLCAweDUzRjcsIDB4MDdGOCwgMHg1M0Y4LAorICAgIDB4MDg5OCwgMHg1M0ZBLCAweDEwRjIsIDB4NTQwMSwgMHgxMEYzLCAweDU0MDMsIDB4MDY2MywgMHg1NDA0LCAweDA1QTQsCisgICAgMHg1NDA4LCAweDA3RjksIDB4NTQwOSwgMHgwNjYyLCAweDU0MEEsIDB4MEJGQiwgMHg1NDBCLCAweDA0QzcsIDB4NTQwQywKKyAgICAweDBDODksIDB4NTQwRCwgMHgwRUNBLCAweDU0MEUsIDB4MDdCMywgMHg1NDBGLCAweDBGNjMsIDB4NTQxMCwgMHgwQzQxLAorICAgIDB4NTQxMSwgMHgwN0IyLCAweDU0MUIsIDB4MDcwNSwgMHg1NDFELCAweDEwRkMsIDB4NTQxRiwgMHgwNkRCLCAweDU0MjAsCisgICAgMHgwRTc4LCAweDU0MjYsIDB4MEQ3MSwgMHg1NDI3LCAweDM4MjcsIDB4NTQyOSwgMHgxMEZCLCAweDU0MkIsIDB4MDYxQSwKKyAgICAweDU0MkMsIDB4MTBGNiwgMHg1NDJELCAweDEwRjcsIDB4NTQyRSwgMHgxMEY5LCAweDU0MzMsIDB4MzVDMCwgMHg1NDM2LAorICAgIDB4MTBGQSwgMHg1NDM4LCAweDA2NzUsIDB4NTQzOSwgMHgwQTI3LCAweDU0M0IsIDB4MERGRCwgMHg1NDNDLCAweDEwRjgsCisgICAgMHg1NDNELCAweDEwRjQsIDB4NTQzRSwgMHgwNzk3LCAweDU0M0YsIDB4MzVDRiwgMHg1NDQwLCAweDEwRjUsIDB4NTQ0MiwKKyAgICAweDBGQ0EsIDB4NTQ0NiwgMHgwRTQyLCAweDU0NDgsIDB4MEMwNCwgMHg1NDQ5LCAweDA3OTYsIDB4NTQ0QSwgMHgwODAyLAorICAgIDB4NTQ0RCwgMHgzODI4LCAweDU0NEUsIDB4MTBGRCwgMHg1NDUxLCAweDBDQjUsIDB4NTQ1NSwgMHgzNzIzLCAweDU0NUYsCisgICAgMHgxMTAxLCAweDU0NjYsIDB4MzgyOSwgMHg1NDY4LCAweDA5MkEsIDB4NTQ2QSwgMHgwOTIyLCAweDU0NkIsIDB4MzgyQSwKKyAgICAweDU0NzAsIDB4MTEwNCwgMHg1NDcxLCAweDExMDIsIDB4NTQ3MywgMHgwRUFGLCAweDU0NzQsIDB4MzgyQiwgMHg1NDc1LAorICAgIDB4MTBGRiwgMHg1NDc2LCAweDExMDgsIDB4NTQ3NywgMHgxMTAzLCAweDU0N0IsIDB4MTEwNiwgMHg1NDdDLCAweDA3N0EsCisgICAgMHg1NDdELCAweDBFQ0IsIDB4NTQ4MCwgMHgxMTA3LCAweDU0ODQsIDB4MTEwOSwgMHg1NDg2LCAweDExMEIsIDB4NTQ4QSwKKyAgICAweDIwREMsIDB4NTQ4QiwgMHgwODYwLCAweDU0OEMsIDB4MEZFOCwgMHg1NDhELCAweDM4MkMsIDB4NTQ4RSwgMHgxMTAwLAorICAgIDB4NTQ4RiwgMHgxMEZFLCAweDU0OTAsIDB4MTEwQSwgMHg1NDkyLCAweDExMDUsIDB4NTQ5NiwgMHgzODJELCAweDU0OUMsCisgICAgMHgyMERCLCAweDU0QTEsIDB4MzgyRSwgMHg1NEEyLCAweDExMEQsIDB4NTRBNCwgMHgxMTE2LCAweDU0QTUsIDB4MTEwRiwKKyAgICAweDU0QTgsIDB4MTExMywgMHg1NEE5LCAweDIwREQsIDB4NTRBQiwgMHgxMTE0LCAweDU0QUMsIDB4MTExMCwgMHg1NEFELAorICAgIDB4MzgyRiwgMHg1NEFGLCAweDExMzEsIDB4NTRCMiwgMHgwODU5LCAweDU0QjMsIDB4MDU4RiwgMHg1NEI4LCAweDExMEUsCisgICAgMHg1NEI5LCAweDM4MzAsIDB4NTRCQywgMHgxMTE4LCAweDU0QkQsIDB4MDRCQSwgMHg1NEJFLCAweDExMTcsIDB4NTRCRiwKKyAgICAweDM4MzEsIDB4NTRDMCwgMHgwNDY5LCAweDU0QzEsIDB4MERCQywgMHg1NEMyLCAweDExMTUsIDB4NTRDNCwgMHgxMTExLAorICAgIDB4NTRDNiwgMHgzODMyLCAweDU0QzcsIDB4MTEwQywgMHg1NEM4LCAweDExMTIsIDB4NTRDOSwgMHgwODM4LCAweDU0Q0QsCisgICAgMHgzODMzLCAweDU0RDgsIDB4MTExOSwgMHg1NEUxLCAweDA0QkIsIDB4NTRFMiwgMHgxMTIyLCAweDU0RTUsIDB4MTExQSwKKyAgICAweDU0RTYsIDB4MTExQiwgMHg1NEU4LCAweDA5OEQsIDB4NTRFOSwgMHgwRTk3LCAweDU0RUQsIDB4MTEyMCwgMHg1NEVFLAorICAgIDB4MTExRiwgMHg1NEYyLCAweDBDMjksIDB4NTRGQSwgMHgxMTIxLCAweDU0RkQsIDB4MTExRSwgMHg1NEZGLCAweDIwREUsCisgICAgMHg1NTA0LCAweDA0RDYsIDB4NTUwNiwgMHgwODI2LCAweDU1MDcsIDB4MDlGNiwgMHg1NTBFLCAweDM4MzQsIDB4NTUwRiwKKyAgICAweDExMUMsIDB4NTUxMCwgMHgwQzVDLCAweDU1MTQsIDB4MTExRCwgMHg1NTE2LCAweDA0NjYsIDB4NTUyQiwgMHgzODM1LAorICAgIDB4NTUyRSwgMHgxMTI3LCAweDU1MkYsIDB4MEYwRCwgMHg1NTMxLCAweDA5OEYsIDB4NTUzMywgMHgxMTJELCAweDU1MzUsCisgICAgMHgzODM2LCAweDU1MzgsIDB4MTEyQywgMHg1NTM5LCAweDExMjMsIDB4NTUzRSwgMHgwQjIzLCAweDU1NDAsIDB4MTEyNCwKKyAgICAweDU1NDQsIDB4MEI0RiwgMHg1NTQ1LCAweDExMjksIDB4NTU0NiwgMHgwOThFLCAweDU1NEEsIDB4MzgzNywgMHg1NTRDLAorICAgIDB4MTEyNiwgMHg1NTRGLCAweDBFRjAsIDB4NTU1MywgMHgwNzEyLCAweDU1NTYsIDB4MTEyQSwgMHg1NTU3LCAweDExMkIsCisgICAgMHg1NTVDLCAweDExMjgsIDB4NTU1RCwgMHgxMTJFLCAweDU1NUUsIDB4MUREMSwgMHg1NTYwLCAweDM4MzgsIDB4NTU2MSwKKyAgICAweDM4MzksIDB4NTU2MywgMHgxMTI1LCAweDU1N0IsIDB4MTEzNCwgMHg1NTdDLCAweDExMzksIDB4NTU3RSwgMHgxMTM1LAorICAgIDB4NTU4MCwgMHgxMTMwLCAweDU1ODMsIDB4MTEzQSwgMHg1NTg0LCAweDBBQjMsIDB4NTU4NiwgMHgyMERGLCAweDU1ODcsCisgICAgMHgxMTNDLCAweDU1ODgsIDB4MzgzQSwgMHg1NTg5LCAweDA3QjQsIDB4NTU4QSwgMHgxMTMyLCAweDU1OEIsIDB4MEJCQiwKKyAgICAweDU1OEUsIDB4MzgzQiwgMHg1NTk4LCAweDExMzYsIDB4NTU5OSwgMHgxMTJGLCAweDU1OUEsIDB4MDVFOSwgMHg1NTlDLAorICAgIDB4MDYyQSwgMHg1NTlELCAweDA1QzMsIDB4NTU5RSwgMHgxMTM3LCAweDU1OUYsIDB4MTEzMywgMHg1NUE3LCAweDA3NEMsCisgICAgMHg1NUE4LCAweDExM0QsIDB4NTVBOSwgMHgxMTNCLCAweDU1QUEsIDB4MEFENSwgMHg1NUFCLCAweDA2NjQsIDB4NTVBQywKKyAgICAweDA2QTQsIDB4NTVBRSwgMHgxMTM4LCAweDU1QjAsIDB4MDZFQywgMHg1NUI2LCAweDA0RTYsIDB4NTVDNCwgMHgxMTQxLAorICAgIDB4NTVDNSwgMHgxMTNGLCAweDU1QzcsIDB4MTE3OCwgMHg1NUQ0LCAweDExNDQsIDB4NTVEQSwgMHgxMTNFLCAweDU1REMsCisgICAgMHgxMTQyLCAweDU1REYsIDB4MTE0MCwgMHg1NUUzLCAweDA4OUEsIDB4NTVFNCwgMHgxMTQzLCAweDU1RjcsIDB4MTE0NiwKKyAgICAweDU1RjksIDB4MTE0QiwgMHg1NUZELCAweDExNDksIDB4NTVGRSwgMHgxMTQ4LCAweDU2MDYsIDB4MEI3MCwgMHg1NjA4LAorICAgIDB4MzgzQywgMHg1NjA5LCAweDA1NDUsIDB4NTYwRSwgMHgzODNELCAweDU2MEYsIDB4MzgzRSwgMHg1NjE0LCAweDExNDUsCisgICAgMHg1NjE2LCAweDExNDcsIDB4NTYxNywgMHgwOTkwLCAweDU2MTgsIDB4MDRENSwgMHg1NjFCLCAweDExNEEsIDB4NTYyMCwKKyAgICAweDNDMUQsIDB4NTYyOSwgMHgwNTVFLCAweDU2MkYsIDB4MTE1NSwgMHg1NjMxLCAweDA5RTQsIDB4NTYzMiwgMHgxMTUxLAorICAgIDB4NTYzNCwgMHgxMTRGLCAweDU2MzYsIDB4MTE1MCwgMHg1NjM3LCAweDM4M0YsIDB4NTYzOCwgMHgxMTUyLCAweDU2M0YsCisgICAgMHgzODQwLCAweDU2NDIsIDB4MDRERiwgMHg1NjQ5LCAweDM4NDEsIDB4NTY0QiwgMHgzODQyLCAweDU2NEMsIDB4MEFCQiwKKyAgICAweDU2NEUsIDB4MTE0QywgMHg1NjRGLCAweDM4NDMsIDB4NTY1MCwgMHgxMTRELCAweDU2NTMsIDB4MUYxQiwgMHg1NjVCLAorICAgIDB4MDVEOCwgMHg1NjY0LCAweDExNTQsIDB4NTY2NiwgMHgzODQ0LCAweDU2NjgsIDB4MDYyQiwgMHg1NjY5LCAweDM4NDUsCisgICAgMHg1NjZBLCAweDExNTcsIDB4NTY2QiwgMHgxMTUzLCAweDU2NkMsIDB4MTE1NiwgMHg1NjZGLCAweDM4NDYsIDB4NTY3MSwKKyAgICAweDM4NDcsIDB4NTY3MiwgMHgzODQ4LCAweDU2NzQsIDB4MERGRSwgMHg1Njc2LCAweDNDMzMsIDB4NTY3OCwgMHgwQ0FELAorICAgIDB4NTY3QSwgMHgwRDRDLCAweDU2ODAsIDB4MTE1OSwgMHg1Njg2LCAweDExNTgsIDB4NTY4NywgMHgwNUEzLCAweDU2OEEsCisgICAgMHgxMTVBLCAweDU2OEYsIDB4MTE1RCwgMHg1Njk0LCAweDExNUMsIDB4NTY5NSwgMHgzODQ5LCAweDU2OTksIDB4MURFNiwKKyAgICAweDU2OUEsIDB4Mzg0QSwgMHg1NkEwLCAweDExNUIsIDB4NTZBMiwgMHgwQ0VGLCAweDU2QTUsIDB4MTE1RSwgMHg1NkFDLAorICAgIDB4Mzg0QiwgMHg1NkFELCAweDM4NEMsIDB4NTZBRSwgMHgxMTVGLCAweDU2QjEsIDB4Mzg0RCwgMHg1NkI0LCAweDExNjEsCisgICAgMHg1NkI2LCAweDExNjAsIDB4NTZCQywgMHgxMTYzLCAweDU2QzAsIDB4MTE2NiwgMHg1NkMxLCAweDExNjQsIDB4NTZDMiwKKyAgICAweDExNjIsIDB4NTZDMywgMHgxMTY1LCAweDU2QzgsIDB4MTE2NywgMHg1NkM5LCAweDM4NEUsIDB4NTZDQSwgMHgxRTVBLAorICAgIDB4NTZDRSwgMHgxMTY4LCAweDU2RDEsIDB4MTE2OSwgMHg1NkQzLCAweDExNkEsIDB4NTZENywgMHgxMTZCLCAweDU2RDgsCisgICAgMHgxMDdDLCAweDU2REEsIDB4MDkyOCwgMHg1NkRCLCAweDA4OUIsIDB4NTZERCwgMHgzODRGLCAweDU2REUsIDB4MDU3MywKKyAgICAweDU2RTAsIDB4MDRCQywgMHg1NkUzLCAweDBCODIsIDB4NTZFNCwgMHgzODUwLCAweDU2RUUsIDB4MTE2QywgMHg1NkYwLAorICAgIDB4MDgxNCwgMHg1NkYyLCAweDA0OTMsIDB4NTZGMywgMHgwQTI0LCAweDU2RjksIDB4MTE2RCwgMHg1NkZBLCAweDA3N0IsCisgICAgMHg1NkZELCAweDA4MDMsIDB4NTZGRiwgMHgxMTZGLCAweDU3MDAsIDB4MTE2RSwgMHg1NzAzLCAweDBFMzAsIDB4NTcwNCwKKyAgICAweDExNzAsIDB4NTcwOCwgMHgxMTcyLCAweDU3MDksIDB4MTE3MSwgMHg1NzBBLCAweDM4NTEsIDB4NTcwQiwgMHgxMTczLAorICAgIDB4NTcwRCwgMHgxMTc0LCAweDU3MEYsIDB4MDc0RCwgMHg1NzEyLCAweDA1MDIsIDB4NTcxMywgMHgxMTc1LCAweDU3MTUsCisgICAgMHgzODUyLCAweDU3MTYsIDB4MTE3NywgMHg1NzE4LCAweDExNzYsIDB4NTcxQywgMHgxMTc5LCAweDU3MUYsIDB4MEM1NCwKKyAgICAweDU3MjEsIDB4MzY4MCwgMHg1NzIzLCAweDM4NTMsIDB4NTcyNiwgMHgxMTdBLCAweDU3MjcsIDB4MDQ3OSwgMHg1NzI4LAorICAgIDB4MDg0RiwgMHg1NzJELCAweDA3MTMsIDB4NTcyRiwgMHgzODU0LCAweDU3MzAsIDB4MEI4RCwgMHg1NzMzLCAweDM4NTUsCisgICAgMHg1NzM0LCAweDM4NTYsIDB4NTczNywgMHgxMTdCLCAweDU3MzgsIDB4MTE3QywgMHg1NzNCLCAweDExN0UsIDB4NTc0MCwKKyAgICAweDExN0YsIDB4NTc0MiwgMHgwODU0LCAweDU3NDcsIDB4MDZDOSwgMHg1NzRBLCAweDBFNjUsIDB4NTc0QywgMHgzODU3LAorICAgIDB4NTc0RSwgMHgxMTdELCAweDU3NEYsIDB4MTE4MCwgMHg1NzUwLCAweDA4MzEsIDB4NTc1MSwgMHgwN0I1LCAweDU3NTksCisgICAgMHgyMEUwLCAweDU3NjEsIDB4MTE4NCwgMHg1NzY0LCAweDA4MTUsIDB4NTc2NSwgMHgyMEUxLCAweDU3NjYsIDB4MEI3MSwKKyAgICAweDU3NjksIDB4MTE4MSwgMHg1NzZBLCAweDBCRjYsIDB4NTc3MCwgMHgzODU4LCAweDU3N0YsIDB4MTE4NSwgMHg1NzgyLAorICAgIDB4MEEyOCwgMHg1Nzg4LCAweDExODMsIDB4NTc4OSwgMHgxMTg2LCAweDU3OEIsIDB4MDcxNSwgMHg1NzhDLCAweDM4NTksCisgICAgMHg1NzkzLCAweDExODcsIDB4NTc5QywgMHgzODVBLCAweDU3QTAsIDB4MTE4OCwgMHg1N0EyLCAweDA3QjYsIDB4NTdBMywKKyAgICAweDA1OUUsIDB4NTdBNCwgMHgxMThBLCAweDU3QUEsIDB4MTE4QiwgMHg1N0FDLCAweDIwRTIsIDB4NTdCMCwgMHgxMThDLAorICAgIDB4NTdCMywgMHgxMTg5LCAweDU3QjgsIDB4Mzg1QiwgMHg1N0MwLCAweDExODIsIDB4NTdDMywgMHgxMThELCAweDU3QzYsCisgICAgMHgxMThFLCAweDU3QzcsIDB4MjBFNCwgMHg1N0M4LCAweDIwRTMsIDB4NTdDQiwgMHgwRTkyLCAweDU3Q0UsIDB4MDlEMywKKyAgICAweDU3RDIsIDB4MTE5MCwgMHg1N0QzLCAweDExOTEsIDB4NTdENCwgMHgxMThGLCAweDU3RDYsIDB4MTE5MywgMHg1N0RDLAorICAgIDB4MENFRSwgMHg1N0RGLCAweDA0QUMsIDB4NTdFMCwgMHgwREM4LCAweDU3RTMsIDB4MTE5NCwgMHg1N0U2LCAweDM4NUMsCisgICAgMHg1N0VELCAweDM4NUQsIDB4NTdGNCwgMHgwOUU1LCAweDU3RjUsIDB4Mzg1RSwgMHg1N0Y2LCAweDM4NUYsIDB4NTdGNywKKyAgICAweDA4RTUsIDB4NTdGOSwgMHgwRDEzLCAweDU3RkEsIDB4MDYyQywgMHg1N0ZDLCAweDA4NUIsIDB4NTdGRiwgMHgzODYwLAorICAgIDB4NTgwMCwgMHgwRTg3LCAweDU4MDIsIDB4MEM4QSwgMHg1ODA1LCAweDA3NEUsIDB4NTgwNiwgMHgwQjJGLCAweDU4MDksCisgICAgMHgzODYxLCAweDU4MEEsIDB4MTE5MiwgMHg1ODBCLCAweDExOTUsIDB4NTgxNSwgMHgwQjI0LCAweDU4MTksIDB4MTE5NiwKKyAgICAweDU4MUQsIDB4MTE5NywgMHg1ODIwLCAweDM4NjIsIDB4NTgyMSwgMHgxMTk5LCAweDU4MjQsIDB4MEMwNSwgMHg1ODJBLAorICAgIDB4MDVFQSwgMHg1ODJGLCAweDFEMzIsIDB4NTgzMCwgMHgwNTAzLCAweDU4MzEsIDB4MEU0MywgMHg1ODMyLCAweDM4NjMsCisgICAgMHg1ODM0LCAweDA5RDQsIDB4NTgzNSwgMHgwQzQyLCAweDU4M0EsIDB4MDg1NiwgMHg1ODNELCAweDExOUYsIDB4NTg0MCwKKyAgICAweDBFMEQsIDB4NTg0MSwgMHgwRkE1LCAweDU4NEEsIDB4MDU3NCwgMHg1ODRCLCAweDExOUIsIDB4NTg1MSwgMHgwQUJDLAorICAgIDB4NTg1MiwgMHgxMTlFLCAweDU4NTQsIDB4MEM1RCwgMHg1ODU3LCAweDBDNDMsIDB4NTg1OCwgMHgwQzVFLCAweDU4NTksCisgICAgMHgwRDRELCAweDU4NUEsIDB4MEJFOSwgMHg1ODVFLCAweDA4MzksIDB4NTg2MSwgMHgxRTQ3LCAweDU4NjIsIDB4MTE5QSwKKyAgICAweDU4NjksIDB4MDUxOCwgMHg1ODZCLCAweDBDMzAsIDB4NTg3MCwgMHgxMTlDLCAweDU4NzIsIDB4MTE5OCwgMHg1ODc1LAorICAgIDB4MEExNiwgMHg1ODc5LCAweDExQTAsIDB4NTg3QywgMHgzODY0LCAweDU4N0UsIDB4MDk1OCwgMHg1ODgwLCAweDM4NjUsCisgICAgMHg1ODgzLCAweDA2QTUsIDB4NTg4NSwgMHgxMUExLCAweDU4OTMsIDB4MEUzOCwgMHg1ODk3LCAweDBBRkYsIDB4NTg5QywKKyAgICAweDBCRTIsIDB4NTg5RSwgMHgyMEU3LCAweDU4OUYsIDB4MTFBMywgMHg1OEE4LCAweDBFN0QsIDB4NThBOSwgMHgzODY2LAorICAgIDB4NThBQiwgMHgxMUE0LCAweDU4QUUsIDB4MTFBOSwgMHg1OEIyLCAweDIwRTgsIDB4NThCMywgMHgwREZGLCAweDU4QjgsCisgICAgMHgxMUE4LCAweDU4QjksIDB4MTFBMiwgMHg1OEJBLCAweDExQTUsIDB4NThCQiwgMHgxMUE3LCAweDU4QkUsIDB4MDgxNiwKKyAgICAweDU4QzEsIDB4MEUxOSwgMHg1OEM1LCAweDExQUEsIDB4NThDNywgMHgwQjgzLCAweDU4Q0EsIDB4MDU3NSwgMHg1OENDLAorICAgIDB4MDlENSwgMHg1OENFLCAweDM4NjcsIDB4NThEMCwgMHgzODY4LCAweDU4RDEsIDB4MTFBQywgMHg1OEQzLCAweDExQUIsCisgICAgMHg1OEQ0LCAweDM4NjksIDB4NThENSwgMHgwN0ZBLCAweDU4RDcsIDB4MTFBRCwgMHg1OEQ4LCAweDExQUYsIDB4NThEOSwKKyAgICAweDExQUUsIDB4NThEQSwgMHgzODZBLCAweDU4REMsIDB4MTFCMSwgMHg1OERFLCAweDExQTYsIDB4NThERiwgMHgxMUIzLAorICAgIDB4NThFNCwgMHgxMUIyLCAweDU4RTUsIDB4MTFCMCwgMHg1OEU5LCAweDM4NkIsIDB4NThFQiwgMHgwODlDLCAweDU4RUMsCisgICAgMHgwQTE3LCAweDU4RUUsIDB4MEFENiwgMHg1OEVGLCAweDExQjQsIDB4NThGMCwgMHgwQTYwLCAweDU4RjEsIDB4MDRCMSwKKyAgICAweDU4RjIsIDB4MEQxQSwgMHg1OEY3LCAweDBCRjcsIDB4NThGOSwgMHgxMUI2LCAweDU4RkEsIDB4MTFCNSwgMHg1OEZCLAorICAgIDB4MTFCNywgMHg1OEZDLCAweDExQjgsIDB4NThGRCwgMHgxMUI5LCAweDU5MDIsIDB4MTFCQSwgMHg1OTA5LCAweDBFMjEsCisgICAgMHg1OTBBLCAweDExQkIsIDB4NTkwQiwgMHgyMEU5LCAweDU5MEMsIDB4Mzg2QywgMHg1OTBGLCAweDA1NDYsIDB4NTkxMCwKKyAgICAweDExQkMsIDB4NTkxNSwgMHgwRjI2LCAweDU5MTYsIDB4MDU4RSwgMHg1OTE4LCAweDEwREUsIDB4NTkxOSwgMHgwOTUyLAorICAgIDB4NTkxQSwgMHgwQjFGLCAweDU5MUIsIDB4MTFCRCwgMHg1OTFDLCAweDBFRjcsIDB4NTkyMiwgMHgwRUMwLCAweDU5MjQsCisgICAgMHgzODZELCAweDU5MjUsIDB4MTFCRiwgMHg1OTI3LCAweDBCNDcsIDB4NTkyOSwgMHgwQzMxLCAweDU5MkEsIDB4MEIyMCwKKyAgICAweDU5MkIsIDB4MERDOSwgMHg1OTJDLCAweDExQzAsIDB4NTkyRCwgMHgxMUMxLCAweDU5MkUsIDB4MDUxRCwgMHg1OTJGLAorICAgIDB4Mzg2RSwgMHg1OTMxLCAweDA4RTYsIDB4NTkzMiwgMHgxMUMyLCAweDU5MzcsIDB4MDQ5NCwgMHg1OTM4LCAweDExQzMsCisgICAgMHg1OTM5LCAweDM3MjUsIDB4NTkzRSwgMHgxMUM0LCAweDU5NDQsIDB4MDUwNCwgMHg1OTQ3LCAweDA2MkQsIDB4NTk0OCwKKyAgICAweDBDQjgsIDB4NTk0OSwgMHgwRTQ0LCAweDU5NEUsIDB4MTFDOCwgMHg1OTRGLCAweDBBRDcsIDB4NTk1MCwgMHgxMUM3LAorICAgIDB4NTk1MSwgMHgwNzE2LCAweDU5NTMsIDB4MjBFQSwgMHg1OTU0LCAweDBFODksIDB4NTk1NSwgMHgxMUM2LCAweDU5NTcsCisgICAgMHgwQzVGLCAweDU5NTgsIDB4MTFDQSwgMHg1OTVBLCAweDExQzksIDB4NTk1QiwgMHgyMEVCLCAweDU5NUQsIDB4MjBFQywKKyAgICAweDU5NjAsIDB4MTFDQywgMHg1OTYxLCAweDM4NkYsIDB4NTk2MiwgMHgxMUNCLCAweDU5NjMsIDB4MjBFRCwgMHg1OTY1LAorICAgIDB4MDUxRSwgMHg1OTY3LCAweDExQ0QsIDB4NTk2OCwgMHgwOTkxLCAweDU5NjksIDB4MTFDRiwgMHg1OTZBLCAweDBCNjMsCisgICAgMHg1OTZDLCAweDExQ0UsIDB4NTk2RCwgMHgzODcwLCAweDU5NkUsIDB4MEUwMywgMHg1OTczLCAweDA5ODEsIDB4NTk3NCwKKyAgICAweDBDNTUsIDB4NTk3OCwgMHgxMUQwLCAweDU5N0QsIDB4MDdCNywgMHg1OTgxLCAweDExRDEsIDB4NTk4MiwgMHgwQ0Q3LAorICAgIDB4NTk4MywgMHgwRDcyLCAweDU5ODQsIDB4MEVERCwgMHg1OThBLCAweDBDREIsIDB4NTk4RCwgMHgxMURBLCAweDU5OTMsCisgICAgMHgwNjUyLCAweDU5OTYsIDB4MEYyRiwgMHg1OTk5LCAweDBFQkIsIDB4NTk5QiwgMHgxMjM5LCAweDU5OUQsIDB4MTFEMiwKKyAgICAweDU5QTMsIDB4MTFENSwgMHg1OUE0LCAweDIwRUUsIDB4NTlBNSwgMHgwQjI1LCAweDU5QTgsIDB4MEU2NiwgMHg1OUFDLAorICAgIDB4MEM0NCwgMHg1OUIyLCAweDExRDYsIDB4NTlCOSwgMHgwRTkzLCAweDU5QkEsIDB4MjBFRiwgMHg1OUJCLCAweDA4M0EsCisgICAgMHg1OUJFLCAweDA5OTIsIDB4NTlDNiwgMHgxMUQ3LCAweDU5QzksIDB4MDg5RSwgMHg1OUNBLCAweDM4NzEsIDB4NTlDQiwKKyAgICAweDA4OUQsIDB4NTlEMCwgMHgwNDdELCAweDU5RDEsIDB4MDc3QywgMHg1OUQyLCAweDM4NzIsIDB4NTlEMywgMHgwQTRGLAorICAgIDB4NTlENCwgMHgwNDk1LCAweDU5RDksIDB4MTFEQiwgMHg1OURBLCAweDExREMsIDB4NTlEQywgMHgxMUQ5LCAweDU5REQsCisgICAgMHgzODczLCAweDU5RTMsIDB4Mzg3NCwgMHg1OUU0LCAweDM4NzUsIDB4NTlFNSwgMHgwNERBLCAweDU5RTYsIDB4MDVFQiwKKyAgICAweDU5RTgsIDB4MTFEOCwgMHg1OUVBLCAweDBFRDEsIDB4NTlFQiwgMHgwREEzLCAweDU5RUMsIDB4MzZBRCwgMHg1OUY2LAorICAgIDB4MDQ2QywgMHg1OUZCLCAweDA0QkQsIDB4NTlGRiwgMHgwODlGLCAweDVBMDEsIDB4MDQ5NiwgMHg1QTAzLCAweDA0NjcsCisgICAgMHg1QTA0LCAweDM4NzYsIDB4NUEwOSwgMHgxMUUxLCAweDVBMEMsIDB4Mzg3NywgMHg1QTExLCAweDExREYsIDB4NUExOCwKKyAgICAweDBFQzgsIDB4NUExQSwgMHgxMUUyLCAweDVBMUIsIDB4MzVDMSwgMHg1QTFDLCAweDExRTAsIDB4NUExRiwgMHgxMURFLAorICAgIDB4NUEyMCwgMHgwOUY3LCAweDVBMjMsIDB4Mzg3OCwgMHg1QTI1LCAweDExREQsIDB4NUEyOSwgMHgwRTJBLCAweDVBMkYsCisgICAgMHgwNzk4LCAweDVBMzUsIDB4MTFFNiwgMHg1QTM2LCAweDExRTcsIDB4NUEzQywgMHgwOTkzLCAweDVBNDAsIDB4MTFFMywKKyAgICAweDVBNDEsIDB4MEZEMiwgMHg1QTQ2LCAweDBEMDIsIDB4NUE0NywgMHgzODc5LCAweDVBNDksIDB4MTFFNSwgMHg1QTU1LAorICAgIDB4Mzg3QSwgMHg1QTVBLCAweDA4MTcsIDB4NUE2MiwgMHgxMUU4LCAweDVBNjMsIDB4Mzg3QiwgMHg1QTY2LCAweDBEQ0EsCisgICAgMHg1QTZBLCAweDExRTksIDB4NUE2QywgMHgxMUU0LCAweDVBNkQsIDB4Mzg3QywgMHg1QTdFLCAweDM4N0QsIDB4NUE3RiwKKyAgICAweDBFQzcsIDB4NUE5MiwgMHgwRDE0LCAweDVBOUEsIDB4MTFFQSwgMHg1QTlCLCAweDBEQTQsIDB4NUE5RSwgMHgzODdFLAorICAgIDB4NUFBNywgMHgzODdGLCAweDVBQUMsIDB4Mzg4MCwgMHg1QUIzLCAweDM4ODEsIDB4NUFCQywgMHgxMUVCLCAweDVBQkQsCisgICAgMHgxMUVGLCAweDVBQkUsIDB4MTFFQywgMHg1QUMxLCAweDA1NDcsIDB4NUFDMiwgMHgxMUVFLCAweDVBQzksIDB4MDhFNywKKyAgICAweDVBQ0IsIDB4MTFFRCwgMHg1QUNDLCAweDA3NEYsIDB4NUFEMCwgMHgxMUZCLCAweDVBRDYsIDB4MTFGNCwgMHg1QUQ3LAorICAgIDB4MTFGMSwgMHg1QUUwLCAweDM4ODIsIDB4NUFFMSwgMHgwQkEyLCAweDVBRTMsIDB4MTFGMCwgMHg1QUU2LCAweDExRjIsCisgICAgMHg1QUU5LCAweDExRjMsIDB4NUFGQSwgMHgxMUY1LCAweDVBRkIsIDB4MTFGNiwgMHg1QjAwLCAweDM4ODMsIDB4NUIwOSwKKyAgICAweDA2MkUsIDB4NUIwQiwgMHgxMUY4LCAweDVCMEMsIDB4MTFGNywgMHg1QjE2LCAweDExRjksIDB4NUIxOSwgMHgzODg0LAorICAgIDB4NUIyMiwgMHgwOUQ2LCAweDVCMjUsIDB4Mzg4NSwgMHg1QjJBLCAweDExRkMsIDB4NUIyQywgMHgwQkY4LCAweDVCMkQsCisgICAgMHgzODg2LCAweDVCMzAsIDB4MDRFNywgMHg1QjMyLCAweDExRkEsIDB4NUIzNiwgMHgxMUZELCAweDVCM0UsIDB4MTFGRSwKKyAgICAweDVCNDAsIDB4MTIwMSwgMHg1QjQxLCAweDM4ODcsIDB4NUI0MywgMHgxMUZGLCAweDVCNDUsIDB4MTIwMCwgMHg1QjUwLAorICAgIDB4MDhBMCwgMHg1QjUxLCAweDEyMDIsIDB4NUI1NCwgMHgwN0I4LCAweDVCNTUsIDB4MTIwMywgMHg1QjU2LCAweDIwRjAsCisgICAgMHg1QjU3LCAweDA4QzgsIDB4NUI1OCwgMHgwQjE4LCAweDVCNUEsIDB4MTIwNCwgMHg1QjVCLCAweDEyMDUsIDB4NUI1QywKKyAgICAweDA4QTgsIDB4NUI1RCwgMHgwN0I5LCAweDVCNUYsIDB4MEVERSwgMHg1QjYzLCAweDA2NDIsIDB4NUI2NCwgMHgwNzdELAorICAgIDB4NUI2NSwgMHgxMjA2LCAweDVCNjYsIDB4MDVCNiwgMHg1QjY5LCAweDEyMDcsIDB4NUI2QiwgMHgwQjE5LCAweDVCNzAsCisgICAgMHgxMjA4LCAweDVCNzEsIDB4MTIzMCwgMHg1QjczLCAweDEyMDksIDB4NUI3NSwgMHgxMjBBLCAweDVCNzgsIDB4MTIwQiwKKyAgICAweDVCN0EsIDB4MTIwRCwgMHg1QjdDLCAweDM4ODgsIDB4NUI3RSwgMHgzODg5LCAweDVCN0YsIDB4Mzg4QSwgMHg1QjgwLAorICAgIDB4MTIwRSwgMHg1QjgyLCAweDM2MTAsIDB4NUI4MywgMHgxMjBGLCAweDVCODUsIDB4MEI1MCwgMHg1Qjg3LCAweDA0QzksCisgICAgMHg1Qjg4LCAweDA5MTUsIDB4NUI4OSwgMHgwNDg2LCAweDVCOEEsIDB4Mzg4QiwgMHg1QjhCLCAweDBBRDksIDB4NUI4QywKKyAgICAweDA1RUMsIDB4NUI4RCwgMHgwOEUxLCAweDVCOEYsIDB4MDdCQSwgMHg1Qjk1LCAweDBDNjAsIDB4NUI5NywgMHgwOTJCLAorICAgIDB4NUI5OCwgMHgwNUVELCAweDVCOTksIDB4MEJBNiwgMHg1QjlBLCAweDBDMDYsIDB4NUI5QiwgMHgwNDdDLCAweDVCOUMsCisgICAgMHgwNjUzLCAweDVCOUQsIDB4MEU0NSwgMHg1QjlGLCAweDA4RUUsIDB4NUJBMiwgMHgwNjZDLCAweDVCQTMsIDB4MEE4RiwKKyAgICAweDVCQTQsIDB4MDhFOCwgMHg1QkE1LCAweDBGMTIsIDB4NUJBNiwgMHgxMjEwLCAweDVCQUUsIDB4MDY3NiwgMHg1QkIwLAorICAgIDB4MDgzQiwgMHg1QkIzLCAweDA1OTAsIDB4NUJCNCwgMHgwNTA1LCAweDVCQjUsIDB4MDk5NCwgMHg1QkI2LCAweDA1NDgsCisgICAgMHg1QkI4LCAweDEyMTEsIDB4NUJCOSwgMHgwRjMwLCAweDVCQkYsIDB4MDk1MywgMHg1QkMwLCAweDIwRjEsIDB4NUJDMiwKKyAgICAweDA5MTAsIDB4NUJDMywgMHgxMjEyLCAweDVCQzQsIDB4MDYyRiwgMHg1QkM1LCAweDBDQUEsIDB4NUJDNiwgMHgwRUI1LAorICAgIDB4NUJDNywgMHgxMjEzLCAweDVCQzksIDB4MTIxNCwgMHg1QkNDLCAweDBEQ0IsIDB4NUJEMCwgMHgxMjE2LCAweDVCRDIsCisgICAgMHgwNUU0LCAweDVCRDMsIDB4MDZFRiwgMHg1QkQ0LCAweDEyMTUsIDB4NUJEOCwgMHgyMEYzLCAweDVCREIsIDB4MDVFRSwKKyAgICAweDVCREQsIDB4MDlGOCwgMHg1QkRFLCAweDEyMUEsIDB4NUJERiwgMHgwODZGLCAweDVCRTEsIDB4MDU0OSwgMHg1QkUyLAorICAgIDB4MTIxOSwgMHg1QkU0LCAweDEyMTcsIDB4NUJFNSwgMHgxMjFCLCAweDVCRTYsIDB4MTIxOCwgMHg1QkU3LCAweDBDRTEsCisgICAgMHg1QkU4LCAweDE0OEUsIDB4NUJFOSwgMHgwOUY5LCAweDVCRUIsIDB4MTIxQywgMHg1QkVDLCAweDIwRjQsIDB4NUJFRSwKKyAgICAweDBGODgsIDB4NUJGMCwgMHgxMjFELCAweDVCRjMsIDB4MTIxRiwgMHg1QkY1LCAweDBCQkMsIDB4NUJGNiwgMHgxMjFFLAorICAgIDB4NUJGOCwgMHgwQTQ3LCAweDVCRkEsIDB4MDhDOSwgMHg1QkZFLCAweDBCMzAsIDB4NUJGRiwgMHgwOTIzLCAweDVDMDEsCisgICAgMHgwREU3LCAweDVDMDIsIDB4MEE5MCwgMHg1QzA0LCAweDA4RjksIDB4NUMwNSwgMHgxMjIwLCAweDVDMDYsIDB4MDk5NSwKKyAgICAweDVDMDcsIDB4MTIyMSwgMHg1QzA4LCAweDEyMjIsIDB4NUMwOSwgMHgwNDk3LCAweDVDMEEsIDB4MEIxQSwgMHg1QzBCLAorICAgIDB4MEExOCwgMHg1QzBELCAweDEyMjMsIDB4NUMwRSwgMHgwQzhCLCAweDVDMEYsIDB4MDk5NiwgMHg1QzExLCAweDA5OTcsCisgICAgMHg1QzEzLCAweDEyMjQsIDB4NUMxNCwgMHgzNzJBLCAweDVDMTYsIDB4MEE5MSwgMHg1QzE5LCAweDM2MEIsIDB4NUMxQSwKKyAgICAweDA5OTgsIDB4NUMxRSwgMHgyMEY1LCAweDVDMjAsIDB4MTIyNSwgMHg1QzIyLCAweDEyMjYsIDB4NUMyMywgMHgzODhDLAorICAgIDB4NUMyNCwgMHgwRUVDLCAweDVDMjgsIDB4MTIyNywgMHg1QzJCLCAweDM4OEQsIDB4NUMyRCwgMHgwNkJFLCAweDVDMzAsCisgICAgMHgzODhFLCAweDVDMzEsIDB4MDkyQywgMHg1QzM4LCAweDEyMjgsIDB4NUMzOSwgMHgxMjI5LCAweDVDM0EsIDB4MDkwOCwKKyAgICAweDVDM0IsIDB4MDlGMiwgMHg1QzNDLCAweDBDQ0MsIDB4NUMzRCwgMHgwQTFBLCAweDVDM0UsIDB4MEQ4QywgMHg1QzNGLAorICAgIDB4MENEOCwgMHg1QzQwLCAweDA2QzEsIDB4NUM0MSwgMHgxMjJBLCAweDVDNDUsIDB4MDY4OSwgMHg1QzQ2LCAweDEyMkIsCisgICAgMHg1QzQ4LCAweDA2RjYsIDB4NUM0QSwgMHgwQ0E3LCAweDVDNEIsIDB4MDUzMCwgMHg1QzRELCAweDA4QTEsIDB4NUM0RSwKKyAgICAweDEyMkMsIDB4NUM0RiwgMHgxMjJGLCAweDVDNTAsIDB4MTIyRSwgMHg1QzUxLCAweDA2RjUsIDB4NUM1MywgMHgxMjJELAorICAgIDB4NUM1NSwgMHgwQzMyLCAweDVDNUIsIDB4MUU5MiwgMHg1QzVFLCAweDBCMTAsIDB4NUM2MCwgMHgwQzQ1LCAweDVDNjEsCisgICAgMHgwOEY0LCAweDVDNjIsIDB4MUUwRCwgMHg1QzYzLCAweDM4OEYsIDB4NUM2NCwgMHgwQURBLCAweDVDNjUsIDB4MEY2NCwKKyAgICAweDVDNjksIDB4Mzg5MCwgMHg1QzZDLCAweDEyMzEsIDB4NUM2RSwgMHgxMjMyLCAweDVDNkYsIDB4MENBRSwgMHg1QzcxLAorICAgIDB4MDg4MSwgMHg1Qzc2LCAweDEyMzQsIDB4NUM3OSwgMHgxMjM1LCAweDVDN0MsIDB4Mzg5MSwgMHg1QzhDLCAweDEyMzYsCisgICAgMHg1QzkwLCAweDA2MzAsIDB4NUM5MSwgMHgxMjM3LCAweDVDOTQsIDB4MTIzOCwgMHg1Q0ExLCAweDA1MkMsIDB4NUNBNiwKKyAgICAweDIwRjYsIDB4NUNBOCwgMHgwQUJELCAweDVDQTksIDB4MDYyMCwgMHg1Q0FCLCAweDEyM0EsIDB4NUNBQywgMHgwRUI0LAorICAgIDB4NUNCMSwgMHgwQjMyLCAweDVDQjMsIDB4MDVCNywgMHg1Q0I2LCAweDEyM0MsIDB4NUNCNywgMHgxMjNFLCAweDVDQjgsCisgICAgMHgwNjFCLCAweDVDQkEsIDB4MjBGNywgMHg1Q0JCLCAweDEyM0IsIDB4NUNCQywgMHgxMjNELCAweDVDQkUsIDB4MTI0MCwKKyAgICAweDVDQzUsIDB4MTIzRiwgMHg1Q0M3LCAweDEyNDEsIDB4NUNDQiwgMHgzODkyLCAweDVDRDIsIDB4Mzg5MywgMHg1Q0Q5LAorICAgIDB4MTI0MiwgMHg1Q0UwLCAweDBDOTUsIDB4NUNFMSwgMHgwNkE2LCAweDVDRTYsIDB4MzcyQywgMHg1Q0U4LCAweDA1NjUsCisgICAgMHg1Q0U5LCAweDEyNDMsIDB4NUNFQSwgMHgxMjQ4LCAweDVDRUQsIDB4MTI0NiwgMHg1Q0VGLCAweDBFNDcsIDB4NUNGMCwKKyAgICAweDBFNDYsIDB4NUNGNCwgMHgzODk0LCAweDVDRjUsIDB4MjBGOCwgMHg1Q0Y2LCAweDBDNjEsIDB4NUNGQSwgMHgxMjQ1LAorICAgIDB4NUNGQiwgMHgwOTVFLCAweDVDRkQsIDB4MTI0NCwgMHg1RDA3LCAweDBBMzgsIDB4NUQwQiwgMHgxMjQ5LCAweDVEMEUsCisgICAgMHgwODVBLCAweDVEMTEsIDB4MTI0RiwgMHg1RDE0LCAweDEyNTAsIDB4NUQxNSwgMHgxMjRBLCAweDVEMTYsIDB4MDU5MSwKKyAgICAweDVEMTcsIDB4MTI0QiwgMHg1RDE4LCAweDEyNTQsIDB4NUQxOSwgMHgxMjUzLCAweDVEMUEsIDB4MTI1MiwgMHg1RDFCLAorICAgIDB4MTI0RSwgMHg1RDFGLCAweDEyNEQsIDB4NUQyMiwgMHgxMjUxLCAweDVEMjQsIDB4Mzg5NSwgMHg1RDI2LCAweDM4OTYsCisgICAgMHg1RDI3LCAweDIwRjksIDB4NUQyOSwgMHgwRTQ4LCAweDVENDIsIDB4MjBGQywgMHg1RDQzLCAweDM4OTcsIDB4NUQ0NiwKKyAgICAweDM4OTgsIDB4NUQ0QSwgMHgzODk5LCAweDVENEIsIDB4MTI1OCwgMHg1RDRDLCAweDEyNTUsIDB4NUQ0RSwgMHgxMjU3LAorICAgIDB4NUQ1MCwgMHgwRjVDLCAweDVENTIsIDB4MTI1NiwgMHg1RDUzLCAweDIwRkEsIDB4NUQ1QywgMHgxMjRDLCAweDVENjksCisgICAgMHgwQTM5LCAweDVENkMsIDB4MTI1OSwgMHg1RDZELCAweDIwRkQsIDB4NUQ2RiwgMHgwODI3LCAweDVENzMsIDB4MTI1QSwKKyAgICAweDVENzYsIDB4MTI1QiwgMHg1RDgyLCAweDEyNUUsIDB4NUQ4NCwgMHgxMjVELCAweDVEODcsIDB4MTI1QywgMHg1RDhCLAorICAgIDB4MEM2MiwgMHg1RDhDLCAweDEyNDcsIDB4NUQ5MCwgMHgxMjY0LCAweDVEOTIsIDB4Mzg5QSwgMHg1RDk0LCAweDM4OUIsCisgICAgMHg1RDk5LCAweDM4OUMsIDB4NUQ5RCwgMHgxMjYwLCAweDVEQTAsIDB4Mzg5RCwgMHg1REEyLCAweDEyNUYsIDB4NURBQywKKyAgICAweDEyNjEsIDB4NURBRSwgMHgxMjYyLCAweDVEQjIsIDB4M0JBNSwgMHg1REI3LCAweDEyNjUsIDB4NURCOCwgMHgyMEZFLAorICAgIDB4NURCOSwgMHgyMEZGLCAweDVEQkEsIDB4MEZBRSwgMHg1REJDLCAweDEyNjYsIDB4NURCRCwgMHgxMjYzLCAweDVEQzksCisgICAgMHgxMjY3LCAweDVEQ0MsIDB4MDYxQywgMHg1RENELCAweDEyNjgsIDB4NUREMCwgMHgyMTAwLCAweDVERDIsIDB4MTI2QSwKKyAgICAweDVERDMsIDB4MTI2OSwgMHg1REQ2LCAweDEyNkIsIDB4NUREOCwgMHgzODlFLCAweDVEREIsIDB4MTI2QywgMHg1RERELAorICAgIDB4MEE5MiwgMHg1RERFLCAweDA5MkQsIDB4NURFMCwgMHgzODlGLCAweDVERTEsIDB4MDk2RSwgMHg1REUyLCAweDM0MzIsCisgICAgMHg1REUzLCAweDBBRTUsIDB4NURFNSwgMHgwN0JCLCAweDVERTYsIDB4MDgyOCwgMHg1REU3LCAweDA3QkMsIDB4NURFOCwKKyAgICAweDA2OEEsIDB4NURFQiwgMHgxMjZELCAweDVERUUsIDB4MDgyOSwgMHg1REYxLCAweDA3N0UsIDB4NURGMiwgMHgxMjZFLAorICAgIDB4NURGMywgMHgwRUIyLCAweDVERjQsIDB4MENGOSwgMHg1REY1LCAweDEyNkYsIDB4NURGNywgMHgwN0JELCAweDVERjgsCisgICAgMHgzOEEwLCAweDVERkIsIDB4MDVFOCwgMHg1REZELCAweDBCNjUsIDB4NURGRSwgMHgwNkNBLCAweDVERkYsIDB4MzVFMiwKKyAgICAweDVFMDAsIDB4MzhBMSwgMHg1RTAyLCAweDA4QTIsIDB4NUUwMywgMHgwRENELCAweDVFMDYsIDB4MEQ1NSwgMHg1RTBCLAorICAgIDB4MTI3MCwgMHg1RTBDLCAweDA2MzEsIDB4NUUxMSwgMHgxMjczLCAweDVFMTIsIDB4MzhBMiwgMHg1RTE0LCAweDM4QTMsCisgICAgMHg1RTE1LCAweDM4QTQsIDB4NUUxNiwgMHgwQkJELCAweDVFMTgsIDB4MzhBNSwgMHg1RTE5LCAweDEyNzIsIDB4NUUxQSwKKyAgICAweDEyNzEsIDB4NUUxQiwgMHgxMjc0LCAweDVFMUQsIDB4MEMwNywgMHg1RTI1LCAweDBBMjksIDB4NUUyQiwgMHgwOEEzLAorICAgIDB4NUUyRCwgMHgwQTZFLCAweDVFMkUsIDB4MzhBNiwgMHg1RTJGLCAweDBCMzMsIDB4NUUzMCwgMHgwNjNDLCAweDVFMzMsCisgICAgMHgwQkJFLCAweDVFMzYsIDB4MTI3NSwgMHg1RTM3LCAweDEyNzYsIDB4NUUzOCwgMHgwOUQ3LCAweDVFM0QsIDB4MEU2NywKKyAgICAweDVFNDAsIDB4MTI3OSwgMHg1RTQzLCAweDEyNzgsIDB4NUU0NCwgMHgxMjc3LCAweDVFNDUsIDB4MERFRiwgMHg1RTQ3LAorICAgIDB4MTI4MCwgMHg1RTRDLCAweDBFODgsIDB4NUU0RSwgMHgxMjdBLCAweDVFNTQsIDB4MTI3QywgMHg1RTU1LCAweDBFOTksCisgICAgMHg1RTU3LCAweDEyN0IsIDB4NUU1OCwgMHgzOEE3LCAweDVFNUYsIDB4MTI3RCwgMHg1RTYxLCAweDBEM0MsIDB4NUU2MiwKKyAgICAweDEyN0UsIDB4NUU2MywgMHgwRTBFLCAweDVFNjQsIDB4MTI3RiwgMHg1RTZCLCAweDM4QTgsIDB4NUU2QywgMHgzOEE5LAorICAgIDB4NUU3MiwgMHgwNUVGLCAweDVFNzMsIDB4MEUwRiwgMHg1RTc0LCAweDBDRTUsIDB4NUU3NSwgMHgxMjgxLCAweDVFNzYsCisgICAgMHgxMjgyLCAweDVFNzgsIDB4MDdCRSwgMHg1RTc5LCAweDA1RjAsIDB4NUU3QSwgMHgxMjgzLCAweDVFN0IsIDB4MDc2QywKKyAgICAweDVFN0MsIDB4MEYyRSwgMHg1RTdELCAweDBGMTMsIDB4NUU3RSwgMHgwNjMyLCAweDVFN0YsIDB4MTI4NSwgMHg1RTgxLAorICAgIDB4MEJCRiwgMHg1RTgzLCAweDA3QkYsIDB4NUU4NCwgMHgwOTk5LCAweDVFODcsIDB4MEQ3MywgMHg1RThBLCAweDA5OUEsCisgICAgMHg1RThGLCAweDA5ODIsIDB4NUU5NSwgMHgwQzA4LCAweDVFOTYsIDB4MEU0OSwgMHg1RTk3LCAweDBDMzMsIDB4NUU5OSwKKyAgICAweDM2QjAsIDB4NUU5QSwgMHgwN0MwLCAweDVFOUMsIDB4MERDRSwgMHg1RUEwLCAweDEyODYsIDB4NUVBNiwgMHgwQzUzLAorICAgIDB4NUVBNywgMHgwODMyLCAweDVFQTgsIDB4MzhBQSwgMHg1RUFBLCAweDM4QUIsIDB4NUVBQiwgMHgwNzdGLCAweDVFQUQsCisgICAgMHgwQzA5LCAweDVFQjUsIDB4MDQ4NywgMHg1RUI2LCAweDA5NzgsIDB4NUVCNywgMHgwN0MxLCAweDVFQjgsIDB4MEYzMSwKKyAgICAweDVFQkUsIDB4MzhBQywgMHg1RUJGLCAweDM4QUQsIDB4NUVDMSwgMHgxMjg3LCAweDVFQzIsIDB4MTI4OCwgMHg1RUMzLAorICAgIDB4MEQwNywgMHg1RUM4LCAweDEyODksIDB4NUVDOSwgMHgwRkJGLCAweDVFQ0EsIDB4MEZEMywgMHg1RUNCLCAweDM4QUUsCisgICAgMHg1RUNGLCAweDEyOEIsIDB4NUVEMCwgMHgxMjhBLCAweDVFRDIsIDB4MzhBRiwgMHg1RUQzLCAweDA1QTUsIDB4NUVENiwKKyAgICAweDEyOEMsIDB4NUVEQSwgMHgxMjhGLCAweDVFREIsIDB4MTI5MCwgMHg1RURELCAweDEyOEUsIDB4NUVERiwgMHgwREIyLAorICAgIDB4NUVFMCwgMHgwOTlCLCAweDVFRTEsIDB4MTI5MiwgMHg1RUUyLCAweDEyOTEsIDB4NUVFMywgMHgxMjhELCAweDVFRTgsCisgICAgMHgxMjkzLCAweDVFRTksIDB4MTI5NCwgMHg1RUVDLCAweDEyOTUsIDB4NUVGMCwgMHgxMjk4LCAweDVFRjEsIDB4MTI5NiwKKyAgICAweDVFRjMsIDB4MTI5NywgMHg1RUY0LCAweDEyOTksIDB4NUVGNiwgMHgwNTA2LCAweDVFRjcsIDB4MEMwQSwgMHg1RUY4LAorICAgIDB4MTI5QSwgMHg1RUZBLCAweDA3NTAsIDB4NUVGQiwgMHgwNTc2LCAweDVFRkMsIDB4MENFQywgMHg1RUZFLCAweDEyOUIsCisgICAgMHg1RUZGLCAweDBDRDMsIDB4NUYwMSwgMHgwRTJCLCAweDVGMDMsIDB4MTI5QywgMHg1RjA0LCAweDBGRDQsIDB4NUYwNywKKyAgICAweDM4QjAsIDB4NUYwOSwgMHgxMjlELCAweDVGMEEsIDB4MEUxMCwgMHg1RjBCLCAweDEyQTAsIDB4NUYwQywgMHgwRkZBLAorICAgIDB4NUYwRCwgMHgxMDBBLCAweDVGMEUsIDB4MzhCMSwgMHg1RjBGLCAweDA4REMsIDB4NUYxMCwgMHgwQ0NELCAweDVGMTEsCisgICAgMHgxMkExLCAweDVGMTMsIDB4MDY3NywgMHg1RjE0LCAweDBCQzAsIDB4NUYxNSwgMHgwNEJFLCAweDVGMTYsIDB4MTJBMiwKKyAgICAweDVGMTcsIDB4MERGNiwgMHg1RjE4LCAweDA3QzIsIDB4NUYxQiwgMHgwQjhFLCAweDVGMUMsIDB4MzhCMiwgMHg1RjFELAorICAgIDB4MzhCMywgMHg1RjFGLCAweDBDMEIsIDB4NUYyMSwgMHgyMTAxLCAweDVGMjIsIDB4MzhCNCwgMHg1RjI1LCAweDBFRkIsCisgICAgMHg1RjI2LCAweDA3NkQsIDB4NUYyNywgMHgwNzgwLCAweDVGMjgsIDB4MzhCNSwgMHg1RjI5LCAweDEyQTMsIDB4NUYyRCwKKyAgICAweDEyQTQsIDB4NUYyRiwgMHgxMkFBLCAweDVGMzEsIDB4MDkxMSwgMHg1RjM0LCAweDIxMDIsIDB4NUYzNSwgMHgwQkMxLAorICAgIDB4NUYzNiwgMHgzOEI2LCAweDVGMzcsIDB4MDZBNywgMHg1RjM4LCAweDEyQTUsIDB4NUYzQSwgMHgzNTk4LCAweDVGM0IsCisgICAgMHgzOEI3LCAweDVGM0MsIDB4MEQ5RCwgMHg1RjNFLCAweDBCODQsIDB4NUY0MCwgMHgzOEI4LCAweDVGNDEsIDB4MTJBNiwKKyAgICAweDVGNDUsIDB4MjBCMiwgMHg1RjQ4LCAweDEyQTcsIDB4NUY0QSwgMHgwNkE4LCAweDVGNEMsIDB4MTJBOCwgMHg1RjRFLAorICAgIDB4MTJBOSwgMHg1RjUwLCAweDM4QjksIDB4NUY1MSwgMHgxMkFCLCAweDVGNTMsIDB4MEM3MCwgMHg1RjU2LCAweDEyQUMsCisgICAgMHg1RjU3LCAweDEyQUQsIDB4NUY1OCwgMHgzOEJBLCAweDVGNTksIDB4MTJBRSwgMHg1RjVDLCAweDEyOUYsIDB4NUY1RCwKKyAgICAweDEyOUUsIDB4NUY2MSwgMHgxMkFGLCAweDVGNjIsIDB4MDcxNywgMHg1RjY0LCAweDM4QkIsIDB4NUY2NSwgMHgzNkFDLAorICAgIDB4NUY2NiwgMHgwRDk5LCAweDVGNjcsIDB4MjEwMywgMHg1RjY5LCAweDA4M0MsIDB4NUY2QSwgMHgwREE5LCAweDVGNkIsCisgICAgMHgwQkMyLCAweDVGNkMsIDB4MERCRCwgMHg1RjZELCAweDEyQjAsIDB4NUY3MCwgMHgwOTlDLCAweDVGNzEsIDB4MDRFOCwKKyAgICAweDVGNzMsIDB4MTJCMSwgMHg1Rjc3LCAweDEyQjIsIDB4NUY3OSwgMHgwRUZFLCAweDVGN0MsIDB4MEQ3NCwgMHg1RjdGLAorICAgIDB4MTJCNSwgMHg1RjgwLCAweDA1MUYsIDB4NUY4MSwgMHgwQTUwLCAweDVGODIsIDB4MTJCNCwgMHg1RjgzLCAweDEyQjMsCisgICAgMHg1Rjg0LCAweDA3MTgsIDB4NUY4NSwgMHgwQjM0LCAweDVGODcsIDB4MTJCOSwgMHg1Rjg4LCAweDEyQjcsIDB4NUY4OSwKKyAgICAweDM4QkMsIDB4NUY4QSwgMHgxMkI2LCAweDVGOEIsIDB4MEY2RiwgMHg1RjhDLCAweDA3OTksIDB4NUY5MCwgMHgwOTgzLAorICAgIDB4NUY5MSwgMHgxMkI4LCAweDVGOTIsIDB4MEM0NiwgMHg1RjkzLCAweDA5NDgsIDB4NUY5NywgMHgwQzk4LCAweDVGOTgsCisgICAgMHgxMkJDLCAweDVGOTksIDB4MTJCQiwgMHg1RjlDLCAweDM4QkQsIDB4NUY5RSwgMHgxMkJBLCAweDVGQTAsIDB4MTJCRCwKKyAgICAweDVGQTEsIDB4MDc5QSwgMHg1RkE0LCAweDM4QkYsIDB4NUZBNywgMHgzOEJFLCAweDVGQTgsIDB4MTJCRSwgMHg1RkE5LAorICAgIDB4MERFRSwgMHg1RkFBLCAweDA5NjUsIDB4NUZBRCwgMHgxMkJGLCAweDVGQUUsIDB4MEQ4RCwgMHg1RkFGLCAweDM4QzAsCisgICAgMHg1RkIzLCAweDBDOTksIDB4NUZCNCwgMHgwQkMzLCAweDVGQjUsIDB4MzQzOCwgMHg1RkI3LCAweDIxMDQsIDB4NUZCOCwKKyAgICAweDM4QzEsIDB4NUZCOSwgMHgwQzJBLCAweDVGQkMsIDB4MTJDMCwgMHg1RkJELCAweDA2NDUsIDB4NUZDMywgMHgwOUZBLAorICAgIDB4NUZDNCwgMHgzOEMyLCAweDVGQzUsIDB4MEQ5RSwgMHg1RkM5LCAweDM4QzMsIDB4NUZDQywgMHgwNjMzLCAweDVGQ0QsCisgICAgMHgwQ0RDLCAweDVGRDYsIDB4MTJDMSwgMHg1RkQ3LCAweDA4QTQsIDB4NUZEOCwgMHgwRTY4LCAweDVGRDksIDB4MEU2OSwKKyAgICAweDVGREMsIDB4MDUyMCwgMHg1RkRELCAweDEyQzYsIDB4NUZERSwgMHgyMTA1LCAweDVGRTAsIDB4MEJBNywgMHg1RkUxLAorICAgIDB4MzhDNCwgMHg1RkU0LCAweDEyQzMsIDB4NUZFOSwgMHgzOEM1LCAweDVGRUIsIDB4MDU3NywgMHg1RkVELCAweDM4QzYsCisgICAgMHg1RkYwLCAweDEyRjYsIDB4NUZGMSwgMHgxMkM1LCAweDVGRjUsIDB4MENFNiwgMHg1RkY4LCAweDEyQzQsIDB4NUZGQiwKKyAgICAweDEyQzIsIDB4NUZGQywgMHgzOEM3LCAweDVGRkQsIDB4MDgwQywgMHg1RkZGLCAweDEyQzgsIDB4NjAwRSwgMHgxMkNFLAorICAgIDB4NjAwRiwgMHgxMkQ0LCAweDYwMTAsIDB4MTJDQywgMHg2MDEyLCAweDBDNTYsIDB4NjAxNSwgMHgxMkQxLCAweDYwMTYsCisgICAgMHgwRENGLCAweDYwMTcsIDB4MzhDOCwgMHg2MDE5LCAweDEyQ0IsIDB4NjAxQSwgMHgzOEM5LCAweDYwMUIsIDB4MTJEMCwKKyAgICAweDYwMUMsIDB4MEZBRiwgMHg2MDFELCAweDA4QTUsIDB4NjAyMCwgMHgwQjM1LCAweDYwMjEsIDB4MTJDOSwgMHg2MDI1LAorICAgIDB4MDY3OCwgMHg2MDI2LCAweDEyRDMsIDB4NjAyNywgMHgwQTUxLCAweDYwMjgsIDB4MDUwNywgMHg2MDI5LCAweDEyQ0QsCisgICAgMHg2MDJBLCAweDA1NzgsIDB4NjAyQiwgMHgxMkQyLCAweDYwMkYsIDB4MDZBOSwgMHg2MDMxLCAweDEyQ0YsIDB4NjAzMywKKyAgICAweDM4Q0EsIDB4NjAzQSwgMHgxMkQ1LCAweDYwNDEsIDB4MTJENywgMHg2MDQyLCAweDEyRTEsIDB4NjA0MywgMHgxMkRGLAorICAgIDB4NjA0NiwgMHgxMkRDLCAweDYwNEEsIDB4MTJEQiwgMHg2MDRCLCAweDBGQzAsIDB4NjA0RCwgMHgxMkRELCAweDYwNTAsCisgICAgMHgwNkFBLCAweDYwNTIsIDB4MDdDMywgMHg2MDU1LCAweDA5ODQsIDB4NjA1OSwgMHgxMkU0LCAweDYwNUEsIDB4MTJENiwKKyAgICAweDYwNUQsIDB4MjEwNiwgMHg2MDVGLCAweDEyREEsIDB4NjA2MCwgMHgxMkNBLCAweDYwNjEsIDB4MzhDQiwgMHg2MDYyLAorICAgIDB4MDU3QSwgMHg2MDYzLCAweDEyREUsIDB4NjA2NCwgMHgxMkUwLCAweDYwNjUsIDB4MEI4RiwgMHg2MDY4LCAweDA4MTgsCisgICAgMHg2MDY5LCAweDA1MzgsIDB4NjA2QSwgMHgxMkQ4LCAweDYwNkIsIDB4MTJFMywgMHg2MDZDLCAweDEyRTIsIDB4NjA2RCwKKyAgICAweDA2QUIsIDB4NjA2RiwgMHgwQjA5LCAweDYwNzAsIDB4MDVDNCwgMHg2MDc1LCAweDA3MTksIDB4NjA3NywgMHgxMkQ5LAorICAgIDB4NjA3RiwgMHgzOENDLCAweDYwODEsIDB4MTJFNSwgMHg2MDgzLCAweDEyRTgsIDB4NjA4NCwgMHgxMkVBLCAweDYwODUsCisgICAgMHgyMTA3LCAweDYwODksIDB4MDhFOSwgMHg2MDhBLCAweDIxMDgsIDB4NjA4QiwgMHgxMkYwLCAweDYwOEMsIDB4MEMwQywKKyAgICAweDYwOEQsIDB4MTJFNiwgMHg2MDkyLCAweDEyRUUsIDB4NjA5NCwgMHgwNTc5LCAweDYwOTYsIDB4MTJFQywgMHg2MDk3LAorICAgIDB4MTJFRCwgMHg2MDlBLCAweDEyRTksIDB4NjA5QiwgMHgxMkVCLCAweDYwOUUsIDB4MzhDRCwgMHg2MDlGLCAweDA3OUIsCisgICAgMHg2MEEwLCAweDBGMTQsIDB4NjBBMywgMHgwNUYxLCAweDYwQTQsIDB4MzhDRSwgMHg2MEE2LCAweDA0RkIsIDB4NjBBNywKKyAgICAweDEyRUYsIDB4NjBBOSwgMHgwQ0YwLCAweDYwQUEsIDB4MDQ3MSwgMHg2MEIwLCAweDM4Q0YsIDB4NjBCMiwgMHgwRDc1LAorICAgIDB4NjBCMywgMHgxMkM3LCAweDYwQjQsIDB4MTJGNSwgMHg2MEI1LCAweDEyRjksIDB4NjBCNiwgMHgwRUYxLCAweDYwQjgsCisgICAgMHgxMkYyLCAweDYwQkMsIDB4MEM2MywgMHg2MEJELCAweDEyRjcsIDB4NjBDNSwgMHgwOUQ4LCAweDYwQzYsIDB4MTJGOCwKKyAgICAweDYwQzcsIDB4MENBRiwgMHg2MENCLCAweDM4RDAsIDB4NjBEMSwgMHgwRkVELCAweDYwRDMsIDB4MTJGNCwgMHg2MEQ1LAorICAgIDB4MjEwQSwgMHg2MEQ4LCAweDEyRkEsIDB4NjBEQSwgMHgwODBELCAweDYwREIsIDB4MzhEMSwgMHg2MERDLCAweDBBNkYsCisgICAgMHg2MERFLCAweDIxMDksIDB4NjBERiwgMHgwNDk4LCAweDYwRTAsIDB4MTJGMywgMHg2MEUxLCAweDEyRjEsIDB4NjBFMywKKyAgICAweDBBREMsIDB4NjBFNywgMHgxMkU3LCAweDYwRTgsIDB4MDg4MiwgMHg2MEYwLCAweDBCMjYsIDB4NjBGMSwgMHgxMzA2LAorICAgIDB4NjBGMiwgMHgyMTBDLCAweDYwRjMsIDB4MEFERCwgMHg2MEY0LCAweDEzMDEsIDB4NjBGNiwgMHgxMkZFLCAweDYwRjcsCisgICAgMHgxMkZGLCAweDYwRjgsIDB4MzhEMiwgMHg2MEY5LCAweDA5MTIsIDB4NjBGQSwgMHgxMzAyLCAweDYwRkIsIDB4MTMwNSwKKyAgICAweDYxMDAsIDB4MTMwMCwgMHg2MTAxLCAweDA5MkYsIDB4NjEwMywgMHgxMzAzLCAweDYxMDYsIDB4MTJGRCwgMHg2MTA4LAorICAgIDB4MEYwOCwgMHg2MTA5LCAweDBGMDcsIDB4NjEwRCwgMHgxMzA3LCAweDYxMEUsIDB4MTMwOCwgMHg2MTBGLCAweDA0OTksCisgICAgMHg2MTExLCAweDIxMEQsIDB4NjExMiwgMHgzOEQzLCAweDYxMTMsIDB4MzhENCwgMHg2MTE0LCAweDM4RDUsIDB4NjExNSwKKyAgICAweDEyRkMsIDB4NjExQSwgMHgwNkVBLCAweDYxMUIsIDB4MDQ2QSwgMHg2MTFDLCAweDM4RDYsIDB4NjExRiwgMHgwNUYyLAorICAgIDB4NjEyMCwgMHgyMTBCLCAweDYxMjEsIDB4MTMwNCwgMHg2MTI3LCAweDEzMEMsIDB4NjEyOCwgMHgxMzBCLCAweDYxMkMsCisgICAgMHgxMzEwLCAweDYxMzAsIDB4MjEwRiwgMHg2MTM0LCAweDEzMTEsIDB4NjEzNywgMHgyMTBFLCAweDYxM0MsIDB4MTMwRiwKKyAgICAweDYxM0QsIDB4MTMxMiwgMHg2MTNFLCAweDEzMEEsIDB4NjEzRiwgMHgxMzBFLCAweDYxNDIsIDB4MTMxMywgMHg2MTQ0LAorICAgIDB4MTMxNCwgMHg2MTQ3LCAweDEzMDksIDB4NjE0OCwgMHgwOENBLCAweDYxNEEsIDB4MTMwRCwgMHg2MTRCLCAweDBCMzYsCisgICAgMHg2MTRDLCAweDA3QzQsIDB4NjE0RCwgMHgxMkZCLCAweDYxNEUsIDB4MDlGQiwgMHg2MTUzLCAweDEzMjEsIDB4NjE1NSwKKyAgICAweDBFMzksIDB4NjE1OCwgMHgxMzE3LCAweDYxNTksIDB4MTMxOCwgMHg2MTVBLCAweDEzMTksIDB4NjE1RCwgMHgxMzIwLAorICAgIDB4NjE1RiwgMHgxMzFGLCAweDYxNjIsIDB4MEVBQiwgMHg2MTYzLCAweDA1RjMsIDB4NjE2NSwgMHgxMzFELCAweDYxNjcsCisgICAgMHgwNzFCLCAweDYxNjgsIDB4MDU5MiwgMHg2MTZCLCAweDEzMUEsIDB4NjE2RSwgMHgwRjgwLCAweDYxNkYsIDB4MTMxQywKKyAgICAweDYxNzAsIDB4MDQ5QSwgMHg2MTcxLCAweDEzMUUsIDB4NjE3MywgMHgxMzE1LCAweDYxNzQsIDB4MTMxQiwgMHg2MTc1LAorICAgIDB4MTMyMiwgMHg2MTc2LCAweDA3MUEsIDB4NjE3NywgMHgxMzE2LCAweDYxN0MsIDB4MzhENywgMHg2MTdFLCAweDBGNDcsCisgICAgMHg2MTgyLCAweDBGMTUsIDB4NjE4NywgMHgxMzI1LCAweDYxOEEsIDB4MTMyOSwgMHg2MThELCAweDM4RDgsIDB4NjE4RSwKKyAgICAweDBCMDAsIDB4NjE5MCwgMHgwRkMxLCAweDYxOTEsIDB4MTMyQSwgMHg2MTk0LCAweDEzMjcsIDB4NjE5NiwgMHgxMzI0LAorICAgIDB4NjE5OCwgMHgyMTEwLCAweDYxOTksIDB4MTMyMywgMHg2MTlBLCAweDEzMjgsIDB4NjE5RiwgMHgzOEQ5LCAweDYxQTQsCisgICAgMHgwRTAwLCAweDYxQTcsIDB4MEM4QywgMHg2MUE4LCAweDM4REEsIDB4NjFBOSwgMHgwNzFDLCAweDYxQUIsIDB4MTMyQiwKKyAgICAweDYxQUMsIDB4MTMyNiwgMHg2MUFFLCAweDEzMkMsIDB4NjFCMiwgMHgwNzUxLCAweDYxQjYsIDB4MDUzMSwgMHg2MUJBLAorICAgIDB4MTMzNCwgMHg2MUJFLCAweDA1RjQsIDB4NjFDMiwgMHgzOERCLCAweDYxQzMsIDB4MTMzMiwgMHg2MUM2LCAweDEzMzMsCisgICAgMHg2MUM3LCAweDA4MTksIDB4NjFDOCwgMHgxMzMxLCAweDYxQzksIDB4MTMyRiwgMHg2MUNBLCAweDEzMkUsIDB4NjFDQiwKKyAgICAweDEzMzUsIDB4NjFDQywgMHgxMzJELCAweDYxQ0QsIDB4MTMzNywgMHg2MUQwLCAweDA1N0IsIDB4NjFERiwgMHgzOERDLAorICAgIDB4NjFFMywgMHgxMzM5LCAweDYxRTYsIDB4MTMzOCwgMHg2MUYyLCAweDBCQzQsIDB4NjFGNCwgMHgxMzNDLCAweDYxRjYsCisgICAgMHgxMzNBLCAweDYxRjcsIDB4MTMzMCwgMHg2MUY4LCAweDA3NTIsIDB4NjFGQSwgMHgxMzNCLCAweDYxRkMsIDB4MTMzRiwKKyAgICAweDYxRkQsIDB4MTMzRSwgMHg2MUZFLCAweDEzNDAsIDB4NjFGRiwgMHgxMzNELCAweDYyMDAsIDB4MTM0MSwgMHg2MjA4LAorICAgIDB4MTM0MiwgMHg2MjA5LCAweDEzNDMsIDB4NjIwQSwgMHgwRTNBLCAweDYyMEMsIDB4MTM0NSwgMHg2MjBELCAweDEzNDQsCisgICAgMHg2MjBFLCAweDA5NDksIDB4NjIxMCwgMHgwQTUyLCAweDYyMTEsIDB4MDU2NiwgMHg2MjEyLCAweDA1N0MsIDB4NjIxMywKKyAgICAweDIxMTEsIDB4NjIxNCwgMHgxMzQ2LCAweDYyMTUsIDB4MzhERCwgMHg2MjE2LCAweDA0ODMsIDB4NjIxQSwgMHgwQTcwLAorICAgIDB4NjIxQiwgMHgxMzQ3LCAweDYyMUQsIDB4MUE2NCwgMHg2MjFFLCAweDEzNDgsIDB4NjIxRiwgMHgwNzM3LCAweDYyMjEsCisgICAgMHgxMzQ5LCAweDYyMjYsIDB4MEE5MywgMHg2MjI5LCAweDM4REUsIDB4NjIyQSwgMHgxMzRBLCAweDYyMkUsIDB4MTM0QiwKKyAgICAweDYyMkYsIDB4MDY1NCwgMHg2MjMwLCAweDEzNEMsIDB4NjIzMiwgMHgxMzRELCAweDYyMzMsIDB4MTM0RSwgMHg2MjM0LAorICAgIDB4MEIzNywgMHg2MjM2LCAweDM1QkQsIDB4NjIzOCwgMHgwNzgxLCAweDYyM0IsIDB4MEVFRCwgMHg2MjNFLCAweDM0NEUsCisgICAgMHg2MjNGLCAweDBFNkEsIDB4NjI0MCwgMHgwOTc0LCAweDYyNDEsIDB4MTM0RiwgMHg2MjQzLCAweDM4REYsIDB4NjI0NiwKKyAgICAweDM4RTAsIDB4NjI0NywgMHgwQTk0LCAweDYyNDgsIDB4MUIxQSwgMHg2MjQ5LCAweDBENzYsIDB4NjI0QiwgMHgwOTE2LAorICAgIDB4NjI0QywgMHgzOEUxLCAweDYyNEQsIDB4MDgzRCwgMHg2MjRFLCAweDEzNTAsIDB4NjI1MSwgMHgzOEUyLCAweDYyNTMsCisgICAgMHgwQjI3LCAweDYyNTUsIDB4MERGNywgMHg2MjU2LCAweDM4RTMsIDB4NjI1OCwgMHgwQjUxLCAweDYyNUIsIDB4MTM1MywKKyAgICAweDYyNUUsIDB4MTM1MSwgMHg2MjYwLCAweDEzNTQsIDB4NjI2MywgMHgxMzUyLCAweDYyNjgsIDB4MTM1NSwgMHg2MjZFLAorICAgIDB4MEUwMSwgMHg2MjcxLCAweDA0N0IsIDB4NjI3NiwgMHgwREQwLCAweDYyNzksIDB4MEQ3NywgMHg2MjdDLCAweDEzNTYsCisgICAgMHg2MjdFLCAweDEzNTksIDB4NjI3RiwgMHgwOTlELCAweDYyODAsIDB4MDY1NSwgMHg2MjgyLCAweDEzNTcsIDB4NjI4MywKKyAgICAweDEzNUUsIDB4NjI4NCwgMHgwOTlFLCAweDYyODUsIDB4MzVDNSwgMHg2Mjg5LCAweDEzNTgsIDB4NjI4QSwgMHgwQ0ZBLAorICAgIDB4NjI5MSwgMHgwRjQ4LCAweDYyOTIsIDB4MTM1QSwgMHg2MjkzLCAweDEzNUIsIDB4NjI5NCwgMHgxMzVGLCAweDYyOTUsCisgICAgMHgwQzY0LCAweDYyOTYsIDB4MTM1QywgMHg2Mjk3LCAweDA3QzUsIDB4NjI5OCwgMHgwQTgyLCAweDYyOUIsIDB4MTM2RCwKKyAgICAweDYyOUMsIDB4MEQ0OCwgMHg2MjlFLCAweDBCNTIsIDB4NjJBNiwgMHgyMTEyLCAweDYyQUIsIDB4MEQ3OCwgMHg2MkFDLAorICAgIDB4MTNCMiwgMHg2MkIxLCAweDBFNEEsIDB4NjJCNSwgMHgwQzBELCAweDYyQjksIDB4MEVBMywgMHg2MkJCLCAweDEzNjIsCisgICAgMHg2MkJDLCAweDA1MjEsIDB4NjJCRCwgMHgwQkE4LCAweDYyQzIsIDB4MTM2QiwgMHg2MkM0LCAweDM4RTQsIDB4NjJDNSwKKyAgICAweDBCNzIsIDB4NjJDNiwgMHgxMzY1LCAweDYyQzcsIDB4MTM2QywgMHg2MkM4LCAweDEzNjcsIDB4NjJDOSwgMHgxMzZFLAorICAgIDB4NjJDQSwgMHgxMzZBLCAweDYyQ0MsIDB4MTM2OSwgMHg2MkNELCAweDBEMjUsIDB4NjJDRiwgMHgxMzYzLCAweDYyRDAsCisgICAgMHgwNTdELCAweDYyRDEsIDB4MTM2MSwgMHg2MkQyLCAweDA2OEIsIDB4NjJEMywgMHgwQjUzLCAweDYyRDQsIDB4MTM1RCwKKyAgICAweDYyRDcsIDB4MTM2MCwgMHg2MkQ4LCAweDA3QzYsIDB4NjJEOSwgMHgwQTdGLCAweDYyREIsIDB4MDk5RiwgMHg2MkRDLAorICAgIDB4MTM2OCwgMHg2MkRELCAweDBEMDgsIDB4NjJFMCwgMHgwNjhDLCAweDYyRTEsIDB4MDVBNiwgMHg2MkVDLCAweDA1QzUsCisgICAgMHg2MkVELCAweDA5RTcsIDB4NjJFRSwgMHgxMzcwLCAweDYyRUYsIDB4MTM3NSwgMHg2MkYxLCAweDEzNzEsIDB4NjJGMywKKyAgICAweDA3NTMsIDB4NjJGNSwgMHgxMzc2LCAweDYyRjYsIDB4MDg3MCwgMHg2MkY3LCAweDA3RkIsIDB4NjJGQywgMHgzOEU1LAorICAgIDB4NjJGRSwgMHgwOTMwLCAweDYyRkYsIDB4MTM2NCwgMHg2MzAxLCAweDA4Q0IsIDB4NjMwMiwgMHgxMzczLCAweDYzMDcsCisgICAgMHgwOEE2LCAweDYzMDgsIDB4MTM3NCwgMHg2MzA5LCAweDA0ODgsIDB4NjMwQSwgMHgzOEU2LCAweDYzMEMsIDB4MTM2RiwKKyAgICAweDYzMEQsIDB4MzhFNywgMHg2MzExLCAweDBCQzUsIDB4NjMxOCwgMHgzOEU4LCAweDYzMTksIDB4MDY4RCwgMHg2MzFCLAorICAgIDB4MzczNywgMHg2MzFGLCAweDA2QUMsIDB4NjMyNywgMHgxMzcyLCAweDYzMjgsIDB4MDQ2QiwgMHg2MzJCLCAweDA4MzMsCisgICAgMHg2MzJGLCAweDA5RkMsIDB4NjMzOSwgMHgzOEU5LCAweDYzM0EsIDB4MEMwRSwgMHg2MzNELCAweDBENjgsIDB4NjMzRSwKKyAgICAweDEzNzgsIDB4NjMzRiwgMHgwQUUwLCAweDYzNDIsIDB4MzhFQSwgMHg2MzQzLCAweDM4RUIsIDB4NjM0OSwgMHgwQjBBLAorICAgIDB4NjM0QywgMHgwODc5LCAweDYzNEQsIDB4MTM3OSwgMHg2MzRGLCAweDEzN0IsIDB4NjM1MCwgMHgxMzc3LCAweDYzNTUsCisgICAgMHgwRTMxLCAweDYzNTcsIDB4MEJEOSwgMHg2MzVDLCAweDBBREUsIDB4NjM2NSwgMHgzOEVDLCAweDYzNjcsIDB4MEU0QiwKKyAgICAweDYzNjgsIDB4MDhGQSwgMHg2MzY5LCAweDEzODcsIDB4NjM2QiwgMHgxMzg2LCAweDYzNkUsIDB4MEEzRSwgMHg2MzcyLAorICAgIDB4MDc1NCwgMHg2Mzc0LCAweDM4RUQsIDB4NjM3NiwgMHgxMzgwLCAweDYzNzcsIDB4MDlBMSwgMHg2MzdBLCAweDBDQzAsCisgICAgMHg2MzdCLCAweDBDRTcsIDB4NjM3RCwgMHgzOEVFLCAweDYzODAsIDB4MTM3RSwgMHg2MzgzLCAweDBBREYsIDB4NjM4NCwKKyAgICAweDM4RUYsIDB4NjM4NywgMHgzOEYwLCAweDYzODgsIDB4MDkyNCwgMHg2Mzg5LCAweDEzODMsIDB4NjM4QywgMHgwOUEwLAorICAgIDB4NjM4RSwgMHgxMzdELCAweDYzOEYsIDB4MTM4MiwgMHg2MzkwLCAweDM4RjEsIDB4NjM5MiwgMHgwRDA5LCAweDYzOTYsCisgICAgMHgxMzdDLCAweDYzOTgsIDB4MDZGNywgMHg2MzlCLCAweDA1QkIsIDB4NjM5RSwgMHgzOEYyLCAweDYzOUYsIDB4MTM4NCwKKyAgICAweDYzQTAsIDB4MEY3MywgMHg2M0ExLCAweDA4M0UsIDB4NjNBMiwgMHgwQjczLCAweDYzQTMsIDB4MTM4MSwgMHg2M0E1LAorICAgIDB4MEE4MCwgMHg2M0E3LCAweDA3QzcsIDB4NjNBOCwgMHgwQTJBLCAweDYzQTksIDB4MDUwOCwgMHg2M0FBLCAweDBBQkUsCisgICAgMHg2M0FCLCAweDEzN0YsIDB4NjNBQywgMHgwNjVGLCAweDYzQjIsIDB4MDcxRCwgMHg2M0I0LCAweDBCRUIsIDB4NjNCNSwKKyAgICAweDEzODUsIDB4NjNCQiwgMHgwQUUxLCAweDYzQkUsIDB4MTM4OCwgMHg2M0MwLCAweDEzOEEsIDB4NjNDMywgMHgwQjE3LAorICAgIDB4NjNDNCwgMHgxMzkwLCAweDYzQzYsIDB4MTM4QiwgMHg2M0M5LCAweDEzOEQsIDB4NjNDRiwgMHgwREIzLCAweDYzRDAsCisgICAgMHgwQzBGLCAweDYzRDEsIDB4MzhGMywgMHg2M0QyLCAweDEzOEUsIDB4NjNENiwgMHgwRjE2LCAweDYzREEsIDB4MEYzMiwKKyAgICAweDYzREIsIDB4MDVGNSwgMHg2M0RDLCAweDM4RjQsIDB4NjNFMSwgMHgwNDcyLCAweDYzRTMsIDB4MTM4QywgMHg2M0U5LAorICAgIDB4MTM4OSwgMHg2M0VELCAweDM0MUMsIDB4NjNFRSwgMHgwNjM0LCAweDYzRjQsIDB4MDUwOSwgMHg2M0Y1LCAweDIxMTMsCisgICAgMHg2M0Y2LCAweDEzOEYsIDB4NjNGNywgMHgzNjQ0LCAweDYzRkEsIDB4MEYzMywgMHg2NDA2LCAweDEzOTMsIDB4NjQwOSwKKyAgICAweDM4RjUsIDB4NjQwRCwgMHgwQjFCLCAweDY0MEYsIDB4MTM5QSwgMHg2NDEwLCAweDM4RjYsIDB4NjQxMywgMHgxMzk0LAorICAgIDB4NjQxNCwgMHgxRTJDLCAweDY0MTYsIDB4MTM5MSwgMHg2NDE3LCAweDEzOTgsIDB4NjQxQywgMHgxMzdBLCAweDY0MjIsCisgICAgMHgzOEY3LCAweDY0MjYsIDB4MTM5NSwgMHg2NDI4LCAweDEzOTksIDB4NjQyQywgMHgwRDU2LCAweDY0MkQsIDB4MEM2NSwKKyAgICAweDY0MzQsIDB4MTM5MiwgMHg2NDM2LCAweDEzOTYsIDB4NjQzQSwgMHgwNzFFLCAweDY0M0UsIDB4MDg2MSwgMHg2NDQyLAorICAgIDB4MEE4MSwgMHg2NDRFLCAweDEzOUUsIDB4NjQ1MSwgMHgxRTQzLCAweDY0NTQsIDB4MzhGOCwgMHg2NDU4LCAweDBDMjAsCisgICAgMHg2NDVCLCAweDM4RjksIDB4NjQ2MCwgMHgyMTE0LCAweDY0NjcsIDB4MTM5QiwgMHg2NDY5LCAweDBFOEUsIDB4NjQ2RCwKKyAgICAweDM4RkEsIDB4NjQ2RiwgMHgxMzlDLCAweDY0NzYsIDB4MTM5RCwgMHg2NDc4LCAweDBFREEsIDB4NjQ3QSwgMHgwQTQ2LAorICAgIDB4NjQ3QiwgMHgzOEZCLCAweDY0ODMsIDB4MDczOCwgMHg2NDg4LCAweDEzQTQsIDB4NjQ5MiwgMHgwODgzLCAweDY0OTMsCisgICAgMHgxM0ExLCAweDY0OTUsIDB4MTNBMCwgMHg2NDlBLCAweDBDRTgsIDB4NjQ5RCwgMHgyMTE1LCAweDY0OUUsIDB4MEM4RCwKKyAgICAweDY0QTQsIDB4MEMyQiwgMHg2NEE1LCAweDEzQTIsIDB4NjRBOSwgMHgxM0EzLCAweDY0QUIsIDB4MERFMSwgMHg2NEFELAorICAgIDB4MENGQiwgMHg2NEFFLCAweDA4NzEsIDB4NjRCMCwgMHgwQTk1LCAweDY0QjIsIDB4MEU3RSwgMHg2NEI5LCAweDA1QTcsCisgICAgMHg2NEJCLCAweDEzQUEsIDB4NjRCQywgMHgxM0E1LCAweDY0QkUsIDB4MzhGQywgMHg2NEJGLCAweDM4RkQsIDB4NjRDMSwKKyAgICAweDBGMzQsIDB4NjRDMiwgMHgxM0FDLCAweDY0QzUsIDB4MTNBOCwgMHg2NEM3LCAweDEzQTksIDB4NjRDQSwgMHgzNDFELAorICAgIDB4NjRDRCwgMHgwQUUyLCAweDY0Q0UsIDB4MjExNiwgMHg2NEQyLCAweDEzQTcsIDB4NjRENCwgMHgxMzY2LCAweDY0RDgsCisgICAgMHgxM0FCLCAweDY0REEsIDB4MTNBNiwgMHg2NEUwLCAweDEzQjAsIDB4NjRFMSwgMHgxM0IxLCAweDY0RTIsIDB4MEMyMSwKKyAgICAweDY0RTMsIDB4MTNCMywgMHg2NEU1LCAweDM4RkUsIDB4NjRFNiwgMHgwODcyLCAweDY0RTcsIDB4MTNBRSwgMHg2NEVDLAorICAgIDB4MDY1NiwgMHg2NEVGLCAweDEzQjQsIDB4NjRGMSwgMHgxM0FELCAweDY0RjIsIDB4MTNCOCwgMHg2NEY0LCAweDEzQjcsCisgICAgMHg2NEY2LCAweDEzQjYsIDB4NjRGNywgMHgzOEZGLCAweDY0RkEsIDB4MTNCOSwgMHg2NEZCLCAweDM5MDAsIDB4NjRGRCwKKyAgICAweDEzQkIsIDB4NjRGRSwgMHgwOUQ5LCAweDY1MDAsIDB4MTNCQSwgMHg2NTA0LCAweDM5MDEsIDB4NjUwNSwgMHgxM0JFLAorICAgIDB4NjUxNiwgMHgzOTAyLCAweDY1MTgsIDB4MTNCQywgMHg2NTE5LCAweDM5MDMsIDB4NjUxQywgMHgxM0JELCAweDY1MUQsCisgICAgMHgxMzk3LCAweDY1MjIsIDB4MUU5NywgMHg2NTIzLCAweDEzQzAsIDB4NjUyNCwgMHgxM0JGLCAweDY1MkEsIDB4MTM5RiwKKyAgICAweDY1MkIsIDB4MTNDMSwgMHg2NTJDLCAweDEzQjUsIDB4NjUyRiwgMHgwOEE3LCAweDY1MzQsIDB4MTNDMiwgMHg2NTM1LAorICAgIDB4MTNDMywgMHg2NTM2LCAweDEzQzUsIDB4NjUzNywgMHgxM0M0LCAweDY1MzgsIDB4MTNDNiwgMHg2NTM5LCAweDA1N0UsCisgICAgMHg2NTNCLCAweDA3QzgsIDB4NjUzRSwgMHgwRTRDLCAweDY1M0YsIDB4MEE1MywgMHg2NTQ1LCAweDA3ODIsIDB4NjU0NywKKyAgICAweDM5MDQsIDB4NjU0OCwgMHgxM0M4LCAweDY1NEQsIDB4MTNDQiwgMHg2NTRFLCAweDIxMTcsIDB4NjU0RiwgMHgwREM0LAorICAgIDB4NjU1MSwgMHgwNjc5LCAweDY1NTUsIDB4MTNDQSwgMHg2NTU2LCAweDEzQzksIDB4NjU1NywgMHgwRDBBLCAweDY1NTgsCisgICAgMHgxM0NDLCAweDY1NTksIDB4MDZBRCwgMHg2NTVELCAweDEzQ0UsIDB4NjU1RSwgMHgxM0NELCAweDY1NjIsIDB4MDVGNiwKKyAgICAweDY1NjMsIDB4MDg4NCwgMHg2NTY2LCAweDBDQjAsIDB4NjU2NywgMHgzOTA1LCAweDY1NkMsIDB4MDcxRiwgMHg2NTcwLAorICAgIDB4MEEzQSwgMHg2NTcyLCAweDEzQ0YsIDB4NjU3NCwgMHgwQTU0LCAweDY1NzUsIDB4MEMyMiwgMHg2NTc3LCAweDBERDEsCisgICAgMHg2NTc4LCAweDEzRDAsIDB4NjU4MSwgMHgzOTA2LCAweDY1ODIsIDB4MTNEMSwgMHg2NTgzLCAweDEzRDIsIDB4NjU4NSwKKyAgICAweDM5MDcsIDB4NjU4NywgMHgwRTA4LCAweDY1ODgsIDB4MTIwQywgMHg2NTg5LCAweDBBNkEsIDB4NjU4QywgMHgwREJFLAorICAgIDB4NjU4RSwgMHgwODQ4LCAweDY1OTAsIDB4MEQ3OSwgMHg2NTkxLCAweDBENTcsIDB4NjU5NywgMHgwQzQ3LCAweDY1OTksCisgICAgMHgwRjg5LCAweDY1OUIsIDB4MTNENCwgMHg2NTlDLCAweDA4RkMsIDB4NjU5RiwgMHgxM0Q1LCAweDY1QTEsIDB4MDQ3QSwKKyAgICAweDY1QTQsIDB4MDZDQywgMHg2NUE1LCAweDBBNzEsIDB4NjVBNywgMHgwREQyLCAweDY1QUIsIDB4MTNENiwgMHg2NUFDLAorICAgIDB4MDg5MCwgMHg2NUFELCAweDBCODUsIDB4NjVBRiwgMHgwOEE5LCAweDY1QjAsIDB4MDlGRCwgMHg2NUI3LCAweDEzRDcsCisgICAgMHg2NUI5LCAweDBFNEQsIDB4NjVCQywgMHgwNTE5LCAweDY1QkQsIDB4MDhBQSwgMHg2NUMxLCAweDEzREEsIDB4NjVDMiwKKyAgICAweDM5MDgsIDB4NjVDMywgMHgxM0Q4LCAweDY1QzQsIDB4MTNEQiwgMHg2NUM1LCAweDBGODEsIDB4NjVDNiwgMHgxM0Q5LAorICAgIDB4NjVDQiwgMHgwQTlGLCAweDY1Q0MsIDB4MTNEQywgMHg2NUNGLCAweDBCMTIsIDB4NjVEMiwgMHgxM0RELCAweDY1RDcsCisgICAgMHgwNjM2LCAweDY1RDksIDB4MTNERiwgMHg2NURCLCAweDEzREUsIDB4NjVFMCwgMHgxM0UwLCAweDY1RTEsIDB4MTNFMSwKKyAgICAweDY1RTIsIDB4MDYzNywgMHg2NUUzLCAweDM1ODUsIDB4NjVFNSwgMHgwQ0Q0LCAweDY1RTYsIDB4MEI3NCwgMHg2NUU3LAorICAgIDB4MDY4NiwgMHg2NUU4LCAweDA4QUIsIDB4NjVFOSwgMHgwQUUzLCAweDY1RUMsIDB4MDk2NiwgMHg2NUVELCAweDA0NzQsCisgICAgMHg2NUYwLCAweDM5MDksIDB4NjVGMSwgMHgxM0UyLCAweDY1RjIsIDB4MzkwQSwgMHg2NUZBLCAweDA1MjIsIDB4NjVGQiwKKyAgICAweDEzRTYsIDB4NjYwMCwgMHgyMTE4LCAweDY2MDIsIDB4MDdDOSwgMHg2NjAzLCAweDEzRTUsIDB4NjYwNiwgMHgwODFCLAorICAgIDB4NjYwNywgMHgwOUEyLCAweDY2MDksIDB4MjExQSwgMHg2NjBBLCAweDEzRTQsIDB4NjYwQywgMHgwOUEzLCAweDY2MEUsCisgICAgMHgwRUNDLCAweDY2MEYsIDB4MDgxQSwgMHg2NjEzLCAweDA0OUIsIDB4NjYxNCwgMHgwQTcyLCAweDY2MTUsIDB4MjExOSwKKyAgICAweDY2MUMsIDB4MTNFQiwgMHg2NjFFLCAweDIxMUMsIDB4NjYxRiwgMHgwQTU1LCAweDY2MjAsIDB4MDRFOSwgMHg2NjI0LAorICAgIDB4MjExRCwgMHg2NjI1LCAweDA5NUYsIDB4NjYyNywgMHgwRTk0LCAweDY2MjgsIDB4MDg2MiwgMHg2NjJDLCAweDM5MEIsCisgICAgMHg2NjJELCAweDA5QTQsIDB4NjYyRSwgMHgyMTFCLCAweDY2MkYsIDB4MEE0QiwgMHg2NjMxLCAweDIwQUUsIDB4NjYzNCwKKyAgICAweDEzRUEsIDB4NjYzNSwgMHgxM0U4LCAweDY2MzYsIDB4MTNFOSwgMHg2NjNCLCAweDFFMDAsIDB4NjYzQywgMHgwQkE5LAorICAgIDB4NjYzRiwgMHgxNDA5LCAweDY2NDEsIDB4MTNFRiwgMHg2NjQyLCAweDA4Q0MsIDB4NjY0MywgMHgwN0NBLCAweDY2NDQsCisgICAgMHgxM0VELCAweDY2NDksIDB4MTNFRSwgMHg2NjRCLCAweDA5RkUsIDB4NjY0QywgMHgzOTBDLCAweDY2NEYsIDB4MTNFQywKKyAgICAweDY2NTIsIDB4MDg3RCwgMHg2NjU3LCAweDIxMUYsIDB4NjY1OSwgMHgyMTIwLCAweDY2NUIsIDB4MzkwRCwgMHg2NjVDLAorICAgIDB4MzkwRSwgMHg2NjVELCAweDEzRjEsIDB4NjY1RSwgMHgxM0YwLCAweDY2NUYsIDB4MTNGNSwgMHg2NjYxLCAweDM5MEYsCisgICAgMHg2NjYyLCAweDEzRjYsIDB4NjY2MywgMHgzNzNBLCAweDY2NjQsIDB4MTNGMiwgMHg2NjY1LCAweDIxMUUsIDB4NjY2NiwKKyAgICAweDA1ODAsIDB4NjY2NywgMHgxM0YzLCAweDY2NjgsIDB4MTNGNCwgMHg2NjY5LCAweDBENjksIDB4NjY2QiwgMHgzOTEwLAorICAgIDB4NjY2RSwgMHgwREQzLCAweDY2NkYsIDB4MDcyMCwgMHg2NjcwLCAweDEzRjcsIDB4NjY3MywgMHgyMTIyLCAweDY2NzQsCisgICAgMHgwQTU2LCAweDY2NzYsIDB4MDlBNSwgMHg2Njc3LCAweDM5MTEsIDB4NjY3QSwgMHgwQjkwLCAweDY2ODEsIDB4MDZCRiwKKyAgICAweDY2ODMsIDB4MTNGOCwgMHg2Njg0LCAweDEzRkMsIDB4NjY4NywgMHgwNTRCLCAweDY2ODgsIDB4MTNGOSwgMHg2Njg5LAorICAgIDB4MTNGQiwgMHg2NjhFLCAweDEzRkEsIDB4NjY5MSwgMHgwOTc1LCAweDY2OTYsIDB4MEI4NiwgMHg2Njk3LCAweDA0ODksCisgICAgMHg2Njk4LCAweDEzRkQsIDB4NjY5OSwgMHgyMTIzLCAweDY2OUQsIDB4MTNGRSwgMHg2NkEwLCAweDIxMjQsIDB4NjZBMiwKKyAgICAweDBCQzYsIDB4NjZBNCwgMHgzOTEyLCAweDY2QTYsIDB4MEZCOSwgMHg2NkFCLCAweDA4OTEsIDB4NjZBRSwgMHgwRTNCLAorICAgIDB4NjZCMiwgMHgyMTI1LCAweDY2QjQsIDB4MEU2QiwgMHg2NkI4LCAweDE0MDUsIDB4NjZCOSwgMHgxNDAwLCAweDY2QkMsCisgICAgMHgxNDAzLCAweDY2QkUsIDB4MTQwMiwgMHg2NkJGLCAweDIxMjYsIDB4NjZDMSwgMHgxM0ZGLCAweDY2QzQsIDB4MTQwNCwKKyAgICAweDY2QzYsIDB4MzQ1NSwgMHg2NkM3LCAweDBDQjYsIDB4NjZDOCwgMHgzOTEzLCAweDY2QzksIDB4MTQwMSwgMHg2NkQ2LAorICAgIDB4MTQwNiwgMHg2NkQ5LCAweDA5NzYsIDB4NjZEQSwgMHgxNDA3LCAweDY2REMsIDB4MEYzNSwgMHg2NkRELCAweDBEMkUsCisgICAgMHg2NkUwLCAweDE0MDgsIDB4NjZFNiwgMHgxNDBBLCAweDY2RTksIDB4MTQwQiwgMHg2NkVDLCAweDM5MTQsIDB4NjZGMCwKKyAgICAweDE0MEMsIDB4NjZGMiwgMHgwNkMyLCAweDY2RjMsIDB4MDRFQSwgMHg2NkY0LCAweDA3Q0IsIDB4NjZGNSwgMHgxNDBELAorICAgIDB4NjZGNywgMHgxNDBFLCAweDY2RjgsIDB4MDk3QiwgMHg2NkY5LCAweDBBRTQsIDB4NjZGQSwgMHgyMTI3LCAweDY2RkIsCisgICAgMHgyMEIxLCAweDY2RkMsIDB4MTBFRCwgMHg2NkZELCAweDBBQzAsIDB4NjZGRSwgMHgwQUJGLCAweDY2RkYsIDB4MEIzOCwKKyAgICAweDY3MDAsIDB4MDgzNywgMHg2NzAzLCAweDEwNEIsIDB4NjcwNSwgMHgzOTE1LCAweDY3MDgsIDB4MDc0NCwgMHg2NzA5LAorICAgIDB4MEYxNywgMHg2NzBCLCAweDBFNEUsIDB4NjcwRCwgMHgwREYwLCAweDY3MEUsIDB4MjEyOCwgMHg2NzBGLCAweDE0MEYsCisgICAgMHg2NzEzLCAweDM5MTYsIDB4NjcxNCwgMHgwODYzLCAweDY3MTUsIDB4MEJEQiwgMHg2NzE2LCAweDE0MTAsIDB4NjcxNywKKyAgICAweDBGRDUsIDB4NjcxQiwgMHgwRTZDLCAweDY3MUQsIDB4MEJDNywgMHg2NzFFLCAweDE0MTEsIDB4NjcxRiwgMHgwNjM4LAorICAgIDB4NjcyNiwgMHgxNDEyLCAweDY3MjcsIDB4MTQxMywgMHg2NzI4LCAweDBFRTYsIDB4NjcyQSwgMHgwRUIwLCAweDY3MkIsCisgICAgMHgwRUE0LCAweDY3MkMsIDB4MEU4QSwgMHg2NzJELCAweDA4NzMsIDB4NjcyRSwgMHgxNDE1LCAweDY3MzEsIDB4MDkxNywKKyAgICAweDY3MzMsIDB4MzkxNywgMHg2NzM0LCAweDBFN0YsIDB4NjczNiwgMHgxNDE3LCAweDY3MzcsIDB4MTQxQSwgMHg2NzM4LAorICAgIDB4MTQxOSwgMHg2NzNBLCAweDA2MzUsIDB4NjczRCwgMHgwNjdBLCAweDY3M0YsIDB4MTQxNiwgMHg2NzQxLCAweDE0MTgsCisgICAgMHg2NzQzLCAweDM1QjcsIDB4Njc0NiwgMHgxNDFCLCAweDY3NDgsIDB4MzkxOCwgMHg2NzQ5LCAweDBBM0YsIDB4Njc0QywKKyAgICAweDM5MTksIDB4Njc0RSwgMHgwRjY1LCAweDY3NEYsIDB4MDQ4RCwgMHg2NzUwLCAweDA4NTAsIDB4Njc1MSwgMHgwQjFDLAorICAgIDB4Njc1MywgMHgwOTA5LCAweDY3NTYsIDB4MDlEQiwgMHg2NzU5LCAweDE0MUUsIDB4Njc1QywgMHgwQzQ4LCAweDY3NUUsCisgICAgMHgxNDFDLCAweDY3NUYsIDB4MEIwQiwgMHg2NzYwLCAweDE0MUQsIDB4Njc2MSwgMHgwOURBLCAweDY3NjIsIDB4MEVFOSwKKyAgICAweDY3NjMsIDB4MTQxRiwgMHg2NzY0LCAweDE0MjAsIDB4Njc2NSwgMHgwRjUyLCAweDY3NjYsIDB4MjEyQSwgMHg2NzZBLAorICAgIDB4MTQyNSwgMHg2NzZELCAweDA3Q0MsIDB4Njc2RSwgMHgzNTcxLCAweDY3NkYsIDB4MEQwQiwgMHg2NzcwLCAweDE0MjIsCisgICAgMHg2NzcxLCAweDBDNjYsIDB4Njc3MiwgMHgxM0UzLCAweDY3NzMsIDB4MTNFNywgMHg2Nzc1LCAweDA2NjksIDB4Njc3NiwKKyAgICAweDM5MUEsIDB4Njc3NywgMHgwQ0ZELCAweDY3N0IsIDB4MzkxQiwgMHg2NzdDLCAweDE0MjQsIDB4Njc3RSwgMHgwOUE2LAorICAgIDB4Njc3RiwgMHgwRDU4LCAweDY3ODUsIDB4MTQyQSwgMHg2Nzg3LCAweDBEOEUsIDB4Njc4OSwgMHgxNDIxLCAweDY3OEIsCisgICAgMHgxNDI3LCAweDY3OEMsIDB4MTQyNiwgMHg2NzkwLCAweDBBNzMsIDB4Njc5NSwgMHgwRTlCLCAweDY3OTcsIDB4MEY5QiwKKyAgICAweDY3OUEsIDB4MEU5NSwgMHg2NzlDLCAweDA1NEMsIDB4Njc5RCwgMHgwOEFDLCAweDY3QTAsIDB4MEZFRSwgMHg2N0ExLAorICAgIDB4MTQyOSwgMHg2N0EyLCAweDBBM0IsIDB4NjdBNiwgMHgxNDI4LCAweDY3QTksIDB4MTQyMywgMHg2N0FGLCAweDA3ODMsCisgICAgMHg2N0IwLCAweDM5MUMsIDB4NjdCMiwgMHgzOTFELCAweDY3QjMsIDB4MTQyRiwgMHg2N0I0LCAweDE0MkQsIDB4NjdCNiwKKyAgICAweDA1NEQsIDB4NjdCNywgMHgxNDJCLCAweDY3QjgsIDB4MTQzMSwgMHg2N0I5LCAweDE0MzcsIDB4NjdCQiwgMHgyMTJCLAorICAgIDB4NjdDMCwgMHgyMTJELCAweDY3QzEsIDB4MEIyOCwgMHg2N0M0LCAweDBFMTEsIDB4NjdDNiwgMHgxNDM5LCAweDY3Q0EsCisgICAgMHgwRDk0LCAweDY3Q0UsIDB4MTQzOCwgMHg2N0NGLCAweDBEMjYsIDB4NjdEMCwgMHgwRTZELCAweDY3RDEsIDB4MDVGNywKKyAgICAweDY3RDMsIDB4MEE5QiwgMHg2N0Q0LCAweDA5NEEsIDB4NjdENywgMHgzOTFGLCAweDY3RDgsIDB4MEJFRiwgMHg2N0Q5LAorICAgIDB4MzkyMCwgMHg2N0RBLCAweDBGMTgsIDB4NjdERCwgMHgxNDM0LCAweDY3REUsIDB4MTQzMywgMHg2N0UyLCAweDE0MzUsCisgICAgMHg2N0U0LCAweDE0MzIsIDB4NjdFNywgMHgxNDNBLCAweDY3RTksIDB4MTQzMCwgMHg2N0VDLCAweDE0MkUsIDB4NjdFRSwKKyAgICAweDE0MzYsIDB4NjdFRiwgMHgxNDJDLCAweDY3RjAsIDB4MzkyMSwgMHg2N0YxLCAweDBCQUEsIDB4NjdGMywgMHgwRjA0LAorICAgIDB4NjdGNCwgMHgwOEYyLCAweDY3RjUsIDB4MDg2NCwgMHg2N0Y5LCAweDM5MUUsIDB4NjdGQiwgMHgwODJBLCAweDY3RkUsCisgICAgMHgwRTlELCAweDY3RkYsIDB4MDU5RiwgMHg2ODAxLCAweDIxMkUsIDB4NjgwMiwgMHgwQkVBLCAweDY4MDMsIDB4MENBMiwKKyAgICAweDY4MDQsIDB4MDRFQiwgMHg2ODA1LCAweDFFMDcsIDB4NjgxMywgMHgwQTk2LCAweDY4MTYsIDB4MEE1OCwgMHg2ODE3LAorICAgIDB4MDcwMCwgMHg2ODFFLCAweDE0M0MsIDB4NjgyMSwgMHgwN0NELCAweDY4MjIsIDB4MDVEQSwgMHg2ODI5LCAweDE0M0UsCisgICAgMHg2ODJBLCAweDA1RDIsIDB4NjgyQiwgMHgxNDQ0LCAweDY4MkMsIDB4MzkyMiwgMHg2ODMwLCAweDM5MjMsIDB4NjgzMSwKKyAgICAweDM5MjQsIDB4NjgzMiwgMHgxNDQxLCAweDY4MzQsIDB4MEE5NywgMHg2ODM4LCAweDA1QTksIDB4NjgzOSwgMHgwODFDLAorICAgIDB4NjgzQywgMHgwNUE4LCAweDY4M0QsIDB4MDgzRiwgMHg2ODQwLCAweDE0M0YsIDB4Njg0MSwgMHgwNzNCLCAweDY4NDIsCisgICAgMHgwNzIxLCAweDY4NDMsIDB4MEM2NywgMHg2ODQ0LCAweDIxMkYsIDB4Njg0NiwgMHgxNDNELCAweDY4NDgsIDB4MDQ4QSwKKyAgICAweDY4NEQsIDB4MTQ0MCwgMHg2ODRFLCAweDE0NDIsIDB4Njg1MCwgMHgwNkM1LCAweDY4NTEsIDB4MDcwMiwgMHg2ODUyLAorICAgIDB4MjEyQywgMHg2ODUzLCAweDA1RjgsIDB4Njg1NCwgMHgwNjY1LCAweDY4NTksIDB4MTQ0NSwgMHg2ODVCLCAweDM5MjUsCisgICAgMHg2ODVDLCAweDA4NjksIDB4Njg1RCwgMHgwRTlGLCAweDY4NUYsIDB4MDg4NSwgMHg2ODYzLCAweDE0NDYsIDB4Njg2NywKKyAgICAweDBEQTIsIDB4Njg3MiwgMHgzOTI2LCAweDY4NzQsIDB4MTQ1MiwgMHg2ODc1LCAweDM5MjcsIDB4Njg3NiwgMHgwNTMzLAorICAgIDB4Njg3NywgMHgxNDQ3LCAweDY4N0EsIDB4MzkyOCwgMHg2ODdFLCAweDE0NTgsIDB4Njg3RiwgMHgxNDQ4LCAweDY4ODEsCisgICAgMHgwRjhBLCAweDY4ODMsIDB4MTQ0RiwgMHg2ODg0LCAweDM5MjksIDB4Njg4NSwgMHgwRDE1LCAweDY4OEQsIDB4MTQ1NywKKyAgICAweDY4OEUsIDB4MUU5QywgMHg2ODhGLCAweDE0NEEsIDB4Njg5MywgMHgwNDc4LCAweDY4OTQsIDB4MTQ0QywgMHg2ODk3LAorICAgIDB4MDdDRSwgMHg2ODlCLCAweDE0NEUsIDB4Njg5RCwgMHgxNDRELCAweDY4OUYsIDB4MTQ0OSwgMHg2OEEwLCAweDE0NTQsCisgICAgMHg2OEEyLCAweDA5QTcsIDB4NjhBNSwgMHgzOTJBLCAweDY4QTYsIDB4MTFCRSwgMHg2OEE3LCAweDA3OUMsIDB4NjhBOCwKKyAgICAweDBGNjYsIDB4NjhBRCwgMHgxNDRCLCAweDY4QUYsIDB4MEMxMCwgMHg2OEIwLCAweDA1ODEsIDB4NjhCMSwgMHgwODFELAorICAgIDB4NjhCMiwgMHgzOTJCLCAweDY4QjMsIDB4MTQ0MywgMHg2OEI1LCAweDE0NTMsIDB4NjhCNiwgMHgwNUJGLCAweDY4QjksCisgICAgMHgxNDUxLCAweDY4QkEsIDB4MTQ1NSwgMHg2OEJDLCAweDBDNjgsIDB4NjhDNCwgMHgwNjNBLCAweDY4QzYsIDB4MTQ3MywKKyAgICAweDY4QzgsIDB4MjBBRiwgMHg2OEM5LCAweDBFRDUsIDB4NjhDQSwgMHgxNDVBLCAweDY4Q0IsIDB4MDYzOSwgMHg2OENELAorICAgIDB4MTQ2MSwgMHg2OENGLCAweDIxMzAsIDB4NjhEMCwgMHgzOTJDLCAweDY4RDIsIDB4MEU2RSwgMHg2OEQ0LCAweDE0NjIsCisgICAgMHg2OEQ1LCAweDE0NjQsIDB4NjhENiwgMHgzOTJELCAweDY4RDcsIDB4MTQ2OCwgMHg2OEQ4LCAweDE0NUMsIDB4NjhEQSwKKyAgICAweDBCNjgsIDB4NjhERiwgMHgwQzY5LCAweDY4RTAsIDB4MTQ2QywgMHg2OEUxLCAweDE0NUYsIDB4NjhFMywgMHgxNDY5LAorICAgIDB4NjhFNywgMHgxNDYzLCAweDY4RTgsIDB4MzkyRSwgMHg2OEVELCAweDM5MkYsIDB4NjhFRSwgMHgwOUZGLCAweDY4RUYsCisgICAgMHgxNDZELCAweDY4RjAsIDB4MzkzMCwgMHg2OEYxLCAweDM5MzEsIDB4NjhGMiwgMHgwQTU3LCAweDY4RjksIDB4MTQ2QiwKKyAgICAweDY4RkEsIDB4MDVGOSwgMHg2OEZDLCAweDM5MzIsIDB4NjkwMCwgMHgwRkY2LCAweDY5MDEsIDB4MTQ1OSwgMHg2OTA0LAorICAgIDB4MTQ2NywgMHg2OTA1LCAweDA0OUMsIDB4NjkwOCwgMHgxNDVCLCAweDY5MEIsIDB4MEVDNiwgMHg2OTBDLCAweDE0NjAsCisgICAgMHg2OTBELCAweDA5RTgsIDB4NjkwRSwgMHgwQkUzLCAweDY5MEYsIDB4MTQ1NiwgMHg2OTExLCAweDM5MzMsIDB4NjkxMiwKKyAgICAweDE0NjYsIDB4NjkxMywgMHgzOTM0LCAweDY5MTksIDB4MEE0MCwgMHg2OTFBLCAweDE0NzAsIDB4NjkxQiwgMHgwNUNGLAorICAgIDB4NjkxQywgMHgwNzU1LCAweDY5MjEsIDB4MTQ3MiwgMHg2OTIyLCAweDE0NUQsIDB4NjkyMywgMHgxNDcxLCAweDY5MjUsCisgICAgMHgxNDZBLCAweDY5MjYsIDB4MTQ1RSwgMHg2OTI4LCAweDE0NkUsIDB4NjkyQSwgMHgxNDZGLCAweDY5MzAsIDB4MTQ4MCwKKyAgICAweDY5MzQsIDB4MENBNiwgMHg2OTM1LCAweDM5MzUsIDB4NjkzNiwgMHgxNDY1LCAweDY5MzksIDB4MTQ3QywgMHg2OTNCLAorICAgIDB4MzkzNiwgMHg2OTNELCAweDE0N0UsIDB4NjkzRiwgMHgwQkY0LCAweDY5NEEsIDB4MEYzNiwgMHg2OTUzLCAweDBERTgsCisgICAgMHg2OTU0LCAweDE0NzksIDB4Njk1NSwgMHgwQjJBLCAweDY5NTcsIDB4MzkzNywgMHg2OTU5LCAweDE0N0YsIDB4Njk1QSwKKyAgICAweDBBQzEsIDB4Njk1QywgMHgxNDc2LCAweDY5NUQsIDB4MTQ4MywgMHg2OTVFLCAweDE0ODIsIDB4Njk2MCwgMHgwQ0M3LAorICAgIDB4Njk2MSwgMHgxNDgxLCAweDY5NjIsIDB4MENDMiwgMHg2OTYzLCAweDM5MzgsIDB4Njk2OCwgMHgyMTMyLCAweDY5NkEsCisgICAgMHgxNDg1LCAweDY5NkIsIDB4MTQ3OCwgMHg2OTZELCAweDA2QzAsIDB4Njk2RSwgMHgxNDdCLCAweDY5NkYsIDB4MDk2NywKKyAgICAweDY5NzIsIDB4MzkzOSwgMHg2OTczLCAweDBEMTYsIDB4Njk3NCwgMHgxNDdELCAweDY5NzUsIDB4MDZDMywgMHg2OTc3LAorICAgIDB4MTQ3NSwgMHg2OTc4LCAweDE0NzcsIDB4Njk3OSwgMHgxNDc0LCAweDY5N0MsIDB4MEZENiwgMHg2OTdELCAweDA1QjgsCisgICAgMHg2OTdFLCAweDE0N0EsIDB4Njk3RiwgMHgzOTNBLCAweDY5ODAsIDB4MzkzQiwgMHg2OTgxLCAweDE0ODQsIDB4Njk4MiwKKyAgICAweDA1OTMsIDB4Njk4QSwgMHgwODU3LCAweDY5OEUsIDB4MDRGRiwgMHg2OTkxLCAweDE0OTUsIDB4Njk5NCwgMHgwRkQ3LAorICAgIDB4Njk5NSwgMHgxNDk4LCAweDY5OTgsIDB4MjEzNCwgMHg2OTlCLCAweDBBMDAsIDB4Njk5QywgMHgxNDk3LCAweDY5QTAsCisgICAgMHgxNDk2LCAweDY5QTYsIDB4MzkzQywgMHg2OUE3LCAweDE0OTMsIDB4NjlBRCwgMHgzOTNELCAweDY5QUUsIDB4MTQ4NywKKyAgICAweDY5QjEsIDB4MTRBNCwgMHg2OUIyLCAweDE0ODYsIDB4NjlCNCwgMHgxNDk5LCAweDY5QjcsIDB4MzkzRSwgMHg2OUJCLAorICAgIDB4MTQ5MSwgMHg2OUJFLCAweDE0OEMsIDB4NjlCRiwgMHgxNDg5LCAweDY5QzEsIDB4MTQ4QSwgMHg2OUMzLCAweDE0OTIsCisgICAgMHg2OUM3LCAweDFEMzMsIDB4NjlDQSwgMHgxNDhGLCAweDY5Q0IsIDB4MDdDRiwgMHg2OUNDLCAweDBCRTQsIDB4NjlDRCwKKyAgICAweDBBRTYsIDB4NjlDRSwgMHgxNDhELCAweDY5RDAsIDB4MTQ4OCwgMHg2OUQzLCAweDE0OEIsIDB4NjlENiwgMHgzOTNGLAorICAgIDB4NjlENywgMHgzOTQwLCAweDY5RDgsIDB4MEYzNywgMHg2OUQ5LCAweDBFOTgsIDB4NjlERCwgMHgxNDkwLCAweDY5REUsCisgICAgMHgxNDlBLCAweDY5RTIsIDB4MjEzNSwgMHg2OUU3LCAweDE0QTIsIDB4NjlFOCwgMHgxNDlCLCAweDY5RUEsIDB4MzU2RiwKKyAgICAweDY5RUIsIDB4MTRBOCwgMHg2OUVELCAweDE0QTYsIDB4NjlGMiwgMHgxNEExLCAweDY5RjYsIDB4MzczRiwgMHg2OUY5LAorICAgIDB4MTRBMCwgMHg2OUZCLCAweDBCRUMsIDB4NjlGRCwgMHgwQUU3LCAweDY5RkYsIDB4MTQ5RSwgMHg2QTAxLCAweDM5NDEsCisgICAgMHg2QTAyLCAweDE0OUMsIDB4NkEwNSwgMHgxNEEzLCAweDZBMEEsIDB4MTRBOSwgMHg2QTBCLCAweDBEODksIDB4NkEwQywKKyAgICAweDE0QUYsIDB4NkEwRiwgMHgzOTQyLCAweDZBMTIsIDB4MTRBQSwgMHg2QTEzLCAweDE0QUQsIDB4NkExNCwgMHgxNEE3LAorICAgIDB4NkExNSwgMHgzOTQzLCAweDZBMTcsIDB4MEJCMiwgMHg2QTE5LCAweDBEQUEsIDB4NkExQiwgMHgxNDlELCAweDZBMUUsCisgICAgMHgxNEE1LCAweDZBMUYsIDB4MDlBOCwgMHg2QTIxLCAweDBFREIsIDB4NkEyMiwgMHgxNEI5LCAweDZBMjMsIDB4MTRBQywKKyAgICAweDZBMjgsIDB4Mzk0NCwgMHg2QTI5LCAweDA3NTYsIDB4NkEyQSwgMHgwNTIzLCAweDZBMkIsIDB4MDVCRCwgMHg2QTJFLAorICAgIDB4MTQ5NCwgMHg2QTMwLCAweDIxMzYsIDB4NkEzNCwgMHgzOTQ1LCAweDZBMzUsIDB4MDlBOSwgMHg2QTM2LCAweDE0QjEsCisgICAgMHg2QTM4LCAweDE0QjgsIDB4NkEzOSwgMHgwOTI1LCAweDZBM0EsIDB4MDVEMCwgMHg2QTNELCAweDBCNkMsIDB4NkEzRSwKKyAgICAweDM5NDYsIDB4NkE0NCwgMHgxNEFFLCAweDZBNDUsIDB4Mzk0NywgMHg2QTQ2LCAweDIxMzgsIDB4NkE0NywgMHgxNEIzLAorICAgIDB4NkE0OCwgMHgxNEI3LCAweDZBNEIsIDB4MDZBRSwgMHg2QTUwLCAweDM5NDgsIDB4NkE1MSwgMHgzOTQ5LCAweDZBNTQsCisgICAgMHgzQzM0LCAweDZBNTYsIDB4Mzk0QSwgMHg2QTU4LCAweDA2NjYsIDB4NkE1OSwgMHgxNEI1LCAweDZBNUIsIDB4Mzk0QiwKKyAgICAweDZBNUYsIDB4MDYzQiwgMHg2QTYxLCAweDBDQTMsIDB4NkE2MiwgMHgxNEI0LCAweDZBNjYsIDB4MTRCNiwgMHg2QTZCLAorICAgIDB4MjEzNywgMHg2QTcyLCAweDE0QjAsIDB4NkE3MywgMHgyMTM5LCAweDZBNzgsIDB4MTRCMiwgMHg2QTdFLCAweDIxM0EsCisgICAgMHg2QTdGLCAweDA1QkUsIDB4NkE4MCwgMHgwQjg3LCAweDZBODMsIDB4Mzk0QywgMHg2QTg0LCAweDE0QkQsIDB4NkE4OSwKKyAgICAweDM5NEQsIDB4NkE4RCwgMHgxNEJCLCAweDZBOEUsIDB4MDc5RCwgMHg2QTkwLCAweDE0QkEsIDB4NkE5MSwgMHgzOTRFLAorICAgIDB4NkE5NywgMHgxNEMwLCAweDZBOUMsIDB4MTQzQiwgMHg2QTlELCAweDM5NEYsIDB4NkE5RSwgMHgzOTUwLCAweDZBOUYsCisgICAgMHgzOTUxLCAweDZBQTAsIDB4MTRCQywgMHg2QUEyLCAweDE0QkUsIDB4NkFBMywgMHgxNEJGLCAweDZBQUEsIDB4MTRDQiwKKyAgICAweDZBQUMsIDB4MTRDNywgMHg2QUFFLCAweDE0NTAsIDB4NkFCMywgMHgxNEM2LCAweDZBQjgsIDB4MTRDNSwgMHg2QUJCLAorICAgIDB4MTRDMiwgMHg2QUMxLCAweDE0QUIsIDB4NkFDMiwgMHgxNEM0LCAweDZBQzMsIDB4MTRDMywgMHg2QUQxLCAweDE0QzksCisgICAgMHg2QUQzLCAweDBGQ0MsIDB4NkFEQSwgMHgxNENDLCAweDZBREIsIDB4MDZGMywgMHg2QURDLCAweDM5NTIsIDB4NkFERSwKKyAgICAweDE0QzgsIDB4NkFERiwgMHgxNENBLCAweDZBRTIsIDB4MjEzQiwgMHg2QUU0LCAweDIxM0MsIDB4NkFFNywgMHgzOTUzLAorICAgIDB4NkFFOCwgMHgwRDNCLCAweDZBRUEsIDB4MTRDRCwgMHg2QUVDLCAweDM5NTQsIDB4NkFGQSwgMHgxNEQxLCAweDZBRkIsCisgICAgMHgxNENFLCAweDZCMDQsIDB4MEY1RCwgMHg2QjA1LCAweDE0Q0YsIDB4NkIwQSwgMHgxNDlGLCAweDZCMTIsIDB4MTREMiwKKyAgICAweDZCMTYsIDB4MTREMywgMHg2QjFELCAweDA0RDcsIDB4NkIxRSwgMHgzOTU1LCAweDZCMUYsIDB4MTRENSwgMHg2QjIwLAorICAgIDB4MDczRCwgMHg2QjIxLCAweDA4Q0QsIDB4NkIyMywgMHgwNkNELCAweDZCMjQsIDB4Mzk1NiwgMHg2QjI3LCAweDA1MjQsCisgICAgMHg2QjMyLCAweDBGNDksIDB4NkIzNSwgMHgzOTU3LCAweDZCMzcsIDB4MTRENywgMHg2QjM4LCAweDE0RDYsIDB4NkIzOSwKKyAgICAweDE0RDksIDB4NkIzQSwgMHgwNjU3LCAweDZCM0QsIDB4MDZDRSwgMHg2QjNFLCAweDA1RkEsIDB4NkI0MywgMHgxNERDLAorICAgIDB4NkI0NiwgMHgzOTU4LCAweDZCNDcsIDB4MTREQiwgMHg2QjQ5LCAweDE0REQsIDB4NkI0QywgMHgwNTRFLCAweDZCNEUsCisgICAgMHgwQjc1LCAweDZCNTAsIDB4MTRERSwgMHg2QjUzLCAweDA1RkIsIDB4NkI1NCwgMHgxNEUwLCAweDZCNTYsIDB4Mzk1OSwKKyAgICAweDZCNTksIDB4MTRERiwgMHg2QjVCLCAweDE0RTEsIDB4NkI1RiwgMHgxNEUyLCAweDZCNjAsIDB4Mzk1QSwgMHg2QjYxLAorICAgIDB4MTRFMywgMHg2QjYyLCAweDA4QUQsIDB4NkI2MywgMHgwQTU5LCAweDZCNjQsIDB4MDgxMSwgMHg2QjY1LCAweDM0NEEsCisgICAgMHg2QjY2LCAweDBERTIsIDB4NkI2OSwgMHgwRTMyLCAweDZCNkEsIDB4MEZFQSwgMHg2QjZGLCAweDA4QzMsIDB4NkI3MiwKKyAgICAweDM1RDksIDB4NkI3MywgMHgwODQwLCAweDZCNzQsIDB4MEZCQSwgMHg2Qjc3LCAweDM0NTYsIDB4NkI3OCwgMHgxNEU0LAorICAgIDB4NkI3OSwgMHgxNEU1LCAweDZCN0IsIDB4MDhBRSwgMHg2QjdGLCAweDE0RTYsIDB4NkI4MCwgMHgxNEU3LCAweDZCODIsCisgICAgMHgzOTVCLCAweDZCODMsIDB4MTRFOSwgMHg2Qjg0LCAweDE0RTgsIDB4NkI4NiwgMHgwRTg2LCAweDZCODksIDB4MDk2OCwKKyAgICAweDZCOEEsIDB4MDkxOCwgMHg2QjhCLCAweDA4OTIsIDB4NkI4RCwgMHgxNEVBLCAweDZCOTUsIDB4MTRFQywgMHg2Qjk2LAorICAgIDB4MDlFOSwgMHg2Qjk4LCAweDE0RUIsIDB4NkI5RSwgMHgxNEVELCAweDZCQTQsIDB4MTRFRSwgMHg2QkFBLCAweDE0RUYsCisgICAgMHg2QkFCLCAweDE0RjAsIDB4NkJBRiwgMHgxNEYxLCAweDZCQjEsIDB4MTRGMywgMHg2QkIyLCAweDE0RjIsIDB4NkJCMywKKyAgICAweDE0RjQsIDB4NkJCNCwgMHgwNTI1LCAweDZCQjUsIDB4MEI4OCwgMHg2QkI3LCAweDE0RjUsIDB4NkJCQSwgMHgwODc0LAorICAgIDB4NkJCQiwgMHgwNUFBLCAweDZCQkMsIDB4MTRGNiwgMHg2QkJFLCAweDM5NUMsIDB4NkJCRiwgMHgwQzNDLCAweDZCQzAsCisgICAgMHgxMTlELCAweDZCQzUsIDB4MDYzRCwgMHg2QkM2LCAweDE0RjcsIDB4NkJDQiwgMHgxNEY4LCAweDZCQ0MsIDB4Mzc0NCwKKyAgICAweDZCQ0QsIDB4MEUzQywgMHg2QkNFLCAweDBFOTYsIDB4NkJDRiwgMHgzNDRDLCAweDZCRDIsIDB4MEM5RiwgMHg2QkQzLAorICAgIDB4MTRGOSwgMHg2QkQ0LCAweDBEN0EsIDB4NkJENiwgMHgyMTNELCAweDZCRDgsIDB4MEQ4RiwgMHg2QkRCLCAweDBFREYsCisgICAgMHg2QkRGLCAweDE0RkEsIDB4NkJFMSwgMHgzOTVELCAweDZCRUIsIDB4MTRGQywgMHg2QkVDLCAweDE0RkIsIDB4NkJFRiwKKyAgICAweDE0RkUsIDB4NkJGMSwgMHgzOTVFLCAweDZCRjMsIDB4MTRGRCwgMHg2QzA4LCAweDE1MDAsIDB4NkMwRiwgMHgwOEFGLAorICAgIDB4NkMxMCwgMHgzOTVGLCAweDZDMTEsIDB4MEVCRCwgMHg2QzEzLCAweDE1MDEsIDB4NkMxNCwgMHgxNTAyLCAweDZDMTcsCisgICAgMHgwNjNFLCAweDZDMUIsIDB4MTUwMywgMHg2QzIzLCAweDE1MDUsIDB4NkMyNCwgMHgxNTA0LCAweDZDMzMsIDB4Mzk2MCwKKyAgICAweDZDMzQsIDB4MEEyQiwgMHg2QzM1LCAweDM5NjEsIDB4NkMzNywgMHgwREFCLCAweDZDMzgsIDB4MDRFQywgMHg2QzNBLAorICAgIDB4Mzk2MiwgMHg2QzNFLCAweDBENTksIDB4NkMzRiwgMHgyMTNFLCAweDZDNDAsIDB4MEMxMSwgMHg2QzQxLCAweDA5NEIsCisgICAgMHg2QzQyLCAweDA2N0IsIDB4NkM0RSwgMHgwRDVBLCAweDZDNTAsIDB4MDhEQSwgMHg2QzU1LCAweDE1MDcsIDB4NkM1NywKKyAgICAweDA1RkMsIDB4NkM1OSwgMHgzOTYzLCAweDZDNUEsIDB4MDUxQSwgMHg2QzVDLCAweDIxM0YsIDB4NkM1RCwgMHgwQ0NBLAorICAgIDB4NkM1RSwgMHgxNTA2LCAweDZDNUYsIDB4MDdEMCwgMHg2QzYwLCAweDBCOTEsIDB4NkM2MiwgMHgxNTA4LCAweDZDNjgsCisgICAgMHgxNTEwLCAweDZDNkEsIDB4MTUwOSwgMHg2QzZGLCAweDIxNDEsIDB4NkM3MCwgMHgwQjIxLCAweDZDNzIsIDB4MDY3QywKKyAgICAweDZDNzMsIDB4MTUxMSwgMHg2Qzc2LCAweDM5NjQsIDB4NkM3QSwgMHgwNzNFLCAweDZDN0IsIDB4Mzk2NSwgMHg2QzdELAorICAgIDB4MDYzRiwgMHg2QzdFLCAweDE1MEYsIDB4NkM4MSwgMHgxNTBELCAweDZDODIsIDB4MTUwQSwgMHg2QzgzLCAweDBGNEEsCisgICAgMHg2Qzg1LCAweDM5NjYsIDB4NkM4NiwgMHgyMTQwLCAweDZDODgsIDB4MEJEQywgMHg2QzhDLCAweDBDQjEsIDB4NkM4RCwKKyAgICAweDE1MEIsIDB4NkM5MCwgMHgxNTEzLCAweDZDOTIsIDB4MTUxMiwgMHg2QzkzLCAweDA2RjksIDB4NkM5NSwgMHgzOTY3LAorICAgIDB4NkM5NiwgMHgwNTJELCAweDZDOTksIDB4MDgyQiwgMHg2QzlBLCAweDE1MEMsIDB4NkM5QiwgMHgxNTBFLCAweDZDOUMsCisgICAgMHgzOTY4LCAweDZDQTEsIDB4MEU4NSwgMHg2Q0EyLCAweDBCNTQsIDB4NkNBQSwgMHgzNzQ5LCAweDZDQUIsIDB4MEVBNSwKKyAgICAweDZDQUUsIDB4MTUxQiwgMHg2Q0IxLCAweDE1MUMsIDB4NkNCMywgMHgwNTRGLCAweDZDQjgsIDB4MERGOCwgMHg2Q0I5LAorICAgIDB4MEYwOSwgMHg2Q0JBLCAweDE1MUUsIDB4NkNCQiwgMHgwOENGLCAweDZDQkMsIDB4MDlBQSwgMHg2Q0JELCAweDE1MTcsCisgICAgMHg2Q0JFLCAweDE1MUQsIDB4NkNCRiwgMHgwNTBBLCAweDZDQzEsIDB4MDZBRiwgMHg2Q0M0LCAweDE1MTQsIDB4NkNDNSwKKyAgICAweDE1MTksIDB4NkNDOSwgMHgwQTk4LCAweDZDQ0EsIDB4MEQyNywgMHg2Q0NDLCAweDBEN0IsIDB4NkNEMCwgMHgzOTY5LAorICAgIDB4NkNEMywgMHgxNTE2LCAweDZDRDQsIDB4Mzk2QSwgMHg2Q0Q1LCAweDBFNEYsIDB4NkNENiwgMHgzOTZCLCAweDZDRDcsCisgICAgMHgxNTE4LCAweDZDRDksIDB4MTUyMSwgMHg2Q0RBLCAweDIxNDIsIDB4NkNEQiwgMHgxNTFGLCAweDZDREQsIDB4MTUxQSwKKyAgICAweDZDRTAsIDB4Mzk2QywgMHg2Q0UxLCAweDBFNTAsIDB4NkNFMiwgMHgwQ0ZFLCAweDZDRTMsIDB4MDY3RCwgMHg2Q0U1LAorICAgIDB4MEMxRiwgMHg2Q0U4LCAweDBCQUIsIDB4NkNFQSwgMHgxNTIyLCAweDZDRUIsIDB4Mzk2RCwgMHg2Q0VDLCAweDM5NkUsCisgICAgMHg2Q0VFLCAweDM5NkYsIDB4NkNFRiwgMHgxNTIwLCAweDZDRjAsIDB4MEIzOSwgMHg2Q0YxLCAweDE1MTUsIDB4NkNGMywKKyAgICAweDA0RUQsIDB4NkQwMSwgMHgzQzM1LCAweDZEMDQsIDB4MjE0MywgMHg2RDBBLCAweDM5NzAsIDB4NkQwQiwgMHgwRjM4LAorICAgIDB4NkQwQywgMHgxNTJELCAweDZEMEUsIDB4Mzk3MSwgMHg2RDExLCAweDM5NzIsIDB4NkQxMiwgMHgxNTJDLCAweDZEMTcsCisgICAgMHgwQTlBLCAweDZEMTksIDB4MTUyOSwgMHg2RDFCLCAweDBGNTYsIDB4NkQxRSwgMHgwQzhFLCAweDZEMUYsIDB4MTUyMywKKyAgICAweDZEMjUsIDB4MEJFMSwgMHg2RDI5LCAweDA0RUUsIDB4NkQyQSwgMHgwN0QxLCAweDZEMkIsIDB4MTUyNiwgMHg2RDJFLAorICAgIDB4Mzk3MywgMHg2RDMyLCAweDA5MzEsIDB4NkQzMywgMHgxNTJCLCAweDZEMzUsIDB4MTUyQSwgMHg2RDM2LCAweDE1MjUsCisgICAgMHg2RDM4LCAweDE1MjgsIDB4NkQzQiwgMHgwNUM2LCAweDZEM0QsIDB4MTUyNywgMHg2RDNFLCAweDBDRkYsIDB4NkQ0MSwKKyAgICAweDBGNzYsIDB4NkQ0NCwgMHgwOURDLCAweDZENDUsIDB4MEE5OSwgMHg2RDU3LCAweDM5NzQsIDB4NkQ1OSwgMHgxNTMzLAorICAgIDB4NkQ1QSwgMHgxNTMxLCAweDZENUMsIDB4MERCRiwgMHg2RDVFLCAweDM5NzUsIDB4NkQ2MywgMHgxNTJFLCAweDZENjQsCisgICAgMHgxNTMwLCAweDZENjUsIDB4Mzk3NiwgMHg2RDY2LCAweDA0REMsIDB4NkQ2OSwgMHgwN0QyLCAweDZENkEsIDB4MEZEOCwKKyAgICAweDZENkMsIDB4MDU5QiwgMHg2RDZFLCAweDBERDQsIDB4NkQ2RiwgMHgyMTQ1LCAweDZENzQsIDB4MEY0QiwgMHg2RDc3LAorICAgIDB4MDU4MiwgMHg2RDc4LCAweDBBMDEsIDB4NkQ3OSwgMHgxNTMyLCAweDZEODIsIDB4Mzk3NywgMHg2RDg1LCAweDE1MzcsCisgICAgMHg2RDg3LCAweDIxNDQsIDB4NkQ4OCwgMHgwOUFCLCAweDZEODksIDB4MzQyQSwgMHg2RDhDLCAweDBGMUEsIDB4NkQ4RSwKKyAgICAweDE1MzQsIDB4NkQ5MywgMHgxNTJGLCAweDZEOTUsIDB4MTUzNSwgMHg2RDk2LCAweDIxNDYsIDB4NkQ5OSwgMHgwRkE2LAorICAgIDB4NkQ5QiwgMHgwQzZELCAweDZEOUMsIDB4MEM5QSwgMHg2REFDLCAweDIxNDcsIDB4NkRBRiwgMHgwNTk0LCAweDZEQjIsCisgICAgMHgwNEY3LCAweDZEQjUsIDB4MTUzQiwgMHg2REI4LCAweDE1M0UsIDB4NkRCQywgMHgwRjhCLCAweDZEQkYsIDB4Mzk3OCwKKyAgICAweDZEQzAsIDB4MEY0RSwgMHg2REM0LCAweDM5NzksIDB4NkRDNSwgMHgxNTQ1LCAweDZEQzYsIDB4MTUzRiwgMHg2REM3LAorICAgIDB4MTUzQywgMHg2RENBLCAweDM5N0EsIDB4NkRDQiwgMHgwRjlDLCAweDZEQ0MsIDB4MTU0MiwgMHg2RENGLCAweDIxNDgsCisgICAgMHg2REQwLCAweDNDMzYsIDB4NkREMSwgMHgwOTU0LCAweDZERDIsIDB4MTU0NCwgMHg2REQ1LCAweDE1NDksIDB4NkRENiwKKyAgICAweDM5N0IsIDB4NkREOCwgMHgwQzZCLCAweDZERDksIDB4MTU0NywgMHg2RERBLCAweDM0NTMsIDB4NkRERSwgMHgxNTQxLAorICAgIDB4NkRFMSwgMHgwQjc2LCAweDZERTQsIDB4MTU0OCwgMHg2REU2LCAweDE1M0QsIDB4NkRFOCwgMHgxNTQzLCAweDZERTksCisgICAgMHgzOTdDLCAweDZERUEsIDB4MTU0QSwgMHg2REVCLCAweDA0QzAsIDB4NkRFQywgMHgxNTQwLCAweDZERUUsIDB4MTU0QiwKKyAgICAweDZERjEsIDB4MEEwMiwgMHg2REYyLCAweDIxNEEsIDB4NkRGMywgMHgwOTY5LCAweDZERjUsIDB4MERGNSwgMHg2REY3LAorICAgIDB4MDgxRSwgMHg2REY4LCAweDIxNDksIDB4NkRGOSwgMHgxNTM4LCAweDZERkEsIDB4MTU0NiwgMHg2REZCLCAweDBDMzQsCisgICAgMHg2REZDLCAweDIxNEIsIDB4NkUwNSwgMHgwQTVBLCAweDZFMDcsIDB4MDVDNywgMHg2RTA4LCAweDA4NDEsIDB4NkUwOSwKKyAgICAweDA5QUMsIDB4NkUwQSwgMHgxNTNBLCAweDZFMEIsIDB4MDk0QywgMHg2RTEzLCAweDA3MjIsIDB4NkUxNSwgMHgxNTM5LAorICAgIDB4NkUxNywgMHgzNzQ2LCAweDZFMTksIDB4MTU0RiwgMHg2RTFBLCAweDA5NzcsIDB4NkUxQiwgMHgwNzZFLCAweDZFMUQsCisgICAgMHgxNTVFLCAweDZFMUYsIDB4MTU1OCwgMHg2RTIwLCAweDA2OEUsIDB4NkUyMSwgMHgwQzQ5LCAweDZFMjIsIDB4Mzk3RCwKKyAgICAweDZFMjMsIDB4MTU1MywgMHg2RTI0LCAweDE1NUMsIDB4NkUyNSwgMHgwNDczLCAweDZFMjYsIDB4MDRENCwgMHg2RTI3LAorICAgIDB4MjE0RSwgMHg2RTI5LCAweDA1MzksIDB4NkUyQiwgMHgxNTU1LCAweDZFMkMsIDB4MEIwQywgMHg2RTJELCAweDE1NEMsCisgICAgMHg2RTJFLCAweDE1NEUsIDB4NkUyRiwgMHgwN0QzLCAweDZFMzQsIDB4MzQxMiwgMHg2RTM4LCAweDE1NUYsIDB4NkUzOSwKKyAgICAweDIxNEMsIDB4NkUzQSwgMHgxNTVBLCAweDZFM0MsIDB4MjE0RiwgMHg2RTNFLCAweDE1NTIsIDB4NkU0MiwgMHgzQzM3LAorICAgIDB4NkU0MywgMHgxNTU5LCAweDZFNEEsIDB4MEVCNywgMHg2RTRELCAweDE1NTcsIDB4NkU0RSwgMHgxNTVCLCAweDZFNTEsCisgICAgMHgzOTdFLCAweDZFNTYsIDB4MDc4NCwgMHg2RTU4LCAweDA5QUQsIDB4NkU1QiwgMHgwQjc3LCAweDZFNUMsIDB4MjE0RCwKKyAgICAweDZFNUYsIDB4MTU1MSwgMHg2RTY3LCAweDBGMTksIDB4NkU2QiwgMHgxNTU0LCAweDZFNkUsIDB4MTU0RCwgMHg2RTZGLAorICAgIDB4MEM2QywgMHg2RTcyLCAweDE1NTAsIDB4NkU3NiwgMHgxNTU2LCAweDZFN0UsIDB4MEZGNywgMHg2RTdGLCAweDA4RUEsCisgICAgMHg2RTgwLCAweDBFQUMsIDB4NkU4MiwgMHgxNTYwLCAweDZFOEMsIDB4MEQ0MiwgMHg2RThGLCAweDE1NkMsIDB4NkU5MCwKKyAgICAweDA3NkYsIDB4NkU5NiwgMHgwOTZBLCAweDZFOTgsIDB4MTU2MiwgMHg2RTlDLCAweDBGNzcsIDB4NkU5RCwgMHgwN0Q0LAorICAgIDB4NkU5RiwgMHgxNTZGLCAweDZFQTIsIDB4MDRCMiwgMHg2RUE1LCAweDE1NkQsIDB4NkVBQSwgMHgxNTYxLCAweDZFQUIsCisgICAgMHgzNDBDLCAweDZFQUYsIDB4MTU2NywgMHg2RUIyLCAweDE1NjksIDB4NkVCNiwgMHgwRjM5LCAweDZFQjcsIDB4MTU2NCwKKyAgICAweDZFQkEsIDB4MEMyOCwgMHg2RUJELCAweDE1NjYsIDB4NkVCRiwgMHgyMTUwLCAweDZFQzIsIDB4MTU2RSwgMHg2RUM0LAorICAgIDB4MTU2OCwgMHg2RUM1LCAweDBFRDMsIDB4NkVDNywgMHgzOTdGLCAweDZFQzksIDB4MTU2MywgMHg2RUNBLCAweDM5ODAsCisgICAgMHg2RUNCLCAweDA4Q0UsIDB4NkVDQywgMHgxNTdCLCAweDZFQ0UsIDB4Mzk4MSwgMHg2RUQxLCAweDA1QzgsIDB4NkVEMywKKyAgICAweDE1NjUsIDB4NkVENCwgMHgxNTZBLCAweDZFRDUsIDB4MTU2QiwgMHg2RUQ5LCAweDNDMzgsIDB4NkVERCwgMHgwQjRDLAorICAgIDB4NkVERSwgMHgwQjNBLCAweDZFRTYsIDB4M0MyNCwgMHg2RUVDLCAweDE1NzMsIDB4NkVFRiwgMHgxNTc5LCAweDZFRjIsCisgICAgMHgxNTc3LCAweDZFRjQsIDB4MEMyMywgMHg2RUY3LCAweDE1N0UsIDB4NkVGOCwgMHgxNTc0LCAweDZFRkQsIDB4Mzk4MiwKKyAgICAweDZFRkUsIDB4MTU3NSwgMHg2RUZGLCAweDE1NUQsIDB4NkYwMSwgMHgwNjkzLCAweDZGMDIsIDB4MERBQywgMHg2RjA2LAorICAgIDB4MDhFQiwgMHg2RjA5LCAweDA4MDksIDB4NkYwRiwgMHgwRkQ5LCAweDZGMTEsIDB4MTU3MSwgMHg2RjEzLCAweDE1N0QsCisgICAgMHg2RjE0LCAweDA1MEIsIDB4NkYxNSwgMHgwQUU4LCAweDZGMUEsIDB4Mzk4MywgMHg2RjIwLCAweDBEMkYsIDB4NkYyMiwKKyAgICAweDA1RkQsIDB4NkYyMywgMHgwRkMyLCAweDZGMkEsIDB4Mzk4NCwgMHg2RjJCLCAweDBFQUQsIDB4NkYyQywgMHgwQkVFLAorICAgIDB4NkYyRiwgMHgzOTg1LCAweDZGMzEsIDB4MTU3OCwgMHg2RjMyLCAweDE1N0EsIDB4NkYzMywgMHgzOTg2LCAweDZGMzgsCisgICAgMHgwQUI0LCAweDZGM0UsIDB4MTU3QywgMHg2RjNGLCAweDE1NzYsIDB4NkY0MSwgMHgxNTcwLCAweDZGNDUsIDB4MDVGRiwKKyAgICAweDZGNTEsIDB4MUU2MCwgMHg2RjU0LCAweDA3M0YsIDB4NkY1OCwgMHgxNThBLCAweDZGNUEsIDB4Mzk4NywgMHg2RjVCLAorICAgIDB4MTU4NSwgMHg2RjVDLCAweDBBOUMsIDB4NkY1RSwgMHgzOTg4LCAweDZGNUYsIDB4MDVDMSwgMHg2RjYyLCAweDM5ODksCisgICAgMHg2RjY0LCAweDA5NkIsIDB4NkY2NiwgMHgxNThFLCAweDZGNkQsIDB4MTU4NywgMHg2RjZFLCAweDBCQzgsIDB4NkY2RiwKKyAgICAweDE1ODQsIDB4NkY3MCwgMHgwQkY1LCAweDZGNzQsIDB4MTVBNywgMHg2Rjc4LCAweDE1ODEsIDB4NkY3QSwgMHgxNTgwLAorICAgIDB4NkY3QywgMHgxNTg5LCAweDZGN0QsIDB4Mzk4QSwgMHg2RjgwLCAweDE1ODMsIDB4NkY4MSwgMHgxNTgyLCAweDZGODIsCisgICAgMHgxNTg4LCAweDZGODQsIDB4MEE0NSwgMHg2Rjg2LCAweDE1N0YsIDB4NkY4OCwgMHgyMTUxLCAweDZGOEIsIDB4Mzk4QiwKKyAgICAweDZGOEQsIDB4Mzk4QywgMHg2RjhFLCAweDE1OEIsIDB4NkY5MSwgMHgxNThDLCAweDZGOTIsIDB4Mzk4RCwgMHg2Rjk0LAorICAgIDB4Mzk4RSwgMHg2Rjk3LCAweDA1RkUsIDB4NkY5OCwgMHgzNjNDLCAweDZGOUEsIDB4Mzk4RiwgMHg2RkExLCAweDE1OTEsCisgICAgMHg2RkEzLCAweDE1OTAsIDB4NkZBNCwgMHgxNTkyLCAweDZGQTcsIDB4Mzk5MCwgMHg2RkE4LCAweDM5OTEsIDB4NkZBQSwKKyAgICAweDE1OTUsIDB4NkZCMSwgMHgwQzNELCAweDZGQjMsIDB4MTU4RiwgMHg2RkI1LCAweDIxNTIsIDB4NkZCNiwgMHgzOTkyLAorICAgIDB4NkZCOSwgMHgxNTkzLCAweDZGQzAsIDB4MDczOSwgMHg2RkMxLCAweDBCNTksIDB4NkZDMiwgMHgxNThELCAweDZGQzMsCisgICAgMHgwQ0YxLCAweDZGQzYsIDB4MTU5NCwgMHg2RkQ0LCAweDE1OTksIDB4NkZENSwgMHgxNTk3LCAweDZGRDgsIDB4MTU5QSwKKyAgICAweDZGREEsIDB4Mzk5MywgMHg2RkRCLCAweDE1OUQsIDB4NkZERSwgMHgzOTk0LCAweDZGREYsIDB4MTU5NiwgMHg2RkUwLAorICAgIDB4MDdGQywgMHg2RkUxLCAweDBDREUsIDB4NkZFNCwgMHgxNTM2LCAweDZGRUIsIDB4MEY1RSwgMHg2RkVDLCAweDE1OTgsCisgICAgMHg2RkVFLCAweDE1OUMsIDB4NkZFRiwgMHgwQjU1LCAweDZGRjEsIDB4MTU5QiwgMHg2RkYzLCAweDE1ODYsIDB4NkZGNSwKKyAgICAweDIxNTMsIDB4NkZGNiwgMHgxQkE0LCAweDZGRjksIDB4Mzk5NSwgMHg2RkZBLCAweDE1QTAsIDB4NkZGRSwgMHgxNUE0LAorICAgIDB4NzAwMSwgMHgxNUEyLCAweDcwMDUsIDB4MjE1NCwgMHg3MDA2LCAweDFFNTAsIDB4NzAwNywgMHgyMTU1LCAweDcwMDksCisgICAgMHgxNTlFLCAweDcwMEIsIDB4MTU5RiwgMHg3MDBGLCAweDE1QTMsIDB4NzAxMSwgMHgxNUExLCAweDcwMTUsIDB4MERDMCwKKyAgICAweDcwMTgsIDB4MTVBOSwgMHg3MDFBLCAweDE1QTYsIDB4NzAxQiwgMHgxNUE1LCAweDcwMUQsIDB4MTVBOCwgMHg3MDFFLAorICAgIDB4MENBQywgMHg3MDFGLCAweDE1QUEsIDB4NzAyNiwgMHgwQkIzLCAweDcwMjcsIDB4MEI0RCwgMHg3MDI4LCAweDIxNTYsCisgICAgMHg3MDJDLCAweDBBNDksIDB4NzAzMCwgMHgxNUFCLCAweDcwMzIsIDB4MTVBRCwgMHg3MDM5LCAweDM5OTYsIDB4NzAzQywKKyAgICAweDM5OTcsIDB4NzAzRSwgMHgxNUFDLCAweDcwNEEsIDB4Mzk5OCwgMHg3MDRDLCAweDE1NzIsIDB4NzA1MSwgMHgxNUFFLAorICAgIDB4NzA1NCwgMHgzOTk5LCAweDcwNTgsIDB4MENCRiwgMHg3MDVELCAweDM5OUEsIDB4NzA1RSwgMHgzOTlCLCAweDcwNjMsCisgICAgMHgxNUFGLCAweDcwNjQsIDB4Mzk5QywgMHg3MDZCLCAweDA1NTAsIDB4NzA2QywgMHgzOTlELCAweDcwNkYsIDB4MEM2RSwKKyAgICAweDcwNzAsIDB4MDU4MywgMHg3MDc4LCAweDA2N0UsIDB4NzA3QywgMHgwOTBBLCAweDcwN0QsIDB4MDg0MiwgMHg3MDdFLAorICAgIDB4Mzk5RSwgMHg3MDgxLCAweDM5OUYsIDB4NzA4NSwgMHgyMTU3LCAweDcwODksIDB4MEZDRCwgMHg3MDhBLCAweDBBMkMsCisgICAgMHg3MDhFLCAweDA1MEMsIDB4NzA5MiwgMHgxNUIxLCAweDcwOTUsIDB4MzlBMCwgMHg3MDk5LCAweDE1QjAsIDB4NzBBQiwKKyAgICAweDIxNTgsIDB4NzBBQywgMHgxNUI0LCAweDcwQUQsIDB4MEI3OCwgMHg3MEFFLCAweDE1QjcsIDB4NzBBRiwgMHgxNUIyLAorICAgIDB4NzBCMywgMHgxNUI2LCAweDcwQjcsIDB4MzlBMSwgMHg3MEI4LCAweDE1QjUsIDB4NzBCOSwgMHgwQzNBLCAweDcwQkEsCisgICAgMHgwNDlELCAweDcwQkIsIDB4MjBBRCwgMHg3MEM4LCAweDBGQkQsIDB4NzBDQiwgMHgxNUI5LCAweDcwQ0YsIDB4MDRDQSwKKyAgICAweDcwRDMsIDB4MzlBMiwgMHg3MEQ0LCAweDM5QTMsIDB4NzBEOCwgMHgzOUE0LCAweDcwRDksIDB4MTVCQiwgMHg3MERDLAorICAgIDB4MzlBNSwgMHg3MERELCAweDE1QkEsIDB4NzBERiwgMHgxNUI4LCAweDcwRjEsIDB4MTVCMywgMHg3MEY5LCAweDBFNTEsCisgICAgMHg3MEZELCAweDE1QkQsIDB4NzEwNCwgMHgyMTVBLCAweDcxMDcsIDB4MzlBNiwgMHg3MTA5LCAweDE1QkMsIDB4NzEwRiwKKyAgICAweDIxNTksIDB4NzExNCwgMHgwNTBELCAweDcxMTksIDB4MTVCRiwgMHg3MTFBLCAweDBFMDIsIDB4NzExQywgMHgxNUJFLAorICAgIDB4NzEyMCwgMHgzOUE3LCAweDcxMjEsIDB4MEVDMSwgMHg3MTI2LCAweDA5QUYsIDB4NzEzMCwgMHgxRERDLCAweDcxMzEsCisgICAgMHgzOUE4LCAweDcxMzYsIDB4MEFCNSwgMHg3MTNDLCAweDA5QUUsIDB4NzE0NiwgMHgyMTVDLCAweDcxNDcsIDB4MjE1RCwKKyAgICAweDcxNDksIDB4MEZDMywgMHg3MTRBLCAweDM5QTksIDB4NzE0QywgMHgxNUM1LCAweDcxNEUsIDB4MEE5RCwgMHg3MTUyLAorICAgIDB4MzlBQSwgMHg3MTU1LCAweDE1QzEsIDB4NzE1NiwgMHgxNUM2LCAweDcxNTksIDB4MDUwRSwgMHg3MTVDLCAweDIxNUIsCisgICAgMHg3MTYwLCAweDM5QUIsIDB4NzE2MiwgMHgxNUM0LCAweDcxNjQsIDB4MEQxNywgMHg3MTY1LCAweDE1QzAsIDB4NzE2NiwKKyAgICAweDE1QzMsIDB4NzE2NywgMHgwOUIwLCAweDcxNjksIDB4MEQ2NSwgMHg3MTZDLCAweDE1QzcsIDB4NzE2RSwgMHgwOEZELAorICAgIDB4NzE3OSwgMHgzOUFDLCAweDcxN0QsIDB4MEE5RSwgMHg3MTg0LCAweDE1Q0EsIDB4NzE4OCwgMHgxNUMyLCAweDcxOEEsCisgICAgMHgwNkZELCAweDcxOEYsIDB4MTVDOCwgMHg3MTkyLCAweDM5QUQsIDB4NzE5NCwgMHgwRjNBLCAweDcxOTUsIDB4MTVDQiwKKyAgICAweDcxOTksIDB4MjA1RCwgMHg3MTlGLCAweDA5NTksIDB4NzFBOCwgMHgxNUNDLCAweDcxQUMsIDB4MTVDRCwgMHg3MUIxLAorICAgIDB4MENFNCwgMHg3MUIzLCAweDM5QUUsIDB4NzFCOSwgMHgxNUNGLCAweDcxQkUsIDB4MTVEMCwgMHg3MUMxLCAweDIxNUYsCisgICAgMHg3MUMzLCAweDBDRTksIDB4NzFDOCwgMHgwQzZGLCAweDcxQzksIDB4MTVEMiwgMHg3MUNCLCAweDM5QUYsIDB4NzFDRSwKKyAgICAweDE1RDQsIDB4NzFEMCwgMHgwRjlELCAweDcxRDIsIDB4MTVEMSwgMHg3MUQzLCAweDM5QjAsIDB4NzFENCwgMHgxNUQzLAorICAgIDB4NzFENSwgMHgwNTBGLCAweDcxRDYsIDB4MzlCMSwgMHg3MUQ3LCAweDE1Q0UsIDB4NzFERiwgMHgxMTRFLCAweDcxRTAsCisgICAgMHgxNUQ1LCAweDcxRTUsIDB4MEFFOSwgMHg3MUU2LCAweDA4ODYsIDB4NzFFNywgMHgxNUQ3LCAweDcxRUMsIDB4MTVENiwKKyAgICAweDcxRUQsIDB4MDlFQSwgMHg3MUVFLCAweDEwRUUsIDB4NzFGNSwgMHgxNUQ4LCAweDcxRjksIDB4MTVEQSwgMHg3MUZCLAorICAgIDB4MTVDOSwgMHg3MUZDLCAweDE1RDksIDB4NzFGRSwgMHgyMTYwLCAweDcxRkYsIDB4MTVEQiwgMHg3MjAwLCAweDM5QjIsCisgICAgMHg3MjA2LCAweDBEMzAsIDB4NzIwRCwgMHgxNURDLCAweDcyMTAsIDB4MTVERCwgMHg3MjFCLCAweDE1REUsIDB4NzIxRCwKKyAgICAweDM5QjMsIDB4NzIyOCwgMHgxNURGLCAweDcyMkEsIDB4MEJGQSwgMHg3MjJCLCAweDM5QjQsIDB4NzIyQywgMHgxNUUxLAorICAgIDB4NzIyRCwgMHgxNUUwLCAweDcyMzAsIDB4MTVFMiwgMHg3MjMyLCAweDE1RTMsIDB4NzIzNSwgMHgwOTBCLCAweDcyMzYsCisgICAgMHgwREQ1LCAweDcyMzgsIDB4MzlCNSwgMHg3MjNBLCAweDBFRjgsIDB4NzIzQiwgMHgxNUU0LCAweDcyM0MsIDB4MTVFNSwKKyAgICAweDcyM0QsIDB4MEFEOCwgMHg3MjNFLCAweDA4RDAsIDB4NzIzRiwgMHgxNUU2LCAweDcyNDAsIDB4MTVFNywgMHg3MjQxLAorICAgIDB4MzlCNiwgMHg3MjQ2LCAweDE1RTgsIDB4NzI0NywgMHgwRTIyLCAweDcyNDgsIDB4MEQ1QiwgMHg3MjRCLCAweDE1RTksCisgICAgMHg3MjRDLCAweDBEMEQsIDB4NzI1MiwgMHgwQkM5LCAweDcyNTMsIDB4MzlCNywgMHg3MjU1LCAweDM5QjgsIDB4NzI1NiwKKyAgICAweDM5QjksIDB4NzI1OCwgMHgxNUVBLCAweDcyNTksIDB4MDU2NywgMHg3MjVCLCAweDA2ODcsIDB4NzI1QywgMHgzOUJBLAorICAgIDB4NzI1RCwgMHgwRUQyLCAweDcyNUYsIDB4MEVDMiwgMHg3MjYxLCAweDA1MzQsIDB4NzI2MiwgMHgwRkRBLCAweDcyNjcsCisgICAgMHgwRTgwLCAweDcyNjksIDB4MERGQSwgMHg3MjcyLCAweDBBNUIsIDB4NzI3NCwgMHgxNUVCLCAweDcyNzksIDB4MEM5QiwKKyAgICAweDcyN0QsIDB4MDc1NywgMHg3MjdFLCAweDE1RUMsIDB4NzI4MCwgMHgwODQ0LCAweDcyODEsIDB4MTVFRSwgMHg3MjgyLAorICAgIDB4MTVFRCwgMHg3Mjg3LCAweDE1RUYsIDB4NzI4RCwgMHgzOUJCLCAweDcyOTIsIDB4MTVGMCwgMHg3Mjk2LCAweDE1RjEsCisgICAgMHg3MkEwLCAweDA2NTgsIDB4NzJBMiwgMHgxNUYyLCAweDcyQTcsIDB4MTVGMywgMHg3MkFDLCAweDA3NTgsIDB4NzJBRCwKKyAgICAweDM5QkMsIDB4NzJBRiwgMHgwRDVDLCAweDcyQjEsIDB4MjE2MSwgMHg3MkIyLCAweDE1RjUsIDB4NzJCNCwgMHgzOUJELAorICAgIDB4NzJCNiwgMHgwOURELCAweDcyQjksIDB4MTVGNCwgMHg3MkJFLCAweDIxNjIsIDB4NzJDMCwgMHgzNDJCLCAweDcyQzIsCisgICAgMHgwNkIwLCAweDcyQzMsIDB4MTVGNiwgMHg3MkM0LCAweDE1RjgsIDB4NzJDNiwgMHgxNUY3LCAweDcyQzcsIDB4MzlCRSwKKyAgICAweDcyQ0UsIDB4MTVGOSwgMHg3MkQwLCAweDA3ODUsIDB4NzJEMiwgMHgxNUZBLCAweDcyRDcsIDB4MDZFMSwgMHg3MkQ5LAorICAgIDB4MEFDMiwgMHg3MkRCLCAweDA4MEYsIDB4NzJFMCwgMHgxNUZDLCAweDcyRTEsIDB4MTVGRCwgMHg3MkUyLCAweDE1RkIsCisgICAgMHg3MkU5LCAweDA5MTksIDB4NzJFQywgMHgwQ0EwLCAweDcyRUQsIDB4MDZCMSwgMHg3MkY3LCAweDE1RkYsIDB4NzJGOCwKKyAgICAweDBCNkEsIDB4NzJGOSwgMHgxNUZFLCAweDcyRkIsIDB4MzlCRiwgMHg3MkZDLCAweDBGREIsIDB4NzJGRCwgMHgwRDE4LAorICAgIDB4NzMwNCwgMHgzOUMwLCAweDczMDUsIDB4MzlDMSwgMHg3MzBBLCAweDE2MDIsIDB4NzMxNiwgMHgxNjA0LCAweDczMTcsCisgICAgMHgxNjAxLCAweDczMUIsIDB4MEVFMCwgMHg3MzFDLCAweDE2MDMsIDB4NzMxRCwgMHgxNjA1LCAweDczMUYsIDB4MEY4QywKKyAgICAweDczMjQsIDB4MjE2MywgMHg3MzI1LCAweDE2MDksIDB4NzMyOCwgMHgzOUMyLCAweDczMjksIDB4MTYwOCwgMHg3MzJBLAorICAgIDB4MEJCNCwgMHg3MzJCLCAweDBDRTMsIDB4NzMyRSwgMHgwNzU5LCAweDczMkYsIDB4MTYwNywgMHg3MzMxLCAweDM5QzMsCisgICAgMHg3MzM0LCAweDE2MDYsIDB4NzMzNiwgMHgwRjFCLCAweDczMzcsIDB4MEYxQywgMHg3MzNFLCAweDE2MEEsIDB4NzMzRiwKKyAgICAweDA1MTAsIDB4NzM0MywgMHgzOUM0LCAweDczNDQsIDB4MDgwOCwgMHg3MzQ1LCAweDA4QjAsIDB4NzM0RSwgMHgxNjBCLAorICAgIDB4NzM0RiwgMHgxNjBDLCAweDczNTcsIDB4MTYwRSwgMHg3MzYzLCAweDA5NEQsIDB4NzM2OCwgMHgxNjEwLCAweDczNkEsCisgICAgMHgxNjBGLCAweDczNkMsIDB4MzlDNSwgMHg3MzcwLCAweDE2MTEsIDB4NzM3MiwgMHgwNUFCLCAweDczNzUsIDB4MTYxMywKKyAgICAweDczNzcsIDB4MjE2NSwgMHg3Mzc4LCAweDE2MTIsIDB4NzM3QSwgMHgxNjE1LCAweDczN0IsIDB4MTYxNCwgMHg3MzdDLAorICAgIDB4MzlDNiwgMHg3MzgzLCAweDM5QzcsIDB4NzM4NCwgMHgwNzcwLCAweDczODUsIDB4MzlDOCwgMHg3Mzg2LCAweDM5QzksCisgICAgMHg3Mzg3LCAweDBGNzAsIDB4NzM4OSwgMHgwNkM0LCAweDczOEIsIDB4MDUyNiwgMHg3Mzk1LCAweDM5Q0EsIDB4NzM5NiwKKyAgICAweDA2RTIsIDB4NzM5RSwgMHgzOUNCLCAweDczOUYsIDB4MzlDQywgMHg3M0EwLCAweDM5Q0QsIDB4NzNBNiwgMHgzOUNFLAorICAgIDB4NzNBOCwgMHgzQzNGLCAweDczQTksIDB4MDYxRCwgMHg3M0FCLCAweDM5Q0YsIDB4NzNCMiwgMHgwRkIwLCAweDczQjMsCisgICAgMHgxNjE3LCAweDczQjUsIDB4MzlEMCwgMHg3M0I3LCAweDM5RDEsIDB4NzNCQSwgMHgzNUVBLCAweDczQkIsIDB4MTYxOSwKKyAgICAweDczQkMsIDB4MzlEMiwgMHg3M0JELCAweDIxNjYsIDB4NzNDMCwgMHgxNjFBLCAweDczQzIsIDB4MDU1MSwgMHg3M0M4LAorICAgIDB4MTYxNiwgMHg3M0M5LCAweDIxNjcsIDB4NzNDQSwgMHgwODg3LCAweDczQ0QsIDB4MEJERCwgMHg3M0NFLCAweDE2MTgsCisgICAgMHg3M0NGLCAweDM5RDMsIDB4NzNEMiwgMHgyMTZBLCAweDczRDYsIDB4MjE2OCwgMHg3M0Q5LCAweDM5RDQsIDB4NzNERSwKKyAgICAweDE2MUQsIDB4NzNFMCwgMHgwOTFBLCAweDczRTMsIDB4MjE2OSwgMHg3M0U0LCAweDNDMzksIDB4NzNFNSwgMHgxNjFCLAorICAgIDB4NzNFOSwgMHgzOUQ1LCAweDczRUEsIDB4MDcxNCwgMHg3M0VELCAweDBENUQsIDB4NzNFRSwgMHgxNjFDLCAweDczRjEsCisgICAgMHgxNjM3LCAweDczRjQsIDB4MzlENiwgMHg3M0Y1LCAweDIxNkMsIDB4NzNGOCwgMHgxNjIyLCAweDczRkQsIDB4MzlENywKKyAgICAweDczRkUsIDB4MDc3MSwgMHg3NDAzLCAweDA2N0YsIDB4NzQwNCwgMHgzOUQ4LCAweDc0MDUsIDB4MTYxRiwgMHg3NDA2LAorICAgIDB4MEY2NywgMHg3NDA3LCAweDIxNkIsIDB4NzQwOSwgMHgwRjc4LCAweDc0MEEsIDB4MzlEOSwgMHg3NDFBLCAweDM5REEsCisgICAgMHg3NDFCLCAweDM5REIsIDB4NzQyMSwgMHgzQzNBLCAweDc0MjIsIDB4MEI1NiwgMHg3NDI0LCAweDM5REMsIDB4NzQyNSwKKyAgICAweDE2MjEsIDB4NzQyNiwgMHgyMTZELCAweDc0MjgsIDB4MzlERCwgMHg3NDI5LCAweDIxNkYsIDB4NzQyQSwgMHgyMTZFLAorICAgIDB4NzQyQywgMHgzOURFLCAweDc0MkUsIDB4MjE3MCwgMHg3NDJGLCAweDM5REYsIDB4NzQzMCwgMHgzOUUwLCAweDc0MzEsCisgICAgMHgzOUUxLCAweDc0MzIsIDB4MTYyMywgMHg3NDMzLCAweDBGOUUsIDB4NzQzNCwgMHgwNkNGLCAweDc0MzUsIDB4MEQ5MCwKKyAgICAweDc0MzYsIDB4MEQwMCwgMHg3NDM5LCAweDM5RTIsIDB4NzQzQSwgMHgxNjI0LCAweDc0M0YsIDB4MTYyNiwgMHg3NDQxLAorICAgIDB4MTYyOSwgMHg3NDQ0LCAweDM5RTMsIDB4NzQ0NywgMHgzOUU0LCAweDc0NEIsIDB4MzlFNSwgMHg3NDRELCAweDM5RTYsCisgICAgMHg3NDUxLCAweDM5RTcsIDB4NzQ1NSwgMHgxNjI1LCAweDc0NTcsIDB4MzlFOCwgMHg3NDU5LCAweDE2MjgsIDB4NzQ1QSwKKyAgICAweDA3OUUsIDB4NzQ1QiwgMHgwNEVGLCAweDc0NUMsIDB4MTYyQSwgMHg3NDVFLCAweDBBMzYsIDB4NzQ1RiwgMHgxNjI3LAorICAgIDB4NzQ2MCwgMHgwRkE0LCAweDc0NjIsIDB4MjE3MSwgMHg3NDYzLCAweDE2MkQsIDB4NzQ2NCwgMHgxRDM1LCAweDc0NjYsCisgICAgMHgzOUU5LCAweDc0NjksIDB4MTYyQiwgMHg3NDZBLCAweDE2MkUsIDB4NzQ2QiwgMHgzOUVBLCAweDc0NkYsIDB4MTYyMCwKKyAgICAweDc0NzAsIDB4MTYyQywgMHg3NDcxLCAweDM5RUIsIDB4NzQ3MywgMHgwODJDLCAweDc0NzYsIDB4MTYyRiwgMHg3NDdFLAorICAgIDB4MTYzMCwgMHg3NDgwLCAweDM5RUMsIDB4NzQ4MywgMHgwRjY4LCAweDc0ODUsIDB4MzlFRCwgMHg3NDg2LCAweDM5RUUsCisgICAgMHg3NDg3LCAweDM5RUYsIDB4NzQ4OSwgMHgyMTcyLCAweDc0OEIsIDB4MTYzMSwgMHg3NDkwLCAweDM5RjAsIDB4NzQ5OCwKKyAgICAweDM5RjEsIDB4NzQ5QywgMHgzOUYyLCAweDc0OUUsIDB4MTYzMiwgMHg3NDlGLCAweDIxNzMsIDB4NzRBMCwgMHgzOUYzLAorICAgIDB4NzRBMiwgMHgxNjFFLCAweDc0QTMsIDB4MzlGNCwgMHg3NEE3LCAweDE2MzMsIDB4NzRBOCwgMHgzOUY1LCAweDc0QUIsCisgICAgMHgzOUY2LCAweDc0QjAsIDB4MDYwMCwgMHg3NEI1LCAweDM5RjcsIDB4NzRCRCwgMHgwOEQxLCAweDc0QkYsIDB4MzlGOCwKKyAgICAweDc0QzgsIDB4MzlGOSwgMHg3NENBLCAweDE2MzQsIDB4NzRDRiwgMHgxNjM1LCAweDc0RDQsIDB4MTYzNiwgMHg3NERBLAorICAgIDB4MzlGQSwgMHg3NERDLCAweDA0REQsIDB4NzRERSwgMHgzOUZCLCAweDc0RTAsIDB4MTYzOCwgMHg3NEUyLCAweDBEQUQsCisgICAgMHg3NEUzLCAweDE2MzksIDB4NzRFNiwgMHgwNUUwLCAweDc0RTcsIDB4MTYzQSwgMHg3NEU5LCAweDE2M0IsIDB4NzRFRSwKKyAgICAweDE2M0MsIDB4NzRFRiwgMHgzNzUwLCAweDc0RjAsIDB4MTYzRSwgMHg3NEYxLCAweDE2M0YsIDB4NzRGMiwgMHgxNjNELAorICAgIDB4NzRGNiwgMHgwREM1LCAweDc0RjcsIDB4MTY0MSwgMHg3NEY4LCAweDE2NDAsIDB4NzUwMSwgMHgyMTc0LCAweDc1MDMsCisgICAgMHgxNjQzLCAweDc1MDQsIDB4MTY0MiwgMHg3NTA1LCAweDE2NDQsIDB4NzUwQywgMHgxNjQ1LCAweDc1MEQsIDB4MTY0NywKKyAgICAweDc1MEUsIDB4MTY0NiwgMHg3NTExLCAweDA4MEIsIDB4NzUxMywgMHgxNjQ5LCAweDc1MTUsIDB4MTY0OCwgMHg3NTE4LAorICAgIDB4MDYwMSwgMHg3NTFBLCAweDBBMTksIDB4NzUxQywgMHgwQzM2LCAweDc1MUUsIDB4MTY0QSwgMHg3NTFGLCAweDBBNUMsCisgICAgMHg3NTIyLCAweDM1REUsIDB4NzUyMywgMHgwODg4LCAweDc1MjUsIDB4MDUxQiwgMHg3NTI2LCAweDE2NEIsIDB4NzUyOCwKKyAgICAweDBGM0IsIDB4NzUyQiwgMHgwRTMzLCAweDc1MkMsIDB4MTY0QywgMHg3NTJGLCAweDIwRjIsIDB4NzUzMCwgMHgwQzNFLAorICAgIDB4NzUzMSwgMHgwRjFELCAweDc1MzIsIDB4MDdENSwgMHg3NTMzLCAweDBBMDMsIDB4NzUzNywgMHgwQjg5LCAweDc1MzgsCisgICAgMHgxMEM5LCAweDc1M0EsIDB4MEJDQSwgMHg3NTNCLCAweDA1NjgsIDB4NzUzQywgMHgxNjRELCAweDc1NDQsIDB4MTY0RSwKKyAgICAweDc1NDYsIDB4MTY1MywgMHg3NTQ5LCAweDE2NTEsIDB4NzU0QSwgMHgxNjUwLCAweDc1NEIsIDB4MTNDNywgMHg3NTRDLAorICAgIDB4MDU4NCwgMHg3NTRELCAweDE2NEYsIDB4NzU0RSwgMHgzOUZDLCAweDc1NEYsIDB4MDQ5RSwgMHg3NTUxLCAweDBEM0UsCisgICAgMHg3NTU0LCAweDBENUUsIDB4NzU1OSwgMHgwRjc5LCAweDc1NUEsIDB4MTY1NCwgMHg3NTVCLCAweDE2NTIsIDB4NzU1QywKKyAgICAweDBCOUEsIDB4NzU1RCwgMHgwQTRBLCAweDc1NjAsIDB4MEQzRiwgMHg3NTYyLCAweDBEOUYsIDB4NzU2NCwgMHgxNjU2LAorICAgIDB4NzU2NSwgMHgwRjc0LCAweDc1NjYsIDB4MDcyMywgMHg3NTY3LCAweDE2NTcsIDB4NzU2OSwgMHgxNjU1LCAweDc1NkEsCisgICAgMHgwRDZBLCAweDc1NkIsIDB4MTY1OCwgMHg3NTZDLCAweDNDM0IsIDB4NzU2RCwgMHgxNjU5LCAweDc1NkYsIDB4MjE3NSwKKyAgICAweDc1NzAsIDB4MDQ5RiwgMHg3NTczLCAweDA5REUsIDB4NzU3NCwgMHgxNjVFLCAweDc1NzUsIDB4Mzc1MSwgMHg3NTc2LAorICAgIDB4MTY1QiwgMHg3NTc3LCAweDBDQzUsIDB4NzU3OCwgMHgxNjVBLCAweDc1NzksIDB4MzlGRCwgMHg3NTdGLCAweDA2NDAsCisgICAgMHg3NTgxLCAweDM5RkUsIDB4NzU4MiwgMHgxNjYxLCAweDc1ODYsIDB4MTY1QywgMHg3NTg3LCAweDE2NUQsIDB4NzU4OSwKKyAgICAweDE2NjAsIDB4NzU4QSwgMHgxNjVGLCAweDc1OEIsIDB4MEQ5NywgMHg3NThFLCAweDBBQzQsIDB4NzU4RiwgMHgwQUMzLAorICAgIDB4NzU5MCwgMHgzOUZGLCAweDc1OTEsIDB4MDY1OSwgMHg3NTkyLCAweDNBMDAsIDB4NzU5MywgMHgzQTAxLCAweDc1OTQsCisgICAgMHgxNjYyLCAweDc1OUEsIDB4MTY2MywgMHg3NTlELCAweDE2NjQsIDB4NzVBMywgMHgxNjY2LCAweDc1QTUsIDB4MTY2NSwKKyAgICAweDc1QUIsIDB4MDRGOCwgMHg3NUIxLCAweDE2NkUsIDB4NzVCMiwgMHgwRDdDLCAweDc1QjMsIDB4MTY2OCwgMHg3NUI0LAorICAgIDB4M0EwMiwgMHg3NUI1LCAweDE2NkEsIDB4NzVCOCwgMHgxNjZDLCAweDc1QjksIDB4MEEwNCwgMHg3NUJDLCAweDE2NkQsCisgICAgMHg3NUJELCAweDE2NkIsIDB4NzVCRSwgMHgwOEVDLCAweDc1QzIsIDB4MTY2NywgMHg3NUMzLCAweDE2NjksIDB4NzVDNSwKKyAgICAweDBEQjQsIDB4NzVDNywgMHgwOUIxLCAweDc1Q0EsIDB4MTY3MCwgMHg3NUNELCAweDE2NkYsIDB4NzVEMiwgMHgxNjcxLAorICAgIDB4NzVENCwgMHgwOEQyLCAweDc1RDUsIDB4MDgxRiwgMHg3NUQ4LCAweDBDNzEsIDB4NzVEOSwgMHgxNjcyLCAweDc1REIsCisgICAgMHgwQkU3LCAweDc1REUsIDB4MTY3NCwgMHg3NUUyLCAweDBGNjksIDB4NzVFMywgMHgxNjczLCAweDc1RTQsIDB4M0EwMywKKyAgICAweDc1RTksIDB4MEFFQiwgMHg3NUVDLCAweDM3NTIsIDB4NzVGMCwgMHgxNjc5LCAweDc1RjIsIDB4MTY3QiwgMHg3NUYzLAorICAgIDB4MTY3QywgMHg3NUY0LCAweDBCOTIsIDB4NzVGOSwgMHgzQTA0LCAweDc1RkEsIDB4MTY3QSwgMHg3NUZDLCAweDE2NzcsCisgICAgMHg3NUZFLCAweDE2NzUsIDB4NzVGRiwgMHgxNjc2LCAweDc2MDAsIDB4M0EwNSwgMHg3NjAxLCAweDE2NzgsIDB4NzYwOSwKKyAgICAweDE2N0YsIDB4NzYwQSwgMHgzQTA2LCAweDc2MEIsIDB4MTY3RCwgMHg3NjBELCAweDE2N0UsIDB4NzYxNSwgMHgzQTA3LAorICAgIDB4NzYxNiwgMHgzQTA4LCAweDc2MTksIDB4M0EwOSwgMHg3NjFFLCAweDNBMEEsIDB4NzYxRiwgMHgxNjgwLCAweDc2MjAsCisgICAgMHgxNjgyLCAweDc2MjEsIDB4MTY4MywgMHg3NjIyLCAweDE2ODQsIDB4NzYyNCwgMHgxNjg1LCAweDc2MjYsIDB4MUUyRCwKKyAgICAweDc2MjcsIDB4MTY4MSwgMHg3NjJELCAweDNBMEIsIDB4NzYzMCwgMHgxNjg3LCAweDc2MzQsIDB4MTY4NiwgMHg3NjM1LAorICAgIDB4M0EwQywgMHg3NjNCLCAweDE2ODgsIDB4NzY0MiwgMHgwRjhELCAweDc2NDMsIDB4M0EwRCwgMHg3NjQ2LCAweDE2OEIsCisgICAgMHg3NjQ3LCAweDE2ODksIDB4NzY0OCwgMHgxNjhBLCAweDc2NEIsIDB4M0EwRSwgMHg3NjRDLCAweDA2MUUsIDB4NzY0RSwKKyAgICAweDM3NTMsIDB4NzY1MiwgMHgwRjBBLCAweDc2NTYsIDB4MEUxQSwgMHg3NjU4LCAweDE2OEQsIDB4NzY1QywgMHgxNjhDLAorICAgIDB4NzY2MSwgMHgxNjhFLCAweDc2NjIsIDB4MTY4RiwgMHg3NjY1LCAweDNBMEYsIDB4NzY2NywgMHgxNjkzLCAweDc2NjgsCisgICAgMHgxNjkwLCAweDc2NjksIDB4MTY5MSwgMHg3NjZBLCAweDE2OTIsIDB4NzY2QywgMHgxNjk0LCAweDc2NkQsIDB4M0ExMCwKKyAgICAweDc2NkYsIDB4M0ExMSwgMHg3NjcwLCAweDE2OTUsIDB4NzY3MSwgMHgzQTEyLCAweDc2NzIsIDB4MTY5NiwgMHg3Njc0LAorICAgIDB4M0ExMywgMHg3Njc2LCAweDE2OTcsIDB4NzY3OCwgMHgxNjk4LCAweDc2N0EsIDB4MEQ0MywgMHg3NjdCLCAweDBDNEEsCisgICAgMHg3NjdDLCAweDE2OTksIDB4NzY3RCwgMHgwRDI4LCAweDc2N0UsIDB4MERBNiwgMHg3NjgwLCAweDE2OUEsIDB4NzY4MiwKKyAgICAweDIxNzYsIDB4NzY4MywgMHgxNjlCLCAweDc2ODQsIDB4MEMyNCwgMHg3Njg2LCAweDA1ODUsIDB4NzY4NywgMHgwN0Q2LAorICAgIDB4NzY4OCwgMHgxNjlDLCAweDc2OEIsIDB4MTY5RCwgMHg3NjhFLCAweDE2OUUsIDB4NzY5MCwgMHgwODc3LCAweDc2OTMsCisgICAgMHgxNkEwLCAweDc2OTYsIDB4MTY5RiwgMHg3Njk5LCAweDE2QTEsIDB4NzY5QSwgMHgxNkEyLCAweDc2OUIsIDB4MjE3OSwKKyAgICAweDc2OUMsIDB4MjE3NywgMHg3NjlFLCAweDIxNzgsIDB4NzZBNCwgMHgzQTE0LCAweDc2QTUsIDB4M0ExNSwgMHg3NkE2LAorICAgIDB4MjE3QSwgMHg3NkFFLCAweDBEN0QsIDB4NzZCMCwgMHgxNkEzLCAweDc2QjQsIDB4MTZBNCwgMHg3NkI3LCAweDFEMUMsCisgICAgMHg3NkI4LCAweDE2QTUsIDB4NzZCOSwgMHgxNkE2LCAweDc2QkEsIDB4MTZBNywgMHg3NkJGLCAweDA4N0MsIDB4NzZDMiwKKyAgICAweDE2QTgsIDB4NzZDMywgMHgwRDBDLCAweDc2QzUsIDB4M0ExNiwgMHg3NkM2LCAweDBFOEQsIDB4NzZDOCwgMHgwNEYwLAorICAgIDB4NzZDQSwgMHgwNEY5LCAweDc2Q0MsIDB4M0ExNywgMHg3NkNELCAweDE2QTksIDB4NzZEMiwgMHgxNkFCLCAweDc2RDYsCisgICAgMHgxNkFBLCAweDc2RDcsIDB4MEM2QSwgMHg3NkRCLCAweDBBNUQsIDB4NzZEQywgMHgxNEQ4LCAweDc2REUsIDB4MTZBQywKKyAgICAweDc2REYsIDB4MEVDRCwgMHg3NkUxLCAweDE2QUQsIDB4NzZFMywgMHgwNjAyLCAweDc2RTQsIDB4MEQ2QiwgMHg3NkU1LAorICAgIDB4MTZBRSwgMHg3NkU3LCAweDE2QUYsIDB4NzZFQSwgMHgxNkIwLCAweDc2RUMsIDB4M0ExOCwgMHg3NkVFLCAweDBFRTgsCisgICAgMHg3NkYyLCAweDBFRTEsIDB4NzZGNCwgMHgwQkRBLCAweDc2RjgsIDB4MEFFQywgMHg3NkZCLCAweDE2QjIsIDB4NzZGQywKKyAgICAweDNBMTksIDB4NzZGRSwgMHgwOTZDLCAweDc3MDEsIDB4MDlCMiwgMHg3NzA0LCAweDE2QjUsIDB4NzcwNywgMHgxNkI0LAorICAgIDB4NzcwOCwgMHgxNkIzLCAweDc3MDksIDB4MEQ5MSwgMHg3NzBCLCAweDA2MDMsIDB4NzcwQywgMHgwNzVELCAweDc3MUIsCisgICAgMHgxNkJCLCAweDc3MUUsIDB4MTZCOCwgMHg3NzFGLCAweDBBMDUsIDB4NzcyMCwgMHgwRUJFLCAweDc3MjQsIDB4MTZCNywKKyAgICAweDc3MjUsIDB4MTZCOSwgMHg3NzI2LCAweDE2QkEsIDB4NzcyOSwgMHgxNkI2LCAweDc3MzQsIDB4M0ExQSwgMHg3NzM2LAorICAgIDB4M0ExQiwgMHg3NzM3LCAweDE2QkMsIDB4NzczOCwgMHgxNkJELCAweDc3M0EsIDB4MEJDQiwgMHg3NzNDLCAweDA2MUYsCisgICAgMHg3NzQwLCAweDBCQTMsIDB4Nzc0NiwgMHgyMTdDLCAweDc3NDcsIDB4MTZCRSwgMHg3NzVBLCAweDE2QkYsIDB4Nzc1QiwKKyAgICAweDE2QzIsIDB4Nzc1QywgMHgzQTFDLCAweDc3NUYsIDB4M0ExRCwgMHg3NzYwLCAweDNBMUUsIDB4Nzc2MSwgMHgwQTJELAorICAgIDB4Nzc2MiwgMHgxRUM1LCAweDc3NjMsIDB4MEM5QywgMHg3NzY1LCAweDE2QzMsIDB4Nzc2NiwgMHgwRTgxLCAweDc3NjgsCisgICAgMHgxNkMwLCAweDc3NkEsIDB4Mzc1NSwgMHg3NzZCLCAweDE2QzEsIDB4Nzc3MiwgMHgzQTFGLCAweDc3NzksIDB4MTZDNiwKKyAgICAweDc3N0QsIDB4M0EyMCwgMHg3NzdFLCAweDE2QzUsIDB4Nzc3RiwgMHgxNkM0LCAweDc3OEIsIDB4MTZDOCwgMHg3NzhFLAorICAgIDB4MTZDNywgMHg3NzkxLCAweDE2QzksIDB4Nzc5NSwgMHgzQTIxLCAweDc3OUUsIDB4MTZDQiwgMHg3N0EwLCAweDE2Q0EsCisgICAgMHg3N0E1LCAweDBFMUQsIDB4NzdBOSwgMHgzNzU2LCAweDc3QUEsIDB4M0EyMiwgMHg3N0FDLCAweDA5NjAsIDB4NzdBRCwKKyAgICAweDBGOEUsIDB4NzdCMCwgMHgxNkNDLCAweDc3QjMsIDB4MEM4RiwgMHg3N0I2LCAweDE2Q0QsIDB4NzdCOSwgMHgxNkNFLAorICAgIDB4NzdCQiwgMHgxNkQyLCAweDc3QkMsIDB4MTZEMCwgMHg3N0JELCAweDE2RDEsIDB4NzdCRiwgMHgxNkNGLCAweDc3QzcsCisgICAgMHgxNkQzLCAweDc3Q0QsIDB4MTZENCwgMHg3N0Q3LCAweDE2RDUsIDB4NzdEQSwgMHgxNkQ2LCAweDc3REIsIDB4MEVDMywKKyAgICAweDc3REMsIDB4MTZENywgMHg3N0UyLCAweDBFRkMsIDB4NzdFMywgMHgxNkQ4LCAweDc3RTUsIDB4MEI4QywgMHg3N0U2LAorICAgIDB4M0EyMywgMHg3N0U3LCAweDBEMjAsIDB4NzdFOSwgMHgwNkUzLCAweDc3RUQsIDB4MEI3OSwgMHg3N0VFLCAweDE2RDksCisgICAgMHg3N0VGLCAweDA2QjIsIDB4NzdGMCwgMHgzQTI0LCAweDc3RjMsIDB4MEE3NCwgMHg3N0Y0LCAweDNBMjUsIDB4NzdGQywKKyAgICAweDE2REEsIDB4NzgwMiwgMHgwODJELCAweDc4MDYsIDB4M0EyNiwgMHg3ODBDLCAweDE2REIsIDB4NzgxMiwgMHgxNkRDLAorICAgIDB4NzgxNCwgMHgwNzVBLCAweDc4MTUsIDB4MDg0NSwgMHg3ODIwLCAweDE2REUsIDB4NzgyMSwgMHgyMTdFLCAweDc4MjIsCisgICAgMHgzQTI3LCAweDc4MjUsIDB4MEM1MCwgMHg3ODI2LCAweDA4NDYsIDB4NzgyNywgMHgwNjY4LCAweDc4MkQsIDB4M0EyOCwKKyAgICAweDc4MkUsIDB4M0EyOSwgMHg3ODMwLCAweDNBMkEsIDB4NzgzMiwgMHgwRTUyLCAweDc4MzQsIDB4MEQwMSwgMHg3ODM1LAorICAgIDB4M0EyQiwgMHg3ODNBLCAweDBDNTEsIDB4NzgzRiwgMHgwN0VFLCAweDc4NDUsIDB4MTZFMCwgMHg3ODRFLCAweDIxN0YsCisgICAgMHg3ODRGLCAweDM0MUUsIDB4Nzg1MSwgMHgzQzNDLCAweDc4NUQsIDB4MDlCMywgMHg3ODY0LCAweDIxODAsIDB4Nzg2OCwKKyAgICAweDNBMkMsIDB4Nzg2QiwgMHgwRjdBLCAweDc4NkMsIDB4MDdENywgMHg3ODZGLCAweDA3NUIsIDB4Nzg3MiwgMHgwRDM3LAorICAgIDB4Nzg3NCwgMHgxNkUyLCAweDc4N0EsIDB4MjE4MSwgMHg3ODdDLCAweDE2RTQsIDB4Nzg4MSwgMHgwNzlGLCAweDc4ODYsCisgICAgMHgxNkUzLCAweDc4ODcsIDB4MEMxMiwgMHg3ODhDLCAweDE2RTYsIDB4Nzg4RCwgMHgwNTk1LCAweDc4OEUsIDB4MTZFMSwKKyAgICAweDc4OTEsIDB4MEQ3RSwgMHg3ODkzLCAweDA0RDIsIDB4Nzg5NSwgMHgwODVDLCAweDc4OTcsIDB4MEZGOCwgMHg3ODlBLAorICAgIDB4MTZFNSwgMHg3ODlFLCAweDNBMkQsIDB4NzhBMywgMHgxNkU3LCAweDc4QTcsIDB4MEUxQiwgMHg3OEE5LCAweDBBN0QsCisgICAgMHg3OEFBLCAweDE2RTksIDB4NzhBRiwgMHgxNkVBLCAweDc4QjUsIDB4MTZFOCwgMHg3OEJBLCAweDA1QUMsIDB4NzhCQywKKyAgICAweDE2RjAsIDB4NzhCRSwgMHgxNkVGLCAweDc4QzEsIDB4MDhEMywgMHg3OEM1LCAweDE2RjEsIDB4NzhDNiwgMHgxNkVDLAorICAgIDB4NzhDOCwgMHgzQTJFLCAweDc4Q0EsIDB4MTZGMiwgMHg3OENCLCAweDE2RUQsIDB4NzhDQywgMHgzQTJGLCAweDc4Q0UsCisgICAgMHgzQTMwLCAweDc4RDAsIDB4MEQ2QywgMHg3OEQxLCAweDE2RUIsIDB4NzhENCwgMHgxNkVFLCAweDc4REEsIDB4MTZGNSwKKyAgICAweDc4RTAsIDB4M0EzMiwgMHg3OEUxLCAweDNBMzMsIDB4NzhFNCwgMHgzQTMxLCAweDc4RTcsIDB4MTZGNCwgMHg3OEU4LAorICAgIDB4MEU4RiwgMHg3OEVDLCAweDE2RjMsIDB4NzhFRiwgMHgwNEFGLCAweDc4RjIsIDB4M0EzNCwgMHg3OEY0LCAweDE2RjcsCisgICAgMHg3OEY3LCAweDNBMzUsIDB4NzhGQiwgMHgzQTM2LCAweDc4RkQsIDB4MTZGNiwgMHg3OTAxLCAweDA5QjQsIDB4NzkwNywKKyAgICAweDE2RjgsIDB4NzkwRSwgMHgwQUM1LCAweDc5MTEsIDB4MTZGQSwgMHg3OTEyLCAweDE2RjksIDB4NzkxOSwgMHgxNkZCLAorICAgIDB4NzkyNiwgMHgxNkRELCAweDc5MkEsIDB4MTZERiwgMHg3OTJCLCAweDE2RkQsIDB4NzkyQywgMHgxNkZDLCAweDc5MzAsCisgICAgMHgyMTgyLCAweDc5MzEsIDB4M0EzNywgMHg3OTM0LCAweDNBMzgsIDB4NzkzQSwgMHgwOEQ0LCAweDc5M0IsIDB4M0EzOSwKKyAgICAweDc5M0MsIDB4MEZCMSwgMHg3OTNELCAweDNBM0EsIDB4NzkzRSwgMHgwOEZFLCAweDc5NDAsIDB4MTZGRSwgMHg3OTQxLAorICAgIDB4MDcwRCwgMHg3OTQ1LCAweDNBM0IsIDB4Nzk0NywgMHgwNjVBLCAweDc5NDgsIDB4MDY0MSwgMHg3OTQ5LCAweDA4QjEsCisgICAgMHg3OTUwLCAweDBGMUUsIDB4Nzk1MywgMHgxNzA0LCAweDc5NTUsIDB4MTcwMywgMHg3OTU2LCAweDBBQzYsIDB4Nzk1NywKKyAgICAweDE3MDAsIDB4Nzk1QSwgMHgxNzAyLCAweDc5NUIsIDB4M0EzQywgMHg3OTVDLCAweDNBM0QsIDB4Nzk1RCwgMHgwOTU1LAorICAgIDB4Nzk1RSwgMHgwQTA2LCAweDc5NUYsIDB4MTcwMSwgMHg3OTYwLCAweDE2RkYsIDB4Nzk2MiwgMHgwQ0UwLCAweDc5NjUsCisgICAgMHgwOUI1LCAweDc5NjgsIDB4MERBRSwgMHg3OTZELCAweDA4NDcsIDB4Nzk3NywgMHgwQzcyLCAweDc5N0EsIDB4MTcwNSwKKyAgICAweDc5N0YsIDB4MTcwNiwgMHg3OTgwLCAweDE3MUMsIDB4Nzk4MSwgMHgwNkQwLCAweDc5ODQsIDB4MEZFMywgMHg3OTg1LAorICAgIDB4MEFCNywgMHg3OThBLCAweDE3MDcsIDB4Nzk4QiwgMHgzQTNFLCAweDc5OEQsIDB4MDU1MiwgMHg3OThFLCAweDBDMTMsCisgICAgMHg3OThGLCAweDBERjEsIDB4Nzk5NCwgMHgyMTg2LCAweDc5OTYsIDB4M0EzRiwgMHg3OTk4LCAweDNBNDAsIDB4Nzk5QiwKKyAgICAweDIxODgsIDB4Nzk5RCwgMHgxNzA4LCAweDc5QTYsIDB4MDY5NCwgMHg3OUE3LCAweDE3MDksIDB4NzlBQSwgMHgxNzBCLAorICAgIDB4NzlBRSwgMHgxNzBDLCAweDc5QjAsIDB4MENERiwgMHg3OUIxLCAweDFFNEUsIDB4NzlCMywgMHgxNzBELCAweDc5QjgsCisgICAgMHgzQTQxLCAweDc5QjksIDB4MTcwRSwgMHg3OUJBLCAweDE3MEYsIDB4NzlCQiwgMHgzQTQyLCAweDc5QkQsIDB4MDZEMSwKKyAgICAweDc5QkUsIDB4MDU1MywgMHg3OUJGLCAweDBDOUQsIDB4NzlDMCwgMHgwOTMyLCAweDc5QzEsIDB4MDhCMiwgMHg3OUM5LAorICAgIDB4MTcxMCwgMHg3OUNBLCAweDNBNDMsIDB4NzlDQiwgMHgwOTMzLCAweDc5RDEsIDB4MDU0QSwgMHg3OUQyLCAweDBEQjUsCisgICAgMHg3OUQ1LCAweDE3MTEsIDB4NzlEOCwgMHgwRDdGLCAweDc5REEsIDB4M0E0NCwgMHg3OURGLCAweDBBQzcsIDB4NzlFMSwKKyAgICAweDE3MTQsIDB4NzlFMywgMHgxNzE1LCAweDc5RTQsIDB4MEQxRiwgMHg3OUU2LCAweDBBMDcsIDB4NzlFNywgMHgxNzEyLAorICAgIDB4NzlFOSwgMHgwQjlGLCAweDc5RUMsIDB4MTcxMywgMHg3OUYwLCAweDA5QjYsIDB4NzlGQiwgMHgwNEEwLCAweDdBMDAsCisgICAgMHgwNjQzLCAweDdBMDMsIDB4M0E0NSwgMHg3QTA1LCAweDM2MzMsIDB4N0EwOCwgMHgxNzE2LCAweDdBMDksIDB4M0E0NiwKKyAgICAweDdBMEIsIDB4MEMxNCwgMHg3QTBELCAweDE3MTcsIDB4N0EwRSwgMHgwQTZCLCAweDdBMTEsIDB4M0E0NywgMHg3QTE0LAorICAgIDB4MEVCOSwgMHg3QTE3LCAweDBEOTUsIDB4N0ExOCwgMHgxNzE4LCAweDdBMTksIDB4MTcxOSwgMHg3QTFBLCAweDBCOTMsCisgICAgMHg3QTFDLCAweDBGOEYsIDB4N0ExRSwgMHgzQTQ4LCAweDdBMUYsIDB4MTcxQiwgMHg3QTIwLCAweDE3MUEsIDB4N0EyRCwKKyAgICAweDNBNDksIDB4N0EyRSwgMHgwOTFCLCAweDdBMzEsIDB4MTcxRCwgMHg3QTMyLCAweDA0QjQsIDB4N0EzNywgMHgxNzIwLAorICAgIDB4N0EzOSwgMHgzQTRBLCAweDdBM0IsIDB4MTcxRSwgMHg3QTNDLCAweDA1NTQsIDB4N0EzRCwgMHgwNzI0LCAweDdBM0UsCisgICAgMHgxNzFGLCAweDdBM0YsIDB4MDdEOCwgMHg3QTQwLCAweDA4MDQsIDB4N0E0MiwgMHgwRTM2LCAweDdBNDMsIDB4MTcyMSwKKyAgICAweDdBNDUsIDB4M0E0QiwgMHg3QTQ2LCAweDBFODIsIDB4N0E0OSwgMHgxNzIzLCAweDdBNEMsIDB4M0E0QywgMHg3QTRELAorICAgIDB4MEE3NSwgMHg3QTRFLCAweDA0RjEsIDB4N0E0RiwgMHgwNTNBLCAweDdBNTAsIDB4MDQ3MCwgMHg3QTU3LCAweDE3MjIsCisgICAgMHg3QTVELCAweDNBNEQsIDB4N0E2MCwgMHgzQTRFLCAweDdBNjEsIDB4MTcyNCwgMHg3QTYyLCAweDE3MjUsIDB4N0E2MywKKyAgICAweDA5REYsIDB4N0E2OSwgMHgxNzI2LCAweDdBNkIsIDB4MDVBRCwgMHg3QTZELCAweDNBNEYsIDB4N0E3MCwgMHgxNzI4LAorICAgIDB4N0E3NCwgMHgwNzQwLCAweDdBNzYsIDB4MDY4MCwgMHg3QTc4LCAweDNBNTAsIDB4N0E3OSwgMHgxNzI5LCAweDdBN0EsCisgICAgMHgwNkVELCAweDdBN0QsIDB4MTcyQSwgMHg3QTdGLCAweDBBQTAsIDB4N0E4MSwgMHgwQ0E1LCAweDdBODMsIDB4MEE4NCwKKyAgICAweDdBODQsIDB4MDg2NSwgMHg3QTg4LCAweDE3MkIsIDB4N0E5MiwgMHgwQkEwLCAweDdBOTMsIDB4MEFFRCwgMHg3QTk1LAorICAgIDB4MTcyRCwgMHg3QTk2LCAweDE3MkYsIDB4N0E5NywgMHgxNzJDLCAweDdBOTgsIDB4MTcyRSwgMHg3QTlGLCAweDA2RjgsCisgICAgMHg3QUEwLCAweDNBNTEsIDB4N0FBMywgMHgzQTUyLCAweDdBQTksIDB4MTczMCwgMHg3QUFBLCAweDA2RkMsIDB4N0FBRSwKKyAgICAweDA2ODEsIDB4N0FBRiwgMHgwRjNDLCAweDdBQjAsIDB4MTczMiwgMHg3QUIzLCAweDNBNTMsIDB4N0FCNiwgMHgxNzMzLAorICAgIDB4N0FCQSwgMHgwNEQwLCAweDdBQkIsIDB4M0E1NCwgMHg3QUJDLCAweDNBNTUsIDB4N0FCRiwgMHgxNzM2LCAweDdBQzMsCisgICAgMHgwNUQ0LCAweDdBQzQsIDB4MTczNSwgMHg3QUM1LCAweDE3MzQsIDB4N0FDNiwgMHgzQTU2LCAweDdBQzcsIDB4MTczOCwKKyAgICAweDdBQzgsIDB4MTczMSwgMHg3QUNBLCAweDE3MzksIDB4N0FDQiwgMHgwRjcxLCAweDdBQ0QsIDB4MTczQSwgMHg3QUNGLAorICAgIDB4MTczQiwgMHg3QUQxLCAweDIxODksIDB4N0FEMiwgMHgxMUM1LCAweDdBRDMsIDB4MTczRCwgMHg3QUQ1LCAweDE3M0MsCisgICAgMHg3QUQ5LCAweDE3M0UsIDB4N0FEQSwgMHgxNzNGLCAweDdBREMsIDB4MEY3RCwgMHg3QURELCAweDE3NDAsIDB4N0FERiwKKyAgICAweDFDMDgsIDB4N0FFMCwgMHgwOUI3LCAweDdBRTEsIDB4MTc0MSwgMHg3QUUyLCAweDE3NDIsIDB4N0FFMywgMHgwOTYxLAorICAgIDB4N0FFNSwgMHgwQzkwLCAweDdBRTYsIDB4MTc0MywgMHg3QUU3LCAweDIxOEEsIDB4N0FFQSwgMHgwQjY2LCAweDdBRUIsCisgICAgMHgyMThDLCAweDdBRUQsIDB4MTc0NCwgMHg3QUVGLCAweDBCN0EsIDB4N0FGMCwgMHgxNzQ1LCAweDdBRjYsIDB4MDY5RCwKKyAgICAweDdBRjgsIDB4MTA3NiwgMHg3QUY5LCAweDBCOUIsIDB4N0FGQSwgMHgwOERGLCAweDdBRkYsIDB4MDYwNCwgMHg3QjAyLAorICAgIDB4MTc0NiwgMHg3QjA0LCAweDE3NTMsIDB4N0IwNiwgMHgxNzQ5LCAweDdCMDcsIDB4M0E1NywgMHg3QjA4LCAweDA2ODIsCisgICAgMHg3QjBBLCAweDE3NDgsIDB4N0IwQiwgMHgxNzU1LCAweDdCMEYsIDB4MTc0NywgMHg3QjExLCAweDA5QjgsIDB4N0IxNCwKKyAgICAweDNBNTgsIDB4N0IxOCwgMHgxNzRCLCAweDdCMTksIDB4MTc0QywgMHg3QjFCLCAweDBDMjUsIDB4N0IxRSwgMHgxNzRELAorICAgIDB4N0IyMCwgMHgwNUJDLCAweDdCMjUsIDB4MEEyMCwgMHg3QjI2LCAweDBERDYsIDB4N0IyNywgMHgzQTU5LCAweDdCMjgsCisgICAgMHgxNzRGLCAweDdCMkMsIDB4MEI0OCwgMHg3QjMxLCAweDNBNUEsIDB4N0IzMywgMHgxNzRBLCAweDdCMzUsIDB4MTc0RSwKKyAgICAweDdCMzYsIDB4MTc1MCwgMHg3QjM5LCAweDA4NkIsIDB4N0I0NSwgMHgxNzU3LCAweDdCNDYsIDB4MERBMCwgMHg3QjQ3LAorICAgIDB4M0E1QiwgMHg3QjQ4LCAweDBEM0EsIDB4N0I0OSwgMHgwQzczLCAweDdCNEIsIDB4MDZEMiwgMHg3QjRDLCAweDE3NTYsCisgICAgMHg3QjRELCAweDE3NTQsIDB4N0I0RSwgMHgzQTVDLCAweDdCNEYsIDB4MEQ0OSwgMHg3QjUwLCAweDE3NTEsIDB4N0I1MSwKKyAgICAweDBCOUMsIDB4N0I1MiwgMHgwQzc1LCAweDdCNTMsIDB4Mzc1RCwgMHg3QjU0LCAweDBDNzQsIDB4N0I1NiwgMHgwODY2LAorICAgIDB4N0I1RCwgMHgxNzY5LCAweDdCNjAsIDB4M0E1RCwgMHg3QjY1LCAweDE3NTksIDB4N0I2NywgMHgxNzVCLCAweDdCNjksCisgICAgMHgzQTVFLCAweDdCNkMsIDB4MTc1RSwgMHg3QjZELCAweDNBNUYsIDB4N0I2RSwgMHgxNzVGLCAweDdCNzAsIDB4MTc1QywKKyAgICAweDdCNzEsIDB4MTc1RCwgMHg3QjcyLCAweDNBNjAsIDB4N0I3NCwgMHgxNzVBLCAweDdCNzUsIDB4MTc1OCwgMHg3QjdBLAorICAgIDB4MTc1MiwgMHg3Qjg2LCAweDBFMUYsIDB4N0I4NywgMHgwNTU1LCAweDdCOEIsIDB4MTc2NiwgMHg3QjhELCAweDE3NjMsCisgICAgMHg3QjhGLCAweDE3NjgsIDB4N0I5MSwgMHgzQTYxLCAweDdCOTIsIDB4MTc2NywgMHg3Qjk0LCAweDBEMjksIDB4N0I5NSwKKyAgICAweDBFQjMsIDB4N0I5NywgMHgwODg5LCAweDdCOTgsIDB4MTc2MSwgMHg3Qjk5LCAweDE3NkEsIDB4N0I5QSwgMHgxNzY1LAorICAgIDB4N0I5QywgMHgxNzY0LCAweDdCOUQsIDB4MTc2MCwgMHg3QjlFLCAweDIxOEQsIDB4N0I5RiwgMHgxNzYyLCAweDdCQTEsCisgICAgMHgwNjA1LCAweDdCQUEsIDB4MEI3QiwgMHg3QkFELCAweDBBQTEsIDB4N0JBRiwgMHgzQTYyLCAweDdCQjEsIDB4MEQzNiwKKyAgICAweDdCQjQsIDB4MTc2RiwgMHg3QkI4LCAweDBEMzgsIDB4N0JDMCwgMHgwQTg1LCAweDdCQzEsIDB4MTc2QywgMHg3QkM0LAorICAgIDB4MEQ2MywgMHg3QkM2LCAweDE3NzAsIDB4N0JDNywgMHgwRTIzLCAweDdCQzksIDB4MEI5OSwgMHg3QkNCLCAweDE3NkIsCisgICAgMHg3QkNDLCAweDE3NkQsIDB4N0JDRiwgMHgxNzZFLCAweDdCRDcsIDB4M0E2MywgMHg3QkQ5LCAweDNBNjQsIDB4N0JERCwKKyAgICAweDE3NzEsIDB4N0JFMCwgMHgwOEYwLCAweDdCRTQsIDB4MEM5RSwgMHg3QkU1LCAweDE3NzYsIDB4N0JFNiwgMHgxNzc1LAorICAgIDB4N0JFOSwgMHgxNzcyLCAweDdCRUQsIDB4MEZEQywgMHg3QkYzLCAweDE3N0IsIDB4N0JGNiwgMHgxNzdGLCAweDdCRjcsCisgICAgMHgxNzdDLCAweDdDMDAsIDB4MTc3OCwgMHg3QzA3LCAweDE3NzksIDB4N0MwQiwgMHgzQTY1LCAweDdDMEQsIDB4MTc3RSwKKyAgICAweDdDMEYsIDB4M0E2NiwgMHg3QzExLCAweDE3NzMsIDB4N0MxMiwgMHgxMEVBLCAweDdDMTMsIDB4MTc3QSwgMHg3QzE0LAorICAgIDB4MTc3NCwgMHg3QzE3LCAweDE3N0QsIDB4N0MxRSwgMHgxRTNCLCAweDdDMUYsIDB4MTc4MywgMHg3QzIwLCAweDNBNjcsCisgICAgMHg3QzIxLCAweDA2MDYsIDB4N0MyMywgMHgxNzgwLCAweDdDMjYsIDB4M0E2OCwgMHg3QzI3LCAweDE3ODEsIDB4N0MyQSwKKyAgICAweDE3ODIsIDB4N0MyQiwgMHgxNzg1LCAweDdDMzEsIDB4M0E2OSwgMHg3QzM2LCAweDNBNkEsIDB4N0MzNywgMHgxNzg0LAorICAgIDB4N0MzOCwgMHgwRDhBLCAweDdDM0QsIDB4MTc4NiwgMHg3QzNFLCAweDBGQzQsIDB4N0MzRiwgMHgwRTNELCAweDdDNDAsCisgICAgMHgxNzhCLCAweDdDNDMsIDB4MTc4OCwgMHg3QzRDLCAweDE3ODcsIDB4N0M0RCwgMHgwQTc2LCAweDdDNEYsIDB4MTc4QSwKKyAgICAweDdDNTAsIDB4MTc4QywgMHg3QzUxLCAweDNBNkIsIDB4N0M1NCwgMHgxNzg5LCAweDdDNTYsIDB4MTc5MCwgMHg3QzU4LAorICAgIDB4MTc4RCwgMHg3QzU5LCAweDNBNkMsIDB4N0M1RiwgMHgxNzhFLCAweDdDNjAsIDB4MTc3NywgMHg3QzY0LCAweDE3OEYsCisgICAgMHg3QzY1LCAweDE3OTEsIDB4N0M2NywgMHgzQTZELCAweDdDNkMsIDB4MTc5MiwgMHg3QzZFLCAweDNBNkUsIDB4N0M3MCwKKyAgICAweDNBNkYsIDB4N0M3MywgMHgwRTE2LCAweDdDNzUsIDB4MTc5MywgMHg3QzdCLCAweDM3MEUsIDB4N0M3RSwgMHgwRUVFLAorICAgIDB4N0M4MSwgMHgwNkM2LCAweDdDODIsIDB4MDZGRiwgMHg3QzgzLCAweDE3OTQsIDB4N0M4OSwgMHgwRTA0LCAweDdDOEIsCisgICAgMHgwQTJFLCAweDdDOEQsIDB4MEVCQywgMHg3QzkwLCAweDE3OTUsIDB4N0M5MiwgMHgwRjdCLCAweDdDOTUsIDB4MEQyQSwKKyAgICAweDdDOTcsIDB4MEFDOCwgMHg3Qzk4LCAweDBDRUEsIDB4N0M5QiwgMHgwOTU3LCAweDdDOUYsIDB4MDQ4NCwgMHg3Q0ExLAorICAgIDB4MTc5QSwgMHg3Q0EyLCAweDE3OTgsIDB4N0NBNCwgMHgxNzk2LCAweDdDQTUsIDB4MDVERCwgMHg3Q0E3LCAweDA5QjksCisgICAgMHg3Q0E4LCAweDE3OUIsIDB4N0NBQiwgMHgxNzk5LCAweDdDQUQsIDB4MTc5NywgMHg3Q0FFLCAweDE3OUYsIDB4N0NCMSwKKyAgICAweDE3OUUsIDB4N0NCMiwgMHgxNzlELCAweDdDQjMsIDB4MTc5QywgMHg3Q0I5LCAweDE3QTAsIDB4N0NCQywgMHgzQTcwLAorICAgIDB4N0NCRCwgMHgxN0ExLCAweDdDQkUsIDB4MEE1RSwgMHg3Q0JGLCAweDNBNzEsIDB4N0NDMCwgMHgxN0EyLCAweDdDQzIsCisgICAgMHgxN0E0LCAweDdDQzUsIDB4MTdBMywgMHg3Q0M4LCAweDNBNzIsIDB4N0NDOSwgMHgzQTczLCAweDdDQ0EsIDB4MDc4NiwKKyAgICAweDdDQ0UsIDB4MEFCQSwgMHg3Q0QyLCAweDE3QTYsIDB4N0NENiwgMHgwQzc2LCAweDdDRDcsIDB4M0E3NCwgMHg3Q0Q4LAorICAgIDB4MTdBNSwgMHg3Q0Q5LCAweDNBNzUsIDB4N0NEQywgMHgxN0E3LCAweDdDREQsIDB4M0E3NiwgMHg3Q0RFLCAweDBFMDUsCisgICAgMHg3Q0RGLCAweDBBRUUsIDB4N0NFMCwgMHgwN0Q5LCAweDdDRTIsIDB4MTdBOCwgMHg3Q0U3LCAweDBGOTAsIDB4N0NFQiwKKyAgICAweDNBNzcsIDB4N0NFRiwgMHgxN0FBLCAweDdDRjIsIDB4MTdBQiwgMHg3Q0Y0LCAweDE3QUMsIDB4N0NGNiwgMHgxN0FELAorICAgIDB4N0NGOCwgMHgwOEIzLCAweDdDRkEsIDB4MTdBRSwgMHg3Q0ZCLCAweDA3MjUsIDB4N0NGRSwgMHgwNjg0LCAweDdEMDAsCisgICAgMHgwNjQ0LCAweDdEMDIsIDB4MTdCMCwgMHg3RDA0LCAweDBFRkYsIDB4N0QwNSwgMHgwN0RBLCAweDdEMDYsIDB4MTdBRiwKKyAgICAweDdEMDcsIDB4M0E3OCwgMHg3RDA4LCAweDNBNzksIDB4N0QwOSwgMHgzQTdBLCAweDdEMEEsIDB4MTdCMywgMHg3RDBCLAorICAgIDB4MEVGMiwgMHg3RDBELCAweDBDRjIsIDB4N0QxMCwgMHgwREE1LCAweDdEMTMsIDB4M0E3QiwgMHg3RDE0LCAweDA5NkQsCisgICAgMHg3RDE1LCAweDE3QjIsIDB4N0QxNywgMHgwOEZGLCAweDdEMTgsIDB4MDdEQiwgMHg3RDE5LCAweDA4QjQsIDB4N0QxQSwKKyAgICAweDA2ODMsIDB4N0QxQiwgMHgwRTA2LCAweDdEMUMsIDB4MTdCMSwgMHg3RDFELCAweDNBN0MsIDB4N0QyMCwgMHgwQUM5LAorICAgIDB4N0QyMSwgMHgwRTcwLCAweDdEMjIsIDB4MDg2NywgMHg3RDIzLCAweDNBN0QsIDB4N0QyQiwgMHgwOEI1LCAweDdEMkMsCisgICAgMHgwQkY5LCAweDdEMkUsIDB4MTdCNiwgMHg3RDJGLCAweDBGQTcsIDB4N0QzMCwgMHgwODQ5LCAweDdEMzIsIDB4MTdCNywKKyAgICAweDdEMzMsIDB4MEEwOCwgMHg3RDM1LCAweDE3QjksIDB4N0QzOSwgMHgwOUJBLCAweDdEM0EsIDB4MDgyMCwgMHg3RDNGLAorICAgIDB4MTdCOCwgMHg3RDQxLCAweDNBN0UsIDB4N0Q0MiwgMHgwOTM0LCAweDdENDMsIDB4MDc3MiwgMHg3RDQ0LCAweDBBQ0EsCisgICAgMHg3RDQ1LCAweDE3QjQsIDB4N0Q0NiwgMHgxN0JBLCAweDdENDgsIDB4MjE4RiwgMHg3RDRCLCAweDE3QjUsIDB4N0Q0QywKKyAgICAweDA3MjYsIDB4N0Q0RSwgMHgxN0JELCAweDdENEYsIDB4MTdDMSwgMHg3RDUwLCAweDA3NDEsIDB4N0Q1MywgMHgzQTdGLAorICAgIDB4N0Q1NiwgMHgxN0JDLCAweDdENTksIDB4M0E4MCwgMHg3RDVCLCAweDE3QzUsIDB4N0Q1QywgMHgyMTkwLCAweDdENUQsCisgICAgMHgzQTgxLCAweDdENUUsIDB4MDdEQywgMHg3RDYxLCAweDBGNTcsIDB4N0Q2MiwgMHgwNDgwLCAweDdENjMsIDB4MTdDMiwKKyAgICAweDdENjYsIDB4MDY4NSwgMHg3RDY4LCAweDE3QkYsIDB4N0Q2RSwgMHgxN0MwLCAweDdENzEsIDB4MEM3NywgMHg3RDcyLAorICAgIDB4MTdCRSwgMHg3RDczLCAweDE3QkIsIDB4N0Q3NSwgMHgwNTg2LCAweDdENzYsIDB4MEE4OCwgMHg3RDc5LCAweDA3NUMsCisgICAgMHg3RDdBLCAweDNBODIsIDB4N0Q3RCwgMHgxN0M3LCAweDdEODYsIDB4M0E4MywgMHg3RDg5LCAweDE3QzQsIDB4N0Q4QiwKKyAgICAweDNBODQsIDB4N0Q4QywgMHgzQTg1LCAweDdEOEYsIDB4MTdDNiwgMHg3RDkzLCAweDE3QzMsIDB4N0Q5OSwgMHgwNzI3LAorICAgIDB4N0Q5QSwgMHgwQjEzLCAweDdEOUIsIDB4MTdDOCwgMHg3RDlDLCAweDBBRjAsIDB4N0Q5RiwgMHgxN0Q1LCAweDdEQTAsCisgICAgMHgyMTkyLCAweDdEQTIsIDB4MTdEMSwgMHg3REEzLCAweDE3Q0IsIDB4N0RBQiwgMHgxN0NGLCAweDdEQUMsIDB4MDkyNiwKKyAgICAweDdEQUQsIDB4MDRBMSwgMHg3REFFLCAweDE3Q0EsIDB4N0RBRiwgMHgxN0QyLCAweDdEQjAsIDB4MTdENiwgMHg3REIxLAorICAgIDB4MDdERCwgMHg3REIyLCAweDBFRTIsIDB4N0RCNCwgMHgwQkYyLCAweDdEQjUsIDB4MTdDQywgMHg3REI3LCAweDIxOTEsCisgICAgMHg3REI4LCAweDE3RDQsIDB4N0RCQSwgMHgxN0M5LCAweDdEQkIsIDB4MEI3QywgMHg3REJELCAweDE3Q0UsIDB4N0RCRSwKKyAgICAweDA0ODEsIDB4N0RCRiwgMHgwRUQ2LCAweDdEQzcsIDB4MTdDRCwgMHg3RENBLCAweDA2RDMsIDB4N0RDQiwgMHgwRDgwLAorICAgIDB4N0RDQywgMHgzQTg2LCAweDdEQ0YsIDB4MEFFRiwgMHg3REQxLCAweDBGOTgsIDB4N0REMiwgMHgwOTc5LCAweDdERDUsCisgICAgMHgxN0ZELCAweDdERDYsIDB4MjE5MywgMHg3REQ4LCAweDE3RDcsIDB4N0REQSwgMHgwQUEyLCAweDdEREMsIDB4MTdEMywKKyAgICAweDdEREQsIDB4MTdEOCwgMHg3RERFLCAweDE3REEsIDB4N0RFMCwgMHgwQzE1LCAweDdERTEsIDB4MTdERCwgMHg3REUzLAorICAgIDB4MzQwQSwgMHg3REU0LCAweDE3RDksIDB4N0RFOCwgMHgwRTI0LCAweDdERTksIDB4MDYwNywgMHg3REVCLCAweDNBODcsCisgICAgMHg3REVDLCAweDBFRDcsIDB4N0RFRiwgMHgwNEEyLCAweDdERjEsIDB4M0E4OCwgMHg3REYyLCAweDE3REMsIDB4N0RGNCwKKyAgICAweDBGQzUsIDB4N0RGOSwgMHgzQTg5LCAweDdERkIsIDB4MTdEQiwgMHg3RTAxLCAweDA1MTEsIDB4N0UwNCwgMHgwQ0M0LAorICAgIDB4N0UwNSwgMHgxN0RFLCAweDdFMDgsIDB4M0E4QSwgMHg3RTA5LCAweDE3RTUsIDB4N0UwQSwgMHgxN0RGLCAweDdFMEIsCisgICAgMHgxN0U2LCAweDdFMTEsIDB4M0E4QiwgMHg3RTEyLCAweDE3RTIsIDB4N0UxNSwgMHgzQThDLCAweDdFMUIsIDB4MEQzMSwKKyAgICAweDdFMUUsIDB4MDhGNiwgMHg3RTFGLCAweDE3RTQsIDB4N0UyMCwgMHgzQThELCAweDdFMjEsIDB4MTdFMSwgMHg3RTIyLAorICAgIDB4MTdFNywgMHg3RTIzLCAweDE3RTAsIDB4N0UyNiwgMHgwOTRFLCAweDdFMkIsIDB4MEU1MywgMHg3RTJFLCAweDA5NTYsCisgICAgMHg3RTMxLCAweDE3RTMsIDB4N0UzMiwgMHgxN0VGLCAweDdFMzUsIDB4MTdFQiwgMHg3RTM3LCAweDE3RUUsIDB4N0UzOSwKKyAgICAweDE3RUMsIDB4N0UzQSwgMHgxN0YwLCAweDdFM0IsIDB4MTdFQSwgMHg3RTNELCAweDE3RDAsIDB4N0UzRSwgMHgwQTc3LAorICAgIDB4N0U0MSwgMHgwRDVGLCAweDdFNDMsIDB4MTdFRCwgMHg3RTQ2LCAweDE3RTgsIDB4N0U0NywgMHgzQThFLCAweDdFNDgsCisgICAgMHgzNzY3LCAweDdFNEEsIDB4MEFBMywgMHg3RTRCLCAweDA3MjgsIDB4N0U0RCwgMHgwOTM1LCAweDdFNTIsIDB4MjE5NCwKKyAgICAweDdFNTQsIDB4MDlFQiwgMHg3RTU1LCAweDBBQjgsIDB4N0U1NiwgMHgxN0YzLCAweDdFNTksIDB4MTdGNSwgMHg3RTVBLAorICAgIDB4MTdGNiwgMHg3RTVELCAweDE3RjIsIDB4N0U1RSwgMHgxN0Y0LCAweDdFNjEsIDB4MUUxMSwgMHg3RTYyLCAweDNBOEYsCisgICAgMHg3RTY2LCAweDE3RTksIDB4N0U2NywgMHgxN0YxLCAweDdFNjksIDB4MTdGOSwgMHg3RTZBLCAweDE3RjgsIDB4N0U2QiwKKyAgICAweDFERjcsIDB4N0U2RCwgMHgwRUE4LCAweDdFNkUsIDB4M0E5MCwgMHg3RTcwLCAweDA3MDEsIDB4N0U3MywgMHgzQTkxLAorICAgIDB4N0U3OSwgMHgxN0Y3LCAweDdFN0IsIDB4MTdGQiwgMHg3RTdDLCAweDE3RkEsIDB4N0U3RCwgMHgxN0ZFLCAweDdFN0YsCisgICAgMHgxODAwLCAweDdFODIsIDB4MDg4QSwgMHg3RTgzLCAweDE3RkMsIDB4N0U4OCwgMHgxODAxLCAweDdFODksIDB4MTgwMiwKKyAgICAweDdFOEEsIDB4MjBBNywgMHg3RThDLCAweDE4MDMsIDB4N0U4RCwgMHgzQTkyLCAweDdFOEUsIDB4MTgwOSwgMHg3RThGLAorICAgIDB4MEMzNSwgMHg3RTkwLCAweDE4MDUsIDB4N0U5MSwgMHgzQTkzLCAweDdFOTIsIDB4MTgwNCwgMHg3RTkzLCAweDE4MDYsCisgICAgMHg3RTk0LCAweDE4MDcsIDB4N0U5NiwgMHgxODA4LCAweDdFOTgsIDB4M0E5NCwgMHg3RTlCLCAweDE4MEEsIDB4N0U5QywKKyAgICAweDE4MEIsIDB4N0YzNiwgMHgwNjA4LCAweDdGMzgsIDB4MTgwQywgMHg3RjNBLCAweDE4MEQsIDB4N0Y0NCwgMHgzQTk1LAorICAgIDB4N0Y0NSwgMHgxODBFLCAweDdGNDcsIDB4MjE5NSwgMHg3RjRDLCAweDE4MEYsIDB4N0Y0RCwgMHgxODEwLCAweDdGNEUsCisgICAgMHgxODExLCAweDdGNEYsIDB4M0E5NiwgMHg3RjUwLCAweDE4MTIsIDB4N0Y1MSwgMHgxODEzLCAweDdGNTIsIDB4M0E5NywKKyAgICAweDdGNTMsIDB4M0E5OCwgMHg3RjU0LCAweDE4MTUsIDB4N0Y1NSwgMHgxODE0LCAweDdGNTgsIDB4MTgxNiwgMHg3RjVGLAorICAgIDB4MTgxNywgMHg3RjYwLCAweDE4MTgsIDB4N0Y2MSwgMHgzQTk5LCAweDdGNjcsIDB4MTgxQiwgMHg3RjY4LCAweDE4MTksCisgICAgMHg3RjY5LCAweDE4MUEsIDB4N0Y2QSwgMHgwODUxLCAweDdGNkIsIDB4MDcyOSwgMHg3RjZFLCAweDBCOTQsIDB4N0Y3MCwKKyAgICAweDBENDcsIDB4N0Y3MiwgMHgwOTdBLCAweDdGNzUsIDB4MEQwMywgMHg3Rjc3LCAweDBEODEsIDB4N0Y3OCwgMHgxODFDLAorICAgIDB4N0Y3OSwgMHgxMzM2LCAweDdGODIsIDB4MTgxRCwgMHg3RjgzLCAweDE4MUYsIDB4N0Y4NSwgMHgwRjRGLCAweDdGODYsCisgICAgMHgxODFFLCAweDdGODcsIDB4MTgyMSwgMHg3Rjg4LCAweDE4MjAsIDB4N0Y4QSwgMHgwRjNELCAweDdGOEMsIDB4MTgyMiwKKyAgICAweDdGOEUsIDB4MEQ5MiwgMHg3RjkxLCAweDNBOUEsIDB4N0Y5NCwgMHgxODIzLCAweDdGOUEsIDB4MTgyNiwgMHg3RjlELAorICAgIDB4MTgyNSwgMHg3RjlFLCAweDE4MjQsIDB4N0ZBMSwgMHgyMTk2LCAweDdGQTMsIDB4MTgyNywgMHg3RkE0LCAweDA3MDgsCisgICAgMHg3RkE4LCAweDBBQTQsIDB4N0ZBOSwgMHgwNjVCLCAweDdGQUUsIDB4MTgyQiwgMHg3RkFGLCAweDE4MjgsIDB4N0ZCMiwKKyAgICAweDE4MjksIDB4N0ZCNiwgMHgxODJDLCAweDdGQjgsIDB4MTgyRCwgMHg3RkI5LCAweDE4MkEsIDB4N0ZCRCwgMHgwNENCLAorICAgIDB4N0ZCRiwgMHgzQTlCLCAweDdGQzEsIDB4MDUyNywgMHg3RkM1LCAweDE4MkYsIDB4N0ZDNiwgMHgxODMwLCAweDdGQ0EsCisgICAgMHgxODMxLCAweDdGQ0MsIDB4MEY0QywgMHg3RkNFLCAweDNBOUMsIDB4N0ZEMiwgMHgwOTM2LCAweDdGRDQsIDB4MTgzMywKKyAgICAweDdGRDUsIDB4MTgzMiwgMHg3RkRGLCAweDNBOUQsIDB4N0ZFMCwgMHgwQTJGLCAweDdGRTEsIDB4MTgzNCwgMHg3RkU1LAorICAgIDB4M0E5RSwgMHg3RkU2LCAweDE4MzUsIDB4N0ZFOSwgMHgxODM2LCAweDdGRUIsIDB4MDYyMSwgMHg3RkVDLCAweDNBOUYsCisgICAgMHg3RkVFLCAweDNBQTAsIDB4N0ZFRiwgMHgzQUExLCAweDdGRjAsIDB4MDYwOSwgMHg3RkYzLCAweDE4MzcsIDB4N0ZGOSwKKyAgICAweDE4MzgsIDB4N0ZGQSwgMHgzQUEyLCAweDdGRkIsIDB4MEU4QiwgMHg3RkZDLCAweDBGNEQsIDB4ODAwMCwgMHgwRjNFLAorICAgIDB4ODAwMSwgMHgwRkRELCAweDgwMDIsIDB4MzcxMywgMHg4MDAzLCAweDA3REYsIDB4ODAwNCwgMHgxODNCLCAweDgwMDUsCisgICAgMHgwOTAwLCAweDgwMDYsIDB4MTgzQSwgMHg4MDBCLCAweDE4M0MsIDB4ODAwQywgMHgwOEQ1LCAweDgwMEUsIDB4M0FBMywKKyAgICAweDgwMTAsIDB4MEIzMSwgMHg4MDExLCAweDNBQTQsIDB4ODAxMiwgMHgxODNELCAweDgwMTQsIDB4M0FBNSwgMHg4MDE1LAorICAgIDB4MDdERSwgMHg4MDE3LCAweDBFRTMsIDB4ODAxOCwgMHgxODNFLCAweDgwMTksIDB4MTgzRiwgMHg4MDFDLCAweDE4NDAsCisgICAgMHg4MDIxLCAweDE4NDEsIDB4ODAyNCwgMHgzQUE2LCAweDgwMjYsIDB4M0FBNywgMHg4MDI4LCAweDE4NDIsIDB4ODAzMywKKyAgICAweDA4RDYsIDB4ODAzNiwgMHgwRUY5LCAweDgwM0EsIDB4M0FBOCwgMHg4MDNCLCAweDE4NDQsIDB4ODAzQywgMHgzQUE5LAorICAgIDB4ODAzRCwgMHgwQjdELCAweDgwM0YsIDB4MTg0MywgMHg4MDQ2LCAweDE4NDYsIDB4ODA0QSwgMHgxODQ1LCAweDgwNTIsCisgICAgMHgxODQ3LCAweDgwNTYsIDB4MEE1RiwgMHg4MDU4LCAweDE4NDgsIDB4ODA1QSwgMHgxODQ5LCAweDgwNUUsIDB4MEUwOSwKKyAgICAweDgwNUYsIDB4MTg0QSwgMHg4MDYwLCAweDNBQUEsIDB4ODA2MSwgMHgwQUYxLCAweDgwNjIsIDB4MTg0QiwgMHg4MDY4LAorICAgIDB4MTg0QywgMHg4MDZGLCAweDBGQzYsIDB4ODA3MCwgMHgxODRGLCAweDgwNzEsIDB4M0FBQiwgMHg4MDcyLCAweDE4NEUsCisgICAgMHg4MDczLCAweDE4NEQsIDB4ODA3NCwgMHgwQkNDLCAweDgwNzUsIDB4M0FBQywgMHg4MDc2LCAweDE4NTAsIDB4ODA3NywKKyAgICAweDA5RUMsIDB4ODA3OSwgMHgxODUxLCAweDgwN0QsIDB4MTg1MiwgMHg4MDdFLCAweDBGREUsIDB4ODA3RiwgMHgxODUzLAorICAgIDB4ODA4NCwgMHgxODU0LCAweDgwODUsIDB4MTg1NiwgMHg4MDg2LCAweDE4NTUsIDB4ODA4NywgMHgwRDM5LCAweDgwODksCisgICAgMHgwQ0QxLCAweDgwOEIsIDB4MEZFNCwgMHg4MDhDLCAweDBEM0QsIDB4ODA5MywgMHgxODU4LCAweDgwOTYsIDB4MDlCQiwKKyAgICAweDgwOTgsIDB4MEQ5QywgMHg4MDlBLCAweDE4NTksIDB4ODA5QiwgMHgxODU3LCAweDgwOUQsIDB4MDYwQSwgMHg4MDlFLAorICAgIDB4M0FBRCwgMHg4MEExLCAweDA3ODgsIDB4ODBBMiwgMHgwOEI2LCAweDgwQTUsIDB4MEQ4MiwgMHg4MEE2LCAweDNBQUUsCisgICAgMHg4MEE5LCAweDA3NUUsIDB4ODBBQSwgMHgwRTcxLCAweDgwQUIsIDB4M0FBRiwgMHg4MEFDLCAweDE4NUMsIDB4ODBBRCwKKyAgICAweDE4NUEsIDB4ODBBRiwgMHgwN0UwLCAweDgwQjEsIDB4MDdFMSwgMHg4MEIyLCAweDA0QUQsIDB4ODBCNCwgMHgwODU4LAorICAgIDB4ODBCQSwgMHgwRDBGLCAweDgwQzMsIDB4MDRBMywgMHg4MEM0LCAweDE4NjEsIDB4ODBDNiwgMHgwQjdFLCAweDgwQ0MsCisgICAgMHgwRDBFLCAweDgwQ0UsIDB4MEIzQiwgMHg4MEQ2LCAweDE4NjMsIDB4ODBENywgMHgzQUIwLCAweDgwRDgsIDB4M0FCMSwKKyAgICAweDgwRDksIDB4MTg1RiwgMHg4MERBLCAweDE4NjIsIDB4ODBEQiwgMHgxODVELCAweDgwREQsIDB4MTg2MCwgMHg4MERFLAorICAgIDB4MEU1NCwgMHg4MEUxLCAweDA3ODksIDB4ODBFNCwgMHgwNEMxLCAweDgwRTUsIDB4MTg1RSwgMHg4MEVGLCAweDE4NjUsCisgICAgMHg4MEYxLCAweDE4NjYsIDB4ODBGNCwgMHgwQzkxLCAweDgwRjgsIDB4MDZCMywgMHg4MEZDLCAweDE4NzEsIDB4ODBGRCwKKyAgICAweDBDRjMsIDB4ODEwMiwgMHgwOEI3LCAweDgxMDUsIDB4MDZCNCwgMHg4MTA2LCAweDBBNkMsIDB4ODEwNywgMHgwRkVDLAorICAgIDB4ODEwOCwgMHgwRUJBLCAweDgxMDksIDB4MTg2NCwgMHg4MTBBLCAweDBBNzgsIDB4ODExNiwgMHgzQUIyLCAweDgxMTgsCisgICAgMHgzQUIzLCAweDgxMUEsIDB4MDY2RCwgMHg4MTFCLCAweDE4NjcsIDB4ODEyMywgMHgxODY5LCAweDgxMjksIDB4MTg2OCwKKyAgICAweDgxMkIsIDB4MzY1OSwgMHg4MTJGLCAweDE4NkEsIDB4ODEzMSwgMHgwQjY0LCAweDgxMzMsIDB4MENGNCwgMHg4MTM5LAorICAgIDB4MEJDRCwgMHg4MTNBLCAweDNBQjQsIDB4ODEzRSwgMHgxODZFLCAweDgxNDEsIDB4Mzc3MiwgMHg4MTQ2LCAweDE4NkQsCisgICAgMHg4MTRBLCAweDNBQjUsIDB4ODE0QiwgMHgxODZCLCAweDgxNEMsIDB4M0FCNiwgMHg4MTRFLCAweDBBMUIsIDB4ODE1MCwKKyAgICAweDBERDcsIDB4ODE1MSwgMHgxODcwLCAweDgxNTMsIDB4MTg2RiwgMHg4MTU0LCAweDA3RTIsIDB4ODE1NSwgMHgwRkY5LAorICAgIDB4ODE1RiwgMHgxODgwLCAweDgxNjUsIDB4MTg3NCwgMHg4MTY2LCAweDE4NzUsIDB4ODE2QiwgMHgwOTFDLCAweDgxNkUsCisgICAgMHgxODczLCAweDgxNzAsIDB4MDgwQSwgMHg4MTcxLCAweDE4NzIsIDB4ODE3NCwgMHgxODc2LCAweDgxNzgsIDB4MEJDRSwKKyAgICAweDgxNzksIDB4MERGMiwgMHg4MTdBLCAweDBBQTUsIDB4ODE3RiwgMHgwQjNDLCAweDgxODAsIDB4MTg3QSwgMHg4MTgxLAorICAgIDB4M0FCNywgMHg4MTgyLCAweDE4N0IsIDB4ODE4MywgMHgxODc3LCAweDgxODQsIDB4M0FCOCwgMHg4MTg4LCAweDE4NzgsCisgICAgMHg4MThBLCAweDE4NzksIDB4ODE4RiwgMHgwN0UzLCAweDgxOTMsIDB4MTg4MSwgMHg4MTk1LCAweDE4N0QsIDB4ODE5QSwKKyAgICAweDBERDgsIDB4ODE5QywgMHgwRTlBLCAweDgxOUQsIDB4MEQ5QSwgMHg4MUEwLCAweDE4N0MsIDB4ODFBMywgMHgxODdGLAorICAgIDB4ODFBNCwgMHgxODdFLCAweDgxQTgsIDB4MEU3MiwgMHg4MUE5LCAweDE4ODIsIDB4ODFCMCwgMHgxODgzLCAweDgxQjMsCisgICAgMHgwQUI5LCAweDgxQjQsIDB4M0FCOSwgMHg4MUI1LCAweDE4ODQsIDB4ODFCOCwgMHgxODg2LCAweDgxQkEsIDB4MTg4QSwKKyAgICAweDgxQkQsIDB4MTg4NywgMHg4MUJFLCAweDE4ODUsIDB4ODFCRiwgMHgwQ0Y1LCAweDgxQzAsIDB4MTg4OCwgMHg4MUMyLAorICAgIDB4MTg4OSwgMHg4MUM2LCAweDA1MzIsIDB4ODFDOCwgMHgxODkwLCAweDgxQzksIDB4MTg4QiwgMHg4MUNELCAweDE4OEMsCisgICAgMHg4MUNGLCAweDNBQkEsIDB4ODFEMSwgMHgxODhELCAweDgxRDMsIDB4MEIwMSwgMHg4MUQ4LCAweDE4OEYsIDB4ODFEOSwKKyAgICAweDE4OEUsIDB4ODFEQSwgMHgxODkxLCAweDgxREYsIDB4MTg5MiwgMHg4MUUwLCAweDE4OTMsIDB4ODFFMywgMHgwQTA5LAorICAgIDB4ODFFNSwgMHgwNTY5LCAweDgxRTcsIDB4MTg5NCwgMHg4MUU4LCAweDBGOUYsIDB4ODFFQSwgMHgwOEQ3LCAweDgxRUQsCisgICAgMHgwOTM3LCAweDgxRjMsIDB4MDhCOCwgMHg4MUY0LCAweDBCOTUsIDB4ODFGOSwgMHgzQUJCLCAweDgxRkEsIDB4MTg5NSwKKyAgICAweDgxRkIsIDB4MTg5NiwgMHg4MUZDLCAweDA0RDMsIDB4ODFGRSwgMHgxODk3LCAweDgyMDEsIDB4MTg5OCwgMHg4MjAyLAorICAgIDB4MTg5OSwgMHg4MjAzLCAweDNBQkMsIDB4ODIwNSwgMHgxODlBLCAweDgyMDcsIDB4MTg5QiwgMHg4MjA4LCAweDA2QjUsCisgICAgMHg4MjA5LCAweDEzQUYsIDB4ODIwQSwgMHgxODlDLCAweDgyMEMsIDB4MEE4OSwgMHg4MjBELCAweDE4OUQsIDB4ODIwRSwKKyAgICAweDA4RjcsIDB4ODIxMCwgMHgxODlFLCAweDgyMTIsIDB4MTAwOSwgMHg4MjE2LCAweDE4OUYsIDB4ODIxNywgMHgwRTJFLAorICAgIDB4ODIxOCwgMHgwNjE4LCAweDgyMUIsIDB4MEFBNiwgMHg4MjFDLCAweDA5NjIsIDB4ODIxRSwgMHgwREUzLCAweDgyMUYsCisgICAgMHgwOTM4LCAweDgyMjEsIDB4M0FCRCwgMHg4MjI5LCAweDE4QTAsIDB4ODIyQSwgMHgwN0U0LCAweDgyMkIsIDB4MThBMSwKKyAgICAweDgyMkMsIDB4MEQ2MCwgMHg4MjJFLCAweDE4QUYsIDB4ODIzMiwgMHgzQUJFLCAweDgyMzMsIDB4MThBMywgMHg4MjM0LAorICAgIDB4M0FCRiwgMHg4MjM1LCAweDBCMjksIDB4ODIzNiwgMHgwRDJCLCAweDgyMzcsIDB4MDc3MywgMHg4MjM4LCAweDE4QTIsCisgICAgMHg4MjM5LCAweDBBQTcsIDB4ODI0MCwgMHgxOEE0LCAweDgyNDYsIDB4M0FDMCwgMHg4MjQ3LCAweDBDMTYsIDB4ODI0QiwKKyAgICAweDNBQzEsIDB4ODI0RiwgMHgzQUMyLCAweDgyNTgsIDB4MThBNiwgMHg4MjU5LCAweDE4QTUsIDB4ODI1QSwgMHgxOEE4LAorICAgIDB4ODI1RCwgMHgxOEE3LCAweDgyNUYsIDB4MThBOSwgMHg4MjYyLCAweDE4QUIsIDB4ODI2NCwgMHgxOEFBLCAweDgyNjYsCisgICAgMHgwNjBCLCAweDgyNjgsIDB4MThBQywgMHg4MjZBLCAweDE4QUQsIDB4ODI2QiwgMHgxOEFFLCAweDgyNkUsIDB4MDgyMSwKKyAgICAweDgyNkYsIDB4MEY5MSwgMHg4MjcxLCAweDE4QjAsIDB4ODI3MiwgMHgwOUVELCAweDgyNzYsIDB4MDUxMiwgMHg4Mjc3LAorICAgIDB4MThCMSwgMHg4Mjc4LCAweDE4QjIsIDB4ODI3OSwgMHgzNzc1LCAweDgyN0UsIDB4MThCMywgMHg4MjhCLCAweDA0QjYsCisgICAgMHg4MjhELCAweDE4QjQsIDB4ODI4RSwgMHgzQUMzLCAweDgyOTIsIDB4MThCNSwgMHg4Mjk5LCAweDBERDksIDB4ODI5RCwKKyAgICAweDA4RjMsIDB4ODI5RiwgMHgxOEI3LCAweDgyQTUsIDB4MDU4NywgMHg4MkE2LCAweDA0NzYsIDB4ODJBQiwgMHgxOEI2LAorICAgIDB4ODJBQywgMHgxOEI5LCAweDgyQUQsIDB4MEQwNCwgMHg4MkFFLCAweDNBQzQsIDB4ODJBRiwgMHgwQTBBLCAweDgyQjEsCisgICAgMHgwNTU2LCAweDgyQjMsIDB4MEU1NSwgMHg4MkI3LCAweDNBQzUsIDB4ODJCOCwgMHgwNzMzLCAweDgyQjksIDB4MDZENCwKKyAgICAweDgyQkIsIDB4MThCOCwgMHg4MkJELCAweDA1NkEsIDB4ODJCRSwgMHgzQUM2LCAweDgyQzUsIDB4MDVERiwgMHg4MkM2LAorICAgIDB4M0FDNywgMHg4MkQxLCAweDA1MTMsIDB4ODJEMiwgMHgxOEJELCAweDgyRDMsIDB4MEZCMiwgMHg4MkQ0LCAweDBCM0QsCisgICAgMHg4MkQ3LCAweDBEQjYsIDB4ODJEOSwgMHgxOEM5LCAweDgyREIsIDB4MDU1NywgMHg4MkRDLCAweDE4QzcsIDB4ODJERSwKKyAgICAweDE4QzUsIDB4ODJERiwgMHgxOEJDLCAweDgyRTEsIDB4MThCQSwgMHg4MkUzLCAweDE4QkIsIDB4ODJFNSwgMHgwOTBGLAorICAgIDB4ODJFNiwgMHgwNkU0LCAweDgyRTcsIDB4MEJCNSwgMHg4MkVCLCAweDBDQTksIDB4ODJGMSwgMHgwNEYzLCAweDgyRjMsCisgICAgMHgxOEJGLCAweDgyRjQsIDB4MThCRSwgMHg4MkY5LCAweDE4QzQsIDB4ODJGQSwgMHgxOEMwLCAweDgyRkIsIDB4MThDMywKKyAgICAweDgyRkUsIDB4M0FDOCwgMHg4MzAxLCAweDIxOTgsIDB4ODMwMiwgMHgwRURDLCAweDgzMDMsIDB4MThDMiwgMHg4MzA0LAorICAgIDB4MDU1OCwgMHg4MzA1LCAweDA1REIsIDB4ODMwNiwgMHgxOEM2LCAweDgzMDksIDB4MThDOCwgMHg4MzBFLCAweDA3MkEsCisgICAgMHg4MzE2LCAweDE4Q0MsIDB4ODMxNywgMHgxOEQ1LCAweDgzMTgsIDB4MThENiwgMHg4MzFDLCAweDA0NkYsIDB4ODMyMywKKyAgICAweDE4REQsIDB4ODMyOCwgMHgwNEI1LCAweDgzMkIsIDB4MThENCwgMHg4MzJGLCAweDE4RDMsIDB4ODMzMSwgMHgxOENFLAorICAgIDB4ODMzMiwgMHgxOENELCAweDgzMzQsIDB4MThDQiwgMHg4MzM1LCAweDE4Q0EsIDB4ODMzNiwgMHgwQkExLCAweDgzMzgsCisgICAgMHgwQjVCLCAweDgzMzksIDB4MThEMCwgMHg4MzQwLCAweDE4Q0YsIDB4ODM0MywgMHgzQUM5LCAweDgzNDUsIDB4MThEMiwKKyAgICAweDgzNDksIDB4MEFGMiwgMHg4MzRBLCAweDA3MkIsIDB4ODM0RiwgMHgwNEUzLCAweDgzNTAsIDB4MThEMSwgMHg4MzUxLAorICAgIDB4M0FDQSwgMHg4MzUyLCAweDA3RTUsIDB4ODM1NSwgMHgzQUNCLCAweDgzNTgsIDB4MEFGMywgMHg4MzYyLCAweDIxOTksCisgICAgMHg4MzczLCAweDE4RTMsIDB4ODM3NSwgMHgxOEU0LCAweDgzNzcsIDB4MDU1OSwgMHg4MzdCLCAweDA1MkUsIDB4ODM3QywKKyAgICAweDE4RTEsIDB4ODM3RiwgMHgyMTlBLCAweDgzODUsIDB4MThENywgMHg4Mzg2LCAweDNBQ0MsIDB4ODM4NywgMHgxOERGLAorICAgIDB4ODM4OSwgMHgxOEU2LCAweDgzOEEsIDB4MThFMCwgMHg4MzhELCAweDNBQ0QsIDB4ODM4RSwgMHgxOERFLCAweDgzOTIsCisgICAgMHgzQUNFLCAweDgzOTMsIDB4MThDMSwgMHg4Mzk2LCAweDE4REMsIDB4ODM5OCwgMHgzQUNGLCAweDgzOUEsIDB4MThEOCwKKyAgICAweDgzOUUsIDB4MDYwQywgMHg4MzlGLCAweDE4REEsIDB4ODNBMCwgMHgxOEU1LCAweDgzQTIsIDB4MThEQiwgMHg4M0E4LAorICAgIDB4MThFNywgMHg4M0E5LCAweDNBRDAsIDB4ODNBQSwgMHgxOEQ5LCAweDgzQUIsIDB4MEQzMiwgMHg4M0IxLCAweDBGNTMsCisgICAgMHg4M0I1LCAweDE4RTIsIDB4ODNCRCwgMHgxOEY4LCAweDgzQkYsIDB4M0FEMSwgMHg4M0MwLCAweDNBRDIsIDB4ODNDMSwKKyAgICAweDE4RjAsIDB4ODNDNSwgMHgwQTQxLCAweDgzQzcsIDB4MjE5QiwgMHg4M0NBLCAweDA2NjAsIDB4ODNDQywgMHgwNkQ1LAorICAgIDB4ODNDRSwgMHgxOEVCLCAweDgzRDMsIDB4MDU1QiwgMHg4M0Q2LCAweDA5QkMsIDB4ODNEOCwgMHgxOEVFLCAweDgzREMsCisgICAgMHgwODRBLCAweDgzREYsIDB4MEM0QiwgMHg4M0UwLCAweDE4RjMsIDB4ODNFOSwgMHgwRTNFLCAweDgzRUEsIDB4M0FEMywKKyAgICAweDgzRUIsIDB4MThFQSwgMHg4M0VGLCAweDA1NUEsIDB4ODNGMCwgMHgwNzhBLCAweDgzRjEsIDB4MEQ5QiwgMHg4M0YyLAorICAgIDB4MThGNCwgMHg4M0Y0LCAweDE4RTgsIDB4ODNGNiwgMHgyMTlDLCAweDgzRjcsIDB4MThGMSwgMHg4M0ZCLCAweDE4RkIsCisgICAgMHg4M0ZELCAweDE4RUMsIDB4ODQwMywgMHgxOEVELCAweDg0MDQsIDB4MEM5MiwgMHg4NDA3LCAweDE4RjIsIDB4ODQwQSwKKyAgICAweDFFN0YsIDB4ODQwQiwgMHgxOEVGLCAweDg0MEMsIDB4MEU1NiwgMHg4NDBELCAweDE4RjUsIDB4ODQwRSwgMHgwNEE0LAorICAgIDB4ODQwRiwgMHgzQUQ0LCAweDg0MTEsIDB4M0FENSwgMHg4NDEzLCAweDE4RTksIDB4ODQyMCwgMHgxOEY3LCAweDg0MjIsCisgICAgMHgxOEY2LCAweDg0MjksIDB4MEQyMSwgMHg4NDJBLCAweDE4RkQsIDB4ODQyQywgMHgxOTA4LCAweDg0MzEsIDB4MDVEQywKKyAgICAweDg0MzUsIDB4MTkwQiwgMHg4NDM4LCAweDE4RjksIDB4ODQzQywgMHgxOEZFLCAweDg0M0QsIDB4MEY1OCwgMHg4NDQ2LAorICAgIDB4MTkwNywgMHg4NDQ4LCAweDIxOUQsIDB4ODQ0OSwgMHgwRjNGLCAweDg0NEEsIDB4M0FENiwgMHg4NDRFLCAweDBGNzIsCisgICAgMHg4NDU3LCAweDBCQjYsIDB4ODQ1QiwgMHgwNUM5LCAweDg0NjEsIDB4MERFNCwgMHg4NDYyLCAweDE5MEQsIDB4ODQ2MywKKyAgICAweDBDNzksIDB4ODQ2NiwgMHgwNDc1LCAweDg0NjksIDB4MTkwNiwgMHg4NDZCLCAweDE5MDIsIDB4ODQ2QywgMHgwQUY0LAorICAgIDB4ODQ2RCwgMHgxOEZDLCAweDg0NkUsIDB4MTkwNCwgMHg4NDZGLCAweDE5MDksIDB4ODQ3MSwgMHgwQ0UyLCAweDg0NzUsCisgICAgMHgwNDZFLCAweDg0NzYsIDB4M0FENywgMHg4NDc3LCAweDE5MDEsIDB4ODQ3OSwgMHgxOTBBLCAweDg0N0EsIDB4MERFQSwKKyAgICAweDg0ODIsIDB4MTkwNSwgMHg4NDg0LCAweDE5MDAsIDB4ODQ4QiwgMHgwOUJELCAweDg0OTAsIDB4MDkzOSwgMHg4NDk0LAorICAgIDB4MDhEOCwgMHg4NDk5LCAweDBFRTQsIDB4ODQ5QywgMHgwREI5LCAweDg0OUYsIDB4MTkxMCwgMHg4NEExLCAweDE5MTksCisgICAgMHg4NEE4LCAweDNBRDgsIDB4ODRBRCwgMHgxOTAzLCAweDg0QUYsIDB4M0FEOSwgMHg4NEIyLCAweDA1RDUsIDB4ODRCNCwKKyAgICAweDIxOUUsIDB4ODRCOCwgMHgwOUUwLCAweDg0QjksIDB4MTkwRSwgMHg4NEJCLCAweDE5MTMsIDB4ODRCQywgMHgwQUY1LAorICAgIDB4ODRCRiwgMHgxOTBGLCAweDg0QzAsIDB4M0FEQSwgMHg4NEMxLCAweDE5MTYsIDB4ODRDMiwgMHgzQURCLCAweDg0QzQsCisgICAgMHgwQjlELCAweDg0QzYsIDB4MTkxNywgMHg4NEM5LCAweDBGNDAsIDB4ODRDQSwgMHgxOTBDLCAweDg0Q0IsIDB4MDU5NiwKKyAgICAweDg0Q0QsIDB4MTkxMiwgMHg4NEQwLCAweDE5MTUsIDB4ODREMSwgMHgwRUI4LCAweDg0RDYsIDB4MTkxOCwgMHg4NEQ5LAorICAgIDB4MTkxMSwgMHg4NERBLCAweDE5MTQsIDB4ODREQywgMHgyMEFCLCAweDg0RUMsIDB4MEU1NywgMHg4NEVFLCAweDBGQzcsCisgICAgMHg4NEYwLCAweDNBREMsIDB4ODRGNCwgMHgxOTFDLCAweDg0RkMsIDB4MTkyMywgMHg4NEZELCAweDNBREQsIDB4ODRGRiwKKyAgICAweDE5MUIsIDB4ODUwMCwgMHgwOEVGLCAweDg1MDYsIDB4MThGQSwgMHg4NTBDLCAweDNBREUsIDB4ODUxMSwgMHgwRTFFLAorICAgIDB4ODUxMywgMHgwRUFFLCAweDg1MTQsIDB4MTkyMiwgMHg4NTE1LCAweDE5MjEsIDB4ODUxNywgMHgxOTFELCAweDg1MTgsCisgICAgMHgxOTFFLCAweDg1MUEsIDB4MDREOCwgMHg4NTFGLCAweDE5MjAsIDB4ODUyMSwgMHgxOTFBLCAweDg1MjMsIDB4MUUxQSwKKyAgICAweDg1MjYsIDB4MEJGMSwgMHg4NTJDLCAweDE5MUYsIDB4ODUyRCwgMHgwNEMyLCAweDg1MzQsIDB4M0FERiwgMHg4NTM1LAorICAgIDB4MEIwMiwgMHg4NTNELCAweDBFMTMsIDB4ODUzRSwgMHgxRUI1LCAweDg1NDAsIDB4MTkyNCwgMHg4NTQxLCAweDE5MjgsCisgICAgMHg4NTQzLCAweDBENkQsIDB4ODU0OCwgMHgxOTI3LCAweDg1NDksIDB4MDlCRSwgMHg4NTRBLCAweDA4RjUsIDB4ODU0QiwKKyAgICAweDE5MkEsIDB4ODU0RSwgMHgwNkI2LCAweDg1NTMsIDB4MjE5RiwgMHg4NTU1LCAweDE5MkIsIDB4ODU1NywgMHgwREVCLAorICAgIDB4ODU1OCwgMHgxOTI2LCAweDg1NTksIDB4MjFBMCwgMHg4NTVBLCAweDE4RkYsIDB4ODU1RSwgMHgzQUUwLCAweDg1NjMsCisgICAgMHgxOTI1LCAweDg1NjgsIDB4MEZGNSwgMHg4NTY5LCAweDBDN0EsIDB4ODU2QSwgMHgwREU1LCAweDg1NkIsIDB4MjFBMSwKKyAgICAweDg1NkQsIDB4MTkzMiwgMHg4NTc3LCAweDE5MzgsIDB4ODU3RSwgMHgxOTM5LCAweDg1ODAsIDB4MTkyQywgMHg4NTg0LAorICAgIDB4MEQyQywgMHg4NTg3LCAweDE5MzYsIDB4ODU4OCwgMHgxOTJFLCAweDg1OEEsIDB4MTkzMCwgMHg4NThGLCAweDNBRTEsCisgICAgMHg4NTkwLCAweDE5M0EsIDB4ODU5MSwgMHgxOTJGLCAweDg1OTQsIDB4MTkzMywgMHg4NTk3LCAweDA1MTQsIDB4ODU5OSwKKyAgICAweDBDQkQsIDB4ODU5QiwgMHgxOTM0LCAweDg1OUMsIDB4MTkzNywgMHg4NUE0LCAweDE5MkQsIDB4ODVBNiwgMHgwQUE4LAorICAgIDB4ODVBOCwgMHgxOTMxLCAweDg1QTksIDB4MDg3NSwgMHg4NUFBLCAweDBBMEIsIDB4ODVBQiwgMHgwNzA2LCAweDg1QUMsCisgICAgMHgwRjAwLCAweDg1QUQsIDB4M0FFNCwgMHg4NUFFLCAweDBGMDUsIDB4ODVBRiwgMHgwOTdDLCAweDg1QjAsIDB4MjFBMywKKyAgICAweDg1QjcsIDB4M0FFMiwgMHg4NUI5LCAweDE5M0UsIDB4ODVCQSwgMHgxOTNDLCAweDg1QzEsIDB4MEZGNCwgMHg4NUM5LAorICAgIDB4MTkzQiwgMHg4NUNELCAweDBGNUYsIDB4ODVDRSwgMHgzQUUzLCAweDg1Q0YsIDB4MTkzRCwgMHg4NUQwLCAweDE5M0YsCisgICAgMHg4NUQ1LCAweDE5NDAsIDB4ODVEQywgMHgxOTQzLCAweDg1REQsIDB4MTk0MSwgMHg4NUU0LCAweDBDN0IsIDB4ODVFNSwKKyAgICAweDE5NDIsIDB4ODVFOSwgMHgwRDYxLCAweDg1RUEsIDB4MTkzNSwgMHg4NUY0LCAweDM3ODAsIDB4ODVGNywgMHgwOTdELAorICAgIDB4ODVGOSwgMHgxOTQ0LCAweDg1RkEsIDB4MTk0OSwgMHg4NUZCLCAweDBBRjYsIDB4ODVGRSwgMHgxOTQ4LCAweDg2MDIsCisgICAgMHgxOTI5LCAweDg2MDYsIDB4MTk0QSwgMHg4NjA3LCAweDBBQ0IsIDB4ODYwQSwgMHgxOTQ1LCAweDg2MEIsIDB4MTk0NywKKyAgICAweDg2MTIsIDB4M0FFNSwgMHg4NjEzLCAweDE5NDYsIDB4ODYxNiwgMHgxNEQwLCAweDg2MTcsIDB4MTRDMSwgMHg4NjFBLAorICAgIDB4MTk0QywgMHg4NjIyLCAweDE5NEIsIDB4ODYyOSwgMHgzQUU2LCAweDg2MkQsIDB4MEY2MCwgMHg4NjJGLCAweDE2QjEsCisgICAgMHg4NjMwLCAweDE5NEQsIDB4ODYzRiwgMHgxOTRFLCAweDg2NEQsIDB4MTk0RiwgMHg4NjRFLCAweDA3OEIsIDB4ODY1MCwKKyAgICAweDA2NkUsIDB4ODY1MiwgMHgzQUU3LCAweDg2NTQsIDB4MTk1MSwgMHg4NjU1LCAweDEwOTQsIDB4ODY1QSwgMHgwNjhGLAorICAgIDB4ODY1QiwgMHgzNDE4LCAweDg2NUMsIDB4MEY4MiwgMHg4NjVFLCAweDA2RUIsIDB4ODY1RiwgMHgxOTUyLCAweDg2NjMsCisgICAgMHgzQUU4LCAweDg2NjcsIDB4MTk1MywgMHg4NjZCLCAweDBCQUMsIDB4ODY2QywgMHgzQUU5LCAweDg2NkYsIDB4M0FFQSwKKyAgICAweDg2NzEsIDB4MTk1NCwgMHg4Njc5LCAweDBDRDIsIDB4ODY3QSwgMHgzQUVCLCAweDg2N0IsIDB4MDQ3RSwgMHg4NjdELAorICAgIDB4Mzc4NiwgMHg4NjhBLCAweDA1NjMsIDB4ODY4QiwgMHgxOTU5LCAweDg2OEMsIDB4MTk1QSwgMHg4NjhELCAweDNBRUMsCisgICAgMHg4NjkxLCAweDNBRUQsIDB4ODY5MywgMHgxOTU1LCAweDg2OTUsIDB4MDg4QiwgMHg4Njk4LCAweDNBRUUsIDB4ODZBMywKKyAgICAweDE5NTYsIDB4ODZBNCwgMHgwQ0Y4LCAweDg2QTcsIDB4M0FFRiwgMHg4NkE4LCAweDNBRjAsIDB4ODZBOSwgMHgxOTU3LAorICAgIDB4ODZBQSwgMHgxOTU4LCAweDg2QUIsIDB4MTk2MiwgMHg4NkFGLCAweDE5NUMsIDB4ODZCMCwgMHgxOTVGLCAweDg2QjYsCisgICAgMHgxOTVCLCAweDg2QzQsIDB4MTk1RCwgMHg4NkM2LCAweDE5NUUsIDB4ODZDNywgMHgwOTA0LCAweDg2QzksIDB4MTk2MCwKKyAgICAweDg2Q0IsIDB4MEI3RiwgMHg4NkNELCAweDA3MkMsIDB4ODZDRSwgMHgwNUEwLCAweDg2RDQsIDB4MTk2MywgMHg4NkQ5LAorICAgIDB4MDU5RCwgMHg4NkRCLCAweDE5NjgsIDB4ODZERSwgMHgxOTY0LCAweDg2REYsIDB4MTk2NywgMHg4NkU0LCAweDBENEUsCisgICAgMHg4NkU5LCAweDE5NjUsIDB4ODZFQywgMHgxOTY2LCAweDg2RUQsIDB4MERCQSwgMHg4NkVFLCAweDBENkUsIDB4ODZFRiwKKyAgICAweDE5NjksIDB4ODZGOCwgMHgwQjVELCAweDg2RjksIDB4MTk3MywgMHg4NkZBLCAweDNBRjEsIDB4ODZGQiwgMHgxOTZGLAorICAgIDB4ODZGRCwgMHgzQUYyLCAweDg2RkUsIDB4MDU2QiwgMHg4NzAwLCAweDE5NkQsIDB4ODcwMiwgMHgwRTU4LCAweDg3MDMsCisgICAgMHgxOTZFLCAweDg3MDYsIDB4MTk2QiwgMHg4NzA4LCAweDE5NkMsIDB4ODcwOSwgMHgxOTcxLCAweDg3MEEsIDB4MTk3NCwKKyAgICAweDg3MEIsIDB4M0FGMywgMHg4NzBELCAweDE5NzIsIDB4ODcxMSwgMHgxOTcwLCAweDg3MTIsIDB4MTk2QSwgMHg4NzEzLAorICAgIDB4M0FGNCwgMHg4NzE4LCAweDBCOTYsIDB4ODcxOSwgMHgzQUY1LCAweDg3MUEsIDB4MTk3QiwgMHg4NzFDLCAweDBFQjYsCisgICAgMHg4NzFFLCAweDNBRjYsIDB4ODcyNSwgMHgxOTc5LCAweDg3MjgsIDB4M0FGNywgMHg4NzI5LCAweDE5N0EsIDB4ODczNCwKKyAgICAweDE5NzUsIDB4ODczNywgMHgxOTc3LCAweDg3M0IsIDB4MTk3OCwgMHg4NzNFLCAweDNBRjgsIDB4ODczRiwgMHgxOTc2LAorICAgIDB4ODc0OSwgMHgwQThBLCAweDg3NEIsIDB4MEZERiwgMHg4NzRDLCAweDE5N0YsIDB4ODc0RSwgMHgxOTgwLCAweDg3NTMsCisgICAgMHgxOTg2LCAweDg3NTUsIDB4MDlGMCwgMHg4NzU3LCAweDE5ODIsIDB4ODc1OSwgMHgxOTg1LCAweDg3NUYsIDB4MTk3RCwKKyAgICAweDg3NjAsIDB4MTk3QywgMHg4NzYzLCAweDE5ODcsIDB4ODc2NiwgMHgwNTVDLCAweDg3NjgsIDB4MTk4MywgMHg4NzZBLAorICAgIDB4MTk4OCwgMHg4NzZFLCAweDE5ODQsIDB4ODc3MSwgMHgzQUY5LCAweDg3NzQsIDB4MTk4MSwgMHg4Nzc2LCAweDBCQ0YsCisgICAgMHg4Nzc4LCAweDE5N0UsIDB4ODc3RiwgMHgwRDFFLCAweDg3ODIsIDB4MTk4QywgMHg4Nzg4LCAweDNBRkEsIDB4ODc4RCwKKyAgICAweDBGMjUsIDB4ODc5OSwgMHgzQUZCLCAweDg3OUYsIDB4MTk4QiwgMHg4N0EyLCAweDE5OEEsIDB4ODdBQiwgMHgxOTkzLAorICAgIDB4ODdBQywgMHgzQUZDLCAweDg3QUQsIDB4M0FGRCwgMHg4N0FGLCAweDE5OEQsIDB4ODdCMywgMHgxOTk1LCAweDg3QjUsCisgICAgMHgzQUZFLCAweDg3QkEsIDB4MEY1MCwgMHg4N0JCLCAweDE5OTgsIDB4ODdCRCwgMHgxOThGLCAweDg3QzAsIDB4MTk5MCwKKyAgICAweDg3QzQsIDB4MTk5NCwgMHg4N0M2LCAweDE5OTcsIDB4ODdDNywgMHgxOTk2LCAweDg3Q0IsIDB4MTk4RSwgMHg4N0QwLAorICAgIDB4MTk5MSwgMHg4N0QyLCAweDE5QTIsIDB4ODdENiwgMHgzQUZGLCAweDg3RTAsIDB4MTk5QiwgMHg4N0VCLCAweDNCMDAsCisgICAgMHg4N0VDLCAweDFFMjMsIDB4ODdFRCwgMHgzQjAxLCAweDg3RUYsIDB4MTk5OSwgMHg4N0YyLCAweDE5OUEsIDB4ODdGNSwKKyAgICAweDNDM0QsIDB4ODdGNiwgMHgxOTlGLCAweDg3RjcsIDB4MTlBMCwgMHg4N0Y5LCAweDA1ODgsIDB4ODdGQiwgMHgwNjVDLAorICAgIDB4ODdGRSwgMHgxOTlFLCAweDg4MDEsIDB4M0IwMiwgMHg4ODAzLCAweDNCMDMsIDB4ODgwNSwgMHgxOTg5LCAweDg4MDYsCisgICAgMHgzQjA0LCAweDg4MDcsIDB4MjFBNiwgMHg4ODBCLCAweDNCMDUsIDB4ODgwRCwgMHgxOTlELCAweDg4MEUsIDB4MTlBMSwKKyAgICAweDg4MEYsIDB4MTk5QywgMHg4ODExLCAweDE5QTMsIDB4ODgxNCwgMHgzQjA2LCAweDg4MTUsIDB4MTlBNSwgMHg4ODE2LAorICAgIDB4MTlBNCwgMHg4ODFDLCAweDNCMDcsIDB4ODgxRiwgMHgxRTg1LCAweDg4MjEsIDB4MTlBNywgMHg4ODIyLCAweDE5QTYsCisgICAgMHg4ODIzLCAweDE5NjEsIDB4ODgyNywgMHgxOUFCLCAweDg4MzEsIDB4MTlBOCwgMHg4ODM2LCAweDE5QTksIDB4ODgzOSwKKyAgICAweDE5QUEsIDB4ODgzQiwgMHgxOUFDLCAweDg4NDAsIDB4MDc0MiwgMHg4ODQyLCAweDE5QUUsIDB4ODg0NCwgMHgxOUFELAorICAgIDB4ODg0NiwgMHgwOTNBLCAweDg4NEMsIDB4MDdFNiwgMHg4ODRELCAweDE1MjQsIDB4ODg1MiwgMHgxOUFGLCAweDg4NTMsCisgICAgMHgwOTVCLCAweDg4NTYsIDB4M0IwOCwgMHg4ODU3LCAweDA1OTcsIDB4ODg1OSwgMHgxOUIwLCAweDg4NUIsIDB4MDRGNCwKKyAgICAweDg4NUQsIDB4MDlCRiwgMHg4ODVFLCAweDE5QjEsIDB4ODg1RiwgMHgzQjA5LCAweDg4NjEsIDB4MDdFNywgMHg4ODYyLAorICAgIDB4MTlCMiwgMHg4ODYzLCAweDA0QTUsIDB4ODg2NCwgMHgzQjBBLCAweDg4NjgsIDB4MERBRiwgMHg4ODZCLCAweDE5QjMsCisgICAgMHg4ODcwLCAweDBBMzAsIDB4ODg3MiwgMHgxOUJBLCAweDg4NzUsIDB4MTlCNywgMHg4ODc3LCAweDBCQUQsIDB4ODg3RCwKKyAgICAweDE5QjgsIDB4ODg3RSwgMHgxOUI1LCAweDg4N0YsIDB4MDZENiwgMHg4ODgxLCAweDE5QjQsIDB4ODg4MiwgMHgxOUJCLAorICAgIDB4ODg4OCwgMHgwNzBDLCAweDg4OEIsIDB4MEIzRSwgMHg4ODhELCAweDE5QzEsIDB4ODg5MiwgMHgxOUJELCAweDg4OTYsCisgICAgMHgwQjE1LCAweDg4OTcsIDB4MTlCQywgMHg4ODk4LCAweDNCMEIsIDB4ODg5OSwgMHgxOUJGLCAweDg4OUUsIDB4MTlCNiwKKyAgICAweDg4QTIsIDB4MTlDMCwgMHg4OEE0LCAweDE5QzIsIDB4ODhBQSwgMHgzQjBDLCAweDg4QUIsIDB4MEQ4MywgMHg4OEFFLAorICAgIDB4MTlCRSwgMHg4OEIwLCAweDE5QzMsIDB4ODhCMSwgMHgxOUM1LCAweDg4QjQsIDB4MDc4NywgMHg4OEI1LCAweDE5QjksCisgICAgMHg4OEI3LCAweDA0ODUsIDB4ODhCRCwgMHgzQjBELCAweDg4QkUsIDB4M0IwRSwgMHg4OEJGLCAweDE5QzQsIDB4ODhDMSwKKyAgICAweDA4NEIsIDB4ODhDMiwgMHgwRkJFLCAweDg4QzMsIDB4MTlDNiwgMHg4OEM0LCAweDE5QzcsIDB4ODhDNSwgMHgwQUY3LAorICAgIDB4ODhDNiwgMHgzNzg5LCAweDg4Q0EsIDB4M0IwRiwgMHg4OENGLCAweDBGNkEsIDB4ODhEMiwgMHgzQjEwLCAweDg4RDQsCisgICAgMHgxOUM4LCAweDg4RDUsIDB4MEYxRiwgMHg4OEQ4LCAweDE5QzksIDB4ODhEOSwgMHgxOUNBLCAweDg4REIsIDB4M0IxMSwKKyAgICAweDg4REMsIDB4MEUzNCwgMHg4OERELCAweDE5Q0IsIDB4ODhERiwgMHgwODMwLCAweDg4RTEsIDB4MEY2QiwgMHg4OEU4LAorICAgIDB4MTlEMCwgMHg4OEYwLCAweDNCMTIsIDB4ODhGMSwgMHgzQjEzLCAweDg4RjIsIDB4MTlEMSwgMHg4OEYzLCAweDA5QzAsCisgICAgMHg4OEY0LCAweDE5Q0YsIDB4ODhGNSwgMHgyMUE3LCAweDg4RjgsIDB4MEY1MSwgMHg4OEY5LCAweDE5Q0MsIDB4ODhGQywKKyAgICAweDE5Q0UsIDB4ODhGRCwgMHgwQTYxLCAweDg4RkUsIDB4MEE0NCwgMHg4OTAyLCAweDE5Q0QsIDB4ODkwNCwgMHgxOUQyLAorICAgIDB4ODkwNiwgMHgzQjE0LCAweDg5MDcsIDB4MERGMywgMHg4OTBBLCAweDE5RDQsIDB4ODkwQywgMHgxOUQzLCAweDg5MTAsCisgICAgMHgwNUNBLCAweDg5MTIsIDB4MEU1OSwgMHg4OTEzLCAweDE5RDUsIDB4ODkxOCwgMHgzQjE1LCAweDg5MTksIDB4M0IxNiwKKyAgICAweDg5MUEsIDB4M0IxNywgMHg4OTFDLCAweDIwQTgsIDB4ODkxRCwgMHgxOUUxLCAweDg5MUUsIDB4MTlENywgMHg4OTI1LAorICAgIDB4MTlEOCwgMHg4OTI3LCAweDNCMTgsIDB4ODkyQSwgMHgxOUQ5LCAweDg5MkIsIDB4MTlEQSwgMHg4OTMwLCAweDNCMTksCisgICAgMHg4OTM2LCAweDE5REUsIDB4ODkzOCwgMHgxOURGLCAweDg5M0IsIDB4MTlERCwgMHg4OTNFLCAweDNCMUEsIDB4ODk0MSwKKyAgICAweDE5REIsIDB4ODk0MywgMHgxOUQ2LCAweDg5NDQsIDB4MTlEQywgMHg4OTRDLCAweDE5RTAsIDB4ODk0RCwgMHgxQkQwLAorICAgIDB4ODk1NiwgMHgwNTI4LCAweDg5NUUsIDB4MTlFMywgMHg4OTVGLCAweDA2RDcsIDB4ODk2MCwgMHgxOUUyLCAweDg5NjQsCisgICAgMHgxOUU1LCAweDg5NjYsIDB4MTlFNCwgMHg4OTZBLCAweDE5RTcsIDB4ODk2RCwgMHgxOUU2LCAweDg5NkYsIDB4MTlFOCwKKyAgICAweDg5NzIsIDB4MDkzQiwgMHg4OTc0LCAweDE5RTksIDB4ODk3NywgMHgxOUVBLCAweDg5N0IsIDB4M0IxQiwgMHg4OTdFLAorICAgIDB4MTlFQiwgMHg4OTdGLCAweDBBNjIsIDB4ODk4MCwgMHgzNjJFLCAweDg5ODEsIDB4MEY0MSwgMHg4OTgzLCAweDE5RUMsCisgICAgMHg4OTg2LCAweDBERjQsIDB4ODk4NywgMHgwQ0ZDLCAweDg5ODgsIDB4MTlFRCwgMHg4OThBLCAweDE5RUUsIDB4ODk4QiwKKyAgICAweDA3NUYsIDB4ODk4RiwgMHgwNjQ2LCAweDg5OTMsIDB4MTlFRiwgMHg4OTk2LCAweDA4QjksIDB4ODk5NywgMHgwQ0Y3LAorICAgIDB4ODk5OCwgMHgxOUYwLCAweDg5OUEsIDB4MDVBRSwgMHg4OUExLCAweDE5RjEsIDB4ODlBNiwgMHgxOUYzLCAweDg5QTcsCisgICAgMHgwRjYxLCAweDg5QTksIDB4MTlGMiwgMHg4OUFBLCAweDBBMEMsIDB4ODlBQywgMHgxOUY0LCAweDg5QUYsIDB4MTlGNSwKKyAgICAweDg5QjIsIDB4MTlGNiwgMHg4OUIzLCAweDA2MEQsIDB4ODlCQSwgMHgxOUY3LCAweDg5QkQsIDB4MTlGOCwgMHg4OUJGLAorICAgIDB4MTlGOSwgMHg4OUMwLCAweDE5RkEsIDB4ODlEMiwgMHgwNUFGLCAweDg5RDQsIDB4M0IxQywgMHg4OUQ2LCAweDNCMUQsCisgICAgMHg4OURBLCAweDE5RkIsIDB4ODlEQywgMHgxOUZDLCAweDg5REQsIDB4MTlGRCwgMHg4OUUzLCAweDA1NzIsIDB4ODlFNSwKKyAgICAweDNCMUUsIDB4ODlFNiwgMHgwOUVFLCAweDg5RTcsIDB4MTlGRSwgMHg4OUYxLCAweDNCMUYsIDB4ODlGNCwgMHgxOUZGLAorICAgIDB4ODlGOCwgMHgxQTAwLCAweDhBMDAsIDB4MDc3NCwgMHg4QTAxLCAweDM1QkMsIDB4OEEwMiwgMHgwQzE3LCAweDhBMDMsCisgICAgMHgxQTAxLCAweDhBMDcsIDB4M0IyMCwgMHg4QTA4LCAweDA3MkQsIDB4OEEwQSwgMHgwQTFDLCAweDhBMEMsIDB4MUEwNCwKKyAgICAweDhBMEUsIDB4MEM3QywgMHg4QTBGLCAweDNCMjEsIDB4OEExMCwgMHgxQTAzLCAweDhBMTIsIDB4MjFBOCwgMHg4QTEzLAorICAgIDB4MDcwNywgMHg4QTE1LCAweDNCMjIsIDB4OEExNiwgMHgxQTAyLCAweDhBMTcsIDB4MEI1NywgMHg4QTE4LCAweDA2NDcsCisgICAgMHg4QTFCLCAweDFBMDUsIDB4OEExRCwgMHgxQTA2LCAweDhBMUYsIDB4MDlDMSwgMHg4QTIyLCAweDNCMjMsIDB4OEEyMywKKyAgICAweDA3NDMsIDB4OEEyNSwgMHgxQTA3LCAweDhBMkEsIDB4MEU1QSwgMHg4QTJELCAweDBBODMsIDB4OEEzMSwgMHgwNjkwLAorICAgIDB4OEEzMywgMHgwRjAxLCAweDhBMzQsIDB4MEFDQywgMHg4QTM2LCAweDFBMDgsIDB4OEEzNywgMHgyMUE5LCAweDhBM0EsCisgICAgMHgwQTBELCAweDhBM0IsIDB4MEJBRSwgMHg4QTNDLCAweDA5QzIsIDB4OEE0MSwgMHgxQTA5LCAweDhBNDYsIDB4MUEwQywKKyAgICAweDhBNDgsIDB4MUEwRCwgMHg4QTRFLCAweDNCMjQsIDB4OEE1MCwgMHgwODJFLCAweDhBNTEsIDB4MEIyMiwgMHg4QTUyLAorICAgIDB4MUEwQiwgMHg4QTU0LCAweDA5QzMsIDB4OEE1NSwgMHgwREIwLCAweDhBNUIsIDB4MUEwQSwgMHg4QTVFLCAweDA4QkEsCisgICAgMHg4QTYwLCAweDA0RjUsIDB4OEE2MiwgMHgxQTExLCAweDhBNjMsIDB4MDcyRSwgMHg4QTY2LCAweDA4QkMsIDB4OEE2OSwKKyAgICAweDA4QkIsIDB4OEE2QiwgMHgwRkYzLCAweDhBNkMsIDB4MUExMCwgMHg4QTZELCAweDFBMEYsIDB4OEE2RSwgMHgwQUE5LAorICAgIDB4OEE3MCwgMHgwNjY3LCAweDhBNzEsIDB4MEZFOSwgMHg4QTcyLCAweDA1OTgsIDB4OEE3MywgMHgwOUM0LCAweDhBNzksCisgICAgMHgyMUFBLCAweDhBN0MsIDB4MUEwRSwgMHg4QTdGLCAweDNCMjUsIDB4OEE4MiwgMHgxQTEzLCAweDhBODQsIDB4MUExNCwKKyAgICAweDhBODUsIDB4MUExMiwgMHg4QTg3LCAweDA3OEMsIDB4OEE4OSwgMHgwRjJBLCAweDhBOEMsIDB4MDhCRCwgMHg4QThELAorICAgIDB4MENERCwgMHg4QTkxLCAweDFBMTcsIDB4OEE5MywgMHgwQTY0LCAweDhBOTUsIDB4MEI4MCwgMHg4QTk4LCAweDBGMjAsCisgICAgMHg4QTlBLCAweDFBMUEsIDB4OEE5RSwgMHgwN0EwLCAweDhBQTAsIDB4MEE2MywgMHg4QUExLCAweDFBMTYsIDB4OEFBMywKKyAgICAweDFBMUIsIDB4OEFBNCwgMHgwN0ExLCAweDhBQTUsIDB4MUExOCwgMHg4QUE2LCAweDFBMTksIDB4OEFBNywgMHgyMUFCLAorICAgIDB4OEFBOCwgMHgxQTE1LCAweDhBQUEsIDB4MzYzOCwgMHg4QUFDLCAweDBBODYsIDB4OEFBRCwgMHgwQ0ExLCAweDhBQjAsCisgICAgMHgwQjZELCAweDhBQjIsIDB4MDU1RCwgMHg4QUI5LCAweDBEODQsIDB4OEFCQywgMHgwNjVELCAweDhBQkUsIDB4MjFBQywKKyAgICAweDhBQkYsIDB4MEJEMCwgMHg4QUMyLCAweDFBMUUsIDB4OEFDNCwgMHgxQTFDLCAweDhBQzcsIDB4MEI4QSwgMHg4QUNCLAorICAgIDB4MEE2NSwgMHg4QUNDLCAweDA2MEUsIDB4OEFDRCwgMHgxQTFELCAweDhBQ0YsIDB4MEEyMSwgMHg4QUQyLCAweDBGOTIsCisgICAgMHg4QUQ2LCAweDBGRTYsIDB4OEFEQSwgMHgxQTFGLCAweDhBREIsIDB4MUEyQSwgMHg4QURDLCAweDBCRDEsIDB4OEFERSwKKyAgICAweDFBMjksIDB4OEFERiwgMHgyMUFELCAweDhBRTAsIDB4MUEyNiwgMHg4QUUxLCAweDFBMkUsIDB4OEFFMiwgMHgxQTI3LAorICAgIDB4OEFFNCwgMHgxQTIzLCAweDhBRTYsIDB4MEMxOCwgMHg4QUU3LCAweDFBMjIsIDB4OEFFQiwgMHgxQTIwLCAweDhBRUQsCisgICAgMHgwRjBCLCAweDhBRUUsIDB4MDhCRSwgMHg4QUYxLCAweDFBMjQsIDB4OEFGMywgMHgxQTIxLCAweDhBRjQsIDB4M0IyNiwKKyAgICAweDhBRjYsIDB4MjFBRiwgMHg4QUY3LCAweDFBMjgsIDB4OEFGOCwgMHgwOTdFLCAweDhBRkEsIDB4MDc3NSwgMHg4QUZFLAorICAgIDB4MEI1QSwgMHg4QjAwLCAweDBFNzMsIDB4OEIwMSwgMHgwNEZDLCAweDhCMDIsIDB4MDRBNiwgMHg4QjA0LCAweDBDN0QsCisgICAgMHg4QjA3LCAweDFBMkMsIDB4OEIwQywgMHgxQTJCLCAweDhCMEUsIDB4MENCRSwgMHg4QjEwLCAweDFBMzAsIDB4OEIxNCwKKyAgICAweDFBMjUsIDB4OEIxNiwgMHgxQTJGLCAweDhCMTcsIDB4MUEzMSwgMHg4QjE5LCAweDA3NjAsIDB4OEIxQSwgMHgxQTJELAorICAgIDB4OEIxQiwgMHgwN0U4LCAweDhCMUQsIDB4MDkwMSwgMHg4QjFGLCAweDNCMjcsIDB4OEIyMCwgMHgxQTMyLCAweDhCMjEsCisgICAgMHgwRjQyLCAweDhCMjYsIDB4MUEzNSwgMHg4QjI4LCAweDFBMzgsIDB4OEIyQiwgMHgxQTM2LCAweDhCMkMsIDB4MERBNywKKyAgICAweDhCMzMsIDB4MUEzMywgMHg4QjM3LCAweDNCMjgsIDB4OEIzOSwgMHgwNkQ4LCAweDhCM0UsIDB4MUEzNywgMHg4QjQxLAorICAgIDB4MUEzOSwgMHg4QjQzLCAweDNCMjksIDB4OEI0NCwgMHgzQjJBLCAweDhCNDksIDB4MUEzRCwgMHg4QjRDLCAweDFBM0EsCisgICAgMHg4QjRFLCAweDFBM0MsIDB4OEI0RiwgMHgxQTNCLCAweDhCNTMsIDB4MjFCMCwgMHg4QjU0LCAweDNCMkIsIDB4OEI1NiwKKyAgICAweDFBM0UsIDB4OEI1OCwgMHgwOERELCAweDhCNUEsIDB4MUE0MCwgMHg4QjVCLCAweDFBM0YsIDB4OEI1QywgMHgwRERBLAorICAgIDB4OEI1RiwgMHgxQTQyLCAweDhCNjYsIDB4MDcyRiwgMHg4QjZCLCAweDFBNDEsIDB4OEI2QywgMHgxQTQzLCAweDhCNkYsCisgICAgMHgxQTQ0LCAweDhCNzAsIDB4MDY1RSwgMHg4QjcxLCAweDE4MkUsIDB4OEI3MiwgMHgwOUUxLCAweDhCNzQsIDB4MUE0NSwKKyAgICAweDhCNzcsIDB4MDdBMiwgMHg4QjdELCAweDFBNDYsIDB4OEI3RiwgMHgyMUIxLCAweDhCODAsIDB4MUE0NywgMHg4QjgzLAorICAgIDB4MDg4QywgMHg4QjhBLCAweDEzRDMsIDB4OEI4QywgMHgxQTQ4LCAweDhCOEUsIDB4MUE0OSwgMHg4QjkwLCAweDA5M0MsCisgICAgMHg4QjkyLCAweDFBNEEsIDB4OEI5MywgMHgxQTRCLCAweDhCOTYsIDB4MUE0QywgMHg4Qjk5LCAweDFBNEQsIDB4OEI5QSwKKyAgICAweDFBNEUsIDB4OEI5QywgMHgzQjJDLCAweDhCOUUsIDB4M0IyRCwgMHg4QzM3LCAweDBCNjksIDB4OEMzQSwgMHgxQTRGLAorICAgIDB4OEMzRiwgMHgxQTUxLCAweDhDNDEsIDB4MUE1MCwgMHg4QzQ2LCAweDBDN0UsIDB4OEM0NywgMHgzQjJFLCAweDhDNDgsCisgICAgMHgxQTUyLCAweDhDNEEsIDB4MEU1QiwgMHg4QzRDLCAweDFBNTMsIDB4OEM0RSwgMHgxQTU0LCAweDhDNTAsIDB4MUE1NSwKKyAgICAweDhDNTQsIDB4M0IyRiwgMHg4QzU1LCAweDFBNTYsIDB4OEM1QSwgMHgwQ0IyLCAweDhDNjEsIDB4MDlDNSwgMHg4QzYyLAorICAgIDB4MUE1NywgMHg4QzZBLCAweDA3RkQsIDB4OEM2QiwgMHgxMDA3LCAweDhDNkMsIDB4MUE1OCwgMHg4QzczLCAweDNCMzAsCisgICAgMHg4Qzc4LCAweDFBNTksIDB4OEM3OSwgMHgwREIxLCAweDhDN0EsIDB4MUE1QSwgMHg4QzdDLCAweDFBNjIsIDB4OEM4MiwKKyAgICAweDFBNUIsIDB4OEM4NSwgMHgxQTVELCAweDhDODksIDB4MUE1QywgMHg4QzhBLCAweDFBNUUsIDB4OEM4QywgMHgwRTc0LAorICAgIDB4OEM4RCwgMHgxQTVGLCAweDhDOEUsIDB4MUE2MCwgMHg4Qzk0LCAweDFBNjEsIDB4OEM5OCwgMHgxQTYzLCAweDhDOUQsCisgICAgMHgwNThCLCAweDhDOUUsIDB4MEMwMywgMHg4Q0EwLCAweDBEREIsIDB4OENBMSwgMHgwODUyLCAweDhDQTIsIDB4MDdFOSwKKyAgICAweDhDQTQsIDB4M0IzMSwgMHg4Q0E3LCAweDBEQzEsIDB4OENBOCwgMHgwNTVGLCAweDhDQTksIDB4MEQ2MiwgMHg4Q0FBLAorICAgIDB4MUE2NiwgMHg4Q0FCLCAweDA2MEYsIDB4OENBQywgMHgwQTc5LCAweDhDQUQsIDB4MUE2NSwgMHg4Q0FFLCAweDFBNkEsCisgICAgMHg4Q0FGLCAweDBCQjcsIDB4OENCMCwgMHgwRUVGLCAweDhDQjIsIDB4MUE2OCwgMHg4Q0IzLCAweDFBNjksIDB4OENCNCwKKyAgICAweDA2NDgsIDB4OENCNiwgMHgxQTZCLCAweDhDQjcsIDB4MEQxOSwgMHg4Q0I4LCAweDBCM0YsIDB4OENCQiwgMHgwRDg1LAorICAgIDB4OENCQywgMHgwQzM3LCAweDhDQkQsIDB4MUE2NywgMHg4Q0JGLCAweDBFNzUsIDB4OENDMCwgMHgwNTZDLCAweDhDQzEsCisgICAgMHgxQTZELCAweDhDQzIsIDB4MEZDRSwgMHg4Q0MzLCAweDBCREUsIDB4OENDNCwgMHgwRkVCLCAweDhDQzcsIDB4MDhCRiwKKyAgICAweDhDQzgsIDB4MUE2QywgMHg4Q0NBLCAweDBCMTEsIDB4OENDRCwgMHgxQTdELCAweDhDQ0UsIDB4MEFBQSwgMHg4Q0QxLAorICAgIDB4MENEMCwgMHg4Q0QzLCAweDBEQzIsIDB4OENEOSwgMHgzQjMyLCAweDhDREEsIDB4MUE3MCwgMHg4Q0RCLCAweDA4OEQsCisgICAgMHg4Q0RDLCAweDA4QzAsIDB4OENERSwgMHgwOUM2LCAweDhDRTAsIDB4MEQxQiwgMHg4Q0UxLCAweDNCMzMsIDB4OENFMiwKKyAgICAweDA3NjEsIDB4OENFMywgMHgxQTZGLCAweDhDRTQsIDB4MUE2RSwgMHg4Q0U2LCAweDBEREMsIDB4OENFQSwgMHgwOEVELAorICAgIDB4OENFRCwgMHgwQzRDLCAweDhDRjAsIDB4MjFCMiwgMHg4Q0Y0LCAweDIxQjMsIDB4OENGOCwgMHgzQjM0LCAweDhDRkEsCisgICAgMHgxQTcyLCAweDhDRkIsIDB4MUE3MywgMHg4Q0ZDLCAweDA3RUEsIDB4OENGRCwgMHgxQTcxLCAweDhDRkUsIDB4M0IzNSwKKyAgICAweDhEMDQsIDB4MUE3NCwgMHg4RDA1LCAweDFBNzUsIDB4OEQwNywgMHgxQTc3LCAweDhEMDgsIDB4MEIwMywgMHg4RDBBLAorICAgIDB4MUE3NiwgMHg4RDBCLCAweDA2MjIsIDB4OEQwRCwgMHgxQTc5LCAweDhEMEYsIDB4MUE3OCwgMHg4RDEwLCAweDFBN0EsCisgICAgMHg4RDEyLCAweDIxQjQsIDB4OEQxMywgMHgxQTdDLCAweDhEMTQsIDB4MUE3RSwgMHg4RDE2LCAweDFBN0YsIDB4OEQxQiwKKyAgICAweDNCMzYsIDB4OEQ2NCwgMHgwQTdBLCAweDhENjYsIDB4MDhGQiwgMHg4RDY3LCAweDFBODAsIDB4OEQ2OSwgMHgzQjM3LAorICAgIDB4OEQ2QiwgMHgwNUIwLCAweDhENkMsIDB4M0IzOCwgMHg4RDZELCAweDFBODEsIDB4OEQ3MCwgMHgwQUY4LCAweDhENzEsCisgICAgMHgxQTgyLCAweDhENzMsIDB4MUE4MywgMHg4RDc0LCAweDBEREQsIDB4OEQ3NiwgMHgyMUI1LCAweDhENzcsIDB4MDY0OSwKKyAgICAweDhEODEsIDB4MUE4NCwgMHg4RDg0LCAweDNCMzksIDB4OEQ4NSwgMHgwQkQyLCAweDhEOEEsIDB4MDRGRCwgMHg4RDhELAorICAgIDB4M0IzQSwgMHg4RDk1LCAweDNCM0IsIDB4OEQ5OSwgMHgxQTg1LCAweDhEQTMsIDB4MDkxRCwgMHg4REE2LCAweDNCM0MsCisgICAgMHg4REE4LCAweDBBM0MsIDB4OERCMywgMHgwQjBELCAweDhEQkEsIDB4MUE4OCwgMHg4REJFLCAweDFBODcsIDB4OERDMiwKKyAgICAweDFBODYsIDB4OERDNiwgMHgzQjNELCAweDhEQ0IsIDB4MUE4RSwgMHg4RENDLCAweDFBOEMsIDB4OERDRSwgMHgzQjNFLAorICAgIDB4OERDRiwgMHgxQTg5LCAweDhERDYsIDB4MUE4QiwgMHg4RERBLCAweDFBOEEsIDB4OEREQiwgMHgxQThELCAweDhEREQsCisgICAgMHgwNjkxLCAweDhEREYsIDB4MUE5MSwgMHg4REUxLCAweDBBN0IsIDB4OERFMywgMHgxQTkyLCAweDhERTQsIDB4M0IzRiwKKyAgICAweDhERTgsIDB4MDc4RCwgMHg4REVBLCAweDFBOEYsIDB4OERFQiwgMHgxQTkwLCAweDhERUMsIDB4M0I0MCwgMHg4REVGLAorICAgIDB4MEZDRiwgMHg4REYzLCAweDBCRDMsIDB4OERGNSwgMHgwQUFCLCAweDhERkMsIDB4MUE5MywgMHg4REZGLCAweDFBOTYsCisgICAgMHg4RTA4LCAweDFBOTQsIDB4OEUwOSwgMHgxQTk1LCAweDhFMEEsIDB4MEY0MywgMHg4RTBGLCAweDBDN0YsIDB4OEUxMCwKKyAgICAweDFBOTksIDB4OEUxRCwgMHgxQTk3LCAweDhFMUUsIDB4MUE5OCwgMHg4RTFGLCAweDFBOUEsIDB4OEUyMCwgMHgzQjQxLAorICAgIDB4OEUyQSwgMHgxQUE4LCAweDhFMzAsIDB4MUE5RCwgMHg4RTM0LCAweDFBOUUsIDB4OEUzNSwgMHgxQTlDLCAweDhFNDIsCisgICAgMHgxQTlCLCAweDhFNDQsIDB4MEMxOSwgMHg4RTQ3LCAweDFBQTAsIDB4OEU0OCwgMHgxQUE0LCAweDhFNDksIDB4MUFBMSwKKyAgICAweDhFNEEsIDB4MUE5RiwgMHg4RTRCLCAweDNCNDIsIDB4OEU0QywgMHgxQUEyLCAweDhFNTAsIDB4MUFBMywgMHg4RTU1LAorICAgIDB4MUFBQSwgMHg4RTU5LCAweDFBQTUsIDB4OEU1RiwgMHgwQTdDLCAweDhFNjAsIDB4MUFBNywgMHg4RTYzLCAweDFBQTksCisgICAgMHg4RTY0LCAweDFBQTYsIDB4OEU2QywgMHgzQjQzLCAweDhFNzAsIDB4M0I0NCwgMHg4RTcyLCAweDFBQUMsIDB4OEU3NCwKKyAgICAweDA5M0QsIDB4OEU3NiwgMHgxQUFCLCAweDhFN0EsIDB4M0I0NSwgMHg4RTdDLCAweDFBQUQsIDB4OEU4MSwgMHgxQUFFLAorICAgIDB4OEU4NCwgMHgxQUIxLCAweDhFODUsIDB4MUFCMCwgMHg4RTg3LCAweDFBQUYsIDB4OEU4QSwgMHgxQUIzLCAweDhFOEIsCisgICAgMHgxQUIyLCAweDhFOEQsIDB4MEYwMiwgMHg4RTkxLCAweDFBQjUsIDB4OEU5MiwgMHgzQjQ2LCAweDhFOTMsIDB4MUFCNCwKKyAgICAweDhFOTQsIDB4MUFCNiwgMHg4RTk5LCAweDFBQjcsIDB4OEVBMSwgMHgxQUI5LCAweDhFQUEsIDB4MUFCOCwgMHg4RUFCLAorICAgIDB4MEEwRSwgMHg4RUFDLCAweDFBQkEsIDB4OEVBRSwgMHgzQjQ3LCAweDhFQUYsIDB4MDZFNSwgMHg4RUIwLCAweDFBQkIsCisgICAgMHg4RUIxLCAweDFBQkQsIDB4OEVCMywgMHgzQjQ4LCAweDhFQjYsIDB4MzcwMywgMHg4RUJFLCAweDFBQkUsIDB4OEVDMCwKKyAgICAweDFERUYsIDB4OEVDNSwgMHgxQUJGLCAweDhFQzYsIDB4MUFCQywgMHg4RUM4LCAweDFBQzAsIDB4OEVDQSwgMHgwOTAyLAorICAgIDB4OEVDQiwgMHgxQUMxLCAweDhFQ0MsIDB4MDY0QSwgMHg4RUNELCAweDA3MDksIDB4OEVDRiwgMHgyMUI3LCAweDhFRDEsCisgICAgMHgzQjQ5LCAweDhFRDIsIDB4MDc2MiwgMHg4RUQ0LCAweDNCNEEsIDB4OEVEQiwgMHgxQUMyLCAweDhFREYsIDB4MENDOCwKKyAgICAweDhFRTIsIDB4MEMzOCwgMHg4RUUzLCAweDFBQzMsIDB4OEVFQiwgMHgxQUM2LCAweDhFRjgsIDB4MDhFMCwgMHg4RUY5LAorICAgIDB4M0I0QiwgMHg4RUZCLCAweDFBQzUsIDB4OEVGQywgMHgxQUM0LCAweDhFRkQsIDB4MDczMCwgMHg4RUZFLCAweDFBQzcsCisgICAgMHg4RjAzLCAweDA1QjEsIDB4OEYwNSwgMHgxQUM5LCAweDhGMDksIDB4MDg0QywgMHg4RjBBLCAweDFBQzgsIDB4OEYwQywKKyAgICAweDFBRDEsIDB4OEYxMiwgMHgxQUNCLCAweDhGMTMsIDB4MUFDRCwgMHg4RjE0LCAweDBFMzUsIDB4OEYxNSwgMHgxQUNBLAorICAgIDB4OEYxNywgMHgzQjRDLCAweDhGMTksIDB4MUFDQywgMHg4RjFCLCAweDFBRDAsIDB4OEYxQywgMHgxQUNFLCAweDhGMUQsCisgICAgMHgwNjRCLCAweDhGMUYsIDB4MUFDRiwgMHg4RjI2LCAweDFBRDIsIDB4OEYyOSwgMHgwRDEwLCAweDhGMkEsIDB4MEZBMCwKKyAgICAweDhGMkYsIDB4MDkzRSwgMHg4RjMzLCAweDFBRDMsIDB4OEYzNiwgMHgzQjRELCAweDhGMzgsIDB4MEYwQywgMHg4RjM5LAorICAgIDB4MUFENSwgMHg4RjNCLCAweDFBRDQsIDB4OEYzRSwgMHgxQUQ4LCAweDhGM0YsIDB4MEYyQiwgMHg4RjQyLCAweDFBRDcsCisgICAgMHg4RjQ0LCAweDA1Q0IsIDB4OEY0NSwgMHgxQUQ2LCAweDhGNDYsIDB4MUFEQiwgMHg4RjQ5LCAweDFBREEsIDB4OEY0QywKKyAgICAweDFBRDksIDB4OEY0RCwgMHgwQzJDLCAweDhGNEUsIDB4MUFEQywgMHg4RjU3LCAweDFBREQsIDB4OEY1QywgMHgxQURFLAorICAgIDB4OEY1RiwgMHgwN0ZFLCAweDhGNjEsIDB4MDZGQiwgMHg4RjYyLCAweDFBREYsIDB4OEY2MywgMHgxQUUwLCAweDhGNjQsCisgICAgMHgxQUUxLCAweDhGOUIsIDB4MEEwRiwgMHg4RjlDLCAweDFBRTIsIDB4OEY5RSwgMHgwOEQ5LCAweDhGOUYsIDB4MUFFMywKKyAgICAweDhGQTMsIDB4MUFFNCwgMHg4RkE2LCAweDNCNEUsIDB4OEZBNywgMHgxMEI2LCAweDhGQTgsIDB4MTBCNSwgMHg4RkFELAorICAgIDB4MUFFNSwgMHg4RkFFLCAweDE3RkYsIDB4OEZBRiwgMHgxQUU2LCAweDhGQjAsIDB4MEI2MiwgMHg4RkIxLCAweDA5RjEsCisgICAgMHg4RkIyLCAweDBDRjYsIDB4OEZCNSwgMHgzQjRGLCAweDhGQjYsIDB4M0I1MCwgMHg4RkI3LCAweDFBRTcsIDB4OEZCQSwKKyAgICAweDBFMjUsIDB4OEZCQiwgMHgwQkYwLCAweDhGQkMsIDB4MDgxMCwgMHg4RkJGLCAweDBCNjcsIDB4OEZDMiwgMHgwNENDLAorICAgIDB4OEZDNCwgMHgwRUE2LCAweDhGQzUsIDB4MEExRCwgMHg4RkM2LCAweDNCNTEsIDB4OEZDOCwgMHgzNzk5LCAweDhGQ0UsCisgICAgMHgwNzM0LCAweDhGRDEsIDB4MDZEOSwgMHg4RkQ0LCAweDBFMjYsIDB4OEZEQSwgMHgxQUU4LCAweDhGRTAsIDB4M0I1MiwKKyAgICAweDhGRTIsIDB4MUFFQSwgMHg4RkU0LCAweDNCNTMsIDB4OEZFNSwgMHgxQUU5LCAweDhGRTYsIDB4MDU2MCwgMHg4RkU5LAorICAgIDB4MENDRSwgMHg4RkVBLCAweDFBRUIsIDB4OEZFQiwgMHgwRDJELCAweDhGRUQsIDB4MEMyRCwgMHg4RkVGLCAweDFBRUMsCisgICAgMHg4RkYwLCAweDA5NUMsIDB4OEZGNCwgMHgxQUVFLCAweDhGRjYsIDB4M0I1NCwgMHg4RkY3LCAweDBFQ0UsIDB4OEZGOCwKKyAgICAweDFBRkQsIDB4OEZGOSwgMHgxQUYwLCAweDhGRkEsIDB4MUFGMSwgMHg4RkZELCAweDBCRTUsIDB4OTAwMCwgMHgwQjQwLAorICAgIDB4OTAwMSwgMHgwQUY5LCAweDkwMDIsIDB4M0I1NSwgMHg5MDAzLCAweDBDODAsIDB4OTAwNSwgMHgxQUVGLCAweDkwMDYsCisgICAgMHgwNjZGLCAweDkwMEIsIDB4MUFGOCwgMHg5MDBELCAweDFBRjUsIDB4OTAwRSwgMHgxQjAyLCAweDkwMEYsIDB4MEM4MSwKKyAgICAweDkwMTAsIDB4MEI5RSwgMHg5MDExLCAweDFBRjIsIDB4OTAxMywgMHgwQzFBLCAweDkwMTQsIDB4MEM0RCwgMHg5MDE1LAorICAgIDB4MUFGMywgMHg5MDE2LCAweDFBRjcsIDB4OTAxNywgMHgwQTI2LCAweDkwMTksIDB4MEQxRCwgMHg5MDFBLCAweDBCRTgsCisgICAgMHg5MDFELCAweDBBNjYsIDB4OTAxRSwgMHgxQUY2LCAweDkwMUYsIDB4MEIwRSwgMHg5MDIwLCAweDBCMDQsIDB4OTAyMSwKKyAgICAweDFBRjQsIDB4OTAyMiwgMHgwNDZELCAweDkwMjMsIDB4MEZDOCwgMHg5MDI3LCAweDFBRjksIDB4OTAyQywgMHgzQjU2LAorICAgIDB4OTAyRSwgMHgwQjQxLCAweDkwMzEsIDB4MDkzRiwgMHg5MDMyLCAweDBBMTAsIDB4OTAzNSwgMHgxQUZCLCAweDkwMzYsCisgICAgMHgxQUZBLCAweDkwMzgsIDB4MDRCMywgMHg5MDM5LCAweDFBRkMsIDB4OTAzQywgMHgwREExLCAweDkwM0UsIDB4MUIwNCwKKyAgICAweDkwNDEsIDB4MENCMywgMHg5MDQyLCAweDBBMzEsIDB4OTA0NCwgMHgzQjU3LCAweDkwNDUsIDB4MEI5NywgMHg5MDQ3LAorICAgIDB4MDZGMCwgMHg5MDQ5LCAweDFCMDMsIDB4OTA0QSwgMHgwRjIxLCAweDkwNEIsIDB4MDRFMSwgMHg5MDRELCAweDBFMjcsCisgICAgMHg5MDRFLCAweDA1NjEsIDB4OTA0RiwgMHgxQUZFLCAweDkwNTAsIDB4MUFGRiwgMHg5MDUxLCAweDFCMDAsIDB4OTA1MiwKKyAgICAweDFCMDEsIDB4OTA1MywgMHgwQzkzLCAweDkwNTQsIDB4MEI2MSwgMHg5MDU1LCAweDA0QTcsIDB4OTA1NiwgMHgxQjA1LAorICAgIDB4OTA1OCwgMHgxQjA2LCAweDkwNTksIDB4MUQzNCwgMHg5MDVDLCAweDBCMUQsIDB4OTA1RSwgMHgxQjA3LCAweDkwNjAsCisgICAgMHgwNTE1LCAweDkwNjEsIDB4MEFDRSwgMHg5MDYzLCAweDA3NjMsIDB4OTA2NSwgMHgwRjQ0LCAweDkwNjcsIDB4MjFCQSwKKyAgICAweDkwNjgsIDB4MUIwOCwgMHg5MDY5LCAweDBDMjYsIDB4OTA2RCwgMHgwQUZBLCAweDkwNkUsIDB4MDkwMywgMHg5MDZGLAorICAgIDB4MUIwOSwgMHg5MDcyLCAweDFCMEMsIDB4OTA3NSwgMHgwOTZGLCAweDkwNzYsIDB4MUIwQSwgMHg5MDc3LCAweDBBQUQsCisgICAgMHg5MDc4LCAweDBBQUMsIDB4OTA3QSwgMHgwNEE4LCAweDkwN0MsIDB4MEY5MywgMHg5MDdELCAweDFCMEUsIDB4OTA3RiwKKyAgICAweDBEODYsIDB4OTA4MCwgMHgxQjEwLCAweDkwODEsIDB4MUIwRiwgMHg5MDgyLCAweDFCMEQsIDB4OTA4MywgMHgxNzM3LAorICAgIDB4OTA4NCwgMHgwNjEwLCAweDkwODcsIDB4MUFFRCwgMHg5MDg4LCAweDNCNTgsIDB4OTA4OSwgMHgxQjEyLCAweDkwOEEsCisgICAgMHgxQjExLCAweDkwOEYsIDB4MUIxMywgMHg5MDkxLCAweDBGMjIsIDB4OTA5NSwgMHgzQjU5LCAweDkwOTksIDB4M0I1QSwKKyAgICAweDkwOUIsIDB4M0I1QiwgMHg5MEEyLCAweDNCNUMsIDB4OTBBMywgMHgwQ0I5LCAweDkwQTYsIDB4MEU1QywgMHg5MEE4LAorICAgIDB4MUIxNCwgMHg5MEFBLCAweDA5MDUsIDB4OTBBRiwgMHgxQjE1LCAweDkwQjEsIDB4MUIxNiwgMHg5MEI0LCAweDNCNUQsCisgICAgMHg5MEI1LCAweDFCMTcsIDB4OTBCOCwgMHgwQzFCLCAweDkwQzEsIDB4MDRBRSwgMHg5MENBLCAweDA3RUIsIDB4OTBDRSwKKyAgICAweDBGRTAsIDB4OTBENywgMHgzQjVFLCAweDkwREIsIDB4MUIxQiwgMHg5MERELCAweDNCNUYsIDB4OTBERSwgMHgyMUJCLAorICAgIDB4OTBFMSwgMHgwNzBBLCAweDkwRTIsIDB4MUIxOCwgMHg5MEU0LCAweDFCMTksIDB4OTBFOCwgMHgwREU2LCAweDkwRUQsCisgICAgMHgwNUIyLCAweDkwRjQsIDB4M0I2MCwgMHg5MEY1LCAweDBGMjMsIDB4OTBGNywgMHgwNkI3LCAweDkwRkQsIDB4MEM0RSwKKyAgICAweDkxMDIsIDB4MUIxQywgMHg5MTEyLCAweDFCMUQsIDB4OTExNSwgMHgyMUJELCAweDkxMTcsIDB4M0I2MSwgMHg5MTE5LAorICAgIDB4MUIxRSwgMHg5MTFDLCAweDNCNjIsIDB4OTEyNywgMHgyMUJFLCAweDkxMkQsIDB4MEMxQywgMHg5MTMwLCAweDFCMjAsCisgICAgMHg5MTMxLCAweDNCNjMsIDB4OTEzMiwgMHgxQjFGLCAweDkxM0EsIDB4M0I2NCwgMHg5MTNELCAweDNCNjUsIDB4OTE0OCwKKyAgICAweDNCNjYsIDB4OTE0OSwgMHgwQ0FCLCAweDkxNEEsIDB4MUIyMSwgMHg5MTRCLCAweDA5NDAsIDB4OTE0QywgMHgwOTBDLAorICAgIDB4OTE0RCwgMHgwRDExLCAweDkxNEUsIDB4MEJBRiwgMHg5MTUyLCAweDA5MUUsIDB4OTE1NCwgMHgwQTMyLCAweDkxNTYsCisgICAgMHgxQjIyLCAweDkxNTgsIDB4MUIyMywgMHg5MTVCLCAweDNCNjcsIDB4OTE2MSwgMHgzQjY4LCAweDkxNjIsIDB4MEEyMywKKyAgICAweDkxNjMsIDB4MUIyNCwgMHg5MTY0LCAweDNCNjksIDB4OTE2NSwgMHgxQjI1LCAweDkxNjksIDB4MUIyNiwgMHg5MTZBLAorICAgIDB4MEY1OSwgMHg5MTZDLCAweDA5NDEsIDB4OTE3MiwgMHgxQjI4LCAweDkxNzMsIDB4MUIyNywgMHg5MTc1LCAweDA3RUMsCisgICAgMHg5MTc3LCAweDA4MDUsIDB4OTE3OCwgMHgwODhFLCAweDkxODIsIDB4MUIyQiwgMHg5MTg3LCAweDA5NzAsIDB4OTE4OSwKKyAgICAweDFCMkEsIDB4OTE4QiwgMHgxQjI5LCAweDkxOEQsIDB4MEI0OSwgMHg5MThFLCAweDNCNkEsIDB4OTE5MCwgMHgwN0EzLAorICAgIDB4OTE5MiwgMHgwQTY3LCAweDkxOTcsIDB4MEQ0NCwgMHg5MTlDLCAweDA5NDMsIDB4OTE5RSwgMHgzQjZCLCAweDkxQTIsCisgICAgMHgxQjJDLCAweDkxQTQsIDB4MDlDNywgMHg5MUE4LCAweDNCNkMsIDB4OTFBQSwgMHgxQjJGLCAweDkxQUIsIDB4MUIyRCwKKyAgICAweDkxQUMsIDB4MUUxQiwgMHg5MUFELCAweDNCNkQsIDB4OTFBRSwgMHgzQjZFLCAweDkxQUYsIDB4MUIyRSwgMHg5MUIxLAorICAgIDB4MUU2MSwgMHg5MUIyLCAweDNCNkYsIDB4OTFCNCwgMHgxQjMxLCAweDkxQjUsIDB4MUIzMCwgMHg5MUI4LCAweDA5RTIsCisgICAgMHg5MUJBLCAweDFCMzIsIDB4OTFCQywgMHgzQjcwLCAweDkxQzAsIDB4MUIzMywgMHg5MUMxLCAweDFCMzQsIDB4OTFDNiwKKyAgICAweDBENjQsIDB4OTFDNywgMHgwODQzLCAweDkxQzgsIDB4MDkwRCwgMHg5MUM5LCAweDFCMzUsIDB4OTFDQiwgMHgxQjM2LAorICAgIDB4OTFDQywgMHgwRjZDLCAweDkxQ0QsIDB4MDk0RiwgMHg5MUNFLCAweDBFRkEsIDB4OTFDRiwgMHgwRjk0LCAweDkxRDAsCisgICAgMHgxQjM3LCAweDkxRDEsIDB4MDZEQSwgMHg5MUQ2LCAweDFCMzgsIDB4OTFENywgMHgyMUMwLCAweDkxRDgsIDB4MEMxRCwKKyAgICAweDkxREEsIDB4MjFCRiwgMHg5MURCLCAweDFCM0IsIDB4OTFEQywgMHgwNUQ2LCAweDkxREQsIDB4MEExMSwgMHg5MURFLAorICAgIDB4MjFDMSwgMHg5MURGLCAweDFCMzksIDB4OTFFMSwgMHgxQjNBLCAweDkxRTMsIDB4MEJGQywgMHg5MUU0LCAweDIxQzQsCisgICAgMHg5MUU1LCAweDIxQzUsIDB4OTFFNiwgMHgwRTgzLCAweDkxRTcsIDB4MDZGNCwgMHg5MUVELCAweDIxQzIsIDB4OTFFRSwKKyAgICAweDIxQzMsIDB4OTFGMCwgMHgzQjcxLCAweDkxRjUsIDB4MUIzRCwgMHg5MUY2LCAweDFCM0UsIDB4OTFGNywgMHgzQjcyLAorICAgIDB4OTFGQiwgMHgzQjczLCAweDkxRkMsIDB4MUIzQywgMHg5MUZGLCAweDFCNDAsIDB4OTIwNiwgMHgyMUM2LCAweDkyMDcsCisgICAgMHgzQjc0LCAweDkyMEEsIDB4MjFDOCwgMHg5MjBELCAweDBDQjcsIDB4OTIwRSwgMHgwNUExLCAweDkyMTAsIDB4MjFDNywKKyAgICAweDkyMTEsIDB4MUI0NCwgMHg5MjE0LCAweDFCNDEsIDB4OTIxNSwgMHgxQjQzLCAweDkyMUUsIDB4MUIzRiwgMHg5MjI4LAorICAgIDB4M0I3NSwgMHg5MjI5LCAweDFCOEEsIDB4OTIyQywgMHgxQjQyLCAweDkyMzMsIDB4M0I3NiwgMHg5MjM0LCAweDBGQjMsCisgICAgMHg5MjM3LCAweDA3OEUsIDB4OTIzOCwgMHgzQjc3LCAweDkyMzksIDB4MjFDRiwgMHg5MjNBLCAweDIxQzksIDB4OTIzQywKKyAgICAweDIxQ0IsIDB4OTIzRiwgMHgxQjRDLCAweDkyNDAsIDB4MjFDQSwgMHg5MjQzLCAweDNCNzgsIDB4OTI0NCwgMHgwQzJFLAorICAgIDB4OTI0NSwgMHgxQjQ3LCAweDkyNDcsIDB4M0I3OSwgMHg5MjQ4LCAweDFCNEEsIDB4OTI0OSwgMHgxQjQ4LCAweDkyNEIsCisgICAgMHgxQjRELCAweDkyNEUsIDB4MjFDQywgMHg5MjRGLCAweDNCN0EsIDB4OTI1MCwgMHgxQjRFLCAweDkyNTEsIDB4MjFDRSwKKyAgICAweDkyNTcsIDB4MUI0NiwgMHg5MjU5LCAweDIxQ0QsIDB4OTI1QSwgMHgxQjUzLCAweDkyNUIsIDB4MDUxNiwgMHg5MjVFLAorICAgIDB4MUI0NSwgMHg5MjYwLCAweDNCN0IsIDB4OTI2MiwgMHgwRDQxLCAweDkyNjQsIDB4MUI0OSwgMHg5MjY2LCAweDA5QzgsCisgICAgMHg5MjY3LCAweDIxRDAsIDB4OTI3MSwgMHgwN0VELCAweDkyNzcsIDB4MjFEMiwgMHg5Mjc4LCAweDIxRDMsIDB4OTI3RSwKKyAgICAweDBFNzYsIDB4OTI4MCwgMHgwNkRDLCAweDkyODMsIDB4MDk1MCwgMHg5Mjg1LCAweDBDOTQsIDB4OTI4OCwgMHgyMEFBLAorICAgIDB4OTI5MSwgMHgwQUFGLCAweDkyOTMsIDB4MUI1MSwgMHg5Mjk1LCAweDFCNEIsIDB4OTI5NiwgMHgxQjUwLCAweDkyOTgsCisgICAgMHgwRUNGLCAweDkyOUEsIDB4MEJENCwgMHg5MjlCLCAweDFCNTIsIDB4OTI5QywgMHgxQjRGLCAweDkyQTcsIDB4MjFEMSwKKyAgICAweDkyQUQsIDB4MEFBRSwgMHg5MkIzLCAweDM1NTQsIDB4OTJCNywgMHgxQjU2LCAweDkyQjksIDB4MUI1NSwgMHg5MkMyLAorICAgIDB4M0I3QywgMHg5MkNCLCAweDNCN0QsIDB4OTJDQywgMHgzQjdFLCAweDkyQ0YsIDB4MUI1NCwgMHg5MkQwLCAweDIxRDcsCisgICAgMHg5MkQyLCAweDBFNUQsIDB4OTJEMywgMHgyMURCLCAweDkyRDUsIDB4MjFEOSwgMHg5MkQ3LCAweDIxRDUsIDB4OTJEOSwKKyAgICAweDIxRDYsIDB4OTJERiwgMHgzQjdGLCAweDkyRTAsIDB4MjFEQSwgMHg5MkU0LCAweDA5ODUsIDB4OTJFNywgMHgyMUQ0LAorICAgIDB4OTJFOSwgMHgxQjU3LCAweDkyRUEsIDB4MEUyRiwgMHg5MkVELCAweDA0RjYsIDB4OTJGMiwgMHgwREI4LCAweDkyRjMsCisgICAgMHgwQkIwLCAweDkyRjgsIDB4MDY5MiwgMHg5MkY5LCAweDIwQjAsIDB4OTJGQSwgMHgxQjU5LCAweDkyRkIsIDB4MjFERSwKKyAgICAweDkyRkMsIDB4MDdFRiwgMHg5MkZGLCAweDIxRTEsIDB4OTMwMiwgMHgyMUUzLCAweDkzMDQsIDB4MzQ1QSwgMHg5MzA2LAorICAgIDB4MDg3QSwgMHg5MzBELCAweDNCODAsIDB4OTMwRiwgMHgxQjU4LCAweDkzMTAsIDB4MEEzMywgMHg5MzE1LCAweDNCODEsCisgICAgMHg5MzE4LCAweDBBMzQsIDB4OTMxOSwgMHgxQjVDLCAweDkzMUEsIDB4MUI1RSwgMHg5MzFELCAweDIxRTIsIDB4OTMxRSwKKyAgICAweDIxRTAsIDB4OTMxRiwgMHgzQjgyLCAweDkzMjAsIDB4MDlFMywgMHg5MzIxLCAweDIxREQsIDB4OTMyMiwgMHgxQjVELAorICAgIDB4OTMyMywgMHgxQjVGLCAweDkzMjUsIDB4MjFEQywgMHg5MzI2LCAweDA2Q0IsIDB4OTMyNywgMHgzQjgzLCAweDkzMjgsCisgICAgMHgwREI3LCAweDkzMkIsIDB4MDkwRSwgMHg5MzJDLCAweDBGQzksIDB4OTMyRSwgMHgxQjVCLCAweDkzMkYsIDB4MDg2OCwKKyAgICAweDkzMzIsIDB4MEZFNSwgMHg5MzM1LCAweDFCNjEsIDB4OTMzQSwgMHgxQjYwLCAweDkzM0IsIDB4MUI2MiwgMHg5MzQ0LAorICAgIDB4MUI1QSwgMHg5MzQ3LCAweDNCODQsIDB4OTM0OCwgMHgyMEE5LCAweDkzNEEsIDB4MzQ1OCwgMHg5MzRCLCAweDBDQzEsCisgICAgMHg5MzRELCAweDBDNEYsIDB4OTM1MiwgMHgzQjg1LCAweDkzNTQsIDB4MEJGMywgMHg5MzU2LCAweDFCNjcsIDB4OTM1NywKKyAgICAweDIxRTUsIDB4OTM1QiwgMHgwQjgxLCAweDkzNUMsIDB4MUI2MywgMHg5MzYwLCAweDFCNjQsIDB4OTM2NSwgMHgzQjg2LAorICAgIDB4OTM2QSwgMHgzQjg3LCAweDkzNkMsIDB4MDcwMywgMHg5MzZELCAweDNCODgsIDB4OTM2RSwgMHgxQjY2LCAweDkzNzAsCisgICAgMHgyMUU0LCAweDkzNzUsIDB4MDc2NCwgMHg5MzdDLCAweDFCNjUsIDB4OTM3RSwgMHgwOUM5LCAweDkzOEMsIDB4MDVENywKKyAgICAweDkzOTQsIDB4MUI2QiwgMHg5Mzk2LCAweDA4MkYsIDB4OTM5NywgMHgwQUZCLCAweDkzOUEsIDB4MEJFNiwgMHg5MzlCLAorICAgIDB4M0I4OSwgMHg5M0E0LCAweDIxRTYsIDB4OTNBNywgMHgwNTk5LCAweDkzQTksIDB4M0I4QiwgMHg5M0FDLCAweDFCNjksCisgICAgMHg5M0FELCAweDFCNkEsIDB4OTNBRSwgMHgwQkRGLCAweDkzQjAsIDB4MUI2OCwgMHg5M0I5LCAweDFCNkMsIDB4OTNCQSwKKyAgICAweDNCOEEsIDB4OTNDMSwgMHgzQjhDLCAweDkzQzMsIDB4MUI3MiwgMHg5M0M2LCAweDIxRTcsIDB4OTNDOCwgMHgxQjc1LAorICAgIDB4OTNDQSwgMHgzQjhELCAweDkzRDAsIDB4MUI3NCwgMHg5M0QxLCAweDBDMjcsIDB4OTNENiwgMHgxQjZELCAweDkzRDcsCisgICAgMHgxQjZFLCAweDkzRDgsIDB4MUI3MSwgMHg5M0RELCAweDFCNzMsIDB4OTNERSwgMHgyMUU4LCAweDkzRTEsIDB4MDZCOCwKKyAgICAweDkzRTIsIDB4M0I4RSwgMHg5M0U0LCAweDFCNzYsIDB4OTNFNSwgMHgxQjcwLCAweDkzRTgsIDB4MUI2RiwgMHg5M0Y4LAorICAgIDB4MjFFOSwgMHg5M0ZBLCAweDNCOEYsIDB4OTNGRCwgMHgzQjkwLCAweDk0MDMsIDB4MUI3QSwgMHg5NDA3LCAweDFCN0IsCisgICAgMHg5NDBGLCAweDNCOTEsIDB4OTQxMCwgMHgxQjdDLCAweDk0MTMsIDB4MUI3OSwgMHg5NDE0LCAweDFCNzgsIDB4OTQxOCwKKyAgICAweDA5Q0EsIDB4OTQxOSwgMHgwQzgyLCAweDk0MUEsIDB4MUI3NywgMHg5NDIxLCAweDFCODAsIDB4OTQyQiwgMHgxQjdFLAorICAgIDB4OTQzMSwgMHgyMUVBLCAweDk0MzQsIDB4M0I5MiwgMHg5NDM1LCAweDFCN0YsIDB4OTQzNiwgMHgxQjdELCAweDk0MzgsCisgICAgMHgwQjU4LCAweDk0M0EsIDB4MUI4MSwgMHg5NDNGLCAweDNCOTMsIDB4OTQ0MSwgMHgxQjgyLCAweDk0NDQsIDB4MUI4NCwKKyAgICAweDk0NDUsIDB4MjFFQiwgMHg5NDQ4LCAweDIxRUMsIDB4OTQ1MSwgMHgwNjExLCAweDk0NTIsIDB4MUI4MywgMHg5NDUzLAorICAgIDB4MEYwNiwgMHg5NDU1LCAweDNCOTQsIDB4OTQ1QSwgMHgxQjhGLCAweDk0NUIsIDB4MUI4NSwgMHg5NDVFLCAweDFCODgsCisgICAgMHg5NDYwLCAweDFCODYsIDB4OTQ2MiwgMHgxQjg3LCAweDk0NkEsIDB4MUI4OSwgMHg5NDZCLCAweDNCOTUsIDB4OTQ3MCwKKyAgICAweDFCOEIsIDB4OTQ3MiwgMHgzQjk2LCAweDk0NzUsIDB4MUI4QywgMHg5NDc3LCAweDFCOEQsIDB4OTQ3QywgMHgxQjkwLAorICAgIDB4OTQ3RCwgMHgxQjhFLCAweDk0N0UsIDB4MUI5MSwgMHg5NDdGLCAweDFCOTMsIDB4OTQ4MSwgMHgxQjkyLCAweDk1NzcsCisgICAgMHgwQkQ1LCAweDk1NzgsIDB4M0I5NywgMHg5NTgwLCAweDBFRjMsIDB4OTU4MiwgMHgxQjk0LCAweDk1ODMsIDB4MEFCMCwKKyAgICAweDk1ODcsIDB4MUI5NSwgMHg5NTg5LCAweDBFMTQsIDB4OTU4QSwgMHgxQjk2LCAweDk1OEIsIDB4MDU4OSwgMHg5NThGLAorICAgIDB4MDRERSwgMHg5NTkxLCAweDA2MTMsIDB4OTU5MiwgMHgyMUVELCAweDk1OTMsIDB4MDYxMiwgMHg5NTk0LCAweDFCOTcsCisgICAgMHg5NTk2LCAweDFCOTgsIDB4OTU5OCwgMHgxQjk5LCAweDk1OTksIDB4MUI5QSwgMHg5NUEwLCAweDFCOUIsIDB4OTVBMiwKKyAgICAweDA2MTQsIDB4OTVBMywgMHgwNUIzLCAweDk1QTQsIDB4MDdGMCwgMHg5NUE1LCAweDBENEEsIDB4OTVBNiwgMHgzQjk4LAorICAgIDB4OTVBNywgMHgxQjlELCAweDk1QTgsIDB4MUI5QywgMHg5NUE5LCAweDNCOTksIDB4OTVBQiwgMHgzQjlBLCAweDk1QUQsCisgICAgMHgxQjlFLCAweDk1QjEsIDB4MzU1NSwgMHg5NUIyLCAweDA0RkUsIDB4OTVCNCwgMHgzQjlCLCAweDk1QjksIDB4MUJBMSwKKyAgICAweDk1QkIsIDB4MUJBMCwgMHg5NUJDLCAweDFCOUYsIDB4OTVCRCwgMHgzQjlDLCAweDk1QkUsIDB4MUJBMiwgMHg5NUMzLAorICAgIDB4MUJBNSwgMHg5NUM3LCAweDA0OEIsIDB4OTVDQSwgMHgxQkEzLCAweDk1Q0MsIDB4MUJBNywgMHg5NUNELCAweDFCQTYsCisgICAgMHg5NUQ0LCAweDFCQTksIDB4OTVENSwgMHgxQkE4LCAweDk1RDYsIDB4MUJBQSwgMHg5NUQ4LCAweDBDODYsIDB4OTVEQSwKKyAgICAweDNCOUQsIDB4OTVEQywgMHgxQkFCLCAweDk1RTEsIDB4MUJBQywgMHg5NUUyLCAweDFCQUUsIDB4OTVFNSwgMHgxQkFELAorICAgIDB4OTYxQywgMHgwRERFLCAweDk2MUQsIDB4M0I5RSwgMHg5NjIxLCAweDFCQUYsIDB4OTYyOCwgMHgxQkIwLCAweDk2MkEsCisgICAgMHgwODU1LCAweDk2MkUsIDB4MUJCMSwgMHg5NjJGLCAweDFCQjIsIDB4OTYzMiwgMHgwRTc3LCAweDk2M0IsIDB4MEFDRCwKKyAgICAweDk2M0YsIDB4MDQ2OCwgMHg5NjQwLCAweDBCMkIsIDB4OTY0MSwgMHgzQjlGLCAweDk2NDIsIDB4MUJCMywgMHg5NjQ0LAorICAgIDB4MERERiwgMHg5NjRCLCAweDFCQjYsIDB4OTY0QywgMHgxQkI0LCAweDk2NEQsIDB4MDdGMSwgMHg5NjRGLCAweDFCQjUsCisgICAgMHg5NjUwLCAweDA3NzYsIDB4OTY1OCwgMHgzQkEwLCAweDk2NUIsIDB4MEUxNSwgMHg5NjVDLCAweDFCQjgsIDB4OTY1RCwKKyAgICAweDFCQkEsIDB4OTY1RSwgMHgxQkI5LCAweDk2NUYsIDB4MUJCQiwgMHg5NjYyLCAweDA0QzMsIDB4OTY2MywgMHgwQTFFLAorICAgIDB4OTY2NCwgMHgwOTg2LCAweDk2NjUsIDB4MDYxNSwgMHg5NjY2LCAweDFCQkMsIDB4OTY2QSwgMHgwRDFDLCAweDk2NkMsCisgICAgMHgxQkJFLCAweDk2NzAsIDB4MDRDNCwgMHg5NjcyLCAweDFCQkQsIDB4OTY3MywgMHgwQkUwLCAweDk2NzUsIDB4MEY5NSwKKyAgICAweDk2NzYsIDB4MEM4MywgMHg5Njc3LCAweDFCQjcsIDB4OTY3OCwgMHgwRjZFLCAweDk2N0EsIDB4MDc2NSwgMHg5NjdELAorICAgIDB4MEY0NSwgMHg5Njg0LCAweDNCQTEsIDB4OTY4NSwgMHgwNkYxLCAweDk2ODYsIDB4MEY3QywgMHg5Njg4LCAweDA2RkUsCisgICAgMHg5NjhBLCAweDBCNDIsIDB4OTY4QiwgMHgxODZDLCAweDk2OEQsIDB4MUJCRiwgMHg5NjhFLCAweDA1OEEsIDB4OTY4RiwKKyAgICAweDBBMzUsIDB4OTY5NCwgMHgwNUI0LCAweDk2OTUsIDB4MUJDMSwgMHg5Njk3LCAweDFCQzIsIDB4OTY5OCwgMHgxQkMwLAorICAgIDB4OTY5OSwgMHgwNzNBLCAweDk2OUIsIDB4MDg0RCwgMHg5NjlDLCAweDA5Q0IsIDB4OTY5RCwgMHgyMUYwLCAweDk2QTAsCisgICAgMHgwNEM1LCAweDk2QTMsIDB4MEZBMSwgMHg5NkE0LCAweDNCQTIsIDB4OTZBNywgMHgxQkM0LCAweDk2QTgsIDB4MUIwQiwKKyAgICAweDk2QTksIDB4M0JBMywgMHg5NkFBLCAweDFCQzMsIDB4OTZBRiwgMHgyMUYxLCAweDk2QjAsIDB4MUJDNywgMHg5NkIxLAorICAgIDB4MUJDNSwgMHg5NkIyLCAweDFCQzYsIDB4OTZCNCwgMHgxQkM4LCAweDk2QjYsIDB4MUJDOSwgMHg5NkI3LCAweDBGQjQsCisgICAgMHg5NkI4LCAweDFCQ0EsIDB4OTZCOSwgMHgxQkNCLCAweDk2QkIsIDB4MEE2RCwgMHg5NkJDLCAweDBENEYsIDB4OTZDMCwKKyAgICAweDBBNDMsIDB4OTZDMSwgMHgwNjIzLCAweDk2QzQsIDB4MEYyNCwgMHg5NkM1LCAweDA1NkQsIDB4OTZDNiwgMHgwOTQyLAorICAgIDB4OTZDNywgMHgwNzhGLCAweDk2QzksIDB4MUJDRSwgMHg5NkNCLCAweDFCQ0QsIDB4OTZDQywgMHgwOEMxLCAweDk2Q0QsCisgICAgMHgxQkNGLCAweDk2Q0UsIDB4MUJDQywgMHg5NkQxLCAweDA4NzYsIDB4OTZEMiwgMHgzQkE0LCAweDk2RDUsIDB4MUJEMywKKyAgICAweDk2RDYsIDB4MTk5MiwgMHg5NkQ5LCAweDEwRUIsIDB4OTZEQiwgMHgwQTNELCAweDk2REMsIDB4MUJEMSwgMHg5NkRFLAorICAgIDB4M0JBNiwgMHg5NkUyLCAweDBGNkQsIDB4OTZFMywgMHgwQ0M5LCAweDk2RTgsIDB4MDRDRCwgMHg5NkU5LCAweDNCQTcsCisgICAgMHg5NkVBLCAweDBBODcsIDB4OTZFQiwgMHgwOEUyLCAweDk2RjAsIDB4MEUwNywgMHg5NkYxLCAweDNCQTgsIDB4OTZGMiwKKyAgICAweDA0RTIsIDB4OTZGNiwgMHgwRkI1LCAweDk2RjcsIDB4MEY1NSwgMHg5NkY5LCAweDFCRDQsIDB4OTZGQiwgMHgwQzNGLAorICAgIDB4OTcwMCwgMHgwOTI3LCAweDk3MDIsIDB4M0JBOSwgMHg5NzA0LCAweDFCRDUsIDB4OTcwNiwgMHgxQkQ2LCAweDk3MDcsCisgICAgMHgwQTEyLCAweDk3MDgsIDB4MUJENywgMHg5NzA5LCAweDNCQUEsIDB4OTcwQSwgMHgwRkI2LCAweDk3MEQsIDB4MUJEMiwKKyAgICAweDk3MEUsIDB4MUJEOSwgMHg5NzBGLCAweDFCREIsIDB4OTcxMSwgMHgxQkRBLCAweDk3MTMsIDB4MUJEOCwgMHg5NzE2LAorICAgIDB4MUJEQywgMHg5NzE5LCAweDFCREQsIDB4OTcxQywgMHgwQUZDLCAweDk3MUUsIDB4MDU2MiwgMHg5NzI0LCAweDFCREUsCisgICAgMHg5NzI3LCAweDBFQzQsIDB4OTcyQSwgMHgxQkRGLCAweDk3MzAsIDB4MUJFMCwgMHg5NzMyLCAweDBGRDAsIDB4OTczMywKKyAgICAweDIxRjIsIDB4OTczOCwgMHgxNDE0LCAweDk3MzksIDB4MUJFMSwgMHg5NzNCLCAweDIxRjMsIDB4OTczRCwgMHgxQkUyLAorICAgIDB4OTczRSwgMHgxQkUzLCAweDk3NDIsIDB4MUJFNywgMHg5NzQzLCAweDIxRjQsIDB4OTc0NCwgMHgxQkU0LCAweDk3NDYsCisgICAgMHgxQkU1LCAweDk3NDgsIDB4MUJFNiwgMHg5NzQ5LCAweDFCRTgsIDB4OTc0RCwgMHgyMUY1LCAweDk3NEYsIDB4MjFGNiwKKyAgICAweDk3NTEsIDB4MjFGNywgMHg5NzUyLCAweDBBNjgsIDB4OTc1NSwgMHgyMUY4LCAweDk3NTYsIDB4MEYwMywgMHg5NzU5LAorICAgIDB4MEE2OSwgMHg5NzVBLCAweDNCQUIsIDB4OTc1QywgMHgxQkU5LCAweDk3NUUsIDB4MEQ4NywgMHg5NzYwLCAweDFCRUEsCisgICAgMHg5NzYxLCAweDFEMDYsIDB4OTc2MiwgMHgwRUQ4LCAweDk3NjMsIDB4M0JBQywgMHg5NzY0LCAweDFCRUIsIDB4OTc2NiwKKyAgICAweDFCRUMsIDB4OTc2OCwgMHgxQkVELCAweDk3NjksIDB4MDVCNSwgMHg5NzZCLCAweDFCRUYsIDB4OTc2RCwgMHgwQTFGLAorICAgIDB4OTc2RSwgMHgzQkFELCAweDk3NzEsIDB4MUJGMCwgMHg5NzczLCAweDNCQUUsIDB4OTc3NCwgMHgwNkZBLCAweDk3NzksCisgICAgMHgxQkYxLCAweDk3N0EsIDB4MUJGNSwgMHg5NzdDLCAweDFCRjMsIDB4OTc4MSwgMHgxQkY0LCAweDk3ODQsIDB4MDVEMSwKKyAgICAweDk3ODUsIDB4MUJGMiwgMHg5Nzg2LCAweDFCRjYsIDB4OTc4QiwgMHgxQkY3LCAweDk3OEQsIDB4MDQ4QywgMHg5NzhGLAorICAgIDB4MUJGOCwgMHg5NzkwLCAweDFCRjksIDB4OTc5OCwgMHgwOUNDLCAweDk3OUEsIDB4M0JBRiwgMHg5NzlDLCAweDFCRkEsCisgICAgMHg5N0EwLCAweDA2NjEsIDB4OTdBMiwgMHgzQkIwLCAweDk3QTMsIDB4MUJGRCwgMHg5N0E2LCAweDFCRkMsIDB4OTdBOCwKKyAgICAweDFCRkIsIDB4OTdBQiwgMHgxQTM0LCAweDk3QUQsIDB4MEUyQywgMHg5N0IzLCAweDFCRkUsIDB4OTdCNCwgMHgxQkZGLAorICAgIDB4OTdCNSwgMHgzQkIxLCAweDk3QjYsIDB4M0JCMiwgMHg5N0MzLCAweDFDMDAsIDB4OTdDNiwgMHgxQzAxLCAweDk3QzgsCisgICAgMHgxQzAyLCAweDk3Q0IsIDB4MUMwMywgMHg5N0QzLCAweDA2MTYsIDB4OTdEOSwgMHgzQkIzLCAweDk3REMsIDB4MUMwNCwKKyAgICAweDk3REUsIDB4M0JCNCwgMHg5N0VELCAweDFDMDUsIDB4OTdFRSwgMHgwQ0Q5LCAweDk3RjIsIDB4MUMwNywgMHg5N0YzLAorICAgIDB4MDUzQiwgMHg5N0Y0LCAweDNCQjUsIDB4OTdGNSwgMHgxQzBBLCAweDk3RjYsIDB4MUMwOSwgMHg5N0ZCLCAweDA0QzYsCisgICAgMHg5N0ZGLCAweDA2QjksIDB4OTgwMSwgMHgwRTE3LCAweDk4MDIsIDB4MEJENiwgMHg5ODAzLCAweDA4MTIsIDB4OTgwNSwKKyAgICAweDA3RjIsIDB4OTgwNiwgMHgwOTcxLCAweDk4MDgsIDB4MEEyMiwgMHg5ODBBLCAweDNCQjYsIDB4OTgwQywgMHgxQzBDLAorICAgIDB4OTgwRSwgMHgzQkI3LCAweDk4MEYsIDB4MUMwQiwgMHg5ODEwLCAweDBGMkMsIDB4OTgxMSwgMHgwNjI0LCAweDk4MTIsCisgICAgMHgwRDY2LCAweDk4MTMsIDB4MENCNCwgMHg5ODE3LCAweDBBNDIsIDB4OTgxOCwgMHgwRjk2LCAweDk4MUEsIDB4MDczMSwKKyAgICAweDk4MUUsIDB4M0JCOCwgMHg5ODIxLCAweDFDMEYsIDB4OTgyMywgMHgzQkI5LCAweDk4MjQsIDB4MUMwRSwgMHg5ODJCLAorICAgIDB4M0JCQSwgMHg5ODJDLCAweDBFNzksIDB4OTgyRCwgMHgwQzg0LCAweDk4MzAsIDB4MUU3MywgMHg5ODM0LCAweDA0RjIsCisgICAgMHg5ODM3LCAweDFDMTAsIDB4OTgzOCwgMHgxQzBELCAweDk4MzksIDB4MzdCMywgMHg5ODNCLCAweDBEQzMsIDB4OTgzQywKKyAgICAweDBGNTQsIDB4OTgzRCwgMHgxQzExLCAweDk4M0UsIDB4M0JCQiwgMHg5ODQ2LCAweDFDMTIsIDB4OTg0QiwgMHgxQzE0LAorICAgIDB4OTg0QywgMHgwQjRBLCAweDk4NEQsIDB4MDVCOSwgMHg5ODRFLCAweDA1QkEsIDB4OTg0RiwgMHgxQzEzLCAweDk4NTIsCisgICAgMHgzQkJDLCAweDk4NTMsIDB4M0JCRCwgMHg5ODU0LCAweDA2MjUsIDB4OTg1NSwgMHgwNzY2LCAweDk4NTcsIDB4MjFGOSwKKyAgICAweDk4NTgsIDB4MDYyNiwgMHg5ODU5LCAweDNCQkUsIDB4OTg1QSwgMHgxRTQ4LCAweDk4NUIsIDB4MEMzOSwgMHg5ODVFLAorICAgIDB4MEZBOCwgMHg5ODY1LCAweDIxRkEsIDB4OTg2NywgMHgwNzkwLCAweDk4NkIsIDB4MUMxNSwgMHg5ODZDLCAweDNCQkYsCisgICAgMHg5ODZGLCAweDFDMTYsIDB4OTg3MCwgMHgxQzE3LCAweDk4NzEsIDB4MUMxOCwgMHg5ODczLCAweDFDMUEsIDB4OTg3NCwKKyAgICAweDFDMTksIDB4OThBOCwgMHgwREU5LCAweDk4QUEsIDB4MUMxQiwgMHg5OEFGLCAweDFDMUMsIDB4OThCMSwgMHgxQzFELAorICAgIDB4OThCNiwgMHgxQzFFLCAweDk4QjgsIDB4M0JDMCwgMHg5OEJBLCAweDNCQzEsIDB4OThCRiwgMHgzQkMyLCAweDk4QzMsCisgICAgMHgxQzIwLCAweDk4QzQsIDB4MUMxRiwgMHg5OEM2LCAweDFDMjEsIDB4OThDOCwgMHgzQkMzLCAweDk4REIsIDB4MEQ4OCwKKyAgICAweDk4REMsIDB4MTgzOSwgMHg5OERGLCAweDA5RUYsIDB4OThFMCwgMHgzNjE4LCAweDk4RTIsIDB4MDY0QywgMHg5OEU1LAorICAgIDB4M0JDNCwgMHg5OEU5LCAweDFDMjIsIDB4OThFQiwgMHgxQzIzLCAweDk4RUQsIDB4MTBDMSwgMHg5OEVFLCAweDE0REEsCisgICAgMHg5OEVGLCAweDBENjcsIDB4OThGMiwgMHgwNEJGLCAweDk4RjQsIDB4MDQ3RiwgMHg5OEZDLCAweDA4QzIsIDB4OThGRCwKKyAgICAweDBFNUUsIDB4OThGRSwgMHgwOUU2LCAweDk5MDMsIDB4MUMyNCwgMHg5OTA1LCAweDBFRUIsIDB4OTkwOSwgMHgxQzI1LAorICAgIDB4OTkwQSwgMHgwRjQ2LCAweDk5MEMsIDB4MDRFNCwgMHg5OTEwLCAweDA4OEYsIDB4OTkxMiwgMHgxQzI2LCAweDk5MTMsCisgICAgMHgwNTZFLCAweDk5MTQsIDB4MUMyNywgMHg5OTE4LCAweDFDMjgsIDB4OTkxRCwgMHgxQzJBLCAweDk5MUUsIDB4MUMyQiwKKyAgICAweDk5MjAsIDB4MUMyRCwgMHg5OTIxLCAweDFDMjksIDB4OTkyNCwgMHgxQzJDLCAweDk5MjcsIDB4MjFGRCwgMHg5OTI4LAorICAgIDB4MDYxNywgMHg5OTJDLCAweDFDMkUsIDB4OTkyRSwgMHgxQzJGLCAweDk5MzIsIDB4M0JDNSwgMHg5OTMzLCAweDNCQzYsCisgICAgMHg5OTNELCAweDFDMzAsIDB4OTkzRSwgMHgxQzMxLCAweDk5NDAsIDB4M0JDNywgMHg5OTQyLCAweDFDMzIsIDB4OTk0NSwKKyAgICAweDFDMzQsIDB4OTk0OSwgMHgxQzMzLCAweDk5NEIsIDB4MUMzNiwgMHg5OTRDLCAweDFDMzksIDB4OTk0RCwgMHgzQkM4LAorICAgIDB4OTk1MCwgMHgxQzM1LCAweDk5NTEsIDB4MUMzNywgMHg5OTUyLCAweDFDMzgsIDB4OTk1NSwgMHgxQzNBLCAweDk5NTcsCisgICAgMHgwNkJBLCAweDk5NUMsIDB4M0JDOSwgMHg5OTVGLCAweDNCQ0EsIDB4OTk5NiwgMHgwOTFGLCAweDk5OTcsIDB4MUMzQiwKKyAgICAweDk5OTgsIDB4MUMzQywgMHg5OTk5LCAweDA3RjMsIDB4OTk5RSwgMHgyMUZGLCAweDk5QTUsIDB4MUMzRCwgMHg5OUE4LAorICAgIDB4MDU5QywgMHg5OUFDLCAweDBEMDUsIDB4OTlBRCwgMHgxQzNFLCAweDk5QUUsIDB4MUMzRiwgMHg5OUIxLCAweDNCQ0IsCisgICAgMHg5OUIzLCAweDBCOTgsIDB4OTlCNCwgMHgwQ0MzLCAweDk5QjksIDB4M0JDQywgMHg5OUJBLCAweDNCQ0QsIDB4OTlCQywKKyAgICAweDFDNDAsIDB4OTlDMSwgMHgwRDMzLCAweDk5QzQsIDB4MEIyQywgMHg5OUM1LCAweDA0RkEsIDB4OTlDNiwgMHgwNkU2LAorICAgIDB4OTlDOCwgMHgwNkU3LCAweDk5QzksIDB4M0JDRSwgMHg5OUQwLCAweDBCQjEsIDB4OTlEMSwgMHgxQzQ1LCAweDk5RDIsCisgICAgMHgwNkU4LCAweDk5RDUsIDB4MDU2RiwgMHg5OUQ4LCAweDFDNDQsIDB4OTlEQiwgMHgxQzQyLCAweDk5REQsIDB4MUM0MywKKyAgICAweDk5REYsIDB4MUM0MSwgMHg5OUUyLCAweDFDNEYsIDB4OTlFRCwgMHgxQzQ2LCAweDk5RUUsIDB4MUM0NywgMHg5OUYxLAorICAgIDB4MUM0OCwgMHg5OUYyLCAweDFDNDksIDB4OTlGOCwgMHgxQzRCLCAweDk5RkIsIDB4MUM0QSwgMHg5OUZGLCAweDA5NjMsCisgICAgMHg5QTAxLCAweDFDNEMsIDB4OUEwMiwgMHgzQkNGLCAweDlBMDUsIDB4MUM0RSwgMHg5QTA4LCAweDM3QkEsIDB4OUEwRSwKKyAgICAweDA2NEQsIDB4OUEwRiwgMHgxQzRELCAweDlBMTIsIDB4MEFGRCwgMHg5QTEzLCAweDA3NjcsIDB4OUExNiwgMHgzQkQwLAorICAgIDB4OUExOSwgMHgxQzUwLCAweDlBMjQsIDB4M0JEMSwgMHg5QTI3LCAweDNCRDIsIDB4OUEyOCwgMHgwQjJELCAweDlBMkIsCisgICAgMHgxQzUxLCAweDlBMkQsIDB4M0JEMywgMHg5QTJFLCAweDNCRDQsIDB4OUEzMCwgMHgwQzg1LCAweDlBMzYsIDB4M0JENSwKKyAgICAweDlBMzcsIDB4MUM1MiwgMHg5QTM4LCAweDNCRDYsIDB4OUEzRSwgMHgxQzU3LCAweDlBNDAsIDB4MUM1NSwgMHg5QTQyLAorICAgIDB4MUM1NCwgMHg5QTQzLCAweDFDNTYsIDB4OUE0NSwgMHgxQzUzLCAweDlBNEEsIDB4M0JENywgMHg5QTRELCAweDFDNTksCisgICAgMHg5QTRFLCAweDIyMDAsIDB4OUE1MiwgMHgxRTJGLCAweDlBNTUsIDB4MUM1OCwgMHg5QTU2LCAweDNCRDgsIDB4OUE1NywKKyAgICAweDFDNUIsIDB4OUE1QSwgMHgwNkJCLCAweDlBNUIsIDB4MUM1QSwgMHg5QTVGLCAweDFDNUMsIDB4OUE2MiwgMHgxQzVELAorICAgIDB4OUE2NCwgMHgxQzVGLCAweDlBNjUsIDB4MUM1RSwgMHg5QTY5LCAweDFDNjAsIDB4OUE2QSwgMHgxQzYyLCAweDlBNkIsCisgICAgMHgxQzYxLCAweDlBQTgsIDB4MDgwRSwgMHg5QUFELCAweDFDNjMsIDB4OUFCMCwgMHgxQzY0LCAweDlBQjUsIDB4M0JEOSwKKyAgICAweDlBQjYsIDB4M0JEQSwgMHg5QUI4LCAweDA1OUEsIDB4OUFCQywgMHgxQzY1LCAweDlBQzAsIDB4MUM2NiwgMHg5QUM0LAorICAgIDB4MEEzNywgMHg5QUNGLCAweDFDNjcsIDB4OUFEMSwgMHgxQzY4LCAweDlBRDMsIDB4MUM2OSwgMHg5QUQ0LCAweDFDNkEsCisgICAgMHg5QUQ4LCAweDA3RjQsIDB4OUFEOSwgMHgyMjAxLCAweDlBREMsIDB4MjIwMiwgMHg5QURFLCAweDFDNkIsIDB4OUFERiwKKyAgICAweDFDNkMsIDB4OUFFMiwgMHgxQzZELCAweDlBRTMsIDB4MUM2RSwgMHg5QUU2LCAweDFDNkYsIDB4OUFFQSwgMHgwRDQ1LAorICAgIDB4OUFFQiwgMHgxQzcxLCAweDlBRUQsIDB4MEQ5OCwgMHg5QUVFLCAweDFDNzIsIDB4OUFFRiwgMHgxQzcwLCAweDlBRjEsCisgICAgMHgxQzc0LCAweDlBRjQsIDB4MUM3MywgMHg5QUY3LCAweDFDNzUsIDB4OUFGOSwgMHgzQkRCLCAweDlBRkIsIDB4MUM3NiwKKyAgICAweDlCMDMsIDB4M0JEQywgMHg5QjA2LCAweDFDNzcsIDB4OUIxOCwgMHgxQzc4LCAweDlCMUEsIDB4MUM3OSwgMHg5QjFGLAorICAgIDB4MUM3QSwgMHg5QjIwLCAweDNCREQsIDB4OUIyMiwgMHgxQzdCLCAweDlCMjMsIDB4MUM3QywgMHg5QjI1LCAweDFDN0QsCisgICAgMHg5QjI3LCAweDFDN0UsIDB4OUIyOCwgMHgxQzdGLCAweDlCMjksIDB4MUM4MCwgMHg5QjJBLCAweDFDODEsIDB4OUIyRCwKKyAgICAweDM0M0MsIDB4OUIyRSwgMHgxQzgyLCAweDlCMkYsIDB4MUM4MywgMHg5QjMxLCAweDE0RDQsIDB4OUIzMiwgMHgxQzg0LAorICAgIDB4OUIzMywgMHgzQkRFLCAweDlCMzQsIDB4M0JERiwgMHg5QjNCLCAweDE3QTksIDB4OUIzQywgMHgwNjRFLCAweDlCNDEsCisgICAgMHgwNTdGLCAweDlCNDIsIDB4MDgyMiwgMHg5QjQzLCAweDFDODYsIDB4OUI0NCwgMHgxQzg1LCAweDlCNDUsIDB4MEVCMSwKKyAgICAweDlCNEQsIDB4MUM4OCwgMHg5QjRFLCAweDFDODksIDB4OUI0RiwgMHgxQzg3LCAweDlCNTEsIDB4MUM4QSwgMHg5QjU0LAorICAgIDB4MEU5MCwgMHg5QjU4LCAweDFDOEIsIDB4OUI1QSwgMHgwNjk1LCAweDlCNkYsIDB4MEZDQiwgMHg5QjcyLCAweDIyMDQsCisgICAgMHg5QjczLCAweDNCRTAsIDB4OUI3NCwgMHgxQzhDLCAweDlCNzUsIDB4MjIwMywgMHg5Qjc5LCAweDNCRTEsIDB4OUI4MywKKyAgICAweDFDOEUsIDB4OUI4RSwgMHgwNDgyLCAweDlCOEYsIDB4MjIwNSwgMHg5QjkxLCAweDFDOEYsIDB4OUI5MiwgMHgwREZCLAorICAgIDB4OUI5MywgMHgxQzhELCAweDlCOTYsIDB4MUM5MCwgMHg5Qjk3LCAweDFDOTEsIDB4OUI5RiwgMHgxQzkyLCAweDlCQTAsCisgICAgMHgxQzkzLCAweDlCQTcsIDB4M0JFMiwgMHg5QkE4LCAweDFDOTQsIDB4OUJBQSwgMHgwRTlDLCAweDlCQUIsIDB4MDg3QiwKKyAgICAweDlCQUQsIDB4MDg2QSwgMHg5QkFFLCAweDBBQjEsIDB4OUJCMSwgMHgyMjA2LCAweDlCQjQsIDB4MUM5NSwgMHg5QkI5LAorICAgIDB4MUM5OCwgMHg5QkJCLCAweDIyMDcsIDB4OUJDMCwgMHgxQzk2LCAweDlCQzEsIDB4M0JFMywgMHg5QkM2LCAweDFDOTksCisgICAgMHg5QkM3LCAweDNCRTQsIDB4OUJDOSwgMHgwN0E1LCAweDlCQ0EsIDB4MUM5NywgMHg5QkNGLCAweDFDOUEsIDB4OUJEMSwKKyAgICAweDFDOUIsIDB4OUJEMiwgMHgxQzlDLCAweDlCRDQsIDB4MUNBMCwgMHg5QkQ2LCAweDA4NzgsIDB4OUJENywgMHgzQkU1LAorICAgIDB4OUJEQiwgMHgwQjQ0LCAweDlCREYsIDB4MzdCRiwgMHg5QkUxLCAweDFDQTEsIDB4OUJFMiwgMHgxQzlFLCAweDlCRTMsCisgICAgMHgxQzlELCAweDlCRTQsIDB4MUM5RiwgMHg5QkU3LCAweDNCRTYsIDB4OUJFOCwgMHgwNzM1LCAweDlCRUIsIDB4M0JFNywKKyAgICAweDlCRjAsIDB4MUNBNSwgMHg5QkYxLCAweDFDQTQsIDB4OUJGMiwgMHgxQ0EzLCAweDlCRjUsIDB4MDQ3NywgMHg5QkY3LAorICAgIDB4M0JFOCwgMHg5QkZBLCAweDNCRTksIDB4OUJGRCwgMHgzQkVBLCAweDlDMDAsIDB4MjIwOCwgMHg5QzA0LCAweDFDQUYsCisgICAgMHg5QzA2LCAweDFDQUIsIDB4OUMwOCwgMHgxQ0FDLCAweDlDMDksIDB4MUNBOCwgMHg5QzBBLCAweDFDQUUsIDB4OUMwQiwKKyAgICAweDNCRUIsIDB4OUMwQywgMHgxQ0FBLCAweDlDMEQsIDB4MDVDMCwgMHg5QzEwLCAweDBGRjIsIDB4OUMxMiwgMHgxQ0FELAorICAgIDB4OUMxMywgMHgxQ0E5LCAweDlDMTQsIDB4MUNBNywgMHg5QzE1LCAweDFDQTYsIDB4OUMxQiwgMHgxQ0IxLCAweDlDMjEsCisgICAgMHgxQ0I0LCAweDlDMjQsIDB4MUNCMywgMHg5QzI1LCAweDFDQjIsIDB4OUMyNywgMHgzQkVDLCAweDlDMkEsIDB4M0JFRCwKKyAgICAweDlDMkQsIDB4MERCQiwgMHg5QzJFLCAweDFDQjAsIDB4OUMyRiwgMHgwNEI3LCAweDlDMzAsIDB4MUNCNSwgMHg5QzMyLAorICAgIDB4MUNCNywgMHg5QzM2LCAweDNCRUUsIDB4OUMzOSwgMHgwNUNELCAweDlDM0EsIDB4MUNBMiwgMHg5QzNCLCAweDA0RDksCisgICAgMHg5QzNFLCAweDFDQjksIDB4OUM0MSwgMHgzQkVGLCAweDlDNDYsIDB4MUNCOCwgMHg5QzQ3LCAweDFDQjYsIDB4OUM0OCwKKyAgICAweDBCNkIsIDB4OUM1MiwgMHgwRTlFLCAweDlDNTMsIDB4M0JGMCwgMHg5QzU3LCAweDBGQTIsIDB4OUM1QSwgMHgxQ0JBLAorICAgIDB4OUM2MCwgMHgxQ0JCLCAweDlDNjMsIDB4M0JGMSwgMHg5QzY3LCAweDFDQkMsIDB4OUM2QSwgMHgzQkYyLCAweDlDNzYsCisgICAgMHgxQ0JELCAweDlDNzcsIDB4M0JGMywgMHg5Qzc4LCAweDFDQkUsIDB4OUNFNSwgMHgwQkQ3LCAweDlDRTcsIDB4MUNCRiwKKyAgICAweDlDRTksIDB4MEQ0QiwgMHg5Q0VCLCAweDFDQzQsIDB4OUNFQywgMHgxQ0MwLCAweDlDRjAsIDB4MUNDMSwgMHg5Q0YzLAorICAgIDB4MEU1RiwgMHg5Q0Y0LCAweDBFRDAsIDB4OUNGNiwgMHgwQ0E4LCAweDlEMDIsIDB4M0JGNCwgMHg5RDAzLCAweDFDQzUsCisgICAgMHg5RDA2LCAweDFDQzYsIDB4OUQwNywgMHgwQzk2LCAweDlEMDgsIDB4MUNDMywgMHg5RDA5LCAweDFDQzIsIDB4OUQwRSwKKyAgICAweDA1MkEsIDB4OUQxMiwgMHgxQ0NFLCAweDlEMTUsIDB4MUNDRCwgMHg5RDFCLCAweDA1MTcsIDB4OUQxRiwgMHgxQ0NCLAorICAgIDB4OUQyMywgMHgxQ0NBLCAweDlEMjYsIDB4MUNDOCwgMHg5RDI4LCAweDA1RDksIDB4OUQyQSwgMHgxQ0M3LCAweDlEMkIsCisgICAgMHgwOERFLCAweDlEMkMsIDB4MDUyOSwgMHg5RDNCLCAweDA3RjUsIDB4OUQzRSwgMHgxQ0QxLCAweDlEM0YsIDB4MUNEMCwKKyAgICAweDlENDEsIDB4MUNDRiwgMHg5RDQyLCAweDNCRjUsIDB4OUQ0NCwgMHgxQ0NDLCAweDlENDYsIDB4MUNEMiwgMHg5RDQ3LAorICAgIDB4M0JGNiwgMHg5RDQ4LCAweDFDRDMsIDB4OUQ1MCwgMHgxQ0Q4LCAweDlENTEsIDB4MUNENywgMHg5RDU5LCAweDFDRDksCisgICAgMHg5RDVDLCAweDA0Q0YsIDB4OUQ1RCwgMHgxQ0Q0LCAweDlENUUsIDB4MUNENSwgMHg5RDYwLCAweDA4MDYsIDB4OUQ2MSwKKyAgICAweDBFQzUsIDB4OUQ2MywgMHgzQkY3LCAweDlENjQsIDB4MUNENiwgMHg5RDY5LCAweDNCRjgsIDB4OUQ2QiwgMHgyMjBBLAorICAgIDB4OUQ2QywgMHgwRTYwLCAweDlENkYsIDB4MUNERSwgMHg5RDcwLCAweDIyMDksIDB4OUQ3MiwgMHgxQ0RBLCAweDlEN0EsCisgICAgMHgxQ0RGLCAweDlEN0MsIDB4M0JGOSwgMHg5RDdFLCAweDNCRkEsIDB4OUQ4NywgMHgxQ0RDLCAweDlEODksIDB4MUNEQiwKKyAgICAweDlEOEQsIDB4M0JGQiwgMHg5RDhGLCAweDA3MzIsIDB4OUQ5QSwgMHgxQ0UwLCAweDlEQTQsIDB4MUNFMSwgMHg5REE5LAorICAgIDB4MUNFMiwgMHg5REFCLCAweDFDREQsIDB4OURBRiwgMHgxQ0M5LCAweDlEQjEsIDB4M0JGQywgMHg5REIyLCAweDFDRTMsCisgICAgMHg5REI0LCAweDBCRkQsIDB4OURCOCwgMHgxQ0U3LCAweDlEQkEsIDB4MUNFOCwgMHg5REJCLCAweDFDRTYsIDB4OURDMSwKKyAgICAweDFDRTUsIDB4OURDMiwgMHgxQ0VCLCAweDlEQzMsIDB4M0JGRCwgMHg5REM0LCAweDFDRTQsIDB4OURDNiwgMHgxQ0U5LAorICAgIDB4OURDNywgMHgzQkZFLCAweDlEQ0YsIDB4MUNFQSwgMHg5REQzLCAweDFDRUQsIDB4OURENiwgMHgzQkZGLCAweDlERDcsCisgICAgMHgxRERFLCAweDlERDksIDB4MUNFQywgMHg5RERGLCAweDNDMDAsIDB4OURFNiwgMHgxQ0VGLCAweDlERUIsIDB4M0MwMSwKKyAgICAweDlERUQsIDB4MUNGMCwgMHg5REVGLCAweDFDRjEsIDB4OURGMiwgMHgwRkVGLCAweDlERjQsIDB4M0MwMiwgMHg5REY4LAorICAgIDB4MUNFRSwgMHg5REY5LCAweDBCNEIsIDB4OURGQSwgMHgwODVELCAweDlERkQsIDB4MUNGMiwgMHg5RTE1LCAweDNDMDMsCisgICAgMHg5RTE5LCAweDIyMEMsIDB4OUUxQSwgMHgxQ0YzLCAweDlFMUIsIDB4MUNGNCwgMHg5RTFELCAweDNDMDQsIDB4OUUxRSwKKyAgICAweDFDRjUsIDB4OUU3NSwgMHgxQ0Y2LCAweDlFNzgsIDB4MDc2OCwgMHg5RTc5LCAweDFDRjcsIDB4OUU3QywgMHgxREZELAorICAgIDB4OUU3RCwgMHgxQ0Y4LCAweDlFN0YsIDB4MDhEQiwgMHg5RTgxLCAweDFDRjksIDB4OUU4OCwgMHgxQ0ZBLCAweDlFOEIsCisgICAgMHgxQ0ZCLCAweDlFOEMsIDB4MUNGQywgMHg5RTkxLCAweDFDRkYsIDB4OUU5MiwgMHgxQ0ZELCAweDlFOTMsIDB4MEZFMiwKKyAgICAweDlFOTUsIDB4MUNGRSwgMHg5RTk3LCAweDBGQjcsIDB4OUU5RCwgMHgxRDAwLCAweDlFOUYsIDB4MEZBMywgMHg5RUE0LAorICAgIDB4M0MwNSwgMHg5RUE1LCAweDFEMDEsIDB4OUVBNiwgMHgwRDM0LCAweDlFQTgsIDB4M0MwNiwgMHg5RUE5LCAweDFEMDIsCisgICAgMHg5RUFBLCAweDFEMDQsIDB4OUVBQywgMHgzQzA3LCAweDlFQUQsIDB4MUQwNSwgMHg5RUI0LCAweDFFMDIsIDB4OUVCNSwKKyAgICAweDFFNzUsIDB4OUVCOCwgMHgxRDAzLCAweDlFQjksIDB4MDdGRiwgMHg5RUJBLCAweDBFRDksIDB4OUVCQiwgMHgwRTkxLAorICAgIDB4OUVCQywgMHgxMjg0LCAweDlFQkUsIDB4MTRGRiwgMHg5RUJGLCAweDBFQTksIDB4OUVDMywgMHgzNDBCLCAweDlFQzQsCisgICAgMHgwNTJCLCAweDlFQ0MsIDB4MUQwNywgMHg5RUNELCAweDA2NkEsIDB4OUVDRSwgMHgxRDA4LCAweDlFQ0YsIDB4MUQwOSwKKyAgICAweDlFRDAsIDB4MUQwQSwgMHg5RUQxLCAweDIyMEQsIDB4OUVEMiwgMHgwODA3LCAweDlFRDQsIDB4MUQwQiwgMHg5RUQ4LAorICAgIDB4MTYwRCwgMHg5RUQ5LCAweDBFRTcsIDB4OUVEQiwgMHgwQjQzLCAweDlFREMsIDB4MUQwQywgMHg5RURELCAweDFEMEUsCisgICAgMHg5RURFLCAweDFEMEQsIDB4OUVFMCwgMHgxRDBGLCAweDlFRTUsIDB4MUQxMCwgMHg5RUU3LCAweDNDMDgsIDB4OUVFOCwKKyAgICAweDFEMTEsIDB4OUVFRSwgMHgzQzA5LCAweDlFRUYsIDB4MUQxMiwgMHg5RUY0LCAweDFEMTMsIDB4OUVGNiwgMHgxRDE0LAorICAgIDB4OUVGNywgMHgxRDE1LCAweDlFRjksIDB4MUQxNiwgMHg5RUZCLCAweDFEMTcsIDB4OUVGQywgMHgxRDE4LCAweDlFRkQsCisgICAgMHgxRDE5LCAweDlGMDcsIDB4MUQxQSwgMHg5RjA4LCAweDFEMUIsIDB4OUYwRSwgMHgwQzFFLCAweDlGMTAsIDB4M0MwQSwKKyAgICAweDlGMTIsIDB4M0MwQiwgMHg5RjEzLCAweDA3OTEsIDB4OUYxNSwgMHgxRDFELCAweDlGMTcsIDB4M0MwQywgMHg5RjE5LAorICAgIDB4M0MwRCwgMHg5RjIwLCAweDBBQ0YsIDB4OUYyMSwgMHgxRDFFLCAweDlGMkMsIDB4MUQxRiwgMHg5RjJGLCAweDNDMEUsCisgICAgMHg5RjM3LCAweDNDMEYsIDB4OUYzOSwgMHgzQzEwLCAweDlGM0IsIDB4MEQ5MywgMHg5RjNFLCAweDFEMjAsIDB4OUY0MSwKKyAgICAweDNDMTEsIDB4OUY0NSwgMHgzQzEyLCAweDlGNEEsIDB4MUQyMSwgMHg5RjRCLCAweDE3MEEsIDB4OUY0RSwgMHgxQTdCLAorICAgIDB4OUY0RiwgMHgxQzA2LCAweDlGNTIsIDB4MUQyMiwgMHg5RjU0LCAweDFEMjMsIDB4OUY1NywgMHgzQzEzLCAweDlGNUYsCisgICAgMHgxRDI1LCAweDlGNjAsIDB4MUQyNiwgMHg5RjYxLCAweDFEMjcsIDB4OUY2MiwgMHgwRkI4LCAweDlGNjMsIDB4MUQyNCwKKyAgICAweDlGNjYsIDB4MUQyOCwgMHg5RjY3LCAweDFEMjksIDB4OUY2OCwgMHgzQzE0LCAweDlGNkEsIDB4MUQyQiwgMHg5RjZDLAorICAgIDB4MUQyQSwgMHg5RjcxLCAweDNDMTUsIDB4OUY3MiwgMHgxRDJELCAweDlGNzUsIDB4M0MxNiwgMHg5Rjc2LCAweDFEMkUsCisgICAgMHg5Rjc3LCAweDFEMkMsIDB4OUY4RCwgMHgwRjdFLCAweDlGOTAsIDB4M0MxNywgMHg5Rjk0LCAweDNDMTgsIDB4OUY5NSwKKyAgICAweDFEMkYsIDB4OUY5QywgMHgxRDMwLCAweDlGOUQsIDB4MTcyNywgMHg5RkEwLCAweDFEMzEsIDB4OUZBMiwgMHgzQzE5LAorICAgIDB4RjkyOSwgMHgyMTI5LCAweEY5REMsIDB4MjFFRSwgMHhGQTBFLCAweDIwREEsIDB4RkEwRiwgMHgyMEU1LCAweEZBMTAsCisgICAgMHgyMEU2LCAweEZBMTEsIDB4MjBGQiwgMHhGQTEyLCAweDIxMjEsIDB4RkExMywgMHgyMTMxLCAweEZBMTQsIDB4MjEzMywKKyAgICAweEZBMTUsIDB4MjE1RSwgMHhGQTE2LCAweDIxNjQsIDB4RkExNywgMHgyMTdCLCAweEZBMTgsIDB4MjE4MywgMHhGQTE5LAorICAgIDB4MjE4NCwgMHhGQTFBLCAweDIxODUsIDB4RkExQiwgMHgyMTg3LCAweEZBMUMsIDB4MjE4QiwgMHhGQTFELCAweDIxOEUsCisgICAgMHhGQTFFLCAweDIxOTcsIDB4RkExRiwgMHgyMUEyLCAweEZBMjAsIDB4MjFBNCwgMHhGQTIxLCAweDIxQTUsIDB4RkEyMiwKKyAgICAweDIxQUUsIDB4RkEyMywgMHgyMUI2LCAweEZBMjQsIDB4MjFCOCwgMHhGQTI1LCAweDIxQjksIDB4RkEyNiwgMHgyMUJDLAorICAgIDB4RkEyNywgMHgyMUQ4LCAweEZBMjgsIDB4MjFERiwgMHhGQTI5LCAweDIxRUYsIDB4RkEyQSwgMHgyMUZCLCAweEZBMkIsCisgICAgMHgyMUZDLCAweEZBMkMsIDB4MjFGRSwgMHhGQTJELCAweDIyMEIsIDB4RkIwMCwgMHgyNDhFLCAweEZCMDEsIDB4MDA3MCwKKyAgICAweEZCMDIsIDB4MDA3MSwgMHhGQjAzLCAweDI0OEYsIDB4RkIwNCwgMHgyNDkwLCAweEZFMzAsIDB4MUVEQSwgMHhGRTMxLAorICAgIDB4MUVENCwgMHhGRTMyLCAweDFFRDUsIDB4RkUzMywgMHgxRUQyLCAweEZFMzUsIDB4MUVEQiwgMHhGRTM2LCAweDFFREMsCisgICAgMHhGRTM3LCAweDFFRTEsIDB4RkUzOCwgMHgxRUUyLCAweEZFMzksIDB4MUVERCwgMHhGRTNBLCAweDFFREUsIDB4RkUzQiwKKyAgICAweDFFRUIsIDB4RkUzQywgMHgxRUVDLCAweEZFM0QsIDB4MUVFNSwgMHhGRTNFLCAweDFFRTYsIDB4RkUzRiwgMHgxRUUzLAorICAgIDB4RkU0MCwgMHgxRUU0LCAweEZFNDEsIDB4MUVFNywgMHhGRTQyLCAweDFFRTgsIDB4RkU0MywgMHgxRUU5LCAweEZFNDQsCisgICAgMHgxRUVBLCAweEZGMDEsIDB4MDI4MiwgMHhGRjAyLCAweDFGNDcsIDB4RkYwMywgMHgwMkNDLCAweEZGMDQsIDB4MDJDOCwKKyAgICAweEZGMDUsIDB4MDJDQiwgMHhGRjA2LCAweDAyQ0QsIDB4RkYwNywgMHgxRjQ2LCAweEZGMDgsIDB4MDJBMiwgMHhGRjA5LAorICAgIDB4MDJBMywgMHhGRjBBLCAweDAyQ0UsIDB4RkYwQiwgMHgwMkI0LCAweEZGMEMsIDB4MDI3QywgMHhGRjBELCAweDAyQjUsCisgICAgMHhGRjBFLCAweDAyN0QsIDB4RkYwRiwgMHgwMjk3LCAweEZGMTAsIDB4MDMwQywgMHhGRjExLCAweDAzMEQsIDB4RkYxMiwKKyAgICAweDAzMEUsIDB4RkYxMywgMHgwMzBGLCAweEZGMTQsIDB4MDMxMCwgMHhGRjE1LCAweDAzMTEsIDB4RkYxNiwgMHgwMzEyLAorICAgIDB4RkYxNywgMHgwMzEzLCAweEZGMTgsIDB4MDMxNCwgMHhGRjE5LCAweDAzMTUsIDB4RkYxQSwgMHgwMjdGLCAweEZGMUIsCisgICAgMHgwMjgwLCAweEZGMUMsIDB4MDJCQiwgMHhGRjFELCAweDAyQjksIDB4RkYxRSwgMHgwMkJDLCAweEZGMUYsIDB4MDI4MSwKKyAgICAweEZGMjAsIDB4MDJDRiwgMHhGRjIxLCAweDAzMTYsIDB4RkYyMiwgMHgwMzE3LCAweEZGMjMsIDB4MDMxOCwgMHhGRjI0LAorICAgIDB4MDMxOSwgMHhGRjI1LCAweDAzMUEsIDB4RkYyNiwgMHgwMzFCLCAweEZGMjcsIDB4MDMxQywgMHhGRjI4LCAweDAzMUQsCisgICAgMHhGRjI5LCAweDAzMUUsIDB4RkYyQSwgMHgwMzFGLCAweEZGMkIsIDB4MDMyMCwgMHhGRjJDLCAweDAzMjEsIDB4RkYyRCwKKyAgICAweDAzMjIsIDB4RkYyRSwgMHgwMzIzLCAweEZGMkYsIDB4MDMyNCwgMHhGRjMwLCAweDAzMjUsIDB4RkYzMSwgMHgwMzI2LAorICAgIDB4RkYzMiwgMHgwMzI3LCAweEZGMzMsIDB4MDMyOCwgMHhGRjM0LCAweDAzMjksIDB4RkYzNSwgMHgwMzJBLCAweEZGMzYsCisgICAgMHgwMzJCLCAweEZGMzcsIDB4MDMyQywgMHhGRjM4LCAweDAzMkQsIDB4RkYzOSwgMHgwMzJFLCAweEZGM0EsIDB4MDMyRiwKKyAgICAweEZGM0IsIDB4MDJBNiwgMHhGRjNDLCAweDAyOTgsIDB4RkYzRCwgMHgwMkE3LCAweEZGM0UsIDB4MDI4OCwgMHhGRjNGLAorICAgIDB4MDI4QSwgMHhGRjQwLCAweDAyODYsIDB4RkY0MSwgMHgwMzMwLCAweEZGNDIsIDB4MDMzMSwgMHhGRjQzLCAweDAzMzIsCisgICAgMHhGRjQ0LCAweDAzMzMsIDB4RkY0NSwgMHgwMzM0LCAweEZGNDYsIDB4MDMzNSwgMHhGRjQ3LCAweDAzMzYsIDB4RkY0OCwKKyAgICAweDAzMzcsIDB4RkY0OSwgMHgwMzM4LCAweEZGNEEsIDB4MDMzOSwgMHhGRjRCLCAweDAzM0EsIDB4RkY0QywgMHgwMzNCLAorICAgIDB4RkY0RCwgMHgwMzNDLCAweEZGNEUsIDB4MDMzRCwgMHhGRjRGLCAweDAzM0UsIDB4RkY1MCwgMHgwMzNGLCAweEZGNTEsCisgICAgMHgwMzQwLCAweEZGNTIsIDB4MDM0MSwgMHhGRjUzLCAweDAzNDIsIDB4RkY1NCwgMHgwMzQzLCAweEZGNTUsIDB4MDM0NCwKKyAgICAweEZGNTYsIDB4MDM0NSwgMHhGRjU3LCAweDAzNDYsIDB4RkY1OCwgMHgwMzQ3LCAweEZGNTksIDB4MDM0OCwgMHhGRjVBLAorICAgIDB4MDM0OSwgMHhGRjVCLCAweDAyQTgsIDB4RkY1QywgMHgwMjlCLCAweEZGNUQsIDB4MDJBOSwgMHhGRjVFLCAweDAyOTksCisgICAgMHhGRjYxLCAweDAxNDcsIDB4RkY2MiwgMHgwMTQ4LCAweEZGNjMsIDB4MDE0OSwgMHhGRjY0LCAweDAxNEEsIDB4RkY2NSwKKyAgICAweDAxNEIsIDB4RkY2NiwgMHgwMTRDLCAweEZGNjcsIDB4MDE0RCwgMHhGRjY4LCAweDAxNEUsIDB4RkY2OSwgMHgwMTRGLAorICAgIDB4RkY2QSwgMHgwMTUwLCAweEZGNkIsIDB4MDE1MSwgMHhGRjZDLCAweDAxNTIsIDB4RkY2RCwgMHgwMTUzLCAweEZGNkUsCisgICAgMHgwMTU0LCAweEZGNkYsIDB4MDE1NSwgMHhGRjcwLCAweDAxNTYsIDB4RkY3MSwgMHgwMTU3LCAweEZGNzIsIDB4MDE1OCwKKyAgICAweEZGNzMsIDB4MDE1OSwgMHhGRjc0LCAweDAxNUEsIDB4RkY3NSwgMHgwMTVCLCAweEZGNzYsIDB4MDE1QywgMHhGRjc3LAorICAgIDB4MDE1RCwgMHhGRjc4LCAweDAxNUUsIDB4RkY3OSwgMHgwMTVGLCAweEZGN0EsIDB4MDE2MCwgMHhGRjdCLCAweDAxNjEsCisgICAgMHhGRjdDLCAweDAxNjIsIDB4RkY3RCwgMHgwMTYzLCAweEZGN0UsIDB4MDE2NCwgMHhGRjdGLCAweDAxNjUsIDB4RkY4MCwKKyAgICAweDAxNjYsIDB4RkY4MSwgMHgwMTY3LCAweEZGODIsIDB4MDE2OCwgMHhGRjgzLCAweDAxNjksIDB4RkY4NCwgMHgwMTZBLAorICAgIDB4RkY4NSwgMHgwMTZCLCAweEZGODYsIDB4MDE2QywgMHhGRjg3LCAweDAxNkQsIDB4RkY4OCwgMHgwMTZFLCAweEZGODksCisgICAgMHgwMTZGLCAweEZGOEEsIDB4MDE3MCwgMHhGRjhCLCAweDAxNzEsIDB4RkY4QywgMHgwMTcyLCAweEZGOEQsIDB4MDE3MywKKyAgICAweEZGOEUsIDB4MDE3NCwgMHhGRjhGLCAweDAxNzUsIDB4RkY5MCwgMHgwMTc2LCAweEZGOTEsIDB4MDE3NywgMHhGRjkyLAorICAgIDB4MDE3OCwgMHhGRjkzLCAweDAxNzksIDB4RkY5NCwgMHgwMTdBLCAweEZGOTUsIDB4MDE3QiwgMHhGRjk2LCAweDAxN0MsCisgICAgMHhGRjk3LCAweDAxN0QsIDB4RkY5OCwgMHgwMTdFLCAweEZGOTksIDB4MDE3RiwgMHhGRjlBLCAweDAxODAsIDB4RkY5QiwKKyAgICAweDAxODEsIDB4RkY5QywgMHgwMTgyLCAweEZGOUQsIDB4MDE4MywgMHhGRjlFLCAweDAxODQsIDB4RkY5RiwgMHgwMTg1LAorICAgIDB4RkZFMCwgMHgwMkM5LCAweEZGRTEsIDB4MDJDQSwgMHhGRkUyLCAweDAyRUYsIDB4RkZFMywgMHgwMjg5LCAweEZGRTQsCisgICAgMHgxRjQ1LCAweEZGRTUsIDB4MDJDNywgMHhGRkU4LCAweDAxNDMsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1WXzQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1WXzQuY3BwCmluZGV4IDQ5MmQyYmMuLjE5MDY2ZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItVl80LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLVZfNC5jcHAKQEAgLTcsNjcgKzcsNjAgQEAKICNpbmNsdWRlICJjbWFwc19qYXBhbjEuaCIKIAogY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9WXzRbMjUxICogMl0gPSB7Ci0gICAgMHgwMEIwLCAweDIwNEQsIDB4MjAxMCwgMHgxRUQ1LCAweDIwMTUsIDB4MUVENCwgMHgyMDE2LCAweDFFRDcsCi0gICAgMHgyMDE4LCAweDIwNTksIDB4MjAxOSwgMHgyMDVBLCAweDIwMUMsIDB4MjA1NywgMHgyMDFELCAweDIwNTgsCi0gICAgMHgyMDI1LCAweDFFREEsIDB4MjAyNiwgMHgxRUQ5LCAweDIwMzIsIDB4MjA1MSwgMHgyMDMzLCAweDIwNUIsCi0gICAgMHgyMTkwLCAweDAyRTIsIDB4MjE5MSwgMHgwMkUwLCAweDIxOTIsIDB4MDJFMywgMHgyMTkzLCAweDAyRTEsCi0gICAgMHgyMTk1LCAweDJGQjYsIDB4MjFDNCwgMHgyMDc3LCAweDIxQzUsIDB4MjA3NiwgMHgyMUM2LCAweDIwNzgsCi0gICAgMHgyMUU2LCAweDFGNEMsIDB4MjFFNywgMHgxRjRFLCAweDIxRTgsIDB4MUY0QiwgMHgyMUU5LCAweDFGNEQsCi0gICAgMHgyMjI1LCAweDFFRDcsIDB4MjIzQywgMHgxRUQ2LCAweDIyRUYsIDB4MUVEOSwgMHgyNTAwLCAweDFEMzksCi0gICAgMHgyNTAxLCAweDFEM0EsIDB4MjUwMiwgMHgxRDM3LCAweDI1MDMsIDB4MUQzOCwgMHgyNTA0LCAweDFEM0QsCi0gICAgMHgyNTA1LCAweDFEM0UsIDB4MjUwNiwgMHgxRDNCLCAweDI1MDcsIDB4MUQzQywgMHgyNTA4LCAweDFENDEsCi0gICAgMHgyNTA5LCAweDFENDIsIDB4MjUwQSwgMHgxRDNGLCAweDI1MEIsIDB4MUQ0MCwgMHgyNTBDLCAweDFENDcsCi0gICAgMHgyNTBELCAweDFENDksIDB4MjUwRSwgMHgxRDQ4LCAweDI1MEYsIDB4MUQ0QSwgMHgyNTEwLCAweDFENEYsCi0gICAgMHgyNTExLCAweDFENTEsIDB4MjUxMiwgMHgxRDUwLCAweDI1MTMsIDB4MUQ1MiwgMHgyNTE0LCAweDFENDMsCi0gICAgMHgyNTE1LCAweDFENDUsIDB4MjUxNiwgMHgxRDQ0LCAweDI1MTcsIDB4MUQ0NiwgMHgyNTE4LCAweDFENEIsCi0gICAgMHgyNTE5LCAweDFENEQsIDB4MjUxQSwgMHgxRDRDLCAweDI1MUIsIDB4MUQ0RSwgMHgyNTFDLCAweDFENjMsCi0gICAgMHgyNTFELCAweDFENjcsIDB4MjUxRSwgMHgxRDY1LCAweDI1MUYsIDB4MUQ2NCwgMHgyNTIwLCAweDFENjYsCi0gICAgMHgyNTIxLCAweDFENjksIDB4MjUyMiwgMHgxRDY4LCAweDI1MjMsIDB4MUQ2QSwgMHgyNTI0LCAweDFENkIsCi0gICAgMHgyNTI1LCAweDFENkYsIDB4MjUyNiwgMHgxRDZELCAweDI1MjcsIDB4MUQ2QywgMHgyNTI4LCAweDFENkUsCi0gICAgMHgyNTI5LCAweDFENzEsIDB4MjUyQSwgMHgxRDcwLCAweDI1MkIsIDB4MUQ3MiwgMHgyNTJDLCAweDFENUIsCi0gICAgMHgyNTJELCAweDFENUQsIDB4MjUyRSwgMHgxRDVFLCAweDI1MkYsIDB4MUQ1RiwgMHgyNTMwLCAweDFENUMsCi0gICAgMHgyNTMxLCAweDFENjAsIDB4MjUzMiwgMHgxRDYxLCAweDI1MzMsIDB4MUQ2MiwgMHgyNTM0LCAweDFENTMsCi0gICAgMHgyNTM1LCAweDFENTUsIDB4MjUzNiwgMHgxRDU2LCAweDI1MzcsIDB4MUQ1NywgMHgyNTM4LCAweDFENTQsCi0gICAgMHgyNTM5LCAweDFENTgsIDB4MjUzQSwgMHgxRDU5LCAweDI1M0IsIDB4MUQ1QSwgMHgyNTNELCAweDFENzcsCi0gICAgMHgyNTNFLCAweDFENzgsIDB4MjUzRiwgMHgxRDc5LCAweDI1NDAsIDB4MUQ3NSwgMHgyNTQxLCAweDFENzQsCi0gICAgMHgyNTQyLCAweDFENzYsIDB4MjU0MywgMHgxRDdCLCAweDI1NDQsIDB4MUQ3RCwgMHgyNTQ1LCAweDFEN0EsCi0gICAgMHgyNTQ2LCAweDFEN0MsIDB4MjU0NywgMHgxRDgxLCAweDI1NDgsIDB4MUQ4MCwgMHgyNTQ5LCAweDFEN0UsCi0gICAgMHgyNTRBLCAweDFEN0YsIDB4MjYxQywgMHgyMDFELCAweDI2MUQsIDB4MjAxQiwgMHgyNjFFLCAweDIwMUUsCi0gICAgMHgyNjFGLCAweDIwMUMsIDB4MjcwMiwgMHgyRjkyLCAweDI3QTEsIDB4MjAxMSwgMHgzMDAxLCAweDFFQ0YsCi0gICAgMHgzMDAyLCAweDFFRDAsIDB4MzAwOCwgMHgxRUUzLCAweDMwMDksIDB4MUVFNCwgMHgzMDBBLCAweDFFRTUsCi0gICAgMHgzMDBCLCAweDFFRTYsIDB4MzAwQywgMHgxRUU3LCAweDMwMEQsIDB4MUVFOCwgMHgzMDBFLCAweDFFRTksCi0gICAgMHgzMDBGLCAweDFFRUEsIDB4MzAxMCwgMHgxRUVCLCAweDMwMTEsIDB4MUVFQywgMHgzMDEzLCAweDIwNEUsCi0gICAgMHgzMDE0LCAweDFFREQsIDB4MzAxNSwgMHgxRURFLCAweDMwMUMsIDB4MUVENiwgMHgzMDFELCAweDFGMTQsCi0gICAgMHgzMDFGLCAweDFGMTUsIDB4MzA0MSwgMHgxRUVFLCAweDMwNDMsIDB4MUVFRiwgMHgzMDQ1LCAweDFFRjAsCi0gICAgMHgzMDQ3LCAweDFFRjEsIDB4MzA0OSwgMHgxRUYyLCAweDMwNjMsIDB4MUVGMywgMHgzMDgzLCAweDFFRjQsCi0gICAgMHgzMDg1LCAweDFFRjUsIDB4MzA4NywgMHgxRUY2LCAweDMwOEUsIDB4MUVGNywgMHgzMDlCLCAweDIwNTAsCi0gICAgMHgzMDlDLCAweDIwNEYsIDB4MzBBMSwgMHgxRUY4LCAweDMwQTMsIDB4MUVGOSwgMHgzMEE1LCAweDFFRkEsCi0gICAgMHgzMEE3LCAweDFFRkIsIDB4MzBBOSwgMHgxRUZDLCAweDMwQzMsIDB4MUVGRCwgMHgzMEUzLCAweDFFRkUsCi0gICAgMHgzMEU1LCAweDFFRkYsIDB4MzBFNywgMHgxRjAwLCAweDMwRUUsIDB4MUYwMSwgMHgzMEY1LCAweDFGMDIsCi0gICAgMHgzMEY2LCAweDFGMDMsIDB4MzBGQywgMHgxRUQzLCAweDMzMDAsIDB4MjA5RSwgMHgzMzAxLCAweDJFQjYsCi0gICAgMHgzMzAyLCAweDJFQjcsIDB4MzMwMywgMHgyMDkyLCAweDMzMDQsIDB4MkVCOCwgMHgzMzA1LCAweDIwOEQsCi0gICAgMHgzMzA2LCAweDJFQjksIDB4MzMwNywgMHgyRUJELCAweDMzMDgsIDB4MkVCQiwgMHgzMzA5LCAweDJFQzAsCi0gICAgMHgzMzBBLCAweDJFQkUsIDB4MzMwQiwgMHgyRUMyLCAweDMzMEMsIDB4MkVDNCwgMHgzMzBELCAweDFGMEUsCi0gICAgMHgzMzBFLCAweDJFQzUsIDB4MzMwRiwgMHgyRUM2LCAweDMzMTAsIDB4MkVDNywgMHgzMzExLCAweDJFQzgsCi0gICAgMHgzMzEyLCAweDJFQzksIDB4MzMxMywgMHgyRUNBLCAweDMzMTQsIDB4MUYwNSwgMHgzMzE1LCAweDIwOTQsCi0gICAgMHgzMzE2LCAweDIwOEEsIDB4MzMxNywgMHgyRUNDLCAweDMzMTgsIDB4MjA5MywgMHgzMzE5LCAweDJFQ0UsCi0gICAgMHgzMzFBLCAweDJFRDAsIDB4MzMxQiwgMHgyRUQxLCAweDMzMUMsIDB4MkVEMiwgMHgzMzFELCAweDJFRDMsCi0gICAgMHgzMzFFLCAweDIwQTEsIDB4MzMxRiwgMHgyRUQ0LCAweDMzMjAsIDB4MkVENSwgMHgzMzIxLCAweDJFRDYsCi0gICAgMHgzMzIyLCAweDIwODksIDB4MzMyMywgMHgyMDlDLCAweDMzMjQsIDB4MkVENywgMHgzMzI1LCAweDJFRDksCi0gICAgMHgzMzI2LCAweDFGMEYsIDB4MzMyNywgMHgxRjA5LCAweDMzMjgsIDB4MkVEQywgMHgzMzI5LCAweDJFREQsCi0gICAgMHgzMzJBLCAweDIwQTQsIDB4MzMyQiwgMHgxRjExLCAweDMzMkQsIDB4MkVERiwgMHgzMzJFLCAweDJFRTIsCi0gICAgMHgzMzJGLCAweDJFRTMsIDB4MzMzMCwgMHgyRUU0LCAweDMzMzEsIDB4MjBBNiwgMHgzMzMyLCAweDJFRTUsCi0gICAgMHgzMzMzLCAweDIwOEUsIDB4MzMzNCwgMHgyRUU4LCAweDMzMzUsIDB4MkVFOSwgMHgzMzM2LCAweDFGMEIsCi0gICAgMHgzMzM3LCAweDJFRUUsIDB4MzMzOCwgMHgyRUYwLCAweDMzMzksIDB4MjA5NywgMHgzMzNBLCAweDJFRjEsCi0gICAgMHgzMzNCLCAweDIwOUQsIDB4MzMzQywgMHgyRUVBLCAweDMzM0QsIDB4MkVGMiwgMHgzMzNFLCAweDJFRjQsCi0gICAgMHgzMzNGLCAweDJFRjUsIDB4MzM0MCwgMHgyRUY2LCAweDMzNDEsIDB4MkVGMywgMHgzMzQyLCAweDIwOUIsCi0gICAgMHgzMzQzLCAweDJFRjcsIDB4MzM0NCwgMHgyRUY4LCAweDMzNDUsIDB4MkVGOSwgMHgzMzQ2LCAweDJFRkEsCi0gICAgMHgzMzQ3LCAweDIwQTUsIDB4MzM0OCwgMHgyRUZCLCAweDMzNDksIDB4MUYwNCwgMHgzMzRBLCAweDFGMTIsCi0gICAgMHgzMzRCLCAweDJFRkMsIDB4MzM0QywgMHgyRUZELCAweDMzNEQsIDB4MUYwNywgMHgzMzRFLCAweDIwOTEsCi0gICAgMHgzMzRGLCAweDJFRkUsIDB4MzM1MCwgMHgyRUZGLCAweDMzNTEsIDB4MUYwQywgMHgzMzUyLCAweDJGMDIsCi0gICAgMHgzMzUzLCAweDJGMDYsIDB4MzM1NCwgMHgyRjAzLCAweDMzNTUsIDB4MkYwNywgMHgzMzU2LCAweDJGMDgsCi0gICAgMHgzMzU3LCAweDIwOTgsIDB4MzM3RiwgMHgyMDg0LCAweEZGMDgsIDB4MUVEQiwgMHhGRjA5LCAweDFFREMsCi0gICAgMHhGRjBDLCAweDIwNEMsIDB4RkYwRSwgMHgyMDUyLCAweEZGMUQsIDB4MUVFRCwgMHhGRjNCLCAweDFFREYsCi0gICAgMHhGRjNELCAweDFFRTAsIDB4RkYzRiwgMHgxRUQyLCAweEZGNUIsIDB4MUVFMSwgMHhGRjVDLCAweDFFRDgsCi0gICAgMHhGRjVELCAweDFFRTIsIDB4RkY1RSwgMHgxRUQ2LCAweEZGRTMsIDB4MUVEMSwKKyAgICAweDAwQjAsIDB4MjA0RCwgMHgyMDEwLCAweDFFRDUsIDB4MjAxNSwgMHgxRUQ0LCAweDIwMTYsIDB4MUVENywgMHgyMDE4LAorICAgIDB4MjA1OSwgMHgyMDE5LCAweDIwNUEsIDB4MjAxQywgMHgyMDU3LCAweDIwMUQsIDB4MjA1OCwgMHgyMDI1LCAweDFFREEsCisgICAgMHgyMDI2LCAweDFFRDksIDB4MjAzMiwgMHgyMDUxLCAweDIwMzMsIDB4MjA1QiwgMHgyMTkwLCAweDAyRTIsIDB4MjE5MSwKKyAgICAweDAyRTAsIDB4MjE5MiwgMHgwMkUzLCAweDIxOTMsIDB4MDJFMSwgMHgyMTk1LCAweDJGQjYsIDB4MjFDNCwgMHgyMDc3LAorICAgIDB4MjFDNSwgMHgyMDc2LCAweDIxQzYsIDB4MjA3OCwgMHgyMUU2LCAweDFGNEMsIDB4MjFFNywgMHgxRjRFLCAweDIxRTgsCisgICAgMHgxRjRCLCAweDIxRTksIDB4MUY0RCwgMHgyMjI1LCAweDFFRDcsIDB4MjIzQywgMHgxRUQ2LCAweDIyRUYsIDB4MUVEOSwKKyAgICAweDI1MDAsIDB4MUQzOSwgMHgyNTAxLCAweDFEM0EsIDB4MjUwMiwgMHgxRDM3LCAweDI1MDMsIDB4MUQzOCwgMHgyNTA0LAorICAgIDB4MUQzRCwgMHgyNTA1LCAweDFEM0UsIDB4MjUwNiwgMHgxRDNCLCAweDI1MDcsIDB4MUQzQywgMHgyNTA4LCAweDFENDEsCisgICAgMHgyNTA5LCAweDFENDIsIDB4MjUwQSwgMHgxRDNGLCAweDI1MEIsIDB4MUQ0MCwgMHgyNTBDLCAweDFENDcsIDB4MjUwRCwKKyAgICAweDFENDksIDB4MjUwRSwgMHgxRDQ4LCAweDI1MEYsIDB4MUQ0QSwgMHgyNTEwLCAweDFENEYsIDB4MjUxMSwgMHgxRDUxLAorICAgIDB4MjUxMiwgMHgxRDUwLCAweDI1MTMsIDB4MUQ1MiwgMHgyNTE0LCAweDFENDMsIDB4MjUxNSwgMHgxRDQ1LCAweDI1MTYsCisgICAgMHgxRDQ0LCAweDI1MTcsIDB4MUQ0NiwgMHgyNTE4LCAweDFENEIsIDB4MjUxOSwgMHgxRDRELCAweDI1MUEsIDB4MUQ0QywKKyAgICAweDI1MUIsIDB4MUQ0RSwgMHgyNTFDLCAweDFENjMsIDB4MjUxRCwgMHgxRDY3LCAweDI1MUUsIDB4MUQ2NSwgMHgyNTFGLAorICAgIDB4MUQ2NCwgMHgyNTIwLCAweDFENjYsIDB4MjUyMSwgMHgxRDY5LCAweDI1MjIsIDB4MUQ2OCwgMHgyNTIzLCAweDFENkEsCisgICAgMHgyNTI0LCAweDFENkIsIDB4MjUyNSwgMHgxRDZGLCAweDI1MjYsIDB4MUQ2RCwgMHgyNTI3LCAweDFENkMsIDB4MjUyOCwKKyAgICAweDFENkUsIDB4MjUyOSwgMHgxRDcxLCAweDI1MkEsIDB4MUQ3MCwgMHgyNTJCLCAweDFENzIsIDB4MjUyQywgMHgxRDVCLAorICAgIDB4MjUyRCwgMHgxRDVELCAweDI1MkUsIDB4MUQ1RSwgMHgyNTJGLCAweDFENUYsIDB4MjUzMCwgMHgxRDVDLCAweDI1MzEsCisgICAgMHgxRDYwLCAweDI1MzIsIDB4MUQ2MSwgMHgyNTMzLCAweDFENjIsIDB4MjUzNCwgMHgxRDUzLCAweDI1MzUsIDB4MUQ1NSwKKyAgICAweDI1MzYsIDB4MUQ1NiwgMHgyNTM3LCAweDFENTcsIDB4MjUzOCwgMHgxRDU0LCAweDI1MzksIDB4MUQ1OCwgMHgyNTNBLAorICAgIDB4MUQ1OSwgMHgyNTNCLCAweDFENUEsIDB4MjUzRCwgMHgxRDc3LCAweDI1M0UsIDB4MUQ3OCwgMHgyNTNGLCAweDFENzksCisgICAgMHgyNTQwLCAweDFENzUsIDB4MjU0MSwgMHgxRDc0LCAweDI1NDIsIDB4MUQ3NiwgMHgyNTQzLCAweDFEN0IsIDB4MjU0NCwKKyAgICAweDFEN0QsIDB4MjU0NSwgMHgxRDdBLCAweDI1NDYsIDB4MUQ3QywgMHgyNTQ3LCAweDFEODEsIDB4MjU0OCwgMHgxRDgwLAorICAgIDB4MjU0OSwgMHgxRDdFLCAweDI1NEEsIDB4MUQ3RiwgMHgyNjFDLCAweDIwMUQsIDB4MjYxRCwgMHgyMDFCLCAweDI2MUUsCisgICAgMHgyMDFFLCAweDI2MUYsIDB4MjAxQywgMHgyNzAyLCAweDJGOTIsIDB4MjdBMSwgMHgyMDExLCAweDMwMDEsIDB4MUVDRiwKKyAgICAweDMwMDIsIDB4MUVEMCwgMHgzMDA4LCAweDFFRTMsIDB4MzAwOSwgMHgxRUU0LCAweDMwMEEsIDB4MUVFNSwgMHgzMDBCLAorICAgIDB4MUVFNiwgMHgzMDBDLCAweDFFRTcsIDB4MzAwRCwgMHgxRUU4LCAweDMwMEUsIDB4MUVFOSwgMHgzMDBGLCAweDFFRUEsCisgICAgMHgzMDEwLCAweDFFRUIsIDB4MzAxMSwgMHgxRUVDLCAweDMwMTMsIDB4MjA0RSwgMHgzMDE0LCAweDFFREQsIDB4MzAxNSwKKyAgICAweDFFREUsIDB4MzAxQywgMHgxRUQ2LCAweDMwMUQsIDB4MUYxNCwgMHgzMDFGLCAweDFGMTUsIDB4MzA0MSwgMHgxRUVFLAorICAgIDB4MzA0MywgMHgxRUVGLCAweDMwNDUsIDB4MUVGMCwgMHgzMDQ3LCAweDFFRjEsIDB4MzA0OSwgMHgxRUYyLCAweDMwNjMsCisgICAgMHgxRUYzLCAweDMwODMsIDB4MUVGNCwgMHgzMDg1LCAweDFFRjUsIDB4MzA4NywgMHgxRUY2LCAweDMwOEUsIDB4MUVGNywKKyAgICAweDMwOUIsIDB4MjA1MCwgMHgzMDlDLCAweDIwNEYsIDB4MzBBMSwgMHgxRUY4LCAweDMwQTMsIDB4MUVGOSwgMHgzMEE1LAorICAgIDB4MUVGQSwgMHgzMEE3LCAweDFFRkIsIDB4MzBBOSwgMHgxRUZDLCAweDMwQzMsIDB4MUVGRCwgMHgzMEUzLCAweDFFRkUsCisgICAgMHgzMEU1LCAweDFFRkYsIDB4MzBFNywgMHgxRjAwLCAweDMwRUUsIDB4MUYwMSwgMHgzMEY1LCAweDFGMDIsIDB4MzBGNiwKKyAgICAweDFGMDMsIDB4MzBGQywgMHgxRUQzLCAweDMzMDAsIDB4MjA5RSwgMHgzMzAxLCAweDJFQjYsIDB4MzMwMiwgMHgyRUI3LAorICAgIDB4MzMwMywgMHgyMDkyLCAweDMzMDQsIDB4MkVCOCwgMHgzMzA1LCAweDIwOEQsIDB4MzMwNiwgMHgyRUI5LCAweDMzMDcsCisgICAgMHgyRUJELCAweDMzMDgsIDB4MkVCQiwgMHgzMzA5LCAweDJFQzAsIDB4MzMwQSwgMHgyRUJFLCAweDMzMEIsIDB4MkVDMiwKKyAgICAweDMzMEMsIDB4MkVDNCwgMHgzMzBELCAweDFGMEUsIDB4MzMwRSwgMHgyRUM1LCAweDMzMEYsIDB4MkVDNiwgMHgzMzEwLAorICAgIDB4MkVDNywgMHgzMzExLCAweDJFQzgsIDB4MzMxMiwgMHgyRUM5LCAweDMzMTMsIDB4MkVDQSwgMHgzMzE0LCAweDFGMDUsCisgICAgMHgzMzE1LCAweDIwOTQsIDB4MzMxNiwgMHgyMDhBLCAweDMzMTcsIDB4MkVDQywgMHgzMzE4LCAweDIwOTMsIDB4MzMxOSwKKyAgICAweDJFQ0UsIDB4MzMxQSwgMHgyRUQwLCAweDMzMUIsIDB4MkVEMSwgMHgzMzFDLCAweDJFRDIsIDB4MzMxRCwgMHgyRUQzLAorICAgIDB4MzMxRSwgMHgyMEExLCAweDMzMUYsIDB4MkVENCwgMHgzMzIwLCAweDJFRDUsIDB4MzMyMSwgMHgyRUQ2LCAweDMzMjIsCisgICAgMHgyMDg5LCAweDMzMjMsIDB4MjA5QywgMHgzMzI0LCAweDJFRDcsIDB4MzMyNSwgMHgyRUQ5LCAweDMzMjYsIDB4MUYwRiwKKyAgICAweDMzMjcsIDB4MUYwOSwgMHgzMzI4LCAweDJFREMsIDB4MzMyOSwgMHgyRURELCAweDMzMkEsIDB4MjBBNCwgMHgzMzJCLAorICAgIDB4MUYxMSwgMHgzMzJELCAweDJFREYsIDB4MzMyRSwgMHgyRUUyLCAweDMzMkYsIDB4MkVFMywgMHgzMzMwLCAweDJFRTQsCisgICAgMHgzMzMxLCAweDIwQTYsIDB4MzMzMiwgMHgyRUU1LCAweDMzMzMsIDB4MjA4RSwgMHgzMzM0LCAweDJFRTgsIDB4MzMzNSwKKyAgICAweDJFRTksIDB4MzMzNiwgMHgxRjBCLCAweDMzMzcsIDB4MkVFRSwgMHgzMzM4LCAweDJFRjAsIDB4MzMzOSwgMHgyMDk3LAorICAgIDB4MzMzQSwgMHgyRUYxLCAweDMzM0IsIDB4MjA5RCwgMHgzMzNDLCAweDJFRUEsIDB4MzMzRCwgMHgyRUYyLCAweDMzM0UsCisgICAgMHgyRUY0LCAweDMzM0YsIDB4MkVGNSwgMHgzMzQwLCAweDJFRjYsIDB4MzM0MSwgMHgyRUYzLCAweDMzNDIsIDB4MjA5QiwKKyAgICAweDMzNDMsIDB4MkVGNywgMHgzMzQ0LCAweDJFRjgsIDB4MzM0NSwgMHgyRUY5LCAweDMzNDYsIDB4MkVGQSwgMHgzMzQ3LAorICAgIDB4MjBBNSwgMHgzMzQ4LCAweDJFRkIsIDB4MzM0OSwgMHgxRjA0LCAweDMzNEEsIDB4MUYxMiwgMHgzMzRCLCAweDJFRkMsCisgICAgMHgzMzRDLCAweDJFRkQsIDB4MzM0RCwgMHgxRjA3LCAweDMzNEUsIDB4MjA5MSwgMHgzMzRGLCAweDJFRkUsIDB4MzM1MCwKKyAgICAweDJFRkYsIDB4MzM1MSwgMHgxRjBDLCAweDMzNTIsIDB4MkYwMiwgMHgzMzUzLCAweDJGMDYsIDB4MzM1NCwgMHgyRjAzLAorICAgIDB4MzM1NSwgMHgyRjA3LCAweDMzNTYsIDB4MkYwOCwgMHgzMzU3LCAweDIwOTgsIDB4MzM3RiwgMHgyMDg0LCAweEZGMDgsCisgICAgMHgxRURCLCAweEZGMDksIDB4MUVEQywgMHhGRjBDLCAweDIwNEMsIDB4RkYwRSwgMHgyMDUyLCAweEZGMUQsIDB4MUVFRCwKKyAgICAweEZGM0IsIDB4MUVERiwgMHhGRjNELCAweDFFRTAsIDB4RkYzRiwgMHgxRUQyLCAweEZGNUIsIDB4MUVFMSwgMHhGRjVDLAorICAgIDB4MUVEOCwgMHhGRjVELCAweDFFRTIsIDB4RkY1RSwgMHgxRUQ2LCAweEZGRTMsIDB4MUVEMSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VVEYxNi1IXzUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVVRGMTYtSF81LmNwcAppbmRleCAzMzg0MmUzLi4yOTdjYzgzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VVEYxNi1IXzUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVURjE2LUhfNS5jcHAKQEAgLTcsMzMxNyArNywyOTQ5IEBACiAjaW5jbHVkZSAiY21hcHNfamFwYW4xLmgiCiAKIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pSklTX1VURjE2X0hfNVsxMzI0MSAqIDJdID0gewotICAgIDB4MDAyMCwgMHgwMDAxLCAweDAwMjEsIDB4MDAwMiwgMHgwMDIyLCAweDAwMDMsIDB4MDAyMywgMHgwMDA0LAotICAgIDB4MDAyNCwgMHgwMDA1LCAweDAwMjUsIDB4MDAwNiwgMHgwMDI2LCAweDAwMDcsIDB4MDAyNywgMHgwMDA4LAotICAgIDB4MDAyOCwgMHgwMDA5LCAweDAwMjksIDB4MDAwQSwgMHgwMDJBLCAweDAwMEIsIDB4MDAyQiwgMHgwMDBDLAotICAgIDB4MDAyQywgMHgwMDBELCAweDAwMkQsIDB4MDAwRSwgMHgwMDJFLCAweDAwMEYsIDB4MDAyRiwgMHgwMDEwLAotICAgIDB4MDAzMCwgMHgwMDExLCAweDAwMzEsIDB4MDAxMiwgMHgwMDMyLCAweDAwMTMsIDB4MDAzMywgMHgwMDE0LAotICAgIDB4MDAzNCwgMHgwMDE1LCAweDAwMzUsIDB4MDAxNiwgMHgwMDM2LCAweDAwMTcsIDB4MDAzNywgMHgwMDE4LAotICAgIDB4MDAzOCwgMHgwMDE5LCAweDAwMzksIDB4MDAxQSwgMHgwMDNBLCAweDAwMUIsIDB4MDAzQiwgMHgwMDFDLAotICAgIDB4MDAzQywgMHgwMDFELCAweDAwM0QsIDB4MDAxRSwgMHgwMDNFLCAweDAwMUYsIDB4MDAzRiwgMHgwMDIwLAotICAgIDB4MDA0MCwgMHgwMDIxLCAweDAwNDEsIDB4MDAyMiwgMHgwMDQyLCAweDAwMjMsIDB4MDA0MywgMHgwMDI0LAotICAgIDB4MDA0NCwgMHgwMDI1LCAweDAwNDUsIDB4MDAyNiwgMHgwMDQ2LCAweDAwMjcsIDB4MDA0NywgMHgwMDI4LAotICAgIDB4MDA0OCwgMHgwMDI5LCAweDAwNDksIDB4MDAyQSwgMHgwMDRBLCAweDAwMkIsIDB4MDA0QiwgMHgwMDJDLAotICAgIDB4MDA0QywgMHgwMDJELCAweDAwNEQsIDB4MDAyRSwgMHgwMDRFLCAweDAwMkYsIDB4MDA0RiwgMHgwMDMwLAotICAgIDB4MDA1MCwgMHgwMDMxLCAweDAwNTEsIDB4MDAzMiwgMHgwMDUyLCAweDAwMzMsIDB4MDA1MywgMHgwMDM0LAotICAgIDB4MDA1NCwgMHgwMDM1LCAweDAwNTUsIDB4MDAzNiwgMHgwMDU2LCAweDAwMzcsIDB4MDA1NywgMHgwMDM4LAotICAgIDB4MDA1OCwgMHgwMDM5LCAweDAwNTksIDB4MDAzQSwgMHgwMDVBLCAweDAwM0IsIDB4MDA1QiwgMHgwMDNDLAotICAgIDB4MDA1QywgMHgwMDYxLCAweDAwNUQsIDB4MDAzRSwgMHgwMDVFLCAweDAwM0YsIDB4MDA1RiwgMHgwMDQwLAotICAgIDB4MDA2MCwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MiwgMHgwMDYyLCAweDAwNDMsIDB4MDA2MywgMHgwMDQ0LAotICAgIDB4MDA2NCwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NiwgMHgwMDY2LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ4LAotICAgIDB4MDA2OCwgMHgwMDQ5LCAweDAwNjksIDB4MDA0QSwgMHgwMDZBLCAweDAwNEIsIDB4MDA2QiwgMHgwMDRDLAotICAgIDB4MDA2QywgMHgwMDRELCAweDAwNkQsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEYsIDB4MDA2RiwgMHgwMDUwLAotICAgIDB4MDA3MCwgMHgwMDUxLCAweDAwNzEsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTMsIDB4MDA3MywgMHgwMDU0LAotICAgIDB4MDA3NCwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NiwgMHgwMDc2LCAweDAwNTcsIDB4MDA3NywgMHgwMDU4LAotICAgIDB4MDA3OCwgMHgwMDU5LCAweDAwNzksIDB4MDA1QSwgMHgwMDdBLCAweDAwNUIsIDB4MDA3QiwgMHgwMDVDLAotICAgIDB4MDA3QywgMHgwMDYzLCAweDAwN0QsIDB4MDA1RSwgMHgwMDdFLCAweDAwNjQsIDB4MDBBMCwgMHgwMDAxLAotICAgIDB4MDBBMSwgMHgwMDY1LCAweDAwQTIsIDB4MDA2NiwgMHgwMEEzLCAweDAwNjcsIDB4MDBBNCwgMHgwMDZCLAotICAgIDB4MDBBNSwgMHgwMDNELCAweDAwQTYsIDB4MDA1RCwgMHgwMEE3LCAweDAyRDAsIDB4MDBBOCwgMHgwMjg3LAotICAgIDB4MDBBOSwgMHgwMDk4LCAweDAwQUEsIDB4MDA4QywgMHgwMEFCLCAweDAwNkQsIDB4MDBBQywgMHgwMDk5LAotICAgIDB4MDBBRCwgMHgwMDk3LCAweDAwQUUsIDB4MDA5QSwgMHgwMEFGLCAweDAwODEsIDB4MDBCMCwgMHgwMkMzLAotICAgIDB4MDBCMSwgMHgwMkI2LCAweDAwQjIsIDB4MDA5RCwgMHgwMEIzLCAweDAwOUUsIDB4MDBCNCwgMHgwMjg1LAotICAgIDB4MDBCNSwgMHgwMDlGLCAweDAwQjYsIDB4MDMwQSwgMHgwMEI3LCAweDAwNzUsIDB4MDBCOCwgMHgwMDg2LAotICAgIDB4MDBCOSwgMHgwMEEwLCAweDAwQkEsIDB4MDA5MCwgMHgwMEJCLCAweDAwN0IsIDB4MDBCQywgMHgwMEExLAotICAgIDB4MDBCRCwgMHgwMEEyLCAweDAwQkUsIDB4MDBBMywgMHgwMEJGLCAweDAwN0UsIDB4MDBDMCwgMHgwMEE0LAotICAgIDB4MDBDMSwgMHgwMEE1LCAweDAwQzIsIDB4MDBBNiwgMHgwMEMzLCAweDAwQTcsIDB4MDBDNCwgMHgwMEE4LAotICAgIDB4MDBDNSwgMHgwMEE5LCAweDAwQzYsIDB4MDA4QiwgMHgwMEM3LCAweDAwQUEsIDB4MDBDOCwgMHgwMEFCLAotICAgIDB4MDBDOSwgMHgwMEFDLCAweDAwQ0EsIDB4MDBBRCwgMHgwMENCLCAweDAwQUUsIDB4MDBDQywgMHgwMEFGLAotICAgIDB4MDBDRCwgMHgwMEIwLCAweDAwQ0UsIDB4MDBCMSwgMHgwMENGLCAweDAwQjIsIDB4MDBEMCwgMHgwMEIzLAotICAgIDB4MDBEMSwgMHgwMEI0LCAweDAwRDIsIDB4MDBCNSwgMHgwMEQzLCAweDAwQjYsIDB4MDBENCwgMHgwMEI3LAotICAgIDB4MDBENSwgMHgwMEI4LCAweDAwRDYsIDB4MDBCOSwgMHgwMEQ3LCAweDAyQjcsIDB4MDBEOCwgMHgwMDhFLAotICAgIDB4MDBEOSwgMHgwMEJCLCAweDAwREEsIDB4MDBCQywgMHgwMERCLCAweDAwQkQsIDB4MDBEQywgMHgwMEJFLAotICAgIDB4MDBERCwgMHgwMEJGLCAweDAwREUsIDB4MDBDMCwgMHgwMERGLCAweDAwOTYsIDB4MDBFMCwgMHgwMEMxLAotICAgIDB4MDBFMSwgMHgwMEMyLCAweDAwRTIsIDB4MDBDMywgMHgwMEUzLCAweDAwQzQsIDB4MDBFNCwgMHgwMEM1LAotICAgIDB4MDBFNSwgMHgwMEM2LCAweDAwRTYsIDB4MDA5MSwgMHgwMEU3LCAweDAwQzcsIDB4MDBFOCwgMHgwMEM4LAotICAgIDB4MDBFOSwgMHgwMEM5LCAweDAwRUEsIDB4MDBDQSwgMHgwMEVCLCAweDAwQ0IsIDB4MDBFQywgMHgwMENDLAotICAgIDB4MDBFRCwgMHgwMENELCAweDAwRUUsIDB4MDBDRSwgMHgwMEVGLCAweDAwQ0YsIDB4MDBGMCwgMHgwMEQwLAotICAgIDB4MDBGMSwgMHgwMEQxLCAweDAwRjIsIDB4MDBEMiwgMHgwMEYzLCAweDAwRDMsIDB4MDBGNCwgMHgwMEQ0LAotICAgIDB4MDBGNSwgMHgwMEQ1LCAweDAwRjYsIDB4MDBENiwgMHgwMEY3LCAweDAyQjgsIDB4MDBGOCwgMHgwMDk0LAotICAgIDB4MDBGOSwgMHgwMEQ4LCAweDAwRkEsIDB4MDBEOSwgMHgwMEZCLCAweDAwREEsIDB4MDBGQywgMHgwMERCLAotICAgIDB4MDBGRCwgMHgwMERDLCAweDAwRkUsIDB4MDBERCwgMHgwMEZGLCAweDAwREUsIDB4MDEwMCwgMHgyNDk2LAotICAgIDB4MDEwMSwgMHgyNDkxLCAweDAxMDIsIDB4M0Q4QywgMHgwMTAzLCAweDNEOTksIDB4MDEwNCwgMHgzRDc5LAotICAgIDB4MDEwNSwgMHgzRDgxLCAweDAxMDYsIDB4M0Q4RSwgMHgwMTA3LCAweDNEOUIsIDB4MDEwOCwgMHgzREE3LAotICAgIDB4MDEwOSwgMHgzREFELCAweDAxMEMsIDB4M0Q4RiwgMHgwMTBELCAweDNEOUMsIDB4MDEwRSwgMHgzRDkxLAotICAgIDB4MDEwRiwgMHgzRDlFLCAweDAxMTEsIDB4M0Q5RiwgMHgwMTEyLCAweDI0OTksIDB4MDExMywgMHgyNDk0LAotICAgIDB4MDExOCwgMHgzRDkwLCAweDAxMTksIDB4M0Q5RCwgMHgwMTFBLCAweDI0QjMsIDB4MDExQiwgMHgyNEJGLAotICAgIDB4MDExQywgMHgzREE4LCAweDAxMUQsIDB4M0RBRSwgMHgwMTI0LCAweDNEQTksIDB4MDEyNSwgMHgzREFGLAotICAgIDB4MDEyNywgMHgzREM4LCAweDAxMjgsIDB4MjRCOCwgMHgwMTI5LCAweDI0QzQsIDB4MDEyQSwgMHgyNDk3LAotICAgIDB4MDEyQiwgMHgyNDkyLCAweDAxMzEsIDB4MDA5MiwgMHgwMTM0LCAweDNEQUEsIDB4MDEzNSwgMHgzREIwLAotICAgIDB4MDEzOSwgMHgzRDhELCAweDAxM0EsIDB4M0Q5QSwgMHgwMTNELCAweDNEN0IsIDB4MDEzRSwgMHgzRDgzLAotICAgIDB4MDE0MSwgMHgwMDhELCAweDAxNDIsIDB4MDA5MywgMHgwMTQzLCAweDNEOTIsIDB4MDE0NCwgMHgzREEwLAotICAgIDB4MDE0NywgMHgzRDkzLCAweDAxNDgsIDB4M0RBMSwgMHgwMTRCLCAweDI0REMsIDB4MDE0QywgMHgyNDlBLAotICAgIDB4MDE0RCwgMHgyNDk1LCAweDAxNTAsIDB4M0Q5NCwgMHgwMTUxLCAweDNEQTIsIDB4MDE1MiwgMHgwMDhGLAotICAgIDB4MDE1MywgMHgwMDk1LCAweDAxNTQsIDB4M0Q4QiwgMHgwMTU1LCAweDNEOTgsIDB4MDE1OCwgMHgzRDk1LAotICAgIDB4MDE1OSwgMHgzREEzLCAweDAxNUEsIDB4M0Q3QywgMHgwMTVCLCAweDNEODQsIDB4MDE1QywgMHgzREFCLAotICAgIDB4MDE1RCwgMHgzREIxLCAweDAxNUUsIDB4M0Q3RCwgMHgwMTVGLCAweDNEODYsIDB4MDE2MCwgMHgwMERGLAotICAgIDB4MDE2MSwgMHgwMEUzLCAweDAxNjIsIDB4M0Q5NywgMHgwMTYzLCAweDNEQTUsIDB4MDE2NCwgMHgzRDdFLAotICAgIDB4MDE2NSwgMHgzRDg3LCAweDAxNjgsIDB4MjRCRCwgMHgwMTY5LCAweDI0QzksIDB4MDE2QSwgMHgyNDk4LAotICAgIDB4MDE2QiwgMHgyNDkzLCAweDAxNkMsIDB4M0RBQywgMHgwMTZELCAweDNEQjIsIDB4MDE2RSwgMHgyNEJDLAotICAgIDB4MDE2RiwgMHgyNEM4LCAweDAxNzAsIDB4M0Q5NiwgMHgwMTcxLCAweDNEQTQsIDB4MDE3OCwgMHgwMEUwLAotICAgIDB4MDE3OSwgMHgzRDdGLCAweDAxN0EsIDB4M0Q4OCwgMHgwMTdCLCAweDNEODAsIDB4MDE3QywgMHgzRDhBLAotICAgIDB4MDE3RCwgMHgwMEUxLCAweDAxN0UsIDB4MDBFNSwgMHgwMTkyLCAweDAwNjksIDB4MDE5MywgMHgzREQyLAotICAgIDB4MDFDMiwgMHgzRENELCAweDAxQ0QsIDB4MjRCMiwgMHgwMUNFLCAweDI0QkUsIDB4MDFDRiwgMHgyNEI2LAotICAgIDB4MDFEMCwgMHgyNEMyLCAweDAxRDEsIDB4MjRCOSwgMHgwMUQyLCAweDI0QzUsIDB4MDFEMywgMHgyNEJCLAotICAgIDB4MDFENCwgMHgyNEM3LCAweDAxRDYsIDB4M0Q3NSwgMHgwMUQ4LCAweDNENzYsIDB4MDFEQSwgMHgzRDc3LAotICAgIDB4MDFEQywgMHgzRDc4LCAweDAxRjgsIDB4M0Q3MywgMHgwMUY5LCAweDNENzQsIDB4MDFGRCwgMHgyNENELAotICAgIDB4MDI1MCwgMHgzREQ4LCAweDAyNTEsIDB4MjRDQSwgMHgwMjUyLCAweDNEREMsIDB4MDI1MywgMHgzRENFLAotICAgIDB4MDI1NCwgMHgyNENGLCAweDAyNTUsIDB4M0RFMSwgMHgwMjU2LCAweDNEQkEsIDB4MDI1NywgMHgzRENGLAotICAgIDB4MDI1OCwgMHgzREQ1LCAweDAyNTksIDB4MjREMiwgMHgwMjVBLCAweDI0RDUsIDB4MDI1QiwgMHgyNEQ4LAotICAgIDB4MDI1QywgMHgzREQ2LCAweDAyNUUsIDB4M0RENywgMHgwMjVGLCAweDNEQzEsIDB4MDI2MCwgMHgzREQxLAotICAgIDB4MDI2MSwgMHgzREM1LCAweDAyNjIsIDB4M0UwQiwgMHgwMjYzLCAweDNFMEMsIDB4MDI2NCwgMHgzRERCLAotICAgIDB4MDI2NSwgMHgzRERFLCAweDAyNjYsIDB4M0RDQiwgMHgwMjY3LCAweDNERTQsIDB4MDI2OCwgMHgzREQzLAotICAgIDB4MDI2QSwgMHgzRTBELCAweDAyNkMsIDB4M0RCNiwgMHgwMjZELCAweDNEQzAsIDB4MDI2RSwgMHgzREI3LAotICAgIDB4MDI2RiwgMHgzREQ5LCAweDAyNzAsIDB4M0RDNiwgMHgwMjcxLCAweDNEQjMsIDB4MDI3MiwgMHgzREMyLAotICAgIDB4MDI3MywgMHgzREJCLCAweDAyNzQsIDB4M0UwRSwgMHgwMjc1LCAweDI0REQsIDB4MDI3NiwgMHgzRTBGLAotICAgIDB4MDI3OCwgMHgzRTEwLCAweDAyNzksIDB4M0RCOCwgMHgwMjdBLCAweDNERTMsIDB4MDI3QiwgMHgzREJGLAotICAgIDB4MDI3RCwgMHgzREJDLCAweDAyN0UsIDB4M0RCNSwgMHgwMjgwLCAweDNFMTEsIDB4MDI4MSwgMHgzREM3LAotICAgIDB4MDI4MiwgMHgzREJELCAweDAyODMsIDB4MjRFMiwgMHgwMjg0LCAweDNERDAsIDB4MDI4OCwgMHgzREI5LAotICAgIDB4MDI4OSwgMHgzREQ0LCAweDAyOEEsIDB4M0REQSwgMHgwMjhCLCAweDNEQjQsIDB4MDI4QywgMHgyNERFLAotICAgIDB4MDI4RCwgMHgzRERELCAweDAyOEUsIDB4M0RDNCwgMHgwMjhGLCAweDNFMTIsIDB4MDI5MCwgMHgzREJFLAotICAgIDB4MDI5MSwgMHgzREUyLCAweDAyOTIsIDB4MjRFMSwgMHgwMjk0LCAweDNEQ0EsIDB4MDI5NSwgMHgzREM5LAotICAgIDB4MDI5OCwgMHgzRENDLCAweDAyOTksIDB4M0UxMywgMHgwMjlDLCAweDNFMTQsIDB4MDI5RCwgMHgzREMzLAotICAgIDB4MDI5RiwgMHgzRTE1LCAweDAyQTEsIDB4M0RFMCwgMHgwMkEyLCAweDNEREYsIDB4MDJCMCwgMHgzRTE2LAotICAgIDB4MDJCMiwgMHgzRTE3LCAweDAyQjcsIDB4M0UxOCwgMHgwMkJCLCAweDAwNjIsIDB4MDJCQywgMHgwMDYwLAotICAgIDB4MDJDMSwgMHgzRTE5LCAweDAyQzYsIDB4MDA4MCwgMHgwMkM3LCAweDNEODUsIDB4MDJDOCwgMHgzREU2LAotICAgIDB4MDJDQywgMHgzREU3LCAweDAyRDAsIDB4MjRFMywgMHgwMkQxLCAweDNERTgsIDB4MDJEOCwgMHgzRDdBLAotICAgIDB4MDJEOSwgMHgzREE2LCAweDAyREEsIDB4MDA4NSwgMHgwMkRCLCAweDNEODIsIDB4MDJEQywgMHgwMDVGLAotICAgIDB4MDJERCwgMHgzRDg5LCAweDAyREUsIDB4M0RGQiwgMHgwMkUwLCAweDNFMUEsIDB4MDJFMSwgMHgzRTFCLAotICAgIDB4MDJFNSwgMHgzREVCLCAweDAyRTYsIDB4M0RFQywgMHgwMkU3LCAweDNERUQsIDB4MDJFOCwgMHgzREVFLAotICAgIDB4MDJFOSwgMHgzREVGLCAweDAzMDAsIDB4MDA0MSwgMHgwMzAxLCAweDAwN0YsIDB4MDMwMiwgMHgwMDgwLAotICAgIDB4MDMwMywgMHgwMDVGLCAweDAzMDQsIDB4MDA4MSwgMHgwMzA1LCAweDAwRTIsIDB4MDMwNiwgMHgwMDgyLAotICAgIDB4MDMwNywgMHgwMDgzLCAweDAzMDgsIDB4MDA4NCwgMHgwMzBBLCAweDAwODUsIDB4MDMwQiwgMHgwMDg3LAotICAgIDB4MDMwQywgMHgwMDg5LCAweDAzMEYsIDB4M0RFQSwgMHgwMzE4LCAweDNFMDIsIDB4MDMxOSwgMHgzRTAzLAotICAgIDB4MDMxQSwgMHgzRTA3LCAweDAzMUMsIDB4M0RGNSwgMHgwMzFELCAweDNFMDAsIDB4MDMxRSwgMHgzRTAxLAotICAgIDB4MDMxRiwgMHgzREY2LCAweDAzMjAsIDB4M0RGNywgMHgwMzI0LCAweDNERkMsIDB4MDMyNSwgMHgzREYyLAotICAgIDB4MDMyNywgMHgwMDg2LCAweDAzMjgsIDB4MDA4OCwgMHgwMzI5LCAweDNERjksIDB4MDMyQSwgMHgzRTA0LAotICAgIDB4MDMyQywgMHgzREYzLCAweDAzMkYsIDB4M0RGQSwgMHgwMzMwLCAweDNERkQsIDB4MDMzMiwgMHgwMDQwLAotICAgIDB4MDMzNCwgMHgzREZGLCAweDAzMzYsIDB4MDA4QSwgMHgwMzM5LCAweDNERjQsIDB4MDMzQSwgMHgzRTA1LAotICAgIDB4MDMzQiwgMHgzRTA2LCAweDAzM0MsIDB4M0RGRSwgMHgwMzNELCAweDNERjgsIDB4MDM2MSwgMHgzREU1LAotICAgIDB4MDM5MSwgMHgwM0YzLCAweDAzOTIsIDB4MDNGNCwgMHgwMzkzLCAweDAzRjUsIDB4MDM5NCwgMHgwM0Y2LAotICAgIDB4MDM5NSwgMHgwM0Y3LCAweDAzOTYsIDB4MDNGOCwgMHgwMzk3LCAweDAzRjksIDB4MDM5OCwgMHgwM0ZBLAotICAgIDB4MDM5OSwgMHgwM0ZCLCAweDAzOUEsIDB4MDNGQywgMHgwMzlCLCAweDAzRkQsIDB4MDM5QywgMHgwM0ZFLAotICAgIDB4MDM5RCwgMHgwM0ZGLCAweDAzOUUsIDB4MDQwMCwgMHgwMzlGLCAweDA0MDEsIDB4MDNBMCwgMHgwNDAyLAotICAgIDB4MDNBMSwgMHgwNDAzLCAweDAzQTMsIDB4MDQwNCwgMHgwM0E0LCAweDA0MDUsIDB4MDNBNSwgMHgwNDA2LAotICAgIDB4MDNBNiwgMHgwNDA3LCAweDAzQTcsIDB4MDQwOCwgMHgwM0E4LCAweDA0MDksIDB4MDNBOSwgMHgwNDBBLAotICAgIDB4MDNCMSwgMHgwNDBCLCAweDAzQjIsIDB4MDQwQywgMHgwM0IzLCAweDA0MEQsIDB4MDNCNCwgMHgwNDBFLAotICAgIDB4MDNCNSwgMHgwNDBGLCAweDAzQjYsIDB4MDQxMCwgMHgwM0I3LCAweDA0MTEsIDB4MDNCOCwgMHgwNDEyLAotICAgIDB4MDNCOSwgMHgwNDEzLCAweDAzQkEsIDB4MDQxNCwgMHgwM0JCLCAweDA0MTUsIDB4MDNCQywgMHgwNDE2LAotICAgIDB4MDNCRCwgMHgwNDE3LCAweDAzQkUsIDB4MDQxOCwgMHgwM0JGLCAweDA0MTksIDB4MDNDMCwgMHgwNDFBLAotICAgIDB4MDNDMSwgMHgwNDFCLCAweDAzQzIsIDB4M0Y1RSwgMHgwM0MzLCAweDA0MUMsIDB4MDNDNCwgMHgwNDFELAotICAgIDB4MDNDNSwgMHgwNDFFLCAweDAzQzYsIDB4MDQxRiwgMHgwM0M3LCAweDA0MjAsIDB4MDNDOCwgMHgwNDIxLAotICAgIDB4MDNDOSwgMHgwNDIyLCAweDAzRDAsIDB4MkYzQSwgMHgwM0QxLCAweDJGNDAsIDB4MDNENSwgMHgyRjNFLAotICAgIDB4MDNEQiwgMHgyRjNGLCAweDA0MDEsIDB4MDQyOSwgMHgwNDEwLCAweDA0MjMsIDB4MDQxMSwgMHgwNDI0LAotICAgIDB4MDQxMiwgMHgwNDI1LCAweDA0MTMsIDB4MDQyNiwgMHgwNDE0LCAweDA0MjcsIDB4MDQxNSwgMHgwNDI4LAotICAgIDB4MDQxNiwgMHgwNDJBLCAweDA0MTcsIDB4MDQyQiwgMHgwNDE4LCAweDA0MkMsIDB4MDQxOSwgMHgwNDJELAotICAgIDB4MDQxQSwgMHgwNDJFLCAweDA0MUIsIDB4MDQyRiwgMHgwNDFDLCAweDA0MzAsIDB4MDQxRCwgMHgwNDMxLAotICAgIDB4MDQxRSwgMHgwNDMyLCAweDA0MUYsIDB4MDQzMywgMHgwNDIwLCAweDA0MzQsIDB4MDQyMSwgMHgwNDM1LAotICAgIDB4MDQyMiwgMHgwNDM2LCAweDA0MjMsIDB4MDQzNywgMHgwNDI0LCAweDA0MzgsIDB4MDQyNSwgMHgwNDM5LAotICAgIDB4MDQyNiwgMHgwNDNBLCAweDA0MjcsIDB4MDQzQiwgMHgwNDI4LCAweDA0M0MsIDB4MDQyOSwgMHgwNDNELAotICAgIDB4MDQyQSwgMHgwNDNFLCAweDA0MkIsIDB4MDQzRiwgMHgwNDJDLCAweDA0NDAsIDB4MDQyRCwgMHgwNDQxLAotICAgIDB4MDQyRSwgMHgwNDQyLCAweDA0MkYsIDB4MDQ0MywgMHgwNDMwLCAweDA0NDQsIDB4MDQzMSwgMHgwNDQ1LAotICAgIDB4MDQzMiwgMHgwNDQ2LCAweDA0MzMsIDB4MDQ0NywgMHgwNDM0LCAweDA0NDgsIDB4MDQzNSwgMHgwNDQ5LAotICAgIDB4MDQzNiwgMHgwNDRCLCAweDA0MzcsIDB4MDQ0QywgMHgwNDM4LCAweDA0NEQsIDB4MDQzOSwgMHgwNDRFLAotICAgIDB4MDQzQSwgMHgwNDRGLCAweDA0M0IsIDB4MDQ1MCwgMHgwNDNDLCAweDA0NTEsIDB4MDQzRCwgMHgwNDUyLAotICAgIDB4MDQzRSwgMHgwNDUzLCAweDA0M0YsIDB4MDQ1NCwgMHgwNDQwLCAweDA0NTUsIDB4MDQ0MSwgMHgwNDU2LAotICAgIDB4MDQ0MiwgMHgwNDU3LCAweDA0NDMsIDB4MDQ1OCwgMHgwNDQ0LCAweDA0NTksIDB4MDQ0NSwgMHgwNDVBLAotICAgIDB4MDQ0NiwgMHgwNDVCLCAweDA0NDcsIDB4MDQ1QywgMHgwNDQ4LCAweDA0NUQsIDB4MDQ0OSwgMHgwNDVFLAotICAgIDB4MDQ0QSwgMHgwNDVGLCAweDA0NEIsIDB4MDQ2MCwgMHgwNDRDLCAweDA0NjEsIDB4MDQ0RCwgMHgwNDYyLAotICAgIDB4MDQ0RSwgMHgwNDYzLCAweDA0NEYsIDB4MDQ2NCwgMHgwNDUxLCAweDA0NEEsIDB4MUUzRSwgMHgzRDcxLAotICAgIDB4MUUzRiwgMHgzRDcyLCAweDFFQkMsIDB4MjRCNSwgMHgxRUJELCAweDI0QzEsIDB4MUY3MCwgMHgyNENDLAotICAgIDB4MUY3MSwgMHgyNENCLCAweDFGNzIsIDB4MjREQSwgMHgxRjczLCAweDI0RDksIDB4MjAwMiwgMHgwMEU3LAotICAgIDB4MjAwMywgMHgwMjc5LCAweDIwMTAsIDB4MDI5NiwgMHgyMDExLCAweDAwMEUsIDB4MjAxMiwgMHgwMDcyLAotICAgIDB4MjAxMywgMHgwMDcyLCAweDIwMTQsIDB4MDA4QSwgMHgyMDE1LCAweDAyOTUsIDB4MjAxNiwgMHgwMjlBLAotICAgIDB4MjAxOCwgMHgwMDYyLCAweDIwMTksIDB4MDA2MCwgMHgyMDFBLCAweDAwNzgsIDB4MjAxQywgMHgwMDZDLAotICAgIDB4MjAxRCwgMHgwMDdBLCAweDIwMUUsIDB4MDA3OSwgMHgyMDIwLCAweDAzMDgsIDB4MjAyMSwgMHgwMzA5LAotICAgIDB4MjAyMiwgMHgwMDc3LCAweDIwMjUsIDB4MDI5RCwgMHgyMDI2LCAweDAyOUMsIDB4MjAzMCwgMHgwMzA0LAotICAgIDB4MjAzMiwgMHgwMkM0LCAweDIwMzMsIDB4MDJDNSwgMHgyMDM5LCAweDAwNkUsIDB4MjAzQSwgMHgwMDZGLAotICAgIDB4MjAzQiwgMHgwMkRFLCAweDIwM0MsIDB4MkY0RiwgMHgyMDNFLCAweDAwRTIsIDB4MjAzRiwgMHgzREU5LAotICAgIDB4MjA0MiwgMHgzRjlBLCAweDIwNDQsIDB4MDA2OCwgMHgyMDQ3LCAweDNGOTYsIDB4MjA0OCwgMHgzRjk3LAotICAgIDB4MjA0OSwgMHgyRjUwLCAweDIwNTEsIDB4M0Y5OSwgMHgyMDcwLCAweDI0QTEsIDB4MjA3NCwgMHgyNEEyLAotICAgIDB4MjA3NSwgMHgyNEEzLCAweDIwNzYsIDB4MjRBNCwgMHgyMDc3LCAweDI0QTUsIDB4MjA3OCwgMHgyNEE2LAotICAgIDB4MjA3OSwgMHgyNEE3LCAweDIwODAsIDB4MjRBOCwgMHgyMDgxLCAweDI0QTksIDB4MjA4MiwgMHgyNEFBLAotICAgIDB4MjA4MywgMHgyNEFCLCAweDIwODQsIDB4MjRBQywgMHgyMDg1LCAweDI0QUQsIDB4MjA4NiwgMHgyNEFFLAotICAgIDB4MjA4NywgMHgyNEFGLCAweDIwODgsIDB4MjRCMCwgMHgyMDg5LCAweDI0QjEsIDB4MjBBQywgMHgyNDhBLAotICAgIDB4MjBERCwgMHgzRkM4LCAweDIwREUsIDB4MkIxQiwgMHgyMTAwLCAweDJFNEYsIDB4MjEwMywgMHgwMkM2LAotICAgIDB4MjEwNSwgMHgyRTUzLCAweDIxMDksIDB4MjA3MSwgMHgyMTBBLCAweDIwNzAsIDB4MjEwRiwgMHgyRjNDLAotICAgIDB4MjExMywgMHgxRjU5LCAweDIxMTYsIDB4MURCQSwgMHgyMTIxLCAweDFGNzcsIDB4MjEyMiwgMHgwMEU0LAotICAgIDB4MjEyNiwgMHgyNDhCLCAweDIxMjcsIDB4M0M5QiwgMHgyMTJCLCAweDAzMDMsIDB4MjEzNSwgMHgyRjM5LAotICAgIDB4MjEzQiwgMHgyMDczLCAweDIxNTMsIDB4MjQ5RiwgMHgyMTU0LCAweDI0QTAsIDB4MjE1NSwgMHgzRDZGLAotICAgIDB4MjE1NiwgMHgyNjM5LCAweDIxNTcsIDB4MjYzQSwgMHgyMTU4LCAweDI2M0IsIDB4MjE1OSwgMHgyNjNDLAotICAgIDB4MjE1QSwgMHgyNjNELCAweDIxNUIsIDB4MjQ5QiwgMHgyMTVDLCAweDI0OUMsIDB4MjE1RCwgMHgyNDlELAotICAgIDB4MjE1RSwgMHgyNDlFLCAweDIxNjAsIDB4MUQ5NywgMHgyMTYxLCAweDFEOTgsIDB4MjE2MiwgMHgxRDk5LAotICAgIDB4MjE2MywgMHgxRDlBLCAweDIxNjQsIDB4MUQ5QiwgMHgyMTY1LCAweDFEOUMsIDB4MjE2NiwgMHgxRDlELAotICAgIDB4MjE2NywgMHgxRDlFLCAweDIxNjgsIDB4MUQ5RiwgMHgyMTY5LCAweDFEQTAsIDB4MjE2QSwgMHgyMDIxLAotICAgIDB4MjE2QiwgMHgyMDIyLCAweDIxNzAsIDB4MUY5QywgMHgyMTcxLCAweDFGOUQsIDB4MjE3MiwgMHgxRjlFLAotICAgIDB4MjE3MywgMHgxRjlGLCAweDIxNzQsIDB4MUZBMCwgMHgyMTc1LCAweDFGQTEsIDB4MjE3NiwgMHgxRkEyLAotICAgIDB4MjE3NywgMHgxRkEzLCAweDIxNzgsIDB4MUZBNCwgMHgyMTc5LCAweDFGQTUsIDB4MjE3QSwgMHgyMDZBLAotICAgIDB4MjE3QiwgMHgyMDZCLCAweDIxN0YsIDB4MjA2RiwgMHgyMTkwLCAweDAyRTEsIDB4MjE5MSwgMHgwMkUyLAotICAgIDB4MjE5MiwgMHgwMkUwLCAweDIxOTMsIDB4MDJFMywgMHgyMTk0LCAweDJGQTksIDB4MjE5NiwgMHgyRkFDLAotICAgIDB4MjE5NywgMHgyRkFELCAweDIxOTgsIDB4MkZBQSwgMHgyMTk5LCAweDJGQUIsIDB4MjFDNCwgMHgyMDc2LAotICAgIDB4MjFDNSwgMHgyMDc3LCAweDIxQzYsIDB4MjA3NSwgMHgyMUNCLCAweDJGQUYsIDB4MjFDQywgMHgyRkFFLAotICAgIDB4MjFEMCwgMHgyRkE4LCAweDIxRDIsIDB4MDJGMCwgMHgyMUQ0LCAweDAyRjEsIDB4MjFFNiwgMHgxRjRELAotICAgIDB4MjFFNywgMHgxRjRDLCAweDIxRTgsIDB4MUY0RSwgMHgyMUU5LCAweDFGNEIsIDB4MjIwMCwgMHgwMkYyLAotICAgIDB4MjIwMiwgMHgwMkY3LCAweDIyMDMsIDB4MDJGMywgMHgyMjA1LCAweDJGOTgsIDB4MjIwNywgMHgwMkY4LAotICAgIDB4MjIwOCwgMHgwMkU1LCAweDIyMDksIDB4M0M3NCwgMHgyMjBBLCAweDJGM0IsIDB4MjIwQiwgMHgwMkU2LAotICAgIDB4MjIxMSwgMHgxREM5LCAweDIyMTIsIDB4MDJCNSwgMHgyMjEzLCAweDJGNTYsIDB4MjIxOSwgMHgwMDc1LAotICAgIDB4MjIxQSwgMHgwMkZELCAweDIyMUQsIDB4MDJGRiwgMHgyMjFFLCAweDAyQkYsIDB4MjIxRiwgMHgxRENELAotICAgIDB4MjIyMCwgMHgwMkY0LCAweDIyMjUsIDB4M0M4MSwgMHgyMjI2LCAweDNDODIsIDB4MjIyNywgMHgwMkVELAotICAgIDB4MjIyOCwgMHgwMkVFLCAweDIyMjksIDB4MDJFQywgMHgyMjJBLCAweDAyRUIsIDB4MjIyQiwgMHgwMzAxLAotICAgIDB4MjIyQywgMHgwMzAyLCAweDIyMkQsIDB4MjAwMywgMHgyMjJFLCAweDFEQzgsIDB4MjIzNCwgMHgwMkMwLAotICAgIDB4MjIzNSwgMHgwMzAwLCAweDIyM0MsIDB4MDA2NCwgMHgyMjNELCAweDAyRkUsIDB4MjI0MywgMHgyRjU4LAotICAgIDB4MjI0NSwgMHgzQzkzLCAweDIyNDgsIDB4M0M5NCwgMHgyMjUyLCAweDAyRkEsIDB4MjI2MCwgMHgwMkJBLAotICAgIDB4MjI2MSwgMHgwMkY5LCAweDIyNjIsIDB4M0M5MSwgMHgyMjY2LCAweDAyQkQsIDB4MjI2NywgMHgwMkJFLAotICAgIDB4MjI2QSwgMHgwMkZCLCAweDIyNkIsIDB4MDJGQywgMHgyMjcyLCAweDJGNTksIDB4MjI3MywgMHgyRjVBLAotICAgIDB4MjI3NiwgMHgzQzk1LCAweDIyNzcsIDB4M0M5NiwgMHgyMjgyLCAweDAyRTksIDB4MjI4MywgMHgwMkVBLAotICAgIDB4MjI4NCwgMHgzQzcwLCAweDIyODUsIDB4M0M3MSwgMHgyMjg2LCAweDAyRTcsIDB4MjI4NywgMHgwMkU4LAotICAgIDB4MjI4QSwgMHgzQzcyLCAweDIyOEIsIDB4M0M3MywgMHgyMjk1LCAweDJGOUMsIDB4MjI5NiwgMHgyRjlBLAotICAgIDB4MjI5NywgMHgyRjlELCAweDIyOTgsIDB4MkY5QiwgMHgyMjlFLCAweDNFMjIsIDB4MjJBMCwgMHgyRjk5LAotICAgIDB4MjJBNSwgMHgwMkY1LCAweDIyQkYsIDB4MURDRSwgMHgyMkRBLCAweDNENkQsIDB4MjJEQiwgMHgzRDZFLAotICAgIDB4MjMwNSwgMHgzQzc2LCAweDIzMDYsIDB4M0M3NywgMHgyMzA3LCAweDJGQkIsIDB4MjMxMiwgMHgwMkY2LAotICAgIDB4MjMxOCwgMHgzRDcwLCAweDIzOUIsIDB4MkY2RiwgMHgyMzlDLCAweDJGODcsIDB4MjM5RCwgMHgyRjcwLAotICAgIDB4MjM5RSwgMHgyRjcxLCAweDIzOUYsIDB4MkY4NywgMHgyM0EwLCAweDJGNzIsIDB4MjNBMSwgMHgyRjc3LAotICAgIDB4MjNBMiwgMHgyRjg3LCAweDIzQTMsIDB4MkY3OCwgMHgyM0E0LCAweDJGNzksIDB4MjNBNSwgMHgyRjg3LAotICAgIDB4MjNBNiwgMHgyRjdBLCAweDIzQTcsIDB4MUZGMiwgMHgyM0E4LCAweDFGRjMsIDB4MjNBOSwgMHgxRkY0LAotICAgIDB4MjNBQSwgMHgyRjg3LCAweDIzQUIsIDB4MUZFRSwgMHgyM0FDLCAweDFGRUYsIDB4MjNBRCwgMHgxRkYwLAotICAgIDB4MjNCMCwgMHgzRkI4LCAweDIzQjEsIDB4M0ZCOSwgMHgyM0JFLCAweDNGN0QsIDB4MjNCRiwgMHgzRjdFLAotICAgIDB4MjNDMCwgMHgzRjdGLCAweDIzQzEsIDB4M0Y4MCwgMHgyM0MyLCAweDNGODEsIDB4MjNDMywgMHgzRjgyLAotICAgIDB4MjNDNCwgMHgzRjgzLCAweDIzQzUsIDB4M0Y4NCwgMHgyM0M2LCAweDNGODUsIDB4MjNDNywgMHgzRjg2LAotICAgIDB4MjNDOCwgMHgzRjg3LCAweDIzQzksIDB4M0Y4OCwgMHgyM0NBLCAweDNGODksIDB4MjNDQiwgMHgzRjhBLAotICAgIDB4MjNDQywgMHgzRjhCLCAweDIzQ0UsIDB4M0Y5MSwgMHgyNDIzLCAweDNGOTAsIDB4MjQ2MCwgMHgxRDgzLAotICAgIDB4MjQ2MSwgMHgxRDg0LCAweDI0NjIsIDB4MUQ4NSwgMHgyNDYzLCAweDFEODYsIDB4MjQ2NCwgMHgxRDg3LAotICAgIDB4MjQ2NSwgMHgxRDg4LCAweDI0NjYsIDB4MUQ4OSwgMHgyNDY3LCAweDFEOEEsIDB4MjQ2OCwgMHgxRDhCLAotICAgIDB4MjQ2OSwgMHgxRDhDLCAweDI0NkEsIDB4MUQ4RCwgMHgyNDZCLCAweDFEOEUsIDB4MjQ2QywgMHgxRDhGLAotICAgIDB4MjQ2RCwgMHgxRDkwLCAweDI0NkUsIDB4MUQ5MSwgMHgyNDZGLCAweDFEOTIsIDB4MjQ3MCwgMHgxRDkzLAotICAgIDB4MjQ3MSwgMHgxRDk0LCAweDI0NzIsIDB4MUQ5NSwgMHgyNDczLCAweDFEOTYsIDB4MjQ3NCwgMHgxRjg3LAotICAgIDB4MjQ3NSwgMHgxRjg4LCAweDI0NzYsIDB4MUY4OSwgMHgyNDc3LCAweDFGOEEsIDB4MjQ3OCwgMHgxRjhCLAotICAgIDB4MjQ3OSwgMHgxRjhDLCAweDI0N0EsIDB4MUY4RCwgMHgyNDdCLCAweDFGOEUsIDB4MjQ3QywgMHgxRjhGLAotICAgIDB4MjQ3RCwgMHgxRjkwLCAweDI0N0UsIDB4MUY5MSwgMHgyNDdGLCAweDFGOTIsIDB4MjQ4MCwgMHgxRjkzLAotICAgIDB4MjQ4MSwgMHgxRjk0LCAweDI0ODIsIDB4MUY5NSwgMHgyNDgzLCAweDFGOTYsIDB4MjQ4NCwgMHgxRjk3LAotICAgIDB4MjQ4NSwgMHgxRjk4LCAweDI0ODYsIDB4MUY5OSwgMHgyNDg3LCAweDFGOUEsIDB4MjQ4OCwgMHgxRjdFLAotICAgIDB4MjQ4OSwgMHgxRjdGLCAweDI0OEEsIDB4MUY4MCwgMHgyNDhCLCAweDFGODEsIDB4MjQ4QywgMHgxRjgyLAotICAgIDB4MjQ4RCwgMHgxRjgzLCAweDI0OEUsIDB4MUY4NCwgMHgyNDhGLCAweDFGODUsIDB4MjQ5MCwgMHgxRjg2LAotICAgIDB4MjQ5QywgMHgxRkIwLCAweDI0OUQsIDB4MUZCMSwgMHgyNDlFLCAweDFGQjIsIDB4MjQ5RiwgMHgxRkIzLAotICAgIDB4MjRBMCwgMHgxRkI0LCAweDI0QTEsIDB4MUZCNSwgMHgyNEEyLCAweDFGQjYsIDB4MjRBMywgMHgxRkI3LAotICAgIDB4MjRBNCwgMHgxRkI4LCAweDI0QTUsIDB4MUZCOSwgMHgyNEE2LCAweDFGQkEsIDB4MjRBNywgMHgxRkJCLAotICAgIDB4MjRBOCwgMHgxRkJDLCAweDI0QTksIDB4MUZCRCwgMHgyNEFBLCAweDFGQkUsIDB4MjRBQiwgMHgxRkJGLAotICAgIDB4MjRBQywgMHgxRkMwLCAweDI0QUQsIDB4MUZDMSwgMHgyNEFFLCAweDFGQzIsIDB4MjRBRiwgMHgxRkMzLAotICAgIDB4MjRCMCwgMHgxRkM0LCAweDI0QjEsIDB4MUZDNSwgMHgyNEIyLCAweDFGQzYsIDB4MjRCMywgMHgxRkM3LAotICAgIDB4MjRCNCwgMHgxRkM4LCAweDI0QjUsIDB4MUZDOSwgMHgyNEI2LCAweDI4NjMsIDB4MjRCNywgMHgyODY0LAotICAgIDB4MjRCOCwgMHgyODY1LCAweDI0QjksIDB4Mjg2NiwgMHgyNEJBLCAweDI4NjcsIDB4MjRCQiwgMHgyODY4LAotICAgIDB4MjRCQywgMHgyODY5LCAweDI0QkQsIDB4Mjg2QSwgMHgyNEJFLCAweDI4NkIsIDB4MjRCRiwgMHgyODZDLAotICAgIDB4MjRDMCwgMHgyODZELCAweDI0QzEsIDB4Mjg2RSwgMHgyNEMyLCAweDI4NkYsIDB4MjRDMywgMHgyODcwLAotICAgIDB4MjRDNCwgMHgyODcxLCAweDI0QzUsIDB4Mjg3MiwgMHgyNEM2LCAweDI4NzMsIDB4MjRDNywgMHgyODc0LAotICAgIDB4MjRDOCwgMHgyODc1LCAweDI0QzksIDB4Mjg3NiwgMHgyNENBLCAweDI4NzcsIDB4MjRDQiwgMHgyODc4LAotICAgIDB4MjRDQywgMHgyODc5LCAweDI0Q0QsIDB4Mjg3QSwgMHgyNENFLCAweDI4N0IsIDB4MjRDRiwgMHgyODdDLAotICAgIDB4MjREMCwgMHgyODQ5LCAweDI0RDEsIDB4Mjg0QSwgMHgyNEQyLCAweDI4NEIsIDB4MjREMywgMHgyODRDLAotICAgIDB4MjRENCwgMHgyODRELCAweDI0RDUsIDB4Mjg0RSwgMHgyNEQ2LCAweDI4NEYsIDB4MjRENywgMHgyODUwLAotICAgIDB4MjREOCwgMHgyODUxLCAweDI0RDksIDB4Mjg1MiwgMHgyNERBLCAweDI4NTMsIDB4MjREQiwgMHgyODU0LAotICAgIDB4MjREQywgMHgyODU1LCAweDI0REQsIDB4Mjg1NiwgMHgyNERFLCAweDI4NTcsIDB4MjRERiwgMHgyODU4LAotICAgIDB4MjRFMCwgMHgyODU5LCAweDI0RTEsIDB4Mjg1QSwgMHgyNEUyLCAweDI4NUIsIDB4MjRFMywgMHgyODVDLAotICAgIDB4MjRFNCwgMHgyODVELCAweDI0RTUsIDB4Mjg1RSwgMHgyNEU2LCAweDI4NUYsIDB4MjRFNywgMHgyODYwLAotICAgIDB4MjRFOCwgMHgyODYxLCAweDI0RTksIDB4Mjg2MiwgMHgyNEVBLCAweDIwMjAsIDB4MjRFQiwgMHgyOTEzLAotICAgIDB4MjRFQywgMHgyOTE0LCAweDI0RUQsIDB4MjkxNSwgMHgyNEVFLCAweDI5MTYsIDB4MjRFRiwgMHgyOTE3LAotICAgIDB4MjRGMCwgMHgyOTE4LCAweDI0RjEsIDB4MjkxOSwgMHgyNEYyLCAweDI5MUEsIDB4MjRGMywgMHgyOTFCLAotICAgIDB4MjRGNCwgMHgyOTFDLCAweDI0RjUsIDB4M0Y1RiwgMHgyNEY2LCAweDNGNjAsIDB4MjRGNywgMHgzRjYxLAotICAgIDB4MjRGOCwgMHgzRjYyLCAweDI0RjksIDB4M0Y2MywgMHgyNEZBLCAweDNGNjQsIDB4MjRGQiwgMHgzRjY1LAotICAgIDB4MjRGQywgMHgzRjY2LCAweDI0RkQsIDB4M0Y2NywgMHgyNEZFLCAweDNGNjgsIDB4MjRGRiwgMHgyOTA3LAotICAgIDB4MjUwMCwgMHgxRDM3LCAweDI1MDEsIDB4MUQzOCwgMHgyNTAyLCAweDFEMzksIDB4MjUwMywgMHgxRDNBLAotICAgIDB4MjUwNCwgMHgxRDNCLCAweDI1MDUsIDB4MUQzQywgMHgyNTA2LCAweDFEM0QsIDB4MjUwNywgMHgxRDNFLAotICAgIDB4MjUwOCwgMHgxRDNGLCAweDI1MDksIDB4MUQ0MCwgMHgyNTBBLCAweDFENDEsIDB4MjUwQiwgMHgxRDQyLAotICAgIDB4MjUwQywgMHgxRDQzLCAweDI1MEQsIDB4MUQ0NCwgMHgyNTBFLCAweDFENDUsIDB4MjUwRiwgMHgxRDQ2LAotICAgIDB4MjUxMCwgMHgxRDQ3LCAweDI1MTEsIDB4MUQ0OCwgMHgyNTEyLCAweDFENDksIDB4MjUxMywgMHgxRDRBLAotICAgIDB4MjUxNCwgMHgxRDRCLCAweDI1MTUsIDB4MUQ0QywgMHgyNTE2LCAweDFENEQsIDB4MjUxNywgMHgxRDRFLAotICAgIDB4MjUxOCwgMHgxRDRGLCAweDI1MTksIDB4MUQ1MCwgMHgyNTFBLCAweDFENTEsIDB4MjUxQiwgMHgxRDUyLAotICAgIDB4MjUxQywgMHgxRDUzLCAweDI1MUQsIDB4MUQ1NCwgMHgyNTFFLCAweDFENTUsIDB4MjUxRiwgMHgxRDU2LAotICAgIDB4MjUyMCwgMHgxRDU3LCAweDI1MjEsIDB4MUQ1OCwgMHgyNTIyLCAweDFENTksIDB4MjUyMywgMHgxRDVBLAotICAgIDB4MjUyNCwgMHgxRDVCLCAweDI1MjUsIDB4MUQ1QywgMHgyNTI2LCAweDFENUQsIDB4MjUyNywgMHgxRDVFLAotICAgIDB4MjUyOCwgMHgxRDVGLCAweDI1MjksIDB4MUQ2MCwgMHgyNTJBLCAweDFENjEsIDB4MjUyQiwgMHgxRDYyLAotICAgIDB4MjUyQywgMHgxRDYzLCAweDI1MkQsIDB4MUQ2NCwgMHgyNTJFLCAweDFENjUsIDB4MjUyRiwgMHgxRDY2LAotICAgIDB4MjUzMCwgMHgxRDY3LCAweDI1MzEsIDB4MUQ2OCwgMHgyNTMyLCAweDFENjksIDB4MjUzMywgMHgxRDZBLAotICAgIDB4MjUzNCwgMHgxRDZCLCAweDI1MzUsIDB4MUQ2QywgMHgyNTM2LCAweDFENkQsIDB4MjUzNywgMHgxRDZFLAotICAgIDB4MjUzOCwgMHgxRDZGLCAweDI1MzksIDB4MUQ3MCwgMHgyNTNBLCAweDFENzEsIDB4MjUzQiwgMHgxRDcyLAotICAgIDB4MjUzQywgMHgxRDczLCAweDI1M0QsIDB4MUQ3NCwgMHgyNTNFLCAweDFENzUsIDB4MjUzRiwgMHgxRDc2LAotICAgIDB4MjU0MCwgMHgxRDc3LCAweDI1NDEsIDB4MUQ3OCwgMHgyNTQyLCAweDFENzksIDB4MjU0MywgMHgxRDdBLAotICAgIDB4MjU0NCwgMHgxRDdCLCAweDI1NDUsIDB4MUQ3QywgMHgyNTQ2LCAweDFEN0QsIDB4MjU0NywgMHgxRDdFLAotICAgIDB4MjU0OCwgMHgxRDdGLCAweDI1NDksIDB4MUQ4MCwgMHgyNTRBLCAweDFEODEsIDB4MjU0QiwgMHgxRDgyLAotICAgIDB4MjU1MCwgMHgyMDNCLCAweDI1NUUsIDB4MjAzQywgMHgyNTYxLCAweDIwM0UsIDB4MjU2QSwgMHgyMDNELAotICAgIDB4MjU2RCwgMHgyMDM3LCAweDI1NkUsIDB4MjAzOCwgMHgyNTZGLCAweDIwM0EsIDB4MjU3MCwgMHgyMDM5LAotICAgIDB4MjU3MSwgMHgyMDQ1LCAweDI1NzIsIDB4MjA0NiwgMHgyNTczLCAweDIwNDcsIDB4MjU4MSwgMHgyMDI2LAotICAgIDB4MjU4MiwgMHgyMDI3LCAweDI1ODMsIDB4MjAyOCwgMHgyNTg0LCAweDIwMjksIDB4MjU4NSwgMHgyMDJBLAotICAgIDB4MjU4NiwgMHgyMDJCLCAweDI1ODcsIDB4MjAyQywgMHgyNTg4LCAweDIwMkQsIDB4MjU4OSwgMHgyMDM0LAotICAgIDB4MjU4QSwgMHgyMDMzLCAweDI1OEIsIDB4MjAzMiwgMHgyNThDLCAweDIwMzEsIDB4MjU4RCwgMHgyMDMwLAotICAgIDB4MjU4RSwgMHgyMDJGLCAweDI1OEYsIDB4MjAyRSwgMHgyNTk0LCAweDIwMzUsIDB4MjU5NSwgMHgyMDM2LAotICAgIDB4MjVBMCwgMHgwMkQ5LCAweDI1QTEsIDB4MDJEOCwgMHgyNUEyLCAweDFGNEYsIDB4MjVBQSwgMHgyRkNGLAotICAgIDB4MjVBQiwgMHgyRkNELCAweDI1QjEsIDB4M0Y2QiwgMHgyNUIyLCAweDAyREIsIDB4MjVCMywgMHgwMkRBLAotICAgIDB4MjVCNiwgMHgyRkEzLCAweDI1QjcsIDB4MUY0QSwgMHgyNUJDLCAweDAyREQsIDB4MjVCRCwgMHgwMkRDLAotICAgIDB4MjVDMCwgMHgyRkEyLCAweDI1QzEsIDB4MUY0OSwgMHgyNUM2LCAweDAyRDcsIDB4MjVDNywgMHgwMkQ2LAotICAgIDB4MjVDOSwgMHgyMDEyLCAweDI1Q0IsIDB4MDJEMywgMHgyNUNDLCAweDI5MDYsIDB4MjVDRSwgMHgwMkQ1LAotICAgIDB4MjVDRiwgMHgwMkQ0LCAweDI1RDAsIDB4M0Y5MiwgMHgyNUQxLCAweDNGOTMsIDB4MjVEMiwgMHgzRjk0LAotICAgIDB4MjVEMywgMHgzRjk1LCAweDI1RTIsIDB4MjAzRiwgMHgyNUUzLCAweDIwNDAsIDB4MjVFNCwgMHgyMDQyLAotICAgIDB4MjVFNSwgMHgyMDQxLCAweDI1RTYsIDB4MkZERSwgMHgyNUVGLCAweDAzMEIsIDB4MjYwMCwgMHgyMDE3LAotICAgIDB4MjYwMSwgMHgyMDE4LCAweDI2MDIsIDB4MjAxOSwgMHgyNjAzLCAweDIwMUEsIDB4MjYwNSwgMHgwMkQyLAotICAgIDB4MjYwNiwgMHgwMkQxLCAweDI2MEUsIDB4MUY3OCwgMHgyNjE2LCAweDNGNjksIDB4MjYxNywgMHgzRjZBLAotICAgIDB4MjYxQywgMHgyMDFDLCAweDI2MUQsIDB4MjAxRCwgMHgyNjFFLCAweDIwMUIsIDB4MjYxRiwgMHgyMDFFLAotICAgIDB4MjY0MCwgMHgwMkMyLCAweDI2NDIsIDB4MDJDMSwgMHgyNjYwLCAweDIwMTMsIDB4MjY2MSwgMHgxRjUxLAotICAgIDB4MjY2MiwgMHgxRjUzLCAweDI2NjMsIDB4MjAxNSwgMHgyNjY0LCAweDFGNTIsIDB4MjY2NSwgMHgyMDE0LAotICAgIDB4MjY2NiwgMHgyMDE2LCAweDI2NjcsIDB4MUY1MCwgMHgyNjY4LCAweDJGNDIsIDB4MjY2OSwgMHgyRjQzLAotICAgIDB4MjY2QSwgMHgwMzA3LCAweDI2NkIsIDB4M0Y0OCwgMHgyNjZDLCAweDJGNDQsIDB4MjY2RCwgMHgwMzA2LAotICAgIDB4MjY2RSwgMHgzRjQ3LCAweDI2NkYsIDB4MDMwNSwgMHgyNjcyLCAweDNGQkEsIDB4MjY3MywgMHgzRkJCLAotICAgIDB4MjY3NCwgMHgzRkJDLCAweDI2NzUsIDB4M0ZCRCwgMHgyNjc2LCAweDNGQkUsIDB4MjY3NywgMHgzRkJGLAotICAgIDB4MjY3OCwgMHgzRkMwLCAweDI2NzksIDB4M0ZDMSwgMHgyNjdBLCAweDNGQzIsIDB4MjY3QiwgMHgzRkMzLAotICAgIDB4MjY3QywgMHgzRkM0LCAweDI2N0QsIDB4M0ZDNSwgMHgyNkEwLCAweDJGQTAsIDB4MjcwMiwgMHgyRjkwLAotICAgIDB4MjcxMywgMHgzRjhFLCAweDI3MUEsIDB4MkZEMSwgMHgyNzNGLCAweDJGQzUsIDB4Mjc0MCwgMHgyRkM0LAotICAgIDB4Mjc1NiwgMHgyRkUzLCAweDI3NzYsIDB4MjA1RSwgMHgyNzc3LCAweDIwNUYsIDB4Mjc3OCwgMHgyMDYwLAotICAgIDB4Mjc3OSwgMHgyMDYxLCAweDI3N0EsIDB4MjA2MiwgMHgyNzdCLCAweDIwNjMsIDB4Mjc3QywgMHgyMDY0LAotICAgIDB4Mjc3RCwgMHgyMDY1LCAweDI3N0UsIDB4MjA2NiwgMHgyNzdGLCAweDI5MTIsIDB4MjdBMSwgMHgyMDBFLAotICAgIDB4MjkzNCwgMHgzRjQ5LCAweDI5MzUsIDB4M0Y0QSwgMHgyOUJGLCAweDNGNEIsIDB4MjlGQSwgMHgzRjRGLAotICAgIDB4MjlGQiwgMHgzRjUwLCAweDJCMDUsIDB4MjAwRiwgMHgyQjA2LCAweDIwMTAsIDB4MkIwNywgMHgyMDExLAotICAgIDB4MkU4MywgMHgzN0UxLCAweDJFODUsIDB4MzYyMCwgMHgyRTg3LCAweDM3MTksIDB4MkU4OSwgMHgzODE0LAotICAgIDB4MkU4QiwgMHgzNzFFLCAweDJFOEMsIDB4MzYwOSwgMHgyRThELCAweDM2MEEsIDB4MkU4RSwgMHgxMDcxLAotICAgIDB4MkU4RiwgMHgzODhDLCAweDJFOTAsIDB4MTIyNiwgMHgyRTkyLCAweDBFQjIsIDB4MkU5MywgMHgxMjgzLAotICAgIDB4MkU5NCwgMHgxMkFCLCAweDJFOTUsIDB4M0MxRiwgMHgyRTk2LCAweDM4QzIsIDB4MkU5NywgMHgzNjFDLAotICAgIDB4MkU5OCwgMHgzOEUxLCAweDJFOTksIDB4MTNDMywgMHgyRTlCLCAweDEzRTEsIDB4MkU5RSwgMHg0NUU1LAotICAgIDB4MkU5RiwgMHgwRTNDLCAweDJFQTAsIDB4MEVCRCwgMHgyRUExLCAweDM5NjEsIDB4MkVBMiwgMHgzOTYyLAotICAgIDB4MkVBMywgMHgzOTlELCAweDJFQTQsIDB4M0MyNiwgMHgyRUE2LCAweDM3NEQsIDB4MkVBOCwgMHgzOUJDLAotICAgIDB4MkVBOSwgMHgzNUExLCAweDJFQUEsIDB4MzZBQiwgMHgyRUFCLCAweDNBOTcsIDB4MkVBQywgMHg0QUJBLAotICAgIDB4MkVBRCwgMHgzQTM5LCAweDJFQUUsIDB4MzY2MiwgMHgyRUIxLCAweDNBOTgsIDB4MkVCMiwgMHgzQTk3LAotICAgIDB4MkVCMywgMHgzNzZELCAweDJFQjcsIDB4MzZGRSwgMHgyRUI5LCAweDM3MTMsIDB4MkVCQywgMHgzNUIzLAotICAgIDB4MkVCRCwgMHgzNTRFLCAweDJFQkUsIDB4Mzc3NSwgMHgyRUJGLCAweDM3NzYsIDB4MkVDMCwgMHgzNzc3LAotICAgIDB4MkVDMSwgMHgwNzhCLCAweDJFQzIsIDB4M0IwQSwgMHgyRUMzLCAweDM2MkUsIDB4MkVDNCwgMHgwQTYyLAotICAgIDB4MkVDNiwgMHgzNTcyLCAweDJFQ0EsIDB4MzY0QSwgMHgyRUNDLCAweDNDMkIsIDB4MkVDRCwgMHgzQjUwLAotICAgIDB4MkVDRiwgMHgzQjlFLCAweDJFRDEsIDB4MEJENSwgMHgyRUQyLCAweDNCOTcsIDB4MkVENiwgMHgzQjlFLAotICAgIDB4MkVENywgMHgzNTRELCAweDJFRDgsIDB4MEE2OCwgMHgyRURELCAweDM2MTcsIDB4MkVERSwgMHgzNjE5LAotICAgIDB4MkVERiwgMHgzNjE4LCAweDJFRTQsIDB4MDY0RSwgMHgyRUU4LCAweDBEMzQsIDB4MkVFOSwgMHgwNTJCLAotICAgIDB4MkVFQiwgMHgwQTZBLCAweDJFRUQsIDB4MDhDMywgMHgyRUVGLCAweDBGN0QsIDB4MkVGMiwgMHgwNjRGLAotICAgIDB4MkYwMCwgMHgwNEIwLCAweDJGMDEsIDB4MjBCMywgMHgyRjAyLCAweDBGRkYsIDB4MkYwMywgMHgxMDAxLAotICAgIDB4MkYwNCwgMHgwNTM1LCAweDJGMDUsIDB4MTAwNiwgMHgyRjA2LCAweDBDQ0IsIDB4MkYwNywgMHgxMDBFLAotICAgIDB4MkYwOCwgMHgwQTEzLCAweDJGMDksIDB4MTA3MCwgMHgyRjBBLCAweDBDRDYsIDB4MkYwQiwgMHgwRDQwLAotICAgIDB4MkYwQywgMHgxMDdCLCAweDJGMEQsIDB4MTA4MywgMHgyRjBFLCAweDEwODksIDB4MkYwRiwgMHgxMDkzLAotICAgIDB4MkYxMCwgMHgxMDk4LCAweDJGMTEsIDB4MEM1QiwgMHgyRjEyLCAweDBGOTcsIDB4MkYxMywgMHgxMEM2LAotICAgIDB4MkYxNCwgMHgxMENELCAweDJGMTUsIDB4MTBDRSwgMHgyRjE2LCAweDEwRDMsIDB4MkYxNywgMHgwOTQ3LAotICAgIDB4MkYxOCwgMHgwRTdDLCAweDJGMTksIDB4MTBEQywgMHgyRjFBLCAweDEwRTEsIDB4MkYxQiwgMHgxMEU4LAotICAgIDB4MkYxQywgMHgwRUEyLCAweDJGMUQsIDB4MDdCMSwgMHgyRjFFLCAweDExNkIsIDB4MkYxRiwgMHgwQzU0LAotICAgIDB4MkYyMCwgMHgwODlDLCAweDJGMjEsIDB4MTFCQSwgMHgyRjIyLCAweDExQkIsIDB4MkYyMywgMHgwRjI2LAotICAgIDB4MkYyNCwgMHgwQjQ3LCAweDJGMjUsIDB4MDk4MSwgMHgyRjI2LCAweDA4QTAsIDB4MkYyNywgMHgxMjBFLAotICAgIDB4MkYyOCwgMHgwQTQ3LCAweDJGMjksIDB4MDk5NiwgMHgyRjJBLCAweDEyMjYsIDB4MkYyQiwgMHgxMjI4LAotICAgIDB4MkYyQywgMHgxMjMyLCAweDJGMkQsIDB4MDg4MSwgMHgyRjJFLCAweDEyNkMsIDB4MkYyRiwgMHgwN0JCLAotICAgIDB4MkYzMCwgMHgwNzdFLCAweDJGMzEsIDB4MDZDQSwgMHgyRjMyLCAweDA1RUYsIDB4MkYzMywgMHgxMjgzLAotICAgIDB4MkYzNCwgMHgxMjg1LCAweDJGMzUsIDB4MTI5OSwgMHgyRjM2LCAweDEyOUIsIDB4MkYzNywgMHgxMkEwLAotICAgIDB4MkYzOCwgMHgwNjc3LCAweDJGMzksIDB4MzhCOSwgMHgyRjNBLCAweDEyQUYsIDB4MkYzQiwgMHgxMkIxLAotICAgIDB4MkYzQywgMHgwOUZBLCAweDJGM0QsIDB4MTM0MiwgMHgyRjNFLCAweDA3ODEsIDB4MkYzRiwgMHgwOTE2LAotICAgIDB4MkY0MCwgMHgwOEE3LCAweDJGNDEsIDB4MTNDMiwgMHgyRjQyLCAweDBFMDgsIDB4MkY0MywgMHgwQzQ3LAotICAgIDB4MkY0NCwgMHgwNkNDLCAweDJGNDUsIDB4MEU0RCwgMHgyRjQ2LCAweDEzRTAsIDB4MkY0NywgMHgwQ0Q0LAotICAgIDB4MkY0OCwgMHgxNDBDLCAweDJGNDksIDB4MDc0NCwgMHgyRjRBLCAweDBFRTYsIDB4MkY0QiwgMHgwNzNELAotICAgIDB4MkY0QywgMHgwOEFELCAweDJGNEQsIDB4MTRFNSwgMHgyRjRFLCAweDE0RjQsIDB4MkY0RiwgMHgxNEY4LAotICAgIDB4MkY1MCwgMHgwRDdBLCAweDJGNTEsIDB4MEVERiwgMHgyRjUyLCAweDA4QUYsIDB4MkY1MywgMHgxNTAyLAotICAgIDB4MkY1NCwgMHgwQTJCLCAweDJGNTUsIDB4MDU1MCwgMHgyRjU2LCAweDBCRkEsIDB4MkY1NywgMHgwREQ1LAotICAgIDB4MkY1OCwgMHgxNUU0LCAweDJGNTksIDB4MTVFNiwgMHgyRjVBLCAweDBFMjIsIDB4MkY1QiwgMHgwNTY3LAotICAgIDB4MkY1QywgMHgwNjg3LCAweDJGNUQsIDB4MDc1OCwgMHgyRjVFLCAweDA3NzAsIDB4MkY1RiwgMHgwNkM0LAotICAgIDB4MkY2MCwgMHgwNERELCAweDJGNjEsIDB4MDVFMCwgMHgyRjYyLCAweDA2MDEsIDB4MkY2MywgMHgwQTVDLAotICAgIDB4MkY2NCwgMHgwRjNCLCAweDJGNjUsIDB4MEMzRSwgMHgyRjY2LCAweDBEOTcsIDB4MkY2NywgMHgzQTAwLAotICAgIDB4MkY2OCwgMHgxNjk3LCAweDJGNjksIDB4MEQyOCwgMHgyRjZBLCAweDBEN0QsIDB4MkY2QiwgMHgwODdDLAotICAgIDB4MkY2QywgMHgwRUU4LCAweDJGNkQsIDB4MEVDMywgMHgyRjZFLCAweDBFRkMsIDB4MkY2RiwgMHgwQTc0LAotICAgIDB4MkY3MCwgMHgwOEQ0LCAweDJGNzEsIDB4M0E0MSwgMHgyRjcyLCAweDA1NTMsIDB4MkY3MywgMHgwNzQwLAotICAgIDB4MkY3NCwgMHgwRjcxLCAweDJGNzUsIDB4MEI5QiwgMHgyRjc2LCAweDBFMTYsIDB4MkY3NywgMHgwOEIzLAotICAgIDB4MkY3OCwgMHgwNjA4LCAweDJGNzksIDB4MTgxMywgMHgyRjdBLCAweDBGM0QsIDB4MkY3QiwgMHgwNENCLAotICAgIDB4MkY3QywgMHgwRkRELCAweDJGN0QsIDB4MDhENSwgMHgyRjdFLCAweDE4M0QsIDB4MkY3RiwgMHgwOEQ2LAotICAgIDB4MkY4MCwgMHgxODUzLCAweDJGODEsIDB4MENEMSwgMHgyRjgyLCAweDBBMDksIDB4MkY4MywgMHgwOEQ3LAotICAgIDB4MkY4NCwgMHgwOEI4LCAweDJGODUsIDB4MDREMywgMHgyRjg2LCAweDBBODksIDB4MkY4NywgMHgwQUE2LAotICAgIDB4MkY4OCwgMHgwOTM4LCAweDJGODksIDB4MDgyMSwgMHgyRjhBLCAweDA5RUQsIDB4MkY4QiwgMHgxOEIyLAotICAgIDB4MkY4QywgMHgxOTRGLCAweDJGOEQsIDB4MEJBQywgMHgyRjhFLCAweDA3NDIsIDB4MkY4RiwgMHgwN0U2LAotICAgIDB4MkY5MCwgMHgwNEE1LCAweDJGOTEsIDB4MTlFQiwgMHgyRjkyLCAweDA3NUYsIDB4MkY5MywgMHgwNUFGLAotICAgIDB4MkY5NCwgMHgwNzc0LCAweDJGOTUsIDB4MEI2OSwgMHgyRjk2LCAweDBDN0UsIDB4MkY5NywgMHgxQTU2LAotICAgIDB4MkY5OCwgMHgxQTU5LCAweDJGOTksIDB4MDU4QiwgMHgyRjlBLCAweDBBN0EsIDB4MkY5QiwgMHgwQUY4LAotICAgIDB4MkY5QywgMHgwQjBELCAweDJGOUQsIDB4MEEwRSwgMHgyRjlFLCAweDA5MDIsIDB4MkY5RiwgMHgwQTBGLAotICAgIDB4MkZBMCwgMHgwQjYyLCAweDJGQTEsIDB4M0I0RiwgMHgyRkEyLCAweDBGMjIsIDB4MkZBMywgMHgwQ0FCLAotICAgIDB4MkZBNCwgMHgwRDY0LCAweDJGQTUsIDB4MEY2QywgMHgyRkE2LCAweDA2REEsIDB4MkZBNywgMHgwQkQ1LAotICAgIDB4MkZBOCwgMHgwRUYzLCAweDJGQTksIDB4MERERSwgMHgyRkFBLCAweDFCQzksIDB4MkZBQiwgMHgxQkNCLAotICAgIDB4MkZBQywgMHgwNENELCAweDJGQUQsIDB4MjFGNywgMHgyRkFFLCAweDBEODcsIDB4MkZBRiwgMHgwRUQ4LAotICAgIDB4MkZCMCwgMHgwNUI1LCAweDJGQjEsIDB4MUMwMywgMHgyRkIyLCAweDFDMDUsIDB4MkZCMywgMHgwNTNCLAotICAgIDB4MkZCNCwgMHgwRTE3LCAweDJGQjUsIDB4MERFOSwgMHgyRkI2LCAweDBEODgsIDB4MkZCNywgMHgwOUVGLAotICAgIDB4MkZCOCwgMHgwOTFGLCAweDJGQjksIDB4MDdGMywgMHgyRkJBLCAweDBEMDUsIDB4MkZCQiwgMHgwODBFLAotICAgIDB4MkZCQywgMHgwN0Y0LCAweDJGQkQsIDB4MUM2QywgMHgyRkJFLCAweDFDN0QsIDB4MkZCRiwgMHgxQzgzLAotICAgIDB4MkZDMCwgMHgxQzg0LCAweDJGQzEsIDB4MDY0RSwgMHgyRkMyLCAweDA2OTUsIDB4MkZDMywgMHgwQkQ3LAotICAgIDB4MkZDNCwgMHgxQ0Y2LCAweDJGQzUsIDB4MDhEQiwgMHgyRkM2LCAweDFEMDEsIDB4MkZDNywgMHgwRTkxLAotICAgIDB4MkZDOCwgMHgzNDBCLCAweDJGQzksIDB4MDY2QSwgMHgyRkNBLCAweDA4MDcsIDB4MkZDQiwgMHgxRDE2LAotICAgIDB4MkZDQywgMHgxRDE5LCAweDJGQ0QsIDB4MEMxRSwgMHgyRkNFLCAweDA3OTEsIDB4MkZDRiwgMHgwQUNGLAotICAgIDB4MkZEMCwgMHgwRDkzLCAweDJGRDEsIDB4MUQyMSwgMHgyRkQyLCAweDFEMjIsIDB4MkZEMywgMHgwRjdFLAotICAgIDB4MkZENCwgMHgxRDMwLCAweDJGRDUsIDB4MUQzMSwgMHgzMDAwLCAweDAyNzksIDB4MzAwMSwgMHgwMjdBLAotICAgIDB4MzAwMiwgMHgwMjdCLCAweDMwMDMsIDB4MDI4RiwgMHgzMDA0LCAweDIwNzQsIDB4MzAwNSwgMHgwMjkxLAotICAgIDB4MzAwNiwgMHgwMjkyLCAweDMwMDcsIDB4MDI5MywgMHgzMDA4LCAweDAyQUEsIDB4MzAwOSwgMHgwMkFCLAotICAgIDB4MzAwQSwgMHgwMkFDLCAweDMwMEIsIDB4MDJBRCwgMHgzMDBDLCAweDAyQUUsIDB4MzAwRCwgMHgwMkFGLAotICAgIDB4MzAwRSwgMHgwMkIwLCAweDMwMEYsIDB4MDJCMSwgMHgzMDEwLCAweDAyQjIsIDB4MzAxMSwgMHgwMkIzLAotICAgIDB4MzAxMiwgMHgwMkRGLCAweDMwMTMsIDB4MDJFNCwgMHgzMDE0LCAweDAyQTQsIDB4MzAxNSwgMHgwMkE1LAotICAgIDB4MzAxNiwgMHgzRjQ1LCAweDMwMTcsIDB4M0Y0NiwgMHgzMDE4LCAweDJGNjEsIDB4MzAxOSwgMHgyRjYyLAotICAgIDB4MzAxQywgMHgwMjk5LCAweDMwMUQsIDB4MURCOCwgMHgzMDFGLCAweDFEQjksIDB4MzAyMCwgMHgxRjdBLAotICAgIDB4MzAzMCwgMHgyRkJBLCAweDMwMzMsIDB4MkY0QywgMHgzMDM0LCAweDJGNEQsIDB4MzAzNSwgMHgyRjRFLAotICAgIDB4MzAzNiwgMHgxRjc5LCAweDMwM0IsIDB4MkY0QSwgMHgzMDNDLCAweDNGNDIsIDB4MzAzRCwgMHgyRjkzLAotICAgIDB4MzA0MSwgMHgwMzRBLCAweDMwNDIsIDB4MDM0QiwgMHgzMDQzLCAweDAzNEMsIDB4MzA0NCwgMHgwMzRELAotICAgIDB4MzA0NSwgMHgwMzRFLCAweDMwNDYsIDB4MDM0RiwgMHgzMDQ3LCAweDAzNTAsIDB4MzA0OCwgMHgwMzUxLAotICAgIDB4MzA0OSwgMHgwMzUyLCAweDMwNEEsIDB4MDM1MywgMHgzMDRCLCAweDAzNTQsIDB4MzA0QywgMHgwMzU1LAotICAgIDB4MzA0RCwgMHgwMzU2LCAweDMwNEUsIDB4MDM1NywgMHgzMDRGLCAweDAzNTgsIDB4MzA1MCwgMHgwMzU5LAotICAgIDB4MzA1MSwgMHgwMzVBLCAweDMwNTIsIDB4MDM1QiwgMHgzMDUzLCAweDAzNUMsIDB4MzA1NCwgMHgwMzVELAotICAgIDB4MzA1NSwgMHgwMzVFLCAweDMwNTYsIDB4MDM1RiwgMHgzMDU3LCAweDAzNjAsIDB4MzA1OCwgMHgwMzYxLAotICAgIDB4MzA1OSwgMHgwMzYyLCAweDMwNUEsIDB4MDM2MywgMHgzMDVCLCAweDAzNjQsIDB4MzA1QywgMHgwMzY1LAotICAgIDB4MzA1RCwgMHgwMzY2LCAweDMwNUUsIDB4MDM2NywgMHgzMDVGLCAweDAzNjgsIDB4MzA2MCwgMHgwMzY5LAotICAgIDB4MzA2MSwgMHgwMzZBLCAweDMwNjIsIDB4MDM2QiwgMHgzMDYzLCAweDAzNkMsIDB4MzA2NCwgMHgwMzZELAotICAgIDB4MzA2NSwgMHgwMzZFLCAweDMwNjYsIDB4MDM2RiwgMHgzMDY3LCAweDAzNzAsIDB4MzA2OCwgMHgwMzcxLAotICAgIDB4MzA2OSwgMHgwMzcyLCAweDMwNkEsIDB4MDM3MywgMHgzMDZCLCAweDAzNzQsIDB4MzA2QywgMHgwMzc1LAotICAgIDB4MzA2RCwgMHgwMzc2LCAweDMwNkUsIDB4MDM3NywgMHgzMDZGLCAweDAzNzgsIDB4MzA3MCwgMHgwMzc5LAotICAgIDB4MzA3MSwgMHgwMzdBLCAweDMwNzIsIDB4MDM3QiwgMHgzMDczLCAweDAzN0MsIDB4MzA3NCwgMHgwMzdELAotICAgIDB4MzA3NSwgMHgwMzdFLCAweDMwNzYsIDB4MDM3RiwgMHgzMDc3LCAweDAzODAsIDB4MzA3OCwgMHgwMzgxLAotICAgIDB4MzA3OSwgMHgwMzgyLCAweDMwN0EsIDB4MDM4MywgMHgzMDdCLCAweDAzODQsIDB4MzA3QywgMHgwMzg1LAotICAgIDB4MzA3RCwgMHgwMzg2LCAweDMwN0UsIDB4MDM4NywgMHgzMDdGLCAweDAzODgsIDB4MzA4MCwgMHgwMzg5LAotICAgIDB4MzA4MSwgMHgwMzhBLCAweDMwODIsIDB4MDM4QiwgMHgzMDgzLCAweDAzOEMsIDB4MzA4NCwgMHgwMzhELAotICAgIDB4MzA4NSwgMHgwMzhFLCAweDMwODYsIDB4MDM4RiwgMHgzMDg3LCAweDAzOTAsIDB4MzA4OCwgMHgwMzkxLAotICAgIDB4MzA4OSwgMHgwMzkyLCAweDMwOEEsIDB4MDM5MywgMHgzMDhCLCAweDAzOTQsIDB4MzA4QywgMHgwMzk1LAotICAgIDB4MzA4RCwgMHgwMzk2LCAweDMwOEUsIDB4MDM5NywgMHgzMDhGLCAweDAzOTgsIDB4MzA5MCwgMHgwMzk5LAotICAgIDB4MzA5MSwgMHgwMzlBLCAweDMwOTIsIDB4MDM5QiwgMHgzMDkzLCAweDAzOUMsIDB4MzA5NCwgMHgxRjE2LAotICAgIDB4MzA5NSwgMHgxRjE3LCAweDMwOTYsIDB4MUYxOCwgMHgzMDk5LCAweDNGQzYsIDB4MzA5QSwgMHgzRkM3LAotICAgIDB4MzA5QiwgMHgwMjgzLCAweDMwOUMsIDB4MDI4NCwgMHgzMDlELCAweDAyOEQsIDB4MzA5RSwgMHgwMjhFLAotICAgIDB4MzA5RiwgMHgyRjk1LCAweDMwQTAsIDB4M0Y0RCwgMHgzMEExLCAweDAzOUQsIDB4MzBBMiwgMHgwMzlFLAotICAgIDB4MzBBMywgMHgwMzlGLCAweDMwQTQsIDB4MDNBMCwgMHgzMEE1LCAweDAzQTEsIDB4MzBBNiwgMHgwM0EyLAotICAgIDB4MzBBNywgMHgwM0EzLCAweDMwQTgsIDB4MDNBNCwgMHgzMEE5LCAweDAzQTUsIDB4MzBBQSwgMHgwM0E2LAotICAgIDB4MzBBQiwgMHgwM0E3LCAweDMwQUMsIDB4MDNBOCwgMHgzMEFELCAweDAzQTksIDB4MzBBRSwgMHgwM0FBLAotICAgIDB4MzBBRiwgMHgwM0FCLCAweDMwQjAsIDB4MDNBQywgMHgzMEIxLCAweDAzQUQsIDB4MzBCMiwgMHgwM0FFLAotICAgIDB4MzBCMywgMHgwM0FGLCAweDMwQjQsIDB4MDNCMCwgMHgzMEI1LCAweDAzQjEsIDB4MzBCNiwgMHgwM0IyLAotICAgIDB4MzBCNywgMHgwM0IzLCAweDMwQjgsIDB4MDNCNCwgMHgzMEI5LCAweDAzQjUsIDB4MzBCQSwgMHgwM0I2LAotICAgIDB4MzBCQiwgMHgwM0I3LCAweDMwQkMsIDB4MDNCOCwgMHgzMEJELCAweDAzQjksIDB4MzBCRSwgMHgwM0JBLAotICAgIDB4MzBCRiwgMHgwM0JCLCAweDMwQzAsIDB4MDNCQywgMHgzMEMxLCAweDAzQkQsIDB4MzBDMiwgMHgwM0JFLAotICAgIDB4MzBDMywgMHgwM0JGLCAweDMwQzQsIDB4MDNDMCwgMHgzMEM1LCAweDAzQzEsIDB4MzBDNiwgMHgwM0MyLAotICAgIDB4MzBDNywgMHgwM0MzLCAweDMwQzgsIDB4MDNDNCwgMHgzMEM5LCAweDAzQzUsIDB4MzBDQSwgMHgwM0M2LAotICAgIDB4MzBDQiwgMHgwM0M3LCAweDMwQ0MsIDB4MDNDOCwgMHgzMENELCAweDAzQzksIDB4MzBDRSwgMHgwM0NBLAotICAgIDB4MzBDRiwgMHgwM0NCLCAweDMwRDAsIDB4MDNDQywgMHgzMEQxLCAweDAzQ0QsIDB4MzBEMiwgMHgwM0NFLAotICAgIDB4MzBEMywgMHgwM0NGLCAweDMwRDQsIDB4MDNEMCwgMHgzMEQ1LCAweDAzRDEsIDB4MzBENiwgMHgwM0QyLAotICAgIDB4MzBENywgMHgwM0QzLCAweDMwRDgsIDB4MDNENCwgMHgzMEQ5LCAweDAzRDUsIDB4MzBEQSwgMHgwM0Q2LAotICAgIDB4MzBEQiwgMHgwM0Q3LCAweDMwREMsIDB4MDNEOCwgMHgzMERELCAweDAzRDksIDB4MzBERSwgMHgwM0RBLAotICAgIDB4MzBERiwgMHgwM0RCLCAweDMwRTAsIDB4MDNEQywgMHgzMEUxLCAweDAzREQsIDB4MzBFMiwgMHgwM0RFLAotICAgIDB4MzBFMywgMHgwM0RGLCAweDMwRTQsIDB4MDNFMCwgMHgzMEU1LCAweDAzRTEsIDB4MzBFNiwgMHgwM0UyLAotICAgIDB4MzBFNywgMHgwM0UzLCAweDMwRTgsIDB4MDNFNCwgMHgzMEU5LCAweDAzRTUsIDB4MzBFQSwgMHgwM0U2LAotICAgIDB4MzBFQiwgMHgwM0U3LCAweDMwRUMsIDB4MDNFOCwgMHgzMEVELCAweDAzRTksIDB4MzBFRSwgMHgwM0VBLAotICAgIDB4MzBFRiwgMHgwM0VCLCAweDMwRjAsIDB4MDNFQywgMHgzMEYxLCAweDAzRUQsIDB4MzBGMiwgMHgwM0VFLAotICAgIDB4MzBGMywgMHgwM0VGLCAweDMwRjQsIDB4MDNGMCwgMHgzMEY1LCAweDAzRjEsIDB4MzBGNiwgMHgwM0YyLAotICAgIDB4MzBGNywgMHgyMDc5LCAweDMwRjgsIDB4MjA3QSwgMHgzMEY5LCAweDIwN0IsIDB4MzBGQSwgMHgyMDdDLAotICAgIDB4MzBGQiwgMHgwMjdFLCAweDMwRkMsIDB4MDI5NCwgMHgzMEZELCAweDAyOEIsIDB4MzBGRSwgMHgwMjhDLAotICAgIDB4MzBGRiwgMHgzRjQzLCAweDMxOTAsIDB4M0Y5QiwgMHgzMTkxLCAweDNGOUMsIDB4MzE5MiwgMHgzRjlELAotICAgIDB4MzE5MywgMHgzRjlFLCAweDMxOTQsIDB4M0Y5RiwgMHgzMTk1LCAweDNGQTAsIDB4MzE5NiwgMHgzRkExLAotICAgIDB4MzE5NywgMHgzRkEyLCAweDMxOTgsIDB4M0ZBMywgMHgzMTk5LCAweDNGQTQsIDB4MzE5QSwgMHgzRkE1LAotICAgIDB4MzE5QiwgMHgzRkE2LCAweDMxOUMsIDB4M0ZBNywgMHgzMTlELCAweDNGQTgsIDB4MzE5RSwgMHgzRkE5LAotICAgIDB4MzE5RiwgMHgzRkFBLCAweDMxRjAsIDB4M0Y2QywgMHgzMUYxLCAweDNGNkQsIDB4MzFGMiwgMHgzRjZFLAotICAgIDB4MzFGMywgMHgzRjZGLCAweDMxRjQsIDB4M0Y3MCwgMHgzMUY1LCAweDNGNzEsIDB4MzFGNiwgMHgzRjcyLAotICAgIDB4MzFGNywgMHgzRjczLCAweDMxRjgsIDB4M0Y3NCwgMHgzMUY5LCAweDNGNzUsIDB4MzFGQSwgMHgzRjc3LAotICAgIDB4MzFGQiwgMHgzRjc4LCAweDMxRkMsIDB4M0Y3OSwgMHgzMUZELCAweDNGN0EsIDB4MzFGRSwgMHgzRjdCLAotICAgIDB4MzFGRiwgMHgzRjdDLCAweDMyMjAsIDB4Mjc4RSwgMHgzMjIxLCAweDI3OEYsIDB4MzIyMiwgMHgyNzkwLAotICAgIDB4MzIyMywgMHgyNzkxLCAweDMyMjQsIDB4Mjc5MiwgMHgzMjI1LCAweDI3OTMsIDB4MzIyNiwgMHgyNzk0LAotICAgIDB4MzIyNywgMHgyNzk1LCAweDMyMjgsIDB4Mjc5NiwgMHgzMjI5LCAweDI3OTcsIDB4MzIyQSwgMHgyMDA2LAotICAgIDB4MzIyQiwgMHgyMDA3LCAweDMyMkMsIDB4MjAwOCwgMHgzMjJELCAweDIwMDksIDB4MzIyRSwgMHgyMDBBLAotICAgIDB4MzIyRiwgMHgyMDBCLCAweDMyMzAsIDB4MjAwNSwgMHgzMjMxLCAweDFEQzIsIDB4MzIzMiwgMHgxREMzLAotICAgIDB4MzIzMywgMHgxRkNGLCAweDMyMzQsIDB4MUZDRCwgMHgzMjM1LCAweDFGRDQsIDB4MzIzNiwgMHgxRkQzLAotICAgIDB4MzIzNywgMHgyMDBDLCAweDMyMzgsIDB4MUZDRSwgMHgzMjM5LCAweDFEQzQsIDB4MzIzQSwgMHgxRkQ3LAotICAgIDB4MzIzQiwgMHgxRkQ1LCAweDMyM0MsIDB4MUZEMCwgMHgzMjNELCAweDFGQ0IsIDB4MzIzRSwgMHgxRkQyLAotICAgIDB4MzIzRiwgMHgxRkNDLCAweDMyNDAsIDB4MUZENiwgMHgzMjQxLCAweDIwMEQsIDB4MzI0MiwgMHgxRkQxLAotICAgIDB4MzI0MywgMHgxRkNBLCAweDMyNTEsIDB4MUY5QiwgMHgzMjUyLCAweDFGQTYsIDB4MzI1MywgMHgxRkE3LAotICAgIDB4MzI1NCwgMHgxRkE4LCAweDMyNTUsIDB4MUZBOSwgMHgzMjU2LCAweDFGQUEsIDB4MzI1NywgMHgxRkFCLAotICAgIDB4MzI1OCwgMHgxRkFDLCAweDMyNTksIDB4MUZBRCwgMHgzMjVBLCAweDFGQUUsIDB4MzI1QiwgMHgxRkFGLAotICAgIDB4MzI1QywgMHgyODA0LCAweDMyNUQsIDB4MjgwNSwgMHgzMjVFLCAweDI4MDYsIDB4MzI1RiwgMHgyODA3LAotICAgIDB4MzI4MCwgMHgyOERELCAweDMyODEsIDB4MjhERSwgMHgzMjgyLCAweDI4REYsIDB4MzI4MywgMHgyOEUwLAotICAgIDB4MzI4NCwgMHgyOEUxLCAweDMyODUsIDB4MjhFMiwgMHgzMjg2LCAweDI4RTMsIDB4MzI4NywgMHgyOEU0LAotICAgIDB4MzI4OCwgMHgyOEU1LCAweDMyODksIDB4MjhFNiwgMHgzMjhBLCAweDI4RTgsIDB4MzI4QiwgMHgyOEU5LAotICAgIDB4MzI4QywgMHgyOEVBLCAweDMyOEQsIDB4MjhFQiwgMHgzMjhFLCAweDI4RUMsIDB4MzI4RiwgMHgyOEVELAotICAgIDB4MzI5MCwgMHgyOEU3LCAweDMyOTEsIDB4MUZFMSwgMHgzMjkyLCAweDFGRTAsIDB4MzI5MywgMHgxRkUyLAotICAgIDB4MzI5NCwgMHgxRkRDLCAweDMyOTUsIDB4MjhGRiwgMHgzMjk2LCAweDFGRTUsIDB4MzI5NywgMHgyOEZDLAotICAgIDB4MzI5OCwgMHgxRkRFLCAweDMyOTksIDB4MjAxRiwgMHgzMjlBLCAweDI4RjksIDB4MzI5QiwgMHgyOEY4LAotICAgIDB4MzI5QywgMHgyOEZFLCAweDMyOUQsIDB4MjA3RiwgMHgzMjlFLCAweDFGRkYsIDB4MzI5RiwgMHgyOEVGLAotICAgIDB4MzJBMCwgMHgyOEY2LCAweDMyQTEsIDB4MjhGNywgMHgzMkEyLCAweDI4RkIsIDB4MzJBMywgMHgyOEZBLAotICAgIDB4MzJBNCwgMHgxREJELCAweDMyQTUsIDB4MURCRSwgMHgzMkE2LCAweDFEQkYsIDB4MzJBNywgMHgxREMwLAotICAgIDB4MzJBOCwgMHgxREMxLCAweDMyQTksIDB4MUZEQSwgMHgzMkFBLCAweDFGREQsIDB4MzJBQiwgMHgxRkRGLAotICAgIDB4MzJBQywgMHgxRkUzLCAweDMyQUQsIDB4MUZEOSwgMHgzMkFFLCAweDFGRTQsIDB4MzJBRiwgMHgxRkRCLAotICAgIDB4MzJCMCwgMHgxRkQ4LCAweDMyQjEsIDB4MjgwOCwgMHgzMkIyLCAweDI4MDksIDB4MzJCMywgMHgyODBBLAotICAgIDB4MzJCNCwgMHgyODBCLCAweDMyQjUsIDB4MjgwQywgMHgzMkI2LCAweDI4MEQsIDB4MzJCNywgMHgyODBFLAotICAgIDB4MzJCOCwgMHgyODBGLCAweDMyQjksIDB4MjgxMCwgMHgzMkJBLCAweDI4MTEsIDB4MzJCQiwgMHgyODEyLAotICAgIDB4MzJCQywgMHgyODEzLCAweDMyQkQsIDB4MjgxNCwgMHgzMkJFLCAweDI4MTUsIDB4MzJCRiwgMHgyODE2LAotICAgIDB4MzJEMCwgMHgyOEFELCAweDMyRDEsIDB4MjhBRSwgMHgzMkQyLCAweDI4QUYsIDB4MzJEMywgMHgyOEIwLAotICAgIDB4MzJENCwgMHgyOEIxLCAweDMyRDUsIDB4MjhCMiwgMHgzMkQ2LCAweDI4QjMsIDB4MzJENywgMHgyOEI0LAotICAgIDB4MzJEOCwgMHgyOEI1LCAweDMyRDksIDB4MjhCNiwgMHgzMkRBLCAweDI4QjcsIDB4MzJEQiwgMHgyOEI4LAotICAgIDB4MzJEQywgMHgyOEI5LCAweDMyREQsIDB4MjhCQSwgMHgzMkRFLCAweDI4QkIsIDB4MzJERiwgMHgyOEJDLAotICAgIDB4MzJFMCwgMHgyOEJELCAweDMyRTEsIDB4MjhCRSwgMHgzMkUyLCAweDI4QkYsIDB4MzJFMywgMHgyOEMwLAotICAgIDB4MzJFNCwgMHgyOEMxLCAweDMyRTUsIDB4MjhDMiwgMHgzMkU2LCAweDI4QzMsIDB4MzJFNywgMHgyOEM0LAotICAgIDB4MzJFOCwgMHgyOEM1LCAweDMyRTksIDB4MjhDNiwgMHgzMkVBLCAweDI4QzcsIDB4MzJFQiwgMHgyOEM4LAotICAgIDB4MzJFQywgMHgyOEM5LCAweDMyRUQsIDB4MjhDQSwgMHgzMkVFLCAweDI4Q0IsIDB4MzJFRiwgMHgyOENDLAotICAgIDB4MzJGMCwgMHgyOENELCAweDMyRjEsIDB4MjhDRSwgMHgzMkYyLCAweDI4Q0YsIDB4MzJGMywgMHgyOEQwLAotICAgIDB4MzJGNCwgMHgyOEQxLCAweDMyRjUsIDB4MjhEMiwgMHgzMkY2LCAweDI4RDMsIDB4MzJGNywgMHgyOEQ0LAotICAgIDB4MzJGOCwgMHgyOEQ1LCAweDMyRjksIDB4MjhENiwgMHgzMkZBLCAweDI4RDcsIDB4MzJGQiwgMHgyOEQ4LAotICAgIDB4MzJGQywgMHgyOEQ5LCAweDMyRkQsIDB4MjhEQSwgMHgzMkZFLCAweDI4REIsIDB4MzMwMCwgMHgxRjcwLAotICAgIDB4MzMwMSwgMHgyRTYyLCAweDMzMDIsIDB4MkU2MywgMHgzMzAzLCAweDFGNkEsIDB4MzMwNCwgMHgyRTY0LAotICAgIDB4MzMwNSwgMHgxRkY3LCAweDMzMDYsIDB4MkU2NSwgMHgzMzA3LCAweDJFNjksIDB4MzMwOCwgMHgyRTY3LAotICAgIDB4MzMwOSwgMHgyRTZDLCAweDMzMEEsIDB4MkU2QSwgMHgzMzBCLCAweDJFNkUsIDB4MzMwQywgMHgyRTcwLAotICAgIDB4MzMwRCwgMHgxREFCLCAweDMzMEUsIDB4MkU3MSwgMHgzMzBGLCAweDJFNzIsIDB4MzMxMCwgMHgyRTczLAotICAgIDB4MzMxMSwgMHgyRTc0LCAweDMzMTIsIDB4MkU3NSwgMHgzMzEzLCAweDJFNzYsIDB4MzMxNCwgMHgxREEyLAotICAgIDB4MzMxNSwgMHgxRjY5LCAweDMzMTYsIDB4MUY2NywgMHgzMzE3LCAweDJFNzgsIDB4MzMxOCwgMHgxRjY4LAotICAgIDB4MzMxOSwgMHgyRTdBLCAweDMzMUEsIDB4MkU3QywgMHgzMzFCLCAweDJFN0QsIDB4MzMxQywgMHgyRTdFLAotICAgIDB4MzMxRCwgMHgyRTdGLCAweDMzMUUsIDB4MUY3MywgMHgzMzFGLCAweDJFODAsIDB4MzMyMCwgMHgyRTgxLAotICAgIDB4MzMyMSwgMHgyRTgyLCAweDMzMjIsIDB4MUY2NiwgMHgzMzIzLCAweDFGNkIsIDB4MzMyNCwgMHgyRTgzLAotICAgIDB4MzMyNSwgMHgyRTg1LCAweDMzMjYsIDB4MURBQywgMHgzMzI3LCAweDFEQTYsIDB4MzMyOCwgMHgyRTg4LAotICAgIDB4MzMyOSwgMHgyRTg5LCAweDMzMkEsIDB4MUY3NCwgMHgzMzJCLCAweDFEQUUsIDB4MzMyRCwgMHgyRThCLAotICAgIDB4MzMyRSwgMHgyRThFLCAweDMzMkYsIDB4MkU4RiwgMHgzMzMwLCAweDJFOTAsIDB4MzMzMSwgMHgxRjcxLAotICAgIDB4MzMzMiwgMHgyRTkxLCAweDMzMzMsIDB4MjA4NywgMHgzMzM0LCAweDJFOTQsIDB4MzMzNSwgMHgyRTk1LAotICAgIDB4MzMzNiwgMHgxREE4LCAweDMzMzcsIDB4MkU5QSwgMHgzMzM4LCAweDJFOUMsIDB4MzMzOSwgMHgxRjZFLAotICAgIDB4MzMzQSwgMHgyRTlELCAweDMzM0IsIDB4MUY2RiwgMHgzMzNDLCAweDJFOTYsIDB4MzMzRCwgMHgyRTlFLAotICAgIDB4MzMzRSwgMHgyRUEwLCAweDMzM0YsIDB4MkVBMSwgMHgzMzQwLCAweDJFQTIsIDB4MzM0MSwgMHgyRTlGLAotICAgIDB4MzM0MiwgMHgxRjZELCAweDMzNDMsIDB4MkVBMywgMHgzMzQ0LCAweDJFQTQsIDB4MzM0NSwgMHgyRUE1LAotICAgIDB4MzM0NiwgMHgyRUE2LCAweDMzNDcsIDB4MUY3MiwgMHgzMzQ4LCAweDJFQTcsIDB4MzM0OSwgMHgxREExLAotICAgIDB4MzM0QSwgMHgxREFGLCAweDMzNEIsIDB4MkVBOCwgMHgzMzRDLCAweDJFQTksIDB4MzM0RCwgMHgxREE0LAotICAgIDB4MzM0RSwgMHgyMDg4LCAweDMzNEYsIDB4MkVBQSwgMHgzMzUwLCAweDJFQUIsIDB4MzM1MSwgMHgxREE5LAotICAgIDB4MzM1MiwgMHgyRUFFLCAweDMzNTMsIDB4MkVCMiwgMHgzMzU0LCAweDJFQUYsIDB4MzM1NSwgMHgyRUIzLAotICAgIDB4MzM1NiwgMHgyRUI0LCAweDMzNTcsIDB4MUY2QywgMHgzMzcxLCAweDJFNTUsIDB4MzM3QiwgMHgyMDgzLAotICAgIDB4MzM3QywgMHgxREM3LCAweDMzN0QsIDB4MURDNiwgMHgzMzdFLCAweDFEQzUsIDB4MzM3RiwgMHgxRjc2LAotICAgIDB4MzM4NSwgMHgxRjVGLCAweDMzODYsIDB4MUY2MCwgMHgzMzg3LCAweDFGNjEsIDB4MzM4OCwgMHgyMDAwLAotICAgIDB4MzM4OSwgMHgyMDAxLCAweDMzOEQsIDB4MkU1OCwgMHgzMzhFLCAweDFEQjQsIDB4MzM4RiwgMHgxREI1LAotICAgIDB4MzM5MCwgMHgxRjYzLCAweDMzOTYsIDB4MUY2NSwgMHgzMzk3LCAweDFGNTgsIDB4MzM5OCwgMHgxRjVBLAotICAgIDB4MzM5QiwgMHgyRTU5LCAweDMzOUMsIDB4MURCMSwgMHgzMzlELCAweDFEQjIsIDB4MzM5RSwgMHgxREIzLAotICAgIDB4MzM5RiwgMHgxRkZBLCAweDMzQTAsIDB4MUY1NCwgMHgzM0ExLCAweDFEQjcsIDB4MzNBMiwgMHgxRjU1LAotICAgIDB4MzNBMywgMHgxRkZCLCAweDMzQTQsIDB4MUY1NiwgMHgzM0E1LCAweDFGNTcsIDB4MzNBNiwgMHgxRkZDLAotICAgIDB4MzNCMCwgMHgxRjVFLCAweDMzQjEsIDB4MUY1RCwgMHgzM0IyLCAweDFGNUMsIDB4MzNCMywgMHgxRjVCLAotICAgIDB4MzNDMiwgMHgyRTUwLCAweDMzQzQsIDB4MURCNiwgMHgzM0M4LCAweDIwMDIsIDB4MzNDQiwgMHgxRjYyLAotICAgIDB4MzNDQywgMHgxRkY2LCAweDMzQ0QsIDB4MURCQiwgMHgzM0Q0LCAweDFGNjQsIDB4MzNENywgMHgyRTVELAotICAgIDB4MzNEOCwgMHgyRTVFLCAweDMzREEsIDB4MkU0QiwgMHgzNDAyLCAweDM1ODIsIDB4MzQwNSwgMHgzQzFCLAotICAgIDB4MzQwNiwgMHg0MzVBLCAweDM0MjcsIDB4MzY1NiwgMHgzNDJDLCAweDQzNUUsIDB4MzQyRSwgMHgzNzg4LAotICAgIDB4MzQ2OCwgMHgzNkRGLCAweDM0NkEsIDB4NDM3NSwgMHgzNDg4LCAweDNDNTIsIDB4MzQ5MiwgMHg0MzhFLAotICAgIDB4MzRCNSwgMHg0MTk5LCAweDM0QkMsIDB4NDM5NywgMHgzNEMxLCAweDQ3RDAsIDB4MzRDNywgMHg0MzlCLAotICAgIDB4MzREQiwgMHgzQzQxLCAweDM1MUYsIDB4MzYyOSwgMHgzNTNFLCAweDM3MUUsIDB4MzU1RCwgMHg0M0JELAotICAgIDB4MzU1RSwgMHg0M0JFLCAweDM1NjMsIDB4NDNDMCwgMHgzNTZFLCAweDQzQzQsIDB4MzVBNiwgMHg0M0Q5LAotICAgIDB4MzVBOCwgMHg0M0RCLCAweDM1QzUsIDB4NDNFMSwgMHgzNURBLCAweDQzRUEsIDB4MzVERSwgMHg0RTYzLAotICAgIDB4MzVGNCwgMHg0M0YzLCAweDM2MDUsIDB4NDNGQSwgMHgzNjE0LCAweDRBQkIsIDB4MzY0QSwgMHg0NDIxLAotICAgIDB4MzY5MSwgMHg0NDQxLCAweDM2OTYsIDB4NDQ0NSwgMHgzNjk5LCAweDQ0NDMsIDB4MzZDRiwgMHg0NDU2LAotICAgIDB4Mzc2MSwgMHg0NDc4LCAweDM3NjIsIDB4NDQ3OSwgMHgzNzZCLCAweDQ0N0QsIDB4Mzc2QywgMHg0NDdDLAotICAgIDB4Mzc3NSwgMHg0NDgwLCAweDM3OEQsIDB4MzYxQSwgMHgzN0MxLCAweDQ0OEUsIDB4MzdFMiwgMHgzNzJCLAotICAgIDB4MzdFOCwgMHg0NEEyLCAweDM3RjQsIDB4NDRBNSwgMHgzN0ZELCAweDQ0QTgsIDB4MzgwMCwgMHg0NEFBLAotICAgIDB4MzgyRiwgMHg0NEI0LCAweDM4MzYsIDB4NDRCNSwgMHgzODQwLCAweDQ0QjYsIDB4Mzg1QywgMHg0NEJBLAotICAgIDB4Mzg2MSwgMHg0NEJDLCAweDM4QTEsIDB4NEVDQiwgMHgzOEFELCAweDRBQkMsIDB4MzhGQSwgMHgzNjFDLAotICAgIDB4MzkxNywgMHg0NEQ5LCAweDM5MUEsIDB4NDREQywgMHgzOTZGLCAweDQ0RUIsIDB4MzlBNCwgMHg0RTlBLAotICAgIDB4MzlCOCwgMHg0RTlCLCAweDNBNUMsIDB4NEU5RiwgMHgzQTZFLCAweDQ1MzEsIDB4M0E3MywgMHg0NTM0LAotICAgIDB4M0E4NSwgMHg0RUFFLCAweDNBQzQsIDB4NEVBNywgMHgzQUNCLCAweDRFQTgsIDB4M0FENiwgMHg0NTQzLAotICAgIDB4M0FENywgMHg0NTVFLCAweDNBRUEsIDB4NDU0RCwgMHgzQUYzLCAweDNDNDAsIDB4M0IwRSwgMHg0NTU4LAotICAgIDB4M0IxQSwgMHg0NTVDLCAweDNCMUMsIDB4NDU1RCwgMHgzQjIyLCAweDNDNDksIDB4M0I2RCwgMHg0NThDLAotICAgIDB4M0I3NywgMHg0NTg1LCAweDNCODcsIDB4NDVBMiwgMHgzQjg4LCAweDM2OEQsIDB4M0I4RCwgMHg0NUE0LAotICAgIDB4M0JBNCwgMHg0NUFBLCAweDNCQjYsIDB4NDIwRSwgMHgzQkMzLCAweDQyMEYsIDB4M0JDRCwgMHg0NUI4LAotICAgIDB4M0JGMCwgMHg0NUM5LCAweDNCRjMsIDB4NEVCNywgMHgzQzBGLCAweDQyMTcsIDB4M0MyNiwgMHg0NURGLAotICAgIDB4M0NDMywgMHg0NUZDLCAweDNDRDIsIDB4NDYwMSwgMHgzRDExLCAweDQ2MjUsIDB4M0QxRSwgMHg0NjMwLAotICAgIDB4M0QzMSwgMHg0RUJFLCAweDNENEUsIDB4MURFNywgMHgzRDY0LCAweDQ2NEEsIDB4M0Q5QSwgMHg0NjU4LAotICAgIDB4M0RDMCwgMHg0NjZBLCAweDNEQ0MsIDB4NEFCRCwgMHgzREQ0LCAweDQ2NkYsIDB4M0UwNSwgMHg0NjdCLAotICAgIDB4M0UzRiwgMHg0MjQ4LCAweDNFNDAsIDB4NEVDQSwgMHgzRTYwLCAweDQ2OEIsIDB4M0U2NiwgMHg0NjhELAotICAgIDB4M0U2OCwgMHg0NjhFLCAweDNFODMsIDB4NDY5NSwgMHgzRThBLCAweDNDNDMsIDB4M0U5NCwgMHg0NjlCLAotICAgIDB4M0VEQSwgMHgzQzQ4LCAweDNGNTcsIDB4NDZDQiwgMHgzRjcyLCAweDQyNTgsIDB4M0Y3NSwgMHg0NkQ5LAotICAgIDB4M0Y3NywgMHg0NkRCLCAweDNGQUUsIDB4NDZFRCwgMHgzRkIxLCAweDM3NTQsIDB4M0ZDOSwgMHg0NkY4LAotICAgIDB4M0ZENywgMHg0NkZELCAweDNGREMsIDB4NEFCRSwgMHg0MDM5LCAweDQ3MEYsIDB4NDA1OCwgMHg0NzE2LAotICAgIDB4NDA5MywgMHgzQzRDLCAweDQxMDMsIDB4M0M0RiwgMHg0MTA1LCAweDQ3M0IsIDB4NDE0OCwgMHg0NzQ3LAotICAgIDB4NDE0RiwgMHg0NzRBLCAweDQxNjMsIDB4NDc0RSwgMHg0MUI0LCAweDQ3NUQsIDB4NDFCRiwgMHg0NzYwLAotICAgIDB4NDFFNiwgMHg0NzZCLCAweDQxRUUsIDB4NDc2RiwgMHg0MUYzLCAweDQ3NkMsIDB4NDIwNywgMHg0Nzc2LAotICAgIDB4NDIwRSwgMHg0Nzc5LCAweDQyNjQsIDB4Mzc2MCwgMHg0MjkzLCAweDNDNTAsIDB4NDJDNiwgMHg0NzlGLAotICAgIDB4NDJENiwgMHg0N0FBLCAweDQyREQsIDB4NDdBRSwgMHg0MzAyLCAweDQ3QkMsIDB4NDMyQiwgMHg0N0M5LAotICAgIDB4NDM0MywgMHg0N0NCLCAweDQzRUUsIDB4NDdGNywgMHg0M0YwLCAweDQ3RkEsIDB4NDQwOCwgMHg0ODAwLAotICAgIDB4NDQwQywgMHgzQzQyLCAweDQ0MTcsIDB4NDgwMiwgMHg0NDFDLCAweDQ4MDMsIDB4NDQyMiwgMHg0ODA1LAotICAgIDB4NDQ1MywgMHgzNzczLCAweDQ0NUIsIDB4NDJBNCwgMHg0NDc2LCAweDQ4MUMsIDB4NDQ3QSwgMHg0ODFELAotICAgIDB4NDQ5MSwgMHg0ODIzLCAweDQ0QjMsIDB4NDgzRSwgMHg0NEJFLCAweDQ4M0MsIDB4NDRENCwgMHg0ODNELAotICAgIDB4NDUwOCwgMHg0ODVDLCAweDQ1MEQsIDB4NDg1OCwgMHg0NTI1LCAweDM3N0UsIDB4NDU0MywgMHg0ODZDLAotICAgIDB4NDU3QSwgMHgzQzRCLCAweDQ1OUQsIDB4NDJENCwgMHg0NUI4LCAweDQ4QTAsIDB4NDVCRSwgMHg0QUJGLAotICAgIDB4NDVFNSwgMHg0OEJBLCAweDQ1RUEsIDB4NDJEOSwgMHg0NjBGLCAweDQ4Q0EsIDB4NDYxMCwgMHg0QUMwLAotICAgIDB4NDY0MSwgMHg0OEQ4LCAweDQ2NjUsIDB4M0M0RSwgMHg0NkExLCAweDQ4RTksIDB4NDZBRSwgMHgzQzUxLAotICAgIDB4NDZBRiwgMHg0OEVELCAweDQ3MEMsIDB4NDkwMiwgMHg0NzFGLCAweDRFRkIsIDB4NDc2NCwgMHg0OTE4LAotICAgIDB4NDdFNiwgMHgzNzkwLCAweDQ3RkQsIDB4NDkyNCwgMHg0ODE2LCAweDQ5MkUsIDB4NDgxRSwgMHg0RjAxLAotICAgIDB4NDg0NCwgMHg0MkY1LCAweDQ4NEUsIDB4NDkzQSwgMHg0OEI1LCAweDQ5NUIsIDB4NDlCMCwgMHg0MzFGLAotICAgIDB4NDlFNywgMHg0OUQyLCAweDQ5RkEsIDB4NDlENiwgMHg0QTA0LCAweDQ5REIsIDB4NEEyOSwgMHg0OURFLAotICAgIDB4NEFCQywgMHg0OUY2LCAweDRCMzgsIDB4MzVERiwgMHg0QjNCLCAweDRBMEUsIDB4NEI3RSwgMHg0QUMxLAotICAgIDB4NEJDMiwgMHg0QTMzLCAweDRCQ0EsIDB4NEEzNSwgMHg0QkQyLCAweDRBMzcsIDB4NEJFOCwgMHgzQzQ2LAotICAgIDB4NEMxNywgMHg0MzM0LCAweDRDMjAsIDB4NEE0OCwgMHg0QzM4LCAweDRBQzIsIDB4NENDNCwgMHg0QTg0LAotICAgIDB4NENEMSwgMHg0QTg3LCAweDRDRTEsIDB4NEFDMywgMHg0RDA3LCAweDRBOUIsIDB4NEQ3NywgMHg0QUFCLAotICAgIDB4NEUwMCwgMHgwNEIwLCAweDRFMDEsIDB4MEJCOCwgMHg0RTAyLCAweDQzNTIsIDB4NEUwMywgMHgwOEUzLAotICAgIDB4NEUwNCwgMHgzN0Q4LCAweDRFMDUsIDB4MzdEOSwgMHg0RTA3LCAweDBFQUEsIDB4NEUwOCwgMHgwOUNFLAotICAgIDB4NEUwOSwgMHgwODdFLCAweDRFMEEsIDB4MDlDRCwgMHg0RTBCLCAweDA1M0MsIDB4NEUwQywgMHg0QUM0LAotICAgIDB4NEUwRCwgMHgwREM2LCAweDRFMEUsIDB4MEYyOSwgMHg0RTBGLCAweDQzNTMsIDB4NEUxMCwgMHgwRkZCLAotICAgIDB4NEUxMSwgMHgwNEQxLCAweDRFMTIsIDB4NDM1NCwgMHg0RTE0LCAweDA1Q0MsIDB4NEUxNSwgMHgwRkZDLAotICAgIDB4NEUxNiwgMHgwQTQ4LCAweDRFMTcsIDB4MTBENywgMHg0RTE4LCAweDA2NzAsIDB4NEUxOSwgMHgwRTBBLAotICAgIDB4NEUxRSwgMHgwOUNGLCAweDRFMUYsIDB4MzdEQSwgMHg0RTIxLCAweDBGODYsIDB4NEUyMywgMHg0QUM1LAotICAgIDB4NEUyNCwgMHg0QUM2LCAweDRFMjYsIDB4MEUxMiwgMHg0RTI4LCAweDIwQjMsIDB4NEUyOSwgMHg0MzU1LAotICAgIDB4NEUyQSwgMHgwRkZELCAweDRFMkIsIDB4MzdEQiwgMHg0RTJDLCAweDM3NEQsIDB4NEUyRCwgMHgwQkE0LAotICAgIDB4NEUyRSwgMHg0MzU2LCAweDRFMkYsIDB4MzdEQywgMHg0RTMwLCAweDM3REQsIDB4NEUzMSwgMHgwRkZFLAotICAgIDB4NEUzMiwgMHgwNkYyLCAweDRFMzYsIDB4MEZGRiwgMHg0RTM3LCAweDM2OUQsIDB4NEUzOCwgMHgwNjE5LAotICAgIDB4NEUzOSwgMHgwQjZFLCAweDRFM0IsIDB4MDkxMywgMHg0RTNDLCAweDEwMDAsIDB4NEUzRiwgMHgxMDAxLAotICAgIDB4NEU0MCwgMHgzN0RFLCAweDRFNDEsIDB4MzdERiwgMHg0RTQyLCAweDEwMDIsIDB4NEU0MywgMHgwQ0VCLAotICAgIDB4NEU0NCwgMHgzN0UwLCAweDRFNDUsIDB4MDY3MSwgMHg0RTQ3LCAweDQzNTcsIDB4NEU0OCwgMHgzNzJFLAotICAgIDB4NEU0QiwgMHgwQ0VELCAweDRFNEQsIDB4MENCQiwgMHg0RTRFLCAweDA3NzcsIDB4NEU0RiwgMHgwRTYxLAotICAgIDB4NEU1MSwgMHg0MzU5LCAweDRFNTUsIDB4MTk1MCwgMHg0RTU2LCAweDEwMDMsIDB4NEU1NywgMHgwOUQwLAotICAgIDB4NEU1OCwgMHgxMDA0LCAweDRFNTksIDB4MDUzNSwgMHg0RTVBLCAweDM3RTEsIDB4NEU1RCwgMHgwNkRELAotICAgIDB4NEU1RSwgMHgwN0E0LCAweDRFNUYsIDB4MEVGNSwgMHg0RTYyLCAweDEyMzMsIDB4NEU2OSwgMHg0MzVDLAotICAgIDB4NEU3MSwgMHgwRjVBLCAweDRFNzMsIDB4MENENSwgMHg0RTc5LCAweDRBQzcsIDB4NEU3RSwgMHgwNUUxLAotICAgIDB4NEU3RiwgMHgzN0UyLCAweDRFODAsIDB4MDY0RiwgMHg0RTgyLCAweDEwMDUsIDB4NEU4NSwgMHgxMDA2LAotICAgIDB4NEU4NiwgMHgwRjgzLCAweDRFODgsIDB4MEYyNywgMHg0RTg5LCAweDBBRUEsIDB4NEU4QSwgMHgxMDA4LAotICAgIDB4NEU4QiwgMHgwOEM0LCAweDRFOEMsIDB4MENDQiwgMHg0RThELCAweDM3RTMsIDB4NEU4RSwgMHgxMDBCLAotICAgIDB4NEU5MSwgMHgwNEUwLCAweDRFOTIsIDB4MDc5MywgMHg0RTk0LCAweDA3OTIsIDB4NEU5NSwgMHgwNEFBLAotICAgIDB4NEU5NiwgMHgzN0U0LCAweDRFOTgsIDB4MEZGMSwgMHg0RTk5LCAweDBGRjAsIDB4NEU5QiwgMHgwODIzLAotICAgIDB4NEU5QywgMHgwNDY1LCAweDRFOUQsIDB4NDM1RCwgMHg0RTlFLCAweDEwMEMsIDB4NEU5RiwgMHgxMDBELAotICAgIDB4NEVBMCwgMHgxMDBFLCAweDRFQTEsIDB4MEU2MiwgMHg0RUEyLCAweDEwMEYsIDB4NEVBNCwgMHgwN0E2LAotICAgIDB4NEVBNSwgMHgwNEFCLCAweDRFQTYsIDB4MEVBMCwgMHg0RUE4LCAweDA2OTYsIDB4NEVBQiwgMHgwNjk3LAotICAgIDB4NEVBQywgMHgwNjk4LCAweDRFQUQsIDB4MEJGRSwgMHg0RUFFLCAweDBGODQsIDB4NEVCMCwgMHgxMDEwLAotICAgIDB4NEVCMywgMHgxMDExLCAweDRFQjYsIDB4MTAxMiwgMHg0RUI5LCAweDM3RTUsIDB4NEVCQSwgMHgwQTEzLAotICAgIDB4NEVCQiwgMHgzNjIwLCAweDRFQkMsIDB4NDM1RiwgMHg0RUMwLCAweDA5NDQsIDB4NEVDMSwgMHgwQTE0LAotICAgIDB4NEVDMiwgMHgxMDE3LCAweDRFQzMsIDB4NDM2MCwgMHg0RUM0LCAweDEwMTUsIDB4NEVDNiwgMHgxMDE2LAotICAgIDB4NEVDNywgMHgwNjcyLCAweDRFQzgsIDB4NDM2MSwgMHg0RUNBLCAweDA4MTMsIDB4NEVDQiwgMHgwNTcwLAotICAgIDB4NEVDRCwgMHgxMDE0LCAweDRFQ0UsIDB4MTAxMywgMHg0RUNGLCAweDBERjksIDB4NEVEMCwgMHgzN0U2LAotICAgIDB4NEVENCwgMHgwODk0LCAweDRFRDUsIDB4MDg5MywgMHg0RUQ2LCAweDBCMUUsIDB4NEVENywgMHgxMDE4LAotICAgIDB4NEVEOCwgMHgwREM3LCAweDRFRDksIDB4MEE4QiwgMHg0RURBLCAweDQzNjMsIDB4NEVERCwgMHgwMjkwLAotICAgIDB4NEVERSwgMHgxMDE5LCAweDRFREYsIDB4MTAxQiwgMHg0RUUwLCAweDM3RTcsIDB4NEVFMSwgMHgyMEI0LAotICAgIDB4NEVFMywgMHgwQjQ1LCAweDRFRTQsIDB4MEZBOSwgMHg0RUU1LCAweDA0OEUsIDB4NEVFQiwgMHg0MzYyLAotICAgIDB4NEVFRCwgMHgxMDFBLCAweDRFRUUsIDB4MDUzRSwgMHg0RUYwLCAweDA2QkMsIDB4NEVGMSwgMHg0MzY0LAotICAgIDB4NEVGMiwgMHgwQkE1LCAweDRFRjMsIDB4NEFDOCwgMHg0RUY1LCAweDQzNjUsIDB4NEVGNiwgMHgwNzQ1LAotICAgIDB4NEVGNywgMHgxMDFDLCAweDRFRkIsIDB4MENEQSwgMHg0RUZDLCAweDIwQjUsIDB4NEVGRCwgMHgzN0U4LAotICAgIDB4NEVGRiwgMHgzN0U5LCAweDRGMDAsIDB4MjBCNiwgMHg0RjAxLCAweDA2MjcsIDB4NEYwMywgMHgyMEI3LAotICAgIDB4NEYwOSwgMHgxMDFELCAweDRGMEEsIDB4MDQ4RiwgMHg0RjBCLCAweDM3RUEsIDB4NEYwQywgMHg0QUM5LAotICAgIDB4NEYwRCwgMHgwNzk0LCAweDRGMEUsIDB4MDYyOCwgMHg0RjBGLCAweDBERUMsIDB4NEYxMCwgMHgwRDQ2LAotICAgIDB4NEYxMSwgMHgwNjczLCAweDRGMTUsIDB4MzdFQiwgMHg0RjE2LCAweDQzNjYsIDB4NEYxOSwgMHg0QUNBLAotICAgIDB4NEYxQSwgMHgwNTcxLCAweDRGMUMsIDB4MTA0MCwgMHg0RjFELCAweDBDM0IsIDB4NEYyQiwgMHg0QUNCLAotICAgIDB4NEYyRSwgMHg0QUNDLCAweDRGMkYsIDB4MEQyMiwgMHg0RjMwLCAweDEwMUYsIDB4NEYzMSwgMHg0QUNELAotICAgIDB4NEYzNCwgMHgwRDUwLCAweDRGMzYsIDB4MEZBQSwgMHg0RjM3LCAweDQzNjgsIDB4NEYzOCwgMHgwOUYzLAotICAgIDB4NEYzOSwgMHgyMEI4LCAweDRGM0EsIDB4MDg5NSwgMHg0RjNCLCAweDM3RUQsIDB4NEYzQywgMHgwOEM1LAotICAgIDB4NEYzRCwgMHgwNTQwLCAweDRGM0UsIDB4NDM2OSwgMHg0RjQzLCAweDBCRUQsIDB4NEY0NiwgMHgwQjYwLAotICAgIDB4NEY0NywgMHgxMDIzLCAweDRGNDgsIDB4NDE4QiwgMHg0RjQ5LCAweDM3RUUsIDB4NEY0RCwgMHgwNDkwLAotICAgIDB4NEY0RSwgMHgwQkZGLCAweDRGNEYsIDB4MDk0NSwgMHg0RjUwLCAweDA4MjQsIDB4NEY1MSwgMHgwRjBFLAotICAgIDB4NEY1MywgMHgwQjJFLCAweDRGNTQsIDB4MzdFRiwgMHg0RjU1LCAweDA1M0YsIDB4NEY1NiwgMHgyMEI5LAotICAgIDB4NEY1NywgMHgxMDIyLCAweDRGNTgsIDB4NDM2QSwgMHg0RjU5LCAweDBGMjgsIDB4NEY1QSwgMHgxMDFFLAotICAgIDB4NEY1QiwgMHgxMDIwLCAweDRGNUMsIDB4MDg1RSwgMHg0RjVELCAweDEwMjEsIDB4NEY1RSwgMHgxMUQzLAotICAgIDB4NEY1RiwgMHg0MThDLCAweDRGNjAsIDB4MzdFQywgMHg0RjY0LCAweDQzNjcsIDB4NEY2OSwgMHgxMDI5LAotICAgIDB4NEY2QSwgMHg0MThELCAweDRGNkMsIDB4NDE4RSwgMHg0RjZGLCAweDEwMkMsIDB4NEY3MCwgMHgxMDJBLAotICAgIDB4NEY3MywgMHgwNTQyLCAweDRGNzUsIDB4MEUwQiwgMHg0Rjc2LCAweDEwMjQsIDB4NEY3NywgMHg0MzZDLAotICAgIDB4NEY3OCwgMHg0MzZELCAweDRGN0EsIDB4MzdGMCwgMHg0RjdCLCAweDEwMjgsIDB4NEY3QywgMHgwN0E3LAotICAgIDB4NEY3RCwgMHgzN0YxLCAweDRGN0UsIDB4MzdGMiwgMHg0RjdGLCAweDA4OTYsIDB4NEY4MiwgMHg0MzZFLAotICAgIDB4NEY4MywgMHgwNUUyLCAweDRGODQsIDB4NEFDRSwgMHg0Rjg1LCAweDQzNkYsIDB4NEY4NiwgMHgxMDJELAotICAgIDB4NEY4OCwgMHgxMDI1LCAweDRGOEEsIDB4MjBCQiwgMHg0RjhCLCAweDBGQUIsIDB4NEY4RCwgMHgwOEM2LAotICAgIDB4NEY4RiwgMHgxMDI2LCAweDRGOTEsIDB4MTAyQiwgMHg0RjkyLCAweDIwQkEsIDB4NEY5NCwgMHgyMEJELAotICAgIDB4NEY5NiwgMHgxMDJFLCAweDRGOTcsIDB4MzdGMywgMHg0Rjk4LCAweDEwMjcsIDB4NEY5QSwgMHgyMEJDLAotICAgIDB4NEY5QiwgMHgwNjk5LCAweDRGOUQsIDB4MDQ5MSwgMHg0RjlFLCAweDRBQ0YsIDB4NEZBMCwgMHgwNjlBLAotICAgIDB4NEZBMSwgMHgwNTQxLCAweDRGQUIsIDB4MTFENCwgMHg0RkFELCAweDBFQTcsIDB4NEZBRSwgMHgwREUwLAotICAgIDB4NEZBRiwgMHgwN0E4LCAweDRGQjIsIDB4NDM3MSwgMHg0RkI1LCAweDA5RjUsIDB4NEZCNiwgMHgwRjdGLAotICAgIDB4NEZCNywgMHg0QUQwLCAweDRGQkUsIDB4MzdGNCwgMHg0RkJGLCAweDBFMjgsIDB4NEZDMiwgMHgwNzBFLAotICAgIDB4NEZDMywgMHgwQjA1LCAweDRGQzQsIDB4MDU2NCwgMHg0RkM1LCAweDQzNzIsIDB4NEZDOSwgMHgyMEFDLAotICAgIDB4NEZDQSwgMHgwOTVELCAweDRGQ0IsIDB4NDM3MywgMHg0RkNELCAweDIwQkUsIDB4NEZDRSwgMHgxMDMyLAotICAgIDB4NEZDRiwgMHgzN0Y1LCAweDRGRDAsIDB4MTAzNywgMHg0RkQxLCAweDEwMzUsIDB4NEZEMiwgMHg0Mzc0LAotICAgIDB4NEZEMywgMHgzQzJGLCAweDRGRDQsIDB4MTAzMCwgMHg0RkQ3LCAweDBCMEYsIDB4NEZEOCwgMHgxMDMzLAotICAgIDB4NEZEQSwgMHgxMDM2LCAweDRGREIsIDB4MTAzNCwgMHg0RkRELCAweDBFMkQsIDB4NEZERiwgMHgxMDMxLAotICAgIDB4NEZFMCwgMHgxREVDLCAweDRGRTEsIDB4MDlGNCwgMHg0RkUzLCAweDBFQTEsIDB4NEZFNCwgMHgxMDM4LAotICAgIDB4NEZFNSwgMHgxMDM5LCAweDRGRTYsIDB4NDM3MCwgMHg0RkVFLCAweDA5MkUsIDB4NEZFRiwgMHgxMDQ2LAotICAgIDB4NEZGMSwgMHgzNUEzLCAweDRGRjIsIDB4NDM3NiwgMHg0RkYzLCAweDBEMDYsIDB4NEZGNSwgMHgwREE4LAotICAgIDB4NEZGNiwgMHgxMDQxLCAweDRGRjgsIDB4MEU0MCwgMHg0RkZBLCAweDA1MzYsIDB4NEZGRCwgMHgzN0Y2LAotICAgIDB4NEZGRSwgMHgxMDQ1LCAweDRGRkYsIDB4MjBDMSwgMHg1MDAwLCAweDM3RjcsIDB4NTAwMSwgMHgzN0Y4LAotICAgIDB4NTAwMiwgMHg0RjRCLCAweDUwMDQsIDB4NEFEMSwgMHg1MDA1LCAweDEwM0YsIDB4NTAwNiwgMHgxMDQ4LAotICAgIDB4NTAwOSwgMHgwQUQ0LCAweDUwMEIsIDB4MDc3OCwgMHg1MDBDLCAweDRBRDIsIDB4NTAwRCwgMHgwRDEyLAotICAgIDB4NTAwRSwgMHg0MThGLCAweDUwMEYsIDB4MTYwMCwgMHg1MDEwLCAweDM3RjksIDB4NTAxMSwgMHgxMDQ3LAotICAgIDB4NTAxMiwgMHgwQzU3LCAweDUwMTMsIDB4NDM3NywgMHg1MDE0LCAweDEwM0MsIDB4NTAxNiwgMHgwN0FBLAotICAgIDB4NTAxOCwgMHg0MTkwLCAweDUwMTksIDB4MDdBOSwgMHg1MDFBLCAweDEwM0EsIDB4NTAxQiwgMHgzN0ZBLAotICAgIDB4NTAxQywgMHg0Mzc4LCAweDUwMUUsIDB4MjBDMiwgMHg1MDFGLCAweDA5MDYsIDB4NTAyMSwgMHgxMDQyLAotICAgIDB4NTAyMiwgMHgyMEMwLCAweDUwMjMsIDB4MEUzRiwgMHg1MDI0LCAweDBCOEIsIDB4NTAyNSwgMHgxMDNFLAotICAgIDB4NTAyNiwgMHgwNzQ3LCAweDUwMjcsIDB4MzdGQiwgMHg1MDI4LCAweDEwM0IsIDB4NTAyOSwgMHgxMDQzLAotICAgIDB4NTAyQSwgMHgxMDNELCAweDUwMkIsIDB4MEY5OSwgMHg1MDJDLCAweDEwNDQsIDB4NTAyRCwgMHgwRkU3LAotICAgIDB4NTAyRSwgMHgzN0ZDLCAweDUwMzYsIDB4MDZERSwgMHg1MDM5LCAweDA3NDYsIDB4NTAzQiwgMHgzODAwLAotICAgIDB4NTA0MCwgMHgyMEJGLCAweDUwNDEsIDB4NDE5MSwgMHg1MDQyLCAweDIwQzUsIDB4NTA0MywgMHgxMDQ5LAotICAgIDB4NTA0NiwgMHgyMEMzLCAweDUwNDcsIDB4MTA0QSwgMHg1MDQ4LCAweDEwNEUsIDB4NTA0OSwgMHgwNDkyLAotICAgIDB4NTA0QywgMHg0QUQzLCAweDUwNEUsIDB4NDM3OSwgMHg1MDRGLCAweDBFMjAsIDB4NTA1MCwgMHgxMDRELAotICAgIDB4NTA1MywgMHg0MzdBLCAweDUwNTUsIDB4MTA0QywgMHg1MDU2LCAweDEwNTAsIDB4NTA1NywgMHgzN0ZELAotICAgIDB4NTA1QSwgMHgxMDRGLCAweDUwNUMsIDB4MEMwMCwgMHg1MDVGLCAweDRBRDQsIDB4NTA2MiwgMHg0QUQ1LAotICAgIDB4NTA2MywgMHg0MzdCLCAweDUwNjUsIDB4MDc0OCwgMHg1MDY2LCAweDM3RkUsIDB4NTA2QSwgMHgzN0ZGLAotICAgIDB4NTA2QywgMHgxMDUxLCAweDUwNzAsIDB4MjBDNCwgMHg1MDcyLCAweDA4RjEsIDB4NTA3NCwgMHgwQjA2LAotICAgIDB4NTA3NSwgMHgwQzAxLCAweDUwNzYsIDB4MDZFRSwgMHg1MDc3LCAweDRBRDYsIDB4NTA3OCwgMHgxMDUyLAotICAgIDB4NTA3RCwgMHgwNjUwLCAweDUwODAsIDB4MTA1MywgMHg1MDg1LCAweDEwNTUsIDB4NTA4OCwgMHg0MzdELAotICAgIDB4NTA4RCwgMHgwRTYzLCAweDUwOEUsIDB4NEFENywgMHg1MDhGLCAweDM4MDEsIDB4NTA5MSwgMHgwNzNDLAotICAgIDB4NTA5MiwgMHg0MzdFLCAweDUwOTMsIDB4NDM3RiwgMHg1MDk0LCAweDIwQzYsIDB4NTA5NSwgMHg0MzgwLAotICAgIDB4NTA5NiwgMHgzODAyLCAweDUwOTgsIDB4MDg3RiwgMHg1MDk5LCAweDBEOEIsIDB4NTA5QSwgMHgxMDU0LAotICAgIDB4NTA5QywgMHgzODAzLCAweDUwOUUsIDB4NEFEOCwgMHg1MEEyLCAweDRBRDksIDB4NTBBMywgMHg0MzdDLAotICAgIDB4NTBBQSwgMHg0MzgxLCAweDUwQUMsIDB4MDgzNSwgMHg1MEFELCAweDBGMkQsIDB4NTBCMSwgMHg0MzgzLAotICAgIDB4NTBCMiwgMHgxMDU3LCAweDUwQjMsIDB4MTA1QSwgMHg1MEI0LCAweDEwNTYsIDB4NTBCNSwgMHgwODM0LAotICAgIDB4NTBCNywgMHgwOTg3LCAweDUwQkEsIDB4NDM4NCwgMHg1MEJCLCAweDQzODUsIDB4NTBCRSwgMHgwNzBGLAotICAgIDB4NTBDMiwgMHgxMDVCLCAweDUwQzMsIDB4NEFEQSwgMHg1MEM0LCAweDQzODYsIDB4NTBDNSwgMHgwNkM3LAotICAgIDB4NTBDNywgMHg0Mzg3LCAweDUwQzksIDB4MTA1OCwgMHg1MENBLCAweDEwNTksIDB4NTBDQywgMHgzODA0LAotICAgIDB4NTBDRCwgMHgwQzg3LCAweDUwQ0UsIDB4NDM4QSwgMHg1MENGLCAweDBBRkUsIDB4NTBEMCwgMHg0MTkzLAotICAgIDB4NTBEMSwgMHgwNjlCLCAweDUwRDQsIDB4NDM4QywgMHg1MEQ1LCAweDBFN0IsIDB4NTBENiwgMHgxMDVDLAotICAgIDB4NTBEOCwgMHgyMEM4LCAweDUwRDksIDB4M0MzMCwgMHg1MERBLCAweDBGODUsIDB4NTBERSwgMHgxMDVELAotICAgIDB4NTBFMSwgMHg0MzhELCAweDUwRTMsIDB4MTA2MCwgMHg1MEU1LCAweDEwNUUsIDB4NTBFNiwgMHgzODA1LAotICAgIDB4NTBFNywgMHgwQUQwLCAweDUwRTgsIDB4NEFEQiwgMHg1MEU5LCAweDM4MDYsIDB4NTBFRCwgMHgxMDVGLAotICAgIDB4NTBFRSwgMHgxMDYxLCAweDUwRUYsIDB4MzgwNywgMHg1MEYwLCAweDNDMzEsIDB4NTBGMSwgMHg0QURDLAotICAgIDB4NTBGMiwgMHg0MTkyLCAweDUwRjMsIDB4NDM4OCwgMHg1MEY0LCAweDIwQzcsIDB4NTBGNSwgMHgxMDYzLAotICAgIDB4NTBGOSwgMHgxMDYyLCAweDUwRkIsIDB4MEUxOCwgMHg1MEZFLCAweDRBREQsIDB4NTEwMCwgMHgwNjUxLAotICAgIDB4NTEwMSwgMHgxMDY1LCAweDUxMDIsIDB4MTA2NiwgMHg1MTAzLCAweDQxOTUsIDB4NTEwNCwgMHgwNTJGLAotICAgIDB4NTEwNiwgMHg0MTk0LCAweDUxMDcsIDB4NEFERSwgMHg1MTA4LCAweDM4MDgsIDB4NTEwOSwgMHgxMDY0LAotICAgIDB4NTEwQiwgMHgzODA5LCAweDUxMEMsIDB4NEFERiwgMHg1MTBELCAweDRBRTAsIDB4NTEwRSwgMHg0QUUxLAotICAgIDB4NTExMCwgMHgzODBBLCAweDUxMTIsIDB4MDkyMCwgMHg1MTE0LCAweDEwNjksIDB4NTExNSwgMHgxMDY4LAotICAgIDB4NTExNiwgMHgxMDY3LCAweDUxMTcsIDB4NDM5MCwgMHg1MTE4LCAweDEwMkYsIDB4NTExQSwgMHgxMDZBLAotICAgIDB4NTExQiwgMHgzODBCLCAweDUxMUUsIDB4MzgwQywgMHg1MTFGLCAweDA5ODgsIDB4NTEyMSwgMHgxMDZCLAotICAgIDB4NTEyQSwgMHgwRjBGLCAweDUxMzIsIDB4MEVFNSwgMHg1MTMzLCAweDRBRTIsIDB4NTEzNSwgMHg0MTk2LAotICAgIDB4NTEzNywgMHgxMDZELCAweDUxMzgsIDB4NEFFMywgMHg1MTNBLCAweDEwNkMsIDB4NTEzQiwgMHgxMDZGLAotICAgIDB4NTEzQywgMHgxMDZFLCAweDUxM0YsIDB4MTA3MCwgMHg1MTQwLCAweDEwNzEsIDB4NTE0MSwgMHgwNEI4LAotICAgIDB4NTE0MywgMHgwNzY5LCAweDUxNDQsIDB4MDcxMSwgMHg1MTQ1LCAweDA5NDYsIDB4NTE0NiwgMHgwQkI5LAotICAgIDB4NTE0NywgMHgwNjlDLCAweDUxNDgsIDB4MEE4QywgMHg1MTQ5LCAweDA3QUIsIDB4NTE0QSwgMHgyMEM5LAotICAgIDB4NTE0QiwgMHgwODAwLCAweDUxNEMsIDB4MTA3MywgMHg1MTRELCAweDBFRDQsIDB4NTE0RSwgMHgwQzQwLAotICAgIDB4NTE1MCwgMHgwOEM3LCAweDUxNTIsIDB4MTA3MiwgMHg1MTU0LCAweDEwNzQsIDB4NTE1NSwgMHg0MTk3LAotICAgIDB4NTE1NywgMHg0MTk4LCAweDUxNUEsIDB4MEM1OCwgMHg1MTVDLCAweDA1RDMsIDB4NTE1RiwgMHgzODBELAotICAgIDB4NTE2MCwgMHg0MzkyLCAweDUxNjIsIDB4MTA3NSwgMHg1MTY0LCAweDIwQ0EsIDB4NTE2NSwgMHgwQ0Q2LAotICAgIDB4NTE2NywgMHgzNjhFLCAweDUxNjgsIDB4MEFCNiwgMHg1MTY5LCAweDEwNzcsIDB4NTE2QSwgMHgxMDc4LAotICAgIDB4NTE2QiwgMHgwRDQwLCAweDUxNkMsIDB4MDdBQywgMHg1MTZELCAweDBGRTEsIDB4NTE2RSwgMHgxMDc5LAotICAgIDB4NTE3MSwgMHgwNjlFLCAweDUxNzMsIDB4NDM5NCwgMHg1MTc0LCAweDRBRTQsIDB4NTE3NSwgMHgwRTBDLAotICAgIDB4NTE3NiwgMHgwQjE2LCAweDUxNzcsIDB4MDZFOSwgMHg1MTc4LCAweDBDMkYsIDB4NTE3OSwgMHgzNzc5LAotICAgIDB4NTE3QiwgMHg0N0Q5LCAweDUxN0MsIDB4MDc0OSwgMHg1MTgwLCAweDEwN0EsIDB4NTE4MiwgMHgxMDdCLAotICAgIDB4NTE4MywgMHg0Mzk1LCAweDUxODQsIDB4NEFFNSwgMHg1MTg1LCAweDBDQkEsIDB4NTE4NiwgMHgwNTAxLAotICAgIDB4NTE4OSwgMHgxMDdFLCAweDUxOEEsIDB4MDg2RCwgMHg1MThCLCAweDQzOTYsIDB4NTE4QywgMHgxMDdELAotICAgIDB4NTE4RCwgMHgwODM2LCAweDUxOEYsIDB4MTA3RiwgMHg1MTkwLCAweDE4NUIsIDB4NTE5MSwgMHgxMDgwLAotICAgIDB4NTE5MiwgMHgwRTZGLCAweDUxOTMsIDB4MTA4MSwgMHg1MTk1LCAweDEwODIsIDB4NTE5NiwgMHgxMDgzLAotICAgIDB4NTE5NywgMHgwOUQxLCAweDUxOTgsIDB4NDM5OCwgMHg1MTk5LCAweDA4RjgsIDB4NTE5RCwgMHgyMENCLAotICAgIDB4NTFBMCwgMHgwNUUzLCAweDUxQTEsIDB4MzgwRSwgMHg1MUEyLCAweDEwODYsIDB4NTFBMywgMHg0Mzk5LAotICAgIDB4NTFBNCwgMHgxMDg0LCAweDUxQTUsIDB4MEVDOSwgMHg1MUE2LCAweDEwODUsIDB4NTFBOCwgMHgwRENDLAotICAgIDB4NTFBOSwgMHgxMDg3LCAweDUxQUEsIDB4MTA4OCwgMHg1MUFCLCAweDEwODksIDB4NTFBQywgMHgwQzU5LAotICAgIDB4NTFBRCwgMHg0MzlBLCAweDUxQjAsIDB4MTA4RCwgMHg1MUIxLCAweDEwOEIsIDB4NTFCMiwgMHgxMDhDLAotICAgIDB4NTFCMywgMHgxMDhBLCAweDUxQjQsIDB4MDg1MywgMHg1MUI1LCAweDEwOEUsIDB4NTFCNiwgMHgwRUY2LAotICAgIDB4NTFCNywgMHgwRkFDLCAweDUxQjgsIDB4NEFFNiwgMHg1MUJBLCAweDRBRTcsIDB4NTFCQywgMHgzODBGLAotICAgIDB4NTFCRCwgMHgxMDhGLCAweDUxQkUsIDB4MjBDQywgMHg1MUMzLCAweDNDMzIsIDB4NTFDNCwgMHgwQTRDLAotICAgIDB4NTFDNSwgMHgxMDkwLCAweDUxQzYsIDB4MDk2NCwgMHg1MUM4LCAweDRBRTgsIDB4NTFDOSwgMHgxMDkxLAotICAgIDB4NTFDQSwgMHg0MTlBLCAweDUxQ0IsIDB4MEJCQSwgMHg1MUNDLCAweDBGODcsIDB4NTFDRCwgMHgwQzVBLAotICAgIDB4NTFDRiwgMHg0QUU5LCAweDUxRDEsIDB4NEFFQSwgMHg1MUQzLCAweDRBRUIsIDB4NTFENCwgMHg0QUVDLAotICAgIDB4NTFENiwgMHgxMERBLCAweDUxRDgsIDB4NEFFRCwgMHg1MURCLCAweDEwOTIsIDB4NTFEQywgMHgyMDVDLAotICAgIDB4NTFERCwgMHgwNkJELCAweDUxREUsIDB4NEY0QywgMHg1MURGLCAweDRBRUUsIDB4NTFFMCwgMHgxMDkzLAotICAgIDB4NTFFMSwgMHgwRThDLCAweDUxRTIsIDB4NDE5QiwgMHg1MUU2LCAweDA5NzIsIDB4NTFFNywgMHgwQjVDLAotICAgIDB4NTFFOSwgMHgxMDk1LCAweDUxRUEsIDB4MENCQywgMHg1MUVDLCAweDIwQ0QsIDB4NTFFRCwgMHgxMDk2LAotICAgIDB4NTFFRSwgMHgzODExLCAweDUxRjAsIDB4MTA5NywgMHg1MUYxLCAweDA1OEMsIDB4NTFGMywgMHg0MzlELAotICAgIDB4NTFGNCwgMHgzODEyLCAweDUxRjUsIDB4MTA5OCwgMHg1MUY2LCAweDA2OUYsIDB4NTFGOCwgMHgwQ0E0LAotICAgIDB4NTFGOSwgMHgwNTFDLCAweDUxRkEsIDB4MDk1QSwgMHg1MUZELCAweDBEMzUsIDB4NTFGRSwgMHgxMDk5LAotICAgIDB4NTIwMCwgMHgwQzVCLCAweDUyMDEsIDB4MzgxMywgMHg1MjAyLCAweDM4MTQsIDB4NTIwMywgMHgwQTE1LAotICAgIDB4NTIwNCwgMHgxMDlBLCAweDUyMDUsIDB4NEFFRiwgMHg1MjA2LCAweDBERkMsIDB4NTIwNywgMHgwQTdFLAotICAgIDB4NTIwOCwgMHgwNURFLCAweDUyMEEsIDB4MDVFNSwgMHg1MjBCLCAweDEwOUIsIDB4NTIwRSwgMHgxMDlELAotICAgIDB4NTIxMSwgMHgwNzEwLCAweDUyMTIsIDB4NDM5RSwgMHg1MjEzLCAweDM4MTUsIDB4NTIxNCwgMHgxMDlDLAotICAgIDB4NTIxNSwgMHgyMENFLCAweDUyMTYsIDB4NDM5RiwgMHg1MjE3LCAweDBGQkIsIDB4NTIxRCwgMHgwOTczLAotICAgIDB4NTIyNCwgMHgwRDUxLCAweDUyMjUsIDB4MEUxQywgMHg1MjI2LCAweDRBRjAsIDB4NTIyNywgMHgxMDlFLAotICAgIDB4NTIyOCwgMHg0QUYxLCAweDUyMjksIDB4MEY2MiwgMHg1MjJBLCAweDEwOUYsIDB4NTIyQiwgMHg0QUYyLAotICAgIDB4NTIyRSwgMHgxMEEwLCAweDUyMzAsIDB4MEM3OCwgMHg1MjMxLCAweDRBRjMsIDB4NTIzMiwgMHg0QUY0LAotICAgIDB4NTIzMywgMHgxMEExLCAweDUyMzUsIDB4NEFGNSwgMHg1MjM2LCAweDBBNEQsIDB4NTIzNywgMHgwODZFLAotICAgIDB4NTIzOCwgMHgwNzRBLCAweDUyMzksIDB4MTBBMiwgMHg1MjNBLCAweDA4OTcsIDB4NTIzQiwgMHgwODAxLAotICAgIDB4NTIzQywgMHg0QUY2LCAweDUyNDMsIDB4MEMwMiwgMHg1MjQ0LCAweDEwQTQsIDB4NTI0NywgMHgwQjA3LAotICAgIDB4NTI0OSwgMHgzODE2LCAweDUyNEEsIDB4MDg1RiwgMHg1MjRCLCAweDEwQTUsIDB4NTI0QywgMHgxMEE2LAotICAgIDB4NTI0RCwgMHgwQUIyLCAweDUyNEYsIDB4MTBBMywgMHg1MjU0LCAweDEwQTgsIDB4NTI1NSwgMHg0M0ExLAotICAgIDB4NTI1NiwgMHgwRTY0LCAweDUyNTcsIDB4NDE5QywgMHg1MjVBLCAweDRBRjcsIDB4NTI1QiwgMHgwN0Y2LAotICAgIDB4NTI1QywgMHg0M0EyLCAweDUyNUQsIDB4MUU1RSwgMHg1MjVFLCAweDEwQTcsIDB4NTI2MCwgMHg0QUY4LAotICAgIDB4NTI2MSwgMHgzODE3LCAweDUyNjMsIDB4MDc0QiwgMHg1MjY0LCAweDA4NEUsIDB4NTI2NSwgMHgwRDIzLAotICAgIDB4NTI2NiwgMHgzODE4LCAweDUyNjksIDB4MTBBQiwgMHg1MjZBLCAweDEwQTksIDB4NTI2QywgMHg0M0EzLAotICAgIDB4NTI2RSwgMHg0QUY5LCAweDUyNkYsIDB4MERFRCwgMHg1MjcwLCAweDA5RDIsIDB4NTI3MSwgMHgxMEIyLAotICAgIDB4NTI3MiwgMHgwNUMyLCAweDUyNzMsIDB4MTBBQywgMHg1Mjc0LCAweDEwQUEsIDB4NTI3NSwgMHgwQUQxLAotICAgIDB4NTI3NywgMHg0M0E0LCAweDUyNzgsIDB4NEFGQSwgMHg1Mjc5LCAweDRBRkIsIDB4NTI3RCwgMHgxMEFFLAotICAgIDB4NTI3RiwgMHgxMEFELCAweDUyODIsIDB4NDNBNiwgMHg1MjgzLCAweDA1QTIsIDB4NTI4NCwgMHg0M0E1LAotICAgIDB4NTI4NywgMHgwNzM2LCAweDUyODgsIDB4MTBCMywgMHg1Mjg5LCAweDBGNzUsIDB4NTI4QSwgMHg0QUZDLAotICAgIDB4NTI4QywgMHg0QUZELCAweDUyOEQsIDB4MTBBRiwgMHg1MjkxLCAweDEwQjQsIDB4NTI5MiwgMHgxMEIxLAotICAgIDB4NTI5MywgMHgzODE5LCAweDUyOTQsIDB4MTBCMCwgMHg1Mjk4LCAweDQzQTgsIDB4NTI5QiwgMHgwRjk3LAotICAgIDB4NTI5QywgMHgyMENGLCAweDUyOUYsIDB4MDdBRCwgMHg1MkEwLCAweDA1NDMsIDB4NTJBMywgMHgwRkJDLAotICAgIDB4NTJBNCwgMHg0M0FBLCAweDUyQTYsIDB4MjBEMCwgMHg1MkE5LCAweDA5N0YsIDB4NTJBQSwgMHgwQzUyLAotICAgIDB4NTJBQiwgMHgwN0Y3LCAweDUyQUMsIDB4MTBCNywgMHg1MkFELCAweDEwQjgsIDB4NTJBRiwgMHgyMTdELAotICAgIDB4NTJCMSwgMHgwRkFELCAweDUyQjQsIDB4MEZEMSwgMHg1MkI1LCAweDEwQkEsIDB4NTJCOSwgMHgwN0FFLAotICAgIDB4NTJCQSwgMHg0M0FCLCAweDUyQkIsIDB4NDNBQywgMHg1MkJDLCAweDEwQjksIDB4NTJCRSwgMHgwNThELAotICAgIDB4NTJDMCwgMHgyMEQxLCAweDUyQzEsIDB4MTBCQiwgMHg1MkMzLCAweDBFODQsIDB4NTJDNSwgMHgwQkQ4LAotICAgIDB4NTJDNywgMHgwRjEwLCAweDUyQzgsIDB4MzgxQSwgMHg1MkM5LCAweDBFMjksIDB4NTJDQSwgMHg0M0FELAotICAgIDB4NTJDQywgMHg0MTlELCAweDUyQ0QsIDB4MTBCQywgMHg1MkQwLCAweDM2RTgsIDB4NTJEMSwgMHg0M0FFLAotICAgIDB4NTJEMiwgMHgxQkVFLCAweDUyRDUsIDB4MEM4OCwgMHg1MkQ2LCAweDQxOUUsIDB4NTJENywgMHgxMEJELAotICAgIDB4NTJEOCwgMHgwNUU2LCAweDUyRDksIDB4MEVCRiwgMHg1MkRCLCAweDIwRDIsIDB4NTJERCwgMHgwOTg5LAotICAgIDB4NTJERSwgMHgxMEJFLCAweDUyREYsIDB4MEUzNywgMHg1MkUwLCAweDEwQzIsIDB4NTJFMSwgMHg0QUZFLAotICAgIDB4NTJFMiwgMHgwQTRFLCAweDUyRTMsIDB4MTBCRiwgMHg1MkU0LCAweDA2QzgsIDB4NTJFNiwgMHgxMEMwLAotICAgIDB4NTJFNywgMHgwNUU3LCAweDUyRTksIDB4NEFGRiwgMHg1MkYwLCAweDM4MUIsIDB4NTJGMSwgMHg0QjAwLAotICAgIDB4NTJGMiwgMHgwNzA0LCAweDUyRjMsIDB4MTBDMywgMHg1MkY1LCAweDEwQzQsIDB4NTJGNywgMHg0M0IwLAotICAgIDB4NTJGOCwgMHgxMEM1LCAweDUyRjksIDB4MTBDNiwgMHg1MkZBLCAweDA5MDcsIDB4NTJGQiwgMHg0MTlGLAotICAgIDB4NTJGRSwgMHgwN0FGLCAweDUyRkYsIDB4MEVFQSwgMHg1MzAwLCAweDIwRDMsIDB4NTMwMSwgMHgwRUY0LAotICAgIDB4NTMwMiwgMHgwQ0NGLCAweDUzMDMsIDB4NEIwMSwgMHg1MzA1LCAweDBFNDEsIDB4NTMwNiwgMHgxMEM3LAotICAgIDB4NTMwNywgMHg0RjRELCAweDUzMDgsIDB4MTBDOCwgMHg1MzBBLCAweDM4MUMsIDB4NTMwQiwgMHgzODFELAotICAgIDB4NTMwRCwgMHgxMENBLCAweDUzMEYsIDB4MTBDQywgMHg1MzEwLCAweDEwQ0IsIDB4NTMxMSwgMHg0QjAyLAotICAgIDB4NTMxNSwgMHgxMENELCAweDUzMTYsIDB4MDUzRCwgMHg1MzE3LCAweDBFN0EsIDB4NTMxOSwgMHgwODZDLAotICAgIDB4NTMxQSwgMHgxMENFLCAweDUzMUMsIDB4NDFBMCwgMHg1MzFELCAweDBBREIsIDB4NTMxRiwgMHg0QjAzLAotICAgIDB4NTMyMCwgMHgwOThBLCAweDUzMjEsIDB4MDZBMSwgMHg1MzIzLCAweDEwQ0YsIDB4NTMyNCwgMHgyMEQ1LAotICAgIDB4NTMyQSwgMHgwRDZGLCAweDUzMkQsIDB4NEIwNCwgMHg1MzJGLCAweDEwRDAsIDB4NTMzMSwgMHgxMEQxLAotICAgIDB4NTMzMiwgMHg0QjA1LCAweDUzMzMsIDB4MTBEMiwgMHg1MzM1LCAweDQzQjEsIDB4NTMzOCwgMHgxMEQzLAotICAgIDB4NTMzOSwgMHgwRDk2LCAweDUzM0EsIDB4MDZFMCwgMHg1MzNCLCAweDA0QTksIDB4NTMzRCwgMHg0QjA2LAotICAgIDB4NTMzRSwgMHgzODFFLCAweDUzM0YsIDB4MEM5NywgMHg1MzQwLCAweDEwRDQsIDB4NTM0MSwgMHgwOTQ3LAotICAgIDB4NTM0MiwgMHg0M0IyLCAweDUzNDMsIDB4MEE4RCwgMHg1MzQ1LCAweDEwRDYsIDB4NTM0NiwgMHgxMEQ1LAotICAgIDB4NTM0NywgMHgwOThCLCAweDUzNDgsIDB4MDc5NSwgMHg1MzQ5LCAweDEwRDgsIDB4NTM0QSwgMHgwRDUyLAotICAgIDB4NTM0QiwgMHgzODIwLCAweDUzNEMsIDB4MzgxRiwgMHg1MzRELCAweDEwRDksIDB4NTM1MSwgMHgwRDcwLAotICAgIDB4NTM1MiwgMHgwQjE0LCAweDUzNTMsIDB4MEI0RSwgMHg1MzU0LCAweDA2QTAsIDB4NTM1NywgMHgwQ0M2LAotICAgIDB4NTM1OCwgMHgwQjZGLCAweDUzNUEsIDB4MEQyNCwgMHg1MzVDLCAweDBFN0MsIDB4NTM1RSwgMHgxMERCLAotICAgIDB4NTM2MCwgMHgwQThFLCAweDUzNjEsIDB4MzgyMSwgMHg1MzYzLCAweDQxQTEsIDB4NTM2NSwgMHg0QjA3LAotICAgIDB4NTM2NiwgMHgwNzBCLCAweDUzNjcsIDB4NDNCNSwgMHg1MzY5LCAweDEwREMsIDB4NTM2QywgMHgzODIyLAotICAgIDB4NTM2RCwgMHg0QjA4LCAweDUzNkUsIDB4MTBERCwgMHg1MzZGLCAweDA0Q0UsIDB4NTM3MCwgMHgwNEI5LAotICAgIDB4NTM3MSwgMHgwNjI5LCAweDUzNzIsIDB4MjBENiwgMHg1MzczLCAweDBCMDgsIDB4NTM3NCwgMHgwNjZCLAotICAgIDB4NTM3NSwgMHgwRjVCLCAweDUzNzcsIDB4MTBFMCwgMHg1Mzc4LCAweDA1MzcsIDB4NTM3OSwgMHg0QjA5LAotICAgIDB4NTM3QSwgMHg0M0I2LCAweDUzN0IsIDB4MTBERiwgMHg1MzdELCAweDM0MzUsIDB4NTM3RSwgMHg0QjBBLAotICAgIDB4NTM3RiwgMHgwNkEyLCAweDUzODIsIDB4MTBFMSwgMHg1Mzg0LCAweDBFRkQsIDB4NTM4OSwgMHgzN0QwLAotICAgIDB4NTM5MywgMHgyMEQ3LCAweDUzOTQsIDB4NEIwQiwgMHg1Mzk2LCAweDEwRTIsIDB4NTM5OCwgMHgwRjlBLAotICAgIDB4NTM5OSwgMHg0QjBDLCAweDUzOUEsIDB4MDdCMCwgMHg1MzlELCAweDQxQTIsIDB4NTM5RiwgMHgwNzZBLAotICAgIDB4NTNBMCwgMHgxMEUzLCAweDUzQTQsIDB4NDNCNywgMHg1M0E1LCAweDEwRTUsIDB4NTNBNiwgMHgxMEU0LAotICAgIDB4NTNBOCwgMHgwQTI1LCAweDUzQTksIDB4MDREQiwgMHg1M0FBLCAweDRCMEQsIDB4NTNBQiwgMHgzODIzLAotICAgIDB4NTNBRCwgMHgwNTAwLCAweDUzQUUsIDB4MTBFNiwgMHg1M0FGLCAweDRCMEUsIDB4NTNCMCwgMHgxMEU3LAotICAgIDB4NTNCMiwgMHgyMEQ4LCAweDUzQjMsIDB4MDc2QiwgMHg1M0I0LCAweDQzQjgsIDB4NTNCNiwgMHgxMEU4LAotICAgIDB4NTNCNywgMHg0M0JBLCAweDUzQkEsIDB4NEIwRiwgMHg1M0JCLCAweDA2ODgsIDB4NTNDMCwgMHg0M0JCLAotICAgIDB4NTNDMSwgMHg0QjEwLCAweDUzQzIsIDB4MDg4MCwgMHg1M0MzLCAweDEwRTksIDB4NTNDNCwgMHg0QjExLAotICAgIDB4NTNDNSwgMHg0QjEyLCAweDUzQzgsIDB4MEVBMiwgMHg1M0M5LCAweDA4MjUsIDB4NTNDQSwgMHgwNjc0LAotICAgIDB4NTNDQiwgMHgwRjExLCAweDUzQ0MsIDB4MEFEMiwgMHg1M0NELCAweDBENTMsIDB4NTNDRSwgMHgwOTI5LAotICAgIDB4NTNENCwgMHgwOTUxLCAweDUzRDUsIDB4NDNCRiwgMHg1M0Q2LCAweDA5MTQsIDB4NTNENywgMHgwOTIxLAotICAgIDB4NTNEOSwgMHgwOTgwLCAweDUzREEsIDB4MzgyNCwgMHg1M0RCLCAweDBENTQsIDB4NTNERCwgMHgyMEQ5LAotICAgIDB4NTNERiwgMHgxMEVDLCAweDUzRTAsIDB4NEIxMywgMHg1M0UxLCAweDA0RTUsIDB4NTNFMiwgMHgwQUQzLAotICAgIDB4NTNFMywgMHgwN0IxLCAweDUzRTQsIDB4MDc3OSwgMHg1M0U1LCAweDA2REYsIDB4NTNFNiwgMHgzODI1LAotICAgIDB4NTNFOCwgMHgxMEYwLCAweDUzRTksIDB4MEI1RiwgMHg1M0VBLCAweDBCNUUsIDB4NTNFQiwgMHgwNkEzLAotICAgIDB4NTNFQywgMHgwOThDLCAweDUzRUQsIDB4MTBGMSwgMHg1M0VFLCAweDEwRUYsIDB4NTNFRiwgMHgwNTQ0LAotICAgIDB4NTNGMCwgMHgwQjQ2LCAweDUzRjEsIDB4MDhFNCwgMHg1M0YyLCAweDA4OTksIDB4NTNGMywgMHgwNEM4LAotICAgIDB4NTNGNCwgMHg0M0MxLCAweDUzRjUsIDB4MzgyNiwgMHg1M0Y2LCAweDA1Q0UsIDB4NTNGNywgMHgwN0Y4LAotICAgIDB4NTNGOCwgMHgwODk4LCAweDUzRkEsIDB4MTBGMiwgMHg1NDAxLCAweDEwRjMsIDB4NTQwMywgMHgwNjYzLAotICAgIDB4NTQwNCwgMHgwNUE0LCAweDU0MDgsIDB4MDdGOSwgMHg1NDA5LCAweDA2NjIsIDB4NTQwQSwgMHgwQkZCLAotICAgIDB4NTQwQiwgMHgwNEM3LCAweDU0MEMsIDB4MEM4OSwgMHg1NDBELCAweDBFQ0EsIDB4NTQwRSwgMHgwN0IzLAotICAgIDB4NTQwRiwgMHgwRjYzLCAweDU0MTAsIDB4MEM0MSwgMHg1NDExLCAweDA3QjIsIDB4NTQxMiwgMHg0MUEzLAotICAgIDB4NTQxMywgMHg0QjE0LCAweDU0MUIsIDB4MDcwNSwgMHg1NDFELCAweDEwRkMsIDB4NTQxRSwgMHgzNjhDLAotICAgIDB4NTQxRiwgMHgwNkRCLCAweDU0MjAsIDB4MEU3OCwgMHg1NDI0LCAweDQzQzIsIDB4NTQyNiwgMHgwRDcxLAotICAgIDB4NTQyNywgMHgzODI3LCAweDU0MjgsIDB4NDNDMywgMHg1NDI5LCAweDEwRkIsIDB4NTQyQSwgMHg0QjE1LAotICAgIDB4NTQyQiwgMHgwNjFBLCAweDU0MkMsIDB4MTBGNiwgMHg1NDJELCAweDEwRjcsIDB4NTQyRSwgMHgxMEY5LAotICAgIDB4NTQzMSwgMHg0QjE2LCAweDU0MzMsIDB4MzVDMCwgMHg1NDM0LCAweDRCMTcsIDB4NTQzNSwgMHg0QjE4LAotICAgIDB4NTQzNiwgMHgxMEZBLCAweDU0MzgsIDB4MDY3NSwgMHg1NDM5LCAweDBBMjcsIDB4NTQzQiwgMHgwREZELAotICAgIDB4NTQzQywgMHgxMEY4LCAweDU0M0QsIDB4MTBGNCwgMHg1NDNFLCAweDA3OTcsIDB4NTQzRiwgMHgzNUNGLAotICAgIDB4NTQ0MCwgMHgxMEY1LCAweDU0NDIsIDB4MEZDQSwgMHg1NDQzLCAweDQzQzUsIDB4NTQ0NiwgMHgwRTQyLAotICAgIDB4NTQ0OCwgMHgwQzA0LCAweDU0NDksIDB4MDc5NiwgMHg1NDRBLCAweDA4MDIsIDB4NTQ0QywgMHg0QjE5LAotICAgIDB4NTQ0RCwgMHgzODI4LCAweDU0NEUsIDB4MTBGRCwgMHg1NDUxLCAweDBDQjUsIDB4NTQ1NSwgMHgzNzIzLAotICAgIDB4NTQ1RiwgMHgxMTAxLCAweDU0NjIsIDB4NDNDNiwgMHg1NDY2LCAweDM4MjksIDB4NTQ2OCwgMHgwOTJBLAotICAgIDB4NTQ2QSwgMHgwOTIyLCAweDU0NkIsIDB4MzgyQSwgMHg1NDZDLCAweDQzQzcsIDB4NTQ3MCwgMHgxMTA0LAotICAgIDB4NTQ3MSwgMHgxMTAyLCAweDU0NzMsIDB4MEVBRiwgMHg1NDc0LCAweDM4MkIsIDB4NTQ3NSwgMHgxMEZGLAotICAgIDB4NTQ3NiwgMHgxMTA4LCAweDU0NzcsIDB4MTEwMywgMHg1NDdCLCAweDExMDYsIDB4NTQ3QywgMHgwNzdBLAotICAgIDB4NTQ3RCwgMHgwRUNCLCAweDU0N0YsIDB4NDFBNCwgMHg1NDgwLCAweDExMDcsIDB4NTQ4NCwgMHgxMTA5LAotICAgIDB4NTQ4NiwgMHgxMTBCLCAweDU0ODgsIDB4NDFBNSwgMHg1NDhBLCAweDIwREMsIDB4NTQ4QiwgMHgwODYwLAotICAgIDB4NTQ4QywgMHgwRkU4LCAweDU0OEQsIDB4MzgyQywgMHg1NDhFLCAweDExMDAsIDB4NTQ4RiwgMHgxMEZFLAotICAgIDB4NTQ5MCwgMHgxMTBBLCAweDU0OTIsIDB4MTEwNSwgMHg1NDk1LCAweDQzQzgsIDB4NTQ5NiwgMHgzODJELAotICAgIDB4NTQ5QywgMHgyMERCLCAweDU0QTAsIDB4NDNDOSwgMHg1NEExLCAweDM4MkUsIDB4NTRBMiwgMHgxMTBELAotICAgIDB4NTRBNCwgMHgxMTE2LCAweDU0QTUsIDB4MTEwRiwgMHg1NEE2LCAweDQzQ0EsIDB4NTRBNywgMHg0QjFBLAotICAgIDB4NTRBOCwgMHgxMTEzLCAweDU0QTksIDB4MjBERCwgMHg1NEFBLCAweDRCMUIsIDB4NTRBQiwgMHgxMTE0LAotICAgIDB4NTRBQywgMHgxMTEwLCAweDU0QUQsIDB4MzgyRiwgMHg1NEFFLCAweDQzQ0IsIDB4NTRBRiwgMHgxMTMxLAotICAgIDB4NTRCMSwgMHg0QjFDLCAweDU0QjIsIDB4MDg1OSwgMHg1NEIzLCAweDA1OEYsIDB4NTRCNywgMHg0M0NDLAotICAgIDB4NTRCOCwgMHgxMTBFLCAweDU0QjksIDB4MzgzMCwgMHg1NEJBLCAweDQzQ0QsIDB4NTRCQiwgMHg0QjFELAotICAgIDB4NTRCQywgMHgxMTE4LCAweDU0QkQsIDB4MDRCQSwgMHg1NEJFLCAweDExMTcsIDB4NTRCRiwgMHgzODMxLAotICAgIDB4NTRDMCwgMHgwNDY5LCAweDU0QzEsIDB4MERCQywgMHg1NEMyLCAweDExMTUsIDB4NTRDMywgMHg0M0NFLAotICAgIDB4NTRDNCwgMHgxMTExLCAweDU0QzYsIDB4MzgzMiwgMHg1NEM3LCAweDExMEMsIDB4NTRDOCwgMHgxMTEyLAotICAgIDB4NTRDOSwgMHgwODM4LCAweDU0Q0QsIDB4MzgzMywgMHg1NENFLCAweDRCMUUsIDB4NTREOCwgMHgxMTE5LAotICAgIDB4NTRFMSwgMHgwNEJCLCAweDU0RTIsIDB4MTEyMiwgMHg1NEU1LCAweDExMUEsIDB4NTRFNiwgMHgxMTFCLAotICAgIDB4NTRFOCwgMHgwOThELCAweDU0RTksIDB4MEU5NywgMHg1NEVBLCAweDRCMUYsIDB4NTRFQywgMHg0M0QwLAotICAgIDB4NTRFRCwgMHgxMTIwLCAweDU0RUUsIDB4MTExRiwgMHg1NEVGLCAweDQzRDEsIDB4NTRGMSwgMHg0M0QyLAotICAgIDB4NTRGMiwgMHgwQzI5LCAweDU0RjMsIDB4NDNEMywgMHg1NEZBLCAweDExMjEsIDB4NTRGQywgMHg0QjIwLAotICAgIDB4NTRGRCwgMHgxMTFFLCAweDU0RkYsIDB4MjBERSwgMHg1NTAwLCAweDQzRDQsIDB4NTUwMSwgMHg0M0Q1LAotICAgIDB4NTUwNCwgMHgwNEQ2LCAweDU1MDUsIDB4NEIyMSwgMHg1NTA2LCAweDA4MjYsIDB4NTUwNywgMHgwOUY2LAotICAgIDB4NTUwOCwgMHg0QjIyLCAweDU1MDksIDB4NDNENiwgMHg1NTBFLCAweDM4MzQsIDB4NTUwRiwgMHgxMTFDLAotICAgIDB4NTUxMCwgMHgwQzVDLCAweDU1MTQsIDB4MTExRCwgMHg1NTE1LCAweDRCMjMsIDB4NTUxNiwgMHgwNDY2LAotICAgIDB4NTUyNywgMHg0QjI0LCAweDU1MkEsIDB4NEIyNSwgMHg1NTJCLCAweDM4MzUsIDB4NTUyRSwgMHgxMTI3LAotICAgIDB4NTUyRiwgMHgwRjBELCAweDU1MzEsIDB4MDk4RiwgMHg1NTMzLCAweDExMkQsIDB4NTUzNSwgMHgzODM2LAotICAgIDB4NTUzNiwgMHg0QjI2LCAweDU1MzgsIDB4MTEyQywgMHg1NTM5LCAweDExMjMsIDB4NTUzQywgMHg0M0Q3LAotICAgIDB4NTUzRSwgMHgwQjIzLCAweDU1NDAsIDB4MTEyNCwgMHg1NTQxLCAweDQzRDgsIDB4NTU0NCwgMHgwQjRGLAotICAgIDB4NTU0NSwgMHgxMTI5LCAweDU1NDYsIDB4MDk4RSwgMHg1NTQ3LCAweDQzREEsIDB4NTU0QSwgMHgzODM3LAotICAgIDB4NTU0QywgMHgxMTI2LCAweDU1NEYsIDB4MEVGMCwgMHg1NTUwLCAweDQxQTYsIDB4NTU1MSwgMHg0QjI3LAotICAgIDB4NTU1MywgMHgwNzEyLCAweDU1NTYsIDB4MTEyQSwgMHg1NTU3LCAweDExMkIsIDB4NTU1QywgMHgxMTI4LAotICAgIDB4NTU1RCwgMHgxMTJFLCAweDU1NUUsIDB4MUREMSwgMHg1NTYwLCAweDM4MzgsIDB4NTU2MSwgMHg0RjU0LAotICAgIDB4NTU2MywgMHgxMTI1LCAweDU1NjQsIDB4NDNEQywgMHg1NTY2LCAweDRCMjgsIDB4NTU3QiwgMHgxMTM0LAotICAgIDB4NTU3QywgMHgxMTM5LCAweDU1N0QsIDB4NDNERSwgMHg1NTdFLCAweDExMzUsIDB4NTU4MCwgMHgxMTMwLAotICAgIDB4NTU4MSwgMHg0MUE3LCAweDU1ODIsIDB4NDNERiwgMHg1NTgzLCAweDExM0EsIDB4NTU4NCwgMHgwQUIzLAotICAgIDB4NTU4NiwgMHgyMERGLCAweDU1ODcsIDB4MTEzQywgMHg1NTg4LCAweDM4M0EsIDB4NTU4OSwgMHgwN0I0LAotICAgIDB4NTU4QSwgMHgxMTMyLCAweDU1OEIsIDB4MEJCQiwgMHg1NThFLCAweDM4M0IsIDB4NTU4RiwgMHg0QjI5LAotICAgIDB4NTU5MSwgMHg0M0UwLCAweDU1OTIsIDB4NEIyQSwgMHg1NTk0LCAweDRCMkIsIDB4NTU5OCwgMHgxMTM2LAotICAgIDB4NTU5OSwgMHgxMTJGLCAweDU1OUEsIDB4MDVFOSwgMHg1NTlDLCAweDA2MkEsIDB4NTU5RCwgMHgwNUMzLAotICAgIDB4NTU5RSwgMHgxMTM3LCAweDU1OUYsIDB4MTEzMywgMHg1NUE0LCAweDRCMkMsIDB4NTVBNywgMHgwNzRDLAotICAgIDB4NTVBOCwgMHgxMTNELCAweDU1QTksIDB4MTEzQiwgMHg1NUFBLCAweDBBRDUsIDB4NTVBQiwgMHgwNjY0LAotICAgIDB4NTVBQywgMHgwNkE0LCAweDU1QUQsIDB4NDFBOCwgMHg1NUFFLCAweDExMzgsIDB4NTVCMCwgMHgwNkVDLAotICAgIDB4NTVCMiwgMHg0QjJELCAweDU1QjYsIDB4MDRFNiwgMHg1NUJGLCAweDQzRTUsIDB4NTVDMywgMHg0QjJFLAotICAgIDB4NTVDNCwgMHgxMTQxLCAweDU1QzUsIDB4MTEzRiwgMHg1NUM2LCAweDRCMkYsIDB4NTVDNywgMHgxMTc4LAotICAgIDB4NTVDOSwgMHg0M0U2LCAweDU1Q0MsIDB4NDNFNywgMHg1NUNFLCAweDQxQTksIDB4NTVEMSwgMHg0M0U4LAotICAgIDB4NTVEMiwgMHg0M0UyLCAweDU1RDMsIDB4NEIzMCwgMHg1NUQ0LCAweDExNDQsIDB4NTVEQSwgMHgxMTNFLAotICAgIDB4NTVEQiwgMHg0QjMxLCAweDU1REMsIDB4MTE0MiwgMHg1NURELCAweDQzRTksIDB4NTVERiwgMHgxMTQwLAotICAgIDB4NTVFMiwgMHg0M0VCLCAweDU1RTMsIDB4MDg5QSwgMHg1NUU0LCAweDExNDMsIDB4NTVFOSwgMHg0M0VELAotICAgIDB4NTVFQywgMHg0QjMyLCAweDU1RUUsIDB4NEIzMywgMHg1NUYxLCAweDRCMzQsIDB4NTVGNiwgMHg0QjM1LAotICAgIDB4NTVGNywgMHgxMTQ2LCAweDU1RjgsIDB4NEIzNiwgMHg1NUY5LCAweDExNEIsIDB4NTVGRCwgMHgxMTQ5LAotICAgIDB4NTVGRSwgMHgxMTQ4LCAweDU2MDUsIDB4NEIzNywgMHg1NjA2LCAweDBCNzAsIDB4NTYwNywgMHg0M0YwLAotICAgIDB4NTYwOCwgMHgzODNDLCAweDU2MDksIDB4MDU0NSwgMHg1NjBELCAweDRCMzgsIDB4NTYwRSwgMHgzODNELAotICAgIDB4NTYwRiwgMHgzODNFLCAweDU2MTAsIDB4NDNGMSwgMHg1NjExLCAweDRCMzksIDB4NTYxMiwgMHg0QjNBLAotICAgIDB4NTYxNCwgMHgxMTQ1LCAweDU2MTYsIDB4MTE0NywgMHg1NjE3LCAweDA5OTAsIDB4NTYxOCwgMHgwNEQ1LAotICAgIDB4NTYxQiwgMHgxMTRBLCAweDU2MjAsIDB4M0MxRCwgMHg1NjI4LCAweDQzRUUsIDB4NTYyOSwgMHgwNTVFLAotICAgIDB4NTYyQywgMHg0QjNCLCAweDU2MkYsIDB4MTE1NSwgMHg1NjMwLCAweDQzRjIsIDB4NTYzMSwgMHgwOUU0LAotICAgIDB4NTYzMiwgMHgxMTUxLCAweDU2MzQsIDB4MTE0RiwgMHg1NjM1LCAweDRCM0MsIDB4NTYzNiwgMHgxMTUwLAotICAgIDB4NTYzNywgMHgzODNGLCAweDU2MzgsIDB4MTE1MiwgMHg1NjM5LCAweDRCM0QsIDB4NTYzQiwgMHg0MUFBLAotICAgIDB4NTYzRCwgMHg0M0Y0LCAweDU2M0YsIDB4Mzg0MCwgMHg1NjQwLCAweDQzRjUsIDB4NTY0MiwgMHgwNERGLAotICAgIDB4NTY0NywgMHg0M0Y2LCAweDU2NDksIDB4Mzg0MSwgMHg1NjRCLCAweDM4NDIsIDB4NTY0QywgMHgwQUJCLAotICAgIDB4NTY0RCwgMHg0QjNFLCAweDU2NEUsIDB4MTE0QywgMHg1NjRGLCAweDM4NDMsIDB4NTY1MCwgMHgxMTRELAotICAgIDB4NTY1MywgMHgxRjFCLCAweDU2NTQsIDB4NEIzRiwgMHg1NjVCLCAweDA1RDgsIDB4NTY1RSwgMHg0M0Y3LAotICAgIDB4NTY2MCwgMHg0M0Y4LCAweDU2NjQsIDB4MTE1NCwgMHg1NjY2LCAweDM4NDQsIDB4NTY2OCwgMHgwNjJCLAotICAgIDB4NTY2OSwgMHgzODQ1LCAweDU2NkEsIDB4MTE1NywgMHg1NjZCLCAweDExNTMsIDB4NTY2QywgMHgxMTU2LAotICAgIDB4NTY2RCwgMHg0M0Y5LCAweDU2NkYsIDB4Mzg0NiwgMHg1NjcxLCAweDM4NDcsIDB4NTY3MiwgMHgzODQ4LAotICAgIDB4NTY3NCwgMHgwREZFLCAweDU2NzYsIDB4M0MzMywgMHg1Njc4LCAweDBDQUQsIDB4NTY3QSwgMHgwRDRDLAotICAgIDB4NTY4MCwgMHgxMTU5LCAweDU2ODUsIDB4NEI0MCwgMHg1Njg2LCAweDExNTgsIDB4NTY4NywgMHgwNUEzLAotICAgIDB4NTY4OCwgMHg0M0ZCLCAweDU2OEEsIDB4MTE1QSwgMHg1NjhDLCAweDQzRkMsIDB4NTY4RiwgMHgxMTVELAotICAgIDB4NTY5NCwgMHgxMTVDLCAweDU2OTUsIDB4Mzg0OSwgMHg1Njk5LCAweDFERTYsIDB4NTY5QSwgMHgzODRBLAotICAgIDB4NTY5RCwgMHg0M0ZELCAweDU2OUUsIDB4NDFBQiwgMHg1NjlGLCAweDRCNDEsIDB4NTZBMCwgMHgxMTVCLAotICAgIDB4NTZBMiwgMHgwQ0VGLCAweDU2QTUsIDB4MTE1RSwgMHg1NkE2LCAweDRCNDIsIDB4NTZBOCwgMHg0M0ZFLAotICAgIDB4NTZBOSwgMHg0MUFDLCAweDU2QUMsIDB4Mzg0QiwgMHg1NkFELCAweDM4NEMsIDB4NTZBRSwgMHgxMTVGLAotICAgIDB4NTZCMSwgMHgzODRELCAweDU2QjIsIDB4NDNGRiwgMHg1NkIzLCAweDQxQUQsIDB4NTZCNCwgMHgxMTYxLAotICAgIDB4NTZCNiwgMHgxMTYwLCAweDU2QjcsIDB4NEI0MywgMHg1NkJDLCAweDExNjMsIDB4NTZDMCwgMHgxMTY2LAotICAgIDB4NTZDMSwgMHgxMTY0LCAweDU2QzIsIDB4MTE2MiwgMHg1NkMzLCAweDExNjUsIDB4NTZDNSwgMHg0NDAwLAotICAgIDB4NTZDOCwgMHgxMTY3LCAweDU2QzksIDB4Mzg0RSwgMHg1NkNBLCAweDFFNUEsIDB4NTZDQywgMHg0QjQ0LAotICAgIDB4NTZDRCwgMHg0NDAxLCAweDU2Q0UsIDB4MTE2OCwgMHg1NkNGLCAweDRCNDUsIDB4NTZEMSwgMHgxMTY5LAotICAgIDB4NTZEMywgMHgxMTZBLCAweDU2RDcsIDB4MTE2QiwgMHg1NkQ4LCAweDEwN0MsIDB4NTZEOSwgMHg0QjQ2LAotICAgIDB4NTZEQSwgMHgwOTI4LCAweDU2REIsIDB4MDg5QiwgMHg1NkRELCAweDM4NEYsIDB4NTZERSwgMHgwNTczLAotICAgIDB4NTZERiwgMHg0NDAyLCAweDU2RTAsIDB4MDRCQywgMHg1NkUxLCAweDRCNDcsIDB4NTZFMywgMHgwQjgyLAotICAgIDB4NTZFNCwgMHgzODUwLCAweDU2RTgsIDB4NDQwMywgMHg1NkVCLCAweDRCNDgsIDB4NTZFRCwgMHg0QjQ5LAotICAgIDB4NTZFRSwgMHgxMTZDLCAweDU2RjAsIDB4MDgxNCwgMHg1NkYxLCAweDRCNEEsIDB4NTZGMiwgMHgwNDkzLAotICAgIDB4NTZGMywgMHgwQTI0LCAweDU2RjYsIDB4NDQwNCwgMHg1NkY3LCAweDQ0MDUsIDB4NTZGOSwgMHgxMTZELAotICAgIDB4NTZGQSwgMHgwNzdCLCAweDU2RkQsIDB4MDgwMywgMHg1NkZGLCAweDExNkYsIDB4NTcwMCwgMHgxMTZFLAotICAgIDB4NTcwMywgMHgwRTMwLCAweDU3MDQsIDB4MTE3MCwgMHg1NzA3LCAweDRCNEIsIDB4NTcwOCwgMHgxMTcyLAotICAgIDB4NTcwOSwgMHgxMTcxLCAweDU3MEEsIDB4Mzg1MSwgMHg1NzBCLCAweDExNzMsIDB4NTcwQywgMHg0QjRDLAotICAgIDB4NTcwRCwgMHgxMTc0LCAweDU3MEYsIDB4MDc0RCwgMHg1NzEyLCAweDA1MDIsIDB4NTcxMywgMHgxMTc1LAotICAgIDB4NTcxNSwgMHgzODUyLCAweDU3MTYsIDB4MTE3NywgMHg1NzE4LCAweDExNzYsIDB4NTcxQSwgMHg0QjRELAotICAgIDB4NTcxQiwgMHg0QjRFLCAweDU3MUMsIDB4MTE3OSwgMHg1NzFELCAweDRCNEYsIDB4NTcxRiwgMHgwQzU0LAotICAgIDB4NTcyMSwgMHgzNjgwLCAweDU3MjMsIDB4Mzg1MywgMHg1NzI2LCAweDExN0EsIDB4NTcyNywgMHgwNDc5LAotICAgIDB4NTcyOCwgMHgwODRGLCAweDU3MjksIDB4NDQwOCwgMHg1NzJDLCAweDRCNTAsIDB4NTcyRCwgMHgwNzEzLAotICAgIDB4NTcyRSwgMHg0QjUxLCAweDU3MkYsIDB4Mzg1NCwgMHg1NzMwLCAweDBCOEQsIDB4NTczMywgMHgzODU1LAotICAgIDB4NTczNCwgMHgzODU2LCAweDU3MzcsIDB4MTE3QiwgMHg1NzM4LCAweDExN0MsIDB4NTczQiwgMHgxMTdFLAotICAgIDB4NTczRCwgMHg0QjUyLCAweDU3M0UsIDB4NEI1MywgMHg1NzQwLCAweDExN0YsIDB4NTc0MiwgMHgwODU0LAotICAgIDB4NTc0NSwgMHg0NDBBLCAweDU3NDYsIDB4NDQwQiwgMHg1NzQ3LCAweDA2QzksIDB4NTc0QSwgMHgwRTY1LAotICAgIDB4NTc0QywgMHgzODU3LCAweDU3NEQsIDB4NDQwQywgMHg1NzRFLCAweDExN0QsIDB4NTc0RiwgMHgxMTgwLAotICAgIDB4NTc1MCwgMHgwODMxLCAweDU3NTEsIDB4MDdCNSwgMHg1NzU5LCAweDIwRTAsIDB4NTc1RiwgMHg0QjU0LAotICAgIDB4NTc2MSwgMHgxMTg0LCAweDU3NjQsIDB4MDgxNSwgMHg1NzY1LCAweDIwRTEsIDB4NTc2NiwgMHgwQjcxLAotICAgIDB4NTc2OCwgMHg0NDBFLCAweDU3NjksIDB4MTE4MSwgMHg1NzZBLCAweDBCRjYsIDB4NTc2QiwgMHg0QjU1LAotICAgIDB4NTc2RCwgMHg0QjU2LCAweDU3NkYsIDB4NDQwRiwgMHg1NzcwLCAweDM4NTgsIDB4NTc3MywgMHg0NDEwLAotICAgIDB4NTc3NCwgMHg0NDExLCAweDU3NzUsIDB4NDQxMiwgMHg1Nzc3LCAweDQxQUUsIDB4NTc3QSwgMHg0QjU3LAotICAgIDB4NTc3QiwgMHg0NDEzLCAweDU3N0MsIDB4NDFBRiwgMHg1NzdGLCAweDExODUsIDB4NTc4MiwgMHgwQTI4LAotICAgIDB4NTc4MywgMHg0QjU4LCAweDU3ODgsIDB4MTE4MywgMHg1Nzg5LCAweDExODYsIDB4NTc4QiwgMHgwNzE1LAotICAgIDB4NTc4QywgMHgzODU5LCAweDU3OTMsIDB4MTE4NywgMHg1Nzk3LCAweDRCNTksIDB4NTc5QSwgMHg0NDE2LAotICAgIDB4NTc5QywgMHgzODVBLCAweDU3OUQsIDB4NDQxNywgMHg1NzlFLCAweDQ0MTgsIDB4NTdBMCwgMHgxMTg4LAotICAgIDB4NTdBMiwgMHgwN0I2LCAweDU3QTMsIDB4MDU5RSwgMHg1N0E0LCAweDExOEEsIDB4NTdBOCwgMHg0NDE5LAotICAgIDB4NTdBQSwgMHgxMThCLCAweDU3QUMsIDB4MjBFMiwgMHg1N0FFLCAweDRCNUEsIDB4NTdCMCwgMHgxMThDLAotICAgIDB4NTdCMywgMHgxMTg5LCAweDU3QjgsIDB4Mzg1QiwgMHg1N0MwLCAweDExODIsIDB4NTdDMywgMHgxMThELAotICAgIDB4NTdDNiwgMHgxMThFLCAweDU3QzcsIDB4MjBFNCwgMHg1N0M4LCAweDIwRTMsIDB4NTdDQiwgMHgwRTkyLAotICAgIDB4NTdDQywgMHg0NDFDLCAweDU3Q0UsIDB4MDlEMywgMHg1N0NGLCAweDQxQjEsIDB4NTdEMiwgMHgxMTkwLAotICAgIDB4NTdEMywgMHgxMTkxLCAweDU3RDQsIDB4MTE4RiwgMHg1N0Q1LCAweDRCNUIsIDB4NTdENiwgMHgxMTkzLAotICAgIDB4NTdENywgMHg0NDFBLCAweDU3REMsIDB4MENFRSwgMHg1N0RFLCAweDQ0MUYsIDB4NTdERiwgMHgwNEFDLAotICAgIDB4NTdFMCwgMHgwREM4LCAweDU3RTMsIDB4MTE5NCwgMHg1N0U0LCAweDQxQjIsIDB4NTdFNiwgMHgzODVDLAotICAgIDB4NTdFNywgMHg0QjVDLCAweDU3RUQsIDB4Mzg1RCwgMHg1N0YwLCAweDQ0MjAsIDB4NTdGNCwgMHgwOUU1LAotICAgIDB4NTdGNSwgMHgzODVFLCAweDU3RjYsIDB4Mzg1RiwgMHg1N0Y3LCAweDA4RTUsIDB4NTdGOCwgMHg0NDIyLAotICAgIDB4NTdGOSwgMHgwRDEzLCAweDU3RkEsIDB4MDYyQywgMHg1N0ZCLCAweDQ0MjMsIDB4NTdGQywgMHgwODVCLAotICAgIDB4NTdGRCwgMHg0NDI0LCAweDU3RkYsIDB4Mzg2MCwgMHg1ODAwLCAweDBFODcsIDB4NTgwMiwgMHgwQzhBLAotICAgIDB4NTgwNCwgMHg0NDI1LCAweDU4MDUsIDB4MDc0RSwgMHg1ODA2LCAweDBCMkYsIDB4NTgwOSwgMHgzODYxLAotICAgIDB4NTgwQSwgMHgxMTkyLCAweDU4MEIsIDB4MTE5NSwgMHg1ODBELCAweDRCNUQsIDB4NTgxNSwgMHgwQjI0LAotICAgIDB4NTgxOSwgMHgxMTk2LCAweDU4MUQsIDB4MTE5NywgMHg1ODFFLCAweDQ0MjYsIDB4NTgyMCwgMHgzODYyLAotICAgIDB4NTgyMSwgMHgxMTk5LCAweDU4MjQsIDB4MEMwNSwgMHg1ODI2LCAweDRCNUUsIDB4NTgyNywgMHg0NDI3LAotICAgIDB4NTgyQSwgMHgwNUVBLCAweDU4MkYsIDB4MUQzMiwgMHg1ODMwLCAweDA1MDMsIDB4NTgzMSwgMHgwRTQzLAotICAgIDB4NTgzMiwgMHgzODYzLCAweDU4MzQsIDB4MDlENCwgMHg1ODM1LCAweDBDNDIsIDB4NTgzOSwgMHg0NDI4LAotICAgIDB4NTgzQSwgMHgwODU2LCAweDU4M0QsIDB4MTE5RiwgMHg1ODQwLCAweDBFMEQsIDB4NTg0MSwgMHgwRkE1LAotICAgIDB4NTg0OSwgMHg0NDJBLCAweDU4NEEsIDB4MDU3NCwgMHg1ODRCLCAweDExOUIsIDB4NTg0QywgMHg0NDJCLAotICAgIDB4NTg0RCwgMHg0QjVGLCAweDU4NEYsIDB4NEI2MCwgMHg1ODUxLCAweDBBQkMsIDB4NTg1MiwgMHgxMTlFLAotICAgIDB4NTg1NCwgMHgwQzVELCAweDU4NTcsIDB4MEM0MywgMHg1ODU4LCAweDBDNUUsIDB4NTg1OSwgMHgwRDRELAotICAgIDB4NTg1QSwgMHgwQkU5LCAweDU4NUUsIDB4MDgzOSwgMHg1ODVGLCAweDRCNjEsIDB4NTg2MSwgMHgxRTQ3LAotICAgIDB4NTg2MiwgMHgxMTlBLCAweDU4NjQsIDB4NDFCMywgMHg1ODY3LCAweDQ0MkMsIDB4NTg2OSwgMHgwNTE4LAotICAgIDB4NTg2QiwgMHgwQzMwLCAweDU4NkQsIDB4NEI2MiwgMHg1ODcwLCAweDExOUMsIDB4NTg3MiwgMHgxMTk4LAotICAgIDB4NTg3NSwgMHgwQTE2LCAweDU4NzksIDB4MTFBMCwgMHg1ODdDLCAweDM4NjQsIDB4NTg3RSwgMHgwOTU4LAotICAgIDB4NTg3RiwgMHg0QjYzLCAweDU4ODAsIDB4Mzg2NSwgMHg1ODgxLCAweDRCNjQsIDB4NTg4MywgMHgwNkE1LAotICAgIDB4NTg4NSwgMHgxMUExLCAweDU4ODksIDB4NDFCNCwgMHg1ODhBLCAweDQ0MkQsIDB4NTg4QiwgMHg0NDJFLAotICAgIDB4NTg4RCwgMHg0NDJGLCAweDU4OEYsIDB4NDQzMCwgMHg1ODkwLCAweDQ0MzEsIDB4NTg5MywgMHgwRTM4LAotICAgIDB4NTg5NCwgMHg0NDMyLCAweDU4OTcsIDB4MEFGRiwgMHg1ODk4LCAweDRCNjUsIDB4NTg5QywgMHgwQkUyLAotICAgIDB4NTg5RCwgMHg0NDMzLCAweDU4OUUsIDB4MjBFNywgMHg1ODlGLCAweDExQTMsIDB4NThBOCwgMHgwRTdELAotICAgIDB4NThBOSwgMHgzODY2LCAweDU4QUEsIDB4NDQzNCwgMHg1OEFCLCAweDExQTQsIDB4NThBRSwgMHgxMUE5LAotICAgIDB4NThCMSwgMHg0NDM1LCAweDU4QjIsIDB4MjBFOCwgMHg1OEIzLCAweDBERkYsIDB4NThCOCwgMHgxMUE4LAotICAgIDB4NThCOSwgMHgxMUEyLCAweDU4QkEsIDB4MTFBNSwgMHg1OEJCLCAweDExQTcsIDB4NThCQywgMHg0QjY2LAotICAgIDB4NThCRSwgMHgwODE2LCAweDU4QzEsIDB4MEUxOSwgMHg1OEMzLCAweDQ0MzcsIDB4NThDNSwgMHgxMUFBLAotICAgIDB4NThDNywgMHgwQjgzLCAweDU4Q0EsIDB4MDU3NSwgMHg1OENDLCAweDA5RDUsIDB4NThDRCwgMHg0NDM4LAotICAgIDB4NThDRSwgMHgzODY3LCAweDU4RDAsIDB4Mzg2OCwgMHg1OEQxLCAweDExQUMsIDB4NThEMiwgMHg0MUI2LAotICAgIDB4NThEMywgMHgxMUFCLCAweDU4RDQsIDB4Mzg2OSwgMHg1OEQ1LCAweDA3RkEsIDB4NThENywgMHgxMUFELAotICAgIDB4NThEOCwgMHgxMUFGLCAweDU4RDksIDB4MTFBRSwgMHg1OERBLCAweDM4NkEsIDB4NThEQywgMHgxMUIxLAotICAgIDB4NThERSwgMHgxMUE2LCAweDU4REYsIDB4MTFCMywgMHg1OEUwLCAweDQxQjcsIDB4NThFMiwgMHg0NDM5LAotICAgIDB4NThFNCwgMHgxMUIyLCAweDU4RTUsIDB4MTFCMCwgMHg1OEU5LCAweDM4NkIsIDB4NThFQiwgMHgwODlDLAotICAgIDB4NThFQywgMHgwQTE3LCAweDU4RUUsIDB4MEFENiwgMHg1OEVGLCAweDExQjQsIDB4NThGMCwgMHgwQTYwLAotICAgIDB4NThGMSwgMHgwNEIxLCAweDU4RjIsIDB4MEQxQSwgMHg1OEYzLCAweDQ0M0EsIDB4NThGNCwgMHg0NDNCLAotICAgIDB4NThGNywgMHgwQkY3LCAweDU4RjksIDB4MTFCNiwgMHg1OEZBLCAweDExQjUsIDB4NThGQiwgMHgxMUI3LAotICAgIDB4NThGQywgMHgxMUI4LCAweDU4RkQsIDB4MTFCOSwgMHg1OTAyLCAweDExQkEsIDB4NTkwNSwgMHg0NDNDLAotICAgIDB4NTkwNiwgMHg0NDNELCAweDU5MDksIDB4MEUyMSwgMHg1OTBBLCAweDExQkIsIDB4NTkwQiwgMHgyMEU5LAotICAgIDB4NTkwQywgMHgzODZDLCAweDU5MEQsIDB4NDQzRSwgMHg1OTBGLCAweDA1NDYsIDB4NTkxMCwgMHgxMUJDLAotICAgIDB4NTkxNCwgMHg0NDNGLCAweDU5MTUsIDB4MEYyNiwgMHg1OTE2LCAweDA1OEUsIDB4NTkxOCwgMHgxMERFLAotICAgIDB4NTkxOSwgMHgwOTUyLCAweDU5MUEsIDB4MEIxRiwgMHg1OTFCLCAweDExQkQsIDB4NTkxQywgMHgwRUY3LAotICAgIDB4NTkxRiwgMHg0QjY3LCAweDU5MjIsIDB4MEVDMCwgMHg1OTIzLCAweDRCNjgsIDB4NTkyNCwgMHgzODZELAotICAgIDB4NTkyNSwgMHgxMUJGLCAweDU5MjcsIDB4MEI0NywgMHg1OTI5LCAweDBDMzEsIDB4NTkyQSwgMHgwQjIwLAotICAgIDB4NTkyQiwgMHgwREM5LCAweDU5MkMsIDB4MTFDMCwgMHg1OTJELCAweDExQzEsIDB4NTkyRSwgMHgwNTFELAotICAgIDB4NTkyRiwgMHgzODZFLCAweDU5MzEsIDB4MDhFNiwgMHg1OTMyLCAweDExQzIsIDB4NTkzNywgMHgwNDk0LAotICAgIDB4NTkzOCwgMHgxMUMzLCAweDU5MzksIDB4MzcyNSwgMHg1OTNELCAweDQ0NDIsIDB4NTkzRSwgMHgxMUM0LAotICAgIDB4NTk0NCwgMHgwNTA0LCAweDU5NDYsIDB4NDQ0NCwgMHg1OTQ3LCAweDA2MkQsIDB4NTk0OCwgMHgwQ0I4LAotICAgIDB4NTk0OSwgMHgwRTQ0LCAweDU5NEUsIDB4MTFDOCwgMHg1OTRGLCAweDBBRDcsIDB4NTk1MCwgMHgxMUM3LAotICAgIDB4NTk1MSwgMHgwNzE2LCAweDU5NTMsIDB4MjBFQSwgMHg1OTU0LCAweDBFODksIDB4NTk1NSwgMHgxMUM2LAotICAgIDB4NTk1NywgMHgwQzVGLCAweDU5NTgsIDB4MTFDQSwgMHg1OTU5LCAweDRCNjksIDB4NTk1QSwgMHgxMUM5LAotICAgIDB4NTk1QiwgMHgyMEVCLCAweDU5NUQsIDB4MjBFQywgMHg1OTVGLCAweDQ0NDcsIDB4NTk2MCwgMHgxMUNDLAotICAgIDB4NTk2MSwgMHgzODZGLCAweDU5NjIsIDB4MTFDQiwgMHg1OTYzLCAweDIwRUQsIDB4NTk2NSwgMHgwNTFFLAotICAgIDB4NTk2NywgMHgxMUNELCAweDU5NjgsIDB4MDk5MSwgMHg1OTY5LCAweDExQ0YsIDB4NTk2QSwgMHgwQjYzLAotICAgIDB4NTk2QywgMHgxMUNFLCAweDU5NkQsIDB4Mzg3MCwgMHg1OTZFLCAweDBFMDMsIDB4NTk3MywgMHgwOTgxLAotICAgIDB4NTk3NCwgMHgwQzU1LCAweDU5NzUsIDB4NDQ0OSwgMHg1OTc2LCAweDQ0NEEsIDB4NTk3OCwgMHgxMUQwLAotICAgIDB4NTk3OSwgMHg0QjZBLCAweDU5N0MsIDB4NDQ0QiwgMHg1OTdELCAweDA3QjcsIDB4NTk4MSwgMHgxMUQxLAotICAgIDB4NTk4MiwgMHgwQ0Q3LCAweDU5ODMsIDB4MEQ3MiwgMHg1OTg0LCAweDBFREQsIDB4NTk4QSwgMHgwQ0RCLAotICAgIDB4NTk4QiwgMHg0MUI5LCAweDU5OEQsIDB4MTFEQSwgMHg1OTkyLCAweDQxQkEsIDB4NTk5MywgMHgwNjUyLAotICAgIDB4NTk5NiwgMHgwRjJGLCAweDU5OTcsIDB4NEI2QiwgMHg1OTk5LCAweDBFQkIsIDB4NTk5QiwgMHgxMjM5LAotICAgIDB4NTk5RCwgMHgxMUQyLCAweDU5OUYsIDB4NDQ0QywgMHg1OUEzLCAweDExRDUsIDB4NTlBNCwgMHgyMEVFLAotICAgIDB4NTlBNSwgMHgwQjI1LCAweDU5QTgsIDB4MEU2NiwgMHg1OUFDLCAweDBDNDQsIDB4NTlBRSwgMHg0NDRELAotICAgIDB4NTlBRiwgMHg0QjZDLCAweDU5QjIsIDB4MTFENiwgMHg1OUIzLCAweDRCNkQsIDB4NTlCOSwgMHgwRTkzLAotICAgIDB4NTlCQSwgMHgyMEVGLCAweDU5QkIsIDB4MDgzQSwgMHg1OUJDLCAweDQ0NEUsIDB4NTlCRSwgMHgwOTkyLAotICAgIDB4NTlDMywgMHg0MUJCLCAweDU5QzYsIDB4MTFENywgMHg1OUM4LCAweDQ0NEYsIDB4NTlDOSwgMHgwODlFLAotICAgIDB4NTlDQSwgMHgzODcxLCAweDU5Q0IsIDB4MDg5RCwgMHg1OUNELCAweDQ0NTAsIDB4NTlEMCwgMHgwNDdELAotICAgIDB4NTlEMSwgMHgwNzdDLCAweDU5RDIsIDB4Mzg3MiwgMHg1OUQzLCAweDBBNEYsIDB4NTlENCwgMHgwNDk1LAotICAgIDB4NTlEOSwgMHgxMURCLCAweDU5REEsIDB4MTFEQywgMHg1OURDLCAweDExRDksIDB4NTlERCwgMHgzODczLAotICAgIDB4NTlERSwgMHg0NDUxLCAweDU5REYsIDB4NEI2RSwgMHg1OUUzLCAweDM4NzQsIDB4NTlFNCwgMHgzODc1LAotICAgIDB4NTlFNSwgMHgwNERBLCAweDU5RTYsIDB4MDVFQiwgMHg1OUU3LCAweDQ0NTIsIDB4NTlFOCwgMHgxMUQ4LAotICAgIDB4NTlFQSwgMHgwRUQxLCAweDU5RUIsIDB4MERBMywgMHg1OUVDLCAweDM2QUQsIDB4NTlFRSwgMHg0NDUzLAotICAgIDB4NTlGMSwgMHg0QjZGLCAweDU5RjYsIDB4MDQ2QywgMHg1OUY4LCAweDRCNzAsIDB4NTlGQiwgMHgwNEJELAotICAgIDB4NTlGRiwgMHgwODlGLCAweDVBMDEsIDB4MDQ5NiwgMHg1QTAzLCAweDA0NjcsIDB4NUEwNCwgMHgzODc2LAotICAgIDB4NUEwOSwgMHgxMUUxLCAweDVBMEMsIDB4Mzg3NywgMHg1QTBELCAweDQ0NTcsIDB4NUExMSwgMHgxMURGLAotICAgIDB4NUExMywgMHg0MUJDLCAweDVBMTcsIDB4NDQ1OCwgMHg1QTE4LCAweDBFQzgsIDB4NUExQSwgMHgxMUUyLAotICAgIDB4NUExQiwgMHgzNUMxLCAweDVBMUMsIDB4MTFFMCwgMHg1QTFGLCAweDExREUsIDB4NUEyMCwgMHgwOUY3LAotICAgIDB4NUEyMywgMHgzODc4LCAweDVBMjUsIDB4MTFERCwgMHg1QTI3LCAweDQ0NTksIDB4NUEyOSwgMHgwRTJBLAotICAgIDB4NUEyRCwgMHg0NDVBLCAweDVBMkYsIDB4MDc5OCwgMHg1QTM1LCAweDExRTYsIDB4NUEzNiwgMHgxMUU3LAotICAgIDB4NUEzQywgMHgwOTkzLCAweDVBNDAsIDB4MTFFMywgMHg1QTQxLCAweDBGRDIsIDB4NUE0NiwgMHgwRDAyLAotICAgIDB4NUE0NywgMHgzODc5LCAweDVBNDksIDB4MTFFNSwgMHg1QTU1LCAweDM4N0EsIDB4NUE1QSwgMHgwODE3LAotICAgIDB4NUE2MiwgMHgxMUU4LCAweDVBNjMsIDB4Mzg3QiwgMHg1QTY1LCAweDQ0NUIsIDB4NUE2NiwgMHgwRENBLAotICAgIDB4NUE2NywgMHg0MUJELCAweDVBNkEsIDB4MTFFOSwgMHg1QTZDLCAweDExRTQsIDB4NUE2RCwgMHgzODdDLAotICAgIDB4NUE3NywgMHg0MUJFLCAweDVBN0EsIDB4NDQ1QywgMHg1QTdFLCAweDM4N0QsIDB4NUE3RiwgMHgwRUM3LAotICAgIDB4NUE4NCwgMHg0MUJGLCAweDVBOEIsIDB4NDQ1RCwgMHg1QTkyLCAweDBEMTQsIDB4NUE5QSwgMHgxMUVBLAotICAgIDB4NUE5QiwgMHgwREE0LCAweDVBOUMsIDB4NDQ1RSwgMHg1QTlFLCAweDM4N0UsIDB4NUE5RiwgMHg0NDVGLAotICAgIDB4NUFBMCwgMHg0NDYwLCAweDVBQTIsIDB4NDQ2MSwgMHg1QUE3LCAweDM4N0YsIDB4NUFBQywgMHgzODgwLAotICAgIDB4NUFCMSwgMHg0NDYyLCAweDVBQjIsIDB4NEI3MSwgMHg1QUIzLCAweDM4ODEsIDB4NUFCNSwgMHg0NDYzLAotICAgIDB4NUFCOCwgMHg0QjcyLCAweDVBQkEsIDB4NDQ2NCwgMHg1QUJDLCAweDExRUIsIDB4NUFCRCwgMHgxMUVGLAotICAgIDB4NUFCRSwgMHgxMUVDLCAweDVBQkYsIDB4NDQ2NSwgMHg1QUMxLCAweDA1NDcsIDB4NUFDMiwgMHgxMUVFLAotICAgIDB4NUFDNCwgMHg0MUMwLCAweDVBQzksIDB4MDhFNywgMHg1QUNCLCAweDExRUQsIDB4NUFDQywgMHgwNzRGLAotICAgIDB4NUFEMCwgMHgxMUZCLCAweDVBRDYsIDB4MTFGNCwgMHg1QUQ3LCAweDExRjEsIDB4NUFEQSwgMHg0NDY2LAotICAgIDB4NUFEQywgMHg0NDY3LCAweDVBRTAsIDB4Mzg4MiwgMHg1QUUxLCAweDBCQTIsIDB4NUFFMywgMHgxMUYwLAotICAgIDB4NUFFNSwgMHg0NDY4LCAweDVBRTYsIDB4MTFGMiwgMHg1QUU5LCAweDExRjMsIDB4NUFFQSwgMHg0QjczLAotICAgIDB4NUFFRSwgMHg0NDZBLCAweDVBRjAsIDB4NDQ2OSwgMHg1QUY1LCAweDQ0NkIsIDB4NUFGNiwgMHg0Qjc0LAotICAgIDB4NUFGQSwgMHgxMUY1LCAweDVBRkIsIDB4MTFGNiwgMHg1QjAwLCAweDM4ODMsIDB4NUIwOCwgMHg0NDZDLAotICAgIDB4NUIwOSwgMHgwNjJFLCAweDVCMEIsIDB4MTFGOCwgMHg1QjBDLCAweDExRjcsIDB4NUIxNiwgMHgxMUY5LAotICAgIDB4NUIxNywgMHg0NDZELCAweDVCMTksIDB4Mzg4NCwgMHg1QjFCLCAweDRCNzUsIDB4NUIxRCwgMHg0Qjc2LAotICAgIDB4NUIyMSwgMHg0Qjc3LCAweDVCMjIsIDB4MDlENiwgMHg1QjI1LCAweDM4ODUsIDB4NUIyQSwgMHgxMUZDLAotICAgIDB4NUIyQywgMHgwQkY4LCAweDVCMkQsIDB4Mzg4NiwgMHg1QjMwLCAweDA0RTcsIDB4NUIzMiwgMHgxMUZBLAotICAgIDB4NUIzNCwgMHg0NDZFLCAweDVCMzYsIDB4MTFGRCwgMHg1QjM4LCAweDRCNzgsIDB4NUIzRSwgMHgxMUZFLAotICAgIDB4NUI0MCwgMHgxMjAxLCAweDVCNDEsIDB4Mzg4NywgMHg1QjQzLCAweDExRkYsIDB4NUI0NSwgMHgxMjAwLAotICAgIDB4NUI0QywgMHg0NDZGLCAweDVCNTAsIDB4MDhBMCwgMHg1QjUxLCAweDEyMDIsIDB4NUI1MiwgMHg0NDcwLAotICAgIDB4NUI1NCwgMHgwN0I4LCAweDVCNTUsIDB4MTIwMywgMHg1QjU2LCAweDIwRjAsIDB4NUI1NywgMHgwOEM4LAotICAgIDB4NUI1OCwgMHgwQjE4LCAweDVCNUEsIDB4MTIwNCwgMHg1QjVCLCAweDEyMDUsIDB4NUI1QywgMHgwOEE4LAotICAgIDB4NUI1RCwgMHgwN0I5LCAweDVCNUYsIDB4MEVERSwgMHg1QjYzLCAweDA2NDIsIDB4NUI2NCwgMHgwNzdELAotICAgIDB4NUI2NSwgMHgxMjA2LCAweDVCNjYsIDB4MDVCNiwgMHg1QjY4LCAweDQ0NzEsIDB4NUI2OSwgMHgxMjA3LAotICAgIDB4NUI2QiwgMHgwQjE5LCAweDVCNkYsIDB4NDQ3MiwgMHg1QjcwLCAweDEyMDgsIDB4NUI3MSwgMHgxMjMwLAotICAgIDB4NUI3MywgMHgxMjA5LCAweDVCNzUsIDB4MTIwQSwgMHg1Qjc2LCAweDM3MjgsIDB4NUI3OCwgMHgxMjBCLAotICAgIDB4NUI3QSwgMHgxMjBELCAweDVCN0MsIDB4Mzg4OCwgMHg1QjdELCAweDQxQzIsIDB4NUI3RSwgMHgzODg5LAotICAgIDB4NUI3RiwgMHgzODhBLCAweDVCODAsIDB4MTIwRSwgMHg1QjgxLCAweDQ0NzMsIDB4NUI4MiwgMHgzNjEwLAotICAgIDB4NUI4MywgMHgxMjBGLCAweDVCODQsIDB4NDQ3NCwgMHg1Qjg1LCAweDBCNTAsIDB4NUI4NywgMHgwNEM5LAotICAgIDB4NUI4OCwgMHgwOTE1LCAweDVCODksIDB4MDQ4NiwgMHg1QjhBLCAweDM4OEIsIDB4NUI4QiwgMHgwQUQ5LAotICAgIDB4NUI4QywgMHgwNUVDLCAweDVCOEQsIDB4MDhFMSwgMHg1QjhGLCAweDA3QkEsIDB4NUI5MywgMHg0MUMzLAotICAgIDB4NUI5NSwgMHgwQzYwLCAweDVCOTYsIDB4NDQ3NiwgMHg1Qjk3LCAweDA5MkIsIDB4NUI5OCwgMHgwNUVELAotICAgIDB4NUI5OSwgMHgwQkE2LCAweDVCOUEsIDB4MEMwNiwgMHg1QjlCLCAweDA0N0MsIDB4NUI5QywgMHgwNjUzLAotICAgIDB4NUI5RCwgMHgwRTQ1LCAweDVCOUYsIDB4MDhFRSwgMHg1QkEyLCAweDA2NkMsIDB4NUJBMywgMHgwQThGLAotICAgIDB4NUJBNCwgMHgwOEU4LCAweDVCQTUsIDB4MEYxMiwgMHg1QkE2LCAweDEyMTAsIDB4NUJBQywgMHg0NDc3LAotICAgIDB4NUJBRSwgMHgwNjc2LCAweDVCQjAsIDB4MDgzQiwgMHg1QkIzLCAweDA1OTAsIDB4NUJCNCwgMHgwNTA1LAotICAgIDB4NUJCNSwgMHgwOTk0LCAweDVCQjYsIDB4MDU0OCwgMHg1QkI3LCAweDRCNzksIDB4NUJCOCwgMHgxMjExLAotICAgIDB4NUJCOSwgMHgwRjMwLCAweDVCQkYsIDB4MDk1MywgMHg1QkMwLCAweDIwRjEsIDB4NUJDMiwgMHgwOTEwLAotICAgIDB4NUJDMywgMHgxMjEyLCAweDVCQzQsIDB4MDYyRiwgMHg1QkM1LCAweDBDQUEsIDB4NUJDNiwgMHgwRUI1LAotICAgIDB4NUJDNywgMHgxMjEzLCAweDVCQzksIDB4MTIxNCwgMHg1QkNDLCAweDBEQ0IsIDB4NUJDRSwgMHg0NDdBLAotICAgIDB4NUJEMCwgMHgxMjE2LCAweDVCRDIsIDB4MDVFNCwgMHg1QkQzLCAweDA2RUYsIDB4NUJENCwgMHgxMjE1LAotICAgIDB4NUJENiwgMHg0NDdCLCAweDVCRDcsIDB4NEI3QSwgMHg1QkQ4LCAweDIwRjMsIDB4NUJEQiwgMHgwNUVFLAotICAgIDB4NUJERCwgMHgwOUY4LCAweDVCREUsIDB4MTIxQSwgMHg1QkRGLCAweDA4NkYsIDB4NUJFMCwgMHg0QjdCLAotICAgIDB4NUJFMSwgMHgwNTQ5LCAweDVCRTIsIDB4MTIxOSwgMHg1QkU0LCAweDEyMTcsIDB4NUJFNSwgMHgxMjFCLAotICAgIDB4NUJFNiwgMHgxMjE4LCAweDVCRTcsIDB4MENFMSwgMHg1QkU4LCAweDE0OEUsIDB4NUJFOSwgMHgwOUY5LAotICAgIDB4NUJFQiwgMHgxMjFDLCAweDVCRUMsIDB4NEY0RSwgMHg1QkVFLCAweDBGODgsIDB4NUJGMCwgMHgxMjFELAotICAgIDB4NUJGMSwgMHg0NDdFLCAweDVCRjMsIDB4MTIxRiwgMHg1QkY1LCAweDBCQkMsIDB4NUJGNiwgMHgxMjFFLAotICAgIDB4NUJGOCwgMHgwQTQ3LCAweDVCRkEsIDB4MDhDOSwgMHg1QkZELCAweDQ0N0YsIDB4NUJGRSwgMHgwQjMwLAotICAgIDB4NUJGRiwgMHgwOTIzLCAweDVDMDEsIDB4MERFNywgMHg1QzAyLCAweDBBOTAsIDB4NUMwMywgMHg0NDgxLAotICAgIDB4NUMwNCwgMHgwOEY5LCAweDVDMDUsIDB4MTIyMCwgMHg1QzA2LCAweDA5OTUsIDB4NUMwNywgMHgxMjIxLAotICAgIDB4NUMwOCwgMHgxMjIyLCAweDVDMDksIDB4MDQ5NywgMHg1QzBBLCAweDBCMUEsIDB4NUMwQiwgMHgwQTE4LAotICAgIDB4NUMwRCwgMHgxMjIzLCAweDVDMEUsIDB4MEM4QiwgMHg1QzBGLCAweDA5OTYsIDB4NUMxMSwgMHgwOTk3LAotICAgIDB4NUMxMiwgMHg0MUM0LCAweDVDMTMsIDB4MTIyNCwgMHg1QzE0LCAweDM3MkEsIDB4NUMxNiwgMHgwQTkxLAotICAgIDB4NUMxOSwgMHgzNjBCLCAweDVDMUEsIDB4MDk5OCwgMHg1QzFFLCAweDIwRjUsIDB4NUMxRiwgMHg0QjdDLAotICAgIDB4NUMyMCwgMHgxMjI1LCAweDVDMjIsIDB4MTIyNiwgMHg1QzIzLCAweDM4OEMsIDB4NUMyNCwgMHgwRUVDLAotICAgIDB4NUMyOCwgMHgxMjI3LCAweDVDMjksIDB4NDQ4MiwgMHg1QzJBLCAweDRCN0QsIDB4NUMyQiwgMHgzODhELAotICAgIDB4NUMyQywgMHg0QjdFLCAweDVDMkQsIDB4MDZCRSwgMHg1QzMwLCAweDM4OEUsIDB4NUMzMSwgMHgwOTJDLAotICAgIDB4NUMzNiwgMHg0QjdGLCAweDVDMzgsIDB4MTIyOCwgMHg1QzM5LCAweDEyMjksIDB4NUMzQSwgMHgwOTA4LAotICAgIDB4NUMzQiwgMHgwOUYyLCAweDVDM0MsIDB4MENDQywgMHg1QzNELCAweDBBMUEsIDB4NUMzRSwgMHgwRDhDLAotICAgIDB4NUMzRiwgMHgwQ0Q4LCAweDVDNDAsIDB4MDZDMSwgMHg1QzQxLCAweDEyMkEsIDB4NUM0NSwgMHgwNjg5LAotICAgIDB4NUM0NiwgMHgxMjJCLCAweDVDNDgsIDB4MDZGNiwgMHg1QzRBLCAweDBDQTcsIDB4NUM0QiwgMHgwNTMwLAotICAgIDB4NUM0RCwgMHgwOEExLCAweDVDNEUsIDB4MTIyQywgMHg1QzRGLCAweDEyMkYsIDB4NUM1MCwgMHgxMjJFLAotICAgIDB4NUM1MSwgMHgwNkY1LCAweDVDNTMsIDB4MTIyRCwgMHg1QzU1LCAweDBDMzIsIDB4NUM1OSwgMHg0QjgwLAotICAgIDB4NUM1QiwgMHgxRTkyLCAweDVDNUMsIDB4NEI4MSwgMHg1QzVFLCAweDBCMTAsIDB4NUM1RiwgMHg0NDg0LAotICAgIDB4NUM2MCwgMHgwQzQ1LCAweDVDNjEsIDB4MDhGNCwgMHg1QzYyLCAweDFFMEQsIDB4NUM2MywgMHgzODhGLAotICAgIDB4NUM2NCwgMHgwQURBLCAweDVDNjUsIDB4MEY2NCwgMHg1QzY3LCAweDQ0ODUsIDB4NUM2OCwgMHg0NDg2LAotICAgIDB4NUM2OSwgMHgzODkwLCAweDVDNkMsIDB4MTIzMSwgMHg1QzZELCAweDRCODIsIDB4NUM2RSwgMHgxMjMyLAotICAgIDB4NUM2RiwgMHgwQ0FFLCAweDVDNzAsIDB4NDQ4NywgMHg1QzcxLCAweDA4ODEsIDB4NUM3NiwgMHgxMjM0LAotICAgIDB4NUM3OSwgMHgxMjM1LCAweDVDN0EsIDB4NDFDNywgMHg1QzdDLCAweDM4OTEsIDB4NUM4OCwgMHg0NDhDLAotICAgIDB4NUM4QSwgMHg0NDhELCAweDVDOEMsIDB4MTIzNiwgMHg1QzhGLCAweDQxQzgsIDB4NUM5MCwgMHgwNjMwLAotICAgIDB4NUM5MSwgMHgxMjM3LCAweDVDOTQsIDB4MTIzOCwgMHg1QzlGLCAweDQxQzksIDB4NUNBMCwgMHg0NDkxLAotICAgIDB4NUNBMSwgMHgwNTJDLCAweDVDQTIsIDB4NDQ5MiwgMHg1Q0EzLCAweDQxQ0EsIDB4NUNBNiwgMHgyMEY2LAotICAgIDB4NUNBNywgMHg0NDkzLCAweDVDQTgsIDB4MEFCRCwgMHg1Q0E5LCAweDA2MjAsIDB4NUNBQSwgMHg0MUNCLAotICAgIDB4NUNBQiwgMHgxMjNBLCAweDVDQUMsIDB4MEVCNCwgMHg1Q0FELCAweDQ0OTUsIDB4NUNCMSwgMHgwQjMyLAotICAgIDB4NUNCMywgMHgwNUI3LCAweDVDQjUsIDB4NDQ5NiwgMHg1Q0I2LCAweDEyM0MsIDB4NUNCNywgMHgxMjNFLAotICAgIDB4NUNCOCwgMHgwNjFCLCAweDVDQkEsIDB4MjBGNywgMHg1Q0JCLCAweDEyM0IsIDB4NUNCQywgMHgxMjNELAotICAgIDB4NUNCRSwgMHgxMjQwLCAweDVDQzUsIDB4MTIzRiwgMHg1Q0M3LCAweDEyNDEsIDB4NUNDOSwgMHg0NDk4LAotICAgIDB4NUNDQiwgMHgzODkyLCAweDVDRDAsIDB4NDFDQywgMHg1Q0QyLCAweDM4OTMsIDB4NUNEOSwgMHgxMjQyLAotICAgIDB4NUNERCwgMHg0QjgzLCAweDVDRTAsIDB4MEM5NSwgMHg1Q0UxLCAweDA2QTYsIDB4NUNFNiwgMHgzNzJDLAotICAgIDB4NUNFOCwgMHgwNTY1LCAweDVDRTksIDB4MTI0MywgMHg1Q0VBLCAweDEyNDgsIDB4NUNFRCwgMHgxMjQ2LAotICAgIDB4NUNFRiwgMHgwRTQ3LCAweDVDRjAsIDB4MEU0NiwgMHg1Q0Y0LCAweDM4OTQsIDB4NUNGNSwgMHgyMEY4LAotICAgIDB4NUNGNiwgMHgwQzYxLCAweDVDRkEsIDB4MTI0NSwgMHg1Q0ZCLCAweDA5NUUsIDB4NUNGRCwgMHgxMjQ0LAotICAgIDB4NUQwMSwgMHg0Qjg0LCAweDVEMDYsIDB4NDQ5QiwgMHg1RDA3LCAweDBBMzgsIDB4NUQwQiwgMHgxMjQ5LAotICAgIDB4NUQwRCwgMHg0MUNFLCAweDVEMEUsIDB4MDg1QSwgMHg1RDEwLCAweDQ0OUMsIDB4NUQxMSwgMHgxMjRGLAotICAgIDB4NUQxNCwgMHgxMjUwLCAweDVEMTUsIDB4MTI0QSwgMHg1RDE2LCAweDA1OTEsIDB4NUQxNywgMHgxMjRCLAotICAgIDB4NUQxOCwgMHgxMjU0LCAweDVEMTksIDB4MTI1MywgMHg1RDFBLCAweDEyNTIsIDB4NUQxQiwgMHgxMjRFLAotICAgIDB4NUQxRCwgMHg0NDlFLCAweDVEMUYsIDB4MTI0RCwgMHg1RDIwLCAweDQ0OUYsIDB4NUQyMiwgMHgxMjUxLAotICAgIDB4NUQyNCwgMHgzODk1LCAweDVEMjYsIDB4Mzg5NiwgMHg1RDI3LCAweDIwRjksIDB4NUQyOSwgMHgwRTQ4LAotICAgIDB4NUQyQiwgMHg0NDlELCAweDVEMzEsIDB4NDRBMCwgMHg1RDM0LCAweDRCODUsIDB4NUQzOSwgMHg0NEExLAotICAgIDB4NUQzRCwgMHg0Qjg2LCAweDVENDIsIDB4MjBGQywgMHg1RDQzLCAweDM4OTcsIDB4NUQ0NiwgMHgzODk4LAotICAgIDB4NUQ0NywgMHg0MUNGLCAweDVENEEsIDB4Mzg5OSwgMHg1RDRCLCAweDEyNTgsIDB4NUQ0QywgMHgxMjU1LAotICAgIDB4NUQ0RSwgMHgxMjU3LCAweDVENTAsIDB4MEY1QywgMHg1RDUyLCAweDEyNTYsIDB4NUQ1MywgMHgyMEZBLAotICAgIDB4NUQ1OSwgMHg0Qjg3LCAweDVENUMsIDB4MTI0QywgMHg1RDYxLCAweDQ0QTMsIDB4NUQ2OSwgMHgwQTM5LAotICAgIDB4NUQ2QSwgMHg0NEE0LCAweDVENkMsIDB4MTI1OSwgMHg1RDZELCAweDIwRkQsIDB4NUQ2RiwgMHgwODI3LAotICAgIDB4NUQ3MCwgMHg0NEE2LCAweDVENzMsIDB4MTI1QSwgMHg1RDc2LCAweDEyNUIsIDB4NUQ3RSwgMHg0Qjg4LAotICAgIDB4NUQ4MSwgMHg0MUQwLCAweDVEODIsIDB4MTI1RSwgMHg1RDgzLCAweDRCODksIDB4NUQ4NCwgMHgxMjVELAotICAgIDB4NUQ4NywgMHgxMjVDLCAweDVEODgsIDB4NDRBOSwgMHg1RDhCLCAweDBDNjIsIDB4NUQ4QywgMHgxMjQ3LAotICAgIDB4NUQ5MCwgMHgxMjY0LCAweDVEOTIsIDB4Mzg5QSwgMHg1RDk0LCAweDM4OUIsIDB4NUQ5NywgMHg0NEFCLAotICAgIDB4NUQ5OSwgMHgzODlDLCAweDVEOUQsIDB4MTI2MCwgMHg1REEwLCAweDM4OUQsIDB4NURBMiwgMHgxMjVGLAotICAgIDB4NURBNCwgMHg0MUQxLCAweDVEQTcsIDB4NDFEMiwgMHg1REFDLCAweDEyNjEsIDB4NURBRSwgMHgxMjYyLAotICAgIDB4NURCMCwgMHg0NEFDLCAweDVEQjIsIDB4M0MyRCwgMHg1REI0LCAweDQ0QUQsIDB4NURCNywgMHgxMjY1LAotICAgIDB4NURCOCwgMHgyMEZFLCAweDVEQjksIDB4MjBGRiwgMHg1REJBLCAweDBGQUUsIDB4NURCQywgMHgxMjY2LAotICAgIDB4NURCRCwgMHgxMjYzLCAweDVEQzcsIDB4NEI4QSwgMHg1REM5LCAweDEyNjcsIDB4NURDQiwgMHg0MUQzLAotICAgIDB4NURDQywgMHgwNjFDLCAweDVEQ0QsIDB4MTI2OCwgMHg1REQwLCAweDIxMDAsIDB4NUREMSwgMHg0NEFGLAotICAgIDB4NUREMiwgMHgxMjZBLCAweDVERDMsIDB4MTI2OSwgMHg1REQ2LCAweDEyNkIsIDB4NURENywgMHg0NEIwLAotICAgIDB4NUREOCwgMHgzODlFLCAweDVEREIsIDB4MTI2QywgMHg1RERELCAweDBBOTIsIDB4NURERSwgMHgwOTJELAotICAgIDB4NURFMCwgMHgzODlGLCAweDVERTEsIDB4MDk2RSwgMHg1REUyLCAweDM0MzIsIDB4NURFMywgMHgwQUU1LAotICAgIDB4NURFNCwgMHg0NEIyLCAweDVERTUsIDB4MDdCQiwgMHg1REU2LCAweDA4MjgsIDB4NURFNywgMHgwN0JDLAotICAgIDB4NURFOCwgMHgwNjhBLCAweDVERTksIDB4NDRCMywgMHg1REVCLCAweDEyNkQsIDB4NURFRSwgMHgwODI5LAotICAgIDB4NURGMSwgMHgwNzdFLCAweDVERjIsIDB4MTI2RSwgMHg1REYzLCAweDBFQjIsIDB4NURGNCwgMHgwQ0Y5LAotICAgIDB4NURGNSwgMHgxMjZGLCAweDVERjcsIDB4MDdCRCwgMHg1REY4LCAweDM4QTAsIDB4NURGOSwgMHg0QjhCLAotICAgIDB4NURGQiwgMHgwNUU4LCAweDVERkQsIDB4MEI2NSwgMHg1REZFLCAweDA2Q0EsIDB4NURGRiwgMHgzNUUyLAotICAgIDB4NUUwMCwgMHgzOEExLCAweDVFMDIsIDB4MDhBMiwgMHg1RTAzLCAweDBEQ0QsIDB4NUUwNiwgMHgwRDU1LAotICAgIDB4NUUwQiwgMHgxMjcwLCAweDVFMEMsIDB4MDYzMSwgMHg1RTExLCAweDEyNzMsIDB4NUUxMiwgMHgzOEEyLAotICAgIDB4NUUxNCwgMHgzOEEzLCAweDVFMTUsIDB4MzhBNCwgMHg1RTE2LCAweDBCQkQsIDB4NUUxOCwgMHgzOEE1LAotICAgIDB4NUUxOSwgMHgxMjcyLCAweDVFMUEsIDB4MTI3MSwgMHg1RTFCLCAweDEyNzQsIDB4NUUxRCwgMHgwQzA3LAotICAgIDB4NUUxRiwgMHg0NEI3LCAweDVFMjUsIDB4MEEyOSwgMHg1RTI4LCAweDRCOEMsIDB4NUUyQiwgMHgwOEEzLAotICAgIDB4NUUyRCwgMHgwQTZFLCAweDVFMkUsIDB4MzhBNiwgMHg1RTJGLCAweDBCMzMsIDB4NUUzMCwgMHgwNjNDLAotICAgIDB4NUUzMiwgMHg0QjhELCAweDVFMzMsIDB4MEJCRSwgMHg1RTM1LCAweDRCOEUsIDB4NUUzNiwgMHgxMjc1LAotICAgIDB4NUUzNywgMHgxMjc2LCAweDVFMzgsIDB4MDlENywgMHg1RTNELCAweDBFNjcsIDB4NUUzRSwgMHg0NEI4LAotICAgIDB4NUU0MCwgMHgxMjc5LCAweDVFNDMsIDB4MTI3OCwgMHg1RTQ0LCAweDEyNzcsIDB4NUU0NSwgMHgwREVGLAotICAgIDB4NUU0NywgMHgxMjgwLCAweDVFNDksIDB4NDRCOSwgMHg1RTRDLCAweDBFODgsIDB4NUU0RSwgMHgxMjdBLAotICAgIDB4NUU1NCwgMHgxMjdDLCAweDVFNTUsIDB4MEU5OSwgMHg1RTU2LCAweDQ0QkIsIDB4NUU1NywgMHgxMjdCLAotICAgIDB4NUU1OCwgMHgzOEE3LCAweDVFNUIsIDB4NEI4RiwgMHg1RTVFLCAweDQxRDQsIDB4NUU1RiwgMHgxMjdELAotICAgIDB4NUU2MSwgMHgwRDNDLCAweDVFNjIsIDB4MTI3RSwgMHg1RTYzLCAweDBFMEUsIDB4NUU2NCwgMHgxMjdGLAotICAgIDB4NUU2OCwgMHg0QjkwLCAweDVFNkEsIDB4NEI5MSwgMHg1RTZCLCAweDM4QTgsIDB4NUU2QywgMHgzOEE5LAotICAgIDB4NUU2RCwgMHg0NEJELCAweDVFNkUsIDB4NDRCRSwgMHg1RTcyLCAweDA1RUYsIDB4NUU3MywgMHgwRTBGLAotICAgIDB4NUU3NCwgMHgwQ0U1LCAweDVFNzUsIDB4MTI4MSwgMHg1RTc2LCAweDEyODIsIDB4NUU3NywgMHg0QjkyLAotICAgIDB4NUU3OCwgMHgwN0JFLCAweDVFNzksIDB4MDVGMCwgMHg1RTdBLCAweDEyODMsIDB4NUU3QiwgMHgwNzZDLAotICAgIDB4NUU3QywgMHgwRjJFLCAweDVFN0QsIDB4MEYxMywgMHg1RTdFLCAweDA2MzIsIDB4NUU3RiwgMHgxMjg1LAotICAgIDB4NUU4MCwgMHg0QjkzLCAweDVFODEsIDB4MEJCRiwgMHg1RTgzLCAweDA3QkYsIDB4NUU4NCwgMHgwOTk5LAotICAgIDB4NUU4NywgMHgwRDczLCAweDVFOEEsIDB4MDk5QSwgMHg1RThCLCAweDRCOTQsIDB4NUU4RiwgMHgwOTgyLAotICAgIDB4NUU5NSwgMHgwQzA4LCAweDVFOTYsIDB4MEU0OSwgMHg1RTk3LCAweDBDMzMsIDB4NUU5OSwgMHgzNkIwLAotICAgIDB4NUU5QSwgMHgwN0MwLCAweDVFOUMsIDB4MERDRSwgMHg1RUEwLCAweDEyODYsIDB4NUVBNSwgMHg0NEMwLAotICAgIDB4NUVBNiwgMHgwQzUzLCAweDVFQTcsIDB4MDgzMiwgMHg1RUE4LCAweDM4QUEsIDB4NUVBQSwgMHgzOEFCLAotICAgIDB4NUVBQiwgMHgwNzdGLCAweDVFQUMsIDB4NDRDMSwgMHg1RUFELCAweDBDMDksIDB4NUVCMywgMHg0Qjk1LAotICAgIDB4NUVCNSwgMHgwNDg3LCAweDVFQjYsIDB4MDk3OCwgMHg1RUI3LCAweDA3QzEsIDB4NUVCOCwgMHgwRjMxLAotICAgIDB4NUVCOSwgMHg0NEMyLCAweDVFQkQsIDB4NEI5NiwgMHg1RUJFLCAweDM4QUMsIDB4NUVCRiwgMHgzOEFELAotICAgIDB4NUVDMSwgMHgxMjg3LCAweDVFQzIsIDB4MTI4OCwgMHg1RUMzLCAweDBEMDcsIDB4NUVDNiwgMHg0NEMzLAotICAgIDB4NUVDOCwgMHgxMjg5LCAweDVFQzksIDB4MEZCRiwgMHg1RUNBLCAweDBGRDMsIDB4NUVDQiwgMHgzQzFFLAotICAgIDB4NUVDRiwgMHgxMjhCLCAweDVFRDAsIDB4MTI4QSwgMHg1RUQxLCAweDRCOTcsIDB4NUVEMiwgMHgzOEFGLAotICAgIDB4NUVEMywgMHgwNUE1LCAweDVFRDQsIDB4NEI5OCwgMHg1RUQ1LCAweDRCOTksIDB4NUVENiwgMHgxMjhDLAotICAgIDB4NUVEOSwgMHg0NEM0LCAweDVFREEsIDB4MTI4RiwgMHg1RURCLCAweDEyOTAsIDB4NUVERCwgMHgxMjhFLAotICAgIDB4NUVERiwgMHgwREIyLCAweDVFRTAsIDB4MDk5QiwgMHg1RUUxLCAweDEyOTIsIDB4NUVFMiwgMHgxMjkxLAotICAgIDB4NUVFMywgMHgxMjhELCAweDVFRTgsIDB4MTI5MywgMHg1RUU5LCAweDEyOTQsIDB4NUVFQywgMHgxMjk1LAotICAgIDB4NUVGMCwgMHgxMjk4LCAweDVFRjEsIDB4MTI5NiwgMHg1RUYzLCAweDEyOTcsIDB4NUVGNCwgMHgxMjk5LAotICAgIDB4NUVGNiwgMHgwNTA2LCAweDVFRjcsIDB4MEMwQSwgMHg1RUY4LCAweDEyOUEsIDB4NUVGOSwgMHg0MUQ1LAotICAgIDB4NUVGQSwgMHgwNzUwLCAweDVFRkIsIDB4MDU3NiwgMHg1RUZDLCAweDBDRUMsIDB4NUVGRCwgMHg0NEM2LAotICAgIDB4NUVGRSwgMHgxMjlCLCAweDVFRkYsIDB4MENEMywgMHg1RjAwLCAweDQxRDYsIDB4NUYwMSwgMHgwRTJCLAotICAgIDB4NUYwMiwgMHg0MUQ3LCAweDVGMDMsIDB4MTI5QywgMHg1RjA0LCAweDBGRDQsIDB4NUYwNywgMHgzOEIwLAotICAgIDB4NUYwOCwgMHg0NEM3LCAweDVGMDksIDB4MTI5RCwgMHg1RjBBLCAweDBFMTAsIDB4NUYwQiwgMHgxMkEwLAotICAgIDB4NUYwQywgMHgwRkZBLCAweDVGMEQsIDB4MTAwQSwgMHg1RjBFLCAweDM4QjEsIDB4NUYwRiwgMHgwOERDLAotICAgIDB4NUYxMCwgMHgwQ0NELCAweDVGMTEsIDB4MTJBMSwgMHg1RjEzLCAweDA2NzcsIDB4NUYxNCwgMHgwQkMwLAotICAgIDB4NUYxNSwgMHgwNEJFLCAweDVGMTYsIDB4MTJBMiwgMHg1RjE3LCAweDBERjYsIDB4NUYxOCwgMHgwN0MyLAotICAgIDB4NUYxQiwgMHgwQjhFLCAweDVGMUMsIDB4MzhCMiwgMHg1RjFELCAweDM4QjMsIDB4NUYxRSwgMHg0NEM5LAotICAgIDB4NUYxRiwgMHgwQzBCLCAweDVGMjEsIDB4MjEwMSwgMHg1RjIyLCAweDM4QjQsIDB4NUYyMywgMHg0MUQ4LAotICAgIDB4NUYyNSwgMHgwRUZCLCAweDVGMjYsIDB4MDc2RCwgMHg1RjI3LCAweDA3ODAsIDB4NUYyOCwgMHgzOEI1LAotICAgIDB4NUYyOSwgMHgxMkEzLCAweDVGMkQsIDB4MTJBNCwgMHg1RjJGLCAweDEyQUEsIDB4NUYzMSwgMHgwOTExLAotICAgIDB4NUYzNCwgMHgyMTAyLCAweDVGMzUsIDB4MEJDMSwgMHg1RjM2LCAweDM4QjYsIDB4NUYzNywgMHgwNkE3LAotICAgIDB4NUYzOCwgMHgxMkE1LCAweDVGM0EsIDB4MzU5OCwgMHg1RjNCLCAweDM4QjcsIDB4NUYzQywgMHgwRDlELAotICAgIDB4NUYzRCwgMHg0MUQ5LCAweDVGM0UsIDB4MEI4NCwgMHg1RjQwLCAweDM4QjgsIDB4NUY0MSwgMHgxMkE2LAotICAgIDB4NUY0NSwgMHgyMEIyLCAweDVGNDcsIDB4NDRDQSwgMHg1RjQ4LCAweDEyQTcsIDB4NUY0QSwgMHgwNkE4LAotICAgIDB4NUY0QywgMHgxMkE4LCAweDVGNEQsIDB4NEI5QSwgMHg1RjRFLCAweDEyQTksIDB4NUY1MCwgMHgzOEI5LAotICAgIDB4NUY1MSwgMHgxMkFCLCAweDVGNTMsIDB4MEM3MCwgMHg1RjU0LCAweDQxREEsIDB4NUY1NiwgMHgxMkFDLAotICAgIDB4NUY1NywgMHgxMkFELCAweDVGNTgsIDB4MzhCQSwgMHg1RjU5LCAweDEyQUUsIDB4NUY1QywgMHgxMjlGLAotICAgIDB4NUY1RCwgMHgxMjlFLCAweDVGNjEsIDB4MTJBRiwgMHg1RjYyLCAweDA3MTcsIDB4NUY2MywgMHg0NENCLAotICAgIDB4NUY2NCwgMHgzOEJCLCAweDVGNjUsIDB4MzZBQywgMHg1RjY2LCAweDBEOTksIDB4NUY2NywgMHgyMTAzLAotICAgIDB4NUY2OSwgMHgwODNDLCAweDVGNkEsIDB4MERBOSwgMHg1RjZCLCAweDBCQzIsIDB4NUY2QywgMHgwREJELAotICAgIDB4NUY2RCwgMHgxMkIwLCAweDVGNzAsIDB4MDk5QywgMHg1RjcxLCAweDA0RTgsIDB4NUY3MiwgMHg0NENDLAotICAgIDB4NUY3MywgMHgxMkIxLCAweDVGNzcsIDB4MTJCMiwgMHg1Rjc5LCAweDBFRkUsIDB4NUY3QywgMHgwRDc0LAotICAgIDB4NUY3RCwgMHg0MURCLCAweDVGN0UsIDB4NDRDRCwgMHg1RjdGLCAweDEyQjUsIDB4NUY4MCwgMHgwNTFGLAotICAgIDB4NUY4MSwgMHgwQTUwLCAweDVGODIsIDB4MTJCNCwgMHg1RjgzLCAweDEyQjMsIDB4NUY4NCwgMHgwNzE4LAotICAgIDB4NUY4NSwgMHgwQjM0LCAweDVGODcsIDB4MTJCOSwgMHg1Rjg4LCAweDEyQjcsIDB4NUY4OSwgMHgzOEJDLAotICAgIDB4NUY4QSwgMHgxMkI2LCAweDVGOEIsIDB4MEY2RiwgMHg1RjhDLCAweDA3OTksIDB4NUY4RiwgMHg0NENFLAotICAgIDB4NUY5MCwgMHgwOTgzLCAweDVGOTEsIDB4MTJCOCwgMHg1RjkyLCAweDBDNDYsIDB4NUY5MywgMHgwOTQ4LAotICAgIDB4NUY5NywgMHgwQzk4LCAweDVGOTgsIDB4MTJCQywgMHg1Rjk5LCAweDEyQkIsIDB4NUY5QywgMHgzOEJELAotICAgIDB4NUY5RSwgMHgxMkJBLCAweDVGQTAsIDB4MTJCRCwgMHg1RkExLCAweDA3OUEsIDB4NUZBMiwgMHg0NENGLAotICAgIDB4NUZBNCwgMHgzOEJGLCAweDVGQTcsIDB4MzhCRSwgMHg1RkE4LCAweDEyQkUsIDB4NUZBOSwgMHgwREVFLAotICAgIDB4NUZBQSwgMHgwOTY1LCAweDVGQUMsIDB4NEI5QiwgMHg1RkFELCAweDEyQkYsIDB4NUZBRSwgMHgwRDhELAotICAgIDB4NUZBRiwgMHgzOEMwLCAweDVGQjMsIDB4MEM5OSwgMHg1RkI0LCAweDBCQzMsIDB4NUZCNSwgMHgzNDM4LAotICAgIDB4NUZCNywgMHgyMTA0LCAweDVGQjgsIDB4MzhDMSwgMHg1RkI5LCAweDBDMkEsIDB4NUZCQywgMHgxMkMwLAotICAgIDB4NUZCRCwgMHgwNjQ1LCAweDVGQzMsIDB4MDlGQSwgMHg1RkM0LCAweDM4QzIsIDB4NUZDNSwgMHgwRDlFLAotICAgIDB4NUZDNywgMHg0NEQwLCAweDVGQzksIDB4MzhDMywgMHg1RkNCLCAweDQ0RDEsIDB4NUZDQywgMHgwNjMzLAotICAgIDB4NUZDRCwgMHgwQ0RDLCAweDVGRDIsIDB4NDREMiwgMHg1RkQzLCAweDQ0RDMsIDB4NUZENCwgMHg0NEQ0LAotICAgIDB4NUZENiwgMHgxMkMxLCAweDVGRDcsIDB4MDhBNCwgMHg1RkQ4LCAweDBFNjgsIDB4NUZEOSwgMHgwRTY5LAotICAgIDB4NUZEQywgMHgwNTIwLCAweDVGREQsIDB4MTJDNiwgMHg1RkRFLCAweDIxMDUsIDB4NUZFMCwgMHgwQkE3LAotICAgIDB4NUZFMSwgMHgzOEM0LCAweDVGRTIsIDB4NDRENSwgMHg1RkU0LCAweDEyQzMsIDB4NUZFOSwgMHgzOEM1LAotICAgIDB4NUZFQSwgMHg0QjlDLCAweDVGRUIsIDB4MDU3NywgMHg1RkVELCAweDM4QzYsIDB4NUZFRSwgMHg0NEQ2LAotICAgIDB4NUZFRiwgMHg0NEQ3LCAweDVGRjAsIDB4MTJGNiwgMHg1RkYxLCAweDEyQzUsIDB4NUZGMywgMHg0NEQ4LAotICAgIDB4NUZGNSwgMHgwQ0U2LCAweDVGRjgsIDB4MTJDNCwgMHg1RkZCLCAweDEyQzIsIDB4NUZGQywgMHgzOEM3LAotICAgIDB4NUZGRCwgMHgwODBDLCAweDVGRkYsIDB4MTJDOCwgMHg2MDA3LCAweDRCOUQsIDB4NjAwRCwgMHg0MURDLAotICAgIDB4NjAwRSwgMHgxMkNFLCAweDYwMEYsIDB4MTJENCwgMHg2MDEwLCAweDEyQ0MsIDB4NjAxMiwgMHgwQzU2LAotICAgIDB4NjAxNCwgMHg0MURELCAweDYwMTUsIDB4MTJEMSwgMHg2MDE2LCAweDBEQ0YsIDB4NjAxNywgMHgzOEM4LAotICAgIDB4NjAxOCwgMHg0MURFLCAweDYwMTksIDB4MTJDQiwgMHg2MDFBLCAweDM4QzksIDB4NjAxQiwgMHgxMkQwLAotICAgIDB4NjAxQywgMHgwRkFGLCAweDYwMUQsIDB4MDhBNSwgMHg2MDIwLCAweDBCMzUsIDB4NjAyMSwgMHgxMkM5LAotICAgIDB4NjAyMiwgMHg0NERBLCAweDYwMjQsIDB4NDREQiwgMHg2MDI1LCAweDA2NzgsIDB4NjAyNiwgMHgxMkQzLAotICAgIDB4NjAyNywgMHgwQTUxLCAweDYwMjgsIDB4MDUwNywgMHg2MDI5LCAweDEyQ0QsIDB4NjAyQSwgMHgwNTc4LAotICAgIDB4NjAyQiwgMHgxMkQyLCAweDYwMkYsIDB4MDZBOSwgMHg2MDMxLCAweDEyQ0YsIDB4NjAzMywgMHgzOENBLAotICAgIDB4NjAzNSwgMHg0MURGLCAweDYwM0EsIDB4MTJENSwgMHg2MDQxLCAweDEyRDcsIDB4NjA0MiwgMHgxMkUxLAotICAgIDB4NjA0MywgMHgxMkRGLCAweDYwNDYsIDB4MTJEQywgMHg2MDQ3LCAweDQxRTAsIDB4NjA0OSwgMHg0QjlFLAotICAgIDB4NjA0QSwgMHgxMkRCLCAweDYwNEIsIDB4MEZDMCwgMHg2MDRDLCAweDQ0REQsIDB4NjA0RCwgMHgxMkRELAotICAgIDB4NjA1MCwgMHgwNkFBLCAweDYwNTIsIDB4MDdDMywgMHg2MDU0LCAweDRCOUYsIDB4NjA1NSwgMHgwOTg0LAotICAgIDB4NjA1OSwgMHgxMkU0LCAweDYwNUEsIDB4MTJENiwgMHg2MDVELCAweDIxMDYsIDB4NjA1RiwgMHgxMkRBLAotICAgIDB4NjA2MCwgMHgxMkNBLCAweDYwNjEsIDB4MzhDQiwgMHg2MDYyLCAweDA1N0EsIDB4NjA2MywgMHgxMkRFLAotICAgIDB4NjA2NCwgMHgxMkUwLCAweDYwNjUsIDB4MEI4RiwgMHg2MDY3LCAweDRCQTAsIDB4NjA2OCwgMHgwODE4LAotICAgIDB4NjA2OSwgMHgwNTM4LCAweDYwNkEsIDB4MTJEOCwgMHg2MDZCLCAweDEyRTMsIDB4NjA2QywgMHgxMkUyLAotICAgIDB4NjA2RCwgMHgwNkFCLCAweDYwNkYsIDB4MEIwOSwgMHg2MDcwLCAweDA1QzQsIDB4NjA3NSwgMHgwNzE5LAotICAgIDB4NjA3NywgMHgxMkQ5LCAweDYwN0YsIDB4MzhDQywgMHg2MDgxLCAweDEyRTUsIDB4NjA4MywgMHgxMkU4LAotICAgIDB4NjA4NCwgMHgxMkVBLCAweDYwODUsIDB4MjEwNywgMHg2MDg5LCAweDA4RTksIDB4NjA4QSwgMHgyMTA4LAotICAgIDB4NjA4QiwgMHgxMkYwLCAweDYwOEMsIDB4MEMwQywgMHg2MDhELCAweDEyRTYsIDB4NjA5MiwgMHgxMkVFLAotICAgIDB4NjA5NCwgMHgwNTc5LCAweDYwOTUsIDB4NDRERSwgMHg2MDk2LCAweDEyRUMsIDB4NjA5NywgMHgxMkVELAotICAgIDB4NjA5QSwgMHgxMkU5LCAweDYwOUIsIDB4MTJFQiwgMHg2MDlELCAweDQxRTEsIDB4NjA5RSwgMHgzOENELAotICAgIDB4NjA5RiwgMHgwNzlCLCAweDYwQTAsIDB4MEYxNCwgMHg2MEEzLCAweDA1RjEsIDB4NjBBNCwgMHgzOENFLAotICAgIDB4NjBBNiwgMHgwNEZCLCAweDYwQTcsIDB4MTJFRiwgMHg2MEE4LCAweDQ0REYsIDB4NjBBOSwgMHgwQ0YwLAotICAgIDB4NjBBQSwgMHgwNDcxLCAweDYwQjAsIDB4MzhDRiwgMHg2MEIxLCAweDQ0RTEsIDB4NjBCMiwgMHgwRDc1LAotICAgIDB4NjBCMywgMHgxMkM3LCAweDYwQjQsIDB4MTJGNSwgMHg2MEI1LCAweDEyRjksIDB4NjBCNiwgMHgwRUYxLAotICAgIDB4NjBCOCwgMHgxMkYyLCAweDYwQkIsIDB4NEJBMSwgMHg2MEJDLCAweDBDNjMsIDB4NjBCRCwgMHgxMkY3LAotICAgIDB4NjBCRSwgMHg0NEUyLCAweDYwQzQsIDB4NEJBMiwgMHg2MEM1LCAweDA5RDgsIDB4NjBDNiwgMHgxMkY4LAotICAgIDB4NjBDNywgMHgwQ0FGLCAweDYwQzgsIDB4NDRFMywgMHg2MENCLCAweDM4RDAsIDB4NjBEMSwgMHgwRkVELAotICAgIDB4NjBEMywgMHgxMkY0LCAweDYwRDQsIDB4NDFFMiwgMHg2MEQ1LCAweDIxMEEsIDB4NjBEOCwgMHgxMkZBLAotICAgIDB4NjBEOSwgMHg0NEU0LCAweDYwREEsIDB4MDgwRCwgMHg2MERCLCAweDM4RDEsIDB4NjBEQywgMHgwQTZGLAotICAgIDB4NjBERCwgMHg0MUUzLCAweDYwREUsIDB4MjEwOSwgMHg2MERGLCAweDA0OTgsIDB4NjBFMCwgMHgxMkYzLAotICAgIDB4NjBFMSwgMHgxMkYxLCAweDYwRTMsIDB4MEFEQywgMHg2MEU3LCAweDEyRTcsIDB4NjBFOCwgMHgwODgyLAotICAgIDB4NjBFRSwgMHg0NEU1LCAweDYwRjAsIDB4MEIyNiwgMHg2MEYxLCAweDEzMDYsIDB4NjBGMiwgMHgyMTBDLAotICAgIDB4NjBGMywgMHgwQURELCAweDYwRjQsIDB4MTMwMSwgMHg2MEY1LCAweDQ0RTYsIDB4NjBGNiwgMHgxMkZFLAotICAgIDB4NjBGNywgMHgxMkZGLCAweDYwRjgsIDB4MzhEMiwgMHg2MEY5LCAweDA5MTIsIDB4NjBGQSwgMHgxMzAyLAotICAgIDB4NjBGQiwgMHgxMzA1LCAweDYwRkQsIDB4NEJBMywgMHg2MTAwLCAweDEzMDAsIDB4NjEwMSwgMHgwOTJGLAotICAgIDB4NjEwMywgMHgxMzAzLCAweDYxMDYsIDB4MTJGRCwgMHg2MTA4LCAweDBGMDgsIDB4NjEwOSwgMHgwRjA3LAotICAgIDB4NjEwQSwgMHg0QkE0LCAweDYxMEQsIDB4MTMwNywgMHg2MTBFLCAweDEzMDgsIDB4NjEwRiwgMHgwNDk5LAotICAgIDB4NjExMCwgMHg0NEU3LCAweDYxMTEsIDB4MjEwRCwgMHg2MTEyLCAweDM4RDMsIDB4NjExMywgMHgzOEQ0LAotICAgIDB4NjExNCwgMHgzOEQ1LCAweDYxMTUsIDB4MTJGQywgMHg2MTE2LCAweDRCQTUsIDB4NjExOSwgMHg0NEU4LAotICAgIDB4NjExQSwgMHgwNkVBLCAweDYxMUIsIDB4MDQ2QSwgMHg2MTFDLCAweDM4RDYsIDB4NjExRSwgMHg0NEU5LAotICAgIDB4NjExRiwgMHgwNUYyLCAweDYxMjAsIDB4MjEwQiwgMHg2MTIxLCAweDEzMDQsIDB4NjEyNywgMHgxMzBDLAotICAgIDB4NjEyOCwgMHgxMzBCLCAweDYxMkEsIDB4NEJBNiwgMHg2MTJCLCAweDQxRTQsIDB4NjEyQywgMHgxMzEwLAotICAgIDB4NjEzMCwgMHgyMTBGLCAweDYxMzQsIDB4MTMxMSwgMHg2MTM2LCAweDRCQTcsIDB4NjEzNywgMHgyMTBFLAotICAgIDB4NjEzQSwgMHg0NEVBLCAweDYxM0MsIDB4MTMwRiwgMHg2MTNELCAweDEzMTIsIDB4NjEzRSwgMHgxMzBBLAotICAgIDB4NjEzRiwgMHgxMzBFLCAweDYxNDEsIDB4NDRFQywgMHg2MTQyLCAweDEzMTMsIDB4NjE0NCwgMHgxMzE0LAotICAgIDB4NjE0NiwgMHg0NEVELCAweDYxNDcsIDB4MTMwOSwgMHg2MTQ4LCAweDA4Q0EsIDB4NjE0QSwgMHgxMzBELAotICAgIDB4NjE0QiwgMHgwQjM2LCAweDYxNEMsIDB4MDdDNCwgMHg2MTRELCAweDEyRkIsIDB4NjE0RSwgMHgwOUZCLAotICAgIDB4NjE1MywgMHgxMzIxLCAweDYxNTUsIDB4MEUzOSwgMHg2MTU4LCAweDEzMTcsIDB4NjE1OSwgMHgxMzE4LAotICAgIDB4NjE1QSwgMHgxMzE5LCAweDYxNUQsIDB4MTMyMCwgMHg2MTVFLCAweDRCQTgsIDB4NjE1RiwgMHgxMzFGLAotICAgIDB4NjE2MCwgMHg0NEVFLCAweDYxNjIsIDB4MEVBQiwgMHg2MTYzLCAweDA1RjMsIDB4NjE2NCwgMHg0QkE5LAotICAgIDB4NjE2NSwgMHgxMzFELCAweDYxNjcsIDB4MDcxQiwgMHg2MTY4LCAweDA1OTIsIDB4NjE2QiwgMHgxMzFBLAotICAgIDB4NjE2RSwgMHgwRjgwLCAweDYxNkYsIDB4MTMxQywgMHg2MTcwLCAweDA0OUEsIDB4NjE3MSwgMHgxMzFFLAotICAgIDB4NjE3MywgMHgxMzE1LCAweDYxNzQsIDB4MTMxQiwgMHg2MTc1LCAweDEzMjIsIDB4NjE3NiwgMHgwNzFBLAotICAgIDB4NjE3NywgMHgxMzE2LCAweDYxN0IsIDB4NEJBQSwgMHg2MTdDLCAweDM4RDcsIDB4NjE3RCwgMHg0QkFCLAotICAgIDB4NjE3RSwgMHgwRjQ3LCAweDYxN0YsIDB4NEJBQywgMHg2MTgyLCAweDBGMTUsIDB4NjE4NywgMHgxMzI1LAotICAgIDB4NjE4QSwgMHgxMzI5LCAweDYxOEQsIDB4MzhEOCwgMHg2MThFLCAweDBCMDAsIDB4NjE5MCwgMHgwRkMxLAotICAgIDB4NjE5MSwgMHgxMzJBLCAweDYxOTIsIDB4NDRGMCwgMHg2MTkzLCAweDQ0RjEsIDB4NjE5NCwgMHgxMzI3LAotICAgIDB4NjE5NiwgMHgxMzI0LCAweDYxOTcsIDB4NDRGMiwgMHg2MTk4LCAweDIxMTAsIDB4NjE5OSwgMHgxMzIzLAotICAgIDB4NjE5QSwgMHgxMzI4LCAweDYxOUQsIDB4NEJBRCwgMHg2MTlGLCAweDM4RDksIDB4NjFBNCwgMHgwRTAwLAotICAgIDB4NjFBNSwgMHg0NEYzLCAweDYxQTcsIDB4MEM4QywgMHg2MUE4LCAweDM4REEsIDB4NjFBOSwgMHgwNzFDLAotICAgIDB4NjFBQiwgMHgxMzJCLCAweDYxQUMsIDB4MTMyNiwgMHg2MUFELCAweDQ0RjQsIDB4NjFBRSwgMHgxMzJDLAotICAgIDB4NjFCMiwgMHgwNzUxLCAweDYxQjYsIDB4MDUzMSwgMHg2MUI4LCAweDRCQUUsIDB4NjFCOSwgMHg0MUU2LAotICAgIDB4NjFCQSwgMHgxMzM0LCAweDYxQkMsIDB4NDFFNSwgMHg2MUJFLCAweDA1RjQsIDB4NjFDMiwgMHgzOERCLAotICAgIDB4NjFDMywgMHgxMzMyLCAweDYxQzYsIDB4MTMzMywgMHg2MUM3LCAweDA4MTksIDB4NjFDOCwgMHgxMzMxLAotICAgIDB4NjFDOSwgMHgxMzJGLCAweDYxQ0EsIDB4MTMyRSwgMHg2MUNCLCAweDEzMzUsIDB4NjFDQywgMHgxMzJELAotICAgIDB4NjFDRCwgMHgxMzM3LCAweDYxRDAsIDB4MDU3QiwgMHg2MUQ1LCAweDQ0RjYsIDB4NjFEQywgMHg0QkFGLAotICAgIDB4NjFERCwgMHg0NEY3LCAweDYxREYsIDB4MzhEQywgMHg2MUUyLCAweDRCQjAsIDB4NjFFMywgMHgxMzM5LAotICAgIDB4NjFFNSwgMHg0QkIxLCAweDYxRTYsIDB4MTMzOCwgMHg2MUU4LCAweDRCQjIsIDB4NjFGMiwgMHgwQkM0LAotICAgIDB4NjFGNCwgMHgxMzNDLCAweDYxRjUsIDB4NDRGOCwgMHg2MUY2LCAweDEzM0EsIDB4NjFGNywgMHgxMzMwLAotICAgIDB4NjFGOCwgMHgwNzUyLCAweDYxRkEsIDB4MTMzQiwgMHg2MUZDLCAweDEzM0YsIDB4NjFGRCwgMHgxMzNFLAotICAgIDB4NjFGRSwgMHgxMzQwLCAweDYxRkYsIDB4MTMzRCwgMHg2MjAwLCAweDEzNDEsIDB4NjIwNCwgMHg0QkIzLAotICAgIDB4NjIwNywgMHg0QkI0LCAweDYyMDgsIDB4MTM0MiwgMHg2MjA5LCAweDEzNDMsIDB4NjIwQSwgMHgwRTNBLAotICAgIDB4NjIwQywgMHgxMzQ1LCAweDYyMEQsIDB4MTM0NCwgMHg2MjBFLCAweDA5NDksIDB4NjIxMCwgMHgwQTUyLAotICAgIDB4NjIxMSwgMHgwNTY2LCAweDYyMTIsIDB4MDU3QywgMHg2MjEzLCAweDIxMTEsIDB4NjIxNCwgMHgxMzQ2LAotICAgIDB4NjIxNSwgMHgzOERELCAweDYyMTYsIDB4MDQ4MywgMHg2MjFBLCAweDBBNzAsIDB4NjIxQiwgMHgxMzQ3LAotICAgIDB4NjIxRCwgMHgxQTY0LCAweDYyMUUsIDB4MTM0OCwgMHg2MjFGLCAweDA3MzcsIDB4NjIyMSwgMHgxMzQ5LAotICAgIDB4NjIyMiwgMHg0MUU3LCAweDYyMjMsIDB4NDRGQSwgMHg2MjI2LCAweDBBOTMsIDB4NjIyOSwgMHgzOERFLAotICAgIDB4NjIyQSwgMHgxMzRBLCAweDYyMkUsIDB4MTM0QiwgMHg2MjJGLCAweDA2NTQsIDB4NjIzMCwgMHgxMzRDLAotICAgIDB4NjIzMSwgMHg0QkI1LCAweDYyMzIsIDB4MTM0RCwgMHg2MjMzLCAweDEzNEUsIDB4NjIzNCwgMHgwQjM3LAotICAgIDB4NjIzNiwgMHgzNUJELCAweDYyMzgsIDB4MDc4MSwgMHg2MjM5LCAweDRCQjYsIDB4NjIzQiwgMHgwRUVELAotICAgIDB4NjIzRCwgMHg0QkI3LCAweDYyM0UsIDB4MzQ0RSwgMHg2MjNGLCAweDBFNkEsIDB4NjI0MCwgMHgwOTc0LAotICAgIDB4NjI0MSwgMHgxMzRGLCAweDYyNDMsIDB4MzhERiwgMHg2MjQ2LCAweDM4RTAsIDB4NjI0NywgMHgwQTk0LAotICAgIDB4NjI0OCwgMHgxQjFBLCAweDYyNDksIDB4MEQ3NiwgMHg2MjRCLCAweDA5MTYsIDB4NjI0QywgMHgzOEUxLAotICAgIDB4NjI0RCwgMHgwODNELCAweDYyNEUsIDB4MTM1MCwgMHg2MjUxLCAweDM4RTIsIDB4NjI1MiwgMHg0NEZCLAotICAgIDB4NjI1MywgMHgwQjI3LCAweDYyNTUsIDB4MERGNywgMHg2MjU2LCAweDM4RTMsIDB4NjI1OCwgMHgwQjUxLAotICAgIDB4NjI1QSwgMHg0MUU4LCAweDYyNUIsIDB4MTM1MywgMHg2MjVFLCAweDEzNTEsIDB4NjI2MCwgMHgxMzU0LAotICAgIDB4NjI2MSwgMHg0NEZDLCAweDYyNjMsIDB4MTM1MiwgMHg2MjY0LCAweDQ0RkQsIDB4NjI2OCwgMHgxMzU1LAotICAgIDB4NjI2RCwgMHg0NEZGLCAweDYyNkUsIDB4MEUwMSwgMHg2MjZGLCAweDQxRTksIDB4NjI3MSwgMHgwNDdCLAotICAgIDB4NjI3MywgMHg0NTAwLCAweDYyNzYsIDB4MEREMCwgMHg2Mjc5LCAweDBENzcsIDB4NjI3QSwgMHg0QkI4LAotICAgIDB4NjI3QiwgMHg0NEZFLCAweDYyN0MsIDB4MTM1NiwgMHg2MjdFLCAweDEzNTksIDB4NjI3RiwgMHgwOTlELAotICAgIDB4NjI4MCwgMHgwNjU1LCAweDYyODIsIDB4MTM1NywgMHg2MjgzLCAweDEzNUUsIDB4NjI4NCwgMHgwOTlFLAotICAgIDB4NjI4NSwgMHgzNUM1LCAweDYyODksIDB4MTM1OCwgMHg2MjhBLCAweDBDRkEsIDB4NjI5MCwgMHg0QkI5LAotICAgIDB4NjI5MSwgMHgwRjQ4LCAweDYyOTIsIDB4MTM1QSwgMHg2MjkzLCAweDEzNUIsIDB4NjI5NCwgMHgxMzVGLAotICAgIDB4NjI5NSwgMHgwQzY0LCAweDYyOTYsIDB4MTM1QywgMHg2Mjk3LCAweDA3QzUsIDB4NjI5OCwgMHgwQTgyLAotICAgIDB4NjI5OSwgMHg0NTAxLCAweDYyOUIsIDB4MTM2RCwgMHg2MjlDLCAweDBENDgsIDB4NjI5RSwgMHgwQjUyLAotICAgIDB4NjJBNiwgMHgyMTEyLCAweDYyQTgsIDB4NEJCQSwgMHg2MkFCLCAweDBENzgsIDB4NjJBQywgMHgxM0IyLAotICAgIDB4NjJCMSwgMHgwRTRBLCAweDYyQjUsIDB4MEMwRCwgMHg2MkI5LCAweDBFQTMsIDB4NjJCQiwgMHgxMzYyLAotICAgIDB4NjJCQywgMHgwNTIxLCAweDYyQkQsIDB4MEJBOCwgMHg2MkMyLCAweDEzNkIsIDB4NjJDNCwgMHgzOEU0LAotICAgIDB4NjJDNSwgMHgwQjcyLCAweDYyQzYsIDB4MTM2NSwgMHg2MkM3LCAweDEzNkMsIDB4NjJDOCwgMHgxMzY3LAotICAgIDB4NjJDOSwgMHgxMzZFLCAweDYyQ0EsIDB4MTM2QSwgMHg2MkNDLCAweDEzNjksIDB4NjJDRCwgMHgwRDI1LAotICAgIDB4NjJDRiwgMHgxMzYzLCAweDYyRDAsIDB4MDU3RCwgMHg2MkQxLCAweDEzNjEsIDB4NjJEMiwgMHgwNjhCLAotICAgIDB4NjJEMywgMHgwQjUzLCAweDYyRDQsIDB4MTM1RCwgMHg2MkQ1LCAweDQ1MDIsIDB4NjJENiwgMHg0MUVBLAotICAgIDB4NjJENywgMHgxMzYwLCAweDYyRDgsIDB4MDdDNiwgMHg2MkQ5LCAweDBBN0YsIDB4NjJEQSwgMHg0QkJCLAotICAgIDB4NjJEQiwgMHgwOTlGLCAweDYyREMsIDB4MTM2OCwgMHg2MkRELCAweDBEMDgsIDB4NjJFMCwgMHgwNjhDLAotICAgIDB4NjJFMSwgMHgwNUE2LCAweDYyRUMsIDB4MDVDNSwgMHg2MkVELCAweDA5RTcsIDB4NjJFRSwgMHgxMzcwLAotICAgIDB4NjJFRiwgMHgxMzc1LCAweDYyRjEsIDB4MTM3MSwgMHg2MkYzLCAweDA3NTMsIDB4NjJGNCwgMHg0QkJDLAotICAgIDB4NjJGNSwgMHgxMzc2LCAweDYyRjYsIDB4MDg3MCwgMHg2MkY3LCAweDA3RkIsIDB4NjJGQywgMHgzOEU1LAotICAgIDB4NjJGRCwgMHg0NTA0LCAweDYyRkUsIDB4MDkzMCwgMHg2MkZGLCAweDEzNjQsIDB4NjMwMSwgMHgwOENCLAotICAgIDB4NjMwMiwgMHgxMzczLCAweDYzMDMsIDB4NDUwNSwgMHg2MzA3LCAweDA4QTYsIDB4NjMwOCwgMHgxMzc0LAotICAgIDB4NjMwOSwgMHgwNDg4LCAweDYzMEEsIDB4MzhFNiwgMHg2MzBDLCAweDEzNkYsIDB4NjMwRCwgMHgzOEU3LAotICAgIDB4NjMxMCwgMHg0NTA2LCAweDYzMTEsIDB4MEJDNSwgMHg2MzE2LCAweDRCQkQsIDB4NjMxOCwgMHgzOEU4LAotICAgIDB4NjMxOSwgMHgwNjhELCAweDYzMUIsIDB4MzczNywgMHg2MzFGLCAweDA2QUMsIDB4NjMyNywgMHgxMzcyLAotICAgIDB4NjMyOCwgMHgwNDZCLCAweDYzMkEsIDB4NEJCRSwgMHg2MzJCLCAweDA4MzMsIDB4NjMyRiwgMHgwOUZDLAotICAgIDB4NjMzMiwgMHg0NTA5LCAweDYzMzUsIDB4NDUwQSwgMHg2MzM2LCAweDRCQkYsIDB4NjMzOSwgMHgzOEU5LAotICAgIDB4NjMzQSwgMHgwQzBFLCAweDYzM0IsIDB4NDUwQiwgMHg2MzNDLCAweDQ1MEMsIDB4NjMzRCwgMHgwRDY4LAotICAgIDB4NjMzRSwgMHgxMzc4LCAweDYzM0YsIDB4MEFFMCwgMHg2MzQxLCAweDQ1MEQsIDB4NjM0MiwgMHgzOEVBLAotICAgIDB4NjM0MywgMHgzOEVCLCAweDYzNDQsIDB4NDUwRSwgMHg2MzQ2LCAweDRCQzAsIDB4NjM0OSwgMHgwQjBBLAotICAgIDB4NjM0QiwgMHg0QkMxLCAweDYzNEMsIDB4MDg3OSwgMHg2MzRELCAweDEzNzksIDB4NjM0RSwgMHg0NTBGLAotICAgIDB4NjM0RiwgMHgxMzdCLCAweDYzNTAsIDB4MTM3NywgMHg2MzUzLCAweDRCQzIsIDB4NjM1NSwgMHgwRTMxLAotICAgIDB4NjM1NywgMHgwQkQ5LCAweDYzNTksIDB4NDUxMSwgMHg2MzVDLCAweDBBREUsIDB4NjM2NSwgMHgzOEVDLAotICAgIDB4NjM2NywgMHgwRTRCLCAweDYzNjgsIDB4MDhGQSwgMHg2MzY5LCAweDEzODcsIDB4NjM2QiwgMHgxMzg2LAotICAgIDB4NjM2QywgMHg0NTE0LCAweDYzNkUsIDB4MEEzRSwgMHg2MzcxLCAweDRCQzMsIDB4NjM3MiwgMHgwNzU0LAotICAgIDB4NjM3NCwgMHgzOEVELCAweDYzNzUsIDB4NEJDNCwgMHg2Mzc2LCAweDEzODAsIDB4NjM3NywgMHgwOUExLAotICAgIDB4NjM3QSwgMHgwQ0MwLCAweDYzN0IsIDB4MENFNywgMHg2MzdDLCAweDQxRUIsIDB4NjM3RCwgMHgzOEVFLAotICAgIDB4NjM3RiwgMHg0QkM1LCAweDYzODAsIDB4MTM3RSwgMHg2MzgyLCAweDRCQzYsIDB4NjM4MywgMHgwQURGLAotICAgIDB4NjM4NCwgMHgzOEVGLCAweDYzODcsIDB4MzhGMCwgMHg2Mzg4LCAweDA5MjQsIDB4NjM4OSwgMHgxMzgzLAotICAgIDB4NjM4QSwgMHg0QkM3LCAweDYzOEMsIDB4MDlBMCwgMHg2MzhFLCAweDEzN0QsIDB4NjM4RiwgMHgxMzgyLAotICAgIDB4NjM5MCwgMHgzOEYxLCAweDYzOTIsIDB4MEQwOSwgMHg2Mzk0LCAweDQ1MTcsIDB4NjM5NiwgMHgxMzdDLAotICAgIDB4NjM5OCwgMHgwNkY3LCAweDYzOTksIDB4NDUxNSwgMHg2MzlCLCAweDA1QkIsIDB4NjM5RSwgMHgzOEYyLAotICAgIDB4NjM5RiwgMHgxMzg0LCAweDYzQTAsIDB4MEY3MywgMHg2M0ExLCAweDA4M0UsIDB4NjNBMiwgMHgwQjczLAotICAgIDB4NjNBMywgMHgxMzgxLCAweDYzQTUsIDB4MEE4MCwgMHg2M0E3LCAweDA3QzcsIDB4NjNBOCwgMHgwQTJBLAotICAgIDB4NjNBOSwgMHgwNTA4LCAweDYzQUEsIDB4MEFCRSwgMHg2M0FCLCAweDEzN0YsIDB4NjNBQywgMHgwNjVGLAotICAgIDB4NjNBRSwgMHg0QkM4LCAweDYzQUYsIDB4NEJDOSwgMHg2M0IyLCAweDA3MUQsIDB4NjNCNCwgMHgwQkVCLAotICAgIDB4NjNCNSwgMHgxMzg1LCAweDYzQkIsIDB4MEFFMSwgMHg2M0JELCAweDQ1MTgsIDB4NjNCRSwgMHgxMzg4LAotICAgIDB4NjNDMCwgMHgxMzhBLCAweDYzQzMsIDB4MEIxNywgMHg2M0M0LCAweDEzOTAsIDB4NjNDNiwgMHgxMzhCLAotICAgIDB4NjNDOSwgMHgxMzhELCAweDYzQ0YsIDB4MERCMywgMHg2M0QwLCAweDBDMEYsIDB4NjNEMSwgMHgzOEYzLAotICAgIDB4NjNEMiwgMHgxMzhFLCAweDYzRDQsIDB4NDUxOSwgMHg2M0Q1LCAweDQ1MUEsIDB4NjNENiwgMHgwRjE2LAotICAgIDB4NjNEQSwgMHgwRjMyLCAweDYzREIsIDB4MDVGNSwgMHg2M0RDLCAweDM4RjQsIDB4NjNFMCwgMHg0NTFCLAotICAgIDB4NjNFMSwgMHgwNDcyLCAweDYzRTMsIDB4MTM4QywgMHg2M0U1LCAweDQxRUMsIDB4NjNFOSwgMHgxMzg5LAotICAgIDB4NjNFQSwgMHg0QkNBLCAweDYzRUIsIDB4NDUxQywgMHg2M0VDLCAweDQ1MUQsIDB4NjNFRCwgMHgzNDFDLAotICAgIDB4NjNFRSwgMHgwNjM0LCAweDYzRjIsIDB4NDUxRSwgMHg2M0Y0LCAweDA1MDksIDB4NjNGNSwgMHgyMTEzLAotICAgIDB4NjNGNiwgMHgxMzhGLCAweDYzRjcsIDB4MzY0NCwgMHg2M0Y4LCAweDRCQ0IsIDB4NjNGOSwgMHg0QkNDLAotICAgIDB4NjNGQSwgMHgwRjMzLCAweDY0MDYsIDB4MTM5MywgMHg2NDA5LCAweDM4RjUsIDB4NjQwRCwgMHgwQjFCLAotICAgIDB4NjQwRiwgMHgxMzlBLCAweDY0MTAsIDB4MzhGNiwgMHg2NDEyLCAweDRCQ0QsIDB4NjQxMywgMHgxMzk0LAotICAgIDB4NjQxNCwgMHgxRTJDLCAweDY0MTYsIDB4MTM5MSwgMHg2NDE3LCAweDEzOTgsIDB4NjQxOCwgMHg0QkNFLAotICAgIDB4NjQxQywgMHgxMzdBLCAweDY0MUUsIDB4NDUxRiwgMHg2NDIwLCAweDRCQ0YsIDB4NjQyMiwgMHgzOEY3LAotICAgIDB4NjQyNCwgMHg0QkQwLCAweDY0MjUsIDB4NDUyMCwgMHg2NDI2LCAweDEzOTUsIDB4NjQyOCwgMHgxMzk5LAotICAgIDB4NjQyOSwgMHg0NTIxLCAweDY0MkEsIDB4NEJEMSwgMHg2NDJDLCAweDBENTYsIDB4NjQyRCwgMHgwQzY1LAotICAgIDB4NjQyRiwgMHg0NTIyLCAweDY0MzQsIDB4MTM5MiwgMHg2NDM1LCAweDRCRDIsIDB4NjQzNiwgMHgxMzk2LAotICAgIDB4NjQzQSwgMHgwNzFFLCAweDY0M0QsIDB4NEJEMywgMHg2NDNFLCAweDA4NjEsIDB4NjQzRiwgMHg0QkQ0LAotICAgIDB4NjQ0MiwgMHgwQTgxLCAweDY0NEUsIDB4MTM5RSwgMHg2NDUxLCAweDFFNDMsIDB4NjQ1MiwgMHg0QkQ1LAotICAgIDB4NjQ1NCwgMHgzOEY4LCAweDY0NTgsIDB4MEMyMCwgMHg2NDVBLCAweDQ1MjMsIDB4NjQ1QiwgMHgzOEY5LAotICAgIDB4NjQ1RCwgMHg0NTI0LCAweDY0NUYsIDB4NEJENiwgMHg2NDYwLCAweDIxMTQsIDB4NjQ2NywgMHgxMzlCLAotICAgIDB4NjQ2OSwgMHgwRThFLCAweDY0NkQsIDB4MzhGQSwgMHg2NDZGLCAweDEzOUMsIDB4NjQ3MywgMHg0NTI1LAotICAgIDB4NjQ3NCwgMHg0QkQ3LCAweDY0NzYsIDB4MTM5RCwgMHg2NDc4LCAweDBFREEsIDB4NjQ3OSwgMHg0MUVELAotICAgIDB4NjQ3QSwgMHgwQTQ2LCAweDY0N0IsIDB4MzhGQiwgMHg2NDdELCAweDQ1MjYsIDB4NjQ4MywgMHgwNzM4LAotICAgIDB4NjQ4NywgMHg0NTI3LCAweDY0ODgsIDB4MTNBNCwgMHg2NDkwLCAweDRCRDgsIDB4NjQ5MSwgMHg0NTI4LAotICAgIDB4NjQ5MiwgMHgwODgzLCAweDY0OTMsIDB4MTNBMSwgMHg2NDk1LCAweDEzQTAsIDB4NjQ5OCwgMHg0QkQ5LAotICAgIDB4NjQ5OSwgMHg0QkRBLCAweDY0OUEsIDB4MENFOCwgMHg2NDlELCAweDIxMTUsIDB4NjQ5RSwgMHgwQzhELAotICAgIDB4NjQ5RiwgMHg0NTI5LCAweDY0QTQsIDB4MEMyQiwgMHg2NEE1LCAweDEzQTIsIDB4NjRBOSwgMHgxM0EzLAotICAgIDB4NjRBQiwgMHgwREUxLCAweDY0QUMsIDB4NEJEQiwgMHg2NEFELCAweDBDRkIsIDB4NjRBRSwgMHgwODcxLAotICAgIDB4NjRCMCwgMHgwQTk1LCAweDY0QjIsIDB4MEU3RSwgMHg2NEIzLCAweDRCREMsIDB4NjRCOSwgMHgwNUE3LAotICAgIDB4NjRCQiwgMHgxM0FBLCAweDY0QkMsIDB4MTNBNSwgMHg2NEJFLCAweDM4RkMsIDB4NjRCRiwgMHgzOEZELAotICAgIDB4NjRDMSwgMHgwRjM0LCAweDY0QzIsIDB4MTNBQywgMHg2NEM0LCAweDQxRUUsIDB4NjRDNSwgMHgxM0E4LAotICAgIDB4NjRDNywgMHgxM0E5LCAweDY0Q0EsIDB4MzQxRCwgMHg2NENCLCAweDQ1MkEsIDB4NjRDQywgMHg0NTJCLAotICAgIDB4NjRDRCwgMHgwQUUyLCAweDY0Q0UsIDB4MjExNiwgMHg2NEQwLCAweDQxRUYsIDB4NjREMiwgMHgxM0E3LAotICAgIDB4NjRENCwgMHgxMzY2LCAweDY0RDUsIDB4NDUyQywgMHg2NEQ3LCAweDQ1MkQsIDB4NjREOCwgMHgxM0FCLAotICAgIDB4NjREQSwgMHgxM0E2LCAweDY0RTAsIDB4MTNCMCwgMHg2NEUxLCAweDEzQjEsIDB4NjRFMiwgMHgwQzIxLAotICAgIDB4NjRFMywgMHgxM0IzLCAweDY0RTQsIDB4NDUyRiwgMHg2NEU1LCAweDM4RkUsIDB4NjRFNiwgMHgwODcyLAotICAgIDB4NjRFNywgMHgxM0FFLCAweDY0RUMsIDB4MDY1NiwgMHg2NEVELCAweDRCREQsIDB4NjRFRiwgMHgxM0I0LAotICAgIDB4NjRGMCwgMHg0QkRFLCAweDY0RjEsIDB4MTNBRCwgMHg2NEYyLCAweDEzQjgsIDB4NjRGNCwgMHgxM0I3LAotICAgIDB4NjRGNiwgMHgxM0I2LCAweDY0RjcsIDB4MzhGRiwgMHg2NEZBLCAweDEzQjksIDB4NjRGQiwgMHgzOTAwLAotICAgIDB4NjRGRCwgMHgxM0JCLCAweDY0RkUsIDB4MDlEOSwgMHg2NEZGLCAweDQ1MzAsIDB4NjUwMCwgMHgxM0JBLAotICAgIDB4NjUwNCwgMHgzOTAxLCAweDY1MDUsIDB4MTNCRSwgMHg2NTBGLCAweDQ1MzIsIDB4NjUxNCwgMHg0NTMzLAotICAgIDB4NjUxNiwgMHgzOTAyLCAweDY1MTgsIDB4MTNCQywgMHg2NTE5LCAweDM5MDMsIDB4NjUxQiwgMHg0QkRGLAotICAgIDB4NjUxQywgMHgxM0JELCAweDY1MUQsIDB4MTM5NywgMHg2NTFFLCAweDQ1MzUsIDB4NjUxRiwgMHg0QkUwLAotICAgIDB4NjUyMiwgMHgxRTk3LCAweDY1MjMsIDB4MTNDMCwgMHg2NTI0LCAweDEzQkYsIDB4NjUyOSwgMHg0MUYwLAotICAgIDB4NjUyQSwgMHgxMzlGLCAweDY1MkIsIDB4MTNDMSwgMHg2NTJDLCAweDEzQjUsIDB4NjUyRSwgMHg0QkUxLAotICAgIDB4NjUyRiwgMHgwOEE3LCAweDY1MzIsIDB4NDUzNiwgMHg2NTM0LCAweDEzQzIsIDB4NjUzNSwgMHgxM0MzLAotICAgIDB4NjUzNiwgMHgxM0M1LCAweDY1MzcsIDB4MTNDNCwgMHg2NTM4LCAweDEzQzYsIDB4NjUzOSwgMHgwNTdFLAotICAgIDB4NjUzQiwgMHgwN0M4LCAweDY1M0UsIDB4MEU0QywgMHg2NTNGLCAweDBBNTMsIDB4NjU0NCwgMHg0NTM3LAotICAgIDB4NjU0NSwgMHgwNzgyLCAweDY1NDcsIDB4MzkwNCwgMHg2NTQ4LCAweDEzQzgsIDB4NjU0OSwgMHg0QkUyLAotICAgIDB4NjU0RCwgMHgxM0NCLCAweDY1NEUsIDB4MjExNywgMHg2NTRGLCAweDBEQzQsIDB4NjU1MSwgMHgwNjc5LAotICAgIDB4NjU1NCwgMHg0NTM4LCAweDY1NTUsIDB4MTNDQSwgMHg2NTU2LCAweDEzQzksIDB4NjU1NywgMHgwRDBBLAotICAgIDB4NjU1OCwgMHgxM0NDLCAweDY1NTksIDB4MDZBRCwgMHg2NTVELCAweDEzQ0UsIDB4NjU1RSwgMHgxM0NELAotICAgIDB4NjU2MCwgMHg0QkUzLCAweDY1NjIsIDB4MDVGNiwgMHg2NTYzLCAweDA4ODQsIDB4NjU2NiwgMHgwQ0IwLAotICAgIDB4NjU2NywgMHgzOTA1LCAweDY1NkIsIDB4NDUzOSwgMHg2NTZDLCAweDA3MUYsIDB4NjU3MCwgMHgwQTNBLAotICAgIDB4NjU3MiwgMHgxM0NGLCAweDY1NzQsIDB4MEE1NCwgMHg2NTc1LCAweDBDMjIsIDB4NjU3NywgMHgwREQxLAotICAgIDB4NjU3OCwgMHgxM0QwLCAweDY1N0EsIDB4NDUzQSwgMHg2NTgxLCAweDM5MDYsIDB4NjU4MiwgMHgxM0QxLAotICAgIDB4NjU4MywgMHgxM0QyLCAweDY1ODQsIDB4NDUzQiwgMHg2NTg1LCAweDM5MDcsIDB4NjU4NywgMHgwRTA4LAotICAgIDB4NjU4OCwgMHgxMjBDLCAweDY1ODksIDB4MEE2QSwgMHg2NThBLCAweDQ1M0MsIDB4NjU4QywgMHgwREJFLAotICAgIDB4NjU4RSwgMHgwODQ4LCAweDY1OTAsIDB4MEQ3OSwgMHg2NTkxLCAweDBENTcsIDB4NjU5MiwgMHg0QkU0LAotICAgIDB4NjU5NSwgMHg0QkU1LCAweDY1OTcsIDB4MEM0NywgMHg2NTk5LCAweDBGODksIDB4NjU5QiwgMHgxM0Q0LAotICAgIDB4NjU5QywgMHgwOEZDLCAweDY1OUQsIDB4NDFGMSwgMHg2NTlGLCAweDEzRDUsIDB4NjVBMSwgMHgwNDdBLAotICAgIDB4NjVBNCwgMHgwNkNDLCAweDY1QTUsIDB4MEE3MSwgMHg2NUE3LCAweDBERDIsIDB4NjVBQiwgMHgxM0Q2LAotICAgIDB4NjVBQywgMHgwODkwLCAweDY1QUQsIDB4MEI4NSwgMHg2NUFGLCAweDA4QTksIDB4NjVCMCwgMHgwOUZELAotICAgIDB4NjVCMiwgMHg0NTNELCAweDY1QjQsIDB4NEJFNiwgMHg2NUI1LCAweDQ1M0UsIDB4NjVCNywgMHgxM0Q3LAotICAgIDB4NjVCOCwgMHg0NTNGLCAweDY1QjksIDB4MEU0RCwgMHg2NUJDLCAweDA1MTksIDB4NjVCRCwgMHgwOEFBLAotICAgIDB4NjVCRSwgMHg0QkU3LCAweDY1QkYsIDB4NDU0MCwgMHg2NUMxLCAweDEzREEsIDB4NjVDMiwgMHgzOTA4LAotICAgIDB4NjVDMywgMHgxM0Q4LCAweDY1QzQsIDB4MTNEQiwgMHg2NUM1LCAweDBGODEsIDB4NjVDNiwgMHgxM0Q5LAotICAgIDB4NjVDOCwgMHg0QkU4LCAweDY1QzksIDB4NDU0MSwgMHg2NUNCLCAweDBBOUYsIDB4NjVDQywgMHgxM0RDLAotICAgIDB4NjVDRSwgMHg0QkU5LCAweDY1Q0YsIDB4MEIxMiwgMHg2NUQwLCAweDRCRUEsIDB4NjVEMiwgMHgxM0RELAotICAgIDB4NjVENCwgMHg0NTQyLCAweDY1RDcsIDB4MDYzNiwgMHg2NUQ5LCAweDEzREYsIDB4NjVEQiwgMHgxM0RFLAotICAgIDB4NjVERiwgMHg0QkVCLCAweDY1RTAsIDB4MTNFMCwgMHg2NUUxLCAweDEzRTEsIDB4NjVFMiwgMHgwNjM3LAotICAgIDB4NjVFMywgMHgzNTg1LCAweDY1RTUsIDB4MENENCwgMHg2NUU2LCAweDBCNzQsIDB4NjVFNywgMHgwNjg2LAotICAgIDB4NjVFOCwgMHgwOEFCLCAweDY1RTksIDB4MEFFMywgMHg2NUVDLCAweDA5NjYsIDB4NjVFRCwgMHgwNDc0LAotICAgIDB4NjVGMCwgMHgzOTA5LCAweDY1RjEsIDB4MTNFMiwgMHg2NUYyLCAweDM5MEEsIDB4NjVGOSwgMHg0NTQ0LAotICAgIDB4NjVGQSwgMHgwNTIyLCAweDY1RkIsIDB4MTNFNiwgMHg2NUZDLCAweDQ1NDUsIDB4NjYwMCwgMHgyMTE4LAotICAgIDB4NjYwMiwgMHgwN0M5LCAweDY2MDMsIDB4MTNFNSwgMHg2NjA0LCAweDQ1NDYsIDB4NjYwNiwgMHgwODFCLAotICAgIDB4NjYwNywgMHgwOUEyLCAweDY2MDgsIDB4NDU0NywgMHg2NjA5LCAweDIxMUEsIDB4NjYwQSwgMHgxM0U0LAotICAgIDB4NjYwQywgMHgwOUEzLCAweDY2MEUsIDB4MEVDQywgMHg2NjBGLCAweDA4MUEsIDB4NjYxMywgMHgwNDlCLAotICAgIDB4NjYxNCwgMHgwQTcyLCAweDY2MTUsIDB4MjExOSwgMHg2NjFDLCAweDEzRUIsIDB4NjYxRSwgMHg0RjUwLAotICAgIDB4NjYxRiwgMHgwQTU1LCAweDY2MjAsIDB4MDRFOSwgMHg2NjIxLCAweDQ1NDgsIDB4NjYyMiwgMHg0MUYzLAotICAgIDB4NjYyNCwgMHgyMTFELCAweDY2MjUsIDB4MDk1RiwgMHg2NjI3LCAweDBFOTQsIDB4NjYyOCwgMHgwODYyLAotICAgIDB4NjYyQSwgMHg0NTQ5LCAweDY2MkIsIDB4NDFGNCwgMHg2NjJDLCAweDM5MEIsIDB4NjYyRCwgMHgwOUE0LAotICAgIDB4NjYyRSwgMHgyMTFCLCAweDY2MkYsIDB4MEE0QiwgMHg2NjMwLCAweDQxRjUsIDB4NjYzMSwgMHgyMEFFLAotICAgIDB4NjYzMywgMHg0MUY2LCAweDY2MzQsIDB4MTNFQSwgMHg2NjM1LCAweDEzRTgsIDB4NjYzNiwgMHgxM0U5LAotICAgIDB4NjYzQSwgMHg0MUYyLCAweDY2M0IsIDB4MUUwMCwgMHg2NjNDLCAweDBCQTksIDB4NjYzRiwgMHgxNDA5LAotICAgIDB4NjY0MSwgMHgxM0VGLCAweDY2NDIsIDB4MDhDQywgMHg2NjQzLCAweDA3Q0EsIDB4NjY0NCwgMHgxM0VELAotICAgIDB4NjY0NSwgMHg0NTRBLCAweDY2NDgsIDB4NDFGNywgMHg2NjQ5LCAweDEzRUUsIDB4NjY0QiwgMHgwOUZFLAotICAgIDB4NjY0QywgMHgzOTBDLCAweDY2NEUsIDB4NDU0QywgMHg2NjRGLCAweDEzRUMsIDB4NjY1MSwgMHg0NTRCLAotICAgIDB4NjY1MiwgMHgwODdELCAweDY2NTcsIDB4MjExRiwgMHg2NjU5LCAweDIxMjAsIDB4NjY1QSwgMHgzNDQxLAotICAgIDB4NjY1QiwgMHgzOTBELCAweDY2NUMsIDB4MzkwRSwgMHg2NjVELCAweDEzRjEsIDB4NjY1RSwgMHgxM0YwLAotICAgIDB4NjY1RiwgMHgxM0Y1LCAweDY2NjEsIDB4MzkwRiwgMHg2NjYyLCAweDEzRjYsIDB4NjY2MywgMHgzNzNBLAotICAgIDB4NjY2NCwgMHgxM0YyLCAweDY2NjUsIDB4MjExRSwgMHg2NjY2LCAweDA1ODAsIDB4NjY2NywgMHgxM0YzLAotICAgIDB4NjY2OCwgMHgxM0Y0LCAweDY2NjksIDB4MEQ2OSwgMHg2NjZBLCAweDQ1NTEsIDB4NjY2QiwgMHgzOTEwLAotICAgIDB4NjY2QywgMHg0NTUyLCAweDY2NkQsIDB4NDU1MywgMHg2NjZFLCAweDBERDMsIDB4NjY2RiwgMHgwNzIwLAotICAgIDB4NjY3MCwgMHgxM0Y3LCAweDY2NzMsIDB4MjEyMiwgMHg2Njc0LCAweDBBNTYsIDB4NjY3NiwgMHgwOUE1LAotICAgIDB4NjY3NywgMHg0MUY5LCAweDY2NzgsIDB4NDFGQSwgMHg2NjdBLCAweDBCOTAsIDB4NjY3QiwgMHg0NTU0LAotICAgIDB4NjY3RSwgMHg0QkVDLCAweDY2ODAsIDB4NDU1NSwgMHg2NjgxLCAweDA2QkYsIDB4NjY4MywgMHgxM0Y4LAotICAgIDB4NjY4NCwgMHgxM0ZDLCAweDY2ODcsIDB4MDU0QiwgMHg2Njg4LCAweDEzRjksIDB4NjY4OSwgMHgxM0ZCLAotICAgIDB4NjY4QiwgMHg0QkVELCAweDY2OEMsIDB4NEJFRSwgMHg2NjhELCAweDQxRkIsIDB4NjY4RSwgMHgxM0ZBLAotICAgIDB4NjY5MCwgMHg0NTU2LCAweDY2OTEsIDB4MDk3NSwgMHg2NjkyLCAweDQ1NTcsIDB4NjY5NiwgMHgwQjg2LAotICAgIDB4NjY5NywgMHgwNDg5LCAweDY2OTgsIDB4MTNGRCwgMHg2Njk5LCAweDIxMjMsIDB4NjY5RCwgMHgxM0ZFLAotICAgIDB4NjZBMCwgMHgyMTI0LCAweDY2QTIsIDB4MEJDNiwgMHg2NkE0LCAweDM5MTIsIDB4NjZBNiwgMHgwRkI5LAotICAgIDB4NjZBQiwgMHgwODkxLCAweDY2QUQsIDB4NDU1OSwgMHg2NkFFLCAweDBFM0IsIDB4NjZCMSwgMHg0NTVBLAotICAgIDB4NjZCMiwgMHgyMTI1LCAweDY2QjMsIDB4NEJFRiwgMHg2NkI0LCAweDBFNkIsIDB4NjZCNSwgMHg0NTVCLAotICAgIDB4NjZCOCwgMHgxNDA1LCAweDY2QjksIDB4MTQwMCwgMHg2NkJCLCAweDQxRkMsIDB4NjZCQywgMHgxNDAzLAotICAgIDB4NjZCRSwgMHgxNDAyLCAweDY2QkYsIDB4MjEyNiwgMHg2NkMwLCAweDRCRjAsIDB4NjZDMSwgMHgxM0ZGLAotICAgIDB4NjZDNCwgMHgxNDA0LCAweDY2QzYsIDB4MzQ1NSwgMHg2NkM3LCAweDBDQjYsIDB4NjZDOCwgMHgzOTEzLAotICAgIDB4NjZDOSwgMHgxNDAxLCAweDY2Q0YsIDB4NEJGMSwgMHg2NkQ2LCAweDE0MDYsIDB4NjZEOSwgMHgwOTc2LAotICAgIDB4NjZEQSwgMHgxNDA3LCAweDY2REIsIDB4NDFGRCwgMHg2NkRDLCAweDBGMzUsIDB4NjZERCwgMHgwRDJFLAotICAgIDB4NjZFMCwgMHgxNDA4LCAweDY2RTYsIDB4MTQwQSwgMHg2NkU4LCAweDQxRkUsIDB4NjZFOSwgMHgxNDBCLAotICAgIDB4NjZFQywgMHgzOTE0LCAweDY2RjAsIDB4MTQwQywgMHg2NkYyLCAweDA2QzIsIDB4NjZGMywgMHgwNEVBLAotICAgIDB4NjZGNCwgMHgwN0NCLCAweDY2RjUsIDB4MTQwRCwgMHg2NkY3LCAweDE0MEUsIDB4NjZGOCwgMHgwOTdCLAotICAgIDB4NjZGOSwgMHgwQUU0LCAweDY2RkEsIDB4MjEyNywgMHg2NkZCLCAweDIwQjEsIDB4NjZGQywgMHgxMEVELAotICAgIDB4NjZGRCwgMHgwQUMwLCAweDY2RkUsIDB4MEFCRiwgMHg2NkZGLCAweDBCMzgsIDB4NjcwMCwgMHgwODM3LAotICAgIDB4NjcwMSwgMHg0NTVGLCAweDY3MDMsIDB4MTA0QiwgMHg2NzA1LCAweDM5MTUsIDB4NjcwOCwgMHgwNzQ0LAotICAgIDB4NjcwOSwgMHgwRjE3LCAweDY3MEIsIDB4MEU0RSwgMHg2NzBELCAweDBERjAsIDB4NjcwRSwgMHgyMTI4LAotICAgIDB4NjcwRiwgMHgxNDBGLCAweDY3MTIsIDB4NDU2MCwgMHg2NzEzLCAweDM5MTYsIDB4NjcxNCwgMHgwODYzLAotICAgIDB4NjcxNSwgMHgwQkRCLCAweDY3MTYsIDB4MTQxMCwgMHg2NzE3LCAweDBGRDUsIDB4NjcxOSwgMHg0NTYyLAotICAgIDB4NjcxQiwgMHgwRTZDLCAweDY3MUQsIDB4MEJDNywgMHg2NzFFLCAweDE0MTEsIDB4NjcxRiwgMHgwNjM4LAotICAgIDB4NjcyNSwgMHg0QkYyLCAweDY3MjYsIDB4MTQxMiwgMHg2NzI3LCAweDE0MTMsIDB4NjcyOCwgMHgwRUU2LAotICAgIDB4NjcyQSwgMHgwRUIwLCAweDY3MkIsIDB4MEVBNCwgMHg2NzJDLCAweDBFOEEsIDB4NjcyRCwgMHgwODczLAotICAgIDB4NjcyRSwgMHgxNDE1LCAweDY3MzEsIDB4MDkxNywgMHg2NzMzLCAweDM5MTcsIDB4NjczNCwgMHgwRTdGLAotICAgIDB4NjczNSwgMHg0QkYzLCAweDY3MzYsIDB4MTQxNywgMHg2NzM3LCAweDE0MUEsIDB4NjczOCwgMHgxNDE5LAotICAgIDB4NjczQSwgMHgwNjM1LCAweDY3M0QsIDB4MDY3QSwgMHg2NzNGLCAweDE0MTYsIDB4Njc0MSwgMHgxNDE4LAotICAgIDB4Njc0MywgMHgzNUI3LCAweDY3NDYsIDB4MTQxQiwgMHg2NzQ3LCAweDQxRkYsIDB4Njc0OCwgMHgzOTE4LAotICAgIDB4Njc0OSwgMHgwQTNGLCAweDY3NEMsIDB4MzkxOSwgMHg2NzRELCAweDQ1NjUsIDB4Njc0RSwgMHgwRjY1LAotICAgIDB4Njc0RiwgMHgwNDhELCAweDY3NTAsIDB4MDg1MCwgMHg2NzUxLCAweDBCMUMsIDB4Njc1MywgMHgwOTA5LAotICAgIDB4Njc1NCwgMHg0NTY2LCAweDY3NTUsIDB4NEJGNCwgMHg2NzU2LCAweDA5REIsIDB4Njc1OSwgMHgxNDFFLAotICAgIDB4Njc1QywgMHgwQzQ4LCAweDY3NUQsIDB4NDU2NywgMHg2NzVFLCAweDE0MUMsIDB4Njc1RiwgMHgwQjBCLAotICAgIDB4Njc2MCwgMHgxNDFELCAweDY3NjEsIDB4MDlEQSwgMHg2NzYyLCAweDBFRTksIDB4Njc2MywgMHgxNDFGLAotICAgIDB4Njc2NCwgMHgxNDIwLCAweDY3NjUsIDB4MEY1MiwgMHg2NzY2LCAweDIxMkEsIDB4Njc2QSwgMHgxNDI1LAotICAgIDB4Njc2RCwgMHgwN0NDLCAweDY3NkUsIDB4MzU3MSwgMHg2NzZGLCAweDBEMEIsIDB4Njc3MCwgMHgxNDIyLAotICAgIDB4Njc3MSwgMHgwQzY2LCAweDY3NzIsIDB4MTNFMywgMHg2NzczLCAweDEzRTcsIDB4Njc3NCwgMHg0NTZCLAotICAgIDB4Njc3NSwgMHgwNjY5LCAweDY3NzYsIDB4MzkxQSwgMHg2Nzc3LCAweDBDRkQsIDB4Njc3QiwgMHgzOTFCLAotICAgIDB4Njc3QywgMHgxNDI0LCAweDY3N0UsIDB4MDlBNiwgMHg2NzdGLCAweDBENTgsIDB4Njc4MCwgMHg0QkY1LAotICAgIDB4Njc4MSwgMHg0MjAwLCAweDY3ODUsIDB4MTQyQSwgMHg2Nzg3LCAweDBEOEUsIDB4Njc4OSwgMHgxNDIxLAotICAgIDB4Njc4QiwgMHgxNDI3LCAweDY3OEMsIDB4MTQyNiwgMHg2NzhGLCAweDRCRjYsIDB4Njc5MCwgMHgwQTczLAotICAgIDB4Njc5MSwgMHg0QkY3LCAweDY3OTIsIDB4NDU2RCwgMHg2NzkzLCAweDQyMDEsIDB4Njc5NSwgMHgwRTlCLAotICAgIDB4Njc5NywgMHgwRjlCLCAweDY3OTgsIDB4NDIwMiwgMHg2NzlBLCAweDBFOTUsIDB4Njc5QiwgMHg0MjAzLAotICAgIDB4Njc5QywgMHgwNTRDLCAweDY3OUQsIDB4MDhBQywgMHg2N0EwLCAweDBGRUUsIDB4NjdBMSwgMHgxNDI5LAotICAgIDB4NjdBMiwgMHgwQTNCLCAweDY3QTQsIDB4NEJGOCwgMHg2N0E2LCAweDE0MjgsIDB4NjdBOSwgMHgxNDIzLAotICAgIDB4NjdBRiwgMHgwNzgzLCAweDY3QjAsIDB4MzkxQywgMHg2N0IxLCAweDRCRjksIDB4NjdCMiwgMHgzOTFELAotICAgIDB4NjdCMywgMHgxNDJGLCAweDY3QjQsIDB4MTQyRCwgMHg2N0I1LCAweDRCRkEsIDB4NjdCNiwgMHgwNTRELAotICAgIDB4NjdCNywgMHgxNDJCLCAweDY3QjgsIDB4MTQzMSwgMHg2N0I5LCAweDE0MzcsIDB4NjdCQiwgMHgyMTJCLAotICAgIDB4NjdCRSwgMHg0QkZCLCAweDY3QzAsIDB4MjEyRCwgMHg2N0MxLCAweDBCMjgsIDB4NjdDMywgMHg0NTcxLAotICAgIDB4NjdDNCwgMHgwRTExLCAweDY3QzYsIDB4MTQzOSwgMHg2N0M4LCAweDQ1NzIsIDB4NjdDQSwgMHgwRDk0LAotICAgIDB4NjdDRSwgMHgxNDM4LCAweDY3Q0YsIDB4MEQyNiwgMHg2N0QwLCAweDBFNkQsIDB4NjdEMSwgMHgwNUY3LAotICAgIDB4NjdEMiwgMHg0NTczLCAweDY3RDMsIDB4MEE5QiwgMHg2N0Q0LCAweDA5NEEsIDB4NjdENywgMHgzOTFGLAotICAgIDB4NjdEOCwgMHgwQkVGLCAweDY3RDksIDB4MzkyMCwgMHg2N0RBLCAweDBGMTgsIDB4NjdEQiwgMHg0NTc0LAotICAgIDB4NjdERCwgMHgxNDM0LCAweDY3REUsIDB4MTQzMywgMHg2N0UyLCAweDE0MzUsIDB4NjdFNCwgMHgxNDMyLAotICAgIDB4NjdFNywgMHgxNDNBLCAweDY3RTksIDB4MTQzMCwgMHg2N0VDLCAweDE0MkUsIDB4NjdFRSwgMHgxNDM2LAotICAgIDB4NjdFRiwgMHgxNDJDLCAweDY3RjAsIDB4MzkyMSwgMHg2N0YxLCAweDBCQUEsIDB4NjdGMywgMHgwRjA0LAotICAgIDB4NjdGNCwgMHgwOEYyLCAweDY3RjUsIDB4MDg2NCwgMHg2N0Y3LCAweDQ1NzUsIDB4NjdGOSwgMHgzOTFFLAotICAgIDB4NjdGQSwgMHgxRTlBLCAweDY3RkIsIDB4MDgyQSwgMHg2N0ZDLCAweDQyMDQsIDB4NjdGRSwgMHgwRTlELAotICAgIDB4NjdGRiwgMHgwNTlGLCAweDY4MDEsIDB4MzZGMiwgMHg2ODAyLCAweDBCRUEsIDB4NjgwMywgMHgwQ0EyLAotICAgIDB4NjgwNCwgMHgwNEVCLCAweDY4MDUsIDB4MUUwNywgMHg2ODEwLCAweDQ1NzAsIDB4NjgxMywgMHgwQTk2LAotICAgIDB4NjgxNiwgMHgwQTU4LCAweDY4MTcsIDB4MDcwMCwgMHg2ODE4LCAweDQ1NzksIDB4NjgxRCwgMHg0MjA1LAotICAgIDB4NjgxRSwgMHgxNDNDLCAweDY4MUYsIDB4NDU3QSwgMHg2ODIxLCAweDA3Q0QsIDB4NjgyMiwgMHgwNURBLAotICAgIDB4NjgyOCwgMHg0QkZDLCAweDY4MjksIDB4MTQzRSwgMHg2ODJBLCAweDA1RDIsIDB4NjgyQiwgMHgxNDQ0LAotICAgIDB4NjgyQywgMHgzOTIyLCAweDY4MkQsIDB4NDU3QiwgMHg2ODMwLCAweDM5MjMsIDB4NjgzMSwgMHgzOTI0LAotICAgIDB4NjgzMiwgMHgxNDQxLCAweDY4MzMsIDB4NDU3RCwgMHg2ODM0LCAweDBBOTcsIDB4NjgzOCwgMHgwNUE5LAotICAgIDB4NjgzOSwgMHgwODFDLCAweDY4M0IsIDB4NDU3RSwgMHg2ODNDLCAweDA1QTgsIDB4NjgzRCwgMHgwODNGLAotICAgIDB4NjgzRSwgMHg0NTdGLCAweDY4NDAsIDB4MTQzRiwgMHg2ODQxLCAweDA3M0IsIDB4Njg0MiwgMHgwNzIxLAotICAgIDB4Njg0MywgMHgwQzY3LCAweDY4NDQsIDB4MjEyRiwgMHg2ODQ1LCAweDQ1ODAsIDB4Njg0NiwgMHgxNDNELAotICAgIDB4Njg0OCwgMHgwNDhBLCAweDY4NDksIDB4NDU4MSwgMHg2ODRDLCAweDQ1ODIsIDB4Njg0RCwgMHgxNDQwLAotICAgIDB4Njg0RSwgMHgxNDQyLCAweDY4NTAsIDB4MDZDNSwgMHg2ODUxLCAweDA3MDIsIDB4Njg1MiwgMHgyMTJDLAotICAgIDB4Njg1MywgMHgwNUY4LCAweDY4NTQsIDB4MDY2NSwgMHg2ODU1LCAweDQ1ODMsIDB4Njg1NywgMHg0NTg0LAotICAgIDB4Njg1OSwgMHgxNDQ1LCAweDY4NUIsIDB4MzkyNSwgMHg2ODVDLCAweDA4NjksIDB4Njg1RCwgMHgwRTlGLAotICAgIDB4Njg1RiwgMHgwODg1LCAweDY4NjMsIDB4MTQ0NiwgMHg2ODY3LCAweDBEQTIsIDB4Njg2QiwgMHg0NTg2LAotICAgIDB4Njg2RSwgMHg0NTg3LCAweDY4NzIsIDB4MzkyNiwgMHg2ODc0LCAweDE0NTIsIDB4Njg3NSwgMHgzOTI3LAotICAgIDB4Njg3NiwgMHgwNTMzLCAweDY4NzcsIDB4MTQ0NywgMHg2ODdBLCAweDM5MjgsIDB4Njg3QywgMHg0NTg4LAotICAgIDB4Njg3RSwgMHgxNDU4LCAweDY4N0YsIDB4MTQ0OCwgMHg2ODgxLCAweDBGOEEsIDB4Njg4MiwgMHg0NTg5LAotICAgIDB4Njg4MywgMHgxNDRGLCAweDY4ODQsIDB4MzkyOSwgMHg2ODg1LCAweDBEMTUsIDB4Njg4NiwgMHg0QkZELAotICAgIDB4Njg4RCwgMHgxNDU3LCAweDY4OEUsIDB4MUU5QywgMHg2ODhGLCAweDE0NEEsIDB4Njg5MCwgMHg0NThBLAotICAgIDB4Njg5MywgMHgwNDc4LCAweDY4OTQsIDB4MTQ0QywgMHg2ODk2LCAweDQ1OEIsIDB4Njg5NywgMHgwN0NFLAotICAgIDB4Njg5OCwgMHg0NThELCAweDY4OTksIDB4NDU4RSwgMHg2ODlBLCAweDQ1OEYsIDB4Njg5QiwgMHgxNDRFLAotICAgIDB4Njg5QywgMHg0NTkwLCAweDY4OUQsIDB4MTQ0RCwgMHg2ODlGLCAweDE0NDksIDB4NjhBMCwgMHgxNDU0LAotICAgIDB4NjhBMiwgMHgwOUE3LCAweDY4QTMsIDB4NDIwNiwgMHg2OEE1LCAweDM5MkEsIDB4NjhBNiwgMHgxMUJFLAotICAgIDB4NjhBNywgMHgwNzlDLCAweDY4QTgsIDB4MEY2NiwgMHg2OEFBLCAweDQ1OTEsIDB4NjhBQiwgMHg0NTkyLAotICAgIDB4NjhBRCwgMHgxNDRCLCAweDY4QUYsIDB4MEMxMCwgMHg2OEIwLCAweDA1ODEsIDB4NjhCMSwgMHgwODFELAotICAgIDB4NjhCMiwgMHgzOTJCLCAweDY4QjMsIDB4MTQ0MywgMHg2OEI0LCAweDQ1OTMsIDB4NjhCNSwgMHgxNDUzLAotICAgIDB4NjhCNiwgMHgwNUJGLCAweDY4QjksIDB4MTQ1MSwgMHg2OEJBLCAweDE0NTUsIDB4NjhCQiwgMHg0NTk0LAotICAgIDB4NjhCQywgMHgwQzY4LCAweDY4QzMsIDB4NDU5OCwgMHg2OEM0LCAweDA2M0EsIDB4NjhDNSwgMHg0NTk5LAotICAgIDB4NjhDNiwgMHgxNDczLCAweDY4QzgsIDB4MjBBRiwgMHg2OEM5LCAweDBFRDUsIDB4NjhDQSwgMHgxNDVBLAotICAgIDB4NjhDQiwgMHgwNjM5LCAweDY4Q0MsIDB4NDU5QSwgMHg2OENELCAweDE0NjEsIDB4NjhDRiwgMHgyMTMwLAotICAgIDB4NjhEMCwgMHgzOTJDLCAweDY4RDIsIDB4MEU2RSwgMHg2OEQ0LCAweDE0NjIsIDB4NjhENSwgMHgxNDY0LAotICAgIDB4NjhENiwgMHgzOTJELCAweDY4RDcsIDB4MTQ2OCwgMHg2OEQ4LCAweDE0NUMsIDB4NjhEOSwgMHg0NTlCLAotICAgIDB4NjhEQSwgMHgwQjY4LCAweDY4REYsIDB4MEM2OSwgMHg2OEUwLCAweDE0NkMsIDB4NjhFMSwgMHgxNDVGLAotICAgIDB4NjhFMywgMHgxNDY5LCAweDY4RTQsIDB4NDU5QywgMHg2OEU1LCAweDQ1OUQsIDB4NjhFNywgMHgxNDYzLAotICAgIDB4NjhFOCwgMHgzOTJFLCAweDY4RUIsIDB4NEJGRSwgMHg2OEVDLCAweDQ1OUUsIDB4NjhFRCwgMHgzOTJGLAotICAgIDB4NjhFRSwgMHgwOUZGLCAweDY4RUYsIDB4MTQ2RCwgMHg2OEYwLCAweDM5MzAsIDB4NjhGMSwgMHgzOTMxLAotICAgIDB4NjhGMiwgMHgwQTU3LCAweDY4RjUsIDB4NEJGRiwgMHg2OEY3LCAweDQ1OUYsIDB4NjhGOSwgMHgxNDZCLAotICAgIDB4NjhGQSwgMHgwNUY5LCAweDY4RkIsIDB4NDU5NSwgMHg2OEZDLCAweDM5MzIsIDB4NjkwMCwgMHgwRkY2LAotICAgIDB4NjkwMSwgMHgxNDU5LCAweDY5MDMsIDB4NDVBMCwgMHg2OTA0LCAweDE0NjcsIDB4NjkwNSwgMHgwNDlDLAotICAgIDB4NjkwNywgMHg0NUExLCAweDY5MDgsIDB4MTQ1QiwgMHg2OTBBLCAweDQyMDcsIDB4NjkwQiwgMHgwRUM2LAotICAgIDB4NjkwQywgMHgxNDYwLCAweDY5MEQsIDB4MDlFOCwgMHg2OTBFLCAweDBCRTMsIDB4NjkwRiwgMHgxNDU2LAotICAgIDB4NjkxMSwgMHgzOTMzLCAweDY5MTIsIDB4MTQ2NiwgMHg2OTEzLCAweDM5MzQsIDB4NjkxNywgMHg0QzAwLAotICAgIDB4NjkxOSwgMHgwQTQwLCAweDY5MUEsIDB4MTQ3MCwgMHg2OTFCLCAweDA1Q0YsIDB4NjkxQywgMHgwNzU1LAotICAgIDB4NjkyMSwgMHgxNDcyLCAweDY5MjIsIDB4MTQ1RCwgMHg2OTIzLCAweDE0NzEsIDB4NjkyNSwgMHgxNDZBLAotICAgIDB4NjkyNiwgMHgxNDVFLCAweDY5MjgsIDB4MTQ2RSwgMHg2OTJBLCAweDE0NkYsIDB4NjkzMCwgMHgxNDgwLAotICAgIDB4NjkzMywgMHg0QzAxLCAweDY5MzQsIDB4MENBNiwgMHg2OTM1LCAweDM5MzUsIDB4NjkzNiwgMHgxNDY1LAotICAgIDB4NjkzOCwgMHg0QzAyLCAweDY5MzksIDB4MTQ3QywgMHg2OTNCLCAweDM5MzYsIDB4NjkzRCwgMHgxNDdFLAotICAgIDB4NjkzRiwgMHgwQkY0LCAweDY5NDIsIDB4NDIwQSwgMHg2OTQ2LCAweDQ1QTUsIDB4Njk0OSwgMHg0MjA4LAotICAgIDB4Njk0QSwgMHgwRjM2LCAweDY5NTMsIDB4MERFOCwgMHg2OTU0LCAweDE0NzksIDB4Njk1NSwgMHgwQjJBLAotICAgIDB4Njk1NywgMHgzOTM3LCAweDY5NTksIDB4MTQ3RiwgMHg2OTVBLCAweDBBQzEsIDB4Njk1QiwgMHg0QzAzLAotICAgIDB4Njk1QywgMHgxNDc2LCAweDY5NUQsIDB4MTQ4MywgMHg2OTVFLCAweDE0ODIsIDB4Njk2MCwgMHgwQ0M3LAotICAgIDB4Njk2MSwgMHgxNDgxLCAweDY5NjIsIDB4MENDMiwgMHg2OTYzLCAweDM5MzgsIDB4Njk2NCwgMHg0MjBCLAotICAgIDB4Njk2NSwgMHg0QzA0LCAweDY5NjgsIDB4MjEzMiwgMHg2OTY5LCAweDQ1QTYsIDB4Njk2QSwgMHgxNDg1LAotICAgIDB4Njk2QiwgMHgxNDc4LCAweDY5NkMsIDB4NDVBNywgMHg2OTZELCAweDA2QzAsIDB4Njk2RSwgMHgxNDdCLAotICAgIDB4Njk2RiwgMHgwOTY3LCAweDY5NzIsIDB4MzkzOSwgMHg2OTczLCAweDBEMTYsIDB4Njk3NCwgMHgxNDdELAotICAgIDB4Njk3NSwgMHgwNkMzLCAweDY5NzcsIDB4MTQ3NSwgMHg2OTc4LCAweDE0NzcsIDB4Njk3OSwgMHgxNDc0LAotICAgIDB4Njk3QSwgMHg0NUE4LCAweDY5N0MsIDB4MEZENiwgMHg2OTdELCAweDA1QjgsIDB4Njk3RSwgMHgxNDdBLAotICAgIDB4Njk3RiwgMHgzOTNBLCAweDY5ODAsIDB4MzkzQiwgMHg2OTgxLCAweDE0ODQsIDB4Njk4MiwgMHgwNTkzLAotICAgIDB4Njk4NiwgMHgzNzQwLCAweDY5OEEsIDB4MDg1NywgMHg2OThFLCAweDA0RkYsIDB4Njk5MSwgMHgxNDk1LAotICAgIDB4Njk5MiwgMHg0NUE5LCAweDY5OTQsIDB4MEZENywgMHg2OTk1LCAweDE0OTgsIDB4Njk5NiwgMHg0NUFCLAotICAgIDB4Njk5OCwgMHgyMTM0LCAweDY5OUIsIDB4MEEwMCwgMHg2OTlDLCAweDE0OTcsIDB4NjlBMCwgMHgxNDk2LAotICAgIDB4NjlBNSwgMHg0MjBDLCAweDY5QTYsIDB4MzkzQywgMHg2OUE3LCAweDE0OTMsIDB4NjlBOCwgMHg0QzA1LAotICAgIDB4NjlBQiwgMHg0QzA2LCAweDY5QUQsIDB4MzkzRCwgMHg2OUFFLCAweDE0ODcsIDB4NjlBRiwgMHg0QzA3LAotICAgIDB4NjlCMCwgMHg0NUFDLCAweDY5QjEsIDB4MTRBNCwgMHg2OUIyLCAweDE0ODYsIDB4NjlCNCwgMHgxNDk5LAotICAgIDB4NjlCNywgMHgzOTNFLCAweDY5QkEsIDB4NDVBRCwgMHg2OUJCLCAweDE0OTEsIDB4NjlCQywgMHg0NUFFLAotICAgIDB4NjlCRSwgMHgxNDhDLCAweDY5QkYsIDB4MTQ4OSwgMHg2OUMwLCAweDQ1QUYsIDB4NjlDMSwgMHgxNDhBLAotICAgIDB4NjlDMywgMHgxNDkyLCAweDY5QzcsIDB4MUQzMywgMHg2OUNBLCAweDE0OEYsIDB4NjlDQiwgMHgwN0NGLAotICAgIDB4NjlDQywgMHgwQkU0LCAweDY5Q0QsIDB4MEFFNiwgMHg2OUNFLCAweDE0OEQsIDB4NjlDRiwgMHg0MjBELAotICAgIDB4NjlEMCwgMHgxNDg4LCAweDY5RDEsIDB4NDVCMCwgMHg2OUQzLCAweDE0OEIsIDB4NjlENiwgMHgzOTNGLAotICAgIDB4NjlENywgMHgzOTQwLCAweDY5RDgsIDB4MEYzNywgMHg2OUQ5LCAweDBFOTgsIDB4NjlERCwgMHgxNDkwLAotICAgIDB4NjlERSwgMHgxNDlBLCAweDY5RTIsIDB4MjEzNSwgMHg2OUUzLCAweDQ1QjQsIDB4NjlFNSwgMHg0QzA4LAotICAgIDB4NjlFNywgMHgxNEEyLCAweDY5RTgsIDB4MTQ5QiwgMHg2OUU5LCAweDQyMTAsIDB4NjlFQSwgMHgzNDExLAotICAgIDB4NjlFQiwgMHgxNEE4LCAweDY5RUQsIDB4MTRBNiwgMHg2OUVFLCAweDQ1QjUsIDB4NjlFRiwgMHg0NUI2LAotICAgIDB4NjlGMSwgMHg0QzA5LCAweDY5RjIsIDB4MTRBMSwgMHg2OUYzLCAweDQ1QjcsIDB4NjlGNCwgMHg0NUI5LAotICAgIDB4NjlGNSwgMHg0MjExLCAweDY5RjYsIDB4MzczRiwgMHg2OUY5LCAweDE0QTAsIDB4NjlGQiwgMHgwQkVDLAotICAgIDB4NjlGRCwgMHgwQUU3LCAweDY5RkUsIDB4NDVCQSwgMHg2OUZGLCAweDE0OUUsIDB4NkEwMSwgMHgzOTQxLAotICAgIDB4NkEwMiwgMHgxNDlDLCAweDZBMDUsIDB4MTRBMywgMHg2QTBBLCAweDE0QTksIDB4NkEwQiwgMHgwRDg5LAotICAgIDB4NkEwQywgMHgxNEFGLCAweDZBMEYsIDB4Mzk0MiwgMHg2QTExLCAweDQ1QkIsIDB4NkExMiwgMHgxNEFBLAotICAgIDB4NkExMywgMHgxNEFELCAweDZBMTQsIDB4MTRBNywgMHg2QTE1LCAweDM5NDMsIDB4NkExNywgMHgwQkIyLAotICAgIDB4NkExOSwgMHgwREFBLCAweDZBMUEsIDB4NDVCQywgMHg2QTFCLCAweDE0OUQsIDB4NkExRCwgMHg0NUJELAotICAgIDB4NkExRSwgMHgxNEE1LCAweDZBMUYsIDB4MDlBOCwgMHg2QTIxLCAweDBFREIsIDB4NkEyMiwgMHgxNEI5LAotICAgIDB4NkEyMywgMHgxNEFDLCAweDZBMjgsIDB4Mzk0NCwgMHg2QTI5LCAweDA3NTYsIDB4NkEyQSwgMHgwNTIzLAotICAgIDB4NkEyQiwgMHgwNUJELCAweDZBMkUsIDB4MTQ5NCwgMHg2QTMwLCAweDIxMzYsIDB4NkEzMiwgMHg0NUJGLAotICAgIDB4NkEzMywgMHg0NUMwLCAweDZBMzQsIDB4Mzk0NSwgMHg2QTM1LCAweDA5QTksIDB4NkEzNiwgMHgxNEIxLAotICAgIDB4NkEzOCwgMHgxNEI4LCAweDZBMzksIDB4MDkyNSwgMHg2QTNBLCAweDA1RDAsIDB4NkEzQiwgMHg0MjEzLAotICAgIDB4NkEzRCwgMHgwQjZDLCAweDZBM0UsIDB4Mzk0NiwgMHg2QTNGLCAweDQ1QzEsIDB4NkE0NCwgMHgxNEFFLAotICAgIDB4NkE0NSwgMHgzOTQ3LCAweDZBNDYsIDB4MjEzOCwgMHg2QTQ3LCAweDE0QjMsIDB4NkE0OCwgMHgxNEI3LAotICAgIDB4NkE0OSwgMHg0NUMyLCAweDZBNEEsIDB4NEMwQSwgMHg2QTRCLCAweDA2QUUsIDB4NkE0RSwgMHg0NUM0LAotICAgIDB4NkE1MCwgMHgzOTQ4LCAweDZBNTEsIDB4Mzk0OSwgMHg2QTUyLCAweDQ1QzUsIDB4NkE1NCwgMHgzQzM0LAotICAgIDB4NkE1NSwgMHg0QzBCLCAweDZBNTYsIDB4Mzk0QSwgMHg2QTU4LCAweDA2NjYsIDB4NkE1OSwgMHgxNEI1LAotICAgIDB4NkE1QiwgMHgzOTRCLCAweDZBNUYsIDB4MDYzQiwgMHg2QTYxLCAweDBDQTMsIDB4NkE2MiwgMHgxNEI0LAotICAgIDB4NkE2NCwgMHg0NUM2LCAweDZBNjYsIDB4MTRCNiwgMHg2QTY3LCAweDRDMEMsIDB4NkE2QiwgMHgyMTM3LAotICAgIDB4NkE3MSwgMHg0QzBELCAweDZBNzIsIDB4MTRCMCwgMHg2QTczLCAweDIxMzksIDB4NkE3OCwgMHgxNEIyLAotICAgIDB4NkE3QSwgMHg0NUMzLCAweDZBN0UsIDB4MjEzQSwgMHg2QTdGLCAweDA1QkUsIDB4NkE4MCwgMHgwQjg3LAotICAgIDB4NkE4MywgMHgzOTRDLCAweDZBODQsIDB4MTRCRCwgMHg2QTg5LCAweDM5NEQsIDB4NkE4QiwgMHg0NUM4LAotICAgIDB4NkE4RCwgMHgxNEJCLCAweDZBOEUsIDB4MDc5RCwgMHg2QTkwLCAweDE0QkEsIDB4NkE5MSwgMHgzOTRFLAotICAgIDB4NkE5NCwgMHg0MjE1LCAweDZBOTcsIDB4MTRDMCwgMHg2QTlDLCAweDE0M0IsIDB4NkE5RCwgMHgzOTRGLAotICAgIDB4NkE5RSwgMHgzOTUwLCAweDZBOUYsIDB4Mzk1MSwgMHg2QUEwLCAweDE0QkMsIDB4NkFBMSwgMHg0NUNBLAotICAgIDB4NkFBMiwgMHgxNEJFLCAweDZBQTMsIDB4MTRCRiwgMHg2QUE1LCAweDQyMTYsIDB4NkFBQSwgMHgxNENCLAotICAgIDB4NkFBQiwgMHg0NUNDLCAweDZBQUMsIDB4MTRDNywgMHg2QUFFLCAweDE0NTAsIDB4NkFBRiwgMHg0QzBFLAotICAgIDB4NkFCMywgMHgxNEM2LCAweDZBQjgsIDB4MTRDNSwgMHg2QUJCLCAweDE0QzIsIDB4NkFCRCwgMHg0NUNELAotICAgIDB4NkFDMSwgMHgxNEFCLCAweDZBQzIsIDB4MTRDNCwgMHg2QUMzLCAweDE0QzMsIDB4NkFDNiwgMHg0NUNFLAotICAgIDB4NkFDOCwgMHg0QzBGLCAweDZBQzksIDB4NEMxMCwgMHg2QUQwLCAweDQ1RDAsIDB4NkFEMSwgMHgxNEM5LAotICAgIDB4NkFEMywgMHgwRkNDLCAweDZBRDQsIDB4NDVDRiwgMHg2QURBLCAweDE0Q0MsIDB4NkFEQiwgMHgwNkYzLAotICAgIDB4NkFEQywgMHgzOTUyLCAweDZBREQsIDB4NDVEMSwgMHg2QURFLCAweDE0QzgsIDB4NkFERiwgMHgxNENBLAotICAgIDB4NkFFMiwgMHgyMTNCLCAweDZBRTQsIDB4MjEzQywgMHg2QUU3LCAweDM5NTMsIDB4NkFFOCwgMHgwRDNCLAotICAgIDB4NkFFQSwgMHgxNENELCAweDZBRUMsIDB4Mzk1NCwgMHg2QUYxLCAweDQ1RDQsIDB4NkFGMiwgMHg0NUQ1LAotICAgIDB4NkFGMywgMHg0NUQ2LCAweDZBRjgsIDB4NEVCOCwgMHg2QUZBLCAweDE0RDEsIDB4NkFGQiwgMHgxNENFLAotICAgIDB4NkFGRCwgMHg0NUQ3LCAweDZCMDMsIDB4NEMxMSwgMHg2QjA0LCAweDBGNUQsIDB4NkIwNSwgMHgxNENGLAotICAgIDB4NkIwQSwgMHgxNDlGLCAweDZCMEIsIDB4NDVEOSwgMHg2QjBGLCAweDQ1REEsIDB4NkIxMCwgMHg0NURCLAotICAgIDB4NkIxMSwgMHg0NURDLCAweDZCMTIsIDB4MTREMiwgMHg2QjE2LCAweDE0RDMsIDB4NkIxNywgMHg0NURFLAotICAgIDB4NkIxQiwgMHg0MjE4LCAweDZCMUQsIDB4MDRENywgMHg2QjFFLCAweDM5NTUsIDB4NkIxRiwgMHgxNEQ1LAotICAgIDB4NkIyMCwgMHgwNzNELCAweDZCMjEsIDB4MDhDRCwgMHg2QjIzLCAweDA2Q0QsIDB4NkIyNCwgMHgzOTU2LAotICAgIDB4NkIyNywgMHgwNTI0LCAweDZCMkMsIDB4NDIxOSwgMHg2QjJGLCAweDQ1RTAsIDB4NkIzMiwgMHgwRjQ5LAotICAgIDB4NkIzNSwgMHgzOTU3LCAweDZCMzcsIDB4MTRENywgMHg2QjM4LCAweDE0RDYsIDB4NkIzOSwgMHgxNEQ5LAotICAgIDB4NkIzQSwgMHgwNjU3LCAweDZCM0IsIDB4NEMxMiwgMHg2QjNELCAweDA2Q0UsIDB4NkIzRSwgMHgwNUZBLAotICAgIDB4NkIzRiwgMHg0QzEzLCAweDZCNDMsIDB4MTREQywgMHg2QjQ2LCAweDM5NTgsIDB4NkI0NywgMHgxNERCLAotICAgIDB4NkI0OSwgMHgxNERELCAweDZCNEEsIDB4NDVFMSwgMHg2QjRDLCAweDA1NEUsIDB4NkI0RSwgMHgwQjc1LAotICAgIDB4NkI1MCwgMHgxNERFLCAweDZCNTMsIDB4MDVGQiwgMHg2QjU0LCAweDE0RTAsIDB4NkI1NiwgMHgzOTU5LAotICAgIDB4NkI1OCwgMHg0NUUyLCAweDZCNTksIDB4MTRERiwgMHg2QjVCLCAweDE0RTEsIDB4NkI1RiwgMHgxNEUyLAotICAgIDB4NkI2MCwgMHgzOTVBLCAweDZCNjEsIDB4MTRFMywgMHg2QjYyLCAweDA4QUQsIDB4NkI2MywgMHgwQTU5LAotICAgIDB4NkI2NCwgMHgwODExLCAweDZCNjUsIDB4MzQ0QSwgMHg2QjY2LCAweDBERTIsIDB4NkI2NywgMHg0MjFBLAotICAgIDB4NkI2OSwgMHgwRTMyLCAweDZCNkEsIDB4MEZFQSwgMHg2QjZDLCAweDQ1RTMsIDB4NkI2RiwgMHgwOEMzLAotICAgIDB4NkI3MiwgMHgzNUQ5LCAweDZCNzMsIDB4MDg0MCwgMHg2Qjc0LCAweDBGQkEsIDB4NkI3NSwgMHg0NUU0LAotICAgIDB4NkI3NywgMHgzNDU2LCAweDZCNzgsIDB4MTRFNCwgMHg2Qjc5LCAweDE0RTUsIDB4NkI3QSwgMHg0NUU1LAotICAgIDB4NkI3QiwgMHgwOEFFLCAweDZCN0QsIDB4NEMxNCwgMHg2QjdFLCAweDRDMTUsIDB4NkI3RiwgMHgxNEU2LAotICAgIDB4NkI4MCwgMHgxNEU3LCAweDZCODEsIDB4NDVFNiwgMHg2QjgyLCAweDM5NUIsIDB4NkI4MywgMHgxNEU5LAotICAgIDB4NkI4NCwgMHgxNEU4LCAweDZCODYsIDB4MEU4NiwgMHg2Qjg5LCAweDA5NjgsIDB4NkI4QSwgMHgwOTE4LAotICAgIDB4NkI4QiwgMHgwODkyLCAweDZCOEQsIDB4MTRFQSwgMHg2Qjk1LCAweDE0RUMsIDB4NkI5NiwgMHgwOUU5LAotICAgIDB4NkI5OCwgMHgxNEVCLCAweDZCOUIsIDB4NDVFNywgMHg2QjlFLCAweDE0RUQsIDB4NkJBNCwgMHgxNEVFLAotICAgIDB4NkJBOSwgMHg0MjFCLCAweDZCQUEsIDB4MTRFRiwgMHg2QkFCLCAweDE0RjAsIDB4NkJBRCwgMHg0MjFDLAotICAgIDB4NkJBRSwgMHg0NUU4LCAweDZCQUYsIDB4MTRGMSwgMHg2QkIwLCAweDRDMTYsIDB4NkJCMSwgMHgxNEYzLAotICAgIDB4NkJCMiwgMHgxNEYyLCAweDZCQjMsIDB4MTRGNCwgMHg2QkI0LCAweDA1MjUsIDB4NkJCNSwgMHgwQjg4LAotICAgIDB4NkJCNywgMHgxNEY1LCAweDZCQkEsIDB4MDg3NCwgMHg2QkJCLCAweDA1QUEsIDB4NkJCQywgMHgxNEY2LAotICAgIDB4NkJCRCwgMHg0NUVBLCAweDZCQkUsIDB4Mzk1QywgMHg2QkJGLCAweDBDM0MsIDB4NkJDMCwgMHgxMTlELAotICAgIDB4NkJDNSwgMHgwNjNELCAweDZCQzYsIDB4MTRGNywgMHg2QkM3LCAweDQ1RUIsIDB4NkJDOCwgMHg0NUVDLAotICAgIDB4NkJDOSwgMHg0NUVELCAweDZCQ0IsIDB4MTRGOCwgMHg2QkNDLCAweDM3NDQsIDB4NkJDRCwgMHgwRTNDLAotICAgIDB4NkJDRSwgMHgwRTk2LCAweDZCQ0YsIDB4MzQ0QywgMHg2QkQyLCAweDBDOUYsIDB4NkJEMywgMHgxNEY5LAotICAgIDB4NkJENCwgMHgwRDdBLCAweDZCRDYsIDB4MjEzRCwgMHg2QkQ3LCAweDQyMUQsIDB4NkJEOCwgMHgwRDhGLAotICAgIDB4NkJEQSwgMHg0NUVFLCAweDZCREIsIDB4MEVERiwgMHg2QkRGLCAweDE0RkEsIDB4NkJFMSwgMHgzOTVELAotICAgIDB4NkJFNiwgMHg0NUVGLCAweDZCRTcsIDB4NDVGMCwgMHg2QkVCLCAweDE0RkMsIDB4NkJFQywgMHgxNEZCLAotICAgIDB4NkJFRSwgMHg0NUYxLCAweDZCRUYsIDB4MTRGRSwgMHg2QkYxLCAweDM5NUUsIDB4NkJGMywgMHgxNEZELAotICAgIDB4NkJGNywgMHg0QzE3LCAweDZCRjksIDB4NEMxOCwgMHg2QkZGLCAweDQyMUUsIDB4NkMwMiwgMHg0NUYyLAotICAgIDB4NkMwNCwgMHg0QzE5LCAweDZDMDUsIDB4NDIxRiwgMHg2QzA4LCAweDE1MDAsIDB4NkMwOSwgMHg0QzFBLAotICAgIDB4NkMwQSwgMHg0NUYzLCAweDZDMEQsIDB4NEMxQiwgMHg2QzBFLCAweDQ1RjQsIDB4NkMwRiwgMHgwOEFGLAotICAgIDB4NkMxMCwgMHgzOTVGLCAweDZDMTEsIDB4MEVCRCwgMHg2QzEzLCAweDE1MDEsIDB4NkMxNCwgMHgxNTAyLAotICAgIDB4NkMxNywgMHgwNjNFLCAweDZDMUIsIDB4MTUwMywgMHg2QzIzLCAweDE1MDUsIDB4NkMyNCwgMHgxNTA0LAotICAgIDB4NkMyQywgMHg0QzFDLCAweDZDMzMsIDB4Mzk2MCwgMHg2QzM0LCAweDBBMkIsIDB4NkMzNSwgMHgzOTYxLAotICAgIDB4NkMzNiwgMHg0NUY1LCAweDZDMzcsIDB4MERBQiwgMHg2QzM4LCAweDA0RUMsIDB4NkMzQSwgMHg0RjU1LAotICAgIDB4NkMzRSwgMHgwRDU5LCAweDZDM0YsIDB4MjEzRSwgMHg2QzQwLCAweDBDMTEsIDB4NkM0MSwgMHgwOTRCLAotICAgIDB4NkM0MiwgMHgwNjdCLCAweDZDNEEsIDB4NEMxRCwgMHg2QzRELCAweDQ1RjcsIDB4NkM0RSwgMHgwRDVBLAotICAgIDB4NkM1MCwgMHgwOERBLCAweDZDNTIsIDB4NEMxRSwgMHg2QzU0LCAweDRDMUYsIDB4NkM1NSwgMHgxNTA3LAotICAgIDB4NkM1NywgMHgwNUZDLCAweDZDNTksIDB4Mzk2MywgMHg2QzVBLCAweDA1MUEsIDB4NkM1QiwgMHg0NUY4LAotICAgIDB4NkM1QywgMHgyMTNGLCAweDZDNUQsIDB4MENDQSwgMHg2QzVFLCAweDE1MDYsIDB4NkM1RiwgMHgwN0QwLAotICAgIDB4NkM2MCwgMHgwQjkxLCAweDZDNjIsIDB4MTUwOCwgMHg2QzY3LCAweDQ2MEEsIDB4NkM2OCwgMHgxNTEwLAotICAgIDB4NkM2QSwgMHgxNTA5LCAweDZDNkQsIDB4NDVGOSwgMHg2QzZGLCAweDIxNDEsIDB4NkM3MCwgMHgwQjIxLAotICAgIDB4NkM3MiwgMHgwNjdDLCAweDZDNzMsIDB4MTUxMSwgMHg2Qzc0LCAweDQyMjAsIDB4NkM3NiwgMHgzOTY0LAotICAgIDB4NkM3OSwgMHg0QzIwLCAweDZDN0EsIDB4MDczRSwgMHg2QzdCLCAweDM5NjUsIDB4NkM3RCwgMHgwNjNGLAotICAgIDB4NkM3RSwgMHgxNTBGLCAweDZDODEsIDB4MTUwRCwgMHg2QzgyLCAweDE1MEEsIDB4NkM4MywgMHgwRjRBLAotICAgIDB4NkM4NCwgMHg0NUZBLCAweDZDODUsIDB4Mzk2NiwgMHg2Qzg2LCAweDIxNDAsIDB4NkM4OCwgMHgwQkRDLAotICAgIDB4NkM4OSwgMHg0NUZCLCAweDZDOEMsIDB4MENCMSwgMHg2QzhELCAweDE1MEIsIDB4NkM5MCwgMHgxNTEzLAotICAgIDB4NkM5MiwgMHgxNTEyLCAweDZDOTMsIDB4MDZGOSwgMHg2Qzk0LCAweDQ1RkQsIDB4NkM5NSwgMHgzOTY3LAotICAgIDB4NkM5NiwgMHgwNTJELCAweDZDOTcsIDB4NDVGRSwgMHg2Qzk4LCAweDQyMjEsIDB4NkM5OSwgMHgwODJCLAotICAgIDB4NkM5QSwgMHgxNTBDLCAweDZDOUIsIDB4MTUwRSwgMHg2QzlDLCAweDM5NjgsIDB4NkNBMSwgMHgwRTg1LAotICAgIDB4NkNBMiwgMHgwQjU0LCAweDZDQUEsIDB4Mzc0OSwgMHg2Q0FCLCAweDBFQTUsIDB4NkNBQywgMHg0QzIxLAotICAgIDB4NkNBRCwgMHg0NUZGLCAweDZDQUUsIDB4MTUxQiwgMHg2Q0IxLCAweDE1MUMsIDB4NkNCMywgMHgwNTRGLAotICAgIDB4NkNCNCwgMHg0QzIyLCAweDZDQjgsIDB4MERGOCwgMHg2Q0I5LCAweDBGMDksIDB4NkNCQSwgMHgxNTFFLAotICAgIDB4NkNCQiwgMHgwOENGLCAweDZDQkMsIDB4MDlBQSwgMHg2Q0JELCAweDE1MTcsIDB4NkNCRSwgMHgxNTFELAotICAgIDB4NkNCRiwgMHgwNTBBLCAweDZDQzEsIDB4MDZBRiwgMHg2Q0MyLCAweDQ2MDAsIDB4NkNDNCwgMHgxNTE0LAotICAgIDB4NkNDNSwgMHgxNTE5LCAweDZDQzYsIDB4NDIyMywgMHg2Q0M5LCAweDBBOTgsIDB4NkNDQSwgMHgwRDI3LAotICAgIDB4NkNDQywgMHgwRDdCLCAweDZDRDAsIDB4Mzk2OSwgMHg2Q0QyLCAweDRDMjMsIDB4NkNEMywgMHgxNTE2LAotICAgIDB4NkNENCwgMHgzOTZBLCAweDZDRDUsIDB4MEU0RiwgMHg2Q0Q2LCAweDM5NkIsIDB4NkNENywgMHgxNTE4LAotICAgIDB4NkNEOSwgMHgxNTIxLCAweDZDREEsIDB4MjE0MiwgMHg2Q0RCLCAweDE1MUYsIDB4NkNEQywgMHg0NjAyLAotICAgIDB4NkNERCwgMHgxNTFBLCAweDZDRTAsIDB4Mzk2QywgMHg2Q0UxLCAweDBFNTAsIDB4NkNFMiwgMHgwQ0ZFLAotICAgIDB4NkNFMywgMHgwNjdELCAweDZDRTUsIDB4MEMxRiwgMHg2Q0U4LCAweDBCQUIsIDB4NkNFOSwgMHg0NjAzLAotICAgIDB4NkNFQSwgMHgxNTIyLCAweDZDRUIsIDB4Mzk2RCwgMHg2Q0VDLCAweDM5NkUsIDB4NkNFRCwgMHg0NjA0LAotICAgIDB4NkNFRSwgMHgzOTZGLCAweDZDRUYsIDB4MTUyMCwgMHg2Q0YwLCAweDBCMzksIDB4NkNGMSwgMHgxNTE1LAotICAgIDB4NkNGMywgMHgwNEVELCAweDZDRkIsIDB4NDIyMiwgMHg2RDAwLCAweDQ2MDYsIDB4NkQwMSwgMHgzQzM1LAotICAgIDB4NkQwNCwgMHgyMTQzLCAweDZEMEEsIDB4Mzk3MCwgMHg2RDBCLCAweDBGMzgsIDB4NkQwQywgMHgxNTJELAotICAgIDB4NkQwRSwgMHgzOTcxLCAweDZEMTEsIDB4Mzk3MiwgMHg2RDEyLCAweDE1MkMsIDB4NkQxNywgMHgwQTlBLAotICAgIDB4NkQxOSwgMHgxNTI5LCAweDZEMUIsIDB4MEY1NiwgMHg2RDFFLCAweDBDOEUsIDB4NkQxRiwgMHgxNTIzLAotICAgIDB4NkQyNCwgMHg0NjA3LCAweDZEMjUsIDB4MEJFMSwgMHg2RDI2LCAweDQ2MDgsIDB4NkQyNywgMHg0NjA5LAotICAgIDB4NkQyOSwgMHgwNEVFLCAweDZEMkEsIDB4MDdEMSwgMHg2RDJCLCAweDE1MjYsIDB4NkQyRSwgMHgzOTczLAotICAgIDB4NkQyRiwgMHg0NjBCLCAweDZEMzEsIDB4NDIyNCwgMHg2RDMyLCAweDA5MzEsIDB4NkQzMywgMHgxNTJCLAotICAgIDB4NkQzNCwgMHg0NjFFLCAweDZEMzUsIDB4MTUyQSwgMHg2RDM2LCAweDE1MjUsIDB4NkQzOCwgMHgxNTI4LAotICAgIDB4NkQzOSwgMHg0MjI1LCAweDZEM0IsIDB4MDVDNiwgMHg2RDNDLCAweDQ2MEMsIDB4NkQzRCwgMHgxNTI3LAotICAgIDB4NkQzRSwgMHgwQ0ZGLCAweDZEM0YsIDB4NDIyNiwgMHg2RDQxLCAweDBGNzYsIDB4NkQ0NCwgMHgwOURDLAotICAgIDB4NkQ0NSwgMHgwQTk5LCAweDZENTcsIDB4Mzk3NCwgMHg2RDU4LCAweDQyMjcsIDB4NkQ1OSwgMHgxNTMzLAotICAgIDB4NkQ1QSwgMHgxNTMxLCAweDZENUIsIDB4NDYwRCwgMHg2RDVDLCAweDBEQkYsIDB4NkQ1RSwgMHgzOTc1LAotICAgIDB4NkQ2MCwgMHg0NjBFLCAweDZENjEsIDB4NEMyNCwgMHg2RDYzLCAweDE1MkUsIDB4NkQ2NCwgMHgxNTMwLAotICAgIDB4NkQ2NSwgMHgzOTc2LCAweDZENjYsIDB4MDREQywgMHg2RDY5LCAweDA3RDIsIDB4NkQ2QSwgMHgwRkQ4LAotICAgIDB4NkQ2QywgMHgwNTlCLCAweDZENkUsIDB4MERENCwgMHg2RDZGLCAweDIxNDUsIDB4NkQ3MCwgMHg0NjBGLAotICAgIDB4NkQ3NCwgMHgwRjRCLCAweDZENzcsIDB4MDU4MiwgMHg2RDc4LCAweDBBMDEsIDB4NkQ3OSwgMHgxNTMyLAotICAgIDB4NkQ3QywgMHg0QzI1LCAweDZEODAsIDB4NDYxMCwgMHg2RDgxLCAweDQ2MTEsIDB4NkQ4MiwgMHgzOTc3LAotICAgIDB4NkQ4NSwgMHgxNTM3LCAweDZEODcsIDB4MjE0NCwgMHg2RDg4LCAweDA5QUIsIDB4NkQ4OSwgMHgzNDJBLAotICAgIDB4NkQ4QSwgMHg0NjEyLCAweDZEOEMsIDB4MEYxQSwgMHg2RDhELCAweDQ2MTMsIDB4NkQ4RSwgMHgxNTM0LAotICAgIDB4NkQ5MSwgMHg0NjE0LCAweDZEOTMsIDB4MTUyRiwgMHg2RDk0LCAweDQyMjgsIDB4NkQ5NSwgMHgxNTM1LAotICAgIDB4NkQ5NiwgMHgyMTQ2LCAweDZEOTgsIDB4NDYxNSwgMHg2RDk5LCAweDBGQTYsIDB4NkQ5QiwgMHgwQzZELAotICAgIDB4NkQ5QywgMHgwQzlBLCAweDZEQUEsIDB4NDIyOSwgMHg2REFCLCAweDQ2MUEsIDB4NkRBQywgMHgyMTQ3LAotICAgIDB4NkRBRSwgMHg0NjFCLCAweDZEQUYsIDB4MDU5NCwgMHg2REIyLCAweDA0RjcsIDB4NkRCNCwgMHg0NjFDLAotICAgIDB4NkRCNSwgMHgxNTNCLCAweDZEQjgsIDB4MTUzRSwgMHg2REI5LCAweDRDMjYsIDB4NkRCQywgMHgwRjhCLAotICAgIDB4NkRCRiwgMHgzOTc4LCAweDZEQzAsIDB4MEY0RSwgMHg2REMyLCAweDQ2MUQsIDB4NkRDNCwgMHgzOTc5LAotICAgIDB4NkRDNSwgMHgxNTQ1LCAweDZEQzYsIDB4MTUzRiwgMHg2REM3LCAweDE1M0MsIDB4NkRDOCwgMHg0NjFGLAotICAgIDB4NkRDQSwgMHgzOTdBLCAweDZEQ0IsIDB4MEY5QywgMHg2RENDLCAweDE1NDIsIDB4NkRDRSwgMHg0NjIwLAotICAgIDB4NkRDRiwgMHgyMTQ4LCAweDZERDAsIDB4M0MzNiwgMHg2REQxLCAweDA5NTQsIDB4NkREMiwgMHgxNTQ0LAotICAgIDB4NkRENSwgMHgxNTQ5LCAweDZERDYsIDB4Mzk3QiwgMHg2REQ4LCAweDBDNkIsIDB4NkREOSwgMHgxNTQ3LAotICAgIDB4NkREQSwgMHgzNDUzLCAweDZEREIsIDB4NDIyQSwgMHg2RERELCAweDQyMkIsIDB4NkRERSwgMHgxNTQxLAotICAgIDB4NkRERiwgMHg0NjIxLCAweDZERTEsIDB4MEI3NiwgMHg2REU0LCAweDE1NDgsIDB4NkRFNiwgMHgxNTNELAotICAgIDB4NkRFOCwgMHgxNTQzLCAweDZERTksIDB4Mzk3QywgMHg2REVBLCAweDE1NEEsIDB4NkRFQiwgMHgwNEMwLAotICAgIDB4NkRFQywgMHgxNTQwLCAweDZERUUsIDB4MTU0QiwgMHg2REYwLCAweDRDMjcsIDB4NkRGMSwgMHgwQTAyLAotICAgIDB4NkRGMiwgMHgyMTRBLCAweDZERjMsIDB4MDk2OSwgMHg2REY1LCAweDBERjUsIDB4NkRGNiwgMHg0NjIyLAotICAgIDB4NkRGNywgMHgwODFFLCAweDZERjgsIDB4MjE0OSwgMHg2REY5LCAweDE1MzgsIDB4NkRGQSwgMHgxNTQ2LAotICAgIDB4NkRGQiwgMHgwQzM0LCAweDZERkMsIDB4MjE0QiwgMHg2RTA1LCAweDBBNUEsIDB4NkUwNywgMHgwNUM3LAotICAgIDB4NkUwOCwgMHgwODQxLCAweDZFMDksIDB4MDlBQywgMHg2RTBBLCAweDE1M0EsIDB4NkUwQiwgMHgwOTRDLAotICAgIDB4NkUxMywgMHgwNzIyLCAweDZFMTUsIDB4MTUzOSwgMHg2RTE3LCAweDM3NDYsIDB4NkUxOSwgMHgxNTRGLAotICAgIDB4NkUxQSwgMHgwOTc3LCAweDZFMUIsIDB4MDc2RSwgMHg2RTFELCAweDE1NUUsIDB4NkUxRSwgMHg0NjI0LAotICAgIDB4NkUxRiwgMHgxNTU4LCAweDZFMjAsIDB4MDY4RSwgMHg2RTIxLCAweDBDNDksIDB4NkUyMiwgMHgzOTdELAotICAgIDB4NkUyMywgMHgxNTUzLCAweDZFMjQsIDB4MTU1QywgMHg2RTI1LCAweDA0NzMsIDB4NkUyNiwgMHgwNEQ0LAotICAgIDB4NkUyNywgMHgyMTRFLCAweDZFMjksIDB4MDUzOSwgMHg2RTJCLCAweDE1NTUsIDB4NkUyQywgMHgwQjBDLAotICAgIDB4NkUyRCwgMHgxNTRDLCAweDZFMkUsIDB4MTU0RSwgMHg2RTJGLCAweDA3RDMsIDB4NkUzMiwgMHg0NjI2LAotICAgIDB4NkUzNCwgMHgzNDEyLCAweDZFMzYsIDB4NDYyMywgMHg2RTM4LCAweDE1NUYsIDB4NkUzOSwgMHgyMTRDLAotICAgIDB4NkUzQSwgMHgxNTVBLCAweDZFM0MsIDB4MjE0RiwgMHg2RTNFLCAweDE1NTIsIDB4NkU0MiwgMHgzQzM3LAotICAgIDB4NkU0MywgMHgxNTU5LCAweDZFNDQsIDB4NDIyQywgMHg2RTQ1LCAweDRDMjgsIDB4NkU0OCwgMHg0NjI3LAotICAgIDB4NkU0OSwgMHg0NjI4LCAweDZFNEEsIDB4MEVCNywgMHg2RTRCLCAweDQ2MjksIDB4NkU0QywgMHg0NjJBLAotICAgIDB4NkU0RCwgMHgxNTU3LCAweDZFNEUsIDB4MTU1QiwgMHg2RTRGLCAweDQ2MkIsIDB4NkU1MSwgMHgzOTdFLAotICAgIDB4NkU1MywgMHg0NjJDLCAweDZFNTQsIDB4NDYyRCwgMHg2RTU2LCAweDA3ODQsIDB4NkU1NywgMHg0NjJFLAotICAgIDB4NkU1OCwgMHgwOUFELCAweDZFNUIsIDB4MEI3NywgMHg2RTVDLCAweDIxNEQsIDB4NkU1RSwgMHg0MjJELAotICAgIDB4NkU1RiwgMHgxNTUxLCAweDZFNjMsIDB4NDYyRiwgMHg2RTY3LCAweDBGMTksIDB4NkU2QiwgMHgxNTU0LAotICAgIDB4NkU2RSwgMHgxNTRELCAweDZFNkYsIDB4MEM2QywgMHg2RTcyLCAweDE1NTAsIDB4NkU3MywgMHg0QzI5LAotICAgIDB4NkU3NiwgMHgxNTU2LCAweDZFN0IsIDB4NEMyQSwgMHg2RTdELCAweDRDMkIsIDB4NkU3RSwgMHgwRkY3LAotICAgIDB4NkU3RiwgMHgwOEVBLCAweDZFODAsIDB4MEVBQywgMHg2RTgyLCAweDE1NjAsIDB4NkU4OSwgMHg0QzJDLAotICAgIDB4NkU4QywgMHgwRDQyLCAweDZFOEYsIDB4MTU2QywgMHg2RTkwLCAweDA3NkYsIDB4NkU5MywgMHg0NjMxLAotICAgIDB4NkU5NiwgMHgwOTZBLCAweDZFOTgsIDB4MTU2MiwgMHg2RTlDLCAweDBGNzcsIDB4NkU5RCwgMHgwN0Q0LAotICAgIDB4NkU5RiwgMHgxNTZGLCAweDZFQTIsIDB4MDRCMiwgMHg2RUE1LCAweDE1NkQsIDB4NkVBNywgMHg0NjMyLAotICAgIDB4NkVBQSwgMHgxNTYxLCAweDZFQUIsIDB4MzQwQywgMHg2RUFGLCAweDE1NjcsIDB4NkVCMSwgMHg0MjJFLAotICAgIDB4NkVCMiwgMHgxNTY5LCAweDZFQjQsIDB4NDYzMywgMHg2RUI2LCAweDBGMzksIDB4NkVCNywgMHgxNTY0LAotICAgIDB4NkVCQSwgMHgwQzI4LCAweDZFQkMsIDB4NEMyRCwgMHg2RUJELCAweDE1NjYsIDB4NkVCRiwgMHgyMTUwLAotICAgIDB4NkVDMSwgMHg0MjJGLCAweDZFQzIsIDB4MTU2RSwgMHg2RUMzLCAweDQ2MzQsIDB4NkVDNCwgMHgxNTY4LAotICAgIDB4NkVDNSwgMHgwRUQzLCAweDZFQzcsIDB4Mzk3RiwgMHg2RUM5LCAweDE1NjMsIDB4NkVDQSwgMHgzOTgwLAotICAgIDB4NkVDQiwgMHgwOENFLCAweDZFQ0MsIDB4MTU3QiwgMHg2RUNFLCAweDM5ODEsIDB4NkVEMSwgMHgwNUM4LAotICAgIDB4NkVEMywgMHgxNTY1LCAweDZFRDQsIDB4MTU2QSwgMHg2RUQ1LCAweDE1NkIsIDB4NkVEOSwgMHgzQzM4LAotICAgIDB4NkVEQSwgMHg0QzJFLCAweDZFREIsIDB4NEMyRiwgMHg2RURELCAweDBCNEMsIDB4NkVERSwgMHgwQjNBLAotICAgIDB4NkVFNiwgMHgzQzI0LCAweDZFRUIsIDB4NDYzNiwgMHg2RUVDLCAweDE1NzMsIDB4NkVFRiwgMHgxNTc5LAotICAgIDB4NkVGMiwgMHgxNTc3LCAweDZFRjQsIDB4MEMyMywgMHg2RUY3LCAweDE1N0UsIDB4NkVGOCwgMHgxNTc0LAotICAgIDB4NkVGOSwgMHg0NjM3LCAweDZFRkIsIDB4NDYzOCwgMHg2RUZELCAweDM5ODIsIDB4NkVGRSwgMHgxNTc1LAotICAgIDB4NkVGRiwgMHgxNTVELCAweDZGMDEsIDB4MDY5MywgMHg2RjAyLCAweDBEQUMsIDB4NkYwNiwgMHgwOEVCLAotICAgIDB4NkYwOSwgMHgwODA5LCAweDZGMEEsIDB4NDYzOSwgMHg2RjBDLCAweDQ2M0EsIDB4NkYwRiwgMHgwRkQ5LAotICAgIDB4NkYxMCwgMHg0MjMwLCAweDZGMTEsIDB4MTU3MSwgMHg2RjEzLCAweDE1N0QsIDB4NkYxNCwgMHgwNTBCLAotICAgIDB4NkYxNSwgMHgwQUU4LCAweDZGMTgsIDB4NDYzQiwgMHg2RjFBLCAweDM5ODMsIDB4NkYyMCwgMHgwRDJGLAotICAgIDB4NkYyMiwgMHgwNUZELCAweDZGMjMsIDB4MEZDMiwgMHg2RjI1LCAweDQ2M0MsIDB4NkYyNiwgMHg0QzMwLAotICAgIDB4NkYyOSwgMHg0QzMxLCAweDZGMkEsIDB4Mzk4NCwgMHg2RjJCLCAweDBFQUQsIDB4NkYyQywgMHgwQkVFLAotICAgIDB4NkYyRiwgMHgzOTg1LCAweDZGMzAsIDB4NEMzMiwgMHg2RjMxLCAweDE1NzgsIDB4NkYzMiwgMHgxNTdBLAotICAgIDB4NkYzMywgMHgzOTg2LCAweDZGMzUsIDB4NDYzNSwgMHg2RjM2LCAweDQ2M0QsIDB4NkYzOCwgMHgwQUI0LAotICAgIDB4NkYzQywgMHg0NjNFLCAweDZGM0UsIDB4MTU3QywgMHg2RjNGLCAweDE1NzYsIDB4NkY0MSwgMHgxNTcwLAotICAgIDB4NkY0NSwgMHgwNUZGLCAweDZGNTEsIDB4MUU2MCwgMHg2RjUyLCAweDQ2NDAsIDB4NkY1NCwgMHgwNzNGLAotICAgIDB4NkY1NywgMHg0NjQxLCAweDZGNTgsIDB4MTU4QSwgMHg2RjU5LCAweDQyMzEsIDB4NkY1QSwgMHgzOTg3LAotICAgIDB4NkY1QiwgMHgxNTg1LCAweDZGNUMsIDB4MEE5QywgMHg2RjVFLCAweDM5ODgsIDB4NkY1RiwgMHgwNUMxLAotICAgIDB4NkY2MCwgMHg0NjQyLCAweDZGNjEsIDB4NDIzMiwgMHg2RjYyLCAweDM5ODksIDB4NkY2NCwgMHgwOTZCLAotICAgIDB4NkY2NiwgMHgxNThFLCAweDZGNjgsIDB4NDY0MywgMHg2RjZELCAweDE1ODcsIDB4NkY2RSwgMHgwQkM4LAotICAgIDB4NkY2RiwgMHgxNTg0LCAweDZGNzAsIDB4MEJGNSwgMHg2Rjc0LCAweDE1QTcsIDB4NkY3OCwgMHgxNTgxLAotICAgIDB4NkY3QSwgMHgxNTgwLCAweDZGN0MsIDB4MTU4OSwgMHg2RjdELCAweDM5OEEsIDB4NkY3RSwgMHg0MjMzLAotICAgIDB4NkY4MCwgMHgxNTgzLCAweDZGODEsIDB4MTU4MiwgMHg2RjgyLCAweDE1ODgsIDB4NkY4NCwgMHgwQTQ1LAotICAgIDB4NkY4NiwgMHgxNTdGLCAweDZGODcsIDB4NEMzMywgMHg2Rjg4LCAweDIxNTEsIDB4NkY4QiwgMHgzOThCLAotICAgIDB4NkY4QywgMHg0MjM0LCAweDZGOEQsIDB4Mzk4QywgMHg2RjhFLCAweDE1OEIsIDB4NkY5MCwgMHg0NjQ0LAotICAgIDB4NkY5MSwgMHgxNThDLCAweDZGOTIsIDB4Mzk4RCwgMHg2Rjk0LCAweDM5OEUsIDB4NkY5NiwgMHg0NjQ1LAotICAgIDB4NkY5NywgMHgwNUZFLCAweDZGOTgsIDB4MzYzQywgMHg2RjlBLCAweDM5OEYsIDB4NkY5RCwgMHg0QzM0LAotICAgIDB4NkY5RiwgMHg0NjQ3LCAweDZGQTAsIDB4NDIzNSwgMHg2RkExLCAweDE1OTEsIDB4NkZBMywgMHgxNTkwLAotICAgIDB4NkZBNCwgMHgxNTkyLCAweDZGQTUsIDB4NDY0OCwgMHg2RkE3LCAweDM5OTAsIDB4NkZBOCwgMHgzOTkxLAotICAgIDB4NkZBQSwgMHgxNTk1LCAweDZGQUUsIDB4NEMzNSwgMHg2RkFGLCAweDQ2NDksIDB4NkZCMSwgMHgwQzNELAotICAgIDB4NkZCMywgMHgxNThGLCAweDZGQjUsIDB4MjE1MiwgMHg2RkI2LCAweDM5OTIsIDB4NkZCNywgMHg0QzM2LAotICAgIDB4NkZCOSwgMHgxNTkzLCAweDZGQkMsIDB4NDIzNiwgMHg2RkJFLCAweDQ2NDYsIDB4NkZDMCwgMHgwNzM5LAotICAgIDB4NkZDMSwgMHgwQjU5LCAweDZGQzIsIDB4MTU4RCwgMHg2RkMzLCAweDBDRjEsIDB4NkZDNiwgMHgxNTk0LAotICAgIDB4NkZDNywgMHg0MjM3LCAweDZGQzgsIDB4NDY0QiwgMHg2RkM5LCAweDQ2NEMsIDB4NkZDQSwgMHg0MjM4LAotICAgIDB4NkZENCwgMHgxNTk5LCAweDZGRDUsIDB4MTU5NywgMHg2RkQ4LCAweDE1OUEsIDB4NkZEQSwgMHgzOTkzLAotICAgIDB4NkZEQiwgMHgxNTlELCAweDZGREUsIDB4Mzk5NCwgMHg2RkRGLCAweDE1OTYsIDB4NkZFMCwgMHgwN0ZDLAotICAgIDB4NkZFMSwgMHgwQ0RFLCAweDZGRTQsIDB4MTUzNiwgMHg2RkU5LCAweDQ2NEQsIDB4NkZFQiwgMHgwRjVFLAotICAgIDB4NkZFQywgMHgxNTk4LCAweDZGRUUsIDB4MTU5QywgMHg2RkVGLCAweDBCNTUsIDB4NkZGMCwgMHg0MjM5LAotICAgIDB4NkZGMSwgMHgxNTlCLCAweDZGRjMsIDB4MTU4NiwgMHg2RkY1LCAweDIxNTMsIDB4NkZGNiwgMHgxQkE0LAotICAgIDB4NkZGOSwgMHgzQzIzLCAweDZGRkEsIDB4MTVBMCwgMHg2RkZDLCAweDQ2NEYsIDB4NkZGRSwgMHgxNUE0LAotICAgIDB4NzAwMCwgMHg0NjUwLCAweDcwMDEsIDB4MTVBMiwgMHg3MDA1LCAweDIxNTQsIDB4NzAwNiwgMHgxRTUwLAotICAgIDB4NzAwNywgMHgyMTU1LCAweDcwMDksIDB4MTU5RSwgMHg3MDBBLCAweDQ2NTEsIDB4NzAwQiwgMHgxNTlGLAotICAgIDB4NzAwRCwgMHg0QzM3LCAweDcwMEYsIDB4MTVBMywgMHg3MDExLCAweDE1QTEsIDB4NzAxNSwgMHgwREMwLAotICAgIDB4NzAxOCwgMHgxNUE5LCAweDcwMUEsIDB4MTVBNiwgMHg3MDFCLCAweDE1QTUsIDB4NzAxRCwgMHgxNUE4LAotICAgIDB4NzAxRSwgMHgwQ0FDLCAweDcwMUYsIDB4MTVBQSwgMHg3MDIwLCAweDRDMzgsIDB4NzAyMywgMHg0NjUyLAotICAgIDB4NzAyNiwgMHgwQkIzLCAweDcwMjcsIDB4MEI0RCwgMHg3MDI4LCAweDIxNTYsIDB4NzAyQywgMHgwQTQ5LAotICAgIDB4NzAzMCwgMHgxNUFCLCAweDcwMzIsIDB4MTVBRCwgMHg3MDM5LCAweDM5OTYsIDB4NzAzQSwgMHg0NjU0LAotICAgIDB4NzAzQywgMHgzOTk3LCAweDcwM0UsIDB4MTVBQywgMHg3MDQzLCAweDQ2NTUsIDB4NzA0NywgMHg0NjU2LAotICAgIDB4NzA0OSwgMHg0QzM5LCAweDcwNEEsIDB4NEY1MiwgMHg3MDRCLCAweDQ2NTcsIDB4NzA0QywgMHgxNTcyLAotICAgIDB4NzA0RSwgMHg0MjNBLCAweDcwNTEsIDB4MTVBRSwgMHg3MDU0LCAweDM5OTksIDB4NzA1OCwgMHgwQ0JGLAotICAgIDB4NzA1RCwgMHgzOTlBLCAweDcwNUUsIDB4Mzk5QiwgMHg3MDYzLCAweDE1QUYsIDB4NzA2NCwgMHgzOTlDLAotICAgIDB4NzA2NSwgMHg0NjU5LCAweDcwNjksIDB4NDY1QSwgMHg3MDZCLCAweDA1NTAsIDB4NzA2QywgMHgzOTlELAotICAgIDB4NzA2RSwgMHg0NjVCLCAweDcwNkYsIDB4MEM2RSwgMHg3MDcwLCAweDA1ODMsIDB4NzA3NSwgMHg0MjNCLAotICAgIDB4NzA3NiwgMHg0NjVDLCAweDcwNzgsIDB4MDY3RSwgMHg3MDdDLCAweDA5MEEsIDB4NzA3RCwgMHgwODQyLAotICAgIDB4NzA3RSwgMHgzOTlFLCAweDcwODEsIDB4Mzk5RiwgMHg3MDg1LCAweDIxNTcsIDB4NzA4NiwgMHg0NjVELAotICAgIDB4NzA4OSwgMHgwRkNELCAweDcwOEEsIDB4MEEyQywgMHg3MDhFLCAweDA1MEMsIDB4NzA5MiwgMHgxNUIxLAotICAgIDB4NzA5NSwgMHgzOUEwLCAweDcwOTcsIDB4NDY1RSwgMHg3MDk4LCAweDRDM0EsIDB4NzA5OSwgMHgxNUIwLAotICAgIDB4NzA5RiwgMHg0NjYwLCAweDcwQTQsIDB4NDIzQywgMHg3MEFCLCAweDIxNTgsIDB4NzBBQywgMHgxNUI0LAotICAgIDB4NzBBRCwgMHgwQjc4LCAweDcwQUUsIDB4MTVCNywgMHg3MEFGLCAweDE1QjIsIDB4NzBCMCwgMHg0QzNCLAotICAgIDB4NzBCMSwgMHg0NjYxLCAweDcwQjMsIDB4MTVCNiwgMHg3MEI3LCAweDM5QTEsIDB4NzBCOCwgMHgxNUI1LAotICAgIDB4NzBCOSwgMHgwQzNBLCAweDcwQkEsIDB4MDQ5RCwgMHg3MEJCLCAweDIwQUQsIDB4NzBDOCwgMHgwRkJELAotICAgIDB4NzBDQSwgMHg0NjY0LCAweDcwQ0IsIDB4MTVCOSwgMHg3MENGLCAweDA0Q0EsIDB4NzBEMSwgMHg0NjY1LAotICAgIDB4NzBEMywgMHgzOUEyLCAweDcwRDQsIDB4MzlBMywgMHg3MEQ1LCAweDRDM0MsIDB4NzBENiwgMHg0QzNELAotICAgIDB4NzBEOCwgMHgzOUE0LCAweDcwRDksIDB4MTVCQiwgMHg3MERDLCAweDM5QTUsIDB4NzBERCwgMHgxNUJBLAotICAgIDB4NzBERiwgMHgxNUI4LCAweDcwRTQsIDB4NDIzRCwgMHg3MEVDLCAweDQ2NjMsIDB4NzBGMSwgMHgxNUIzLAotICAgIDB4NzBGOSwgMHgwRTUxLCAweDcwRkQsIDB4MTVCRCwgMHg3MTAzLCAweDQ2NjYsIDB4NzEwNCwgMHgyMTVBLAotICAgIDB4NzEwNiwgMHg0NjY3LCAweDcxMDcsIDB4MzlBNiwgMHg3MTA4LCAweDQ2NjgsIDB4NzEwOSwgMHgxNUJDLAotICAgIDB4NzEwQywgMHg0NjY5LCAweDcxMEYsIDB4MjE1OSwgMHg3MTE0LCAweDA1MEQsIDB4NzExOSwgMHgxNUJGLAotICAgIDB4NzExQSwgMHgwRTAyLCAweDcxMUMsIDB4MTVCRSwgMHg3MTFFLCAweDQyM0YsIDB4NzEyMCwgMHgzOUE3LAotICAgIDB4NzEyMSwgMHgwRUMxLCAweDcxMjYsIDB4MDlBRiwgMHg3MTJCLCAweDQyM0UsIDB4NzEyRSwgMHg0MjQwLAotICAgIDB4NzEyRiwgMHg0NjZCLCAweDcxMzAsIDB4MUREQywgMHg3MTMxLCAweDM5QTgsIDB4NzEzNiwgMHgwQUI1LAotICAgIDB4NzEzQywgMHgwOUFFLCAweDcxNDUsIDB4NEMzRSwgMHg3MTQ2LCAweDIxNUMsIDB4NzE0NywgMHgyMTVELAotICAgIDB4NzE0OSwgMHgwRkMzLCAweDcxNEEsIDB4MzlBOSwgMHg3MTRDLCAweDE1QzUsIDB4NzE0RSwgMHgwQTlELAotICAgIDB4NzE1MCwgMHg0NjZDLCAweDcxNTEsIDB4NDI0MSwgMHg3MTUyLCAweDM5QUEsIDB4NzE1MywgMHg0NjZELAotICAgIDB4NzE1NSwgMHgxNUMxLCAweDcxNTYsIDB4MTVDNiwgMHg3MTU5LCAweDA1MEUsIDB4NzE1QywgMHgyMTVCLAotICAgIDB4NzE1RSwgMHg0NjZFLCAweDcxNjAsIDB4MzlBQiwgMHg3MTYyLCAweDE1QzQsIDB4NzE2NCwgMHgwRDE3LAotICAgIDB4NzE2NSwgMHgxNUMwLCAweDcxNjYsIDB4MTVDMywgMHg3MTY3LCAweDA5QjAsIDB4NzE2OCwgMHg0MjQyLAotICAgIDB4NzE2OSwgMHgwRDY1LCAweDcxNkMsIDB4MTVDNywgMHg3MTZFLCAweDA4RkQsIDB4NzE3OSwgMHgzOUFDLAotICAgIDB4NzE3RCwgMHgwQTlFLCAweDcxODAsIDB4NDY3MSwgMHg3MTg0LCAweDE1Q0EsIDB4NzE4NSwgMHg0MjQzLAotICAgIDB4NzE4NywgMHg0MjQ0LCAweDcxODgsIDB4MTVDMiwgMHg3MThBLCAweDA2RkQsIDB4NzE4RiwgMHgxNUM4LAotICAgIDB4NzE5MiwgMHgzOUFELCAweDcxOTQsIDB4MEYzQSwgMHg3MTk1LCAweDE1Q0IsIDB4NzE5NiwgMHg0NjcwLAotICAgIDB4NzE5OSwgMHgyMDVELCAweDcxOUIsIDB4NDY3MiwgMHg3MTlGLCAweDA5NTksIDB4NzFBMCwgMHg0NjczLAotICAgIDB4NzFBMiwgMHg0Njc0LCAweDcxQTgsIDB4MTVDQywgMHg3MUFDLCAweDE1Q0QsIDB4NzFBRSwgMHg0Njc1LAotICAgIDB4NzFBRiwgMHg0Njc2LCAweDcxQjEsIDB4MENFNCwgMHg3MUIyLCAweDRDM0YsIDB4NzFCMywgMHgzQzI1LAotICAgIDB4NzFCOSwgMHgxNUNGLCAweDcxQkEsIDB4NDI0NSwgMHg3MUJFLCAweDE1RDAsIDB4NzFDMSwgMHgyMTVGLAotICAgIDB4NzFDMywgMHgwQ0U5LCAweDcxQzQsIDB4NDI0NiwgMHg3MUM4LCAweDBDNkYsIDB4NzFDOSwgMHgxNUQyLAotICAgIDB4NzFDQiwgMHgzOUFGLCAweDcxQ0UsIDB4MTVENCwgMHg3MUQwLCAweDBGOUQsIDB4NzFEMiwgMHgxNUQxLAotICAgIDB4NzFEMywgMHgzOUIwLCAweDcxRDQsIDB4MTVEMywgMHg3MUQ1LCAweDA1MEYsIDB4NzFENiwgMHgzOUIxLAotICAgIDB4NzFENywgMHgxNUNFLCAweDcxRDksIDB4NDY3OCwgMHg3MURDLCAweDQ2NzksIDB4NzFERiwgMHgxMTRFLAotICAgIDB4NzFFMCwgMHgxNUQ1LCAweDcxRTUsIDB4MEFFOSwgMHg3MUU2LCAweDA4ODYsIDB4NzFFNywgMHgxNUQ3LAotICAgIDB4NzFFQywgMHgxNUQ2LCAweDcxRUQsIDB4MDlFQSwgMHg3MUVFLCAweDEwRUUsIDB4NzFGNCwgMHg0QzQwLAotICAgIDB4NzFGNSwgMHgxNUQ4LCAweDcxRjksIDB4MTVEQSwgMHg3MUZCLCAweDE1QzksIDB4NzFGQywgMHgxNUQ5LAotICAgIDB4NzFGRSwgMHgyMTYwLCAweDcxRkYsIDB4MTVEQiwgMHg3MjAwLCAweDM5QjIsIDB4NzIwNiwgMHgwRDMwLAotICAgIDB4NzIwNywgMHg0NjdBLCAweDcyMEQsIDB4MTVEQywgMHg3MjEwLCAweDE1REQsIDB4NzIxNSwgMHg0MjQ3LAotICAgIDB4NzIxNywgMHg0QzQxLCAweDcyMUIsIDB4MTVERSwgMHg3MjFELCAweDM5QjMsIDB4NzIxRiwgMHg0QzQyLAotICAgIDB4NzIyOCwgMHgxNURGLCAweDcyMkEsIDB4MEJGQSwgMHg3MjJCLCAweDM5QjQsIDB4NzIyQywgMHgxNUUxLAotICAgIDB4NzIyRCwgMHgxNUUwLCAweDcyMzAsIDB4MTVFMiwgMHg3MjMyLCAweDE1RTMsIDB4NzIzNCwgMHg0NjdDLAotICAgIDB4NzIzNSwgMHgwOTBCLCAweDcyMzYsIDB4MERENSwgMHg3MjM4LCAweDM5QjUsIDB4NzIzOSwgMHg0NjdELAotICAgIDB4NzIzQSwgMHgwRUY4LCAweDcyM0IsIDB4MTVFNCwgMHg3MjNDLCAweDE1RTUsIDB4NzIzRCwgMHgwQUQ4LAotICAgIDB4NzIzRSwgMHgwOEQwLCAweDcyM0YsIDB4MTVFNiwgMHg3MjQwLCAweDE1RTcsIDB4NzI0MSwgMHgzOUI2LAotICAgIDB4NzI0MiwgMHg0NjdFLCAweDcyNDMsIDB4NEM0MywgMHg3MjQ2LCAweDE1RTgsIDB4NzI0NywgMHgwRTIyLAotICAgIDB4NzI0OCwgMHgwRDVCLCAweDcyNEIsIDB4MTVFOSwgMHg3MjRDLCAweDBEMEQsIDB4NzI0RiwgMHg0QzQ0LAotICAgIDB4NzI1MCwgMHg0QzQ1LCAweDcyNTIsIDB4MEJDOSwgMHg3MjUzLCAweDM5QjcsIDB4NzI1NSwgMHgzOUI4LAotICAgIDB4NzI1NiwgMHgzOUI5LCAweDcyNTcsIDB4NDY3RiwgMHg3MjU4LCAweDE1RUEsIDB4NzI1OSwgMHgwNTY3LAotICAgIDB4NzI1QSwgMHg0QzQ2LCAweDcyNUIsIDB4MDY4NywgMHg3MjVDLCAweDM5QkEsIDB4NzI1RCwgMHgwRUQyLAotICAgIDB4NzI1RiwgMHgwRUMyLCAweDcyNjAsIDB4NEM0NywgMHg3MjYxLCAweDA1MzQsIDB4NzI2MiwgMHgwRkRBLAotICAgIDB4NzI2MywgMHg0NjgwLCAweDcyNjcsIDB4MEU4MCwgMHg3MjY4LCAweDRDNDgsIDB4NzI2OSwgMHgwREZBLAotICAgIDB4NzI2RSwgMHg0NjgyLCAweDcyNkYsIDB4NDY4MywgMHg3MjcyLCAweDBBNUIsIDB4NzI3NCwgMHgxNUVCLAotICAgIDB4NzI3NywgMHg0QzQ5LCAweDcyNzgsIDB4NDY4NCwgMHg3Mjc5LCAweDBDOUIsIDB4NzI3RCwgMHgwNzU3LAotICAgIDB4NzI3RSwgMHgxNUVDLCAweDcyN0YsIDB4NDY4NSwgMHg3MjgwLCAweDA4NDQsIDB4NzI4MSwgMHgxNUVFLAotICAgIDB4NzI4MiwgMHgxNUVELCAweDcyODQsIDB4NEM0QSwgMHg3Mjg3LCAweDE1RUYsIDB4NzI4RCwgMHgzOUJCLAotICAgIDB4NzI4RSwgMHg0Njg2LCAweDcyOTIsIDB4MTVGMCwgMHg3Mjk2LCAweDE1RjEsIDB4NzI5QiwgMHg0MjQ5LAotICAgIDB4NzJBMCwgMHgwNjU4LCAweDcyQTIsIDB4MTVGMiwgMHg3MkE3LCAweDE1RjMsIDB4NzJBQywgMHgwNzU4LAotICAgIDB4NzJBRCwgMHgzOUJDLCAweDcyQUUsIDB4NDY4OCwgMHg3MkFGLCAweDBENUMsIDB4NzJCMCwgMHg0Njg5LAotICAgIDB4NzJCMSwgMHgyMTYxLCAweDcyQjIsIDB4MTVGNSwgMHg3MkI0LCAweDM5QkQsIDB4NzJCNiwgMHgwOURELAotICAgIDB4NzJCOSwgMHgxNUY0LCAweDcyQkUsIDB4MjE2MiwgMHg3MkMwLCAweDM0MkIsIDB4NzJDMSwgMHg0NjhBLAotICAgIDB4NzJDMiwgMHgwNkIwLCAweDcyQzMsIDB4MTVGNiwgMHg3MkM0LCAweDE1RjgsIDB4NzJDNiwgMHgxNUY3LAotICAgIDB4NzJDNywgMHgzOUJFLCAweDcyQzksIDB4NEM0QiwgMHg3MkNDLCAweDQ2OEMsIDB4NzJDRSwgMHgxNUY5LAotICAgIDB4NzJEMCwgMHgwNzg1LCAweDcyRDIsIDB4MTVGQSwgMHg3MkQ3LCAweDA2RTEsIDB4NzJEOSwgMHgwQUMyLAotICAgIDB4NzJEQiwgMHgwODBGLCAweDcyRTAsIDB4MTVGQywgMHg3MkUxLCAweDE1RkQsIDB4NzJFMiwgMHgxNUZCLAotICAgIDB4NzJFNSwgMHg0QzRDLCAweDcyRTksIDB4MDkxOSwgMHg3MkVDLCAweDBDQTAsIDB4NzJFRCwgMHgwNkIxLAotICAgIDB4NzJGMywgMHg0NjhGLCAweDcyRjQsIDB4NEM0RCwgMHg3MkY3LCAweDE1RkYsIDB4NzJGOCwgMHgwQjZBLAotICAgIDB4NzJGOSwgMHgxNUZFLCAweDcyRkEsIDB4NDY5MCwgMHg3MkZCLCAweDM5QkYsIDB4NzJGQywgMHgwRkRCLAotICAgIDB4NzJGRCwgMHgwRDE4LCAweDczMDIsIDB4NEM0RSwgMHg3MzA0LCAweDM5QzAsIDB4NzMwNSwgMHgzOUMxLAotICAgIDB4NzMwNywgMHg0NjkxLCAweDczMEEsIDB4MTYwMiwgMHg3MzBCLCAweDRDNEYsIDB4NzMxMiwgMHg0NjkyLAotICAgIDB4NzMxNiwgMHgxNjA0LCAweDczMTcsIDB4MTYwMSwgMHg3MzE4LCAweDQ2OTMsIDB4NzMxOSwgMHg0Njk0LAotICAgIDB4NzMxQiwgMHgwRUUwLCAweDczMUMsIDB4MTYwMywgMHg3MzFELCAweDE2MDUsIDB4NzMxRSwgMHg0QzUwLAotICAgIDB4NzMxRiwgMHgwRjhDLCAweDczMjIsIDB4NEM1MSwgMHg3MzI0LCAweDIxNjMsIDB4NzMyNSwgMHgxNjA5LAotICAgIDB4NzMyNywgMHg0MjRCLCAweDczMjgsIDB4MzlDMiwgMHg3MzI5LCAweDE2MDgsIDB4NzMyQSwgMHgwQkI0LAotICAgIDB4NzMyQiwgMHgwQ0UzLCAweDczMkMsIDB4NDY5NywgMHg3MzJFLCAweDA3NTksIDB4NzMyRiwgMHgxNjA3LAotICAgIDB4NzMzMSwgMHgzOUMzLCAweDczMzMsIDB4NDY5OCwgMHg3MzM0LCAweDE2MDYsIDB4NzMzNiwgMHgwRjFCLAotICAgIDB4NzMzNywgMHgwRjFDLCAweDczMzksIDB4NDY5NiwgMHg3MzNBLCAweDRDNTIsIDB4NzMzQiwgMHg0QzUzLAotICAgIDB4NzMzRCwgMHg0Njk5LCAweDczM0UsIDB4MTYwQSwgMHg3MzNGLCAweDA1MTAsIDB4NzM0MywgMHgzOUM0LAotICAgIDB4NzM0NCwgMHgwODA4LCAweDczNDUsIDB4MDhCMCwgMHg3MzRELCAweDRDNTQsIDB4NzM0RSwgMHgxNjBCLAotICAgIDB4NzM0RiwgMHgxNjBDLCAweDczNTAsIDB4NDI0QywgMHg3MzUyLCAweDQ2OUEsIDB4NzM1NywgMHgxNjBFLAotICAgIDB4NzM1OCwgMHg0QzU1LCAweDczNjMsIDB4MDk0RCwgMHg3MzY2LCAweDQyNEQsIDB4NzM2NywgMHg0QzU2LAotICAgIDB4NzM2OCwgMHgxNjEwLCAweDczNkEsIDB4MTYwRiwgMHg3MzZCLCAweDQ2OUMsIDB4NzM2QywgMHgzOUM1LAotICAgIDB4NzM2RSwgMHg0NjlFLCAweDczNkYsIDB4NDY5RiwgMHg3MzcwLCAweDE2MTEsIDB4NzM3MSwgMHg0NkEwLAotICAgIDB4NzM3MiwgMHgwNUFCLCAweDczNzUsIDB4MTYxMywgMHg3Mzc3LCAweDIxNjUsIDB4NzM3OCwgMHgxNjEyLAotICAgIDB4NzM3QSwgMHgxNjE1LCAweDczN0IsIDB4MTYxNCwgMHg3MzdDLCAweDM5QzYsIDB4NzM4MSwgMHg0NkExLAotICAgIDB4NzM4MywgMHgzOUM3LCAweDczODQsIDB4MDc3MCwgMHg3Mzg1LCAweDM5QzgsIDB4NzM4NiwgMHgzOUM5LAotICAgIDB4NzM4NywgMHgwRjcwLCAweDczODksIDB4MDZDNCwgMHg3MzhBLCAweDQ2QTIsIDB4NzM4QiwgMHgwNTI2LAotICAgIDB4NzM5NCwgMHg0NkEzLCAweDczOTUsIDB4MzlDQSwgMHg3Mzk2LCAweDA2RTIsIDB4NzM5OCwgMHg0NkE0LAotICAgIDB4NzM5QywgMHg0NkE1LCAweDczOUUsIDB4MzlDQiwgMHg3MzlGLCAweDM5Q0MsIDB4NzNBMCwgMHgzOUNELAotICAgIDB4NzNBMiwgMHg0MjRFLCAweDczQTUsIDB4NDZBNiwgMHg3M0E2LCAweDM5Q0UsIDB4NzNBOCwgMHgzQzNGLAotICAgIDB4NzNBOSwgMHgwNjFELCAweDczQUIsIDB4MzlDRiwgMHg3M0IyLCAweDBGQjAsIDB4NzNCMywgMHgxNjE3LAotICAgIDB4NzNCNSwgMHgzOUQwLCAweDczQjcsIDB4MzlEMSwgMHg3M0I5LCAweDQ2QTcsIDB4NzNCQSwgMHgzNUVBLAotICAgIDB4NzNCQiwgMHgxNjE5LCAweDczQkMsIDB4MzlEMiwgMHg3M0JELCAweDIxNjYsIDB4NzNCRiwgMHg0NkE4LAotICAgIDB4NzNDMCwgMHgxNjFBLCAweDczQzIsIDB4MDU1MSwgMHg3M0M1LCAweDQ2QTksIDB4NzNDOCwgMHgxNjE2LAotICAgIDB4NzNDOSwgMHgyMTY3LCAweDczQ0EsIDB4MDg4NywgMHg3M0NCLCAweDQ2QUEsIDB4NzNDRCwgMHgwQkRELAotICAgIDB4NzNDRSwgMHgxNjE4LCAweDczQ0YsIDB4MzlEMywgMHg3M0QyLCAweDIxNkEsIDB4NzNENiwgMHgyMTY4LAotICAgIDB4NzNEOSwgMHgzOUQ0LCAweDczREUsIDB4MTYxRCwgMHg3M0UwLCAweDA5MUEsIDB4NzNFMSwgMHg0NkFCLAotICAgIDB4NzNFMywgMHgyMTY5LCAweDczRTQsIDB4M0MzOSwgMHg3M0U1LCAweDE2MUIsIDB4NzNFNywgMHg0NkFDLAotICAgIDB4NzNFOSwgMHgzOUQ1LCAweDczRUEsIDB4MDcxNCwgMHg3M0VELCAweDBENUQsIDB4NzNFRSwgMHgxNjFDLAotICAgIDB4NzNGMSwgMHgxNjM3LCAweDczRjQsIDB4MzlENiwgMHg3M0Y1LCAweDIxNkMsIDB4NzNGOCwgMHgxNjIyLAotICAgIDB4NzNGOSwgMHg0NkFELCAweDczRkEsIDB4NDZBRiwgMHg3M0ZELCAweDM5RDcsIDB4NzNGRSwgMHgwNzcxLAotICAgIDB4NzQwMSwgMHg0NkIwLCAweDc0MDMsIDB4MDY3RiwgMHg3NDA0LCAweDM5RDgsIDB4NzQwNSwgMHgxNjFGLAotICAgIDB4NzQwNiwgMHgwRjY3LCAweDc0MDcsIDB4MjE2QiwgMHg3NDA5LCAweDBGNzgsIDB4NzQwQSwgMHgzOUQ5LAotICAgIDB4NzQxMywgMHg0NkFFLCAweDc0MUEsIDB4MzlEQSwgMHg3NDFCLCAweDM5REIsIDB4NzQyMSwgMHgzQzNBLAotICAgIDB4NzQyMiwgMHgwQjU2LCAweDc0MjQsIDB4MzlEQywgMHg3NDI1LCAweDE2MjEsIDB4NzQyNiwgMHgyMTZELAotICAgIDB4NzQyOCwgMHgzOURELCAweDc0MjksIDB4MjE2RiwgMHg3NDJBLCAweDIxNkUsIDB4NzQyQiwgMHg0MjRGLAotICAgIDB4NzQyQywgMHgzOURFLCAweDc0MkUsIDB4MjE3MCwgMHg3NDJGLCAweDM5REYsIDB4NzQzMCwgMHgzOUUwLAotICAgIDB4NzQzMSwgMHgzOUUxLCAweDc0MzIsIDB4MTYyMywgMHg3NDMzLCAweDBGOUUsIDB4NzQzNCwgMHgwNkNGLAotICAgIDB4NzQzNSwgMHgwRDkwLCAweDc0MzYsIDB4MEQwMCwgMHg3NDM5LCAweDM5RTIsIDB4NzQzQSwgMHgxNjI0LAotICAgIDB4NzQzRiwgMHgxNjI2LCAweDc0NDAsIDB4NDZCMiwgMHg3NDQxLCAweDE2MjksIDB4NzQ0MywgMHg0NkIzLAotICAgIDB4NzQ0NCwgMHgzOUUzLCAweDc0NDYsIDB4NDI1MCwgMHg3NDQ3LCAweDM5RTQsIDB4NzQ0QiwgMHgzOUU1LAotICAgIDB4NzQ0RCwgMHgzOUU2LCAweDc0NTEsIDB4MzlFNywgMHg3NDUyLCAweDQ2QjQsIDB4NzQ1MywgMHg0NkIxLAotICAgIDB4NzQ1NSwgMHgxNjI1LCAweDc0NTcsIDB4MzlFOCwgMHg3NDU5LCAweDE2MjgsIDB4NzQ1QSwgMHgwNzlFLAotICAgIDB4NzQ1QiwgMHgwNEVGLCAweDc0NUMsIDB4MTYyQSwgMHg3NDVELCAweDQ2QjUsIDB4NzQ1RSwgMHgwQTM2LAotICAgIDB4NzQ1RiwgMHgxNjI3LCAweDc0NjAsIDB4MEZBNCwgMHg3NDYyLCAweDQyNTEsIDB4NzQ2MywgMHgxNjJELAotICAgIDB4NzQ2NCwgMHgxRDM1LCAweDc0NjYsIDB4MzlFOSwgMHg3NDY5LCAweDE2MkIsIDB4NzQ2QSwgMHgxNjJFLAotICAgIDB4NzQ2QiwgMHgzOUVBLCAweDc0NkQsIDB4NDI1MiwgMHg3NDZGLCAweDE2MjAsIDB4NzQ3MCwgMHgxNjJDLAotICAgIDB4NzQ3MSwgMHgzOUVCLCAweDc0NzIsIDB4NEM1NywgMHg3NDczLCAweDA4MkMsIDB4NzQ3NiwgMHgxNjJGLAotICAgIDB4NzQ3RSwgMHgxNjMwLCAweDc0ODAsIDB4MzlFQywgMHg3NDgxLCAweDQ2QjYsIDB4NzQ4MywgMHgwRjY4LAotICAgIDB4NzQ4NSwgMHgzOUVELCAweDc0ODYsIDB4MzlFRSwgMHg3NDg3LCAweDM5RUYsIDB4NzQ4OCwgMHg0NkI3LAotICAgIDB4NzQ4OSwgMHgyMTcyLCAweDc0OEIsIDB4MTYzMSwgMHg3NDkwLCAweDM5RjAsIDB4NzQ5MiwgMHg0NkI5LAotICAgIDB4NzQ5NywgMHg0NkJBLCAweDc0OTgsIDB4MzlGMSwgMHg3NDk5LCAweDQ2QkIsIDB4NzQ5QywgMHgzOUYyLAotICAgIDB4NzQ5RSwgMHgxNjMyLCAweDc0OUYsIDB4MjE3MywgMHg3NEEwLCAweDM5RjMsIDB4NzRBMSwgMHg0NkJDLAotICAgIDB4NzRBMiwgMHgxNjFFLCAweDc0QTMsIDB4MzlGNCwgMHg3NEE1LCAweDQ2QkQsIDB4NzRBNiwgMHg0MjUzLAotICAgIDB4NzRBNywgMHgxNjMzLCAweDc0QTgsIDB4MzlGNSwgMHg3NEE5LCAweDQyNTQsIDB4NzRBQSwgMHg0NkJFLAotICAgIDB4NzRBQiwgMHgzOUY2LCAweDc0QUYsIDB4NEM1OCwgMHg3NEIwLCAweDA2MDAsIDB4NzRCNSwgMHgzOUY3LAotICAgIDB4NzRCOSwgMHg0NkJGLCAweDc0QkEsIDB4NDZDMSwgMHg3NEJCLCAweDQ2QzAsIDB4NzRCRCwgMHgwOEQxLAotICAgIDB4NzRCRiwgMHgzOUY4LCAweDc0QzgsIDB4MzlGOSwgMHg3NEM5LCAweDQyNTUsIDB4NzRDQSwgMHgxNjM0LAotICAgIDB4NzRDRiwgMHgxNjM1LCAweDc0RDQsIDB4MTYzNiwgMHg3NEQ2LCAweDQ2QzIsIDB4NzREOCwgMHg0NkMzLAotICAgIDB4NzREQSwgMHgzOUZBLCAweDc0REMsIDB4MDRERCwgMHg3NERFLCAweDM5RkIsIDB4NzRERiwgMHg0QzU5LAotICAgIDB4NzRFMCwgMHgxNjM4LCAweDc0RTIsIDB4MERBRCwgMHg3NEUzLCAweDE2MzksIDB4NzRFNCwgMHg0QzVBLAotICAgIDB4NzRFNiwgMHgwNUUwLCAweDc0RTcsIDB4MTYzQSwgMHg3NEU5LCAweDE2M0IsIDB4NzRFQiwgMHg0NkM0LAotICAgIDB4NzRFRSwgMHgxNjNDLCAweDc0RUYsIDB4Mzc1MCwgMHg3NEYwLCAweDE2M0UsIDB4NzRGMSwgMHgxNjNGLAotICAgIDB4NzRGMiwgMHgxNjNELCAweDc0RjQsIDB4NEM1QiwgMHg3NEY2LCAweDBEQzUsIDB4NzRGNywgMHgxNjQxLAotICAgIDB4NzRGOCwgMHgxNjQwLCAweDc0RkEsIDB4NDZDNiwgMHg3NEZCLCAweDRDNUMsIDB4NzRGRiwgMHg0MjU2LAotICAgIDB4NzUwMSwgMHgyMTc0LCAweDc1MDMsIDB4MTY0MywgMHg3NTA0LCAweDE2NDIsIDB4NzUwNSwgMHgxNjQ0LAotICAgIDB4NzUwQywgMHgxNjQ1LCAweDc1MEQsIDB4MTY0NywgMHg3NTBFLCAweDE2NDYsIDB4NzUxMSwgMHgwODBCLAotICAgIDB4NzUxMywgMHgxNjQ5LCAweDc1MTUsIDB4MTY0OCwgMHg3NTE2LCAweDRDNUQsIDB4NzUxNywgMHg0MjU3LAotICAgIDB4NzUxOCwgMHgwNjAxLCAweDc1MUEsIDB4MEExOSwgMHg3NTFDLCAweDBDMzYsIDB4NzUxRSwgMHgxNjRBLAotICAgIDB4NzUxRiwgMHgwQTVDLCAweDc1MjAsIDB4NDZDOCwgMHg3NTIxLCAweDRDNUUsIDB4NzUyMiwgMHgzNURFLAotICAgIDB4NzUyMywgMHgwODg4LCAweDc1MjQsIDB4NDZDOSwgMHg3NTI1LCAweDA1MUIsIDB4NzUyNiwgMHgxNjRCLAotICAgIDB4NzUyOCwgMHgwRjNCLCAweDc1MkEsIDB4NDZDQSwgMHg3NTJCLCAweDBFMzMsIDB4NzUyQywgMHgxNjRDLAotICAgIDB4NzUyRiwgMHgyMEYyLCAweDc1MzAsIDB4MEMzRSwgMHg3NTMxLCAweDBGMUQsIDB4NzUzMiwgMHgwN0Q1LAotICAgIDB4NzUzMywgMHgwQTAzLCAweDc1MzcsIDB4MEI4OSwgMHg3NTM4LCAweDEwQzksIDB4NzUzQSwgMHgwQkNBLAotICAgIDB4NzUzQiwgMHgwNTY4LCAweDc1M0MsIDB4MTY0RCwgMHg3NTNELCAweDQ2Q0QsIDB4NzUzRSwgMHg0NkNFLAotICAgIDB4NzUzRiwgMHg0QzVGLCAweDc1NDAsIDB4NDZDRiwgMHg3NTQ0LCAweDE2NEUsIDB4NzU0NiwgMHgxNjUzLAotICAgIDB4NzU0OCwgMHg0NkQwLCAweDc1NDksIDB4MTY1MSwgMHg3NTRBLCAweDE2NTAsIDB4NzU0QiwgMHgxM0M3LAotICAgIDB4NzU0QywgMHgwNTg0LCAweDc1NEQsIDB4MTY0RiwgMHg3NTRFLCAweDM5RkMsIDB4NzU0RiwgMHgwNDlFLAotICAgIDB4NzU1MCwgMHg0NkQxLCAweDc1NTEsIDB4MEQzRSwgMHg3NTUyLCAweDQ2RDIsIDB4NzU1NCwgMHgwRDVFLAotICAgIDB4NzU1OSwgMHgwRjc5LCAweDc1NUEsIDB4MTY1NCwgMHg3NTVCLCAweDE2NTIsIDB4NzU1QywgMHgwQjlBLAotICAgIDB4NzU1RCwgMHgwQTRBLCAweDc1NUUsIDB4NEM2MCwgMHg3NTYwLCAweDBEM0YsIDB4NzU2MiwgMHgwRDlGLAotICAgIDB4NzU2NCwgMHgxNjU2LCAweDc1NjUsIDB4MEY3NCwgMHg3NTY2LCAweDA3MjMsIDB4NzU2NywgMHgxNjU3LAotICAgIDB4NzU2OSwgMHgxNjU1LCAweDc1NkEsIDB4MEQ2QSwgMHg3NTZCLCAweDE2NTgsIDB4NzU2QywgMHgzQzNCLAotICAgIDB4NzU2RCwgMHgxNjU5LCAweDc1NkYsIDB4MjE3NSwgMHg3NTcwLCAweDA0OUYsIDB4NzU3MSwgMHg0NkQ0LAotICAgIDB4NzU3MiwgMHg0NkQzLCAweDc1NzMsIDB4MDlERSwgMHg3NTc0LCAweDE2NUUsIDB4NzU3NSwgMHgzNzUxLAotICAgIDB4NzU3NiwgMHgxNjVCLCAweDc1NzcsIDB4MENDNSwgMHg3NTc4LCAweDE2NUEsIDB4NzU3OSwgMHgzOUZELAotICAgIDB4NzU3QSwgMHg0NkQ1LCAweDc1N0QsIDB4NDZENiwgMHg3NTdFLCAweDQ2RDcsIDB4NzU3RiwgMHgwNjQwLAotICAgIDB4NzU4MSwgMHgzOUZFLCAweDc1ODIsIDB4MTY2MSwgMHg3NTg2LCAweDE2NUMsIDB4NzU4NywgMHgxNjVELAotICAgIDB4NzU4OSwgMHgxNjYwLCAweDc1OEEsIDB4MTY1RiwgMHg3NThCLCAweDBEOTcsIDB4NzU4QywgMHg0NkQ4LAotICAgIDB4NzU4RSwgMHgwQUM0LCAweDc1OEYsIDB4MEFDMywgMHg3NTkwLCAweDM5RkYsIDB4NzU5MSwgMHgwNjU5LAotICAgIDB4NzU5MiwgMHgzQTAwLCAweDc1OTMsIDB4M0EwMSwgMHg3NTk0LCAweDE2NjIsIDB4NzU5OSwgMHg0QzYxLAotICAgIDB4NzU5QSwgMHgxNjYzLCAweDc1OUQsIDB4MTY2NCwgMHg3NUEyLCAweDQ2REEsIDB4NzVBMywgMHgxNjY2LAotICAgIDB4NzVBNCwgMHg0QzYyLCAweDc1QTUsIDB4MTY2NSwgMHg3NUFCLCAweDA0RjgsIDB4NzVCMCwgMHg0NkRDLAotICAgIDB4NzVCMSwgMHgxNjZFLCAweDc1QjIsIDB4MEQ3QywgMHg3NUIzLCAweDE2NjgsIDB4NzVCNCwgMHgzQTAyLAotICAgIDB4NzVCNSwgMHgxNjZBLCAweDc1QjcsIDB4NDZERCwgMHg3NUI4LCAweDE2NkMsIDB4NzVCOSwgMHgwQTA0LAotICAgIDB4NzVCQywgMHgxNjZELCAweDc1QkQsIDB4MTY2QiwgMHg3NUJFLCAweDA4RUMsIDB4NzVCRiwgMHg0NkRFLAotICAgIDB4NzVDMCwgMHg0NkRGLCAweDc1QzEsIDB4NEM2MywgMHg3NUMyLCAweDE2NjcsIDB4NzVDMywgMHgxNjY5LAotICAgIDB4NzVDNCwgMHg0QzY0LCAweDc1QzUsIDB4MERCNCwgMHg3NUM2LCAweDQ2RTAsIDB4NzVDNywgMHgwOUIxLAotICAgIDB4NzVDQSwgMHgxNjcwLCAweDc1Q0MsIDB4NEM2NSwgMHg3NUNELCAweDE2NkYsIDB4NzVDRSwgMHg0MjU5LAotICAgIDB4NzVDRiwgMHg0NkUxLCAweDc1RDIsIDB4MTY3MSwgMHg3NUQzLCAweDQ2RTIsIDB4NzVENCwgMHgwOEQyLAotICAgIDB4NzVENSwgMHgwODFGLCAweDc1RDcsIDB4NEM2NiwgMHg3NUQ4LCAweDBDNzEsIDB4NzVEOSwgMHgxNjcyLAotICAgIDB4NzVEQiwgMHgwQkU3LCAweDc1REMsIDB4NEM2NywgMHg3NURELCAweDQ2RTMsIDB4NzVERSwgMHgxNjc0LAotICAgIDB4NzVERiwgMHg0NkU0LCAweDc1RTAsIDB4NDZFNSwgMHg3NUUxLCAweDRDNjgsIDB4NzVFMiwgMHgwRjY5LAotICAgIDB4NzVFMywgMHgxNjczLCAweDc1RTQsIDB4M0EwMywgMHg3NUU3LCAweDQ2RTYsIDB4NzVFOSwgMHgwQUVCLAotICAgIDB4NzVFQywgMHgzNzUyLCAweDc1RUUsIDB4NDZFNywgMHg3NUVGLCAweDRDNjksIDB4NzVGMCwgMHgxNjc5LAotICAgIDB4NzVGMSwgMHg0NkU4LCAweDc1RjIsIDB4MTY3QiwgMHg3NUYzLCAweDE2N0MsIDB4NzVGNCwgMHgwQjkyLAotICAgIDB4NzVGOSwgMHgzQTA0LCAweDc1RkEsIDB4MTY3QSwgMHg3NUZDLCAweDE2NzcsIDB4NzVGRSwgMHgxNjc1LAotICAgIDB4NzVGRiwgMHgxNjc2LCAweDc2MDAsIDB4M0EwNSwgMHg3NjAxLCAweDE2NzgsIDB4NzYwMiwgMHg0MjVBLAotICAgIDB4NzYwMywgMHg0NkU5LCAweDc2MDQsIDB4NEM2QSwgMHg3NjA3LCAweDQ2RUIsIDB4NzYwOCwgMHg0MjVCLAotICAgIDB4NzYwOSwgMHgxNjdGLCAweDc2MEEsIDB4M0EwNiwgMHg3NjBCLCAweDE2N0QsIDB4NzYwQywgMHg0QzZCLAotICAgIDB4NzYwRCwgMHgxNjdFLCAweDc2MEYsIDB4NDZFQywgMHg3NjEzLCAweDQ2RUYsIDB4NzYxNSwgMHgzQTA3LAotICAgIDB4NzYxNiwgMHgzQTA4LCAweDc2MTgsIDB4NDZFQSwgMHg3NjE5LCAweDNBMDksIDB4NzYxQiwgMHg0NkYwLAotICAgIDB4NzYxQywgMHg0NkYxLCAweDc2MUQsIDB4NEM2QywgMHg3NjFFLCAweDNBMEEsIDB4NzYxRiwgMHgxNjgwLAotICAgIDB4NzYyMCwgMHgxNjgyLCAweDc2MjEsIDB4MTY4MywgMHg3NjIyLCAweDE2ODQsIDB4NzYyNCwgMHgxNjg1LAotICAgIDB4NzYyNSwgMHg0NkYzLCAweDc2MjYsIDB4MzY0NSwgMHg3NjI3LCAweDE2ODEsIDB4NzYyOCwgMHg0NkY0LAotICAgIDB4NzYyRCwgMHgzQTBCLCAweDc2MzAsIDB4MTY4NywgMHg3NjMyLCAweDRDNkQsIDB4NzYzMywgMHg0NkY2LAotICAgIDB4NzYzNCwgMHgxNjg2LCAweDc2MzUsIDB4M0EwQywgMHg3NjM4LCAweDRDNkUsIDB4NzYzQiwgMHgxNjg4LAotICAgIDB4NzYzQywgMHg0NkY1LCAweDc2NDEsIDB4NDZGOSwgMHg3NjQyLCAweDBGOEQsIDB4NzY0MywgMHgzQTBELAotICAgIDB4NzY0NSwgMHg0QzZGLCAweDc2NDYsIDB4MTY4QiwgMHg3NjQ3LCAweDE2ODksIDB4NzY0OCwgMHgxNjhBLAotICAgIDB4NzY0OSwgMHg0NkZCLCAweDc2NEEsIDB4NEM3MCwgMHg3NjRCLCAweDNBMEUsIDB4NzY0QywgMHgwNjFFLAotICAgIDB4NzY0RSwgMHgzNzUzLCAweDc2NTIsIDB4MEYwQSwgMHg3NjU1LCAweDQ2RkMsIDB4NzY1NiwgMHgwRTFBLAotICAgIDB4NzY1OCwgMHgxNjhELCAweDc2NUMsIDB4MTY4QywgMHg3NjVGLCAweDRDNzEsIDB4NzY2MSwgMHgxNjhFLAotICAgIDB4NzY2MiwgMHgxNjhGLCAweDc2NjQsIDB4NDI1QywgMHg3NjY1LCAweDNBMEYsIDB4NzY2NywgMHgxNjkzLAotICAgIDB4NzY2OCwgMHgxNjkwLCAweDc2NjksIDB4MTY5MSwgMHg3NjZBLCAweDE2OTIsIDB4NzY2QywgMHgxNjk0LAotICAgIDB4NzY2RCwgMHgzQTEwLCAweDc2NkUsIDB4NDZGRSwgMHg3NjZGLCAweDNBMTEsIDB4NzY3MCwgMHgxNjk1LAotICAgIDB4NzY3MSwgMHgzQTEyLCAweDc2NzIsIDB4MTY5NiwgMHg3Njc0LCAweDNBMTMsIDB4NzY3NiwgMHgxNjk3LAotICAgIDB4NzY3OCwgMHgxNjk4LCAweDc2N0EsIDB4MEQ0MywgMHg3NjdCLCAweDBDNEEsIDB4NzY3QywgMHgxNjk5LAotICAgIDB4NzY3RCwgMHgwRDI4LCAweDc2N0UsIDB4MERBNiwgMHg3NjgwLCAweDE2OUEsIDB4NzY4MSwgMHg0MjVELAotICAgIDB4NzY4MiwgMHgyMTc2LCAweDc2ODMsIDB4MTY5QiwgMHg3Njg0LCAweDBDMjQsIDB4NzY4NiwgMHgwNTg1LAotICAgIDB4NzY4NywgMHgwN0Q2LCAweDc2ODgsIDB4MTY5QywgMHg3NjhCLCAweDE2OUQsIDB4NzY4RSwgMHgxNjlFLAotICAgIDB4NzY5MCwgMHgwODc3LCAweDc2OTMsIDB4MTZBMCwgMHg3Njk1LCAweDQ2RkYsIDB4NzY5NiwgMHgxNjlGLAotICAgIDB4NzY5OSwgMHgxNkExLCAweDc2OUEsIDB4MTZBMiwgMHg3NjlCLCAweDIxNzksIDB4NzY5QywgMHgyMTc3LAotICAgIDB4NzY5RCwgMHg0MjVFLCAweDc2OUUsIDB4MjE3OCwgMHg3NkEwLCAweDQ3MDEsIDB4NzZBMSwgMHg0NzAwLAotICAgIDB4NzZBNCwgMHgzQTE0LCAweDc2QTUsIDB4M0ExNSwgMHg3NkE2LCAweDIxN0EsIDB4NzZBNywgMHg0NzAyLAotICAgIDB4NzZBOCwgMHg0NzAzLCAweDc2QUEsIDB4NDI1RiwgMHg3NkFELCAweDRDNzIsIDB4NzZBRSwgMHgwRDdELAotICAgIDB4NzZBRiwgMHg0NzA0LCAweDc2QjAsIDB4MTZBMywgMHg3NkI0LCAweDE2QTQsIDB4NzZCNiwgMHg0MjYwLAotICAgIDB4NzZCNywgMHgxRDFDLCAweDc2QjgsIDB4MTZBNSwgMHg3NkI5LCAweDE2QTYsIDB4NzZCQSwgMHgxNkE3LAotICAgIDB4NzZCRCwgMHg0QzczLCAweDc2QkYsIDB4MDg3QywgMHg3NkMyLCAweDE2QTgsIDB4NzZDMywgMHgwRDBDLAotICAgIDB4NzZDNSwgMHgzQTE2LCAweDc2QzYsIDB4MEU4RCwgMHg3NkM4LCAweDA0RjAsIDB4NzZDOSwgMHg0NzA2LAotICAgIDB4NzZDQSwgMHgwNEY5LCAweDc2Q0MsIDB4M0ExNywgMHg3NkNELCAweDE2QTksIDB4NzZDRSwgMHg0MjYxLAotICAgIDB4NzZEMiwgMHgxNkFCLCAweDc2RDQsIDB4NDI2MiwgMHg3NkQ2LCAweDE2QUEsIDB4NzZENywgMHgwQzZBLAotICAgIDB4NzZEOSwgMHg0Qzc0LCAweDc2REIsIDB4MEE1RCwgMHg3NkRDLCAweDE0RDgsIDB4NzZERSwgMHgxNkFDLAotICAgIDB4NzZERiwgMHgwRUNELCAweDc2RTEsIDB4MTZBRCwgMHg3NkUzLCAweDA2MDIsIDB4NzZFNCwgMHgwRDZCLAotICAgIDB4NzZFNSwgMHgxNkFFLCAweDc2RTYsIDB4NDI2MywgMHg3NkU3LCAweDE2QUYsIDB4NzZFOCwgMHg0NzA4LAotICAgIDB4NzZFQSwgMHgxNkIwLCAweDc2RUIsIDB4NEM3NSwgMHg3NkVDLCAweDNBMTgsIDB4NzZFRSwgMHgwRUU4LAotICAgIDB4NzZGMCwgMHg0Qzc2LCAweDc2RjEsIDB4NDI2NCwgMHg3NkYyLCAweDBFRTEsIDB4NzZGNCwgMHgwQkRBLAotICAgIDB4NzZGOCwgMHgwQUVDLCAweDc2RjksIDB4NEM3NywgMHg3NkZCLCAweDE2QjIsIDB4NzZGQywgMHgzQTE5LAotICAgIDB4NzZGRSwgMHgwOTZDLCAweDc3MDAsIDB4NEM3OCwgMHg3NzAxLCAweDA5QjIsIDB4NzcwNCwgMHgxNkI1LAotICAgIDB4NzcwNywgMHgxNkI0LCAweDc3MDgsIDB4MTZCMywgMHg3NzA5LCAweDBEOTEsIDB4NzcwQSwgMHg0MjY1LAotICAgIDB4NzcwQiwgMHgwNjAzLCAweDc3MEMsIDB4MDc1RCwgMHg3NzBFLCAweDRDNzksIDB4NzcxNywgMHg0NzBBLAotICAgIDB4NzcxOSwgMHg0MjY2LCAweDc3MUEsIDB4NDcwQiwgMHg3NzFCLCAweDE2QkIsIDB4NzcxRSwgMHgxNkI4LAotICAgIDB4NzcxRiwgMHgwQTA1LCAweDc3MjAsIDB4MEVCRSwgMHg3NzIyLCAweDRDN0EsIDB4NzcyNCwgMHgxNkI3LAotICAgIDB4NzcyNSwgMHgxNkI5LCAweDc3MjYsIDB4MTZCQSwgMHg3NzI4LCAweDRDN0IsIDB4NzcyOSwgMHgxNkI2LAotICAgIDB4NzcyRCwgMHg0NzBDLCAweDc3MkYsIDB4NEM3QywgMHg3NzM0LCAweDNBMUEsIDB4NzczNSwgMHg0NzBELAotICAgIDB4NzczNiwgMHgzQTFCLCAweDc3MzcsIDB4MTZCQywgMHg3NzM4LCAweDE2QkQsIDB4NzczOSwgMHg0QzdELAotICAgIDB4NzczQSwgMHgwQkNCLCAweDc3M0MsIDB4MDYxRiwgMHg3NzNFLCAweDRDN0UsIDB4Nzc0MCwgMHgwQkEzLAotICAgIDB4Nzc0NSwgMHg0QzdGLCAweDc3NDYsIDB4MjE3QywgMHg3NzQ3LCAweDE2QkUsIDB4Nzc0QSwgMHg0QzgwLAotICAgIDB4Nzc0RCwgMHg0MjY3LCAweDc3NEUsIDB4NDI2OCwgMHg3NzRGLCAweDRDODEsIDB4Nzc1OCwgMHg0NzEyLAotICAgIDB4Nzc1QSwgMHgxNkJGLCAweDc3NUIsIDB4MTZDMiwgMHg3NzVDLCAweDNBMUMsIDB4Nzc1RSwgMHg0QzgyLAotICAgIDB4Nzc1RiwgMHgzQTFELCAweDc3NjAsIDB4M0ExRSwgMHg3NzYxLCAweDBBMkQsIDB4Nzc2MiwgMHgxRUM1LAotICAgIDB4Nzc2MywgMHgwQzlDLCAweDc3NjQsIDB4NEM4MywgMHg3NzY1LCAweDE2QzMsIDB4Nzc2NiwgMHgwRTgxLAotICAgIDB4Nzc2NywgMHg0Qzg0LCAweDc3NjgsIDB4MTZDMCwgMHg3NzZBLCAweDM3NTUsIDB4Nzc2QiwgMHgxNkMxLAotICAgIDB4Nzc2QywgMHg0Qzg1LCAweDc3NzIsIDB4M0ExRiwgMHg3Nzc5LCAweDE2QzYsIDB4Nzc3QSwgMHg0MjY5LAotICAgIDB4Nzc3QywgMHg0NzE0LCAweDc3N0QsIDB4M0EyMCwgMHg3NzdFLCAweDE2QzUsIDB4Nzc3RiwgMHgxNkM0LAotICAgIDB4Nzc4MCwgMHg0MjZBLCAweDc3ODQsIDB4NEM4NiwgMHg3NzhCLCAweDE2QzgsIDB4Nzc4QywgMHg0Qzg3LAotICAgIDB4Nzc4RCwgMHg0Qzg4LCAweDc3OEUsIDB4MTZDNywgMHg3NzkxLCAweDE2QzksIDB4Nzc5NCwgMHg0MjZCLAotICAgIDB4Nzc5NSwgMHgzQTIxLCAweDc3OTYsIDB4NEM4OSwgMHg3NzlBLCAweDQ3MTcsIDB4Nzc5RSwgMHgxNkNCLAotICAgIDB4Nzc5RiwgMHg0NzE4LCAweDc3QTAsIDB4MTZDQSwgMHg3N0EyLCAweDQ3MTksIDB4NzdBNCwgMHg0NzFBLAotICAgIDB4NzdBNSwgMHgwRTFELCAweDc3QTcsIDB4NEM4QSwgMHg3N0E5LCAweDM3NTYsIDB4NzdBQSwgMHgzQTIyLAotICAgIDB4NzdBQywgMHgwOTYwLCAweDc3QUQsIDB4MEY4RSwgMHg3N0FGLCAweDRDOEIsIDB4NzdCMCwgMHgxNkNDLAotICAgIDB4NzdCMywgMHgwQzhGLCAweDc3QjYsIDB4MTZDRCwgMHg3N0I3LCAweDRDOEMsIDB4NzdCOSwgMHgxNkNFLAotICAgIDB4NzdCQiwgMHgxNkQyLCAweDc3QkMsIDB4MTZEMCwgMHg3N0JELCAweDE2RDEsIDB4NzdCRSwgMHg0QzhELAotICAgIDB4NzdCRiwgMHgxNkNGLCAweDc3QzcsIDB4MTZEMywgMHg3N0M5LCAweDRDOEUsIDB4NzdDRCwgMHgxNkQ0LAotICAgIDB4NzdEMSwgMHg0QzhGLCAweDc3RDcsIDB4MTZENSwgMHg3N0Q5LCAweDRDOTAsIDB4NzdEQSwgMHgxNkQ2LAotICAgIDB4NzdEQiwgMHgwRUMzLCAweDc3REMsIDB4MTZENywgMHg3N0RFLCAweDQ3MUIsIDB4NzdERiwgMHg0NzFDLAotICAgIDB4NzdFMCwgMHg0MjZDLCAweDc3RTIsIDB4MEVGQywgMHg3N0UzLCAweDE2RDgsIDB4NzdFNCwgMHg0NzFELAotICAgIDB4NzdFNSwgMHgwQjhDLCAweDc3RTYsIDB4M0EyMywgMHg3N0U3LCAweDBEMjAsIDB4NzdFOSwgMHgwNkUzLAotICAgIDB4NzdFQSwgMHg0NzFFLCAweDc3RUMsIDB4NDcxRiwgMHg3N0VELCAweDBCNzksIDB4NzdFRSwgMHgxNkQ5LAotICAgIDB4NzdFRiwgMHgwNkIyLCAweDc3RjAsIDB4M0EyNCwgMHg3N0YxLCAweDRDOTEsIDB4NzdGMywgMHgwQTc0LAotICAgIDB4NzdGNCwgMHgzQTI1LCAweDc3RkIsIDB4NDcyMCwgMHg3N0ZDLCAweDE2REEsIDB4NzgwMiwgMHgwODJELAotICAgIDB4NzgwNSwgMHg0NzIyLCAweDc4MDYsIDB4M0EyNiwgMHg3ODA5LCAweDQ3MjMsIDB4NzgwQywgMHgxNkRCLAotICAgIDB4NzgwRCwgMHg0NzI0LCAweDc4MTIsIDB4MTZEQywgMHg3ODE0LCAweDA3NUEsIDB4NzgxNSwgMHgwODQ1LAotICAgIDB4NzgxOSwgMHg0NzI1LCAweDc4MjAsIDB4MTZERSwgMHg3ODIxLCAweDIxN0UsIDB4NzgyMiwgMHgzQTI3LAotICAgIDB4NzgyNSwgMHgwQzUwLCAweDc4MjYsIDB4MDg0NiwgMHg3ODI3LCAweDA2NjgsIDB4NzgyQywgMHg0NzI2LAotICAgIDB4NzgyRCwgMHgzQTI4LCAweDc4MkUsIDB4M0EyOSwgMHg3ODMwLCAweDNBMkEsIDB4NzgzMiwgMHgwRTUyLAotICAgIDB4NzgzNCwgMHgwRDAxLCAweDc4MzUsIDB4M0EyQiwgMHg3ODM3LCAweDRDOTIsIDB4NzgzQSwgMHgwQzUxLAotICAgIDB4NzgzRiwgMHgwN0VFLCAweDc4NDMsIDB4NDI2RSwgMHg3ODQ1LCAweDE2RTAsIDB4Nzg0NywgMHg0NzI3LAotICAgIDB4Nzg0RSwgMHgyMTdGLCAweDc4NEYsIDB4MzQxRSwgMHg3ODUxLCAweDNDM0MsIDB4Nzg1QywgMHg0QzkzLAotICAgIDB4Nzg1RCwgMHgwOUIzLCAweDc4NjQsIDB4MjE4MCwgMHg3ODY4LCAweDNBMkMsIDB4Nzg2QSwgMHg0NzI4LAotICAgIDB4Nzg2QiwgMHgwRjdBLCAweDc4NkMsIDB4MDdENywgMHg3ODZFLCAweDQyNkYsIDB4Nzg2RiwgMHgwNzVCLAotICAgIDB4Nzg3MiwgMHgwRDM3LCAweDc4NzQsIDB4MTZFMiwgMHg3ODdBLCAweDIxODEsIDB4Nzg3QywgMHgxNkU0LAotICAgIDB4Nzg3RSwgMHg0Qzk0LCAweDc4ODEsIDB4MDc5RiwgMHg3ODg2LCAweDE2RTMsIDB4Nzg4NywgMHgwQzEyLAotICAgIDB4Nzg4QSwgMHg0NzJBLCAweDc4OEMsIDB4MTZFNiwgMHg3ODhELCAweDA1OTUsIDB4Nzg4RSwgMHgxNkUxLAotICAgIDB4Nzg5MSwgMHgwRDdFLCAweDc4OTMsIDB4MDREMiwgMHg3ODk0LCAweDQ3MkIsIDB4Nzg5NSwgMHgwODVDLAotICAgIDB4Nzg5NywgMHgwRkY4LCAweDc4OTgsIDB4NEM5NSwgMHg3ODlBLCAweDE2RTUsIDB4Nzg5RCwgMHg0NzJELAotICAgIDB4Nzg5RSwgMHgzQTJELCAweDc4OUYsIDB4NDcyRSwgMHg3OEExLCAweDRDOTYsIDB4NzhBMywgMHgxNkU3LAotICAgIDB4NzhBNCwgMHg0NzJDLCAweDc4QTcsIDB4MEUxQiwgMHg3OEE5LCAweDBBN0QsIDB4NzhBQSwgMHgxNkU5LAotICAgIDB4NzhBRCwgMHg0MjcyLCAweDc4QUYsIDB4MTZFQSwgMHg3OEIwLCAweDQyNzAsIDB4NzhCMSwgMHg0Qzk3LAotICAgIDB4NzhCMywgMHg0Qzk4LCAweDc4QjUsIDB4MTZFOCwgMHg3OEJBLCAweDA1QUMsIDB4NzhCQiwgMHg0NzJGLAotICAgIDB4NzhCQywgMHgxNkYwLCAweDc4QkUsIDB4MTZFRiwgMHg3OEMxLCAweDA4RDMsIDB4NzhDNSwgMHgxNkYxLAotICAgIDB4NzhDNiwgMHgxNkVDLCAweDc4QzgsIDB4M0EyRSwgMHg3OEM5LCAweDRDOTksIDB4NzhDQSwgMHgxNkYyLAotICAgIDB4NzhDQiwgMHgxNkVELCAweDc4Q0MsIDB4M0EyRiwgMHg3OENFLCAweDNBMzAsIDB4NzhEMCwgMHgwRDZDLAotICAgIDB4NzhEMSwgMHgxNkVCLCAweDc4RDMsIDB4NEM5QSwgMHg3OEQ0LCAweDE2RUUsIDB4NzhENSwgMHg0NzMwLAotICAgIDB4NzhEQSwgMHgxNkY1LCAweDc4RTAsIDB4M0EzMiwgMHg3OEUxLCAweDNBMzMsIDB4NzhFNCwgMHgzQTMxLAotICAgIDB4NzhFNiwgMHg0NzMxLCAweDc4RTcsIDB4MTZGNCwgMHg3OEU4LCAweDBFOEYsIDB4NzhFQywgMHgxNkYzLAotICAgIDB4NzhFRiwgMHgwNEFGLCAweDc4RjIsIDB4M0EzNCwgMHg3OEY0LCAweDE2RjcsIDB4NzhGNywgMHgzQTM1LAotICAgIDB4NzhGOSwgMHg0NzMyLCAweDc4RkEsIDB4NDczMywgMHg3OEZCLCAweDNBMzYsIDB4NzhGRCwgMHgxNkY2LAotICAgIDB4NzhGRSwgMHg0NzM0LCAweDc5MDAsIDB4NDI3MywgMHg3OTAxLCAweDA5QjQsIDB4NzkwNywgMHgxNkY4LAotICAgIDB4NzkwQywgMHg0QzlCLCAweDc5MEUsIDB4MEFDNSwgMHg3OTEwLCAweDQ3MzYsIDB4NzkxMSwgMHgxNkZBLAotICAgIDB4NzkxMiwgMHgxNkY5LCAweDc5MTksIDB4MTZGQiwgMHg3OTFCLCAweDQ3MzcsIDB4NzkxQywgMHg0Mjc0LAotICAgIDB4NzkxRiwgMHg0QzlDLCAweDc5MjUsIDB4NDczOCwgMHg3OTI2LCAweDE2REQsIDB4NzkyNywgMHg0QzlELAotICAgIDB4NzkyOCwgMHg0QzlFLCAweDc5MkEsIDB4MTZERiwgMHg3OTJCLCAweDE2RkQsIDB4NzkyQywgMHgxNkZDLAotICAgIDB4NzkyRSwgMHg0Mjc1LCAweDc5MzAsIDB4MjE4MiwgMHg3OTMxLCAweDNBMzcsIDB4NzkzNCwgMHg0Mjc2LAotICAgIDB4NzkzQSwgMHgwOEQ0LCAweDc5M0IsIDB4M0EzOSwgMHg3OTNDLCAweDBGQjEsIDB4NzkzRCwgMHgzQTNBLAotICAgIDB4NzkzRSwgMHgwOEZFLCAweDc5M0YsIDB4NEM5RiwgMHg3OTQwLCAweDE2RkUsIDB4Nzk0MSwgMHgwNzBELAotICAgIDB4Nzk0MiwgMHg0Q0EwLCAweDc5NDUsIDB4M0EzQiwgMHg3OTQ2LCAweDQyNzcsIDB4Nzk0NywgMHgwNjVBLAotICAgIDB4Nzk0OCwgMHgwNjQxLCAweDc5NDksIDB4MDhCMSwgMHg3OTRBLCAweDQ3MzksIDB4Nzk1MCwgMHgwRjFFLAotICAgIDB4Nzk1MywgMHgxNzA0LCAweDc5NTQsIDB4NENBMSwgMHg3OTU1LCAweDE3MDMsIDB4Nzk1NiwgMHgwQUM2LAotICAgIDB4Nzk1NywgMHgxNzAwLCAweDc5NTgsIDB4NDczQSwgMHg3OTVBLCAweDE3MDIsIDB4Nzk1QiwgMHgzQTNDLAotICAgIDB4Nzk1QywgMHgzQTNELCAweDc5NUQsIDB4MDk1NSwgMHg3OTVFLCAweDBBMDYsIDB4Nzk1RiwgMHgxNzAxLAotICAgIDB4Nzk2MCwgMHgxNkZGLCAweDc5NjIsIDB4MENFMCwgMHg3OTY1LCAweDA5QjUsIDB4Nzk2NywgMHg0NzNDLAotICAgIDB4Nzk2OCwgMHgwREFFLCAweDc5NkIsIDB4NENBMiwgMHg3OTZELCAweDA4NDcsIDB4Nzk3MiwgMHg0NzNELAotICAgIDB4Nzk3NywgMHgwQzcyLCAweDc5NzksIDB4NDI3OCwgMHg3OTdBLCAweDE3MDUsIDB4Nzk3QywgMHg0Q0EzLAotICAgIDB4Nzk3RiwgMHgxNzA2LCAweDc5ODAsIDB4MTcxQywgMHg3OTgxLCAweDA2RDAsIDB4Nzk4NCwgMHgwRkUzLAotICAgIDB4Nzk4NSwgMHgwQUI3LCAweDc5OEEsIDB4MTcwNywgMHg3OThCLCAweDNBM0UsIDB4Nzk4RCwgMHgwNTUyLAotICAgIDB4Nzk4RSwgMHgwQzEzLCAweDc5OEYsIDB4MERGMSwgMHg3OTk0LCAweDIxODYsIDB4Nzk5NSwgMHg0NzNFLAotICAgIDB4Nzk5NiwgMHgzQTNGLCAweDc5OTgsIDB4M0E0MCwgMHg3OTlCLCAweDIxODgsIDB4Nzk5RCwgMHgxNzA4LAotICAgIDB4NzlBMSwgMHg0NzNGLCAweDc5QTYsIDB4MDY5NCwgMHg3OUE3LCAweDE3MDksIDB4NzlBOSwgMHg0NzQwLAotICAgIDB4NzlBQSwgMHgxNzBCLCAweDc5QUIsIDB4NENBNCwgMHg3OUFFLCAweDE3MEMsIDB4NzlCMCwgMHgwQ0RGLAotICAgIDB4NzlCMSwgMHgxRTRFLCAweDc5QjMsIDB4MTcwRCwgMHg3OUI0LCAweDQ3NDEsIDB4NzlCOCwgMHgzQTQxLAotICAgIDB4NzlCOSwgMHgxNzBFLCAweDc5QkEsIDB4MTcwRiwgMHg3OUJCLCAweDNBNDIsIDB4NzlCRCwgMHgwNkQxLAotICAgIDB4NzlCRSwgMHgwNTUzLCAweDc5QkYsIDB4MEM5RCwgMHg3OUMwLCAweDA5MzIsIDB4NzlDMSwgMHgwOEIyLAotICAgIDB4NzlDMiwgMHg0NzQyLCAweDc5QzQsIDB4NENBNSwgMHg3OUM3LCAweDQ3NDMsIDB4NzlDOCwgMHg0Mjc5LAotICAgIDB4NzlDOSwgMHgxNzEwLCAweDc5Q0EsIDB4M0E0MywgMHg3OUNCLCAweDA5MzMsIDB4NzlDQywgMHg0NzQ0LAotICAgIDB4NzlDRCwgMHg0NzQ1LCAweDc5RDEsIDB4MDU0QSwgMHg3OUQyLCAweDBEQjUsIDB4NzlENCwgMHg0MjdCLAotICAgIDB4NzlENSwgMHgxNzExLCAweDc5RDYsIDB4NDc0NiwgMHg3OUQ4LCAweDBEN0YsIDB4NzlEQSwgMHgzQTQ0LAotICAgIDB4NzlERSwgMHg0MjdDLCAweDc5REYsIDB4MEFDNywgMHg3OUUxLCAweDE3MTQsIDB4NzlFMywgMHgxNzE1LAotICAgIDB4NzlFNCwgMHgwRDFGLCAweDc5RTYsIDB4MEEwNywgMHg3OUU3LCAweDE3MTIsIDB4NzlFOSwgMHgwQjlGLAotICAgIDB4NzlFQSwgMHg0Q0E2LCAweDc5RUIsIDB4NDI3RCwgMHg3OUVDLCAweDE3MTMsIDB4NzlFRCwgMHg0MjdFLAotICAgIDB4NzlGMCwgMHgwOUI2LCAweDc5RkIsIDB4MDRBMCwgMHg3QTAwLCAweDA2NDMsIDB4N0EwMiwgMHg0Q0E3LAotICAgIDB4N0EwMywgMHgzQTQ1LCAweDdBMDUsIDB4MzYzMywgMHg3QTA4LCAweDE3MTYsIDB4N0EwOSwgMHgzQTQ2LAotICAgIDB4N0EwQSwgMHg0NzRCLCAweDdBMEIsIDB4MEMxNCwgMHg3QTBDLCAweDRDQTgsIDB4N0EwRCwgMHgxNzE3LAotICAgIDB4N0EwRSwgMHgwQTZCLCAweDdBMTEsIDB4M0E0NywgMHg3QTE0LCAweDBFQjksIDB4N0ExNSwgMHg0NzRDLAotICAgIDB4N0ExNywgMHgwRDk1LCAweDdBMTgsIDB4MTcxOCwgMHg3QTE5LCAweDE3MTksIDB4N0ExQSwgMHgwQjkzLAotICAgIDB4N0ExQiwgMHg0NzRELCAweDdBMUMsIDB4MEY4RiwgMHg3QTFFLCAweDNBNDgsIDB4N0ExRiwgMHgxNzFCLAotICAgIDB4N0EyMCwgMHgxNzFBLCAweDdBMkQsIDB4M0E0OSwgMHg3QTJFLCAweDA5MUIsIDB4N0EzMCwgMHg0Q0E5LAotICAgIDB4N0EzMSwgMHgxNzFELCAweDdBMzIsIDB4MDRCNCwgMHg3QTM3LCAweDE3MjAsIDB4N0EzOCwgMHg0NzRGLAotICAgIDB4N0EzOSwgMHgzQTRBLCAweDdBM0EsIDB4NENBQSwgMHg3QTNCLCAweDE3MUUsIDB4N0EzQywgMHgwNTU0LAotICAgIDB4N0EzRCwgMHgwNzI0LCAweDdBM0UsIDB4MTcxRiwgMHg3QTNGLCAweDA3RDgsIDB4N0E0MCwgMHgwODA0LAotICAgIDB4N0E0MiwgMHgwRTM2LCAweDdBNDMsIDB4MTcyMSwgMHg3QTQ0LCAweDRDQUIsIDB4N0E0NSwgMHgzQTRCLAotICAgIDB4N0E0NiwgMHgwRTgyLCAweDdBNDcsIDB4NDc1MCwgMHg3QTQ5LCAweDE3MjMsIDB4N0E0QywgMHgzQTRDLAotICAgIDB4N0E0RCwgMHgwQTc1LCAweDdBNEUsIDB4MDRGMSwgMHg3QTRGLCAweDA1M0EsIDB4N0E1MCwgMHgwNDcwLAotICAgIDB4N0E1NiwgMHg0NzUxLCAweDdBNTcsIDB4MTcyMiwgMHg3QTU5LCAweDQ3NTIsIDB4N0E1QywgMHg0NzUzLAotICAgIDB4N0E1RCwgMHgzQTRELCAweDdBNUYsIDB4NDc1NCwgMHg3QTYwLCAweDRGNTYsIDB4N0E2MSwgMHgxNzI0LAotICAgIDB4N0E2MiwgMHgxNzI1LCAweDdBNjMsIDB4MDlERiwgMHg3QTY3LCAweDQ3NTUsIDB4N0E2OSwgMHgxNzI2LAotICAgIDB4N0E2QSwgMHg0NzU2LCAweDdBNkIsIDB4MDVBRCwgMHg3QTZELCAweDNBNEYsIDB4N0E3MCwgMHgxNzI4LAotICAgIDB4N0E3NCwgMHgwNzQwLCAweDdBNzUsIDB4NDc1NywgMHg3QTc2LCAweDA2ODAsIDB4N0E3OCwgMHgzQTUwLAotICAgIDB4N0E3OSwgMHgxNzI5LCAweDdBN0EsIDB4MDZFRCwgMHg3QTdELCAweDE3MkEsIDB4N0E3RiwgMHgwQUEwLAotICAgIDB4N0E4MCwgMHg0Q0FDLCAweDdBODEsIDB4MENBNSwgMHg3QTgyLCAweDQ3NTgsIDB4N0E4MywgMHgwQTg0LAotICAgIDB4N0E4NCwgMHgwODY1LCAweDdBODUsIDB4NDI3RiwgMHg3QTg2LCAweDRDQUQsIDB4N0E4OCwgMHgxNzJCLAotICAgIDB4N0E4QSwgMHg0NzU5LCAweDdBOTAsIDB4NDc1QSwgMHg3QTkyLCAweDBCQTAsIDB4N0E5MywgMHgwQUVELAotICAgIDB4N0E5NCwgMHg0Q0FFLCAweDdBOTUsIDB4MTcyRCwgMHg3QTk2LCAweDE3MkYsIDB4N0E5NywgMHgxNzJDLAotICAgIDB4N0E5OCwgMHgxNzJFLCAweDdBOUYsIDB4MDZGOCwgMHg3QUEwLCAweDNBNTEsIDB4N0FBMywgMHgzQTUyLAotICAgIDB4N0FBOSwgMHgxNzMwLCAweDdBQUEsIDB4MDZGQywgMHg3QUFDLCAweDQ3NUIsIDB4N0FBRSwgMHgwNjgxLAotICAgIDB4N0FBRiwgMHgwRjNDLCAweDdBQjAsIDB4MTczMiwgMHg3QUIzLCAweDNBNTMsIDB4N0FCNSwgMHg0Q0FGLAotICAgIDB4N0FCNiwgMHgxNzMzLCAweDdBQjksIDB4NDc1RSwgMHg3QUJBLCAweDA0RDAsIDB4N0FCQiwgMHgzQTU0LAotICAgIDB4N0FCQywgMHgzQTU1LCAweDdBQkQsIDB4NENCMCwgMHg3QUJFLCAweDQ3NUYsIDB4N0FCRiwgMHgxNzM2LAotICAgIDB4N0FDMywgMHgwNUQ0LCAweDdBQzQsIDB4MTczNSwgMHg3QUM1LCAweDE3MzQsIDB4N0FDNiwgMHgzQTU2LAotICAgIDB4N0FDNywgMHgxNzM4LCAweDdBQzgsIDB4MTczMSwgMHg3QUNBLCAweDE3MzksIDB4N0FDQiwgMHgwRjcxLAotICAgIDB4N0FDQywgMHg0NzYxLCAweDdBQ0QsIDB4MTczQSwgMHg3QUNFLCAweDQyODEsIDB4N0FDRiwgMHgxNzNCLAotICAgIDB4N0FEMSwgMHgyMTg5LCAweDdBRDIsIDB4MTFDNSwgMHg3QUQzLCAweDE3M0QsIDB4N0FENSwgMHgxNzNDLAotICAgIDB4N0FEOSwgMHgxNzNFLCAweDdBREEsIDB4MTczRiwgMHg3QURDLCAweDBGN0QsIDB4N0FERCwgMHgxNzQwLAotICAgIDB4N0FERiwgMHgxQzA4LCAweDdBRTAsIDB4MDlCNywgMHg3QUUxLCAweDE3NDEsIDB4N0FFMiwgMHgxNzQyLAotICAgIDB4N0FFMywgMHgwOTYxLCAweDdBRTUsIDB4MEM5MCwgMHg3QUU2LCAweDE3NDMsIDB4N0FFNywgMHgyMThBLAotICAgIDB4N0FFOCwgMHg0NzYyLCAweDdBRUEsIDB4MEI2NiwgMHg3QUVCLCAweDIxOEMsIDB4N0FFRCwgMHgxNzQ0LAotICAgIDB4N0FFRiwgMHgwQjdBLCAweDdBRjAsIDB4MTc0NSwgMHg3QUY0LCAweDQ3NjMsIDB4N0FGNiwgMHgwNjlELAotICAgIDB4N0FGOCwgMHgxMDc2LCAweDdBRjksIDB4MEI5QiwgMHg3QUZBLCAweDA4REYsIDB4N0FGRCwgMHg0MjgyLAotICAgIDB4N0FGRSwgMHg0Q0IxLCAweDdBRkYsIDB4MDYwNCwgMHg3QjAyLCAweDE3NDYsIDB4N0IwNCwgMHgxNzUzLAotICAgIDB4N0IwNiwgMHgxNzQ5LCAweDdCMDcsIDB4M0E1NywgMHg3QjA4LCAweDA2ODIsIDB4N0IwQSwgMHgxNzQ4LAotICAgIDB4N0IwQiwgMHgxNzU1LCAweDdCMEYsIDB4MTc0NywgMHg3QjExLCAweDA5QjgsIDB4N0IxMiwgMHg0MjgzLAotICAgIDB4N0IxNCwgMHgzQTU4LCAweDdCMTgsIDB4MTc0QiwgMHg3QjE5LCAweDE3NEMsIDB4N0IxQiwgMHgwQzI1LAotICAgIDB4N0IxRSwgMHgxNzRELCAweDdCMjAsIDB4MDVCQywgMHg3QjI1LCAweDBBMjAsIDB4N0IyNiwgMHgwREQ2LAotICAgIDB4N0IyNywgMHgzQTU5LCAweDdCMjgsIDB4MTc0RiwgMHg3QjJBLCAweDQ3NjgsIDB4N0IyQiwgMHg0Q0IyLAotICAgIDB4N0IyQywgMHgwQjQ4LCAweDdCMkQsIDB4NDI4NCwgMHg3QjJFLCAweDQ3NjksIDB4N0IyRiwgMHg0NzZBLAotICAgIDB4N0IzMSwgMHgzQTVBLCAweDdCMzMsIDB4MTc0QSwgMHg3QjM1LCAweDE3NEUsIDB4N0IzNiwgMHgxNzUwLAotICAgIDB4N0IzOSwgMHgwODZCLCAweDdCM0IsIDB4NDI4NSwgMHg3QjNELCAweDQ3NjcsIDB4N0I0MSwgMHg0NzZFLAotICAgIDB4N0I0NSwgMHgxNzU3LCAweDdCNDYsIDB4MERBMCwgMHg3QjQ3LCAweDNBNUIsIDB4N0I0OCwgMHgwRDNBLAotICAgIDB4N0I0OSwgMHgwQzczLCAweDdCNEIsIDB4MDZEMiwgMHg3QjRDLCAweDE3NTYsIDB4N0I0RCwgMHgxNzU0LAotICAgIDB4N0I0RSwgMHgzQTVDLCAweDdCNEYsIDB4MEQ0OSwgMHg3QjUwLCAweDE3NTEsIDB4N0I1MSwgMHgwQjlDLAotICAgIDB4N0I1MiwgMHgwQzc1LCAweDdCNTMsIDB4Mzc1RCwgMHg3QjU0LCAweDBDNzQsIDB4N0I1NSwgMHg0NzcwLAotICAgIDB4N0I1NiwgMHgwODY2LCAweDdCNUQsIDB4MTc2OSwgMHg3QjYwLCAweDNBNUQsIDB4N0I2NCwgMHg0NzcyLAotICAgIDB4N0I2NSwgMHgxNzU5LCAweDdCNjYsIDB4NDc3MywgMHg3QjY3LCAweDE3NUIsIDB4N0I2OSwgMHgzQTVFLAotICAgIDB4N0I2QywgMHgxNzVFLCAweDdCNkQsIDB4M0E1RiwgMHg3QjZFLCAweDE3NUYsIDB4N0I2RiwgMHg0Mjg2LAotICAgIDB4N0I3MCwgMHgxNzVDLCAweDdCNzEsIDB4MTc1RCwgMHg3QjcyLCAweDNBNjAsIDB4N0I3MywgMHg0Nzc0LAotICAgIDB4N0I3NCwgMHgxNzVBLCAweDdCNzUsIDB4MTc1OCwgMHg3Qjc3LCAweDRDQjMsIDB4N0I3OSwgMHg0NzcxLAotICAgIDB4N0I3QSwgMHgxNzUyLCAweDdCN0YsIDB4NDc2RCwgMHg3Qjg2LCAweDBFMUYsIDB4N0I4NywgMHgwNTU1LAotICAgIDB4N0I4QiwgMHgxNzY2LCAweDdCOEQsIDB4MTc2MywgMHg3QjhGLCAweDE3NjgsIDB4N0I5MCwgMHg0Nzc3LAotICAgIDB4N0I5MSwgMHgzQTYxLCAweDdCOTIsIDB4MTc2NywgMHg3Qjk0LCAweDBEMjksIDB4N0I5NSwgMHgwRUIzLAotICAgIDB4N0I5NywgMHgwODg5LCAweDdCOTgsIDB4MTc2MSwgMHg3Qjk5LCAweDE3NkEsIDB4N0I5QSwgMHgxNzY1LAotICAgIDB4N0I5QiwgMHg0Nzc4LCAweDdCOUMsIDB4MTc2NCwgMHg3QjlELCAweDE3NjAsIDB4N0I5RSwgMHgyMThELAotICAgIDB4N0I5RiwgMHgxNzYyLCAweDdCQTAsIDB4NENCNCwgMHg3QkExLCAweDA2MDUsIDB4N0JBQSwgMHgwQjdCLAotICAgIDB4N0JBQywgMHg0Q0I1LCAweDdCQUQsIDB4MEFBMSwgMHg3QkFGLCAweDNBNjIsIDB4N0JCMCwgMHg0Q0I2LAotICAgIDB4N0JCMSwgMHgwRDM2LCAweDdCQjQsIDB4MTc2RiwgMHg3QkI1LCAweDQ3N0EsIDB4N0JCOCwgMHgwRDM4LAotICAgIDB4N0JCQywgMHg0NzdCLCAweDdCQzAsIDB4MEE4NSwgMHg3QkMxLCAweDE3NkMsIDB4N0JDNCwgMHgwRDYzLAotICAgIDB4N0JDNSwgMHg0NzdDLCAweDdCQzYsIDB4MTc3MCwgMHg3QkM3LCAweDBFMjMsIDB4N0JDOSwgMHgwQjk5LAotICAgIDB4N0JDQSwgMHg0NzdELCAweDdCQ0IsIDB4MTc2QiwgMHg3QkNDLCAweDE3NkQsIDB4N0JDRiwgMHgxNzZFLAotICAgIDB4N0JENCwgMHg0NzgwLCAweDdCRDYsIDB4NDc4MSwgMHg3QkQ3LCAweDNBNjMsIDB4N0JEOSwgMHgzQTY0LAotICAgIDB4N0JEQSwgMHg0NzgyLCAweDdCREQsIDB4MTc3MSwgMHg3QkUwLCAweDA4RjAsIDB4N0JFNCwgMHgwQzlFLAotICAgIDB4N0JFNSwgMHgxNzc2LCAweDdCRTYsIDB4MTc3NSwgMHg3QkU4LCAweDRDQjcsIDB4N0JFOSwgMHgxNzcyLAotICAgIDB4N0JFQSwgMHg0NzgzLCAweDdCRUQsIDB4MEZEQywgMHg3QkYwLCAweDQ3ODQsIDB4N0JGMiwgMHg0Q0I4LAotICAgIDB4N0JGMywgMHgxNzdCLCAweDdCRjYsIDB4MTc3RiwgMHg3QkY3LCAweDE3N0MsIDB4N0JGOCwgMHg0Q0I5LAotICAgIDB4N0JGQywgMHg0Q0JBLCAweDdCRkUsIDB4NENCQiwgMHg3QzAwLCAweDE3NzgsIDB4N0MwMSwgMHg0Mjg3LAotICAgIDB4N0MwMywgMHg0Nzg1LCAweDdDMDcsIDB4MTc3OSwgMHg3QzA5LCAweDRDQkMsIDB4N0MwQiwgMHgzQTY1LAotICAgIDB4N0MwRCwgMHgxNzdFLCAweDdDMEUsIDB4NDc4NiwgMHg3QzBGLCAweDNBNjYsIDB4N0MxMSwgMHgxNzczLAotICAgIDB4N0MxMiwgMHgxMEVBLCAweDdDMTMsIDB4MTc3QSwgMHg3QzE0LCAweDE3NzQsIDB4N0MxNywgMHgxNzdELAotICAgIDB4N0MxRSwgMHgxRTNCLCAweDdDMUYsIDB4MTc4MywgMHg3QzIwLCAweDNBNjcsIDB4N0MyMSwgMHgwNjA2LAotICAgIDB4N0MyMywgMHgxNzgwLCAweDdDMjYsIDB4M0E2OCwgMHg3QzI3LCAweDE3ODEsIDB4N0MyOCwgMHg0Q0JELAotICAgIDB4N0MyQSwgMHgxNzgyLCAweDdDMkIsIDB4MTc4NSwgMHg3QzJGLCAweDRDQkUsIDB4N0MzMSwgMHgzQTY5LAotICAgIDB4N0MzMywgMHg0Mjg4LCAweDdDMzYsIDB4M0E2QSwgMHg3QzM3LCAweDE3ODQsIDB4N0MzOCwgMHgwRDhBLAotICAgIDB4N0MzRCwgMHgxNzg2LCAweDdDM0UsIDB4MEZDNCwgMHg3QzNGLCAweDBFM0QsIDB4N0M0MCwgMHgxNzhCLAotICAgIDB4N0M0MiwgMHg0Q0JGLCAweDdDNDMsIDB4MTc4OCwgMHg3QzQ1LCAweDQ3ODcsIDB4N0M0QSwgMHg0Nzg4LAotICAgIDB4N0M0QywgMHgxNzg3LCAweDdDNEQsIDB4MEE3NiwgMHg3QzRGLCAweDE3OEEsIDB4N0M1MCwgMHgxNzhDLAotICAgIDB4N0M1MSwgMHgzQTZCLCAweDdDNTIsIDB4NENDMCwgMHg3QzUzLCAweDRDQzEsIDB4N0M1NCwgMHgxNzg5LAotICAgIDB4N0M1NiwgMHgxNzkwLCAweDdDNTcsIDB4NDc4OSwgMHg3QzU4LCAweDE3OEQsIDB4N0M1OSwgMHgzQTZDLAotICAgIDB4N0M1QiwgMHg0Q0MyLCAweDdDNUMsIDB4NENDMywgMHg3QzVELCAweDRDQzQsIDB4N0M1RSwgMHg0NzhBLAotICAgIDB4N0M1RiwgMHgxNzhFLCAweDdDNjAsIDB4MTc3NywgMHg3QzYxLCAweDQ3OEIsIDB4N0M2NCwgMHgxNzhGLAotICAgIDB4N0M2NSwgMHgxNzkxLCAweDdDNjcsIDB4M0E2RCwgMHg3QzY5LCAweDQ3OEMsIDB4N0M2QywgMHgxNzkyLAotICAgIDB4N0M2RCwgMHg0MjhBLCAweDdDNkUsIDB4M0E2RSwgMHg3QzZGLCAweDQ3OEQsIDB4N0M3MCwgMHgzQTZGLAotICAgIDB4N0M3MiwgMHg0Q0M1LCAweDdDNzMsIDB4MEUxNiwgMHg3Qzc1LCAweDE3OTMsIDB4N0M3OSwgMHg0MjhCLAotICAgIDB4N0M3QiwgMHgzNzBFLCAweDdDN0QsIDB4NENDNiwgMHg3QzdFLCAweDBFRUUsIDB4N0M4MSwgMHgwNkM2LAotICAgIDB4N0M4MiwgMHgwNkZGLCAweDdDODMsIDB4MTc5NCwgMHg3Qzg3LCAweDRDQzcsIDB4N0M4OSwgMHgwRTA0LAotICAgIDB4N0M4QiwgMHgwQTJFLCAweDdDOEQsIDB4MEVCQywgMHg3QzhGLCAweDQyOEMsIDB4N0M5MCwgMHgxNzk1LAotICAgIDB4N0M5MiwgMHgwRjdCLCAweDdDOTQsIDB4NDI4RCwgMHg3Qzk1LCAweDBEMkEsIDB4N0M5NywgMHgwQUM4LAotICAgIDB4N0M5OCwgMHgwQ0VBLCAweDdDOUIsIDB4MDk1NywgMHg3QzlFLCAweDRDQzgsIDB4N0M5RiwgMHgwNDg0LAotICAgIDB4N0NBMCwgMHg0MjhFLCAweDdDQTEsIDB4MTc5QSwgMHg3Q0EyLCAweDE3OTgsIDB4N0NBNCwgMHgxNzk2LAotICAgIDB4N0NBNSwgMHgwNURELCAweDdDQTYsIDB4NDc5MSwgMHg3Q0E3LCAweDA5QjksIDB4N0NBOCwgMHgxNzlCLAotICAgIDB4N0NBQiwgMHgxNzk5LCAweDdDQUQsIDB4MTc5NywgMHg3Q0FFLCAweDE3OUYsIDB4N0NCMSwgMHgxNzlFLAotICAgIDB4N0NCMiwgMHgxNzlELCAweDdDQjMsIDB4MTc5QywgMHg3Q0I2LCAweDQ3OTMsIDB4N0NCNywgMHg0Nzk0LAotICAgIDB4N0NCOSwgMHgxN0EwLCAweDdDQkEsIDB4NENDOSwgMHg3Q0JDLCAweDNBNzAsIDB4N0NCRCwgMHgxN0ExLAotICAgIDB4N0NCRSwgMHgwQTVFLCAweDdDQkYsIDB4M0E3MSwgMHg3Q0MwLCAweDE3QTIsIDB4N0NDMiwgMHgxN0E0LAotICAgIDB4N0NDNCwgMHg0Nzk2LCAweDdDQzUsIDB4MTdBMywgMHg3Q0M3LCAweDRDQ0EsIDB4N0NDOCwgMHgzQTcyLAotICAgIDB4N0NDOSwgMHgzQTczLCAweDdDQ0EsIDB4MDc4NiwgMHg3Q0NELCAweDQ3OTgsIDB4N0NDRSwgMHgwQUJBLAotICAgIDB4N0NEMiwgMHgxN0E2LCAweDdDRDMsIDB4NENDQiwgMHg3Q0Q1LCAweDQyOEYsIDB4N0NENiwgMHgwQzc2LAotICAgIDB4N0NENywgMHgzQTc0LCAweDdDRDgsIDB4MTdBNSwgMHg3Q0Q5LCAweDNBNzUsIDB4N0NEQSwgMHg0Q0NDLAotICAgIDB4N0NEQywgMHgxN0E3LCAweDdDREQsIDB4M0E3NiwgMHg3Q0RFLCAweDBFMDUsIDB4N0NERiwgMHgwQUVFLAotICAgIDB4N0NFMCwgMHgwN0Q5LCAweDdDRTIsIDB4MTdBOCwgMHg3Q0U2LCAweDQ3OUIsIDB4N0NFNywgMHgwRjkwLAotICAgIDB4N0NFQiwgMHgzQTc3LCAweDdDRUYsIDB4MTdBQSwgMHg3Q0YyLCAweDE3QUIsIDB4N0NGNCwgMHgxN0FDLAotICAgIDB4N0NGNSwgMHg0NzlELCAweDdDRjYsIDB4MTdBRCwgMHg3Q0Y4LCAweDA4QjMsIDB4N0NGQSwgMHgxN0FFLAotICAgIDB4N0NGQiwgMHgwNzI1LCAweDdDRkUsIDB4MDY4NCwgMHg3RDAwLCAweDA2NDQsIDB4N0QwMiwgMHgxN0IwLAotICAgIDB4N0QwMywgMHg0NzlFLCAweDdEMDQsIDB4MEVGRiwgMHg3RDA1LCAweDA3REEsIDB4N0QwNiwgMHgxN0FGLAotICAgIDB4N0QwNywgMHgzQTc4LCAweDdEMDgsIDB4M0E3OSwgMHg3RDA5LCAweDNBN0EsIDB4N0QwQSwgMHgxN0IzLAotICAgIDB4N0QwQiwgMHgwRUYyLCAweDdEMEQsIDB4MENGMiwgMHg3RDEwLCAweDBEQTUsIDB4N0QxMiwgMHg0N0EwLAotICAgIDB4N0QxMywgMHgzQTdCLCAweDdEMTQsIDB4MDk2RCwgMHg3RDE1LCAweDE3QjIsIDB4N0QxNywgMHgwOEZGLAotICAgIDB4N0QxOCwgMHgwN0RCLCAweDdEMTksIDB4MDhCNCwgMHg3RDFBLCAweDA2ODMsIDB4N0QxQiwgMHgwRTA2LAotICAgIDB4N0QxQywgMHgxN0IxLCAweDdEMUQsIDB4M0E3QywgMHg3RDFFLCAweDQ3QTEsIDB4N0QyMCwgMHgwQUM5LAotICAgIDB4N0QyMSwgMHgwRTcwLCAweDdEMjIsIDB4MDg2NywgMHg3RDIzLCAweDNBN0QsIDB4N0QyQiwgMHgwOEI1LAotICAgIDB4N0QyQywgMHgwQkY5LCAweDdEMkUsIDB4MTdCNiwgMHg3RDJGLCAweDBGQTcsIDB4N0QzMCwgMHgwODQ5LAotICAgIDB4N0QzMSwgMHg0MjkwLCAweDdEMzIsIDB4MTdCNywgMHg3RDMzLCAweDBBMDgsIDB4N0QzNSwgMHgxN0I5LAotICAgIDB4N0QzOSwgMHgwOUJBLCAweDdEM0EsIDB4MDgyMCwgMHg3RDNDLCAweDRDQ0QsIDB4N0QzRCwgMHg0N0E0LAotICAgIDB4N0QzRSwgMHg0N0E1LCAweDdEM0YsIDB4MTdCOCwgMHg3RDQwLCAweDQ3QTYsIDB4N0Q0MSwgMHgzQTdFLAotICAgIDB4N0Q0MiwgMHgwOTM0LCAweDdENDMsIDB4MDc3MiwgMHg3RDQ0LCAweDBBQ0EsIDB4N0Q0NSwgMHgxN0I0LAotICAgIDB4N0Q0NiwgMHgxN0JBLCAweDdENDcsIDB4NDdBNywgMHg3RDQ4LCAweDIxOEYsIDB4N0Q0QiwgMHgxN0I1LAotICAgIDB4N0Q0QywgMHgwNzI2LCAweDdENEQsIDB4NENDRSwgMHg3RDRFLCAweDE3QkQsIDB4N0Q0RiwgMHgxN0MxLAotICAgIDB4N0Q1MCwgMHgwNzQxLCAweDdENTMsIDB4M0E3RiwgMHg3RDU1LCAweDM2M0EsIDB4N0Q1NiwgMHgxN0JDLAotICAgIDB4N0Q1OSwgMHgzQTgwLCAweDdENUEsIDB4NDdBQiwgMHg3RDVCLCAweDE3QzUsIDB4N0Q1QywgMHg0MjkxLAotICAgIDB4N0Q1RCwgMHgzQTgxLCAweDdENUUsIDB4MDdEQywgMHg3RDYxLCAweDBGNTcsIDB4N0Q2MiwgMHgwNDgwLAotICAgIDB4N0Q2MywgMHgxN0MyLCAweDdENjYsIDB4MDY4NSwgMHg3RDY4LCAweDE3QkYsIDB4N0Q2QSwgMHg0N0FDLAotICAgIDB4N0Q2RSwgMHgxN0MwLCAweDdENzAsIDB4NDdBRCwgMHg3RDcxLCAweDBDNzcsIDB4N0Q3MiwgMHgxN0JFLAotICAgIDB4N0Q3MywgMHgxN0JCLCAweDdENzUsIDB4MDU4NiwgMHg3RDc2LCAweDBBODgsIDB4N0Q3OSwgMHgwNzVDLAotICAgIDB4N0Q3QSwgMHgzQTgyLCAweDdEN0QsIDB4MTdDNywgMHg3RDdGLCAweDQ3QUYsIDB4N0Q4MiwgMHg0Q0NGLAotICAgIDB4N0Q4MywgMHg0MjkyLCAweDdEODUsIDB4NENEMCwgMHg3RDg2LCAweDNBODMsIDB4N0Q4OCwgMHg0N0IxLAotICAgIDB4N0Q4OSwgMHgxN0M0LCAweDdEOEIsIDB4M0E4NCwgMHg3RDhDLCAweDNBODUsIDB4N0Q4RCwgMHg0Q0QxLAotICAgIDB4N0Q4RiwgMHgxN0M2LCAweDdEOTEsIDB4NENEMiwgMHg3RDkzLCAweDE3QzMsIDB4N0Q5NywgMHg0N0IyLAotICAgIDB4N0Q5OSwgMHgwNzI3LCAweDdEOUEsIDB4MEIxMywgMHg3RDlCLCAweDE3QzgsIDB4N0Q5QywgMHgwQUYwLAotICAgIDB4N0Q5RCwgMHg0N0I0LCAweDdEOUUsIDB4NENEMywgMHg3RDlGLCAweDE3RDUsIDB4N0RBMCwgMHgyMTkyLAotICAgIDB4N0RBMiwgMHgxN0QxLCAweDdEQTMsIDB4MTdDQiwgMHg3REE2LCAweDQyOTMsIDB4N0RBNywgMHg0N0I1LAotICAgIDB4N0RBQSwgMHg0N0I2LCAweDdEQUIsIDB4MTdDRiwgMHg3REFDLCAweDA5MjYsIDB4N0RBRCwgMHgwNEExLAotICAgIDB4N0RBRSwgMHgxN0NBLCAweDdEQUYsIDB4MTdEMiwgMHg3REIwLCAweDE3RDYsIDB4N0RCMSwgMHgwN0RELAotICAgIDB4N0RCMiwgMHgwRUUyLCAweDdEQjMsIDB4NENENCwgMHg3REI0LCAweDBCRjIsIDB4N0RCNSwgMHgxN0NDLAotICAgIDB4N0RCNiwgMHg0N0I3LCAweDdEQjcsIDB4MjE5MSwgMHg3REI4LCAweDE3RDQsIDB4N0RCOSwgMHg0Q0Q1LAotICAgIDB4N0RCQSwgMHgxN0M5LCAweDdEQkIsIDB4MEI3QywgMHg3REJELCAweDE3Q0UsIDB4N0RCRSwgMHgwNDgxLAotICAgIDB4N0RCRiwgMHgwRUQ2LCAweDdEQzAsIDB4NDdCOCwgMHg3REMyLCAweDQyOTQsIDB4N0RDNywgMHgxN0NELAotICAgIDB4N0RDQSwgMHgwNkQzLCAweDdEQ0IsIDB4MEQ4MCwgMHg3RENDLCAweDNBODYsIDB4N0RDRiwgMHgwQUVGLAotICAgIDB4N0REMCwgMHg0Q0Q2LCAweDdERDEsIDB4MEY5OCwgMHg3REQyLCAweDA5NzksIDB4N0RENSwgMHgxN0ZELAotICAgIDB4N0RENiwgMHgyMTkzLCAweDdERDcsIDB4NDdCOSwgMHg3REQ4LCAweDE3RDcsIDB4N0REOSwgMHg0N0JBLAotICAgIDB4N0REQSwgMHgwQUEyLCAweDdEREMsIDB4MTdEMywgMHg3RERELCAweDE3RDgsIDB4N0RERSwgMHgxN0RBLAotICAgIDB4N0RFMCwgMHgwQzE1LCAweDdERTEsIDB4MTdERCwgMHg3REUzLCAweDM0MEEsIDB4N0RFNCwgMHgxN0Q5LAotICAgIDB4N0RFNSwgMHg0Q0Q3LCAweDdERTYsIDB4NDdCQiwgMHg3REU4LCAweDBFMjQsIDB4N0RFOSwgMHgwNjA3LAotICAgIDB4N0RFQiwgMHgzQTg3LCAweDdERUMsIDB4MEVENywgMHg3REVGLCAweDA0QTIsIDB4N0RGMSwgMHgzQTg4LAotICAgIDB4N0RGMiwgMHgxN0RDLCAweDdERjQsIDB4MEZDNSwgMHg3REY1LCAweDRDRDgsIDB4N0RGNiwgMHg0Q0Q5LAotICAgIDB4N0RGOSwgMHgzQTg5LCAweDdERkIsIDB4MTdEQiwgMHg3RTAxLCAweDA1MTEsIDB4N0UwNCwgMHgwQ0M0LAotICAgIDB4N0UwNSwgMHgxN0RFLCAweDdFMDgsIDB4M0E4QSwgMHg3RTA5LCAweDE3RTUsIDB4N0UwQSwgMHgxN0RGLAotICAgIDB4N0UwQiwgMHgxN0U2LCAweDdFMTAsIDB4NDdCRiwgMHg3RTExLCAweDNBOEIsIDB4N0UxMiwgMHgxN0UyLAotICAgIDB4N0UxNSwgMHgzQThDLCAweDdFMTcsIDB4NDdDMCwgMHg3RTFCLCAweDBEMzEsIDB4N0UxRCwgMHg0N0MxLAotICAgIDB4N0UxRSwgMHgwOEY2LCAweDdFMUYsIDB4MTdFNCwgMHg3RTIwLCAweDNBOEQsIDB4N0UyMSwgMHgxN0UxLAotICAgIDB4N0UyMiwgMHgxN0U3LCAweDdFMjMsIDB4MTdFMCwgMHg3RTI2LCAweDA5NEUsIDB4N0UyNywgMHg0N0MyLAotICAgIDB4N0UyOCwgMHg0Mjk1LCAweDdFMkIsIDB4MEU1MywgMHg3RTJDLCAweDQ3QzMsIDB4N0UyRSwgMHgwOTU2LAotICAgIDB4N0UyRiwgMHg0Q0RBLCAweDdFMzEsIDB4MTdFMywgMHg3RTMyLCAweDE3RUYsIDB4N0UzNSwgMHgxN0VCLAotICAgIDB4N0UzNiwgMHg0Q0RCLCAweDdFMzcsIDB4MTdFRSwgMHg3RTM5LCAweDE3RUMsIDB4N0UzQSwgMHgxN0YwLAotICAgIDB4N0UzQiwgMHgxN0VBLCAweDdFM0QsIDB4MTdEMCwgMHg3RTNFLCAweDBBNzcsIDB4N0U0MSwgMHgwRDVGLAotICAgIDB4N0U0MywgMHgxN0VELCAweDdFNDQsIDB4NENEQywgMHg3RTQ1LCAweDQ3QzQsIDB4N0U0NiwgMHgxN0U4LAotICAgIDB4N0U0NywgMHgzQThFLCAweDdFNDgsIDB4Mzc2NywgMHg3RTRBLCAweDBBQTMsIDB4N0U0QiwgMHgwNzI4LAotICAgIDB4N0U0RCwgMHgwOTM1LCAweDdFNTIsIDB4MjE5NCwgMHg3RTU0LCAweDA5RUIsIDB4N0U1NSwgMHgwQUI4LAotICAgIDB4N0U1NiwgMHgxN0YzLCAweDdFNTksIDB4MTdGNSwgMHg3RTVBLCAweDE3RjYsIDB4N0U1RCwgMHgxN0YyLAotICAgIDB4N0U1RSwgMHgxN0Y0LCAweDdFNjEsIDB4MUUxMSwgMHg3RTYyLCAweDNBOEYsIDB4N0U2NiwgMHgxN0U5LAotICAgIDB4N0U2NywgMHgxN0YxLCAweDdFNjksIDB4MTdGOSwgMHg3RTZBLCAweDE3RjgsIDB4N0U2QiwgMHgxREY3LAotICAgIDB4N0U2RCwgMHgwRUE4LCAweDdFNkUsIDB4M0E5MCwgMHg3RTZGLCAweDRDREQsIDB4N0U3MCwgMHgwNzAxLAotICAgIDB4N0U3MywgMHgzQTkxLCAweDdFNzUsIDB4NDdDNSwgMHg3RTc4LCAweDRDREUsIDB4N0U3OSwgMHgxN0Y3LAotICAgIDB4N0U3QiwgMHgxN0ZCLCAweDdFN0MsIDB4MTdGQSwgMHg3RTdELCAweDE3RkUsIDB4N0U3RSwgMHg0N0M2LAotICAgIDB4N0U3RiwgMHgxODAwLCAweDdFODEsIDB4NENERiwgMHg3RTgyLCAweDA4OEEsIDB4N0U4MywgMHgxN0ZDLAotICAgIDB4N0U4NiwgMHg0N0M3LCAweDdFODcsIDB4NDdDOCwgMHg3RTg4LCAweDE4MDEsIDB4N0U4OSwgMHgxODAyLAotICAgIDB4N0U4QSwgMHgyMEE3LCAweDdFOEMsIDB4MTgwMywgMHg3RThELCAweDNBOTIsIDB4N0U4RSwgMHgxODA5LAotICAgIDB4N0U4RiwgMHgwQzM1LCAweDdFOTAsIDB4MTgwNSwgMHg3RTkxLCAweDNBOTMsIDB4N0U5MiwgMHgxODA0LAotICAgIDB4N0U5MywgMHgxODA2LCAweDdFOTQsIDB4MTgwNywgMHg3RTk2LCAweDE4MDgsIDB4N0U5OCwgMHgzQTk0LAotICAgIDB4N0U5QSwgMHg0N0NBLCAweDdFOUIsIDB4MTgwQSwgMHg3RTlDLCAweDE4MEIsIDB4N0YzNiwgMHgwNjA4LAotICAgIDB4N0YzOCwgMHgxODBDLCAweDdGM0EsIDB4MTgwRCwgMHg3RjNCLCAweDQ3Q0QsIDB4N0YzQywgMHg0N0NDLAotICAgIDB4N0YzRCwgMHg0Q0UwLCAweDdGM0UsIDB4NDdDRSwgMHg3RjQzLCAweDQ3Q0YsIDB4N0Y0NCwgMHgzQTk1LAotICAgIDB4N0Y0NSwgMHgxODBFLCAweDdGNDcsIDB4MjE5NSwgMHg3RjRDLCAweDE4MEYsIDB4N0Y0RCwgMHgxODEwLAotICAgIDB4N0Y0RSwgMHgxODExLCAweDdGNEYsIDB4M0E5NiwgMHg3RjUwLCAweDE4MTIsIDB4N0Y1MSwgMHgxODEzLAotICAgIDB4N0Y1MiwgMHgzQTk3LCAweDdGNTMsIDB4M0E5OCwgMHg3RjU0LCAweDE4MTUsIDB4N0Y1NSwgMHgxODE0LAotICAgIDB4N0Y1OCwgMHgxODE2LCAweDdGNUIsIDB4NENFMSwgMHg3RjVELCAweDRDRTIsIDB4N0Y1RiwgMHgxODE3LAotICAgIDB4N0Y2MCwgMHgxODE4LCAweDdGNjEsIDB4M0E5OSwgMHg3RjYzLCAweDQ3RDMsIDB4N0Y2NCwgMHg0N0Q0LAotICAgIDB4N0Y2NSwgMHg0Q0UzLCAweDdGNjcsIDB4MTgxQiwgMHg3RjY4LCAweDE4MTksIDB4N0Y2OSwgMHgxODFBLAotICAgIDB4N0Y2QSwgMHgwODUxLCAweDdGNkIsIDB4MDcyOSwgMHg3RjZELCAweDQ3RDUsIDB4N0Y2RSwgMHgwQjk0LAotICAgIDB4N0Y3MCwgMHgwRDQ3LCAweDdGNzEsIDB4NENFNCwgMHg3RjcyLCAweDA5N0EsIDB4N0Y3NSwgMHgwRDAzLAotICAgIDB4N0Y3NywgMHgwRDgxLCAweDdGNzgsIDB4MTgxQywgMHg3Rjc5LCAweDEzMzYsIDB4N0Y3RCwgMHg0N0Q2LAotICAgIDB4N0Y3RSwgMHg0N0Q3LCAweDdGN0YsIDB4NENFNSwgMHg3RjgwLCAweDRDRTYsIDB4N0Y4MiwgMHgxODFELAotICAgIDB4N0Y4MywgMHgxODFGLCAweDdGODUsIDB4MEY0RiwgMHg3Rjg2LCAweDE4MUUsIDB4N0Y4NywgMHgxODIxLAotICAgIDB4N0Y4OCwgMHgxODIwLCAweDdGOEEsIDB4MEYzRCwgMHg3RjhCLCAweDRDRTcsIDB4N0Y4QywgMHgxODIyLAotICAgIDB4N0Y4RSwgMHgwRDkyLCAweDdGOTAsIDB4NDdEOCwgMHg3RjkxLCAweDNBOUEsIDB4N0Y5NCwgMHgxODIzLAotICAgIDB4N0Y5NiwgMHg0N0RCLCAweDdGOTcsIDB4NDI5NiwgMHg3RjlBLCAweDE4MjYsIDB4N0Y5QywgMHg0N0RDLAotICAgIDB4N0Y5RCwgMHgxODI1LCAweDdGOUUsIDB4MTgyNCwgMHg3RkExLCAweDIxOTYsIDB4N0ZBMiwgMHg0Q0U4LAotICAgIDB4N0ZBMywgMHgxODI3LCAweDdGQTQsIDB4MDcwOCwgMHg3RkE4LCAweDBBQTQsIDB4N0ZBOSwgMHgwNjVCLAotICAgIDB4N0ZBRCwgMHg0N0RELCAweDdGQUUsIDB4MTgyQiwgMHg3RkFGLCAweDE4MjgsIDB4N0ZCMiwgMHgxODI5LAotICAgIDB4N0ZCNiwgMHgxODJDLCAweDdGQjgsIDB4MTgyRCwgMHg3RkI5LCAweDE4MkEsIDB4N0ZCRCwgMHgwNENCLAotICAgIDB4N0ZCRiwgMHgzQTlCLCAweDdGQzEsIDB4MDUyNywgMHg3RkMzLCAweDQ3REYsIDB4N0ZDNSwgMHgxODJGLAotICAgIDB4N0ZDNiwgMHgxODMwLCAweDdGQ0EsIDB4MTgzMSwgMHg3RkNDLCAweDBGNEMsIDB4N0ZDRSwgMHgzQTlDLAotICAgIDB4N0ZDRiwgMHg0N0UwLCAweDdGRDIsIDB4MDkzNiwgMHg3RkQ0LCAweDE4MzMsIDB4N0ZENSwgMHgxODMyLAotICAgIDB4N0ZEQiwgMHg0Mjk3LCAweDdGREYsIDB4M0E5RCwgMHg3RkUwLCAweDBBMkYsIDB4N0ZFMSwgMHgxODM0LAotICAgIDB4N0ZFMywgMHg0N0UxLCAweDdGRTUsIDB4M0E5RSwgMHg3RkU2LCAweDE4MzUsIDB4N0ZFOSwgMHgxODM2LAotICAgIDB4N0ZFQiwgMHgwNjIxLCAweDdGRUMsIDB4M0E5RiwgMHg3RkVFLCAweDNBQTAsIDB4N0ZFRiwgMHgzQUExLAotICAgIDB4N0ZGMCwgMHgwNjA5LCAweDdGRjIsIDB4NDdFMiwgMHg3RkYzLCAweDE4MzcsIDB4N0ZGOSwgMHgxODM4LAotICAgIDB4N0ZGQSwgMHgzQUEyLCAweDdGRkIsIDB4MEU4QiwgMHg3RkZDLCAweDBGNEQsIDB4N0ZGRCwgMHg0Q0U5LAotICAgIDB4N0ZGRSwgMHg0Q0VBLCAweDdGRkYsIDB4NENFQiwgMHg4MDAwLCAweDBGM0UsIDB4ODAwMSwgMHgwRkRELAotICAgIDB4ODAwMiwgMHgzNzEzLCAweDgwMDMsIDB4MDdERiwgMHg4MDA0LCAweDE4M0IsIDB4ODAwNSwgMHgwOTAwLAotICAgIDB4ODAwNiwgMHgxODNBLCAweDgwMDcsIDB4NENFQywgMHg4MDA4LCAweDQ3RTQsIDB4ODAwQSwgMHg0N0UzLAotICAgIDB4ODAwQiwgMHgxODNDLCAweDgwMEMsIDB4MDhENSwgMHg4MDBELCAweDRDRUQsIDB4ODAwRSwgMHgzQUEzLAotICAgIDB4ODAxMCwgMHgwQjMxLCAweDgwMTEsIDB4M0FBNCwgMHg4MDEyLCAweDE4M0QsIDB4ODAxNCwgMHgzQUE1LAotICAgIDB4ODAxNSwgMHgwN0RFLCAweDgwMTYsIDB4NDdFNSwgMHg4MDE3LCAweDBFRTMsIDB4ODAxOCwgMHgxODNFLAotICAgIDB4ODAxOSwgMHgxODNGLCAweDgwMUMsIDB4MTg0MCwgMHg4MDFFLCAweDRDRUUsIDB4ODAyMSwgMHgxODQxLAotICAgIDB4ODAyNCwgMHgzQUE2LCAweDgwMjYsIDB4M0FBNywgMHg4MDI4LCAweDE4NDIsIDB4ODAyQywgMHg0N0U2LAotICAgIDB4ODAzMCwgMHg0N0U3LCAweDgwMzMsIDB4MDhENiwgMHg4MDM1LCAweDQyOTgsIDB4ODAzNiwgMHgwRUY5LAotICAgIDB4ODAzNywgMHg0Mjk5LCAweDgwMzksIDB4NENFRiwgMHg4MDNBLCAweDNBQTgsIDB4ODAzQiwgMHgxODQ0LAotICAgIDB4ODAzQywgMHgzQUE5LCAweDgwM0QsIDB4MEI3RCwgMHg4MDNGLCAweDE4NDMsIDB4ODA0MywgMHg0N0U4LAotICAgIDB4ODA0NiwgMHgxODQ2LCAweDgwNEEsIDB4MTg0NSwgMHg4MDUyLCAweDE4NDcsIDB4ODA1NiwgMHgwQTVGLAotICAgIDB4ODA1OCwgMHgxODQ4LCAweDgwNUEsIDB4MTg0OSwgMHg4MDVFLCAweDBFMDksIDB4ODA1RiwgMHgxODRBLAotICAgIDB4ODA2MCwgMHgzQUFBLCAweDgwNjEsIDB4MEFGMSwgMHg4MDYyLCAweDE4NEIsIDB4ODA2NiwgMHg0N0U5LAotICAgIDB4ODA2OCwgMHgxODRDLCAweDgwNkYsIDB4MEZDNiwgMHg4MDcwLCAweDE4NEYsIDB4ODA3MSwgMHgzQUFCLAotICAgIDB4ODA3MiwgMHgxODRFLCAweDgwNzMsIDB4MTg0RCwgMHg4MDc0LCAweDBCQ0MsIDB4ODA3NSwgMHgzQUFDLAotICAgIDB4ODA3NiwgMHgxODUwLCAweDgwNzcsIDB4MDlFQywgMHg4MDc5LCAweDE4NTEsIDB4ODA3QiwgMHg0N0VBLAotICAgIDB4ODA3RCwgMHgxODUyLCAweDgwN0UsIDB4MEZERSwgMHg4MDdGLCAweDE4NTMsIDB4ODA4NCwgMHgxODU0LAotICAgIDB4ODA4NSwgMHgxODU2LCAweDgwODYsIDB4MTg1NSwgMHg4MDg3LCAweDBEMzksIDB4ODA4OCwgMHg0Q0YwLAotICAgIDB4ODA4OSwgMHgwQ0QxLCAweDgwOEIsIDB4MEZFNCwgMHg4MDhDLCAweDBEM0QsIDB4ODA4RSwgMHg0Q0YxLAotICAgIDB4ODA5MywgMHgxODU4LCAweDgwOTYsIDB4MDlCQiwgMHg4MDk4LCAweDBEOUMsIDB4ODA5OSwgMHg0N0VCLAotICAgIDB4ODA5QSwgMHgxODU5LCAweDgwOUIsIDB4MTg1NywgMHg4MDlDLCAweDQ3RUMsIDB4ODA5RCwgMHgwNjBBLAotICAgIDB4ODA5RSwgMHgzQUFELCAweDgwQTEsIDB4MDc4OCwgMHg4MEEyLCAweDA4QjYsIDB4ODBBNCwgMHg0N0VELAotICAgIDB4ODBBNSwgMHgwRDgyLCAweDgwQTYsIDB4M0FBRSwgMHg4MEE3LCAweDQ3RUUsIDB4ODBBOSwgMHgwNzVFLAotICAgIDB4ODBBQSwgMHgwRTcxLCAweDgwQUIsIDB4M0FBRiwgMHg4MEFDLCAweDE4NUMsIDB4ODBBRCwgMHgxODVBLAotICAgIDB4ODBBRiwgMHgwN0UwLCAweDgwQjEsIDB4MDdFMSwgMHg4MEIyLCAweDA0QUQsIDB4ODBCNCwgMHgwODU4LAotICAgIDB4ODBCOCwgMHg0N0VGLCAweDgwQkEsIDB4MEQwRiwgMHg4MEMzLCAweDA0QTMsIDB4ODBDNCwgMHgxODYxLAotICAgIDB4ODBDNSwgMHg0N0YxLCAweDgwQzYsIDB4MEI3RSwgMHg4MENBLCAweDQyOUEsIDB4ODBDQywgMHgwRDBFLAotICAgIDB4ODBDRSwgMHgwQjNCLCAweDgwQ0YsIDB4NENGMiwgMHg4MEQ0LCAweDRDRjMsIDB4ODBENSwgMHg0N0YyLAotICAgIDB4ODBENiwgMHgxODYzLCAweDgwRDcsIDB4M0FCMCwgMHg4MEQ4LCAweDNBQjEsIDB4ODBEOSwgMHgxODVGLAotICAgIDB4ODBEQSwgMHgxODYyLCAweDgwREIsIDB4MTg1RCwgMHg4MERELCAweDE4NjAsIDB4ODBERSwgMHgwRTU0LAotICAgIDB4ODBFMCwgMHg0MjlCLCAweDgwRTEsIDB4MDc4OSwgMHg4MEU0LCAweDA0QzEsIDB4ODBFNSwgMHgxODVFLAotICAgIDB4ODBFNiwgMHg0N0YzLCAweDgwRUQsIDB4NENGNCwgMHg4MEVGLCAweDE4NjUsIDB4ODBGMCwgMHg0Q0Y1LAotICAgIDB4ODBGMSwgMHgxODY2LCAweDgwRjMsIDB4NDI5QywgMHg4MEY0LCAweDBDOTEsIDB4ODBGNSwgMHg0N0Y1LAotICAgIDB4ODBGNywgMHg0Q0Y2LCAweDgwRjgsIDB4MDZCMywgMHg4MEZBLCAweDRDRjcsIDB4ODBGQiwgMHg0N0Y2LAotICAgIDB4ODBGQywgMHgxODcxLCAweDgwRkQsIDB4MENGMywgMHg4MEZFLCAweDRDRjgsIDB4ODEwMiwgMHgwOEI3LAotICAgIDB4ODEwMywgMHg0Q0Y5LCAweDgxMDUsIDB4MDZCNCwgMHg4MTA2LCAweDBBNkMsIDB4ODEwNywgMHgwRkVDLAotICAgIDB4ODEwOCwgMHgwRUJBLCAweDgxMDksIDB4MTg2NCwgMHg4MTBBLCAweDBBNzgsIDB4ODEwRCwgMHg0N0Y0LAotICAgIDB4ODExNiwgMHgzQUIyLCAweDgxMTcsIDB4NENGQSwgMHg4MTE4LCAweDNBQjMsIDB4ODExQSwgMHgwNjZELAotICAgIDB4ODExQiwgMHgxODY3LCAweDgxMUUsIDB4NDdGOSwgMHg4MTIzLCAweDE4NjksIDB4ODEyNCwgMHg0N0ZCLAotICAgIDB4ODEyNywgMHg0N0ZDLCAweDgxMjksIDB4MTg2OCwgMHg4MTJCLCAweDM2NTksIDB4ODEyQywgMHg0N0ZELAotICAgIDB4ODEyRiwgMHgxODZBLCAweDgxMzAsIDB4NENGQiwgMHg4MTMxLCAweDBCNjQsIDB4ODEzMywgMHgwQ0Y0LAotICAgIDB4ODEzNSwgMHg0N0Y4LCAweDgxMzksIDB4MEJDRCwgMHg4MTNBLCAweDNBQjQsIDB4ODEzRCwgMHg0N0ZGLAotICAgIDB4ODEzRSwgMHgxODZFLCAweDgxNDEsIDB4Mzc3MiwgMHg4MTQ2LCAweDE4NkQsIDB4ODE0QSwgMHgzQUI1LAotICAgIDB4ODE0QiwgMHgxODZCLCAweDgxNEMsIDB4M0FCNiwgMHg4MTRFLCAweDBBMUIsIDB4ODE1MCwgMHgwREQ3LAotICAgIDB4ODE1MSwgMHgxODcwLCAweDgxNTMsIDB4MTg2RiwgMHg4MTU0LCAweDA3RTIsIDB4ODE1NSwgMHgwRkY5LAotICAgIDB4ODE1NywgMHg0Q0ZDLCAweDgxNUYsIDB4MTg4MCwgMHg4MTYwLCAweDQyOUQsIDB4ODE2NSwgMHgxODc0LAotICAgIDB4ODE2NiwgMHgxODc1LCAweDgxNjcsIDB4NDI5RSwgMHg4MTY4LCAweDQyOUYsIDB4ODE2OSwgMHg0ODAxLAotICAgIDB4ODE2QiwgMHgwOTFDLCAweDgxNkQsIDB4NDJBMCwgMHg4MTZFLCAweDE4NzMsIDB4ODE2RiwgMHg0Q0ZELAotICAgIDB4ODE3MCwgMHgwODBBLCAweDgxNzEsIDB4MTg3MiwgMHg4MTczLCAweDRDRkUsIDB4ODE3NCwgMHgxODc2LAotICAgIDB4ODE3OCwgMHgwQkNFLCAweDgxNzksIDB4MERGMiwgMHg4MTdBLCAweDBBQTUsIDB4ODE3RiwgMHgwQjNDLAotICAgIDB4ODE4MCwgMHgxODdBLCAweDgxODEsIDB4M0FCNywgMHg4MTgyLCAweDE4N0IsIDB4ODE4MywgMHgxODc3LAotICAgIDB4ODE4NCwgMHgzQUI4LCAweDgxODUsIDB4NDgwNCwgMHg4MTg4LCAweDE4NzgsIDB4ODE4QSwgMHgxODc5LAotICAgIDB4ODE4QiwgMHg0Q0ZGLCAweDgxOEYsIDB4MDdFMywgMHg4MTkwLCAweDREMDAsIDB4ODE5MywgMHgxODgxLAotICAgIDB4ODE5NSwgMHgxODdELCAweDgxOTgsIDB4NDgwNiwgMHg4MTlBLCAweDBERDgsIDB4ODE5QiwgMHg0RDAxLAotICAgIDB4ODE5QywgMHgwRTlBLCAweDgxOUQsIDB4MEQ5QSwgMHg4MTlFLCAweDREMDIsIDB4ODFBMCwgMHgxODdDLAotICAgIDB4ODFBMywgMHgxODdGLCAweDgxQTQsIDB4MTg3RSwgMHg4MUE4LCAweDBFNzIsIDB4ODFBOSwgMHgxODgyLAotICAgIDB4ODFCMCwgMHgxODgzLCAweDgxQjIsIDB4NDgwNywgMHg4MUIzLCAweDBBQjksIDB4ODFCNCwgMHgzQUI5LAotICAgIDB4ODFCNSwgMHgxODg0LCAweDgxQjgsIDB4MTg4NiwgMHg4MUJBLCAweDE4OEEsIDB4ODFCQiwgMHg0MkExLAotICAgIDB4ODFCRCwgMHgxODg3LCAweDgxQkUsIDB4MTg4NSwgMHg4MUJGLCAweDBDRjUsIDB4ODFDMCwgMHgxODg4LAotICAgIDB4ODFDMSwgMHg0ODA4LCAweDgxQzIsIDB4MTg4OSwgMHg4MUMzLCAweDQ4MDksIDB4ODFDNiwgMHgwNTMyLAotICAgIDB4ODFDOCwgMHgxODkwLCAweDgxQzksIDB4MTg4QiwgMHg4MUNBLCAweDQyQTIsIDB4ODFDQiwgMHg0RDAzLAotICAgIDB4ODFDRCwgMHgxODhDLCAweDgxQ0YsIDB4M0FCQSwgMHg4MUQxLCAweDE4OEQsIDB4ODFEMywgMHgwQjAxLAotICAgIDB4ODFENSwgMHg0RDA0LCAweDgxRDYsIDB4NDgwQSwgMHg4MUQ3LCAweDQyQTMsIDB4ODFEOCwgMHgxODhGLAotICAgIDB4ODFEOSwgMHgxODhFLCAweDgxREEsIDB4MTg5MSwgMHg4MURCLCAweDQ4MEIsIDB4ODFERCwgMHg0RDA1LAotICAgIDB4ODFERSwgMHg0RDA2LCAweDgxREYsIDB4MTg5MiwgMHg4MUUwLCAweDE4OTMsIDB4ODFFMSwgMHg0RDA3LAotICAgIDB4ODFFMywgMHgwQTA5LCAweDgxRTQsIDB4NDgwRCwgMHg4MUU1LCAweDA1NjksIDB4ODFFNywgMHgxODk0LAotICAgIDB4ODFFOCwgMHgwRjlGLCAweDgxRUEsIDB4MDhENywgMHg4MUVDLCAweDQ4MEYsIDB4ODFFRCwgMHgwOTM3LAotICAgIDB4ODFFRiwgMHg0RDA4LCAweDgxRjMsIDB4MDhCOCwgMHg4MUY0LCAweDBCOTUsIDB4ODFGNiwgMHg0RDA5LAotICAgIDB4ODFGOSwgMHgzQUJCLCAweDgxRkEsIDB4MTg5NSwgMHg4MUZCLCAweDE4OTYsIDB4ODFGQywgMHgwNEQzLAotICAgIDB4ODFGRCwgMHg0ODEwLCAweDgxRkUsIDB4MTg5NywgMHg4MUZGLCAweDQ4MTEsIDB4ODIwMCwgMHg0RDBBLAotICAgIDB4ODIwMSwgMHgxODk4LCAweDgyMDIsIDB4MTg5OSwgMHg4MjAzLCAweDNBQkMsIDB4ODIwNCwgMHg0ODEzLAotICAgIDB4ODIwNSwgMHgxODlBLCAweDgyMDcsIDB4MTg5QiwgMHg4MjA4LCAweDA2QjUsIDB4ODIwOSwgMHgxM0FGLAotICAgIDB4ODIwQSwgMHgxODlDLCAweDgyMEIsIDB4NEQwQiwgMHg4MjBDLCAweDBBODksIDB4ODIwRCwgMHgxODlELAotICAgIDB4ODIwRSwgMHgwOEY3LCAweDgyMTAsIDB4MTg5RSwgMHg4MjEyLCAweDEwMDksIDB4ODIxMywgMHg0RDBDLAotICAgIDB4ODIxNCwgMHg0RDBELCAweDgyMTYsIDB4MTg5RiwgMHg4MjE3LCAweDBFMkUsIDB4ODIxOCwgMHgwNjE4LAotICAgIDB4ODIxOSwgMHg0ODE1LCAweDgyMUEsIDB4NEQwRSwgMHg4MjFCLCAweDBBQTYsIDB4ODIxQywgMHgwOTYyLAotICAgIDB4ODIxRSwgMHgwREUzLCAweDgyMUYsIDB4MDkzOCwgMHg4MjIxLCAweDNBQkQsIDB4ODIyMiwgMHg0ODE2LAotICAgIDB4ODIyOSwgMHgxOEEwLCAweDgyMkEsIDB4MDdFNCwgMHg4MjJCLCAweDE4QTEsIDB4ODIyQywgMHgwRDYwLAotICAgIDB4ODIyRSwgMHgxOEFGLCAweDgyMzIsIDB4M0FCRSwgMHg4MjMzLCAweDE4QTMsIDB4ODIzNCwgMHgzQUJGLAotICAgIDB4ODIzNSwgMHgwQjI5LCAweDgyMzYsIDB4MEQyQiwgMHg4MjM3LCAweDA3NzMsIDB4ODIzOCwgMHgxOEEyLAotICAgIDB4ODIzOSwgMHgwQUE3LCAweDgyM0EsIDB4NEQwRiwgMHg4MjNDLCAweDQ4MTgsIDB4ODI0MCwgMHgxOEE0LAotICAgIDB4ODI0NCwgMHg0RDEwLCAweDgyNDUsIDB4NDgxQSwgMHg4MjQ2LCAweDNBQzAsIDB4ODI0NywgMHgwQzE2LAotICAgIDB4ODI0OSwgMHg0ODE5LCAweDgyNEIsIDB4M0FDMSwgMHg4MjRGLCAweDNBQzIsIDB4ODI1NywgMHg0ODFFLAotICAgIDB4ODI1OCwgMHgxOEE2LCAweDgyNTksIDB4MThBNSwgMHg4MjVBLCAweDE4QTgsIDB4ODI1QywgMHg0ODIwLAotICAgIDB4ODI1RCwgMHgxOEE3LCAweDgyNUYsIDB4MThBOSwgMHg4MjYwLCAweDQyQTUsIDB4ODI2MiwgMHgxOEFCLAotICAgIDB4ODI2MywgMHg0ODIxLCAweDgyNjQsIDB4MThBQSwgMHg4MjY2LCAweDA2MEIsIDB4ODI2OCwgMHgxOEFDLAotICAgIDB4ODI2QSwgMHgxOEFELCAweDgyNkIsIDB4MThBRSwgMHg4MjZELCAweDREMTEsIDB4ODI2RSwgMHgwODIxLAotICAgIDB4ODI2RiwgMHgwRjkxLCAweDgyNzEsIDB4MThCMCwgMHg4MjcyLCAweDA5RUQsIDB4ODI3NCwgMHg0MkE2LAotICAgIDB4ODI3NiwgMHgwNTEyLCAweDgyNzcsIDB4MThCMSwgMHg4Mjc4LCAweDE4QjIsIDB4ODI3OSwgMHgzNzc1LAotICAgIDB4ODI3RCwgMHg0ODI0LCAweDgyN0UsIDB4MThCMywgMHg4MjdGLCAweDQ4MjUsIDB4ODI4MywgMHg0ODI2LAotICAgIDB4ODI4NCwgMHg0RDEyLCAweDgyODksIDB4NEQxMywgMHg4MjhBLCAweDQ4MjcsIDB4ODI4QiwgMHgwNEI2LAotICAgIDB4ODI4RCwgMHgxOEI0LCAweDgyOEUsIDB4M0FDMywgMHg4MjkxLCAweDREMTQsIDB4ODI5MiwgMHgxOEI1LAotICAgIDB4ODI5MywgMHg0ODI4LCAweDgyOTksIDB4MEREOSwgMHg4MjlELCAweDA4RjMsIDB4ODI5RiwgMHgxOEI3LAotICAgIDB4ODJBMSwgMHg0MkE4LCAweDgyQTMsIDB4NDJBOSwgMHg4MkE0LCAweDQyQUEsIDB4ODJBNSwgMHgwNTg3LAotICAgIDB4ODJBNiwgMHgwNDc2LCAweDgyQTcsIDB4NDgyOSwgMHg4MkE4LCAweDQ4MkEsIDB4ODJBOSwgMHg0MkFCLAotICAgIDB4ODJBQSwgMHg0RDE1LCAweDgyQUIsIDB4MThCNiwgMHg4MkFDLCAweDE4QjksIDB4ODJBRCwgMHgwRDA0LAotICAgIDB4ODJBRSwgMHgzQUM0LCAweDgyQUYsIDB4MEEwQSwgMHg4MkIwLCAweDREMTYsIDB4ODJCMSwgMHgwNTU2LAotICAgIDB4ODJCMiwgMHg0ODJCLCAweDgyQjMsIDB4MEU1NSwgMHg4MkI0LCAweDQ4MkMsIDB4ODJCNywgMHgzQUM1LAotICAgIDB4ODJCOCwgMHgwNzMzLCAweDgyQjksIDB4MDZENCwgMHg4MkJBLCAweDQ4MkQsIDB4ODJCQiwgMHgxOEI4LAotICAgIDB4ODJCQywgMHg0ODJFLCAweDgyQkQsIDB4MDU2QSwgMHg4MkJFLCAweDNBQzYsIDB4ODJCRiwgMHg0MkFDLAotICAgIDB4ODJDNSwgMHgwNURGLCAweDgyQzYsIDB4M0FDNywgMHg4MkQwLCAweDREMTcsIDB4ODJEMSwgMHgwNTEzLAotICAgIDB4ODJEMiwgMHgxOEJELCAweDgyRDMsIDB4MEZCMiwgMHg4MkQ0LCAweDBCM0QsIDB4ODJENSwgMHg0MkFELAotICAgIDB4ODJENywgMHgwREI2LCAweDgyRDksIDB4MThDOSwgMHg4MkRCLCAweDA1NTcsIDB4ODJEQywgMHgxOEM3LAotICAgIDB4ODJERSwgMHgxOEM1LCAweDgyREYsIDB4MThCQywgMHg4MkUxLCAweDE4QkEsIDB4ODJFMiwgMHg0ODJGLAotICAgIDB4ODJFMywgMHgxOEJCLCAweDgyRTUsIDB4MDkwRiwgMHg4MkU2LCAweDA2RTQsIDB4ODJFNywgMHgwQkI1LAotICAgIDB4ODJFOCwgMHg0ODMwLCAweDgyRUEsIDB4NEQxOCwgMHg4MkVCLCAweDBDQTksIDB4ODJFRiwgMHg0RDE5LAotICAgIDB4ODJGMSwgMHgwNEYzLCAweDgyRjMsIDB4MThCRiwgMHg4MkY0LCAweDE4QkUsIDB4ODJGNiwgMHg0RDFBLAotICAgIDB4ODJGNywgMHg0ODMxLCAweDgyRjksIDB4MThDNCwgMHg4MkZBLCAweDE4QzAsIDB4ODJGQiwgMHgxOEMzLAotICAgIDB4ODJGRCwgMHg0MkFFLCAweDgyRkUsIDB4M0FDOCwgMHg4MzAwLCAweDQyQUYsIDB4ODMwMSwgMHgyMTk4LAotICAgIDB4ODMwMiwgMHgwRURDLCAweDgzMDMsIDB4MThDMiwgMHg4MzA0LCAweDA1NTgsIDB4ODMwNSwgMHgwNURCLAotICAgIDB4ODMwNiwgMHgxOEM2LCAweDgzMDcsIDB4NDgzMiwgMHg4MzA4LCAweDQ4MzMsIDB4ODMwOSwgMHgxOEM4LAotICAgIDB4ODMwQywgMHg0ODM0LCAweDgzMEUsIDB4MDcyQSwgMHg4MzE2LCAweDE4Q0MsIDB4ODMxNywgMHgxOEQ1LAotICAgIDB4ODMxOCwgMHgxOEQ2LCAweDgzMUIsIDB4NDgzNiwgMHg4MzFDLCAweDA0NkYsIDB4ODMxRCwgMHg0ODM3LAotICAgIDB4ODMyMiwgMHg0MkIwLCAweDgzMjMsIDB4MThERCwgMHg4MzI4LCAweDA0QjUsIDB4ODMyQiwgMHgxOEQ0LAotICAgIDB4ODMyRCwgMHg0MkIxLCAweDgzMkYsIDB4MThEMywgMHg4MzMwLCAweDQ4MzgsIDB4ODMzMSwgMHgxOENFLAotICAgIDB4ODMzMiwgMHgxOENELCAweDgzMzQsIDB4MThDQiwgMHg4MzM1LCAweDE4Q0EsIDB4ODMzNiwgMHgwQkExLAotICAgIDB4ODMzOCwgMHgwQjVCLCAweDgzMzksIDB4MThEMCwgMHg4MzNBLCAweDQyQjIsIDB4ODMzQywgMHg0ODM5LAotICAgIDB4ODM0MCwgMHgxOENGLCAweDgzNDMsIDB4M0FDOSwgMHg4MzQ0LCAweDQ4M0EsIDB4ODM0NSwgMHgxOEQyLAotICAgIDB4ODM0NiwgMHgxREY4LCAweDgzNDcsIDB4NDJCMywgMHg4MzQ5LCAweDBBRjIsIDB4ODM0QSwgMHgwNzJCLAotICAgIDB4ODM0RiwgMHgwNEUzLCAweDgzNTAsIDB4MThEMSwgMHg4MzUxLCAweDNBQ0EsIDB4ODM1MiwgMHgwN0U1LAotICAgIDB4ODM1NCwgMHg0ODM1LCAweDgzNTUsIDB4M0FDQiwgMHg4MzU2LCAweDREMUIsIDB4ODM1NywgMHg0ODNCLAotICAgIDB4ODM1OCwgMHgwQUYzLCAweDgzNUEsIDB4Mzc3QSwgMHg4MzYyLCAweDIxOTksIDB4ODM2MywgMHg0NTZGLAotICAgIDB4ODM3MywgMHgxOEUzLCAweDgzNzUsIDB4MThFNCwgMHg4Mzc3LCAweDA1NTksIDB4ODM3OCwgMHg0RDFDLAotICAgIDB4ODM3QiwgMHgwNTJFLCAweDgzN0MsIDB4MThFMSwgMHg4MzdELCAweDQyQjQsIDB4ODM3RiwgMHgyMTlBLAotICAgIDB4ODM4NSwgMHgxOEQ3LCAweDgzODYsIDB4M0FDQywgMHg4Mzg3LCAweDE4REYsIDB4ODM4OSwgMHgxOEU2LAotICAgIDB4ODM4QSwgMHgxOEUwLCAweDgzOEQsIDB4M0FDRCwgMHg4MzhFLCAweDE4REUsIDB4ODM5MiwgMHgzQUNFLAotICAgIDB4ODM5MywgMHgxOEMxLCAweDgzOTQsIDB4NDgzRiwgMHg4Mzk1LCAweDQ4NDAsIDB4ODM5NiwgMHgxOERDLAotICAgIDB4ODM5OCwgMHgzQUNGLCAweDgzOUEsIDB4MThEOCwgMHg4MzlCLCAweDQ4NDEsIDB4ODM5RCwgMHg0ODQyLAotICAgIDB4ODM5RSwgMHgwNjBDLCAweDgzOUYsIDB4MThEQSwgMHg4M0EwLCAweDE4RTUsIDB4ODNBMiwgMHgxOERCLAotICAgIDB4ODNBNywgMHg0MkI1LCAweDgzQTgsIDB4MThFNywgMHg4M0E5LCAweDNBRDAsIDB4ODNBQSwgMHgxOEQ5LAotICAgIDB4ODNBQiwgMHgwRDMyLCAweDgzQjEsIDB4MEY1MywgMHg4M0I1LCAweDE4RTIsIDB4ODNCRCwgMHgxOEY4LAotICAgIDB4ODNCRiwgMHgzQUQxLCAweDgzQzAsIDB4M0FEMiwgMHg4M0MxLCAweDE4RjAsIDB4ODNDNSwgMHgwQTQxLAotICAgIDB4ODNDNywgMHgyMTlCLCAweDgzQzksIDB4NDg0MywgMHg4M0NBLCAweDA2NjAsIDB4ODNDQywgMHgwNkQ1LAotICAgIDB4ODNDRSwgMHgxOEVCLCAweDgzQ0YsIDB4NDJCNiwgMHg4M0QwLCAweDQ4NDQsIDB4ODNEMSwgMHg0MkI3LAotICAgIDB4ODNEMywgMHgwNTVCLCAweDgzRDQsIDB4NDg0NSwgMHg4M0Q2LCAweDA5QkMsIDB4ODNEOCwgMHgxOEVFLAotICAgIDB4ODNEQywgMHgwODRBLCAweDgzREQsIDB4NDg0NiwgMHg4M0RGLCAweDBDNEIsIDB4ODNFMCwgMHgxOEYzLAotICAgIDB4ODNFMSwgMHg0MkI4LCAweDgzRTUsIDB4NDg0NywgMHg4M0U5LCAweDBFM0UsIDB4ODNFQSwgMHgzQUQzLAotICAgIDB4ODNFQiwgMHgxOEVBLCAweDgzRUYsIDB4MDU1QSwgMHg4M0YwLCAweDA3OEEsIDB4ODNGMSwgMHgwRDlCLAotICAgIDB4ODNGMiwgMHgxOEY0LCAweDgzRjQsIDB4MThFOCwgMHg4M0Y2LCAweDIxOUMsIDB4ODNGNywgMHgxOEYxLAotICAgIDB4ODNGOCwgMHg0RDFELCAweDgzRjksIDB4NDg0OCwgMHg4M0ZCLCAweDE4RkIsIDB4ODNGQywgMHg0RDFFLAotICAgIDB4ODNGRCwgMHgxOEVDLCAweDg0MDEsIDB4NDJCOSwgMHg4NDAzLCAweDE4RUQsIDB4ODQwNCwgMHgwQzkyLAotICAgIDB4ODQwNiwgMHg0MkJBLCAweDg0MDcsIDB4MThGMiwgMHg4NDBBLCAweDFFN0YsIDB4ODQwQiwgMHgxOEVGLAotICAgIDB4ODQwQywgMHgwRTU2LCAweDg0MEQsIDB4MThGNSwgMHg4NDBFLCAweDA0QTQsIDB4ODQwRiwgMHgzQUQ0LAotICAgIDB4ODQxMSwgMHgzQUQ1LCAweDg0MTMsIDB4MThFOSwgMHg4NDE1LCAweDQ4NDksIDB4ODQxNywgMHg0ODRCLAotICAgIDB4ODQyMCwgMHgxOEY3LCAweDg0MjIsIDB4MThGNiwgMHg4NDI5LCAweDBEMjEsIDB4ODQyQSwgMHgxOEZELAotICAgIDB4ODQyQywgMHgxOTA4LCAweDg0MzEsIDB4MDVEQywgMHg4NDM1LCAweDE5MEIsIDB4ODQzOCwgMHgxOEY5LAotICAgIDB4ODQzOSwgMHg0ODRDLCAweDg0M0MsIDB4MThGRSwgMHg4NDNELCAweDBGNTgsIDB4ODQ0NiwgMHgxOTA3LAotICAgIDB4ODQ0OCwgMHgyMTlELCAweDg0NDksIDB4MEYzRiwgMHg4NDRBLCAweDNBRDYsIDB4ODQ0RSwgMHgwRjcyLAotICAgIDB4ODQ0RiwgMHg0ODRELCAweDg0NTEsIDB4NDg0RSwgMHg4NDUyLCAweDQ4NEYsIDB4ODQ1NywgMHgwQkI2LAotICAgIDB4ODQ1OCwgMHg0RDFGLCAweDg0NTksIDB4NDg1MCwgMHg4NDVBLCAweDQ4NTEsIDB4ODQ1QiwgMHgwNUM5LAotICAgIDB4ODQ1QywgMHg0ODUyLCAweDg0NUYsIDB4NDJCQiwgMHg4NDYxLCAweDBERTQsIDB4ODQ2MiwgMHgxOTBELAotICAgIDB4ODQ2MywgMHgwQzc5LCAweDg0NjUsIDB4NDg1NCwgMHg4NDY2LCAweDA0NzUsIDB4ODQ2OSwgMHgxOTA2LAotICAgIDB4ODQ2QiwgMHgxOTAyLCAweDg0NkMsIDB4MEFGNCwgMHg4NDZELCAweDE4RkMsIDB4ODQ2RSwgMHgxOTA0LAotICAgIDB4ODQ2RiwgMHgxOTA5LCAweDg0NzAsIDB4NDJCQywgMHg4NDcxLCAweDBDRTIsIDB4ODQ3MywgMHg0MkJELAotICAgIDB4ODQ3NSwgMHgwNDZFLCAweDg0NzYsIDB4M0FENywgMHg4NDc3LCAweDE5MDEsIDB4ODQ3OCwgMHg0ODU1LAotICAgIDB4ODQ3OSwgMHgxOTBBLCAweDg0N0EsIDB4MERFQSwgMHg4NDdDLCAweDQ4NTYsIDB4ODQ4MSwgMHg0ODU3LAotICAgIDB4ODQ4MiwgMHgxOTA1LCAweDg0ODQsIDB4MTkwMCwgMHg4NDg1LCAweDQyQkUsIDB4ODQ4QiwgMHgwOUJELAotICAgIDB4ODQ5MCwgMHgwOTM5LCAweDg0OTMsIDB4NEQyMCwgMHg4NDk0LCAweDA4RDgsIDB4ODQ5NywgMHg0ODU5LAotICAgIDB4ODQ5OSwgMHgwRUU0LCAweDg0OUMsIDB4MERCOSwgMHg4NDlFLCAweDQyQkYsIDB4ODQ5RiwgMHgxOTEwLAotICAgIDB4ODRBMSwgMHgxOTE5LCAweDg0QTYsIDB4NDg1QSwgMHg4NEE4LCAweDNBRDgsIDB4ODRBRCwgMHgxOTAzLAotICAgIDB4ODRBRiwgMHgzQUQ5LCAweDg0QjEsIDB4NEQyMSwgMHg4NEIyLCAweDA1RDUsIDB4ODRCNCwgMHgyMTlFLAotICAgIDB4ODRCOCwgMHgwOUUwLCAweDg0QjksIDB4MTkwRSwgMHg4NEJBLCAweDQyQzAsIDB4ODRCQiwgMHgxOTEzLAotICAgIDB4ODRCQywgMHgwQUY1LCAweDg0QkQsIDB4NEQyMiwgMHg4NEJFLCAweDQ4NUIsIDB4ODRCRiwgMHgxOTBGLAotICAgIDB4ODRDMCwgMHgzQURBLCAweDg0QzEsIDB4MTkxNiwgMHg4NEMyLCAweDNBREIsIDB4ODRDNCwgMHgwQjlELAotICAgIDB4ODRDNiwgMHgxOTE3LCAweDg0QzksIDB4MEY0MCwgMHg4NENBLCAweDE5MEMsIDB4ODRDQiwgMHgwNTk2LAotICAgIDB4ODRDRCwgMHgxOTEyLCAweDg0Q0UsIDB4NDg1RCwgMHg4NENGLCAweDQ4NUUsIDB4ODREMCwgMHgxOTE1LAotICAgIDB4ODREMSwgMHgwRUI4LCAweDg0RDMsIDB4NDg1RiwgMHg4NEQ2LCAweDE5MTgsIDB4ODREOSwgMHgxOTExLAotICAgIDB4ODREQSwgMHgxOTE0LCAweDg0REMsIDB4MjBBQiwgMHg4NEU3LCAweDQ4NjEsIDB4ODRFQSwgMHg0ODYyLAotICAgIDB4ODRFQywgMHgwRTU3LCAweDg0RUUsIDB4MEZDNywgMHg4NEVGLCAweDQ4NjMsIDB4ODRGMCwgMHgzQURDLAotICAgIDB4ODRGMSwgMHg0ODY0LCAweDg0RjQsIDB4MTkxQywgMHg4NEZBLCAweDQ4NjUsIDB4ODRGQiwgMHg0RDIzLAotICAgIDB4ODRGQywgMHgxOTIzLCAweDg0RkQsIDB4M0FERCwgMHg4NEZGLCAweDE5MUIsIDB4ODUwMCwgMHgwOEVGLAotICAgIDB4ODUwNiwgMHgxOEZBLCAweDg1MEMsIDB4M0FERSwgMHg4NTExLCAweDBFMUUsIDB4ODUxMywgMHgwRUFFLAotICAgIDB4ODUxNCwgMHgxOTIyLCAweDg1MTUsIDB4MTkyMSwgMHg4NTE3LCAweDE5MUQsIDB4ODUxOCwgMHgxOTFFLAotICAgIDB4ODUxQSwgMHgwNEQ4LCAweDg1MUIsIDB4NDg2NiwgMHg4NTFFLCAweDQyQzMsIDB4ODUxRiwgMHgxOTIwLAotICAgIDB4ODUyMSwgMHgxOTFBLCAweDg1MjMsIDB4MUUxQSwgMHg4NTI0LCAweDQ4NjcsIDB4ODUyNSwgMHg0ODY4LAotICAgIDB4ODUyNiwgMHgwQkYxLCAweDg1MkIsIDB4NDg2OSwgMHg4NTJDLCAweDE5MUYsIDB4ODUyRCwgMHgwNEMyLAotICAgIDB4ODUyRiwgMHg0MkM0LCAweDg1MzIsIDB4NDJDMiwgMHg4NTM0LCAweDNBREYsIDB4ODUzNSwgMHgwQjAyLAotICAgIDB4ODUzRCwgMHgwRTEzLCAweDg1M0UsIDB4MUVCNSwgMHg4NTQwLCAweDE5MjQsIDB4ODU0MSwgMHgxOTI4LAotICAgIDB4ODU0MywgMHgwRDZELCAweDg1NDYsIDB4NEQyNCwgMHg4NTQ4LCAweDE5MjcsIDB4ODU0OSwgMHgwOUJFLAotICAgIDB4ODU0QSwgMHgwOEY1LCAweDg1NEIsIDB4MTkyQSwgMHg4NTRFLCAweDA2QjYsIDB4ODU0RiwgMHg0ODZBLAotICAgIDB4ODU1MSwgMHg0ODZELCAweDg1NTMsIDB4MjE5RiwgMHg4NTU1LCAweDE5MkIsIDB4ODU1NiwgMHg0RDI1LAotICAgIDB4ODU1NywgMHgwREVCLCAweDg1NTgsIDB4MTkyNiwgMHg4NTU5LCAweDIxQTAsIDB4ODU1QSwgMHgxOEZGLAotICAgIDB4ODU1RCwgMHg0RDI2LCAweDg1NUUsIDB4M0FFMCwgMHg4NTYxLCAweDQ4NkUsIDB4ODU2MiwgMHg0ODZGLAotICAgIDB4ODU2MywgMHgxOTI1LCAweDg1NjQsIDB4NDJDNSwgMHg4NTY4LCAweDBGRjUsIDB4ODU2OSwgMHgwQzdBLAotICAgIDB4ODU2QSwgMHgwREU1LCAweDg1NkIsIDB4MjFBMSwgMHg4NTZELCAweDE5MzIsIDB4ODU2RiwgMHg0ODZCLAotICAgIDB4ODU3NywgMHgxOTM4LCAweDg1N0EsIDB4NDJDNiwgMHg4NTdCLCAweDQ4NzEsIDB4ODU3RCwgMHg0ODcyLAotICAgIDB4ODU3RSwgMHgxOTM5LCAweDg1N0YsIDB4NDg3MywgMHg4NTgwLCAweDE5MkMsIDB4ODU4MSwgMHg0ODc0LAotICAgIDB4ODU4NCwgMHgwRDJDLCAweDg1ODUsIDB4NEQyNywgMHg4NTg2LCAweDQ4NzUsIDB4ODU4NywgMHgxOTM2LAotICAgIDB4ODU4OCwgMHgxOTJFLCAweDg1OEEsIDB4MTkzMCwgMHg4NThDLCAweDQyQzcsIDB4ODU4RiwgMHgzQUUxLAotICAgIDB4ODU5MCwgMHgxOTNBLCAweDg1OTEsIDB4MTkyRiwgMHg4NTkzLCAweDQ4NzYsIDB4ODU5NCwgMHgxOTMzLAotICAgIDB4ODU5NywgMHgwNTE0LCAweDg1OTgsIDB4NEQyOCwgMHg4NTk5LCAweDBDQkQsIDB4ODU5QiwgMHgxOTM0LAotICAgIDB4ODU5QywgMHgxOTM3LCAweDg1OUQsIDB4NDg3NywgMHg4NTlGLCAweDQ4NzgsIDB4ODVBMiwgMHg0MkM4LAotICAgIDB4ODVBNCwgMHgxOTJELCAweDg1QTYsIDB4MEFBOCwgMHg4NUE4LCAweDE5MzEsIDB4ODVBOSwgMHgwODc1LAotICAgIDB4ODVBQSwgMHgwQTBCLCAweDg1QUIsIDB4MDcwNiwgMHg4NUFDLCAweDBGMDAsIDB4ODVBRCwgMHgzQUU0LAotICAgIDB4ODVBRSwgMHgwRjA1LCAweDg1QUYsIDB4MDk3QywgMHg4NUIwLCAweDIxQTMsIDB4ODVCNywgMHgzQUUyLAotICAgIDB4ODVCOSwgMHgxOTNFLCAweDg1QkEsIDB4MTkzQywgMHg4NUJDLCAweDQ4N0MsIDB4ODVDMSwgMHgwRkY0LAotICAgIDB4ODVDNywgMHg0ODdELCAweDg1QzksIDB4MTkzQiwgMHg4NUNBLCAweDQ4N0UsIDB4ODVDQiwgMHg0MkM5LAotICAgIDB4ODVDRCwgMHgwRjVGLCAweDg1Q0UsIDB4M0FFMywgMHg4NUNGLCAweDE5M0QsIDB4ODVEMCwgMHgxOTNGLAotICAgIDB4ODVENSwgMHgxOTQwLCAweDg1RDgsIDB4NDg3RiwgMHg4NUQ5LCAweDQ4ODAsIDB4ODVEQywgMHgxOTQzLAotICAgIDB4ODVERCwgMHgxOTQxLCAweDg1REYsIDB4NDg4MSwgMHg4NUUxLCAweDQ4ODIsIDB4ODVFNCwgMHgwQzdCLAotICAgIDB4ODVFNSwgMHgxOTQyLCAweDg1RTYsIDB4NDg4MywgMHg4NUU5LCAweDBENjEsIDB4ODVFQSwgMHgxOTM1LAotICAgIDB4ODVFRCwgMHg0MkNBLCAweDg1RjQsIDB4Mzc4MCwgMHg4NUY2LCAweDQ4ODQsIDB4ODVGNywgMHgwOTdELAotICAgIDB4ODVGOSwgMHgxOTQ0LCAweDg1RkEsIDB4MTk0OSwgMHg4NUZCLCAweDBBRjYsIDB4ODVGRSwgMHgxOTQ4LAotICAgIDB4ODVGRiwgMHg0MkNCLCAweDg2MDAsIDB4NDg4NSwgMHg4NjAyLCAweDE5MjksIDB4ODYwNCwgMHg0MkNDLAotICAgIDB4ODYwNSwgMHg0MkNELCAweDg2MDYsIDB4MTk0QSwgMHg4NjA3LCAweDBBQ0IsIDB4ODYwQSwgMHgxOTQ1LAotICAgIDB4ODYwQiwgMHgxOTQ3LCAweDg2MTAsIDB4NDJDRSwgMHg4NjExLCAweDQ4ODYsIDB4ODYxMiwgMHgzQUU1LAotICAgIDB4ODYxMywgMHgxOTQ2LCAweDg2MTYsIDB4MTREMCwgMHg4NjE3LCAweDE0QzEsIDB4ODYxOCwgMHg0MkQwLAotICAgIDB4ODYxQSwgMHgxOTRDLCAweDg2MUUsIDB4NDg4NywgMHg4NjIxLCAweDQ4ODgsIDB4ODYyMiwgMHgxOTRCLAotICAgIDB4ODYyNCwgMHg0ODg5LCAweDg2MjcsIDB4NDg4QSwgMHg4NjI5LCAweDNBRTYsIDB4ODYyRCwgMHgwRjYwLAotICAgIDB4ODYyRiwgMHgxNkIxLCAweDg2MzAsIDB4MTk0RCwgMHg4NjM4LCAweDQyRDEsIDB4ODYzOSwgMHg0ODhDLAotICAgIDB4ODYzQywgMHg0ODhELCAweDg2M0YsIDB4MTk0RSwgMHg4NjQwLCAweDQ4OEYsIDB4ODY0MSwgMHg0MUI4LAotICAgIDB4ODY0MiwgMHg0RDI5LCAweDg2NDYsIDB4NEQyQSwgMHg4NjRELCAweDE5NEYsIDB4ODY0RSwgMHgwNzhCLAotICAgIDB4ODY1MCwgMHgwNjZFLCAweDg2NTIsIDB4M0FFNywgMHg4NjUzLCAweDQ4OTAsIDB4ODY1NCwgMHgxOTUxLAotICAgIDB4ODY1NSwgMHgxMDk0LCAweDg2NTYsIDB4NDg5MSwgMHg4NjU3LCAweDQyRDIsIDB4ODY1QSwgMHgwNjhGLAotICAgIDB4ODY1QiwgMHgzNDE4LCAweDg2NUMsIDB4MEY4MiwgMHg4NjVFLCAweDA2RUIsIDB4ODY1RiwgMHgxOTUyLAotICAgIDB4ODY2MiwgMHg0MkQzLCAweDg2NjMsIDB4M0FFOCwgMHg4NjY3LCAweDE5NTMsIDB4ODY2QiwgMHgwQkFDLAotICAgIDB4ODY2QywgMHgzQUU5LCAweDg2NkYsIDB4M0FFQSwgMHg4NjcxLCAweDE5NTQsIDB4ODY3NSwgMHg0MkQ1LAotICAgIDB4ODY3NywgMHg0ODkyLCAweDg2NzksIDB4MENEMiwgMHg4NjdBLCAweDNBRUIsIDB4ODY3QiwgMHgwNDdFLAotICAgIDB4ODY3RCwgMHgzNzg2LCAweDg2ODcsIDB4NDg5MywgMHg4Njg5LCAweDQ4OTQsIDB4ODY4QSwgMHgwNTYzLAotICAgIDB4ODY4QiwgMHgxOTU5LCAweDg2OEMsIDB4MTk1QSwgMHg4NjhELCAweDNBRUMsIDB4ODY5MSwgMHgzQUVELAotICAgIDB4ODY5MywgMHgxOTU1LCAweDg2OTUsIDB4MDg4QiwgMHg4Njk4LCAweDNBRUUsIDB4ODY5QywgMHg0ODk1LAotICAgIDB4ODY5RCwgMHg0ODk2LCAweDg2QTMsIDB4MTk1NiwgMHg4NkE0LCAweDBDRjgsIDB4ODZBNywgMHgzQUVGLAotICAgIDB4ODZBOCwgMHgzQUYwLCAweDg2QTksIDB4MTk1NywgMHg4NkFBLCAweDE5NTgsIDB4ODZBQiwgMHgxOTYyLAotICAgIDB4ODZBRiwgMHgxOTVDLCAweDg2QjAsIDB4MTk1RiwgMHg4NkIxLCAweDQ4OTcsIDB4ODZCMywgMHg0ODk4LAotICAgIDB4ODZCNiwgMHgxOTVCLCAweDg2QjgsIDB4NDJENiwgMHg4NkMwLCAweDREMkIsIDB4ODZDMSwgMHg0ODk5LAotICAgIDB4ODZDMywgMHg0ODlBLCAweDg2QzQsIDB4MTk1RCwgMHg4NkM2LCAweDE5NUUsIDB4ODZDNywgMHgwOTA0LAotICAgIDB4ODZDOSwgMHgxOTYwLCAweDg2Q0IsIDB4MEI3RiwgMHg4NkNELCAweDA3MkMsIDB4ODZDRSwgMHgwNUEwLAotICAgIDB4ODZEMSwgMHg0ODlCLCAweDg2RDQsIDB4MTk2MywgMHg4NkQ1LCAweDQ4OUMsIDB4ODZENywgMHg0ODlELAotICAgIDB4ODZEOSwgMHgwNTlELCAweDg2REIsIDB4MTk2OCwgMHg4NkRFLCAweDE5NjQsIDB4ODZERiwgMHgxOTY3LAotICAgIDB4ODZFMywgMHg0ODlFLCAweDg2RTQsIDB4MEQ0RSwgMHg4NkU2LCAweDQ4OUYsIDB4ODZFOSwgMHgxOTY1LAotICAgIDB4ODZFQywgMHgxOTY2LCAweDg2RUQsIDB4MERCQSwgMHg4NkVFLCAweDBENkUsIDB4ODZFRiwgMHgxOTY5LAotICAgIDB4ODZGOCwgMHgwQjVELCAweDg2RjksIDB4MTk3MywgMHg4NkZBLCAweDNBRjEsIDB4ODZGQiwgMHgxOTZGLAotICAgIDB4ODZGQywgMHg0MkQ3LCAweDg2RkQsIDB4M0FGMiwgMHg4NkZFLCAweDA1NkIsIDB4ODcwMCwgMHgxOTZELAotICAgIDB4ODcwMiwgMHgwRTU4LCAweDg3MDMsIDB4MTk2RSwgMHg4NzA1LCAweDQ4QTEsIDB4ODcwNiwgMHgxOTZCLAotICAgIDB4ODcwNywgMHg0OEEyLCAweDg3MDgsIDB4MTk2QywgMHg4NzA5LCAweDE5NzEsIDB4ODcwQSwgMHgxOTc0LAotICAgIDB4ODcwQiwgMHgzQUYzLCAweDg3MEQsIDB4MTk3MiwgMHg4NzBFLCAweDQ4QTMsIDB4ODcxMCwgMHg0OEE0LAotICAgIDB4ODcxMSwgMHgxOTcwLCAweDg3MTIsIDB4MTk2QSwgMHg4NzEzLCAweDNBRjQsIDB4ODcxNCwgMHg0RDJDLAotICAgIDB4ODcxOCwgMHgwQjk2LCAweDg3MTksIDB4M0FGNSwgMHg4NzFBLCAweDE5N0IsIDB4ODcxQywgMHgwRUI2LAotICAgIDB4ODcxRSwgMHgzQUY2LCAweDg3MUYsIDB4NDhBNSwgMHg4NzIxLCAweDQ4QTYsIDB4ODcyMiwgMHg0RDJELAotICAgIDB4ODcyMywgMHg0OEE3LCAweDg3MjUsIDB4MTk3OSwgMHg4NzI4LCAweDNBRjcsIDB4ODcyOSwgMHgxOTdBLAotICAgIDB4ODcyRSwgMHg0RDJFLCAweDg3MzEsIDB4NDhBOCwgMHg4NzM0LCAweDE5NzUsIDB4ODczNywgMHgxOTc3LAotICAgIDB4ODczOSwgMHg0RDJGLCAweDg3M0EsIDB4NDhBOSwgMHg4NzNCLCAweDE5NzgsIDB4ODczRSwgMHgzQUY4LAotICAgIDB4ODczRiwgMHgxOTc2LCAweDg3NDAsIDB4NDhBQSwgMHg4NzQzLCAweDQ4QUIsIDB4ODc0OSwgMHgwQThBLAotICAgIDB4ODc0QiwgMHgwRkRGLCAweDg3NEMsIDB4MTk3RiwgMHg4NzRFLCAweDE5ODAsIDB4ODc1MSwgMHg0OEFDLAotICAgIDB4ODc1MywgMHgxOTg2LCAweDg3NTUsIDB4MDlGMCwgMHg4NzU3LCAweDE5ODIsIDB4ODc1OCwgMHg0OEFELAotICAgIDB4ODc1OSwgMHgxOTg1LCAweDg3NUQsIDB4NEQzMCwgMHg4NzVGLCAweDE5N0QsIDB4ODc2MCwgMHgxOTdDLAotICAgIDB4ODc2MywgMHgxOTg3LCAweDg3NjQsIDB4NDhBRSwgMHg4NzY1LCAweDQ4QUYsIDB4ODc2NiwgMHgwNTVDLAotICAgIDB4ODc2OCwgMHgxOTgzLCAweDg3NkEsIDB4MTk4OCwgMHg4NzZFLCAweDE5ODQsIDB4ODc3MSwgMHgzQUY5LAotICAgIDB4ODc3MiwgMHg0OEIwLCAweDg3NzQsIDB4MTk4MSwgMHg4Nzc2LCAweDBCQ0YsIDB4ODc3OCwgMHgxOTdFLAotICAgIDB4ODc3QiwgMHg0RDMxLCAweDg3N0MsIDB4NDhCMSwgMHg4NzdGLCAweDBEMUUsIDB4ODc4MiwgMHgxOThDLAotICAgIDB4ODc4NywgMHg0MkQ4LCAweDg3ODgsIDB4M0FGQSwgMHg4Nzg5LCAweDQ4QjUsIDB4ODc4QiwgMHg0OEI2LAotICAgIDB4ODc4QywgMHg0RDMyLCAweDg3OEQsIDB4MEYyNSwgMHg4NzhFLCAweDREMzMsIDB4ODc5MywgMHg0OEI3LAotICAgIDB4ODc5NywgMHg0RDM0LCAweDg3OTgsIDB4NEQzNSwgMHg4Nzk5LCAweDNBRkIsIDB4ODc5RSwgMHg0RDM2LAotICAgIDB4ODc5RiwgMHgxOThCLCAweDg3QTAsIDB4NDhCOCwgMHg4N0EyLCAweDE5OEEsIDB4ODdBMywgMHg0RDM3LAotICAgIDB4ODdBNywgMHg0OEI0LCAweDg3QUIsIDB4MTk5MywgMHg4N0FDLCAweDNBRkMsIDB4ODdBRCwgMHgzQUZELAotICAgIDB4ODdBRSwgMHg0RDM4LCAweDg3QUYsIDB4MTk4RCwgMHg4N0IzLCAweDE5OTUsIDB4ODdCNSwgMHgzQUZFLAotICAgIDB4ODdCQSwgMHgwRjUwLCAweDg3QkIsIDB4MTk5OCwgMHg4N0JELCAweDE5OEYsIDB4ODdCRSwgMHg0OEJCLAotICAgIDB4ODdCRiwgMHg0RDM5LCAweDg3QzAsIDB4MTk5MCwgMHg4N0MxLCAweDQ4QkQsIDB4ODdDNCwgMHgxOTk0LAotICAgIDB4ODdDNiwgMHgxOTk3LCAweDg3QzcsIDB4MTk5NiwgMHg4N0M5LCAweDREM0EsIDB4ODdDQiwgMHgxOThFLAotICAgIDB4ODdDRSwgMHg0OEJFLCAweDg3RDAsIDB4MTk5MSwgMHg4N0QyLCAweDE5QTIsIDB4ODdENiwgMHgzQUZGLAotICAgIDB4ODdEQSwgMHg0RDNCLCAweDg3REYsIDB4NDhCRiwgMHg4N0UwLCAweDE5OUIsIDB4ODdFMywgMHg0OEMxLAotICAgIDB4ODdFNSwgMHg0OEMyLCAweDg3RTYsIDB4NDhDMywgMHg4N0VBLCAweDQ4QzQsIDB4ODdFQiwgMHgzQjAwLAotICAgIDB4ODdFQywgMHgxRTIzLCAweDg3RUQsIDB4M0IwMSwgMHg4N0VGLCAweDE5OTksIDB4ODdGMiwgMHgxOTlBLAotICAgIDB4ODdGNSwgMHgzQzNELCAweDg3RjYsIDB4MTk5RiwgMHg4N0Y3LCAweDE5QTAsIDB4ODdGOSwgMHgwNTg4LAotICAgIDB4ODdGQiwgMHgwNjVDLCAweDg3RkUsIDB4MTk5RSwgMHg4ODAxLCAweDNCMDIsIDB4ODgwMywgMHg0RjU4LAotICAgIDB4ODgwNSwgMHgxOTg5LCAweDg4MDYsIDB4M0IwNCwgMHg4ODA3LCAweDIxQTYsIDB4ODgwQSwgMHg0MkRBLAotICAgIDB4ODgwQiwgMHgzQjA1LCAweDg4MEQsIDB4MTk5RCwgMHg4ODBFLCAweDE5QTEsIDB4ODgwRiwgMHgxOTlDLAotICAgIDB4ODgxMCwgMHg0MkRCLCAweDg4MTEsIDB4MTlBMywgMHg4ODEzLCAweDQ4QzUsIDB4ODgxNCwgMHgzQjA2LAotICAgIDB4ODgxNSwgMHgxOUE1LCAweDg4MTYsIDB4MTlBNCwgMHg4ODE4LCAweDREM0MsIDB4ODgxQiwgMHg0RDNELAotICAgIDB4ODgxQywgMHgzQjA3LCAweDg4MUYsIDB4MUU4NSwgMHg4ODIxLCAweDE5QTcsIDB4ODgyMiwgMHgxOUE2LAotICAgIDB4ODgyMywgMHgxOTYxLCAweDg4MjcsIDB4MTlBQiwgMHg4ODI4LCAweDQ4QzYsIDB4ODgyRCwgMHg0RDNFLAotICAgIDB4ODgyRSwgMHg0OEM3LCAweDg4MzEsIDB4MTlBOCwgMHg4ODMyLCAweDQ4QzgsIDB4ODgzNiwgMHgxOUE5LAotICAgIDB4ODgzOSwgMHgxOUFBLCAweDg4M0EsIDB4NEQzRiwgMHg4ODNCLCAweDE5QUMsIDB4ODgzQywgMHg0OEM5LAotICAgIDB4ODg0MCwgMHgwNzQyLCAweDg4NDIsIDB4MTlBRSwgMHg4ODQ0LCAweDE5QUQsIDB4ODg0NSwgMHg0RDQwLAotICAgIDB4ODg0NiwgMHgwOTNBLCAweDg4NEEsIDB4NDhDQiwgMHg4ODRCLCAweDRENDEsIDB4ODg0QywgMHgwN0U2LAotICAgIDB4ODg0RCwgMHgxNTI0LCAweDg4NEUsIDB4NEQ0MiwgMHg4ODUyLCAweDE5QUYsIDB4ODg1MywgMHgwOTVCLAotICAgIDB4ODg1NSwgMHg0RDQzLCAweDg4NTYsIDB4M0IwOCwgMHg4ODU3LCAweDA1OTcsIDB4ODg1OCwgMHg0OENDLAotICAgIDB4ODg1OSwgMHgxOUIwLCAweDg4NUEsIDB4NEQ0NCwgMHg4ODVCLCAweDA0RjQsIDB4ODg1RCwgMHgwOUJGLAotICAgIDB4ODg1RSwgMHgxOUIxLCAweDg4NUYsIDB4M0IwOSwgMHg4ODYxLCAweDA3RTcsIDB4ODg2MiwgMHgxOUIyLAotICAgIDB4ODg2MywgMHgwNEE1LCAweDg4NjQsIDB4M0IwQSwgMHg4ODY4LCAweDBEQUYsIDB4ODg2OSwgMHg0OENGLAotICAgIDB4ODg2QiwgMHgxOUIzLCAweDg4NkUsIDB4NEQ0NSwgMHg4ODZGLCAweDQ4RDEsIDB4ODg3MCwgMHgwQTMwLAotICAgIDB4ODg3MiwgMHgxOUJBLCAweDg4NzUsIDB4MTlCNywgMHg4ODc3LCAweDBCQUQsIDB4ODg3RCwgMHgxOUI4LAotICAgIDB4ODg3RSwgMHgxOUI1LCAweDg4N0YsIDB4MDZENiwgMHg4ODgxLCAweDE5QjQsIDB4ODg4MiwgMHgxOUJCLAotICAgIDB4ODg4OCwgMHgwNzBDLCAweDg4OEIsIDB4MEIzRSwgMHg4ODhELCAweDE5QzEsIDB4ODg5MiwgMHgxOUJELAotICAgIDB4ODg5NiwgMHgwQjE1LCAweDg4OTcsIDB4MTlCQywgMHg4ODk4LCAweDNCMEIsIDB4ODg5OSwgMHgxOUJGLAotICAgIDB4ODg5QSwgMHg0RDQ2LCAweDg4OUIsIDB4NEQ0NywgMHg4ODlDLCAweDRENDgsIDB4ODg5RSwgMHgxOUI2LAotICAgIDB4ODhBMCwgMHg0OEQyLCAweDg4QTIsIDB4MTlDMCwgMHg4OEE0LCAweDE5QzIsIDB4ODhBQSwgMHgzQjBDLAotICAgIDB4ODhBQiwgMHgwRDgzLCAweDg4QUUsIDB4MTlCRSwgMHg4OEIwLCAweDE5QzMsIDB4ODhCMSwgMHgxOUM1LAotICAgIDB4ODhCNCwgMHgwNzg3LCAweDg4QjUsIDB4MTlCOSwgMHg4OEI3LCAweDA0ODUsIDB4ODhCQywgMHg0OEQzLAotICAgIDB4ODhCRCwgMHgzQjBELCAweDg4QkUsIDB4M0IwRSwgMHg4OEJGLCAweDE5QzQsIDB4ODhDMCwgMHg0OEQ0LAotICAgIDB4ODhDMSwgMHgwODRCLCAweDg4QzIsIDB4MEZCRSwgMHg4OEMzLCAweDE5QzYsIDB4ODhDNCwgMHgxOUM3LAotICAgIDB4ODhDNSwgMHgwQUY3LCAweDg4QzYsIDB4Mzc4OSwgMHg4OENBLCAweDNCMEYsIDB4ODhDRCwgMHg0RDQ5LAotICAgIDB4ODhDRSwgMHg0MkRDLCAweDg4Q0YsIDB4MEY2QSwgMHg4OEQxLCAweDQ4RDYsIDB4ODhEMiwgMHgzQjEwLAotICAgIDB4ODhEMywgMHg0OEQ3LCAweDg4RDQsIDB4MTlDOCwgMHg4OEQ1LCAweDBGMUYsIDB4ODhEOCwgMHgxOUM5LAotICAgIDB4ODhEOSwgMHgxOUNBLCAweDg4REIsIDB4M0IxMSwgMHg4OERDLCAweDBFMzQsIDB4ODhERCwgMHgxOUNCLAotICAgIDB4ODhERiwgMHgwODMwLCAweDg4RTAsIDB4NEQ0QSwgMHg4OEUxLCAweDBGNkIsIDB4ODhFOCwgMHgxOUQwLAotICAgIDB4ODhFRiwgMHg0RDRCLCAweDg4RjAsIDB4M0IxMiwgMHg4OEYxLCAweDNCMTMsIDB4ODhGMiwgMHgxOUQxLAotICAgIDB4ODhGMywgMHgwOUMwLCAweDg4RjQsIDB4MTlDRiwgMHg4OEY1LCAweDIxQTcsIDB4ODhGOCwgMHgwRjUxLAotICAgIDB4ODhGOSwgMHgxOUNDLCAweDg4RkMsIDB4MTlDRSwgMHg4OEZELCAweDBBNjEsIDB4ODhGRSwgMHgwQTQ0LAotICAgIDB4ODkwMSwgMHg0OEQ5LCAweDg5MDIsIDB4MTlDRCwgMHg4OTA0LCAweDE5RDIsIDB4ODkwNiwgMHgzQjE0LAotICAgIDB4ODkwNywgMHgwREYzLCAweDg5MEEsIDB4MTlENCwgMHg4OTBDLCAweDE5RDMsIDB4ODkwRSwgMHg0RDRDLAotICAgIDB4ODkwRiwgMHg0RDRELCAweDg5MTAsIDB4MDVDQSwgMHg4OTEyLCAweDBFNTksIDB4ODkxMywgMHgxOUQ1LAotICAgIDB4ODkxOCwgMHgzQjE1LCAweDg5MTksIDB4M0IxNiwgMHg4OTFBLCAweDNCMTcsIDB4ODkxQywgMHgyMEE4LAotICAgIDB4ODkxRCwgMHgxOUUxLCAweDg5MUUsIDB4MTlENywgMHg4OTI1LCAweDE5RDgsIDB4ODkyNiwgMHg0RDRFLAotICAgIDB4ODkyNywgMHgzQjE4LCAweDg5MkEsIDB4MTlEOSwgMHg4OTJCLCAweDE5REEsIDB4ODkzMCwgMHgzQjE5LAotICAgIDB4ODkzMiwgMHg0MkRFLCAweDg5MzUsIDB4NEQ0RiwgMHg4OTM2LCAweDE5REUsIDB4ODkzNywgMHg0OERCLAotICAgIDB4ODkzOCwgMHgxOURGLCAweDg5MzksIDB4NDJERiwgMHg4OTNCLCAweDE5REQsIDB4ODkzRSwgMHgzQjFBLAotICAgIDB4ODk0MCwgMHg0MkUwLCAweDg5NDEsIDB4MTlEQiwgMHg4OTQyLCAweDQ4REQsIDB4ODk0MywgMHgxOUQ2LAotICAgIDB4ODk0NCwgMHgxOURDLCAweDg5NDUsIDB4NDhERSwgMHg4OTQ5LCAweDQ4REYsIDB4ODk0QywgMHgxOUUwLAotICAgIDB4ODk0RCwgMHgxQkQwLCAweDg5NTYsIDB4MDUyOCwgMHg4OTVBLCAweDRENTAsIDB4ODk1QywgMHg0RDUxLAotICAgIDB4ODk1RSwgMHgxOUUzLCAweDg5NUYsIDB4MDZENywgMHg4OTYwLCAweDE5RTIsIDB4ODk2MiwgMHg0OEUxLAotICAgIDB4ODk2NCwgMHgxOUU1LCAweDg5NjYsIDB4MTlFNCwgMHg4OTZBLCAweDE5RTcsIDB4ODk2QiwgMHg0RDUyLAotICAgIDB4ODk2RCwgMHgxOUU2LCAweDg5NkYsIDB4MTlFOCwgMHg4OTcwLCAweDRENTMsIDB4ODk3MiwgMHgwOTNCLAotICAgIDB4ODk3NCwgMHgxOUU5LCAweDg5NzcsIDB4MTlFQSwgMHg4OTdCLCAweDNCMUIsIDB4ODk3QywgMHg0RDU0LAotICAgIDB4ODk3RSwgMHgxOUVCLCAweDg5N0YsIDB4MEE2MiwgMHg4OTgwLCAweDM2MkUsIDB4ODk4MSwgMHgwRjQxLAotICAgIDB4ODk4MywgMHgxOUVDLCAweDg5ODYsIDB4MERGNCwgMHg4OTg3LCAweDBDRkMsIDB4ODk4OCwgMHgxOUVELAotICAgIDB4ODk4OSwgMHg0OEUyLCAweDg5OEEsIDB4MTlFRSwgMHg4OThCLCAweDA3NUYsIDB4ODk4RiwgMHgwNjQ2LAotICAgIDB4ODk5MCwgMHg0OEUzLCAweDg5OTMsIDB4MTlFRiwgMHg4OTk0LCAweDQyRTEsIDB4ODk5NiwgMHgwOEI5LAotICAgIDB4ODk5NywgMHgwQ0Y3LCAweDg5OTgsIDB4MTlGMCwgMHg4OTlBLCAweDA1QUUsIDB4ODk5RiwgMHg0OEU0LAotICAgIDB4ODlBMSwgMHgxOUYxLCAweDg5QTUsIDB4NEQ1NSwgMHg4OUE2LCAweDE5RjMsIDB4ODlBNywgMHgwRjYxLAotICAgIDB4ODlBOSwgMHgxOUYyLCAweDg5QUEsIDB4MEEwQywgMHg4OUFDLCAweDE5RjQsIDB4ODlBRiwgMHgxOUY1LAotICAgIDB4ODlCMCwgMHg0OEU1LCAweDg5QjIsIDB4MTlGNiwgMHg4OUIzLCAweDA2MEQsIDB4ODlCNSwgMHg0RDU2LAotICAgIDB4ODlCNywgMHg0OEU2LCAweDg5QkEsIDB4MTlGNywgMHg4OUJDLCAweDRENTcsIDB4ODlCRCwgMHgxOUY4LAotICAgIDB4ODlCRiwgMHgxOUY5LCAweDg5QzAsIDB4MTlGQSwgMHg4OUQyLCAweDA1QUYsIDB4ODlENCwgMHgzQjFDLAotICAgIDB4ODlENSwgMHg0RDU4LCAweDg5RDYsIDB4M0IxRCwgMHg4OUQ4LCAweDQ4RTcsIDB4ODlEQSwgMHgxOUZCLAotICAgIDB4ODlEQywgMHgxOUZDLCAweDg5REQsIDB4MTlGRCwgMHg4OUUzLCAweDA1NzIsIDB4ODlFNSwgMHgzQjFFLAotICAgIDB4ODlFNiwgMHgwOUVFLCAweDg5RTcsIDB4MTlGRSwgMHg4OUVCLCAweDQ4RTgsIDB4ODlGMSwgMHgzQjFGLAotICAgIDB4ODlGMywgMHg0OEVBLCAweDg5RjQsIDB4MTlGRiwgMHg4OUY2LCAweDQyRTIsIDB4ODlGOCwgMHgxQTAwLAotICAgIDB4ODlGRCwgMHg0OEVCLCAweDg5RkYsIDB4NDhFQywgMHg4QTAwLCAweDA3NzQsIDB4OEEwMSwgMHgzNUJDLAotICAgIDB4OEEwMiwgMHgwQzE3LCAweDhBMDMsIDB4MUEwMSwgMHg4QTA3LCAweDNCMjAsIDB4OEEwOCwgMHgwNzJELAotICAgIDB4OEEwQSwgMHgwQTFDLCAweDhBMEMsIDB4MUEwNCwgMHg4QTBFLCAweDBDN0MsIDB4OEEwRiwgMHgzQjIxLAotICAgIDB4OEExMCwgMHgxQTAzLCAweDhBMTEsIDB4NDhFRSwgMHg4QTEyLCAweDIxQTgsIDB4OEExMywgMHgwNzA3LAotICAgIDB4OEExNCwgMHg0OEVGLCAweDhBMTUsIDB4M0IyMiwgMHg4QTE2LCAweDFBMDIsIDB4OEExNywgMHgwQjU3LAotICAgIDB4OEExOCwgMHgwNjQ3LCAweDhBMUIsIDB4MUEwNSwgMHg4QTFELCAweDFBMDYsIDB4OEExRiwgMHgwOUMxLAotICAgIDB4OEEyMSwgMHg0OEYxLCAweDhBMjIsIDB4M0IyMywgMHg4QTIzLCAweDA3NDMsIDB4OEEyNSwgMHgxQTA3LAotICAgIDB4OEEyQSwgMHgwRTVBLCAweDhBMkQsIDB4MEE4MywgMHg4QTMxLCAweDA2OTAsIDB4OEEzMywgMHgwRjAxLAotICAgIDB4OEEzNCwgMHgwQUNDLCAweDhBMzUsIDB4NDhGMiwgMHg4QTM2LCAweDFBMDgsIDB4OEEzNywgMHgyMUE5LAotICAgIDB4OEEzQSwgMHgwQTBELCAweDhBM0IsIDB4MEJBRSwgMHg4QTNDLCAweDA5QzIsIDB4OEEzRSwgMHg0OEYzLAotICAgIDB4OEE0MSwgMHgxQTA5LCAweDhBNDUsIDB4NDhGNCwgMHg4QTQ2LCAweDFBMEMsIDB4OEE0NywgMHg0MkUzLAotICAgIDB4OEE0OCwgMHgxQTBELCAweDhBNDksIDB4NEQ1OSwgMHg4QTRELCAweDQ4RjUsIDB4OEE0RSwgMHgzQjI0LAotICAgIDB4OEE1MCwgMHgwODJFLCAweDhBNTEsIDB4MEIyMiwgMHg4QTUyLCAweDFBMEIsIDB4OEE1NCwgMHgwOUMzLAotICAgIDB4OEE1NSwgMHgwREIwLCAweDhBNTcsIDB4NEQ1QSwgMHg4QTU4LCAweDQ4RjYsIDB4OEE1QiwgMHgxQTBBLAotICAgIDB4OEE1RCwgMHg0MkU0LCAweDhBNUUsIDB4MDhCQSwgMHg4QTYwLCAweDA0RjUsIDB4OEE2MSwgMHg0MkU1LAotICAgIDB4OEE2MiwgMHgxQTExLCAweDhBNjMsIDB4MDcyRSwgMHg4QTY2LCAweDA4QkMsIDB4OEE2NywgMHg0RDVCLAotICAgIDB4OEE2OSwgMHgwOEJCLCAweDhBNkIsIDB4MEZGMywgMHg4QTZDLCAweDFBMTAsIDB4OEE2RCwgMHgxQTBGLAotICAgIDB4OEE2RSwgMHgwQUE5LCAweDhBNzAsIDB4MDY2NywgMHg4QTcxLCAweDBGRTksIDB4OEE3MiwgMHgwNTk4LAotICAgIDB4OEE3MywgMHgwOUM0LCAweDhBNzUsIDB4NDJFNiwgMHg4QTc5LCAweDIxQUEsIDB4OEE3QywgMHgxQTBFLAotICAgIDB4OEE3RSwgMHg0RDVDLCAweDhBN0YsIDB4M0IyNSwgMHg4QTgyLCAweDFBMTMsIDB4OEE4NCwgMHgxQTE0LAotICAgIDB4OEE4NSwgMHgxQTEyLCAweDhBODYsIDB4NEQ1RCwgMHg4QTg3LCAweDA3OEMsIDB4OEE4OSwgMHgwRjJBLAotICAgIDB4OEE4QywgMHgwOEJELCAweDhBOEQsIDB4MENERCwgMHg4QTkwLCAweDQ4RjgsIDB4OEE5MSwgMHgxQTE3LAotICAgIDB4OEE5MywgMHgwQTY0LCAweDhBOTUsIDB4MEI4MCwgMHg4QTk2LCAweDRENUUsIDB4OEE5OCwgMHgwRjIwLAotICAgIDB4OEE5QSwgMHgxQTFBLCAweDhBOUUsIDB4MDdBMCwgMHg4QUEwLCAweDBBNjMsIDB4OEFBMSwgMHgxQTE2LAotICAgIDB4OEFBMywgMHgxQTFCLCAweDhBQTQsIDB4MDdBMSwgMHg4QUE1LCAweDFBMTgsIDB4OEFBNiwgMHgxQTE5LAotICAgIDB4OEFBNywgMHgyMUFCLCAweDhBQTgsIDB4MUExNSwgMHg4QUFBLCAweDM2MzgsIDB4OEFBQywgMHgwQTg2LAotICAgIDB4OEFBRCwgMHgwQ0ExLCAweDhBQUUsIDB4NDhGNywgMHg4QUIwLCAweDBCNkQsIDB4OEFCMiwgMHgwNTVELAotICAgIDB4OEFCNiwgMHg0RDVGLCAweDhBQjcsIDB4NDhGOSwgMHg4QUI5LCAweDBEODQsIDB4OEFCQywgMHgwNjVELAotICAgIDB4OEFCRSwgMHgyMUFDLCAweDhBQkYsIDB4MEJEMCwgMHg4QUMyLCAweDFBMUUsIDB4OEFDNCwgMHgxQTFDLAotICAgIDB4OEFDNywgMHgwQjhBLCAweDhBQzksIDB4NEQ2MCwgMHg4QUNCLCAweDBBNjUsIDB4OEFDQywgMHgwNjBFLAotICAgIDB4OEFDRCwgMHgxQTFELCAweDhBQ0YsIDB4MEEyMSwgMHg4QUQwLCAweDQyRTcsIDB4OEFEMSwgMHg0RDYxLAotICAgIDB4OEFEMiwgMHgwRjkyLCAweDhBRDYsIDB4MEZFNiwgMHg4QUQ3LCAweDQ4RkEsIDB4OEFEQSwgMHgxQTFGLAotICAgIDB4OEFEQiwgMHgxQTJBLCAweDhBREMsIDB4MEJEMSwgMHg4QURELCAweDRENjIsIDB4OEFERSwgMHgxQTI5LAotICAgIDB4OEFERiwgMHgyMUFELCAweDhBRTAsIDB4MUEyNiwgMHg4QUUxLCAweDFBMkUsIDB4OEFFMiwgMHgxQTI3LAotICAgIDB4OEFFNCwgMHgxQTIzLCAweDhBRTYsIDB4MEMxOCwgMHg4QUU3LCAweDFBMjIsIDB4OEFFQiwgMHgxQTIwLAotICAgIDB4OEFFQywgMHg0RDYzLCAweDhBRUQsIDB4MEYwQiwgMHg4QUVFLCAweDA4QkUsIDB4OEFGMSwgMHgxQTI0LAotICAgIDB4OEFGMywgMHgxQTIxLCAweDhBRjQsIDB4M0IyNiwgMHg4QUY1LCAweDRENjQsIDB4OEFGNiwgMHgyMUFGLAotICAgIDB4OEFGNywgMHgxQTI4LCAweDhBRjgsIDB4MDk3RSwgMHg4QUZBLCAweDA3NzUsIDB4OEFGQywgMHg0OEZCLAotICAgIDB4OEFGRSwgMHgwQjVBLCAweDhCMDAsIDB4MEU3MywgMHg4QjAxLCAweDA0RkMsIDB4OEIwMiwgMHgwNEE2LAotICAgIDB4OEIwNCwgMHgwQzdELCAweDhCMDUsIDB4NDhGRSwgMHg4QjA2LCAweDRENjUsIDB4OEIwNywgMHgxQTJDLAotICAgIDB4OEIwQSwgMHg0OEZELCAweDhCMEMsIDB4MUEyQiwgMHg4QjBELCAweDQ4RkYsIDB4OEIwRSwgMHgwQ0JFLAotICAgIDB4OEIwRiwgMHg0RDY2LCAweDhCMTAsIDB4MUEzMCwgMHg4QjExLCAweDRENjcsIDB4OEIxNCwgMHgxQTI1LAotICAgIDB4OEIxNiwgMHgxQTJGLCAweDhCMTcsIDB4MUEzMSwgMHg4QjE5LCAweDA3NjAsIDB4OEIxQSwgMHgxQTJELAotICAgIDB4OEIxQiwgMHgwN0U4LCAweDhCMUMsIDB4NDkwMCwgMHg4QjFELCAweDA5MDEsIDB4OEIxRiwgMHgzQjI3LAotICAgIDB4OEIyMCwgMHgxQTMyLCAweDhCMjEsIDB4MEY0MiwgMHg4QjI2LCAweDFBMzUsIDB4OEIyOCwgMHgxQTM4LAotICAgIDB4OEIyQiwgMHgxQTM2LCAweDhCMkMsIDB4MERBNywgMHg4QjJELCAweDQ5MDEsIDB4OEIzMywgMHgxQTMzLAotICAgIDB4OEIzNywgMHgzQjI4LCAweDhCMzksIDB4MDZEOCwgMHg4QjNFLCAweDFBMzcsIDB4OEI0MSwgMHgxQTM5LAotICAgIDB4OEI0MywgMHgzQjI5LCAweDhCNDQsIDB4M0IyQSwgMHg4QjQ1LCAweDRENjgsIDB4OEI0NiwgMHg0MkU4LAotICAgIDB4OEI0OSwgMHgxQTNELCAweDhCNEMsIDB4MUEzQSwgMHg4QjRFLCAweDFBM0MsIDB4OEI0RiwgMHgxQTNCLAotICAgIDB4OEI1MSwgMHg0OTAzLCAweDhCNTIsIDB4NEQ2OSwgMHg4QjUzLCAweDIxQjAsIDB4OEI1NCwgMHgzQjJCLAotICAgIDB4OEI1NiwgMHgxQTNFLCAweDhCNTgsIDB4MDhERCwgMHg4QjU5LCAweDQyRTksIDB4OEI1QSwgMHgxQTQwLAotICAgIDB4OEI1QiwgMHgxQTNGLCAweDhCNUMsIDB4MEREQSwgMHg4QjVFLCAweDQ5MDQsIDB4OEI1RiwgMHgxQTQyLAotICAgIDB4OEI2NiwgMHgwNzJGLCAweDhCNjksIDB4NDJFQSwgMHg4QjZCLCAweDFBNDEsIDB4OEI2QywgMHgxQTQzLAotICAgIDB4OEI2RCwgMHg0RDZBLCAweDhCNkYsIDB4MUE0NCwgMHg4QjcwLCAweDA2NUUsIDB4OEI3MSwgMHgxODJFLAotICAgIDB4OEI3MiwgMHgwOUUxLCAweDhCNzQsIDB4MUE0NSwgMHg4Qjc2LCAweDQ5MDUsIDB4OEI3NywgMHgwN0EyLAotICAgIDB4OEI3OCwgMHg0RDZCLCAweDhCN0MsIDB4NEQ2QywgMHg4QjdELCAweDFBNDYsIDB4OEI3RSwgMHg0RDZELAotICAgIDB4OEI3RiwgMHgyMUIxLCAweDhCODAsIDB4MUE0NywgMHg4QjgxLCAweDQ5MDYsIDB4OEI4MywgMHgwODhDLAotICAgIDB4OEI4NSwgMHg0RDZFLCAweDhCOEEsIDB4MTNEMywgMHg4QjhCLCAweDQ5MDcsIDB4OEI4QywgMHgxQTQ4LAotICAgIDB4OEI4RSwgMHgxQTQ5LCAweDhCOTAsIDB4MDkzQywgMHg4QjkyLCAweDFBNEEsIDB4OEI5MywgMHgxQTRCLAotICAgIDB4OEI5NCwgMHg0OTA4LCAweDhCOTUsIDB4NDkwOSwgMHg4Qjk2LCAweDFBNEMsIDB4OEI5OSwgMHgxQTRELAotICAgIDB4OEI5QSwgMHgxQTRFLCAweDhCOUMsIDB4M0IyQywgMHg4QjlELCAweDQyRUIsIDB4OEI5RSwgMHgzQjJELAotICAgIDB4OEI5RiwgMHg0RDZGLCAweDhDMzcsIDB4MEI2OSwgMHg4QzM5LCAweDQ5MEEsIDB4OEMzQSwgMHgxQTRGLAotICAgIDB4OEMzRCwgMHg0OTBDLCAweDhDM0YsIDB4MUE1MSwgMHg4QzQxLCAweDFBNTAsIDB4OEM0NSwgMHg0OTBGLAotICAgIDB4OEM0NiwgMHgwQzdFLCAweDhDNDcsIDB4M0IyRSwgMHg4QzQ4LCAweDFBNTIsIDB4OEM0OSwgMHg0MkVDLAotICAgIDB4OEM0QSwgMHgwRTVCLCAweDhDNEIsIDB4NEQ3MCwgMHg4QzRDLCAweDFBNTMsIDB4OEM0RSwgMHgxQTU0LAotICAgIDB4OEM0RiwgMHg0OTEwLCAweDhDNTAsIDB4MUE1NSwgMHg4QzUzLCAweDRENzEsIDB4OEM1NCwgMHgzQjJGLAotICAgIDB4OEM1NSwgMHgxQTU2LCAweDhDNTcsIDB4NDkxMSwgMHg4QzVBLCAweDBDQjIsIDB4OEM2MSwgMHgwOUM1LAotICAgIDB4OEM2MiwgMHgxQTU3LCAweDhDNjgsIDB4NDJFRCwgMHg4QzY5LCAweDQ5MTIsIDB4OEM2QSwgMHgwN0ZELAotICAgIDB4OEM2QiwgMHgxMDA3LCAweDhDNkMsIDB4MUE1OCwgMHg4QzZELCAweDQ5MTMsIDB4OEM3MywgMHgzQjMwLAotICAgIDB4OEM3OCwgMHgxQTU5LCAweDhDNzksIDB4MERCMSwgMHg4QzdBLCAweDFBNUEsIDB4OEM3QiwgMHg0RDcyLAotICAgIDB4OEM3QywgMHgxQTYyLCAweDhDODIsIDB4MUE1QiwgMHg4Qzg1LCAweDFBNUQsIDB4OEM4OSwgMHgxQTVDLAotICAgIDB4OEM4QSwgMHgxQTVFLCAweDhDOEMsIDB4MEU3NCwgMHg4QzhELCAweDFBNUYsIDB4OEM4RSwgMHgxQTYwLAotICAgIDB4OEM5MiwgMHg0OTE2LCAweDhDOTMsIDB4NDkxNSwgMHg4Qzk0LCAweDFBNjEsIDB4OEM5OCwgMHgxQTYzLAotICAgIDB4OEM5OSwgMHg0OTE3LCAweDhDOUIsIDB4NDkxOSwgMHg4QzlELCAweDA1OEIsIDB4OEM5RSwgMHgwQzAzLAotICAgIDB4OEM5RiwgMHgzNTRDLCAweDhDQTAsIDB4MEREQiwgMHg4Q0ExLCAweDA4NTIsIDB4OENBMiwgMHgwN0U5LAotICAgIDB4OENBNCwgMHgzQjMxLCAweDhDQTcsIDB4MERDMSwgMHg4Q0E4LCAweDA1NUYsIDB4OENBOSwgMHgwRDYyLAotICAgIDB4OENBQSwgMHgxQTY2LCAweDhDQUIsIDB4MDYwRiwgMHg4Q0FDLCAweDBBNzksIDB4OENBRCwgMHgxQTY1LAotICAgIDB4OENBRSwgMHgxQTZBLCAweDhDQUYsIDB4MEJCNywgMHg4Q0IwLCAweDBFRUYsIDB4OENCMiwgMHgxQTY4LAotICAgIDB4OENCMywgMHgxQTY5LCAweDhDQjQsIDB4MDY0OCwgMHg4Q0I2LCAweDFBNkIsIDB4OENCNywgMHgwRDE5LAotICAgIDB4OENCOCwgMHgwQjNGLCAweDhDQkEsIDB4NEQ3MywgMHg4Q0JCLCAweDBEODUsIDB4OENCQywgMHgwQzM3LAotICAgIDB4OENCRCwgMHgxQTY3LCAweDhDQkYsIDB4MEU3NSwgMHg4Q0MwLCAweDA1NkMsIDB4OENDMSwgMHgxQTZELAotICAgIDB4OENDMiwgMHgwRkNFLCAweDhDQzMsIDB4MEJERSwgMHg4Q0M0LCAweDBGRUIsIDB4OENDNSwgMHg0RDc0LAotICAgIDB4OENDNywgMHgwOEJGLCAweDhDQzgsIDB4MUE2QywgMHg4Q0M5LCAweDRENzUsIDB4OENDQSwgMHgwQjExLAotICAgIDB4OENDRCwgMHgxQTdELCAweDhDQ0UsIDB4MEFBQSwgMHg4Q0QxLCAweDBDRDAsIDB4OENEMiwgMHg0RDc2LAotICAgIDB4OENEMywgMHgwREMyLCAweDhDRDUsIDB4NDkxQiwgMHg4Q0Q2LCAweDQ5MUEsIDB4OENEOSwgMHgzQjMyLAotICAgIDB4OENEQSwgMHgxQTcwLCAweDhDREIsIDB4MDg4RCwgMHg4Q0RDLCAweDA4QzAsIDB4OENERSwgMHgwOUM2LAotICAgIDB4OENFMCwgMHgwRDFCLCAweDhDRTEsIDB4M0IzMywgMHg4Q0UyLCAweDA3NjEsIDB4OENFMywgMHgxQTZGLAotICAgIDB4OENFNCwgMHgxQTZFLCAweDhDRTYsIDB4MEREQywgMHg4Q0VBLCAweDA4RUQsIDB4OENFQywgMHg0RDc3LAotICAgIDB4OENFRCwgMHgwQzRDLCAweDhDRjAsIDB4MjFCMiwgMHg4Q0YxLCAweDQ5MUQsIDB4OENGNCwgMHgyMUIzLAotICAgIDB4OENGNSwgMHg0RDc4LCAweDhDRjcsIDB4NEQ3OSwgMHg4Q0Y4LCAweDNCMzQsIDB4OENGQSwgMHgxQTcyLAotICAgIDB4OENGQiwgMHgxQTczLCAweDhDRkMsIDB4MDdFQSwgMHg4Q0ZELCAweDFBNzEsIDB4OENGRSwgMHgzQjM1LAotICAgIDB4OEQwMSwgMHg0RDdBLCAweDhEMDMsIDB4NEQ3QiwgMHg4RDA0LCAweDFBNzQsIDB4OEQwNSwgMHgxQTc1LAotICAgIDB4OEQwNywgMHgxQTc3LCAweDhEMDgsIDB4MEIwMywgMHg4RDA5LCAweDQ5MUYsIDB4OEQwQSwgMHgxQTc2LAotICAgIDB4OEQwQiwgMHgwNjIyLCAweDhEMEQsIDB4MUE3OSwgMHg4RDBFLCAweDQ5MjAsIDB4OEQwRiwgMHgxQTc4LAotICAgIDB4OEQxMCwgMHgxQTdBLCAweDhEMTIsIDB4MjFCNCwgMHg4RDEzLCAweDFBN0MsIDB4OEQxNCwgMHgxQTdFLAotICAgIDB4OEQxNiwgMHgxQTdGLCAweDhEMTcsIDB4NEQ3QywgMHg4RDFCLCAweDNCMzYsIDB4OEQxQywgMHg0RDdELAotICAgIDB4OEQ2NCwgMHgwQTdBLCAweDhENjYsIDB4MDhGQiwgMHg4RDY3LCAweDFBODAsIDB4OEQ2OSwgMHgzQjM3LAotICAgIDB4OEQ2QiwgMHgwNUIwLCAweDhENkMsIDB4M0IzOCwgMHg4RDZELCAweDFBODEsIDB4OEQ2RSwgMHg0RDdFLAotICAgIDB4OEQ3MCwgMHgwQUY4LCAweDhENzEsIDB4MUE4MiwgMHg4RDczLCAweDFBODMsIDB4OEQ3NCwgMHgwRERELAotICAgIDB4OEQ3NiwgMHgyMUI1LCAweDhENzcsIDB4MDY0OSwgMHg4RDgxLCAweDFBODQsIDB4OEQ4NCwgMHgzQjM5LAotICAgIDB4OEQ4NSwgMHgwQkQyLCAweDhEOEEsIDB4MDRGRCwgMHg4RDhELCAweDNCM0EsIDB4OEQ5MSwgMHg0RDdGLAotICAgIDB4OEQ5NSwgMHgzQjNCLCAweDhEOTksIDB4MUE4NSwgMHg4RDlGLCAweDREODAsIDB4OERBMywgMHgwOTFELAotICAgIDB4OERBNiwgMHgzQjNDLCAweDhEQTgsIDB4MEEzQywgMHg4REFCLCAweDREODEsIDB4OERBRiwgMHg0MkVFLAotICAgIDB4OERCMiwgMHg0RDgyLCAweDhEQjMsIDB4MEIwRCwgMHg4REJBLCAweDFBODgsIDB4OERCRSwgMHgxQTg3LAotICAgIDB4OERDMiwgMHgxQTg2LCAweDhEQzYsIDB4M0IzRCwgMHg4REM4LCAweDQ5MjEsIDB4OERDQiwgMHgxQThFLAotICAgIDB4OERDQywgMHgxQThDLCAweDhEQ0UsIDB4M0IzRSwgMHg4RENGLCAweDFBODksIDB4OEREMSwgMHg0MkVGLAotICAgIDB4OERENSwgMHg0RDgzLCAweDhERDYsIDB4MUE4QiwgMHg4REQ3LCAweDQyRjAsIDB4OEREOSwgMHg0OTIyLAotICAgIDB4OEREQSwgMHgxQThBLCAweDhEREIsIDB4MUE4RCwgMHg4RERELCAweDA2OTEsIDB4OERERiwgMHgxQTkxLAotICAgIDB4OERFMSwgMHgwQTdCLCAweDhERTMsIDB4MUE5MiwgMHg4REU0LCAweDNCM0YsIDB4OERFNywgMHg0RDg0LAotICAgIDB4OERFOCwgMHgwNzhELCAweDhERUEsIDB4MUE4RiwgMHg4REVCLCAweDFBOTAsIDB4OERFQywgMHgzQjQwLAotICAgIDB4OERFRiwgMHgwRkNGLCAweDhERjEsIDB4NEQ4NSwgMHg4REYyLCAweDREODYsIDB4OERGMywgMHgwQkQzLAotICAgIDB4OERGNCwgMHg0RDg3LCAweDhERjUsIDB4MEFBQiwgMHg4REZDLCAweDFBOTMsIDB4OERGRCwgMHg0OTI1LAotICAgIDB4OERGRiwgMHgxQTk2LCAweDhFMDEsIDB4NEQ4OCwgMHg4RTA2LCAweDQ5MjYsIDB4OEUwOCwgMHgxQTk0LAotICAgIDB4OEUwOSwgMHgxQTk1LCAweDhFMEEsIDB4MEY0MywgMHg4RTBCLCAweDREODksIDB4OEUwQywgMHg0OTIzLAotICAgIDB4OEUwRiwgMHgwQzdGLCAweDhFMTAsIDB4MUE5OSwgMHg4RTE0LCAweDQ5MjgsIDB4OEUxNiwgMHg0OTI5LAotICAgIDB4OEUxRCwgMHgxQTk3LCAweDhFMUUsIDB4MUE5OCwgMHg4RTFGLCAweDFBOUEsIDB4OEUyMCwgMHgzQjQxLAotICAgIDB4OEUyMSwgMHg0OTJBLCAweDhFMjIsIDB4NDkyQiwgMHg4RTIzLCAweDQyRjEsIDB4OEUyNiwgMHg0RDhBLAotICAgIDB4OEUyNywgMHg0OTJDLCAweDhFMkEsIDB4MUFBOCwgMHg4RTMwLCAweDFBOUQsIDB4OEUzMSwgMHg0RDhCLAotICAgIDB4OEUzNCwgMHgxQTlFLCAweDhFMzUsIDB4MUE5QywgMHg4RTM2LCAweDQ5MkYsIDB4OEUzOSwgMHg0OTMwLAotICAgIDB4OEUzRCwgMHg0MkYyLCAweDhFNDAsIDB4NEQ4QywgMHg4RTQxLCAweDREOEQsIDB4OEU0MiwgMHgxQTlCLAotICAgIDB4OEU0NCwgMHgwQzE5LCAweDhFNDcsIDB4MUFBMCwgMHg4RTQ4LCAweDFBQTQsIDB4OEU0OSwgMHgxQUExLAotICAgIDB4OEU0QSwgMHgxQTlGLCAweDhFNEIsIDB4M0I0MiwgMHg4RTRDLCAweDFBQTIsIDB4OEU0RCwgMHg0RDhFLAotICAgIDB4OEU0RiwgMHg0RDhGLCAweDhFNTAsIDB4MUFBMywgMHg4RTU0LCAweDQ5MzEsIDB4OEU1NSwgMHgxQUFBLAotICAgIDB4OEU1OSwgMHgxQUE1LCAweDhFNUMsIDB4NEQ5MCwgMHg4RTVGLCAweDBBN0MsIDB4OEU2MCwgMHgxQUE3LAotICAgIDB4OEU2MSwgMHg0RDkxLCAweDhFNjIsIDB4NDkzMiwgMHg4RTYzLCAweDFBQTksIDB4OEU2NCwgMHgxQUE2LAotICAgIDB4OEU2OSwgMHg0RDkyLCAweDhFNkMsIDB4M0I0MywgMHg4RTZELCAweDQ5MzMsIDB4OEU2RiwgMHg0OTM0LAotICAgIDB4OEU3MCwgMHgzQjQ0LCAweDhFNzEsIDB4NEQ5MywgMHg4RTcyLCAweDFBQUMsIDB4OEU3NCwgMHgwOTNELAotICAgIDB4OEU3NSwgMHg0RDk0LCAweDhFNzYsIDB4MUFBQiwgMHg4RTc3LCAweDREOTUsIDB4OEU3QSwgMHgzQjQ1LAotICAgIDB4OEU3QiwgMHg0MkYzLCAweDhFN0MsIDB4MUFBRCwgMHg4RTgxLCAweDFBQUUsIDB4OEU4NCwgMHgxQUIxLAotICAgIDB4OEU4NSwgMHgxQUIwLCAweDhFODcsIDB4MUFBRiwgMHg4RTg5LCAweDREOTYsIDB4OEU4QSwgMHgxQUIzLAotICAgIDB4OEU4QiwgMHgxQUIyLCAweDhFOEQsIDB4MEYwMiwgMHg4RTkwLCAweDREOTcsIDB4OEU5MSwgMHgxQUI1LAotICAgIDB4OEU5MiwgMHgzQjQ2LCAweDhFOTMsIDB4MUFCNCwgMHg4RTk0LCAweDFBQjYsIDB4OEU5NSwgMHg0RDk4LAotICAgIDB4OEU5OCwgMHg0OTM1LCAweDhFOTksIDB4MUFCNywgMHg4RTlBLCAweDREOTksIDB4OEU5RSwgMHg0OTM2LAotICAgIDB4OEVBMSwgMHgxQUI5LCAweDhFQTcsIDB4NEQ5QSwgMHg4RUE5LCAweDREOUIsIDB4OEVBQSwgMHgxQUI4LAotICAgIDB4OEVBQiwgMHgwQTBFLCAweDhFQUMsIDB4MUFCQSwgMHg4RUFELCAweDREOUMsIDB4OEVBRSwgMHgzQjQ3LAotICAgIDB4OEVBRiwgMHgwNkU1LCAweDhFQjAsIDB4MUFCQiwgMHg4RUIxLCAweDFBQkQsIDB4OEVCMywgMHgzQjQ4LAotICAgIDB4OEVCNSwgMHg0OTM3LCAweDhFQjYsIDB4MzcwMywgMHg4RUJCLCAweDQ5MzgsIDB4OEVCRSwgMHgxQUJFLAotICAgIDB4OEVDMCwgMHgxREVGLCAweDhFQzUsIDB4MUFCRiwgMHg4RUM2LCAweDFBQkMsIDB4OEVDOCwgMHgxQUMwLAotICAgIDB4OEVDQSwgMHgwOTAyLCAweDhFQ0IsIDB4MUFDMSwgMHg4RUNDLCAweDA2NEEsIDB4OEVDRCwgMHgwNzA5LAotICAgIDB4OEVDRiwgMHgyMUI3LCAweDhFRDEsIDB4M0I0OSwgMHg4RUQyLCAweDA3NjIsIDB4OEVENCwgMHgzQjRBLAotICAgIDB4OEVEQiwgMHgxQUMyLCAweDhFREYsIDB4MENDOCwgMHg4RUUyLCAweDBDMzgsIDB4OEVFMywgMHgxQUMzLAotICAgIDB4OEVFOCwgMHg0RDlELCAweDhFRUIsIDB4MUFDNiwgMHg4RUYwLCAweDREOUUsIDB4OEVGOCwgMHgwOEUwLAotICAgIDB4OEVGOSwgMHgzQjRCLCAweDhFRkEsIDB4NDJGNiwgMHg4RUZCLCAweDFBQzUsIDB4OEVGQywgMHgxQUM0LAotICAgIDB4OEVGRCwgMHgwNzMwLCAweDhFRkUsIDB4MUFDNywgMHg4RjAwLCAweDQ5M0MsIDB4OEYwMywgMHgwNUIxLAotICAgIDB4OEYwNSwgMHgxQUM5LCAweDhGMDcsIDB4NEQ5RiwgMHg4RjA4LCAweDQ5M0QsIDB4OEYwOSwgMHgwODRDLAotICAgIDB4OEYwQSwgMHgxQUM4LCAweDhGMEMsIDB4MUFEMSwgMHg4RjEyLCAweDFBQ0IsIDB4OEYxMywgMHgxQUNELAotICAgIDB4OEYxNCwgMHgwRTM1LCAweDhGMTUsIDB4MUFDQSwgMHg4RjE3LCAweDNCNEMsIDB4OEYxOCwgMHg0REEwLAotICAgIDB4OEYxOSwgMHgxQUNDLCAweDhGMUIsIDB4MUFEMCwgMHg4RjFDLCAweDFBQ0UsIDB4OEYxRCwgMHgwNjRCLAotICAgIDB4OEYxRSwgMHg0MkY3LCAweDhGMUYsIDB4MUFDRiwgMHg4RjI1LCAweDREQTEsIDB4OEYyNiwgMHgxQUQyLAotICAgIDB4OEYyNywgMHg0REEyLCAweDhGMjksIDB4MEQxMCwgMHg4RjJBLCAweDBGQTAsIDB4OEYyQiwgMHg0OTNFLAotICAgIDB4OEYyQywgMHg0REEzLCAweDhGMkQsIDB4NDJGOCwgMHg4RjJGLCAweDA5M0UsIDB4OEYzMywgMHgxQUQzLAotICAgIDB4OEYzNSwgMHg0REE0LCAweDhGMzYsIDB4M0I0RCwgMHg4RjM4LCAweDBGMEMsIDB4OEYzOSwgMHgxQUQ1LAotICAgIDB4OEYzQSwgMHg0REE1LCAweDhGM0IsIDB4MUFENCwgMHg4RjNFLCAweDFBRDgsIDB4OEYzRiwgMHgwRjJCLAotICAgIDB4OEY0MCwgMHg0OTNGLCAweDhGNDIsIDB4MUFENywgMHg4RjQzLCAweDREQTYsIDB4OEY0NCwgMHgwNUNCLAotICAgIDB4OEY0NSwgMHgxQUQ2LCAweDhGNDYsIDB4MUFEQiwgMHg4RjQ3LCAweDREQTcsIDB4OEY0OSwgMHgxQURBLAotICAgIDB4OEY0QSwgMHg0OTQwLCAweDhGNEMsIDB4MUFEOSwgMHg4RjRELCAweDBDMkMsIDB4OEY0RSwgMHgxQURDLAotICAgIDB4OEY1MSwgMHg0REE4LCAweDhGNTQsIDB4NDJGOSwgMHg4RjU1LCAweDREQTksIDB4OEY1NywgMHgxQURELAotICAgIDB4OEY1OCwgMHg0OTQxLCAweDhGNUMsIDB4MUFERSwgMHg4RjVGLCAweDA3RkUsIDB4OEY2MSwgMHgwNkZCLAotICAgIDB4OEY2MiwgMHgxQURGLCAweDhGNjMsIDB4MUFFMCwgMHg4RjY0LCAweDFBRTEsIDB4OEY5QiwgMHgwQTBGLAotICAgIDB4OEY5QywgMHgxQUUyLCAweDhGOUUsIDB4MDhEOSwgMHg4RjlGLCAweDFBRTMsIDB4OEZBMCwgMHg0REFBLAotICAgIDB4OEZBMSwgMHg0REFCLCAweDhGQTIsIDB4NERBQywgMHg4RkEzLCAweDFBRTQsIDB4OEZBNCwgMHg0OTQzLAotICAgIDB4OEZBNSwgMHg0REFELCAweDhGQTYsIDB4M0I0RSwgMHg4RkE3LCAweDEwQjYsIDB4OEZBOCwgMHgxMEI1LAotICAgIDB4OEZBRCwgMHgxQUU1LCAweDhGQUUsIDB4MTdGRiwgMHg4RkFGLCAweDFBRTYsIDB4OEZCMCwgMHgwQjYyLAotICAgIDB4OEZCMSwgMHgwOUYxLCAweDhGQjIsIDB4MENGNiwgMHg4RkI0LCAweDQ5NDQsIDB4OEZCNSwgMHgzQjRGLAotICAgIDB4OEZCNiwgMHgzQjUwLCAweDhGQjcsIDB4MUFFNywgMHg4RkJBLCAweDBFMjUsIDB4OEZCQiwgMHgwQkYwLAotICAgIDB4OEZCQywgMHgwODEwLCAweDhGQkYsIDB4MEI2NywgMHg4RkMxLCAweDQ5NDYsIDB4OEZDMiwgMHgwNENDLAotICAgIDB4OEZDNCwgMHgwRUE2LCAweDhGQzUsIDB4MEExRCwgMHg4RkM2LCAweDQ5NDcsIDB4OEZDOCwgMHgzNzk5LAotICAgIDB4OEZDQSwgMHg0OTQ5LCAweDhGQ0QsIDB4NDk0QSwgMHg4RkNFLCAweDA3MzQsIDB4OEZEMSwgMHgwNkQ5LAotICAgIDB4OEZEMywgMHg0OTRCLCAweDhGRDQsIDB4MEUyNiwgMHg4RkQ1LCAweDQ5NEMsIDB4OEZEQSwgMHgxQUU4LAotICAgIDB4OEZFMCwgMHgzQjUyLCAweDhGRTIsIDB4MUFFQSwgMHg4RkU0LCAweDNCNTMsIDB4OEZFNSwgMHgxQUU5LAotICAgIDB4OEZFNiwgMHgwNTYwLCAweDhGRTgsIDB4NDJGQiwgMHg4RkU5LCAweDBDQ0UsIDB4OEZFQSwgMHgxQUVCLAotICAgIDB4OEZFQiwgMHgwRDJELCAweDhGRUQsIDB4MEMyRCwgMHg4RkVFLCAweDQyRkMsIDB4OEZFRiwgMHgxQUVDLAotICAgIDB4OEZGMCwgMHgwOTVDLCAweDhGRjEsIDB4NDk0RCwgMHg4RkY0LCAweDFBRUUsIDB4OEZGNSwgMHg0OTRFLAotICAgIDB4OEZGNiwgMHgzQjU0LCAweDhGRjcsIDB4MEVDRSwgMHg4RkY4LCAweDFBRkQsIDB4OEZGOSwgMHgxQUYwLAotICAgIDB4OEZGQSwgMHgxQUYxLCAweDhGRkIsIDB4NDk0RiwgMHg4RkZELCAweDBCRTUsIDB4OTAwMCwgMHgwQjQwLAotICAgIDB4OTAwMSwgMHgwQUY5LCAweDkwMDIsIDB4M0I1NSwgMHg5MDAzLCAweDBDODAsIDB4OTAwNCwgMHg0REFFLAotICAgIDB4OTAwNSwgMHgxQUVGLCAweDkwMDYsIDB4MDY2RiwgMHg5MDA4LCAweDQyRkQsIDB4OTAwQiwgMHgxQUY4LAotICAgIDB4OTAwQywgMHg0OTUwLCAweDkwMEQsIDB4MUFGNSwgMHg5MDBFLCAweDFCMDIsIDB4OTAwRiwgMHgwQzgxLAotICAgIDB4OTAxMCwgMHgwQjlFLCAweDkwMTEsIDB4MUFGMiwgMHg5MDEzLCAweDBDMUEsIDB4OTAxNCwgMHgwQzRELAotICAgIDB4OTAxNSwgMHgxQUYzLCAweDkwMTYsIDB4MUFGNywgMHg5MDE3LCAweDBBMjYsIDB4OTAxOSwgMHgwRDFELAotICAgIDB4OTAxQSwgMHgwQkU4LCAweDkwMUIsIDB4NERBRiwgMHg5MDFELCAweDBBNjYsIDB4OTAxRSwgMHgxQUY2LAotICAgIDB4OTAxRiwgMHgwQjBFLCAweDkwMjAsIDB4MEIwNCwgMHg5MDIxLCAweDFBRjQsIDB4OTAyMiwgMHgwNDZELAotICAgIDB4OTAyMywgMHgwRkM4LCAweDkwMjcsIDB4MUFGOSwgMHg5MDJDLCAweDNCNTYsIDB4OTAyRCwgMHg0MkZFLAotICAgIDB4OTAyRSwgMHgwQjQxLCAweDkwMkYsIDB4NERCMCwgMHg5MDMxLCAweDA5M0YsIDB4OTAzMiwgMHgwQTEwLAotICAgIDB4OTAzNSwgMHgxQUZCLCAweDkwMzYsIDB4MUFGQSwgMHg5MDM3LCAweDQ5NTEsIDB4OTAzOCwgMHgwNEIzLAotICAgIDB4OTAzOSwgMHgxQUZDLCAweDkwM0MsIDB4MERBMSwgMHg5MDNFLCAweDFCMDQsIDB4OTA0MSwgMHgwQ0IzLAotICAgIDB4OTA0MiwgMHgwQTMxLCAweDkwNDMsIDB4NDk1MywgMHg5MDQ0LCAweDNCNTcsIDB4OTA0NSwgMHgwQjk3LAotICAgIDB4OTA0NywgMHgwNkYwLCAweDkwNDksIDB4MUIwMywgMHg5MDRBLCAweDBGMjEsIDB4OTA0QiwgMHgwNEUxLAotICAgIDB4OTA0QywgMHg0REIxLCAweDkwNEQsIDB4MEUyNywgMHg5MDRFLCAweDA1NjEsIDB4OTA0RiwgMHgxQUZFLAotICAgIDB4OTA1MCwgMHgxQUZGLCAweDkwNTEsIDB4MUIwMCwgMHg5MDUyLCAweDFCMDEsIDB4OTA1MywgMHgwQzkzLAotICAgIDB4OTA1NCwgMHgwQjYxLCAweDkwNTUsIDB4MDRBNywgMHg5MDU2LCAweDFCMDUsIDB4OTA1OCwgMHgxQjA2LAotICAgIDB4OTA1OSwgMHgxRDM0LCAweDkwNUIsIDB4NERCMiwgMHg5MDVDLCAweDBCMUQsIDB4OTA1RCwgMHg0OTU0LAotICAgIDB4OTA1RSwgMHgxQjA3LCAweDkwNjAsIDB4MDUxNSwgMHg5MDYxLCAweDBBQ0UsIDB4OTA2MywgMHgwNzYzLAotICAgIDB4OTA2NSwgMHgwRjQ0LCAweDkwNjcsIDB4MjFCQSwgMHg5MDY4LCAweDFCMDgsIDB4OTA2OSwgMHgwQzI2LAotICAgIDB4OTA2RCwgMHgwQUZBLCAweDkwNkUsIDB4MDkwMywgMHg5MDZGLCAweDFCMDksIDB4OTA3MCwgMHg0REIzLAotICAgIDB4OTA3MiwgMHgxQjBDLCAweDkwNzQsIDB4NERCNCwgMHg5MDc1LCAweDA5NkYsIDB4OTA3NiwgMHgxQjBBLAotICAgIDB4OTA3NywgMHgwQUFELCAweDkwNzgsIDB4MEFBQywgMHg5MDc5LCAweDREQjUsIDB4OTA3QSwgMHgwNEE4LAotICAgIDB4OTA3QywgMHgwRjkzLCAweDkwN0QsIDB4MUIwRSwgMHg5MDdGLCAweDBEODYsIDB4OTA4MCwgMHgxQjEwLAotICAgIDB4OTA4MSwgMHgxQjBGLCAweDkwODIsIDB4MUIwRCwgMHg5MDgzLCAweDE3MzcsIDB4OTA4NCwgMHgwNjEwLAotICAgIDB4OTA4NSwgMHg0OTU3LCAweDkwODcsIDB4MUFFRCwgMHg5MDg4LCAweDNCNTgsIDB4OTA4OSwgMHgxQjEyLAotICAgIDB4OTA4QSwgMHgxQjExLCAweDkwOEIsIDB4NERCNiwgMHg5MDhDLCAweDQ5NTgsIDB4OTA4RiwgMHgxQjEzLAotICAgIDB4OTA5MCwgMHg0OTU5LCAweDkwOTEsIDB4MEYyMiwgMHg5MDk1LCAweDNCNTksIDB4OTA5NywgMHg0MkZGLAotICAgIDB4OTA5OCwgMHg0REI3LCAweDkwOTksIDB4M0I1QSwgMHg5MDlCLCAweDNCNUIsIDB4OTBBMCwgMHg0REI4LAotICAgIDB4OTBBMSwgMHg0OTVBLCAweDkwQTIsIDB4M0I1QywgMHg5MEEzLCAweDBDQjksIDB4OTBBNiwgMHgwRTVDLAotICAgIDB4OTBBOCwgMHgxQjE0LCAweDkwQUEsIDB4MDkwNSwgMHg5MEFGLCAweDFCMTUsIDB4OTBCMCwgMHg0OTVDLAotICAgIDB4OTBCMSwgMHgxQjE2LCAweDkwQjIsIDB4NERCOSwgMHg5MEIzLCAweDQzMDAsIDB4OTBCNCwgMHgzQjVELAotICAgIDB4OTBCNSwgMHgxQjE3LCAweDkwQjYsIDB4NDk1RCwgMHg5MEI4LCAweDBDMUIsIDB4OTBCRCwgMHg0REJBLAotICAgIDB4OTBCRSwgMHg0MzAxLCAweDkwQzEsIDB4MDRBRSwgMHg5MEMzLCAweDQ5NUUsIDB4OTBDNCwgMHg0MzAyLAotICAgIDB4OTBDNSwgMHg0MzAzLCAweDkwQzcsIDB4NDMwNCwgMHg5MEM4LCAweDQ5NUYsIDB4OTBDOSwgMHg0REJCLAotICAgIDB4OTBDQSwgMHgwN0VCLCAweDkwQ0UsIDB4MEZFMCwgMHg5MEQ3LCAweDNCNUUsIDB4OTBEQiwgMHgxQjFCLAotICAgIDB4OTBEQywgMHg0OTYxLCAweDkwREQsIDB4M0I1RiwgMHg5MERFLCAweDIxQkIsIDB4OTBERiwgMHg0OTYyLAotICAgIDB4OTBFMSwgMHgwNzBBLCAweDkwRTIsIDB4MUIxOCwgMHg5MEU0LCAweDFCMTksIDB4OTBFOCwgMHgwREU2LAotICAgIDB4OTBFQiwgMHg0OTY3LCAweDkwRUQsIDB4MDVCMiwgMHg5MEVGLCAweDQzMDUsIDB4OTBGMCwgMHg0REJDLAotICAgIDB4OTBGMiwgMHg0OTY1LCAweDkwRjQsIDB4M0I2MCwgMHg5MEY1LCAweDBGMjMsIDB4OTBGNiwgMHg0OTY0LAotICAgIDB4OTBGNywgMHgwNkI3LCAweDkwRkQsIDB4MEM0RSwgMHg5MEZFLCAweDQ5NjgsIDB4OTBGRiwgMHg0OTY5LAotICAgIDB4OTEwMCwgMHg0OTY2LCAweDkxMDIsIDB4MUIxQywgMHg5MTA0LCAweDQ5NkEsIDB4OTEwNSwgMHg0REJELAotICAgIDB4OTEwNiwgMHg0OTZCLCAweDkxMTIsIDB4MUIxRCwgMHg5MTE0LCAweDQzMDYsIDB4OTExNSwgMHgyMUJELAotICAgIDB4OTExNiwgMHg0MzA3LCAweDkxMTcsIDB4M0I2MSwgMHg5MTE4LCAweDQ5NkMsIDB4OTExOSwgMHgxQjFFLAotICAgIDB4OTExQywgMHgzQjYyLCAweDkxMUUsIDB4NDk2RCwgMHg5MTIyLCAweDQzMDgsIDB4OTEyMywgMHg0MzA5LAotICAgIDB4OTEyNSwgMHg0REJFLCAweDkxMjcsIDB4MjFCRSwgMHg5MTJELCAweDBDMUMsIDB4OTEyRiwgMHg0MzBBLAotICAgIDB4OTEzMCwgMHgxQjIwLCAweDkxMzEsIDB4M0I2MywgMHg5MTMyLCAweDFCMUYsIDB4OTEzNCwgMHg0MzBCLAotICAgIDB4OTEzNywgMHg0OTZFLCAweDkxMzksIDB4NDk2RiwgMHg5MTNBLCAweDNCNjQsIDB4OTEzRCwgMHgzQjY1LAotICAgIDB4OTE0NiwgMHg0OTcwLCAweDkxNDcsIDB4NDk3MSwgMHg5MTQ4LCAweDNCNjYsIDB4OTE0OSwgMHgwQ0FCLAotICAgIDB4OTE0QSwgMHgxQjIxLCAweDkxNEIsIDB4MDk0MCwgMHg5MTRDLCAweDA5MEMsIDB4OTE0RCwgMHgwRDExLAotICAgIDB4OTE0RSwgMHgwQkFGLCAweDkxNTIsIDB4MDkxRSwgMHg5MTU0LCAweDBBMzIsIDB4OTE1NiwgMHgxQjIyLAotICAgIDB4OTE1NywgMHg0OTcyLCAweDkxNTgsIDB4MUIyMywgMHg5MTU5LCAweDQ5NzMsIDB4OTE1QSwgMHg0REJGLAotICAgIDB4OTE1QiwgMHgzQjY3LCAweDkxNjEsIDB4M0I2OCwgMHg5MTYyLCAweDBBMjMsIDB4OTE2MywgMHgxQjI0LAotICAgIDB4OTE2NCwgMHgzQjY5LCAweDkxNjUsIDB4MUIyNSwgMHg5MTY3LCAweDREQzAsIDB4OTE2OSwgMHgxQjI2LAotICAgIDB4OTE2QSwgMHgwRjU5LCAweDkxNkMsIDB4MDk0MSwgMHg5MTcyLCAweDFCMjgsIDB4OTE3MywgMHgxQjI3LAotICAgIDB4OTE3NCwgMHg0OTc0LCAweDkxNzUsIDB4MDdFQywgMHg5MTc3LCAweDA4MDUsIDB4OTE3OCwgMHgwODhFLAotICAgIDB4OTE3OSwgMHg0OTc1LCAweDkxN0EsIDB4NERDMSwgMHg5MTgyLCAweDFCMkIsIDB4OTE4MywgMHg0MzBDLAotICAgIDB4OTE4NSwgMHg0OTc2LCAweDkxODcsIDB4MDk3MCwgMHg5MTg5LCAweDFCMkEsIDB4OTE4QSwgMHg0REMyLAotICAgIDB4OTE4QiwgMHgxQjI5LCAweDkxOEQsIDB4MEI0OSwgMHg5MThFLCAweDNCNkEsIDB4OTE5MCwgMHgwN0EzLAotICAgIDB4OTE5MSwgMHg0REMzLCAweDkxOTIsIDB4MEE2NywgMHg5MTk1LCAweDREQzQsIDB4OTE5NywgMHgwRDQ0LAotICAgIDB4OTE5QywgMHgwOTQzLCAweDkxOUUsIDB4M0I2QiwgMHg5MUEyLCAweDFCMkMsIDB4OTFBNCwgMHgwOUM3LAotICAgIDB4OTFBOCwgMHgzQjZDLCAweDkxQUEsIDB4MUIyRiwgMHg5MUFCLCAweDFCMkQsIDB4OTFBQywgMHgxRTFCLAotICAgIDB4OTFBRCwgMHgzQjZELCAweDkxQUUsIDB4M0I2RSwgMHg5MUFGLCAweDFCMkUsIDB4OTFCMCwgMHg0REM1LAotICAgIDB4OTFCMSwgMHgxRTYxLCAweDkxQjIsIDB4M0I2RiwgMHg5MUIzLCAweDQ5NzcsIDB4OTFCNCwgMHgxQjMxLAotICAgIDB4OTFCNSwgMHgxQjMwLCAweDkxQjYsIDB4NDk3OCwgMHg5MUI4LCAweDA5RTIsIDB4OTFCQSwgMHgxQjMyLAotICAgIDB4OTFCQiwgMHg0REM2LCAweDkxQkMsIDB4M0I3MCwgMHg5MUJELCAweDREQzcsIDB4OTFDMCwgMHgxQjMzLAotICAgIDB4OTFDMSwgMHgxQjM0LCAweDkxQzIsIDB4NERDOCwgMHg5MUMzLCAweDQ5NzksIDB4OTFDNCwgMHg0OTdBLAotICAgIDB4OTFDNSwgMHg0REM5LCAweDkxQzYsIDB4MEQ2NCwgMHg5MUM3LCAweDA4NDMsIDB4OTFDOCwgMHgwOTBELAotICAgIDB4OTFDOSwgMHgxQjM1LCAweDkxQ0IsIDB4MUIzNiwgMHg5MUNDLCAweDBGNkMsIDB4OTFDRCwgMHgwOTRGLAotICAgIDB4OTFDRSwgMHgwRUZBLCAweDkxQ0YsIDB4MEY5NCwgMHg5MUQwLCAweDFCMzcsIDB4OTFEMSwgMHgwNkRBLAotICAgIDB4OTFENiwgMHgxQjM4LCAweDkxRDcsIDB4MjFDMCwgMHg5MUQ4LCAweDBDMUQsIDB4OTFEQSwgMHgyMUJGLAotICAgIDB4OTFEQiwgMHgxQjNCLCAweDkxREMsIDB4MDVENiwgMHg5MURELCAweDBBMTEsIDB4OTFERSwgMHgyMUMxLAotICAgIDB4OTFERiwgMHgxQjM5LCAweDkxRTEsIDB4MUIzQSwgMHg5MUUzLCAweDBCRkMsIDB4OTFFNCwgMHgyMUM0LAotICAgIDB4OTFFNSwgMHgyMUM1LCAweDkxRTYsIDB4MEU4MywgMHg5MUU3LCAweDA2RjQsIDB4OTFFQywgMHg0OTdELAotICAgIDB4OTFFRCwgMHgyMUMyLCAweDkxRUUsIDB4MjFDMywgMHg5MUYwLCAweDNCNzEsIDB4OTFGMSwgMHg0MzBELAotICAgIDB4OTFGNSwgMHgxQjNELCAweDkxRjYsIDB4MUIzRSwgMHg5MUY3LCAweDNCNzIsIDB4OTFGQiwgMHgzQjczLAotICAgIDB4OTFGQywgMHgxQjNDLCAweDkxRkYsIDB4MUI0MCwgMHg5MjAwLCAweDREQ0EsIDB4OTIwMSwgMHg0OTdFLAotICAgIDB4OTIwNiwgMHgyMUM2LCAweDkyMDcsIDB4M0I3NCwgMHg5MjA5LCAweDREQ0IsIDB4OTIwQSwgMHgyMUM4LAotICAgIDB4OTIwRCwgMHgwQ0I3LCAweDkyMEUsIDB4MDVBMSwgMHg5MjEwLCAweDIxQzcsIDB4OTIxMSwgMHgxQjQ0LAotICAgIDB4OTIxNCwgMHgxQjQxLCAweDkyMTUsIDB4MUI0MywgMHg5MjE2LCAweDQ5N0YsIDB4OTIxNywgMHg0OTgwLAotICAgIDB4OTIxRSwgMHgxQjNGLCAweDkyMjMsIDB4NERDQywgMHg5MjI4LCAweDNCNzUsIDB4OTIyOSwgMHgxQjhBLAotICAgIDB4OTIyQywgMHgxQjQyLCAweDkyMzMsIDB4M0I3NiwgMHg5MjM0LCAweDBGQjMsIDB4OTIzNywgMHgwNzhFLAotICAgIDB4OTIzOCwgMHgzQjc3LCAweDkyMzksIDB4MjFDRiwgMHg5MjNBLCAweDIxQzksIDB4OTIzQywgMHgyMUNCLAotICAgIDB4OTIzRiwgMHgxQjRDLCAweDkyNDAsIDB4MjFDQSwgMHg5MjQyLCAweDQ5ODIsIDB4OTI0MywgMHgzQjc4LAotICAgIDB4OTI0NCwgMHgwQzJFLCAweDkyNDUsIDB4MUI0NywgMHg5MjQ3LCAweDNCNzksIDB4OTI0OCwgMHgxQjRBLAotICAgIDB4OTI0OSwgMHgxQjQ4LCAweDkyNEEsIDB4NDk4MywgMHg5MjRCLCAweDFCNEQsIDB4OTI0RSwgMHgyMUNDLAotICAgIDB4OTI0RiwgMHgzQjdBLCAweDkyNTAsIDB4MUI0RSwgMHg5MjUxLCAweDIxQ0UsIDB4OTI1NiwgMHg0OTg0LAotICAgIDB4OTI1NywgMHgxQjQ2LCAweDkyNTksIDB4MjFDRCwgMHg5MjVBLCAweDFCNTMsIDB4OTI1QiwgMHgwNTE2LAotICAgIDB4OTI1RSwgMHgxQjQ1LCAweDkyNjAsIDB4M0I3QiwgMHg5MjYxLCAweDQ5ODUsIDB4OTI2MiwgMHgwRDQxLAotICAgIDB4OTI2NCwgMHgxQjQ5LCAweDkyNjUsIDB4NDk4NiwgMHg5MjY2LCAweDA5QzgsIDB4OTI2NywgMHgyMUQwLAotICAgIDB4OTI2OCwgMHg0OTg3LCAweDkyNzEsIDB4MDdFRCwgMHg5Mjc2LCAweDREQ0QsIDB4OTI3NywgMHgyMUQyLAotICAgIDB4OTI3OCwgMHgyMUQzLCAweDkyN0MsIDB4NDk4OSwgMHg5MjdELCAweDQ5OEEsIDB4OTI3RSwgMHgwRTc2LAotICAgIDB4OTI3RiwgMHg0OThCLCAweDkyODAsIDB4MDZEQywgMHg5MjgzLCAweDA5NTAsIDB4OTI4NSwgMHgwQzk0LAotICAgIDB4OTI4OCwgMHgyMEFBLCAweDkyODksIDB4NDk4QywgMHg5MjhELCAweDQ5OEQsIDB4OTI4RSwgMHg0RENFLAotICAgIDB4OTI5MSwgMHgwQUFGLCAweDkyOTMsIDB4MUI1MSwgMHg5Mjk1LCAweDFCNEIsIDB4OTI5NiwgMHgxQjUwLAotICAgIDB4OTI5NywgMHg0OThFLCAweDkyOTgsIDB4MEVDRiwgMHg5Mjk5LCAweDQ5OEYsIDB4OTI5QSwgMHgwQkQ0LAotICAgIDB4OTI5QiwgMHgxQjUyLCAweDkyOUMsIDB4MUI0RiwgMHg5MjlGLCAweDQ5OTAsIDB4OTJBNywgMHgyMUQxLAotICAgIDB4OTJBQiwgMHg0OTkxLCAweDkyQUQsIDB4MEFBRSwgMHg5MkFGLCAweDREQ0YsIDB4OTJCMiwgMHg0OTk0LAotICAgIDB4OTJCMywgMHgzNTU0LCAweDkyQjcsIDB4MUI1NiwgMHg5MkI5LCAweDFCNTUsIDB4OTJCQiwgMHg0REQwLAotICAgIDB4OTJCQywgMHg0REQxLCAweDkyQkYsIDB4NDk5NSwgMHg5MkMwLCAweDQ5OTYsIDB4OTJDMSwgMHg0REQyLAotICAgIDB4OTJDMiwgMHgzQjdDLCAweDkyQzMsIDB4NEREMywgMHg5MkM1LCAweDRERDQsIDB4OTJDNiwgMHg0OTk3LAotICAgIDB4OTJDOCwgMHg0REQ1LCAweDkyQ0IsIDB4M0I3RCwgMHg5MkNDLCAweDNCN0UsIDB4OTJDRSwgMHg0OTk4LAotICAgIDB4OTJDRiwgMHgxQjU0LCAweDkyRDAsIDB4MjFENywgMHg5MkQyLCAweDBFNUQsIDB4OTJEMywgMHgyMURCLAotICAgIDB4OTJENSwgMHgyMUQ5LCAweDkyRDcsIDB4MjFENSwgMHg5MkQ5LCAweDIxRDYsIDB4OTJERiwgMHgzQjdGLAotICAgIDB4OTJFMCwgMHgyMURBLCAweDkyRTQsIDB4MDk4NSwgMHg5MkU1LCAweDQ5OTksIDB4OTJFNywgMHgyMUQ0LAotICAgIDB4OTJFOSwgMHgxQjU3LCAweDkyRUEsIDB4MEUyRiwgMHg5MkVELCAweDA0RjYsIDB4OTJGMiwgMHgwREI4LAotICAgIDB4OTJGMywgMHgwQkIwLCAweDkyRjcsIDB4NDk5RCwgMHg5MkY4LCAweDA2OTIsIDB4OTJGOSwgMHgyMEIwLAotICAgIDB4OTJGQSwgMHgxQjU5LCAweDkyRkIsIDB4MjFERSwgMHg5MkZDLCAweDA3RUYsIDB4OTJGRiwgMHgyMUUxLAotICAgIDB4OTMwMiwgMHgyMUUzLCAweDkzMDQsIDB4MzQ1QSwgMHg5MzA2LCAweDA4N0EsIDB4OTMwRCwgMHgzQjgwLAotICAgIDB4OTMwRiwgMHgxQjU4LCAweDkzMTAsIDB4MEEzMywgMHg5MzExLCAweDQ5OUEsIDB4OTMxNCwgMHg0REQ2LAotICAgIDB4OTMxNSwgMHgzQjgxLCAweDkzMTgsIDB4MEEzNCwgMHg5MzE5LCAweDFCNUMsIDB4OTMxQSwgMHgxQjVFLAotICAgIDB4OTMxRCwgMHgyMUUyLCAweDkzMUUsIDB4MjFFMCwgMHg5MzFGLCAweDNCODIsIDB4OTMyMCwgMHgwOUUzLAotICAgIDB4OTMyMSwgMHgyMURELCAweDkzMjIsIDB4MUI1RCwgMHg5MzIzLCAweDFCNUYsIDB4OTMyNSwgMHgyMURDLAotICAgIDB4OTMyNiwgMHgwNkNCLCAweDkzMjcsIDB4M0I4MywgMHg5MzI4LCAweDBEQjcsIDB4OTMyOSwgMHg0OTlFLAotICAgIDB4OTMyQiwgMHgwOTBFLCAweDkzMkMsIDB4MEZDOSwgMHg5MzJFLCAweDFCNUIsIDB4OTMyRiwgMHgwODY4LAotICAgIDB4OTMzMiwgMHgwRkU1LCAweDkzMzMsIDB4NERENywgMHg5MzM1LCAweDFCNjEsIDB4OTMzNiwgMHg0REQ4LAotICAgIDB4OTMzQSwgMHgxQjYwLCAweDkzM0IsIDB4MUI2MiwgMHg5MzQ0LCAweDFCNUEsIDB4OTM0NywgMHgzQjg0LAotICAgIDB4OTM0OCwgMHgyMEE5LCAweDkzNDksIDB4NDMwRSwgMHg5MzRBLCAweDM0NTgsIDB4OTM0QiwgMHgwQ0MxLAotICAgIDB4OTM0RCwgMHgwQzRGLCAweDkzNTEsIDB4NDlBMSwgMHg5MzUyLCAweDNCODUsIDB4OTM1NCwgMHgwQkYzLAotICAgIDB4OTM1NiwgMHgxQjY3LCAweDkzNTcsIDB4MjFFNSwgMHg5MzU4LCAweDRERDksIDB4OTM1QSwgMHg0OUEyLAotICAgIDB4OTM1QiwgMHgwQjgxLCAweDkzNUMsIDB4MUI2MywgMHg5MzYwLCAweDFCNjQsIDB4OTM2NCwgMHg0MzBGLAotICAgIDB4OTM2NSwgMHg0MzEwLCAweDkzNkEsIDB4M0I4NywgMHg5MzZCLCAweDQ5QTMsIDB4OTM2QywgMHgwNzAzLAotICAgIDB4OTM2RCwgMHgzQjg4LCAweDkzNkUsIDB4MUI2NiwgMHg5MzcwLCAweDIxRTQsIDB4OTM3MSwgMHg0OUE0LAotICAgIDB4OTM3MywgMHg0OUE1LCAweDkzNzUsIDB4MDc2NCwgMHg5MzdDLCAweDFCNjUsIDB4OTM3RSwgMHgwOUM5LAotICAgIDB4OTM3RiwgMHg0RERBLCAweDkzODIsIDB4NEREQiwgMHg5Mzg4LCAweDQ5QTksIDB4OTM4QSwgMHg0RERDLAotICAgIDB4OTM4QiwgMHg0OUFBLCAweDkzOEMsIDB4MDVENywgMHg5MzhGLCAweDQ5QUIsIDB4OTM5NCwgMHgxQjZCLAotICAgIDB4OTM5NiwgMHgwODJGLCAweDkzOTcsIDB4MEFGQiwgMHg5MzlBLCAweDBCRTYsIDB4OTM5QiwgMHgzQjg5LAotICAgIDB4OTM5RSwgMHg0OUFDLCAweDkzQTEsIDB4NDlBNiwgMHg5M0EzLCAweDQzMTEsIDB4OTNBNCwgMHgyMUU2LAotICAgIDB4OTNBNywgMHgwNTk5LCAweDkzQTksIDB4M0I4QiwgMHg5M0FDLCAweDFCNjksIDB4OTNBRCwgMHgxQjZBLAotICAgIDB4OTNBRSwgMHgwQkRGLCAweDkzQjAsIDB4MUI2OCwgMHg5M0I5LCAweDFCNkMsIDB4OTNCQSwgMHgzQjhBLAotICAgIDB4OTNCQiwgMHg0RERELCAweDkzQzEsIDB4M0I4QywgMHg5M0MzLCAweDFCNzIsIDB4OTNDNiwgMHgyMUU3LAotICAgIDB4OTNDNywgMHg0OUIxLCAweDkzQzgsIDB4MUI3NSwgMHg5M0NBLCAweDNCOEQsIDB4OTNDQywgMHg0RERFLAotICAgIDB4OTNEMCwgMHgxQjc0LCAweDkzRDEsIDB4MEMyNywgMHg5M0Q2LCAweDFCNkQsIDB4OTNENywgMHgxQjZFLAotICAgIDB4OTNEOCwgMHgxQjcxLCAweDkzREMsIDB4NDlCMiwgMHg5M0RELCAweDFCNzMsIDB4OTNERSwgMHgyMUU4LAotICAgIDB4OTNERiwgMHg0MzEyLCAweDkzRTEsIDB4MDZCOCwgMHg5M0UyLCAweDNCOEUsIDB4OTNFNCwgMHgxQjc2LAotICAgIDB4OTNFNSwgMHgxQjcwLCAweDkzRTYsIDB4NERERiwgMHg5M0U3LCAweDQ5QjMsIDB4OTNFOCwgMHgxQjZGLAotICAgIDB4OTNGMSwgMHg0OUIwLCAweDkzRjUsIDB4NDlBRCwgMHg5M0Y4LCAweDIxRTksIDB4OTNGOSwgMHg0REUwLAotICAgIDB4OTNGQSwgMHgzQjhGLCAweDkzRkIsIDB4NDlCNywgMHg5M0ZELCAweDNCOTAsIDB4OTQwMiwgMHg0REUxLAotICAgIDB4OTQwMywgMHgxQjdBLCAweDk0MDQsIDB4NDMxMywgMHg5NDA3LCAweDFCN0IsIDB4OTQwOSwgMHg0OUI0LAotICAgIDB4OTQwRCwgMHg0REUyLCAweDk0MEUsIDB4NERFMywgMHg5NDBGLCAweDNCOTEsIDB4OTQxMCwgMHgxQjdDLAotICAgIDB4OTQxMywgMHgxQjc5LCAweDk0MTQsIDB4MUI3OCwgMHg5NDE2LCAweDQ5QjUsIDB4OTQxNywgMHg0OUI2LAotICAgIDB4OTQxOCwgMHgwOUNBLCAweDk0MTksIDB4MEM4MiwgMHg5NDFBLCAweDFCNzcsIDB4OTQyMSwgMHgxQjgwLAotICAgIDB4OTQyQiwgMHgxQjdFLCAweDk0MkUsIDB4NERFNCwgMHg5NDMxLCAweDIxRUEsIDB4OTQzMiwgMHg0OUI4LAotICAgIDB4OTQzMywgMHg0MzE0LCAweDk0MzQsIDB4M0I5MiwgMHg5NDM1LCAweDFCN0YsIDB4OTQzNiwgMHgxQjdELAotICAgIDB4OTQzOCwgMHgwQjU4LCAweDk0M0EsIDB4MUI4MSwgMHg5NDNCLCAweDQ5QjksIDB4OTQzRiwgMHgzQjkzLAotICAgIDB4OTQ0MSwgMHgxQjgyLCAweDk0NDQsIDB4MUI4NCwgMHg5NDQ1LCAweDIxRUIsIDB4OTQ0OCwgMHgyMUVDLAotICAgIDB4OTQ0QSwgMHg0MzE1LCAweDk0NEMsIDB4NERFNSwgMHg5NDUxLCAweDA2MTEsIDB4OTQ1MiwgMHgxQjgzLAotICAgIDB4OTQ1MywgMHgwRjA2LCAweDk0NTUsIDB4M0I5NCwgMHg5NDVBLCAweDFCOEYsIDB4OTQ1QiwgMHgxQjg1LAotICAgIDB4OTQ1RSwgMHgxQjg4LCAweDk0NjAsIDB4MUI4NiwgMHg5NDYyLCAweDFCODcsIDB4OTQ2MywgMHg0MzE2LAotICAgIDB4OTQ2QSwgMHgxQjg5LCAweDk0NkIsIDB4M0I5NSwgMHg5NDZELCAweDQ5QkMsIDB4OTQ2RiwgMHg0OUJELAotICAgIDB4OTQ3MCwgMHgxQjhCLCAweDk0NzEsIDB4NDMxNywgMHg5NDcyLCAweDNCOTYsIDB4OTQ3NSwgMHgxQjhDLAotICAgIDB4OTQ3NywgMHgxQjhELCAweDk0N0MsIDB4MUI5MCwgMHg5NDdELCAweDFCOEUsIDB4OTQ3RSwgMHgxQjkxLAotICAgIDB4OTQ3RiwgMHgxQjkzLCAweDk0ODEsIDB4MUI5MiwgMHg5NTc3LCAweDBCRDUsIDB4OTU3OCwgMHgzQjk3LAotICAgIDB4OTU3OSwgMHg0OUJFLCAweDk1ODAsIDB4MEVGMywgMHg5NTgyLCAweDFCOTQsIDB4OTU4MywgMHgwQUIwLAotICAgIDB4OTU4NiwgMHg0OUJGLCAweDk1ODcsIDB4MUI5NSwgMHg5NTg4LCAweDRERTYsIDB4OTU4OSwgMHgwRTE0LAotICAgIDB4OTU4QSwgMHgxQjk2LCAweDk1OEIsIDB4MDU4OSwgMHg5NThDLCAweDQ5QzAsIDB4OTU4RCwgMHg0OUMxLAotICAgIDB4OTU4RSwgMHg0MzE4LCAweDk1OEYsIDB4MDRERSwgMHg5NTkxLCAweDA2MTMsIDB4OTU5MiwgMHgyMUVELAotICAgIDB4OTU5MywgMHgwNjEyLCAweDk1OTQsIDB4MUI5NywgMHg5NTk2LCAweDFCOTgsIDB4OTU5OCwgMHgxQjk5LAotICAgIDB4OTU5OSwgMHgxQjlBLCAweDk1OUYsIDB4NDMxOSwgMHg5NUEwLCAweDFCOUIsIDB4OTVBMSwgMHg0REU3LAotICAgIDB4OTVBMiwgMHgwNjE0LCAweDk1QTMsIDB4MDVCMywgMHg5NUE0LCAweDA3RjAsIDB4OTVBNSwgMHgwRDRBLAotICAgIDB4OTVBNiwgMHgzQjk4LCAweDk1QTcsIDB4MUI5RCwgMHg5NUE4LCAweDFCOUMsIDB4OTVBOSwgMHgzQjk5LAotICAgIDB4OTVBQiwgMHg0RjU5LCAweDk1QUMsIDB4NDMxQSwgMHg5NUFELCAweDFCOUUsIDB4OTVCMSwgMHgzNTU1LAotICAgIDB4OTVCMiwgMHgwNEZFLCAweDk1QjQsIDB4M0I5QiwgMHg5NUI2LCAweDQzMUIsIDB4OTVCOSwgMHgxQkExLAotICAgIDB4OTVCQiwgMHgxQkEwLCAweDk1QkMsIDB4MUI5RiwgMHg5NUJELCAweDNCOUMsIDB4OTVCRSwgMHgxQkEyLAotICAgIDB4OTVCRiwgMHg0REU4LCAweDk1QzMsIDB4MUJBNSwgMHg5NUM2LCAweDRERTksIDB4OTVDNywgMHgwNDhCLAotICAgIDB4OTVDOCwgMHg0OUM0LCAweDk1QzksIDB4NERFQSwgMHg5NUNBLCAweDFCQTMsIDB4OTVDQiwgMHg0MzFDLAotICAgIDB4OTVDQywgMHgxQkE3LCAweDk1Q0QsIDB4MUJBNiwgMHg5NUQwLCAweDQzMUQsIDB4OTVEMSwgMHg0REVCLAotICAgIDB4OTVEMiwgMHg0REVDLCAweDk1RDMsIDB4NDMxRSwgMHg5NUQ0LCAweDFCQTksIDB4OTVENSwgMHgxQkE4LAotICAgIDB4OTVENiwgMHgxQkFBLCAweDk1RDgsIDB4MEM4NiwgMHg5NURBLCAweDNCOUQsIDB4OTVEQywgMHgxQkFCLAotICAgIDB4OTVERSwgMHg0MzIwLCAweDk1RTAsIDB4NERFRCwgMHg5NUUxLCAweDFCQUMsIDB4OTVFMiwgMHgxQkFFLAotICAgIDB4OTVFNCwgMHg0REVFLCAweDk1RTUsIDB4MUJBRCwgMHg5NUU2LCAweDRERUYsIDB4OTYxQywgMHgwRERFLAotICAgIDB4OTYxRCwgMHgzQjlFLCAweDk2MjEsIDB4MUJBRiwgMHg5NjI0LCAweDRERjAsIDB4OTYyOCwgMHgxQkIwLAotICAgIDB4OTYyQSwgMHgwODU1LCAweDk2MkMsIDB4NDlDNywgMHg5NjJFLCAweDFCQjEsIDB4OTYyRiwgMHgxQkIyLAotICAgIDB4OTYzMSwgMHg0REYxLCAweDk2MzIsIDB4MEU3NywgMHg5NjMzLCAweDQ5QzgsIDB4OTYzNCwgMHg0OUM5LAotICAgIDB4OTYzOCwgMHg0REYyLCAweDk2M0IsIDB4MEFDRCwgMHg5NjNDLCAweDQ5Q0IsIDB4OTYzRCwgMHg0REYzLAotICAgIDB4OTYzRiwgMHgwNDY4LCAweDk2NDAsIDB4MEIyQiwgMHg5NjQxLCAweDNCOUYsIDB4OTY0MiwgMHgxQkIzLAotICAgIDB4OTY0NCwgMHgwRERGLCAweDk2NEIsIDB4MUJCNiwgMHg5NjRDLCAweDFCQjQsIDB4OTY0RCwgMHgwN0YxLAotICAgIDB4OTY0RiwgMHgxQkI1LCAweDk2NTAsIDB4MDc3NiwgMHg5NjU0LCAweDRERjQsIDB4OTY1OCwgMHgzQkEwLAotICAgIDB4OTY1QiwgMHgwRTE1LCAweDk2NUMsIDB4MUJCOCwgMHg5NjVELCAweDFCQkEsIDB4OTY1RSwgMHgxQkI5LAotICAgIDB4OTY1RiwgMHgxQkJCLCAweDk2NjEsIDB4NDlDQywgMHg5NjYyLCAweDA0QzMsIDB4OTY2MywgMHgwQTFFLAotICAgIDB4OTY2NCwgMHgwOTg2LCAweDk2NjUsIDB4MDYxNSwgMHg5NjY2LCAweDFCQkMsIDB4OTY2QSwgMHgwRDFDLAotICAgIDB4OTY2QywgMHgxQkJFLCAweDk2NzAsIDB4MDRDNCwgMHg5NjcyLCAweDFCQkQsIDB4OTY3MywgMHgwQkUwLAotICAgIDB4OTY3NCwgMHg0REY1LCAweDk2NzUsIDB4MEY5NSwgMHg5Njc2LCAweDBDODMsIDB4OTY3NywgMHgxQkI3LAotICAgIDB4OTY3OCwgMHgwRjZFLCAweDk2N0EsIDB4MDc2NSwgMHg5NjdCLCAweDRERjYsIDB4OTY3RCwgMHgwRjQ1LAotICAgIDB4OTY3RiwgMHg0REY3LCAweDk2ODEsIDB4NERGOCwgMHg5NjgyLCAweDQ5Q0UsIDB4OTY4MywgMHg0REY5LAotICAgIDB4OTY4NCwgMHgzQkExLCAweDk2ODUsIDB4MDZGMSwgMHg5Njg2LCAweDBGN0MsIDB4OTY4OCwgMHgwNkZFLAotICAgIDB4OTY4OSwgMHg0REZBLCAweDk2OEEsIDB4MEI0MiwgMHg5NjhCLCAweDE4NkMsIDB4OTY4RCwgMHgxQkJGLAotICAgIDB4OTY4RSwgMHgwNThBLCAweDk2OEYsIDB4MEEzNSwgMHg5Njk0LCAweDA1QjQsIDB4OTY5NSwgMHgxQkMxLAotICAgIDB4OTY5NiwgMHg0REZCLCAweDk2OTcsIDB4MUJDMiwgMHg5Njk4LCAweDFCQzAsIDB4OTY5OSwgMHgwNzNBLAotICAgIDB4OTY5QSwgMHg0OUQwLCAweDk2OUIsIDB4MDg0RCwgMHg5NjlDLCAweDA5Q0IsIDB4OTY5RCwgMHgyMUYwLAotICAgIDB4OTZBMCwgMHgwNEM1LCAweDk2QTMsIDB4MEZBMSwgMHg5NkE0LCAweDNCQTIsIDB4OTZBNSwgMHg0MzIxLAotICAgIDB4OTZBNywgMHgxQkM0LCAweDk2QTgsIDB4MUIwQiwgMHg5NkE5LCAweDNCQTMsIDB4OTZBQSwgMHgxQkMzLAotICAgIDB4OTZBRSwgMHg0REZDLCAweDk2QUYsIDB4MjFGMSwgMHg5NkIwLCAweDFCQzcsIDB4OTZCMSwgMHgxQkM1LAotICAgIDB4OTZCMiwgMHgxQkM2LCAweDk2QjMsIDB4NDlEMywgMHg5NkI0LCAweDFCQzgsIDB4OTZCNiwgMHgxQkM5LAotICAgIDB4OTZCNywgMHgwRkI0LCAweDk2QjgsIDB4MUJDQSwgMHg5NkI5LCAweDFCQ0IsIDB4OTZCQSwgMHg0OUQ0LAotICAgIDB4OTZCQiwgMHgwQTZELCAweDk2QkMsIDB4MEQ0RiwgMHg5NkJELCAweDQ5RDUsIDB4OTZDMCwgMHgwQTQzLAotICAgIDB4OTZDMSwgMHgwNjIzLCAweDk2QzQsIDB4MEYyNCwgMHg5NkM1LCAweDA1NkQsIDB4OTZDNiwgMHgwOTQyLAotICAgIDB4OTZDNywgMHgwNzhGLCAweDk2QzksIDB4MUJDRSwgMHg5NkNCLCAweDFCQ0QsIDB4OTZDQywgMHgwOEMxLAotICAgIDB4OTZDRCwgMHgxQkNGLCAweDk2Q0UsIDB4MUJDQywgMHg5NkQxLCAweDA4NzYsIDB4OTZEMiwgMHgzQkE0LAotICAgIDB4OTZENSwgMHgxQkQzLCAweDk2RDYsIDB4MTk5MiwgMHg5NkQ4LCAweDQ5RDgsIDB4OTZEOSwgMHgxMEVCLAotICAgIDB4OTZEQSwgMHg0OUQ5LCAweDk2REIsIDB4MEEzRCwgMHg5NkRDLCAweDFCRDEsIDB4OTZERCwgMHg0OURBLAotICAgIDB4OTZERSwgMHgzQkE2LCAweDk2RTIsIDB4MEY2RCwgMHg5NkUzLCAweDBDQzksIDB4OTZFOCwgMHgwNENELAotICAgIDB4OTZFOSwgMHgzQkE3LCAweDk2RUEsIDB4MEE4NywgMHg5NkVCLCAweDA4RTIsIDB4OTZFRiwgMHg0MzIyLAotICAgIDB4OTZGMCwgMHgwRTA3LCAweDk2RjEsIDB4M0JBOCwgMHg5NkYyLCAweDA0RTIsIDB4OTZGNiwgMHgwRkI1LAotICAgIDB4OTZGNywgMHgwRjU1LCAweDk2RjksIDB4MUJENCwgMHg5NkZCLCAweDBDM0YsIDB4OTcwMCwgMHgwOTI3LAotICAgIDB4OTcwMiwgMHgzQkE5LCAweDk3MDMsIDB4NERGRCwgMHg5NzA0LCAweDFCRDUsIDB4OTcwNiwgMHgxQkQ2LAotICAgIDB4OTcwNywgMHgwQTEyLCAweDk3MDgsIDB4MUJENywgMHg5NzA5LCAweDNCQUEsIDB4OTcwQSwgMHgwRkI2LAotICAgIDB4OTcwRCwgMHgxQkQyLCAweDk3MEUsIDB4MUJEOSwgMHg5NzBGLCAweDFCREIsIDB4OTcxMSwgMHgxQkRBLAotICAgIDB4OTcxMywgMHgxQkQ4LCAweDk3MTQsIDB4NDlEQywgMHg5NzE2LCAweDFCREMsIDB4OTcxOSwgMHgxQkRELAotICAgIDB4OTcxQiwgMHg0REZFLCAweDk3MUMsIDB4MEFGQywgMHg5NzFFLCAweDA1NjIsIDB4OTcyMSwgMHg0REZGLAotICAgIDB4OTcyMiwgMHg0RTAwLCAweDk3MjMsIDB4NDlERCwgMHg5NzI0LCAweDFCREUsIDB4OTcyNywgMHgwRUM0LAotICAgIDB4OTcyOCwgMHg0RTAxLCAweDk3MkEsIDB4MUJERiwgMHg5NzMwLCAweDFCRTAsIDB4OTczMSwgMHg0RTAyLAotICAgIDB4OTczMiwgMHgwRkQwLCAweDk3MzMsIDB4MjFGMiwgMHg5NzM2LCAweDQ5REYsIDB4OTczOCwgMHgxNDE0LAotICAgIDB4OTczOSwgMHgxQkUxLCAweDk3M0IsIDB4MjFGMywgMHg5NzNELCAweDFCRTIsIDB4OTczRSwgMHgxQkUzLAotICAgIDB4OTc0MSwgMHg0OUUwLCAweDk3NDIsIDB4MUJFNywgMHg5NzQzLCAweDIxRjQsIDB4OTc0NCwgMHgxQkU0LAotICAgIDB4OTc0NiwgMHgxQkU1LCAweDk3NDcsIDB4NDlFMSwgMHg5NzQ4LCAweDFCRTYsIDB4OTc0OSwgMHgxQkU4LAotICAgIDB4OTc0RCwgMHgyMUY1LCAweDk3NEUsIDB4NDMyMywgMHg5NzRGLCAweDIxRjYsIDB4OTc1MSwgMHgyMUY3LAotICAgIDB4OTc1MiwgMHgwQTY4LCAweDk3NTUsIDB4NEY1QSwgMHg5NzU2LCAweDBGMDMsIDB4OTc1NywgMHg0OUUyLAotICAgIDB4OTc1OSwgMHgwQTY5LCAweDk3NUEsIDB4M0JBQiwgMHg5NzVCLCAweDQ5RTMsIDB4OTc1QywgMHgxQkU5LAotICAgIDB4OTc1RSwgMHgwRDg3LCAweDk3NjAsIDB4MUJFQSwgMHg5NzYxLCAweDFEMDYsIDB4OTc2MiwgMHgwRUQ4LAotICAgIDB4OTc2MywgMHgzQkFDLCAweDk3NjQsIDB4MUJFQiwgMHg5NzY2LCAweDFCRUMsIDB4OTc2NywgMHg0RTAzLAotICAgIDB4OTc2OCwgMHgxQkVELCAweDk3NjksIDB4MDVCNSwgMHg5NzZBLCAweDQ5RTQsIDB4OTc2QiwgMHgxQkVGLAotICAgIDB4OTc2RCwgMHgwQTFGLCAweDk3NkUsIDB4M0JBRCwgMHg5NzcxLCAweDFCRjAsIDB4OTc3MywgMHgzQkFFLAotICAgIDB4OTc3NCwgMHgwNkZBLCAweDk3NzYsIDB4NEUwNCwgMHg5Nzc5LCAweDFCRjEsIDB4OTc3QSwgMHgxQkY1LAotICAgIDB4OTc3QywgMHgxQkYzLCAweDk3N0QsIDB4NEUwNSwgMHg5NzdGLCAweDRFMDYsIDB4OTc4MSwgMHgxQkY0LAotICAgIDB4OTc4NCwgMHgwNUQxLCAweDk3ODUsIDB4MUJGMiwgMHg5Nzg2LCAweDFCRjYsIDB4OTc4QiwgMHgxQkY3LAotICAgIDB4OTc4RCwgMHgwNDhDLCAweDk3OEYsIDB4MUJGOCwgMHg5NzkwLCAweDFCRjksIDB4OTc5NSwgMHg0MzI0LAotICAgIDB4OTc5NiwgMHg0OUU3LCAweDk3OTgsIDB4MDlDQywgMHg5Nzk5LCAweDRFMDcsIDB4OTc5QSwgMHgzQkFGLAotICAgIDB4OTc5QywgMHgxQkZBLCAweDk3OUUsIDB4NDlFOCwgMHg5NzlGLCAweDRFMDgsIDB4OTdBMCwgMHgwNjYxLAotICAgIDB4OTdBMiwgMHgzQkIwLCAweDk3QTMsIDB4MUJGRCwgMHg5N0E2LCAweDFCRkMsIDB4OTdBOCwgMHgxQkZCLAotICAgIDB4OTdBQiwgMHgxQTM0LCAweDk3QUMsIDB4NEUwOSwgMHg5N0FELCAweDBFMkMsIDB4OTdBRSwgMHg0MzI1LAotICAgIDB4OTdCMSwgMHg0OUU5LCAweDk3QjIsIDB4NDlFQSwgMHg5N0IzLCAweDFCRkUsIDB4OTdCNCwgMHgxQkZGLAotICAgIDB4OTdCNSwgMHgzQkIxLCAweDk3QjYsIDB4M0JCMiwgMHg5N0I5LCAweDRFMEEsIDB4OTdCQSwgMHg0MzI2LAotICAgIDB4OTdCRSwgMHg0OUVCLCAweDk3QzEsIDB4NDMyNywgMHg5N0MzLCAweDFDMDAsIDB4OTdDNiwgMHgxQzAxLAotICAgIDB4OTdDOCwgMHgxQzAyLCAweDk3QzksIDB4NDMyOCwgMHg5N0NCLCAweDFDMDMsIDB4OTdDQywgMHg0OUVDLAotICAgIDB4OTdDRCwgMHg0RTBCLCAweDk3RDEsIDB4NDlFRCwgMHg5N0QzLCAweDA2MTYsIDB4OTdENCwgMHg0OUVFLAotICAgIDB4OTdEOCwgMHg0OUVGLCAweDk3RDksIDB4M0JCMywgMHg5N0RCLCAweDQzMjksIDB4OTdEQywgMHgxQzA0LAotICAgIDB4OTdERSwgMHgzQkI0LCAweDk3RTAsIDB4NEUwQywgMHg5N0UxLCAweDQ5RjAsIDB4OTdFRCwgMHgxQzA1LAotICAgIDB4OTdFRSwgMHgwQ0Q5LCAweDk3RUYsIDB4NEUwRCwgMHg5N0YxLCAweDQ5RjEsIDB4OTdGMiwgMHgxQzA3LAotICAgIDB4OTdGMywgMHgwNTNCLCAweDk3RjQsIDB4M0JCNSwgMHg5N0Y1LCAweDFDMEEsIDB4OTdGNiwgMHgxQzA5LAotICAgIDB4OTdGQiwgMHgwNEM2LCAweDk3RkYsIDB4MDZCOSwgMHg5ODAxLCAweDBFMTcsIDB4OTgwMiwgMHgwQkQ2LAotICAgIDB4OTgwMywgMHgwODEyLCAweDk4MDQsIDB4NDlGMiwgMHg5ODA1LCAweDA3RjIsIDB4OTgwNiwgMHgwOTcxLAotICAgIDB4OTgwNywgMHg0RTBFLCAweDk4MDgsIDB4MEEyMiwgMHg5ODBBLCAweDNCQjYsIDB4OTgwQywgMHgxQzBDLAotICAgIDB4OTgwRCwgMHg0OUYzLCAweDk4MEUsIDB4M0JCNywgMHg5ODBGLCAweDFDMEIsIDB4OTgxMCwgMHgwRjJDLAotICAgIDB4OTgxMSwgMHgwNjI0LCAweDk4MTIsIDB4MEQ2NiwgMHg5ODEzLCAweDBDQjQsIDB4OTgxNCwgMHg0OUY0LAotICAgIDB4OTgxNiwgMHg0OUY1LCAweDk4MTcsIDB4MEE0MiwgMHg5ODE4LCAweDBGOTYsIDB4OTgxQSwgMHgwNzMxLAotICAgIDB4OTgxRSwgMHgzQkI4LCAweDk4MjEsIDB4MUMwRiwgMHg5ODIzLCAweDNCQjksIDB4OTgyNCwgMHgxQzBFLAotICAgIDB4OTgyNSwgMHg0OUZBLCAweDk4MjYsIDB4NEUwRiwgMHg5ODJCLCAweDNCQkEsIDB4OTgyQywgMHgwRTc5LAotICAgIDB4OTgyRCwgMHgwQzg0LCAweDk4MkUsIDB4NEUxMCwgMHg5ODMwLCAweDFFNzMsIDB4OTgzMiwgMHg0OUY4LAotICAgIDB4OTgzMywgMHg0OUY5LCAweDk4MzQsIDB4MDRGMiwgMHg5ODM3LCAweDFDMTAsIDB4OTgzOCwgMHgxQzBELAotICAgIDB4OTgzOSwgMHgzN0IzLCAweDk4M0IsIDB4MERDMywgMHg5ODNDLCAweDBGNTQsIDB4OTgzRCwgMHgxQzExLAotICAgIDB4OTgzRSwgMHgzQkJCLCAweDk4NDYsIDB4MUMxMiwgMHg5ODQ3LCAweDQ5RkIsIDB4OTg0QiwgMHgxQzE0LAotICAgIDB4OTg0QywgMHgwQjRBLCAweDk4NEQsIDB4MDVCOSwgMHg5ODRFLCAweDA1QkEsIDB4OTg0RiwgMHgxQzEzLAotICAgIDB4OTg1MiwgMHgzQkJDLCAweDk4NTMsIDB4M0JCRCwgMHg5ODU0LCAweDA2MjUsIDB4OTg1NSwgMHgwNzY2LAotICAgIDB4OTg1NiwgMHg0MzJBLCAweDk4NTcsIDB4MjFGOSwgMHg5ODU4LCAweDA2MjYsIDB4OTg1OSwgMHgzQkJFLAotICAgIDB4OTg1QSwgMHgxRTQ4LCAweDk4NUIsIDB4MEMzOSwgMHg5ODVFLCAweDBGQTgsIDB4OTg2MiwgMHg0RTExLAotICAgIDB4OTg2MywgMHg0RTEyLCAweDk4NjUsIDB4MjFGQSwgMHg5ODY2LCAweDQ5RkMsIDB4OTg2NywgMHgwNzkwLAotICAgIDB4OTg2QiwgMHgxQzE1LCAweDk4NkMsIDB4M0JCRiwgMHg5ODZGLCAweDFDMTYsIDB4OTg3MCwgMHgxQzE3LAotICAgIDB4OTg3MSwgMHgxQzE4LCAweDk4NzMsIDB4MUMxQSwgMHg5ODc0LCAweDFDMTksIDB4OThBOCwgMHgwREU5LAotICAgIDB4OThBQSwgMHgxQzFCLCAweDk4QUIsIDB4NDlGRCwgMHg5OEFELCAweDQ5RkUsIDB4OThBRiwgMHgxQzFDLAotICAgIDB4OThCMCwgMHg0OUZGLCAweDk4QjEsIDB4MUMxRCwgMHg5OEI0LCAweDRFMTMsIDB4OThCNiwgMHgxQzFFLAotICAgIDB4OThCNywgMHg0QTAxLCAweDk4QjgsIDB4M0JDMCwgMHg5OEJBLCAweDNCQzEsIDB4OThCQiwgMHg0QTAyLAotICAgIDB4OThCQywgMHg0QTAzLCAweDk4QkYsIDB4M0JDMiwgMHg5OEMyLCAweDRBMDQsIDB4OThDMywgMHgxQzIwLAotICAgIDB4OThDNCwgMHgxQzFGLCAweDk4QzUsIDB4NEUxNCwgMHg5OEM2LCAweDFDMjEsIDB4OThDNywgMHg0QTA1LAotICAgIDB4OThDOCwgMHgzQkMzLCAweDk4Q0IsIDB4NEEwNiwgMHg5OERCLCAweDBEODgsIDB4OThEQywgMHgxODM5LAotICAgIDB4OThERiwgMHgwOUVGLCAweDk4RTAsIDB4MzYxOCwgMHg5OEUxLCAweDRBMDcsIDB4OThFMiwgMHgwNjRDLAotICAgIDB4OThFMywgMHg0QTA4LCAweDk4RTUsIDB4M0JDNCwgMHg5OEU3LCAweDQzMkIsIDB4OThFOSwgMHgxQzIyLAotICAgIDB4OThFQSwgMHg0QTA5LCAweDk4RUIsIDB4MUMyMywgMHg5OEVELCAweDEwQzEsIDB4OThFRSwgMHgxNERBLAotICAgIDB4OThFRiwgMHgwRDY3LCAweDk4RjAsIDB4NEEwQSwgMHg5OEYxLCAweDRBMEIsIDB4OThGMiwgMHgwNEJGLAotICAgIDB4OThGMywgMHg0QTBDLCAweDk4RjQsIDB4MDQ3RiwgMHg5OEZDLCAweDA4QzIsIDB4OThGRCwgMHgwRTVFLAotICAgIDB4OThGRSwgMHgwOUU2LCAweDk5MDIsIDB4NEUxNSwgMHg5OTAzLCAweDFDMjQsIDB4OTkwNSwgMHgwRUVCLAotICAgIDB4OTkwOCwgMHg0QTBELCAweDk5MDksIDB4MUMyNSwgMHg5OTBBLCAweDBGNDYsIDB4OTkwQywgMHgwNEU0LAotICAgIDB4OTkxMCwgMHgwODhGLCAweDk5MTEsIDB4NEUxNiwgMHg5OTEyLCAweDFDMjYsIDB4OTkxMywgMHgwNTZFLAotICAgIDB4OTkxNCwgMHgxQzI3LCAweDk5MTUsIDB4NEUxNywgMHg5OTE2LCAweDRBMTAsIDB4OTkxNywgMHg0QTExLAotICAgIDB4OTkxOCwgMHgxQzI4LCAweDk5MUEsIDB4NEExMywgMHg5OTFCLCAweDRBMTQsIDB4OTkxQywgMHg0QTE1LAotICAgIDB4OTkxRCwgMHgxQzJBLCAweDk5MUUsIDB4MUMyQiwgMHg5OTIwLCAweDFDMkQsIDB4OTkyMSwgMHgxQzI5LAotICAgIDB4OTkyNCwgMHgxQzJDLCAweDk5MjcsIDB4MjFGRCwgMHg5OTI4LCAweDA2MTcsIDB4OTkyQywgMHgxQzJFLAotICAgIDB4OTkyRSwgMHgxQzJGLCAweDk5MzEsIDB4NEExNywgMHg5OTMyLCAweDNCQzUsIDB4OTkzMywgMHgzQkM2LAotICAgIDB4OTkzNSwgMHg0RTE4LCAweDk5M0EsIDB4NEExOCwgMHg5OTNCLCAweDRBMTksIDB4OTkzQywgMHg0QTFBLAotICAgIDB4OTkzRCwgMHgxQzMwLCAweDk5M0UsIDB4MUMzMSwgMHg5OTQwLCAweDNCQzcsIDB4OTk0MSwgMHg0QTFCLAotICAgIDB4OTk0MiwgMHgxQzMyLCAweDk5NDUsIDB4MUMzNCwgMHg5OTQ2LCAweDRBMUMsIDB4OTk0OCwgMHg0RTE5LAotICAgIDB4OTk0OSwgMHgxQzMzLCAweDk5NEIsIDB4MUMzNiwgMHg5OTRDLCAweDFDMzksIDB4OTk0RCwgMHgzQkM4LAotICAgIDB4OTk0RSwgMHg0QTFELCAweDk5NTAsIDB4MUMzNSwgMHg5OTUxLCAweDFDMzcsIDB4OTk1MiwgMHgxQzM4LAotICAgIDB4OTk1NCwgMHg0RTFBLCAweDk5NTUsIDB4MUMzQSwgMHg5OTU3LCAweDA2QkEsIDB4OTk1OCwgMHg0MzJDLAotICAgIDB4OTk1QywgMHgzQkM5LCAweDk5NUUsIDB4NEUxQiwgMHg5OTVGLCAweDNCQ0EsIDB4OTk2MCwgMHg0QTFFLAotICAgIDB4OTk5NiwgMHgwOTFGLCAweDk5OTcsIDB4MUMzQiwgMHg5OTk4LCAweDFDM0MsIDB4OTk5OSwgMHgwN0YzLAotICAgIDB4OTk5RSwgMHgyMUZGLCAweDk5QTMsIDB4NEExRiwgMHg5OUE1LCAweDFDM0QsIDB4OTlBNiwgMHg0QTIwLAotICAgIDB4OTlBOCwgMHgwNTlDLCAweDk5QUMsIDB4MEQwNSwgMHg5OUFELCAweDFDM0UsIDB4OTlBRSwgMHgxQzNGLAotICAgIDB4OTlCMSwgMHgzQkNCLCAweDk5QjMsIDB4MEI5OCwgMHg5OUI0LCAweDBDQzMsIDB4OTlCOSwgMHgzQkNDLAotICAgIDB4OTlCQSwgMHgzQkNELCAweDk5QkMsIDB4MUM0MCwgMHg5OUJELCAweDRBMjEsIDB4OTlCRiwgMHg0QTIyLAotICAgIDB4OTlDMSwgMHgwRDMzLCAweDk5QzMsIDB4NEEyMywgMHg5OUM0LCAweDBCMkMsIDB4OTlDNSwgMHgwNEZBLAotICAgIDB4OTlDNiwgMHgwNkU2LCAweDk5QzgsIDB4MDZFNywgMHg5OUM5LCAweDNCQ0UsIDB4OTlEMCwgMHgwQkIxLAotICAgIDB4OTlEMSwgMHgxQzQ1LCAweDk5RDIsIDB4MDZFOCwgMHg5OUQ0LCAweDRBMjQsIDB4OTlENSwgMHgwNTZGLAotICAgIDB4OTlEOCwgMHgxQzQ0LCAweDk5RDksIDB4NEEyNSwgMHg5OURCLCAweDFDNDIsIDB4OTlERCwgMHgxQzQzLAotICAgIDB4OTlERSwgMHg0QTI2LCAweDk5REYsIDB4MUM0MSwgMHg5OUUxLCAweDRFMUMsIDB4OTlFMiwgMHgxQzRGLAotICAgIDB4OTlFRCwgMHgxQzQ2LCAweDk5RUUsIDB4MUM0NywgMHg5OUYwLCAweDRBMjgsIDB4OTlGMSwgMHgxQzQ4LAotICAgIDB4OTlGMiwgMHgxQzQ5LCAweDk5RjgsIDB4MUM0QiwgMHg5OUY5LCAweDRBMjksIDB4OTlGQiwgMHgxQzRBLAotICAgIDB4OTlGQywgMHg0QTJBLCAweDk5RkYsIDB4MDk2MywgMHg5QTAxLCAweDFDNEMsIDB4OUEwMiwgMHgzQkNGLAotICAgIDB4OUEwMywgMHg0MzJELCAweDlBMDUsIDB4MUM0RSwgMHg5QTA4LCAweDM3QkEsIDB4OUEwQSwgMHg0QTJCLAotICAgIDB4OUEwQywgMHg0RTFELCAweDlBMEUsIDB4MDY0RCwgMHg5QTBGLCAweDFDNEQsIDB4OUExMCwgMHg0RTFFLAotICAgIDB4OUExMSwgMHg0QTJDLCAweDlBMTIsIDB4MEFGRCwgMHg5QTEzLCAweDA3NjcsIDB4OUExNiwgMHgzQkQwLAotICAgIDB4OUExOSwgMHgxQzUwLCAweDlBMUEsIDB4NEEyRCwgMHg5QTIwLCAweDRBMkUsIDB4OUEyMywgMHg0RTFGLAotICAgIDB4OUEyNCwgMHgzQkQxLCAweDlBMjcsIDB4M0JEMiwgMHg5QTI4LCAweDBCMkQsIDB4OUEyQiwgMHgxQzUxLAotICAgIDB4OUEyRCwgMHgzQkQzLCAweDlBMkUsIDB4M0JENCwgMHg5QTMwLCAweDBDODUsIDB4OUEzMSwgMHg0QTJGLAotICAgIDB4OUEzNiwgMHgzQkQ1LCAweDlBMzcsIDB4MUM1MiwgMHg5QTM4LCAweDNCRDYsIDB4OUEzRSwgMHgxQzU3LAotICAgIDB4OUE0MCwgMHgxQzU1LCAweDlBNDEsIDB4NEUyMCwgMHg5QTQyLCAweDFDNTQsIDB4OUE0MywgMHgxQzU2LAotICAgIDB4OUE0NCwgMHg0QTMwLCAweDlBNDUsIDB4MUM1MywgMHg5QTRBLCAweDNCRDcsIDB4OUE0QywgMHg0QTMxLAotICAgIDB4OUE0RCwgMHgxQzU5LCAweDlBNEUsIDB4MjIwMCwgMHg5QTUxLCAweDRFMjEsIDB4OUE1MiwgMHgxRTJGLAotICAgIDB4OUE1NSwgMHgxQzU4LCAweDlBNTYsIDB4M0JEOCwgMHg5QTU3LCAweDFDNUIsIDB4OUE1OCwgMHg0QTMyLAotICAgIDB4OUE1QSwgMHgwNkJCLCAweDlBNUIsIDB4MUM1QSwgMHg5QTVGLCAweDFDNUMsIDB4OUE2MiwgMHgxQzVELAotICAgIDB4OUE2NCwgMHgxQzVGLCAweDlBNjUsIDB4MUM1RSwgMHg5QTY5LCAweDFDNjAsIDB4OUE2QSwgMHgxQzYyLAotICAgIDB4OUE2QiwgMHgxQzYxLCAweDlBQTgsIDB4MDgwRSwgMHg5QUFELCAweDFDNjMsIDB4OUFBRiwgMHg0QTM0LAotICAgIDB4OUFCMCwgMHgxQzY0LCAweDlBQjUsIDB4M0JEOSwgMHg5QUI2LCAweDNCREEsIDB4OUFCNywgMHg0QTM2LAotICAgIDB4OUFCOCwgMHgwNTlBLCAweDlBQjksIDB4NEEzOCwgMHg5QUJDLCAweDFDNjUsIDB4OUFCRCwgMHg0RTIyLAotICAgIDB4OUFCRSwgMHg0RTIzLCAweDlBQzAsIDB4MUM2NiwgMHg5QUMxLCAweDQzMkUsIDB4OUFDMywgMHg0MzJGLAotICAgIDB4OUFDNCwgMHgwQTM3LCAweDlBQzYsIDB4NEEzQSwgMHg5QUNFLCAweDQzMzAsIDB4OUFDRiwgMHgxQzY3LAotICAgIDB4OUFEMCwgMHg0QTNCLCAweDlBRDEsIDB4MUM2OCwgMHg5QUQyLCAweDRBM0MsIDB4OUFEMywgMHgxQzY5LAotICAgIDB4OUFENCwgMHgxQzZBLCAweDlBRDUsIDB4NEEzRCwgMHg5QUQ2LCAweDQzMzEsIDB4OUFEOCwgMHgwN0Y0LAotICAgIDB4OUFEOSwgMHgyMjAxLCAweDlBREMsIDB4MjIwMiwgMHg5QURFLCAweDFDNkIsIDB4OUFERiwgMHgxQzZDLAotICAgIDB4OUFFMCwgMHg0QTNFLCAweDlBRTIsIDB4MUM2RCwgMHg5QUUzLCAweDFDNkUsIDB4OUFFNSwgMHg0QTNGLAotICAgIDB4OUFFNiwgMHgxQzZGLCAweDlBRTksIDB4NEE0MCwgMHg5QUVBLCAweDBENDUsIDB4OUFFQiwgMHgxQzcxLAotICAgIDB4OUFFRCwgMHgwRDk4LCAweDlBRUUsIDB4MUM3MiwgMHg5QUVGLCAweDFDNzAsIDB4OUFGMSwgMHgxQzc0LAotICAgIDB4OUFGNCwgMHgxQzczLCAweDlBRjcsIDB4MUM3NSwgMHg5QUY5LCAweDNCREIsIDB4OUFGQiwgMHgxQzc2LAotICAgIDB4OUIwMSwgMHg0RTI0LCAweDlCMDIsIDB4NDMzMiwgMHg5QjAzLCAweDNCREMsIDB4OUIwNiwgMHgxQzc3LAotICAgIDB4OUIwOCwgMHg0MzMzLCAweDlCMDksIDB4NEUyNSwgMHg5QjBCLCAweDRFMjYsIDB4OUIwQywgMHg0QTQxLAotICAgIDB4OUIwRCwgMHg0RTI3LCAweDlCMEUsIDB4NEUyOCwgMHg5QjEwLCAweDRBNDIsIDB4OUIxMiwgMHg0QTQzLAotICAgIDB4OUIxNiwgMHg0QTQ0LCAweDlCMTgsIDB4MUM3OCwgMHg5QjE5LCAweDRFMjksIDB4OUIxQSwgMHgxQzc5LAotICAgIDB4OUIxQywgMHg0QTQ1LCAweDlCMUQsIDB4NEY0OSwgMHg5QjFGLCAweDFDN0EsIDB4OUIyMCwgMHgzQkRELAotICAgIDB4OUIyMiwgMHgxQzdCLCAweDlCMjMsIDB4MUM3QywgMHg5QjI1LCAweDFDN0QsIDB4OUIyNywgMHgxQzdFLAotICAgIDB4OUIyOCwgMHgxQzdGLCAweDlCMjksIDB4MUM4MCwgMHg5QjJBLCAweDFDODEsIDB4OUIyQiwgMHg0QTQ2LAotICAgIDB4OUIyQywgMHg0RjRBLCAweDlCMkQsIDB4NDMzNSwgMHg5QjJFLCAweDFDODIsIDB4OUIyRiwgMHgxQzgzLAotICAgIDB4OUIzMSwgMHgxNEQ0LCAweDlCMzIsIDB4MUM4NCwgMHg5QjMzLCAweDNCREUsIDB4OUIzNCwgMHgzQkRGLAotICAgIDB4OUIzNSwgMHg0RTJBLCAweDlCM0IsIDB4MTdBOSwgMHg5QjNDLCAweDA2NEUsIDB4OUIzRCwgMHg0QTQ3LAotICAgIDB4OUI0MSwgMHgwNTdGLCAweDlCNDIsIDB4MDgyMiwgMHg5QjQzLCAweDFDODYsIDB4OUI0NCwgMHgxQzg1LAotICAgIDB4OUI0NSwgMHgwRUIxLCAweDlCNDgsIDB4NEUyQiwgMHg5QjRCLCAweDRBNDksIDB4OUI0RCwgMHgxQzg4LAotICAgIDB4OUI0RSwgMHgxQzg5LCAweDlCNEYsIDB4MUM4NywgMHg5QjUxLCAweDFDOEEsIDB4OUI1NCwgMHgwRTkwLAotICAgIDB4OUI1NSwgMHg0RTJDLCAweDlCNTgsIDB4MUM4QiwgMHg5QjVBLCAweDA2OTUsIDB4OUI1RSwgMHg0MzM2LAotICAgIDB4OUI2MywgMHg0QTRBLCAweDlCNjUsIDB4NEE0QiwgMHg5QjY2LCAweDQzMzcsIDB4OUI2OCwgMHg0RTJELAotICAgIDB4OUI2QiwgMHg0QTRDLCAweDlCNkMsIDB4NEE0RCwgMHg5QjZGLCAweDBGQ0IsIDB4OUI3MiwgMHgyMjA0LAotICAgIDB4OUI3MywgMHgzQkUwLCAweDlCNzQsIDB4MUM4QywgMHg5Qjc1LCAweDIyMDMsIDB4OUI3NiwgMHg0QTRFLAotICAgIDB4OUI3NywgMHg0QTRGLCAweDlCNzksIDB4M0JFMSwgMHg5QjgwLCAweDRFMkUsIDB4OUI4MywgMHgxQzhFLAotICAgIDB4OUI4NCwgMHg0MzM4LCAweDlCODYsIDB4NEUyRiwgMHg5QjhBLCAweDQzMzksIDB4OUI4RSwgMHgwNDgyLAotICAgIDB4OUI4RiwgMHgyMjA1LCAweDlCOTAsIDB4NEUzMCwgMHg5QjkxLCAweDFDOEYsIDB4OUI5MiwgMHgwREZCLAotICAgIDB4OUI5MywgMHgxQzhELCAweDlCOTYsIDB4MUM5MCwgMHg5Qjk3LCAweDFDOTEsIDB4OUI5RCwgMHg0RTMxLAotICAgIDB4OUI5RSwgMHg0MzNBLCAweDlCOUYsIDB4MUM5MiwgMHg5QkEwLCAweDFDOTMsIDB4OUJBNiwgMHg0QTUwLAotICAgIDB4OUJBNywgMHgzQkUyLCAweDlCQTgsIDB4MUM5NCwgMHg5QkFBLCAweDBFOUMsIDB4OUJBQiwgMHgwODdCLAotICAgIDB4OUJBQywgMHg0QTUxLCAweDlCQUQsIDB4MDg2QSwgMHg5QkFFLCAweDBBQjEsIDB4OUJCMCwgMHg0RTMyLAotICAgIDB4OUJCMSwgMHgyMjA2LCAweDlCQjIsIDB4NEE1MywgMHg5QkI0LCAweDFDOTUsIDB4OUJCOCwgMHg0QTU0LAotICAgIDB4OUJCOSwgMHgxQzk4LCAweDlCQkIsIDB4MjIwNywgMHg5QkJFLCAweDRBNTUsIDB4OUJCRiwgMHg0RTMzLAotICAgIDB4OUJDMCwgMHgxQzk2LCAweDlCQzEsIDB4M0JFMywgMHg5QkM2LCAweDFDOTksIDB4OUJDNywgMHgzQkU0LAotICAgIDB4OUJDOCwgMHg0RTM0LCAweDlCQzksIDB4MDdBNSwgMHg5QkNBLCAweDFDOTcsIDB4OUJDRSwgMHg0MzNCLAotICAgIDB4OUJDRiwgMHgxQzlBLCAweDlCRDEsIDB4MUM5QiwgMHg5QkQyLCAweDFDOUMsIDB4OUJENCwgMHgxQ0EwLAotICAgIDB4OUJENiwgMHgwODc4LCAweDlCRDcsIDB4M0JFNSwgMHg5QkQ4LCAweDRBNTcsIDB4OUJEQiwgMHgwQjQ0LAotICAgIDB4OUJERCwgMHg0QTU4LCAweDlCREYsIDB4MzdCRiwgMHg5QkUxLCAweDFDQTEsIDB4OUJFMiwgMHgxQzlFLAotICAgIDB4OUJFMywgMHgxQzlELCAweDlCRTQsIDB4MUM5RiwgMHg5QkU1LCAweDQzM0MsIDB4OUJFNywgMHgzQkU2LAotICAgIDB4OUJFOCwgMHgwNzM1LCAweDlCRUEsIDB4NEE1OSwgMHg5QkVCLCAweDNCRTcsIDB4OUJFRSwgMHg0QTVCLAotICAgIDB4OUJFRiwgMHg0QTVBLCAweDlCRjAsIDB4MUNBNSwgMHg5QkYxLCAweDFDQTQsIDB4OUJGMiwgMHgxQ0EzLAotICAgIDB4OUJGMywgMHg0QTU2LCAweDlCRjUsIDB4MDQ3NywgMHg5QkY3LCAweDNCRTgsIDB4OUJGOCwgMHg0MzNELAotICAgIDB4OUJGQSwgMHgzQkU5LCAweDlCRkQsIDB4M0JFQSwgMHg5QkZGLCAweDRFMzUsIDB4OUMwMCwgMHgyMjA4LAotICAgIDB4OUMwMiwgMHg0RTM2LCAweDlDMDQsIDB4MUNBRiwgMHg5QzA2LCAweDFDQUIsIDB4OUMwOCwgMHgxQ0FDLAotICAgIDB4OUMwOSwgMHgxQ0E4LCAweDlDMEEsIDB4MUNBRSwgMHg5QzBCLCAweDNCRUIsIDB4OUMwQywgMHgxQ0FBLAotICAgIDB4OUMwRCwgMHgwNUMwLCAweDlDMTAsIDB4MEZGMiwgMHg5QzEyLCAweDFDQUQsIDB4OUMxMywgMHgxQ0E5LAotICAgIDB4OUMxNCwgMHgxQ0E3LCAweDlDMTUsIDB4MUNBNiwgMHg5QzE2LCAweDRBNUYsIDB4OUMxOCwgMHg0QTYwLAotICAgIDB4OUMxOSwgMHg0QTYxLCAweDlDMUEsIDB4NEE2MiwgMHg5QzFCLCAweDFDQjEsIDB4OUMxQywgMHg0RTM3LAotICAgIDB4OUMxRCwgMHg0QTYzLCAweDlDMjEsIDB4MUNCNCwgMHg5QzIyLCAweDRBNjQsIDB4OUMyMywgMHg0MzNFLAotICAgIDB4OUMyNCwgMHgxQ0IzLCAweDlDMjUsIDB4MUNCMiwgMHg5QzI3LCAweDNCRUMsIDB4OUMyOSwgMHg0QTY1LAotICAgIDB4OUMyQSwgMHgzQkVELCAweDlDMkQsIDB4MERCQiwgMHg5QzJFLCAweDFDQjAsIDB4OUMyRiwgMHgwNEI3LAotICAgIDB4OUMzMCwgMHgxQ0I1LCAweDlDMzEsIDB4NEE2NywgMHg5QzMyLCAweDFDQjcsIDB4OUMzNSwgMHg0RTM4LAotICAgIDB4OUMzNiwgMHgzQkVFLCAweDlDMzcsIDB4NEE2OCwgMHg5QzM5LCAweDA1Q0QsIDB4OUMzQSwgMHgxQ0EyLAotICAgIDB4OUMzQiwgMHgwNEQ5LCAweDlDM0UsIDB4MUNCOSwgMHg5QzQxLCAweDNCRUYsIDB4OUM0NCwgMHg0RTM5LAotICAgIDB4OUM0NSwgMHg0QTY5LCAweDlDNDYsIDB4MUNCOCwgMHg5QzQ3LCAweDFDQjYsIDB4OUM0OCwgMHgwQjZCLAotICAgIDB4OUM0OSwgMHg0QTZDLCAweDlDNEEsIDB4NEE2RCwgMHg5QzRGLCAweDQzM0YsIDB4OUM1MCwgMHg0MzQwLAotICAgIDB4OUM1MiwgMHgwRTlFLCAweDlDNTMsIDB4M0JGMCwgMHg5QzU0LCAweDRBNkYsIDB4OUM1NiwgMHg0RTNBLAotICAgIDB4OUM1NywgMHgwRkEyLCAweDlDNTgsIDB4NEE3MCwgMHg5QzVBLCAweDFDQkEsIDB4OUM1QiwgMHg0QTcxLAotICAgIDB4OUM1QywgMHg0QTZBLCAweDlDNUQsIDB4NEE3MiwgMHg5QzVGLCAweDRBNzMsIDB4OUM2MCwgMHgxQ0JCLAotICAgIDB4OUM2MSwgMHg0RTNCLCAweDlDNjMsIDB4M0JGMSwgMHg5QzY1LCAweDQzNDEsIDB4OUM2NywgMHgxQ0JDLAotICAgIDB4OUM2OCwgMHg0RTNDLCAweDlDNjksIDB4NEE3NCwgMHg5QzZBLCAweDRBNzUsIDB4OUM2QiwgMHg0QTc2LAotICAgIDB4OUM2RCwgMHg0QTc3LCAweDlDNkUsIDB4NEE3OCwgMHg5QzcwLCAweDNCRjIsIDB4OUM3MiwgMHg0QTc5LAotICAgIDB4OUM3NSwgMHg0QTdBLCAweDlDNzYsIDB4MUNCRCwgMHg5Qzc3LCAweDNCRjMsIDB4OUM3OCwgMHgxQ0JFLAotICAgIDB4OUM3QSwgMHg0QTdCLCAweDlDRTUsIDB4MEJENywgMHg5Q0U2LCAweDRBN0MsIDB4OUNFNywgMHgxQ0JGLAotICAgIDB4OUNFOSwgMHgwRDRCLCAweDlDRUIsIDB4MUNDNCwgMHg5Q0VDLCAweDFDQzAsIDB4OUNGMCwgMHgxQ0MxLAotICAgIDB4OUNGMiwgMHg0QTdELCAweDlDRjMsIDB4MEU1RiwgMHg5Q0Y0LCAweDBFRDAsIDB4OUNGNiwgMHgwQ0E4LAotICAgIDB4OUQwMiwgMHgzQkY0LCAweDlEMDMsIDB4MUNDNSwgMHg5RDA2LCAweDFDQzYsIDB4OUQwNywgMHgwQzk2LAotICAgIDB4OUQwOCwgMHgxQ0MzLCAweDlEMDksIDB4MUNDMiwgMHg5RDBCLCAweDRBN0UsIDB4OUQwRSwgMHgwNTJBLAotICAgIDB4OUQxMSwgMHg0QTgwLCAweDlEMTIsIDB4MUNDRSwgMHg5RDE1LCAweDFDQ0QsIDB4OUQxNywgMHg0QTgxLAotICAgIDB4OUQxOCwgMHg0QTgyLCAweDlEMUIsIDB4MDUxNywgMHg5RDFELCAweDQzNDIsIDB4OUQxRSwgMHg0MzQzLAotICAgIDB4OUQxRiwgMHgxQ0NCLCAweDlEMjMsIDB4MUNDQSwgMHg5RDI2LCAweDFDQzgsIDB4OUQyOCwgMHgwNUQ5LAotICAgIDB4OUQyQSwgMHgxQ0M3LCAweDlEMkIsIDB4MDhERSwgMHg5RDJDLCAweDA1MjksIDB4OUQzMCwgMHg0RTNELAotICAgIDB4OUQzMiwgMHg0QTg2LCAweDlEM0IsIDB4MDdGNSwgMHg5RDNELCAweDRFM0UsIDB4OUQzRSwgMHgxQ0QxLAotICAgIDB4OUQzRiwgMHgxQ0QwLCAweDlENDEsIDB4MUNDRiwgMHg5RDQyLCAweDNCRjUsIDB4OUQ0MywgMHg0MzQ0LAotICAgIDB4OUQ0NCwgMHgxQ0NDLCAweDlENDYsIDB4MUNEMiwgMHg5RDQ3LCAweDNCRjYsIDB4OUQ0OCwgMHgxQ0QzLAotICAgIDB4OUQ0QSwgMHg0QTg4LCAweDlENTAsIDB4MUNEOCwgMHg5RDUxLCAweDFDRDcsIDB4OUQ1MiwgMHg0MzQ1LAotICAgIDB4OUQ1OSwgMHgxQ0Q5LCAweDlENUMsIDB4MDRDRiwgMHg5RDVELCAweDFDRDQsIDB4OUQ1RSwgMHgxQ0Q1LAotICAgIDB4OUQ1RiwgMHg0QTg5LCAweDlENjAsIDB4MDgwNiwgMHg5RDYxLCAweDBFQzUsIDB4OUQ2MiwgMHg0QThBLAotICAgIDB4OUQ2MywgMHgzQkY3LCAweDlENjQsIDB4MUNENiwgMHg5RDY5LCAweDNCRjgsIDB4OUQ2QSwgMHg0RTNGLAotICAgIDB4OUQ2QiwgMHgyMjBBLCAweDlENkMsIDB4MEU2MCwgMHg5RDZGLCAweDFDREUsIDB4OUQ3MCwgMHgyMjA5LAotICAgIDB4OUQ3MiwgMHgxQ0RBLCAweDlENzMsIDB4NEE4RCwgMHg5RDc2LCAweDRBOEUsIDB4OUQ3NywgMHg0QThGLAotICAgIDB4OUQ3QSwgMHgxQ0RGLCAweDlEN0IsIDB4NEU0MCwgMHg5RDdDLCAweDNCRjksIDB4OUQ3RSwgMHgzQkZBLAotICAgIDB4OUQ4NCwgMHg0QTkwLCAweDlEODcsIDB4MUNEQywgMHg5RDg5LCAweDFDREIsIDB4OUQ4QSwgMHg0MzQ2LAotICAgIDB4OUQ4RCwgMHgzQkZCLCAweDlEOEYsIDB4MDczMiwgMHg5RDk2LCAweDQzNDcsIDB4OUQ5OSwgMHg0QTkxLAotICAgIDB4OUQ5QSwgMHgxQ0UwLCAweDlEQTEsIDB4NEE5MiwgMHg5REE0LCAweDFDRTEsIDB4OURBOSwgMHgxQ0UyLAotICAgIDB4OURBQiwgMHgxQ0RELCAweDlEQUMsIDB4NDM0OSwgMHg5REFGLCAweDFDQzksIDB4OURCMSwgMHgzQkZDLAotICAgIDB4OURCMiwgMHgxQ0UzLCAweDlEQjQsIDB4MEJGRCwgMHg5REI1LCAweDRBOTQsIDB4OURCOCwgMHgxQ0U3LAotICAgIDB4OURCOSwgMHg0QTk1LCAweDlEQkEsIDB4MUNFOCwgMHg5REJCLCAweDFDRTYsIDB4OURCQywgMHg0MzRBLAotICAgIDB4OURCRCwgMHg0QTk2LCAweDlEQkYsIDB4NEE5MywgMHg5REMwLCAweDQzNDgsIDB4OURDMSwgMHgxQ0U1LAotICAgIDB4OURDMiwgMHgxQ0VCLCAweDlEQzMsIDB4M0JGRCwgMHg5REM0LCAweDFDRTQsIDB4OURDNiwgMHgxQ0U5LAotICAgIDB4OURDNywgMHgzQkZFLCAweDlEQzksIDB4NEE5NywgMHg5RENGLCAweDFDRUEsIDB4OUREMywgMHgxQ0VELAotICAgIDB4OURENiwgMHgzQkZGLCAweDlERDcsIDB4MURERSwgMHg5REQ5LCAweDFDRUMsIDB4OUREQSwgMHg0QTk4LAotICAgIDB4OURERiwgMHgzQzAwLCAweDlERTAsIDB4NEE5OSwgMHg5REUzLCAweDRBOUEsIDB4OURFNSwgMHg0RTQxLAotICAgIDB4OURFNiwgMHgxQ0VGLCAweDlERTcsIDB4NDM0QywgMHg5REU5LCAweDRFNDIsIDB4OURFQiwgMHgzQzAxLAotICAgIDB4OURFRCwgMHgxQ0YwLCAweDlERUYsIDB4MUNGMSwgMHg5REYyLCAweDBGRUYsIDB4OURGMywgMHg0RTQzLAotICAgIDB4OURGNCwgMHgzQzAyLCAweDlERjgsIDB4MUNFRSwgMHg5REY5LCAweDBCNEIsIDB4OURGQSwgMHgwODVELAotICAgIDB4OURGRCwgMHgxQ0YyLCAweDlFMDIsIDB4NEE5RCwgMHg5RTA3LCAweDQzNEQsIDB4OUUwQSwgMHg0QTlDLAotICAgIDB4OUUwRCwgMHg0QTlFLCAweDlFMTUsIDB4M0MwMywgMHg5RTE5LCAweDIyMEMsIDB4OUUxQSwgMHgxQ0YzLAotICAgIDB4OUUxQiwgMHgxQ0Y0LCAweDlFMUMsIDB4NEE5RiwgMHg5RTFELCAweDNDMDQsIDB4OUUxRSwgMHgxQ0Y1LAotICAgIDB4OUU3NSwgMHgxQ0Y2LCAweDlFNzgsIDB4MDc2OCwgMHg5RTc5LCAweDFDRjcsIDB4OUU3QSwgMHg0RTQ0LAotICAgIDB4OUU3QiwgMHg0QUEwLCAweDlFN0MsIDB4MURGRCwgMHg5RTdELCAweDFDRjgsIDB4OUU3RiwgMHgwOERCLAotICAgIDB4OUU4MCwgMHg0QUEyLCAweDlFODEsIDB4MUNGOSwgMHg5RTgyLCAweDRFNDUsIDB4OUU4MywgMHg0RTQ2LAotICAgIDB4OUU4NCwgMHg0RTQ3LCAweDlFODUsIDB4NEFBMywgMHg5RTg4LCAweDFDRkEsIDB4OUU4QiwgMHgxQ0ZCLAotICAgIDB4OUU4QywgMHgxQ0ZDLCAweDlFOTEsIDB4MUNGRiwgMHg5RTkyLCAweDFDRkQsIDB4OUU5MywgMHgwRkUyLAotICAgIDB4OUU5NSwgMHgxQ0ZFLCAweDlFOTcsIDB4MEZCNywgMHg5RTlCLCAweDRBQTQsIDB4OUU5RCwgMHgxRDAwLAotICAgIDB4OUU5RSwgMHg0MzRFLCAweDlFOUYsIDB4MEZBMywgMHg5RUE0LCAweDNDMDUsIDB4OUVBNSwgMHgxRDAxLAotICAgIDB4OUVBNiwgMHgwRDM0LCAweDlFQTgsIDB4M0MwNiwgMHg5RUE5LCAweDFEMDIsIDB4OUVBQSwgMHgxRDA0LAotICAgIDB4OUVBQywgMHgzQzA3LCAweDlFQUQsIDB4MUQwNSwgMHg5RUFGLCAweDQzNEYsIDB4OUVCMCwgMHg0RTQ4LAotICAgIDB4OUVCNCwgMHgxRTAyLCAweDlFQjUsIDB4MUU3NSwgMHg5RUI4LCAweDFEMDMsIDB4OUVCOSwgMHgwN0ZGLAotICAgIDB4OUVCQSwgMHgwRUQ5LCAweDlFQkIsIDB4MEU5MSwgMHg5RUJDLCAweDEyODQsIDB4OUVCRCwgMHg0QUE2LAotICAgIDB4OUVCRSwgMHgxNEZGLCAweDlFQkYsIDB4MEVBOSwgMHg5RUMzLCAweDM0MEIsIDB4OUVDNCwgMHgwNTJCLAotICAgIDB4OUVDQywgMHgxRDA3LCAweDlFQ0QsIDB4MDY2QSwgMHg5RUNFLCAweDFEMDgsIDB4OUVDRiwgMHgxRDA5LAotICAgIDB4OUVEMCwgMHgxRDBBLCAweDlFRDEsIDB4MjIwRCwgMHg5RUQyLCAweDA4MDcsIDB4OUVENCwgMHgxRDBCLAotICAgIDB4OUVEOCwgMHgxNjBELCAweDlFRDksIDB4MEVFNywgMHg5RURCLCAweDBCNDMsIDB4OUVEQywgMHgxRDBDLAotICAgIDB4OUVERCwgMHgxRDBFLCAweDlFREUsIDB4MUQwRCwgMHg5RURGLCAweDRBQTgsIDB4OUVFMCwgMHgxRDBGLAotICAgIDB4OUVFNCwgMHg0RTQ5LCAweDlFRTUsIDB4MUQxMCwgMHg5RUU3LCAweDNDMDgsIDB4OUVFOCwgMHgxRDExLAotICAgIDB4OUVFRSwgMHgzQzA5LCAweDlFRUYsIDB4MUQxMiwgMHg5RUYwLCAweDRFNEEsIDB4OUVGMiwgMHg0RTRCLAotICAgIDB4OUVGNCwgMHgxRDEzLCAweDlFRjYsIDB4MUQxNCwgMHg5RUY3LCAweDFEMTUsIDB4OUVGOSwgMHgxRDE2LAotICAgIDB4OUVGQiwgMHgxRDE3LCAweDlFRkMsIDB4MUQxOCwgMHg5RUZELCAweDFEMTksIDB4OUVGRiwgMHg0QUE5LAotICAgIDB4OUYwMiwgMHg0QUFBLCAweDlGMDMsIDB4NEFBQywgMHg5RjA3LCAweDFEMUEsIDB4OUYwOCwgMHgxRDFCLAotICAgIDB4OUYwOSwgMHg0RTRDLCAweDlGMEUsIDB4MEMxRSwgMHg5RjBGLCAweDRFNEQsIDB4OUYxMCwgMHgzQzBBLAotICAgIDB4OUYxMiwgMHgzQzBCLCAweDlGMTMsIDB4MDc5MSwgMHg5RjE0LCAweDRFNEUsIDB4OUYxNSwgMHgxRDFELAotICAgIDB4OUYxNywgMHgzQzBDLCAweDlGMTksIDB4M0MwRCwgMHg5RjFCLCAweDRFNEYsIDB4OUYyMCwgMHgwQUNGLAotICAgIDB4OUYyMSwgMHgxRDFFLCAweDlGMjIsIDB4NEU1MCwgMHg5RjI2LCAweDRFNTEsIDB4OUYyQSwgMHg0RTUyLAotICAgIDB4OUYyQiwgMHg0RTUzLCAweDlGMkMsIDB4MUQxRiwgMHg5RjJGLCAweDNDMEUsIDB4OUYzNCwgMHg0RTU0LAotICAgIDB4OUYzNywgMHgzQzBGLCAweDlGMzksIDB4M0MxMCwgMHg5RjNBLCAweDRBQUQsIDB4OUYzQiwgMHgwRDkzLAotICAgIDB4OUYzRCwgMHg0QUFFLCAweDlGM0UsIDB4MUQyMCwgMHg5RjQxLCAweDNDMTEsIDB4OUY0NSwgMHgzQzEyLAotICAgIDB4OUY0NiwgMHg0QUFGLCAweDlGNEEsIDB4MUQyMSwgMHg5RjRCLCAweDE3MEEsIDB4OUY0RSwgMHgxQTdCLAotICAgIDB4OUY0RiwgMHgxQzA2LCAweDlGNTIsIDB4MUQyMiwgMHg5RjUzLCAweDRBQjAsIDB4OUY1NCwgMHgxRDIzLAotICAgIDB4OUY1NSwgMHg0QUIxLCAweDlGNTcsIDB4M0MxMywgMHg5RjU4LCAweDRBQjIsIDB4OUY1QSwgMHg0RTU1LAotICAgIDB4OUY1RCwgMHg0QUI0LCAweDlGNUYsIDB4MUQyNSwgMHg5RjYwLCAweDFEMjYsIDB4OUY2MSwgMHgxRDI3LAotICAgIDB4OUY2MiwgMHgwRkI4LCAweDlGNjMsIDB4MUQyNCwgMHg5RjY2LCAweDFEMjgsIDB4OUY2NywgMHgxRDI5LAotICAgIDB4OUY2OCwgMHgzQzE0LCAweDlGNjksIDB4NEFCNiwgMHg5RjZBLCAweDFEMkIsIDB4OUY2QywgMHgxRDJBLAotICAgIDB4OUY2RCwgMHg0QUI3LCAweDlGNkYsIDB4NEU1NiwgMHg5RjcwLCAweDRBQjgsIDB4OUY3MSwgMHgzQzE1LAotICAgIDB4OUY3MiwgMHgxRDJELCAweDlGNzUsIDB4M0MxNiwgMHg5Rjc2LCAweDFEMkUsIDB4OUY3NywgMHgxRDJDLAotICAgIDB4OUY4RCwgMHgwRjdFLCAweDlGOTAsIDB4M0MxNywgMHg5Rjk0LCAweDNDMTgsIDB4OUY5NSwgMHgxRDJGLAotICAgIDB4OUY5NywgMHg0MzUwLCAweDlGOUMsIDB4MUQzMCwgMHg5RjlELCAweDE3MjcsIDB4OUY5RSwgMHg0RTU3LAotICAgIDB4OUZBMCwgMHgxRDMxLCAweDlGQTIsIDB4M0MxOSwgMHg5RkE1LCAweDRFNTgsIDB4Rjg2MCwgMHgzQzU0LAotICAgIDB4Rjg2MSwgMHgzQzU1LCAweEY4NjIsIDB4M0M1NiwgMHhGODdBLCAweDNDNTcsIDB4Rjg3RiwgMHgzQzU4LAotICAgIDB4RjkwOSwgMHgzNUFCLCAweEY5MUQsIDB4MzQ1MCwgMHhGOTFGLCAweDM3MDQsIDB4RjkyOCwgMHg0RjRGLAotICAgIDB4RjkyOSwgMHg0RjUxLCAweEY5MzYsIDB4MzQ1MiwgMHhGOTVGLCAweDM2OTMsIDB4Rjk3MCwgMHgzNDIwLAotICAgIDB4Rjk4MywgMHgzNzA4LCAweEY5OTIsIDB4MUU4MSwgMHhGOTkzLCAweDFFODIsIDB4Rjk5OSwgMHgxRTgzLAotICAgIDB4Rjk5QSwgMHgzNzExLCAweEY5QTIsIDB4MzcwRiwgMHhGOUMzLCAweDFFODAsIDB4RjlEMCwgMHgzNDU0LAotICAgIDB4RjlEQywgMHgzNDUxLCAweEY5RUMsIDB4MUU0NiwgMHhGQTAzLCAweDM2ODQsIDB4RkEwRSwgMHgyMERBLAotICAgIDB4RkEwRiwgMHgyMEU1LCAweEZBMTAsIDB4MUU0MiwgMHhGQTExLCAweDM3RDIsIDB4RkExMiwgMHgyMTIxLAotICAgIDB4RkExMywgMHgyMTMxLCAweEZBMTQsIDB4MjEzMywgMHhGQTE1LCAweDRGNTMsIDB4RkExNiwgMHgyMTY0LAotICAgIDB4RkExNywgMHgyMTdCLCAweEZBMTgsIDB4MjE4MywgMHhGQTE5LCAweDIxODQsIDB4RkExQSwgMHgyMTg1LAotICAgIDB4RkExQiwgMHgyMTg3LCAweEZBMUMsIDB4MjE4QiwgMHhGQTFELCAweDIxOEUsIDB4RkExRSwgMHgyMTk3LAotICAgIDB4RkExRiwgMHgyMUEyLCAweEZBMjAsIDB4MjFBNCwgMHhGQTIxLCAweDIxQTUsIDB4RkEyMiwgMHgyMUFFLAotICAgIDB4RkEyMywgMHgyMUI2LCAweEZBMjQsIDB4NDk0OCwgMHhGQTI1LCAweDIxQjksIDB4RkEyNiwgMHgyMUJDLAotICAgIDB4RkEyNywgMHgyMUQ4LCAweEZBMjgsIDB4MjFERiwgMHhGQTI5LCAweDIxRUYsIDB4RkEyQSwgMHgyMUZCLAotICAgIDB4RkEyQiwgMHgyMUZDLCAweEZBMkMsIDB4MjFGRSwgMHhGQTJELCAweDIyMEIsIDB4RkEzMCwgMHgzNDQ2LAotICAgIDB4RkEzMSwgMHgzNDMwLCAweEZBMzIsIDB4MzQ0RCwgMHhGQTMzLCAweDM0NDksIDB4RkEzNCwgMHgzNDFBLAotICAgIDB4RkEzNSwgMHgzNDQyLCAweEZBMzYsIDB4MURFMywgMHhGQTM3LCAweDM0MzYsIDB4RkEzOCwgMHgzNDE1LAotICAgIDB4RkEzOSwgMHgzNDQ4LCAweEZBM0EsIDB4MzQ0QiwgMHhGQTNCLCAweDM0MzEsIDB4RkEzQywgMHg0MUM1LAotICAgIDB4RkEzRCwgMHgzNDBFLCAweEZBM0UsIDB4MzQxMCwgMHhGQTNGLCAweDM0MzMsIDB4RkE0MCwgMHgzNDM5LAotICAgIDB4RkE0MSwgMHgzNDQ1LCAweEZBNDIsIDB4MzQxNiwgMHhGQTQzLCAweDM0MjgsIDB4RkE0NCwgMHgzNDNGLAotICAgIDB4RkE0NSwgMHgzNDBGLCAweEZBNDYsIDB4MUUxNCwgMHhGQTQ3LCAweDM0MTQsIDB4RkE0OCwgMHgzNDIzLAotICAgIDB4RkE0OSwgMHgzQzI2LCAweEZBNEEsIDB4MUUzNCwgMHhGQTRCLCAweDM0NDMsIDB4RkE0QywgMHgzNDI0LAotICAgIDB4RkE0RCwgMHgzNDIxLCAweEZBNEUsIDB4MzQxNywgMHhGQTRGLCAweDM0NEYsIDB4RkE1MCwgMHgzNDJGLAotICAgIDB4RkE1MSwgMHgzNDI3LCAweEZBNTIsIDB4MzQwRCwgMHhGQTUzLCAweDM0M0IsIDB4RkE1NCwgMHgzNDFGLAotICAgIDB4RkE1NSwgMHgzNDNELCAweEZBNTYsIDB4MzQyRSwgMHhGQTU3LCAweDM0NTcsIDB4RkE1OCwgMHg0N0JFLAotICAgIDB4RkE1OSwgMHgzNDQwLCAweEZBNUEsIDB4MzQyOSwgMHhGQTVCLCAweDM0MjUsIDB4RkE1QywgMHgzNDI2LAotICAgIDB4RkE1RCwgMHgzNzc3LCAweEZBNUUsIDB4Mzc3NiwgMHhGQTVGLCAweDM0MzcsIDB4RkE2MCwgMHgzNDEzLAotICAgIDB4RkE2MSwgMHgzNDIyLCAweEZBNjIsIDB4MzQwOSwgMHhGQTYzLCAweDM0MUIsIDB4RkE2NCwgMHgzNDQ0LAotICAgIDB4RkE2NSwgMHgzNDM0LCAweEZBNjYsIDB4M0MyQiwgMHhGQTY3LCAweDM0MDgsIDB4RkE2OCwgMHgzNDNFLAotICAgIDB4RkE2OSwgMHgzNDE5LCAweEZBNkEsIDB4MUU2QywgMHhGQjAwLCAweDI0OEUsIDB4RkIwMSwgMHgwMDcwLAotICAgIDB4RkIwMiwgMHgwMDcxLCAweEZCMDMsIDB4MjQ4RiwgMHhGQjA0LCAweDI0OTAsIDB4RkUzMCwgMHgxRURBLAotICAgIDB4RkUzMSwgMHgxRUQ0LCAweEZFMzIsIDB4MUVENSwgMHhGRTMzLCAweDFFRDIsIDB4RkUzNSwgMHgxRURCLAotICAgIDB4RkUzNiwgMHgxRURDLCAweEZFMzcsIDB4MUVFMSwgMHhGRTM4LCAweDFFRTIsIDB4RkUzOSwgMHgxRURELAotICAgIDB4RkUzQSwgMHgxRURFLCAweEZFM0IsIDB4MUVFQiwgMHhGRTNDLCAweDFFRUMsIDB4RkUzRCwgMHgxRUU1LAotICAgIDB4RkUzRSwgMHgxRUU2LCAweEZFM0YsIDB4MUVFMywgMHhGRTQwLCAweDFFRTQsIDB4RkU0MSwgMHgxRUU3LAotICAgIDB4RkU0MiwgMHgxRUU4LCAweEZFNDMsIDB4MUVFOSwgMHhGRTQ0LCAweDFFRUEsIDB4RkU0NSwgMHgzMTVGLAotICAgIDB4RkU0NiwgMHgzMTYwLCAweEZFNDcsIDB4MUVERiwgMHhGRTQ4LCAweDFFRTAsIDB4RkYwMSwgMHgwMjgyLAotICAgIDB4RkYwMiwgMHgxRjQ3LCAweEZGMDMsIDB4MDJDQywgMHhGRjA0LCAweDAyQzgsIDB4RkYwNSwgMHgwMkNCLAotICAgIDB4RkYwNiwgMHgwMkNELCAweEZGMDcsIDB4MUY0NiwgMHhGRjA4LCAweDAyQTIsIDB4RkYwOSwgMHgwMkEzLAotICAgIDB4RkYwQSwgMHgwMkNFLCAweEZGMEIsIDB4MDJCNCwgMHhGRjBDLCAweDAyN0MsIDB4RkYwRCwgMHgwMkI1LAotICAgIDB4RkYwRSwgMHgwMjdELCAweEZGMEYsIDB4MDI5NywgMHhGRjEwLCAweDAzMEMsIDB4RkYxMSwgMHgwMzBELAotICAgIDB4RkYxMiwgMHgwMzBFLCAweEZGMTMsIDB4MDMwRiwgMHhGRjE0LCAweDAzMTAsIDB4RkYxNSwgMHgwMzExLAotICAgIDB4RkYxNiwgMHgwMzEyLCAweEZGMTcsIDB4MDMxMywgMHhGRjE4LCAweDAzMTQsIDB4RkYxOSwgMHgwMzE1LAotICAgIDB4RkYxQSwgMHgwMjdGLCAweEZGMUIsIDB4MDI4MCwgMHhGRjFDLCAweDAyQkIsIDB4RkYxRCwgMHgwMkI5LAotICAgIDB4RkYxRSwgMHgwMkJDLCAweEZGMUYsIDB4MDI4MSwgMHhGRjIwLCAweDAyQ0YsIDB4RkYyMSwgMHgwMzE2LAotICAgIDB4RkYyMiwgMHgwMzE3LCAweEZGMjMsIDB4MDMxOCwgMHhGRjI0LCAweDAzMTksIDB4RkYyNSwgMHgwMzFBLAotICAgIDB4RkYyNiwgMHgwMzFCLCAweEZGMjcsIDB4MDMxQywgMHhGRjI4LCAweDAzMUQsIDB4RkYyOSwgMHgwMzFFLAotICAgIDB4RkYyQSwgMHgwMzFGLCAweEZGMkIsIDB4MDMyMCwgMHhGRjJDLCAweDAzMjEsIDB4RkYyRCwgMHgwMzIyLAotICAgIDB4RkYyRSwgMHgwMzIzLCAweEZGMkYsIDB4MDMyNCwgMHhGRjMwLCAweDAzMjUsIDB4RkYzMSwgMHgwMzI2LAotICAgIDB4RkYzMiwgMHgwMzI3LCAweEZGMzMsIDB4MDMyOCwgMHhGRjM0LCAweDAzMjksIDB4RkYzNSwgMHgwMzJBLAotICAgIDB4RkYzNiwgMHgwMzJCLCAweEZGMzcsIDB4MDMyQywgMHhGRjM4LCAweDAzMkQsIDB4RkYzOSwgMHgwMzJFLAotICAgIDB4RkYzQSwgMHgwMzJGLCAweEZGM0IsIDB4MDJBNiwgMHhGRjNDLCAweDAyOTgsIDB4RkYzRCwgMHgwMkE3LAotICAgIDB4RkYzRSwgMHgwMjg4LCAweEZGM0YsIDB4MDI4QSwgMHhGRjQwLCAweDAyODYsIDB4RkY0MSwgMHgwMzMwLAotICAgIDB4RkY0MiwgMHgwMzMxLCAweEZGNDMsIDB4MDMzMiwgMHhGRjQ0LCAweDAzMzMsIDB4RkY0NSwgMHgwMzM0LAotICAgIDB4RkY0NiwgMHgwMzM1LCAweEZGNDcsIDB4MDMzNiwgMHhGRjQ4LCAweDAzMzcsIDB4RkY0OSwgMHgwMzM4LAotICAgIDB4RkY0QSwgMHgwMzM5LCAweEZGNEIsIDB4MDMzQSwgMHhGRjRDLCAweDAzM0IsIDB4RkY0RCwgMHgwMzNDLAotICAgIDB4RkY0RSwgMHgwMzNELCAweEZGNEYsIDB4MDMzRSwgMHhGRjUwLCAweDAzM0YsIDB4RkY1MSwgMHgwMzQwLAotICAgIDB4RkY1MiwgMHgwMzQxLCAweEZGNTMsIDB4MDM0MiwgMHhGRjU0LCAweDAzNDMsIDB4RkY1NSwgMHgwMzQ0LAotICAgIDB4RkY1NiwgMHgwMzQ1LCAweEZGNTcsIDB4MDM0NiwgMHhGRjU4LCAweDAzNDcsIDB4RkY1OSwgMHgwMzQ4LAotICAgIDB4RkY1QSwgMHgwMzQ5LCAweEZGNUIsIDB4MDJBOCwgMHhGRjVDLCAweDAyOUIsIDB4RkY1RCwgMHgwMkE5LAotICAgIDB4RkY1RSwgMHgwMjk5LCAweEZGNUYsIDB4MkY2MywgMHhGRjYwLCAweDJGNjQsIDB4RkY2MSwgMHgwMTQ3LAotICAgIDB4RkY2MiwgMHgwMTQ4LCAweEZGNjMsIDB4MDE0OSwgMHhGRjY0LCAweDAxNEEsIDB4RkY2NSwgMHgwMTRCLAotICAgIDB4RkY2NiwgMHgwMTRDLCAweEZGNjcsIDB4MDE0RCwgMHhGRjY4LCAweDAxNEUsIDB4RkY2OSwgMHgwMTRGLAotICAgIDB4RkY2QSwgMHgwMTUwLCAweEZGNkIsIDB4MDE1MSwgMHhGRjZDLCAweDAxNTIsIDB4RkY2RCwgMHgwMTUzLAotICAgIDB4RkY2RSwgMHgwMTU0LCAweEZGNkYsIDB4MDE1NSwgMHhGRjcwLCAweDAxNTYsIDB4RkY3MSwgMHgwMTU3LAotICAgIDB4RkY3MiwgMHgwMTU4LCAweEZGNzMsIDB4MDE1OSwgMHhGRjc0LCAweDAxNUEsIDB4RkY3NSwgMHgwMTVCLAotICAgIDB4RkY3NiwgMHgwMTVDLCAweEZGNzcsIDB4MDE1RCwgMHhGRjc4LCAweDAxNUUsIDB4RkY3OSwgMHgwMTVGLAotICAgIDB4RkY3QSwgMHgwMTYwLCAweEZGN0IsIDB4MDE2MSwgMHhGRjdDLCAweDAxNjIsIDB4RkY3RCwgMHgwMTYzLAotICAgIDB4RkY3RSwgMHgwMTY0LCAweEZGN0YsIDB4MDE2NSwgMHhGRjgwLCAweDAxNjYsIDB4RkY4MSwgMHgwMTY3LAotICAgIDB4RkY4MiwgMHgwMTY4LCAweEZGODMsIDB4MDE2OSwgMHhGRjg0LCAweDAxNkEsIDB4RkY4NSwgMHgwMTZCLAotICAgIDB4RkY4NiwgMHgwMTZDLCAweEZGODcsIDB4MDE2RCwgMHhGRjg4LCAweDAxNkUsIDB4RkY4OSwgMHgwMTZGLAotICAgIDB4RkY4QSwgMHgwMTcwLCAweEZGOEIsIDB4MDE3MSwgMHhGRjhDLCAweDAxNzIsIDB4RkY4RCwgMHgwMTczLAotICAgIDB4RkY4RSwgMHgwMTc0LCAweEZGOEYsIDB4MDE3NSwgMHhGRjkwLCAweDAxNzYsIDB4RkY5MSwgMHgwMTc3LAotICAgIDB4RkY5MiwgMHgwMTc4LCAweEZGOTMsIDB4MDE3OSwgMHhGRjk0LCAweDAxN0EsIDB4RkY5NSwgMHgwMTdCLAotICAgIDB4RkY5NiwgMHgwMTdDLCAweEZGOTcsIDB4MDE3RCwgMHhGRjk4LCAweDAxN0UsIDB4RkY5OSwgMHgwMTdGLAotICAgIDB4RkY5QSwgMHgwMTgwLCAweEZGOUIsIDB4MDE4MSwgMHhGRjlDLCAweDAxODIsIDB4RkY5RCwgMHgwMTgzLAotICAgIDB4RkY5RSwgMHgwMTg0LCAweEZGOUYsIDB4MDE4NSwgMHhGRkUwLCAweDAyQzksIDB4RkZFMSwgMHgwMkNBLAotICAgIDB4RkZFMiwgMHgwMkVGLCAweEZGRTMsIDB4MDI4OSwgMHhGRkU0LCAweDFGNDUsIDB4RkZFNSwgMHgwMkM3LAotICAgIDB4RkZFOCwgMHgwMTQzLAorICAgIDB4MDAyMCwgMHgwMDAxLCAweDAwMjEsIDB4MDAwMiwgMHgwMDIyLCAweDAwMDMsIDB4MDAyMywgMHgwMDA0LCAweDAwMjQsCisgICAgMHgwMDA1LCAweDAwMjUsIDB4MDAwNiwgMHgwMDI2LCAweDAwMDcsIDB4MDAyNywgMHgwMDA4LCAweDAwMjgsIDB4MDAwOSwKKyAgICAweDAwMjksIDB4MDAwQSwgMHgwMDJBLCAweDAwMEIsIDB4MDAyQiwgMHgwMDBDLCAweDAwMkMsIDB4MDAwRCwgMHgwMDJELAorICAgIDB4MDAwRSwgMHgwMDJFLCAweDAwMEYsIDB4MDAyRiwgMHgwMDEwLCAweDAwMzAsIDB4MDAxMSwgMHgwMDMxLCAweDAwMTIsCisgICAgMHgwMDMyLCAweDAwMTMsIDB4MDAzMywgMHgwMDE0LCAweDAwMzQsIDB4MDAxNSwgMHgwMDM1LCAweDAwMTYsIDB4MDAzNiwKKyAgICAweDAwMTcsIDB4MDAzNywgMHgwMDE4LCAweDAwMzgsIDB4MDAxOSwgMHgwMDM5LCAweDAwMUEsIDB4MDAzQSwgMHgwMDFCLAorICAgIDB4MDAzQiwgMHgwMDFDLCAweDAwM0MsIDB4MDAxRCwgMHgwMDNELCAweDAwMUUsIDB4MDAzRSwgMHgwMDFGLCAweDAwM0YsCisgICAgMHgwMDIwLCAweDAwNDAsIDB4MDAyMSwgMHgwMDQxLCAweDAwMjIsIDB4MDA0MiwgMHgwMDIzLCAweDAwNDMsIDB4MDAyNCwKKyAgICAweDAwNDQsIDB4MDAyNSwgMHgwMDQ1LCAweDAwMjYsIDB4MDA0NiwgMHgwMDI3LCAweDAwNDcsIDB4MDAyOCwgMHgwMDQ4LAorICAgIDB4MDAyOSwgMHgwMDQ5LCAweDAwMkEsIDB4MDA0QSwgMHgwMDJCLCAweDAwNEIsIDB4MDAyQywgMHgwMDRDLCAweDAwMkQsCisgICAgMHgwMDRELCAweDAwMkUsIDB4MDA0RSwgMHgwMDJGLCAweDAwNEYsIDB4MDAzMCwgMHgwMDUwLCAweDAwMzEsIDB4MDA1MSwKKyAgICAweDAwMzIsIDB4MDA1MiwgMHgwMDMzLCAweDAwNTMsIDB4MDAzNCwgMHgwMDU0LCAweDAwMzUsIDB4MDA1NSwgMHgwMDM2LAorICAgIDB4MDA1NiwgMHgwMDM3LCAweDAwNTcsIDB4MDAzOCwgMHgwMDU4LCAweDAwMzksIDB4MDA1OSwgMHgwMDNBLCAweDAwNUEsCisgICAgMHgwMDNCLCAweDAwNUIsIDB4MDAzQywgMHgwMDVDLCAweDAwNjEsIDB4MDA1RCwgMHgwMDNFLCAweDAwNUUsIDB4MDAzRiwKKyAgICAweDAwNUYsIDB4MDA0MCwgMHgwMDYwLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQyLCAweDAwNjIsIDB4MDA0MywgMHgwMDYzLAorICAgIDB4MDA0NCwgMHgwMDY0LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ2LCAweDAwNjYsIDB4MDA0NywgMHgwMDY3LCAweDAwNDgsCisgICAgMHgwMDY4LCAweDAwNDksIDB4MDA2OSwgMHgwMDRBLCAweDAwNkEsIDB4MDA0QiwgMHgwMDZCLCAweDAwNEMsIDB4MDA2QywKKyAgICAweDAwNEQsIDB4MDA2RCwgMHgwMDRFLCAweDAwNkUsIDB4MDA0RiwgMHgwMDZGLCAweDAwNTAsIDB4MDA3MCwgMHgwMDUxLAorICAgIDB4MDA3MSwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MywgMHgwMDczLCAweDAwNTQsIDB4MDA3NCwgMHgwMDU1LCAweDAwNzUsCisgICAgMHgwMDU2LCAweDAwNzYsIDB4MDA1NywgMHgwMDc3LCAweDAwNTgsIDB4MDA3OCwgMHgwMDU5LCAweDAwNzksIDB4MDA1QSwKKyAgICAweDAwN0EsIDB4MDA1QiwgMHgwMDdCLCAweDAwNUMsIDB4MDA3QywgMHgwMDYzLCAweDAwN0QsIDB4MDA1RSwgMHgwMDdFLAorICAgIDB4MDA2NCwgMHgwMEEwLCAweDAwMDEsIDB4MDBBMSwgMHgwMDY1LCAweDAwQTIsIDB4MDA2NiwgMHgwMEEzLCAweDAwNjcsCisgICAgMHgwMEE0LCAweDAwNkIsIDB4MDBBNSwgMHgwMDNELCAweDAwQTYsIDB4MDA1RCwgMHgwMEE3LCAweDAyRDAsIDB4MDBBOCwKKyAgICAweDAyODcsIDB4MDBBOSwgMHgwMDk4LCAweDAwQUEsIDB4MDA4QywgMHgwMEFCLCAweDAwNkQsIDB4MDBBQywgMHgwMDk5LAorICAgIDB4MDBBRCwgMHgwMDk3LCAweDAwQUUsIDB4MDA5QSwgMHgwMEFGLCAweDAwODEsIDB4MDBCMCwgMHgwMkMzLCAweDAwQjEsCisgICAgMHgwMkI2LCAweDAwQjIsIDB4MDA5RCwgMHgwMEIzLCAweDAwOUUsIDB4MDBCNCwgMHgwMjg1LCAweDAwQjUsIDB4MDA5RiwKKyAgICAweDAwQjYsIDB4MDMwQSwgMHgwMEI3LCAweDAwNzUsIDB4MDBCOCwgMHgwMDg2LCAweDAwQjksIDB4MDBBMCwgMHgwMEJBLAorICAgIDB4MDA5MCwgMHgwMEJCLCAweDAwN0IsIDB4MDBCQywgMHgwMEExLCAweDAwQkQsIDB4MDBBMiwgMHgwMEJFLCAweDAwQTMsCisgICAgMHgwMEJGLCAweDAwN0UsIDB4MDBDMCwgMHgwMEE0LCAweDAwQzEsIDB4MDBBNSwgMHgwMEMyLCAweDAwQTYsIDB4MDBDMywKKyAgICAweDAwQTcsIDB4MDBDNCwgMHgwMEE4LCAweDAwQzUsIDB4MDBBOSwgMHgwMEM2LCAweDAwOEIsIDB4MDBDNywgMHgwMEFBLAorICAgIDB4MDBDOCwgMHgwMEFCLCAweDAwQzksIDB4MDBBQywgMHgwMENBLCAweDAwQUQsIDB4MDBDQiwgMHgwMEFFLCAweDAwQ0MsCisgICAgMHgwMEFGLCAweDAwQ0QsIDB4MDBCMCwgMHgwMENFLCAweDAwQjEsIDB4MDBDRiwgMHgwMEIyLCAweDAwRDAsIDB4MDBCMywKKyAgICAweDAwRDEsIDB4MDBCNCwgMHgwMEQyLCAweDAwQjUsIDB4MDBEMywgMHgwMEI2LCAweDAwRDQsIDB4MDBCNywgMHgwMEQ1LAorICAgIDB4MDBCOCwgMHgwMEQ2LCAweDAwQjksIDB4MDBENywgMHgwMkI3LCAweDAwRDgsIDB4MDA4RSwgMHgwMEQ5LCAweDAwQkIsCisgICAgMHgwMERBLCAweDAwQkMsIDB4MDBEQiwgMHgwMEJELCAweDAwREMsIDB4MDBCRSwgMHgwMERELCAweDAwQkYsIDB4MDBERSwKKyAgICAweDAwQzAsIDB4MDBERiwgMHgwMDk2LCAweDAwRTAsIDB4MDBDMSwgMHgwMEUxLCAweDAwQzIsIDB4MDBFMiwgMHgwMEMzLAorICAgIDB4MDBFMywgMHgwMEM0LCAweDAwRTQsIDB4MDBDNSwgMHgwMEU1LCAweDAwQzYsIDB4MDBFNiwgMHgwMDkxLCAweDAwRTcsCisgICAgMHgwMEM3LCAweDAwRTgsIDB4MDBDOCwgMHgwMEU5LCAweDAwQzksIDB4MDBFQSwgMHgwMENBLCAweDAwRUIsIDB4MDBDQiwKKyAgICAweDAwRUMsIDB4MDBDQywgMHgwMEVELCAweDAwQ0QsIDB4MDBFRSwgMHgwMENFLCAweDAwRUYsIDB4MDBDRiwgMHgwMEYwLAorICAgIDB4MDBEMCwgMHgwMEYxLCAweDAwRDEsIDB4MDBGMiwgMHgwMEQyLCAweDAwRjMsIDB4MDBEMywgMHgwMEY0LCAweDAwRDQsCisgICAgMHgwMEY1LCAweDAwRDUsIDB4MDBGNiwgMHgwMEQ2LCAweDAwRjcsIDB4MDJCOCwgMHgwMEY4LCAweDAwOTQsIDB4MDBGOSwKKyAgICAweDAwRDgsIDB4MDBGQSwgMHgwMEQ5LCAweDAwRkIsIDB4MDBEQSwgMHgwMEZDLCAweDAwREIsIDB4MDBGRCwgMHgwMERDLAorICAgIDB4MDBGRSwgMHgwMERELCAweDAwRkYsIDB4MDBERSwgMHgwMTAwLCAweDI0OTYsIDB4MDEwMSwgMHgyNDkxLCAweDAxMDIsCisgICAgMHgzRDhDLCAweDAxMDMsIDB4M0Q5OSwgMHgwMTA0LCAweDNENzksIDB4MDEwNSwgMHgzRDgxLCAweDAxMDYsIDB4M0Q4RSwKKyAgICAweDAxMDcsIDB4M0Q5QiwgMHgwMTA4LCAweDNEQTcsIDB4MDEwOSwgMHgzREFELCAweDAxMEMsIDB4M0Q4RiwgMHgwMTBELAorICAgIDB4M0Q5QywgMHgwMTBFLCAweDNEOTEsIDB4MDEwRiwgMHgzRDlFLCAweDAxMTEsIDB4M0Q5RiwgMHgwMTEyLCAweDI0OTksCisgICAgMHgwMTEzLCAweDI0OTQsIDB4MDExOCwgMHgzRDkwLCAweDAxMTksIDB4M0Q5RCwgMHgwMTFBLCAweDI0QjMsIDB4MDExQiwKKyAgICAweDI0QkYsIDB4MDExQywgMHgzREE4LCAweDAxMUQsIDB4M0RBRSwgMHgwMTI0LCAweDNEQTksIDB4MDEyNSwgMHgzREFGLAorICAgIDB4MDEyNywgMHgzREM4LCAweDAxMjgsIDB4MjRCOCwgMHgwMTI5LCAweDI0QzQsIDB4MDEyQSwgMHgyNDk3LCAweDAxMkIsCisgICAgMHgyNDkyLCAweDAxMzEsIDB4MDA5MiwgMHgwMTM0LCAweDNEQUEsIDB4MDEzNSwgMHgzREIwLCAweDAxMzksIDB4M0Q4RCwKKyAgICAweDAxM0EsIDB4M0Q5QSwgMHgwMTNELCAweDNEN0IsIDB4MDEzRSwgMHgzRDgzLCAweDAxNDEsIDB4MDA4RCwgMHgwMTQyLAorICAgIDB4MDA5MywgMHgwMTQzLCAweDNEOTIsIDB4MDE0NCwgMHgzREEwLCAweDAxNDcsIDB4M0Q5MywgMHgwMTQ4LCAweDNEQTEsCisgICAgMHgwMTRCLCAweDI0REMsIDB4MDE0QywgMHgyNDlBLCAweDAxNEQsIDB4MjQ5NSwgMHgwMTUwLCAweDNEOTQsIDB4MDE1MSwKKyAgICAweDNEQTIsIDB4MDE1MiwgMHgwMDhGLCAweDAxNTMsIDB4MDA5NSwgMHgwMTU0LCAweDNEOEIsIDB4MDE1NSwgMHgzRDk4LAorICAgIDB4MDE1OCwgMHgzRDk1LCAweDAxNTksIDB4M0RBMywgMHgwMTVBLCAweDNEN0MsIDB4MDE1QiwgMHgzRDg0LCAweDAxNUMsCisgICAgMHgzREFCLCAweDAxNUQsIDB4M0RCMSwgMHgwMTVFLCAweDNEN0QsIDB4MDE1RiwgMHgzRDg2LCAweDAxNjAsIDB4MDBERiwKKyAgICAweDAxNjEsIDB4MDBFMywgMHgwMTYyLCAweDNEOTcsIDB4MDE2MywgMHgzREE1LCAweDAxNjQsIDB4M0Q3RSwgMHgwMTY1LAorICAgIDB4M0Q4NywgMHgwMTY4LCAweDI0QkQsIDB4MDE2OSwgMHgyNEM5LCAweDAxNkEsIDB4MjQ5OCwgMHgwMTZCLCAweDI0OTMsCisgICAgMHgwMTZDLCAweDNEQUMsIDB4MDE2RCwgMHgzREIyLCAweDAxNkUsIDB4MjRCQywgMHgwMTZGLCAweDI0QzgsIDB4MDE3MCwKKyAgICAweDNEOTYsIDB4MDE3MSwgMHgzREE0LCAweDAxNzgsIDB4MDBFMCwgMHgwMTc5LCAweDNEN0YsIDB4MDE3QSwgMHgzRDg4LAorICAgIDB4MDE3QiwgMHgzRDgwLCAweDAxN0MsIDB4M0Q4QSwgMHgwMTdELCAweDAwRTEsIDB4MDE3RSwgMHgwMEU1LCAweDAxOTIsCisgICAgMHgwMDY5LCAweDAxOTMsIDB4M0REMiwgMHgwMUMyLCAweDNEQ0QsIDB4MDFDRCwgMHgyNEIyLCAweDAxQ0UsIDB4MjRCRSwKKyAgICAweDAxQ0YsIDB4MjRCNiwgMHgwMUQwLCAweDI0QzIsIDB4MDFEMSwgMHgyNEI5LCAweDAxRDIsIDB4MjRDNSwgMHgwMUQzLAorICAgIDB4MjRCQiwgMHgwMUQ0LCAweDI0QzcsIDB4MDFENiwgMHgzRDc1LCAweDAxRDgsIDB4M0Q3NiwgMHgwMURBLCAweDNENzcsCisgICAgMHgwMURDLCAweDNENzgsIDB4MDFGOCwgMHgzRDczLCAweDAxRjksIDB4M0Q3NCwgMHgwMUZELCAweDI0Q0QsIDB4MDI1MCwKKyAgICAweDNERDgsIDB4MDI1MSwgMHgyNENBLCAweDAyNTIsIDB4M0REQywgMHgwMjUzLCAweDNEQ0UsIDB4MDI1NCwgMHgyNENGLAorICAgIDB4MDI1NSwgMHgzREUxLCAweDAyNTYsIDB4M0RCQSwgMHgwMjU3LCAweDNEQ0YsIDB4MDI1OCwgMHgzREQ1LCAweDAyNTksCisgICAgMHgyNEQyLCAweDAyNUEsIDB4MjRENSwgMHgwMjVCLCAweDI0RDgsIDB4MDI1QywgMHgzREQ2LCAweDAyNUUsIDB4M0RENywKKyAgICAweDAyNUYsIDB4M0RDMSwgMHgwMjYwLCAweDNERDEsIDB4MDI2MSwgMHgzREM1LCAweDAyNjIsIDB4M0UwQiwgMHgwMjYzLAorICAgIDB4M0UwQywgMHgwMjY0LCAweDNEREIsIDB4MDI2NSwgMHgzRERFLCAweDAyNjYsIDB4M0RDQiwgMHgwMjY3LCAweDNERTQsCisgICAgMHgwMjY4LCAweDNERDMsIDB4MDI2QSwgMHgzRTBELCAweDAyNkMsIDB4M0RCNiwgMHgwMjZELCAweDNEQzAsIDB4MDI2RSwKKyAgICAweDNEQjcsIDB4MDI2RiwgMHgzREQ5LCAweDAyNzAsIDB4M0RDNiwgMHgwMjcxLCAweDNEQjMsIDB4MDI3MiwgMHgzREMyLAorICAgIDB4MDI3MywgMHgzREJCLCAweDAyNzQsIDB4M0UwRSwgMHgwMjc1LCAweDI0REQsIDB4MDI3NiwgMHgzRTBGLCAweDAyNzgsCisgICAgMHgzRTEwLCAweDAyNzksIDB4M0RCOCwgMHgwMjdBLCAweDNERTMsIDB4MDI3QiwgMHgzREJGLCAweDAyN0QsIDB4M0RCQywKKyAgICAweDAyN0UsIDB4M0RCNSwgMHgwMjgwLCAweDNFMTEsIDB4MDI4MSwgMHgzREM3LCAweDAyODIsIDB4M0RCRCwgMHgwMjgzLAorICAgIDB4MjRFMiwgMHgwMjg0LCAweDNERDAsIDB4MDI4OCwgMHgzREI5LCAweDAyODksIDB4M0RENCwgMHgwMjhBLCAweDNEREEsCisgICAgMHgwMjhCLCAweDNEQjQsIDB4MDI4QywgMHgyNERFLCAweDAyOEQsIDB4M0RERCwgMHgwMjhFLCAweDNEQzQsIDB4MDI4RiwKKyAgICAweDNFMTIsIDB4MDI5MCwgMHgzREJFLCAweDAyOTEsIDB4M0RFMiwgMHgwMjkyLCAweDI0RTEsIDB4MDI5NCwgMHgzRENBLAorICAgIDB4MDI5NSwgMHgzREM5LCAweDAyOTgsIDB4M0RDQywgMHgwMjk5LCAweDNFMTMsIDB4MDI5QywgMHgzRTE0LCAweDAyOUQsCisgICAgMHgzREMzLCAweDAyOUYsIDB4M0UxNSwgMHgwMkExLCAweDNERTAsIDB4MDJBMiwgMHgzRERGLCAweDAyQjAsIDB4M0UxNiwKKyAgICAweDAyQjIsIDB4M0UxNywgMHgwMkI3LCAweDNFMTgsIDB4MDJCQiwgMHgwMDYyLCAweDAyQkMsIDB4MDA2MCwgMHgwMkMxLAorICAgIDB4M0UxOSwgMHgwMkM2LCAweDAwODAsIDB4MDJDNywgMHgzRDg1LCAweDAyQzgsIDB4M0RFNiwgMHgwMkNDLCAweDNERTcsCisgICAgMHgwMkQwLCAweDI0RTMsIDB4MDJEMSwgMHgzREU4LCAweDAyRDgsIDB4M0Q3QSwgMHgwMkQ5LCAweDNEQTYsIDB4MDJEQSwKKyAgICAweDAwODUsIDB4MDJEQiwgMHgzRDgyLCAweDAyREMsIDB4MDA1RiwgMHgwMkRELCAweDNEODksIDB4MDJERSwgMHgzREZCLAorICAgIDB4MDJFMCwgMHgzRTFBLCAweDAyRTEsIDB4M0UxQiwgMHgwMkU1LCAweDNERUIsIDB4MDJFNiwgMHgzREVDLCAweDAyRTcsCisgICAgMHgzREVELCAweDAyRTgsIDB4M0RFRSwgMHgwMkU5LCAweDNERUYsIDB4MDMwMCwgMHgwMDQxLCAweDAzMDEsIDB4MDA3RiwKKyAgICAweDAzMDIsIDB4MDA4MCwgMHgwMzAzLCAweDAwNUYsIDB4MDMwNCwgMHgwMDgxLCAweDAzMDUsIDB4MDBFMiwgMHgwMzA2LAorICAgIDB4MDA4MiwgMHgwMzA3LCAweDAwODMsIDB4MDMwOCwgMHgwMDg0LCAweDAzMEEsIDB4MDA4NSwgMHgwMzBCLCAweDAwODcsCisgICAgMHgwMzBDLCAweDAwODksIDB4MDMwRiwgMHgzREVBLCAweDAzMTgsIDB4M0UwMiwgMHgwMzE5LCAweDNFMDMsIDB4MDMxQSwKKyAgICAweDNFMDcsIDB4MDMxQywgMHgzREY1LCAweDAzMUQsIDB4M0UwMCwgMHgwMzFFLCAweDNFMDEsIDB4MDMxRiwgMHgzREY2LAorICAgIDB4MDMyMCwgMHgzREY3LCAweDAzMjQsIDB4M0RGQywgMHgwMzI1LCAweDNERjIsIDB4MDMyNywgMHgwMDg2LCAweDAzMjgsCisgICAgMHgwMDg4LCAweDAzMjksIDB4M0RGOSwgMHgwMzJBLCAweDNFMDQsIDB4MDMyQywgMHgzREYzLCAweDAzMkYsIDB4M0RGQSwKKyAgICAweDAzMzAsIDB4M0RGRCwgMHgwMzMyLCAweDAwNDAsIDB4MDMzNCwgMHgzREZGLCAweDAzMzYsIDB4MDA4QSwgMHgwMzM5LAorICAgIDB4M0RGNCwgMHgwMzNBLCAweDNFMDUsIDB4MDMzQiwgMHgzRTA2LCAweDAzM0MsIDB4M0RGRSwgMHgwMzNELCAweDNERjgsCisgICAgMHgwMzYxLCAweDNERTUsIDB4MDM5MSwgMHgwM0YzLCAweDAzOTIsIDB4MDNGNCwgMHgwMzkzLCAweDAzRjUsIDB4MDM5NCwKKyAgICAweDAzRjYsIDB4MDM5NSwgMHgwM0Y3LCAweDAzOTYsIDB4MDNGOCwgMHgwMzk3LCAweDAzRjksIDB4MDM5OCwgMHgwM0ZBLAorICAgIDB4MDM5OSwgMHgwM0ZCLCAweDAzOUEsIDB4MDNGQywgMHgwMzlCLCAweDAzRkQsIDB4MDM5QywgMHgwM0ZFLCAweDAzOUQsCisgICAgMHgwM0ZGLCAweDAzOUUsIDB4MDQwMCwgMHgwMzlGLCAweDA0MDEsIDB4MDNBMCwgMHgwNDAyLCAweDAzQTEsIDB4MDQwMywKKyAgICAweDAzQTMsIDB4MDQwNCwgMHgwM0E0LCAweDA0MDUsIDB4MDNBNSwgMHgwNDA2LCAweDAzQTYsIDB4MDQwNywgMHgwM0E3LAorICAgIDB4MDQwOCwgMHgwM0E4LCAweDA0MDksIDB4MDNBOSwgMHgwNDBBLCAweDAzQjEsIDB4MDQwQiwgMHgwM0IyLCAweDA0MEMsCisgICAgMHgwM0IzLCAweDA0MEQsIDB4MDNCNCwgMHgwNDBFLCAweDAzQjUsIDB4MDQwRiwgMHgwM0I2LCAweDA0MTAsIDB4MDNCNywKKyAgICAweDA0MTEsIDB4MDNCOCwgMHgwNDEyLCAweDAzQjksIDB4MDQxMywgMHgwM0JBLCAweDA0MTQsIDB4MDNCQiwgMHgwNDE1LAorICAgIDB4MDNCQywgMHgwNDE2LCAweDAzQkQsIDB4MDQxNywgMHgwM0JFLCAweDA0MTgsIDB4MDNCRiwgMHgwNDE5LCAweDAzQzAsCisgICAgMHgwNDFBLCAweDAzQzEsIDB4MDQxQiwgMHgwM0MyLCAweDNGNUUsIDB4MDNDMywgMHgwNDFDLCAweDAzQzQsIDB4MDQxRCwKKyAgICAweDAzQzUsIDB4MDQxRSwgMHgwM0M2LCAweDA0MUYsIDB4MDNDNywgMHgwNDIwLCAweDAzQzgsIDB4MDQyMSwgMHgwM0M5LAorICAgIDB4MDQyMiwgMHgwM0QwLCAweDJGM0EsIDB4MDNEMSwgMHgyRjQwLCAweDAzRDUsIDB4MkYzRSwgMHgwM0RCLCAweDJGM0YsCisgICAgMHgwNDAxLCAweDA0MjksIDB4MDQxMCwgMHgwNDIzLCAweDA0MTEsIDB4MDQyNCwgMHgwNDEyLCAweDA0MjUsIDB4MDQxMywKKyAgICAweDA0MjYsIDB4MDQxNCwgMHgwNDI3LCAweDA0MTUsIDB4MDQyOCwgMHgwNDE2LCAweDA0MkEsIDB4MDQxNywgMHgwNDJCLAorICAgIDB4MDQxOCwgMHgwNDJDLCAweDA0MTksIDB4MDQyRCwgMHgwNDFBLCAweDA0MkUsIDB4MDQxQiwgMHgwNDJGLCAweDA0MUMsCisgICAgMHgwNDMwLCAweDA0MUQsIDB4MDQzMSwgMHgwNDFFLCAweDA0MzIsIDB4MDQxRiwgMHgwNDMzLCAweDA0MjAsIDB4MDQzNCwKKyAgICAweDA0MjEsIDB4MDQzNSwgMHgwNDIyLCAweDA0MzYsIDB4MDQyMywgMHgwNDM3LCAweDA0MjQsIDB4MDQzOCwgMHgwNDI1LAorICAgIDB4MDQzOSwgMHgwNDI2LCAweDA0M0EsIDB4MDQyNywgMHgwNDNCLCAweDA0MjgsIDB4MDQzQywgMHgwNDI5LCAweDA0M0QsCisgICAgMHgwNDJBLCAweDA0M0UsIDB4MDQyQiwgMHgwNDNGLCAweDA0MkMsIDB4MDQ0MCwgMHgwNDJELCAweDA0NDEsIDB4MDQyRSwKKyAgICAweDA0NDIsIDB4MDQyRiwgMHgwNDQzLCAweDA0MzAsIDB4MDQ0NCwgMHgwNDMxLCAweDA0NDUsIDB4MDQzMiwgMHgwNDQ2LAorICAgIDB4MDQzMywgMHgwNDQ3LCAweDA0MzQsIDB4MDQ0OCwgMHgwNDM1LCAweDA0NDksIDB4MDQzNiwgMHgwNDRCLCAweDA0MzcsCisgICAgMHgwNDRDLCAweDA0MzgsIDB4MDQ0RCwgMHgwNDM5LCAweDA0NEUsIDB4MDQzQSwgMHgwNDRGLCAweDA0M0IsIDB4MDQ1MCwKKyAgICAweDA0M0MsIDB4MDQ1MSwgMHgwNDNELCAweDA0NTIsIDB4MDQzRSwgMHgwNDUzLCAweDA0M0YsIDB4MDQ1NCwgMHgwNDQwLAorICAgIDB4MDQ1NSwgMHgwNDQxLCAweDA0NTYsIDB4MDQ0MiwgMHgwNDU3LCAweDA0NDMsIDB4MDQ1OCwgMHgwNDQ0LCAweDA0NTksCisgICAgMHgwNDQ1LCAweDA0NUEsIDB4MDQ0NiwgMHgwNDVCLCAweDA0NDcsIDB4MDQ1QywgMHgwNDQ4LCAweDA0NUQsIDB4MDQ0OSwKKyAgICAweDA0NUUsIDB4MDQ0QSwgMHgwNDVGLCAweDA0NEIsIDB4MDQ2MCwgMHgwNDRDLCAweDA0NjEsIDB4MDQ0RCwgMHgwNDYyLAorICAgIDB4MDQ0RSwgMHgwNDYzLCAweDA0NEYsIDB4MDQ2NCwgMHgwNDUxLCAweDA0NEEsIDB4MUUzRSwgMHgzRDcxLCAweDFFM0YsCisgICAgMHgzRDcyLCAweDFFQkMsIDB4MjRCNSwgMHgxRUJELCAweDI0QzEsIDB4MUY3MCwgMHgyNENDLCAweDFGNzEsIDB4MjRDQiwKKyAgICAweDFGNzIsIDB4MjREQSwgMHgxRjczLCAweDI0RDksIDB4MjAwMiwgMHgwMEU3LCAweDIwMDMsIDB4MDI3OSwgMHgyMDEwLAorICAgIDB4MDI5NiwgMHgyMDExLCAweDAwMEUsIDB4MjAxMiwgMHgwMDcyLCAweDIwMTMsIDB4MDA3MiwgMHgyMDE0LCAweDAwOEEsCisgICAgMHgyMDE1LCAweDAyOTUsIDB4MjAxNiwgMHgwMjlBLCAweDIwMTgsIDB4MDA2MiwgMHgyMDE5LCAweDAwNjAsIDB4MjAxQSwKKyAgICAweDAwNzgsIDB4MjAxQywgMHgwMDZDLCAweDIwMUQsIDB4MDA3QSwgMHgyMDFFLCAweDAwNzksIDB4MjAyMCwgMHgwMzA4LAorICAgIDB4MjAyMSwgMHgwMzA5LCAweDIwMjIsIDB4MDA3NywgMHgyMDI1LCAweDAyOUQsIDB4MjAyNiwgMHgwMjlDLCAweDIwMzAsCisgICAgMHgwMzA0LCAweDIwMzIsIDB4MDJDNCwgMHgyMDMzLCAweDAyQzUsIDB4MjAzOSwgMHgwMDZFLCAweDIwM0EsIDB4MDA2RiwKKyAgICAweDIwM0IsIDB4MDJERSwgMHgyMDNDLCAweDJGNEYsIDB4MjAzRSwgMHgwMEUyLCAweDIwM0YsIDB4M0RFOSwgMHgyMDQyLAorICAgIDB4M0Y5QSwgMHgyMDQ0LCAweDAwNjgsIDB4MjA0NywgMHgzRjk2LCAweDIwNDgsIDB4M0Y5NywgMHgyMDQ5LCAweDJGNTAsCisgICAgMHgyMDUxLCAweDNGOTksIDB4MjA3MCwgMHgyNEExLCAweDIwNzQsIDB4MjRBMiwgMHgyMDc1LCAweDI0QTMsIDB4MjA3NiwKKyAgICAweDI0QTQsIDB4MjA3NywgMHgyNEE1LCAweDIwNzgsIDB4MjRBNiwgMHgyMDc5LCAweDI0QTcsIDB4MjA4MCwgMHgyNEE4LAorICAgIDB4MjA4MSwgMHgyNEE5LCAweDIwODIsIDB4MjRBQSwgMHgyMDgzLCAweDI0QUIsIDB4MjA4NCwgMHgyNEFDLCAweDIwODUsCisgICAgMHgyNEFELCAweDIwODYsIDB4MjRBRSwgMHgyMDg3LCAweDI0QUYsIDB4MjA4OCwgMHgyNEIwLCAweDIwODksIDB4MjRCMSwKKyAgICAweDIwQUMsIDB4MjQ4QSwgMHgyMERELCAweDNGQzgsIDB4MjBERSwgMHgyQjFCLCAweDIxMDAsIDB4MkU0RiwgMHgyMTAzLAorICAgIDB4MDJDNiwgMHgyMTA1LCAweDJFNTMsIDB4MjEwOSwgMHgyMDcxLCAweDIxMEEsIDB4MjA3MCwgMHgyMTBGLCAweDJGM0MsCisgICAgMHgyMTEzLCAweDFGNTksIDB4MjExNiwgMHgxREJBLCAweDIxMjEsIDB4MUY3NywgMHgyMTIyLCAweDAwRTQsIDB4MjEyNiwKKyAgICAweDI0OEIsIDB4MjEyNywgMHgzQzlCLCAweDIxMkIsIDB4MDMwMywgMHgyMTM1LCAweDJGMzksIDB4MjEzQiwgMHgyMDczLAorICAgIDB4MjE1MywgMHgyNDlGLCAweDIxNTQsIDB4MjRBMCwgMHgyMTU1LCAweDNENkYsIDB4MjE1NiwgMHgyNjM5LCAweDIxNTcsCisgICAgMHgyNjNBLCAweDIxNTgsIDB4MjYzQiwgMHgyMTU5LCAweDI2M0MsIDB4MjE1QSwgMHgyNjNELCAweDIxNUIsIDB4MjQ5QiwKKyAgICAweDIxNUMsIDB4MjQ5QywgMHgyMTVELCAweDI0OUQsIDB4MjE1RSwgMHgyNDlFLCAweDIxNjAsIDB4MUQ5NywgMHgyMTYxLAorICAgIDB4MUQ5OCwgMHgyMTYyLCAweDFEOTksIDB4MjE2MywgMHgxRDlBLCAweDIxNjQsIDB4MUQ5QiwgMHgyMTY1LCAweDFEOUMsCisgICAgMHgyMTY2LCAweDFEOUQsIDB4MjE2NywgMHgxRDlFLCAweDIxNjgsIDB4MUQ5RiwgMHgyMTY5LCAweDFEQTAsIDB4MjE2QSwKKyAgICAweDIwMjEsIDB4MjE2QiwgMHgyMDIyLCAweDIxNzAsIDB4MUY5QywgMHgyMTcxLCAweDFGOUQsIDB4MjE3MiwgMHgxRjlFLAorICAgIDB4MjE3MywgMHgxRjlGLCAweDIxNzQsIDB4MUZBMCwgMHgyMTc1LCAweDFGQTEsIDB4MjE3NiwgMHgxRkEyLCAweDIxNzcsCisgICAgMHgxRkEzLCAweDIxNzgsIDB4MUZBNCwgMHgyMTc5LCAweDFGQTUsIDB4MjE3QSwgMHgyMDZBLCAweDIxN0IsIDB4MjA2QiwKKyAgICAweDIxN0YsIDB4MjA2RiwgMHgyMTkwLCAweDAyRTEsIDB4MjE5MSwgMHgwMkUyLCAweDIxOTIsIDB4MDJFMCwgMHgyMTkzLAorICAgIDB4MDJFMywgMHgyMTk0LCAweDJGQTksIDB4MjE5NiwgMHgyRkFDLCAweDIxOTcsIDB4MkZBRCwgMHgyMTk4LCAweDJGQUEsCisgICAgMHgyMTk5LCAweDJGQUIsIDB4MjFDNCwgMHgyMDc2LCAweDIxQzUsIDB4MjA3NywgMHgyMUM2LCAweDIwNzUsIDB4MjFDQiwKKyAgICAweDJGQUYsIDB4MjFDQywgMHgyRkFFLCAweDIxRDAsIDB4MkZBOCwgMHgyMUQyLCAweDAyRjAsIDB4MjFENCwgMHgwMkYxLAorICAgIDB4MjFFNiwgMHgxRjRELCAweDIxRTcsIDB4MUY0QywgMHgyMUU4LCAweDFGNEUsIDB4MjFFOSwgMHgxRjRCLCAweDIyMDAsCisgICAgMHgwMkYyLCAweDIyMDIsIDB4MDJGNywgMHgyMjAzLCAweDAyRjMsIDB4MjIwNSwgMHgyRjk4LCAweDIyMDcsIDB4MDJGOCwKKyAgICAweDIyMDgsIDB4MDJFNSwgMHgyMjA5LCAweDNDNzQsIDB4MjIwQSwgMHgyRjNCLCAweDIyMEIsIDB4MDJFNiwgMHgyMjExLAorICAgIDB4MURDOSwgMHgyMjEyLCAweDAyQjUsIDB4MjIxMywgMHgyRjU2LCAweDIyMTksIDB4MDA3NSwgMHgyMjFBLCAweDAyRkQsCisgICAgMHgyMjFELCAweDAyRkYsIDB4MjIxRSwgMHgwMkJGLCAweDIyMUYsIDB4MURDRCwgMHgyMjIwLCAweDAyRjQsIDB4MjIyNSwKKyAgICAweDNDODEsIDB4MjIyNiwgMHgzQzgyLCAweDIyMjcsIDB4MDJFRCwgMHgyMjI4LCAweDAyRUUsIDB4MjIyOSwgMHgwMkVDLAorICAgIDB4MjIyQSwgMHgwMkVCLCAweDIyMkIsIDB4MDMwMSwgMHgyMjJDLCAweDAzMDIsIDB4MjIyRCwgMHgyMDAzLCAweDIyMkUsCisgICAgMHgxREM4LCAweDIyMzQsIDB4MDJDMCwgMHgyMjM1LCAweDAzMDAsIDB4MjIzQywgMHgwMDY0LCAweDIyM0QsIDB4MDJGRSwKKyAgICAweDIyNDMsIDB4MkY1OCwgMHgyMjQ1LCAweDNDOTMsIDB4MjI0OCwgMHgzQzk0LCAweDIyNTIsIDB4MDJGQSwgMHgyMjYwLAorICAgIDB4MDJCQSwgMHgyMjYxLCAweDAyRjksIDB4MjI2MiwgMHgzQzkxLCAweDIyNjYsIDB4MDJCRCwgMHgyMjY3LCAweDAyQkUsCisgICAgMHgyMjZBLCAweDAyRkIsIDB4MjI2QiwgMHgwMkZDLCAweDIyNzIsIDB4MkY1OSwgMHgyMjczLCAweDJGNUEsIDB4MjI3NiwKKyAgICAweDNDOTUsIDB4MjI3NywgMHgzQzk2LCAweDIyODIsIDB4MDJFOSwgMHgyMjgzLCAweDAyRUEsIDB4MjI4NCwgMHgzQzcwLAorICAgIDB4MjI4NSwgMHgzQzcxLCAweDIyODYsIDB4MDJFNywgMHgyMjg3LCAweDAyRTgsIDB4MjI4QSwgMHgzQzcyLCAweDIyOEIsCisgICAgMHgzQzczLCAweDIyOTUsIDB4MkY5QywgMHgyMjk2LCAweDJGOUEsIDB4MjI5NywgMHgyRjlELCAweDIyOTgsIDB4MkY5QiwKKyAgICAweDIyOUUsIDB4M0UyMiwgMHgyMkEwLCAweDJGOTksIDB4MjJBNSwgMHgwMkY1LCAweDIyQkYsIDB4MURDRSwgMHgyMkRBLAorICAgIDB4M0Q2RCwgMHgyMkRCLCAweDNENkUsIDB4MjMwNSwgMHgzQzc2LCAweDIzMDYsIDB4M0M3NywgMHgyMzA3LCAweDJGQkIsCisgICAgMHgyMzEyLCAweDAyRjYsIDB4MjMxOCwgMHgzRDcwLCAweDIzOUIsIDB4MkY2RiwgMHgyMzlDLCAweDJGODcsIDB4MjM5RCwKKyAgICAweDJGNzAsIDB4MjM5RSwgMHgyRjcxLCAweDIzOUYsIDB4MkY4NywgMHgyM0EwLCAweDJGNzIsIDB4MjNBMSwgMHgyRjc3LAorICAgIDB4MjNBMiwgMHgyRjg3LCAweDIzQTMsIDB4MkY3OCwgMHgyM0E0LCAweDJGNzksIDB4MjNBNSwgMHgyRjg3LCAweDIzQTYsCisgICAgMHgyRjdBLCAweDIzQTcsIDB4MUZGMiwgMHgyM0E4LCAweDFGRjMsIDB4MjNBOSwgMHgxRkY0LCAweDIzQUEsIDB4MkY4NywKKyAgICAweDIzQUIsIDB4MUZFRSwgMHgyM0FDLCAweDFGRUYsIDB4MjNBRCwgMHgxRkYwLCAweDIzQjAsIDB4M0ZCOCwgMHgyM0IxLAorICAgIDB4M0ZCOSwgMHgyM0JFLCAweDNGN0QsIDB4MjNCRiwgMHgzRjdFLCAweDIzQzAsIDB4M0Y3RiwgMHgyM0MxLCAweDNGODAsCisgICAgMHgyM0MyLCAweDNGODEsIDB4MjNDMywgMHgzRjgyLCAweDIzQzQsIDB4M0Y4MywgMHgyM0M1LCAweDNGODQsIDB4MjNDNiwKKyAgICAweDNGODUsIDB4MjNDNywgMHgzRjg2LCAweDIzQzgsIDB4M0Y4NywgMHgyM0M5LCAweDNGODgsIDB4MjNDQSwgMHgzRjg5LAorICAgIDB4MjNDQiwgMHgzRjhBLCAweDIzQ0MsIDB4M0Y4QiwgMHgyM0NFLCAweDNGOTEsIDB4MjQyMywgMHgzRjkwLCAweDI0NjAsCisgICAgMHgxRDgzLCAweDI0NjEsIDB4MUQ4NCwgMHgyNDYyLCAweDFEODUsIDB4MjQ2MywgMHgxRDg2LCAweDI0NjQsIDB4MUQ4NywKKyAgICAweDI0NjUsIDB4MUQ4OCwgMHgyNDY2LCAweDFEODksIDB4MjQ2NywgMHgxRDhBLCAweDI0NjgsIDB4MUQ4QiwgMHgyNDY5LAorICAgIDB4MUQ4QywgMHgyNDZBLCAweDFEOEQsIDB4MjQ2QiwgMHgxRDhFLCAweDI0NkMsIDB4MUQ4RiwgMHgyNDZELCAweDFEOTAsCisgICAgMHgyNDZFLCAweDFEOTEsIDB4MjQ2RiwgMHgxRDkyLCAweDI0NzAsIDB4MUQ5MywgMHgyNDcxLCAweDFEOTQsIDB4MjQ3MiwKKyAgICAweDFEOTUsIDB4MjQ3MywgMHgxRDk2LCAweDI0NzQsIDB4MUY4NywgMHgyNDc1LCAweDFGODgsIDB4MjQ3NiwgMHgxRjg5LAorICAgIDB4MjQ3NywgMHgxRjhBLCAweDI0NzgsIDB4MUY4QiwgMHgyNDc5LCAweDFGOEMsIDB4MjQ3QSwgMHgxRjhELCAweDI0N0IsCisgICAgMHgxRjhFLCAweDI0N0MsIDB4MUY4RiwgMHgyNDdELCAweDFGOTAsIDB4MjQ3RSwgMHgxRjkxLCAweDI0N0YsIDB4MUY5MiwKKyAgICAweDI0ODAsIDB4MUY5MywgMHgyNDgxLCAweDFGOTQsIDB4MjQ4MiwgMHgxRjk1LCAweDI0ODMsIDB4MUY5NiwgMHgyNDg0LAorICAgIDB4MUY5NywgMHgyNDg1LCAweDFGOTgsIDB4MjQ4NiwgMHgxRjk5LCAweDI0ODcsIDB4MUY5QSwgMHgyNDg4LCAweDFGN0UsCisgICAgMHgyNDg5LCAweDFGN0YsIDB4MjQ4QSwgMHgxRjgwLCAweDI0OEIsIDB4MUY4MSwgMHgyNDhDLCAweDFGODIsIDB4MjQ4RCwKKyAgICAweDFGODMsIDB4MjQ4RSwgMHgxRjg0LCAweDI0OEYsIDB4MUY4NSwgMHgyNDkwLCAweDFGODYsIDB4MjQ5QywgMHgxRkIwLAorICAgIDB4MjQ5RCwgMHgxRkIxLCAweDI0OUUsIDB4MUZCMiwgMHgyNDlGLCAweDFGQjMsIDB4MjRBMCwgMHgxRkI0LCAweDI0QTEsCisgICAgMHgxRkI1LCAweDI0QTIsIDB4MUZCNiwgMHgyNEEzLCAweDFGQjcsIDB4MjRBNCwgMHgxRkI4LCAweDI0QTUsIDB4MUZCOSwKKyAgICAweDI0QTYsIDB4MUZCQSwgMHgyNEE3LCAweDFGQkIsIDB4MjRBOCwgMHgxRkJDLCAweDI0QTksIDB4MUZCRCwgMHgyNEFBLAorICAgIDB4MUZCRSwgMHgyNEFCLCAweDFGQkYsIDB4MjRBQywgMHgxRkMwLCAweDI0QUQsIDB4MUZDMSwgMHgyNEFFLCAweDFGQzIsCisgICAgMHgyNEFGLCAweDFGQzMsIDB4MjRCMCwgMHgxRkM0LCAweDI0QjEsIDB4MUZDNSwgMHgyNEIyLCAweDFGQzYsIDB4MjRCMywKKyAgICAweDFGQzcsIDB4MjRCNCwgMHgxRkM4LCAweDI0QjUsIDB4MUZDOSwgMHgyNEI2LCAweDI4NjMsIDB4MjRCNywgMHgyODY0LAorICAgIDB4MjRCOCwgMHgyODY1LCAweDI0QjksIDB4Mjg2NiwgMHgyNEJBLCAweDI4NjcsIDB4MjRCQiwgMHgyODY4LCAweDI0QkMsCisgICAgMHgyODY5LCAweDI0QkQsIDB4Mjg2QSwgMHgyNEJFLCAweDI4NkIsIDB4MjRCRiwgMHgyODZDLCAweDI0QzAsIDB4Mjg2RCwKKyAgICAweDI0QzEsIDB4Mjg2RSwgMHgyNEMyLCAweDI4NkYsIDB4MjRDMywgMHgyODcwLCAweDI0QzQsIDB4Mjg3MSwgMHgyNEM1LAorICAgIDB4Mjg3MiwgMHgyNEM2LCAweDI4NzMsIDB4MjRDNywgMHgyODc0LCAweDI0QzgsIDB4Mjg3NSwgMHgyNEM5LCAweDI4NzYsCisgICAgMHgyNENBLCAweDI4NzcsIDB4MjRDQiwgMHgyODc4LCAweDI0Q0MsIDB4Mjg3OSwgMHgyNENELCAweDI4N0EsIDB4MjRDRSwKKyAgICAweDI4N0IsIDB4MjRDRiwgMHgyODdDLCAweDI0RDAsIDB4Mjg0OSwgMHgyNEQxLCAweDI4NEEsIDB4MjREMiwgMHgyODRCLAorICAgIDB4MjREMywgMHgyODRDLCAweDI0RDQsIDB4Mjg0RCwgMHgyNEQ1LCAweDI4NEUsIDB4MjRENiwgMHgyODRGLCAweDI0RDcsCisgICAgMHgyODUwLCAweDI0RDgsIDB4Mjg1MSwgMHgyNEQ5LCAweDI4NTIsIDB4MjREQSwgMHgyODUzLCAweDI0REIsIDB4Mjg1NCwKKyAgICAweDI0REMsIDB4Mjg1NSwgMHgyNERELCAweDI4NTYsIDB4MjRERSwgMHgyODU3LCAweDI0REYsIDB4Mjg1OCwgMHgyNEUwLAorICAgIDB4Mjg1OSwgMHgyNEUxLCAweDI4NUEsIDB4MjRFMiwgMHgyODVCLCAweDI0RTMsIDB4Mjg1QywgMHgyNEU0LCAweDI4NUQsCisgICAgMHgyNEU1LCAweDI4NUUsIDB4MjRFNiwgMHgyODVGLCAweDI0RTcsIDB4Mjg2MCwgMHgyNEU4LCAweDI4NjEsIDB4MjRFOSwKKyAgICAweDI4NjIsIDB4MjRFQSwgMHgyMDIwLCAweDI0RUIsIDB4MjkxMywgMHgyNEVDLCAweDI5MTQsIDB4MjRFRCwgMHgyOTE1LAorICAgIDB4MjRFRSwgMHgyOTE2LCAweDI0RUYsIDB4MjkxNywgMHgyNEYwLCAweDI5MTgsIDB4MjRGMSwgMHgyOTE5LCAweDI0RjIsCisgICAgMHgyOTFBLCAweDI0RjMsIDB4MjkxQiwgMHgyNEY0LCAweDI5MUMsIDB4MjRGNSwgMHgzRjVGLCAweDI0RjYsIDB4M0Y2MCwKKyAgICAweDI0RjcsIDB4M0Y2MSwgMHgyNEY4LCAweDNGNjIsIDB4MjRGOSwgMHgzRjYzLCAweDI0RkEsIDB4M0Y2NCwgMHgyNEZCLAorICAgIDB4M0Y2NSwgMHgyNEZDLCAweDNGNjYsIDB4MjRGRCwgMHgzRjY3LCAweDI0RkUsIDB4M0Y2OCwgMHgyNEZGLCAweDI5MDcsCisgICAgMHgyNTAwLCAweDFEMzcsIDB4MjUwMSwgMHgxRDM4LCAweDI1MDIsIDB4MUQzOSwgMHgyNTAzLCAweDFEM0EsIDB4MjUwNCwKKyAgICAweDFEM0IsIDB4MjUwNSwgMHgxRDNDLCAweDI1MDYsIDB4MUQzRCwgMHgyNTA3LCAweDFEM0UsIDB4MjUwOCwgMHgxRDNGLAorICAgIDB4MjUwOSwgMHgxRDQwLCAweDI1MEEsIDB4MUQ0MSwgMHgyNTBCLCAweDFENDIsIDB4MjUwQywgMHgxRDQzLCAweDI1MEQsCisgICAgMHgxRDQ0LCAweDI1MEUsIDB4MUQ0NSwgMHgyNTBGLCAweDFENDYsIDB4MjUxMCwgMHgxRDQ3LCAweDI1MTEsIDB4MUQ0OCwKKyAgICAweDI1MTIsIDB4MUQ0OSwgMHgyNTEzLCAweDFENEEsIDB4MjUxNCwgMHgxRDRCLCAweDI1MTUsIDB4MUQ0QywgMHgyNTE2LAorICAgIDB4MUQ0RCwgMHgyNTE3LCAweDFENEUsIDB4MjUxOCwgMHgxRDRGLCAweDI1MTksIDB4MUQ1MCwgMHgyNTFBLCAweDFENTEsCisgICAgMHgyNTFCLCAweDFENTIsIDB4MjUxQywgMHgxRDUzLCAweDI1MUQsIDB4MUQ1NCwgMHgyNTFFLCAweDFENTUsIDB4MjUxRiwKKyAgICAweDFENTYsIDB4MjUyMCwgMHgxRDU3LCAweDI1MjEsIDB4MUQ1OCwgMHgyNTIyLCAweDFENTksIDB4MjUyMywgMHgxRDVBLAorICAgIDB4MjUyNCwgMHgxRDVCLCAweDI1MjUsIDB4MUQ1QywgMHgyNTI2LCAweDFENUQsIDB4MjUyNywgMHgxRDVFLCAweDI1MjgsCisgICAgMHgxRDVGLCAweDI1MjksIDB4MUQ2MCwgMHgyNTJBLCAweDFENjEsIDB4MjUyQiwgMHgxRDYyLCAweDI1MkMsIDB4MUQ2MywKKyAgICAweDI1MkQsIDB4MUQ2NCwgMHgyNTJFLCAweDFENjUsIDB4MjUyRiwgMHgxRDY2LCAweDI1MzAsIDB4MUQ2NywgMHgyNTMxLAorICAgIDB4MUQ2OCwgMHgyNTMyLCAweDFENjksIDB4MjUzMywgMHgxRDZBLCAweDI1MzQsIDB4MUQ2QiwgMHgyNTM1LCAweDFENkMsCisgICAgMHgyNTM2LCAweDFENkQsIDB4MjUzNywgMHgxRDZFLCAweDI1MzgsIDB4MUQ2RiwgMHgyNTM5LCAweDFENzAsIDB4MjUzQSwKKyAgICAweDFENzEsIDB4MjUzQiwgMHgxRDcyLCAweDI1M0MsIDB4MUQ3MywgMHgyNTNELCAweDFENzQsIDB4MjUzRSwgMHgxRDc1LAorICAgIDB4MjUzRiwgMHgxRDc2LCAweDI1NDAsIDB4MUQ3NywgMHgyNTQxLCAweDFENzgsIDB4MjU0MiwgMHgxRDc5LCAweDI1NDMsCisgICAgMHgxRDdBLCAweDI1NDQsIDB4MUQ3QiwgMHgyNTQ1LCAweDFEN0MsIDB4MjU0NiwgMHgxRDdELCAweDI1NDcsIDB4MUQ3RSwKKyAgICAweDI1NDgsIDB4MUQ3RiwgMHgyNTQ5LCAweDFEODAsIDB4MjU0QSwgMHgxRDgxLCAweDI1NEIsIDB4MUQ4MiwgMHgyNTUwLAorICAgIDB4MjAzQiwgMHgyNTVFLCAweDIwM0MsIDB4MjU2MSwgMHgyMDNFLCAweDI1NkEsIDB4MjAzRCwgMHgyNTZELCAweDIwMzcsCisgICAgMHgyNTZFLCAweDIwMzgsIDB4MjU2RiwgMHgyMDNBLCAweDI1NzAsIDB4MjAzOSwgMHgyNTcxLCAweDIwNDUsIDB4MjU3MiwKKyAgICAweDIwNDYsIDB4MjU3MywgMHgyMDQ3LCAweDI1ODEsIDB4MjAyNiwgMHgyNTgyLCAweDIwMjcsIDB4MjU4MywgMHgyMDI4LAorICAgIDB4MjU4NCwgMHgyMDI5LCAweDI1ODUsIDB4MjAyQSwgMHgyNTg2LCAweDIwMkIsIDB4MjU4NywgMHgyMDJDLCAweDI1ODgsCisgICAgMHgyMDJELCAweDI1ODksIDB4MjAzNCwgMHgyNThBLCAweDIwMzMsIDB4MjU4QiwgMHgyMDMyLCAweDI1OEMsIDB4MjAzMSwKKyAgICAweDI1OEQsIDB4MjAzMCwgMHgyNThFLCAweDIwMkYsIDB4MjU4RiwgMHgyMDJFLCAweDI1OTQsIDB4MjAzNSwgMHgyNTk1LAorICAgIDB4MjAzNiwgMHgyNUEwLCAweDAyRDksIDB4MjVBMSwgMHgwMkQ4LCAweDI1QTIsIDB4MUY0RiwgMHgyNUFBLCAweDJGQ0YsCisgICAgMHgyNUFCLCAweDJGQ0QsIDB4MjVCMSwgMHgzRjZCLCAweDI1QjIsIDB4MDJEQiwgMHgyNUIzLCAweDAyREEsIDB4MjVCNiwKKyAgICAweDJGQTMsIDB4MjVCNywgMHgxRjRBLCAweDI1QkMsIDB4MDJERCwgMHgyNUJELCAweDAyREMsIDB4MjVDMCwgMHgyRkEyLAorICAgIDB4MjVDMSwgMHgxRjQ5LCAweDI1QzYsIDB4MDJENywgMHgyNUM3LCAweDAyRDYsIDB4MjVDOSwgMHgyMDEyLCAweDI1Q0IsCisgICAgMHgwMkQzLCAweDI1Q0MsIDB4MjkwNiwgMHgyNUNFLCAweDAyRDUsIDB4MjVDRiwgMHgwMkQ0LCAweDI1RDAsIDB4M0Y5MiwKKyAgICAweDI1RDEsIDB4M0Y5MywgMHgyNUQyLCAweDNGOTQsIDB4MjVEMywgMHgzRjk1LCAweDI1RTIsIDB4MjAzRiwgMHgyNUUzLAorICAgIDB4MjA0MCwgMHgyNUU0LCAweDIwNDIsIDB4MjVFNSwgMHgyMDQxLCAweDI1RTYsIDB4MkZERSwgMHgyNUVGLCAweDAzMEIsCisgICAgMHgyNjAwLCAweDIwMTcsIDB4MjYwMSwgMHgyMDE4LCAweDI2MDIsIDB4MjAxOSwgMHgyNjAzLCAweDIwMUEsIDB4MjYwNSwKKyAgICAweDAyRDIsIDB4MjYwNiwgMHgwMkQxLCAweDI2MEUsIDB4MUY3OCwgMHgyNjE2LCAweDNGNjksIDB4MjYxNywgMHgzRjZBLAorICAgIDB4MjYxQywgMHgyMDFDLCAweDI2MUQsIDB4MjAxRCwgMHgyNjFFLCAweDIwMUIsIDB4MjYxRiwgMHgyMDFFLCAweDI2NDAsCisgICAgMHgwMkMyLCAweDI2NDIsIDB4MDJDMSwgMHgyNjYwLCAweDIwMTMsIDB4MjY2MSwgMHgxRjUxLCAweDI2NjIsIDB4MUY1MywKKyAgICAweDI2NjMsIDB4MjAxNSwgMHgyNjY0LCAweDFGNTIsIDB4MjY2NSwgMHgyMDE0LCAweDI2NjYsIDB4MjAxNiwgMHgyNjY3LAorICAgIDB4MUY1MCwgMHgyNjY4LCAweDJGNDIsIDB4MjY2OSwgMHgyRjQzLCAweDI2NkEsIDB4MDMwNywgMHgyNjZCLCAweDNGNDgsCisgICAgMHgyNjZDLCAweDJGNDQsIDB4MjY2RCwgMHgwMzA2LCAweDI2NkUsIDB4M0Y0NywgMHgyNjZGLCAweDAzMDUsIDB4MjY3MiwKKyAgICAweDNGQkEsIDB4MjY3MywgMHgzRkJCLCAweDI2NzQsIDB4M0ZCQywgMHgyNjc1LCAweDNGQkQsIDB4MjY3NiwgMHgzRkJFLAorICAgIDB4MjY3NywgMHgzRkJGLCAweDI2NzgsIDB4M0ZDMCwgMHgyNjc5LCAweDNGQzEsIDB4MjY3QSwgMHgzRkMyLCAweDI2N0IsCisgICAgMHgzRkMzLCAweDI2N0MsIDB4M0ZDNCwgMHgyNjdELCAweDNGQzUsIDB4MjZBMCwgMHgyRkEwLCAweDI3MDIsIDB4MkY5MCwKKyAgICAweDI3MTMsIDB4M0Y4RSwgMHgyNzFBLCAweDJGRDEsIDB4MjczRiwgMHgyRkM1LCAweDI3NDAsIDB4MkZDNCwgMHgyNzU2LAorICAgIDB4MkZFMywgMHgyNzc2LCAweDIwNUUsIDB4Mjc3NywgMHgyMDVGLCAweDI3NzgsIDB4MjA2MCwgMHgyNzc5LCAweDIwNjEsCisgICAgMHgyNzdBLCAweDIwNjIsIDB4Mjc3QiwgMHgyMDYzLCAweDI3N0MsIDB4MjA2NCwgMHgyNzdELCAweDIwNjUsIDB4Mjc3RSwKKyAgICAweDIwNjYsIDB4Mjc3RiwgMHgyOTEyLCAweDI3QTEsIDB4MjAwRSwgMHgyOTM0LCAweDNGNDksIDB4MjkzNSwgMHgzRjRBLAorICAgIDB4MjlCRiwgMHgzRjRCLCAweDI5RkEsIDB4M0Y0RiwgMHgyOUZCLCAweDNGNTAsIDB4MkIwNSwgMHgyMDBGLCAweDJCMDYsCisgICAgMHgyMDEwLCAweDJCMDcsIDB4MjAxMSwgMHgyRTgzLCAweDM3RTEsIDB4MkU4NSwgMHgzNjIwLCAweDJFODcsIDB4MzcxOSwKKyAgICAweDJFODksIDB4MzgxNCwgMHgyRThCLCAweDM3MUUsIDB4MkU4QywgMHgzNjA5LCAweDJFOEQsIDB4MzYwQSwgMHgyRThFLAorICAgIDB4MTA3MSwgMHgyRThGLCAweDM4OEMsIDB4MkU5MCwgMHgxMjI2LCAweDJFOTIsIDB4MEVCMiwgMHgyRTkzLCAweDEyODMsCisgICAgMHgyRTk0LCAweDEyQUIsIDB4MkU5NSwgMHgzQzFGLCAweDJFOTYsIDB4MzhDMiwgMHgyRTk3LCAweDM2MUMsIDB4MkU5OCwKKyAgICAweDM4RTEsIDB4MkU5OSwgMHgxM0MzLCAweDJFOUIsIDB4MTNFMSwgMHgyRTlFLCAweDQ1RTUsIDB4MkU5RiwgMHgwRTNDLAorICAgIDB4MkVBMCwgMHgwRUJELCAweDJFQTEsIDB4Mzk2MSwgMHgyRUEyLCAweDM5NjIsIDB4MkVBMywgMHgzOTlELCAweDJFQTQsCisgICAgMHgzQzI2LCAweDJFQTYsIDB4Mzc0RCwgMHgyRUE4LCAweDM5QkMsIDB4MkVBOSwgMHgzNUExLCAweDJFQUEsIDB4MzZBQiwKKyAgICAweDJFQUIsIDB4M0E5NywgMHgyRUFDLCAweDRBQkEsIDB4MkVBRCwgMHgzQTM5LCAweDJFQUUsIDB4MzY2MiwgMHgyRUIxLAorICAgIDB4M0E5OCwgMHgyRUIyLCAweDNBOTcsIDB4MkVCMywgMHgzNzZELCAweDJFQjcsIDB4MzZGRSwgMHgyRUI5LCAweDM3MTMsCisgICAgMHgyRUJDLCAweDM1QjMsIDB4MkVCRCwgMHgzNTRFLCAweDJFQkUsIDB4Mzc3NSwgMHgyRUJGLCAweDM3NzYsIDB4MkVDMCwKKyAgICAweDM3NzcsIDB4MkVDMSwgMHgwNzhCLCAweDJFQzIsIDB4M0IwQSwgMHgyRUMzLCAweDM2MkUsIDB4MkVDNCwgMHgwQTYyLAorICAgIDB4MkVDNiwgMHgzNTcyLCAweDJFQ0EsIDB4MzY0QSwgMHgyRUNDLCAweDNDMkIsIDB4MkVDRCwgMHgzQjUwLCAweDJFQ0YsCisgICAgMHgzQjlFLCAweDJFRDEsIDB4MEJENSwgMHgyRUQyLCAweDNCOTcsIDB4MkVENiwgMHgzQjlFLCAweDJFRDcsIDB4MzU0RCwKKyAgICAweDJFRDgsIDB4MEE2OCwgMHgyRURELCAweDM2MTcsIDB4MkVERSwgMHgzNjE5LCAweDJFREYsIDB4MzYxOCwgMHgyRUU0LAorICAgIDB4MDY0RSwgMHgyRUU4LCAweDBEMzQsIDB4MkVFOSwgMHgwNTJCLCAweDJFRUIsIDB4MEE2QSwgMHgyRUVELCAweDA4QzMsCisgICAgMHgyRUVGLCAweDBGN0QsIDB4MkVGMiwgMHgwNjRGLCAweDJGMDAsIDB4MDRCMCwgMHgyRjAxLCAweDIwQjMsIDB4MkYwMiwKKyAgICAweDBGRkYsIDB4MkYwMywgMHgxMDAxLCAweDJGMDQsIDB4MDUzNSwgMHgyRjA1LCAweDEwMDYsIDB4MkYwNiwgMHgwQ0NCLAorICAgIDB4MkYwNywgMHgxMDBFLCAweDJGMDgsIDB4MEExMywgMHgyRjA5LCAweDEwNzAsIDB4MkYwQSwgMHgwQ0Q2LCAweDJGMEIsCisgICAgMHgwRDQwLCAweDJGMEMsIDB4MTA3QiwgMHgyRjBELCAweDEwODMsIDB4MkYwRSwgMHgxMDg5LCAweDJGMEYsIDB4MTA5MywKKyAgICAweDJGMTAsIDB4MTA5OCwgMHgyRjExLCAweDBDNUIsIDB4MkYxMiwgMHgwRjk3LCAweDJGMTMsIDB4MTBDNiwgMHgyRjE0LAorICAgIDB4MTBDRCwgMHgyRjE1LCAweDEwQ0UsIDB4MkYxNiwgMHgxMEQzLCAweDJGMTcsIDB4MDk0NywgMHgyRjE4LCAweDBFN0MsCisgICAgMHgyRjE5LCAweDEwREMsIDB4MkYxQSwgMHgxMEUxLCAweDJGMUIsIDB4MTBFOCwgMHgyRjFDLCAweDBFQTIsIDB4MkYxRCwKKyAgICAweDA3QjEsIDB4MkYxRSwgMHgxMTZCLCAweDJGMUYsIDB4MEM1NCwgMHgyRjIwLCAweDA4OUMsIDB4MkYyMSwgMHgxMUJBLAorICAgIDB4MkYyMiwgMHgxMUJCLCAweDJGMjMsIDB4MEYyNiwgMHgyRjI0LCAweDBCNDcsIDB4MkYyNSwgMHgwOTgxLCAweDJGMjYsCisgICAgMHgwOEEwLCAweDJGMjcsIDB4MTIwRSwgMHgyRjI4LCAweDBBNDcsIDB4MkYyOSwgMHgwOTk2LCAweDJGMkEsIDB4MTIyNiwKKyAgICAweDJGMkIsIDB4MTIyOCwgMHgyRjJDLCAweDEyMzIsIDB4MkYyRCwgMHgwODgxLCAweDJGMkUsIDB4MTI2QywgMHgyRjJGLAorICAgIDB4MDdCQiwgMHgyRjMwLCAweDA3N0UsIDB4MkYzMSwgMHgwNkNBLCAweDJGMzIsIDB4MDVFRiwgMHgyRjMzLCAweDEyODMsCisgICAgMHgyRjM0LCAweDEyODUsIDB4MkYzNSwgMHgxMjk5LCAweDJGMzYsIDB4MTI5QiwgMHgyRjM3LCAweDEyQTAsIDB4MkYzOCwKKyAgICAweDA2NzcsIDB4MkYzOSwgMHgzOEI5LCAweDJGM0EsIDB4MTJBRiwgMHgyRjNCLCAweDEyQjEsIDB4MkYzQywgMHgwOUZBLAorICAgIDB4MkYzRCwgMHgxMzQyLCAweDJGM0UsIDB4MDc4MSwgMHgyRjNGLCAweDA5MTYsIDB4MkY0MCwgMHgwOEE3LCAweDJGNDEsCisgICAgMHgxM0MyLCAweDJGNDIsIDB4MEUwOCwgMHgyRjQzLCAweDBDNDcsIDB4MkY0NCwgMHgwNkNDLCAweDJGNDUsIDB4MEU0RCwKKyAgICAweDJGNDYsIDB4MTNFMCwgMHgyRjQ3LCAweDBDRDQsIDB4MkY0OCwgMHgxNDBDLCAweDJGNDksIDB4MDc0NCwgMHgyRjRBLAorICAgIDB4MEVFNiwgMHgyRjRCLCAweDA3M0QsIDB4MkY0QywgMHgwOEFELCAweDJGNEQsIDB4MTRFNSwgMHgyRjRFLCAweDE0RjQsCisgICAgMHgyRjRGLCAweDE0RjgsIDB4MkY1MCwgMHgwRDdBLCAweDJGNTEsIDB4MEVERiwgMHgyRjUyLCAweDA4QUYsIDB4MkY1MywKKyAgICAweDE1MDIsIDB4MkY1NCwgMHgwQTJCLCAweDJGNTUsIDB4MDU1MCwgMHgyRjU2LCAweDBCRkEsIDB4MkY1NywgMHgwREQ1LAorICAgIDB4MkY1OCwgMHgxNUU0LCAweDJGNTksIDB4MTVFNiwgMHgyRjVBLCAweDBFMjIsIDB4MkY1QiwgMHgwNTY3LCAweDJGNUMsCisgICAgMHgwNjg3LCAweDJGNUQsIDB4MDc1OCwgMHgyRjVFLCAweDA3NzAsIDB4MkY1RiwgMHgwNkM0LCAweDJGNjAsIDB4MDRERCwKKyAgICAweDJGNjEsIDB4MDVFMCwgMHgyRjYyLCAweDA2MDEsIDB4MkY2MywgMHgwQTVDLCAweDJGNjQsIDB4MEYzQiwgMHgyRjY1LAorICAgIDB4MEMzRSwgMHgyRjY2LCAweDBEOTcsIDB4MkY2NywgMHgzQTAwLCAweDJGNjgsIDB4MTY5NywgMHgyRjY5LCAweDBEMjgsCisgICAgMHgyRjZBLCAweDBEN0QsIDB4MkY2QiwgMHgwODdDLCAweDJGNkMsIDB4MEVFOCwgMHgyRjZELCAweDBFQzMsIDB4MkY2RSwKKyAgICAweDBFRkMsIDB4MkY2RiwgMHgwQTc0LCAweDJGNzAsIDB4MDhENCwgMHgyRjcxLCAweDNBNDEsIDB4MkY3MiwgMHgwNTUzLAorICAgIDB4MkY3MywgMHgwNzQwLCAweDJGNzQsIDB4MEY3MSwgMHgyRjc1LCAweDBCOUIsIDB4MkY3NiwgMHgwRTE2LCAweDJGNzcsCisgICAgMHgwOEIzLCAweDJGNzgsIDB4MDYwOCwgMHgyRjc5LCAweDE4MTMsIDB4MkY3QSwgMHgwRjNELCAweDJGN0IsIDB4MDRDQiwKKyAgICAweDJGN0MsIDB4MEZERCwgMHgyRjdELCAweDA4RDUsIDB4MkY3RSwgMHgxODNELCAweDJGN0YsIDB4MDhENiwgMHgyRjgwLAorICAgIDB4MTg1MywgMHgyRjgxLCAweDBDRDEsIDB4MkY4MiwgMHgwQTA5LCAweDJGODMsIDB4MDhENywgMHgyRjg0LCAweDA4QjgsCisgICAgMHgyRjg1LCAweDA0RDMsIDB4MkY4NiwgMHgwQTg5LCAweDJGODcsIDB4MEFBNiwgMHgyRjg4LCAweDA5MzgsIDB4MkY4OSwKKyAgICAweDA4MjEsIDB4MkY4QSwgMHgwOUVELCAweDJGOEIsIDB4MThCMiwgMHgyRjhDLCAweDE5NEYsIDB4MkY4RCwgMHgwQkFDLAorICAgIDB4MkY4RSwgMHgwNzQyLCAweDJGOEYsIDB4MDdFNiwgMHgyRjkwLCAweDA0QTUsIDB4MkY5MSwgMHgxOUVCLCAweDJGOTIsCisgICAgMHgwNzVGLCAweDJGOTMsIDB4MDVBRiwgMHgyRjk0LCAweDA3NzQsIDB4MkY5NSwgMHgwQjY5LCAweDJGOTYsIDB4MEM3RSwKKyAgICAweDJGOTcsIDB4MUE1NiwgMHgyRjk4LCAweDFBNTksIDB4MkY5OSwgMHgwNThCLCAweDJGOUEsIDB4MEE3QSwgMHgyRjlCLAorICAgIDB4MEFGOCwgMHgyRjlDLCAweDBCMEQsIDB4MkY5RCwgMHgwQTBFLCAweDJGOUUsIDB4MDkwMiwgMHgyRjlGLCAweDBBMEYsCisgICAgMHgyRkEwLCAweDBCNjIsIDB4MkZBMSwgMHgzQjRGLCAweDJGQTIsIDB4MEYyMiwgMHgyRkEzLCAweDBDQUIsIDB4MkZBNCwKKyAgICAweDBENjQsIDB4MkZBNSwgMHgwRjZDLCAweDJGQTYsIDB4MDZEQSwgMHgyRkE3LCAweDBCRDUsIDB4MkZBOCwgMHgwRUYzLAorICAgIDB4MkZBOSwgMHgwRERFLCAweDJGQUEsIDB4MUJDOSwgMHgyRkFCLCAweDFCQ0IsIDB4MkZBQywgMHgwNENELCAweDJGQUQsCisgICAgMHgyMUY3LCAweDJGQUUsIDB4MEQ4NywgMHgyRkFGLCAweDBFRDgsIDB4MkZCMCwgMHgwNUI1LCAweDJGQjEsIDB4MUMwMywKKyAgICAweDJGQjIsIDB4MUMwNSwgMHgyRkIzLCAweDA1M0IsIDB4MkZCNCwgMHgwRTE3LCAweDJGQjUsIDB4MERFOSwgMHgyRkI2LAorICAgIDB4MEQ4OCwgMHgyRkI3LCAweDA5RUYsIDB4MkZCOCwgMHgwOTFGLCAweDJGQjksIDB4MDdGMywgMHgyRkJBLCAweDBEMDUsCisgICAgMHgyRkJCLCAweDA4MEUsIDB4MkZCQywgMHgwN0Y0LCAweDJGQkQsIDB4MUM2QywgMHgyRkJFLCAweDFDN0QsIDB4MkZCRiwKKyAgICAweDFDODMsIDB4MkZDMCwgMHgxQzg0LCAweDJGQzEsIDB4MDY0RSwgMHgyRkMyLCAweDA2OTUsIDB4MkZDMywgMHgwQkQ3LAorICAgIDB4MkZDNCwgMHgxQ0Y2LCAweDJGQzUsIDB4MDhEQiwgMHgyRkM2LCAweDFEMDEsIDB4MkZDNywgMHgwRTkxLCAweDJGQzgsCisgICAgMHgzNDBCLCAweDJGQzksIDB4MDY2QSwgMHgyRkNBLCAweDA4MDcsIDB4MkZDQiwgMHgxRDE2LCAweDJGQ0MsIDB4MUQxOSwKKyAgICAweDJGQ0QsIDB4MEMxRSwgMHgyRkNFLCAweDA3OTEsIDB4MkZDRiwgMHgwQUNGLCAweDJGRDAsIDB4MEQ5MywgMHgyRkQxLAorICAgIDB4MUQyMSwgMHgyRkQyLCAweDFEMjIsIDB4MkZEMywgMHgwRjdFLCAweDJGRDQsIDB4MUQzMCwgMHgyRkQ1LCAweDFEMzEsCisgICAgMHgzMDAwLCAweDAyNzksIDB4MzAwMSwgMHgwMjdBLCAweDMwMDIsIDB4MDI3QiwgMHgzMDAzLCAweDAyOEYsIDB4MzAwNCwKKyAgICAweDIwNzQsIDB4MzAwNSwgMHgwMjkxLCAweDMwMDYsIDB4MDI5MiwgMHgzMDA3LCAweDAyOTMsIDB4MzAwOCwgMHgwMkFBLAorICAgIDB4MzAwOSwgMHgwMkFCLCAweDMwMEEsIDB4MDJBQywgMHgzMDBCLCAweDAyQUQsIDB4MzAwQywgMHgwMkFFLCAweDMwMEQsCisgICAgMHgwMkFGLCAweDMwMEUsIDB4MDJCMCwgMHgzMDBGLCAweDAyQjEsIDB4MzAxMCwgMHgwMkIyLCAweDMwMTEsIDB4MDJCMywKKyAgICAweDMwMTIsIDB4MDJERiwgMHgzMDEzLCAweDAyRTQsIDB4MzAxNCwgMHgwMkE0LCAweDMwMTUsIDB4MDJBNSwgMHgzMDE2LAorICAgIDB4M0Y0NSwgMHgzMDE3LCAweDNGNDYsIDB4MzAxOCwgMHgyRjYxLCAweDMwMTksIDB4MkY2MiwgMHgzMDFDLCAweDAyOTksCisgICAgMHgzMDFELCAweDFEQjgsIDB4MzAxRiwgMHgxREI5LCAweDMwMjAsIDB4MUY3QSwgMHgzMDMwLCAweDJGQkEsIDB4MzAzMywKKyAgICAweDJGNEMsIDB4MzAzNCwgMHgyRjRELCAweDMwMzUsIDB4MkY0RSwgMHgzMDM2LCAweDFGNzksIDB4MzAzQiwgMHgyRjRBLAorICAgIDB4MzAzQywgMHgzRjQyLCAweDMwM0QsIDB4MkY5MywgMHgzMDQxLCAweDAzNEEsIDB4MzA0MiwgMHgwMzRCLCAweDMwNDMsCisgICAgMHgwMzRDLCAweDMwNDQsIDB4MDM0RCwgMHgzMDQ1LCAweDAzNEUsIDB4MzA0NiwgMHgwMzRGLCAweDMwNDcsIDB4MDM1MCwKKyAgICAweDMwNDgsIDB4MDM1MSwgMHgzMDQ5LCAweDAzNTIsIDB4MzA0QSwgMHgwMzUzLCAweDMwNEIsIDB4MDM1NCwgMHgzMDRDLAorICAgIDB4MDM1NSwgMHgzMDRELCAweDAzNTYsIDB4MzA0RSwgMHgwMzU3LCAweDMwNEYsIDB4MDM1OCwgMHgzMDUwLCAweDAzNTksCisgICAgMHgzMDUxLCAweDAzNUEsIDB4MzA1MiwgMHgwMzVCLCAweDMwNTMsIDB4MDM1QywgMHgzMDU0LCAweDAzNUQsIDB4MzA1NSwKKyAgICAweDAzNUUsIDB4MzA1NiwgMHgwMzVGLCAweDMwNTcsIDB4MDM2MCwgMHgzMDU4LCAweDAzNjEsIDB4MzA1OSwgMHgwMzYyLAorICAgIDB4MzA1QSwgMHgwMzYzLCAweDMwNUIsIDB4MDM2NCwgMHgzMDVDLCAweDAzNjUsIDB4MzA1RCwgMHgwMzY2LCAweDMwNUUsCisgICAgMHgwMzY3LCAweDMwNUYsIDB4MDM2OCwgMHgzMDYwLCAweDAzNjksIDB4MzA2MSwgMHgwMzZBLCAweDMwNjIsIDB4MDM2QiwKKyAgICAweDMwNjMsIDB4MDM2QywgMHgzMDY0LCAweDAzNkQsIDB4MzA2NSwgMHgwMzZFLCAweDMwNjYsIDB4MDM2RiwgMHgzMDY3LAorICAgIDB4MDM3MCwgMHgzMDY4LCAweDAzNzEsIDB4MzA2OSwgMHgwMzcyLCAweDMwNkEsIDB4MDM3MywgMHgzMDZCLCAweDAzNzQsCisgICAgMHgzMDZDLCAweDAzNzUsIDB4MzA2RCwgMHgwMzc2LCAweDMwNkUsIDB4MDM3NywgMHgzMDZGLCAweDAzNzgsIDB4MzA3MCwKKyAgICAweDAzNzksIDB4MzA3MSwgMHgwMzdBLCAweDMwNzIsIDB4MDM3QiwgMHgzMDczLCAweDAzN0MsIDB4MzA3NCwgMHgwMzdELAorICAgIDB4MzA3NSwgMHgwMzdFLCAweDMwNzYsIDB4MDM3RiwgMHgzMDc3LCAweDAzODAsIDB4MzA3OCwgMHgwMzgxLCAweDMwNzksCisgICAgMHgwMzgyLCAweDMwN0EsIDB4MDM4MywgMHgzMDdCLCAweDAzODQsIDB4MzA3QywgMHgwMzg1LCAweDMwN0QsIDB4MDM4NiwKKyAgICAweDMwN0UsIDB4MDM4NywgMHgzMDdGLCAweDAzODgsIDB4MzA4MCwgMHgwMzg5LCAweDMwODEsIDB4MDM4QSwgMHgzMDgyLAorICAgIDB4MDM4QiwgMHgzMDgzLCAweDAzOEMsIDB4MzA4NCwgMHgwMzhELCAweDMwODUsIDB4MDM4RSwgMHgzMDg2LCAweDAzOEYsCisgICAgMHgzMDg3LCAweDAzOTAsIDB4MzA4OCwgMHgwMzkxLCAweDMwODksIDB4MDM5MiwgMHgzMDhBLCAweDAzOTMsIDB4MzA4QiwKKyAgICAweDAzOTQsIDB4MzA4QywgMHgwMzk1LCAweDMwOEQsIDB4MDM5NiwgMHgzMDhFLCAweDAzOTcsIDB4MzA4RiwgMHgwMzk4LAorICAgIDB4MzA5MCwgMHgwMzk5LCAweDMwOTEsIDB4MDM5QSwgMHgzMDkyLCAweDAzOUIsIDB4MzA5MywgMHgwMzlDLCAweDMwOTQsCisgICAgMHgxRjE2LCAweDMwOTUsIDB4MUYxNywgMHgzMDk2LCAweDFGMTgsIDB4MzA5OSwgMHgzRkM2LCAweDMwOUEsIDB4M0ZDNywKKyAgICAweDMwOUIsIDB4MDI4MywgMHgzMDlDLCAweDAyODQsIDB4MzA5RCwgMHgwMjhELCAweDMwOUUsIDB4MDI4RSwgMHgzMDlGLAorICAgIDB4MkY5NSwgMHgzMEEwLCAweDNGNEQsIDB4MzBBMSwgMHgwMzlELCAweDMwQTIsIDB4MDM5RSwgMHgzMEEzLCAweDAzOUYsCisgICAgMHgzMEE0LCAweDAzQTAsIDB4MzBBNSwgMHgwM0ExLCAweDMwQTYsIDB4MDNBMiwgMHgzMEE3LCAweDAzQTMsIDB4MzBBOCwKKyAgICAweDAzQTQsIDB4MzBBOSwgMHgwM0E1LCAweDMwQUEsIDB4MDNBNiwgMHgzMEFCLCAweDAzQTcsIDB4MzBBQywgMHgwM0E4LAorICAgIDB4MzBBRCwgMHgwM0E5LCAweDMwQUUsIDB4MDNBQSwgMHgzMEFGLCAweDAzQUIsIDB4MzBCMCwgMHgwM0FDLCAweDMwQjEsCisgICAgMHgwM0FELCAweDMwQjIsIDB4MDNBRSwgMHgzMEIzLCAweDAzQUYsIDB4MzBCNCwgMHgwM0IwLCAweDMwQjUsIDB4MDNCMSwKKyAgICAweDMwQjYsIDB4MDNCMiwgMHgzMEI3LCAweDAzQjMsIDB4MzBCOCwgMHgwM0I0LCAweDMwQjksIDB4MDNCNSwgMHgzMEJBLAorICAgIDB4MDNCNiwgMHgzMEJCLCAweDAzQjcsIDB4MzBCQywgMHgwM0I4LCAweDMwQkQsIDB4MDNCOSwgMHgzMEJFLCAweDAzQkEsCisgICAgMHgzMEJGLCAweDAzQkIsIDB4MzBDMCwgMHgwM0JDLCAweDMwQzEsIDB4MDNCRCwgMHgzMEMyLCAweDAzQkUsIDB4MzBDMywKKyAgICAweDAzQkYsIDB4MzBDNCwgMHgwM0MwLCAweDMwQzUsIDB4MDNDMSwgMHgzMEM2LCAweDAzQzIsIDB4MzBDNywgMHgwM0MzLAorICAgIDB4MzBDOCwgMHgwM0M0LCAweDMwQzksIDB4MDNDNSwgMHgzMENBLCAweDAzQzYsIDB4MzBDQiwgMHgwM0M3LCAweDMwQ0MsCisgICAgMHgwM0M4LCAweDMwQ0QsIDB4MDNDOSwgMHgzMENFLCAweDAzQ0EsIDB4MzBDRiwgMHgwM0NCLCAweDMwRDAsIDB4MDNDQywKKyAgICAweDMwRDEsIDB4MDNDRCwgMHgzMEQyLCAweDAzQ0UsIDB4MzBEMywgMHgwM0NGLCAweDMwRDQsIDB4MDNEMCwgMHgzMEQ1LAorICAgIDB4MDNEMSwgMHgzMEQ2LCAweDAzRDIsIDB4MzBENywgMHgwM0QzLCAweDMwRDgsIDB4MDNENCwgMHgzMEQ5LCAweDAzRDUsCisgICAgMHgzMERBLCAweDAzRDYsIDB4MzBEQiwgMHgwM0Q3LCAweDMwREMsIDB4MDNEOCwgMHgzMERELCAweDAzRDksIDB4MzBERSwKKyAgICAweDAzREEsIDB4MzBERiwgMHgwM0RCLCAweDMwRTAsIDB4MDNEQywgMHgzMEUxLCAweDAzREQsIDB4MzBFMiwgMHgwM0RFLAorICAgIDB4MzBFMywgMHgwM0RGLCAweDMwRTQsIDB4MDNFMCwgMHgzMEU1LCAweDAzRTEsIDB4MzBFNiwgMHgwM0UyLCAweDMwRTcsCisgICAgMHgwM0UzLCAweDMwRTgsIDB4MDNFNCwgMHgzMEU5LCAweDAzRTUsIDB4MzBFQSwgMHgwM0U2LCAweDMwRUIsIDB4MDNFNywKKyAgICAweDMwRUMsIDB4MDNFOCwgMHgzMEVELCAweDAzRTksIDB4MzBFRSwgMHgwM0VBLCAweDMwRUYsIDB4MDNFQiwgMHgzMEYwLAorICAgIDB4MDNFQywgMHgzMEYxLCAweDAzRUQsIDB4MzBGMiwgMHgwM0VFLCAweDMwRjMsIDB4MDNFRiwgMHgzMEY0LCAweDAzRjAsCisgICAgMHgzMEY1LCAweDAzRjEsIDB4MzBGNiwgMHgwM0YyLCAweDMwRjcsIDB4MjA3OSwgMHgzMEY4LCAweDIwN0EsIDB4MzBGOSwKKyAgICAweDIwN0IsIDB4MzBGQSwgMHgyMDdDLCAweDMwRkIsIDB4MDI3RSwgMHgzMEZDLCAweDAyOTQsIDB4MzBGRCwgMHgwMjhCLAorICAgIDB4MzBGRSwgMHgwMjhDLCAweDMwRkYsIDB4M0Y0MywgMHgzMTkwLCAweDNGOUIsIDB4MzE5MSwgMHgzRjlDLCAweDMxOTIsCisgICAgMHgzRjlELCAweDMxOTMsIDB4M0Y5RSwgMHgzMTk0LCAweDNGOUYsIDB4MzE5NSwgMHgzRkEwLCAweDMxOTYsIDB4M0ZBMSwKKyAgICAweDMxOTcsIDB4M0ZBMiwgMHgzMTk4LCAweDNGQTMsIDB4MzE5OSwgMHgzRkE0LCAweDMxOUEsIDB4M0ZBNSwgMHgzMTlCLAorICAgIDB4M0ZBNiwgMHgzMTlDLCAweDNGQTcsIDB4MzE5RCwgMHgzRkE4LCAweDMxOUUsIDB4M0ZBOSwgMHgzMTlGLCAweDNGQUEsCisgICAgMHgzMUYwLCAweDNGNkMsIDB4MzFGMSwgMHgzRjZELCAweDMxRjIsIDB4M0Y2RSwgMHgzMUYzLCAweDNGNkYsIDB4MzFGNCwKKyAgICAweDNGNzAsIDB4MzFGNSwgMHgzRjcxLCAweDMxRjYsIDB4M0Y3MiwgMHgzMUY3LCAweDNGNzMsIDB4MzFGOCwgMHgzRjc0LAorICAgIDB4MzFGOSwgMHgzRjc1LCAweDMxRkEsIDB4M0Y3NywgMHgzMUZCLCAweDNGNzgsIDB4MzFGQywgMHgzRjc5LCAweDMxRkQsCisgICAgMHgzRjdBLCAweDMxRkUsIDB4M0Y3QiwgMHgzMUZGLCAweDNGN0MsIDB4MzIyMCwgMHgyNzhFLCAweDMyMjEsIDB4Mjc4RiwKKyAgICAweDMyMjIsIDB4Mjc5MCwgMHgzMjIzLCAweDI3OTEsIDB4MzIyNCwgMHgyNzkyLCAweDMyMjUsIDB4Mjc5MywgMHgzMjI2LAorICAgIDB4Mjc5NCwgMHgzMjI3LCAweDI3OTUsIDB4MzIyOCwgMHgyNzk2LCAweDMyMjksIDB4Mjc5NywgMHgzMjJBLCAweDIwMDYsCisgICAgMHgzMjJCLCAweDIwMDcsIDB4MzIyQywgMHgyMDA4LCAweDMyMkQsIDB4MjAwOSwgMHgzMjJFLCAweDIwMEEsIDB4MzIyRiwKKyAgICAweDIwMEIsIDB4MzIzMCwgMHgyMDA1LCAweDMyMzEsIDB4MURDMiwgMHgzMjMyLCAweDFEQzMsIDB4MzIzMywgMHgxRkNGLAorICAgIDB4MzIzNCwgMHgxRkNELCAweDMyMzUsIDB4MUZENCwgMHgzMjM2LCAweDFGRDMsIDB4MzIzNywgMHgyMDBDLCAweDMyMzgsCisgICAgMHgxRkNFLCAweDMyMzksIDB4MURDNCwgMHgzMjNBLCAweDFGRDcsIDB4MzIzQiwgMHgxRkQ1LCAweDMyM0MsIDB4MUZEMCwKKyAgICAweDMyM0QsIDB4MUZDQiwgMHgzMjNFLCAweDFGRDIsIDB4MzIzRiwgMHgxRkNDLCAweDMyNDAsIDB4MUZENiwgMHgzMjQxLAorICAgIDB4MjAwRCwgMHgzMjQyLCAweDFGRDEsIDB4MzI0MywgMHgxRkNBLCAweDMyNTEsIDB4MUY5QiwgMHgzMjUyLCAweDFGQTYsCisgICAgMHgzMjUzLCAweDFGQTcsIDB4MzI1NCwgMHgxRkE4LCAweDMyNTUsIDB4MUZBOSwgMHgzMjU2LCAweDFGQUEsIDB4MzI1NywKKyAgICAweDFGQUIsIDB4MzI1OCwgMHgxRkFDLCAweDMyNTksIDB4MUZBRCwgMHgzMjVBLCAweDFGQUUsIDB4MzI1QiwgMHgxRkFGLAorICAgIDB4MzI1QywgMHgyODA0LCAweDMyNUQsIDB4MjgwNSwgMHgzMjVFLCAweDI4MDYsIDB4MzI1RiwgMHgyODA3LCAweDMyODAsCisgICAgMHgyOERELCAweDMyODEsIDB4MjhERSwgMHgzMjgyLCAweDI4REYsIDB4MzI4MywgMHgyOEUwLCAweDMyODQsIDB4MjhFMSwKKyAgICAweDMyODUsIDB4MjhFMiwgMHgzMjg2LCAweDI4RTMsIDB4MzI4NywgMHgyOEU0LCAweDMyODgsIDB4MjhFNSwgMHgzMjg5LAorICAgIDB4MjhFNiwgMHgzMjhBLCAweDI4RTgsIDB4MzI4QiwgMHgyOEU5LCAweDMyOEMsIDB4MjhFQSwgMHgzMjhELCAweDI4RUIsCisgICAgMHgzMjhFLCAweDI4RUMsIDB4MzI4RiwgMHgyOEVELCAweDMyOTAsIDB4MjhFNywgMHgzMjkxLCAweDFGRTEsIDB4MzI5MiwKKyAgICAweDFGRTAsIDB4MzI5MywgMHgxRkUyLCAweDMyOTQsIDB4MUZEQywgMHgzMjk1LCAweDI4RkYsIDB4MzI5NiwgMHgxRkU1LAorICAgIDB4MzI5NywgMHgyOEZDLCAweDMyOTgsIDB4MUZERSwgMHgzMjk5LCAweDIwMUYsIDB4MzI5QSwgMHgyOEY5LCAweDMyOUIsCisgICAgMHgyOEY4LCAweDMyOUMsIDB4MjhGRSwgMHgzMjlELCAweDIwN0YsIDB4MzI5RSwgMHgxRkZGLCAweDMyOUYsIDB4MjhFRiwKKyAgICAweDMyQTAsIDB4MjhGNiwgMHgzMkExLCAweDI4RjcsIDB4MzJBMiwgMHgyOEZCLCAweDMyQTMsIDB4MjhGQSwgMHgzMkE0LAorICAgIDB4MURCRCwgMHgzMkE1LCAweDFEQkUsIDB4MzJBNiwgMHgxREJGLCAweDMyQTcsIDB4MURDMCwgMHgzMkE4LCAweDFEQzEsCisgICAgMHgzMkE5LCAweDFGREEsIDB4MzJBQSwgMHgxRkRELCAweDMyQUIsIDB4MUZERiwgMHgzMkFDLCAweDFGRTMsIDB4MzJBRCwKKyAgICAweDFGRDksIDB4MzJBRSwgMHgxRkU0LCAweDMyQUYsIDB4MUZEQiwgMHgzMkIwLCAweDFGRDgsIDB4MzJCMSwgMHgyODA4LAorICAgIDB4MzJCMiwgMHgyODA5LCAweDMyQjMsIDB4MjgwQSwgMHgzMkI0LCAweDI4MEIsIDB4MzJCNSwgMHgyODBDLCAweDMyQjYsCisgICAgMHgyODBELCAweDMyQjcsIDB4MjgwRSwgMHgzMkI4LCAweDI4MEYsIDB4MzJCOSwgMHgyODEwLCAweDMyQkEsIDB4MjgxMSwKKyAgICAweDMyQkIsIDB4MjgxMiwgMHgzMkJDLCAweDI4MTMsIDB4MzJCRCwgMHgyODE0LCAweDMyQkUsIDB4MjgxNSwgMHgzMkJGLAorICAgIDB4MjgxNiwgMHgzMkQwLCAweDI4QUQsIDB4MzJEMSwgMHgyOEFFLCAweDMyRDIsIDB4MjhBRiwgMHgzMkQzLCAweDI4QjAsCisgICAgMHgzMkQ0LCAweDI4QjEsIDB4MzJENSwgMHgyOEIyLCAweDMyRDYsIDB4MjhCMywgMHgzMkQ3LCAweDI4QjQsIDB4MzJEOCwKKyAgICAweDI4QjUsIDB4MzJEOSwgMHgyOEI2LCAweDMyREEsIDB4MjhCNywgMHgzMkRCLCAweDI4QjgsIDB4MzJEQywgMHgyOEI5LAorICAgIDB4MzJERCwgMHgyOEJBLCAweDMyREUsIDB4MjhCQiwgMHgzMkRGLCAweDI4QkMsIDB4MzJFMCwgMHgyOEJELCAweDMyRTEsCisgICAgMHgyOEJFLCAweDMyRTIsIDB4MjhCRiwgMHgzMkUzLCAweDI4QzAsIDB4MzJFNCwgMHgyOEMxLCAweDMyRTUsIDB4MjhDMiwKKyAgICAweDMyRTYsIDB4MjhDMywgMHgzMkU3LCAweDI4QzQsIDB4MzJFOCwgMHgyOEM1LCAweDMyRTksIDB4MjhDNiwgMHgzMkVBLAorICAgIDB4MjhDNywgMHgzMkVCLCAweDI4QzgsIDB4MzJFQywgMHgyOEM5LCAweDMyRUQsIDB4MjhDQSwgMHgzMkVFLCAweDI4Q0IsCisgICAgMHgzMkVGLCAweDI4Q0MsIDB4MzJGMCwgMHgyOENELCAweDMyRjEsIDB4MjhDRSwgMHgzMkYyLCAweDI4Q0YsIDB4MzJGMywKKyAgICAweDI4RDAsIDB4MzJGNCwgMHgyOEQxLCAweDMyRjUsIDB4MjhEMiwgMHgzMkY2LCAweDI4RDMsIDB4MzJGNywgMHgyOEQ0LAorICAgIDB4MzJGOCwgMHgyOEQ1LCAweDMyRjksIDB4MjhENiwgMHgzMkZBLCAweDI4RDcsIDB4MzJGQiwgMHgyOEQ4LCAweDMyRkMsCisgICAgMHgyOEQ5LCAweDMyRkQsIDB4MjhEQSwgMHgzMkZFLCAweDI4REIsIDB4MzMwMCwgMHgxRjcwLCAweDMzMDEsIDB4MkU2MiwKKyAgICAweDMzMDIsIDB4MkU2MywgMHgzMzAzLCAweDFGNkEsIDB4MzMwNCwgMHgyRTY0LCAweDMzMDUsIDB4MUZGNywgMHgzMzA2LAorICAgIDB4MkU2NSwgMHgzMzA3LCAweDJFNjksIDB4MzMwOCwgMHgyRTY3LCAweDMzMDksIDB4MkU2QywgMHgzMzBBLCAweDJFNkEsCisgICAgMHgzMzBCLCAweDJFNkUsIDB4MzMwQywgMHgyRTcwLCAweDMzMEQsIDB4MURBQiwgMHgzMzBFLCAweDJFNzEsIDB4MzMwRiwKKyAgICAweDJFNzIsIDB4MzMxMCwgMHgyRTczLCAweDMzMTEsIDB4MkU3NCwgMHgzMzEyLCAweDJFNzUsIDB4MzMxMywgMHgyRTc2LAorICAgIDB4MzMxNCwgMHgxREEyLCAweDMzMTUsIDB4MUY2OSwgMHgzMzE2LCAweDFGNjcsIDB4MzMxNywgMHgyRTc4LCAweDMzMTgsCisgICAgMHgxRjY4LCAweDMzMTksIDB4MkU3QSwgMHgzMzFBLCAweDJFN0MsIDB4MzMxQiwgMHgyRTdELCAweDMzMUMsIDB4MkU3RSwKKyAgICAweDMzMUQsIDB4MkU3RiwgMHgzMzFFLCAweDFGNzMsIDB4MzMxRiwgMHgyRTgwLCAweDMzMjAsIDB4MkU4MSwgMHgzMzIxLAorICAgIDB4MkU4MiwgMHgzMzIyLCAweDFGNjYsIDB4MzMyMywgMHgxRjZCLCAweDMzMjQsIDB4MkU4MywgMHgzMzI1LCAweDJFODUsCisgICAgMHgzMzI2LCAweDFEQUMsIDB4MzMyNywgMHgxREE2LCAweDMzMjgsIDB4MkU4OCwgMHgzMzI5LCAweDJFODksIDB4MzMyQSwKKyAgICAweDFGNzQsIDB4MzMyQiwgMHgxREFFLCAweDMzMkQsIDB4MkU4QiwgMHgzMzJFLCAweDJFOEUsIDB4MzMyRiwgMHgyRThGLAorICAgIDB4MzMzMCwgMHgyRTkwLCAweDMzMzEsIDB4MUY3MSwgMHgzMzMyLCAweDJFOTEsIDB4MzMzMywgMHgyMDg3LCAweDMzMzQsCisgICAgMHgyRTk0LCAweDMzMzUsIDB4MkU5NSwgMHgzMzM2LCAweDFEQTgsIDB4MzMzNywgMHgyRTlBLCAweDMzMzgsIDB4MkU5QywKKyAgICAweDMzMzksIDB4MUY2RSwgMHgzMzNBLCAweDJFOUQsIDB4MzMzQiwgMHgxRjZGLCAweDMzM0MsIDB4MkU5NiwgMHgzMzNELAorICAgIDB4MkU5RSwgMHgzMzNFLCAweDJFQTAsIDB4MzMzRiwgMHgyRUExLCAweDMzNDAsIDB4MkVBMiwgMHgzMzQxLCAweDJFOUYsCisgICAgMHgzMzQyLCAweDFGNkQsIDB4MzM0MywgMHgyRUEzLCAweDMzNDQsIDB4MkVBNCwgMHgzMzQ1LCAweDJFQTUsIDB4MzM0NiwKKyAgICAweDJFQTYsIDB4MzM0NywgMHgxRjcyLCAweDMzNDgsIDB4MkVBNywgMHgzMzQ5LCAweDFEQTEsIDB4MzM0QSwgMHgxREFGLAorICAgIDB4MzM0QiwgMHgyRUE4LCAweDMzNEMsIDB4MkVBOSwgMHgzMzRELCAweDFEQTQsIDB4MzM0RSwgMHgyMDg4LCAweDMzNEYsCisgICAgMHgyRUFBLCAweDMzNTAsIDB4MkVBQiwgMHgzMzUxLCAweDFEQTksIDB4MzM1MiwgMHgyRUFFLCAweDMzNTMsIDB4MkVCMiwKKyAgICAweDMzNTQsIDB4MkVBRiwgMHgzMzU1LCAweDJFQjMsIDB4MzM1NiwgMHgyRUI0LCAweDMzNTcsIDB4MUY2QywgMHgzMzcxLAorICAgIDB4MkU1NSwgMHgzMzdCLCAweDIwODMsIDB4MzM3QywgMHgxREM3LCAweDMzN0QsIDB4MURDNiwgMHgzMzdFLCAweDFEQzUsCisgICAgMHgzMzdGLCAweDFGNzYsIDB4MzM4NSwgMHgxRjVGLCAweDMzODYsIDB4MUY2MCwgMHgzMzg3LCAweDFGNjEsIDB4MzM4OCwKKyAgICAweDIwMDAsIDB4MzM4OSwgMHgyMDAxLCAweDMzOEQsIDB4MkU1OCwgMHgzMzhFLCAweDFEQjQsIDB4MzM4RiwgMHgxREI1LAorICAgIDB4MzM5MCwgMHgxRjYzLCAweDMzOTYsIDB4MUY2NSwgMHgzMzk3LCAweDFGNTgsIDB4MzM5OCwgMHgxRjVBLCAweDMzOUIsCisgICAgMHgyRTU5LCAweDMzOUMsIDB4MURCMSwgMHgzMzlELCAweDFEQjIsIDB4MzM5RSwgMHgxREIzLCAweDMzOUYsIDB4MUZGQSwKKyAgICAweDMzQTAsIDB4MUY1NCwgMHgzM0ExLCAweDFEQjcsIDB4MzNBMiwgMHgxRjU1LCAweDMzQTMsIDB4MUZGQiwgMHgzM0E0LAorICAgIDB4MUY1NiwgMHgzM0E1LCAweDFGNTcsIDB4MzNBNiwgMHgxRkZDLCAweDMzQjAsIDB4MUY1RSwgMHgzM0IxLCAweDFGNUQsCisgICAgMHgzM0IyLCAweDFGNUMsIDB4MzNCMywgMHgxRjVCLCAweDMzQzIsIDB4MkU1MCwgMHgzM0M0LCAweDFEQjYsIDB4MzNDOCwKKyAgICAweDIwMDIsIDB4MzNDQiwgMHgxRjYyLCAweDMzQ0MsIDB4MUZGNiwgMHgzM0NELCAweDFEQkIsIDB4MzNENCwgMHgxRjY0LAorICAgIDB4MzNENywgMHgyRTVELCAweDMzRDgsIDB4MkU1RSwgMHgzM0RBLCAweDJFNEIsIDB4MzQwMiwgMHgzNTgyLCAweDM0MDUsCisgICAgMHgzQzFCLCAweDM0MDYsIDB4NDM1QSwgMHgzNDI3LCAweDM2NTYsIDB4MzQyQywgMHg0MzVFLCAweDM0MkUsIDB4Mzc4OCwKKyAgICAweDM0NjgsIDB4MzZERiwgMHgzNDZBLCAweDQzNzUsIDB4MzQ4OCwgMHgzQzUyLCAweDM0OTIsIDB4NDM4RSwgMHgzNEI1LAorICAgIDB4NDE5OSwgMHgzNEJDLCAweDQzOTcsIDB4MzRDMSwgMHg0N0QwLCAweDM0QzcsIDB4NDM5QiwgMHgzNERCLCAweDNDNDEsCisgICAgMHgzNTFGLCAweDM2MjksIDB4MzUzRSwgMHgzNzFFLCAweDM1NUQsIDB4NDNCRCwgMHgzNTVFLCAweDQzQkUsIDB4MzU2MywKKyAgICAweDQzQzAsIDB4MzU2RSwgMHg0M0M0LCAweDM1QTYsIDB4NDNEOSwgMHgzNUE4LCAweDQzREIsIDB4MzVDNSwgMHg0M0UxLAorICAgIDB4MzVEQSwgMHg0M0VBLCAweDM1REUsIDB4NEU2MywgMHgzNUY0LCAweDQzRjMsIDB4MzYwNSwgMHg0M0ZBLCAweDM2MTQsCisgICAgMHg0QUJCLCAweDM2NEEsIDB4NDQyMSwgMHgzNjkxLCAweDQ0NDEsIDB4MzY5NiwgMHg0NDQ1LCAweDM2OTksIDB4NDQ0MywKKyAgICAweDM2Q0YsIDB4NDQ1NiwgMHgzNzYxLCAweDQ0NzgsIDB4Mzc2MiwgMHg0NDc5LCAweDM3NkIsIDB4NDQ3RCwgMHgzNzZDLAorICAgIDB4NDQ3QywgMHgzNzc1LCAweDQ0ODAsIDB4Mzc4RCwgMHgzNjFBLCAweDM3QzEsIDB4NDQ4RSwgMHgzN0UyLCAweDM3MkIsCisgICAgMHgzN0U4LCAweDQ0QTIsIDB4MzdGNCwgMHg0NEE1LCAweDM3RkQsIDB4NDRBOCwgMHgzODAwLCAweDQ0QUEsIDB4MzgyRiwKKyAgICAweDQ0QjQsIDB4MzgzNiwgMHg0NEI1LCAweDM4NDAsIDB4NDRCNiwgMHgzODVDLCAweDQ0QkEsIDB4Mzg2MSwgMHg0NEJDLAorICAgIDB4MzhBMSwgMHg0RUNCLCAweDM4QUQsIDB4NEFCQywgMHgzOEZBLCAweDM2MUMsIDB4MzkxNywgMHg0NEQ5LCAweDM5MUEsCisgICAgMHg0NERDLCAweDM5NkYsIDB4NDRFQiwgMHgzOUE0LCAweDRFOUEsIDB4MzlCOCwgMHg0RTlCLCAweDNBNUMsIDB4NEU5RiwKKyAgICAweDNBNkUsIDB4NDUzMSwgMHgzQTczLCAweDQ1MzQsIDB4M0E4NSwgMHg0RUFFLCAweDNBQzQsIDB4NEVBNywgMHgzQUNCLAorICAgIDB4NEVBOCwgMHgzQUQ2LCAweDQ1NDMsIDB4M0FENywgMHg0NTVFLCAweDNBRUEsIDB4NDU0RCwgMHgzQUYzLCAweDNDNDAsCisgICAgMHgzQjBFLCAweDQ1NTgsIDB4M0IxQSwgMHg0NTVDLCAweDNCMUMsIDB4NDU1RCwgMHgzQjIyLCAweDNDNDksIDB4M0I2RCwKKyAgICAweDQ1OEMsIDB4M0I3NywgMHg0NTg1LCAweDNCODcsIDB4NDVBMiwgMHgzQjg4LCAweDM2OEQsIDB4M0I4RCwgMHg0NUE0LAorICAgIDB4M0JBNCwgMHg0NUFBLCAweDNCQjYsIDB4NDIwRSwgMHgzQkMzLCAweDQyMEYsIDB4M0JDRCwgMHg0NUI4LCAweDNCRjAsCisgICAgMHg0NUM5LCAweDNCRjMsIDB4NEVCNywgMHgzQzBGLCAweDQyMTcsIDB4M0MyNiwgMHg0NURGLCAweDNDQzMsIDB4NDVGQywKKyAgICAweDNDRDIsIDB4NDYwMSwgMHgzRDExLCAweDQ2MjUsIDB4M0QxRSwgMHg0NjMwLCAweDNEMzEsIDB4NEVCRSwgMHgzRDRFLAorICAgIDB4MURFNywgMHgzRDY0LCAweDQ2NEEsIDB4M0Q5QSwgMHg0NjU4LCAweDNEQzAsIDB4NDY2QSwgMHgzRENDLCAweDRBQkQsCisgICAgMHgzREQ0LCAweDQ2NkYsIDB4M0UwNSwgMHg0NjdCLCAweDNFM0YsIDB4NDI0OCwgMHgzRTQwLCAweDRFQ0EsIDB4M0U2MCwKKyAgICAweDQ2OEIsIDB4M0U2NiwgMHg0NjhELCAweDNFNjgsIDB4NDY4RSwgMHgzRTgzLCAweDQ2OTUsIDB4M0U4QSwgMHgzQzQzLAorICAgIDB4M0U5NCwgMHg0NjlCLCAweDNFREEsIDB4M0M0OCwgMHgzRjU3LCAweDQ2Q0IsIDB4M0Y3MiwgMHg0MjU4LCAweDNGNzUsCisgICAgMHg0NkQ5LCAweDNGNzcsIDB4NDZEQiwgMHgzRkFFLCAweDQ2RUQsIDB4M0ZCMSwgMHgzNzU0LCAweDNGQzksIDB4NDZGOCwKKyAgICAweDNGRDcsIDB4NDZGRCwgMHgzRkRDLCAweDRBQkUsIDB4NDAzOSwgMHg0NzBGLCAweDQwNTgsIDB4NDcxNiwgMHg0MDkzLAorICAgIDB4M0M0QywgMHg0MTAzLCAweDNDNEYsIDB4NDEwNSwgMHg0NzNCLCAweDQxNDgsIDB4NDc0NywgMHg0MTRGLCAweDQ3NEEsCisgICAgMHg0MTYzLCAweDQ3NEUsIDB4NDFCNCwgMHg0NzVELCAweDQxQkYsIDB4NDc2MCwgMHg0MUU2LCAweDQ3NkIsIDB4NDFFRSwKKyAgICAweDQ3NkYsIDB4NDFGMywgMHg0NzZDLCAweDQyMDcsIDB4NDc3NiwgMHg0MjBFLCAweDQ3NzksIDB4NDI2NCwgMHgzNzYwLAorICAgIDB4NDI5MywgMHgzQzUwLCAweDQyQzYsIDB4NDc5RiwgMHg0MkQ2LCAweDQ3QUEsIDB4NDJERCwgMHg0N0FFLCAweDQzMDIsCisgICAgMHg0N0JDLCAweDQzMkIsIDB4NDdDOSwgMHg0MzQzLCAweDQ3Q0IsIDB4NDNFRSwgMHg0N0Y3LCAweDQzRjAsIDB4NDdGQSwKKyAgICAweDQ0MDgsIDB4NDgwMCwgMHg0NDBDLCAweDNDNDIsIDB4NDQxNywgMHg0ODAyLCAweDQ0MUMsIDB4NDgwMywgMHg0NDIyLAorICAgIDB4NDgwNSwgMHg0NDUzLCAweDM3NzMsIDB4NDQ1QiwgMHg0MkE0LCAweDQ0NzYsIDB4NDgxQywgMHg0NDdBLCAweDQ4MUQsCisgICAgMHg0NDkxLCAweDQ4MjMsIDB4NDRCMywgMHg0ODNFLCAweDQ0QkUsIDB4NDgzQywgMHg0NEQ0LCAweDQ4M0QsIDB4NDUwOCwKKyAgICAweDQ4NUMsIDB4NDUwRCwgMHg0ODU4LCAweDQ1MjUsIDB4Mzc3RSwgMHg0NTQzLCAweDQ4NkMsIDB4NDU3QSwgMHgzQzRCLAorICAgIDB4NDU5RCwgMHg0MkQ0LCAweDQ1QjgsIDB4NDhBMCwgMHg0NUJFLCAweDRBQkYsIDB4NDVFNSwgMHg0OEJBLCAweDQ1RUEsCisgICAgMHg0MkQ5LCAweDQ2MEYsIDB4NDhDQSwgMHg0NjEwLCAweDRBQzAsIDB4NDY0MSwgMHg0OEQ4LCAweDQ2NjUsIDB4M0M0RSwKKyAgICAweDQ2QTEsIDB4NDhFOSwgMHg0NkFFLCAweDNDNTEsIDB4NDZBRiwgMHg0OEVELCAweDQ3MEMsIDB4NDkwMiwgMHg0NzFGLAorICAgIDB4NEVGQiwgMHg0NzY0LCAweDQ5MTgsIDB4NDdFNiwgMHgzNzkwLCAweDQ3RkQsIDB4NDkyNCwgMHg0ODE2LCAweDQ5MkUsCisgICAgMHg0ODFFLCAweDRGMDEsIDB4NDg0NCwgMHg0MkY1LCAweDQ4NEUsIDB4NDkzQSwgMHg0OEI1LCAweDQ5NUIsIDB4NDlCMCwKKyAgICAweDQzMUYsIDB4NDlFNywgMHg0OUQyLCAweDQ5RkEsIDB4NDlENiwgMHg0QTA0LCAweDQ5REIsIDB4NEEyOSwgMHg0OURFLAorICAgIDB4NEFCQywgMHg0OUY2LCAweDRCMzgsIDB4MzVERiwgMHg0QjNCLCAweDRBMEUsIDB4NEI3RSwgMHg0QUMxLCAweDRCQzIsCisgICAgMHg0QTMzLCAweDRCQ0EsIDB4NEEzNSwgMHg0QkQyLCAweDRBMzcsIDB4NEJFOCwgMHgzQzQ2LCAweDRDMTcsIDB4NDMzNCwKKyAgICAweDRDMjAsIDB4NEE0OCwgMHg0QzM4LCAweDRBQzIsIDB4NENDNCwgMHg0QTg0LCAweDRDRDEsIDB4NEE4NywgMHg0Q0UxLAorICAgIDB4NEFDMywgMHg0RDA3LCAweDRBOUIsIDB4NEQ3NywgMHg0QUFCLCAweDRFMDAsIDB4MDRCMCwgMHg0RTAxLCAweDBCQjgsCisgICAgMHg0RTAyLCAweDQzNTIsIDB4NEUwMywgMHgwOEUzLCAweDRFMDQsIDB4MzdEOCwgMHg0RTA1LCAweDM3RDksIDB4NEUwNywKKyAgICAweDBFQUEsIDB4NEUwOCwgMHgwOUNFLCAweDRFMDksIDB4MDg3RSwgMHg0RTBBLCAweDA5Q0QsIDB4NEUwQiwgMHgwNTNDLAorICAgIDB4NEUwQywgMHg0QUM0LCAweDRFMEQsIDB4MERDNiwgMHg0RTBFLCAweDBGMjksIDB4NEUwRiwgMHg0MzUzLCAweDRFMTAsCisgICAgMHgwRkZCLCAweDRFMTEsIDB4MDREMSwgMHg0RTEyLCAweDQzNTQsIDB4NEUxNCwgMHgwNUNDLCAweDRFMTUsIDB4MEZGQywKKyAgICAweDRFMTYsIDB4MEE0OCwgMHg0RTE3LCAweDEwRDcsIDB4NEUxOCwgMHgwNjcwLCAweDRFMTksIDB4MEUwQSwgMHg0RTFFLAorICAgIDB4MDlDRiwgMHg0RTFGLCAweDM3REEsIDB4NEUyMSwgMHgwRjg2LCAweDRFMjMsIDB4NEFDNSwgMHg0RTI0LCAweDRBQzYsCisgICAgMHg0RTI2LCAweDBFMTIsIDB4NEUyOCwgMHgyMEIzLCAweDRFMjksIDB4NDM1NSwgMHg0RTJBLCAweDBGRkQsIDB4NEUyQiwKKyAgICAweDM3REIsIDB4NEUyQywgMHgzNzRELCAweDRFMkQsIDB4MEJBNCwgMHg0RTJFLCAweDQzNTYsIDB4NEUyRiwgMHgzN0RDLAorICAgIDB4NEUzMCwgMHgzN0RELCAweDRFMzEsIDB4MEZGRSwgMHg0RTMyLCAweDA2RjIsIDB4NEUzNiwgMHgwRkZGLCAweDRFMzcsCisgICAgMHgzNjlELCAweDRFMzgsIDB4MDYxOSwgMHg0RTM5LCAweDBCNkUsIDB4NEUzQiwgMHgwOTEzLCAweDRFM0MsIDB4MTAwMCwKKyAgICAweDRFM0YsIDB4MTAwMSwgMHg0RTQwLCAweDM3REUsIDB4NEU0MSwgMHgzN0RGLCAweDRFNDIsIDB4MTAwMiwgMHg0RTQzLAorICAgIDB4MENFQiwgMHg0RTQ0LCAweDM3RTAsIDB4NEU0NSwgMHgwNjcxLCAweDRFNDcsIDB4NDM1NywgMHg0RTQ4LCAweDM3MkUsCisgICAgMHg0RTRCLCAweDBDRUQsIDB4NEU0RCwgMHgwQ0JCLCAweDRFNEUsIDB4MDc3NywgMHg0RTRGLCAweDBFNjEsIDB4NEU1MSwKKyAgICAweDQzNTksIDB4NEU1NSwgMHgxOTUwLCAweDRFNTYsIDB4MTAwMywgMHg0RTU3LCAweDA5RDAsIDB4NEU1OCwgMHgxMDA0LAorICAgIDB4NEU1OSwgMHgwNTM1LCAweDRFNUEsIDB4MzdFMSwgMHg0RTVELCAweDA2REQsIDB4NEU1RSwgMHgwN0E0LCAweDRFNUYsCisgICAgMHgwRUY1LCAweDRFNjIsIDB4MTIzMywgMHg0RTY5LCAweDQzNUMsIDB4NEU3MSwgMHgwRjVBLCAweDRFNzMsIDB4MENENSwKKyAgICAweDRFNzksIDB4NEFDNywgMHg0RTdFLCAweDA1RTEsIDB4NEU3RiwgMHgzN0UyLCAweDRFODAsIDB4MDY0RiwgMHg0RTgyLAorICAgIDB4MTAwNSwgMHg0RTg1LCAweDEwMDYsIDB4NEU4NiwgMHgwRjgzLCAweDRFODgsIDB4MEYyNywgMHg0RTg5LCAweDBBRUEsCisgICAgMHg0RThBLCAweDEwMDgsIDB4NEU4QiwgMHgwOEM0LCAweDRFOEMsIDB4MENDQiwgMHg0RThELCAweDM3RTMsIDB4NEU4RSwKKyAgICAweDEwMEIsIDB4NEU5MSwgMHgwNEUwLCAweDRFOTIsIDB4MDc5MywgMHg0RTk0LCAweDA3OTIsIDB4NEU5NSwgMHgwNEFBLAorICAgIDB4NEU5NiwgMHgzN0U0LCAweDRFOTgsIDB4MEZGMSwgMHg0RTk5LCAweDBGRjAsIDB4NEU5QiwgMHgwODIzLCAweDRFOUMsCisgICAgMHgwNDY1LCAweDRFOUQsIDB4NDM1RCwgMHg0RTlFLCAweDEwMEMsIDB4NEU5RiwgMHgxMDBELCAweDRFQTAsIDB4MTAwRSwKKyAgICAweDRFQTEsIDB4MEU2MiwgMHg0RUEyLCAweDEwMEYsIDB4NEVBNCwgMHgwN0E2LCAweDRFQTUsIDB4MDRBQiwgMHg0RUE2LAorICAgIDB4MEVBMCwgMHg0RUE4LCAweDA2OTYsIDB4NEVBQiwgMHgwNjk3LCAweDRFQUMsIDB4MDY5OCwgMHg0RUFELCAweDBCRkUsCisgICAgMHg0RUFFLCAweDBGODQsIDB4NEVCMCwgMHgxMDEwLCAweDRFQjMsIDB4MTAxMSwgMHg0RUI2LCAweDEwMTIsIDB4NEVCOSwKKyAgICAweDM3RTUsIDB4NEVCQSwgMHgwQTEzLCAweDRFQkIsIDB4MzYyMCwgMHg0RUJDLCAweDQzNUYsIDB4NEVDMCwgMHgwOTQ0LAorICAgIDB4NEVDMSwgMHgwQTE0LCAweDRFQzIsIDB4MTAxNywgMHg0RUMzLCAweDQzNjAsIDB4NEVDNCwgMHgxMDE1LCAweDRFQzYsCisgICAgMHgxMDE2LCAweDRFQzcsIDB4MDY3MiwgMHg0RUM4LCAweDQzNjEsIDB4NEVDQSwgMHgwODEzLCAweDRFQ0IsIDB4MDU3MCwKKyAgICAweDRFQ0QsIDB4MTAxNCwgMHg0RUNFLCAweDEwMTMsIDB4NEVDRiwgMHgwREY5LCAweDRFRDAsIDB4MzdFNiwgMHg0RUQ0LAorICAgIDB4MDg5NCwgMHg0RUQ1LCAweDA4OTMsIDB4NEVENiwgMHgwQjFFLCAweDRFRDcsIDB4MTAxOCwgMHg0RUQ4LCAweDBEQzcsCisgICAgMHg0RUQ5LCAweDBBOEIsIDB4NEVEQSwgMHg0MzYzLCAweDRFREQsIDB4MDI5MCwgMHg0RURFLCAweDEwMTksIDB4NEVERiwKKyAgICAweDEwMUIsIDB4NEVFMCwgMHgzN0U3LCAweDRFRTEsIDB4MjBCNCwgMHg0RUUzLCAweDBCNDUsIDB4NEVFNCwgMHgwRkE5LAorICAgIDB4NEVFNSwgMHgwNDhFLCAweDRFRUIsIDB4NDM2MiwgMHg0RUVELCAweDEwMUEsIDB4NEVFRSwgMHgwNTNFLCAweDRFRjAsCisgICAgMHgwNkJDLCAweDRFRjEsIDB4NDM2NCwgMHg0RUYyLCAweDBCQTUsIDB4NEVGMywgMHg0QUM4LCAweDRFRjUsIDB4NDM2NSwKKyAgICAweDRFRjYsIDB4MDc0NSwgMHg0RUY3LCAweDEwMUMsIDB4NEVGQiwgMHgwQ0RBLCAweDRFRkMsIDB4MjBCNSwgMHg0RUZELAorICAgIDB4MzdFOCwgMHg0RUZGLCAweDM3RTksIDB4NEYwMCwgMHgyMEI2LCAweDRGMDEsIDB4MDYyNywgMHg0RjAzLCAweDIwQjcsCisgICAgMHg0RjA5LCAweDEwMUQsIDB4NEYwQSwgMHgwNDhGLCAweDRGMEIsIDB4MzdFQSwgMHg0RjBDLCAweDRBQzksIDB4NEYwRCwKKyAgICAweDA3OTQsIDB4NEYwRSwgMHgwNjI4LCAweDRGMEYsIDB4MERFQywgMHg0RjEwLCAweDBENDYsIDB4NEYxMSwgMHgwNjczLAorICAgIDB4NEYxNSwgMHgzN0VCLCAweDRGMTYsIDB4NDM2NiwgMHg0RjE5LCAweDRBQ0EsIDB4NEYxQSwgMHgwNTcxLCAweDRGMUMsCisgICAgMHgxMDQwLCAweDRGMUQsIDB4MEMzQiwgMHg0RjJCLCAweDRBQ0IsIDB4NEYyRSwgMHg0QUNDLCAweDRGMkYsIDB4MEQyMiwKKyAgICAweDRGMzAsIDB4MTAxRiwgMHg0RjMxLCAweDRBQ0QsIDB4NEYzNCwgMHgwRDUwLCAweDRGMzYsIDB4MEZBQSwgMHg0RjM3LAorICAgIDB4NDM2OCwgMHg0RjM4LCAweDA5RjMsIDB4NEYzOSwgMHgyMEI4LCAweDRGM0EsIDB4MDg5NSwgMHg0RjNCLCAweDM3RUQsCisgICAgMHg0RjNDLCAweDA4QzUsIDB4NEYzRCwgMHgwNTQwLCAweDRGM0UsIDB4NDM2OSwgMHg0RjQzLCAweDBCRUQsIDB4NEY0NiwKKyAgICAweDBCNjAsIDB4NEY0NywgMHgxMDIzLCAweDRGNDgsIDB4NDE4QiwgMHg0RjQ5LCAweDM3RUUsIDB4NEY0RCwgMHgwNDkwLAorICAgIDB4NEY0RSwgMHgwQkZGLCAweDRGNEYsIDB4MDk0NSwgMHg0RjUwLCAweDA4MjQsIDB4NEY1MSwgMHgwRjBFLCAweDRGNTMsCisgICAgMHgwQjJFLCAweDRGNTQsIDB4MzdFRiwgMHg0RjU1LCAweDA1M0YsIDB4NEY1NiwgMHgyMEI5LCAweDRGNTcsIDB4MTAyMiwKKyAgICAweDRGNTgsIDB4NDM2QSwgMHg0RjU5LCAweDBGMjgsIDB4NEY1QSwgMHgxMDFFLCAweDRGNUIsIDB4MTAyMCwgMHg0RjVDLAorICAgIDB4MDg1RSwgMHg0RjVELCAweDEwMjEsIDB4NEY1RSwgMHgxMUQzLCAweDRGNUYsIDB4NDE4QywgMHg0RjYwLCAweDM3RUMsCisgICAgMHg0RjY0LCAweDQzNjcsIDB4NEY2OSwgMHgxMDI5LCAweDRGNkEsIDB4NDE4RCwgMHg0RjZDLCAweDQxOEUsIDB4NEY2RiwKKyAgICAweDEwMkMsIDB4NEY3MCwgMHgxMDJBLCAweDRGNzMsIDB4MDU0MiwgMHg0Rjc1LCAweDBFMEIsIDB4NEY3NiwgMHgxMDI0LAorICAgIDB4NEY3NywgMHg0MzZDLCAweDRGNzgsIDB4NDM2RCwgMHg0RjdBLCAweDM3RjAsIDB4NEY3QiwgMHgxMDI4LCAweDRGN0MsCisgICAgMHgwN0E3LCAweDRGN0QsIDB4MzdGMSwgMHg0RjdFLCAweDM3RjIsIDB4NEY3RiwgMHgwODk2LCAweDRGODIsIDB4NDM2RSwKKyAgICAweDRGODMsIDB4MDVFMiwgMHg0Rjg0LCAweDRBQ0UsIDB4NEY4NSwgMHg0MzZGLCAweDRGODYsIDB4MTAyRCwgMHg0Rjg4LAorICAgIDB4MTAyNSwgMHg0RjhBLCAweDIwQkIsIDB4NEY4QiwgMHgwRkFCLCAweDRGOEQsIDB4MDhDNiwgMHg0RjhGLCAweDEwMjYsCisgICAgMHg0RjkxLCAweDEwMkIsIDB4NEY5MiwgMHgyMEJBLCAweDRGOTQsIDB4MjBCRCwgMHg0Rjk2LCAweDEwMkUsIDB4NEY5NywKKyAgICAweDM3RjMsIDB4NEY5OCwgMHgxMDI3LCAweDRGOUEsIDB4MjBCQywgMHg0RjlCLCAweDA2OTksIDB4NEY5RCwgMHgwNDkxLAorICAgIDB4NEY5RSwgMHg0QUNGLCAweDRGQTAsIDB4MDY5QSwgMHg0RkExLCAweDA1NDEsIDB4NEZBQiwgMHgxMUQ0LCAweDRGQUQsCisgICAgMHgwRUE3LCAweDRGQUUsIDB4MERFMCwgMHg0RkFGLCAweDA3QTgsIDB4NEZCMiwgMHg0MzcxLCAweDRGQjUsIDB4MDlGNSwKKyAgICAweDRGQjYsIDB4MEY3RiwgMHg0RkI3LCAweDRBRDAsIDB4NEZCRSwgMHgzN0Y0LCAweDRGQkYsIDB4MEUyOCwgMHg0RkMyLAorICAgIDB4MDcwRSwgMHg0RkMzLCAweDBCMDUsIDB4NEZDNCwgMHgwNTY0LCAweDRGQzUsIDB4NDM3MiwgMHg0RkM5LCAweDIwQUMsCisgICAgMHg0RkNBLCAweDA5NUQsIDB4NEZDQiwgMHg0MzczLCAweDRGQ0QsIDB4MjBCRSwgMHg0RkNFLCAweDEwMzIsIDB4NEZDRiwKKyAgICAweDM3RjUsIDB4NEZEMCwgMHgxMDM3LCAweDRGRDEsIDB4MTAzNSwgMHg0RkQyLCAweDQzNzQsIDB4NEZEMywgMHgzQzJGLAorICAgIDB4NEZENCwgMHgxMDMwLCAweDRGRDcsIDB4MEIwRiwgMHg0RkQ4LCAweDEwMzMsIDB4NEZEQSwgMHgxMDM2LCAweDRGREIsCisgICAgMHgxMDM0LCAweDRGREQsIDB4MEUyRCwgMHg0RkRGLCAweDEwMzEsIDB4NEZFMCwgMHgxREVDLCAweDRGRTEsIDB4MDlGNCwKKyAgICAweDRGRTMsIDB4MEVBMSwgMHg0RkU0LCAweDEwMzgsIDB4NEZFNSwgMHgxMDM5LCAweDRGRTYsIDB4NDM3MCwgMHg0RkVFLAorICAgIDB4MDkyRSwgMHg0RkVGLCAweDEwNDYsIDB4NEZGMSwgMHgzNUEzLCAweDRGRjIsIDB4NDM3NiwgMHg0RkYzLCAweDBEMDYsCisgICAgMHg0RkY1LCAweDBEQTgsIDB4NEZGNiwgMHgxMDQxLCAweDRGRjgsIDB4MEU0MCwgMHg0RkZBLCAweDA1MzYsIDB4NEZGRCwKKyAgICAweDM3RjYsIDB4NEZGRSwgMHgxMDQ1LCAweDRGRkYsIDB4MjBDMSwgMHg1MDAwLCAweDM3RjcsIDB4NTAwMSwgMHgzN0Y4LAorICAgIDB4NTAwMiwgMHg0RjRCLCAweDUwMDQsIDB4NEFEMSwgMHg1MDA1LCAweDEwM0YsIDB4NTAwNiwgMHgxMDQ4LCAweDUwMDksCisgICAgMHgwQUQ0LCAweDUwMEIsIDB4MDc3OCwgMHg1MDBDLCAweDRBRDIsIDB4NTAwRCwgMHgwRDEyLCAweDUwMEUsIDB4NDE4RiwKKyAgICAweDUwMEYsIDB4MTYwMCwgMHg1MDEwLCAweDM3RjksIDB4NTAxMSwgMHgxMDQ3LCAweDUwMTIsIDB4MEM1NywgMHg1MDEzLAorICAgIDB4NDM3NywgMHg1MDE0LCAweDEwM0MsIDB4NTAxNiwgMHgwN0FBLCAweDUwMTgsIDB4NDE5MCwgMHg1MDE5LCAweDA3QTksCisgICAgMHg1MDFBLCAweDEwM0EsIDB4NTAxQiwgMHgzN0ZBLCAweDUwMUMsIDB4NDM3OCwgMHg1MDFFLCAweDIwQzIsIDB4NTAxRiwKKyAgICAweDA5MDYsIDB4NTAyMSwgMHgxMDQyLCAweDUwMjIsIDB4MjBDMCwgMHg1MDIzLCAweDBFM0YsIDB4NTAyNCwgMHgwQjhCLAorICAgIDB4NTAyNSwgMHgxMDNFLCAweDUwMjYsIDB4MDc0NywgMHg1MDI3LCAweDM3RkIsIDB4NTAyOCwgMHgxMDNCLCAweDUwMjksCisgICAgMHgxMDQzLCAweDUwMkEsIDB4MTAzRCwgMHg1MDJCLCAweDBGOTksIDB4NTAyQywgMHgxMDQ0LCAweDUwMkQsIDB4MEZFNywKKyAgICAweDUwMkUsIDB4MzdGQywgMHg1MDM2LCAweDA2REUsIDB4NTAzOSwgMHgwNzQ2LCAweDUwM0IsIDB4MzgwMCwgMHg1MDQwLAorICAgIDB4MjBCRiwgMHg1MDQxLCAweDQxOTEsIDB4NTA0MiwgMHgyMEM1LCAweDUwNDMsIDB4MTA0OSwgMHg1MDQ2LCAweDIwQzMsCisgICAgMHg1MDQ3LCAweDEwNEEsIDB4NTA0OCwgMHgxMDRFLCAweDUwNDksIDB4MDQ5MiwgMHg1MDRDLCAweDRBRDMsIDB4NTA0RSwKKyAgICAweDQzNzksIDB4NTA0RiwgMHgwRTIwLCAweDUwNTAsIDB4MTA0RCwgMHg1MDUzLCAweDQzN0EsIDB4NTA1NSwgMHgxMDRDLAorICAgIDB4NTA1NiwgMHgxMDUwLCAweDUwNTcsIDB4MzdGRCwgMHg1MDVBLCAweDEwNEYsIDB4NTA1QywgMHgwQzAwLCAweDUwNUYsCisgICAgMHg0QUQ0LCAweDUwNjIsIDB4NEFENSwgMHg1MDYzLCAweDQzN0IsIDB4NTA2NSwgMHgwNzQ4LCAweDUwNjYsIDB4MzdGRSwKKyAgICAweDUwNkEsIDB4MzdGRiwgMHg1MDZDLCAweDEwNTEsIDB4NTA3MCwgMHgyMEM0LCAweDUwNzIsIDB4MDhGMSwgMHg1MDc0LAorICAgIDB4MEIwNiwgMHg1MDc1LCAweDBDMDEsIDB4NTA3NiwgMHgwNkVFLCAweDUwNzcsIDB4NEFENiwgMHg1MDc4LCAweDEwNTIsCisgICAgMHg1MDdELCAweDA2NTAsIDB4NTA4MCwgMHgxMDUzLCAweDUwODUsIDB4MTA1NSwgMHg1MDg4LCAweDQzN0QsIDB4NTA4RCwKKyAgICAweDBFNjMsIDB4NTA4RSwgMHg0QUQ3LCAweDUwOEYsIDB4MzgwMSwgMHg1MDkxLCAweDA3M0MsIDB4NTA5MiwgMHg0MzdFLAorICAgIDB4NTA5MywgMHg0MzdGLCAweDUwOTQsIDB4MjBDNiwgMHg1MDk1LCAweDQzODAsIDB4NTA5NiwgMHgzODAyLCAweDUwOTgsCisgICAgMHgwODdGLCAweDUwOTksIDB4MEQ4QiwgMHg1MDlBLCAweDEwNTQsIDB4NTA5QywgMHgzODAzLCAweDUwOUUsIDB4NEFEOCwKKyAgICAweDUwQTIsIDB4NEFEOSwgMHg1MEEzLCAweDQzN0MsIDB4NTBBQSwgMHg0MzgxLCAweDUwQUMsIDB4MDgzNSwgMHg1MEFELAorICAgIDB4MEYyRCwgMHg1MEIxLCAweDQzODMsIDB4NTBCMiwgMHgxMDU3LCAweDUwQjMsIDB4MTA1QSwgMHg1MEI0LCAweDEwNTYsCisgICAgMHg1MEI1LCAweDA4MzQsIDB4NTBCNywgMHgwOTg3LCAweDUwQkEsIDB4NDM4NCwgMHg1MEJCLCAweDQzODUsIDB4NTBCRSwKKyAgICAweDA3MEYsIDB4NTBDMiwgMHgxMDVCLCAweDUwQzMsIDB4NEFEQSwgMHg1MEM0LCAweDQzODYsIDB4NTBDNSwgMHgwNkM3LAorICAgIDB4NTBDNywgMHg0Mzg3LCAweDUwQzksIDB4MTA1OCwgMHg1MENBLCAweDEwNTksIDB4NTBDQywgMHgzODA0LCAweDUwQ0QsCisgICAgMHgwQzg3LCAweDUwQ0UsIDB4NDM4QSwgMHg1MENGLCAweDBBRkUsIDB4NTBEMCwgMHg0MTkzLCAweDUwRDEsIDB4MDY5QiwKKyAgICAweDUwRDQsIDB4NDM4QywgMHg1MEQ1LCAweDBFN0IsIDB4NTBENiwgMHgxMDVDLCAweDUwRDgsIDB4MjBDOCwgMHg1MEQ5LAorICAgIDB4M0MzMCwgMHg1MERBLCAweDBGODUsIDB4NTBERSwgMHgxMDVELCAweDUwRTEsIDB4NDM4RCwgMHg1MEUzLCAweDEwNjAsCisgICAgMHg1MEU1LCAweDEwNUUsIDB4NTBFNiwgMHgzODA1LCAweDUwRTcsIDB4MEFEMCwgMHg1MEU4LCAweDRBREIsIDB4NTBFOSwKKyAgICAweDM4MDYsIDB4NTBFRCwgMHgxMDVGLCAweDUwRUUsIDB4MTA2MSwgMHg1MEVGLCAweDM4MDcsIDB4NTBGMCwgMHgzQzMxLAorICAgIDB4NTBGMSwgMHg0QURDLCAweDUwRjIsIDB4NDE5MiwgMHg1MEYzLCAweDQzODgsIDB4NTBGNCwgMHgyMEM3LCAweDUwRjUsCisgICAgMHgxMDYzLCAweDUwRjksIDB4MTA2MiwgMHg1MEZCLCAweDBFMTgsIDB4NTBGRSwgMHg0QURELCAweDUxMDAsIDB4MDY1MSwKKyAgICAweDUxMDEsIDB4MTA2NSwgMHg1MTAyLCAweDEwNjYsIDB4NTEwMywgMHg0MTk1LCAweDUxMDQsIDB4MDUyRiwgMHg1MTA2LAorICAgIDB4NDE5NCwgMHg1MTA3LCAweDRBREUsIDB4NTEwOCwgMHgzODA4LCAweDUxMDksIDB4MTA2NCwgMHg1MTBCLCAweDM4MDksCisgICAgMHg1MTBDLCAweDRBREYsIDB4NTEwRCwgMHg0QUUwLCAweDUxMEUsIDB4NEFFMSwgMHg1MTEwLCAweDM4MEEsIDB4NTExMiwKKyAgICAweDA5MjAsIDB4NTExNCwgMHgxMDY5LCAweDUxMTUsIDB4MTA2OCwgMHg1MTE2LCAweDEwNjcsIDB4NTExNywgMHg0MzkwLAorICAgIDB4NTExOCwgMHgxMDJGLCAweDUxMUEsIDB4MTA2QSwgMHg1MTFCLCAweDM4MEIsIDB4NTExRSwgMHgzODBDLCAweDUxMUYsCisgICAgMHgwOTg4LCAweDUxMjEsIDB4MTA2QiwgMHg1MTJBLCAweDBGMEYsIDB4NTEzMiwgMHgwRUU1LCAweDUxMzMsIDB4NEFFMiwKKyAgICAweDUxMzUsIDB4NDE5NiwgMHg1MTM3LCAweDEwNkQsIDB4NTEzOCwgMHg0QUUzLCAweDUxM0EsIDB4MTA2QywgMHg1MTNCLAorICAgIDB4MTA2RiwgMHg1MTNDLCAweDEwNkUsIDB4NTEzRiwgMHgxMDcwLCAweDUxNDAsIDB4MTA3MSwgMHg1MTQxLCAweDA0QjgsCisgICAgMHg1MTQzLCAweDA3NjksIDB4NTE0NCwgMHgwNzExLCAweDUxNDUsIDB4MDk0NiwgMHg1MTQ2LCAweDBCQjksIDB4NTE0NywKKyAgICAweDA2OUMsIDB4NTE0OCwgMHgwQThDLCAweDUxNDksIDB4MDdBQiwgMHg1MTRBLCAweDIwQzksIDB4NTE0QiwgMHgwODAwLAorICAgIDB4NTE0QywgMHgxMDczLCAweDUxNEQsIDB4MEVENCwgMHg1MTRFLCAweDBDNDAsIDB4NTE1MCwgMHgwOEM3LCAweDUxNTIsCisgICAgMHgxMDcyLCAweDUxNTQsIDB4MTA3NCwgMHg1MTU1LCAweDQxOTcsIDB4NTE1NywgMHg0MTk4LCAweDUxNUEsIDB4MEM1OCwKKyAgICAweDUxNUMsIDB4MDVEMywgMHg1MTVGLCAweDM4MEQsIDB4NTE2MCwgMHg0MzkyLCAweDUxNjIsIDB4MTA3NSwgMHg1MTY0LAorICAgIDB4MjBDQSwgMHg1MTY1LCAweDBDRDYsIDB4NTE2NywgMHgzNjhFLCAweDUxNjgsIDB4MEFCNiwgMHg1MTY5LCAweDEwNzcsCisgICAgMHg1MTZBLCAweDEwNzgsIDB4NTE2QiwgMHgwRDQwLCAweDUxNkMsIDB4MDdBQywgMHg1MTZELCAweDBGRTEsIDB4NTE2RSwKKyAgICAweDEwNzksIDB4NTE3MSwgMHgwNjlFLCAweDUxNzMsIDB4NDM5NCwgMHg1MTc0LCAweDRBRTQsIDB4NTE3NSwgMHgwRTBDLAorICAgIDB4NTE3NiwgMHgwQjE2LCAweDUxNzcsIDB4MDZFOSwgMHg1MTc4LCAweDBDMkYsIDB4NTE3OSwgMHgzNzc5LCAweDUxN0IsCisgICAgMHg0N0Q5LCAweDUxN0MsIDB4MDc0OSwgMHg1MTgwLCAweDEwN0EsIDB4NTE4MiwgMHgxMDdCLCAweDUxODMsIDB4NDM5NSwKKyAgICAweDUxODQsIDB4NEFFNSwgMHg1MTg1LCAweDBDQkEsIDB4NTE4NiwgMHgwNTAxLCAweDUxODksIDB4MTA3RSwgMHg1MThBLAorICAgIDB4MDg2RCwgMHg1MThCLCAweDQzOTYsIDB4NTE4QywgMHgxMDdELCAweDUxOEQsIDB4MDgzNiwgMHg1MThGLCAweDEwN0YsCisgICAgMHg1MTkwLCAweDE4NUIsIDB4NTE5MSwgMHgxMDgwLCAweDUxOTIsIDB4MEU2RiwgMHg1MTkzLCAweDEwODEsIDB4NTE5NSwKKyAgICAweDEwODIsIDB4NTE5NiwgMHgxMDgzLCAweDUxOTcsIDB4MDlEMSwgMHg1MTk4LCAweDQzOTgsIDB4NTE5OSwgMHgwOEY4LAorICAgIDB4NTE5RCwgMHgyMENCLCAweDUxQTAsIDB4MDVFMywgMHg1MUExLCAweDM4MEUsIDB4NTFBMiwgMHgxMDg2LCAweDUxQTMsCisgICAgMHg0Mzk5LCAweDUxQTQsIDB4MTA4NCwgMHg1MUE1LCAweDBFQzksIDB4NTFBNiwgMHgxMDg1LCAweDUxQTgsIDB4MERDQywKKyAgICAweDUxQTksIDB4MTA4NywgMHg1MUFBLCAweDEwODgsIDB4NTFBQiwgMHgxMDg5LCAweDUxQUMsIDB4MEM1OSwgMHg1MUFELAorICAgIDB4NDM5QSwgMHg1MUIwLCAweDEwOEQsIDB4NTFCMSwgMHgxMDhCLCAweDUxQjIsIDB4MTA4QywgMHg1MUIzLCAweDEwOEEsCisgICAgMHg1MUI0LCAweDA4NTMsIDB4NTFCNSwgMHgxMDhFLCAweDUxQjYsIDB4MEVGNiwgMHg1MUI3LCAweDBGQUMsIDB4NTFCOCwKKyAgICAweDRBRTYsIDB4NTFCQSwgMHg0QUU3LCAweDUxQkMsIDB4MzgwRiwgMHg1MUJELCAweDEwOEYsIDB4NTFCRSwgMHgyMENDLAorICAgIDB4NTFDMywgMHgzQzMyLCAweDUxQzQsIDB4MEE0QywgMHg1MUM1LCAweDEwOTAsIDB4NTFDNiwgMHgwOTY0LCAweDUxQzgsCisgICAgMHg0QUU4LCAweDUxQzksIDB4MTA5MSwgMHg1MUNBLCAweDQxOUEsIDB4NTFDQiwgMHgwQkJBLCAweDUxQ0MsIDB4MEY4NywKKyAgICAweDUxQ0QsIDB4MEM1QSwgMHg1MUNGLCAweDRBRTksIDB4NTFEMSwgMHg0QUVBLCAweDUxRDMsIDB4NEFFQiwgMHg1MUQ0LAorICAgIDB4NEFFQywgMHg1MUQ2LCAweDEwREEsIDB4NTFEOCwgMHg0QUVELCAweDUxREIsIDB4MTA5MiwgMHg1MURDLCAweDIwNUMsCisgICAgMHg1MURELCAweDA2QkQsIDB4NTFERSwgMHg0RjRDLCAweDUxREYsIDB4NEFFRSwgMHg1MUUwLCAweDEwOTMsIDB4NTFFMSwKKyAgICAweDBFOEMsIDB4NTFFMiwgMHg0MTlCLCAweDUxRTYsIDB4MDk3MiwgMHg1MUU3LCAweDBCNUMsIDB4NTFFOSwgMHgxMDk1LAorICAgIDB4NTFFQSwgMHgwQ0JDLCAweDUxRUMsIDB4MjBDRCwgMHg1MUVELCAweDEwOTYsIDB4NTFFRSwgMHgzODExLCAweDUxRjAsCisgICAgMHgxMDk3LCAweDUxRjEsIDB4MDU4QywgMHg1MUYzLCAweDQzOUQsIDB4NTFGNCwgMHgzODEyLCAweDUxRjUsIDB4MTA5OCwKKyAgICAweDUxRjYsIDB4MDY5RiwgMHg1MUY4LCAweDBDQTQsIDB4NTFGOSwgMHgwNTFDLCAweDUxRkEsIDB4MDk1QSwgMHg1MUZELAorICAgIDB4MEQzNSwgMHg1MUZFLCAweDEwOTksIDB4NTIwMCwgMHgwQzVCLCAweDUyMDEsIDB4MzgxMywgMHg1MjAyLCAweDM4MTQsCisgICAgMHg1MjAzLCAweDBBMTUsIDB4NTIwNCwgMHgxMDlBLCAweDUyMDUsIDB4NEFFRiwgMHg1MjA2LCAweDBERkMsIDB4NTIwNywKKyAgICAweDBBN0UsIDB4NTIwOCwgMHgwNURFLCAweDUyMEEsIDB4MDVFNSwgMHg1MjBCLCAweDEwOUIsIDB4NTIwRSwgMHgxMDlELAorICAgIDB4NTIxMSwgMHgwNzEwLCAweDUyMTIsIDB4NDM5RSwgMHg1MjEzLCAweDM4MTUsIDB4NTIxNCwgMHgxMDlDLCAweDUyMTUsCisgICAgMHgyMENFLCAweDUyMTYsIDB4NDM5RiwgMHg1MjE3LCAweDBGQkIsIDB4NTIxRCwgMHgwOTczLCAweDUyMjQsIDB4MEQ1MSwKKyAgICAweDUyMjUsIDB4MEUxQywgMHg1MjI2LCAweDRBRjAsIDB4NTIyNywgMHgxMDlFLCAweDUyMjgsIDB4NEFGMSwgMHg1MjI5LAorICAgIDB4MEY2MiwgMHg1MjJBLCAweDEwOUYsIDB4NTIyQiwgMHg0QUYyLCAweDUyMkUsIDB4MTBBMCwgMHg1MjMwLCAweDBDNzgsCisgICAgMHg1MjMxLCAweDRBRjMsIDB4NTIzMiwgMHg0QUY0LCAweDUyMzMsIDB4MTBBMSwgMHg1MjM1LCAweDRBRjUsIDB4NTIzNiwKKyAgICAweDBBNEQsIDB4NTIzNywgMHgwODZFLCAweDUyMzgsIDB4MDc0QSwgMHg1MjM5LCAweDEwQTIsIDB4NTIzQSwgMHgwODk3LAorICAgIDB4NTIzQiwgMHgwODAxLCAweDUyM0MsIDB4NEFGNiwgMHg1MjQzLCAweDBDMDIsIDB4NTI0NCwgMHgxMEE0LCAweDUyNDcsCisgICAgMHgwQjA3LCAweDUyNDksIDB4MzgxNiwgMHg1MjRBLCAweDA4NUYsIDB4NTI0QiwgMHgxMEE1LCAweDUyNEMsIDB4MTBBNiwKKyAgICAweDUyNEQsIDB4MEFCMiwgMHg1MjRGLCAweDEwQTMsIDB4NTI1NCwgMHgxMEE4LCAweDUyNTUsIDB4NDNBMSwgMHg1MjU2LAorICAgIDB4MEU2NCwgMHg1MjU3LCAweDQxOUMsIDB4NTI1QSwgMHg0QUY3LCAweDUyNUIsIDB4MDdGNiwgMHg1MjVDLCAweDQzQTIsCisgICAgMHg1MjVELCAweDFFNUUsIDB4NTI1RSwgMHgxMEE3LCAweDUyNjAsIDB4NEFGOCwgMHg1MjYxLCAweDM4MTcsIDB4NTI2MywKKyAgICAweDA3NEIsIDB4NTI2NCwgMHgwODRFLCAweDUyNjUsIDB4MEQyMywgMHg1MjY2LCAweDM4MTgsIDB4NTI2OSwgMHgxMEFCLAorICAgIDB4NTI2QSwgMHgxMEE5LCAweDUyNkMsIDB4NDNBMywgMHg1MjZFLCAweDRBRjksIDB4NTI2RiwgMHgwREVELCAweDUyNzAsCisgICAgMHgwOUQyLCAweDUyNzEsIDB4MTBCMiwgMHg1MjcyLCAweDA1QzIsIDB4NTI3MywgMHgxMEFDLCAweDUyNzQsIDB4MTBBQSwKKyAgICAweDUyNzUsIDB4MEFEMSwgMHg1Mjc3LCAweDQzQTQsIDB4NTI3OCwgMHg0QUZBLCAweDUyNzksIDB4NEFGQiwgMHg1MjdELAorICAgIDB4MTBBRSwgMHg1MjdGLCAweDEwQUQsIDB4NTI4MiwgMHg0M0E2LCAweDUyODMsIDB4MDVBMiwgMHg1Mjg0LCAweDQzQTUsCisgICAgMHg1Mjg3LCAweDA3MzYsIDB4NTI4OCwgMHgxMEIzLCAweDUyODksIDB4MEY3NSwgMHg1MjhBLCAweDRBRkMsIDB4NTI4QywKKyAgICAweDRBRkQsIDB4NTI4RCwgMHgxMEFGLCAweDUyOTEsIDB4MTBCNCwgMHg1MjkyLCAweDEwQjEsIDB4NTI5MywgMHgzODE5LAorICAgIDB4NTI5NCwgMHgxMEIwLCAweDUyOTgsIDB4NDNBOCwgMHg1MjlCLCAweDBGOTcsIDB4NTI5QywgMHgyMENGLCAweDUyOUYsCisgICAgMHgwN0FELCAweDUyQTAsIDB4MDU0MywgMHg1MkEzLCAweDBGQkMsIDB4NTJBNCwgMHg0M0FBLCAweDUyQTYsIDB4MjBEMCwKKyAgICAweDUyQTksIDB4MDk3RiwgMHg1MkFBLCAweDBDNTIsIDB4NTJBQiwgMHgwN0Y3LCAweDUyQUMsIDB4MTBCNywgMHg1MkFELAorICAgIDB4MTBCOCwgMHg1MkFGLCAweDIxN0QsIDB4NTJCMSwgMHgwRkFELCAweDUyQjQsIDB4MEZEMSwgMHg1MkI1LCAweDEwQkEsCisgICAgMHg1MkI5LCAweDA3QUUsIDB4NTJCQSwgMHg0M0FCLCAweDUyQkIsIDB4NDNBQywgMHg1MkJDLCAweDEwQjksIDB4NTJCRSwKKyAgICAweDA1OEQsIDB4NTJDMCwgMHgyMEQxLCAweDUyQzEsIDB4MTBCQiwgMHg1MkMzLCAweDBFODQsIDB4NTJDNSwgMHgwQkQ4LAorICAgIDB4NTJDNywgMHgwRjEwLCAweDUyQzgsIDB4MzgxQSwgMHg1MkM5LCAweDBFMjksIDB4NTJDQSwgMHg0M0FELCAweDUyQ0MsCisgICAgMHg0MTlELCAweDUyQ0QsIDB4MTBCQywgMHg1MkQwLCAweDM2RTgsIDB4NTJEMSwgMHg0M0FFLCAweDUyRDIsIDB4MUJFRSwKKyAgICAweDUyRDUsIDB4MEM4OCwgMHg1MkQ2LCAweDQxOUUsIDB4NTJENywgMHgxMEJELCAweDUyRDgsIDB4MDVFNiwgMHg1MkQ5LAorICAgIDB4MEVCRiwgMHg1MkRCLCAweDIwRDIsIDB4NTJERCwgMHgwOTg5LCAweDUyREUsIDB4MTBCRSwgMHg1MkRGLCAweDBFMzcsCisgICAgMHg1MkUwLCAweDEwQzIsIDB4NTJFMSwgMHg0QUZFLCAweDUyRTIsIDB4MEE0RSwgMHg1MkUzLCAweDEwQkYsIDB4NTJFNCwKKyAgICAweDA2QzgsIDB4NTJFNiwgMHgxMEMwLCAweDUyRTcsIDB4MDVFNywgMHg1MkU5LCAweDRBRkYsIDB4NTJGMCwgMHgzODFCLAorICAgIDB4NTJGMSwgMHg0QjAwLCAweDUyRjIsIDB4MDcwNCwgMHg1MkYzLCAweDEwQzMsIDB4NTJGNSwgMHgxMEM0LCAweDUyRjcsCisgICAgMHg0M0IwLCAweDUyRjgsIDB4MTBDNSwgMHg1MkY5LCAweDEwQzYsIDB4NTJGQSwgMHgwOTA3LCAweDUyRkIsIDB4NDE5RiwKKyAgICAweDUyRkUsIDB4MDdBRiwgMHg1MkZGLCAweDBFRUEsIDB4NTMwMCwgMHgyMEQzLCAweDUzMDEsIDB4MEVGNCwgMHg1MzAyLAorICAgIDB4MENDRiwgMHg1MzAzLCAweDRCMDEsIDB4NTMwNSwgMHgwRTQxLCAweDUzMDYsIDB4MTBDNywgMHg1MzA3LCAweDRGNEQsCisgICAgMHg1MzA4LCAweDEwQzgsIDB4NTMwQSwgMHgzODFDLCAweDUzMEIsIDB4MzgxRCwgMHg1MzBELCAweDEwQ0EsIDB4NTMwRiwKKyAgICAweDEwQ0MsIDB4NTMxMCwgMHgxMENCLCAweDUzMTEsIDB4NEIwMiwgMHg1MzE1LCAweDEwQ0QsIDB4NTMxNiwgMHgwNTNELAorICAgIDB4NTMxNywgMHgwRTdBLCAweDUzMTksIDB4MDg2QywgMHg1MzFBLCAweDEwQ0UsIDB4NTMxQywgMHg0MUEwLCAweDUzMUQsCisgICAgMHgwQURCLCAweDUzMUYsIDB4NEIwMywgMHg1MzIwLCAweDA5OEEsIDB4NTMyMSwgMHgwNkExLCAweDUzMjMsIDB4MTBDRiwKKyAgICAweDUzMjQsIDB4MjBENSwgMHg1MzJBLCAweDBENkYsIDB4NTMyRCwgMHg0QjA0LCAweDUzMkYsIDB4MTBEMCwgMHg1MzMxLAorICAgIDB4MTBEMSwgMHg1MzMyLCAweDRCMDUsIDB4NTMzMywgMHgxMEQyLCAweDUzMzUsIDB4NDNCMSwgMHg1MzM4LCAweDEwRDMsCisgICAgMHg1MzM5LCAweDBEOTYsIDB4NTMzQSwgMHgwNkUwLCAweDUzM0IsIDB4MDRBOSwgMHg1MzNELCAweDRCMDYsIDB4NTMzRSwKKyAgICAweDM4MUUsIDB4NTMzRiwgMHgwQzk3LCAweDUzNDAsIDB4MTBENCwgMHg1MzQxLCAweDA5NDcsIDB4NTM0MiwgMHg0M0IyLAorICAgIDB4NTM0MywgMHgwQThELCAweDUzNDUsIDB4MTBENiwgMHg1MzQ2LCAweDEwRDUsIDB4NTM0NywgMHgwOThCLCAweDUzNDgsCisgICAgMHgwNzk1LCAweDUzNDksIDB4MTBEOCwgMHg1MzRBLCAweDBENTIsIDB4NTM0QiwgMHgzODIwLCAweDUzNEMsIDB4MzgxRiwKKyAgICAweDUzNEQsIDB4MTBEOSwgMHg1MzUxLCAweDBENzAsIDB4NTM1MiwgMHgwQjE0LCAweDUzNTMsIDB4MEI0RSwgMHg1MzU0LAorICAgIDB4MDZBMCwgMHg1MzU3LCAweDBDQzYsIDB4NTM1OCwgMHgwQjZGLCAweDUzNUEsIDB4MEQyNCwgMHg1MzVDLCAweDBFN0MsCisgICAgMHg1MzVFLCAweDEwREIsIDB4NTM2MCwgMHgwQThFLCAweDUzNjEsIDB4MzgyMSwgMHg1MzYzLCAweDQxQTEsIDB4NTM2NSwKKyAgICAweDRCMDcsIDB4NTM2NiwgMHgwNzBCLCAweDUzNjcsIDB4NDNCNSwgMHg1MzY5LCAweDEwREMsIDB4NTM2QywgMHgzODIyLAorICAgIDB4NTM2RCwgMHg0QjA4LCAweDUzNkUsIDB4MTBERCwgMHg1MzZGLCAweDA0Q0UsIDB4NTM3MCwgMHgwNEI5LCAweDUzNzEsCisgICAgMHgwNjI5LCAweDUzNzIsIDB4MjBENiwgMHg1MzczLCAweDBCMDgsIDB4NTM3NCwgMHgwNjZCLCAweDUzNzUsIDB4MEY1QiwKKyAgICAweDUzNzcsIDB4MTBFMCwgMHg1Mzc4LCAweDA1MzcsIDB4NTM3OSwgMHg0QjA5LCAweDUzN0EsIDB4NDNCNiwgMHg1MzdCLAorICAgIDB4MTBERiwgMHg1MzdELCAweDM0MzUsIDB4NTM3RSwgMHg0QjBBLCAweDUzN0YsIDB4MDZBMiwgMHg1MzgyLCAweDEwRTEsCisgICAgMHg1Mzg0LCAweDBFRkQsIDB4NTM4OSwgMHgzN0QwLCAweDUzOTMsIDB4MjBENywgMHg1Mzk0LCAweDRCMEIsIDB4NTM5NiwKKyAgICAweDEwRTIsIDB4NTM5OCwgMHgwRjlBLCAweDUzOTksIDB4NEIwQywgMHg1MzlBLCAweDA3QjAsIDB4NTM5RCwgMHg0MUEyLAorICAgIDB4NTM5RiwgMHgwNzZBLCAweDUzQTAsIDB4MTBFMywgMHg1M0E0LCAweDQzQjcsIDB4NTNBNSwgMHgxMEU1LCAweDUzQTYsCisgICAgMHgxMEU0LCAweDUzQTgsIDB4MEEyNSwgMHg1M0E5LCAweDA0REIsIDB4NTNBQSwgMHg0QjBELCAweDUzQUIsIDB4MzgyMywKKyAgICAweDUzQUQsIDB4MDUwMCwgMHg1M0FFLCAweDEwRTYsIDB4NTNBRiwgMHg0QjBFLCAweDUzQjAsIDB4MTBFNywgMHg1M0IyLAorICAgIDB4MjBEOCwgMHg1M0IzLCAweDA3NkIsIDB4NTNCNCwgMHg0M0I4LCAweDUzQjYsIDB4MTBFOCwgMHg1M0I3LCAweDQzQkEsCisgICAgMHg1M0JBLCAweDRCMEYsIDB4NTNCQiwgMHgwNjg4LCAweDUzQzAsIDB4NDNCQiwgMHg1M0MxLCAweDRCMTAsIDB4NTNDMiwKKyAgICAweDA4ODAsIDB4NTNDMywgMHgxMEU5LCAweDUzQzQsIDB4NEIxMSwgMHg1M0M1LCAweDRCMTIsIDB4NTNDOCwgMHgwRUEyLAorICAgIDB4NTNDOSwgMHgwODI1LCAweDUzQ0EsIDB4MDY3NCwgMHg1M0NCLCAweDBGMTEsIDB4NTNDQywgMHgwQUQyLCAweDUzQ0QsCisgICAgMHgwRDUzLCAweDUzQ0UsIDB4MDkyOSwgMHg1M0Q0LCAweDA5NTEsIDB4NTNENSwgMHg0M0JGLCAweDUzRDYsIDB4MDkxNCwKKyAgICAweDUzRDcsIDB4MDkyMSwgMHg1M0Q5LCAweDA5ODAsIDB4NTNEQSwgMHgzODI0LCAweDUzREIsIDB4MEQ1NCwgMHg1M0RELAorICAgIDB4MjBEOSwgMHg1M0RGLCAweDEwRUMsIDB4NTNFMCwgMHg0QjEzLCAweDUzRTEsIDB4MDRFNSwgMHg1M0UyLCAweDBBRDMsCisgICAgMHg1M0UzLCAweDA3QjEsIDB4NTNFNCwgMHgwNzc5LCAweDUzRTUsIDB4MDZERiwgMHg1M0U2LCAweDM4MjUsIDB4NTNFOCwKKyAgICAweDEwRjAsIDB4NTNFOSwgMHgwQjVGLCAweDUzRUEsIDB4MEI1RSwgMHg1M0VCLCAweDA2QTMsIDB4NTNFQywgMHgwOThDLAorICAgIDB4NTNFRCwgMHgxMEYxLCAweDUzRUUsIDB4MTBFRiwgMHg1M0VGLCAweDA1NDQsIDB4NTNGMCwgMHgwQjQ2LCAweDUzRjEsCisgICAgMHgwOEU0LCAweDUzRjIsIDB4MDg5OSwgMHg1M0YzLCAweDA0QzgsIDB4NTNGNCwgMHg0M0MxLCAweDUzRjUsIDB4MzgyNiwKKyAgICAweDUzRjYsIDB4MDVDRSwgMHg1M0Y3LCAweDA3RjgsIDB4NTNGOCwgMHgwODk4LCAweDUzRkEsIDB4MTBGMiwgMHg1NDAxLAorICAgIDB4MTBGMywgMHg1NDAzLCAweDA2NjMsIDB4NTQwNCwgMHgwNUE0LCAweDU0MDgsIDB4MDdGOSwgMHg1NDA5LCAweDA2NjIsCisgICAgMHg1NDBBLCAweDBCRkIsIDB4NTQwQiwgMHgwNEM3LCAweDU0MEMsIDB4MEM4OSwgMHg1NDBELCAweDBFQ0EsIDB4NTQwRSwKKyAgICAweDA3QjMsIDB4NTQwRiwgMHgwRjYzLCAweDU0MTAsIDB4MEM0MSwgMHg1NDExLCAweDA3QjIsIDB4NTQxMiwgMHg0MUEzLAorICAgIDB4NTQxMywgMHg0QjE0LCAweDU0MUIsIDB4MDcwNSwgMHg1NDFELCAweDEwRkMsIDB4NTQxRSwgMHgzNjhDLCAweDU0MUYsCisgICAgMHgwNkRCLCAweDU0MjAsIDB4MEU3OCwgMHg1NDI0LCAweDQzQzIsIDB4NTQyNiwgMHgwRDcxLCAweDU0MjcsIDB4MzgyNywKKyAgICAweDU0MjgsIDB4NDNDMywgMHg1NDI5LCAweDEwRkIsIDB4NTQyQSwgMHg0QjE1LCAweDU0MkIsIDB4MDYxQSwgMHg1NDJDLAorICAgIDB4MTBGNiwgMHg1NDJELCAweDEwRjcsIDB4NTQyRSwgMHgxMEY5LCAweDU0MzEsIDB4NEIxNiwgMHg1NDMzLCAweDM1QzAsCisgICAgMHg1NDM0LCAweDRCMTcsIDB4NTQzNSwgMHg0QjE4LCAweDU0MzYsIDB4MTBGQSwgMHg1NDM4LCAweDA2NzUsIDB4NTQzOSwKKyAgICAweDBBMjcsIDB4NTQzQiwgMHgwREZELCAweDU0M0MsIDB4MTBGOCwgMHg1NDNELCAweDEwRjQsIDB4NTQzRSwgMHgwNzk3LAorICAgIDB4NTQzRiwgMHgzNUNGLCAweDU0NDAsIDB4MTBGNSwgMHg1NDQyLCAweDBGQ0EsIDB4NTQ0MywgMHg0M0M1LCAweDU0NDYsCisgICAgMHgwRTQyLCAweDU0NDgsIDB4MEMwNCwgMHg1NDQ5LCAweDA3OTYsIDB4NTQ0QSwgMHgwODAyLCAweDU0NEMsIDB4NEIxOSwKKyAgICAweDU0NEQsIDB4MzgyOCwgMHg1NDRFLCAweDEwRkQsIDB4NTQ1MSwgMHgwQ0I1LCAweDU0NTUsIDB4MzcyMywgMHg1NDVGLAorICAgIDB4MTEwMSwgMHg1NDYyLCAweDQzQzYsIDB4NTQ2NiwgMHgzODI5LCAweDU0NjgsIDB4MDkyQSwgMHg1NDZBLCAweDA5MjIsCisgICAgMHg1NDZCLCAweDM4MkEsIDB4NTQ2QywgMHg0M0M3LCAweDU0NzAsIDB4MTEwNCwgMHg1NDcxLCAweDExMDIsIDB4NTQ3MywKKyAgICAweDBFQUYsIDB4NTQ3NCwgMHgzODJCLCAweDU0NzUsIDB4MTBGRiwgMHg1NDc2LCAweDExMDgsIDB4NTQ3NywgMHgxMTAzLAorICAgIDB4NTQ3QiwgMHgxMTA2LCAweDU0N0MsIDB4MDc3QSwgMHg1NDdELCAweDBFQ0IsIDB4NTQ3RiwgMHg0MUE0LCAweDU0ODAsCisgICAgMHgxMTA3LCAweDU0ODQsIDB4MTEwOSwgMHg1NDg2LCAweDExMEIsIDB4NTQ4OCwgMHg0MUE1LCAweDU0OEEsIDB4MjBEQywKKyAgICAweDU0OEIsIDB4MDg2MCwgMHg1NDhDLCAweDBGRTgsIDB4NTQ4RCwgMHgzODJDLCAweDU0OEUsIDB4MTEwMCwgMHg1NDhGLAorICAgIDB4MTBGRSwgMHg1NDkwLCAweDExMEEsIDB4NTQ5MiwgMHgxMTA1LCAweDU0OTUsIDB4NDNDOCwgMHg1NDk2LCAweDM4MkQsCisgICAgMHg1NDlDLCAweDIwREIsIDB4NTRBMCwgMHg0M0M5LCAweDU0QTEsIDB4MzgyRSwgMHg1NEEyLCAweDExMEQsIDB4NTRBNCwKKyAgICAweDExMTYsIDB4NTRBNSwgMHgxMTBGLCAweDU0QTYsIDB4NDNDQSwgMHg1NEE3LCAweDRCMUEsIDB4NTRBOCwgMHgxMTEzLAorICAgIDB4NTRBOSwgMHgyMERELCAweDU0QUEsIDB4NEIxQiwgMHg1NEFCLCAweDExMTQsIDB4NTRBQywgMHgxMTEwLCAweDU0QUQsCisgICAgMHgzODJGLCAweDU0QUUsIDB4NDNDQiwgMHg1NEFGLCAweDExMzEsIDB4NTRCMSwgMHg0QjFDLCAweDU0QjIsIDB4MDg1OSwKKyAgICAweDU0QjMsIDB4MDU4RiwgMHg1NEI3LCAweDQzQ0MsIDB4NTRCOCwgMHgxMTBFLCAweDU0QjksIDB4MzgzMCwgMHg1NEJBLAorICAgIDB4NDNDRCwgMHg1NEJCLCAweDRCMUQsIDB4NTRCQywgMHgxMTE4LCAweDU0QkQsIDB4MDRCQSwgMHg1NEJFLCAweDExMTcsCisgICAgMHg1NEJGLCAweDM4MzEsIDB4NTRDMCwgMHgwNDY5LCAweDU0QzEsIDB4MERCQywgMHg1NEMyLCAweDExMTUsIDB4NTRDMywKKyAgICAweDQzQ0UsIDB4NTRDNCwgMHgxMTExLCAweDU0QzYsIDB4MzgzMiwgMHg1NEM3LCAweDExMEMsIDB4NTRDOCwgMHgxMTEyLAorICAgIDB4NTRDOSwgMHgwODM4LCAweDU0Q0QsIDB4MzgzMywgMHg1NENFLCAweDRCMUUsIDB4NTREOCwgMHgxMTE5LCAweDU0RTEsCisgICAgMHgwNEJCLCAweDU0RTIsIDB4MTEyMiwgMHg1NEU1LCAweDExMUEsIDB4NTRFNiwgMHgxMTFCLCAweDU0RTgsIDB4MDk4RCwKKyAgICAweDU0RTksIDB4MEU5NywgMHg1NEVBLCAweDRCMUYsIDB4NTRFQywgMHg0M0QwLCAweDU0RUQsIDB4MTEyMCwgMHg1NEVFLAorICAgIDB4MTExRiwgMHg1NEVGLCAweDQzRDEsIDB4NTRGMSwgMHg0M0QyLCAweDU0RjIsIDB4MEMyOSwgMHg1NEYzLCAweDQzRDMsCisgICAgMHg1NEZBLCAweDExMjEsIDB4NTRGQywgMHg0QjIwLCAweDU0RkQsIDB4MTExRSwgMHg1NEZGLCAweDIwREUsIDB4NTUwMCwKKyAgICAweDQzRDQsIDB4NTUwMSwgMHg0M0Q1LCAweDU1MDQsIDB4MDRENiwgMHg1NTA1LCAweDRCMjEsIDB4NTUwNiwgMHgwODI2LAorICAgIDB4NTUwNywgMHgwOUY2LCAweDU1MDgsIDB4NEIyMiwgMHg1NTA5LCAweDQzRDYsIDB4NTUwRSwgMHgzODM0LCAweDU1MEYsCisgICAgMHgxMTFDLCAweDU1MTAsIDB4MEM1QywgMHg1NTE0LCAweDExMUQsIDB4NTUxNSwgMHg0QjIzLCAweDU1MTYsIDB4MDQ2NiwKKyAgICAweDU1MjcsIDB4NEIyNCwgMHg1NTJBLCAweDRCMjUsIDB4NTUyQiwgMHgzODM1LCAweDU1MkUsIDB4MTEyNywgMHg1NTJGLAorICAgIDB4MEYwRCwgMHg1NTMxLCAweDA5OEYsIDB4NTUzMywgMHgxMTJELCAweDU1MzUsIDB4MzgzNiwgMHg1NTM2LCAweDRCMjYsCisgICAgMHg1NTM4LCAweDExMkMsIDB4NTUzOSwgMHgxMTIzLCAweDU1M0MsIDB4NDNENywgMHg1NTNFLCAweDBCMjMsIDB4NTU0MCwKKyAgICAweDExMjQsIDB4NTU0MSwgMHg0M0Q4LCAweDU1NDQsIDB4MEI0RiwgMHg1NTQ1LCAweDExMjksIDB4NTU0NiwgMHgwOThFLAorICAgIDB4NTU0NywgMHg0M0RBLCAweDU1NEEsIDB4MzgzNywgMHg1NTRDLCAweDExMjYsIDB4NTU0RiwgMHgwRUYwLCAweDU1NTAsCisgICAgMHg0MUE2LCAweDU1NTEsIDB4NEIyNywgMHg1NTUzLCAweDA3MTIsIDB4NTU1NiwgMHgxMTJBLCAweDU1NTcsIDB4MTEyQiwKKyAgICAweDU1NUMsIDB4MTEyOCwgMHg1NTVELCAweDExMkUsIDB4NTU1RSwgMHgxREQxLCAweDU1NjAsIDB4MzgzOCwgMHg1NTYxLAorICAgIDB4NEY1NCwgMHg1NTYzLCAweDExMjUsIDB4NTU2NCwgMHg0M0RDLCAweDU1NjYsIDB4NEIyOCwgMHg1NTdCLCAweDExMzQsCisgICAgMHg1NTdDLCAweDExMzksIDB4NTU3RCwgMHg0M0RFLCAweDU1N0UsIDB4MTEzNSwgMHg1NTgwLCAweDExMzAsIDB4NTU4MSwKKyAgICAweDQxQTcsIDB4NTU4MiwgMHg0M0RGLCAweDU1ODMsIDB4MTEzQSwgMHg1NTg0LCAweDBBQjMsIDB4NTU4NiwgMHgyMERGLAorICAgIDB4NTU4NywgMHgxMTNDLCAweDU1ODgsIDB4MzgzQSwgMHg1NTg5LCAweDA3QjQsIDB4NTU4QSwgMHgxMTMyLCAweDU1OEIsCisgICAgMHgwQkJCLCAweDU1OEUsIDB4MzgzQiwgMHg1NThGLCAweDRCMjksIDB4NTU5MSwgMHg0M0UwLCAweDU1OTIsIDB4NEIyQSwKKyAgICAweDU1OTQsIDB4NEIyQiwgMHg1NTk4LCAweDExMzYsIDB4NTU5OSwgMHgxMTJGLCAweDU1OUEsIDB4MDVFOSwgMHg1NTlDLAorICAgIDB4MDYyQSwgMHg1NTlELCAweDA1QzMsIDB4NTU5RSwgMHgxMTM3LCAweDU1OUYsIDB4MTEzMywgMHg1NUE0LCAweDRCMkMsCisgICAgMHg1NUE3LCAweDA3NEMsIDB4NTVBOCwgMHgxMTNELCAweDU1QTksIDB4MTEzQiwgMHg1NUFBLCAweDBBRDUsIDB4NTVBQiwKKyAgICAweDA2NjQsIDB4NTVBQywgMHgwNkE0LCAweDU1QUQsIDB4NDFBOCwgMHg1NUFFLCAweDExMzgsIDB4NTVCMCwgMHgwNkVDLAorICAgIDB4NTVCMiwgMHg0QjJELCAweDU1QjYsIDB4MDRFNiwgMHg1NUJGLCAweDQzRTUsIDB4NTVDMywgMHg0QjJFLCAweDU1QzQsCisgICAgMHgxMTQxLCAweDU1QzUsIDB4MTEzRiwgMHg1NUM2LCAweDRCMkYsIDB4NTVDNywgMHgxMTc4LCAweDU1QzksIDB4NDNFNiwKKyAgICAweDU1Q0MsIDB4NDNFNywgMHg1NUNFLCAweDQxQTksIDB4NTVEMSwgMHg0M0U4LCAweDU1RDIsIDB4NDNFMiwgMHg1NUQzLAorICAgIDB4NEIzMCwgMHg1NUQ0LCAweDExNDQsIDB4NTVEQSwgMHgxMTNFLCAweDU1REIsIDB4NEIzMSwgMHg1NURDLCAweDExNDIsCisgICAgMHg1NURELCAweDQzRTksIDB4NTVERiwgMHgxMTQwLCAweDU1RTIsIDB4NDNFQiwgMHg1NUUzLCAweDA4OUEsIDB4NTVFNCwKKyAgICAweDExNDMsIDB4NTVFOSwgMHg0M0VELCAweDU1RUMsIDB4NEIzMiwgMHg1NUVFLCAweDRCMzMsIDB4NTVGMSwgMHg0QjM0LAorICAgIDB4NTVGNiwgMHg0QjM1LCAweDU1RjcsIDB4MTE0NiwgMHg1NUY4LCAweDRCMzYsIDB4NTVGOSwgMHgxMTRCLCAweDU1RkQsCisgICAgMHgxMTQ5LCAweDU1RkUsIDB4MTE0OCwgMHg1NjA1LCAweDRCMzcsIDB4NTYwNiwgMHgwQjcwLCAweDU2MDcsIDB4NDNGMCwKKyAgICAweDU2MDgsIDB4MzgzQywgMHg1NjA5LCAweDA1NDUsIDB4NTYwRCwgMHg0QjM4LCAweDU2MEUsIDB4MzgzRCwgMHg1NjBGLAorICAgIDB4MzgzRSwgMHg1NjEwLCAweDQzRjEsIDB4NTYxMSwgMHg0QjM5LCAweDU2MTIsIDB4NEIzQSwgMHg1NjE0LCAweDExNDUsCisgICAgMHg1NjE2LCAweDExNDcsIDB4NTYxNywgMHgwOTkwLCAweDU2MTgsIDB4MDRENSwgMHg1NjFCLCAweDExNEEsIDB4NTYyMCwKKyAgICAweDNDMUQsIDB4NTYyOCwgMHg0M0VFLCAweDU2MjksIDB4MDU1RSwgMHg1NjJDLCAweDRCM0IsIDB4NTYyRiwgMHgxMTU1LAorICAgIDB4NTYzMCwgMHg0M0YyLCAweDU2MzEsIDB4MDlFNCwgMHg1NjMyLCAweDExNTEsIDB4NTYzNCwgMHgxMTRGLCAweDU2MzUsCisgICAgMHg0QjNDLCAweDU2MzYsIDB4MTE1MCwgMHg1NjM3LCAweDM4M0YsIDB4NTYzOCwgMHgxMTUyLCAweDU2MzksIDB4NEIzRCwKKyAgICAweDU2M0IsIDB4NDFBQSwgMHg1NjNELCAweDQzRjQsIDB4NTYzRiwgMHgzODQwLCAweDU2NDAsIDB4NDNGNSwgMHg1NjQyLAorICAgIDB4MDRERiwgMHg1NjQ3LCAweDQzRjYsIDB4NTY0OSwgMHgzODQxLCAweDU2NEIsIDB4Mzg0MiwgMHg1NjRDLCAweDBBQkIsCisgICAgMHg1NjRELCAweDRCM0UsIDB4NTY0RSwgMHgxMTRDLCAweDU2NEYsIDB4Mzg0MywgMHg1NjUwLCAweDExNEQsIDB4NTY1MywKKyAgICAweDFGMUIsIDB4NTY1NCwgMHg0QjNGLCAweDU2NUIsIDB4MDVEOCwgMHg1NjVFLCAweDQzRjcsIDB4NTY2MCwgMHg0M0Y4LAorICAgIDB4NTY2NCwgMHgxMTU0LCAweDU2NjYsIDB4Mzg0NCwgMHg1NjY4LCAweDA2MkIsIDB4NTY2OSwgMHgzODQ1LCAweDU2NkEsCisgICAgMHgxMTU3LCAweDU2NkIsIDB4MTE1MywgMHg1NjZDLCAweDExNTYsIDB4NTY2RCwgMHg0M0Y5LCAweDU2NkYsIDB4Mzg0NiwKKyAgICAweDU2NzEsIDB4Mzg0NywgMHg1NjcyLCAweDM4NDgsIDB4NTY3NCwgMHgwREZFLCAweDU2NzYsIDB4M0MzMywgMHg1Njc4LAorICAgIDB4MENBRCwgMHg1NjdBLCAweDBENEMsIDB4NTY4MCwgMHgxMTU5LCAweDU2ODUsIDB4NEI0MCwgMHg1Njg2LCAweDExNTgsCisgICAgMHg1Njg3LCAweDA1QTMsIDB4NTY4OCwgMHg0M0ZCLCAweDU2OEEsIDB4MTE1QSwgMHg1NjhDLCAweDQzRkMsIDB4NTY4RiwKKyAgICAweDExNUQsIDB4NTY5NCwgMHgxMTVDLCAweDU2OTUsIDB4Mzg0OSwgMHg1Njk5LCAweDFERTYsIDB4NTY5QSwgMHgzODRBLAorICAgIDB4NTY5RCwgMHg0M0ZELCAweDU2OUUsIDB4NDFBQiwgMHg1NjlGLCAweDRCNDEsIDB4NTZBMCwgMHgxMTVCLCAweDU2QTIsCisgICAgMHgwQ0VGLCAweDU2QTUsIDB4MTE1RSwgMHg1NkE2LCAweDRCNDIsIDB4NTZBOCwgMHg0M0ZFLCAweDU2QTksIDB4NDFBQywKKyAgICAweDU2QUMsIDB4Mzg0QiwgMHg1NkFELCAweDM4NEMsIDB4NTZBRSwgMHgxMTVGLCAweDU2QjEsIDB4Mzg0RCwgMHg1NkIyLAorICAgIDB4NDNGRiwgMHg1NkIzLCAweDQxQUQsIDB4NTZCNCwgMHgxMTYxLCAweDU2QjYsIDB4MTE2MCwgMHg1NkI3LCAweDRCNDMsCisgICAgMHg1NkJDLCAweDExNjMsIDB4NTZDMCwgMHgxMTY2LCAweDU2QzEsIDB4MTE2NCwgMHg1NkMyLCAweDExNjIsIDB4NTZDMywKKyAgICAweDExNjUsIDB4NTZDNSwgMHg0NDAwLCAweDU2QzgsIDB4MTE2NywgMHg1NkM5LCAweDM4NEUsIDB4NTZDQSwgMHgxRTVBLAorICAgIDB4NTZDQywgMHg0QjQ0LCAweDU2Q0QsIDB4NDQwMSwgMHg1NkNFLCAweDExNjgsIDB4NTZDRiwgMHg0QjQ1LCAweDU2RDEsCisgICAgMHgxMTY5LCAweDU2RDMsIDB4MTE2QSwgMHg1NkQ3LCAweDExNkIsIDB4NTZEOCwgMHgxMDdDLCAweDU2RDksIDB4NEI0NiwKKyAgICAweDU2REEsIDB4MDkyOCwgMHg1NkRCLCAweDA4OUIsIDB4NTZERCwgMHgzODRGLCAweDU2REUsIDB4MDU3MywgMHg1NkRGLAorICAgIDB4NDQwMiwgMHg1NkUwLCAweDA0QkMsIDB4NTZFMSwgMHg0QjQ3LCAweDU2RTMsIDB4MEI4MiwgMHg1NkU0LCAweDM4NTAsCisgICAgMHg1NkU4LCAweDQ0MDMsIDB4NTZFQiwgMHg0QjQ4LCAweDU2RUQsIDB4NEI0OSwgMHg1NkVFLCAweDExNkMsIDB4NTZGMCwKKyAgICAweDA4MTQsIDB4NTZGMSwgMHg0QjRBLCAweDU2RjIsIDB4MDQ5MywgMHg1NkYzLCAweDBBMjQsIDB4NTZGNiwgMHg0NDA0LAorICAgIDB4NTZGNywgMHg0NDA1LCAweDU2RjksIDB4MTE2RCwgMHg1NkZBLCAweDA3N0IsIDB4NTZGRCwgMHgwODAzLCAweDU2RkYsCisgICAgMHgxMTZGLCAweDU3MDAsIDB4MTE2RSwgMHg1NzAzLCAweDBFMzAsIDB4NTcwNCwgMHgxMTcwLCAweDU3MDcsIDB4NEI0QiwKKyAgICAweDU3MDgsIDB4MTE3MiwgMHg1NzA5LCAweDExNzEsIDB4NTcwQSwgMHgzODUxLCAweDU3MEIsIDB4MTE3MywgMHg1NzBDLAorICAgIDB4NEI0QywgMHg1NzBELCAweDExNzQsIDB4NTcwRiwgMHgwNzRELCAweDU3MTIsIDB4MDUwMiwgMHg1NzEzLCAweDExNzUsCisgICAgMHg1NzE1LCAweDM4NTIsIDB4NTcxNiwgMHgxMTc3LCAweDU3MTgsIDB4MTE3NiwgMHg1NzFBLCAweDRCNEQsIDB4NTcxQiwKKyAgICAweDRCNEUsIDB4NTcxQywgMHgxMTc5LCAweDU3MUQsIDB4NEI0RiwgMHg1NzFGLCAweDBDNTQsIDB4NTcyMSwgMHgzNjgwLAorICAgIDB4NTcyMywgMHgzODUzLCAweDU3MjYsIDB4MTE3QSwgMHg1NzI3LCAweDA0NzksIDB4NTcyOCwgMHgwODRGLCAweDU3MjksCisgICAgMHg0NDA4LCAweDU3MkMsIDB4NEI1MCwgMHg1NzJELCAweDA3MTMsIDB4NTcyRSwgMHg0QjUxLCAweDU3MkYsIDB4Mzg1NCwKKyAgICAweDU3MzAsIDB4MEI4RCwgMHg1NzMzLCAweDM4NTUsIDB4NTczNCwgMHgzODU2LCAweDU3MzcsIDB4MTE3QiwgMHg1NzM4LAorICAgIDB4MTE3QywgMHg1NzNCLCAweDExN0UsIDB4NTczRCwgMHg0QjUyLCAweDU3M0UsIDB4NEI1MywgMHg1NzQwLCAweDExN0YsCisgICAgMHg1NzQyLCAweDA4NTQsIDB4NTc0NSwgMHg0NDBBLCAweDU3NDYsIDB4NDQwQiwgMHg1NzQ3LCAweDA2QzksIDB4NTc0QSwKKyAgICAweDBFNjUsIDB4NTc0QywgMHgzODU3LCAweDU3NEQsIDB4NDQwQywgMHg1NzRFLCAweDExN0QsIDB4NTc0RiwgMHgxMTgwLAorICAgIDB4NTc1MCwgMHgwODMxLCAweDU3NTEsIDB4MDdCNSwgMHg1NzU5LCAweDIwRTAsIDB4NTc1RiwgMHg0QjU0LCAweDU3NjEsCisgICAgMHgxMTg0LCAweDU3NjQsIDB4MDgxNSwgMHg1NzY1LCAweDIwRTEsIDB4NTc2NiwgMHgwQjcxLCAweDU3NjgsIDB4NDQwRSwKKyAgICAweDU3NjksIDB4MTE4MSwgMHg1NzZBLCAweDBCRjYsIDB4NTc2QiwgMHg0QjU1LCAweDU3NkQsIDB4NEI1NiwgMHg1NzZGLAorICAgIDB4NDQwRiwgMHg1NzcwLCAweDM4NTgsIDB4NTc3MywgMHg0NDEwLCAweDU3NzQsIDB4NDQxMSwgMHg1Nzc1LCAweDQ0MTIsCisgICAgMHg1Nzc3LCAweDQxQUUsIDB4NTc3QSwgMHg0QjU3LCAweDU3N0IsIDB4NDQxMywgMHg1NzdDLCAweDQxQUYsIDB4NTc3RiwKKyAgICAweDExODUsIDB4NTc4MiwgMHgwQTI4LCAweDU3ODMsIDB4NEI1OCwgMHg1Nzg4LCAweDExODMsIDB4NTc4OSwgMHgxMTg2LAorICAgIDB4NTc4QiwgMHgwNzE1LCAweDU3OEMsIDB4Mzg1OSwgMHg1NzkzLCAweDExODcsIDB4NTc5NywgMHg0QjU5LCAweDU3OUEsCisgICAgMHg0NDE2LCAweDU3OUMsIDB4Mzg1QSwgMHg1NzlELCAweDQ0MTcsIDB4NTc5RSwgMHg0NDE4LCAweDU3QTAsIDB4MTE4OCwKKyAgICAweDU3QTIsIDB4MDdCNiwgMHg1N0EzLCAweDA1OUUsIDB4NTdBNCwgMHgxMThBLCAweDU3QTgsIDB4NDQxOSwgMHg1N0FBLAorICAgIDB4MTE4QiwgMHg1N0FDLCAweDIwRTIsIDB4NTdBRSwgMHg0QjVBLCAweDU3QjAsIDB4MTE4QywgMHg1N0IzLCAweDExODksCisgICAgMHg1N0I4LCAweDM4NUIsIDB4NTdDMCwgMHgxMTgyLCAweDU3QzMsIDB4MTE4RCwgMHg1N0M2LCAweDExOEUsIDB4NTdDNywKKyAgICAweDIwRTQsIDB4NTdDOCwgMHgyMEUzLCAweDU3Q0IsIDB4MEU5MiwgMHg1N0NDLCAweDQ0MUMsIDB4NTdDRSwgMHgwOUQzLAorICAgIDB4NTdDRiwgMHg0MUIxLCAweDU3RDIsIDB4MTE5MCwgMHg1N0QzLCAweDExOTEsIDB4NTdENCwgMHgxMThGLCAweDU3RDUsCisgICAgMHg0QjVCLCAweDU3RDYsIDB4MTE5MywgMHg1N0Q3LCAweDQ0MUEsIDB4NTdEQywgMHgwQ0VFLCAweDU3REUsIDB4NDQxRiwKKyAgICAweDU3REYsIDB4MDRBQywgMHg1N0UwLCAweDBEQzgsIDB4NTdFMywgMHgxMTk0LCAweDU3RTQsIDB4NDFCMiwgMHg1N0U2LAorICAgIDB4Mzg1QywgMHg1N0U3LCAweDRCNUMsIDB4NTdFRCwgMHgzODVELCAweDU3RjAsIDB4NDQyMCwgMHg1N0Y0LCAweDA5RTUsCisgICAgMHg1N0Y1LCAweDM4NUUsIDB4NTdGNiwgMHgzODVGLCAweDU3RjcsIDB4MDhFNSwgMHg1N0Y4LCAweDQ0MjIsIDB4NTdGOSwKKyAgICAweDBEMTMsIDB4NTdGQSwgMHgwNjJDLCAweDU3RkIsIDB4NDQyMywgMHg1N0ZDLCAweDA4NUIsIDB4NTdGRCwgMHg0NDI0LAorICAgIDB4NTdGRiwgMHgzODYwLCAweDU4MDAsIDB4MEU4NywgMHg1ODAyLCAweDBDOEEsIDB4NTgwNCwgMHg0NDI1LCAweDU4MDUsCisgICAgMHgwNzRFLCAweDU4MDYsIDB4MEIyRiwgMHg1ODA5LCAweDM4NjEsIDB4NTgwQSwgMHgxMTkyLCAweDU4MEIsIDB4MTE5NSwKKyAgICAweDU4MEQsIDB4NEI1RCwgMHg1ODE1LCAweDBCMjQsIDB4NTgxOSwgMHgxMTk2LCAweDU4MUQsIDB4MTE5NywgMHg1ODFFLAorICAgIDB4NDQyNiwgMHg1ODIwLCAweDM4NjIsIDB4NTgyMSwgMHgxMTk5LCAweDU4MjQsIDB4MEMwNSwgMHg1ODI2LCAweDRCNUUsCisgICAgMHg1ODI3LCAweDQ0MjcsIDB4NTgyQSwgMHgwNUVBLCAweDU4MkYsIDB4MUQzMiwgMHg1ODMwLCAweDA1MDMsIDB4NTgzMSwKKyAgICAweDBFNDMsIDB4NTgzMiwgMHgzODYzLCAweDU4MzQsIDB4MDlENCwgMHg1ODM1LCAweDBDNDIsIDB4NTgzOSwgMHg0NDI4LAorICAgIDB4NTgzQSwgMHgwODU2LCAweDU4M0QsIDB4MTE5RiwgMHg1ODQwLCAweDBFMEQsIDB4NTg0MSwgMHgwRkE1LCAweDU4NDksCisgICAgMHg0NDJBLCAweDU4NEEsIDB4MDU3NCwgMHg1ODRCLCAweDExOUIsIDB4NTg0QywgMHg0NDJCLCAweDU4NEQsIDB4NEI1RiwKKyAgICAweDU4NEYsIDB4NEI2MCwgMHg1ODUxLCAweDBBQkMsIDB4NTg1MiwgMHgxMTlFLCAweDU4NTQsIDB4MEM1RCwgMHg1ODU3LAorICAgIDB4MEM0MywgMHg1ODU4LCAweDBDNUUsIDB4NTg1OSwgMHgwRDRELCAweDU4NUEsIDB4MEJFOSwgMHg1ODVFLCAweDA4MzksCisgICAgMHg1ODVGLCAweDRCNjEsIDB4NTg2MSwgMHgxRTQ3LCAweDU4NjIsIDB4MTE5QSwgMHg1ODY0LCAweDQxQjMsIDB4NTg2NywKKyAgICAweDQ0MkMsIDB4NTg2OSwgMHgwNTE4LCAweDU4NkIsIDB4MEMzMCwgMHg1ODZELCAweDRCNjIsIDB4NTg3MCwgMHgxMTlDLAorICAgIDB4NTg3MiwgMHgxMTk4LCAweDU4NzUsIDB4MEExNiwgMHg1ODc5LCAweDExQTAsIDB4NTg3QywgMHgzODY0LCAweDU4N0UsCisgICAgMHgwOTU4LCAweDU4N0YsIDB4NEI2MywgMHg1ODgwLCAweDM4NjUsIDB4NTg4MSwgMHg0QjY0LCAweDU4ODMsIDB4MDZBNSwKKyAgICAweDU4ODUsIDB4MTFBMSwgMHg1ODg5LCAweDQxQjQsIDB4NTg4QSwgMHg0NDJELCAweDU4OEIsIDB4NDQyRSwgMHg1ODhELAorICAgIDB4NDQyRiwgMHg1ODhGLCAweDQ0MzAsIDB4NTg5MCwgMHg0NDMxLCAweDU4OTMsIDB4MEUzOCwgMHg1ODk0LCAweDQ0MzIsCisgICAgMHg1ODk3LCAweDBBRkYsIDB4NTg5OCwgMHg0QjY1LCAweDU4OUMsIDB4MEJFMiwgMHg1ODlELCAweDQ0MzMsIDB4NTg5RSwKKyAgICAweDIwRTcsIDB4NTg5RiwgMHgxMUEzLCAweDU4QTgsIDB4MEU3RCwgMHg1OEE5LCAweDM4NjYsIDB4NThBQSwgMHg0NDM0LAorICAgIDB4NThBQiwgMHgxMUE0LCAweDU4QUUsIDB4MTFBOSwgMHg1OEIxLCAweDQ0MzUsIDB4NThCMiwgMHgyMEU4LCAweDU4QjMsCisgICAgMHgwREZGLCAweDU4QjgsIDB4MTFBOCwgMHg1OEI5LCAweDExQTIsIDB4NThCQSwgMHgxMUE1LCAweDU4QkIsIDB4MTFBNywKKyAgICAweDU4QkMsIDB4NEI2NiwgMHg1OEJFLCAweDA4MTYsIDB4NThDMSwgMHgwRTE5LCAweDU4QzMsIDB4NDQzNywgMHg1OEM1LAorICAgIDB4MTFBQSwgMHg1OEM3LCAweDBCODMsIDB4NThDQSwgMHgwNTc1LCAweDU4Q0MsIDB4MDlENSwgMHg1OENELCAweDQ0MzgsCisgICAgMHg1OENFLCAweDM4NjcsIDB4NThEMCwgMHgzODY4LCAweDU4RDEsIDB4MTFBQywgMHg1OEQyLCAweDQxQjYsIDB4NThEMywKKyAgICAweDExQUIsIDB4NThENCwgMHgzODY5LCAweDU4RDUsIDB4MDdGQSwgMHg1OEQ3LCAweDExQUQsIDB4NThEOCwgMHgxMUFGLAorICAgIDB4NThEOSwgMHgxMUFFLCAweDU4REEsIDB4Mzg2QSwgMHg1OERDLCAweDExQjEsIDB4NThERSwgMHgxMUE2LCAweDU4REYsCisgICAgMHgxMUIzLCAweDU4RTAsIDB4NDFCNywgMHg1OEUyLCAweDQ0MzksIDB4NThFNCwgMHgxMUIyLCAweDU4RTUsIDB4MTFCMCwKKyAgICAweDU4RTksIDB4Mzg2QiwgMHg1OEVCLCAweDA4OUMsIDB4NThFQywgMHgwQTE3LCAweDU4RUUsIDB4MEFENiwgMHg1OEVGLAorICAgIDB4MTFCNCwgMHg1OEYwLCAweDBBNjAsIDB4NThGMSwgMHgwNEIxLCAweDU4RjIsIDB4MEQxQSwgMHg1OEYzLCAweDQ0M0EsCisgICAgMHg1OEY0LCAweDQ0M0IsIDB4NThGNywgMHgwQkY3LCAweDU4RjksIDB4MTFCNiwgMHg1OEZBLCAweDExQjUsIDB4NThGQiwKKyAgICAweDExQjcsIDB4NThGQywgMHgxMUI4LCAweDU4RkQsIDB4MTFCOSwgMHg1OTAyLCAweDExQkEsIDB4NTkwNSwgMHg0NDNDLAorICAgIDB4NTkwNiwgMHg0NDNELCAweDU5MDksIDB4MEUyMSwgMHg1OTBBLCAweDExQkIsIDB4NTkwQiwgMHgyMEU5LCAweDU5MEMsCisgICAgMHgzODZDLCAweDU5MEQsIDB4NDQzRSwgMHg1OTBGLCAweDA1NDYsIDB4NTkxMCwgMHgxMUJDLCAweDU5MTQsIDB4NDQzRiwKKyAgICAweDU5MTUsIDB4MEYyNiwgMHg1OTE2LCAweDA1OEUsIDB4NTkxOCwgMHgxMERFLCAweDU5MTksIDB4MDk1MiwgMHg1OTFBLAorICAgIDB4MEIxRiwgMHg1OTFCLCAweDExQkQsIDB4NTkxQywgMHgwRUY3LCAweDU5MUYsIDB4NEI2NywgMHg1OTIyLCAweDBFQzAsCisgICAgMHg1OTIzLCAweDRCNjgsIDB4NTkyNCwgMHgzODZELCAweDU5MjUsIDB4MTFCRiwgMHg1OTI3LCAweDBCNDcsIDB4NTkyOSwKKyAgICAweDBDMzEsIDB4NTkyQSwgMHgwQjIwLCAweDU5MkIsIDB4MERDOSwgMHg1OTJDLCAweDExQzAsIDB4NTkyRCwgMHgxMUMxLAorICAgIDB4NTkyRSwgMHgwNTFELCAweDU5MkYsIDB4Mzg2RSwgMHg1OTMxLCAweDA4RTYsIDB4NTkzMiwgMHgxMUMyLCAweDU5MzcsCisgICAgMHgwNDk0LCAweDU5MzgsIDB4MTFDMywgMHg1OTM5LCAweDM3MjUsIDB4NTkzRCwgMHg0NDQyLCAweDU5M0UsIDB4MTFDNCwKKyAgICAweDU5NDQsIDB4MDUwNCwgMHg1OTQ2LCAweDQ0NDQsIDB4NTk0NywgMHgwNjJELCAweDU5NDgsIDB4MENCOCwgMHg1OTQ5LAorICAgIDB4MEU0NCwgMHg1OTRFLCAweDExQzgsIDB4NTk0RiwgMHgwQUQ3LCAweDU5NTAsIDB4MTFDNywgMHg1OTUxLCAweDA3MTYsCisgICAgMHg1OTUzLCAweDIwRUEsIDB4NTk1NCwgMHgwRTg5LCAweDU5NTUsIDB4MTFDNiwgMHg1OTU3LCAweDBDNUYsIDB4NTk1OCwKKyAgICAweDExQ0EsIDB4NTk1OSwgMHg0QjY5LCAweDU5NUEsIDB4MTFDOSwgMHg1OTVCLCAweDIwRUIsIDB4NTk1RCwgMHgyMEVDLAorICAgIDB4NTk1RiwgMHg0NDQ3LCAweDU5NjAsIDB4MTFDQywgMHg1OTYxLCAweDM4NkYsIDB4NTk2MiwgMHgxMUNCLCAweDU5NjMsCisgICAgMHgyMEVELCAweDU5NjUsIDB4MDUxRSwgMHg1OTY3LCAweDExQ0QsIDB4NTk2OCwgMHgwOTkxLCAweDU5NjksIDB4MTFDRiwKKyAgICAweDU5NkEsIDB4MEI2MywgMHg1OTZDLCAweDExQ0UsIDB4NTk2RCwgMHgzODcwLCAweDU5NkUsIDB4MEUwMywgMHg1OTczLAorICAgIDB4MDk4MSwgMHg1OTc0LCAweDBDNTUsIDB4NTk3NSwgMHg0NDQ5LCAweDU5NzYsIDB4NDQ0QSwgMHg1OTc4LCAweDExRDAsCisgICAgMHg1OTc5LCAweDRCNkEsIDB4NTk3QywgMHg0NDRCLCAweDU5N0QsIDB4MDdCNywgMHg1OTgxLCAweDExRDEsIDB4NTk4MiwKKyAgICAweDBDRDcsIDB4NTk4MywgMHgwRDcyLCAweDU5ODQsIDB4MEVERCwgMHg1OThBLCAweDBDREIsIDB4NTk4QiwgMHg0MUI5LAorICAgIDB4NTk4RCwgMHgxMURBLCAweDU5OTIsIDB4NDFCQSwgMHg1OTkzLCAweDA2NTIsIDB4NTk5NiwgMHgwRjJGLCAweDU5OTcsCisgICAgMHg0QjZCLCAweDU5OTksIDB4MEVCQiwgMHg1OTlCLCAweDEyMzksIDB4NTk5RCwgMHgxMUQyLCAweDU5OUYsIDB4NDQ0QywKKyAgICAweDU5QTMsIDB4MTFENSwgMHg1OUE0LCAweDIwRUUsIDB4NTlBNSwgMHgwQjI1LCAweDU5QTgsIDB4MEU2NiwgMHg1OUFDLAorICAgIDB4MEM0NCwgMHg1OUFFLCAweDQ0NEQsIDB4NTlBRiwgMHg0QjZDLCAweDU5QjIsIDB4MTFENiwgMHg1OUIzLCAweDRCNkQsCisgICAgMHg1OUI5LCAweDBFOTMsIDB4NTlCQSwgMHgyMEVGLCAweDU5QkIsIDB4MDgzQSwgMHg1OUJDLCAweDQ0NEUsIDB4NTlCRSwKKyAgICAweDA5OTIsIDB4NTlDMywgMHg0MUJCLCAweDU5QzYsIDB4MTFENywgMHg1OUM4LCAweDQ0NEYsIDB4NTlDOSwgMHgwODlFLAorICAgIDB4NTlDQSwgMHgzODcxLCAweDU5Q0IsIDB4MDg5RCwgMHg1OUNELCAweDQ0NTAsIDB4NTlEMCwgMHgwNDdELCAweDU5RDEsCisgICAgMHgwNzdDLCAweDU5RDIsIDB4Mzg3MiwgMHg1OUQzLCAweDBBNEYsIDB4NTlENCwgMHgwNDk1LCAweDU5RDksIDB4MTFEQiwKKyAgICAweDU5REEsIDB4MTFEQywgMHg1OURDLCAweDExRDksIDB4NTlERCwgMHgzODczLCAweDU5REUsIDB4NDQ1MSwgMHg1OURGLAorICAgIDB4NEI2RSwgMHg1OUUzLCAweDM4NzQsIDB4NTlFNCwgMHgzODc1LCAweDU5RTUsIDB4MDREQSwgMHg1OUU2LCAweDA1RUIsCisgICAgMHg1OUU3LCAweDQ0NTIsIDB4NTlFOCwgMHgxMUQ4LCAweDU5RUEsIDB4MEVEMSwgMHg1OUVCLCAweDBEQTMsIDB4NTlFQywKKyAgICAweDM2QUQsIDB4NTlFRSwgMHg0NDUzLCAweDU5RjEsIDB4NEI2RiwgMHg1OUY2LCAweDA0NkMsIDB4NTlGOCwgMHg0QjcwLAorICAgIDB4NTlGQiwgMHgwNEJELCAweDU5RkYsIDB4MDg5RiwgMHg1QTAxLCAweDA0OTYsIDB4NUEwMywgMHgwNDY3LCAweDVBMDQsCisgICAgMHgzODc2LCAweDVBMDksIDB4MTFFMSwgMHg1QTBDLCAweDM4NzcsIDB4NUEwRCwgMHg0NDU3LCAweDVBMTEsIDB4MTFERiwKKyAgICAweDVBMTMsIDB4NDFCQywgMHg1QTE3LCAweDQ0NTgsIDB4NUExOCwgMHgwRUM4LCAweDVBMUEsIDB4MTFFMiwgMHg1QTFCLAorICAgIDB4MzVDMSwgMHg1QTFDLCAweDExRTAsIDB4NUExRiwgMHgxMURFLCAweDVBMjAsIDB4MDlGNywgMHg1QTIzLCAweDM4NzgsCisgICAgMHg1QTI1LCAweDExREQsIDB4NUEyNywgMHg0NDU5LCAweDVBMjksIDB4MEUyQSwgMHg1QTJELCAweDQ0NUEsIDB4NUEyRiwKKyAgICAweDA3OTgsIDB4NUEzNSwgMHgxMUU2LCAweDVBMzYsIDB4MTFFNywgMHg1QTNDLCAweDA5OTMsIDB4NUE0MCwgMHgxMUUzLAorICAgIDB4NUE0MSwgMHgwRkQyLCAweDVBNDYsIDB4MEQwMiwgMHg1QTQ3LCAweDM4NzksIDB4NUE0OSwgMHgxMUU1LCAweDVBNTUsCisgICAgMHgzODdBLCAweDVBNUEsIDB4MDgxNywgMHg1QTYyLCAweDExRTgsIDB4NUE2MywgMHgzODdCLCAweDVBNjUsIDB4NDQ1QiwKKyAgICAweDVBNjYsIDB4MERDQSwgMHg1QTY3LCAweDQxQkQsIDB4NUE2QSwgMHgxMUU5LCAweDVBNkMsIDB4MTFFNCwgMHg1QTZELAorICAgIDB4Mzg3QywgMHg1QTc3LCAweDQxQkUsIDB4NUE3QSwgMHg0NDVDLCAweDVBN0UsIDB4Mzg3RCwgMHg1QTdGLCAweDBFQzcsCisgICAgMHg1QTg0LCAweDQxQkYsIDB4NUE4QiwgMHg0NDVELCAweDVBOTIsIDB4MEQxNCwgMHg1QTlBLCAweDExRUEsIDB4NUE5QiwKKyAgICAweDBEQTQsIDB4NUE5QywgMHg0NDVFLCAweDVBOUUsIDB4Mzg3RSwgMHg1QTlGLCAweDQ0NUYsIDB4NUFBMCwgMHg0NDYwLAorICAgIDB4NUFBMiwgMHg0NDYxLCAweDVBQTcsIDB4Mzg3RiwgMHg1QUFDLCAweDM4ODAsIDB4NUFCMSwgMHg0NDYyLCAweDVBQjIsCisgICAgMHg0QjcxLCAweDVBQjMsIDB4Mzg4MSwgMHg1QUI1LCAweDQ0NjMsIDB4NUFCOCwgMHg0QjcyLCAweDVBQkEsIDB4NDQ2NCwKKyAgICAweDVBQkMsIDB4MTFFQiwgMHg1QUJELCAweDExRUYsIDB4NUFCRSwgMHgxMUVDLCAweDVBQkYsIDB4NDQ2NSwgMHg1QUMxLAorICAgIDB4MDU0NywgMHg1QUMyLCAweDExRUUsIDB4NUFDNCwgMHg0MUMwLCAweDVBQzksIDB4MDhFNywgMHg1QUNCLCAweDExRUQsCisgICAgMHg1QUNDLCAweDA3NEYsIDB4NUFEMCwgMHgxMUZCLCAweDVBRDYsIDB4MTFGNCwgMHg1QUQ3LCAweDExRjEsIDB4NUFEQSwKKyAgICAweDQ0NjYsIDB4NUFEQywgMHg0NDY3LCAweDVBRTAsIDB4Mzg4MiwgMHg1QUUxLCAweDBCQTIsIDB4NUFFMywgMHgxMUYwLAorICAgIDB4NUFFNSwgMHg0NDY4LCAweDVBRTYsIDB4MTFGMiwgMHg1QUU5LCAweDExRjMsIDB4NUFFQSwgMHg0QjczLCAweDVBRUUsCisgICAgMHg0NDZBLCAweDVBRjAsIDB4NDQ2OSwgMHg1QUY1LCAweDQ0NkIsIDB4NUFGNiwgMHg0Qjc0LCAweDVBRkEsIDB4MTFGNSwKKyAgICAweDVBRkIsIDB4MTFGNiwgMHg1QjAwLCAweDM4ODMsIDB4NUIwOCwgMHg0NDZDLCAweDVCMDksIDB4MDYyRSwgMHg1QjBCLAorICAgIDB4MTFGOCwgMHg1QjBDLCAweDExRjcsIDB4NUIxNiwgMHgxMUY5LCAweDVCMTcsIDB4NDQ2RCwgMHg1QjE5LCAweDM4ODQsCisgICAgMHg1QjFCLCAweDRCNzUsIDB4NUIxRCwgMHg0Qjc2LCAweDVCMjEsIDB4NEI3NywgMHg1QjIyLCAweDA5RDYsIDB4NUIyNSwKKyAgICAweDM4ODUsIDB4NUIyQSwgMHgxMUZDLCAweDVCMkMsIDB4MEJGOCwgMHg1QjJELCAweDM4ODYsIDB4NUIzMCwgMHgwNEU3LAorICAgIDB4NUIzMiwgMHgxMUZBLCAweDVCMzQsIDB4NDQ2RSwgMHg1QjM2LCAweDExRkQsIDB4NUIzOCwgMHg0Qjc4LCAweDVCM0UsCisgICAgMHgxMUZFLCAweDVCNDAsIDB4MTIwMSwgMHg1QjQxLCAweDM4ODcsIDB4NUI0MywgMHgxMUZGLCAweDVCNDUsIDB4MTIwMCwKKyAgICAweDVCNEMsIDB4NDQ2RiwgMHg1QjUwLCAweDA4QTAsIDB4NUI1MSwgMHgxMjAyLCAweDVCNTIsIDB4NDQ3MCwgMHg1QjU0LAorICAgIDB4MDdCOCwgMHg1QjU1LCAweDEyMDMsIDB4NUI1NiwgMHgyMEYwLCAweDVCNTcsIDB4MDhDOCwgMHg1QjU4LCAweDBCMTgsCisgICAgMHg1QjVBLCAweDEyMDQsIDB4NUI1QiwgMHgxMjA1LCAweDVCNUMsIDB4MDhBOCwgMHg1QjVELCAweDA3QjksIDB4NUI1RiwKKyAgICAweDBFREUsIDB4NUI2MywgMHgwNjQyLCAweDVCNjQsIDB4MDc3RCwgMHg1QjY1LCAweDEyMDYsIDB4NUI2NiwgMHgwNUI2LAorICAgIDB4NUI2OCwgMHg0NDcxLCAweDVCNjksIDB4MTIwNywgMHg1QjZCLCAweDBCMTksIDB4NUI2RiwgMHg0NDcyLCAweDVCNzAsCisgICAgMHgxMjA4LCAweDVCNzEsIDB4MTIzMCwgMHg1QjczLCAweDEyMDksIDB4NUI3NSwgMHgxMjBBLCAweDVCNzYsIDB4MzcyOCwKKyAgICAweDVCNzgsIDB4MTIwQiwgMHg1QjdBLCAweDEyMEQsIDB4NUI3QywgMHgzODg4LCAweDVCN0QsIDB4NDFDMiwgMHg1QjdFLAorICAgIDB4Mzg4OSwgMHg1QjdGLCAweDM4OEEsIDB4NUI4MCwgMHgxMjBFLCAweDVCODEsIDB4NDQ3MywgMHg1QjgyLCAweDM2MTAsCisgICAgMHg1QjgzLCAweDEyMEYsIDB4NUI4NCwgMHg0NDc0LCAweDVCODUsIDB4MEI1MCwgMHg1Qjg3LCAweDA0QzksIDB4NUI4OCwKKyAgICAweDA5MTUsIDB4NUI4OSwgMHgwNDg2LCAweDVCOEEsIDB4Mzg4QiwgMHg1QjhCLCAweDBBRDksIDB4NUI4QywgMHgwNUVDLAorICAgIDB4NUI4RCwgMHgwOEUxLCAweDVCOEYsIDB4MDdCQSwgMHg1QjkzLCAweDQxQzMsIDB4NUI5NSwgMHgwQzYwLCAweDVCOTYsCisgICAgMHg0NDc2LCAweDVCOTcsIDB4MDkyQiwgMHg1Qjk4LCAweDA1RUQsIDB4NUI5OSwgMHgwQkE2LCAweDVCOUEsIDB4MEMwNiwKKyAgICAweDVCOUIsIDB4MDQ3QywgMHg1QjlDLCAweDA2NTMsIDB4NUI5RCwgMHgwRTQ1LCAweDVCOUYsIDB4MDhFRSwgMHg1QkEyLAorICAgIDB4MDY2QywgMHg1QkEzLCAweDBBOEYsIDB4NUJBNCwgMHgwOEU4LCAweDVCQTUsIDB4MEYxMiwgMHg1QkE2LCAweDEyMTAsCisgICAgMHg1QkFDLCAweDQ0NzcsIDB4NUJBRSwgMHgwNjc2LCAweDVCQjAsIDB4MDgzQiwgMHg1QkIzLCAweDA1OTAsIDB4NUJCNCwKKyAgICAweDA1MDUsIDB4NUJCNSwgMHgwOTk0LCAweDVCQjYsIDB4MDU0OCwgMHg1QkI3LCAweDRCNzksIDB4NUJCOCwgMHgxMjExLAorICAgIDB4NUJCOSwgMHgwRjMwLCAweDVCQkYsIDB4MDk1MywgMHg1QkMwLCAweDIwRjEsIDB4NUJDMiwgMHgwOTEwLCAweDVCQzMsCisgICAgMHgxMjEyLCAweDVCQzQsIDB4MDYyRiwgMHg1QkM1LCAweDBDQUEsIDB4NUJDNiwgMHgwRUI1LCAweDVCQzcsIDB4MTIxMywKKyAgICAweDVCQzksIDB4MTIxNCwgMHg1QkNDLCAweDBEQ0IsIDB4NUJDRSwgMHg0NDdBLCAweDVCRDAsIDB4MTIxNiwgMHg1QkQyLAorICAgIDB4MDVFNCwgMHg1QkQzLCAweDA2RUYsIDB4NUJENCwgMHgxMjE1LCAweDVCRDYsIDB4NDQ3QiwgMHg1QkQ3LCAweDRCN0EsCisgICAgMHg1QkQ4LCAweDIwRjMsIDB4NUJEQiwgMHgwNUVFLCAweDVCREQsIDB4MDlGOCwgMHg1QkRFLCAweDEyMUEsIDB4NUJERiwKKyAgICAweDA4NkYsIDB4NUJFMCwgMHg0QjdCLCAweDVCRTEsIDB4MDU0OSwgMHg1QkUyLCAweDEyMTksIDB4NUJFNCwgMHgxMjE3LAorICAgIDB4NUJFNSwgMHgxMjFCLCAweDVCRTYsIDB4MTIxOCwgMHg1QkU3LCAweDBDRTEsIDB4NUJFOCwgMHgxNDhFLCAweDVCRTksCisgICAgMHgwOUY5LCAweDVCRUIsIDB4MTIxQywgMHg1QkVDLCAweDRGNEUsIDB4NUJFRSwgMHgwRjg4LCAweDVCRjAsIDB4MTIxRCwKKyAgICAweDVCRjEsIDB4NDQ3RSwgMHg1QkYzLCAweDEyMUYsIDB4NUJGNSwgMHgwQkJDLCAweDVCRjYsIDB4MTIxRSwgMHg1QkY4LAorICAgIDB4MEE0NywgMHg1QkZBLCAweDA4QzksIDB4NUJGRCwgMHg0NDdGLCAweDVCRkUsIDB4MEIzMCwgMHg1QkZGLCAweDA5MjMsCisgICAgMHg1QzAxLCAweDBERTcsIDB4NUMwMiwgMHgwQTkwLCAweDVDMDMsIDB4NDQ4MSwgMHg1QzA0LCAweDA4RjksIDB4NUMwNSwKKyAgICAweDEyMjAsIDB4NUMwNiwgMHgwOTk1LCAweDVDMDcsIDB4MTIyMSwgMHg1QzA4LCAweDEyMjIsIDB4NUMwOSwgMHgwNDk3LAorICAgIDB4NUMwQSwgMHgwQjFBLCAweDVDMEIsIDB4MEExOCwgMHg1QzBELCAweDEyMjMsIDB4NUMwRSwgMHgwQzhCLCAweDVDMEYsCisgICAgMHgwOTk2LCAweDVDMTEsIDB4MDk5NywgMHg1QzEyLCAweDQxQzQsIDB4NUMxMywgMHgxMjI0LCAweDVDMTQsIDB4MzcyQSwKKyAgICAweDVDMTYsIDB4MEE5MSwgMHg1QzE5LCAweDM2MEIsIDB4NUMxQSwgMHgwOTk4LCAweDVDMUUsIDB4MjBGNSwgMHg1QzFGLAorICAgIDB4NEI3QywgMHg1QzIwLCAweDEyMjUsIDB4NUMyMiwgMHgxMjI2LCAweDVDMjMsIDB4Mzg4QywgMHg1QzI0LCAweDBFRUMsCisgICAgMHg1QzI4LCAweDEyMjcsIDB4NUMyOSwgMHg0NDgyLCAweDVDMkEsIDB4NEI3RCwgMHg1QzJCLCAweDM4OEQsIDB4NUMyQywKKyAgICAweDRCN0UsIDB4NUMyRCwgMHgwNkJFLCAweDVDMzAsIDB4Mzg4RSwgMHg1QzMxLCAweDA5MkMsIDB4NUMzNiwgMHg0QjdGLAorICAgIDB4NUMzOCwgMHgxMjI4LCAweDVDMzksIDB4MTIyOSwgMHg1QzNBLCAweDA5MDgsIDB4NUMzQiwgMHgwOUYyLCAweDVDM0MsCisgICAgMHgwQ0NDLCAweDVDM0QsIDB4MEExQSwgMHg1QzNFLCAweDBEOEMsIDB4NUMzRiwgMHgwQ0Q4LCAweDVDNDAsIDB4MDZDMSwKKyAgICAweDVDNDEsIDB4MTIyQSwgMHg1QzQ1LCAweDA2ODksIDB4NUM0NiwgMHgxMjJCLCAweDVDNDgsIDB4MDZGNiwgMHg1QzRBLAorICAgIDB4MENBNywgMHg1QzRCLCAweDA1MzAsIDB4NUM0RCwgMHgwOEExLCAweDVDNEUsIDB4MTIyQywgMHg1QzRGLCAweDEyMkYsCisgICAgMHg1QzUwLCAweDEyMkUsIDB4NUM1MSwgMHgwNkY1LCAweDVDNTMsIDB4MTIyRCwgMHg1QzU1LCAweDBDMzIsIDB4NUM1OSwKKyAgICAweDRCODAsIDB4NUM1QiwgMHgxRTkyLCAweDVDNUMsIDB4NEI4MSwgMHg1QzVFLCAweDBCMTAsIDB4NUM1RiwgMHg0NDg0LAorICAgIDB4NUM2MCwgMHgwQzQ1LCAweDVDNjEsIDB4MDhGNCwgMHg1QzYyLCAweDFFMEQsIDB4NUM2MywgMHgzODhGLCAweDVDNjQsCisgICAgMHgwQURBLCAweDVDNjUsIDB4MEY2NCwgMHg1QzY3LCAweDQ0ODUsIDB4NUM2OCwgMHg0NDg2LCAweDVDNjksIDB4Mzg5MCwKKyAgICAweDVDNkMsIDB4MTIzMSwgMHg1QzZELCAweDRCODIsIDB4NUM2RSwgMHgxMjMyLCAweDVDNkYsIDB4MENBRSwgMHg1QzcwLAorICAgIDB4NDQ4NywgMHg1QzcxLCAweDA4ODEsIDB4NUM3NiwgMHgxMjM0LCAweDVDNzksIDB4MTIzNSwgMHg1QzdBLCAweDQxQzcsCisgICAgMHg1QzdDLCAweDM4OTEsIDB4NUM4OCwgMHg0NDhDLCAweDVDOEEsIDB4NDQ4RCwgMHg1QzhDLCAweDEyMzYsIDB4NUM4RiwKKyAgICAweDQxQzgsIDB4NUM5MCwgMHgwNjMwLCAweDVDOTEsIDB4MTIzNywgMHg1Qzk0LCAweDEyMzgsIDB4NUM5RiwgMHg0MUM5LAorICAgIDB4NUNBMCwgMHg0NDkxLCAweDVDQTEsIDB4MDUyQywgMHg1Q0EyLCAweDQ0OTIsIDB4NUNBMywgMHg0MUNBLCAweDVDQTYsCisgICAgMHgyMEY2LCAweDVDQTcsIDB4NDQ5MywgMHg1Q0E4LCAweDBBQkQsIDB4NUNBOSwgMHgwNjIwLCAweDVDQUEsIDB4NDFDQiwKKyAgICAweDVDQUIsIDB4MTIzQSwgMHg1Q0FDLCAweDBFQjQsIDB4NUNBRCwgMHg0NDk1LCAweDVDQjEsIDB4MEIzMiwgMHg1Q0IzLAorICAgIDB4MDVCNywgMHg1Q0I1LCAweDQ0OTYsIDB4NUNCNiwgMHgxMjNDLCAweDVDQjcsIDB4MTIzRSwgMHg1Q0I4LCAweDA2MUIsCisgICAgMHg1Q0JBLCAweDIwRjcsIDB4NUNCQiwgMHgxMjNCLCAweDVDQkMsIDB4MTIzRCwgMHg1Q0JFLCAweDEyNDAsIDB4NUNDNSwKKyAgICAweDEyM0YsIDB4NUNDNywgMHgxMjQxLCAweDVDQzksIDB4NDQ5OCwgMHg1Q0NCLCAweDM4OTIsIDB4NUNEMCwgMHg0MUNDLAorICAgIDB4NUNEMiwgMHgzODkzLCAweDVDRDksIDB4MTI0MiwgMHg1Q0RELCAweDRCODMsIDB4NUNFMCwgMHgwQzk1LCAweDVDRTEsCisgICAgMHgwNkE2LCAweDVDRTYsIDB4MzcyQywgMHg1Q0U4LCAweDA1NjUsIDB4NUNFOSwgMHgxMjQzLCAweDVDRUEsIDB4MTI0OCwKKyAgICAweDVDRUQsIDB4MTI0NiwgMHg1Q0VGLCAweDBFNDcsIDB4NUNGMCwgMHgwRTQ2LCAweDVDRjQsIDB4Mzg5NCwgMHg1Q0Y1LAorICAgIDB4MjBGOCwgMHg1Q0Y2LCAweDBDNjEsIDB4NUNGQSwgMHgxMjQ1LCAweDVDRkIsIDB4MDk1RSwgMHg1Q0ZELCAweDEyNDQsCisgICAgMHg1RDAxLCAweDRCODQsIDB4NUQwNiwgMHg0NDlCLCAweDVEMDcsIDB4MEEzOCwgMHg1RDBCLCAweDEyNDksIDB4NUQwRCwKKyAgICAweDQxQ0UsIDB4NUQwRSwgMHgwODVBLCAweDVEMTAsIDB4NDQ5QywgMHg1RDExLCAweDEyNEYsIDB4NUQxNCwgMHgxMjUwLAorICAgIDB4NUQxNSwgMHgxMjRBLCAweDVEMTYsIDB4MDU5MSwgMHg1RDE3LCAweDEyNEIsIDB4NUQxOCwgMHgxMjU0LCAweDVEMTksCisgICAgMHgxMjUzLCAweDVEMUEsIDB4MTI1MiwgMHg1RDFCLCAweDEyNEUsIDB4NUQxRCwgMHg0NDlFLCAweDVEMUYsIDB4MTI0RCwKKyAgICAweDVEMjAsIDB4NDQ5RiwgMHg1RDIyLCAweDEyNTEsIDB4NUQyNCwgMHgzODk1LCAweDVEMjYsIDB4Mzg5NiwgMHg1RDI3LAorICAgIDB4MjBGOSwgMHg1RDI5LCAweDBFNDgsIDB4NUQyQiwgMHg0NDlELCAweDVEMzEsIDB4NDRBMCwgMHg1RDM0LCAweDRCODUsCisgICAgMHg1RDM5LCAweDQ0QTEsIDB4NUQzRCwgMHg0Qjg2LCAweDVENDIsIDB4MjBGQywgMHg1RDQzLCAweDM4OTcsIDB4NUQ0NiwKKyAgICAweDM4OTgsIDB4NUQ0NywgMHg0MUNGLCAweDVENEEsIDB4Mzg5OSwgMHg1RDRCLCAweDEyNTgsIDB4NUQ0QywgMHgxMjU1LAorICAgIDB4NUQ0RSwgMHgxMjU3LCAweDVENTAsIDB4MEY1QywgMHg1RDUyLCAweDEyNTYsIDB4NUQ1MywgMHgyMEZBLCAweDVENTksCisgICAgMHg0Qjg3LCAweDVENUMsIDB4MTI0QywgMHg1RDYxLCAweDQ0QTMsIDB4NUQ2OSwgMHgwQTM5LCAweDVENkEsIDB4NDRBNCwKKyAgICAweDVENkMsIDB4MTI1OSwgMHg1RDZELCAweDIwRkQsIDB4NUQ2RiwgMHgwODI3LCAweDVENzAsIDB4NDRBNiwgMHg1RDczLAorICAgIDB4MTI1QSwgMHg1RDc2LCAweDEyNUIsIDB4NUQ3RSwgMHg0Qjg4LCAweDVEODEsIDB4NDFEMCwgMHg1RDgyLCAweDEyNUUsCisgICAgMHg1RDgzLCAweDRCODksIDB4NUQ4NCwgMHgxMjVELCAweDVEODcsIDB4MTI1QywgMHg1RDg4LCAweDQ0QTksIDB4NUQ4QiwKKyAgICAweDBDNjIsIDB4NUQ4QywgMHgxMjQ3LCAweDVEOTAsIDB4MTI2NCwgMHg1RDkyLCAweDM4OUEsIDB4NUQ5NCwgMHgzODlCLAorICAgIDB4NUQ5NywgMHg0NEFCLCAweDVEOTksIDB4Mzg5QywgMHg1RDlELCAweDEyNjAsIDB4NURBMCwgMHgzODlELCAweDVEQTIsCisgICAgMHgxMjVGLCAweDVEQTQsIDB4NDFEMSwgMHg1REE3LCAweDQxRDIsIDB4NURBQywgMHgxMjYxLCAweDVEQUUsIDB4MTI2MiwKKyAgICAweDVEQjAsIDB4NDRBQywgMHg1REIyLCAweDNDMkQsIDB4NURCNCwgMHg0NEFELCAweDVEQjcsIDB4MTI2NSwgMHg1REI4LAorICAgIDB4MjBGRSwgMHg1REI5LCAweDIwRkYsIDB4NURCQSwgMHgwRkFFLCAweDVEQkMsIDB4MTI2NiwgMHg1REJELCAweDEyNjMsCisgICAgMHg1REM3LCAweDRCOEEsIDB4NURDOSwgMHgxMjY3LCAweDVEQ0IsIDB4NDFEMywgMHg1RENDLCAweDA2MUMsIDB4NURDRCwKKyAgICAweDEyNjgsIDB4NUREMCwgMHgyMTAwLCAweDVERDEsIDB4NDRBRiwgMHg1REQyLCAweDEyNkEsIDB4NUREMywgMHgxMjY5LAorICAgIDB4NURENiwgMHgxMjZCLCAweDVERDcsIDB4NDRCMCwgMHg1REQ4LCAweDM4OUUsIDB4NUREQiwgMHgxMjZDLCAweDVEREQsCisgICAgMHgwQTkyLCAweDVEREUsIDB4MDkyRCwgMHg1REUwLCAweDM4OUYsIDB4NURFMSwgMHgwOTZFLCAweDVERTIsIDB4MzQzMiwKKyAgICAweDVERTMsIDB4MEFFNSwgMHg1REU0LCAweDQ0QjIsIDB4NURFNSwgMHgwN0JCLCAweDVERTYsIDB4MDgyOCwgMHg1REU3LAorICAgIDB4MDdCQywgMHg1REU4LCAweDA2OEEsIDB4NURFOSwgMHg0NEIzLCAweDVERUIsIDB4MTI2RCwgMHg1REVFLCAweDA4MjksCisgICAgMHg1REYxLCAweDA3N0UsIDB4NURGMiwgMHgxMjZFLCAweDVERjMsIDB4MEVCMiwgMHg1REY0LCAweDBDRjksIDB4NURGNSwKKyAgICAweDEyNkYsIDB4NURGNywgMHgwN0JELCAweDVERjgsIDB4MzhBMCwgMHg1REY5LCAweDRCOEIsIDB4NURGQiwgMHgwNUU4LAorICAgIDB4NURGRCwgMHgwQjY1LCAweDVERkUsIDB4MDZDQSwgMHg1REZGLCAweDM1RTIsIDB4NUUwMCwgMHgzOEExLCAweDVFMDIsCisgICAgMHgwOEEyLCAweDVFMDMsIDB4MERDRCwgMHg1RTA2LCAweDBENTUsIDB4NUUwQiwgMHgxMjcwLCAweDVFMEMsIDB4MDYzMSwKKyAgICAweDVFMTEsIDB4MTI3MywgMHg1RTEyLCAweDM4QTIsIDB4NUUxNCwgMHgzOEEzLCAweDVFMTUsIDB4MzhBNCwgMHg1RTE2LAorICAgIDB4MEJCRCwgMHg1RTE4LCAweDM4QTUsIDB4NUUxOSwgMHgxMjcyLCAweDVFMUEsIDB4MTI3MSwgMHg1RTFCLCAweDEyNzQsCisgICAgMHg1RTFELCAweDBDMDcsIDB4NUUxRiwgMHg0NEI3LCAweDVFMjUsIDB4MEEyOSwgMHg1RTI4LCAweDRCOEMsIDB4NUUyQiwKKyAgICAweDA4QTMsIDB4NUUyRCwgMHgwQTZFLCAweDVFMkUsIDB4MzhBNiwgMHg1RTJGLCAweDBCMzMsIDB4NUUzMCwgMHgwNjNDLAorICAgIDB4NUUzMiwgMHg0QjhELCAweDVFMzMsIDB4MEJCRSwgMHg1RTM1LCAweDRCOEUsIDB4NUUzNiwgMHgxMjc1LCAweDVFMzcsCisgICAgMHgxMjc2LCAweDVFMzgsIDB4MDlENywgMHg1RTNELCAweDBFNjcsIDB4NUUzRSwgMHg0NEI4LCAweDVFNDAsIDB4MTI3OSwKKyAgICAweDVFNDMsIDB4MTI3OCwgMHg1RTQ0LCAweDEyNzcsIDB4NUU0NSwgMHgwREVGLCAweDVFNDcsIDB4MTI4MCwgMHg1RTQ5LAorICAgIDB4NDRCOSwgMHg1RTRDLCAweDBFODgsIDB4NUU0RSwgMHgxMjdBLCAweDVFNTQsIDB4MTI3QywgMHg1RTU1LCAweDBFOTksCisgICAgMHg1RTU2LCAweDQ0QkIsIDB4NUU1NywgMHgxMjdCLCAweDVFNTgsIDB4MzhBNywgMHg1RTVCLCAweDRCOEYsIDB4NUU1RSwKKyAgICAweDQxRDQsIDB4NUU1RiwgMHgxMjdELCAweDVFNjEsIDB4MEQzQywgMHg1RTYyLCAweDEyN0UsIDB4NUU2MywgMHgwRTBFLAorICAgIDB4NUU2NCwgMHgxMjdGLCAweDVFNjgsIDB4NEI5MCwgMHg1RTZBLCAweDRCOTEsIDB4NUU2QiwgMHgzOEE4LCAweDVFNkMsCisgICAgMHgzOEE5LCAweDVFNkQsIDB4NDRCRCwgMHg1RTZFLCAweDQ0QkUsIDB4NUU3MiwgMHgwNUVGLCAweDVFNzMsIDB4MEUwRiwKKyAgICAweDVFNzQsIDB4MENFNSwgMHg1RTc1LCAweDEyODEsIDB4NUU3NiwgMHgxMjgyLCAweDVFNzcsIDB4NEI5MiwgMHg1RTc4LAorICAgIDB4MDdCRSwgMHg1RTc5LCAweDA1RjAsIDB4NUU3QSwgMHgxMjgzLCAweDVFN0IsIDB4MDc2QywgMHg1RTdDLCAweDBGMkUsCisgICAgMHg1RTdELCAweDBGMTMsIDB4NUU3RSwgMHgwNjMyLCAweDVFN0YsIDB4MTI4NSwgMHg1RTgwLCAweDRCOTMsIDB4NUU4MSwKKyAgICAweDBCQkYsIDB4NUU4MywgMHgwN0JGLCAweDVFODQsIDB4MDk5OSwgMHg1RTg3LCAweDBENzMsIDB4NUU4QSwgMHgwOTlBLAorICAgIDB4NUU4QiwgMHg0Qjk0LCAweDVFOEYsIDB4MDk4MiwgMHg1RTk1LCAweDBDMDgsIDB4NUU5NiwgMHgwRTQ5LCAweDVFOTcsCisgICAgMHgwQzMzLCAweDVFOTksIDB4MzZCMCwgMHg1RTlBLCAweDA3QzAsIDB4NUU5QywgMHgwRENFLCAweDVFQTAsIDB4MTI4NiwKKyAgICAweDVFQTUsIDB4NDRDMCwgMHg1RUE2LCAweDBDNTMsIDB4NUVBNywgMHgwODMyLCAweDVFQTgsIDB4MzhBQSwgMHg1RUFBLAorICAgIDB4MzhBQiwgMHg1RUFCLCAweDA3N0YsIDB4NUVBQywgMHg0NEMxLCAweDVFQUQsIDB4MEMwOSwgMHg1RUIzLCAweDRCOTUsCisgICAgMHg1RUI1LCAweDA0ODcsIDB4NUVCNiwgMHgwOTc4LCAweDVFQjcsIDB4MDdDMSwgMHg1RUI4LCAweDBGMzEsIDB4NUVCOSwKKyAgICAweDQ0QzIsIDB4NUVCRCwgMHg0Qjk2LCAweDVFQkUsIDB4MzhBQywgMHg1RUJGLCAweDM4QUQsIDB4NUVDMSwgMHgxMjg3LAorICAgIDB4NUVDMiwgMHgxMjg4LCAweDVFQzMsIDB4MEQwNywgMHg1RUM2LCAweDQ0QzMsIDB4NUVDOCwgMHgxMjg5LCAweDVFQzksCisgICAgMHgwRkJGLCAweDVFQ0EsIDB4MEZEMywgMHg1RUNCLCAweDNDMUUsIDB4NUVDRiwgMHgxMjhCLCAweDVFRDAsIDB4MTI4QSwKKyAgICAweDVFRDEsIDB4NEI5NywgMHg1RUQyLCAweDM4QUYsIDB4NUVEMywgMHgwNUE1LCAweDVFRDQsIDB4NEI5OCwgMHg1RUQ1LAorICAgIDB4NEI5OSwgMHg1RUQ2LCAweDEyOEMsIDB4NUVEOSwgMHg0NEM0LCAweDVFREEsIDB4MTI4RiwgMHg1RURCLCAweDEyOTAsCisgICAgMHg1RURELCAweDEyOEUsIDB4NUVERiwgMHgwREIyLCAweDVFRTAsIDB4MDk5QiwgMHg1RUUxLCAweDEyOTIsIDB4NUVFMiwKKyAgICAweDEyOTEsIDB4NUVFMywgMHgxMjhELCAweDVFRTgsIDB4MTI5MywgMHg1RUU5LCAweDEyOTQsIDB4NUVFQywgMHgxMjk1LAorICAgIDB4NUVGMCwgMHgxMjk4LCAweDVFRjEsIDB4MTI5NiwgMHg1RUYzLCAweDEyOTcsIDB4NUVGNCwgMHgxMjk5LCAweDVFRjYsCisgICAgMHgwNTA2LCAweDVFRjcsIDB4MEMwQSwgMHg1RUY4LCAweDEyOUEsIDB4NUVGOSwgMHg0MUQ1LCAweDVFRkEsIDB4MDc1MCwKKyAgICAweDVFRkIsIDB4MDU3NiwgMHg1RUZDLCAweDBDRUMsIDB4NUVGRCwgMHg0NEM2LCAweDVFRkUsIDB4MTI5QiwgMHg1RUZGLAorICAgIDB4MENEMywgMHg1RjAwLCAweDQxRDYsIDB4NUYwMSwgMHgwRTJCLCAweDVGMDIsIDB4NDFENywgMHg1RjAzLCAweDEyOUMsCisgICAgMHg1RjA0LCAweDBGRDQsIDB4NUYwNywgMHgzOEIwLCAweDVGMDgsIDB4NDRDNywgMHg1RjA5LCAweDEyOUQsIDB4NUYwQSwKKyAgICAweDBFMTAsIDB4NUYwQiwgMHgxMkEwLCAweDVGMEMsIDB4MEZGQSwgMHg1RjBELCAweDEwMEEsIDB4NUYwRSwgMHgzOEIxLAorICAgIDB4NUYwRiwgMHgwOERDLCAweDVGMTAsIDB4MENDRCwgMHg1RjExLCAweDEyQTEsIDB4NUYxMywgMHgwNjc3LCAweDVGMTQsCisgICAgMHgwQkMwLCAweDVGMTUsIDB4MDRCRSwgMHg1RjE2LCAweDEyQTIsIDB4NUYxNywgMHgwREY2LCAweDVGMTgsIDB4MDdDMiwKKyAgICAweDVGMUIsIDB4MEI4RSwgMHg1RjFDLCAweDM4QjIsIDB4NUYxRCwgMHgzOEIzLCAweDVGMUUsIDB4NDRDOSwgMHg1RjFGLAorICAgIDB4MEMwQiwgMHg1RjIxLCAweDIxMDEsIDB4NUYyMiwgMHgzOEI0LCAweDVGMjMsIDB4NDFEOCwgMHg1RjI1LCAweDBFRkIsCisgICAgMHg1RjI2LCAweDA3NkQsIDB4NUYyNywgMHgwNzgwLCAweDVGMjgsIDB4MzhCNSwgMHg1RjI5LCAweDEyQTMsIDB4NUYyRCwKKyAgICAweDEyQTQsIDB4NUYyRiwgMHgxMkFBLCAweDVGMzEsIDB4MDkxMSwgMHg1RjM0LCAweDIxMDIsIDB4NUYzNSwgMHgwQkMxLAorICAgIDB4NUYzNiwgMHgzOEI2LCAweDVGMzcsIDB4MDZBNywgMHg1RjM4LCAweDEyQTUsIDB4NUYzQSwgMHgzNTk4LCAweDVGM0IsCisgICAgMHgzOEI3LCAweDVGM0MsIDB4MEQ5RCwgMHg1RjNELCAweDQxRDksIDB4NUYzRSwgMHgwQjg0LCAweDVGNDAsIDB4MzhCOCwKKyAgICAweDVGNDEsIDB4MTJBNiwgMHg1RjQ1LCAweDIwQjIsIDB4NUY0NywgMHg0NENBLCAweDVGNDgsIDB4MTJBNywgMHg1RjRBLAorICAgIDB4MDZBOCwgMHg1RjRDLCAweDEyQTgsIDB4NUY0RCwgMHg0QjlBLCAweDVGNEUsIDB4MTJBOSwgMHg1RjUwLCAweDM4QjksCisgICAgMHg1RjUxLCAweDEyQUIsIDB4NUY1MywgMHgwQzcwLCAweDVGNTQsIDB4NDFEQSwgMHg1RjU2LCAweDEyQUMsIDB4NUY1NywKKyAgICAweDEyQUQsIDB4NUY1OCwgMHgzOEJBLCAweDVGNTksIDB4MTJBRSwgMHg1RjVDLCAweDEyOUYsIDB4NUY1RCwgMHgxMjlFLAorICAgIDB4NUY2MSwgMHgxMkFGLCAweDVGNjIsIDB4MDcxNywgMHg1RjYzLCAweDQ0Q0IsIDB4NUY2NCwgMHgzOEJCLCAweDVGNjUsCisgICAgMHgzNkFDLCAweDVGNjYsIDB4MEQ5OSwgMHg1RjY3LCAweDIxMDMsIDB4NUY2OSwgMHgwODNDLCAweDVGNkEsIDB4MERBOSwKKyAgICAweDVGNkIsIDB4MEJDMiwgMHg1RjZDLCAweDBEQkQsIDB4NUY2RCwgMHgxMkIwLCAweDVGNzAsIDB4MDk5QywgMHg1RjcxLAorICAgIDB4MDRFOCwgMHg1RjcyLCAweDQ0Q0MsIDB4NUY3MywgMHgxMkIxLCAweDVGNzcsIDB4MTJCMiwgMHg1Rjc5LCAweDBFRkUsCisgICAgMHg1RjdDLCAweDBENzQsIDB4NUY3RCwgMHg0MURCLCAweDVGN0UsIDB4NDRDRCwgMHg1RjdGLCAweDEyQjUsIDB4NUY4MCwKKyAgICAweDA1MUYsIDB4NUY4MSwgMHgwQTUwLCAweDVGODIsIDB4MTJCNCwgMHg1RjgzLCAweDEyQjMsIDB4NUY4NCwgMHgwNzE4LAorICAgIDB4NUY4NSwgMHgwQjM0LCAweDVGODcsIDB4MTJCOSwgMHg1Rjg4LCAweDEyQjcsIDB4NUY4OSwgMHgzOEJDLCAweDVGOEEsCisgICAgMHgxMkI2LCAweDVGOEIsIDB4MEY2RiwgMHg1RjhDLCAweDA3OTksIDB4NUY4RiwgMHg0NENFLCAweDVGOTAsIDB4MDk4MywKKyAgICAweDVGOTEsIDB4MTJCOCwgMHg1RjkyLCAweDBDNDYsIDB4NUY5MywgMHgwOTQ4LCAweDVGOTcsIDB4MEM5OCwgMHg1Rjk4LAorICAgIDB4MTJCQywgMHg1Rjk5LCAweDEyQkIsIDB4NUY5QywgMHgzOEJELCAweDVGOUUsIDB4MTJCQSwgMHg1RkEwLCAweDEyQkQsCisgICAgMHg1RkExLCAweDA3OUEsIDB4NUZBMiwgMHg0NENGLCAweDVGQTQsIDB4MzhCRiwgMHg1RkE3LCAweDM4QkUsIDB4NUZBOCwKKyAgICAweDEyQkUsIDB4NUZBOSwgMHgwREVFLCAweDVGQUEsIDB4MDk2NSwgMHg1RkFDLCAweDRCOUIsIDB4NUZBRCwgMHgxMkJGLAorICAgIDB4NUZBRSwgMHgwRDhELCAweDVGQUYsIDB4MzhDMCwgMHg1RkIzLCAweDBDOTksIDB4NUZCNCwgMHgwQkMzLCAweDVGQjUsCisgICAgMHgzNDM4LCAweDVGQjcsIDB4MjEwNCwgMHg1RkI4LCAweDM4QzEsIDB4NUZCOSwgMHgwQzJBLCAweDVGQkMsIDB4MTJDMCwKKyAgICAweDVGQkQsIDB4MDY0NSwgMHg1RkMzLCAweDA5RkEsIDB4NUZDNCwgMHgzOEMyLCAweDVGQzUsIDB4MEQ5RSwgMHg1RkM3LAorICAgIDB4NDREMCwgMHg1RkM5LCAweDM4QzMsIDB4NUZDQiwgMHg0NEQxLCAweDVGQ0MsIDB4MDYzMywgMHg1RkNELCAweDBDREMsCisgICAgMHg1RkQyLCAweDQ0RDIsIDB4NUZEMywgMHg0NEQzLCAweDVGRDQsIDB4NDRENCwgMHg1RkQ2LCAweDEyQzEsIDB4NUZENywKKyAgICAweDA4QTQsIDB4NUZEOCwgMHgwRTY4LCAweDVGRDksIDB4MEU2OSwgMHg1RkRDLCAweDA1MjAsIDB4NUZERCwgMHgxMkM2LAorICAgIDB4NUZERSwgMHgyMTA1LCAweDVGRTAsIDB4MEJBNywgMHg1RkUxLCAweDM4QzQsIDB4NUZFMiwgMHg0NEQ1LCAweDVGRTQsCisgICAgMHgxMkMzLCAweDVGRTksIDB4MzhDNSwgMHg1RkVBLCAweDRCOUMsIDB4NUZFQiwgMHgwNTc3LCAweDVGRUQsIDB4MzhDNiwKKyAgICAweDVGRUUsIDB4NDRENiwgMHg1RkVGLCAweDQ0RDcsIDB4NUZGMCwgMHgxMkY2LCAweDVGRjEsIDB4MTJDNSwgMHg1RkYzLAorICAgIDB4NDREOCwgMHg1RkY1LCAweDBDRTYsIDB4NUZGOCwgMHgxMkM0LCAweDVGRkIsIDB4MTJDMiwgMHg1RkZDLCAweDM4QzcsCisgICAgMHg1RkZELCAweDA4MEMsIDB4NUZGRiwgMHgxMkM4LCAweDYwMDcsIDB4NEI5RCwgMHg2MDBELCAweDQxREMsIDB4NjAwRSwKKyAgICAweDEyQ0UsIDB4NjAwRiwgMHgxMkQ0LCAweDYwMTAsIDB4MTJDQywgMHg2MDEyLCAweDBDNTYsIDB4NjAxNCwgMHg0MURELAorICAgIDB4NjAxNSwgMHgxMkQxLCAweDYwMTYsIDB4MERDRiwgMHg2MDE3LCAweDM4QzgsIDB4NjAxOCwgMHg0MURFLCAweDYwMTksCisgICAgMHgxMkNCLCAweDYwMUEsIDB4MzhDOSwgMHg2MDFCLCAweDEyRDAsIDB4NjAxQywgMHgwRkFGLCAweDYwMUQsIDB4MDhBNSwKKyAgICAweDYwMjAsIDB4MEIzNSwgMHg2MDIxLCAweDEyQzksIDB4NjAyMiwgMHg0NERBLCAweDYwMjQsIDB4NDREQiwgMHg2MDI1LAorICAgIDB4MDY3OCwgMHg2MDI2LCAweDEyRDMsIDB4NjAyNywgMHgwQTUxLCAweDYwMjgsIDB4MDUwNywgMHg2MDI5LCAweDEyQ0QsCisgICAgMHg2MDJBLCAweDA1NzgsIDB4NjAyQiwgMHgxMkQyLCAweDYwMkYsIDB4MDZBOSwgMHg2MDMxLCAweDEyQ0YsIDB4NjAzMywKKyAgICAweDM4Q0EsIDB4NjAzNSwgMHg0MURGLCAweDYwM0EsIDB4MTJENSwgMHg2MDQxLCAweDEyRDcsIDB4NjA0MiwgMHgxMkUxLAorICAgIDB4NjA0MywgMHgxMkRGLCAweDYwNDYsIDB4MTJEQywgMHg2MDQ3LCAweDQxRTAsIDB4NjA0OSwgMHg0QjlFLCAweDYwNEEsCisgICAgMHgxMkRCLCAweDYwNEIsIDB4MEZDMCwgMHg2MDRDLCAweDQ0REQsIDB4NjA0RCwgMHgxMkRELCAweDYwNTAsIDB4MDZBQSwKKyAgICAweDYwNTIsIDB4MDdDMywgMHg2MDU0LCAweDRCOUYsIDB4NjA1NSwgMHgwOTg0LCAweDYwNTksIDB4MTJFNCwgMHg2MDVBLAorICAgIDB4MTJENiwgMHg2MDVELCAweDIxMDYsIDB4NjA1RiwgMHgxMkRBLCAweDYwNjAsIDB4MTJDQSwgMHg2MDYxLCAweDM4Q0IsCisgICAgMHg2MDYyLCAweDA1N0EsIDB4NjA2MywgMHgxMkRFLCAweDYwNjQsIDB4MTJFMCwgMHg2MDY1LCAweDBCOEYsIDB4NjA2NywKKyAgICAweDRCQTAsIDB4NjA2OCwgMHgwODE4LCAweDYwNjksIDB4MDUzOCwgMHg2MDZBLCAweDEyRDgsIDB4NjA2QiwgMHgxMkUzLAorICAgIDB4NjA2QywgMHgxMkUyLCAweDYwNkQsIDB4MDZBQiwgMHg2MDZGLCAweDBCMDksIDB4NjA3MCwgMHgwNUM0LCAweDYwNzUsCisgICAgMHgwNzE5LCAweDYwNzcsIDB4MTJEOSwgMHg2MDdGLCAweDM4Q0MsIDB4NjA4MSwgMHgxMkU1LCAweDYwODMsIDB4MTJFOCwKKyAgICAweDYwODQsIDB4MTJFQSwgMHg2MDg1LCAweDIxMDcsIDB4NjA4OSwgMHgwOEU5LCAweDYwOEEsIDB4MjEwOCwgMHg2MDhCLAorICAgIDB4MTJGMCwgMHg2MDhDLCAweDBDMEMsIDB4NjA4RCwgMHgxMkU2LCAweDYwOTIsIDB4MTJFRSwgMHg2MDk0LCAweDA1NzksCisgICAgMHg2MDk1LCAweDQ0REUsIDB4NjA5NiwgMHgxMkVDLCAweDYwOTcsIDB4MTJFRCwgMHg2MDlBLCAweDEyRTksIDB4NjA5QiwKKyAgICAweDEyRUIsIDB4NjA5RCwgMHg0MUUxLCAweDYwOUUsIDB4MzhDRCwgMHg2MDlGLCAweDA3OUIsIDB4NjBBMCwgMHgwRjE0LAorICAgIDB4NjBBMywgMHgwNUYxLCAweDYwQTQsIDB4MzhDRSwgMHg2MEE2LCAweDA0RkIsIDB4NjBBNywgMHgxMkVGLCAweDYwQTgsCisgICAgMHg0NERGLCAweDYwQTksIDB4MENGMCwgMHg2MEFBLCAweDA0NzEsIDB4NjBCMCwgMHgzOENGLCAweDYwQjEsIDB4NDRFMSwKKyAgICAweDYwQjIsIDB4MEQ3NSwgMHg2MEIzLCAweDEyQzcsIDB4NjBCNCwgMHgxMkY1LCAweDYwQjUsIDB4MTJGOSwgMHg2MEI2LAorICAgIDB4MEVGMSwgMHg2MEI4LCAweDEyRjIsIDB4NjBCQiwgMHg0QkExLCAweDYwQkMsIDB4MEM2MywgMHg2MEJELCAweDEyRjcsCisgICAgMHg2MEJFLCAweDQ0RTIsIDB4NjBDNCwgMHg0QkEyLCAweDYwQzUsIDB4MDlEOCwgMHg2MEM2LCAweDEyRjgsIDB4NjBDNywKKyAgICAweDBDQUYsIDB4NjBDOCwgMHg0NEUzLCAweDYwQ0IsIDB4MzhEMCwgMHg2MEQxLCAweDBGRUQsIDB4NjBEMywgMHgxMkY0LAorICAgIDB4NjBENCwgMHg0MUUyLCAweDYwRDUsIDB4MjEwQSwgMHg2MEQ4LCAweDEyRkEsIDB4NjBEOSwgMHg0NEU0LCAweDYwREEsCisgICAgMHgwODBELCAweDYwREIsIDB4MzhEMSwgMHg2MERDLCAweDBBNkYsIDB4NjBERCwgMHg0MUUzLCAweDYwREUsIDB4MjEwOSwKKyAgICAweDYwREYsIDB4MDQ5OCwgMHg2MEUwLCAweDEyRjMsIDB4NjBFMSwgMHgxMkYxLCAweDYwRTMsIDB4MEFEQywgMHg2MEU3LAorICAgIDB4MTJFNywgMHg2MEU4LCAweDA4ODIsIDB4NjBFRSwgMHg0NEU1LCAweDYwRjAsIDB4MEIyNiwgMHg2MEYxLCAweDEzMDYsCisgICAgMHg2MEYyLCAweDIxMEMsIDB4NjBGMywgMHgwQURELCAweDYwRjQsIDB4MTMwMSwgMHg2MEY1LCAweDQ0RTYsIDB4NjBGNiwKKyAgICAweDEyRkUsIDB4NjBGNywgMHgxMkZGLCAweDYwRjgsIDB4MzhEMiwgMHg2MEY5LCAweDA5MTIsIDB4NjBGQSwgMHgxMzAyLAorICAgIDB4NjBGQiwgMHgxMzA1LCAweDYwRkQsIDB4NEJBMywgMHg2MTAwLCAweDEzMDAsIDB4NjEwMSwgMHgwOTJGLCAweDYxMDMsCisgICAgMHgxMzAzLCAweDYxMDYsIDB4MTJGRCwgMHg2MTA4LCAweDBGMDgsIDB4NjEwOSwgMHgwRjA3LCAweDYxMEEsIDB4NEJBNCwKKyAgICAweDYxMEQsIDB4MTMwNywgMHg2MTBFLCAweDEzMDgsIDB4NjEwRiwgMHgwNDk5LCAweDYxMTAsIDB4NDRFNywgMHg2MTExLAorICAgIDB4MjEwRCwgMHg2MTEyLCAweDM4RDMsIDB4NjExMywgMHgzOEQ0LCAweDYxMTQsIDB4MzhENSwgMHg2MTE1LCAweDEyRkMsCisgICAgMHg2MTE2LCAweDRCQTUsIDB4NjExOSwgMHg0NEU4LCAweDYxMUEsIDB4MDZFQSwgMHg2MTFCLCAweDA0NkEsIDB4NjExQywKKyAgICAweDM4RDYsIDB4NjExRSwgMHg0NEU5LCAweDYxMUYsIDB4MDVGMiwgMHg2MTIwLCAweDIxMEIsIDB4NjEyMSwgMHgxMzA0LAorICAgIDB4NjEyNywgMHgxMzBDLCAweDYxMjgsIDB4MTMwQiwgMHg2MTJBLCAweDRCQTYsIDB4NjEyQiwgMHg0MUU0LCAweDYxMkMsCisgICAgMHgxMzEwLCAweDYxMzAsIDB4MjEwRiwgMHg2MTM0LCAweDEzMTEsIDB4NjEzNiwgMHg0QkE3LCAweDYxMzcsIDB4MjEwRSwKKyAgICAweDYxM0EsIDB4NDRFQSwgMHg2MTNDLCAweDEzMEYsIDB4NjEzRCwgMHgxMzEyLCAweDYxM0UsIDB4MTMwQSwgMHg2MTNGLAorICAgIDB4MTMwRSwgMHg2MTQxLCAweDQ0RUMsIDB4NjE0MiwgMHgxMzEzLCAweDYxNDQsIDB4MTMxNCwgMHg2MTQ2LCAweDQ0RUQsCisgICAgMHg2MTQ3LCAweDEzMDksIDB4NjE0OCwgMHgwOENBLCAweDYxNEEsIDB4MTMwRCwgMHg2MTRCLCAweDBCMzYsIDB4NjE0QywKKyAgICAweDA3QzQsIDB4NjE0RCwgMHgxMkZCLCAweDYxNEUsIDB4MDlGQiwgMHg2MTUzLCAweDEzMjEsIDB4NjE1NSwgMHgwRTM5LAorICAgIDB4NjE1OCwgMHgxMzE3LCAweDYxNTksIDB4MTMxOCwgMHg2MTVBLCAweDEzMTksIDB4NjE1RCwgMHgxMzIwLCAweDYxNUUsCisgICAgMHg0QkE4LCAweDYxNUYsIDB4MTMxRiwgMHg2MTYwLCAweDQ0RUUsIDB4NjE2MiwgMHgwRUFCLCAweDYxNjMsIDB4MDVGMywKKyAgICAweDYxNjQsIDB4NEJBOSwgMHg2MTY1LCAweDEzMUQsIDB4NjE2NywgMHgwNzFCLCAweDYxNjgsIDB4MDU5MiwgMHg2MTZCLAorICAgIDB4MTMxQSwgMHg2MTZFLCAweDBGODAsIDB4NjE2RiwgMHgxMzFDLCAweDYxNzAsIDB4MDQ5QSwgMHg2MTcxLCAweDEzMUUsCisgICAgMHg2MTczLCAweDEzMTUsIDB4NjE3NCwgMHgxMzFCLCAweDYxNzUsIDB4MTMyMiwgMHg2MTc2LCAweDA3MUEsIDB4NjE3NywKKyAgICAweDEzMTYsIDB4NjE3QiwgMHg0QkFBLCAweDYxN0MsIDB4MzhENywgMHg2MTdELCAweDRCQUIsIDB4NjE3RSwgMHgwRjQ3LAorICAgIDB4NjE3RiwgMHg0QkFDLCAweDYxODIsIDB4MEYxNSwgMHg2MTg3LCAweDEzMjUsIDB4NjE4QSwgMHgxMzI5LCAweDYxOEQsCisgICAgMHgzOEQ4LCAweDYxOEUsIDB4MEIwMCwgMHg2MTkwLCAweDBGQzEsIDB4NjE5MSwgMHgxMzJBLCAweDYxOTIsIDB4NDRGMCwKKyAgICAweDYxOTMsIDB4NDRGMSwgMHg2MTk0LCAweDEzMjcsIDB4NjE5NiwgMHgxMzI0LCAweDYxOTcsIDB4NDRGMiwgMHg2MTk4LAorICAgIDB4MjExMCwgMHg2MTk5LCAweDEzMjMsIDB4NjE5QSwgMHgxMzI4LCAweDYxOUQsIDB4NEJBRCwgMHg2MTlGLCAweDM4RDksCisgICAgMHg2MUE0LCAweDBFMDAsIDB4NjFBNSwgMHg0NEYzLCAweDYxQTcsIDB4MEM4QywgMHg2MUE4LCAweDM4REEsIDB4NjFBOSwKKyAgICAweDA3MUMsIDB4NjFBQiwgMHgxMzJCLCAweDYxQUMsIDB4MTMyNiwgMHg2MUFELCAweDQ0RjQsIDB4NjFBRSwgMHgxMzJDLAorICAgIDB4NjFCMiwgMHgwNzUxLCAweDYxQjYsIDB4MDUzMSwgMHg2MUI4LCAweDRCQUUsIDB4NjFCOSwgMHg0MUU2LCAweDYxQkEsCisgICAgMHgxMzM0LCAweDYxQkMsIDB4NDFFNSwgMHg2MUJFLCAweDA1RjQsIDB4NjFDMiwgMHgzOERCLCAweDYxQzMsIDB4MTMzMiwKKyAgICAweDYxQzYsIDB4MTMzMywgMHg2MUM3LCAweDA4MTksIDB4NjFDOCwgMHgxMzMxLCAweDYxQzksIDB4MTMyRiwgMHg2MUNBLAorICAgIDB4MTMyRSwgMHg2MUNCLCAweDEzMzUsIDB4NjFDQywgMHgxMzJELCAweDYxQ0QsIDB4MTMzNywgMHg2MUQwLCAweDA1N0IsCisgICAgMHg2MUQ1LCAweDQ0RjYsIDB4NjFEQywgMHg0QkFGLCAweDYxREQsIDB4NDRGNywgMHg2MURGLCAweDM4REMsIDB4NjFFMiwKKyAgICAweDRCQjAsIDB4NjFFMywgMHgxMzM5LCAweDYxRTUsIDB4NEJCMSwgMHg2MUU2LCAweDEzMzgsIDB4NjFFOCwgMHg0QkIyLAorICAgIDB4NjFGMiwgMHgwQkM0LCAweDYxRjQsIDB4MTMzQywgMHg2MUY1LCAweDQ0RjgsIDB4NjFGNiwgMHgxMzNBLCAweDYxRjcsCisgICAgMHgxMzMwLCAweDYxRjgsIDB4MDc1MiwgMHg2MUZBLCAweDEzM0IsIDB4NjFGQywgMHgxMzNGLCAweDYxRkQsIDB4MTMzRSwKKyAgICAweDYxRkUsIDB4MTM0MCwgMHg2MUZGLCAweDEzM0QsIDB4NjIwMCwgMHgxMzQxLCAweDYyMDQsIDB4NEJCMywgMHg2MjA3LAorICAgIDB4NEJCNCwgMHg2MjA4LCAweDEzNDIsIDB4NjIwOSwgMHgxMzQzLCAweDYyMEEsIDB4MEUzQSwgMHg2MjBDLCAweDEzNDUsCisgICAgMHg2MjBELCAweDEzNDQsIDB4NjIwRSwgMHgwOTQ5LCAweDYyMTAsIDB4MEE1MiwgMHg2MjExLCAweDA1NjYsIDB4NjIxMiwKKyAgICAweDA1N0MsIDB4NjIxMywgMHgyMTExLCAweDYyMTQsIDB4MTM0NiwgMHg2MjE1LCAweDM4REQsIDB4NjIxNiwgMHgwNDgzLAorICAgIDB4NjIxQSwgMHgwQTcwLCAweDYyMUIsIDB4MTM0NywgMHg2MjFELCAweDFBNjQsIDB4NjIxRSwgMHgxMzQ4LCAweDYyMUYsCisgICAgMHgwNzM3LCAweDYyMjEsIDB4MTM0OSwgMHg2MjIyLCAweDQxRTcsIDB4NjIyMywgMHg0NEZBLCAweDYyMjYsIDB4MEE5MywKKyAgICAweDYyMjksIDB4MzhERSwgMHg2MjJBLCAweDEzNEEsIDB4NjIyRSwgMHgxMzRCLCAweDYyMkYsIDB4MDY1NCwgMHg2MjMwLAorICAgIDB4MTM0QywgMHg2MjMxLCAweDRCQjUsIDB4NjIzMiwgMHgxMzRELCAweDYyMzMsIDB4MTM0RSwgMHg2MjM0LCAweDBCMzcsCisgICAgMHg2MjM2LCAweDM1QkQsIDB4NjIzOCwgMHgwNzgxLCAweDYyMzksIDB4NEJCNiwgMHg2MjNCLCAweDBFRUQsIDB4NjIzRCwKKyAgICAweDRCQjcsIDB4NjIzRSwgMHgzNDRFLCAweDYyM0YsIDB4MEU2QSwgMHg2MjQwLCAweDA5NzQsIDB4NjI0MSwgMHgxMzRGLAorICAgIDB4NjI0MywgMHgzOERGLCAweDYyNDYsIDB4MzhFMCwgMHg2MjQ3LCAweDBBOTQsIDB4NjI0OCwgMHgxQjFBLCAweDYyNDksCisgICAgMHgwRDc2LCAweDYyNEIsIDB4MDkxNiwgMHg2MjRDLCAweDM4RTEsIDB4NjI0RCwgMHgwODNELCAweDYyNEUsIDB4MTM1MCwKKyAgICAweDYyNTEsIDB4MzhFMiwgMHg2MjUyLCAweDQ0RkIsIDB4NjI1MywgMHgwQjI3LCAweDYyNTUsIDB4MERGNywgMHg2MjU2LAorICAgIDB4MzhFMywgMHg2MjU4LCAweDBCNTEsIDB4NjI1QSwgMHg0MUU4LCAweDYyNUIsIDB4MTM1MywgMHg2MjVFLCAweDEzNTEsCisgICAgMHg2MjYwLCAweDEzNTQsIDB4NjI2MSwgMHg0NEZDLCAweDYyNjMsIDB4MTM1MiwgMHg2MjY0LCAweDQ0RkQsIDB4NjI2OCwKKyAgICAweDEzNTUsIDB4NjI2RCwgMHg0NEZGLCAweDYyNkUsIDB4MEUwMSwgMHg2MjZGLCAweDQxRTksIDB4NjI3MSwgMHgwNDdCLAorICAgIDB4NjI3MywgMHg0NTAwLCAweDYyNzYsIDB4MEREMCwgMHg2Mjc5LCAweDBENzcsIDB4NjI3QSwgMHg0QkI4LCAweDYyN0IsCisgICAgMHg0NEZFLCAweDYyN0MsIDB4MTM1NiwgMHg2MjdFLCAweDEzNTksIDB4NjI3RiwgMHgwOTlELCAweDYyODAsIDB4MDY1NSwKKyAgICAweDYyODIsIDB4MTM1NywgMHg2MjgzLCAweDEzNUUsIDB4NjI4NCwgMHgwOTlFLCAweDYyODUsIDB4MzVDNSwgMHg2Mjg5LAorICAgIDB4MTM1OCwgMHg2MjhBLCAweDBDRkEsIDB4NjI5MCwgMHg0QkI5LCAweDYyOTEsIDB4MEY0OCwgMHg2MjkyLCAweDEzNUEsCisgICAgMHg2MjkzLCAweDEzNUIsIDB4NjI5NCwgMHgxMzVGLCAweDYyOTUsIDB4MEM2NCwgMHg2Mjk2LCAweDEzNUMsIDB4NjI5NywKKyAgICAweDA3QzUsIDB4NjI5OCwgMHgwQTgyLCAweDYyOTksIDB4NDUwMSwgMHg2MjlCLCAweDEzNkQsIDB4NjI5QywgMHgwRDQ4LAorICAgIDB4NjI5RSwgMHgwQjUyLCAweDYyQTYsIDB4MjExMiwgMHg2MkE4LCAweDRCQkEsIDB4NjJBQiwgMHgwRDc4LCAweDYyQUMsCisgICAgMHgxM0IyLCAweDYyQjEsIDB4MEU0QSwgMHg2MkI1LCAweDBDMEQsIDB4NjJCOSwgMHgwRUEzLCAweDYyQkIsIDB4MTM2MiwKKyAgICAweDYyQkMsIDB4MDUyMSwgMHg2MkJELCAweDBCQTgsIDB4NjJDMiwgMHgxMzZCLCAweDYyQzQsIDB4MzhFNCwgMHg2MkM1LAorICAgIDB4MEI3MiwgMHg2MkM2LCAweDEzNjUsIDB4NjJDNywgMHgxMzZDLCAweDYyQzgsIDB4MTM2NywgMHg2MkM5LCAweDEzNkUsCisgICAgMHg2MkNBLCAweDEzNkEsIDB4NjJDQywgMHgxMzY5LCAweDYyQ0QsIDB4MEQyNSwgMHg2MkNGLCAweDEzNjMsIDB4NjJEMCwKKyAgICAweDA1N0QsIDB4NjJEMSwgMHgxMzYxLCAweDYyRDIsIDB4MDY4QiwgMHg2MkQzLCAweDBCNTMsIDB4NjJENCwgMHgxMzVELAorICAgIDB4NjJENSwgMHg0NTAyLCAweDYyRDYsIDB4NDFFQSwgMHg2MkQ3LCAweDEzNjAsIDB4NjJEOCwgMHgwN0M2LCAweDYyRDksCisgICAgMHgwQTdGLCAweDYyREEsIDB4NEJCQiwgMHg2MkRCLCAweDA5OUYsIDB4NjJEQywgMHgxMzY4LCAweDYyREQsIDB4MEQwOCwKKyAgICAweDYyRTAsIDB4MDY4QywgMHg2MkUxLCAweDA1QTYsIDB4NjJFQywgMHgwNUM1LCAweDYyRUQsIDB4MDlFNywgMHg2MkVFLAorICAgIDB4MTM3MCwgMHg2MkVGLCAweDEzNzUsIDB4NjJGMSwgMHgxMzcxLCAweDYyRjMsIDB4MDc1MywgMHg2MkY0LCAweDRCQkMsCisgICAgMHg2MkY1LCAweDEzNzYsIDB4NjJGNiwgMHgwODcwLCAweDYyRjcsIDB4MDdGQiwgMHg2MkZDLCAweDM4RTUsIDB4NjJGRCwKKyAgICAweDQ1MDQsIDB4NjJGRSwgMHgwOTMwLCAweDYyRkYsIDB4MTM2NCwgMHg2MzAxLCAweDA4Q0IsIDB4NjMwMiwgMHgxMzczLAorICAgIDB4NjMwMywgMHg0NTA1LCAweDYzMDcsIDB4MDhBNiwgMHg2MzA4LCAweDEzNzQsIDB4NjMwOSwgMHgwNDg4LCAweDYzMEEsCisgICAgMHgzOEU2LCAweDYzMEMsIDB4MTM2RiwgMHg2MzBELCAweDM4RTcsIDB4NjMxMCwgMHg0NTA2LCAweDYzMTEsIDB4MEJDNSwKKyAgICAweDYzMTYsIDB4NEJCRCwgMHg2MzE4LCAweDM4RTgsIDB4NjMxOSwgMHgwNjhELCAweDYzMUIsIDB4MzczNywgMHg2MzFGLAorICAgIDB4MDZBQywgMHg2MzI3LCAweDEzNzIsIDB4NjMyOCwgMHgwNDZCLCAweDYzMkEsIDB4NEJCRSwgMHg2MzJCLCAweDA4MzMsCisgICAgMHg2MzJGLCAweDA5RkMsIDB4NjMzMiwgMHg0NTA5LCAweDYzMzUsIDB4NDUwQSwgMHg2MzM2LCAweDRCQkYsIDB4NjMzOSwKKyAgICAweDM4RTksIDB4NjMzQSwgMHgwQzBFLCAweDYzM0IsIDB4NDUwQiwgMHg2MzNDLCAweDQ1MEMsIDB4NjMzRCwgMHgwRDY4LAorICAgIDB4NjMzRSwgMHgxMzc4LCAweDYzM0YsIDB4MEFFMCwgMHg2MzQxLCAweDQ1MEQsIDB4NjM0MiwgMHgzOEVBLCAweDYzNDMsCisgICAgMHgzOEVCLCAweDYzNDQsIDB4NDUwRSwgMHg2MzQ2LCAweDRCQzAsIDB4NjM0OSwgMHgwQjBBLCAweDYzNEIsIDB4NEJDMSwKKyAgICAweDYzNEMsIDB4MDg3OSwgMHg2MzRELCAweDEzNzksIDB4NjM0RSwgMHg0NTBGLCAweDYzNEYsIDB4MTM3QiwgMHg2MzUwLAorICAgIDB4MTM3NywgMHg2MzUzLCAweDRCQzIsIDB4NjM1NSwgMHgwRTMxLCAweDYzNTcsIDB4MEJEOSwgMHg2MzU5LCAweDQ1MTEsCisgICAgMHg2MzVDLCAweDBBREUsIDB4NjM2NSwgMHgzOEVDLCAweDYzNjcsIDB4MEU0QiwgMHg2MzY4LCAweDA4RkEsIDB4NjM2OSwKKyAgICAweDEzODcsIDB4NjM2QiwgMHgxMzg2LCAweDYzNkMsIDB4NDUxNCwgMHg2MzZFLCAweDBBM0UsIDB4NjM3MSwgMHg0QkMzLAorICAgIDB4NjM3MiwgMHgwNzU0LCAweDYzNzQsIDB4MzhFRCwgMHg2Mzc1LCAweDRCQzQsIDB4NjM3NiwgMHgxMzgwLCAweDYzNzcsCisgICAgMHgwOUExLCAweDYzN0EsIDB4MENDMCwgMHg2MzdCLCAweDBDRTcsIDB4NjM3QywgMHg0MUVCLCAweDYzN0QsIDB4MzhFRSwKKyAgICAweDYzN0YsIDB4NEJDNSwgMHg2MzgwLCAweDEzN0UsIDB4NjM4MiwgMHg0QkM2LCAweDYzODMsIDB4MEFERiwgMHg2Mzg0LAorICAgIDB4MzhFRiwgMHg2Mzg3LCAweDM4RjAsIDB4NjM4OCwgMHgwOTI0LCAweDYzODksIDB4MTM4MywgMHg2MzhBLCAweDRCQzcsCisgICAgMHg2MzhDLCAweDA5QTAsIDB4NjM4RSwgMHgxMzdELCAweDYzOEYsIDB4MTM4MiwgMHg2MzkwLCAweDM4RjEsIDB4NjM5MiwKKyAgICAweDBEMDksIDB4NjM5NCwgMHg0NTE3LCAweDYzOTYsIDB4MTM3QywgMHg2Mzk4LCAweDA2RjcsIDB4NjM5OSwgMHg0NTE1LAorICAgIDB4NjM5QiwgMHgwNUJCLCAweDYzOUUsIDB4MzhGMiwgMHg2MzlGLCAweDEzODQsIDB4NjNBMCwgMHgwRjczLCAweDYzQTEsCisgICAgMHgwODNFLCAweDYzQTIsIDB4MEI3MywgMHg2M0EzLCAweDEzODEsIDB4NjNBNSwgMHgwQTgwLCAweDYzQTcsIDB4MDdDNywKKyAgICAweDYzQTgsIDB4MEEyQSwgMHg2M0E5LCAweDA1MDgsIDB4NjNBQSwgMHgwQUJFLCAweDYzQUIsIDB4MTM3RiwgMHg2M0FDLAorICAgIDB4MDY1RiwgMHg2M0FFLCAweDRCQzgsIDB4NjNBRiwgMHg0QkM5LCAweDYzQjIsIDB4MDcxRCwgMHg2M0I0LCAweDBCRUIsCisgICAgMHg2M0I1LCAweDEzODUsIDB4NjNCQiwgMHgwQUUxLCAweDYzQkQsIDB4NDUxOCwgMHg2M0JFLCAweDEzODgsIDB4NjNDMCwKKyAgICAweDEzOEEsIDB4NjNDMywgMHgwQjE3LCAweDYzQzQsIDB4MTM5MCwgMHg2M0M2LCAweDEzOEIsIDB4NjNDOSwgMHgxMzhELAorICAgIDB4NjNDRiwgMHgwREIzLCAweDYzRDAsIDB4MEMwRiwgMHg2M0QxLCAweDM4RjMsIDB4NjNEMiwgMHgxMzhFLCAweDYzRDQsCisgICAgMHg0NTE5LCAweDYzRDUsIDB4NDUxQSwgMHg2M0Q2LCAweDBGMTYsIDB4NjNEQSwgMHgwRjMyLCAweDYzREIsIDB4MDVGNSwKKyAgICAweDYzREMsIDB4MzhGNCwgMHg2M0UwLCAweDQ1MUIsIDB4NjNFMSwgMHgwNDcyLCAweDYzRTMsIDB4MTM4QywgMHg2M0U1LAorICAgIDB4NDFFQywgMHg2M0U5LCAweDEzODksIDB4NjNFQSwgMHg0QkNBLCAweDYzRUIsIDB4NDUxQywgMHg2M0VDLCAweDQ1MUQsCisgICAgMHg2M0VELCAweDM0MUMsIDB4NjNFRSwgMHgwNjM0LCAweDYzRjIsIDB4NDUxRSwgMHg2M0Y0LCAweDA1MDksIDB4NjNGNSwKKyAgICAweDIxMTMsIDB4NjNGNiwgMHgxMzhGLCAweDYzRjcsIDB4MzY0NCwgMHg2M0Y4LCAweDRCQ0IsIDB4NjNGOSwgMHg0QkNDLAorICAgIDB4NjNGQSwgMHgwRjMzLCAweDY0MDYsIDB4MTM5MywgMHg2NDA5LCAweDM4RjUsIDB4NjQwRCwgMHgwQjFCLCAweDY0MEYsCisgICAgMHgxMzlBLCAweDY0MTAsIDB4MzhGNiwgMHg2NDEyLCAweDRCQ0QsIDB4NjQxMywgMHgxMzk0LCAweDY0MTQsIDB4MUUyQywKKyAgICAweDY0MTYsIDB4MTM5MSwgMHg2NDE3LCAweDEzOTgsIDB4NjQxOCwgMHg0QkNFLCAweDY0MUMsIDB4MTM3QSwgMHg2NDFFLAorICAgIDB4NDUxRiwgMHg2NDIwLCAweDRCQ0YsIDB4NjQyMiwgMHgzOEY3LCAweDY0MjQsIDB4NEJEMCwgMHg2NDI1LCAweDQ1MjAsCisgICAgMHg2NDI2LCAweDEzOTUsIDB4NjQyOCwgMHgxMzk5LCAweDY0MjksIDB4NDUyMSwgMHg2NDJBLCAweDRCRDEsIDB4NjQyQywKKyAgICAweDBENTYsIDB4NjQyRCwgMHgwQzY1LCAweDY0MkYsIDB4NDUyMiwgMHg2NDM0LCAweDEzOTIsIDB4NjQzNSwgMHg0QkQyLAorICAgIDB4NjQzNiwgMHgxMzk2LCAweDY0M0EsIDB4MDcxRSwgMHg2NDNELCAweDRCRDMsIDB4NjQzRSwgMHgwODYxLCAweDY0M0YsCisgICAgMHg0QkQ0LCAweDY0NDIsIDB4MEE4MSwgMHg2NDRFLCAweDEzOUUsIDB4NjQ1MSwgMHgxRTQzLCAweDY0NTIsIDB4NEJENSwKKyAgICAweDY0NTQsIDB4MzhGOCwgMHg2NDU4LCAweDBDMjAsIDB4NjQ1QSwgMHg0NTIzLCAweDY0NUIsIDB4MzhGOSwgMHg2NDVELAorICAgIDB4NDUyNCwgMHg2NDVGLCAweDRCRDYsIDB4NjQ2MCwgMHgyMTE0LCAweDY0NjcsIDB4MTM5QiwgMHg2NDY5LCAweDBFOEUsCisgICAgMHg2NDZELCAweDM4RkEsIDB4NjQ2RiwgMHgxMzlDLCAweDY0NzMsIDB4NDUyNSwgMHg2NDc0LCAweDRCRDcsIDB4NjQ3NiwKKyAgICAweDEzOUQsIDB4NjQ3OCwgMHgwRURBLCAweDY0NzksIDB4NDFFRCwgMHg2NDdBLCAweDBBNDYsIDB4NjQ3QiwgMHgzOEZCLAorICAgIDB4NjQ3RCwgMHg0NTI2LCAweDY0ODMsIDB4MDczOCwgMHg2NDg3LCAweDQ1MjcsIDB4NjQ4OCwgMHgxM0E0LCAweDY0OTAsCisgICAgMHg0QkQ4LCAweDY0OTEsIDB4NDUyOCwgMHg2NDkyLCAweDA4ODMsIDB4NjQ5MywgMHgxM0ExLCAweDY0OTUsIDB4MTNBMCwKKyAgICAweDY0OTgsIDB4NEJEOSwgMHg2NDk5LCAweDRCREEsIDB4NjQ5QSwgMHgwQ0U4LCAweDY0OUQsIDB4MjExNSwgMHg2NDlFLAorICAgIDB4MEM4RCwgMHg2NDlGLCAweDQ1MjksIDB4NjRBNCwgMHgwQzJCLCAweDY0QTUsIDB4MTNBMiwgMHg2NEE5LCAweDEzQTMsCisgICAgMHg2NEFCLCAweDBERTEsIDB4NjRBQywgMHg0QkRCLCAweDY0QUQsIDB4MENGQiwgMHg2NEFFLCAweDA4NzEsIDB4NjRCMCwKKyAgICAweDBBOTUsIDB4NjRCMiwgMHgwRTdFLCAweDY0QjMsIDB4NEJEQywgMHg2NEI5LCAweDA1QTcsIDB4NjRCQiwgMHgxM0FBLAorICAgIDB4NjRCQywgMHgxM0E1LCAweDY0QkUsIDB4MzhGQywgMHg2NEJGLCAweDM4RkQsIDB4NjRDMSwgMHgwRjM0LCAweDY0QzIsCisgICAgMHgxM0FDLCAweDY0QzQsIDB4NDFFRSwgMHg2NEM1LCAweDEzQTgsIDB4NjRDNywgMHgxM0E5LCAweDY0Q0EsIDB4MzQxRCwKKyAgICAweDY0Q0IsIDB4NDUyQSwgMHg2NENDLCAweDQ1MkIsIDB4NjRDRCwgMHgwQUUyLCAweDY0Q0UsIDB4MjExNiwgMHg2NEQwLAorICAgIDB4NDFFRiwgMHg2NEQyLCAweDEzQTcsIDB4NjRENCwgMHgxMzY2LCAweDY0RDUsIDB4NDUyQywgMHg2NEQ3LCAweDQ1MkQsCisgICAgMHg2NEQ4LCAweDEzQUIsIDB4NjREQSwgMHgxM0E2LCAweDY0RTAsIDB4MTNCMCwgMHg2NEUxLCAweDEzQjEsIDB4NjRFMiwKKyAgICAweDBDMjEsIDB4NjRFMywgMHgxM0IzLCAweDY0RTQsIDB4NDUyRiwgMHg2NEU1LCAweDM4RkUsIDB4NjRFNiwgMHgwODcyLAorICAgIDB4NjRFNywgMHgxM0FFLCAweDY0RUMsIDB4MDY1NiwgMHg2NEVELCAweDRCREQsIDB4NjRFRiwgMHgxM0I0LCAweDY0RjAsCisgICAgMHg0QkRFLCAweDY0RjEsIDB4MTNBRCwgMHg2NEYyLCAweDEzQjgsIDB4NjRGNCwgMHgxM0I3LCAweDY0RjYsIDB4MTNCNiwKKyAgICAweDY0RjcsIDB4MzhGRiwgMHg2NEZBLCAweDEzQjksIDB4NjRGQiwgMHgzOTAwLCAweDY0RkQsIDB4MTNCQiwgMHg2NEZFLAorICAgIDB4MDlEOSwgMHg2NEZGLCAweDQ1MzAsIDB4NjUwMCwgMHgxM0JBLCAweDY1MDQsIDB4MzkwMSwgMHg2NTA1LCAweDEzQkUsCisgICAgMHg2NTBGLCAweDQ1MzIsIDB4NjUxNCwgMHg0NTMzLCAweDY1MTYsIDB4MzkwMiwgMHg2NTE4LCAweDEzQkMsIDB4NjUxOSwKKyAgICAweDM5MDMsIDB4NjUxQiwgMHg0QkRGLCAweDY1MUMsIDB4MTNCRCwgMHg2NTFELCAweDEzOTcsIDB4NjUxRSwgMHg0NTM1LAorICAgIDB4NjUxRiwgMHg0QkUwLCAweDY1MjIsIDB4MUU5NywgMHg2NTIzLCAweDEzQzAsIDB4NjUyNCwgMHgxM0JGLCAweDY1MjksCisgICAgMHg0MUYwLCAweDY1MkEsIDB4MTM5RiwgMHg2NTJCLCAweDEzQzEsIDB4NjUyQywgMHgxM0I1LCAweDY1MkUsIDB4NEJFMSwKKyAgICAweDY1MkYsIDB4MDhBNywgMHg2NTMyLCAweDQ1MzYsIDB4NjUzNCwgMHgxM0MyLCAweDY1MzUsIDB4MTNDMywgMHg2NTM2LAorICAgIDB4MTNDNSwgMHg2NTM3LCAweDEzQzQsIDB4NjUzOCwgMHgxM0M2LCAweDY1MzksIDB4MDU3RSwgMHg2NTNCLCAweDA3QzgsCisgICAgMHg2NTNFLCAweDBFNEMsIDB4NjUzRiwgMHgwQTUzLCAweDY1NDQsIDB4NDUzNywgMHg2NTQ1LCAweDA3ODIsIDB4NjU0NywKKyAgICAweDM5MDQsIDB4NjU0OCwgMHgxM0M4LCAweDY1NDksIDB4NEJFMiwgMHg2NTRELCAweDEzQ0IsIDB4NjU0RSwgMHgyMTE3LAorICAgIDB4NjU0RiwgMHgwREM0LCAweDY1NTEsIDB4MDY3OSwgMHg2NTU0LCAweDQ1MzgsIDB4NjU1NSwgMHgxM0NBLCAweDY1NTYsCisgICAgMHgxM0M5LCAweDY1NTcsIDB4MEQwQSwgMHg2NTU4LCAweDEzQ0MsIDB4NjU1OSwgMHgwNkFELCAweDY1NUQsIDB4MTNDRSwKKyAgICAweDY1NUUsIDB4MTNDRCwgMHg2NTYwLCAweDRCRTMsIDB4NjU2MiwgMHgwNUY2LCAweDY1NjMsIDB4MDg4NCwgMHg2NTY2LAorICAgIDB4MENCMCwgMHg2NTY3LCAweDM5MDUsIDB4NjU2QiwgMHg0NTM5LCAweDY1NkMsIDB4MDcxRiwgMHg2NTcwLCAweDBBM0EsCisgICAgMHg2NTcyLCAweDEzQ0YsIDB4NjU3NCwgMHgwQTU0LCAweDY1NzUsIDB4MEMyMiwgMHg2NTc3LCAweDBERDEsIDB4NjU3OCwKKyAgICAweDEzRDAsIDB4NjU3QSwgMHg0NTNBLCAweDY1ODEsIDB4MzkwNiwgMHg2NTgyLCAweDEzRDEsIDB4NjU4MywgMHgxM0QyLAorICAgIDB4NjU4NCwgMHg0NTNCLCAweDY1ODUsIDB4MzkwNywgMHg2NTg3LCAweDBFMDgsIDB4NjU4OCwgMHgxMjBDLCAweDY1ODksCisgICAgMHgwQTZBLCAweDY1OEEsIDB4NDUzQywgMHg2NThDLCAweDBEQkUsIDB4NjU4RSwgMHgwODQ4LCAweDY1OTAsIDB4MEQ3OSwKKyAgICAweDY1OTEsIDB4MEQ1NywgMHg2NTkyLCAweDRCRTQsIDB4NjU5NSwgMHg0QkU1LCAweDY1OTcsIDB4MEM0NywgMHg2NTk5LAorICAgIDB4MEY4OSwgMHg2NTlCLCAweDEzRDQsIDB4NjU5QywgMHgwOEZDLCAweDY1OUQsIDB4NDFGMSwgMHg2NTlGLCAweDEzRDUsCisgICAgMHg2NUExLCAweDA0N0EsIDB4NjVBNCwgMHgwNkNDLCAweDY1QTUsIDB4MEE3MSwgMHg2NUE3LCAweDBERDIsIDB4NjVBQiwKKyAgICAweDEzRDYsIDB4NjVBQywgMHgwODkwLCAweDY1QUQsIDB4MEI4NSwgMHg2NUFGLCAweDA4QTksIDB4NjVCMCwgMHgwOUZELAorICAgIDB4NjVCMiwgMHg0NTNELCAweDY1QjQsIDB4NEJFNiwgMHg2NUI1LCAweDQ1M0UsIDB4NjVCNywgMHgxM0Q3LCAweDY1QjgsCisgICAgMHg0NTNGLCAweDY1QjksIDB4MEU0RCwgMHg2NUJDLCAweDA1MTksIDB4NjVCRCwgMHgwOEFBLCAweDY1QkUsIDB4NEJFNywKKyAgICAweDY1QkYsIDB4NDU0MCwgMHg2NUMxLCAweDEzREEsIDB4NjVDMiwgMHgzOTA4LCAweDY1QzMsIDB4MTNEOCwgMHg2NUM0LAorICAgIDB4MTNEQiwgMHg2NUM1LCAweDBGODEsIDB4NjVDNiwgMHgxM0Q5LCAweDY1QzgsIDB4NEJFOCwgMHg2NUM5LCAweDQ1NDEsCisgICAgMHg2NUNCLCAweDBBOUYsIDB4NjVDQywgMHgxM0RDLCAweDY1Q0UsIDB4NEJFOSwgMHg2NUNGLCAweDBCMTIsIDB4NjVEMCwKKyAgICAweDRCRUEsIDB4NjVEMiwgMHgxM0RELCAweDY1RDQsIDB4NDU0MiwgMHg2NUQ3LCAweDA2MzYsIDB4NjVEOSwgMHgxM0RGLAorICAgIDB4NjVEQiwgMHgxM0RFLCAweDY1REYsIDB4NEJFQiwgMHg2NUUwLCAweDEzRTAsIDB4NjVFMSwgMHgxM0UxLCAweDY1RTIsCisgICAgMHgwNjM3LCAweDY1RTMsIDB4MzU4NSwgMHg2NUU1LCAweDBDRDQsIDB4NjVFNiwgMHgwQjc0LCAweDY1RTcsIDB4MDY4NiwKKyAgICAweDY1RTgsIDB4MDhBQiwgMHg2NUU5LCAweDBBRTMsIDB4NjVFQywgMHgwOTY2LCAweDY1RUQsIDB4MDQ3NCwgMHg2NUYwLAorICAgIDB4MzkwOSwgMHg2NUYxLCAweDEzRTIsIDB4NjVGMiwgMHgzOTBBLCAweDY1RjksIDB4NDU0NCwgMHg2NUZBLCAweDA1MjIsCisgICAgMHg2NUZCLCAweDEzRTYsIDB4NjVGQywgMHg0NTQ1LCAweDY2MDAsIDB4MjExOCwgMHg2NjAyLCAweDA3QzksIDB4NjYwMywKKyAgICAweDEzRTUsIDB4NjYwNCwgMHg0NTQ2LCAweDY2MDYsIDB4MDgxQiwgMHg2NjA3LCAweDA5QTIsIDB4NjYwOCwgMHg0NTQ3LAorICAgIDB4NjYwOSwgMHgyMTFBLCAweDY2MEEsIDB4MTNFNCwgMHg2NjBDLCAweDA5QTMsIDB4NjYwRSwgMHgwRUNDLCAweDY2MEYsCisgICAgMHgwODFBLCAweDY2MTMsIDB4MDQ5QiwgMHg2NjE0LCAweDBBNzIsIDB4NjYxNSwgMHgyMTE5LCAweDY2MUMsIDB4MTNFQiwKKyAgICAweDY2MUUsIDB4NEY1MCwgMHg2NjFGLCAweDBBNTUsIDB4NjYyMCwgMHgwNEU5LCAweDY2MjEsIDB4NDU0OCwgMHg2NjIyLAorICAgIDB4NDFGMywgMHg2NjI0LCAweDIxMUQsIDB4NjYyNSwgMHgwOTVGLCAweDY2MjcsIDB4MEU5NCwgMHg2NjI4LCAweDA4NjIsCisgICAgMHg2NjJBLCAweDQ1NDksIDB4NjYyQiwgMHg0MUY0LCAweDY2MkMsIDB4MzkwQiwgMHg2NjJELCAweDA5QTQsIDB4NjYyRSwKKyAgICAweDIxMUIsIDB4NjYyRiwgMHgwQTRCLCAweDY2MzAsIDB4NDFGNSwgMHg2NjMxLCAweDIwQUUsIDB4NjYzMywgMHg0MUY2LAorICAgIDB4NjYzNCwgMHgxM0VBLCAweDY2MzUsIDB4MTNFOCwgMHg2NjM2LCAweDEzRTksIDB4NjYzQSwgMHg0MUYyLCAweDY2M0IsCisgICAgMHgxRTAwLCAweDY2M0MsIDB4MEJBOSwgMHg2NjNGLCAweDE0MDksIDB4NjY0MSwgMHgxM0VGLCAweDY2NDIsIDB4MDhDQywKKyAgICAweDY2NDMsIDB4MDdDQSwgMHg2NjQ0LCAweDEzRUQsIDB4NjY0NSwgMHg0NTRBLCAweDY2NDgsIDB4NDFGNywgMHg2NjQ5LAorICAgIDB4MTNFRSwgMHg2NjRCLCAweDA5RkUsIDB4NjY0QywgMHgzOTBDLCAweDY2NEUsIDB4NDU0QywgMHg2NjRGLCAweDEzRUMsCisgICAgMHg2NjUxLCAweDQ1NEIsIDB4NjY1MiwgMHgwODdELCAweDY2NTcsIDB4MjExRiwgMHg2NjU5LCAweDIxMjAsIDB4NjY1QSwKKyAgICAweDM0NDEsIDB4NjY1QiwgMHgzOTBELCAweDY2NUMsIDB4MzkwRSwgMHg2NjVELCAweDEzRjEsIDB4NjY1RSwgMHgxM0YwLAorICAgIDB4NjY1RiwgMHgxM0Y1LCAweDY2NjEsIDB4MzkwRiwgMHg2NjYyLCAweDEzRjYsIDB4NjY2MywgMHgzNzNBLCAweDY2NjQsCisgICAgMHgxM0YyLCAweDY2NjUsIDB4MjExRSwgMHg2NjY2LCAweDA1ODAsIDB4NjY2NywgMHgxM0YzLCAweDY2NjgsIDB4MTNGNCwKKyAgICAweDY2NjksIDB4MEQ2OSwgMHg2NjZBLCAweDQ1NTEsIDB4NjY2QiwgMHgzOTEwLCAweDY2NkMsIDB4NDU1MiwgMHg2NjZELAorICAgIDB4NDU1MywgMHg2NjZFLCAweDBERDMsIDB4NjY2RiwgMHgwNzIwLCAweDY2NzAsIDB4MTNGNywgMHg2NjczLCAweDIxMjIsCisgICAgMHg2Njc0LCAweDBBNTYsIDB4NjY3NiwgMHgwOUE1LCAweDY2NzcsIDB4NDFGOSwgMHg2Njc4LCAweDQxRkEsIDB4NjY3QSwKKyAgICAweDBCOTAsIDB4NjY3QiwgMHg0NTU0LCAweDY2N0UsIDB4NEJFQywgMHg2NjgwLCAweDQ1NTUsIDB4NjY4MSwgMHgwNkJGLAorICAgIDB4NjY4MywgMHgxM0Y4LCAweDY2ODQsIDB4MTNGQywgMHg2Njg3LCAweDA1NEIsIDB4NjY4OCwgMHgxM0Y5LCAweDY2ODksCisgICAgMHgxM0ZCLCAweDY2OEIsIDB4NEJFRCwgMHg2NjhDLCAweDRCRUUsIDB4NjY4RCwgMHg0MUZCLCAweDY2OEUsIDB4MTNGQSwKKyAgICAweDY2OTAsIDB4NDU1NiwgMHg2NjkxLCAweDA5NzUsIDB4NjY5MiwgMHg0NTU3LCAweDY2OTYsIDB4MEI4NiwgMHg2Njk3LAorICAgIDB4MDQ4OSwgMHg2Njk4LCAweDEzRkQsIDB4NjY5OSwgMHgyMTIzLCAweDY2OUQsIDB4MTNGRSwgMHg2NkEwLCAweDIxMjQsCisgICAgMHg2NkEyLCAweDBCQzYsIDB4NjZBNCwgMHgzOTEyLCAweDY2QTYsIDB4MEZCOSwgMHg2NkFCLCAweDA4OTEsIDB4NjZBRCwKKyAgICAweDQ1NTksIDB4NjZBRSwgMHgwRTNCLCAweDY2QjEsIDB4NDU1QSwgMHg2NkIyLCAweDIxMjUsIDB4NjZCMywgMHg0QkVGLAorICAgIDB4NjZCNCwgMHgwRTZCLCAweDY2QjUsIDB4NDU1QiwgMHg2NkI4LCAweDE0MDUsIDB4NjZCOSwgMHgxNDAwLCAweDY2QkIsCisgICAgMHg0MUZDLCAweDY2QkMsIDB4MTQwMywgMHg2NkJFLCAweDE0MDIsIDB4NjZCRiwgMHgyMTI2LCAweDY2QzAsIDB4NEJGMCwKKyAgICAweDY2QzEsIDB4MTNGRiwgMHg2NkM0LCAweDE0MDQsIDB4NjZDNiwgMHgzNDU1LCAweDY2QzcsIDB4MENCNiwgMHg2NkM4LAorICAgIDB4MzkxMywgMHg2NkM5LCAweDE0MDEsIDB4NjZDRiwgMHg0QkYxLCAweDY2RDYsIDB4MTQwNiwgMHg2NkQ5LCAweDA5NzYsCisgICAgMHg2NkRBLCAweDE0MDcsIDB4NjZEQiwgMHg0MUZELCAweDY2REMsIDB4MEYzNSwgMHg2NkRELCAweDBEMkUsIDB4NjZFMCwKKyAgICAweDE0MDgsIDB4NjZFNiwgMHgxNDBBLCAweDY2RTgsIDB4NDFGRSwgMHg2NkU5LCAweDE0MEIsIDB4NjZFQywgMHgzOTE0LAorICAgIDB4NjZGMCwgMHgxNDBDLCAweDY2RjIsIDB4MDZDMiwgMHg2NkYzLCAweDA0RUEsIDB4NjZGNCwgMHgwN0NCLCAweDY2RjUsCisgICAgMHgxNDBELCAweDY2RjcsIDB4MTQwRSwgMHg2NkY4LCAweDA5N0IsIDB4NjZGOSwgMHgwQUU0LCAweDY2RkEsIDB4MjEyNywKKyAgICAweDY2RkIsIDB4MjBCMSwgMHg2NkZDLCAweDEwRUQsIDB4NjZGRCwgMHgwQUMwLCAweDY2RkUsIDB4MEFCRiwgMHg2NkZGLAorICAgIDB4MEIzOCwgMHg2NzAwLCAweDA4MzcsIDB4NjcwMSwgMHg0NTVGLCAweDY3MDMsIDB4MTA0QiwgMHg2NzA1LCAweDM5MTUsCisgICAgMHg2NzA4LCAweDA3NDQsIDB4NjcwOSwgMHgwRjE3LCAweDY3MEIsIDB4MEU0RSwgMHg2NzBELCAweDBERjAsIDB4NjcwRSwKKyAgICAweDIxMjgsIDB4NjcwRiwgMHgxNDBGLCAweDY3MTIsIDB4NDU2MCwgMHg2NzEzLCAweDM5MTYsIDB4NjcxNCwgMHgwODYzLAorICAgIDB4NjcxNSwgMHgwQkRCLCAweDY3MTYsIDB4MTQxMCwgMHg2NzE3LCAweDBGRDUsIDB4NjcxOSwgMHg0NTYyLCAweDY3MUIsCisgICAgMHgwRTZDLCAweDY3MUQsIDB4MEJDNywgMHg2NzFFLCAweDE0MTEsIDB4NjcxRiwgMHgwNjM4LCAweDY3MjUsIDB4NEJGMiwKKyAgICAweDY3MjYsIDB4MTQxMiwgMHg2NzI3LCAweDE0MTMsIDB4NjcyOCwgMHgwRUU2LCAweDY3MkEsIDB4MEVCMCwgMHg2NzJCLAorICAgIDB4MEVBNCwgMHg2NzJDLCAweDBFOEEsIDB4NjcyRCwgMHgwODczLCAweDY3MkUsIDB4MTQxNSwgMHg2NzMxLCAweDA5MTcsCisgICAgMHg2NzMzLCAweDM5MTcsIDB4NjczNCwgMHgwRTdGLCAweDY3MzUsIDB4NEJGMywgMHg2NzM2LCAweDE0MTcsIDB4NjczNywKKyAgICAweDE0MUEsIDB4NjczOCwgMHgxNDE5LCAweDY3M0EsIDB4MDYzNSwgMHg2NzNELCAweDA2N0EsIDB4NjczRiwgMHgxNDE2LAorICAgIDB4Njc0MSwgMHgxNDE4LCAweDY3NDMsIDB4MzVCNywgMHg2NzQ2LCAweDE0MUIsIDB4Njc0NywgMHg0MUZGLCAweDY3NDgsCisgICAgMHgzOTE4LCAweDY3NDksIDB4MEEzRiwgMHg2NzRDLCAweDM5MTksIDB4Njc0RCwgMHg0NTY1LCAweDY3NEUsIDB4MEY2NSwKKyAgICAweDY3NEYsIDB4MDQ4RCwgMHg2NzUwLCAweDA4NTAsIDB4Njc1MSwgMHgwQjFDLCAweDY3NTMsIDB4MDkwOSwgMHg2NzU0LAorICAgIDB4NDU2NiwgMHg2NzU1LCAweDRCRjQsIDB4Njc1NiwgMHgwOURCLCAweDY3NTksIDB4MTQxRSwgMHg2NzVDLCAweDBDNDgsCisgICAgMHg2NzVELCAweDQ1NjcsIDB4Njc1RSwgMHgxNDFDLCAweDY3NUYsIDB4MEIwQiwgMHg2NzYwLCAweDE0MUQsIDB4Njc2MSwKKyAgICAweDA5REEsIDB4Njc2MiwgMHgwRUU5LCAweDY3NjMsIDB4MTQxRiwgMHg2NzY0LCAweDE0MjAsIDB4Njc2NSwgMHgwRjUyLAorICAgIDB4Njc2NiwgMHgyMTJBLCAweDY3NkEsIDB4MTQyNSwgMHg2NzZELCAweDA3Q0MsIDB4Njc2RSwgMHgzNTcxLCAweDY3NkYsCisgICAgMHgwRDBCLCAweDY3NzAsIDB4MTQyMiwgMHg2NzcxLCAweDBDNjYsIDB4Njc3MiwgMHgxM0UzLCAweDY3NzMsIDB4MTNFNywKKyAgICAweDY3NzQsIDB4NDU2QiwgMHg2Nzc1LCAweDA2NjksIDB4Njc3NiwgMHgzOTFBLCAweDY3NzcsIDB4MENGRCwgMHg2NzdCLAorICAgIDB4MzkxQiwgMHg2NzdDLCAweDE0MjQsIDB4Njc3RSwgMHgwOUE2LCAweDY3N0YsIDB4MEQ1OCwgMHg2NzgwLCAweDRCRjUsCisgICAgMHg2NzgxLCAweDQyMDAsIDB4Njc4NSwgMHgxNDJBLCAweDY3ODcsIDB4MEQ4RSwgMHg2Nzg5LCAweDE0MjEsIDB4Njc4QiwKKyAgICAweDE0MjcsIDB4Njc4QywgMHgxNDI2LCAweDY3OEYsIDB4NEJGNiwgMHg2NzkwLCAweDBBNzMsIDB4Njc5MSwgMHg0QkY3LAorICAgIDB4Njc5MiwgMHg0NTZELCAweDY3OTMsIDB4NDIwMSwgMHg2Nzk1LCAweDBFOUIsIDB4Njc5NywgMHgwRjlCLCAweDY3OTgsCisgICAgMHg0MjAyLCAweDY3OUEsIDB4MEU5NSwgMHg2NzlCLCAweDQyMDMsIDB4Njc5QywgMHgwNTRDLCAweDY3OUQsIDB4MDhBQywKKyAgICAweDY3QTAsIDB4MEZFRSwgMHg2N0ExLCAweDE0MjksIDB4NjdBMiwgMHgwQTNCLCAweDY3QTQsIDB4NEJGOCwgMHg2N0E2LAorICAgIDB4MTQyOCwgMHg2N0E5LCAweDE0MjMsIDB4NjdBRiwgMHgwNzgzLCAweDY3QjAsIDB4MzkxQywgMHg2N0IxLCAweDRCRjksCisgICAgMHg2N0IyLCAweDM5MUQsIDB4NjdCMywgMHgxNDJGLCAweDY3QjQsIDB4MTQyRCwgMHg2N0I1LCAweDRCRkEsIDB4NjdCNiwKKyAgICAweDA1NEQsIDB4NjdCNywgMHgxNDJCLCAweDY3QjgsIDB4MTQzMSwgMHg2N0I5LCAweDE0MzcsIDB4NjdCQiwgMHgyMTJCLAorICAgIDB4NjdCRSwgMHg0QkZCLCAweDY3QzAsIDB4MjEyRCwgMHg2N0MxLCAweDBCMjgsIDB4NjdDMywgMHg0NTcxLCAweDY3QzQsCisgICAgMHgwRTExLCAweDY3QzYsIDB4MTQzOSwgMHg2N0M4LCAweDQ1NzIsIDB4NjdDQSwgMHgwRDk0LCAweDY3Q0UsIDB4MTQzOCwKKyAgICAweDY3Q0YsIDB4MEQyNiwgMHg2N0QwLCAweDBFNkQsIDB4NjdEMSwgMHgwNUY3LCAweDY3RDIsIDB4NDU3MywgMHg2N0QzLAorICAgIDB4MEE5QiwgMHg2N0Q0LCAweDA5NEEsIDB4NjdENywgMHgzOTFGLCAweDY3RDgsIDB4MEJFRiwgMHg2N0Q5LCAweDM5MjAsCisgICAgMHg2N0RBLCAweDBGMTgsIDB4NjdEQiwgMHg0NTc0LCAweDY3REQsIDB4MTQzNCwgMHg2N0RFLCAweDE0MzMsIDB4NjdFMiwKKyAgICAweDE0MzUsIDB4NjdFNCwgMHgxNDMyLCAweDY3RTcsIDB4MTQzQSwgMHg2N0U5LCAweDE0MzAsIDB4NjdFQywgMHgxNDJFLAorICAgIDB4NjdFRSwgMHgxNDM2LCAweDY3RUYsIDB4MTQyQywgMHg2N0YwLCAweDM5MjEsIDB4NjdGMSwgMHgwQkFBLCAweDY3RjMsCisgICAgMHgwRjA0LCAweDY3RjQsIDB4MDhGMiwgMHg2N0Y1LCAweDA4NjQsIDB4NjdGNywgMHg0NTc1LCAweDY3RjksIDB4MzkxRSwKKyAgICAweDY3RkEsIDB4MUU5QSwgMHg2N0ZCLCAweDA4MkEsIDB4NjdGQywgMHg0MjA0LCAweDY3RkUsIDB4MEU5RCwgMHg2N0ZGLAorICAgIDB4MDU5RiwgMHg2ODAxLCAweDM2RjIsIDB4NjgwMiwgMHgwQkVBLCAweDY4MDMsIDB4MENBMiwgMHg2ODA0LCAweDA0RUIsCisgICAgMHg2ODA1LCAweDFFMDcsIDB4NjgxMCwgMHg0NTcwLCAweDY4MTMsIDB4MEE5NiwgMHg2ODE2LCAweDBBNTgsIDB4NjgxNywKKyAgICAweDA3MDAsIDB4NjgxOCwgMHg0NTc5LCAweDY4MUQsIDB4NDIwNSwgMHg2ODFFLCAweDE0M0MsIDB4NjgxRiwgMHg0NTdBLAorICAgIDB4NjgyMSwgMHgwN0NELCAweDY4MjIsIDB4MDVEQSwgMHg2ODI4LCAweDRCRkMsIDB4NjgyOSwgMHgxNDNFLCAweDY4MkEsCisgICAgMHgwNUQyLCAweDY4MkIsIDB4MTQ0NCwgMHg2ODJDLCAweDM5MjIsIDB4NjgyRCwgMHg0NTdCLCAweDY4MzAsIDB4MzkyMywKKyAgICAweDY4MzEsIDB4MzkyNCwgMHg2ODMyLCAweDE0NDEsIDB4NjgzMywgMHg0NTdELCAweDY4MzQsIDB4MEE5NywgMHg2ODM4LAorICAgIDB4MDVBOSwgMHg2ODM5LCAweDA4MUMsIDB4NjgzQiwgMHg0NTdFLCAweDY4M0MsIDB4MDVBOCwgMHg2ODNELCAweDA4M0YsCisgICAgMHg2ODNFLCAweDQ1N0YsIDB4Njg0MCwgMHgxNDNGLCAweDY4NDEsIDB4MDczQiwgMHg2ODQyLCAweDA3MjEsIDB4Njg0MywKKyAgICAweDBDNjcsIDB4Njg0NCwgMHgyMTJGLCAweDY4NDUsIDB4NDU4MCwgMHg2ODQ2LCAweDE0M0QsIDB4Njg0OCwgMHgwNDhBLAorICAgIDB4Njg0OSwgMHg0NTgxLCAweDY4NEMsIDB4NDU4MiwgMHg2ODRELCAweDE0NDAsIDB4Njg0RSwgMHgxNDQyLCAweDY4NTAsCisgICAgMHgwNkM1LCAweDY4NTEsIDB4MDcwMiwgMHg2ODUyLCAweDIxMkMsIDB4Njg1MywgMHgwNUY4LCAweDY4NTQsIDB4MDY2NSwKKyAgICAweDY4NTUsIDB4NDU4MywgMHg2ODU3LCAweDQ1ODQsIDB4Njg1OSwgMHgxNDQ1LCAweDY4NUIsIDB4MzkyNSwgMHg2ODVDLAorICAgIDB4MDg2OSwgMHg2ODVELCAweDBFOUYsIDB4Njg1RiwgMHgwODg1LCAweDY4NjMsIDB4MTQ0NiwgMHg2ODY3LCAweDBEQTIsCisgICAgMHg2ODZCLCAweDQ1ODYsIDB4Njg2RSwgMHg0NTg3LCAweDY4NzIsIDB4MzkyNiwgMHg2ODc0LCAweDE0NTIsIDB4Njg3NSwKKyAgICAweDM5MjcsIDB4Njg3NiwgMHgwNTMzLCAweDY4NzcsIDB4MTQ0NywgMHg2ODdBLCAweDM5MjgsIDB4Njg3QywgMHg0NTg4LAorICAgIDB4Njg3RSwgMHgxNDU4LCAweDY4N0YsIDB4MTQ0OCwgMHg2ODgxLCAweDBGOEEsIDB4Njg4MiwgMHg0NTg5LCAweDY4ODMsCisgICAgMHgxNDRGLCAweDY4ODQsIDB4MzkyOSwgMHg2ODg1LCAweDBEMTUsIDB4Njg4NiwgMHg0QkZELCAweDY4OEQsIDB4MTQ1NywKKyAgICAweDY4OEUsIDB4MUU5QywgMHg2ODhGLCAweDE0NEEsIDB4Njg5MCwgMHg0NThBLCAweDY4OTMsIDB4MDQ3OCwgMHg2ODk0LAorICAgIDB4MTQ0QywgMHg2ODk2LCAweDQ1OEIsIDB4Njg5NywgMHgwN0NFLCAweDY4OTgsIDB4NDU4RCwgMHg2ODk5LCAweDQ1OEUsCisgICAgMHg2ODlBLCAweDQ1OEYsIDB4Njg5QiwgMHgxNDRFLCAweDY4OUMsIDB4NDU5MCwgMHg2ODlELCAweDE0NEQsIDB4Njg5RiwKKyAgICAweDE0NDksIDB4NjhBMCwgMHgxNDU0LCAweDY4QTIsIDB4MDlBNywgMHg2OEEzLCAweDQyMDYsIDB4NjhBNSwgMHgzOTJBLAorICAgIDB4NjhBNiwgMHgxMUJFLCAweDY4QTcsIDB4MDc5QywgMHg2OEE4LCAweDBGNjYsIDB4NjhBQSwgMHg0NTkxLCAweDY4QUIsCisgICAgMHg0NTkyLCAweDY4QUQsIDB4MTQ0QiwgMHg2OEFGLCAweDBDMTAsIDB4NjhCMCwgMHgwNTgxLCAweDY4QjEsIDB4MDgxRCwKKyAgICAweDY4QjIsIDB4MzkyQiwgMHg2OEIzLCAweDE0NDMsIDB4NjhCNCwgMHg0NTkzLCAweDY4QjUsIDB4MTQ1MywgMHg2OEI2LAorICAgIDB4MDVCRiwgMHg2OEI5LCAweDE0NTEsIDB4NjhCQSwgMHgxNDU1LCAweDY4QkIsIDB4NDU5NCwgMHg2OEJDLCAweDBDNjgsCisgICAgMHg2OEMzLCAweDQ1OTgsIDB4NjhDNCwgMHgwNjNBLCAweDY4QzUsIDB4NDU5OSwgMHg2OEM2LCAweDE0NzMsIDB4NjhDOCwKKyAgICAweDIwQUYsIDB4NjhDOSwgMHgwRUQ1LCAweDY4Q0EsIDB4MTQ1QSwgMHg2OENCLCAweDA2MzksIDB4NjhDQywgMHg0NTlBLAorICAgIDB4NjhDRCwgMHgxNDYxLCAweDY4Q0YsIDB4MjEzMCwgMHg2OEQwLCAweDM5MkMsIDB4NjhEMiwgMHgwRTZFLCAweDY4RDQsCisgICAgMHgxNDYyLCAweDY4RDUsIDB4MTQ2NCwgMHg2OEQ2LCAweDM5MkQsIDB4NjhENywgMHgxNDY4LCAweDY4RDgsIDB4MTQ1QywKKyAgICAweDY4RDksIDB4NDU5QiwgMHg2OERBLCAweDBCNjgsIDB4NjhERiwgMHgwQzY5LCAweDY4RTAsIDB4MTQ2QywgMHg2OEUxLAorICAgIDB4MTQ1RiwgMHg2OEUzLCAweDE0NjksIDB4NjhFNCwgMHg0NTlDLCAweDY4RTUsIDB4NDU5RCwgMHg2OEU3LCAweDE0NjMsCisgICAgMHg2OEU4LCAweDM5MkUsIDB4NjhFQiwgMHg0QkZFLCAweDY4RUMsIDB4NDU5RSwgMHg2OEVELCAweDM5MkYsIDB4NjhFRSwKKyAgICAweDA5RkYsIDB4NjhFRiwgMHgxNDZELCAweDY4RjAsIDB4MzkzMCwgMHg2OEYxLCAweDM5MzEsIDB4NjhGMiwgMHgwQTU3LAorICAgIDB4NjhGNSwgMHg0QkZGLCAweDY4RjcsIDB4NDU5RiwgMHg2OEY5LCAweDE0NkIsIDB4NjhGQSwgMHgwNUY5LCAweDY4RkIsCisgICAgMHg0NTk1LCAweDY4RkMsIDB4MzkzMiwgMHg2OTAwLCAweDBGRjYsIDB4NjkwMSwgMHgxNDU5LCAweDY5MDMsIDB4NDVBMCwKKyAgICAweDY5MDQsIDB4MTQ2NywgMHg2OTA1LCAweDA0OUMsIDB4NjkwNywgMHg0NUExLCAweDY5MDgsIDB4MTQ1QiwgMHg2OTBBLAorICAgIDB4NDIwNywgMHg2OTBCLCAweDBFQzYsIDB4NjkwQywgMHgxNDYwLCAweDY5MEQsIDB4MDlFOCwgMHg2OTBFLCAweDBCRTMsCisgICAgMHg2OTBGLCAweDE0NTYsIDB4NjkxMSwgMHgzOTMzLCAweDY5MTIsIDB4MTQ2NiwgMHg2OTEzLCAweDM5MzQsIDB4NjkxNywKKyAgICAweDRDMDAsIDB4NjkxOSwgMHgwQTQwLCAweDY5MUEsIDB4MTQ3MCwgMHg2OTFCLCAweDA1Q0YsIDB4NjkxQywgMHgwNzU1LAorICAgIDB4NjkyMSwgMHgxNDcyLCAweDY5MjIsIDB4MTQ1RCwgMHg2OTIzLCAweDE0NzEsIDB4NjkyNSwgMHgxNDZBLCAweDY5MjYsCisgICAgMHgxNDVFLCAweDY5MjgsIDB4MTQ2RSwgMHg2OTJBLCAweDE0NkYsIDB4NjkzMCwgMHgxNDgwLCAweDY5MzMsIDB4NEMwMSwKKyAgICAweDY5MzQsIDB4MENBNiwgMHg2OTM1LCAweDM5MzUsIDB4NjkzNiwgMHgxNDY1LCAweDY5MzgsIDB4NEMwMiwgMHg2OTM5LAorICAgIDB4MTQ3QywgMHg2OTNCLCAweDM5MzYsIDB4NjkzRCwgMHgxNDdFLCAweDY5M0YsIDB4MEJGNCwgMHg2OTQyLCAweDQyMEEsCisgICAgMHg2OTQ2LCAweDQ1QTUsIDB4Njk0OSwgMHg0MjA4LCAweDY5NEEsIDB4MEYzNiwgMHg2OTUzLCAweDBERTgsIDB4Njk1NCwKKyAgICAweDE0NzksIDB4Njk1NSwgMHgwQjJBLCAweDY5NTcsIDB4MzkzNywgMHg2OTU5LCAweDE0N0YsIDB4Njk1QSwgMHgwQUMxLAorICAgIDB4Njk1QiwgMHg0QzAzLCAweDY5NUMsIDB4MTQ3NiwgMHg2OTVELCAweDE0ODMsIDB4Njk1RSwgMHgxNDgyLCAweDY5NjAsCisgICAgMHgwQ0M3LCAweDY5NjEsIDB4MTQ4MSwgMHg2OTYyLCAweDBDQzIsIDB4Njk2MywgMHgzOTM4LCAweDY5NjQsIDB4NDIwQiwKKyAgICAweDY5NjUsIDB4NEMwNCwgMHg2OTY4LCAweDIxMzIsIDB4Njk2OSwgMHg0NUE2LCAweDY5NkEsIDB4MTQ4NSwgMHg2OTZCLAorICAgIDB4MTQ3OCwgMHg2OTZDLCAweDQ1QTcsIDB4Njk2RCwgMHgwNkMwLCAweDY5NkUsIDB4MTQ3QiwgMHg2OTZGLCAweDA5NjcsCisgICAgMHg2OTcyLCAweDM5MzksIDB4Njk3MywgMHgwRDE2LCAweDY5NzQsIDB4MTQ3RCwgMHg2OTc1LCAweDA2QzMsIDB4Njk3NywKKyAgICAweDE0NzUsIDB4Njk3OCwgMHgxNDc3LCAweDY5NzksIDB4MTQ3NCwgMHg2OTdBLCAweDQ1QTgsIDB4Njk3QywgMHgwRkQ2LAorICAgIDB4Njk3RCwgMHgwNUI4LCAweDY5N0UsIDB4MTQ3QSwgMHg2OTdGLCAweDM5M0EsIDB4Njk4MCwgMHgzOTNCLCAweDY5ODEsCisgICAgMHgxNDg0LCAweDY5ODIsIDB4MDU5MywgMHg2OTg2LCAweDM3NDAsIDB4Njk4QSwgMHgwODU3LCAweDY5OEUsIDB4MDRGRiwKKyAgICAweDY5OTEsIDB4MTQ5NSwgMHg2OTkyLCAweDQ1QTksIDB4Njk5NCwgMHgwRkQ3LCAweDY5OTUsIDB4MTQ5OCwgMHg2OTk2LAorICAgIDB4NDVBQiwgMHg2OTk4LCAweDIxMzQsIDB4Njk5QiwgMHgwQTAwLCAweDY5OUMsIDB4MTQ5NywgMHg2OUEwLCAweDE0OTYsCisgICAgMHg2OUE1LCAweDQyMEMsIDB4NjlBNiwgMHgzOTNDLCAweDY5QTcsIDB4MTQ5MywgMHg2OUE4LCAweDRDMDUsIDB4NjlBQiwKKyAgICAweDRDMDYsIDB4NjlBRCwgMHgzOTNELCAweDY5QUUsIDB4MTQ4NywgMHg2OUFGLCAweDRDMDcsIDB4NjlCMCwgMHg0NUFDLAorICAgIDB4NjlCMSwgMHgxNEE0LCAweDY5QjIsIDB4MTQ4NiwgMHg2OUI0LCAweDE0OTksIDB4NjlCNywgMHgzOTNFLCAweDY5QkEsCisgICAgMHg0NUFELCAweDY5QkIsIDB4MTQ5MSwgMHg2OUJDLCAweDQ1QUUsIDB4NjlCRSwgMHgxNDhDLCAweDY5QkYsIDB4MTQ4OSwKKyAgICAweDY5QzAsIDB4NDVBRiwgMHg2OUMxLCAweDE0OEEsIDB4NjlDMywgMHgxNDkyLCAweDY5QzcsIDB4MUQzMywgMHg2OUNBLAorICAgIDB4MTQ4RiwgMHg2OUNCLCAweDA3Q0YsIDB4NjlDQywgMHgwQkU0LCAweDY5Q0QsIDB4MEFFNiwgMHg2OUNFLCAweDE0OEQsCisgICAgMHg2OUNGLCAweDQyMEQsIDB4NjlEMCwgMHgxNDg4LCAweDY5RDEsIDB4NDVCMCwgMHg2OUQzLCAweDE0OEIsIDB4NjlENiwKKyAgICAweDM5M0YsIDB4NjlENywgMHgzOTQwLCAweDY5RDgsIDB4MEYzNywgMHg2OUQ5LCAweDBFOTgsIDB4NjlERCwgMHgxNDkwLAorICAgIDB4NjlERSwgMHgxNDlBLCAweDY5RTIsIDB4MjEzNSwgMHg2OUUzLCAweDQ1QjQsIDB4NjlFNSwgMHg0QzA4LCAweDY5RTcsCisgICAgMHgxNEEyLCAweDY5RTgsIDB4MTQ5QiwgMHg2OUU5LCAweDQyMTAsIDB4NjlFQSwgMHgzNDExLCAweDY5RUIsIDB4MTRBOCwKKyAgICAweDY5RUQsIDB4MTRBNiwgMHg2OUVFLCAweDQ1QjUsIDB4NjlFRiwgMHg0NUI2LCAweDY5RjEsIDB4NEMwOSwgMHg2OUYyLAorICAgIDB4MTRBMSwgMHg2OUYzLCAweDQ1QjcsIDB4NjlGNCwgMHg0NUI5LCAweDY5RjUsIDB4NDIxMSwgMHg2OUY2LCAweDM3M0YsCisgICAgMHg2OUY5LCAweDE0QTAsIDB4NjlGQiwgMHgwQkVDLCAweDY5RkQsIDB4MEFFNywgMHg2OUZFLCAweDQ1QkEsIDB4NjlGRiwKKyAgICAweDE0OUUsIDB4NkEwMSwgMHgzOTQxLCAweDZBMDIsIDB4MTQ5QywgMHg2QTA1LCAweDE0QTMsIDB4NkEwQSwgMHgxNEE5LAorICAgIDB4NkEwQiwgMHgwRDg5LCAweDZBMEMsIDB4MTRBRiwgMHg2QTBGLCAweDM5NDIsIDB4NkExMSwgMHg0NUJCLCAweDZBMTIsCisgICAgMHgxNEFBLCAweDZBMTMsIDB4MTRBRCwgMHg2QTE0LCAweDE0QTcsIDB4NkExNSwgMHgzOTQzLCAweDZBMTcsIDB4MEJCMiwKKyAgICAweDZBMTksIDB4MERBQSwgMHg2QTFBLCAweDQ1QkMsIDB4NkExQiwgMHgxNDlELCAweDZBMUQsIDB4NDVCRCwgMHg2QTFFLAorICAgIDB4MTRBNSwgMHg2QTFGLCAweDA5QTgsIDB4NkEyMSwgMHgwRURCLCAweDZBMjIsIDB4MTRCOSwgMHg2QTIzLCAweDE0QUMsCisgICAgMHg2QTI4LCAweDM5NDQsIDB4NkEyOSwgMHgwNzU2LCAweDZBMkEsIDB4MDUyMywgMHg2QTJCLCAweDA1QkQsIDB4NkEyRSwKKyAgICAweDE0OTQsIDB4NkEzMCwgMHgyMTM2LCAweDZBMzIsIDB4NDVCRiwgMHg2QTMzLCAweDQ1QzAsIDB4NkEzNCwgMHgzOTQ1LAorICAgIDB4NkEzNSwgMHgwOUE5LCAweDZBMzYsIDB4MTRCMSwgMHg2QTM4LCAweDE0QjgsIDB4NkEzOSwgMHgwOTI1LCAweDZBM0EsCisgICAgMHgwNUQwLCAweDZBM0IsIDB4NDIxMywgMHg2QTNELCAweDBCNkMsIDB4NkEzRSwgMHgzOTQ2LCAweDZBM0YsIDB4NDVDMSwKKyAgICAweDZBNDQsIDB4MTRBRSwgMHg2QTQ1LCAweDM5NDcsIDB4NkE0NiwgMHgyMTM4LCAweDZBNDcsIDB4MTRCMywgMHg2QTQ4LAorICAgIDB4MTRCNywgMHg2QTQ5LCAweDQ1QzIsIDB4NkE0QSwgMHg0QzBBLCAweDZBNEIsIDB4MDZBRSwgMHg2QTRFLCAweDQ1QzQsCisgICAgMHg2QTUwLCAweDM5NDgsIDB4NkE1MSwgMHgzOTQ5LCAweDZBNTIsIDB4NDVDNSwgMHg2QTU0LCAweDNDMzQsIDB4NkE1NSwKKyAgICAweDRDMEIsIDB4NkE1NiwgMHgzOTRBLCAweDZBNTgsIDB4MDY2NiwgMHg2QTU5LCAweDE0QjUsIDB4NkE1QiwgMHgzOTRCLAorICAgIDB4NkE1RiwgMHgwNjNCLCAweDZBNjEsIDB4MENBMywgMHg2QTYyLCAweDE0QjQsIDB4NkE2NCwgMHg0NUM2LCAweDZBNjYsCisgICAgMHgxNEI2LCAweDZBNjcsIDB4NEMwQywgMHg2QTZCLCAweDIxMzcsIDB4NkE3MSwgMHg0QzBELCAweDZBNzIsIDB4MTRCMCwKKyAgICAweDZBNzMsIDB4MjEzOSwgMHg2QTc4LCAweDE0QjIsIDB4NkE3QSwgMHg0NUMzLCAweDZBN0UsIDB4MjEzQSwgMHg2QTdGLAorICAgIDB4MDVCRSwgMHg2QTgwLCAweDBCODcsIDB4NkE4MywgMHgzOTRDLCAweDZBODQsIDB4MTRCRCwgMHg2QTg5LCAweDM5NEQsCisgICAgMHg2QThCLCAweDQ1QzgsIDB4NkE4RCwgMHgxNEJCLCAweDZBOEUsIDB4MDc5RCwgMHg2QTkwLCAweDE0QkEsIDB4NkE5MSwKKyAgICAweDM5NEUsIDB4NkE5NCwgMHg0MjE1LCAweDZBOTcsIDB4MTRDMCwgMHg2QTlDLCAweDE0M0IsIDB4NkE5RCwgMHgzOTRGLAorICAgIDB4NkE5RSwgMHgzOTUwLCAweDZBOUYsIDB4Mzk1MSwgMHg2QUEwLCAweDE0QkMsIDB4NkFBMSwgMHg0NUNBLCAweDZBQTIsCisgICAgMHgxNEJFLCAweDZBQTMsIDB4MTRCRiwgMHg2QUE1LCAweDQyMTYsIDB4NkFBQSwgMHgxNENCLCAweDZBQUIsIDB4NDVDQywKKyAgICAweDZBQUMsIDB4MTRDNywgMHg2QUFFLCAweDE0NTAsIDB4NkFBRiwgMHg0QzBFLCAweDZBQjMsIDB4MTRDNiwgMHg2QUI4LAorICAgIDB4MTRDNSwgMHg2QUJCLCAweDE0QzIsIDB4NkFCRCwgMHg0NUNELCAweDZBQzEsIDB4MTRBQiwgMHg2QUMyLCAweDE0QzQsCisgICAgMHg2QUMzLCAweDE0QzMsIDB4NkFDNiwgMHg0NUNFLCAweDZBQzgsIDB4NEMwRiwgMHg2QUM5LCAweDRDMTAsIDB4NkFEMCwKKyAgICAweDQ1RDAsIDB4NkFEMSwgMHgxNEM5LCAweDZBRDMsIDB4MEZDQywgMHg2QUQ0LCAweDQ1Q0YsIDB4NkFEQSwgMHgxNENDLAorICAgIDB4NkFEQiwgMHgwNkYzLCAweDZBREMsIDB4Mzk1MiwgMHg2QURELCAweDQ1RDEsIDB4NkFERSwgMHgxNEM4LCAweDZBREYsCisgICAgMHgxNENBLCAweDZBRTIsIDB4MjEzQiwgMHg2QUU0LCAweDIxM0MsIDB4NkFFNywgMHgzOTUzLCAweDZBRTgsIDB4MEQzQiwKKyAgICAweDZBRUEsIDB4MTRDRCwgMHg2QUVDLCAweDM5NTQsIDB4NkFGMSwgMHg0NUQ0LCAweDZBRjIsIDB4NDVENSwgMHg2QUYzLAorICAgIDB4NDVENiwgMHg2QUY4LCAweDRFQjgsIDB4NkFGQSwgMHgxNEQxLCAweDZBRkIsIDB4MTRDRSwgMHg2QUZELCAweDQ1RDcsCisgICAgMHg2QjAzLCAweDRDMTEsIDB4NkIwNCwgMHgwRjVELCAweDZCMDUsIDB4MTRDRiwgMHg2QjBBLCAweDE0OUYsIDB4NkIwQiwKKyAgICAweDQ1RDksIDB4NkIwRiwgMHg0NURBLCAweDZCMTAsIDB4NDVEQiwgMHg2QjExLCAweDQ1REMsIDB4NkIxMiwgMHgxNEQyLAorICAgIDB4NkIxNiwgMHgxNEQzLCAweDZCMTcsIDB4NDVERSwgMHg2QjFCLCAweDQyMTgsIDB4NkIxRCwgMHgwNEQ3LCAweDZCMUUsCisgICAgMHgzOTU1LCAweDZCMUYsIDB4MTRENSwgMHg2QjIwLCAweDA3M0QsIDB4NkIyMSwgMHgwOENELCAweDZCMjMsIDB4MDZDRCwKKyAgICAweDZCMjQsIDB4Mzk1NiwgMHg2QjI3LCAweDA1MjQsIDB4NkIyQywgMHg0MjE5LCAweDZCMkYsIDB4NDVFMCwgMHg2QjMyLAorICAgIDB4MEY0OSwgMHg2QjM1LCAweDM5NTcsIDB4NkIzNywgMHgxNEQ3LCAweDZCMzgsIDB4MTRENiwgMHg2QjM5LCAweDE0RDksCisgICAgMHg2QjNBLCAweDA2NTcsIDB4NkIzQiwgMHg0QzEyLCAweDZCM0QsIDB4MDZDRSwgMHg2QjNFLCAweDA1RkEsIDB4NkIzRiwKKyAgICAweDRDMTMsIDB4NkI0MywgMHgxNERDLCAweDZCNDYsIDB4Mzk1OCwgMHg2QjQ3LCAweDE0REIsIDB4NkI0OSwgMHgxNERELAorICAgIDB4NkI0QSwgMHg0NUUxLCAweDZCNEMsIDB4MDU0RSwgMHg2QjRFLCAweDBCNzUsIDB4NkI1MCwgMHgxNERFLCAweDZCNTMsCisgICAgMHgwNUZCLCAweDZCNTQsIDB4MTRFMCwgMHg2QjU2LCAweDM5NTksIDB4NkI1OCwgMHg0NUUyLCAweDZCNTksIDB4MTRERiwKKyAgICAweDZCNUIsIDB4MTRFMSwgMHg2QjVGLCAweDE0RTIsIDB4NkI2MCwgMHgzOTVBLCAweDZCNjEsIDB4MTRFMywgMHg2QjYyLAorICAgIDB4MDhBRCwgMHg2QjYzLCAweDBBNTksIDB4NkI2NCwgMHgwODExLCAweDZCNjUsIDB4MzQ0QSwgMHg2QjY2LCAweDBERTIsCisgICAgMHg2QjY3LCAweDQyMUEsIDB4NkI2OSwgMHgwRTMyLCAweDZCNkEsIDB4MEZFQSwgMHg2QjZDLCAweDQ1RTMsIDB4NkI2RiwKKyAgICAweDA4QzMsIDB4NkI3MiwgMHgzNUQ5LCAweDZCNzMsIDB4MDg0MCwgMHg2Qjc0LCAweDBGQkEsIDB4NkI3NSwgMHg0NUU0LAorICAgIDB4NkI3NywgMHgzNDU2LCAweDZCNzgsIDB4MTRFNCwgMHg2Qjc5LCAweDE0RTUsIDB4NkI3QSwgMHg0NUU1LCAweDZCN0IsCisgICAgMHgwOEFFLCAweDZCN0QsIDB4NEMxNCwgMHg2QjdFLCAweDRDMTUsIDB4NkI3RiwgMHgxNEU2LCAweDZCODAsIDB4MTRFNywKKyAgICAweDZCODEsIDB4NDVFNiwgMHg2QjgyLCAweDM5NUIsIDB4NkI4MywgMHgxNEU5LCAweDZCODQsIDB4MTRFOCwgMHg2Qjg2LAorICAgIDB4MEU4NiwgMHg2Qjg5LCAweDA5NjgsIDB4NkI4QSwgMHgwOTE4LCAweDZCOEIsIDB4MDg5MiwgMHg2QjhELCAweDE0RUEsCisgICAgMHg2Qjk1LCAweDE0RUMsIDB4NkI5NiwgMHgwOUU5LCAweDZCOTgsIDB4MTRFQiwgMHg2QjlCLCAweDQ1RTcsIDB4NkI5RSwKKyAgICAweDE0RUQsIDB4NkJBNCwgMHgxNEVFLCAweDZCQTksIDB4NDIxQiwgMHg2QkFBLCAweDE0RUYsIDB4NkJBQiwgMHgxNEYwLAorICAgIDB4NkJBRCwgMHg0MjFDLCAweDZCQUUsIDB4NDVFOCwgMHg2QkFGLCAweDE0RjEsIDB4NkJCMCwgMHg0QzE2LCAweDZCQjEsCisgICAgMHgxNEYzLCAweDZCQjIsIDB4MTRGMiwgMHg2QkIzLCAweDE0RjQsIDB4NkJCNCwgMHgwNTI1LCAweDZCQjUsIDB4MEI4OCwKKyAgICAweDZCQjcsIDB4MTRGNSwgMHg2QkJBLCAweDA4NzQsIDB4NkJCQiwgMHgwNUFBLCAweDZCQkMsIDB4MTRGNiwgMHg2QkJELAorICAgIDB4NDVFQSwgMHg2QkJFLCAweDM5NUMsIDB4NkJCRiwgMHgwQzNDLCAweDZCQzAsIDB4MTE5RCwgMHg2QkM1LCAweDA2M0QsCisgICAgMHg2QkM2LCAweDE0RjcsIDB4NkJDNywgMHg0NUVCLCAweDZCQzgsIDB4NDVFQywgMHg2QkM5LCAweDQ1RUQsIDB4NkJDQiwKKyAgICAweDE0RjgsIDB4NkJDQywgMHgzNzQ0LCAweDZCQ0QsIDB4MEUzQywgMHg2QkNFLCAweDBFOTYsIDB4NkJDRiwgMHgzNDRDLAorICAgIDB4NkJEMiwgMHgwQzlGLCAweDZCRDMsIDB4MTRGOSwgMHg2QkQ0LCAweDBEN0EsIDB4NkJENiwgMHgyMTNELCAweDZCRDcsCisgICAgMHg0MjFELCAweDZCRDgsIDB4MEQ4RiwgMHg2QkRBLCAweDQ1RUUsIDB4NkJEQiwgMHgwRURGLCAweDZCREYsIDB4MTRGQSwKKyAgICAweDZCRTEsIDB4Mzk1RCwgMHg2QkU2LCAweDQ1RUYsIDB4NkJFNywgMHg0NUYwLCAweDZCRUIsIDB4MTRGQywgMHg2QkVDLAorICAgIDB4MTRGQiwgMHg2QkVFLCAweDQ1RjEsIDB4NkJFRiwgMHgxNEZFLCAweDZCRjEsIDB4Mzk1RSwgMHg2QkYzLCAweDE0RkQsCisgICAgMHg2QkY3LCAweDRDMTcsIDB4NkJGOSwgMHg0QzE4LCAweDZCRkYsIDB4NDIxRSwgMHg2QzAyLCAweDQ1RjIsIDB4NkMwNCwKKyAgICAweDRDMTksIDB4NkMwNSwgMHg0MjFGLCAweDZDMDgsIDB4MTUwMCwgMHg2QzA5LCAweDRDMUEsIDB4NkMwQSwgMHg0NUYzLAorICAgIDB4NkMwRCwgMHg0QzFCLCAweDZDMEUsIDB4NDVGNCwgMHg2QzBGLCAweDA4QUYsIDB4NkMxMCwgMHgzOTVGLCAweDZDMTEsCisgICAgMHgwRUJELCAweDZDMTMsIDB4MTUwMSwgMHg2QzE0LCAweDE1MDIsIDB4NkMxNywgMHgwNjNFLCAweDZDMUIsIDB4MTUwMywKKyAgICAweDZDMjMsIDB4MTUwNSwgMHg2QzI0LCAweDE1MDQsIDB4NkMyQywgMHg0QzFDLCAweDZDMzMsIDB4Mzk2MCwgMHg2QzM0LAorICAgIDB4MEEyQiwgMHg2QzM1LCAweDM5NjEsIDB4NkMzNiwgMHg0NUY1LCAweDZDMzcsIDB4MERBQiwgMHg2QzM4LCAweDA0RUMsCisgICAgMHg2QzNBLCAweDRGNTUsIDB4NkMzRSwgMHgwRDU5LCAweDZDM0YsIDB4MjEzRSwgMHg2QzQwLCAweDBDMTEsIDB4NkM0MSwKKyAgICAweDA5NEIsIDB4NkM0MiwgMHgwNjdCLCAweDZDNEEsIDB4NEMxRCwgMHg2QzRELCAweDQ1RjcsIDB4NkM0RSwgMHgwRDVBLAorICAgIDB4NkM1MCwgMHgwOERBLCAweDZDNTIsIDB4NEMxRSwgMHg2QzU0LCAweDRDMUYsIDB4NkM1NSwgMHgxNTA3LCAweDZDNTcsCisgICAgMHgwNUZDLCAweDZDNTksIDB4Mzk2MywgMHg2QzVBLCAweDA1MUEsIDB4NkM1QiwgMHg0NUY4LCAweDZDNUMsIDB4MjEzRiwKKyAgICAweDZDNUQsIDB4MENDQSwgMHg2QzVFLCAweDE1MDYsIDB4NkM1RiwgMHgwN0QwLCAweDZDNjAsIDB4MEI5MSwgMHg2QzYyLAorICAgIDB4MTUwOCwgMHg2QzY3LCAweDQ2MEEsIDB4NkM2OCwgMHgxNTEwLCAweDZDNkEsIDB4MTUwOSwgMHg2QzZELCAweDQ1RjksCisgICAgMHg2QzZGLCAweDIxNDEsIDB4NkM3MCwgMHgwQjIxLCAweDZDNzIsIDB4MDY3QywgMHg2QzczLCAweDE1MTEsIDB4NkM3NCwKKyAgICAweDQyMjAsIDB4NkM3NiwgMHgzOTY0LCAweDZDNzksIDB4NEMyMCwgMHg2QzdBLCAweDA3M0UsIDB4NkM3QiwgMHgzOTY1LAorICAgIDB4NkM3RCwgMHgwNjNGLCAweDZDN0UsIDB4MTUwRiwgMHg2QzgxLCAweDE1MEQsIDB4NkM4MiwgMHgxNTBBLCAweDZDODMsCisgICAgMHgwRjRBLCAweDZDODQsIDB4NDVGQSwgMHg2Qzg1LCAweDM5NjYsIDB4NkM4NiwgMHgyMTQwLCAweDZDODgsIDB4MEJEQywKKyAgICAweDZDODksIDB4NDVGQiwgMHg2QzhDLCAweDBDQjEsIDB4NkM4RCwgMHgxNTBCLCAweDZDOTAsIDB4MTUxMywgMHg2QzkyLAorICAgIDB4MTUxMiwgMHg2QzkzLCAweDA2RjksIDB4NkM5NCwgMHg0NUZELCAweDZDOTUsIDB4Mzk2NywgMHg2Qzk2LCAweDA1MkQsCisgICAgMHg2Qzk3LCAweDQ1RkUsIDB4NkM5OCwgMHg0MjIxLCAweDZDOTksIDB4MDgyQiwgMHg2QzlBLCAweDE1MEMsIDB4NkM5QiwKKyAgICAweDE1MEUsIDB4NkM5QywgMHgzOTY4LCAweDZDQTEsIDB4MEU4NSwgMHg2Q0EyLCAweDBCNTQsIDB4NkNBQSwgMHgzNzQ5LAorICAgIDB4NkNBQiwgMHgwRUE1LCAweDZDQUMsIDB4NEMyMSwgMHg2Q0FELCAweDQ1RkYsIDB4NkNBRSwgMHgxNTFCLCAweDZDQjEsCisgICAgMHgxNTFDLCAweDZDQjMsIDB4MDU0RiwgMHg2Q0I0LCAweDRDMjIsIDB4NkNCOCwgMHgwREY4LCAweDZDQjksIDB4MEYwOSwKKyAgICAweDZDQkEsIDB4MTUxRSwgMHg2Q0JCLCAweDA4Q0YsIDB4NkNCQywgMHgwOUFBLCAweDZDQkQsIDB4MTUxNywgMHg2Q0JFLAorICAgIDB4MTUxRCwgMHg2Q0JGLCAweDA1MEEsIDB4NkNDMSwgMHgwNkFGLCAweDZDQzIsIDB4NDYwMCwgMHg2Q0M0LCAweDE1MTQsCisgICAgMHg2Q0M1LCAweDE1MTksIDB4NkNDNiwgMHg0MjIzLCAweDZDQzksIDB4MEE5OCwgMHg2Q0NBLCAweDBEMjcsIDB4NkNDQywKKyAgICAweDBEN0IsIDB4NkNEMCwgMHgzOTY5LCAweDZDRDIsIDB4NEMyMywgMHg2Q0QzLCAweDE1MTYsIDB4NkNENCwgMHgzOTZBLAorICAgIDB4NkNENSwgMHgwRTRGLCAweDZDRDYsIDB4Mzk2QiwgMHg2Q0Q3LCAweDE1MTgsIDB4NkNEOSwgMHgxNTIxLCAweDZDREEsCisgICAgMHgyMTQyLCAweDZDREIsIDB4MTUxRiwgMHg2Q0RDLCAweDQ2MDIsIDB4NkNERCwgMHgxNTFBLCAweDZDRTAsIDB4Mzk2QywKKyAgICAweDZDRTEsIDB4MEU1MCwgMHg2Q0UyLCAweDBDRkUsIDB4NkNFMywgMHgwNjdELCAweDZDRTUsIDB4MEMxRiwgMHg2Q0U4LAorICAgIDB4MEJBQiwgMHg2Q0U5LCAweDQ2MDMsIDB4NkNFQSwgMHgxNTIyLCAweDZDRUIsIDB4Mzk2RCwgMHg2Q0VDLCAweDM5NkUsCisgICAgMHg2Q0VELCAweDQ2MDQsIDB4NkNFRSwgMHgzOTZGLCAweDZDRUYsIDB4MTUyMCwgMHg2Q0YwLCAweDBCMzksIDB4NkNGMSwKKyAgICAweDE1MTUsIDB4NkNGMywgMHgwNEVELCAweDZDRkIsIDB4NDIyMiwgMHg2RDAwLCAweDQ2MDYsIDB4NkQwMSwgMHgzQzM1LAorICAgIDB4NkQwNCwgMHgyMTQzLCAweDZEMEEsIDB4Mzk3MCwgMHg2RDBCLCAweDBGMzgsIDB4NkQwQywgMHgxNTJELCAweDZEMEUsCisgICAgMHgzOTcxLCAweDZEMTEsIDB4Mzk3MiwgMHg2RDEyLCAweDE1MkMsIDB4NkQxNywgMHgwQTlBLCAweDZEMTksIDB4MTUyOSwKKyAgICAweDZEMUIsIDB4MEY1NiwgMHg2RDFFLCAweDBDOEUsIDB4NkQxRiwgMHgxNTIzLCAweDZEMjQsIDB4NDYwNywgMHg2RDI1LAorICAgIDB4MEJFMSwgMHg2RDI2LCAweDQ2MDgsIDB4NkQyNywgMHg0NjA5LCAweDZEMjksIDB4MDRFRSwgMHg2RDJBLCAweDA3RDEsCisgICAgMHg2RDJCLCAweDE1MjYsIDB4NkQyRSwgMHgzOTczLCAweDZEMkYsIDB4NDYwQiwgMHg2RDMxLCAweDQyMjQsIDB4NkQzMiwKKyAgICAweDA5MzEsIDB4NkQzMywgMHgxNTJCLCAweDZEMzQsIDB4NDYxRSwgMHg2RDM1LCAweDE1MkEsIDB4NkQzNiwgMHgxNTI1LAorICAgIDB4NkQzOCwgMHgxNTI4LCAweDZEMzksIDB4NDIyNSwgMHg2RDNCLCAweDA1QzYsIDB4NkQzQywgMHg0NjBDLCAweDZEM0QsCisgICAgMHgxNTI3LCAweDZEM0UsIDB4MENGRiwgMHg2RDNGLCAweDQyMjYsIDB4NkQ0MSwgMHgwRjc2LCAweDZENDQsIDB4MDlEQywKKyAgICAweDZENDUsIDB4MEE5OSwgMHg2RDU3LCAweDM5NzQsIDB4NkQ1OCwgMHg0MjI3LCAweDZENTksIDB4MTUzMywgMHg2RDVBLAorICAgIDB4MTUzMSwgMHg2RDVCLCAweDQ2MEQsIDB4NkQ1QywgMHgwREJGLCAweDZENUUsIDB4Mzk3NSwgMHg2RDYwLCAweDQ2MEUsCisgICAgMHg2RDYxLCAweDRDMjQsIDB4NkQ2MywgMHgxNTJFLCAweDZENjQsIDB4MTUzMCwgMHg2RDY1LCAweDM5NzYsIDB4NkQ2NiwKKyAgICAweDA0REMsIDB4NkQ2OSwgMHgwN0QyLCAweDZENkEsIDB4MEZEOCwgMHg2RDZDLCAweDA1OUIsIDB4NkQ2RSwgMHgwREQ0LAorICAgIDB4NkQ2RiwgMHgyMTQ1LCAweDZENzAsIDB4NDYwRiwgMHg2RDc0LCAweDBGNEIsIDB4NkQ3NywgMHgwNTgyLCAweDZENzgsCisgICAgMHgwQTAxLCAweDZENzksIDB4MTUzMiwgMHg2RDdDLCAweDRDMjUsIDB4NkQ4MCwgMHg0NjEwLCAweDZEODEsIDB4NDYxMSwKKyAgICAweDZEODIsIDB4Mzk3NywgMHg2RDg1LCAweDE1MzcsIDB4NkQ4NywgMHgyMTQ0LCAweDZEODgsIDB4MDlBQiwgMHg2RDg5LAorICAgIDB4MzQyQSwgMHg2RDhBLCAweDQ2MTIsIDB4NkQ4QywgMHgwRjFBLCAweDZEOEQsIDB4NDYxMywgMHg2RDhFLCAweDE1MzQsCisgICAgMHg2RDkxLCAweDQ2MTQsIDB4NkQ5MywgMHgxNTJGLCAweDZEOTQsIDB4NDIyOCwgMHg2RDk1LCAweDE1MzUsIDB4NkQ5NiwKKyAgICAweDIxNDYsIDB4NkQ5OCwgMHg0NjE1LCAweDZEOTksIDB4MEZBNiwgMHg2RDlCLCAweDBDNkQsIDB4NkQ5QywgMHgwQzlBLAorICAgIDB4NkRBQSwgMHg0MjI5LCAweDZEQUIsIDB4NDYxQSwgMHg2REFDLCAweDIxNDcsIDB4NkRBRSwgMHg0NjFCLCAweDZEQUYsCisgICAgMHgwNTk0LCAweDZEQjIsIDB4MDRGNywgMHg2REI0LCAweDQ2MUMsIDB4NkRCNSwgMHgxNTNCLCAweDZEQjgsIDB4MTUzRSwKKyAgICAweDZEQjksIDB4NEMyNiwgMHg2REJDLCAweDBGOEIsIDB4NkRCRiwgMHgzOTc4LCAweDZEQzAsIDB4MEY0RSwgMHg2REMyLAorICAgIDB4NDYxRCwgMHg2REM0LCAweDM5NzksIDB4NkRDNSwgMHgxNTQ1LCAweDZEQzYsIDB4MTUzRiwgMHg2REM3LCAweDE1M0MsCisgICAgMHg2REM4LCAweDQ2MUYsIDB4NkRDQSwgMHgzOTdBLCAweDZEQ0IsIDB4MEY5QywgMHg2RENDLCAweDE1NDIsIDB4NkRDRSwKKyAgICAweDQ2MjAsIDB4NkRDRiwgMHgyMTQ4LCAweDZERDAsIDB4M0MzNiwgMHg2REQxLCAweDA5NTQsIDB4NkREMiwgMHgxNTQ0LAorICAgIDB4NkRENSwgMHgxNTQ5LCAweDZERDYsIDB4Mzk3QiwgMHg2REQ4LCAweDBDNkIsIDB4NkREOSwgMHgxNTQ3LCAweDZEREEsCisgICAgMHgzNDUzLCAweDZEREIsIDB4NDIyQSwgMHg2RERELCAweDQyMkIsIDB4NkRERSwgMHgxNTQxLCAweDZEREYsIDB4NDYyMSwKKyAgICAweDZERTEsIDB4MEI3NiwgMHg2REU0LCAweDE1NDgsIDB4NkRFNiwgMHgxNTNELCAweDZERTgsIDB4MTU0MywgMHg2REU5LAorICAgIDB4Mzk3QywgMHg2REVBLCAweDE1NEEsIDB4NkRFQiwgMHgwNEMwLCAweDZERUMsIDB4MTU0MCwgMHg2REVFLCAweDE1NEIsCisgICAgMHg2REYwLCAweDRDMjcsIDB4NkRGMSwgMHgwQTAyLCAweDZERjIsIDB4MjE0QSwgMHg2REYzLCAweDA5NjksIDB4NkRGNSwKKyAgICAweDBERjUsIDB4NkRGNiwgMHg0NjIyLCAweDZERjcsIDB4MDgxRSwgMHg2REY4LCAweDIxNDksIDB4NkRGOSwgMHgxNTM4LAorICAgIDB4NkRGQSwgMHgxNTQ2LCAweDZERkIsIDB4MEMzNCwgMHg2REZDLCAweDIxNEIsIDB4NkUwNSwgMHgwQTVBLCAweDZFMDcsCisgICAgMHgwNUM3LCAweDZFMDgsIDB4MDg0MSwgMHg2RTA5LCAweDA5QUMsIDB4NkUwQSwgMHgxNTNBLCAweDZFMEIsIDB4MDk0QywKKyAgICAweDZFMTMsIDB4MDcyMiwgMHg2RTE1LCAweDE1MzksIDB4NkUxNywgMHgzNzQ2LCAweDZFMTksIDB4MTU0RiwgMHg2RTFBLAorICAgIDB4MDk3NywgMHg2RTFCLCAweDA3NkUsIDB4NkUxRCwgMHgxNTVFLCAweDZFMUUsIDB4NDYyNCwgMHg2RTFGLCAweDE1NTgsCisgICAgMHg2RTIwLCAweDA2OEUsIDB4NkUyMSwgMHgwQzQ5LCAweDZFMjIsIDB4Mzk3RCwgMHg2RTIzLCAweDE1NTMsIDB4NkUyNCwKKyAgICAweDE1NUMsIDB4NkUyNSwgMHgwNDczLCAweDZFMjYsIDB4MDRENCwgMHg2RTI3LCAweDIxNEUsIDB4NkUyOSwgMHgwNTM5LAorICAgIDB4NkUyQiwgMHgxNTU1LCAweDZFMkMsIDB4MEIwQywgMHg2RTJELCAweDE1NEMsIDB4NkUyRSwgMHgxNTRFLCAweDZFMkYsCisgICAgMHgwN0QzLCAweDZFMzIsIDB4NDYyNiwgMHg2RTM0LCAweDM0MTIsIDB4NkUzNiwgMHg0NjIzLCAweDZFMzgsIDB4MTU1RiwKKyAgICAweDZFMzksIDB4MjE0QywgMHg2RTNBLCAweDE1NUEsIDB4NkUzQywgMHgyMTRGLCAweDZFM0UsIDB4MTU1MiwgMHg2RTQyLAorICAgIDB4M0MzNywgMHg2RTQzLCAweDE1NTksIDB4NkU0NCwgMHg0MjJDLCAweDZFNDUsIDB4NEMyOCwgMHg2RTQ4LCAweDQ2MjcsCisgICAgMHg2RTQ5LCAweDQ2MjgsIDB4NkU0QSwgMHgwRUI3LCAweDZFNEIsIDB4NDYyOSwgMHg2RTRDLCAweDQ2MkEsIDB4NkU0RCwKKyAgICAweDE1NTcsIDB4NkU0RSwgMHgxNTVCLCAweDZFNEYsIDB4NDYyQiwgMHg2RTUxLCAweDM5N0UsIDB4NkU1MywgMHg0NjJDLAorICAgIDB4NkU1NCwgMHg0NjJELCAweDZFNTYsIDB4MDc4NCwgMHg2RTU3LCAweDQ2MkUsIDB4NkU1OCwgMHgwOUFELCAweDZFNUIsCisgICAgMHgwQjc3LCAweDZFNUMsIDB4MjE0RCwgMHg2RTVFLCAweDQyMkQsIDB4NkU1RiwgMHgxNTUxLCAweDZFNjMsIDB4NDYyRiwKKyAgICAweDZFNjcsIDB4MEYxOSwgMHg2RTZCLCAweDE1NTQsIDB4NkU2RSwgMHgxNTRELCAweDZFNkYsIDB4MEM2QywgMHg2RTcyLAorICAgIDB4MTU1MCwgMHg2RTczLCAweDRDMjksIDB4NkU3NiwgMHgxNTU2LCAweDZFN0IsIDB4NEMyQSwgMHg2RTdELCAweDRDMkIsCisgICAgMHg2RTdFLCAweDBGRjcsIDB4NkU3RiwgMHgwOEVBLCAweDZFODAsIDB4MEVBQywgMHg2RTgyLCAweDE1NjAsIDB4NkU4OSwKKyAgICAweDRDMkMsIDB4NkU4QywgMHgwRDQyLCAweDZFOEYsIDB4MTU2QywgMHg2RTkwLCAweDA3NkYsIDB4NkU5MywgMHg0NjMxLAorICAgIDB4NkU5NiwgMHgwOTZBLCAweDZFOTgsIDB4MTU2MiwgMHg2RTlDLCAweDBGNzcsIDB4NkU5RCwgMHgwN0Q0LCAweDZFOUYsCisgICAgMHgxNTZGLCAweDZFQTIsIDB4MDRCMiwgMHg2RUE1LCAweDE1NkQsIDB4NkVBNywgMHg0NjMyLCAweDZFQUEsIDB4MTU2MSwKKyAgICAweDZFQUIsIDB4MzQwQywgMHg2RUFGLCAweDE1NjcsIDB4NkVCMSwgMHg0MjJFLCAweDZFQjIsIDB4MTU2OSwgMHg2RUI0LAorICAgIDB4NDYzMywgMHg2RUI2LCAweDBGMzksIDB4NkVCNywgMHgxNTY0LCAweDZFQkEsIDB4MEMyOCwgMHg2RUJDLCAweDRDMkQsCisgICAgMHg2RUJELCAweDE1NjYsIDB4NkVCRiwgMHgyMTUwLCAweDZFQzEsIDB4NDIyRiwgMHg2RUMyLCAweDE1NkUsIDB4NkVDMywKKyAgICAweDQ2MzQsIDB4NkVDNCwgMHgxNTY4LCAweDZFQzUsIDB4MEVEMywgMHg2RUM3LCAweDM5N0YsIDB4NkVDOSwgMHgxNTYzLAorICAgIDB4NkVDQSwgMHgzOTgwLCAweDZFQ0IsIDB4MDhDRSwgMHg2RUNDLCAweDE1N0IsIDB4NkVDRSwgMHgzOTgxLCAweDZFRDEsCisgICAgMHgwNUM4LCAweDZFRDMsIDB4MTU2NSwgMHg2RUQ0LCAweDE1NkEsIDB4NkVENSwgMHgxNTZCLCAweDZFRDksIDB4M0MzOCwKKyAgICAweDZFREEsIDB4NEMyRSwgMHg2RURCLCAweDRDMkYsIDB4NkVERCwgMHgwQjRDLCAweDZFREUsIDB4MEIzQSwgMHg2RUU2LAorICAgIDB4M0MyNCwgMHg2RUVCLCAweDQ2MzYsIDB4NkVFQywgMHgxNTczLCAweDZFRUYsIDB4MTU3OSwgMHg2RUYyLCAweDE1NzcsCisgICAgMHg2RUY0LCAweDBDMjMsIDB4NkVGNywgMHgxNTdFLCAweDZFRjgsIDB4MTU3NCwgMHg2RUY5LCAweDQ2MzcsIDB4NkVGQiwKKyAgICAweDQ2MzgsIDB4NkVGRCwgMHgzOTgyLCAweDZFRkUsIDB4MTU3NSwgMHg2RUZGLCAweDE1NUQsIDB4NkYwMSwgMHgwNjkzLAorICAgIDB4NkYwMiwgMHgwREFDLCAweDZGMDYsIDB4MDhFQiwgMHg2RjA5LCAweDA4MDksIDB4NkYwQSwgMHg0NjM5LCAweDZGMEMsCisgICAgMHg0NjNBLCAweDZGMEYsIDB4MEZEOSwgMHg2RjEwLCAweDQyMzAsIDB4NkYxMSwgMHgxNTcxLCAweDZGMTMsIDB4MTU3RCwKKyAgICAweDZGMTQsIDB4MDUwQiwgMHg2RjE1LCAweDBBRTgsIDB4NkYxOCwgMHg0NjNCLCAweDZGMUEsIDB4Mzk4MywgMHg2RjIwLAorICAgIDB4MEQyRiwgMHg2RjIyLCAweDA1RkQsIDB4NkYyMywgMHgwRkMyLCAweDZGMjUsIDB4NDYzQywgMHg2RjI2LCAweDRDMzAsCisgICAgMHg2RjI5LCAweDRDMzEsIDB4NkYyQSwgMHgzOTg0LCAweDZGMkIsIDB4MEVBRCwgMHg2RjJDLCAweDBCRUUsIDB4NkYyRiwKKyAgICAweDM5ODUsIDB4NkYzMCwgMHg0QzMyLCAweDZGMzEsIDB4MTU3OCwgMHg2RjMyLCAweDE1N0EsIDB4NkYzMywgMHgzOTg2LAorICAgIDB4NkYzNSwgMHg0NjM1LCAweDZGMzYsIDB4NDYzRCwgMHg2RjM4LCAweDBBQjQsIDB4NkYzQywgMHg0NjNFLCAweDZGM0UsCisgICAgMHgxNTdDLCAweDZGM0YsIDB4MTU3NiwgMHg2RjQxLCAweDE1NzAsIDB4NkY0NSwgMHgwNUZGLCAweDZGNTEsIDB4MUU2MCwKKyAgICAweDZGNTIsIDB4NDY0MCwgMHg2RjU0LCAweDA3M0YsIDB4NkY1NywgMHg0NjQxLCAweDZGNTgsIDB4MTU4QSwgMHg2RjU5LAorICAgIDB4NDIzMSwgMHg2RjVBLCAweDM5ODcsIDB4NkY1QiwgMHgxNTg1LCAweDZGNUMsIDB4MEE5QywgMHg2RjVFLCAweDM5ODgsCisgICAgMHg2RjVGLCAweDA1QzEsIDB4NkY2MCwgMHg0NjQyLCAweDZGNjEsIDB4NDIzMiwgMHg2RjYyLCAweDM5ODksIDB4NkY2NCwKKyAgICAweDA5NkIsIDB4NkY2NiwgMHgxNThFLCAweDZGNjgsIDB4NDY0MywgMHg2RjZELCAweDE1ODcsIDB4NkY2RSwgMHgwQkM4LAorICAgIDB4NkY2RiwgMHgxNTg0LCAweDZGNzAsIDB4MEJGNSwgMHg2Rjc0LCAweDE1QTcsIDB4NkY3OCwgMHgxNTgxLCAweDZGN0EsCisgICAgMHgxNTgwLCAweDZGN0MsIDB4MTU4OSwgMHg2RjdELCAweDM5OEEsIDB4NkY3RSwgMHg0MjMzLCAweDZGODAsIDB4MTU4MywKKyAgICAweDZGODEsIDB4MTU4MiwgMHg2RjgyLCAweDE1ODgsIDB4NkY4NCwgMHgwQTQ1LCAweDZGODYsIDB4MTU3RiwgMHg2Rjg3LAorICAgIDB4NEMzMywgMHg2Rjg4LCAweDIxNTEsIDB4NkY4QiwgMHgzOThCLCAweDZGOEMsIDB4NDIzNCwgMHg2RjhELCAweDM5OEMsCisgICAgMHg2RjhFLCAweDE1OEIsIDB4NkY5MCwgMHg0NjQ0LCAweDZGOTEsIDB4MTU4QywgMHg2RjkyLCAweDM5OEQsIDB4NkY5NCwKKyAgICAweDM5OEUsIDB4NkY5NiwgMHg0NjQ1LCAweDZGOTcsIDB4MDVGRSwgMHg2Rjk4LCAweDM2M0MsIDB4NkY5QSwgMHgzOThGLAorICAgIDB4NkY5RCwgMHg0QzM0LCAweDZGOUYsIDB4NDY0NywgMHg2RkEwLCAweDQyMzUsIDB4NkZBMSwgMHgxNTkxLCAweDZGQTMsCisgICAgMHgxNTkwLCAweDZGQTQsIDB4MTU5MiwgMHg2RkE1LCAweDQ2NDgsIDB4NkZBNywgMHgzOTkwLCAweDZGQTgsIDB4Mzk5MSwKKyAgICAweDZGQUEsIDB4MTU5NSwgMHg2RkFFLCAweDRDMzUsIDB4NkZBRiwgMHg0NjQ5LCAweDZGQjEsIDB4MEMzRCwgMHg2RkIzLAorICAgIDB4MTU4RiwgMHg2RkI1LCAweDIxNTIsIDB4NkZCNiwgMHgzOTkyLCAweDZGQjcsIDB4NEMzNiwgMHg2RkI5LCAweDE1OTMsCisgICAgMHg2RkJDLCAweDQyMzYsIDB4NkZCRSwgMHg0NjQ2LCAweDZGQzAsIDB4MDczOSwgMHg2RkMxLCAweDBCNTksIDB4NkZDMiwKKyAgICAweDE1OEQsIDB4NkZDMywgMHgwQ0YxLCAweDZGQzYsIDB4MTU5NCwgMHg2RkM3LCAweDQyMzcsIDB4NkZDOCwgMHg0NjRCLAorICAgIDB4NkZDOSwgMHg0NjRDLCAweDZGQ0EsIDB4NDIzOCwgMHg2RkQ0LCAweDE1OTksIDB4NkZENSwgMHgxNTk3LCAweDZGRDgsCisgICAgMHgxNTlBLCAweDZGREEsIDB4Mzk5MywgMHg2RkRCLCAweDE1OUQsIDB4NkZERSwgMHgzOTk0LCAweDZGREYsIDB4MTU5NiwKKyAgICAweDZGRTAsIDB4MDdGQywgMHg2RkUxLCAweDBDREUsIDB4NkZFNCwgMHgxNTM2LCAweDZGRTksIDB4NDY0RCwgMHg2RkVCLAorICAgIDB4MEY1RSwgMHg2RkVDLCAweDE1OTgsIDB4NkZFRSwgMHgxNTlDLCAweDZGRUYsIDB4MEI1NSwgMHg2RkYwLCAweDQyMzksCisgICAgMHg2RkYxLCAweDE1OUIsIDB4NkZGMywgMHgxNTg2LCAweDZGRjUsIDB4MjE1MywgMHg2RkY2LCAweDFCQTQsIDB4NkZGOSwKKyAgICAweDNDMjMsIDB4NkZGQSwgMHgxNUEwLCAweDZGRkMsIDB4NDY0RiwgMHg2RkZFLCAweDE1QTQsIDB4NzAwMCwgMHg0NjUwLAorICAgIDB4NzAwMSwgMHgxNUEyLCAweDcwMDUsIDB4MjE1NCwgMHg3MDA2LCAweDFFNTAsIDB4NzAwNywgMHgyMTU1LCAweDcwMDksCisgICAgMHgxNTlFLCAweDcwMEEsIDB4NDY1MSwgMHg3MDBCLCAweDE1OUYsIDB4NzAwRCwgMHg0QzM3LCAweDcwMEYsIDB4MTVBMywKKyAgICAweDcwMTEsIDB4MTVBMSwgMHg3MDE1LCAweDBEQzAsIDB4NzAxOCwgMHgxNUE5LCAweDcwMUEsIDB4MTVBNiwgMHg3MDFCLAorICAgIDB4MTVBNSwgMHg3MDFELCAweDE1QTgsIDB4NzAxRSwgMHgwQ0FDLCAweDcwMUYsIDB4MTVBQSwgMHg3MDIwLCAweDRDMzgsCisgICAgMHg3MDIzLCAweDQ2NTIsIDB4NzAyNiwgMHgwQkIzLCAweDcwMjcsIDB4MEI0RCwgMHg3MDI4LCAweDIxNTYsIDB4NzAyQywKKyAgICAweDBBNDksIDB4NzAzMCwgMHgxNUFCLCAweDcwMzIsIDB4MTVBRCwgMHg3MDM5LCAweDM5OTYsIDB4NzAzQSwgMHg0NjU0LAorICAgIDB4NzAzQywgMHgzOTk3LCAweDcwM0UsIDB4MTVBQywgMHg3MDQzLCAweDQ2NTUsIDB4NzA0NywgMHg0NjU2LCAweDcwNDksCisgICAgMHg0QzM5LCAweDcwNEEsIDB4NEY1MiwgMHg3MDRCLCAweDQ2NTcsIDB4NzA0QywgMHgxNTcyLCAweDcwNEUsIDB4NDIzQSwKKyAgICAweDcwNTEsIDB4MTVBRSwgMHg3MDU0LCAweDM5OTksIDB4NzA1OCwgMHgwQ0JGLCAweDcwNUQsIDB4Mzk5QSwgMHg3MDVFLAorICAgIDB4Mzk5QiwgMHg3MDYzLCAweDE1QUYsIDB4NzA2NCwgMHgzOTlDLCAweDcwNjUsIDB4NDY1OSwgMHg3MDY5LCAweDQ2NUEsCisgICAgMHg3MDZCLCAweDA1NTAsIDB4NzA2QywgMHgzOTlELCAweDcwNkUsIDB4NDY1QiwgMHg3MDZGLCAweDBDNkUsIDB4NzA3MCwKKyAgICAweDA1ODMsIDB4NzA3NSwgMHg0MjNCLCAweDcwNzYsIDB4NDY1QywgMHg3MDc4LCAweDA2N0UsIDB4NzA3QywgMHgwOTBBLAorICAgIDB4NzA3RCwgMHgwODQyLCAweDcwN0UsIDB4Mzk5RSwgMHg3MDgxLCAweDM5OUYsIDB4NzA4NSwgMHgyMTU3LCAweDcwODYsCisgICAgMHg0NjVELCAweDcwODksIDB4MEZDRCwgMHg3MDhBLCAweDBBMkMsIDB4NzA4RSwgMHgwNTBDLCAweDcwOTIsIDB4MTVCMSwKKyAgICAweDcwOTUsIDB4MzlBMCwgMHg3MDk3LCAweDQ2NUUsIDB4NzA5OCwgMHg0QzNBLCAweDcwOTksIDB4MTVCMCwgMHg3MDlGLAorICAgIDB4NDY2MCwgMHg3MEE0LCAweDQyM0MsIDB4NzBBQiwgMHgyMTU4LCAweDcwQUMsIDB4MTVCNCwgMHg3MEFELCAweDBCNzgsCisgICAgMHg3MEFFLCAweDE1QjcsIDB4NzBBRiwgMHgxNUIyLCAweDcwQjAsIDB4NEMzQiwgMHg3MEIxLCAweDQ2NjEsIDB4NzBCMywKKyAgICAweDE1QjYsIDB4NzBCNywgMHgzOUExLCAweDcwQjgsIDB4MTVCNSwgMHg3MEI5LCAweDBDM0EsIDB4NzBCQSwgMHgwNDlELAorICAgIDB4NzBCQiwgMHgyMEFELCAweDcwQzgsIDB4MEZCRCwgMHg3MENBLCAweDQ2NjQsIDB4NzBDQiwgMHgxNUI5LCAweDcwQ0YsCisgICAgMHgwNENBLCAweDcwRDEsIDB4NDY2NSwgMHg3MEQzLCAweDM5QTIsIDB4NzBENCwgMHgzOUEzLCAweDcwRDUsIDB4NEMzQywKKyAgICAweDcwRDYsIDB4NEMzRCwgMHg3MEQ4LCAweDM5QTQsIDB4NzBEOSwgMHgxNUJCLCAweDcwREMsIDB4MzlBNSwgMHg3MERELAorICAgIDB4MTVCQSwgMHg3MERGLCAweDE1QjgsIDB4NzBFNCwgMHg0MjNELCAweDcwRUMsIDB4NDY2MywgMHg3MEYxLCAweDE1QjMsCisgICAgMHg3MEY5LCAweDBFNTEsIDB4NzBGRCwgMHgxNUJELCAweDcxMDMsIDB4NDY2NiwgMHg3MTA0LCAweDIxNUEsIDB4NzEwNiwKKyAgICAweDQ2NjcsIDB4NzEwNywgMHgzOUE2LCAweDcxMDgsIDB4NDY2OCwgMHg3MTA5LCAweDE1QkMsIDB4NzEwQywgMHg0NjY5LAorICAgIDB4NzEwRiwgMHgyMTU5LCAweDcxMTQsIDB4MDUwRCwgMHg3MTE5LCAweDE1QkYsIDB4NzExQSwgMHgwRTAyLCAweDcxMUMsCisgICAgMHgxNUJFLCAweDcxMUUsIDB4NDIzRiwgMHg3MTIwLCAweDM5QTcsIDB4NzEyMSwgMHgwRUMxLCAweDcxMjYsIDB4MDlBRiwKKyAgICAweDcxMkIsIDB4NDIzRSwgMHg3MTJFLCAweDQyNDAsIDB4NzEyRiwgMHg0NjZCLCAweDcxMzAsIDB4MUREQywgMHg3MTMxLAorICAgIDB4MzlBOCwgMHg3MTM2LCAweDBBQjUsIDB4NzEzQywgMHgwOUFFLCAweDcxNDUsIDB4NEMzRSwgMHg3MTQ2LCAweDIxNUMsCisgICAgMHg3MTQ3LCAweDIxNUQsIDB4NzE0OSwgMHgwRkMzLCAweDcxNEEsIDB4MzlBOSwgMHg3MTRDLCAweDE1QzUsIDB4NzE0RSwKKyAgICAweDBBOUQsIDB4NzE1MCwgMHg0NjZDLCAweDcxNTEsIDB4NDI0MSwgMHg3MTUyLCAweDM5QUEsIDB4NzE1MywgMHg0NjZELAorICAgIDB4NzE1NSwgMHgxNUMxLCAweDcxNTYsIDB4MTVDNiwgMHg3MTU5LCAweDA1MEUsIDB4NzE1QywgMHgyMTVCLCAweDcxNUUsCisgICAgMHg0NjZFLCAweDcxNjAsIDB4MzlBQiwgMHg3MTYyLCAweDE1QzQsIDB4NzE2NCwgMHgwRDE3LCAweDcxNjUsIDB4MTVDMCwKKyAgICAweDcxNjYsIDB4MTVDMywgMHg3MTY3LCAweDA5QjAsIDB4NzE2OCwgMHg0MjQyLCAweDcxNjksIDB4MEQ2NSwgMHg3MTZDLAorICAgIDB4MTVDNywgMHg3MTZFLCAweDA4RkQsIDB4NzE3OSwgMHgzOUFDLCAweDcxN0QsIDB4MEE5RSwgMHg3MTgwLCAweDQ2NzEsCisgICAgMHg3MTg0LCAweDE1Q0EsIDB4NzE4NSwgMHg0MjQzLCAweDcxODcsIDB4NDI0NCwgMHg3MTg4LCAweDE1QzIsIDB4NzE4QSwKKyAgICAweDA2RkQsIDB4NzE4RiwgMHgxNUM4LCAweDcxOTIsIDB4MzlBRCwgMHg3MTk0LCAweDBGM0EsIDB4NzE5NSwgMHgxNUNCLAorICAgIDB4NzE5NiwgMHg0NjcwLCAweDcxOTksIDB4MjA1RCwgMHg3MTlCLCAweDQ2NzIsIDB4NzE5RiwgMHgwOTU5LCAweDcxQTAsCisgICAgMHg0NjczLCAweDcxQTIsIDB4NDY3NCwgMHg3MUE4LCAweDE1Q0MsIDB4NzFBQywgMHgxNUNELCAweDcxQUUsIDB4NDY3NSwKKyAgICAweDcxQUYsIDB4NDY3NiwgMHg3MUIxLCAweDBDRTQsIDB4NzFCMiwgMHg0QzNGLCAweDcxQjMsIDB4M0MyNSwgMHg3MUI5LAorICAgIDB4MTVDRiwgMHg3MUJBLCAweDQyNDUsIDB4NzFCRSwgMHgxNUQwLCAweDcxQzEsIDB4MjE1RiwgMHg3MUMzLCAweDBDRTksCisgICAgMHg3MUM0LCAweDQyNDYsIDB4NzFDOCwgMHgwQzZGLCAweDcxQzksIDB4MTVEMiwgMHg3MUNCLCAweDM5QUYsIDB4NzFDRSwKKyAgICAweDE1RDQsIDB4NzFEMCwgMHgwRjlELCAweDcxRDIsIDB4MTVEMSwgMHg3MUQzLCAweDM5QjAsIDB4NzFENCwgMHgxNUQzLAorICAgIDB4NzFENSwgMHgwNTBGLCAweDcxRDYsIDB4MzlCMSwgMHg3MUQ3LCAweDE1Q0UsIDB4NzFEOSwgMHg0Njc4LCAweDcxREMsCisgICAgMHg0Njc5LCAweDcxREYsIDB4MTE0RSwgMHg3MUUwLCAweDE1RDUsIDB4NzFFNSwgMHgwQUU5LCAweDcxRTYsIDB4MDg4NiwKKyAgICAweDcxRTcsIDB4MTVENywgMHg3MUVDLCAweDE1RDYsIDB4NzFFRCwgMHgwOUVBLCAweDcxRUUsIDB4MTBFRSwgMHg3MUY0LAorICAgIDB4NEM0MCwgMHg3MUY1LCAweDE1RDgsIDB4NzFGOSwgMHgxNURBLCAweDcxRkIsIDB4MTVDOSwgMHg3MUZDLCAweDE1RDksCisgICAgMHg3MUZFLCAweDIxNjAsIDB4NzFGRiwgMHgxNURCLCAweDcyMDAsIDB4MzlCMiwgMHg3MjA2LCAweDBEMzAsIDB4NzIwNywKKyAgICAweDQ2N0EsIDB4NzIwRCwgMHgxNURDLCAweDcyMTAsIDB4MTVERCwgMHg3MjE1LCAweDQyNDcsIDB4NzIxNywgMHg0QzQxLAorICAgIDB4NzIxQiwgMHgxNURFLCAweDcyMUQsIDB4MzlCMywgMHg3MjFGLCAweDRDNDIsIDB4NzIyOCwgMHgxNURGLCAweDcyMkEsCisgICAgMHgwQkZBLCAweDcyMkIsIDB4MzlCNCwgMHg3MjJDLCAweDE1RTEsIDB4NzIyRCwgMHgxNUUwLCAweDcyMzAsIDB4MTVFMiwKKyAgICAweDcyMzIsIDB4MTVFMywgMHg3MjM0LCAweDQ2N0MsIDB4NzIzNSwgMHgwOTBCLCAweDcyMzYsIDB4MERENSwgMHg3MjM4LAorICAgIDB4MzlCNSwgMHg3MjM5LCAweDQ2N0QsIDB4NzIzQSwgMHgwRUY4LCAweDcyM0IsIDB4MTVFNCwgMHg3MjNDLCAweDE1RTUsCisgICAgMHg3MjNELCAweDBBRDgsIDB4NzIzRSwgMHgwOEQwLCAweDcyM0YsIDB4MTVFNiwgMHg3MjQwLCAweDE1RTcsIDB4NzI0MSwKKyAgICAweDM5QjYsIDB4NzI0MiwgMHg0NjdFLCAweDcyNDMsIDB4NEM0MywgMHg3MjQ2LCAweDE1RTgsIDB4NzI0NywgMHgwRTIyLAorICAgIDB4NzI0OCwgMHgwRDVCLCAweDcyNEIsIDB4MTVFOSwgMHg3MjRDLCAweDBEMEQsIDB4NzI0RiwgMHg0QzQ0LCAweDcyNTAsCisgICAgMHg0QzQ1LCAweDcyNTIsIDB4MEJDOSwgMHg3MjUzLCAweDM5QjcsIDB4NzI1NSwgMHgzOUI4LCAweDcyNTYsIDB4MzlCOSwKKyAgICAweDcyNTcsIDB4NDY3RiwgMHg3MjU4LCAweDE1RUEsIDB4NzI1OSwgMHgwNTY3LCAweDcyNUEsIDB4NEM0NiwgMHg3MjVCLAorICAgIDB4MDY4NywgMHg3MjVDLCAweDM5QkEsIDB4NzI1RCwgMHgwRUQyLCAweDcyNUYsIDB4MEVDMiwgMHg3MjYwLCAweDRDNDcsCisgICAgMHg3MjYxLCAweDA1MzQsIDB4NzI2MiwgMHgwRkRBLCAweDcyNjMsIDB4NDY4MCwgMHg3MjY3LCAweDBFODAsIDB4NzI2OCwKKyAgICAweDRDNDgsIDB4NzI2OSwgMHgwREZBLCAweDcyNkUsIDB4NDY4MiwgMHg3MjZGLCAweDQ2ODMsIDB4NzI3MiwgMHgwQTVCLAorICAgIDB4NzI3NCwgMHgxNUVCLCAweDcyNzcsIDB4NEM0OSwgMHg3Mjc4LCAweDQ2ODQsIDB4NzI3OSwgMHgwQzlCLCAweDcyN0QsCisgICAgMHgwNzU3LCAweDcyN0UsIDB4MTVFQywgMHg3MjdGLCAweDQ2ODUsIDB4NzI4MCwgMHgwODQ0LCAweDcyODEsIDB4MTVFRSwKKyAgICAweDcyODIsIDB4MTVFRCwgMHg3Mjg0LCAweDRDNEEsIDB4NzI4NywgMHgxNUVGLCAweDcyOEQsIDB4MzlCQiwgMHg3MjhFLAorICAgIDB4NDY4NiwgMHg3MjkyLCAweDE1RjAsIDB4NzI5NiwgMHgxNUYxLCAweDcyOUIsIDB4NDI0OSwgMHg3MkEwLCAweDA2NTgsCisgICAgMHg3MkEyLCAweDE1RjIsIDB4NzJBNywgMHgxNUYzLCAweDcyQUMsIDB4MDc1OCwgMHg3MkFELCAweDM5QkMsIDB4NzJBRSwKKyAgICAweDQ2ODgsIDB4NzJBRiwgMHgwRDVDLCAweDcyQjAsIDB4NDY4OSwgMHg3MkIxLCAweDIxNjEsIDB4NzJCMiwgMHgxNUY1LAorICAgIDB4NzJCNCwgMHgzOUJELCAweDcyQjYsIDB4MDlERCwgMHg3MkI5LCAweDE1RjQsIDB4NzJCRSwgMHgyMTYyLCAweDcyQzAsCisgICAgMHgzNDJCLCAweDcyQzEsIDB4NDY4QSwgMHg3MkMyLCAweDA2QjAsIDB4NzJDMywgMHgxNUY2LCAweDcyQzQsIDB4MTVGOCwKKyAgICAweDcyQzYsIDB4MTVGNywgMHg3MkM3LCAweDM5QkUsIDB4NzJDOSwgMHg0QzRCLCAweDcyQ0MsIDB4NDY4QywgMHg3MkNFLAorICAgIDB4MTVGOSwgMHg3MkQwLCAweDA3ODUsIDB4NzJEMiwgMHgxNUZBLCAweDcyRDcsIDB4MDZFMSwgMHg3MkQ5LCAweDBBQzIsCisgICAgMHg3MkRCLCAweDA4MEYsIDB4NzJFMCwgMHgxNUZDLCAweDcyRTEsIDB4MTVGRCwgMHg3MkUyLCAweDE1RkIsIDB4NzJFNSwKKyAgICAweDRDNEMsIDB4NzJFOSwgMHgwOTE5LCAweDcyRUMsIDB4MENBMCwgMHg3MkVELCAweDA2QjEsIDB4NzJGMywgMHg0NjhGLAorICAgIDB4NzJGNCwgMHg0QzRELCAweDcyRjcsIDB4MTVGRiwgMHg3MkY4LCAweDBCNkEsIDB4NzJGOSwgMHgxNUZFLCAweDcyRkEsCisgICAgMHg0NjkwLCAweDcyRkIsIDB4MzlCRiwgMHg3MkZDLCAweDBGREIsIDB4NzJGRCwgMHgwRDE4LCAweDczMDIsIDB4NEM0RSwKKyAgICAweDczMDQsIDB4MzlDMCwgMHg3MzA1LCAweDM5QzEsIDB4NzMwNywgMHg0NjkxLCAweDczMEEsIDB4MTYwMiwgMHg3MzBCLAorICAgIDB4NEM0RiwgMHg3MzEyLCAweDQ2OTIsIDB4NzMxNiwgMHgxNjA0LCAweDczMTcsIDB4MTYwMSwgMHg3MzE4LCAweDQ2OTMsCisgICAgMHg3MzE5LCAweDQ2OTQsIDB4NzMxQiwgMHgwRUUwLCAweDczMUMsIDB4MTYwMywgMHg3MzFELCAweDE2MDUsIDB4NzMxRSwKKyAgICAweDRDNTAsIDB4NzMxRiwgMHgwRjhDLCAweDczMjIsIDB4NEM1MSwgMHg3MzI0LCAweDIxNjMsIDB4NzMyNSwgMHgxNjA5LAorICAgIDB4NzMyNywgMHg0MjRCLCAweDczMjgsIDB4MzlDMiwgMHg3MzI5LCAweDE2MDgsIDB4NzMyQSwgMHgwQkI0LCAweDczMkIsCisgICAgMHgwQ0UzLCAweDczMkMsIDB4NDY5NywgMHg3MzJFLCAweDA3NTksIDB4NzMyRiwgMHgxNjA3LCAweDczMzEsIDB4MzlDMywKKyAgICAweDczMzMsIDB4NDY5OCwgMHg3MzM0LCAweDE2MDYsIDB4NzMzNiwgMHgwRjFCLCAweDczMzcsIDB4MEYxQywgMHg3MzM5LAorICAgIDB4NDY5NiwgMHg3MzNBLCAweDRDNTIsIDB4NzMzQiwgMHg0QzUzLCAweDczM0QsIDB4NDY5OSwgMHg3MzNFLCAweDE2MEEsCisgICAgMHg3MzNGLCAweDA1MTAsIDB4NzM0MywgMHgzOUM0LCAweDczNDQsIDB4MDgwOCwgMHg3MzQ1LCAweDA4QjAsIDB4NzM0RCwKKyAgICAweDRDNTQsIDB4NzM0RSwgMHgxNjBCLCAweDczNEYsIDB4MTYwQywgMHg3MzUwLCAweDQyNEMsIDB4NzM1MiwgMHg0NjlBLAorICAgIDB4NzM1NywgMHgxNjBFLCAweDczNTgsIDB4NEM1NSwgMHg3MzYzLCAweDA5NEQsIDB4NzM2NiwgMHg0MjRELCAweDczNjcsCisgICAgMHg0QzU2LCAweDczNjgsIDB4MTYxMCwgMHg3MzZBLCAweDE2MEYsIDB4NzM2QiwgMHg0NjlDLCAweDczNkMsIDB4MzlDNSwKKyAgICAweDczNkUsIDB4NDY5RSwgMHg3MzZGLCAweDQ2OUYsIDB4NzM3MCwgMHgxNjExLCAweDczNzEsIDB4NDZBMCwgMHg3MzcyLAorICAgIDB4MDVBQiwgMHg3Mzc1LCAweDE2MTMsIDB4NzM3NywgMHgyMTY1LCAweDczNzgsIDB4MTYxMiwgMHg3MzdBLCAweDE2MTUsCisgICAgMHg3MzdCLCAweDE2MTQsIDB4NzM3QywgMHgzOUM2LCAweDczODEsIDB4NDZBMSwgMHg3MzgzLCAweDM5QzcsIDB4NzM4NCwKKyAgICAweDA3NzAsIDB4NzM4NSwgMHgzOUM4LCAweDczODYsIDB4MzlDOSwgMHg3Mzg3LCAweDBGNzAsIDB4NzM4OSwgMHgwNkM0LAorICAgIDB4NzM4QSwgMHg0NkEyLCAweDczOEIsIDB4MDUyNiwgMHg3Mzk0LCAweDQ2QTMsIDB4NzM5NSwgMHgzOUNBLCAweDczOTYsCisgICAgMHgwNkUyLCAweDczOTgsIDB4NDZBNCwgMHg3MzlDLCAweDQ2QTUsIDB4NzM5RSwgMHgzOUNCLCAweDczOUYsIDB4MzlDQywKKyAgICAweDczQTAsIDB4MzlDRCwgMHg3M0EyLCAweDQyNEUsIDB4NzNBNSwgMHg0NkE2LCAweDczQTYsIDB4MzlDRSwgMHg3M0E4LAorICAgIDB4M0MzRiwgMHg3M0E5LCAweDA2MUQsIDB4NzNBQiwgMHgzOUNGLCAweDczQjIsIDB4MEZCMCwgMHg3M0IzLCAweDE2MTcsCisgICAgMHg3M0I1LCAweDM5RDAsIDB4NzNCNywgMHgzOUQxLCAweDczQjksIDB4NDZBNywgMHg3M0JBLCAweDM1RUEsIDB4NzNCQiwKKyAgICAweDE2MTksIDB4NzNCQywgMHgzOUQyLCAweDczQkQsIDB4MjE2NiwgMHg3M0JGLCAweDQ2QTgsIDB4NzNDMCwgMHgxNjFBLAorICAgIDB4NzNDMiwgMHgwNTUxLCAweDczQzUsIDB4NDZBOSwgMHg3M0M4LCAweDE2MTYsIDB4NzNDOSwgMHgyMTY3LCAweDczQ0EsCisgICAgMHgwODg3LCAweDczQ0IsIDB4NDZBQSwgMHg3M0NELCAweDBCREQsIDB4NzNDRSwgMHgxNjE4LCAweDczQ0YsIDB4MzlEMywKKyAgICAweDczRDIsIDB4MjE2QSwgMHg3M0Q2LCAweDIxNjgsIDB4NzNEOSwgMHgzOUQ0LCAweDczREUsIDB4MTYxRCwgMHg3M0UwLAorICAgIDB4MDkxQSwgMHg3M0UxLCAweDQ2QUIsIDB4NzNFMywgMHgyMTY5LCAweDczRTQsIDB4M0MzOSwgMHg3M0U1LCAweDE2MUIsCisgICAgMHg3M0U3LCAweDQ2QUMsIDB4NzNFOSwgMHgzOUQ1LCAweDczRUEsIDB4MDcxNCwgMHg3M0VELCAweDBENUQsIDB4NzNFRSwKKyAgICAweDE2MUMsIDB4NzNGMSwgMHgxNjM3LCAweDczRjQsIDB4MzlENiwgMHg3M0Y1LCAweDIxNkMsIDB4NzNGOCwgMHgxNjIyLAorICAgIDB4NzNGOSwgMHg0NkFELCAweDczRkEsIDB4NDZBRiwgMHg3M0ZELCAweDM5RDcsIDB4NzNGRSwgMHgwNzcxLCAweDc0MDEsCisgICAgMHg0NkIwLCAweDc0MDMsIDB4MDY3RiwgMHg3NDA0LCAweDM5RDgsIDB4NzQwNSwgMHgxNjFGLCAweDc0MDYsIDB4MEY2NywKKyAgICAweDc0MDcsIDB4MjE2QiwgMHg3NDA5LCAweDBGNzgsIDB4NzQwQSwgMHgzOUQ5LCAweDc0MTMsIDB4NDZBRSwgMHg3NDFBLAorICAgIDB4MzlEQSwgMHg3NDFCLCAweDM5REIsIDB4NzQyMSwgMHgzQzNBLCAweDc0MjIsIDB4MEI1NiwgMHg3NDI0LCAweDM5REMsCisgICAgMHg3NDI1LCAweDE2MjEsIDB4NzQyNiwgMHgyMTZELCAweDc0MjgsIDB4MzlERCwgMHg3NDI5LCAweDIxNkYsIDB4NzQyQSwKKyAgICAweDIxNkUsIDB4NzQyQiwgMHg0MjRGLCAweDc0MkMsIDB4MzlERSwgMHg3NDJFLCAweDIxNzAsIDB4NzQyRiwgMHgzOURGLAorICAgIDB4NzQzMCwgMHgzOUUwLCAweDc0MzEsIDB4MzlFMSwgMHg3NDMyLCAweDE2MjMsIDB4NzQzMywgMHgwRjlFLCAweDc0MzQsCisgICAgMHgwNkNGLCAweDc0MzUsIDB4MEQ5MCwgMHg3NDM2LCAweDBEMDAsIDB4NzQzOSwgMHgzOUUyLCAweDc0M0EsIDB4MTYyNCwKKyAgICAweDc0M0YsIDB4MTYyNiwgMHg3NDQwLCAweDQ2QjIsIDB4NzQ0MSwgMHgxNjI5LCAweDc0NDMsIDB4NDZCMywgMHg3NDQ0LAorICAgIDB4MzlFMywgMHg3NDQ2LCAweDQyNTAsIDB4NzQ0NywgMHgzOUU0LCAweDc0NEIsIDB4MzlFNSwgMHg3NDRELCAweDM5RTYsCisgICAgMHg3NDUxLCAweDM5RTcsIDB4NzQ1MiwgMHg0NkI0LCAweDc0NTMsIDB4NDZCMSwgMHg3NDU1LCAweDE2MjUsIDB4NzQ1NywKKyAgICAweDM5RTgsIDB4NzQ1OSwgMHgxNjI4LCAweDc0NUEsIDB4MDc5RSwgMHg3NDVCLCAweDA0RUYsIDB4NzQ1QywgMHgxNjJBLAorICAgIDB4NzQ1RCwgMHg0NkI1LCAweDc0NUUsIDB4MEEzNiwgMHg3NDVGLCAweDE2MjcsIDB4NzQ2MCwgMHgwRkE0LCAweDc0NjIsCisgICAgMHg0MjUxLCAweDc0NjMsIDB4MTYyRCwgMHg3NDY0LCAweDFEMzUsIDB4NzQ2NiwgMHgzOUU5LCAweDc0NjksIDB4MTYyQiwKKyAgICAweDc0NkEsIDB4MTYyRSwgMHg3NDZCLCAweDM5RUEsIDB4NzQ2RCwgMHg0MjUyLCAweDc0NkYsIDB4MTYyMCwgMHg3NDcwLAorICAgIDB4MTYyQywgMHg3NDcxLCAweDM5RUIsIDB4NzQ3MiwgMHg0QzU3LCAweDc0NzMsIDB4MDgyQywgMHg3NDc2LCAweDE2MkYsCisgICAgMHg3NDdFLCAweDE2MzAsIDB4NzQ4MCwgMHgzOUVDLCAweDc0ODEsIDB4NDZCNiwgMHg3NDgzLCAweDBGNjgsIDB4NzQ4NSwKKyAgICAweDM5RUQsIDB4NzQ4NiwgMHgzOUVFLCAweDc0ODcsIDB4MzlFRiwgMHg3NDg4LCAweDQ2QjcsIDB4NzQ4OSwgMHgyMTcyLAorICAgIDB4NzQ4QiwgMHgxNjMxLCAweDc0OTAsIDB4MzlGMCwgMHg3NDkyLCAweDQ2QjksIDB4NzQ5NywgMHg0NkJBLCAweDc0OTgsCisgICAgMHgzOUYxLCAweDc0OTksIDB4NDZCQiwgMHg3NDlDLCAweDM5RjIsIDB4NzQ5RSwgMHgxNjMyLCAweDc0OUYsIDB4MjE3MywKKyAgICAweDc0QTAsIDB4MzlGMywgMHg3NEExLCAweDQ2QkMsIDB4NzRBMiwgMHgxNjFFLCAweDc0QTMsIDB4MzlGNCwgMHg3NEE1LAorICAgIDB4NDZCRCwgMHg3NEE2LCAweDQyNTMsIDB4NzRBNywgMHgxNjMzLCAweDc0QTgsIDB4MzlGNSwgMHg3NEE5LCAweDQyNTQsCisgICAgMHg3NEFBLCAweDQ2QkUsIDB4NzRBQiwgMHgzOUY2LCAweDc0QUYsIDB4NEM1OCwgMHg3NEIwLCAweDA2MDAsIDB4NzRCNSwKKyAgICAweDM5RjcsIDB4NzRCOSwgMHg0NkJGLCAweDc0QkEsIDB4NDZDMSwgMHg3NEJCLCAweDQ2QzAsIDB4NzRCRCwgMHgwOEQxLAorICAgIDB4NzRCRiwgMHgzOUY4LCAweDc0QzgsIDB4MzlGOSwgMHg3NEM5LCAweDQyNTUsIDB4NzRDQSwgMHgxNjM0LCAweDc0Q0YsCisgICAgMHgxNjM1LCAweDc0RDQsIDB4MTYzNiwgMHg3NEQ2LCAweDQ2QzIsIDB4NzREOCwgMHg0NkMzLCAweDc0REEsIDB4MzlGQSwKKyAgICAweDc0REMsIDB4MDRERCwgMHg3NERFLCAweDM5RkIsIDB4NzRERiwgMHg0QzU5LCAweDc0RTAsIDB4MTYzOCwgMHg3NEUyLAorICAgIDB4MERBRCwgMHg3NEUzLCAweDE2MzksIDB4NzRFNCwgMHg0QzVBLCAweDc0RTYsIDB4MDVFMCwgMHg3NEU3LCAweDE2M0EsCisgICAgMHg3NEU5LCAweDE2M0IsIDB4NzRFQiwgMHg0NkM0LCAweDc0RUUsIDB4MTYzQywgMHg3NEVGLCAweDM3NTAsIDB4NzRGMCwKKyAgICAweDE2M0UsIDB4NzRGMSwgMHgxNjNGLCAweDc0RjIsIDB4MTYzRCwgMHg3NEY0LCAweDRDNUIsIDB4NzRGNiwgMHgwREM1LAorICAgIDB4NzRGNywgMHgxNjQxLCAweDc0RjgsIDB4MTY0MCwgMHg3NEZBLCAweDQ2QzYsIDB4NzRGQiwgMHg0QzVDLCAweDc0RkYsCisgICAgMHg0MjU2LCAweDc1MDEsIDB4MjE3NCwgMHg3NTAzLCAweDE2NDMsIDB4NzUwNCwgMHgxNjQyLCAweDc1MDUsIDB4MTY0NCwKKyAgICAweDc1MEMsIDB4MTY0NSwgMHg3NTBELCAweDE2NDcsIDB4NzUwRSwgMHgxNjQ2LCAweDc1MTEsIDB4MDgwQiwgMHg3NTEzLAorICAgIDB4MTY0OSwgMHg3NTE1LCAweDE2NDgsIDB4NzUxNiwgMHg0QzVELCAweDc1MTcsIDB4NDI1NywgMHg3NTE4LCAweDA2MDEsCisgICAgMHg3NTFBLCAweDBBMTksIDB4NzUxQywgMHgwQzM2LCAweDc1MUUsIDB4MTY0QSwgMHg3NTFGLCAweDBBNUMsIDB4NzUyMCwKKyAgICAweDQ2QzgsIDB4NzUyMSwgMHg0QzVFLCAweDc1MjIsIDB4MzVERSwgMHg3NTIzLCAweDA4ODgsIDB4NzUyNCwgMHg0NkM5LAorICAgIDB4NzUyNSwgMHgwNTFCLCAweDc1MjYsIDB4MTY0QiwgMHg3NTI4LCAweDBGM0IsIDB4NzUyQSwgMHg0NkNBLCAweDc1MkIsCisgICAgMHgwRTMzLCAweDc1MkMsIDB4MTY0QywgMHg3NTJGLCAweDIwRjIsIDB4NzUzMCwgMHgwQzNFLCAweDc1MzEsIDB4MEYxRCwKKyAgICAweDc1MzIsIDB4MDdENSwgMHg3NTMzLCAweDBBMDMsIDB4NzUzNywgMHgwQjg5LCAweDc1MzgsIDB4MTBDOSwgMHg3NTNBLAorICAgIDB4MEJDQSwgMHg3NTNCLCAweDA1NjgsIDB4NzUzQywgMHgxNjRELCAweDc1M0QsIDB4NDZDRCwgMHg3NTNFLCAweDQ2Q0UsCisgICAgMHg3NTNGLCAweDRDNUYsIDB4NzU0MCwgMHg0NkNGLCAweDc1NDQsIDB4MTY0RSwgMHg3NTQ2LCAweDE2NTMsIDB4NzU0OCwKKyAgICAweDQ2RDAsIDB4NzU0OSwgMHgxNjUxLCAweDc1NEEsIDB4MTY1MCwgMHg3NTRCLCAweDEzQzcsIDB4NzU0QywgMHgwNTg0LAorICAgIDB4NzU0RCwgMHgxNjRGLCAweDc1NEUsIDB4MzlGQywgMHg3NTRGLCAweDA0OUUsIDB4NzU1MCwgMHg0NkQxLCAweDc1NTEsCisgICAgMHgwRDNFLCAweDc1NTIsIDB4NDZEMiwgMHg3NTU0LCAweDBENUUsIDB4NzU1OSwgMHgwRjc5LCAweDc1NUEsIDB4MTY1NCwKKyAgICAweDc1NUIsIDB4MTY1MiwgMHg3NTVDLCAweDBCOUEsIDB4NzU1RCwgMHgwQTRBLCAweDc1NUUsIDB4NEM2MCwgMHg3NTYwLAorICAgIDB4MEQzRiwgMHg3NTYyLCAweDBEOUYsIDB4NzU2NCwgMHgxNjU2LCAweDc1NjUsIDB4MEY3NCwgMHg3NTY2LCAweDA3MjMsCisgICAgMHg3NTY3LCAweDE2NTcsIDB4NzU2OSwgMHgxNjU1LCAweDc1NkEsIDB4MEQ2QSwgMHg3NTZCLCAweDE2NTgsIDB4NzU2QywKKyAgICAweDNDM0IsIDB4NzU2RCwgMHgxNjU5LCAweDc1NkYsIDB4MjE3NSwgMHg3NTcwLCAweDA0OUYsIDB4NzU3MSwgMHg0NkQ0LAorICAgIDB4NzU3MiwgMHg0NkQzLCAweDc1NzMsIDB4MDlERSwgMHg3NTc0LCAweDE2NUUsIDB4NzU3NSwgMHgzNzUxLCAweDc1NzYsCisgICAgMHgxNjVCLCAweDc1NzcsIDB4MENDNSwgMHg3NTc4LCAweDE2NUEsIDB4NzU3OSwgMHgzOUZELCAweDc1N0EsIDB4NDZENSwKKyAgICAweDc1N0QsIDB4NDZENiwgMHg3NTdFLCAweDQ2RDcsIDB4NzU3RiwgMHgwNjQwLCAweDc1ODEsIDB4MzlGRSwgMHg3NTgyLAorICAgIDB4MTY2MSwgMHg3NTg2LCAweDE2NUMsIDB4NzU4NywgMHgxNjVELCAweDc1ODksIDB4MTY2MCwgMHg3NThBLCAweDE2NUYsCisgICAgMHg3NThCLCAweDBEOTcsIDB4NzU4QywgMHg0NkQ4LCAweDc1OEUsIDB4MEFDNCwgMHg3NThGLCAweDBBQzMsIDB4NzU5MCwKKyAgICAweDM5RkYsIDB4NzU5MSwgMHgwNjU5LCAweDc1OTIsIDB4M0EwMCwgMHg3NTkzLCAweDNBMDEsIDB4NzU5NCwgMHgxNjYyLAorICAgIDB4NzU5OSwgMHg0QzYxLCAweDc1OUEsIDB4MTY2MywgMHg3NTlELCAweDE2NjQsIDB4NzVBMiwgMHg0NkRBLCAweDc1QTMsCisgICAgMHgxNjY2LCAweDc1QTQsIDB4NEM2MiwgMHg3NUE1LCAweDE2NjUsIDB4NzVBQiwgMHgwNEY4LCAweDc1QjAsIDB4NDZEQywKKyAgICAweDc1QjEsIDB4MTY2RSwgMHg3NUIyLCAweDBEN0MsIDB4NzVCMywgMHgxNjY4LCAweDc1QjQsIDB4M0EwMiwgMHg3NUI1LAorICAgIDB4MTY2QSwgMHg3NUI3LCAweDQ2REQsIDB4NzVCOCwgMHgxNjZDLCAweDc1QjksIDB4MEEwNCwgMHg3NUJDLCAweDE2NkQsCisgICAgMHg3NUJELCAweDE2NkIsIDB4NzVCRSwgMHgwOEVDLCAweDc1QkYsIDB4NDZERSwgMHg3NUMwLCAweDQ2REYsIDB4NzVDMSwKKyAgICAweDRDNjMsIDB4NzVDMiwgMHgxNjY3LCAweDc1QzMsIDB4MTY2OSwgMHg3NUM0LCAweDRDNjQsIDB4NzVDNSwgMHgwREI0LAorICAgIDB4NzVDNiwgMHg0NkUwLCAweDc1QzcsIDB4MDlCMSwgMHg3NUNBLCAweDE2NzAsIDB4NzVDQywgMHg0QzY1LCAweDc1Q0QsCisgICAgMHgxNjZGLCAweDc1Q0UsIDB4NDI1OSwgMHg3NUNGLCAweDQ2RTEsIDB4NzVEMiwgMHgxNjcxLCAweDc1RDMsIDB4NDZFMiwKKyAgICAweDc1RDQsIDB4MDhEMiwgMHg3NUQ1LCAweDA4MUYsIDB4NzVENywgMHg0QzY2LCAweDc1RDgsIDB4MEM3MSwgMHg3NUQ5LAorICAgIDB4MTY3MiwgMHg3NURCLCAweDBCRTcsIDB4NzVEQywgMHg0QzY3LCAweDc1REQsIDB4NDZFMywgMHg3NURFLCAweDE2NzQsCisgICAgMHg3NURGLCAweDQ2RTQsIDB4NzVFMCwgMHg0NkU1LCAweDc1RTEsIDB4NEM2OCwgMHg3NUUyLCAweDBGNjksIDB4NzVFMywKKyAgICAweDE2NzMsIDB4NzVFNCwgMHgzQTAzLCAweDc1RTcsIDB4NDZFNiwgMHg3NUU5LCAweDBBRUIsIDB4NzVFQywgMHgzNzUyLAorICAgIDB4NzVFRSwgMHg0NkU3LCAweDc1RUYsIDB4NEM2OSwgMHg3NUYwLCAweDE2NzksIDB4NzVGMSwgMHg0NkU4LCAweDc1RjIsCisgICAgMHgxNjdCLCAweDc1RjMsIDB4MTY3QywgMHg3NUY0LCAweDBCOTIsIDB4NzVGOSwgMHgzQTA0LCAweDc1RkEsIDB4MTY3QSwKKyAgICAweDc1RkMsIDB4MTY3NywgMHg3NUZFLCAweDE2NzUsIDB4NzVGRiwgMHgxNjc2LCAweDc2MDAsIDB4M0EwNSwgMHg3NjAxLAorICAgIDB4MTY3OCwgMHg3NjAyLCAweDQyNUEsIDB4NzYwMywgMHg0NkU5LCAweDc2MDQsIDB4NEM2QSwgMHg3NjA3LCAweDQ2RUIsCisgICAgMHg3NjA4LCAweDQyNUIsIDB4NzYwOSwgMHgxNjdGLCAweDc2MEEsIDB4M0EwNiwgMHg3NjBCLCAweDE2N0QsIDB4NzYwQywKKyAgICAweDRDNkIsIDB4NzYwRCwgMHgxNjdFLCAweDc2MEYsIDB4NDZFQywgMHg3NjEzLCAweDQ2RUYsIDB4NzYxNSwgMHgzQTA3LAorICAgIDB4NzYxNiwgMHgzQTA4LCAweDc2MTgsIDB4NDZFQSwgMHg3NjE5LCAweDNBMDksIDB4NzYxQiwgMHg0NkYwLCAweDc2MUMsCisgICAgMHg0NkYxLCAweDc2MUQsIDB4NEM2QywgMHg3NjFFLCAweDNBMEEsIDB4NzYxRiwgMHgxNjgwLCAweDc2MjAsIDB4MTY4MiwKKyAgICAweDc2MjEsIDB4MTY4MywgMHg3NjIyLCAweDE2ODQsIDB4NzYyNCwgMHgxNjg1LCAweDc2MjUsIDB4NDZGMywgMHg3NjI2LAorICAgIDB4MzY0NSwgMHg3NjI3LCAweDE2ODEsIDB4NzYyOCwgMHg0NkY0LCAweDc2MkQsIDB4M0EwQiwgMHg3NjMwLCAweDE2ODcsCisgICAgMHg3NjMyLCAweDRDNkQsIDB4NzYzMywgMHg0NkY2LCAweDc2MzQsIDB4MTY4NiwgMHg3NjM1LCAweDNBMEMsIDB4NzYzOCwKKyAgICAweDRDNkUsIDB4NzYzQiwgMHgxNjg4LCAweDc2M0MsIDB4NDZGNSwgMHg3NjQxLCAweDQ2RjksIDB4NzY0MiwgMHgwRjhELAorICAgIDB4NzY0MywgMHgzQTBELCAweDc2NDUsIDB4NEM2RiwgMHg3NjQ2LCAweDE2OEIsIDB4NzY0NywgMHgxNjg5LCAweDc2NDgsCisgICAgMHgxNjhBLCAweDc2NDksIDB4NDZGQiwgMHg3NjRBLCAweDRDNzAsIDB4NzY0QiwgMHgzQTBFLCAweDc2NEMsIDB4MDYxRSwKKyAgICAweDc2NEUsIDB4Mzc1MywgMHg3NjUyLCAweDBGMEEsIDB4NzY1NSwgMHg0NkZDLCAweDc2NTYsIDB4MEUxQSwgMHg3NjU4LAorICAgIDB4MTY4RCwgMHg3NjVDLCAweDE2OEMsIDB4NzY1RiwgMHg0QzcxLCAweDc2NjEsIDB4MTY4RSwgMHg3NjYyLCAweDE2OEYsCisgICAgMHg3NjY0LCAweDQyNUMsIDB4NzY2NSwgMHgzQTBGLCAweDc2NjcsIDB4MTY5MywgMHg3NjY4LCAweDE2OTAsIDB4NzY2OSwKKyAgICAweDE2OTEsIDB4NzY2QSwgMHgxNjkyLCAweDc2NkMsIDB4MTY5NCwgMHg3NjZELCAweDNBMTAsIDB4NzY2RSwgMHg0NkZFLAorICAgIDB4NzY2RiwgMHgzQTExLCAweDc2NzAsIDB4MTY5NSwgMHg3NjcxLCAweDNBMTIsIDB4NzY3MiwgMHgxNjk2LCAweDc2NzQsCisgICAgMHgzQTEzLCAweDc2NzYsIDB4MTY5NywgMHg3Njc4LCAweDE2OTgsIDB4NzY3QSwgMHgwRDQzLCAweDc2N0IsIDB4MEM0QSwKKyAgICAweDc2N0MsIDB4MTY5OSwgMHg3NjdELCAweDBEMjgsIDB4NzY3RSwgMHgwREE2LCAweDc2ODAsIDB4MTY5QSwgMHg3NjgxLAorICAgIDB4NDI1RCwgMHg3NjgyLCAweDIxNzYsIDB4NzY4MywgMHgxNjlCLCAweDc2ODQsIDB4MEMyNCwgMHg3Njg2LCAweDA1ODUsCisgICAgMHg3Njg3LCAweDA3RDYsIDB4NzY4OCwgMHgxNjlDLCAweDc2OEIsIDB4MTY5RCwgMHg3NjhFLCAweDE2OUUsIDB4NzY5MCwKKyAgICAweDA4NzcsIDB4NzY5MywgMHgxNkEwLCAweDc2OTUsIDB4NDZGRiwgMHg3Njk2LCAweDE2OUYsIDB4NzY5OSwgMHgxNkExLAorICAgIDB4NzY5QSwgMHgxNkEyLCAweDc2OUIsIDB4MjE3OSwgMHg3NjlDLCAweDIxNzcsIDB4NzY5RCwgMHg0MjVFLCAweDc2OUUsCisgICAgMHgyMTc4LCAweDc2QTAsIDB4NDcwMSwgMHg3NkExLCAweDQ3MDAsIDB4NzZBNCwgMHgzQTE0LCAweDc2QTUsIDB4M0ExNSwKKyAgICAweDc2QTYsIDB4MjE3QSwgMHg3NkE3LCAweDQ3MDIsIDB4NzZBOCwgMHg0NzAzLCAweDc2QUEsIDB4NDI1RiwgMHg3NkFELAorICAgIDB4NEM3MiwgMHg3NkFFLCAweDBEN0QsIDB4NzZBRiwgMHg0NzA0LCAweDc2QjAsIDB4MTZBMywgMHg3NkI0LCAweDE2QTQsCisgICAgMHg3NkI2LCAweDQyNjAsIDB4NzZCNywgMHgxRDFDLCAweDc2QjgsIDB4MTZBNSwgMHg3NkI5LCAweDE2QTYsIDB4NzZCQSwKKyAgICAweDE2QTcsIDB4NzZCRCwgMHg0QzczLCAweDc2QkYsIDB4MDg3QywgMHg3NkMyLCAweDE2QTgsIDB4NzZDMywgMHgwRDBDLAorICAgIDB4NzZDNSwgMHgzQTE2LCAweDc2QzYsIDB4MEU4RCwgMHg3NkM4LCAweDA0RjAsIDB4NzZDOSwgMHg0NzA2LCAweDc2Q0EsCisgICAgMHgwNEY5LCAweDc2Q0MsIDB4M0ExNywgMHg3NkNELCAweDE2QTksIDB4NzZDRSwgMHg0MjYxLCAweDc2RDIsIDB4MTZBQiwKKyAgICAweDc2RDQsIDB4NDI2MiwgMHg3NkQ2LCAweDE2QUEsIDB4NzZENywgMHgwQzZBLCAweDc2RDksIDB4NEM3NCwgMHg3NkRCLAorICAgIDB4MEE1RCwgMHg3NkRDLCAweDE0RDgsIDB4NzZERSwgMHgxNkFDLCAweDc2REYsIDB4MEVDRCwgMHg3NkUxLCAweDE2QUQsCisgICAgMHg3NkUzLCAweDA2MDIsIDB4NzZFNCwgMHgwRDZCLCAweDc2RTUsIDB4MTZBRSwgMHg3NkU2LCAweDQyNjMsIDB4NzZFNywKKyAgICAweDE2QUYsIDB4NzZFOCwgMHg0NzA4LCAweDc2RUEsIDB4MTZCMCwgMHg3NkVCLCAweDRDNzUsIDB4NzZFQywgMHgzQTE4LAorICAgIDB4NzZFRSwgMHgwRUU4LCAweDc2RjAsIDB4NEM3NiwgMHg3NkYxLCAweDQyNjQsIDB4NzZGMiwgMHgwRUUxLCAweDc2RjQsCisgICAgMHgwQkRBLCAweDc2RjgsIDB4MEFFQywgMHg3NkY5LCAweDRDNzcsIDB4NzZGQiwgMHgxNkIyLCAweDc2RkMsIDB4M0ExOSwKKyAgICAweDc2RkUsIDB4MDk2QywgMHg3NzAwLCAweDRDNzgsIDB4NzcwMSwgMHgwOUIyLCAweDc3MDQsIDB4MTZCNSwgMHg3NzA3LAorICAgIDB4MTZCNCwgMHg3NzA4LCAweDE2QjMsIDB4NzcwOSwgMHgwRDkxLCAweDc3MEEsIDB4NDI2NSwgMHg3NzBCLCAweDA2MDMsCisgICAgMHg3NzBDLCAweDA3NUQsIDB4NzcwRSwgMHg0Qzc5LCAweDc3MTcsIDB4NDcwQSwgMHg3NzE5LCAweDQyNjYsIDB4NzcxQSwKKyAgICAweDQ3MEIsIDB4NzcxQiwgMHgxNkJCLCAweDc3MUUsIDB4MTZCOCwgMHg3NzFGLCAweDBBMDUsIDB4NzcyMCwgMHgwRUJFLAorICAgIDB4NzcyMiwgMHg0QzdBLCAweDc3MjQsIDB4MTZCNywgMHg3NzI1LCAweDE2QjksIDB4NzcyNiwgMHgxNkJBLCAweDc3MjgsCisgICAgMHg0QzdCLCAweDc3MjksIDB4MTZCNiwgMHg3NzJELCAweDQ3MEMsIDB4NzcyRiwgMHg0QzdDLCAweDc3MzQsIDB4M0ExQSwKKyAgICAweDc3MzUsIDB4NDcwRCwgMHg3NzM2LCAweDNBMUIsIDB4NzczNywgMHgxNkJDLCAweDc3MzgsIDB4MTZCRCwgMHg3NzM5LAorICAgIDB4NEM3RCwgMHg3NzNBLCAweDBCQ0IsIDB4NzczQywgMHgwNjFGLCAweDc3M0UsIDB4NEM3RSwgMHg3NzQwLCAweDBCQTMsCisgICAgMHg3NzQ1LCAweDRDN0YsIDB4Nzc0NiwgMHgyMTdDLCAweDc3NDcsIDB4MTZCRSwgMHg3NzRBLCAweDRDODAsIDB4Nzc0RCwKKyAgICAweDQyNjcsIDB4Nzc0RSwgMHg0MjY4LCAweDc3NEYsIDB4NEM4MSwgMHg3NzU4LCAweDQ3MTIsIDB4Nzc1QSwgMHgxNkJGLAorICAgIDB4Nzc1QiwgMHgxNkMyLCAweDc3NUMsIDB4M0ExQywgMHg3NzVFLCAweDRDODIsIDB4Nzc1RiwgMHgzQTFELCAweDc3NjAsCisgICAgMHgzQTFFLCAweDc3NjEsIDB4MEEyRCwgMHg3NzYyLCAweDFFQzUsIDB4Nzc2MywgMHgwQzlDLCAweDc3NjQsIDB4NEM4MywKKyAgICAweDc3NjUsIDB4MTZDMywgMHg3NzY2LCAweDBFODEsIDB4Nzc2NywgMHg0Qzg0LCAweDc3NjgsIDB4MTZDMCwgMHg3NzZBLAorICAgIDB4Mzc1NSwgMHg3NzZCLCAweDE2QzEsIDB4Nzc2QywgMHg0Qzg1LCAweDc3NzIsIDB4M0ExRiwgMHg3Nzc5LCAweDE2QzYsCisgICAgMHg3NzdBLCAweDQyNjksIDB4Nzc3QywgMHg0NzE0LCAweDc3N0QsIDB4M0EyMCwgMHg3NzdFLCAweDE2QzUsIDB4Nzc3RiwKKyAgICAweDE2QzQsIDB4Nzc4MCwgMHg0MjZBLCAweDc3ODQsIDB4NEM4NiwgMHg3NzhCLCAweDE2QzgsIDB4Nzc4QywgMHg0Qzg3LAorICAgIDB4Nzc4RCwgMHg0Qzg4LCAweDc3OEUsIDB4MTZDNywgMHg3NzkxLCAweDE2QzksIDB4Nzc5NCwgMHg0MjZCLCAweDc3OTUsCisgICAgMHgzQTIxLCAweDc3OTYsIDB4NEM4OSwgMHg3NzlBLCAweDQ3MTcsIDB4Nzc5RSwgMHgxNkNCLCAweDc3OUYsIDB4NDcxOCwKKyAgICAweDc3QTAsIDB4MTZDQSwgMHg3N0EyLCAweDQ3MTksIDB4NzdBNCwgMHg0NzFBLCAweDc3QTUsIDB4MEUxRCwgMHg3N0E3LAorICAgIDB4NEM4QSwgMHg3N0E5LCAweDM3NTYsIDB4NzdBQSwgMHgzQTIyLCAweDc3QUMsIDB4MDk2MCwgMHg3N0FELCAweDBGOEUsCisgICAgMHg3N0FGLCAweDRDOEIsIDB4NzdCMCwgMHgxNkNDLCAweDc3QjMsIDB4MEM4RiwgMHg3N0I2LCAweDE2Q0QsIDB4NzdCNywKKyAgICAweDRDOEMsIDB4NzdCOSwgMHgxNkNFLCAweDc3QkIsIDB4MTZEMiwgMHg3N0JDLCAweDE2RDAsIDB4NzdCRCwgMHgxNkQxLAorICAgIDB4NzdCRSwgMHg0QzhELCAweDc3QkYsIDB4MTZDRiwgMHg3N0M3LCAweDE2RDMsIDB4NzdDOSwgMHg0QzhFLCAweDc3Q0QsCisgICAgMHgxNkQ0LCAweDc3RDEsIDB4NEM4RiwgMHg3N0Q3LCAweDE2RDUsIDB4NzdEOSwgMHg0QzkwLCAweDc3REEsIDB4MTZENiwKKyAgICAweDc3REIsIDB4MEVDMywgMHg3N0RDLCAweDE2RDcsIDB4NzdERSwgMHg0NzFCLCAweDc3REYsIDB4NDcxQywgMHg3N0UwLAorICAgIDB4NDI2QywgMHg3N0UyLCAweDBFRkMsIDB4NzdFMywgMHgxNkQ4LCAweDc3RTQsIDB4NDcxRCwgMHg3N0U1LCAweDBCOEMsCisgICAgMHg3N0U2LCAweDNBMjMsIDB4NzdFNywgMHgwRDIwLCAweDc3RTksIDB4MDZFMywgMHg3N0VBLCAweDQ3MUUsIDB4NzdFQywKKyAgICAweDQ3MUYsIDB4NzdFRCwgMHgwQjc5LCAweDc3RUUsIDB4MTZEOSwgMHg3N0VGLCAweDA2QjIsIDB4NzdGMCwgMHgzQTI0LAorICAgIDB4NzdGMSwgMHg0QzkxLCAweDc3RjMsIDB4MEE3NCwgMHg3N0Y0LCAweDNBMjUsIDB4NzdGQiwgMHg0NzIwLCAweDc3RkMsCisgICAgMHgxNkRBLCAweDc4MDIsIDB4MDgyRCwgMHg3ODA1LCAweDQ3MjIsIDB4NzgwNiwgMHgzQTI2LCAweDc4MDksIDB4NDcyMywKKyAgICAweDc4MEMsIDB4MTZEQiwgMHg3ODBELCAweDQ3MjQsIDB4NzgxMiwgMHgxNkRDLCAweDc4MTQsIDB4MDc1QSwgMHg3ODE1LAorICAgIDB4MDg0NSwgMHg3ODE5LCAweDQ3MjUsIDB4NzgyMCwgMHgxNkRFLCAweDc4MjEsIDB4MjE3RSwgMHg3ODIyLCAweDNBMjcsCisgICAgMHg3ODI1LCAweDBDNTAsIDB4NzgyNiwgMHgwODQ2LCAweDc4MjcsIDB4MDY2OCwgMHg3ODJDLCAweDQ3MjYsIDB4NzgyRCwKKyAgICAweDNBMjgsIDB4NzgyRSwgMHgzQTI5LCAweDc4MzAsIDB4M0EyQSwgMHg3ODMyLCAweDBFNTIsIDB4NzgzNCwgMHgwRDAxLAorICAgIDB4NzgzNSwgMHgzQTJCLCAweDc4MzcsIDB4NEM5MiwgMHg3ODNBLCAweDBDNTEsIDB4NzgzRiwgMHgwN0VFLCAweDc4NDMsCisgICAgMHg0MjZFLCAweDc4NDUsIDB4MTZFMCwgMHg3ODQ3LCAweDQ3MjcsIDB4Nzg0RSwgMHgyMTdGLCAweDc4NEYsIDB4MzQxRSwKKyAgICAweDc4NTEsIDB4M0MzQywgMHg3ODVDLCAweDRDOTMsIDB4Nzg1RCwgMHgwOUIzLCAweDc4NjQsIDB4MjE4MCwgMHg3ODY4LAorICAgIDB4M0EyQywgMHg3ODZBLCAweDQ3MjgsIDB4Nzg2QiwgMHgwRjdBLCAweDc4NkMsIDB4MDdENywgMHg3ODZFLCAweDQyNkYsCisgICAgMHg3ODZGLCAweDA3NUIsIDB4Nzg3MiwgMHgwRDM3LCAweDc4NzQsIDB4MTZFMiwgMHg3ODdBLCAweDIxODEsIDB4Nzg3QywKKyAgICAweDE2RTQsIDB4Nzg3RSwgMHg0Qzk0LCAweDc4ODEsIDB4MDc5RiwgMHg3ODg2LCAweDE2RTMsIDB4Nzg4NywgMHgwQzEyLAorICAgIDB4Nzg4QSwgMHg0NzJBLCAweDc4OEMsIDB4MTZFNiwgMHg3ODhELCAweDA1OTUsIDB4Nzg4RSwgMHgxNkUxLCAweDc4OTEsCisgICAgMHgwRDdFLCAweDc4OTMsIDB4MDREMiwgMHg3ODk0LCAweDQ3MkIsIDB4Nzg5NSwgMHgwODVDLCAweDc4OTcsIDB4MEZGOCwKKyAgICAweDc4OTgsIDB4NEM5NSwgMHg3ODlBLCAweDE2RTUsIDB4Nzg5RCwgMHg0NzJELCAweDc4OUUsIDB4M0EyRCwgMHg3ODlGLAorICAgIDB4NDcyRSwgMHg3OEExLCAweDRDOTYsIDB4NzhBMywgMHgxNkU3LCAweDc4QTQsIDB4NDcyQywgMHg3OEE3LCAweDBFMUIsCisgICAgMHg3OEE5LCAweDBBN0QsIDB4NzhBQSwgMHgxNkU5LCAweDc4QUQsIDB4NDI3MiwgMHg3OEFGLCAweDE2RUEsIDB4NzhCMCwKKyAgICAweDQyNzAsIDB4NzhCMSwgMHg0Qzk3LCAweDc4QjMsIDB4NEM5OCwgMHg3OEI1LCAweDE2RTgsIDB4NzhCQSwgMHgwNUFDLAorICAgIDB4NzhCQiwgMHg0NzJGLCAweDc4QkMsIDB4MTZGMCwgMHg3OEJFLCAweDE2RUYsIDB4NzhDMSwgMHgwOEQzLCAweDc4QzUsCisgICAgMHgxNkYxLCAweDc4QzYsIDB4MTZFQywgMHg3OEM4LCAweDNBMkUsIDB4NzhDOSwgMHg0Qzk5LCAweDc4Q0EsIDB4MTZGMiwKKyAgICAweDc4Q0IsIDB4MTZFRCwgMHg3OENDLCAweDNBMkYsIDB4NzhDRSwgMHgzQTMwLCAweDc4RDAsIDB4MEQ2QywgMHg3OEQxLAorICAgIDB4MTZFQiwgMHg3OEQzLCAweDRDOUEsIDB4NzhENCwgMHgxNkVFLCAweDc4RDUsIDB4NDczMCwgMHg3OERBLCAweDE2RjUsCisgICAgMHg3OEUwLCAweDNBMzIsIDB4NzhFMSwgMHgzQTMzLCAweDc4RTQsIDB4M0EzMSwgMHg3OEU2LCAweDQ3MzEsIDB4NzhFNywKKyAgICAweDE2RjQsIDB4NzhFOCwgMHgwRThGLCAweDc4RUMsIDB4MTZGMywgMHg3OEVGLCAweDA0QUYsIDB4NzhGMiwgMHgzQTM0LAorICAgIDB4NzhGNCwgMHgxNkY3LCAweDc4RjcsIDB4M0EzNSwgMHg3OEY5LCAweDQ3MzIsIDB4NzhGQSwgMHg0NzMzLCAweDc4RkIsCisgICAgMHgzQTM2LCAweDc4RkQsIDB4MTZGNiwgMHg3OEZFLCAweDQ3MzQsIDB4NzkwMCwgMHg0MjczLCAweDc5MDEsIDB4MDlCNCwKKyAgICAweDc5MDcsIDB4MTZGOCwgMHg3OTBDLCAweDRDOUIsIDB4NzkwRSwgMHgwQUM1LCAweDc5MTAsIDB4NDczNiwgMHg3OTExLAorICAgIDB4MTZGQSwgMHg3OTEyLCAweDE2RjksIDB4NzkxOSwgMHgxNkZCLCAweDc5MUIsIDB4NDczNywgMHg3OTFDLCAweDQyNzQsCisgICAgMHg3OTFGLCAweDRDOUMsIDB4NzkyNSwgMHg0NzM4LCAweDc5MjYsIDB4MTZERCwgMHg3OTI3LCAweDRDOUQsIDB4NzkyOCwKKyAgICAweDRDOUUsIDB4NzkyQSwgMHgxNkRGLCAweDc5MkIsIDB4MTZGRCwgMHg3OTJDLCAweDE2RkMsIDB4NzkyRSwgMHg0Mjc1LAorICAgIDB4NzkzMCwgMHgyMTgyLCAweDc5MzEsIDB4M0EzNywgMHg3OTM0LCAweDQyNzYsIDB4NzkzQSwgMHgwOEQ0LCAweDc5M0IsCisgICAgMHgzQTM5LCAweDc5M0MsIDB4MEZCMSwgMHg3OTNELCAweDNBM0EsIDB4NzkzRSwgMHgwOEZFLCAweDc5M0YsIDB4NEM5RiwKKyAgICAweDc5NDAsIDB4MTZGRSwgMHg3OTQxLCAweDA3MEQsIDB4Nzk0MiwgMHg0Q0EwLCAweDc5NDUsIDB4M0EzQiwgMHg3OTQ2LAorICAgIDB4NDI3NywgMHg3OTQ3LCAweDA2NUEsIDB4Nzk0OCwgMHgwNjQxLCAweDc5NDksIDB4MDhCMSwgMHg3OTRBLCAweDQ3MzksCisgICAgMHg3OTUwLCAweDBGMUUsIDB4Nzk1MywgMHgxNzA0LCAweDc5NTQsIDB4NENBMSwgMHg3OTU1LCAweDE3MDMsIDB4Nzk1NiwKKyAgICAweDBBQzYsIDB4Nzk1NywgMHgxNzAwLCAweDc5NTgsIDB4NDczQSwgMHg3OTVBLCAweDE3MDIsIDB4Nzk1QiwgMHgzQTNDLAorICAgIDB4Nzk1QywgMHgzQTNELCAweDc5NUQsIDB4MDk1NSwgMHg3OTVFLCAweDBBMDYsIDB4Nzk1RiwgMHgxNzAxLCAweDc5NjAsCisgICAgMHgxNkZGLCAweDc5NjIsIDB4MENFMCwgMHg3OTY1LCAweDA5QjUsIDB4Nzk2NywgMHg0NzNDLCAweDc5NjgsIDB4MERBRSwKKyAgICAweDc5NkIsIDB4NENBMiwgMHg3OTZELCAweDA4NDcsIDB4Nzk3MiwgMHg0NzNELCAweDc5NzcsIDB4MEM3MiwgMHg3OTc5LAorICAgIDB4NDI3OCwgMHg3OTdBLCAweDE3MDUsIDB4Nzk3QywgMHg0Q0EzLCAweDc5N0YsIDB4MTcwNiwgMHg3OTgwLCAweDE3MUMsCisgICAgMHg3OTgxLCAweDA2RDAsIDB4Nzk4NCwgMHgwRkUzLCAweDc5ODUsIDB4MEFCNywgMHg3OThBLCAweDE3MDcsIDB4Nzk4QiwKKyAgICAweDNBM0UsIDB4Nzk4RCwgMHgwNTUyLCAweDc5OEUsIDB4MEMxMywgMHg3OThGLCAweDBERjEsIDB4Nzk5NCwgMHgyMTg2LAorICAgIDB4Nzk5NSwgMHg0NzNFLCAweDc5OTYsIDB4M0EzRiwgMHg3OTk4LCAweDNBNDAsIDB4Nzk5QiwgMHgyMTg4LCAweDc5OUQsCisgICAgMHgxNzA4LCAweDc5QTEsIDB4NDczRiwgMHg3OUE2LCAweDA2OTQsIDB4NzlBNywgMHgxNzA5LCAweDc5QTksIDB4NDc0MCwKKyAgICAweDc5QUEsIDB4MTcwQiwgMHg3OUFCLCAweDRDQTQsIDB4NzlBRSwgMHgxNzBDLCAweDc5QjAsIDB4MENERiwgMHg3OUIxLAorICAgIDB4MUU0RSwgMHg3OUIzLCAweDE3MEQsIDB4NzlCNCwgMHg0NzQxLCAweDc5QjgsIDB4M0E0MSwgMHg3OUI5LCAweDE3MEUsCisgICAgMHg3OUJBLCAweDE3MEYsIDB4NzlCQiwgMHgzQTQyLCAweDc5QkQsIDB4MDZEMSwgMHg3OUJFLCAweDA1NTMsIDB4NzlCRiwKKyAgICAweDBDOUQsIDB4NzlDMCwgMHgwOTMyLCAweDc5QzEsIDB4MDhCMiwgMHg3OUMyLCAweDQ3NDIsIDB4NzlDNCwgMHg0Q0E1LAorICAgIDB4NzlDNywgMHg0NzQzLCAweDc5QzgsIDB4NDI3OSwgMHg3OUM5LCAweDE3MTAsIDB4NzlDQSwgMHgzQTQzLCAweDc5Q0IsCisgICAgMHgwOTMzLCAweDc5Q0MsIDB4NDc0NCwgMHg3OUNELCAweDQ3NDUsIDB4NzlEMSwgMHgwNTRBLCAweDc5RDIsIDB4MERCNSwKKyAgICAweDc5RDQsIDB4NDI3QiwgMHg3OUQ1LCAweDE3MTEsIDB4NzlENiwgMHg0NzQ2LCAweDc5RDgsIDB4MEQ3RiwgMHg3OURBLAorICAgIDB4M0E0NCwgMHg3OURFLCAweDQyN0MsIDB4NzlERiwgMHgwQUM3LCAweDc5RTEsIDB4MTcxNCwgMHg3OUUzLCAweDE3MTUsCisgICAgMHg3OUU0LCAweDBEMUYsIDB4NzlFNiwgMHgwQTA3LCAweDc5RTcsIDB4MTcxMiwgMHg3OUU5LCAweDBCOUYsIDB4NzlFQSwKKyAgICAweDRDQTYsIDB4NzlFQiwgMHg0MjdELCAweDc5RUMsIDB4MTcxMywgMHg3OUVELCAweDQyN0UsIDB4NzlGMCwgMHgwOUI2LAorICAgIDB4NzlGQiwgMHgwNEEwLCAweDdBMDAsIDB4MDY0MywgMHg3QTAyLCAweDRDQTcsIDB4N0EwMywgMHgzQTQ1LCAweDdBMDUsCisgICAgMHgzNjMzLCAweDdBMDgsIDB4MTcxNiwgMHg3QTA5LCAweDNBNDYsIDB4N0EwQSwgMHg0NzRCLCAweDdBMEIsIDB4MEMxNCwKKyAgICAweDdBMEMsIDB4NENBOCwgMHg3QTBELCAweDE3MTcsIDB4N0EwRSwgMHgwQTZCLCAweDdBMTEsIDB4M0E0NywgMHg3QTE0LAorICAgIDB4MEVCOSwgMHg3QTE1LCAweDQ3NEMsIDB4N0ExNywgMHgwRDk1LCAweDdBMTgsIDB4MTcxOCwgMHg3QTE5LCAweDE3MTksCisgICAgMHg3QTFBLCAweDBCOTMsIDB4N0ExQiwgMHg0NzRELCAweDdBMUMsIDB4MEY4RiwgMHg3QTFFLCAweDNBNDgsIDB4N0ExRiwKKyAgICAweDE3MUIsIDB4N0EyMCwgMHgxNzFBLCAweDdBMkQsIDB4M0E0OSwgMHg3QTJFLCAweDA5MUIsIDB4N0EzMCwgMHg0Q0E5LAorICAgIDB4N0EzMSwgMHgxNzFELCAweDdBMzIsIDB4MDRCNCwgMHg3QTM3LCAweDE3MjAsIDB4N0EzOCwgMHg0NzRGLCAweDdBMzksCisgICAgMHgzQTRBLCAweDdBM0EsIDB4NENBQSwgMHg3QTNCLCAweDE3MUUsIDB4N0EzQywgMHgwNTU0LCAweDdBM0QsIDB4MDcyNCwKKyAgICAweDdBM0UsIDB4MTcxRiwgMHg3QTNGLCAweDA3RDgsIDB4N0E0MCwgMHgwODA0LCAweDdBNDIsIDB4MEUzNiwgMHg3QTQzLAorICAgIDB4MTcyMSwgMHg3QTQ0LCAweDRDQUIsIDB4N0E0NSwgMHgzQTRCLCAweDdBNDYsIDB4MEU4MiwgMHg3QTQ3LCAweDQ3NTAsCisgICAgMHg3QTQ5LCAweDE3MjMsIDB4N0E0QywgMHgzQTRDLCAweDdBNEQsIDB4MEE3NSwgMHg3QTRFLCAweDA0RjEsIDB4N0E0RiwKKyAgICAweDA1M0EsIDB4N0E1MCwgMHgwNDcwLCAweDdBNTYsIDB4NDc1MSwgMHg3QTU3LCAweDE3MjIsIDB4N0E1OSwgMHg0NzUyLAorICAgIDB4N0E1QywgMHg0NzUzLCAweDdBNUQsIDB4M0E0RCwgMHg3QTVGLCAweDQ3NTQsIDB4N0E2MCwgMHg0RjU2LCAweDdBNjEsCisgICAgMHgxNzI0LCAweDdBNjIsIDB4MTcyNSwgMHg3QTYzLCAweDA5REYsIDB4N0E2NywgMHg0NzU1LCAweDdBNjksIDB4MTcyNiwKKyAgICAweDdBNkEsIDB4NDc1NiwgMHg3QTZCLCAweDA1QUQsIDB4N0E2RCwgMHgzQTRGLCAweDdBNzAsIDB4MTcyOCwgMHg3QTc0LAorICAgIDB4MDc0MCwgMHg3QTc1LCAweDQ3NTcsIDB4N0E3NiwgMHgwNjgwLCAweDdBNzgsIDB4M0E1MCwgMHg3QTc5LCAweDE3MjksCisgICAgMHg3QTdBLCAweDA2RUQsIDB4N0E3RCwgMHgxNzJBLCAweDdBN0YsIDB4MEFBMCwgMHg3QTgwLCAweDRDQUMsIDB4N0E4MSwKKyAgICAweDBDQTUsIDB4N0E4MiwgMHg0NzU4LCAweDdBODMsIDB4MEE4NCwgMHg3QTg0LCAweDA4NjUsIDB4N0E4NSwgMHg0MjdGLAorICAgIDB4N0E4NiwgMHg0Q0FELCAweDdBODgsIDB4MTcyQiwgMHg3QThBLCAweDQ3NTksIDB4N0E5MCwgMHg0NzVBLCAweDdBOTIsCisgICAgMHgwQkEwLCAweDdBOTMsIDB4MEFFRCwgMHg3QTk0LCAweDRDQUUsIDB4N0E5NSwgMHgxNzJELCAweDdBOTYsIDB4MTcyRiwKKyAgICAweDdBOTcsIDB4MTcyQywgMHg3QTk4LCAweDE3MkUsIDB4N0E5RiwgMHgwNkY4LCAweDdBQTAsIDB4M0E1MSwgMHg3QUEzLAorICAgIDB4M0E1MiwgMHg3QUE5LCAweDE3MzAsIDB4N0FBQSwgMHgwNkZDLCAweDdBQUMsIDB4NDc1QiwgMHg3QUFFLCAweDA2ODEsCisgICAgMHg3QUFGLCAweDBGM0MsIDB4N0FCMCwgMHgxNzMyLCAweDdBQjMsIDB4M0E1MywgMHg3QUI1LCAweDRDQUYsIDB4N0FCNiwKKyAgICAweDE3MzMsIDB4N0FCOSwgMHg0NzVFLCAweDdBQkEsIDB4MDREMCwgMHg3QUJCLCAweDNBNTQsIDB4N0FCQywgMHgzQTU1LAorICAgIDB4N0FCRCwgMHg0Q0IwLCAweDdBQkUsIDB4NDc1RiwgMHg3QUJGLCAweDE3MzYsIDB4N0FDMywgMHgwNUQ0LCAweDdBQzQsCisgICAgMHgxNzM1LCAweDdBQzUsIDB4MTczNCwgMHg3QUM2LCAweDNBNTYsIDB4N0FDNywgMHgxNzM4LCAweDdBQzgsIDB4MTczMSwKKyAgICAweDdBQ0EsIDB4MTczOSwgMHg3QUNCLCAweDBGNzEsIDB4N0FDQywgMHg0NzYxLCAweDdBQ0QsIDB4MTczQSwgMHg3QUNFLAorICAgIDB4NDI4MSwgMHg3QUNGLCAweDE3M0IsIDB4N0FEMSwgMHgyMTg5LCAweDdBRDIsIDB4MTFDNSwgMHg3QUQzLCAweDE3M0QsCisgICAgMHg3QUQ1LCAweDE3M0MsIDB4N0FEOSwgMHgxNzNFLCAweDdBREEsIDB4MTczRiwgMHg3QURDLCAweDBGN0QsIDB4N0FERCwKKyAgICAweDE3NDAsIDB4N0FERiwgMHgxQzA4LCAweDdBRTAsIDB4MDlCNywgMHg3QUUxLCAweDE3NDEsIDB4N0FFMiwgMHgxNzQyLAorICAgIDB4N0FFMywgMHgwOTYxLCAweDdBRTUsIDB4MEM5MCwgMHg3QUU2LCAweDE3NDMsIDB4N0FFNywgMHgyMThBLCAweDdBRTgsCisgICAgMHg0NzYyLCAweDdBRUEsIDB4MEI2NiwgMHg3QUVCLCAweDIxOEMsIDB4N0FFRCwgMHgxNzQ0LCAweDdBRUYsIDB4MEI3QSwKKyAgICAweDdBRjAsIDB4MTc0NSwgMHg3QUY0LCAweDQ3NjMsIDB4N0FGNiwgMHgwNjlELCAweDdBRjgsIDB4MTA3NiwgMHg3QUY5LAorICAgIDB4MEI5QiwgMHg3QUZBLCAweDA4REYsIDB4N0FGRCwgMHg0MjgyLCAweDdBRkUsIDB4NENCMSwgMHg3QUZGLCAweDA2MDQsCisgICAgMHg3QjAyLCAweDE3NDYsIDB4N0IwNCwgMHgxNzUzLCAweDdCMDYsIDB4MTc0OSwgMHg3QjA3LCAweDNBNTcsIDB4N0IwOCwKKyAgICAweDA2ODIsIDB4N0IwQSwgMHgxNzQ4LCAweDdCMEIsIDB4MTc1NSwgMHg3QjBGLCAweDE3NDcsIDB4N0IxMSwgMHgwOUI4LAorICAgIDB4N0IxMiwgMHg0MjgzLCAweDdCMTQsIDB4M0E1OCwgMHg3QjE4LCAweDE3NEIsIDB4N0IxOSwgMHgxNzRDLCAweDdCMUIsCisgICAgMHgwQzI1LCAweDdCMUUsIDB4MTc0RCwgMHg3QjIwLCAweDA1QkMsIDB4N0IyNSwgMHgwQTIwLCAweDdCMjYsIDB4MERENiwKKyAgICAweDdCMjcsIDB4M0E1OSwgMHg3QjI4LCAweDE3NEYsIDB4N0IyQSwgMHg0NzY4LCAweDdCMkIsIDB4NENCMiwgMHg3QjJDLAorICAgIDB4MEI0OCwgMHg3QjJELCAweDQyODQsIDB4N0IyRSwgMHg0NzY5LCAweDdCMkYsIDB4NDc2QSwgMHg3QjMxLCAweDNBNUEsCisgICAgMHg3QjMzLCAweDE3NEEsIDB4N0IzNSwgMHgxNzRFLCAweDdCMzYsIDB4MTc1MCwgMHg3QjM5LCAweDA4NkIsIDB4N0IzQiwKKyAgICAweDQyODUsIDB4N0IzRCwgMHg0NzY3LCAweDdCNDEsIDB4NDc2RSwgMHg3QjQ1LCAweDE3NTcsIDB4N0I0NiwgMHgwREEwLAorICAgIDB4N0I0NywgMHgzQTVCLCAweDdCNDgsIDB4MEQzQSwgMHg3QjQ5LCAweDBDNzMsIDB4N0I0QiwgMHgwNkQyLCAweDdCNEMsCisgICAgMHgxNzU2LCAweDdCNEQsIDB4MTc1NCwgMHg3QjRFLCAweDNBNUMsIDB4N0I0RiwgMHgwRDQ5LCAweDdCNTAsIDB4MTc1MSwKKyAgICAweDdCNTEsIDB4MEI5QywgMHg3QjUyLCAweDBDNzUsIDB4N0I1MywgMHgzNzVELCAweDdCNTQsIDB4MEM3NCwgMHg3QjU1LAorICAgIDB4NDc3MCwgMHg3QjU2LCAweDA4NjYsIDB4N0I1RCwgMHgxNzY5LCAweDdCNjAsIDB4M0E1RCwgMHg3QjY0LCAweDQ3NzIsCisgICAgMHg3QjY1LCAweDE3NTksIDB4N0I2NiwgMHg0NzczLCAweDdCNjcsIDB4MTc1QiwgMHg3QjY5LCAweDNBNUUsIDB4N0I2QywKKyAgICAweDE3NUUsIDB4N0I2RCwgMHgzQTVGLCAweDdCNkUsIDB4MTc1RiwgMHg3QjZGLCAweDQyODYsIDB4N0I3MCwgMHgxNzVDLAorICAgIDB4N0I3MSwgMHgxNzVELCAweDdCNzIsIDB4M0E2MCwgMHg3QjczLCAweDQ3NzQsIDB4N0I3NCwgMHgxNzVBLCAweDdCNzUsCisgICAgMHgxNzU4LCAweDdCNzcsIDB4NENCMywgMHg3Qjc5LCAweDQ3NzEsIDB4N0I3QSwgMHgxNzUyLCAweDdCN0YsIDB4NDc2RCwKKyAgICAweDdCODYsIDB4MEUxRiwgMHg3Qjg3LCAweDA1NTUsIDB4N0I4QiwgMHgxNzY2LCAweDdCOEQsIDB4MTc2MywgMHg3QjhGLAorICAgIDB4MTc2OCwgMHg3QjkwLCAweDQ3NzcsIDB4N0I5MSwgMHgzQTYxLCAweDdCOTIsIDB4MTc2NywgMHg3Qjk0LCAweDBEMjksCisgICAgMHg3Qjk1LCAweDBFQjMsIDB4N0I5NywgMHgwODg5LCAweDdCOTgsIDB4MTc2MSwgMHg3Qjk5LCAweDE3NkEsIDB4N0I5QSwKKyAgICAweDE3NjUsIDB4N0I5QiwgMHg0Nzc4LCAweDdCOUMsIDB4MTc2NCwgMHg3QjlELCAweDE3NjAsIDB4N0I5RSwgMHgyMThELAorICAgIDB4N0I5RiwgMHgxNzYyLCAweDdCQTAsIDB4NENCNCwgMHg3QkExLCAweDA2MDUsIDB4N0JBQSwgMHgwQjdCLCAweDdCQUMsCisgICAgMHg0Q0I1LCAweDdCQUQsIDB4MEFBMSwgMHg3QkFGLCAweDNBNjIsIDB4N0JCMCwgMHg0Q0I2LCAweDdCQjEsIDB4MEQzNiwKKyAgICAweDdCQjQsIDB4MTc2RiwgMHg3QkI1LCAweDQ3N0EsIDB4N0JCOCwgMHgwRDM4LCAweDdCQkMsIDB4NDc3QiwgMHg3QkMwLAorICAgIDB4MEE4NSwgMHg3QkMxLCAweDE3NkMsIDB4N0JDNCwgMHgwRDYzLCAweDdCQzUsIDB4NDc3QywgMHg3QkM2LCAweDE3NzAsCisgICAgMHg3QkM3LCAweDBFMjMsIDB4N0JDOSwgMHgwQjk5LCAweDdCQ0EsIDB4NDc3RCwgMHg3QkNCLCAweDE3NkIsIDB4N0JDQywKKyAgICAweDE3NkQsIDB4N0JDRiwgMHgxNzZFLCAweDdCRDQsIDB4NDc4MCwgMHg3QkQ2LCAweDQ3ODEsIDB4N0JENywgMHgzQTYzLAorICAgIDB4N0JEOSwgMHgzQTY0LCAweDdCREEsIDB4NDc4MiwgMHg3QkRELCAweDE3NzEsIDB4N0JFMCwgMHgwOEYwLCAweDdCRTQsCisgICAgMHgwQzlFLCAweDdCRTUsIDB4MTc3NiwgMHg3QkU2LCAweDE3NzUsIDB4N0JFOCwgMHg0Q0I3LCAweDdCRTksIDB4MTc3MiwKKyAgICAweDdCRUEsIDB4NDc4MywgMHg3QkVELCAweDBGREMsIDB4N0JGMCwgMHg0Nzg0LCAweDdCRjIsIDB4NENCOCwgMHg3QkYzLAorICAgIDB4MTc3QiwgMHg3QkY2LCAweDE3N0YsIDB4N0JGNywgMHgxNzdDLCAweDdCRjgsIDB4NENCOSwgMHg3QkZDLCAweDRDQkEsCisgICAgMHg3QkZFLCAweDRDQkIsIDB4N0MwMCwgMHgxNzc4LCAweDdDMDEsIDB4NDI4NywgMHg3QzAzLCAweDQ3ODUsIDB4N0MwNywKKyAgICAweDE3NzksIDB4N0MwOSwgMHg0Q0JDLCAweDdDMEIsIDB4M0E2NSwgMHg3QzBELCAweDE3N0UsIDB4N0MwRSwgMHg0Nzg2LAorICAgIDB4N0MwRiwgMHgzQTY2LCAweDdDMTEsIDB4MTc3MywgMHg3QzEyLCAweDEwRUEsIDB4N0MxMywgMHgxNzdBLCAweDdDMTQsCisgICAgMHgxNzc0LCAweDdDMTcsIDB4MTc3RCwgMHg3QzFFLCAweDFFM0IsIDB4N0MxRiwgMHgxNzgzLCAweDdDMjAsIDB4M0E2NywKKyAgICAweDdDMjEsIDB4MDYwNiwgMHg3QzIzLCAweDE3ODAsIDB4N0MyNiwgMHgzQTY4LCAweDdDMjcsIDB4MTc4MSwgMHg3QzI4LAorICAgIDB4NENCRCwgMHg3QzJBLCAweDE3ODIsIDB4N0MyQiwgMHgxNzg1LCAweDdDMkYsIDB4NENCRSwgMHg3QzMxLCAweDNBNjksCisgICAgMHg3QzMzLCAweDQyODgsIDB4N0MzNiwgMHgzQTZBLCAweDdDMzcsIDB4MTc4NCwgMHg3QzM4LCAweDBEOEEsIDB4N0MzRCwKKyAgICAweDE3ODYsIDB4N0MzRSwgMHgwRkM0LCAweDdDM0YsIDB4MEUzRCwgMHg3QzQwLCAweDE3OEIsIDB4N0M0MiwgMHg0Q0JGLAorICAgIDB4N0M0MywgMHgxNzg4LCAweDdDNDUsIDB4NDc4NywgMHg3QzRBLCAweDQ3ODgsIDB4N0M0QywgMHgxNzg3LCAweDdDNEQsCisgICAgMHgwQTc2LCAweDdDNEYsIDB4MTc4QSwgMHg3QzUwLCAweDE3OEMsIDB4N0M1MSwgMHgzQTZCLCAweDdDNTIsIDB4NENDMCwKKyAgICAweDdDNTMsIDB4NENDMSwgMHg3QzU0LCAweDE3ODksIDB4N0M1NiwgMHgxNzkwLCAweDdDNTcsIDB4NDc4OSwgMHg3QzU4LAorICAgIDB4MTc4RCwgMHg3QzU5LCAweDNBNkMsIDB4N0M1QiwgMHg0Q0MyLCAweDdDNUMsIDB4NENDMywgMHg3QzVELCAweDRDQzQsCisgICAgMHg3QzVFLCAweDQ3OEEsIDB4N0M1RiwgMHgxNzhFLCAweDdDNjAsIDB4MTc3NywgMHg3QzYxLCAweDQ3OEIsIDB4N0M2NCwKKyAgICAweDE3OEYsIDB4N0M2NSwgMHgxNzkxLCAweDdDNjcsIDB4M0E2RCwgMHg3QzY5LCAweDQ3OEMsIDB4N0M2QywgMHgxNzkyLAorICAgIDB4N0M2RCwgMHg0MjhBLCAweDdDNkUsIDB4M0E2RSwgMHg3QzZGLCAweDQ3OEQsIDB4N0M3MCwgMHgzQTZGLCAweDdDNzIsCisgICAgMHg0Q0M1LCAweDdDNzMsIDB4MEUxNiwgMHg3Qzc1LCAweDE3OTMsIDB4N0M3OSwgMHg0MjhCLCAweDdDN0IsIDB4MzcwRSwKKyAgICAweDdDN0QsIDB4NENDNiwgMHg3QzdFLCAweDBFRUUsIDB4N0M4MSwgMHgwNkM2LCAweDdDODIsIDB4MDZGRiwgMHg3QzgzLAorICAgIDB4MTc5NCwgMHg3Qzg3LCAweDRDQzcsIDB4N0M4OSwgMHgwRTA0LCAweDdDOEIsIDB4MEEyRSwgMHg3QzhELCAweDBFQkMsCisgICAgMHg3QzhGLCAweDQyOEMsIDB4N0M5MCwgMHgxNzk1LCAweDdDOTIsIDB4MEY3QiwgMHg3Qzk0LCAweDQyOEQsIDB4N0M5NSwKKyAgICAweDBEMkEsIDB4N0M5NywgMHgwQUM4LCAweDdDOTgsIDB4MENFQSwgMHg3QzlCLCAweDA5NTcsIDB4N0M5RSwgMHg0Q0M4LAorICAgIDB4N0M5RiwgMHgwNDg0LCAweDdDQTAsIDB4NDI4RSwgMHg3Q0ExLCAweDE3OUEsIDB4N0NBMiwgMHgxNzk4LCAweDdDQTQsCisgICAgMHgxNzk2LCAweDdDQTUsIDB4MDVERCwgMHg3Q0E2LCAweDQ3OTEsIDB4N0NBNywgMHgwOUI5LCAweDdDQTgsIDB4MTc5QiwKKyAgICAweDdDQUIsIDB4MTc5OSwgMHg3Q0FELCAweDE3OTcsIDB4N0NBRSwgMHgxNzlGLCAweDdDQjEsIDB4MTc5RSwgMHg3Q0IyLAorICAgIDB4MTc5RCwgMHg3Q0IzLCAweDE3OUMsIDB4N0NCNiwgMHg0NzkzLCAweDdDQjcsIDB4NDc5NCwgMHg3Q0I5LCAweDE3QTAsCisgICAgMHg3Q0JBLCAweDRDQzksIDB4N0NCQywgMHgzQTcwLCAweDdDQkQsIDB4MTdBMSwgMHg3Q0JFLCAweDBBNUUsIDB4N0NCRiwKKyAgICAweDNBNzEsIDB4N0NDMCwgMHgxN0EyLCAweDdDQzIsIDB4MTdBNCwgMHg3Q0M0LCAweDQ3OTYsIDB4N0NDNSwgMHgxN0EzLAorICAgIDB4N0NDNywgMHg0Q0NBLCAweDdDQzgsIDB4M0E3MiwgMHg3Q0M5LCAweDNBNzMsIDB4N0NDQSwgMHgwNzg2LCAweDdDQ0QsCisgICAgMHg0Nzk4LCAweDdDQ0UsIDB4MEFCQSwgMHg3Q0QyLCAweDE3QTYsIDB4N0NEMywgMHg0Q0NCLCAweDdDRDUsIDB4NDI4RiwKKyAgICAweDdDRDYsIDB4MEM3NiwgMHg3Q0Q3LCAweDNBNzQsIDB4N0NEOCwgMHgxN0E1LCAweDdDRDksIDB4M0E3NSwgMHg3Q0RBLAorICAgIDB4NENDQywgMHg3Q0RDLCAweDE3QTcsIDB4N0NERCwgMHgzQTc2LCAweDdDREUsIDB4MEUwNSwgMHg3Q0RGLCAweDBBRUUsCisgICAgMHg3Q0UwLCAweDA3RDksIDB4N0NFMiwgMHgxN0E4LCAweDdDRTYsIDB4NDc5QiwgMHg3Q0U3LCAweDBGOTAsIDB4N0NFQiwKKyAgICAweDNBNzcsIDB4N0NFRiwgMHgxN0FBLCAweDdDRjIsIDB4MTdBQiwgMHg3Q0Y0LCAweDE3QUMsIDB4N0NGNSwgMHg0NzlELAorICAgIDB4N0NGNiwgMHgxN0FELCAweDdDRjgsIDB4MDhCMywgMHg3Q0ZBLCAweDE3QUUsIDB4N0NGQiwgMHgwNzI1LCAweDdDRkUsCisgICAgMHgwNjg0LCAweDdEMDAsIDB4MDY0NCwgMHg3RDAyLCAweDE3QjAsIDB4N0QwMywgMHg0NzlFLCAweDdEMDQsIDB4MEVGRiwKKyAgICAweDdEMDUsIDB4MDdEQSwgMHg3RDA2LCAweDE3QUYsIDB4N0QwNywgMHgzQTc4LCAweDdEMDgsIDB4M0E3OSwgMHg3RDA5LAorICAgIDB4M0E3QSwgMHg3RDBBLCAweDE3QjMsIDB4N0QwQiwgMHgwRUYyLCAweDdEMEQsIDB4MENGMiwgMHg3RDEwLCAweDBEQTUsCisgICAgMHg3RDEyLCAweDQ3QTAsIDB4N0QxMywgMHgzQTdCLCAweDdEMTQsIDB4MDk2RCwgMHg3RDE1LCAweDE3QjIsIDB4N0QxNywKKyAgICAweDA4RkYsIDB4N0QxOCwgMHgwN0RCLCAweDdEMTksIDB4MDhCNCwgMHg3RDFBLCAweDA2ODMsIDB4N0QxQiwgMHgwRTA2LAorICAgIDB4N0QxQywgMHgxN0IxLCAweDdEMUQsIDB4M0E3QywgMHg3RDFFLCAweDQ3QTEsIDB4N0QyMCwgMHgwQUM5LCAweDdEMjEsCisgICAgMHgwRTcwLCAweDdEMjIsIDB4MDg2NywgMHg3RDIzLCAweDNBN0QsIDB4N0QyQiwgMHgwOEI1LCAweDdEMkMsIDB4MEJGOSwKKyAgICAweDdEMkUsIDB4MTdCNiwgMHg3RDJGLCAweDBGQTcsIDB4N0QzMCwgMHgwODQ5LCAweDdEMzEsIDB4NDI5MCwgMHg3RDMyLAorICAgIDB4MTdCNywgMHg3RDMzLCAweDBBMDgsIDB4N0QzNSwgMHgxN0I5LCAweDdEMzksIDB4MDlCQSwgMHg3RDNBLCAweDA4MjAsCisgICAgMHg3RDNDLCAweDRDQ0QsIDB4N0QzRCwgMHg0N0E0LCAweDdEM0UsIDB4NDdBNSwgMHg3RDNGLCAweDE3QjgsIDB4N0Q0MCwKKyAgICAweDQ3QTYsIDB4N0Q0MSwgMHgzQTdFLCAweDdENDIsIDB4MDkzNCwgMHg3RDQzLCAweDA3NzIsIDB4N0Q0NCwgMHgwQUNBLAorICAgIDB4N0Q0NSwgMHgxN0I0LCAweDdENDYsIDB4MTdCQSwgMHg3RDQ3LCAweDQ3QTcsIDB4N0Q0OCwgMHgyMThGLCAweDdENEIsCisgICAgMHgxN0I1LCAweDdENEMsIDB4MDcyNiwgMHg3RDRELCAweDRDQ0UsIDB4N0Q0RSwgMHgxN0JELCAweDdENEYsIDB4MTdDMSwKKyAgICAweDdENTAsIDB4MDc0MSwgMHg3RDUzLCAweDNBN0YsIDB4N0Q1NSwgMHgzNjNBLCAweDdENTYsIDB4MTdCQywgMHg3RDU5LAorICAgIDB4M0E4MCwgMHg3RDVBLCAweDQ3QUIsIDB4N0Q1QiwgMHgxN0M1LCAweDdENUMsIDB4NDI5MSwgMHg3RDVELCAweDNBODEsCisgICAgMHg3RDVFLCAweDA3REMsIDB4N0Q2MSwgMHgwRjU3LCAweDdENjIsIDB4MDQ4MCwgMHg3RDYzLCAweDE3QzIsIDB4N0Q2NiwKKyAgICAweDA2ODUsIDB4N0Q2OCwgMHgxN0JGLCAweDdENkEsIDB4NDdBQywgMHg3RDZFLCAweDE3QzAsIDB4N0Q3MCwgMHg0N0FELAorICAgIDB4N0Q3MSwgMHgwQzc3LCAweDdENzIsIDB4MTdCRSwgMHg3RDczLCAweDE3QkIsIDB4N0Q3NSwgMHgwNTg2LCAweDdENzYsCisgICAgMHgwQTg4LCAweDdENzksIDB4MDc1QywgMHg3RDdBLCAweDNBODIsIDB4N0Q3RCwgMHgxN0M3LCAweDdEN0YsIDB4NDdBRiwKKyAgICAweDdEODIsIDB4NENDRiwgMHg3RDgzLCAweDQyOTIsIDB4N0Q4NSwgMHg0Q0QwLCAweDdEODYsIDB4M0E4MywgMHg3RDg4LAorICAgIDB4NDdCMSwgMHg3RDg5LCAweDE3QzQsIDB4N0Q4QiwgMHgzQTg0LCAweDdEOEMsIDB4M0E4NSwgMHg3RDhELCAweDRDRDEsCisgICAgMHg3RDhGLCAweDE3QzYsIDB4N0Q5MSwgMHg0Q0QyLCAweDdEOTMsIDB4MTdDMywgMHg3RDk3LCAweDQ3QjIsIDB4N0Q5OSwKKyAgICAweDA3MjcsIDB4N0Q5QSwgMHgwQjEzLCAweDdEOUIsIDB4MTdDOCwgMHg3RDlDLCAweDBBRjAsIDB4N0Q5RCwgMHg0N0I0LAorICAgIDB4N0Q5RSwgMHg0Q0QzLCAweDdEOUYsIDB4MTdENSwgMHg3REEwLCAweDIxOTIsIDB4N0RBMiwgMHgxN0QxLCAweDdEQTMsCisgICAgMHgxN0NCLCAweDdEQTYsIDB4NDI5MywgMHg3REE3LCAweDQ3QjUsIDB4N0RBQSwgMHg0N0I2LCAweDdEQUIsIDB4MTdDRiwKKyAgICAweDdEQUMsIDB4MDkyNiwgMHg3REFELCAweDA0QTEsIDB4N0RBRSwgMHgxN0NBLCAweDdEQUYsIDB4MTdEMiwgMHg3REIwLAorICAgIDB4MTdENiwgMHg3REIxLCAweDA3REQsIDB4N0RCMiwgMHgwRUUyLCAweDdEQjMsIDB4NENENCwgMHg3REI0LCAweDBCRjIsCisgICAgMHg3REI1LCAweDE3Q0MsIDB4N0RCNiwgMHg0N0I3LCAweDdEQjcsIDB4MjE5MSwgMHg3REI4LCAweDE3RDQsIDB4N0RCOSwKKyAgICAweDRDRDUsIDB4N0RCQSwgMHgxN0M5LCAweDdEQkIsIDB4MEI3QywgMHg3REJELCAweDE3Q0UsIDB4N0RCRSwgMHgwNDgxLAorICAgIDB4N0RCRiwgMHgwRUQ2LCAweDdEQzAsIDB4NDdCOCwgMHg3REMyLCAweDQyOTQsIDB4N0RDNywgMHgxN0NELCAweDdEQ0EsCisgICAgMHgwNkQzLCAweDdEQ0IsIDB4MEQ4MCwgMHg3RENDLCAweDNBODYsIDB4N0RDRiwgMHgwQUVGLCAweDdERDAsIDB4NENENiwKKyAgICAweDdERDEsIDB4MEY5OCwgMHg3REQyLCAweDA5NzksIDB4N0RENSwgMHgxN0ZELCAweDdERDYsIDB4MjE5MywgMHg3REQ3LAorICAgIDB4NDdCOSwgMHg3REQ4LCAweDE3RDcsIDB4N0REOSwgMHg0N0JBLCAweDdEREEsIDB4MEFBMiwgMHg3RERDLCAweDE3RDMsCisgICAgMHg3RERELCAweDE3RDgsIDB4N0RERSwgMHgxN0RBLCAweDdERTAsIDB4MEMxNSwgMHg3REUxLCAweDE3REQsIDB4N0RFMywKKyAgICAweDM0MEEsIDB4N0RFNCwgMHgxN0Q5LCAweDdERTUsIDB4NENENywgMHg3REU2LCAweDQ3QkIsIDB4N0RFOCwgMHgwRTI0LAorICAgIDB4N0RFOSwgMHgwNjA3LCAweDdERUIsIDB4M0E4NywgMHg3REVDLCAweDBFRDcsIDB4N0RFRiwgMHgwNEEyLCAweDdERjEsCisgICAgMHgzQTg4LCAweDdERjIsIDB4MTdEQywgMHg3REY0LCAweDBGQzUsIDB4N0RGNSwgMHg0Q0Q4LCAweDdERjYsIDB4NENEOSwKKyAgICAweDdERjksIDB4M0E4OSwgMHg3REZCLCAweDE3REIsIDB4N0UwMSwgMHgwNTExLCAweDdFMDQsIDB4MENDNCwgMHg3RTA1LAorICAgIDB4MTdERSwgMHg3RTA4LCAweDNBOEEsIDB4N0UwOSwgMHgxN0U1LCAweDdFMEEsIDB4MTdERiwgMHg3RTBCLCAweDE3RTYsCisgICAgMHg3RTEwLCAweDQ3QkYsIDB4N0UxMSwgMHgzQThCLCAweDdFMTIsIDB4MTdFMiwgMHg3RTE1LCAweDNBOEMsIDB4N0UxNywKKyAgICAweDQ3QzAsIDB4N0UxQiwgMHgwRDMxLCAweDdFMUQsIDB4NDdDMSwgMHg3RTFFLCAweDA4RjYsIDB4N0UxRiwgMHgxN0U0LAorICAgIDB4N0UyMCwgMHgzQThELCAweDdFMjEsIDB4MTdFMSwgMHg3RTIyLCAweDE3RTcsIDB4N0UyMywgMHgxN0UwLCAweDdFMjYsCisgICAgMHgwOTRFLCAweDdFMjcsIDB4NDdDMiwgMHg3RTI4LCAweDQyOTUsIDB4N0UyQiwgMHgwRTUzLCAweDdFMkMsIDB4NDdDMywKKyAgICAweDdFMkUsIDB4MDk1NiwgMHg3RTJGLCAweDRDREEsIDB4N0UzMSwgMHgxN0UzLCAweDdFMzIsIDB4MTdFRiwgMHg3RTM1LAorICAgIDB4MTdFQiwgMHg3RTM2LCAweDRDREIsIDB4N0UzNywgMHgxN0VFLCAweDdFMzksIDB4MTdFQywgMHg3RTNBLCAweDE3RjAsCisgICAgMHg3RTNCLCAweDE3RUEsIDB4N0UzRCwgMHgxN0QwLCAweDdFM0UsIDB4MEE3NywgMHg3RTQxLCAweDBENUYsIDB4N0U0MywKKyAgICAweDE3RUQsIDB4N0U0NCwgMHg0Q0RDLCAweDdFNDUsIDB4NDdDNCwgMHg3RTQ2LCAweDE3RTgsIDB4N0U0NywgMHgzQThFLAorICAgIDB4N0U0OCwgMHgzNzY3LCAweDdFNEEsIDB4MEFBMywgMHg3RTRCLCAweDA3MjgsIDB4N0U0RCwgMHgwOTM1LCAweDdFNTIsCisgICAgMHgyMTk0LCAweDdFNTQsIDB4MDlFQiwgMHg3RTU1LCAweDBBQjgsIDB4N0U1NiwgMHgxN0YzLCAweDdFNTksIDB4MTdGNSwKKyAgICAweDdFNUEsIDB4MTdGNiwgMHg3RTVELCAweDE3RjIsIDB4N0U1RSwgMHgxN0Y0LCAweDdFNjEsIDB4MUUxMSwgMHg3RTYyLAorICAgIDB4M0E4RiwgMHg3RTY2LCAweDE3RTksIDB4N0U2NywgMHgxN0YxLCAweDdFNjksIDB4MTdGOSwgMHg3RTZBLCAweDE3RjgsCisgICAgMHg3RTZCLCAweDFERjcsIDB4N0U2RCwgMHgwRUE4LCAweDdFNkUsIDB4M0E5MCwgMHg3RTZGLCAweDRDREQsIDB4N0U3MCwKKyAgICAweDA3MDEsIDB4N0U3MywgMHgzQTkxLCAweDdFNzUsIDB4NDdDNSwgMHg3RTc4LCAweDRDREUsIDB4N0U3OSwgMHgxN0Y3LAorICAgIDB4N0U3QiwgMHgxN0ZCLCAweDdFN0MsIDB4MTdGQSwgMHg3RTdELCAweDE3RkUsIDB4N0U3RSwgMHg0N0M2LCAweDdFN0YsCisgICAgMHgxODAwLCAweDdFODEsIDB4NENERiwgMHg3RTgyLCAweDA4OEEsIDB4N0U4MywgMHgxN0ZDLCAweDdFODYsIDB4NDdDNywKKyAgICAweDdFODcsIDB4NDdDOCwgMHg3RTg4LCAweDE4MDEsIDB4N0U4OSwgMHgxODAyLCAweDdFOEEsIDB4MjBBNywgMHg3RThDLAorICAgIDB4MTgwMywgMHg3RThELCAweDNBOTIsIDB4N0U4RSwgMHgxODA5LCAweDdFOEYsIDB4MEMzNSwgMHg3RTkwLCAweDE4MDUsCisgICAgMHg3RTkxLCAweDNBOTMsIDB4N0U5MiwgMHgxODA0LCAweDdFOTMsIDB4MTgwNiwgMHg3RTk0LCAweDE4MDcsIDB4N0U5NiwKKyAgICAweDE4MDgsIDB4N0U5OCwgMHgzQTk0LCAweDdFOUEsIDB4NDdDQSwgMHg3RTlCLCAweDE4MEEsIDB4N0U5QywgMHgxODBCLAorICAgIDB4N0YzNiwgMHgwNjA4LCAweDdGMzgsIDB4MTgwQywgMHg3RjNBLCAweDE4MEQsIDB4N0YzQiwgMHg0N0NELCAweDdGM0MsCisgICAgMHg0N0NDLCAweDdGM0QsIDB4NENFMCwgMHg3RjNFLCAweDQ3Q0UsIDB4N0Y0MywgMHg0N0NGLCAweDdGNDQsIDB4M0E5NSwKKyAgICAweDdGNDUsIDB4MTgwRSwgMHg3RjQ3LCAweDIxOTUsIDB4N0Y0QywgMHgxODBGLCAweDdGNEQsIDB4MTgxMCwgMHg3RjRFLAorICAgIDB4MTgxMSwgMHg3RjRGLCAweDNBOTYsIDB4N0Y1MCwgMHgxODEyLCAweDdGNTEsIDB4MTgxMywgMHg3RjUyLCAweDNBOTcsCisgICAgMHg3RjUzLCAweDNBOTgsIDB4N0Y1NCwgMHgxODE1LCAweDdGNTUsIDB4MTgxNCwgMHg3RjU4LCAweDE4MTYsIDB4N0Y1QiwKKyAgICAweDRDRTEsIDB4N0Y1RCwgMHg0Q0UyLCAweDdGNUYsIDB4MTgxNywgMHg3RjYwLCAweDE4MTgsIDB4N0Y2MSwgMHgzQTk5LAorICAgIDB4N0Y2MywgMHg0N0QzLCAweDdGNjQsIDB4NDdENCwgMHg3RjY1LCAweDRDRTMsIDB4N0Y2NywgMHgxODFCLCAweDdGNjgsCisgICAgMHgxODE5LCAweDdGNjksIDB4MTgxQSwgMHg3RjZBLCAweDA4NTEsIDB4N0Y2QiwgMHgwNzI5LCAweDdGNkQsIDB4NDdENSwKKyAgICAweDdGNkUsIDB4MEI5NCwgMHg3RjcwLCAweDBENDcsIDB4N0Y3MSwgMHg0Q0U0LCAweDdGNzIsIDB4MDk3QSwgMHg3Rjc1LAorICAgIDB4MEQwMywgMHg3Rjc3LCAweDBEODEsIDB4N0Y3OCwgMHgxODFDLCAweDdGNzksIDB4MTMzNiwgMHg3RjdELCAweDQ3RDYsCisgICAgMHg3RjdFLCAweDQ3RDcsIDB4N0Y3RiwgMHg0Q0U1LCAweDdGODAsIDB4NENFNiwgMHg3RjgyLCAweDE4MUQsIDB4N0Y4MywKKyAgICAweDE4MUYsIDB4N0Y4NSwgMHgwRjRGLCAweDdGODYsIDB4MTgxRSwgMHg3Rjg3LCAweDE4MjEsIDB4N0Y4OCwgMHgxODIwLAorICAgIDB4N0Y4QSwgMHgwRjNELCAweDdGOEIsIDB4NENFNywgMHg3RjhDLCAweDE4MjIsIDB4N0Y4RSwgMHgwRDkyLCAweDdGOTAsCisgICAgMHg0N0Q4LCAweDdGOTEsIDB4M0E5QSwgMHg3Rjk0LCAweDE4MjMsIDB4N0Y5NiwgMHg0N0RCLCAweDdGOTcsIDB4NDI5NiwKKyAgICAweDdGOUEsIDB4MTgyNiwgMHg3RjlDLCAweDQ3REMsIDB4N0Y5RCwgMHgxODI1LCAweDdGOUUsIDB4MTgyNCwgMHg3RkExLAorICAgIDB4MjE5NiwgMHg3RkEyLCAweDRDRTgsIDB4N0ZBMywgMHgxODI3LCAweDdGQTQsIDB4MDcwOCwgMHg3RkE4LCAweDBBQTQsCisgICAgMHg3RkE5LCAweDA2NUIsIDB4N0ZBRCwgMHg0N0RELCAweDdGQUUsIDB4MTgyQiwgMHg3RkFGLCAweDE4MjgsIDB4N0ZCMiwKKyAgICAweDE4MjksIDB4N0ZCNiwgMHgxODJDLCAweDdGQjgsIDB4MTgyRCwgMHg3RkI5LCAweDE4MkEsIDB4N0ZCRCwgMHgwNENCLAorICAgIDB4N0ZCRiwgMHgzQTlCLCAweDdGQzEsIDB4MDUyNywgMHg3RkMzLCAweDQ3REYsIDB4N0ZDNSwgMHgxODJGLCAweDdGQzYsCisgICAgMHgxODMwLCAweDdGQ0EsIDB4MTgzMSwgMHg3RkNDLCAweDBGNEMsIDB4N0ZDRSwgMHgzQTlDLCAweDdGQ0YsIDB4NDdFMCwKKyAgICAweDdGRDIsIDB4MDkzNiwgMHg3RkQ0LCAweDE4MzMsIDB4N0ZENSwgMHgxODMyLCAweDdGREIsIDB4NDI5NywgMHg3RkRGLAorICAgIDB4M0E5RCwgMHg3RkUwLCAweDBBMkYsIDB4N0ZFMSwgMHgxODM0LCAweDdGRTMsIDB4NDdFMSwgMHg3RkU1LCAweDNBOUUsCisgICAgMHg3RkU2LCAweDE4MzUsIDB4N0ZFOSwgMHgxODM2LCAweDdGRUIsIDB4MDYyMSwgMHg3RkVDLCAweDNBOUYsIDB4N0ZFRSwKKyAgICAweDNBQTAsIDB4N0ZFRiwgMHgzQUExLCAweDdGRjAsIDB4MDYwOSwgMHg3RkYyLCAweDQ3RTIsIDB4N0ZGMywgMHgxODM3LAorICAgIDB4N0ZGOSwgMHgxODM4LCAweDdGRkEsIDB4M0FBMiwgMHg3RkZCLCAweDBFOEIsIDB4N0ZGQywgMHgwRjRELCAweDdGRkQsCisgICAgMHg0Q0U5LCAweDdGRkUsIDB4NENFQSwgMHg3RkZGLCAweDRDRUIsIDB4ODAwMCwgMHgwRjNFLCAweDgwMDEsIDB4MEZERCwKKyAgICAweDgwMDIsIDB4MzcxMywgMHg4MDAzLCAweDA3REYsIDB4ODAwNCwgMHgxODNCLCAweDgwMDUsIDB4MDkwMCwgMHg4MDA2LAorICAgIDB4MTgzQSwgMHg4MDA3LCAweDRDRUMsIDB4ODAwOCwgMHg0N0U0LCAweDgwMEEsIDB4NDdFMywgMHg4MDBCLCAweDE4M0MsCisgICAgMHg4MDBDLCAweDA4RDUsIDB4ODAwRCwgMHg0Q0VELCAweDgwMEUsIDB4M0FBMywgMHg4MDEwLCAweDBCMzEsIDB4ODAxMSwKKyAgICAweDNBQTQsIDB4ODAxMiwgMHgxODNELCAweDgwMTQsIDB4M0FBNSwgMHg4MDE1LCAweDA3REUsIDB4ODAxNiwgMHg0N0U1LAorICAgIDB4ODAxNywgMHgwRUUzLCAweDgwMTgsIDB4MTgzRSwgMHg4MDE5LCAweDE4M0YsIDB4ODAxQywgMHgxODQwLCAweDgwMUUsCisgICAgMHg0Q0VFLCAweDgwMjEsIDB4MTg0MSwgMHg4MDI0LCAweDNBQTYsIDB4ODAyNiwgMHgzQUE3LCAweDgwMjgsIDB4MTg0MiwKKyAgICAweDgwMkMsIDB4NDdFNiwgMHg4MDMwLCAweDQ3RTcsIDB4ODAzMywgMHgwOEQ2LCAweDgwMzUsIDB4NDI5OCwgMHg4MDM2LAorICAgIDB4MEVGOSwgMHg4MDM3LCAweDQyOTksIDB4ODAzOSwgMHg0Q0VGLCAweDgwM0EsIDB4M0FBOCwgMHg4MDNCLCAweDE4NDQsCisgICAgMHg4MDNDLCAweDNBQTksIDB4ODAzRCwgMHgwQjdELCAweDgwM0YsIDB4MTg0MywgMHg4MDQzLCAweDQ3RTgsIDB4ODA0NiwKKyAgICAweDE4NDYsIDB4ODA0QSwgMHgxODQ1LCAweDgwNTIsIDB4MTg0NywgMHg4MDU2LCAweDBBNUYsIDB4ODA1OCwgMHgxODQ4LAorICAgIDB4ODA1QSwgMHgxODQ5LCAweDgwNUUsIDB4MEUwOSwgMHg4MDVGLCAweDE4NEEsIDB4ODA2MCwgMHgzQUFBLCAweDgwNjEsCisgICAgMHgwQUYxLCAweDgwNjIsIDB4MTg0QiwgMHg4MDY2LCAweDQ3RTksIDB4ODA2OCwgMHgxODRDLCAweDgwNkYsIDB4MEZDNiwKKyAgICAweDgwNzAsIDB4MTg0RiwgMHg4MDcxLCAweDNBQUIsIDB4ODA3MiwgMHgxODRFLCAweDgwNzMsIDB4MTg0RCwgMHg4MDc0LAorICAgIDB4MEJDQywgMHg4MDc1LCAweDNBQUMsIDB4ODA3NiwgMHgxODUwLCAweDgwNzcsIDB4MDlFQywgMHg4MDc5LCAweDE4NTEsCisgICAgMHg4MDdCLCAweDQ3RUEsIDB4ODA3RCwgMHgxODUyLCAweDgwN0UsIDB4MEZERSwgMHg4MDdGLCAweDE4NTMsIDB4ODA4NCwKKyAgICAweDE4NTQsIDB4ODA4NSwgMHgxODU2LCAweDgwODYsIDB4MTg1NSwgMHg4MDg3LCAweDBEMzksIDB4ODA4OCwgMHg0Q0YwLAorICAgIDB4ODA4OSwgMHgwQ0QxLCAweDgwOEIsIDB4MEZFNCwgMHg4MDhDLCAweDBEM0QsIDB4ODA4RSwgMHg0Q0YxLCAweDgwOTMsCisgICAgMHgxODU4LCAweDgwOTYsIDB4MDlCQiwgMHg4MDk4LCAweDBEOUMsIDB4ODA5OSwgMHg0N0VCLCAweDgwOUEsIDB4MTg1OSwKKyAgICAweDgwOUIsIDB4MTg1NywgMHg4MDlDLCAweDQ3RUMsIDB4ODA5RCwgMHgwNjBBLCAweDgwOUUsIDB4M0FBRCwgMHg4MEExLAorICAgIDB4MDc4OCwgMHg4MEEyLCAweDA4QjYsIDB4ODBBNCwgMHg0N0VELCAweDgwQTUsIDB4MEQ4MiwgMHg4MEE2LCAweDNBQUUsCisgICAgMHg4MEE3LCAweDQ3RUUsIDB4ODBBOSwgMHgwNzVFLCAweDgwQUEsIDB4MEU3MSwgMHg4MEFCLCAweDNBQUYsIDB4ODBBQywKKyAgICAweDE4NUMsIDB4ODBBRCwgMHgxODVBLCAweDgwQUYsIDB4MDdFMCwgMHg4MEIxLCAweDA3RTEsIDB4ODBCMiwgMHgwNEFELAorICAgIDB4ODBCNCwgMHgwODU4LCAweDgwQjgsIDB4NDdFRiwgMHg4MEJBLCAweDBEMEYsIDB4ODBDMywgMHgwNEEzLCAweDgwQzQsCisgICAgMHgxODYxLCAweDgwQzUsIDB4NDdGMSwgMHg4MEM2LCAweDBCN0UsIDB4ODBDQSwgMHg0MjlBLCAweDgwQ0MsIDB4MEQwRSwKKyAgICAweDgwQ0UsIDB4MEIzQiwgMHg4MENGLCAweDRDRjIsIDB4ODBENCwgMHg0Q0YzLCAweDgwRDUsIDB4NDdGMiwgMHg4MEQ2LAorICAgIDB4MTg2MywgMHg4MEQ3LCAweDNBQjAsIDB4ODBEOCwgMHgzQUIxLCAweDgwRDksIDB4MTg1RiwgMHg4MERBLCAweDE4NjIsCisgICAgMHg4MERCLCAweDE4NUQsIDB4ODBERCwgMHgxODYwLCAweDgwREUsIDB4MEU1NCwgMHg4MEUwLCAweDQyOUIsIDB4ODBFMSwKKyAgICAweDA3ODksIDB4ODBFNCwgMHgwNEMxLCAweDgwRTUsIDB4MTg1RSwgMHg4MEU2LCAweDQ3RjMsIDB4ODBFRCwgMHg0Q0Y0LAorICAgIDB4ODBFRiwgMHgxODY1LCAweDgwRjAsIDB4NENGNSwgMHg4MEYxLCAweDE4NjYsIDB4ODBGMywgMHg0MjlDLCAweDgwRjQsCisgICAgMHgwQzkxLCAweDgwRjUsIDB4NDdGNSwgMHg4MEY3LCAweDRDRjYsIDB4ODBGOCwgMHgwNkIzLCAweDgwRkEsIDB4NENGNywKKyAgICAweDgwRkIsIDB4NDdGNiwgMHg4MEZDLCAweDE4NzEsIDB4ODBGRCwgMHgwQ0YzLCAweDgwRkUsIDB4NENGOCwgMHg4MTAyLAorICAgIDB4MDhCNywgMHg4MTAzLCAweDRDRjksIDB4ODEwNSwgMHgwNkI0LCAweDgxMDYsIDB4MEE2QywgMHg4MTA3LCAweDBGRUMsCisgICAgMHg4MTA4LCAweDBFQkEsIDB4ODEwOSwgMHgxODY0LCAweDgxMEEsIDB4MEE3OCwgMHg4MTBELCAweDQ3RjQsIDB4ODExNiwKKyAgICAweDNBQjIsIDB4ODExNywgMHg0Q0ZBLCAweDgxMTgsIDB4M0FCMywgMHg4MTFBLCAweDA2NkQsIDB4ODExQiwgMHgxODY3LAorICAgIDB4ODExRSwgMHg0N0Y5LCAweDgxMjMsIDB4MTg2OSwgMHg4MTI0LCAweDQ3RkIsIDB4ODEyNywgMHg0N0ZDLCAweDgxMjksCisgICAgMHgxODY4LCAweDgxMkIsIDB4MzY1OSwgMHg4MTJDLCAweDQ3RkQsIDB4ODEyRiwgMHgxODZBLCAweDgxMzAsIDB4NENGQiwKKyAgICAweDgxMzEsIDB4MEI2NCwgMHg4MTMzLCAweDBDRjQsIDB4ODEzNSwgMHg0N0Y4LCAweDgxMzksIDB4MEJDRCwgMHg4MTNBLAorICAgIDB4M0FCNCwgMHg4MTNELCAweDQ3RkYsIDB4ODEzRSwgMHgxODZFLCAweDgxNDEsIDB4Mzc3MiwgMHg4MTQ2LCAweDE4NkQsCisgICAgMHg4MTRBLCAweDNBQjUsIDB4ODE0QiwgMHgxODZCLCAweDgxNEMsIDB4M0FCNiwgMHg4MTRFLCAweDBBMUIsIDB4ODE1MCwKKyAgICAweDBERDcsIDB4ODE1MSwgMHgxODcwLCAweDgxNTMsIDB4MTg2RiwgMHg4MTU0LCAweDA3RTIsIDB4ODE1NSwgMHgwRkY5LAorICAgIDB4ODE1NywgMHg0Q0ZDLCAweDgxNUYsIDB4MTg4MCwgMHg4MTYwLCAweDQyOUQsIDB4ODE2NSwgMHgxODc0LCAweDgxNjYsCisgICAgMHgxODc1LCAweDgxNjcsIDB4NDI5RSwgMHg4MTY4LCAweDQyOUYsIDB4ODE2OSwgMHg0ODAxLCAweDgxNkIsIDB4MDkxQywKKyAgICAweDgxNkQsIDB4NDJBMCwgMHg4MTZFLCAweDE4NzMsIDB4ODE2RiwgMHg0Q0ZELCAweDgxNzAsIDB4MDgwQSwgMHg4MTcxLAorICAgIDB4MTg3MiwgMHg4MTczLCAweDRDRkUsIDB4ODE3NCwgMHgxODc2LCAweDgxNzgsIDB4MEJDRSwgMHg4MTc5LCAweDBERjIsCisgICAgMHg4MTdBLCAweDBBQTUsIDB4ODE3RiwgMHgwQjNDLCAweDgxODAsIDB4MTg3QSwgMHg4MTgxLCAweDNBQjcsIDB4ODE4MiwKKyAgICAweDE4N0IsIDB4ODE4MywgMHgxODc3LCAweDgxODQsIDB4M0FCOCwgMHg4MTg1LCAweDQ4MDQsIDB4ODE4OCwgMHgxODc4LAorICAgIDB4ODE4QSwgMHgxODc5LCAweDgxOEIsIDB4NENGRiwgMHg4MThGLCAweDA3RTMsIDB4ODE5MCwgMHg0RDAwLCAweDgxOTMsCisgICAgMHgxODgxLCAweDgxOTUsIDB4MTg3RCwgMHg4MTk4LCAweDQ4MDYsIDB4ODE5QSwgMHgwREQ4LCAweDgxOUIsIDB4NEQwMSwKKyAgICAweDgxOUMsIDB4MEU5QSwgMHg4MTlELCAweDBEOUEsIDB4ODE5RSwgMHg0RDAyLCAweDgxQTAsIDB4MTg3QywgMHg4MUEzLAorICAgIDB4MTg3RiwgMHg4MUE0LCAweDE4N0UsIDB4ODFBOCwgMHgwRTcyLCAweDgxQTksIDB4MTg4MiwgMHg4MUIwLCAweDE4ODMsCisgICAgMHg4MUIyLCAweDQ4MDcsIDB4ODFCMywgMHgwQUI5LCAweDgxQjQsIDB4M0FCOSwgMHg4MUI1LCAweDE4ODQsIDB4ODFCOCwKKyAgICAweDE4ODYsIDB4ODFCQSwgMHgxODhBLCAweDgxQkIsIDB4NDJBMSwgMHg4MUJELCAweDE4ODcsIDB4ODFCRSwgMHgxODg1LAorICAgIDB4ODFCRiwgMHgwQ0Y1LCAweDgxQzAsIDB4MTg4OCwgMHg4MUMxLCAweDQ4MDgsIDB4ODFDMiwgMHgxODg5LCAweDgxQzMsCisgICAgMHg0ODA5LCAweDgxQzYsIDB4MDUzMiwgMHg4MUM4LCAweDE4OTAsIDB4ODFDOSwgMHgxODhCLCAweDgxQ0EsIDB4NDJBMiwKKyAgICAweDgxQ0IsIDB4NEQwMywgMHg4MUNELCAweDE4OEMsIDB4ODFDRiwgMHgzQUJBLCAweDgxRDEsIDB4MTg4RCwgMHg4MUQzLAorICAgIDB4MEIwMSwgMHg4MUQ1LCAweDREMDQsIDB4ODFENiwgMHg0ODBBLCAweDgxRDcsIDB4NDJBMywgMHg4MUQ4LCAweDE4OEYsCisgICAgMHg4MUQ5LCAweDE4OEUsIDB4ODFEQSwgMHgxODkxLCAweDgxREIsIDB4NDgwQiwgMHg4MURELCAweDREMDUsIDB4ODFERSwKKyAgICAweDREMDYsIDB4ODFERiwgMHgxODkyLCAweDgxRTAsIDB4MTg5MywgMHg4MUUxLCAweDREMDcsIDB4ODFFMywgMHgwQTA5LAorICAgIDB4ODFFNCwgMHg0ODBELCAweDgxRTUsIDB4MDU2OSwgMHg4MUU3LCAweDE4OTQsIDB4ODFFOCwgMHgwRjlGLCAweDgxRUEsCisgICAgMHgwOEQ3LCAweDgxRUMsIDB4NDgwRiwgMHg4MUVELCAweDA5MzcsIDB4ODFFRiwgMHg0RDA4LCAweDgxRjMsIDB4MDhCOCwKKyAgICAweDgxRjQsIDB4MEI5NSwgMHg4MUY2LCAweDREMDksIDB4ODFGOSwgMHgzQUJCLCAweDgxRkEsIDB4MTg5NSwgMHg4MUZCLAorICAgIDB4MTg5NiwgMHg4MUZDLCAweDA0RDMsIDB4ODFGRCwgMHg0ODEwLCAweDgxRkUsIDB4MTg5NywgMHg4MUZGLCAweDQ4MTEsCisgICAgMHg4MjAwLCAweDREMEEsIDB4ODIwMSwgMHgxODk4LCAweDgyMDIsIDB4MTg5OSwgMHg4MjAzLCAweDNBQkMsIDB4ODIwNCwKKyAgICAweDQ4MTMsIDB4ODIwNSwgMHgxODlBLCAweDgyMDcsIDB4MTg5QiwgMHg4MjA4LCAweDA2QjUsIDB4ODIwOSwgMHgxM0FGLAorICAgIDB4ODIwQSwgMHgxODlDLCAweDgyMEIsIDB4NEQwQiwgMHg4MjBDLCAweDBBODksIDB4ODIwRCwgMHgxODlELCAweDgyMEUsCisgICAgMHgwOEY3LCAweDgyMTAsIDB4MTg5RSwgMHg4MjEyLCAweDEwMDksIDB4ODIxMywgMHg0RDBDLCAweDgyMTQsIDB4NEQwRCwKKyAgICAweDgyMTYsIDB4MTg5RiwgMHg4MjE3LCAweDBFMkUsIDB4ODIxOCwgMHgwNjE4LCAweDgyMTksIDB4NDgxNSwgMHg4MjFBLAorICAgIDB4NEQwRSwgMHg4MjFCLCAweDBBQTYsIDB4ODIxQywgMHgwOTYyLCAweDgyMUUsIDB4MERFMywgMHg4MjFGLCAweDA5MzgsCisgICAgMHg4MjIxLCAweDNBQkQsIDB4ODIyMiwgMHg0ODE2LCAweDgyMjksIDB4MThBMCwgMHg4MjJBLCAweDA3RTQsIDB4ODIyQiwKKyAgICAweDE4QTEsIDB4ODIyQywgMHgwRDYwLCAweDgyMkUsIDB4MThBRiwgMHg4MjMyLCAweDNBQkUsIDB4ODIzMywgMHgxOEEzLAorICAgIDB4ODIzNCwgMHgzQUJGLCAweDgyMzUsIDB4MEIyOSwgMHg4MjM2LCAweDBEMkIsIDB4ODIzNywgMHgwNzczLCAweDgyMzgsCisgICAgMHgxOEEyLCAweDgyMzksIDB4MEFBNywgMHg4MjNBLCAweDREMEYsIDB4ODIzQywgMHg0ODE4LCAweDgyNDAsIDB4MThBNCwKKyAgICAweDgyNDQsIDB4NEQxMCwgMHg4MjQ1LCAweDQ4MUEsIDB4ODI0NiwgMHgzQUMwLCAweDgyNDcsIDB4MEMxNiwgMHg4MjQ5LAorICAgIDB4NDgxOSwgMHg4MjRCLCAweDNBQzEsIDB4ODI0RiwgMHgzQUMyLCAweDgyNTcsIDB4NDgxRSwgMHg4MjU4LCAweDE4QTYsCisgICAgMHg4MjU5LCAweDE4QTUsIDB4ODI1QSwgMHgxOEE4LCAweDgyNUMsIDB4NDgyMCwgMHg4MjVELCAweDE4QTcsIDB4ODI1RiwKKyAgICAweDE4QTksIDB4ODI2MCwgMHg0MkE1LCAweDgyNjIsIDB4MThBQiwgMHg4MjYzLCAweDQ4MjEsIDB4ODI2NCwgMHgxOEFBLAorICAgIDB4ODI2NiwgMHgwNjBCLCAweDgyNjgsIDB4MThBQywgMHg4MjZBLCAweDE4QUQsIDB4ODI2QiwgMHgxOEFFLCAweDgyNkQsCisgICAgMHg0RDExLCAweDgyNkUsIDB4MDgyMSwgMHg4MjZGLCAweDBGOTEsIDB4ODI3MSwgMHgxOEIwLCAweDgyNzIsIDB4MDlFRCwKKyAgICAweDgyNzQsIDB4NDJBNiwgMHg4Mjc2LCAweDA1MTIsIDB4ODI3NywgMHgxOEIxLCAweDgyNzgsIDB4MThCMiwgMHg4Mjc5LAorICAgIDB4Mzc3NSwgMHg4MjdELCAweDQ4MjQsIDB4ODI3RSwgMHgxOEIzLCAweDgyN0YsIDB4NDgyNSwgMHg4MjgzLCAweDQ4MjYsCisgICAgMHg4Mjg0LCAweDREMTIsIDB4ODI4OSwgMHg0RDEzLCAweDgyOEEsIDB4NDgyNywgMHg4MjhCLCAweDA0QjYsIDB4ODI4RCwKKyAgICAweDE4QjQsIDB4ODI4RSwgMHgzQUMzLCAweDgyOTEsIDB4NEQxNCwgMHg4MjkyLCAweDE4QjUsIDB4ODI5MywgMHg0ODI4LAorICAgIDB4ODI5OSwgMHgwREQ5LCAweDgyOUQsIDB4MDhGMywgMHg4MjlGLCAweDE4QjcsIDB4ODJBMSwgMHg0MkE4LCAweDgyQTMsCisgICAgMHg0MkE5LCAweDgyQTQsIDB4NDJBQSwgMHg4MkE1LCAweDA1ODcsIDB4ODJBNiwgMHgwNDc2LCAweDgyQTcsIDB4NDgyOSwKKyAgICAweDgyQTgsIDB4NDgyQSwgMHg4MkE5LCAweDQyQUIsIDB4ODJBQSwgMHg0RDE1LCAweDgyQUIsIDB4MThCNiwgMHg4MkFDLAorICAgIDB4MThCOSwgMHg4MkFELCAweDBEMDQsIDB4ODJBRSwgMHgzQUM0LCAweDgyQUYsIDB4MEEwQSwgMHg4MkIwLCAweDREMTYsCisgICAgMHg4MkIxLCAweDA1NTYsIDB4ODJCMiwgMHg0ODJCLCAweDgyQjMsIDB4MEU1NSwgMHg4MkI0LCAweDQ4MkMsIDB4ODJCNywKKyAgICAweDNBQzUsIDB4ODJCOCwgMHgwNzMzLCAweDgyQjksIDB4MDZENCwgMHg4MkJBLCAweDQ4MkQsIDB4ODJCQiwgMHgxOEI4LAorICAgIDB4ODJCQywgMHg0ODJFLCAweDgyQkQsIDB4MDU2QSwgMHg4MkJFLCAweDNBQzYsIDB4ODJCRiwgMHg0MkFDLCAweDgyQzUsCisgICAgMHgwNURGLCAweDgyQzYsIDB4M0FDNywgMHg4MkQwLCAweDREMTcsIDB4ODJEMSwgMHgwNTEzLCAweDgyRDIsIDB4MThCRCwKKyAgICAweDgyRDMsIDB4MEZCMiwgMHg4MkQ0LCAweDBCM0QsIDB4ODJENSwgMHg0MkFELCAweDgyRDcsIDB4MERCNiwgMHg4MkQ5LAorICAgIDB4MThDOSwgMHg4MkRCLCAweDA1NTcsIDB4ODJEQywgMHgxOEM3LCAweDgyREUsIDB4MThDNSwgMHg4MkRGLCAweDE4QkMsCisgICAgMHg4MkUxLCAweDE4QkEsIDB4ODJFMiwgMHg0ODJGLCAweDgyRTMsIDB4MThCQiwgMHg4MkU1LCAweDA5MEYsIDB4ODJFNiwKKyAgICAweDA2RTQsIDB4ODJFNywgMHgwQkI1LCAweDgyRTgsIDB4NDgzMCwgMHg4MkVBLCAweDREMTgsIDB4ODJFQiwgMHgwQ0E5LAorICAgIDB4ODJFRiwgMHg0RDE5LCAweDgyRjEsIDB4MDRGMywgMHg4MkYzLCAweDE4QkYsIDB4ODJGNCwgMHgxOEJFLCAweDgyRjYsCisgICAgMHg0RDFBLCAweDgyRjcsIDB4NDgzMSwgMHg4MkY5LCAweDE4QzQsIDB4ODJGQSwgMHgxOEMwLCAweDgyRkIsIDB4MThDMywKKyAgICAweDgyRkQsIDB4NDJBRSwgMHg4MkZFLCAweDNBQzgsIDB4ODMwMCwgMHg0MkFGLCAweDgzMDEsIDB4MjE5OCwgMHg4MzAyLAorICAgIDB4MEVEQywgMHg4MzAzLCAweDE4QzIsIDB4ODMwNCwgMHgwNTU4LCAweDgzMDUsIDB4MDVEQiwgMHg4MzA2LCAweDE4QzYsCisgICAgMHg4MzA3LCAweDQ4MzIsIDB4ODMwOCwgMHg0ODMzLCAweDgzMDksIDB4MThDOCwgMHg4MzBDLCAweDQ4MzQsIDB4ODMwRSwKKyAgICAweDA3MkEsIDB4ODMxNiwgMHgxOENDLCAweDgzMTcsIDB4MThENSwgMHg4MzE4LCAweDE4RDYsIDB4ODMxQiwgMHg0ODM2LAorICAgIDB4ODMxQywgMHgwNDZGLCAweDgzMUQsIDB4NDgzNywgMHg4MzIyLCAweDQyQjAsIDB4ODMyMywgMHgxOERELCAweDgzMjgsCisgICAgMHgwNEI1LCAweDgzMkIsIDB4MThENCwgMHg4MzJELCAweDQyQjEsIDB4ODMyRiwgMHgxOEQzLCAweDgzMzAsIDB4NDgzOCwKKyAgICAweDgzMzEsIDB4MThDRSwgMHg4MzMyLCAweDE4Q0QsIDB4ODMzNCwgMHgxOENCLCAweDgzMzUsIDB4MThDQSwgMHg4MzM2LAorICAgIDB4MEJBMSwgMHg4MzM4LCAweDBCNUIsIDB4ODMzOSwgMHgxOEQwLCAweDgzM0EsIDB4NDJCMiwgMHg4MzNDLCAweDQ4MzksCisgICAgMHg4MzQwLCAweDE4Q0YsIDB4ODM0MywgMHgzQUM5LCAweDgzNDQsIDB4NDgzQSwgMHg4MzQ1LCAweDE4RDIsIDB4ODM0NiwKKyAgICAweDFERjgsIDB4ODM0NywgMHg0MkIzLCAweDgzNDksIDB4MEFGMiwgMHg4MzRBLCAweDA3MkIsIDB4ODM0RiwgMHgwNEUzLAorICAgIDB4ODM1MCwgMHgxOEQxLCAweDgzNTEsIDB4M0FDQSwgMHg4MzUyLCAweDA3RTUsIDB4ODM1NCwgMHg0ODM1LCAweDgzNTUsCisgICAgMHgzQUNCLCAweDgzNTYsIDB4NEQxQiwgMHg4MzU3LCAweDQ4M0IsIDB4ODM1OCwgMHgwQUYzLCAweDgzNUEsIDB4Mzc3QSwKKyAgICAweDgzNjIsIDB4MjE5OSwgMHg4MzYzLCAweDQ1NkYsIDB4ODM3MywgMHgxOEUzLCAweDgzNzUsIDB4MThFNCwgMHg4Mzc3LAorICAgIDB4MDU1OSwgMHg4Mzc4LCAweDREMUMsIDB4ODM3QiwgMHgwNTJFLCAweDgzN0MsIDB4MThFMSwgMHg4MzdELCAweDQyQjQsCisgICAgMHg4MzdGLCAweDIxOUEsIDB4ODM4NSwgMHgxOEQ3LCAweDgzODYsIDB4M0FDQywgMHg4Mzg3LCAweDE4REYsIDB4ODM4OSwKKyAgICAweDE4RTYsIDB4ODM4QSwgMHgxOEUwLCAweDgzOEQsIDB4M0FDRCwgMHg4MzhFLCAweDE4REUsIDB4ODM5MiwgMHgzQUNFLAorICAgIDB4ODM5MywgMHgxOEMxLCAweDgzOTQsIDB4NDgzRiwgMHg4Mzk1LCAweDQ4NDAsIDB4ODM5NiwgMHgxOERDLCAweDgzOTgsCisgICAgMHgzQUNGLCAweDgzOUEsIDB4MThEOCwgMHg4MzlCLCAweDQ4NDEsIDB4ODM5RCwgMHg0ODQyLCAweDgzOUUsIDB4MDYwQywKKyAgICAweDgzOUYsIDB4MThEQSwgMHg4M0EwLCAweDE4RTUsIDB4ODNBMiwgMHgxOERCLCAweDgzQTcsIDB4NDJCNSwgMHg4M0E4LAorICAgIDB4MThFNywgMHg4M0E5LCAweDNBRDAsIDB4ODNBQSwgMHgxOEQ5LCAweDgzQUIsIDB4MEQzMiwgMHg4M0IxLCAweDBGNTMsCisgICAgMHg4M0I1LCAweDE4RTIsIDB4ODNCRCwgMHgxOEY4LCAweDgzQkYsIDB4M0FEMSwgMHg4M0MwLCAweDNBRDIsIDB4ODNDMSwKKyAgICAweDE4RjAsIDB4ODNDNSwgMHgwQTQxLCAweDgzQzcsIDB4MjE5QiwgMHg4M0M5LCAweDQ4NDMsIDB4ODNDQSwgMHgwNjYwLAorICAgIDB4ODNDQywgMHgwNkQ1LCAweDgzQ0UsIDB4MThFQiwgMHg4M0NGLCAweDQyQjYsIDB4ODNEMCwgMHg0ODQ0LCAweDgzRDEsCisgICAgMHg0MkI3LCAweDgzRDMsIDB4MDU1QiwgMHg4M0Q0LCAweDQ4NDUsIDB4ODNENiwgMHgwOUJDLCAweDgzRDgsIDB4MThFRSwKKyAgICAweDgzREMsIDB4MDg0QSwgMHg4M0RELCAweDQ4NDYsIDB4ODNERiwgMHgwQzRCLCAweDgzRTAsIDB4MThGMywgMHg4M0UxLAorICAgIDB4NDJCOCwgMHg4M0U1LCAweDQ4NDcsIDB4ODNFOSwgMHgwRTNFLCAweDgzRUEsIDB4M0FEMywgMHg4M0VCLCAweDE4RUEsCisgICAgMHg4M0VGLCAweDA1NUEsIDB4ODNGMCwgMHgwNzhBLCAweDgzRjEsIDB4MEQ5QiwgMHg4M0YyLCAweDE4RjQsIDB4ODNGNCwKKyAgICAweDE4RTgsIDB4ODNGNiwgMHgyMTlDLCAweDgzRjcsIDB4MThGMSwgMHg4M0Y4LCAweDREMUQsIDB4ODNGOSwgMHg0ODQ4LAorICAgIDB4ODNGQiwgMHgxOEZCLCAweDgzRkMsIDB4NEQxRSwgMHg4M0ZELCAweDE4RUMsIDB4ODQwMSwgMHg0MkI5LCAweDg0MDMsCisgICAgMHgxOEVELCAweDg0MDQsIDB4MEM5MiwgMHg4NDA2LCAweDQyQkEsIDB4ODQwNywgMHgxOEYyLCAweDg0MEEsIDB4MUU3RiwKKyAgICAweDg0MEIsIDB4MThFRiwgMHg4NDBDLCAweDBFNTYsIDB4ODQwRCwgMHgxOEY1LCAweDg0MEUsIDB4MDRBNCwgMHg4NDBGLAorICAgIDB4M0FENCwgMHg4NDExLCAweDNBRDUsIDB4ODQxMywgMHgxOEU5LCAweDg0MTUsIDB4NDg0OSwgMHg4NDE3LCAweDQ4NEIsCisgICAgMHg4NDIwLCAweDE4RjcsIDB4ODQyMiwgMHgxOEY2LCAweDg0MjksIDB4MEQyMSwgMHg4NDJBLCAweDE4RkQsIDB4ODQyQywKKyAgICAweDE5MDgsIDB4ODQzMSwgMHgwNURDLCAweDg0MzUsIDB4MTkwQiwgMHg4NDM4LCAweDE4RjksIDB4ODQzOSwgMHg0ODRDLAorICAgIDB4ODQzQywgMHgxOEZFLCAweDg0M0QsIDB4MEY1OCwgMHg4NDQ2LCAweDE5MDcsIDB4ODQ0OCwgMHgyMTlELCAweDg0NDksCisgICAgMHgwRjNGLCAweDg0NEEsIDB4M0FENiwgMHg4NDRFLCAweDBGNzIsIDB4ODQ0RiwgMHg0ODRELCAweDg0NTEsIDB4NDg0RSwKKyAgICAweDg0NTIsIDB4NDg0RiwgMHg4NDU3LCAweDBCQjYsIDB4ODQ1OCwgMHg0RDFGLCAweDg0NTksIDB4NDg1MCwgMHg4NDVBLAorICAgIDB4NDg1MSwgMHg4NDVCLCAweDA1QzksIDB4ODQ1QywgMHg0ODUyLCAweDg0NUYsIDB4NDJCQiwgMHg4NDYxLCAweDBERTQsCisgICAgMHg4NDYyLCAweDE5MEQsIDB4ODQ2MywgMHgwQzc5LCAweDg0NjUsIDB4NDg1NCwgMHg4NDY2LCAweDA0NzUsIDB4ODQ2OSwKKyAgICAweDE5MDYsIDB4ODQ2QiwgMHgxOTAyLCAweDg0NkMsIDB4MEFGNCwgMHg4NDZELCAweDE4RkMsIDB4ODQ2RSwgMHgxOTA0LAorICAgIDB4ODQ2RiwgMHgxOTA5LCAweDg0NzAsIDB4NDJCQywgMHg4NDcxLCAweDBDRTIsIDB4ODQ3MywgMHg0MkJELCAweDg0NzUsCisgICAgMHgwNDZFLCAweDg0NzYsIDB4M0FENywgMHg4NDc3LCAweDE5MDEsIDB4ODQ3OCwgMHg0ODU1LCAweDg0NzksIDB4MTkwQSwKKyAgICAweDg0N0EsIDB4MERFQSwgMHg4NDdDLCAweDQ4NTYsIDB4ODQ4MSwgMHg0ODU3LCAweDg0ODIsIDB4MTkwNSwgMHg4NDg0LAorICAgIDB4MTkwMCwgMHg4NDg1LCAweDQyQkUsIDB4ODQ4QiwgMHgwOUJELCAweDg0OTAsIDB4MDkzOSwgMHg4NDkzLCAweDREMjAsCisgICAgMHg4NDk0LCAweDA4RDgsIDB4ODQ5NywgMHg0ODU5LCAweDg0OTksIDB4MEVFNCwgMHg4NDlDLCAweDBEQjksIDB4ODQ5RSwKKyAgICAweDQyQkYsIDB4ODQ5RiwgMHgxOTEwLCAweDg0QTEsIDB4MTkxOSwgMHg4NEE2LCAweDQ4NUEsIDB4ODRBOCwgMHgzQUQ4LAorICAgIDB4ODRBRCwgMHgxOTAzLCAweDg0QUYsIDB4M0FEOSwgMHg4NEIxLCAweDREMjEsIDB4ODRCMiwgMHgwNUQ1LCAweDg0QjQsCisgICAgMHgyMTlFLCAweDg0QjgsIDB4MDlFMCwgMHg4NEI5LCAweDE5MEUsIDB4ODRCQSwgMHg0MkMwLCAweDg0QkIsIDB4MTkxMywKKyAgICAweDg0QkMsIDB4MEFGNSwgMHg4NEJELCAweDREMjIsIDB4ODRCRSwgMHg0ODVCLCAweDg0QkYsIDB4MTkwRiwgMHg4NEMwLAorICAgIDB4M0FEQSwgMHg4NEMxLCAweDE5MTYsIDB4ODRDMiwgMHgzQURCLCAweDg0QzQsIDB4MEI5RCwgMHg4NEM2LCAweDE5MTcsCisgICAgMHg4NEM5LCAweDBGNDAsIDB4ODRDQSwgMHgxOTBDLCAweDg0Q0IsIDB4MDU5NiwgMHg4NENELCAweDE5MTIsIDB4ODRDRSwKKyAgICAweDQ4NUQsIDB4ODRDRiwgMHg0ODVFLCAweDg0RDAsIDB4MTkxNSwgMHg4NEQxLCAweDBFQjgsIDB4ODREMywgMHg0ODVGLAorICAgIDB4ODRENiwgMHgxOTE4LCAweDg0RDksIDB4MTkxMSwgMHg4NERBLCAweDE5MTQsIDB4ODREQywgMHgyMEFCLCAweDg0RTcsCisgICAgMHg0ODYxLCAweDg0RUEsIDB4NDg2MiwgMHg4NEVDLCAweDBFNTcsIDB4ODRFRSwgMHgwRkM3LCAweDg0RUYsIDB4NDg2MywKKyAgICAweDg0RjAsIDB4M0FEQywgMHg4NEYxLCAweDQ4NjQsIDB4ODRGNCwgMHgxOTFDLCAweDg0RkEsIDB4NDg2NSwgMHg4NEZCLAorICAgIDB4NEQyMywgMHg4NEZDLCAweDE5MjMsIDB4ODRGRCwgMHgzQURELCAweDg0RkYsIDB4MTkxQiwgMHg4NTAwLCAweDA4RUYsCisgICAgMHg4NTA2LCAweDE4RkEsIDB4ODUwQywgMHgzQURFLCAweDg1MTEsIDB4MEUxRSwgMHg4NTEzLCAweDBFQUUsIDB4ODUxNCwKKyAgICAweDE5MjIsIDB4ODUxNSwgMHgxOTIxLCAweDg1MTcsIDB4MTkxRCwgMHg4NTE4LCAweDE5MUUsIDB4ODUxQSwgMHgwNEQ4LAorICAgIDB4ODUxQiwgMHg0ODY2LCAweDg1MUUsIDB4NDJDMywgMHg4NTFGLCAweDE5MjAsIDB4ODUyMSwgMHgxOTFBLCAweDg1MjMsCisgICAgMHgxRTFBLCAweDg1MjQsIDB4NDg2NywgMHg4NTI1LCAweDQ4NjgsIDB4ODUyNiwgMHgwQkYxLCAweDg1MkIsIDB4NDg2OSwKKyAgICAweDg1MkMsIDB4MTkxRiwgMHg4NTJELCAweDA0QzIsIDB4ODUyRiwgMHg0MkM0LCAweDg1MzIsIDB4NDJDMiwgMHg4NTM0LAorICAgIDB4M0FERiwgMHg4NTM1LCAweDBCMDIsIDB4ODUzRCwgMHgwRTEzLCAweDg1M0UsIDB4MUVCNSwgMHg4NTQwLCAweDE5MjQsCisgICAgMHg4NTQxLCAweDE5MjgsIDB4ODU0MywgMHgwRDZELCAweDg1NDYsIDB4NEQyNCwgMHg4NTQ4LCAweDE5MjcsIDB4ODU0OSwKKyAgICAweDA5QkUsIDB4ODU0QSwgMHgwOEY1LCAweDg1NEIsIDB4MTkyQSwgMHg4NTRFLCAweDA2QjYsIDB4ODU0RiwgMHg0ODZBLAorICAgIDB4ODU1MSwgMHg0ODZELCAweDg1NTMsIDB4MjE5RiwgMHg4NTU1LCAweDE5MkIsIDB4ODU1NiwgMHg0RDI1LCAweDg1NTcsCisgICAgMHgwREVCLCAweDg1NTgsIDB4MTkyNiwgMHg4NTU5LCAweDIxQTAsIDB4ODU1QSwgMHgxOEZGLCAweDg1NUQsIDB4NEQyNiwKKyAgICAweDg1NUUsIDB4M0FFMCwgMHg4NTYxLCAweDQ4NkUsIDB4ODU2MiwgMHg0ODZGLCAweDg1NjMsIDB4MTkyNSwgMHg4NTY0LAorICAgIDB4NDJDNSwgMHg4NTY4LCAweDBGRjUsIDB4ODU2OSwgMHgwQzdBLCAweDg1NkEsIDB4MERFNSwgMHg4NTZCLCAweDIxQTEsCisgICAgMHg4NTZELCAweDE5MzIsIDB4ODU2RiwgMHg0ODZCLCAweDg1NzcsIDB4MTkzOCwgMHg4NTdBLCAweDQyQzYsIDB4ODU3QiwKKyAgICAweDQ4NzEsIDB4ODU3RCwgMHg0ODcyLCAweDg1N0UsIDB4MTkzOSwgMHg4NTdGLCAweDQ4NzMsIDB4ODU4MCwgMHgxOTJDLAorICAgIDB4ODU4MSwgMHg0ODc0LCAweDg1ODQsIDB4MEQyQywgMHg4NTg1LCAweDREMjcsIDB4ODU4NiwgMHg0ODc1LCAweDg1ODcsCisgICAgMHgxOTM2LCAweDg1ODgsIDB4MTkyRSwgMHg4NThBLCAweDE5MzAsIDB4ODU4QywgMHg0MkM3LCAweDg1OEYsIDB4M0FFMSwKKyAgICAweDg1OTAsIDB4MTkzQSwgMHg4NTkxLCAweDE5MkYsIDB4ODU5MywgMHg0ODc2LCAweDg1OTQsIDB4MTkzMywgMHg4NTk3LAorICAgIDB4MDUxNCwgMHg4NTk4LCAweDREMjgsIDB4ODU5OSwgMHgwQ0JELCAweDg1OUIsIDB4MTkzNCwgMHg4NTlDLCAweDE5MzcsCisgICAgMHg4NTlELCAweDQ4NzcsIDB4ODU5RiwgMHg0ODc4LCAweDg1QTIsIDB4NDJDOCwgMHg4NUE0LCAweDE5MkQsIDB4ODVBNiwKKyAgICAweDBBQTgsIDB4ODVBOCwgMHgxOTMxLCAweDg1QTksIDB4MDg3NSwgMHg4NUFBLCAweDBBMEIsIDB4ODVBQiwgMHgwNzA2LAorICAgIDB4ODVBQywgMHgwRjAwLCAweDg1QUQsIDB4M0FFNCwgMHg4NUFFLCAweDBGMDUsIDB4ODVBRiwgMHgwOTdDLCAweDg1QjAsCisgICAgMHgyMUEzLCAweDg1QjcsIDB4M0FFMiwgMHg4NUI5LCAweDE5M0UsIDB4ODVCQSwgMHgxOTNDLCAweDg1QkMsIDB4NDg3QywKKyAgICAweDg1QzEsIDB4MEZGNCwgMHg4NUM3LCAweDQ4N0QsIDB4ODVDOSwgMHgxOTNCLCAweDg1Q0EsIDB4NDg3RSwgMHg4NUNCLAorICAgIDB4NDJDOSwgMHg4NUNELCAweDBGNUYsIDB4ODVDRSwgMHgzQUUzLCAweDg1Q0YsIDB4MTkzRCwgMHg4NUQwLCAweDE5M0YsCisgICAgMHg4NUQ1LCAweDE5NDAsIDB4ODVEOCwgMHg0ODdGLCAweDg1RDksIDB4NDg4MCwgMHg4NURDLCAweDE5NDMsIDB4ODVERCwKKyAgICAweDE5NDEsIDB4ODVERiwgMHg0ODgxLCAweDg1RTEsIDB4NDg4MiwgMHg4NUU0LCAweDBDN0IsIDB4ODVFNSwgMHgxOTQyLAorICAgIDB4ODVFNiwgMHg0ODgzLCAweDg1RTksIDB4MEQ2MSwgMHg4NUVBLCAweDE5MzUsIDB4ODVFRCwgMHg0MkNBLCAweDg1RjQsCisgICAgMHgzNzgwLCAweDg1RjYsIDB4NDg4NCwgMHg4NUY3LCAweDA5N0QsIDB4ODVGOSwgMHgxOTQ0LCAweDg1RkEsIDB4MTk0OSwKKyAgICAweDg1RkIsIDB4MEFGNiwgMHg4NUZFLCAweDE5NDgsIDB4ODVGRiwgMHg0MkNCLCAweDg2MDAsIDB4NDg4NSwgMHg4NjAyLAorICAgIDB4MTkyOSwgMHg4NjA0LCAweDQyQ0MsIDB4ODYwNSwgMHg0MkNELCAweDg2MDYsIDB4MTk0QSwgMHg4NjA3LCAweDBBQ0IsCisgICAgMHg4NjBBLCAweDE5NDUsIDB4ODYwQiwgMHgxOTQ3LCAweDg2MTAsIDB4NDJDRSwgMHg4NjExLCAweDQ4ODYsIDB4ODYxMiwKKyAgICAweDNBRTUsIDB4ODYxMywgMHgxOTQ2LCAweDg2MTYsIDB4MTREMCwgMHg4NjE3LCAweDE0QzEsIDB4ODYxOCwgMHg0MkQwLAorICAgIDB4ODYxQSwgMHgxOTRDLCAweDg2MUUsIDB4NDg4NywgMHg4NjIxLCAweDQ4ODgsIDB4ODYyMiwgMHgxOTRCLCAweDg2MjQsCisgICAgMHg0ODg5LCAweDg2MjcsIDB4NDg4QSwgMHg4NjI5LCAweDNBRTYsIDB4ODYyRCwgMHgwRjYwLCAweDg2MkYsIDB4MTZCMSwKKyAgICAweDg2MzAsIDB4MTk0RCwgMHg4NjM4LCAweDQyRDEsIDB4ODYzOSwgMHg0ODhDLCAweDg2M0MsIDB4NDg4RCwgMHg4NjNGLAorICAgIDB4MTk0RSwgMHg4NjQwLCAweDQ4OEYsIDB4ODY0MSwgMHg0MUI4LCAweDg2NDIsIDB4NEQyOSwgMHg4NjQ2LCAweDREMkEsCisgICAgMHg4NjRELCAweDE5NEYsIDB4ODY0RSwgMHgwNzhCLCAweDg2NTAsIDB4MDY2RSwgMHg4NjUyLCAweDNBRTcsIDB4ODY1MywKKyAgICAweDQ4OTAsIDB4ODY1NCwgMHgxOTUxLCAweDg2NTUsIDB4MTA5NCwgMHg4NjU2LCAweDQ4OTEsIDB4ODY1NywgMHg0MkQyLAorICAgIDB4ODY1QSwgMHgwNjhGLCAweDg2NUIsIDB4MzQxOCwgMHg4NjVDLCAweDBGODIsIDB4ODY1RSwgMHgwNkVCLCAweDg2NUYsCisgICAgMHgxOTUyLCAweDg2NjIsIDB4NDJEMywgMHg4NjYzLCAweDNBRTgsIDB4ODY2NywgMHgxOTUzLCAweDg2NkIsIDB4MEJBQywKKyAgICAweDg2NkMsIDB4M0FFOSwgMHg4NjZGLCAweDNBRUEsIDB4ODY3MSwgMHgxOTU0LCAweDg2NzUsIDB4NDJENSwgMHg4Njc3LAorICAgIDB4NDg5MiwgMHg4Njc5LCAweDBDRDIsIDB4ODY3QSwgMHgzQUVCLCAweDg2N0IsIDB4MDQ3RSwgMHg4NjdELCAweDM3ODYsCisgICAgMHg4Njg3LCAweDQ4OTMsIDB4ODY4OSwgMHg0ODk0LCAweDg2OEEsIDB4MDU2MywgMHg4NjhCLCAweDE5NTksIDB4ODY4QywKKyAgICAweDE5NUEsIDB4ODY4RCwgMHgzQUVDLCAweDg2OTEsIDB4M0FFRCwgMHg4NjkzLCAweDE5NTUsIDB4ODY5NSwgMHgwODhCLAorICAgIDB4ODY5OCwgMHgzQUVFLCAweDg2OUMsIDB4NDg5NSwgMHg4NjlELCAweDQ4OTYsIDB4ODZBMywgMHgxOTU2LCAweDg2QTQsCisgICAgMHgwQ0Y4LCAweDg2QTcsIDB4M0FFRiwgMHg4NkE4LCAweDNBRjAsIDB4ODZBOSwgMHgxOTU3LCAweDg2QUEsIDB4MTk1OCwKKyAgICAweDg2QUIsIDB4MTk2MiwgMHg4NkFGLCAweDE5NUMsIDB4ODZCMCwgMHgxOTVGLCAweDg2QjEsIDB4NDg5NywgMHg4NkIzLAorICAgIDB4NDg5OCwgMHg4NkI2LCAweDE5NUIsIDB4ODZCOCwgMHg0MkQ2LCAweDg2QzAsIDB4NEQyQiwgMHg4NkMxLCAweDQ4OTksCisgICAgMHg4NkMzLCAweDQ4OUEsIDB4ODZDNCwgMHgxOTVELCAweDg2QzYsIDB4MTk1RSwgMHg4NkM3LCAweDA5MDQsIDB4ODZDOSwKKyAgICAweDE5NjAsIDB4ODZDQiwgMHgwQjdGLCAweDg2Q0QsIDB4MDcyQywgMHg4NkNFLCAweDA1QTAsIDB4ODZEMSwgMHg0ODlCLAorICAgIDB4ODZENCwgMHgxOTYzLCAweDg2RDUsIDB4NDg5QywgMHg4NkQ3LCAweDQ4OUQsIDB4ODZEOSwgMHgwNTlELCAweDg2REIsCisgICAgMHgxOTY4LCAweDg2REUsIDB4MTk2NCwgMHg4NkRGLCAweDE5NjcsIDB4ODZFMywgMHg0ODlFLCAweDg2RTQsIDB4MEQ0RSwKKyAgICAweDg2RTYsIDB4NDg5RiwgMHg4NkU5LCAweDE5NjUsIDB4ODZFQywgMHgxOTY2LCAweDg2RUQsIDB4MERCQSwgMHg4NkVFLAorICAgIDB4MEQ2RSwgMHg4NkVGLCAweDE5NjksIDB4ODZGOCwgMHgwQjVELCAweDg2RjksIDB4MTk3MywgMHg4NkZBLCAweDNBRjEsCisgICAgMHg4NkZCLCAweDE5NkYsIDB4ODZGQywgMHg0MkQ3LCAweDg2RkQsIDB4M0FGMiwgMHg4NkZFLCAweDA1NkIsIDB4ODcwMCwKKyAgICAweDE5NkQsIDB4ODcwMiwgMHgwRTU4LCAweDg3MDMsIDB4MTk2RSwgMHg4NzA1LCAweDQ4QTEsIDB4ODcwNiwgMHgxOTZCLAorICAgIDB4ODcwNywgMHg0OEEyLCAweDg3MDgsIDB4MTk2QywgMHg4NzA5LCAweDE5NzEsIDB4ODcwQSwgMHgxOTc0LCAweDg3MEIsCisgICAgMHgzQUYzLCAweDg3MEQsIDB4MTk3MiwgMHg4NzBFLCAweDQ4QTMsIDB4ODcxMCwgMHg0OEE0LCAweDg3MTEsIDB4MTk3MCwKKyAgICAweDg3MTIsIDB4MTk2QSwgMHg4NzEzLCAweDNBRjQsIDB4ODcxNCwgMHg0RDJDLCAweDg3MTgsIDB4MEI5NiwgMHg4NzE5LAorICAgIDB4M0FGNSwgMHg4NzFBLCAweDE5N0IsIDB4ODcxQywgMHgwRUI2LCAweDg3MUUsIDB4M0FGNiwgMHg4NzFGLCAweDQ4QTUsCisgICAgMHg4NzIxLCAweDQ4QTYsIDB4ODcyMiwgMHg0RDJELCAweDg3MjMsIDB4NDhBNywgMHg4NzI1LCAweDE5NzksIDB4ODcyOCwKKyAgICAweDNBRjcsIDB4ODcyOSwgMHgxOTdBLCAweDg3MkUsIDB4NEQyRSwgMHg4NzMxLCAweDQ4QTgsIDB4ODczNCwgMHgxOTc1LAorICAgIDB4ODczNywgMHgxOTc3LCAweDg3MzksIDB4NEQyRiwgMHg4NzNBLCAweDQ4QTksIDB4ODczQiwgMHgxOTc4LCAweDg3M0UsCisgICAgMHgzQUY4LCAweDg3M0YsIDB4MTk3NiwgMHg4NzQwLCAweDQ4QUEsIDB4ODc0MywgMHg0OEFCLCAweDg3NDksIDB4MEE4QSwKKyAgICAweDg3NEIsIDB4MEZERiwgMHg4NzRDLCAweDE5N0YsIDB4ODc0RSwgMHgxOTgwLCAweDg3NTEsIDB4NDhBQywgMHg4NzUzLAorICAgIDB4MTk4NiwgMHg4NzU1LCAweDA5RjAsIDB4ODc1NywgMHgxOTgyLCAweDg3NTgsIDB4NDhBRCwgMHg4NzU5LCAweDE5ODUsCisgICAgMHg4NzVELCAweDREMzAsIDB4ODc1RiwgMHgxOTdELCAweDg3NjAsIDB4MTk3QywgMHg4NzYzLCAweDE5ODcsIDB4ODc2NCwKKyAgICAweDQ4QUUsIDB4ODc2NSwgMHg0OEFGLCAweDg3NjYsIDB4MDU1QywgMHg4NzY4LCAweDE5ODMsIDB4ODc2QSwgMHgxOTg4LAorICAgIDB4ODc2RSwgMHgxOTg0LCAweDg3NzEsIDB4M0FGOSwgMHg4NzcyLCAweDQ4QjAsIDB4ODc3NCwgMHgxOTgxLCAweDg3NzYsCisgICAgMHgwQkNGLCAweDg3NzgsIDB4MTk3RSwgMHg4NzdCLCAweDREMzEsIDB4ODc3QywgMHg0OEIxLCAweDg3N0YsIDB4MEQxRSwKKyAgICAweDg3ODIsIDB4MTk4QywgMHg4Nzg3LCAweDQyRDgsIDB4ODc4OCwgMHgzQUZBLCAweDg3ODksIDB4NDhCNSwgMHg4NzhCLAorICAgIDB4NDhCNiwgMHg4NzhDLCAweDREMzIsIDB4ODc4RCwgMHgwRjI1LCAweDg3OEUsIDB4NEQzMywgMHg4NzkzLCAweDQ4QjcsCisgICAgMHg4Nzk3LCAweDREMzQsIDB4ODc5OCwgMHg0RDM1LCAweDg3OTksIDB4M0FGQiwgMHg4NzlFLCAweDREMzYsIDB4ODc5RiwKKyAgICAweDE5OEIsIDB4ODdBMCwgMHg0OEI4LCAweDg3QTIsIDB4MTk4QSwgMHg4N0EzLCAweDREMzcsIDB4ODdBNywgMHg0OEI0LAorICAgIDB4ODdBQiwgMHgxOTkzLCAweDg3QUMsIDB4M0FGQywgMHg4N0FELCAweDNBRkQsIDB4ODdBRSwgMHg0RDM4LCAweDg3QUYsCisgICAgMHgxOThELCAweDg3QjMsIDB4MTk5NSwgMHg4N0I1LCAweDNBRkUsIDB4ODdCQSwgMHgwRjUwLCAweDg3QkIsIDB4MTk5OCwKKyAgICAweDg3QkQsIDB4MTk4RiwgMHg4N0JFLCAweDQ4QkIsIDB4ODdCRiwgMHg0RDM5LCAweDg3QzAsIDB4MTk5MCwgMHg4N0MxLAorICAgIDB4NDhCRCwgMHg4N0M0LCAweDE5OTQsIDB4ODdDNiwgMHgxOTk3LCAweDg3QzcsIDB4MTk5NiwgMHg4N0M5LCAweDREM0EsCisgICAgMHg4N0NCLCAweDE5OEUsIDB4ODdDRSwgMHg0OEJFLCAweDg3RDAsIDB4MTk5MSwgMHg4N0QyLCAweDE5QTIsIDB4ODdENiwKKyAgICAweDNBRkYsIDB4ODdEQSwgMHg0RDNCLCAweDg3REYsIDB4NDhCRiwgMHg4N0UwLCAweDE5OUIsIDB4ODdFMywgMHg0OEMxLAorICAgIDB4ODdFNSwgMHg0OEMyLCAweDg3RTYsIDB4NDhDMywgMHg4N0VBLCAweDQ4QzQsIDB4ODdFQiwgMHgzQjAwLCAweDg3RUMsCisgICAgMHgxRTIzLCAweDg3RUQsIDB4M0IwMSwgMHg4N0VGLCAweDE5OTksIDB4ODdGMiwgMHgxOTlBLCAweDg3RjUsIDB4M0MzRCwKKyAgICAweDg3RjYsIDB4MTk5RiwgMHg4N0Y3LCAweDE5QTAsIDB4ODdGOSwgMHgwNTg4LCAweDg3RkIsIDB4MDY1QywgMHg4N0ZFLAorICAgIDB4MTk5RSwgMHg4ODAxLCAweDNCMDIsIDB4ODgwMywgMHg0RjU4LCAweDg4MDUsIDB4MTk4OSwgMHg4ODA2LCAweDNCMDQsCisgICAgMHg4ODA3LCAweDIxQTYsIDB4ODgwQSwgMHg0MkRBLCAweDg4MEIsIDB4M0IwNSwgMHg4ODBELCAweDE5OUQsIDB4ODgwRSwKKyAgICAweDE5QTEsIDB4ODgwRiwgMHgxOTlDLCAweDg4MTAsIDB4NDJEQiwgMHg4ODExLCAweDE5QTMsIDB4ODgxMywgMHg0OEM1LAorICAgIDB4ODgxNCwgMHgzQjA2LCAweDg4MTUsIDB4MTlBNSwgMHg4ODE2LCAweDE5QTQsIDB4ODgxOCwgMHg0RDNDLCAweDg4MUIsCisgICAgMHg0RDNELCAweDg4MUMsIDB4M0IwNywgMHg4ODFGLCAweDFFODUsIDB4ODgyMSwgMHgxOUE3LCAweDg4MjIsIDB4MTlBNiwKKyAgICAweDg4MjMsIDB4MTk2MSwgMHg4ODI3LCAweDE5QUIsIDB4ODgyOCwgMHg0OEM2LCAweDg4MkQsIDB4NEQzRSwgMHg4ODJFLAorICAgIDB4NDhDNywgMHg4ODMxLCAweDE5QTgsIDB4ODgzMiwgMHg0OEM4LCAweDg4MzYsIDB4MTlBOSwgMHg4ODM5LCAweDE5QUEsCisgICAgMHg4ODNBLCAweDREM0YsIDB4ODgzQiwgMHgxOUFDLCAweDg4M0MsIDB4NDhDOSwgMHg4ODQwLCAweDA3NDIsIDB4ODg0MiwKKyAgICAweDE5QUUsIDB4ODg0NCwgMHgxOUFELCAweDg4NDUsIDB4NEQ0MCwgMHg4ODQ2LCAweDA5M0EsIDB4ODg0QSwgMHg0OENCLAorICAgIDB4ODg0QiwgMHg0RDQxLCAweDg4NEMsIDB4MDdFNiwgMHg4ODRELCAweDE1MjQsIDB4ODg0RSwgMHg0RDQyLCAweDg4NTIsCisgICAgMHgxOUFGLCAweDg4NTMsIDB4MDk1QiwgMHg4ODU1LCAweDRENDMsIDB4ODg1NiwgMHgzQjA4LCAweDg4NTcsIDB4MDU5NywKKyAgICAweDg4NTgsIDB4NDhDQywgMHg4ODU5LCAweDE5QjAsIDB4ODg1QSwgMHg0RDQ0LCAweDg4NUIsIDB4MDRGNCwgMHg4ODVELAorICAgIDB4MDlCRiwgMHg4ODVFLCAweDE5QjEsIDB4ODg1RiwgMHgzQjA5LCAweDg4NjEsIDB4MDdFNywgMHg4ODYyLCAweDE5QjIsCisgICAgMHg4ODYzLCAweDA0QTUsIDB4ODg2NCwgMHgzQjBBLCAweDg4NjgsIDB4MERBRiwgMHg4ODY5LCAweDQ4Q0YsIDB4ODg2QiwKKyAgICAweDE5QjMsIDB4ODg2RSwgMHg0RDQ1LCAweDg4NkYsIDB4NDhEMSwgMHg4ODcwLCAweDBBMzAsIDB4ODg3MiwgMHgxOUJBLAorICAgIDB4ODg3NSwgMHgxOUI3LCAweDg4NzcsIDB4MEJBRCwgMHg4ODdELCAweDE5QjgsIDB4ODg3RSwgMHgxOUI1LCAweDg4N0YsCisgICAgMHgwNkQ2LCAweDg4ODEsIDB4MTlCNCwgMHg4ODgyLCAweDE5QkIsIDB4ODg4OCwgMHgwNzBDLCAweDg4OEIsIDB4MEIzRSwKKyAgICAweDg4OEQsIDB4MTlDMSwgMHg4ODkyLCAweDE5QkQsIDB4ODg5NiwgMHgwQjE1LCAweDg4OTcsIDB4MTlCQywgMHg4ODk4LAorICAgIDB4M0IwQiwgMHg4ODk5LCAweDE5QkYsIDB4ODg5QSwgMHg0RDQ2LCAweDg4OUIsIDB4NEQ0NywgMHg4ODlDLCAweDRENDgsCisgICAgMHg4ODlFLCAweDE5QjYsIDB4ODhBMCwgMHg0OEQyLCAweDg4QTIsIDB4MTlDMCwgMHg4OEE0LCAweDE5QzIsIDB4ODhBQSwKKyAgICAweDNCMEMsIDB4ODhBQiwgMHgwRDgzLCAweDg4QUUsIDB4MTlCRSwgMHg4OEIwLCAweDE5QzMsIDB4ODhCMSwgMHgxOUM1LAorICAgIDB4ODhCNCwgMHgwNzg3LCAweDg4QjUsIDB4MTlCOSwgMHg4OEI3LCAweDA0ODUsIDB4ODhCQywgMHg0OEQzLCAweDg4QkQsCisgICAgMHgzQjBELCAweDg4QkUsIDB4M0IwRSwgMHg4OEJGLCAweDE5QzQsIDB4ODhDMCwgMHg0OEQ0LCAweDg4QzEsIDB4MDg0QiwKKyAgICAweDg4QzIsIDB4MEZCRSwgMHg4OEMzLCAweDE5QzYsIDB4ODhDNCwgMHgxOUM3LCAweDg4QzUsIDB4MEFGNywgMHg4OEM2LAorICAgIDB4Mzc4OSwgMHg4OENBLCAweDNCMEYsIDB4ODhDRCwgMHg0RDQ5LCAweDg4Q0UsIDB4NDJEQywgMHg4OENGLCAweDBGNkEsCisgICAgMHg4OEQxLCAweDQ4RDYsIDB4ODhEMiwgMHgzQjEwLCAweDg4RDMsIDB4NDhENywgMHg4OEQ0LCAweDE5QzgsIDB4ODhENSwKKyAgICAweDBGMUYsIDB4ODhEOCwgMHgxOUM5LCAweDg4RDksIDB4MTlDQSwgMHg4OERCLCAweDNCMTEsIDB4ODhEQywgMHgwRTM0LAorICAgIDB4ODhERCwgMHgxOUNCLCAweDg4REYsIDB4MDgzMCwgMHg4OEUwLCAweDRENEEsIDB4ODhFMSwgMHgwRjZCLCAweDg4RTgsCisgICAgMHgxOUQwLCAweDg4RUYsIDB4NEQ0QiwgMHg4OEYwLCAweDNCMTIsIDB4ODhGMSwgMHgzQjEzLCAweDg4RjIsIDB4MTlEMSwKKyAgICAweDg4RjMsIDB4MDlDMCwgMHg4OEY0LCAweDE5Q0YsIDB4ODhGNSwgMHgyMUE3LCAweDg4RjgsIDB4MEY1MSwgMHg4OEY5LAorICAgIDB4MTlDQywgMHg4OEZDLCAweDE5Q0UsIDB4ODhGRCwgMHgwQTYxLCAweDg4RkUsIDB4MEE0NCwgMHg4OTAxLCAweDQ4RDksCisgICAgMHg4OTAyLCAweDE5Q0QsIDB4ODkwNCwgMHgxOUQyLCAweDg5MDYsIDB4M0IxNCwgMHg4OTA3LCAweDBERjMsIDB4ODkwQSwKKyAgICAweDE5RDQsIDB4ODkwQywgMHgxOUQzLCAweDg5MEUsIDB4NEQ0QywgMHg4OTBGLCAweDRENEQsIDB4ODkxMCwgMHgwNUNBLAorICAgIDB4ODkxMiwgMHgwRTU5LCAweDg5MTMsIDB4MTlENSwgMHg4OTE4LCAweDNCMTUsIDB4ODkxOSwgMHgzQjE2LCAweDg5MUEsCisgICAgMHgzQjE3LCAweDg5MUMsIDB4MjBBOCwgMHg4OTFELCAweDE5RTEsIDB4ODkxRSwgMHgxOUQ3LCAweDg5MjUsIDB4MTlEOCwKKyAgICAweDg5MjYsIDB4NEQ0RSwgMHg4OTI3LCAweDNCMTgsIDB4ODkyQSwgMHgxOUQ5LCAweDg5MkIsIDB4MTlEQSwgMHg4OTMwLAorICAgIDB4M0IxOSwgMHg4OTMyLCAweDQyREUsIDB4ODkzNSwgMHg0RDRGLCAweDg5MzYsIDB4MTlERSwgMHg4OTM3LCAweDQ4REIsCisgICAgMHg4OTM4LCAweDE5REYsIDB4ODkzOSwgMHg0MkRGLCAweDg5M0IsIDB4MTlERCwgMHg4OTNFLCAweDNCMUEsIDB4ODk0MCwKKyAgICAweDQyRTAsIDB4ODk0MSwgMHgxOURCLCAweDg5NDIsIDB4NDhERCwgMHg4OTQzLCAweDE5RDYsIDB4ODk0NCwgMHgxOURDLAorICAgIDB4ODk0NSwgMHg0OERFLCAweDg5NDksIDB4NDhERiwgMHg4OTRDLCAweDE5RTAsIDB4ODk0RCwgMHgxQkQwLCAweDg5NTYsCisgICAgMHgwNTI4LCAweDg5NUEsIDB4NEQ1MCwgMHg4OTVDLCAweDRENTEsIDB4ODk1RSwgMHgxOUUzLCAweDg5NUYsIDB4MDZENywKKyAgICAweDg5NjAsIDB4MTlFMiwgMHg4OTYyLCAweDQ4RTEsIDB4ODk2NCwgMHgxOUU1LCAweDg5NjYsIDB4MTlFNCwgMHg4OTZBLAorICAgIDB4MTlFNywgMHg4OTZCLCAweDRENTIsIDB4ODk2RCwgMHgxOUU2LCAweDg5NkYsIDB4MTlFOCwgMHg4OTcwLCAweDRENTMsCisgICAgMHg4OTcyLCAweDA5M0IsIDB4ODk3NCwgMHgxOUU5LCAweDg5NzcsIDB4MTlFQSwgMHg4OTdCLCAweDNCMUIsIDB4ODk3QywKKyAgICAweDRENTQsIDB4ODk3RSwgMHgxOUVCLCAweDg5N0YsIDB4MEE2MiwgMHg4OTgwLCAweDM2MkUsIDB4ODk4MSwgMHgwRjQxLAorICAgIDB4ODk4MywgMHgxOUVDLCAweDg5ODYsIDB4MERGNCwgMHg4OTg3LCAweDBDRkMsIDB4ODk4OCwgMHgxOUVELCAweDg5ODksCisgICAgMHg0OEUyLCAweDg5OEEsIDB4MTlFRSwgMHg4OThCLCAweDA3NUYsIDB4ODk4RiwgMHgwNjQ2LCAweDg5OTAsIDB4NDhFMywKKyAgICAweDg5OTMsIDB4MTlFRiwgMHg4OTk0LCAweDQyRTEsIDB4ODk5NiwgMHgwOEI5LCAweDg5OTcsIDB4MENGNywgMHg4OTk4LAorICAgIDB4MTlGMCwgMHg4OTlBLCAweDA1QUUsIDB4ODk5RiwgMHg0OEU0LCAweDg5QTEsIDB4MTlGMSwgMHg4OUE1LCAweDRENTUsCisgICAgMHg4OUE2LCAweDE5RjMsIDB4ODlBNywgMHgwRjYxLCAweDg5QTksIDB4MTlGMiwgMHg4OUFBLCAweDBBMEMsIDB4ODlBQywKKyAgICAweDE5RjQsIDB4ODlBRiwgMHgxOUY1LCAweDg5QjAsIDB4NDhFNSwgMHg4OUIyLCAweDE5RjYsIDB4ODlCMywgMHgwNjBELAorICAgIDB4ODlCNSwgMHg0RDU2LCAweDg5QjcsIDB4NDhFNiwgMHg4OUJBLCAweDE5RjcsIDB4ODlCQywgMHg0RDU3LCAweDg5QkQsCisgICAgMHgxOUY4LCAweDg5QkYsIDB4MTlGOSwgMHg4OUMwLCAweDE5RkEsIDB4ODlEMiwgMHgwNUFGLCAweDg5RDQsIDB4M0IxQywKKyAgICAweDg5RDUsIDB4NEQ1OCwgMHg4OUQ2LCAweDNCMUQsIDB4ODlEOCwgMHg0OEU3LCAweDg5REEsIDB4MTlGQiwgMHg4OURDLAorICAgIDB4MTlGQywgMHg4OURELCAweDE5RkQsIDB4ODlFMywgMHgwNTcyLCAweDg5RTUsIDB4M0IxRSwgMHg4OUU2LCAweDA5RUUsCisgICAgMHg4OUU3LCAweDE5RkUsIDB4ODlFQiwgMHg0OEU4LCAweDg5RjEsIDB4M0IxRiwgMHg4OUYzLCAweDQ4RUEsIDB4ODlGNCwKKyAgICAweDE5RkYsIDB4ODlGNiwgMHg0MkUyLCAweDg5RjgsIDB4MUEwMCwgMHg4OUZELCAweDQ4RUIsIDB4ODlGRiwgMHg0OEVDLAorICAgIDB4OEEwMCwgMHgwNzc0LCAweDhBMDEsIDB4MzVCQywgMHg4QTAyLCAweDBDMTcsIDB4OEEwMywgMHgxQTAxLCAweDhBMDcsCisgICAgMHgzQjIwLCAweDhBMDgsIDB4MDcyRCwgMHg4QTBBLCAweDBBMUMsIDB4OEEwQywgMHgxQTA0LCAweDhBMEUsIDB4MEM3QywKKyAgICAweDhBMEYsIDB4M0IyMSwgMHg4QTEwLCAweDFBMDMsIDB4OEExMSwgMHg0OEVFLCAweDhBMTIsIDB4MjFBOCwgMHg4QTEzLAorICAgIDB4MDcwNywgMHg4QTE0LCAweDQ4RUYsIDB4OEExNSwgMHgzQjIyLCAweDhBMTYsIDB4MUEwMiwgMHg4QTE3LCAweDBCNTcsCisgICAgMHg4QTE4LCAweDA2NDcsIDB4OEExQiwgMHgxQTA1LCAweDhBMUQsIDB4MUEwNiwgMHg4QTFGLCAweDA5QzEsIDB4OEEyMSwKKyAgICAweDQ4RjEsIDB4OEEyMiwgMHgzQjIzLCAweDhBMjMsIDB4MDc0MywgMHg4QTI1LCAweDFBMDcsIDB4OEEyQSwgMHgwRTVBLAorICAgIDB4OEEyRCwgMHgwQTgzLCAweDhBMzEsIDB4MDY5MCwgMHg4QTMzLCAweDBGMDEsIDB4OEEzNCwgMHgwQUNDLCAweDhBMzUsCisgICAgMHg0OEYyLCAweDhBMzYsIDB4MUEwOCwgMHg4QTM3LCAweDIxQTksIDB4OEEzQSwgMHgwQTBELCAweDhBM0IsIDB4MEJBRSwKKyAgICAweDhBM0MsIDB4MDlDMiwgMHg4QTNFLCAweDQ4RjMsIDB4OEE0MSwgMHgxQTA5LCAweDhBNDUsIDB4NDhGNCwgMHg4QTQ2LAorICAgIDB4MUEwQywgMHg4QTQ3LCAweDQyRTMsIDB4OEE0OCwgMHgxQTBELCAweDhBNDksIDB4NEQ1OSwgMHg4QTRELCAweDQ4RjUsCisgICAgMHg4QTRFLCAweDNCMjQsIDB4OEE1MCwgMHgwODJFLCAweDhBNTEsIDB4MEIyMiwgMHg4QTUyLCAweDFBMEIsIDB4OEE1NCwKKyAgICAweDA5QzMsIDB4OEE1NSwgMHgwREIwLCAweDhBNTcsIDB4NEQ1QSwgMHg4QTU4LCAweDQ4RjYsIDB4OEE1QiwgMHgxQTBBLAorICAgIDB4OEE1RCwgMHg0MkU0LCAweDhBNUUsIDB4MDhCQSwgMHg4QTYwLCAweDA0RjUsIDB4OEE2MSwgMHg0MkU1LCAweDhBNjIsCisgICAgMHgxQTExLCAweDhBNjMsIDB4MDcyRSwgMHg4QTY2LCAweDA4QkMsIDB4OEE2NywgMHg0RDVCLCAweDhBNjksIDB4MDhCQiwKKyAgICAweDhBNkIsIDB4MEZGMywgMHg4QTZDLCAweDFBMTAsIDB4OEE2RCwgMHgxQTBGLCAweDhBNkUsIDB4MEFBOSwgMHg4QTcwLAorICAgIDB4MDY2NywgMHg4QTcxLCAweDBGRTksIDB4OEE3MiwgMHgwNTk4LCAweDhBNzMsIDB4MDlDNCwgMHg4QTc1LCAweDQyRTYsCisgICAgMHg4QTc5LCAweDIxQUEsIDB4OEE3QywgMHgxQTBFLCAweDhBN0UsIDB4NEQ1QywgMHg4QTdGLCAweDNCMjUsIDB4OEE4MiwKKyAgICAweDFBMTMsIDB4OEE4NCwgMHgxQTE0LCAweDhBODUsIDB4MUExMiwgMHg4QTg2LCAweDRENUQsIDB4OEE4NywgMHgwNzhDLAorICAgIDB4OEE4OSwgMHgwRjJBLCAweDhBOEMsIDB4MDhCRCwgMHg4QThELCAweDBDREQsIDB4OEE5MCwgMHg0OEY4LCAweDhBOTEsCisgICAgMHgxQTE3LCAweDhBOTMsIDB4MEE2NCwgMHg4QTk1LCAweDBCODAsIDB4OEE5NiwgMHg0RDVFLCAweDhBOTgsIDB4MEYyMCwKKyAgICAweDhBOUEsIDB4MUExQSwgMHg4QTlFLCAweDA3QTAsIDB4OEFBMCwgMHgwQTYzLCAweDhBQTEsIDB4MUExNiwgMHg4QUEzLAorICAgIDB4MUExQiwgMHg4QUE0LCAweDA3QTEsIDB4OEFBNSwgMHgxQTE4LCAweDhBQTYsIDB4MUExOSwgMHg4QUE3LCAweDIxQUIsCisgICAgMHg4QUE4LCAweDFBMTUsIDB4OEFBQSwgMHgzNjM4LCAweDhBQUMsIDB4MEE4NiwgMHg4QUFELCAweDBDQTEsIDB4OEFBRSwKKyAgICAweDQ4RjcsIDB4OEFCMCwgMHgwQjZELCAweDhBQjIsIDB4MDU1RCwgMHg4QUI2LCAweDRENUYsIDB4OEFCNywgMHg0OEY5LAorICAgIDB4OEFCOSwgMHgwRDg0LCAweDhBQkMsIDB4MDY1RCwgMHg4QUJFLCAweDIxQUMsIDB4OEFCRiwgMHgwQkQwLCAweDhBQzIsCisgICAgMHgxQTFFLCAweDhBQzQsIDB4MUExQywgMHg4QUM3LCAweDBCOEEsIDB4OEFDOSwgMHg0RDYwLCAweDhBQ0IsIDB4MEE2NSwKKyAgICAweDhBQ0MsIDB4MDYwRSwgMHg4QUNELCAweDFBMUQsIDB4OEFDRiwgMHgwQTIxLCAweDhBRDAsIDB4NDJFNywgMHg4QUQxLAorICAgIDB4NEQ2MSwgMHg4QUQyLCAweDBGOTIsIDB4OEFENiwgMHgwRkU2LCAweDhBRDcsIDB4NDhGQSwgMHg4QURBLCAweDFBMUYsCisgICAgMHg4QURCLCAweDFBMkEsIDB4OEFEQywgMHgwQkQxLCAweDhBREQsIDB4NEQ2MiwgMHg4QURFLCAweDFBMjksIDB4OEFERiwKKyAgICAweDIxQUQsIDB4OEFFMCwgMHgxQTI2LCAweDhBRTEsIDB4MUEyRSwgMHg4QUUyLCAweDFBMjcsIDB4OEFFNCwgMHgxQTIzLAorICAgIDB4OEFFNiwgMHgwQzE4LCAweDhBRTcsIDB4MUEyMiwgMHg4QUVCLCAweDFBMjAsIDB4OEFFQywgMHg0RDYzLCAweDhBRUQsCisgICAgMHgwRjBCLCAweDhBRUUsIDB4MDhCRSwgMHg4QUYxLCAweDFBMjQsIDB4OEFGMywgMHgxQTIxLCAweDhBRjQsIDB4M0IyNiwKKyAgICAweDhBRjUsIDB4NEQ2NCwgMHg4QUY2LCAweDIxQUYsIDB4OEFGNywgMHgxQTI4LCAweDhBRjgsIDB4MDk3RSwgMHg4QUZBLAorICAgIDB4MDc3NSwgMHg4QUZDLCAweDQ4RkIsIDB4OEFGRSwgMHgwQjVBLCAweDhCMDAsIDB4MEU3MywgMHg4QjAxLCAweDA0RkMsCisgICAgMHg4QjAyLCAweDA0QTYsIDB4OEIwNCwgMHgwQzdELCAweDhCMDUsIDB4NDhGRSwgMHg4QjA2LCAweDRENjUsIDB4OEIwNywKKyAgICAweDFBMkMsIDB4OEIwQSwgMHg0OEZELCAweDhCMEMsIDB4MUEyQiwgMHg4QjBELCAweDQ4RkYsIDB4OEIwRSwgMHgwQ0JFLAorICAgIDB4OEIwRiwgMHg0RDY2LCAweDhCMTAsIDB4MUEzMCwgMHg4QjExLCAweDRENjcsIDB4OEIxNCwgMHgxQTI1LCAweDhCMTYsCisgICAgMHgxQTJGLCAweDhCMTcsIDB4MUEzMSwgMHg4QjE5LCAweDA3NjAsIDB4OEIxQSwgMHgxQTJELCAweDhCMUIsIDB4MDdFOCwKKyAgICAweDhCMUMsIDB4NDkwMCwgMHg4QjFELCAweDA5MDEsIDB4OEIxRiwgMHgzQjI3LCAweDhCMjAsIDB4MUEzMiwgMHg4QjIxLAorICAgIDB4MEY0MiwgMHg4QjI2LCAweDFBMzUsIDB4OEIyOCwgMHgxQTM4LCAweDhCMkIsIDB4MUEzNiwgMHg4QjJDLCAweDBEQTcsCisgICAgMHg4QjJELCAweDQ5MDEsIDB4OEIzMywgMHgxQTMzLCAweDhCMzcsIDB4M0IyOCwgMHg4QjM5LCAweDA2RDgsIDB4OEIzRSwKKyAgICAweDFBMzcsIDB4OEI0MSwgMHgxQTM5LCAweDhCNDMsIDB4M0IyOSwgMHg4QjQ0LCAweDNCMkEsIDB4OEI0NSwgMHg0RDY4LAorICAgIDB4OEI0NiwgMHg0MkU4LCAweDhCNDksIDB4MUEzRCwgMHg4QjRDLCAweDFBM0EsIDB4OEI0RSwgMHgxQTNDLCAweDhCNEYsCisgICAgMHgxQTNCLCAweDhCNTEsIDB4NDkwMywgMHg4QjUyLCAweDRENjksIDB4OEI1MywgMHgyMUIwLCAweDhCNTQsIDB4M0IyQiwKKyAgICAweDhCNTYsIDB4MUEzRSwgMHg4QjU4LCAweDA4REQsIDB4OEI1OSwgMHg0MkU5LCAweDhCNUEsIDB4MUE0MCwgMHg4QjVCLAorICAgIDB4MUEzRiwgMHg4QjVDLCAweDBEREEsIDB4OEI1RSwgMHg0OTA0LCAweDhCNUYsIDB4MUE0MiwgMHg4QjY2LCAweDA3MkYsCisgICAgMHg4QjY5LCAweDQyRUEsIDB4OEI2QiwgMHgxQTQxLCAweDhCNkMsIDB4MUE0MywgMHg4QjZELCAweDRENkEsIDB4OEI2RiwKKyAgICAweDFBNDQsIDB4OEI3MCwgMHgwNjVFLCAweDhCNzEsIDB4MTgyRSwgMHg4QjcyLCAweDA5RTEsIDB4OEI3NCwgMHgxQTQ1LAorICAgIDB4OEI3NiwgMHg0OTA1LCAweDhCNzcsIDB4MDdBMiwgMHg4Qjc4LCAweDRENkIsIDB4OEI3QywgMHg0RDZDLCAweDhCN0QsCisgICAgMHgxQTQ2LCAweDhCN0UsIDB4NEQ2RCwgMHg4QjdGLCAweDIxQjEsIDB4OEI4MCwgMHgxQTQ3LCAweDhCODEsIDB4NDkwNiwKKyAgICAweDhCODMsIDB4MDg4QywgMHg4Qjg1LCAweDRENkUsIDB4OEI4QSwgMHgxM0QzLCAweDhCOEIsIDB4NDkwNywgMHg4QjhDLAorICAgIDB4MUE0OCwgMHg4QjhFLCAweDFBNDksIDB4OEI5MCwgMHgwOTNDLCAweDhCOTIsIDB4MUE0QSwgMHg4QjkzLCAweDFBNEIsCisgICAgMHg4Qjk0LCAweDQ5MDgsIDB4OEI5NSwgMHg0OTA5LCAweDhCOTYsIDB4MUE0QywgMHg4Qjk5LCAweDFBNEQsIDB4OEI5QSwKKyAgICAweDFBNEUsIDB4OEI5QywgMHgzQjJDLCAweDhCOUQsIDB4NDJFQiwgMHg4QjlFLCAweDNCMkQsIDB4OEI5RiwgMHg0RDZGLAorICAgIDB4OEMzNywgMHgwQjY5LCAweDhDMzksIDB4NDkwQSwgMHg4QzNBLCAweDFBNEYsIDB4OEMzRCwgMHg0OTBDLCAweDhDM0YsCisgICAgMHgxQTUxLCAweDhDNDEsIDB4MUE1MCwgMHg4QzQ1LCAweDQ5MEYsIDB4OEM0NiwgMHgwQzdFLCAweDhDNDcsIDB4M0IyRSwKKyAgICAweDhDNDgsIDB4MUE1MiwgMHg4QzQ5LCAweDQyRUMsIDB4OEM0QSwgMHgwRTVCLCAweDhDNEIsIDB4NEQ3MCwgMHg4QzRDLAorICAgIDB4MUE1MywgMHg4QzRFLCAweDFBNTQsIDB4OEM0RiwgMHg0OTEwLCAweDhDNTAsIDB4MUE1NSwgMHg4QzUzLCAweDRENzEsCisgICAgMHg4QzU0LCAweDNCMkYsIDB4OEM1NSwgMHgxQTU2LCAweDhDNTcsIDB4NDkxMSwgMHg4QzVBLCAweDBDQjIsIDB4OEM2MSwKKyAgICAweDA5QzUsIDB4OEM2MiwgMHgxQTU3LCAweDhDNjgsIDB4NDJFRCwgMHg4QzY5LCAweDQ5MTIsIDB4OEM2QSwgMHgwN0ZELAorICAgIDB4OEM2QiwgMHgxMDA3LCAweDhDNkMsIDB4MUE1OCwgMHg4QzZELCAweDQ5MTMsIDB4OEM3MywgMHgzQjMwLCAweDhDNzgsCisgICAgMHgxQTU5LCAweDhDNzksIDB4MERCMSwgMHg4QzdBLCAweDFBNUEsIDB4OEM3QiwgMHg0RDcyLCAweDhDN0MsIDB4MUE2MiwKKyAgICAweDhDODIsIDB4MUE1QiwgMHg4Qzg1LCAweDFBNUQsIDB4OEM4OSwgMHgxQTVDLCAweDhDOEEsIDB4MUE1RSwgMHg4QzhDLAorICAgIDB4MEU3NCwgMHg4QzhELCAweDFBNUYsIDB4OEM4RSwgMHgxQTYwLCAweDhDOTIsIDB4NDkxNiwgMHg4QzkzLCAweDQ5MTUsCisgICAgMHg4Qzk0LCAweDFBNjEsIDB4OEM5OCwgMHgxQTYzLCAweDhDOTksIDB4NDkxNywgMHg4QzlCLCAweDQ5MTksIDB4OEM5RCwKKyAgICAweDA1OEIsIDB4OEM5RSwgMHgwQzAzLCAweDhDOUYsIDB4MzU0QywgMHg4Q0EwLCAweDBEREIsIDB4OENBMSwgMHgwODUyLAorICAgIDB4OENBMiwgMHgwN0U5LCAweDhDQTQsIDB4M0IzMSwgMHg4Q0E3LCAweDBEQzEsIDB4OENBOCwgMHgwNTVGLCAweDhDQTksCisgICAgMHgwRDYyLCAweDhDQUEsIDB4MUE2NiwgMHg4Q0FCLCAweDA2MEYsIDB4OENBQywgMHgwQTc5LCAweDhDQUQsIDB4MUE2NSwKKyAgICAweDhDQUUsIDB4MUE2QSwgMHg4Q0FGLCAweDBCQjcsIDB4OENCMCwgMHgwRUVGLCAweDhDQjIsIDB4MUE2OCwgMHg4Q0IzLAorICAgIDB4MUE2OSwgMHg4Q0I0LCAweDA2NDgsIDB4OENCNiwgMHgxQTZCLCAweDhDQjcsIDB4MEQxOSwgMHg4Q0I4LCAweDBCM0YsCisgICAgMHg4Q0JBLCAweDRENzMsIDB4OENCQiwgMHgwRDg1LCAweDhDQkMsIDB4MEMzNywgMHg4Q0JELCAweDFBNjcsIDB4OENCRiwKKyAgICAweDBFNzUsIDB4OENDMCwgMHgwNTZDLCAweDhDQzEsIDB4MUE2RCwgMHg4Q0MyLCAweDBGQ0UsIDB4OENDMywgMHgwQkRFLAorICAgIDB4OENDNCwgMHgwRkVCLCAweDhDQzUsIDB4NEQ3NCwgMHg4Q0M3LCAweDA4QkYsIDB4OENDOCwgMHgxQTZDLCAweDhDQzksCisgICAgMHg0RDc1LCAweDhDQ0EsIDB4MEIxMSwgMHg4Q0NELCAweDFBN0QsIDB4OENDRSwgMHgwQUFBLCAweDhDRDEsIDB4MENEMCwKKyAgICAweDhDRDIsIDB4NEQ3NiwgMHg4Q0QzLCAweDBEQzIsIDB4OENENSwgMHg0OTFCLCAweDhDRDYsIDB4NDkxQSwgMHg4Q0Q5LAorICAgIDB4M0IzMiwgMHg4Q0RBLCAweDFBNzAsIDB4OENEQiwgMHgwODhELCAweDhDREMsIDB4MDhDMCwgMHg4Q0RFLCAweDA5QzYsCisgICAgMHg4Q0UwLCAweDBEMUIsIDB4OENFMSwgMHgzQjMzLCAweDhDRTIsIDB4MDc2MSwgMHg4Q0UzLCAweDFBNkYsIDB4OENFNCwKKyAgICAweDFBNkUsIDB4OENFNiwgMHgwRERDLCAweDhDRUEsIDB4MDhFRCwgMHg4Q0VDLCAweDRENzcsIDB4OENFRCwgMHgwQzRDLAorICAgIDB4OENGMCwgMHgyMUIyLCAweDhDRjEsIDB4NDkxRCwgMHg4Q0Y0LCAweDIxQjMsIDB4OENGNSwgMHg0RDc4LCAweDhDRjcsCisgICAgMHg0RDc5LCAweDhDRjgsIDB4M0IzNCwgMHg4Q0ZBLCAweDFBNzIsIDB4OENGQiwgMHgxQTczLCAweDhDRkMsIDB4MDdFQSwKKyAgICAweDhDRkQsIDB4MUE3MSwgMHg4Q0ZFLCAweDNCMzUsIDB4OEQwMSwgMHg0RDdBLCAweDhEMDMsIDB4NEQ3QiwgMHg4RDA0LAorICAgIDB4MUE3NCwgMHg4RDA1LCAweDFBNzUsIDB4OEQwNywgMHgxQTc3LCAweDhEMDgsIDB4MEIwMywgMHg4RDA5LCAweDQ5MUYsCisgICAgMHg4RDBBLCAweDFBNzYsIDB4OEQwQiwgMHgwNjIyLCAweDhEMEQsIDB4MUE3OSwgMHg4RDBFLCAweDQ5MjAsIDB4OEQwRiwKKyAgICAweDFBNzgsIDB4OEQxMCwgMHgxQTdBLCAweDhEMTIsIDB4MjFCNCwgMHg4RDEzLCAweDFBN0MsIDB4OEQxNCwgMHgxQTdFLAorICAgIDB4OEQxNiwgMHgxQTdGLCAweDhEMTcsIDB4NEQ3QywgMHg4RDFCLCAweDNCMzYsIDB4OEQxQywgMHg0RDdELCAweDhENjQsCisgICAgMHgwQTdBLCAweDhENjYsIDB4MDhGQiwgMHg4RDY3LCAweDFBODAsIDB4OEQ2OSwgMHgzQjM3LCAweDhENkIsIDB4MDVCMCwKKyAgICAweDhENkMsIDB4M0IzOCwgMHg4RDZELCAweDFBODEsIDB4OEQ2RSwgMHg0RDdFLCAweDhENzAsIDB4MEFGOCwgMHg4RDcxLAorICAgIDB4MUE4MiwgMHg4RDczLCAweDFBODMsIDB4OEQ3NCwgMHgwRERELCAweDhENzYsIDB4MjFCNSwgMHg4RDc3LCAweDA2NDksCisgICAgMHg4RDgxLCAweDFBODQsIDB4OEQ4NCwgMHgzQjM5LCAweDhEODUsIDB4MEJEMiwgMHg4RDhBLCAweDA0RkQsIDB4OEQ4RCwKKyAgICAweDNCM0EsIDB4OEQ5MSwgMHg0RDdGLCAweDhEOTUsIDB4M0IzQiwgMHg4RDk5LCAweDFBODUsIDB4OEQ5RiwgMHg0RDgwLAorICAgIDB4OERBMywgMHgwOTFELCAweDhEQTYsIDB4M0IzQywgMHg4REE4LCAweDBBM0MsIDB4OERBQiwgMHg0RDgxLCAweDhEQUYsCisgICAgMHg0MkVFLCAweDhEQjIsIDB4NEQ4MiwgMHg4REIzLCAweDBCMEQsIDB4OERCQSwgMHgxQTg4LCAweDhEQkUsIDB4MUE4NywKKyAgICAweDhEQzIsIDB4MUE4NiwgMHg4REM2LCAweDNCM0QsIDB4OERDOCwgMHg0OTIxLCAweDhEQ0IsIDB4MUE4RSwgMHg4RENDLAorICAgIDB4MUE4QywgMHg4RENFLCAweDNCM0UsIDB4OERDRiwgMHgxQTg5LCAweDhERDEsIDB4NDJFRiwgMHg4REQ1LCAweDREODMsCisgICAgMHg4REQ2LCAweDFBOEIsIDB4OERENywgMHg0MkYwLCAweDhERDksIDB4NDkyMiwgMHg4RERBLCAweDFBOEEsIDB4OEREQiwKKyAgICAweDFBOEQsIDB4OERERCwgMHgwNjkxLCAweDhEREYsIDB4MUE5MSwgMHg4REUxLCAweDBBN0IsIDB4OERFMywgMHgxQTkyLAorICAgIDB4OERFNCwgMHgzQjNGLCAweDhERTcsIDB4NEQ4NCwgMHg4REU4LCAweDA3OEQsIDB4OERFQSwgMHgxQThGLCAweDhERUIsCisgICAgMHgxQTkwLCAweDhERUMsIDB4M0I0MCwgMHg4REVGLCAweDBGQ0YsIDB4OERGMSwgMHg0RDg1LCAweDhERjIsIDB4NEQ4NiwKKyAgICAweDhERjMsIDB4MEJEMywgMHg4REY0LCAweDREODcsIDB4OERGNSwgMHgwQUFCLCAweDhERkMsIDB4MUE5MywgMHg4REZELAorICAgIDB4NDkyNSwgMHg4REZGLCAweDFBOTYsIDB4OEUwMSwgMHg0RDg4LCAweDhFMDYsIDB4NDkyNiwgMHg4RTA4LCAweDFBOTQsCisgICAgMHg4RTA5LCAweDFBOTUsIDB4OEUwQSwgMHgwRjQzLCAweDhFMEIsIDB4NEQ4OSwgMHg4RTBDLCAweDQ5MjMsIDB4OEUwRiwKKyAgICAweDBDN0YsIDB4OEUxMCwgMHgxQTk5LCAweDhFMTQsIDB4NDkyOCwgMHg4RTE2LCAweDQ5MjksIDB4OEUxRCwgMHgxQTk3LAorICAgIDB4OEUxRSwgMHgxQTk4LCAweDhFMUYsIDB4MUE5QSwgMHg4RTIwLCAweDNCNDEsIDB4OEUyMSwgMHg0OTJBLCAweDhFMjIsCisgICAgMHg0OTJCLCAweDhFMjMsIDB4NDJGMSwgMHg4RTI2LCAweDREOEEsIDB4OEUyNywgMHg0OTJDLCAweDhFMkEsIDB4MUFBOCwKKyAgICAweDhFMzAsIDB4MUE5RCwgMHg4RTMxLCAweDREOEIsIDB4OEUzNCwgMHgxQTlFLCAweDhFMzUsIDB4MUE5QywgMHg4RTM2LAorICAgIDB4NDkyRiwgMHg4RTM5LCAweDQ5MzAsIDB4OEUzRCwgMHg0MkYyLCAweDhFNDAsIDB4NEQ4QywgMHg4RTQxLCAweDREOEQsCisgICAgMHg4RTQyLCAweDFBOUIsIDB4OEU0NCwgMHgwQzE5LCAweDhFNDcsIDB4MUFBMCwgMHg4RTQ4LCAweDFBQTQsIDB4OEU0OSwKKyAgICAweDFBQTEsIDB4OEU0QSwgMHgxQTlGLCAweDhFNEIsIDB4M0I0MiwgMHg4RTRDLCAweDFBQTIsIDB4OEU0RCwgMHg0RDhFLAorICAgIDB4OEU0RiwgMHg0RDhGLCAweDhFNTAsIDB4MUFBMywgMHg4RTU0LCAweDQ5MzEsIDB4OEU1NSwgMHgxQUFBLCAweDhFNTksCisgICAgMHgxQUE1LCAweDhFNUMsIDB4NEQ5MCwgMHg4RTVGLCAweDBBN0MsIDB4OEU2MCwgMHgxQUE3LCAweDhFNjEsIDB4NEQ5MSwKKyAgICAweDhFNjIsIDB4NDkzMiwgMHg4RTYzLCAweDFBQTksIDB4OEU2NCwgMHgxQUE2LCAweDhFNjksIDB4NEQ5MiwgMHg4RTZDLAorICAgIDB4M0I0MywgMHg4RTZELCAweDQ5MzMsIDB4OEU2RiwgMHg0OTM0LCAweDhFNzAsIDB4M0I0NCwgMHg4RTcxLCAweDREOTMsCisgICAgMHg4RTcyLCAweDFBQUMsIDB4OEU3NCwgMHgwOTNELCAweDhFNzUsIDB4NEQ5NCwgMHg4RTc2LCAweDFBQUIsIDB4OEU3NywKKyAgICAweDREOTUsIDB4OEU3QSwgMHgzQjQ1LCAweDhFN0IsIDB4NDJGMywgMHg4RTdDLCAweDFBQUQsIDB4OEU4MSwgMHgxQUFFLAorICAgIDB4OEU4NCwgMHgxQUIxLCAweDhFODUsIDB4MUFCMCwgMHg4RTg3LCAweDFBQUYsIDB4OEU4OSwgMHg0RDk2LCAweDhFOEEsCisgICAgMHgxQUIzLCAweDhFOEIsIDB4MUFCMiwgMHg4RThELCAweDBGMDIsIDB4OEU5MCwgMHg0RDk3LCAweDhFOTEsIDB4MUFCNSwKKyAgICAweDhFOTIsIDB4M0I0NiwgMHg4RTkzLCAweDFBQjQsIDB4OEU5NCwgMHgxQUI2LCAweDhFOTUsIDB4NEQ5OCwgMHg4RTk4LAorICAgIDB4NDkzNSwgMHg4RTk5LCAweDFBQjcsIDB4OEU5QSwgMHg0RDk5LCAweDhFOUUsIDB4NDkzNiwgMHg4RUExLCAweDFBQjksCisgICAgMHg4RUE3LCAweDREOUEsIDB4OEVBOSwgMHg0RDlCLCAweDhFQUEsIDB4MUFCOCwgMHg4RUFCLCAweDBBMEUsIDB4OEVBQywKKyAgICAweDFBQkEsIDB4OEVBRCwgMHg0RDlDLCAweDhFQUUsIDB4M0I0NywgMHg4RUFGLCAweDA2RTUsIDB4OEVCMCwgMHgxQUJCLAorICAgIDB4OEVCMSwgMHgxQUJELCAweDhFQjMsIDB4M0I0OCwgMHg4RUI1LCAweDQ5MzcsIDB4OEVCNiwgMHgzNzAzLCAweDhFQkIsCisgICAgMHg0OTM4LCAweDhFQkUsIDB4MUFCRSwgMHg4RUMwLCAweDFERUYsIDB4OEVDNSwgMHgxQUJGLCAweDhFQzYsIDB4MUFCQywKKyAgICAweDhFQzgsIDB4MUFDMCwgMHg4RUNBLCAweDA5MDIsIDB4OEVDQiwgMHgxQUMxLCAweDhFQ0MsIDB4MDY0QSwgMHg4RUNELAorICAgIDB4MDcwOSwgMHg4RUNGLCAweDIxQjcsIDB4OEVEMSwgMHgzQjQ5LCAweDhFRDIsIDB4MDc2MiwgMHg4RUQ0LCAweDNCNEEsCisgICAgMHg4RURCLCAweDFBQzIsIDB4OEVERiwgMHgwQ0M4LCAweDhFRTIsIDB4MEMzOCwgMHg4RUUzLCAweDFBQzMsIDB4OEVFOCwKKyAgICAweDREOUQsIDB4OEVFQiwgMHgxQUM2LCAweDhFRjAsIDB4NEQ5RSwgMHg4RUY4LCAweDA4RTAsIDB4OEVGOSwgMHgzQjRCLAorICAgIDB4OEVGQSwgMHg0MkY2LCAweDhFRkIsIDB4MUFDNSwgMHg4RUZDLCAweDFBQzQsIDB4OEVGRCwgMHgwNzMwLCAweDhFRkUsCisgICAgMHgxQUM3LCAweDhGMDAsIDB4NDkzQywgMHg4RjAzLCAweDA1QjEsIDB4OEYwNSwgMHgxQUM5LCAweDhGMDcsIDB4NEQ5RiwKKyAgICAweDhGMDgsIDB4NDkzRCwgMHg4RjA5LCAweDA4NEMsIDB4OEYwQSwgMHgxQUM4LCAweDhGMEMsIDB4MUFEMSwgMHg4RjEyLAorICAgIDB4MUFDQiwgMHg4RjEzLCAweDFBQ0QsIDB4OEYxNCwgMHgwRTM1LCAweDhGMTUsIDB4MUFDQSwgMHg4RjE3LCAweDNCNEMsCisgICAgMHg4RjE4LCAweDREQTAsIDB4OEYxOSwgMHgxQUNDLCAweDhGMUIsIDB4MUFEMCwgMHg4RjFDLCAweDFBQ0UsIDB4OEYxRCwKKyAgICAweDA2NEIsIDB4OEYxRSwgMHg0MkY3LCAweDhGMUYsIDB4MUFDRiwgMHg4RjI1LCAweDREQTEsIDB4OEYyNiwgMHgxQUQyLAorICAgIDB4OEYyNywgMHg0REEyLCAweDhGMjksIDB4MEQxMCwgMHg4RjJBLCAweDBGQTAsIDB4OEYyQiwgMHg0OTNFLCAweDhGMkMsCisgICAgMHg0REEzLCAweDhGMkQsIDB4NDJGOCwgMHg4RjJGLCAweDA5M0UsIDB4OEYzMywgMHgxQUQzLCAweDhGMzUsIDB4NERBNCwKKyAgICAweDhGMzYsIDB4M0I0RCwgMHg4RjM4LCAweDBGMEMsIDB4OEYzOSwgMHgxQUQ1LCAweDhGM0EsIDB4NERBNSwgMHg4RjNCLAorICAgIDB4MUFENCwgMHg4RjNFLCAweDFBRDgsIDB4OEYzRiwgMHgwRjJCLCAweDhGNDAsIDB4NDkzRiwgMHg4RjQyLCAweDFBRDcsCisgICAgMHg4RjQzLCAweDREQTYsIDB4OEY0NCwgMHgwNUNCLCAweDhGNDUsIDB4MUFENiwgMHg4RjQ2LCAweDFBREIsIDB4OEY0NywKKyAgICAweDREQTcsIDB4OEY0OSwgMHgxQURBLCAweDhGNEEsIDB4NDk0MCwgMHg4RjRDLCAweDFBRDksIDB4OEY0RCwgMHgwQzJDLAorICAgIDB4OEY0RSwgMHgxQURDLCAweDhGNTEsIDB4NERBOCwgMHg4RjU0LCAweDQyRjksIDB4OEY1NSwgMHg0REE5LCAweDhGNTcsCisgICAgMHgxQURELCAweDhGNTgsIDB4NDk0MSwgMHg4RjVDLCAweDFBREUsIDB4OEY1RiwgMHgwN0ZFLCAweDhGNjEsIDB4MDZGQiwKKyAgICAweDhGNjIsIDB4MUFERiwgMHg4RjYzLCAweDFBRTAsIDB4OEY2NCwgMHgxQUUxLCAweDhGOUIsIDB4MEEwRiwgMHg4RjlDLAorICAgIDB4MUFFMiwgMHg4RjlFLCAweDA4RDksIDB4OEY5RiwgMHgxQUUzLCAweDhGQTAsIDB4NERBQSwgMHg4RkExLCAweDREQUIsCisgICAgMHg4RkEyLCAweDREQUMsIDB4OEZBMywgMHgxQUU0LCAweDhGQTQsIDB4NDk0MywgMHg4RkE1LCAweDREQUQsIDB4OEZBNiwKKyAgICAweDNCNEUsIDB4OEZBNywgMHgxMEI2LCAweDhGQTgsIDB4MTBCNSwgMHg4RkFELCAweDFBRTUsIDB4OEZBRSwgMHgxN0ZGLAorICAgIDB4OEZBRiwgMHgxQUU2LCAweDhGQjAsIDB4MEI2MiwgMHg4RkIxLCAweDA5RjEsIDB4OEZCMiwgMHgwQ0Y2LCAweDhGQjQsCisgICAgMHg0OTQ0LCAweDhGQjUsIDB4M0I0RiwgMHg4RkI2LCAweDNCNTAsIDB4OEZCNywgMHgxQUU3LCAweDhGQkEsIDB4MEUyNSwKKyAgICAweDhGQkIsIDB4MEJGMCwgMHg4RkJDLCAweDA4MTAsIDB4OEZCRiwgMHgwQjY3LCAweDhGQzEsIDB4NDk0NiwgMHg4RkMyLAorICAgIDB4MDRDQywgMHg4RkM0LCAweDBFQTYsIDB4OEZDNSwgMHgwQTFELCAweDhGQzYsIDB4NDk0NywgMHg4RkM4LCAweDM3OTksCisgICAgMHg4RkNBLCAweDQ5NDksIDB4OEZDRCwgMHg0OTRBLCAweDhGQ0UsIDB4MDczNCwgMHg4RkQxLCAweDA2RDksIDB4OEZEMywKKyAgICAweDQ5NEIsIDB4OEZENCwgMHgwRTI2LCAweDhGRDUsIDB4NDk0QywgMHg4RkRBLCAweDFBRTgsIDB4OEZFMCwgMHgzQjUyLAorICAgIDB4OEZFMiwgMHgxQUVBLCAweDhGRTQsIDB4M0I1MywgMHg4RkU1LCAweDFBRTksIDB4OEZFNiwgMHgwNTYwLCAweDhGRTgsCisgICAgMHg0MkZCLCAweDhGRTksIDB4MENDRSwgMHg4RkVBLCAweDFBRUIsIDB4OEZFQiwgMHgwRDJELCAweDhGRUQsIDB4MEMyRCwKKyAgICAweDhGRUUsIDB4NDJGQywgMHg4RkVGLCAweDFBRUMsIDB4OEZGMCwgMHgwOTVDLCAweDhGRjEsIDB4NDk0RCwgMHg4RkY0LAorICAgIDB4MUFFRSwgMHg4RkY1LCAweDQ5NEUsIDB4OEZGNiwgMHgzQjU0LCAweDhGRjcsIDB4MEVDRSwgMHg4RkY4LCAweDFBRkQsCisgICAgMHg4RkY5LCAweDFBRjAsIDB4OEZGQSwgMHgxQUYxLCAweDhGRkIsIDB4NDk0RiwgMHg4RkZELCAweDBCRTUsIDB4OTAwMCwKKyAgICAweDBCNDAsIDB4OTAwMSwgMHgwQUY5LCAweDkwMDIsIDB4M0I1NSwgMHg5MDAzLCAweDBDODAsIDB4OTAwNCwgMHg0REFFLAorICAgIDB4OTAwNSwgMHgxQUVGLCAweDkwMDYsIDB4MDY2RiwgMHg5MDA4LCAweDQyRkQsIDB4OTAwQiwgMHgxQUY4LCAweDkwMEMsCisgICAgMHg0OTUwLCAweDkwMEQsIDB4MUFGNSwgMHg5MDBFLCAweDFCMDIsIDB4OTAwRiwgMHgwQzgxLCAweDkwMTAsIDB4MEI5RSwKKyAgICAweDkwMTEsIDB4MUFGMiwgMHg5MDEzLCAweDBDMUEsIDB4OTAxNCwgMHgwQzRELCAweDkwMTUsIDB4MUFGMywgMHg5MDE2LAorICAgIDB4MUFGNywgMHg5MDE3LCAweDBBMjYsIDB4OTAxOSwgMHgwRDFELCAweDkwMUEsIDB4MEJFOCwgMHg5MDFCLCAweDREQUYsCisgICAgMHg5MDFELCAweDBBNjYsIDB4OTAxRSwgMHgxQUY2LCAweDkwMUYsIDB4MEIwRSwgMHg5MDIwLCAweDBCMDQsIDB4OTAyMSwKKyAgICAweDFBRjQsIDB4OTAyMiwgMHgwNDZELCAweDkwMjMsIDB4MEZDOCwgMHg5MDI3LCAweDFBRjksIDB4OTAyQywgMHgzQjU2LAorICAgIDB4OTAyRCwgMHg0MkZFLCAweDkwMkUsIDB4MEI0MSwgMHg5MDJGLCAweDREQjAsIDB4OTAzMSwgMHgwOTNGLCAweDkwMzIsCisgICAgMHgwQTEwLCAweDkwMzUsIDB4MUFGQiwgMHg5MDM2LCAweDFBRkEsIDB4OTAzNywgMHg0OTUxLCAweDkwMzgsIDB4MDRCMywKKyAgICAweDkwMzksIDB4MUFGQywgMHg5MDNDLCAweDBEQTEsIDB4OTAzRSwgMHgxQjA0LCAweDkwNDEsIDB4MENCMywgMHg5MDQyLAorICAgIDB4MEEzMSwgMHg5MDQzLCAweDQ5NTMsIDB4OTA0NCwgMHgzQjU3LCAweDkwNDUsIDB4MEI5NywgMHg5MDQ3LCAweDA2RjAsCisgICAgMHg5MDQ5LCAweDFCMDMsIDB4OTA0QSwgMHgwRjIxLCAweDkwNEIsIDB4MDRFMSwgMHg5MDRDLCAweDREQjEsIDB4OTA0RCwKKyAgICAweDBFMjcsIDB4OTA0RSwgMHgwNTYxLCAweDkwNEYsIDB4MUFGRSwgMHg5MDUwLCAweDFBRkYsIDB4OTA1MSwgMHgxQjAwLAorICAgIDB4OTA1MiwgMHgxQjAxLCAweDkwNTMsIDB4MEM5MywgMHg5MDU0LCAweDBCNjEsIDB4OTA1NSwgMHgwNEE3LCAweDkwNTYsCisgICAgMHgxQjA1LCAweDkwNTgsIDB4MUIwNiwgMHg5MDU5LCAweDFEMzQsIDB4OTA1QiwgMHg0REIyLCAweDkwNUMsIDB4MEIxRCwKKyAgICAweDkwNUQsIDB4NDk1NCwgMHg5MDVFLCAweDFCMDcsIDB4OTA2MCwgMHgwNTE1LCAweDkwNjEsIDB4MEFDRSwgMHg5MDYzLAorICAgIDB4MDc2MywgMHg5MDY1LCAweDBGNDQsIDB4OTA2NywgMHgyMUJBLCAweDkwNjgsIDB4MUIwOCwgMHg5MDY5LCAweDBDMjYsCisgICAgMHg5MDZELCAweDBBRkEsIDB4OTA2RSwgMHgwOTAzLCAweDkwNkYsIDB4MUIwOSwgMHg5MDcwLCAweDREQjMsIDB4OTA3MiwKKyAgICAweDFCMEMsIDB4OTA3NCwgMHg0REI0LCAweDkwNzUsIDB4MDk2RiwgMHg5MDc2LCAweDFCMEEsIDB4OTA3NywgMHgwQUFELAorICAgIDB4OTA3OCwgMHgwQUFDLCAweDkwNzksIDB4NERCNSwgMHg5MDdBLCAweDA0QTgsIDB4OTA3QywgMHgwRjkzLCAweDkwN0QsCisgICAgMHgxQjBFLCAweDkwN0YsIDB4MEQ4NiwgMHg5MDgwLCAweDFCMTAsIDB4OTA4MSwgMHgxQjBGLCAweDkwODIsIDB4MUIwRCwKKyAgICAweDkwODMsIDB4MTczNywgMHg5MDg0LCAweDA2MTAsIDB4OTA4NSwgMHg0OTU3LCAweDkwODcsIDB4MUFFRCwgMHg5MDg4LAorICAgIDB4M0I1OCwgMHg5MDg5LCAweDFCMTIsIDB4OTA4QSwgMHgxQjExLCAweDkwOEIsIDB4NERCNiwgMHg5MDhDLCAweDQ5NTgsCisgICAgMHg5MDhGLCAweDFCMTMsIDB4OTA5MCwgMHg0OTU5LCAweDkwOTEsIDB4MEYyMiwgMHg5MDk1LCAweDNCNTksIDB4OTA5NywKKyAgICAweDQyRkYsIDB4OTA5OCwgMHg0REI3LCAweDkwOTksIDB4M0I1QSwgMHg5MDlCLCAweDNCNUIsIDB4OTBBMCwgMHg0REI4LAorICAgIDB4OTBBMSwgMHg0OTVBLCAweDkwQTIsIDB4M0I1QywgMHg5MEEzLCAweDBDQjksIDB4OTBBNiwgMHgwRTVDLCAweDkwQTgsCisgICAgMHgxQjE0LCAweDkwQUEsIDB4MDkwNSwgMHg5MEFGLCAweDFCMTUsIDB4OTBCMCwgMHg0OTVDLCAweDkwQjEsIDB4MUIxNiwKKyAgICAweDkwQjIsIDB4NERCOSwgMHg5MEIzLCAweDQzMDAsIDB4OTBCNCwgMHgzQjVELCAweDkwQjUsIDB4MUIxNywgMHg5MEI2LAorICAgIDB4NDk1RCwgMHg5MEI4LCAweDBDMUIsIDB4OTBCRCwgMHg0REJBLCAweDkwQkUsIDB4NDMwMSwgMHg5MEMxLCAweDA0QUUsCisgICAgMHg5MEMzLCAweDQ5NUUsIDB4OTBDNCwgMHg0MzAyLCAweDkwQzUsIDB4NDMwMywgMHg5MEM3LCAweDQzMDQsIDB4OTBDOCwKKyAgICAweDQ5NUYsIDB4OTBDOSwgMHg0REJCLCAweDkwQ0EsIDB4MDdFQiwgMHg5MENFLCAweDBGRTAsIDB4OTBENywgMHgzQjVFLAorICAgIDB4OTBEQiwgMHgxQjFCLCAweDkwREMsIDB4NDk2MSwgMHg5MERELCAweDNCNUYsIDB4OTBERSwgMHgyMUJCLCAweDkwREYsCisgICAgMHg0OTYyLCAweDkwRTEsIDB4MDcwQSwgMHg5MEUyLCAweDFCMTgsIDB4OTBFNCwgMHgxQjE5LCAweDkwRTgsIDB4MERFNiwKKyAgICAweDkwRUIsIDB4NDk2NywgMHg5MEVELCAweDA1QjIsIDB4OTBFRiwgMHg0MzA1LCAweDkwRjAsIDB4NERCQywgMHg5MEYyLAorICAgIDB4NDk2NSwgMHg5MEY0LCAweDNCNjAsIDB4OTBGNSwgMHgwRjIzLCAweDkwRjYsIDB4NDk2NCwgMHg5MEY3LCAweDA2QjcsCisgICAgMHg5MEZELCAweDBDNEUsIDB4OTBGRSwgMHg0OTY4LCAweDkwRkYsIDB4NDk2OSwgMHg5MTAwLCAweDQ5NjYsIDB4OTEwMiwKKyAgICAweDFCMUMsIDB4OTEwNCwgMHg0OTZBLCAweDkxMDUsIDB4NERCRCwgMHg5MTA2LCAweDQ5NkIsIDB4OTExMiwgMHgxQjFELAorICAgIDB4OTExNCwgMHg0MzA2LCAweDkxMTUsIDB4MjFCRCwgMHg5MTE2LCAweDQzMDcsIDB4OTExNywgMHgzQjYxLCAweDkxMTgsCisgICAgMHg0OTZDLCAweDkxMTksIDB4MUIxRSwgMHg5MTFDLCAweDNCNjIsIDB4OTExRSwgMHg0OTZELCAweDkxMjIsIDB4NDMwOCwKKyAgICAweDkxMjMsIDB4NDMwOSwgMHg5MTI1LCAweDREQkUsIDB4OTEyNywgMHgyMUJFLCAweDkxMkQsIDB4MEMxQywgMHg5MTJGLAorICAgIDB4NDMwQSwgMHg5MTMwLCAweDFCMjAsIDB4OTEzMSwgMHgzQjYzLCAweDkxMzIsIDB4MUIxRiwgMHg5MTM0LCAweDQzMEIsCisgICAgMHg5MTM3LCAweDQ5NkUsIDB4OTEzOSwgMHg0OTZGLCAweDkxM0EsIDB4M0I2NCwgMHg5MTNELCAweDNCNjUsIDB4OTE0NiwKKyAgICAweDQ5NzAsIDB4OTE0NywgMHg0OTcxLCAweDkxNDgsIDB4M0I2NiwgMHg5MTQ5LCAweDBDQUIsIDB4OTE0QSwgMHgxQjIxLAorICAgIDB4OTE0QiwgMHgwOTQwLCAweDkxNEMsIDB4MDkwQywgMHg5MTRELCAweDBEMTEsIDB4OTE0RSwgMHgwQkFGLCAweDkxNTIsCisgICAgMHgwOTFFLCAweDkxNTQsIDB4MEEzMiwgMHg5MTU2LCAweDFCMjIsIDB4OTE1NywgMHg0OTcyLCAweDkxNTgsIDB4MUIyMywKKyAgICAweDkxNTksIDB4NDk3MywgMHg5MTVBLCAweDREQkYsIDB4OTE1QiwgMHgzQjY3LCAweDkxNjEsIDB4M0I2OCwgMHg5MTYyLAorICAgIDB4MEEyMywgMHg5MTYzLCAweDFCMjQsIDB4OTE2NCwgMHgzQjY5LCAweDkxNjUsIDB4MUIyNSwgMHg5MTY3LCAweDREQzAsCisgICAgMHg5MTY5LCAweDFCMjYsIDB4OTE2QSwgMHgwRjU5LCAweDkxNkMsIDB4MDk0MSwgMHg5MTcyLCAweDFCMjgsIDB4OTE3MywKKyAgICAweDFCMjcsIDB4OTE3NCwgMHg0OTc0LCAweDkxNzUsIDB4MDdFQywgMHg5MTc3LCAweDA4MDUsIDB4OTE3OCwgMHgwODhFLAorICAgIDB4OTE3OSwgMHg0OTc1LCAweDkxN0EsIDB4NERDMSwgMHg5MTgyLCAweDFCMkIsIDB4OTE4MywgMHg0MzBDLCAweDkxODUsCisgICAgMHg0OTc2LCAweDkxODcsIDB4MDk3MCwgMHg5MTg5LCAweDFCMkEsIDB4OTE4QSwgMHg0REMyLCAweDkxOEIsIDB4MUIyOSwKKyAgICAweDkxOEQsIDB4MEI0OSwgMHg5MThFLCAweDNCNkEsIDB4OTE5MCwgMHgwN0EzLCAweDkxOTEsIDB4NERDMywgMHg5MTkyLAorICAgIDB4MEE2NywgMHg5MTk1LCAweDREQzQsIDB4OTE5NywgMHgwRDQ0LCAweDkxOUMsIDB4MDk0MywgMHg5MTlFLCAweDNCNkIsCisgICAgMHg5MUEyLCAweDFCMkMsIDB4OTFBNCwgMHgwOUM3LCAweDkxQTgsIDB4M0I2QywgMHg5MUFBLCAweDFCMkYsIDB4OTFBQiwKKyAgICAweDFCMkQsIDB4OTFBQywgMHgxRTFCLCAweDkxQUQsIDB4M0I2RCwgMHg5MUFFLCAweDNCNkUsIDB4OTFBRiwgMHgxQjJFLAorICAgIDB4OTFCMCwgMHg0REM1LCAweDkxQjEsIDB4MUU2MSwgMHg5MUIyLCAweDNCNkYsIDB4OTFCMywgMHg0OTc3LCAweDkxQjQsCisgICAgMHgxQjMxLCAweDkxQjUsIDB4MUIzMCwgMHg5MUI2LCAweDQ5NzgsIDB4OTFCOCwgMHgwOUUyLCAweDkxQkEsIDB4MUIzMiwKKyAgICAweDkxQkIsIDB4NERDNiwgMHg5MUJDLCAweDNCNzAsIDB4OTFCRCwgMHg0REM3LCAweDkxQzAsIDB4MUIzMywgMHg5MUMxLAorICAgIDB4MUIzNCwgMHg5MUMyLCAweDREQzgsIDB4OTFDMywgMHg0OTc5LCAweDkxQzQsIDB4NDk3QSwgMHg5MUM1LCAweDREQzksCisgICAgMHg5MUM2LCAweDBENjQsIDB4OTFDNywgMHgwODQzLCAweDkxQzgsIDB4MDkwRCwgMHg5MUM5LCAweDFCMzUsIDB4OTFDQiwKKyAgICAweDFCMzYsIDB4OTFDQywgMHgwRjZDLCAweDkxQ0QsIDB4MDk0RiwgMHg5MUNFLCAweDBFRkEsIDB4OTFDRiwgMHgwRjk0LAorICAgIDB4OTFEMCwgMHgxQjM3LCAweDkxRDEsIDB4MDZEQSwgMHg5MUQ2LCAweDFCMzgsIDB4OTFENywgMHgyMUMwLCAweDkxRDgsCisgICAgMHgwQzFELCAweDkxREEsIDB4MjFCRiwgMHg5MURCLCAweDFCM0IsIDB4OTFEQywgMHgwNUQ2LCAweDkxREQsIDB4MEExMSwKKyAgICAweDkxREUsIDB4MjFDMSwgMHg5MURGLCAweDFCMzksIDB4OTFFMSwgMHgxQjNBLCAweDkxRTMsIDB4MEJGQywgMHg5MUU0LAorICAgIDB4MjFDNCwgMHg5MUU1LCAweDIxQzUsIDB4OTFFNiwgMHgwRTgzLCAweDkxRTcsIDB4MDZGNCwgMHg5MUVDLCAweDQ5N0QsCisgICAgMHg5MUVELCAweDIxQzIsIDB4OTFFRSwgMHgyMUMzLCAweDkxRjAsIDB4M0I3MSwgMHg5MUYxLCAweDQzMEQsIDB4OTFGNSwKKyAgICAweDFCM0QsIDB4OTFGNiwgMHgxQjNFLCAweDkxRjcsIDB4M0I3MiwgMHg5MUZCLCAweDNCNzMsIDB4OTFGQywgMHgxQjNDLAorICAgIDB4OTFGRiwgMHgxQjQwLCAweDkyMDAsIDB4NERDQSwgMHg5MjAxLCAweDQ5N0UsIDB4OTIwNiwgMHgyMUM2LCAweDkyMDcsCisgICAgMHgzQjc0LCAweDkyMDksIDB4NERDQiwgMHg5MjBBLCAweDIxQzgsIDB4OTIwRCwgMHgwQ0I3LCAweDkyMEUsIDB4MDVBMSwKKyAgICAweDkyMTAsIDB4MjFDNywgMHg5MjExLCAweDFCNDQsIDB4OTIxNCwgMHgxQjQxLCAweDkyMTUsIDB4MUI0MywgMHg5MjE2LAorICAgIDB4NDk3RiwgMHg5MjE3LCAweDQ5ODAsIDB4OTIxRSwgMHgxQjNGLCAweDkyMjMsIDB4NERDQywgMHg5MjI4LCAweDNCNzUsCisgICAgMHg5MjI5LCAweDFCOEEsIDB4OTIyQywgMHgxQjQyLCAweDkyMzMsIDB4M0I3NiwgMHg5MjM0LCAweDBGQjMsIDB4OTIzNywKKyAgICAweDA3OEUsIDB4OTIzOCwgMHgzQjc3LCAweDkyMzksIDB4MjFDRiwgMHg5MjNBLCAweDIxQzksIDB4OTIzQywgMHgyMUNCLAorICAgIDB4OTIzRiwgMHgxQjRDLCAweDkyNDAsIDB4MjFDQSwgMHg5MjQyLCAweDQ5ODIsIDB4OTI0MywgMHgzQjc4LCAweDkyNDQsCisgICAgMHgwQzJFLCAweDkyNDUsIDB4MUI0NywgMHg5MjQ3LCAweDNCNzksIDB4OTI0OCwgMHgxQjRBLCAweDkyNDksIDB4MUI0OCwKKyAgICAweDkyNEEsIDB4NDk4MywgMHg5MjRCLCAweDFCNEQsIDB4OTI0RSwgMHgyMUNDLCAweDkyNEYsIDB4M0I3QSwgMHg5MjUwLAorICAgIDB4MUI0RSwgMHg5MjUxLCAweDIxQ0UsIDB4OTI1NiwgMHg0OTg0LCAweDkyNTcsIDB4MUI0NiwgMHg5MjU5LCAweDIxQ0QsCisgICAgMHg5MjVBLCAweDFCNTMsIDB4OTI1QiwgMHgwNTE2LCAweDkyNUUsIDB4MUI0NSwgMHg5MjYwLCAweDNCN0IsIDB4OTI2MSwKKyAgICAweDQ5ODUsIDB4OTI2MiwgMHgwRDQxLCAweDkyNjQsIDB4MUI0OSwgMHg5MjY1LCAweDQ5ODYsIDB4OTI2NiwgMHgwOUM4LAorICAgIDB4OTI2NywgMHgyMUQwLCAweDkyNjgsIDB4NDk4NywgMHg5MjcxLCAweDA3RUQsIDB4OTI3NiwgMHg0RENELCAweDkyNzcsCisgICAgMHgyMUQyLCAweDkyNzgsIDB4MjFEMywgMHg5MjdDLCAweDQ5ODksIDB4OTI3RCwgMHg0OThBLCAweDkyN0UsIDB4MEU3NiwKKyAgICAweDkyN0YsIDB4NDk4QiwgMHg5MjgwLCAweDA2REMsIDB4OTI4MywgMHgwOTUwLCAweDkyODUsIDB4MEM5NCwgMHg5Mjg4LAorICAgIDB4MjBBQSwgMHg5Mjg5LCAweDQ5OEMsIDB4OTI4RCwgMHg0OThELCAweDkyOEUsIDB4NERDRSwgMHg5MjkxLCAweDBBQUYsCisgICAgMHg5MjkzLCAweDFCNTEsIDB4OTI5NSwgMHgxQjRCLCAweDkyOTYsIDB4MUI1MCwgMHg5Mjk3LCAweDQ5OEUsIDB4OTI5OCwKKyAgICAweDBFQ0YsIDB4OTI5OSwgMHg0OThGLCAweDkyOUEsIDB4MEJENCwgMHg5MjlCLCAweDFCNTIsIDB4OTI5QywgMHgxQjRGLAorICAgIDB4OTI5RiwgMHg0OTkwLCAweDkyQTcsIDB4MjFEMSwgMHg5MkFCLCAweDQ5OTEsIDB4OTJBRCwgMHgwQUFFLCAweDkyQUYsCisgICAgMHg0RENGLCAweDkyQjIsIDB4NDk5NCwgMHg5MkIzLCAweDM1NTQsIDB4OTJCNywgMHgxQjU2LCAweDkyQjksIDB4MUI1NSwKKyAgICAweDkyQkIsIDB4NEREMCwgMHg5MkJDLCAweDRERDEsIDB4OTJCRiwgMHg0OTk1LCAweDkyQzAsIDB4NDk5NiwgMHg5MkMxLAorICAgIDB4NEREMiwgMHg5MkMyLCAweDNCN0MsIDB4OTJDMywgMHg0REQzLCAweDkyQzUsIDB4NERENCwgMHg5MkM2LCAweDQ5OTcsCisgICAgMHg5MkM4LCAweDRERDUsIDB4OTJDQiwgMHgzQjdELCAweDkyQ0MsIDB4M0I3RSwgMHg5MkNFLCAweDQ5OTgsIDB4OTJDRiwKKyAgICAweDFCNTQsIDB4OTJEMCwgMHgyMUQ3LCAweDkyRDIsIDB4MEU1RCwgMHg5MkQzLCAweDIxREIsIDB4OTJENSwgMHgyMUQ5LAorICAgIDB4OTJENywgMHgyMUQ1LCAweDkyRDksIDB4MjFENiwgMHg5MkRGLCAweDNCN0YsIDB4OTJFMCwgMHgyMURBLCAweDkyRTQsCisgICAgMHgwOTg1LCAweDkyRTUsIDB4NDk5OSwgMHg5MkU3LCAweDIxRDQsIDB4OTJFOSwgMHgxQjU3LCAweDkyRUEsIDB4MEUyRiwKKyAgICAweDkyRUQsIDB4MDRGNiwgMHg5MkYyLCAweDBEQjgsIDB4OTJGMywgMHgwQkIwLCAweDkyRjcsIDB4NDk5RCwgMHg5MkY4LAorICAgIDB4MDY5MiwgMHg5MkY5LCAweDIwQjAsIDB4OTJGQSwgMHgxQjU5LCAweDkyRkIsIDB4MjFERSwgMHg5MkZDLCAweDA3RUYsCisgICAgMHg5MkZGLCAweDIxRTEsIDB4OTMwMiwgMHgyMUUzLCAweDkzMDQsIDB4MzQ1QSwgMHg5MzA2LCAweDA4N0EsIDB4OTMwRCwKKyAgICAweDNCODAsIDB4OTMwRiwgMHgxQjU4LCAweDkzMTAsIDB4MEEzMywgMHg5MzExLCAweDQ5OUEsIDB4OTMxNCwgMHg0REQ2LAorICAgIDB4OTMxNSwgMHgzQjgxLCAweDkzMTgsIDB4MEEzNCwgMHg5MzE5LCAweDFCNUMsIDB4OTMxQSwgMHgxQjVFLCAweDkzMUQsCisgICAgMHgyMUUyLCAweDkzMUUsIDB4MjFFMCwgMHg5MzFGLCAweDNCODIsIDB4OTMyMCwgMHgwOUUzLCAweDkzMjEsIDB4MjFERCwKKyAgICAweDkzMjIsIDB4MUI1RCwgMHg5MzIzLCAweDFCNUYsIDB4OTMyNSwgMHgyMURDLCAweDkzMjYsIDB4MDZDQiwgMHg5MzI3LAorICAgIDB4M0I4MywgMHg5MzI4LCAweDBEQjcsIDB4OTMyOSwgMHg0OTlFLCAweDkzMkIsIDB4MDkwRSwgMHg5MzJDLCAweDBGQzksCisgICAgMHg5MzJFLCAweDFCNUIsIDB4OTMyRiwgMHgwODY4LCAweDkzMzIsIDB4MEZFNSwgMHg5MzMzLCAweDRERDcsIDB4OTMzNSwKKyAgICAweDFCNjEsIDB4OTMzNiwgMHg0REQ4LCAweDkzM0EsIDB4MUI2MCwgMHg5MzNCLCAweDFCNjIsIDB4OTM0NCwgMHgxQjVBLAorICAgIDB4OTM0NywgMHgzQjg0LCAweDkzNDgsIDB4MjBBOSwgMHg5MzQ5LCAweDQzMEUsIDB4OTM0QSwgMHgzNDU4LCAweDkzNEIsCisgICAgMHgwQ0MxLCAweDkzNEQsIDB4MEM0RiwgMHg5MzUxLCAweDQ5QTEsIDB4OTM1MiwgMHgzQjg1LCAweDkzNTQsIDB4MEJGMywKKyAgICAweDkzNTYsIDB4MUI2NywgMHg5MzU3LCAweDIxRTUsIDB4OTM1OCwgMHg0REQ5LCAweDkzNUEsIDB4NDlBMiwgMHg5MzVCLAorICAgIDB4MEI4MSwgMHg5MzVDLCAweDFCNjMsIDB4OTM2MCwgMHgxQjY0LCAweDkzNjQsIDB4NDMwRiwgMHg5MzY1LCAweDQzMTAsCisgICAgMHg5MzZBLCAweDNCODcsIDB4OTM2QiwgMHg0OUEzLCAweDkzNkMsIDB4MDcwMywgMHg5MzZELCAweDNCODgsIDB4OTM2RSwKKyAgICAweDFCNjYsIDB4OTM3MCwgMHgyMUU0LCAweDkzNzEsIDB4NDlBNCwgMHg5MzczLCAweDQ5QTUsIDB4OTM3NSwgMHgwNzY0LAorICAgIDB4OTM3QywgMHgxQjY1LCAweDkzN0UsIDB4MDlDOSwgMHg5MzdGLCAweDREREEsIDB4OTM4MiwgMHg0RERCLCAweDkzODgsCisgICAgMHg0OUE5LCAweDkzOEEsIDB4NEREQywgMHg5MzhCLCAweDQ5QUEsIDB4OTM4QywgMHgwNUQ3LCAweDkzOEYsIDB4NDlBQiwKKyAgICAweDkzOTQsIDB4MUI2QiwgMHg5Mzk2LCAweDA4MkYsIDB4OTM5NywgMHgwQUZCLCAweDkzOUEsIDB4MEJFNiwgMHg5MzlCLAorICAgIDB4M0I4OSwgMHg5MzlFLCAweDQ5QUMsIDB4OTNBMSwgMHg0OUE2LCAweDkzQTMsIDB4NDMxMSwgMHg5M0E0LCAweDIxRTYsCisgICAgMHg5M0E3LCAweDA1OTksIDB4OTNBOSwgMHgzQjhCLCAweDkzQUMsIDB4MUI2OSwgMHg5M0FELCAweDFCNkEsIDB4OTNBRSwKKyAgICAweDBCREYsIDB4OTNCMCwgMHgxQjY4LCAweDkzQjksIDB4MUI2QywgMHg5M0JBLCAweDNCOEEsIDB4OTNCQiwgMHg0RERELAorICAgIDB4OTNDMSwgMHgzQjhDLCAweDkzQzMsIDB4MUI3MiwgMHg5M0M2LCAweDIxRTcsIDB4OTNDNywgMHg0OUIxLCAweDkzQzgsCisgICAgMHgxQjc1LCAweDkzQ0EsIDB4M0I4RCwgMHg5M0NDLCAweDREREUsIDB4OTNEMCwgMHgxQjc0LCAweDkzRDEsIDB4MEMyNywKKyAgICAweDkzRDYsIDB4MUI2RCwgMHg5M0Q3LCAweDFCNkUsIDB4OTNEOCwgMHgxQjcxLCAweDkzREMsIDB4NDlCMiwgMHg5M0RELAorICAgIDB4MUI3MywgMHg5M0RFLCAweDIxRTgsIDB4OTNERiwgMHg0MzEyLCAweDkzRTEsIDB4MDZCOCwgMHg5M0UyLCAweDNCOEUsCisgICAgMHg5M0U0LCAweDFCNzYsIDB4OTNFNSwgMHgxQjcwLCAweDkzRTYsIDB4NERERiwgMHg5M0U3LCAweDQ5QjMsIDB4OTNFOCwKKyAgICAweDFCNkYsIDB4OTNGMSwgMHg0OUIwLCAweDkzRjUsIDB4NDlBRCwgMHg5M0Y4LCAweDIxRTksIDB4OTNGOSwgMHg0REUwLAorICAgIDB4OTNGQSwgMHgzQjhGLCAweDkzRkIsIDB4NDlCNywgMHg5M0ZELCAweDNCOTAsIDB4OTQwMiwgMHg0REUxLCAweDk0MDMsCisgICAgMHgxQjdBLCAweDk0MDQsIDB4NDMxMywgMHg5NDA3LCAweDFCN0IsIDB4OTQwOSwgMHg0OUI0LCAweDk0MEQsIDB4NERFMiwKKyAgICAweDk0MEUsIDB4NERFMywgMHg5NDBGLCAweDNCOTEsIDB4OTQxMCwgMHgxQjdDLCAweDk0MTMsIDB4MUI3OSwgMHg5NDE0LAorICAgIDB4MUI3OCwgMHg5NDE2LCAweDQ5QjUsIDB4OTQxNywgMHg0OUI2LCAweDk0MTgsIDB4MDlDQSwgMHg5NDE5LCAweDBDODIsCisgICAgMHg5NDFBLCAweDFCNzcsIDB4OTQyMSwgMHgxQjgwLCAweDk0MkIsIDB4MUI3RSwgMHg5NDJFLCAweDRERTQsIDB4OTQzMSwKKyAgICAweDIxRUEsIDB4OTQzMiwgMHg0OUI4LCAweDk0MzMsIDB4NDMxNCwgMHg5NDM0LCAweDNCOTIsIDB4OTQzNSwgMHgxQjdGLAorICAgIDB4OTQzNiwgMHgxQjdELCAweDk0MzgsIDB4MEI1OCwgMHg5NDNBLCAweDFCODEsIDB4OTQzQiwgMHg0OUI5LCAweDk0M0YsCisgICAgMHgzQjkzLCAweDk0NDEsIDB4MUI4MiwgMHg5NDQ0LCAweDFCODQsIDB4OTQ0NSwgMHgyMUVCLCAweDk0NDgsIDB4MjFFQywKKyAgICAweDk0NEEsIDB4NDMxNSwgMHg5NDRDLCAweDRERTUsIDB4OTQ1MSwgMHgwNjExLCAweDk0NTIsIDB4MUI4MywgMHg5NDUzLAorICAgIDB4MEYwNiwgMHg5NDU1LCAweDNCOTQsIDB4OTQ1QSwgMHgxQjhGLCAweDk0NUIsIDB4MUI4NSwgMHg5NDVFLCAweDFCODgsCisgICAgMHg5NDYwLCAweDFCODYsIDB4OTQ2MiwgMHgxQjg3LCAweDk0NjMsIDB4NDMxNiwgMHg5NDZBLCAweDFCODksIDB4OTQ2QiwKKyAgICAweDNCOTUsIDB4OTQ2RCwgMHg0OUJDLCAweDk0NkYsIDB4NDlCRCwgMHg5NDcwLCAweDFCOEIsIDB4OTQ3MSwgMHg0MzE3LAorICAgIDB4OTQ3MiwgMHgzQjk2LCAweDk0NzUsIDB4MUI4QywgMHg5NDc3LCAweDFCOEQsIDB4OTQ3QywgMHgxQjkwLCAweDk0N0QsCisgICAgMHgxQjhFLCAweDk0N0UsIDB4MUI5MSwgMHg5NDdGLCAweDFCOTMsIDB4OTQ4MSwgMHgxQjkyLCAweDk1NzcsIDB4MEJENSwKKyAgICAweDk1NzgsIDB4M0I5NywgMHg5NTc5LCAweDQ5QkUsIDB4OTU4MCwgMHgwRUYzLCAweDk1ODIsIDB4MUI5NCwgMHg5NTgzLAorICAgIDB4MEFCMCwgMHg5NTg2LCAweDQ5QkYsIDB4OTU4NywgMHgxQjk1LCAweDk1ODgsIDB4NERFNiwgMHg5NTg5LCAweDBFMTQsCisgICAgMHg5NThBLCAweDFCOTYsIDB4OTU4QiwgMHgwNTg5LCAweDk1OEMsIDB4NDlDMCwgMHg5NThELCAweDQ5QzEsIDB4OTU4RSwKKyAgICAweDQzMTgsIDB4OTU4RiwgMHgwNERFLCAweDk1OTEsIDB4MDYxMywgMHg5NTkyLCAweDIxRUQsIDB4OTU5MywgMHgwNjEyLAorICAgIDB4OTU5NCwgMHgxQjk3LCAweDk1OTYsIDB4MUI5OCwgMHg5NTk4LCAweDFCOTksIDB4OTU5OSwgMHgxQjlBLCAweDk1OUYsCisgICAgMHg0MzE5LCAweDk1QTAsIDB4MUI5QiwgMHg5NUExLCAweDRERTcsIDB4OTVBMiwgMHgwNjE0LCAweDk1QTMsIDB4MDVCMywKKyAgICAweDk1QTQsIDB4MDdGMCwgMHg5NUE1LCAweDBENEEsIDB4OTVBNiwgMHgzQjk4LCAweDk1QTcsIDB4MUI5RCwgMHg5NUE4LAorICAgIDB4MUI5QywgMHg5NUE5LCAweDNCOTksIDB4OTVBQiwgMHg0RjU5LCAweDk1QUMsIDB4NDMxQSwgMHg5NUFELCAweDFCOUUsCisgICAgMHg5NUIxLCAweDM1NTUsIDB4OTVCMiwgMHgwNEZFLCAweDk1QjQsIDB4M0I5QiwgMHg5NUI2LCAweDQzMUIsIDB4OTVCOSwKKyAgICAweDFCQTEsIDB4OTVCQiwgMHgxQkEwLCAweDk1QkMsIDB4MUI5RiwgMHg5NUJELCAweDNCOUMsIDB4OTVCRSwgMHgxQkEyLAorICAgIDB4OTVCRiwgMHg0REU4LCAweDk1QzMsIDB4MUJBNSwgMHg5NUM2LCAweDRERTksIDB4OTVDNywgMHgwNDhCLCAweDk1QzgsCisgICAgMHg0OUM0LCAweDk1QzksIDB4NERFQSwgMHg5NUNBLCAweDFCQTMsIDB4OTVDQiwgMHg0MzFDLCAweDk1Q0MsIDB4MUJBNywKKyAgICAweDk1Q0QsIDB4MUJBNiwgMHg5NUQwLCAweDQzMUQsIDB4OTVEMSwgMHg0REVCLCAweDk1RDIsIDB4NERFQywgMHg5NUQzLAorICAgIDB4NDMxRSwgMHg5NUQ0LCAweDFCQTksIDB4OTVENSwgMHgxQkE4LCAweDk1RDYsIDB4MUJBQSwgMHg5NUQ4LCAweDBDODYsCisgICAgMHg5NURBLCAweDNCOUQsIDB4OTVEQywgMHgxQkFCLCAweDk1REUsIDB4NDMyMCwgMHg5NUUwLCAweDRERUQsIDB4OTVFMSwKKyAgICAweDFCQUMsIDB4OTVFMiwgMHgxQkFFLCAweDk1RTQsIDB4NERFRSwgMHg5NUU1LCAweDFCQUQsIDB4OTVFNiwgMHg0REVGLAorICAgIDB4OTYxQywgMHgwRERFLCAweDk2MUQsIDB4M0I5RSwgMHg5NjIxLCAweDFCQUYsIDB4OTYyNCwgMHg0REYwLCAweDk2MjgsCisgICAgMHgxQkIwLCAweDk2MkEsIDB4MDg1NSwgMHg5NjJDLCAweDQ5QzcsIDB4OTYyRSwgMHgxQkIxLCAweDk2MkYsIDB4MUJCMiwKKyAgICAweDk2MzEsIDB4NERGMSwgMHg5NjMyLCAweDBFNzcsIDB4OTYzMywgMHg0OUM4LCAweDk2MzQsIDB4NDlDOSwgMHg5NjM4LAorICAgIDB4NERGMiwgMHg5NjNCLCAweDBBQ0QsIDB4OTYzQywgMHg0OUNCLCAweDk2M0QsIDB4NERGMywgMHg5NjNGLCAweDA0NjgsCisgICAgMHg5NjQwLCAweDBCMkIsIDB4OTY0MSwgMHgzQjlGLCAweDk2NDIsIDB4MUJCMywgMHg5NjQ0LCAweDBEREYsIDB4OTY0QiwKKyAgICAweDFCQjYsIDB4OTY0QywgMHgxQkI0LCAweDk2NEQsIDB4MDdGMSwgMHg5NjRGLCAweDFCQjUsIDB4OTY1MCwgMHgwNzc2LAorICAgIDB4OTY1NCwgMHg0REY0LCAweDk2NTgsIDB4M0JBMCwgMHg5NjVCLCAweDBFMTUsIDB4OTY1QywgMHgxQkI4LCAweDk2NUQsCisgICAgMHgxQkJBLCAweDk2NUUsIDB4MUJCOSwgMHg5NjVGLCAweDFCQkIsIDB4OTY2MSwgMHg0OUNDLCAweDk2NjIsIDB4MDRDMywKKyAgICAweDk2NjMsIDB4MEExRSwgMHg5NjY0LCAweDA5ODYsIDB4OTY2NSwgMHgwNjE1LCAweDk2NjYsIDB4MUJCQywgMHg5NjZBLAorICAgIDB4MEQxQywgMHg5NjZDLCAweDFCQkUsIDB4OTY3MCwgMHgwNEM0LCAweDk2NzIsIDB4MUJCRCwgMHg5NjczLCAweDBCRTAsCisgICAgMHg5Njc0LCAweDRERjUsIDB4OTY3NSwgMHgwRjk1LCAweDk2NzYsIDB4MEM4MywgMHg5Njc3LCAweDFCQjcsIDB4OTY3OCwKKyAgICAweDBGNkUsIDB4OTY3QSwgMHgwNzY1LCAweDk2N0IsIDB4NERGNiwgMHg5NjdELCAweDBGNDUsIDB4OTY3RiwgMHg0REY3LAorICAgIDB4OTY4MSwgMHg0REY4LCAweDk2ODIsIDB4NDlDRSwgMHg5NjgzLCAweDRERjksIDB4OTY4NCwgMHgzQkExLCAweDk2ODUsCisgICAgMHgwNkYxLCAweDk2ODYsIDB4MEY3QywgMHg5Njg4LCAweDA2RkUsIDB4OTY4OSwgMHg0REZBLCAweDk2OEEsIDB4MEI0MiwKKyAgICAweDk2OEIsIDB4MTg2QywgMHg5NjhELCAweDFCQkYsIDB4OTY4RSwgMHgwNThBLCAweDk2OEYsIDB4MEEzNSwgMHg5Njk0LAorICAgIDB4MDVCNCwgMHg5Njk1LCAweDFCQzEsIDB4OTY5NiwgMHg0REZCLCAweDk2OTcsIDB4MUJDMiwgMHg5Njk4LCAweDFCQzAsCisgICAgMHg5Njk5LCAweDA3M0EsIDB4OTY5QSwgMHg0OUQwLCAweDk2OUIsIDB4MDg0RCwgMHg5NjlDLCAweDA5Q0IsIDB4OTY5RCwKKyAgICAweDIxRjAsIDB4OTZBMCwgMHgwNEM1LCAweDk2QTMsIDB4MEZBMSwgMHg5NkE0LCAweDNCQTIsIDB4OTZBNSwgMHg0MzIxLAorICAgIDB4OTZBNywgMHgxQkM0LCAweDk2QTgsIDB4MUIwQiwgMHg5NkE5LCAweDNCQTMsIDB4OTZBQSwgMHgxQkMzLCAweDk2QUUsCisgICAgMHg0REZDLCAweDk2QUYsIDB4MjFGMSwgMHg5NkIwLCAweDFCQzcsIDB4OTZCMSwgMHgxQkM1LCAweDk2QjIsIDB4MUJDNiwKKyAgICAweDk2QjMsIDB4NDlEMywgMHg5NkI0LCAweDFCQzgsIDB4OTZCNiwgMHgxQkM5LCAweDk2QjcsIDB4MEZCNCwgMHg5NkI4LAorICAgIDB4MUJDQSwgMHg5NkI5LCAweDFCQ0IsIDB4OTZCQSwgMHg0OUQ0LCAweDk2QkIsIDB4MEE2RCwgMHg5NkJDLCAweDBENEYsCisgICAgMHg5NkJELCAweDQ5RDUsIDB4OTZDMCwgMHgwQTQzLCAweDk2QzEsIDB4MDYyMywgMHg5NkM0LCAweDBGMjQsIDB4OTZDNSwKKyAgICAweDA1NkQsIDB4OTZDNiwgMHgwOTQyLCAweDk2QzcsIDB4MDc4RiwgMHg5NkM5LCAweDFCQ0UsIDB4OTZDQiwgMHgxQkNELAorICAgIDB4OTZDQywgMHgwOEMxLCAweDk2Q0QsIDB4MUJDRiwgMHg5NkNFLCAweDFCQ0MsIDB4OTZEMSwgMHgwODc2LCAweDk2RDIsCisgICAgMHgzQkE0LCAweDk2RDUsIDB4MUJEMywgMHg5NkQ2LCAweDE5OTIsIDB4OTZEOCwgMHg0OUQ4LCAweDk2RDksIDB4MTBFQiwKKyAgICAweDk2REEsIDB4NDlEOSwgMHg5NkRCLCAweDBBM0QsIDB4OTZEQywgMHgxQkQxLCAweDk2REQsIDB4NDlEQSwgMHg5NkRFLAorICAgIDB4M0JBNiwgMHg5NkUyLCAweDBGNkQsIDB4OTZFMywgMHgwQ0M5LCAweDk2RTgsIDB4MDRDRCwgMHg5NkU5LCAweDNCQTcsCisgICAgMHg5NkVBLCAweDBBODcsIDB4OTZFQiwgMHgwOEUyLCAweDk2RUYsIDB4NDMyMiwgMHg5NkYwLCAweDBFMDcsIDB4OTZGMSwKKyAgICAweDNCQTgsIDB4OTZGMiwgMHgwNEUyLCAweDk2RjYsIDB4MEZCNSwgMHg5NkY3LCAweDBGNTUsIDB4OTZGOSwgMHgxQkQ0LAorICAgIDB4OTZGQiwgMHgwQzNGLCAweDk3MDAsIDB4MDkyNywgMHg5NzAyLCAweDNCQTksIDB4OTcwMywgMHg0REZELCAweDk3MDQsCisgICAgMHgxQkQ1LCAweDk3MDYsIDB4MUJENiwgMHg5NzA3LCAweDBBMTIsIDB4OTcwOCwgMHgxQkQ3LCAweDk3MDksIDB4M0JBQSwKKyAgICAweDk3MEEsIDB4MEZCNiwgMHg5NzBELCAweDFCRDIsIDB4OTcwRSwgMHgxQkQ5LCAweDk3MEYsIDB4MUJEQiwgMHg5NzExLAorICAgIDB4MUJEQSwgMHg5NzEzLCAweDFCRDgsIDB4OTcxNCwgMHg0OURDLCAweDk3MTYsIDB4MUJEQywgMHg5NzE5LCAweDFCREQsCisgICAgMHg5NzFCLCAweDRERkUsIDB4OTcxQywgMHgwQUZDLCAweDk3MUUsIDB4MDU2MiwgMHg5NzIxLCAweDRERkYsIDB4OTcyMiwKKyAgICAweDRFMDAsIDB4OTcyMywgMHg0OURELCAweDk3MjQsIDB4MUJERSwgMHg5NzI3LCAweDBFQzQsIDB4OTcyOCwgMHg0RTAxLAorICAgIDB4OTcyQSwgMHgxQkRGLCAweDk3MzAsIDB4MUJFMCwgMHg5NzMxLCAweDRFMDIsIDB4OTczMiwgMHgwRkQwLCAweDk3MzMsCisgICAgMHgyMUYyLCAweDk3MzYsIDB4NDlERiwgMHg5NzM4LCAweDE0MTQsIDB4OTczOSwgMHgxQkUxLCAweDk3M0IsIDB4MjFGMywKKyAgICAweDk3M0QsIDB4MUJFMiwgMHg5NzNFLCAweDFCRTMsIDB4OTc0MSwgMHg0OUUwLCAweDk3NDIsIDB4MUJFNywgMHg5NzQzLAorICAgIDB4MjFGNCwgMHg5NzQ0LCAweDFCRTQsIDB4OTc0NiwgMHgxQkU1LCAweDk3NDcsIDB4NDlFMSwgMHg5NzQ4LCAweDFCRTYsCisgICAgMHg5NzQ5LCAweDFCRTgsIDB4OTc0RCwgMHgyMUY1LCAweDk3NEUsIDB4NDMyMywgMHg5NzRGLCAweDIxRjYsIDB4OTc1MSwKKyAgICAweDIxRjcsIDB4OTc1MiwgMHgwQTY4LCAweDk3NTUsIDB4NEY1QSwgMHg5NzU2LCAweDBGMDMsIDB4OTc1NywgMHg0OUUyLAorICAgIDB4OTc1OSwgMHgwQTY5LCAweDk3NUEsIDB4M0JBQiwgMHg5NzVCLCAweDQ5RTMsIDB4OTc1QywgMHgxQkU5LCAweDk3NUUsCisgICAgMHgwRDg3LCAweDk3NjAsIDB4MUJFQSwgMHg5NzYxLCAweDFEMDYsIDB4OTc2MiwgMHgwRUQ4LCAweDk3NjMsIDB4M0JBQywKKyAgICAweDk3NjQsIDB4MUJFQiwgMHg5NzY2LCAweDFCRUMsIDB4OTc2NywgMHg0RTAzLCAweDk3NjgsIDB4MUJFRCwgMHg5NzY5LAorICAgIDB4MDVCNSwgMHg5NzZBLCAweDQ5RTQsIDB4OTc2QiwgMHgxQkVGLCAweDk3NkQsIDB4MEExRiwgMHg5NzZFLCAweDNCQUQsCisgICAgMHg5NzcxLCAweDFCRjAsIDB4OTc3MywgMHgzQkFFLCAweDk3NzQsIDB4MDZGQSwgMHg5Nzc2LCAweDRFMDQsIDB4OTc3OSwKKyAgICAweDFCRjEsIDB4OTc3QSwgMHgxQkY1LCAweDk3N0MsIDB4MUJGMywgMHg5NzdELCAweDRFMDUsIDB4OTc3RiwgMHg0RTA2LAorICAgIDB4OTc4MSwgMHgxQkY0LCAweDk3ODQsIDB4MDVEMSwgMHg5Nzg1LCAweDFCRjIsIDB4OTc4NiwgMHgxQkY2LCAweDk3OEIsCisgICAgMHgxQkY3LCAweDk3OEQsIDB4MDQ4QywgMHg5NzhGLCAweDFCRjgsIDB4OTc5MCwgMHgxQkY5LCAweDk3OTUsIDB4NDMyNCwKKyAgICAweDk3OTYsIDB4NDlFNywgMHg5Nzk4LCAweDA5Q0MsIDB4OTc5OSwgMHg0RTA3LCAweDk3OUEsIDB4M0JBRiwgMHg5NzlDLAorICAgIDB4MUJGQSwgMHg5NzlFLCAweDQ5RTgsIDB4OTc5RiwgMHg0RTA4LCAweDk3QTAsIDB4MDY2MSwgMHg5N0EyLCAweDNCQjAsCisgICAgMHg5N0EzLCAweDFCRkQsIDB4OTdBNiwgMHgxQkZDLCAweDk3QTgsIDB4MUJGQiwgMHg5N0FCLCAweDFBMzQsIDB4OTdBQywKKyAgICAweDRFMDksIDB4OTdBRCwgMHgwRTJDLCAweDk3QUUsIDB4NDMyNSwgMHg5N0IxLCAweDQ5RTksIDB4OTdCMiwgMHg0OUVBLAorICAgIDB4OTdCMywgMHgxQkZFLCAweDk3QjQsIDB4MUJGRiwgMHg5N0I1LCAweDNCQjEsIDB4OTdCNiwgMHgzQkIyLCAweDk3QjksCisgICAgMHg0RTBBLCAweDk3QkEsIDB4NDMyNiwgMHg5N0JFLCAweDQ5RUIsIDB4OTdDMSwgMHg0MzI3LCAweDk3QzMsIDB4MUMwMCwKKyAgICAweDk3QzYsIDB4MUMwMSwgMHg5N0M4LCAweDFDMDIsIDB4OTdDOSwgMHg0MzI4LCAweDk3Q0IsIDB4MUMwMywgMHg5N0NDLAorICAgIDB4NDlFQywgMHg5N0NELCAweDRFMEIsIDB4OTdEMSwgMHg0OUVELCAweDk3RDMsIDB4MDYxNiwgMHg5N0Q0LCAweDQ5RUUsCisgICAgMHg5N0Q4LCAweDQ5RUYsIDB4OTdEOSwgMHgzQkIzLCAweDk3REIsIDB4NDMyOSwgMHg5N0RDLCAweDFDMDQsIDB4OTdERSwKKyAgICAweDNCQjQsIDB4OTdFMCwgMHg0RTBDLCAweDk3RTEsIDB4NDlGMCwgMHg5N0VELCAweDFDMDUsIDB4OTdFRSwgMHgwQ0Q5LAorICAgIDB4OTdFRiwgMHg0RTBELCAweDk3RjEsIDB4NDlGMSwgMHg5N0YyLCAweDFDMDcsIDB4OTdGMywgMHgwNTNCLCAweDk3RjQsCisgICAgMHgzQkI1LCAweDk3RjUsIDB4MUMwQSwgMHg5N0Y2LCAweDFDMDksIDB4OTdGQiwgMHgwNEM2LCAweDk3RkYsIDB4MDZCOSwKKyAgICAweDk4MDEsIDB4MEUxNywgMHg5ODAyLCAweDBCRDYsIDB4OTgwMywgMHgwODEyLCAweDk4MDQsIDB4NDlGMiwgMHg5ODA1LAorICAgIDB4MDdGMiwgMHg5ODA2LCAweDA5NzEsIDB4OTgwNywgMHg0RTBFLCAweDk4MDgsIDB4MEEyMiwgMHg5ODBBLCAweDNCQjYsCisgICAgMHg5ODBDLCAweDFDMEMsIDB4OTgwRCwgMHg0OUYzLCAweDk4MEUsIDB4M0JCNywgMHg5ODBGLCAweDFDMEIsIDB4OTgxMCwKKyAgICAweDBGMkMsIDB4OTgxMSwgMHgwNjI0LCAweDk4MTIsIDB4MEQ2NiwgMHg5ODEzLCAweDBDQjQsIDB4OTgxNCwgMHg0OUY0LAorICAgIDB4OTgxNiwgMHg0OUY1LCAweDk4MTcsIDB4MEE0MiwgMHg5ODE4LCAweDBGOTYsIDB4OTgxQSwgMHgwNzMxLCAweDk4MUUsCisgICAgMHgzQkI4LCAweDk4MjEsIDB4MUMwRiwgMHg5ODIzLCAweDNCQjksIDB4OTgyNCwgMHgxQzBFLCAweDk4MjUsIDB4NDlGQSwKKyAgICAweDk4MjYsIDB4NEUwRiwgMHg5ODJCLCAweDNCQkEsIDB4OTgyQywgMHgwRTc5LCAweDk4MkQsIDB4MEM4NCwgMHg5ODJFLAorICAgIDB4NEUxMCwgMHg5ODMwLCAweDFFNzMsIDB4OTgzMiwgMHg0OUY4LCAweDk4MzMsIDB4NDlGOSwgMHg5ODM0LCAweDA0RjIsCisgICAgMHg5ODM3LCAweDFDMTAsIDB4OTgzOCwgMHgxQzBELCAweDk4MzksIDB4MzdCMywgMHg5ODNCLCAweDBEQzMsIDB4OTgzQywKKyAgICAweDBGNTQsIDB4OTgzRCwgMHgxQzExLCAweDk4M0UsIDB4M0JCQiwgMHg5ODQ2LCAweDFDMTIsIDB4OTg0NywgMHg0OUZCLAorICAgIDB4OTg0QiwgMHgxQzE0LCAweDk4NEMsIDB4MEI0QSwgMHg5ODRELCAweDA1QjksIDB4OTg0RSwgMHgwNUJBLCAweDk4NEYsCisgICAgMHgxQzEzLCAweDk4NTIsIDB4M0JCQywgMHg5ODUzLCAweDNCQkQsIDB4OTg1NCwgMHgwNjI1LCAweDk4NTUsIDB4MDc2NiwKKyAgICAweDk4NTYsIDB4NDMyQSwgMHg5ODU3LCAweDIxRjksIDB4OTg1OCwgMHgwNjI2LCAweDk4NTksIDB4M0JCRSwgMHg5ODVBLAorICAgIDB4MUU0OCwgMHg5ODVCLCAweDBDMzksIDB4OTg1RSwgMHgwRkE4LCAweDk4NjIsIDB4NEUxMSwgMHg5ODYzLCAweDRFMTIsCisgICAgMHg5ODY1LCAweDIxRkEsIDB4OTg2NiwgMHg0OUZDLCAweDk4NjcsIDB4MDc5MCwgMHg5ODZCLCAweDFDMTUsIDB4OTg2QywKKyAgICAweDNCQkYsIDB4OTg2RiwgMHgxQzE2LCAweDk4NzAsIDB4MUMxNywgMHg5ODcxLCAweDFDMTgsIDB4OTg3MywgMHgxQzFBLAorICAgIDB4OTg3NCwgMHgxQzE5LCAweDk4QTgsIDB4MERFOSwgMHg5OEFBLCAweDFDMUIsIDB4OThBQiwgMHg0OUZELCAweDk4QUQsCisgICAgMHg0OUZFLCAweDk4QUYsIDB4MUMxQywgMHg5OEIwLCAweDQ5RkYsIDB4OThCMSwgMHgxQzFELCAweDk4QjQsIDB4NEUxMywKKyAgICAweDk4QjYsIDB4MUMxRSwgMHg5OEI3LCAweDRBMDEsIDB4OThCOCwgMHgzQkMwLCAweDk4QkEsIDB4M0JDMSwgMHg5OEJCLAorICAgIDB4NEEwMiwgMHg5OEJDLCAweDRBMDMsIDB4OThCRiwgMHgzQkMyLCAweDk4QzIsIDB4NEEwNCwgMHg5OEMzLCAweDFDMjAsCisgICAgMHg5OEM0LCAweDFDMUYsIDB4OThDNSwgMHg0RTE0LCAweDk4QzYsIDB4MUMyMSwgMHg5OEM3LCAweDRBMDUsIDB4OThDOCwKKyAgICAweDNCQzMsIDB4OThDQiwgMHg0QTA2LCAweDk4REIsIDB4MEQ4OCwgMHg5OERDLCAweDE4MzksIDB4OThERiwgMHgwOUVGLAorICAgIDB4OThFMCwgMHgzNjE4LCAweDk4RTEsIDB4NEEwNywgMHg5OEUyLCAweDA2NEMsIDB4OThFMywgMHg0QTA4LCAweDk4RTUsCisgICAgMHgzQkM0LCAweDk4RTcsIDB4NDMyQiwgMHg5OEU5LCAweDFDMjIsIDB4OThFQSwgMHg0QTA5LCAweDk4RUIsIDB4MUMyMywKKyAgICAweDk4RUQsIDB4MTBDMSwgMHg5OEVFLCAweDE0REEsIDB4OThFRiwgMHgwRDY3LCAweDk4RjAsIDB4NEEwQSwgMHg5OEYxLAorICAgIDB4NEEwQiwgMHg5OEYyLCAweDA0QkYsIDB4OThGMywgMHg0QTBDLCAweDk4RjQsIDB4MDQ3RiwgMHg5OEZDLCAweDA4QzIsCisgICAgMHg5OEZELCAweDBFNUUsIDB4OThGRSwgMHgwOUU2LCAweDk5MDIsIDB4NEUxNSwgMHg5OTAzLCAweDFDMjQsIDB4OTkwNSwKKyAgICAweDBFRUIsIDB4OTkwOCwgMHg0QTBELCAweDk5MDksIDB4MUMyNSwgMHg5OTBBLCAweDBGNDYsIDB4OTkwQywgMHgwNEU0LAorICAgIDB4OTkxMCwgMHgwODhGLCAweDk5MTEsIDB4NEUxNiwgMHg5OTEyLCAweDFDMjYsIDB4OTkxMywgMHgwNTZFLCAweDk5MTQsCisgICAgMHgxQzI3LCAweDk5MTUsIDB4NEUxNywgMHg5OTE2LCAweDRBMTAsIDB4OTkxNywgMHg0QTExLCAweDk5MTgsIDB4MUMyOCwKKyAgICAweDk5MUEsIDB4NEExMywgMHg5OTFCLCAweDRBMTQsIDB4OTkxQywgMHg0QTE1LCAweDk5MUQsIDB4MUMyQSwgMHg5OTFFLAorICAgIDB4MUMyQiwgMHg5OTIwLCAweDFDMkQsIDB4OTkyMSwgMHgxQzI5LCAweDk5MjQsIDB4MUMyQywgMHg5OTI3LCAweDIxRkQsCisgICAgMHg5OTI4LCAweDA2MTcsIDB4OTkyQywgMHgxQzJFLCAweDk5MkUsIDB4MUMyRiwgMHg5OTMxLCAweDRBMTcsIDB4OTkzMiwKKyAgICAweDNCQzUsIDB4OTkzMywgMHgzQkM2LCAweDk5MzUsIDB4NEUxOCwgMHg5OTNBLCAweDRBMTgsIDB4OTkzQiwgMHg0QTE5LAorICAgIDB4OTkzQywgMHg0QTFBLCAweDk5M0QsIDB4MUMzMCwgMHg5OTNFLCAweDFDMzEsIDB4OTk0MCwgMHgzQkM3LCAweDk5NDEsCisgICAgMHg0QTFCLCAweDk5NDIsIDB4MUMzMiwgMHg5OTQ1LCAweDFDMzQsIDB4OTk0NiwgMHg0QTFDLCAweDk5NDgsIDB4NEUxOSwKKyAgICAweDk5NDksIDB4MUMzMywgMHg5OTRCLCAweDFDMzYsIDB4OTk0QywgMHgxQzM5LCAweDk5NEQsIDB4M0JDOCwgMHg5OTRFLAorICAgIDB4NEExRCwgMHg5OTUwLCAweDFDMzUsIDB4OTk1MSwgMHgxQzM3LCAweDk5NTIsIDB4MUMzOCwgMHg5OTU0LCAweDRFMUEsCisgICAgMHg5OTU1LCAweDFDM0EsIDB4OTk1NywgMHgwNkJBLCAweDk5NTgsIDB4NDMyQywgMHg5OTVDLCAweDNCQzksIDB4OTk1RSwKKyAgICAweDRFMUIsIDB4OTk1RiwgMHgzQkNBLCAweDk5NjAsIDB4NEExRSwgMHg5OTk2LCAweDA5MUYsIDB4OTk5NywgMHgxQzNCLAorICAgIDB4OTk5OCwgMHgxQzNDLCAweDk5OTksIDB4MDdGMywgMHg5OTlFLCAweDIxRkYsIDB4OTlBMywgMHg0QTFGLCAweDk5QTUsCisgICAgMHgxQzNELCAweDk5QTYsIDB4NEEyMCwgMHg5OUE4LCAweDA1OUMsIDB4OTlBQywgMHgwRDA1LCAweDk5QUQsIDB4MUMzRSwKKyAgICAweDk5QUUsIDB4MUMzRiwgMHg5OUIxLCAweDNCQ0IsIDB4OTlCMywgMHgwQjk4LCAweDk5QjQsIDB4MENDMywgMHg5OUI5LAorICAgIDB4M0JDQywgMHg5OUJBLCAweDNCQ0QsIDB4OTlCQywgMHgxQzQwLCAweDk5QkQsIDB4NEEyMSwgMHg5OUJGLCAweDRBMjIsCisgICAgMHg5OUMxLCAweDBEMzMsIDB4OTlDMywgMHg0QTIzLCAweDk5QzQsIDB4MEIyQywgMHg5OUM1LCAweDA0RkEsIDB4OTlDNiwKKyAgICAweDA2RTYsIDB4OTlDOCwgMHgwNkU3LCAweDk5QzksIDB4M0JDRSwgMHg5OUQwLCAweDBCQjEsIDB4OTlEMSwgMHgxQzQ1LAorICAgIDB4OTlEMiwgMHgwNkU4LCAweDk5RDQsIDB4NEEyNCwgMHg5OUQ1LCAweDA1NkYsIDB4OTlEOCwgMHgxQzQ0LCAweDk5RDksCisgICAgMHg0QTI1LCAweDk5REIsIDB4MUM0MiwgMHg5OURELCAweDFDNDMsIDB4OTlERSwgMHg0QTI2LCAweDk5REYsIDB4MUM0MSwKKyAgICAweDk5RTEsIDB4NEUxQywgMHg5OUUyLCAweDFDNEYsIDB4OTlFRCwgMHgxQzQ2LCAweDk5RUUsIDB4MUM0NywgMHg5OUYwLAorICAgIDB4NEEyOCwgMHg5OUYxLCAweDFDNDgsIDB4OTlGMiwgMHgxQzQ5LCAweDk5RjgsIDB4MUM0QiwgMHg5OUY5LCAweDRBMjksCisgICAgMHg5OUZCLCAweDFDNEEsIDB4OTlGQywgMHg0QTJBLCAweDk5RkYsIDB4MDk2MywgMHg5QTAxLCAweDFDNEMsIDB4OUEwMiwKKyAgICAweDNCQ0YsIDB4OUEwMywgMHg0MzJELCAweDlBMDUsIDB4MUM0RSwgMHg5QTA4LCAweDM3QkEsIDB4OUEwQSwgMHg0QTJCLAorICAgIDB4OUEwQywgMHg0RTFELCAweDlBMEUsIDB4MDY0RCwgMHg5QTBGLCAweDFDNEQsIDB4OUExMCwgMHg0RTFFLCAweDlBMTEsCisgICAgMHg0QTJDLCAweDlBMTIsIDB4MEFGRCwgMHg5QTEzLCAweDA3NjcsIDB4OUExNiwgMHgzQkQwLCAweDlBMTksIDB4MUM1MCwKKyAgICAweDlBMUEsIDB4NEEyRCwgMHg5QTIwLCAweDRBMkUsIDB4OUEyMywgMHg0RTFGLCAweDlBMjQsIDB4M0JEMSwgMHg5QTI3LAorICAgIDB4M0JEMiwgMHg5QTI4LCAweDBCMkQsIDB4OUEyQiwgMHgxQzUxLCAweDlBMkQsIDB4M0JEMywgMHg5QTJFLCAweDNCRDQsCisgICAgMHg5QTMwLCAweDBDODUsIDB4OUEzMSwgMHg0QTJGLCAweDlBMzYsIDB4M0JENSwgMHg5QTM3LCAweDFDNTIsIDB4OUEzOCwKKyAgICAweDNCRDYsIDB4OUEzRSwgMHgxQzU3LCAweDlBNDAsIDB4MUM1NSwgMHg5QTQxLCAweDRFMjAsIDB4OUE0MiwgMHgxQzU0LAorICAgIDB4OUE0MywgMHgxQzU2LCAweDlBNDQsIDB4NEEzMCwgMHg5QTQ1LCAweDFDNTMsIDB4OUE0QSwgMHgzQkQ3LCAweDlBNEMsCisgICAgMHg0QTMxLCAweDlBNEQsIDB4MUM1OSwgMHg5QTRFLCAweDIyMDAsIDB4OUE1MSwgMHg0RTIxLCAweDlBNTIsIDB4MUUyRiwKKyAgICAweDlBNTUsIDB4MUM1OCwgMHg5QTU2LCAweDNCRDgsIDB4OUE1NywgMHgxQzVCLCAweDlBNTgsIDB4NEEzMiwgMHg5QTVBLAorICAgIDB4MDZCQiwgMHg5QTVCLCAweDFDNUEsIDB4OUE1RiwgMHgxQzVDLCAweDlBNjIsIDB4MUM1RCwgMHg5QTY0LCAweDFDNUYsCisgICAgMHg5QTY1LCAweDFDNUUsIDB4OUE2OSwgMHgxQzYwLCAweDlBNkEsIDB4MUM2MiwgMHg5QTZCLCAweDFDNjEsIDB4OUFBOCwKKyAgICAweDA4MEUsIDB4OUFBRCwgMHgxQzYzLCAweDlBQUYsIDB4NEEzNCwgMHg5QUIwLCAweDFDNjQsIDB4OUFCNSwgMHgzQkQ5LAorICAgIDB4OUFCNiwgMHgzQkRBLCAweDlBQjcsIDB4NEEzNiwgMHg5QUI4LCAweDA1OUEsIDB4OUFCOSwgMHg0QTM4LCAweDlBQkMsCisgICAgMHgxQzY1LCAweDlBQkQsIDB4NEUyMiwgMHg5QUJFLCAweDRFMjMsIDB4OUFDMCwgMHgxQzY2LCAweDlBQzEsIDB4NDMyRSwKKyAgICAweDlBQzMsIDB4NDMyRiwgMHg5QUM0LCAweDBBMzcsIDB4OUFDNiwgMHg0QTNBLCAweDlBQ0UsIDB4NDMzMCwgMHg5QUNGLAorICAgIDB4MUM2NywgMHg5QUQwLCAweDRBM0IsIDB4OUFEMSwgMHgxQzY4LCAweDlBRDIsIDB4NEEzQywgMHg5QUQzLCAweDFDNjksCisgICAgMHg5QUQ0LCAweDFDNkEsIDB4OUFENSwgMHg0QTNELCAweDlBRDYsIDB4NDMzMSwgMHg5QUQ4LCAweDA3RjQsIDB4OUFEOSwKKyAgICAweDIyMDEsIDB4OUFEQywgMHgyMjAyLCAweDlBREUsIDB4MUM2QiwgMHg5QURGLCAweDFDNkMsIDB4OUFFMCwgMHg0QTNFLAorICAgIDB4OUFFMiwgMHgxQzZELCAweDlBRTMsIDB4MUM2RSwgMHg5QUU1LCAweDRBM0YsIDB4OUFFNiwgMHgxQzZGLCAweDlBRTksCisgICAgMHg0QTQwLCAweDlBRUEsIDB4MEQ0NSwgMHg5QUVCLCAweDFDNzEsIDB4OUFFRCwgMHgwRDk4LCAweDlBRUUsIDB4MUM3MiwKKyAgICAweDlBRUYsIDB4MUM3MCwgMHg5QUYxLCAweDFDNzQsIDB4OUFGNCwgMHgxQzczLCAweDlBRjcsIDB4MUM3NSwgMHg5QUY5LAorICAgIDB4M0JEQiwgMHg5QUZCLCAweDFDNzYsIDB4OUIwMSwgMHg0RTI0LCAweDlCMDIsIDB4NDMzMiwgMHg5QjAzLCAweDNCREMsCisgICAgMHg5QjA2LCAweDFDNzcsIDB4OUIwOCwgMHg0MzMzLCAweDlCMDksIDB4NEUyNSwgMHg5QjBCLCAweDRFMjYsIDB4OUIwQywKKyAgICAweDRBNDEsIDB4OUIwRCwgMHg0RTI3LCAweDlCMEUsIDB4NEUyOCwgMHg5QjEwLCAweDRBNDIsIDB4OUIxMiwgMHg0QTQzLAorICAgIDB4OUIxNiwgMHg0QTQ0LCAweDlCMTgsIDB4MUM3OCwgMHg5QjE5LCAweDRFMjksIDB4OUIxQSwgMHgxQzc5LCAweDlCMUMsCisgICAgMHg0QTQ1LCAweDlCMUQsIDB4NEY0OSwgMHg5QjFGLCAweDFDN0EsIDB4OUIyMCwgMHgzQkRELCAweDlCMjIsIDB4MUM3QiwKKyAgICAweDlCMjMsIDB4MUM3QywgMHg5QjI1LCAweDFDN0QsIDB4OUIyNywgMHgxQzdFLCAweDlCMjgsIDB4MUM3RiwgMHg5QjI5LAorICAgIDB4MUM4MCwgMHg5QjJBLCAweDFDODEsIDB4OUIyQiwgMHg0QTQ2LCAweDlCMkMsIDB4NEY0QSwgMHg5QjJELCAweDQzMzUsCisgICAgMHg5QjJFLCAweDFDODIsIDB4OUIyRiwgMHgxQzgzLCAweDlCMzEsIDB4MTRENCwgMHg5QjMyLCAweDFDODQsIDB4OUIzMywKKyAgICAweDNCREUsIDB4OUIzNCwgMHgzQkRGLCAweDlCMzUsIDB4NEUyQSwgMHg5QjNCLCAweDE3QTksIDB4OUIzQywgMHgwNjRFLAorICAgIDB4OUIzRCwgMHg0QTQ3LCAweDlCNDEsIDB4MDU3RiwgMHg5QjQyLCAweDA4MjIsIDB4OUI0MywgMHgxQzg2LCAweDlCNDQsCisgICAgMHgxQzg1LCAweDlCNDUsIDB4MEVCMSwgMHg5QjQ4LCAweDRFMkIsIDB4OUI0QiwgMHg0QTQ5LCAweDlCNEQsIDB4MUM4OCwKKyAgICAweDlCNEUsIDB4MUM4OSwgMHg5QjRGLCAweDFDODcsIDB4OUI1MSwgMHgxQzhBLCAweDlCNTQsIDB4MEU5MCwgMHg5QjU1LAorICAgIDB4NEUyQywgMHg5QjU4LCAweDFDOEIsIDB4OUI1QSwgMHgwNjk1LCAweDlCNUUsIDB4NDMzNiwgMHg5QjYzLCAweDRBNEEsCisgICAgMHg5QjY1LCAweDRBNEIsIDB4OUI2NiwgMHg0MzM3LCAweDlCNjgsIDB4NEUyRCwgMHg5QjZCLCAweDRBNEMsIDB4OUI2QywKKyAgICAweDRBNEQsIDB4OUI2RiwgMHgwRkNCLCAweDlCNzIsIDB4MjIwNCwgMHg5QjczLCAweDNCRTAsIDB4OUI3NCwgMHgxQzhDLAorICAgIDB4OUI3NSwgMHgyMjAzLCAweDlCNzYsIDB4NEE0RSwgMHg5Qjc3LCAweDRBNEYsIDB4OUI3OSwgMHgzQkUxLCAweDlCODAsCisgICAgMHg0RTJFLCAweDlCODMsIDB4MUM4RSwgMHg5Qjg0LCAweDQzMzgsIDB4OUI4NiwgMHg0RTJGLCAweDlCOEEsIDB4NDMzOSwKKyAgICAweDlCOEUsIDB4MDQ4MiwgMHg5QjhGLCAweDIyMDUsIDB4OUI5MCwgMHg0RTMwLCAweDlCOTEsIDB4MUM4RiwgMHg5QjkyLAorICAgIDB4MERGQiwgMHg5QjkzLCAweDFDOEQsIDB4OUI5NiwgMHgxQzkwLCAweDlCOTcsIDB4MUM5MSwgMHg5QjlELCAweDRFMzEsCisgICAgMHg5QjlFLCAweDQzM0EsIDB4OUI5RiwgMHgxQzkyLCAweDlCQTAsIDB4MUM5MywgMHg5QkE2LCAweDRBNTAsIDB4OUJBNywKKyAgICAweDNCRTIsIDB4OUJBOCwgMHgxQzk0LCAweDlCQUEsIDB4MEU5QywgMHg5QkFCLCAweDA4N0IsIDB4OUJBQywgMHg0QTUxLAorICAgIDB4OUJBRCwgMHgwODZBLCAweDlCQUUsIDB4MEFCMSwgMHg5QkIwLCAweDRFMzIsIDB4OUJCMSwgMHgyMjA2LCAweDlCQjIsCisgICAgMHg0QTUzLCAweDlCQjQsIDB4MUM5NSwgMHg5QkI4LCAweDRBNTQsIDB4OUJCOSwgMHgxQzk4LCAweDlCQkIsIDB4MjIwNywKKyAgICAweDlCQkUsIDB4NEE1NSwgMHg5QkJGLCAweDRFMzMsIDB4OUJDMCwgMHgxQzk2LCAweDlCQzEsIDB4M0JFMywgMHg5QkM2LAorICAgIDB4MUM5OSwgMHg5QkM3LCAweDNCRTQsIDB4OUJDOCwgMHg0RTM0LCAweDlCQzksIDB4MDdBNSwgMHg5QkNBLCAweDFDOTcsCisgICAgMHg5QkNFLCAweDQzM0IsIDB4OUJDRiwgMHgxQzlBLCAweDlCRDEsIDB4MUM5QiwgMHg5QkQyLCAweDFDOUMsIDB4OUJENCwKKyAgICAweDFDQTAsIDB4OUJENiwgMHgwODc4LCAweDlCRDcsIDB4M0JFNSwgMHg5QkQ4LCAweDRBNTcsIDB4OUJEQiwgMHgwQjQ0LAorICAgIDB4OUJERCwgMHg0QTU4LCAweDlCREYsIDB4MzdCRiwgMHg5QkUxLCAweDFDQTEsIDB4OUJFMiwgMHgxQzlFLCAweDlCRTMsCisgICAgMHgxQzlELCAweDlCRTQsIDB4MUM5RiwgMHg5QkU1LCAweDQzM0MsIDB4OUJFNywgMHgzQkU2LCAweDlCRTgsIDB4MDczNSwKKyAgICAweDlCRUEsIDB4NEE1OSwgMHg5QkVCLCAweDNCRTcsIDB4OUJFRSwgMHg0QTVCLCAweDlCRUYsIDB4NEE1QSwgMHg5QkYwLAorICAgIDB4MUNBNSwgMHg5QkYxLCAweDFDQTQsIDB4OUJGMiwgMHgxQ0EzLCAweDlCRjMsIDB4NEE1NiwgMHg5QkY1LCAweDA0NzcsCisgICAgMHg5QkY3LCAweDNCRTgsIDB4OUJGOCwgMHg0MzNELCAweDlCRkEsIDB4M0JFOSwgMHg5QkZELCAweDNCRUEsIDB4OUJGRiwKKyAgICAweDRFMzUsIDB4OUMwMCwgMHgyMjA4LCAweDlDMDIsIDB4NEUzNiwgMHg5QzA0LCAweDFDQUYsIDB4OUMwNiwgMHgxQ0FCLAorICAgIDB4OUMwOCwgMHgxQ0FDLCAweDlDMDksIDB4MUNBOCwgMHg5QzBBLCAweDFDQUUsIDB4OUMwQiwgMHgzQkVCLCAweDlDMEMsCisgICAgMHgxQ0FBLCAweDlDMEQsIDB4MDVDMCwgMHg5QzEwLCAweDBGRjIsIDB4OUMxMiwgMHgxQ0FELCAweDlDMTMsIDB4MUNBOSwKKyAgICAweDlDMTQsIDB4MUNBNywgMHg5QzE1LCAweDFDQTYsIDB4OUMxNiwgMHg0QTVGLCAweDlDMTgsIDB4NEE2MCwgMHg5QzE5LAorICAgIDB4NEE2MSwgMHg5QzFBLCAweDRBNjIsIDB4OUMxQiwgMHgxQ0IxLCAweDlDMUMsIDB4NEUzNywgMHg5QzFELCAweDRBNjMsCisgICAgMHg5QzIxLCAweDFDQjQsIDB4OUMyMiwgMHg0QTY0LCAweDlDMjMsIDB4NDMzRSwgMHg5QzI0LCAweDFDQjMsIDB4OUMyNSwKKyAgICAweDFDQjIsIDB4OUMyNywgMHgzQkVDLCAweDlDMjksIDB4NEE2NSwgMHg5QzJBLCAweDNCRUQsIDB4OUMyRCwgMHgwREJCLAorICAgIDB4OUMyRSwgMHgxQ0IwLCAweDlDMkYsIDB4MDRCNywgMHg5QzMwLCAweDFDQjUsIDB4OUMzMSwgMHg0QTY3LCAweDlDMzIsCisgICAgMHgxQ0I3LCAweDlDMzUsIDB4NEUzOCwgMHg5QzM2LCAweDNCRUUsIDB4OUMzNywgMHg0QTY4LCAweDlDMzksIDB4MDVDRCwKKyAgICAweDlDM0EsIDB4MUNBMiwgMHg5QzNCLCAweDA0RDksIDB4OUMzRSwgMHgxQ0I5LCAweDlDNDEsIDB4M0JFRiwgMHg5QzQ0LAorICAgIDB4NEUzOSwgMHg5QzQ1LCAweDRBNjksIDB4OUM0NiwgMHgxQ0I4LCAweDlDNDcsIDB4MUNCNiwgMHg5QzQ4LCAweDBCNkIsCisgICAgMHg5QzQ5LCAweDRBNkMsIDB4OUM0QSwgMHg0QTZELCAweDlDNEYsIDB4NDMzRiwgMHg5QzUwLCAweDQzNDAsIDB4OUM1MiwKKyAgICAweDBFOUUsIDB4OUM1MywgMHgzQkYwLCAweDlDNTQsIDB4NEE2RiwgMHg5QzU2LCAweDRFM0EsIDB4OUM1NywgMHgwRkEyLAorICAgIDB4OUM1OCwgMHg0QTcwLCAweDlDNUEsIDB4MUNCQSwgMHg5QzVCLCAweDRBNzEsIDB4OUM1QywgMHg0QTZBLCAweDlDNUQsCisgICAgMHg0QTcyLCAweDlDNUYsIDB4NEE3MywgMHg5QzYwLCAweDFDQkIsIDB4OUM2MSwgMHg0RTNCLCAweDlDNjMsIDB4M0JGMSwKKyAgICAweDlDNjUsIDB4NDM0MSwgMHg5QzY3LCAweDFDQkMsIDB4OUM2OCwgMHg0RTNDLCAweDlDNjksIDB4NEE3NCwgMHg5QzZBLAorICAgIDB4NEE3NSwgMHg5QzZCLCAweDRBNzYsIDB4OUM2RCwgMHg0QTc3LCAweDlDNkUsIDB4NEE3OCwgMHg5QzcwLCAweDNCRjIsCisgICAgMHg5QzcyLCAweDRBNzksIDB4OUM3NSwgMHg0QTdBLCAweDlDNzYsIDB4MUNCRCwgMHg5Qzc3LCAweDNCRjMsIDB4OUM3OCwKKyAgICAweDFDQkUsIDB4OUM3QSwgMHg0QTdCLCAweDlDRTUsIDB4MEJENywgMHg5Q0U2LCAweDRBN0MsIDB4OUNFNywgMHgxQ0JGLAorICAgIDB4OUNFOSwgMHgwRDRCLCAweDlDRUIsIDB4MUNDNCwgMHg5Q0VDLCAweDFDQzAsIDB4OUNGMCwgMHgxQ0MxLCAweDlDRjIsCisgICAgMHg0QTdELCAweDlDRjMsIDB4MEU1RiwgMHg5Q0Y0LCAweDBFRDAsIDB4OUNGNiwgMHgwQ0E4LCAweDlEMDIsIDB4M0JGNCwKKyAgICAweDlEMDMsIDB4MUNDNSwgMHg5RDA2LCAweDFDQzYsIDB4OUQwNywgMHgwQzk2LCAweDlEMDgsIDB4MUNDMywgMHg5RDA5LAorICAgIDB4MUNDMiwgMHg5RDBCLCAweDRBN0UsIDB4OUQwRSwgMHgwNTJBLCAweDlEMTEsIDB4NEE4MCwgMHg5RDEyLCAweDFDQ0UsCisgICAgMHg5RDE1LCAweDFDQ0QsIDB4OUQxNywgMHg0QTgxLCAweDlEMTgsIDB4NEE4MiwgMHg5RDFCLCAweDA1MTcsIDB4OUQxRCwKKyAgICAweDQzNDIsIDB4OUQxRSwgMHg0MzQzLCAweDlEMUYsIDB4MUNDQiwgMHg5RDIzLCAweDFDQ0EsIDB4OUQyNiwgMHgxQ0M4LAorICAgIDB4OUQyOCwgMHgwNUQ5LCAweDlEMkEsIDB4MUNDNywgMHg5RDJCLCAweDA4REUsIDB4OUQyQywgMHgwNTI5LCAweDlEMzAsCisgICAgMHg0RTNELCAweDlEMzIsIDB4NEE4NiwgMHg5RDNCLCAweDA3RjUsIDB4OUQzRCwgMHg0RTNFLCAweDlEM0UsIDB4MUNEMSwKKyAgICAweDlEM0YsIDB4MUNEMCwgMHg5RDQxLCAweDFDQ0YsIDB4OUQ0MiwgMHgzQkY1LCAweDlENDMsIDB4NDM0NCwgMHg5RDQ0LAorICAgIDB4MUNDQywgMHg5RDQ2LCAweDFDRDIsIDB4OUQ0NywgMHgzQkY2LCAweDlENDgsIDB4MUNEMywgMHg5RDRBLCAweDRBODgsCisgICAgMHg5RDUwLCAweDFDRDgsIDB4OUQ1MSwgMHgxQ0Q3LCAweDlENTIsIDB4NDM0NSwgMHg5RDU5LCAweDFDRDksIDB4OUQ1QywKKyAgICAweDA0Q0YsIDB4OUQ1RCwgMHgxQ0Q0LCAweDlENUUsIDB4MUNENSwgMHg5RDVGLCAweDRBODksIDB4OUQ2MCwgMHgwODA2LAorICAgIDB4OUQ2MSwgMHgwRUM1LCAweDlENjIsIDB4NEE4QSwgMHg5RDYzLCAweDNCRjcsIDB4OUQ2NCwgMHgxQ0Q2LCAweDlENjksCisgICAgMHgzQkY4LCAweDlENkEsIDB4NEUzRiwgMHg5RDZCLCAweDIyMEEsIDB4OUQ2QywgMHgwRTYwLCAweDlENkYsIDB4MUNERSwKKyAgICAweDlENzAsIDB4MjIwOSwgMHg5RDcyLCAweDFDREEsIDB4OUQ3MywgMHg0QThELCAweDlENzYsIDB4NEE4RSwgMHg5RDc3LAorICAgIDB4NEE4RiwgMHg5RDdBLCAweDFDREYsIDB4OUQ3QiwgMHg0RTQwLCAweDlEN0MsIDB4M0JGOSwgMHg5RDdFLCAweDNCRkEsCisgICAgMHg5RDg0LCAweDRBOTAsIDB4OUQ4NywgMHgxQ0RDLCAweDlEODksIDB4MUNEQiwgMHg5RDhBLCAweDQzNDYsIDB4OUQ4RCwKKyAgICAweDNCRkIsIDB4OUQ4RiwgMHgwNzMyLCAweDlEOTYsIDB4NDM0NywgMHg5RDk5LCAweDRBOTEsIDB4OUQ5QSwgMHgxQ0UwLAorICAgIDB4OURBMSwgMHg0QTkyLCAweDlEQTQsIDB4MUNFMSwgMHg5REE5LCAweDFDRTIsIDB4OURBQiwgMHgxQ0RELCAweDlEQUMsCisgICAgMHg0MzQ5LCAweDlEQUYsIDB4MUNDOSwgMHg5REIxLCAweDNCRkMsIDB4OURCMiwgMHgxQ0UzLCAweDlEQjQsIDB4MEJGRCwKKyAgICAweDlEQjUsIDB4NEE5NCwgMHg5REI4LCAweDFDRTcsIDB4OURCOSwgMHg0QTk1LCAweDlEQkEsIDB4MUNFOCwgMHg5REJCLAorICAgIDB4MUNFNiwgMHg5REJDLCAweDQzNEEsIDB4OURCRCwgMHg0QTk2LCAweDlEQkYsIDB4NEE5MywgMHg5REMwLCAweDQzNDgsCisgICAgMHg5REMxLCAweDFDRTUsIDB4OURDMiwgMHgxQ0VCLCAweDlEQzMsIDB4M0JGRCwgMHg5REM0LCAweDFDRTQsIDB4OURDNiwKKyAgICAweDFDRTksIDB4OURDNywgMHgzQkZFLCAweDlEQzksIDB4NEE5NywgMHg5RENGLCAweDFDRUEsIDB4OUREMywgMHgxQ0VELAorICAgIDB4OURENiwgMHgzQkZGLCAweDlERDcsIDB4MURERSwgMHg5REQ5LCAweDFDRUMsIDB4OUREQSwgMHg0QTk4LCAweDlEREYsCisgICAgMHgzQzAwLCAweDlERTAsIDB4NEE5OSwgMHg5REUzLCAweDRBOUEsIDB4OURFNSwgMHg0RTQxLCAweDlERTYsIDB4MUNFRiwKKyAgICAweDlERTcsIDB4NDM0QywgMHg5REU5LCAweDRFNDIsIDB4OURFQiwgMHgzQzAxLCAweDlERUQsIDB4MUNGMCwgMHg5REVGLAorICAgIDB4MUNGMSwgMHg5REYyLCAweDBGRUYsIDB4OURGMywgMHg0RTQzLCAweDlERjQsIDB4M0MwMiwgMHg5REY4LCAweDFDRUUsCisgICAgMHg5REY5LCAweDBCNEIsIDB4OURGQSwgMHgwODVELCAweDlERkQsIDB4MUNGMiwgMHg5RTAyLCAweDRBOUQsIDB4OUUwNywKKyAgICAweDQzNEQsIDB4OUUwQSwgMHg0QTlDLCAweDlFMEQsIDB4NEE5RSwgMHg5RTE1LCAweDNDMDMsIDB4OUUxOSwgMHgyMjBDLAorICAgIDB4OUUxQSwgMHgxQ0YzLCAweDlFMUIsIDB4MUNGNCwgMHg5RTFDLCAweDRBOUYsIDB4OUUxRCwgMHgzQzA0LCAweDlFMUUsCisgICAgMHgxQ0Y1LCAweDlFNzUsIDB4MUNGNiwgMHg5RTc4LCAweDA3NjgsIDB4OUU3OSwgMHgxQ0Y3LCAweDlFN0EsIDB4NEU0NCwKKyAgICAweDlFN0IsIDB4NEFBMCwgMHg5RTdDLCAweDFERkQsIDB4OUU3RCwgMHgxQ0Y4LCAweDlFN0YsIDB4MDhEQiwgMHg5RTgwLAorICAgIDB4NEFBMiwgMHg5RTgxLCAweDFDRjksIDB4OUU4MiwgMHg0RTQ1LCAweDlFODMsIDB4NEU0NiwgMHg5RTg0LCAweDRFNDcsCisgICAgMHg5RTg1LCAweDRBQTMsIDB4OUU4OCwgMHgxQ0ZBLCAweDlFOEIsIDB4MUNGQiwgMHg5RThDLCAweDFDRkMsIDB4OUU5MSwKKyAgICAweDFDRkYsIDB4OUU5MiwgMHgxQ0ZELCAweDlFOTMsIDB4MEZFMiwgMHg5RTk1LCAweDFDRkUsIDB4OUU5NywgMHgwRkI3LAorICAgIDB4OUU5QiwgMHg0QUE0LCAweDlFOUQsIDB4MUQwMCwgMHg5RTlFLCAweDQzNEUsIDB4OUU5RiwgMHgwRkEzLCAweDlFQTQsCisgICAgMHgzQzA1LCAweDlFQTUsIDB4MUQwMSwgMHg5RUE2LCAweDBEMzQsIDB4OUVBOCwgMHgzQzA2LCAweDlFQTksIDB4MUQwMiwKKyAgICAweDlFQUEsIDB4MUQwNCwgMHg5RUFDLCAweDNDMDcsIDB4OUVBRCwgMHgxRDA1LCAweDlFQUYsIDB4NDM0RiwgMHg5RUIwLAorICAgIDB4NEU0OCwgMHg5RUI0LCAweDFFMDIsIDB4OUVCNSwgMHgxRTc1LCAweDlFQjgsIDB4MUQwMywgMHg5RUI5LCAweDA3RkYsCisgICAgMHg5RUJBLCAweDBFRDksIDB4OUVCQiwgMHgwRTkxLCAweDlFQkMsIDB4MTI4NCwgMHg5RUJELCAweDRBQTYsIDB4OUVCRSwKKyAgICAweDE0RkYsIDB4OUVCRiwgMHgwRUE5LCAweDlFQzMsIDB4MzQwQiwgMHg5RUM0LCAweDA1MkIsIDB4OUVDQywgMHgxRDA3LAorICAgIDB4OUVDRCwgMHgwNjZBLCAweDlFQ0UsIDB4MUQwOCwgMHg5RUNGLCAweDFEMDksIDB4OUVEMCwgMHgxRDBBLCAweDlFRDEsCisgICAgMHgyMjBELCAweDlFRDIsIDB4MDgwNywgMHg5RUQ0LCAweDFEMEIsIDB4OUVEOCwgMHgxNjBELCAweDlFRDksIDB4MEVFNywKKyAgICAweDlFREIsIDB4MEI0MywgMHg5RURDLCAweDFEMEMsIDB4OUVERCwgMHgxRDBFLCAweDlFREUsIDB4MUQwRCwgMHg5RURGLAorICAgIDB4NEFBOCwgMHg5RUUwLCAweDFEMEYsIDB4OUVFNCwgMHg0RTQ5LCAweDlFRTUsIDB4MUQxMCwgMHg5RUU3LCAweDNDMDgsCisgICAgMHg5RUU4LCAweDFEMTEsIDB4OUVFRSwgMHgzQzA5LCAweDlFRUYsIDB4MUQxMiwgMHg5RUYwLCAweDRFNEEsIDB4OUVGMiwKKyAgICAweDRFNEIsIDB4OUVGNCwgMHgxRDEzLCAweDlFRjYsIDB4MUQxNCwgMHg5RUY3LCAweDFEMTUsIDB4OUVGOSwgMHgxRDE2LAorICAgIDB4OUVGQiwgMHgxRDE3LCAweDlFRkMsIDB4MUQxOCwgMHg5RUZELCAweDFEMTksIDB4OUVGRiwgMHg0QUE5LCAweDlGMDIsCisgICAgMHg0QUFBLCAweDlGMDMsIDB4NEFBQywgMHg5RjA3LCAweDFEMUEsIDB4OUYwOCwgMHgxRDFCLCAweDlGMDksIDB4NEU0QywKKyAgICAweDlGMEUsIDB4MEMxRSwgMHg5RjBGLCAweDRFNEQsIDB4OUYxMCwgMHgzQzBBLCAweDlGMTIsIDB4M0MwQiwgMHg5RjEzLAorICAgIDB4MDc5MSwgMHg5RjE0LCAweDRFNEUsIDB4OUYxNSwgMHgxRDFELCAweDlGMTcsIDB4M0MwQywgMHg5RjE5LCAweDNDMEQsCisgICAgMHg5RjFCLCAweDRFNEYsIDB4OUYyMCwgMHgwQUNGLCAweDlGMjEsIDB4MUQxRSwgMHg5RjIyLCAweDRFNTAsIDB4OUYyNiwKKyAgICAweDRFNTEsIDB4OUYyQSwgMHg0RTUyLCAweDlGMkIsIDB4NEU1MywgMHg5RjJDLCAweDFEMUYsIDB4OUYyRiwgMHgzQzBFLAorICAgIDB4OUYzNCwgMHg0RTU0LCAweDlGMzcsIDB4M0MwRiwgMHg5RjM5LCAweDNDMTAsIDB4OUYzQSwgMHg0QUFELCAweDlGM0IsCisgICAgMHgwRDkzLCAweDlGM0QsIDB4NEFBRSwgMHg5RjNFLCAweDFEMjAsIDB4OUY0MSwgMHgzQzExLCAweDlGNDUsIDB4M0MxMiwKKyAgICAweDlGNDYsIDB4NEFBRiwgMHg5RjRBLCAweDFEMjEsIDB4OUY0QiwgMHgxNzBBLCAweDlGNEUsIDB4MUE3QiwgMHg5RjRGLAorICAgIDB4MUMwNiwgMHg5RjUyLCAweDFEMjIsIDB4OUY1MywgMHg0QUIwLCAweDlGNTQsIDB4MUQyMywgMHg5RjU1LCAweDRBQjEsCisgICAgMHg5RjU3LCAweDNDMTMsIDB4OUY1OCwgMHg0QUIyLCAweDlGNUEsIDB4NEU1NSwgMHg5RjVELCAweDRBQjQsIDB4OUY1RiwKKyAgICAweDFEMjUsIDB4OUY2MCwgMHgxRDI2LCAweDlGNjEsIDB4MUQyNywgMHg5RjYyLCAweDBGQjgsIDB4OUY2MywgMHgxRDI0LAorICAgIDB4OUY2NiwgMHgxRDI4LCAweDlGNjcsIDB4MUQyOSwgMHg5RjY4LCAweDNDMTQsIDB4OUY2OSwgMHg0QUI2LCAweDlGNkEsCisgICAgMHgxRDJCLCAweDlGNkMsIDB4MUQyQSwgMHg5RjZELCAweDRBQjcsIDB4OUY2RiwgMHg0RTU2LCAweDlGNzAsIDB4NEFCOCwKKyAgICAweDlGNzEsIDB4M0MxNSwgMHg5RjcyLCAweDFEMkQsIDB4OUY3NSwgMHgzQzE2LCAweDlGNzYsIDB4MUQyRSwgMHg5Rjc3LAorICAgIDB4MUQyQywgMHg5RjhELCAweDBGN0UsIDB4OUY5MCwgMHgzQzE3LCAweDlGOTQsIDB4M0MxOCwgMHg5Rjk1LCAweDFEMkYsCisgICAgMHg5Rjk3LCAweDQzNTAsIDB4OUY5QywgMHgxRDMwLCAweDlGOUQsIDB4MTcyNywgMHg5RjlFLCAweDRFNTcsIDB4OUZBMCwKKyAgICAweDFEMzEsIDB4OUZBMiwgMHgzQzE5LCAweDlGQTUsIDB4NEU1OCwgMHhGODYwLCAweDNDNTQsIDB4Rjg2MSwgMHgzQzU1LAorICAgIDB4Rjg2MiwgMHgzQzU2LCAweEY4N0EsIDB4M0M1NywgMHhGODdGLCAweDNDNTgsIDB4RjkwOSwgMHgzNUFCLCAweEY5MUQsCisgICAgMHgzNDUwLCAweEY5MUYsIDB4MzcwNCwgMHhGOTI4LCAweDRGNEYsIDB4RjkyOSwgMHg0RjUxLCAweEY5MzYsIDB4MzQ1MiwKKyAgICAweEY5NUYsIDB4MzY5MywgMHhGOTcwLCAweDM0MjAsIDB4Rjk4MywgMHgzNzA4LCAweEY5OTIsIDB4MUU4MSwgMHhGOTkzLAorICAgIDB4MUU4MiwgMHhGOTk5LCAweDFFODMsIDB4Rjk5QSwgMHgzNzExLCAweEY5QTIsIDB4MzcwRiwgMHhGOUMzLCAweDFFODAsCisgICAgMHhGOUQwLCAweDM0NTQsIDB4RjlEQywgMHgzNDUxLCAweEY5RUMsIDB4MUU0NiwgMHhGQTAzLCAweDM2ODQsIDB4RkEwRSwKKyAgICAweDIwREEsIDB4RkEwRiwgMHgyMEU1LCAweEZBMTAsIDB4MUU0MiwgMHhGQTExLCAweDM3RDIsIDB4RkExMiwgMHgyMTIxLAorICAgIDB4RkExMywgMHgyMTMxLCAweEZBMTQsIDB4MjEzMywgMHhGQTE1LCAweDRGNTMsIDB4RkExNiwgMHgyMTY0LCAweEZBMTcsCisgICAgMHgyMTdCLCAweEZBMTgsIDB4MjE4MywgMHhGQTE5LCAweDIxODQsIDB4RkExQSwgMHgyMTg1LCAweEZBMUIsIDB4MjE4NywKKyAgICAweEZBMUMsIDB4MjE4QiwgMHhGQTFELCAweDIxOEUsIDB4RkExRSwgMHgyMTk3LCAweEZBMUYsIDB4MjFBMiwgMHhGQTIwLAorICAgIDB4MjFBNCwgMHhGQTIxLCAweDIxQTUsIDB4RkEyMiwgMHgyMUFFLCAweEZBMjMsIDB4MjFCNiwgMHhGQTI0LCAweDQ5NDgsCisgICAgMHhGQTI1LCAweDIxQjksIDB4RkEyNiwgMHgyMUJDLCAweEZBMjcsIDB4MjFEOCwgMHhGQTI4LCAweDIxREYsIDB4RkEyOSwKKyAgICAweDIxRUYsIDB4RkEyQSwgMHgyMUZCLCAweEZBMkIsIDB4MjFGQywgMHhGQTJDLCAweDIxRkUsIDB4RkEyRCwgMHgyMjBCLAorICAgIDB4RkEzMCwgMHgzNDQ2LCAweEZBMzEsIDB4MzQzMCwgMHhGQTMyLCAweDM0NEQsIDB4RkEzMywgMHgzNDQ5LCAweEZBMzQsCisgICAgMHgzNDFBLCAweEZBMzUsIDB4MzQ0MiwgMHhGQTM2LCAweDFERTMsIDB4RkEzNywgMHgzNDM2LCAweEZBMzgsIDB4MzQxNSwKKyAgICAweEZBMzksIDB4MzQ0OCwgMHhGQTNBLCAweDM0NEIsIDB4RkEzQiwgMHgzNDMxLCAweEZBM0MsIDB4NDFDNSwgMHhGQTNELAorICAgIDB4MzQwRSwgMHhGQTNFLCAweDM0MTAsIDB4RkEzRiwgMHgzNDMzLCAweEZBNDAsIDB4MzQzOSwgMHhGQTQxLCAweDM0NDUsCisgICAgMHhGQTQyLCAweDM0MTYsIDB4RkE0MywgMHgzNDI4LCAweEZBNDQsIDB4MzQzRiwgMHhGQTQ1LCAweDM0MEYsIDB4RkE0NiwKKyAgICAweDFFMTQsIDB4RkE0NywgMHgzNDE0LCAweEZBNDgsIDB4MzQyMywgMHhGQTQ5LCAweDNDMjYsIDB4RkE0QSwgMHgxRTM0LAorICAgIDB4RkE0QiwgMHgzNDQzLCAweEZBNEMsIDB4MzQyNCwgMHhGQTRELCAweDM0MjEsIDB4RkE0RSwgMHgzNDE3LCAweEZBNEYsCisgICAgMHgzNDRGLCAweEZBNTAsIDB4MzQyRiwgMHhGQTUxLCAweDM0MjcsIDB4RkE1MiwgMHgzNDBELCAweEZBNTMsIDB4MzQzQiwKKyAgICAweEZBNTQsIDB4MzQxRiwgMHhGQTU1LCAweDM0M0QsIDB4RkE1NiwgMHgzNDJFLCAweEZBNTcsIDB4MzQ1NywgMHhGQTU4LAorICAgIDB4NDdCRSwgMHhGQTU5LCAweDM0NDAsIDB4RkE1QSwgMHgzNDI5LCAweEZBNUIsIDB4MzQyNSwgMHhGQTVDLCAweDM0MjYsCisgICAgMHhGQTVELCAweDM3NzcsIDB4RkE1RSwgMHgzNzc2LCAweEZBNUYsIDB4MzQzNywgMHhGQTYwLCAweDM0MTMsIDB4RkE2MSwKKyAgICAweDM0MjIsIDB4RkE2MiwgMHgzNDA5LCAweEZBNjMsIDB4MzQxQiwgMHhGQTY0LCAweDM0NDQsIDB4RkE2NSwgMHgzNDM0LAorICAgIDB4RkE2NiwgMHgzQzJCLCAweEZBNjcsIDB4MzQwOCwgMHhGQTY4LCAweDM0M0UsIDB4RkE2OSwgMHgzNDE5LCAweEZBNkEsCisgICAgMHgxRTZDLCAweEZCMDAsIDB4MjQ4RSwgMHhGQjAxLCAweDAwNzAsIDB4RkIwMiwgMHgwMDcxLCAweEZCMDMsIDB4MjQ4RiwKKyAgICAweEZCMDQsIDB4MjQ5MCwgMHhGRTMwLCAweDFFREEsIDB4RkUzMSwgMHgxRUQ0LCAweEZFMzIsIDB4MUVENSwgMHhGRTMzLAorICAgIDB4MUVEMiwgMHhGRTM1LCAweDFFREIsIDB4RkUzNiwgMHgxRURDLCAweEZFMzcsIDB4MUVFMSwgMHhGRTM4LCAweDFFRTIsCisgICAgMHhGRTM5LCAweDFFREQsIDB4RkUzQSwgMHgxRURFLCAweEZFM0IsIDB4MUVFQiwgMHhGRTNDLCAweDFFRUMsIDB4RkUzRCwKKyAgICAweDFFRTUsIDB4RkUzRSwgMHgxRUU2LCAweEZFM0YsIDB4MUVFMywgMHhGRTQwLCAweDFFRTQsIDB4RkU0MSwgMHgxRUU3LAorICAgIDB4RkU0MiwgMHgxRUU4LCAweEZFNDMsIDB4MUVFOSwgMHhGRTQ0LCAweDFFRUEsIDB4RkU0NSwgMHgzMTVGLCAweEZFNDYsCisgICAgMHgzMTYwLCAweEZFNDcsIDB4MUVERiwgMHhGRTQ4LCAweDFFRTAsIDB4RkYwMSwgMHgwMjgyLCAweEZGMDIsIDB4MUY0NywKKyAgICAweEZGMDMsIDB4MDJDQywgMHhGRjA0LCAweDAyQzgsIDB4RkYwNSwgMHgwMkNCLCAweEZGMDYsIDB4MDJDRCwgMHhGRjA3LAorICAgIDB4MUY0NiwgMHhGRjA4LCAweDAyQTIsIDB4RkYwOSwgMHgwMkEzLCAweEZGMEEsIDB4MDJDRSwgMHhGRjBCLCAweDAyQjQsCisgICAgMHhGRjBDLCAweDAyN0MsIDB4RkYwRCwgMHgwMkI1LCAweEZGMEUsIDB4MDI3RCwgMHhGRjBGLCAweDAyOTcsIDB4RkYxMCwKKyAgICAweDAzMEMsIDB4RkYxMSwgMHgwMzBELCAweEZGMTIsIDB4MDMwRSwgMHhGRjEzLCAweDAzMEYsIDB4RkYxNCwgMHgwMzEwLAorICAgIDB4RkYxNSwgMHgwMzExLCAweEZGMTYsIDB4MDMxMiwgMHhGRjE3LCAweDAzMTMsIDB4RkYxOCwgMHgwMzE0LCAweEZGMTksCisgICAgMHgwMzE1LCAweEZGMUEsIDB4MDI3RiwgMHhGRjFCLCAweDAyODAsIDB4RkYxQywgMHgwMkJCLCAweEZGMUQsIDB4MDJCOSwKKyAgICAweEZGMUUsIDB4MDJCQywgMHhGRjFGLCAweDAyODEsIDB4RkYyMCwgMHgwMkNGLCAweEZGMjEsIDB4MDMxNiwgMHhGRjIyLAorICAgIDB4MDMxNywgMHhGRjIzLCAweDAzMTgsIDB4RkYyNCwgMHgwMzE5LCAweEZGMjUsIDB4MDMxQSwgMHhGRjI2LCAweDAzMUIsCisgICAgMHhGRjI3LCAweDAzMUMsIDB4RkYyOCwgMHgwMzFELCAweEZGMjksIDB4MDMxRSwgMHhGRjJBLCAweDAzMUYsIDB4RkYyQiwKKyAgICAweDAzMjAsIDB4RkYyQywgMHgwMzIxLCAweEZGMkQsIDB4MDMyMiwgMHhGRjJFLCAweDAzMjMsIDB4RkYyRiwgMHgwMzI0LAorICAgIDB4RkYzMCwgMHgwMzI1LCAweEZGMzEsIDB4MDMyNiwgMHhGRjMyLCAweDAzMjcsIDB4RkYzMywgMHgwMzI4LCAweEZGMzQsCisgICAgMHgwMzI5LCAweEZGMzUsIDB4MDMyQSwgMHhGRjM2LCAweDAzMkIsIDB4RkYzNywgMHgwMzJDLCAweEZGMzgsIDB4MDMyRCwKKyAgICAweEZGMzksIDB4MDMyRSwgMHhGRjNBLCAweDAzMkYsIDB4RkYzQiwgMHgwMkE2LCAweEZGM0MsIDB4MDI5OCwgMHhGRjNELAorICAgIDB4MDJBNywgMHhGRjNFLCAweDAyODgsIDB4RkYzRiwgMHgwMjhBLCAweEZGNDAsIDB4MDI4NiwgMHhGRjQxLCAweDAzMzAsCisgICAgMHhGRjQyLCAweDAzMzEsIDB4RkY0MywgMHgwMzMyLCAweEZGNDQsIDB4MDMzMywgMHhGRjQ1LCAweDAzMzQsIDB4RkY0NiwKKyAgICAweDAzMzUsIDB4RkY0NywgMHgwMzM2LCAweEZGNDgsIDB4MDMzNywgMHhGRjQ5LCAweDAzMzgsIDB4RkY0QSwgMHgwMzM5LAorICAgIDB4RkY0QiwgMHgwMzNBLCAweEZGNEMsIDB4MDMzQiwgMHhGRjRELCAweDAzM0MsIDB4RkY0RSwgMHgwMzNELCAweEZGNEYsCisgICAgMHgwMzNFLCAweEZGNTAsIDB4MDMzRiwgMHhGRjUxLCAweDAzNDAsIDB4RkY1MiwgMHgwMzQxLCAweEZGNTMsIDB4MDM0MiwKKyAgICAweEZGNTQsIDB4MDM0MywgMHhGRjU1LCAweDAzNDQsIDB4RkY1NiwgMHgwMzQ1LCAweEZGNTcsIDB4MDM0NiwgMHhGRjU4LAorICAgIDB4MDM0NywgMHhGRjU5LCAweDAzNDgsIDB4RkY1QSwgMHgwMzQ5LCAweEZGNUIsIDB4MDJBOCwgMHhGRjVDLCAweDAyOUIsCisgICAgMHhGRjVELCAweDAyQTksIDB4RkY1RSwgMHgwMjk5LCAweEZGNUYsIDB4MkY2MywgMHhGRjYwLCAweDJGNjQsIDB4RkY2MSwKKyAgICAweDAxNDcsIDB4RkY2MiwgMHgwMTQ4LCAweEZGNjMsIDB4MDE0OSwgMHhGRjY0LCAweDAxNEEsIDB4RkY2NSwgMHgwMTRCLAorICAgIDB4RkY2NiwgMHgwMTRDLCAweEZGNjcsIDB4MDE0RCwgMHhGRjY4LCAweDAxNEUsIDB4RkY2OSwgMHgwMTRGLCAweEZGNkEsCisgICAgMHgwMTUwLCAweEZGNkIsIDB4MDE1MSwgMHhGRjZDLCAweDAxNTIsIDB4RkY2RCwgMHgwMTUzLCAweEZGNkUsIDB4MDE1NCwKKyAgICAweEZGNkYsIDB4MDE1NSwgMHhGRjcwLCAweDAxNTYsIDB4RkY3MSwgMHgwMTU3LCAweEZGNzIsIDB4MDE1OCwgMHhGRjczLAorICAgIDB4MDE1OSwgMHhGRjc0LCAweDAxNUEsIDB4RkY3NSwgMHgwMTVCLCAweEZGNzYsIDB4MDE1QywgMHhGRjc3LCAweDAxNUQsCisgICAgMHhGRjc4LCAweDAxNUUsIDB4RkY3OSwgMHgwMTVGLCAweEZGN0EsIDB4MDE2MCwgMHhGRjdCLCAweDAxNjEsIDB4RkY3QywKKyAgICAweDAxNjIsIDB4RkY3RCwgMHgwMTYzLCAweEZGN0UsIDB4MDE2NCwgMHhGRjdGLCAweDAxNjUsIDB4RkY4MCwgMHgwMTY2LAorICAgIDB4RkY4MSwgMHgwMTY3LCAweEZGODIsIDB4MDE2OCwgMHhGRjgzLCAweDAxNjksIDB4RkY4NCwgMHgwMTZBLCAweEZGODUsCisgICAgMHgwMTZCLCAweEZGODYsIDB4MDE2QywgMHhGRjg3LCAweDAxNkQsIDB4RkY4OCwgMHgwMTZFLCAweEZGODksIDB4MDE2RiwKKyAgICAweEZGOEEsIDB4MDE3MCwgMHhGRjhCLCAweDAxNzEsIDB4RkY4QywgMHgwMTcyLCAweEZGOEQsIDB4MDE3MywgMHhGRjhFLAorICAgIDB4MDE3NCwgMHhGRjhGLCAweDAxNzUsIDB4RkY5MCwgMHgwMTc2LCAweEZGOTEsIDB4MDE3NywgMHhGRjkyLCAweDAxNzgsCisgICAgMHhGRjkzLCAweDAxNzksIDB4RkY5NCwgMHgwMTdBLCAweEZGOTUsIDB4MDE3QiwgMHhGRjk2LCAweDAxN0MsIDB4RkY5NywKKyAgICAweDAxN0QsIDB4RkY5OCwgMHgwMTdFLCAweEZGOTksIDB4MDE3RiwgMHhGRjlBLCAweDAxODAsIDB4RkY5QiwgMHgwMTgxLAorICAgIDB4RkY5QywgMHgwMTgyLCAweEZGOUQsIDB4MDE4MywgMHhGRjlFLCAweDAxODQsIDB4RkY5RiwgMHgwMTg1LCAweEZGRTAsCisgICAgMHgwMkM5LCAweEZGRTEsIDB4MDJDQSwgMHhGRkUyLCAweDAyRUYsIDB4RkZFMywgMHgwMjg5LCAweEZGRTQsIDB4MUY0NSwKKyAgICAweEZGRTUsIDB4MDJDNywgMHhGRkU4LCAweDAxNDMsCiB9OwogCiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUpJU19VVEYxNl9IXzVfRFdvcmRbMzg0ICogM10gPSB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VVEYxNi1WXzUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVVRGMTYtVl81LmNwcAppbmRleCA5Y2Q5Y2UxLi5mMDBlZTkwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VVEYxNi1WXzUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVURjE2LVZfNS5jcHAKQEAgLTcsNzcgKzcsNjkgQEAKICNpbmNsdWRlICJjbWFwc19qYXBhbjEuaCIKIAogY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVVRGMTZfVl81WzI4OSAqIDJdID0gewotICAgIDB4MDBCMCwgMHgyMDRELCAweDIwMTAsIDB4MUVENSwgMHgyMDE1LCAweDFFRDQsIDB4MjAxNiwgMHgxRUQ3LAotICAgIDB4MjAyNSwgMHgxRURBLCAweDIwMjYsIDB4MUVEOSwgMHgyMDMyLCAweDIwNTEsIDB4MjAzMywgMHgyMDVCLAotICAgIDB4MjE5MCwgMHgwMkUyLCAweDIxOTEsIDB4MDJFMCwgMHgyMTkyLCAweDAyRTMsIDB4MjE5MywgMHgwMkUxLAotICAgIDB4MjFDNCwgMHgyMDc3LCAweDIxQzUsIDB4MjA3NiwgMHgyMUM2LCAweDIwNzgsIDB4MjFFNiwgMHgxRjRDLAotICAgIDB4MjFFNywgMHgxRjRFLCAweDIxRTgsIDB4MUY0QiwgMHgyMUU5LCAweDFGNEQsIDB4MjM5QiwgMHgyRjc0LAotICAgIDB4MjM5QywgMHgyRjg4LCAweDIzOUQsIDB4MkY3MywgMHgyMzlFLCAweDJGNzYsIDB4MjM5RiwgMHgyRjg4LAotICAgIDB4MjNBMCwgMHgyRjc1LCAweDIzQTEsIDB4MkY3QywgMHgyM0EyLCAweDJGODgsIDB4MjNBMywgMHgyRjdCLAotICAgIDB4MjNBNCwgMHgyRjdFLCAweDIzQTUsIDB4MkY4OCwgMHgyM0E2LCAweDJGN0QsIDB4MjNBNywgMHgxRkU4LAotICAgIDB4MjNBOCwgMHgxRkU3LCAweDIzQTksIDB4MUZFNiwgMHgyM0FBLCAweDJGODgsIDB4MjNBQiwgMHgxRkVDLAotICAgIDB4MjNBQywgMHgxRkVCLCAweDIzQUQsIDB4MUZFQSwgMHgyM0IwLCAweDNGREUsIDB4MjNCMSwgMHgzRkRGLAotICAgIDB4MjUwMCwgMHgxRDM5LCAweDI1MDEsIDB4MUQzQSwgMHgyNTAyLCAweDFEMzcsIDB4MjUwMywgMHgxRDM4LAotICAgIDB4MjUwNCwgMHgxRDNELCAweDI1MDUsIDB4MUQzRSwgMHgyNTA2LCAweDFEM0IsIDB4MjUwNywgMHgxRDNDLAotICAgIDB4MjUwOCwgMHgxRDQxLCAweDI1MDksIDB4MUQ0MiwgMHgyNTBBLCAweDFEM0YsIDB4MjUwQiwgMHgxRDQwLAotICAgIDB4MjUwQywgMHgxRDQ3LCAweDI1MEQsIDB4MUQ0OSwgMHgyNTBFLCAweDFENDgsIDB4MjUwRiwgMHgxRDRBLAotICAgIDB4MjUxMCwgMHgxRDRGLCAweDI1MTEsIDB4MUQ1MSwgMHgyNTEyLCAweDFENTAsIDB4MjUxMywgMHgxRDUyLAotICAgIDB4MjUxNCwgMHgxRDQzLCAweDI1MTUsIDB4MUQ0NSwgMHgyNTE2LCAweDFENDQsIDB4MjUxNywgMHgxRDQ2LAotICAgIDB4MjUxOCwgMHgxRDRCLCAweDI1MTksIDB4MUQ0RCwgMHgyNTFBLCAweDFENEMsIDB4MjUxQiwgMHgxRDRFLAotICAgIDB4MjUxQywgMHgxRDYzLCAweDI1MUQsIDB4MUQ2NywgMHgyNTFFLCAweDFENjUsIDB4MjUxRiwgMHgxRDY0LAotICAgIDB4MjUyMCwgMHgxRDY2LCAweDI1MjEsIDB4MUQ2OSwgMHgyNTIyLCAweDFENjgsIDB4MjUyMywgMHgxRDZBLAotICAgIDB4MjUyNCwgMHgxRDZCLCAweDI1MjUsIDB4MUQ2RiwgMHgyNTI2LCAweDFENkQsIDB4MjUyNywgMHgxRDZDLAotICAgIDB4MjUyOCwgMHgxRDZFLCAweDI1MjksIDB4MUQ3MSwgMHgyNTJBLCAweDFENzAsIDB4MjUyQiwgMHgxRDcyLAotICAgIDB4MjUyQywgMHgxRDVCLCAweDI1MkQsIDB4MUQ1RCwgMHgyNTJFLCAweDFENUUsIDB4MjUyRiwgMHgxRDVGLAotICAgIDB4MjUzMCwgMHgxRDVDLCAweDI1MzEsIDB4MUQ2MCwgMHgyNTMyLCAweDFENjEsIDB4MjUzMywgMHgxRDYyLAotICAgIDB4MjUzNCwgMHgxRDUzLCAweDI1MzUsIDB4MUQ1NSwgMHgyNTM2LCAweDFENTYsIDB4MjUzNywgMHgxRDU3LAotICAgIDB4MjUzOCwgMHgxRDU0LCAweDI1MzksIDB4MUQ1OCwgMHgyNTNBLCAweDFENTksIDB4MjUzQiwgMHgxRDVBLAotICAgIDB4MjUzRCwgMHgxRDc3LCAweDI1M0UsIDB4MUQ3OCwgMHgyNTNGLCAweDFENzksIDB4MjU0MCwgMHgxRDc1LAotICAgIDB4MjU0MSwgMHgxRDc0LCAweDI1NDIsIDB4MUQ3NiwgMHgyNTQzLCAweDFEN0IsIDB4MjU0NCwgMHgxRDdELAotICAgIDB4MjU0NSwgMHgxRDdBLCAweDI1NDYsIDB4MUQ3QywgMHgyNTQ3LCAweDFEODEsIDB4MjU0OCwgMHgxRDgwLAotICAgIDB4MjU0OSwgMHgxRDdFLCAweDI1NEEsIDB4MUQ3RiwgMHgyNjFDLCAweDIwMUQsIDB4MjYxRCwgMHgyMDFCLAotICAgIDB4MjYxRSwgMHgyMDFFLCAweDI2MUYsIDB4MjAxQywgMHgyNzAyLCAweDJGOTIsIDB4MjdBMSwgMHgyMDExLAotICAgIDB4MzAwMSwgMHgxRUNGLCAweDMwMDIsIDB4MUVEMCwgMHgzMDA4LCAweDFFRTMsIDB4MzAwOSwgMHgxRUU0LAotICAgIDB4MzAwQSwgMHgxRUU1LCAweDMwMEIsIDB4MUVFNiwgMHgzMDBDLCAweDFFRTcsIDB4MzAwRCwgMHgxRUU4LAotICAgIDB4MzAwRSwgMHgxRUU5LCAweDMwMEYsIDB4MUVFQSwgMHgzMDEwLCAweDFFRUIsIDB4MzAxMSwgMHgxRUVDLAotICAgIDB4MzAxNCwgMHgxRURELCAweDMwMTUsIDB4MUVERSwgMHgzMDE2LCAweDNGQzksIDB4MzAxNywgMHgzRkNBLAotICAgIDB4MzAxOCwgMHgyRjZCLCAweDMwMTksIDB4MkY2QywgMHgzMDFDLCAweDFFRDYsIDB4MzAxRCwgMHgxRjE0LAotICAgIDB4MzAxRiwgMHgxRjE1LCAweDMwM0IsIDB4MkY0QiwgMHgzMDQxLCAweDFFRUUsIDB4MzA0MywgMHgxRUVGLAotICAgIDB4MzA0NSwgMHgxRUYwLCAweDMwNDcsIDB4MUVGMSwgMHgzMDQ5LCAweDFFRjIsIDB4MzA2MywgMHgxRUYzLAotICAgIDB4MzA4MywgMHgxRUY0LCAweDMwODUsIDB4MUVGNSwgMHgzMDg3LCAweDFFRjYsIDB4MzA4RSwgMHgxRUY3LAotICAgIDB4MzA5NSwgMHgyMDQ4LCAweDMwOTYsIDB4MjA0OSwgMHgzMDlCLCAweDIwNTAsIDB4MzA5QywgMHgyMDRGLAotICAgIDB4MzBBMCwgMHgzRkNCLCAweDMwQTEsIDB4MUVGOCwgMHgzMEEzLCAweDFFRjksIDB4MzBBNSwgMHgxRUZBLAotICAgIDB4MzBBNywgMHgxRUZCLCAweDMwQTksIDB4MUVGQywgMHgzMEMzLCAweDFFRkQsIDB4MzBFMywgMHgxRUZFLAotICAgIDB4MzBFNSwgMHgxRUZGLCAweDMwRTcsIDB4MUYwMCwgMHgzMEVFLCAweDFGMDEsIDB4MzBGNSwgMHgxRjAyLAotICAgIDB4MzBGNiwgMHgxRjAzLCAweDMwRkMsIDB4MUVEMywgMHgzMUYwLCAweDNGQ0QsIDB4MzFGMSwgMHgzRkNFLAotICAgIDB4MzFGMiwgMHgzRkNGLCAweDMxRjMsIDB4M0ZEMCwgMHgzMUY0LCAweDNGRDEsIDB4MzFGNSwgMHgzRkQyLAotICAgIDB4MzFGNiwgMHgzRkQzLCAweDMxRjcsIDB4M0ZENCwgMHgzMUY4LCAweDNGRDUsIDB4MzFGOSwgMHgzRkQ2LAotICAgIDB4MzFGQSwgMHgzRkQ4LCAweDMxRkIsIDB4M0ZEOSwgMHgzMUZDLCAweDNGREEsIDB4MzFGRCwgMHgzRkRCLAotICAgIDB4MzFGRSwgMHgzRkRDLCAweDMxRkYsIDB4M0ZERCwgMHgzMzAwLCAweDIwOUUsIDB4MzMwMSwgMHgyRUI2LAotICAgIDB4MzMwMiwgMHgyRUI3LCAweDMzMDMsIDB4MjA5MiwgMHgzMzA0LCAweDJFQjgsIDB4MzMwNSwgMHgyMDhELAotICAgIDB4MzMwNiwgMHgyRUI5LCAweDMzMDcsIDB4MkVCRCwgMHgzMzA4LCAweDJFQkIsIDB4MzMwOSwgMHgyRUMwLAotICAgIDB4MzMwQSwgMHgyRUJFLCAweDMzMEIsIDB4MkVDMiwgMHgzMzBDLCAweDJFQzQsIDB4MzMwRCwgMHgxRjBFLAotICAgIDB4MzMwRSwgMHgyRUM1LCAweDMzMEYsIDB4MkVDNiwgMHgzMzEwLCAweDJFQzcsIDB4MzMxMSwgMHgyRUM4LAotICAgIDB4MzMxMiwgMHgyRUM5LCAweDMzMTMsIDB4MkVDQSwgMHgzMzE0LCAweDFGMDUsIDB4MzMxNSwgMHgyMDk0LAotICAgIDB4MzMxNiwgMHgyMDhBLCAweDMzMTcsIDB4MkVDQywgMHgzMzE4LCAweDIwOTMsIDB4MzMxOSwgMHgyRUNFLAotICAgIDB4MzMxQSwgMHgyRUQwLCAweDMzMUIsIDB4MkVEMSwgMHgzMzFDLCAweDJFRDIsIDB4MzMxRCwgMHgyRUQzLAotICAgIDB4MzMxRSwgMHgyMEExLCAweDMzMUYsIDB4MkVENCwgMHgzMzIwLCAweDJFRDUsIDB4MzMyMSwgMHgyRUQ2LAotICAgIDB4MzMyMiwgMHgyMDg5LCAweDMzMjMsIDB4MjA5QywgMHgzMzI0LCAweDJFRDcsIDB4MzMyNSwgMHgyRUQ5LAotICAgIDB4MzMyNiwgMHgxRjBGLCAweDMzMjcsIDB4MUYwOSwgMHgzMzI4LCAweDJFREMsIDB4MzMyOSwgMHgyRURELAotICAgIDB4MzMyQSwgMHgyMEE0LCAweDMzMkIsIDB4MUYxMSwgMHgzMzJELCAweDJFREYsIDB4MzMyRSwgMHgyRUUyLAotICAgIDB4MzMyRiwgMHgyRUUzLCAweDMzMzAsIDB4MkVFNCwgMHgzMzMxLCAweDIwQTYsIDB4MzMzMiwgMHgyRUU1LAotICAgIDB4MzMzMywgMHgyMDhFLCAweDMzMzQsIDB4MkVFOCwgMHgzMzM1LCAweDJFRTksIDB4MzMzNiwgMHgxRjBCLAotICAgIDB4MzMzNywgMHgyRUVFLCAweDMzMzgsIDB4MkVGMCwgMHgzMzM5LCAweDIwOTcsIDB4MzMzQSwgMHgyRUYxLAotICAgIDB4MzMzQiwgMHgyMDlELCAweDMzM0MsIDB4MkVFQSwgMHgzMzNELCAweDJFRjIsIDB4MzMzRSwgMHgyRUY0LAotICAgIDB4MzMzRiwgMHgyRUY1LCAweDMzNDAsIDB4MkVGNiwgMHgzMzQxLCAweDJFRjMsIDB4MzM0MiwgMHgyMDlCLAotICAgIDB4MzM0MywgMHgyRUY3LCAweDMzNDQsIDB4MkVGOCwgMHgzMzQ1LCAweDJFRjksIDB4MzM0NiwgMHgyRUZBLAotICAgIDB4MzM0NywgMHgyMEE1LCAweDMzNDgsIDB4MkVGQiwgMHgzMzQ5LCAweDFGMDQsIDB4MzM0QSwgMHgxRjEyLAotICAgIDB4MzM0QiwgMHgyRUZDLCAweDMzNEMsIDB4MkVGRCwgMHgzMzRELCAweDFGMDcsIDB4MzM0RSwgMHgyMDkxLAotICAgIDB4MzM0RiwgMHgyRUZFLCAweDMzNTAsIDB4MkVGRiwgMHgzMzUxLCAweDFGMEMsIDB4MzM1MiwgMHgyRjAyLAotICAgIDB4MzM1MywgMHgyRjA2LCAweDMzNTQsIDB4MkYwMywgMHgzMzU1LCAweDJGMDcsIDB4MzM1NiwgMHgyRjA4LAotICAgIDB4MzM1NywgMHgyMDk4LCAweDMzN0YsIDB4MjA4NCwgMHhGRjA4LCAweDFFREIsIDB4RkYwOSwgMHgxRURDLAotICAgIDB4RkYwQywgMHgyMDRDLCAweEZGMEUsIDB4MjA1MiwgMHhGRjFELCAweDFFRUQsIDB4RkYzQiwgMHgxRURGLAotICAgIDB4RkYzRCwgMHgxRUUwLCAweEZGM0YsIDB4MUVEMiwgMHhGRjVCLCAweDFFRTEsIDB4RkY1QywgMHgxRUQ4LAotICAgIDB4RkY1RCwgMHgxRUUyLCAweEZGNUUsIDB4MUVENiwgMHhGRjVGLCAweDJGNkQsIDB4RkY2MCwgMHgyRjZFLAorICAgIDB4MDBCMCwgMHgyMDRELCAweDIwMTAsIDB4MUVENSwgMHgyMDE1LCAweDFFRDQsIDB4MjAxNiwgMHgxRUQ3LCAweDIwMjUsCisgICAgMHgxRURBLCAweDIwMjYsIDB4MUVEOSwgMHgyMDMyLCAweDIwNTEsIDB4MjAzMywgMHgyMDVCLCAweDIxOTAsIDB4MDJFMiwKKyAgICAweDIxOTEsIDB4MDJFMCwgMHgyMTkyLCAweDAyRTMsIDB4MjE5MywgMHgwMkUxLCAweDIxQzQsIDB4MjA3NywgMHgyMUM1LAorICAgIDB4MjA3NiwgMHgyMUM2LCAweDIwNzgsIDB4MjFFNiwgMHgxRjRDLCAweDIxRTcsIDB4MUY0RSwgMHgyMUU4LCAweDFGNEIsCisgICAgMHgyMUU5LCAweDFGNEQsIDB4MjM5QiwgMHgyRjc0LCAweDIzOUMsIDB4MkY4OCwgMHgyMzlELCAweDJGNzMsIDB4MjM5RSwKKyAgICAweDJGNzYsIDB4MjM5RiwgMHgyRjg4LCAweDIzQTAsIDB4MkY3NSwgMHgyM0ExLCAweDJGN0MsIDB4MjNBMiwgMHgyRjg4LAorICAgIDB4MjNBMywgMHgyRjdCLCAweDIzQTQsIDB4MkY3RSwgMHgyM0E1LCAweDJGODgsIDB4MjNBNiwgMHgyRjdELCAweDIzQTcsCisgICAgMHgxRkU4LCAweDIzQTgsIDB4MUZFNywgMHgyM0E5LCAweDFGRTYsIDB4MjNBQSwgMHgyRjg4LCAweDIzQUIsIDB4MUZFQywKKyAgICAweDIzQUMsIDB4MUZFQiwgMHgyM0FELCAweDFGRUEsIDB4MjNCMCwgMHgzRkRFLCAweDIzQjEsIDB4M0ZERiwgMHgyNTAwLAorICAgIDB4MUQzOSwgMHgyNTAxLCAweDFEM0EsIDB4MjUwMiwgMHgxRDM3LCAweDI1MDMsIDB4MUQzOCwgMHgyNTA0LCAweDFEM0QsCisgICAgMHgyNTA1LCAweDFEM0UsIDB4MjUwNiwgMHgxRDNCLCAweDI1MDcsIDB4MUQzQywgMHgyNTA4LCAweDFENDEsIDB4MjUwOSwKKyAgICAweDFENDIsIDB4MjUwQSwgMHgxRDNGLCAweDI1MEIsIDB4MUQ0MCwgMHgyNTBDLCAweDFENDcsIDB4MjUwRCwgMHgxRDQ5LAorICAgIDB4MjUwRSwgMHgxRDQ4LCAweDI1MEYsIDB4MUQ0QSwgMHgyNTEwLCAweDFENEYsIDB4MjUxMSwgMHgxRDUxLCAweDI1MTIsCisgICAgMHgxRDUwLCAweDI1MTMsIDB4MUQ1MiwgMHgyNTE0LCAweDFENDMsIDB4MjUxNSwgMHgxRDQ1LCAweDI1MTYsIDB4MUQ0NCwKKyAgICAweDI1MTcsIDB4MUQ0NiwgMHgyNTE4LCAweDFENEIsIDB4MjUxOSwgMHgxRDRELCAweDI1MUEsIDB4MUQ0QywgMHgyNTFCLAorICAgIDB4MUQ0RSwgMHgyNTFDLCAweDFENjMsIDB4MjUxRCwgMHgxRDY3LCAweDI1MUUsIDB4MUQ2NSwgMHgyNTFGLCAweDFENjQsCisgICAgMHgyNTIwLCAweDFENjYsIDB4MjUyMSwgMHgxRDY5LCAweDI1MjIsIDB4MUQ2OCwgMHgyNTIzLCAweDFENkEsIDB4MjUyNCwKKyAgICAweDFENkIsIDB4MjUyNSwgMHgxRDZGLCAweDI1MjYsIDB4MUQ2RCwgMHgyNTI3LCAweDFENkMsIDB4MjUyOCwgMHgxRDZFLAorICAgIDB4MjUyOSwgMHgxRDcxLCAweDI1MkEsIDB4MUQ3MCwgMHgyNTJCLCAweDFENzIsIDB4MjUyQywgMHgxRDVCLCAweDI1MkQsCisgICAgMHgxRDVELCAweDI1MkUsIDB4MUQ1RSwgMHgyNTJGLCAweDFENUYsIDB4MjUzMCwgMHgxRDVDLCAweDI1MzEsIDB4MUQ2MCwKKyAgICAweDI1MzIsIDB4MUQ2MSwgMHgyNTMzLCAweDFENjIsIDB4MjUzNCwgMHgxRDUzLCAweDI1MzUsIDB4MUQ1NSwgMHgyNTM2LAorICAgIDB4MUQ1NiwgMHgyNTM3LCAweDFENTcsIDB4MjUzOCwgMHgxRDU0LCAweDI1MzksIDB4MUQ1OCwgMHgyNTNBLCAweDFENTksCisgICAgMHgyNTNCLCAweDFENUEsIDB4MjUzRCwgMHgxRDc3LCAweDI1M0UsIDB4MUQ3OCwgMHgyNTNGLCAweDFENzksIDB4MjU0MCwKKyAgICAweDFENzUsIDB4MjU0MSwgMHgxRDc0LCAweDI1NDIsIDB4MUQ3NiwgMHgyNTQzLCAweDFEN0IsIDB4MjU0NCwgMHgxRDdELAorICAgIDB4MjU0NSwgMHgxRDdBLCAweDI1NDYsIDB4MUQ3QywgMHgyNTQ3LCAweDFEODEsIDB4MjU0OCwgMHgxRDgwLCAweDI1NDksCisgICAgMHgxRDdFLCAweDI1NEEsIDB4MUQ3RiwgMHgyNjFDLCAweDIwMUQsIDB4MjYxRCwgMHgyMDFCLCAweDI2MUUsIDB4MjAxRSwKKyAgICAweDI2MUYsIDB4MjAxQywgMHgyNzAyLCAweDJGOTIsIDB4MjdBMSwgMHgyMDExLCAweDMwMDEsIDB4MUVDRiwgMHgzMDAyLAorICAgIDB4MUVEMCwgMHgzMDA4LCAweDFFRTMsIDB4MzAwOSwgMHgxRUU0LCAweDMwMEEsIDB4MUVFNSwgMHgzMDBCLCAweDFFRTYsCisgICAgMHgzMDBDLCAweDFFRTcsIDB4MzAwRCwgMHgxRUU4LCAweDMwMEUsIDB4MUVFOSwgMHgzMDBGLCAweDFFRUEsIDB4MzAxMCwKKyAgICAweDFFRUIsIDB4MzAxMSwgMHgxRUVDLCAweDMwMTQsIDB4MUVERCwgMHgzMDE1LCAweDFFREUsIDB4MzAxNiwgMHgzRkM5LAorICAgIDB4MzAxNywgMHgzRkNBLCAweDMwMTgsIDB4MkY2QiwgMHgzMDE5LCAweDJGNkMsIDB4MzAxQywgMHgxRUQ2LCAweDMwMUQsCisgICAgMHgxRjE0LCAweDMwMUYsIDB4MUYxNSwgMHgzMDNCLCAweDJGNEIsIDB4MzA0MSwgMHgxRUVFLCAweDMwNDMsIDB4MUVFRiwKKyAgICAweDMwNDUsIDB4MUVGMCwgMHgzMDQ3LCAweDFFRjEsIDB4MzA0OSwgMHgxRUYyLCAweDMwNjMsIDB4MUVGMywgMHgzMDgzLAorICAgIDB4MUVGNCwgMHgzMDg1LCAweDFFRjUsIDB4MzA4NywgMHgxRUY2LCAweDMwOEUsIDB4MUVGNywgMHgzMDk1LCAweDIwNDgsCisgICAgMHgzMDk2LCAweDIwNDksIDB4MzA5QiwgMHgyMDUwLCAweDMwOUMsIDB4MjA0RiwgMHgzMEEwLCAweDNGQ0IsIDB4MzBBMSwKKyAgICAweDFFRjgsIDB4MzBBMywgMHgxRUY5LCAweDMwQTUsIDB4MUVGQSwgMHgzMEE3LCAweDFFRkIsIDB4MzBBOSwgMHgxRUZDLAorICAgIDB4MzBDMywgMHgxRUZELCAweDMwRTMsIDB4MUVGRSwgMHgzMEU1LCAweDFFRkYsIDB4MzBFNywgMHgxRjAwLCAweDMwRUUsCisgICAgMHgxRjAxLCAweDMwRjUsIDB4MUYwMiwgMHgzMEY2LCAweDFGMDMsIDB4MzBGQywgMHgxRUQzLCAweDMxRjAsIDB4M0ZDRCwKKyAgICAweDMxRjEsIDB4M0ZDRSwgMHgzMUYyLCAweDNGQ0YsIDB4MzFGMywgMHgzRkQwLCAweDMxRjQsIDB4M0ZEMSwgMHgzMUY1LAorICAgIDB4M0ZEMiwgMHgzMUY2LCAweDNGRDMsIDB4MzFGNywgMHgzRkQ0LCAweDMxRjgsIDB4M0ZENSwgMHgzMUY5LCAweDNGRDYsCisgICAgMHgzMUZBLCAweDNGRDgsIDB4MzFGQiwgMHgzRkQ5LCAweDMxRkMsIDB4M0ZEQSwgMHgzMUZELCAweDNGREIsIDB4MzFGRSwKKyAgICAweDNGREMsIDB4MzFGRiwgMHgzRkRELCAweDMzMDAsIDB4MjA5RSwgMHgzMzAxLCAweDJFQjYsIDB4MzMwMiwgMHgyRUI3LAorICAgIDB4MzMwMywgMHgyMDkyLCAweDMzMDQsIDB4MkVCOCwgMHgzMzA1LCAweDIwOEQsIDB4MzMwNiwgMHgyRUI5LCAweDMzMDcsCisgICAgMHgyRUJELCAweDMzMDgsIDB4MkVCQiwgMHgzMzA5LCAweDJFQzAsIDB4MzMwQSwgMHgyRUJFLCAweDMzMEIsIDB4MkVDMiwKKyAgICAweDMzMEMsIDB4MkVDNCwgMHgzMzBELCAweDFGMEUsIDB4MzMwRSwgMHgyRUM1LCAweDMzMEYsIDB4MkVDNiwgMHgzMzEwLAorICAgIDB4MkVDNywgMHgzMzExLCAweDJFQzgsIDB4MzMxMiwgMHgyRUM5LCAweDMzMTMsIDB4MkVDQSwgMHgzMzE0LCAweDFGMDUsCisgICAgMHgzMzE1LCAweDIwOTQsIDB4MzMxNiwgMHgyMDhBLCAweDMzMTcsIDB4MkVDQywgMHgzMzE4LCAweDIwOTMsIDB4MzMxOSwKKyAgICAweDJFQ0UsIDB4MzMxQSwgMHgyRUQwLCAweDMzMUIsIDB4MkVEMSwgMHgzMzFDLCAweDJFRDIsIDB4MzMxRCwgMHgyRUQzLAorICAgIDB4MzMxRSwgMHgyMEExLCAweDMzMUYsIDB4MkVENCwgMHgzMzIwLCAweDJFRDUsIDB4MzMyMSwgMHgyRUQ2LCAweDMzMjIsCisgICAgMHgyMDg5LCAweDMzMjMsIDB4MjA5QywgMHgzMzI0LCAweDJFRDcsIDB4MzMyNSwgMHgyRUQ5LCAweDMzMjYsIDB4MUYwRiwKKyAgICAweDMzMjcsIDB4MUYwOSwgMHgzMzI4LCAweDJFREMsIDB4MzMyOSwgMHgyRURELCAweDMzMkEsIDB4MjBBNCwgMHgzMzJCLAorICAgIDB4MUYxMSwgMHgzMzJELCAweDJFREYsIDB4MzMyRSwgMHgyRUUyLCAweDMzMkYsIDB4MkVFMywgMHgzMzMwLCAweDJFRTQsCisgICAgMHgzMzMxLCAweDIwQTYsIDB4MzMzMiwgMHgyRUU1LCAweDMzMzMsIDB4MjA4RSwgMHgzMzM0LCAweDJFRTgsIDB4MzMzNSwKKyAgICAweDJFRTksIDB4MzMzNiwgMHgxRjBCLCAweDMzMzcsIDB4MkVFRSwgMHgzMzM4LCAweDJFRjAsIDB4MzMzOSwgMHgyMDk3LAorICAgIDB4MzMzQSwgMHgyRUYxLCAweDMzM0IsIDB4MjA5RCwgMHgzMzNDLCAweDJFRUEsIDB4MzMzRCwgMHgyRUYyLCAweDMzM0UsCisgICAgMHgyRUY0LCAweDMzM0YsIDB4MkVGNSwgMHgzMzQwLCAweDJFRjYsIDB4MzM0MSwgMHgyRUYzLCAweDMzNDIsIDB4MjA5QiwKKyAgICAweDMzNDMsIDB4MkVGNywgMHgzMzQ0LCAweDJFRjgsIDB4MzM0NSwgMHgyRUY5LCAweDMzNDYsIDB4MkVGQSwgMHgzMzQ3LAorICAgIDB4MjBBNSwgMHgzMzQ4LCAweDJFRkIsIDB4MzM0OSwgMHgxRjA0LCAweDMzNEEsIDB4MUYxMiwgMHgzMzRCLCAweDJFRkMsCisgICAgMHgzMzRDLCAweDJFRkQsIDB4MzM0RCwgMHgxRjA3LCAweDMzNEUsIDB4MjA5MSwgMHgzMzRGLCAweDJFRkUsIDB4MzM1MCwKKyAgICAweDJFRkYsIDB4MzM1MSwgMHgxRjBDLCAweDMzNTIsIDB4MkYwMiwgMHgzMzUzLCAweDJGMDYsIDB4MzM1NCwgMHgyRjAzLAorICAgIDB4MzM1NSwgMHgyRjA3LCAweDMzNTYsIDB4MkYwOCwgMHgzMzU3LCAweDIwOTgsIDB4MzM3RiwgMHgyMDg0LCAweEZGMDgsCisgICAgMHgxRURCLCAweEZGMDksIDB4MUVEQywgMHhGRjBDLCAweDIwNEMsIDB4RkYwRSwgMHgyMDUyLCAweEZGMUQsIDB4MUVFRCwKKyAgICAweEZGM0IsIDB4MUVERiwgMHhGRjNELCAweDFFRTAsIDB4RkYzRiwgMHgxRUQyLCAweEZGNUIsIDB4MUVFMSwgMHhGRjVDLAorICAgIDB4MUVEOCwgMHhGRjVELCAweDFFRTIsIDB4RkY1RSwgMHgxRUQ2LCAweEZGNUYsIDB4MkY2RCwgMHhGRjYwLCAweDJGNkUsCiAgICAgMHhGRkUzLCAweDFFRDEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9jbWFwc19qYXBhbjEuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9jbWFwc19qYXBhbjEuY3BwCmluZGV4IGU1MDAyZDYuLjFjNzg4ZGMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvY21hcHNfamFwYW4xLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL2NtYXBzX2phcGFuMS5jcHAKQEAgLTEyLDMzICsxMiw1NCBAQAogI2luY2x1ZGUgImNtYXBzX2phcGFuMS5oIgogCiBzdGF0aWMgY29uc3QgRlhDTUFQX0NNYXAgZ19GWENNQVBfSmFwYW4xX2NtYXBzW10gPSB7Ci0gICAgeyAiODNwdi1SS1NKLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQXzgzcHZfUktTSl9IXzEsIDIyMiwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICI5MG1zLVJLU0otSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfOTBtc19SS1NKX0hfMiwgMTcxLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIjkwbXMtUktTSi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF85MG1zX1JLU0pfVl8yLCA3OCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiOTBtc3AtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF85MG1zcF9SS1NKX0hfMiwgMTcwLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTIgfSwKLSAgICB7ICI5MG1zcC1SS1NKLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQXzkwbXNwX1JLU0pfVl8yLCA3OCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiOTBwdi1SS1NKLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQXzkwcHZfUktTSl9IXzEsIDI2MywgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJBZGQtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9BZGRfUktTSl9IXzEsIDYzNSwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJBZGQtUktTSi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9BZGRfUktTSl9WXzEsIDU3LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJFVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVVDX0hfMSwgMTIwLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIkVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9FVUNfVl8xLCAyNywgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiRXh0LVJLU0otSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRXh0X1JLU0pfSF8yLCA2NjUsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtNCB9LAotICAgIHsgIkV4dC1SS1NKLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0V4dF9SS1NKX1ZfMiwgMzksIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIkgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0hfMSwgMTE4LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIlYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1ZfMSwgMjcsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIlVuaUpJUy1VQ1MyLUgiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9IXzQsIDk3NzIsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwIH0sCi0gICAgeyAiVW5pSklTLVVDUzItViIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX1ZfNCwgMjUxLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJVbmlKSVMtVUNTMi1IVy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9IV19IXzQsIDQsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMiB9LAotICAgIHsgIlVuaUpJUy1VQ1MyLUhXLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hXX1ZfNCwgMTk5LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJVbmlKSVMtVVRGMTYtSCIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hfNCwgOTc3MiwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJVbmlKSVMtVVRGMTYtViIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX1ZfNCwgMjUxLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKKyAgICB7IjgzcHYtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF84M3B2X1JLU0pfSF8xLCAyMjIsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IjkwbXMtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF85MG1zX1JLU0pfSF8yLCAxNzEsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IjkwbXMtUktTSi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF85MG1zX1JLU0pfVl8yLCA3OCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IjkwbXNwLVJLU0otSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfOTBtc3BfUktTSl9IXzIsIDE3MCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0yfSwKKyAgICB7IjkwbXNwLVJLU0otViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfOTBtc3BfUktTSl9WXzIsIDc4LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAorICAgIHsiOTBwdi1SS1NKLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQXzkwcHZfUktTSl9IXzEsIDI2MywKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDB9LAorICAgIHsiQWRkLVJLU0otSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQWRkX1JLU0pfSF8xLCA2MzUsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IkFkZC1SS1NKLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0FkZF9SS1NKX1ZfMSwgNTcsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJFVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVVDX0hfMSwgMTIwLCBGWENNQVBfQ01hcDo6Tm9uZSwKKyAgICAgTlVMTCwgMCwgMH0sCisgICAgeyJFVUMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVVDX1ZfMSwgMjcsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLAorICAgICAwLCAtMX0sCisgICAgeyJFeHQtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9FeHRfUktTSl9IXzIsIDY2NSwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC00fSwKKyAgICB7IkV4dC1SS1NKLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0V4dF9SS1NKX1ZfMiwgMzksCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJIIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9IXzEsIDExOCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDB9LAorICAgIHsiViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVl8xLCAyNywgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IlVuaUpJUy1VQ1MyLUgiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9IXzQsIDk3NzIsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IlVuaUpJUy1VQ1MyLVYiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9WXzQsIDI1MSwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IlVuaUpJUy1VQ1MyLUhXLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hXX0hfNCwgNCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0yfSwKKyAgICB7IlVuaUpJUy1VQ1MyLUhXLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hXX1ZfNCwgMTk5LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAorICAgIHsiVW5pSklTLVVURjE2LUgiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9IXzQsIDk3NzIsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IlVuaUpJUy1VVEYxNi1WIiwgRlhDTUFQX0NNYXA6OlNpbmdsZSwgZ19GWENNQVBfVW5pSklTX1VDUzJfVl80LCAyNTEsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCiB9OwogCi12b2lkIENQREZfTW9kdWxlTWdyOjpMb2FkRW1iZWRkZWRKYXBhbjFDTWFwcygpCi17Ci0gICAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7Ci0gICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0pBUEFOMV0ubV9wTWFwTGlzdCA9IGdfRlhDTUFQX0phcGFuMV9jbWFwczsKLSAgICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfSkFQQU4xXS5tX0NvdW50ID0gRlhfQXJyYXlTaXplKGdfRlhDTUFQX0phcGFuMV9jbWFwcyk7Ci0gICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tDSURTRVRfSkFQQU4xXS5tX3BNYXAgPSBnX0ZYQ01BUF9KYXBhbjFDSUQyVW5pY29kZV80OwotICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0pBUEFOMV0ubV9Db3VudCA9IDE1NDQ0Owordm9pZCBDUERGX01vZHVsZU1ncjo6TG9hZEVtYmVkZGVkSmFwYW4xQ01hcHMoKSB7CisgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9CisgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKTsKKyAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0pBUEFOMV0ubV9wTWFwTGlzdCA9CisgICAgICBnX0ZYQ01BUF9KYXBhbjFfY21hcHM7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9KQVBBTjFdLm1fQ291bnQgPQorICAgICAgRlhfQXJyYXlTaXplKGdfRlhDTUFQX0phcGFuMV9jbWFwcyk7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0pBUEFOMV0ubV9wTWFwID0KKyAgICAgIGdfRlhDTUFQX0phcGFuMUNJRDJVbmljb2RlXzQ7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0pBUEFOMV0ubV9Db3VudCA9IDE1NDQ0OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9BZG9iZS1Lb3JlYTEtVUNTMl8yLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvQWRvYmUtS29yZWExLVVDUzJfMi5jcHAKaW5kZXggZWM0NDQyMi4uN2RjODVmZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9BZG9iZS1Lb3JlYTEtVUNTMl8yLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0Fkb2JlLUtvcmVhMS1VQ1MyXzIuY3BwCkBAIC03LDIyOTggKzcsMjA0NCBAQAogI2luY2x1ZGUgImNtYXBzX2tvcmVhMS5oIgogCiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tvcmVhMUNJRDJVbmljb2RlXzJbMTgzNTJdID0gewotICAgIDB4RkZGRCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LAotICAgIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLAotICAgIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LAotICAgIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLAotICAgIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LAotICAgIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLAotICAgIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LAotICAgIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLAotICAgIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LAotICAgIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLAotICAgIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LAotICAgIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLAotICAgIDB4MjBBOSwgMHgyMDEwLCAweDAwQTksIDB4MjEyMiwgMHgyMkVGLCAweDMwMDAsIDB4MzAwMSwgMHgzMDAyLAotICAgIDB4MDBCNywgMHgyMDI1LCAweDIwMjYsIDB4MDBBOCwgMHgzMDAzLCAweDIwMTMsIDB4MjAxNCwgMHgyMDE2LAotICAgIDB4RkYzQywgMHgyMjNDLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MzAxNCwgMHgzMDE1LAotICAgIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwgMHgzMDBDLCAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLAotICAgIDB4MzAxMCwgMHgzMDExLCAweDAwQjEsIDB4MDBENywgMHgwMEY3LCAweDIyNjAsIDB4MjI2NCwgMHgyMjY1LAotICAgIDB4MjIxRSwgMHgyMjM0LCAweDAwQjAsIDB4MjAzMiwgMHgyMDMzLCAweDIxMDMsIDB4MjEyQiwgMHhGRkUwLAotICAgIDB4RkZFMSwgMHhGRkU1LCAweDI2NDIsIDB4MjY0MCwgMHgyMjIwLCAweDIyQTUsIDB4MjMxMiwgMHgyMjAyLAotICAgIDB4MjIwNywgMHgyMjYxLCAweDIyNTIsIDB4MDBBNywgMHgyMDNCLCAweDI2MDYsIDB4MjYwNSwgMHgyNUNCLAotICAgIDB4MjVDRiwgMHgyNUNFLCAweDI1QzcsIDB4MjVDNiwgMHgyNUExLCAweDI1QTAsIDB4MjVCMywgMHgyNUIyLAotICAgIDB4MjVCRCwgMHgyNUJDLCAweDIxOTIsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTMsIDB4MjE5NCwgMHgzMDEzLAotICAgIDB4MjI2QSwgMHgyMjZCLCAweDIyMUEsIDB4MjIzRCwgMHgyMjFELCAweDIyMzUsIDB4MjIyQiwgMHgyMjJDLAotICAgIDB4MjIwOCwgMHgyMjBCLCAweDIyODYsIDB4MjI4NywgMHgyMjgyLCAweDIyODMsIDB4MjIyQSwgMHgyMjI5LAotICAgIDB4MjIyNywgMHgyMjI4LCAweEZGRTIsIDB4MjFEMiwgMHgyMUQ0LCAweDIyMDAsIDB4MjIwMywgMHgwMEI0LAotICAgIDB4MDJEQywgMHgwMkM3LCAweDAyRDgsIDB4MDJERCwgMHgwMkRBLCAweDAyRDksIDB4MDBCOCwgMHgwMkRCLAotICAgIDB4MDBBMSwgMHgwMEJGLCAweDIyMzYsIDB4MjIyRSwgMHgyMjExLCAweDIyMEYsIDB4MDBBNCwgMHgyMTA5LAotICAgIDB4MjAzMCwgMHgyNUMxLCAweDI1QzAsIDB4MjVCNywgMHgyNUI2LCAweDI2NjQsIDB4MjY2MCwgMHgyNjYxLAotICAgIDB4MjY2NSwgMHgyNjY3LCAweDI2NjMsIDB4MjI5OSwgMHgyNUM4LCAweDI1QTMsIDB4MjVEMCwgMHgyNUQxLAotICAgIDB4MjU5MiwgMHgyNUE0LCAweDI1QTUsIDB4MjVBOCwgMHgyNUE3LCAweDI1QTYsIDB4MjVBOSwgMHgyNjY4LAotICAgIDB4MjYwRiwgMHgyNjBFLCAweDI2MUMsIDB4MjYxRSwgMHgwMEI2LCAweDIwMjAsIDB4MjAyMSwgMHgyMTk1LAotICAgIDB4MjE5NywgMHgyMTk5LCAweDIxOTYsIDB4MjE5OCwgMHgyNjZELCAweDI2NjksIDB4MjY2QSwgMHgyNjZDLAotICAgIDB4MzI3RiwgMHgzMjFDLCAweDIxMTYsIDB4MzNDNywgMHgyMTIyLCAweDMzQzIsIDB4MzNEOCwgMHgyMTIxLAotICAgIDB4RkYwMSwgMHhGRjAyLCAweEZGMDMsIDB4RkYwNCwgMHhGRjA1LCAweEZGMDYsIDB4RkYwNywgMHhGRjA4LAotICAgIDB4RkYwOSwgMHhGRjBBLCAweEZGMEIsIDB4RkYwQywgMHhGRjBELCAweEZGMEUsIDB4RkYwRiwgMHhGRjEwLAotICAgIDB4RkYxMSwgMHhGRjEyLCAweEZGMTMsIDB4RkYxNCwgMHhGRjE1LCAweEZGMTYsIDB4RkYxNywgMHhGRjE4LAotICAgIDB4RkYxOSwgMHhGRjFBLCAweEZGMUIsIDB4RkYxQywgMHhGRjFELCAweEZGMUUsIDB4RkYxRiwgMHhGRjIwLAotICAgIDB4RkYyMSwgMHhGRjIyLCAweEZGMjMsIDB4RkYyNCwgMHhGRjI1LCAweEZGMjYsIDB4RkYyNywgMHhGRjI4LAotICAgIDB4RkYyOSwgMHhGRjJBLCAweEZGMkIsIDB4RkYyQywgMHhGRjJELCAweEZGMkUsIDB4RkYyRiwgMHhGRjMwLAotICAgIDB4RkYzMSwgMHhGRjMyLCAweEZGMzMsIDB4RkYzNCwgMHhGRjM1LCAweEZGMzYsIDB4RkYzNywgMHhGRjM4LAotICAgIDB4RkYzOSwgMHhGRjNBLCAweEZGM0IsIDB4RkZFNiwgMHhGRjNELCAweEZGM0UsIDB4RkYzRiwgMHhGRjQwLAotICAgIDB4RkY0MSwgMHhGRjQyLCAweEZGNDMsIDB4RkY0NCwgMHhGRjQ1LCAweEZGNDYsIDB4RkY0NywgMHhGRjQ4LAotICAgIDB4RkY0OSwgMHhGRjRBLCAweEZGNEIsIDB4RkY0QywgMHhGRjRELCAweEZGNEUsIDB4RkY0RiwgMHhGRjUwLAotICAgIDB4RkY1MSwgMHhGRjUyLCAweEZGNTMsIDB4RkY1NCwgMHhGRjU1LCAweEZGNTYsIDB4RkY1NywgMHhGRjU4LAotICAgIDB4RkY1OSwgMHhGRjVBLCAweEZGNUIsIDB4RkY1QywgMHhGRjVELCAweEZGRTMsIDB4MzEzMSwgMHgzMTMyLAotICAgIDB4MzEzMywgMHgzMTM0LCAweDMxMzUsIDB4MzEzNiwgMHgzMTM3LCAweDMxMzgsIDB4MzEzOSwgMHgzMTNBLAotICAgIDB4MzEzQiwgMHgzMTNDLCAweDMxM0QsIDB4MzEzRSwgMHgzMTNGLCAweDMxNDAsIDB4MzE0MSwgMHgzMTQyLAotICAgIDB4MzE0MywgMHgzMTQ0LCAweDMxNDUsIDB4MzE0NiwgMHgzMTQ3LCAweDMxNDgsIDB4MzE0OSwgMHgzMTRBLAotICAgIDB4MzE0QiwgMHgzMTRDLCAweDMxNEQsIDB4MzE0RSwgMHgzMTRGLCAweDMxNTAsIDB4MzE1MSwgMHgzMTUyLAotICAgIDB4MzE1MywgMHgzMTU0LCAweDMxNTUsIDB4MzE1NiwgMHgzMTU3LCAweDMxNTgsIDB4MzE1OSwgMHgzMTVBLAotICAgIDB4MzE1QiwgMHgzMTVDLCAweDMxNUQsIDB4MzE1RSwgMHgzMTVGLCAweDMxNjAsIDB4MzE2MSwgMHgzMTYyLAotICAgIDB4MzE2MywgMHgzMTY1LCAweDMxNjYsIDB4MzE2NywgMHgzMTY4LCAweDMxNjksIDB4MzE2QSwgMHgzMTZCLAotICAgIDB4MzE2QywgMHgzMTZELCAweDMxNkUsIDB4MzE2RiwgMHgzMTcwLCAweDMxNzEsIDB4MzE3MiwgMHgzMTczLAotICAgIDB4MzE3NCwgMHgzMTc1LCAweDMxNzYsIDB4MzE3NywgMHgzMTc4LCAweDMxNzksIDB4MzE3QSwgMHgzMTdCLAotICAgIDB4MzE3QywgMHgzMTdELCAweDMxN0UsIDB4MzE3RiwgMHgzMTgwLCAweDMxODEsIDB4MzE4MiwgMHgzMTgzLAotICAgIDB4MzE4NCwgMHgzMTg1LCAweDMxODYsIDB4MzE4NywgMHgzMTg4LCAweDMxODksIDB4MzE4QSwgMHgzMThCLAotICAgIDB4MzE4QywgMHgzMThELCAweDMxOEUsIDB4MjE3MCwgMHgyMTcxLCAweDIxNzIsIDB4MjE3MywgMHgyMTc0LAotICAgIDB4MjE3NSwgMHgyMTc2LCAweDIxNzcsIDB4MjE3OCwgMHgyMTc5LCAweDIxNjAsIDB4MjE2MSwgMHgyMTYyLAotICAgIDB4MjE2MywgMHgyMTY0LCAweDIxNjUsIDB4MjE2NiwgMHgyMTY3LCAweDIxNjgsIDB4MjE2OSwgMHgwMzkxLAotICAgIDB4MDM5MiwgMHgwMzkzLCAweDAzOTQsIDB4MDM5NSwgMHgwMzk2LCAweDAzOTcsIDB4MDM5OCwgMHgwMzk5LAotICAgIDB4MDM5QSwgMHgwMzlCLCAweDAzOUMsIDB4MDM5RCwgMHgwMzlFLCAweDAzOUYsIDB4MDNBMCwgMHgwM0ExLAotICAgIDB4MDNBMywgMHgwM0E0LCAweDAzQTUsIDB4MDNBNiwgMHgwM0E3LCAweDAzQTgsIDB4MDNBOSwgMHgwM0IxLAotICAgIDB4MDNCMiwgMHgwM0IzLCAweDAzQjQsIDB4MDNCNSwgMHgwM0I2LCAweDAzQjcsIDB4MDNCOCwgMHgwM0I5LAotICAgIDB4MDNCQSwgMHgwM0JCLCAweDAzQkMsIDB4MDNCRCwgMHgwM0JFLCAweDAzQkYsIDB4MDNDMCwgMHgwM0MxLAotICAgIDB4MDNDMywgMHgwM0M0LCAweDAzQzUsIDB4MDNDNiwgMHgwM0M3LCAweDAzQzgsIDB4MDNDOSwgMHgyNTAwLAotICAgIDB4MjUwMiwgMHgyNTBDLCAweDI1MTAsIDB4MjUxOCwgMHgyNTE0LCAweDI1MUMsIDB4MjUyQywgMHgyNTI0LAotICAgIDB4MjUzNCwgMHgyNTNDLCAweDI1MDEsIDB4MjUwMywgMHgyNTBGLCAweDI1MTMsIDB4MjUxQiwgMHgyNTE3LAotICAgIDB4MjUyMywgMHgyNTMzLCAweDI1MkIsIDB4MjUzQiwgMHgyNTRCLCAweDI1MjAsIDB4MjUyRiwgMHgyNTI4LAotICAgIDB4MjUzNywgMHgyNTNGLCAweDI1MUQsIDB4MjUzMCwgMHgyNTI1LCAweDI1MzgsIDB4MjU0MiwgMHgyNTEyLAotICAgIDB4MjUxMSwgMHgyNTFBLCAweDI1MTksIDB4MjUxNiwgMHgyNTE1LCAweDI1MEUsIDB4MjUwRCwgMHgyNTFFLAotICAgIDB4MjUxRiwgMHgyNTIxLCAweDI1MjIsIDB4MjUyNiwgMHgyNTI3LCAweDI1MjksIDB4MjUyQSwgMHgyNTJELAotICAgIDB4MjUyRSwgMHgyNTMxLCAweDI1MzIsIDB4MjUzNSwgMHgyNTM2LCAweDI1MzksIDB4MjUzQSwgMHgyNTNELAotICAgIDB4MjUzRSwgMHgyNTQwLCAweDI1NDEsIDB4MjU0MywgMHgyNTQ0LCAweDI1NDUsIDB4MjU0NiwgMHgyNTQ3LAotICAgIDB4MjU0OCwgMHgyNTQ5LCAweDI1NEEsIDB4MzM5NSwgMHgzMzk2LCAweDMzOTcsIDB4MjExMywgMHgzMzk4LAotICAgIDB4MzNDNCwgMHgzM0EzLCAweDMzQTQsIDB4MzNBNSwgMHgzM0E2LCAweDMzOTksIDB4MzM5QSwgMHgzMzlCLAotICAgIDB4MzM5QywgMHgzMzlELCAweDMzOUUsIDB4MzM5RiwgMHgzM0EwLCAweDMzQTEsIDB4MzNBMiwgMHgzM0NBLAotICAgIDB4MzM4RCwgMHgzMzhFLCAweDMzOEYsIDB4MzNDRiwgMHgzMzg4LCAweDMzODksIDB4MzNDOCwgMHgzM0E3LAotICAgIDB4MzNBOCwgMHgzM0IwLCAweDMzQjEsIDB4MzNCMiwgMHgzM0IzLCAweDMzQjQsIDB4MzNCNSwgMHgzM0I2LAotICAgIDB4MzNCNywgMHgzM0I4LCAweDMzQjksIDB4MzM4MCwgMHgzMzgxLCAweDMzODIsIDB4MzM4MywgMHgzMzg0LAotICAgIDB4MzNCQSwgMHgzM0JCLCAweDMzQkMsIDB4MzNCRCwgMHgzM0JFLCAweDMzQkYsIDB4MzM5MCwgMHgzMzkxLAotICAgIDB4MzM5MiwgMHgzMzkzLCAweDMzOTQsIDB4MjEyNiwgMHgzM0MwLCAweDMzQzEsIDB4MzM4QSwgMHgzMzhCLAotICAgIDB4MzM4QywgMHgzM0Q2LCAweDMzQzUsIDB4MzNBRCwgMHgzM0FFLCAweDMzQUYsIDB4MzNEQiwgMHgzM0E5LAotICAgIDB4MzNBQSwgMHgzM0FCLCAweDMzQUMsIDB4MzNERCwgMHgzM0QwLCAweDMzRDMsIDB4MzNDMywgMHgzM0M5LAotICAgIDB4MzNEQywgMHgzM0M2LCAweDAwQzYsIDB4MDBEMCwgMHgwMEFBLCAweDAxMjYsIDB4MDEzMiwgMHgwMTNGLAotICAgIDB4MDE0MSwgMHgwMEQ4LCAweDAxNTIsIDB4MDBCQSwgMHgwMERFLCAweDAxNjYsIDB4MDE0QSwgMHgzMjYwLAotICAgIDB4MzI2MSwgMHgzMjYyLCAweDMyNjMsIDB4MzI2NCwgMHgzMjY1LCAweDMyNjYsIDB4MzI2NywgMHgzMjY4LAotICAgIDB4MzI2OSwgMHgzMjZBLCAweDMyNkIsIDB4MzI2QywgMHgzMjZELCAweDMyNkUsIDB4MzI2RiwgMHgzMjcwLAotICAgIDB4MzI3MSwgMHgzMjcyLCAweDMyNzMsIDB4MzI3NCwgMHgzMjc1LCAweDMyNzYsIDB4MzI3NywgMHgzMjc4LAotICAgIDB4MzI3OSwgMHgzMjdBLCAweDMyN0IsIDB4MjREMCwgMHgyNEQxLCAweDI0RDIsIDB4MjREMywgMHgyNEQ0LAotICAgIDB4MjRENSwgMHgyNEQ2LCAweDI0RDcsIDB4MjREOCwgMHgyNEQ5LCAweDI0REEsIDB4MjREQiwgMHgyNERDLAotICAgIDB4MjRERCwgMHgyNERFLCAweDI0REYsIDB4MjRFMCwgMHgyNEUxLCAweDI0RTIsIDB4MjRFMywgMHgyNEU0LAotICAgIDB4MjRFNSwgMHgyNEU2LCAweDI0RTcsIDB4MjRFOCwgMHgyNEU5LCAweDI0NjAsIDB4MjQ2MSwgMHgyNDYyLAotICAgIDB4MjQ2MywgMHgyNDY0LCAweDI0NjUsIDB4MjQ2NiwgMHgyNDY3LCAweDI0NjgsIDB4MjQ2OSwgMHgyNDZBLAotICAgIDB4MjQ2QiwgMHgyNDZDLCAweDI0NkQsIDB4MjQ2RSwgMHgwMEJELCAweDIxNTMsIDB4MjE1NCwgMHgwMEJDLAotICAgIDB4MDBCRSwgMHgyMTVCLCAweDIxNUMsIDB4MjE1RCwgMHgyMTVFLCAweDAwRTYsIDB4MDExMSwgMHgwMEYwLAotICAgIDB4MDEyNywgMHgwMTMxLCAweDAxMzMsIDB4MDEzOCwgMHgwMTQwLCAweDAxNDIsIDB4MDBGOCwgMHgwMTUzLAotICAgIDB4MDBERiwgMHgwMEZFLCAweDAxNjcsIDB4MDE0QiwgMHgwMTQ5LCAweDMyMDAsIDB4MzIwMSwgMHgzMjAyLAotICAgIDB4MzIwMywgMHgzMjA0LCAweDMyMDUsIDB4MzIwNiwgMHgzMjA3LCAweDMyMDgsIDB4MzIwOSwgMHgzMjBBLAotICAgIDB4MzIwQiwgMHgzMjBDLCAweDMyMEQsIDB4MzIwRSwgMHgzMjBGLCAweDMyMTAsIDB4MzIxMSwgMHgzMjEyLAotICAgIDB4MzIxMywgMHgzMjE0LCAweDMyMTUsIDB4MzIxNiwgMHgzMjE3LCAweDMyMTgsIDB4MzIxOSwgMHgzMjFBLAotICAgIDB4MzIxQiwgMHgyNDlDLCAweDI0OUQsIDB4MjQ5RSwgMHgyNDlGLCAweDI0QTAsIDB4MjRBMSwgMHgyNEEyLAotICAgIDB4MjRBMywgMHgyNEE0LCAweDI0QTUsIDB4MjRBNiwgMHgyNEE3LCAweDI0QTgsIDB4MjRBOSwgMHgyNEFBLAotICAgIDB4MjRBQiwgMHgyNEFDLCAweDI0QUQsIDB4MjRBRSwgMHgyNEFGLCAweDI0QjAsIDB4MjRCMSwgMHgyNEIyLAotICAgIDB4MjRCMywgMHgyNEI0LCAweDI0QjUsIDB4MjQ3NCwgMHgyNDc1LCAweDI0NzYsIDB4MjQ3NywgMHgyNDc4LAotICAgIDB4MjQ3OSwgMHgyNDdBLCAweDI0N0IsIDB4MjQ3QywgMHgyNDdELCAweDI0N0UsIDB4MjQ3RiwgMHgyNDgwLAotICAgIDB4MjQ4MSwgMHgyNDgyLCAweDAwQjksIDB4MDBCMiwgMHgwMEIzLCAweDIwNzQsIDB4MjA3RiwgMHgyMDgxLAotICAgIDB4MjA4MiwgMHgyMDgzLCAweDIwODQsIDB4MzA0MSwgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwgMHgzMDQ1LAotICAgIDB4MzA0NiwgMHgzMDQ3LCAweDMwNDgsIDB4MzA0OSwgMHgzMDRBLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELAotICAgIDB4MzA0RSwgMHgzMDRGLCAweDMwNTAsIDB4MzA1MSwgMHgzMDUyLCAweDMwNTMsIDB4MzA1NCwgMHgzMDU1LAotICAgIDB4MzA1NiwgMHgzMDU3LCAweDMwNTgsIDB4MzA1OSwgMHgzMDVBLCAweDMwNUIsIDB4MzA1QywgMHgzMDVELAotICAgIDB4MzA1RSwgMHgzMDVGLCAweDMwNjAsIDB4MzA2MSwgMHgzMDYyLCAweDMwNjMsIDB4MzA2NCwgMHgzMDY1LAotICAgIDB4MzA2NiwgMHgzMDY3LCAweDMwNjgsIDB4MzA2OSwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywgMHgzMDZELAotICAgIDB4MzA2RSwgMHgzMDZGLCAweDMwNzAsIDB4MzA3MSwgMHgzMDcyLCAweDMwNzMsIDB4MzA3NCwgMHgzMDc1LAotICAgIDB4MzA3NiwgMHgzMDc3LCAweDMwNzgsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0IsIDB4MzA3QywgMHgzMDdELAotICAgIDB4MzA3RSwgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODMsIDB4MzA4NCwgMHgzMDg1LAotICAgIDB4MzA4NiwgMHgzMDg3LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLCAweDMwOEIsIDB4MzA4QywgMHgzMDhELAotICAgIDB4MzA4RSwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMSwgMHgzMEEyLAotICAgIDB4MzBBMywgMHgzMEE0LCAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LCAweDMwQTgsIDB4MzBBOSwgMHgzMEFBLAotICAgIDB4MzBBQiwgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsIDB4MzBCMSwgMHgzMEIyLAotICAgIDB4MzBCMywgMHgzMEI0LCAweDMwQjUsIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwgMHgzMEJBLAotICAgIDB4MzBCQiwgMHgzMEJDLCAweDMwQkQsIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLAotICAgIDB4MzBDMywgMHgzMEM0LCAweDMwQzUsIDB4MzBDNiwgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwgMHgzMENBLAotICAgIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDAsIDB4MzBEMSwgMHgzMEQyLAotICAgIDB4MzBEMywgMHgzMEQ0LCAweDMwRDUsIDB4MzBENiwgMHgzMEQ3LCAweDMwRDgsIDB4MzBEOSwgMHgzMERBLAotICAgIDB4MzBEQiwgMHgzMERDLCAweDMwREQsIDB4MzBERSwgMHgzMERGLCAweDMwRTAsIDB4MzBFMSwgMHgzMEUyLAotICAgIDB4MzBFMywgMHgzMEU0LCAweDMwRTUsIDB4MzBFNiwgMHgzMEU3LCAweDMwRTgsIDB4MzBFOSwgMHgzMEVBLAotICAgIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRSwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLAotICAgIDB4MzBGMywgMHgzMEY0LCAweDMwRjUsIDB4MzBGNiwgMHgwNDEwLCAweDA0MTEsIDB4MDQxMiwgMHgwNDEzLAotICAgIDB4MDQxNCwgMHgwNDE1LCAweDA0MDEsIDB4MDQxNiwgMHgwNDE3LCAweDA0MTgsIDB4MDQxOSwgMHgwNDFBLAotICAgIDB4MDQxQiwgMHgwNDFDLCAweDA0MUQsIDB4MDQxRSwgMHgwNDFGLCAweDA0MjAsIDB4MDQyMSwgMHgwNDIyLAotICAgIDB4MDQyMywgMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LCAweDA0MjgsIDB4MDQyOSwgMHgwNDJBLAotICAgIDB4MDQyQiwgMHgwNDJDLCAweDA0MkQsIDB4MDQyRSwgMHgwNDJGLCAweDA0MzAsIDB4MDQzMSwgMHgwNDMyLAotICAgIDB4MDQzMywgMHgwNDM0LCAweDA0MzUsIDB4MDQ1MSwgMHgwNDM2LCAweDA0MzcsIDB4MDQzOCwgMHgwNDM5LAotICAgIDB4MDQzQSwgMHgwNDNCLCAweDA0M0MsIDB4MDQzRCwgMHgwNDNFLCAweDA0M0YsIDB4MDQ0MCwgMHgwNDQxLAotICAgIDB4MDQ0MiwgMHgwNDQzLCAweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsIDB4MDQ0OCwgMHgwNDQ5LAotICAgIDB4MDQ0QSwgMHgwNDRCLCAweDA0NEMsIDB4MDQ0RCwgMHgwNDRFLCAweDA0NEYsIDB4QUMwMCwgMHhBQzAxLAotICAgIDB4QUMwNCwgMHhBQzA3LCAweEFDMDgsIDB4QUMwOSwgMHhBQzBBLCAweEFDMTAsIDB4QUMxMSwgMHhBQzEyLAotICAgIDB4QUMxMywgMHhBQzE0LCAweEFDMTUsIDB4QUMxNiwgMHhBQzE3LCAweEFDMTksIDB4QUMxQSwgMHhBQzFCLAotICAgIDB4QUMxQywgMHhBQzFELCAweEFDMjAsIDB4QUMyNCwgMHhBQzJDLCAweEFDMkQsIDB4QUMyRiwgMHhBQzMwLAotICAgIDB4QUMzMSwgMHhBQzM4LCAweEFDMzksIDB4QUMzQywgMHhBQzQwLCAweEFDNEIsIDB4QUM0RCwgMHhBQzU0LAotICAgIDB4QUM1OCwgMHhBQzVDLCAweEFDNzAsIDB4QUM3MSwgMHhBQzc0LCAweEFDNzcsIDB4QUM3OCwgMHhBQzdBLAotICAgIDB4QUM4MCwgMHhBQzgxLCAweEFDODMsIDB4QUM4NCwgMHhBQzg1LCAweEFDODYsIDB4QUM4OSwgMHhBQzhBLAotICAgIDB4QUM4QiwgMHhBQzhDLCAweEFDOTAsIDB4QUM5NCwgMHhBQzlDLCAweEFDOUQsIDB4QUM5RiwgMHhBQ0EwLAotICAgIDB4QUNBMSwgMHhBQ0E4LCAweEFDQTksIDB4QUNBQSwgMHhBQ0FDLCAweEFDQUYsIDB4QUNCMCwgMHhBQ0I4LAotICAgIDB4QUNCOSwgMHhBQ0JCLCAweEFDQkMsIDB4QUNCRCwgMHhBQ0MxLCAweEFDQzQsIDB4QUNDOCwgMHhBQ0NDLAotICAgIDB4QUNENSwgMHhBQ0Q3LCAweEFDRTAsIDB4QUNFMSwgMHhBQ0U0LCAweEFDRTcsIDB4QUNFOCwgMHhBQ0VBLAotICAgIDB4QUNFQywgMHhBQ0VGLCAweEFDRjAsIDB4QUNGMSwgMHhBQ0YzLCAweEFDRjUsIDB4QUNGNiwgMHhBQ0ZDLAotICAgIDB4QUNGRCwgMHhBRDAwLCAweEFEMDQsIDB4QUQwNiwgMHhBRDBDLCAweEFEMEQsIDB4QUQwRiwgMHhBRDExLAotICAgIDB4QUQxOCwgMHhBRDFDLCAweEFEMjAsIDB4QUQyOSwgMHhBRDJDLCAweEFEMkQsIDB4QUQzNCwgMHhBRDM1LAotICAgIDB4QUQzOCwgMHhBRDNDLCAweEFENDQsIDB4QUQ0NSwgMHhBRDQ3LCAweEFENDksIDB4QUQ1MCwgMHhBRDU0LAotICAgIDB4QUQ1OCwgMHhBRDYxLCAweEFENjMsIDB4QUQ2QywgMHhBRDZELCAweEFENzAsIDB4QUQ3MywgMHhBRDc0LAotICAgIDB4QUQ3NSwgMHhBRDc2LCAweEFEN0IsIDB4QUQ3QywgMHhBRDdELCAweEFEN0YsIDB4QUQ4MSwgMHhBRDgyLAotICAgIDB4QUQ4OCwgMHhBRDg5LCAweEFEOEMsIDB4QUQ5MCwgMHhBRDlDLCAweEFEOUQsIDB4QURBNCwgMHhBREI3LAotICAgIDB4QURDMCwgMHhBREMxLCAweEFEQzQsIDB4QURDOCwgMHhBREQwLCAweEFERDEsIDB4QUREMywgMHhBRERDLAotICAgIDB4QURFMCwgMHhBREU0LCAweEFERjgsIDB4QURGOSwgMHhBREZDLCAweEFERkYsIDB4QUUwMCwgMHhBRTAxLAotICAgIDB4QUUwOCwgMHhBRTA5LCAweEFFMEIsIDB4QUUwRCwgMHhBRTE0LCAweEFFMzAsIDB4QUUzMSwgMHhBRTM0LAotICAgIDB4QUUzNywgMHhBRTM4LCAweEFFM0EsIDB4QUU0MCwgMHhBRTQxLCAweEFFNDMsIDB4QUU0NSwgMHhBRTQ2LAotICAgIDB4QUU0QSwgMHhBRTRDLCAweEFFNEQsIDB4QUU0RSwgMHhBRTUwLCAweEFFNTQsIDB4QUU1NiwgMHhBRTVDLAotICAgIDB4QUU1RCwgMHhBRTVGLCAweEFFNjAsIDB4QUU2MSwgMHhBRTY1LCAweEFFNjgsIDB4QUU2OSwgMHhBRTZDLAotICAgIDB4QUU3MCwgMHhBRTc4LCAweEFFNzksIDB4QUU3QiwgMHhBRTdDLCAweEFFN0QsIDB4QUU4NCwgMHhBRTg1LAotICAgIDB4QUU4QywgMHhBRUJDLCAweEFFQkQsIDB4QUVCRSwgMHhBRUMwLCAweEFFQzQsIDB4QUVDQywgMHhBRUNELAotICAgIDB4QUVDRiwgMHhBRUQwLCAweEFFRDEsIDB4QUVEOCwgMHhBRUQ5LCAweEFFREMsIDB4QUVFOCwgMHhBRUVCLAotICAgIDB4QUVFRCwgMHhBRUY0LCAweEFFRjgsIDB4QUVGQywgMHhBRjA3LCAweEFGMDgsIDB4QUYwRCwgMHhBRjEwLAotICAgIDB4QUYyQywgMHhBRjJELCAweEFGMzAsIDB4QUYzMiwgMHhBRjM0LCAweEFGM0MsIDB4QUYzRCwgMHhBRjNGLAotICAgIDB4QUY0MSwgMHhBRjQyLCAweEFGNDMsIDB4QUY0OCwgMHhBRjQ5LCAweEFGNTAsIDB4QUY1QywgMHhBRjVELAotICAgIDB4QUY2NCwgMHhBRjY1LCAweEFGNzksIDB4QUY4MCwgMHhBRjg0LCAweEFGODgsIDB4QUY5MCwgMHhBRjkxLAotICAgIDB4QUY5NSwgMHhBRjlDLCAweEFGQjgsIDB4QUZCOSwgMHhBRkJDLCAweEFGQzAsIDB4QUZDNywgMHhBRkM4LAotICAgIDB4QUZDOSwgMHhBRkNCLCAweEFGQ0QsIDB4QUZDRSwgMHhBRkQ0LCAweEFGREMsIDB4QUZFOCwgMHhBRkU5LAotICAgIDB4QUZGMCwgMHhBRkYxLCAweEFGRjQsIDB4QUZGOCwgMHhCMDAwLCAweEIwMDEsIDB4QjAwNCwgMHhCMDBDLAotICAgIDB4QjAxMCwgMHhCMDE0LCAweEIwMUMsIDB4QjAxRCwgMHhCMDI4LCAweEIwNDQsIDB4QjA0NSwgMHhCMDQ4LAotICAgIDB4QjA0QSwgMHhCMDRDLCAweEIwNEUsIDB4QjA1MywgMHhCMDU0LCAweEIwNTUsIDB4QjA1NywgMHhCMDU5LAotICAgIDB4QjA1RCwgMHhCMDdDLCAweEIwN0QsIDB4QjA4MCwgMHhCMDg0LCAweEIwOEMsIDB4QjA4RCwgMHhCMDhGLAotICAgIDB4QjA5MSwgMHhCMDk4LCAweEIwOTksIDB4QjA5QSwgMHhCMDlDLCAweEIwOUYsIDB4QjBBMCwgMHhCMEExLAotICAgIDB4QjBBMiwgMHhCMEE4LCAweEIwQTksIDB4QjBBQiwgMHhCMEFDLCAweEIwQUQsIDB4QjBBRSwgMHhCMEFGLAotICAgIDB4QjBCMSwgMHhCMEIzLCAweEIwQjQsIDB4QjBCNSwgMHhCMEI4LCAweEIwQkMsIDB4QjBDNCwgMHhCMEM1LAotICAgIDB4QjBDNywgMHhCMEM4LCAweEIwQzksIDB4QjBEMCwgMHhCMEQxLCAweEIwRDQsIDB4QjBEOCwgMHhCMEUwLAotICAgIDB4QjBFNSwgMHhCMTA4LCAweEIxMDksIDB4QjEwQiwgMHhCMTBDLCAweEIxMTAsIDB4QjExMiwgMHhCMTEzLAotICAgIDB4QjExOCwgMHhCMTE5LCAweEIxMUIsIDB4QjExQywgMHhCMTFELCAweEIxMjMsIDB4QjEyNCwgMHhCMTI1LAotICAgIDB4QjEyOCwgMHhCMTJDLCAweEIxMzQsIDB4QjEzNSwgMHhCMTM3LCAweEIxMzgsIDB4QjEzOSwgMHhCMTQwLAotICAgIDB4QjE0MSwgMHhCMTQ0LCAweEIxNDgsIDB4QjE1MCwgMHhCMTUxLCAweEIxNTQsIDB4QjE1NSwgMHhCMTU4LAotICAgIDB4QjE1QywgMHhCMTYwLCAweEIxNzgsIDB4QjE3OSwgMHhCMTdDLCAweEIxODAsIDB4QjE4MiwgMHhCMTg4LAotICAgIDB4QjE4OSwgMHhCMThCLCAweEIxOEQsIDB4QjE5MiwgMHhCMTkzLCAweEIxOTQsIDB4QjE5OCwgMHhCMTlDLAotICAgIDB4QjFBOCwgMHhCMUNDLCAweEIxRDAsIDB4QjFENCwgMHhCMURDLCAweEIxREQsIDB4QjFERiwgMHhCMUU4LAotICAgIDB4QjFFOSwgMHhCMUVDLCAweEIxRjAsIDB4QjFGOSwgMHhCMUZCLCAweEIxRkQsIDB4QjIwNCwgMHhCMjA1LAotICAgIDB4QjIwOCwgMHhCMjBCLCAweEIyMEMsIDB4QjIxNCwgMHhCMjE1LCAweEIyMTcsIDB4QjIxOSwgMHhCMjIwLAotICAgIDB4QjIzNCwgMHhCMjNDLCAweEIyNTgsIDB4QjI1QywgMHhCMjYwLCAweEIyNjgsIDB4QjI2OSwgMHhCMjc0LAotICAgIDB4QjI3NSwgMHhCMjdDLCAweEIyODQsIDB4QjI4NSwgMHhCMjg5LCAweEIyOTAsIDB4QjI5MSwgMHhCMjk0LAotICAgIDB4QjI5OCwgMHhCMjk5LCAweEIyOUEsIDB4QjJBMCwgMHhCMkExLCAweEIyQTMsIDB4QjJBNSwgMHhCMkE2LAotICAgIDB4QjJBQSwgMHhCMkFDLCAweEIyQjAsIDB4QjJCNCwgMHhCMkM4LCAweEIyQzksIDB4QjJDQywgMHhCMkQwLAotICAgIDB4QjJEMiwgMHhCMkQ4LCAweEIyRDksIDB4QjJEQiwgMHhCMkRELCAweEIyRTIsIDB4QjJFNCwgMHhCMkU1LAotICAgIDB4QjJFNiwgMHhCMkU4LCAweEIyRUIsIDB4QjJFQywgMHhCMkVELCAweEIyRUUsIDB4QjJFRiwgMHhCMkYzLAotICAgIDB4QjJGNCwgMHhCMkY1LCAweEIyRjcsIDB4QjJGOCwgMHhCMkY5LCAweEIyRkEsIDB4QjJGQiwgMHhCMkZGLAotICAgIDB4QjMwMCwgMHhCMzAxLCAweEIzMDQsIDB4QjMwOCwgMHhCMzEwLCAweEIzMTEsIDB4QjMxMywgMHhCMzE0LAotICAgIDB4QjMxNSwgMHhCMzFDLCAweEIzNTQsIDB4QjM1NSwgMHhCMzU2LCAweEIzNTgsIDB4QjM1QiwgMHhCMzVDLAotICAgIDB4QjM1RSwgMHhCMzVGLCAweEIzNjQsIDB4QjM2NSwgMHhCMzY3LCAweEIzNjksIDB4QjM2QiwgMHhCMzZFLAotICAgIDB4QjM3MCwgMHhCMzcxLCAweEIzNzQsIDB4QjM3OCwgMHhCMzgwLCAweEIzODEsIDB4QjM4MywgMHhCMzg0LAotICAgIDB4QjM4NSwgMHhCMzhDLCAweEIzOTAsIDB4QjM5NCwgMHhCM0EwLCAweEIzQTEsIDB4QjNBOCwgMHhCM0FDLAotICAgIDB4QjNDNCwgMHhCM0M1LCAweEIzQzgsIDB4QjNDQiwgMHhCM0NDLCAweEIzQ0UsIDB4QjNEMCwgMHhCM0Q0LAotICAgIDB4QjNENSwgMHhCM0Q3LCAweEIzRDksIDB4QjNEQiwgMHhCM0RELCAweEIzRTAsIDB4QjNFNCwgMHhCM0U4LAotICAgIDB4QjNGQywgMHhCNDEwLCAweEI0MTgsIDB4QjQxQywgMHhCNDIwLCAweEI0MjgsIDB4QjQyOSwgMHhCNDJCLAotICAgIDB4QjQzNCwgMHhCNDUwLCAweEI0NTEsIDB4QjQ1NCwgMHhCNDU4LCAweEI0NjAsIDB4QjQ2MSwgMHhCNDYzLAotICAgIDB4QjQ2NSwgMHhCNDZDLCAweEI0ODAsIDB4QjQ4OCwgMHhCNDlELCAweEI0QTQsIDB4QjRBOCwgMHhCNEFDLAotICAgIDB4QjRCNSwgMHhCNEI3LCAweEI0QjksIDB4QjRDMCwgMHhCNEM0LCAweEI0QzgsIDB4QjREMCwgMHhCNEQ1LAotICAgIDB4QjREQywgMHhCNERELCAweEI0RTAsIDB4QjRFMywgMHhCNEU0LCAweEI0RTYsIDB4QjRFQywgMHhCNEVELAotICAgIDB4QjRFRiwgMHhCNEYxLCAweEI0RjgsIDB4QjUxNCwgMHhCNTE1LCAweEI1MTgsIDB4QjUxQiwgMHhCNTFDLAotICAgIDB4QjUyNCwgMHhCNTI1LCAweEI1MjcsIDB4QjUyOCwgMHhCNTI5LCAweEI1MkEsIDB4QjUzMCwgMHhCNTMxLAotICAgIDB4QjUzNCwgMHhCNTM4LCAweEI1NDAsIDB4QjU0MSwgMHhCNTQzLCAweEI1NDQsIDB4QjU0NSwgMHhCNTRCLAotICAgIDB4QjU0QywgMHhCNTRELCAweEI1NTAsIDB4QjU1NCwgMHhCNTVDLCAweEI1NUQsIDB4QjU1RiwgMHhCNTYwLAotICAgIDB4QjU2MSwgMHhCNUEwLCAweEI1QTEsIDB4QjVBNCwgMHhCNUE4LCAweEI1QUEsIDB4QjVBQiwgMHhCNUIwLAotICAgIDB4QjVCMSwgMHhCNUIzLCAweEI1QjQsIDB4QjVCNSwgMHhCNUJCLCAweEI1QkMsIDB4QjVCRCwgMHhCNUMwLAotICAgIDB4QjVDNCwgMHhCNUNDLCAweEI1Q0QsIDB4QjVDRiwgMHhCNUQwLCAweEI1RDEsIDB4QjVEOCwgMHhCNUVDLAotICAgIDB4QjYxMCwgMHhCNjExLCAweEI2MTQsIDB4QjYxOCwgMHhCNjI1LCAweEI2MkMsIDB4QjYzNCwgMHhCNjQ4LAotICAgIDB4QjY2NCwgMHhCNjY4LCAweEI2OUMsIDB4QjY5RCwgMHhCNkEwLCAweEI2QTQsIDB4QjZBQiwgMHhCNkFDLAotICAgIDB4QjZCMSwgMHhCNkQ0LCAweEI2RjAsIDB4QjZGNCwgMHhCNkY4LCAweEI3MDAsIDB4QjcwMSwgMHhCNzA1LAotICAgIDB4QjcyOCwgMHhCNzI5LCAweEI3MkMsIDB4QjcyRiwgMHhCNzMwLCAweEI3MzgsIDB4QjczOSwgMHhCNzNCLAotICAgIDB4Qjc0NCwgMHhCNzQ4LCAweEI3NEMsIDB4Qjc1NCwgMHhCNzU1LCAweEI3NjAsIDB4Qjc2NCwgMHhCNzY4LAotICAgIDB4Qjc3MCwgMHhCNzcxLCAweEI3NzMsIDB4Qjc3NSwgMHhCNzdDLCAweEI3N0QsIDB4Qjc4MCwgMHhCNzg0LAotICAgIDB4Qjc4QywgMHhCNzhELCAweEI3OEYsIDB4Qjc5MCwgMHhCNzkxLCAweEI3OTIsIDB4Qjc5NiwgMHhCNzk3LAotICAgIDB4Qjc5OCwgMHhCNzk5LCAweEI3OUMsIDB4QjdBMCwgMHhCN0E4LCAweEI3QTksIDB4QjdBQiwgMHhCN0FDLAotICAgIDB4QjdBRCwgMHhCN0I0LCAweEI3QjUsIDB4QjdCOCwgMHhCN0M3LCAweEI3QzksIDB4QjdFQywgMHhCN0VELAotICAgIDB4QjdGMCwgMHhCN0Y0LCAweEI3RkMsIDB4QjdGRCwgMHhCN0ZGLCAweEI4MDAsIDB4QjgwMSwgMHhCODA3LAotICAgIDB4QjgwOCwgMHhCODA5LCAweEI4MEMsIDB4QjgxMCwgMHhCODE4LCAweEI4MTksIDB4QjgxQiwgMHhCODFELAotICAgIDB4QjgyNCwgMHhCODI1LCAweEI4MjgsIDB4QjgyQywgMHhCODM0LCAweEI4MzUsIDB4QjgzNywgMHhCODM4LAotICAgIDB4QjgzOSwgMHhCODQwLCAweEI4NDQsIDB4Qjg1MSwgMHhCODUzLCAweEI4NUMsIDB4Qjg1RCwgMHhCODYwLAotICAgIDB4Qjg2NCwgMHhCODZDLCAweEI4NkQsIDB4Qjg2RiwgMHhCODcxLCAweEI4NzgsIDB4Qjg3QywgMHhCODhELAotICAgIDB4QjhBOCwgMHhCOEIwLCAweEI4QjQsIDB4QjhCOCwgMHhCOEMwLCAweEI4QzEsIDB4QjhDMywgMHhCOEM1LAotICAgIDB4QjhDQywgMHhCOEQwLCAweEI4RDQsIDB4QjhERCwgMHhCOERGLCAweEI4RTEsIDB4QjhFOCwgMHhCOEU5LAotICAgIDB4QjhFQywgMHhCOEYwLCAweEI4RjgsIDB4QjhGOSwgMHhCOEZCLCAweEI4RkQsIDB4QjkwNCwgMHhCOTE4LAotICAgIDB4QjkyMCwgMHhCOTNDLCAweEI5M0QsIDB4Qjk0MCwgMHhCOTQ0LCAweEI5NEMsIDB4Qjk0RiwgMHhCOTUxLAotICAgIDB4Qjk1OCwgMHhCOTU5LCAweEI5NUMsIDB4Qjk2MCwgMHhCOTY4LCAweEI5NjksIDB4Qjk2QiwgMHhCOTZELAotICAgIDB4Qjk3NCwgMHhCOTc1LCAweEI5NzgsIDB4Qjk3QywgMHhCOTg0LCAweEI5ODUsIDB4Qjk4NywgMHhCOTg5LAotICAgIDB4Qjk4QSwgMHhCOThELCAweEI5OEUsIDB4QjlBQywgMHhCOUFELCAweEI5QjAsIDB4QjlCNCwgMHhCOUJDLAotICAgIDB4QjlCRCwgMHhCOUJGLCAweEI5QzEsIDB4QjlDOCwgMHhCOUM5LCAweEI5Q0MsIDB4QjlDRSwgMHhCOUNGLAotICAgIDB4QjlEMCwgMHhCOUQxLCAweEI5RDIsIDB4QjlEOCwgMHhCOUQ5LCAweEI5REIsIDB4QjlERCwgMHhCOURFLAotICAgIDB4QjlFMSwgMHhCOUUzLCAweEI5RTQsIDB4QjlFNSwgMHhCOUU4LCAweEI5RUMsIDB4QjlGNCwgMHhCOUY1LAotICAgIDB4QjlGNywgMHhCOUY4LCAweEI5RjksIDB4QjlGQSwgMHhCQTAwLCAweEJBMDEsIDB4QkEwOCwgMHhCQTE1LAotICAgIDB4QkEzOCwgMHhCQTM5LCAweEJBM0MsIDB4QkE0MCwgMHhCQTQyLCAweEJBNDgsIDB4QkE0OSwgMHhCQTRCLAotICAgIDB4QkE0RCwgMHhCQTRFLCAweEJBNTMsIDB4QkE1NCwgMHhCQTU1LCAweEJBNTgsIDB4QkE1QywgMHhCQTY0LAotICAgIDB4QkE2NSwgMHhCQTY3LCAweEJBNjgsIDB4QkE2OSwgMHhCQTcwLCAweEJBNzEsIDB4QkE3NCwgMHhCQTc4LAotICAgIDB4QkE4MywgMHhCQTg0LCAweEJBODUsIDB4QkE4NywgMHhCQThDLCAweEJBQTgsIDB4QkFBOSwgMHhCQUFCLAotICAgIDB4QkFBQywgMHhCQUIwLCAweEJBQjIsIDB4QkFCOCwgMHhCQUI5LCAweEJBQkIsIDB4QkFCRCwgMHhCQUM0LAotICAgIDB4QkFDOCwgMHhCQUQ4LCAweEJBRDksIDB4QkFGQywgMHhCQjAwLCAweEJCMDQsIDB4QkIwRCwgMHhCQjBGLAotICAgIDB4QkIxMSwgMHhCQjE4LCAweEJCMUMsIDB4QkIyMCwgMHhCQjI5LCAweEJCMkIsIDB4QkIzNCwgMHhCQjM1LAotICAgIDB4QkIzNiwgMHhCQjM4LCAweEJCM0IsIDB4QkIzQywgMHhCQjNELCAweEJCM0UsIDB4QkI0NCwgMHhCQjQ1LAotICAgIDB4QkI0NywgMHhCQjQ5LCAweEJCNEQsIDB4QkI0RiwgMHhCQjUwLCAweEJCNTQsIDB4QkI1OCwgMHhCQjYxLAotICAgIDB4QkI2MywgMHhCQjZDLCAweEJCODgsIDB4QkI4QywgMHhCQjkwLCAweEJCQTQsIDB4QkJBOCwgMHhCQkFDLAotICAgIDB4QkJCNCwgMHhCQkI3LCAweEJCQzAsIDB4QkJDNCwgMHhCQkM4LCAweEJCRDAsIDB4QkJEMywgMHhCQkY4LAotICAgIDB4QkJGOSwgMHhCQkZDLCAweEJCRkYsIDB4QkMwMCwgMHhCQzAyLCAweEJDMDgsIDB4QkMwOSwgMHhCQzBCLAotICAgIDB4QkMwQywgMHhCQzBELCAweEJDMEYsIDB4QkMxMSwgMHhCQzE0LCAweEJDMTUsIDB4QkMxNiwgMHhCQzE3LAotICAgIDB4QkMxOCwgMHhCQzFCLCAweEJDMUMsIDB4QkMxRCwgMHhCQzFFLCAweEJDMUYsIDB4QkMyNCwgMHhCQzI1LAotICAgIDB4QkMyNywgMHhCQzI5LCAweEJDMkQsIDB4QkMzMCwgMHhCQzMxLCAweEJDMzQsIDB4QkMzOCwgMHhCQzQwLAotICAgIDB4QkM0MSwgMHhCQzQzLCAweEJDNDQsIDB4QkM0NSwgMHhCQzQ5LCAweEJDNEMsIDB4QkM0RCwgMHhCQzUwLAotICAgIDB4QkM1RCwgMHhCQzg0LCAweEJDODUsIDB4QkM4OCwgMHhCQzhCLCAweEJDOEMsIDB4QkM4RSwgMHhCQzk0LAotICAgIDB4QkM5NSwgMHhCQzk3LCAweEJDOTksIDB4QkM5QSwgMHhCQ0EwLCAweEJDQTEsIDB4QkNBNCwgMHhCQ0E3LAotICAgIDB4QkNBOCwgMHhCQ0IwLCAweEJDQjEsIDB4QkNCMywgMHhCQ0I0LCAweEJDQjUsIDB4QkNCQywgMHhCQ0JELAotICAgIDB4QkNDMCwgMHhCQ0M0LCAweEJDQ0QsIDB4QkNDRiwgMHhCQ0QwLCAweEJDRDEsIDB4QkNENSwgMHhCQ0Q4LAotICAgIDB4QkNEQywgMHhCQ0Y0LCAweEJDRjUsIDB4QkNGNiwgMHhCQ0Y4LCAweEJDRkMsIDB4QkQwNCwgMHhCRDA1LAotICAgIDB4QkQwNywgMHhCRDA5LCAweEJEMTAsIDB4QkQxNCwgMHhCRDI0LCAweEJEMkMsIDB4QkQ0MCwgMHhCRDQ4LAotICAgIDB4QkQ0OSwgMHhCRDRDLCAweEJENTAsIDB4QkQ1OCwgMHhCRDU5LCAweEJENjQsIDB4QkQ2OCwgMHhCRDgwLAotICAgIDB4QkQ4MSwgMHhCRDg0LCAweEJEODcsIDB4QkQ4OCwgMHhCRDg5LCAweEJEOEEsIDB4QkQ5MCwgMHhCRDkxLAotICAgIDB4QkQ5MywgMHhCRDk1LCAweEJEOTksIDB4QkQ5QSwgMHhCRDlDLCAweEJEQTQsIDB4QkRCMCwgMHhCREI4LAotICAgIDB4QkRENCwgMHhCREQ1LCAweEJERDgsIDB4QkREQywgMHhCREU5LCAweEJERjAsIDB4QkRGNCwgMHhCREY4LAotICAgIDB4QkUwMCwgMHhCRTAzLCAweEJFMDUsIDB4QkUwQywgMHhCRTBELCAweEJFMTAsIDB4QkUxNCwgMHhCRTFDLAotICAgIDB4QkUxRCwgMHhCRTFGLCAweEJFNDQsIDB4QkU0NSwgMHhCRTQ4LCAweEJFNEMsIDB4QkU0RSwgMHhCRTU0LAotICAgIDB4QkU1NSwgMHhCRTU3LCAweEJFNTksIDB4QkU1QSwgMHhCRTVCLCAweEJFNjAsIDB4QkU2MSwgMHhCRTY0LAotICAgIDB4QkU2OCwgMHhCRTZBLCAweEJFNzAsIDB4QkU3MSwgMHhCRTczLCAweEJFNzQsIDB4QkU3NSwgMHhCRTdCLAotICAgIDB4QkU3QywgMHhCRTdELCAweEJFODAsIDB4QkU4NCwgMHhCRThDLCAweEJFOEQsIDB4QkU4RiwgMHhCRTkwLAotICAgIDB4QkU5MSwgMHhCRTk4LCAweEJFOTksIDB4QkVBOCwgMHhCRUQwLCAweEJFRDEsIDB4QkVENCwgMHhCRUQ3LAotICAgIDB4QkVEOCwgMHhCRUUwLCAweEJFRTMsIDB4QkVFNCwgMHhCRUU1LCAweEJFRUMsIDB4QkYwMSwgMHhCRjA4LAotICAgIDB4QkYwOSwgMHhCRjE4LCAweEJGMTksIDB4QkYxQiwgMHhCRjFDLCAweEJGMUQsIDB4QkY0MCwgMHhCRjQxLAotICAgIDB4QkY0NCwgMHhCRjQ4LCAweEJGNTAsIDB4QkY1MSwgMHhCRjU1LCAweEJGOTQsIDB4QkZCMCwgMHhCRkM1LAotICAgIDB4QkZDQywgMHhCRkNELCAweEJGRDAsIDB4QkZENCwgMHhCRkRDLCAweEJGREYsIDB4QkZFMSwgMHhDMDNDLAotICAgIDB4QzA1MSwgMHhDMDU4LCAweEMwNUMsIDB4QzA2MCwgMHhDMDY4LCAweEMwNjksIDB4QzA5MCwgMHhDMDkxLAotICAgIDB4QzA5NCwgMHhDMDk4LCAweEMwQTAsIDB4QzBBMSwgMHhDMEEzLCAweEMwQTUsIDB4QzBBQywgMHhDMEFELAotICAgIDB4QzBBRiwgMHhDMEIwLCAweEMwQjMsIDB4QzBCNCwgMHhDMEI1LCAweEMwQjYsIDB4QzBCQywgMHhDMEJELAotICAgIDB4QzBCRiwgMHhDMEMwLCAweEMwQzEsIDB4QzBDNSwgMHhDMEM4LCAweEMwQzksIDB4QzBDQywgMHhDMEQwLAotICAgIDB4QzBEOCwgMHhDMEQ5LCAweEMwREIsIDB4QzBEQywgMHhDMERELCAweEMwRTQsIDB4QzBFNSwgMHhDMEU4LAotICAgIDB4QzBFQywgMHhDMEY0LCAweEMwRjUsIDB4QzBGNywgMHhDMEY5LCAweEMxMDAsIDB4QzEwNCwgMHhDMTA4LAotICAgIDB4QzExMCwgMHhDMTE1LCAweEMxMUMsIDB4QzExRCwgMHhDMTFFLCAweEMxMUYsIDB4QzEyMCwgMHhDMTIzLAotICAgIDB4QzEyNCwgMHhDMTI2LCAweEMxMjcsIDB4QzEyQywgMHhDMTJELCAweEMxMkYsIDB4QzEzMCwgMHhDMTMxLAotICAgIDB4QzEzNiwgMHhDMTM4LCAweEMxMzksIDB4QzEzQywgMHhDMTQwLCAweEMxNDgsIDB4QzE0OSwgMHhDMTRCLAotICAgIDB4QzE0QywgMHhDMTRELCAweEMxNTQsIDB4QzE1NSwgMHhDMTU4LCAweEMxNUMsIDB4QzE2NCwgMHhDMTY1LAotICAgIDB4QzE2NywgMHhDMTY4LCAweEMxNjksIDB4QzE3MCwgMHhDMTc0LCAweEMxNzgsIDB4QzE4NSwgMHhDMThDLAotICAgIDB4QzE4RCwgMHhDMThFLCAweEMxOTAsIDB4QzE5NCwgMHhDMTk2LCAweEMxOUMsIDB4QzE5RCwgMHhDMTlGLAotICAgIDB4QzFBMSwgMHhDMUE1LCAweEMxQTgsIDB4QzFBOSwgMHhDMUFDLCAweEMxQjAsIDB4QzFCRCwgMHhDMUM0LAotICAgIDB4QzFDOCwgMHhDMUNDLCAweEMxRDQsIDB4QzFENywgMHhDMUQ4LCAweEMxRTAsIDB4QzFFNCwgMHhDMUU4LAotICAgIDB4QzFGMCwgMHhDMUYxLCAweEMxRjMsIDB4QzFGQywgMHhDMUZELCAweEMyMDAsIDB4QzIwNCwgMHhDMjBDLAotICAgIDB4QzIwRCwgMHhDMjBGLCAweEMyMTEsIDB4QzIxOCwgMHhDMjE5LCAweEMyMUMsIDB4QzIxRiwgMHhDMjIwLAotICAgIDB4QzIyOCwgMHhDMjI5LCAweEMyMkIsIDB4QzIyRCwgMHhDMjJGLCAweEMyMzEsIDB4QzIzMiwgMHhDMjM0LAotICAgIDB4QzI0OCwgMHhDMjUwLCAweEMyNTEsIDB4QzI1NCwgMHhDMjU4LCAweEMyNjAsIDB4QzI2NSwgMHhDMjZDLAotICAgIDB4QzI2RCwgMHhDMjcwLCAweEMyNzQsIDB4QzI3QywgMHhDMjdELCAweEMyN0YsIDB4QzI4MSwgMHhDMjg4LAotICAgIDB4QzI4OSwgMHhDMjkwLCAweEMyOTgsIDB4QzI5QiwgMHhDMjlELCAweEMyQTQsIDB4QzJBNSwgMHhDMkE4LAotICAgIDB4QzJBQywgMHhDMkFELCAweEMyQjQsIDB4QzJCNSwgMHhDMkI3LCAweEMyQjksIDB4QzJEQywgMHhDMkRELAotICAgIDB4QzJFMCwgMHhDMkUzLCAweEMyRTQsIDB4QzJFQiwgMHhDMkVDLCAweEMyRUQsIDB4QzJFRiwgMHhDMkYxLAotICAgIDB4QzJGNiwgMHhDMkY4LCAweEMyRjksIDB4QzJGQiwgMHhDMkZDLCAweEMzMDAsIDB4QzMwOCwgMHhDMzA5LAotICAgIDB4QzMwQywgMHhDMzBELCAweEMzMTMsIDB4QzMxNCwgMHhDMzE1LCAweEMzMTgsIDB4QzMxQywgMHhDMzI0LAotICAgIDB4QzMyNSwgMHhDMzI4LCAweEMzMjksIDB4QzM0NSwgMHhDMzY4LCAweEMzNjksIDB4QzM2QywgMHhDMzcwLAotICAgIDB4QzM3MiwgMHhDMzc4LCAweEMzNzksIDB4QzM3QywgMHhDMzdELCAweEMzODQsIDB4QzM4OCwgMHhDMzhDLAotICAgIDB4QzNDMCwgMHhDM0Q4LCAweEMzRDksIDB4QzNEQywgMHhDM0RGLCAweEMzRTAsIDB4QzNFMiwgMHhDM0U4LAotICAgIDB4QzNFOSwgMHhDM0VELCAweEMzRjQsIDB4QzNGNSwgMHhDM0Y4LCAweEM0MDgsIDB4QzQxMCwgMHhDNDI0LAotICAgIDB4QzQyQywgMHhDNDMwLCAweEM0MzQsIDB4QzQzQywgMHhDNDNELCAweEM0NDgsIDB4QzQ2NCwgMHhDNDY1LAotICAgIDB4QzQ2OCwgMHhDNDZDLCAweEM0NzQsIDB4QzQ3NSwgMHhDNDc5LCAweEM0ODAsIDB4QzQ5NCwgMHhDNDlDLAotICAgIDB4QzRCOCwgMHhDNEJDLCAweEM0RTksIDB4QzRGMCwgMHhDNEYxLCAweEM0RjQsIDB4QzRGOCwgMHhDNEZBLAotICAgIDB4QzRGRiwgMHhDNTAwLCAweEM1MDEsIDB4QzUwQywgMHhDNTEwLCAweEM1MTQsIDB4QzUxQywgMHhDNTI4LAotICAgIDB4QzUyOSwgMHhDNTJDLCAweEM1MzAsIDB4QzUzOCwgMHhDNTM5LCAweEM1M0IsIDB4QzUzRCwgMHhDNTQ0LAotICAgIDB4QzU0NSwgMHhDNTQ4LCAweEM1NDksIDB4QzU0QSwgMHhDNTRDLCAweEM1NEQsIDB4QzU0RSwgMHhDNTUzLAotICAgIDB4QzU1NCwgMHhDNTU1LCAweEM1NTcsIDB4QzU1OCwgMHhDNTU5LCAweEM1NUQsIDB4QzU1RSwgMHhDNTYwLAotICAgIDB4QzU2MSwgMHhDNTY0LCAweEM1NjgsIDB4QzU3MCwgMHhDNTcxLCAweEM1NzMsIDB4QzU3NCwgMHhDNTc1LAotICAgIDB4QzU3QywgMHhDNTdELCAweEM1ODAsIDB4QzU4NCwgMHhDNTg3LCAweEM1OEMsIDB4QzU4RCwgMHhDNThGLAotICAgIDB4QzU5MSwgMHhDNTk1LCAweEM1OTcsIDB4QzU5OCwgMHhDNTlDLCAweEM1QTAsIDB4QzVBOSwgMHhDNUI0LAotICAgIDB4QzVCNSwgMHhDNUI4LCAweEM1QjksIDB4QzVCQiwgMHhDNUJDLCAweEM1QkQsIDB4QzVCRSwgMHhDNUM0LAotICAgIDB4QzVDNSwgMHhDNUM2LCAweEM1QzcsIDB4QzVDOCwgMHhDNUM5LCAweEM1Q0EsIDB4QzVDQywgMHhDNUNFLAotICAgIDB4QzVEMCwgMHhDNUQxLCAweEM1RDQsIDB4QzVEOCwgMHhDNUUwLCAweEM1RTEsIDB4QzVFMywgMHhDNUU1LAotICAgIDB4QzVFQywgMHhDNUVELCAweEM1RUUsIDB4QzVGMCwgMHhDNUY0LCAweEM1RjYsIDB4QzVGNywgMHhDNUZDLAotICAgIDB4QzVGRCwgMHhDNUZFLCAweEM1RkYsIDB4QzYwMCwgMHhDNjAxLCAweEM2MDUsIDB4QzYwNiwgMHhDNjA3LAotICAgIDB4QzYwOCwgMHhDNjBDLCAweEM2MTAsIDB4QzYxOCwgMHhDNjE5LCAweEM2MUIsIDB4QzYxQywgMHhDNjI0LAotICAgIDB4QzYyNSwgMHhDNjI4LCAweEM2MkMsIDB4QzYyRCwgMHhDNjJFLCAweEM2MzAsIDB4QzYzMywgMHhDNjM0LAotICAgIDB4QzYzNSwgMHhDNjM3LCAweEM2MzksIDB4QzYzQiwgMHhDNjQwLCAweEM2NDEsIDB4QzY0NCwgMHhDNjQ4LAotICAgIDB4QzY1MCwgMHhDNjUxLCAweEM2NTMsIDB4QzY1NCwgMHhDNjU1LCAweEM2NUMsIDB4QzY1RCwgMHhDNjYwLAotICAgIDB4QzY2QywgMHhDNjZGLCAweEM2NzEsIDB4QzY3OCwgMHhDNjc5LCAweEM2N0MsIDB4QzY4MCwgMHhDNjg4LAotICAgIDB4QzY4OSwgMHhDNjhCLCAweEM2OEQsIDB4QzY5NCwgMHhDNjk1LCAweEM2OTgsIDB4QzY5QywgMHhDNkE0LAotICAgIDB4QzZBNSwgMHhDNkE3LCAweEM2QTksIDB4QzZCMCwgMHhDNkIxLCAweEM2QjQsIDB4QzZCOCwgMHhDNkI5LAotICAgIDB4QzZCQSwgMHhDNkMwLCAweEM2QzEsIDB4QzZDMywgMHhDNkM1LCAweEM2Q0MsIDB4QzZDRCwgMHhDNkQwLAotICAgIDB4QzZENCwgMHhDNkRDLCAweEM2REQsIDB4QzZFMCwgMHhDNkUxLCAweEM2RTgsIDB4QzZFOSwgMHhDNkVDLAotICAgIDB4QzZGMCwgMHhDNkY4LCAweEM2RjksIDB4QzZGRCwgMHhDNzA0LCAweEM3MDUsIDB4QzcwOCwgMHhDNzBDLAotICAgIDB4QzcxNCwgMHhDNzE1LCAweEM3MTcsIDB4QzcxOSwgMHhDNzIwLCAweEM3MjEsIDB4QzcyNCwgMHhDNzI4LAotICAgIDB4QzczMCwgMHhDNzMxLCAweEM3MzMsIDB4QzczNSwgMHhDNzM3LCAweEM3M0MsIDB4QzczRCwgMHhDNzQwLAotICAgIDB4Qzc0NCwgMHhDNzRBLCAweEM3NEMsIDB4Qzc0RCwgMHhDNzRGLCAweEM3NTEsIDB4Qzc1MiwgMHhDNzUzLAotICAgIDB4Qzc1NCwgMHhDNzU1LCAweEM3NTYsIDB4Qzc1NywgMHhDNzU4LCAweEM3NUMsIDB4Qzc2MCwgMHhDNzY4LAotICAgIDB4Qzc2QiwgMHhDNzc0LCAweEM3NzUsIDB4Qzc3OCwgMHhDNzdDLCAweEM3N0QsIDB4Qzc3RSwgMHhDNzgzLAotICAgIDB4Qzc4NCwgMHhDNzg1LCAweEM3ODcsIDB4Qzc4OCwgMHhDNzg5LCAweEM3OEEsIDB4Qzc4RSwgMHhDNzkwLAotICAgIDB4Qzc5MSwgMHhDNzk0LCAweEM3OTYsIDB4Qzc5NywgMHhDNzk4LCAweEM3OUEsIDB4QzdBMCwgMHhDN0ExLAotICAgIDB4QzdBMywgMHhDN0E0LCAweEM3QTUsIDB4QzdBNiwgMHhDN0FDLCAweEM3QUQsIDB4QzdCMCwgMHhDN0I0LAotICAgIDB4QzdCQywgMHhDN0JELCAweEM3QkYsIDB4QzdDMCwgMHhDN0MxLCAweEM3QzgsIDB4QzdDOSwgMHhDN0NDLAotICAgIDB4QzdDRSwgMHhDN0QwLCAweEM3RDgsIDB4QzdERCwgMHhDN0U0LCAweEM3RTgsIDB4QzdFQywgMHhDODAwLAotICAgIDB4QzgwMSwgMHhDODA0LCAweEM4MDgsIDB4QzgwQSwgMHhDODEwLCAweEM4MTEsIDB4QzgxMywgMHhDODE1LAotICAgIDB4QzgxNiwgMHhDODFDLCAweEM4MUQsIDB4QzgyMCwgMHhDODI0LCAweEM4MkMsIDB4QzgyRCwgMHhDODJGLAotICAgIDB4QzgzMSwgMHhDODM4LCAweEM4M0MsIDB4Qzg0MCwgMHhDODQ4LCAweEM4NDksIDB4Qzg0QywgMHhDODRELAotICAgIDB4Qzg1NCwgMHhDODcwLCAweEM4NzEsIDB4Qzg3NCwgMHhDODc4LCAweEM4N0EsIDB4Qzg4MCwgMHhDODgxLAotICAgIDB4Qzg4MywgMHhDODg1LCAweEM4ODYsIDB4Qzg4NywgMHhDODhCLCAweEM4OEMsIDB4Qzg4RCwgMHhDODk0LAotICAgIDB4Qzg5RCwgMHhDODlGLCAweEM4QTEsIDB4QzhBOCwgMHhDOEJDLCAweEM4QkQsIDB4QzhDNCwgMHhDOEM4LAotICAgIDB4QzhDQywgMHhDOEQ0LCAweEM4RDUsIDB4QzhENywgMHhDOEQ5LCAweEM4RTAsIDB4QzhFMSwgMHhDOEU0LAotICAgIDB4QzhGNSwgMHhDOEZDLCAweEM4RkQsIDB4QzkwMCwgMHhDOTA0LCAweEM5MDUsIDB4QzkwNiwgMHhDOTBDLAotICAgIDB4QzkwRCwgMHhDOTBGLCAweEM5MTEsIDB4QzkxOCwgMHhDOTJDLCAweEM5MzQsIDB4Qzk1MCwgMHhDOTUxLAotICAgIDB4Qzk1NCwgMHhDOTU4LCAweEM5NjAsIDB4Qzk2MSwgMHhDOTYzLCAweEM5NkMsIDB4Qzk3MCwgMHhDOTc0LAotICAgIDB4Qzk3QywgMHhDOTg4LCAweEM5ODksIDB4Qzk4QywgMHhDOTkwLCAweEM5OTgsIDB4Qzk5OSwgMHhDOTlCLAotICAgIDB4Qzk5RCwgMHhDOUMwLCAweEM5QzEsIDB4QzlDNCwgMHhDOUM3LCAweEM5QzgsIDB4QzlDQSwgMHhDOUQwLAotICAgIDB4QzlEMSwgMHhDOUQzLCAweEM5RDUsIDB4QzlENiwgMHhDOUQ5LCAweEM5REEsIDB4QzlEQywgMHhDOURELAotICAgIDB4QzlFMCwgMHhDOUUyLCAweEM5RTQsIDB4QzlFNywgMHhDOUVDLCAweEM5RUQsIDB4QzlFRiwgMHhDOUYwLAotICAgIDB4QzlGMSwgMHhDOUY4LCAweEM5RjksIDB4QzlGQywgMHhDQTAwLCAweENBMDgsIDB4Q0EwOSwgMHhDQTBCLAotICAgIDB4Q0EwQywgMHhDQTBELCAweENBMTQsIDB4Q0ExOCwgMHhDQTI5LCAweENBNEMsIDB4Q0E0RCwgMHhDQTUwLAotICAgIDB4Q0E1NCwgMHhDQTVDLCAweENBNUQsIDB4Q0E1RiwgMHhDQTYwLCAweENBNjEsIDB4Q0E2OCwgMHhDQTdELAotICAgIDB4Q0E4NCwgMHhDQTk4LCAweENBQkMsIDB4Q0FCRCwgMHhDQUMwLCAweENBQzQsIDB4Q0FDQywgMHhDQUNELAotICAgIDB4Q0FDRiwgMHhDQUQxLCAweENBRDMsIDB4Q0FEOCwgMHhDQUQ5LCAweENBRTAsIDB4Q0FFQywgMHhDQUY0LAotICAgIDB4Q0IwOCwgMHhDQjEwLCAweENCMTQsIDB4Q0IxOCwgMHhDQjIwLCAweENCMjEsIDB4Q0I0MSwgMHhDQjQ4LAotICAgIDB4Q0I0OSwgMHhDQjRDLCAweENCNTAsIDB4Q0I1OCwgMHhDQjU5LCAweENCNUQsIDB4Q0I2NCwgMHhDQjc4LAotICAgIDB4Q0I3OSwgMHhDQjlDLCAweENCQjgsIDB4Q0JENCwgMHhDQkU0LCAweENCRTcsIDB4Q0JFOSwgMHhDQzBDLAotICAgIDB4Q0MwRCwgMHhDQzEwLCAweENDMTQsIDB4Q0MxQywgMHhDQzFELCAweENDMjEsIDB4Q0MyMiwgMHhDQzI3LAotICAgIDB4Q0MyOCwgMHhDQzI5LCAweENDMkMsIDB4Q0MyRSwgMHhDQzMwLCAweENDMzgsIDB4Q0MzOSwgMHhDQzNCLAotICAgIDB4Q0MzQywgMHhDQzNELCAweENDM0UsIDB4Q0M0NCwgMHhDQzQ1LCAweENDNDgsIDB4Q0M0QywgMHhDQzU0LAotICAgIDB4Q0M1NSwgMHhDQzU3LCAweENDNTgsIDB4Q0M1OSwgMHhDQzYwLCAweENDNjQsIDB4Q0M2NiwgMHhDQzY4LAotICAgIDB4Q0M3MCwgMHhDQzc1LCAweENDOTgsIDB4Q0M5OSwgMHhDQzlDLCAweENDQTAsIDB4Q0NBOCwgMHhDQ0E5LAotICAgIDB4Q0NBQiwgMHhDQ0FDLCAweENDQUQsIDB4Q0NCNCwgMHhDQ0I1LCAweENDQjgsIDB4Q0NCQywgMHhDQ0M0LAotICAgIDB4Q0NDNSwgMHhDQ0M3LCAweENDQzksIDB4Q0NEMCwgMHhDQ0Q0LCAweENDRTQsIDB4Q0NFQywgMHhDQ0YwLAotICAgIDB4Q0QwMSwgMHhDRDA4LCAweENEMDksIDB4Q0QwQywgMHhDRDEwLCAweENEMTgsIDB4Q0QxOSwgMHhDRDFCLAotICAgIDB4Q0QxRCwgMHhDRDI0LCAweENEMjgsIDB4Q0QyQywgMHhDRDM5LCAweENENUMsIDB4Q0Q2MCwgMHhDRDY0LAotICAgIDB4Q0Q2QywgMHhDRDZELCAweENENkYsIDB4Q0Q3MSwgMHhDRDc4LCAweENEODgsIDB4Q0Q5NCwgMHhDRDk1LAotICAgIDB4Q0Q5OCwgMHhDRDlDLCAweENEQTQsIDB4Q0RBNSwgMHhDREE3LCAweENEQTksIDB4Q0RCMCwgMHhDREM0LAotICAgIDB4Q0RDQywgMHhDREQwLCAweENERTgsIDB4Q0RFQywgMHhDREYwLCAweENERjgsIDB4Q0RGOSwgMHhDREZCLAotICAgIDB4Q0RGRCwgMHhDRTA0LCAweENFMDgsIDB4Q0UwQywgMHhDRTE0LCAweENFMTksIDB4Q0UyMCwgMHhDRTIxLAotICAgIDB4Q0UyNCwgMHhDRTI4LCAweENFMzAsIDB4Q0UzMSwgMHhDRTMzLCAweENFMzUsIDB4Q0U1OCwgMHhDRTU5LAotICAgIDB4Q0U1QywgMHhDRTVGLCAweENFNjAsIDB4Q0U2MSwgMHhDRTY4LCAweENFNjksIDB4Q0U2QiwgMHhDRTZELAotICAgIDB4Q0U3NCwgMHhDRTc1LCAweENFNzgsIDB4Q0U3QywgMHhDRTg0LCAweENFODUsIDB4Q0U4NywgMHhDRTg5LAotICAgIDB4Q0U5MCwgMHhDRTkxLCAweENFOTQsIDB4Q0U5OCwgMHhDRUEwLCAweENFQTEsIDB4Q0VBMywgMHhDRUE0LAotICAgIDB4Q0VBNSwgMHhDRUFDLCAweENFQUQsIDB4Q0VDMSwgMHhDRUU0LCAweENFRTUsIDB4Q0VFOCwgMHhDRUVCLAotICAgIDB4Q0VFQywgMHhDRUY0LCAweENFRjUsIDB4Q0VGNywgMHhDRUY4LCAweENFRjksIDB4Q0YwMCwgMHhDRjAxLAotICAgIDB4Q0YwNCwgMHhDRjA4LCAweENGMTAsIDB4Q0YxMSwgMHhDRjEzLCAweENGMTUsIDB4Q0YxQywgMHhDRjIwLAotICAgIDB4Q0YyNCwgMHhDRjJDLCAweENGMkQsIDB4Q0YyRiwgMHhDRjMwLCAweENGMzEsIDB4Q0YzOCwgMHhDRjU0LAotICAgIDB4Q0Y1NSwgMHhDRjU4LCAweENGNUMsIDB4Q0Y2NCwgMHhDRjY1LCAweENGNjcsIDB4Q0Y2OSwgMHhDRjcwLAotICAgIDB4Q0Y3MSwgMHhDRjc0LCAweENGNzgsIDB4Q0Y4MCwgMHhDRjg1LCAweENGOEMsIDB4Q0ZBMSwgMHhDRkE4LAotICAgIDB4Q0ZCMCwgMHhDRkM0LCAweENGRTAsIDB4Q0ZFMSwgMHhDRkU0LCAweENGRTgsIDB4Q0ZGMCwgMHhDRkYxLAotICAgIDB4Q0ZGMywgMHhDRkY1LCAweENGRkMsIDB4RDAwMCwgMHhEMDA0LCAweEQwMTEsIDB4RDAxOCwgMHhEMDJELAotICAgIDB4RDAzNCwgMHhEMDM1LCAweEQwMzgsIDB4RDAzQywgMHhEMDQ0LCAweEQwNDUsIDB4RDA0NywgMHhEMDQ5LAotICAgIDB4RDA1MCwgMHhEMDU0LCAweEQwNTgsIDB4RDA2MCwgMHhEMDZDLCAweEQwNkQsIDB4RDA3MCwgMHhEMDc0LAotICAgIDB4RDA3QywgMHhEMDdELCAweEQwODEsIDB4RDBBNCwgMHhEMEE1LCAweEQwQTgsIDB4RDBBQywgMHhEMEI0LAotICAgIDB4RDBCNSwgMHhEMEI3LCAweEQwQjksIDB4RDBDMCwgMHhEMEMxLCAweEQwQzQsIDB4RDBDOCwgMHhEMEM5LAotICAgIDB4RDBEMCwgMHhEMEQxLCAweEQwRDMsIDB4RDBENCwgMHhEMEQ1LCAweEQwREMsIDB4RDBERCwgMHhEMEUwLAotICAgIDB4RDBFNCwgMHhEMEVDLCAweEQwRUQsIDB4RDBFRiwgMHhEMEYwLCAweEQwRjEsIDB4RDBGOCwgMHhEMTBELAotICAgIDB4RDEzMCwgMHhEMTMxLCAweEQxMzQsIDB4RDEzOCwgMHhEMTNBLCAweEQxNDAsIDB4RDE0MSwgMHhEMTQzLAotICAgIDB4RDE0NCwgMHhEMTQ1LCAweEQxNEMsIDB4RDE0RCwgMHhEMTUwLCAweEQxNTQsIDB4RDE1QywgMHhEMTVELAotICAgIDB4RDE1RiwgMHhEMTYxLCAweEQxNjgsIDB4RDE2QywgMHhEMTdDLCAweEQxODQsIDB4RDE4OCwgMHhEMUEwLAotICAgIDB4RDFBMSwgMHhEMUE0LCAweEQxQTgsIDB4RDFCMCwgMHhEMUIxLCAweEQxQjMsIDB4RDFCNSwgMHhEMUJBLAotICAgIDB4RDFCQywgMHhEMUMwLCAweEQxRDgsIDB4RDFGNCwgMHhEMUY4LCAweEQyMDcsIDB4RDIwOSwgMHhEMjEwLAotICAgIDB4RDIyQywgMHhEMjJELCAweEQyMzAsIDB4RDIzNCwgMHhEMjNDLCAweEQyM0QsIDB4RDIzRiwgMHhEMjQxLAotICAgIDB4RDI0OCwgMHhEMjVDLCAweEQyNjQsIDB4RDI4MCwgMHhEMjgxLCAweEQyODQsIDB4RDI4OCwgMHhEMjkwLAotICAgIDB4RDI5MSwgMHhEMjk1LCAweEQyOUMsIDB4RDJBMCwgMHhEMkE0LCAweEQyQUMsIDB4RDJCMSwgMHhEMkI4LAotICAgIDB4RDJCOSwgMHhEMkJDLCAweEQyQkYsIDB4RDJDMCwgMHhEMkMyLCAweEQyQzgsIDB4RDJDOSwgMHhEMkNCLAotICAgIDB4RDJENCwgMHhEMkQ4LCAweEQyREMsIDB4RDJFNCwgMHhEMkU1LCAweEQyRjAsIDB4RDJGMSwgMHhEMkY0LAotICAgIDB4RDJGOCwgMHhEMzAwLCAweEQzMDEsIDB4RDMwMywgMHhEMzA1LCAweEQzMEMsIDB4RDMwRCwgMHhEMzBFLAotICAgIDB4RDMxMCwgMHhEMzE0LCAweEQzMTYsIDB4RDMxQywgMHhEMzFELCAweEQzMUYsIDB4RDMyMCwgMHhEMzIxLAotICAgIDB4RDMyNSwgMHhEMzI4LCAweEQzMjksIDB4RDMyQywgMHhEMzMwLCAweEQzMzgsIDB4RDMzOSwgMHhEMzNCLAotICAgIDB4RDMzQywgMHhEMzNELCAweEQzNDQsIDB4RDM0NSwgMHhEMzdDLCAweEQzN0QsIDB4RDM4MCwgMHhEMzg0LAotICAgIDB4RDM4QywgMHhEMzhELCAweEQzOEYsIDB4RDM5MCwgMHhEMzkxLCAweEQzOTgsIDB4RDM5OSwgMHhEMzlDLAotICAgIDB4RDNBMCwgMHhEM0E4LCAweEQzQTksIDB4RDNBQiwgMHhEM0FELCAweEQzQjQsIDB4RDNCOCwgMHhEM0JDLAotICAgIDB4RDNDNCwgMHhEM0M1LCAweEQzQzgsIDB4RDNDOSwgMHhEM0QwLCAweEQzRDgsIDB4RDNFMSwgMHhEM0UzLAotICAgIDB4RDNFQywgMHhEM0VELCAweEQzRjAsIDB4RDNGNCwgMHhEM0ZDLCAweEQzRkQsIDB4RDNGRiwgMHhENDAxLAotICAgIDB4RDQwOCwgMHhENDFELCAweEQ0NDAsIDB4RDQ0NCwgMHhENDVDLCAweEQ0NjAsIDB4RDQ2NCwgMHhENDZELAotICAgIDB4RDQ2RiwgMHhENDc4LCAweEQ0NzksIDB4RDQ3QywgMHhENDdGLCAweEQ0ODAsIDB4RDQ4MiwgMHhENDg4LAotICAgIDB4RDQ4OSwgMHhENDhCLCAweEQ0OEQsIDB4RDQ5NCwgMHhENEE5LCAweEQ0Q0MsIDB4RDREMCwgMHhENEQ0LAotICAgIDB4RDREQywgMHhENERGLCAweEQ0RTgsIDB4RDRFQywgMHhENEYwLCAweEQ0RjgsIDB4RDRGQiwgMHhENEZELAotICAgIDB4RDUwNCwgMHhENTA4LCAweEQ1MEMsIDB4RDUxNCwgMHhENTE1LCAweEQ1MTcsIDB4RDUzQywgMHhENTNELAotICAgIDB4RDU0MCwgMHhENTQ0LCAweEQ1NEMsIDB4RDU0RCwgMHhENTRGLCAweEQ1NTEsIDB4RDU1OCwgMHhENTU5LAotICAgIDB4RDU1QywgMHhENTYwLCAweEQ1NjUsIDB4RDU2OCwgMHhENTY5LCAweEQ1NkIsIDB4RDU2RCwgMHhENTc0LAotICAgIDB4RDU3NSwgMHhENTc4LCAweEQ1N0MsIDB4RDU4NCwgMHhENTg1LCAweEQ1ODcsIDB4RDU4OCwgMHhENTg5LAotICAgIDB4RDU5MCwgMHhENUE1LCAweEQ1QzgsIDB4RDVDOSwgMHhENUNDLCAweEQ1RDAsIDB4RDVEMiwgMHhENUQ4LAotICAgIDB4RDVEOSwgMHhENURCLCAweEQ1REQsIDB4RDVFNCwgMHhENUU1LCAweEQ1RTgsIDB4RDVFQywgMHhENUY0LAotICAgIDB4RDVGNSwgMHhENUY3LCAweEQ1RjksIDB4RDYwMCwgMHhENjAxLCAweEQ2MDQsIDB4RDYwOCwgMHhENjEwLAotICAgIDB4RDYxMSwgMHhENjEzLCAweEQ2MTQsIDB4RDYxNSwgMHhENjFDLCAweEQ2MjAsIDB4RDYyNCwgMHhENjJELAotICAgIDB4RDYzOCwgMHhENjM5LCAweEQ2M0MsIDB4RDY0MCwgMHhENjQ1LCAweEQ2NDgsIDB4RDY0OSwgMHhENjRCLAotICAgIDB4RDY0RCwgMHhENjUxLCAweEQ2NTQsIDB4RDY1NSwgMHhENjU4LCAweEQ2NUMsIDB4RDY2NywgMHhENjY5LAotICAgIDB4RDY3MCwgMHhENjcxLCAweEQ2NzQsIDB4RDY4MywgMHhENjg1LCAweEQ2OEMsIDB4RDY4RCwgMHhENjkwLAotICAgIDB4RDY5NCwgMHhENjlELCAweEQ2OUYsIDB4RDZBMSwgMHhENkE4LCAweEQ2QUMsIDB4RDZCMCwgMHhENkI5LAotICAgIDB4RDZCQiwgMHhENkM0LCAweEQ2QzUsIDB4RDZDOCwgMHhENkNDLCAweEQ2RDEsIDB4RDZENCwgMHhENkQ3LAotICAgIDB4RDZEOSwgMHhENkUwLCAweEQ2RTQsIDB4RDZFOCwgMHhENkYwLCAweEQ2RjUsIDB4RDZGQywgMHhENkZELAotICAgIDB4RDcwMCwgMHhENzA0LCAweEQ3MTEsIDB4RDcxOCwgMHhENzE5LCAweEQ3MUMsIDB4RDcyMCwgMHhENzI4LAotICAgIDB4RDcyOSwgMHhENzJCLCAweEQ3MkQsIDB4RDczNCwgMHhENzM1LCAweEQ3MzgsIDB4RDczQywgMHhENzQ0LAotICAgIDB4RDc0NywgMHhENzQ5LCAweEQ3NTAsIDB4RDc1MSwgMHhENzU0LCAweEQ3NTYsIDB4RDc1NywgMHhENzU4LAotICAgIDB4RDc1OSwgMHhENzYwLCAweEQ3NjEsIDB4RDc2MywgMHhENzY1LCAweEQ3NjksIDB4RDc2QywgMHhENzcwLAotICAgIDB4RDc3NCwgMHhENzdDLCAweEQ3N0QsIDB4RDc4MSwgMHhENzg4LCAweEQ3ODksIDB4RDc4QywgMHhENzkwLAotICAgIDB4RDc5OCwgMHhENzk5LCAweEQ3OUIsIDB4RDc5RCwgMHg0RjNELCAweDRGNzMsIDB4NTA0NywgMHg1MEY5LAotICAgIDB4NTJBMCwgMHg1M0VGLCAweDU0NzUsIDB4NTRFNSwgMHg1NjA5LCAweDVBQzEsIDB4NUJCNiwgMHg2Njg3LAotICAgIDB4NjdCNiwgMHg2N0I3LCAweDY3RUYsIDB4NkI0QywgMHg3M0MyLCAweDc1QzIsIDB4N0EzQywgMHg4MkRCLAotICAgIDB4ODMwNCwgMHg4ODU3LCAweDg4ODgsIDB4OEEzNiwgMHg4Q0M4LCAweDhEQ0YsIDB4OEVGQiwgMHg4RkU2LAotICAgIDB4OTlENSwgMHg1MjNCLCAweDUzNzQsIDB4NTQwNCwgMHg2MDZBLCAweDYxNjQsIDB4NkJCQywgMHg3M0NGLAotICAgIDB4ODExQSwgMHg4OUJBLCAweDg5RDIsIDB4OTVBMywgMHg0RjgzLCAweDUyMEEsIDB4NThCRSwgMHg1OTc4LAotICAgIDB4NTlFNiwgMHg1RTcyLCAweDVFNzksIDB4NjFDNywgMHg2M0MwLCAweDY3NDYsIDB4NjdFQywgMHg2ODdGLAotICAgIDB4NkY5NywgMHg3NjRFLCAweDc3MEIsIDB4NzhGNSwgMHg3QTA4LCAweDdBRkYsIDB4N0MyMSwgMHg4MDlELAotICAgIDB4ODI2RSwgMHg4MjcxLCAweDhBRUIsIDB4OTU5MywgMHg0RTZCLCAweDU1OUQsIDB4NjZGNywgMHg2RTM0LAotICAgIDB4NzhBMywgMHg3QUVELCAweDg0NUIsIDB4ODkxMCwgMHg4NzRFLCAweDk3QTgsIDB4NTJEOCwgMHg1NzRFLAotICAgIDB4NTgyQSwgMHg1RDRDLCAweDYxMUYsIDB4NjFCRSwgMHg2MjIxLCAweDY1NjIsIDB4NjdEMSwgMHg2QTQ0LAotICAgIDB4NkUxQiwgMHg3NTE4LCAweDc1QjMsIDB4NzZFMywgMHg3N0IwLCAweDdEM0EsIDB4OTBBRiwgMHg5NDUxLAotICAgIDB4OTQ1MiwgMHg5Rjk1LCAweDUzMjMsIDB4NUNBQywgMHg3NTMyLCAweDgwREIsIDB4OTI0MCwgMHg5NTk4LAotICAgIDB4NTI1QiwgMHg1ODA4LCAweDU5REMsIDB4NUNBMSwgMHg1RDE3LCAweDVFQjcsIDB4NUYzQSwgMHg1RjRBLAotICAgIDB4NjE3NywgMHg2QzVGLCAweDc1N0EsIDB4NzU4NiwgMHg3Q0UwLCAweDdENzMsIDB4N0RCMSwgMHg3RjhDLAotICAgIDB4ODE1NCwgMHg4MjIxLCAweDg1OTEsIDB4ODk0MSwgMHg4QjFCLCAweDkyRkMsIDB4OTY0RCwgMHg5QzQ3LAotICAgIDB4NEVDQiwgMHg0RUY3LCAweDUwMEIsIDB4NTFGMSwgMHg1ODRGLCAweDYxMzcsIDB4NjEzRSwgMHg2MTY4LAotICAgIDB4NjUzOSwgMHg2OUVBLCAweDZGMTEsIDB4NzVBNSwgMHg3Njg2LCAweDc2RDYsIDB4N0I4NywgMHg4MkE1LAotICAgIDB4ODRDQiwgMHg5M0E3LCAweDk1OEIsIDB4NTU4MCwgMHg1QkEyLCAweDU3NTEsIDB4N0NCMywgMHg3RkI5LAotICAgIDB4OTFCNSwgMHg1MDI4LCAweDUzQkIsIDB4NUM0NSwgMHg1REU4LCAweDYyRDIsIDB4NjM2RSwgMHg2NERBLAotICAgIDB4NjRFNywgMHg2RTIwLCAweDcwQUMsIDB4Nzk1QiwgMHg4RERELCAweDhFMUUsIDB4OTA3RCwgMHg5MjQ1LAotICAgIDB4OTJGOCwgMHg0RTdFLCAweDRFRjYsIDB4NTA2NSwgMHg1REZFLCAweDVFRkEsIDB4NjEwNiwgMHg2OTU3LAotICAgIDB4ODE3MSwgMHg4NjU0LCAweDhFNDcsIDB4OTM3NSwgMHg5QTJCLCAweDRFNUUsIDB4NTA5MSwgMHg2NzcwLAotICAgIDB4Njg0MCwgMHg1MTA5LCAweDUyOEQsIDB4NTI5MiwgMHg2QUEyLCAweDc3QkMsIDB4OTIxMCwgMHg5RUQ0LAotICAgIDB4NTJBQiwgMHg2MDJGLCAweDhGRjIsIDB4NTA0OCwgMHg2MUE5LCAweDYzRUQsIDB4NjRDQSwgMHg2ODNDLAotICAgIDB4NkE4NCwgMHg2RkMwLCAweDgxODgsIDB4ODlBMSwgMHg5Njk0LCAweDU4MDUsIDB4NzI3RCwgMHg3MkFDLAotICAgIDB4NzUwNCwgMHg3RDc5LCAweDdFNkQsIDB4ODBBOSwgMHg4OThCLCAweDhCNzQsIDB4OTA2MywgMHg5RDUxLAotICAgIDB4NjI4OSwgMHg2QzdBLCAweDZGNTQsIDB4N0Q1MCwgMHg3RjNBLCAweDhBMjMsIDB4NTE3QywgMHg2MTRBLAotICAgIDB4N0I5RCwgMHg4QjE5LCAweDkyNTcsIDB4OTM4QywgMHg0RUFDLCAweDRGRDMsIDB4NTAxRSwgMHg1MEJFLAotICAgIDB4NTEwNiwgMHg1MkMxLCAweDUyQ0QsIDB4NTM3RiwgMHg1NzcwLCAweDU4ODMsIDB4NUU5QSwgMHg1RjkxLAotICAgIDB4NjE3NiwgMHg2MUFDLCAweDY0Q0UsIDB4NjU2QywgMHg2NjZGLCAweDY2QkIsIDB4NjZGNCwgMHg2ODk3LAotICAgIDB4NkQ4NywgMHg3MDg1LCAweDcwRjEsIDB4NzQ5RiwgMHg3NEE1LCAweDc0Q0EsIDB4NzVEOSwgMHg3ODZDLAotICAgIDB4NzhFQywgMHg3QURGLCAweDdBRjYsIDB4N0Q0NSwgMHg3RDkzLCAweDgwMTUsIDB4ODAzRiwgMHg4MTFCLAotICAgIDB4ODM5NiwgMHg4QjY2LCAweDhGMTUsIDB4OTAxNSwgMHg5M0UxLCAweDk4MDMsIDB4OTgzOCwgMHg5QTVBLAotICAgIDB4OUJFOCwgMHg0RkMyLCAweDU1NTMsIDB4NTgzQSwgMHg1OTUxLCAweDVCNjMsIDB4NUM0NiwgMHg2MEI4LAotICAgIDB4NjIxMiwgMHg2ODQyLCAweDY4QjAsIDB4NjhFOCwgMHg2RUFBLCAweDc1NEMsIDB4NzY3OCwgMHg3OENFLAotICAgIDB4N0EzRCwgMHg3Q0ZCLCAweDdFNkIsIDB4N0U3QywgMHg4QTA4LCAweDhBQTEsIDB4OEMzRiwgMHg5NjhFLAotICAgIDB4OURDNCwgMHg1M0U0LCAweDUzRTksIDB4NTQ0QSwgMHg1NDcxLCAweDU2RkEsIDB4NTlEMSwgMHg1QjY0LAotICAgIDB4NUMzQiwgMHg1RUFCLCAweDYyRjcsIDB4NjUzNywgMHg2NTQ1LCAweDY1NzIsIDB4NjZBMCwgMHg2N0FGLAotICAgIDB4NjlDMSwgMHg2Q0JELCAweDc1RkMsIDB4NzY5MCwgMHg3NzdFLCAweDdBM0YsIDB4N0Y5NCwgMHg4MDAzLAotICAgIDB4ODBBMSwgMHg4MThGLCAweDgyRTYsIDB4ODJGRCwgMHg4M0YwLCAweDg1QzEsIDB4ODgzMSwgMHg4OEI0LAotICAgIDB4OEFBNSwgMHg4RjlDLCAweDkzMkUsIDB4OTZDNywgMHg5ODY3LCAweDlBRDgsIDB4OUYxMywgMHg1NEVELAotICAgIDB4NjU5QiwgMHg2NkYyLCAweDY4OEYsIDB4N0E0MCwgMHg4QzM3LCAweDlENjAsIDB4NTZGMCwgMHg1NzY0LAotICAgIDB4NUQxMSwgMHg2NjA2LCAweDY4QjEsIDB4NjhDRCwgMHg2RUZFLCAweDc0MjgsIDB4ODg5RSwgMHg5QkU0LAotICAgIDB4NkM2OCwgMHg5QUE4LCAweDRGOUIsIDB4NTE2QywgMHg1MTcxLCAweDUyOUYsIDB4NUI1NCwgMHg1REU1LAotICAgIDB4NjA1MCwgMHg2MDZELCAweDYyRjEsIDB4NjNBNywgMHg2NTNCLCAweDczRDksIDB4N0E3QSwgMHg4NkEzLAotICAgIDB4OENBMiwgMHg5NzhGLCAweDRFMzIsIDB4NUJFMSwgMHg2MjA4LCAweDY3OUMsIDB4NzREQywgMHg3OUQxLAotICAgIDB4ODNEMywgMHg4QTg3LCAweDhBQjIsIDB4OERFOCwgMHg5MDRFLCAweDkzNEIsIDB4OTg0NiwgMHg1RUQzLAotICAgIDB4NjlFOCwgMHg4NUZGLCAweDkwRUQsIDB4NTFBMCwgMHg1Qjk4LCAweDVCRUMsIDB4NjE2MywgMHg2OEZBLAotICAgIDB4NkIzRSwgMHg3MDRDLCAweDc0MkYsIDB4NzREOCwgMHg3QkExLCAweDdGNTAsIDB4ODNDNSwgMHg4OUMwLAotICAgIDB4OENBQiwgMHg5NURDLCAweDk5MjgsIDB4NTIyRSwgMHg2MDVELCAweDYyRUMsIDB4OTAwMiwgMHg0RjhBLAotICAgIDB4NTE0OSwgMHg1MzIxLCAweDU4RDksIDB4NUVFMywgMHg2NkUwLCAweDZEMzgsIDB4NzA5QSwgMHg3MkMyLAotICAgIDB4NzNENiwgMHg3QjUwLCAweDgwRjEsIDB4OTQ1QiwgMHg1MzY2LCAweDYzOUIsIDB4N0Y2QiwgMHg0RTU2LAotICAgIDB4NTA4MCwgMHg1ODRBLCAweDU4REUsIDB4NjAyQSwgMHg2MTI3LCAweDYyRDAsIDB4NjlEMCwgMHg5QjQxLAotICAgIDB4NUI4RiwgMHg3RDE4LCAweDgwQjEsIDB4OEY1RiwgMHg0RUE0LCAweDUwRDEsIDB4NTRBQywgMHg1NUFDLAotICAgIDB4NUIwQywgMHg1REEwLCAweDVERTcsIDB4NjUyQSwgMHg2NTRFLCAweDY4MjEsIDB4NkE0QiwgMHg3MkUxLAotICAgIDB4NzY4RSwgMHg3N0VGLCAweDdENUUsIDB4N0ZGOSwgMHg4MUEwLCAweDg1NEUsIDB4ODZERiwgMHg4RjAzLAotICAgIDB4OEY0RSwgMHg5MENBLCAweDk5MDMsIDB4OUE1NSwgMHg5QkFCLCAweDRFMTgsIDB4NEU0NSwgMHg0RTVELAotICAgIDB4NEVDNywgMHg0RkYxLCAweDUxNzcsIDB4NTJGRSwgMHg1MzQwLCAweDUzRTMsIDB4NTNFNSwgMHg1NDhFLAotICAgIDB4NTYxNCwgMHg1Nzc1LCAweDU3QTIsIDB4NUJDNywgMHg1RDg3LCAweDVFRDAsIDB4NjFGQywgMHg2MkQ4LAotICAgIDB4NjU1MSwgMHg2N0I4LCAweDY3RTksIDB4NjlDQiwgMHg2QjUwLCAweDZCQzYsIDB4NkJFQywgMHg2QzQyLAotICAgIDB4NkU5RCwgMHg3MDc4LCAweDcyRDcsIDB4NzM5NiwgMHg3NDAzLCAweDc3QkYsIDB4NzdFOSwgMHg3QTc2LAotICAgIDB4N0Q3RiwgMHg4MDA5LCAweDgxRkMsIDB4ODIwNSwgMHg4MjBBLCAweDgyREYsIDB4ODg2MiwgMHg4QjMzLAotICAgIDB4OENGQywgMHg4RUMwLCAweDkwMTEsIDB4OTBCMSwgMHg5MjY0LCAweDkyQjYsIDB4OTlEMiwgMHg5QTQ1LAotICAgIDB4OUNFOSwgMHg5REQ3LCAweDlGOUMsIDB4NTcwQiwgMHg1QzQwLCAweDgzQ0EsIDB4OTdBMCwgMHg5N0FCLAotICAgIDB4OUVCNCwgMHg1NDFCLCAweDdBOTgsIDB4N0ZBNCwgMHg4OEQ5LCAweDhFQ0QsIDB4OTBFMSwgMHg1ODAwLAotICAgIDB4NUM0OCwgMHg2Mzk4LCAweDdBOUYsIDB4NUJBRSwgMHg1RjEzLCAweDdBNzksIDB4N0FBRSwgMHg4MjhFLAotICAgIDB4OEVBQywgMHg1MDI2LCAweDUyMzgsIDB4NTJGOCwgMHg1Mzc3LCAweDU3MDgsIDB4NjJGMywgMHg2MzcyLAotICAgIDB4NkIwQSwgMHg2REMzLCAweDc3MzcsIDB4NTNBNSwgMHg3MzU3LCAweDg1NjgsIDB4OEU3NiwgMHg5NUQ1LAotICAgIDB4NjczQSwgMHg2QUMzLCAweDZGNzAsIDB4OEE2RCwgMHg4RUNDLCAweDk5NEIsIDB4NjY3NywgMHg2Qjc4LAotICAgIDB4OENCNCwgMHg5QjNDLCAweDUzRUIsIDB4NTcyRCwgMHg1OTRFLCAweDYzQzYsIDB4NjlGQiwgMHg3M0VBLAotICAgIDB4Nzg0NSwgMHg3QUJBLCAweDdBQzUsIDB4N0NGRSwgMHg4NDc1LCAweDg5OEYsIDB4OEQ3MywgMHg5MDM1LAotICAgIDB4OTVBOCwgMHg1MkZCLCAweDU3NDcsIDB4NzU0NywgMHg3QjYwLCAweDgzQ0MsIDB4OTIxRSwgMHg2QTU4LAotICAgIDB4NTE0QiwgMHg1MjRCLCAweDUyODcsIDB4NjIxRiwgMHg2OEQ4LCAweDY5NzUsIDB4OTY5OSwgMHg1MEM1LAotICAgIDB4NTJBNCwgMHg1MkU0LCAweDYxQzMsIDB4NjVBNCwgMHg2ODM5LCAweDY5RkYsIDB4NzQ3RSwgMHg3QjRCLAotICAgIDB4ODJCOSwgMHg4M0VCLCAweDg5QjIsIDB4OEIzOSwgMHg4RkQxLCAweDk5NDksIDB4NEVDQSwgMHg1OTk3LAotICAgIDB4NjREMiwgMHg2NjExLCAweDZBOEUsIDB4NzQzNCwgMHg3OTgxLCAweDc5QkQsIDB4ODJBOSwgMHg4ODdFLAotICAgIDB4ODg3RiwgMHg4OTVGLCAweDkzMjYsIDB4NEYwQiwgMHg1M0NBLCAweDYwMjUsIDB4NjI3MSwgMHg2QzcyLAotICAgIDB4N0QxQSwgMHg3RDY2LCAweDRFOTgsIDB4NTE2MiwgMHg3N0RDLCAweDgwQUYsIDB4NEYwMSwgMHg0RjBFLAotICAgIDB4NTE3NiwgMHg1MTgwLCAweDU1REMsIDB4NTY2OCwgMHg1NzNCLCAweDU3RkEsIDB4NTdGQywgMHg1OTE0LAotICAgIDB4NTk0NywgMHg1OTkzLCAweDVCQzQsIDB4NUM5MCwgMHg1RDBFLCAweDVERjEsIDB4NUU3RSwgMHg1RkNDLAotICAgIDB4NjI4MCwgMHg2NUQ3LCAweDY1RTMsIDB4NjcxRSwgMHg2NzFGLCAweDY3NUUsIDB4NjhDQiwgMHg2OEM0LAotICAgIDB4NkE1RiwgMHg2QjNBLCAweDZDMjMsIDB4NkM3RCwgMHg2QzgyLCAweDZEQzcsIDB4NzM5OCwgMHg3NDI2LAotICAgIDB4NzQyQSwgMHg3NDgyLCAweDc0QTMsIDB4NzU3OCwgMHg3NTdGLCAweDc4ODEsIDB4NzhFRiwgMHg3OTQxLAotICAgIDB4Nzk0NywgMHg3OTQ4LCAweDc5N0EsIDB4N0I5NSwgMHg3RDAwLCAweDdEQkEsIDB4N0Y4OCwgMHg4MDA2LAotICAgIDB4ODAyRCwgMHg4MDhDLCAweDhBMTgsIDB4OEI0RiwgMHg4QzQ4LCAweDhENzcsIDB4OTMyMSwgMHg5MzI0LAotICAgIDB4OThFMiwgMHg5OTUxLCAweDlBMEUsIDB4OUEwRiwgMHg5QTY1LCAweDlFOTIsIDB4N0RDQSwgMHg0Rjc2LAotICAgIDB4NTQwOSwgMHg2MkVFLCAweDY4NTQsIDB4OTFEMSwgMHg1NUFCLCAweDUxM0EsIDB4NUExQywgMHg2MUU2LAotICAgIDB4NjJDRiwgMHg2MkZGLCAweDkwQTMsIDB4OEFGRSwgMHg2Njk2LCAweDcxNTYsIDB4OTZFMywgMHg2MzRGLAotICAgIDB4NjM3QSwgMHg1MzU3LCAweDY3OEYsIDB4Njk2MCwgMHg2RTczLCAweDc1MzcsIDB4N0QwRCwgMHg4ODcyLAotICAgIDB4NTZDQSwgMHg1QTE4LCAweDRFNDMsIDB4NTE2NywgMHg1OTQ4LCAweDY3RjAsIDB4ODAxMCwgMHg1OTczLAotICAgIDB4NUU3NCwgMHg2NDlBLCAweDc5Q0EsIDB4NUZGNSwgMHg2MDZDLCAweDYyQzgsIDB4NjM3QiwgMHg1QkU3LAotICAgIDB4NUJENywgMHg1MkFBLCAweDU5NzQsIDB4NUYyOSwgMHg2MDEyLCAweDc0NTksIDB4OTlEMSwgMHg2RkMzLAotICAgIDB4ODFCRiwgMHg4RkIyLCAweDYwRjEsIDB4ODE2NiwgMHg1QzNGLCAweDVBRTksIDB4OEEyNSwgMHg2NzdCLAotICAgIDB4N0QxMCwgMHg4MEZELCAweDVDM0MsIDB4NkNFNSwgMHg1MzNGLCAweDZFQkEsIDB4NTkxQSwgMHg4MzM2LAotICAgIDB4NEUzOSwgMHg0RUI2LCAweDRGNDYsIDB4NTVBRSwgMHg1NzE4LCAweDU4QzcsIDB4NUY1NiwgMHg2NUI3LAotICAgIDB4NjVFNiwgMHg2QTgwLCAweDZCQjUsIDB4NkU0RCwgMHg3N0VELCAweDdBRUYsIDB4N0MxRSwgMHg3RERFLAotICAgIDB4ODZDQiwgMHg4ODkyLCAweDkxMzIsIDB4OTM1QiwgMHg2NEJCLCAweDZGQkUsIDB4NzM3QSwgMHg3NUI4LAotICAgIDB4OTA1NCwgMHg1NTU2LCAweDU3NEQsIDB4NjFCQSwgMHg2NEQ0LCAweDY2QzcsIDB4NkRFMSwgMHg2RTVCLAotICAgIDB4NkY2RCwgMHg2RkI5LCAweDc1RjAsIDB4ODA0MywgMHg4MUJELCAweDg1NDEsIDB4ODk4MywgMHg4QUM3LAotICAgIDB4OEI1QSwgMHg5MzFGLCAweDZDOTMsIDB4NzU1MywgMHg3QjU0LCAweDhFMEYsIDB4OTA1RCwgMHg1NTEwLAotICAgIDB4NTgwMiwgMHg1ODU4LCAweDVFNjIsIDB4NjIwNywgMHg2NDlFLCAweDY4RTAsIDB4NzU3NiwgMHg3Q0Q2LAotICAgIDB4ODdCMywgMHg5RUU4LCAweDRFRTMsIDB4NTc4OCwgMHg1NzZFLCAweDU5MjcsIDB4NUMwRCwgMHg1Q0IxLAotICAgIDB4NUUzNiwgMHg1Rjg1LCAweDYyMzQsIDB4NjRFMSwgMHg3M0IzLCAweDgxRkEsIDB4ODg4QiwgMHg4Q0I4LAotICAgIDB4OTY4QSwgMHg5RURCLCAweDVCODUsIDB4NUZCNywgMHg2MEIzLCAweDUwMTIsIDB4NTIwMCwgMHg1MjMwLAotICAgIDB4NTcxNiwgMHg1ODM1LCAweDU4NTcsIDB4NUMwRSwgMHg1QzYwLCAweDVDRjYsIDB4NUQ4QiwgMHg1RUE2LAotICAgIDB4NUY5MiwgMHg2MEJDLCAweDYzMTEsIDB4NjM4OSwgMHg2NDE3LCAweDY4NDMsIDB4NjhGOSwgMHg2QUMyLAotICAgIDB4NkREOCwgMHg2RTIxLCAweDZFRDQsIDB4NkZFNCwgMHg3MUZFLCAweDc2REMsIDB4Nzc3OSwgMHg3OUIxLAotICAgIDB4N0EzQiwgMHg4NDA0LCAweDg5QTksIDB4OENFRCwgMHg4REYzLCAweDhFNDgsIDB4OTAwMywgMHg5MDE0LAotICAgIDB4OTA1MywgMHg5MEZELCAweDkzNEQsIDB4OTY3NiwgMHg5N0RDLCAweDZCRDIsIDB4NzAwNiwgMHg3MjU4LAotICAgIDB4NzJBMiwgMHg3MzY4LCAweDc3NjMsIDB4NzlCRiwgMHg3QkU0LCAweDdFOUIsIDB4OEI4MCwgMHg1OEE5LAotICAgIDB4NjBDNywgMHg2NTY2LCAweDY1RkQsIDB4NjZCRSwgMHg2QzhDLCAweDcxMUUsIDB4NzFDOSwgMHg4QzVBLAotICAgIDB4OTgxMywgMHg0RTZELCAweDdBODEsIDB4NEVERCwgMHg1MUFDLCAweDUxQ0QsIDB4NTJENSwgMHg1NDBDLAotICAgIDB4NjFBNywgMHg2NzcxLCAweDY4NTAsIDB4NjhERiwgMHg2RDFFLCAweDZGN0MsIDB4NzVCQywgMHg3N0IzLAotICAgIDB4N0FFNSwgMHg4MEY0LCAweDg0NjMsIDB4OTI4NSwgMHg1MTVDLCAweDY1OTcsIDB4Njc1QywgMHg2NzkzLAotICAgIDB4NzVEOCwgMHg3QUM3LCAweDgzNzMsIDB4OEM0NiwgMHg5MDE3LCAweDk4MkQsIDB4NUM2RiwgMHg4MUMwLAotICAgIDB4ODI5QSwgMHg5MDQxLCAweDkwNkYsIDB4OTIwRCwgMHg1Rjk3LCAweDVEOUQsIDB4NkE1OSwgMHg3MUM4LAotICAgIDB4NzY3QiwgMHg3QjQ5LCAweDg1RTQsIDB4OEIwNCwgMHg5MTI3LCAweDlBMzAsIDB4NTU4NywgMHg2MUY2LAotICAgIDB4NzY2OSwgMHg3Rjg1LCAweDg2M0YsIDB4ODdCQSwgMHg4OEY4LCAweDkwOEYsIDB4NkQxQiwgMHg3MEQ5LAotICAgIDB4NzNERSwgMHg3RDYxLCAweDg0M0QsIDB4OTE2QSwgMHg5OUYxLCAweDRFODIsIDB4NTM3NSwgMHg2QjA0LAotICAgIDB4NkIxMiwgMHg3MDNFLCAweDcyMUIsIDB4ODYyRCwgMHg5RTFFLCAweDUyNEMsIDB4OEZBMywgMHg1RDUwLAotICAgIDB4NjRFNSwgMHg2NTJDLCAweDZCMTYsIDB4NkZFQiwgMHg3QzQzLCAweDdFOUMsIDB4ODVDRCwgMHg4OTY0LAotICAgIDB4ODlCRCwgMHg2MkM5LCAweDgxRDgsIDB4ODgxRiwgMHg1RUNBLCAweDY3MTcsIDB4NkQ2QSwgMHg3MkZDLAotICAgIDB4NzQwNSwgMHg3NDZGLCAweDg3ODIsIDB4OTBERSwgMHg0Rjg2LCAweDVEMEQsIDB4NUZBMCwgMHg4NDBBLAotICAgIDB4NTFCNywgMHg2M0EwLCAweDc1NjUsIDB4NEVBRSwgMHg1MDA2LCAweDUxNjksIDB4NTFDOSwgMHg2ODgxLAotICAgIDB4NkExMSwgMHg3Q0FFLCAweDdDQjEsIDB4N0NFNywgMHg4MjZGLCAweDhBRDIsIDB4OEYxQiwgMHg5MUNGLAotICAgIDB4NEZCNiwgMHg1MTM3LCAweDUyRjUsIDB4NTQ0MiwgMHg1RUVDLCAweDYxNkUsIDB4NjIzRSwgMHg2NUM1LAotICAgIDB4NkFEQSwgMHg2RkZFLCAweDc5MkEsIDB4ODVEQywgMHg4ODIzLCAweDk1QUQsIDB4OUE2MiwgMHg5QTZBLAotICAgIDB4OUU5NywgMHg5RUNFLCAweDUyOUIsIDB4NjZDNiwgMHg2Qjc3LCAweDcwMUQsIDB4NzkyQiwgMHg4RjYyLAotICAgIDB4OTc0MiwgMHg2MTkwLCAweDYyMDAsIDB4NjUyMywgMHg2RjIzLCAweDcxNDksIDB4NzQ4OSwgMHg3REY0LAotICAgIDB4ODA2RiwgMHg4NEVFLCAweDhGMjYsIDB4OTAyMywgMHg5MzRBLCAweDUxQkQsIDB4NTIxNywgMHg1MkEzLAotICAgIDB4NkQwQywgMHg3MEM4LCAweDg4QzIsIDB4NUVDOSwgMHg2NTgyLCAweDZCQUUsIDB4NkZDMiwgMHg3QzNFLAotICAgIDB4NzM3NSwgMHg0RUU0LCAweDRGMzYsIDB4NTZGOSwgMHg1Q0JBLCAweDVEQkEsIDB4NjAxQywgMHg3M0IyLAotICAgIDB4N0IyRCwgMHg3RjlBLCAweDdGQ0UsIDB4ODA0NiwgMHg5MDFFLCAweDkyMzQsIDB4OTZGNiwgMHg5NzQ4LAotICAgIDB4OTgxOCwgMHg5RjYxLCAweDRGOEIsIDB4NkZBNywgMHg3OUFFLCAweDkxQjQsIDB4OTZCNywgMHg1MkRFLAotICAgIDB4NjQ4OCwgMHg2NEM0LCAweDZBRDMsIDB4NkY1RSwgMHg3MDE4LCAweDcyMTAsIDB4NzZFNywgMHg4MDAxLAotICAgIDB4ODYwNiwgMHg4NjVDLCAweDhERUYsIDB4OEYwNSwgMHg5NzMyLCAweDlCNkYsIDB4OURGQSwgMHg5RTc1LAotICAgIDB4Nzg4QywgMHg3OTdGLCAweDdEQTAsIDB4ODNDOSwgMHg5MzA0LCAweDlFN0YsIDB4OUU5MywgMHg4QUQ2LAotICAgIDB4NThERiwgMHg1RjA0LCAweDY3MjcsIDB4NzAyNywgMHg3NENGLCAweDdDNjAsIDB4ODA3RSwgMHg1MTIxLAotICAgIDB4NzAyOCwgMHg3MjYyLCAweDc4Q0EsIDB4OENDMiwgMHg4Q0RBLCAweDhDRjQsIDB4OTZGNywgMHg0RTg2LAotICAgIDB4NTBEQSwgMHg1QkVFLCAweDVFRDYsIDB4NjU5OSwgMHg3MUNFLCAweDc2NDIsIDB4NzdBRCwgMHg4MDRBLAotICAgIDB4ODRGQywgMHg5MDdDLCAweDlCMjcsIDB4OUY4RCwgMHg1OEQ4LCAweDVBNDEsIDB4NUM2MiwgMHg2QTEzLAotICAgIDB4NkREQSwgMHg2RjBGLCAweDc2M0IsIDB4N0QyRiwgMHg3RTM3LCAweDg1MUUsIDB4ODkzOCwgMHg5M0U0LAotICAgIDB4OTY0QiwgMHg1Mjg5LCAweDY1RDIsIDB4NjdGMywgMHg2OUI0LCAweDZENDEsIDB4NkU5QywgMHg3MDBGLAotICAgIDB4NzQwOSwgMHg3NDYwLCAweDc1NTksIDB4NzYyNCwgMHg3ODZCLCAweDhCMkMsIDB4OTg1RSwgMHg1MTZELAotICAgIDB4NjIyRSwgMHg5Njc4LCAweDRGOTYsIDB4NTAyQiwgMHg1RDE5LCAweDZERUEsIDB4N0RCOCwgMHg4RjJBLAotICAgIDB4NUY4QiwgMHg2MTQ0LCAweDY4MTcsIDB4OTY4NiwgMHg1MkQyLCAweDgwOEIsIDB4NTFEQywgMHg1MUNDLAotICAgIDB4Njk1RSwgMHg3QTFDLCAweDdEQkUsIDB4ODNGMSwgMHg5Njc1LCAweDRGREEsIDB4NTIyOSwgMHg1Mzk4LAotICAgIDB4NTQwRiwgMHg1NTBFLCAweDVDNjUsIDB4NjBBNywgMHg2NzRFLCAweDY4QTgsIDB4NkQ2QywgMHg3MjgxLAotICAgIDB4NzJGOCwgMHg3NDA2LCAweDc0ODMsIDB4NzVFMiwgMHg3QzZDLCAweDdGNzksIDB4N0ZCOCwgMHg4Mzg5LAotICAgIDB4ODhDRiwgMHg4OEUxLCAweDkxQ0MsIDB4OTFEMCwgMHg5NkUyLCAweDlCQzksIDB4NTQxRCwgMHg2RjdFLAotICAgIDB4NzFEMCwgMHg3NDk4LCAweDg1RkEsIDB4OEVBQSwgMHg5NkEzLCAweDlDNTcsIDB4OUU5RiwgMHg2Nzk3LAotICAgIDB4NkRDQiwgMHg3NDMzLCAweDgxRTgsIDB4OTcxNiwgMHg3ODJDLCAweDdBQ0IsIDB4N0IyMCwgMHg3QzkyLAotICAgIDB4NjQ2OSwgMHg3NDZBLCAweDc1RjIsIDB4NzhCQywgMHg3OEU4LCAweDk5QUMsIDB4OUI1NCwgMHg5RUJCLAotICAgIDB4NUJERSwgMHg1RTU1LCAweDZGMjAsIDB4ODE5QywgMHg4M0FCLCAweDkwODgsIDB4NEUwNywgMHg1MzRELAotICAgIDB4NUEyOSwgMHg1REQyLCAweDVGNEUsIDB4NjE2MiwgMHg2MzNELCAweDY2NjksIDB4NjZGQywgMHg2RUZGLAotICAgIDB4NkYyQiwgMHg3MDYzLCAweDc3OUUsIDB4ODQyQywgMHg4NTEzLCAweDg4M0IsIDB4OEYxMywgMHg5OTQ1LAotICAgIDB4OUMzQiwgMHg1NTFDLCAweDYyQjksIDB4NjcyQiwgMHg2Q0FCLCAweDgzMDksIDB4ODk2QSwgMHg5NzdBLAotICAgIDB4NEVBMSwgMHg1OTg0LCAweDVGRDgsIDB4NUZEOSwgMHg2NzFCLCAweDdEQjIsIDB4N0Y1NCwgMHg4MjkyLAotICAgIDB4ODMyQiwgMHg4M0JELCAweDhGMUUsIDB4OTA5OSwgMHg1N0NCLCAweDU5QjksIDB4NUE5MiwgMHg1QkQwLAotICAgIDB4NjYyNywgMHg2NzlBLCAweDY4ODUsIDB4NkJDRiwgMHg3MTY0LCAweDdGNzUsIDB4OENCNywgMHg4Q0UzLAotICAgIDB4OTA4MSwgMHg5QjQ1LCAweDgxMDgsIDB4OEM4QSwgMHg5NjRDLCAweDlBNDAsIDB4OUVBNSwgMHg1QjVGLAotICAgIDB4NkMxMywgMHg3MzFCLCAweDc2RjIsIDB4NzZERiwgMHg4NDBDLCAweDUxQUEsIDB4ODk5MywgMHg1MTRELAotICAgIDB4NTE5NSwgMHg1MkM5LCAweDY4QzksIDB4NkM5NCwgMHg3NzA0LCAweDc3MjAsIDB4N0RCRiwgMHg3REVDLAotICAgIDB4OTc2MiwgMHg5RUI1LCAweDZFQzUsIDB4ODUxMSwgMHg1MUE1LCAweDU0MEQsIDB4NTQ3RCwgMHg2NjBFLAotICAgIDB4NjY5RCwgMHg2OTI3LCAweDZFOUYsIDB4NzZCRiwgMHg3NzkxLCAweDgzMTcsIDB4ODRDMiwgMHg4NzlGLAotICAgIDB4OTE2OSwgMHg5Mjk4LCAweDlDRjQsIDB4ODg4MiwgMHg0RkFFLCAweDUxOTIsIDB4NTJERiwgMHg1OUM2LAotICAgIDB4NUUzRCwgMHg2MTU1LCAweDY0NzgsIDB4NjQ3OSwgMHg2NkFFLCAweDY3RDAsIDB4NkEyMSwgMHg2QkNELAotICAgIDB4NkJEQiwgMHg3MjVGLCAweDcyNjEsIDB4NzQ0MSwgMHg3NzM4LCAweDc3REIsIDB4ODAxNywgMHg4MkJDLAotICAgIDB4ODMwNSwgMHg4QjAwLCAweDhCMjgsIDB4OEM4QywgMHg2NzI4LCAweDZDOTAsIDB4NzI2NywgMHg3NkVFLAotICAgIDB4Nzc2NiwgMHg3QTQ2LCAweDlEQTksIDB4NkI3RiwgMHg2QzkyLCAweDU5MjIsIDB4NjcyNiwgMHg4NDk5LAotICAgIDB4NTM2RiwgMHg1ODkzLCAweDU5OTksIDB4NUVERiwgMHg2M0NGLCAweDY2MzQsIDB4Njc3MywgMHg2RTNBLAotICAgIDB4NzMyQiwgMHg3QUQ3LCAweDgyRDcsIDB4OTMyOCwgMHg1MkQ5LCAweDVERUIsIDB4NjFBRSwgMHg2MUNCLAotICAgIDB4NjIwQSwgMHg2MkM3LCAweDY0QUIsIDB4NjVFMCwgMHg2OTU5LCAweDZCNjYsIDB4NkJDQiwgMHg3MTIxLAotICAgIDB4NzNGNywgMHg3NTVELCAweDdFNDYsIDB4ODIxRSwgMHg4MzAyLCAweDg1NkEsIDB4OEFBMywgMHg4Q0JGLAotICAgIDB4OTcyNywgMHg5RDYxLCAweDU4QTgsIDB4OUVEOCwgMHg1MDExLCAweDUyMEUsIDB4NTQzQiwgMHg1NTRGLAotICAgIDB4NjU4NywgMHg2Qzc2LCAweDdEMEEsIDB4N0QwQiwgMHg4MDVFLCAweDg2OEEsIDB4OTU4MCwgMHg5NkVGLAotICAgIDB4NTJGRiwgMHg2Qzk1LCAweDcyNjksIDB4NTQ3MywgMHg1QTlBLCAweDVDM0UsIDB4NUQ0QiwgMHg1RjRDLAotICAgIDB4NUZBRSwgMHg2NzJBLCAweDY4QjYsIDB4Njk2MywgMHg2RTNDLCAweDZFNDQsIDB4NzcwOSwgMHg3QzczLAotICAgIDB4N0Y4RSwgMHg4NTg3LCAweDhCMEUsIDB4OEZGNywgMHg5NzYxLCAweDlFRjQsIDB4NUNCNywgMHg2MEI2LAotICAgIDB4NjEwRCwgMHg2MUFCLCAweDY1NEYsIDB4NjVGQiwgMHg2NUZDLCAweDZDMTEsIDB4NkNFRiwgMHg3MzlGLAotICAgIDB4NzNDOSwgMHg3REUxLCAweDk1OTQsIDB4NUJDNiwgMHg4NzFDLCAweDhCMTAsIDB4NTI1RCwgMHg1MzVBLAotICAgIDB4NjJDRCwgMHg2NDBGLCAweDY0QjIsIDB4NjczNCwgMHg2QTM4LCAweDZDQ0EsIDB4NzNDMCwgMHg3NDlFLAotICAgIDB4N0I5NCwgMHg3Qzk1LCAweDdFMUIsIDB4ODE4QSwgMHg4MjM2LCAweDg1ODQsIDB4OEZFQiwgMHg5NkY5LAotICAgIDB4OTlDMSwgMHg0RjM0LCAweDUzNEEsIDB4NTNDRCwgMHg1M0RCLCAweDYyQ0MsIDB4NjQyQywgMHg2NTAwLAotICAgIDB4NjU5MSwgMHg2OUMzLCAweDZDRUUsIDB4NkY1OCwgMHg3M0VELCAweDc1NTQsIDB4NzYyMiwgMHg3NkU0LAotICAgIDB4NzZGQywgMHg3OEQwLCAweDc4RkIsIDB4NzkyQywgMHg3RDQ2LCAweDgyMkMsIDB4ODdFMCwgMHg4RkQ0LAotICAgIDB4OTgxMiwgMHg5OEVGLCAweDUyQzMsIDB4NjJENCwgMHg2NEE1LCAweDZFMjQsIDB4NkY1MSwgMHg3NjdDLAotICAgIDB4OERDQiwgMHg5MUIxLCAweDkyNjIsIDB4OUFFRSwgMHg5QjQzLCAweDUwMjMsIDB4NTA4RCwgMHg1NzRBLAotICAgIDB4NTlBOCwgMHg1QzI4LCAweDVFNDcsIDB4NUY3NywgMHg2MjNGLCAweDY1M0UsIDB4NjVCOSwgMHg2NUMxLAotICAgIDB4NjYwOSwgMHg2NzhCLCAweDY5OUMsIDB4NkVDMiwgMHg3OEM1LCAweDdEMjEsIDB4ODBBQSwgMHg4MTgwLAotICAgIDB4ODIyQiwgMHg4MkIzLCAweDg0QTEsIDB4ODY4QywgMHg4QTJBLCAweDhCMTcsIDB4OTBBNiwgMHg5NjMyLAotICAgIDB4OUY5MCwgMHg1MDBELCAweDRGRjMsIDB4NTdGOSwgMHg1Rjk4LCAweDYyREMsIDB4NjM5MiwgMHg2NzZGLAotICAgIDB4NkU0MywgMHg3MTE5LCAweDc2QzMsIDB4ODBDQywgMHg4MERBLCAweDg4RjQsIDB4ODhGNSwgMHg4OTE5LAotICAgIDB4OENFMCwgMHg4RjI5LCAweDkxNEQsIDB4OTY2QSwgMHg0RjJGLCAweDRGNzAsIDB4NUUxQiwgMHg2N0NGLAotICAgIDB4NjgyMiwgMHg3NjdELCAweDc2N0UsIDB4OUI0NCwgMHg1RTYxLCAweDZBMEEsIDB4NzE2OSwgMHg3MUQ0LAotICAgIDB4NzU2QSwgMHg3RTQxLCAweDg1NDMsIDB4ODVFOSwgMHg5OERDLCAweDRGMTAsIDB4N0I0RiwgMHg3RjcwLAotICAgIDB4OTVBNSwgMHg1MUUxLCAweDVFMDYsIDB4NjhCNSwgMHg2QzNFLCAweDZDNEUsIDB4NkNEQiwgMHg3MkFGLAotICAgIDB4N0JDNCwgMHg4MzAzLCAweDZDRDUsIDB4NzQzQSwgMHg1MEZCLCAweDUyODgsIDB4NThDMSwgMHg2NEQ4LAotICAgIDB4NkE5NywgMHg3NEE3LCAweDc2NTYsIDB4NzhBNywgMHg4NjE3LCAweDk1RTIsIDB4OTczOSwgMHg1MzVFLAotICAgIDB4NUYwMSwgMHg4QjhBLCAweDhGQTgsIDB4OEZBRiwgMHg5MDhBLCAweDUyMjUsIDB4NzdBNSwgMHg5QzQ5LAotICAgIDB4OUYwOCwgMHg0RTE5LCAweDUwMDIsIDB4NTE3NSwgMHg1QzVCLCAweDVFNzcsIDB4NjYxRSwgMHg2NjNBLAotICAgIDB4NjdDNCwgMHg2OEM1LCAweDcwQjMsIDB4NzUwMSwgMHg3NUM1LCAweDc5QzksIDB4N0FERCwgMHg4RjI3LAotICAgIDB4OTkyMCwgMHg5QTA4LCAweDRGREQsIDB4NTgyMSwgMHg1ODMxLCAweDVCRjYsIDB4NjY2RSwgMHg2QjY1LAotICAgIDB4NkQxMSwgMHg2RTdBLCAweDZGN0QsIDB4NzNFNCwgMHg3NTJCLCAweDgzRTksIDB4ODhEQywgMHg4OTEzLAotICAgIDB4OEI1QywgMHg4RjE0LCAweDRGMEYsIDB4NTBENSwgMHg1MzEwLCAweDUzNUMsIDB4NUI5MywgMHg1RkE5LAotICAgIDB4NjcwRCwgMHg3OThGLCAweDgxNzksIDB4ODMyRiwgMHg4NTE0LCAweDg5MDcsIDB4ODk4NiwgMHg4RjM5LAotICAgIDB4OEYzQiwgMHg5OUE1LCAweDlDMTIsIDB4NjcyQywgMHg0RTc2LCAweDRGRjgsIDB4NTk0OSwgMHg1QzAxLAotICAgIDB4NUNFRiwgMHg1Q0YwLCAweDYzNjcsIDB4NjhEMiwgMHg3MEZELCAweDcxQTIsIDB4NzQyQiwgMHg3RTJCLAotICAgIDB4ODRFQywgMHg4NzAyLCAweDkwMjIsIDB4OTJEMiwgMHg5Q0YzLCAweDRFMEQsIDB4NEVEOCwgMHg0RkVGLAotICAgIDB4NTA4NSwgMHg1MjU2LCAweDUyNkYsIDB4NTQyNiwgMHg1NDkwLCAweDU3RTAsIDB4NTkyQiwgMHg1QTY2LAotICAgIDB4NUI1QSwgMHg1Qjc1LCAweDVCQ0MsIDB4NUU5QywgMHg2Mjc2LCAweDY1NzcsIDB4NjVBNywgMHg2RDZFLAotICAgIDB4NkVBNSwgMHg3MjM2LCAweDdCMjYsIDB4N0MzRiwgMHg3RjM2LCAweDgxNTAsIDB4ODE1MSwgMHg4MTlBLAotICAgIDB4ODI0MCwgMHg4Mjk5LCAweDgzQTksIDB4OEEwMywgMHg4Q0EwLCAweDhDRTYsIDB4OENGQiwgMHg4RDc0LAotICAgIDB4OERCQSwgMHg5MEU4LCAweDkxREMsIDB4OTYxQywgMHg5NjQ0LCAweDk5RDksIDB4OUNFNywgMHg1MzE3LAotICAgIDB4NTIwNiwgMHg1NDI5LCAweDU2NzQsIDB4NThCMywgMHg1OTU0LCAweDU5NkUsIDB4NUZGRiwgMHg2MUE0LAotICAgIDB4NjI2RSwgMHg2NjEwLCAweDZDN0UsIDB4NzExQSwgMHg3NkM2LCAweDdDODksIDB4N0NERSwgMHg3RDFCLAotICAgIDB4ODJBQywgMHg4Q0MxLCAweDk2RjAsIDB4NEY1QiwgMHg1RjE3LCAweDVGN0YsIDB4NjJDMiwgMHg1RDI5LAotICAgIDB4NjcwQiwgMHg2OERBLCAweDc4N0MsIDB4N0U0MywgMHg5RDZDLCAweDRFMTUsIDB4NTA5OSwgMHg1MzE1LAotICAgIDB4NTMyQSwgMHg1MzUxLCAweDU5ODMsIDB4NUE2MiwgMHg1RTg3LCAweDYwQjIsIDB4NjE4QSwgMHg2MjQ5LAotICAgIDB4NjI3OSwgMHg2NTkwLCAweDY3ODcsIDB4NjlBNywgMHg2QkQ0LCAweDZCRDYsIDB4NkJENywgMHg2QkQ4LAotICAgIDB4NkNCOCwgMHg3NDM1LCAweDc1RkEsIDB4NzgxMiwgMHg3ODkxLCAweDc5RDUsIDB4NzlEOCwgMHg3QzgzLAotICAgIDB4N0RDQiwgMHg3RkUxLCAweDgwQTUsIDB4ODEzRSwgMHg4MUMyLCAweDgzRjIsIDB4ODcxQSwgMHg4OEU4LAotICAgIDB4OEFCOSwgMHg4QjZDLCAweDhDQkIsIDB4OTExOSwgMHg5NzVFLCAweDk4REIsIDB4OUYzQiwgMHg1NkFDLAotICAgIDB4NUIyQSwgMHg1RjZDLCAweDY1OEMsIDB4NkFCMywgMHg2QkFGLCAweDZENUMsIDB4NkZGMSwgMHg3MDE1LAotICAgIDB4NzI1RCwgMHg3M0FELCAweDhDQTcsIDB4OENEMywgMHg5ODNCLCAweDYxOTEsIDB4NkMzNywgMHg4MDU4LAotICAgIDB4OUEwMSwgMHg0RTRELCAweDRFOEIsIDB4NEU5QiwgMHg0RUQ1LCAweDRGM0EsIDB4NEYzQywgMHg0RjdGLAotICAgIDB4NEZERiwgMHg1MEZGLCAweDUzRjIsIDB4NTNGOCwgMHg1NTA2LCAweDU1RTMsIDB4NTZEQiwgMHg1OEVCLAotICAgIDB4NTk2MiwgMHg1QTExLCAweDVCRUIsIDB4NUJGQSwgMHg1QzA0LCAweDVERjMsIDB4NUUyQiwgMHg1Rjk5LAotICAgIDB4NjAxRCwgMHg2MzY4LCAweDY1OUMsIDB4NjVBRiwgMHg2N0Y2LCAweDY3RkIsIDB4NjhBRCwgMHg2QjdCLAotICAgIDB4NkM5OSwgMHg2Q0Q3LCAweDZFMjMsIDB4NzAwOSwgMHg3MzQ1LCAweDc4MDIsIDB4NzkzRSwgMHg3OTQwLAotICAgIDB4Nzk2MCwgMHg3OUMxLCAweDdCRTksIDB4N0QxNywgMHg3RDcyLCAweDgwODYsIDB4ODIwRCwgMHg4MzhFLAotICAgIDB4ODREMSwgMHg4NkM3LCAweDg4REYsIDB4OEE1MCwgMHg4QTVFLCAweDhCMUQsIDB4OENEQywgMHg4RDY2LAotICAgIDB4OEZBRCwgMHg5MEFBLCAweDk4RkMsIDB4OTlERiwgMHg5RTlELCAweDUyNEEsIDB4NjcxNCwgMHg1MDk4LAotICAgIDB4NTIyQSwgMHg1QzcxLCAweDY1NjMsIDB4NkM1NSwgMHg3M0NBLCAweDc1MjMsIDB4NzU5RCwgMHg3Qjk3LAotICAgIDB4ODQ5QywgMHg5MTc4LCAweDk3MzAsIDB4NEU3NywgMHg2NDkyLCAweDZCQkEsIDB4NzE1RSwgMHg4NUE5LAotICAgIDB4NEUwOSwgMHg2NzQ5LCAweDY4RUUsIDB4NkUxNywgMHg4MjlGLCAweDg1MTgsIDB4ODg2QiwgMHg2M0Y3LAotICAgIDB4NkY4MSwgMHg5MjEyLCAweDk4QUYsIDB4NEUwQSwgMHg1MEI3LCAweDUwQ0YsIDB4NTExRiwgMHg1NTQ2LAotICAgIDB4NTVBQSwgMHg1NjE3LCAweDVCNDAsIDB4NUMxOSwgMHg1Q0UwLCAweDVFMzgsIDB4NUU4QSwgMHg1RUEwLAotICAgIDB4NUVDMiwgMHg2MEYzLCAweDY4NTEsIDB4NkE2MSwgMHg2RTU4LCAweDcyM0QsIDB4NzI0MCwgMHg3MkMwLAotICAgIDB4NzZGOCwgMHg3OTY1LCAweDdCQjEsIDB4N0ZENCwgMHg4OEYzLCAweDg5RjQsIDB4OEE3MywgMHg4QzYxLAotICAgIDB4OENERSwgMHg5NzFDLCAweDU4NUUsIDB4NzRCRCwgMHg4Q0ZELCAweDU1QzcsIDB4N0E2MSwgMHg3RDIyLAotICAgIDB4ODI3MiwgMHg3MjcyLCAweDc1MUYsIDB4NzUyNSwgMHg3QjE5LCAweDU4ODUsIDB4NThGQiwgMHg1REJDLAotICAgIDB4NUU4RiwgMHg1RUI2LCAweDVGOTAsIDB4NjA1NSwgMHg2MjkyLCAweDYzN0YsIDB4NjU0RCwgMHg2NjkxLAotICAgIDB4NjZEOSwgMHg2NkY4LCAweDY4MTYsIDB4NjhGMiwgMHg3MjgwLCAweDc0NUUsIDB4N0I2RSwgMHg3RDZFLAotICAgIDB4N0RENiwgMHg3RjcyLCAweDgwRTUsIDB4ODIxMiwgMHg4NUFGLCAweDg5N0YsIDB4OEE5MywgMHg5MDFELAotICAgIDB4OTJFNCwgMHg5RUNELCAweDlGMjAsIDB4NTkxNSwgMHg1OTZELCAweDVFMkQsIDB4NjBEQywgMHg2NjE0LAotICAgIDB4NjY3MywgMHg2NzkwLCAweDZDNTAsIDB4NkRDNSwgMHg2RjVGLCAweDc3RjMsIDB4NzhBOSwgMHg4NEM2LAotICAgIDB4OTFDQiwgMHg5MzJCLCAweDRFRDksIDB4NTBDQSwgMHg1MTQ4LCAweDU1ODQsIDB4NUIwQiwgMHg1QkEzLAotICAgIDB4NjI0NywgMHg2NTdFLCAweDY1Q0IsIDB4NkUzMiwgMHg3MTdELCAweDc0MDEsIDB4NzQ0NCwgMHg3NDg3LAotICAgIDB4NzRCRiwgMHg3NjZDLCAweDc5QUEsIDB4N0REQSwgMHg3RTU1LCAweDdGQTgsIDB4ODE3QSwgMHg4MUIzLAotICAgIDB4ODIzOSwgMHg4NjFBLCAweDg3RUMsIDB4OEE3NSwgMHg4REUzLCAweDkwNzgsIDB4OTI5MSwgMHg5NDI1LAotICAgIDB4OTk0RCwgMHg5QkFFLCAweDUzNjgsIDB4NUM1MSwgMHg2OTU0LCAweDZDQzQsIDB4NkQyOSwgMHg2RTJCLAotICAgIDB4ODIwQywgMHg4NTlCLCAweDg5M0IsIDB4OEEyRCwgMHg4QUFBLCAweDk2RUEsIDB4OUY2NywgMHg1MjYxLAotICAgIDB4NjZCOSwgMHg2QkIyLCAweDdFOTYsIDB4ODdGRSwgMHg4RDBELCAweDk1ODMsIDB4OTY1RCwgMHg2NTFELAotICAgIDB4NkQ4OSwgMHg3MUVFLCAweDU3Q0UsIDB4NTlEMywgMHg1QkFDLCAweDYwMjcsIDB4NjBGQSwgMHg2MjEwLAotICAgIDB4NjYxRiwgMHg2NjVGLCAweDczMjksIDB4NzNGOSwgMHg3NkRCLCAweDc3MDEsIDB4N0I2QywgMHg4MDU2LAotICAgIDB4ODA3MiwgMHg4MTY1LCAweDhBQTAsIDB4OTE5MiwgMHg0RTE2LCAweDUyRTIsIDB4NkI3MiwgMHg2RDE3LAotICAgIDB4N0EwNSwgMHg3QjM5LCAweDdEMzAsIDB4OENCMCwgMHg1M0VDLCAweDU2MkYsIDB4NTg1MSwgMHg1QkI1LAotICAgIDB4NUMwRiwgMHg1QzExLCAweDVERTIsIDB4NjI0MCwgMHg2MzgzLCAweDY0MTQsIDB4NjYyRCwgMHg2OEIzLAotICAgIDB4NkNCQywgMHg2RDg4LCAweDZFQUYsIDB4NzAxRiwgMHg3MEE0LCAweDcxRDIsIDB4NzUyNiwgMHg3NThGLAotICAgIDB4NzU4RSwgMHg3NjE5LCAweDdCMTEsIDB4N0JFMCwgMHg3QzJCLCAweDdEMjAsIDB4N0QzOSwgMHg4NTJDLAotICAgIDB4ODU2RCwgMHg4NjA3LCAweDhBMzQsIDB4OTAwRCwgMHg5MDYxLCAweDkwQjUsIDB4OTJCNywgMHg5N0Y2LAotICAgIDB4OUEzNywgMHg0RkQ3LCAweDVDNkMsIDB4Njc1RiwgMHg2RDkxLCAweDdDOUYsIDB4N0U4QywgMHg4QjE2LAotICAgIDB4OEQxNiwgMHg5MDFGLCAweDVCNkIsIDB4NURGRCwgMHg2NDBELCAweDg0QzAsIDB4OTA1QywgMHg5OEUxLAotICAgIDB4NzM4NywgMHg1QjhCLCAweDYwOUEsIDB4Njc3RSwgMHg2RERFLCAweDhBMUYsIDB4OEFBNiwgMHg5MDAxLAotICAgIDB4OTgwQywgMHg1MjM3LCAweDcwNTEsIDB4Nzg4RSwgMHg5Mzk2LCAweDg4NzAsIDB4OTFENywgMHg0RkVFLAotICAgIDB4NTNENywgMHg1NUZELCAweDU2REEsIDB4NTc4MiwgMHg1OEZELCAweDVBQzIsIDB4NUI4OCwgMHg1Q0FCLAotICAgIDB4NUNDMCwgMHg1RTI1LCAweDYxMDEsIDB4NjIwRCwgMHg2MjRCLCAweDYzODgsIDB4NjQxQywgMHg2NTM2LAotICAgIDB4NjU3OCwgMHg2QTM5LCAweDZCOEEsIDB4NkMzNCwgMHg2RDE5LCAweDZGMzEsIDB4NzFFNywgMHg3MkU5LAotICAgIDB4NzM3OCwgMHg3NDA3LCAweDc0QjIsIDB4NzYyNiwgMHg3NzYxLCAweDc5QzAsIDB4N0E1NywgMHg3QUVBLAotICAgIDB4N0NCOSwgMHg3RDhGLCAweDdEQUMsIDB4N0U2MSwgMHg3RjlFLCAweDgxMjksIDB4ODMzMSwgMHg4NDkwLAotICAgIDB4ODREQSwgMHg4NUVBLCAweDg4OTYsIDB4OEFCMCwgMHg4QjkwLCAweDhGMzgsIDB4OTA0MiwgMHg5MDgzLAotICAgIDB4OTE2QywgMHg5Mjk2LCAweDkyQjksIDB4OTY4QiwgMHg5NkE3LCAweDk2QTgsIDB4OTZENiwgMHg5NzAwLAotICAgIDB4OTgwOCwgMHg5OTk2LCAweDlBRDMsIDB4OUIxQSwgMHg1M0Q0LCAweDU4N0UsIDB4NTkxOSwgMHg1QjcwLAotICAgIDB4NUJCRiwgMHg2REQxLCAweDZGNUEsIDB4NzE5RiwgMHg3NDIxLCAweDc0QjksIDB4ODA4NSwgMHg4M0ZELAotICAgIDB4NURFMSwgMHg1Rjg3LCAweDVGQUEsIDB4NjA0MiwgMHg2NUVDLCAweDY4MTIsIDB4Njk2RiwgMHg2QTUzLAotICAgIDB4NkI4OSwgMHg2RDM1LCAweDZERjMsIDB4NzNFMywgMHg3NkZFLCAweDc3QUMsIDB4N0I0RCwgMHg3RDE0LAotICAgIDB4ODEyMywgMHg4MjFDLCAweDgzNDAsIDB4ODRGNCwgMHg4NTYzLCAweDhBNjIsIDB4OEFDNCwgMHg5MTg3LAotICAgIDB4OTMxRSwgMHg5ODA2LCAweDk5QjQsIDB4NjIwQywgMHg4ODUzLCAweDhGRjAsIDB4OTI2NSwgMHg1RDA3LAotICAgIDB4NUQyNywgMHg1RDY5LCAweDc0NUYsIDB4ODE5RCwgMHg4NzY4LCAweDZGRDUsIDB4NjJGRSwgMHg3RkQyLAotICAgIDB4ODkzNiwgMHg4OTcyLCAweDRFMUUsIDB4NEU1OCwgMHg1MEU3LCAweDUyREQsIDB4NTM0NywgMHg2MjdGLAotICAgIDB4NjYwNywgMHg3RTY5LCAweDg4MDUsIDB4OTY1RSwgMHg0RjhELCAweDUzMTksIDB4NTYzNiwgMHg1OUNCLAotICAgIDB4NUFBNCwgMHg1QzM4LCAweDVDNEUsIDB4NUM0RCwgMHg1RTAyLCAweDVGMTEsIDB4NjA0MywgMHg2NUJELAotICAgIDB4NjYyRiwgMHg2NjQyLCAweDY3QkUsIDB4NjdGNCwgMHg3MzFDLCAweDc3RTIsIDB4NzkzQSwgMHg3RkM1LAotICAgIDB4ODQ5NCwgMHg4NENELCAweDg5OTYsIDB4OEE2NiwgMHg4QTY5LCAweDhBRTEsIDB4OEM1NSwgMHg4QzdBLAotICAgIDB4NTdGNCwgMHg1QkQ0LCAweDVGMEYsIDB4NjA2RiwgMHg2MkVELCAweDY5MEQsIDB4NkI5NiwgMHg2RTVDLAotICAgIDB4NzE4NCwgMHg3QkQyLCAweDg3NTUsIDB4OEI1OCwgMHg4RUZFLCAweDk4REYsIDB4OThGRSwgMHg0RjM4LAotICAgIDB4NEY4MSwgMHg0RkUxLCAweDU0N0IsIDB4NUEyMCwgMHg1QkI4LCAweDYxM0MsIDB4NjVCMCwgMHg2NjY4LAotICAgIDB4NzFGQywgMHg3NTMzLCAweDc5NUUsIDB4N0QzMywgMHg4MTRFLCAweDgxRTMsIDB4ODM5OCwgMHg4NUFBLAotICAgIDB4ODVDRSwgMHg4NzAzLCAweDhBMEEsIDB4OEVBQiwgMHg4RjlCLCAweDhGQzUsIDB4NTkzMSwgMHg1QkE0LAotICAgIDB4NUJFNiwgMHg2MDg5LCAweDVCRTksIDB4NUMwQiwgMHg1RkMzLCAweDZDODEsIDB4NkRGMSwgMHg3MDBCLAotICAgIDB4NzUxQSwgMHg4MkFGLCAweDhBRjYsIDB4NEVDMCwgMHg1MzQxLCAweDk2RDksIDB4NkMwRiwgMHg0RTlFLAotICAgIDB4NEZDNCwgMHg1MTUyLCAweDU1NUUsIDB4NUEyNSwgMHg1Q0U4LCAweDYyMTEsIDB4NzI1OSwgMHg4MkJELAotICAgIDB4ODNBQSwgMHg4NkZFLCAweDg4NTksIDB4OEExRCwgMHg5NjNGLCAweDk2QzUsIDB4OTkxMywgMHg5RDA5LAotICAgIDB4OUQ1RCwgMHg1ODBBLCAweDVDQjMsIDB4NURCRCwgMHg1RTQ0LCAweDYwRTEsIDB4NjExNSwgMHg2M0UxLAotICAgIDB4NkEwMiwgMHg2RTI1LCAweDkxMDIsIDB4OTM1NCwgMHg5ODRFLCAweDlDMTAsIDB4OUY3NywgMHg1Qjg5LAotICAgIDB4NUNCOCwgMHg2MzA5LCAweDY2NEYsIDB4Njg0OCwgMHg3NzNDLCAweDk2QzEsIDB4OTc4RCwgMHg5ODU0LAotICAgIDB4OUI5RiwgMHg2NUExLCAweDhCMDEsIDB4OEVDQiwgMHg5NUJDLCAweDU1MzUsIDB4NUNBOSwgMHg1REQ2LAotICAgIDB4NUVCNSwgMHg2Njk3LCAweDc2NEMsIDB4ODNGNCwgMHg5NUM3LCAweDU4RDMsIDB4NjJCQywgMHg3MkNFLAotICAgIDB4OUQyOCwgMHg0RUYwLCAweDU5MkUsIDB4NjAwRiwgMHg2NjNCLCAweDZCODMsIDB4NzlFNywgMHg5RDI2LAotICAgIDB4NTM5MywgMHg1NEMwLCAweDU3QzMsIDB4NUQxNiwgMHg2MTFCLCAweDY2RDYsIDB4NkRBRiwgMHg3ODhELAotICAgIDB4ODI3RSwgMHg5Njk4LCAweDk3NDQsIDB4NTM4NCwgMHg2MjdDLCAweDYzOTYsIDB4NkRCMiwgMHg3RTBBLAotICAgIDB4ODE0QiwgMHg5ODRELCAweDZBRkIsIDB4N0Y0QywgMHg5REFGLCAweDlFMUEsIDB4NEU1RiwgMHg1MDNCLAotICAgIDB4NTFCNiwgMHg1OTFDLCAweDYwRjksIDB4NjNGNiwgMHg2OTMwLCAweDcyM0EsIDB4ODAzNiwgMHg5MUNFLAotICAgIDB4NUYzMSwgMHg3RDA0LCAweDgyRTUsIDB4ODQ2RiwgMHg4NEJCLCAweDg1RTUsIDB4OEU4RCwgMHg0RjZGLAotICAgIDB4NThFNCwgMHg1QjQzLCAweDYwNTksIDB4NjNEQSwgMHg2NTE4LCAweDY1NkQsIDB4NjY5OCwgMHg2OTRBLAotICAgIDB4NkEyMywgMHg2RDBCLCAweDcwMDEsIDB4NzE2QywgMHg3NUQyLCAweDc2MEQsIDB4NzlCMywgMHg3QTcwLAotICAgIDB4N0Y4QSwgMHg4OTQ0LCAweDhCOTMsIDB4OTFDMCwgMHg5NjdELCAweDk5MEEsIDB4NTcwNCwgMHg1RkExLAotICAgIDB4NjVCQywgMHg2RjAxLCAweDc2MDAsIDB4NzlBNiwgMHg4QTlFLCAweDk5QUQsIDB4OUI1QSwgMHg5RjZDLAotICAgIDB4NTEwNCwgMHg2MUI2LCAweDYyOTEsIDB4NkE4RCwgMHg4MUM2LCAweDUwNDMsIDB4NTgzMCwgMHg1RjY2LAotICAgIDB4NzEwOSwgMHg4QTAwLCAweDhBRkEsIDB4NUI3QywgMHg4NjE2LCAweDRGRkEsIDB4NTEzQywgMHg1NkI0LAotICAgIDB4NTk0NCwgMHg2M0E5LCAweDZERjksIDB4NURBQSwgMHg2OTZELCAweDUxODYsIDB4NEU4OCwgMHg0RjU5LAotICAgIDB4NTk4MiwgMHg2QjVGLCAweDZDNUQsIDB4NzRCNSwgMHg3OTE2LCAweDgyMDcsIDB4ODI0NSwgMHg4MzM5LAotICAgIDB4OEYzRiwgMHg4RjVELCAweDk5MTgsIDB4NEVBNiwgMHg1N0RGLCAweDVGNzksIDB4NjYxMywgMHg3NUFCLAotICAgIDB4N0U3OSwgMHg4QjZGLCAweDkwMDYsIDB4OUE1QiwgMHg1NkE1LCAweDU4MjcsIDB4NTlGOCwgMHg1QTFGLAotICAgIDB4NUJCNCwgMHg1RUY2LCAweDYzNTAsIDB4NjMzQiwgMHg2OTNELCAweDZDODcsIDB4NkNCRiwgMHg2RDhFLAotICAgIDB4NkQ5MywgMHg2REY1LCAweDZGMTQsIDB4NzBERiwgMHg3MTM2LCAweDcxNTksIDB4NzFDMywgMHg3MUQ1LAotICAgIDB4Nzg0RiwgMHg3ODZGLCAweDdCNzUsIDB4N0RFMywgMHg3RTJGLCAweDg4NEQsIDB4OEVERiwgMHg5MjVCLAotICAgIDB4OUNGNiwgMHg2MDg1LCAweDZEODUsIDB4NzFCMSwgMHg5NUIxLCAweDUzQUQsIDB4NjdEMywgMHg3MDhFLAotICAgIDB4NzEzMCwgMHg3NDMwLCAweDgyNzYsIDB4ODJEMiwgMHg5NUJCLCAweDlBRTUsIDB4OUU3RCwgMHg2NkM0LAotICAgIDB4NzFDMSwgMHg4NDQ5LCAweDU4NEIsIDB4NURCOCwgMHg1RjcxLCAweDY2MjAsIDB4NjY4RSwgMHg2OTc5LAotICAgIDB4NjlBRSwgMHg2QzM4LCAweDZDRjMsIDB4NkUzNiwgMHg2RjQxLCAweDZGREEsIDB4NzAxQiwgMHg3MDJGLAotICAgIDB4NzE1MCwgMHg3MURGLCAweDczNzAsIDB4NzQ1QiwgMHg3NEQ0LCAweDc2QzgsIDB4N0E0RSwgMHg3RTkzLAotICAgIDB4ODJGMSwgMHg4QTYwLCAweDhGQ0UsIDB4OTM0OCwgMHg5NzE5LCAweDRFNDIsIDB4NTAyQSwgMHg1MjA4LAotICAgIDB4NTNFMSwgMHg2NkYzLCAweDZDNkQsIDB4NkZDQSwgMHg3MzBBLCAweDc3N0YsIDB4N0E2MiwgMHg4MkFFLAotICAgIDB4ODVERCwgMHg4NjAyLCAweDg4RDQsIDB4OEE2MywgMHg4QjdELCAweDhDNkIsIDB4OTJCMywgMHg5NzEzLAotICAgIDB4OTgxMCwgMHg0RTk0LCAweDRGMEQsIDB4NEZDOSwgMHg1MEIyLCAweDUzNDgsIDB4NTQzRSwgMHg1NDMzLAotICAgIDB4NTVEQSwgMHg1ODYyLCAweDU4QkEsIDB4NTk2NywgMHg1QTFCLCAweDVCRTQsIDB4NjA5RiwgMHg2MUNBLAotICAgIDB4NjU1NiwgMHg2NUZGLCAweDY2NjQsIDB4NjhBNywgMHg2QzVBLCAweDZGQjMsIDB4NzBDRiwgMHg3MUFDLAotICAgIDB4NzM1MiwgMHg3QjdELCAweDg3MDgsIDB4OEFBNCwgMHg5QzMyLCAweDlGMDcsIDB4NUM0QiwgMHg2QzgzLAotICAgIDB4NzM0NCwgMHg3Mzg5LCAweDkyM0EsIDB4NkVBQiwgMHg3NDY1LCAweDc2MUYsIDB4N0E2OSwgMHg3RTE1LAotICAgIDB4ODYwQSwgMHg1MTQwLCAweDU4QzUsIDB4NjRDMSwgMHg3NEVFLCAweDc1MTUsIDB4NzY3MCwgMHg3RkMxLAotICAgIDB4OTA5NSwgMHg5NkNELCAweDk5NTQsIDB4NkUyNiwgMHg3NEU2LCAweDdBQTksIDB4N0FBQSwgMHg4MUU1LAotICAgIDB4ODZEOSwgMHg4Nzc4LCAweDhBMUIsIDB4NUE0OSwgMHg1QjhDLCAweDVCOUIsIDB4NjhBMSwgMHg2OTAwLAotICAgIDB4NkQ2MywgMHg3M0E5LCAweDc0MTMsIDB4NzQyQywgMHg3ODk3LCAweDdERTksIDB4N0ZFQiwgMHg4MTE4LAotICAgIDB4ODE1NSwgMHg4MzlFLCAweDhDNEMsIDB4OTYyRSwgMHg5ODExLCAweDY2RjAsIDB4NUY4MCwgMHg2NUZBLAotICAgIDB4Njc4OSwgMHg2QzZBLCAweDczOEIsIDB4NTAyRCwgMHg1QTAzLCAweDZCNkEsIDB4NzdFRSwgMHg1OTE2LAotICAgIDB4NUQ2QywgMHg1RENELCAweDczMjUsIDB4NzU0RiwgMHg1MEU1LCAweDUxRjksIDB4NTgyRiwgMHg1OTJELAotICAgIDB4NTk5NiwgMHg1OURBLCAweDVCRTUsIDB4NURBMiwgMHg2MkQ3LCAweDY0MTYsIDB4NjQ5MywgMHg2NEZFLAotICAgIDB4NjZEQywgMHg2QTQ4LCAweDcxRkYsIDB4NzQ2NCwgMHg3QTg4LCAweDdBQUYsIDB4N0U0NywgMHg3RTVFLAotICAgIDB4ODAwMCwgMHg4MTcwLCAweDg3RUYsIDB4ODk4MSwgMHg4QjIwLCAweDkwNTksIDB4OTA4MCwgMHg5OTUyLAotICAgIDB4NjE3RSwgMHg2QjMyLCAweDZENzQsIDB4N0UxRiwgMHg4OTI1LCAweDhGQjEsIDB4NEZEMSwgMHg1MEFELAotICAgIDB4NTE5NywgMHg1MkM3LCAweDU3QzcsIDB4NTg4OSwgMHg1QkI5LCAweDVFQjgsIDB4NjE0MiwgMHg2OTk1LAotICAgIDB4NkQ4QywgMHg2RTY3LCAweDZFQjYsIDB4NzE5NCwgMHg3NDYyLCAweDc1MjgsIDB4NzUyQywgMHg4MDczLAotICAgIDB4ODMzOCwgMHg4NEM5LCAweDhFMEEsIDB4OTM5NCwgMHg5M0RFLCAweDRFOEUsIDB4NEY1MSwgMHg1MDc2LAotICAgIDB4NTEyQSwgMHg1M0M4LCAweDUzQ0IsIDB4NTNGMywgMHg1Qjg3LCAweDVCRDMsIDB4NUMyNCwgMHg2MTFBLAotICAgIDB4NjE4MiwgMHg2NUY0LCAweDcyNUIsIDB4NzM5NywgMHg3NDQwLCAweDc2QzIsIDB4Nzk1MCwgMHg3OTkxLAotICAgIDB4NzlCOSwgMHg3RDA2LCAweDdGQkQsIDB4ODI4QiwgMHg4NUQ1LCAweDg2NUUsIDB4OEZDMiwgMHg5MDQ3LAotICAgIDB4OTBGNSwgMHg5MUVBLCAweDk2ODUsIDB4OTZFOCwgMHg5NkU5LCAweDUyRDYsIDB4NUY2NywgMHg2NUVELAotICAgIDB4NjYzMSwgMHg2ODJGLCAweDcxNUMsIDB4N0EzNiwgMHg5MEMxLCAweDk4MEEsIDB4NEU5MSwgMHg2QTUyLAotICAgIDB4NkI5RSwgMHg2RjkwLCAweDcxODksIDB4ODAxOCwgMHg4MkI4LCAweDg1NTMsIDB4OTA0QiwgMHg5Njk1LAotICAgIDB4OTZGMiwgMHg5N0ZCLCAweDg1MUEsIDB4OUIzMSwgMHg0RTkwLCAweDcxOEEsIDB4OTZDNCwgMHg1MTQzLAotICAgIDB4NTM5RiwgMHg1NEUxLCAweDU3MTMsIDB4NTcxMiwgMHg1N0EzLCAweDVBOUIsIDB4NUFDNCwgMHg1QkMzLAotICAgIDB4NjAyOCwgMHg2MTNGLCAweDYzRjQsIDB4NkM4NSwgMHg2RDM5LCAweDZFNzIsIDB4NkU5MCwgMHg3MjMwLAotICAgIDB4NzMzRiwgMHg3NDU3LCAweDgyRDEsIDB4ODg4MSwgMHg4RjQ1LCAweDkwNjAsIDB4OTY2MiwgMHg5ODU4LAotICAgIDB4OUQxQiwgMHg2NzA4LCAweDhEOEEsIDB4OTI1RSwgMHg0RjRELCAweDUwNDksIDB4NTBERSwgMHg1MzcxLAotICAgIDB4NTcwRCwgMHg1OUQ0LCAweDVBMDEsIDB4NUMwOSwgMHg2MTcwLCAweDY2OTAsIDB4NkUyRCwgMHg3MjMyLAotICAgIDB4NzQ0QiwgMHg3REVGLCAweDgwQzMsIDB4ODQwRSwgMHg4NDY2LCAweDg1M0YsIDB4ODc1RiwgMHg4ODVCLAotICAgIDB4ODkxOCwgMHg4QjAyLCAweDkwNTUsIDB4OTdDQiwgMHg5QjRGLCAweDRFNzMsIDB4NEY5MSwgMHg1MTEyLAotICAgIDB4NTE2QSwgMHg1NTJGLCAweDU1QTksIDB4NUI3QSwgMHg1QkE1LCAweDVFN0MsIDB4NUU3RCwgMHg1RUJFLAotICAgIDB4NjBBMCwgMHg2MERGLCAweDYxMDgsIDB4NjEwOSwgMHg2M0M0LCAweDY1MzgsIDB4NjcwOSwgMHg2N0Q0LAotICAgIDB4NjdEQSwgMHg2OTYxLCAweDY5NjIsIDB4NkNCOSwgMHg2RDI3LCAweDZFMzgsIDB4NkZFMSwgMHg3MzM2LAotICAgIDB4NzMzNywgMHg3NDVDLCAweDc1MzEsIDB4NzY1MiwgMHg3REFELCAweDgxRkUsIDB4ODQzOCwgMHg4OEQ1LAotICAgIDB4OEE5OCwgMHg4QURCLCAweDhBRUQsIDB4OEUzMCwgMHg4RTQyLCAweDkwNEEsIDB4OTAzRSwgMHg5MDdBLAotICAgIDB4OTE0OSwgMHg5MUM5LCAweDkzNkUsIDB4NTgwOSwgMHg2QkQzLCAweDgwODksIDB4ODBCMiwgMHg1MTQxLAotICAgIDB4NTk2QiwgMHg1QzM5LCAweDZGNjQsIDB4NzNBNywgMHg4MEU0LCAweDhEMDcsIDB4OTIxNywgMHg5NThGLAotICAgIDB4ODA3RiwgMHg2MjBFLCAweDcwMUMsIDB4N0Q2OCwgMHg4NzhELCAweDU3QTAsIDB4NjA2OSwgMHg2MTQ3LAotICAgIDB4NkJCNywgMHg4QUJFLCAweDkyODAsIDB4OTZCMSwgMHg0RTU5LCAweDU0MUYsIDB4NkRFQiwgMHg4NTJELAotICAgIDB4OTY3MCwgMHg5N0YzLCAweDk4RUUsIDB4NjNENiwgMHg2Q0UzLCAweDkwOTEsIDB4NTFERCwgMHg2MUM5LAotICAgIDB4ODFCQSwgMHg5REY5LCAweDRGOUQsIDB4NTAxQSwgMHg1MTAwLCAweDVCOUMsIDB4NjEwRiwgMHg2MUZGLAotICAgIDB4NjRFQywgMHg2OTA1LCAweDZCQzUsIDB4NzU5MSwgMHg3N0UzLCAweDdGQTksIDB4ODI2NCwgMHg4NThGLAotICAgIDB4ODdGQiwgMHg4ODYzLCAweDhBQkMsIDB4OEI3MCwgMHg5MUFCLCAweDRFOEMsIDB4NEVFNSwgMHg0RjBBLAotICAgIDB4NTkzNywgMHg1OUU4LCAweDVERjIsIDB4NUYxQiwgMHg1RjVCLCAweDYwMjEsIDB4NzIzRSwgMHg3M0U1LAotICAgIDB4NzU3MCwgMHg3NUNELCAweDc5RkIsIDB4ODAwQywgMHg4MDMzLCAweDgwODQsIDB4ODJFMSwgMHg4MzUxLAotICAgIDB4OENCRCwgMHg4Q0IzLCAweDkwODcsIDB4OThGNCwgMHg5OTBDLCAweDcwMzcsIDB4NzZDQSwgMHg3RkNBLAotICAgIDB4N0ZDQywgMHg3RkZDLCAweDhCMUEsIDB4NEVCQSwgMHg0RUMxLCAweDUyMDMsIDB4NTM3MCwgMHg1NEJELAotICAgIDB4NTZFMCwgMHg1OUZCLCAweDVCQzUsIDB4NUYxNSwgMHg1RkNELCAweDZFNkUsIDB4N0Q2QSwgMHg4MzM1LAotICAgIDB4ODY5MywgMHg4QThELCAweDk3NkQsIDB4OTc3NywgMHg0RTAwLCAweDRGNUEsIDB4NEY3RSwgMHg1OEY5LAotICAgIDB4NjVFNSwgMHg2RUEyLCAweDkwMzgsIDB4OTNCMCwgMHg5OUI5LCAweDRFRkIsIDB4NThFQywgMHg1OThBLAotICAgIDB4NTlEOSwgMHg2MDQxLCAweDdBMTQsIDB4ODM0RiwgMHg4Q0MzLCAweDUxNjUsIDB4NTM0NCwgMHg0RUNELAotICAgIDB4NTI2OSwgMHg1QjU1LCAweDgyQkYsIDB4NEVENCwgMHg1MjNBLCAweDU0QTgsIDB4NTlDOSwgMHg1OUZGLAotICAgIDB4NUI1MCwgMHg1QjU3LCAweDVCNUMsIDB4NjA2MywgMHg2MTQ4LCAweDZFQ0IsIDB4NzA5OSwgMHg3MTZFLAotICAgIDB4NzM4NiwgMHg3NEY3LCAweDc1QjUsIDB4NzhDMSwgMHg3RDJCLCAweDgwMDUsIDB4ODFFQSwgMHg4MzI4LAotICAgIDB4ODUxNywgMHg4NUM5LCAweDhBRUUsIDB4OENDNywgMHg5NkNDLCAweDRGNUMsIDB4NTJGQSwgMHg1NkJDLAotICAgIDB4NjVBQiwgMHg2NjI4LCAweDcwN0MsIDB4NzBCOCwgMHg3MjM1LCAweDdEQkQsIDB4ODI4RCwgMHg5MTRDLAotICAgIDB4OTZDMCwgMHg5RDcyLCAweDVCNzEsIDB4NjhFNywgMHg2Qjk4LCAweDZGN0EsIDB4NzZERSwgMHg1QzkxLAotICAgIDB4NjZBQiwgMHg2RjVCLCAweDdCQjQsIDB4N0MyQSwgMHg4ODM2LCAweDk2REMsIDB4NEUwOCwgMHg0RUQ3LAotICAgIDB4NTMyMCwgMHg1ODM0LCAweDU4QkIsIDB4NThFRiwgMHg1OTZDLCAweDVDMDcsIDB4NUUzMywgMHg1RTg0LAotICAgIDB4NUYzNSwgMHg2MzhDLCAweDY2QjIsIDB4Njc1NiwgMHg2QTFGLCAweDZBQTMsIDB4NkIwQywgMHg2RjNGLAotICAgIDB4NzI0NiwgMHg3MzUwLCAweDc0OEIsIDB4N0FFMCwgMHg3Q0E3LCAweDgxNzgsIDB4ODFERiwgMHg4MUU3LAotICAgIDB4ODM4QSwgMHg4NDZDLCAweDg1MjMsIDB4ODU5NCwgMHg4NUNGLCAweDg4REQsIDB4OEQxMywgMHg5MUFDLAotICAgIDB4OTU3NywgMHg5NjlDLCAweDUxOEQsIDB4NTRDOSwgMHg1NzI4LCAweDVCQjAsIDB4NjI0RCwgMHg2NzUwLAotICAgIDB4NjgzRCwgMHg2ODkzLCAweDZFM0QsIDB4NkVEMywgMHg3MDdELCAweDdFMjEsIDB4ODhDMSwgMHg4Q0ExLAotICAgIDB4OEYwOSwgMHg5RjRCLCAweDlGNEUsIDB4NzIyRCwgMHg3QjhGLCAweDhBQ0QsIDB4OTMxQSwgMHg0RjQ3LAotICAgIDB4NEY0RSwgMHg1MTMyLCAweDU0ODAsIDB4NTlEMCwgMHg1RTk1LCAweDYyQjUsIDB4Njc3NSwgMHg2OTZFLAotICAgIDB4NkExNywgMHg2Q0FFLCAweDZFMUEsIDB4NzJEOSwgMHg3MzJBLCAweDc1QkQsIDB4N0JCOCwgMHg3RDM1LAotICAgIDB4ODJFNywgMHg4M0Y5LCAweDg0NTcsIDB4ODVGNywgMHg4QTVCLCAweDhDQUYsIDB4OEU4NywgMHg5MDE5LAotICAgIDB4OTBCOCwgMHg5NkNFLCAweDlGNUYsIDB4NTJFMywgMHg1NDBBLCAweDVBRTEsIDB4NUJDMiwgMHg2NDU4LAotICAgIDB4NjU3NSwgMHg2RUY0LCAweDcyQzQsIDB4NzY4NCwgMHg3QTRELCAweDdCMUIsIDB4N0M0RCwgMHg3RTNFLAotICAgIDB4N0ZERiwgMHg4MzdCLCAweDhCMkIsIDB4OENDQSwgMHg4RDY0LCAweDhERTEsIDB4OEU1RiwgMHg4RkVBLAotICAgIDB4OEZGOSwgMHg5MDY5LCAweDkzRDEsIDB4NEY0MywgMHg0RjdBLCAweDUwQjMsIDB4NTE2OCwgMHg1MTc4LAotICAgIDB4NTI0RCwgMHg1MjZBLCAweDU4NjEsIDB4NTg3QywgMHg1OTYwLCAweDVDMDgsIDB4NUM1NSwgMHg1RURCLAotICAgIDB4NjA5QiwgMHg2MjMwLCAweDY4MTMsIDB4NkJCRiwgMHg2QzA4LCAweDZGQjEsIDB4NzE0RSwgMHg3NDIwLAotICAgIDB4NzUzMCwgMHg3NTM4LCAweDc1NTEsIDB4NzY3MiwgMHg3QjRDLCAweDdCOEIsIDB4N0JBRCwgMHg3QkM2LAotICAgIDB4N0U4RiwgMHg4QTZFLCAweDhGM0UsIDB4OEY0OSwgMHg5MjNGLCAweDkyOTMsIDB4OTMyMiwgMHg5NDJCLAotICAgIDB4OTZGQiwgMHg5ODVBLCAweDk4NkIsIDB4OTkxRSwgMHg1MjA3LCAweDYyMkEsIDB4NjI5OCwgMHg2RDU5LAotICAgIDB4NzY2NCwgMHg3QUNBLCAweDdCQzAsIDB4N0Q3NiwgMHg1MzYwLCAweDVDQkUsIDB4NUU5NywgMHg2RjM4LAotICAgIDB4NzBCOSwgMHg3Qzk4LCAweDk3MTEsIDB4OUI4RSwgMHg5RURFLCAweDYzQTUsIDB4NjQ3QSwgMHg4Nzc2LAotICAgIDB4NEUwMSwgMHg0RTk1LCAweDRFQUQsIDB4NTA1QywgMHg1MDc1LCAweDU0NDgsIDB4NTlDMywgMHg1QjlBLAotICAgIDB4NUU0MCwgMHg1RUFELCAweDVFRjcsIDB4NUY4MSwgMHg2MEM1LCAweDYzM0EsIDB4NjUzRiwgMHg2NTc0LAotICAgIDB4NjVDQywgMHg2Njc2LCAweDY2NzgsIDB4NjdGRSwgMHg2OTY4LCAweDZBODksIDB4NkI2MywgMHg2QzQwLAotICAgIDB4NkRDMCwgMHg2REU4LCAweDZFMUYsIDB4NkU1RSwgMHg3MDFFLCAweDcwQTEsIDB4NzM4RSwgMHg3M0ZELAotICAgIDB4NzUzQSwgMHg3NzVCLCAweDc4ODcsIDB4Nzk4RSwgMHg3QTBCLCAweDdBN0QsIDB4N0NCRSwgMHg3RDhFLAotICAgIDB4ODI0NywgMHg4QTAyLCAweDhBRUEsIDB4OEM5RSwgMHg5MTJELCAweDkxNEEsIDB4OTFEOCwgMHg5MjY2LAotICAgIDB4OTJDQywgMHg5MzIwLCAweDk3MDYsIDB4OTc1NiwgMHg5NzVDLCAweDk4MDIsIDB4OUYwRSwgMHg1MjM2LAotICAgIDB4NTI5MSwgMHg1NTdDLCAweDU4MjQsIDB4NUUxRCwgMHg1RjFGLCAweDYwOEMsIDB4NjNEMCwgMHg2OEFGLAotICAgIDB4NkZERiwgMHg3OTZELCAweDdCMkMsIDB4ODFDRCwgMHg4NUJBLCAweDg4RkQsIDB4OEFGOCwgMHg4RTQ0LAotICAgIDB4OTE4RCwgMHg5NjY0LCAweDk2OUIsIDB4OTczRCwgMHg5ODRDLCAweDlGNEEsIDB4NEZDRSwgMHg1MTQ2LAotICAgIDB4NTFDQiwgMHg1MkE5LCAweDU2MzIsIDB4NUYxNCwgMHg1RjZCLCAweDYzQUEsIDB4NjRDRCwgMHg2NUU5LAotICAgIDB4NjY0MSwgMHg2NkZBLCAweDY2RjksIDB4NjcxRCwgMHg2ODlELCAweDY4RDcsIDB4NjlGRCwgMHg2RjE1LAotICAgIDB4NkY2RSwgMHg3MTY3LCAweDcxRTUsIDB4NzIyQSwgMHg3NEFBLCAweDc3M0EsIDB4Nzk1NiwgMHg3OTVBLAotICAgIDB4NzlERiwgMHg3QTIwLCAweDdBOTUsIDB4N0M5NywgMHg3Q0RGLCAweDdENDQsIDB4N0U3MCwgMHg4MDg3LAotICAgIDB4ODVGQiwgMHg4NkE0LCAweDhBNTQsIDB4OEFCRiwgMHg4RDk5LCAweDhFODEsIDB4OTAyMCwgMHg5MDZELAotICAgIDB4OTFFMywgMHg5NjNCLCAweDk2RDUsIDB4OUNFNSwgMHg2NUNGLCAweDdDMDcsIDB4OERCMywgMHg5M0MzLAotICAgIDB4NUI1OCwgMHg1QzBBLCAweDUzNTIsIDB4NjJEOSwgMHg3MzFELCAweDUwMjcsIDB4NUI5NywgMHg1RjlFLAotICAgIDB4NjBCMCwgMHg2MTZCLCAweDY4RDUsIDB4NkREOSwgMHg3NDJFLCAweDdBMkUsIDB4N0Q0MiwgMHg3RDlDLAotICAgIDB4N0UzMSwgMHg4MTZCLCAweDhFMkEsIDB4OEUzNSwgMHg5MzdFLCAweDk0MTgsIDB4NEY1MCwgMHg1NzUwLAotICAgIDB4NURFNiwgMHg1RUE3LCAweDYzMkIsIDB4N0Y2QSwgMHg0RTNCLCAweDRGNEYsIDB4NEY4RiwgMHg1MDVBLAotICAgIDB4NTlERCwgMHg4MEM0LCAweDU0NkEsIDB4NTQ2OCwgMHg1NUZFLCAweDU5NEYsIDB4NUI5OSwgMHg1RERFLAotICAgIDB4NUVEQSwgMHg2NjVELCAweDY3MzEsIDB4NjdGMSwgMHg2ODJBLCAweDZDRTgsIDB4NkQzMiwgMHg2RTRBLAotICAgIDB4NkY4RCwgMHg3MEI3LCAweDczRTAsIDB4NzU4NywgMHg3QzRDLCAweDdEMDIsIDB4N0QyQywgMHg3REEyLAotICAgIDB4ODIxRiwgMHg4NkRCLCAweDhBM0IsIDB4OEE4NSwgMHg4RDcwLCAweDhFOEEsIDB4OEYzMywgMHg5MDMxLAotICAgIDB4OTE0RSwgMHg5MTUyLCAweDk0NDQsIDB4OTlEMCwgMHg3QUY5LCAweDdDQTUsIDB4NEZDQSwgMHg1MTAxLAotICAgIDB4NTFDNiwgMHg1N0M4LCAweDVCRUYsIDB4NUNGQiwgMHg2NjU5LCAweDZBM0QsIDB4NkQ1QSwgMHg2RTk2LAotICAgIDB4NkZFQywgMHg3MTBDLCAweDc1NkYsIDB4N0FFMywgMHg4ODIyLCAweDkwMjEsIDB4OTA3NSwgMHg5NkNCLAotICAgIDB4OTlGRiwgMHg4MzAxLCAweDRFMkQsIDB4NEVGMiwgMHg4ODQ2LCAweDkxQ0QsIDB4NTM3RCwgMHg2QURCLAotICAgIDB4Njk2QiwgMHg2QzQxLCAweDg0N0EsIDB4NTg5RSwgMHg2MThFLCAweDY2RkUsIDB4NjJFRiwgMHg3MERELAotICAgIDB4NzUxMSwgMHg3NUM3LCAweDdFNTIsIDB4ODRCOCwgMHg4QjQ5LCAweDhEMDgsIDB4NEU0QiwgMHg1M0VBLAotICAgIDB4NTRBQiwgMHg1NzMwLCAweDU3NDAsIDB4NUZENywgMHg2MzAxLCAweDYzMDcsIDB4NjQ2RiwgMHg2NTJGLAotICAgIDB4NjVFOCwgMHg2NjdBLCAweDY3OUQsIDB4NjdCMywgMHg2QjYyLCAweDZDNjAsIDB4NkM5QSwgMHg2RjJDLAotICAgIDB4NzdFNSwgMHg3ODI1LCAweDc5NDksIDB4Nzk1NywgMHg3RDE5LCAweDgwQTIsIDB4ODEwMiwgMHg4MUYzLAotICAgIDB4ODI5RCwgMHg4MkI3LCAweDg3MTgsIDB4OEE4QywgMHg4RDA0LCAweDhEQkUsIDB4OTA3MiwgMHg3NkY0LAotICAgIDB4N0ExOSwgMHg3QTM3LCAweDdFNTQsIDB4ODA3NywgMHg1NTA3LCAweDU1RDQsIDB4NTg3NSwgMHg2MzJGLAotICAgIDB4NjQyMiwgMHg2NjQ5LCAweDY2NEIsIDB4Njg2RCwgMHg2OTlCLCAweDZCODQsIDB4NkQyNSwgMHg2RUIxLAotICAgIDB4NzNDRCwgMHg3NDY4LCAweDc0QTEsIDB4NzU1QiwgMHg3NUI5LCAweDc2RTEsIDB4NzcxRSwgMHg3NzhCLAotICAgIDB4NzlFNiwgMHg3RTA5LCAweDdFMUQsIDB4ODFGQiwgMHg4NTJGLCAweDg4OTcsIDB4OEEzQSwgMHg4Q0QxLAotICAgIDB4OEVFQiwgMHg4RkIwLCAweDkwMzIsIDB4OTNBRCwgMHg5NjYzLCAweDk2NzMsIDB4OTcwNywgMHg0Rjg0LAotICAgIDB4NTNGMSwgMHg1OUVBLCAweDVBQzksIDB4NUUxOSwgMHg2ODRFLCAweDc0QzYsIDB4NzVCRSwgMHg3OUU5LAotICAgIDB4N0E5MiwgMHg4MUEzLCAweDg2RUQsIDB4OENFQSwgMHg4RENDLCAweDhGRUQsIDB4NjU5RiwgMHg2NzE1LAotICAgIDB4NTdGNywgMHg2RjU3LCAweDdEREQsIDB4OEYyRiwgMHg5M0Y2LCAweDk2QzYsIDB4NUZCNSwgMHg2MUYyLAotICAgIDB4NkY4NCwgMHg0RTE0LCAweDRGOTgsIDB4NTAxRiwgMHg1M0M5LCAweDU1REYsIDB4NUQ2RiwgMHg1REVFLAotICAgIDB4NkIyMSwgMHg2QjY0LCAweDc4Q0IsIDB4N0I5QSwgMHg4RTQ5LCAweDhFQ0EsIDB4OTA2RSwgMHg2MzQ5LAotICAgIDB4NjQzRSwgMHg3NzQwLCAweDdBODQsIDB4OTMyRiwgMHg5NDdGLCAweDlGNkEsIDB4NjRCMCwgMHg2RkFGLAotICAgIDB4NzFFNiwgMHg3NEE4LCAweDc0REEsIDB4N0FDNCwgMHg3QzEyLCAweDdFODIsIDB4N0NCMiwgMHg3RTk4LAotICAgIDB4OEI5QSwgMHg4RDBBLCAweDk0N0QsIDB4OTkxMCwgMHg5OTRDLCAweDUyMzksIDB4NUJERiwgMHg2NEU2LAotICAgIDB4NjcyRCwgMHg3RDJFLCAweDUwRUQsIDB4NTNDMywgMHg1ODc5LCAweDYxNTgsIDB4NjE1OSwgMHg2MUZBLAotICAgIDB4NjVBQywgMHg3QUQ5LCAweDhCOTIsIDB4OEI5NiwgMHg1MDA5LCAweDUwMjEsIDB4NTI3NSwgMHg1NTMxLAotICAgIDB4NUEzQywgMHg1RUUwLCAweDVGNzAsIDB4NjEzNCwgMHg2NTVFLCAweDY2MEMsIDB4NjYzNiwgMHg2NkEyLAotICAgIDB4NjlDRCwgMHg2RUM0LCAweDZGMzIsIDB4NzMxNiwgMHg3NjIxLCAweDdBOTMsIDB4ODEzOSwgMHg4MjU5LAotICAgIDB4ODNENiwgMHg4NEJDLCAweDUwQjUsIDB4NTdGMCwgMHg1QkMwLCAweDVCRTgsIDB4NUY2OSwgMHg2M0ExLAotICAgIDB4NzgyNiwgMHg3REI1LCAweDgzREMsIDB4ODUyMSwgMHg5MUM3LCAweDkxRjUsIDB4NTE4QSwgMHg2N0Y1LAotICAgIDB4N0I1NiwgMHg4Q0FDLCAweDUxQzQsIDB4NTlCQiwgMHg2MEJELCAweDg2NTUsIDB4NTAxQywgMHg1MjU0LAotICAgIDB4NUMzQSwgMHg2MTdELCAweDYyMUEsIDB4NjJEMywgMHg2NEYyLCAweDY1QTUsIDB4NkVDQywgMHg3NjIwLAotICAgIDB4ODEwQSwgMHg4RTYwLCAweDk2NUYsIDB4OTZCQiwgMHg0RURGLCAweDUzNDMsIDB4NTU5OCwgMHg1OTI5LAotICAgIDB4NURERCwgMHg2NEM1LCAweDZDQzksIDB4NkRGQSwgMHg3Mzk0LCAweDdBN0YsIDB4ODIxQiwgMHg4NUE2LAotICAgIDB4OENFNCwgMHg4RTEwLCAweDkwNzcsIDB4OTFFNywgMHg5NUUxLCAweDk2MjEsIDB4OTdDNiwgMHg1MUY4LAotICAgIDB4NTRGMiwgMHg1NTg2LCAweDVGQjksIDB4NjRBNCwgMHg2Rjg4LCAweDdEQjQsIDB4OEYxRiwgMHg4RjRELAotICAgIDB4OTQzNSwgMHg1MEM5LCAweDVDMTYsIDB4NkNCRSwgMHg2REZCLCAweDc1MUIsIDB4NzdCQiwgMHg3QzNELAotICAgIDB4N0M2NCwgMHg4QTc5LCAweDhBQzIsIDB4NTgxRSwgMHg1OUJFLCAweDVFMTYsIDB4NjM3NywgMHg3MjUyLAotICAgIDB4NzU4QSwgMHg3NzZCLCAweDhBREMsIDB4OENCQywgMHg4RjEyLCAweDVFRjMsIDB4NjY3NCwgMHg2REY4LAotICAgIDB4ODA3RCwgMHg4M0MxLCAweDhBQ0IsIDB4OTc1MSwgMHg5QkQ2LCAweDUyNDMsIDB4NjZGRiwgMHg2RDk1LAotICAgIDB4NkVFRiwgMHg3REUwLCAweDhBRTYsIDB4OTAyRSwgMHg5MDVFLCAweDlBRDQsIDB4NTIxRCwgMHg1MjdGLAotICAgIDB4NTRFOCwgMHg2MTk0LCAweDYyODQsIDB4NjJEQiwgMHg2OEEyLCAweDY5MTIsIDB4Njk1QSwgMHg2QTM1LAotICAgIDB4NzA5MiwgMHg3MTI2LCAweDc4NUQsIDB4NzkwMSwgMHg3OTBFLCAweDc5RDIsIDB4N0EwRCwgMHg4MDk2LAotICAgIDB4ODI3OCwgMHg4MkQ1LCAweDgzNDksIDB4ODU0OSwgMHg4QzgyLCAweDhEODUsIDB4OTE2MiwgMHg5MThCLAotICAgIDB4OTFBRSwgMHg0RkMzLCAweDU2RDEsIDB4NzFFRCwgMHg3N0Q3LCAweDg3MDAsIDB4ODlGOCwgMHg1QkY4LAotICAgIDB4NUZENiwgMHg2NzUxLCAweDkwQTgsIDB4NTNFMiwgMHg1ODVBLCAweDVCRjUsIDB4NjBBNCwgMHg2MTgxLAotICAgIDB4NjQ2MCwgMHg3RTNELCAweDgwNzAsIDB4ODUyNSwgMHg5MjgzLCAweDY0QUUsIDB4NTBBQywgMHg1RDE0LAotICAgIDB4NjcwMCwgMHg1ODlDLCAweDYyQkQsIDB4NjNBOCwgMHg2OTBFLCAweDY5NzgsIDB4NkExRSwgMHg2RTZCLAotICAgIDB4NzZCQSwgMHg3OUNCLCAweDgyQkIsIDB4ODQyOSwgMHg4QUNGLCAweDhEQTgsIDB4OEZGRCwgMHg5MTEyLAotICAgIDB4OTE0QiwgMHg5MTlDLCAweDkzMTAsIDB4OTMxOCwgMHg5MzlBLCAweDk2REIsIDB4OUEzNiwgMHg5QzBELAotICAgIDB4NEUxMSwgMHg3NTVDLCAweDc5NUQsIDB4N0FGQSwgMHg3QjUxLCAweDdCQzksIDB4N0UyRSwgMHg4NEM0LAotICAgIDB4OEU1OSwgMHg4RTc0LCAweDhFRjgsIDB4OTAxMCwgMHg2NjI1LCAweDY5M0YsIDB4NzQ0MywgMHg1MUZBLAotICAgIDB4NjcyRSwgMHg5RURDLCAweDUxNDUsIDB4NUZFMCwgMHg2Qzk2LCAweDg3RjIsIDB4ODg1RCwgMHg4ODc3LAotICAgIDB4NjBCNCwgMHg4MUI1LCAweDg0MDMsIDB4OEQwNSwgMHg1M0Q2LCAweDU0MzksIDB4NTYzNCwgMHg1QTM2LAotICAgIDB4NUMzMSwgMHg3MDhBLCAweDdGRTAsIDB4ODA1QSwgMHg4MTA2LCAweDgxRUQsIDB4OERBMywgMHg5MTg5LAotICAgIDB4OUE1RiwgMHg5REYyLCAweDUwNzQsIDB4NEVDNCwgMHg1M0EwLCAweDYwRkIsIDB4NkUyQywgMHg1QzY0LAotICAgIDB4NEY4OCwgMHg1MDI0LCAweDU1RTQsIDB4NUNEOSwgMHg1RTVGLCAweDYwNjUsIDB4Njg5NCwgMHg2Q0JCLAotICAgIDB4NkRDNCwgMHg3MUJFLCAweDc1RDQsIDB4NzVGNCwgMHg3NjYxLCAweDdBMUEsIDB4N0E0OSwgMHg3REM3LAotICAgIDB4N0RGQiwgMHg3RjZFLCAweDgxRjQsIDB4ODZBOSwgMHg4RjFDLCAweDk2QzksIDB4OTlCMywgMHg5RjUyLAotICAgIDB4NTI0NywgMHg1MkM1LCAweDk4RUQsIDB4ODlBQSwgMHg0RTAzLCAweDY3RDIsIDB4NkYwNiwgMHg0RkI1LAotICAgIDB4NUJFMiwgMHg2Nzk1LCAweDZDODgsIDB4NkQ3OCwgMHg3NDFCLCAweDc4MjcsIDB4OTFERCwgMHg5MzdDLAotICAgIDB4ODdDNCwgMHg3OUU0LCAweDdBMzEsIDB4NUZFQiwgMHg0RUQ2LCAweDU0QTQsIDB4NTUzRSwgMHg1OEFFLAotICAgIDB4NTlBNSwgMHg2MEYwLCAweDYyNTMsIDB4NjJENiwgMHg2NzM2LCAweDY5NTUsIDB4ODIzNSwgMHg5NjQwLAotICAgIDB4OTlCMSwgMHg5OURELCAweDUwMkMsIDB4NTM1MywgMHg1NTQ0LCAweDU3N0MsIDB4NjI1OCwgMHg2NEUyLAotICAgIDB4NjY2QiwgMHg2N0RELCAweDZGQzEsIDB4NkZFRiwgMHg3NDIyLCAweDc0MzgsIDB4OEExNywgMHg5NDM4LAotICAgIDB4NTQ1MSwgMHg1NjA2LCAweDU3NjYsIDB4NUY0OCwgMHg2MTlBLCAweDZCNEUsIDB4NzA1OCwgMHg3MEFELAotICAgIDB4N0RCQiwgMHg4QTk1LCAweDU5NkEsIDB4ODEyQiwgMHg2M0EyLCAweDc3MDgsIDB4ODAzRCwgMHg4Q0FBLAotICAgIDB4NTg1NCwgMHg2NDJELCAweDY5QkIsIDB4NUI5NSwgMHg1RTExLCAweDZFNkYsIDB4ODU2OSwgMHg1MTRDLAotICAgIDB4NTNGMCwgMHg1OTJBLCAweDYwMjAsIDB4NjE0QiwgMHg2Qjg2LCAweDZDNzAsIDB4NkNGMCwgMHg3QjFFLAotICAgIDB4ODBDRSwgMHg4MkQ0LCAweDhEQzYsIDB4OTBCMCwgMHg5OEIxLCAweDY0QzcsIDB4NkZBNCwgMHg2NDkxLAotICAgIDB4NjUwNCwgMHg1MTRFLCAweDU0MTAsIDB4NTcxRiwgMHg4QTBFLCAweDYxNUYsIDB4Njg3NiwgMHg3NURCLAotICAgIDB4N0I1MiwgMHg3RDcxLCAweDkwMUEsIDB4NTgwNiwgMHg2OUNDLCAweDgxN0YsIDB4ODkyQSwgMHg5MDAwLAotICAgIDB4OTgzOSwgMHg1MDc4LCAweDU5NTcsIDB4NTlBQywgMHg2Mjk1LCAweDkwMEYsIDB4OUIyQSwgMHg2MTVELAotICAgIDB4NzI3OSwgMHg5NUQ2LCAweDU3NjEsIDB4NUE0NiwgMHg1REY0LCAweDYyOEEsIDB4NjRBRCwgMHg2NEZBLAotICAgIDB4Njc3NywgMHg2Q0UyLCAweDZEM0UsIDB4NzIyQywgMHg3NDM2LCAweDc4MzQsIDB4N0Y3NywgMHg4MkFELAotICAgIDB4OEREQiwgMHg5ODE3LCAweDUyMjQsIDB4NTc0MiwgMHg2NzdGLCAweDcyNDgsIDB4NzRFMywgMHg4Q0E5LAotICAgIDB4OEZBNiwgMHg5MjExLCAweDk2MkEsIDB4NTE2QiwgMHg1M0VELCAweDYzNEMsIDB4NEY2OSwgMHg1NTA0LAotICAgIDB4NjA5NiwgMHg2NTU3LCAweDZDOUIsIDB4NkQ3RiwgMHg3MjRDLCAweDcyRkQsIDB4N0ExNywgMHg4OTg3LAotICAgIDB4OEM5RCwgMHg1RjZELCAweDZGOEUsIDB4NzBGOSwgMHg4MUE4LCAweDYxMEUsIDB4NEZCRiwgMHg1MDRGLAotICAgIDB4NjI0MSwgMHg3MjQ3LCAweDdCQzcsIDB4N0RFOCwgMHg3RkU5LCAweDkwNEQsIDB4OTdBRCwgMHg5QTE5LAotICAgIDB4OENCNiwgMHg1NzZBLCAweDVFNzMsIDB4NjdCMCwgMHg4NDBELCAweDhBNTUsIDB4NTQyMCwgMHg1QjE2LAotICAgIDB4NUU2MywgMHg1RUUyLCAweDVGMEEsIDB4NjU4MywgMHg4MEJBLCAweDg1M0QsIDB4OTU4OSwgMHg5NjVCLAotICAgIDB4NEY0OCwgMHg1MzA1LCAweDUzMEQsIDB4NTMwRiwgMHg1NDg2LCAweDU0RkEsIDB4NTcwMywgMHg1RTAzLAotICAgIDB4NjAxNiwgMHg2MjlCLCAweDYyQjEsIDB4NjM1NSwgMHg2Q0UxLCAweDZENjYsIDB4NzVCMSwgMHg3ODMyLAotICAgIDB4ODBERSwgMHg4MTJGLCAweDgyREUsIDB4ODQ2MSwgMHg4NEIyLCAweDg4OEQsIDB4ODkxMiwgMHg5MDBCLAotICAgIDB4OTJFQSwgMHg5OEZELCAweDlCOTEsIDB4NUU0NSwgMHg2NkI0LCAweDY2REQsIDB4NzAxMSwgMHg3MjA2LAotICAgIDB4NEZGNSwgMHg1MjdELCAweDVGNkEsIDB4NjE1MywgMHg2NzUzLCAweDZBMTksIDB4NkYwMiwgMHg3NEUyLAotICAgIDB4Nzk2OCwgMHg4ODY4LCAweDhDNzksIDB4OThDNywgMHg5OEM0LCAweDlBNDMsIDB4NTRDMSwgMHg3QTFGLAotICAgIDB4Njk1MywgMHg4QUY3LCAweDhDNEEsIDB4OThBOCwgMHg5OUFFLCAweDVGN0MsIDB4NjJBQiwgMHg3NUIyLAotICAgIDB4NzZBRSwgMHg4OEFCLCAweDkwN0YsIDB4OTY0MiwgMHg1MzM5LCAweDVGM0MsIDB4NUZDNSwgMHg2Q0NDLAotICAgIDB4NzNDQywgMHg3NTYyLCAweDc1OEIsIDB4N0I0NiwgMHg4MkZFLCAweDk5OUQsIDB4NEU0RiwgMHg5MDNDLAotICAgIDB4NEUwQiwgMHg0RjU1LCAweDUzQTYsIDB4NTkwRiwgMHg1RUM4LCAweDY2MzAsIDB4NkNCMywgMHg3NDU1LAotICAgIDB4ODM3NywgMHg4NzY2LCAweDhDQzAsIDB4OTA1MCwgMHg5NzFFLCAweDlDMTUsIDB4NThEMSwgMHg1Qjc4LAotICAgIDB4ODY1MCwgMHg4QjE0LCAweDlEQjQsIDB4NUJEMiwgMHg2MDY4LCAweDYwOEQsIDB4NjVGMSwgMHg2QzU3LAotICAgIDB4NkYyMiwgMHg2RkEzLCAweDcwMUEsIDB4N0Y1NSwgMHg3RkYwLCAweDk1OTEsIDB4OTU5MiwgMHg5NjUwLAotICAgIDB4OTdEMywgMHg1MjcyLCAweDhGNDQsIDB4NTFGRCwgMHg1NDJCLCAweDU0QjgsIDB4NTU2MywgMHg1NThBLAotICAgIDB4NkFCQiwgMHg2REI1LCAweDdERDgsIDB4ODI2NiwgMHg5MjlDLCAweDk2NzcsIDB4OUU3OSwgMHg1NDA4LAotICAgIDB4NTRDOCwgMHg3NkQyLCAweDg2RTQsIDB4OTVBNCwgMHg5NUQ0LCAweDk2NUMsIDB4NEVBMiwgMHg0RjA5LAotICAgIDB4NTlFRSwgMHg1QUU2LCAweDVERjcsIDB4NjA1MiwgMHg2Mjk3LCAweDY3NkQsIDB4Njg0MSwgMHg2Qzg2LAotICAgIDB4NkUyRiwgMHg3RjM4LCAweDgwOUIsIDB4ODIyQSwgMHg5ODA1LCAweDRFQTUsIDB4NTA1NSwgMHg1NEIzLAotICAgIDB4NTc5MywgMHg1OTVBLCAweDVCNjksIDB4NUJCMywgMHg2MUM4LCAweDY5NzcsIDB4NkQ3NywgMHg3MDIzLAotICAgIDB4ODdGOSwgMHg4OUUzLCAweDhBNzIsIDB4OEFFNywgMHg5MDgyLCAweDk5RUQsIDB4OUFCOCwgMHg1MkJFLAotICAgIDB4NjgzOCwgMHg1MDE2LCAweDVFNzgsIDB4Njc0RiwgMHg4MzQ3LCAweDg4NEMsIDB4NEVBQiwgMHg1NDExLAotICAgIDB4NTZBRSwgMHg3M0U2LCAweDkxMTUsIDB4OTdGRiwgMHg5OTA5LCAweDk5NTcsIDB4OTk5OSwgMHg1NjUzLAotICAgIDB4NTg5RiwgMHg4NjVCLCAweDhBMzEsIDB4NjFCMiwgMHg2QUY2LCAweDczN0IsIDB4OEVEMiwgMHg2QjQ3LAotICAgIDB4OTZBQSwgMHg5QTU3LCAweDU5NTUsIDB4NzIwMCwgMHg4RDZCLCAweDk3NjksIDB4NEZENCwgMHg1Q0Y0LAotICAgIDB4NUYyNiwgMHg2MUY4LCAweDY2NUIsIDB4NkNFQiwgMHg3MEFCLCAweDczODQsIDB4NzNCOSwgMHg3M0ZFLAotICAgIDB4NzcyOSwgMHg3NzRELCAweDdENDMsIDB4N0Q2MiwgMHg3RTIzLCAweDgyMzcsIDB4ODg1MiwgMHg4Q0UyLAotICAgIDB4OTI0OSwgMHg5ODZGLCAweDVCNTEsIDB4N0E3NCwgMHg4ODQwLCAweDk4MDEsIDB4NUFDQywgMHg0RkUwLAotICAgIDB4NTM1NCwgMHg1OTNFLCAweDVDRkQsIDB4NjMzRSwgMHg2RDc5LCAweDcyRjksIDB4ODEwNSwgMHg4MTA3LAotICAgIDB4ODNBMiwgMHg5MkNGLCAweDk4MzAsIDB4NEVBOCwgMHg1MTQ0LCAweDUyMTEsIDB4NTc4QiwgMHg1RjYyLAotICAgIDB4NkNDMiwgMHg2RUNFLCAweDcwMDUsIDB4NzA1MCwgMHg3MEFGLCAweDcxOTIsIDB4NzNFOSwgMHg3NDY5LAotICAgIDB4ODM0QSwgMHg4N0EyLCAweDg4NjEsIDB4OTAwOCwgMHg5MEEyLCAweDkzQTMsIDB4OTlBOCwgMHg1MTZFLAotICAgIDB4NUY1NywgMHg2MEUwLCAweDYxNjcsIDB4NjZCMywgMHg4NTU5LCAweDhFNEEsIDB4OTFBRiwgMHg5NzhCLAotICAgIDB4NEU0RSwgMHg0RTkyLCAweDU0N0MsIDB4NThENSwgMHg1OEZBLCAweDU5N0QsIDB4NUNCNSwgMHg1RjI3LAotICAgIDB4NjIzNiwgMHg2MjQ4LCAweDY2MEEsIDB4NjY2NywgMHg2QkVCLCAweDZENjksIDB4NkRDRiwgMHg2RTU2LAotICAgIDB4NkVGOCwgMHg2Rjk0LCAweDZGRTAsIDB4NkZFOSwgMHg3MDVELCAweDcyRDAsIDB4NzQyNSwgMHg3NDVBLAotICAgIDB4NzRFMCwgMHg3NjkzLCAweDc5NUMsIDB4N0NDQSwgMHg3RTFFLCAweDgwRTEsIDB4ODJBNiwgMHg4NDZCLAotICAgIDB4ODRCRiwgMHg4NjRFLCAweDg2NUYsIDB4ODc3NCwgMHg4Qjc3LCAweDhDNkEsIDB4OTNBQywgMHg5ODAwLAotICAgIDB4OTg2NSwgMHg2MEQxLCAweDYyMTYsIDB4OTE3NywgMHg1QTVBLCAweDY2MEYsIDB4NkRGNywgMHg2RTNFLAotICAgIDB4NzQzRiwgMHg5QjQyLCAweDVGRkQsIDB4NjBEQSwgMHg3QjBGLCAweDU0QzQsIDB4NUYxOCwgMHg2QzVFLAotICAgIDB4NkNEMywgMHg2RDJBLCAweDcwRDgsIDB4N0QwNSwgMHg4Njc5LCAweDhBMEMsIDB4OUQzQiwgMHg1MzE2LAotICAgIDB4NTQ4QywgMHg1QjA1LCAweDZBM0EsIDB4NzA2QiwgMHg3NTc1LCAweDc5OEQsIDB4NzlCRSwgMHg4MkIxLAotICAgIDB4ODNFRiwgMHg4QTcxLCAweDhCNDEsIDB4OENBOCwgMHg5Nzc0LCAweDY0RjQsIDB4NjUyQiwgMHg3OEJBLAotICAgIDB4NzhCQiwgMHg3QTZCLCAweDRFMzgsIDB4NTU5QSwgMHg1OTUwLCAweDVCQTYsIDB4NUU3QiwgMHg2MEEzLAotICAgIDB4NjNEQiwgMHg2QjYxLCAweDY2NjUsIDB4Njg1MywgMHg2RTE5LCAweDcxNjUsIDB4NzRCMCwgMHg3RDA4LAotICAgIDB4OTA4NCwgMHg5QTY5LCAweDlDMjUsIDB4NkQzQiwgMHg2RUQxLCAweDczM0UsIDB4OEM0MSwgMHg5NUNBLAotICAgIDB4NTFGMCwgMHg1RTRDLCAweDVGQTgsIDB4NjA0RCwgMHg2MEY2LCAweDYxMzAsIDB4NjE0QywgMHg2NjQzLAotICAgIDB4NjY0NCwgMHg2OUE1LCAweDZDQzEsIDB4NkU1RiwgMHg2RUM5LCAweDZGNjIsIDB4NzE0QywgMHg3NDlDLAotICAgIDB4NzY4NywgMHg3QkMxLCAweDdDMjcsIDB4ODM1MiwgMHg4NzU3LCAweDkwNTEsIDB4OTY4RCwgMHg5RUMzLAotICAgIDB4NTMyRiwgMHg1NkRFLCAweDVFRkIsIDB4NUY4QSwgMHg2MDYyLCAweDYwOTQsIDB4NjFGNywgMHg2NjY2LAotICAgIDB4NjcwMywgMHg2QTlDLCAweDZERUUsIDB4NkZBRSwgMHg3MDcwLCAweDczNkEsIDB4N0U2QSwgMHg4MUJFLAotICAgIDB4ODMzNCwgMHg4NkQ0LCAweDhBQTgsIDB4OENDNCwgMHg1MjgzLCAweDczNzIsIDB4NUI5NiwgMHg2QTZCLAotICAgIDB4OTQwNCwgMHg1NEVFLCAweDU2ODYsIDB4NUI1RCwgMHg2NTQ4LCAweDY1ODUsIDB4NjZDOSwgMHg2ODlGLAotICAgIDB4NkQ4RCwgMHg2REM2LCAweDcyM0IsIDB4ODBCNCwgMHg5MTc1LCAweDlBNEQsIDB4NEZBRiwgMHg1MDE5LAotICAgIDB4NTM5QSwgMHg1NDBFLCAweDU0M0MsIDB4NTU4OSwgMHg1NUM1LCAweDVFM0YsIDB4NUY4QywgMHg2NzNELAotICAgIDB4NzE2NiwgMHg3M0RELCAweDkwMDUsIDB4NTJEQiwgMHg1MkYzLCAweDU4NjQsIDB4NThDRSwgMHg3MTA0LAotICAgIDB4NzE4RiwgMHg3MUZCLCAweDg1QjAsIDB4OEExMywgMHg2Njg4LCAweDg1QTgsIDB4NTVBNywgMHg2Njg0LAotICAgIDB4NzE0QSwgMHg4NDMxLCAweDUzNDksIDB4NTU5OSwgMHg2QkMxLCAweDVGNTksIDB4NUZCRCwgMHg2M0VFLAotICAgIDB4NjY4OSwgMHg3MTQ3LCAweDhBRjEsIDB4OEYxRCwgMHg5RUJFLCAweDRGMTEsIDB4NjQzQSwgMHg3MENCLAotICAgIDB4NzU2NiwgMHg4NjY3LCAweDYwNjQsIDB4OEI0RSwgMHg5REY4LCAweDUxNDcsIDB4NTFGNiwgMHg1MzA4LAotICAgIDB4NkQzNiwgMHg4MEY4LCAweDlFRDEsIDB4NjYxNSwgMHg2QjIzLCAweDcwOTgsIDB4NzVENSwgMHg1NDAzLAotICAgIDB4NUM3OSwgMHg3RDA3LCAweDhBMTYsIDB4NkIyMCwgMHg2QjNELCAweDZCNDYsIDB4NTQzOCwgMHg2MDcwLAotICAgIDB4NkQzRCwgMHg3RkQ1LCAweDgyMDgsIDB4NTBENiwgMHg1MURFLCAweDU1OUMsIDB4NTY2QiwgMHg1NkNELAotICAgIDB4NTlFQywgMHg1QjA5LCAweDVFMEMsIDB4NjE5OSwgMHg2MTk4LCAweDYyMzEsIDB4NjY1RSwgMHg2NkU2LAotICAgIDB4NzE5OSwgMHg3MUI5LCAweDcxQkEsIDB4NzJBNywgMHg3OUE3LCAweDdBMDAsIDB4N0ZCMiwgMHg4QTcwLAotICAgIDB4MzAwMSwgMHgzMDAyLCAweDIwMjUsIDB4MDBBRCwgMHgyMDE1LCAweDIyMjUsIDB4RkY1RSwgMHgzMDE0LAotICAgIDB4MzAxNSwgMHgzMDA4LCAweDMwMDksIDB4MzAwQSwgMHgzMDBCLCAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLAotICAgIDB4MzAwRiwgMHgzMDEwLCAweDMwMTEsIDB4MzAxMywgMHhGRjAxLCAweEZGMDgsIDB4RkYwOSwgMHhGRjBDLAotICAgIDB4RkYwRSwgMHhGRjFBLCAweEZGMUIsIDB4RkYxQywgMHhGRjFELCAweEZGMUUsIDB4RkYxRiwgMHhGRjNCLAotICAgIDB4RkYzRCwgMHhGRjNGLCAweEZGNUIsIDB4RkY1QywgMHhGRjVELCAweEZGNUUsIDB4MDAyMCwgMHgwMDIxLAotICAgIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LAotICAgIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LAotICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLAotICAgIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LAotICAgIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLAotICAgIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAotICAgIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLAotICAgIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LAotICAgIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLAotICAgIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LAotICAgIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgyMDNFLCAweDAwN0UsIDB4MDA1QywgMHgyMzFDLAotICAgIDB4MjMxRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDMwMEUsIDB4MzAwRiwgMHgzMDBBLAotICAgIDB4MzAwQiwgMHgzMDA4LCAweDMwMDksIDB4MDAyOCwgMHgwMDI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDI4LAotICAgIDB4MDAyOSwgMHgwMDI4LCAweDAwMjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMjgsIDB4MDAyOSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgzMDE2LCAweDMwMTcsIDB4MzAxNiwgMHgzMDE3LCAweDMwMTgsIDB4MzAxOSwgMHgwMDVCLAotICAgIDB4MDA1RCwgMHgwMDAwLCAweDAwMDAsIDB4MjYzRSwgMHgyNjNELCAweDIwMjEsIDB4MjAyMSwgMHgyMDIwLAotICAgIDB4MjAyMSwgMHgwMDAwLCAweDIyMTcsIDB4MDAwMCwgMHgwMDAwLCAweDIwMUYsIDB4MjAxQiwgMHgwMkQ2LAotICAgIDB4MDJENywgMHgwMEQ3LCAweDIyMUUsIDB4MDAwMCwgMHgwMEIxLCAweDIyMTMsIDB4MDAzRSwgMHgwMDNDLAotICAgIDB4MDAzRCwgMHgyMjYwLCAweDIwN0QsIDB4MjA3RSwgMHgwMDdCLCAweDAwN0QsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjIyOSwgMHgyMjJBLCAweDIyODIsIDB4MjIwOCwgMHgwM0EzLCAweDAwMjEsIDB4MDAwMCwgMHgzMDIxLAotICAgIDB4MzAyMiwgMHgzMDIzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDRFMDMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4NTM0MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAyNywgMHgzMDE0LCAweDMwMTUsIDB4MDAyQSwgMHgwMDAwLAotICAgIDB4MjIxNywgMHgwMDJBLCAweENEQ0QsIDB4MzAwMSwgMHgzMDAyLCAweDAwMjgsIDB4MDAyOSwgMHgwMDI4LAotICAgIDB4MDAyOSwgMHgwMDI4LCAweDAwMjksIDB4MzAxNiwgMHgzMDE3LCAweDMwMTAsIDB4MzAxMSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwQjYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjJFRiwgMHgyMjM3LCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4Mjc4QSwgMHgyNzhCLAotICAgIDB4Mjc4QywgMHgyNzhELCAweDI3OEUsIDB4Mjc4RiwgMHgyNzkwLCAweDI3OTEsIDB4Mjc5MiwgMHgyNzkzLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgyNEI2LCAweDI0QjcsIDB4MjRCOCwgMHgyNEI5LAotICAgIDB4MjRCQSwgMHgyNEJCLCAweDI0QkMsIDB4MjRCRCwgMHgyNEJFLCAweDI0QkYsIDB4MjRDMCwgMHgyNEMxLAotICAgIDB4MjRDMiwgMHgyNEMzLCAweDI0QzQsIDB4MjRDNSwgMHgyNEM2LCAweDI0QzcsIDB4MjRDOCwgMHgyNEM5LAotICAgIDB4MjRDQSwgMHgyNENCLCAweDI0Q0MsIDB4MjRDRCwgMHgyNENFLCAweDI0Q0YsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjJDRiwgMHgyMkNFLCAweDIyQ0YsIDB4MjJDRSwgMHgyMjgwLAotICAgIDB4MjI4MSwgMHgyMjcwLCAweDIyNzEsIDB4MjI3MiwgMHgyMjczLCAweDAwMDAsIDB4MjI4QSwgMHgwMDAwLAotICAgIDB4MjI4QiwgMHgyMjc2LCAweDIyNzcsIDB4MjI3OSwgMHgyMkRBLCAweDIyREIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDIyMjEsIDB4MjI0NSwgMHgyMjQzLCAweDIyNDgsIDB4MDAwMCwgMHgyMkE0LAotICAgIDB4MjJBQiwgMHgwMDAwLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgwMDAwLCAweDI0NjAsIDB4MjQ2MSwgMHgyNDYyLAotICAgIDB4MjQ2MywgMHgyNDY0LCAweDI0NjUsIDB4MjQ2NiwgMHgyNDY3LCAweDI0NjgsIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjEsIDB4MDBCMCwgMHgwMDI3LCAweDAwMjIsIDB4MjAzNCwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAwMCwgMHgwMDAwLCAweDIwMjAsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MjAyMCwgMHgwMEE3LCAweDAwMjMsIDB4MDAyQSwgMHgwMDJBLCAweDAwMDAsIDB4MDAwMCwgMHgyMDQyLAotICAgIDB4MDAyQSwgMHgwMDAwLCAweDAwMDAsIDB4MjA0MiwgMHgwMDJBLCAweDAwMDAsIDB4MDAwMCwgMHgyMDIyLAotICAgIDB4MjBERiwgMHgyMERGLCAweDAwMDAsIDB4MjBERiwgMHgzMDA4LCAweDMwMDksIDB4MzAwQSwgMHgzMDBCLAotICAgIDB4MjYxQywgMHgyNjFFLCAweDAwMDAsIDB4MDAwMCwgMHgyMERFLCAweDAwMDAsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMERELCAweDIwREQsIDB4MjcxQSwgMHgyNzE2LAotICAgIDB4MDAwMCwgMHgyNUVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyNUNDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQTksIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjYyRiwgMHgwMDAwLCAweDI2MkYsIDB4MjYyRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzMDIwLAotICAgIDB4MDAwMCwgMHgyNzc2LCAweDI3NzcsIDB4Mjc3OCwgMHgyNzc5LCAweDI3N0EsIDB4Mjc3QiwgMHgyNzdDLAotICAgIDB4Mjc3RCwgMHgyNzdFLCAweDI3N0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MjY0MiwgMHgyMkE5LCAweDMwMzYsIDB4MjVDQiwgMHgyNUQzLAotICAgIDB4MjVBMSwgMHgyMzAyLCAweDAwMDAsIDB4MjVBRCwgMHgyNUFELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjVDNywgMHgwMDAwLCAweDAwMDAsIDB4MjIwNiwgMHgyMkJGLCAweDIzMUUsIDB4MDAwMCwgMHgyMjI1LAotICAgIDB4MjIyNiwgMHgwMDAwLCAweDIyNTMsIDB4MjI1MSwgMHgyMjY2LCAweDIyNjcsIDB4MjIxMywgMHgyMjk1LAotICAgIDB4MjI5NiwgMHgyMjk3LCAweDIwREQsIDB4MjMxNCwgMHgwMDAwLCAweDAwMDAsIDB4MjI2MiwgMHgwMDAwLAotICAgIDB4MjVCMSwgMHgwMDAwLCAweDIyMjIsIDB4MjI1MCwgMHgwMEQ4LCAweDIzNEEsIDB4MjJBMywgMHgwMzM4LAotICAgIDB4MDAwMCwgMHgyMjZFLCAweDIyNkYsIDB4MjI4NSwgMHgyMjg0LCAweDIyMDksIDB4MjIwQywgMHgyMkJCLAotICAgIDB4MDAxNiwgMHgyMjVBLCAweDIzMDYsIDB4MDAyNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgzMjlFLCAweDAwMDAsIDB4MjAzQywgMHgwMDNGLCAweDAwMDAsIDB4MDAzRiwgMHgyMkM0LAotICAgIDB4MjVDNywgMHgyMkM0LCAweDI1QzYsIDB4MjVBQiwgMHgyNUExLCAweDI1QUIsIDB4MjVBMCwgMHgyNUU2LAotICAgIDB4MjVDQiwgMHgyNUU2LCAweDI1Q0YsIDB4MjVCRCwgMHgyNUIzLCAweDI1QjcsIDB4MjVDMSwgMHgyNzI2LAotICAgIDB4MjVDRiwgMHgyNUEwLCAweDAwMDAsIDB4MjVDQSwgMHgzMjMxLCAweDMyMzksIDB4MzNDQiwgMHgyNDgzLAotICAgIDB4MjQ5NCwgMHgyNDk1LCAweDI0OTYsIDB4MjQ5NywgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MjE5MiwgMHgyMTkwLAotICAgIDB4MjE5MSwgMHgyMTkzLCAweDIxOTYsIDB4MjE5NywgMHgyMTk4LCAweDIxOTksIDB4MjFEMCwgMHgyMUNGLAotICAgIDB4MjFDRCwgMHgyMUQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyNzk0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI3OUMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyN0JBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjFEMSwgMHgyMUQzLAotICAgIDB4MDAwMCwgMHgyNzlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI3OUUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjFCNSwgMHgyMUIxLCAweDAwMDAsIDB4MjFCNCwgMHgyMUIwLCAweDIxQjMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjFFNiwgMHgyMUU4LCAweDIxRTcsIDB4MjFFOSwgMHgyMUJDLCAweDIxQzAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDIxQzAsIDB4MjFCQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjFDNCwgMHgyMUM1LCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDI0ODMsIDB4MjQ4NCwgMHgyNDg1LCAweDI0ODYsIDB4MjQ4NywgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MzI5NCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MzJBNSwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDI3OTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjFFMCwgMHgyMUUxLAotICAgIDB4MjFFMiwgMHgyMUUzLCAweDAwMDAsIDB4MjdBMSwgMHgwMDAwLCAweDAwMDAsIDB4MjFFNiwgMHgyMUU4LAotICAgIDB4MjFFNywgMHgyMUU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjYxRCwgMHgyNjFGLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgzMjkwLCAweDMyOEEsIDB4MzI4QiwgMHgzMjhDLAotICAgIDB4MzI4RCwgMHgzMjhFLCAweDMyOEYsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MjFFOCwgMHgyMUU2LAotICAgIDB4MjFFNywgMHgyMUU5LCAweDAwMjIsIDB4MzAxRiwgMHgzMDFELCAweDIwMzYsIDB4MDA2MCwgMHgzMDAxLAotICAgIDB4MDAwMCwgMHgwMDIxLCAweDMwMjEsIDB4MDAyQywgMHgzMDAyLCAweEFDMDIsIDB4QUMwMywgMHhBQzA1LAotICAgIDB4QUMwNiwgMHhBQzBCLCAweEFDMEMsIDB4QUMwRCwgMHhBQzBFLCAweEFDMEYsIDB4QUMxOCwgMHhBQzFFLAotICAgIDB4QUMxRiwgMHhBQzIxLCAweEFDMjIsIDB4QUMyMywgMHhBQzI1LCAweEFDMjYsIDB4QUMyNywgMHhBQzI4LAotICAgIDB4QUMyOSwgMHhBQzJBLCAweEFDMkIsIDB4QUMyRSwgMHhBQzMyLCAweEFDMzMsIDB4QUMzNCwgMHhBQzM1LAotICAgIDB4QUMzNiwgMHhBQzM3LCAweEFDM0EsIDB4QUMzQiwgMHhBQzNELCAweEFDM0UsIDB4QUMzRiwgMHhBQzQxLAotICAgIDB4QUM0MiwgMHhBQzQzLCAweEFDNDQsIDB4QUM0NSwgMHhBQzQ2LCAweEFDNDcsIDB4QUM0OCwgMHhBQzQ5LAotICAgIDB4QUM0QSwgMHhBQzRDLCAweEFDNEUsIDB4QUM0RiwgMHhBQzUwLCAweEFDNTEsIDB4QUM1MiwgMHhBQzUzLAotICAgIDB4QUM1NSwgMHhBQzU2LCAweEFDNTcsIDB4QUM1OSwgMHhBQzVBLCAweEFDNUIsIDB4QUM1RCwgMHhBQzVFLAotICAgIDB4QUM1RiwgMHhBQzYwLCAweEFDNjEsIDB4QUM2MiwgMHhBQzYzLCAweEFDNjQsIDB4QUM2NSwgMHhBQzY2LAotICAgIDB4QUM2NywgMHhBQzY4LCAweEFDNjksIDB4QUM2QSwgMHhBQzZCLCAweEFDNkMsIDB4QUM2RCwgMHhBQzZFLAotICAgIDB4QUM2RiwgMHhBQzcyLCAweEFDNzMsIDB4QUM3NSwgMHhBQzc2LCAweEFDNzksIDB4QUM3QiwgMHhBQzdDLAotICAgIDB4QUM3RCwgMHhBQzdFLCAweEFDN0YsIDB4QUM4MiwgMHhBQzg3LCAweEFDODgsIDB4QUM4RCwgMHhBQzhFLAotICAgIDB4QUM4RiwgMHhBQzkxLCAweEFDOTIsIDB4QUM5MywgMHhBQzk1LCAweEFDOTYsIDB4QUM5NywgMHhBQzk4LAotICAgIDB4QUM5OSwgMHhBQzlBLCAweEFDOUIsIDB4QUM5RSwgMHhBQ0EyLCAweEFDQTMsIDB4QUNBNCwgMHhBQ0E1LAotICAgIDB4QUNBNiwgMHhBQ0E3LCAweEFDQUIsIDB4QUNBRCwgMHhBQ0FFLCAweEFDQjEsIDB4QUNCMiwgMHhBQ0IzLAotICAgIDB4QUNCNCwgMHhBQ0I1LCAweEFDQjYsIDB4QUNCNywgMHhBQ0JBLCAweEFDQkUsIDB4QUNCRiwgMHhBQ0MwLAotICAgIDB4QUNDMiwgMHhBQ0MzLCAweEFDQzUsIDB4QUNDNiwgMHhBQ0M3LCAweEFDQzksIDB4QUNDQSwgMHhBQ0NCLAotICAgIDB4QUNDRCwgMHhBQ0NFLCAweEFDQ0YsIDB4QUNEMCwgMHhBQ0QxLCAweEFDRDIsIDB4QUNEMywgMHhBQ0Q0LAotICAgIDB4QUNENiwgMHhBQ0Q4LCAweEFDRDksIDB4QUNEQSwgMHhBQ0RCLCAweEFDREMsIDB4QUNERCwgMHhBQ0RFLAotICAgIDB4QUNERiwgMHhBQ0UyLCAweEFDRTMsIDB4QUNFNSwgMHhBQ0U2LCAweEFDRTksIDB4QUNFQiwgMHhBQ0VELAotICAgIDB4QUNFRSwgMHhBQ0YyLCAweEFDRjQsIDB4QUNGNywgMHhBQ0Y4LCAweEFDRjksIDB4QUNGQSwgMHhBQ0ZCLAotICAgIDB4QUNGRSwgMHhBQ0ZGLCAweEFEMDEsIDB4QUQwMiwgMHhBRDAzLCAweEFEMDUsIDB4QUQwNywgMHhBRDA4LAotICAgIDB4QUQwOSwgMHhBRDBBLCAweEFEMEIsIDB4QUQwRSwgMHhBRDEwLCAweEFEMTIsIDB4QUQxMywgMHhBRDE0LAotICAgIDB4QUQxNSwgMHhBRDE2LCAweEFEMTcsIDB4QUQxOSwgMHhBRDFBLCAweEFEMUIsIDB4QUQxRCwgMHhBRDFFLAotICAgIDB4QUQxRiwgMHhBRDIxLCAweEFEMjIsIDB4QUQyMywgMHhBRDI0LCAweEFEMjUsIDB4QUQyNiwgMHhBRDI3LAotICAgIDB4QUQyOCwgMHhBRDJBLCAweEFEMkIsIDB4QUQyRSwgMHhBRDJGLCAweEFEMzAsIDB4QUQzMSwgMHhBRDMyLAotICAgIDB4QUQzMywgMHhBRDM2LCAweEFEMzcsIDB4QUQzOSwgMHhBRDNBLCAweEFEM0IsIDB4QUQzRCwgMHhBRDNFLAotICAgIDB4QUQzRiwgMHhBRDQwLCAweEFENDEsIDB4QUQ0MiwgMHhBRDQzLCAweEFENDYsIDB4QUQ0OCwgMHhBRDRBLAotICAgIDB4QUQ0QiwgMHhBRDRDLCAweEFENEQsIDB4QUQ0RSwgMHhBRDRGLCAweEFENTEsIDB4QUQ1MiwgMHhBRDUzLAotICAgIDB4QUQ1NSwgMHhBRDU2LCAweEFENTcsIDB4QUQ1OSwgMHhBRDVBLCAweEFENUIsIDB4QUQ1QywgMHhBRDVELAotICAgIDB4QUQ1RSwgMHhBRDVGLCAweEFENjAsIDB4QUQ2MiwgMHhBRDY0LCAweEFENjUsIDB4QUQ2NiwgMHhBRDY3LAotICAgIDB4QUQ2OCwgMHhBRDY5LCAweEFENkEsIDB4QUQ2QiwgMHhBRDZFLCAweEFENkYsIDB4QUQ3MSwgMHhBRDcyLAotICAgIDB4QUQ3NywgMHhBRDc4LCAweEFENzksIDB4QUQ3QSwgMHhBRDdFLCAweEFEODAsIDB4QUQ4MywgMHhBRDg0LAotICAgIDB4QUQ4NSwgMHhBRDg2LCAweEFEODcsIDB4QUQ4QSwgMHhBRDhCLCAweEFEOEQsIDB4QUQ4RSwgMHhBRDhGLAotICAgIDB4QUQ5MSwgMHhBRDkyLCAweEFEOTMsIDB4QUQ5NCwgMHhBRDk1LCAweEFEOTYsIDB4QUQ5NywgMHhBRDk4LAotICAgIDB4QUQ5OSwgMHhBRDlBLCAweEFEOUIsIDB4QUQ5RSwgMHhBRDlGLCAweEFEQTAsIDB4QURBMSwgMHhBREEyLAotICAgIDB4QURBMywgMHhBREE1LCAweEFEQTYsIDB4QURBNywgMHhBREE4LCAweEFEQTksIDB4QURBQSwgMHhBREFCLAotICAgIDB4QURBQywgMHhBREFELCAweEFEQUUsIDB4QURBRiwgMHhBREIwLCAweEFEQjEsIDB4QURCMiwgMHhBREIzLAotICAgIDB4QURCNCwgMHhBREI1LCAweEFEQjYsIDB4QURCOCwgMHhBREI5LCAweEFEQkEsIDB4QURCQiwgMHhBREJDLAotICAgIDB4QURCRCwgMHhBREJFLCAweEFEQkYsIDB4QURDMiwgMHhBREMzLCAweEFEQzUsIDB4QURDNiwgMHhBREM3LAotICAgIDB4QURDOSwgMHhBRENBLCAweEFEQ0IsIDB4QURDQywgMHhBRENELCAweEFEQ0UsIDB4QURDRiwgMHhBREQyLAotICAgIDB4QURENCwgMHhBREQ1LCAweEFERDYsIDB4QURENywgMHhBREQ4LCAweEFERDksIDB4QUREQSwgMHhBRERCLAotICAgIDB4QURERCwgMHhBRERFLCAweEFEREYsIDB4QURFMSwgMHhBREUyLCAweEFERTMsIDB4QURFNSwgMHhBREU2LAotICAgIDB4QURFNywgMHhBREU4LCAweEFERTksIDB4QURFQSwgMHhBREVCLCAweEFERUMsIDB4QURFRCwgMHhBREVFLAotICAgIDB4QURFRiwgMHhBREYwLCAweEFERjEsIDB4QURGMiwgMHhBREYzLCAweEFERjQsIDB4QURGNSwgMHhBREY2LAotICAgIDB4QURGNywgMHhBREZBLCAweEFERkIsIDB4QURGRCwgMHhBREZFLCAweEFFMDIsIDB4QUUwMywgMHhBRTA0LAotICAgIDB4QUUwNSwgMHhBRTA2LCAweEFFMDcsIDB4QUUwQSwgMHhBRTBDLCAweEFFMEUsIDB4QUUwRiwgMHhBRTEwLAotICAgIDB4QUUxMSwgMHhBRTEyLCAweEFFMTMsIDB4QUUxNSwgMHhBRTE2LCAweEFFMTcsIDB4QUUxOCwgMHhBRTE5LAotICAgIDB4QUUxQSwgMHhBRTFCLCAweEFFMUMsIDB4QUUxRCwgMHhBRTFFLCAweEFFMUYsIDB4QUUyMCwgMHhBRTIxLAotICAgIDB4QUUyMiwgMHhBRTIzLCAweEFFMjQsIDB4QUUyNSwgMHhBRTI2LCAweEFFMjcsIDB4QUUyOCwgMHhBRTI5LAotICAgIDB4QUUyQSwgMHhBRTJCLCAweEFFMkMsIDB4QUUyRCwgMHhBRTJFLCAweEFFMkYsIDB4QUUzMiwgMHhBRTMzLAotICAgIDB4QUUzNSwgMHhBRTM2LCAweEFFMzksIDB4QUUzQiwgMHhBRTNDLCAweEFFM0QsIDB4QUUzRSwgMHhBRTNGLAotICAgIDB4QUU0MiwgMHhBRTQ0LCAweEFFNDcsIDB4QUU0OCwgMHhBRTQ5LCAweEFFNEIsIDB4QUU0RiwgMHhBRTUxLAotICAgIDB4QUU1MiwgMHhBRTUzLCAweEFFNTUsIDB4QUU1NywgMHhBRTU4LCAweEFFNTksIDB4QUU1QSwgMHhBRTVCLAotICAgIDB4QUU1RSwgMHhBRTYyLCAweEFFNjMsIDB4QUU2NCwgMHhBRTY2LCAweEFFNjcsIDB4QUU2QSwgMHhBRTZCLAotICAgIDB4QUU2RCwgMHhBRTZFLCAweEFFNkYsIDB4QUU3MSwgMHhBRTcyLCAweEFFNzMsIDB4QUU3NCwgMHhBRTc1LAotICAgIDB4QUU3NiwgMHhBRTc3LCAweEFFN0EsIDB4QUU3RSwgMHhBRTdGLCAweEFFODAsIDB4QUU4MSwgMHhBRTgyLAotICAgIDB4QUU4MywgMHhBRTg2LCAweEFFODcsIDB4QUU4OCwgMHhBRTg5LCAweEFFOEEsIDB4QUU4QiwgMHhBRThELAotICAgIDB4QUU4RSwgMHhBRThGLCAweEFFOTAsIDB4QUU5MSwgMHhBRTkyLCAweEFFOTMsIDB4QUU5NCwgMHhBRTk1LAotICAgIDB4QUU5NiwgMHhBRTk3LCAweEFFOTgsIDB4QUU5OSwgMHhBRTlBLCAweEFFOUIsIDB4QUU5QywgMHhBRTlELAotICAgIDB4QUU5RSwgMHhBRTlGLCAweEFFQTAsIDB4QUVBMSwgMHhBRUEyLCAweEFFQTMsIDB4QUVBNCwgMHhBRUE1LAotICAgIDB4QUVBNiwgMHhBRUE3LCAweEFFQTgsIDB4QUVBOSwgMHhBRUFBLCAweEFFQUIsIDB4QUVBQywgMHhBRUFELAotICAgIDB4QUVBRSwgMHhBRUFGLCAweEFFQjAsIDB4QUVCMSwgMHhBRUIyLCAweEFFQjMsIDB4QUVCNCwgMHhBRUI1LAotICAgIDB4QUVCNiwgMHhBRUI3LCAweEFFQjgsIDB4QUVCOSwgMHhBRUJBLCAweEFFQkIsIDB4QUVCRiwgMHhBRUMxLAotICAgIDB4QUVDMiwgMHhBRUMzLCAweEFFQzUsIDB4QUVDNiwgMHhBRUM3LCAweEFFQzgsIDB4QUVDOSwgMHhBRUNBLAotICAgIDB4QUVDQiwgMHhBRUNFLCAweEFFRDIsIDB4QUVEMywgMHhBRUQ0LCAweEFFRDUsIDB4QUVENiwgMHhBRUQ3LAotICAgIDB4QUVEQSwgMHhBRURCLCAweEFFREQsIDB4QUVERSwgMHhBRURGLCAweEFFRTAsIDB4QUVFMSwgMHhBRUUyLAotICAgIDB4QUVFMywgMHhBRUU0LCAweEFFRTUsIDB4QUVFNiwgMHhBRUU3LCAweEFFRTksIDB4QUVFQSwgMHhBRUVDLAotICAgIDB4QUVFRSwgMHhBRUVGLCAweEFFRjAsIDB4QUVGMSwgMHhBRUYyLCAweEFFRjMsIDB4QUVGNSwgMHhBRUY2LAotICAgIDB4QUVGNywgMHhBRUY5LCAweEFFRkEsIDB4QUVGQiwgMHhBRUZELCAweEFFRkUsIDB4QUVGRiwgMHhBRjAwLAotICAgIDB4QUYwMSwgMHhBRjAyLCAweEFGMDMsIDB4QUYwNCwgMHhBRjA1LCAweEFGMDYsIDB4QUYwOSwgMHhBRjBBLAotICAgIDB4QUYwQiwgMHhBRjBDLCAweEFGMEUsIDB4QUYwRiwgMHhBRjExLCAweEFGMTIsIDB4QUYxMywgMHhBRjE0LAotICAgIDB4QUYxNSwgMHhBRjE2LCAweEFGMTcsIDB4QUYxOCwgMHhBRjE5LCAweEFGMUEsIDB4QUYxQiwgMHhBRjFDLAotICAgIDB4QUYxRCwgMHhBRjFFLCAweEFGMUYsIDB4QUYyMCwgMHhBRjIxLCAweEFGMjIsIDB4QUYyMywgMHhBRjI0LAotICAgIDB4QUYyNSwgMHhBRjI2LCAweEFGMjcsIDB4QUYyOCwgMHhBRjI5LCAweEFGMkEsIDB4QUYyQiwgMHhBRjJFLAotICAgIDB4QUYyRiwgMHhBRjMxLCAweEFGMzMsIDB4QUYzNSwgMHhBRjM2LCAweEFGMzcsIDB4QUYzOCwgMHhBRjM5LAotICAgIDB4QUYzQSwgMHhBRjNCLCAweEFGM0UsIDB4QUY0MCwgMHhBRjQ0LCAweEFGNDUsIDB4QUY0NiwgMHhBRjQ3LAotICAgIDB4QUY0QSwgMHhBRjRCLCAweEFGNEMsIDB4QUY0RCwgMHhBRjRFLCAweEFGNEYsIDB4QUY1MSwgMHhBRjUyLAotICAgIDB4QUY1MywgMHhBRjU0LCAweEFGNTUsIDB4QUY1NiwgMHhBRjU3LCAweEFGNTgsIDB4QUY1OSwgMHhBRjVBLAotICAgIDB4QUY1QiwgMHhBRjVFLCAweEFGNUYsIDB4QUY2MCwgMHhBRjYxLCAweEFGNjIsIDB4QUY2MywgMHhBRjY2LAotICAgIDB4QUY2NywgMHhBRjY4LCAweEFGNjksIDB4QUY2QSwgMHhBRjZCLCAweEFGNkMsIDB4QUY2RCwgMHhBRjZFLAotICAgIDB4QUY2RiwgMHhBRjcwLCAweEFGNzEsIDB4QUY3MiwgMHhBRjczLCAweEFGNzQsIDB4QUY3NSwgMHhBRjc2LAotICAgIDB4QUY3NywgMHhBRjc4LCAweEFGN0EsIDB4QUY3QiwgMHhBRjdDLCAweEFGN0QsIDB4QUY3RSwgMHhBRjdGLAotICAgIDB4QUY4MSwgMHhBRjgyLCAweEFGODMsIDB4QUY4NSwgMHhBRjg2LCAweEFGODcsIDB4QUY4OSwgMHhBRjhBLAotICAgIDB4QUY4QiwgMHhBRjhDLCAweEFGOEQsIDB4QUY4RSwgMHhBRjhGLCAweEFGOTIsIDB4QUY5MywgMHhBRjk0LAotICAgIDB4QUY5NiwgMHhBRjk3LCAweEFGOTgsIDB4QUY5OSwgMHhBRjlBLCAweEFGOUIsIDB4QUY5RCwgMHhBRjlFLAotICAgIDB4QUY5RiwgMHhBRkEwLCAweEFGQTEsIDB4QUZBMiwgMHhBRkEzLCAweEFGQTQsIDB4QUZBNSwgMHhBRkE2LAotICAgIDB4QUZBNywgMHhBRkE4LCAweEFGQTksIDB4QUZBQSwgMHhBRkFCLCAweEFGQUMsIDB4QUZBRCwgMHhBRkFFLAotICAgIDB4QUZBRiwgMHhBRkIwLCAweEFGQjEsIDB4QUZCMiwgMHhBRkIzLCAweEFGQjQsIDB4QUZCNSwgMHhBRkI2LAotICAgIDB4QUZCNywgMHhBRkJBLCAweEFGQkIsIDB4QUZCRCwgMHhBRkJFLCAweEFGQkYsIDB4QUZDMSwgMHhBRkMyLAotICAgIDB4QUZDMywgMHhBRkM0LCAweEFGQzUsIDB4QUZDNiwgMHhBRkNBLCAweEFGQ0MsIDB4QUZDRiwgMHhBRkQwLAotICAgIDB4QUZEMSwgMHhBRkQyLCAweEFGRDMsIDB4QUZENSwgMHhBRkQ2LCAweEFGRDcsIDB4QUZEOCwgMHhBRkQ5LAotICAgIDB4QUZEQSwgMHhBRkRCLCAweEFGREQsIDB4QUZERSwgMHhBRkRGLCAweEFGRTAsIDB4QUZFMSwgMHhBRkUyLAotICAgIDB4QUZFMywgMHhBRkU0LCAweEFGRTUsIDB4QUZFNiwgMHhBRkU3LCAweEFGRUEsIDB4QUZFQiwgMHhBRkVDLAotICAgIDB4QUZFRCwgMHhBRkVFLCAweEFGRUYsIDB4QUZGMiwgMHhBRkYzLCAweEFGRjUsIDB4QUZGNiwgMHhBRkY3LAotICAgIDB4QUZGOSwgMHhBRkZBLCAweEFGRkIsIDB4QUZGQywgMHhBRkZELCAweEFGRkUsIDB4QUZGRiwgMHhCMDAyLAotICAgIDB4QjAwMywgMHhCMDA1LCAweEIwMDYsIDB4QjAwNywgMHhCMDA4LCAweEIwMDksIDB4QjAwQSwgMHhCMDBCLAotICAgIDB4QjAwRCwgMHhCMDBFLCAweEIwMEYsIDB4QjAxMSwgMHhCMDEyLCAweEIwMTMsIDB4QjAxNSwgMHhCMDE2LAotICAgIDB4QjAxNywgMHhCMDE4LCAweEIwMTksIDB4QjAxQSwgMHhCMDFCLCAweEIwMUUsIDB4QjAxRiwgMHhCMDIwLAotICAgIDB4QjAyMSwgMHhCMDIyLCAweEIwMjMsIDB4QjAyNCwgMHhCMDI1LCAweEIwMjYsIDB4QjAyNywgMHhCMDI5LAotICAgIDB4QjAyQSwgMHhCMDJCLCAweEIwMkMsIDB4QjAyRCwgMHhCMDJFLCAweEIwMkYsIDB4QjAzMCwgMHhCMDMxLAotICAgIDB4QjAzMiwgMHhCMDMzLCAweEIwMzQsIDB4QjAzNSwgMHhCMDM2LCAweEIwMzcsIDB4QjAzOCwgMHhCMDM5LAotICAgIDB4QjAzQSwgMHhCMDNCLCAweEIwM0MsIDB4QjAzRCwgMHhCMDNFLCAweEIwM0YsIDB4QjA0MCwgMHhCMDQxLAotICAgIDB4QjA0MiwgMHhCMDQzLCAweEIwNDYsIDB4QjA0NywgMHhCMDQ5LCAweEIwNEIsIDB4QjA0RCwgMHhCMDRGLAotICAgIDB4QjA1MCwgMHhCMDUxLCAweEIwNTIsIDB4QjA1NiwgMHhCMDU4LCAweEIwNUEsIDB4QjA1QiwgMHhCMDVDLAotICAgIDB4QjA1RSwgMHhCMDVGLCAweEIwNjAsIDB4QjA2MSwgMHhCMDYyLCAweEIwNjMsIDB4QjA2NCwgMHhCMDY1LAotICAgIDB4QjA2NiwgMHhCMDY3LCAweEIwNjgsIDB4QjA2OSwgMHhCMDZBLCAweEIwNkIsIDB4QjA2QywgMHhCMDZELAotICAgIDB4QjA2RSwgMHhCMDZGLCAweEIwNzAsIDB4QjA3MSwgMHhCMDcyLCAweEIwNzMsIDB4QjA3NCwgMHhCMDc1LAotICAgIDB4QjA3NiwgMHhCMDc3LCAweEIwNzgsIDB4QjA3OSwgMHhCMDdBLCAweEIwN0IsIDB4QjA3RSwgMHhCMDdGLAotICAgIDB4QjA4MSwgMHhCMDgyLCAweEIwODMsIDB4QjA4NSwgMHhCMDg2LCAweEIwODcsIDB4QjA4OCwgMHhCMDg5LAotICAgIDB4QjA4QSwgMHhCMDhCLCAweEIwOEUsIDB4QjA5MCwgMHhCMDkyLCAweEIwOTMsIDB4QjA5NCwgMHhCMDk1LAotICAgIDB4QjA5NiwgMHhCMDk3LCAweEIwOUIsIDB4QjA5RCwgMHhCMDlFLCAweEIwQTMsIDB4QjBBNCwgMHhCMEE1LAotICAgIDB4QjBBNiwgMHhCMEE3LCAweEIwQUEsIDB4QjBCMCwgMHhCMEIyLCAweEIwQjYsIDB4QjBCNywgMHhCMEI5LAotICAgIDB4QjBCQSwgMHhCMEJCLCAweEIwQkQsIDB4QjBCRSwgMHhCMEJGLCAweEIwQzAsIDB4QjBDMSwgMHhCMEMyLAotICAgIDB4QjBDMywgMHhCMEM2LCAweEIwQ0EsIDB4QjBDQiwgMHhCMENDLCAweEIwQ0QsIDB4QjBDRSwgMHhCMENGLAotICAgIDB4QjBEMiwgMHhCMEQzLCAweEIwRDUsIDB4QjBENiwgMHhCMEQ3LCAweEIwRDksIDB4QjBEQSwgMHhCMERCLAotICAgIDB4QjBEQywgMHhCMERELCAweEIwREUsIDB4QjBERiwgMHhCMEUxLCAweEIwRTIsIDB4QjBFMywgMHhCMEU0LAotICAgIDB4QjBFNiwgMHhCMEU3LCAweEIwRTgsIDB4QjBFOSwgMHhCMEVBLCAweEIwRUIsIDB4QjBFQywgMHhCMEVELAotICAgIDB4QjBFRSwgMHhCMEVGLCAweEIwRjAsIDB4QjBGMSwgMHhCMEYyLCAweEIwRjMsIDB4QjBGNCwgMHhCMEY1LAotICAgIDB4QjBGNiwgMHhCMEY3LCAweEIwRjgsIDB4QjBGOSwgMHhCMEZBLCAweEIwRkIsIDB4QjBGQywgMHhCMEZELAotICAgIDB4QjBGRSwgMHhCMEZGLCAweEIxMDAsIDB4QjEwMSwgMHhCMTAyLCAweEIxMDMsIDB4QjEwNCwgMHhCMTA1LAotICAgIDB4QjEwNiwgMHhCMTA3LCAweEIxMEEsIDB4QjEwRCwgMHhCMTBFLCAweEIxMEYsIDB4QjExMSwgMHhCMTE0LAotICAgIDB4QjExNSwgMHhCMTE2LCAweEIxMTcsIDB4QjExQSwgMHhCMTFFLCAweEIxMUYsIDB4QjEyMCwgMHhCMTIxLAotICAgIDB4QjEyMiwgMHhCMTI2LCAweEIxMjcsIDB4QjEyOSwgMHhCMTJBLCAweEIxMkIsIDB4QjEyRCwgMHhCMTJFLAotICAgIDB4QjEyRiwgMHhCMTMwLCAweEIxMzEsIDB4QjEzMiwgMHhCMTMzLCAweEIxMzYsIDB4QjEzQSwgMHhCMTNCLAotICAgIDB4QjEzQywgMHhCMTNELCAweEIxM0UsIDB4QjEzRiwgMHhCMTQyLCAweEIxNDMsIDB4QjE0NSwgMHhCMTQ2LAotICAgIDB4QjE0NywgMHhCMTQ5LCAweEIxNEEsIDB4QjE0QiwgMHhCMTRDLCAweEIxNEQsIDB4QjE0RSwgMHhCMTRGLAotICAgIDB4QjE1MiwgMHhCMTUzLCAweEIxNTYsIDB4QjE1NywgMHhCMTU5LCAweEIxNUEsIDB4QjE1QiwgMHhCMTVELAotICAgIDB4QjE1RSwgMHhCMTVGLCAweEIxNjEsIDB4QjE2MiwgMHhCMTYzLCAweEIxNjQsIDB4QjE2NSwgMHhCMTY2LAotICAgIDB4QjE2NywgMHhCMTY4LCAweEIxNjksIDB4QjE2QSwgMHhCMTZCLCAweEIxNkMsIDB4QjE2RCwgMHhCMTZFLAotICAgIDB4QjE2RiwgMHhCMTcwLCAweEIxNzEsIDB4QjE3MiwgMHhCMTczLCAweEIxNzQsIDB4QjE3NSwgMHhCMTc2LAotICAgIDB4QjE3NywgMHhCMTdBLCAweEIxN0IsIDB4QjE3RCwgMHhCMTdFLCAweEIxN0YsIDB4QjE4MSwgMHhCMTgzLAotICAgIDB4QjE4NCwgMHhCMTg1LCAweEIxODYsIDB4QjE4NywgMHhCMThBLCAweEIxOEMsIDB4QjE4RSwgMHhCMThGLAotICAgIDB4QjE5MCwgMHhCMTkxLCAweEIxOTUsIDB4QjE5NiwgMHhCMTk3LCAweEIxOTksIDB4QjE5QSwgMHhCMTlCLAotICAgIDB4QjE5RCwgMHhCMTlFLCAweEIxOUYsIDB4QjFBMCwgMHhCMUExLCAweEIxQTIsIDB4QjFBMywgMHhCMUE0LAotICAgIDB4QjFBNSwgMHhCMUE2LCAweEIxQTcsIDB4QjFBOSwgMHhCMUFBLCAweEIxQUIsIDB4QjFBQywgMHhCMUFELAotICAgIDB4QjFBRSwgMHhCMUFGLCAweEIxQjAsIDB4QjFCMSwgMHhCMUIyLCAweEIxQjMsIDB4QjFCNCwgMHhCMUI1LAotICAgIDB4QjFCNiwgMHhCMUI3LCAweEIxQjgsIDB4QjFCOSwgMHhCMUJBLCAweEIxQkIsIDB4QjFCQywgMHhCMUJELAotICAgIDB4QjFCRSwgMHhCMUJGLCAweEIxQzAsIDB4QjFDMSwgMHhCMUMyLCAweEIxQzMsIDB4QjFDNCwgMHhCMUM1LAotICAgIDB4QjFDNiwgMHhCMUM3LCAweEIxQzgsIDB4QjFDOSwgMHhCMUNBLCAweEIxQ0IsIDB4QjFDRCwgMHhCMUNFLAotICAgIDB4QjFDRiwgMHhCMUQxLCAweEIxRDIsIDB4QjFEMywgMHhCMUQ1LCAweEIxRDYsIDB4QjFENywgMHhCMUQ4LAotICAgIDB4QjFEOSwgMHhCMURBLCAweEIxREIsIDB4QjFERSwgMHhCMUUwLCAweEIxRTEsIDB4QjFFMiwgMHhCMUUzLAotICAgIDB4QjFFNCwgMHhCMUU1LCAweEIxRTYsIDB4QjFFNywgMHhCMUVBLCAweEIxRUIsIDB4QjFFRCwgMHhCMUVFLAotICAgIDB4QjFFRiwgMHhCMUYxLCAweEIxRjIsIDB4QjFGMywgMHhCMUY0LCAweEIxRjUsIDB4QjFGNiwgMHhCMUY3LAotICAgIDB4QjFGOCwgMHhCMUZBLCAweEIxRkMsIDB4QjFGRSwgMHhCMUZGLCAweEIyMDAsIDB4QjIwMSwgMHhCMjAyLAotICAgIDB4QjIwMywgMHhCMjA2LCAweEIyMDcsIDB4QjIwOSwgMHhCMjBBLCAweEIyMEQsIDB4QjIwRSwgMHhCMjBGLAotICAgIDB4QjIxMCwgMHhCMjExLCAweEIyMTIsIDB4QjIxMywgMHhCMjE2LCAweEIyMTgsIDB4QjIxQSwgMHhCMjFCLAotICAgIDB4QjIxQywgMHhCMjFELCAweEIyMUUsIDB4QjIxRiwgMHhCMjIxLCAweEIyMjIsIDB4QjIyMywgMHhCMjI0LAotICAgIDB4QjIyNSwgMHhCMjI2LCAweEIyMjcsIDB4QjIyOCwgMHhCMjI5LCAweEIyMkEsIDB4QjIyQiwgMHhCMjJDLAotICAgIDB4QjIyRCwgMHhCMjJFLCAweEIyMkYsIDB4QjIzMCwgMHhCMjMxLCAweEIyMzIsIDB4QjIzMywgMHhCMjM1LAotICAgIDB4QjIzNiwgMHhCMjM3LCAweEIyMzgsIDB4QjIzOSwgMHhCMjNBLCAweEIyM0IsIDB4QjIzRCwgMHhCMjNFLAotICAgIDB4QjIzRiwgMHhCMjQwLCAweEIyNDEsIDB4QjI0MiwgMHhCMjQzLCAweEIyNDQsIDB4QjI0NSwgMHhCMjQ2LAotICAgIDB4QjI0NywgMHhCMjQ4LCAweEIyNDksIDB4QjI0QSwgMHhCMjRCLCAweEIyNEMsIDB4QjI0RCwgMHhCMjRFLAotICAgIDB4QjI0RiwgMHhCMjUwLCAweEIyNTEsIDB4QjI1MiwgMHhCMjUzLCAweEIyNTQsIDB4QjI1NSwgMHhCMjU2LAotICAgIDB4QjI1NywgMHhCMjU5LCAweEIyNUEsIDB4QjI1QiwgMHhCMjVELCAweEIyNUUsIDB4QjI1RiwgMHhCMjYxLAotICAgIDB4QjI2MiwgMHhCMjYzLCAweEIyNjQsIDB4QjI2NSwgMHhCMjY2LCAweEIyNjcsIDB4QjI2QSwgMHhCMjZCLAotICAgIDB4QjI2QywgMHhCMjZELCAweEIyNkUsIDB4QjI2RiwgMHhCMjcwLCAweEIyNzEsIDB4QjI3MiwgMHhCMjczLAotICAgIDB4QjI3NiwgMHhCMjc3LCAweEIyNzgsIDB4QjI3OSwgMHhCMjdBLCAweEIyN0IsIDB4QjI3RCwgMHhCMjdFLAotICAgIDB4QjI3RiwgMHhCMjgwLCAweEIyODEsIDB4QjI4MiwgMHhCMjgzLCAweEIyODYsIDB4QjI4NywgMHhCMjg4LAotICAgIDB4QjI4QSwgMHhCMjhCLCAweEIyOEMsIDB4QjI4RCwgMHhCMjhFLCAweEIyOEYsIDB4QjI5MiwgMHhCMjkzLAotICAgIDB4QjI5NSwgMHhCMjk2LCAweEIyOTcsIDB4QjI5QiwgMHhCMjlDLCAweEIyOUQsIDB4QjI5RSwgMHhCMjlGLAotICAgIDB4QjJBMiwgMHhCMkE0LCAweEIyQTcsIDB4QjJBOCwgMHhCMkE5LCAweEIyQUIsIDB4QjJBRCwgMHhCMkFFLAotICAgIDB4QjJBRiwgMHhCMkIxLCAweEIyQjIsIDB4QjJCMywgMHhCMkI1LCAweEIyQjYsIDB4QjJCNywgMHhCMkI4LAotICAgIDB4QjJCOSwgMHhCMkJBLCAweEIyQkIsIDB4QjJCQywgMHhCMkJELCAweEIyQkUsIDB4QjJCRiwgMHhCMkMwLAotICAgIDB4QjJDMSwgMHhCMkMyLCAweEIyQzMsIDB4QjJDNCwgMHhCMkM1LCAweEIyQzYsIDB4QjJDNywgMHhCMkNBLAotICAgIDB4QjJDQiwgMHhCMkNELCAweEIyQ0UsIDB4QjJDRiwgMHhCMkQxLCAweEIyRDMsIDB4QjJENCwgMHhCMkQ1LAotICAgIDB4QjJENiwgMHhCMkQ3LCAweEIyREEsIDB4QjJEQywgMHhCMkRFLCAweEIyREYsIDB4QjJFMCwgMHhCMkUxLAotICAgIDB4QjJFMywgMHhCMkU3LCAweEIyRTksIDB4QjJFQSwgMHhCMkYwLCAweEIyRjEsIDB4QjJGMiwgMHhCMkY2LAotICAgIDB4QjJGQywgMHhCMkZELCAweEIyRkUsIDB4QjMwMiwgMHhCMzAzLCAweEIzMDUsIDB4QjMwNiwgMHhCMzA3LAotICAgIDB4QjMwOSwgMHhCMzBBLCAweEIzMEIsIDB4QjMwQywgMHhCMzBELCAweEIzMEUsIDB4QjMwRiwgMHhCMzEyLAotICAgIDB4QjMxNiwgMHhCMzE3LCAweEIzMTgsIDB4QjMxOSwgMHhCMzFBLCAweEIzMUIsIDB4QjMxRCwgMHhCMzFFLAotICAgIDB4QjMxRiwgMHhCMzIwLCAweEIzMjEsIDB4QjMyMiwgMHhCMzIzLCAweEIzMjQsIDB4QjMyNSwgMHhCMzI2LAotICAgIDB4QjMyNywgMHhCMzI4LCAweEIzMjksIDB4QjMyQSwgMHhCMzJCLCAweEIzMkMsIDB4QjMyRCwgMHhCMzJFLAotICAgIDB4QjMyRiwgMHhCMzMwLCAweEIzMzEsIDB4QjMzMiwgMHhCMzMzLCAweEIzMzQsIDB4QjMzNSwgMHhCMzM2LAotICAgIDB4QjMzNywgMHhCMzM4LCAweEIzMzksIDB4QjMzQSwgMHhCMzNCLCAweEIzM0MsIDB4QjMzRCwgMHhCMzNFLAotICAgIDB4QjMzRiwgMHhCMzQwLCAweEIzNDEsIDB4QjM0MiwgMHhCMzQzLCAweEIzNDQsIDB4QjM0NSwgMHhCMzQ2LAotICAgIDB4QjM0NywgMHhCMzQ4LCAweEIzNDksIDB4QjM0QSwgMHhCMzRCLCAweEIzNEMsIDB4QjM0RCwgMHhCMzRFLAotICAgIDB4QjM0RiwgMHhCMzUwLCAweEIzNTEsIDB4QjM1MiwgMHhCMzUzLCAweEIzNTcsIDB4QjM1OSwgMHhCMzVBLAotICAgIDB4QjM1RCwgMHhCMzYwLCAweEIzNjEsIDB4QjM2MiwgMHhCMzYzLCAweEIzNjYsIDB4QjM2OCwgMHhCMzZBLAotICAgIDB4QjM2QywgMHhCMzZELCAweEIzNkYsIDB4QjM3MiwgMHhCMzczLCAweEIzNzUsIDB4QjM3NiwgMHhCMzc3LAotICAgIDB4QjM3OSwgMHhCMzdBLCAweEIzN0IsIDB4QjM3QywgMHhCMzdELCAweEIzN0UsIDB4QjM3RiwgMHhCMzgyLAotICAgIDB4QjM4NiwgMHhCMzg3LCAweEIzODgsIDB4QjM4OSwgMHhCMzhBLCAweEIzOEIsIDB4QjM4RCwgMHhCMzhFLAotICAgIDB4QjM4RiwgMHhCMzkxLCAweEIzOTIsIDB4QjM5MywgMHhCMzk1LCAweEIzOTYsIDB4QjM5NywgMHhCMzk4LAotICAgIDB4QjM5OSwgMHhCMzlBLCAweEIzOUIsIDB4QjM5QywgMHhCMzlELCAweEIzOUUsIDB4QjM5RiwgMHhCM0EyLAotICAgIDB4QjNBMywgMHhCM0E0LCAweEIzQTUsIDB4QjNBNiwgMHhCM0E3LCAweEIzQTksIDB4QjNBQSwgMHhCM0FCLAotICAgIDB4QjNBRCwgMHhCM0FFLCAweEIzQUYsIDB4QjNCMCwgMHhCM0IxLCAweEIzQjIsIDB4QjNCMywgMHhCM0I0LAotICAgIDB4QjNCNSwgMHhCM0I2LCAweEIzQjcsIDB4QjNCOCwgMHhCM0I5LCAweEIzQkEsIDB4QjNCQiwgMHhCM0JDLAotICAgIDB4QjNCRCwgMHhCM0JFLCAweEIzQkYsIDB4QjNDMCwgMHhCM0MxLCAweEIzQzIsIDB4QjNDMywgMHhCM0M2LAotICAgIDB4QjNDNywgMHhCM0M5LCAweEIzQ0EsIDB4QjNDRCwgMHhCM0NGLCAweEIzRDEsIDB4QjNEMiwgMHhCM0QzLAotICAgIDB4QjNENiwgMHhCM0Q4LCAweEIzREEsIDB4QjNEQywgMHhCM0RFLCAweEIzREYsIDB4QjNFMSwgMHhCM0UyLAotICAgIDB4QjNFMywgMHhCM0U1LCAweEIzRTYsIDB4QjNFNywgMHhCM0U5LCAweEIzRUEsIDB4QjNFQiwgMHhCM0VDLAotICAgIDB4QjNFRCwgMHhCM0VFLCAweEIzRUYsIDB4QjNGMCwgMHhCM0YxLCAweEIzRjIsIDB4QjNGMywgMHhCM0Y0LAotICAgIDB4QjNGNSwgMHhCM0Y2LCAweEIzRjcsIDB4QjNGOCwgMHhCM0Y5LCAweEIzRkEsIDB4QjNGQiwgMHhCM0ZELAotICAgIDB4QjNGRSwgMHhCM0ZGLCAweEI0MDAsIDB4QjQwMSwgMHhCNDAyLCAweEI0MDMsIDB4QjQwNCwgMHhCNDA1LAotICAgIDB4QjQwNiwgMHhCNDA3LCAweEI0MDgsIDB4QjQwOSwgMHhCNDBBLCAweEI0MEIsIDB4QjQwQywgMHhCNDBELAotICAgIDB4QjQwRSwgMHhCNDBGLCAweEI0MTEsIDB4QjQxMiwgMHhCNDEzLCAweEI0MTQsIDB4QjQxNSwgMHhCNDE2LAotICAgIDB4QjQxNywgMHhCNDE5LCAweEI0MUEsIDB4QjQxQiwgMHhCNDFELCAweEI0MUUsIDB4QjQxRiwgMHhCNDIxLAotICAgIDB4QjQyMiwgMHhCNDIzLCAweEI0MjQsIDB4QjQyNSwgMHhCNDI2LCAweEI0MjcsIDB4QjQyQSwgMHhCNDJDLAotICAgIDB4QjQyRCwgMHhCNDJFLCAweEI0MkYsIDB4QjQzMCwgMHhCNDMxLCAweEI0MzIsIDB4QjQzMywgMHhCNDM1LAotICAgIDB4QjQzNiwgMHhCNDM3LCAweEI0MzgsIDB4QjQzOSwgMHhCNDNBLCAweEI0M0IsIDB4QjQzQywgMHhCNDNELAotICAgIDB4QjQzRSwgMHhCNDNGLCAweEI0NDAsIDB4QjQ0MSwgMHhCNDQyLCAweEI0NDMsIDB4QjQ0NCwgMHhCNDQ1LAotICAgIDB4QjQ0NiwgMHhCNDQ3LCAweEI0NDgsIDB4QjQ0OSwgMHhCNDRBLCAweEI0NEIsIDB4QjQ0QywgMHhCNDRELAotICAgIDB4QjQ0RSwgMHhCNDRGLCAweEI0NTIsIDB4QjQ1MywgMHhCNDU1LCAweEI0NTYsIDB4QjQ1NywgMHhCNDU5LAotICAgIDB4QjQ1QSwgMHhCNDVCLCAweEI0NUMsIDB4QjQ1RCwgMHhCNDVFLCAweEI0NUYsIDB4QjQ2MiwgMHhCNDY0LAotICAgIDB4QjQ2NiwgMHhCNDY3LCAweEI0NjgsIDB4QjQ2OSwgMHhCNDZBLCAweEI0NkIsIDB4QjQ2RCwgMHhCNDZFLAotICAgIDB4QjQ2RiwgMHhCNDcwLCAweEI0NzEsIDB4QjQ3MiwgMHhCNDczLCAweEI0NzQsIDB4QjQ3NSwgMHhCNDc2LAotICAgIDB4QjQ3NywgMHhCNDc4LCAweEI0NzksIDB4QjQ3QSwgMHhCNDdCLCAweEI0N0MsIDB4QjQ3RCwgMHhCNDdFLAotICAgIDB4QjQ3RiwgMHhCNDgxLCAweEI0ODIsIDB4QjQ4MywgMHhCNDg0LCAweEI0ODUsIDB4QjQ4NiwgMHhCNDg3LAotICAgIDB4QjQ4OSwgMHhCNDhBLCAweEI0OEIsIDB4QjQ4QywgMHhCNDhELCAweEI0OEUsIDB4QjQ4RiwgMHhCNDkwLAotICAgIDB4QjQ5MSwgMHhCNDkyLCAweEI0OTMsIDB4QjQ5NCwgMHhCNDk1LCAweEI0OTYsIDB4QjQ5NywgMHhCNDk4LAotICAgIDB4QjQ5OSwgMHhCNDlBLCAweEI0OUIsIDB4QjQ5QywgMHhCNDlFLCAweEI0OUYsIDB4QjRBMCwgMHhCNEExLAotICAgIDB4QjRBMiwgMHhCNEEzLCAweEI0QTUsIDB4QjRBNiwgMHhCNEE3LCAweEI0QTksIDB4QjRBQSwgMHhCNEFCLAotICAgIDB4QjRBRCwgMHhCNEFFLCAweEI0QUYsIDB4QjRCMCwgMHhCNEIxLCAweEI0QjIsIDB4QjRCMywgMHhCNEI0LAotICAgIDB4QjRCNiwgMHhCNEI4LCAweEI0QkEsIDB4QjRCQiwgMHhCNEJDLCAweEI0QkQsIDB4QjRCRSwgMHhCNEJGLAotICAgIDB4QjRDMSwgMHhCNEMyLCAweEI0QzMsIDB4QjRDNSwgMHhCNEM2LCAweEI0QzcsIDB4QjRDOSwgMHhCNENBLAotICAgIDB4QjRDQiwgMHhCNENDLCAweEI0Q0QsIDB4QjRDRSwgMHhCNENGLCAweEI0RDEsIDB4QjREMiwgMHhCNEQzLAotICAgIDB4QjRENCwgMHhCNEQ2LCAweEI0RDcsIDB4QjREOCwgMHhCNEQ5LCAweEI0REEsIDB4QjREQiwgMHhCNERFLAotICAgIDB4QjRERiwgMHhCNEUxLCAweEI0RTIsIDB4QjRFNSwgMHhCNEU3LCAweEI0RTgsIDB4QjRFOSwgMHhCNEVBLAotICAgIDB4QjRFQiwgMHhCNEVFLCAweEI0RjAsIDB4QjRGMiwgMHhCNEYzLCAweEI0RjQsIDB4QjRGNSwgMHhCNEY2LAotICAgIDB4QjRGNywgMHhCNEY5LCAweEI0RkEsIDB4QjRGQiwgMHhCNEZDLCAweEI0RkQsIDB4QjRGRSwgMHhCNEZGLAotICAgIDB4QjUwMCwgMHhCNTAxLCAweEI1MDIsIDB4QjUwMywgMHhCNTA0LCAweEI1MDUsIDB4QjUwNiwgMHhCNTA3LAotICAgIDB4QjUwOCwgMHhCNTA5LCAweEI1MEEsIDB4QjUwQiwgMHhCNTBDLCAweEI1MEQsIDB4QjUwRSwgMHhCNTBGLAotICAgIDB4QjUxMCwgMHhCNTExLCAweEI1MTIsIDB4QjUxMywgMHhCNTE2LCAweEI1MTcsIDB4QjUxOSwgMHhCNTFBLAotICAgIDB4QjUxRCwgMHhCNTFFLCAweEI1MUYsIDB4QjUyMCwgMHhCNTIxLCAweEI1MjIsIDB4QjUyMywgMHhCNTI2LAotICAgIDB4QjUyQiwgMHhCNTJDLCAweEI1MkQsIDB4QjUyRSwgMHhCNTJGLCAweEI1MzIsIDB4QjUzMywgMHhCNTM1LAotICAgIDB4QjUzNiwgMHhCNTM3LCAweEI1MzksIDB4QjUzQSwgMHhCNTNCLCAweEI1M0MsIDB4QjUzRCwgMHhCNTNFLAotICAgIDB4QjUzRiwgMHhCNTQyLCAweEI1NDYsIDB4QjU0NywgMHhCNTQ4LCAweEI1NDksIDB4QjU0QSwgMHhCNTRFLAotICAgIDB4QjU0RiwgMHhCNTUxLCAweEI1NTIsIDB4QjU1MywgMHhCNTU1LCAweEI1NTYsIDB4QjU1NywgMHhCNTU4LAotICAgIDB4QjU1OSwgMHhCNTVBLCAweEI1NUIsIDB4QjU1RSwgMHhCNTYyLCAweEI1NjMsIDB4QjU2NCwgMHhCNTY1LAotICAgIDB4QjU2NiwgMHhCNTY3LCAweEI1NjgsIDB4QjU2OSwgMHhCNTZBLCAweEI1NkIsIDB4QjU2QywgMHhCNTZELAotICAgIDB4QjU2RSwgMHhCNTZGLCAweEI1NzAsIDB4QjU3MSwgMHhCNTcyLCAweEI1NzMsIDB4QjU3NCwgMHhCNTc1LAotICAgIDB4QjU3NiwgMHhCNTc3LCAweEI1NzgsIDB4QjU3OSwgMHhCNTdBLCAweEI1N0IsIDB4QjU3QywgMHhCNTdELAotICAgIDB4QjU3RSwgMHhCNTdGLCAweEI1ODAsIDB4QjU4MSwgMHhCNTgyLCAweEI1ODMsIDB4QjU4NCwgMHhCNTg1LAotICAgIDB4QjU4NiwgMHhCNTg3LCAweEI1ODgsIDB4QjU4OSwgMHhCNThBLCAweEI1OEIsIDB4QjU4QywgMHhCNThELAotICAgIDB4QjU4RSwgMHhCNThGLCAweEI1OTAsIDB4QjU5MSwgMHhCNTkyLCAweEI1OTMsIDB4QjU5NCwgMHhCNTk1LAotICAgIDB4QjU5NiwgMHhCNTk3LCAweEI1OTgsIDB4QjU5OSwgMHhCNTlBLCAweEI1OUIsIDB4QjU5QywgMHhCNTlELAotICAgIDB4QjU5RSwgMHhCNTlGLCAweEI1QTIsIDB4QjVBMywgMHhCNUE1LCAweEI1QTYsIDB4QjVBNywgMHhCNUE5LAotICAgIDB4QjVBQywgMHhCNUFELCAweEI1QUUsIDB4QjVBRiwgMHhCNUIyLCAweEI1QjYsIDB4QjVCNywgMHhCNUI4LAotICAgIDB4QjVCOSwgMHhCNUJBLCAweEI1QkUsIDB4QjVCRiwgMHhCNUMxLCAweEI1QzIsIDB4QjVDMywgMHhCNUM1LAotICAgIDB4QjVDNiwgMHhCNUM3LCAweEI1QzgsIDB4QjVDOSwgMHhCNUNBLCAweEI1Q0IsIDB4QjVDRSwgMHhCNUQyLAotICAgIDB4QjVEMywgMHhCNUQ0LCAweEI1RDUsIDB4QjVENiwgMHhCNUQ3LCAweEI1RDksIDB4QjVEQSwgMHhCNURCLAotICAgIDB4QjVEQywgMHhCNURELCAweEI1REUsIDB4QjVERiwgMHhCNUUwLCAweEI1RTEsIDB4QjVFMiwgMHhCNUUzLAotICAgIDB4QjVFNCwgMHhCNUU1LCAweEI1RTYsIDB4QjVFNywgMHhCNUU4LCAweEI1RTksIDB4QjVFQSwgMHhCNUVCLAotICAgIDB4QjVFRCwgMHhCNUVFLCAweEI1RUYsIDB4QjVGMCwgMHhCNUYxLCAweEI1RjIsIDB4QjVGMywgMHhCNUY0LAotICAgIDB4QjVGNSwgMHhCNUY2LCAweEI1RjcsIDB4QjVGOCwgMHhCNUY5LCAweEI1RkEsIDB4QjVGQiwgMHhCNUZDLAotICAgIDB4QjVGRCwgMHhCNUZFLCAweEI1RkYsIDB4QjYwMCwgMHhCNjAxLCAweEI2MDIsIDB4QjYwMywgMHhCNjA0LAotICAgIDB4QjYwNSwgMHhCNjA2LCAweEI2MDcsIDB4QjYwOCwgMHhCNjA5LCAweEI2MEEsIDB4QjYwQiwgMHhCNjBDLAotICAgIDB4QjYwRCwgMHhCNjBFLCAweEI2MEYsIDB4QjYxMiwgMHhCNjEzLCAweEI2MTUsIDB4QjYxNiwgMHhCNjE3LAotICAgIDB4QjYxOSwgMHhCNjFBLCAweEI2MUIsIDB4QjYxQywgMHhCNjFELCAweEI2MUUsIDB4QjYxRiwgMHhCNjIwLAotICAgIDB4QjYyMSwgMHhCNjIyLCAweEI2MjMsIDB4QjYyNCwgMHhCNjI2LCAweEI2MjcsIDB4QjYyOCwgMHhCNjI5LAotICAgIDB4QjYyQSwgMHhCNjJCLCAweEI2MkQsIDB4QjYyRSwgMHhCNjJGLCAweEI2MzAsIDB4QjYzMSwgMHhCNjMyLAotICAgIDB4QjYzMywgMHhCNjM1LCAweEI2MzYsIDB4QjYzNywgMHhCNjM4LCAweEI2MzksIDB4QjYzQSwgMHhCNjNCLAotICAgIDB4QjYzQywgMHhCNjNELCAweEI2M0UsIDB4QjYzRiwgMHhCNjQwLCAweEI2NDEsIDB4QjY0MiwgMHhCNjQzLAotICAgIDB4QjY0NCwgMHhCNjQ1LCAweEI2NDYsIDB4QjY0NywgMHhCNjQ5LCAweEI2NEEsIDB4QjY0QiwgMHhCNjRDLAotICAgIDB4QjY0RCwgMHhCNjRFLCAweEI2NEYsIDB4QjY1MCwgMHhCNjUxLCAweEI2NTIsIDB4QjY1MywgMHhCNjU0LAotICAgIDB4QjY1NSwgMHhCNjU2LCAweEI2NTcsIDB4QjY1OCwgMHhCNjU5LCAweEI2NUEsIDB4QjY1QiwgMHhCNjVDLAotICAgIDB4QjY1RCwgMHhCNjVFLCAweEI2NUYsIDB4QjY2MCwgMHhCNjYxLCAweEI2NjIsIDB4QjY2MywgMHhCNjY1LAotICAgIDB4QjY2NiwgMHhCNjY3LCAweEI2NjksIDB4QjY2QSwgMHhCNjZCLCAweEI2NkMsIDB4QjY2RCwgMHhCNjZFLAotICAgIDB4QjY2RiwgMHhCNjcwLCAweEI2NzEsIDB4QjY3MiwgMHhCNjczLCAweEI2NzQsIDB4QjY3NSwgMHhCNjc2LAotICAgIDB4QjY3NywgMHhCNjc4LCAweEI2NzksIDB4QjY3QSwgMHhCNjdCLCAweEI2N0MsIDB4QjY3RCwgMHhCNjdFLAotICAgIDB4QjY3RiwgMHhCNjgwLCAweEI2ODEsIDB4QjY4MiwgMHhCNjgzLCAweEI2ODQsIDB4QjY4NSwgMHhCNjg2LAotICAgIDB4QjY4NywgMHhCNjg4LCAweEI2ODksIDB4QjY4QSwgMHhCNjhCLCAweEI2OEMsIDB4QjY4RCwgMHhCNjhFLAotICAgIDB4QjY4RiwgMHhCNjkwLCAweEI2OTEsIDB4QjY5MiwgMHhCNjkzLCAweEI2OTQsIDB4QjY5NSwgMHhCNjk2LAotICAgIDB4QjY5NywgMHhCNjk4LCAweEI2OTksIDB4QjY5QSwgMHhCNjlCLCAweEI2OUUsIDB4QjY5RiwgMHhCNkExLAotICAgIDB4QjZBMiwgMHhCNkEzLCAweEI2QTUsIDB4QjZBNiwgMHhCNkE3LCAweEI2QTgsIDB4QjZBOSwgMHhCNkFBLAotICAgIDB4QjZBRCwgMHhCNkFFLCAweEI2QUYsIDB4QjZCMCwgMHhCNkIyLCAweEI2QjMsIDB4QjZCNCwgMHhCNkI1LAotICAgIDB4QjZCNiwgMHhCNkI3LCAweEI2QjgsIDB4QjZCOSwgMHhCNkJBLCAweEI2QkIsIDB4QjZCQywgMHhCNkJELAotICAgIDB4QjZCRSwgMHhCNkJGLCAweEI2QzAsIDB4QjZDMSwgMHhCNkMyLCAweEI2QzMsIDB4QjZDNCwgMHhCNkM1LAotICAgIDB4QjZDNiwgMHhCNkM3LCAweEI2QzgsIDB4QjZDOSwgMHhCNkNBLCAweEI2Q0IsIDB4QjZDQywgMHhCNkNELAotICAgIDB4QjZDRSwgMHhCNkNGLCAweEI2RDAsIDB4QjZEMSwgMHhCNkQyLCAweEI2RDMsIDB4QjZENSwgMHhCNkQ2LAotICAgIDB4QjZENywgMHhCNkQ4LCAweEI2RDksIDB4QjZEQSwgMHhCNkRCLCAweEI2REMsIDB4QjZERCwgMHhCNkRFLAotICAgIDB4QjZERiwgMHhCNkUwLCAweEI2RTEsIDB4QjZFMiwgMHhCNkUzLCAweEI2RTQsIDB4QjZFNSwgMHhCNkU2LAotICAgIDB4QjZFNywgMHhCNkU4LCAweEI2RTksIDB4QjZFQSwgMHhCNkVCLCAweEI2RUMsIDB4QjZFRCwgMHhCNkVFLAotICAgIDB4QjZFRiwgMHhCNkYxLCAweEI2RjIsIDB4QjZGMywgMHhCNkY1LCAweEI2RjYsIDB4QjZGNywgMHhCNkY5LAotICAgIDB4QjZGQSwgMHhCNkZCLCAweEI2RkMsIDB4QjZGRCwgMHhCNkZFLCAweEI2RkYsIDB4QjcwMiwgMHhCNzAzLAotICAgIDB4QjcwNCwgMHhCNzA2LCAweEI3MDcsIDB4QjcwOCwgMHhCNzA5LCAweEI3MEEsIDB4QjcwQiwgMHhCNzBDLAotICAgIDB4QjcwRCwgMHhCNzBFLCAweEI3MEYsIDB4QjcxMCwgMHhCNzExLCAweEI3MTIsIDB4QjcxMywgMHhCNzE0LAotICAgIDB4QjcxNSwgMHhCNzE2LCAweEI3MTcsIDB4QjcxOCwgMHhCNzE5LCAweEI3MUEsIDB4QjcxQiwgMHhCNzFDLAotICAgIDB4QjcxRCwgMHhCNzFFLCAweEI3MUYsIDB4QjcyMCwgMHhCNzIxLCAweEI3MjIsIDB4QjcyMywgMHhCNzI0LAotICAgIDB4QjcyNSwgMHhCNzI2LCAweEI3MjcsIDB4QjcyQSwgMHhCNzJCLCAweEI3MkQsIDB4QjcyRSwgMHhCNzMxLAotICAgIDB4QjczMiwgMHhCNzMzLCAweEI3MzQsIDB4QjczNSwgMHhCNzM2LCAweEI3MzcsIDB4QjczQSwgMHhCNzNDLAotICAgIDB4QjczRCwgMHhCNzNFLCAweEI3M0YsIDB4Qjc0MCwgMHhCNzQxLCAweEI3NDIsIDB4Qjc0MywgMHhCNzQ1LAotICAgIDB4Qjc0NiwgMHhCNzQ3LCAweEI3NDksIDB4Qjc0QSwgMHhCNzRCLCAweEI3NEQsIDB4Qjc0RSwgMHhCNzRGLAotICAgIDB4Qjc1MCwgMHhCNzUxLCAweEI3NTIsIDB4Qjc1MywgMHhCNzU2LCAweEI3NTcsIDB4Qjc1OCwgMHhCNzU5LAotICAgIDB4Qjc1QSwgMHhCNzVCLCAweEI3NUMsIDB4Qjc1RCwgMHhCNzVFLCAweEI3NUYsIDB4Qjc2MSwgMHhCNzYyLAotICAgIDB4Qjc2MywgMHhCNzY1LCAweEI3NjYsIDB4Qjc2NywgMHhCNzY5LCAweEI3NkEsIDB4Qjc2QiwgMHhCNzZDLAotICAgIDB4Qjc2RCwgMHhCNzZFLCAweEI3NkYsIDB4Qjc3MiwgMHhCNzc0LCAweEI3NzYsIDB4Qjc3NywgMHhCNzc4LAotICAgIDB4Qjc3OSwgMHhCNzdBLCAweEI3N0IsIDB4Qjc3RSwgMHhCNzdGLCAweEI3ODEsIDB4Qjc4MiwgMHhCNzgzLAotICAgIDB4Qjc4NSwgMHhCNzg2LCAweEI3ODcsIDB4Qjc4OCwgMHhCNzg5LCAweEI3OEEsIDB4Qjc4QiwgMHhCNzhFLAotICAgIDB4Qjc5MywgMHhCNzk0LCAweEI3OTUsIDB4Qjc5QSwgMHhCNzlCLCAweEI3OUQsIDB4Qjc5RSwgMHhCNzlGLAotICAgIDB4QjdBMSwgMHhCN0EyLCAweEI3QTMsIDB4QjdBNCwgMHhCN0E1LCAweEI3QTYsIDB4QjdBNywgMHhCN0FBLAotICAgIDB4QjdBRSwgMHhCN0FGLCAweEI3QjAsIDB4QjdCMSwgMHhCN0IyLCAweEI3QjMsIDB4QjdCNiwgMHhCN0I3LAotICAgIDB4QjdCOSwgMHhCN0JBLCAweEI3QkIsIDB4QjdCQywgMHhCN0JELCAweEI3QkUsIDB4QjdCRiwgMHhCN0MwLAotICAgIDB4QjdDMSwgMHhCN0MyLCAweEI3QzMsIDB4QjdDNCwgMHhCN0M1LCAweEI3QzYsIDB4QjdDOCwgMHhCN0NBLAotICAgIDB4QjdDQiwgMHhCN0NDLCAweEI3Q0QsIDB4QjdDRSwgMHhCN0NGLCAweEI3RDAsIDB4QjdEMSwgMHhCN0QyLAotICAgIDB4QjdEMywgMHhCN0Q0LCAweEI3RDUsIDB4QjdENiwgMHhCN0Q3LCAweEI3RDgsIDB4QjdEOSwgMHhCN0RBLAotICAgIDB4QjdEQiwgMHhCN0RDLCAweEI3REQsIDB4QjdERSwgMHhCN0RGLCAweEI3RTAsIDB4QjdFMSwgMHhCN0UyLAotICAgIDB4QjdFMywgMHhCN0U0LCAweEI3RTUsIDB4QjdFNiwgMHhCN0U3LCAweEI3RTgsIDB4QjdFOSwgMHhCN0VBLAotICAgIDB4QjdFQiwgMHhCN0VFLCAweEI3RUYsIDB4QjdGMSwgMHhCN0YyLCAweEI3RjMsIDB4QjdGNSwgMHhCN0Y2LAotICAgIDB4QjdGNywgMHhCN0Y4LCAweEI3RjksIDB4QjdGQSwgMHhCN0ZCLCAweEI3RkUsIDB4QjgwMiwgMHhCODAzLAotICAgIDB4QjgwNCwgMHhCODA1LCAweEI4MDYsIDB4QjgwQSwgMHhCODBCLCAweEI4MEQsIDB4QjgwRSwgMHhCODBGLAotICAgIDB4QjgxMSwgMHhCODEyLCAweEI4MTMsIDB4QjgxNCwgMHhCODE1LCAweEI4MTYsIDB4QjgxNywgMHhCODFBLAotICAgIDB4QjgxQywgMHhCODFFLCAweEI4MUYsIDB4QjgyMCwgMHhCODIxLCAweEI4MjIsIDB4QjgyMywgMHhCODI2LAotICAgIDB4QjgyNywgMHhCODI5LCAweEI4MkEsIDB4QjgyQiwgMHhCODJELCAweEI4MkUsIDB4QjgyRiwgMHhCODMwLAotICAgIDB4QjgzMSwgMHhCODMyLCAweEI4MzMsIDB4QjgzNiwgMHhCODNBLCAweEI4M0IsIDB4QjgzQywgMHhCODNELAotICAgIDB4QjgzRSwgMHhCODNGLCAweEI4NDEsIDB4Qjg0MiwgMHhCODQzLCAweEI4NDUsIDB4Qjg0NiwgMHhCODQ3LAotICAgIDB4Qjg0OCwgMHhCODQ5LCAweEI4NEEsIDB4Qjg0QiwgMHhCODRDLCAweEI4NEQsIDB4Qjg0RSwgMHhCODRGLAotICAgIDB4Qjg1MCwgMHhCODUyLCAweEI4NTQsIDB4Qjg1NSwgMHhCODU2LCAweEI4NTcsIDB4Qjg1OCwgMHhCODU5LAotICAgIDB4Qjg1QSwgMHhCODVCLCAweEI4NUUsIDB4Qjg1RiwgMHhCODYxLCAweEI4NjIsIDB4Qjg2MywgMHhCODY1LAotICAgIDB4Qjg2NiwgMHhCODY3LCAweEI4NjgsIDB4Qjg2OSwgMHhCODZBLCAweEI4NkIsIDB4Qjg2RSwgMHhCODcwLAotICAgIDB4Qjg3MiwgMHhCODczLCAweEI4NzQsIDB4Qjg3NSwgMHhCODc2LCAweEI4NzcsIDB4Qjg3OSwgMHhCODdBLAotICAgIDB4Qjg3QiwgMHhCODdELCAweEI4N0UsIDB4Qjg3RiwgMHhCODgwLCAweEI4ODEsIDB4Qjg4MiwgMHhCODgzLAotICAgIDB4Qjg4NCwgMHhCODg1LCAweEI4ODYsIDB4Qjg4NywgMHhCODg4LCAweEI4ODksIDB4Qjg4QSwgMHhCODhCLAotICAgIDB4Qjg4QywgMHhCODhFLCAweEI4OEYsIDB4Qjg5MCwgMHhCODkxLCAweEI4OTIsIDB4Qjg5MywgMHhCODk0LAotICAgIDB4Qjg5NSwgMHhCODk2LCAweEI4OTcsIDB4Qjg5OCwgMHhCODk5LCAweEI4OUEsIDB4Qjg5QiwgMHhCODlDLAotICAgIDB4Qjg5RCwgMHhCODlFLCAweEI4OUYsIDB4QjhBMCwgMHhCOEExLCAweEI4QTIsIDB4QjhBMywgMHhCOEE0LAotICAgIDB4QjhBNSwgMHhCOEE2LCAweEI4QTcsIDB4QjhBOSwgMHhCOEFBLCAweEI4QUIsIDB4QjhBQywgMHhCOEFELAotICAgIDB4QjhBRSwgMHhCOEFGLCAweEI4QjEsIDB4QjhCMiwgMHhCOEIzLCAweEI4QjUsIDB4QjhCNiwgMHhCOEI3LAotICAgIDB4QjhCOSwgMHhCOEJBLCAweEI4QkIsIDB4QjhCQywgMHhCOEJELCAweEI4QkUsIDB4QjhCRiwgMHhCOEMyLAotICAgIDB4QjhDNCwgMHhCOEM2LCAweEI4QzcsIDB4QjhDOCwgMHhCOEM5LCAweEI4Q0EsIDB4QjhDQiwgMHhCOENELAotICAgIDB4QjhDRSwgMHhCOENGLCAweEI4RDEsIDB4QjhEMiwgMHhCOEQzLCAweEI4RDUsIDB4QjhENiwgMHhCOEQ3LAotICAgIDB4QjhEOCwgMHhCOEQ5LCAweEI4REEsIDB4QjhEQiwgMHhCOERDLCAweEI4REUsIDB4QjhFMCwgMHhCOEUyLAotICAgIDB4QjhFMywgMHhCOEU0LCAweEI4RTUsIDB4QjhFNiwgMHhCOEU3LCAweEI4RUEsIDB4QjhFQiwgMHhCOEVELAotICAgIDB4QjhFRSwgMHhCOEVGLCAweEI4RjEsIDB4QjhGMiwgMHhCOEYzLCAweEI4RjQsIDB4QjhGNSwgMHhCOEY2LAotICAgIDB4QjhGNywgMHhCOEZBLCAweEI4RkMsIDB4QjhGRSwgMHhCOEZGLCAweEI5MDAsIDB4QjkwMSwgMHhCOTAyLAotICAgIDB4QjkwMywgMHhCOTA1LCAweEI5MDYsIDB4QjkwNywgMHhCOTA4LCAweEI5MDksIDB4QjkwQSwgMHhCOTBCLAotICAgIDB4QjkwQywgMHhCOTBELCAweEI5MEUsIDB4QjkwRiwgMHhCOTEwLCAweEI5MTEsIDB4QjkxMiwgMHhCOTEzLAotICAgIDB4QjkxNCwgMHhCOTE1LCAweEI5MTYsIDB4QjkxNywgMHhCOTE5LCAweEI5MUEsIDB4QjkxQiwgMHhCOTFDLAotICAgIDB4QjkxRCwgMHhCOTFFLCAweEI5MUYsIDB4QjkyMSwgMHhCOTIyLCAweEI5MjMsIDB4QjkyNCwgMHhCOTI1LAotICAgIDB4QjkyNiwgMHhCOTI3LCAweEI5MjgsIDB4QjkyOSwgMHhCOTJBLCAweEI5MkIsIDB4QjkyQywgMHhCOTJELAotICAgIDB4QjkyRSwgMHhCOTJGLCAweEI5MzAsIDB4QjkzMSwgMHhCOTMyLCAweEI5MzMsIDB4QjkzNCwgMHhCOTM1LAotICAgIDB4QjkzNiwgMHhCOTM3LCAweEI5MzgsIDB4QjkzOSwgMHhCOTNBLCAweEI5M0IsIDB4QjkzRSwgMHhCOTNGLAotICAgIDB4Qjk0MSwgMHhCOTQyLCAweEI5NDMsIDB4Qjk0NSwgMHhCOTQ2LCAweEI5NDcsIDB4Qjk0OCwgMHhCOTQ5LAotICAgIDB4Qjk0QSwgMHhCOTRCLCAweEI5NEQsIDB4Qjk0RSwgMHhCOTUwLCAweEI5NTIsIDB4Qjk1MywgMHhCOTU0LAotICAgIDB4Qjk1NSwgMHhCOTU2LCAweEI5NTcsIDB4Qjk1QSwgMHhCOTVCLCAweEI5NUQsIDB4Qjk1RSwgMHhCOTVGLAotICAgIDB4Qjk2MSwgMHhCOTYyLCAweEI5NjMsIDB4Qjk2NCwgMHhCOTY1LCAweEI5NjYsIDB4Qjk2NywgMHhCOTZBLAotICAgIDB4Qjk2QywgMHhCOTZFLCAweEI5NkYsIDB4Qjk3MCwgMHhCOTcxLCAweEI5NzIsIDB4Qjk3MywgMHhCOTc2LAotICAgIDB4Qjk3NywgMHhCOTc5LCAweEI5N0EsIDB4Qjk3QiwgMHhCOTdELCAweEI5N0UsIDB4Qjk3RiwgMHhCOTgwLAotICAgIDB4Qjk4MSwgMHhCOTgyLCAweEI5ODMsIDB4Qjk4NiwgMHhCOTg4LCAweEI5OEIsIDB4Qjk4QywgMHhCOThGLAotICAgIDB4Qjk5MCwgMHhCOTkxLCAweEI5OTIsIDB4Qjk5MywgMHhCOTk0LCAweEI5OTUsIDB4Qjk5NiwgMHhCOTk3LAotICAgIDB4Qjk5OCwgMHhCOTk5LCAweEI5OUEsIDB4Qjk5QiwgMHhCOTlDLCAweEI5OUQsIDB4Qjk5RSwgMHhCOTlGLAotICAgIDB4QjlBMCwgMHhCOUExLCAweEI5QTIsIDB4QjlBMywgMHhCOUE0LCAweEI5QTUsIDB4QjlBNiwgMHhCOUE3LAotICAgIDB4QjlBOCwgMHhCOUE5LCAweEI5QUEsIDB4QjlBQiwgMHhCOUFFLCAweEI5QUYsIDB4QjlCMSwgMHhCOUIyLAotICAgIDB4QjlCMywgMHhCOUI1LCAweEI5QjYsIDB4QjlCNywgMHhCOUI4LCAweEI5QjksIDB4QjlCQSwgMHhCOUJCLAotICAgIDB4QjlCRSwgMHhCOUMwLCAweEI5QzIsIDB4QjlDMywgMHhCOUM0LCAweEI5QzUsIDB4QjlDNiwgMHhCOUM3LAotICAgIDB4QjlDQSwgMHhCOUNCLCAweEI5Q0QsIDB4QjlEMywgMHhCOUQ0LCAweEI5RDUsIDB4QjlENiwgMHhCOUQ3LAotICAgIDB4QjlEQSwgMHhCOURDLCAweEI5REYsIDB4QjlFMCwgMHhCOUUyLCAweEI5RTYsIDB4QjlFNywgMHhCOUU5LAotICAgIDB4QjlFQSwgMHhCOUVCLCAweEI5RUQsIDB4QjlFRSwgMHhCOUVGLCAweEI5RjAsIDB4QjlGMSwgMHhCOUYyLAotICAgIDB4QjlGMywgMHhCOUY2LCAweEI5RkIsIDB4QjlGQywgMHhCOUZELCAweEI5RkUsIDB4QjlGRiwgMHhCQTAyLAotICAgIDB4QkEwMywgMHhCQTA0LCAweEJBMDUsIDB4QkEwNiwgMHhCQTA3LCAweEJBMDksIDB4QkEwQSwgMHhCQTBCLAotICAgIDB4QkEwQywgMHhCQTBELCAweEJBMEUsIDB4QkEwRiwgMHhCQTEwLCAweEJBMTEsIDB4QkExMiwgMHhCQTEzLAotICAgIDB4QkExNCwgMHhCQTE2LCAweEJBMTcsIDB4QkExOCwgMHhCQTE5LCAweEJBMUEsIDB4QkExQiwgMHhCQTFDLAotICAgIDB4QkExRCwgMHhCQTFFLCAweEJBMUYsIDB4QkEyMCwgMHhCQTIxLCAweEJBMjIsIDB4QkEyMywgMHhCQTI0LAotICAgIDB4QkEyNSwgMHhCQTI2LCAweEJBMjcsIDB4QkEyOCwgMHhCQTI5LCAweEJBMkEsIDB4QkEyQiwgMHhCQTJDLAotICAgIDB4QkEyRCwgMHhCQTJFLCAweEJBMkYsIDB4QkEzMCwgMHhCQTMxLCAweEJBMzIsIDB4QkEzMywgMHhCQTM0LAotICAgIDB4QkEzNSwgMHhCQTM2LCAweEJBMzcsIDB4QkEzQSwgMHhCQTNCLCAweEJBM0QsIDB4QkEzRSwgMHhCQTNGLAotICAgIDB4QkE0MSwgMHhCQTQzLCAweEJBNDQsIDB4QkE0NSwgMHhCQTQ2LCAweEJBNDcsIDB4QkE0QSwgMHhCQTRDLAotICAgIDB4QkE0RiwgMHhCQTUwLCAweEJBNTEsIDB4QkE1MiwgMHhCQTU2LCAweEJBNTcsIDB4QkE1OSwgMHhCQTVBLAotICAgIDB4QkE1QiwgMHhCQTVELCAweEJBNUUsIDB4QkE1RiwgMHhCQTYwLCAweEJBNjEsIDB4QkE2MiwgMHhCQTYzLAotICAgIDB4QkE2NiwgMHhCQTZBLCAweEJBNkIsIDB4QkE2QywgMHhCQTZELCAweEJBNkUsIDB4QkE2RiwgMHhCQTcyLAotICAgIDB4QkE3MywgMHhCQTc1LCAweEJBNzYsIDB4QkE3NywgMHhCQTc5LCAweEJBN0EsIDB4QkE3QiwgMHhCQTdDLAotICAgIDB4QkE3RCwgMHhCQTdFLCAweEJBN0YsIDB4QkE4MCwgMHhCQTgxLCAweEJBODIsIDB4QkE4NiwgMHhCQTg4LAotICAgIDB4QkE4OSwgMHhCQThBLCAweEJBOEIsIDB4QkE4RCwgMHhCQThFLCAweEJBOEYsIDB4QkE5MCwgMHhCQTkxLAotICAgIDB4QkE5MiwgMHhCQTkzLCAweEJBOTQsIDB4QkE5NSwgMHhCQTk2LCAweEJBOTcsIDB4QkE5OCwgMHhCQTk5LAotICAgIDB4QkE5QSwgMHhCQTlCLCAweEJBOUMsIDB4QkE5RCwgMHhCQTlFLCAweEJBOUYsIDB4QkFBMCwgMHhCQUExLAotICAgIDB4QkFBMiwgMHhCQUEzLCAweEJBQTQsIDB4QkFBNSwgMHhCQUE2LCAweEJBQTcsIDB4QkFBQSwgMHhCQUFELAotICAgIDB4QkFBRSwgMHhCQUFGLCAweEJBQjEsIDB4QkFCMywgMHhCQUI0LCAweEJBQjUsIDB4QkFCNiwgMHhCQUI3LAotICAgIDB4QkFCQSwgMHhCQUJDLCAweEJBQkUsIDB4QkFCRiwgMHhCQUMwLCAweEJBQzEsIDB4QkFDMiwgMHhCQUMzLAotICAgIDB4QkFDNSwgMHhCQUM2LCAweEJBQzcsIDB4QkFDOSwgMHhCQUNBLCAweEJBQ0IsIDB4QkFDQywgMHhCQUNELAotICAgIDB4QkFDRSwgMHhCQUNGLCAweEJBRDAsIDB4QkFEMSwgMHhCQUQyLCAweEJBRDMsIDB4QkFENCwgMHhCQUQ1LAotICAgIDB4QkFENiwgMHhCQUQ3LCAweEJBREEsIDB4QkFEQiwgMHhCQURDLCAweEJBREQsIDB4QkFERSwgMHhCQURGLAotICAgIDB4QkFFMCwgMHhCQUUxLCAweEJBRTIsIDB4QkFFMywgMHhCQUU0LCAweEJBRTUsIDB4QkFFNiwgMHhCQUU3LAotICAgIDB4QkFFOCwgMHhCQUU5LCAweEJBRUEsIDB4QkFFQiwgMHhCQUVDLCAweEJBRUQsIDB4QkFFRSwgMHhCQUVGLAotICAgIDB4QkFGMCwgMHhCQUYxLCAweEJBRjIsIDB4QkFGMywgMHhCQUY0LCAweEJBRjUsIDB4QkFGNiwgMHhCQUY3LAotICAgIDB4QkFGOCwgMHhCQUY5LCAweEJBRkEsIDB4QkFGQiwgMHhCQUZELCAweEJBRkUsIDB4QkFGRiwgMHhCQjAxLAotICAgIDB4QkIwMiwgMHhCQjAzLCAweEJCMDUsIDB4QkIwNiwgMHhCQjA3LCAweEJCMDgsIDB4QkIwOSwgMHhCQjBBLAotICAgIDB4QkIwQiwgMHhCQjBDLCAweEJCMEUsIDB4QkIxMCwgMHhCQjEyLCAweEJCMTMsIDB4QkIxNCwgMHhCQjE1LAotICAgIDB4QkIxNiwgMHhCQjE3LCAweEJCMTksIDB4QkIxQSwgMHhCQjFCLCAweEJCMUQsIDB4QkIxRSwgMHhCQjFGLAotICAgIDB4QkIyMSwgMHhCQjIyLCAweEJCMjMsIDB4QkIyNCwgMHhCQjI1LCAweEJCMjYsIDB4QkIyNywgMHhCQjI4LAotICAgIDB4QkIyQSwgMHhCQjJDLCAweEJCMkQsIDB4QkIyRSwgMHhCQjJGLCAweEJCMzAsIDB4QkIzMSwgMHhCQjMyLAotICAgIDB4QkIzMywgMHhCQjM3LCAweEJCMzksIDB4QkIzQSwgMHhCQjNGLCAweEJCNDAsIDB4QkI0MSwgMHhCQjQyLAotICAgIDB4QkI0MywgMHhCQjQ2LCAweEJCNDgsIDB4QkI0QSwgMHhCQjRCLCAweEJCNEMsIDB4QkI0RSwgMHhCQjUxLAotICAgIDB4QkI1MiwgMHhCQjUzLCAweEJCNTUsIDB4QkI1NiwgMHhCQjU3LCAweEJCNTksIDB4QkI1QSwgMHhCQjVCLAotICAgIDB4QkI1QywgMHhCQjVELCAweEJCNUUsIDB4QkI1RiwgMHhCQjYwLCAweEJCNjIsIDB4QkI2NCwgMHhCQjY1LAotICAgIDB4QkI2NiwgMHhCQjY3LCAweEJCNjgsIDB4QkI2OSwgMHhCQjZBLCAweEJCNkIsIDB4QkI2RCwgMHhCQjZFLAotICAgIDB4QkI2RiwgMHhCQjcwLCAweEJCNzEsIDB4QkI3MiwgMHhCQjczLCAweEJCNzQsIDB4QkI3NSwgMHhCQjc2LAotICAgIDB4QkI3NywgMHhCQjc4LCAweEJCNzksIDB4QkI3QSwgMHhCQjdCLCAweEJCN0MsIDB4QkI3RCwgMHhCQjdFLAotICAgIDB4QkI3RiwgMHhCQjgwLCAweEJCODEsIDB4QkI4MiwgMHhCQjgzLCAweEJCODQsIDB4QkI4NSwgMHhCQjg2LAotICAgIDB4QkI4NywgMHhCQjg5LCAweEJCOEEsIDB4QkI4QiwgMHhCQjhELCAweEJCOEUsIDB4QkI4RiwgMHhCQjkxLAotICAgIDB4QkI5MiwgMHhCQjkzLCAweEJCOTQsIDB4QkI5NSwgMHhCQjk2LCAweEJCOTcsIDB4QkI5OCwgMHhCQjk5LAotICAgIDB4QkI5QSwgMHhCQjlCLCAweEJCOUMsIDB4QkI5RCwgMHhCQjlFLCAweEJCOUYsIDB4QkJBMCwgMHhCQkExLAotICAgIDB4QkJBMiwgMHhCQkEzLCAweEJCQTUsIDB4QkJBNiwgMHhCQkE3LCAweEJCQTksIDB4QkJBQSwgMHhCQkFCLAotICAgIDB4QkJBRCwgMHhCQkFFLCAweEJCQUYsIDB4QkJCMCwgMHhCQkIxLCAweEJCQjIsIDB4QkJCMywgMHhCQkI1LAotICAgIDB4QkJCNiwgMHhCQkI4LCAweEJCQjksIDB4QkJCQSwgMHhCQkJCLCAweEJCQkMsIDB4QkJCRCwgMHhCQkJFLAotICAgIDB4QkJCRiwgMHhCQkMxLCAweEJCQzIsIDB4QkJDMywgMHhCQkM1LCAweEJCQzYsIDB4QkJDNywgMHhCQkM5LAotICAgIDB4QkJDQSwgMHhCQkNCLCAweEJCQ0MsIDB4QkJDRCwgMHhCQkNFLCAweEJCQ0YsIDB4QkJEMSwgMHhCQkQyLAotICAgIDB4QkJENCwgMHhCQkQ1LCAweEJCRDYsIDB4QkJENywgMHhCQkQ4LCAweEJCRDksIDB4QkJEQSwgMHhCQkRCLAotICAgIDB4QkJEQywgMHhCQkRELCAweEJCREUsIDB4QkJERiwgMHhCQkUwLCAweEJCRTEsIDB4QkJFMiwgMHhCQkUzLAotICAgIDB4QkJFNCwgMHhCQkU1LCAweEJCRTYsIDB4QkJFNywgMHhCQkU4LCAweEJCRTksIDB4QkJFQSwgMHhCQkVCLAotICAgIDB4QkJFQywgMHhCQkVELCAweEJCRUUsIDB4QkJFRiwgMHhCQkYwLCAweEJCRjEsIDB4QkJGMiwgMHhCQkYzLAotICAgIDB4QkJGNCwgMHhCQkY1LCAweEJCRjYsIDB4QkJGNywgMHhCQkZBLCAweEJCRkIsIDB4QkJGRCwgMHhCQkZFLAotICAgIDB4QkMwMSwgMHhCQzAzLCAweEJDMDQsIDB4QkMwNSwgMHhCQzA2LCAweEJDMDcsIDB4QkMwQSwgMHhCQzBFLAotICAgIDB4QkMxMCwgMHhCQzEyLCAweEJDMTMsIDB4QkMxOSwgMHhCQzFBLCAweEJDMjAsIDB4QkMyMSwgMHhCQzIyLAotICAgIDB4QkMyMywgMHhCQzI2LCAweEJDMjgsIDB4QkMyQSwgMHhCQzJCLCAweEJDMkMsIDB4QkMyRSwgMHhCQzJGLAotICAgIDB4QkMzMiwgMHhCQzMzLCAweEJDMzUsIDB4QkMzNiwgMHhCQzM3LCAweEJDMzksIDB4QkMzQSwgMHhCQzNCLAotICAgIDB4QkMzQywgMHhCQzNELCAweEJDM0UsIDB4QkMzRiwgMHhCQzQyLCAweEJDNDYsIDB4QkM0NywgMHhCQzQ4LAotICAgIDB4QkM0QSwgMHhCQzRCLCAweEJDNEUsIDB4QkM0RiwgMHhCQzUxLCAweEJDNTIsIDB4QkM1MywgMHhCQzU0LAotICAgIDB4QkM1NSwgMHhCQzU2LCAweEJDNTcsIDB4QkM1OCwgMHhCQzU5LCAweEJDNUEsIDB4QkM1QiwgMHhCQzVDLAotICAgIDB4QkM1RSwgMHhCQzVGLCAweEJDNjAsIDB4QkM2MSwgMHhCQzYyLCAweEJDNjMsIDB4QkM2NCwgMHhCQzY1LAotICAgIDB4QkM2NiwgMHhCQzY3LCAweEJDNjgsIDB4QkM2OSwgMHhCQzZBLCAweEJDNkIsIDB4QkM2QywgMHhCQzZELAotICAgIDB4QkM2RSwgMHhCQzZGLCAweEJDNzAsIDB4QkM3MSwgMHhCQzcyLCAweEJDNzMsIDB4QkM3NCwgMHhCQzc1LAotICAgIDB4QkM3NiwgMHhCQzc3LCAweEJDNzgsIDB4QkM3OSwgMHhCQzdBLCAweEJDN0IsIDB4QkM3QywgMHhCQzdELAotICAgIDB4QkM3RSwgMHhCQzdGLCAweEJDODAsIDB4QkM4MSwgMHhCQzgyLCAweEJDODMsIDB4QkM4NiwgMHhCQzg3LAotICAgIDB4QkM4OSwgMHhCQzhBLCAweEJDOEQsIDB4QkM4RiwgMHhCQzkwLCAweEJDOTEsIDB4QkM5MiwgMHhCQzkzLAotICAgIDB4QkM5NiwgMHhCQzk4LCAweEJDOUIsIDB4QkM5QywgMHhCQzlELCAweEJDOUUsIDB4QkM5RiwgMHhCQ0EyLAotICAgIDB4QkNBMywgMHhCQ0E1LCAweEJDQTYsIDB4QkNBOSwgMHhCQ0FBLCAweEJDQUIsIDB4QkNBQywgMHhCQ0FELAotICAgIDB4QkNBRSwgMHhCQ0FGLCAweEJDQjIsIDB4QkNCNiwgMHhCQ0I3LCAweEJDQjgsIDB4QkNCOSwgMHhCQ0JBLAotICAgIDB4QkNCQiwgMHhCQ0JFLCAweEJDQkYsIDB4QkNDMSwgMHhCQ0MyLCAweEJDQzMsIDB4QkNDNSwgMHhCQ0M2LAotICAgIDB4QkNDNywgMHhCQ0M4LCAweEJDQzksIDB4QkNDQSwgMHhCQ0NCLCAweEJDQ0MsIDB4QkNDRSwgMHhCQ0QyLAotICAgIDB4QkNEMywgMHhCQ0Q0LCAweEJDRDYsIDB4QkNENywgMHhCQ0Q5LCAweEJDREEsIDB4QkNEQiwgMHhCQ0RELAotICAgIDB4QkNERSwgMHhCQ0RGLCAweEJDRTAsIDB4QkNFMSwgMHhCQ0UyLCAweEJDRTMsIDB4QkNFNCwgMHhCQ0U1LAotICAgIDB4QkNFNiwgMHhCQ0U3LCAweEJDRTgsIDB4QkNFOSwgMHhCQ0VBLCAweEJDRUIsIDB4QkNFQywgMHhCQ0VELAotICAgIDB4QkNFRSwgMHhCQ0VGLCAweEJDRjAsIDB4QkNGMSwgMHhCQ0YyLCAweEJDRjMsIDB4QkNGNywgMHhCQ0Y5LAotICAgIDB4QkNGQSwgMHhCQ0ZCLCAweEJDRkQsIDB4QkNGRSwgMHhCQ0ZGLCAweEJEMDAsIDB4QkQwMSwgMHhCRDAyLAotICAgIDB4QkQwMywgMHhCRDA2LCAweEJEMDgsIDB4QkQwQSwgMHhCRDBCLCAweEJEMEMsIDB4QkQwRCwgMHhCRDBFLAotICAgIDB4QkQwRiwgMHhCRDExLCAweEJEMTIsIDB4QkQxMywgMHhCRDE1LCAweEJEMTYsIDB4QkQxNywgMHhCRDE4LAotICAgIDB4QkQxOSwgMHhCRDFBLCAweEJEMUIsIDB4QkQxQywgMHhCRDFELCAweEJEMUUsIDB4QkQxRiwgMHhCRDIwLAotICAgIDB4QkQyMSwgMHhCRDIyLCAweEJEMjMsIDB4QkQyNSwgMHhCRDI2LCAweEJEMjcsIDB4QkQyOCwgMHhCRDI5LAotICAgIDB4QkQyQSwgMHhCRDJCLCAweEJEMkQsIDB4QkQyRSwgMHhCRDJGLCAweEJEMzAsIDB4QkQzMSwgMHhCRDMyLAotICAgIDB4QkQzMywgMHhCRDM0LCAweEJEMzUsIDB4QkQzNiwgMHhCRDM3LCAweEJEMzgsIDB4QkQzOSwgMHhCRDNBLAotICAgIDB4QkQzQiwgMHhCRDNDLCAweEJEM0QsIDB4QkQzRSwgMHhCRDNGLCAweEJENDEsIDB4QkQ0MiwgMHhCRDQzLAotICAgIDB4QkQ0NCwgMHhCRDQ1LCAweEJENDYsIDB4QkQ0NywgMHhCRDRBLCAweEJENEIsIDB4QkQ0RCwgMHhCRDRFLAotICAgIDB4QkQ0RiwgMHhCRDUxLCAweEJENTIsIDB4QkQ1MywgMHhCRDU0LCAweEJENTUsIDB4QkQ1NiwgMHhCRDU3LAotICAgIDB4QkQ1QSwgMHhCRDVCLCAweEJENUMsIDB4QkQ1RCwgMHhCRDVFLCAweEJENUYsIDB4QkQ2MCwgMHhCRDYxLAotICAgIDB4QkQ2MiwgMHhCRDYzLCAweEJENjUsIDB4QkQ2NiwgMHhCRDY3LCAweEJENjksIDB4QkQ2QSwgMHhCRDZCLAotICAgIDB4QkQ2QywgMHhCRDZELCAweEJENkUsIDB4QkQ2RiwgMHhCRDcwLCAweEJENzEsIDB4QkQ3MiwgMHhCRDczLAotICAgIDB4QkQ3NCwgMHhCRDc1LCAweEJENzYsIDB4QkQ3NywgMHhCRDc4LCAweEJENzksIDB4QkQ3QSwgMHhCRDdCLAotICAgIDB4QkQ3QywgMHhCRDdELCAweEJEN0UsIDB4QkQ3RiwgMHhCRDgyLCAweEJEODMsIDB4QkQ4NSwgMHhCRDg2LAotICAgIDB4QkQ4QiwgMHhCRDhDLCAweEJEOEQsIDB4QkQ4RSwgMHhCRDhGLCAweEJEOTIsIDB4QkQ5NCwgMHhCRDk2LAotICAgIDB4QkQ5NywgMHhCRDk4LCAweEJEOUIsIDB4QkQ5RCwgMHhCRDlFLCAweEJEOUYsIDB4QkRBMCwgMHhCREExLAotICAgIDB4QkRBMiwgMHhCREEzLCAweEJEQTUsIDB4QkRBNiwgMHhCREE3LCAweEJEQTgsIDB4QkRBOSwgMHhCREFBLAotICAgIDB4QkRBQiwgMHhCREFDLCAweEJEQUQsIDB4QkRBRSwgMHhCREFGLCAweEJEQjEsIDB4QkRCMiwgMHhCREIzLAotICAgIDB4QkRCNCwgMHhCREI1LCAweEJEQjYsIDB4QkRCNywgMHhCREI5LCAweEJEQkEsIDB4QkRCQiwgMHhCREJDLAotICAgIDB4QkRCRCwgMHhCREJFLCAweEJEQkYsIDB4QkRDMCwgMHhCREMxLCAweEJEQzIsIDB4QkRDMywgMHhCREM0LAotICAgIDB4QkRDNSwgMHhCREM2LCAweEJEQzcsIDB4QkRDOCwgMHhCREM5LCAweEJEQ0EsIDB4QkRDQiwgMHhCRENDLAotICAgIDB4QkRDRCwgMHhCRENFLCAweEJEQ0YsIDB4QkREMCwgMHhCREQxLCAweEJERDIsIDB4QkREMywgMHhCREQ2LAotICAgIDB4QkRENywgMHhCREQ5LCAweEJEREEsIDB4QkREQiwgMHhCRERELCAweEJEREUsIDB4QkRERiwgMHhCREUwLAotICAgIDB4QkRFMSwgMHhCREUyLCAweEJERTMsIDB4QkRFNCwgMHhCREU1LCAweEJERTYsIDB4QkRFNywgMHhCREU4LAotICAgIDB4QkRFQSwgMHhCREVCLCAweEJERUMsIDB4QkRFRCwgMHhCREVFLCAweEJERUYsIDB4QkRGMSwgMHhCREYyLAotICAgIDB4QkRGMywgMHhCREY1LCAweEJERjYsIDB4QkRGNywgMHhCREY5LCAweEJERkEsIDB4QkRGQiwgMHhCREZDLAotICAgIDB4QkRGRCwgMHhCREZFLCAweEJERkYsIDB4QkUwMSwgMHhCRTAyLCAweEJFMDQsIDB4QkUwNiwgMHhCRTA3LAotICAgIDB4QkUwOCwgMHhCRTA5LCAweEJFMEEsIDB4QkUwQiwgMHhCRTBFLCAweEJFMEYsIDB4QkUxMSwgMHhCRTEyLAotICAgIDB4QkUxMywgMHhCRTE1LCAweEJFMTYsIDB4QkUxNywgMHhCRTE4LCAweEJFMTksIDB4QkUxQSwgMHhCRTFCLAotICAgIDB4QkUxRSwgMHhCRTIwLCAweEJFMjEsIDB4QkUyMiwgMHhCRTIzLCAweEJFMjQsIDB4QkUyNSwgMHhCRTI2LAotICAgIDB4QkUyNywgMHhCRTI4LCAweEJFMjksIDB4QkUyQSwgMHhCRTJCLCAweEJFMkMsIDB4QkUyRCwgMHhCRTJFLAotICAgIDB4QkUyRiwgMHhCRTMwLCAweEJFMzEsIDB4QkUzMiwgMHhCRTMzLCAweEJFMzQsIDB4QkUzNSwgMHhCRTM2LAotICAgIDB4QkUzNywgMHhCRTM4LCAweEJFMzksIDB4QkUzQSwgMHhCRTNCLCAweEJFM0MsIDB4QkUzRCwgMHhCRTNFLAotICAgIDB4QkUzRiwgMHhCRTQwLCAweEJFNDEsIDB4QkU0MiwgMHhCRTQzLCAweEJFNDYsIDB4QkU0NywgMHhCRTQ5LAotICAgIDB4QkU0QSwgMHhCRTRCLCAweEJFNEQsIDB4QkU0RiwgMHhCRTUwLCAweEJFNTEsIDB4QkU1MiwgMHhCRTUzLAotICAgIDB4QkU1NiwgMHhCRTU4LCAweEJFNUMsIDB4QkU1RCwgMHhCRTVFLCAweEJFNUYsIDB4QkU2MiwgMHhCRTYzLAotICAgIDB4QkU2NSwgMHhCRTY2LCAweEJFNjcsIDB4QkU2OSwgMHhCRTZCLCAweEJFNkMsIDB4QkU2RCwgMHhCRTZFLAotICAgIDB4QkU2RiwgMHhCRTcyLCAweEJFNzYsIDB4QkU3NywgMHhCRTc4LCAweEJFNzksIDB4QkU3QSwgMHhCRTdFLAotICAgIDB4QkU3RiwgMHhCRTgxLCAweEJFODIsIDB4QkU4MywgMHhCRTg1LCAweEJFODYsIDB4QkU4NywgMHhCRTg4LAotICAgIDB4QkU4OSwgMHhCRThBLCAweEJFOEIsIDB4QkU4RSwgMHhCRTkyLCAweEJFOTMsIDB4QkU5NCwgMHhCRTk1LAotICAgIDB4QkU5NiwgMHhCRTk3LCAweEJFOUEsIDB4QkU5QiwgMHhCRTlDLCAweEJFOUQsIDB4QkU5RSwgMHhCRTlGLAotICAgIDB4QkVBMCwgMHhCRUExLCAweEJFQTIsIDB4QkVBMywgMHhCRUE0LCAweEJFQTUsIDB4QkVBNiwgMHhCRUE3LAotICAgIDB4QkVBOSwgMHhCRUFBLCAweEJFQUIsIDB4QkVBQywgMHhCRUFELCAweEJFQUUsIDB4QkVBRiwgMHhCRUIwLAotICAgIDB4QkVCMSwgMHhCRUIyLCAweEJFQjMsIDB4QkVCNCwgMHhCRUI1LCAweEJFQjYsIDB4QkVCNywgMHhCRUI4LAotICAgIDB4QkVCOSwgMHhCRUJBLCAweEJFQkIsIDB4QkVCQywgMHhCRUJELCAweEJFQkUsIDB4QkVCRiwgMHhCRUMwLAotICAgIDB4QkVDMSwgMHhCRUMyLCAweEJFQzMsIDB4QkVDNCwgMHhCRUM1LCAweEJFQzYsIDB4QkVDNywgMHhCRUM4LAotICAgIDB4QkVDOSwgMHhCRUNBLCAweEJFQ0IsIDB4QkVDQywgMHhCRUNELCAweEJFQ0UsIDB4QkVDRiwgMHhCRUQyLAotICAgIDB4QkVEMywgMHhCRUQ1LCAweEJFRDYsIDB4QkVEOSwgMHhCRURBLCAweEJFREIsIDB4QkVEQywgMHhCRURELAotICAgIDB4QkVERSwgMHhCRURGLCAweEJFRTEsIDB4QkVFMiwgMHhCRUU2LCAweEJFRTcsIDB4QkVFOCwgMHhCRUU5LAotICAgIDB4QkVFQSwgMHhCRUVCLCAweEJFRUQsIDB4QkVFRSwgMHhCRUVGLCAweEJFRjAsIDB4QkVGMSwgMHhCRUYyLAotICAgIDB4QkVGMywgMHhCRUY0LCAweEJFRjUsIDB4QkVGNiwgMHhCRUY3LCAweEJFRjgsIDB4QkVGOSwgMHhCRUZBLAotICAgIDB4QkVGQiwgMHhCRUZDLCAweEJFRkQsIDB4QkVGRSwgMHhCRUZGLCAweEJGMDAsIDB4QkYwMiwgMHhCRjAzLAotICAgIDB4QkYwNCwgMHhCRjA1LCAweEJGMDYsIDB4QkYwNywgMHhCRjBBLCAweEJGMEIsIDB4QkYwQywgMHhCRjBELAotICAgIDB4QkYwRSwgMHhCRjBGLCAweEJGMTAsIDB4QkYxMSwgMHhCRjEyLCAweEJGMTMsIDB4QkYxNCwgMHhCRjE1LAotICAgIDB4QkYxNiwgMHhCRjE3LCAweEJGMUEsIDB4QkYxRSwgMHhCRjFGLCAweEJGMjAsIDB4QkYyMSwgMHhCRjIyLAotICAgIDB4QkYyMywgMHhCRjI0LCAweEJGMjUsIDB4QkYyNiwgMHhCRjI3LCAweEJGMjgsIDB4QkYyOSwgMHhCRjJBLAotICAgIDB4QkYyQiwgMHhCRjJDLCAweEJGMkQsIDB4QkYyRSwgMHhCRjJGLCAweEJGMzAsIDB4QkYzMSwgMHhCRjMyLAotICAgIDB4QkYzMywgMHhCRjM0LCAweEJGMzUsIDB4QkYzNiwgMHhCRjM3LCAweEJGMzgsIDB4QkYzOSwgMHhCRjNBLAotICAgIDB4QkYzQiwgMHhCRjNDLCAweEJGM0QsIDB4QkYzRSwgMHhCRjNGLCAweEJGNDIsIDB4QkY0MywgMHhCRjQ1LAotICAgIDB4QkY0NiwgMHhCRjQ3LCAweEJGNDksIDB4QkY0QSwgMHhCRjRCLCAweEJGNEMsIDB4QkY0RCwgMHhCRjRFLAotICAgIDB4QkY0RiwgMHhCRjUyLCAweEJGNTMsIDB4QkY1NCwgMHhCRjU2LCAweEJGNTcsIDB4QkY1OCwgMHhCRjU5LAotICAgIDB4QkY1QSwgMHhCRjVCLCAweEJGNUMsIDB4QkY1RCwgMHhCRjVFLCAweEJGNUYsIDB4QkY2MCwgMHhCRjYxLAotICAgIDB4QkY2MiwgMHhCRjYzLCAweEJGNjQsIDB4QkY2NSwgMHhCRjY2LCAweEJGNjcsIDB4QkY2OCwgMHhCRjY5LAotICAgIDB4QkY2QSwgMHhCRjZCLCAweEJGNkMsIDB4QkY2RCwgMHhCRjZFLCAweEJGNkYsIDB4QkY3MCwgMHhCRjcxLAotICAgIDB4QkY3MiwgMHhCRjczLCAweEJGNzQsIDB4QkY3NSwgMHhCRjc2LCAweEJGNzcsIDB4QkY3OCwgMHhCRjc5LAotICAgIDB4QkY3QSwgMHhCRjdCLCAweEJGN0MsIDB4QkY3RCwgMHhCRjdFLCAweEJGN0YsIDB4QkY4MCwgMHhCRjgxLAotICAgIDB4QkY4MiwgMHhCRjgzLCAweEJGODQsIDB4QkY4NSwgMHhCRjg2LCAweEJGODcsIDB4QkY4OCwgMHhCRjg5LAotICAgIDB4QkY4QSwgMHhCRjhCLCAweEJGOEMsIDB4QkY4RCwgMHhCRjhFLCAweEJGOEYsIDB4QkY5MCwgMHhCRjkxLAotICAgIDB4QkY5MiwgMHhCRjkzLCAweEJGOTUsIDB4QkY5NiwgMHhCRjk3LCAweEJGOTgsIDB4QkY5OSwgMHhCRjlBLAotICAgIDB4QkY5QiwgMHhCRjlDLCAweEJGOUQsIDB4QkY5RSwgMHhCRjlGLCAweEJGQTAsIDB4QkZBMSwgMHhCRkEyLAotICAgIDB4QkZBMywgMHhCRkE0LCAweEJGQTUsIDB4QkZBNiwgMHhCRkE3LCAweEJGQTgsIDB4QkZBOSwgMHhCRkFBLAotICAgIDB4QkZBQiwgMHhCRkFDLCAweEJGQUQsIDB4QkZBRSwgMHhCRkFGLCAweEJGQjEsIDB4QkZCMiwgMHhCRkIzLAotICAgIDB4QkZCNCwgMHhCRkI1LCAweEJGQjYsIDB4QkZCNywgMHhCRkI4LCAweEJGQjksIDB4QkZCQSwgMHhCRkJCLAotICAgIDB4QkZCQywgMHhCRkJELCAweEJGQkUsIDB4QkZCRiwgMHhCRkMwLCAweEJGQzEsIDB4QkZDMiwgMHhCRkMzLAotICAgIDB4QkZDNCwgMHhCRkM2LCAweEJGQzcsIDB4QkZDOCwgMHhCRkM5LCAweEJGQ0EsIDB4QkZDQiwgMHhCRkNFLAotICAgIDB4QkZDRiwgMHhCRkQxLCAweEJGRDIsIDB4QkZEMywgMHhCRkQ1LCAweEJGRDYsIDB4QkZENywgMHhCRkQ4LAotICAgIDB4QkZEOSwgMHhCRkRBLCAweEJGREIsIDB4QkZERCwgMHhCRkRFLCAweEJGRTAsIDB4QkZFMiwgMHhCRkUzLAotICAgIDB4QkZFNCwgMHhCRkU1LCAweEJGRTYsIDB4QkZFNywgMHhCRkU4LCAweEJGRTksIDB4QkZFQSwgMHhCRkVCLAotICAgIDB4QkZFQywgMHhCRkVELCAweEJGRUUsIDB4QkZFRiwgMHhCRkYwLCAweEJGRjEsIDB4QkZGMiwgMHhCRkYzLAotICAgIDB4QkZGNCwgMHhCRkY1LCAweEJGRjYsIDB4QkZGNywgMHhCRkY4LCAweEJGRjksIDB4QkZGQSwgMHhCRkZCLAotICAgIDB4QkZGQywgMHhCRkZELCAweEJGRkUsIDB4QkZGRiwgMHhDMDAwLCAweEMwMDEsIDB4QzAwMiwgMHhDMDAzLAotICAgIDB4QzAwNCwgMHhDMDA1LCAweEMwMDYsIDB4QzAwNywgMHhDMDA4LCAweEMwMDksIDB4QzAwQSwgMHhDMDBCLAotICAgIDB4QzAwQywgMHhDMDBELCAweEMwMEUsIDB4QzAwRiwgMHhDMDEwLCAweEMwMTEsIDB4QzAxMiwgMHhDMDEzLAotICAgIDB4QzAxNCwgMHhDMDE1LCAweEMwMTYsIDB4QzAxNywgMHhDMDE4LCAweEMwMTksIDB4QzAxQSwgMHhDMDFCLAotICAgIDB4QzAxQywgMHhDMDFELCAweEMwMUUsIDB4QzAxRiwgMHhDMDIwLCAweEMwMjEsIDB4QzAyMiwgMHhDMDIzLAotICAgIDB4QzAyNCwgMHhDMDI1LCAweEMwMjYsIDB4QzAyNywgMHhDMDI4LCAweEMwMjksIDB4QzAyQSwgMHhDMDJCLAotICAgIDB4QzAyQywgMHhDMDJELCAweEMwMkUsIDB4QzAyRiwgMHhDMDMwLCAweEMwMzEsIDB4QzAzMiwgMHhDMDMzLAotICAgIDB4QzAzNCwgMHhDMDM1LCAweEMwMzYsIDB4QzAzNywgMHhDMDM4LCAweEMwMzksIDB4QzAzQSwgMHhDMDNCLAotICAgIDB4QzAzRCwgMHhDMDNFLCAweEMwM0YsIDB4QzA0MCwgMHhDMDQxLCAweEMwNDIsIDB4QzA0MywgMHhDMDQ0LAotICAgIDB4QzA0NSwgMHhDMDQ2LCAweEMwNDcsIDB4QzA0OCwgMHhDMDQ5LCAweEMwNEEsIDB4QzA0QiwgMHhDMDRDLAotICAgIDB4QzA0RCwgMHhDMDRFLCAweEMwNEYsIDB4QzA1MCwgMHhDMDUyLCAweEMwNTMsIDB4QzA1NCwgMHhDMDU1LAotICAgIDB4QzA1NiwgMHhDMDU3LCAweEMwNTksIDB4QzA1QSwgMHhDMDVCLCAweEMwNUQsIDB4QzA1RSwgMHhDMDVGLAotICAgIDB4QzA2MSwgMHhDMDYyLCAweEMwNjMsIDB4QzA2NCwgMHhDMDY1LCAweEMwNjYsIDB4QzA2NywgMHhDMDZBLAotICAgIDB4QzA2QiwgMHhDMDZDLCAweEMwNkQsIDB4QzA2RSwgMHhDMDZGLCAweEMwNzAsIDB4QzA3MSwgMHhDMDcyLAotICAgIDB4QzA3MywgMHhDMDc0LCAweEMwNzUsIDB4QzA3NiwgMHhDMDc3LCAweEMwNzgsIDB4QzA3OSwgMHhDMDdBLAotICAgIDB4QzA3QiwgMHhDMDdDLCAweEMwN0QsIDB4QzA3RSwgMHhDMDdGLCAweEMwODAsIDB4QzA4MSwgMHhDMDgyLAotICAgIDB4QzA4MywgMHhDMDg0LCAweEMwODUsIDB4QzA4NiwgMHhDMDg3LCAweEMwODgsIDB4QzA4OSwgMHhDMDhBLAotICAgIDB4QzA4QiwgMHhDMDhDLCAweEMwOEQsIDB4QzA4RSwgMHhDMDhGLCAweEMwOTIsIDB4QzA5MywgMHhDMDk1LAotICAgIDB4QzA5NiwgMHhDMDk3LCAweEMwOTksIDB4QzA5QSwgMHhDMDlCLCAweEMwOUMsIDB4QzA5RCwgMHhDMDlFLAotICAgIDB4QzA5RiwgMHhDMEEyLCAweEMwQTQsIDB4QzBBNiwgMHhDMEE3LCAweEMwQTgsIDB4QzBBOSwgMHhDMEFBLAotICAgIDB4QzBBQiwgMHhDMEFFLCAweEMwQjEsIDB4QzBCMiwgMHhDMEI3LCAweEMwQjgsIDB4QzBCOSwgMHhDMEJBLAotICAgIDB4QzBCQiwgMHhDMEJFLCAweEMwQzIsIDB4QzBDMywgMHhDMEM0LCAweEMwQzYsIDB4QzBDNywgMHhDMENBLAotICAgIDB4QzBDQiwgMHhDMENELCAweEMwQ0UsIDB4QzBDRiwgMHhDMEQxLCAweEMwRDIsIDB4QzBEMywgMHhDMEQ0LAotICAgIDB4QzBENSwgMHhDMEQ2LCAweEMwRDcsIDB4QzBEQSwgMHhDMERFLCAweEMwREYsIDB4QzBFMCwgMHhDMEUxLAotICAgIDB4QzBFMiwgMHhDMEUzLCAweEMwRTYsIDB4QzBFNywgMHhDMEU5LCAweEMwRUEsIDB4QzBFQiwgMHhDMEVELAotICAgIDB4QzBFRSwgMHhDMEVGLCAweEMwRjAsIDB4QzBGMSwgMHhDMEYyLCAweEMwRjMsIDB4QzBGNiwgMHhDMEY4LAotICAgIDB4QzBGQSwgMHhDMEZCLCAweEMwRkMsIDB4QzBGRCwgMHhDMEZFLCAweEMwRkYsIDB4QzEwMSwgMHhDMTAyLAotICAgIDB4QzEwMywgMHhDMTA1LCAweEMxMDYsIDB4QzEwNywgMHhDMTA5LCAweEMxMEEsIDB4QzEwQiwgMHhDMTBDLAotICAgIDB4QzEwRCwgMHhDMTBFLCAweEMxMEYsIDB4QzExMSwgMHhDMTEyLCAweEMxMTMsIDB4QzExNCwgMHhDMTE2LAotICAgIDB4QzExNywgMHhDMTE4LCAweEMxMTksIDB4QzExQSwgMHhDMTFCLCAweEMxMjEsIDB4QzEyMiwgMHhDMTI1LAotICAgIDB4QzEyOCwgMHhDMTI5LCAweEMxMkEsIDB4QzEyQiwgMHhDMTJFLCAweEMxMzIsIDB4QzEzMywgMHhDMTM0LAotICAgIDB4QzEzNSwgMHhDMTM3LCAweEMxM0EsIDB4QzEzQiwgMHhDMTNELCAweEMxM0UsIDB4QzEzRiwgMHhDMTQxLAotICAgIDB4QzE0MiwgMHhDMTQzLCAweEMxNDQsIDB4QzE0NSwgMHhDMTQ2LCAweEMxNDcsIDB4QzE0QSwgMHhDMTRFLAotICAgIDB4QzE0RiwgMHhDMTUwLCAweEMxNTEsIDB4QzE1MiwgMHhDMTUzLCAweEMxNTYsIDB4QzE1NywgMHhDMTU5LAotICAgIDB4QzE1QSwgMHhDMTVCLCAweEMxNUQsIDB4QzE1RSwgMHhDMTVGLCAweEMxNjAsIDB4QzE2MSwgMHhDMTYyLAotICAgIDB4QzE2MywgMHhDMTY2LCAweEMxNkEsIDB4QzE2QiwgMHhDMTZDLCAweEMxNkQsIDB4QzE2RSwgMHhDMTZGLAotICAgIDB4QzE3MSwgMHhDMTcyLCAweEMxNzMsIDB4QzE3NSwgMHhDMTc2LCAweEMxNzcsIDB4QzE3OSwgMHhDMTdBLAotICAgIDB4QzE3QiwgMHhDMTdDLCAweEMxN0QsIDB4QzE3RSwgMHhDMTdGLCAweEMxODAsIDB4QzE4MSwgMHhDMTgyLAotICAgIDB4QzE4MywgMHhDMTg0LCAweEMxODYsIDB4QzE4NywgMHhDMTg4LCAweEMxODksIDB4QzE4QSwgMHhDMThCLAotICAgIDB4QzE4RiwgMHhDMTkxLCAweEMxOTIsIDB4QzE5MywgMHhDMTk1LCAweEMxOTcsIDB4QzE5OCwgMHhDMTk5LAotICAgIDB4QzE5QSwgMHhDMTlCLCAweEMxOUUsIDB4QzFBMCwgMHhDMUEyLCAweEMxQTMsIDB4QzFBNCwgMHhDMUE2LAotICAgIDB4QzFBNywgMHhDMUFBLCAweEMxQUIsIDB4QzFBRCwgMHhDMUFFLCAweEMxQUYsIDB4QzFCMSwgMHhDMUIyLAotICAgIDB4QzFCMywgMHhDMUI0LCAweEMxQjUsIDB4QzFCNiwgMHhDMUI3LCAweEMxQjgsIDB4QzFCOSwgMHhDMUJBLAotICAgIDB4QzFCQiwgMHhDMUJDLCAweEMxQkUsIDB4QzFCRiwgMHhDMUMwLCAweEMxQzEsIDB4QzFDMiwgMHhDMUMzLAotICAgIDB4QzFDNSwgMHhDMUM2LCAweEMxQzcsIDB4QzFDOSwgMHhDMUNBLCAweEMxQ0IsIDB4QzFDRCwgMHhDMUNFLAotICAgIDB4QzFDRiwgMHhDMUQwLCAweEMxRDEsIDB4QzFEMiwgMHhDMUQzLCAweEMxRDUsIDB4QzFENiwgMHhDMUQ5LAotICAgIDB4QzFEQSwgMHhDMURCLCAweEMxREMsIDB4QzFERCwgMHhDMURFLCAweEMxREYsIDB4QzFFMSwgMHhDMUUyLAotICAgIDB4QzFFMywgMHhDMUU1LCAweEMxRTYsIDB4QzFFNywgMHhDMUU5LCAweEMxRUEsIDB4QzFFQiwgMHhDMUVDLAotICAgIDB4QzFFRCwgMHhDMUVFLCAweEMxRUYsIDB4QzFGMiwgMHhDMUY0LCAweEMxRjUsIDB4QzFGNiwgMHhDMUY3LAotICAgIDB4QzFGOCwgMHhDMUY5LCAweEMxRkEsIDB4QzFGQiwgMHhDMUZFLCAweEMxRkYsIDB4QzIwMSwgMHhDMjAyLAotICAgIDB4QzIwMywgMHhDMjA1LCAweEMyMDYsIDB4QzIwNywgMHhDMjA4LCAweEMyMDksIDB4QzIwQSwgMHhDMjBCLAotICAgIDB4QzIwRSwgMHhDMjEwLCAweEMyMTIsIDB4QzIxMywgMHhDMjE0LCAweEMyMTUsIDB4QzIxNiwgMHhDMjE3LAotICAgIDB4QzIxQSwgMHhDMjFCLCAweEMyMUQsIDB4QzIxRSwgMHhDMjIxLCAweEMyMjIsIDB4QzIyMywgMHhDMjI0LAotICAgIDB4QzIyNSwgMHhDMjI2LCAweEMyMjcsIDB4QzIyQSwgMHhDMjJDLCAweEMyMkUsIDB4QzIzMCwgMHhDMjMzLAotICAgIDB4QzIzNSwgMHhDMjM2LCAweEMyMzcsIDB4QzIzOCwgMHhDMjM5LCAweEMyM0EsIDB4QzIzQiwgMHhDMjNDLAotICAgIDB4QzIzRCwgMHhDMjNFLCAweEMyM0YsIDB4QzI0MCwgMHhDMjQxLCAweEMyNDIsIDB4QzI0MywgMHhDMjQ0LAotICAgIDB4QzI0NSwgMHhDMjQ2LCAweEMyNDcsIDB4QzI0OSwgMHhDMjRBLCAweEMyNEIsIDB4QzI0QywgMHhDMjRELAotICAgIDB4QzI0RSwgMHhDMjRGLCAweEMyNTIsIDB4QzI1MywgMHhDMjU1LCAweEMyNTYsIDB4QzI1NywgMHhDMjU5LAotICAgIDB4QzI1QSwgMHhDMjVCLCAweEMyNUMsIDB4QzI1RCwgMHhDMjVFLCAweEMyNUYsIDB4QzI2MSwgMHhDMjYyLAotICAgIDB4QzI2MywgMHhDMjY0LCAweEMyNjYsIDB4QzI2NywgMHhDMjY4LCAweEMyNjksIDB4QzI2QSwgMHhDMjZCLAotICAgIDB4QzI2RSwgMHhDMjZGLCAweEMyNzEsIDB4QzI3MiwgMHhDMjczLCAweEMyNzUsIDB4QzI3NiwgMHhDMjc3LAotICAgIDB4QzI3OCwgMHhDMjc5LCAweEMyN0EsIDB4QzI3QiwgMHhDMjdFLCAweEMyODAsIDB4QzI4MiwgMHhDMjgzLAotICAgIDB4QzI4NCwgMHhDMjg1LCAweEMyODYsIDB4QzI4NywgMHhDMjhBLCAweEMyOEIsIDB4QzI4QywgMHhDMjhELAotICAgIDB4QzI4RSwgMHhDMjhGLCAweEMyOTEsIDB4QzI5MiwgMHhDMjkzLCAweEMyOTQsIDB4QzI5NSwgMHhDMjk2LAotICAgIDB4QzI5NywgMHhDMjk5LCAweEMyOUEsIDB4QzI5QywgMHhDMjlFLCAweEMyOUYsIDB4QzJBMCwgMHhDMkExLAotICAgIDB4QzJBMiwgMHhDMkEzLCAweEMyQTYsIDB4QzJBNywgMHhDMkE5LCAweEMyQUEsIDB4QzJBQiwgMHhDMkFFLAotICAgIDB4QzJBRiwgMHhDMkIwLCAweEMyQjEsIDB4QzJCMiwgMHhDMkIzLCAweEMyQjYsIDB4QzJCOCwgMHhDMkJBLAotICAgIDB4QzJCQiwgMHhDMkJDLCAweEMyQkQsIDB4QzJCRSwgMHhDMkJGLCAweEMyQzAsIDB4QzJDMSwgMHhDMkMyLAotICAgIDB4QzJDMywgMHhDMkM0LCAweEMyQzUsIDB4QzJDNiwgMHhDMkM3LCAweEMyQzgsIDB4QzJDOSwgMHhDMkNBLAotICAgIDB4QzJDQiwgMHhDMkNDLCAweEMyQ0QsIDB4QzJDRSwgMHhDMkNGLCAweEMyRDAsIDB4QzJEMSwgMHhDMkQyLAotICAgIDB4QzJEMywgMHhDMkQ0LCAweEMyRDUsIDB4QzJENiwgMHhDMkQ3LCAweEMyRDgsIDB4QzJEOSwgMHhDMkRBLAotICAgIDB4QzJEQiwgMHhDMkRFLCAweEMyREYsIDB4QzJFMSwgMHhDMkUyLCAweEMyRTUsIDB4QzJFNiwgMHhDMkU3LAotICAgIDB4QzJFOCwgMHhDMkU5LCAweEMyRUEsIDB4QzJFRSwgMHhDMkYwLCAweEMyRjIsIDB4QzJGMywgMHhDMkY0LAotICAgIDB4QzJGNSwgMHhDMkY3LCAweEMyRkEsIDB4QzJGRCwgMHhDMkZFLCAweEMyRkYsIDB4QzMwMSwgMHhDMzAyLAotICAgIDB4QzMwMywgMHhDMzA0LCAweEMzMDUsIDB4QzMwNiwgMHhDMzA3LCAweEMzMEEsIDB4QzMwQiwgMHhDMzBFLAotICAgIDB4QzMwRiwgMHhDMzEwLCAweEMzMTEsIDB4QzMxMiwgMHhDMzE2LCAweEMzMTcsIDB4QzMxOSwgMHhDMzFBLAotICAgIDB4QzMxQiwgMHhDMzFELCAweEMzMUUsIDB4QzMxRiwgMHhDMzIwLCAweEMzMjEsIDB4QzMyMiwgMHhDMzIzLAotICAgIDB4QzMyNiwgMHhDMzI3LCAweEMzMkEsIDB4QzMyQiwgMHhDMzJDLCAweEMzMkQsIDB4QzMyRSwgMHhDMzJGLAotICAgIDB4QzMzMCwgMHhDMzMxLCAweEMzMzIsIDB4QzMzMywgMHhDMzM0LCAweEMzMzUsIDB4QzMzNiwgMHhDMzM3LAotICAgIDB4QzMzOCwgMHhDMzM5LCAweEMzM0EsIDB4QzMzQiwgMHhDMzNDLCAweEMzM0QsIDB4QzMzRSwgMHhDMzNGLAotICAgIDB4QzM0MCwgMHhDMzQxLCAweEMzNDIsIDB4QzM0MywgMHhDMzQ0LCAweEMzNDYsIDB4QzM0NywgMHhDMzQ4LAotICAgIDB4QzM0OSwgMHhDMzRBLCAweEMzNEIsIDB4QzM0QywgMHhDMzRELCAweEMzNEUsIDB4QzM0RiwgMHhDMzUwLAotICAgIDB4QzM1MSwgMHhDMzUyLCAweEMzNTMsIDB4QzM1NCwgMHhDMzU1LCAweEMzNTYsIDB4QzM1NywgMHhDMzU4LAotICAgIDB4QzM1OSwgMHhDMzVBLCAweEMzNUIsIDB4QzM1QywgMHhDMzVELCAweEMzNUUsIDB4QzM1RiwgMHhDMzYwLAotICAgIDB4QzM2MSwgMHhDMzYyLCAweEMzNjMsIDB4QzM2NCwgMHhDMzY1LCAweEMzNjYsIDB4QzM2NywgMHhDMzZBLAotICAgIDB4QzM2QiwgMHhDMzZELCAweEMzNkUsIDB4QzM2RiwgMHhDMzcxLCAweEMzNzMsIDB4QzM3NCwgMHhDMzc1LAotICAgIDB4QzM3NiwgMHhDMzc3LCAweEMzN0EsIDB4QzM3QiwgMHhDMzdFLCAweEMzN0YsIDB4QzM4MCwgMHhDMzgxLAotICAgIDB4QzM4MiwgMHhDMzgzLCAweEMzODUsIDB4QzM4NiwgMHhDMzg3LCAweEMzODksIDB4QzM4QSwgMHhDMzhCLAotICAgIDB4QzM4RCwgMHhDMzhFLCAweEMzOEYsIDB4QzM5MCwgMHhDMzkxLCAweEMzOTIsIDB4QzM5MywgMHhDMzk0LAotICAgIDB4QzM5NSwgMHhDMzk2LCAweEMzOTcsIDB4QzM5OCwgMHhDMzk5LCAweEMzOUEsIDB4QzM5QiwgMHhDMzlDLAotICAgIDB4QzM5RCwgMHhDMzlFLCAweEMzOUYsIDB4QzNBMCwgMHhDM0ExLCAweEMzQTIsIDB4QzNBMywgMHhDM0E0LAotICAgIDB4QzNBNSwgMHhDM0E2LCAweEMzQTcsIDB4QzNBOCwgMHhDM0E5LCAweEMzQUEsIDB4QzNBQiwgMHhDM0FDLAotICAgIDB4QzNBRCwgMHhDM0FFLCAweEMzQUYsIDB4QzNCMCwgMHhDM0IxLCAweEMzQjIsIDB4QzNCMywgMHhDM0I0LAotICAgIDB4QzNCNSwgMHhDM0I2LCAweEMzQjcsIDB4QzNCOCwgMHhDM0I5LCAweEMzQkEsIDB4QzNCQiwgMHhDM0JDLAotICAgIDB4QzNCRCwgMHhDM0JFLCAweEMzQkYsIDB4QzNDMSwgMHhDM0MyLCAweEMzQzMsIDB4QzNDNCwgMHhDM0M1LAotICAgIDB4QzNDNiwgMHhDM0M3LCAweEMzQzgsIDB4QzNDOSwgMHhDM0NBLCAweEMzQ0IsIDB4QzNDQywgMHhDM0NELAotICAgIDB4QzNDRSwgMHhDM0NGLCAweEMzRDAsIDB4QzNEMSwgMHhDM0QyLCAweEMzRDMsIDB4QzNENCwgMHhDM0Q1LAotICAgIDB4QzNENiwgMHhDM0Q3LCAweEMzREEsIDB4QzNEQiwgMHhDM0RELCAweEMzREUsIDB4QzNFMSwgMHhDM0UzLAotICAgIDB4QzNFNCwgMHhDM0U1LCAweEMzRTYsIDB4QzNFNywgMHhDM0VBLCAweEMzRUIsIDB4QzNFQywgMHhDM0VFLAotICAgIDB4QzNFRiwgMHhDM0YwLCAweEMzRjEsIDB4QzNGMiwgMHhDM0YzLCAweEMzRjYsIDB4QzNGNywgMHhDM0Y5LAotICAgIDB4QzNGQSwgMHhDM0ZCLCAweEMzRkMsIDB4QzNGRCwgMHhDM0ZFLCAweEMzRkYsIDB4QzQwMCwgMHhDNDAxLAotICAgIDB4QzQwMiwgMHhDNDAzLCAweEM0MDQsIDB4QzQwNSwgMHhDNDA2LCAweEM0MDcsIDB4QzQwOSwgMHhDNDBBLAotICAgIDB4QzQwQiwgMHhDNDBDLCAweEM0MEQsIDB4QzQwRSwgMHhDNDBGLCAweEM0MTEsIDB4QzQxMiwgMHhDNDEzLAotICAgIDB4QzQxNCwgMHhDNDE1LCAweEM0MTYsIDB4QzQxNywgMHhDNDE4LCAweEM0MTksIDB4QzQxQSwgMHhDNDFCLAotICAgIDB4QzQxQywgMHhDNDFELCAweEM0MUUsIDB4QzQxRiwgMHhDNDIwLCAweEM0MjEsIDB4QzQyMiwgMHhDNDIzLAotICAgIDB4QzQyNSwgMHhDNDI2LCAweEM0MjcsIDB4QzQyOCwgMHhDNDI5LCAweEM0MkEsIDB4QzQyQiwgMHhDNDJELAotICAgIDB4QzQyRSwgMHhDNDJGLCAweEM0MzEsIDB4QzQzMiwgMHhDNDMzLCAweEM0MzUsIDB4QzQzNiwgMHhDNDM3LAotICAgIDB4QzQzOCwgMHhDNDM5LCAweEM0M0EsIDB4QzQzQiwgMHhDNDNFLCAweEM0M0YsIDB4QzQ0MCwgMHhDNDQxLAotICAgIDB4QzQ0MiwgMHhDNDQzLCAweEM0NDQsIDB4QzQ0NSwgMHhDNDQ2LCAweEM0NDcsIDB4QzQ0OSwgMHhDNDRBLAotICAgIDB4QzQ0QiwgMHhDNDRDLCAweEM0NEQsIDB4QzQ0RSwgMHhDNDRGLCAweEM0NTAsIDB4QzQ1MSwgMHhDNDUyLAotICAgIDB4QzQ1MywgMHhDNDU0LCAweEM0NTUsIDB4QzQ1NiwgMHhDNDU3LCAweEM0NTgsIDB4QzQ1OSwgMHhDNDVBLAotICAgIDB4QzQ1QiwgMHhDNDVDLCAweEM0NUQsIDB4QzQ1RSwgMHhDNDVGLCAweEM0NjAsIDB4QzQ2MSwgMHhDNDYyLAotICAgIDB4QzQ2MywgMHhDNDY2LCAweEM0NjcsIDB4QzQ2OSwgMHhDNDZBLCAweEM0NkIsIDB4QzQ2RCwgMHhDNDZFLAotICAgIDB4QzQ2RiwgMHhDNDcwLCAweEM0NzEsIDB4QzQ3MiwgMHhDNDczLCAweEM0NzYsIDB4QzQ3NywgMHhDNDc4LAotICAgIDB4QzQ3QSwgMHhDNDdCLCAweEM0N0MsIDB4QzQ3RCwgMHhDNDdFLCAweEM0N0YsIDB4QzQ4MSwgMHhDNDgyLAotICAgIDB4QzQ4MywgMHhDNDg0LCAweEM0ODUsIDB4QzQ4NiwgMHhDNDg3LCAweEM0ODgsIDB4QzQ4OSwgMHhDNDhBLAotICAgIDB4QzQ4QiwgMHhDNDhDLCAweEM0OEQsIDB4QzQ4RSwgMHhDNDhGLCAweEM0OTAsIDB4QzQ5MSwgMHhDNDkyLAotICAgIDB4QzQ5MywgMHhDNDk1LCAweEM0OTYsIDB4QzQ5NywgMHhDNDk4LCAweEM0OTksIDB4QzQ5QSwgMHhDNDlCLAotICAgIDB4QzQ5RCwgMHhDNDlFLCAweEM0OUYsIDB4QzRBMCwgMHhDNEExLCAweEM0QTIsIDB4QzRBMywgMHhDNEE0LAotICAgIDB4QzRBNSwgMHhDNEE2LCAweEM0QTcsIDB4QzRBOCwgMHhDNEE5LCAweEM0QUEsIDB4QzRBQiwgMHhDNEFDLAotICAgIDB4QzRBRCwgMHhDNEFFLCAweEM0QUYsIDB4QzRCMCwgMHhDNEIxLCAweEM0QjIsIDB4QzRCMywgMHhDNEI0LAotICAgIDB4QzRCNSwgMHhDNEI2LCAweEM0QjcsIDB4QzRCOSwgMHhDNEJBLCAweEM0QkIsIDB4QzRCRCwgMHhDNEJFLAotICAgIDB4QzRCRiwgMHhDNEMwLCAweEM0QzEsIDB4QzRDMiwgMHhDNEMzLCAweEM0QzQsIDB4QzRDNSwgMHhDNEM2LAotICAgIDB4QzRDNywgMHhDNEM4LCAweEM0QzksIDB4QzRDQSwgMHhDNENCLCAweEM0Q0MsIDB4QzRDRCwgMHhDNENFLAotICAgIDB4QzRDRiwgMHhDNEQwLCAweEM0RDEsIDB4QzREMiwgMHhDNEQzLCAweEM0RDQsIDB4QzRENSwgMHhDNEQ2LAotICAgIDB4QzRENywgMHhDNEQ4LCAweEM0RDksIDB4QzREQSwgMHhDNERCLCAweEM0REMsIDB4QzRERCwgMHhDNERFLAotICAgIDB4QzRERiwgMHhDNEUwLCAweEM0RTEsIDB4QzRFMiwgMHhDNEUzLCAweEM0RTQsIDB4QzRFNSwgMHhDNEU2LAotICAgIDB4QzRFNywgMHhDNEU4LCAweEM0RUEsIDB4QzRFQiwgMHhDNEVDLCAweEM0RUQsIDB4QzRFRSwgMHhDNEVGLAotICAgIDB4QzRGMiwgMHhDNEYzLCAweEM0RjUsIDB4QzRGNiwgMHhDNEY3LCAweEM0RjksIDB4QzRGQiwgMHhDNEZDLAotICAgIDB4QzRGRCwgMHhDNEZFLCAweEM1MDIsIDB4QzUwMywgMHhDNTA0LCAweEM1MDUsIDB4QzUwNiwgMHhDNTA3LAotICAgIDB4QzUwOCwgMHhDNTA5LCAweEM1MEEsIDB4QzUwQiwgMHhDNTBELCAweEM1MEUsIDB4QzUwRiwgMHhDNTExLAotICAgIDB4QzUxMiwgMHhDNTEzLCAweEM1MTUsIDB4QzUxNiwgMHhDNTE3LCAweEM1MTgsIDB4QzUxOSwgMHhDNTFBLAotICAgIDB4QzUxQiwgMHhDNTFELCAweEM1MUUsIDB4QzUxRiwgMHhDNTIwLCAweEM1MjEsIDB4QzUyMiwgMHhDNTIzLAotICAgIDB4QzUyNCwgMHhDNTI1LCAweEM1MjYsIDB4QzUyNywgMHhDNTJBLCAweEM1MkIsIDB4QzUyRCwgMHhDNTJFLAotICAgIDB4QzUyRiwgMHhDNTMxLCAweEM1MzIsIDB4QzUzMywgMHhDNTM0LCAweEM1MzUsIDB4QzUzNiwgMHhDNTM3LAotICAgIDB4QzUzQSwgMHhDNTNDLCAweEM1M0UsIDB4QzUzRiwgMHhDNTQwLCAweEM1NDEsIDB4QzU0MiwgMHhDNTQzLAotICAgIDB4QzU0NiwgMHhDNTQ3LCAweEM1NEIsIDB4QzU0RiwgMHhDNTUwLCAweEM1NTEsIDB4QzU1MiwgMHhDNTU2LAotICAgIDB4QzU1QSwgMHhDNTVCLCAweEM1NUMsIDB4QzU1RiwgMHhDNTYyLCAweEM1NjMsIDB4QzU2NSwgMHhDNTY2LAotICAgIDB4QzU2NywgMHhDNTY5LCAweEM1NkEsIDB4QzU2QiwgMHhDNTZDLCAweEM1NkQsIDB4QzU2RSwgMHhDNTZGLAotICAgIDB4QzU3MiwgMHhDNTc2LCAweEM1NzcsIDB4QzU3OCwgMHhDNTc5LCAweEM1N0EsIDB4QzU3QiwgMHhDNTdFLAotICAgIDB4QzU3RiwgMHhDNTgxLCAweEM1ODIsIDB4QzU4MywgMHhDNTg1LCAweEM1ODYsIDB4QzU4OCwgMHhDNTg5LAotICAgIDB4QzU4QSwgMHhDNThCLCAweEM1OEUsIDB4QzU5MCwgMHhDNTkyLCAweEM1OTMsIDB4QzU5NCwgMHhDNTk2LAotICAgIDB4QzU5OSwgMHhDNTlBLCAweEM1OUIsIDB4QzU5RCwgMHhDNTlFLCAweEM1OUYsIDB4QzVBMSwgMHhDNUEyLAotICAgIDB4QzVBMywgMHhDNUE0LCAweEM1QTUsIDB4QzVBNiwgMHhDNUE3LCAweEM1QTgsIDB4QzVBQSwgMHhDNUFCLAotICAgIDB4QzVBQywgMHhDNUFELCAweEM1QUUsIDB4QzVBRiwgMHhDNUIwLCAweEM1QjEsIDB4QzVCMiwgMHhDNUIzLAotICAgIDB4QzVCNiwgMHhDNUI3LCAweEM1QkEsIDB4QzVCRiwgMHhDNUMwLCAweEM1QzEsIDB4QzVDMiwgMHhDNUMzLAotICAgIDB4QzVDQiwgMHhDNUNELCAweEM1Q0YsIDB4QzVEMiwgMHhDNUQzLCAweEM1RDUsIDB4QzVENiwgMHhDNUQ3LAotICAgIDB4QzVEOSwgMHhDNURBLCAweEM1REIsIDB4QzVEQywgMHhDNURELCAweEM1REUsIDB4QzVERiwgMHhDNUUyLAotICAgIDB4QzVFNCwgMHhDNUU2LCAweEM1RTcsIDB4QzVFOCwgMHhDNUU5LCAweEM1RUEsIDB4QzVFQiwgMHhDNUVGLAotICAgIDB4QzVGMSwgMHhDNUYyLCAweEM1RjMsIDB4QzVGNSwgMHhDNUY4LCAweEM1RjksIDB4QzVGQSwgMHhDNUZCLAotICAgIDB4QzYwMiwgMHhDNjAzLCAweEM2MDQsIDB4QzYwOSwgMHhDNjBBLCAweEM2MEIsIDB4QzYwRCwgMHhDNjBFLAotICAgIDB4QzYwRiwgMHhDNjExLCAweEM2MTIsIDB4QzYxMywgMHhDNjE0LCAweEM2MTUsIDB4QzYxNiwgMHhDNjE3LAotICAgIDB4QzYxQSwgMHhDNjFELCAweEM2MUUsIDB4QzYxRiwgMHhDNjIwLCAweEM2MjEsIDB4QzYyMiwgMHhDNjIzLAotICAgIDB4QzYyNiwgMHhDNjI3LCAweEM2MjksIDB4QzYyQSwgMHhDNjJCLCAweEM2MkYsIDB4QzYzMSwgMHhDNjMyLAotICAgIDB4QzYzNiwgMHhDNjM4LCAweEM2M0EsIDB4QzYzQywgMHhDNjNELCAweEM2M0UsIDB4QzYzRiwgMHhDNjQyLAotICAgIDB4QzY0MywgMHhDNjQ1LCAweEM2NDYsIDB4QzY0NywgMHhDNjQ5LCAweEM2NEEsIDB4QzY0QiwgMHhDNjRDLAotICAgIDB4QzY0RCwgMHhDNjRFLCAweEM2NEYsIDB4QzY1MiwgMHhDNjU2LCAweEM2NTcsIDB4QzY1OCwgMHhDNjU5LAotICAgIDB4QzY1QSwgMHhDNjVCLCAweEM2NUUsIDB4QzY1RiwgMHhDNjYxLCAweEM2NjIsIDB4QzY2MywgMHhDNjY0LAotICAgIDB4QzY2NSwgMHhDNjY2LCAweEM2NjcsIDB4QzY2OCwgMHhDNjY5LCAweEM2NkEsIDB4QzY2QiwgMHhDNjZELAotICAgIDB4QzY2RSwgMHhDNjcwLCAweEM2NzIsIDB4QzY3MywgMHhDNjc0LCAweEM2NzUsIDB4QzY3NiwgMHhDNjc3LAotICAgIDB4QzY3QSwgMHhDNjdCLCAweEM2N0QsIDB4QzY3RSwgMHhDNjdGLCAweEM2ODEsIDB4QzY4MiwgMHhDNjgzLAotICAgIDB4QzY4NCwgMHhDNjg1LCAweEM2ODYsIDB4QzY4NywgMHhDNjhBLCAweEM2OEMsIDB4QzY4RSwgMHhDNjhGLAotICAgIDB4QzY5MCwgMHhDNjkxLCAweEM2OTIsIDB4QzY5MywgMHhDNjk2LCAweEM2OTcsIDB4QzY5OSwgMHhDNjlBLAotICAgIDB4QzY5QiwgMHhDNjlELCAweEM2OUUsIDB4QzY5RiwgMHhDNkEwLCAweEM2QTEsIDB4QzZBMiwgMHhDNkEzLAotICAgIDB4QzZBNiwgMHhDNkE4LCAweEM2QUEsIDB4QzZBQiwgMHhDNkFDLCAweEM2QUQsIDB4QzZBRSwgMHhDNkFGLAotICAgIDB4QzZCMiwgMHhDNkIzLCAweEM2QjUsIDB4QzZCNiwgMHhDNkI3LCAweEM2QkIsIDB4QzZCQywgMHhDNkJELAotICAgIDB4QzZCRSwgMHhDNkJGLCAweEM2QzIsIDB4QzZDNCwgMHhDNkM2LCAweEM2QzcsIDB4QzZDOCwgMHhDNkM5LAotICAgIDB4QzZDQSwgMHhDNkNCLCAweEM2Q0UsIDB4QzZDRiwgMHhDNkQxLCAweEM2RDIsIDB4QzZEMywgMHhDNkQ1LAotICAgIDB4QzZENiwgMHhDNkQ3LCAweEM2RDgsIDB4QzZEOSwgMHhDNkRBLCAweEM2REIsIDB4QzZERSwgMHhDNkRGLAotICAgIDB4QzZFMiwgMHhDNkUzLCAweEM2RTQsIDB4QzZFNSwgMHhDNkU2LCAweEM2RTcsIDB4QzZFQSwgMHhDNkVCLAotICAgIDB4QzZFRCwgMHhDNkVFLCAweEM2RUYsIDB4QzZGMSwgMHhDNkYyLCAweEM2RjMsIDB4QzZGNCwgMHhDNkY1LAotICAgIDB4QzZGNiwgMHhDNkY3LCAweEM2RkEsIDB4QzZGQiwgMHhDNkZDLCAweEM2RkUsIDB4QzZGRiwgMHhDNzAwLAotICAgIDB4QzcwMSwgMHhDNzAyLCAweEM3MDMsIDB4QzcwNiwgMHhDNzA3LCAweEM3MDksIDB4QzcwQSwgMHhDNzBCLAotICAgIDB4QzcwRCwgMHhDNzBFLCAweEM3MEYsIDB4QzcxMCwgMHhDNzExLCAweEM3MTIsIDB4QzcxMywgMHhDNzE2LAotICAgIDB4QzcxOCwgMHhDNzFBLCAweEM3MUIsIDB4QzcxQywgMHhDNzFELCAweEM3MUUsIDB4QzcxRiwgMHhDNzIyLAotICAgIDB4QzcyMywgMHhDNzI1LCAweEM3MjYsIDB4QzcyNywgMHhDNzI5LCAweEM3MkEsIDB4QzcyQiwgMHhDNzJDLAotICAgIDB4QzcyRCwgMHhDNzJFLCAweEM3MkYsIDB4QzczMiwgMHhDNzM0LCAweEM3MzYsIDB4QzczOCwgMHhDNzM5LAotICAgIDB4QzczQSwgMHhDNzNCLCAweEM3M0UsIDB4QzczRiwgMHhDNzQxLCAweEM3NDIsIDB4Qzc0MywgMHhDNzQ1LAotICAgIDB4Qzc0NiwgMHhDNzQ3LCAweEM3NDgsIDB4Qzc0OSwgMHhDNzRCLCAweEM3NEUsIDB4Qzc1MCwgMHhDNzU5LAotICAgIDB4Qzc1QSwgMHhDNzVCLCAweEM3NUQsIDB4Qzc1RSwgMHhDNzVGLCAweEM3NjEsIDB4Qzc2MiwgMHhDNzYzLAotICAgIDB4Qzc2NCwgMHhDNzY1LCAweEM3NjYsIDB4Qzc2NywgMHhDNzY5LCAweEM3NkEsIDB4Qzc2QywgMHhDNzZELAotICAgIDB4Qzc2RSwgMHhDNzZGLCAweEM3NzAsIDB4Qzc3MSwgMHhDNzcyLCAweEM3NzMsIDB4Qzc3NiwgMHhDNzc3LAotICAgIDB4Qzc3OSwgMHhDNzdBLCAweEM3N0IsIDB4Qzc3RiwgMHhDNzgwLCAweEM3ODEsIDB4Qzc4MiwgMHhDNzg2LAotICAgIDB4Qzc4QiwgMHhDNzhDLCAweEM3OEQsIDB4Qzc4RiwgMHhDNzkyLCAweEM3OTMsIDB4Qzc5NSwgMHhDNzk5LAotICAgIDB4Qzc5QiwgMHhDNzlDLCAweEM3OUQsIDB4Qzc5RSwgMHhDNzlGLCAweEM3QTIsIDB4QzdBNywgMHhDN0E4LAotICAgIDB4QzdBOSwgMHhDN0FBLCAweEM3QUIsIDB4QzdBRSwgMHhDN0FGLCAweEM3QjEsIDB4QzdCMiwgMHhDN0IzLAotICAgIDB4QzdCNSwgMHhDN0I2LCAweEM3QjcsIDB4QzdCOCwgMHhDN0I5LCAweEM3QkEsIDB4QzdCQiwgMHhDN0JFLAotICAgIDB4QzdDMiwgMHhDN0MzLCAweEM3QzQsIDB4QzdDNSwgMHhDN0M2LCAweEM3QzcsIDB4QzdDQSwgMHhDN0NCLAotICAgIDB4QzdDRCwgMHhDN0NGLCAweEM3RDEsIDB4QzdEMiwgMHhDN0QzLCAweEM3RDQsIDB4QzdENSwgMHhDN0Q2LAotICAgIDB4QzdENywgMHhDN0Q5LCAweEM3REEsIDB4QzdEQiwgMHhDN0RDLCAweEM3REUsIDB4QzdERiwgMHhDN0UwLAotICAgIDB4QzdFMSwgMHhDN0UyLCAweEM3RTMsIDB4QzdFNSwgMHhDN0U2LCAweEM3RTcsIDB4QzdFOSwgMHhDN0VBLAotICAgIDB4QzdFQiwgMHhDN0VELCAweEM3RUUsIDB4QzdFRiwgMHhDN0YwLCAweEM3RjEsIDB4QzdGMiwgMHhDN0YzLAotICAgIDB4QzdGNCwgMHhDN0Y1LCAweEM3RjYsIDB4QzdGNywgMHhDN0Y4LCAweEM3RjksIDB4QzdGQSwgMHhDN0ZCLAotICAgIDB4QzdGQywgMHhDN0ZELCAweEM3RkUsIDB4QzdGRiwgMHhDODAyLCAweEM4MDMsIDB4QzgwNSwgMHhDODA2LAotICAgIDB4QzgwNywgMHhDODA5LCAweEM4MEIsIDB4QzgwQywgMHhDODBELCAweEM4MEUsIDB4QzgwRiwgMHhDODEyLAotICAgIDB4QzgxNCwgMHhDODE3LCAweEM4MTgsIDB4QzgxOSwgMHhDODFBLCAweEM4MUIsIDB4QzgxRSwgMHhDODFGLAotICAgIDB4QzgyMSwgMHhDODIyLCAweEM4MjMsIDB4QzgyNSwgMHhDODI2LCAweEM4MjcsIDB4QzgyOCwgMHhDODI5LAotICAgIDB4QzgyQSwgMHhDODJCLCAweEM4MkUsIDB4QzgzMCwgMHhDODMyLCAweEM4MzMsIDB4QzgzNCwgMHhDODM1LAotICAgIDB4QzgzNiwgMHhDODM3LCAweEM4MzksIDB4QzgzQSwgMHhDODNCLCAweEM4M0QsIDB4QzgzRSwgMHhDODNGLAotICAgIDB4Qzg0MSwgMHhDODQyLCAweEM4NDMsIDB4Qzg0NCwgMHhDODQ1LCAweEM4NDYsIDB4Qzg0NywgMHhDODRBLAotICAgIDB4Qzg0QiwgMHhDODRFLCAweEM4NEYsIDB4Qzg1MCwgMHhDODUxLCAweEM4NTIsIDB4Qzg1MywgMHhDODU1LAotICAgIDB4Qzg1NiwgMHhDODU3LCAweEM4NTgsIDB4Qzg1OSwgMHhDODVBLCAweEM4NUIsIDB4Qzg1QywgMHhDODVELAotICAgIDB4Qzg1RSwgMHhDODVGLCAweEM4NjAsIDB4Qzg2MSwgMHhDODYyLCAweEM4NjMsIDB4Qzg2NCwgMHhDODY1LAotICAgIDB4Qzg2NiwgMHhDODY3LCAweEM4NjgsIDB4Qzg2OSwgMHhDODZBLCAweEM4NkIsIDB4Qzg2QywgMHhDODZELAotICAgIDB4Qzg2RSwgMHhDODZGLCAweEM4NzIsIDB4Qzg3MywgMHhDODc1LCAweEM4NzYsIDB4Qzg3NywgMHhDODc5LAotICAgIDB4Qzg3QiwgMHhDODdDLCAweEM4N0QsIDB4Qzg3RSwgMHhDODdGLCAweEM4ODIsIDB4Qzg4NCwgMHhDODg4LAotICAgIDB4Qzg4OSwgMHhDODhBLCAweEM4OEUsIDB4Qzg4RiwgMHhDODkwLCAweEM4OTEsIDB4Qzg5MiwgMHhDODkzLAotICAgIDB4Qzg5NSwgMHhDODk2LCAweEM4OTcsIDB4Qzg5OCwgMHhDODk5LCAweEM4OUEsIDB4Qzg5QiwgMHhDODlDLAotICAgIDB4Qzg5RSwgMHhDOEEwLCAweEM4QTIsIDB4QzhBMywgMHhDOEE0LCAweEM4QTUsIDB4QzhBNiwgMHhDOEE3LAotICAgIDB4QzhBOSwgMHhDOEFBLCAweEM4QUIsIDB4QzhBQywgMHhDOEFELCAweEM4QUUsIDB4QzhBRiwgMHhDOEIwLAotICAgIDB4QzhCMSwgMHhDOEIyLCAweEM4QjMsIDB4QzhCNCwgMHhDOEI1LCAweEM4QjYsIDB4QzhCNywgMHhDOEI4LAotICAgIDB4QzhCOSwgMHhDOEJBLCAweEM4QkIsIDB4QzhCRSwgMHhDOEJGLCAweEM4QzAsIDB4QzhDMSwgMHhDOEMyLAotICAgIDB4QzhDMywgMHhDOEM1LCAweEM4QzYsIDB4QzhDNywgMHhDOEM5LCAweEM4Q0EsIDB4QzhDQiwgMHhDOENELAotICAgIDB4QzhDRSwgMHhDOENGLCAweEM4RDAsIDB4QzhEMSwgMHhDOEQyLCAweEM4RDMsIDB4QzhENiwgMHhDOEQ4LAotICAgIDB4QzhEQSwgMHhDOERCLCAweEM4REMsIDB4QzhERCwgMHhDOERFLCAweEM4REYsIDB4QzhFMiwgMHhDOEUzLAotICAgIDB4QzhFNSwgMHhDOEU2LCAweEM4RTcsIDB4QzhFOCwgMHhDOEU5LCAweEM4RUEsIDB4QzhFQiwgMHhDOEVDLAotICAgIDB4QzhFRCwgMHhDOEVFLCAweEM4RUYsIDB4QzhGMCwgMHhDOEYxLCAweEM4RjIsIDB4QzhGMywgMHhDOEY0LAotICAgIDB4QzhGNiwgMHhDOEY3LCAweEM4RjgsIDB4QzhGOSwgMHhDOEZBLCAweEM4RkIsIDB4QzhGRSwgMHhDOEZGLAotICAgIDB4QzkwMSwgMHhDOTAyLCAweEM5MDMsIDB4QzkwNywgMHhDOTA4LCAweEM5MDksIDB4QzkwQSwgMHhDOTBCLAotICAgIDB4QzkwRSwgMHhDOTEwLCAweEM5MTIsIDB4QzkxMywgMHhDOTE0LCAweEM5MTUsIDB4QzkxNiwgMHhDOTE3LAotICAgIDB4QzkxOSwgMHhDOTFBLCAweEM5MUIsIDB4QzkxQywgMHhDOTFELCAweEM5MUUsIDB4QzkxRiwgMHhDOTIwLAotICAgIDB4QzkyMSwgMHhDOTIyLCAweEM5MjMsIDB4QzkyNCwgMHhDOTI1LCAweEM5MjYsIDB4QzkyNywgMHhDOTI4LAotICAgIDB4QzkyOSwgMHhDOTJBLCAweEM5MkIsIDB4QzkyRCwgMHhDOTJFLCAweEM5MkYsIDB4QzkzMCwgMHhDOTMxLAotICAgIDB4QzkzMiwgMHhDOTMzLCAweEM5MzUsIDB4QzkzNiwgMHhDOTM3LCAweEM5MzgsIDB4QzkzOSwgMHhDOTNBLAotICAgIDB4QzkzQiwgMHhDOTNDLCAweEM5M0QsIDB4QzkzRSwgMHhDOTNGLCAweEM5NDAsIDB4Qzk0MSwgMHhDOTQyLAotICAgIDB4Qzk0MywgMHhDOTQ0LCAweEM5NDUsIDB4Qzk0NiwgMHhDOTQ3LCAweEM5NDgsIDB4Qzk0OSwgMHhDOTRBLAotICAgIDB4Qzk0QiwgMHhDOTRDLCAweEM5NEQsIDB4Qzk0RSwgMHhDOTRGLCAweEM5NTIsIDB4Qzk1MywgMHhDOTU1LAotICAgIDB4Qzk1NiwgMHhDOTU3LCAweEM5NTksIDB4Qzk1QSwgMHhDOTVCLCAweEM5NUMsIDB4Qzk1RCwgMHhDOTVFLAotICAgIDB4Qzk1RiwgMHhDOTYyLCAweEM5NjQsIDB4Qzk2NSwgMHhDOTY2LCAweEM5NjcsIDB4Qzk2OCwgMHhDOTY5LAotICAgIDB4Qzk2QSwgMHhDOTZCLCAweEM5NkQsIDB4Qzk2RSwgMHhDOTZGLCAweEM5NzEsIDB4Qzk3MiwgMHhDOTczLAotICAgIDB4Qzk3NSwgMHhDOTc2LCAweEM5NzcsIDB4Qzk3OCwgMHhDOTc5LCAweEM5N0EsIDB4Qzk3QiwgMHhDOTdELAotICAgIDB4Qzk3RSwgMHhDOTdGLCAweEM5ODAsIDB4Qzk4MSwgMHhDOTgyLCAweEM5ODMsIDB4Qzk4NCwgMHhDOTg1LAotICAgIDB4Qzk4NiwgMHhDOTg3LCAweEM5OEEsIDB4Qzk4QiwgMHhDOThELCAweEM5OEUsIDB4Qzk4RiwgMHhDOTkxLAotICAgIDB4Qzk5MiwgMHhDOTkzLCAweEM5OTQsIDB4Qzk5NSwgMHhDOTk2LCAweEM5OTcsIDB4Qzk5QSwgMHhDOTlDLAotICAgIDB4Qzk5RSwgMHhDOTlGLCAweEM5QTAsIDB4QzlBMSwgMHhDOUEyLCAweEM5QTMsIDB4QzlBNCwgMHhDOUE1LAotICAgIDB4QzlBNiwgMHhDOUE3LCAweEM5QTgsIDB4QzlBOSwgMHhDOUFBLCAweEM5QUIsIDB4QzlBQywgMHhDOUFELAotICAgIDB4QzlBRSwgMHhDOUFGLCAweEM5QjAsIDB4QzlCMSwgMHhDOUIyLCAweEM5QjMsIDB4QzlCNCwgMHhDOUI1LAotICAgIDB4QzlCNiwgMHhDOUI3LCAweEM5QjgsIDB4QzlCOSwgMHhDOUJBLCAweEM5QkIsIDB4QzlCQywgMHhDOUJELAotICAgIDB4QzlCRSwgMHhDOUJGLCAweEM5QzIsIDB4QzlDMywgMHhDOUM1LCAweEM5QzYsIDB4QzlDOSwgMHhDOUNCLAotICAgIDB4QzlDQywgMHhDOUNELCAweEM5Q0UsIDB4QzlDRiwgMHhDOUQyLCAweEM5RDQsIDB4QzlENywgMHhDOUQ4LAotICAgIDB4QzlEQiwgMHhDOURFLCAweEM5REYsIDB4QzlFMSwgMHhDOUUzLCAweEM5RTUsIDB4QzlFNiwgMHhDOUU4LAotICAgIDB4QzlFOSwgMHhDOUVBLCAweEM5RUIsIDB4QzlFRSwgMHhDOUYyLCAweEM5RjMsIDB4QzlGNCwgMHhDOUY1LAotICAgIDB4QzlGNiwgMHhDOUY3LCAweEM5RkEsIDB4QzlGQiwgMHhDOUZELCAweEM5RkUsIDB4QzlGRiwgMHhDQTAxLAotICAgIDB4Q0EwMiwgMHhDQTAzLCAweENBMDQsIDB4Q0EwNSwgMHhDQTA2LCAweENBMDcsIDB4Q0EwQSwgMHhDQTBFLAotICAgIDB4Q0EwRiwgMHhDQTEwLCAweENBMTEsIDB4Q0ExMiwgMHhDQTEzLCAweENBMTUsIDB4Q0ExNiwgMHhDQTE3LAotICAgIDB4Q0ExOSwgMHhDQTFBLCAweENBMUIsIDB4Q0ExQywgMHhDQTFELCAweENBMUUsIDB4Q0ExRiwgMHhDQTIwLAotICAgIDB4Q0EyMSwgMHhDQTIyLCAweENBMjMsIDB4Q0EyNCwgMHhDQTI1LCAweENBMjYsIDB4Q0EyNywgMHhDQTI4LAotICAgIDB4Q0EyQSwgMHhDQTJCLCAweENBMkMsIDB4Q0EyRCwgMHhDQTJFLCAweENBMkYsIDB4Q0EzMCwgMHhDQTMxLAotICAgIDB4Q0EzMiwgMHhDQTMzLCAweENBMzQsIDB4Q0EzNSwgMHhDQTM2LCAweENBMzcsIDB4Q0EzOCwgMHhDQTM5LAotICAgIDB4Q0EzQSwgMHhDQTNCLCAweENBM0MsIDB4Q0EzRCwgMHhDQTNFLCAweENBM0YsIDB4Q0E0MCwgMHhDQTQxLAotICAgIDB4Q0E0MiwgMHhDQTQzLCAweENBNDQsIDB4Q0E0NSwgMHhDQTQ2LCAweENBNDcsIDB4Q0E0OCwgMHhDQTQ5LAotICAgIDB4Q0E0QSwgMHhDQTRCLCAweENBNEUsIDB4Q0E0RiwgMHhDQTUxLCAweENBNTIsIDB4Q0E1MywgMHhDQTU1LAotICAgIDB4Q0E1NiwgMHhDQTU3LCAweENBNTgsIDB4Q0E1OSwgMHhDQTVBLCAweENBNUIsIDB4Q0E1RSwgMHhDQTYyLAotICAgIDB4Q0E2MywgMHhDQTY0LCAweENBNjUsIDB4Q0E2NiwgMHhDQTY3LCAweENBNjksIDB4Q0E2QSwgMHhDQTZCLAotICAgIDB4Q0E2QywgMHhDQTZELCAweENBNkUsIDB4Q0E2RiwgMHhDQTcwLCAweENBNzEsIDB4Q0E3MiwgMHhDQTczLAotICAgIDB4Q0E3NCwgMHhDQTc1LCAweENBNzYsIDB4Q0E3NywgMHhDQTc4LCAweENBNzksIDB4Q0E3QSwgMHhDQTdCLAotICAgIDB4Q0E3QywgMHhDQTdFLCAweENBN0YsIDB4Q0E4MCwgMHhDQTgxLCAweENBODIsIDB4Q0E4MywgMHhDQTg1LAotICAgIDB4Q0E4NiwgMHhDQTg3LCAweENBODgsIDB4Q0E4OSwgMHhDQThBLCAweENBOEIsIDB4Q0E4QywgMHhDQThELAotICAgIDB4Q0E4RSwgMHhDQThGLCAweENBOTAsIDB4Q0E5MSwgMHhDQTkyLCAweENBOTMsIDB4Q0E5NCwgMHhDQTk1LAotICAgIDB4Q0E5NiwgMHhDQTk3LCAweENBOTksIDB4Q0E5QSwgMHhDQTlCLCAweENBOUMsIDB4Q0E5RCwgMHhDQTlFLAotICAgIDB4Q0E5RiwgMHhDQUEwLCAweENBQTEsIDB4Q0FBMiwgMHhDQUEzLCAweENBQTQsIDB4Q0FBNSwgMHhDQUE2LAotICAgIDB4Q0FBNywgMHhDQUE4LCAweENBQTksIDB4Q0FBQSwgMHhDQUFCLCAweENBQUMsIDB4Q0FBRCwgMHhDQUFFLAotICAgIDB4Q0FBRiwgMHhDQUIwLCAweENBQjEsIDB4Q0FCMiwgMHhDQUIzLCAweENBQjQsIDB4Q0FCNSwgMHhDQUI2LAotICAgIDB4Q0FCNywgMHhDQUI4LCAweENBQjksIDB4Q0FCQSwgMHhDQUJCLCAweENBQkUsIDB4Q0FCRiwgMHhDQUMxLAotICAgIDB4Q0FDMiwgMHhDQUMzLCAweENBQzUsIDB4Q0FDNiwgMHhDQUM3LCAweENBQzgsIDB4Q0FDOSwgMHhDQUNBLAotICAgIDB4Q0FDQiwgMHhDQUNFLCAweENBRDAsIDB4Q0FEMiwgMHhDQUQ0LCAweENBRDUsIDB4Q0FENiwgMHhDQUQ3LAotICAgIDB4Q0FEQSwgMHhDQURCLCAweENBREMsIDB4Q0FERCwgMHhDQURFLCAweENBREYsIDB4Q0FFMSwgMHhDQUUyLAotICAgIDB4Q0FFMywgMHhDQUU0LCAweENBRTUsIDB4Q0FFNiwgMHhDQUU3LCAweENBRTgsIDB4Q0FFOSwgMHhDQUVBLAotICAgIDB4Q0FFQiwgMHhDQUVELCAweENBRUUsIDB4Q0FFRiwgMHhDQUYwLCAweENBRjEsIDB4Q0FGMiwgMHhDQUYzLAotICAgIDB4Q0FGNSwgMHhDQUY2LCAweENBRjcsIDB4Q0FGOCwgMHhDQUY5LCAweENBRkEsIDB4Q0FGQiwgMHhDQUZDLAotICAgIDB4Q0FGRCwgMHhDQUZFLCAweENBRkYsIDB4Q0IwMCwgMHhDQjAxLCAweENCMDIsIDB4Q0IwMywgMHhDQjA0LAotICAgIDB4Q0IwNSwgMHhDQjA2LCAweENCMDcsIDB4Q0IwOSwgMHhDQjBBLCAweENCMEIsIDB4Q0IwQywgMHhDQjBELAotICAgIDB4Q0IwRSwgMHhDQjBGLCAweENCMTEsIDB4Q0IxMiwgMHhDQjEzLCAweENCMTUsIDB4Q0IxNiwgMHhDQjE3LAotICAgIDB4Q0IxOSwgMHhDQjFBLCAweENCMUIsIDB4Q0IxQywgMHhDQjFELCAweENCMUUsIDB4Q0IxRiwgMHhDQjIyLAotICAgIDB4Q0IyMywgMHhDQjI0LCAweENCMjUsIDB4Q0IyNiwgMHhDQjI3LCAweENCMjgsIDB4Q0IyOSwgMHhDQjJBLAotICAgIDB4Q0IyQiwgMHhDQjJDLCAweENCMkQsIDB4Q0IyRSwgMHhDQjJGLCAweENCMzAsIDB4Q0IzMSwgMHhDQjMyLAotICAgIDB4Q0IzMywgMHhDQjM0LCAweENCMzUsIDB4Q0IzNiwgMHhDQjM3LCAweENCMzgsIDB4Q0IzOSwgMHhDQjNBLAotICAgIDB4Q0IzQiwgMHhDQjNDLCAweENCM0QsIDB4Q0IzRSwgMHhDQjNGLCAweENCNDAsIDB4Q0I0MiwgMHhDQjQzLAotICAgIDB4Q0I0NCwgMHhDQjQ1LCAweENCNDYsIDB4Q0I0NywgMHhDQjRBLCAweENCNEIsIDB4Q0I0RCwgMHhDQjRFLAotICAgIDB4Q0I0RiwgMHhDQjUxLCAweENCNTIsIDB4Q0I1MywgMHhDQjU0LCAweENCNTUsIDB4Q0I1NiwgMHhDQjU3LAotICAgIDB4Q0I1QSwgMHhDQjVCLCAweENCNUMsIDB4Q0I1RSwgMHhDQjVGLCAweENCNjAsIDB4Q0I2MSwgMHhDQjYyLAotICAgIDB4Q0I2MywgMHhDQjY1LCAweENCNjYsIDB4Q0I2NywgMHhDQjY4LCAweENCNjksIDB4Q0I2QSwgMHhDQjZCLAotICAgIDB4Q0I2QywgMHhDQjZELCAweENCNkUsIDB4Q0I2RiwgMHhDQjcwLCAweENCNzEsIDB4Q0I3MiwgMHhDQjczLAotICAgIDB4Q0I3NCwgMHhDQjc1LCAweENCNzYsIDB4Q0I3NywgMHhDQjdBLCAweENCN0IsIDB4Q0I3QywgMHhDQjdELAotICAgIDB4Q0I3RSwgMHhDQjdGLCAweENCODAsIDB4Q0I4MSwgMHhDQjgyLCAweENCODMsIDB4Q0I4NCwgMHhDQjg1LAotICAgIDB4Q0I4NiwgMHhDQjg3LCAweENCODgsIDB4Q0I4OSwgMHhDQjhBLCAweENCOEIsIDB4Q0I4QywgMHhDQjhELAotICAgIDB4Q0I4RSwgMHhDQjhGLCAweENCOTAsIDB4Q0I5MSwgMHhDQjkyLCAweENCOTMsIDB4Q0I5NCwgMHhDQjk1LAotICAgIDB4Q0I5NiwgMHhDQjk3LCAweENCOTgsIDB4Q0I5OSwgMHhDQjlBLCAweENCOUIsIDB4Q0I5RCwgMHhDQjlFLAotICAgIDB4Q0I5RiwgMHhDQkEwLCAweENCQTEsIDB4Q0JBMiwgMHhDQkEzLCAweENCQTQsIDB4Q0JBNSwgMHhDQkE2LAotICAgIDB4Q0JBNywgMHhDQkE4LCAweENCQTksIDB4Q0JBQSwgMHhDQkFCLCAweENCQUMsIDB4Q0JBRCwgMHhDQkFFLAotICAgIDB4Q0JBRiwgMHhDQkIwLCAweENCQjEsIDB4Q0JCMiwgMHhDQkIzLCAweENCQjQsIDB4Q0JCNSwgMHhDQkI2LAotICAgIDB4Q0JCNywgMHhDQkI5LCAweENCQkEsIDB4Q0JCQiwgMHhDQkJDLCAweENCQkQsIDB4Q0JCRSwgMHhDQkJGLAotICAgIDB4Q0JDMCwgMHhDQkMxLCAweENCQzIsIDB4Q0JDMywgMHhDQkM0LCAweENCQzUsIDB4Q0JDNiwgMHhDQkM3LAotICAgIDB4Q0JDOCwgMHhDQkM5LCAweENCQ0EsIDB4Q0JDQiwgMHhDQkNDLCAweENCQ0QsIDB4Q0JDRSwgMHhDQkNGLAotICAgIDB4Q0JEMCwgMHhDQkQxLCAweENCRDIsIDB4Q0JEMywgMHhDQkQ1LCAweENCRDYsIDB4Q0JENywgMHhDQkQ4LAotICAgIDB4Q0JEOSwgMHhDQkRBLCAweENCREIsIDB4Q0JEQywgMHhDQkRELCAweENCREUsIDB4Q0JERiwgMHhDQkUwLAotICAgIDB4Q0JFMSwgMHhDQkUyLCAweENCRTMsIDB4Q0JFNSwgMHhDQkU2LCAweENCRTgsIDB4Q0JFQSwgMHhDQkVCLAotICAgIDB4Q0JFQywgMHhDQkVELCAweENCRUUsIDB4Q0JFRiwgMHhDQkYwLCAweENCRjEsIDB4Q0JGMiwgMHhDQkYzLAotICAgIDB4Q0JGNCwgMHhDQkY1LCAweENCRjYsIDB4Q0JGNywgMHhDQkY4LCAweENCRjksIDB4Q0JGQSwgMHhDQkZCLAotICAgIDB4Q0JGQywgMHhDQkZELCAweENCRkUsIDB4Q0JGRiwgMHhDQzAwLCAweENDMDEsIDB4Q0MwMiwgMHhDQzAzLAotICAgIDB4Q0MwNCwgMHhDQzA1LCAweENDMDYsIDB4Q0MwNywgMHhDQzA4LCAweENDMDksIDB4Q0MwQSwgMHhDQzBCLAotICAgIDB4Q0MwRSwgMHhDQzBGLCAweENDMTEsIDB4Q0MxMiwgMHhDQzEzLCAweENDMTUsIDB4Q0MxNiwgMHhDQzE3LAotICAgIDB4Q0MxOCwgMHhDQzE5LCAweENDMUEsIDB4Q0MxQiwgMHhDQzFFLCAweENDMUYsIDB4Q0MyMCwgMHhDQzIzLAotICAgIDB4Q0MyNCwgMHhDQzI1LCAweENDMjYsIDB4Q0MyQSwgMHhDQzJCLCAweENDMkQsIDB4Q0MyRiwgMHhDQzMxLAotICAgIDB4Q0MzMiwgMHhDQzMzLCAweENDMzQsIDB4Q0MzNSwgMHhDQzM2LCAweENDMzcsIDB4Q0MzQSwgMHhDQzNGLAotICAgIDB4Q0M0MCwgMHhDQzQxLCAweENDNDIsIDB4Q0M0MywgMHhDQzQ2LCAweENDNDcsIDB4Q0M0OSwgMHhDQzRBLAotICAgIDB4Q0M0QiwgMHhDQzRELCAweENDNEUsIDB4Q0M0RiwgMHhDQzUwLCAweENDNTEsIDB4Q0M1MiwgMHhDQzUzLAotICAgIDB4Q0M1NiwgMHhDQzVBLCAweENDNUIsIDB4Q0M1QywgMHhDQzVELCAweENDNUUsIDB4Q0M1RiwgMHhDQzYxLAotICAgIDB4Q0M2MiwgMHhDQzYzLCAweENDNjUsIDB4Q0M2NywgMHhDQzY5LCAweENDNkEsIDB4Q0M2QiwgMHhDQzZDLAotICAgIDB4Q0M2RCwgMHhDQzZFLCAweENDNkYsIDB4Q0M3MSwgMHhDQzcyLCAweENDNzMsIDB4Q0M3NCwgMHhDQzc2LAotICAgIDB4Q0M3NywgMHhDQzc4LCAweENDNzksIDB4Q0M3QSwgMHhDQzdCLCAweENDN0MsIDB4Q0M3RCwgMHhDQzdFLAotICAgIDB4Q0M3RiwgMHhDQzgwLCAweENDODEsIDB4Q0M4MiwgMHhDQzgzLCAweENDODQsIDB4Q0M4NSwgMHhDQzg2LAotICAgIDB4Q0M4NywgMHhDQzg4LCAweENDODksIDB4Q0M4QSwgMHhDQzhCLCAweENDOEMsIDB4Q0M4RCwgMHhDQzhFLAotICAgIDB4Q0M4RiwgMHhDQzkwLCAweENDOTEsIDB4Q0M5MiwgMHhDQzkzLCAweENDOTQsIDB4Q0M5NSwgMHhDQzk2LAotICAgIDB4Q0M5NywgMHhDQzlBLCAweENDOUIsIDB4Q0M5RCwgMHhDQzlFLCAweENDOUYsIDB4Q0NBMSwgMHhDQ0EyLAotICAgIDB4Q0NBMywgMHhDQ0E0LCAweENDQTUsIDB4Q0NBNiwgMHhDQ0E3LCAweENDQUEsIDB4Q0NBRSwgMHhDQ0FGLAotICAgIDB4Q0NCMCwgMHhDQ0IxLCAweENDQjIsIDB4Q0NCMywgMHhDQ0I2LCAweENDQjcsIDB4Q0NCOSwgMHhDQ0JBLAotICAgIDB4Q0NCQiwgMHhDQ0JELCAweENDQkUsIDB4Q0NCRiwgMHhDQ0MwLCAweENDQzEsIDB4Q0NDMiwgMHhDQ0MzLAotICAgIDB4Q0NDNiwgMHhDQ0M4LCAweENDQ0EsIDB4Q0NDQiwgMHhDQ0NDLCAweENDQ0QsIDB4Q0NDRSwgMHhDQ0NGLAotICAgIDB4Q0NEMSwgMHhDQ0QyLCAweENDRDMsIDB4Q0NENSwgMHhDQ0Q2LCAweENDRDcsIDB4Q0NEOCwgMHhDQ0Q5LAotICAgIDB4Q0NEQSwgMHhDQ0RCLCAweENDREMsIDB4Q0NERCwgMHhDQ0RFLCAweENDREYsIDB4Q0NFMCwgMHhDQ0UxLAotICAgIDB4Q0NFMiwgMHhDQ0UzLCAweENDRTUsIDB4Q0NFNiwgMHhDQ0U3LCAweENDRTgsIDB4Q0NFOSwgMHhDQ0VBLAotICAgIDB4Q0NFQiwgMHhDQ0VELCAweENDRUUsIDB4Q0NFRiwgMHhDQ0YxLCAweENDRjIsIDB4Q0NGMywgMHhDQ0Y0LAotICAgIDB4Q0NGNSwgMHhDQ0Y2LCAweENDRjcsIDB4Q0NGOCwgMHhDQ0Y5LCAweENDRkEsIDB4Q0NGQiwgMHhDQ0ZDLAotICAgIDB4Q0NGRCwgMHhDQ0ZFLCAweENDRkYsIDB4Q0QwMCwgMHhDRDAyLCAweENEMDMsIDB4Q0QwNCwgMHhDRDA1LAotICAgIDB4Q0QwNiwgMHhDRDA3LCAweENEMEEsIDB4Q0QwQiwgMHhDRDBELCAweENEMEUsIDB4Q0QwRiwgMHhDRDExLAotICAgIDB4Q0QxMiwgMHhDRDEzLCAweENEMTQsIDB4Q0QxNSwgMHhDRDE2LCAweENEMTcsIDB4Q0QxQSwgMHhDRDFDLAotICAgIDB4Q0QxRSwgMHhDRDFGLCAweENEMjAsIDB4Q0QyMSwgMHhDRDIyLCAweENEMjMsIDB4Q0QyNSwgMHhDRDI2LAotICAgIDB4Q0QyNywgMHhDRDI5LCAweENEMkEsIDB4Q0QyQiwgMHhDRDJELCAweENEMkUsIDB4Q0QyRiwgMHhDRDMwLAotICAgIDB4Q0QzMSwgMHhDRDMyLCAweENEMzMsIDB4Q0QzNCwgMHhDRDM1LCAweENEMzYsIDB4Q0QzNywgMHhDRDM4LAotICAgIDB4Q0QzQSwgMHhDRDNCLCAweENEM0MsIDB4Q0QzRCwgMHhDRDNFLCAweENEM0YsIDB4Q0Q0MCwgMHhDRDQxLAotICAgIDB4Q0Q0MiwgMHhDRDQzLCAweENENDQsIDB4Q0Q0NSwgMHhDRDQ2LCAweENENDcsIDB4Q0Q0OCwgMHhDRDQ5LAotICAgIDB4Q0Q0QSwgMHhDRDRCLCAweENENEMsIDB4Q0Q0RCwgMHhDRDRFLCAweENENEYsIDB4Q0Q1MCwgMHhDRDUxLAotICAgIDB4Q0Q1MiwgMHhDRDUzLCAweENENTQsIDB4Q0Q1NSwgMHhDRDU2LCAweENENTcsIDB4Q0Q1OCwgMHhDRDU5LAotICAgIDB4Q0Q1QSwgMHhDRDVCLCAweENENUQsIDB4Q0Q1RSwgMHhDRDVGLCAweENENjEsIDB4Q0Q2MiwgMHhDRDYzLAotICAgIDB4Q0Q2NSwgMHhDRDY2LCAweENENjcsIDB4Q0Q2OCwgMHhDRDY5LCAweENENkEsIDB4Q0Q2QiwgMHhDRDZFLAotICAgIDB4Q0Q3MCwgMHhDRDcyLCAweENENzMsIDB4Q0Q3NCwgMHhDRDc1LCAweENENzYsIDB4Q0Q3NywgMHhDRDc5LAotICAgIDB4Q0Q3QSwgMHhDRDdCLCAweENEN0MsIDB4Q0Q3RCwgMHhDRDdFLCAweENEN0YsIDB4Q0Q4MCwgMHhDRDgxLAotICAgIDB4Q0Q4MiwgMHhDRDgzLCAweENEODQsIDB4Q0Q4NSwgMHhDRDg2LCAweENEODcsIDB4Q0Q4OSwgMHhDRDhBLAotICAgIDB4Q0Q4QiwgMHhDRDhDLCAweENEOEQsIDB4Q0Q4RSwgMHhDRDhGLCAweENEOTAsIDB4Q0Q5MSwgMHhDRDkyLAotICAgIDB4Q0Q5MywgMHhDRDk2LCAweENEOTcsIDB4Q0Q5OSwgMHhDRDlBLCAweENEOUIsIDB4Q0Q5RCwgMHhDRDlFLAotICAgIDB4Q0Q5RiwgMHhDREEwLCAweENEQTEsIDB4Q0RBMiwgMHhDREEzLCAweENEQTYsIDB4Q0RBOCwgMHhDREFBLAotICAgIDB4Q0RBQiwgMHhDREFDLCAweENEQUQsIDB4Q0RBRSwgMHhDREFGLCAweENEQjEsIDB4Q0RCMiwgMHhDREIzLAotICAgIDB4Q0RCNCwgMHhDREI1LCAweENEQjYsIDB4Q0RCNywgMHhDREI4LCAweENEQjksIDB4Q0RCQSwgMHhDREJCLAotICAgIDB4Q0RCQywgMHhDREJELCAweENEQkUsIDB4Q0RCRiwgMHhDREMwLCAweENEQzEsIDB4Q0RDMiwgMHhDREMzLAotICAgIDB4Q0RDNSwgMHhDREM2LCAweENEQzcsIDB4Q0RDOCwgMHhDREM5LCAweENEQ0EsIDB4Q0RDQiwgMHhDRENELAotICAgIDB4Q0RDRSwgMHhDRENGLCAweENERDEsIDB4Q0REMiwgMHhDREQzLCAweENERDQsIDB4Q0RENSwgMHhDREQ2LAotICAgIDB4Q0RENywgMHhDREQ4LCAweENERDksIDB4Q0REQSwgMHhDRERCLCAweENEREMsIDB4Q0RERCwgMHhDRERFLAotICAgIDB4Q0RERiwgMHhDREUwLCAweENERTEsIDB4Q0RFMiwgMHhDREUzLCAweENERTQsIDB4Q0RFNSwgMHhDREU2LAotICAgIDB4Q0RFNywgMHhDREU5LCAweENERUEsIDB4Q0RFQiwgMHhDREVELCAweENERUUsIDB4Q0RFRiwgMHhDREYxLAotICAgIDB4Q0RGMiwgMHhDREYzLCAweENERjQsIDB4Q0RGNSwgMHhDREY2LCAweENERjcsIDB4Q0RGQSwgMHhDREZDLAotICAgIDB4Q0RGRSwgMHhDREZGLCAweENFMDAsIDB4Q0UwMSwgMHhDRTAyLCAweENFMDMsIDB4Q0UwNSwgMHhDRTA2LAotICAgIDB4Q0UwNywgMHhDRTA5LCAweENFMEEsIDB4Q0UwQiwgMHhDRTBELCAweENFMEUsIDB4Q0UwRiwgMHhDRTEwLAotICAgIDB4Q0UxMSwgMHhDRTEyLCAweENFMTMsIDB4Q0UxNSwgMHhDRTE2LCAweENFMTcsIDB4Q0UxOCwgMHhDRTFBLAotICAgIDB4Q0UxQiwgMHhDRTFDLCAweENFMUQsIDB4Q0UxRSwgMHhDRTFGLCAweENFMjIsIDB4Q0UyMywgMHhDRTI1LAotICAgIDB4Q0UyNiwgMHhDRTI3LCAweENFMjksIDB4Q0UyQSwgMHhDRTJCLCAweENFMkMsIDB4Q0UyRCwgMHhDRTJFLAotICAgIDB4Q0UyRiwgMHhDRTMyLCAweENFMzQsIDB4Q0UzNiwgMHhDRTM3LCAweENFMzgsIDB4Q0UzOSwgMHhDRTNBLAotICAgIDB4Q0UzQiwgMHhDRTNDLCAweENFM0QsIDB4Q0UzRSwgMHhDRTNGLCAweENFNDAsIDB4Q0U0MSwgMHhDRTQyLAotICAgIDB4Q0U0MywgMHhDRTQ0LCAweENFNDUsIDB4Q0U0NiwgMHhDRTQ3LCAweENFNDgsIDB4Q0U0OSwgMHhDRTRBLAotICAgIDB4Q0U0QiwgMHhDRTRDLCAweENFNEQsIDB4Q0U0RSwgMHhDRTRGLCAweENFNTAsIDB4Q0U1MSwgMHhDRTUyLAotICAgIDB4Q0U1MywgMHhDRTU0LCAweENFNTUsIDB4Q0U1NiwgMHhDRTU3LCAweENFNUEsIDB4Q0U1QiwgMHhDRTVELAotICAgIDB4Q0U1RSwgMHhDRTYyLCAweENFNjMsIDB4Q0U2NCwgMHhDRTY1LCAweENFNjYsIDB4Q0U2NywgMHhDRTZBLAotICAgIDB4Q0U2QywgMHhDRTZFLCAweENFNkYsIDB4Q0U3MCwgMHhDRTcxLCAweENFNzIsIDB4Q0U3MywgMHhDRTc2LAotICAgIDB4Q0U3NywgMHhDRTc5LCAweENFN0EsIDB4Q0U3QiwgMHhDRTdELCAweENFN0UsIDB4Q0U3RiwgMHhDRTgwLAotICAgIDB4Q0U4MSwgMHhDRTgyLCAweENFODMsIDB4Q0U4NiwgMHhDRTg4LCAweENFOEEsIDB4Q0U4QiwgMHhDRThDLAotICAgIDB4Q0U4RCwgMHhDRThFLCAweENFOEYsIDB4Q0U5MiwgMHhDRTkzLCAweENFOTUsIDB4Q0U5NiwgMHhDRTk3LAotICAgIDB4Q0U5OSwgMHhDRTlBLCAweENFOUIsIDB4Q0U5QywgMHhDRTlELCAweENFOUUsIDB4Q0U5RiwgMHhDRUEyLAotICAgIDB4Q0VBNiwgMHhDRUE3LCAweENFQTgsIDB4Q0VBOSwgMHhDRUFBLCAweENFQUIsIDB4Q0VBRSwgMHhDRUFGLAotICAgIDB4Q0VCMCwgMHhDRUIxLCAweENFQjIsIDB4Q0VCMywgMHhDRUI0LCAweENFQjUsIDB4Q0VCNiwgMHhDRUI3LAotICAgIDB4Q0VCOCwgMHhDRUI5LCAweENFQkEsIDB4Q0VCQiwgMHhDRUJDLCAweENFQkQsIDB4Q0VCRSwgMHhDRUJGLAotICAgIDB4Q0VDMCwgMHhDRUMyLCAweENFQzMsIDB4Q0VDNCwgMHhDRUM1LCAweENFQzYsIDB4Q0VDNywgMHhDRUM4LAotICAgIDB4Q0VDOSwgMHhDRUNBLCAweENFQ0IsIDB4Q0VDQywgMHhDRUNELCAweENFQ0UsIDB4Q0VDRiwgMHhDRUQwLAotICAgIDB4Q0VEMSwgMHhDRUQyLCAweENFRDMsIDB4Q0VENCwgMHhDRUQ1LCAweENFRDYsIDB4Q0VENywgMHhDRUQ4LAotICAgIDB4Q0VEOSwgMHhDRURBLCAweENFREIsIDB4Q0VEQywgMHhDRURELCAweENFREUsIDB4Q0VERiwgMHhDRUUwLAotICAgIDB4Q0VFMSwgMHhDRUUyLCAweENFRTMsIDB4Q0VFNiwgMHhDRUU3LCAweENFRTksIDB4Q0VFQSwgMHhDRUVELAotICAgIDB4Q0VFRSwgMHhDRUVGLCAweENFRjAsIDB4Q0VGMSwgMHhDRUYyLCAweENFRjMsIDB4Q0VGNiwgMHhDRUZBLAotICAgIDB4Q0VGQiwgMHhDRUZDLCAweENFRkQsIDB4Q0VGRSwgMHhDRUZGLCAweENGMDIsIDB4Q0YwMywgMHhDRjA1LAotICAgIDB4Q0YwNiwgMHhDRjA3LCAweENGMDksIDB4Q0YwQSwgMHhDRjBCLCAweENGMEMsIDB4Q0YwRCwgMHhDRjBFLAotICAgIDB4Q0YwRiwgMHhDRjEyLCAweENGMTQsIDB4Q0YxNiwgMHhDRjE3LCAweENGMTgsIDB4Q0YxOSwgMHhDRjFBLAotICAgIDB4Q0YxQiwgMHhDRjFELCAweENGMUUsIDB4Q0YxRiwgMHhDRjIxLCAweENGMjIsIDB4Q0YyMywgMHhDRjI1LAotICAgIDB4Q0YyNiwgMHhDRjI3LCAweENGMjgsIDB4Q0YyOSwgMHhDRjJBLCAweENGMkIsIDB4Q0YyRSwgMHhDRjMyLAotICAgIDB4Q0YzMywgMHhDRjM0LCAweENGMzUsIDB4Q0YzNiwgMHhDRjM3LCAweENGMzksIDB4Q0YzQSwgMHhDRjNCLAotICAgIDB4Q0YzQywgMHhDRjNELCAweENGM0UsIDB4Q0YzRiwgMHhDRjQwLCAweENGNDEsIDB4Q0Y0MiwgMHhDRjQzLAotICAgIDB4Q0Y0NCwgMHhDRjQ1LCAweENGNDYsIDB4Q0Y0NywgMHhDRjQ4LCAweENGNDksIDB4Q0Y0QSwgMHhDRjRCLAotICAgIDB4Q0Y0QywgMHhDRjRELCAweENGNEUsIDB4Q0Y0RiwgMHhDRjUwLCAweENGNTEsIDB4Q0Y1MiwgMHhDRjUzLAotICAgIDB4Q0Y1NiwgMHhDRjU3LCAweENGNTksIDB4Q0Y1QSwgMHhDRjVCLCAweENGNUQsIDB4Q0Y1RSwgMHhDRjVGLAotICAgIDB4Q0Y2MCwgMHhDRjYxLCAweENGNjIsIDB4Q0Y2MywgMHhDRjY2LCAweENGNjgsIDB4Q0Y2QSwgMHhDRjZCLAotICAgIDB4Q0Y2QywgMHhDRjZELCAweENGNkUsIDB4Q0Y2RiwgMHhDRjcyLCAweENGNzMsIDB4Q0Y3NSwgMHhDRjc2LAotICAgIDB4Q0Y3NywgMHhDRjc5LCAweENGN0EsIDB4Q0Y3QiwgMHhDRjdDLCAweENGN0QsIDB4Q0Y3RSwgMHhDRjdGLAotICAgIDB4Q0Y4MSwgMHhDRjgyLCAweENGODMsIDB4Q0Y4NCwgMHhDRjg2LCAweENGODcsIDB4Q0Y4OCwgMHhDRjg5LAotICAgIDB4Q0Y4QSwgMHhDRjhCLCAweENGOEQsIDB4Q0Y4RSwgMHhDRjhGLCAweENGOTAsIDB4Q0Y5MSwgMHhDRjkyLAotICAgIDB4Q0Y5MywgMHhDRjk0LCAweENGOTUsIDB4Q0Y5NiwgMHhDRjk3LCAweENGOTgsIDB4Q0Y5OSwgMHhDRjlBLAotICAgIDB4Q0Y5QiwgMHhDRjlDLCAweENGOUQsIDB4Q0Y5RSwgMHhDRjlGLCAweENGQTAsIDB4Q0ZBMiwgMHhDRkEzLAotICAgIDB4Q0ZBNCwgMHhDRkE1LCAweENGQTYsIDB4Q0ZBNywgMHhDRkE5LCAweENGQUEsIDB4Q0ZBQiwgMHhDRkFDLAotICAgIDB4Q0ZBRCwgMHhDRkFFLCAweENGQUYsIDB4Q0ZCMSwgMHhDRkIyLCAweENGQjMsIDB4Q0ZCNCwgMHhDRkI1LAotICAgIDB4Q0ZCNiwgMHhDRkI3LCAweENGQjgsIDB4Q0ZCOSwgMHhDRkJBLCAweENGQkIsIDB4Q0ZCQywgMHhDRkJELAotICAgIDB4Q0ZCRSwgMHhDRkJGLCAweENGQzAsIDB4Q0ZDMSwgMHhDRkMyLCAweENGQzMsIDB4Q0ZDNSwgMHhDRkM2LAotICAgIDB4Q0ZDNywgMHhDRkM4LCAweENGQzksIDB4Q0ZDQSwgMHhDRkNCLCAweENGQ0MsIDB4Q0ZDRCwgMHhDRkNFLAotICAgIDB4Q0ZDRiwgMHhDRkQwLCAweENGRDEsIDB4Q0ZEMiwgMHhDRkQzLCAweENGRDQsIDB4Q0ZENSwgMHhDRkQ2LAotICAgIDB4Q0ZENywgMHhDRkQ4LCAweENGRDksIDB4Q0ZEQSwgMHhDRkRCLCAweENGREMsIDB4Q0ZERCwgMHhDRkRFLAotICAgIDB4Q0ZERiwgMHhDRkUyLCAweENGRTMsIDB4Q0ZFNSwgMHhDRkU2LCAweENGRTcsIDB4Q0ZFOSwgMHhDRkVBLAotICAgIDB4Q0ZFQiwgMHhDRkVDLCAweENGRUQsIDB4Q0ZFRSwgMHhDRkVGLCAweENGRjIsIDB4Q0ZGNCwgMHhDRkY2LAotICAgIDB4Q0ZGNywgMHhDRkY4LCAweENGRjksIDB4Q0ZGQSwgMHhDRkZCLCAweENGRkQsIDB4Q0ZGRSwgMHhDRkZGLAotICAgIDB4RDAwMSwgMHhEMDAyLCAweEQwMDMsIDB4RDAwNSwgMHhEMDA2LCAweEQwMDcsIDB4RDAwOCwgMHhEMDA5LAotICAgIDB4RDAwQSwgMHhEMDBCLCAweEQwMEMsIDB4RDAwRCwgMHhEMDBFLCAweEQwMEYsIDB4RDAxMCwgMHhEMDEyLAotICAgIDB4RDAxMywgMHhEMDE0LCAweEQwMTUsIDB4RDAxNiwgMHhEMDE3LCAweEQwMTksIDB4RDAxQSwgMHhEMDFCLAotICAgIDB4RDAxQywgMHhEMDFELCAweEQwMUUsIDB4RDAxRiwgMHhEMDIwLCAweEQwMjEsIDB4RDAyMiwgMHhEMDIzLAotICAgIDB4RDAyNCwgMHhEMDI1LCAweEQwMjYsIDB4RDAyNywgMHhEMDI4LCAweEQwMjksIDB4RDAyQSwgMHhEMDJCLAotICAgIDB4RDAyQywgMHhEMDJFLCAweEQwMkYsIDB4RDAzMCwgMHhEMDMxLCAweEQwMzIsIDB4RDAzMywgMHhEMDM2LAotICAgIDB4RDAzNywgMHhEMDM5LCAweEQwM0EsIDB4RDAzQiwgMHhEMDNELCAweEQwM0UsIDB4RDAzRiwgMHhEMDQwLAotICAgIDB4RDA0MSwgMHhEMDQyLCAweEQwNDMsIDB4RDA0NiwgMHhEMDQ4LCAweEQwNEEsIDB4RDA0QiwgMHhEMDRDLAotICAgIDB4RDA0RCwgMHhEMDRFLCAweEQwNEYsIDB4RDA1MSwgMHhEMDUyLCAweEQwNTMsIDB4RDA1NSwgMHhEMDU2LAotICAgIDB4RDA1NywgMHhEMDU5LCAweEQwNUEsIDB4RDA1QiwgMHhEMDVDLCAweEQwNUQsIDB4RDA1RSwgMHhEMDVGLAotICAgIDB4RDA2MSwgMHhEMDYyLCAweEQwNjMsIDB4RDA2NCwgMHhEMDY1LCAweEQwNjYsIDB4RDA2NywgMHhEMDY4LAotICAgIDB4RDA2OSwgMHhEMDZBLCAweEQwNkIsIDB4RDA2RSwgMHhEMDZGLCAweEQwNzEsIDB4RDA3MiwgMHhEMDczLAotICAgIDB4RDA3NSwgMHhEMDc2LCAweEQwNzcsIDB4RDA3OCwgMHhEMDc5LCAweEQwN0EsIDB4RDA3QiwgMHhEMDdFLAotICAgIDB4RDA3RiwgMHhEMDgwLCAweEQwODIsIDB4RDA4MywgMHhEMDg0LCAweEQwODUsIDB4RDA4NiwgMHhEMDg3LAotICAgIDB4RDA4OCwgMHhEMDg5LCAweEQwOEEsIDB4RDA4QiwgMHhEMDhDLCAweEQwOEQsIDB4RDA4RSwgMHhEMDhGLAotICAgIDB4RDA5MCwgMHhEMDkxLCAweEQwOTIsIDB4RDA5MywgMHhEMDk0LCAweEQwOTUsIDB4RDA5NiwgMHhEMDk3LAotICAgIDB4RDA5OCwgMHhEMDk5LCAweEQwOUEsIDB4RDA5QiwgMHhEMDlDLCAweEQwOUQsIDB4RDA5RSwgMHhEMDlGLAotICAgIDB4RDBBMCwgMHhEMEExLCAweEQwQTIsIDB4RDBBMywgMHhEMEE2LCAweEQwQTcsIDB4RDBBOSwgMHhEMEFBLAotICAgIDB4RDBBQiwgMHhEMEFELCAweEQwQUUsIDB4RDBBRiwgMHhEMEIwLCAweEQwQjEsIDB4RDBCMiwgMHhEMEIzLAotICAgIDB4RDBCNiwgMHhEMEI4LCAweEQwQkEsIDB4RDBCQiwgMHhEMEJDLCAweEQwQkQsIDB4RDBCRSwgMHhEMEJGLAotICAgIDB4RDBDMiwgMHhEMEMzLCAweEQwQzUsIDB4RDBDNiwgMHhEMEM3LCAweEQwQ0EsIDB4RDBDQiwgMHhEMENDLAotICAgIDB4RDBDRCwgMHhEMENFLCAweEQwQ0YsIDB4RDBEMiwgMHhEMEQ2LCAweEQwRDcsIDB4RDBEOCwgMHhEMEQ5LAotICAgIDB4RDBEQSwgMHhEMERCLCAweEQwREUsIDB4RDBERiwgMHhEMEUxLCAweEQwRTIsIDB4RDBFMywgMHhEMEU1LAotICAgIDB4RDBFNiwgMHhEMEU3LCAweEQwRTgsIDB4RDBFOSwgMHhEMEVBLCAweEQwRUIsIDB4RDBFRSwgMHhEMEYyLAotICAgIDB4RDBGMywgMHhEMEY0LCAweEQwRjUsIDB4RDBGNiwgMHhEMEY3LCAweEQwRjksIDB4RDBGQSwgMHhEMEZCLAotICAgIDB4RDBGQywgMHhEMEZELCAweEQwRkUsIDB4RDBGRiwgMHhEMTAwLCAweEQxMDEsIDB4RDEwMiwgMHhEMTAzLAotICAgIDB4RDEwNCwgMHhEMTA1LCAweEQxMDYsIDB4RDEwNywgMHhEMTA4LCAweEQxMDksIDB4RDEwQSwgMHhEMTBCLAotICAgIDB4RDEwQywgMHhEMTBFLCAweEQxMEYsIDB4RDExMCwgMHhEMTExLCAweEQxMTIsIDB4RDExMywgMHhEMTE0LAotICAgIDB4RDExNSwgMHhEMTE2LCAweEQxMTcsIDB4RDExOCwgMHhEMTE5LCAweEQxMUEsIDB4RDExQiwgMHhEMTFDLAotICAgIDB4RDExRCwgMHhEMTFFLCAweEQxMUYsIDB4RDEyMCwgMHhEMTIxLCAweEQxMjIsIDB4RDEyMywgMHhEMTI0LAotICAgIDB4RDEyNSwgMHhEMTI2LCAweEQxMjcsIDB4RDEyOCwgMHhEMTI5LCAweEQxMkEsIDB4RDEyQiwgMHhEMTJDLAotICAgIDB4RDEyRCwgMHhEMTJFLCAweEQxMkYsIDB4RDEzMiwgMHhEMTMzLCAweEQxMzUsIDB4RDEzNiwgMHhEMTM3LAotICAgIDB4RDEzOSwgMHhEMTNCLCAweEQxM0MsIDB4RDEzRCwgMHhEMTNFLCAweEQxM0YsIDB4RDE0MiwgMHhEMTQ2LAotICAgIDB4RDE0NywgMHhEMTQ4LCAweEQxNDksIDB4RDE0QSwgMHhEMTRCLCAweEQxNEUsIDB4RDE0RiwgMHhEMTUxLAotICAgIDB4RDE1MiwgMHhEMTUzLCAweEQxNTUsIDB4RDE1NiwgMHhEMTU3LCAweEQxNTgsIDB4RDE1OSwgMHhEMTVBLAotICAgIDB4RDE1QiwgMHhEMTVFLCAweEQxNjAsIDB4RDE2MiwgMHhEMTYzLCAweEQxNjQsIDB4RDE2NSwgMHhEMTY2LAotICAgIDB4RDE2NywgMHhEMTY5LCAweEQxNkEsIDB4RDE2QiwgMHhEMTZELCAweEQxNkUsIDB4RDE2RiwgMHhEMTcwLAotICAgIDB4RDE3MSwgMHhEMTcyLCAweEQxNzMsIDB4RDE3NCwgMHhEMTc1LCAweEQxNzYsIDB4RDE3NywgMHhEMTc4LAotICAgIDB4RDE3OSwgMHhEMTdBLCAweEQxN0IsIDB4RDE3RCwgMHhEMTdFLCAweEQxN0YsIDB4RDE4MCwgMHhEMTgxLAotICAgIDB4RDE4MiwgMHhEMTgzLCAweEQxODUsIDB4RDE4NiwgMHhEMTg3LCAweEQxODksIDB4RDE4QSwgMHhEMThCLAotICAgIDB4RDE4QywgMHhEMThELCAweEQxOEUsIDB4RDE4RiwgMHhEMTkwLCAweEQxOTEsIDB4RDE5MiwgMHhEMTkzLAotICAgIDB4RDE5NCwgMHhEMTk1LCAweEQxOTYsIDB4RDE5NywgMHhEMTk4LCAweEQxOTksIDB4RDE5QSwgMHhEMTlCLAotICAgIDB4RDE5QywgMHhEMTlELCAweEQxOUUsIDB4RDE5RiwgMHhEMUEyLCAweEQxQTMsIDB4RDFBNSwgMHhEMUE2LAotICAgIDB4RDFBNywgMHhEMUE5LCAweEQxQUEsIDB4RDFBQiwgMHhEMUFDLCAweEQxQUQsIDB4RDFBRSwgMHhEMUFGLAotICAgIDB4RDFCMiwgMHhEMUI0LCAweEQxQjYsIDB4RDFCNywgMHhEMUI4LCAweEQxQjksIDB4RDFCQiwgMHhEMUJELAotICAgIDB4RDFCRSwgMHhEMUJGLCAweEQxQzEsIDB4RDFDMiwgMHhEMUMzLCAweEQxQzQsIDB4RDFDNSwgMHhEMUM2LAotICAgIDB4RDFDNywgMHhEMUM4LCAweEQxQzksIDB4RDFDQSwgMHhEMUNCLCAweEQxQ0MsIDB4RDFDRCwgMHhEMUNFLAotICAgIDB4RDFDRiwgMHhEMUQwLCAweEQxRDEsIDB4RDFEMiwgMHhEMUQzLCAweEQxRDQsIDB4RDFENSwgMHhEMUQ2LAotICAgIDB4RDFENywgMHhEMUQ5LCAweEQxREEsIDB4RDFEQiwgMHhEMURDLCAweEQxREQsIDB4RDFERSwgMHhEMURGLAotICAgIDB4RDFFMCwgMHhEMUUxLCAweEQxRTIsIDB4RDFFMywgMHhEMUU0LCAweEQxRTUsIDB4RDFFNiwgMHhEMUU3LAotICAgIDB4RDFFOCwgMHhEMUU5LCAweEQxRUEsIDB4RDFFQiwgMHhEMUVDLCAweEQxRUQsIDB4RDFFRSwgMHhEMUVGLAotICAgIDB4RDFGMCwgMHhEMUYxLCAweEQxRjIsIDB4RDFGMywgMHhEMUY1LCAweEQxRjYsIDB4RDFGNywgMHhEMUY5LAotICAgIDB4RDFGQSwgMHhEMUZCLCAweEQxRkMsIDB4RDFGRCwgMHhEMUZFLCAweEQxRkYsIDB4RDIwMCwgMHhEMjAxLAotICAgIDB4RDIwMiwgMHhEMjAzLCAweEQyMDQsIDB4RDIwNSwgMHhEMjA2LCAweEQyMDgsIDB4RDIwQSwgMHhEMjBCLAotICAgIDB4RDIwQywgMHhEMjBELCAweEQyMEUsIDB4RDIwRiwgMHhEMjExLCAweEQyMTIsIDB4RDIxMywgMHhEMjE0LAotICAgIDB4RDIxNSwgMHhEMjE2LCAweEQyMTcsIDB4RDIxOCwgMHhEMjE5LCAweEQyMUEsIDB4RDIxQiwgMHhEMjFDLAotICAgIDB4RDIxRCwgMHhEMjFFLCAweEQyMUYsIDB4RDIyMCwgMHhEMjIxLCAweEQyMjIsIDB4RDIyMywgMHhEMjI0LAotICAgIDB4RDIyNSwgMHhEMjI2LCAweEQyMjcsIDB4RDIyOCwgMHhEMjI5LCAweEQyMkEsIDB4RDIyQiwgMHhEMjJFLAotICAgIDB4RDIyRiwgMHhEMjMxLCAweEQyMzIsIDB4RDIzMywgMHhEMjM1LCAweEQyMzYsIDB4RDIzNywgMHhEMjM4LAotICAgIDB4RDIzOSwgMHhEMjNBLCAweEQyM0IsIDB4RDIzRSwgMHhEMjQwLCAweEQyNDIsIDB4RDI0MywgMHhEMjQ0LAotICAgIDB4RDI0NSwgMHhEMjQ2LCAweEQyNDcsIDB4RDI0OSwgMHhEMjRBLCAweEQyNEIsIDB4RDI0QywgMHhEMjRELAotICAgIDB4RDI0RSwgMHhEMjRGLCAweEQyNTAsIDB4RDI1MSwgMHhEMjUyLCAweEQyNTMsIDB4RDI1NCwgMHhEMjU1LAotICAgIDB4RDI1NiwgMHhEMjU3LCAweEQyNTgsIDB4RDI1OSwgMHhEMjVBLCAweEQyNUIsIDB4RDI1RCwgMHhEMjVFLAotICAgIDB4RDI1RiwgMHhEMjYwLCAweEQyNjEsIDB4RDI2MiwgMHhEMjYzLCAweEQyNjUsIDB4RDI2NiwgMHhEMjY3LAotICAgIDB4RDI2OCwgMHhEMjY5LCAweEQyNkEsIDB4RDI2QiwgMHhEMjZDLCAweEQyNkQsIDB4RDI2RSwgMHhEMjZGLAotICAgIDB4RDI3MCwgMHhEMjcxLCAweEQyNzIsIDB4RDI3MywgMHhEMjc0LCAweEQyNzUsIDB4RDI3NiwgMHhEMjc3LAotICAgIDB4RDI3OCwgMHhEMjc5LCAweEQyN0EsIDB4RDI3QiwgMHhEMjdDLCAweEQyN0QsIDB4RDI3RSwgMHhEMjdGLAotICAgIDB4RDI4MiwgMHhEMjgzLCAweEQyODUsIDB4RDI4NiwgMHhEMjg3LCAweEQyODksIDB4RDI4QSwgMHhEMjhCLAotICAgIDB4RDI4QywgMHhEMjhELCAweEQyOEUsIDB4RDI4RiwgMHhEMjkyLCAweEQyOTMsIDB4RDI5NCwgMHhEMjk2LAotICAgIDB4RDI5NywgMHhEMjk4LCAweEQyOTksIDB4RDI5QSwgMHhEMjlCLCAweEQyOUQsIDB4RDI5RSwgMHhEMjlGLAotICAgIDB4RDJBMSwgMHhEMkEyLCAweEQyQTMsIDB4RDJBNSwgMHhEMkE2LCAweEQyQTcsIDB4RDJBOCwgMHhEMkE5LAotICAgIDB4RDJBQSwgMHhEMkFCLCAweEQyQUQsIDB4RDJBRSwgMHhEMkFGLCAweEQyQjAsIDB4RDJCMiwgMHhEMkIzLAotICAgIDB4RDJCNCwgMHhEMkI1LCAweEQyQjYsIDB4RDJCNywgMHhEMkJBLCAweEQyQkIsIDB4RDJCRCwgMHhEMkJFLAotICAgIDB4RDJDMSwgMHhEMkMzLCAweEQyQzQsIDB4RDJDNSwgMHhEMkM2LCAweEQyQzcsIDB4RDJDQSwgMHhEMkNDLAotICAgIDB4RDJDRCwgMHhEMkNFLCAweEQyQ0YsIDB4RDJEMCwgMHhEMkQxLCAweEQyRDIsIDB4RDJEMywgMHhEMkQ1LAotICAgIDB4RDJENiwgMHhEMkQ3LCAweEQyRDksIDB4RDJEQSwgMHhEMkRCLCAweEQyREQsIDB4RDJERSwgMHhEMkRGLAotICAgIDB4RDJFMCwgMHhEMkUxLCAweEQyRTIsIDB4RDJFMywgMHhEMkU2LCAweEQyRTcsIDB4RDJFOCwgMHhEMkU5LAotICAgIDB4RDJFQSwgMHhEMkVCLCAweEQyRUMsIDB4RDJFRCwgMHhEMkVFLCAweEQyRUYsIDB4RDJGMiwgMHhEMkYzLAotICAgIDB4RDJGNSwgMHhEMkY2LCAweEQyRjcsIDB4RDJGOSwgMHhEMkZBLCAweEQyRkIsIDB4RDJGQywgMHhEMkZELAotICAgIDB4RDJGRSwgMHhEMkZGLCAweEQzMDIsIDB4RDMwNCwgMHhEMzA2LCAweEQzMDcsIDB4RDMwOCwgMHhEMzA5LAotICAgIDB4RDMwQSwgMHhEMzBCLCAweEQzMEYsIDB4RDMxMSwgMHhEMzEyLCAweEQzMTMsIDB4RDMxNSwgMHhEMzE3LAotICAgIDB4RDMxOCwgMHhEMzE5LCAweEQzMUEsIDB4RDMxQiwgMHhEMzFFLCAweEQzMjIsIDB4RDMyMywgMHhEMzI0LAotICAgIDB4RDMyNiwgMHhEMzI3LCAweEQzMkEsIDB4RDMyQiwgMHhEMzJELCAweEQzMkUsIDB4RDMyRiwgMHhEMzMxLAotICAgIDB4RDMzMiwgMHhEMzMzLCAweEQzMzQsIDB4RDMzNSwgMHhEMzM2LCAweEQzMzcsIDB4RDMzQSwgMHhEMzNFLAotICAgIDB4RDMzRiwgMHhEMzQwLCAweEQzNDEsIDB4RDM0MiwgMHhEMzQzLCAweEQzNDYsIDB4RDM0NywgMHhEMzQ4LAotICAgIDB4RDM0OSwgMHhEMzRBLCAweEQzNEIsIDB4RDM0QywgMHhEMzRELCAweEQzNEUsIDB4RDM0RiwgMHhEMzUwLAotICAgIDB4RDM1MSwgMHhEMzUyLCAweEQzNTMsIDB4RDM1NCwgMHhEMzU1LCAweEQzNTYsIDB4RDM1NywgMHhEMzU4LAotICAgIDB4RDM1OSwgMHhEMzVBLCAweEQzNUIsIDB4RDM1QywgMHhEMzVELCAweEQzNUUsIDB4RDM1RiwgMHhEMzYwLAotICAgIDB4RDM2MSwgMHhEMzYyLCAweEQzNjMsIDB4RDM2NCwgMHhEMzY1LCAweEQzNjYsIDB4RDM2NywgMHhEMzY4LAotICAgIDB4RDM2OSwgMHhEMzZBLCAweEQzNkIsIDB4RDM2QywgMHhEMzZELCAweEQzNkUsIDB4RDM2RiwgMHhEMzcwLAotICAgIDB4RDM3MSwgMHhEMzcyLCAweEQzNzMsIDB4RDM3NCwgMHhEMzc1LCAweEQzNzYsIDB4RDM3NywgMHhEMzc4LAotICAgIDB4RDM3OSwgMHhEMzdBLCAweEQzN0IsIDB4RDM3RSwgMHhEMzdGLCAweEQzODEsIDB4RDM4MiwgMHhEMzgzLAotICAgIDB4RDM4NSwgMHhEMzg2LCAweEQzODcsIDB4RDM4OCwgMHhEMzg5LCAweEQzOEEsIDB4RDM4QiwgMHhEMzhFLAotICAgIDB4RDM5MiwgMHhEMzkzLCAweEQzOTQsIDB4RDM5NSwgMHhEMzk2LCAweEQzOTcsIDB4RDM5QSwgMHhEMzlCLAotICAgIDB4RDM5RCwgMHhEMzlFLCAweEQzOUYsIDB4RDNBMSwgMHhEM0EyLCAweEQzQTMsIDB4RDNBNCwgMHhEM0E1LAotICAgIDB4RDNBNiwgMHhEM0E3LCAweEQzQUEsIDB4RDNBQywgMHhEM0FFLCAweEQzQUYsIDB4RDNCMCwgMHhEM0IxLAotICAgIDB4RDNCMiwgMHhEM0IzLCAweEQzQjUsIDB4RDNCNiwgMHhEM0I3LCAweEQzQjksIDB4RDNCQSwgMHhEM0JCLAotICAgIDB4RDNCRCwgMHhEM0JFLCAweEQzQkYsIDB4RDNDMCwgMHhEM0MxLCAweEQzQzIsIDB4RDNDMywgMHhEM0M2LAotICAgIDB4RDNDNywgMHhEM0NBLCAweEQzQ0IsIDB4RDNDQywgMHhEM0NELCAweEQzQ0UsIDB4RDNDRiwgMHhEM0QxLAotICAgIDB4RDNEMiwgMHhEM0QzLCAweEQzRDQsIDB4RDNENSwgMHhEM0Q2LCAweEQzRDcsIDB4RDNEOSwgMHhEM0RBLAotICAgIDB4RDNEQiwgMHhEM0RDLCAweEQzREQsIDB4RDNERSwgMHhEM0RGLCAweEQzRTAsIDB4RDNFMiwgMHhEM0U0LAotICAgIDB4RDNFNSwgMHhEM0U2LCAweEQzRTcsIDB4RDNFOCwgMHhEM0U5LCAweEQzRUEsIDB4RDNFQiwgMHhEM0VFLAotICAgIDB4RDNFRiwgMHhEM0YxLCAweEQzRjIsIDB4RDNGMywgMHhEM0Y1LCAweEQzRjYsIDB4RDNGNywgMHhEM0Y4LAotICAgIDB4RDNGOSwgMHhEM0ZBLCAweEQzRkIsIDB4RDNGRSwgMHhENDAwLCAweEQ0MDIsIDB4RDQwMywgMHhENDA0LAotICAgIDB4RDQwNSwgMHhENDA2LCAweEQ0MDcsIDB4RDQwOSwgMHhENDBBLCAweEQ0MEIsIDB4RDQwQywgMHhENDBELAotICAgIDB4RDQwRSwgMHhENDBGLCAweEQ0MTAsIDB4RDQxMSwgMHhENDEyLCAweEQ0MTMsIDB4RDQxNCwgMHhENDE1LAotICAgIDB4RDQxNiwgMHhENDE3LCAweEQ0MTgsIDB4RDQxOSwgMHhENDFBLCAweEQ0MUIsIDB4RDQxQywgMHhENDFFLAotICAgIDB4RDQxRiwgMHhENDIwLCAweEQ0MjEsIDB4RDQyMiwgMHhENDIzLCAweEQ0MjQsIDB4RDQyNSwgMHhENDI2LAotICAgIDB4RDQyNywgMHhENDI4LCAweEQ0MjksIDB4RDQyQSwgMHhENDJCLCAweEQ0MkMsIDB4RDQyRCwgMHhENDJFLAotICAgIDB4RDQyRiwgMHhENDMwLCAweEQ0MzEsIDB4RDQzMiwgMHhENDMzLCAweEQ0MzQsIDB4RDQzNSwgMHhENDM2LAotICAgIDB4RDQzNywgMHhENDM4LCAweEQ0MzksIDB4RDQzQSwgMHhENDNCLCAweEQ0M0MsIDB4RDQzRCwgMHhENDNFLAotICAgIDB4RDQzRiwgMHhENDQxLCAweEQ0NDIsIDB4RDQ0MywgMHhENDQ1LCAweEQ0NDYsIDB4RDQ0NywgMHhENDQ4LAotICAgIDB4RDQ0OSwgMHhENDRBLCAweEQ0NEIsIDB4RDQ0QywgMHhENDRELCAweEQ0NEUsIDB4RDQ0RiwgMHhENDUwLAotICAgIDB4RDQ1MSwgMHhENDUyLCAweEQ0NTMsIDB4RDQ1NCwgMHhENDU1LCAweEQ0NTYsIDB4RDQ1NywgMHhENDU4LAotICAgIDB4RDQ1OSwgMHhENDVBLCAweEQ0NUIsIDB4RDQ1RCwgMHhENDVFLCAweEQ0NUYsIDB4RDQ2MSwgMHhENDYyLAotICAgIDB4RDQ2MywgMHhENDY1LCAweEQ0NjYsIDB4RDQ2NywgMHhENDY4LCAweEQ0NjksIDB4RDQ2QSwgMHhENDZCLAotICAgIDB4RDQ2QywgMHhENDZFLCAweEQ0NzAsIDB4RDQ3MSwgMHhENDcyLCAweEQ0NzMsIDB4RDQ3NCwgMHhENDc1LAotICAgIDB4RDQ3NiwgMHhENDc3LCAweEQ0N0EsIDB4RDQ3QiwgMHhENDdELCAweEQ0N0UsIDB4RDQ4MSwgMHhENDgzLAotICAgIDB4RDQ4NCwgMHhENDg1LCAweEQ0ODYsIDB4RDQ4NywgMHhENDhBLCAweEQ0OEMsIDB4RDQ4RSwgMHhENDhGLAotICAgIDB4RDQ5MCwgMHhENDkxLCAweEQ0OTIsIDB4RDQ5MywgMHhENDk1LCAweEQ0OTYsIDB4RDQ5NywgMHhENDk4LAotICAgIDB4RDQ5OSwgMHhENDlBLCAweEQ0OUIsIDB4RDQ5QywgMHhENDlELCAweEQ0OUUsIDB4RDQ5RiwgMHhENEEwLAotICAgIDB4RDRBMSwgMHhENEEyLCAweEQ0QTMsIDB4RDRBNCwgMHhENEE1LCAweEQ0QTYsIDB4RDRBNywgMHhENEE4LAotICAgIDB4RDRBQSwgMHhENEFCLCAweEQ0QUMsIDB4RDRBRCwgMHhENEFFLCAweEQ0QUYsIDB4RDRCMCwgMHhENEIxLAotICAgIDB4RDRCMiwgMHhENEIzLCAweEQ0QjQsIDB4RDRCNSwgMHhENEI2LCAweEQ0QjcsIDB4RDRCOCwgMHhENEI5LAotICAgIDB4RDRCQSwgMHhENEJCLCAweEQ0QkMsIDB4RDRCRCwgMHhENEJFLCAweEQ0QkYsIDB4RDRDMCwgMHhENEMxLAotICAgIDB4RDRDMiwgMHhENEMzLCAweEQ0QzQsIDB4RDRDNSwgMHhENEM2LCAweEQ0QzcsIDB4RDRDOCwgMHhENEM5LAotICAgIDB4RDRDQSwgMHhENENCLCAweEQ0Q0QsIDB4RDRDRSwgMHhENENGLCAweEQ0RDEsIDB4RDREMiwgMHhENEQzLAotICAgIDB4RDRENSwgMHhENEQ2LCAweEQ0RDcsIDB4RDREOCwgMHhENEQ5LCAweEQ0REEsIDB4RDREQiwgMHhENERELAotICAgIDB4RDRERSwgMHhENEUwLCAweEQ0RTEsIDB4RDRFMiwgMHhENEUzLCAweEQ0RTQsIDB4RDRFNSwgMHhENEU2LAotICAgIDB4RDRFNywgMHhENEU5LCAweEQ0RUEsIDB4RDRFQiwgMHhENEVELCAweEQ0RUUsIDB4RDRFRiwgMHhENEYxLAotICAgIDB4RDRGMiwgMHhENEYzLCAweEQ0RjQsIDB4RDRGNSwgMHhENEY2LCAweEQ0RjcsIDB4RDRGOSwgMHhENEZBLAotICAgIDB4RDRGQywgMHhENEZFLCAweEQ0RkYsIDB4RDUwMCwgMHhENTAxLCAweEQ1MDIsIDB4RDUwMywgMHhENTA1LAotICAgIDB4RDUwNiwgMHhENTA3LCAweEQ1MDksIDB4RDUwQSwgMHhENTBCLCAweEQ1MEQsIDB4RDUwRSwgMHhENTBGLAotICAgIDB4RDUxMCwgMHhENTExLCAweEQ1MTIsIDB4RDUxMywgMHhENTE2LCAweEQ1MTgsIDB4RDUxOSwgMHhENTFBLAotICAgIDB4RDUxQiwgMHhENTFDLCAweEQ1MUQsIDB4RDUxRSwgMHhENTFGLCAweEQ1MjAsIDB4RDUyMSwgMHhENTIyLAotICAgIDB4RDUyMywgMHhENTI0LCAweEQ1MjUsIDB4RDUyNiwgMHhENTI3LCAweEQ1MjgsIDB4RDUyOSwgMHhENTJBLAotICAgIDB4RDUyQiwgMHhENTJDLCAweEQ1MkQsIDB4RDUyRSwgMHhENTJGLCAweEQ1MzAsIDB4RDUzMSwgMHhENTMyLAotICAgIDB4RDUzMywgMHhENTM0LCAweEQ1MzUsIDB4RDUzNiwgMHhENTM3LCAweEQ1MzgsIDB4RDUzOSwgMHhENTNBLAotICAgIDB4RDUzQiwgMHhENTNFLCAweEQ1M0YsIDB4RDU0MSwgMHhENTQyLCAweEQ1NDMsIDB4RDU0NSwgMHhENTQ2LAotICAgIDB4RDU0NywgMHhENTQ4LCAweEQ1NDksIDB4RDU0QSwgMHhENTRCLCAweEQ1NEUsIDB4RDU1MCwgMHhENTUyLAotICAgIDB4RDU1MywgMHhENTU0LCAweEQ1NTUsIDB4RDU1NiwgMHhENTU3LCAweEQ1NUEsIDB4RDU1QiwgMHhENTVELAotICAgIDB4RDU1RSwgMHhENTVGLCAweEQ1NjEsIDB4RDU2MiwgMHhENTYzLCAweEQ1NjQsIDB4RDU2NiwgMHhENTY3LAotICAgIDB4RDU2QSwgMHhENTZDLCAweEQ1NkUsIDB4RDU2RiwgMHhENTcwLCAweEQ1NzEsIDB4RDU3MiwgMHhENTczLAotICAgIDB4RDU3NiwgMHhENTc3LCAweEQ1NzksIDB4RDU3QSwgMHhENTdCLCAweEQ1N0QsIDB4RDU3RSwgMHhENTdGLAotICAgIDB4RDU4MCwgMHhENTgxLCAweEQ1ODIsIDB4RDU4MywgMHhENTg2LCAweEQ1OEEsIDB4RDU4QiwgMHhENThDLAotICAgIDB4RDU4RCwgMHhENThFLCAweEQ1OEYsIDB4RDU5MSwgMHhENTkyLCAweEQ1OTMsIDB4RDU5NCwgMHhENTk1LAotICAgIDB4RDU5NiwgMHhENTk3LCAweEQ1OTgsIDB4RDU5OSwgMHhENTlBLCAweEQ1OUIsIDB4RDU5QywgMHhENTlELAotICAgIDB4RDU5RSwgMHhENTlGLCAweEQ1QTAsIDB4RDVBMSwgMHhENUEyLCAweEQ1QTMsIDB4RDVBNCwgMHhENUE2LAotICAgIDB4RDVBNywgMHhENUE4LCAweEQ1QTksIDB4RDVBQSwgMHhENUFCLCAweEQ1QUMsIDB4RDVBRCwgMHhENUFFLAotICAgIDB4RDVBRiwgMHhENUIwLCAweEQ1QjEsIDB4RDVCMiwgMHhENUIzLCAweEQ1QjQsIDB4RDVCNSwgMHhENUI2LAotICAgIDB4RDVCNywgMHhENUI4LCAweEQ1QjksIDB4RDVCQSwgMHhENUJCLCAweEQ1QkMsIDB4RDVCRCwgMHhENUJFLAotICAgIDB4RDVCRiwgMHhENUMwLCAweEQ1QzEsIDB4RDVDMiwgMHhENUMzLCAweEQ1QzQsIDB4RDVDNSwgMHhENUM2LAotICAgIDB4RDVDNywgMHhENUNBLCAweEQ1Q0IsIDB4RDVDRCwgMHhENUNFLCAweEQ1Q0YsIDB4RDVEMSwgMHhENUQzLAotICAgIDB4RDVENCwgMHhENUQ1LCAweEQ1RDYsIDB4RDVENywgMHhENURBLCAweEQ1REMsIDB4RDVERSwgMHhENURGLAotICAgIDB4RDVFMCwgMHhENUUxLCAweEQ1RTIsIDB4RDVFMywgMHhENUU2LCAweEQ1RTcsIDB4RDVFOSwgMHhENUVBLAotICAgIDB4RDVFQiwgMHhENUVELCAweEQ1RUUsIDB4RDVFRiwgMHhENUYwLCAweEQ1RjEsIDB4RDVGMiwgMHhENUYzLAotICAgIDB4RDVGNiwgMHhENUY4LCAweEQ1RkEsIDB4RDVGQiwgMHhENUZDLCAweEQ1RkQsIDB4RDVGRSwgMHhENUZGLAotICAgIDB4RDYwMiwgMHhENjAzLCAweEQ2MDUsIDB4RDYwNiwgMHhENjA3LCAweEQ2MDksIDB4RDYwQSwgMHhENjBCLAotICAgIDB4RDYwQywgMHhENjBELCAweEQ2MEUsIDB4RDYwRiwgMHhENjEyLCAweEQ2MTYsIDB4RDYxNywgMHhENjE4LAotICAgIDB4RDYxOSwgMHhENjFBLCAweEQ2MUIsIDB4RDYxRCwgMHhENjFFLCAweEQ2MUYsIDB4RDYyMSwgMHhENjIyLAotICAgIDB4RDYyMywgMHhENjI1LCAweEQ2MjYsIDB4RDYyNywgMHhENjI4LCAweEQ2MjksIDB4RDYyQSwgMHhENjJCLAotICAgIDB4RDYyQywgMHhENjJFLCAweEQ2MkYsIDB4RDYzMCwgMHhENjMxLCAweEQ2MzIsIDB4RDYzMywgMHhENjM0LAotICAgIDB4RDYzNSwgMHhENjM2LCAweEQ2MzcsIDB4RDYzQSwgMHhENjNCLCAweEQ2M0QsIDB4RDYzRSwgMHhENjNGLAotICAgIDB4RDY0MSwgMHhENjQyLCAweEQ2NDMsIDB4RDY0NCwgMHhENjQ2LCAweEQ2NDcsIDB4RDY0QSwgMHhENjRDLAotICAgIDB4RDY0RSwgMHhENjRGLCAweEQ2NTAsIDB4RDY1MiwgMHhENjUzLCAweEQ2NTYsIDB4RDY1NywgMHhENjU5LAotICAgIDB4RDY1QSwgMHhENjVCLCAweEQ2NUQsIDB4RDY1RSwgMHhENjVGLCAweEQ2NjAsIDB4RDY2MSwgMHhENjYyLAotICAgIDB4RDY2MywgMHhENjY0LCAweEQ2NjUsIDB4RDY2NiwgMHhENjY4LCAweEQ2NkEsIDB4RDY2QiwgMHhENjZDLAotICAgIDB4RDY2RCwgMHhENjZFLCAweEQ2NkYsIDB4RDY3MiwgMHhENjczLCAweEQ2NzUsIDB4RDY3NiwgMHhENjc3LAotICAgIDB4RDY3OCwgMHhENjc5LCAweEQ2N0EsIDB4RDY3QiwgMHhENjdDLCAweEQ2N0QsIDB4RDY3RSwgMHhENjdGLAotICAgIDB4RDY4MCwgMHhENjgxLCAweEQ2ODIsIDB4RDY4NCwgMHhENjg2LCAweEQ2ODcsIDB4RDY4OCwgMHhENjg5LAotICAgIDB4RDY4QSwgMHhENjhCLCAweEQ2OEUsIDB4RDY4RiwgMHhENjkxLCAweEQ2OTIsIDB4RDY5MywgMHhENjk1LAotICAgIDB4RDY5NiwgMHhENjk3LCAweEQ2OTgsIDB4RDY5OSwgMHhENjlBLCAweEQ2OUIsIDB4RDY5QywgMHhENjlFLAotICAgIDB4RDZBMCwgMHhENkEyLCAweEQ2QTMsIDB4RDZBNCwgMHhENkE1LCAweEQ2QTYsIDB4RDZBNywgMHhENkE5LAotICAgIDB4RDZBQSwgMHhENkFCLCAweEQ2QUQsIDB4RDZBRSwgMHhENkFGLCAweEQ2QjEsIDB4RDZCMiwgMHhENkIzLAotICAgIDB4RDZCNCwgMHhENkI1LCAweEQ2QjYsIDB4RDZCNywgMHhENkI4LCAweEQ2QkEsIDB4RDZCQywgMHhENkJELAotICAgIDB4RDZCRSwgMHhENkJGLCAweEQ2QzAsIDB4RDZDMSwgMHhENkMyLCAweEQ2QzMsIDB4RDZDNiwgMHhENkM3LAotICAgIDB4RDZDOSwgMHhENkNBLCAweEQ2Q0IsIDB4RDZDRCwgMHhENkNFLCAweEQ2Q0YsIDB4RDZEMCwgMHhENkQyLAotICAgIDB4RDZEMywgMHhENkQ1LCAweEQ2RDYsIDB4RDZEOCwgMHhENkRBLCAweEQ2REIsIDB4RDZEQywgMHhENkRELAotICAgIDB4RDZERSwgMHhENkRGLCAweEQ2RTEsIDB4RDZFMiwgMHhENkUzLCAweEQ2RTUsIDB4RDZFNiwgMHhENkU3LAotICAgIDB4RDZFOSwgMHhENkVBLCAweEQ2RUIsIDB4RDZFQywgMHhENkVELCAweEQ2RUUsIDB4RDZFRiwgMHhENkYxLAotICAgIDB4RDZGMiwgMHhENkYzLCAweEQ2RjQsIDB4RDZGNiwgMHhENkY3LCAweEQ2RjgsIDB4RDZGOSwgMHhENkZBLAotICAgIDB4RDZGQiwgMHhENkZFLCAweEQ2RkYsIDB4RDcwMSwgMHhENzAyLCAweEQ3MDMsIDB4RDcwNSwgMHhENzA2LAotICAgIDB4RDcwNywgMHhENzA4LCAweEQ3MDksIDB4RDcwQSwgMHhENzBCLCAweEQ3MEMsIDB4RDcwRCwgMHhENzBFLAotICAgIDB4RDcwRiwgMHhENzEwLCAweEQ3MTIsIDB4RDcxMywgMHhENzE0LCAweEQ3MTUsIDB4RDcxNiwgMHhENzE3LAotICAgIDB4RDcxQSwgMHhENzFCLCAweEQ3MUQsIDB4RDcxRSwgMHhENzFGLCAweEQ3MjEsIDB4RDcyMiwgMHhENzIzLAotICAgIDB4RDcyNCwgMHhENzI1LCAweEQ3MjYsIDB4RDcyNywgMHhENzJBLCAweEQ3MkMsIDB4RDcyRSwgMHhENzJGLAotICAgIDB4RDczMCwgMHhENzMxLCAweEQ3MzIsIDB4RDczMywgMHhENzM2LCAweEQ3MzcsIDB4RDczOSwgMHhENzNBLAotICAgIDB4RDczQiwgMHhENzNELCAweEQ3M0UsIDB4RDczRiwgMHhENzQwLCAweEQ3NDEsIDB4RDc0MiwgMHhENzQzLAotICAgIDB4RDc0NSwgMHhENzQ2LCAweEQ3NDgsIDB4RDc0QSwgMHhENzRCLCAweEQ3NEMsIDB4RDc0RCwgMHhENzRFLAotICAgIDB4RDc0RiwgMHhENzUyLCAweEQ3NTMsIDB4RDc1NSwgMHhENzVBLCAweEQ3NUIsIDB4RDc1QywgMHhENzVELAotICAgIDB4RDc1RSwgMHhENzVGLCAweEQ3NjIsIDB4RDc2NCwgMHhENzY2LCAweEQ3NjcsIDB4RDc2OCwgMHhENzZBLAotICAgIDB4RDc2QiwgMHhENzZELCAweEQ3NkUsIDB4RDc2RiwgMHhENzcxLCAweEQ3NzIsIDB4RDc3MywgMHhENzc1LAotICAgIDB4RDc3NiwgMHhENzc3LCAweEQ3NzgsIDB4RDc3OSwgMHhENzdBLCAweEQ3N0IsIDB4RDc3RSwgMHhENzdGLAotICAgIDB4RDc4MCwgMHhENzgyLCAweEQ3ODMsIDB4RDc4NCwgMHhENzg1LCAweEQ3ODYsIDB4RDc4NywgMHhENzhBLAotICAgIDB4RDc4QiwgMHhENzhELCAweEQ3OEUsIDB4RDc4RiwgMHhENzkxLCAweEQ3OTIsIDB4RDc5MywgMHhENzk0LAotICAgIDB4RDc5NSwgMHhENzk2LCAweEQ3OTcsIDB4RDc5QSwgMHhENzlDLCAweEQ3OUUsIDB4RDc5RiwgMHhEN0EwLAotICAgIDB4RDdBMSwgMHhEN0EyLCAweEQ3QTMsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LAotICAgIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLAotICAgIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LAotICAgIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLAotICAgIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LAotICAgIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLAotICAgIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LAotICAgIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLAotICAgIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LAotICAgIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLAotICAgIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LAotICAgIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLAotICAgIDB4MDA3RCwgMHgwMDdFLCAweDIwQTksIDB4MjAxMCwgMHgwMEE5LCAweDIxMjIsIDB4MjJFRiwgMHgwMDIwLAotICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LAotICAgIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLAotICAgIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LAotICAgIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLAotICAgIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LAotICAgIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLAotICAgIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LAotICAgIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLAotICAgIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LAotICAgIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLAotICAgIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LAotICAgIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDIwM0UsIDB4MDA3RSwgMHgwMDVDLAorICAgIDB4RkZGRCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwKKyAgICAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LAorICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsCisgICAgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwKKyAgICAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LAorICAgIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsCisgICAgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwKKyAgICAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAorICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsCisgICAgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwgMHgyMEE5LCAweDIwMTAsIDB4MDBBOSwKKyAgICAweDIxMjIsIDB4MjJFRiwgMHgzMDAwLCAweDMwMDEsIDB4MzAwMiwgMHgwMEI3LCAweDIwMjUsIDB4MjAyNiwgMHgwMEE4LAorICAgIDB4MzAwMywgMHgyMDEzLCAweDIwMTQsIDB4MjAxNiwgMHhGRjNDLCAweDIyM0MsIDB4MjAxOCwgMHgyMDE5LCAweDIwMUMsCisgICAgMHgyMDFELCAweDMwMTQsIDB4MzAxNSwgMHgzMDA4LCAweDMwMDksIDB4MzAwQSwgMHgzMDBCLCAweDMwMEMsIDB4MzAwRCwKKyAgICAweDMwMEUsIDB4MzAwRiwgMHgzMDEwLCAweDMwMTEsIDB4MDBCMSwgMHgwMEQ3LCAweDAwRjcsIDB4MjI2MCwgMHgyMjY0LAorICAgIDB4MjI2NSwgMHgyMjFFLCAweDIyMzQsIDB4MDBCMCwgMHgyMDMyLCAweDIwMzMsIDB4MjEwMywgMHgyMTJCLCAweEZGRTAsCisgICAgMHhGRkUxLCAweEZGRTUsIDB4MjY0MiwgMHgyNjQwLCAweDIyMjAsIDB4MjJBNSwgMHgyMzEyLCAweDIyMDIsIDB4MjIwNywKKyAgICAweDIyNjEsIDB4MjI1MiwgMHgwMEE3LCAweDIwM0IsIDB4MjYwNiwgMHgyNjA1LCAweDI1Q0IsIDB4MjVDRiwgMHgyNUNFLAorICAgIDB4MjVDNywgMHgyNUM2LCAweDI1QTEsIDB4MjVBMCwgMHgyNUIzLCAweDI1QjIsIDB4MjVCRCwgMHgyNUJDLCAweDIxOTIsCisgICAgMHgyMTkwLCAweDIxOTEsIDB4MjE5MywgMHgyMTk0LCAweDMwMTMsIDB4MjI2QSwgMHgyMjZCLCAweDIyMUEsIDB4MjIzRCwKKyAgICAweDIyMUQsIDB4MjIzNSwgMHgyMjJCLCAweDIyMkMsIDB4MjIwOCwgMHgyMjBCLCAweDIyODYsIDB4MjI4NywgMHgyMjgyLAorICAgIDB4MjI4MywgMHgyMjJBLCAweDIyMjksIDB4MjIyNywgMHgyMjI4LCAweEZGRTIsIDB4MjFEMiwgMHgyMUQ0LCAweDIyMDAsCisgICAgMHgyMjAzLCAweDAwQjQsIDB4MDJEQywgMHgwMkM3LCAweDAyRDgsIDB4MDJERCwgMHgwMkRBLCAweDAyRDksIDB4MDBCOCwKKyAgICAweDAyREIsIDB4MDBBMSwgMHgwMEJGLCAweDIyMzYsIDB4MjIyRSwgMHgyMjExLCAweDIyMEYsIDB4MDBBNCwgMHgyMTA5LAorICAgIDB4MjAzMCwgMHgyNUMxLCAweDI1QzAsIDB4MjVCNywgMHgyNUI2LCAweDI2NjQsIDB4MjY2MCwgMHgyNjYxLCAweDI2NjUsCisgICAgMHgyNjY3LCAweDI2NjMsIDB4MjI5OSwgMHgyNUM4LCAweDI1QTMsIDB4MjVEMCwgMHgyNUQxLCAweDI1OTIsIDB4MjVBNCwKKyAgICAweDI1QTUsIDB4MjVBOCwgMHgyNUE3LCAweDI1QTYsIDB4MjVBOSwgMHgyNjY4LCAweDI2MEYsIDB4MjYwRSwgMHgyNjFDLAorICAgIDB4MjYxRSwgMHgwMEI2LCAweDIwMjAsIDB4MjAyMSwgMHgyMTk1LCAweDIxOTcsIDB4MjE5OSwgMHgyMTk2LCAweDIxOTgsCisgICAgMHgyNjZELCAweDI2NjksIDB4MjY2QSwgMHgyNjZDLCAweDMyN0YsIDB4MzIxQywgMHgyMTE2LCAweDMzQzcsIDB4MjEyMiwKKyAgICAweDMzQzIsIDB4MzNEOCwgMHgyMTIxLCAweEZGMDEsIDB4RkYwMiwgMHhGRjAzLCAweEZGMDQsIDB4RkYwNSwgMHhGRjA2LAorICAgIDB4RkYwNywgMHhGRjA4LCAweEZGMDksIDB4RkYwQSwgMHhGRjBCLCAweEZGMEMsIDB4RkYwRCwgMHhGRjBFLCAweEZGMEYsCisgICAgMHhGRjEwLCAweEZGMTEsIDB4RkYxMiwgMHhGRjEzLCAweEZGMTQsIDB4RkYxNSwgMHhGRjE2LCAweEZGMTcsIDB4RkYxOCwKKyAgICAweEZGMTksIDB4RkYxQSwgMHhGRjFCLCAweEZGMUMsIDB4RkYxRCwgMHhGRjFFLCAweEZGMUYsIDB4RkYyMCwgMHhGRjIxLAorICAgIDB4RkYyMiwgMHhGRjIzLCAweEZGMjQsIDB4RkYyNSwgMHhGRjI2LCAweEZGMjcsIDB4RkYyOCwgMHhGRjI5LCAweEZGMkEsCisgICAgMHhGRjJCLCAweEZGMkMsIDB4RkYyRCwgMHhGRjJFLCAweEZGMkYsIDB4RkYzMCwgMHhGRjMxLCAweEZGMzIsIDB4RkYzMywKKyAgICAweEZGMzQsIDB4RkYzNSwgMHhGRjM2LCAweEZGMzcsIDB4RkYzOCwgMHhGRjM5LCAweEZGM0EsIDB4RkYzQiwgMHhGRkU2LAorICAgIDB4RkYzRCwgMHhGRjNFLCAweEZGM0YsIDB4RkY0MCwgMHhGRjQxLCAweEZGNDIsIDB4RkY0MywgMHhGRjQ0LCAweEZGNDUsCisgICAgMHhGRjQ2LCAweEZGNDcsIDB4RkY0OCwgMHhGRjQ5LCAweEZGNEEsIDB4RkY0QiwgMHhGRjRDLCAweEZGNEQsIDB4RkY0RSwKKyAgICAweEZGNEYsIDB4RkY1MCwgMHhGRjUxLCAweEZGNTIsIDB4RkY1MywgMHhGRjU0LCAweEZGNTUsIDB4RkY1NiwgMHhGRjU3LAorICAgIDB4RkY1OCwgMHhGRjU5LCAweEZGNUEsIDB4RkY1QiwgMHhGRjVDLCAweEZGNUQsIDB4RkZFMywgMHgzMTMxLCAweDMxMzIsCisgICAgMHgzMTMzLCAweDMxMzQsIDB4MzEzNSwgMHgzMTM2LCAweDMxMzcsIDB4MzEzOCwgMHgzMTM5LCAweDMxM0EsIDB4MzEzQiwKKyAgICAweDMxM0MsIDB4MzEzRCwgMHgzMTNFLCAweDMxM0YsIDB4MzE0MCwgMHgzMTQxLCAweDMxNDIsIDB4MzE0MywgMHgzMTQ0LAorICAgIDB4MzE0NSwgMHgzMTQ2LCAweDMxNDcsIDB4MzE0OCwgMHgzMTQ5LCAweDMxNEEsIDB4MzE0QiwgMHgzMTRDLCAweDMxNEQsCisgICAgMHgzMTRFLCAweDMxNEYsIDB4MzE1MCwgMHgzMTUxLCAweDMxNTIsIDB4MzE1MywgMHgzMTU0LCAweDMxNTUsIDB4MzE1NiwKKyAgICAweDMxNTcsIDB4MzE1OCwgMHgzMTU5LCAweDMxNUEsIDB4MzE1QiwgMHgzMTVDLCAweDMxNUQsIDB4MzE1RSwgMHgzMTVGLAorICAgIDB4MzE2MCwgMHgzMTYxLCAweDMxNjIsIDB4MzE2MywgMHgzMTY1LCAweDMxNjYsIDB4MzE2NywgMHgzMTY4LCAweDMxNjksCisgICAgMHgzMTZBLCAweDMxNkIsIDB4MzE2QywgMHgzMTZELCAweDMxNkUsIDB4MzE2RiwgMHgzMTcwLCAweDMxNzEsIDB4MzE3MiwKKyAgICAweDMxNzMsIDB4MzE3NCwgMHgzMTc1LCAweDMxNzYsIDB4MzE3NywgMHgzMTc4LCAweDMxNzksIDB4MzE3QSwgMHgzMTdCLAorICAgIDB4MzE3QywgMHgzMTdELCAweDMxN0UsIDB4MzE3RiwgMHgzMTgwLCAweDMxODEsIDB4MzE4MiwgMHgzMTgzLCAweDMxODQsCisgICAgMHgzMTg1LCAweDMxODYsIDB4MzE4NywgMHgzMTg4LCAweDMxODksIDB4MzE4QSwgMHgzMThCLCAweDMxOEMsIDB4MzE4RCwKKyAgICAweDMxOEUsIDB4MjE3MCwgMHgyMTcxLCAweDIxNzIsIDB4MjE3MywgMHgyMTc0LCAweDIxNzUsIDB4MjE3NiwgMHgyMTc3LAorICAgIDB4MjE3OCwgMHgyMTc5LCAweDIxNjAsIDB4MjE2MSwgMHgyMTYyLCAweDIxNjMsIDB4MjE2NCwgMHgyMTY1LCAweDIxNjYsCisgICAgMHgyMTY3LCAweDIxNjgsIDB4MjE2OSwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywgMHgwMzk0LCAweDAzOTUsIDB4MDM5NiwKKyAgICAweDAzOTcsIDB4MDM5OCwgMHgwMzk5LCAweDAzOUEsIDB4MDM5QiwgMHgwMzlDLCAweDAzOUQsIDB4MDM5RSwgMHgwMzlGLAorICAgIDB4MDNBMCwgMHgwM0ExLCAweDAzQTMsIDB4MDNBNCwgMHgwM0E1LCAweDAzQTYsIDB4MDNBNywgMHgwM0E4LCAweDAzQTksCisgICAgMHgwM0IxLCAweDAzQjIsIDB4MDNCMywgMHgwM0I0LCAweDAzQjUsIDB4MDNCNiwgMHgwM0I3LCAweDAzQjgsIDB4MDNCOSwKKyAgICAweDAzQkEsIDB4MDNCQiwgMHgwM0JDLCAweDAzQkQsIDB4MDNCRSwgMHgwM0JGLCAweDAzQzAsIDB4MDNDMSwgMHgwM0MzLAorICAgIDB4MDNDNCwgMHgwM0M1LCAweDAzQzYsIDB4MDNDNywgMHgwM0M4LCAweDAzQzksIDB4MjUwMCwgMHgyNTAyLCAweDI1MEMsCisgICAgMHgyNTEwLCAweDI1MTgsIDB4MjUxNCwgMHgyNTFDLCAweDI1MkMsIDB4MjUyNCwgMHgyNTM0LCAweDI1M0MsIDB4MjUwMSwKKyAgICAweDI1MDMsIDB4MjUwRiwgMHgyNTEzLCAweDI1MUIsIDB4MjUxNywgMHgyNTIzLCAweDI1MzMsIDB4MjUyQiwgMHgyNTNCLAorICAgIDB4MjU0QiwgMHgyNTIwLCAweDI1MkYsIDB4MjUyOCwgMHgyNTM3LCAweDI1M0YsIDB4MjUxRCwgMHgyNTMwLCAweDI1MjUsCisgICAgMHgyNTM4LCAweDI1NDIsIDB4MjUxMiwgMHgyNTExLCAweDI1MUEsIDB4MjUxOSwgMHgyNTE2LCAweDI1MTUsIDB4MjUwRSwKKyAgICAweDI1MEQsIDB4MjUxRSwgMHgyNTFGLCAweDI1MjEsIDB4MjUyMiwgMHgyNTI2LCAweDI1MjcsIDB4MjUyOSwgMHgyNTJBLAorICAgIDB4MjUyRCwgMHgyNTJFLCAweDI1MzEsIDB4MjUzMiwgMHgyNTM1LCAweDI1MzYsIDB4MjUzOSwgMHgyNTNBLCAweDI1M0QsCisgICAgMHgyNTNFLCAweDI1NDAsIDB4MjU0MSwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwgMHgyNTQ2LCAweDI1NDcsIDB4MjU0OCwKKyAgICAweDI1NDksIDB4MjU0QSwgMHgzMzk1LCAweDMzOTYsIDB4MzM5NywgMHgyMTEzLCAweDMzOTgsIDB4MzNDNCwgMHgzM0EzLAorICAgIDB4MzNBNCwgMHgzM0E1LCAweDMzQTYsIDB4MzM5OSwgMHgzMzlBLCAweDMzOUIsIDB4MzM5QywgMHgzMzlELCAweDMzOUUsCisgICAgMHgzMzlGLCAweDMzQTAsIDB4MzNBMSwgMHgzM0EyLCAweDMzQ0EsIDB4MzM4RCwgMHgzMzhFLCAweDMzOEYsIDB4MzNDRiwKKyAgICAweDMzODgsIDB4MzM4OSwgMHgzM0M4LCAweDMzQTcsIDB4MzNBOCwgMHgzM0IwLCAweDMzQjEsIDB4MzNCMiwgMHgzM0IzLAorICAgIDB4MzNCNCwgMHgzM0I1LCAweDMzQjYsIDB4MzNCNywgMHgzM0I4LCAweDMzQjksIDB4MzM4MCwgMHgzMzgxLCAweDMzODIsCisgICAgMHgzMzgzLCAweDMzODQsIDB4MzNCQSwgMHgzM0JCLCAweDMzQkMsIDB4MzNCRCwgMHgzM0JFLCAweDMzQkYsIDB4MzM5MCwKKyAgICAweDMzOTEsIDB4MzM5MiwgMHgzMzkzLCAweDMzOTQsIDB4MjEyNiwgMHgzM0MwLCAweDMzQzEsIDB4MzM4QSwgMHgzMzhCLAorICAgIDB4MzM4QywgMHgzM0Q2LCAweDMzQzUsIDB4MzNBRCwgMHgzM0FFLCAweDMzQUYsIDB4MzNEQiwgMHgzM0E5LCAweDMzQUEsCisgICAgMHgzM0FCLCAweDMzQUMsIDB4MzNERCwgMHgzM0QwLCAweDMzRDMsIDB4MzNDMywgMHgzM0M5LCAweDMzREMsIDB4MzNDNiwKKyAgICAweDAwQzYsIDB4MDBEMCwgMHgwMEFBLCAweDAxMjYsIDB4MDEzMiwgMHgwMTNGLCAweDAxNDEsIDB4MDBEOCwgMHgwMTUyLAorICAgIDB4MDBCQSwgMHgwMERFLCAweDAxNjYsIDB4MDE0QSwgMHgzMjYwLCAweDMyNjEsIDB4MzI2MiwgMHgzMjYzLCAweDMyNjQsCisgICAgMHgzMjY1LCAweDMyNjYsIDB4MzI2NywgMHgzMjY4LCAweDMyNjksIDB4MzI2QSwgMHgzMjZCLCAweDMyNkMsIDB4MzI2RCwKKyAgICAweDMyNkUsIDB4MzI2RiwgMHgzMjcwLCAweDMyNzEsIDB4MzI3MiwgMHgzMjczLCAweDMyNzQsIDB4MzI3NSwgMHgzMjc2LAorICAgIDB4MzI3NywgMHgzMjc4LCAweDMyNzksIDB4MzI3QSwgMHgzMjdCLCAweDI0RDAsIDB4MjREMSwgMHgyNEQyLCAweDI0RDMsCisgICAgMHgyNEQ0LCAweDI0RDUsIDB4MjRENiwgMHgyNEQ3LCAweDI0RDgsIDB4MjREOSwgMHgyNERBLCAweDI0REIsIDB4MjREQywKKyAgICAweDI0REQsIDB4MjRERSwgMHgyNERGLCAweDI0RTAsIDB4MjRFMSwgMHgyNEUyLCAweDI0RTMsIDB4MjRFNCwgMHgyNEU1LAorICAgIDB4MjRFNiwgMHgyNEU3LCAweDI0RTgsIDB4MjRFOSwgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLCAweDI0NjQsCisgICAgMHgyNDY1LCAweDI0NjYsIDB4MjQ2NywgMHgyNDY4LCAweDI0NjksIDB4MjQ2QSwgMHgyNDZCLCAweDI0NkMsIDB4MjQ2RCwKKyAgICAweDI0NkUsIDB4MDBCRCwgMHgyMTUzLCAweDIxNTQsIDB4MDBCQywgMHgwMEJFLCAweDIxNUIsIDB4MjE1QywgMHgyMTVELAorICAgIDB4MjE1RSwgMHgwMEU2LCAweDAxMTEsIDB4MDBGMCwgMHgwMTI3LCAweDAxMzEsIDB4MDEzMywgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTQyLCAweDAwRjgsIDB4MDE1MywgMHgwMERGLCAweDAwRkUsIDB4MDE2NywgMHgwMTRCLCAweDAxNDksIDB4MzIwMCwKKyAgICAweDMyMDEsIDB4MzIwMiwgMHgzMjAzLCAweDMyMDQsIDB4MzIwNSwgMHgzMjA2LCAweDMyMDcsIDB4MzIwOCwgMHgzMjA5LAorICAgIDB4MzIwQSwgMHgzMjBCLCAweDMyMEMsIDB4MzIwRCwgMHgzMjBFLCAweDMyMEYsIDB4MzIxMCwgMHgzMjExLCAweDMyMTIsCisgICAgMHgzMjEzLCAweDMyMTQsIDB4MzIxNSwgMHgzMjE2LCAweDMyMTcsIDB4MzIxOCwgMHgzMjE5LCAweDMyMUEsIDB4MzIxQiwKKyAgICAweDI0OUMsIDB4MjQ5RCwgMHgyNDlFLCAweDI0OUYsIDB4MjRBMCwgMHgyNEExLCAweDI0QTIsIDB4MjRBMywgMHgyNEE0LAorICAgIDB4MjRBNSwgMHgyNEE2LCAweDI0QTcsIDB4MjRBOCwgMHgyNEE5LCAweDI0QUEsIDB4MjRBQiwgMHgyNEFDLCAweDI0QUQsCisgICAgMHgyNEFFLCAweDI0QUYsIDB4MjRCMCwgMHgyNEIxLCAweDI0QjIsIDB4MjRCMywgMHgyNEI0LCAweDI0QjUsIDB4MjQ3NCwKKyAgICAweDI0NzUsIDB4MjQ3NiwgMHgyNDc3LCAweDI0NzgsIDB4MjQ3OSwgMHgyNDdBLCAweDI0N0IsIDB4MjQ3QywgMHgyNDdELAorICAgIDB4MjQ3RSwgMHgyNDdGLCAweDI0ODAsIDB4MjQ4MSwgMHgyNDgyLCAweDAwQjksIDB4MDBCMiwgMHgwMEIzLCAweDIwNzQsCisgICAgMHgyMDdGLCAweDIwODEsIDB4MjA4MiwgMHgyMDgzLCAweDIwODQsIDB4MzA0MSwgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwKKyAgICAweDMwNDUsIDB4MzA0NiwgMHgzMDQ3LCAweDMwNDgsIDB4MzA0OSwgMHgzMDRBLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELAorICAgIDB4MzA0RSwgMHgzMDRGLCAweDMwNTAsIDB4MzA1MSwgMHgzMDUyLCAweDMwNTMsIDB4MzA1NCwgMHgzMDU1LCAweDMwNTYsCisgICAgMHgzMDU3LCAweDMwNTgsIDB4MzA1OSwgMHgzMDVBLCAweDMwNUIsIDB4MzA1QywgMHgzMDVELCAweDMwNUUsIDB4MzA1RiwKKyAgICAweDMwNjAsIDB4MzA2MSwgMHgzMDYyLCAweDMwNjMsIDB4MzA2NCwgMHgzMDY1LCAweDMwNjYsIDB4MzA2NywgMHgzMDY4LAorICAgIDB4MzA2OSwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcwLCAweDMwNzEsCisgICAgMHgzMDcyLCAweDMwNzMsIDB4MzA3NCwgMHgzMDc1LCAweDMwNzYsIDB4MzA3NywgMHgzMDc4LCAweDMwNzksIDB4MzA3QSwKKyAgICAweDMwN0IsIDB4MzA3QywgMHgzMDdELCAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDgzLAorICAgIDB4MzA4NCwgMHgzMDg1LCAweDMwODYsIDB4MzA4NywgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsCisgICAgMHgzMDhELCAweDMwOEUsIDB4MzA4RiwgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLCAweDMwQTEsIDB4MzBBMiwKKyAgICAweDMwQTMsIDB4MzBBNCwgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywgMHgzMEE4LCAweDMwQTksIDB4MzBBQSwgMHgzMEFCLAorICAgIDB4MzBBQywgMHgzMEFELCAweDMwQUUsIDB4MzBBRiwgMHgzMEIwLCAweDMwQjEsIDB4MzBCMiwgMHgzMEIzLCAweDMwQjQsCisgICAgMHgzMEI1LCAweDMwQjYsIDB4MzBCNywgMHgzMEI4LCAweDMwQjksIDB4MzBCQSwgMHgzMEJCLCAweDMwQkMsIDB4MzBCRCwKKyAgICAweDMwQkUsIDB4MzBCRiwgMHgzMEMwLCAweDMwQzEsIDB4MzBDMiwgMHgzMEMzLCAweDMwQzQsIDB4MzBDNSwgMHgzMEM2LAorICAgIDB4MzBDNywgMHgzMEM4LCAweDMwQzksIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsCisgICAgMHgzMEQwLCAweDMwRDEsIDB4MzBEMiwgMHgzMEQzLCAweDMwRDQsIDB4MzBENSwgMHgzMEQ2LCAweDMwRDcsIDB4MzBEOCwKKyAgICAweDMwRDksIDB4MzBEQSwgMHgzMERCLCAweDMwREMsIDB4MzBERCwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLAorICAgIDB4MzBFMiwgMHgzMEUzLCAweDMwRTQsIDB4MzBFNSwgMHgzMEU2LCAweDMwRTcsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsCisgICAgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVFLCAweDMwRUYsIDB4MzBGMCwgMHgzMEYxLCAweDMwRjIsIDB4MzBGMywKKyAgICAweDMwRjQsIDB4MzBGNSwgMHgzMEY2LCAweDA0MTAsIDB4MDQxMSwgMHgwNDEyLCAweDA0MTMsIDB4MDQxNCwgMHgwNDE1LAorICAgIDB4MDQwMSwgMHgwNDE2LCAweDA0MTcsIDB4MDQxOCwgMHgwNDE5LCAweDA0MUEsIDB4MDQxQiwgMHgwNDFDLCAweDA0MUQsCisgICAgMHgwNDFFLCAweDA0MUYsIDB4MDQyMCwgMHgwNDIxLCAweDA0MjIsIDB4MDQyMywgMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwKKyAgICAweDA0MjcsIDB4MDQyOCwgMHgwNDI5LCAweDA0MkEsIDB4MDQyQiwgMHgwNDJDLCAweDA0MkQsIDB4MDQyRSwgMHgwNDJGLAorICAgIDB4MDQzMCwgMHgwNDMxLCAweDA0MzIsIDB4MDQzMywgMHgwNDM0LCAweDA0MzUsIDB4MDQ1MSwgMHgwNDM2LCAweDA0MzcsCisgICAgMHgwNDM4LCAweDA0MzksIDB4MDQzQSwgMHgwNDNCLCAweDA0M0MsIDB4MDQzRCwgMHgwNDNFLCAweDA0M0YsIDB4MDQ0MCwKKyAgICAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsIDB4MDQ0OCwgMHgwNDQ5LAorICAgIDB4MDQ0QSwgMHgwNDRCLCAweDA0NEMsIDB4MDQ0RCwgMHgwNDRFLCAweDA0NEYsIDB4QUMwMCwgMHhBQzAxLCAweEFDMDQsCisgICAgMHhBQzA3LCAweEFDMDgsIDB4QUMwOSwgMHhBQzBBLCAweEFDMTAsIDB4QUMxMSwgMHhBQzEyLCAweEFDMTMsIDB4QUMxNCwKKyAgICAweEFDMTUsIDB4QUMxNiwgMHhBQzE3LCAweEFDMTksIDB4QUMxQSwgMHhBQzFCLCAweEFDMUMsIDB4QUMxRCwgMHhBQzIwLAorICAgIDB4QUMyNCwgMHhBQzJDLCAweEFDMkQsIDB4QUMyRiwgMHhBQzMwLCAweEFDMzEsIDB4QUMzOCwgMHhBQzM5LCAweEFDM0MsCisgICAgMHhBQzQwLCAweEFDNEIsIDB4QUM0RCwgMHhBQzU0LCAweEFDNTgsIDB4QUM1QywgMHhBQzcwLCAweEFDNzEsIDB4QUM3NCwKKyAgICAweEFDNzcsIDB4QUM3OCwgMHhBQzdBLCAweEFDODAsIDB4QUM4MSwgMHhBQzgzLCAweEFDODQsIDB4QUM4NSwgMHhBQzg2LAorICAgIDB4QUM4OSwgMHhBQzhBLCAweEFDOEIsIDB4QUM4QywgMHhBQzkwLCAweEFDOTQsIDB4QUM5QywgMHhBQzlELCAweEFDOUYsCisgICAgMHhBQ0EwLCAweEFDQTEsIDB4QUNBOCwgMHhBQ0E5LCAweEFDQUEsIDB4QUNBQywgMHhBQ0FGLCAweEFDQjAsIDB4QUNCOCwKKyAgICAweEFDQjksIDB4QUNCQiwgMHhBQ0JDLCAweEFDQkQsIDB4QUNDMSwgMHhBQ0M0LCAweEFDQzgsIDB4QUNDQywgMHhBQ0Q1LAorICAgIDB4QUNENywgMHhBQ0UwLCAweEFDRTEsIDB4QUNFNCwgMHhBQ0U3LCAweEFDRTgsIDB4QUNFQSwgMHhBQ0VDLCAweEFDRUYsCisgICAgMHhBQ0YwLCAweEFDRjEsIDB4QUNGMywgMHhBQ0Y1LCAweEFDRjYsIDB4QUNGQywgMHhBQ0ZELCAweEFEMDAsIDB4QUQwNCwKKyAgICAweEFEMDYsIDB4QUQwQywgMHhBRDBELCAweEFEMEYsIDB4QUQxMSwgMHhBRDE4LCAweEFEMUMsIDB4QUQyMCwgMHhBRDI5LAorICAgIDB4QUQyQywgMHhBRDJELCAweEFEMzQsIDB4QUQzNSwgMHhBRDM4LCAweEFEM0MsIDB4QUQ0NCwgMHhBRDQ1LCAweEFENDcsCisgICAgMHhBRDQ5LCAweEFENTAsIDB4QUQ1NCwgMHhBRDU4LCAweEFENjEsIDB4QUQ2MywgMHhBRDZDLCAweEFENkQsIDB4QUQ3MCwKKyAgICAweEFENzMsIDB4QUQ3NCwgMHhBRDc1LCAweEFENzYsIDB4QUQ3QiwgMHhBRDdDLCAweEFEN0QsIDB4QUQ3RiwgMHhBRDgxLAorICAgIDB4QUQ4MiwgMHhBRDg4LCAweEFEODksIDB4QUQ4QywgMHhBRDkwLCAweEFEOUMsIDB4QUQ5RCwgMHhBREE0LCAweEFEQjcsCisgICAgMHhBREMwLCAweEFEQzEsIDB4QURDNCwgMHhBREM4LCAweEFERDAsIDB4QUREMSwgMHhBREQzLCAweEFEREMsIDB4QURFMCwKKyAgICAweEFERTQsIDB4QURGOCwgMHhBREY5LCAweEFERkMsIDB4QURGRiwgMHhBRTAwLCAweEFFMDEsIDB4QUUwOCwgMHhBRTA5LAorICAgIDB4QUUwQiwgMHhBRTBELCAweEFFMTQsIDB4QUUzMCwgMHhBRTMxLCAweEFFMzQsIDB4QUUzNywgMHhBRTM4LCAweEFFM0EsCisgICAgMHhBRTQwLCAweEFFNDEsIDB4QUU0MywgMHhBRTQ1LCAweEFFNDYsIDB4QUU0QSwgMHhBRTRDLCAweEFFNEQsIDB4QUU0RSwKKyAgICAweEFFNTAsIDB4QUU1NCwgMHhBRTU2LCAweEFFNUMsIDB4QUU1RCwgMHhBRTVGLCAweEFFNjAsIDB4QUU2MSwgMHhBRTY1LAorICAgIDB4QUU2OCwgMHhBRTY5LCAweEFFNkMsIDB4QUU3MCwgMHhBRTc4LCAweEFFNzksIDB4QUU3QiwgMHhBRTdDLCAweEFFN0QsCisgICAgMHhBRTg0LCAweEFFODUsIDB4QUU4QywgMHhBRUJDLCAweEFFQkQsIDB4QUVCRSwgMHhBRUMwLCAweEFFQzQsIDB4QUVDQywKKyAgICAweEFFQ0QsIDB4QUVDRiwgMHhBRUQwLCAweEFFRDEsIDB4QUVEOCwgMHhBRUQ5LCAweEFFREMsIDB4QUVFOCwgMHhBRUVCLAorICAgIDB4QUVFRCwgMHhBRUY0LCAweEFFRjgsIDB4QUVGQywgMHhBRjA3LCAweEFGMDgsIDB4QUYwRCwgMHhBRjEwLCAweEFGMkMsCisgICAgMHhBRjJELCAweEFGMzAsIDB4QUYzMiwgMHhBRjM0LCAweEFGM0MsIDB4QUYzRCwgMHhBRjNGLCAweEFGNDEsIDB4QUY0MiwKKyAgICAweEFGNDMsIDB4QUY0OCwgMHhBRjQ5LCAweEFGNTAsIDB4QUY1QywgMHhBRjVELCAweEFGNjQsIDB4QUY2NSwgMHhBRjc5LAorICAgIDB4QUY4MCwgMHhBRjg0LCAweEFGODgsIDB4QUY5MCwgMHhBRjkxLCAweEFGOTUsIDB4QUY5QywgMHhBRkI4LCAweEFGQjksCisgICAgMHhBRkJDLCAweEFGQzAsIDB4QUZDNywgMHhBRkM4LCAweEFGQzksIDB4QUZDQiwgMHhBRkNELCAweEFGQ0UsIDB4QUZENCwKKyAgICAweEFGREMsIDB4QUZFOCwgMHhBRkU5LCAweEFGRjAsIDB4QUZGMSwgMHhBRkY0LCAweEFGRjgsIDB4QjAwMCwgMHhCMDAxLAorICAgIDB4QjAwNCwgMHhCMDBDLCAweEIwMTAsIDB4QjAxNCwgMHhCMDFDLCAweEIwMUQsIDB4QjAyOCwgMHhCMDQ0LCAweEIwNDUsCisgICAgMHhCMDQ4LCAweEIwNEEsIDB4QjA0QywgMHhCMDRFLCAweEIwNTMsIDB4QjA1NCwgMHhCMDU1LCAweEIwNTcsIDB4QjA1OSwKKyAgICAweEIwNUQsIDB4QjA3QywgMHhCMDdELCAweEIwODAsIDB4QjA4NCwgMHhCMDhDLCAweEIwOEQsIDB4QjA4RiwgMHhCMDkxLAorICAgIDB4QjA5OCwgMHhCMDk5LCAweEIwOUEsIDB4QjA5QywgMHhCMDlGLCAweEIwQTAsIDB4QjBBMSwgMHhCMEEyLCAweEIwQTgsCisgICAgMHhCMEE5LCAweEIwQUIsIDB4QjBBQywgMHhCMEFELCAweEIwQUUsIDB4QjBBRiwgMHhCMEIxLCAweEIwQjMsIDB4QjBCNCwKKyAgICAweEIwQjUsIDB4QjBCOCwgMHhCMEJDLCAweEIwQzQsIDB4QjBDNSwgMHhCMEM3LCAweEIwQzgsIDB4QjBDOSwgMHhCMEQwLAorICAgIDB4QjBEMSwgMHhCMEQ0LCAweEIwRDgsIDB4QjBFMCwgMHhCMEU1LCAweEIxMDgsIDB4QjEwOSwgMHhCMTBCLCAweEIxMEMsCisgICAgMHhCMTEwLCAweEIxMTIsIDB4QjExMywgMHhCMTE4LCAweEIxMTksIDB4QjExQiwgMHhCMTFDLCAweEIxMUQsIDB4QjEyMywKKyAgICAweEIxMjQsIDB4QjEyNSwgMHhCMTI4LCAweEIxMkMsIDB4QjEzNCwgMHhCMTM1LCAweEIxMzcsIDB4QjEzOCwgMHhCMTM5LAorICAgIDB4QjE0MCwgMHhCMTQxLCAweEIxNDQsIDB4QjE0OCwgMHhCMTUwLCAweEIxNTEsIDB4QjE1NCwgMHhCMTU1LCAweEIxNTgsCisgICAgMHhCMTVDLCAweEIxNjAsIDB4QjE3OCwgMHhCMTc5LCAweEIxN0MsIDB4QjE4MCwgMHhCMTgyLCAweEIxODgsIDB4QjE4OSwKKyAgICAweEIxOEIsIDB4QjE4RCwgMHhCMTkyLCAweEIxOTMsIDB4QjE5NCwgMHhCMTk4LCAweEIxOUMsIDB4QjFBOCwgMHhCMUNDLAorICAgIDB4QjFEMCwgMHhCMUQ0LCAweEIxREMsIDB4QjFERCwgMHhCMURGLCAweEIxRTgsIDB4QjFFOSwgMHhCMUVDLCAweEIxRjAsCisgICAgMHhCMUY5LCAweEIxRkIsIDB4QjFGRCwgMHhCMjA0LCAweEIyMDUsIDB4QjIwOCwgMHhCMjBCLCAweEIyMEMsIDB4QjIxNCwKKyAgICAweEIyMTUsIDB4QjIxNywgMHhCMjE5LCAweEIyMjAsIDB4QjIzNCwgMHhCMjNDLCAweEIyNTgsIDB4QjI1QywgMHhCMjYwLAorICAgIDB4QjI2OCwgMHhCMjY5LCAweEIyNzQsIDB4QjI3NSwgMHhCMjdDLCAweEIyODQsIDB4QjI4NSwgMHhCMjg5LCAweEIyOTAsCisgICAgMHhCMjkxLCAweEIyOTQsIDB4QjI5OCwgMHhCMjk5LCAweEIyOUEsIDB4QjJBMCwgMHhCMkExLCAweEIyQTMsIDB4QjJBNSwKKyAgICAweEIyQTYsIDB4QjJBQSwgMHhCMkFDLCAweEIyQjAsIDB4QjJCNCwgMHhCMkM4LCAweEIyQzksIDB4QjJDQywgMHhCMkQwLAorICAgIDB4QjJEMiwgMHhCMkQ4LCAweEIyRDksIDB4QjJEQiwgMHhCMkRELCAweEIyRTIsIDB4QjJFNCwgMHhCMkU1LCAweEIyRTYsCisgICAgMHhCMkU4LCAweEIyRUIsIDB4QjJFQywgMHhCMkVELCAweEIyRUUsIDB4QjJFRiwgMHhCMkYzLCAweEIyRjQsIDB4QjJGNSwKKyAgICAweEIyRjcsIDB4QjJGOCwgMHhCMkY5LCAweEIyRkEsIDB4QjJGQiwgMHhCMkZGLCAweEIzMDAsIDB4QjMwMSwgMHhCMzA0LAorICAgIDB4QjMwOCwgMHhCMzEwLCAweEIzMTEsIDB4QjMxMywgMHhCMzE0LCAweEIzMTUsIDB4QjMxQywgMHhCMzU0LCAweEIzNTUsCisgICAgMHhCMzU2LCAweEIzNTgsIDB4QjM1QiwgMHhCMzVDLCAweEIzNUUsIDB4QjM1RiwgMHhCMzY0LCAweEIzNjUsIDB4QjM2NywKKyAgICAweEIzNjksIDB4QjM2QiwgMHhCMzZFLCAweEIzNzAsIDB4QjM3MSwgMHhCMzc0LCAweEIzNzgsIDB4QjM4MCwgMHhCMzgxLAorICAgIDB4QjM4MywgMHhCMzg0LCAweEIzODUsIDB4QjM4QywgMHhCMzkwLCAweEIzOTQsIDB4QjNBMCwgMHhCM0ExLCAweEIzQTgsCisgICAgMHhCM0FDLCAweEIzQzQsIDB4QjNDNSwgMHhCM0M4LCAweEIzQ0IsIDB4QjNDQywgMHhCM0NFLCAweEIzRDAsIDB4QjNENCwKKyAgICAweEIzRDUsIDB4QjNENywgMHhCM0Q5LCAweEIzREIsIDB4QjNERCwgMHhCM0UwLCAweEIzRTQsIDB4QjNFOCwgMHhCM0ZDLAorICAgIDB4QjQxMCwgMHhCNDE4LCAweEI0MUMsIDB4QjQyMCwgMHhCNDI4LCAweEI0MjksIDB4QjQyQiwgMHhCNDM0LCAweEI0NTAsCisgICAgMHhCNDUxLCAweEI0NTQsIDB4QjQ1OCwgMHhCNDYwLCAweEI0NjEsIDB4QjQ2MywgMHhCNDY1LCAweEI0NkMsIDB4QjQ4MCwKKyAgICAweEI0ODgsIDB4QjQ5RCwgMHhCNEE0LCAweEI0QTgsIDB4QjRBQywgMHhCNEI1LCAweEI0QjcsIDB4QjRCOSwgMHhCNEMwLAorICAgIDB4QjRDNCwgMHhCNEM4LCAweEI0RDAsIDB4QjRENSwgMHhCNERDLCAweEI0REQsIDB4QjRFMCwgMHhCNEUzLCAweEI0RTQsCisgICAgMHhCNEU2LCAweEI0RUMsIDB4QjRFRCwgMHhCNEVGLCAweEI0RjEsIDB4QjRGOCwgMHhCNTE0LCAweEI1MTUsIDB4QjUxOCwKKyAgICAweEI1MUIsIDB4QjUxQywgMHhCNTI0LCAweEI1MjUsIDB4QjUyNywgMHhCNTI4LCAweEI1MjksIDB4QjUyQSwgMHhCNTMwLAorICAgIDB4QjUzMSwgMHhCNTM0LCAweEI1MzgsIDB4QjU0MCwgMHhCNTQxLCAweEI1NDMsIDB4QjU0NCwgMHhCNTQ1LCAweEI1NEIsCisgICAgMHhCNTRDLCAweEI1NEQsIDB4QjU1MCwgMHhCNTU0LCAweEI1NUMsIDB4QjU1RCwgMHhCNTVGLCAweEI1NjAsIDB4QjU2MSwKKyAgICAweEI1QTAsIDB4QjVBMSwgMHhCNUE0LCAweEI1QTgsIDB4QjVBQSwgMHhCNUFCLCAweEI1QjAsIDB4QjVCMSwgMHhCNUIzLAorICAgIDB4QjVCNCwgMHhCNUI1LCAweEI1QkIsIDB4QjVCQywgMHhCNUJELCAweEI1QzAsIDB4QjVDNCwgMHhCNUNDLCAweEI1Q0QsCisgICAgMHhCNUNGLCAweEI1RDAsIDB4QjVEMSwgMHhCNUQ4LCAweEI1RUMsIDB4QjYxMCwgMHhCNjExLCAweEI2MTQsIDB4QjYxOCwKKyAgICAweEI2MjUsIDB4QjYyQywgMHhCNjM0LCAweEI2NDgsIDB4QjY2NCwgMHhCNjY4LCAweEI2OUMsIDB4QjY5RCwgMHhCNkEwLAorICAgIDB4QjZBNCwgMHhCNkFCLCAweEI2QUMsIDB4QjZCMSwgMHhCNkQ0LCAweEI2RjAsIDB4QjZGNCwgMHhCNkY4LCAweEI3MDAsCisgICAgMHhCNzAxLCAweEI3MDUsIDB4QjcyOCwgMHhCNzI5LCAweEI3MkMsIDB4QjcyRiwgMHhCNzMwLCAweEI3MzgsIDB4QjczOSwKKyAgICAweEI3M0IsIDB4Qjc0NCwgMHhCNzQ4LCAweEI3NEMsIDB4Qjc1NCwgMHhCNzU1LCAweEI3NjAsIDB4Qjc2NCwgMHhCNzY4LAorICAgIDB4Qjc3MCwgMHhCNzcxLCAweEI3NzMsIDB4Qjc3NSwgMHhCNzdDLCAweEI3N0QsIDB4Qjc4MCwgMHhCNzg0LCAweEI3OEMsCisgICAgMHhCNzhELCAweEI3OEYsIDB4Qjc5MCwgMHhCNzkxLCAweEI3OTIsIDB4Qjc5NiwgMHhCNzk3LCAweEI3OTgsIDB4Qjc5OSwKKyAgICAweEI3OUMsIDB4QjdBMCwgMHhCN0E4LCAweEI3QTksIDB4QjdBQiwgMHhCN0FDLCAweEI3QUQsIDB4QjdCNCwgMHhCN0I1LAorICAgIDB4QjdCOCwgMHhCN0M3LCAweEI3QzksIDB4QjdFQywgMHhCN0VELCAweEI3RjAsIDB4QjdGNCwgMHhCN0ZDLCAweEI3RkQsCisgICAgMHhCN0ZGLCAweEI4MDAsIDB4QjgwMSwgMHhCODA3LCAweEI4MDgsIDB4QjgwOSwgMHhCODBDLCAweEI4MTAsIDB4QjgxOCwKKyAgICAweEI4MTksIDB4QjgxQiwgMHhCODFELCAweEI4MjQsIDB4QjgyNSwgMHhCODI4LCAweEI4MkMsIDB4QjgzNCwgMHhCODM1LAorICAgIDB4QjgzNywgMHhCODM4LCAweEI4MzksIDB4Qjg0MCwgMHhCODQ0LCAweEI4NTEsIDB4Qjg1MywgMHhCODVDLCAweEI4NUQsCisgICAgMHhCODYwLCAweEI4NjQsIDB4Qjg2QywgMHhCODZELCAweEI4NkYsIDB4Qjg3MSwgMHhCODc4LCAweEI4N0MsIDB4Qjg4RCwKKyAgICAweEI4QTgsIDB4QjhCMCwgMHhCOEI0LCAweEI4QjgsIDB4QjhDMCwgMHhCOEMxLCAweEI4QzMsIDB4QjhDNSwgMHhCOENDLAorICAgIDB4QjhEMCwgMHhCOEQ0LCAweEI4REQsIDB4QjhERiwgMHhCOEUxLCAweEI4RTgsIDB4QjhFOSwgMHhCOEVDLCAweEI4RjAsCisgICAgMHhCOEY4LCAweEI4RjksIDB4QjhGQiwgMHhCOEZELCAweEI5MDQsIDB4QjkxOCwgMHhCOTIwLCAweEI5M0MsIDB4QjkzRCwKKyAgICAweEI5NDAsIDB4Qjk0NCwgMHhCOTRDLCAweEI5NEYsIDB4Qjk1MSwgMHhCOTU4LCAweEI5NTksIDB4Qjk1QywgMHhCOTYwLAorICAgIDB4Qjk2OCwgMHhCOTY5LCAweEI5NkIsIDB4Qjk2RCwgMHhCOTc0LCAweEI5NzUsIDB4Qjk3OCwgMHhCOTdDLCAweEI5ODQsCisgICAgMHhCOTg1LCAweEI5ODcsIDB4Qjk4OSwgMHhCOThBLCAweEI5OEQsIDB4Qjk4RSwgMHhCOUFDLCAweEI5QUQsIDB4QjlCMCwKKyAgICAweEI5QjQsIDB4QjlCQywgMHhCOUJELCAweEI5QkYsIDB4QjlDMSwgMHhCOUM4LCAweEI5QzksIDB4QjlDQywgMHhCOUNFLAorICAgIDB4QjlDRiwgMHhCOUQwLCAweEI5RDEsIDB4QjlEMiwgMHhCOUQ4LCAweEI5RDksIDB4QjlEQiwgMHhCOURELCAweEI5REUsCisgICAgMHhCOUUxLCAweEI5RTMsIDB4QjlFNCwgMHhCOUU1LCAweEI5RTgsIDB4QjlFQywgMHhCOUY0LCAweEI5RjUsIDB4QjlGNywKKyAgICAweEI5RjgsIDB4QjlGOSwgMHhCOUZBLCAweEJBMDAsIDB4QkEwMSwgMHhCQTA4LCAweEJBMTUsIDB4QkEzOCwgMHhCQTM5LAorICAgIDB4QkEzQywgMHhCQTQwLCAweEJBNDIsIDB4QkE0OCwgMHhCQTQ5LCAweEJBNEIsIDB4QkE0RCwgMHhCQTRFLCAweEJBNTMsCisgICAgMHhCQTU0LCAweEJBNTUsIDB4QkE1OCwgMHhCQTVDLCAweEJBNjQsIDB4QkE2NSwgMHhCQTY3LCAweEJBNjgsIDB4QkE2OSwKKyAgICAweEJBNzAsIDB4QkE3MSwgMHhCQTc0LCAweEJBNzgsIDB4QkE4MywgMHhCQTg0LCAweEJBODUsIDB4QkE4NywgMHhCQThDLAorICAgIDB4QkFBOCwgMHhCQUE5LCAweEJBQUIsIDB4QkFBQywgMHhCQUIwLCAweEJBQjIsIDB4QkFCOCwgMHhCQUI5LCAweEJBQkIsCisgICAgMHhCQUJELCAweEJBQzQsIDB4QkFDOCwgMHhCQUQ4LCAweEJBRDksIDB4QkFGQywgMHhCQjAwLCAweEJCMDQsIDB4QkIwRCwKKyAgICAweEJCMEYsIDB4QkIxMSwgMHhCQjE4LCAweEJCMUMsIDB4QkIyMCwgMHhCQjI5LCAweEJCMkIsIDB4QkIzNCwgMHhCQjM1LAorICAgIDB4QkIzNiwgMHhCQjM4LCAweEJCM0IsIDB4QkIzQywgMHhCQjNELCAweEJCM0UsIDB4QkI0NCwgMHhCQjQ1LCAweEJCNDcsCisgICAgMHhCQjQ5LCAweEJCNEQsIDB4QkI0RiwgMHhCQjUwLCAweEJCNTQsIDB4QkI1OCwgMHhCQjYxLCAweEJCNjMsIDB4QkI2QywKKyAgICAweEJCODgsIDB4QkI4QywgMHhCQjkwLCAweEJCQTQsIDB4QkJBOCwgMHhCQkFDLCAweEJCQjQsIDB4QkJCNywgMHhCQkMwLAorICAgIDB4QkJDNCwgMHhCQkM4LCAweEJCRDAsIDB4QkJEMywgMHhCQkY4LCAweEJCRjksIDB4QkJGQywgMHhCQkZGLCAweEJDMDAsCisgICAgMHhCQzAyLCAweEJDMDgsIDB4QkMwOSwgMHhCQzBCLCAweEJDMEMsIDB4QkMwRCwgMHhCQzBGLCAweEJDMTEsIDB4QkMxNCwKKyAgICAweEJDMTUsIDB4QkMxNiwgMHhCQzE3LCAweEJDMTgsIDB4QkMxQiwgMHhCQzFDLCAweEJDMUQsIDB4QkMxRSwgMHhCQzFGLAorICAgIDB4QkMyNCwgMHhCQzI1LCAweEJDMjcsIDB4QkMyOSwgMHhCQzJELCAweEJDMzAsIDB4QkMzMSwgMHhCQzM0LCAweEJDMzgsCisgICAgMHhCQzQwLCAweEJDNDEsIDB4QkM0MywgMHhCQzQ0LCAweEJDNDUsIDB4QkM0OSwgMHhCQzRDLCAweEJDNEQsIDB4QkM1MCwKKyAgICAweEJDNUQsIDB4QkM4NCwgMHhCQzg1LCAweEJDODgsIDB4QkM4QiwgMHhCQzhDLCAweEJDOEUsIDB4QkM5NCwgMHhCQzk1LAorICAgIDB4QkM5NywgMHhCQzk5LCAweEJDOUEsIDB4QkNBMCwgMHhCQ0ExLCAweEJDQTQsIDB4QkNBNywgMHhCQ0E4LCAweEJDQjAsCisgICAgMHhCQ0IxLCAweEJDQjMsIDB4QkNCNCwgMHhCQ0I1LCAweEJDQkMsIDB4QkNCRCwgMHhCQ0MwLCAweEJDQzQsIDB4QkNDRCwKKyAgICAweEJDQ0YsIDB4QkNEMCwgMHhCQ0QxLCAweEJDRDUsIDB4QkNEOCwgMHhCQ0RDLCAweEJDRjQsIDB4QkNGNSwgMHhCQ0Y2LAorICAgIDB4QkNGOCwgMHhCQ0ZDLCAweEJEMDQsIDB4QkQwNSwgMHhCRDA3LCAweEJEMDksIDB4QkQxMCwgMHhCRDE0LCAweEJEMjQsCisgICAgMHhCRDJDLCAweEJENDAsIDB4QkQ0OCwgMHhCRDQ5LCAweEJENEMsIDB4QkQ1MCwgMHhCRDU4LCAweEJENTksIDB4QkQ2NCwKKyAgICAweEJENjgsIDB4QkQ4MCwgMHhCRDgxLCAweEJEODQsIDB4QkQ4NywgMHhCRDg4LCAweEJEODksIDB4QkQ4QSwgMHhCRDkwLAorICAgIDB4QkQ5MSwgMHhCRDkzLCAweEJEOTUsIDB4QkQ5OSwgMHhCRDlBLCAweEJEOUMsIDB4QkRBNCwgMHhCREIwLCAweEJEQjgsCisgICAgMHhCREQ0LCAweEJERDUsIDB4QkREOCwgMHhCRERDLCAweEJERTksIDB4QkRGMCwgMHhCREY0LCAweEJERjgsIDB4QkUwMCwKKyAgICAweEJFMDMsIDB4QkUwNSwgMHhCRTBDLCAweEJFMEQsIDB4QkUxMCwgMHhCRTE0LCAweEJFMUMsIDB4QkUxRCwgMHhCRTFGLAorICAgIDB4QkU0NCwgMHhCRTQ1LCAweEJFNDgsIDB4QkU0QywgMHhCRTRFLCAweEJFNTQsIDB4QkU1NSwgMHhCRTU3LCAweEJFNTksCisgICAgMHhCRTVBLCAweEJFNUIsIDB4QkU2MCwgMHhCRTYxLCAweEJFNjQsIDB4QkU2OCwgMHhCRTZBLCAweEJFNzAsIDB4QkU3MSwKKyAgICAweEJFNzMsIDB4QkU3NCwgMHhCRTc1LCAweEJFN0IsIDB4QkU3QywgMHhCRTdELCAweEJFODAsIDB4QkU4NCwgMHhCRThDLAorICAgIDB4QkU4RCwgMHhCRThGLCAweEJFOTAsIDB4QkU5MSwgMHhCRTk4LCAweEJFOTksIDB4QkVBOCwgMHhCRUQwLCAweEJFRDEsCisgICAgMHhCRUQ0LCAweEJFRDcsIDB4QkVEOCwgMHhCRUUwLCAweEJFRTMsIDB4QkVFNCwgMHhCRUU1LCAweEJFRUMsIDB4QkYwMSwKKyAgICAweEJGMDgsIDB4QkYwOSwgMHhCRjE4LCAweEJGMTksIDB4QkYxQiwgMHhCRjFDLCAweEJGMUQsIDB4QkY0MCwgMHhCRjQxLAorICAgIDB4QkY0NCwgMHhCRjQ4LCAweEJGNTAsIDB4QkY1MSwgMHhCRjU1LCAweEJGOTQsIDB4QkZCMCwgMHhCRkM1LCAweEJGQ0MsCisgICAgMHhCRkNELCAweEJGRDAsIDB4QkZENCwgMHhCRkRDLCAweEJGREYsIDB4QkZFMSwgMHhDMDNDLCAweEMwNTEsIDB4QzA1OCwKKyAgICAweEMwNUMsIDB4QzA2MCwgMHhDMDY4LCAweEMwNjksIDB4QzA5MCwgMHhDMDkxLCAweEMwOTQsIDB4QzA5OCwgMHhDMEEwLAorICAgIDB4QzBBMSwgMHhDMEEzLCAweEMwQTUsIDB4QzBBQywgMHhDMEFELCAweEMwQUYsIDB4QzBCMCwgMHhDMEIzLCAweEMwQjQsCisgICAgMHhDMEI1LCAweEMwQjYsIDB4QzBCQywgMHhDMEJELCAweEMwQkYsIDB4QzBDMCwgMHhDMEMxLCAweEMwQzUsIDB4QzBDOCwKKyAgICAweEMwQzksIDB4QzBDQywgMHhDMEQwLCAweEMwRDgsIDB4QzBEOSwgMHhDMERCLCAweEMwREMsIDB4QzBERCwgMHhDMEU0LAorICAgIDB4QzBFNSwgMHhDMEU4LCAweEMwRUMsIDB4QzBGNCwgMHhDMEY1LCAweEMwRjcsIDB4QzBGOSwgMHhDMTAwLCAweEMxMDQsCisgICAgMHhDMTA4LCAweEMxMTAsIDB4QzExNSwgMHhDMTFDLCAweEMxMUQsIDB4QzExRSwgMHhDMTFGLCAweEMxMjAsIDB4QzEyMywKKyAgICAweEMxMjQsIDB4QzEyNiwgMHhDMTI3LCAweEMxMkMsIDB4QzEyRCwgMHhDMTJGLCAweEMxMzAsIDB4QzEzMSwgMHhDMTM2LAorICAgIDB4QzEzOCwgMHhDMTM5LCAweEMxM0MsIDB4QzE0MCwgMHhDMTQ4LCAweEMxNDksIDB4QzE0QiwgMHhDMTRDLCAweEMxNEQsCisgICAgMHhDMTU0LCAweEMxNTUsIDB4QzE1OCwgMHhDMTVDLCAweEMxNjQsIDB4QzE2NSwgMHhDMTY3LCAweEMxNjgsIDB4QzE2OSwKKyAgICAweEMxNzAsIDB4QzE3NCwgMHhDMTc4LCAweEMxODUsIDB4QzE4QywgMHhDMThELCAweEMxOEUsIDB4QzE5MCwgMHhDMTk0LAorICAgIDB4QzE5NiwgMHhDMTlDLCAweEMxOUQsIDB4QzE5RiwgMHhDMUExLCAweEMxQTUsIDB4QzFBOCwgMHhDMUE5LCAweEMxQUMsCisgICAgMHhDMUIwLCAweEMxQkQsIDB4QzFDNCwgMHhDMUM4LCAweEMxQ0MsIDB4QzFENCwgMHhDMUQ3LCAweEMxRDgsIDB4QzFFMCwKKyAgICAweEMxRTQsIDB4QzFFOCwgMHhDMUYwLCAweEMxRjEsIDB4QzFGMywgMHhDMUZDLCAweEMxRkQsIDB4QzIwMCwgMHhDMjA0LAorICAgIDB4QzIwQywgMHhDMjBELCAweEMyMEYsIDB4QzIxMSwgMHhDMjE4LCAweEMyMTksIDB4QzIxQywgMHhDMjFGLCAweEMyMjAsCisgICAgMHhDMjI4LCAweEMyMjksIDB4QzIyQiwgMHhDMjJELCAweEMyMkYsIDB4QzIzMSwgMHhDMjMyLCAweEMyMzQsIDB4QzI0OCwKKyAgICAweEMyNTAsIDB4QzI1MSwgMHhDMjU0LCAweEMyNTgsIDB4QzI2MCwgMHhDMjY1LCAweEMyNkMsIDB4QzI2RCwgMHhDMjcwLAorICAgIDB4QzI3NCwgMHhDMjdDLCAweEMyN0QsIDB4QzI3RiwgMHhDMjgxLCAweEMyODgsIDB4QzI4OSwgMHhDMjkwLCAweEMyOTgsCisgICAgMHhDMjlCLCAweEMyOUQsIDB4QzJBNCwgMHhDMkE1LCAweEMyQTgsIDB4QzJBQywgMHhDMkFELCAweEMyQjQsIDB4QzJCNSwKKyAgICAweEMyQjcsIDB4QzJCOSwgMHhDMkRDLCAweEMyREQsIDB4QzJFMCwgMHhDMkUzLCAweEMyRTQsIDB4QzJFQiwgMHhDMkVDLAorICAgIDB4QzJFRCwgMHhDMkVGLCAweEMyRjEsIDB4QzJGNiwgMHhDMkY4LCAweEMyRjksIDB4QzJGQiwgMHhDMkZDLCAweEMzMDAsCisgICAgMHhDMzA4LCAweEMzMDksIDB4QzMwQywgMHhDMzBELCAweEMzMTMsIDB4QzMxNCwgMHhDMzE1LCAweEMzMTgsIDB4QzMxQywKKyAgICAweEMzMjQsIDB4QzMyNSwgMHhDMzI4LCAweEMzMjksIDB4QzM0NSwgMHhDMzY4LCAweEMzNjksIDB4QzM2QywgMHhDMzcwLAorICAgIDB4QzM3MiwgMHhDMzc4LCAweEMzNzksIDB4QzM3QywgMHhDMzdELCAweEMzODQsIDB4QzM4OCwgMHhDMzhDLCAweEMzQzAsCisgICAgMHhDM0Q4LCAweEMzRDksIDB4QzNEQywgMHhDM0RGLCAweEMzRTAsIDB4QzNFMiwgMHhDM0U4LCAweEMzRTksIDB4QzNFRCwKKyAgICAweEMzRjQsIDB4QzNGNSwgMHhDM0Y4LCAweEM0MDgsIDB4QzQxMCwgMHhDNDI0LCAweEM0MkMsIDB4QzQzMCwgMHhDNDM0LAorICAgIDB4QzQzQywgMHhDNDNELCAweEM0NDgsIDB4QzQ2NCwgMHhDNDY1LCAweEM0NjgsIDB4QzQ2QywgMHhDNDc0LCAweEM0NzUsCisgICAgMHhDNDc5LCAweEM0ODAsIDB4QzQ5NCwgMHhDNDlDLCAweEM0QjgsIDB4QzRCQywgMHhDNEU5LCAweEM0RjAsIDB4QzRGMSwKKyAgICAweEM0RjQsIDB4QzRGOCwgMHhDNEZBLCAweEM0RkYsIDB4QzUwMCwgMHhDNTAxLCAweEM1MEMsIDB4QzUxMCwgMHhDNTE0LAorICAgIDB4QzUxQywgMHhDNTI4LCAweEM1MjksIDB4QzUyQywgMHhDNTMwLCAweEM1MzgsIDB4QzUzOSwgMHhDNTNCLCAweEM1M0QsCisgICAgMHhDNTQ0LCAweEM1NDUsIDB4QzU0OCwgMHhDNTQ5LCAweEM1NEEsIDB4QzU0QywgMHhDNTRELCAweEM1NEUsIDB4QzU1MywKKyAgICAweEM1NTQsIDB4QzU1NSwgMHhDNTU3LCAweEM1NTgsIDB4QzU1OSwgMHhDNTVELCAweEM1NUUsIDB4QzU2MCwgMHhDNTYxLAorICAgIDB4QzU2NCwgMHhDNTY4LCAweEM1NzAsIDB4QzU3MSwgMHhDNTczLCAweEM1NzQsIDB4QzU3NSwgMHhDNTdDLCAweEM1N0QsCisgICAgMHhDNTgwLCAweEM1ODQsIDB4QzU4NywgMHhDNThDLCAweEM1OEQsIDB4QzU4RiwgMHhDNTkxLCAweEM1OTUsIDB4QzU5NywKKyAgICAweEM1OTgsIDB4QzU5QywgMHhDNUEwLCAweEM1QTksIDB4QzVCNCwgMHhDNUI1LCAweEM1QjgsIDB4QzVCOSwgMHhDNUJCLAorICAgIDB4QzVCQywgMHhDNUJELCAweEM1QkUsIDB4QzVDNCwgMHhDNUM1LCAweEM1QzYsIDB4QzVDNywgMHhDNUM4LCAweEM1QzksCisgICAgMHhDNUNBLCAweEM1Q0MsIDB4QzVDRSwgMHhDNUQwLCAweEM1RDEsIDB4QzVENCwgMHhDNUQ4LCAweEM1RTAsIDB4QzVFMSwKKyAgICAweEM1RTMsIDB4QzVFNSwgMHhDNUVDLCAweEM1RUQsIDB4QzVFRSwgMHhDNUYwLCAweEM1RjQsIDB4QzVGNiwgMHhDNUY3LAorICAgIDB4QzVGQywgMHhDNUZELCAweEM1RkUsIDB4QzVGRiwgMHhDNjAwLCAweEM2MDEsIDB4QzYwNSwgMHhDNjA2LCAweEM2MDcsCisgICAgMHhDNjA4LCAweEM2MEMsIDB4QzYxMCwgMHhDNjE4LCAweEM2MTksIDB4QzYxQiwgMHhDNjFDLCAweEM2MjQsIDB4QzYyNSwKKyAgICAweEM2MjgsIDB4QzYyQywgMHhDNjJELCAweEM2MkUsIDB4QzYzMCwgMHhDNjMzLCAweEM2MzQsIDB4QzYzNSwgMHhDNjM3LAorICAgIDB4QzYzOSwgMHhDNjNCLCAweEM2NDAsIDB4QzY0MSwgMHhDNjQ0LCAweEM2NDgsIDB4QzY1MCwgMHhDNjUxLCAweEM2NTMsCisgICAgMHhDNjU0LCAweEM2NTUsIDB4QzY1QywgMHhDNjVELCAweEM2NjAsIDB4QzY2QywgMHhDNjZGLCAweEM2NzEsIDB4QzY3OCwKKyAgICAweEM2NzksIDB4QzY3QywgMHhDNjgwLCAweEM2ODgsIDB4QzY4OSwgMHhDNjhCLCAweEM2OEQsIDB4QzY5NCwgMHhDNjk1LAorICAgIDB4QzY5OCwgMHhDNjlDLCAweEM2QTQsIDB4QzZBNSwgMHhDNkE3LCAweEM2QTksIDB4QzZCMCwgMHhDNkIxLCAweEM2QjQsCisgICAgMHhDNkI4LCAweEM2QjksIDB4QzZCQSwgMHhDNkMwLCAweEM2QzEsIDB4QzZDMywgMHhDNkM1LCAweEM2Q0MsIDB4QzZDRCwKKyAgICAweEM2RDAsIDB4QzZENCwgMHhDNkRDLCAweEM2REQsIDB4QzZFMCwgMHhDNkUxLCAweEM2RTgsIDB4QzZFOSwgMHhDNkVDLAorICAgIDB4QzZGMCwgMHhDNkY4LCAweEM2RjksIDB4QzZGRCwgMHhDNzA0LCAweEM3MDUsIDB4QzcwOCwgMHhDNzBDLCAweEM3MTQsCisgICAgMHhDNzE1LCAweEM3MTcsIDB4QzcxOSwgMHhDNzIwLCAweEM3MjEsIDB4QzcyNCwgMHhDNzI4LCAweEM3MzAsIDB4QzczMSwKKyAgICAweEM3MzMsIDB4QzczNSwgMHhDNzM3LCAweEM3M0MsIDB4QzczRCwgMHhDNzQwLCAweEM3NDQsIDB4Qzc0QSwgMHhDNzRDLAorICAgIDB4Qzc0RCwgMHhDNzRGLCAweEM3NTEsIDB4Qzc1MiwgMHhDNzUzLCAweEM3NTQsIDB4Qzc1NSwgMHhDNzU2LCAweEM3NTcsCisgICAgMHhDNzU4LCAweEM3NUMsIDB4Qzc2MCwgMHhDNzY4LCAweEM3NkIsIDB4Qzc3NCwgMHhDNzc1LCAweEM3NzgsIDB4Qzc3QywKKyAgICAweEM3N0QsIDB4Qzc3RSwgMHhDNzgzLCAweEM3ODQsIDB4Qzc4NSwgMHhDNzg3LCAweEM3ODgsIDB4Qzc4OSwgMHhDNzhBLAorICAgIDB4Qzc4RSwgMHhDNzkwLCAweEM3OTEsIDB4Qzc5NCwgMHhDNzk2LCAweEM3OTcsIDB4Qzc5OCwgMHhDNzlBLCAweEM3QTAsCisgICAgMHhDN0ExLCAweEM3QTMsIDB4QzdBNCwgMHhDN0E1LCAweEM3QTYsIDB4QzdBQywgMHhDN0FELCAweEM3QjAsIDB4QzdCNCwKKyAgICAweEM3QkMsIDB4QzdCRCwgMHhDN0JGLCAweEM3QzAsIDB4QzdDMSwgMHhDN0M4LCAweEM3QzksIDB4QzdDQywgMHhDN0NFLAorICAgIDB4QzdEMCwgMHhDN0Q4LCAweEM3REQsIDB4QzdFNCwgMHhDN0U4LCAweEM3RUMsIDB4QzgwMCwgMHhDODAxLCAweEM4MDQsCisgICAgMHhDODA4LCAweEM4MEEsIDB4QzgxMCwgMHhDODExLCAweEM4MTMsIDB4QzgxNSwgMHhDODE2LCAweEM4MUMsIDB4QzgxRCwKKyAgICAweEM4MjAsIDB4QzgyNCwgMHhDODJDLCAweEM4MkQsIDB4QzgyRiwgMHhDODMxLCAweEM4MzgsIDB4QzgzQywgMHhDODQwLAorICAgIDB4Qzg0OCwgMHhDODQ5LCAweEM4NEMsIDB4Qzg0RCwgMHhDODU0LCAweEM4NzAsIDB4Qzg3MSwgMHhDODc0LCAweEM4NzgsCisgICAgMHhDODdBLCAweEM4ODAsIDB4Qzg4MSwgMHhDODgzLCAweEM4ODUsIDB4Qzg4NiwgMHhDODg3LCAweEM4OEIsIDB4Qzg4QywKKyAgICAweEM4OEQsIDB4Qzg5NCwgMHhDODlELCAweEM4OUYsIDB4QzhBMSwgMHhDOEE4LCAweEM4QkMsIDB4QzhCRCwgMHhDOEM0LAorICAgIDB4QzhDOCwgMHhDOENDLCAweEM4RDQsIDB4QzhENSwgMHhDOEQ3LCAweEM4RDksIDB4QzhFMCwgMHhDOEUxLCAweEM4RTQsCisgICAgMHhDOEY1LCAweEM4RkMsIDB4QzhGRCwgMHhDOTAwLCAweEM5MDQsIDB4QzkwNSwgMHhDOTA2LCAweEM5MEMsIDB4QzkwRCwKKyAgICAweEM5MEYsIDB4QzkxMSwgMHhDOTE4LCAweEM5MkMsIDB4QzkzNCwgMHhDOTUwLCAweEM5NTEsIDB4Qzk1NCwgMHhDOTU4LAorICAgIDB4Qzk2MCwgMHhDOTYxLCAweEM5NjMsIDB4Qzk2QywgMHhDOTcwLCAweEM5NzQsIDB4Qzk3QywgMHhDOTg4LCAweEM5ODksCisgICAgMHhDOThDLCAweEM5OTAsIDB4Qzk5OCwgMHhDOTk5LCAweEM5OUIsIDB4Qzk5RCwgMHhDOUMwLCAweEM5QzEsIDB4QzlDNCwKKyAgICAweEM5QzcsIDB4QzlDOCwgMHhDOUNBLCAweEM5RDAsIDB4QzlEMSwgMHhDOUQzLCAweEM5RDUsIDB4QzlENiwgMHhDOUQ5LAorICAgIDB4QzlEQSwgMHhDOURDLCAweEM5REQsIDB4QzlFMCwgMHhDOUUyLCAweEM5RTQsIDB4QzlFNywgMHhDOUVDLCAweEM5RUQsCisgICAgMHhDOUVGLCAweEM5RjAsIDB4QzlGMSwgMHhDOUY4LCAweEM5RjksIDB4QzlGQywgMHhDQTAwLCAweENBMDgsIDB4Q0EwOSwKKyAgICAweENBMEIsIDB4Q0EwQywgMHhDQTBELCAweENBMTQsIDB4Q0ExOCwgMHhDQTI5LCAweENBNEMsIDB4Q0E0RCwgMHhDQTUwLAorICAgIDB4Q0E1NCwgMHhDQTVDLCAweENBNUQsIDB4Q0E1RiwgMHhDQTYwLCAweENBNjEsIDB4Q0E2OCwgMHhDQTdELCAweENBODQsCisgICAgMHhDQTk4LCAweENBQkMsIDB4Q0FCRCwgMHhDQUMwLCAweENBQzQsIDB4Q0FDQywgMHhDQUNELCAweENBQ0YsIDB4Q0FEMSwKKyAgICAweENBRDMsIDB4Q0FEOCwgMHhDQUQ5LCAweENBRTAsIDB4Q0FFQywgMHhDQUY0LCAweENCMDgsIDB4Q0IxMCwgMHhDQjE0LAorICAgIDB4Q0IxOCwgMHhDQjIwLCAweENCMjEsIDB4Q0I0MSwgMHhDQjQ4LCAweENCNDksIDB4Q0I0QywgMHhDQjUwLCAweENCNTgsCisgICAgMHhDQjU5LCAweENCNUQsIDB4Q0I2NCwgMHhDQjc4LCAweENCNzksIDB4Q0I5QywgMHhDQkI4LCAweENCRDQsIDB4Q0JFNCwKKyAgICAweENCRTcsIDB4Q0JFOSwgMHhDQzBDLCAweENDMEQsIDB4Q0MxMCwgMHhDQzE0LCAweENDMUMsIDB4Q0MxRCwgMHhDQzIxLAorICAgIDB4Q0MyMiwgMHhDQzI3LCAweENDMjgsIDB4Q0MyOSwgMHhDQzJDLCAweENDMkUsIDB4Q0MzMCwgMHhDQzM4LCAweENDMzksCisgICAgMHhDQzNCLCAweENDM0MsIDB4Q0MzRCwgMHhDQzNFLCAweENDNDQsIDB4Q0M0NSwgMHhDQzQ4LCAweENDNEMsIDB4Q0M1NCwKKyAgICAweENDNTUsIDB4Q0M1NywgMHhDQzU4LCAweENDNTksIDB4Q0M2MCwgMHhDQzY0LCAweENDNjYsIDB4Q0M2OCwgMHhDQzcwLAorICAgIDB4Q0M3NSwgMHhDQzk4LCAweENDOTksIDB4Q0M5QywgMHhDQ0EwLCAweENDQTgsIDB4Q0NBOSwgMHhDQ0FCLCAweENDQUMsCisgICAgMHhDQ0FELCAweENDQjQsIDB4Q0NCNSwgMHhDQ0I4LCAweENDQkMsIDB4Q0NDNCwgMHhDQ0M1LCAweENDQzcsIDB4Q0NDOSwKKyAgICAweENDRDAsIDB4Q0NENCwgMHhDQ0U0LCAweENDRUMsIDB4Q0NGMCwgMHhDRDAxLCAweENEMDgsIDB4Q0QwOSwgMHhDRDBDLAorICAgIDB4Q0QxMCwgMHhDRDE4LCAweENEMTksIDB4Q0QxQiwgMHhDRDFELCAweENEMjQsIDB4Q0QyOCwgMHhDRDJDLCAweENEMzksCisgICAgMHhDRDVDLCAweENENjAsIDB4Q0Q2NCwgMHhDRDZDLCAweENENkQsIDB4Q0Q2RiwgMHhDRDcxLCAweENENzgsIDB4Q0Q4OCwKKyAgICAweENEOTQsIDB4Q0Q5NSwgMHhDRDk4LCAweENEOUMsIDB4Q0RBNCwgMHhDREE1LCAweENEQTcsIDB4Q0RBOSwgMHhDREIwLAorICAgIDB4Q0RDNCwgMHhDRENDLCAweENERDAsIDB4Q0RFOCwgMHhDREVDLCAweENERjAsIDB4Q0RGOCwgMHhDREY5LCAweENERkIsCisgICAgMHhDREZELCAweENFMDQsIDB4Q0UwOCwgMHhDRTBDLCAweENFMTQsIDB4Q0UxOSwgMHhDRTIwLCAweENFMjEsIDB4Q0UyNCwKKyAgICAweENFMjgsIDB4Q0UzMCwgMHhDRTMxLCAweENFMzMsIDB4Q0UzNSwgMHhDRTU4LCAweENFNTksIDB4Q0U1QywgMHhDRTVGLAorICAgIDB4Q0U2MCwgMHhDRTYxLCAweENFNjgsIDB4Q0U2OSwgMHhDRTZCLCAweENFNkQsIDB4Q0U3NCwgMHhDRTc1LCAweENFNzgsCisgICAgMHhDRTdDLCAweENFODQsIDB4Q0U4NSwgMHhDRTg3LCAweENFODksIDB4Q0U5MCwgMHhDRTkxLCAweENFOTQsIDB4Q0U5OCwKKyAgICAweENFQTAsIDB4Q0VBMSwgMHhDRUEzLCAweENFQTQsIDB4Q0VBNSwgMHhDRUFDLCAweENFQUQsIDB4Q0VDMSwgMHhDRUU0LAorICAgIDB4Q0VFNSwgMHhDRUU4LCAweENFRUIsIDB4Q0VFQywgMHhDRUY0LCAweENFRjUsIDB4Q0VGNywgMHhDRUY4LCAweENFRjksCisgICAgMHhDRjAwLCAweENGMDEsIDB4Q0YwNCwgMHhDRjA4LCAweENGMTAsIDB4Q0YxMSwgMHhDRjEzLCAweENGMTUsIDB4Q0YxQywKKyAgICAweENGMjAsIDB4Q0YyNCwgMHhDRjJDLCAweENGMkQsIDB4Q0YyRiwgMHhDRjMwLCAweENGMzEsIDB4Q0YzOCwgMHhDRjU0LAorICAgIDB4Q0Y1NSwgMHhDRjU4LCAweENGNUMsIDB4Q0Y2NCwgMHhDRjY1LCAweENGNjcsIDB4Q0Y2OSwgMHhDRjcwLCAweENGNzEsCisgICAgMHhDRjc0LCAweENGNzgsIDB4Q0Y4MCwgMHhDRjg1LCAweENGOEMsIDB4Q0ZBMSwgMHhDRkE4LCAweENGQjAsIDB4Q0ZDNCwKKyAgICAweENGRTAsIDB4Q0ZFMSwgMHhDRkU0LCAweENGRTgsIDB4Q0ZGMCwgMHhDRkYxLCAweENGRjMsIDB4Q0ZGNSwgMHhDRkZDLAorICAgIDB4RDAwMCwgMHhEMDA0LCAweEQwMTEsIDB4RDAxOCwgMHhEMDJELCAweEQwMzQsIDB4RDAzNSwgMHhEMDM4LCAweEQwM0MsCisgICAgMHhEMDQ0LCAweEQwNDUsIDB4RDA0NywgMHhEMDQ5LCAweEQwNTAsIDB4RDA1NCwgMHhEMDU4LCAweEQwNjAsIDB4RDA2QywKKyAgICAweEQwNkQsIDB4RDA3MCwgMHhEMDc0LCAweEQwN0MsIDB4RDA3RCwgMHhEMDgxLCAweEQwQTQsIDB4RDBBNSwgMHhEMEE4LAorICAgIDB4RDBBQywgMHhEMEI0LCAweEQwQjUsIDB4RDBCNywgMHhEMEI5LCAweEQwQzAsIDB4RDBDMSwgMHhEMEM0LCAweEQwQzgsCisgICAgMHhEMEM5LCAweEQwRDAsIDB4RDBEMSwgMHhEMEQzLCAweEQwRDQsIDB4RDBENSwgMHhEMERDLCAweEQwREQsIDB4RDBFMCwKKyAgICAweEQwRTQsIDB4RDBFQywgMHhEMEVELCAweEQwRUYsIDB4RDBGMCwgMHhEMEYxLCAweEQwRjgsIDB4RDEwRCwgMHhEMTMwLAorICAgIDB4RDEzMSwgMHhEMTM0LCAweEQxMzgsIDB4RDEzQSwgMHhEMTQwLCAweEQxNDEsIDB4RDE0MywgMHhEMTQ0LCAweEQxNDUsCisgICAgMHhEMTRDLCAweEQxNEQsIDB4RDE1MCwgMHhEMTU0LCAweEQxNUMsIDB4RDE1RCwgMHhEMTVGLCAweEQxNjEsIDB4RDE2OCwKKyAgICAweEQxNkMsIDB4RDE3QywgMHhEMTg0LCAweEQxODgsIDB4RDFBMCwgMHhEMUExLCAweEQxQTQsIDB4RDFBOCwgMHhEMUIwLAorICAgIDB4RDFCMSwgMHhEMUIzLCAweEQxQjUsIDB4RDFCQSwgMHhEMUJDLCAweEQxQzAsIDB4RDFEOCwgMHhEMUY0LCAweEQxRjgsCisgICAgMHhEMjA3LCAweEQyMDksIDB4RDIxMCwgMHhEMjJDLCAweEQyMkQsIDB4RDIzMCwgMHhEMjM0LCAweEQyM0MsIDB4RDIzRCwKKyAgICAweEQyM0YsIDB4RDI0MSwgMHhEMjQ4LCAweEQyNUMsIDB4RDI2NCwgMHhEMjgwLCAweEQyODEsIDB4RDI4NCwgMHhEMjg4LAorICAgIDB4RDI5MCwgMHhEMjkxLCAweEQyOTUsIDB4RDI5QywgMHhEMkEwLCAweEQyQTQsIDB4RDJBQywgMHhEMkIxLCAweEQyQjgsCisgICAgMHhEMkI5LCAweEQyQkMsIDB4RDJCRiwgMHhEMkMwLCAweEQyQzIsIDB4RDJDOCwgMHhEMkM5LCAweEQyQ0IsIDB4RDJENCwKKyAgICAweEQyRDgsIDB4RDJEQywgMHhEMkU0LCAweEQyRTUsIDB4RDJGMCwgMHhEMkYxLCAweEQyRjQsIDB4RDJGOCwgMHhEMzAwLAorICAgIDB4RDMwMSwgMHhEMzAzLCAweEQzMDUsIDB4RDMwQywgMHhEMzBELCAweEQzMEUsIDB4RDMxMCwgMHhEMzE0LCAweEQzMTYsCisgICAgMHhEMzFDLCAweEQzMUQsIDB4RDMxRiwgMHhEMzIwLCAweEQzMjEsIDB4RDMyNSwgMHhEMzI4LCAweEQzMjksIDB4RDMyQywKKyAgICAweEQzMzAsIDB4RDMzOCwgMHhEMzM5LCAweEQzM0IsIDB4RDMzQywgMHhEMzNELCAweEQzNDQsIDB4RDM0NSwgMHhEMzdDLAorICAgIDB4RDM3RCwgMHhEMzgwLCAweEQzODQsIDB4RDM4QywgMHhEMzhELCAweEQzOEYsIDB4RDM5MCwgMHhEMzkxLCAweEQzOTgsCisgICAgMHhEMzk5LCAweEQzOUMsIDB4RDNBMCwgMHhEM0E4LCAweEQzQTksIDB4RDNBQiwgMHhEM0FELCAweEQzQjQsIDB4RDNCOCwKKyAgICAweEQzQkMsIDB4RDNDNCwgMHhEM0M1LCAweEQzQzgsIDB4RDNDOSwgMHhEM0QwLCAweEQzRDgsIDB4RDNFMSwgMHhEM0UzLAorICAgIDB4RDNFQywgMHhEM0VELCAweEQzRjAsIDB4RDNGNCwgMHhEM0ZDLCAweEQzRkQsIDB4RDNGRiwgMHhENDAxLCAweEQ0MDgsCisgICAgMHhENDFELCAweEQ0NDAsIDB4RDQ0NCwgMHhENDVDLCAweEQ0NjAsIDB4RDQ2NCwgMHhENDZELCAweEQ0NkYsIDB4RDQ3OCwKKyAgICAweEQ0NzksIDB4RDQ3QywgMHhENDdGLCAweEQ0ODAsIDB4RDQ4MiwgMHhENDg4LCAweEQ0ODksIDB4RDQ4QiwgMHhENDhELAorICAgIDB4RDQ5NCwgMHhENEE5LCAweEQ0Q0MsIDB4RDREMCwgMHhENEQ0LCAweEQ0REMsIDB4RDRERiwgMHhENEU4LCAweEQ0RUMsCisgICAgMHhENEYwLCAweEQ0RjgsIDB4RDRGQiwgMHhENEZELCAweEQ1MDQsIDB4RDUwOCwgMHhENTBDLCAweEQ1MTQsIDB4RDUxNSwKKyAgICAweEQ1MTcsIDB4RDUzQywgMHhENTNELCAweEQ1NDAsIDB4RDU0NCwgMHhENTRDLCAweEQ1NEQsIDB4RDU0RiwgMHhENTUxLAorICAgIDB4RDU1OCwgMHhENTU5LCAweEQ1NUMsIDB4RDU2MCwgMHhENTY1LCAweEQ1NjgsIDB4RDU2OSwgMHhENTZCLCAweEQ1NkQsCisgICAgMHhENTc0LCAweEQ1NzUsIDB4RDU3OCwgMHhENTdDLCAweEQ1ODQsIDB4RDU4NSwgMHhENTg3LCAweEQ1ODgsIDB4RDU4OSwKKyAgICAweEQ1OTAsIDB4RDVBNSwgMHhENUM4LCAweEQ1QzksIDB4RDVDQywgMHhENUQwLCAweEQ1RDIsIDB4RDVEOCwgMHhENUQ5LAorICAgIDB4RDVEQiwgMHhENURELCAweEQ1RTQsIDB4RDVFNSwgMHhENUU4LCAweEQ1RUMsIDB4RDVGNCwgMHhENUY1LCAweEQ1RjcsCisgICAgMHhENUY5LCAweEQ2MDAsIDB4RDYwMSwgMHhENjA0LCAweEQ2MDgsIDB4RDYxMCwgMHhENjExLCAweEQ2MTMsIDB4RDYxNCwKKyAgICAweEQ2MTUsIDB4RDYxQywgMHhENjIwLCAweEQ2MjQsIDB4RDYyRCwgMHhENjM4LCAweEQ2MzksIDB4RDYzQywgMHhENjQwLAorICAgIDB4RDY0NSwgMHhENjQ4LCAweEQ2NDksIDB4RDY0QiwgMHhENjRELCAweEQ2NTEsIDB4RDY1NCwgMHhENjU1LCAweEQ2NTgsCisgICAgMHhENjVDLCAweEQ2NjcsIDB4RDY2OSwgMHhENjcwLCAweEQ2NzEsIDB4RDY3NCwgMHhENjgzLCAweEQ2ODUsIDB4RDY4QywKKyAgICAweEQ2OEQsIDB4RDY5MCwgMHhENjk0LCAweEQ2OUQsIDB4RDY5RiwgMHhENkExLCAweEQ2QTgsIDB4RDZBQywgMHhENkIwLAorICAgIDB4RDZCOSwgMHhENkJCLCAweEQ2QzQsIDB4RDZDNSwgMHhENkM4LCAweEQ2Q0MsIDB4RDZEMSwgMHhENkQ0LCAweEQ2RDcsCisgICAgMHhENkQ5LCAweEQ2RTAsIDB4RDZFNCwgMHhENkU4LCAweEQ2RjAsIDB4RDZGNSwgMHhENkZDLCAweEQ2RkQsIDB4RDcwMCwKKyAgICAweEQ3MDQsIDB4RDcxMSwgMHhENzE4LCAweEQ3MTksIDB4RDcxQywgMHhENzIwLCAweEQ3MjgsIDB4RDcyOSwgMHhENzJCLAorICAgIDB4RDcyRCwgMHhENzM0LCAweEQ3MzUsIDB4RDczOCwgMHhENzNDLCAweEQ3NDQsIDB4RDc0NywgMHhENzQ5LCAweEQ3NTAsCisgICAgMHhENzUxLCAweEQ3NTQsIDB4RDc1NiwgMHhENzU3LCAweEQ3NTgsIDB4RDc1OSwgMHhENzYwLCAweEQ3NjEsIDB4RDc2MywKKyAgICAweEQ3NjUsIDB4RDc2OSwgMHhENzZDLCAweEQ3NzAsIDB4RDc3NCwgMHhENzdDLCAweEQ3N0QsIDB4RDc4MSwgMHhENzg4LAorICAgIDB4RDc4OSwgMHhENzhDLCAweEQ3OTAsIDB4RDc5OCwgMHhENzk5LCAweEQ3OUIsIDB4RDc5RCwgMHg0RjNELCAweDRGNzMsCisgICAgMHg1MDQ3LCAweDUwRjksIDB4NTJBMCwgMHg1M0VGLCAweDU0NzUsIDB4NTRFNSwgMHg1NjA5LCAweDVBQzEsIDB4NUJCNiwKKyAgICAweDY2ODcsIDB4NjdCNiwgMHg2N0I3LCAweDY3RUYsIDB4NkI0QywgMHg3M0MyLCAweDc1QzIsIDB4N0EzQywgMHg4MkRCLAorICAgIDB4ODMwNCwgMHg4ODU3LCAweDg4ODgsIDB4OEEzNiwgMHg4Q0M4LCAweDhEQ0YsIDB4OEVGQiwgMHg4RkU2LCAweDk5RDUsCisgICAgMHg1MjNCLCAweDUzNzQsIDB4NTQwNCwgMHg2MDZBLCAweDYxNjQsIDB4NkJCQywgMHg3M0NGLCAweDgxMUEsIDB4ODlCQSwKKyAgICAweDg5RDIsIDB4OTVBMywgMHg0RjgzLCAweDUyMEEsIDB4NThCRSwgMHg1OTc4LCAweDU5RTYsIDB4NUU3MiwgMHg1RTc5LAorICAgIDB4NjFDNywgMHg2M0MwLCAweDY3NDYsIDB4NjdFQywgMHg2ODdGLCAweDZGOTcsIDB4NzY0RSwgMHg3NzBCLCAweDc4RjUsCisgICAgMHg3QTA4LCAweDdBRkYsIDB4N0MyMSwgMHg4MDlELCAweDgyNkUsIDB4ODI3MSwgMHg4QUVCLCAweDk1OTMsIDB4NEU2QiwKKyAgICAweDU1OUQsIDB4NjZGNywgMHg2RTM0LCAweDc4QTMsIDB4N0FFRCwgMHg4NDVCLCAweDg5MTAsIDB4ODc0RSwgMHg5N0E4LAorICAgIDB4NTJEOCwgMHg1NzRFLCAweDU4MkEsIDB4NUQ0QywgMHg2MTFGLCAweDYxQkUsIDB4NjIyMSwgMHg2NTYyLCAweDY3RDEsCisgICAgMHg2QTQ0LCAweDZFMUIsIDB4NzUxOCwgMHg3NUIzLCAweDc2RTMsIDB4NzdCMCwgMHg3RDNBLCAweDkwQUYsIDB4OTQ1MSwKKyAgICAweDk0NTIsIDB4OUY5NSwgMHg1MzIzLCAweDVDQUMsIDB4NzUzMiwgMHg4MERCLCAweDkyNDAsIDB4OTU5OCwgMHg1MjVCLAorICAgIDB4NTgwOCwgMHg1OURDLCAweDVDQTEsIDB4NUQxNywgMHg1RUI3LCAweDVGM0EsIDB4NUY0QSwgMHg2MTc3LCAweDZDNUYsCisgICAgMHg3NTdBLCAweDc1ODYsIDB4N0NFMCwgMHg3RDczLCAweDdEQjEsIDB4N0Y4QywgMHg4MTU0LCAweDgyMjEsIDB4ODU5MSwKKyAgICAweDg5NDEsIDB4OEIxQiwgMHg5MkZDLCAweDk2NEQsIDB4OUM0NywgMHg0RUNCLCAweDRFRjcsIDB4NTAwQiwgMHg1MUYxLAorICAgIDB4NTg0RiwgMHg2MTM3LCAweDYxM0UsIDB4NjE2OCwgMHg2NTM5LCAweDY5RUEsIDB4NkYxMSwgMHg3NUE1LCAweDc2ODYsCisgICAgMHg3NkQ2LCAweDdCODcsIDB4ODJBNSwgMHg4NENCLCAweDkzQTcsIDB4OTU4QiwgMHg1NTgwLCAweDVCQTIsIDB4NTc1MSwKKyAgICAweDdDQjMsIDB4N0ZCOSwgMHg5MUI1LCAweDUwMjgsIDB4NTNCQiwgMHg1QzQ1LCAweDVERTgsIDB4NjJEMiwgMHg2MzZFLAorICAgIDB4NjREQSwgMHg2NEU3LCAweDZFMjAsIDB4NzBBQywgMHg3OTVCLCAweDhEREQsIDB4OEUxRSwgMHg5MDdELCAweDkyNDUsCisgICAgMHg5MkY4LCAweDRFN0UsIDB4NEVGNiwgMHg1MDY1LCAweDVERkUsIDB4NUVGQSwgMHg2MTA2LCAweDY5NTcsIDB4ODE3MSwKKyAgICAweDg2NTQsIDB4OEU0NywgMHg5Mzc1LCAweDlBMkIsIDB4NEU1RSwgMHg1MDkxLCAweDY3NzAsIDB4Njg0MCwgMHg1MTA5LAorICAgIDB4NTI4RCwgMHg1MjkyLCAweDZBQTIsIDB4NzdCQywgMHg5MjEwLCAweDlFRDQsIDB4NTJBQiwgMHg2MDJGLCAweDhGRjIsCisgICAgMHg1MDQ4LCAweDYxQTksIDB4NjNFRCwgMHg2NENBLCAweDY4M0MsIDB4NkE4NCwgMHg2RkMwLCAweDgxODgsIDB4ODlBMSwKKyAgICAweDk2OTQsIDB4NTgwNSwgMHg3MjdELCAweDcyQUMsIDB4NzUwNCwgMHg3RDc5LCAweDdFNkQsIDB4ODBBOSwgMHg4OThCLAorICAgIDB4OEI3NCwgMHg5MDYzLCAweDlENTEsIDB4NjI4OSwgMHg2QzdBLCAweDZGNTQsIDB4N0Q1MCwgMHg3RjNBLCAweDhBMjMsCisgICAgMHg1MTdDLCAweDYxNEEsIDB4N0I5RCwgMHg4QjE5LCAweDkyNTcsIDB4OTM4QywgMHg0RUFDLCAweDRGRDMsIDB4NTAxRSwKKyAgICAweDUwQkUsIDB4NTEwNiwgMHg1MkMxLCAweDUyQ0QsIDB4NTM3RiwgMHg1NzcwLCAweDU4ODMsIDB4NUU5QSwgMHg1RjkxLAorICAgIDB4NjE3NiwgMHg2MUFDLCAweDY0Q0UsIDB4NjU2QywgMHg2NjZGLCAweDY2QkIsIDB4NjZGNCwgMHg2ODk3LCAweDZEODcsCisgICAgMHg3MDg1LCAweDcwRjEsIDB4NzQ5RiwgMHg3NEE1LCAweDc0Q0EsIDB4NzVEOSwgMHg3ODZDLCAweDc4RUMsIDB4N0FERiwKKyAgICAweDdBRjYsIDB4N0Q0NSwgMHg3RDkzLCAweDgwMTUsIDB4ODAzRiwgMHg4MTFCLCAweDgzOTYsIDB4OEI2NiwgMHg4RjE1LAorICAgIDB4OTAxNSwgMHg5M0UxLCAweDk4MDMsIDB4OTgzOCwgMHg5QTVBLCAweDlCRTgsIDB4NEZDMiwgMHg1NTUzLCAweDU4M0EsCisgICAgMHg1OTUxLCAweDVCNjMsIDB4NUM0NiwgMHg2MEI4LCAweDYyMTIsIDB4Njg0MiwgMHg2OEIwLCAweDY4RTgsIDB4NkVBQSwKKyAgICAweDc1NEMsIDB4NzY3OCwgMHg3OENFLCAweDdBM0QsIDB4N0NGQiwgMHg3RTZCLCAweDdFN0MsIDB4OEEwOCwgMHg4QUExLAorICAgIDB4OEMzRiwgMHg5NjhFLCAweDlEQzQsIDB4NTNFNCwgMHg1M0U5LCAweDU0NEEsIDB4NTQ3MSwgMHg1NkZBLCAweDU5RDEsCisgICAgMHg1QjY0LCAweDVDM0IsIDB4NUVBQiwgMHg2MkY3LCAweDY1MzcsIDB4NjU0NSwgMHg2NTcyLCAweDY2QTAsIDB4NjdBRiwKKyAgICAweDY5QzEsIDB4NkNCRCwgMHg3NUZDLCAweDc2OTAsIDB4Nzc3RSwgMHg3QTNGLCAweDdGOTQsIDB4ODAwMywgMHg4MEExLAorICAgIDB4ODE4RiwgMHg4MkU2LCAweDgyRkQsIDB4ODNGMCwgMHg4NUMxLCAweDg4MzEsIDB4ODhCNCwgMHg4QUE1LCAweDhGOUMsCisgICAgMHg5MzJFLCAweDk2QzcsIDB4OTg2NywgMHg5QUQ4LCAweDlGMTMsIDB4NTRFRCwgMHg2NTlCLCAweDY2RjIsIDB4Njg4RiwKKyAgICAweDdBNDAsIDB4OEMzNywgMHg5RDYwLCAweDU2RjAsIDB4NTc2NCwgMHg1RDExLCAweDY2MDYsIDB4NjhCMSwgMHg2OENELAorICAgIDB4NkVGRSwgMHg3NDI4LCAweDg4OUUsIDB4OUJFNCwgMHg2QzY4LCAweDlBQTgsIDB4NEY5QiwgMHg1MTZDLCAweDUxNzEsCisgICAgMHg1MjlGLCAweDVCNTQsIDB4NURFNSwgMHg2MDUwLCAweDYwNkQsIDB4NjJGMSwgMHg2M0E3LCAweDY1M0IsIDB4NzNEOSwKKyAgICAweDdBN0EsIDB4ODZBMywgMHg4Q0EyLCAweDk3OEYsIDB4NEUzMiwgMHg1QkUxLCAweDYyMDgsIDB4Njc5QywgMHg3NERDLAorICAgIDB4NzlEMSwgMHg4M0QzLCAweDhBODcsIDB4OEFCMiwgMHg4REU4LCAweDkwNEUsIDB4OTM0QiwgMHg5ODQ2LCAweDVFRDMsCisgICAgMHg2OUU4LCAweDg1RkYsIDB4OTBFRCwgMHg1MUEwLCAweDVCOTgsIDB4NUJFQywgMHg2MTYzLCAweDY4RkEsIDB4NkIzRSwKKyAgICAweDcwNEMsIDB4NzQyRiwgMHg3NEQ4LCAweDdCQTEsIDB4N0Y1MCwgMHg4M0M1LCAweDg5QzAsIDB4OENBQiwgMHg5NURDLAorICAgIDB4OTkyOCwgMHg1MjJFLCAweDYwNUQsIDB4NjJFQywgMHg5MDAyLCAweDRGOEEsIDB4NTE0OSwgMHg1MzIxLCAweDU4RDksCisgICAgMHg1RUUzLCAweDY2RTAsIDB4NkQzOCwgMHg3MDlBLCAweDcyQzIsIDB4NzNENiwgMHg3QjUwLCAweDgwRjEsIDB4OTQ1QiwKKyAgICAweDUzNjYsIDB4NjM5QiwgMHg3RjZCLCAweDRFNTYsIDB4NTA4MCwgMHg1ODRBLCAweDU4REUsIDB4NjAyQSwgMHg2MTI3LAorICAgIDB4NjJEMCwgMHg2OUQwLCAweDlCNDEsIDB4NUI4RiwgMHg3RDE4LCAweDgwQjEsIDB4OEY1RiwgMHg0RUE0LCAweDUwRDEsCisgICAgMHg1NEFDLCAweDU1QUMsIDB4NUIwQywgMHg1REEwLCAweDVERTcsIDB4NjUyQSwgMHg2NTRFLCAweDY4MjEsIDB4NkE0QiwKKyAgICAweDcyRTEsIDB4NzY4RSwgMHg3N0VGLCAweDdENUUsIDB4N0ZGOSwgMHg4MUEwLCAweDg1NEUsIDB4ODZERiwgMHg4RjAzLAorICAgIDB4OEY0RSwgMHg5MENBLCAweDk5MDMsIDB4OUE1NSwgMHg5QkFCLCAweDRFMTgsIDB4NEU0NSwgMHg0RTVELCAweDRFQzcsCisgICAgMHg0RkYxLCAweDUxNzcsIDB4NTJGRSwgMHg1MzQwLCAweDUzRTMsIDB4NTNFNSwgMHg1NDhFLCAweDU2MTQsIDB4NTc3NSwKKyAgICAweDU3QTIsIDB4NUJDNywgMHg1RDg3LCAweDVFRDAsIDB4NjFGQywgMHg2MkQ4LCAweDY1NTEsIDB4NjdCOCwgMHg2N0U5LAorICAgIDB4NjlDQiwgMHg2QjUwLCAweDZCQzYsIDB4NkJFQywgMHg2QzQyLCAweDZFOUQsIDB4NzA3OCwgMHg3MkQ3LCAweDczOTYsCisgICAgMHg3NDAzLCAweDc3QkYsIDB4NzdFOSwgMHg3QTc2LCAweDdEN0YsIDB4ODAwOSwgMHg4MUZDLCAweDgyMDUsIDB4ODIwQSwKKyAgICAweDgyREYsIDB4ODg2MiwgMHg4QjMzLCAweDhDRkMsIDB4OEVDMCwgMHg5MDExLCAweDkwQjEsIDB4OTI2NCwgMHg5MkI2LAorICAgIDB4OTlEMiwgMHg5QTQ1LCAweDlDRTksIDB4OURENywgMHg5RjlDLCAweDU3MEIsIDB4NUM0MCwgMHg4M0NBLCAweDk3QTAsCisgICAgMHg5N0FCLCAweDlFQjQsIDB4NTQxQiwgMHg3QTk4LCAweDdGQTQsIDB4ODhEOSwgMHg4RUNELCAweDkwRTEsIDB4NTgwMCwKKyAgICAweDVDNDgsIDB4NjM5OCwgMHg3QTlGLCAweDVCQUUsIDB4NUYxMywgMHg3QTc5LCAweDdBQUUsIDB4ODI4RSwgMHg4RUFDLAorICAgIDB4NTAyNiwgMHg1MjM4LCAweDUyRjgsIDB4NTM3NywgMHg1NzA4LCAweDYyRjMsIDB4NjM3MiwgMHg2QjBBLCAweDZEQzMsCisgICAgMHg3NzM3LCAweDUzQTUsIDB4NzM1NywgMHg4NTY4LCAweDhFNzYsIDB4OTVENSwgMHg2NzNBLCAweDZBQzMsIDB4NkY3MCwKKyAgICAweDhBNkQsIDB4OEVDQywgMHg5OTRCLCAweDY2NzcsIDB4NkI3OCwgMHg4Q0I0LCAweDlCM0MsIDB4NTNFQiwgMHg1NzJELAorICAgIDB4NTk0RSwgMHg2M0M2LCAweDY5RkIsIDB4NzNFQSwgMHg3ODQ1LCAweDdBQkEsIDB4N0FDNSwgMHg3Q0ZFLCAweDg0NzUsCisgICAgMHg4OThGLCAweDhENzMsIDB4OTAzNSwgMHg5NUE4LCAweDUyRkIsIDB4NTc0NywgMHg3NTQ3LCAweDdCNjAsIDB4ODNDQywKKyAgICAweDkyMUUsIDB4NkE1OCwgMHg1MTRCLCAweDUyNEIsIDB4NTI4NywgMHg2MjFGLCAweDY4RDgsIDB4Njk3NSwgMHg5Njk5LAorICAgIDB4NTBDNSwgMHg1MkE0LCAweDUyRTQsIDB4NjFDMywgMHg2NUE0LCAweDY4MzksIDB4NjlGRiwgMHg3NDdFLCAweDdCNEIsCisgICAgMHg4MkI5LCAweDgzRUIsIDB4ODlCMiwgMHg4QjM5LCAweDhGRDEsIDB4OTk0OSwgMHg0RUNBLCAweDU5OTcsIDB4NjREMiwKKyAgICAweDY2MTEsIDB4NkE4RSwgMHg3NDM0LCAweDc5ODEsIDB4NzlCRCwgMHg4MkE5LCAweDg4N0UsIDB4ODg3RiwgMHg4OTVGLAorICAgIDB4OTMyNiwgMHg0RjBCLCAweDUzQ0EsIDB4NjAyNSwgMHg2MjcxLCAweDZDNzIsIDB4N0QxQSwgMHg3RDY2LCAweDRFOTgsCisgICAgMHg1MTYyLCAweDc3REMsIDB4ODBBRiwgMHg0RjAxLCAweDRGMEUsIDB4NTE3NiwgMHg1MTgwLCAweDU1REMsIDB4NTY2OCwKKyAgICAweDU3M0IsIDB4NTdGQSwgMHg1N0ZDLCAweDU5MTQsIDB4NTk0NywgMHg1OTkzLCAweDVCQzQsIDB4NUM5MCwgMHg1RDBFLAorICAgIDB4NURGMSwgMHg1RTdFLCAweDVGQ0MsIDB4NjI4MCwgMHg2NUQ3LCAweDY1RTMsIDB4NjcxRSwgMHg2NzFGLCAweDY3NUUsCisgICAgMHg2OENCLCAweDY4QzQsIDB4NkE1RiwgMHg2QjNBLCAweDZDMjMsIDB4NkM3RCwgMHg2QzgyLCAweDZEQzcsIDB4NzM5OCwKKyAgICAweDc0MjYsIDB4NzQyQSwgMHg3NDgyLCAweDc0QTMsIDB4NzU3OCwgMHg3NTdGLCAweDc4ODEsIDB4NzhFRiwgMHg3OTQxLAorICAgIDB4Nzk0NywgMHg3OTQ4LCAweDc5N0EsIDB4N0I5NSwgMHg3RDAwLCAweDdEQkEsIDB4N0Y4OCwgMHg4MDA2LCAweDgwMkQsCisgICAgMHg4MDhDLCAweDhBMTgsIDB4OEI0RiwgMHg4QzQ4LCAweDhENzcsIDB4OTMyMSwgMHg5MzI0LCAweDk4RTIsIDB4OTk1MSwKKyAgICAweDlBMEUsIDB4OUEwRiwgMHg5QTY1LCAweDlFOTIsIDB4N0RDQSwgMHg0Rjc2LCAweDU0MDksIDB4NjJFRSwgMHg2ODU0LAorICAgIDB4OTFEMSwgMHg1NUFCLCAweDUxM0EsIDB4NUExQywgMHg2MUU2LCAweDYyQ0YsIDB4NjJGRiwgMHg5MEEzLCAweDhBRkUsCisgICAgMHg2Njk2LCAweDcxNTYsIDB4OTZFMywgMHg2MzRGLCAweDYzN0EsIDB4NTM1NywgMHg2NzhGLCAweDY5NjAsIDB4NkU3MywKKyAgICAweDc1MzcsIDB4N0QwRCwgMHg4ODcyLCAweDU2Q0EsIDB4NUExOCwgMHg0RTQzLCAweDUxNjcsIDB4NTk0OCwgMHg2N0YwLAorICAgIDB4ODAxMCwgMHg1OTczLCAweDVFNzQsIDB4NjQ5QSwgMHg3OUNBLCAweDVGRjUsIDB4NjA2QywgMHg2MkM4LCAweDYzN0IsCisgICAgMHg1QkU3LCAweDVCRDcsIDB4NTJBQSwgMHg1OTc0LCAweDVGMjksIDB4NjAxMiwgMHg3NDU5LCAweDk5RDEsIDB4NkZDMywKKyAgICAweDgxQkYsIDB4OEZCMiwgMHg2MEYxLCAweDgxNjYsIDB4NUMzRiwgMHg1QUU5LCAweDhBMjUsIDB4Njc3QiwgMHg3RDEwLAorICAgIDB4ODBGRCwgMHg1QzNDLCAweDZDRTUsIDB4NTMzRiwgMHg2RUJBLCAweDU5MUEsIDB4ODMzNiwgMHg0RTM5LCAweDRFQjYsCisgICAgMHg0RjQ2LCAweDU1QUUsIDB4NTcxOCwgMHg1OEM3LCAweDVGNTYsIDB4NjVCNywgMHg2NUU2LCAweDZBODAsIDB4NkJCNSwKKyAgICAweDZFNEQsIDB4NzdFRCwgMHg3QUVGLCAweDdDMUUsIDB4N0RERSwgMHg4NkNCLCAweDg4OTIsIDB4OTEzMiwgMHg5MzVCLAorICAgIDB4NjRCQiwgMHg2RkJFLCAweDczN0EsIDB4NzVCOCwgMHg5MDU0LCAweDU1NTYsIDB4NTc0RCwgMHg2MUJBLCAweDY0RDQsCisgICAgMHg2NkM3LCAweDZERTEsIDB4NkU1QiwgMHg2RjZELCAweDZGQjksIDB4NzVGMCwgMHg4MDQzLCAweDgxQkQsIDB4ODU0MSwKKyAgICAweDg5ODMsIDB4OEFDNywgMHg4QjVBLCAweDkzMUYsIDB4NkM5MywgMHg3NTUzLCAweDdCNTQsIDB4OEUwRiwgMHg5MDVELAorICAgIDB4NTUxMCwgMHg1ODAyLCAweDU4NTgsIDB4NUU2MiwgMHg2MjA3LCAweDY0OUUsIDB4NjhFMCwgMHg3NTc2LCAweDdDRDYsCisgICAgMHg4N0IzLCAweDlFRTgsIDB4NEVFMywgMHg1Nzg4LCAweDU3NkUsIDB4NTkyNywgMHg1QzBELCAweDVDQjEsIDB4NUUzNiwKKyAgICAweDVGODUsIDB4NjIzNCwgMHg2NEUxLCAweDczQjMsIDB4ODFGQSwgMHg4ODhCLCAweDhDQjgsIDB4OTY4QSwgMHg5RURCLAorICAgIDB4NUI4NSwgMHg1RkI3LCAweDYwQjMsIDB4NTAxMiwgMHg1MjAwLCAweDUyMzAsIDB4NTcxNiwgMHg1ODM1LCAweDU4NTcsCisgICAgMHg1QzBFLCAweDVDNjAsIDB4NUNGNiwgMHg1RDhCLCAweDVFQTYsIDB4NUY5MiwgMHg2MEJDLCAweDYzMTEsIDB4NjM4OSwKKyAgICAweDY0MTcsIDB4Njg0MywgMHg2OEY5LCAweDZBQzIsIDB4NkREOCwgMHg2RTIxLCAweDZFRDQsIDB4NkZFNCwgMHg3MUZFLAorICAgIDB4NzZEQywgMHg3Nzc5LCAweDc5QjEsIDB4N0EzQiwgMHg4NDA0LCAweDg5QTksIDB4OENFRCwgMHg4REYzLCAweDhFNDgsCisgICAgMHg5MDAzLCAweDkwMTQsIDB4OTA1MywgMHg5MEZELCAweDkzNEQsIDB4OTY3NiwgMHg5N0RDLCAweDZCRDIsIDB4NzAwNiwKKyAgICAweDcyNTgsIDB4NzJBMiwgMHg3MzY4LCAweDc3NjMsIDB4NzlCRiwgMHg3QkU0LCAweDdFOUIsIDB4OEI4MCwgMHg1OEE5LAorICAgIDB4NjBDNywgMHg2NTY2LCAweDY1RkQsIDB4NjZCRSwgMHg2QzhDLCAweDcxMUUsIDB4NzFDOSwgMHg4QzVBLCAweDk4MTMsCisgICAgMHg0RTZELCAweDdBODEsIDB4NEVERCwgMHg1MUFDLCAweDUxQ0QsIDB4NTJENSwgMHg1NDBDLCAweDYxQTcsIDB4Njc3MSwKKyAgICAweDY4NTAsIDB4NjhERiwgMHg2RDFFLCAweDZGN0MsIDB4NzVCQywgMHg3N0IzLCAweDdBRTUsIDB4ODBGNCwgMHg4NDYzLAorICAgIDB4OTI4NSwgMHg1MTVDLCAweDY1OTcsIDB4Njc1QywgMHg2NzkzLCAweDc1RDgsIDB4N0FDNywgMHg4MzczLCAweDhDNDYsCisgICAgMHg5MDE3LCAweDk4MkQsIDB4NUM2RiwgMHg4MUMwLCAweDgyOUEsIDB4OTA0MSwgMHg5MDZGLCAweDkyMEQsIDB4NUY5NywKKyAgICAweDVEOUQsIDB4NkE1OSwgMHg3MUM4LCAweDc2N0IsIDB4N0I0OSwgMHg4NUU0LCAweDhCMDQsIDB4OTEyNywgMHg5QTMwLAorICAgIDB4NTU4NywgMHg2MUY2LCAweDc2NjksIDB4N0Y4NSwgMHg4NjNGLCAweDg3QkEsIDB4ODhGOCwgMHg5MDhGLCAweDZEMUIsCisgICAgMHg3MEQ5LCAweDczREUsIDB4N0Q2MSwgMHg4NDNELCAweDkxNkEsIDB4OTlGMSwgMHg0RTgyLCAweDUzNzUsIDB4NkIwNCwKKyAgICAweDZCMTIsIDB4NzAzRSwgMHg3MjFCLCAweDg2MkQsIDB4OUUxRSwgMHg1MjRDLCAweDhGQTMsIDB4NUQ1MCwgMHg2NEU1LAorICAgIDB4NjUyQywgMHg2QjE2LCAweDZGRUIsIDB4N0M0MywgMHg3RTlDLCAweDg1Q0QsIDB4ODk2NCwgMHg4OUJELCAweDYyQzksCisgICAgMHg4MUQ4LCAweDg4MUYsIDB4NUVDQSwgMHg2NzE3LCAweDZENkEsIDB4NzJGQywgMHg3NDA1LCAweDc0NkYsIDB4ODc4MiwKKyAgICAweDkwREUsIDB4NEY4NiwgMHg1RDBELCAweDVGQTAsIDB4ODQwQSwgMHg1MUI3LCAweDYzQTAsIDB4NzU2NSwgMHg0RUFFLAorICAgIDB4NTAwNiwgMHg1MTY5LCAweDUxQzksIDB4Njg4MSwgMHg2QTExLCAweDdDQUUsIDB4N0NCMSwgMHg3Q0U3LCAweDgyNkYsCisgICAgMHg4QUQyLCAweDhGMUIsIDB4OTFDRiwgMHg0RkI2LCAweDUxMzcsIDB4NTJGNSwgMHg1NDQyLCAweDVFRUMsIDB4NjE2RSwKKyAgICAweDYyM0UsIDB4NjVDNSwgMHg2QURBLCAweDZGRkUsIDB4NzkyQSwgMHg4NURDLCAweDg4MjMsIDB4OTVBRCwgMHg5QTYyLAorICAgIDB4OUE2QSwgMHg5RTk3LCAweDlFQ0UsIDB4NTI5QiwgMHg2NkM2LCAweDZCNzcsIDB4NzAxRCwgMHg3OTJCLCAweDhGNjIsCisgICAgMHg5NzQyLCAweDYxOTAsIDB4NjIwMCwgMHg2NTIzLCAweDZGMjMsIDB4NzE0OSwgMHg3NDg5LCAweDdERjQsIDB4ODA2RiwKKyAgICAweDg0RUUsIDB4OEYyNiwgMHg5MDIzLCAweDkzNEEsIDB4NTFCRCwgMHg1MjE3LCAweDUyQTMsIDB4NkQwQywgMHg3MEM4LAorICAgIDB4ODhDMiwgMHg1RUM5LCAweDY1ODIsIDB4NkJBRSwgMHg2RkMyLCAweDdDM0UsIDB4NzM3NSwgMHg0RUU0LCAweDRGMzYsCisgICAgMHg1NkY5LCAweDVDQkEsIDB4NURCQSwgMHg2MDFDLCAweDczQjIsIDB4N0IyRCwgMHg3RjlBLCAweDdGQ0UsIDB4ODA0NiwKKyAgICAweDkwMUUsIDB4OTIzNCwgMHg5NkY2LCAweDk3NDgsIDB4OTgxOCwgMHg5RjYxLCAweDRGOEIsIDB4NkZBNywgMHg3OUFFLAorICAgIDB4OTFCNCwgMHg5NkI3LCAweDUyREUsIDB4NjQ4OCwgMHg2NEM0LCAweDZBRDMsIDB4NkY1RSwgMHg3MDE4LCAweDcyMTAsCisgICAgMHg3NkU3LCAweDgwMDEsIDB4ODYwNiwgMHg4NjVDLCAweDhERUYsIDB4OEYwNSwgMHg5NzMyLCAweDlCNkYsIDB4OURGQSwKKyAgICAweDlFNzUsIDB4Nzg4QywgMHg3OTdGLCAweDdEQTAsIDB4ODNDOSwgMHg5MzA0LCAweDlFN0YsIDB4OUU5MywgMHg4QUQ2LAorICAgIDB4NThERiwgMHg1RjA0LCAweDY3MjcsIDB4NzAyNywgMHg3NENGLCAweDdDNjAsIDB4ODA3RSwgMHg1MTIxLCAweDcwMjgsCisgICAgMHg3MjYyLCAweDc4Q0EsIDB4OENDMiwgMHg4Q0RBLCAweDhDRjQsIDB4OTZGNywgMHg0RTg2LCAweDUwREEsIDB4NUJFRSwKKyAgICAweDVFRDYsIDB4NjU5OSwgMHg3MUNFLCAweDc2NDIsIDB4NzdBRCwgMHg4MDRBLCAweDg0RkMsIDB4OTA3QywgMHg5QjI3LAorICAgIDB4OUY4RCwgMHg1OEQ4LCAweDVBNDEsIDB4NUM2MiwgMHg2QTEzLCAweDZEREEsIDB4NkYwRiwgMHg3NjNCLCAweDdEMkYsCisgICAgMHg3RTM3LCAweDg1MUUsIDB4ODkzOCwgMHg5M0U0LCAweDk2NEIsIDB4NTI4OSwgMHg2NUQyLCAweDY3RjMsIDB4NjlCNCwKKyAgICAweDZENDEsIDB4NkU5QywgMHg3MDBGLCAweDc0MDksIDB4NzQ2MCwgMHg3NTU5LCAweDc2MjQsIDB4Nzg2QiwgMHg4QjJDLAorICAgIDB4OTg1RSwgMHg1MTZELCAweDYyMkUsIDB4OTY3OCwgMHg0Rjk2LCAweDUwMkIsIDB4NUQxOSwgMHg2REVBLCAweDdEQjgsCisgICAgMHg4RjJBLCAweDVGOEIsIDB4NjE0NCwgMHg2ODE3LCAweDk2ODYsIDB4NTJEMiwgMHg4MDhCLCAweDUxREMsIDB4NTFDQywKKyAgICAweDY5NUUsIDB4N0ExQywgMHg3REJFLCAweDgzRjEsIDB4OTY3NSwgMHg0RkRBLCAweDUyMjksIDB4NTM5OCwgMHg1NDBGLAorICAgIDB4NTUwRSwgMHg1QzY1LCAweDYwQTcsIDB4Njc0RSwgMHg2OEE4LCAweDZENkMsIDB4NzI4MSwgMHg3MkY4LCAweDc0MDYsCisgICAgMHg3NDgzLCAweDc1RTIsIDB4N0M2QywgMHg3Rjc5LCAweDdGQjgsIDB4ODM4OSwgMHg4OENGLCAweDg4RTEsIDB4OTFDQywKKyAgICAweDkxRDAsIDB4OTZFMiwgMHg5QkM5LCAweDU0MUQsIDB4NkY3RSwgMHg3MUQwLCAweDc0OTgsIDB4ODVGQSwgMHg4RUFBLAorICAgIDB4OTZBMywgMHg5QzU3LCAweDlFOUYsIDB4Njc5NywgMHg2RENCLCAweDc0MzMsIDB4ODFFOCwgMHg5NzE2LCAweDc4MkMsCisgICAgMHg3QUNCLCAweDdCMjAsIDB4N0M5MiwgMHg2NDY5LCAweDc0NkEsIDB4NzVGMiwgMHg3OEJDLCAweDc4RTgsIDB4OTlBQywKKyAgICAweDlCNTQsIDB4OUVCQiwgMHg1QkRFLCAweDVFNTUsIDB4NkYyMCwgMHg4MTlDLCAweDgzQUIsIDB4OTA4OCwgMHg0RTA3LAorICAgIDB4NTM0RCwgMHg1QTI5LCAweDVERDIsIDB4NUY0RSwgMHg2MTYyLCAweDYzM0QsIDB4NjY2OSwgMHg2NkZDLCAweDZFRkYsCisgICAgMHg2RjJCLCAweDcwNjMsIDB4Nzc5RSwgMHg4NDJDLCAweDg1MTMsIDB4ODgzQiwgMHg4RjEzLCAweDk5NDUsIDB4OUMzQiwKKyAgICAweDU1MUMsIDB4NjJCOSwgMHg2NzJCLCAweDZDQUIsIDB4ODMwOSwgMHg4OTZBLCAweDk3N0EsIDB4NEVBMSwgMHg1OTg0LAorICAgIDB4NUZEOCwgMHg1RkQ5LCAweDY3MUIsIDB4N0RCMiwgMHg3RjU0LCAweDgyOTIsIDB4ODMyQiwgMHg4M0JELCAweDhGMUUsCisgICAgMHg5MDk5LCAweDU3Q0IsIDB4NTlCOSwgMHg1QTkyLCAweDVCRDAsIDB4NjYyNywgMHg2NzlBLCAweDY4ODUsIDB4NkJDRiwKKyAgICAweDcxNjQsIDB4N0Y3NSwgMHg4Q0I3LCAweDhDRTMsIDB4OTA4MSwgMHg5QjQ1LCAweDgxMDgsIDB4OEM4QSwgMHg5NjRDLAorICAgIDB4OUE0MCwgMHg5RUE1LCAweDVCNUYsIDB4NkMxMywgMHg3MzFCLCAweDc2RjIsIDB4NzZERiwgMHg4NDBDLCAweDUxQUEsCisgICAgMHg4OTkzLCAweDUxNEQsIDB4NTE5NSwgMHg1MkM5LCAweDY4QzksIDB4NkM5NCwgMHg3NzA0LCAweDc3MjAsIDB4N0RCRiwKKyAgICAweDdERUMsIDB4OTc2MiwgMHg5RUI1LCAweDZFQzUsIDB4ODUxMSwgMHg1MUE1LCAweDU0MEQsIDB4NTQ3RCwgMHg2NjBFLAorICAgIDB4NjY5RCwgMHg2OTI3LCAweDZFOUYsIDB4NzZCRiwgMHg3NzkxLCAweDgzMTcsIDB4ODRDMiwgMHg4NzlGLCAweDkxNjksCisgICAgMHg5Mjk4LCAweDlDRjQsIDB4ODg4MiwgMHg0RkFFLCAweDUxOTIsIDB4NTJERiwgMHg1OUM2LCAweDVFM0QsIDB4NjE1NSwKKyAgICAweDY0NzgsIDB4NjQ3OSwgMHg2NkFFLCAweDY3RDAsIDB4NkEyMSwgMHg2QkNELCAweDZCREIsIDB4NzI1RiwgMHg3MjYxLAorICAgIDB4NzQ0MSwgMHg3NzM4LCAweDc3REIsIDB4ODAxNywgMHg4MkJDLCAweDgzMDUsIDB4OEIwMCwgMHg4QjI4LCAweDhDOEMsCisgICAgMHg2NzI4LCAweDZDOTAsIDB4NzI2NywgMHg3NkVFLCAweDc3NjYsIDB4N0E0NiwgMHg5REE5LCAweDZCN0YsIDB4NkM5MiwKKyAgICAweDU5MjIsIDB4NjcyNiwgMHg4NDk5LCAweDUzNkYsIDB4NTg5MywgMHg1OTk5LCAweDVFREYsIDB4NjNDRiwgMHg2NjM0LAorICAgIDB4Njc3MywgMHg2RTNBLCAweDczMkIsIDB4N0FENywgMHg4MkQ3LCAweDkzMjgsIDB4NTJEOSwgMHg1REVCLCAweDYxQUUsCisgICAgMHg2MUNCLCAweDYyMEEsIDB4NjJDNywgMHg2NEFCLCAweDY1RTAsIDB4Njk1OSwgMHg2QjY2LCAweDZCQ0IsIDB4NzEyMSwKKyAgICAweDczRjcsIDB4NzU1RCwgMHg3RTQ2LCAweDgyMUUsIDB4ODMwMiwgMHg4NTZBLCAweDhBQTMsIDB4OENCRiwgMHg5NzI3LAorICAgIDB4OUQ2MSwgMHg1OEE4LCAweDlFRDgsIDB4NTAxMSwgMHg1MjBFLCAweDU0M0IsIDB4NTU0RiwgMHg2NTg3LCAweDZDNzYsCisgICAgMHg3RDBBLCAweDdEMEIsIDB4ODA1RSwgMHg4NjhBLCAweDk1ODAsIDB4OTZFRiwgMHg1MkZGLCAweDZDOTUsIDB4NzI2OSwKKyAgICAweDU0NzMsIDB4NUE5QSwgMHg1QzNFLCAweDVENEIsIDB4NUY0QywgMHg1RkFFLCAweDY3MkEsIDB4NjhCNiwgMHg2OTYzLAorICAgIDB4NkUzQywgMHg2RTQ0LCAweDc3MDksIDB4N0M3MywgMHg3RjhFLCAweDg1ODcsIDB4OEIwRSwgMHg4RkY3LCAweDk3NjEsCisgICAgMHg5RUY0LCAweDVDQjcsIDB4NjBCNiwgMHg2MTBELCAweDYxQUIsIDB4NjU0RiwgMHg2NUZCLCAweDY1RkMsIDB4NkMxMSwKKyAgICAweDZDRUYsIDB4NzM5RiwgMHg3M0M5LCAweDdERTEsIDB4OTU5NCwgMHg1QkM2LCAweDg3MUMsIDB4OEIxMCwgMHg1MjVELAorICAgIDB4NTM1QSwgMHg2MkNELCAweDY0MEYsIDB4NjRCMiwgMHg2NzM0LCAweDZBMzgsIDB4NkNDQSwgMHg3M0MwLCAweDc0OUUsCisgICAgMHg3Qjk0LCAweDdDOTUsIDB4N0UxQiwgMHg4MThBLCAweDgyMzYsIDB4ODU4NCwgMHg4RkVCLCAweDk2RjksIDB4OTlDMSwKKyAgICAweDRGMzQsIDB4NTM0QSwgMHg1M0NELCAweDUzREIsIDB4NjJDQywgMHg2NDJDLCAweDY1MDAsIDB4NjU5MSwgMHg2OUMzLAorICAgIDB4NkNFRSwgMHg2RjU4LCAweDczRUQsIDB4NzU1NCwgMHg3NjIyLCAweDc2RTQsIDB4NzZGQywgMHg3OEQwLCAweDc4RkIsCisgICAgMHg3OTJDLCAweDdENDYsIDB4ODIyQywgMHg4N0UwLCAweDhGRDQsIDB4OTgxMiwgMHg5OEVGLCAweDUyQzMsIDB4NjJENCwKKyAgICAweDY0QTUsIDB4NkUyNCwgMHg2RjUxLCAweDc2N0MsIDB4OERDQiwgMHg5MUIxLCAweDkyNjIsIDB4OUFFRSwgMHg5QjQzLAorICAgIDB4NTAyMywgMHg1MDhELCAweDU3NEEsIDB4NTlBOCwgMHg1QzI4LCAweDVFNDcsIDB4NUY3NywgMHg2MjNGLCAweDY1M0UsCisgICAgMHg2NUI5LCAweDY1QzEsIDB4NjYwOSwgMHg2NzhCLCAweDY5OUMsIDB4NkVDMiwgMHg3OEM1LCAweDdEMjEsIDB4ODBBQSwKKyAgICAweDgxODAsIDB4ODIyQiwgMHg4MkIzLCAweDg0QTEsIDB4ODY4QywgMHg4QTJBLCAweDhCMTcsIDB4OTBBNiwgMHg5NjMyLAorICAgIDB4OUY5MCwgMHg1MDBELCAweDRGRjMsIDB4NTdGOSwgMHg1Rjk4LCAweDYyREMsIDB4NjM5MiwgMHg2NzZGLCAweDZFNDMsCisgICAgMHg3MTE5LCAweDc2QzMsIDB4ODBDQywgMHg4MERBLCAweDg4RjQsIDB4ODhGNSwgMHg4OTE5LCAweDhDRTAsIDB4OEYyOSwKKyAgICAweDkxNEQsIDB4OTY2QSwgMHg0RjJGLCAweDRGNzAsIDB4NUUxQiwgMHg2N0NGLCAweDY4MjIsIDB4NzY3RCwgMHg3NjdFLAorICAgIDB4OUI0NCwgMHg1RTYxLCAweDZBMEEsIDB4NzE2OSwgMHg3MUQ0LCAweDc1NkEsIDB4N0U0MSwgMHg4NTQzLCAweDg1RTksCisgICAgMHg5OERDLCAweDRGMTAsIDB4N0I0RiwgMHg3RjcwLCAweDk1QTUsIDB4NTFFMSwgMHg1RTA2LCAweDY4QjUsIDB4NkMzRSwKKyAgICAweDZDNEUsIDB4NkNEQiwgMHg3MkFGLCAweDdCQzQsIDB4ODMwMywgMHg2Q0Q1LCAweDc0M0EsIDB4NTBGQiwgMHg1Mjg4LAorICAgIDB4NThDMSwgMHg2NEQ4LCAweDZBOTcsIDB4NzRBNywgMHg3NjU2LCAweDc4QTcsIDB4ODYxNywgMHg5NUUyLCAweDk3MzksCisgICAgMHg1MzVFLCAweDVGMDEsIDB4OEI4QSwgMHg4RkE4LCAweDhGQUYsIDB4OTA4QSwgMHg1MjI1LCAweDc3QTUsIDB4OUM0OSwKKyAgICAweDlGMDgsIDB4NEUxOSwgMHg1MDAyLCAweDUxNzUsIDB4NUM1QiwgMHg1RTc3LCAweDY2MUUsIDB4NjYzQSwgMHg2N0M0LAorICAgIDB4NjhDNSwgMHg3MEIzLCAweDc1MDEsIDB4NzVDNSwgMHg3OUM5LCAweDdBREQsIDB4OEYyNywgMHg5OTIwLCAweDlBMDgsCisgICAgMHg0RkRELCAweDU4MjEsIDB4NTgzMSwgMHg1QkY2LCAweDY2NkUsIDB4NkI2NSwgMHg2RDExLCAweDZFN0EsIDB4NkY3RCwKKyAgICAweDczRTQsIDB4NzUyQiwgMHg4M0U5LCAweDg4REMsIDB4ODkxMywgMHg4QjVDLCAweDhGMTQsIDB4NEYwRiwgMHg1MEQ1LAorICAgIDB4NTMxMCwgMHg1MzVDLCAweDVCOTMsIDB4NUZBOSwgMHg2NzBELCAweDc5OEYsIDB4ODE3OSwgMHg4MzJGLCAweDg1MTQsCisgICAgMHg4OTA3LCAweDg5ODYsIDB4OEYzOSwgMHg4RjNCLCAweDk5QTUsIDB4OUMxMiwgMHg2NzJDLCAweDRFNzYsIDB4NEZGOCwKKyAgICAweDU5NDksIDB4NUMwMSwgMHg1Q0VGLCAweDVDRjAsIDB4NjM2NywgMHg2OEQyLCAweDcwRkQsIDB4NzFBMiwgMHg3NDJCLAorICAgIDB4N0UyQiwgMHg4NEVDLCAweDg3MDIsIDB4OTAyMiwgMHg5MkQyLCAweDlDRjMsIDB4NEUwRCwgMHg0RUQ4LCAweDRGRUYsCisgICAgMHg1MDg1LCAweDUyNTYsIDB4NTI2RiwgMHg1NDI2LCAweDU0OTAsIDB4NTdFMCwgMHg1OTJCLCAweDVBNjYsIDB4NUI1QSwKKyAgICAweDVCNzUsIDB4NUJDQywgMHg1RTlDLCAweDYyNzYsIDB4NjU3NywgMHg2NUE3LCAweDZENkUsIDB4NkVBNSwgMHg3MjM2LAorICAgIDB4N0IyNiwgMHg3QzNGLCAweDdGMzYsIDB4ODE1MCwgMHg4MTUxLCAweDgxOUEsIDB4ODI0MCwgMHg4Mjk5LCAweDgzQTksCisgICAgMHg4QTAzLCAweDhDQTAsIDB4OENFNiwgMHg4Q0ZCLCAweDhENzQsIDB4OERCQSwgMHg5MEU4LCAweDkxREMsIDB4OTYxQywKKyAgICAweDk2NDQsIDB4OTlEOSwgMHg5Q0U3LCAweDUzMTcsIDB4NTIwNiwgMHg1NDI5LCAweDU2NzQsIDB4NThCMywgMHg1OTU0LAorICAgIDB4NTk2RSwgMHg1RkZGLCAweDYxQTQsIDB4NjI2RSwgMHg2NjEwLCAweDZDN0UsIDB4NzExQSwgMHg3NkM2LCAweDdDODksCisgICAgMHg3Q0RFLCAweDdEMUIsIDB4ODJBQywgMHg4Q0MxLCAweDk2RjAsIDB4NEY1QiwgMHg1RjE3LCAweDVGN0YsIDB4NjJDMiwKKyAgICAweDVEMjksIDB4NjcwQiwgMHg2OERBLCAweDc4N0MsIDB4N0U0MywgMHg5RDZDLCAweDRFMTUsIDB4NTA5OSwgMHg1MzE1LAorICAgIDB4NTMyQSwgMHg1MzUxLCAweDU5ODMsIDB4NUE2MiwgMHg1RTg3LCAweDYwQjIsIDB4NjE4QSwgMHg2MjQ5LCAweDYyNzksCisgICAgMHg2NTkwLCAweDY3ODcsIDB4NjlBNywgMHg2QkQ0LCAweDZCRDYsIDB4NkJENywgMHg2QkQ4LCAweDZDQjgsIDB4NzQzNSwKKyAgICAweDc1RkEsIDB4NzgxMiwgMHg3ODkxLCAweDc5RDUsIDB4NzlEOCwgMHg3QzgzLCAweDdEQ0IsIDB4N0ZFMSwgMHg4MEE1LAorICAgIDB4ODEzRSwgMHg4MUMyLCAweDgzRjIsIDB4ODcxQSwgMHg4OEU4LCAweDhBQjksIDB4OEI2QywgMHg4Q0JCLCAweDkxMTksCisgICAgMHg5NzVFLCAweDk4REIsIDB4OUYzQiwgMHg1NkFDLCAweDVCMkEsIDB4NUY2QywgMHg2NThDLCAweDZBQjMsIDB4NkJBRiwKKyAgICAweDZENUMsIDB4NkZGMSwgMHg3MDE1LCAweDcyNUQsIDB4NzNBRCwgMHg4Q0E3LCAweDhDRDMsIDB4OTgzQiwgMHg2MTkxLAorICAgIDB4NkMzNywgMHg4MDU4LCAweDlBMDEsIDB4NEU0RCwgMHg0RThCLCAweDRFOUIsIDB4NEVENSwgMHg0RjNBLCAweDRGM0MsCisgICAgMHg0RjdGLCAweDRGREYsIDB4NTBGRiwgMHg1M0YyLCAweDUzRjgsIDB4NTUwNiwgMHg1NUUzLCAweDU2REIsIDB4NThFQiwKKyAgICAweDU5NjIsIDB4NUExMSwgMHg1QkVCLCAweDVCRkEsIDB4NUMwNCwgMHg1REYzLCAweDVFMkIsIDB4NUY5OSwgMHg2MDFELAorICAgIDB4NjM2OCwgMHg2NTlDLCAweDY1QUYsIDB4NjdGNiwgMHg2N0ZCLCAweDY4QUQsIDB4NkI3QiwgMHg2Qzk5LCAweDZDRDcsCisgICAgMHg2RTIzLCAweDcwMDksIDB4NzM0NSwgMHg3ODAyLCAweDc5M0UsIDB4Nzk0MCwgMHg3OTYwLCAweDc5QzEsIDB4N0JFOSwKKyAgICAweDdEMTcsIDB4N0Q3MiwgMHg4MDg2LCAweDgyMEQsIDB4ODM4RSwgMHg4NEQxLCAweDg2QzcsIDB4ODhERiwgMHg4QTUwLAorICAgIDB4OEE1RSwgMHg4QjFELCAweDhDREMsIDB4OEQ2NiwgMHg4RkFELCAweDkwQUEsIDB4OThGQywgMHg5OURGLCAweDlFOUQsCisgICAgMHg1MjRBLCAweDY3MTQsIDB4NTA5OCwgMHg1MjJBLCAweDVDNzEsIDB4NjU2MywgMHg2QzU1LCAweDczQ0EsIDB4NzUyMywKKyAgICAweDc1OUQsIDB4N0I5NywgMHg4NDlDLCAweDkxNzgsIDB4OTczMCwgMHg0RTc3LCAweDY0OTIsIDB4NkJCQSwgMHg3MTVFLAorICAgIDB4ODVBOSwgMHg0RTA5LCAweDY3NDksIDB4NjhFRSwgMHg2RTE3LCAweDgyOUYsIDB4ODUxOCwgMHg4ODZCLCAweDYzRjcsCisgICAgMHg2RjgxLCAweDkyMTIsIDB4OThBRiwgMHg0RTBBLCAweDUwQjcsIDB4NTBDRiwgMHg1MTFGLCAweDU1NDYsIDB4NTVBQSwKKyAgICAweDU2MTcsIDB4NUI0MCwgMHg1QzE5LCAweDVDRTAsIDB4NUUzOCwgMHg1RThBLCAweDVFQTAsIDB4NUVDMiwgMHg2MEYzLAorICAgIDB4Njg1MSwgMHg2QTYxLCAweDZFNTgsIDB4NzIzRCwgMHg3MjQwLCAweDcyQzAsIDB4NzZGOCwgMHg3OTY1LCAweDdCQjEsCisgICAgMHg3RkQ0LCAweDg4RjMsIDB4ODlGNCwgMHg4QTczLCAweDhDNjEsIDB4OENERSwgMHg5NzFDLCAweDU4NUUsIDB4NzRCRCwKKyAgICAweDhDRkQsIDB4NTVDNywgMHg3QTYxLCAweDdEMjIsIDB4ODI3MiwgMHg3MjcyLCAweDc1MUYsIDB4NzUyNSwgMHg3QjE5LAorICAgIDB4NTg4NSwgMHg1OEZCLCAweDVEQkMsIDB4NUU4RiwgMHg1RUI2LCAweDVGOTAsIDB4NjA1NSwgMHg2MjkyLCAweDYzN0YsCisgICAgMHg2NTRELCAweDY2OTEsIDB4NjZEOSwgMHg2NkY4LCAweDY4MTYsIDB4NjhGMiwgMHg3MjgwLCAweDc0NUUsIDB4N0I2RSwKKyAgICAweDdENkUsIDB4N0RENiwgMHg3RjcyLCAweDgwRTUsIDB4ODIxMiwgMHg4NUFGLCAweDg5N0YsIDB4OEE5MywgMHg5MDFELAorICAgIDB4OTJFNCwgMHg5RUNELCAweDlGMjAsIDB4NTkxNSwgMHg1OTZELCAweDVFMkQsIDB4NjBEQywgMHg2NjE0LCAweDY2NzMsCisgICAgMHg2NzkwLCAweDZDNTAsIDB4NkRDNSwgMHg2RjVGLCAweDc3RjMsIDB4NzhBOSwgMHg4NEM2LCAweDkxQ0IsIDB4OTMyQiwKKyAgICAweDRFRDksIDB4NTBDQSwgMHg1MTQ4LCAweDU1ODQsIDB4NUIwQiwgMHg1QkEzLCAweDYyNDcsIDB4NjU3RSwgMHg2NUNCLAorICAgIDB4NkUzMiwgMHg3MTdELCAweDc0MDEsIDB4NzQ0NCwgMHg3NDg3LCAweDc0QkYsIDB4NzY2QywgMHg3OUFBLCAweDdEREEsCisgICAgMHg3RTU1LCAweDdGQTgsIDB4ODE3QSwgMHg4MUIzLCAweDgyMzksIDB4ODYxQSwgMHg4N0VDLCAweDhBNzUsIDB4OERFMywKKyAgICAweDkwNzgsIDB4OTI5MSwgMHg5NDI1LCAweDk5NEQsIDB4OUJBRSwgMHg1MzY4LCAweDVDNTEsIDB4Njk1NCwgMHg2Q0M0LAorICAgIDB4NkQyOSwgMHg2RTJCLCAweDgyMEMsIDB4ODU5QiwgMHg4OTNCLCAweDhBMkQsIDB4OEFBQSwgMHg5NkVBLCAweDlGNjcsCisgICAgMHg1MjYxLCAweDY2QjksIDB4NkJCMiwgMHg3RTk2LCAweDg3RkUsIDB4OEQwRCwgMHg5NTgzLCAweDk2NUQsIDB4NjUxRCwKKyAgICAweDZEODksIDB4NzFFRSwgMHg1N0NFLCAweDU5RDMsIDB4NUJBQywgMHg2MDI3LCAweDYwRkEsIDB4NjIxMCwgMHg2NjFGLAorICAgIDB4NjY1RiwgMHg3MzI5LCAweDczRjksIDB4NzZEQiwgMHg3NzAxLCAweDdCNkMsIDB4ODA1NiwgMHg4MDcyLCAweDgxNjUsCisgICAgMHg4QUEwLCAweDkxOTIsIDB4NEUxNiwgMHg1MkUyLCAweDZCNzIsIDB4NkQxNywgMHg3QTA1LCAweDdCMzksIDB4N0QzMCwKKyAgICAweDhDQjAsIDB4NTNFQywgMHg1NjJGLCAweDU4NTEsIDB4NUJCNSwgMHg1QzBGLCAweDVDMTEsIDB4NURFMiwgMHg2MjQwLAorICAgIDB4NjM4MywgMHg2NDE0LCAweDY2MkQsIDB4NjhCMywgMHg2Q0JDLCAweDZEODgsIDB4NkVBRiwgMHg3MDFGLCAweDcwQTQsCisgICAgMHg3MUQyLCAweDc1MjYsIDB4NzU4RiwgMHg3NThFLCAweDc2MTksIDB4N0IxMSwgMHg3QkUwLCAweDdDMkIsIDB4N0QyMCwKKyAgICAweDdEMzksIDB4ODUyQywgMHg4NTZELCAweDg2MDcsIDB4OEEzNCwgMHg5MDBELCAweDkwNjEsIDB4OTBCNSwgMHg5MkI3LAorICAgIDB4OTdGNiwgMHg5QTM3LCAweDRGRDcsIDB4NUM2QywgMHg2NzVGLCAweDZEOTEsIDB4N0M5RiwgMHg3RThDLCAweDhCMTYsCisgICAgMHg4RDE2LCAweDkwMUYsIDB4NUI2QiwgMHg1REZELCAweDY0MEQsIDB4ODRDMCwgMHg5MDVDLCAweDk4RTEsIDB4NzM4NywKKyAgICAweDVCOEIsIDB4NjA5QSwgMHg2NzdFLCAweDZEREUsIDB4OEExRiwgMHg4QUE2LCAweDkwMDEsIDB4OTgwQywgMHg1MjM3LAorICAgIDB4NzA1MSwgMHg3ODhFLCAweDkzOTYsIDB4ODg3MCwgMHg5MUQ3LCAweDRGRUUsIDB4NTNENywgMHg1NUZELCAweDU2REEsCisgICAgMHg1NzgyLCAweDU4RkQsIDB4NUFDMiwgMHg1Qjg4LCAweDVDQUIsIDB4NUNDMCwgMHg1RTI1LCAweDYxMDEsIDB4NjIwRCwKKyAgICAweDYyNEIsIDB4NjM4OCwgMHg2NDFDLCAweDY1MzYsIDB4NjU3OCwgMHg2QTM5LCAweDZCOEEsIDB4NkMzNCwgMHg2RDE5LAorICAgIDB4NkYzMSwgMHg3MUU3LCAweDcyRTksIDB4NzM3OCwgMHg3NDA3LCAweDc0QjIsIDB4NzYyNiwgMHg3NzYxLCAweDc5QzAsCisgICAgMHg3QTU3LCAweDdBRUEsIDB4N0NCOSwgMHg3RDhGLCAweDdEQUMsIDB4N0U2MSwgMHg3RjlFLCAweDgxMjksIDB4ODMzMSwKKyAgICAweDg0OTAsIDB4ODREQSwgMHg4NUVBLCAweDg4OTYsIDB4OEFCMCwgMHg4QjkwLCAweDhGMzgsIDB4OTA0MiwgMHg5MDgzLAorICAgIDB4OTE2QywgMHg5Mjk2LCAweDkyQjksIDB4OTY4QiwgMHg5NkE3LCAweDk2QTgsIDB4OTZENiwgMHg5NzAwLCAweDk4MDgsCisgICAgMHg5OTk2LCAweDlBRDMsIDB4OUIxQSwgMHg1M0Q0LCAweDU4N0UsIDB4NTkxOSwgMHg1QjcwLCAweDVCQkYsIDB4NkREMSwKKyAgICAweDZGNUEsIDB4NzE5RiwgMHg3NDIxLCAweDc0QjksIDB4ODA4NSwgMHg4M0ZELCAweDVERTEsIDB4NUY4NywgMHg1RkFBLAorICAgIDB4NjA0MiwgMHg2NUVDLCAweDY4MTIsIDB4Njk2RiwgMHg2QTUzLCAweDZCODksIDB4NkQzNSwgMHg2REYzLCAweDczRTMsCisgICAgMHg3NkZFLCAweDc3QUMsIDB4N0I0RCwgMHg3RDE0LCAweDgxMjMsIDB4ODIxQywgMHg4MzQwLCAweDg0RjQsIDB4ODU2MywKKyAgICAweDhBNjIsIDB4OEFDNCwgMHg5MTg3LCAweDkzMUUsIDB4OTgwNiwgMHg5OUI0LCAweDYyMEMsIDB4ODg1MywgMHg4RkYwLAorICAgIDB4OTI2NSwgMHg1RDA3LCAweDVEMjcsIDB4NUQ2OSwgMHg3NDVGLCAweDgxOUQsIDB4ODc2OCwgMHg2RkQ1LCAweDYyRkUsCisgICAgMHg3RkQyLCAweDg5MzYsIDB4ODk3MiwgMHg0RTFFLCAweDRFNTgsIDB4NTBFNywgMHg1MkRELCAweDUzNDcsIDB4NjI3RiwKKyAgICAweDY2MDcsIDB4N0U2OSwgMHg4ODA1LCAweDk2NUUsIDB4NEY4RCwgMHg1MzE5LCAweDU2MzYsIDB4NTlDQiwgMHg1QUE0LAorICAgIDB4NUMzOCwgMHg1QzRFLCAweDVDNEQsIDB4NUUwMiwgMHg1RjExLCAweDYwNDMsIDB4NjVCRCwgMHg2NjJGLCAweDY2NDIsCisgICAgMHg2N0JFLCAweDY3RjQsIDB4NzMxQywgMHg3N0UyLCAweDc5M0EsIDB4N0ZDNSwgMHg4NDk0LCAweDg0Q0QsIDB4ODk5NiwKKyAgICAweDhBNjYsIDB4OEE2OSwgMHg4QUUxLCAweDhDNTUsIDB4OEM3QSwgMHg1N0Y0LCAweDVCRDQsIDB4NUYwRiwgMHg2MDZGLAorICAgIDB4NjJFRCwgMHg2OTBELCAweDZCOTYsIDB4NkU1QywgMHg3MTg0LCAweDdCRDIsIDB4ODc1NSwgMHg4QjU4LCAweDhFRkUsCisgICAgMHg5OERGLCAweDk4RkUsIDB4NEYzOCwgMHg0RjgxLCAweDRGRTEsIDB4NTQ3QiwgMHg1QTIwLCAweDVCQjgsIDB4NjEzQywKKyAgICAweDY1QjAsIDB4NjY2OCwgMHg3MUZDLCAweDc1MzMsIDB4Nzk1RSwgMHg3RDMzLCAweDgxNEUsIDB4ODFFMywgMHg4Mzk4LAorICAgIDB4ODVBQSwgMHg4NUNFLCAweDg3MDMsIDB4OEEwQSwgMHg4RUFCLCAweDhGOUIsIDB4OEZDNSwgMHg1OTMxLCAweDVCQTQsCisgICAgMHg1QkU2LCAweDYwODksIDB4NUJFOSwgMHg1QzBCLCAweDVGQzMsIDB4NkM4MSwgMHg2REYxLCAweDcwMEIsIDB4NzUxQSwKKyAgICAweDgyQUYsIDB4OEFGNiwgMHg0RUMwLCAweDUzNDEsIDB4OTZEOSwgMHg2QzBGLCAweDRFOUUsIDB4NEZDNCwgMHg1MTUyLAorICAgIDB4NTU1RSwgMHg1QTI1LCAweDVDRTgsIDB4NjIxMSwgMHg3MjU5LCAweDgyQkQsIDB4ODNBQSwgMHg4NkZFLCAweDg4NTksCisgICAgMHg4QTFELCAweDk2M0YsIDB4OTZDNSwgMHg5OTEzLCAweDlEMDksIDB4OUQ1RCwgMHg1ODBBLCAweDVDQjMsIDB4NURCRCwKKyAgICAweDVFNDQsIDB4NjBFMSwgMHg2MTE1LCAweDYzRTEsIDB4NkEwMiwgMHg2RTI1LCAweDkxMDIsIDB4OTM1NCwgMHg5ODRFLAorICAgIDB4OUMxMCwgMHg5Rjc3LCAweDVCODksIDB4NUNCOCwgMHg2MzA5LCAweDY2NEYsIDB4Njg0OCwgMHg3NzNDLCAweDk2QzEsCisgICAgMHg5NzhELCAweDk4NTQsIDB4OUI5RiwgMHg2NUExLCAweDhCMDEsIDB4OEVDQiwgMHg5NUJDLCAweDU1MzUsIDB4NUNBOSwKKyAgICAweDVERDYsIDB4NUVCNSwgMHg2Njk3LCAweDc2NEMsIDB4ODNGNCwgMHg5NUM3LCAweDU4RDMsIDB4NjJCQywgMHg3MkNFLAorICAgIDB4OUQyOCwgMHg0RUYwLCAweDU5MkUsIDB4NjAwRiwgMHg2NjNCLCAweDZCODMsIDB4NzlFNywgMHg5RDI2LCAweDUzOTMsCisgICAgMHg1NEMwLCAweDU3QzMsIDB4NUQxNiwgMHg2MTFCLCAweDY2RDYsIDB4NkRBRiwgMHg3ODhELCAweDgyN0UsIDB4OTY5OCwKKyAgICAweDk3NDQsIDB4NTM4NCwgMHg2MjdDLCAweDYzOTYsIDB4NkRCMiwgMHg3RTBBLCAweDgxNEIsIDB4OTg0RCwgMHg2QUZCLAorICAgIDB4N0Y0QywgMHg5REFGLCAweDlFMUEsIDB4NEU1RiwgMHg1MDNCLCAweDUxQjYsIDB4NTkxQywgMHg2MEY5LCAweDYzRjYsCisgICAgMHg2OTMwLCAweDcyM0EsIDB4ODAzNiwgMHg5MUNFLCAweDVGMzEsIDB4N0QwNCwgMHg4MkU1LCAweDg0NkYsIDB4ODRCQiwKKyAgICAweDg1RTUsIDB4OEU4RCwgMHg0RjZGLCAweDU4RTQsIDB4NUI0MywgMHg2MDU5LCAweDYzREEsIDB4NjUxOCwgMHg2NTZELAorICAgIDB4NjY5OCwgMHg2OTRBLCAweDZBMjMsIDB4NkQwQiwgMHg3MDAxLCAweDcxNkMsIDB4NzVEMiwgMHg3NjBELCAweDc5QjMsCisgICAgMHg3QTcwLCAweDdGOEEsIDB4ODk0NCwgMHg4QjkzLCAweDkxQzAsIDB4OTY3RCwgMHg5OTBBLCAweDU3MDQsIDB4NUZBMSwKKyAgICAweDY1QkMsIDB4NkYwMSwgMHg3NjAwLCAweDc5QTYsIDB4OEE5RSwgMHg5OUFELCAweDlCNUEsIDB4OUY2QywgMHg1MTA0LAorICAgIDB4NjFCNiwgMHg2MjkxLCAweDZBOEQsIDB4ODFDNiwgMHg1MDQzLCAweDU4MzAsIDB4NUY2NiwgMHg3MTA5LCAweDhBMDAsCisgICAgMHg4QUZBLCAweDVCN0MsIDB4ODYxNiwgMHg0RkZBLCAweDUxM0MsIDB4NTZCNCwgMHg1OTQ0LCAweDYzQTksIDB4NkRGOSwKKyAgICAweDVEQUEsIDB4Njk2RCwgMHg1MTg2LCAweDRFODgsIDB4NEY1OSwgMHg1OTgyLCAweDZCNUYsIDB4NkM1RCwgMHg3NEI1LAorICAgIDB4NzkxNiwgMHg4MjA3LCAweDgyNDUsIDB4ODMzOSwgMHg4RjNGLCAweDhGNUQsIDB4OTkxOCwgMHg0RUE2LCAweDU3REYsCisgICAgMHg1Rjc5LCAweDY2MTMsIDB4NzVBQiwgMHg3RTc5LCAweDhCNkYsIDB4OTAwNiwgMHg5QTVCLCAweDU2QTUsIDB4NTgyNywKKyAgICAweDU5RjgsIDB4NUExRiwgMHg1QkI0LCAweDVFRjYsIDB4NjM1MCwgMHg2MzNCLCAweDY5M0QsIDB4NkM4NywgMHg2Q0JGLAorICAgIDB4NkQ4RSwgMHg2RDkzLCAweDZERjUsIDB4NkYxNCwgMHg3MERGLCAweDcxMzYsIDB4NzE1OSwgMHg3MUMzLCAweDcxRDUsCisgICAgMHg3ODRGLCAweDc4NkYsIDB4N0I3NSwgMHg3REUzLCAweDdFMkYsIDB4ODg0RCwgMHg4RURGLCAweDkyNUIsIDB4OUNGNiwKKyAgICAweDYwODUsIDB4NkQ4NSwgMHg3MUIxLCAweDk1QjEsIDB4NTNBRCwgMHg2N0QzLCAweDcwOEUsIDB4NzEzMCwgMHg3NDMwLAorICAgIDB4ODI3NiwgMHg4MkQyLCAweDk1QkIsIDB4OUFFNSwgMHg5RTdELCAweDY2QzQsIDB4NzFDMSwgMHg4NDQ5LCAweDU4NEIsCisgICAgMHg1REI4LCAweDVGNzEsIDB4NjYyMCwgMHg2NjhFLCAweDY5NzksIDB4NjlBRSwgMHg2QzM4LCAweDZDRjMsIDB4NkUzNiwKKyAgICAweDZGNDEsIDB4NkZEQSwgMHg3MDFCLCAweDcwMkYsIDB4NzE1MCwgMHg3MURGLCAweDczNzAsIDB4NzQ1QiwgMHg3NEQ0LAorICAgIDB4NzZDOCwgMHg3QTRFLCAweDdFOTMsIDB4ODJGMSwgMHg4QTYwLCAweDhGQ0UsIDB4OTM0OCwgMHg5NzE5LCAweDRFNDIsCisgICAgMHg1MDJBLCAweDUyMDgsIDB4NTNFMSwgMHg2NkYzLCAweDZDNkQsIDB4NkZDQSwgMHg3MzBBLCAweDc3N0YsIDB4N0E2MiwKKyAgICAweDgyQUUsIDB4ODVERCwgMHg4NjAyLCAweDg4RDQsIDB4OEE2MywgMHg4QjdELCAweDhDNkIsIDB4OTJCMywgMHg5NzEzLAorICAgIDB4OTgxMCwgMHg0RTk0LCAweDRGMEQsIDB4NEZDOSwgMHg1MEIyLCAweDUzNDgsIDB4NTQzRSwgMHg1NDMzLCAweDU1REEsCisgICAgMHg1ODYyLCAweDU4QkEsIDB4NTk2NywgMHg1QTFCLCAweDVCRTQsIDB4NjA5RiwgMHg2MUNBLCAweDY1NTYsIDB4NjVGRiwKKyAgICAweDY2NjQsIDB4NjhBNywgMHg2QzVBLCAweDZGQjMsIDB4NzBDRiwgMHg3MUFDLCAweDczNTIsIDB4N0I3RCwgMHg4NzA4LAorICAgIDB4OEFBNCwgMHg5QzMyLCAweDlGMDcsIDB4NUM0QiwgMHg2QzgzLCAweDczNDQsIDB4NzM4OSwgMHg5MjNBLCAweDZFQUIsCisgICAgMHg3NDY1LCAweDc2MUYsIDB4N0E2OSwgMHg3RTE1LCAweDg2MEEsIDB4NTE0MCwgMHg1OEM1LCAweDY0QzEsIDB4NzRFRSwKKyAgICAweDc1MTUsIDB4NzY3MCwgMHg3RkMxLCAweDkwOTUsIDB4OTZDRCwgMHg5OTU0LCAweDZFMjYsIDB4NzRFNiwgMHg3QUE5LAorICAgIDB4N0FBQSwgMHg4MUU1LCAweDg2RDksIDB4ODc3OCwgMHg4QTFCLCAweDVBNDksIDB4NUI4QywgMHg1QjlCLCAweDY4QTEsCisgICAgMHg2OTAwLCAweDZENjMsIDB4NzNBOSwgMHg3NDEzLCAweDc0MkMsIDB4Nzg5NywgMHg3REU5LCAweDdGRUIsIDB4ODExOCwKKyAgICAweDgxNTUsIDB4ODM5RSwgMHg4QzRDLCAweDk2MkUsIDB4OTgxMSwgMHg2NkYwLCAweDVGODAsIDB4NjVGQSwgMHg2Nzg5LAorICAgIDB4NkM2QSwgMHg3MzhCLCAweDUwMkQsIDB4NUEwMywgMHg2QjZBLCAweDc3RUUsIDB4NTkxNiwgMHg1RDZDLCAweDVEQ0QsCisgICAgMHg3MzI1LCAweDc1NEYsIDB4NTBFNSwgMHg1MUY5LCAweDU4MkYsIDB4NTkyRCwgMHg1OTk2LCAweDU5REEsIDB4NUJFNSwKKyAgICAweDVEQTIsIDB4NjJENywgMHg2NDE2LCAweDY0OTMsIDB4NjRGRSwgMHg2NkRDLCAweDZBNDgsIDB4NzFGRiwgMHg3NDY0LAorICAgIDB4N0E4OCwgMHg3QUFGLCAweDdFNDcsIDB4N0U1RSwgMHg4MDAwLCAweDgxNzAsIDB4ODdFRiwgMHg4OTgxLCAweDhCMjAsCisgICAgMHg5MDU5LCAweDkwODAsIDB4OTk1MiwgMHg2MTdFLCAweDZCMzIsIDB4NkQ3NCwgMHg3RTFGLCAweDg5MjUsIDB4OEZCMSwKKyAgICAweDRGRDEsIDB4NTBBRCwgMHg1MTk3LCAweDUyQzcsIDB4NTdDNywgMHg1ODg5LCAweDVCQjksIDB4NUVCOCwgMHg2MTQyLAorICAgIDB4Njk5NSwgMHg2RDhDLCAweDZFNjcsIDB4NkVCNiwgMHg3MTk0LCAweDc0NjIsIDB4NzUyOCwgMHg3NTJDLCAweDgwNzMsCisgICAgMHg4MzM4LCAweDg0QzksIDB4OEUwQSwgMHg5Mzk0LCAweDkzREUsIDB4NEU4RSwgMHg0RjUxLCAweDUwNzYsIDB4NTEyQSwKKyAgICAweDUzQzgsIDB4NTNDQiwgMHg1M0YzLCAweDVCODcsIDB4NUJEMywgMHg1QzI0LCAweDYxMUEsIDB4NjE4MiwgMHg2NUY0LAorICAgIDB4NzI1QiwgMHg3Mzk3LCAweDc0NDAsIDB4NzZDMiwgMHg3OTUwLCAweDc5OTEsIDB4NzlCOSwgMHg3RDA2LCAweDdGQkQsCisgICAgMHg4MjhCLCAweDg1RDUsIDB4ODY1RSwgMHg4RkMyLCAweDkwNDcsIDB4OTBGNSwgMHg5MUVBLCAweDk2ODUsIDB4OTZFOCwKKyAgICAweDk2RTksIDB4NTJENiwgMHg1RjY3LCAweDY1RUQsIDB4NjYzMSwgMHg2ODJGLCAweDcxNUMsIDB4N0EzNiwgMHg5MEMxLAorICAgIDB4OTgwQSwgMHg0RTkxLCAweDZBNTIsIDB4NkI5RSwgMHg2RjkwLCAweDcxODksIDB4ODAxOCwgMHg4MkI4LCAweDg1NTMsCisgICAgMHg5MDRCLCAweDk2OTUsIDB4OTZGMiwgMHg5N0ZCLCAweDg1MUEsIDB4OUIzMSwgMHg0RTkwLCAweDcxOEEsIDB4OTZDNCwKKyAgICAweDUxNDMsIDB4NTM5RiwgMHg1NEUxLCAweDU3MTMsIDB4NTcxMiwgMHg1N0EzLCAweDVBOUIsIDB4NUFDNCwgMHg1QkMzLAorICAgIDB4NjAyOCwgMHg2MTNGLCAweDYzRjQsIDB4NkM4NSwgMHg2RDM5LCAweDZFNzIsIDB4NkU5MCwgMHg3MjMwLCAweDczM0YsCisgICAgMHg3NDU3LCAweDgyRDEsIDB4ODg4MSwgMHg4RjQ1LCAweDkwNjAsIDB4OTY2MiwgMHg5ODU4LCAweDlEMUIsIDB4NjcwOCwKKyAgICAweDhEOEEsIDB4OTI1RSwgMHg0RjRELCAweDUwNDksIDB4NTBERSwgMHg1MzcxLCAweDU3MEQsIDB4NTlENCwgMHg1QTAxLAorICAgIDB4NUMwOSwgMHg2MTcwLCAweDY2OTAsIDB4NkUyRCwgMHg3MjMyLCAweDc0NEIsIDB4N0RFRiwgMHg4MEMzLCAweDg0MEUsCisgICAgMHg4NDY2LCAweDg1M0YsIDB4ODc1RiwgMHg4ODVCLCAweDg5MTgsIDB4OEIwMiwgMHg5MDU1LCAweDk3Q0IsIDB4OUI0RiwKKyAgICAweDRFNzMsIDB4NEY5MSwgMHg1MTEyLCAweDUxNkEsIDB4NTUyRiwgMHg1NUE5LCAweDVCN0EsIDB4NUJBNSwgMHg1RTdDLAorICAgIDB4NUU3RCwgMHg1RUJFLCAweDYwQTAsIDB4NjBERiwgMHg2MTA4LCAweDYxMDksIDB4NjNDNCwgMHg2NTM4LCAweDY3MDksCisgICAgMHg2N0Q0LCAweDY3REEsIDB4Njk2MSwgMHg2OTYyLCAweDZDQjksIDB4NkQyNywgMHg2RTM4LCAweDZGRTEsIDB4NzMzNiwKKyAgICAweDczMzcsIDB4NzQ1QywgMHg3NTMxLCAweDc2NTIsIDB4N0RBRCwgMHg4MUZFLCAweDg0MzgsIDB4ODhENSwgMHg4QTk4LAorICAgIDB4OEFEQiwgMHg4QUVELCAweDhFMzAsIDB4OEU0MiwgMHg5MDRBLCAweDkwM0UsIDB4OTA3QSwgMHg5MTQ5LCAweDkxQzksCisgICAgMHg5MzZFLCAweDU4MDksIDB4NkJEMywgMHg4MDg5LCAweDgwQjIsIDB4NTE0MSwgMHg1OTZCLCAweDVDMzksIDB4NkY2NCwKKyAgICAweDczQTcsIDB4ODBFNCwgMHg4RDA3LCAweDkyMTcsIDB4OTU4RiwgMHg4MDdGLCAweDYyMEUsIDB4NzAxQywgMHg3RDY4LAorICAgIDB4ODc4RCwgMHg1N0EwLCAweDYwNjksIDB4NjE0NywgMHg2QkI3LCAweDhBQkUsIDB4OTI4MCwgMHg5NkIxLCAweDRFNTksCisgICAgMHg1NDFGLCAweDZERUIsIDB4ODUyRCwgMHg5NjcwLCAweDk3RjMsIDB4OThFRSwgMHg2M0Q2LCAweDZDRTMsIDB4OTA5MSwKKyAgICAweDUxREQsIDB4NjFDOSwgMHg4MUJBLCAweDlERjksIDB4NEY5RCwgMHg1MDFBLCAweDUxMDAsIDB4NUI5QywgMHg2MTBGLAorICAgIDB4NjFGRiwgMHg2NEVDLCAweDY5MDUsIDB4NkJDNSwgMHg3NTkxLCAweDc3RTMsIDB4N0ZBOSwgMHg4MjY0LCAweDg1OEYsCisgICAgMHg4N0ZCLCAweDg4NjMsIDB4OEFCQywgMHg4QjcwLCAweDkxQUIsIDB4NEU4QywgMHg0RUU1LCAweDRGMEEsIDB4NTkzNywKKyAgICAweDU5RTgsIDB4NURGMiwgMHg1RjFCLCAweDVGNUIsIDB4NjAyMSwgMHg3MjNFLCAweDczRTUsIDB4NzU3MCwgMHg3NUNELAorICAgIDB4NzlGQiwgMHg4MDBDLCAweDgwMzMsIDB4ODA4NCwgMHg4MkUxLCAweDgzNTEsIDB4OENCRCwgMHg4Q0IzLCAweDkwODcsCisgICAgMHg5OEY0LCAweDk5MEMsIDB4NzAzNywgMHg3NkNBLCAweDdGQ0EsIDB4N0ZDQywgMHg3RkZDLCAweDhCMUEsIDB4NEVCQSwKKyAgICAweDRFQzEsIDB4NTIwMywgMHg1MzcwLCAweDU0QkQsIDB4NTZFMCwgMHg1OUZCLCAweDVCQzUsIDB4NUYxNSwgMHg1RkNELAorICAgIDB4NkU2RSwgMHg3RDZBLCAweDgzMzUsIDB4ODY5MywgMHg4QThELCAweDk3NkQsIDB4OTc3NywgMHg0RTAwLCAweDRGNUEsCisgICAgMHg0RjdFLCAweDU4RjksIDB4NjVFNSwgMHg2RUEyLCAweDkwMzgsIDB4OTNCMCwgMHg5OUI5LCAweDRFRkIsIDB4NThFQywKKyAgICAweDU5OEEsIDB4NTlEOSwgMHg2MDQxLCAweDdBMTQsIDB4ODM0RiwgMHg4Q0MzLCAweDUxNjUsIDB4NTM0NCwgMHg0RUNELAorICAgIDB4NTI2OSwgMHg1QjU1LCAweDgyQkYsIDB4NEVENCwgMHg1MjNBLCAweDU0QTgsIDB4NTlDOSwgMHg1OUZGLCAweDVCNTAsCisgICAgMHg1QjU3LCAweDVCNUMsIDB4NjA2MywgMHg2MTQ4LCAweDZFQ0IsIDB4NzA5OSwgMHg3MTZFLCAweDczODYsIDB4NzRGNywKKyAgICAweDc1QjUsIDB4NzhDMSwgMHg3RDJCLCAweDgwMDUsIDB4ODFFQSwgMHg4MzI4LCAweDg1MTcsIDB4ODVDOSwgMHg4QUVFLAorICAgIDB4OENDNywgMHg5NkNDLCAweDRGNUMsIDB4NTJGQSwgMHg1NkJDLCAweDY1QUIsIDB4NjYyOCwgMHg3MDdDLCAweDcwQjgsCisgICAgMHg3MjM1LCAweDdEQkQsIDB4ODI4RCwgMHg5MTRDLCAweDk2QzAsIDB4OUQ3MiwgMHg1QjcxLCAweDY4RTcsIDB4NkI5OCwKKyAgICAweDZGN0EsIDB4NzZERSwgMHg1QzkxLCAweDY2QUIsIDB4NkY1QiwgMHg3QkI0LCAweDdDMkEsIDB4ODgzNiwgMHg5NkRDLAorICAgIDB4NEUwOCwgMHg0RUQ3LCAweDUzMjAsIDB4NTgzNCwgMHg1OEJCLCAweDU4RUYsIDB4NTk2QywgMHg1QzA3LCAweDVFMzMsCisgICAgMHg1RTg0LCAweDVGMzUsIDB4NjM4QywgMHg2NkIyLCAweDY3NTYsIDB4NkExRiwgMHg2QUEzLCAweDZCMEMsIDB4NkYzRiwKKyAgICAweDcyNDYsIDB4NzM1MCwgMHg3NDhCLCAweDdBRTAsIDB4N0NBNywgMHg4MTc4LCAweDgxREYsIDB4ODFFNywgMHg4MzhBLAorICAgIDB4ODQ2QywgMHg4NTIzLCAweDg1OTQsIDB4ODVDRiwgMHg4OERELCAweDhEMTMsIDB4OTFBQywgMHg5NTc3LCAweDk2OUMsCisgICAgMHg1MThELCAweDU0QzksIDB4NTcyOCwgMHg1QkIwLCAweDYyNEQsIDB4Njc1MCwgMHg2ODNELCAweDY4OTMsIDB4NkUzRCwKKyAgICAweDZFRDMsIDB4NzA3RCwgMHg3RTIxLCAweDg4QzEsIDB4OENBMSwgMHg4RjA5LCAweDlGNEIsIDB4OUY0RSwgMHg3MjJELAorICAgIDB4N0I4RiwgMHg4QUNELCAweDkzMUEsIDB4NEY0NywgMHg0RjRFLCAweDUxMzIsIDB4NTQ4MCwgMHg1OUQwLCAweDVFOTUsCisgICAgMHg2MkI1LCAweDY3NzUsIDB4Njk2RSwgMHg2QTE3LCAweDZDQUUsIDB4NkUxQSwgMHg3MkQ5LCAweDczMkEsIDB4NzVCRCwKKyAgICAweDdCQjgsIDB4N0QzNSwgMHg4MkU3LCAweDgzRjksIDB4ODQ1NywgMHg4NUY3LCAweDhBNUIsIDB4OENBRiwgMHg4RTg3LAorICAgIDB4OTAxOSwgMHg5MEI4LCAweDk2Q0UsIDB4OUY1RiwgMHg1MkUzLCAweDU0MEEsIDB4NUFFMSwgMHg1QkMyLCAweDY0NTgsCisgICAgMHg2NTc1LCAweDZFRjQsIDB4NzJDNCwgMHg3Njg0LCAweDdBNEQsIDB4N0IxQiwgMHg3QzRELCAweDdFM0UsIDB4N0ZERiwKKyAgICAweDgzN0IsIDB4OEIyQiwgMHg4Q0NBLCAweDhENjQsIDB4OERFMSwgMHg4RTVGLCAweDhGRUEsIDB4OEZGOSwgMHg5MDY5LAorICAgIDB4OTNEMSwgMHg0RjQzLCAweDRGN0EsIDB4NTBCMywgMHg1MTY4LCAweDUxNzgsIDB4NTI0RCwgMHg1MjZBLCAweDU4NjEsCisgICAgMHg1ODdDLCAweDU5NjAsIDB4NUMwOCwgMHg1QzU1LCAweDVFREIsIDB4NjA5QiwgMHg2MjMwLCAweDY4MTMsIDB4NkJCRiwKKyAgICAweDZDMDgsIDB4NkZCMSwgMHg3MTRFLCAweDc0MjAsIDB4NzUzMCwgMHg3NTM4LCAweDc1NTEsIDB4NzY3MiwgMHg3QjRDLAorICAgIDB4N0I4QiwgMHg3QkFELCAweDdCQzYsIDB4N0U4RiwgMHg4QTZFLCAweDhGM0UsIDB4OEY0OSwgMHg5MjNGLCAweDkyOTMsCisgICAgMHg5MzIyLCAweDk0MkIsIDB4OTZGQiwgMHg5ODVBLCAweDk4NkIsIDB4OTkxRSwgMHg1MjA3LCAweDYyMkEsIDB4NjI5OCwKKyAgICAweDZENTksIDB4NzY2NCwgMHg3QUNBLCAweDdCQzAsIDB4N0Q3NiwgMHg1MzYwLCAweDVDQkUsIDB4NUU5NywgMHg2RjM4LAorICAgIDB4NzBCOSwgMHg3Qzk4LCAweDk3MTEsIDB4OUI4RSwgMHg5RURFLCAweDYzQTUsIDB4NjQ3QSwgMHg4Nzc2LCAweDRFMDEsCisgICAgMHg0RTk1LCAweDRFQUQsIDB4NTA1QywgMHg1MDc1LCAweDU0NDgsIDB4NTlDMywgMHg1QjlBLCAweDVFNDAsIDB4NUVBRCwKKyAgICAweDVFRjcsIDB4NUY4MSwgMHg2MEM1LCAweDYzM0EsIDB4NjUzRiwgMHg2NTc0LCAweDY1Q0MsIDB4NjY3NiwgMHg2Njc4LAorICAgIDB4NjdGRSwgMHg2OTY4LCAweDZBODksIDB4NkI2MywgMHg2QzQwLCAweDZEQzAsIDB4NkRFOCwgMHg2RTFGLCAweDZFNUUsCisgICAgMHg3MDFFLCAweDcwQTEsIDB4NzM4RSwgMHg3M0ZELCAweDc1M0EsIDB4Nzc1QiwgMHg3ODg3LCAweDc5OEUsIDB4N0EwQiwKKyAgICAweDdBN0QsIDB4N0NCRSwgMHg3RDhFLCAweDgyNDcsIDB4OEEwMiwgMHg4QUVBLCAweDhDOUUsIDB4OTEyRCwgMHg5MTRBLAorICAgIDB4OTFEOCwgMHg5MjY2LCAweDkyQ0MsIDB4OTMyMCwgMHg5NzA2LCAweDk3NTYsIDB4OTc1QywgMHg5ODAyLCAweDlGMEUsCisgICAgMHg1MjM2LCAweDUyOTEsIDB4NTU3QywgMHg1ODI0LCAweDVFMUQsIDB4NUYxRiwgMHg2MDhDLCAweDYzRDAsIDB4NjhBRiwKKyAgICAweDZGREYsIDB4Nzk2RCwgMHg3QjJDLCAweDgxQ0QsIDB4ODVCQSwgMHg4OEZELCAweDhBRjgsIDB4OEU0NCwgMHg5MThELAorICAgIDB4OTY2NCwgMHg5NjlCLCAweDk3M0QsIDB4OTg0QywgMHg5RjRBLCAweDRGQ0UsIDB4NTE0NiwgMHg1MUNCLCAweDUyQTksCisgICAgMHg1NjMyLCAweDVGMTQsIDB4NUY2QiwgMHg2M0FBLCAweDY0Q0QsIDB4NjVFOSwgMHg2NjQxLCAweDY2RkEsIDB4NjZGOSwKKyAgICAweDY3MUQsIDB4Njg5RCwgMHg2OEQ3LCAweDY5RkQsIDB4NkYxNSwgMHg2RjZFLCAweDcxNjcsIDB4NzFFNSwgMHg3MjJBLAorICAgIDB4NzRBQSwgMHg3NzNBLCAweDc5NTYsIDB4Nzk1QSwgMHg3OURGLCAweDdBMjAsIDB4N0E5NSwgMHg3Qzk3LCAweDdDREYsCisgICAgMHg3RDQ0LCAweDdFNzAsIDB4ODA4NywgMHg4NUZCLCAweDg2QTQsIDB4OEE1NCwgMHg4QUJGLCAweDhEOTksIDB4OEU4MSwKKyAgICAweDkwMjAsIDB4OTA2RCwgMHg5MUUzLCAweDk2M0IsIDB4OTZENSwgMHg5Q0U1LCAweDY1Q0YsIDB4N0MwNywgMHg4REIzLAorICAgIDB4OTNDMywgMHg1QjU4LCAweDVDMEEsIDB4NTM1MiwgMHg2MkQ5LCAweDczMUQsIDB4NTAyNywgMHg1Qjk3LCAweDVGOUUsCisgICAgMHg2MEIwLCAweDYxNkIsIDB4NjhENSwgMHg2REQ5LCAweDc0MkUsIDB4N0EyRSwgMHg3RDQyLCAweDdEOUMsIDB4N0UzMSwKKyAgICAweDgxNkIsIDB4OEUyQSwgMHg4RTM1LCAweDkzN0UsIDB4OTQxOCwgMHg0RjUwLCAweDU3NTAsIDB4NURFNiwgMHg1RUE3LAorICAgIDB4NjMyQiwgMHg3RjZBLCAweDRFM0IsIDB4NEY0RiwgMHg0RjhGLCAweDUwNUEsIDB4NTlERCwgMHg4MEM0LCAweDU0NkEsCisgICAgMHg1NDY4LCAweDU1RkUsIDB4NTk0RiwgMHg1Qjk5LCAweDVEREUsIDB4NUVEQSwgMHg2NjVELCAweDY3MzEsIDB4NjdGMSwKKyAgICAweDY4MkEsIDB4NkNFOCwgMHg2RDMyLCAweDZFNEEsIDB4NkY4RCwgMHg3MEI3LCAweDczRTAsIDB4NzU4NywgMHg3QzRDLAorICAgIDB4N0QwMiwgMHg3RDJDLCAweDdEQTIsIDB4ODIxRiwgMHg4NkRCLCAweDhBM0IsIDB4OEE4NSwgMHg4RDcwLCAweDhFOEEsCisgICAgMHg4RjMzLCAweDkwMzEsIDB4OTE0RSwgMHg5MTUyLCAweDk0NDQsIDB4OTlEMCwgMHg3QUY5LCAweDdDQTUsIDB4NEZDQSwKKyAgICAweDUxMDEsIDB4NTFDNiwgMHg1N0M4LCAweDVCRUYsIDB4NUNGQiwgMHg2NjU5LCAweDZBM0QsIDB4NkQ1QSwgMHg2RTk2LAorICAgIDB4NkZFQywgMHg3MTBDLCAweDc1NkYsIDB4N0FFMywgMHg4ODIyLCAweDkwMjEsIDB4OTA3NSwgMHg5NkNCLCAweDk5RkYsCisgICAgMHg4MzAxLCAweDRFMkQsIDB4NEVGMiwgMHg4ODQ2LCAweDkxQ0QsIDB4NTM3RCwgMHg2QURCLCAweDY5NkIsIDB4NkM0MSwKKyAgICAweDg0N0EsIDB4NTg5RSwgMHg2MThFLCAweDY2RkUsIDB4NjJFRiwgMHg3MERELCAweDc1MTEsIDB4NzVDNywgMHg3RTUyLAorICAgIDB4ODRCOCwgMHg4QjQ5LCAweDhEMDgsIDB4NEU0QiwgMHg1M0VBLCAweDU0QUIsIDB4NTczMCwgMHg1NzQwLCAweDVGRDcsCisgICAgMHg2MzAxLCAweDYzMDcsIDB4NjQ2RiwgMHg2NTJGLCAweDY1RTgsIDB4NjY3QSwgMHg2NzlELCAweDY3QjMsIDB4NkI2MiwKKyAgICAweDZDNjAsIDB4NkM5QSwgMHg2RjJDLCAweDc3RTUsIDB4NzgyNSwgMHg3OTQ5LCAweDc5NTcsIDB4N0QxOSwgMHg4MEEyLAorICAgIDB4ODEwMiwgMHg4MUYzLCAweDgyOUQsIDB4ODJCNywgMHg4NzE4LCAweDhBOEMsIDB4OEQwNCwgMHg4REJFLCAweDkwNzIsCisgICAgMHg3NkY0LCAweDdBMTksIDB4N0EzNywgMHg3RTU0LCAweDgwNzcsIDB4NTUwNywgMHg1NUQ0LCAweDU4NzUsIDB4NjMyRiwKKyAgICAweDY0MjIsIDB4NjY0OSwgMHg2NjRCLCAweDY4NkQsIDB4Njk5QiwgMHg2Qjg0LCAweDZEMjUsIDB4NkVCMSwgMHg3M0NELAorICAgIDB4NzQ2OCwgMHg3NEExLCAweDc1NUIsIDB4NzVCOSwgMHg3NkUxLCAweDc3MUUsIDB4Nzc4QiwgMHg3OUU2LCAweDdFMDksCisgICAgMHg3RTFELCAweDgxRkIsIDB4ODUyRiwgMHg4ODk3LCAweDhBM0EsIDB4OENEMSwgMHg4RUVCLCAweDhGQjAsIDB4OTAzMiwKKyAgICAweDkzQUQsIDB4OTY2MywgMHg5NjczLCAweDk3MDcsIDB4NEY4NCwgMHg1M0YxLCAweDU5RUEsIDB4NUFDOSwgMHg1RTE5LAorICAgIDB4Njg0RSwgMHg3NEM2LCAweDc1QkUsIDB4NzlFOSwgMHg3QTkyLCAweDgxQTMsIDB4ODZFRCwgMHg4Q0VBLCAweDhEQ0MsCisgICAgMHg4RkVELCAweDY1OUYsIDB4NjcxNSwgMHg1N0Y3LCAweDZGNTcsIDB4N0RERCwgMHg4RjJGLCAweDkzRjYsIDB4OTZDNiwKKyAgICAweDVGQjUsIDB4NjFGMiwgMHg2Rjg0LCAweDRFMTQsIDB4NEY5OCwgMHg1MDFGLCAweDUzQzksIDB4NTVERiwgMHg1RDZGLAorICAgIDB4NURFRSwgMHg2QjIxLCAweDZCNjQsIDB4NzhDQiwgMHg3QjlBLCAweDhFNDksIDB4OEVDQSwgMHg5MDZFLCAweDYzNDksCisgICAgMHg2NDNFLCAweDc3NDAsIDB4N0E4NCwgMHg5MzJGLCAweDk0N0YsIDB4OUY2QSwgMHg2NEIwLCAweDZGQUYsIDB4NzFFNiwKKyAgICAweDc0QTgsIDB4NzREQSwgMHg3QUM0LCAweDdDMTIsIDB4N0U4MiwgMHg3Q0IyLCAweDdFOTgsIDB4OEI5QSwgMHg4RDBBLAorICAgIDB4OTQ3RCwgMHg5OTEwLCAweDk5NEMsIDB4NTIzOSwgMHg1QkRGLCAweDY0RTYsIDB4NjcyRCwgMHg3RDJFLCAweDUwRUQsCisgICAgMHg1M0MzLCAweDU4NzksIDB4NjE1OCwgMHg2MTU5LCAweDYxRkEsIDB4NjVBQywgMHg3QUQ5LCAweDhCOTIsIDB4OEI5NiwKKyAgICAweDUwMDksIDB4NTAyMSwgMHg1Mjc1LCAweDU1MzEsIDB4NUEzQywgMHg1RUUwLCAweDVGNzAsIDB4NjEzNCwgMHg2NTVFLAorICAgIDB4NjYwQywgMHg2NjM2LCAweDY2QTIsIDB4NjlDRCwgMHg2RUM0LCAweDZGMzIsIDB4NzMxNiwgMHg3NjIxLCAweDdBOTMsCisgICAgMHg4MTM5LCAweDgyNTksIDB4ODNENiwgMHg4NEJDLCAweDUwQjUsIDB4NTdGMCwgMHg1QkMwLCAweDVCRTgsIDB4NUY2OSwKKyAgICAweDYzQTEsIDB4NzgyNiwgMHg3REI1LCAweDgzREMsIDB4ODUyMSwgMHg5MUM3LCAweDkxRjUsIDB4NTE4QSwgMHg2N0Y1LAorICAgIDB4N0I1NiwgMHg4Q0FDLCAweDUxQzQsIDB4NTlCQiwgMHg2MEJELCAweDg2NTUsIDB4NTAxQywgMHg1MjU0LCAweDVDM0EsCisgICAgMHg2MTdELCAweDYyMUEsIDB4NjJEMywgMHg2NEYyLCAweDY1QTUsIDB4NkVDQywgMHg3NjIwLCAweDgxMEEsIDB4OEU2MCwKKyAgICAweDk2NUYsIDB4OTZCQiwgMHg0RURGLCAweDUzNDMsIDB4NTU5OCwgMHg1OTI5LCAweDVEREQsIDB4NjRDNSwgMHg2Q0M5LAorICAgIDB4NkRGQSwgMHg3Mzk0LCAweDdBN0YsIDB4ODIxQiwgMHg4NUE2LCAweDhDRTQsIDB4OEUxMCwgMHg5MDc3LCAweDkxRTcsCisgICAgMHg5NUUxLCAweDk2MjEsIDB4OTdDNiwgMHg1MUY4LCAweDU0RjIsIDB4NTU4NiwgMHg1RkI5LCAweDY0QTQsIDB4NkY4OCwKKyAgICAweDdEQjQsIDB4OEYxRiwgMHg4RjRELCAweDk0MzUsIDB4NTBDOSwgMHg1QzE2LCAweDZDQkUsIDB4NkRGQiwgMHg3NTFCLAorICAgIDB4NzdCQiwgMHg3QzNELCAweDdDNjQsIDB4OEE3OSwgMHg4QUMyLCAweDU4MUUsIDB4NTlCRSwgMHg1RTE2LCAweDYzNzcsCisgICAgMHg3MjUyLCAweDc1OEEsIDB4Nzc2QiwgMHg4QURDLCAweDhDQkMsIDB4OEYxMiwgMHg1RUYzLCAweDY2NzQsIDB4NkRGOCwKKyAgICAweDgwN0QsIDB4ODNDMSwgMHg4QUNCLCAweDk3NTEsIDB4OUJENiwgMHg1MjQzLCAweDY2RkYsIDB4NkQ5NSwgMHg2RUVGLAorICAgIDB4N0RFMCwgMHg4QUU2LCAweDkwMkUsIDB4OTA1RSwgMHg5QUQ0LCAweDUyMUQsIDB4NTI3RiwgMHg1NEU4LCAweDYxOTQsCisgICAgMHg2Mjg0LCAweDYyREIsIDB4NjhBMiwgMHg2OTEyLCAweDY5NUEsIDB4NkEzNSwgMHg3MDkyLCAweDcxMjYsIDB4Nzg1RCwKKyAgICAweDc5MDEsIDB4NzkwRSwgMHg3OUQyLCAweDdBMEQsIDB4ODA5NiwgMHg4Mjc4LCAweDgyRDUsIDB4ODM0OSwgMHg4NTQ5LAorICAgIDB4OEM4MiwgMHg4RDg1LCAweDkxNjIsIDB4OTE4QiwgMHg5MUFFLCAweDRGQzMsIDB4NTZEMSwgMHg3MUVELCAweDc3RDcsCisgICAgMHg4NzAwLCAweDg5RjgsIDB4NUJGOCwgMHg1RkQ2LCAweDY3NTEsIDB4OTBBOCwgMHg1M0UyLCAweDU4NUEsIDB4NUJGNSwKKyAgICAweDYwQTQsIDB4NjE4MSwgMHg2NDYwLCAweDdFM0QsIDB4ODA3MCwgMHg4NTI1LCAweDkyODMsIDB4NjRBRSwgMHg1MEFDLAorICAgIDB4NUQxNCwgMHg2NzAwLCAweDU4OUMsIDB4NjJCRCwgMHg2M0E4LCAweDY5MEUsIDB4Njk3OCwgMHg2QTFFLCAweDZFNkIsCisgICAgMHg3NkJBLCAweDc5Q0IsIDB4ODJCQiwgMHg4NDI5LCAweDhBQ0YsIDB4OERBOCwgMHg4RkZELCAweDkxMTIsIDB4OTE0QiwKKyAgICAweDkxOUMsIDB4OTMxMCwgMHg5MzE4LCAweDkzOUEsIDB4OTZEQiwgMHg5QTM2LCAweDlDMEQsIDB4NEUxMSwgMHg3NTVDLAorICAgIDB4Nzk1RCwgMHg3QUZBLCAweDdCNTEsIDB4N0JDOSwgMHg3RTJFLCAweDg0QzQsIDB4OEU1OSwgMHg4RTc0LCAweDhFRjgsCisgICAgMHg5MDEwLCAweDY2MjUsIDB4NjkzRiwgMHg3NDQzLCAweDUxRkEsIDB4NjcyRSwgMHg5RURDLCAweDUxNDUsIDB4NUZFMCwKKyAgICAweDZDOTYsIDB4ODdGMiwgMHg4ODVELCAweDg4NzcsIDB4NjBCNCwgMHg4MUI1LCAweDg0MDMsIDB4OEQwNSwgMHg1M0Q2LAorICAgIDB4NTQzOSwgMHg1NjM0LCAweDVBMzYsIDB4NUMzMSwgMHg3MDhBLCAweDdGRTAsIDB4ODA1QSwgMHg4MTA2LCAweDgxRUQsCisgICAgMHg4REEzLCAweDkxODksIDB4OUE1RiwgMHg5REYyLCAweDUwNzQsIDB4NEVDNCwgMHg1M0EwLCAweDYwRkIsIDB4NkUyQywKKyAgICAweDVDNjQsIDB4NEY4OCwgMHg1MDI0LCAweDU1RTQsIDB4NUNEOSwgMHg1RTVGLCAweDYwNjUsIDB4Njg5NCwgMHg2Q0JCLAorICAgIDB4NkRDNCwgMHg3MUJFLCAweDc1RDQsIDB4NzVGNCwgMHg3NjYxLCAweDdBMUEsIDB4N0E0OSwgMHg3REM3LCAweDdERkIsCisgICAgMHg3RjZFLCAweDgxRjQsIDB4ODZBOSwgMHg4RjFDLCAweDk2QzksIDB4OTlCMywgMHg5RjUyLCAweDUyNDcsIDB4NTJDNSwKKyAgICAweDk4RUQsIDB4ODlBQSwgMHg0RTAzLCAweDY3RDIsIDB4NkYwNiwgMHg0RkI1LCAweDVCRTIsIDB4Njc5NSwgMHg2Qzg4LAorICAgIDB4NkQ3OCwgMHg3NDFCLCAweDc4MjcsIDB4OTFERCwgMHg5MzdDLCAweDg3QzQsIDB4NzlFNCwgMHg3QTMxLCAweDVGRUIsCisgICAgMHg0RUQ2LCAweDU0QTQsIDB4NTUzRSwgMHg1OEFFLCAweDU5QTUsIDB4NjBGMCwgMHg2MjUzLCAweDYyRDYsIDB4NjczNiwKKyAgICAweDY5NTUsIDB4ODIzNSwgMHg5NjQwLCAweDk5QjEsIDB4OTlERCwgMHg1MDJDLCAweDUzNTMsIDB4NTU0NCwgMHg1NzdDLAorICAgIDB4NjI1OCwgMHg2NEUyLCAweDY2NkIsIDB4NjdERCwgMHg2RkMxLCAweDZGRUYsIDB4NzQyMiwgMHg3NDM4LCAweDhBMTcsCisgICAgMHg5NDM4LCAweDU0NTEsIDB4NTYwNiwgMHg1NzY2LCAweDVGNDgsIDB4NjE5QSwgMHg2QjRFLCAweDcwNTgsIDB4NzBBRCwKKyAgICAweDdEQkIsIDB4OEE5NSwgMHg1OTZBLCAweDgxMkIsIDB4NjNBMiwgMHg3NzA4LCAweDgwM0QsIDB4OENBQSwgMHg1ODU0LAorICAgIDB4NjQyRCwgMHg2OUJCLCAweDVCOTUsIDB4NUUxMSwgMHg2RTZGLCAweDg1NjksIDB4NTE0QywgMHg1M0YwLCAweDU5MkEsCisgICAgMHg2MDIwLCAweDYxNEIsIDB4NkI4NiwgMHg2QzcwLCAweDZDRjAsIDB4N0IxRSwgMHg4MENFLCAweDgyRDQsIDB4OERDNiwKKyAgICAweDkwQjAsIDB4OThCMSwgMHg2NEM3LCAweDZGQTQsIDB4NjQ5MSwgMHg2NTA0LCAweDUxNEUsIDB4NTQxMCwgMHg1NzFGLAorICAgIDB4OEEwRSwgMHg2MTVGLCAweDY4NzYsIDB4NzVEQiwgMHg3QjUyLCAweDdENzEsIDB4OTAxQSwgMHg1ODA2LCAweDY5Q0MsCisgICAgMHg4MTdGLCAweDg5MkEsIDB4OTAwMCwgMHg5ODM5LCAweDUwNzgsIDB4NTk1NywgMHg1OUFDLCAweDYyOTUsIDB4OTAwRiwKKyAgICAweDlCMkEsIDB4NjE1RCwgMHg3Mjc5LCAweDk1RDYsIDB4NTc2MSwgMHg1QTQ2LCAweDVERjQsIDB4NjI4QSwgMHg2NEFELAorICAgIDB4NjRGQSwgMHg2Nzc3LCAweDZDRTIsIDB4NkQzRSwgMHg3MjJDLCAweDc0MzYsIDB4NzgzNCwgMHg3Rjc3LCAweDgyQUQsCisgICAgMHg4RERCLCAweDk4MTcsIDB4NTIyNCwgMHg1NzQyLCAweDY3N0YsIDB4NzI0OCwgMHg3NEUzLCAweDhDQTksIDB4OEZBNiwKKyAgICAweDkyMTEsIDB4OTYyQSwgMHg1MTZCLCAweDUzRUQsIDB4NjM0QywgMHg0RjY5LCAweDU1MDQsIDB4NjA5NiwgMHg2NTU3LAorICAgIDB4NkM5QiwgMHg2RDdGLCAweDcyNEMsIDB4NzJGRCwgMHg3QTE3LCAweDg5ODcsIDB4OEM5RCwgMHg1RjZELCAweDZGOEUsCisgICAgMHg3MEY5LCAweDgxQTgsIDB4NjEwRSwgMHg0RkJGLCAweDUwNEYsIDB4NjI0MSwgMHg3MjQ3LCAweDdCQzcsIDB4N0RFOCwKKyAgICAweDdGRTksIDB4OTA0RCwgMHg5N0FELCAweDlBMTksIDB4OENCNiwgMHg1NzZBLCAweDVFNzMsIDB4NjdCMCwgMHg4NDBELAorICAgIDB4OEE1NSwgMHg1NDIwLCAweDVCMTYsIDB4NUU2MywgMHg1RUUyLCAweDVGMEEsIDB4NjU4MywgMHg4MEJBLCAweDg1M0QsCisgICAgMHg5NTg5LCAweDk2NUIsIDB4NEY0OCwgMHg1MzA1LCAweDUzMEQsIDB4NTMwRiwgMHg1NDg2LCAweDU0RkEsIDB4NTcwMywKKyAgICAweDVFMDMsIDB4NjAxNiwgMHg2MjlCLCAweDYyQjEsIDB4NjM1NSwgMHg2Q0UxLCAweDZENjYsIDB4NzVCMSwgMHg3ODMyLAorICAgIDB4ODBERSwgMHg4MTJGLCAweDgyREUsIDB4ODQ2MSwgMHg4NEIyLCAweDg4OEQsIDB4ODkxMiwgMHg5MDBCLCAweDkyRUEsCisgICAgMHg5OEZELCAweDlCOTEsIDB4NUU0NSwgMHg2NkI0LCAweDY2REQsIDB4NzAxMSwgMHg3MjA2LCAweDRGRjUsIDB4NTI3RCwKKyAgICAweDVGNkEsIDB4NjE1MywgMHg2NzUzLCAweDZBMTksIDB4NkYwMiwgMHg3NEUyLCAweDc5NjgsIDB4ODg2OCwgMHg4Qzc5LAorICAgIDB4OThDNywgMHg5OEM0LCAweDlBNDMsIDB4NTRDMSwgMHg3QTFGLCAweDY5NTMsIDB4OEFGNywgMHg4QzRBLCAweDk4QTgsCisgICAgMHg5OUFFLCAweDVGN0MsIDB4NjJBQiwgMHg3NUIyLCAweDc2QUUsIDB4ODhBQiwgMHg5MDdGLCAweDk2NDIsIDB4NTMzOSwKKyAgICAweDVGM0MsIDB4NUZDNSwgMHg2Q0NDLCAweDczQ0MsIDB4NzU2MiwgMHg3NThCLCAweDdCNDYsIDB4ODJGRSwgMHg5OTlELAorICAgIDB4NEU0RiwgMHg5MDNDLCAweDRFMEIsIDB4NEY1NSwgMHg1M0E2LCAweDU5MEYsIDB4NUVDOCwgMHg2NjMwLCAweDZDQjMsCisgICAgMHg3NDU1LCAweDgzNzcsIDB4ODc2NiwgMHg4Q0MwLCAweDkwNTAsIDB4OTcxRSwgMHg5QzE1LCAweDU4RDEsIDB4NUI3OCwKKyAgICAweDg2NTAsIDB4OEIxNCwgMHg5REI0LCAweDVCRDIsIDB4NjA2OCwgMHg2MDhELCAweDY1RjEsIDB4NkM1NywgMHg2RjIyLAorICAgIDB4NkZBMywgMHg3MDFBLCAweDdGNTUsIDB4N0ZGMCwgMHg5NTkxLCAweDk1OTIsIDB4OTY1MCwgMHg5N0QzLCAweDUyNzIsCisgICAgMHg4RjQ0LCAweDUxRkQsIDB4NTQyQiwgMHg1NEI4LCAweDU1NjMsIDB4NTU4QSwgMHg2QUJCLCAweDZEQjUsIDB4N0REOCwKKyAgICAweDgyNjYsIDB4OTI5QywgMHg5Njc3LCAweDlFNzksIDB4NTQwOCwgMHg1NEM4LCAweDc2RDIsIDB4ODZFNCwgMHg5NUE0LAorICAgIDB4OTVENCwgMHg5NjVDLCAweDRFQTIsIDB4NEYwOSwgMHg1OUVFLCAweDVBRTYsIDB4NURGNywgMHg2MDUyLCAweDYyOTcsCisgICAgMHg2NzZELCAweDY4NDEsIDB4NkM4NiwgMHg2RTJGLCAweDdGMzgsIDB4ODA5QiwgMHg4MjJBLCAweDk4MDUsIDB4NEVBNSwKKyAgICAweDUwNTUsIDB4NTRCMywgMHg1NzkzLCAweDU5NUEsIDB4NUI2OSwgMHg1QkIzLCAweDYxQzgsIDB4Njk3NywgMHg2RDc3LAorICAgIDB4NzAyMywgMHg4N0Y5LCAweDg5RTMsIDB4OEE3MiwgMHg4QUU3LCAweDkwODIsIDB4OTlFRCwgMHg5QUI4LCAweDUyQkUsCisgICAgMHg2ODM4LCAweDUwMTYsIDB4NUU3OCwgMHg2NzRGLCAweDgzNDcsIDB4ODg0QywgMHg0RUFCLCAweDU0MTEsIDB4NTZBRSwKKyAgICAweDczRTYsIDB4OTExNSwgMHg5N0ZGLCAweDk5MDksIDB4OTk1NywgMHg5OTk5LCAweDU2NTMsIDB4NTg5RiwgMHg4NjVCLAorICAgIDB4OEEzMSwgMHg2MUIyLCAweDZBRjYsIDB4NzM3QiwgMHg4RUQyLCAweDZCNDcsIDB4OTZBQSwgMHg5QTU3LCAweDU5NTUsCisgICAgMHg3MjAwLCAweDhENkIsIDB4OTc2OSwgMHg0RkQ0LCAweDVDRjQsIDB4NUYyNiwgMHg2MUY4LCAweDY2NUIsIDB4NkNFQiwKKyAgICAweDcwQUIsIDB4NzM4NCwgMHg3M0I5LCAweDczRkUsIDB4NzcyOSwgMHg3NzRELCAweDdENDMsIDB4N0Q2MiwgMHg3RTIzLAorICAgIDB4ODIzNywgMHg4ODUyLCAweDhDRTIsIDB4OTI0OSwgMHg5ODZGLCAweDVCNTEsIDB4N0E3NCwgMHg4ODQwLCAweDk4MDEsCisgICAgMHg1QUNDLCAweDRGRTAsIDB4NTM1NCwgMHg1OTNFLCAweDVDRkQsIDB4NjMzRSwgMHg2RDc5LCAweDcyRjksIDB4ODEwNSwKKyAgICAweDgxMDcsIDB4ODNBMiwgMHg5MkNGLCAweDk4MzAsIDB4NEVBOCwgMHg1MTQ0LCAweDUyMTEsIDB4NTc4QiwgMHg1RjYyLAorICAgIDB4NkNDMiwgMHg2RUNFLCAweDcwMDUsIDB4NzA1MCwgMHg3MEFGLCAweDcxOTIsIDB4NzNFOSwgMHg3NDY5LCAweDgzNEEsCisgICAgMHg4N0EyLCAweDg4NjEsIDB4OTAwOCwgMHg5MEEyLCAweDkzQTMsIDB4OTlBOCwgMHg1MTZFLCAweDVGNTcsIDB4NjBFMCwKKyAgICAweDYxNjcsIDB4NjZCMywgMHg4NTU5LCAweDhFNEEsIDB4OTFBRiwgMHg5NzhCLCAweDRFNEUsIDB4NEU5MiwgMHg1NDdDLAorICAgIDB4NThENSwgMHg1OEZBLCAweDU5N0QsIDB4NUNCNSwgMHg1RjI3LCAweDYyMzYsIDB4NjI0OCwgMHg2NjBBLCAweDY2NjcsCisgICAgMHg2QkVCLCAweDZENjksIDB4NkRDRiwgMHg2RTU2LCAweDZFRjgsIDB4NkY5NCwgMHg2RkUwLCAweDZGRTksIDB4NzA1RCwKKyAgICAweDcyRDAsIDB4NzQyNSwgMHg3NDVBLCAweDc0RTAsIDB4NzY5MywgMHg3OTVDLCAweDdDQ0EsIDB4N0UxRSwgMHg4MEUxLAorICAgIDB4ODJBNiwgMHg4NDZCLCAweDg0QkYsIDB4ODY0RSwgMHg4NjVGLCAweDg3NzQsIDB4OEI3NywgMHg4QzZBLCAweDkzQUMsCisgICAgMHg5ODAwLCAweDk4NjUsIDB4NjBEMSwgMHg2MjE2LCAweDkxNzcsIDB4NUE1QSwgMHg2NjBGLCAweDZERjcsIDB4NkUzRSwKKyAgICAweDc0M0YsIDB4OUI0MiwgMHg1RkZELCAweDYwREEsIDB4N0IwRiwgMHg1NEM0LCAweDVGMTgsIDB4NkM1RSwgMHg2Q0QzLAorICAgIDB4NkQyQSwgMHg3MEQ4LCAweDdEMDUsIDB4ODY3OSwgMHg4QTBDLCAweDlEM0IsIDB4NTMxNiwgMHg1NDhDLCAweDVCMDUsCisgICAgMHg2QTNBLCAweDcwNkIsIDB4NzU3NSwgMHg3OThELCAweDc5QkUsIDB4ODJCMSwgMHg4M0VGLCAweDhBNzEsIDB4OEI0MSwKKyAgICAweDhDQTgsIDB4OTc3NCwgMHg2NEY0LCAweDY1MkIsIDB4NzhCQSwgMHg3OEJCLCAweDdBNkIsIDB4NEUzOCwgMHg1NTlBLAorICAgIDB4NTk1MCwgMHg1QkE2LCAweDVFN0IsIDB4NjBBMywgMHg2M0RCLCAweDZCNjEsIDB4NjY2NSwgMHg2ODUzLCAweDZFMTksCisgICAgMHg3MTY1LCAweDc0QjAsIDB4N0QwOCwgMHg5MDg0LCAweDlBNjksIDB4OUMyNSwgMHg2RDNCLCAweDZFRDEsIDB4NzMzRSwKKyAgICAweDhDNDEsIDB4OTVDQSwgMHg1MUYwLCAweDVFNEMsIDB4NUZBOCwgMHg2MDRELCAweDYwRjYsIDB4NjEzMCwgMHg2MTRDLAorICAgIDB4NjY0MywgMHg2NjQ0LCAweDY5QTUsIDB4NkNDMSwgMHg2RTVGLCAweDZFQzksIDB4NkY2MiwgMHg3MTRDLCAweDc0OUMsCisgICAgMHg3Njg3LCAweDdCQzEsIDB4N0MyNywgMHg4MzUyLCAweDg3NTcsIDB4OTA1MSwgMHg5NjhELCAweDlFQzMsIDB4NTMyRiwKKyAgICAweDU2REUsIDB4NUVGQiwgMHg1RjhBLCAweDYwNjIsIDB4NjA5NCwgMHg2MUY3LCAweDY2NjYsIDB4NjcwMywgMHg2QTlDLAorICAgIDB4NkRFRSwgMHg2RkFFLCAweDcwNzAsIDB4NzM2QSwgMHg3RTZBLCAweDgxQkUsIDB4ODMzNCwgMHg4NkQ0LCAweDhBQTgsCisgICAgMHg4Q0M0LCAweDUyODMsIDB4NzM3MiwgMHg1Qjk2LCAweDZBNkIsIDB4OTQwNCwgMHg1NEVFLCAweDU2ODYsIDB4NUI1RCwKKyAgICAweDY1NDgsIDB4NjU4NSwgMHg2NkM5LCAweDY4OUYsIDB4NkQ4RCwgMHg2REM2LCAweDcyM0IsIDB4ODBCNCwgMHg5MTc1LAorICAgIDB4OUE0RCwgMHg0RkFGLCAweDUwMTksIDB4NTM5QSwgMHg1NDBFLCAweDU0M0MsIDB4NTU4OSwgMHg1NUM1LCAweDVFM0YsCisgICAgMHg1RjhDLCAweDY3M0QsIDB4NzE2NiwgMHg3M0RELCAweDkwMDUsIDB4NTJEQiwgMHg1MkYzLCAweDU4NjQsIDB4NThDRSwKKyAgICAweDcxMDQsIDB4NzE4RiwgMHg3MUZCLCAweDg1QjAsIDB4OEExMywgMHg2Njg4LCAweDg1QTgsIDB4NTVBNywgMHg2Njg0LAorICAgIDB4NzE0QSwgMHg4NDMxLCAweDUzNDksIDB4NTU5OSwgMHg2QkMxLCAweDVGNTksIDB4NUZCRCwgMHg2M0VFLCAweDY2ODksCisgICAgMHg3MTQ3LCAweDhBRjEsIDB4OEYxRCwgMHg5RUJFLCAweDRGMTEsIDB4NjQzQSwgMHg3MENCLCAweDc1NjYsIDB4ODY2NywKKyAgICAweDYwNjQsIDB4OEI0RSwgMHg5REY4LCAweDUxNDcsIDB4NTFGNiwgMHg1MzA4LCAweDZEMzYsIDB4ODBGOCwgMHg5RUQxLAorICAgIDB4NjYxNSwgMHg2QjIzLCAweDcwOTgsIDB4NzVENSwgMHg1NDAzLCAweDVDNzksIDB4N0QwNywgMHg4QTE2LCAweDZCMjAsCisgICAgMHg2QjNELCAweDZCNDYsIDB4NTQzOCwgMHg2MDcwLCAweDZEM0QsIDB4N0ZENSwgMHg4MjA4LCAweDUwRDYsIDB4NTFERSwKKyAgICAweDU1OUMsIDB4NTY2QiwgMHg1NkNELCAweDU5RUMsIDB4NUIwOSwgMHg1RTBDLCAweDYxOTksIDB4NjE5OCwgMHg2MjMxLAorICAgIDB4NjY1RSwgMHg2NkU2LCAweDcxOTksIDB4NzFCOSwgMHg3MUJBLCAweDcyQTcsIDB4NzlBNywgMHg3QTAwLCAweDdGQjIsCisgICAgMHg4QTcwLCAweDMwMDEsIDB4MzAwMiwgMHgyMDI1LCAweDAwQUQsIDB4MjAxNSwgMHgyMjI1LCAweEZGNUUsIDB4MzAxNCwKKyAgICAweDMwMTUsIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwgMHgzMDBDLCAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLAorICAgIDB4MzAxMCwgMHgzMDExLCAweDMwMTMsIDB4RkYwMSwgMHhGRjA4LCAweEZGMDksIDB4RkYwQywgMHhGRjBFLCAweEZGMUEsCisgICAgMHhGRjFCLCAweEZGMUMsIDB4RkYxRCwgMHhGRjFFLCAweEZGMUYsIDB4RkYzQiwgMHhGRjNELCAweEZGM0YsIDB4RkY1QiwKKyAgICAweEZGNUMsIDB4RkY1RCwgMHhGRjVFLCAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LAorICAgIDB4MDAyNiwgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsCisgICAgMHgwMDJGLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLAorICAgIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksCisgICAgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwKKyAgICAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLAorICAgIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsCisgICAgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwKKyAgICAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LAorICAgIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgyMDNFLCAweDAwN0UsCisgICAgMHgwMDVDLCAweDIzMUMsIDB4MjMxRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDMwMEUsIDB4MzAwRiwKKyAgICAweDMwMEEsIDB4MzAwQiwgMHgzMDA4LCAweDMwMDksIDB4MDAyOCwgMHgwMDI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDI4LAorICAgIDB4MDAyOSwgMHgwMDI4LCAweDAwMjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMjgsIDB4MDAyOSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgzMDE2LCAweDMwMTcsIDB4MzAxNiwgMHgzMDE3LCAweDMwMTgsIDB4MzAxOSwgMHgwMDVCLCAweDAwNUQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MjYzRSwgMHgyNjNELCAweDIwMjEsIDB4MjAyMSwgMHgyMDIwLCAweDIwMjEsIDB4MDAwMCwgMHgyMjE3LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDIwMUYsIDB4MjAxQiwgMHgwMkQ2LCAweDAyRDcsIDB4MDBENywgMHgyMjFFLCAweDAwMDAsCisgICAgMHgwMEIxLCAweDIyMTMsIDB4MDAzRSwgMHgwMDNDLCAweDAwM0QsIDB4MjI2MCwgMHgyMDdELCAweDIwN0UsIDB4MDA3QiwKKyAgICAweDAwN0QsIDB4MDAwMCwgMHgwMDAwLCAweDIyMjksIDB4MjIyQSwgMHgyMjgyLCAweDIyMDgsIDB4MDNBMywgMHgwMDIxLAorICAgIDB4MDAwMCwgMHgzMDIxLCAweDMwMjIsIDB4MzAyMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0RTAzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDUzNDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMjcsIDB4MzAxNCwgMHgzMDE1LCAweDAwMkEsIDB4MDAwMCwKKyAgICAweDIyMTcsIDB4MDAyQSwgMHhDRENELCAweDMwMDEsIDB4MzAwMiwgMHgwMDI4LCAweDAwMjksIDB4MDAyOCwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgwMDI5LCAweDMwMTYsIDB4MzAxNywgMHgzMDEwLCAweDMwMTEsIDB4MDAwMCwgMHgwMDAwLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MDA1RCwKKyAgICAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAorICAgIDB4MDA1RCwgMHgwMEI2LCAweDAwMDAsIDB4MDAwMCwgMHgyMkVGLCAweDIyMzcsIDB4MjBERSwgMHgyMERFLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwKKyAgICAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgyNzhBLAorICAgIDB4Mjc4QiwgMHgyNzhDLCAweDI3OEQsIDB4Mjc4RSwgMHgyNzhGLCAweDI3OTAsIDB4Mjc5MSwgMHgyNzkyLCAweDI3OTMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksCisgICAgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwKKyAgICAweDI0QjYsIDB4MjRCNywgMHgyNEI4LCAweDI0QjksIDB4MjRCQSwgMHgyNEJCLCAweDI0QkMsIDB4MjRCRCwgMHgyNEJFLAorICAgIDB4MjRCRiwgMHgyNEMwLCAweDI0QzEsIDB4MjRDMiwgMHgyNEMzLCAweDI0QzQsIDB4MjRDNSwgMHgyNEM2LCAweDI0QzcsCisgICAgMHgyNEM4LCAweDI0QzksIDB4MjRDQSwgMHgyNENCLCAweDI0Q0MsIDB4MjRDRCwgMHgyNENFLCAweDI0Q0YsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgwMDVELAorICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsCisgICAgMHgwMDVELCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAorICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIyQ0YsIDB4MjJDRSwgMHgyMkNGLAorICAgIDB4MjJDRSwgMHgyMjgwLCAweDIyODEsIDB4MjI3MCwgMHgyMjcxLCAweDIyNzIsIDB4MjI3MywgMHgwMDAwLCAweDIyOEEsCisgICAgMHgwMDAwLCAweDIyOEIsIDB4MjI3NiwgMHgyMjc3LCAweDIyNzksIDB4MjJEQSwgMHgyMkRCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyMjIxLCAweDIyNDUsIDB4MjI0MywgMHgyMjQ4LCAweDAwMDAsIDB4MjJBNCwgMHgyMkFCLAorICAgIDB4MDAwMCwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MDAwMCwgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLCAweDI0NjQsIDB4MjQ2NSwKKyAgICAweDI0NjYsIDB4MjQ2NywgMHgyNDY4LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksCisgICAgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwKKyAgICAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksCisgICAgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwKKyAgICAweDAwMjksIDB4MDAyMSwgMHgwMEIwLCAweDAwMjcsIDB4MDAyMiwgMHgyMDM0LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDAwLCAweDAwMDAsIDB4MjAyMCwgMHgyMDIwLCAweDIwMjEsIDB4MjAyMCwgMHgwMEE3LCAweDAwMjMsCisgICAgMHgwMDJBLCAweDAwMkEsIDB4MDAwMCwgMHgwMDAwLCAweDIwNDIsIDB4MDAyQSwgMHgwMDAwLCAweDAwMDAsIDB4MjA0MiwKKyAgICAweDAwMkEsIDB4MDAwMCwgMHgwMDAwLCAweDIwMjIsIDB4MjBERiwgMHgyMERGLCAweDAwMDAsIDB4MjBERiwgMHgzMDA4LAorICAgIDB4MzAwOSwgMHgzMDBBLCAweDMwMEIsIDB4MjYxQywgMHgyNjFFLCAweDAwMDAsIDB4MDAwMCwgMHgyMERFLCAweDAwMDAsCisgICAgMHgyMERFLCAweDIwREUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMERELCAweDIwREQsIDB4MjcxQSwKKyAgICAweDI3MTYsIDB4MDAwMCwgMHgyNUVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyNUNDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQTksIDB4MDAwMCwgMHgwMDAwLCAweDI2MkYsIDB4MDAwMCwgMHgyNjJGLAorICAgIDB4MjYyRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzMDIwLCAweDAwMDAsIDB4Mjc3NiwgMHgyNzc3LCAweDI3NzgsCisgICAgMHgyNzc5LCAweDI3N0EsIDB4Mjc3QiwgMHgyNzdDLCAweDI3N0QsIDB4Mjc3RSwgMHgyNzdGLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDI2NDIsIDB4MjJBOSwgMHgzMDM2LCAweDI1Q0IsCisgICAgMHgyNUQzLCAweDI1QTEsIDB4MjMwMiwgMHgwMDAwLCAweDI1QUQsIDB4MjVBRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDI1QzcsIDB4MDAwMCwgMHgwMDAwLCAweDIyMDYsIDB4MjJCRiwgMHgyMzFFLCAweDAwMDAsIDB4MjIyNSwgMHgyMjI2LAorICAgIDB4MDAwMCwgMHgyMjUzLCAweDIyNTEsIDB4MjI2NiwgMHgyMjY3LCAweDIyMTMsIDB4MjI5NSwgMHgyMjk2LCAweDIyOTcsCisgICAgMHgyMERELCAweDIzMTQsIDB4MDAwMCwgMHgwMDAwLCAweDIyNjIsIDB4MDAwMCwgMHgyNUIxLCAweDAwMDAsIDB4MjIyMiwKKyAgICAweDIyNTAsIDB4MDBEOCwgMHgyMzRBLCAweDIyQTMsIDB4MDMzOCwgMHgwMDAwLCAweDIyNkUsIDB4MjI2RiwgMHgyMjg1LAorICAgIDB4MjI4NCwgMHgyMjA5LCAweDIyMEMsIDB4MjJCQiwgMHgwMDE2LCAweDIyNUEsIDB4MjMwNiwgMHgwMDI0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDMyOUUsIDB4MDAwMCwgMHgyMDNDLCAweDAwM0YsIDB4MDAwMCwKKyAgICAweDAwM0YsIDB4MjJDNCwgMHgyNUM3LCAweDIyQzQsIDB4MjVDNiwgMHgyNUFCLCAweDI1QTEsIDB4MjVBQiwgMHgyNUEwLAorICAgIDB4MjVFNiwgMHgyNUNCLCAweDI1RTYsIDB4MjVDRiwgMHgyNUJELCAweDI1QjMsIDB4MjVCNywgMHgyNUMxLCAweDI3MjYsCisgICAgMHgyNUNGLCAweDI1QTAsIDB4MDAwMCwgMHgyNUNBLCAweDMyMzEsIDB4MzIzOSwgMHgzM0NCLCAweDI0ODMsIDB4MjQ5NCwKKyAgICAweDI0OTUsIDB4MjQ5NiwgMHgyNDk3LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgyMTkyLCAweDIxOTAsIDB4MjE5MSwgMHgyMTkzLCAweDIxOTYsCisgICAgMHgyMTk3LCAweDIxOTgsIDB4MjE5OSwgMHgyMUQwLCAweDIxQ0YsIDB4MjFDRCwgMHgyMUQ0LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyNzk0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI3OUMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyN0JBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjFEMSwgMHgyMUQzLAorICAgIDB4MDAwMCwgMHgyNzlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI3OUUsIDB4MDAwMCwgMHgwMDAwLCAweDIxQjUsCisgICAgMHgyMUIxLCAweDAwMDAsIDB4MjFCNCwgMHgyMUIwLCAweDIxQjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxRTYsIDB4MjFFOCwgMHgyMUU3LAorICAgIDB4MjFFOSwgMHgyMUJDLCAweDIxQzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMUMwLCAweDIxQkMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxQzQsIDB4MjFDNSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwKKyAgICAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAorICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsCisgICAgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwKKyAgICAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAorICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsCisgICAgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAorICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAorICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAorICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsCisgICAgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwKKyAgICAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDI0ODMsIDB4MjQ4NCwgMHgyNDg1LAorICAgIDB4MjQ4NiwgMHgyNDg3LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDIwREQsCisgICAgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwKKyAgICAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAorICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDMyOTQsCisgICAgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwKKyAgICAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDMyQTUsIDB4MjBERCwgMHgyMERELAorICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsCisgICAgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwKKyAgICAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAorICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsCisgICAgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwKKyAgICAweDIwREQsIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4Mjc5NCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDIxRTAsIDB4MjFFMSwgMHgyMUUyLCAweDIxRTMsIDB4MDAwMCwgMHgyN0ExLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDIxRTYsIDB4MjFFOCwgMHgyMUU3LCAweDIxRTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyNjFELCAweDI2MUYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERFLAorICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDAwNUQsCisgICAgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwKKyAgICAweDAwNUQsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAorICAgIDB4MjBERSwgMHgyMERFLCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsCisgICAgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAorICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgzMjkwLCAweDMyOEEsIDB4MzI4QiwgMHgzMjhDLCAweDMyOEQsIDB4MzI4RSwKKyAgICAweDMyOEYsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgzMDBDLAorICAgIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MjFFOCwgMHgyMUU2LCAweDIxRTcsIDB4MjFFOSwgMHgwMDIyLCAweDMwMUYsCisgICAgMHgzMDFELCAweDIwMzYsIDB4MDA2MCwgMHgzMDAxLCAweDAwMDAsIDB4MDAyMSwgMHgzMDIxLCAweDAwMkMsIDB4MzAwMiwKKyAgICAweEFDMDIsIDB4QUMwMywgMHhBQzA1LCAweEFDMDYsIDB4QUMwQiwgMHhBQzBDLCAweEFDMEQsIDB4QUMwRSwgMHhBQzBGLAorICAgIDB4QUMxOCwgMHhBQzFFLCAweEFDMUYsIDB4QUMyMSwgMHhBQzIyLCAweEFDMjMsIDB4QUMyNSwgMHhBQzI2LCAweEFDMjcsCisgICAgMHhBQzI4LCAweEFDMjksIDB4QUMyQSwgMHhBQzJCLCAweEFDMkUsIDB4QUMzMiwgMHhBQzMzLCAweEFDMzQsIDB4QUMzNSwKKyAgICAweEFDMzYsIDB4QUMzNywgMHhBQzNBLCAweEFDM0IsIDB4QUMzRCwgMHhBQzNFLCAweEFDM0YsIDB4QUM0MSwgMHhBQzQyLAorICAgIDB4QUM0MywgMHhBQzQ0LCAweEFDNDUsIDB4QUM0NiwgMHhBQzQ3LCAweEFDNDgsIDB4QUM0OSwgMHhBQzRBLCAweEFDNEMsCisgICAgMHhBQzRFLCAweEFDNEYsIDB4QUM1MCwgMHhBQzUxLCAweEFDNTIsIDB4QUM1MywgMHhBQzU1LCAweEFDNTYsIDB4QUM1NywKKyAgICAweEFDNTksIDB4QUM1QSwgMHhBQzVCLCAweEFDNUQsIDB4QUM1RSwgMHhBQzVGLCAweEFDNjAsIDB4QUM2MSwgMHhBQzYyLAorICAgIDB4QUM2MywgMHhBQzY0LCAweEFDNjUsIDB4QUM2NiwgMHhBQzY3LCAweEFDNjgsIDB4QUM2OSwgMHhBQzZBLCAweEFDNkIsCisgICAgMHhBQzZDLCAweEFDNkQsIDB4QUM2RSwgMHhBQzZGLCAweEFDNzIsIDB4QUM3MywgMHhBQzc1LCAweEFDNzYsIDB4QUM3OSwKKyAgICAweEFDN0IsIDB4QUM3QywgMHhBQzdELCAweEFDN0UsIDB4QUM3RiwgMHhBQzgyLCAweEFDODcsIDB4QUM4OCwgMHhBQzhELAorICAgIDB4QUM4RSwgMHhBQzhGLCAweEFDOTEsIDB4QUM5MiwgMHhBQzkzLCAweEFDOTUsIDB4QUM5NiwgMHhBQzk3LCAweEFDOTgsCisgICAgMHhBQzk5LCAweEFDOUEsIDB4QUM5QiwgMHhBQzlFLCAweEFDQTIsIDB4QUNBMywgMHhBQ0E0LCAweEFDQTUsIDB4QUNBNiwKKyAgICAweEFDQTcsIDB4QUNBQiwgMHhBQ0FELCAweEFDQUUsIDB4QUNCMSwgMHhBQ0IyLCAweEFDQjMsIDB4QUNCNCwgMHhBQ0I1LAorICAgIDB4QUNCNiwgMHhBQ0I3LCAweEFDQkEsIDB4QUNCRSwgMHhBQ0JGLCAweEFDQzAsIDB4QUNDMiwgMHhBQ0MzLCAweEFDQzUsCisgICAgMHhBQ0M2LCAweEFDQzcsIDB4QUNDOSwgMHhBQ0NBLCAweEFDQ0IsIDB4QUNDRCwgMHhBQ0NFLCAweEFDQ0YsIDB4QUNEMCwKKyAgICAweEFDRDEsIDB4QUNEMiwgMHhBQ0QzLCAweEFDRDQsIDB4QUNENiwgMHhBQ0Q4LCAweEFDRDksIDB4QUNEQSwgMHhBQ0RCLAorICAgIDB4QUNEQywgMHhBQ0RELCAweEFDREUsIDB4QUNERiwgMHhBQ0UyLCAweEFDRTMsIDB4QUNFNSwgMHhBQ0U2LCAweEFDRTksCisgICAgMHhBQ0VCLCAweEFDRUQsIDB4QUNFRSwgMHhBQ0YyLCAweEFDRjQsIDB4QUNGNywgMHhBQ0Y4LCAweEFDRjksIDB4QUNGQSwKKyAgICAweEFDRkIsIDB4QUNGRSwgMHhBQ0ZGLCAweEFEMDEsIDB4QUQwMiwgMHhBRDAzLCAweEFEMDUsIDB4QUQwNywgMHhBRDA4LAorICAgIDB4QUQwOSwgMHhBRDBBLCAweEFEMEIsIDB4QUQwRSwgMHhBRDEwLCAweEFEMTIsIDB4QUQxMywgMHhBRDE0LCAweEFEMTUsCisgICAgMHhBRDE2LCAweEFEMTcsIDB4QUQxOSwgMHhBRDFBLCAweEFEMUIsIDB4QUQxRCwgMHhBRDFFLCAweEFEMUYsIDB4QUQyMSwKKyAgICAweEFEMjIsIDB4QUQyMywgMHhBRDI0LCAweEFEMjUsIDB4QUQyNiwgMHhBRDI3LCAweEFEMjgsIDB4QUQyQSwgMHhBRDJCLAorICAgIDB4QUQyRSwgMHhBRDJGLCAweEFEMzAsIDB4QUQzMSwgMHhBRDMyLCAweEFEMzMsIDB4QUQzNiwgMHhBRDM3LCAweEFEMzksCisgICAgMHhBRDNBLCAweEFEM0IsIDB4QUQzRCwgMHhBRDNFLCAweEFEM0YsIDB4QUQ0MCwgMHhBRDQxLCAweEFENDIsIDB4QUQ0MywKKyAgICAweEFENDYsIDB4QUQ0OCwgMHhBRDRBLCAweEFENEIsIDB4QUQ0QywgMHhBRDRELCAweEFENEUsIDB4QUQ0RiwgMHhBRDUxLAorICAgIDB4QUQ1MiwgMHhBRDUzLCAweEFENTUsIDB4QUQ1NiwgMHhBRDU3LCAweEFENTksIDB4QUQ1QSwgMHhBRDVCLCAweEFENUMsCisgICAgMHhBRDVELCAweEFENUUsIDB4QUQ1RiwgMHhBRDYwLCAweEFENjIsIDB4QUQ2NCwgMHhBRDY1LCAweEFENjYsIDB4QUQ2NywKKyAgICAweEFENjgsIDB4QUQ2OSwgMHhBRDZBLCAweEFENkIsIDB4QUQ2RSwgMHhBRDZGLCAweEFENzEsIDB4QUQ3MiwgMHhBRDc3LAorICAgIDB4QUQ3OCwgMHhBRDc5LCAweEFEN0EsIDB4QUQ3RSwgMHhBRDgwLCAweEFEODMsIDB4QUQ4NCwgMHhBRDg1LCAweEFEODYsCisgICAgMHhBRDg3LCAweEFEOEEsIDB4QUQ4QiwgMHhBRDhELCAweEFEOEUsIDB4QUQ4RiwgMHhBRDkxLCAweEFEOTIsIDB4QUQ5MywKKyAgICAweEFEOTQsIDB4QUQ5NSwgMHhBRDk2LCAweEFEOTcsIDB4QUQ5OCwgMHhBRDk5LCAweEFEOUEsIDB4QUQ5QiwgMHhBRDlFLAorICAgIDB4QUQ5RiwgMHhBREEwLCAweEFEQTEsIDB4QURBMiwgMHhBREEzLCAweEFEQTUsIDB4QURBNiwgMHhBREE3LCAweEFEQTgsCisgICAgMHhBREE5LCAweEFEQUEsIDB4QURBQiwgMHhBREFDLCAweEFEQUQsIDB4QURBRSwgMHhBREFGLCAweEFEQjAsIDB4QURCMSwKKyAgICAweEFEQjIsIDB4QURCMywgMHhBREI0LCAweEFEQjUsIDB4QURCNiwgMHhBREI4LCAweEFEQjksIDB4QURCQSwgMHhBREJCLAorICAgIDB4QURCQywgMHhBREJELCAweEFEQkUsIDB4QURCRiwgMHhBREMyLCAweEFEQzMsIDB4QURDNSwgMHhBREM2LCAweEFEQzcsCisgICAgMHhBREM5LCAweEFEQ0EsIDB4QURDQiwgMHhBRENDLCAweEFEQ0QsIDB4QURDRSwgMHhBRENGLCAweEFERDIsIDB4QURENCwKKyAgICAweEFERDUsIDB4QURENiwgMHhBREQ3LCAweEFERDgsIDB4QUREOSwgMHhBRERBLCAweEFEREIsIDB4QURERCwgMHhBRERFLAorICAgIDB4QURERiwgMHhBREUxLCAweEFERTIsIDB4QURFMywgMHhBREU1LCAweEFERTYsIDB4QURFNywgMHhBREU4LCAweEFERTksCisgICAgMHhBREVBLCAweEFERUIsIDB4QURFQywgMHhBREVELCAweEFERUUsIDB4QURFRiwgMHhBREYwLCAweEFERjEsIDB4QURGMiwKKyAgICAweEFERjMsIDB4QURGNCwgMHhBREY1LCAweEFERjYsIDB4QURGNywgMHhBREZBLCAweEFERkIsIDB4QURGRCwgMHhBREZFLAorICAgIDB4QUUwMiwgMHhBRTAzLCAweEFFMDQsIDB4QUUwNSwgMHhBRTA2LCAweEFFMDcsIDB4QUUwQSwgMHhBRTBDLCAweEFFMEUsCisgICAgMHhBRTBGLCAweEFFMTAsIDB4QUUxMSwgMHhBRTEyLCAweEFFMTMsIDB4QUUxNSwgMHhBRTE2LCAweEFFMTcsIDB4QUUxOCwKKyAgICAweEFFMTksIDB4QUUxQSwgMHhBRTFCLCAweEFFMUMsIDB4QUUxRCwgMHhBRTFFLCAweEFFMUYsIDB4QUUyMCwgMHhBRTIxLAorICAgIDB4QUUyMiwgMHhBRTIzLCAweEFFMjQsIDB4QUUyNSwgMHhBRTI2LCAweEFFMjcsIDB4QUUyOCwgMHhBRTI5LCAweEFFMkEsCisgICAgMHhBRTJCLCAweEFFMkMsIDB4QUUyRCwgMHhBRTJFLCAweEFFMkYsIDB4QUUzMiwgMHhBRTMzLCAweEFFMzUsIDB4QUUzNiwKKyAgICAweEFFMzksIDB4QUUzQiwgMHhBRTNDLCAweEFFM0QsIDB4QUUzRSwgMHhBRTNGLCAweEFFNDIsIDB4QUU0NCwgMHhBRTQ3LAorICAgIDB4QUU0OCwgMHhBRTQ5LCAweEFFNEIsIDB4QUU0RiwgMHhBRTUxLCAweEFFNTIsIDB4QUU1MywgMHhBRTU1LCAweEFFNTcsCisgICAgMHhBRTU4LCAweEFFNTksIDB4QUU1QSwgMHhBRTVCLCAweEFFNUUsIDB4QUU2MiwgMHhBRTYzLCAweEFFNjQsIDB4QUU2NiwKKyAgICAweEFFNjcsIDB4QUU2QSwgMHhBRTZCLCAweEFFNkQsIDB4QUU2RSwgMHhBRTZGLCAweEFFNzEsIDB4QUU3MiwgMHhBRTczLAorICAgIDB4QUU3NCwgMHhBRTc1LCAweEFFNzYsIDB4QUU3NywgMHhBRTdBLCAweEFFN0UsIDB4QUU3RiwgMHhBRTgwLCAweEFFODEsCisgICAgMHhBRTgyLCAweEFFODMsIDB4QUU4NiwgMHhBRTg3LCAweEFFODgsIDB4QUU4OSwgMHhBRThBLCAweEFFOEIsIDB4QUU4RCwKKyAgICAweEFFOEUsIDB4QUU4RiwgMHhBRTkwLCAweEFFOTEsIDB4QUU5MiwgMHhBRTkzLCAweEFFOTQsIDB4QUU5NSwgMHhBRTk2LAorICAgIDB4QUU5NywgMHhBRTk4LCAweEFFOTksIDB4QUU5QSwgMHhBRTlCLCAweEFFOUMsIDB4QUU5RCwgMHhBRTlFLCAweEFFOUYsCisgICAgMHhBRUEwLCAweEFFQTEsIDB4QUVBMiwgMHhBRUEzLCAweEFFQTQsIDB4QUVBNSwgMHhBRUE2LCAweEFFQTcsIDB4QUVBOCwKKyAgICAweEFFQTksIDB4QUVBQSwgMHhBRUFCLCAweEFFQUMsIDB4QUVBRCwgMHhBRUFFLCAweEFFQUYsIDB4QUVCMCwgMHhBRUIxLAorICAgIDB4QUVCMiwgMHhBRUIzLCAweEFFQjQsIDB4QUVCNSwgMHhBRUI2LCAweEFFQjcsIDB4QUVCOCwgMHhBRUI5LCAweEFFQkEsCisgICAgMHhBRUJCLCAweEFFQkYsIDB4QUVDMSwgMHhBRUMyLCAweEFFQzMsIDB4QUVDNSwgMHhBRUM2LCAweEFFQzcsIDB4QUVDOCwKKyAgICAweEFFQzksIDB4QUVDQSwgMHhBRUNCLCAweEFFQ0UsIDB4QUVEMiwgMHhBRUQzLCAweEFFRDQsIDB4QUVENSwgMHhBRUQ2LAorICAgIDB4QUVENywgMHhBRURBLCAweEFFREIsIDB4QUVERCwgMHhBRURFLCAweEFFREYsIDB4QUVFMCwgMHhBRUUxLCAweEFFRTIsCisgICAgMHhBRUUzLCAweEFFRTQsIDB4QUVFNSwgMHhBRUU2LCAweEFFRTcsIDB4QUVFOSwgMHhBRUVBLCAweEFFRUMsIDB4QUVFRSwKKyAgICAweEFFRUYsIDB4QUVGMCwgMHhBRUYxLCAweEFFRjIsIDB4QUVGMywgMHhBRUY1LCAweEFFRjYsIDB4QUVGNywgMHhBRUY5LAorICAgIDB4QUVGQSwgMHhBRUZCLCAweEFFRkQsIDB4QUVGRSwgMHhBRUZGLCAweEFGMDAsIDB4QUYwMSwgMHhBRjAyLCAweEFGMDMsCisgICAgMHhBRjA0LCAweEFGMDUsIDB4QUYwNiwgMHhBRjA5LCAweEFGMEEsIDB4QUYwQiwgMHhBRjBDLCAweEFGMEUsIDB4QUYwRiwKKyAgICAweEFGMTEsIDB4QUYxMiwgMHhBRjEzLCAweEFGMTQsIDB4QUYxNSwgMHhBRjE2LCAweEFGMTcsIDB4QUYxOCwgMHhBRjE5LAorICAgIDB4QUYxQSwgMHhBRjFCLCAweEFGMUMsIDB4QUYxRCwgMHhBRjFFLCAweEFGMUYsIDB4QUYyMCwgMHhBRjIxLCAweEFGMjIsCisgICAgMHhBRjIzLCAweEFGMjQsIDB4QUYyNSwgMHhBRjI2LCAweEFGMjcsIDB4QUYyOCwgMHhBRjI5LCAweEFGMkEsIDB4QUYyQiwKKyAgICAweEFGMkUsIDB4QUYyRiwgMHhBRjMxLCAweEFGMzMsIDB4QUYzNSwgMHhBRjM2LCAweEFGMzcsIDB4QUYzOCwgMHhBRjM5LAorICAgIDB4QUYzQSwgMHhBRjNCLCAweEFGM0UsIDB4QUY0MCwgMHhBRjQ0LCAweEFGNDUsIDB4QUY0NiwgMHhBRjQ3LCAweEFGNEEsCisgICAgMHhBRjRCLCAweEFGNEMsIDB4QUY0RCwgMHhBRjRFLCAweEFGNEYsIDB4QUY1MSwgMHhBRjUyLCAweEFGNTMsIDB4QUY1NCwKKyAgICAweEFGNTUsIDB4QUY1NiwgMHhBRjU3LCAweEFGNTgsIDB4QUY1OSwgMHhBRjVBLCAweEFGNUIsIDB4QUY1RSwgMHhBRjVGLAorICAgIDB4QUY2MCwgMHhBRjYxLCAweEFGNjIsIDB4QUY2MywgMHhBRjY2LCAweEFGNjcsIDB4QUY2OCwgMHhBRjY5LCAweEFGNkEsCisgICAgMHhBRjZCLCAweEFGNkMsIDB4QUY2RCwgMHhBRjZFLCAweEFGNkYsIDB4QUY3MCwgMHhBRjcxLCAweEFGNzIsIDB4QUY3MywKKyAgICAweEFGNzQsIDB4QUY3NSwgMHhBRjc2LCAweEFGNzcsIDB4QUY3OCwgMHhBRjdBLCAweEFGN0IsIDB4QUY3QywgMHhBRjdELAorICAgIDB4QUY3RSwgMHhBRjdGLCAweEFGODEsIDB4QUY4MiwgMHhBRjgzLCAweEFGODUsIDB4QUY4NiwgMHhBRjg3LCAweEFGODksCisgICAgMHhBRjhBLCAweEFGOEIsIDB4QUY4QywgMHhBRjhELCAweEFGOEUsIDB4QUY4RiwgMHhBRjkyLCAweEFGOTMsIDB4QUY5NCwKKyAgICAweEFGOTYsIDB4QUY5NywgMHhBRjk4LCAweEFGOTksIDB4QUY5QSwgMHhBRjlCLCAweEFGOUQsIDB4QUY5RSwgMHhBRjlGLAorICAgIDB4QUZBMCwgMHhBRkExLCAweEFGQTIsIDB4QUZBMywgMHhBRkE0LCAweEFGQTUsIDB4QUZBNiwgMHhBRkE3LCAweEFGQTgsCisgICAgMHhBRkE5LCAweEFGQUEsIDB4QUZBQiwgMHhBRkFDLCAweEFGQUQsIDB4QUZBRSwgMHhBRkFGLCAweEFGQjAsIDB4QUZCMSwKKyAgICAweEFGQjIsIDB4QUZCMywgMHhBRkI0LCAweEFGQjUsIDB4QUZCNiwgMHhBRkI3LCAweEFGQkEsIDB4QUZCQiwgMHhBRkJELAorICAgIDB4QUZCRSwgMHhBRkJGLCAweEFGQzEsIDB4QUZDMiwgMHhBRkMzLCAweEFGQzQsIDB4QUZDNSwgMHhBRkM2LCAweEFGQ0EsCisgICAgMHhBRkNDLCAweEFGQ0YsIDB4QUZEMCwgMHhBRkQxLCAweEFGRDIsIDB4QUZEMywgMHhBRkQ1LCAweEFGRDYsIDB4QUZENywKKyAgICAweEFGRDgsIDB4QUZEOSwgMHhBRkRBLCAweEFGREIsIDB4QUZERCwgMHhBRkRFLCAweEFGREYsIDB4QUZFMCwgMHhBRkUxLAorICAgIDB4QUZFMiwgMHhBRkUzLCAweEFGRTQsIDB4QUZFNSwgMHhBRkU2LCAweEFGRTcsIDB4QUZFQSwgMHhBRkVCLCAweEFGRUMsCisgICAgMHhBRkVELCAweEFGRUUsIDB4QUZFRiwgMHhBRkYyLCAweEFGRjMsIDB4QUZGNSwgMHhBRkY2LCAweEFGRjcsIDB4QUZGOSwKKyAgICAweEFGRkEsIDB4QUZGQiwgMHhBRkZDLCAweEFGRkQsIDB4QUZGRSwgMHhBRkZGLCAweEIwMDIsIDB4QjAwMywgMHhCMDA1LAorICAgIDB4QjAwNiwgMHhCMDA3LCAweEIwMDgsIDB4QjAwOSwgMHhCMDBBLCAweEIwMEIsIDB4QjAwRCwgMHhCMDBFLCAweEIwMEYsCisgICAgMHhCMDExLCAweEIwMTIsIDB4QjAxMywgMHhCMDE1LCAweEIwMTYsIDB4QjAxNywgMHhCMDE4LCAweEIwMTksIDB4QjAxQSwKKyAgICAweEIwMUIsIDB4QjAxRSwgMHhCMDFGLCAweEIwMjAsIDB4QjAyMSwgMHhCMDIyLCAweEIwMjMsIDB4QjAyNCwgMHhCMDI1LAorICAgIDB4QjAyNiwgMHhCMDI3LCAweEIwMjksIDB4QjAyQSwgMHhCMDJCLCAweEIwMkMsIDB4QjAyRCwgMHhCMDJFLCAweEIwMkYsCisgICAgMHhCMDMwLCAweEIwMzEsIDB4QjAzMiwgMHhCMDMzLCAweEIwMzQsIDB4QjAzNSwgMHhCMDM2LCAweEIwMzcsIDB4QjAzOCwKKyAgICAweEIwMzksIDB4QjAzQSwgMHhCMDNCLCAweEIwM0MsIDB4QjAzRCwgMHhCMDNFLCAweEIwM0YsIDB4QjA0MCwgMHhCMDQxLAorICAgIDB4QjA0MiwgMHhCMDQzLCAweEIwNDYsIDB4QjA0NywgMHhCMDQ5LCAweEIwNEIsIDB4QjA0RCwgMHhCMDRGLCAweEIwNTAsCisgICAgMHhCMDUxLCAweEIwNTIsIDB4QjA1NiwgMHhCMDU4LCAweEIwNUEsIDB4QjA1QiwgMHhCMDVDLCAweEIwNUUsIDB4QjA1RiwKKyAgICAweEIwNjAsIDB4QjA2MSwgMHhCMDYyLCAweEIwNjMsIDB4QjA2NCwgMHhCMDY1LCAweEIwNjYsIDB4QjA2NywgMHhCMDY4LAorICAgIDB4QjA2OSwgMHhCMDZBLCAweEIwNkIsIDB4QjA2QywgMHhCMDZELCAweEIwNkUsIDB4QjA2RiwgMHhCMDcwLCAweEIwNzEsCisgICAgMHhCMDcyLCAweEIwNzMsIDB4QjA3NCwgMHhCMDc1LCAweEIwNzYsIDB4QjA3NywgMHhCMDc4LCAweEIwNzksIDB4QjA3QSwKKyAgICAweEIwN0IsIDB4QjA3RSwgMHhCMDdGLCAweEIwODEsIDB4QjA4MiwgMHhCMDgzLCAweEIwODUsIDB4QjA4NiwgMHhCMDg3LAorICAgIDB4QjA4OCwgMHhCMDg5LCAweEIwOEEsIDB4QjA4QiwgMHhCMDhFLCAweEIwOTAsIDB4QjA5MiwgMHhCMDkzLCAweEIwOTQsCisgICAgMHhCMDk1LCAweEIwOTYsIDB4QjA5NywgMHhCMDlCLCAweEIwOUQsIDB4QjA5RSwgMHhCMEEzLCAweEIwQTQsIDB4QjBBNSwKKyAgICAweEIwQTYsIDB4QjBBNywgMHhCMEFBLCAweEIwQjAsIDB4QjBCMiwgMHhCMEI2LCAweEIwQjcsIDB4QjBCOSwgMHhCMEJBLAorICAgIDB4QjBCQiwgMHhCMEJELCAweEIwQkUsIDB4QjBCRiwgMHhCMEMwLCAweEIwQzEsIDB4QjBDMiwgMHhCMEMzLCAweEIwQzYsCisgICAgMHhCMENBLCAweEIwQ0IsIDB4QjBDQywgMHhCMENELCAweEIwQ0UsIDB4QjBDRiwgMHhCMEQyLCAweEIwRDMsIDB4QjBENSwKKyAgICAweEIwRDYsIDB4QjBENywgMHhCMEQ5LCAweEIwREEsIDB4QjBEQiwgMHhCMERDLCAweEIwREQsIDB4QjBERSwgMHhCMERGLAorICAgIDB4QjBFMSwgMHhCMEUyLCAweEIwRTMsIDB4QjBFNCwgMHhCMEU2LCAweEIwRTcsIDB4QjBFOCwgMHhCMEU5LCAweEIwRUEsCisgICAgMHhCMEVCLCAweEIwRUMsIDB4QjBFRCwgMHhCMEVFLCAweEIwRUYsIDB4QjBGMCwgMHhCMEYxLCAweEIwRjIsIDB4QjBGMywKKyAgICAweEIwRjQsIDB4QjBGNSwgMHhCMEY2LCAweEIwRjcsIDB4QjBGOCwgMHhCMEY5LCAweEIwRkEsIDB4QjBGQiwgMHhCMEZDLAorICAgIDB4QjBGRCwgMHhCMEZFLCAweEIwRkYsIDB4QjEwMCwgMHhCMTAxLCAweEIxMDIsIDB4QjEwMywgMHhCMTA0LCAweEIxMDUsCisgICAgMHhCMTA2LCAweEIxMDcsIDB4QjEwQSwgMHhCMTBELCAweEIxMEUsIDB4QjEwRiwgMHhCMTExLCAweEIxMTQsIDB4QjExNSwKKyAgICAweEIxMTYsIDB4QjExNywgMHhCMTFBLCAweEIxMUUsIDB4QjExRiwgMHhCMTIwLCAweEIxMjEsIDB4QjEyMiwgMHhCMTI2LAorICAgIDB4QjEyNywgMHhCMTI5LCAweEIxMkEsIDB4QjEyQiwgMHhCMTJELCAweEIxMkUsIDB4QjEyRiwgMHhCMTMwLCAweEIxMzEsCisgICAgMHhCMTMyLCAweEIxMzMsIDB4QjEzNiwgMHhCMTNBLCAweEIxM0IsIDB4QjEzQywgMHhCMTNELCAweEIxM0UsIDB4QjEzRiwKKyAgICAweEIxNDIsIDB4QjE0MywgMHhCMTQ1LCAweEIxNDYsIDB4QjE0NywgMHhCMTQ5LCAweEIxNEEsIDB4QjE0QiwgMHhCMTRDLAorICAgIDB4QjE0RCwgMHhCMTRFLCAweEIxNEYsIDB4QjE1MiwgMHhCMTUzLCAweEIxNTYsIDB4QjE1NywgMHhCMTU5LCAweEIxNUEsCisgICAgMHhCMTVCLCAweEIxNUQsIDB4QjE1RSwgMHhCMTVGLCAweEIxNjEsIDB4QjE2MiwgMHhCMTYzLCAweEIxNjQsIDB4QjE2NSwKKyAgICAweEIxNjYsIDB4QjE2NywgMHhCMTY4LCAweEIxNjksIDB4QjE2QSwgMHhCMTZCLCAweEIxNkMsIDB4QjE2RCwgMHhCMTZFLAorICAgIDB4QjE2RiwgMHhCMTcwLCAweEIxNzEsIDB4QjE3MiwgMHhCMTczLCAweEIxNzQsIDB4QjE3NSwgMHhCMTc2LCAweEIxNzcsCisgICAgMHhCMTdBLCAweEIxN0IsIDB4QjE3RCwgMHhCMTdFLCAweEIxN0YsIDB4QjE4MSwgMHhCMTgzLCAweEIxODQsIDB4QjE4NSwKKyAgICAweEIxODYsIDB4QjE4NywgMHhCMThBLCAweEIxOEMsIDB4QjE4RSwgMHhCMThGLCAweEIxOTAsIDB4QjE5MSwgMHhCMTk1LAorICAgIDB4QjE5NiwgMHhCMTk3LCAweEIxOTksIDB4QjE5QSwgMHhCMTlCLCAweEIxOUQsIDB4QjE5RSwgMHhCMTlGLCAweEIxQTAsCisgICAgMHhCMUExLCAweEIxQTIsIDB4QjFBMywgMHhCMUE0LCAweEIxQTUsIDB4QjFBNiwgMHhCMUE3LCAweEIxQTksIDB4QjFBQSwKKyAgICAweEIxQUIsIDB4QjFBQywgMHhCMUFELCAweEIxQUUsIDB4QjFBRiwgMHhCMUIwLCAweEIxQjEsIDB4QjFCMiwgMHhCMUIzLAorICAgIDB4QjFCNCwgMHhCMUI1LCAweEIxQjYsIDB4QjFCNywgMHhCMUI4LCAweEIxQjksIDB4QjFCQSwgMHhCMUJCLCAweEIxQkMsCisgICAgMHhCMUJELCAweEIxQkUsIDB4QjFCRiwgMHhCMUMwLCAweEIxQzEsIDB4QjFDMiwgMHhCMUMzLCAweEIxQzQsIDB4QjFDNSwKKyAgICAweEIxQzYsIDB4QjFDNywgMHhCMUM4LCAweEIxQzksIDB4QjFDQSwgMHhCMUNCLCAweEIxQ0QsIDB4QjFDRSwgMHhCMUNGLAorICAgIDB4QjFEMSwgMHhCMUQyLCAweEIxRDMsIDB4QjFENSwgMHhCMUQ2LCAweEIxRDcsIDB4QjFEOCwgMHhCMUQ5LCAweEIxREEsCisgICAgMHhCMURCLCAweEIxREUsIDB4QjFFMCwgMHhCMUUxLCAweEIxRTIsIDB4QjFFMywgMHhCMUU0LCAweEIxRTUsIDB4QjFFNiwKKyAgICAweEIxRTcsIDB4QjFFQSwgMHhCMUVCLCAweEIxRUQsIDB4QjFFRSwgMHhCMUVGLCAweEIxRjEsIDB4QjFGMiwgMHhCMUYzLAorICAgIDB4QjFGNCwgMHhCMUY1LCAweEIxRjYsIDB4QjFGNywgMHhCMUY4LCAweEIxRkEsIDB4QjFGQywgMHhCMUZFLCAweEIxRkYsCisgICAgMHhCMjAwLCAweEIyMDEsIDB4QjIwMiwgMHhCMjAzLCAweEIyMDYsIDB4QjIwNywgMHhCMjA5LCAweEIyMEEsIDB4QjIwRCwKKyAgICAweEIyMEUsIDB4QjIwRiwgMHhCMjEwLCAweEIyMTEsIDB4QjIxMiwgMHhCMjEzLCAweEIyMTYsIDB4QjIxOCwgMHhCMjFBLAorICAgIDB4QjIxQiwgMHhCMjFDLCAweEIyMUQsIDB4QjIxRSwgMHhCMjFGLCAweEIyMjEsIDB4QjIyMiwgMHhCMjIzLCAweEIyMjQsCisgICAgMHhCMjI1LCAweEIyMjYsIDB4QjIyNywgMHhCMjI4LCAweEIyMjksIDB4QjIyQSwgMHhCMjJCLCAweEIyMkMsIDB4QjIyRCwKKyAgICAweEIyMkUsIDB4QjIyRiwgMHhCMjMwLCAweEIyMzEsIDB4QjIzMiwgMHhCMjMzLCAweEIyMzUsIDB4QjIzNiwgMHhCMjM3LAorICAgIDB4QjIzOCwgMHhCMjM5LCAweEIyM0EsIDB4QjIzQiwgMHhCMjNELCAweEIyM0UsIDB4QjIzRiwgMHhCMjQwLCAweEIyNDEsCisgICAgMHhCMjQyLCAweEIyNDMsIDB4QjI0NCwgMHhCMjQ1LCAweEIyNDYsIDB4QjI0NywgMHhCMjQ4LCAweEIyNDksIDB4QjI0QSwKKyAgICAweEIyNEIsIDB4QjI0QywgMHhCMjRELCAweEIyNEUsIDB4QjI0RiwgMHhCMjUwLCAweEIyNTEsIDB4QjI1MiwgMHhCMjUzLAorICAgIDB4QjI1NCwgMHhCMjU1LCAweEIyNTYsIDB4QjI1NywgMHhCMjU5LCAweEIyNUEsIDB4QjI1QiwgMHhCMjVELCAweEIyNUUsCisgICAgMHhCMjVGLCAweEIyNjEsIDB4QjI2MiwgMHhCMjYzLCAweEIyNjQsIDB4QjI2NSwgMHhCMjY2LCAweEIyNjcsIDB4QjI2QSwKKyAgICAweEIyNkIsIDB4QjI2QywgMHhCMjZELCAweEIyNkUsIDB4QjI2RiwgMHhCMjcwLCAweEIyNzEsIDB4QjI3MiwgMHhCMjczLAorICAgIDB4QjI3NiwgMHhCMjc3LCAweEIyNzgsIDB4QjI3OSwgMHhCMjdBLCAweEIyN0IsIDB4QjI3RCwgMHhCMjdFLCAweEIyN0YsCisgICAgMHhCMjgwLCAweEIyODEsIDB4QjI4MiwgMHhCMjgzLCAweEIyODYsIDB4QjI4NywgMHhCMjg4LCAweEIyOEEsIDB4QjI4QiwKKyAgICAweEIyOEMsIDB4QjI4RCwgMHhCMjhFLCAweEIyOEYsIDB4QjI5MiwgMHhCMjkzLCAweEIyOTUsIDB4QjI5NiwgMHhCMjk3LAorICAgIDB4QjI5QiwgMHhCMjlDLCAweEIyOUQsIDB4QjI5RSwgMHhCMjlGLCAweEIyQTIsIDB4QjJBNCwgMHhCMkE3LCAweEIyQTgsCisgICAgMHhCMkE5LCAweEIyQUIsIDB4QjJBRCwgMHhCMkFFLCAweEIyQUYsIDB4QjJCMSwgMHhCMkIyLCAweEIyQjMsIDB4QjJCNSwKKyAgICAweEIyQjYsIDB4QjJCNywgMHhCMkI4LCAweEIyQjksIDB4QjJCQSwgMHhCMkJCLCAweEIyQkMsIDB4QjJCRCwgMHhCMkJFLAorICAgIDB4QjJCRiwgMHhCMkMwLCAweEIyQzEsIDB4QjJDMiwgMHhCMkMzLCAweEIyQzQsIDB4QjJDNSwgMHhCMkM2LCAweEIyQzcsCisgICAgMHhCMkNBLCAweEIyQ0IsIDB4QjJDRCwgMHhCMkNFLCAweEIyQ0YsIDB4QjJEMSwgMHhCMkQzLCAweEIyRDQsIDB4QjJENSwKKyAgICAweEIyRDYsIDB4QjJENywgMHhCMkRBLCAweEIyREMsIDB4QjJERSwgMHhCMkRGLCAweEIyRTAsIDB4QjJFMSwgMHhCMkUzLAorICAgIDB4QjJFNywgMHhCMkU5LCAweEIyRUEsIDB4QjJGMCwgMHhCMkYxLCAweEIyRjIsIDB4QjJGNiwgMHhCMkZDLCAweEIyRkQsCisgICAgMHhCMkZFLCAweEIzMDIsIDB4QjMwMywgMHhCMzA1LCAweEIzMDYsIDB4QjMwNywgMHhCMzA5LCAweEIzMEEsIDB4QjMwQiwKKyAgICAweEIzMEMsIDB4QjMwRCwgMHhCMzBFLCAweEIzMEYsIDB4QjMxMiwgMHhCMzE2LCAweEIzMTcsIDB4QjMxOCwgMHhCMzE5LAorICAgIDB4QjMxQSwgMHhCMzFCLCAweEIzMUQsIDB4QjMxRSwgMHhCMzFGLCAweEIzMjAsIDB4QjMyMSwgMHhCMzIyLCAweEIzMjMsCisgICAgMHhCMzI0LCAweEIzMjUsIDB4QjMyNiwgMHhCMzI3LCAweEIzMjgsIDB4QjMyOSwgMHhCMzJBLCAweEIzMkIsIDB4QjMyQywKKyAgICAweEIzMkQsIDB4QjMyRSwgMHhCMzJGLCAweEIzMzAsIDB4QjMzMSwgMHhCMzMyLCAweEIzMzMsIDB4QjMzNCwgMHhCMzM1LAorICAgIDB4QjMzNiwgMHhCMzM3LCAweEIzMzgsIDB4QjMzOSwgMHhCMzNBLCAweEIzM0IsIDB4QjMzQywgMHhCMzNELCAweEIzM0UsCisgICAgMHhCMzNGLCAweEIzNDAsIDB4QjM0MSwgMHhCMzQyLCAweEIzNDMsIDB4QjM0NCwgMHhCMzQ1LCAweEIzNDYsIDB4QjM0NywKKyAgICAweEIzNDgsIDB4QjM0OSwgMHhCMzRBLCAweEIzNEIsIDB4QjM0QywgMHhCMzRELCAweEIzNEUsIDB4QjM0RiwgMHhCMzUwLAorICAgIDB4QjM1MSwgMHhCMzUyLCAweEIzNTMsIDB4QjM1NywgMHhCMzU5LCAweEIzNUEsIDB4QjM1RCwgMHhCMzYwLCAweEIzNjEsCisgICAgMHhCMzYyLCAweEIzNjMsIDB4QjM2NiwgMHhCMzY4LCAweEIzNkEsIDB4QjM2QywgMHhCMzZELCAweEIzNkYsIDB4QjM3MiwKKyAgICAweEIzNzMsIDB4QjM3NSwgMHhCMzc2LCAweEIzNzcsIDB4QjM3OSwgMHhCMzdBLCAweEIzN0IsIDB4QjM3QywgMHhCMzdELAorICAgIDB4QjM3RSwgMHhCMzdGLCAweEIzODIsIDB4QjM4NiwgMHhCMzg3LCAweEIzODgsIDB4QjM4OSwgMHhCMzhBLCAweEIzOEIsCisgICAgMHhCMzhELCAweEIzOEUsIDB4QjM4RiwgMHhCMzkxLCAweEIzOTIsIDB4QjM5MywgMHhCMzk1LCAweEIzOTYsIDB4QjM5NywKKyAgICAweEIzOTgsIDB4QjM5OSwgMHhCMzlBLCAweEIzOUIsIDB4QjM5QywgMHhCMzlELCAweEIzOUUsIDB4QjM5RiwgMHhCM0EyLAorICAgIDB4QjNBMywgMHhCM0E0LCAweEIzQTUsIDB4QjNBNiwgMHhCM0E3LCAweEIzQTksIDB4QjNBQSwgMHhCM0FCLCAweEIzQUQsCisgICAgMHhCM0FFLCAweEIzQUYsIDB4QjNCMCwgMHhCM0IxLCAweEIzQjIsIDB4QjNCMywgMHhCM0I0LCAweEIzQjUsIDB4QjNCNiwKKyAgICAweEIzQjcsIDB4QjNCOCwgMHhCM0I5LCAweEIzQkEsIDB4QjNCQiwgMHhCM0JDLCAweEIzQkQsIDB4QjNCRSwgMHhCM0JGLAorICAgIDB4QjNDMCwgMHhCM0MxLCAweEIzQzIsIDB4QjNDMywgMHhCM0M2LCAweEIzQzcsIDB4QjNDOSwgMHhCM0NBLCAweEIzQ0QsCisgICAgMHhCM0NGLCAweEIzRDEsIDB4QjNEMiwgMHhCM0QzLCAweEIzRDYsIDB4QjNEOCwgMHhCM0RBLCAweEIzREMsIDB4QjNERSwKKyAgICAweEIzREYsIDB4QjNFMSwgMHhCM0UyLCAweEIzRTMsIDB4QjNFNSwgMHhCM0U2LCAweEIzRTcsIDB4QjNFOSwgMHhCM0VBLAorICAgIDB4QjNFQiwgMHhCM0VDLCAweEIzRUQsIDB4QjNFRSwgMHhCM0VGLCAweEIzRjAsIDB4QjNGMSwgMHhCM0YyLCAweEIzRjMsCisgICAgMHhCM0Y0LCAweEIzRjUsIDB4QjNGNiwgMHhCM0Y3LCAweEIzRjgsIDB4QjNGOSwgMHhCM0ZBLCAweEIzRkIsIDB4QjNGRCwKKyAgICAweEIzRkUsIDB4QjNGRiwgMHhCNDAwLCAweEI0MDEsIDB4QjQwMiwgMHhCNDAzLCAweEI0MDQsIDB4QjQwNSwgMHhCNDA2LAorICAgIDB4QjQwNywgMHhCNDA4LCAweEI0MDksIDB4QjQwQSwgMHhCNDBCLCAweEI0MEMsIDB4QjQwRCwgMHhCNDBFLCAweEI0MEYsCisgICAgMHhCNDExLCAweEI0MTIsIDB4QjQxMywgMHhCNDE0LCAweEI0MTUsIDB4QjQxNiwgMHhCNDE3LCAweEI0MTksIDB4QjQxQSwKKyAgICAweEI0MUIsIDB4QjQxRCwgMHhCNDFFLCAweEI0MUYsIDB4QjQyMSwgMHhCNDIyLCAweEI0MjMsIDB4QjQyNCwgMHhCNDI1LAorICAgIDB4QjQyNiwgMHhCNDI3LCAweEI0MkEsIDB4QjQyQywgMHhCNDJELCAweEI0MkUsIDB4QjQyRiwgMHhCNDMwLCAweEI0MzEsCisgICAgMHhCNDMyLCAweEI0MzMsIDB4QjQzNSwgMHhCNDM2LCAweEI0MzcsIDB4QjQzOCwgMHhCNDM5LCAweEI0M0EsIDB4QjQzQiwKKyAgICAweEI0M0MsIDB4QjQzRCwgMHhCNDNFLCAweEI0M0YsIDB4QjQ0MCwgMHhCNDQxLCAweEI0NDIsIDB4QjQ0MywgMHhCNDQ0LAorICAgIDB4QjQ0NSwgMHhCNDQ2LCAweEI0NDcsIDB4QjQ0OCwgMHhCNDQ5LCAweEI0NEEsIDB4QjQ0QiwgMHhCNDRDLCAweEI0NEQsCisgICAgMHhCNDRFLCAweEI0NEYsIDB4QjQ1MiwgMHhCNDUzLCAweEI0NTUsIDB4QjQ1NiwgMHhCNDU3LCAweEI0NTksIDB4QjQ1QSwKKyAgICAweEI0NUIsIDB4QjQ1QywgMHhCNDVELCAweEI0NUUsIDB4QjQ1RiwgMHhCNDYyLCAweEI0NjQsIDB4QjQ2NiwgMHhCNDY3LAorICAgIDB4QjQ2OCwgMHhCNDY5LCAweEI0NkEsIDB4QjQ2QiwgMHhCNDZELCAweEI0NkUsIDB4QjQ2RiwgMHhCNDcwLCAweEI0NzEsCisgICAgMHhCNDcyLCAweEI0NzMsIDB4QjQ3NCwgMHhCNDc1LCAweEI0NzYsIDB4QjQ3NywgMHhCNDc4LCAweEI0NzksIDB4QjQ3QSwKKyAgICAweEI0N0IsIDB4QjQ3QywgMHhCNDdELCAweEI0N0UsIDB4QjQ3RiwgMHhCNDgxLCAweEI0ODIsIDB4QjQ4MywgMHhCNDg0LAorICAgIDB4QjQ4NSwgMHhCNDg2LCAweEI0ODcsIDB4QjQ4OSwgMHhCNDhBLCAweEI0OEIsIDB4QjQ4QywgMHhCNDhELCAweEI0OEUsCisgICAgMHhCNDhGLCAweEI0OTAsIDB4QjQ5MSwgMHhCNDkyLCAweEI0OTMsIDB4QjQ5NCwgMHhCNDk1LCAweEI0OTYsIDB4QjQ5NywKKyAgICAweEI0OTgsIDB4QjQ5OSwgMHhCNDlBLCAweEI0OUIsIDB4QjQ5QywgMHhCNDlFLCAweEI0OUYsIDB4QjRBMCwgMHhCNEExLAorICAgIDB4QjRBMiwgMHhCNEEzLCAweEI0QTUsIDB4QjRBNiwgMHhCNEE3LCAweEI0QTksIDB4QjRBQSwgMHhCNEFCLCAweEI0QUQsCisgICAgMHhCNEFFLCAweEI0QUYsIDB4QjRCMCwgMHhCNEIxLCAweEI0QjIsIDB4QjRCMywgMHhCNEI0LCAweEI0QjYsIDB4QjRCOCwKKyAgICAweEI0QkEsIDB4QjRCQiwgMHhCNEJDLCAweEI0QkQsIDB4QjRCRSwgMHhCNEJGLCAweEI0QzEsIDB4QjRDMiwgMHhCNEMzLAorICAgIDB4QjRDNSwgMHhCNEM2LCAweEI0QzcsIDB4QjRDOSwgMHhCNENBLCAweEI0Q0IsIDB4QjRDQywgMHhCNENELCAweEI0Q0UsCisgICAgMHhCNENGLCAweEI0RDEsIDB4QjREMiwgMHhCNEQzLCAweEI0RDQsIDB4QjRENiwgMHhCNEQ3LCAweEI0RDgsIDB4QjREOSwKKyAgICAweEI0REEsIDB4QjREQiwgMHhCNERFLCAweEI0REYsIDB4QjRFMSwgMHhCNEUyLCAweEI0RTUsIDB4QjRFNywgMHhCNEU4LAorICAgIDB4QjRFOSwgMHhCNEVBLCAweEI0RUIsIDB4QjRFRSwgMHhCNEYwLCAweEI0RjIsIDB4QjRGMywgMHhCNEY0LCAweEI0RjUsCisgICAgMHhCNEY2LCAweEI0RjcsIDB4QjRGOSwgMHhCNEZBLCAweEI0RkIsIDB4QjRGQywgMHhCNEZELCAweEI0RkUsIDB4QjRGRiwKKyAgICAweEI1MDAsIDB4QjUwMSwgMHhCNTAyLCAweEI1MDMsIDB4QjUwNCwgMHhCNTA1LCAweEI1MDYsIDB4QjUwNywgMHhCNTA4LAorICAgIDB4QjUwOSwgMHhCNTBBLCAweEI1MEIsIDB4QjUwQywgMHhCNTBELCAweEI1MEUsIDB4QjUwRiwgMHhCNTEwLCAweEI1MTEsCisgICAgMHhCNTEyLCAweEI1MTMsIDB4QjUxNiwgMHhCNTE3LCAweEI1MTksIDB4QjUxQSwgMHhCNTFELCAweEI1MUUsIDB4QjUxRiwKKyAgICAweEI1MjAsIDB4QjUyMSwgMHhCNTIyLCAweEI1MjMsIDB4QjUyNiwgMHhCNTJCLCAweEI1MkMsIDB4QjUyRCwgMHhCNTJFLAorICAgIDB4QjUyRiwgMHhCNTMyLCAweEI1MzMsIDB4QjUzNSwgMHhCNTM2LCAweEI1MzcsIDB4QjUzOSwgMHhCNTNBLCAweEI1M0IsCisgICAgMHhCNTNDLCAweEI1M0QsIDB4QjUzRSwgMHhCNTNGLCAweEI1NDIsIDB4QjU0NiwgMHhCNTQ3LCAweEI1NDgsIDB4QjU0OSwKKyAgICAweEI1NEEsIDB4QjU0RSwgMHhCNTRGLCAweEI1NTEsIDB4QjU1MiwgMHhCNTUzLCAweEI1NTUsIDB4QjU1NiwgMHhCNTU3LAorICAgIDB4QjU1OCwgMHhCNTU5LCAweEI1NUEsIDB4QjU1QiwgMHhCNTVFLCAweEI1NjIsIDB4QjU2MywgMHhCNTY0LCAweEI1NjUsCisgICAgMHhCNTY2LCAweEI1NjcsIDB4QjU2OCwgMHhCNTY5LCAweEI1NkEsIDB4QjU2QiwgMHhCNTZDLCAweEI1NkQsIDB4QjU2RSwKKyAgICAweEI1NkYsIDB4QjU3MCwgMHhCNTcxLCAweEI1NzIsIDB4QjU3MywgMHhCNTc0LCAweEI1NzUsIDB4QjU3NiwgMHhCNTc3LAorICAgIDB4QjU3OCwgMHhCNTc5LCAweEI1N0EsIDB4QjU3QiwgMHhCNTdDLCAweEI1N0QsIDB4QjU3RSwgMHhCNTdGLCAweEI1ODAsCisgICAgMHhCNTgxLCAweEI1ODIsIDB4QjU4MywgMHhCNTg0LCAweEI1ODUsIDB4QjU4NiwgMHhCNTg3LCAweEI1ODgsIDB4QjU4OSwKKyAgICAweEI1OEEsIDB4QjU4QiwgMHhCNThDLCAweEI1OEQsIDB4QjU4RSwgMHhCNThGLCAweEI1OTAsIDB4QjU5MSwgMHhCNTkyLAorICAgIDB4QjU5MywgMHhCNTk0LCAweEI1OTUsIDB4QjU5NiwgMHhCNTk3LCAweEI1OTgsIDB4QjU5OSwgMHhCNTlBLCAweEI1OUIsCisgICAgMHhCNTlDLCAweEI1OUQsIDB4QjU5RSwgMHhCNTlGLCAweEI1QTIsIDB4QjVBMywgMHhCNUE1LCAweEI1QTYsIDB4QjVBNywKKyAgICAweEI1QTksIDB4QjVBQywgMHhCNUFELCAweEI1QUUsIDB4QjVBRiwgMHhCNUIyLCAweEI1QjYsIDB4QjVCNywgMHhCNUI4LAorICAgIDB4QjVCOSwgMHhCNUJBLCAweEI1QkUsIDB4QjVCRiwgMHhCNUMxLCAweEI1QzIsIDB4QjVDMywgMHhCNUM1LCAweEI1QzYsCisgICAgMHhCNUM3LCAweEI1QzgsIDB4QjVDOSwgMHhCNUNBLCAweEI1Q0IsIDB4QjVDRSwgMHhCNUQyLCAweEI1RDMsIDB4QjVENCwKKyAgICAweEI1RDUsIDB4QjVENiwgMHhCNUQ3LCAweEI1RDksIDB4QjVEQSwgMHhCNURCLCAweEI1REMsIDB4QjVERCwgMHhCNURFLAorICAgIDB4QjVERiwgMHhCNUUwLCAweEI1RTEsIDB4QjVFMiwgMHhCNUUzLCAweEI1RTQsIDB4QjVFNSwgMHhCNUU2LCAweEI1RTcsCisgICAgMHhCNUU4LCAweEI1RTksIDB4QjVFQSwgMHhCNUVCLCAweEI1RUQsIDB4QjVFRSwgMHhCNUVGLCAweEI1RjAsIDB4QjVGMSwKKyAgICAweEI1RjIsIDB4QjVGMywgMHhCNUY0LCAweEI1RjUsIDB4QjVGNiwgMHhCNUY3LCAweEI1RjgsIDB4QjVGOSwgMHhCNUZBLAorICAgIDB4QjVGQiwgMHhCNUZDLCAweEI1RkQsIDB4QjVGRSwgMHhCNUZGLCAweEI2MDAsIDB4QjYwMSwgMHhCNjAyLCAweEI2MDMsCisgICAgMHhCNjA0LCAweEI2MDUsIDB4QjYwNiwgMHhCNjA3LCAweEI2MDgsIDB4QjYwOSwgMHhCNjBBLCAweEI2MEIsIDB4QjYwQywKKyAgICAweEI2MEQsIDB4QjYwRSwgMHhCNjBGLCAweEI2MTIsIDB4QjYxMywgMHhCNjE1LCAweEI2MTYsIDB4QjYxNywgMHhCNjE5LAorICAgIDB4QjYxQSwgMHhCNjFCLCAweEI2MUMsIDB4QjYxRCwgMHhCNjFFLCAweEI2MUYsIDB4QjYyMCwgMHhCNjIxLCAweEI2MjIsCisgICAgMHhCNjIzLCAweEI2MjQsIDB4QjYyNiwgMHhCNjI3LCAweEI2MjgsIDB4QjYyOSwgMHhCNjJBLCAweEI2MkIsIDB4QjYyRCwKKyAgICAweEI2MkUsIDB4QjYyRiwgMHhCNjMwLCAweEI2MzEsIDB4QjYzMiwgMHhCNjMzLCAweEI2MzUsIDB4QjYzNiwgMHhCNjM3LAorICAgIDB4QjYzOCwgMHhCNjM5LCAweEI2M0EsIDB4QjYzQiwgMHhCNjNDLCAweEI2M0QsIDB4QjYzRSwgMHhCNjNGLCAweEI2NDAsCisgICAgMHhCNjQxLCAweEI2NDIsIDB4QjY0MywgMHhCNjQ0LCAweEI2NDUsIDB4QjY0NiwgMHhCNjQ3LCAweEI2NDksIDB4QjY0QSwKKyAgICAweEI2NEIsIDB4QjY0QywgMHhCNjRELCAweEI2NEUsIDB4QjY0RiwgMHhCNjUwLCAweEI2NTEsIDB4QjY1MiwgMHhCNjUzLAorICAgIDB4QjY1NCwgMHhCNjU1LCAweEI2NTYsIDB4QjY1NywgMHhCNjU4LCAweEI2NTksIDB4QjY1QSwgMHhCNjVCLCAweEI2NUMsCisgICAgMHhCNjVELCAweEI2NUUsIDB4QjY1RiwgMHhCNjYwLCAweEI2NjEsIDB4QjY2MiwgMHhCNjYzLCAweEI2NjUsIDB4QjY2NiwKKyAgICAweEI2NjcsIDB4QjY2OSwgMHhCNjZBLCAweEI2NkIsIDB4QjY2QywgMHhCNjZELCAweEI2NkUsIDB4QjY2RiwgMHhCNjcwLAorICAgIDB4QjY3MSwgMHhCNjcyLCAweEI2NzMsIDB4QjY3NCwgMHhCNjc1LCAweEI2NzYsIDB4QjY3NywgMHhCNjc4LCAweEI2NzksCisgICAgMHhCNjdBLCAweEI2N0IsIDB4QjY3QywgMHhCNjdELCAweEI2N0UsIDB4QjY3RiwgMHhCNjgwLCAweEI2ODEsIDB4QjY4MiwKKyAgICAweEI2ODMsIDB4QjY4NCwgMHhCNjg1LCAweEI2ODYsIDB4QjY4NywgMHhCNjg4LCAweEI2ODksIDB4QjY4QSwgMHhCNjhCLAorICAgIDB4QjY4QywgMHhCNjhELCAweEI2OEUsIDB4QjY4RiwgMHhCNjkwLCAweEI2OTEsIDB4QjY5MiwgMHhCNjkzLCAweEI2OTQsCisgICAgMHhCNjk1LCAweEI2OTYsIDB4QjY5NywgMHhCNjk4LCAweEI2OTksIDB4QjY5QSwgMHhCNjlCLCAweEI2OUUsIDB4QjY5RiwKKyAgICAweEI2QTEsIDB4QjZBMiwgMHhCNkEzLCAweEI2QTUsIDB4QjZBNiwgMHhCNkE3LCAweEI2QTgsIDB4QjZBOSwgMHhCNkFBLAorICAgIDB4QjZBRCwgMHhCNkFFLCAweEI2QUYsIDB4QjZCMCwgMHhCNkIyLCAweEI2QjMsIDB4QjZCNCwgMHhCNkI1LCAweEI2QjYsCisgICAgMHhCNkI3LCAweEI2QjgsIDB4QjZCOSwgMHhCNkJBLCAweEI2QkIsIDB4QjZCQywgMHhCNkJELCAweEI2QkUsIDB4QjZCRiwKKyAgICAweEI2QzAsIDB4QjZDMSwgMHhCNkMyLCAweEI2QzMsIDB4QjZDNCwgMHhCNkM1LCAweEI2QzYsIDB4QjZDNywgMHhCNkM4LAorICAgIDB4QjZDOSwgMHhCNkNBLCAweEI2Q0IsIDB4QjZDQywgMHhCNkNELCAweEI2Q0UsIDB4QjZDRiwgMHhCNkQwLCAweEI2RDEsCisgICAgMHhCNkQyLCAweEI2RDMsIDB4QjZENSwgMHhCNkQ2LCAweEI2RDcsIDB4QjZEOCwgMHhCNkQ5LCAweEI2REEsIDB4QjZEQiwKKyAgICAweEI2REMsIDB4QjZERCwgMHhCNkRFLCAweEI2REYsIDB4QjZFMCwgMHhCNkUxLCAweEI2RTIsIDB4QjZFMywgMHhCNkU0LAorICAgIDB4QjZFNSwgMHhCNkU2LCAweEI2RTcsIDB4QjZFOCwgMHhCNkU5LCAweEI2RUEsIDB4QjZFQiwgMHhCNkVDLCAweEI2RUQsCisgICAgMHhCNkVFLCAweEI2RUYsIDB4QjZGMSwgMHhCNkYyLCAweEI2RjMsIDB4QjZGNSwgMHhCNkY2LCAweEI2RjcsIDB4QjZGOSwKKyAgICAweEI2RkEsIDB4QjZGQiwgMHhCNkZDLCAweEI2RkQsIDB4QjZGRSwgMHhCNkZGLCAweEI3MDIsIDB4QjcwMywgMHhCNzA0LAorICAgIDB4QjcwNiwgMHhCNzA3LCAweEI3MDgsIDB4QjcwOSwgMHhCNzBBLCAweEI3MEIsIDB4QjcwQywgMHhCNzBELCAweEI3MEUsCisgICAgMHhCNzBGLCAweEI3MTAsIDB4QjcxMSwgMHhCNzEyLCAweEI3MTMsIDB4QjcxNCwgMHhCNzE1LCAweEI3MTYsIDB4QjcxNywKKyAgICAweEI3MTgsIDB4QjcxOSwgMHhCNzFBLCAweEI3MUIsIDB4QjcxQywgMHhCNzFELCAweEI3MUUsIDB4QjcxRiwgMHhCNzIwLAorICAgIDB4QjcyMSwgMHhCNzIyLCAweEI3MjMsIDB4QjcyNCwgMHhCNzI1LCAweEI3MjYsIDB4QjcyNywgMHhCNzJBLCAweEI3MkIsCisgICAgMHhCNzJELCAweEI3MkUsIDB4QjczMSwgMHhCNzMyLCAweEI3MzMsIDB4QjczNCwgMHhCNzM1LCAweEI3MzYsIDB4QjczNywKKyAgICAweEI3M0EsIDB4QjczQywgMHhCNzNELCAweEI3M0UsIDB4QjczRiwgMHhCNzQwLCAweEI3NDEsIDB4Qjc0MiwgMHhCNzQzLAorICAgIDB4Qjc0NSwgMHhCNzQ2LCAweEI3NDcsIDB4Qjc0OSwgMHhCNzRBLCAweEI3NEIsIDB4Qjc0RCwgMHhCNzRFLCAweEI3NEYsCisgICAgMHhCNzUwLCAweEI3NTEsIDB4Qjc1MiwgMHhCNzUzLCAweEI3NTYsIDB4Qjc1NywgMHhCNzU4LCAweEI3NTksIDB4Qjc1QSwKKyAgICAweEI3NUIsIDB4Qjc1QywgMHhCNzVELCAweEI3NUUsIDB4Qjc1RiwgMHhCNzYxLCAweEI3NjIsIDB4Qjc2MywgMHhCNzY1LAorICAgIDB4Qjc2NiwgMHhCNzY3LCAweEI3NjksIDB4Qjc2QSwgMHhCNzZCLCAweEI3NkMsIDB4Qjc2RCwgMHhCNzZFLCAweEI3NkYsCisgICAgMHhCNzcyLCAweEI3NzQsIDB4Qjc3NiwgMHhCNzc3LCAweEI3NzgsIDB4Qjc3OSwgMHhCNzdBLCAweEI3N0IsIDB4Qjc3RSwKKyAgICAweEI3N0YsIDB4Qjc4MSwgMHhCNzgyLCAweEI3ODMsIDB4Qjc4NSwgMHhCNzg2LCAweEI3ODcsIDB4Qjc4OCwgMHhCNzg5LAorICAgIDB4Qjc4QSwgMHhCNzhCLCAweEI3OEUsIDB4Qjc5MywgMHhCNzk0LCAweEI3OTUsIDB4Qjc5QSwgMHhCNzlCLCAweEI3OUQsCisgICAgMHhCNzlFLCAweEI3OUYsIDB4QjdBMSwgMHhCN0EyLCAweEI3QTMsIDB4QjdBNCwgMHhCN0E1LCAweEI3QTYsIDB4QjdBNywKKyAgICAweEI3QUEsIDB4QjdBRSwgMHhCN0FGLCAweEI3QjAsIDB4QjdCMSwgMHhCN0IyLCAweEI3QjMsIDB4QjdCNiwgMHhCN0I3LAorICAgIDB4QjdCOSwgMHhCN0JBLCAweEI3QkIsIDB4QjdCQywgMHhCN0JELCAweEI3QkUsIDB4QjdCRiwgMHhCN0MwLCAweEI3QzEsCisgICAgMHhCN0MyLCAweEI3QzMsIDB4QjdDNCwgMHhCN0M1LCAweEI3QzYsIDB4QjdDOCwgMHhCN0NBLCAweEI3Q0IsIDB4QjdDQywKKyAgICAweEI3Q0QsIDB4QjdDRSwgMHhCN0NGLCAweEI3RDAsIDB4QjdEMSwgMHhCN0QyLCAweEI3RDMsIDB4QjdENCwgMHhCN0Q1LAorICAgIDB4QjdENiwgMHhCN0Q3LCAweEI3RDgsIDB4QjdEOSwgMHhCN0RBLCAweEI3REIsIDB4QjdEQywgMHhCN0RELCAweEI3REUsCisgICAgMHhCN0RGLCAweEI3RTAsIDB4QjdFMSwgMHhCN0UyLCAweEI3RTMsIDB4QjdFNCwgMHhCN0U1LCAweEI3RTYsIDB4QjdFNywKKyAgICAweEI3RTgsIDB4QjdFOSwgMHhCN0VBLCAweEI3RUIsIDB4QjdFRSwgMHhCN0VGLCAweEI3RjEsIDB4QjdGMiwgMHhCN0YzLAorICAgIDB4QjdGNSwgMHhCN0Y2LCAweEI3RjcsIDB4QjdGOCwgMHhCN0Y5LCAweEI3RkEsIDB4QjdGQiwgMHhCN0ZFLCAweEI4MDIsCisgICAgMHhCODAzLCAweEI4MDQsIDB4QjgwNSwgMHhCODA2LCAweEI4MEEsIDB4QjgwQiwgMHhCODBELCAweEI4MEUsIDB4QjgwRiwKKyAgICAweEI4MTEsIDB4QjgxMiwgMHhCODEzLCAweEI4MTQsIDB4QjgxNSwgMHhCODE2LCAweEI4MTcsIDB4QjgxQSwgMHhCODFDLAorICAgIDB4QjgxRSwgMHhCODFGLCAweEI4MjAsIDB4QjgyMSwgMHhCODIyLCAweEI4MjMsIDB4QjgyNiwgMHhCODI3LCAweEI4MjksCisgICAgMHhCODJBLCAweEI4MkIsIDB4QjgyRCwgMHhCODJFLCAweEI4MkYsIDB4QjgzMCwgMHhCODMxLCAweEI4MzIsIDB4QjgzMywKKyAgICAweEI4MzYsIDB4QjgzQSwgMHhCODNCLCAweEI4M0MsIDB4QjgzRCwgMHhCODNFLCAweEI4M0YsIDB4Qjg0MSwgMHhCODQyLAorICAgIDB4Qjg0MywgMHhCODQ1LCAweEI4NDYsIDB4Qjg0NywgMHhCODQ4LCAweEI4NDksIDB4Qjg0QSwgMHhCODRCLCAweEI4NEMsCisgICAgMHhCODRELCAweEI4NEUsIDB4Qjg0RiwgMHhCODUwLCAweEI4NTIsIDB4Qjg1NCwgMHhCODU1LCAweEI4NTYsIDB4Qjg1NywKKyAgICAweEI4NTgsIDB4Qjg1OSwgMHhCODVBLCAweEI4NUIsIDB4Qjg1RSwgMHhCODVGLCAweEI4NjEsIDB4Qjg2MiwgMHhCODYzLAorICAgIDB4Qjg2NSwgMHhCODY2LCAweEI4NjcsIDB4Qjg2OCwgMHhCODY5LCAweEI4NkEsIDB4Qjg2QiwgMHhCODZFLCAweEI4NzAsCisgICAgMHhCODcyLCAweEI4NzMsIDB4Qjg3NCwgMHhCODc1LCAweEI4NzYsIDB4Qjg3NywgMHhCODc5LCAweEI4N0EsIDB4Qjg3QiwKKyAgICAweEI4N0QsIDB4Qjg3RSwgMHhCODdGLCAweEI4ODAsIDB4Qjg4MSwgMHhCODgyLCAweEI4ODMsIDB4Qjg4NCwgMHhCODg1LAorICAgIDB4Qjg4NiwgMHhCODg3LCAweEI4ODgsIDB4Qjg4OSwgMHhCODhBLCAweEI4OEIsIDB4Qjg4QywgMHhCODhFLCAweEI4OEYsCisgICAgMHhCODkwLCAweEI4OTEsIDB4Qjg5MiwgMHhCODkzLCAweEI4OTQsIDB4Qjg5NSwgMHhCODk2LCAweEI4OTcsIDB4Qjg5OCwKKyAgICAweEI4OTksIDB4Qjg5QSwgMHhCODlCLCAweEI4OUMsIDB4Qjg5RCwgMHhCODlFLCAweEI4OUYsIDB4QjhBMCwgMHhCOEExLAorICAgIDB4QjhBMiwgMHhCOEEzLCAweEI4QTQsIDB4QjhBNSwgMHhCOEE2LCAweEI4QTcsIDB4QjhBOSwgMHhCOEFBLCAweEI4QUIsCisgICAgMHhCOEFDLCAweEI4QUQsIDB4QjhBRSwgMHhCOEFGLCAweEI4QjEsIDB4QjhCMiwgMHhCOEIzLCAweEI4QjUsIDB4QjhCNiwKKyAgICAweEI4QjcsIDB4QjhCOSwgMHhCOEJBLCAweEI4QkIsIDB4QjhCQywgMHhCOEJELCAweEI4QkUsIDB4QjhCRiwgMHhCOEMyLAorICAgIDB4QjhDNCwgMHhCOEM2LCAweEI4QzcsIDB4QjhDOCwgMHhCOEM5LCAweEI4Q0EsIDB4QjhDQiwgMHhCOENELCAweEI4Q0UsCisgICAgMHhCOENGLCAweEI4RDEsIDB4QjhEMiwgMHhCOEQzLCAweEI4RDUsIDB4QjhENiwgMHhCOEQ3LCAweEI4RDgsIDB4QjhEOSwKKyAgICAweEI4REEsIDB4QjhEQiwgMHhCOERDLCAweEI4REUsIDB4QjhFMCwgMHhCOEUyLCAweEI4RTMsIDB4QjhFNCwgMHhCOEU1LAorICAgIDB4QjhFNiwgMHhCOEU3LCAweEI4RUEsIDB4QjhFQiwgMHhCOEVELCAweEI4RUUsIDB4QjhFRiwgMHhCOEYxLCAweEI4RjIsCisgICAgMHhCOEYzLCAweEI4RjQsIDB4QjhGNSwgMHhCOEY2LCAweEI4RjcsIDB4QjhGQSwgMHhCOEZDLCAweEI4RkUsIDB4QjhGRiwKKyAgICAweEI5MDAsIDB4QjkwMSwgMHhCOTAyLCAweEI5MDMsIDB4QjkwNSwgMHhCOTA2LCAweEI5MDcsIDB4QjkwOCwgMHhCOTA5LAorICAgIDB4QjkwQSwgMHhCOTBCLCAweEI5MEMsIDB4QjkwRCwgMHhCOTBFLCAweEI5MEYsIDB4QjkxMCwgMHhCOTExLCAweEI5MTIsCisgICAgMHhCOTEzLCAweEI5MTQsIDB4QjkxNSwgMHhCOTE2LCAweEI5MTcsIDB4QjkxOSwgMHhCOTFBLCAweEI5MUIsIDB4QjkxQywKKyAgICAweEI5MUQsIDB4QjkxRSwgMHhCOTFGLCAweEI5MjEsIDB4QjkyMiwgMHhCOTIzLCAweEI5MjQsIDB4QjkyNSwgMHhCOTI2LAorICAgIDB4QjkyNywgMHhCOTI4LCAweEI5MjksIDB4QjkyQSwgMHhCOTJCLCAweEI5MkMsIDB4QjkyRCwgMHhCOTJFLCAweEI5MkYsCisgICAgMHhCOTMwLCAweEI5MzEsIDB4QjkzMiwgMHhCOTMzLCAweEI5MzQsIDB4QjkzNSwgMHhCOTM2LCAweEI5MzcsIDB4QjkzOCwKKyAgICAweEI5MzksIDB4QjkzQSwgMHhCOTNCLCAweEI5M0UsIDB4QjkzRiwgMHhCOTQxLCAweEI5NDIsIDB4Qjk0MywgMHhCOTQ1LAorICAgIDB4Qjk0NiwgMHhCOTQ3LCAweEI5NDgsIDB4Qjk0OSwgMHhCOTRBLCAweEI5NEIsIDB4Qjk0RCwgMHhCOTRFLCAweEI5NTAsCisgICAgMHhCOTUyLCAweEI5NTMsIDB4Qjk1NCwgMHhCOTU1LCAweEI5NTYsIDB4Qjk1NywgMHhCOTVBLCAweEI5NUIsIDB4Qjk1RCwKKyAgICAweEI5NUUsIDB4Qjk1RiwgMHhCOTYxLCAweEI5NjIsIDB4Qjk2MywgMHhCOTY0LCAweEI5NjUsIDB4Qjk2NiwgMHhCOTY3LAorICAgIDB4Qjk2QSwgMHhCOTZDLCAweEI5NkUsIDB4Qjk2RiwgMHhCOTcwLCAweEI5NzEsIDB4Qjk3MiwgMHhCOTczLCAweEI5NzYsCisgICAgMHhCOTc3LCAweEI5NzksIDB4Qjk3QSwgMHhCOTdCLCAweEI5N0QsIDB4Qjk3RSwgMHhCOTdGLCAweEI5ODAsIDB4Qjk4MSwKKyAgICAweEI5ODIsIDB4Qjk4MywgMHhCOTg2LCAweEI5ODgsIDB4Qjk4QiwgMHhCOThDLCAweEI5OEYsIDB4Qjk5MCwgMHhCOTkxLAorICAgIDB4Qjk5MiwgMHhCOTkzLCAweEI5OTQsIDB4Qjk5NSwgMHhCOTk2LCAweEI5OTcsIDB4Qjk5OCwgMHhCOTk5LCAweEI5OUEsCisgICAgMHhCOTlCLCAweEI5OUMsIDB4Qjk5RCwgMHhCOTlFLCAweEI5OUYsIDB4QjlBMCwgMHhCOUExLCAweEI5QTIsIDB4QjlBMywKKyAgICAweEI5QTQsIDB4QjlBNSwgMHhCOUE2LCAweEI5QTcsIDB4QjlBOCwgMHhCOUE5LCAweEI5QUEsIDB4QjlBQiwgMHhCOUFFLAorICAgIDB4QjlBRiwgMHhCOUIxLCAweEI5QjIsIDB4QjlCMywgMHhCOUI1LCAweEI5QjYsIDB4QjlCNywgMHhCOUI4LCAweEI5QjksCisgICAgMHhCOUJBLCAweEI5QkIsIDB4QjlCRSwgMHhCOUMwLCAweEI5QzIsIDB4QjlDMywgMHhCOUM0LCAweEI5QzUsIDB4QjlDNiwKKyAgICAweEI5QzcsIDB4QjlDQSwgMHhCOUNCLCAweEI5Q0QsIDB4QjlEMywgMHhCOUQ0LCAweEI5RDUsIDB4QjlENiwgMHhCOUQ3LAorICAgIDB4QjlEQSwgMHhCOURDLCAweEI5REYsIDB4QjlFMCwgMHhCOUUyLCAweEI5RTYsIDB4QjlFNywgMHhCOUU5LCAweEI5RUEsCisgICAgMHhCOUVCLCAweEI5RUQsIDB4QjlFRSwgMHhCOUVGLCAweEI5RjAsIDB4QjlGMSwgMHhCOUYyLCAweEI5RjMsIDB4QjlGNiwKKyAgICAweEI5RkIsIDB4QjlGQywgMHhCOUZELCAweEI5RkUsIDB4QjlGRiwgMHhCQTAyLCAweEJBMDMsIDB4QkEwNCwgMHhCQTA1LAorICAgIDB4QkEwNiwgMHhCQTA3LCAweEJBMDksIDB4QkEwQSwgMHhCQTBCLCAweEJBMEMsIDB4QkEwRCwgMHhCQTBFLCAweEJBMEYsCisgICAgMHhCQTEwLCAweEJBMTEsIDB4QkExMiwgMHhCQTEzLCAweEJBMTQsIDB4QkExNiwgMHhCQTE3LCAweEJBMTgsIDB4QkExOSwKKyAgICAweEJBMUEsIDB4QkExQiwgMHhCQTFDLCAweEJBMUQsIDB4QkExRSwgMHhCQTFGLCAweEJBMjAsIDB4QkEyMSwgMHhCQTIyLAorICAgIDB4QkEyMywgMHhCQTI0LCAweEJBMjUsIDB4QkEyNiwgMHhCQTI3LCAweEJBMjgsIDB4QkEyOSwgMHhCQTJBLCAweEJBMkIsCisgICAgMHhCQTJDLCAweEJBMkQsIDB4QkEyRSwgMHhCQTJGLCAweEJBMzAsIDB4QkEzMSwgMHhCQTMyLCAweEJBMzMsIDB4QkEzNCwKKyAgICAweEJBMzUsIDB4QkEzNiwgMHhCQTM3LCAweEJBM0EsIDB4QkEzQiwgMHhCQTNELCAweEJBM0UsIDB4QkEzRiwgMHhCQTQxLAorICAgIDB4QkE0MywgMHhCQTQ0LCAweEJBNDUsIDB4QkE0NiwgMHhCQTQ3LCAweEJBNEEsIDB4QkE0QywgMHhCQTRGLCAweEJBNTAsCisgICAgMHhCQTUxLCAweEJBNTIsIDB4QkE1NiwgMHhCQTU3LCAweEJBNTksIDB4QkE1QSwgMHhCQTVCLCAweEJBNUQsIDB4QkE1RSwKKyAgICAweEJBNUYsIDB4QkE2MCwgMHhCQTYxLCAweEJBNjIsIDB4QkE2MywgMHhCQTY2LCAweEJBNkEsIDB4QkE2QiwgMHhCQTZDLAorICAgIDB4QkE2RCwgMHhCQTZFLCAweEJBNkYsIDB4QkE3MiwgMHhCQTczLCAweEJBNzUsIDB4QkE3NiwgMHhCQTc3LCAweEJBNzksCisgICAgMHhCQTdBLCAweEJBN0IsIDB4QkE3QywgMHhCQTdELCAweEJBN0UsIDB4QkE3RiwgMHhCQTgwLCAweEJBODEsIDB4QkE4MiwKKyAgICAweEJBODYsIDB4QkE4OCwgMHhCQTg5LCAweEJBOEEsIDB4QkE4QiwgMHhCQThELCAweEJBOEUsIDB4QkE4RiwgMHhCQTkwLAorICAgIDB4QkE5MSwgMHhCQTkyLCAweEJBOTMsIDB4QkE5NCwgMHhCQTk1LCAweEJBOTYsIDB4QkE5NywgMHhCQTk4LCAweEJBOTksCisgICAgMHhCQTlBLCAweEJBOUIsIDB4QkE5QywgMHhCQTlELCAweEJBOUUsIDB4QkE5RiwgMHhCQUEwLCAweEJBQTEsIDB4QkFBMiwKKyAgICAweEJBQTMsIDB4QkFBNCwgMHhCQUE1LCAweEJBQTYsIDB4QkFBNywgMHhCQUFBLCAweEJBQUQsIDB4QkFBRSwgMHhCQUFGLAorICAgIDB4QkFCMSwgMHhCQUIzLCAweEJBQjQsIDB4QkFCNSwgMHhCQUI2LCAweEJBQjcsIDB4QkFCQSwgMHhCQUJDLCAweEJBQkUsCisgICAgMHhCQUJGLCAweEJBQzAsIDB4QkFDMSwgMHhCQUMyLCAweEJBQzMsIDB4QkFDNSwgMHhCQUM2LCAweEJBQzcsIDB4QkFDOSwKKyAgICAweEJBQ0EsIDB4QkFDQiwgMHhCQUNDLCAweEJBQ0QsIDB4QkFDRSwgMHhCQUNGLCAweEJBRDAsIDB4QkFEMSwgMHhCQUQyLAorICAgIDB4QkFEMywgMHhCQUQ0LCAweEJBRDUsIDB4QkFENiwgMHhCQUQ3LCAweEJBREEsIDB4QkFEQiwgMHhCQURDLCAweEJBREQsCisgICAgMHhCQURFLCAweEJBREYsIDB4QkFFMCwgMHhCQUUxLCAweEJBRTIsIDB4QkFFMywgMHhCQUU0LCAweEJBRTUsIDB4QkFFNiwKKyAgICAweEJBRTcsIDB4QkFFOCwgMHhCQUU5LCAweEJBRUEsIDB4QkFFQiwgMHhCQUVDLCAweEJBRUQsIDB4QkFFRSwgMHhCQUVGLAorICAgIDB4QkFGMCwgMHhCQUYxLCAweEJBRjIsIDB4QkFGMywgMHhCQUY0LCAweEJBRjUsIDB4QkFGNiwgMHhCQUY3LCAweEJBRjgsCisgICAgMHhCQUY5LCAweEJBRkEsIDB4QkFGQiwgMHhCQUZELCAweEJBRkUsIDB4QkFGRiwgMHhCQjAxLCAweEJCMDIsIDB4QkIwMywKKyAgICAweEJCMDUsIDB4QkIwNiwgMHhCQjA3LCAweEJCMDgsIDB4QkIwOSwgMHhCQjBBLCAweEJCMEIsIDB4QkIwQywgMHhCQjBFLAorICAgIDB4QkIxMCwgMHhCQjEyLCAweEJCMTMsIDB4QkIxNCwgMHhCQjE1LCAweEJCMTYsIDB4QkIxNywgMHhCQjE5LCAweEJCMUEsCisgICAgMHhCQjFCLCAweEJCMUQsIDB4QkIxRSwgMHhCQjFGLCAweEJCMjEsIDB4QkIyMiwgMHhCQjIzLCAweEJCMjQsIDB4QkIyNSwKKyAgICAweEJCMjYsIDB4QkIyNywgMHhCQjI4LCAweEJCMkEsIDB4QkIyQywgMHhCQjJELCAweEJCMkUsIDB4QkIyRiwgMHhCQjMwLAorICAgIDB4QkIzMSwgMHhCQjMyLCAweEJCMzMsIDB4QkIzNywgMHhCQjM5LCAweEJCM0EsIDB4QkIzRiwgMHhCQjQwLCAweEJCNDEsCisgICAgMHhCQjQyLCAweEJCNDMsIDB4QkI0NiwgMHhCQjQ4LCAweEJCNEEsIDB4QkI0QiwgMHhCQjRDLCAweEJCNEUsIDB4QkI1MSwKKyAgICAweEJCNTIsIDB4QkI1MywgMHhCQjU1LCAweEJCNTYsIDB4QkI1NywgMHhCQjU5LCAweEJCNUEsIDB4QkI1QiwgMHhCQjVDLAorICAgIDB4QkI1RCwgMHhCQjVFLCAweEJCNUYsIDB4QkI2MCwgMHhCQjYyLCAweEJCNjQsIDB4QkI2NSwgMHhCQjY2LCAweEJCNjcsCisgICAgMHhCQjY4LCAweEJCNjksIDB4QkI2QSwgMHhCQjZCLCAweEJCNkQsIDB4QkI2RSwgMHhCQjZGLCAweEJCNzAsIDB4QkI3MSwKKyAgICAweEJCNzIsIDB4QkI3MywgMHhCQjc0LCAweEJCNzUsIDB4QkI3NiwgMHhCQjc3LCAweEJCNzgsIDB4QkI3OSwgMHhCQjdBLAorICAgIDB4QkI3QiwgMHhCQjdDLCAweEJCN0QsIDB4QkI3RSwgMHhCQjdGLCAweEJCODAsIDB4QkI4MSwgMHhCQjgyLCAweEJCODMsCisgICAgMHhCQjg0LCAweEJCODUsIDB4QkI4NiwgMHhCQjg3LCAweEJCODksIDB4QkI4QSwgMHhCQjhCLCAweEJCOEQsIDB4QkI4RSwKKyAgICAweEJCOEYsIDB4QkI5MSwgMHhCQjkyLCAweEJCOTMsIDB4QkI5NCwgMHhCQjk1LCAweEJCOTYsIDB4QkI5NywgMHhCQjk4LAorICAgIDB4QkI5OSwgMHhCQjlBLCAweEJCOUIsIDB4QkI5QywgMHhCQjlELCAweEJCOUUsIDB4QkI5RiwgMHhCQkEwLCAweEJCQTEsCisgICAgMHhCQkEyLCAweEJCQTMsIDB4QkJBNSwgMHhCQkE2LCAweEJCQTcsIDB4QkJBOSwgMHhCQkFBLCAweEJCQUIsIDB4QkJBRCwKKyAgICAweEJCQUUsIDB4QkJBRiwgMHhCQkIwLCAweEJCQjEsIDB4QkJCMiwgMHhCQkIzLCAweEJCQjUsIDB4QkJCNiwgMHhCQkI4LAorICAgIDB4QkJCOSwgMHhCQkJBLCAweEJCQkIsIDB4QkJCQywgMHhCQkJELCAweEJCQkUsIDB4QkJCRiwgMHhCQkMxLCAweEJCQzIsCisgICAgMHhCQkMzLCAweEJCQzUsIDB4QkJDNiwgMHhCQkM3LCAweEJCQzksIDB4QkJDQSwgMHhCQkNCLCAweEJCQ0MsIDB4QkJDRCwKKyAgICAweEJCQ0UsIDB4QkJDRiwgMHhCQkQxLCAweEJCRDIsIDB4QkJENCwgMHhCQkQ1LCAweEJCRDYsIDB4QkJENywgMHhCQkQ4LAorICAgIDB4QkJEOSwgMHhCQkRBLCAweEJCREIsIDB4QkJEQywgMHhCQkRELCAweEJCREUsIDB4QkJERiwgMHhCQkUwLCAweEJCRTEsCisgICAgMHhCQkUyLCAweEJCRTMsIDB4QkJFNCwgMHhCQkU1LCAweEJCRTYsIDB4QkJFNywgMHhCQkU4LCAweEJCRTksIDB4QkJFQSwKKyAgICAweEJCRUIsIDB4QkJFQywgMHhCQkVELCAweEJCRUUsIDB4QkJFRiwgMHhCQkYwLCAweEJCRjEsIDB4QkJGMiwgMHhCQkYzLAorICAgIDB4QkJGNCwgMHhCQkY1LCAweEJCRjYsIDB4QkJGNywgMHhCQkZBLCAweEJCRkIsIDB4QkJGRCwgMHhCQkZFLCAweEJDMDEsCisgICAgMHhCQzAzLCAweEJDMDQsIDB4QkMwNSwgMHhCQzA2LCAweEJDMDcsIDB4QkMwQSwgMHhCQzBFLCAweEJDMTAsIDB4QkMxMiwKKyAgICAweEJDMTMsIDB4QkMxOSwgMHhCQzFBLCAweEJDMjAsIDB4QkMyMSwgMHhCQzIyLCAweEJDMjMsIDB4QkMyNiwgMHhCQzI4LAorICAgIDB4QkMyQSwgMHhCQzJCLCAweEJDMkMsIDB4QkMyRSwgMHhCQzJGLCAweEJDMzIsIDB4QkMzMywgMHhCQzM1LCAweEJDMzYsCisgICAgMHhCQzM3LCAweEJDMzksIDB4QkMzQSwgMHhCQzNCLCAweEJDM0MsIDB4QkMzRCwgMHhCQzNFLCAweEJDM0YsIDB4QkM0MiwKKyAgICAweEJDNDYsIDB4QkM0NywgMHhCQzQ4LCAweEJDNEEsIDB4QkM0QiwgMHhCQzRFLCAweEJDNEYsIDB4QkM1MSwgMHhCQzUyLAorICAgIDB4QkM1MywgMHhCQzU0LCAweEJDNTUsIDB4QkM1NiwgMHhCQzU3LCAweEJDNTgsIDB4QkM1OSwgMHhCQzVBLCAweEJDNUIsCisgICAgMHhCQzVDLCAweEJDNUUsIDB4QkM1RiwgMHhCQzYwLCAweEJDNjEsIDB4QkM2MiwgMHhCQzYzLCAweEJDNjQsIDB4QkM2NSwKKyAgICAweEJDNjYsIDB4QkM2NywgMHhCQzY4LCAweEJDNjksIDB4QkM2QSwgMHhCQzZCLCAweEJDNkMsIDB4QkM2RCwgMHhCQzZFLAorICAgIDB4QkM2RiwgMHhCQzcwLCAweEJDNzEsIDB4QkM3MiwgMHhCQzczLCAweEJDNzQsIDB4QkM3NSwgMHhCQzc2LCAweEJDNzcsCisgICAgMHhCQzc4LCAweEJDNzksIDB4QkM3QSwgMHhCQzdCLCAweEJDN0MsIDB4QkM3RCwgMHhCQzdFLCAweEJDN0YsIDB4QkM4MCwKKyAgICAweEJDODEsIDB4QkM4MiwgMHhCQzgzLCAweEJDODYsIDB4QkM4NywgMHhCQzg5LCAweEJDOEEsIDB4QkM4RCwgMHhCQzhGLAorICAgIDB4QkM5MCwgMHhCQzkxLCAweEJDOTIsIDB4QkM5MywgMHhCQzk2LCAweEJDOTgsIDB4QkM5QiwgMHhCQzlDLCAweEJDOUQsCisgICAgMHhCQzlFLCAweEJDOUYsIDB4QkNBMiwgMHhCQ0EzLCAweEJDQTUsIDB4QkNBNiwgMHhCQ0E5LCAweEJDQUEsIDB4QkNBQiwKKyAgICAweEJDQUMsIDB4QkNBRCwgMHhCQ0FFLCAweEJDQUYsIDB4QkNCMiwgMHhCQ0I2LCAweEJDQjcsIDB4QkNCOCwgMHhCQ0I5LAorICAgIDB4QkNCQSwgMHhCQ0JCLCAweEJDQkUsIDB4QkNCRiwgMHhCQ0MxLCAweEJDQzIsIDB4QkNDMywgMHhCQ0M1LCAweEJDQzYsCisgICAgMHhCQ0M3LCAweEJDQzgsIDB4QkNDOSwgMHhCQ0NBLCAweEJDQ0IsIDB4QkNDQywgMHhCQ0NFLCAweEJDRDIsIDB4QkNEMywKKyAgICAweEJDRDQsIDB4QkNENiwgMHhCQ0Q3LCAweEJDRDksIDB4QkNEQSwgMHhCQ0RCLCAweEJDREQsIDB4QkNERSwgMHhCQ0RGLAorICAgIDB4QkNFMCwgMHhCQ0UxLCAweEJDRTIsIDB4QkNFMywgMHhCQ0U0LCAweEJDRTUsIDB4QkNFNiwgMHhCQ0U3LCAweEJDRTgsCisgICAgMHhCQ0U5LCAweEJDRUEsIDB4QkNFQiwgMHhCQ0VDLCAweEJDRUQsIDB4QkNFRSwgMHhCQ0VGLCAweEJDRjAsIDB4QkNGMSwKKyAgICAweEJDRjIsIDB4QkNGMywgMHhCQ0Y3LCAweEJDRjksIDB4QkNGQSwgMHhCQ0ZCLCAweEJDRkQsIDB4QkNGRSwgMHhCQ0ZGLAorICAgIDB4QkQwMCwgMHhCRDAxLCAweEJEMDIsIDB4QkQwMywgMHhCRDA2LCAweEJEMDgsIDB4QkQwQSwgMHhCRDBCLCAweEJEMEMsCisgICAgMHhCRDBELCAweEJEMEUsIDB4QkQwRiwgMHhCRDExLCAweEJEMTIsIDB4QkQxMywgMHhCRDE1LCAweEJEMTYsIDB4QkQxNywKKyAgICAweEJEMTgsIDB4QkQxOSwgMHhCRDFBLCAweEJEMUIsIDB4QkQxQywgMHhCRDFELCAweEJEMUUsIDB4QkQxRiwgMHhCRDIwLAorICAgIDB4QkQyMSwgMHhCRDIyLCAweEJEMjMsIDB4QkQyNSwgMHhCRDI2LCAweEJEMjcsIDB4QkQyOCwgMHhCRDI5LCAweEJEMkEsCisgICAgMHhCRDJCLCAweEJEMkQsIDB4QkQyRSwgMHhCRDJGLCAweEJEMzAsIDB4QkQzMSwgMHhCRDMyLCAweEJEMzMsIDB4QkQzNCwKKyAgICAweEJEMzUsIDB4QkQzNiwgMHhCRDM3LCAweEJEMzgsIDB4QkQzOSwgMHhCRDNBLCAweEJEM0IsIDB4QkQzQywgMHhCRDNELAorICAgIDB4QkQzRSwgMHhCRDNGLCAweEJENDEsIDB4QkQ0MiwgMHhCRDQzLCAweEJENDQsIDB4QkQ0NSwgMHhCRDQ2LCAweEJENDcsCisgICAgMHhCRDRBLCAweEJENEIsIDB4QkQ0RCwgMHhCRDRFLCAweEJENEYsIDB4QkQ1MSwgMHhCRDUyLCAweEJENTMsIDB4QkQ1NCwKKyAgICAweEJENTUsIDB4QkQ1NiwgMHhCRDU3LCAweEJENUEsIDB4QkQ1QiwgMHhCRDVDLCAweEJENUQsIDB4QkQ1RSwgMHhCRDVGLAorICAgIDB4QkQ2MCwgMHhCRDYxLCAweEJENjIsIDB4QkQ2MywgMHhCRDY1LCAweEJENjYsIDB4QkQ2NywgMHhCRDY5LCAweEJENkEsCisgICAgMHhCRDZCLCAweEJENkMsIDB4QkQ2RCwgMHhCRDZFLCAweEJENkYsIDB4QkQ3MCwgMHhCRDcxLCAweEJENzIsIDB4QkQ3MywKKyAgICAweEJENzQsIDB4QkQ3NSwgMHhCRDc2LCAweEJENzcsIDB4QkQ3OCwgMHhCRDc5LCAweEJEN0EsIDB4QkQ3QiwgMHhCRDdDLAorICAgIDB4QkQ3RCwgMHhCRDdFLCAweEJEN0YsIDB4QkQ4MiwgMHhCRDgzLCAweEJEODUsIDB4QkQ4NiwgMHhCRDhCLCAweEJEOEMsCisgICAgMHhCRDhELCAweEJEOEUsIDB4QkQ4RiwgMHhCRDkyLCAweEJEOTQsIDB4QkQ5NiwgMHhCRDk3LCAweEJEOTgsIDB4QkQ5QiwKKyAgICAweEJEOUQsIDB4QkQ5RSwgMHhCRDlGLCAweEJEQTAsIDB4QkRBMSwgMHhCREEyLCAweEJEQTMsIDB4QkRBNSwgMHhCREE2LAorICAgIDB4QkRBNywgMHhCREE4LCAweEJEQTksIDB4QkRBQSwgMHhCREFCLCAweEJEQUMsIDB4QkRBRCwgMHhCREFFLCAweEJEQUYsCisgICAgMHhCREIxLCAweEJEQjIsIDB4QkRCMywgMHhCREI0LCAweEJEQjUsIDB4QkRCNiwgMHhCREI3LCAweEJEQjksIDB4QkRCQSwKKyAgICAweEJEQkIsIDB4QkRCQywgMHhCREJELCAweEJEQkUsIDB4QkRCRiwgMHhCREMwLCAweEJEQzEsIDB4QkRDMiwgMHhCREMzLAorICAgIDB4QkRDNCwgMHhCREM1LCAweEJEQzYsIDB4QkRDNywgMHhCREM4LCAweEJEQzksIDB4QkRDQSwgMHhCRENCLCAweEJEQ0MsCisgICAgMHhCRENELCAweEJEQ0UsIDB4QkRDRiwgMHhCREQwLCAweEJERDEsIDB4QkREMiwgMHhCREQzLCAweEJERDYsIDB4QkRENywKKyAgICAweEJERDksIDB4QkREQSwgMHhCRERCLCAweEJEREQsIDB4QkRERSwgMHhCRERGLCAweEJERTAsIDB4QkRFMSwgMHhCREUyLAorICAgIDB4QkRFMywgMHhCREU0LCAweEJERTUsIDB4QkRFNiwgMHhCREU3LCAweEJERTgsIDB4QkRFQSwgMHhCREVCLCAweEJERUMsCisgICAgMHhCREVELCAweEJERUUsIDB4QkRFRiwgMHhCREYxLCAweEJERjIsIDB4QkRGMywgMHhCREY1LCAweEJERjYsIDB4QkRGNywKKyAgICAweEJERjksIDB4QkRGQSwgMHhCREZCLCAweEJERkMsIDB4QkRGRCwgMHhCREZFLCAweEJERkYsIDB4QkUwMSwgMHhCRTAyLAorICAgIDB4QkUwNCwgMHhCRTA2LCAweEJFMDcsIDB4QkUwOCwgMHhCRTA5LCAweEJFMEEsIDB4QkUwQiwgMHhCRTBFLCAweEJFMEYsCisgICAgMHhCRTExLCAweEJFMTIsIDB4QkUxMywgMHhCRTE1LCAweEJFMTYsIDB4QkUxNywgMHhCRTE4LCAweEJFMTksIDB4QkUxQSwKKyAgICAweEJFMUIsIDB4QkUxRSwgMHhCRTIwLCAweEJFMjEsIDB4QkUyMiwgMHhCRTIzLCAweEJFMjQsIDB4QkUyNSwgMHhCRTI2LAorICAgIDB4QkUyNywgMHhCRTI4LCAweEJFMjksIDB4QkUyQSwgMHhCRTJCLCAweEJFMkMsIDB4QkUyRCwgMHhCRTJFLCAweEJFMkYsCisgICAgMHhCRTMwLCAweEJFMzEsIDB4QkUzMiwgMHhCRTMzLCAweEJFMzQsIDB4QkUzNSwgMHhCRTM2LCAweEJFMzcsIDB4QkUzOCwKKyAgICAweEJFMzksIDB4QkUzQSwgMHhCRTNCLCAweEJFM0MsIDB4QkUzRCwgMHhCRTNFLCAweEJFM0YsIDB4QkU0MCwgMHhCRTQxLAorICAgIDB4QkU0MiwgMHhCRTQzLCAweEJFNDYsIDB4QkU0NywgMHhCRTQ5LCAweEJFNEEsIDB4QkU0QiwgMHhCRTRELCAweEJFNEYsCisgICAgMHhCRTUwLCAweEJFNTEsIDB4QkU1MiwgMHhCRTUzLCAweEJFNTYsIDB4QkU1OCwgMHhCRTVDLCAweEJFNUQsIDB4QkU1RSwKKyAgICAweEJFNUYsIDB4QkU2MiwgMHhCRTYzLCAweEJFNjUsIDB4QkU2NiwgMHhCRTY3LCAweEJFNjksIDB4QkU2QiwgMHhCRTZDLAorICAgIDB4QkU2RCwgMHhCRTZFLCAweEJFNkYsIDB4QkU3MiwgMHhCRTc2LCAweEJFNzcsIDB4QkU3OCwgMHhCRTc5LCAweEJFN0EsCisgICAgMHhCRTdFLCAweEJFN0YsIDB4QkU4MSwgMHhCRTgyLCAweEJFODMsIDB4QkU4NSwgMHhCRTg2LCAweEJFODcsIDB4QkU4OCwKKyAgICAweEJFODksIDB4QkU4QSwgMHhCRThCLCAweEJFOEUsIDB4QkU5MiwgMHhCRTkzLCAweEJFOTQsIDB4QkU5NSwgMHhCRTk2LAorICAgIDB4QkU5NywgMHhCRTlBLCAweEJFOUIsIDB4QkU5QywgMHhCRTlELCAweEJFOUUsIDB4QkU5RiwgMHhCRUEwLCAweEJFQTEsCisgICAgMHhCRUEyLCAweEJFQTMsIDB4QkVBNCwgMHhCRUE1LCAweEJFQTYsIDB4QkVBNywgMHhCRUE5LCAweEJFQUEsIDB4QkVBQiwKKyAgICAweEJFQUMsIDB4QkVBRCwgMHhCRUFFLCAweEJFQUYsIDB4QkVCMCwgMHhCRUIxLCAweEJFQjIsIDB4QkVCMywgMHhCRUI0LAorICAgIDB4QkVCNSwgMHhCRUI2LCAweEJFQjcsIDB4QkVCOCwgMHhCRUI5LCAweEJFQkEsIDB4QkVCQiwgMHhCRUJDLCAweEJFQkQsCisgICAgMHhCRUJFLCAweEJFQkYsIDB4QkVDMCwgMHhCRUMxLCAweEJFQzIsIDB4QkVDMywgMHhCRUM0LCAweEJFQzUsIDB4QkVDNiwKKyAgICAweEJFQzcsIDB4QkVDOCwgMHhCRUM5LCAweEJFQ0EsIDB4QkVDQiwgMHhCRUNDLCAweEJFQ0QsIDB4QkVDRSwgMHhCRUNGLAorICAgIDB4QkVEMiwgMHhCRUQzLCAweEJFRDUsIDB4QkVENiwgMHhCRUQ5LCAweEJFREEsIDB4QkVEQiwgMHhCRURDLCAweEJFREQsCisgICAgMHhCRURFLCAweEJFREYsIDB4QkVFMSwgMHhCRUUyLCAweEJFRTYsIDB4QkVFNywgMHhCRUU4LCAweEJFRTksIDB4QkVFQSwKKyAgICAweEJFRUIsIDB4QkVFRCwgMHhCRUVFLCAweEJFRUYsIDB4QkVGMCwgMHhCRUYxLCAweEJFRjIsIDB4QkVGMywgMHhCRUY0LAorICAgIDB4QkVGNSwgMHhCRUY2LCAweEJFRjcsIDB4QkVGOCwgMHhCRUY5LCAweEJFRkEsIDB4QkVGQiwgMHhCRUZDLCAweEJFRkQsCisgICAgMHhCRUZFLCAweEJFRkYsIDB4QkYwMCwgMHhCRjAyLCAweEJGMDMsIDB4QkYwNCwgMHhCRjA1LCAweEJGMDYsIDB4QkYwNywKKyAgICAweEJGMEEsIDB4QkYwQiwgMHhCRjBDLCAweEJGMEQsIDB4QkYwRSwgMHhCRjBGLCAweEJGMTAsIDB4QkYxMSwgMHhCRjEyLAorICAgIDB4QkYxMywgMHhCRjE0LCAweEJGMTUsIDB4QkYxNiwgMHhCRjE3LCAweEJGMUEsIDB4QkYxRSwgMHhCRjFGLCAweEJGMjAsCisgICAgMHhCRjIxLCAweEJGMjIsIDB4QkYyMywgMHhCRjI0LCAweEJGMjUsIDB4QkYyNiwgMHhCRjI3LCAweEJGMjgsIDB4QkYyOSwKKyAgICAweEJGMkEsIDB4QkYyQiwgMHhCRjJDLCAweEJGMkQsIDB4QkYyRSwgMHhCRjJGLCAweEJGMzAsIDB4QkYzMSwgMHhCRjMyLAorICAgIDB4QkYzMywgMHhCRjM0LCAweEJGMzUsIDB4QkYzNiwgMHhCRjM3LCAweEJGMzgsIDB4QkYzOSwgMHhCRjNBLCAweEJGM0IsCisgICAgMHhCRjNDLCAweEJGM0QsIDB4QkYzRSwgMHhCRjNGLCAweEJGNDIsIDB4QkY0MywgMHhCRjQ1LCAweEJGNDYsIDB4QkY0NywKKyAgICAweEJGNDksIDB4QkY0QSwgMHhCRjRCLCAweEJGNEMsIDB4QkY0RCwgMHhCRjRFLCAweEJGNEYsIDB4QkY1MiwgMHhCRjUzLAorICAgIDB4QkY1NCwgMHhCRjU2LCAweEJGNTcsIDB4QkY1OCwgMHhCRjU5LCAweEJGNUEsIDB4QkY1QiwgMHhCRjVDLCAweEJGNUQsCisgICAgMHhCRjVFLCAweEJGNUYsIDB4QkY2MCwgMHhCRjYxLCAweEJGNjIsIDB4QkY2MywgMHhCRjY0LCAweEJGNjUsIDB4QkY2NiwKKyAgICAweEJGNjcsIDB4QkY2OCwgMHhCRjY5LCAweEJGNkEsIDB4QkY2QiwgMHhCRjZDLCAweEJGNkQsIDB4QkY2RSwgMHhCRjZGLAorICAgIDB4QkY3MCwgMHhCRjcxLCAweEJGNzIsIDB4QkY3MywgMHhCRjc0LCAweEJGNzUsIDB4QkY3NiwgMHhCRjc3LCAweEJGNzgsCisgICAgMHhCRjc5LCAweEJGN0EsIDB4QkY3QiwgMHhCRjdDLCAweEJGN0QsIDB4QkY3RSwgMHhCRjdGLCAweEJGODAsIDB4QkY4MSwKKyAgICAweEJGODIsIDB4QkY4MywgMHhCRjg0LCAweEJGODUsIDB4QkY4NiwgMHhCRjg3LCAweEJGODgsIDB4QkY4OSwgMHhCRjhBLAorICAgIDB4QkY4QiwgMHhCRjhDLCAweEJGOEQsIDB4QkY4RSwgMHhCRjhGLCAweEJGOTAsIDB4QkY5MSwgMHhCRjkyLCAweEJGOTMsCisgICAgMHhCRjk1LCAweEJGOTYsIDB4QkY5NywgMHhCRjk4LCAweEJGOTksIDB4QkY5QSwgMHhCRjlCLCAweEJGOUMsIDB4QkY5RCwKKyAgICAweEJGOUUsIDB4QkY5RiwgMHhCRkEwLCAweEJGQTEsIDB4QkZBMiwgMHhCRkEzLCAweEJGQTQsIDB4QkZBNSwgMHhCRkE2LAorICAgIDB4QkZBNywgMHhCRkE4LCAweEJGQTksIDB4QkZBQSwgMHhCRkFCLCAweEJGQUMsIDB4QkZBRCwgMHhCRkFFLCAweEJGQUYsCisgICAgMHhCRkIxLCAweEJGQjIsIDB4QkZCMywgMHhCRkI0LCAweEJGQjUsIDB4QkZCNiwgMHhCRkI3LCAweEJGQjgsIDB4QkZCOSwKKyAgICAweEJGQkEsIDB4QkZCQiwgMHhCRkJDLCAweEJGQkQsIDB4QkZCRSwgMHhCRkJGLCAweEJGQzAsIDB4QkZDMSwgMHhCRkMyLAorICAgIDB4QkZDMywgMHhCRkM0LCAweEJGQzYsIDB4QkZDNywgMHhCRkM4LCAweEJGQzksIDB4QkZDQSwgMHhCRkNCLCAweEJGQ0UsCisgICAgMHhCRkNGLCAweEJGRDEsIDB4QkZEMiwgMHhCRkQzLCAweEJGRDUsIDB4QkZENiwgMHhCRkQ3LCAweEJGRDgsIDB4QkZEOSwKKyAgICAweEJGREEsIDB4QkZEQiwgMHhCRkRELCAweEJGREUsIDB4QkZFMCwgMHhCRkUyLCAweEJGRTMsIDB4QkZFNCwgMHhCRkU1LAorICAgIDB4QkZFNiwgMHhCRkU3LCAweEJGRTgsIDB4QkZFOSwgMHhCRkVBLCAweEJGRUIsIDB4QkZFQywgMHhCRkVELCAweEJGRUUsCisgICAgMHhCRkVGLCAweEJGRjAsIDB4QkZGMSwgMHhCRkYyLCAweEJGRjMsIDB4QkZGNCwgMHhCRkY1LCAweEJGRjYsIDB4QkZGNywKKyAgICAweEJGRjgsIDB4QkZGOSwgMHhCRkZBLCAweEJGRkIsIDB4QkZGQywgMHhCRkZELCAweEJGRkUsIDB4QkZGRiwgMHhDMDAwLAorICAgIDB4QzAwMSwgMHhDMDAyLCAweEMwMDMsIDB4QzAwNCwgMHhDMDA1LCAweEMwMDYsIDB4QzAwNywgMHhDMDA4LCAweEMwMDksCisgICAgMHhDMDBBLCAweEMwMEIsIDB4QzAwQywgMHhDMDBELCAweEMwMEUsIDB4QzAwRiwgMHhDMDEwLCAweEMwMTEsIDB4QzAxMiwKKyAgICAweEMwMTMsIDB4QzAxNCwgMHhDMDE1LCAweEMwMTYsIDB4QzAxNywgMHhDMDE4LCAweEMwMTksIDB4QzAxQSwgMHhDMDFCLAorICAgIDB4QzAxQywgMHhDMDFELCAweEMwMUUsIDB4QzAxRiwgMHhDMDIwLCAweEMwMjEsIDB4QzAyMiwgMHhDMDIzLCAweEMwMjQsCisgICAgMHhDMDI1LCAweEMwMjYsIDB4QzAyNywgMHhDMDI4LCAweEMwMjksIDB4QzAyQSwgMHhDMDJCLCAweEMwMkMsIDB4QzAyRCwKKyAgICAweEMwMkUsIDB4QzAyRiwgMHhDMDMwLCAweEMwMzEsIDB4QzAzMiwgMHhDMDMzLCAweEMwMzQsIDB4QzAzNSwgMHhDMDM2LAorICAgIDB4QzAzNywgMHhDMDM4LCAweEMwMzksIDB4QzAzQSwgMHhDMDNCLCAweEMwM0QsIDB4QzAzRSwgMHhDMDNGLCAweEMwNDAsCisgICAgMHhDMDQxLCAweEMwNDIsIDB4QzA0MywgMHhDMDQ0LCAweEMwNDUsIDB4QzA0NiwgMHhDMDQ3LCAweEMwNDgsIDB4QzA0OSwKKyAgICAweEMwNEEsIDB4QzA0QiwgMHhDMDRDLCAweEMwNEQsIDB4QzA0RSwgMHhDMDRGLCAweEMwNTAsIDB4QzA1MiwgMHhDMDUzLAorICAgIDB4QzA1NCwgMHhDMDU1LCAweEMwNTYsIDB4QzA1NywgMHhDMDU5LCAweEMwNUEsIDB4QzA1QiwgMHhDMDVELCAweEMwNUUsCisgICAgMHhDMDVGLCAweEMwNjEsIDB4QzA2MiwgMHhDMDYzLCAweEMwNjQsIDB4QzA2NSwgMHhDMDY2LCAweEMwNjcsIDB4QzA2QSwKKyAgICAweEMwNkIsIDB4QzA2QywgMHhDMDZELCAweEMwNkUsIDB4QzA2RiwgMHhDMDcwLCAweEMwNzEsIDB4QzA3MiwgMHhDMDczLAorICAgIDB4QzA3NCwgMHhDMDc1LCAweEMwNzYsIDB4QzA3NywgMHhDMDc4LCAweEMwNzksIDB4QzA3QSwgMHhDMDdCLCAweEMwN0MsCisgICAgMHhDMDdELCAweEMwN0UsIDB4QzA3RiwgMHhDMDgwLCAweEMwODEsIDB4QzA4MiwgMHhDMDgzLCAweEMwODQsIDB4QzA4NSwKKyAgICAweEMwODYsIDB4QzA4NywgMHhDMDg4LCAweEMwODksIDB4QzA4QSwgMHhDMDhCLCAweEMwOEMsIDB4QzA4RCwgMHhDMDhFLAorICAgIDB4QzA4RiwgMHhDMDkyLCAweEMwOTMsIDB4QzA5NSwgMHhDMDk2LCAweEMwOTcsIDB4QzA5OSwgMHhDMDlBLCAweEMwOUIsCisgICAgMHhDMDlDLCAweEMwOUQsIDB4QzA5RSwgMHhDMDlGLCAweEMwQTIsIDB4QzBBNCwgMHhDMEE2LCAweEMwQTcsIDB4QzBBOCwKKyAgICAweEMwQTksIDB4QzBBQSwgMHhDMEFCLCAweEMwQUUsIDB4QzBCMSwgMHhDMEIyLCAweEMwQjcsIDB4QzBCOCwgMHhDMEI5LAorICAgIDB4QzBCQSwgMHhDMEJCLCAweEMwQkUsIDB4QzBDMiwgMHhDMEMzLCAweEMwQzQsIDB4QzBDNiwgMHhDMEM3LCAweEMwQ0EsCisgICAgMHhDMENCLCAweEMwQ0QsIDB4QzBDRSwgMHhDMENGLCAweEMwRDEsIDB4QzBEMiwgMHhDMEQzLCAweEMwRDQsIDB4QzBENSwKKyAgICAweEMwRDYsIDB4QzBENywgMHhDMERBLCAweEMwREUsIDB4QzBERiwgMHhDMEUwLCAweEMwRTEsIDB4QzBFMiwgMHhDMEUzLAorICAgIDB4QzBFNiwgMHhDMEU3LCAweEMwRTksIDB4QzBFQSwgMHhDMEVCLCAweEMwRUQsIDB4QzBFRSwgMHhDMEVGLCAweEMwRjAsCisgICAgMHhDMEYxLCAweEMwRjIsIDB4QzBGMywgMHhDMEY2LCAweEMwRjgsIDB4QzBGQSwgMHhDMEZCLCAweEMwRkMsIDB4QzBGRCwKKyAgICAweEMwRkUsIDB4QzBGRiwgMHhDMTAxLCAweEMxMDIsIDB4QzEwMywgMHhDMTA1LCAweEMxMDYsIDB4QzEwNywgMHhDMTA5LAorICAgIDB4QzEwQSwgMHhDMTBCLCAweEMxMEMsIDB4QzEwRCwgMHhDMTBFLCAweEMxMEYsIDB4QzExMSwgMHhDMTEyLCAweEMxMTMsCisgICAgMHhDMTE0LCAweEMxMTYsIDB4QzExNywgMHhDMTE4LCAweEMxMTksIDB4QzExQSwgMHhDMTFCLCAweEMxMjEsIDB4QzEyMiwKKyAgICAweEMxMjUsIDB4QzEyOCwgMHhDMTI5LCAweEMxMkEsIDB4QzEyQiwgMHhDMTJFLCAweEMxMzIsIDB4QzEzMywgMHhDMTM0LAorICAgIDB4QzEzNSwgMHhDMTM3LCAweEMxM0EsIDB4QzEzQiwgMHhDMTNELCAweEMxM0UsIDB4QzEzRiwgMHhDMTQxLCAweEMxNDIsCisgICAgMHhDMTQzLCAweEMxNDQsIDB4QzE0NSwgMHhDMTQ2LCAweEMxNDcsIDB4QzE0QSwgMHhDMTRFLCAweEMxNEYsIDB4QzE1MCwKKyAgICAweEMxNTEsIDB4QzE1MiwgMHhDMTUzLCAweEMxNTYsIDB4QzE1NywgMHhDMTU5LCAweEMxNUEsIDB4QzE1QiwgMHhDMTVELAorICAgIDB4QzE1RSwgMHhDMTVGLCAweEMxNjAsIDB4QzE2MSwgMHhDMTYyLCAweEMxNjMsIDB4QzE2NiwgMHhDMTZBLCAweEMxNkIsCisgICAgMHhDMTZDLCAweEMxNkQsIDB4QzE2RSwgMHhDMTZGLCAweEMxNzEsIDB4QzE3MiwgMHhDMTczLCAweEMxNzUsIDB4QzE3NiwKKyAgICAweEMxNzcsIDB4QzE3OSwgMHhDMTdBLCAweEMxN0IsIDB4QzE3QywgMHhDMTdELCAweEMxN0UsIDB4QzE3RiwgMHhDMTgwLAorICAgIDB4QzE4MSwgMHhDMTgyLCAweEMxODMsIDB4QzE4NCwgMHhDMTg2LCAweEMxODcsIDB4QzE4OCwgMHhDMTg5LCAweEMxOEEsCisgICAgMHhDMThCLCAweEMxOEYsIDB4QzE5MSwgMHhDMTkyLCAweEMxOTMsIDB4QzE5NSwgMHhDMTk3LCAweEMxOTgsIDB4QzE5OSwKKyAgICAweEMxOUEsIDB4QzE5QiwgMHhDMTlFLCAweEMxQTAsIDB4QzFBMiwgMHhDMUEzLCAweEMxQTQsIDB4QzFBNiwgMHhDMUE3LAorICAgIDB4QzFBQSwgMHhDMUFCLCAweEMxQUQsIDB4QzFBRSwgMHhDMUFGLCAweEMxQjEsIDB4QzFCMiwgMHhDMUIzLCAweEMxQjQsCisgICAgMHhDMUI1LCAweEMxQjYsIDB4QzFCNywgMHhDMUI4LCAweEMxQjksIDB4QzFCQSwgMHhDMUJCLCAweEMxQkMsIDB4QzFCRSwKKyAgICAweEMxQkYsIDB4QzFDMCwgMHhDMUMxLCAweEMxQzIsIDB4QzFDMywgMHhDMUM1LCAweEMxQzYsIDB4QzFDNywgMHhDMUM5LAorICAgIDB4QzFDQSwgMHhDMUNCLCAweEMxQ0QsIDB4QzFDRSwgMHhDMUNGLCAweEMxRDAsIDB4QzFEMSwgMHhDMUQyLCAweEMxRDMsCisgICAgMHhDMUQ1LCAweEMxRDYsIDB4QzFEOSwgMHhDMURBLCAweEMxREIsIDB4QzFEQywgMHhDMURELCAweEMxREUsIDB4QzFERiwKKyAgICAweEMxRTEsIDB4QzFFMiwgMHhDMUUzLCAweEMxRTUsIDB4QzFFNiwgMHhDMUU3LCAweEMxRTksIDB4QzFFQSwgMHhDMUVCLAorICAgIDB4QzFFQywgMHhDMUVELCAweEMxRUUsIDB4QzFFRiwgMHhDMUYyLCAweEMxRjQsIDB4QzFGNSwgMHhDMUY2LCAweEMxRjcsCisgICAgMHhDMUY4LCAweEMxRjksIDB4QzFGQSwgMHhDMUZCLCAweEMxRkUsIDB4QzFGRiwgMHhDMjAxLCAweEMyMDIsIDB4QzIwMywKKyAgICAweEMyMDUsIDB4QzIwNiwgMHhDMjA3LCAweEMyMDgsIDB4QzIwOSwgMHhDMjBBLCAweEMyMEIsIDB4QzIwRSwgMHhDMjEwLAorICAgIDB4QzIxMiwgMHhDMjEzLCAweEMyMTQsIDB4QzIxNSwgMHhDMjE2LCAweEMyMTcsIDB4QzIxQSwgMHhDMjFCLCAweEMyMUQsCisgICAgMHhDMjFFLCAweEMyMjEsIDB4QzIyMiwgMHhDMjIzLCAweEMyMjQsIDB4QzIyNSwgMHhDMjI2LCAweEMyMjcsIDB4QzIyQSwKKyAgICAweEMyMkMsIDB4QzIyRSwgMHhDMjMwLCAweEMyMzMsIDB4QzIzNSwgMHhDMjM2LCAweEMyMzcsIDB4QzIzOCwgMHhDMjM5LAorICAgIDB4QzIzQSwgMHhDMjNCLCAweEMyM0MsIDB4QzIzRCwgMHhDMjNFLCAweEMyM0YsIDB4QzI0MCwgMHhDMjQxLCAweEMyNDIsCisgICAgMHhDMjQzLCAweEMyNDQsIDB4QzI0NSwgMHhDMjQ2LCAweEMyNDcsIDB4QzI0OSwgMHhDMjRBLCAweEMyNEIsIDB4QzI0QywKKyAgICAweEMyNEQsIDB4QzI0RSwgMHhDMjRGLCAweEMyNTIsIDB4QzI1MywgMHhDMjU1LCAweEMyNTYsIDB4QzI1NywgMHhDMjU5LAorICAgIDB4QzI1QSwgMHhDMjVCLCAweEMyNUMsIDB4QzI1RCwgMHhDMjVFLCAweEMyNUYsIDB4QzI2MSwgMHhDMjYyLCAweEMyNjMsCisgICAgMHhDMjY0LCAweEMyNjYsIDB4QzI2NywgMHhDMjY4LCAweEMyNjksIDB4QzI2QSwgMHhDMjZCLCAweEMyNkUsIDB4QzI2RiwKKyAgICAweEMyNzEsIDB4QzI3MiwgMHhDMjczLCAweEMyNzUsIDB4QzI3NiwgMHhDMjc3LCAweEMyNzgsIDB4QzI3OSwgMHhDMjdBLAorICAgIDB4QzI3QiwgMHhDMjdFLCAweEMyODAsIDB4QzI4MiwgMHhDMjgzLCAweEMyODQsIDB4QzI4NSwgMHhDMjg2LCAweEMyODcsCisgICAgMHhDMjhBLCAweEMyOEIsIDB4QzI4QywgMHhDMjhELCAweEMyOEUsIDB4QzI4RiwgMHhDMjkxLCAweEMyOTIsIDB4QzI5MywKKyAgICAweEMyOTQsIDB4QzI5NSwgMHhDMjk2LCAweEMyOTcsIDB4QzI5OSwgMHhDMjlBLCAweEMyOUMsIDB4QzI5RSwgMHhDMjlGLAorICAgIDB4QzJBMCwgMHhDMkExLCAweEMyQTIsIDB4QzJBMywgMHhDMkE2LCAweEMyQTcsIDB4QzJBOSwgMHhDMkFBLCAweEMyQUIsCisgICAgMHhDMkFFLCAweEMyQUYsIDB4QzJCMCwgMHhDMkIxLCAweEMyQjIsIDB4QzJCMywgMHhDMkI2LCAweEMyQjgsIDB4QzJCQSwKKyAgICAweEMyQkIsIDB4QzJCQywgMHhDMkJELCAweEMyQkUsIDB4QzJCRiwgMHhDMkMwLCAweEMyQzEsIDB4QzJDMiwgMHhDMkMzLAorICAgIDB4QzJDNCwgMHhDMkM1LCAweEMyQzYsIDB4QzJDNywgMHhDMkM4LCAweEMyQzksIDB4QzJDQSwgMHhDMkNCLCAweEMyQ0MsCisgICAgMHhDMkNELCAweEMyQ0UsIDB4QzJDRiwgMHhDMkQwLCAweEMyRDEsIDB4QzJEMiwgMHhDMkQzLCAweEMyRDQsIDB4QzJENSwKKyAgICAweEMyRDYsIDB4QzJENywgMHhDMkQ4LCAweEMyRDksIDB4QzJEQSwgMHhDMkRCLCAweEMyREUsIDB4QzJERiwgMHhDMkUxLAorICAgIDB4QzJFMiwgMHhDMkU1LCAweEMyRTYsIDB4QzJFNywgMHhDMkU4LCAweEMyRTksIDB4QzJFQSwgMHhDMkVFLCAweEMyRjAsCisgICAgMHhDMkYyLCAweEMyRjMsIDB4QzJGNCwgMHhDMkY1LCAweEMyRjcsIDB4QzJGQSwgMHhDMkZELCAweEMyRkUsIDB4QzJGRiwKKyAgICAweEMzMDEsIDB4QzMwMiwgMHhDMzAzLCAweEMzMDQsIDB4QzMwNSwgMHhDMzA2LCAweEMzMDcsIDB4QzMwQSwgMHhDMzBCLAorICAgIDB4QzMwRSwgMHhDMzBGLCAweEMzMTAsIDB4QzMxMSwgMHhDMzEyLCAweEMzMTYsIDB4QzMxNywgMHhDMzE5LCAweEMzMUEsCisgICAgMHhDMzFCLCAweEMzMUQsIDB4QzMxRSwgMHhDMzFGLCAweEMzMjAsIDB4QzMyMSwgMHhDMzIyLCAweEMzMjMsIDB4QzMyNiwKKyAgICAweEMzMjcsIDB4QzMyQSwgMHhDMzJCLCAweEMzMkMsIDB4QzMyRCwgMHhDMzJFLCAweEMzMkYsIDB4QzMzMCwgMHhDMzMxLAorICAgIDB4QzMzMiwgMHhDMzMzLCAweEMzMzQsIDB4QzMzNSwgMHhDMzM2LCAweEMzMzcsIDB4QzMzOCwgMHhDMzM5LCAweEMzM0EsCisgICAgMHhDMzNCLCAweEMzM0MsIDB4QzMzRCwgMHhDMzNFLCAweEMzM0YsIDB4QzM0MCwgMHhDMzQxLCAweEMzNDIsIDB4QzM0MywKKyAgICAweEMzNDQsIDB4QzM0NiwgMHhDMzQ3LCAweEMzNDgsIDB4QzM0OSwgMHhDMzRBLCAweEMzNEIsIDB4QzM0QywgMHhDMzRELAorICAgIDB4QzM0RSwgMHhDMzRGLCAweEMzNTAsIDB4QzM1MSwgMHhDMzUyLCAweEMzNTMsIDB4QzM1NCwgMHhDMzU1LCAweEMzNTYsCisgICAgMHhDMzU3LCAweEMzNTgsIDB4QzM1OSwgMHhDMzVBLCAweEMzNUIsIDB4QzM1QywgMHhDMzVELCAweEMzNUUsIDB4QzM1RiwKKyAgICAweEMzNjAsIDB4QzM2MSwgMHhDMzYyLCAweEMzNjMsIDB4QzM2NCwgMHhDMzY1LCAweEMzNjYsIDB4QzM2NywgMHhDMzZBLAorICAgIDB4QzM2QiwgMHhDMzZELCAweEMzNkUsIDB4QzM2RiwgMHhDMzcxLCAweEMzNzMsIDB4QzM3NCwgMHhDMzc1LCAweEMzNzYsCisgICAgMHhDMzc3LCAweEMzN0EsIDB4QzM3QiwgMHhDMzdFLCAweEMzN0YsIDB4QzM4MCwgMHhDMzgxLCAweEMzODIsIDB4QzM4MywKKyAgICAweEMzODUsIDB4QzM4NiwgMHhDMzg3LCAweEMzODksIDB4QzM4QSwgMHhDMzhCLCAweEMzOEQsIDB4QzM4RSwgMHhDMzhGLAorICAgIDB4QzM5MCwgMHhDMzkxLCAweEMzOTIsIDB4QzM5MywgMHhDMzk0LCAweEMzOTUsIDB4QzM5NiwgMHhDMzk3LCAweEMzOTgsCisgICAgMHhDMzk5LCAweEMzOUEsIDB4QzM5QiwgMHhDMzlDLCAweEMzOUQsIDB4QzM5RSwgMHhDMzlGLCAweEMzQTAsIDB4QzNBMSwKKyAgICAweEMzQTIsIDB4QzNBMywgMHhDM0E0LCAweEMzQTUsIDB4QzNBNiwgMHhDM0E3LCAweEMzQTgsIDB4QzNBOSwgMHhDM0FBLAorICAgIDB4QzNBQiwgMHhDM0FDLCAweEMzQUQsIDB4QzNBRSwgMHhDM0FGLCAweEMzQjAsIDB4QzNCMSwgMHhDM0IyLCAweEMzQjMsCisgICAgMHhDM0I0LCAweEMzQjUsIDB4QzNCNiwgMHhDM0I3LCAweEMzQjgsIDB4QzNCOSwgMHhDM0JBLCAweEMzQkIsIDB4QzNCQywKKyAgICAweEMzQkQsIDB4QzNCRSwgMHhDM0JGLCAweEMzQzEsIDB4QzNDMiwgMHhDM0MzLCAweEMzQzQsIDB4QzNDNSwgMHhDM0M2LAorICAgIDB4QzNDNywgMHhDM0M4LCAweEMzQzksIDB4QzNDQSwgMHhDM0NCLCAweEMzQ0MsIDB4QzNDRCwgMHhDM0NFLCAweEMzQ0YsCisgICAgMHhDM0QwLCAweEMzRDEsIDB4QzNEMiwgMHhDM0QzLCAweEMzRDQsIDB4QzNENSwgMHhDM0Q2LCAweEMzRDcsIDB4QzNEQSwKKyAgICAweEMzREIsIDB4QzNERCwgMHhDM0RFLCAweEMzRTEsIDB4QzNFMywgMHhDM0U0LCAweEMzRTUsIDB4QzNFNiwgMHhDM0U3LAorICAgIDB4QzNFQSwgMHhDM0VCLCAweEMzRUMsIDB4QzNFRSwgMHhDM0VGLCAweEMzRjAsIDB4QzNGMSwgMHhDM0YyLCAweEMzRjMsCisgICAgMHhDM0Y2LCAweEMzRjcsIDB4QzNGOSwgMHhDM0ZBLCAweEMzRkIsIDB4QzNGQywgMHhDM0ZELCAweEMzRkUsIDB4QzNGRiwKKyAgICAweEM0MDAsIDB4QzQwMSwgMHhDNDAyLCAweEM0MDMsIDB4QzQwNCwgMHhDNDA1LCAweEM0MDYsIDB4QzQwNywgMHhDNDA5LAorICAgIDB4QzQwQSwgMHhDNDBCLCAweEM0MEMsIDB4QzQwRCwgMHhDNDBFLCAweEM0MEYsIDB4QzQxMSwgMHhDNDEyLCAweEM0MTMsCisgICAgMHhDNDE0LCAweEM0MTUsIDB4QzQxNiwgMHhDNDE3LCAweEM0MTgsIDB4QzQxOSwgMHhDNDFBLCAweEM0MUIsIDB4QzQxQywKKyAgICAweEM0MUQsIDB4QzQxRSwgMHhDNDFGLCAweEM0MjAsIDB4QzQyMSwgMHhDNDIyLCAweEM0MjMsIDB4QzQyNSwgMHhDNDI2LAorICAgIDB4QzQyNywgMHhDNDI4LCAweEM0MjksIDB4QzQyQSwgMHhDNDJCLCAweEM0MkQsIDB4QzQyRSwgMHhDNDJGLCAweEM0MzEsCisgICAgMHhDNDMyLCAweEM0MzMsIDB4QzQzNSwgMHhDNDM2LCAweEM0MzcsIDB4QzQzOCwgMHhDNDM5LCAweEM0M0EsIDB4QzQzQiwKKyAgICAweEM0M0UsIDB4QzQzRiwgMHhDNDQwLCAweEM0NDEsIDB4QzQ0MiwgMHhDNDQzLCAweEM0NDQsIDB4QzQ0NSwgMHhDNDQ2LAorICAgIDB4QzQ0NywgMHhDNDQ5LCAweEM0NEEsIDB4QzQ0QiwgMHhDNDRDLCAweEM0NEQsIDB4QzQ0RSwgMHhDNDRGLCAweEM0NTAsCisgICAgMHhDNDUxLCAweEM0NTIsIDB4QzQ1MywgMHhDNDU0LCAweEM0NTUsIDB4QzQ1NiwgMHhDNDU3LCAweEM0NTgsIDB4QzQ1OSwKKyAgICAweEM0NUEsIDB4QzQ1QiwgMHhDNDVDLCAweEM0NUQsIDB4QzQ1RSwgMHhDNDVGLCAweEM0NjAsIDB4QzQ2MSwgMHhDNDYyLAorICAgIDB4QzQ2MywgMHhDNDY2LCAweEM0NjcsIDB4QzQ2OSwgMHhDNDZBLCAweEM0NkIsIDB4QzQ2RCwgMHhDNDZFLCAweEM0NkYsCisgICAgMHhDNDcwLCAweEM0NzEsIDB4QzQ3MiwgMHhDNDczLCAweEM0NzYsIDB4QzQ3NywgMHhDNDc4LCAweEM0N0EsIDB4QzQ3QiwKKyAgICAweEM0N0MsIDB4QzQ3RCwgMHhDNDdFLCAweEM0N0YsIDB4QzQ4MSwgMHhDNDgyLCAweEM0ODMsIDB4QzQ4NCwgMHhDNDg1LAorICAgIDB4QzQ4NiwgMHhDNDg3LCAweEM0ODgsIDB4QzQ4OSwgMHhDNDhBLCAweEM0OEIsIDB4QzQ4QywgMHhDNDhELCAweEM0OEUsCisgICAgMHhDNDhGLCAweEM0OTAsIDB4QzQ5MSwgMHhDNDkyLCAweEM0OTMsIDB4QzQ5NSwgMHhDNDk2LCAweEM0OTcsIDB4QzQ5OCwKKyAgICAweEM0OTksIDB4QzQ5QSwgMHhDNDlCLCAweEM0OUQsIDB4QzQ5RSwgMHhDNDlGLCAweEM0QTAsIDB4QzRBMSwgMHhDNEEyLAorICAgIDB4QzRBMywgMHhDNEE0LCAweEM0QTUsIDB4QzRBNiwgMHhDNEE3LCAweEM0QTgsIDB4QzRBOSwgMHhDNEFBLCAweEM0QUIsCisgICAgMHhDNEFDLCAweEM0QUQsIDB4QzRBRSwgMHhDNEFGLCAweEM0QjAsIDB4QzRCMSwgMHhDNEIyLCAweEM0QjMsIDB4QzRCNCwKKyAgICAweEM0QjUsIDB4QzRCNiwgMHhDNEI3LCAweEM0QjksIDB4QzRCQSwgMHhDNEJCLCAweEM0QkQsIDB4QzRCRSwgMHhDNEJGLAorICAgIDB4QzRDMCwgMHhDNEMxLCAweEM0QzIsIDB4QzRDMywgMHhDNEM0LCAweEM0QzUsIDB4QzRDNiwgMHhDNEM3LCAweEM0QzgsCisgICAgMHhDNEM5LCAweEM0Q0EsIDB4QzRDQiwgMHhDNENDLCAweEM0Q0QsIDB4QzRDRSwgMHhDNENGLCAweEM0RDAsIDB4QzREMSwKKyAgICAweEM0RDIsIDB4QzREMywgMHhDNEQ0LCAweEM0RDUsIDB4QzRENiwgMHhDNEQ3LCAweEM0RDgsIDB4QzREOSwgMHhDNERBLAorICAgIDB4QzREQiwgMHhDNERDLCAweEM0REQsIDB4QzRERSwgMHhDNERGLCAweEM0RTAsIDB4QzRFMSwgMHhDNEUyLCAweEM0RTMsCisgICAgMHhDNEU0LCAweEM0RTUsIDB4QzRFNiwgMHhDNEU3LCAweEM0RTgsIDB4QzRFQSwgMHhDNEVCLCAweEM0RUMsIDB4QzRFRCwKKyAgICAweEM0RUUsIDB4QzRFRiwgMHhDNEYyLCAweEM0RjMsIDB4QzRGNSwgMHhDNEY2LCAweEM0RjcsIDB4QzRGOSwgMHhDNEZCLAorICAgIDB4QzRGQywgMHhDNEZELCAweEM0RkUsIDB4QzUwMiwgMHhDNTAzLCAweEM1MDQsIDB4QzUwNSwgMHhDNTA2LCAweEM1MDcsCisgICAgMHhDNTA4LCAweEM1MDksIDB4QzUwQSwgMHhDNTBCLCAweEM1MEQsIDB4QzUwRSwgMHhDNTBGLCAweEM1MTEsIDB4QzUxMiwKKyAgICAweEM1MTMsIDB4QzUxNSwgMHhDNTE2LCAweEM1MTcsIDB4QzUxOCwgMHhDNTE5LCAweEM1MUEsIDB4QzUxQiwgMHhDNTFELAorICAgIDB4QzUxRSwgMHhDNTFGLCAweEM1MjAsIDB4QzUyMSwgMHhDNTIyLCAweEM1MjMsIDB4QzUyNCwgMHhDNTI1LCAweEM1MjYsCisgICAgMHhDNTI3LCAweEM1MkEsIDB4QzUyQiwgMHhDNTJELCAweEM1MkUsIDB4QzUyRiwgMHhDNTMxLCAweEM1MzIsIDB4QzUzMywKKyAgICAweEM1MzQsIDB4QzUzNSwgMHhDNTM2LCAweEM1MzcsIDB4QzUzQSwgMHhDNTNDLCAweEM1M0UsIDB4QzUzRiwgMHhDNTQwLAorICAgIDB4QzU0MSwgMHhDNTQyLCAweEM1NDMsIDB4QzU0NiwgMHhDNTQ3LCAweEM1NEIsIDB4QzU0RiwgMHhDNTUwLCAweEM1NTEsCisgICAgMHhDNTUyLCAweEM1NTYsIDB4QzU1QSwgMHhDNTVCLCAweEM1NUMsIDB4QzU1RiwgMHhDNTYyLCAweEM1NjMsIDB4QzU2NSwKKyAgICAweEM1NjYsIDB4QzU2NywgMHhDNTY5LCAweEM1NkEsIDB4QzU2QiwgMHhDNTZDLCAweEM1NkQsIDB4QzU2RSwgMHhDNTZGLAorICAgIDB4QzU3MiwgMHhDNTc2LCAweEM1NzcsIDB4QzU3OCwgMHhDNTc5LCAweEM1N0EsIDB4QzU3QiwgMHhDNTdFLCAweEM1N0YsCisgICAgMHhDNTgxLCAweEM1ODIsIDB4QzU4MywgMHhDNTg1LCAweEM1ODYsIDB4QzU4OCwgMHhDNTg5LCAweEM1OEEsIDB4QzU4QiwKKyAgICAweEM1OEUsIDB4QzU5MCwgMHhDNTkyLCAweEM1OTMsIDB4QzU5NCwgMHhDNTk2LCAweEM1OTksIDB4QzU5QSwgMHhDNTlCLAorICAgIDB4QzU5RCwgMHhDNTlFLCAweEM1OUYsIDB4QzVBMSwgMHhDNUEyLCAweEM1QTMsIDB4QzVBNCwgMHhDNUE1LCAweEM1QTYsCisgICAgMHhDNUE3LCAweEM1QTgsIDB4QzVBQSwgMHhDNUFCLCAweEM1QUMsIDB4QzVBRCwgMHhDNUFFLCAweEM1QUYsIDB4QzVCMCwKKyAgICAweEM1QjEsIDB4QzVCMiwgMHhDNUIzLCAweEM1QjYsIDB4QzVCNywgMHhDNUJBLCAweEM1QkYsIDB4QzVDMCwgMHhDNUMxLAorICAgIDB4QzVDMiwgMHhDNUMzLCAweEM1Q0IsIDB4QzVDRCwgMHhDNUNGLCAweEM1RDIsIDB4QzVEMywgMHhDNUQ1LCAweEM1RDYsCisgICAgMHhDNUQ3LCAweEM1RDksIDB4QzVEQSwgMHhDNURCLCAweEM1REMsIDB4QzVERCwgMHhDNURFLCAweEM1REYsIDB4QzVFMiwKKyAgICAweEM1RTQsIDB4QzVFNiwgMHhDNUU3LCAweEM1RTgsIDB4QzVFOSwgMHhDNUVBLCAweEM1RUIsIDB4QzVFRiwgMHhDNUYxLAorICAgIDB4QzVGMiwgMHhDNUYzLCAweEM1RjUsIDB4QzVGOCwgMHhDNUY5LCAweEM1RkEsIDB4QzVGQiwgMHhDNjAyLCAweEM2MDMsCisgICAgMHhDNjA0LCAweEM2MDksIDB4QzYwQSwgMHhDNjBCLCAweEM2MEQsIDB4QzYwRSwgMHhDNjBGLCAweEM2MTEsIDB4QzYxMiwKKyAgICAweEM2MTMsIDB4QzYxNCwgMHhDNjE1LCAweEM2MTYsIDB4QzYxNywgMHhDNjFBLCAweEM2MUQsIDB4QzYxRSwgMHhDNjFGLAorICAgIDB4QzYyMCwgMHhDNjIxLCAweEM2MjIsIDB4QzYyMywgMHhDNjI2LCAweEM2MjcsIDB4QzYyOSwgMHhDNjJBLCAweEM2MkIsCisgICAgMHhDNjJGLCAweEM2MzEsIDB4QzYzMiwgMHhDNjM2LCAweEM2MzgsIDB4QzYzQSwgMHhDNjNDLCAweEM2M0QsIDB4QzYzRSwKKyAgICAweEM2M0YsIDB4QzY0MiwgMHhDNjQzLCAweEM2NDUsIDB4QzY0NiwgMHhDNjQ3LCAweEM2NDksIDB4QzY0QSwgMHhDNjRCLAorICAgIDB4QzY0QywgMHhDNjRELCAweEM2NEUsIDB4QzY0RiwgMHhDNjUyLCAweEM2NTYsIDB4QzY1NywgMHhDNjU4LCAweEM2NTksCisgICAgMHhDNjVBLCAweEM2NUIsIDB4QzY1RSwgMHhDNjVGLCAweEM2NjEsIDB4QzY2MiwgMHhDNjYzLCAweEM2NjQsIDB4QzY2NSwKKyAgICAweEM2NjYsIDB4QzY2NywgMHhDNjY4LCAweEM2NjksIDB4QzY2QSwgMHhDNjZCLCAweEM2NkQsIDB4QzY2RSwgMHhDNjcwLAorICAgIDB4QzY3MiwgMHhDNjczLCAweEM2NzQsIDB4QzY3NSwgMHhDNjc2LCAweEM2NzcsIDB4QzY3QSwgMHhDNjdCLCAweEM2N0QsCisgICAgMHhDNjdFLCAweEM2N0YsIDB4QzY4MSwgMHhDNjgyLCAweEM2ODMsIDB4QzY4NCwgMHhDNjg1LCAweEM2ODYsIDB4QzY4NywKKyAgICAweEM2OEEsIDB4QzY4QywgMHhDNjhFLCAweEM2OEYsIDB4QzY5MCwgMHhDNjkxLCAweEM2OTIsIDB4QzY5MywgMHhDNjk2LAorICAgIDB4QzY5NywgMHhDNjk5LCAweEM2OUEsIDB4QzY5QiwgMHhDNjlELCAweEM2OUUsIDB4QzY5RiwgMHhDNkEwLCAweEM2QTEsCisgICAgMHhDNkEyLCAweEM2QTMsIDB4QzZBNiwgMHhDNkE4LCAweEM2QUEsIDB4QzZBQiwgMHhDNkFDLCAweEM2QUQsIDB4QzZBRSwKKyAgICAweEM2QUYsIDB4QzZCMiwgMHhDNkIzLCAweEM2QjUsIDB4QzZCNiwgMHhDNkI3LCAweEM2QkIsIDB4QzZCQywgMHhDNkJELAorICAgIDB4QzZCRSwgMHhDNkJGLCAweEM2QzIsIDB4QzZDNCwgMHhDNkM2LCAweEM2QzcsIDB4QzZDOCwgMHhDNkM5LCAweEM2Q0EsCisgICAgMHhDNkNCLCAweEM2Q0UsIDB4QzZDRiwgMHhDNkQxLCAweEM2RDIsIDB4QzZEMywgMHhDNkQ1LCAweEM2RDYsIDB4QzZENywKKyAgICAweEM2RDgsIDB4QzZEOSwgMHhDNkRBLCAweEM2REIsIDB4QzZERSwgMHhDNkRGLCAweEM2RTIsIDB4QzZFMywgMHhDNkU0LAorICAgIDB4QzZFNSwgMHhDNkU2LCAweEM2RTcsIDB4QzZFQSwgMHhDNkVCLCAweEM2RUQsIDB4QzZFRSwgMHhDNkVGLCAweEM2RjEsCisgICAgMHhDNkYyLCAweEM2RjMsIDB4QzZGNCwgMHhDNkY1LCAweEM2RjYsIDB4QzZGNywgMHhDNkZBLCAweEM2RkIsIDB4QzZGQywKKyAgICAweEM2RkUsIDB4QzZGRiwgMHhDNzAwLCAweEM3MDEsIDB4QzcwMiwgMHhDNzAzLCAweEM3MDYsIDB4QzcwNywgMHhDNzA5LAorICAgIDB4QzcwQSwgMHhDNzBCLCAweEM3MEQsIDB4QzcwRSwgMHhDNzBGLCAweEM3MTAsIDB4QzcxMSwgMHhDNzEyLCAweEM3MTMsCisgICAgMHhDNzE2LCAweEM3MTgsIDB4QzcxQSwgMHhDNzFCLCAweEM3MUMsIDB4QzcxRCwgMHhDNzFFLCAweEM3MUYsIDB4QzcyMiwKKyAgICAweEM3MjMsIDB4QzcyNSwgMHhDNzI2LCAweEM3MjcsIDB4QzcyOSwgMHhDNzJBLCAweEM3MkIsIDB4QzcyQywgMHhDNzJELAorICAgIDB4QzcyRSwgMHhDNzJGLCAweEM3MzIsIDB4QzczNCwgMHhDNzM2LCAweEM3MzgsIDB4QzczOSwgMHhDNzNBLCAweEM3M0IsCisgICAgMHhDNzNFLCAweEM3M0YsIDB4Qzc0MSwgMHhDNzQyLCAweEM3NDMsIDB4Qzc0NSwgMHhDNzQ2LCAweEM3NDcsIDB4Qzc0OCwKKyAgICAweEM3NDksIDB4Qzc0QiwgMHhDNzRFLCAweEM3NTAsIDB4Qzc1OSwgMHhDNzVBLCAweEM3NUIsIDB4Qzc1RCwgMHhDNzVFLAorICAgIDB4Qzc1RiwgMHhDNzYxLCAweEM3NjIsIDB4Qzc2MywgMHhDNzY0LCAweEM3NjUsIDB4Qzc2NiwgMHhDNzY3LCAweEM3NjksCisgICAgMHhDNzZBLCAweEM3NkMsIDB4Qzc2RCwgMHhDNzZFLCAweEM3NkYsIDB4Qzc3MCwgMHhDNzcxLCAweEM3NzIsIDB4Qzc3MywKKyAgICAweEM3NzYsIDB4Qzc3NywgMHhDNzc5LCAweEM3N0EsIDB4Qzc3QiwgMHhDNzdGLCAweEM3ODAsIDB4Qzc4MSwgMHhDNzgyLAorICAgIDB4Qzc4NiwgMHhDNzhCLCAweEM3OEMsIDB4Qzc4RCwgMHhDNzhGLCAweEM3OTIsIDB4Qzc5MywgMHhDNzk1LCAweEM3OTksCisgICAgMHhDNzlCLCAweEM3OUMsIDB4Qzc5RCwgMHhDNzlFLCAweEM3OUYsIDB4QzdBMiwgMHhDN0E3LCAweEM3QTgsIDB4QzdBOSwKKyAgICAweEM3QUEsIDB4QzdBQiwgMHhDN0FFLCAweEM3QUYsIDB4QzdCMSwgMHhDN0IyLCAweEM3QjMsIDB4QzdCNSwgMHhDN0I2LAorICAgIDB4QzdCNywgMHhDN0I4LCAweEM3QjksIDB4QzdCQSwgMHhDN0JCLCAweEM3QkUsIDB4QzdDMiwgMHhDN0MzLCAweEM3QzQsCisgICAgMHhDN0M1LCAweEM3QzYsIDB4QzdDNywgMHhDN0NBLCAweEM3Q0IsIDB4QzdDRCwgMHhDN0NGLCAweEM3RDEsIDB4QzdEMiwKKyAgICAweEM3RDMsIDB4QzdENCwgMHhDN0Q1LCAweEM3RDYsIDB4QzdENywgMHhDN0Q5LCAweEM3REEsIDB4QzdEQiwgMHhDN0RDLAorICAgIDB4QzdERSwgMHhDN0RGLCAweEM3RTAsIDB4QzdFMSwgMHhDN0UyLCAweEM3RTMsIDB4QzdFNSwgMHhDN0U2LCAweEM3RTcsCisgICAgMHhDN0U5LCAweEM3RUEsIDB4QzdFQiwgMHhDN0VELCAweEM3RUUsIDB4QzdFRiwgMHhDN0YwLCAweEM3RjEsIDB4QzdGMiwKKyAgICAweEM3RjMsIDB4QzdGNCwgMHhDN0Y1LCAweEM3RjYsIDB4QzdGNywgMHhDN0Y4LCAweEM3RjksIDB4QzdGQSwgMHhDN0ZCLAorICAgIDB4QzdGQywgMHhDN0ZELCAweEM3RkUsIDB4QzdGRiwgMHhDODAyLCAweEM4MDMsIDB4QzgwNSwgMHhDODA2LCAweEM4MDcsCisgICAgMHhDODA5LCAweEM4MEIsIDB4QzgwQywgMHhDODBELCAweEM4MEUsIDB4QzgwRiwgMHhDODEyLCAweEM4MTQsIDB4QzgxNywKKyAgICAweEM4MTgsIDB4QzgxOSwgMHhDODFBLCAweEM4MUIsIDB4QzgxRSwgMHhDODFGLCAweEM4MjEsIDB4QzgyMiwgMHhDODIzLAorICAgIDB4QzgyNSwgMHhDODI2LCAweEM4MjcsIDB4QzgyOCwgMHhDODI5LCAweEM4MkEsIDB4QzgyQiwgMHhDODJFLCAweEM4MzAsCisgICAgMHhDODMyLCAweEM4MzMsIDB4QzgzNCwgMHhDODM1LCAweEM4MzYsIDB4QzgzNywgMHhDODM5LCAweEM4M0EsIDB4QzgzQiwKKyAgICAweEM4M0QsIDB4QzgzRSwgMHhDODNGLCAweEM4NDEsIDB4Qzg0MiwgMHhDODQzLCAweEM4NDQsIDB4Qzg0NSwgMHhDODQ2LAorICAgIDB4Qzg0NywgMHhDODRBLCAweEM4NEIsIDB4Qzg0RSwgMHhDODRGLCAweEM4NTAsIDB4Qzg1MSwgMHhDODUyLCAweEM4NTMsCisgICAgMHhDODU1LCAweEM4NTYsIDB4Qzg1NywgMHhDODU4LCAweEM4NTksIDB4Qzg1QSwgMHhDODVCLCAweEM4NUMsIDB4Qzg1RCwKKyAgICAweEM4NUUsIDB4Qzg1RiwgMHhDODYwLCAweEM4NjEsIDB4Qzg2MiwgMHhDODYzLCAweEM4NjQsIDB4Qzg2NSwgMHhDODY2LAorICAgIDB4Qzg2NywgMHhDODY4LCAweEM4NjksIDB4Qzg2QSwgMHhDODZCLCAweEM4NkMsIDB4Qzg2RCwgMHhDODZFLCAweEM4NkYsCisgICAgMHhDODcyLCAweEM4NzMsIDB4Qzg3NSwgMHhDODc2LCAweEM4NzcsIDB4Qzg3OSwgMHhDODdCLCAweEM4N0MsIDB4Qzg3RCwKKyAgICAweEM4N0UsIDB4Qzg3RiwgMHhDODgyLCAweEM4ODQsIDB4Qzg4OCwgMHhDODg5LCAweEM4OEEsIDB4Qzg4RSwgMHhDODhGLAorICAgIDB4Qzg5MCwgMHhDODkxLCAweEM4OTIsIDB4Qzg5MywgMHhDODk1LCAweEM4OTYsIDB4Qzg5NywgMHhDODk4LCAweEM4OTksCisgICAgMHhDODlBLCAweEM4OUIsIDB4Qzg5QywgMHhDODlFLCAweEM4QTAsIDB4QzhBMiwgMHhDOEEzLCAweEM4QTQsIDB4QzhBNSwKKyAgICAweEM4QTYsIDB4QzhBNywgMHhDOEE5LCAweEM4QUEsIDB4QzhBQiwgMHhDOEFDLCAweEM4QUQsIDB4QzhBRSwgMHhDOEFGLAorICAgIDB4QzhCMCwgMHhDOEIxLCAweEM4QjIsIDB4QzhCMywgMHhDOEI0LCAweEM4QjUsIDB4QzhCNiwgMHhDOEI3LCAweEM4QjgsCisgICAgMHhDOEI5LCAweEM4QkEsIDB4QzhCQiwgMHhDOEJFLCAweEM4QkYsIDB4QzhDMCwgMHhDOEMxLCAweEM4QzIsIDB4QzhDMywKKyAgICAweEM4QzUsIDB4QzhDNiwgMHhDOEM3LCAweEM4QzksIDB4QzhDQSwgMHhDOENCLCAweEM4Q0QsIDB4QzhDRSwgMHhDOENGLAorICAgIDB4QzhEMCwgMHhDOEQxLCAweEM4RDIsIDB4QzhEMywgMHhDOEQ2LCAweEM4RDgsIDB4QzhEQSwgMHhDOERCLCAweEM4REMsCisgICAgMHhDOERELCAweEM4REUsIDB4QzhERiwgMHhDOEUyLCAweEM4RTMsIDB4QzhFNSwgMHhDOEU2LCAweEM4RTcsIDB4QzhFOCwKKyAgICAweEM4RTksIDB4QzhFQSwgMHhDOEVCLCAweEM4RUMsIDB4QzhFRCwgMHhDOEVFLCAweEM4RUYsIDB4QzhGMCwgMHhDOEYxLAorICAgIDB4QzhGMiwgMHhDOEYzLCAweEM4RjQsIDB4QzhGNiwgMHhDOEY3LCAweEM4RjgsIDB4QzhGOSwgMHhDOEZBLCAweEM4RkIsCisgICAgMHhDOEZFLCAweEM4RkYsIDB4QzkwMSwgMHhDOTAyLCAweEM5MDMsIDB4QzkwNywgMHhDOTA4LCAweEM5MDksIDB4QzkwQSwKKyAgICAweEM5MEIsIDB4QzkwRSwgMHhDOTEwLCAweEM5MTIsIDB4QzkxMywgMHhDOTE0LCAweEM5MTUsIDB4QzkxNiwgMHhDOTE3LAorICAgIDB4QzkxOSwgMHhDOTFBLCAweEM5MUIsIDB4QzkxQywgMHhDOTFELCAweEM5MUUsIDB4QzkxRiwgMHhDOTIwLCAweEM5MjEsCisgICAgMHhDOTIyLCAweEM5MjMsIDB4QzkyNCwgMHhDOTI1LCAweEM5MjYsIDB4QzkyNywgMHhDOTI4LCAweEM5MjksIDB4QzkyQSwKKyAgICAweEM5MkIsIDB4QzkyRCwgMHhDOTJFLCAweEM5MkYsIDB4QzkzMCwgMHhDOTMxLCAweEM5MzIsIDB4QzkzMywgMHhDOTM1LAorICAgIDB4QzkzNiwgMHhDOTM3LCAweEM5MzgsIDB4QzkzOSwgMHhDOTNBLCAweEM5M0IsIDB4QzkzQywgMHhDOTNELCAweEM5M0UsCisgICAgMHhDOTNGLCAweEM5NDAsIDB4Qzk0MSwgMHhDOTQyLCAweEM5NDMsIDB4Qzk0NCwgMHhDOTQ1LCAweEM5NDYsIDB4Qzk0NywKKyAgICAweEM5NDgsIDB4Qzk0OSwgMHhDOTRBLCAweEM5NEIsIDB4Qzk0QywgMHhDOTRELCAweEM5NEUsIDB4Qzk0RiwgMHhDOTUyLAorICAgIDB4Qzk1MywgMHhDOTU1LCAweEM5NTYsIDB4Qzk1NywgMHhDOTU5LCAweEM5NUEsIDB4Qzk1QiwgMHhDOTVDLCAweEM5NUQsCisgICAgMHhDOTVFLCAweEM5NUYsIDB4Qzk2MiwgMHhDOTY0LCAweEM5NjUsIDB4Qzk2NiwgMHhDOTY3LCAweEM5NjgsIDB4Qzk2OSwKKyAgICAweEM5NkEsIDB4Qzk2QiwgMHhDOTZELCAweEM5NkUsIDB4Qzk2RiwgMHhDOTcxLCAweEM5NzIsIDB4Qzk3MywgMHhDOTc1LAorICAgIDB4Qzk3NiwgMHhDOTc3LCAweEM5NzgsIDB4Qzk3OSwgMHhDOTdBLCAweEM5N0IsIDB4Qzk3RCwgMHhDOTdFLCAweEM5N0YsCisgICAgMHhDOTgwLCAweEM5ODEsIDB4Qzk4MiwgMHhDOTgzLCAweEM5ODQsIDB4Qzk4NSwgMHhDOTg2LCAweEM5ODcsIDB4Qzk4QSwKKyAgICAweEM5OEIsIDB4Qzk4RCwgMHhDOThFLCAweEM5OEYsIDB4Qzk5MSwgMHhDOTkyLCAweEM5OTMsIDB4Qzk5NCwgMHhDOTk1LAorICAgIDB4Qzk5NiwgMHhDOTk3LCAweEM5OUEsIDB4Qzk5QywgMHhDOTlFLCAweEM5OUYsIDB4QzlBMCwgMHhDOUExLCAweEM5QTIsCisgICAgMHhDOUEzLCAweEM5QTQsIDB4QzlBNSwgMHhDOUE2LCAweEM5QTcsIDB4QzlBOCwgMHhDOUE5LCAweEM5QUEsIDB4QzlBQiwKKyAgICAweEM5QUMsIDB4QzlBRCwgMHhDOUFFLCAweEM5QUYsIDB4QzlCMCwgMHhDOUIxLCAweEM5QjIsIDB4QzlCMywgMHhDOUI0LAorICAgIDB4QzlCNSwgMHhDOUI2LCAweEM5QjcsIDB4QzlCOCwgMHhDOUI5LCAweEM5QkEsIDB4QzlCQiwgMHhDOUJDLCAweEM5QkQsCisgICAgMHhDOUJFLCAweEM5QkYsIDB4QzlDMiwgMHhDOUMzLCAweEM5QzUsIDB4QzlDNiwgMHhDOUM5LCAweEM5Q0IsIDB4QzlDQywKKyAgICAweEM5Q0QsIDB4QzlDRSwgMHhDOUNGLCAweEM5RDIsIDB4QzlENCwgMHhDOUQ3LCAweEM5RDgsIDB4QzlEQiwgMHhDOURFLAorICAgIDB4QzlERiwgMHhDOUUxLCAweEM5RTMsIDB4QzlFNSwgMHhDOUU2LCAweEM5RTgsIDB4QzlFOSwgMHhDOUVBLCAweEM5RUIsCisgICAgMHhDOUVFLCAweEM5RjIsIDB4QzlGMywgMHhDOUY0LCAweEM5RjUsIDB4QzlGNiwgMHhDOUY3LCAweEM5RkEsIDB4QzlGQiwKKyAgICAweEM5RkQsIDB4QzlGRSwgMHhDOUZGLCAweENBMDEsIDB4Q0EwMiwgMHhDQTAzLCAweENBMDQsIDB4Q0EwNSwgMHhDQTA2LAorICAgIDB4Q0EwNywgMHhDQTBBLCAweENBMEUsIDB4Q0EwRiwgMHhDQTEwLCAweENBMTEsIDB4Q0ExMiwgMHhDQTEzLCAweENBMTUsCisgICAgMHhDQTE2LCAweENBMTcsIDB4Q0ExOSwgMHhDQTFBLCAweENBMUIsIDB4Q0ExQywgMHhDQTFELCAweENBMUUsIDB4Q0ExRiwKKyAgICAweENBMjAsIDB4Q0EyMSwgMHhDQTIyLCAweENBMjMsIDB4Q0EyNCwgMHhDQTI1LCAweENBMjYsIDB4Q0EyNywgMHhDQTI4LAorICAgIDB4Q0EyQSwgMHhDQTJCLCAweENBMkMsIDB4Q0EyRCwgMHhDQTJFLCAweENBMkYsIDB4Q0EzMCwgMHhDQTMxLCAweENBMzIsCisgICAgMHhDQTMzLCAweENBMzQsIDB4Q0EzNSwgMHhDQTM2LCAweENBMzcsIDB4Q0EzOCwgMHhDQTM5LCAweENBM0EsIDB4Q0EzQiwKKyAgICAweENBM0MsIDB4Q0EzRCwgMHhDQTNFLCAweENBM0YsIDB4Q0E0MCwgMHhDQTQxLCAweENBNDIsIDB4Q0E0MywgMHhDQTQ0LAorICAgIDB4Q0E0NSwgMHhDQTQ2LCAweENBNDcsIDB4Q0E0OCwgMHhDQTQ5LCAweENBNEEsIDB4Q0E0QiwgMHhDQTRFLCAweENBNEYsCisgICAgMHhDQTUxLCAweENBNTIsIDB4Q0E1MywgMHhDQTU1LCAweENBNTYsIDB4Q0E1NywgMHhDQTU4LCAweENBNTksIDB4Q0E1QSwKKyAgICAweENBNUIsIDB4Q0E1RSwgMHhDQTYyLCAweENBNjMsIDB4Q0E2NCwgMHhDQTY1LCAweENBNjYsIDB4Q0E2NywgMHhDQTY5LAorICAgIDB4Q0E2QSwgMHhDQTZCLCAweENBNkMsIDB4Q0E2RCwgMHhDQTZFLCAweENBNkYsIDB4Q0E3MCwgMHhDQTcxLCAweENBNzIsCisgICAgMHhDQTczLCAweENBNzQsIDB4Q0E3NSwgMHhDQTc2LCAweENBNzcsIDB4Q0E3OCwgMHhDQTc5LCAweENBN0EsIDB4Q0E3QiwKKyAgICAweENBN0MsIDB4Q0E3RSwgMHhDQTdGLCAweENBODAsIDB4Q0E4MSwgMHhDQTgyLCAweENBODMsIDB4Q0E4NSwgMHhDQTg2LAorICAgIDB4Q0E4NywgMHhDQTg4LCAweENBODksIDB4Q0E4QSwgMHhDQThCLCAweENBOEMsIDB4Q0E4RCwgMHhDQThFLCAweENBOEYsCisgICAgMHhDQTkwLCAweENBOTEsIDB4Q0E5MiwgMHhDQTkzLCAweENBOTQsIDB4Q0E5NSwgMHhDQTk2LCAweENBOTcsIDB4Q0E5OSwKKyAgICAweENBOUEsIDB4Q0E5QiwgMHhDQTlDLCAweENBOUQsIDB4Q0E5RSwgMHhDQTlGLCAweENBQTAsIDB4Q0FBMSwgMHhDQUEyLAorICAgIDB4Q0FBMywgMHhDQUE0LCAweENBQTUsIDB4Q0FBNiwgMHhDQUE3LCAweENBQTgsIDB4Q0FBOSwgMHhDQUFBLCAweENBQUIsCisgICAgMHhDQUFDLCAweENBQUQsIDB4Q0FBRSwgMHhDQUFGLCAweENBQjAsIDB4Q0FCMSwgMHhDQUIyLCAweENBQjMsIDB4Q0FCNCwKKyAgICAweENBQjUsIDB4Q0FCNiwgMHhDQUI3LCAweENBQjgsIDB4Q0FCOSwgMHhDQUJBLCAweENBQkIsIDB4Q0FCRSwgMHhDQUJGLAorICAgIDB4Q0FDMSwgMHhDQUMyLCAweENBQzMsIDB4Q0FDNSwgMHhDQUM2LCAweENBQzcsIDB4Q0FDOCwgMHhDQUM5LCAweENBQ0EsCisgICAgMHhDQUNCLCAweENBQ0UsIDB4Q0FEMCwgMHhDQUQyLCAweENBRDQsIDB4Q0FENSwgMHhDQUQ2LCAweENBRDcsIDB4Q0FEQSwKKyAgICAweENBREIsIDB4Q0FEQywgMHhDQURELCAweENBREUsIDB4Q0FERiwgMHhDQUUxLCAweENBRTIsIDB4Q0FFMywgMHhDQUU0LAorICAgIDB4Q0FFNSwgMHhDQUU2LCAweENBRTcsIDB4Q0FFOCwgMHhDQUU5LCAweENBRUEsIDB4Q0FFQiwgMHhDQUVELCAweENBRUUsCisgICAgMHhDQUVGLCAweENBRjAsIDB4Q0FGMSwgMHhDQUYyLCAweENBRjMsIDB4Q0FGNSwgMHhDQUY2LCAweENBRjcsIDB4Q0FGOCwKKyAgICAweENBRjksIDB4Q0FGQSwgMHhDQUZCLCAweENBRkMsIDB4Q0FGRCwgMHhDQUZFLCAweENBRkYsIDB4Q0IwMCwgMHhDQjAxLAorICAgIDB4Q0IwMiwgMHhDQjAzLCAweENCMDQsIDB4Q0IwNSwgMHhDQjA2LCAweENCMDcsIDB4Q0IwOSwgMHhDQjBBLCAweENCMEIsCisgICAgMHhDQjBDLCAweENCMEQsIDB4Q0IwRSwgMHhDQjBGLCAweENCMTEsIDB4Q0IxMiwgMHhDQjEzLCAweENCMTUsIDB4Q0IxNiwKKyAgICAweENCMTcsIDB4Q0IxOSwgMHhDQjFBLCAweENCMUIsIDB4Q0IxQywgMHhDQjFELCAweENCMUUsIDB4Q0IxRiwgMHhDQjIyLAorICAgIDB4Q0IyMywgMHhDQjI0LCAweENCMjUsIDB4Q0IyNiwgMHhDQjI3LCAweENCMjgsIDB4Q0IyOSwgMHhDQjJBLCAweENCMkIsCisgICAgMHhDQjJDLCAweENCMkQsIDB4Q0IyRSwgMHhDQjJGLCAweENCMzAsIDB4Q0IzMSwgMHhDQjMyLCAweENCMzMsIDB4Q0IzNCwKKyAgICAweENCMzUsIDB4Q0IzNiwgMHhDQjM3LCAweENCMzgsIDB4Q0IzOSwgMHhDQjNBLCAweENCM0IsIDB4Q0IzQywgMHhDQjNELAorICAgIDB4Q0IzRSwgMHhDQjNGLCAweENCNDAsIDB4Q0I0MiwgMHhDQjQzLCAweENCNDQsIDB4Q0I0NSwgMHhDQjQ2LCAweENCNDcsCisgICAgMHhDQjRBLCAweENCNEIsIDB4Q0I0RCwgMHhDQjRFLCAweENCNEYsIDB4Q0I1MSwgMHhDQjUyLCAweENCNTMsIDB4Q0I1NCwKKyAgICAweENCNTUsIDB4Q0I1NiwgMHhDQjU3LCAweENCNUEsIDB4Q0I1QiwgMHhDQjVDLCAweENCNUUsIDB4Q0I1RiwgMHhDQjYwLAorICAgIDB4Q0I2MSwgMHhDQjYyLCAweENCNjMsIDB4Q0I2NSwgMHhDQjY2LCAweENCNjcsIDB4Q0I2OCwgMHhDQjY5LCAweENCNkEsCisgICAgMHhDQjZCLCAweENCNkMsIDB4Q0I2RCwgMHhDQjZFLCAweENCNkYsIDB4Q0I3MCwgMHhDQjcxLCAweENCNzIsIDB4Q0I3MywKKyAgICAweENCNzQsIDB4Q0I3NSwgMHhDQjc2LCAweENCNzcsIDB4Q0I3QSwgMHhDQjdCLCAweENCN0MsIDB4Q0I3RCwgMHhDQjdFLAorICAgIDB4Q0I3RiwgMHhDQjgwLCAweENCODEsIDB4Q0I4MiwgMHhDQjgzLCAweENCODQsIDB4Q0I4NSwgMHhDQjg2LCAweENCODcsCisgICAgMHhDQjg4LCAweENCODksIDB4Q0I4QSwgMHhDQjhCLCAweENCOEMsIDB4Q0I4RCwgMHhDQjhFLCAweENCOEYsIDB4Q0I5MCwKKyAgICAweENCOTEsIDB4Q0I5MiwgMHhDQjkzLCAweENCOTQsIDB4Q0I5NSwgMHhDQjk2LCAweENCOTcsIDB4Q0I5OCwgMHhDQjk5LAorICAgIDB4Q0I5QSwgMHhDQjlCLCAweENCOUQsIDB4Q0I5RSwgMHhDQjlGLCAweENCQTAsIDB4Q0JBMSwgMHhDQkEyLCAweENCQTMsCisgICAgMHhDQkE0LCAweENCQTUsIDB4Q0JBNiwgMHhDQkE3LCAweENCQTgsIDB4Q0JBOSwgMHhDQkFBLCAweENCQUIsIDB4Q0JBQywKKyAgICAweENCQUQsIDB4Q0JBRSwgMHhDQkFGLCAweENCQjAsIDB4Q0JCMSwgMHhDQkIyLCAweENCQjMsIDB4Q0JCNCwgMHhDQkI1LAorICAgIDB4Q0JCNiwgMHhDQkI3LCAweENCQjksIDB4Q0JCQSwgMHhDQkJCLCAweENCQkMsIDB4Q0JCRCwgMHhDQkJFLCAweENCQkYsCisgICAgMHhDQkMwLCAweENCQzEsIDB4Q0JDMiwgMHhDQkMzLCAweENCQzQsIDB4Q0JDNSwgMHhDQkM2LCAweENCQzcsIDB4Q0JDOCwKKyAgICAweENCQzksIDB4Q0JDQSwgMHhDQkNCLCAweENCQ0MsIDB4Q0JDRCwgMHhDQkNFLCAweENCQ0YsIDB4Q0JEMCwgMHhDQkQxLAorICAgIDB4Q0JEMiwgMHhDQkQzLCAweENCRDUsIDB4Q0JENiwgMHhDQkQ3LCAweENCRDgsIDB4Q0JEOSwgMHhDQkRBLCAweENCREIsCisgICAgMHhDQkRDLCAweENCREQsIDB4Q0JERSwgMHhDQkRGLCAweENCRTAsIDB4Q0JFMSwgMHhDQkUyLCAweENCRTMsIDB4Q0JFNSwKKyAgICAweENCRTYsIDB4Q0JFOCwgMHhDQkVBLCAweENCRUIsIDB4Q0JFQywgMHhDQkVELCAweENCRUUsIDB4Q0JFRiwgMHhDQkYwLAorICAgIDB4Q0JGMSwgMHhDQkYyLCAweENCRjMsIDB4Q0JGNCwgMHhDQkY1LCAweENCRjYsIDB4Q0JGNywgMHhDQkY4LCAweENCRjksCisgICAgMHhDQkZBLCAweENCRkIsIDB4Q0JGQywgMHhDQkZELCAweENCRkUsIDB4Q0JGRiwgMHhDQzAwLCAweENDMDEsIDB4Q0MwMiwKKyAgICAweENDMDMsIDB4Q0MwNCwgMHhDQzA1LCAweENDMDYsIDB4Q0MwNywgMHhDQzA4LCAweENDMDksIDB4Q0MwQSwgMHhDQzBCLAorICAgIDB4Q0MwRSwgMHhDQzBGLCAweENDMTEsIDB4Q0MxMiwgMHhDQzEzLCAweENDMTUsIDB4Q0MxNiwgMHhDQzE3LCAweENDMTgsCisgICAgMHhDQzE5LCAweENDMUEsIDB4Q0MxQiwgMHhDQzFFLCAweENDMUYsIDB4Q0MyMCwgMHhDQzIzLCAweENDMjQsIDB4Q0MyNSwKKyAgICAweENDMjYsIDB4Q0MyQSwgMHhDQzJCLCAweENDMkQsIDB4Q0MyRiwgMHhDQzMxLCAweENDMzIsIDB4Q0MzMywgMHhDQzM0LAorICAgIDB4Q0MzNSwgMHhDQzM2LCAweENDMzcsIDB4Q0MzQSwgMHhDQzNGLCAweENDNDAsIDB4Q0M0MSwgMHhDQzQyLCAweENDNDMsCisgICAgMHhDQzQ2LCAweENDNDcsIDB4Q0M0OSwgMHhDQzRBLCAweENDNEIsIDB4Q0M0RCwgMHhDQzRFLCAweENDNEYsIDB4Q0M1MCwKKyAgICAweENDNTEsIDB4Q0M1MiwgMHhDQzUzLCAweENDNTYsIDB4Q0M1QSwgMHhDQzVCLCAweENDNUMsIDB4Q0M1RCwgMHhDQzVFLAorICAgIDB4Q0M1RiwgMHhDQzYxLCAweENDNjIsIDB4Q0M2MywgMHhDQzY1LCAweENDNjcsIDB4Q0M2OSwgMHhDQzZBLCAweENDNkIsCisgICAgMHhDQzZDLCAweENDNkQsIDB4Q0M2RSwgMHhDQzZGLCAweENDNzEsIDB4Q0M3MiwgMHhDQzczLCAweENDNzQsIDB4Q0M3NiwKKyAgICAweENDNzcsIDB4Q0M3OCwgMHhDQzc5LCAweENDN0EsIDB4Q0M3QiwgMHhDQzdDLCAweENDN0QsIDB4Q0M3RSwgMHhDQzdGLAorICAgIDB4Q0M4MCwgMHhDQzgxLCAweENDODIsIDB4Q0M4MywgMHhDQzg0LCAweENDODUsIDB4Q0M4NiwgMHhDQzg3LCAweENDODgsCisgICAgMHhDQzg5LCAweENDOEEsIDB4Q0M4QiwgMHhDQzhDLCAweENDOEQsIDB4Q0M4RSwgMHhDQzhGLCAweENDOTAsIDB4Q0M5MSwKKyAgICAweENDOTIsIDB4Q0M5MywgMHhDQzk0LCAweENDOTUsIDB4Q0M5NiwgMHhDQzk3LCAweENDOUEsIDB4Q0M5QiwgMHhDQzlELAorICAgIDB4Q0M5RSwgMHhDQzlGLCAweENDQTEsIDB4Q0NBMiwgMHhDQ0EzLCAweENDQTQsIDB4Q0NBNSwgMHhDQ0E2LCAweENDQTcsCisgICAgMHhDQ0FBLCAweENDQUUsIDB4Q0NBRiwgMHhDQ0IwLCAweENDQjEsIDB4Q0NCMiwgMHhDQ0IzLCAweENDQjYsIDB4Q0NCNywKKyAgICAweENDQjksIDB4Q0NCQSwgMHhDQ0JCLCAweENDQkQsIDB4Q0NCRSwgMHhDQ0JGLCAweENDQzAsIDB4Q0NDMSwgMHhDQ0MyLAorICAgIDB4Q0NDMywgMHhDQ0M2LCAweENDQzgsIDB4Q0NDQSwgMHhDQ0NCLCAweENDQ0MsIDB4Q0NDRCwgMHhDQ0NFLCAweENDQ0YsCisgICAgMHhDQ0QxLCAweENDRDIsIDB4Q0NEMywgMHhDQ0Q1LCAweENDRDYsIDB4Q0NENywgMHhDQ0Q4LCAweENDRDksIDB4Q0NEQSwKKyAgICAweENDREIsIDB4Q0NEQywgMHhDQ0RELCAweENDREUsIDB4Q0NERiwgMHhDQ0UwLCAweENDRTEsIDB4Q0NFMiwgMHhDQ0UzLAorICAgIDB4Q0NFNSwgMHhDQ0U2LCAweENDRTcsIDB4Q0NFOCwgMHhDQ0U5LCAweENDRUEsIDB4Q0NFQiwgMHhDQ0VELCAweENDRUUsCisgICAgMHhDQ0VGLCAweENDRjEsIDB4Q0NGMiwgMHhDQ0YzLCAweENDRjQsIDB4Q0NGNSwgMHhDQ0Y2LCAweENDRjcsIDB4Q0NGOCwKKyAgICAweENDRjksIDB4Q0NGQSwgMHhDQ0ZCLCAweENDRkMsIDB4Q0NGRCwgMHhDQ0ZFLCAweENDRkYsIDB4Q0QwMCwgMHhDRDAyLAorICAgIDB4Q0QwMywgMHhDRDA0LCAweENEMDUsIDB4Q0QwNiwgMHhDRDA3LCAweENEMEEsIDB4Q0QwQiwgMHhDRDBELCAweENEMEUsCisgICAgMHhDRDBGLCAweENEMTEsIDB4Q0QxMiwgMHhDRDEzLCAweENEMTQsIDB4Q0QxNSwgMHhDRDE2LCAweENEMTcsIDB4Q0QxQSwKKyAgICAweENEMUMsIDB4Q0QxRSwgMHhDRDFGLCAweENEMjAsIDB4Q0QyMSwgMHhDRDIyLCAweENEMjMsIDB4Q0QyNSwgMHhDRDI2LAorICAgIDB4Q0QyNywgMHhDRDI5LCAweENEMkEsIDB4Q0QyQiwgMHhDRDJELCAweENEMkUsIDB4Q0QyRiwgMHhDRDMwLCAweENEMzEsCisgICAgMHhDRDMyLCAweENEMzMsIDB4Q0QzNCwgMHhDRDM1LCAweENEMzYsIDB4Q0QzNywgMHhDRDM4LCAweENEM0EsIDB4Q0QzQiwKKyAgICAweENEM0MsIDB4Q0QzRCwgMHhDRDNFLCAweENEM0YsIDB4Q0Q0MCwgMHhDRDQxLCAweENENDIsIDB4Q0Q0MywgMHhDRDQ0LAorICAgIDB4Q0Q0NSwgMHhDRDQ2LCAweENENDcsIDB4Q0Q0OCwgMHhDRDQ5LCAweENENEEsIDB4Q0Q0QiwgMHhDRDRDLCAweENENEQsCisgICAgMHhDRDRFLCAweENENEYsIDB4Q0Q1MCwgMHhDRDUxLCAweENENTIsIDB4Q0Q1MywgMHhDRDU0LCAweENENTUsIDB4Q0Q1NiwKKyAgICAweENENTcsIDB4Q0Q1OCwgMHhDRDU5LCAweENENUEsIDB4Q0Q1QiwgMHhDRDVELCAweENENUUsIDB4Q0Q1RiwgMHhDRDYxLAorICAgIDB4Q0Q2MiwgMHhDRDYzLCAweENENjUsIDB4Q0Q2NiwgMHhDRDY3LCAweENENjgsIDB4Q0Q2OSwgMHhDRDZBLCAweENENkIsCisgICAgMHhDRDZFLCAweENENzAsIDB4Q0Q3MiwgMHhDRDczLCAweENENzQsIDB4Q0Q3NSwgMHhDRDc2LCAweENENzcsIDB4Q0Q3OSwKKyAgICAweENEN0EsIDB4Q0Q3QiwgMHhDRDdDLCAweENEN0QsIDB4Q0Q3RSwgMHhDRDdGLCAweENEODAsIDB4Q0Q4MSwgMHhDRDgyLAorICAgIDB4Q0Q4MywgMHhDRDg0LCAweENEODUsIDB4Q0Q4NiwgMHhDRDg3LCAweENEODksIDB4Q0Q4QSwgMHhDRDhCLCAweENEOEMsCisgICAgMHhDRDhELCAweENEOEUsIDB4Q0Q4RiwgMHhDRDkwLCAweENEOTEsIDB4Q0Q5MiwgMHhDRDkzLCAweENEOTYsIDB4Q0Q5NywKKyAgICAweENEOTksIDB4Q0Q5QSwgMHhDRDlCLCAweENEOUQsIDB4Q0Q5RSwgMHhDRDlGLCAweENEQTAsIDB4Q0RBMSwgMHhDREEyLAorICAgIDB4Q0RBMywgMHhDREE2LCAweENEQTgsIDB4Q0RBQSwgMHhDREFCLCAweENEQUMsIDB4Q0RBRCwgMHhDREFFLCAweENEQUYsCisgICAgMHhDREIxLCAweENEQjIsIDB4Q0RCMywgMHhDREI0LCAweENEQjUsIDB4Q0RCNiwgMHhDREI3LCAweENEQjgsIDB4Q0RCOSwKKyAgICAweENEQkEsIDB4Q0RCQiwgMHhDREJDLCAweENEQkQsIDB4Q0RCRSwgMHhDREJGLCAweENEQzAsIDB4Q0RDMSwgMHhDREMyLAorICAgIDB4Q0RDMywgMHhDREM1LCAweENEQzYsIDB4Q0RDNywgMHhDREM4LCAweENEQzksIDB4Q0RDQSwgMHhDRENCLCAweENEQ0QsCisgICAgMHhDRENFLCAweENEQ0YsIDB4Q0REMSwgMHhDREQyLCAweENERDMsIDB4Q0RENCwgMHhDREQ1LCAweENERDYsIDB4Q0RENywKKyAgICAweENERDgsIDB4Q0REOSwgMHhDRERBLCAweENEREIsIDB4Q0REQywgMHhDRERELCAweENEREUsIDB4Q0RERiwgMHhDREUwLAorICAgIDB4Q0RFMSwgMHhDREUyLCAweENERTMsIDB4Q0RFNCwgMHhDREU1LCAweENERTYsIDB4Q0RFNywgMHhDREU5LCAweENERUEsCisgICAgMHhDREVCLCAweENERUQsIDB4Q0RFRSwgMHhDREVGLCAweENERjEsIDB4Q0RGMiwgMHhDREYzLCAweENERjQsIDB4Q0RGNSwKKyAgICAweENERjYsIDB4Q0RGNywgMHhDREZBLCAweENERkMsIDB4Q0RGRSwgMHhDREZGLCAweENFMDAsIDB4Q0UwMSwgMHhDRTAyLAorICAgIDB4Q0UwMywgMHhDRTA1LCAweENFMDYsIDB4Q0UwNywgMHhDRTA5LCAweENFMEEsIDB4Q0UwQiwgMHhDRTBELCAweENFMEUsCisgICAgMHhDRTBGLCAweENFMTAsIDB4Q0UxMSwgMHhDRTEyLCAweENFMTMsIDB4Q0UxNSwgMHhDRTE2LCAweENFMTcsIDB4Q0UxOCwKKyAgICAweENFMUEsIDB4Q0UxQiwgMHhDRTFDLCAweENFMUQsIDB4Q0UxRSwgMHhDRTFGLCAweENFMjIsIDB4Q0UyMywgMHhDRTI1LAorICAgIDB4Q0UyNiwgMHhDRTI3LCAweENFMjksIDB4Q0UyQSwgMHhDRTJCLCAweENFMkMsIDB4Q0UyRCwgMHhDRTJFLCAweENFMkYsCisgICAgMHhDRTMyLCAweENFMzQsIDB4Q0UzNiwgMHhDRTM3LCAweENFMzgsIDB4Q0UzOSwgMHhDRTNBLCAweENFM0IsIDB4Q0UzQywKKyAgICAweENFM0QsIDB4Q0UzRSwgMHhDRTNGLCAweENFNDAsIDB4Q0U0MSwgMHhDRTQyLCAweENFNDMsIDB4Q0U0NCwgMHhDRTQ1LAorICAgIDB4Q0U0NiwgMHhDRTQ3LCAweENFNDgsIDB4Q0U0OSwgMHhDRTRBLCAweENFNEIsIDB4Q0U0QywgMHhDRTRELCAweENFNEUsCisgICAgMHhDRTRGLCAweENFNTAsIDB4Q0U1MSwgMHhDRTUyLCAweENFNTMsIDB4Q0U1NCwgMHhDRTU1LCAweENFNTYsIDB4Q0U1NywKKyAgICAweENFNUEsIDB4Q0U1QiwgMHhDRTVELCAweENFNUUsIDB4Q0U2MiwgMHhDRTYzLCAweENFNjQsIDB4Q0U2NSwgMHhDRTY2LAorICAgIDB4Q0U2NywgMHhDRTZBLCAweENFNkMsIDB4Q0U2RSwgMHhDRTZGLCAweENFNzAsIDB4Q0U3MSwgMHhDRTcyLCAweENFNzMsCisgICAgMHhDRTc2LCAweENFNzcsIDB4Q0U3OSwgMHhDRTdBLCAweENFN0IsIDB4Q0U3RCwgMHhDRTdFLCAweENFN0YsIDB4Q0U4MCwKKyAgICAweENFODEsIDB4Q0U4MiwgMHhDRTgzLCAweENFODYsIDB4Q0U4OCwgMHhDRThBLCAweENFOEIsIDB4Q0U4QywgMHhDRThELAorICAgIDB4Q0U4RSwgMHhDRThGLCAweENFOTIsIDB4Q0U5MywgMHhDRTk1LCAweENFOTYsIDB4Q0U5NywgMHhDRTk5LCAweENFOUEsCisgICAgMHhDRTlCLCAweENFOUMsIDB4Q0U5RCwgMHhDRTlFLCAweENFOUYsIDB4Q0VBMiwgMHhDRUE2LCAweENFQTcsIDB4Q0VBOCwKKyAgICAweENFQTksIDB4Q0VBQSwgMHhDRUFCLCAweENFQUUsIDB4Q0VBRiwgMHhDRUIwLCAweENFQjEsIDB4Q0VCMiwgMHhDRUIzLAorICAgIDB4Q0VCNCwgMHhDRUI1LCAweENFQjYsIDB4Q0VCNywgMHhDRUI4LCAweENFQjksIDB4Q0VCQSwgMHhDRUJCLCAweENFQkMsCisgICAgMHhDRUJELCAweENFQkUsIDB4Q0VCRiwgMHhDRUMwLCAweENFQzIsIDB4Q0VDMywgMHhDRUM0LCAweENFQzUsIDB4Q0VDNiwKKyAgICAweENFQzcsIDB4Q0VDOCwgMHhDRUM5LCAweENFQ0EsIDB4Q0VDQiwgMHhDRUNDLCAweENFQ0QsIDB4Q0VDRSwgMHhDRUNGLAorICAgIDB4Q0VEMCwgMHhDRUQxLCAweENFRDIsIDB4Q0VEMywgMHhDRUQ0LCAweENFRDUsIDB4Q0VENiwgMHhDRUQ3LCAweENFRDgsCisgICAgMHhDRUQ5LCAweENFREEsIDB4Q0VEQiwgMHhDRURDLCAweENFREQsIDB4Q0VERSwgMHhDRURGLCAweENFRTAsIDB4Q0VFMSwKKyAgICAweENFRTIsIDB4Q0VFMywgMHhDRUU2LCAweENFRTcsIDB4Q0VFOSwgMHhDRUVBLCAweENFRUQsIDB4Q0VFRSwgMHhDRUVGLAorICAgIDB4Q0VGMCwgMHhDRUYxLCAweENFRjIsIDB4Q0VGMywgMHhDRUY2LCAweENFRkEsIDB4Q0VGQiwgMHhDRUZDLCAweENFRkQsCisgICAgMHhDRUZFLCAweENFRkYsIDB4Q0YwMiwgMHhDRjAzLCAweENGMDUsIDB4Q0YwNiwgMHhDRjA3LCAweENGMDksIDB4Q0YwQSwKKyAgICAweENGMEIsIDB4Q0YwQywgMHhDRjBELCAweENGMEUsIDB4Q0YwRiwgMHhDRjEyLCAweENGMTQsIDB4Q0YxNiwgMHhDRjE3LAorICAgIDB4Q0YxOCwgMHhDRjE5LCAweENGMUEsIDB4Q0YxQiwgMHhDRjFELCAweENGMUUsIDB4Q0YxRiwgMHhDRjIxLCAweENGMjIsCisgICAgMHhDRjIzLCAweENGMjUsIDB4Q0YyNiwgMHhDRjI3LCAweENGMjgsIDB4Q0YyOSwgMHhDRjJBLCAweENGMkIsIDB4Q0YyRSwKKyAgICAweENGMzIsIDB4Q0YzMywgMHhDRjM0LCAweENGMzUsIDB4Q0YzNiwgMHhDRjM3LCAweENGMzksIDB4Q0YzQSwgMHhDRjNCLAorICAgIDB4Q0YzQywgMHhDRjNELCAweENGM0UsIDB4Q0YzRiwgMHhDRjQwLCAweENGNDEsIDB4Q0Y0MiwgMHhDRjQzLCAweENGNDQsCisgICAgMHhDRjQ1LCAweENGNDYsIDB4Q0Y0NywgMHhDRjQ4LCAweENGNDksIDB4Q0Y0QSwgMHhDRjRCLCAweENGNEMsIDB4Q0Y0RCwKKyAgICAweENGNEUsIDB4Q0Y0RiwgMHhDRjUwLCAweENGNTEsIDB4Q0Y1MiwgMHhDRjUzLCAweENGNTYsIDB4Q0Y1NywgMHhDRjU5LAorICAgIDB4Q0Y1QSwgMHhDRjVCLCAweENGNUQsIDB4Q0Y1RSwgMHhDRjVGLCAweENGNjAsIDB4Q0Y2MSwgMHhDRjYyLCAweENGNjMsCisgICAgMHhDRjY2LCAweENGNjgsIDB4Q0Y2QSwgMHhDRjZCLCAweENGNkMsIDB4Q0Y2RCwgMHhDRjZFLCAweENGNkYsIDB4Q0Y3MiwKKyAgICAweENGNzMsIDB4Q0Y3NSwgMHhDRjc2LCAweENGNzcsIDB4Q0Y3OSwgMHhDRjdBLCAweENGN0IsIDB4Q0Y3QywgMHhDRjdELAorICAgIDB4Q0Y3RSwgMHhDRjdGLCAweENGODEsIDB4Q0Y4MiwgMHhDRjgzLCAweENGODQsIDB4Q0Y4NiwgMHhDRjg3LCAweENGODgsCisgICAgMHhDRjg5LCAweENGOEEsIDB4Q0Y4QiwgMHhDRjhELCAweENGOEUsIDB4Q0Y4RiwgMHhDRjkwLCAweENGOTEsIDB4Q0Y5MiwKKyAgICAweENGOTMsIDB4Q0Y5NCwgMHhDRjk1LCAweENGOTYsIDB4Q0Y5NywgMHhDRjk4LCAweENGOTksIDB4Q0Y5QSwgMHhDRjlCLAorICAgIDB4Q0Y5QywgMHhDRjlELCAweENGOUUsIDB4Q0Y5RiwgMHhDRkEwLCAweENGQTIsIDB4Q0ZBMywgMHhDRkE0LCAweENGQTUsCisgICAgMHhDRkE2LCAweENGQTcsIDB4Q0ZBOSwgMHhDRkFBLCAweENGQUIsIDB4Q0ZBQywgMHhDRkFELCAweENGQUUsIDB4Q0ZBRiwKKyAgICAweENGQjEsIDB4Q0ZCMiwgMHhDRkIzLCAweENGQjQsIDB4Q0ZCNSwgMHhDRkI2LCAweENGQjcsIDB4Q0ZCOCwgMHhDRkI5LAorICAgIDB4Q0ZCQSwgMHhDRkJCLCAweENGQkMsIDB4Q0ZCRCwgMHhDRkJFLCAweENGQkYsIDB4Q0ZDMCwgMHhDRkMxLCAweENGQzIsCisgICAgMHhDRkMzLCAweENGQzUsIDB4Q0ZDNiwgMHhDRkM3LCAweENGQzgsIDB4Q0ZDOSwgMHhDRkNBLCAweENGQ0IsIDB4Q0ZDQywKKyAgICAweENGQ0QsIDB4Q0ZDRSwgMHhDRkNGLCAweENGRDAsIDB4Q0ZEMSwgMHhDRkQyLCAweENGRDMsIDB4Q0ZENCwgMHhDRkQ1LAorICAgIDB4Q0ZENiwgMHhDRkQ3LCAweENGRDgsIDB4Q0ZEOSwgMHhDRkRBLCAweENGREIsIDB4Q0ZEQywgMHhDRkRELCAweENGREUsCisgICAgMHhDRkRGLCAweENGRTIsIDB4Q0ZFMywgMHhDRkU1LCAweENGRTYsIDB4Q0ZFNywgMHhDRkU5LCAweENGRUEsIDB4Q0ZFQiwKKyAgICAweENGRUMsIDB4Q0ZFRCwgMHhDRkVFLCAweENGRUYsIDB4Q0ZGMiwgMHhDRkY0LCAweENGRjYsIDB4Q0ZGNywgMHhDRkY4LAorICAgIDB4Q0ZGOSwgMHhDRkZBLCAweENGRkIsIDB4Q0ZGRCwgMHhDRkZFLCAweENGRkYsIDB4RDAwMSwgMHhEMDAyLCAweEQwMDMsCisgICAgMHhEMDA1LCAweEQwMDYsIDB4RDAwNywgMHhEMDA4LCAweEQwMDksIDB4RDAwQSwgMHhEMDBCLCAweEQwMEMsIDB4RDAwRCwKKyAgICAweEQwMEUsIDB4RDAwRiwgMHhEMDEwLCAweEQwMTIsIDB4RDAxMywgMHhEMDE0LCAweEQwMTUsIDB4RDAxNiwgMHhEMDE3LAorICAgIDB4RDAxOSwgMHhEMDFBLCAweEQwMUIsIDB4RDAxQywgMHhEMDFELCAweEQwMUUsIDB4RDAxRiwgMHhEMDIwLCAweEQwMjEsCisgICAgMHhEMDIyLCAweEQwMjMsIDB4RDAyNCwgMHhEMDI1LCAweEQwMjYsIDB4RDAyNywgMHhEMDI4LCAweEQwMjksIDB4RDAyQSwKKyAgICAweEQwMkIsIDB4RDAyQywgMHhEMDJFLCAweEQwMkYsIDB4RDAzMCwgMHhEMDMxLCAweEQwMzIsIDB4RDAzMywgMHhEMDM2LAorICAgIDB4RDAzNywgMHhEMDM5LCAweEQwM0EsIDB4RDAzQiwgMHhEMDNELCAweEQwM0UsIDB4RDAzRiwgMHhEMDQwLCAweEQwNDEsCisgICAgMHhEMDQyLCAweEQwNDMsIDB4RDA0NiwgMHhEMDQ4LCAweEQwNEEsIDB4RDA0QiwgMHhEMDRDLCAweEQwNEQsIDB4RDA0RSwKKyAgICAweEQwNEYsIDB4RDA1MSwgMHhEMDUyLCAweEQwNTMsIDB4RDA1NSwgMHhEMDU2LCAweEQwNTcsIDB4RDA1OSwgMHhEMDVBLAorICAgIDB4RDA1QiwgMHhEMDVDLCAweEQwNUQsIDB4RDA1RSwgMHhEMDVGLCAweEQwNjEsIDB4RDA2MiwgMHhEMDYzLCAweEQwNjQsCisgICAgMHhEMDY1LCAweEQwNjYsIDB4RDA2NywgMHhEMDY4LCAweEQwNjksIDB4RDA2QSwgMHhEMDZCLCAweEQwNkUsIDB4RDA2RiwKKyAgICAweEQwNzEsIDB4RDA3MiwgMHhEMDczLCAweEQwNzUsIDB4RDA3NiwgMHhEMDc3LCAweEQwNzgsIDB4RDA3OSwgMHhEMDdBLAorICAgIDB4RDA3QiwgMHhEMDdFLCAweEQwN0YsIDB4RDA4MCwgMHhEMDgyLCAweEQwODMsIDB4RDA4NCwgMHhEMDg1LCAweEQwODYsCisgICAgMHhEMDg3LCAweEQwODgsIDB4RDA4OSwgMHhEMDhBLCAweEQwOEIsIDB4RDA4QywgMHhEMDhELCAweEQwOEUsIDB4RDA4RiwKKyAgICAweEQwOTAsIDB4RDA5MSwgMHhEMDkyLCAweEQwOTMsIDB4RDA5NCwgMHhEMDk1LCAweEQwOTYsIDB4RDA5NywgMHhEMDk4LAorICAgIDB4RDA5OSwgMHhEMDlBLCAweEQwOUIsIDB4RDA5QywgMHhEMDlELCAweEQwOUUsIDB4RDA5RiwgMHhEMEEwLCAweEQwQTEsCisgICAgMHhEMEEyLCAweEQwQTMsIDB4RDBBNiwgMHhEMEE3LCAweEQwQTksIDB4RDBBQSwgMHhEMEFCLCAweEQwQUQsIDB4RDBBRSwKKyAgICAweEQwQUYsIDB4RDBCMCwgMHhEMEIxLCAweEQwQjIsIDB4RDBCMywgMHhEMEI2LCAweEQwQjgsIDB4RDBCQSwgMHhEMEJCLAorICAgIDB4RDBCQywgMHhEMEJELCAweEQwQkUsIDB4RDBCRiwgMHhEMEMyLCAweEQwQzMsIDB4RDBDNSwgMHhEMEM2LCAweEQwQzcsCisgICAgMHhEMENBLCAweEQwQ0IsIDB4RDBDQywgMHhEMENELCAweEQwQ0UsIDB4RDBDRiwgMHhEMEQyLCAweEQwRDYsIDB4RDBENywKKyAgICAweEQwRDgsIDB4RDBEOSwgMHhEMERBLCAweEQwREIsIDB4RDBERSwgMHhEMERGLCAweEQwRTEsIDB4RDBFMiwgMHhEMEUzLAorICAgIDB4RDBFNSwgMHhEMEU2LCAweEQwRTcsIDB4RDBFOCwgMHhEMEU5LCAweEQwRUEsIDB4RDBFQiwgMHhEMEVFLCAweEQwRjIsCisgICAgMHhEMEYzLCAweEQwRjQsIDB4RDBGNSwgMHhEMEY2LCAweEQwRjcsIDB4RDBGOSwgMHhEMEZBLCAweEQwRkIsIDB4RDBGQywKKyAgICAweEQwRkQsIDB4RDBGRSwgMHhEMEZGLCAweEQxMDAsIDB4RDEwMSwgMHhEMTAyLCAweEQxMDMsIDB4RDEwNCwgMHhEMTA1LAorICAgIDB4RDEwNiwgMHhEMTA3LCAweEQxMDgsIDB4RDEwOSwgMHhEMTBBLCAweEQxMEIsIDB4RDEwQywgMHhEMTBFLCAweEQxMEYsCisgICAgMHhEMTEwLCAweEQxMTEsIDB4RDExMiwgMHhEMTEzLCAweEQxMTQsIDB4RDExNSwgMHhEMTE2LCAweEQxMTcsIDB4RDExOCwKKyAgICAweEQxMTksIDB4RDExQSwgMHhEMTFCLCAweEQxMUMsIDB4RDExRCwgMHhEMTFFLCAweEQxMUYsIDB4RDEyMCwgMHhEMTIxLAorICAgIDB4RDEyMiwgMHhEMTIzLCAweEQxMjQsIDB4RDEyNSwgMHhEMTI2LCAweEQxMjcsIDB4RDEyOCwgMHhEMTI5LCAweEQxMkEsCisgICAgMHhEMTJCLCAweEQxMkMsIDB4RDEyRCwgMHhEMTJFLCAweEQxMkYsIDB4RDEzMiwgMHhEMTMzLCAweEQxMzUsIDB4RDEzNiwKKyAgICAweEQxMzcsIDB4RDEzOSwgMHhEMTNCLCAweEQxM0MsIDB4RDEzRCwgMHhEMTNFLCAweEQxM0YsIDB4RDE0MiwgMHhEMTQ2LAorICAgIDB4RDE0NywgMHhEMTQ4LCAweEQxNDksIDB4RDE0QSwgMHhEMTRCLCAweEQxNEUsIDB4RDE0RiwgMHhEMTUxLCAweEQxNTIsCisgICAgMHhEMTUzLCAweEQxNTUsIDB4RDE1NiwgMHhEMTU3LCAweEQxNTgsIDB4RDE1OSwgMHhEMTVBLCAweEQxNUIsIDB4RDE1RSwKKyAgICAweEQxNjAsIDB4RDE2MiwgMHhEMTYzLCAweEQxNjQsIDB4RDE2NSwgMHhEMTY2LCAweEQxNjcsIDB4RDE2OSwgMHhEMTZBLAorICAgIDB4RDE2QiwgMHhEMTZELCAweEQxNkUsIDB4RDE2RiwgMHhEMTcwLCAweEQxNzEsIDB4RDE3MiwgMHhEMTczLCAweEQxNzQsCisgICAgMHhEMTc1LCAweEQxNzYsIDB4RDE3NywgMHhEMTc4LCAweEQxNzksIDB4RDE3QSwgMHhEMTdCLCAweEQxN0QsIDB4RDE3RSwKKyAgICAweEQxN0YsIDB4RDE4MCwgMHhEMTgxLCAweEQxODIsIDB4RDE4MywgMHhEMTg1LCAweEQxODYsIDB4RDE4NywgMHhEMTg5LAorICAgIDB4RDE4QSwgMHhEMThCLCAweEQxOEMsIDB4RDE4RCwgMHhEMThFLCAweEQxOEYsIDB4RDE5MCwgMHhEMTkxLCAweEQxOTIsCisgICAgMHhEMTkzLCAweEQxOTQsIDB4RDE5NSwgMHhEMTk2LCAweEQxOTcsIDB4RDE5OCwgMHhEMTk5LCAweEQxOUEsIDB4RDE5QiwKKyAgICAweEQxOUMsIDB4RDE5RCwgMHhEMTlFLCAweEQxOUYsIDB4RDFBMiwgMHhEMUEzLCAweEQxQTUsIDB4RDFBNiwgMHhEMUE3LAorICAgIDB4RDFBOSwgMHhEMUFBLCAweEQxQUIsIDB4RDFBQywgMHhEMUFELCAweEQxQUUsIDB4RDFBRiwgMHhEMUIyLCAweEQxQjQsCisgICAgMHhEMUI2LCAweEQxQjcsIDB4RDFCOCwgMHhEMUI5LCAweEQxQkIsIDB4RDFCRCwgMHhEMUJFLCAweEQxQkYsIDB4RDFDMSwKKyAgICAweEQxQzIsIDB4RDFDMywgMHhEMUM0LCAweEQxQzUsIDB4RDFDNiwgMHhEMUM3LCAweEQxQzgsIDB4RDFDOSwgMHhEMUNBLAorICAgIDB4RDFDQiwgMHhEMUNDLCAweEQxQ0QsIDB4RDFDRSwgMHhEMUNGLCAweEQxRDAsIDB4RDFEMSwgMHhEMUQyLCAweEQxRDMsCisgICAgMHhEMUQ0LCAweEQxRDUsIDB4RDFENiwgMHhEMUQ3LCAweEQxRDksIDB4RDFEQSwgMHhEMURCLCAweEQxREMsIDB4RDFERCwKKyAgICAweEQxREUsIDB4RDFERiwgMHhEMUUwLCAweEQxRTEsIDB4RDFFMiwgMHhEMUUzLCAweEQxRTQsIDB4RDFFNSwgMHhEMUU2LAorICAgIDB4RDFFNywgMHhEMUU4LCAweEQxRTksIDB4RDFFQSwgMHhEMUVCLCAweEQxRUMsIDB4RDFFRCwgMHhEMUVFLCAweEQxRUYsCisgICAgMHhEMUYwLCAweEQxRjEsIDB4RDFGMiwgMHhEMUYzLCAweEQxRjUsIDB4RDFGNiwgMHhEMUY3LCAweEQxRjksIDB4RDFGQSwKKyAgICAweEQxRkIsIDB4RDFGQywgMHhEMUZELCAweEQxRkUsIDB4RDFGRiwgMHhEMjAwLCAweEQyMDEsIDB4RDIwMiwgMHhEMjAzLAorICAgIDB4RDIwNCwgMHhEMjA1LCAweEQyMDYsIDB4RDIwOCwgMHhEMjBBLCAweEQyMEIsIDB4RDIwQywgMHhEMjBELCAweEQyMEUsCisgICAgMHhEMjBGLCAweEQyMTEsIDB4RDIxMiwgMHhEMjEzLCAweEQyMTQsIDB4RDIxNSwgMHhEMjE2LCAweEQyMTcsIDB4RDIxOCwKKyAgICAweEQyMTksIDB4RDIxQSwgMHhEMjFCLCAweEQyMUMsIDB4RDIxRCwgMHhEMjFFLCAweEQyMUYsIDB4RDIyMCwgMHhEMjIxLAorICAgIDB4RDIyMiwgMHhEMjIzLCAweEQyMjQsIDB4RDIyNSwgMHhEMjI2LCAweEQyMjcsIDB4RDIyOCwgMHhEMjI5LCAweEQyMkEsCisgICAgMHhEMjJCLCAweEQyMkUsIDB4RDIyRiwgMHhEMjMxLCAweEQyMzIsIDB4RDIzMywgMHhEMjM1LCAweEQyMzYsIDB4RDIzNywKKyAgICAweEQyMzgsIDB4RDIzOSwgMHhEMjNBLCAweEQyM0IsIDB4RDIzRSwgMHhEMjQwLCAweEQyNDIsIDB4RDI0MywgMHhEMjQ0LAorICAgIDB4RDI0NSwgMHhEMjQ2LCAweEQyNDcsIDB4RDI0OSwgMHhEMjRBLCAweEQyNEIsIDB4RDI0QywgMHhEMjRELCAweEQyNEUsCisgICAgMHhEMjRGLCAweEQyNTAsIDB4RDI1MSwgMHhEMjUyLCAweEQyNTMsIDB4RDI1NCwgMHhEMjU1LCAweEQyNTYsIDB4RDI1NywKKyAgICAweEQyNTgsIDB4RDI1OSwgMHhEMjVBLCAweEQyNUIsIDB4RDI1RCwgMHhEMjVFLCAweEQyNUYsIDB4RDI2MCwgMHhEMjYxLAorICAgIDB4RDI2MiwgMHhEMjYzLCAweEQyNjUsIDB4RDI2NiwgMHhEMjY3LCAweEQyNjgsIDB4RDI2OSwgMHhEMjZBLCAweEQyNkIsCisgICAgMHhEMjZDLCAweEQyNkQsIDB4RDI2RSwgMHhEMjZGLCAweEQyNzAsIDB4RDI3MSwgMHhEMjcyLCAweEQyNzMsIDB4RDI3NCwKKyAgICAweEQyNzUsIDB4RDI3NiwgMHhEMjc3LCAweEQyNzgsIDB4RDI3OSwgMHhEMjdBLCAweEQyN0IsIDB4RDI3QywgMHhEMjdELAorICAgIDB4RDI3RSwgMHhEMjdGLCAweEQyODIsIDB4RDI4MywgMHhEMjg1LCAweEQyODYsIDB4RDI4NywgMHhEMjg5LCAweEQyOEEsCisgICAgMHhEMjhCLCAweEQyOEMsIDB4RDI4RCwgMHhEMjhFLCAweEQyOEYsIDB4RDI5MiwgMHhEMjkzLCAweEQyOTQsIDB4RDI5NiwKKyAgICAweEQyOTcsIDB4RDI5OCwgMHhEMjk5LCAweEQyOUEsIDB4RDI5QiwgMHhEMjlELCAweEQyOUUsIDB4RDI5RiwgMHhEMkExLAorICAgIDB4RDJBMiwgMHhEMkEzLCAweEQyQTUsIDB4RDJBNiwgMHhEMkE3LCAweEQyQTgsIDB4RDJBOSwgMHhEMkFBLCAweEQyQUIsCisgICAgMHhEMkFELCAweEQyQUUsIDB4RDJBRiwgMHhEMkIwLCAweEQyQjIsIDB4RDJCMywgMHhEMkI0LCAweEQyQjUsIDB4RDJCNiwKKyAgICAweEQyQjcsIDB4RDJCQSwgMHhEMkJCLCAweEQyQkQsIDB4RDJCRSwgMHhEMkMxLCAweEQyQzMsIDB4RDJDNCwgMHhEMkM1LAorICAgIDB4RDJDNiwgMHhEMkM3LCAweEQyQ0EsIDB4RDJDQywgMHhEMkNELCAweEQyQ0UsIDB4RDJDRiwgMHhEMkQwLCAweEQyRDEsCisgICAgMHhEMkQyLCAweEQyRDMsIDB4RDJENSwgMHhEMkQ2LCAweEQyRDcsIDB4RDJEOSwgMHhEMkRBLCAweEQyREIsIDB4RDJERCwKKyAgICAweEQyREUsIDB4RDJERiwgMHhEMkUwLCAweEQyRTEsIDB4RDJFMiwgMHhEMkUzLCAweEQyRTYsIDB4RDJFNywgMHhEMkU4LAorICAgIDB4RDJFOSwgMHhEMkVBLCAweEQyRUIsIDB4RDJFQywgMHhEMkVELCAweEQyRUUsIDB4RDJFRiwgMHhEMkYyLCAweEQyRjMsCisgICAgMHhEMkY1LCAweEQyRjYsIDB4RDJGNywgMHhEMkY5LCAweEQyRkEsIDB4RDJGQiwgMHhEMkZDLCAweEQyRkQsIDB4RDJGRSwKKyAgICAweEQyRkYsIDB4RDMwMiwgMHhEMzA0LCAweEQzMDYsIDB4RDMwNywgMHhEMzA4LCAweEQzMDksIDB4RDMwQSwgMHhEMzBCLAorICAgIDB4RDMwRiwgMHhEMzExLCAweEQzMTIsIDB4RDMxMywgMHhEMzE1LCAweEQzMTcsIDB4RDMxOCwgMHhEMzE5LCAweEQzMUEsCisgICAgMHhEMzFCLCAweEQzMUUsIDB4RDMyMiwgMHhEMzIzLCAweEQzMjQsIDB4RDMyNiwgMHhEMzI3LCAweEQzMkEsIDB4RDMyQiwKKyAgICAweEQzMkQsIDB4RDMyRSwgMHhEMzJGLCAweEQzMzEsIDB4RDMzMiwgMHhEMzMzLCAweEQzMzQsIDB4RDMzNSwgMHhEMzM2LAorICAgIDB4RDMzNywgMHhEMzNBLCAweEQzM0UsIDB4RDMzRiwgMHhEMzQwLCAweEQzNDEsIDB4RDM0MiwgMHhEMzQzLCAweEQzNDYsCisgICAgMHhEMzQ3LCAweEQzNDgsIDB4RDM0OSwgMHhEMzRBLCAweEQzNEIsIDB4RDM0QywgMHhEMzRELCAweEQzNEUsIDB4RDM0RiwKKyAgICAweEQzNTAsIDB4RDM1MSwgMHhEMzUyLCAweEQzNTMsIDB4RDM1NCwgMHhEMzU1LCAweEQzNTYsIDB4RDM1NywgMHhEMzU4LAorICAgIDB4RDM1OSwgMHhEMzVBLCAweEQzNUIsIDB4RDM1QywgMHhEMzVELCAweEQzNUUsIDB4RDM1RiwgMHhEMzYwLCAweEQzNjEsCisgICAgMHhEMzYyLCAweEQzNjMsIDB4RDM2NCwgMHhEMzY1LCAweEQzNjYsIDB4RDM2NywgMHhEMzY4LCAweEQzNjksIDB4RDM2QSwKKyAgICAweEQzNkIsIDB4RDM2QywgMHhEMzZELCAweEQzNkUsIDB4RDM2RiwgMHhEMzcwLCAweEQzNzEsIDB4RDM3MiwgMHhEMzczLAorICAgIDB4RDM3NCwgMHhEMzc1LCAweEQzNzYsIDB4RDM3NywgMHhEMzc4LCAweEQzNzksIDB4RDM3QSwgMHhEMzdCLCAweEQzN0UsCisgICAgMHhEMzdGLCAweEQzODEsIDB4RDM4MiwgMHhEMzgzLCAweEQzODUsIDB4RDM4NiwgMHhEMzg3LCAweEQzODgsIDB4RDM4OSwKKyAgICAweEQzOEEsIDB4RDM4QiwgMHhEMzhFLCAweEQzOTIsIDB4RDM5MywgMHhEMzk0LCAweEQzOTUsIDB4RDM5NiwgMHhEMzk3LAorICAgIDB4RDM5QSwgMHhEMzlCLCAweEQzOUQsIDB4RDM5RSwgMHhEMzlGLCAweEQzQTEsIDB4RDNBMiwgMHhEM0EzLCAweEQzQTQsCisgICAgMHhEM0E1LCAweEQzQTYsIDB4RDNBNywgMHhEM0FBLCAweEQzQUMsIDB4RDNBRSwgMHhEM0FGLCAweEQzQjAsIDB4RDNCMSwKKyAgICAweEQzQjIsIDB4RDNCMywgMHhEM0I1LCAweEQzQjYsIDB4RDNCNywgMHhEM0I5LCAweEQzQkEsIDB4RDNCQiwgMHhEM0JELAorICAgIDB4RDNCRSwgMHhEM0JGLCAweEQzQzAsIDB4RDNDMSwgMHhEM0MyLCAweEQzQzMsIDB4RDNDNiwgMHhEM0M3LCAweEQzQ0EsCisgICAgMHhEM0NCLCAweEQzQ0MsIDB4RDNDRCwgMHhEM0NFLCAweEQzQ0YsIDB4RDNEMSwgMHhEM0QyLCAweEQzRDMsIDB4RDNENCwKKyAgICAweEQzRDUsIDB4RDNENiwgMHhEM0Q3LCAweEQzRDksIDB4RDNEQSwgMHhEM0RCLCAweEQzREMsIDB4RDNERCwgMHhEM0RFLAorICAgIDB4RDNERiwgMHhEM0UwLCAweEQzRTIsIDB4RDNFNCwgMHhEM0U1LCAweEQzRTYsIDB4RDNFNywgMHhEM0U4LCAweEQzRTksCisgICAgMHhEM0VBLCAweEQzRUIsIDB4RDNFRSwgMHhEM0VGLCAweEQzRjEsIDB4RDNGMiwgMHhEM0YzLCAweEQzRjUsIDB4RDNGNiwKKyAgICAweEQzRjcsIDB4RDNGOCwgMHhEM0Y5LCAweEQzRkEsIDB4RDNGQiwgMHhEM0ZFLCAweEQ0MDAsIDB4RDQwMiwgMHhENDAzLAorICAgIDB4RDQwNCwgMHhENDA1LCAweEQ0MDYsIDB4RDQwNywgMHhENDA5LCAweEQ0MEEsIDB4RDQwQiwgMHhENDBDLCAweEQ0MEQsCisgICAgMHhENDBFLCAweEQ0MEYsIDB4RDQxMCwgMHhENDExLCAweEQ0MTIsIDB4RDQxMywgMHhENDE0LCAweEQ0MTUsIDB4RDQxNiwKKyAgICAweEQ0MTcsIDB4RDQxOCwgMHhENDE5LCAweEQ0MUEsIDB4RDQxQiwgMHhENDFDLCAweEQ0MUUsIDB4RDQxRiwgMHhENDIwLAorICAgIDB4RDQyMSwgMHhENDIyLCAweEQ0MjMsIDB4RDQyNCwgMHhENDI1LCAweEQ0MjYsIDB4RDQyNywgMHhENDI4LCAweEQ0MjksCisgICAgMHhENDJBLCAweEQ0MkIsIDB4RDQyQywgMHhENDJELCAweEQ0MkUsIDB4RDQyRiwgMHhENDMwLCAweEQ0MzEsIDB4RDQzMiwKKyAgICAweEQ0MzMsIDB4RDQzNCwgMHhENDM1LCAweEQ0MzYsIDB4RDQzNywgMHhENDM4LCAweEQ0MzksIDB4RDQzQSwgMHhENDNCLAorICAgIDB4RDQzQywgMHhENDNELCAweEQ0M0UsIDB4RDQzRiwgMHhENDQxLCAweEQ0NDIsIDB4RDQ0MywgMHhENDQ1LCAweEQ0NDYsCisgICAgMHhENDQ3LCAweEQ0NDgsIDB4RDQ0OSwgMHhENDRBLCAweEQ0NEIsIDB4RDQ0QywgMHhENDRELCAweEQ0NEUsIDB4RDQ0RiwKKyAgICAweEQ0NTAsIDB4RDQ1MSwgMHhENDUyLCAweEQ0NTMsIDB4RDQ1NCwgMHhENDU1LCAweEQ0NTYsIDB4RDQ1NywgMHhENDU4LAorICAgIDB4RDQ1OSwgMHhENDVBLCAweEQ0NUIsIDB4RDQ1RCwgMHhENDVFLCAweEQ0NUYsIDB4RDQ2MSwgMHhENDYyLCAweEQ0NjMsCisgICAgMHhENDY1LCAweEQ0NjYsIDB4RDQ2NywgMHhENDY4LCAweEQ0NjksIDB4RDQ2QSwgMHhENDZCLCAweEQ0NkMsIDB4RDQ2RSwKKyAgICAweEQ0NzAsIDB4RDQ3MSwgMHhENDcyLCAweEQ0NzMsIDB4RDQ3NCwgMHhENDc1LCAweEQ0NzYsIDB4RDQ3NywgMHhENDdBLAorICAgIDB4RDQ3QiwgMHhENDdELCAweEQ0N0UsIDB4RDQ4MSwgMHhENDgzLCAweEQ0ODQsIDB4RDQ4NSwgMHhENDg2LCAweEQ0ODcsCisgICAgMHhENDhBLCAweEQ0OEMsIDB4RDQ4RSwgMHhENDhGLCAweEQ0OTAsIDB4RDQ5MSwgMHhENDkyLCAweEQ0OTMsIDB4RDQ5NSwKKyAgICAweEQ0OTYsIDB4RDQ5NywgMHhENDk4LCAweEQ0OTksIDB4RDQ5QSwgMHhENDlCLCAweEQ0OUMsIDB4RDQ5RCwgMHhENDlFLAorICAgIDB4RDQ5RiwgMHhENEEwLCAweEQ0QTEsIDB4RDRBMiwgMHhENEEzLCAweEQ0QTQsIDB4RDRBNSwgMHhENEE2LCAweEQ0QTcsCisgICAgMHhENEE4LCAweEQ0QUEsIDB4RDRBQiwgMHhENEFDLCAweEQ0QUQsIDB4RDRBRSwgMHhENEFGLCAweEQ0QjAsIDB4RDRCMSwKKyAgICAweEQ0QjIsIDB4RDRCMywgMHhENEI0LCAweEQ0QjUsIDB4RDRCNiwgMHhENEI3LCAweEQ0QjgsIDB4RDRCOSwgMHhENEJBLAorICAgIDB4RDRCQiwgMHhENEJDLCAweEQ0QkQsIDB4RDRCRSwgMHhENEJGLCAweEQ0QzAsIDB4RDRDMSwgMHhENEMyLCAweEQ0QzMsCisgICAgMHhENEM0LCAweEQ0QzUsIDB4RDRDNiwgMHhENEM3LCAweEQ0QzgsIDB4RDRDOSwgMHhENENBLCAweEQ0Q0IsIDB4RDRDRCwKKyAgICAweEQ0Q0UsIDB4RDRDRiwgMHhENEQxLCAweEQ0RDIsIDB4RDREMywgMHhENEQ1LCAweEQ0RDYsIDB4RDRENywgMHhENEQ4LAorICAgIDB4RDREOSwgMHhENERBLCAweEQ0REIsIDB4RDRERCwgMHhENERFLCAweEQ0RTAsIDB4RDRFMSwgMHhENEUyLCAweEQ0RTMsCisgICAgMHhENEU0LCAweEQ0RTUsIDB4RDRFNiwgMHhENEU3LCAweEQ0RTksIDB4RDRFQSwgMHhENEVCLCAweEQ0RUQsIDB4RDRFRSwKKyAgICAweEQ0RUYsIDB4RDRGMSwgMHhENEYyLCAweEQ0RjMsIDB4RDRGNCwgMHhENEY1LCAweEQ0RjYsIDB4RDRGNywgMHhENEY5LAorICAgIDB4RDRGQSwgMHhENEZDLCAweEQ0RkUsIDB4RDRGRiwgMHhENTAwLCAweEQ1MDEsIDB4RDUwMiwgMHhENTAzLCAweEQ1MDUsCisgICAgMHhENTA2LCAweEQ1MDcsIDB4RDUwOSwgMHhENTBBLCAweEQ1MEIsIDB4RDUwRCwgMHhENTBFLCAweEQ1MEYsIDB4RDUxMCwKKyAgICAweEQ1MTEsIDB4RDUxMiwgMHhENTEzLCAweEQ1MTYsIDB4RDUxOCwgMHhENTE5LCAweEQ1MUEsIDB4RDUxQiwgMHhENTFDLAorICAgIDB4RDUxRCwgMHhENTFFLCAweEQ1MUYsIDB4RDUyMCwgMHhENTIxLCAweEQ1MjIsIDB4RDUyMywgMHhENTI0LCAweEQ1MjUsCisgICAgMHhENTI2LCAweEQ1MjcsIDB4RDUyOCwgMHhENTI5LCAweEQ1MkEsIDB4RDUyQiwgMHhENTJDLCAweEQ1MkQsIDB4RDUyRSwKKyAgICAweEQ1MkYsIDB4RDUzMCwgMHhENTMxLCAweEQ1MzIsIDB4RDUzMywgMHhENTM0LCAweEQ1MzUsIDB4RDUzNiwgMHhENTM3LAorICAgIDB4RDUzOCwgMHhENTM5LCAweEQ1M0EsIDB4RDUzQiwgMHhENTNFLCAweEQ1M0YsIDB4RDU0MSwgMHhENTQyLCAweEQ1NDMsCisgICAgMHhENTQ1LCAweEQ1NDYsIDB4RDU0NywgMHhENTQ4LCAweEQ1NDksIDB4RDU0QSwgMHhENTRCLCAweEQ1NEUsIDB4RDU1MCwKKyAgICAweEQ1NTIsIDB4RDU1MywgMHhENTU0LCAweEQ1NTUsIDB4RDU1NiwgMHhENTU3LCAweEQ1NUEsIDB4RDU1QiwgMHhENTVELAorICAgIDB4RDU1RSwgMHhENTVGLCAweEQ1NjEsIDB4RDU2MiwgMHhENTYzLCAweEQ1NjQsIDB4RDU2NiwgMHhENTY3LCAweEQ1NkEsCisgICAgMHhENTZDLCAweEQ1NkUsIDB4RDU2RiwgMHhENTcwLCAweEQ1NzEsIDB4RDU3MiwgMHhENTczLCAweEQ1NzYsIDB4RDU3NywKKyAgICAweEQ1NzksIDB4RDU3QSwgMHhENTdCLCAweEQ1N0QsIDB4RDU3RSwgMHhENTdGLCAweEQ1ODAsIDB4RDU4MSwgMHhENTgyLAorICAgIDB4RDU4MywgMHhENTg2LCAweEQ1OEEsIDB4RDU4QiwgMHhENThDLCAweEQ1OEQsIDB4RDU4RSwgMHhENThGLCAweEQ1OTEsCisgICAgMHhENTkyLCAweEQ1OTMsIDB4RDU5NCwgMHhENTk1LCAweEQ1OTYsIDB4RDU5NywgMHhENTk4LCAweEQ1OTksIDB4RDU5QSwKKyAgICAweEQ1OUIsIDB4RDU5QywgMHhENTlELCAweEQ1OUUsIDB4RDU5RiwgMHhENUEwLCAweEQ1QTEsIDB4RDVBMiwgMHhENUEzLAorICAgIDB4RDVBNCwgMHhENUE2LCAweEQ1QTcsIDB4RDVBOCwgMHhENUE5LCAweEQ1QUEsIDB4RDVBQiwgMHhENUFDLCAweEQ1QUQsCisgICAgMHhENUFFLCAweEQ1QUYsIDB4RDVCMCwgMHhENUIxLCAweEQ1QjIsIDB4RDVCMywgMHhENUI0LCAweEQ1QjUsIDB4RDVCNiwKKyAgICAweEQ1QjcsIDB4RDVCOCwgMHhENUI5LCAweEQ1QkEsIDB4RDVCQiwgMHhENUJDLCAweEQ1QkQsIDB4RDVCRSwgMHhENUJGLAorICAgIDB4RDVDMCwgMHhENUMxLCAweEQ1QzIsIDB4RDVDMywgMHhENUM0LCAweEQ1QzUsIDB4RDVDNiwgMHhENUM3LCAweEQ1Q0EsCisgICAgMHhENUNCLCAweEQ1Q0QsIDB4RDVDRSwgMHhENUNGLCAweEQ1RDEsIDB4RDVEMywgMHhENUQ0LCAweEQ1RDUsIDB4RDVENiwKKyAgICAweEQ1RDcsIDB4RDVEQSwgMHhENURDLCAweEQ1REUsIDB4RDVERiwgMHhENUUwLCAweEQ1RTEsIDB4RDVFMiwgMHhENUUzLAorICAgIDB4RDVFNiwgMHhENUU3LCAweEQ1RTksIDB4RDVFQSwgMHhENUVCLCAweEQ1RUQsIDB4RDVFRSwgMHhENUVGLCAweEQ1RjAsCisgICAgMHhENUYxLCAweEQ1RjIsIDB4RDVGMywgMHhENUY2LCAweEQ1RjgsIDB4RDVGQSwgMHhENUZCLCAweEQ1RkMsIDB4RDVGRCwKKyAgICAweEQ1RkUsIDB4RDVGRiwgMHhENjAyLCAweEQ2MDMsIDB4RDYwNSwgMHhENjA2LCAweEQ2MDcsIDB4RDYwOSwgMHhENjBBLAorICAgIDB4RDYwQiwgMHhENjBDLCAweEQ2MEQsIDB4RDYwRSwgMHhENjBGLCAweEQ2MTIsIDB4RDYxNiwgMHhENjE3LCAweEQ2MTgsCisgICAgMHhENjE5LCAweEQ2MUEsIDB4RDYxQiwgMHhENjFELCAweEQ2MUUsIDB4RDYxRiwgMHhENjIxLCAweEQ2MjIsIDB4RDYyMywKKyAgICAweEQ2MjUsIDB4RDYyNiwgMHhENjI3LCAweEQ2MjgsIDB4RDYyOSwgMHhENjJBLCAweEQ2MkIsIDB4RDYyQywgMHhENjJFLAorICAgIDB4RDYyRiwgMHhENjMwLCAweEQ2MzEsIDB4RDYzMiwgMHhENjMzLCAweEQ2MzQsIDB4RDYzNSwgMHhENjM2LCAweEQ2MzcsCisgICAgMHhENjNBLCAweEQ2M0IsIDB4RDYzRCwgMHhENjNFLCAweEQ2M0YsIDB4RDY0MSwgMHhENjQyLCAweEQ2NDMsIDB4RDY0NCwKKyAgICAweEQ2NDYsIDB4RDY0NywgMHhENjRBLCAweEQ2NEMsIDB4RDY0RSwgMHhENjRGLCAweEQ2NTAsIDB4RDY1MiwgMHhENjUzLAorICAgIDB4RDY1NiwgMHhENjU3LCAweEQ2NTksIDB4RDY1QSwgMHhENjVCLCAweEQ2NUQsIDB4RDY1RSwgMHhENjVGLCAweEQ2NjAsCisgICAgMHhENjYxLCAweEQ2NjIsIDB4RDY2MywgMHhENjY0LCAweEQ2NjUsIDB4RDY2NiwgMHhENjY4LCAweEQ2NkEsIDB4RDY2QiwKKyAgICAweEQ2NkMsIDB4RDY2RCwgMHhENjZFLCAweEQ2NkYsIDB4RDY3MiwgMHhENjczLCAweEQ2NzUsIDB4RDY3NiwgMHhENjc3LAorICAgIDB4RDY3OCwgMHhENjc5LCAweEQ2N0EsIDB4RDY3QiwgMHhENjdDLCAweEQ2N0QsIDB4RDY3RSwgMHhENjdGLCAweEQ2ODAsCisgICAgMHhENjgxLCAweEQ2ODIsIDB4RDY4NCwgMHhENjg2LCAweEQ2ODcsIDB4RDY4OCwgMHhENjg5LCAweEQ2OEEsIDB4RDY4QiwKKyAgICAweEQ2OEUsIDB4RDY4RiwgMHhENjkxLCAweEQ2OTIsIDB4RDY5MywgMHhENjk1LCAweEQ2OTYsIDB4RDY5NywgMHhENjk4LAorICAgIDB4RDY5OSwgMHhENjlBLCAweEQ2OUIsIDB4RDY5QywgMHhENjlFLCAweEQ2QTAsIDB4RDZBMiwgMHhENkEzLCAweEQ2QTQsCisgICAgMHhENkE1LCAweEQ2QTYsIDB4RDZBNywgMHhENkE5LCAweEQ2QUEsIDB4RDZBQiwgMHhENkFELCAweEQ2QUUsIDB4RDZBRiwKKyAgICAweEQ2QjEsIDB4RDZCMiwgMHhENkIzLCAweEQ2QjQsIDB4RDZCNSwgMHhENkI2LCAweEQ2QjcsIDB4RDZCOCwgMHhENkJBLAorICAgIDB4RDZCQywgMHhENkJELCAweEQ2QkUsIDB4RDZCRiwgMHhENkMwLCAweEQ2QzEsIDB4RDZDMiwgMHhENkMzLCAweEQ2QzYsCisgICAgMHhENkM3LCAweEQ2QzksIDB4RDZDQSwgMHhENkNCLCAweEQ2Q0QsIDB4RDZDRSwgMHhENkNGLCAweEQ2RDAsIDB4RDZEMiwKKyAgICAweEQ2RDMsIDB4RDZENSwgMHhENkQ2LCAweEQ2RDgsIDB4RDZEQSwgMHhENkRCLCAweEQ2REMsIDB4RDZERCwgMHhENkRFLAorICAgIDB4RDZERiwgMHhENkUxLCAweEQ2RTIsIDB4RDZFMywgMHhENkU1LCAweEQ2RTYsIDB4RDZFNywgMHhENkU5LCAweEQ2RUEsCisgICAgMHhENkVCLCAweEQ2RUMsIDB4RDZFRCwgMHhENkVFLCAweEQ2RUYsIDB4RDZGMSwgMHhENkYyLCAweEQ2RjMsIDB4RDZGNCwKKyAgICAweEQ2RjYsIDB4RDZGNywgMHhENkY4LCAweEQ2RjksIDB4RDZGQSwgMHhENkZCLCAweEQ2RkUsIDB4RDZGRiwgMHhENzAxLAorICAgIDB4RDcwMiwgMHhENzAzLCAweEQ3MDUsIDB4RDcwNiwgMHhENzA3LCAweEQ3MDgsIDB4RDcwOSwgMHhENzBBLCAweEQ3MEIsCisgICAgMHhENzBDLCAweEQ3MEQsIDB4RDcwRSwgMHhENzBGLCAweEQ3MTAsIDB4RDcxMiwgMHhENzEzLCAweEQ3MTQsIDB4RDcxNSwKKyAgICAweEQ3MTYsIDB4RDcxNywgMHhENzFBLCAweEQ3MUIsIDB4RDcxRCwgMHhENzFFLCAweEQ3MUYsIDB4RDcyMSwgMHhENzIyLAorICAgIDB4RDcyMywgMHhENzI0LCAweEQ3MjUsIDB4RDcyNiwgMHhENzI3LCAweEQ3MkEsIDB4RDcyQywgMHhENzJFLCAweEQ3MkYsCisgICAgMHhENzMwLCAweEQ3MzEsIDB4RDczMiwgMHhENzMzLCAweEQ3MzYsIDB4RDczNywgMHhENzM5LCAweEQ3M0EsIDB4RDczQiwKKyAgICAweEQ3M0QsIDB4RDczRSwgMHhENzNGLCAweEQ3NDAsIDB4RDc0MSwgMHhENzQyLCAweEQ3NDMsIDB4RDc0NSwgMHhENzQ2LAorICAgIDB4RDc0OCwgMHhENzRBLCAweEQ3NEIsIDB4RDc0QywgMHhENzRELCAweEQ3NEUsIDB4RDc0RiwgMHhENzUyLCAweEQ3NTMsCisgICAgMHhENzU1LCAweEQ3NUEsIDB4RDc1QiwgMHhENzVDLCAweEQ3NUQsIDB4RDc1RSwgMHhENzVGLCAweEQ3NjIsIDB4RDc2NCwKKyAgICAweEQ3NjYsIDB4RDc2NywgMHhENzY4LCAweEQ3NkEsIDB4RDc2QiwgMHhENzZELCAweEQ3NkUsIDB4RDc2RiwgMHhENzcxLAorICAgIDB4RDc3MiwgMHhENzczLCAweEQ3NzUsIDB4RDc3NiwgMHhENzc3LCAweEQ3NzgsIDB4RDc3OSwgMHhENzdBLCAweEQ3N0IsCisgICAgMHhENzdFLCAweEQ3N0YsIDB4RDc4MCwgMHhENzgyLCAweEQ3ODMsIDB4RDc4NCwgMHhENzg1LCAweEQ3ODYsIDB4RDc4NywKKyAgICAweEQ3OEEsIDB4RDc4QiwgMHhENzhELCAweEQ3OEUsIDB4RDc4RiwgMHhENzkxLCAweEQ3OTIsIDB4RDc5MywgMHhENzk0LAorICAgIDB4RDc5NSwgMHhENzk2LCAweEQ3OTcsIDB4RDc5QSwgMHhENzlDLCAweEQ3OUUsIDB4RDc5RiwgMHhEN0EwLCAweEQ3QTEsCisgICAgMHhEN0EyLCAweEQ3QTMsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwKKyAgICAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLAorICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsCisgICAgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLCAweDAwNDAsIDB4MDA0MSwKKyAgICAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLAorICAgIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisgICAgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywKKyAgICAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LAorICAgIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsCisgICAgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsIDB4MjBBOSwgMHgyMDEwLAorICAgIDB4MDBBOSwgMHgyMTIyLCAweDIyRUYsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsCisgICAgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwKKyAgICAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLCAweDAwNDAsCisgICAgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwKKyAgICAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLAorICAgIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsCisgICAgMHgwMDVDLCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwKKyAgICAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELAorICAgIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsCisgICAgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDIwM0UsIDB4MDA3RSwKKyAgICAweDAwNUMsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0MtRVVDLVZfMC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQy1FVUMtVl8wLmNwcAppbmRleCAxMzhhZGQwLi42MjQwNjZkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQy1FVUMtVl8wLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQy1FVUMtVl8wLmNwcApAQCAtNywxMCArNywxMCBAQAogI2luY2x1ZGUgImNtYXBzX2tvcmVhMS5oIgogCiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tTQ19FVUNfVl8wWzE2ICogM10gPSB7Ci0gICAgMHhBMUEyLCAweEExQTMsIDB4MUY3OCwgMHhBMUE1LCAweEExQTUsIDB4MUY3QSwgMHhBMUE2LCAweEExQTYsIDB4MjA4MCwKLSAgICAweEExQTksIDB4QTFBQiwgMHgxRjdCLCAweEExQUQsIDB4QTFBRCwgMHgxRjdFLCAweEExQjIsIDB4QTFCRCwgMHgxRjdGLAotICAgIDB4QTFFQiwgMHhBMUVCLCAweDFGOEIsIDB4QTNBMSwgMHhBM0ExLCAweDFGOEMsIDB4QTNBOCwgMHhBM0E5LCAweDFGOEQsCi0gICAgMHhBM0FDLCAweEEzQUMsIDB4MUY4RiwgMHhBM0FFLCAweEEzQUUsIDB4MUY5MCwgMHhBM0JBLCAweEEzQkYsIDB4MUY5MSwKLSAgICAweEEzREIsIDB4QTNEQiwgMHgxRjk3LCAweEEzREQsIDB4QTNERCwgMHgxRjk4LCAweEEzREYsIDB4QTNERiwgMHgxRjk5LAotICAgIDB4QTNGQiwgMHhBM0ZFLCAweDFGOUEsCisgICAgMHhBMUEyLCAweEExQTMsIDB4MUY3OCwgMHhBMUE1LCAweEExQTUsIDB4MUY3QSwgMHhBMUE2LCAweEExQTYsCisgICAgMHgyMDgwLCAweEExQTksIDB4QTFBQiwgMHgxRjdCLCAweEExQUQsIDB4QTFBRCwgMHgxRjdFLCAweEExQjIsCisgICAgMHhBMUJELCAweDFGN0YsIDB4QTFFQiwgMHhBMUVCLCAweDFGOEIsIDB4QTNBMSwgMHhBM0ExLCAweDFGOEMsCisgICAgMHhBM0E4LCAweEEzQTksIDB4MUY4RCwgMHhBM0FDLCAweEEzQUMsIDB4MUY4RiwgMHhBM0FFLCAweEEzQUUsCisgICAgMHgxRjkwLCAweEEzQkEsIDB4QTNCRiwgMHgxRjkxLCAweEEzREIsIDB4QTNEQiwgMHgxRjk3LCAweEEzREQsCisgICAgMHhBM0RELCAweDFGOTgsIDB4QTNERiwgMHhBM0RGLCAweDFGOTksIDB4QTNGQiwgMHhBM0ZFLCAweDFGOUEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0Ntcy1VSEMtSFctVl8xLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDbXMtVUhDLUhXLVZfMS5jcHAKaW5kZXggOWRmNjg5NC4uOTc0MmJhZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0Ntcy1VSEMtSFctVl8xLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1IVy1WXzEuY3BwCkBAIC03LDEwICs3LDEwIEBACiAjaW5jbHVkZSAiY21hcHNfa29yZWExLmgiCiAKIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDbXNfVUhDX0hXX1ZfMVsxNiAqIDNdID0gewotICAgIDB4QTFBMiwgMHhBMUEzLCAweDFGNzgsIDB4QTFBNSwgMHhBMUE1LCAweDFGN0EsIDB4QTFBNiwgMHhBMUE2LCAweDIwODAsCi0gICAgMHhBMUE5LCAweEExQUIsIDB4MUY3QiwgMHhBMUFELCAweEExQUQsIDB4MUY3RSwgMHhBMUIyLCAweEExQkQsIDB4MUY3RiwKLSAgICAweEExRUIsIDB4QTFFQiwgMHgxRjhCLCAweEEzQTEsIDB4QTNBMSwgMHgxRjhDLCAweEEzQTgsIDB4QTNBOSwgMHgxRjhELAotICAgIDB4QTNBQywgMHhBM0FDLCAweDFGOEYsIDB4QTNBRSwgMHhBM0FFLCAweDFGOTAsIDB4QTNCQSwgMHhBM0JGLCAweDFGOTEsCi0gICAgMHhBM0RCLCAweEEzREIsIDB4MUY5NywgMHhBM0RELCAweEEzREQsIDB4MUY5OCwgMHhBM0RGLCAweEEzREYsIDB4MUY5OSwKLSAgICAweEEzRkIsIDB4QTNGRSwgMHgxRjlBLAorICAgIDB4QTFBMiwgMHhBMUEzLCAweDFGNzgsIDB4QTFBNSwgMHhBMUE1LCAweDFGN0EsIDB4QTFBNiwgMHhBMUE2LAorICAgIDB4MjA4MCwgMHhBMUE5LCAweEExQUIsIDB4MUY3QiwgMHhBMUFELCAweEExQUQsIDB4MUY3RSwgMHhBMUIyLAorICAgIDB4QTFCRCwgMHgxRjdGLCAweEExRUIsIDB4QTFFQiwgMHgxRjhCLCAweEEzQTEsIDB4QTNBMSwgMHgxRjhDLAorICAgIDB4QTNBOCwgMHhBM0E5LCAweDFGOEQsIDB4QTNBQywgMHhBM0FDLCAweDFGOEYsIDB4QTNBRSwgMHhBM0FFLAorICAgIDB4MUY5MCwgMHhBM0JBLCAweEEzQkYsIDB4MUY5MSwgMHhBM0RCLCAweEEzREIsIDB4MUY5NywgMHhBM0RELAorICAgIDB4QTNERCwgMHgxRjk4LCAweEEzREYsIDB4QTNERiwgMHgxRjk5LCAweEEzRkIsIDB4QTNGRSwgMHgxRjlBLAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDbXMtVUhDLVZfMS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1WXzEuY3BwCmluZGV4IGIzYmFmMjkuLmJjNjkzOWEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDbXMtVUhDLVZfMS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0Ntcy1VSEMtVl8xLmNwcApAQCAtNywxMCArNywxMCBAQAogI2luY2x1ZGUgImNtYXBzX2tvcmVhMS5oIgogCiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tTQ21zX1VIQ19WXzFbMTYgKiAzXSA9IHsKLSAgICAweEExQTIsIDB4QTFBMywgMHgxRjc4LCAweEExQTUsIDB4QTFBNSwgMHgxRjdBLCAweEExQTYsIDB4QTFBNiwgMHgyMDgwLAotICAgIDB4QTFBOSwgMHhBMUFCLCAweDFGN0IsIDB4QTFBRCwgMHhBMUFELCAweDFGN0UsIDB4QTFCMiwgMHhBMUJELCAweDFGN0YsCi0gICAgMHhBMUVCLCAweEExRUIsIDB4MUY4QiwgMHhBM0ExLCAweEEzQTEsIDB4MUY4QywgMHhBM0E4LCAweEEzQTksIDB4MUY4RCwKLSAgICAweEEzQUMsIDB4QTNBQywgMHgxRjhGLCAweEEzQUUsIDB4QTNBRSwgMHgxRjkwLCAweEEzQkEsIDB4QTNCRiwgMHgxRjkxLAotICAgIDB4QTNEQiwgMHhBM0RCLCAweDFGOTcsIDB4QTNERCwgMHhBM0RELCAweDFGOTgsIDB4QTNERiwgMHhBM0RGLCAweDFGOTksCi0gICAgMHhBM0ZCLCAweEEzRkUsIDB4MUY5QSwKKyAgICAweEExQTIsIDB4QTFBMywgMHgxRjc4LCAweEExQTUsIDB4QTFBNSwgMHgxRjdBLCAweEExQTYsIDB4QTFBNiwKKyAgICAweDIwODAsIDB4QTFBOSwgMHhBMUFCLCAweDFGN0IsIDB4QTFBRCwgMHhBMUFELCAweDFGN0UsIDB4QTFCMiwKKyAgICAweEExQkQsIDB4MUY3RiwgMHhBMUVCLCAweEExRUIsIDB4MUY4QiwgMHhBM0ExLCAweEEzQTEsIDB4MUY4QywKKyAgICAweEEzQTgsIDB4QTNBOSwgMHgxRjhELCAweEEzQUMsIDB4QTNBQywgMHgxRjhGLCAweEEzQUUsIDB4QTNBRSwKKyAgICAweDFGOTAsIDB4QTNCQSwgMHhBM0JGLCAweDFGOTEsIDB4QTNEQiwgMHhBM0RCLCAweDFGOTcsIDB4QTNERCwKKyAgICAweEEzREQsIDB4MUY5OCwgMHhBM0RGLCAweEEzREYsIDB4MUY5OSwgMHhBM0ZCLCAweEEzRkUsIDB4MUY5QSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL1VuaUtTLVVURjE2LUhfMC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL1VuaUtTLVVURjE2LUhfMC5jcHAKaW5kZXggZGMzYmVjOC4uNzZkYzVhNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9VbmlLUy1VVEYxNi1IXzAuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvVW5pS1MtVVRGMTYtSF8wLmNwcApAQCAtNyw0NCArNyw0MCBAQAogI2luY2x1ZGUgImNtYXBzX2tvcmVhMS5oIgogCiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUtTX1VURjE2X0hfMFsxNTggKiAyXSA9IHsKLSAgICAweDAwQTksIDB4MDA2MiwgMHgyMDEwLCAweDAwNjEsIDB4MjBBOSwgMHgwMDYwLCAweDJGMDAsIDB4MTkzQywKLSAgICAweDJGMDQsIDB4MThFQywgMHgyRjA2LCAweDE5MEQsIDB4MkYwOCwgMHgxOTJCLCAweDJGMEEsIDB4MTk0RCwKLSAgICAweDJGMEIsIDB4MUQ0QiwgMHgyRjExLCAweDEwQUUsIDB4MkYxMiwgMHgxMTZBLCAweDJGMTQsIDB4MTQzRiwKLSAgICAweDJGMTcsIDB4MTY4QywgMHgyRjE4LCAweDEzRDUsIDB4MkYxQywgMHgxODM5LCAweDJGMUQsIDB4MEYzRCwKLSAgICAweDJGMUYsIDB4MUQxQiwgMHgyRjIwLCAweDE0ODcsIDB4MkYyMywgMHgxNTFCLCAweDJGMjQsIDB4MTA5RCwKLSAgICAweDJGMjUsIDB4MTAzRiwgMHgyRjI2LCAweDE5NTgsIDB4MkYyOCwgMHgxQzRGLCAweDJGMjksIDB4MTU4MCwKLSAgICAweDJGMkIsIDB4MTY0MSwgMHgyRjJELCAweDE0QjksIDB4MkYyRiwgMHgwRUNGLCAweDJGMzAsIDB4MEZFRCwKLSAgICAweDJGMzEsIDB4MEUxNCwgMHgyRjMyLCAweDBEOTksIDB4MkYzOCwgMHgwRjdDLCAweDJGM0MsIDB4MTY4NCwKLSAgICAweDJGM0QsIDB4MEVEQywgMHgyRjNFLCAweDFFODAsIDB4MkYzRiwgMHgxNUNDLCAweDJGNDAsIDB4MUIyNywKLSAgICAweDJGNDIsIDB4MTJFOCwgMHgyRjQzLCAweDEwRkQsIDB4MkY0NCwgMHgwRkJCLCAweDJGNDUsIDB4MTM1NiwKLSAgICAweDJGNDYsIDB4MTJEMywgMHgyRjQ3LCAweDE5NDAsIDB4MkY0OCwgMHgxN0VELCAweDJGNDksIDB4MTg4OSwKLSAgICAweDJGNEEsIDB4MTJCNCwgMHgyRjRCLCAweDFGNUIsIDB4MkY0QywgMHgxQjJDLCAweDJGNEYsIDB4MTJENiwKLSAgICAweDJGNTAsIDB4MTQ0QywgMHgyRjUxLCAweDEyQTgsIDB4MkY1MiwgMHgxNjhFLCAweDJGNTQsIDB4MTVEMywKLSAgICAweDJGNTUsIDB4MUVCQiwgMHgyRjU2LCAweDFBOTMsIDB4MkY1NywgMHgxNDA5LCAweDJGNTgsIDB4MUYxQSwKLSAgICAweDJGNUEsIDB4MUQ2MSwgMHgyRjVCLCAweDE2OTYsIDB4MkY1QywgMHgxODQyLCAweDJGNUQsIDB4MEUzNywKLSAgICAweDJGNUUsIDB4MUUzRCwgMHgyRjVGLCAweDE3QzEsIDB4MkY2MCwgMHgwRURFLCAweDJGNjEsIDB4MTdENCwKLSAgICAweDJGNjIsIDB4MERDMSwgMHgyRjYzLCAweDE0RkEsIDB4MkY2NCwgMHgxODJELCAweDJGNjUsIDB4MUEwOCwKLSAgICAweDJGNjYsIDB4MURCQSwgMHgyRjY5LCAweDEzODEsIDB4MkY2QSwgMHgxREIwLCAweDJGNkIsIDB4MTI5MywKLSAgICAweDJGNkMsIDB4MTJCNywgMHgyRjZELCAweDEyQUQsIDB4MkY2RSwgMHgxNjRELCAweDJGNkYsIDB4MTUyNSwKLSAgICAweDJGNzAsIDB4MTY0RSwgMHgyRjcyLCAweDFFQkUsIDB4MkY3MywgMHgxRTRCLCAweDJGNzQsIDB4MTIyRCwKLSAgICAweDJGNzUsIDB4MUFGNCwgMHgyRjc2LCAweDEyRkYsIDB4MkY3OCwgMHgxNDBDLCAweDJGN0EsIDB4MTcwOCwKLSAgICAweDJGN0IsIDB4MTg0QSwgMHgyRjdDLCAweDExQTcsIDB4MkY3RCwgMHgxOTFCLCAweDJGN0YsIDB4MTkxQywKLSAgICAweDJGODAsIDB4MThFMCwgMHgyRjgxLCAweDE4RDUsIDB4MkY4MiwgMHgxNjc1LCAweDJGODMsIDB4MTk2NiwKLSAgICAweDJGODQsIDB4MUIzNywgMHgyRjg1LCAweDBGNUEsIDB4MkY4NiwgMHgxNTUwLCAweDJGODcsIDB4MUJGNiwKLSAgICAweDJGODgsIDB4MUFFOCwgMHgyRjg5LCAweDBEQTgsIDB4MkY4QSwgMHgxNEY4LCAweDJGOEIsIDB4MUM0MCwKLSAgICAweDJGOEUsIDB4MUU0QywgMHgyRjhGLCAweDFFMUQsIDB4MkY5MCwgMHgxOTA5LCAweDJGOTIsIDB4MEUzQywKLSAgICAweDJGOTMsIDB4MEQ5MiwgMHgyRjk0LCAweDE3MjEsIDB4MkY5NSwgMHgwRUJDLCAweDJGOTYsIDB4MTEwMywKLSAgICAweDJGOTcsIDB4MTY1NiwgMHgyRjk5LCAweDFENTgsIDB4MkY5QSwgMHgxOUVDLCAweDJGOUIsIDB4MUFFQywKLSAgICAweDJGOUMsIDB4MUFBRSwgMHgyRjlELCAweDE2N0IsIDB4MkY5RSwgMHgxQjhELCAweDJGOUYsIDB4MTY3QywKLSAgICAweDJGQTAsIDB4MUI2MSwgMHgyRkEyLCAweDE4RjUsIDB4MkZBMywgMHgxOEQwLCAweDJGQTUsIDB4MTIxQSwKLSAgICAweDJGQTYsIDB4MTAyMywgMHgyRkE3LCAweDE5QTgsIDB4MkZBOCwgMHgxMkVFLCAweDJGQTksIDB4MTQxQiwKLSAgICAweDJGQUMsIDB4MTg1MywgMHgyRkFELCAweDFDMjMsIDB4MkZBRSwgMHgxNDY0LCAweDJGQUYsIDB4MTI4OCwKLSAgICAweDJGQjAsIDB4MUUzNSwgMHgyRkIxLCAweDE4QTMsIDB4MkZCMywgMHgxOEYxLCAweDJGQjQsIDB4MUU0RCwKLSAgICAweDJGQjUsIDB4MURBQiwgMHgyRkI2LCAweDE0NjUsIDB4MkZCNywgMHgxNjY1LCAweDJGQjgsIDB4MTVGOSwKLSAgICAweDJGQjksIDB4MUUyNiwgMHgyRkJBLCAweDEyMzUsIDB4MkZCQiwgMHgwRUM5LCAweDJGQkMsIDB4MEVCNSwKLSAgICAweDJGQzEsIDB4MEY5OSwgMHgyRkMyLCAweDE3MTYsIDB4MkZDMywgMHgxQUFCLCAweDJGQzQsIDB4MTFBRiwKLSAgICAweDJGQzUsIDB4MTFCNSwgMHgyRkM2LCAweDEyNzYsIDB4MkZDNywgMHgxMjM3LCAweDJGQzgsIDB4MUVGNywKLSAgICAweDJGQzksIDB4MTUxOSwgMHgyRkNBLCAweDFGNTIsIDB4MkZDRCwgMHgxQTY2LCAweDJGQ0UsIDB4MEVCNiwKLSAgICAweDJGQ0YsIDB4MTUxQSwgMHgyRkQwLCAweDE0NjYsIDB4MkZEMSwgMHgxQTdELCAweDJGRDIsIDB4MUNCRiwKLSAgICAweDJGRDMsIDB4MTFEMywgMHgyRkQ0LCAweDBGNkEsCisgICAgMHgwMEE5LCAweDAwNjIsIDB4MjAxMCwgMHgwMDYxLCAweDIwQTksIDB4MDA2MCwgMHgyRjAwLCAweDE5M0MsIDB4MkYwNCwKKyAgICAweDE4RUMsIDB4MkYwNiwgMHgxOTBELCAweDJGMDgsIDB4MTkyQiwgMHgyRjBBLCAweDE5NEQsIDB4MkYwQiwgMHgxRDRCLAorICAgIDB4MkYxMSwgMHgxMEFFLCAweDJGMTIsIDB4MTE2QSwgMHgyRjE0LCAweDE0M0YsIDB4MkYxNywgMHgxNjhDLCAweDJGMTgsCisgICAgMHgxM0Q1LCAweDJGMUMsIDB4MTgzOSwgMHgyRjFELCAweDBGM0QsIDB4MkYxRiwgMHgxRDFCLCAweDJGMjAsIDB4MTQ4NywKKyAgICAweDJGMjMsIDB4MTUxQiwgMHgyRjI0LCAweDEwOUQsIDB4MkYyNSwgMHgxMDNGLCAweDJGMjYsIDB4MTk1OCwgMHgyRjI4LAorICAgIDB4MUM0RiwgMHgyRjI5LCAweDE1ODAsIDB4MkYyQiwgMHgxNjQxLCAweDJGMkQsIDB4MTRCOSwgMHgyRjJGLCAweDBFQ0YsCisgICAgMHgyRjMwLCAweDBGRUQsIDB4MkYzMSwgMHgwRTE0LCAweDJGMzIsIDB4MEQ5OSwgMHgyRjM4LCAweDBGN0MsIDB4MkYzQywKKyAgICAweDE2ODQsIDB4MkYzRCwgMHgwRURDLCAweDJGM0UsIDB4MUU4MCwgMHgyRjNGLCAweDE1Q0MsIDB4MkY0MCwgMHgxQjI3LAorICAgIDB4MkY0MiwgMHgxMkU4LCAweDJGNDMsIDB4MTBGRCwgMHgyRjQ0LCAweDBGQkIsIDB4MkY0NSwgMHgxMzU2LCAweDJGNDYsCisgICAgMHgxMkQzLCAweDJGNDcsIDB4MTk0MCwgMHgyRjQ4LCAweDE3RUQsIDB4MkY0OSwgMHgxODg5LCAweDJGNEEsIDB4MTJCNCwKKyAgICAweDJGNEIsIDB4MUY1QiwgMHgyRjRDLCAweDFCMkMsIDB4MkY0RiwgMHgxMkQ2LCAweDJGNTAsIDB4MTQ0QywgMHgyRjUxLAorICAgIDB4MTJBOCwgMHgyRjUyLCAweDE2OEUsIDB4MkY1NCwgMHgxNUQzLCAweDJGNTUsIDB4MUVCQiwgMHgyRjU2LCAweDFBOTMsCisgICAgMHgyRjU3LCAweDE0MDksIDB4MkY1OCwgMHgxRjFBLCAweDJGNUEsIDB4MUQ2MSwgMHgyRjVCLCAweDE2OTYsIDB4MkY1QywKKyAgICAweDE4NDIsIDB4MkY1RCwgMHgwRTM3LCAweDJGNUUsIDB4MUUzRCwgMHgyRjVGLCAweDE3QzEsIDB4MkY2MCwgMHgwRURFLAorICAgIDB4MkY2MSwgMHgxN0Q0LCAweDJGNjIsIDB4MERDMSwgMHgyRjYzLCAweDE0RkEsIDB4MkY2NCwgMHgxODJELCAweDJGNjUsCisgICAgMHgxQTA4LCAweDJGNjYsIDB4MURCQSwgMHgyRjY5LCAweDEzODEsIDB4MkY2QSwgMHgxREIwLCAweDJGNkIsIDB4MTI5MywKKyAgICAweDJGNkMsIDB4MTJCNywgMHgyRjZELCAweDEyQUQsIDB4MkY2RSwgMHgxNjRELCAweDJGNkYsIDB4MTUyNSwgMHgyRjcwLAorICAgIDB4MTY0RSwgMHgyRjcyLCAweDFFQkUsIDB4MkY3MywgMHgxRTRCLCAweDJGNzQsIDB4MTIyRCwgMHgyRjc1LCAweDFBRjQsCisgICAgMHgyRjc2LCAweDEyRkYsIDB4MkY3OCwgMHgxNDBDLCAweDJGN0EsIDB4MTcwOCwgMHgyRjdCLCAweDE4NEEsIDB4MkY3QywKKyAgICAweDExQTcsIDB4MkY3RCwgMHgxOTFCLCAweDJGN0YsIDB4MTkxQywgMHgyRjgwLCAweDE4RTAsIDB4MkY4MSwgMHgxOEQ1LAorICAgIDB4MkY4MiwgMHgxNjc1LCAweDJGODMsIDB4MTk2NiwgMHgyRjg0LCAweDFCMzcsIDB4MkY4NSwgMHgwRjVBLCAweDJGODYsCisgICAgMHgxNTUwLCAweDJGODcsIDB4MUJGNiwgMHgyRjg4LCAweDFBRTgsIDB4MkY4OSwgMHgwREE4LCAweDJGOEEsIDB4MTRGOCwKKyAgICAweDJGOEIsIDB4MUM0MCwgMHgyRjhFLCAweDFFNEMsIDB4MkY4RiwgMHgxRTFELCAweDJGOTAsIDB4MTkwOSwgMHgyRjkyLAorICAgIDB4MEUzQywgMHgyRjkzLCAweDBEOTIsIDB4MkY5NCwgMHgxNzIxLCAweDJGOTUsIDB4MEVCQywgMHgyRjk2LCAweDExMDMsCisgICAgMHgyRjk3LCAweDE2NTYsIDB4MkY5OSwgMHgxRDU4LCAweDJGOUEsIDB4MTlFQywgMHgyRjlCLCAweDFBRUMsIDB4MkY5QywKKyAgICAweDFBQUUsIDB4MkY5RCwgMHgxNjdCLCAweDJGOUUsIDB4MUI4RCwgMHgyRjlGLCAweDE2N0MsIDB4MkZBMCwgMHgxQjYxLAorICAgIDB4MkZBMiwgMHgxOEY1LCAweDJGQTMsIDB4MThEMCwgMHgyRkE1LCAweDEyMUEsIDB4MkZBNiwgMHgxMDIzLCAweDJGQTcsCisgICAgMHgxOUE4LCAweDJGQTgsIDB4MTJFRSwgMHgyRkE5LCAweDE0MUIsIDB4MkZBQywgMHgxODUzLCAweDJGQUQsIDB4MUMyMywKKyAgICAweDJGQUUsIDB4MTQ2NCwgMHgyRkFGLCAweDEyODgsIDB4MkZCMCwgMHgxRTM1LCAweDJGQjEsIDB4MThBMywgMHgyRkIzLAorICAgIDB4MThGMSwgMHgyRkI0LCAweDFFNEQsIDB4MkZCNSwgMHgxREFCLCAweDJGQjYsIDB4MTQ2NSwgMHgyRkI3LCAweDE2NjUsCisgICAgMHgyRkI4LCAweDE1RjksIDB4MkZCOSwgMHgxRTI2LCAweDJGQkEsIDB4MTIzNSwgMHgyRkJCLCAweDBFQzksIDB4MkZCQywKKyAgICAweDBFQjUsIDB4MkZDMSwgMHgwRjk5LCAweDJGQzIsIDB4MTcxNiwgMHgyRkMzLCAweDFBQUIsIDB4MkZDNCwgMHgxMUFGLAorICAgIDB4MkZDNSwgMHgxMUI1LCAweDJGQzYsIDB4MTI3NiwgMHgyRkM3LCAweDEyMzcsIDB4MkZDOCwgMHgxRUY3LCAweDJGQzksCisgICAgMHgxNTE5LCAweDJGQ0EsIDB4MUY1MiwgMHgyRkNELCAweDFBNjYsIDB4MkZDRSwgMHgwRUI2LCAweDJGQ0YsIDB4MTUxQSwKKyAgICAweDJGRDAsIDB4MTQ2NiwgMHgyRkQxLCAweDFBN0QsIDB4MkZEMiwgMHgxQ0JGLCAweDJGRDMsIDB4MTFEMywgMHgyRkQ0LAorICAgIDB4MEY2QSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL2NtYXBzX2tvcmVhMS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL2NtYXBzX2tvcmVhMS5jcHAKaW5kZXggNmU2N2JmYi4uMTc0MzU5NCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9jbWFwc19rb3JlYTEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvY21hcHNfa29yZWExLmNwcApAQCAtMTIsMjQgKzEyLDM4IEBACiAjaW5jbHVkZSAiY21hcHNfa29yZWExLmgiCiAKIHN0YXRpYyBjb25zdCBGWENNQVBfQ01hcCBnX0ZYQ01BUF9Lb3JlYTFfY21hcHNbXSA9IHsKLSAgICB7ICJLU0MtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ19FVUNfSF8wLCA0NjcsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwIH0sCi0gICAgeyAiS1NDLUVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9LU0NfRVVDX1ZfMCwgMTYsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIktTQ21zLVVIQy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9LU0Ntc19VSENfSF8xLCA2NzUsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMiB9LAotICAgIHsgIktTQ21zLVVIQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9LU0Ntc19VSENfVl8xLCAxNiwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiS1NDbXMtVUhDLUhXLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ21zX1VIQ19IV19IXzEsIDY3NSwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJLU0Ntcy1VSEMtSFctViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfS1NDbXNfVUhDX0hXX1ZfMSwgMTYsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIktTQ3BjLUVVQy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9LU0NwY19FVUNfSF8wLCA1MDksIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtNiB9LAotICAgIHsgIlVuaUtTLVVDUzItSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pS1NfVUNTMl9IXzEsIDgzOTQsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwIH0sCi0gICAgeyAiVW5pS1MtVUNTMi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlLU19VQ1MyX1ZfMSwgMTgsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIlVuaUtTLVVURjE2LUgiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlLU19VVEYxNl9IXzAsIDE1OCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0yIH0sCi0gICAgeyAiVW5pS1MtVVRGMTYtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pS1NfVUNTMl9WXzEsIDE4LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKKyAgICB7IktTQy1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfS1NDX0VVQ19IXzAsIDQ2NywKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDB9LAorICAgIHsiS1NDLUVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9LU0NfRVVDX1ZfMCwgMTYsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJLU0Ntcy1VSEMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfS1NDbXNfVUhDX0hfMSwgNjc1LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTJ9LAorICAgIHsiS1NDbXMtVUhDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ21zX1VIQ19WXzEsIDE2LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAorICAgIHsiS1NDbXMtVUhDLUhXLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ21zX1VIQ19IV19IXzEsIDY3NSwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDB9LAorICAgIHsiS1NDbXMtVUhDLUhXLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ21zX1VIQ19IV19WXzEsIDE2LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAorICAgIHsiS1NDcGMtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ3BjX0VVQ19IXzAsIDUwOSwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC02fSwKKyAgICB7IlVuaUtTLVVDUzItSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pS1NfVUNTMl9IXzEsIDgzOTQsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IlVuaUtTLVVDUzItViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pS1NfVUNTMl9WXzEsIDE4LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAorICAgIHsiVW5pS1MtVVRGMTYtSCIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUtTX1VURjE2X0hfMCwgMTU4LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTJ9LAorICAgIHsiVW5pS1MtVVRGMTYtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pS1NfVUNTMl9WXzEsIDE4LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAogfTsKIAotdm9pZCBDUERGX01vZHVsZU1ncjo6TG9hZEVtYmVkZGVkS29yZWExQ01hcHMoKQotewotICAgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOwotICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9LT1JFQTFdLm1fcE1hcExpc3QgPSBnX0ZYQ01BUF9Lb3JlYTFfY21hcHM7Ci0gICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0tPUkVBMV0ubV9Db3VudCA9IEZYX0FycmF5U2l6ZShnX0ZYQ01BUF9Lb3JlYTFfY21hcHMpOwotICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0tPUkVBMV0ubV9wTWFwID0gZ19GWENNQVBfS29yZWExQ0lEMlVuaWNvZGVfMjsKLSAgICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9LT1JFQTFdLm1fQ291bnQgPSAxODM1MjsKK3ZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkxvYWRFbWJlZGRlZEtvcmVhMUNNYXBzKCkgeworICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPQorICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9LT1JFQTFdLm1fcE1hcExpc3QgPQorICAgICAgZ19GWENNQVBfS29yZWExX2NtYXBzOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfS09SRUExXS5tX0NvdW50ID0KKyAgICAgIEZYX0FycmF5U2l6ZShnX0ZYQ01BUF9Lb3JlYTFfY21hcHMpOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9LT1JFQTFdLm1fcE1hcCA9CisgICAgICBnX0ZYQ01BUF9Lb3JlYTFDSUQyVW5pY29kZV8yOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9LT1JFQTFdLm1fQ291bnQgPSAxODM1MjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9jbWFwX2ludC5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL2NtYXBfaW50LmgKaW5kZXggOThiNjRlZC4uNDE3NDNhOCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL2NtYXBfaW50LmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL2NtYXBfaW50LmgKQEAgLTEwLDE2ICsxMCwxNiBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiICAvLyBGb3IgRlhfV09SRC4KIAogc3RydWN0IEZYQ01BUF9DTWFwIHsKLSAgICBlbnVtIE1hcFR5cGUgeyBOb25lLCBTaW5nbGUsIFJhbmdlLCBSZXZlcnNlIH07CisgIGVudW0gTWFwVHlwZSB7IE5vbmUsIFNpbmdsZSwgUmFuZ2UsIFJldmVyc2UgfTsKIAotICAgIGNvbnN0IGNoYXIqCQltX05hbWU7Ci0gICAgTWFwVHlwZQkJCW1fV29yZE1hcFR5cGU7Ci0gICAgY29uc3QgRlhfV09SRCoJbV9wV29yZE1hcDsKLSAgICBpbnQJCQkJbV9Xb3JkQ291bnQ7Ci0gICAgTWFwVHlwZQkJCW1fRFdvcmRNYXBUeXBlOwotICAgIGNvbnN0IEZYX1dPUkQqCW1fcERXb3JkTWFwOwotICAgIGludAkJCQltX0RXb3JkQ291bnQ7Ci0gICAgaW50CQkJCW1fVXNlT2Zmc2V0OworICBjb25zdCBjaGFyKiBtX05hbWU7CisgIE1hcFR5cGUgbV9Xb3JkTWFwVHlwZTsKKyAgY29uc3QgRlhfV09SRCogbV9wV29yZE1hcDsKKyAgaW50IG1fV29yZENvdW50OworICBNYXBUeXBlIG1fRFdvcmRNYXBUeXBlOworICBjb25zdCBGWF9XT1JEKiBtX3BEV29yZE1hcDsKKyAgaW50IG1fRFdvcmRDb3VudDsKKyAgaW50IG1fVXNlT2Zmc2V0OwogfTsKIAogI2VuZGlmICAvLyBDT1JFX1NSQ19GUERGQVBJX0ZQREZfQ01BUFNfQ01BUF9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9mcGRmX2NtYXBzLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9mcGRmX2NtYXBzLmNwcAppbmRleCA2ZWQyNDZkLi44YjBiZmYwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvZnBkZl9jbWFwcy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL2ZwZGZfY21hcHMuY3BwCkBAIC04LDE3NiArOCwxODIgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKICNpbmNsdWRlICIuLi9mcGRmX2ZvbnQvZm9udF9pbnQuaCIKICNpbmNsdWRlICJjbWFwX2ludC5oIgotdm9pZCBGUERGQVBJX0ZpbmRFbWJlZGRlZENNYXAoY29uc3QgY2hhciogbmFtZSwgaW50IGNoYXJzZXQsIGludCBjb2RpbmcsIGNvbnN0IEZYQ01BUF9DTWFwKiYgcE1hcCkKLXsKLSAgICBwTWFwID0gTlVMTDsKLSAgICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKTsKLSAgICBjb25zdCBGWENNQVBfQ01hcCogcENNYXBzID0gcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbY2hhcnNldF0ubV9wTWFwTGlzdDsKLSAgICBpbnQgbkNNYXBzID0gcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbY2hhcnNldF0ubV9Db3VudDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5DTWFwczsgaSArKykgewotICAgICAgICBpZiAoRlhTWVNfc3RyY21wKG5hbWUsIHBDTWFwc1tpXS5tX05hbWUpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBwTWFwID0gJnBDTWFwc1tpXTsKLSAgICAgICAgYnJlYWs7Cit2b2lkIEZQREZBUElfRmluZEVtYmVkZGVkQ01hcChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhDTUFQX0NNYXAqJiBwTWFwKSB7CisgIHBNYXAgPSBOVUxMOworICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPQorICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7CisgIGNvbnN0IEZYQ01BUF9DTWFwKiBwQ01hcHMgPQorICAgICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbY2hhcnNldF0ubV9wTWFwTGlzdDsKKyAgaW50IG5DTWFwcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW2NoYXJzZXRdLm1fQ291bnQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNNYXBzOyBpKyspIHsKKyAgICBpZiAoRlhTWVNfc3RyY21wKG5hbWUsIHBDTWFwc1tpXS5tX05hbWUpKSB7CisgICAgICBjb250aW51ZTsKICAgICB9CisgICAgcE1hcCA9ICZwQ01hcHNbaV07CisgICAgYnJlYWs7CisgIH0KIH0KIGV4dGVybiAiQyIgewotICAgIHN0YXRpYyBpbnQgY29tcGFyZVdvcmQoY29uc3Qgdm9pZCogcDEsIGNvbnN0IHZvaWQqIHAyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgqKEZYX1dPUkQqKXAxKSAtICgqKEZYX1dPUkQqKXAyKTsKLSAgICB9CitzdGF0aWMgaW50IGNvbXBhcmVXb3JkKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgeworICByZXR1cm4gKCooRlhfV09SRCopcDEpIC0gKCooRlhfV09SRCopcDIpOworfQogfTsKIGV4dGVybiAiQyIgewotICAgIHN0YXRpYyBpbnQgY29tcGFyZVdvcmRSYW5nZShjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpCi0gICAgewotICAgICAgICBpZiAoKihGWF9XT1JEKilrZXkgPCAqIChGWF9XT1JEKillbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCooRlhfV09SRCopa2V5ID4gKChGWF9XT1JEKillbGVtZW50KVsxXSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorc3RhdGljIGludCBjb21wYXJlV29yZFJhbmdlKGNvbnN0IHZvaWQqIGtleSwgY29uc3Qgdm9pZCogZWxlbWVudCkgeworICBpZiAoKihGWF9XT1JEKilrZXkgPCAqKEZYX1dPUkQqKWVsZW1lbnQpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKCooRlhfV09SRCopa2V5ID4gKChGWF9XT1JEKillbGVtZW50KVsxXSkgeworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQogfTsKIGV4dGVybiAiQyIgewotICAgIHN0YXRpYyBpbnQgY29tcGFyZURXb3JkUmFuZ2UoY29uc3Qgdm9pZCogcDEsIGNvbnN0IHZvaWQqIHAyKQotICAgIHsKLSAgICAgICAgRlhfRFdPUkQga2V5ID0gKihGWF9EV09SRCopcDE7Ci0gICAgICAgIEZYX1dPUkQgaGl3b3JkID0gKEZYX1dPUkQpKGtleSA+PiAxNik7Ci0gICAgICAgIEZYX1dPUkQqIGVsZW1lbnQgPSAoRlhfV09SRCopcDI7Ci0gICAgICAgIGlmIChoaXdvcmQgPCBlbGVtZW50WzBdKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhpd29yZCA+IGVsZW1lbnRbMF0pIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIEZYX1dPUkQgbG93b3JkID0gKEZYX1dPUkQpa2V5OwotICAgICAgICBpZiAobG93b3JkIDwgZWxlbWVudFsxXSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb3dvcmQgPiBlbGVtZW50WzJdKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9CitzdGF0aWMgaW50IGNvbXBhcmVEV29yZFJhbmdlKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgeworICBGWF9EV09SRCBrZXkgPSAqKEZYX0RXT1JEKilwMTsKKyAgRlhfV09SRCBoaXdvcmQgPSAoRlhfV09SRCkoa2V5ID4+IDE2KTsKKyAgRlhfV09SRCogZWxlbWVudCA9IChGWF9XT1JEKilwMjsKKyAgaWYgKGhpd29yZCA8IGVsZW1lbnRbMF0pIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKGhpd29yZCA+IGVsZW1lbnRbMF0pIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBGWF9XT1JEIGxvd29yZCA9IChGWF9XT1JEKWtleTsKKyAgaWYgKGxvd29yZCA8IGVsZW1lbnRbMV0pIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKGxvd29yZCA+IGVsZW1lbnRbMl0pIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KIH07CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IGNvbXBhcmVEV29yZFNpbmdsZShjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpCi0gICAgewotICAgICAgICBGWF9EV09SRCBrZXkgPSAqKEZYX0RXT1JEKilwMTsKLSAgICAgICAgRlhfRFdPUkQgdmFsdWUgPSAoKCooRlhfV09SRCopcDIpIDw8IDE2KSB8ICgoRlhfV09SRCopcDIpWzFdOwotICAgICAgICBpZiAoa2V5IDwgdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoa2V5ID4gdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KK3N0YXRpYyBpbnQgY29tcGFyZURXb3JkU2luZ2xlKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgeworICBGWF9EV09SRCBrZXkgPSAqKEZYX0RXT1JEKilwMTsKKyAgRlhfRFdPUkQgdmFsdWUgPSAoKCooRlhfV09SRCopcDIpIDw8IDE2KSB8ICgoRlhfV09SRCopcDIpWzFdOworICBpZiAoa2V5IDwgdmFsdWUpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKGtleSA+IHZhbHVlKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CiB9OwotRlhfV09SRCBGUERGQVBJX0NJREZyb21DaGFyQ29kZShjb25zdCBGWENNQVBfQ01hcCogcE1hcCwgRlhfRFdPUkQgY2hhcmNvZGUpCi17Ci0gICAgaWYgKGNoYXJjb2RlID4+IDE2KSB7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBpZiAocE1hcC0+bV9EV29yZE1hcFR5cGUgPT0gRlhDTUFQX0NNYXA6OlJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgRlhfV09SRCogZm91bmQgPSAoRlhfV09SRCopRlhTWVNfYnNlYXJjaCgmY2hhcmNvZGUsIHBNYXAtPm1fcERXb3JkTWFwLCBwTWFwLT5tX0RXb3JkQ291bnQsIDgsIGNvbXBhcmVEV29yZFJhbmdlKTsKLSAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kWzNdICsgKEZYX1dPUkQpY2hhcmNvZGUgLSBmb3VuZFsxXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBNYXAtPm1fRFdvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpTaW5nbGUpIHsKLSAgICAgICAgICAgICAgICBGWF9XT1JEKiBmb3VuZCA9IChGWF9XT1JEKilGWFNZU19ic2VhcmNoKCZjaGFyY29kZSwgcE1hcC0+bV9wRFdvcmRNYXAsIHBNYXAtPm1fRFdvcmRDb3VudCwgNiwgY29tcGFyZURXb3JkU2luZ2xlKTsKLSAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kWzJdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwTWFwLT5tX1VzZU9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwTWFwID0gcE1hcCArIHBNYXAtPm1fVXNlT2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9XT1JEIGNvZGUgPSAoRlhfV09SRCljaGFyY29kZTsKK0ZYX1dPUkQgRlBERkFQSV9DSURGcm9tQ2hhckNvZGUoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIEZYX0RXT1JEIGNoYXJjb2RlKSB7CisgIGlmIChjaGFyY29kZSA+PiAxNikgewogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChwTWFwLT5tX3BXb3JkTWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgaWYgKHBNYXAtPm1fRFdvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpSYW5nZSkgeworICAgICAgICBGWF9XT1JEKiBmb3VuZCA9CisgICAgICAgICAgICAoRlhfV09SRCopRlhTWVNfYnNlYXJjaCgmY2hhcmNvZGUsIHBNYXAtPm1fcERXb3JkTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hcC0+bV9EV29yZENvdW50LCA4LCBjb21wYXJlRFdvcmRSYW5nZSk7CisgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgIHJldHVybiBmb3VuZFszXSArIChGWF9XT1JEKWNoYXJjb2RlIC0gZm91bmRbMV07CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBNYXAtPm1fV29yZE1hcFR5cGUgPT0gRlhDTUFQX0NNYXA6OlNpbmdsZSkgewotICAgICAgICAgICAgRlhfV09SRCogZm91bmQgPSAoRlhfV09SRCopRlhTWVNfYnNlYXJjaCgmY29kZSwgcE1hcC0+bV9wV29yZE1hcCwgcE1hcC0+bV9Xb3JkQ291bnQsIDQsIGNvbXBhcmVXb3JkKTsKLSAgICAgICAgICAgIGlmIChmb3VuZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZFsxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwTWFwLT5tX1dvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpSYW5nZSkgewotICAgICAgICAgICAgRlhfV09SRCogZm91bmQgPSAoRlhfV09SRCopRlhTWVNfYnNlYXJjaCgmY29kZSwgcE1hcC0+bV9wV29yZE1hcCwgcE1hcC0+bV9Xb3JkQ291bnQsIDYsIGNvbXBhcmVXb3JkUmFuZ2UpOwotICAgICAgICAgICAgaWYgKGZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kWzJdICsgY29kZSAtIGZvdW5kWzBdOwotICAgICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChwTWFwLT5tX0RXb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6U2luZ2xlKSB7CisgICAgICAgIEZYX1dPUkQqIGZvdW5kID0KKyAgICAgICAgICAgIChGWF9XT1JEKilGWFNZU19ic2VhcmNoKCZjaGFyY29kZSwgcE1hcC0+bV9wRFdvcmRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFwLT5tX0RXb3JkQ291bnQsIDYsIGNvbXBhcmVEV29yZFNpbmdsZSk7CisgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgIHJldHVybiBmb3VuZFsyXTsKICAgICAgICAgfQotICAgICAgICBpZiAocE1hcC0+bV9Vc2VPZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcE1hcCA9IHBNYXAgKyBwTWFwLT5tX1VzZU9mZnNldDsKKyAgICAgIH0KKyAgICAgIGlmIChwTWFwLT5tX1VzZU9mZnNldCA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcE1hcCA9IHBNYXAgKyBwTWFwLT5tX1VzZU9mZnNldDsKICAgICB9CiAgICAgcmV0dXJuIDA7Ci19Ci1GWF9EV09SRCBGUERGQVBJX0NoYXJDb2RlRnJvbUNJRChjb25zdCBGWENNQVBfQ01hcCogcE1hcCwgRlhfV09SRCBjaWQpCi17Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKHBNYXAtPm1fV29yZE1hcFR5cGUgPT0gRlhDTUFQX0NNYXA6OlNpbmdsZSkgewotICAgICAgICAgICAgY29uc3QgRlhfV09SRCAqcEN1ciA9IHBNYXAtPm1fcFdvcmRNYXA7Ci0gICAgICAgICAgICBjb25zdCBGWF9XT1JEICpwRW5kID0gcE1hcC0+bV9wV29yZE1hcCArIHBNYXAtPm1fV29yZENvdW50ICogMjsKLSAgICAgICAgICAgIHdoaWxlIChwQ3VyIDwgcEVuZCkgewotICAgICAgICAgICAgICAgIGlmIChwQ3VyWzFdID09IGNpZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEN1clswXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEN1ciArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBNYXAtPm1fV29yZE1hcFR5cGUgPT0gRlhDTUFQX0NNYXA6OlJhbmdlKSB7Ci0gICAgICAgICAgICBjb25zdCBGWF9XT1JEICpwQ3VyID0gcE1hcC0+bV9wV29yZE1hcDsKLSAgICAgICAgICAgIGNvbnN0IEZYX1dPUkQgKnBFbmQgPSBwTWFwLT5tX3BXb3JkTWFwICsgcE1hcC0+bV9Xb3JkQ291bnQgKiAzOwotICAgICAgICAgICAgd2hpbGUgKHBDdXIgPCBwRW5kKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNpZCA+PSBwQ3VyWzJdICYmIGNpZCA8PSBwQ3VyWzJdICsgcEN1clsxXSAtIHBDdXJbMF0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBDdXJbMF0gKyBjaWQgLSBwQ3VyWzJdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQ3VyICs9IDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBNYXAtPm1fVXNlT2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHBNYXAgPSBwTWFwICsgcE1hcC0+bV9Vc2VPZmZzZXQ7CisgIH0KKyAgRlhfV09SRCBjb2RlID0gKEZYX1dPUkQpY2hhcmNvZGU7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKHBNYXAtPm1fcFdvcmRNYXAgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChwTWFwLT5tX0RXb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6UmFuZ2UpIHsKLSAgICAgICAgICAgIGNvbnN0IEZYX1dPUkQgKnBDdXIgPSBwTWFwLT5tX3BEV29yZE1hcDsKLSAgICAgICAgICAgIGNvbnN0IEZYX1dPUkQgKnBFbmQgPSBwTWFwLT5tX3BEV29yZE1hcCArIHBNYXAtPm1fRFdvcmRDb3VudCAqIDQ7Ci0gICAgICAgICAgICB3aGlsZSAocEN1ciA8IHBFbmQpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2lkID49IHBDdXJbM10gJiYgY2lkIDw9IHBDdXJbM10gKyBwQ3VyWzJdIC0gcEN1clsxXSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgoRlhfRFdPUkQpcEN1clswXSA8PCAxNikgfCBwQ3VyWzFdKSArIGNpZCAtIHBDdXJbM107Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDdXIgKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwTWFwLT5tX0RXb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6U2luZ2xlKSB7Ci0gICAgICAgICAgICBjb25zdCBGWF9XT1JEICpwQ3VyID0gcE1hcC0+bV9wRFdvcmRNYXA7Ci0gICAgICAgICAgICBjb25zdCBGWF9XT1JEICpwRW5kID0gcE1hcC0+bV9wRFdvcmRNYXAgKyBwTWFwLT5tX0RXb3JkQ291bnQgKiAzOwotICAgICAgICAgICAgd2hpbGUgKHBDdXIgPCBwRW5kKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDdXJbMl0gPT0gY2lkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEZYX0RXT1JEKXBDdXJbMF0gPDwgMTYpIHwgcEN1clsxXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEN1ciArPSAzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwTWFwLT5tX1VzZU9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBwTWFwID0gcE1hcCArIHBNYXAtPm1fVXNlT2Zmc2V0OworICAgIGlmIChwTWFwLT5tX1dvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpTaW5nbGUpIHsKKyAgICAgIEZYX1dPUkQqIGZvdW5kID0gKEZYX1dPUkQqKUZYU1lTX2JzZWFyY2goCisgICAgICAgICAgJmNvZGUsIHBNYXAtPm1fcFdvcmRNYXAsIHBNYXAtPm1fV29yZENvdW50LCA0LCBjb21wYXJlV29yZCk7CisgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgcmV0dXJuIGZvdW5kWzFdOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocE1hcC0+bV9Xb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6UmFuZ2UpIHsKKyAgICAgIEZYX1dPUkQqIGZvdW5kID0gKEZYX1dPUkQqKUZYU1lTX2JzZWFyY2goCisgICAgICAgICAgJmNvZGUsIHBNYXAtPm1fcFdvcmRNYXAsIHBNYXAtPm1fV29yZENvdW50LCA2LCBjb21wYXJlV29yZFJhbmdlKTsKKyAgICAgIGlmIChmb3VuZCkgeworICAgICAgICByZXR1cm4gZm91bmRbMl0gKyBjb2RlIC0gZm91bmRbMF07CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIGlmIChwTWFwLT5tX1VzZU9mZnNldCA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcE1hcCA9IHBNYXAgKyBwTWFwLT5tX1VzZU9mZnNldDsKKyAgfQorICByZXR1cm4gMDsKIH0KLXZvaWQgRlBERkFQSV9Mb2FkQ0lEMlVuaWNvZGVNYXAoaW50IGNoYXJzZXQsIGNvbnN0IEZYX1dPUkQqJiBwTWFwLCBGWF9EV09SRCYgY291bnQpCi17Ci0gICAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7Ci0gICAgcE1hcCA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9wTWFwOwotICAgIGNvdW50ID0gcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tjaGFyc2V0XS5tX0NvdW50OworRlhfRFdPUkQgRlBERkFQSV9DaGFyQ29kZUZyb21DSUQoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIEZYX1dPUkQgY2lkKSB7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKHBNYXAtPm1fV29yZE1hcFR5cGUgPT0gRlhDTUFQX0NNYXA6OlNpbmdsZSkgeworICAgICAgY29uc3QgRlhfV09SRCogcEN1ciA9IHBNYXAtPm1fcFdvcmRNYXA7CisgICAgICBjb25zdCBGWF9XT1JEKiBwRW5kID0gcE1hcC0+bV9wV29yZE1hcCArIHBNYXAtPm1fV29yZENvdW50ICogMjsKKyAgICAgIHdoaWxlIChwQ3VyIDwgcEVuZCkgeworICAgICAgICBpZiAocEN1clsxXSA9PSBjaWQpIHsKKyAgICAgICAgICByZXR1cm4gcEN1clswXTsKKyAgICAgICAgfQorICAgICAgICBwQ3VyICs9IDI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChwTWFwLT5tX1dvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpSYW5nZSkgeworICAgICAgY29uc3QgRlhfV09SRCogcEN1ciA9IHBNYXAtPm1fcFdvcmRNYXA7CisgICAgICBjb25zdCBGWF9XT1JEKiBwRW5kID0gcE1hcC0+bV9wV29yZE1hcCArIHBNYXAtPm1fV29yZENvdW50ICogMzsKKyAgICAgIHdoaWxlIChwQ3VyIDwgcEVuZCkgeworICAgICAgICBpZiAoY2lkID49IHBDdXJbMl0gJiYgY2lkIDw9IHBDdXJbMl0gKyBwQ3VyWzFdIC0gcEN1clswXSkgeworICAgICAgICAgIHJldHVybiBwQ3VyWzBdICsgY2lkIC0gcEN1clsyXTsKKyAgICAgICAgfQorICAgICAgICBwQ3VyICs9IDM7CisgICAgICB9CisgICAgfQorICAgIGlmIChwTWFwLT5tX1VzZU9mZnNldCA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcE1hcCA9IHBNYXAgKyBwTWFwLT5tX1VzZU9mZnNldDsKKyAgfQorICB3aGlsZSAoMSkgeworICAgIGlmIChwTWFwLT5tX0RXb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6UmFuZ2UpIHsKKyAgICAgIGNvbnN0IEZYX1dPUkQqIHBDdXIgPSBwTWFwLT5tX3BEV29yZE1hcDsKKyAgICAgIGNvbnN0IEZYX1dPUkQqIHBFbmQgPSBwTWFwLT5tX3BEV29yZE1hcCArIHBNYXAtPm1fRFdvcmRDb3VudCAqIDQ7CisgICAgICB3aGlsZSAocEN1ciA8IHBFbmQpIHsKKyAgICAgICAgaWYgKGNpZCA+PSBwQ3VyWzNdICYmIGNpZCA8PSBwQ3VyWzNdICsgcEN1clsyXSAtIHBDdXJbMV0pIHsKKyAgICAgICAgICByZXR1cm4gKCgoRlhfRFdPUkQpcEN1clswXSA8PCAxNikgfCBwQ3VyWzFdKSArIGNpZCAtIHBDdXJbM107CisgICAgICAgIH0KKyAgICAgICAgcEN1ciArPSA0OworICAgICAgfQorICAgIH0gZWxzZSBpZiAocE1hcC0+bV9EV29yZE1hcFR5cGUgPT0gRlhDTUFQX0NNYXA6OlNpbmdsZSkgeworICAgICAgY29uc3QgRlhfV09SRCogcEN1ciA9IHBNYXAtPm1fcERXb3JkTWFwOworICAgICAgY29uc3QgRlhfV09SRCogcEVuZCA9IHBNYXAtPm1fcERXb3JkTWFwICsgcE1hcC0+bV9EV29yZENvdW50ICogMzsKKyAgICAgIHdoaWxlIChwQ3VyIDwgcEVuZCkgeworICAgICAgICBpZiAocEN1clsyXSA9PSBjaWQpIHsKKyAgICAgICAgICByZXR1cm4gKChGWF9EV09SRClwQ3VyWzBdIDw8IDE2KSB8IHBDdXJbMV07CisgICAgICAgIH0KKyAgICAgICAgcEN1ciArPSAzOworICAgICAgfQorICAgIH0KKyAgICBpZiAocE1hcC0+bV9Vc2VPZmZzZXQgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHBNYXAgPSBwTWFwICsgcE1hcC0+bV9Vc2VPZmZzZXQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9Cit2b2lkIEZQREZBUElfTG9hZENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XT1JEKiYgcE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvdW50KSB7CisgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9CisgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKTsKKyAgcE1hcCA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9wTWFwOworICBjb3VudCA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9Db3VudDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2VkaXRpbnQuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2VkaXRpbnQuaAppbmRleCA0YWVjMzJhLi40NDVlYTgzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9lZGl0aW50LmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZWRpdGludC5oCkBAIC03LDU1ICs3LDU4IEBACiAjaWZuZGVmIENPUkVfU1JDX0ZQREZBUElfRlBERl9FRElUX0VESVRJTlRfSF8KICNkZWZpbmUgQ09SRV9TUkNfRlBERkFQSV9GUERGX0VESVRfRURJVElOVF9IXwogCi1jbGFzcyBDUERGX09iamVjdFN0cmVhbQotewotcHVibGljOgotICAgIENQREZfT2JqZWN0U3RyZWFtKCk7CitjbGFzcyBDUERGX09iamVjdFN0cmVhbSB7CisgcHVibGljOgorICBDUERGX09iamVjdFN0cmVhbSgpOwogCi0gICAgRlhfQk9PTAkJCQlTdGFydCgpOworICBGWF9CT09MIFN0YXJ0KCk7CiAKLSAgICBpbnQzMl90CQkJQ29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QgKnBPYmopOwotICAgIGludDMyX3QJCQlDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLCBjb25zdCB1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBkd1NpemUpOworICBpbnQzMl90IENvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKKyAgaW50MzJfdCBDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZSk7CiAKLSAgICBGWF9GSUxFU0laRQkJCUVuZChDUERGX0NyZWF0b3IqIHBDcmVhdG9yKTsKKyAgRlhfRklMRVNJWkUgRW5kKENQREZfQ3JlYXRvciogcENyZWF0b3IpOwogCi0gICAgQ0ZYX0RXb3JkQXJyYXkJCW1fT2JqTnVtQXJyYXk7CisgIENGWF9EV29yZEFycmF5IG1fT2JqTnVtQXJyYXk7CiAKLSAgICBDRlhfQnl0ZVRleHRCdWYJCW1fQnVmZmVyOwotICAgIEZYX0RXT1JECQkJbV9kd09iak51bTsKLSAgICBpbnQzMl90CQkJbV9pbmRleDsKLXByb3RlY3RlZDoKKyAgQ0ZYX0J5dGVUZXh0QnVmIG1fQnVmZmVyOworICBGWF9EV09SRCBtX2R3T2JqTnVtOworICBpbnQzMl90IG1faW5kZXg7CiAKLSAgICBDRlhfRFdvcmRBcnJheQkJbV9PZmZzZXRBcnJheTsKKyBwcm90ZWN0ZWQ6CisgIENGWF9EV29yZEFycmF5IG1fT2Zmc2V0QXJyYXk7CiB9OwotY2xhc3MgQ1BERl9YUmVmU3RyZWFtCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1hSZWZTdHJlYW0geworIHB1YmxpYzoKKyAgQ1BERl9YUmVmU3RyZWFtKCk7CiAKLSAgICBDUERGX1hSZWZTdHJlYW0oKTsKKyAgRlhfQk9PTCBTdGFydCgpOwogCi0gICAgRlhfQk9PTAkJCQlTdGFydCgpOworICBpbnQzMl90IENvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ3JlYXRvciogcENyZWF0b3IpOwogCi0gICAgaW50MzJfdAkJCUNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIGNvbnN0IENQREZfT2JqZWN0ICpwT2JqLCBDUERGX0NyZWF0b3IgKnBDcmVhdG9yKTsKKyAgaW50MzJfdCBDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ3JlYXRvciogcENyZWF0b3IpOwogCi0gICAgaW50MzJfdAkJCUNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSwgQ1BERl9DcmVhdG9yICpwQ3JlYXRvcik7CisgIEZYX0JPT0wgRW5kKENQREZfQ3JlYXRvciogcENyZWF0b3IsIEZYX0JPT0wgYkVPRiA9IEZBTFNFKTsKKyAgRlhfQk9PTCBBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkoRlhfRFdPUkQgb2JqbnVtKTsKKyAgRlhfQk9PTCBFbmRYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IpOwogCi0gICAgRlhfQk9PTAkJCQlFbmQoQ1BERl9DcmVhdG9yICpwQ3JlYXRvciwgRlhfQk9PTCBiRU9GID0gRkFMU0UpOwotICAgIEZYX0JPT0wJCQkJQWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KEZYX0RXT1JEIG9iam51bSk7Ci0gICAgRlhfQk9PTAkJCQlFbmRYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IpOworICBDRlhfRFdvcmRBcnJheSBtX0luZGV4QXJyYXk7CiAKKyAgRlhfRklMRVNJWkUgbV9QcmV2T2Zmc2V0OworICBGWF9EV09SRCBtX2R3VGVtcE9iak51bTsKIAotICAgIENGWF9EV29yZEFycmF5CQltX0luZGV4QXJyYXk7Ci0KLSAgICBGWF9GSUxFU0laRQkJCW1fUHJldk9mZnNldDsKLSAgICBGWF9EV09SRAkJCW1fZHdUZW1wT2JqTnVtOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50MzJfdAkJCUVuZE9iamVjdFN0cmVhbShDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBGWF9CT09MIGJFT0YgPSBUUlVFKTsKLSAgICBGWF9CT09MCQkJCUdlbmVyYXRlWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBGWF9CT09MIGJFT0YpOwotICAgIGludDMyX3QJCQltX2lTZWc7Ci0gICAgQ1BERl9PYmplY3RTdHJlYW0JbV9PYmpTdHJlYW07Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmCQltX0J1ZmZlcjsKKyBwcm90ZWN0ZWQ6CisgIGludDMyX3QgRW5kT2JqZWN0U3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IsIEZYX0JPT0wgYkVPRiA9IFRSVUUpOworICBGWF9CT09MIEdlbmVyYXRlWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBGWF9CT09MIGJFT0YpOworICBpbnQzMl90IG1faVNlZzsKKyAgQ1BERl9PYmplY3RTdHJlYW0gbV9PYmpTdHJlYW07CisgIENGWF9CeXRlVGV4dEJ1ZiBtX0J1ZmZlcjsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlBERkFQSV9GUERGX0VESVRfRURJVElOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NvbnRlbnQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NvbnRlbnQuY3BwCmluZGV4IDY1Zjc4ZGEuLjRjZTUwYTggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jb250ZW50LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY29udGVudC5jcHAKQEAgLTksMTU2ICs5LDE1OSBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgogI2luY2x1ZGUgIi4uL2ZwZGZfcGFnZS9wYWdlaW50LmgiCiAKLUNGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3IgPDwgKENGWF9CeXRlVGV4dEJ1ZiYgYXIsIENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkKLXsKLSAgICBhciA8PCBtYXRyaXguYSA8PCAiICIgPDwgbWF0cml4LmIgPDwgIiAiIDw8IG1hdHJpeC5jIDw8ICIgIiA8PCBtYXRyaXguZCA8PCAiICIgPDwgbWF0cml4LmUgPDwgIiAiIDw8IG1hdHJpeC5mOwotICAgIHJldHVybiBhcjsKK0NGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChDRlhfQnl0ZVRleHRCdWYmIGFyLCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpIHsKKyAgYXIgPDwgbWF0cml4LmEgPDwgIiAiIDw8IG1hdHJpeC5iIDw8ICIgIiA8PCBtYXRyaXguYyA8PCAiICIgPDwgbWF0cml4LmQgPDwgIiAiCisgICAgIDw8IG1hdHJpeC5lIDw8ICIgIiA8PCBtYXRyaXguZjsKKyAgcmV0dXJuIGFyOwogfQotQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjpDUERGX1BhZ2VDb250ZW50R2VuZXJhdGUoQ1BERl9QYWdlKiBwUGFnZSkgOiBtX3BQYWdlKHBQYWdlKQotewotICAgIG1fcERvY3VtZW50ID0gTlVMTDsKLSAgICBpZiAobV9wUGFnZSkgewotICAgICAgICBtX3BEb2N1bWVudCA9IG1fcFBhZ2UtPm1fcERvY3VtZW50OwotICAgIH0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwUGFnZS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgSW5zZXJ0UGFnZU9iamVjdChwUGFnZS0+R2V0TmV4dE9iamVjdChwb3MpKTsKLSAgICB9CitDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6OkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZShDUERGX1BhZ2UqIHBQYWdlKQorICAgIDogbV9wUGFnZShwUGFnZSkgeworICBtX3BEb2N1bWVudCA9IE5VTEw7CisgIGlmIChtX3BQYWdlKSB7CisgICAgbV9wRG9jdW1lbnQgPSBtX3BQYWdlLT5tX3BEb2N1bWVudDsKKyAgfQorICBGWF9QT1NJVElPTiBwb3MgPSBwUGFnZS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgSW5zZXJ0UGFnZU9iamVjdChwUGFnZS0+R2V0TmV4dE9iamVjdChwb3MpKTsKKyAgfQogfQotQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjp+Q1BERl9QYWdlQ29udGVudEdlbmVyYXRlKCkKLXsKK0NQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6fkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZSgpIHt9CitGWF9CT09MIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6SW5zZXJ0UGFnZU9iamVjdCgKKyAgICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0KSB7CisgIGlmICghcFBhZ2VPYmplY3QpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIG1fcGFnZU9iamVjdHMuQWRkKHBQYWdlT2JqZWN0KTsKIH0KLUZYX0JPT0wgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjpJbnNlcnRQYWdlT2JqZWN0KENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmplY3QpCi17Ci0gICAgaWYgKCFwUGFnZU9iamVjdCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Cit2b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6R2VuZXJhdGVDb250ZW50KCkgeworICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IG1fcFBhZ2UtPm1fcEZvcm1EaWN0OworICBmb3IgKGludCBpID0gMDsgaSA8IG1fcGFnZU9iamVjdHMuR2V0U2l6ZSgpOyArK2kpIHsKKyAgICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gKENQREZfUGFnZU9iamVjdCopbV9wYWdlT2JqZWN0c1tpXTsKKyAgICBpZiAoIXBQYWdlT2JqIHx8IHBQYWdlT2JqLT5tX1R5cGUgIT0gUERGUEFHRV9JTUFHRSkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIHJldHVybiBtX3BhZ2VPYmplY3RzLkFkZChwUGFnZU9iamVjdCk7CisgICAgUHJvY2Vzc0ltYWdlKGJ1ZiwgKENQREZfSW1hZ2VPYmplY3QqKXBQYWdlT2JqKTsKKyAgfQorICBDUERGX09iamVjdCogcENvbnRlbnQgPQorICAgICAgcFBhZ2VEaWN0ID8gcFBhZ2VEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkNvbnRlbnRzIikgOiBOVUxMOworICBpZiAocENvbnRlbnQgIT0gTlVMTCkgeworICAgIHBQYWdlRGljdC0+UmVtb3ZlQXQoIkNvbnRlbnRzIik7CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7CisgIHBTdHJlYW0tPlNldERhdGEoYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7CisgIG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtKTsKKyAgcFBhZ2VEaWN0LT5TZXRBdFJlZmVyZW5jZSgiQ29udGVudHMiLCBtX3BEb2N1bWVudCwgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOwogfQotdm9pZCBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6OkdlbmVyYXRlQ29udGVudCgpCi17Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IG1fcFBhZ2UtPm1fcEZvcm1EaWN0OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9wYWdlT2JqZWN0cy5HZXRTaXplKCk7ICsraSkgewotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gKENQREZfUGFnZU9iamVjdCopbV9wYWdlT2JqZWN0c1tpXTsKLSAgICAgICAgaWYgKCFwUGFnZU9iaiB8fCBwUGFnZU9iai0+bV9UeXBlICE9IFBERlBBR0VfSU1BR0UpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIFByb2Nlc3NJbWFnZShidWYsIChDUERGX0ltYWdlT2JqZWN0KilwUGFnZU9iaik7CitDRlhfQnl0ZVN0cmluZyBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6OlJlYWxpemVSZXNvdXJjZSgKKyAgICBDUERGX09iamVjdCogcFJlc291cmNlT2JqLAorICAgIGNvbnN0IEZYX0NIQVIqIHN6VHlwZSkgeworICBpZiAobV9wUGFnZS0+bV9wUmVzb3VyY2VzID09IE5VTEwpIHsKKyAgICBtX3BQYWdlLT5tX3BSZXNvdXJjZXMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgIGludCBvYmpudW0gPSBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QobV9wUGFnZS0+bV9wUmVzb3VyY2VzKTsKKyAgICBtX3BQYWdlLT5tX3BGb3JtRGljdC0+U2V0QXRSZWZlcmVuY2UoIlJlc291cmNlcyIsIG1fcERvY3VtZW50LCBvYmpudW0pOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFJlc0xpc3QgPSBtX3BQYWdlLT5tX3BSZXNvdXJjZXMtPkdldERpY3Qoc3pUeXBlKTsKKyAgaWYgKHBSZXNMaXN0ID09IE5VTEwpIHsKKyAgICBwUmVzTGlzdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgbV9wUGFnZS0+bV9wUmVzb3VyY2VzLT5TZXRBdChzelR5cGUsIHBSZXNMaXN0KTsKKyAgfQorICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocFJlc291cmNlT2JqKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgbmFtZTsKKyAgaW50IGlkbnVtID0gMTsKKyAgd2hpbGUgKDEpIHsKKyAgICBuYW1lLkZvcm1hdCgiRlglYyVkIiwgc3pUeXBlWzBdLCBpZG51bSk7CisgICAgaWYgKCFwUmVzTGlzdC0+S2V5RXhpc3QobmFtZSkpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBDUERGX09iamVjdCogcENvbnRlbnQgPSBwUGFnZURpY3QgPyBwUGFnZURpY3QtPkdldEVsZW1lbnRWYWx1ZSgiQ29udGVudHMiKSA6IE5VTEw7Ci0gICAgaWYgKHBDb250ZW50ICE9IE5VTEwpIHsKLSAgICAgICAgcFBhZ2VEaWN0LT5SZW1vdmVBdCgiQ29udGVudHMiKTsKLSAgICB9Ci0gICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7Ci0gICAgcFN0cmVhbS0+U2V0RGF0YShidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKLSAgICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7Ci0gICAgcFBhZ2VEaWN0LT5TZXRBdFJlZmVyZW5jZSgiQ29udGVudHMiLCBtX3BEb2N1bWVudCwgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOworICAgIGlkbnVtKys7CisgIH0KKyAgcFJlc0xpc3QtPkFkZFJlZmVyZW5jZShuYW1lLCBtX3BEb2N1bWVudCwgcFJlc291cmNlT2JqLT5HZXRPYmpOdW0oKSk7CisgIHJldHVybiBuYW1lOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjpSZWFsaXplUmVzb3VyY2UoQ1BERl9PYmplY3QqIHBSZXNvdXJjZU9iaiwgY29uc3QgRlhfQ0hBUiogc3pUeXBlKQotewotICAgIGlmIChtX3BQYWdlLT5tX3BSZXNvdXJjZXMgPT0gTlVMTCkgewotICAgICAgICBtX3BQYWdlLT5tX3BSZXNvdXJjZXMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICBpbnQgb2JqbnVtID0gbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KG1fcFBhZ2UtPm1fcFJlc291cmNlcyk7Ci0gICAgICAgIG1fcFBhZ2UtPm1fcEZvcm1EaWN0LT5TZXRBdFJlZmVyZW5jZSgiUmVzb3VyY2VzIiwgbV9wRG9jdW1lbnQsIG9iam51bSk7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFJlc0xpc3QgPSBtX3BQYWdlLT5tX3BSZXNvdXJjZXMtPkdldERpY3Qoc3pUeXBlKTsKLSAgICBpZiAocFJlc0xpc3QgPT0gTlVMTCkgewotICAgICAgICBwUmVzTGlzdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgICAgIG1fcFBhZ2UtPm1fcFJlc291cmNlcy0+U2V0QXQoc3pUeXBlLCBwUmVzTGlzdCk7Ci0gICAgfQotICAgIG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwUmVzb3VyY2VPYmopOwotICAgIENGWF9CeXRlU3RyaW5nIG5hbWU7Ci0gICAgaW50IGlkbnVtID0gMTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBuYW1lLkZvcm1hdCgiRlglYyVkIiwgc3pUeXBlWzBdLCBpZG51bSk7Ci0gICAgICAgIGlmICghcFJlc0xpc3QtPktleUV4aXN0KG5hbWUpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZG51bSArKzsKLSAgICB9Ci0gICAgcFJlc0xpc3QtPkFkZFJlZmVyZW5jZShuYW1lLCBtX3BEb2N1bWVudCwgcFJlc291cmNlT2JqLT5HZXRPYmpOdW0oKSk7Ci0gICAgcmV0dXJuIG5hbWU7Ci19Ci12b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6UHJvY2Vzc0ltYWdlKENGWF9CeXRlVGV4dEJ1ZiYgYnVmLCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmopCi17Ci0gICAgaWYgKChwSW1hZ2VPYmotPm1fTWF0cml4LmEgPT0gMCAmJiBwSW1hZ2VPYmotPm1fTWF0cml4LmIgPT0gMCkgfHwKLSAgICAgICAgICAgIChwSW1hZ2VPYmotPm1fTWF0cml4LmMgPT0gMCAmJiBwSW1hZ2VPYmotPm1fTWF0cml4LmQgPT0gMCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBidWYgPDwgInEgIiA8PCBwSW1hZ2VPYmotPm1fTWF0cml4IDw8ICIgY20gIjsKLSAgICBpZiAoIXBJbWFnZU9iai0+bV9wSW1hZ2UtPklzSW5saW5lKCkpIHsKLSAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwSW1hZ2VPYmotPm1fcEltYWdlLT5HZXRTdHJlYW0oKTsKLSAgICAgICAgRlhfRFdPUkQgZHdTYXZlZE9iak51bSA9IHBTdHJlYW0tPkdldE9iak51bSgpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gUmVhbGl6ZVJlc291cmNlKHBTdHJlYW0sICJYT2JqZWN0Iik7Ci0gICAgICAgIGlmIChkd1NhdmVkT2JqTnVtID09IDApIHsKLSAgICAgICAgICAgIGlmIChwSW1hZ2VPYmotPm1fcEltYWdlKQotICAgICAgICAgICAgICAgIHBJbWFnZU9iai0+bV9wSW1hZ2UtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIHBJbWFnZU9iai0+bV9wSW1hZ2UgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0SW1hZ2UocFN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmIDw8ICIvIiA8PCBQREZfTmFtZUVuY29kZShuYW1lKSA8PCAiIERvIFFcbiI7Ci0gICAgfQotfQotdm9pZCBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6OlByb2Nlc3NGb3JtKENGWF9CeXRlVGV4dEJ1ZiYgYnVmLCBjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCBDRlhfTWF0cml4JiBtYXRyaXgpCi17Ci0gICAgaWYgKCFkYXRhIHx8ICFzaXplKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgIHBGb3JtRGljdC0+U2V0QXROYW1lKCJUeXBlIiwgIlhPYmplY3QiKTsKLSAgICBwRm9ybURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJGb3JtIik7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBiYm94ID0gbV9wUGFnZS0+R2V0UGFnZUJCb3goKTsKLSAgICBtYXRyaXguVHJhbnNmb3JtUmVjdChiYm94KTsKLSAgICBwRm9ybURpY3QtPlNldEF0UmVjdCgiQkJveCIsIGJib3gpOwotICAgIHBTdHJlYW0tPkluaXRTdHJlYW0oKHVpbnQ4X3QqKWRhdGEsIHNpemUsIHBGb3JtRGljdCk7Ci0gICAgYnVmIDw8ICJxICIgPDwgbWF0cml4IDw8ICIgY20gIjsKK3ZvaWQgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjpQcm9jZXNzSW1hZ2UoQ0ZYX0J5dGVUZXh0QnVmJiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaikgeworICBpZiAoKHBJbWFnZU9iai0+bV9NYXRyaXguYSA9PSAwICYmIHBJbWFnZU9iai0+bV9NYXRyaXguYiA9PSAwKSB8fAorICAgICAgKHBJbWFnZU9iai0+bV9NYXRyaXguYyA9PSAwICYmIHBJbWFnZU9iai0+bV9NYXRyaXguZCA9PSAwKSkgeworICAgIHJldHVybjsKKyAgfQorICBidWYgPDwgInEgIiA8PCBwSW1hZ2VPYmotPm1fTWF0cml4IDw8ICIgY20gIjsKKyAgaWYgKCFwSW1hZ2VPYmotPm1fcEltYWdlLT5Jc0lubGluZSgpKSB7CisgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwSW1hZ2VPYmotPm1fcEltYWdlLT5HZXRTdHJlYW0oKTsKKyAgICBGWF9EV09SRCBkd1NhdmVkT2JqTnVtID0gcFN0cmVhbS0+R2V0T2JqTnVtKCk7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IFJlYWxpemVSZXNvdXJjZShwU3RyZWFtLCAiWE9iamVjdCIpOworICAgIGlmIChkd1NhdmVkT2JqTnVtID09IDApIHsKKyAgICAgIGlmIChwSW1hZ2VPYmotPm1fcEltYWdlKQorICAgICAgICBwSW1hZ2VPYmotPm1fcEltYWdlLT5SZWxlYXNlKCk7CisgICAgICBwSW1hZ2VPYmotPm1fcEltYWdlID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldEltYWdlKHBTdHJlYW0pOworICAgIH0KICAgICBidWYgPDwgIi8iIDw8IFBERl9OYW1lRW5jb2RlKG5hbWUpIDw8ICIgRG8gUVxuIjsKKyAgfQogfQotdm9pZCBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6OlRyYW5zZm9ybUNvbnRlbnQoQ0ZYX01hdHJpeCYgbWF0cml4KQotewotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQYWdlLT5tX3BGb3JtRGljdDsKLSAgICBDUERGX09iamVjdCogcENvbnRlbnQgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkNvbnRlbnRzIikgOiBOVUxMOwotICAgIGlmICghcENvbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6OlByb2Nlc3NGb3JtKENGWF9CeXRlVGV4dEJ1ZiYgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgaWYgKCFkYXRhIHx8ICFzaXplKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CisgIHBGb3JtRGljdC0+U2V0QXROYW1lKCJUeXBlIiwgIlhPYmplY3QiKTsKKyAgcEZvcm1EaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiRm9ybSIpOworICBDRlhfRmxvYXRSZWN0IGJib3ggPSBtX3BQYWdlLT5HZXRQYWdlQkJveCgpOworICBtYXRyaXguVHJhbnNmb3JtUmVjdChiYm94KTsKKyAgcEZvcm1EaWN0LT5TZXRBdFJlY3QoIkJCb3giLCBiYm94KTsKKyAgcFN0cmVhbS0+SW5pdFN0cmVhbSgodWludDhfdCopZGF0YSwgc2l6ZSwgcEZvcm1EaWN0KTsKKyAgYnVmIDw8ICJxICIgPDwgbWF0cml4IDw8ICIgY20gIjsKKyAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IFJlYWxpemVSZXNvdXJjZShwU3RyZWFtLCAiWE9iamVjdCIpOworICBidWYgPDwgIi8iIDw8IFBERl9OYW1lRW5jb2RlKG5hbWUpIDw8ICIgRG8gUVxuIjsKK30KK3ZvaWQgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjpUcmFuc2Zvcm1Db250ZW50KENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wUGFnZS0+bV9wRm9ybURpY3Q7CisgIENQREZfT2JqZWN0KiBwQ29udGVudCA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiQ29udGVudHMiKSA6IE5VTEw7CisgIGlmICghcENvbnRlbnQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgaW50IHR5cGUgPSBwQ29udGVudC0+R2V0VHlwZSgpOworICBpZiAodHlwZSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcENvbnRlbnQ7CisgICAgaW50IGlDb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgICBDUERGX1N0cmVhbUFjYyoqIHBDb250ZW50QXJyYXkgPQorICAgICAgICAoQ1BERl9TdHJlYW1BY2MqKilGWF9BbGxvYyhDUERGX1N0cmVhbUFjYyosIGlDb3VudCk7CisgICAgaW50IHNpemUgPSAwOworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsKKyAgICAgIHBDb250ZW50ID0gcEFycmF5LT5HZXRFbGVtZW50KGkpOworICAgICAgaWYgKCFwQ29udGVudCB8fCBwQ29udGVudC0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBDUERGX1N0cmVhbUFjYyogcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbUFjYygpOworICAgICAgcFN0cmVhbS0+TG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwQ29udGVudCk7CisgICAgICBwQ29udGVudEFycmF5W2ldID0gcFN0cmVhbTsKKyAgICAgIHNpemUgKz0gcENvbnRlbnRBcnJheVtpXS0+R2V0U2l6ZSgpICsgMTsKICAgICB9Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBpbnQgdHlwZSA9IHBDb250ZW50LT5HZXRUeXBlKCk7Ci0gICAgaWYgKHR5cGUgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQ29udGVudDsKLSAgICAgICAgaW50IGlDb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgQ1BERl9TdHJlYW1BY2MqKiBwQ29udGVudEFycmF5ID0gKENQREZfU3RyZWFtQWNjKiopRlhfQWxsb2MoQ1BERl9TdHJlYW1BY2MqLCBpQ291bnQpOwotICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBwQ29udGVudCA9IHBBcnJheS0+R2V0RWxlbWVudChpKTsKLSAgICAgICAgICAgIGlmICghcENvbnRlbnQgfHwgcENvbnRlbnQtPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUERGX1N0cmVhbUFjYyogcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbUFjYygpOwotICAgICAgICAgICAgcFN0cmVhbS0+TG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwQ29udGVudCk7Ci0gICAgICAgICAgICBwQ29udGVudEFycmF5W2ldID0gcFN0cmVhbTsKLSAgICAgICAgICAgIHNpemUgKz0gcENvbnRlbnRBcnJheVtpXS0+R2V0U2l6ZSgpICsgMTsKLSAgICAgICAgfQotICAgICAgICBpbnQgcG9zID0gMDsKLSAgICAgICAgdWludDhfdCogcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShwQnVmICsgcG9zLCBwQ29udGVudEFycmF5W2ldLT5HZXREYXRhKCksIHBDb250ZW50QXJyYXlbaV0tPkdldFNpemUoKSk7Ci0gICAgICAgICAgICBwb3MgKz0gcENvbnRlbnRBcnJheVtpXS0+R2V0U2l6ZSgpICsgMTsKLSAgICAgICAgICAgIHBCdWZbcG9zIC0gMV0gPSAnICc7Ci0gICAgICAgICAgICBkZWxldGUgcENvbnRlbnRBcnJheVtpXTsKLSAgICAgICAgfQotICAgICAgICBQcm9jZXNzRm9ybShidWYsIHBCdWYsIHNpemUsIG1hdHJpeCk7Ci0gICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgIEZYX0ZyZWUocENvbnRlbnRBcnJheSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgQ1BERl9TdHJlYW1BY2MgY29udGVudFN0cmVhbTsKLSAgICAgICAgY29udGVudFN0cmVhbS5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBDb250ZW50KTsKLSAgICAgICAgUHJvY2Vzc0Zvcm0oYnVmLCBjb250ZW50U3RyZWFtLkdldERhdGEoKSwgY29udGVudFN0cmVhbS5HZXRTaXplKCksIG1hdHJpeCk7CisgICAgaW50IHBvcyA9IDA7CisgICAgdWludDhfdCogcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgeworICAgICAgRlhTWVNfbWVtY3B5KHBCdWYgKyBwb3MsIHBDb250ZW50QXJyYXlbaV0tPkdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICBwQ29udGVudEFycmF5W2ldLT5HZXRTaXplKCkpOworICAgICAgcG9zICs9IHBDb250ZW50QXJyYXlbaV0tPkdldFNpemUoKSArIDE7CisgICAgICBwQnVmW3BvcyAtIDFdID0gJyAnOworICAgICAgZGVsZXRlIHBDb250ZW50QXJyYXlbaV07CiAgICAgfQotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOwotICAgIHBTdHJlYW0tPlNldERhdGEoYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7Ci0gICAgbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBTdHJlYW0pOwotICAgIG1fcFBhZ2UtPm1fcEZvcm1EaWN0LT5TZXRBdFJlZmVyZW5jZSgiQ29udGVudHMiLCBtX3BEb2N1bWVudCwgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOworICAgIFByb2Nlc3NGb3JtKGJ1ZiwgcEJ1Ziwgc2l6ZSwgbWF0cml4KTsKKyAgICBGWF9GcmVlKHBCdWYpOworICAgIEZYX0ZyZWUocENvbnRlbnRBcnJheSk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBQREZPQkpfU1RSRUFNKSB7CisgICAgQ1BERl9TdHJlYW1BY2MgY29udGVudFN0cmVhbTsKKyAgICBjb250ZW50U3RyZWFtLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcENvbnRlbnQpOworICAgIFByb2Nlc3NGb3JtKGJ1ZiwgY29udGVudFN0cmVhbS5HZXREYXRhKCksIGNvbnRlbnRTdHJlYW0uR2V0U2l6ZSgpLCBtYXRyaXgpOworICB9CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICBwU3RyZWFtLT5TZXREYXRhKGJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOworICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7CisgIG1fcFBhZ2UtPm1fcEZvcm1EaWN0LT5TZXRBdFJlZmVyZW5jZSgiQ29udGVudHMiLCBtX3BEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPkdldE9iak51bSgpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jcmVhdGUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKaW5kZXggN2I3YjYxYS4uNmYxOTMwNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKQEAgLTgsMjEyOSArOCwyMTYxIEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgiCiAjaW5jbHVkZSAiZWRpdGludC5oIgogCi0jZGVmaW5lIFBERl9PQkpFQ1RTVFJFQU1fTUFYTEVOR1RICSgyNTYgKiAxMDI0KQotI2RlZmluZSBQREZfWFJFRlNUUkVBTV9NQVhTSVpFCQkxMDAwMAotZXh0ZXJuIHZvaWQgRmxhdGVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX2RhdGEsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci1leHRlcm4gdm9pZCBGbGF0ZUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKKyNkZWZpbmUgUERGX09CSkVDVFNUUkVBTV9NQVhMRU5HVEggKDI1NiAqIDEwMjQpCisjZGVmaW5lIFBERl9YUkVGU1RSRUFNX01BWFNJWkUgMTAwMDAKK2V4dGVybiB2b2lkIEZsYXRlRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpOworZXh0ZXJuIHZvaWQgRmxhdGVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiBleHRlcm4gRlhfQk9PTCBJc1NpZ25hdHVyZURpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7Ci1pbnQzMl90IFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUgKnBGaWxlLCBGWF9GSUxFU0laRSYgb2Zmc2V0KQotewotICAgIGludDMyX3QgbGVuID0gMDsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgbnVsbCIpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gNTsKLSAgICAgICAgcmV0dXJuIDE7CitpbnQzMl90IFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUqIHBGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSYgb2Zmc2V0KSB7CisgIGludDMyX3QgbGVuID0gMDsKKyAgaWYgKHBPYmogPT0gTlVMTCkgeworICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgbnVsbCIpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfTlVMTDoKLSAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgbnVsbCIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERk9CSl9CT09MRUFOOgotICAgICAgICBjYXNlIFBERk9CSl9OVU1CRVI6Ci0gICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcocE9iai0+R2V0U3RyaW5nKCkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gbGVuICsgMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERk9CSl9TVFJJTkc6IHsKLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJIZXggPSAoKENQREZfU3RyaW5nKilwT2JqKS0+SXNIZXgoKTsKLSAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoUERGX0VuY29kZVN0cmluZyhzdHIsIGJIZXgpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQREZPQkpfTkFNRTogewotICAgICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhQREZfTmFtZUVuY29kZShzdHIpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogewotICAgICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlKiBwID0gKENQREZfUmVmZXJlbmNlKilwT2JqOwotICAgICAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHAtPkdldFJlZk9iak51bSgpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIFIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyA2OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJbIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZnNldCArPSAxOwotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHAgPSAoQ1BERl9BcnJheSopcE9iajsKLSAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcC0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwLT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEVsZW1lbnQtPkdldE9iak51bSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwRWxlbWVudC0+R2V0T2JqTnVtKCkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGVuICsgNTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwRWxlbWVudCwgcEZpbGUsIG9mZnNldCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJdIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZnNldCArPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9ESUNUSU9OQVJZOiB7Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIjw8IikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7Ci0gICAgICAgICAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gcC0+R2V0U3RhcnRQb3MoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IHAtPkdldE5leHRFbGVtZW50KHBvcywga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi8iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKFBERl9OYW1lRW5jb2RlKGtleSkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGVuICsgMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHBWYWx1ZS0+R2V0T2JqTnVtKCkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGVuICsgNTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwVmFsdWUsIHBGaWxlLCBvZmZzZXQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj4iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUkVBTTogewotICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwID0gKENQREZfU3RyZWFtKilwT2JqOwotICAgICAgICAgICAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwLT5HZXREaWN0KCksIHBGaWxlLCBvZmZzZXQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJzdHJlYW1cclxuIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZnNldCArPSA4OwotICAgICAgICAgICAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICAgICAgICAgICAgICBhY2MuTG9hZEFsbERhdGEocCwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCbG9jayhhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYWNjLkdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlxyXG5lbmRzdHJlYW0iKSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlQoRkFMU0UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgIG9mZnNldCArPSA1OwogICAgIHJldHVybiAxOworICB9CisgIHN3aXRjaCAocE9iai0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSBQREZPQkpfTlVMTDoKKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgbnVsbCIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IDU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERk9CSl9CT09MRUFOOgorICAgIGNhc2UgUERGT0JKX05VTUJFUjoKKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcocE9iai0+R2V0U3RyaW5nKCkpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERk9CSl9TVFJJTkc6IHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOworICAgICAgRlhfQk9PTCBiSGV4ID0gKChDUERGX1N0cmluZyopcE9iaiktPklzSGV4KCk7CisgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoUERGX0VuY29kZVN0cmluZyhzdHIsIGJIZXgpKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSBsZW47CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfTkFNRTogeworICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi8iKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOworICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKFBERl9OYW1lRW5jb2RlKHN0cikpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CisgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgQ1BERl9SZWZlcmVuY2UqIHAgPSAoQ1BERl9SZWZlcmVuY2UqKXBPYmo7CisgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwLT5HZXRSZWZPYmpOdW0oKSkpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiAiKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSBsZW4gKyA2OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX0FSUkFZOiB7CisgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiWyIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IDE7CisgICAgICBDUERGX0FycmF5KiBwID0gKENQREZfQXJyYXkqKXBPYmo7CisgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcC0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHAtPkdldEVsZW1lbnQoaSk7CisgICAgICAgIGlmIChwRWxlbWVudC0+R2V0T2JqTnVtKCkpIHsKKyAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQocEVsZW1lbnQtPkdldE9iak51bSgpKSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSIikpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBvZmZzZXQgKz0gbGVuICsgNTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoUERGX0NyZWF0b3JBcHBlbmRPYmplY3QocEVsZW1lbnQsIHBGaWxlLCBvZmZzZXQpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIl0iKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCI8PCIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHAgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqOworICAgICAgRlhfUE9TSVRJT04gcG9zID0gcC0+R2V0U3RhcnRQb3MoKTsKKyAgICAgIHdoaWxlIChwb3MpIHsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OworICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gcC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOworICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiLyIpKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKFBERl9OYW1lRW5jb2RlKGtleSkpKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICAgIGlmIChwVmFsdWUtPkdldE9iak51bSgpKSB7CisgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHBWYWx1ZS0+R2V0T2JqTnVtKCkpKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIFIiKSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIG9mZnNldCArPSBsZW4gKyA1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwVmFsdWUsIHBGaWxlLCBvZmZzZXQpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIj4+IikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9TVFJFQU06IHsKKyAgICAgIENQREZfU3RyZWFtKiBwID0gKENQREZfU3RyZWFtKilwT2JqOworICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHAtPkdldERpY3QoKSwgcEZpbGUsIG9mZnNldCkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJzdHJlYW1cclxuIikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gODsKKyAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKKyAgICAgIGFjYy5Mb2FkQWxsRGF0YShwLCBUUlVFKTsKKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2soYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSBhY2MuR2V0U2l6ZSgpOworICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJcclxuZW5kc3RyZWFtIikpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IGxlbjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgQVNTRVJUKEZBTFNFKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAxOwogfQotaW50MzJfdCBQREZfQ3JlYXRvcldyaXRlVHJhaWxlcihDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSogcEZpbGUsIENQREZfQXJyYXkqIHBJREFycmF5LCBGWF9CT09MIGJDb21wcmVzcykKLXsKLSAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSAwOwotICAgIGludDMyX3QgbGVuID0gMDsKLSAgICBGWFNZU19hc3NlcnQocERvY3VtZW50ICYmIHBGaWxlKTsKLSAgICBDUERGX1BhcnNlciAqcFBhcnNlciA9IChDUERGX1BhcnNlciopcERvY3VtZW50LT5HZXRQYXJzZXIoKTsKLSAgICBpZiAocFBhcnNlcikgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHAgPSBwUGFyc2VyLT5HZXRUcmFpbGVyKCk7Ci0gICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHAtPkdldFN0YXJ0UG9zKCk7Ci0gICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBwLT5HZXROZXh0RWxlbWVudChwb3MsIGtleSk7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IEZYX0JTVFJDKCJFbmNyeXB0IikgfHwga2V5ID09IEZYX0JTVFJDKCJTaXplIikgfHwga2V5ID09IEZYX0JTVFJDKCJGaWx0ZXIiKSB8fAotICAgICAgICAgICAgICAgICAgICBrZXkgPT0gRlhfQlNUUkMoIkluZGV4IikgfHwga2V5ID09IEZYX0JTVFJDKCJMZW5ndGgiKSB8fCBrZXkgPT0gRlhfQlNUUkMoIlByZXYiKSB8fAotICAgICAgICAgICAgICAgICAgICBrZXkgPT0gRlhfQlNUUkMoIlciKSB8fCBrZXkgPT0gRlhfQlNUUkMoIlhSZWZTdG0iKSB8fCBrZXkgPT0gRlhfQlNUUkMoIlR5cGUiKSB8fCBrZXkgPT0gRlhfQlNUUkMoIklEIikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiQ29tcHJlc3MgJiYga2V5ID09IEZYX0JTVFJDKCJEZWNvZGVQYXJtcyIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygoRlhfQlNUUkMoIi8iKSkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhQREZfTmFtZUVuY29kZShrZXkpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7Ci0gICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRPYmpOdW0oKSkgewotICAgICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHBWYWx1ZS0+R2V0T2JqTnVtKCkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwVmFsdWUsIHBGaWxlLCBvZmZzZXQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwSURBcnJheSkgewotICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoKEZYX0JTVFJDKCIvSUQiKSkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSAzOwotICAgICAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBJREFycmF5LCBwRmlsZSwgb2Zmc2V0KSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9mZnNldDsKLSAgICB9Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlxyXG4vUm9vdCAiKSkgPCAwKSB7CitpbnQzMl90IFBERl9DcmVhdG9yV3JpdGVUcmFpbGVyKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElEQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbXByZXNzKSB7CisgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7CisgIGludDMyX3QgbGVuID0gMDsKKyAgRlhTWVNfYXNzZXJ0KHBEb2N1bWVudCAmJiBwRmlsZSk7CisgIENQREZfUGFyc2VyKiBwUGFyc2VyID0gKENQREZfUGFyc2VyKilwRG9jdW1lbnQtPkdldFBhcnNlcigpOworICBpZiAocFBhcnNlcikgeworICAgIENQREZfRGljdGlvbmFyeSogcCA9IHBQYXJzZXItPkdldFRyYWlsZXIoKTsKKyAgICBGWF9QT1NJVElPTiBwb3MgPSBwLT5HZXRTdGFydFBvcygpOworICAgIHdoaWxlIChwb3MpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKKyAgICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBwLT5HZXROZXh0RWxlbWVudChwb3MsIGtleSk7CisgICAgICBpZiAoa2V5ID09IEZYX0JTVFJDKCJFbmNyeXB0IikgfHwga2V5ID09IEZYX0JTVFJDKCJTaXplIikgfHwKKyAgICAgICAgICBrZXkgPT0gRlhfQlNUUkMoIkZpbHRlciIpIHx8IGtleSA9PSBGWF9CU1RSQygiSW5kZXgiKSB8fAorICAgICAgICAgIGtleSA9PSBGWF9CU1RSQygiTGVuZ3RoIikgfHwga2V5ID09IEZYX0JTVFJDKCJQcmV2IikgfHwKKyAgICAgICAgICBrZXkgPT0gRlhfQlNUUkMoIlciKSB8fCBrZXkgPT0gRlhfQlNUUkMoIlhSZWZTdG0iKSB8fAorICAgICAgICAgIGtleSA9PSBGWF9CU1RSQygiVHlwZSIpIHx8IGtleSA9PSBGWF9CU1RSQygiSUQiKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChiQ29tcHJlc3MgJiYga2V5ID09IEZYX0JTVFJDKCJEZWNvZGVQYXJtcyIpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoKEZYX0JTVFJDKCIvIikpKSA8IDApIHsKICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwRG9jdW1lbnQtPkdldFJvb3QoKS0+R2V0T2JqTnVtKCkpKSA8IDApIHsKKyAgICAgIH0KKyAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhQREZfTmFtZUVuY29kZShrZXkpKSkgPCAwKSB7CiAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIFJcclxuIikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG9mZnNldCArPSBsZW4gKyAxNDsKLSAgICBpZiAocERvY3VtZW50LT5HZXRJbmZvKCkpIHsKLSAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9JbmZvICIpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSBsZW4gKyAxOworICAgICAgaWYgKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIHsKKyAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHBEb2N1bWVudC0+R2V0SW5mbygpLT5HZXRPYmpOdW0oKSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwVmFsdWUtPkdldE9iak51bSgpKSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSXHJcbiIpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIFIgIikpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gbGVuICsgMTI7CisgICAgICAgIG9mZnNldCArPSBsZW4gKyA2OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBWYWx1ZSwgcEZpbGUsIG9mZnNldCkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CiAgICAgfQogICAgIGlmIChwSURBcnJheSkgewotICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygoRlhfQlNUUkMoIi9JRCIpKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IDM7Ci0gICAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwSURBcnJheSwgcEZpbGUsIG9mZnNldCkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKChGWF9CU1RSQygiL0lEIikpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IDM7CisgICAgICBpZiAoUERGX0NyZWF0b3JBcHBlbmRPYmplY3QocElEQXJyYXksIHBGaWxlLCBvZmZzZXQpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CiAgICAgfQogICAgIHJldHVybiBvZmZzZXQ7CisgIH0KKyAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlxyXG4vUm9vdCAiKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHBEb2N1bWVudC0+R2V0Um9vdCgpLT5HZXRPYmpOdW0oKSkpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUlxyXG4iKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIG9mZnNldCArPSBsZW4gKyAxNDsKKyAgaWYgKHBEb2N1bWVudC0+R2V0SW5mbygpKSB7CisgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9JbmZvICIpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQocERvY3VtZW50LT5HZXRJbmZvKCktPkdldE9iak51bSgpKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSXHJcbiIpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb2Zmc2V0ICs9IGxlbiArIDEyOworICB9CisgIGlmIChwSURBcnJheSkgeworICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKChGWF9CU1RSQygiL0lEIikpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDM7CisgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBJREFycmF5LCBwRmlsZSwgb2Zmc2V0KSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG9mZnNldDsKIH0KLWludDMyX3QgUERGX0NyZWF0b3JXcml0ZUVuY3J5cHQoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIEZYX0RXT1JEIGR3T2JqTnVtLCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUgKnBGaWxlKQotewotICAgIGlmICghcEVuY3J5cHREaWN0KSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWFNZU19hc3NlcnQocEZpbGUpOwotICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7Ci0gICAgaW50MzJfdCBsZW4gPSAwOwotICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvRW5jcnlwdCIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBvZmZzZXQgKz0gODsKLSAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChkd09iak51bSkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSICIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBvZmZzZXQgKz0gbGVuICsgNjsKLSAgICByZXR1cm4gb2Zmc2V0OworaW50MzJfdCBQREZfQ3JlYXRvcldyaXRlRW5jcnlwdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdPYmpOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSogcEZpbGUpIHsKKyAgaWYgKCFwRW5jcnlwdERpY3QpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGWFNZU19hc3NlcnQocEZpbGUpOworICBGWF9GSUxFU0laRSBvZmZzZXQgPSAwOworICBpbnQzMl90IGxlbiA9IDA7CisgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvRW5jcnlwdCIpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgb2Zmc2V0ICs9IDg7CisgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChkd09iak51bSkpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiAiKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIG9mZnNldCArPSBsZW4gKyA2OworICByZXR1cm4gb2Zmc2V0OwogfQotRlhfQk9PTCBQREZfR2VuZXJhdGVGaWxlSUQoRlhfRFdPUkQgZHdTZWVkMSwgRlhfRFdPUkQgZHdTZWVkMiwgRlhfRFdPUkQqIHBCdWZmZXIpCi17Ci0gICAgaWYgKCFwQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdm9pZCogcENvbnRleHQgPSBGWF9SYW5kb21fTVRfU3RhcnQoZHdTZWVkMSk7Ci0gICAgaW50MzJfdCBpID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgICpwQnVmZmVyKysgPSBGWF9SYW5kb21fTVRfR2VuZXJhdGUocENvbnRleHQpOwotICAgIH0KLSAgICBGWF9SYW5kb21fTVRfQ2xvc2UocENvbnRleHQpOwotICAgIHBDb250ZXh0ID0gRlhfUmFuZG9tX01UX1N0YXJ0KGR3U2VlZDIpOwotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgKnBCdWZmZXIrKyA9IEZYX1JhbmRvbV9NVF9HZW5lcmF0ZShwQ29udGV4dCk7Ci0gICAgfQotICAgIEZYX1JhbmRvbV9NVF9DbG9zZShwQ29udGV4dCk7Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIFBERl9HZW5lcmF0ZUZpbGVJRChGWF9EV09SRCBkd1NlZWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTZWVkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwQnVmZmVyKSB7CisgIGlmICghcEJ1ZmZlcikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB2b2lkKiBwQ29udGV4dCA9IEZYX1JhbmRvbV9NVF9TdGFydChkd1NlZWQxKTsKKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICpwQnVmZmVyKysgPSBGWF9SYW5kb21fTVRfR2VuZXJhdGUocENvbnRleHQpOworICB9CisgIEZYX1JhbmRvbV9NVF9DbG9zZShwQ29udGV4dCk7CisgIHBDb250ZXh0ID0gRlhfUmFuZG9tX01UX1N0YXJ0KGR3U2VlZDIpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgKnBCdWZmZXIrKyA9IEZYX1JhbmRvbV9NVF9HZW5lcmF0ZShwQ29udGV4dCk7CisgIH0KKyAgRlhfUmFuZG9tX01UX0Nsb3NlKHBDb250ZXh0KTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1jbGFzcyBDUERGX0ZsYXRlRW5jb2RlcgotewotcHVibGljOgotICAgIENQREZfRmxhdGVFbmNvZGVyKCk7Ci0gICAgfkNQREZfRmxhdGVFbmNvZGVyKCk7Ci0gICAgRlhfQk9PTAkJSW5pdGlhbGl6ZShDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiRmxhdGVFbmNvZGUpOwotICAgIEZYX0JPT0wJCUluaXRpYWxpemUoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiRmxhdGVFbmNvZGUsIEZYX0JPT0wgYlhSZWZTdHJlYW0gPSBGQUxTRSk7Ci0gICAgdm9pZAkJQ2xvbmVEaWN0KCk7Ci0gICAgdWludDhfdCoJCQltX3BEYXRhOwotICAgIEZYX0RXT1JECQkJbV9kd1NpemU7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BEaWN0OwotICAgIEZYX0JPT0wJCQkJbV9iQ2xvbmVkOwotICAgIEZYX0JPT0wJCQkJbV9iTmV3RGF0YTsKLSAgICBDUERGX1N0cmVhbUFjYwkJbV9BY2M7CitjbGFzcyBDUERGX0ZsYXRlRW5jb2RlciB7CisgcHVibGljOgorICBDUERGX0ZsYXRlRW5jb2RlcigpOworICB+Q1BERl9GbGF0ZUVuY29kZXIoKTsKKyAgRlhfQk9PTCBJbml0aWFsaXplKENQREZfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJGbGF0ZUVuY29kZSk7CisgIEZYX0JPT0wgSW5pdGlhbGl6ZShjb25zdCB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsYXRlRW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiWFJlZlN0cmVhbSA9IEZBTFNFKTsKKyAgdm9pZCBDbG9uZURpY3QoKTsKKyAgdWludDhfdCogbV9wRGF0YTsKKyAgRlhfRFdPUkQgbV9kd1NpemU7CisgIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKKyAgRlhfQk9PTCBtX2JDbG9uZWQ7CisgIEZYX0JPT0wgbV9iTmV3RGF0YTsKKyAgQ1BERl9TdHJlYW1BY2MgbV9BY2M7CiB9OwotQ1BERl9GbGF0ZUVuY29kZXI6OkNQREZfRmxhdGVFbmNvZGVyKCkKLXsKLSAgICBtX3BEYXRhID0gTlVMTDsKLSAgICBtX2R3U2l6ZSA9IDA7Ci0gICAgbV9wRGljdCA9IE5VTEw7Ci0gICAgbV9iQ2xvbmVkID0gRkFMU0U7Ci0gICAgbV9iTmV3RGF0YSA9IEZBTFNFOworQ1BERl9GbGF0ZUVuY29kZXI6OkNQREZfRmxhdGVFbmNvZGVyKCkgeworICBtX3BEYXRhID0gTlVMTDsKKyAgbV9kd1NpemUgPSAwOworICBtX3BEaWN0ID0gTlVMTDsKKyAgbV9iQ2xvbmVkID0gRkFMU0U7CisgIG1fYk5ld0RhdGEgPSBGQUxTRTsKIH0KLXZvaWQgQ1BERl9GbGF0ZUVuY29kZXI6OkNsb25lRGljdCgpCi17Ci0gICAgaWYgKCFtX2JDbG9uZWQpIHsKLSAgICAgICAgbV9wRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKW1fcERpY3QtPkNsb25lKCk7Ci0gICAgICAgIG1fYkNsb25lZCA9IFRSVUU7Ci0gICAgfQotfQotRlhfQk9PTCBDUERGX0ZsYXRlRW5jb2Rlcjo6SW5pdGlhbGl6ZShDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiRmxhdGVFbmNvZGUpCi17Ci0gICAgbV9BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgVFJVRSk7Ci0gICAgaWYgKChwU3RyZWFtICYmIHBTdHJlYW0tPkdldERpY3QoKSAmJiBwU3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KCJGaWx0ZXIiKSkgfHwgIWJGbGF0ZUVuY29kZSkgewotICAgICAgICBpZiAocFN0cmVhbS0+R2V0RGljdCgpLT5LZXlFeGlzdCgiRmlsdGVyIikgJiYgIWJGbGF0ZUVuY29kZSkgewotICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MgZGVzdEFjYzsKLSAgICAgICAgICAgIGRlc3RBY2MuTG9hZEFsbERhdGEocFN0cmVhbSk7Ci0gICAgICAgICAgICBtX2R3U2l6ZSA9IGRlc3RBY2MuR2V0U2l6ZSgpOwotICAgICAgICAgICAgbV9wRGF0YSA9ICh1aW50OF90KilkZXN0QWNjLkRldGFjaERhdGEoKTsKLSAgICAgICAgICAgIG1fcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCk7Ci0gICAgICAgICAgICBtX3BEaWN0LT5SZW1vdmVBdChGWF9CU1RSQygiRmlsdGVyIikpOwotICAgICAgICAgICAgbV9iTmV3RGF0YSA9IFRSVUU7Ci0gICAgICAgICAgICBtX2JDbG9uZWQgPSBUUlVFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wRGF0YSA9ICh1aW50OF90KiltX0FjYy5HZXREYXRhKCk7Ci0gICAgICAgICAgICBtX2R3U2l6ZSA9IG1fQWNjLkdldFNpemUoKTsKLSAgICAgICAgICAgIG1fcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIG1fcERhdGEgPSBOVUxMOwotICAgIG1fZHdTaXplID0gMDsKLSAgICBtX2JOZXdEYXRhID0gVFJVRTsKK3ZvaWQgQ1BERl9GbGF0ZUVuY29kZXI6OkNsb25lRGljdCgpIHsKKyAgaWYgKCFtX2JDbG9uZWQpIHsKKyAgICBtX3BEaWN0ID0gKENQREZfRGljdGlvbmFyeSopbV9wRGljdC0+Q2xvbmUoKTsKICAgICBtX2JDbG9uZWQgPSBUUlVFOwotICAgIDo6RmxhdGVFbmNvZGUobV9BY2MuR2V0RGF0YSgpLCBtX0FjYy5HZXRTaXplKCksIG1fcERhdGEsIG1fZHdTaXplKTsKLSAgICBtX3BEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcFN0cmVhbS0+R2V0RGljdCgpLT5DbG9uZSgpOwotICAgIG1fcERpY3QtPlNldEF0SW50ZWdlcigiTGVuZ3RoIiwgbV9kd1NpemUpOwotICAgIG1fcERpY3QtPlNldEF0TmFtZSgiRmlsdGVyIiwgIkZsYXRlRGVjb2RlIik7Ci0gICAgbV9wRGljdC0+UmVtb3ZlQXQoIkRlY29kZVBhcm1zIik7Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9GbGF0ZUVuY29kZXI6OkluaXRpYWxpemUoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiRmxhdGVFbmNvZGUsIEZYX0JPT0wgYlhSZWZTdHJlYW0pCi17Ci0gICAgaWYgKCFiRmxhdGVFbmNvZGUpIHsKLSAgICAgICAgbV9wRGF0YSA9ICh1aW50OF90KilwQnVmZmVyOwotICAgICAgICBtX2R3U2l6ZSA9IHNpemU7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX2JOZXdEYXRhID0gVFJVRTsKLSAgICBpZiAoYlhSZWZTdHJlYW0pIHsKLSAgICAgICAgOjpGbGF0ZUVuY29kZShwQnVmZmVyLCBzaXplLCAxMiwgMSwgOCwgNywgbV9wRGF0YSwgbV9kd1NpemUpOworRlhfQk9PTCBDUERGX0ZsYXRlRW5jb2Rlcjo6SW5pdGlhbGl6ZShDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxhdGVFbmNvZGUpIHsKKyAgbV9BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgVFJVRSk7CisgIGlmICgocFN0cmVhbSAmJiBwU3RyZWFtLT5HZXREaWN0KCkgJiYKKyAgICAgICBwU3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KCJGaWx0ZXIiKSkgfHwKKyAgICAgICFiRmxhdGVFbmNvZGUpIHsKKyAgICBpZiAocFN0cmVhbS0+R2V0RGljdCgpLT5LZXlFeGlzdCgiRmlsdGVyIikgJiYgIWJGbGF0ZUVuY29kZSkgeworICAgICAgQ1BERl9TdHJlYW1BY2MgZGVzdEFjYzsKKyAgICAgIGRlc3RBY2MuTG9hZEFsbERhdGEocFN0cmVhbSk7CisgICAgICBtX2R3U2l6ZSA9IGRlc3RBY2MuR2V0U2l6ZSgpOworICAgICAgbV9wRGF0YSA9ICh1aW50OF90KilkZXN0QWNjLkRldGFjaERhdGEoKTsKKyAgICAgIG1fcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCk7CisgICAgICBtX3BEaWN0LT5SZW1vdmVBdChGWF9CU1RSQygiRmlsdGVyIikpOworICAgICAgbV9iTmV3RGF0YSA9IFRSVUU7CisgICAgICBtX2JDbG9uZWQgPSBUUlVFOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIDo6RmxhdGVFbmNvZGUocEJ1ZmZlciwgc2l6ZSwgbV9wRGF0YSwgbV9kd1NpemUpOworICAgICAgbV9wRGF0YSA9ICh1aW50OF90KiltX0FjYy5HZXREYXRhKCk7CisgICAgICBtX2R3U2l6ZSA9IG1fQWNjLkdldFNpemUoKTsKKyAgICAgIG1fcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CiAgICAgfQogICAgIHJldHVybiBUUlVFOworICB9CisgIG1fcERhdGEgPSBOVUxMOworICBtX2R3U2l6ZSA9IDA7CisgIG1fYk5ld0RhdGEgPSBUUlVFOworICBtX2JDbG9uZWQgPSBUUlVFOworICA6OkZsYXRlRW5jb2RlKG1fQWNjLkdldERhdGEoKSwgbV9BY2MuR2V0U2l6ZSgpLCBtX3BEYXRhLCBtX2R3U2l6ZSk7CisgIG1fcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCk7CisgIG1fcERpY3QtPlNldEF0SW50ZWdlcigiTGVuZ3RoIiwgbV9kd1NpemUpOworICBtX3BEaWN0LT5TZXRBdE5hbWUoIkZpbHRlciIsICJGbGF0ZURlY29kZSIpOworICBtX3BEaWN0LT5SZW1vdmVBdCgiRGVjb2RlUGFybXMiKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1DUERGX0ZsYXRlRW5jb2Rlcjo6fkNQREZfRmxhdGVFbmNvZGVyKCkKLXsKLSAgICBpZiAobV9iQ2xvbmVkICYmIG1fcERpY3QpIHsKLSAgICAgICAgbV9wRGljdC0+UmVsZWFzZSgpOwotICAgIH0KLSAgICBpZiAobV9iTmV3RGF0YSAmJiBtX3BEYXRhKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRGF0YSk7Ci0gICAgfQorRlhfQk9PTCBDUERGX0ZsYXRlRW5jb2Rlcjo6SW5pdGlhbGl6ZShjb25zdCB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGF0ZUVuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiWFJlZlN0cmVhbSkgeworICBpZiAoIWJGbGF0ZUVuY29kZSkgeworICAgIG1fcERhdGEgPSAodWludDhfdCopcEJ1ZmZlcjsKKyAgICBtX2R3U2l6ZSA9IHNpemU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgbV9iTmV3RGF0YSA9IFRSVUU7CisgIGlmIChiWFJlZlN0cmVhbSkgeworICAgIDo6RmxhdGVFbmNvZGUocEJ1ZmZlciwgc2l6ZSwgMTIsIDEsIDgsIDcsIG1fcERhdGEsIG1fZHdTaXplKTsKKyAgfSBlbHNlIHsKKyAgICA6OkZsYXRlRW5jb2RlKHBCdWZmZXIsIHNpemUsIG1fcERhdGEsIG1fZHdTaXplKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLWNsYXNzIENQREZfRW5jcnlwdG9yCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9FbmNyeXB0b3IoKTsKLSAgICB+Q1BERl9FbmNyeXB0b3IoKTsKLSAgICBGWF9CT09MCQlJbml0aWFsaXplKENQREZfQ3J5cHRvSGFuZGxlciogcEhhbmRsZXIsIGludCBvYmpudW0sIHVpbnQ4X3QqIHNyY19kYXRhLCBGWF9EV09SRCBzcmNfc2l6ZSk7Ci0gICAgdWludDhfdCoJCQltX3BEYXRhOwotICAgIEZYX0RXT1JECQkJbV9kd1NpemU7Ci0gICAgRlhfQk9PTAkJCQltX2JOZXdCdWY7CitDUERGX0ZsYXRlRW5jb2Rlcjo6fkNQREZfRmxhdGVFbmNvZGVyKCkgeworICBpZiAobV9iQ2xvbmVkICYmIG1fcERpY3QpIHsKKyAgICBtX3BEaWN0LT5SZWxlYXNlKCk7CisgIH0KKyAgaWYgKG1fYk5ld0RhdGEgJiYgbV9wRGF0YSkgeworICAgIEZYX0ZyZWUobV9wRGF0YSk7CisgIH0KK30KK2NsYXNzIENQREZfRW5jcnlwdG9yIHsKKyBwdWJsaWM6CisgIENQREZfRW5jcnlwdG9yKCk7CisgIH5DUERGX0VuY3J5cHRvcigpOworICBGWF9CT09MIEluaXRpYWxpemUoQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKTsKKyAgdWludDhfdCogbV9wRGF0YTsKKyAgRlhfRFdPUkQgbV9kd1NpemU7CisgIEZYX0JPT0wgbV9iTmV3QnVmOwogfTsKLUNQREZfRW5jcnlwdG9yOjpDUERGX0VuY3J5cHRvcigpCi17Ci0gICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgbV9kd1NpemUgPSAwOworQ1BERl9FbmNyeXB0b3I6OkNQREZfRW5jcnlwdG9yKCkgeworICBtX3BEYXRhID0gTlVMTDsKKyAgbV9kd1NpemUgPSAwOworICBtX2JOZXdCdWYgPSBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9FbmNyeXB0b3I6OkluaXRpYWxpemUoQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKSB7CisgIGlmIChzcmNfc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKHBIYW5kbGVyID09IE5VTEwpIHsKKyAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKXNyY19kYXRhOworICAgIG1fZHdTaXplID0gc3JjX3NpemU7CiAgICAgbV9iTmV3QnVmID0gRkFMU0U7Ci19Ci1GWF9CT09MIENQREZfRW5jcnlwdG9yOjpJbml0aWFsaXplKENQREZfQ3J5cHRvSGFuZGxlciogcEhhbmRsZXIsIGludCBvYmpudW0sIHVpbnQ4X3QqIHNyY19kYXRhLCBGWF9EV09SRCBzcmNfc2l6ZSkKLXsKLSAgICBpZiAoc3JjX3NpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKHBIYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgbV9wRGF0YSA9ICh1aW50OF90KilzcmNfZGF0YTsKLSAgICAgICAgbV9kd1NpemUgPSBzcmNfc2l6ZTsKLSAgICAgICAgbV9iTmV3QnVmID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX2R3U2l6ZSA9IHBIYW5kbGVyLT5FbmNyeXB0R2V0U2l6ZShvYmpudW0sIDAsIHNyY19kYXRhLCBzcmNfc2l6ZSk7Ci0gICAgbV9wRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fZHdTaXplKTsKLSAgICBwSGFuZGxlci0+RW5jcnlwdENvbnRlbnQob2JqbnVtLCAwLCBzcmNfZGF0YSwgc3JjX3NpemUsIG1fcERhdGEsIG1fZHdTaXplKTsKLSAgICBtX2JOZXdCdWYgPSBUUlVFOwogICAgIHJldHVybiBUUlVFOworICB9CisgIG1fZHdTaXplID0gcEhhbmRsZXItPkVuY3J5cHRHZXRTaXplKG9iam51bSwgMCwgc3JjX2RhdGEsIHNyY19zaXplKTsKKyAgbV9wRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fZHdTaXplKTsKKyAgcEhhbmRsZXItPkVuY3J5cHRDb250ZW50KG9iam51bSwgMCwgc3JjX2RhdGEsIHNyY19zaXplLCBtX3BEYXRhLCBtX2R3U2l6ZSk7CisgIG1fYk5ld0J1ZiA9IFRSVUU7CisgIHJldHVybiBUUlVFOwogfQotQ1BERl9FbmNyeXB0b3I6On5DUERGX0VuY3J5cHRvcigpCi17Ci0gICAgaWYgKG1fYk5ld0J1ZikgewotICAgICAgICBGWF9GcmVlKG1fcERhdGEpOwotICAgIH0KK0NQREZfRW5jcnlwdG9yOjp+Q1BERl9FbmNyeXB0b3IoKSB7CisgIGlmIChtX2JOZXdCdWYpIHsKKyAgICBGWF9GcmVlKG1fcERhdGEpOworICB9CiB9Ci1DUERGX09iamVjdFN0cmVhbTo6Q1BERl9PYmplY3RTdHJlYW0oKQotICAgIDogbV9kd09iak51bSgwKQotICAgICwgbV9pbmRleCgwKQoteworQ1BERl9PYmplY3RTdHJlYW06OkNQREZfT2JqZWN0U3RyZWFtKCkgOiBtX2R3T2JqTnVtKDApLCBtX2luZGV4KDApIHt9CitGWF9CT09MIENQREZfT2JqZWN0U3RyZWFtOjpTdGFydCgpIHsKKyAgbV9PYmpOdW1BcnJheS5SZW1vdmVBbGwoKTsKKyAgbV9PZmZzZXRBcnJheS5SZW1vdmVBbGwoKTsKKyAgbV9CdWZmZXIuQ2xlYXIoKTsKKyAgbV9kd09iak51bSA9IDA7CisgIG1faW5kZXggPSAwOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9PYmplY3RTdHJlYW06OlN0YXJ0KCkKLXsKLSAgICBtX09iak51bUFycmF5LlJlbW92ZUFsbCgpOwotICAgIG1fT2Zmc2V0QXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgbV9CdWZmZXIuQ2xlYXIoKTsKLSAgICBtX2R3T2JqTnVtID0gMDsKLSAgICBtX2luZGV4ID0gMDsKLSAgICByZXR1cm4gVFJVRTsKK2ludDMyX3QgQ1BERl9PYmplY3RTdHJlYW06OkNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKSB7CisgIG1fT2JqTnVtQXJyYXkuQWRkKGR3T2JqTnVtKTsKKyAgbV9PZmZzZXRBcnJheS5BZGQobV9CdWZmZXIuR2V0TGVuZ3RoKCkpOworICBtX0J1ZmZlciA8PCBwT2JqOworICByZXR1cm4gMTsKIH0KLWludDMyX3QgQ1BERl9PYmplY3RTdHJlYW06OkNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIGNvbnN0IENQREZfT2JqZWN0ICpwT2JqKQotewotICAgIG1fT2JqTnVtQXJyYXkuQWRkKGR3T2JqTnVtKTsKLSAgICBtX09mZnNldEFycmF5LkFkZChtX0J1ZmZlci5HZXRMZW5ndGgoKSk7Ci0gICAgbV9CdWZmZXIgPDwgcE9iajsKLSAgICByZXR1cm4gMTsKK2ludDMyX3QgQ1BERl9PYmplY3RTdHJlYW06OkNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZSkgeworICBtX09iak51bUFycmF5LkFkZChkd09iak51bSk7CisgIG1fT2Zmc2V0QXJyYXkuQWRkKG1fQnVmZmVyLkdldExlbmd0aCgpKTsKKyAgbV9CdWZmZXIuQXBwZW5kQmxvY2socEJ1ZmZlciwgZHdTaXplKTsKKyAgcmV0dXJuIDE7CiB9Ci1pbnQzMl90IENQREZfT2JqZWN0U3RyZWFtOjpDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLCBjb25zdCB1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBkd1NpemUpCi17Ci0gICAgbV9PYmpOdW1BcnJheS5BZGQoZHdPYmpOdW0pOwotICAgIG1fT2Zmc2V0QXJyYXkuQWRkKG1fQnVmZmVyLkdldExlbmd0aCgpKTsKLSAgICBtX0J1ZmZlci5BcHBlbmRCbG9jayhwQnVmZmVyLCBkd1NpemUpOwotICAgIHJldHVybiAxOwotfQotRlhfRklMRVNJWkUgQ1BERl9PYmplY3RTdHJlYW06OkVuZChDUERGX0NyZWF0b3IqIHBDcmVhdG9yKQotewotICAgIEZYU1lTX2Fzc2VydChwQ3JlYXRvcik7Ci0gICAgaWYgKG1fT2JqTnVtQXJyYXkuR2V0U2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSAqcEZpbGUgPSAmcENyZWF0b3ItPm1fRmlsZTsKLSAgICBDUERGX0NyeXB0b0hhbmRsZXIgKnBIYW5kbGVyID0gcENyZWF0b3ItPm1fcENyeXB0b0hhbmRsZXI7Ci0gICAgRlhfRklMRVNJWkUgT2JqT2Zmc2V0ID0gcENyZWF0b3ItPm1fT2Zmc2V0OwotICAgIGlmICghbV9kd09iak51bSkgewotICAgICAgICBtX2R3T2JqTnVtID0gKytwQ3JlYXRvci0+bV9kd0xhc3RPYmpOdW07Ci0gICAgfQotICAgIENGWF9CeXRlVGV4dEJ1ZiB0ZW1wQnVmZmVyOwotICAgIGludDMyX3QgaUNvdW50ID0gbV9PYmpOdW1BcnJheS5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICAgICAgdGVtcEJ1ZmZlciA8PCBtX09iak51bUFycmF5LkVsZW1lbnRBdChpKSA8PCBGWF9CU1RSQygiICIpIDw8IG1fT2Zmc2V0QXJyYXkuRWxlbWVudEF0KGkpIDw8IEZYX0JTVFJDKCIgIik7Ci0gICAgfQotICAgIEZYX0ZJTEVTSVpFICZvZmZzZXQgPSBwQ3JlYXRvci0+bV9PZmZzZXQ7Ci0gICAgaW50MzJfdCBsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQobV9kd09iak51bSk7Ci0gICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOworRlhfRklMRVNJWkUgQ1BERl9PYmplY3RTdHJlYW06OkVuZChDUERGX0NyZWF0b3IqIHBDcmVhdG9yKSB7CisgIEZYU1lTX2Fzc2VydChwQ3JlYXRvcik7CisgIGlmIChtX09iak51bUFycmF5LkdldFNpemUoKSA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSA9ICZwQ3JlYXRvci0+bV9GaWxlOworICBDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyID0gcENyZWF0b3ItPm1fcENyeXB0b0hhbmRsZXI7CisgIEZYX0ZJTEVTSVpFIE9iak9mZnNldCA9IHBDcmVhdG9yLT5tX09mZnNldDsKKyAgaWYgKCFtX2R3T2JqTnVtKSB7CisgICAgbV9kd09iak51bSA9ICsrcENyZWF0b3ItPm1fZHdMYXN0T2JqTnVtOworICB9CisgIENGWF9CeXRlVGV4dEJ1ZiB0ZW1wQnVmZmVyOworICBpbnQzMl90IGlDb3VudCA9IG1fT2JqTnVtQXJyYXkuR2V0U2l6ZSgpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIHRlbXBCdWZmZXIgPDwgbV9PYmpOdW1BcnJheS5FbGVtZW50QXQoaSkgPDwgRlhfQlNUUkMoIiAiKQorICAgICAgICAgICAgICAgPDwgbV9PZmZzZXRBcnJheS5FbGVtZW50QXQoaSkgPDwgRlhfQlNUUkMoIiAiKTsKKyAgfQorICBGWF9GSUxFU0laRSYgb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2Zmc2V0OworICBpbnQzMl90IGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChtX2R3T2JqTnVtKTsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgb2Zmc2V0ICs9IGxlbjsKKyAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBvYmpcclxuPDwvVHlwZSAvT2JqU3RtIC9OICIpKSkgPAorICAgICAgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBvZmZzZXQgKz0gbGVuOworICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZCgoRlhfRFdPUkQpaUNvdW50KSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIG9mZnNldCArPSBsZW47CisgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvRmlyc3QgIikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZCgoRlhfRFdPUkQpdGVtcEJ1ZmZlci5HZXRMZW5ndGgoKSkpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0xlbmd0aCAiKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIG9mZnNldCArPSBsZW4gKyAxNTsKKyAgaWYgKCFwQ3JlYXRvci0+bV9iQ29tcHJlc3MgJiYgIXBIYW5kbGVyKSB7CisgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQoCisgICAgICAgICAgICAgKEZYX0RXT1JEKSh0ZW1wQnVmZmVyLkdldExlbmd0aCgpICsgbV9CdWZmZXIuR2V0TGVuZ3RoKCkpKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIG9mZnNldCArPSBsZW47Ci0gICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBvYmpcclxuPDwvVHlwZSAvT2JqU3RtIC9OICIpKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIj4+c3RyZWFtXHJcbiIpKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2sodGVtcEJ1ZmZlci5HZXRCdWZmZXIoKSwgdGVtcEJ1ZmZlci5HZXRMZW5ndGgoKSkgPAorICAgICAgICAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2sobV9CdWZmZXIuR2V0QnVmZmVyKCksIG1fQnVmZmVyLkdldExlbmd0aCgpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb2Zmc2V0ICs9IGxlbiArIHRlbXBCdWZmZXIuR2V0TGVuZ3RoKCkgKyBtX0J1ZmZlci5HZXRMZW5ndGgoKTsKKyAgfSBlbHNlIHsKKyAgICB0ZW1wQnVmZmVyIDw8IG1fQnVmZmVyOworICAgIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXI7CisgICAgZW5jb2Rlci5Jbml0aWFsaXplKHRlbXBCdWZmZXIuR2V0QnVmZmVyKCksIHRlbXBCdWZmZXIuR2V0TGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdG9yLT5tX2JDb21wcmVzcyk7CisgICAgQ1BERl9FbmNyeXB0b3IgZW5jcnlwdG9yOworICAgIGVuY3J5cHRvci5Jbml0aWFsaXplKHBIYW5kbGVyLCBtX2R3T2JqTnVtLCBlbmNvZGVyLm1fcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5tX2R3U2l6ZSk7CisgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQoZW5jcnlwdG9yLm1fZHdTaXplKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIG9mZnNldCArPSBsZW47Ci0gICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQoKEZYX0RXT1JEKWlDb3VudCkpIDwgMCkgeworICAgIGlmIChwQ3JlYXRvci0+bV9iQ29tcHJlc3MpIHsKKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvRmlsdGVyIC9GbGF0ZURlY29kZSIpKSA8IDApIHsKICAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IDIwOwogICAgIH0KLSAgICBvZmZzZXQgKz0gbGVuOwotICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvRmlyc3QgIikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCI+PnN0cmVhbVxyXG4iKSkpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZCgoRlhfRFdPUkQpdGVtcEJ1ZmZlci5HZXRMZW5ndGgoKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHBGaWxlLT5BcHBlbmRCbG9jayhlbmNyeXB0b3IubV9wRGF0YSwgZW5jcnlwdG9yLm1fZHdTaXplKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9MZW5ndGggIikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG9mZnNldCArPSBsZW4gKyAxNTsKLSAgICBpZiAoIXBDcmVhdG9yLT5tX2JDb21wcmVzcyAmJiAhcEhhbmRsZXIpIHsKLSAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQoKEZYX0RXT1JEKSh0ZW1wQnVmZmVyLkdldExlbmd0aCgpICsgbV9CdWZmZXIuR2V0TGVuZ3RoKCkpKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCI+PnN0cmVhbVxyXG4iKSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2sodGVtcEJ1ZmZlci5HZXRCdWZmZXIoKSwgdGVtcEJ1ZmZlci5HZXRMZW5ndGgoKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCbG9jayhtX0J1ZmZlci5HZXRCdWZmZXIoKSwgbV9CdWZmZXIuR2V0TGVuZ3RoKCkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSBsZW4gKyB0ZW1wQnVmZmVyLkdldExlbmd0aCgpICsgbV9CdWZmZXIuR2V0TGVuZ3RoKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGVtcEJ1ZmZlciA8PCBtX0J1ZmZlcjsKLSAgICAgICAgQ1BERl9GbGF0ZUVuY29kZXIgZW5jb2RlcjsKLSAgICAgICAgZW5jb2Rlci5Jbml0aWFsaXplKHRlbXBCdWZmZXIuR2V0QnVmZmVyKCksIHRlbXBCdWZmZXIuR2V0TGVuZ3RoKCksIHBDcmVhdG9yLT5tX2JDb21wcmVzcyk7Ci0gICAgICAgIENQREZfRW5jcnlwdG9yIGVuY3J5cHRvcjsKLSAgICAgICAgZW5jcnlwdG9yLkluaXRpYWxpemUocEhhbmRsZXIsIG1fZHdPYmpOdW0sIGVuY29kZXIubV9wRGF0YSwgZW5jb2Rlci5tX2R3U2l6ZSk7Ci0gICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKGVuY3J5cHRvci5tX2R3U2l6ZSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSBsZW47Ci0gICAgICAgIGlmIChwQ3JlYXRvci0+bV9iQ29tcHJlc3MpIHsKLSAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvRmlsdGVyIC9GbGF0ZURlY29kZSIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gMjA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCI+PnN0cmVhbVxyXG4iKSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2soZW5jcnlwdG9yLm1fcERhdGEsIGVuY3J5cHRvci5tX2R3U2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IGxlbiArIGVuY3J5cHRvci5tX2R3U2l6ZTsKLSAgICB9Ci0gICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJcclxuZW5kc3RyZWFtXHJcbmVuZG9ialxyXG4iKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG9mZnNldCArPSBsZW47Ci0gICAgcmV0dXJuIE9iak9mZnNldDsKKyAgICBvZmZzZXQgKz0gbGVuICsgZW5jcnlwdG9yLm1fZHdTaXplOworICB9CisgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZHN0cmVhbVxyXG5lbmRvYmpcclxuIikpKSA8CisgICAgICAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIG9mZnNldCArPSBsZW47CisgIHJldHVybiBPYmpPZmZzZXQ7CiB9CiBDUERGX1hSZWZTdHJlYW06OkNQREZfWFJlZlN0cmVhbSgpCi0gICAgOiBtX1ByZXZPZmZzZXQoMCkKLSAgICAsIG1fZHdUZW1wT2JqTnVtKDApCi0gICAgLCBtX2lTZWcoMCkKLXsKKyAgICA6IG1fUHJldk9mZnNldCgwKSwgbV9kd1RlbXBPYmpOdW0oMCksIG1faVNlZygwKSB7fQorRlhfQk9PTCBDUERGX1hSZWZTdHJlYW06OlN0YXJ0KCkgeworICBtX0luZGV4QXJyYXkuUmVtb3ZlQWxsKCk7CisgIG1fQnVmZmVyLkNsZWFyKCk7CisgIG1faVNlZyA9IDA7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDUERGX1hSZWZTdHJlYW06OlN0YXJ0KCkKLXsKLSAgICBtX0luZGV4QXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgbV9CdWZmZXIuQ2xlYXIoKTsKLSAgICBtX2lTZWcgPSAwOwotICAgIHJldHVybiBUUlVFOworaW50MzJfdCBDUERGX1hSZWZTdHJlYW06OkNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ3JlYXRvciogcENyZWF0b3IpIHsKKyAgaWYgKCFwQ3JlYXRvcikgeworICAgIHJldHVybiAwOworICB9CisgIG1fT2JqU3RyZWFtLkNvbXByZXNzSW5kaXJlY3RPYmplY3QoZHdPYmpOdW0sIHBPYmopOworICBpZiAobV9PYmpTdHJlYW0ubV9PYmpOdW1BcnJheS5HZXRTaXplKCkgPCBwQ3JlYXRvci0+bV9PYmplY3RTdHJlYW1TaXplICYmCisgICAgICBtX09ialN0cmVhbS5tX0J1ZmZlci5HZXRMZW5ndGgoKSA8IFBERl9PQkpFQ1RTVFJFQU1fTUFYTEVOR1RIKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIEVuZE9iamVjdFN0cmVhbShwQ3JlYXRvcik7CiB9Ci1pbnQzMl90IENQREZfWFJlZlN0cmVhbTo6Q29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QgKnBPYmosIENQREZfQ3JlYXRvciAqcENyZWF0b3IpCi17Ci0gICAgaWYgKCFwQ3JlYXRvcikgewotICAgICAgICByZXR1cm4gMDsKK2ludDMyX3QgQ1BERl9YUmVmU3RyZWFtOjpDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ3JlYXRvciogcENyZWF0b3IpIHsKKyAgaWYgKCFwQ3JlYXRvcikgeworICAgIHJldHVybiAwOworICB9CisgIG1fT2JqU3RyZWFtLkNvbXByZXNzSW5kaXJlY3RPYmplY3QoZHdPYmpOdW0sIHBCdWZmZXIsIGR3U2l6ZSk7CisgIGlmIChtX09ialN0cmVhbS5tX09iak51bUFycmF5LkdldFNpemUoKSA8IHBDcmVhdG9yLT5tX09iamVjdFN0cmVhbVNpemUgJiYKKyAgICAgIG1fT2JqU3RyZWFtLm1fQnVmZmVyLkdldExlbmd0aCgpIDwgUERGX09CSkVDVFNUUkVBTV9NQVhMRU5HVEgpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gRW5kT2JqZWN0U3RyZWFtKHBDcmVhdG9yKTsKK30KK3N0YXRpYyB2b2lkIF9BcHBlbmRJbmRleDAoQ0ZYX0J5dGVUZXh0QnVmJiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpcnN0T2JqZWN0ID0gVFJVRSkgeworICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7CisgIGJ1ZmZlci5BcHBlbmRCeXRlKDApOworICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7CisgIGlmIChiRmlyc3RPYmplY3QpIHsKKyAgICBidWZmZXIuQXBwZW5kQnl0ZSgweEZGKTsKKyAgICBidWZmZXIuQXBwZW5kQnl0ZSgweEZGKTsKKyAgfSBlbHNlIHsKKyAgICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKKyAgICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKKyAgfQorfQorc3RhdGljIHZvaWQgX0FwcGVuZEluZGV4MShDRlhfQnl0ZVRleHRCdWYmIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0KSB7CisgIGJ1ZmZlci5BcHBlbmRCeXRlKDEpOworICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMjQob2Zmc2V0KSk7CisgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQxNihvZmZzZXQpKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDgob2Zmc2V0KSk7CisgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQwKG9mZnNldCkpOworICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Cit9CitzdGF0aWMgdm9pZCBfQXBwZW5kSW5kZXgyKENGWF9CeXRlVGV4dEJ1ZiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgpIHsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoMik7CisgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQyNChvYmpudW0pKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDE2KG9iam51bSkpOworICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUOChvYmpudW0pKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDAob2JqbnVtKSk7CisgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ4KGluZGV4KSk7CisgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQwKGluZGV4KSk7Cit9CitpbnQzMl90IENQREZfWFJlZlN0cmVhbTo6RW5kT2JqZWN0U3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IsIEZYX0JPT0wgYkVPRikgeworICBGWF9GSUxFU0laRSBvYmpPZmZzZXQgPSAwOworICBpZiAoYkVPRikgeworICAgIG9iak9mZnNldCA9IG1fT2JqU3RyZWFtLkVuZChwQ3JlYXRvcik7CisgICAgaWYgKG9iak9mZnNldCA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgbV9PYmpTdHJlYW0uQ29tcHJlc3NJbmRpcmVjdE9iamVjdChkd09iak51bSwgcE9iaik7Ci0gICAgaWYgKG1fT2JqU3RyZWFtLm1fT2JqTnVtQXJyYXkuR2V0U2l6ZSgpIDwgcENyZWF0b3ItPm1fT2JqZWN0U3RyZWFtU2l6ZSAmJgotICAgICAgICAgICAgbV9PYmpTdHJlYW0ubV9CdWZmZXIuR2V0TGVuZ3RoKCkgPCBQREZfT0JKRUNUU1RSRUFNX01BWExFTkdUSCkgewotICAgICAgICByZXR1cm4gMTsKKyAgfQorICBGWF9EV09SRCYgZHdPYmpTdG1OdW0gPSBtX09ialN0cmVhbS5tX2R3T2JqTnVtOworICBpZiAoIWR3T2JqU3RtTnVtKSB7CisgICAgZHdPYmpTdG1OdW0gPSArK3BDcmVhdG9yLT5tX2R3TGFzdE9iak51bTsKKyAgfQorICBpbnQzMl90IGlTaXplID0gbV9PYmpTdHJlYW0ubV9PYmpOdW1BcnJheS5HZXRTaXplKCk7CisgIGludDMyX3QgaVNlZyA9IG1fSW5kZXhBcnJheS5HZXRTaXplKCkgLyAyOworICBpZiAoIShwQ3JlYXRvci0+bV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkpIHsKKyAgICBpZiAobV9kd1RlbXBPYmpOdW0gPT0gMCkgeworICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlcik7CisgICAgICBtX2R3VGVtcE9iak51bSsrOwogICAgIH0KLSAgICByZXR1cm4gRW5kT2JqZWN0U3RyZWFtKHBDcmVhdG9yKTsKLX0KLWludDMyX3QgQ1BERl9YUmVmU3RyZWFtOjpDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLCBjb25zdCB1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBkd1NpemUsIENQREZfQ3JlYXRvciAqcENyZWF0b3IpCi17Ci0gICAgaWYgKCFwQ3JlYXRvcikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgbV9PYmpTdHJlYW0uQ29tcHJlc3NJbmRpcmVjdE9iamVjdChkd09iak51bSwgcEJ1ZmZlciwgZHdTaXplKTsKLSAgICBpZiAobV9PYmpTdHJlYW0ubV9PYmpOdW1BcnJheS5HZXRTaXplKCkgPCBwQ3JlYXRvci0+bV9PYmplY3RTdHJlYW1TaXplICYmCi0gICAgICAgICAgICBtX09ialN0cmVhbS5tX0J1ZmZlci5HZXRMZW5ndGgoKSA8IFBERl9PQkpFQ1RTVFJFQU1fTUFYTEVOR1RIKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gRW5kT2JqZWN0U3RyZWFtKHBDcmVhdG9yKTsKLX0KLXN0YXRpYyB2b2lkIF9BcHBlbmRJbmRleDAoQ0ZYX0J5dGVUZXh0QnVmJiBidWZmZXIsIEZYX0JPT0wgYkZpcnN0T2JqZWN0ID0gIFRSVUUpCi17Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgaWYgKGJGaXJzdE9iamVjdCkgewotICAgICAgICBidWZmZXIuQXBwZW5kQnl0ZSgweEZGKTsKLSAgICAgICAgYnVmZmVyLkFwcGVuZEJ5dGUoMHhGRik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgICAgIGJ1ZmZlci5BcHBlbmRCeXRlKDApOwotICAgIH0KLX0KLXN0YXRpYyB2b2lkIF9BcHBlbmRJbmRleDEoQ0ZYX0J5dGVUZXh0QnVmJiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCkKLXsKLSAgICBidWZmZXIuQXBwZW5kQnl0ZSgxKTsKLSAgICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMjQob2Zmc2V0KSk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDE2KG9mZnNldCkpOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ4KG9mZnNldCkpOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQwKG9mZnNldCkpOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKDApOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKDApOwotfQotc3RhdGljIHZvaWQgX0FwcGVuZEluZGV4MihDRlhfQnl0ZVRleHRCdWYmIGJ1ZmZlciwgRlhfRFdPUkQgb2JqbnVtLCBpbnQzMl90IGluZGV4KQotewotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKDIpOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQyNChvYmpudW0pKTsKLSAgICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMTYob2JqbnVtKSk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDgob2JqbnVtKSk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDAob2JqbnVtKSk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDgoaW5kZXgpKTsKLSAgICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMChpbmRleCkpOwotfQotaW50MzJfdCBDUERGX1hSZWZTdHJlYW06OkVuZE9iamVjdFN0cmVhbShDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBGWF9CT09MIGJFT0YpCi17Ci0gICAgRlhfRklMRVNJWkUgb2JqT2Zmc2V0ID0gMDsKLSAgICBpZiAoYkVPRikgewotICAgICAgICBvYmpPZmZzZXQgPSBtX09ialN0cmVhbS5FbmQocENyZWF0b3IpOwotICAgICAgICBpZiAob2JqT2Zmc2V0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIEZYX0RXT1JEIGVuZF9udW0gPSBtX0luZGV4QXJyYXkuR2V0QXQoKGlTZWcgLSAxKSAqIDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgbV9JbmRleEFycmF5LkdldEF0KChpU2VnIC0gMSkgKiAyICsgMSk7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICBmb3IgKDsgbV9kd1RlbXBPYmpOdW0gPCBlbmRfbnVtOyBtX2R3VGVtcE9iak51bSsrKSB7CisgICAgICBGWF9GSUxFU0laRSogb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KG1fZHdUZW1wT2JqTnVtKTsKKyAgICAgIGlmIChvZmZzZXQpIHsKKyAgICAgICAgaWYgKGluZGV4ID49IGlTaXplIHx8CisgICAgICAgICAgICBtX2R3VGVtcE9iak51bSAhPSBtX09ialN0cmVhbS5tX09iak51bUFycmF5W2luZGV4XSkgeworICAgICAgICAgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIF9BcHBlbmRJbmRleDIobV9CdWZmZXIsIGR3T2JqU3RtTnVtLCBpbmRleCsrKTsKICAgICAgICAgfQotICAgIH0KLSAgICBGWF9EV09SRCAmZHdPYmpTdG1OdW0gPSBtX09ialN0cmVhbS5tX2R3T2JqTnVtOwotICAgIGlmICghZHdPYmpTdG1OdW0pIHsKLSAgICAgICAgZHdPYmpTdG1OdW0gPSArK3BDcmVhdG9yLT5tX2R3TGFzdE9iak51bTsKLSAgICB9Ci0gICAgaW50MzJfdCBpU2l6ZSA9IG1fT2JqU3RyZWFtLm1fT2JqTnVtQXJyYXkuR2V0U2l6ZSgpOwotICAgIGludDMyX3QgaVNlZyA9IG1fSW5kZXhBcnJheS5HZXRTaXplKCkgLyAyOwotICAgIGlmICghKHBDcmVhdG9yLT5tX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSkgewotICAgICAgICBpZiAobV9kd1RlbXBPYmpOdW0gPT0gMCkgewotICAgICAgICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlcik7Ci0gICAgICAgICAgICBtX2R3VGVtcE9iak51bSsrOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGVuZF9udW0gPSBtX0luZGV4QXJyYXkuR2V0QXQoKGlTZWcgLSAxKSAqIDIpICsgbV9JbmRleEFycmF5LkdldEF0KChpU2VnIC0gMSkgKiAyICsgMSk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGZvciAoOyBtX2R3VGVtcE9iak51bSA8IGVuZF9udW07IG1fZHdUZW1wT2JqTnVtKyspIHsKLSAgICAgICAgICAgIEZYX0ZJTEVTSVpFKiBvZmZzZXQgPSBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXQuR2V0UHRyQXQobV9kd1RlbXBPYmpOdW0pOwotICAgICAgICAgICAgaWYgKG9mZnNldCkgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBpU2l6ZSB8fCBtX2R3VGVtcE9iak51bSAhPSBtX09ialN0cmVhbS5tX09iak51bUFycmF5W2luZGV4XSkgewotICAgICAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCAqb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgyKG1fQnVmZmVyLCBkd09ialN0bU51bSwgaW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlTaXplID4gMCAmJiBiRU9GKSB7Ci0gICAgICAgICAgICBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXQuQWRkKGR3T2JqU3RtTnVtLCAxKTsKLSAgICAgICAgICAgIHBDcmVhdG9yLT5tX09iamVjdFNpemUuQWRkKGR3T2JqU3RtTnVtLCAxKTsKLSAgICAgICAgICAgIHBDcmVhdG9yLT5tX09iamVjdE9mZnNldFtkd09ialN0bU51bV0gPSBvYmpPZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9pU2VnID0gaVNlZzsKLSAgICAgICAgaWYgKGJFT0YpIHsKLSAgICAgICAgICAgIG1fT2JqU3RyZWFtLlN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGludDMyX3QgJmogPSBtX09ialN0cmVhbS5tX2luZGV4OwotICAgIGZvciAoaW50IGkgPSBtX2lTZWc7IGkgPCBpU2VnOyBpKyspIHsKLSAgICAgICAgRlhfRFdPUkQgc3RhcnQgPSBtX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyKTsKLSAgICAgICAgRlhfRFdPUkQgZW5kID0gbV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMiArIDEpICsgc3RhcnQ7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgbSA9IHN0YXJ0OyBtIDwgZW5kOyBtKyspIHsKLSAgICAgICAgICAgIGlmIChqID49IGlTaXplIHx8IG0gIT0gbV9PYmpTdHJlYW0ubV9PYmpOdW1BcnJheS5FbGVtZW50QXQoaikpIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXRbbV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgyKG1fQnVmZmVyLCBkd09ialN0bU51bSwgaisrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlciwgRkFMU0UpOworICAgICAgfQogICAgIH0KICAgICBpZiAoaVNpemUgPiAwICYmIGJFT0YpIHsKLSAgICAgICAgX0FwcGVuZEluZGV4MShtX0J1ZmZlciwgb2JqT2Zmc2V0KTsKLSAgICAgICAgbV9JbmRleEFycmF5LkFkZChkd09ialN0bU51bSk7Ci0gICAgICAgIG1fSW5kZXhBcnJheS5BZGQoMSk7Ci0gICAgICAgIGlTZWcgKz0gMTsKKyAgICAgIHBDcmVhdG9yLT5tX09iamVjdE9mZnNldC5BZGQoZHdPYmpTdG1OdW0sIDEpOworICAgICAgcENyZWF0b3ItPm1fT2JqZWN0U2l6ZS5BZGQoZHdPYmpTdG1OdW0sIDEpOworICAgICAgcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0W2R3T2JqU3RtTnVtXSA9IG9iak9mZnNldDsKICAgICB9CiAgICAgbV9pU2VnID0gaVNlZzsKICAgICBpZiAoYkVPRikgewotICAgICAgICBtX09ialN0cmVhbS5TdGFydCgpOworICAgICAgbV9PYmpTdHJlYW0uU3RhcnQoKTsKICAgICB9CiAgICAgcmV0dXJuIDE7CisgIH0KKyAgaW50MzJfdCYgaiA9IG1fT2JqU3RyZWFtLm1faW5kZXg7CisgIGZvciAoaW50IGkgPSBtX2lTZWc7IGkgPCBpU2VnOyBpKyspIHsKKyAgICBGWF9EV09SRCBzdGFydCA9IG1fSW5kZXhBcnJheS5FbGVtZW50QXQoaSAqIDIpOworICAgIEZYX0RXT1JEIGVuZCA9IG1fSW5kZXhBcnJheS5FbGVtZW50QXQoaSAqIDIgKyAxKSArIHN0YXJ0OworICAgIGZvciAoRlhfRFdPUkQgbSA9IHN0YXJ0OyBtIDwgZW5kOyBtKyspIHsKKyAgICAgIGlmIChqID49IGlTaXplIHx8IG0gIT0gbV9PYmpTdHJlYW0ubV9PYmpOdW1BcnJheS5FbGVtZW50QXQoaikpIHsKKyAgICAgICAgX0FwcGVuZEluZGV4MShtX0J1ZmZlciwgcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0W21dKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9BcHBlbmRJbmRleDIobV9CdWZmZXIsIGR3T2JqU3RtTnVtLCBqKyspOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoaVNpemUgPiAwICYmIGJFT0YpIHsKKyAgICBfQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCBvYmpPZmZzZXQpOworICAgIG1fSW5kZXhBcnJheS5BZGQoZHdPYmpTdG1OdW0pOworICAgIG1fSW5kZXhBcnJheS5BZGQoMSk7CisgICAgaVNlZyArPSAxOworICB9CisgIG1faVNlZyA9IGlTZWc7CisgIGlmIChiRU9GKSB7CisgICAgbV9PYmpTdHJlYW0uU3RhcnQoKTsKKyAgfQorICByZXR1cm4gMTsKIH0KLUZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpHZW5lcmF0ZVhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvciwgRlhfQk9PTCBiRU9GKQotewotICAgIEZYX0ZJTEVTSVpFIG9mZnNldF90bXAgPSBwQ3JlYXRvci0+bV9PZmZzZXQ7Ci0gICAgRlhfRFdPUkQgb2JqbnVtID0gKytwQ3JlYXRvci0+bV9kd0xhc3RPYmpOdW07Ci0gICAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlICpwRmlsZSA9ICZwQ3JlYXRvci0+bV9GaWxlOwotICAgIEZYX0JPT0wgYkluY3JlbWVudGFsID0gKHBDcmVhdG9yLT5tX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwOwotICAgIGlmIChiSW5jcmVtZW50YWwpIHsKLSAgICAgICAgQWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KG9iam51bSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yICg7IG1fZHdUZW1wT2JqTnVtIDwgcENyZWF0b3ItPm1fZHdMYXN0T2JqTnVtOyBtX2R3VGVtcE9iak51bSsrKSB7Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSogb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KG1fZHdUZW1wT2JqTnVtKTsKLSAgICAgICAgICAgIGlmIChvZmZzZXQpIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCAqb2Zmc2V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlciwgRkFMU0UpOwotICAgICAgICAgICAgfQotICAgICAgICB9CitGWF9CT09MIENQREZfWFJlZlN0cmVhbTo6R2VuZXJhdGVYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVPRikgeworICBGWF9GSUxFU0laRSBvZmZzZXRfdG1wID0gcENyZWF0b3ItPm1fT2Zmc2V0OworICBGWF9EV09SRCBvYmpudW0gPSArK3BDcmVhdG9yLT5tX2R3TGFzdE9iak51bTsKKyAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSA9ICZwQ3JlYXRvci0+bV9GaWxlOworICBGWF9CT09MIGJJbmNyZW1lbnRhbCA9IChwQ3JlYXRvci0+bV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMDsKKyAgaWYgKGJJbmNyZW1lbnRhbCkgeworICAgIEFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheShvYmpudW0pOworICB9IGVsc2UgeworICAgIGZvciAoOyBtX2R3VGVtcE9iak51bSA8IHBDcmVhdG9yLT5tX2R3TGFzdE9iak51bTsgbV9kd1RlbXBPYmpOdW0rKykgeworICAgICAgRlhfRklMRVNJWkUqIG9mZnNldCA9IHBDcmVhdG9yLT5tX09iamVjdE9mZnNldC5HZXRQdHJBdChtX2R3VGVtcE9iak51bSk7CisgICAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlciwgRkFMU0UpOworICAgICAgfQogICAgIH0KLSAgICBfQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCBvZmZzZXRfdG1wKTsKLSAgICBGWF9GSUxFU0laRSAmb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2Zmc2V0OwotICAgIGludDMyX3QgbGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKG9iam51bSk7Ci0gICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsIG9mZnNldF90bXApOworICBGWF9GSUxFU0laRSYgb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2Zmc2V0OworICBpbnQzMl90IGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChvYmpudW0pOworICBpZiAobGVuIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBvZmZzZXQgKz0gbGVuOworICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoCisgICAgICAgICAgIEZYX0JTVFJDKCIgMCBvYmpcclxuPDwvVHlwZSAvWFJlZi9XWzEgNCAyXS9JbmRleFsiKSkpIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBvZmZzZXQgKz0gbGVuOworICBpZiAoIWJJbmNyZW1lbnRhbCkgeworICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKDApKSA8IDApIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgb2Zmc2V0ICs9IGxlbjsKLSAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIG9ialxyXG48PC9UeXBlIC9YUmVmL1dbMSA0IDJdL0luZGV4WyIpKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkpIDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBvZmZzZXQgKz0gbGVuOwotICAgIGlmICghYkluY3JlbWVudGFsKSB7Ci0gICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKDApKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSBsZW4gKyAxOwotICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChvYmpudW0gKyAxKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IGxlbjsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQzMl90IGlTZWcgPSBtX0luZGV4QXJyYXkuR2V0U2l6ZSgpIC8gMjsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNlZzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChtX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyKSkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyAxOwotICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQobV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMiArIDEpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIl0vU2l6ZSAiKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgICAgb2Zmc2V0ICs9IGxlbiArIDE7CiAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQob2JqbnVtICsgMSkpIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG9mZnNldCArPSBsZW4gKyA3OwotICAgIGlmIChtX1ByZXZPZmZzZXQgPiAwKSB7Ci0gICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvUHJldiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQ0hBUiBvZmZzZXRfYnVmWzIwXTsKLSAgICAgICAgRlhTWVNfbWVtc2V0KG9mZnNldF9idWYsIDAsIHNpemVvZihvZmZzZXRfYnVmKSk7Ci0gICAgICAgIEZYU1lTX2k2NHRvYShtX1ByZXZPZmZzZXQsIG9mZnNldF9idWYsIDEwKTsKLSAgICAgICAgaW50MzJfdCBsZW4gPSAoaW50MzJfdClGWFNZU19zdHJsZW4ob2Zmc2V0X2J1Zik7Ci0gICAgICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2sob2Zmc2V0X2J1ZiwgbGVuKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gbGVuICsgNjsKLSAgICB9Ci0gICAgRlhfQk9PTCBiUHJlZGljdG9yID0gVFJVRTsKLSAgICBDUERGX0ZsYXRlRW5jb2RlciBlbmNvZGVyOwotICAgIGVuY29kZXIuSW5pdGlhbGl6ZShtX0J1ZmZlci5HZXRCdWZmZXIoKSwgbV9CdWZmZXIuR2V0TGVuZ3RoKCksIHBDcmVhdG9yLT5tX2JDb21wcmVzcywgYlByZWRpY3Rvcik7Ci0gICAgaWYgKHBDcmVhdG9yLT5tX2JDb21wcmVzcykgewotICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0ZpbHRlciAvRmxhdGVEZWNvZGUiKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IDIwOwotICAgICAgICBpZiAoYlByZWRpY3RvcikgewotICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvRGVjb2RlUGFybXM8PC9Db2x1bW5zIDcvUHJlZGljdG9yIDEyPj4iKSkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSBsZW47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9MZW5ndGggIikpIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKGVuY29kZXIubV9kd1NpemUpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBvZmZzZXQgKz0gbGVuICsgODsKLSAgICBpZiAoYkVPRikgewotICAgICAgICBpZiAoKGxlbiA9IFBERl9DcmVhdG9yV3JpdGVUcmFpbGVyKHBDcmVhdG9yLT5tX3BEb2N1bWVudCwgcEZpbGUsIHBDcmVhdG9yLT5tX3BJREFycmF5LCBwQ3JlYXRvci0+bV9iQ29tcHJlc3MpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gbGVuOwotICAgICAgICBpZiAocENyZWF0b3ItPm1fcEVuY3J5cHREaWN0KSB7Ci0gICAgICAgICAgICBGWF9EV09SRCBkd0VuY3J5cHRPYmpOdW0gPSBwQ3JlYXRvci0+bV9wRW5jcnlwdERpY3QtPkdldE9iak51bSgpOwotICAgICAgICAgICAgaWYgKGR3RW5jcnlwdE9iak51bSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHdFbmNyeXB0T2JqTnVtID0gcENyZWF0b3ItPm1fZHdFbnJ5cHRPYmpOdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGxlbiA9IFBERl9DcmVhdG9yV3JpdGVFbmNyeXB0KHBDcmVhdG9yLT5tX3BFbmNyeXB0RGljdCwgZHdFbmNyeXB0T2JqTnVtLCBwRmlsZSkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSBsZW47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCI+PnN0cmVhbVxyXG4iKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIG9mZnNldCArPSBsZW47Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRCbG9jayhlbmNvZGVyLm1fcERhdGEsIGVuY29kZXIubV9kd1NpemUpIDwgMCkgeworICB9IGVsc2UgeworICAgIGludDMyX3QgaVNlZyA9IG1fSW5kZXhBcnJheS5HZXRTaXplKCkgLyAyOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTZWc7IGkrKykgeworICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQobV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMikpKSA8IDApIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlxyXG5lbmRzdHJlYW1cclxuZW5kb2JqXHJcbiIpKSkgPCAwKSB7CisgICAgICB9CisgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBvZmZzZXQgKz0gZW5jb2Rlci5tX2R3U2l6ZSArIGxlbjsKLSAgICBtX1ByZXZPZmZzZXQgPSBvZmZzZXRfdG1wOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1hSZWZTdHJlYW06OkVuZChDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBGWF9CT09MIGJFT0YgKQotewotICAgIGlmIChFbmRPYmplY3RTdHJlYW0ocENyZWF0b3IsIGJFT0YpIDwgMCkgeworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChtX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyICsgMSkpKSA8IDApIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gR2VuZXJhdGVYUmVmU3RyZWFtKHBDcmVhdG9yLCBiRU9GKTsKLX0KLUZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpFbmRYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IpCi17Ci0gICAgaWYgKCEocENyZWF0b3ItPm1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpKSB7Ci0gICAgICAgIF9BcHBlbmRJbmRleDAobV9CdWZmZXIpOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAxOyBpIDwgcENyZWF0b3ItPm1fZHdMYXN0T2JqTnVtICsgMTsgaSsrKSB7Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSogb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGkpOwotICAgICAgICAgICAgaWYgKG9mZnNldCkgewotICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbnQzMl90IGlTZWcgPSBtX0luZGV4QXJyYXkuR2V0U2l6ZSgpIC8gMjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpU2VnOyBpKyspIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIHN0YXJ0ID0gbV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMik7Ci0gICAgICAgICAgICBGWF9EV09SRCBlbmQgPSBtX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyICsgMSkgKyBzdGFydDsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaiA9IHN0YXJ0OyBqIDwgZW5kOyBqKyspIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXRbal0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHZW5lcmF0ZVhSZWZTdHJlYW0ocENyZWF0b3IsIEZBTFNFKTsKLX0KLUZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkoRlhfRFdPUkQgb2JqbnVtKQotewotICAgIGludDMyX3QgaVNpemUgPSBtX0luZGV4QXJyYXkuR2V0U2l6ZSgpOwotICAgIGlmIChpU2l6ZSA9PSAwKSB7Ci0gICAgICAgIG1fSW5kZXhBcnJheS5BZGQob2JqbnVtKTsKLSAgICAgICAgbV9JbmRleEFycmF5LkFkZCgxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWFNZU19hc3NlcnQoaVNpemUgPiAxKTsKLSAgICAgICAgRlhfRFdPUkQgc3RhcnRvYmpudW0gPSBtX0luZGV4QXJyYXkuRWxlbWVudEF0KGlTaXplIC0gMik7Ci0gICAgICAgIGludDMyX3QgaUNvdW50ID0gbV9JbmRleEFycmF5LkVsZW1lbnRBdChpU2l6ZSAtIDEpOwotICAgICAgICBpZiAob2JqbnVtID09IHN0YXJ0b2JqbnVtICsgaUNvdW50KSB7Ci0gICAgICAgICAgICBtX0luZGV4QXJyYXlbaVNpemUgLSAxXSA9IGlDb3VudCArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0luZGV4QXJyYXkuQWRkKG9iam51bSk7Ci0gICAgICAgICAgICBtX0luZGV4QXJyYXkuQWRkKDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotQ1BERl9DcmVhdG9yOjpDUERGX0NyZWF0b3IoQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBtX3BEb2N1bWVudCA9IHBEb2M7Ci0gICAgbV9wUGFyc2VyID0gKENQREZfUGFyc2VyKilwRG9jLT5tX3BQYXJzZXI7Ci0gICAgbV9iQ29tcHJlc3MgPSBUUlVFOwotICAgIGlmIChtX3BQYXJzZXIpIHsKLSAgICAgICAgbV9wRW5jcnlwdERpY3QgPSBtX3BQYXJzZXItPkdldEVuY3J5cHREaWN0KCk7Ci0gICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBtX3BQYXJzZXItPkdldENyeXB0b0hhbmRsZXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BFbmNyeXB0RGljdCA9IE5VTEw7Ci0gICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOwotICAgIH0KLSAgICBtX2JTZWN1cml0eUNoYW5nZWQgPSBGQUxTRTsKLSAgICBtX2JTdGFuZGFyZFNlY3VyaXR5ID0gRkFMU0U7Ci0gICAgbV9wTWV0YWRhdGEgPSBOVUxMOwotICAgIG1fYkVuY3J5cHRDbG9uZWQgPSBGQUxTRTsKLSAgICBtX2JFbmNyeXB0TWV0YWRhdGEgPSBGQUxTRTsKLSAgICBtX09mZnNldCA9IDA7Ci0gICAgbV9pU3RhZ2UgPSAtMTsKLSAgICBtX2R3RmxhZ3MgPSAwOwotICAgIG1fUG9zID0gTlVMTDsKLSAgICBtX1hyZWZTdGFydCA9IDA7Ci0gICAgbV9wWFJlZlN0cmVhbSA9IE5VTEw7Ci0gICAgbV9PYmplY3RTdHJlYW1TaXplID0gMjAwOwotICAgIG1fZHdMYXN0T2JqTnVtID0gbV9wRG9jdW1lbnQtPkdldExhc3RPYmpOdW0oKTsKLSAgICBtX3BJREFycmF5ID0gTlVMTDsKLSAgICBtX0ZpbGVWZXJzaW9uID0gMDsKLSAgICBtX2R3RW5yeXB0T2JqTnVtID0gMDsKLSAgICBtX2JOZXdDcnlwdG8gPSBGQUxTRTsKLX0KLUNQREZfQ3JlYXRvcjo6fkNQREZfQ3JlYXRvcigpCi17Ci0gICAgUmVzZXRTdGFuZGFyZFNlY3VyaXR5KCk7Ci0gICAgaWYgKG1fYkVuY3J5cHRDbG9uZWQgJiYgbV9wRW5jcnlwdERpY3QpIHsKLSAgICAgICAgbV9wRW5jcnlwdERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOwotICAgIH0KLSAgICBDbGVhcigpOwotfQotc3RhdGljIEZYX0JPT0wgX0lzWFJlZk5lZWRFbmQoQ1BERl9YUmVmU3RyZWFtKiBwWFJlZiwgRlhfRFdPUkQgZmxhZykKLXsKLSAgICBpZiAoIShmbGFnICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkpIHsKKyAgICAgIH0KKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewogICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gbGVuICsgMTsKICAgICB9Ci0gICAgaW50MzJfdCBpU2l6ZSA9IHBYUmVmLT5tX0luZGV4QXJyYXkuR2V0U2l6ZSgpIC8gMjsKLSAgICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkrKykgewotICAgICAgICBpQ291bnQgKz0gcFhSZWYtPm1fSW5kZXhBcnJheS5FbGVtZW50QXQoaSAqIDIgKyAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIChpQ291bnQgPj0gUERGX1hSRUZTVFJFQU1fTUFYU0laRSk7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIGlmICghbV9wWFJlZlN0cmVhbSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgb2JqbnVtID0gcE9iai0+R2V0T2JqTnVtKCk7Ci0gICAgaWYgKG1fcFBhcnNlciAmJiBtX3BQYXJzZXItPm1fT2JqVmVyc2lvbi5HZXRTaXplKCkgPiAoaW50MzJfdClvYmpudW0gJiYgbV9wUGFyc2VyLT5tX09ialZlcnNpb25bb2JqbnVtXSA+IDApIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCA9IHBPYmotPkdldERpY3QoKTsKLSAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgaWYgKHBEaWN0ICYmIHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSkgPT0gRlhfQlNUUkMoIlhSZWYiKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChwRGljdCkgewotICAgICAgICBpZiAocERpY3QgPT0gbV9wRG9jdW1lbnQtPm1fcFJvb3REaWN0IHx8IHBEaWN0ID09IG1fcEVuY3J5cHREaWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoSXNTaWduYXR1cmVEaWN0KHBEaWN0KSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSkgPT0gRlhfQlNUUkMoIlBhZ2UiKSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9wWFJlZlN0cmVhbS0+QWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KG9iam51bSk7Ci0gICAgaWYgKG1fcFhSZWZTdHJlYW0tPkNvbXByZXNzSW5kaXJlY3RPYmplY3Qob2JqbnVtLCBwT2JqLCB0aGlzKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoIV9Jc1hSZWZOZWVkRW5kKG1fcFhSZWZTdHJlYW0sIG1fZHdGbGFncykpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICghbV9wWFJlZlN0cmVhbS0+RW5kKHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKCFtX3BYUmVmU3RyZWFtLT5TdGFydCgpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgY29uc3QgdWludDhfdCogcEJ1ZmZlciwgRlhfRFdPUkQgZHdTaXplKQotewotICAgIGlmICghbV9wWFJlZlN0cmVhbSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgbV9wWFJlZlN0cmVhbS0+QWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KG9iam51bSk7Ci0gICAgaW50MzJfdCBpUmV0ID0gbV9wWFJlZlN0cmVhbS0+Q29tcHJlc3NJbmRpcmVjdE9iamVjdChvYmpudW0sIHBCdWZmZXIsIGR3U2l6ZSwgdGhpcyk7Ci0gICAgaWYgKGlSZXQgPCAxKSB7Ci0gICAgICAgIHJldHVybiBpUmV0OwotICAgIH0KLSAgICBpZiAoIV9Jc1hSZWZOZWVkRW5kKG1fcFhSZWZTdHJlYW0sIG1fZHdGbGFncykpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICghbV9wWFJlZlN0cmVhbS0+RW5kKHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKCFtX3BYUmVmU3RyZWFtLT5TdGFydCgpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6QXBwZW5kT2JqZWN0TnVtYmVyVG9YUmVmKEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICBpZiAoIW1fcFhSZWZTdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIG1fcFhSZWZTdHJlYW0tPkFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheShvYmpudW0pOwotICAgIGlmICghX0lzWFJlZk5lZWRFbmQobV9wWFJlZlN0cmVhbSwgbV9kd0ZsYWdzKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKCFtX3BYUmVmU3RyZWFtLT5FbmQodGhpcykpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoIW1fcFhSZWZTdHJlYW0tPlN0YXJ0KCkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLWludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZVN0cmVhbShjb25zdCBDUERGX09iamVjdCogcFN0cmVhbSwgRlhfRFdPUkQgb2JqbnVtLCBDUERGX0NyeXB0b0hhbmRsZXIqIHBDcnlwdG8pCi17Ci0gICAgQ1BERl9GbGF0ZUVuY29kZXIgZW5jb2RlcjsKLSAgICBlbmNvZGVyLkluaXRpYWxpemUoKENQREZfU3RyZWFtKilwU3RyZWFtLCBwU3RyZWFtID09IG1fcE1ldGFkYXRhID8gRkFMU0UgOiBtX2JDb21wcmVzcyk7Ci0gICAgQ1BERl9FbmNyeXB0b3IgZW5jcnlwdG9yOwotICAgIGlmKCFlbmNyeXB0b3IuSW5pdGlhbGl6ZShwQ3J5cHRvLCBvYmpudW0sIGVuY29kZXIubV9wRGF0YSwgZW5jb2Rlci5tX2R3U2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoKEZYX0RXT1JEKWVuY29kZXIubV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIikpICE9IGVuY3J5cHRvci5tX2R3U2l6ZSkgewotICAgICAgICBlbmNvZGVyLkNsb25lRGljdCgpOwotICAgICAgICBlbmNvZGVyLm1fcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIGVuY3J5cHRvci5tX2R3U2l6ZSk7Ci0gICAgfQotICAgIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIGVuY29kZXIubV9wRGljdCkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoInN0cmVhbVxyXG4iKSk7Ci0gICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtX09mZnNldCArPSBsZW47Ci0gICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhlbmNyeXB0b3IubV9wRGF0YSwgZW5jcnlwdG9yLm1fZHdTaXplKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtX09mZnNldCArPSBlbmNyeXB0b3IubV9kd1NpemU7Ci0gICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJcclxuZW5kc3RyZWFtIikpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtX09mZnNldCArPSBsZW47Ci0gICAgcmV0dXJuIDE7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVJbmRpcmVjdE9iaihGWF9EV09SRCBvYmpudW0sIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIGludDMyX3QgbGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKG9iam51bSk7Ci0gICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtX09mZnNldCArPSBsZW47Ci0gICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBvYmpcclxuIikpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtX09mZnNldCArPSBsZW47Ci0gICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIENQREZfQ3J5cHRvSGFuZGxlciAqcEhhbmRsZXIgPSBOVUxMOwotICAgICAgICBwSGFuZGxlciA9IChwT2JqID09IG1fcE1ldGFkYXRhICYmICFtX2JFbmNyeXB0TWV0YWRhdGEpID8gTlVMTCA6IG1fcENyeXB0b0hhbmRsZXI7Ci0gICAgICAgIGlmIChXcml0ZVN0cmVhbShwT2JqLCBvYmpudW0sIHBIYW5kbGVyKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIHBPYmopIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZG9ialxyXG4iKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG1fT2Zmc2V0ICs9IGxlbjsKLSAgICBpZiAoQXBwZW5kT2JqZWN0TnVtYmVyVG9YUmVmKG9iam51bSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVJbmRpcmVjdE9iaihjb25zdCBDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBpbnQzMl90IGlSZXQgPSBXcml0ZUluZGlyZWN0T2JqZWN0VG9TdHJlYW0ocE9iaik7Ci0gICAgaWYgKGlSZXQgPCAxKSB7Ci0gICAgICAgIHJldHVybiBpUmV0OwotICAgIH0KLSAgICByZXR1cm4gV3JpdGVJbmRpcmVjdE9iaihwT2JqLT5HZXRPYmpOdW0oKSwgcE9iaik7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaiwgRlhfQk9PTCBiRW5jcnlwdCkKLXsKLSAgICBpbnQzMl90IGxlbiA9IDA7Ci0gICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIG51bGwiKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgbV9PZmZzZXQgKz0gNTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHN3aXRjaCAocE9iai0+R2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX05VTEw6Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIG51bGwiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9PZmZzZXQgKz0gNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERk9CSl9CT09MRUFOOgotICAgICAgICBjYXNlIFBERk9CSl9OVU1CRVI6Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcocE9iai0+R2V0U3RyaW5nKCkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUklORzogewotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhleCA9ICgoQ1BERl9TdHJpbmcqKXBPYmopLT5Jc0hleCgpOwotICAgICAgICAgICAgICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyID09IE5VTEwgfHwgIWJFbmNyeXB0KSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNvbnRlbnQgPSBQREZfRW5jb2RlU3RyaW5nKHN0ciwgYkhleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhjb250ZW50KSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gbGVuOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BERl9FbmNyeXB0b3IgZW5jcnlwdG9yOwotICAgICAgICAgICAgICAgIGVuY3J5cHRvci5Jbml0aWFsaXplKG1fcENyeXB0b0hhbmRsZXIsIG9iam51bSwgKHVpbnQ4X3QqKXN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNvbnRlbnQgPSBQREZfRW5jb2RlU3RyaW5nKENGWF9CeXRlU3RyaW5nKChjb25zdCBGWF9DSEFSKillbmNyeXB0b3IubV9wRGF0YSwgZW5jcnlwdG9yLm1fZHdTaXplKSwgYkhleCk7Ci0gICAgICAgICAgICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKGNvbnRlbnQpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX09mZnNldCArPSBsZW47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUkVBTTogewotICAgICAgICAgICAgICAgIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXI7Ci0gICAgICAgICAgICAgICAgZW5jb2Rlci5Jbml0aWFsaXplKChDUERGX1N0cmVhbSopcE9iaiwgbV9iQ29tcHJlc3MpOwotICAgICAgICAgICAgICAgIENQREZfRW5jcnlwdG9yIGVuY3J5cHRvcjsKLSAgICAgICAgICAgICAgICBDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyID0gbV9wQ3J5cHRvSGFuZGxlcjsKLSAgICAgICAgICAgICAgICBlbmNyeXB0b3IuSW5pdGlhbGl6ZShwSGFuZGxlciwgb2JqbnVtLCBlbmNvZGVyLm1fcERhdGEsIGVuY29kZXIubV9kd1NpemUpOwotICAgICAgICAgICAgICAgIGlmICgoRlhfRFdPUkQpZW5jb2Rlci5tX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSkgIT0gZW5jcnlwdG9yLm1fZHdTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIuQ2xvbmVEaWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIubV9wRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSwgZW5jcnlwdG9yLm1fZHdTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFdyaXRlRGlyZWN0T2JqKG9iam51bSwgZW5jb2Rlci5tX3BEaWN0KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoInN0cmVhbVxyXG4iKSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKGVuY3J5cHRvci5tX3BEYXRhLCBlbmNyeXB0b3IubV9kd1NpemUpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IGVuY3J5cHRvci5tX2R3U2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlxyXG5lbmRzdHJlYW0iKSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQREZPQkpfTkFNRTogewotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhQREZfTmFtZUVuY29kZShzdHIpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gbGVuICsgMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHAgPSAoQ1BERl9SZWZlcmVuY2UqKXBPYmo7Ci0gICAgICAgICAgICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kRFdvcmQocC0+R2V0UmVmT2JqTnVtKCkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyA1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJbIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IDE7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcCA9IChDUERGX0FycmF5KilwT2JqOwotICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHAtPkdldEVsZW1lbnQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRWxlbWVudC0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKHBFbGVtZW50LT5HZXRPYmpOdW0oKSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IGxlbiArIDU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoV3JpdGVEaXJlY3RPYmoob2JqbnVtLCBwRWxlbWVudCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJdIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKLSAgICAgICAgICAgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlciA9PSBOVUxMIHx8IHBPYmogPT0gbV9wRW5jcnlwdERpY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBPYmosICZtX0ZpbGUsIG1fT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIjw8IikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJTaWduRGljdCA9IElzU2lnbmF0dXJlRGljdChwKTsKLSAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwLT5HZXRTdGFydFBvcygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2lnblZhbHVlID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IHAtPkdldE5leHRFbGVtZW50KHBvcywga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi8iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKFBERl9OYW1lRW5jb2RlKGtleSkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoYlNpZ25EaWN0ICYmIGtleSA9PSBGWF9CU1RSQygiQ29udGVudHMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlNpZ25WYWx1ZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKHBWYWx1ZS0+R2V0T2JqTnVtKCkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gbGVuICsgNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIHBWYWx1ZSwgIWJTaWduVmFsdWUpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj4iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVPbGRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0pCi17Ci0gICAgaWYobV9wUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDAgfHwgbV9wUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDI1NSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgbV9PYmplY3RPZmZzZXRbb2JqbnVtXSA9IG1fT2Zmc2V0OwotICAgIHZvaWQqIHZhbHVldGVtcCA9IE5VTEw7Ci0gICAgRlhfQk9PTCBiRXhpc3RJbk1hcCA9IG1fcERvY3VtZW50LT5tX0luZGlyZWN0T2Jqcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCB2YWx1ZXRlbXApOwotICAgIEZYX0JPT0wgYk9ialN0bSA9IChtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMikgJiYgbV9wRW5jcnlwdERpY3QgJiYgIW1fcFhSZWZTdHJlYW07Ci0gICAgaWYobV9wUGFyc2VyLT5tX2JWZXJzaW9uVXBkYXRlZCB8fCBtX2JTZWN1cml0eUNoYW5nZWQgfHwgYkV4aXN0SW5NYXAgfHwgYk9ialN0bSkgewotICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IG1fcERvY3VtZW50LT5HZXRJbmRpcmVjdE9iamVjdChvYmpudW0pOwotICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtX09iamVjdE9mZnNldFtvYmpudW1dID0gMDsKLSAgICAgICAgICAgIG1fT2JqZWN0U2l6ZVtvYmpudW1dID0gMDsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChXcml0ZUluZGlyZWN0T2JqKHBPYmopKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiRXhpc3RJbk1hcCkgewotICAgICAgICAgICAgbV9wRG9jdW1lbnQtPlJlbGVhc2VJbmRpcmVjdE9iamVjdChvYmpudW0pOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdWludDhfdCogcEJ1ZmZlcjsKLSAgICAgICAgRlhfRFdPUkQgc2l6ZTsKLSAgICAgICAgbV9wUGFyc2VyLT5HZXRJbmRpcmVjdEJpbmFyeShvYmpudW0sIHBCdWZmZXIsIHNpemUpOwotICAgICAgICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKLSAgICAgICAgICAgIGlmIChtX3BYUmVmU3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShvYmpudW0sIHBCdWZmZXIsIHNpemUpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKHBCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGxlbiA9IG1fRmlsZS5BcHBlbmREV29yZChvYmpudW0pOwotICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIG9iaiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gbGVuICsgNzsKLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKHBCdWZmZXIsIHNpemUpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IHNpemU7Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlxyXG5lbmRvYmpcclxuIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IDEwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhwQnVmZmVyLCBzaXplKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX09mZnNldCArPSBzaXplOwotICAgICAgICAgICAgaWYoQXBwZW5kT2JqZWN0TnVtYmVyVG9YUmVmKG9iam51bSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZYX0ZyZWUocEJ1ZmZlcik7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlT2xkT2JqcyhJRlhfUGF1c2UgKnBQYXVzZSkKLXsKLSAgICBGWF9EV09SRCBuT2xkU2l6ZSA9IG1fcFBhcnNlci0+bV9Dcm9zc1JlZi5HZXRTaXplKCk7Ci0gICAgRlhfRFdPUkQgb2JqbnVtID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9Qb3M7Ci0gICAgZm9yKDsgb2JqbnVtIDwgbk9sZFNpemU7IG9iam51bSArKykgewotICAgICAgICBpbnQzMl90IGlSZXQgPSBXcml0ZU9sZEluZGlyZWN0T2JqZWN0KG9iam51bSk7Ci0gICAgICAgIGlmICghaVJldCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gaVJldDsKLSAgICAgICAgfQotICAgICAgICBtX09iamVjdFNpemVbb2JqbnVtXSA9IChGWF9EV09SRCkobV9PZmZzZXQgLSBtX09iamVjdE9mZnNldFtvYmpudW1dKTsKLSAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpKG9iam51bSArIDEpOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVOZXdPYmpzKEZYX0JPT0wgYkluY3JlbWVudGFsLCBJRlhfUGF1c2UgKnBQYXVzZSkKLXsKLSAgICBpbnQzMl90IGlDb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuR2V0U2l6ZSgpOwotICAgIGludDMyX3QgaW5kZXggPSAoaW50MzJfdCkodWludHB0cl90KW1fUG9zOwotICAgIHdoaWxlIChpbmRleCA8IGlDb3VudCkgewotICAgICAgICBGWF9EV09SRCBvYmpudW0gPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpbmRleCk7Ci0gICAgICAgIENQREZfT2JqZWN0ICpwT2JqID0gTlVMTDsKLSAgICAgICAgbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sICh2b2lkKiYpcE9iaik7Ci0gICAgICAgIGlmIChOVUxMID09IHBPYmopIHsKLSAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBtX09iamVjdE9mZnNldFtvYmpudW1dID0gbV9PZmZzZXQ7Ci0gICAgICAgIGlmIChXcml0ZUluZGlyZWN0T2JqKHBPYmopKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgbV9PYmplY3RTaXplW29iam51bV0gPSAoRlhfRFdPUkQpKG1fT2Zmc2V0IC0gbV9PYmplY3RPZmZzZXRbb2JqbnVtXSk7Ci0gICAgICAgIGluZGV4Kys7Ci0gICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX1BvcyA9IChGWF9QT1NJVElPTikodWludHB0cl90KWluZGV4OwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci12b2lkIENQREZfQ3JlYXRvcjo6SW5pdE9sZE9iak51bU9mZnNldHMoKQotewotICAgIGlmICghbV9wUGFyc2VyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfRFdPUkQgaiA9IDA7Ci0gICAgRlhfRFdPUkQgZHdTdGFydCA9IDA7Ci0gICAgRlhfRFdPUkQgZHdFbmQgPSBtX3BQYXJzZXItPkdldExhc3RPYmpOdW0oKTsKLSAgICB3aGlsZSAoZHdTdGFydCA8PSBkd0VuZCkgewotICAgICAgICB3aGlsZSAoZHdTdGFydCA8PSBkd0VuZCAmJiAobV9wUGFyc2VyLT5tX1Y1VHlwZVtkd1N0YXJ0XSA9PSAwIHx8IG1fcFBhcnNlci0+bV9WNVR5cGVbZHdTdGFydF0gPT0gMjU1KSkgewotICAgICAgICAgICAgZHdTdGFydCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkd1N0YXJ0ID4gZHdFbmQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGogPSBkd1N0YXJ0OwotICAgICAgICB3aGlsZSAoaiA8PSBkd0VuZCAmJiBtX3BQYXJzZXItPm1fVjVUeXBlW2pdICE9IDAgJiYgbV9wUGFyc2VyLT5tX1Y1VHlwZVtqXSAhPSAyNTUpIHsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotICAgICAgICBtX09iamVjdE9mZnNldC5BZGQoZHdTdGFydCwgaiAtIGR3U3RhcnQpOwotICAgICAgICBtX09iamVjdFNpemUuQWRkKGR3U3RhcnQsIGogLSBkd1N0YXJ0KTsKLSAgICAgICAgZHdTdGFydCA9IGo7Ci0gICAgfQotfQotdm9pZCBDUERGX0NyZWF0b3I6OkluaXROZXdPYmpOdW1PZmZzZXRzKCkKLXsKLSAgICBGWF9CT09MIGJJbmNyZW1lbnRhbCA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwOwotICAgIEZYX0JPT0wgYk5vT3JpZ2luYWwgPSAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9OT19PUklHSU5BTCkgIT0gMDsKLSAgICBGWF9EV09SRCBuT2xkU2l6ZSA9IG1fcFBhcnNlciA/IG1fcFBhcnNlci0+bV9Dcm9zc1JlZi5HZXRTaXplKCkgOiAwOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fcERvY3VtZW50LT5tX0luZGlyZWN0T2Jqcy5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBzaXplX3Qga2V5ID0gMDsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmo7Ci0gICAgICAgIG1fcERvY3VtZW50LT5tX0luZGlyZWN0T2Jqcy5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKWtleSwgKHZvaWQqJilwT2JqKTsKLSAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gKEZYX0RXT1JEKWtleTsKLSAgICAgICAgaWYgKHBPYmotPkdldE9iak51bSgpID09IC0xKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYkluY3JlbWVudGFsKSB7Ci0gICAgICAgICAgICBpZiAoIXBPYmotPklzTW9kaWZpZWQoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG9iam51bSA8IG5PbGRTaXplICYmIG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQXBwZW5kTmV3T2JqTnVtKG9iam51bSk7Ci0gICAgfQotICAgIGludDMyX3QgaUNvdW50ID0gbV9OZXdPYmpOdW1BcnJheS5HZXRTaXplKCk7Ci0gICAgaWYgKGlDb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50MzJfdCBpID0gMDsKLSAgICBGWF9EV09SRCBkd1N0YXJ0T2JqTnVtID0gMDsKLSAgICBGWF9CT09MIGJDcm9zc1JlZlZhbGlkID0gbV9wUGFyc2VyICYmIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA+IDA7Ci0gICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKLSAgICAgICAgZHdTdGFydE9iak51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGkpOwotICAgICAgICBpZiAoKGJJbmNyZW1lbnRhbCAmJiAoYk5vT3JpZ2luYWwgfHwgYkNyb3NzUmVmVmFsaWQpKSB8fCAhbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoZHdTdGFydE9iak51bSkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgaWYgKGkgPj0gaUNvdW50KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfRFdPUkQgZHdMYXN0T2JqTnVtID0gZHdTdGFydE9iak51bTsKLSAgICBpKys7Ci0gICAgRlhfQk9PTCBiTmV3U3RhcnQgPSBGQUxTRTsKLSAgICBmb3IgKDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICAgIEZYX0RXT1JEIGR3Q3VyT2JqTnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7Ci0gICAgICAgIEZYX0JPT0wgYkV4aXN0ID0gKGR3Q3VyT2JqTnVtIDwgbk9sZFNpemUgJiYgbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoZHdDdXJPYmpOdW0pICE9IE5VTEwpOwotICAgICAgICBpZiAoYkV4aXN0IHx8IGR3Q3VyT2JqTnVtIC0gZHdMYXN0T2JqTnVtID4gMSkgewotICAgICAgICAgICAgaWYgKCFiTmV3U3RhcnQpIHsKLSAgICAgICAgICAgICAgICBtX09iamVjdE9mZnNldC5BZGQoZHdTdGFydE9iak51bSwgZHdMYXN0T2JqTnVtIC0gZHdTdGFydE9iak51bSArIDEpOwotICAgICAgICAgICAgICAgIG1fT2JqZWN0U2l6ZS5BZGQoZHdTdGFydE9iak51bSwgZHdMYXN0T2JqTnVtIC0gZHdTdGFydE9iak51bSArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHdTdGFydE9iak51bSA9IGR3Q3VyT2JqTnVtOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiTmV3U3RhcnQpIHsKLSAgICAgICAgICAgIGR3U3RhcnRPYmpOdW0gPSBkd0N1ck9iak51bTsKLSAgICAgICAgfQotICAgICAgICBiTmV3U3RhcnQgPSBiRXhpc3Q7Ci0gICAgICAgIGR3TGFzdE9iak51bSA9IGR3Q3VyT2JqTnVtOwotICAgIH0KLSAgICBtX09iamVjdE9mZnNldC5BZGQoZHdTdGFydE9iak51bSwgZHdMYXN0T2JqTnVtIC0gZHdTdGFydE9iak51bSArIDEpOwotICAgIG1fT2JqZWN0U2l6ZS5BZGQoZHdTdGFydE9iak51bSwgZHdMYXN0T2JqTnVtIC0gZHdTdGFydE9iak51bSArIDEpOwotfQotdm9pZCBDUERGX0NyZWF0b3I6OkFwcGVuZE5ld09iak51bShGWF9EV09SRCBvYmpidW0pCi17Ci0gICAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRmluZCA9IDA7Ci0gICAgaW50MzJfdCBpRW5kID0gbV9OZXdPYmpOdW1BcnJheS5HZXRVcHBlckJvdW5kKCk7Ci0gICAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7Ci0gICAgICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7Ci0gICAgICAgIEZYX0RXT1JEIGR3TWlkID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaU1pZCk7Ci0gICAgICAgIGlmIChvYmpidW0gPCBkd01pZCkgewotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGlNaWQgPT0gaUVuZCkgewotICAgICAgICAgICAgICAgIGlGaW5kID0gaU1pZCArIDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9EV09SRCBkd05leHQgPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpTWlkICsgMSk7Ci0gICAgICAgICAgICBpZiAob2JqYnVtIDwgZHdOZXh0KSB7Ci0gICAgICAgICAgICAgICAgaUZpbmQgPSBpTWlkICsgMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fTmV3T2JqTnVtQXJyYXkuSW5zZXJ0QXQoaUZpbmQsIG9iamJ1bSk7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEb2NfU3RhZ2UxKElGWF9QYXVzZSAqcFBhdXNlKQotewotICAgIEZYU1lTX2Fzc2VydChtX2lTdGFnZSA+IC0xIHx8IG1faVN0YWdlIDwgMjApOwotICAgIGlmIChtX2lTdGFnZSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX3BQYXJzZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgbV9kd0ZsYWdzICY9IH5GUERGQ1JFQVRFX0lOQ1JFTUVOVEFMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2JTZWN1cml0eUNoYW5nZWQgJiYgKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpID09IDApIHsKLSAgICAgICAgICAgIG1fZHdGbGFncyAmPSB+RlBERkNSRUFURV9JTkNSRU1FTlRBTDsKLSAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKLSAgICAgICAgbV9wTWV0YWRhdGEgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIk1ldGFkYXRhIikpIDogTlVMTDsKLSAgICAgICAgaWYgKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSB7Ci0gICAgICAgICAgICBtX3BYUmVmU3RyZWFtID0gbmV3IENQREZfWFJlZlN0cmVhbTsKLSAgICAgICAgICAgIG1fcFhSZWZTdHJlYW0tPlN0YXJ0KCk7Ci0gICAgICAgICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDAgJiYgbV9wUGFyc2VyKSB7Ci0gICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcHJldiA9IG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKTsKLSAgICAgICAgICAgICAgICBtX3BYUmVmU3RyZWFtLT5tX1ByZXZPZmZzZXQgPSBwcmV2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1faVN0YWdlID0gMTA7Ci0gICAgfQotICAgIGlmIChtX2lTdGFnZSA9PSAxMCkgewotICAgICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpID09IDApIHsKLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIlUERGLTEuIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fT2Zmc2V0ICs9IDc7Ci0gICAgICAgICAgICBpbnQzMl90IHZlcnNpb24gPSA3OwotICAgICAgICAgICAgaWYgKG1fRmlsZVZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gbV9GaWxlVmVyc2lvbjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9wUGFyc2VyKSB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbiA9IG1fcFBhcnNlci0+R2V0RmlsZVZlcnNpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludDMyX3QgbGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKHZlcnNpb24gJSAxMCk7Ci0gICAgICAgICAgICBpZiAobGVuIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fT2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbiVceEExXHhCM1x4QzVceEQ3XHJcbiIpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9PZmZzZXQgKz0gbGVuOwotICAgICAgICAgICAgSW5pdE9sZE9iak51bU9mZnNldHMoKTsKLSAgICAgICAgICAgIG1faVN0YWdlID0gMjA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBTcmNGaWxlID0gbV9wUGFyc2VyLT5HZXRGaWxlQWNjZXNzKCk7Ci0gICAgICAgICAgICBtX09mZnNldCA9IHBTcmNGaWxlLT5HZXRTaXplKCk7Ci0gICAgICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KW1fT2Zmc2V0OwotICAgICAgICAgICAgbV9pU3RhZ2UgPSAxNTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9pU3RhZ2UgPT0gMTUpIHsKLSAgICAgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX05PX09SSUdJTkFMKSA9PSAwICYmIG1fUG9zKSB7Ci0gICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBTcmNGaWxlID0gbV9wUGFyc2VyLT5HZXRGaWxlQWNjZXNzKCk7Ci0gICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls0MDk2XTsKLSAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9Qb3M7Ci0gICAgICAgICAgICB3aGlsZSAoc3JjX3NpemUpIHsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBibG9ja19zaXplID0gc3JjX3NpemUgPiA0MDk2ID8gNDA5NiA6IHNyY19zaXplOwotICAgICAgICAgICAgICAgIGlmICghcFNyY0ZpbGUtPlJlYWRCbG9jayhidWZmZXIsIG1fT2Zmc2V0IC0gc3JjX3NpemUsIGJsb2NrX3NpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhidWZmZXIsIGJsb2NrX3NpemUpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNyY19zaXplIC09IGJsb2NrX3NpemU7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Qb3MgPSAodm9pZCopKHVpbnRwdHJfdClzcmNfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9OT19PUklHSU5BTCkgPT0gMCAmJiBtX3BQYXJzZXItPkdldExhc3RYUmVmT2Zmc2V0KCkgPT0gMCkgewotICAgICAgICAgICAgSW5pdE9sZE9iak51bU9mZnNldHMoKTsKLSAgICAgICAgICAgIEZYX0RXT1JEIGR3RW5kID0gbV9wUGFyc2VyLT5HZXRMYXN0T2JqTnVtKCk7Ci0gICAgICAgICAgICBGWF9CT09MIGJPYmpTdG0gPSAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9PQkpFQ1RTVFJFQU0pICE9IDA7Ci0gICAgICAgICAgICBmb3IgKEZYX0RXT1JEIG9iam51bSA9IDA7IG9iam51bSA8PSBkd0VuZDsgb2JqbnVtKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobV9wUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDAgfHwgbV9wUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9PYmplY3RPZmZzZXRbb2JqbnVtXSA9IG1fcFBhcnNlci0+bV9Dcm9zc1JlZltvYmpudW1dOwotICAgICAgICAgICAgICAgIGlmIChiT2JqU3RtKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcFhSZWZTdHJlYW0tPkFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheShvYmpudW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiT2JqU3RtKSB7Ci0gICAgICAgICAgICAgICAgbV9wWFJlZlN0cmVhbS0+RW5kWFJlZlN0cmVhbSh0aGlzKTsKLSAgICAgICAgICAgICAgICBtX3BYUmVmU3RyZWFtLT5TdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1faVN0YWdlID0gMjA7Ci0gICAgfQotICAgIEluaXROZXdPYmpOdW1PZmZzZXRzKCk7Ci0gICAgcmV0dXJuIG1faVN0YWdlOwotfQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlRG9jX1N0YWdlMihJRlhfUGF1c2UgKnBQYXVzZSkKLXsKLSAgICBGWFNZU19hc3NlcnQobV9pU3RhZ2UgPj0gMjAgfHwgbV9pU3RhZ2UgPCAzMCk7Ci0gICAgaWYgKG1faVN0YWdlID09IDIwKSB7Ci0gICAgICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgPT0gMCAmJiBtX3BQYXJzZXIpIHsKLSAgICAgICAgICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpMDsKLSAgICAgICAgICAgIG1faVN0YWdlID0gMjE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2lTdGFnZSA9IDI1OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX2lTdGFnZSA9PSAyMSkgewotICAgICAgICBpbnQzMl90IGlSZXQgPSBXcml0ZU9sZE9ianMocFBhdXNlKTsKLSAgICAgICAgaWYgKGlSZXQpIHsKLSAgICAgICAgICAgIHJldHVybiBpUmV0OwotICAgICAgICB9Ci0gICAgICAgIG1faVN0YWdlID0gMjU7Ci0gICAgfQotICAgIGlmIChtX2lTdGFnZSA9PSAyNSkgewotICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KTA7Ci0gICAgICAgIG1faVN0YWdlID0gMjY7Ci0gICAgfQotICAgIGlmIChtX2lTdGFnZSA9PSAyNikgewotICAgICAgICBpbnQzMl90IGlSZXQgPSBXcml0ZU5ld09ianMoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDAsIHBQYXVzZSk7Ci0gICAgICAgIGlmIChpUmV0KSB7Ci0gICAgICAgICAgICByZXR1cm4gaVJldDsKLSAgICAgICAgfQotICAgICAgICBtX2lTdGFnZSA9IDI3OwotICAgIH0KLSAgICBpZiAobV9pU3RhZ2UgPT0gMjcpIHsKLSAgICAgICAgaWYgKE5VTEwgIT0gbV9wRW5jcnlwdERpY3QgJiYgMCA9PSBtX3BFbmNyeXB0RGljdC0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgIG1fZHdMYXN0T2JqTnVtICs9IDE7Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSBzYXZlT2Zmc2V0ID0gbV9PZmZzZXQ7Ci0gICAgICAgICAgICBpZiAoV3JpdGVJbmRpcmVjdE9iaihtX2R3TGFzdE9iak51bSwgbV9wRW5jcnlwdERpY3QpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fT2JqZWN0T2Zmc2V0LkFkZChtX2R3TGFzdE9iak51bSwgMSk7Ci0gICAgICAgICAgICBtX09iamVjdE9mZnNldFttX2R3TGFzdE9iak51bV0gPSBzYXZlT2Zmc2V0OwotICAgICAgICAgICAgbV9PYmplY3RTaXplLkFkZChtX2R3TGFzdE9iak51bSwgMSk7Ci0gICAgICAgICAgICBtX09iamVjdFNpemVbbV9kd0xhc3RPYmpOdW1dID0gbV9PZmZzZXQgLSBzYXZlT2Zmc2V0OwotICAgICAgICAgICAgbV9kd0VucnlwdE9iak51bSA9IG1fZHdMYXN0T2JqTnVtOwotICAgICAgICAgICAgaWYgKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpIHsKLSAgICAgICAgICAgICAgICBtX05ld09iak51bUFycmF5LkFkZChtX2R3TGFzdE9iak51bSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9pU3RhZ2UgPSA4MDsKLSAgICB9Ci0gICAgcmV0dXJuIG1faVN0YWdlOwotfQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlRG9jX1N0YWdlMyhJRlhfUGF1c2UgKnBQYXVzZSkKLXsKLSAgICBGWFNZU19hc3NlcnQobV9pU3RhZ2UgPj0gODAgfHwgbV9pU3RhZ2UgPCA5MCk7Ci0gICAgRlhfRFdPUkQgZHdMYXN0T2JqTnVtID0gbV9kd0xhc3RPYmpOdW07Ci0gICAgaWYgKG1faVN0YWdlID09IDgwKSB7Ci0gICAgICAgIG1fWHJlZlN0YXJ0ID0gbV9PZmZzZXQ7Ci0gICAgICAgIGlmIChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX09CSkVDVFNUUkVBTSkgewotICAgICAgICAgICAgbV9wWFJlZlN0cmVhbS0+RW5kKHRoaXMsIFRSVUUpOwotICAgICAgICAgICAgbV9YcmVmU3RhcnQgPSBtX3BYUmVmU3RyZWFtLT5tX1ByZXZPZmZzZXQ7Ci0gICAgICAgICAgICBtX2lTdGFnZSA9IDkwOwotICAgICAgICB9IGVsc2UgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSA9PSAwIHx8ICFtX3BQYXJzZXItPklzWFJlZlN0cmVhbSgpKSB7Ci0gICAgICAgICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpID09IDAgfHwgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHI7Ci0gICAgICAgICAgICAgICAgc3RyID0gbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoMSkgPyBGWF9CU1RSQygieHJlZlxyXG4iKSA6IEZYX0JTVFJDKCJ4cmVmXHJcbjAgMVxyXG4wMDAwMDAwMDAwIDY1NTM2IGZcclxuIik7Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoc3RyKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KTE7Ci0gICAgICAgICAgICAgICAgbV9pU3RhZ2UgPSA4MTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoInhyZWZcclxuIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpMDsKLSAgICAgICAgICAgICAgICBtX2lTdGFnZSA9IDgyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9pU3RhZ2UgPSA5MDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9pU3RhZ2UgPT0gODEpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOwotICAgICAgICBGWF9EV09SRCBpID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9Qb3MsIGo7Ci0gICAgICAgIHdoaWxlIChpIDw9IGR3TGFzdE9iak51bSkgewotICAgICAgICAgICAgd2hpbGUgKGkgPD0gZHdMYXN0T2JqTnVtICYmICFtX09iamVjdE9mZnNldC5HZXRQdHJBdChpKSkgewotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpID4gZHdMYXN0T2JqTnVtKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqID0gaTsKLSAgICAgICAgICAgIHdoaWxlIChqIDw9IGR3TGFzdE9iak51bSAmJiBtX09iamVjdE9mZnNldC5HZXRQdHJBdChqKSkgewotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpID09IDEpIHsKLSAgICAgICAgICAgICAgICBzdHIuRm9ybWF0KCIwICVkXHJcbjAwMDAwMDAwMDAgNjU1MzYgZlxyXG4iLCBqKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyLkZvcm1hdCgiJWQgJWRcclxuIiwgaSwgaiAtIGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoaSA8IGopIHsKLSAgICAgICAgICAgICAgICBzdHIuRm9ybWF0KCIlMDEwZCAwMDAwMCBuXHJcbiIsIG1fT2JqZWN0T2Zmc2V0W2kgKytdKTsKLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPiBkd0xhc3RPYmpOdW0pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgPSAodm9pZCopKHVpbnRwdHJfdClpOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1faVN0YWdlID0gOTA7Ci0gICAgfQotICAgIGlmIChtX2lTdGFnZSA9PSA4MikgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHI7Ci0gICAgICAgIGludDMyX3QgaUNvdW50ID0gbV9OZXdPYmpOdW1BcnJheS5HZXRTaXplKCk7Ci0gICAgICAgIGludDMyX3QgaSA9IChpbnQzMl90KSh1aW50cHRyX3QpbV9Qb3M7Ci0gICAgICAgIHdoaWxlIChpIDwgaUNvdW50KSB7Ci0gICAgICAgICAgICBpbnQzMl90IGogPSBpOwotICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICB3aGlsZSAoaiA8IGlDb3VudCkgewotICAgICAgICAgICAgICAgIGlmICgrK2ogPT0gaUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0N1cnJlbnQgPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChqKTsKLSAgICAgICAgICAgICAgICBpZiAoZHdDdXJyZW50IC0gb2JqbnVtID4gMSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2JqbnVtID0gZHdDdXJyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2JqbnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBpZiAob2JqbnVtID09IDEpIHsKLSAgICAgICAgICAgICAgICBzdHIuRm9ybWF0KCIwICVkXHJcbjAwMDAwMDAwMDAgNjU1MzYgZlxyXG4iLCBqIC0gaSArIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHIuRm9ybWF0KCIlZCAlZFxyXG4iLCBvYmpudW0sIGogLSBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKGkgPCBqKSB7Ci0gICAgICAgICAgICAgICAgb2JqbnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSsrKTsKLSAgICAgICAgICAgICAgICBzdHIuRm9ybWF0KCIlMDEwZCAwMDAwMCBuXHJcbiIsIG1fT2JqZWN0T2Zmc2V0W29iam51bV0pOwotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocFBhdXNlICYmIChpICUgMTAwKSA9PSAwICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpaTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX2lTdGFnZSA9IDkwOwotICAgIH0KLSAgICByZXR1cm4gbV9pU3RhZ2U7Ci19Ci1zdGF0aWMgaW50MzJfdCBfT3V0UHV0SW5kZXgoQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSwgRlhfRklMRVNJWkUgb2Zmc2V0KQotewotICAgIEZYU1lTX2Fzc2VydChwRmlsZSk7Ci0gICAgaWYgKHNpemVvZihvZmZzZXQpID4gNCkgewotICAgICAgICBpZiAoRlhfR0VUQllURU9GRlNFVDMyKG9mZnNldCkpIHsKLSAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUNTYob2Zmc2V0KSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ0OChvZmZzZXQpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDQwKG9mZnNldCkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMzIob2Zmc2V0KSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMjQob2Zmc2V0KSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQxNihvZmZzZXQpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDgob2Zmc2V0KSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQwKG9mZnNldCkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZSgwKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLWludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZURvY19TdGFnZTQoSUZYX1BhdXNlICpwUGF1c2UpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KG1faVN0YWdlID49IDkwKTsKLSAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSA9PSAwKSB7Ci0gICAgICAgIEZYX0JPT0wgYlhSZWZTdHJlYW0gPSAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCAmJiBtX3BQYXJzZXItPklzWFJlZlN0cmVhbSgpOwotICAgICAgICBpZiAoIWJYUmVmU3RyZWFtKSB7Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygidHJhaWxlclxyXG48PCIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKG1fcERvY3VtZW50LT5tX0xhc3RPYmpOdW0gKyAxKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgb2JqIDw8IikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobV9wUGFyc2VyKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHAgPSBtX3BQYXJzZXItPm1fcFRyYWlsZXI7Ci0gICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwLT5HZXRTdGFydFBvcygpOwotICAgICAgICAgICAgd2hpbGUgKHBvcykgewotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gcC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOwotICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gRlhfQlNUUkMoIkVuY3J5cHQiKSB8fCBrZXkgPT0gRlhfQlNUUkMoIlNpemUiKSB8fCBrZXkgPT0gRlhfQlNUUkMoIkZpbHRlciIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPT0gRlhfQlNUUkMoIkluZGV4IikgfHwga2V5ID09IEZYX0JTVFJDKCJMZW5ndGgiKSB8fCBrZXkgPT0gRlhfQlNUUkMoIlByZXYiKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAga2V5ID09IEZYX0JTVFJDKCJXIikgfHwga2V5ID09IEZYX0JTVFJDKCJYUmVmU3RtIikgfHwga2V5ID09IEZYX0JTVFJDKCJJRCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygoRlhfQlNUUkMoIi8iKSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKFBERl9OYW1lRW5jb2RlKGtleSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwVmFsdWUtPkdldE9iak51bSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQocFZhbHVlLT5HZXRPYmpOdW0oKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIFIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBWYWx1ZSwgJm1fRmlsZSwgb2Zmc2V0KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJcclxuL1Jvb3QgIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQobV9wRG9jdW1lbnQtPm1fcFJvb3REaWN0LT5HZXRPYmpOdW0oKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIFJcclxuIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX3BEb2N1bWVudC0+bV9wSW5mb0RpY3QpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0luZm8gIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQobV9wRG9jdW1lbnQtPm1fcEluZm9EaWN0LT5HZXRPYmpOdW0oKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIFJcclxuIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BFbmNyeXB0RGljdCkgewotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9FbmNyeXB0IikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0RXT1JEIGR3T2JqTnVtID0gbV9wRW5jcnlwdERpY3QtPkdldE9iak51bSgpOwotICAgICAgICAgICAgaWYgKGR3T2JqTnVtID09IDApIHsKLSAgICAgICAgICAgICAgICBkd09iak51bSA9IG1fcERvY3VtZW50LT5HZXRMYXN0T2JqTnVtKCkgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChkd09iak51bSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIFIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL1NpemUgIikpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQobV9kd0xhc3RPYmpOdW0gKyAoYlhSZWZTdHJlYW0gPyAyIDogMSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCkgewotICAgICAgICAgICAgRlhfRklMRVNJWkUgcHJldiA9IG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKTsKLSAgICAgICAgICAgIGlmIChwcmV2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9QcmV2ICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9DSEFSIG9mZnNldF9idWZbMjBdOwotICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldChvZmZzZXRfYnVmLCAwLCBzaXplb2Yob2Zmc2V0X2J1ZikpOwotICAgICAgICAgICAgICAgIEZYU1lTX2k2NHRvYShwcmV2LCBvZmZzZXRfYnVmLCAxMCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhvZmZzZXRfYnVmLCBGWFNZU19zdHJsZW4ob2Zmc2V0X2J1ZikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BJREFycmF5KSB7Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygoRlhfQlNUUkMoIi9JRCIpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChtX3BJREFycmF5LCAmbV9GaWxlLCBvZmZzZXQpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWJYUmVmU3RyZWFtKSB7Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj4iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9XWzAgNCAxXS9JbmRleFsiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwICYmIG1fcFBhcnNlciAmJiBtX3BQYXJzZXItPkdldExhc3RYUmVmT2Zmc2V0KCkgPT0gMCkgewotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGkgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2R3TGFzdE9iak51bTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQoaSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAxICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXS9MZW5ndGggIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQobV9kd0xhc3RPYmpOdW0gKiA1KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj5zdHJlYW1cclxuIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2R3TGFzdE9iak51bTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFKiBvZmZzZXQgPSBtX09iamVjdE9mZnNldC5HZXRQdHJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFvZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIF9PdXRQdXRJbmRleCgmbV9GaWxlLCAqb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuR2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIGludDMyX3QgaSA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQob2JqbnVtKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDEgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJdL0xlbmd0aCAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChjb3VudCAqIDUpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCI+PnN0cmVhbVxyXG4iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IG1fT2JqZWN0T2Zmc2V0W29iam51bV07Ci0gICAgICAgICAgICAgICAgICAgIF9PdXRQdXRJbmRleCgmbV9GaWxlLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJcclxuZW5kc3RyZWFtIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbnN0YXJ0eHJlZlxyXG4iKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXS9TaXplICIpKSA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQob2JqbnVtICsgMSkpIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBvZmZzZXQgKz0gbGVuICsgNzsKKyAgaWYgKG1fUHJldk9mZnNldCA+IDApIHsKKyAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL1ByZXYgIikpIDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBGWF9DSEFSIG9mZnNldF9idWZbMjBdOwogICAgIEZYU1lTX21lbXNldChvZmZzZXRfYnVmLCAwLCBzaXplb2Yob2Zmc2V0X2J1ZikpOwotICAgIEZYU1lTX2k2NHRvYShtX1hyZWZTdGFydCwgb2Zmc2V0X2J1ZiwgMTApOwotICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2sob2Zmc2V0X2J1ZiwgRlhTWVNfc3RybGVuKG9mZnNldF9idWYpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOworICAgIEZYU1lTX2k2NHRvYShtX1ByZXZPZmZzZXQsIG9mZnNldF9idWYsIDEwKTsKKyAgICBpbnQzMl90IGxlbiA9IChpbnQzMl90KUZYU1lTX3N0cmxlbihvZmZzZXRfYnVmKTsKKyAgICBpZiAocEZpbGUtPkFwcGVuZEJsb2NrKG9mZnNldF9idWYsIGxlbikgPCAwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJcclxuJSVFT0ZcclxuIikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7CisgICAgb2Zmc2V0ICs9IGxlbiArIDY7CisgIH0KKyAgRlhfQk9PTCBiUHJlZGljdG9yID0gVFJVRTsKKyAgQ1BERl9GbGF0ZUVuY29kZXIgZW5jb2RlcjsKKyAgZW5jb2Rlci5Jbml0aWFsaXplKG1fQnVmZmVyLkdldEJ1ZmZlcigpLCBtX0J1ZmZlci5HZXRMZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgIHBDcmVhdG9yLT5tX2JDb21wcmVzcywgYlByZWRpY3Rvcik7CisgIGlmIChwQ3JlYXRvci0+bV9iQ29tcHJlc3MpIHsKKyAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0ZpbHRlciAvRmxhdGVEZWNvZGUiKSkgPCAwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIG1fRmlsZS5GbHVzaCgpOwotICAgIHJldHVybiBtX2lTdGFnZSA9IDEwMDsKLX0KLXZvaWQgQ1BERl9DcmVhdG9yOjpDbGVhcigpCi17Ci0gICAgZGVsZXRlIG1fcFhSZWZTdHJlYW07Ci0gICAgbV9wWFJlZlN0cmVhbSA9IE5VTEw7Ci0gICAgbV9GaWxlLkNsZWFyKCk7Ci0gICAgbV9OZXdPYmpOdW1BcnJheS5SZW1vdmVBbGwoKTsKLSAgICBpZiAobV9wSURBcnJheSkgewotICAgICAgICBtX3BJREFycmF5LT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fcElEQXJyYXkgPSBOVUxMOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzKQotewotICAgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUoZmlsZW5hbWUpKSB7CisgICAgb2Zmc2V0ICs9IDIwOworICAgIGlmIChiUHJlZGljdG9yKSB7CisgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoCisgICAgICAgICAgICAgICBGWF9CU1RSQygiL0RlY29kZVBhcm1zPDwvQ29sdW1ucyA3L1ByZWRpY3RvciAxMj4+IikpKSA8IDApIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IGxlbjsKICAgICB9Ci0gICAgRlhfQk9PTCBiUmV0ID0gQ3JlYXRlKGZsYWdzKTsKLSAgICBpZiAoIWJSZXQgfHwgIShmbGFncyAmIEZQREZDUkVBVEVfUFJPR1JFU1NJVkUpKSB7Ci0gICAgICAgIENsZWFyKCk7CisgIH0KKyAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9MZW5ndGggIikpIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChlbmNvZGVyLm1fZHdTaXplKSkgPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG9mZnNldCArPSBsZW4gKyA4OworICBpZiAoYkVPRikgeworICAgIGlmICgobGVuID0gUERGX0NyZWF0b3JXcml0ZVRyYWlsZXIocENyZWF0b3ItPm1fcERvY3VtZW50LCBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdG9yLT5tX3BJREFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENyZWF0b3ItPm1fYkNvbXByZXNzKSkgPCAwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiBiUmV0OwotfQotRlhfQk9PTCBDUERGX0NyZWF0b3I6OkNyZWF0ZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzKQotewotICAgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUoZmlsZW5hbWUpKSB7CisgICAgb2Zmc2V0ICs9IGxlbjsKKyAgICBpZiAocENyZWF0b3ItPm1fcEVuY3J5cHREaWN0KSB7CisgICAgICBGWF9EV09SRCBkd0VuY3J5cHRPYmpOdW0gPSBwQ3JlYXRvci0+bV9wRW5jcnlwdERpY3QtPkdldE9iak51bSgpOworICAgICAgaWYgKGR3RW5jcnlwdE9iak51bSA9PSAwKSB7CisgICAgICAgIGR3RW5jcnlwdE9iak51bSA9IHBDcmVhdG9yLT5tX2R3RW5yeXB0T2JqTnVtOworICAgICAgfQorICAgICAgaWYgKChsZW4gPSBQREZfQ3JlYXRvcldyaXRlRW5jcnlwdChwQ3JlYXRvci0+bV9wRW5jcnlwdERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RW5jcnlwdE9iak51bSwgcEZpbGUpKSA8IDApIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IGxlbjsKICAgICB9Ci0gICAgRlhfQk9PTCBiUmV0ID0gQ3JlYXRlKGZsYWdzKTsKLSAgICBpZiAoIWJSZXQgfHwgIShmbGFncyAmIEZQREZDUkVBVEVfUFJPR1JFU1NJVkUpKSB7Ci0gICAgICAgIENsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBiUmV0OworICB9CisgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj5zdHJlYW1cclxuIikpKSA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgb2Zmc2V0ICs9IGxlbjsKKyAgaWYgKHBGaWxlLT5BcHBlbmRCbG9jayhlbmNvZGVyLm1fcERhdGEsIGVuY29kZXIubV9kd1NpemUpIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlxyXG5lbmRzdHJlYW1cclxuZW5kb2JqXHJcbiIpKSkgPAorICAgICAgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBvZmZzZXQgKz0gZW5jb2Rlci5tX2R3U2l6ZSArIGxlbjsKKyAgbV9QcmV2T2Zmc2V0ID0gb2Zmc2V0X3RtcDsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfQ3JlYXRvcjo6Q3JlYXRlKElGWF9TdHJlYW1Xcml0ZSogcEZpbGUsIEZYX0RXT1JEIGZsYWdzKQotewotICAgIGlmICghcEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIW1fRmlsZS5BdHRhY2hGaWxlKHBGaWxlLCBGQUxTRSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gQ3JlYXRlKGZsYWdzKTsKK0ZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpFbmQoQ1BERl9DcmVhdG9yKiBwQ3JlYXRvciwgRlhfQk9PTCBiRU9GKSB7CisgIGlmIChFbmRPYmplY3RTdHJlYW0ocENyZWF0b3IsIGJFT0YpIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gR2VuZXJhdGVYUmVmU3RyZWFtKHBDcmVhdG9yLCBiRU9GKTsKIH0KLUZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoRlhfRFdPUkQgZmxhZ3MpCi17Ci0gICAgbV9kd0ZsYWdzID0gZmxhZ3M7Ci0gICAgbV9pU3RhZ2UgPSAwOwotICAgIG1fT2Zmc2V0ID0gMDsKLSAgICBtX2R3TGFzdE9iak51bSA9IG1fcERvY3VtZW50LT5HZXRMYXN0T2JqTnVtKCk7Ci0gICAgbV9PYmplY3RPZmZzZXQuQ2xlYXIoKTsKLSAgICBtX09iamVjdFNpemUuQ2xlYXIoKTsKLSAgICBtX05ld09iak51bUFycmF5LlJlbW92ZUFsbCgpOwotICAgIEluaXRJRCgpOwotICAgIGlmIChmbGFncyAmIEZQREZDUkVBVEVfUFJPR1JFU1NJVkUpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQREZfWFJlZlN0cmVhbTo6RW5kWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yKSB7CisgIGlmICghKHBDcmVhdG9yLT5tX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSkgeworICAgIF9BcHBlbmRJbmRleDAobV9CdWZmZXIpOworICAgIGZvciAoRlhfRFdPUkQgaSA9IDE7IGkgPCBwQ3JlYXRvci0+bV9kd0xhc3RPYmpOdW0gKyAxOyBpKyspIHsKKyAgICAgIEZYX0ZJTEVTSVpFKiBvZmZzZXQgPSBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoaSk7CisgICAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX0FwcGVuZEluZGV4MChtX0J1ZmZlciwgRkFMU0UpOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gQ29udGludWUoTlVMTCkgPiAtMTsKKyAgfSBlbHNlIHsKKyAgICBpbnQzMl90IGlTZWcgPSBtX0luZGV4QXJyYXkuR2V0U2l6ZSgpIC8gMjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGlTZWc7IGkrKykgeworICAgICAgRlhfRFdPUkQgc3RhcnQgPSBtX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyKTsKKyAgICAgIEZYX0RXT1JEIGVuZCA9IG1fSW5kZXhBcnJheS5FbGVtZW50QXQoaSAqIDIgKyAxKSArIHN0YXJ0OworICAgICAgZm9yIChGWF9EV09SRCBqID0gc3RhcnQ7IGogPCBlbmQ7IGorKykgeworICAgICAgICBfQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXRbal0pOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gR2VuZXJhdGVYUmVmU3RyZWFtKHBDcmVhdG9yLCBGQUxTRSk7CiB9Ci12b2lkIENQREZfQ3JlYXRvcjo6SW5pdElEKEZYX0JPT0wgYkRlZmF1bHQgKQotewotICAgIENQREZfQXJyYXkqIHBPbGRJREFycmF5ID0gbV9wUGFyc2VyID8gbV9wUGFyc2VyLT5HZXRJREFycmF5KCkgOiBOVUxMOwotICAgIEZYX0JPT0wgYk5ld0lkID0gIW1fcElEQXJyYXk7Ci0gICAgaWYgKCFtX3BJREFycmF5KSB7Ci0gICAgICAgIEZYX0RXT1JEKiBwQnVmZmVyID0gTlVMTDsKLSAgICAgICAgbV9wSURBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwotICAgICAgICBDUERGX09iamVjdCogcElEMSA9IHBPbGRJREFycmF5ID8gcE9sZElEQXJyYXktPkdldEVsZW1lbnQoMCkgOiBOVUxMOwotICAgICAgICBpZiAocElEMSkgewotICAgICAgICAgICAgbV9wSURBcnJheS0+QWRkKHBJRDEtPkNsb25lKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEJ1ZmZlciA9IEZYX0FsbG9jKEZYX0RXT1JELCA0KTsKLSAgICAgICAgICAgIFBERl9HZW5lcmF0ZUZpbGVJRCgoRlhfRFdPUkQpKHVpbnRwdHJfdCl0aGlzLCBtX2R3TGFzdE9iak51bSwgcEJ1ZmZlcik7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNCdWZmZXIoKGNvbnN0IHVpbnQ4X3QqKXBCdWZmZXIsIDQgKiBzaXplb2YoRlhfRFdPUkQpKTsKLSAgICAgICAgICAgIG1fcElEQXJyYXktPkFkZChDUERGX1N0cmluZzo6Q3JlYXRlKGJzQnVmZmVyLCBUUlVFKSwgbV9wRG9jdW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQnVmZmVyKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKHBCdWZmZXIpOwotICAgICAgICB9CitGWF9CT09MIENQREZfWFJlZlN0cmVhbTo6QWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KEZYX0RXT1JEIG9iam51bSkgeworICBpbnQzMl90IGlTaXplID0gbV9JbmRleEFycmF5LkdldFNpemUoKTsKKyAgaWYgKGlTaXplID09IDApIHsKKyAgICBtX0luZGV4QXJyYXkuQWRkKG9iam51bSk7CisgICAgbV9JbmRleEFycmF5LkFkZCgxKTsKKyAgfSBlbHNlIHsKKyAgICBGWFNZU19hc3NlcnQoaVNpemUgPiAxKTsKKyAgICBGWF9EV09SRCBzdGFydG9iam51bSA9IG1fSW5kZXhBcnJheS5FbGVtZW50QXQoaVNpemUgLSAyKTsKKyAgICBpbnQzMl90IGlDb3VudCA9IG1fSW5kZXhBcnJheS5FbGVtZW50QXQoaVNpemUgLSAxKTsKKyAgICBpZiAob2JqbnVtID09IHN0YXJ0b2JqbnVtICsgaUNvdW50KSB7CisgICAgICBtX0luZGV4QXJyYXlbaVNpemUgLSAxXSA9IGlDb3VudCArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fSW5kZXhBcnJheS5BZGQob2JqbnVtKTsKKyAgICAgIG1fSW5kZXhBcnJheS5BZGQoMSk7CiAgICAgfQotICAgIGlmICghYkRlZmF1bHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocE9sZElEQXJyYXkpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBJRDIgPSBwT2xkSURBcnJheS0+R2V0RWxlbWVudCgxKTsKLSAgICAgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAmJiBtX3BFbmNyeXB0RGljdCAmJiBwSUQyKSB7Ci0gICAgICAgICAgICBtX3BJREFycmF5LT5BZGQocElEMi0+Q2xvbmUoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQqIHBCdWZmZXIgPSBGWF9BbGxvYyhGWF9EV09SRCwgNCk7Ci0gICAgICAgIFBERl9HZW5lcmF0ZUZpbGVJRCgoRlhfRFdPUkQpKHVpbnRwdHJfdCl0aGlzLCBtX2R3TGFzdE9iak51bSwgcEJ1ZmZlcik7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nQyBic0J1ZmZlcigoY29uc3QgdWludDhfdCopcEJ1ZmZlciwgNCAqIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICBtX3BJREFycmF5LT5BZGQoQ1BERl9TdHJpbmc6OkNyZWF0ZShic0J1ZmZlciwgVFJVRSksIG1fcERvY3VtZW50KTsKLSAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BJREFycmF5LT5BZGQobV9wSURBcnJheS0+R2V0RWxlbWVudCgwKS0+Q2xvbmUoKSk7Ci0gICAgaWYgKG1fcEVuY3J5cHREaWN0ICYmICFwT2xkSURBcnJheSAmJiBtX3BQYXJzZXIgJiYgYk5ld0lkKSB7Ci0gICAgICAgIGlmIChtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGaWx0ZXIiKSkgPT0gRlhfQlNUUkMoIlN0YW5kYXJkIikpIHsKLSAgICAgICAgICAgIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIgaGFuZGxlcjsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHVzZXJfcGFzcyA9IG1fcFBhcnNlci0+R2V0UGFzc3dvcmQoKTsKLSAgICAgICAgICAgIEZYX0RXT1JEIGZsYWcgPSBQREZfRU5DUllQVF9DT05URU5UOwotICAgICAgICAgICAgaGFuZGxlci5PbkNyZWF0ZShtX3BFbmNyeXB0RGljdCwgbV9wSURBcnJheSwgKGNvbnN0IHVpbnQ4X3QqKXVzZXJfcGFzcywgdXNlcl9wYXNzLkdldExlbmd0aCgpLCBmbGFnKTsKLSAgICAgICAgICAgIGlmIChtX2JOZXdDcnlwdG8pIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgbV9wQ3J5cHRvSGFuZGxlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBuZXcgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI7Ci0gICAgICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5Jbml0KG1fcEVuY3J5cHREaWN0LCAmaGFuZGxlcik7Ci0gICAgICAgICAgICBtX2JOZXdDcnlwdG8gPSBUUlVFOwotICAgICAgICAgICAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLWludDMyX3QgQ1BERl9DcmVhdG9yOjpDb250aW51ZShJRlhfUGF1c2UgKnBQYXVzZSkKLXsKLSAgICBpZiAobV9pU3RhZ2UgPCAwKSB7Ci0gICAgICAgIHJldHVybiBtX2lTdGFnZTsKLSAgICB9Ci0gICAgaW50MzJfdCBpUmV0ID0gMDsKLSAgICB3aGlsZSAobV9pU3RhZ2UgPCAxMDApIHsKLSAgICAgICAgaWYgKG1faVN0YWdlIDwgMjApIHsKLSAgICAgICAgICAgIGlSZXQgPSBXcml0ZURvY19TdGFnZTEocFBhdXNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChtX2lTdGFnZSA8IDMwKSB7Ci0gICAgICAgICAgICBpUmV0ID0gV3JpdGVEb2NfU3RhZ2UyKHBQYXVzZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9pU3RhZ2UgPCA5MCkgewotICAgICAgICAgICAgaVJldCA9IFdyaXRlRG9jX1N0YWdlMyhwUGF1c2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaVJldCA9IFdyaXRlRG9jX1N0YWdlNChwUGF1c2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpUmV0IDwgbV9pU3RhZ2UpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpUmV0IDwgMSB8fCBtX2lTdGFnZSA9PSAxMDApIHsKLSAgICAgICAgbV9pU3RhZ2UgPSAtMTsKLSAgICAgICAgQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGlSZXQgPiA5OSA/IDAgOiAoaVJldCA8IDEgPyAtMSA6IGlSZXQpOwotICAgIH0KLSAgICByZXR1cm4gbV9pU3RhZ2U7Ci19Ci1GWF9CT09MIENQREZfQ3JlYXRvcjo6U2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbiApCi17Ci0gICAgaWYgKGZpbGVWZXJzaW9uIDwgMTAgfHwgZmlsZVZlcnNpb24gPiAxNykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fRmlsZVZlcnNpb24gPSBmaWxlVmVyc2lvbjsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ1BERl9DcmVhdG9yOjpSZW1vdmVTZWN1cml0eSgpCi17Ci0gICAgUmVzZXRTdGFuZGFyZFNlY3VyaXR5KCk7Ci0gICAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gVFJVRTsKK0NQREZfQ3JlYXRvcjo6Q1BERl9DcmVhdG9yKENQREZfRG9jdW1lbnQqIHBEb2MpIHsKKyAgbV9wRG9jdW1lbnQgPSBwRG9jOworICBtX3BQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKXBEb2MtPm1fcFBhcnNlcjsKKyAgbV9iQ29tcHJlc3MgPSBUUlVFOworICBpZiAobV9wUGFyc2VyKSB7CisgICAgbV9wRW5jcnlwdERpY3QgPSBtX3BQYXJzZXItPkdldEVuY3J5cHREaWN0KCk7CisgICAgbV9wQ3J5cHRvSGFuZGxlciA9IG1fcFBhcnNlci0+R2V0Q3J5cHRvSGFuZGxlcigpOworICB9IGVsc2UgewogICAgIG1fcEVuY3J5cHREaWN0ID0gTlVMTDsKICAgICBtX3BDcnlwdG9IYW5kbGVyID0gTlVMTDsKKyAgfQorICBtX2JTZWN1cml0eUNoYW5nZWQgPSBGQUxTRTsKKyAgbV9iU3RhbmRhcmRTZWN1cml0eSA9IEZBTFNFOworICBtX3BNZXRhZGF0YSA9IE5VTEw7CisgIG1fYkVuY3J5cHRDbG9uZWQgPSBGQUxTRTsKKyAgbV9iRW5jcnlwdE1ldGFkYXRhID0gRkFMU0U7CisgIG1fT2Zmc2V0ID0gMDsKKyAgbV9pU3RhZ2UgPSAtMTsKKyAgbV9kd0ZsYWdzID0gMDsKKyAgbV9Qb3MgPSBOVUxMOworICBtX1hyZWZTdGFydCA9IDA7CisgIG1fcFhSZWZTdHJlYW0gPSBOVUxMOworICBtX09iamVjdFN0cmVhbVNpemUgPSAyMDA7CisgIG1fZHdMYXN0T2JqTnVtID0gbV9wRG9jdW1lbnQtPkdldExhc3RPYmpOdW0oKTsKKyAgbV9wSURBcnJheSA9IE5VTEw7CisgIG1fRmlsZVZlcnNpb24gPSAwOworICBtX2R3RW5yeXB0T2JqTnVtID0gMDsKKyAgbV9iTmV3Q3J5cHRvID0gRkFMU0U7CiB9Ci12b2lkIENQREZfQ3JlYXRvcjo6UmVzZXRTdGFuZGFyZFNlY3VyaXR5KCkKLXsKLSAgICBpZiAobV9iU3RhbmRhcmRTZWN1cml0eSB8fCBtX2JOZXdDcnlwdG8pIHsKLSAgICAgICAgZGVsZXRlIG1fcENyeXB0b0hhbmRsZXI7Ci0gICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOworQ1BERl9DcmVhdG9yOjp+Q1BERl9DcmVhdG9yKCkgeworICBSZXNldFN0YW5kYXJkU2VjdXJpdHkoKTsKKyAgaWYgKG1fYkVuY3J5cHRDbG9uZWQgJiYgbV9wRW5jcnlwdERpY3QpIHsKKyAgICBtX3BFbmNyeXB0RGljdC0+UmVsZWFzZSgpOworICAgIG1fcEVuY3J5cHREaWN0ID0gTlVMTDsKKyAgfQorICBDbGVhcigpOworfQorc3RhdGljIEZYX0JPT0wgX0lzWFJlZk5lZWRFbmQoQ1BERl9YUmVmU3RyZWFtKiBwWFJlZiwgRlhfRFdPUkQgZmxhZykgeworICBpZiAoIShmbGFnICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50MzJfdCBpU2l6ZSA9IHBYUmVmLT5tX0luZGV4QXJyYXkuR2V0U2l6ZSgpIC8gMjsKKyAgaW50MzJfdCBpQ291bnQgPSAwOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7CisgICAgaUNvdW50ICs9IHBYUmVmLT5tX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyICsgMSk7CisgIH0KKyAgcmV0dXJuIChpQ291bnQgPj0gUERGX1hSRUZTVFJFQU1fTUFYU0laRSk7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGlmICghbV9wWFJlZlN0cmVhbSkgeworICAgIHJldHVybiAxOworICB9CisgIEZYX0RXT1JEIG9iam51bSA9IHBPYmotPkdldE9iak51bSgpOworICBpZiAobV9wUGFyc2VyICYmIG1fcFBhcnNlci0+bV9PYmpWZXJzaW9uLkdldFNpemUoKSA+IChpbnQzMl90KW9iam51bSAmJgorICAgICAgbV9wUGFyc2VyLT5tX09ialZlcnNpb25bb2JqbnVtXSA+IDApIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOworICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKKyAgICBpZiAocERpY3QgJiYgcERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiVHlwZSIpKSA9PSBGWF9CU1RSQygiWFJlZiIpKSB7CisgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgbV9iTmV3Q3J5cHRvID0gRkFMU0U7Ci0gICAgaWYgKCFtX2JTdGFuZGFyZFNlY3VyaXR5KSB7Ci0gICAgICAgIHJldHVybjsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAocERpY3QpIHsKKyAgICBpZiAocERpY3QgPT0gbV9wRG9jdW1lbnQtPm1fcFJvb3REaWN0IHx8IHBEaWN0ID09IG1fcEVuY3J5cHREaWN0KSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKElzU2lnbmF0dXJlRGljdChwRGljdCkpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiVHlwZSIpKSA9PSBGWF9CU1RSQygiUGFnZSIpKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgbV9wWFJlZlN0cmVhbS0+QWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KG9iam51bSk7CisgIGlmIChtX3BYUmVmU3RyZWFtLT5Db21wcmVzc0luZGlyZWN0T2JqZWN0KG9iam51bSwgcE9iaiwgdGhpcykgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICghX0lzWFJlZk5lZWRFbmQobV9wWFJlZlN0cmVhbSwgbV9kd0ZsYWdzKSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghbV9wWFJlZlN0cmVhbS0+RW5kKHRoaXMpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICghbV9wWFJlZlN0cmVhbS0+U3RhcnQoKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKK30KK2ludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZUluZGlyZWN0T2JqZWN0VG9TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NpemUpIHsKKyAgaWYgKCFtX3BYUmVmU3RyZWFtKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbV9wWFJlZlN0cmVhbS0+QWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KG9iam51bSk7CisgIGludDMyX3QgaVJldCA9CisgICAgICBtX3BYUmVmU3RyZWFtLT5Db21wcmVzc0luZGlyZWN0T2JqZWN0KG9iam51bSwgcEJ1ZmZlciwgZHdTaXplLCB0aGlzKTsKKyAgaWYgKGlSZXQgPCAxKSB7CisgICAgcmV0dXJuIGlSZXQ7CisgIH0KKyAgaWYgKCFfSXNYUmVmTmVlZEVuZChtX3BYUmVmU3RyZWFtLCBtX2R3RmxhZ3MpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFtX3BYUmVmU3RyZWFtLT5FbmQodGhpcykpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKCFtX3BYUmVmU3RyZWFtLT5TdGFydCgpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAwOworfQoraW50MzJfdCBDUERGX0NyZWF0b3I6OkFwcGVuZE9iamVjdE51bWJlclRvWFJlZihGWF9EV09SRCBvYmpudW0pIHsKKyAgaWYgKCFtX3BYUmVmU3RyZWFtKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbV9wWFJlZlN0cmVhbS0+QWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KG9iam51bSk7CisgIGlmICghX0lzWFJlZk5lZWRFbmQobV9wWFJlZlN0cmVhbSwgbV9kd0ZsYWdzKSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghbV9wWFJlZlN0cmVhbS0+RW5kKHRoaXMpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICghbV9wWFJlZlN0cmVhbS0+U3RhcnQoKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKK30KK2ludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZVN0cmVhbShjb25zdCBDUERGX09iamVjdCogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvKSB7CisgIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXI7CisgIGVuY29kZXIuSW5pdGlhbGl6ZSgoQ1BERl9TdHJlYW0qKXBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtID09IG1fcE1ldGFkYXRhID8gRkFMU0UgOiBtX2JDb21wcmVzcyk7CisgIENQREZfRW5jcnlwdG9yIGVuY3J5cHRvcjsKKyAgaWYgKCFlbmNyeXB0b3IuSW5pdGlhbGl6ZShwQ3J5cHRvLCBvYmpudW0sIGVuY29kZXIubV9wRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLm1fZHdTaXplKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoKEZYX0RXT1JEKWVuY29kZXIubV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIikpICE9CisgICAgICBlbmNyeXB0b3IubV9kd1NpemUpIHsKKyAgICBlbmNvZGVyLkNsb25lRGljdCgpOworICAgIGVuY29kZXIubV9wRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSwgZW5jcnlwdG9yLm1fZHdTaXplKTsKKyAgfQorICBpZiAoV3JpdGVEaXJlY3RPYmoob2JqbnVtLCBlbmNvZGVyLm1fcERpY3QpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpbnQgbGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygic3RyZWFtXHJcbiIpKTsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgbV9PZmZzZXQgKz0gbGVuOworICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKGVuY3J5cHRvci5tX3BEYXRhLCBlbmNyeXB0b3IubV9kd1NpemUpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBtX09mZnNldCArPSBlbmNyeXB0b3IubV9kd1NpemU7CisgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZHN0cmVhbSIpKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIG1fT2Zmc2V0ICs9IGxlbjsKKyAgcmV0dXJuIDE7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVJbmRpcmVjdE9iaihGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX09iamVjdCogcE9iaikgeworICBpbnQzMl90IGxlbiA9IG1fRmlsZS5BcHBlbmREV29yZChvYmpudW0pOworICBpZiAobGVuIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBtX09mZnNldCArPSBsZW47CisgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgb2JqXHJcbiIpKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIG1fT2Zmc2V0ICs9IGxlbjsKKyAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CisgICAgQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciA9IE5VTEw7CisgICAgcEhhbmRsZXIgPQorICAgICAgICAocE9iaiA9PSBtX3BNZXRhZGF0YSAmJiAhbV9iRW5jcnlwdE1ldGFkYXRhKSA/IE5VTEwgOiBtX3BDcnlwdG9IYW5kbGVyOworICAgIGlmIChXcml0ZVN0cmVhbShwT2JqLCBvYmpudW0sIHBIYW5kbGVyKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKFdyaXRlRGlyZWN0T2JqKG9iam51bSwgcE9iaikgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZG9ialxyXG4iKSkpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBtX09mZnNldCArPSBsZW47CisgIGlmIChBcHBlbmRPYmplY3ROdW1iZXJUb1hSZWYob2JqbnVtKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVJbmRpcmVjdE9iaihjb25zdCBDUERGX09iamVjdCogcE9iaikgeworICBpbnQzMl90IGlSZXQgPSBXcml0ZUluZGlyZWN0T2JqZWN0VG9TdHJlYW0ocE9iaik7CisgIGlmIChpUmV0IDwgMSkgeworICAgIHJldHVybiBpUmV0OworICB9CisgIHJldHVybiBXcml0ZUluZGlyZWN0T2JqKHBPYmotPkdldE9iak51bSgpLCBwT2JqKTsKK30KK2ludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZURpcmVjdE9iaihGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9PYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5jcnlwdCkgeworICBpbnQzMl90IGxlbiA9IDA7CisgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIG51bGwiKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1fT2Zmc2V0ICs9IDU7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIFBERk9CSl9OVUxMOgorICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiBudWxsIikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBtX09mZnNldCArPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZPQkpfQk9PTEVBTjoKKyAgICBjYXNlIFBERk9CSl9OVU1CRVI6CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKHBPYmotPkdldFN0cmluZygpKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERk9CSl9TVFJJTkc6IHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOworICAgICAgRlhfQk9PTCBiSGV4ID0gKChDUERGX1N0cmluZyopcE9iaiktPklzSGV4KCk7CisgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlciA9PSBOVUxMIHx8ICFiRW5jcnlwdCkgeworICAgICAgICBDRlhfQnl0ZVN0cmluZyBjb250ZW50ID0gUERGX0VuY29kZVN0cmluZyhzdHIsIGJIZXgpOworICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoY29udGVudCkpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtX09mZnNldCArPSBsZW47CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ1BERl9FbmNyeXB0b3IgZW5jcnlwdG9yOworICAgICAgZW5jcnlwdG9yLkluaXRpYWxpemUobV9wQ3J5cHRvSGFuZGxlciwgb2JqbnVtLCAodWludDhfdCopc3RyLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIuR2V0TGVuZ3RoKCkpOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY29udGVudCA9IFBERl9FbmNvZGVTdHJpbmcoCisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKWVuY3J5cHRvci5tX3BEYXRhLCBlbmNyeXB0b3IubV9kd1NpemUpLAorICAgICAgICAgIGJIZXgpOworICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKGNvbnRlbnQpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbV9PZmZzZXQgKz0gbGVuOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX1NUUkVBTTogeworICAgICAgQ1BERl9GbGF0ZUVuY29kZXIgZW5jb2RlcjsKKyAgICAgIGVuY29kZXIuSW5pdGlhbGl6ZSgoQ1BERl9TdHJlYW0qKXBPYmosIG1fYkNvbXByZXNzKTsKKyAgICAgIENQREZfRW5jcnlwdG9yIGVuY3J5cHRvcjsKKyAgICAgIENQREZfQ3J5cHRvSGFuZGxlciogcEhhbmRsZXIgPSBtX3BDcnlwdG9IYW5kbGVyOworICAgICAgZW5jcnlwdG9yLkluaXRpYWxpemUocEhhbmRsZXIsIG9iam51bSwgZW5jb2Rlci5tX3BEYXRhLCBlbmNvZGVyLm1fZHdTaXplKTsKKyAgICAgIGlmICgoRlhfRFdPUkQpZW5jb2Rlci5tX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSkgIT0KKyAgICAgICAgICBlbmNyeXB0b3IubV9kd1NpemUpIHsKKyAgICAgICAgZW5jb2Rlci5DbG9uZURpY3QoKTsKKyAgICAgICAgZW5jb2Rlci5tX3BEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBlbmNyeXB0b3IubV9kd1NpemUpOworICAgICAgfQorICAgICAgaWYgKFdyaXRlRGlyZWN0T2JqKG9iam51bSwgZW5jb2Rlci5tX3BEaWN0KSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJzdHJlYW1cclxuIikpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbV9PZmZzZXQgKz0gbGVuOworICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhlbmNyeXB0b3IubV9wRGF0YSwgZW5jcnlwdG9yLm1fZHdTaXplKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbV9PZmZzZXQgKz0gZW5jcnlwdG9yLm1fZHdTaXplOworICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJcclxuZW5kc3RyZWFtIikpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbV9PZmZzZXQgKz0gbGVuOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX05BTUU6IHsKKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvIikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKKyAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhQREZfTmFtZUVuY29kZShzdHIpKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgQ1BERl9SZWZlcmVuY2UqIHAgPSAoQ1BERl9SZWZlcmVuY2UqKXBPYmo7CisgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmREV29yZChwLT5HZXRSZWZPYmpOdW0oKSkpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbV9PZmZzZXQgKz0gbGVuICsgNTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9BUlJBWTogeworICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlsiKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IDE7CisgICAgICBDUERGX0FycmF5KiBwID0gKENQREZfQXJyYXkqKXBPYmo7CisgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcC0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHAtPkdldEVsZW1lbnQoaSk7CisgICAgICAgIGlmIChwRWxlbWVudC0+R2V0T2JqTnVtKCkpIHsKKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kRFdvcmQocEVsZW1lbnQtPkdldE9iak51bSgpKSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSIikpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyA1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIHBFbGVtZW50KSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJdIikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBtX09mZnNldCArPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKKyAgICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyID09IE5VTEwgfHwgcE9iaiA9PSBtX3BFbmNyeXB0RGljdCkgeworICAgICAgICByZXR1cm4gUERGX0NyZWF0b3JBcHBlbmRPYmplY3QocE9iaiwgJm1fRmlsZSwgbV9PZmZzZXQpOworICAgICAgfQorICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIjw8IikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBtX09mZnNldCArPSAyOworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKKyAgICAgIEZYX0JPT0wgYlNpZ25EaWN0ID0gSXNTaWduYXR1cmVEaWN0KHApOworICAgICAgRlhfUE9TSVRJT04gcG9zID0gcC0+R2V0U3RhcnRQb3MoKTsKKyAgICAgIHdoaWxlIChwb3MpIHsKKyAgICAgICAgRlhfQk9PTCBiU2lnblZhbHVlID0gRkFMU0U7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IHAtPkdldE5leHRFbGVtZW50KHBvcywga2V5KTsKKyAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi8iKSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhQREZfTmFtZUVuY29kZShrZXkpKSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1fT2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICAgIGlmIChiU2lnbkRpY3QgJiYga2V5ID09IEZYX0JTVFJDKCJDb250ZW50cyIpKSB7CisgICAgICAgICAgYlNpZ25WYWx1ZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIHsKKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kRFdvcmQocFZhbHVlLT5HZXRPYmpOdW0oKSkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiAiKSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIG1fT2Zmc2V0ICs9IGxlbiArIDY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKFdyaXRlRGlyZWN0T2JqKG9iam51bSwgcFZhbHVlLCAhYlNpZ25WYWx1ZSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj4iKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IDI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVPbGRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0pIHsKKyAgaWYgKG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAwIHx8IG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyNTUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtX09iamVjdE9mZnNldFtvYmpudW1dID0gbV9PZmZzZXQ7CisgIHZvaWQqIHZhbHVldGVtcCA9IE5VTEw7CisgIEZYX0JPT0wgYkV4aXN0SW5NYXAgPQorICAgICAgbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sIHZhbHVldGVtcCk7CisgIEZYX0JPT0wgYk9ialN0bSA9CisgICAgICAobV9wUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDIpICYmIG1fcEVuY3J5cHREaWN0ICYmICFtX3BYUmVmU3RyZWFtOworICBpZiAobV9wUGFyc2VyLT5tX2JWZXJzaW9uVXBkYXRlZCB8fCBtX2JTZWN1cml0eUNoYW5nZWQgfHwgYkV4aXN0SW5NYXAgfHwKKyAgICAgIGJPYmpTdG0pIHsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IG1fcERvY3VtZW50LT5HZXRJbmRpcmVjdE9iamVjdChvYmpudW0pOworICAgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICAgIG1fT2JqZWN0T2Zmc2V0W29iam51bV0gPSAwOworICAgICAgbV9PYmplY3RTaXplW29iam51bV0gPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChXcml0ZUluZGlyZWN0T2JqKHBPYmopKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghYkV4aXN0SW5NYXApIHsKKyAgICAgIG1fcERvY3VtZW50LT5SZWxlYXNlSW5kaXJlY3RPYmplY3Qob2JqbnVtKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogcEJ1ZmZlcjsKKyAgICBGWF9EV09SRCBzaXplOworICAgIG1fcFBhcnNlci0+R2V0SW5kaXJlY3RCaW5hcnkob2JqbnVtLCBwQnVmZmVyLCBzaXplKTsKKyAgICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyKSB7CisgICAgICBpZiAobV9wWFJlZlN0cmVhbSkgeworICAgICAgICBpZiAoV3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKG9iam51bSwgcEJ1ZmZlciwgc2l6ZSkgPCAwKSB7CisgICAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3QgbGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKG9iam51bSk7CisgICAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBvYmogIikpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtX09mZnNldCArPSBsZW4gKyA3OworICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKHBCdWZmZXIsIHNpemUpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtX09mZnNldCArPSBzaXplOworICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZG9ialxyXG4iKSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1fT2Zmc2V0ICs9IDEwOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKHBCdWZmZXIsIHNpemUpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBtX09mZnNldCArPSBzaXplOworICAgICAgaWYgKEFwcGVuZE9iamVjdE51bWJlclRvWFJlZihvYmpudW0pIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICAgIEZYX0ZyZWUocEJ1ZmZlcik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVPbGRPYmpzKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0RXT1JEIG5PbGRTaXplID0gbV9wUGFyc2VyLT5tX0Nyb3NzUmVmLkdldFNpemUoKTsKKyAgRlhfRFdPUkQgb2JqbnVtID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9Qb3M7CisgIGZvciAoOyBvYmpudW0gPCBuT2xkU2l6ZTsgb2JqbnVtKyspIHsKKyAgICBpbnQzMl90IGlSZXQgPSBXcml0ZU9sZEluZGlyZWN0T2JqZWN0KG9iam51bSk7CisgICAgaWYgKCFpUmV0KSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGlSZXQgPCAwKSB7CisgICAgICByZXR1cm4gaVJldDsKKyAgICB9CisgICAgbV9PYmplY3RTaXplW29iam51bV0gPSAoRlhfRFdPUkQpKG1fT2Zmc2V0IC0gbV9PYmplY3RPZmZzZXRbb2JqbnVtXSk7CisgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpKG9iam51bSArIDEpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQoraW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlTmV3T2JqcyhGWF9CT09MIGJJbmNyZW1lbnRhbCwgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaW50MzJfdCBpQ291bnQgPSBtX05ld09iak51bUFycmF5LkdldFNpemUoKTsKKyAgaW50MzJfdCBpbmRleCA9IChpbnQzMl90KSh1aW50cHRyX3QpbV9Qb3M7CisgIHdoaWxlIChpbmRleCA8IGlDb3VudCkgeworICAgIEZYX0RXT1JEIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGluZGV4KTsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IE5VTEw7CisgICAgbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sICh2b2lkKiYpcE9iaik7CisgICAgaWYgKE5VTEwgPT0gcE9iaikgeworICAgICAgKytpbmRleDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBtX09iamVjdE9mZnNldFtvYmpudW1dID0gbV9PZmZzZXQ7CisgICAgaWYgKFdyaXRlSW5kaXJlY3RPYmoocE9iaikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbV9PYmplY3RTaXplW29iam51bV0gPSAoRlhfRFdPUkQpKG1fT2Zmc2V0IC0gbV9PYmplY3RPZmZzZXRbb2JqbnVtXSk7CisgICAgaW5kZXgrKzsKKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgbV9Qb3MgPSAoRlhfUE9TSVRJT04pKHVpbnRwdHJfdClpbmRleDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KK3ZvaWQgQ1BERl9DcmVhdG9yOjpJbml0T2xkT2JqTnVtT2Zmc2V0cygpIHsKKyAgaWYgKCFtX3BQYXJzZXIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRFdPUkQgaiA9IDA7CisgIEZYX0RXT1JEIGR3U3RhcnQgPSAwOworICBGWF9EV09SRCBkd0VuZCA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOworICB3aGlsZSAoZHdTdGFydCA8PSBkd0VuZCkgeworICAgIHdoaWxlIChkd1N0YXJ0IDw9IGR3RW5kICYmIChtX3BQYXJzZXItPm1fVjVUeXBlW2R3U3RhcnRdID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5tX1Y1VHlwZVtkd1N0YXJ0XSA9PSAyNTUpKSB7CisgICAgICBkd1N0YXJ0Kys7CisgICAgfQorICAgIGlmIChkd1N0YXJ0ID4gZHdFbmQpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBqID0gZHdTdGFydDsKKyAgICB3aGlsZSAoaiA8PSBkd0VuZCAmJiBtX3BQYXJzZXItPm1fVjVUeXBlW2pdICE9IDAgJiYKKyAgICAgICAgICAgbV9wUGFyc2VyLT5tX1Y1VHlwZVtqXSAhPSAyNTUpIHsKKyAgICAgIGorKzsKKyAgICB9CisgICAgbV9PYmplY3RPZmZzZXQuQWRkKGR3U3RhcnQsIGogLSBkd1N0YXJ0KTsKKyAgICBtX09iamVjdFNpemUuQWRkKGR3U3RhcnQsIGogLSBkd1N0YXJ0KTsKKyAgICBkd1N0YXJ0ID0gajsKKyAgfQorfQordm9pZCBDUERGX0NyZWF0b3I6OkluaXROZXdPYmpOdW1PZmZzZXRzKCkgeworICBGWF9CT09MIGJJbmNyZW1lbnRhbCA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwOworICBGWF9CT09MIGJOb09yaWdpbmFsID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpICE9IDA7CisgIEZYX0RXT1JEIG5PbGRTaXplID0gbV9wUGFyc2VyID8gbV9wUGFyc2VyLT5tX0Nyb3NzUmVmLkdldFNpemUoKSA6IDA7CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fcERvY3VtZW50LT5tX0luZGlyZWN0T2Jqcy5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBzaXplX3Qga2V5ID0gMDsKKyAgICBDUERGX09iamVjdCogcE9iajsKKyAgICBtX3BEb2N1bWVudC0+bV9JbmRpcmVjdE9ianMuR2V0TmV4dEFzc29jKHBvcywgKHZvaWQqJilrZXksICh2b2lkKiYpcE9iaik7CisgICAgRlhfRFdPUkQgb2JqbnVtID0gKEZYX0RXT1JEKWtleTsKKyAgICBpZiAocE9iai0+R2V0T2JqTnVtKCkgPT0gLTEpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoYkluY3JlbWVudGFsKSB7CisgICAgICBpZiAoIXBPYmotPklzTW9kaWZpZWQoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG9iam51bSA8IG5PbGRTaXplICYmIG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSAhPSAwKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICBBcHBlbmROZXdPYmpOdW0ob2JqbnVtKTsKKyAgfQorICBpbnQzMl90IGlDb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuR2V0U2l6ZSgpOworICBpZiAoaUNvdW50ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50MzJfdCBpID0gMDsKKyAgRlhfRFdPUkQgZHdTdGFydE9iak51bSA9IDA7CisgIEZYX0JPT0wgYkNyb3NzUmVmVmFsaWQgPSBtX3BQYXJzZXIgJiYgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID4gMDsKKyAgd2hpbGUgKGkgPCBpQ291bnQpIHsKKyAgICBkd1N0YXJ0T2JqTnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7CisgICAgaWYgKChiSW5jcmVtZW50YWwgJiYgKGJOb09yaWdpbmFsIHx8IGJDcm9zc1JlZlZhbGlkKSkgfHwKKyAgICAgICAgIW1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGR3U3RhcnRPYmpOdW0pKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaSsrOworICB9CisgIGlmIChpID49IGlDb3VudCkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9EV09SRCBkd0xhc3RPYmpOdW0gPSBkd1N0YXJ0T2JqTnVtOworICBpKys7CisgIEZYX0JPT0wgYk5ld1N0YXJ0ID0gRkFMU0U7CisgIGZvciAoOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICBGWF9EV09SRCBkd0N1ck9iak51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGkpOworICAgIEZYX0JPT0wgYkV4aXN0ID0gKGR3Q3VyT2JqTnVtIDwgbk9sZFNpemUgJiYKKyAgICAgICAgICAgICAgICAgICAgICBtX09iamVjdE9mZnNldC5HZXRQdHJBdChkd0N1ck9iak51bSkgIT0gTlVMTCk7CisgICAgaWYgKGJFeGlzdCB8fCBkd0N1ck9iak51bSAtIGR3TGFzdE9iak51bSA+IDEpIHsKKyAgICAgIGlmICghYk5ld1N0YXJ0KSB7CisgICAgICAgIG1fT2JqZWN0T2Zmc2V0LkFkZChkd1N0YXJ0T2JqTnVtLCBkd0xhc3RPYmpOdW0gLSBkd1N0YXJ0T2JqTnVtICsgMSk7CisgICAgICAgIG1fT2JqZWN0U2l6ZS5BZGQoZHdTdGFydE9iak51bSwgZHdMYXN0T2JqTnVtIC0gZHdTdGFydE9iak51bSArIDEpOworICAgICAgfQorICAgICAgZHdTdGFydE9iak51bSA9IGR3Q3VyT2JqTnVtOworICAgIH0KKyAgICBpZiAoYk5ld1N0YXJ0KSB7CisgICAgICBkd1N0YXJ0T2JqTnVtID0gZHdDdXJPYmpOdW07CisgICAgfQorICAgIGJOZXdTdGFydCA9IGJFeGlzdDsKKyAgICBkd0xhc3RPYmpOdW0gPSBkd0N1ck9iak51bTsKKyAgfQorICBtX09iamVjdE9mZnNldC5BZGQoZHdTdGFydE9iak51bSwgZHdMYXN0T2JqTnVtIC0gZHdTdGFydE9iak51bSArIDEpOworICBtX09iamVjdFNpemUuQWRkKGR3U3RhcnRPYmpOdW0sIGR3TGFzdE9iak51bSAtIGR3U3RhcnRPYmpOdW0gKyAxKTsKK30KK3ZvaWQgQ1BERl9DcmVhdG9yOjpBcHBlbmROZXdPYmpOdW0oRlhfRFdPUkQgb2JqYnVtKSB7CisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUZpbmQgPSAwOworICBpbnQzMl90IGlFbmQgPSBtX05ld09iak51bUFycmF5LkdldFVwcGVyQm91bmQoKTsKKyAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7CisgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKKyAgICBGWF9EV09SRCBkd01pZCA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGlNaWQpOworICAgIGlmIChvYmpidW0gPCBkd01pZCkgeworICAgICAgaUVuZCA9IGlNaWQgLSAxOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaU1pZCA9PSBpRW5kKSB7CisgICAgICAgIGlGaW5kID0gaU1pZCArIDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgRlhfRFdPUkQgZHdOZXh0ID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaU1pZCArIDEpOworICAgICAgaWYgKG9iamJ1bSA8IGR3TmV4dCkgeworICAgICAgICBpRmluZCA9IGlNaWQgKyAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOworICAgIH0KKyAgfQorICBtX05ld09iak51bUFycmF5Lkluc2VydEF0KGlGaW5kLCBvYmpidW0pOworfQoraW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlRG9jX1N0YWdlMShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWFNZU19hc3NlcnQobV9pU3RhZ2UgPiAtMSB8fCBtX2lTdGFnZSA8IDIwKTsKKyAgaWYgKG1faVN0YWdlID09IDApIHsKKyAgICBpZiAobV9wUGFyc2VyID09IE5VTEwpIHsKKyAgICAgIG1fZHdGbGFncyAmPSB+RlBERkNSRUFURV9JTkNSRU1FTlRBTDsKKyAgICB9CisgICAgaWYgKG1fYlNlY3VyaXR5Q2hhbmdlZCAmJiAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9OT19PUklHSU5BTCkgPT0gMCkgeworICAgICAgbV9kd0ZsYWdzICY9IH5GUERGQ1JFQVRFX0lOQ1JFTUVOVEFMOworICAgIH0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKKyAgICBtX3BNZXRhZGF0YSA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiTWV0YWRhdGEiKSkgOiBOVUxMOworICAgIGlmIChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX09CSkVDVFNUUkVBTSkgeworICAgICAgbV9wWFJlZlN0cmVhbSA9IG5ldyBDUERGX1hSZWZTdHJlYW07CisgICAgICBtX3BYUmVmU3RyZWFtLT5TdGFydCgpOworICAgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwICYmIG1fcFBhcnNlcikgeworICAgICAgICBGWF9GSUxFU0laRSBwcmV2ID0gbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpOworICAgICAgICBtX3BYUmVmU3RyZWFtLT5tX1ByZXZPZmZzZXQgPSBwcmV2OworICAgICAgfQorICAgIH0KKyAgICBtX2lTdGFnZSA9IDEwOworICB9CisgIGlmIChtX2lTdGFnZSA9PSAxMCkgeworICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgPT0gMCkgeworICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiVQREYtMS4iKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IDc7CisgICAgICBpbnQzMl90IHZlcnNpb24gPSA3OworICAgICAgaWYgKG1fRmlsZVZlcnNpb24pIHsKKyAgICAgICAgdmVyc2lvbiA9IG1fRmlsZVZlcnNpb247CisgICAgICB9IGVsc2UgaWYgKG1fcFBhcnNlcikgeworICAgICAgICB2ZXJzaW9uID0gbV9wUGFyc2VyLT5HZXRGaWxlVmVyc2lvbigpOworICAgICAgfQorICAgICAgaW50MzJfdCBsZW4gPSBtX0ZpbGUuQXBwZW5kRFdvcmQodmVyc2lvbiAlIDEwKTsKKyAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IGxlbjsKKyAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbiVceEExXHhCM1x4QzVceEQ3XHJcbiIpKSkgPAorICAgICAgICAgIDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbV9PZmZzZXQgKz0gbGVuOworICAgICAgSW5pdE9sZE9iak51bU9mZnNldHMoKTsKKyAgICAgIG1faVN0YWdlID0gMjA7CisgICAgfSBlbHNlIHsKKyAgICAgIElGWF9GaWxlUmVhZCogcFNyY0ZpbGUgPSBtX3BQYXJzZXItPkdldEZpbGVBY2Nlc3MoKTsKKyAgICAgIG1fT2Zmc2V0ID0gcFNyY0ZpbGUtPkdldFNpemUoKTsKKyAgICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpbV9PZmZzZXQ7CisgICAgICBtX2lTdGFnZSA9IDE1OworICAgIH0KKyAgfQorICBpZiAobV9pU3RhZ2UgPT0gMTUpIHsKKyAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpID09IDAgJiYgbV9Qb3MpIHsKKyAgICAgIElGWF9GaWxlUmVhZCogcFNyY0ZpbGUgPSBtX3BQYXJzZXItPkdldEZpbGVBY2Nlc3MoKTsKKyAgICAgIHVpbnQ4X3QgYnVmZmVyWzQwOTZdOworICAgICAgRlhfRFdPUkQgc3JjX3NpemUgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdCltX1BvczsKKyAgICAgIHdoaWxlIChzcmNfc2l6ZSkgeworICAgICAgICBGWF9EV09SRCBibG9ja19zaXplID0gc3JjX3NpemUgPiA0MDk2ID8gNDA5NiA6IHNyY19zaXplOworICAgICAgICBpZiAoIXBTcmNGaWxlLT5SZWFkQmxvY2soYnVmZmVyLCBtX09mZnNldCAtIHNyY19zaXplLCBibG9ja19zaXplKSkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKGJ1ZmZlciwgYmxvY2tfc2l6ZSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNyY19zaXplIC09IGJsb2NrX3NpemU7CisgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICAgICAgbV9Qb3MgPSAodm9pZCopKHVpbnRwdHJfdClzcmNfc2l6ZTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpID09IDAgJiYKKyAgICAgICAgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID09IDApIHsKKyAgICAgIEluaXRPbGRPYmpOdW1PZmZzZXRzKCk7CisgICAgICBGWF9EV09SRCBkd0VuZCA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOworICAgICAgRlhfQk9PTCBiT2JqU3RtID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSAhPSAwOworICAgICAgZm9yIChGWF9EV09SRCBvYmpudW0gPSAwOyBvYmpudW0gPD0gZHdFbmQ7IG9iam51bSsrKSB7CisgICAgICAgIGlmIChtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMCB8fAorICAgICAgICAgICAgbV9wUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDI1NSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1fT2JqZWN0T2Zmc2V0W29iam51bV0gPSBtX3BQYXJzZXItPm1fQ3Jvc3NSZWZbb2JqbnVtXTsKKyAgICAgICAgaWYgKGJPYmpTdG0pIHsKKyAgICAgICAgICBtX3BYUmVmU3RyZWFtLT5BZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkob2JqbnVtKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGJPYmpTdG0pIHsKKyAgICAgICAgbV9wWFJlZlN0cmVhbS0+RW5kWFJlZlN0cmVhbSh0aGlzKTsKKyAgICAgICAgbV9wWFJlZlN0cmVhbS0+U3RhcnQoKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9pU3RhZ2UgPSAyMDsKKyAgfQorICBJbml0TmV3T2JqTnVtT2Zmc2V0cygpOworICByZXR1cm4gbV9pU3RhZ2U7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEb2NfU3RhZ2UyKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYU1lTX2Fzc2VydChtX2lTdGFnZSA+PSAyMCB8fCBtX2lTdGFnZSA8IDMwKTsKKyAgaWYgKG1faVN0YWdlID09IDIwKSB7CisgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSA9PSAwICYmIG1fcFBhcnNlcikgeworICAgICAgbV9Qb3MgPSAodm9pZCopKHVpbnRwdHJfdCkwOworICAgICAgbV9pU3RhZ2UgPSAyMTsKKyAgICB9IGVsc2UgeworICAgICAgbV9pU3RhZ2UgPSAyNTsKKyAgICB9CisgIH0KKyAgaWYgKG1faVN0YWdlID09IDIxKSB7CisgICAgaW50MzJfdCBpUmV0ID0gV3JpdGVPbGRPYmpzKHBQYXVzZSk7CisgICAgaWYgKGlSZXQpIHsKKyAgICAgIHJldHVybiBpUmV0OworICAgIH0KKyAgICBtX2lTdGFnZSA9IDI1OworICB9CisgIGlmIChtX2lTdGFnZSA9PSAyNSkgeworICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpMDsKKyAgICBtX2lTdGFnZSA9IDI2OworICB9CisgIGlmIChtX2lTdGFnZSA9PSAyNikgeworICAgIGludDMyX3QgaVJldCA9CisgICAgICAgIFdyaXRlTmV3T2JqcygobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCwgcFBhdXNlKTsKKyAgICBpZiAoaVJldCkgeworICAgICAgcmV0dXJuIGlSZXQ7CisgICAgfQorICAgIG1faVN0YWdlID0gMjc7CisgIH0KKyAgaWYgKG1faVN0YWdlID09IDI3KSB7CisgICAgaWYgKE5VTEwgIT0gbV9wRW5jcnlwdERpY3QgJiYgMCA9PSBtX3BFbmNyeXB0RGljdC0+R2V0T2JqTnVtKCkpIHsKKyAgICAgIG1fZHdMYXN0T2JqTnVtICs9IDE7CisgICAgICBGWF9GSUxFU0laRSBzYXZlT2Zmc2V0ID0gbV9PZmZzZXQ7CisgICAgICBpZiAoV3JpdGVJbmRpcmVjdE9iaihtX2R3TGFzdE9iak51bSwgbV9wRW5jcnlwdERpY3QpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBtX09iamVjdE9mZnNldC5BZGQobV9kd0xhc3RPYmpOdW0sIDEpOworICAgICAgbV9PYmplY3RPZmZzZXRbbV9kd0xhc3RPYmpOdW1dID0gc2F2ZU9mZnNldDsKKyAgICAgIG1fT2JqZWN0U2l6ZS5BZGQobV9kd0xhc3RPYmpOdW0sIDEpOworICAgICAgbV9PYmplY3RTaXplW21fZHdMYXN0T2JqTnVtXSA9IG1fT2Zmc2V0IC0gc2F2ZU9mZnNldDsKKyAgICAgIG1fZHdFbnJ5cHRPYmpOdW0gPSBtX2R3TGFzdE9iak51bTsKKyAgICAgIGlmIChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSB7CisgICAgICAgIG1fTmV3T2JqTnVtQXJyYXkuQWRkKG1fZHdMYXN0T2JqTnVtKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9pU3RhZ2UgPSA4MDsKKyAgfQorICByZXR1cm4gbV9pU3RhZ2U7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEb2NfU3RhZ2UzKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYU1lTX2Fzc2VydChtX2lTdGFnZSA+PSA4MCB8fCBtX2lTdGFnZSA8IDkwKTsKKyAgRlhfRFdPUkQgZHdMYXN0T2JqTnVtID0gbV9kd0xhc3RPYmpOdW07CisgIGlmIChtX2lTdGFnZSA9PSA4MCkgeworICAgIG1fWHJlZlN0YXJ0ID0gbV9PZmZzZXQ7CisgICAgaWYgKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSB7CisgICAgICBtX3BYUmVmU3RyZWFtLT5FbmQodGhpcywgVFJVRSk7CisgICAgICBtX1hyZWZTdGFydCA9IG1fcFhSZWZTdHJlYW0tPm1fUHJldk9mZnNldDsKKyAgICAgIG1faVN0YWdlID0gOTA7CisgICAgfSBlbHNlIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgPT0gMCB8fAorICAgICAgICAgICAgICAgIW1fcFBhcnNlci0+SXNYUmVmU3RyZWFtKCkpIHsKKyAgICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgPT0gMCB8fAorICAgICAgICAgIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA9PSAwKSB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKKyAgICAgICAgc3RyID0gbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoMSkKKyAgICAgICAgICAgICAgICAgID8gRlhfQlNUUkMoInhyZWZcclxuIikKKyAgICAgICAgICAgICAgICAgIDogRlhfQlNUUkMoInhyZWZcclxuMCAxXHJcbjAwMDAwMDAwMDAgNjU1MzYgZlxyXG4iKTsKKyAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoc3RyKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbV9Qb3MgPSAodm9pZCopKHVpbnRwdHJfdCkxOworICAgICAgICBtX2lTdGFnZSA9IDgxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoInhyZWZcclxuIikpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KTA7CisgICAgICAgIG1faVN0YWdlID0gODI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1faVN0YWdlID0gOTA7CisgICAgfQorICB9CisgIGlmIChtX2lTdGFnZSA9PSA4MSkgeworICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKKyAgICBGWF9EV09SRCBpID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9Qb3MsIGo7CisgICAgd2hpbGUgKGkgPD0gZHdMYXN0T2JqTnVtKSB7CisgICAgICB3aGlsZSAoaSA8PSBkd0xhc3RPYmpOdW0gJiYgIW1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGkpKSB7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICAgIGlmIChpID4gZHdMYXN0T2JqTnVtKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaiA9IGk7CisgICAgICB3aGlsZSAoaiA8PSBkd0xhc3RPYmpOdW0gJiYgbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoaikpIHsKKyAgICAgICAgaisrOworICAgICAgfQorICAgICAgaWYgKGkgPT0gMSkgeworICAgICAgICBzdHIuRm9ybWF0KCIwICVkXHJcbjAwMDAwMDAwMDAgNjU1MzYgZlxyXG4iLCBqKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ci5Gb3JtYXQoIiVkICVkXHJcbiIsIGksIGogLSBpKTsKKyAgICAgIH0KKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChpIDwgaikgeworICAgICAgICBzdHIuRm9ybWF0KCIlMDEwZCAwMDAwMCBuXHJcbiIsIG1fT2JqZWN0T2Zmc2V0W2krK10pOworICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGkgPiBkd0xhc3RPYmpOdW0pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KWk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgICBtX2lTdGFnZSA9IDkwOworICB9CisgIGlmIChtX2lTdGFnZSA9PSA4MikgeworICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKKyAgICBpbnQzMl90IGlDb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuR2V0U2l6ZSgpOworICAgIGludDMyX3QgaSA9IChpbnQzMl90KSh1aW50cHRyX3QpbV9Qb3M7CisgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKKyAgICAgIGludDMyX3QgaiA9IGk7CisgICAgICBGWF9EV09SRCBvYmpudW0gPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpKTsKKyAgICAgIHdoaWxlIChqIDwgaUNvdW50KSB7CisgICAgICAgIGlmICgrK2ogPT0gaUNvdW50KSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgRlhfRFdPUkQgZHdDdXJyZW50ID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaik7CisgICAgICAgIGlmIChkd0N1cnJlbnQgLSBvYmpudW0gPiAxKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgb2JqbnVtID0gZHdDdXJyZW50OworICAgICAgfQorICAgICAgb2JqbnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7CisgICAgICBpZiAob2JqbnVtID09IDEpIHsKKyAgICAgICAgc3RyLkZvcm1hdCgiMCAlZFxyXG4wMDAwMDAwMDAwIDY1NTM2IGZcclxuIiwgaiAtIGkgKyAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ci5Gb3JtYXQoIiVkICVkXHJcbiIsIG9iam51bSwgaiAtIGkpOworICAgICAgfQorICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgd2hpbGUgKGkgPCBqKSB7CisgICAgICAgIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGkrKyk7CisgICAgICAgIHN0ci5Gb3JtYXQoIiUwMTBkIDAwMDAwIG5cclxuIiwgbV9PYmplY3RPZmZzZXRbb2JqbnVtXSk7CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAocFBhdXNlICYmIChpICUgMTAwKSA9PSAwICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KWk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgICBtX2lTdGFnZSA9IDkwOworICB9CisgIHJldHVybiBtX2lTdGFnZTsKK30KK3N0YXRpYyBpbnQzMl90IF9PdXRQdXRJbmRleChDRlhfRmlsZUJ1ZmZlckFyY2hpdmUqIHBGaWxlLCBGWF9GSUxFU0laRSBvZmZzZXQpIHsKKyAgRlhTWVNfYXNzZXJ0KHBGaWxlKTsKKyAgaWYgKHNpemVvZihvZmZzZXQpID4gNCkgeworICAgIGlmIChGWF9HRVRCWVRFT0ZGU0VUMzIob2Zmc2V0KSkgeworICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ1NihvZmZzZXQpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ0OChvZmZzZXQpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ0MChvZmZzZXQpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQzMihvZmZzZXQpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDI0KG9mZnNldCkpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDE2KG9mZnNldCkpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDgob2Zmc2V0KSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMChvZmZzZXQpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKDApIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKK30KK2ludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZURvY19TdGFnZTQoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhTWVNfYXNzZXJ0KG1faVN0YWdlID49IDkwKTsKKyAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX09CSkVDVFNUUkVBTSkgPT0gMCkgeworICAgIEZYX0JPT0wgYlhSZWZTdHJlYW0gPQorICAgICAgICAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCAmJiBtX3BQYXJzZXItPklzWFJlZlN0cmVhbSgpOworICAgIGlmICghYlhSZWZTdHJlYW0pIHsKKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJ0cmFpbGVyXHJcbjw8IikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQobV9wRG9jdW1lbnQtPm1fTGFzdE9iak51bSArIDEpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgb2JqIDw8IikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICAgIGlmIChtX3BQYXJzZXIpIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcCA9IG1fcFBhcnNlci0+bV9wVHJhaWxlcjsKKyAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHAtPkdldFN0YXJ0UG9zKCk7CisgICAgICB3aGlsZSAocG9zKSB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IHAtPkdldE5leHRFbGVtZW50KHBvcywga2V5KTsKKyAgICAgICAgaWYgKGtleSA9PSBGWF9CU1RSQygiRW5jcnlwdCIpIHx8IGtleSA9PSBGWF9CU1RSQygiU2l6ZSIpIHx8CisgICAgICAgICAgICBrZXkgPT0gRlhfQlNUUkMoIkZpbHRlciIpIHx8IGtleSA9PSBGWF9CU1RSQygiSW5kZXgiKSB8fAorICAgICAgICAgICAga2V5ID09IEZYX0JTVFJDKCJMZW5ndGgiKSB8fCBrZXkgPT0gRlhfQlNUUkMoIlByZXYiKSB8fAorICAgICAgICAgICAga2V5ID09IEZYX0JTVFJDKCJXIikgfHwga2V5ID09IEZYX0JTVFJDKCJYUmVmU3RtIikgfHwKKyAgICAgICAgICAgIGtleSA9PSBGWF9CU1RSQygiSUQiKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKChGWF9CU1RSQygiLyIpKSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKFBERl9OYW1lRW5jb2RlKGtleSkpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocFZhbHVlLT5HZXRPYmpOdW0oKSkgeworICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiAiKSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7CisgICAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBWYWx1ZSwgJm1fRmlsZSwgb2Zmc2V0KSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlxyXG4vUm9vdCAiKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQobV9wRG9jdW1lbnQtPm1fcFJvb3REaWN0LT5HZXRPYmpOdW0oKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSXHJcbiIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKG1fcERvY3VtZW50LT5tX3BJbmZvRGljdCkgeworICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0luZm8gIikpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKG1fcERvY3VtZW50LT5tX3BJbmZvRGljdC0+R2V0T2JqTnVtKCkpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUlxyXG4iKSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CiAgICAgfQogICAgIGlmIChtX3BFbmNyeXB0RGljdCkgewotICAgICAgICBtX3BFbmNyeXB0RGljdC0+UmVsZWFzZSgpOwotICAgICAgICBtX3BFbmNyeXB0RGljdCA9IE5VTEw7CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0VuY3J5cHQiKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIEZYX0RXT1JEIGR3T2JqTnVtID0gbV9wRW5jcnlwdERpY3QtPkdldE9iak51bSgpOworICAgICAgaWYgKGR3T2JqTnVtID09IDApIHsKKyAgICAgICAgZHdPYmpOdW0gPSBtX3BEb2N1bWVudC0+R2V0TGFzdE9iak51bSgpICsgMTsKKyAgICAgIH0KKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKGR3T2JqTnVtKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIFIgIikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CiAgICAgfQotICAgIG1fYlN0YW5kYXJkU2VjdXJpdHkgPSBGQUxTRTsKKyAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL1NpemUgIikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKG1fZHdMYXN0T2JqTnVtICsgKGJYUmVmU3RyZWFtID8gMiA6IDEpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwKSB7CisgICAgICBGWF9GSUxFU0laRSBwcmV2ID0gbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpOworICAgICAgaWYgKHByZXYpIHsKKyAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9QcmV2ICIpKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgRlhfQ0hBUiBvZmZzZXRfYnVmWzIwXTsKKyAgICAgICAgRlhTWVNfbWVtc2V0KG9mZnNldF9idWYsIDAsIHNpemVvZihvZmZzZXRfYnVmKSk7CisgICAgICAgIEZYU1lTX2k2NHRvYShwcmV2LCBvZmZzZXRfYnVmLCAxMCk7CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2sob2Zmc2V0X2J1ZiwgRlhTWVNfc3RybGVuKG9mZnNldF9idWYpKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1fcElEQXJyYXkpIHsKKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKChGWF9CU1RSQygiL0lEIikpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gMDsKKyAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChtX3BJREFycmF5LCAmbV9GaWxlLCBvZmZzZXQpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICAgIGlmICghYlhSZWZTdHJlYW0pIHsKKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCI+PiIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL1dbMCA0IDFdL0luZGV4WyIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwICYmIG1fcFBhcnNlciAmJgorICAgICAgICAgIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA9PSAwKSB7CisgICAgICAgIEZYX0RXT1JEIGkgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9kd0xhc3RPYmpOdW07IGkrKykgeworICAgICAgICAgIGlmICghbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoaSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKGkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDEgIikpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXS9MZW5ndGggIikpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKG1fZHdMYXN0T2JqTnVtICogNSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCI+PnN0cmVhbVxyXG4iKSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2R3TGFzdE9iak51bTsgaSsrKSB7CisgICAgICAgICAgRlhfRklMRVNJWkUqIG9mZnNldCA9IG1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGkpOworICAgICAgICAgIGlmICghb2Zmc2V0KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgX091dFB1dEluZGV4KCZtX0ZpbGUsICpvZmZzZXQpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgY291bnQgPSBtX05ld09iak51bUFycmF5LkdldFNpemUoKTsKKyAgICAgICAgaW50MzJfdCBpID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICBGWF9EV09SRCBvYmpudW0gPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpKTsKKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKG9iam51bSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMSAiKSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJdL0xlbmd0aCAiKSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQoY291bnQgKiA1KSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIj4+c3RyZWFtXHJcbiIpKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICBGWF9EV09SRCBvYmpudW0gPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpKTsKKyAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSBtX09iamVjdE9mZnNldFtvYmpudW1dOworICAgICAgICAgIF9PdXRQdXRJbmRleCgmbV9GaWxlLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZHN0cmVhbSIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbnN0YXJ0eHJlZlxyXG4iKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIEZYX0NIQVIgb2Zmc2V0X2J1ZlsyMF07CisgIEZYU1lTX21lbXNldChvZmZzZXRfYnVmLCAwLCBzaXplb2Yob2Zmc2V0X2J1ZikpOworICBGWFNZU19pNjR0b2EobV9YcmVmU3RhcnQsIG9mZnNldF9idWYsIDEwKTsKKyAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhvZmZzZXRfYnVmLCBGWFNZU19zdHJsZW4ob2Zmc2V0X2J1ZikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbiUlRU9GXHJcbiIpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgbV9GaWxlLkZsdXNoKCk7CisgIHJldHVybiBtX2lTdGFnZSA9IDEwMDsKK30KK3ZvaWQgQ1BERl9DcmVhdG9yOjpDbGVhcigpIHsKKyAgZGVsZXRlIG1fcFhSZWZTdHJlYW07CisgIG1fcFhSZWZTdHJlYW0gPSBOVUxMOworICBtX0ZpbGUuQ2xlYXIoKTsKKyAgbV9OZXdPYmpOdW1BcnJheS5SZW1vdmVBbGwoKTsKKyAgaWYgKG1fcElEQXJyYXkpIHsKKyAgICBtX3BJREFycmF5LT5SZWxlYXNlKCk7CisgICAgbV9wSURBcnJheSA9IE5VTEw7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzKSB7CisgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUoZmlsZW5hbWUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0JPT0wgYlJldCA9IENyZWF0ZShmbGFncyk7CisgIGlmICghYlJldCB8fCAhKGZsYWdzICYgRlBERkNSRUFURV9QUk9HUkVTU0lWRSkpIHsKKyAgICBDbGVhcigpOworICB9CisgIHJldHVybiBiUmV0OworfQorRlhfQk9PTCBDUERGX0NyZWF0b3I6OkNyZWF0ZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzKSB7CisgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUoZmlsZW5hbWUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0JPT0wgYlJldCA9IENyZWF0ZShmbGFncyk7CisgIGlmICghYlJldCB8fCAhKGZsYWdzICYgRlBERkNSRUFURV9QUk9HUkVTU0lWRSkpIHsKKyAgICBDbGVhcigpOworICB9CisgIHJldHVybiBiUmV0OworfQorRlhfQk9PTCBDUERGX0NyZWF0b3I6OkNyZWF0ZShJRlhfU3RyZWFtV3JpdGUqIHBGaWxlLCBGWF9EV09SRCBmbGFncykgeworICBpZiAoIXBGaWxlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUocEZpbGUsIEZBTFNFKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gQ3JlYXRlKGZsYWdzKTsKK30KK0ZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoRlhfRFdPUkQgZmxhZ3MpIHsKKyAgbV9kd0ZsYWdzID0gZmxhZ3M7CisgIG1faVN0YWdlID0gMDsKKyAgbV9PZmZzZXQgPSAwOworICBtX2R3TGFzdE9iak51bSA9IG1fcERvY3VtZW50LT5HZXRMYXN0T2JqTnVtKCk7CisgIG1fT2JqZWN0T2Zmc2V0LkNsZWFyKCk7CisgIG1fT2JqZWN0U2l6ZS5DbGVhcigpOworICBtX05ld09iak51bUFycmF5LlJlbW92ZUFsbCgpOworICBJbml0SUQoKTsKKyAgaWYgKGZsYWdzICYgRlBERkNSRUFURV9QUk9HUkVTU0lWRSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBDb250aW51ZShOVUxMKSA+IC0xOworfQordm9pZCBDUERGX0NyZWF0b3I6OkluaXRJRChGWF9CT09MIGJEZWZhdWx0KSB7CisgIENQREZfQXJyYXkqIHBPbGRJREFycmF5ID0gbV9wUGFyc2VyID8gbV9wUGFyc2VyLT5HZXRJREFycmF5KCkgOiBOVUxMOworICBGWF9CT09MIGJOZXdJZCA9ICFtX3BJREFycmF5OworICBpZiAoIW1fcElEQXJyYXkpIHsKKyAgICBGWF9EV09SRCogcEJ1ZmZlciA9IE5VTEw7CisgICAgbV9wSURBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOworICAgIENQREZfT2JqZWN0KiBwSUQxID0gcE9sZElEQXJyYXkgPyBwT2xkSURBcnJheS0+R2V0RWxlbWVudCgwKSA6IE5VTEw7CisgICAgaWYgKHBJRDEpIHsKKyAgICAgIG1fcElEQXJyYXktPkFkZChwSUQxLT5DbG9uZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcEJ1ZmZlciA9IEZYX0FsbG9jKEZYX0RXT1JELCA0KTsKKyAgICAgIFBERl9HZW5lcmF0ZUZpbGVJRCgoRlhfRFdPUkQpKHVpbnRwdHJfdCkgdGhpcywgbV9kd0xhc3RPYmpOdW0sIHBCdWZmZXIpOworICAgICAgQ0ZYX0J5dGVTdHJpbmdDIGJzQnVmZmVyKChjb25zdCB1aW50OF90KilwQnVmZmVyLCA0ICogc2l6ZW9mKEZYX0RXT1JEKSk7CisgICAgICBtX3BJREFycmF5LT5BZGQoQ1BERl9TdHJpbmc6OkNyZWF0ZShic0J1ZmZlciwgVFJVRSksIG1fcERvY3VtZW50KTsKKyAgICB9CisgICAgaWYgKHBCdWZmZXIpIHsKKyAgICAgIEZYX0ZyZWUocEJ1ZmZlcik7CisgICAgfQorICB9CisgIGlmICghYkRlZmF1bHQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBPbGRJREFycmF5KSB7CisgICAgQ1BERl9PYmplY3QqIHBJRDIgPSBwT2xkSURBcnJheS0+R2V0RWxlbWVudCgxKTsKKyAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICYmIG1fcEVuY3J5cHREaWN0ICYmIHBJRDIpIHsKKyAgICAgIG1fcElEQXJyYXktPkFkZChwSUQyLT5DbG9uZSgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgRlhfRFdPUkQqIHBCdWZmZXIgPSBGWF9BbGxvYyhGWF9EV09SRCwgNCk7CisgICAgUERGX0dlbmVyYXRlRmlsZUlEKChGWF9EV09SRCkodWludHB0cl90KSB0aGlzLCBtX2R3TGFzdE9iak51bSwgcEJ1ZmZlcik7CisgICAgQ0ZYX0J5dGVTdHJpbmdDIGJzQnVmZmVyKChjb25zdCB1aW50OF90KilwQnVmZmVyLCA0ICogc2l6ZW9mKEZYX0RXT1JEKSk7CisgICAgbV9wSURBcnJheS0+QWRkKENQREZfU3RyaW5nOjpDcmVhdGUoYnNCdWZmZXIsIFRSVUUpLCBtX3BEb2N1bWVudCk7CisgICAgRlhfRnJlZShwQnVmZmVyKTsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wSURBcnJheS0+QWRkKG1fcElEQXJyYXktPkdldEVsZW1lbnQoMCktPkNsb25lKCkpOworICBpZiAobV9wRW5jcnlwdERpY3QgJiYgIXBPbGRJREFycmF5ICYmIG1fcFBhcnNlciAmJiBiTmV3SWQpIHsKKyAgICBpZiAobV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRmlsdGVyIikpID09IEZYX0JTVFJDKCJTdGFuZGFyZCIpKSB7CisgICAgICBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyIGhhbmRsZXI7CisgICAgICBDRlhfQnl0ZVN0cmluZyB1c2VyX3Bhc3MgPSBtX3BQYXJzZXItPkdldFBhc3N3b3JkKCk7CisgICAgICBGWF9EV09SRCBmbGFnID0gUERGX0VOQ1JZUFRfQ09OVEVOVDsKKyAgICAgIGhhbmRsZXIuT25DcmVhdGUobV9wRW5jcnlwdERpY3QsIG1fcElEQXJyYXksIChjb25zdCB1aW50OF90Kil1c2VyX3Bhc3MsCisgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfcGFzcy5HZXRMZW5ndGgoKSwgZmxhZyk7CisgICAgICBpZiAobV9iTmV3Q3J5cHRvKSB7CisgICAgICAgIGRlbGV0ZSBtX3BDcnlwdG9IYW5kbGVyOworICAgICAgfQorICAgICAgbV9wQ3J5cHRvSGFuZGxlciA9IG5ldyBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjsKKyAgICAgIG1fcENyeXB0b0hhbmRsZXItPkluaXQobV9wRW5jcnlwdERpY3QsICZoYW5kbGVyKTsKKyAgICAgIG1fYk5ld0NyeXB0byA9IFRSVUU7CisgICAgICBtX2JTZWN1cml0eUNoYW5nZWQgPSBUUlVFOworICAgIH0KKyAgfQorfQoraW50MzJfdCBDUERGX0NyZWF0b3I6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGlmIChtX2lTdGFnZSA8IDApIHsKKyAgICByZXR1cm4gbV9pU3RhZ2U7CisgIH0KKyAgaW50MzJfdCBpUmV0ID0gMDsKKyAgd2hpbGUgKG1faVN0YWdlIDwgMTAwKSB7CisgICAgaWYgKG1faVN0YWdlIDwgMjApIHsKKyAgICAgIGlSZXQgPSBXcml0ZURvY19TdGFnZTEocFBhdXNlKTsKKyAgICB9IGVsc2UgaWYgKG1faVN0YWdlIDwgMzApIHsKKyAgICAgIGlSZXQgPSBXcml0ZURvY19TdGFnZTIocFBhdXNlKTsKKyAgICB9IGVsc2UgaWYgKG1faVN0YWdlIDwgOTApIHsKKyAgICAgIGlSZXQgPSBXcml0ZURvY19TdGFnZTMocFBhdXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgaVJldCA9IFdyaXRlRG9jX1N0YWdlNChwUGF1c2UpOworICAgIH0KKyAgICBpZiAoaVJldCA8IG1faVN0YWdlKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGlSZXQgPCAxIHx8IG1faVN0YWdlID09IDEwMCkgeworICAgIG1faVN0YWdlID0gLTE7CisgICAgQ2xlYXIoKTsKKyAgICByZXR1cm4gaVJldCA+IDk5ID8gMCA6IChpUmV0IDwgMSA/IC0xIDogaVJldCk7CisgIH0KKyAgcmV0dXJuIG1faVN0YWdlOworfQorRlhfQk9PTCBDUERGX0NyZWF0b3I6OlNldEZpbGVWZXJzaW9uKGludDMyX3QgZmlsZVZlcnNpb24pIHsKKyAgaWYgKGZpbGVWZXJzaW9uIDwgMTAgfHwgZmlsZVZlcnNpb24gPiAxNykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX0ZpbGVWZXJzaW9uID0gZmlsZVZlcnNpb247CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX0NyZWF0b3I6OlJlbW92ZVNlY3VyaXR5KCkgeworICBSZXNldFN0YW5kYXJkU2VjdXJpdHkoKTsKKyAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gVFJVRTsKKyAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOworICBtX3BDcnlwdG9IYW5kbGVyID0gTlVMTDsKK30KK3ZvaWQgQ1BERl9DcmVhdG9yOjpSZXNldFN0YW5kYXJkU2VjdXJpdHkoKSB7CisgIGlmIChtX2JTdGFuZGFyZFNlY3VyaXR5IHx8IG1fYk5ld0NyeXB0bykgeworICAgIGRlbGV0ZSBtX3BDcnlwdG9IYW5kbGVyOworICAgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOworICB9CisgIG1fYk5ld0NyeXB0byA9IEZBTFNFOworICBpZiAoIW1fYlN0YW5kYXJkU2VjdXJpdHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcEVuY3J5cHREaWN0KSB7CisgICAgbV9wRW5jcnlwdERpY3QtPlJlbGVhc2UoKTsKKyAgICBtX3BFbmNyeXB0RGljdCA9IE5VTEw7CisgIH0KKyAgbV9iU3RhbmRhcmRTZWN1cml0eSA9IEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2RvYy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfZG9jLmNwcAppbmRleCBlMDkyOTdmLi45MjU2OTMwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfZG9jLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfZG9jLmNwcApAQCAtOCwxMTc1ICs4LDExNDEgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKICNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgPGxpbWl0cy5oPgotQ1BERl9Eb2N1bWVudDo6Q1BERl9Eb2N1bWVudCgpIDogQ1BERl9JbmRpcmVjdE9iamVjdHMoTlVMTCkKLXsKLSAgICBtX3BSb290RGljdCA9IE5VTEw7Ci0gICAgbV9wSW5mb0RpY3QgPSBOVUxMOwotICAgIG1fYkxpbmVhcml6ZWQgPSBGQUxTRTsKLSAgICBtX2R3Rmlyc3RQYWdlTm8gPSAwOwotICAgIG1fZHdGaXJzdFBhZ2VPYmpOdW0gPSAwOwotICAgIG1fcERvY1BhZ2UgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+Q3JlYXRlRG9jRGF0YSh0aGlzKTsKLSAgICBtX3BEb2NSZW5kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFJlbmRlck1vZHVsZSgpLT5DcmVhdGVEb2NEYXRhKHRoaXMpOworQ1BERl9Eb2N1bWVudDo6Q1BERl9Eb2N1bWVudCgpIDogQ1BERl9JbmRpcmVjdE9iamVjdHMoTlVMTCkgeworICBtX3BSb290RGljdCA9IE5VTEw7CisgIG1fcEluZm9EaWN0ID0gTlVMTDsKKyAgbV9iTGluZWFyaXplZCA9IEZBTFNFOworICBtX2R3Rmlyc3RQYWdlTm8gPSAwOworICBtX2R3Rmlyc3RQYWdlT2JqTnVtID0gMDsKKyAgbV9wRG9jUGFnZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5DcmVhdGVEb2NEYXRhKHRoaXMpOworICBtX3BEb2NSZW5kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFJlbmRlck1vZHVsZSgpLT5DcmVhdGVEb2NEYXRhKHRoaXMpOwogfQotdm9pZCBDUERGX0RvY3VtZW50OjpDcmVhdGVOZXdEb2MoKQotewotICAgIEFTU0VSVChtX3BSb290RGljdCA9PSBOVUxMICYmIG1fcEluZm9EaWN0ID09IE5VTEwpOwotICAgIG1fcFJvb3REaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICBtX3BSb290RGljdC0+U2V0QXROYW1lKCJUeXBlIiwgIkNhdGFsb2ciKTsKLSAgICBpbnQgb2JqbnVtID0gQWRkSW5kaXJlY3RPYmplY3QobV9wUm9vdERpY3QpOwotICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICBwUGFnZXMtPlNldEF0TmFtZSgiVHlwZSIsICJQYWdlcyIpOwotICAgIHBQYWdlcy0+U2V0QXROdW1iZXIoIkNvdW50IiwgMCk7Ci0gICAgcFBhZ2VzLT5TZXRBdCgiS2lkcyIsIG5ldyBDUERGX0FycmF5KTsKLSAgICBvYmpudW0gPSBBZGRJbmRpcmVjdE9iamVjdChwUGFnZXMpOwotICAgIG1fcFJvb3REaWN0LT5TZXRBdFJlZmVyZW5jZSgiUGFnZXMiLCB0aGlzLCBvYmpudW0pOwotICAgIG1fcEluZm9EaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICBBZGRJbmRpcmVjdE9iamVjdChtX3BJbmZvRGljdCk7Cit2b2lkIENQREZfRG9jdW1lbnQ6OkNyZWF0ZU5ld0RvYygpIHsKKyAgQVNTRVJUKG1fcFJvb3REaWN0ID09IE5VTEwgJiYgbV9wSW5mb0RpY3QgPT0gTlVMTCk7CisgIG1fcFJvb3REaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgbV9wUm9vdERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJDYXRhbG9nIik7CisgIGludCBvYmpudW0gPSBBZGRJbmRpcmVjdE9iamVjdChtX3BSb290RGljdCk7CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcFBhZ2VzLT5TZXRBdE5hbWUoIlR5cGUiLCAiUGFnZXMiKTsKKyAgcFBhZ2VzLT5TZXRBdE51bWJlcigiQ291bnQiLCAwKTsKKyAgcFBhZ2VzLT5TZXRBdCgiS2lkcyIsIG5ldyBDUERGX0FycmF5KTsKKyAgb2JqbnVtID0gQWRkSW5kaXJlY3RPYmplY3QocFBhZ2VzKTsKKyAgbV9wUm9vdERpY3QtPlNldEF0UmVmZXJlbmNlKCJQYWdlcyIsIHRoaXMsIG9iam51bSk7CisgIG1fcEluZm9EaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgQWRkSW5kaXJlY3RPYmplY3QobV9wSW5mb0RpY3QpOwogfQogc3RhdGljIGNvbnN0IEZYX1dDSEFSIGdfRlhfQ1A4NzRVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwMjYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDBBMCwgMHgwRTAxLCAweDBFMDIsIDB4MEUwMywgMHgwRTA0LCAweDBFMDUsIDB4MEUwNiwgMHgwRTA3LAotICAgIDB4MEUwOCwgMHgwRTA5LCAweDBFMEEsIDB4MEUwQiwgMHgwRTBDLCAweDBFMEQsIDB4MEUwRSwgMHgwRTBGLAotICAgIDB4MEUxMCwgMHgwRTExLCAweDBFMTIsIDB4MEUxMywgMHgwRTE0LCAweDBFMTUsIDB4MEUxNiwgMHgwRTE3LAotICAgIDB4MEUxOCwgMHgwRTE5LCAweDBFMUEsIDB4MEUxQiwgMHgwRTFDLCAweDBFMUQsIDB4MEUxRSwgMHgwRTFGLAotICAgIDB4MEUyMCwgMHgwRTIxLCAweDBFMjIsIDB4MEUyMywgMHgwRTI0LCAweDBFMjUsIDB4MEUyNiwgMHgwRTI3LAotICAgIDB4MEUyOCwgMHgwRTI5LCAweDBFMkEsIDB4MEUyQiwgMHgwRTJDLCAweDBFMkQsIDB4MEUyRSwgMHgwRTJGLAotICAgIDB4MEUzMCwgMHgwRTMxLCAweDBFMzIsIDB4MEUzMywgMHgwRTM0LCAweDBFMzUsIDB4MEUzNiwgMHgwRTM3LAotICAgIDB4MEUzOCwgMHgwRTM5LCAweDBFM0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwRTNGLAotICAgIDB4MEU0MCwgMHgwRTQxLCAweDBFNDIsIDB4MEU0MywgMHgwRTQ0LCAweDBFNDUsIDB4MEU0NiwgMHgwRTQ3LAotICAgIDB4MEU0OCwgMHgwRTQ5LCAweDBFNEEsIDB4MEU0QiwgMHgwRTRDLCAweDBFNEQsIDB4MEU0RSwgMHgwRTRGLAotICAgIDB4MEU1MCwgMHgwRTUxLCAweDBFNTIsIDB4MEU1MywgMHgwRTU0LCAweDBFNTUsIDB4MEU1NiwgMHgwRTU3LAotICAgIDB4MEU1OCwgMHgwRTU5LCAweDBFNUEsIDB4MEU1QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MjBBQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwMjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwQTAsIDB4MEUwMSwgMHgwRTAyLCAweDBFMDMsCisgICAgMHgwRTA0LCAweDBFMDUsIDB4MEUwNiwgMHgwRTA3LCAweDBFMDgsIDB4MEUwOSwgMHgwRTBBLCAweDBFMEIsIDB4MEUwQywKKyAgICAweDBFMEQsIDB4MEUwRSwgMHgwRTBGLCAweDBFMTAsIDB4MEUxMSwgMHgwRTEyLCAweDBFMTMsIDB4MEUxNCwgMHgwRTE1LAorICAgIDB4MEUxNiwgMHgwRTE3LCAweDBFMTgsIDB4MEUxOSwgMHgwRTFBLCAweDBFMUIsIDB4MEUxQywgMHgwRTFELCAweDBFMUUsCisgICAgMHgwRTFGLCAweDBFMjAsIDB4MEUyMSwgMHgwRTIyLCAweDBFMjMsIDB4MEUyNCwgMHgwRTI1LCAweDBFMjYsIDB4MEUyNywKKyAgICAweDBFMjgsIDB4MEUyOSwgMHgwRTJBLCAweDBFMkIsIDB4MEUyQywgMHgwRTJELCAweDBFMkUsIDB4MEUyRiwgMHgwRTMwLAorICAgIDB4MEUzMSwgMHgwRTMyLCAweDBFMzMsIDB4MEUzNCwgMHgwRTM1LCAweDBFMzYsIDB4MEUzNywgMHgwRTM4LCAweDBFMzksCisgICAgMHgwRTNBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MEUzRiwgMHgwRTQwLCAweDBFNDEsIDB4MEU0MiwKKyAgICAweDBFNDMsIDB4MEU0NCwgMHgwRTQ1LCAweDBFNDYsIDB4MEU0NywgMHgwRTQ4LCAweDBFNDksIDB4MEU0QSwgMHgwRTRCLAorICAgIDB4MEU0QywgMHgwRTRELCAweDBFNEUsIDB4MEU0RiwgMHgwRTUwLCAweDBFNTEsIDB4MEU1MiwgMHgwRTUzLCAweDBFNTQsCisgICAgMHgwRTU1LCAweDBFNTYsIDB4MEU1NywgMHgwRTU4LCAweDBFNTksIDB4MEU1QSwgMHgwRTVCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTBVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDAwMCwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDAwMCwgMHgyMDMwLCAweDAxNjAsIDB4MjAzOSwgMHgwMTVBLCAweDAxNjQsIDB4MDE3RCwgMHgwMTc5LAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDAwMCwgMHgyMTIyLCAweDAxNjEsIDB4MjAzQSwgMHgwMTVCLCAweDAxNjUsIDB4MDE3RSwgMHgwMTdBLAotICAgIDB4MDBBMCwgMHgwMkM3LCAweDAyRDgsIDB4MDE0MSwgMHgwMEE0LCAweDAxMDQsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBBOCwgMHgwMEE5LCAweDAxNUUsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMTdCLAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAyREIsIDB4MDE0MiwgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDBCOCwgMHgwMTA1LCAweDAxNUYsIDB4MDBCQiwgMHgwMTNELCAweDAyREQsIDB4MDEzRSwgMHgwMTdDLAotICAgIDB4MDE1NCwgMHgwMEMxLCAweDAwQzIsIDB4MDEwMiwgMHgwMEM0LCAweDAxMzksIDB4MDEwNiwgMHgwMEM3LAotICAgIDB4MDEwQywgMHgwMEM5LCAweDAxMTgsIDB4MDBDQiwgMHgwMTFBLCAweDAwQ0QsIDB4MDBDRSwgMHgwMTBFLAotICAgIDB4MDExMCwgMHgwMTQzLCAweDAxNDcsIDB4MDBEMywgMHgwMEQ0LCAweDAxNTAsIDB4MDBENiwgMHgwMEQ3LAotICAgIDB4MDE1OCwgMHgwMTZFLCAweDAwREEsIDB4MDE3MCwgMHgwMERDLCAweDAwREQsIDB4MDE2MiwgMHgwMERGLAotICAgIDB4MDE1NSwgMHgwMEUxLCAweDAwRTIsIDB4MDEwMywgMHgwMEU0LCAweDAxM0EsIDB4MDEwNywgMHgwMEU3LAotICAgIDB4MDEwRCwgMHgwMEU5LCAweDAxMTksIDB4MDBFQiwgMHgwMTFCLCAweDAwRUQsIDB4MDBFRSwgMHgwMTBGLAotICAgIDB4MDExMSwgMHgwMTQ0LCAweDAxNDgsIDB4MDBGMywgMHgwMEY0LCAweDAxNTEsIDB4MDBGNiwgMHgwMEY3LAotICAgIDB4MDE1OSwgMHgwMTZGLCAweDAwRkEsIDB4MDE3MSwgMHgwMEZDLCAweDAwRkQsIDB4MDE2MywgMHgwMkQ5LAorICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDAwMCwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAwMDAsCisgICAgMHgyMDMwLCAweDAxNjAsIDB4MjAzOSwgMHgwMTVBLCAweDAxNjQsIDB4MDE3RCwgMHgwMTc5LCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MjEyMiwgMHgwMTYxLAorICAgIDB4MjAzQSwgMHgwMTVCLCAweDAxNjUsIDB4MDE3RSwgMHgwMTdBLCAweDAwQTAsIDB4MDJDNywgMHgwMkQ4LCAweDAxNDEsCisgICAgMHgwMEE0LCAweDAxMDQsIDB4MDBBNiwgMHgwMEE3LCAweDAwQTgsIDB4MDBBOSwgMHgwMTVFLCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwMTdCLCAweDAwQjAsIDB4MDBCMSwgMHgwMkRCLCAweDAxNDIsIDB4MDBCNCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAwQjgsIDB4MDEwNSwgMHgwMTVGLCAweDAwQkIsIDB4MDEzRCwgMHgwMkRELCAweDAxM0UsCisgICAgMHgwMTdDLCAweDAxNTQsIDB4MDBDMSwgMHgwMEMyLCAweDAxMDIsIDB4MDBDNCwgMHgwMTM5LCAweDAxMDYsIDB4MDBDNywKKyAgICAweDAxMEMsIDB4MDBDOSwgMHgwMTE4LCAweDAwQ0IsIDB4MDExQSwgMHgwMENELCAweDAwQ0UsIDB4MDEwRSwgMHgwMTEwLAorICAgIDB4MDE0MywgMHgwMTQ3LCAweDAwRDMsIDB4MDBENCwgMHgwMTUwLCAweDAwRDYsIDB4MDBENywgMHgwMTU4LCAweDAxNkUsCisgICAgMHgwMERBLCAweDAxNzAsIDB4MDBEQywgMHgwMERELCAweDAxNjIsIDB4MDBERiwgMHgwMTU1LCAweDAwRTEsIDB4MDBFMiwKKyAgICAweDAxMDMsIDB4MDBFNCwgMHgwMTNBLCAweDAxMDcsIDB4MDBFNywgMHgwMTBELCAweDAwRTksIDB4MDExOSwgMHgwMEVCLAorICAgIDB4MDExQiwgMHgwMEVELCAweDAwRUUsIDB4MDEwRiwgMHgwMTExLCAweDAxNDQsIDB4MDE0OCwgMHgwMEYzLCAweDAwRjQsCisgICAgMHgwMTUxLCAweDAwRjYsIDB4MDBGNywgMHgwMTU5LCAweDAxNkYsIDB4MDBGQSwgMHgwMTcxLCAweDAwRkMsIDB4MDBGRCwKKyAgICAweDAxNjMsIDB4MDJEOSwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTFVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MDQwMiwgMHgwNDAzLCAweDIwMUEsIDB4MDQ1MywgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MjBBQywgMHgyMDMwLCAweDA0MDksIDB4MjAzOSwgMHgwNDBBLCAweDA0MEMsIDB4MDQwQiwgMHgwNDBGLAotICAgIDB4MDQ1MiwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDAwMCwgMHgyMTIyLCAweDA0NTksIDB4MjAzQSwgMHgwNDVBLCAweDA0NUMsIDB4MDQ1QiwgMHgwNDVGLAotICAgIDB4MDBBMCwgMHgwNDBFLCAweDA0NUUsIDB4MDQwOCwgMHgwMEE0LCAweDA0OTAsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDQwMSwgMHgwMEE5LCAweDA0MDQsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwNDA3LAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDA0MDYsIDB4MDQ1NiwgMHgwNDkxLCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDQ1MSwgMHgyMTE2LCAweDA0NTQsIDB4MDBCQiwgMHgwNDU4LCAweDA0MDUsIDB4MDQ1NSwgMHgwNDU3LAotICAgIDB4MDQxMCwgMHgwNDExLCAweDA0MTIsIDB4MDQxMywgMHgwNDE0LCAweDA0MTUsIDB4MDQxNiwgMHgwNDE3LAotICAgIDB4MDQxOCwgMHgwNDE5LCAweDA0MUEsIDB4MDQxQiwgMHgwNDFDLCAweDA0MUQsIDB4MDQxRSwgMHgwNDFGLAotICAgIDB4MDQyMCwgMHgwNDIxLCAweDA0MjIsIDB4MDQyMywgMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LAotICAgIDB4MDQyOCwgMHgwNDI5LCAweDA0MkEsIDB4MDQyQiwgMHgwNDJDLCAweDA0MkQsIDB4MDQyRSwgMHgwNDJGLAotICAgIDB4MDQzMCwgMHgwNDMxLCAweDA0MzIsIDB4MDQzMywgMHgwNDM0LCAweDA0MzUsIDB4MDQzNiwgMHgwNDM3LAotICAgIDB4MDQzOCwgMHgwNDM5LCAweDA0M0EsIDB4MDQzQiwgMHgwNDNDLCAweDA0M0QsIDB4MDQzRSwgMHgwNDNGLAotICAgIDB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywgMHgwNDQ0LCAweDA0NDUsIDB4MDQ0NiwgMHgwNDQ3LAotICAgIDB4MDQ0OCwgMHgwNDQ5LCAweDA0NEEsIDB4MDQ0QiwgMHgwNDRDLCAweDA0NEQsIDB4MDQ0RSwgMHgwNDRGLAorICAgIDB4MDQwMiwgMHgwNDAzLCAweDIwMUEsIDB4MDQ1MywgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDIwQUMsCisgICAgMHgyMDMwLCAweDA0MDksIDB4MjAzOSwgMHgwNDBBLCAweDA0MEMsIDB4MDQwQiwgMHgwNDBGLCAweDA0NTIsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MjEyMiwgMHgwNDU5LAorICAgIDB4MjAzQSwgMHgwNDVBLCAweDA0NUMsIDB4MDQ1QiwgMHgwNDVGLCAweDAwQTAsIDB4MDQwRSwgMHgwNDVFLCAweDA0MDgsCisgICAgMHgwMEE0LCAweDA0OTAsIDB4MDBBNiwgMHgwMEE3LCAweDA0MDEsIDB4MDBBOSwgMHgwNDA0LCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwNDA3LCAweDAwQjAsIDB4MDBCMSwgMHgwNDA2LCAweDA0NTYsIDB4MDQ5MSwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDA0NTEsIDB4MjExNiwgMHgwNDU0LCAweDAwQkIsIDB4MDQ1OCwgMHgwNDA1LCAweDA0NTUsCisgICAgMHgwNDU3LCAweDA0MTAsIDB4MDQxMSwgMHgwNDEyLCAweDA0MTMsIDB4MDQxNCwgMHgwNDE1LCAweDA0MTYsIDB4MDQxNywKKyAgICAweDA0MTgsIDB4MDQxOSwgMHgwNDFBLCAweDA0MUIsIDB4MDQxQywgMHgwNDFELCAweDA0MUUsIDB4MDQxRiwgMHgwNDIwLAorICAgIDB4MDQyMSwgMHgwNDIyLCAweDA0MjMsIDB4MDQyNCwgMHgwNDI1LCAweDA0MjYsIDB4MDQyNywgMHgwNDI4LCAweDA0MjksCisgICAgMHgwNDJBLCAweDA0MkIsIDB4MDQyQywgMHgwNDJELCAweDA0MkUsIDB4MDQyRiwgMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwKKyAgICAweDA0MzMsIDB4MDQzNCwgMHgwNDM1LCAweDA0MzYsIDB4MDQzNywgMHgwNDM4LCAweDA0MzksIDB4MDQzQSwgMHgwNDNCLAorICAgIDB4MDQzQywgMHgwNDNELCAweDA0M0UsIDB4MDQzRiwgMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAweDA0NDQsCisgICAgMHgwNDQ1LCAweDA0NDYsIDB4MDQ0NywgMHgwNDQ4LCAweDA0NDksIDB4MDQ0QSwgMHgwNDRCLCAweDA0NEMsIDB4MDQ0RCwKKyAgICAweDA0NEUsIDB4MDQ0RiwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTNVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDAwMCwgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDAwMCwgMHgyMTIyLCAweDAwMDAsIDB4MjAzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDBBMCwgMHgwMzg1LCAweDAzODYsIDB4MDBBMywgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBBOCwgMHgwMEE5LCAweDAwMDAsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgyMDE1LAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMzg0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDM4OCwgMHgwMzg5LCAweDAzOEEsIDB4MDBCQiwgMHgwMzhDLCAweDAwQkQsIDB4MDM4RSwgMHgwMzhGLAotICAgIDB4MDM5MCwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywgMHgwMzk0LCAweDAzOTUsIDB4MDM5NiwgMHgwMzk3LAotICAgIDB4MDM5OCwgMHgwMzk5LCAweDAzOUEsIDB4MDM5QiwgMHgwMzlDLCAweDAzOUQsIDB4MDM5RSwgMHgwMzlGLAotICAgIDB4MDNBMCwgMHgwM0ExLCAweDAwMDAsIDB4MDNBMywgMHgwM0E0LCAweDAzQTUsIDB4MDNBNiwgMHgwM0E3LAotICAgIDB4MDNBOCwgMHgwM0E5LCAweDAzQUEsIDB4MDNBQiwgMHgwM0FDLCAweDAzQUQsIDB4MDNBRSwgMHgwM0FGLAotICAgIDB4MDNCMCwgMHgwM0IxLCAweDAzQjIsIDB4MDNCMywgMHgwM0I0LCAweDAzQjUsIDB4MDNCNiwgMHgwM0I3LAotICAgIDB4MDNCOCwgMHgwM0I5LCAweDAzQkEsIDB4MDNCQiwgMHgwM0JDLCAweDAzQkQsIDB4MDNCRSwgMHgwM0JGLAotICAgIDB4MDNDMCwgMHgwM0MxLCAweDAzQzIsIDB4MDNDMywgMHgwM0M0LCAweDAzQzUsIDB4MDNDNiwgMHgwM0M3LAotICAgIDB4MDNDOCwgMHgwM0M5LCAweDAzQ0EsIDB4MDNDQiwgMHgwM0NDLCAweDAzQ0QsIDB4MDNDRSwgMHgwMDAwLAorICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAwMDAsCisgICAgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MjEyMiwgMHgwMDAwLAorICAgIDB4MjAzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwQTAsIDB4MDM4NSwgMHgwMzg2LCAweDAwQTMsCisgICAgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LCAweDAwQTgsIDB4MDBBOSwgMHgwMDAwLCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgyMDE1LCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDM4NCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAzODgsIDB4MDM4OSwgMHgwMzhBLCAweDAwQkIsIDB4MDM4QywgMHgwMEJELCAweDAzOEUsCisgICAgMHgwMzhGLCAweDAzOTAsIDB4MDM5MSwgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwgMHgwMzk1LCAweDAzOTYsIDB4MDM5NywKKyAgICAweDAzOTgsIDB4MDM5OSwgMHgwMzlBLCAweDAzOUIsIDB4MDM5QywgMHgwMzlELCAweDAzOUUsIDB4MDM5RiwgMHgwM0EwLAorICAgIDB4MDNBMSwgMHgwMDAwLCAweDAzQTMsIDB4MDNBNCwgMHgwM0E1LCAweDAzQTYsIDB4MDNBNywgMHgwM0E4LCAweDAzQTksCisgICAgMHgwM0FBLCAweDAzQUIsIDB4MDNBQywgMHgwM0FELCAweDAzQUUsIDB4MDNBRiwgMHgwM0IwLCAweDAzQjEsIDB4MDNCMiwKKyAgICAweDAzQjMsIDB4MDNCNCwgMHgwM0I1LCAweDAzQjYsIDB4MDNCNywgMHgwM0I4LCAweDAzQjksIDB4MDNCQSwgMHgwM0JCLAorICAgIDB4MDNCQywgMHgwM0JELCAweDAzQkUsIDB4MDNCRiwgMHgwM0MwLCAweDAzQzEsIDB4MDNDMiwgMHgwM0MzLCAweDAzQzQsCisgICAgMHgwM0M1LCAweDAzQzYsIDB4MDNDNywgMHgwM0M4LCAweDAzQzksIDB4MDNDQSwgMHgwM0NCLCAweDAzQ0MsIDB4MDNDRCwKKyAgICAweDAzQ0UsIDB4MDAwMCwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTRVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDJDNiwgMHgyMDMwLCAweDAxNjAsIDB4MjAzOSwgMHgwMTUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDJEQywgMHgyMTIyLCAweDAxNjEsIDB4MjAzQSwgMHgwMTUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMTc4LAotICAgIDB4MDBBMCwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBBOCwgMHgwMEE5LCAweDAwQUEsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDBCOCwgMHgwMEI5LCAweDAwQkEsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEJGLAotICAgIDB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LCAweDAwQzUsIDB4MDBDNiwgMHgwMEM3LAotICAgIDB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLCAweDAwQ0QsIDB4MDBDRSwgMHgwMENGLAotICAgIDB4MDExRSwgMHgwMEQxLCAweDAwRDIsIDB4MDBEMywgMHgwMEQ0LCAweDAwRDUsIDB4MDBENiwgMHgwMEQ3LAotICAgIDB4MDBEOCwgMHgwMEQ5LCAweDAwREEsIDB4MDBEQiwgMHgwMERDLCAweDAxMzAsIDB4MDE1RSwgMHgwMERGLAotICAgIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LCAweDAwRTUsIDB4MDBFNiwgMHgwMEU3LAotICAgIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLCAweDAwRUQsIDB4MDBFRSwgMHgwMEVGLAotICAgIDB4MDExRiwgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LAotICAgIDB4MDBGOCwgMHgwMEY5LCAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLCAweDAxMzEsIDB4MDE1RiwgMHgwMEZGLAorICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAyQzYsCisgICAgMHgyMDMwLCAweDAxNjAsIDB4MjAzOSwgMHgwMTUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAyREMsIDB4MjEyMiwgMHgwMTYxLAorICAgIDB4MjAzQSwgMHgwMTUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMTc4LCAweDAwQTAsIDB4MDBBMSwgMHgwMEEyLCAweDAwQTMsCisgICAgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LCAweDAwQTgsIDB4MDBBOSwgMHgwMEFBLCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAwQjgsIDB4MDBCOSwgMHgwMEJBLCAweDAwQkIsIDB4MDBCQywgMHgwMEJELCAweDAwQkUsCisgICAgMHgwMEJGLCAweDAwQzAsIDB4MDBDMSwgMHgwMEMyLCAweDAwQzMsIDB4MDBDNCwgMHgwMEM1LCAweDAwQzYsIDB4MDBDNywKKyAgICAweDAwQzgsIDB4MDBDOSwgMHgwMENBLCAweDAwQ0IsIDB4MDBDQywgMHgwMENELCAweDAwQ0UsIDB4MDBDRiwgMHgwMTFFLAorICAgIDB4MDBEMSwgMHgwMEQyLCAweDAwRDMsIDB4MDBENCwgMHgwMEQ1LCAweDAwRDYsIDB4MDBENywgMHgwMEQ4LCAweDAwRDksCisgICAgMHgwMERBLCAweDAwREIsIDB4MDBEQywgMHgwMTMwLCAweDAxNUUsIDB4MDBERiwgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwKKyAgICAweDAwRTMsIDB4MDBFNCwgMHgwMEU1LCAweDAwRTYsIDB4MDBFNywgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLAorICAgIDB4MDBFQywgMHgwMEVELCAweDAwRUUsIDB4MDBFRiwgMHgwMTFGLCAweDAwRjEsIDB4MDBGMiwgMHgwMEYzLCAweDAwRjQsCisgICAgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywgMHgwMEY4LCAweDAwRjksIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDEzMSwKKyAgICAweDAxNUYsIDB4MDBGRiwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTVVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDJDNiwgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDJEQywgMHgyMTIyLCAweDAwMDAsIDB4MjAzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDBBMCwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgyMEFBLCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBBOCwgMHgwMEE5LCAweDAwRDcsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDBCOCwgMHgwMEI5LCAweDAwRjcsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEJGLAotICAgIDB4MDVCMCwgMHgwNUIxLCAweDA1QjIsIDB4MDVCMywgMHgwNUI0LCAweDA1QjUsIDB4MDVCNiwgMHgwNUI3LAotICAgIDB4MDVCOCwgMHgwNUI5LCAweDAwMDAsIDB4MDVCQiwgMHgwNUJDLCAweDA1QkQsIDB4MDVCRSwgMHgwNUJGLAotICAgIDB4MDVDMCwgMHgwNUMxLCAweDA1QzIsIDB4MDVDMywgMHgwNUYwLCAweDA1RjEsIDB4MDVGMiwgMHgwNUYzLAotICAgIDB4MDVGNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDVEMCwgMHgwNUQxLCAweDA1RDIsIDB4MDVEMywgMHgwNUQ0LCAweDA1RDUsIDB4MDVENiwgMHgwNUQ3LAotICAgIDB4MDVEOCwgMHgwNUQ5LCAweDA1REEsIDB4MDVEQiwgMHgwNURDLCAweDA1REQsIDB4MDVERSwgMHgwNURGLAotICAgIDB4MDVFMCwgMHgwNUUxLCAweDA1RTIsIDB4MDVFMywgMHgwNUU0LCAweDA1RTUsIDB4MDVFNiwgMHgwNUU3LAotICAgIDB4MDVFOCwgMHgwNUU5LCAweDA1RUEsIDB4MDAwMCwgMHgwMDAwLCAweDIwMEUsIDB4MjAwRiwgMHgwMDAwLAorICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAyQzYsCisgICAgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAyREMsIDB4MjEyMiwgMHgwMDAwLAorICAgIDB4MjAzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwQTAsIDB4MDBBMSwgMHgwMEEyLCAweDAwQTMsCisgICAgMHgyMEFBLCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LCAweDAwQTgsIDB4MDBBOSwgMHgwMEQ3LCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAwQjgsIDB4MDBCOSwgMHgwMEY3LCAweDAwQkIsIDB4MDBCQywgMHgwMEJELCAweDAwQkUsCisgICAgMHgwMEJGLCAweDA1QjAsIDB4MDVCMSwgMHgwNUIyLCAweDA1QjMsIDB4MDVCNCwgMHgwNUI1LCAweDA1QjYsIDB4MDVCNywKKyAgICAweDA1QjgsIDB4MDVCOSwgMHgwMDAwLCAweDA1QkIsIDB4MDVCQywgMHgwNUJELCAweDA1QkUsIDB4MDVCRiwgMHgwNUMwLAorICAgIDB4MDVDMSwgMHgwNUMyLCAweDA1QzMsIDB4MDVGMCwgMHgwNUYxLCAweDA1RjIsIDB4MDVGMywgMHgwNUY0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwNUQwLCAweDA1RDEsIDB4MDVEMiwKKyAgICAweDA1RDMsIDB4MDVENCwgMHgwNUQ1LCAweDA1RDYsIDB4MDVENywgMHgwNUQ4LCAweDA1RDksIDB4MDVEQSwgMHgwNURCLAorICAgIDB4MDVEQywgMHgwNURELCAweDA1REUsIDB4MDVERiwgMHgwNUUwLCAweDA1RTEsIDB4MDVFMiwgMHgwNUUzLCAweDA1RTQsCisgICAgMHgwNUU1LCAweDA1RTYsIDB4MDVFNywgMHgwNUU4LCAweDA1RTksIDB4MDVFQSwgMHgwMDAwLCAweDAwMDAsIDB4MjAwRSwKKyAgICAweDIwMEYsIDB4MDAwMCwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTZVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwNjdFLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDJDNiwgMHgyMDMwLCAweDA2NzksIDB4MjAzOSwgMHgwMTUyLCAweDA2ODYsIDB4MDY5OCwgMHgwNjg4LAotICAgIDB4MDZBRiwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDZBOSwgMHgyMTIyLCAweDA2OTEsIDB4MjAzQSwgMHgwMTUzLCAweDIwMEMsIDB4MjAwRCwgMHgwNkJBLAotICAgIDB4MDBBMCwgMHgwNjBDLCAweDAwQTIsIDB4MDBBMywgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBBOCwgMHgwMEE5LCAweDA2QkUsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDBCOCwgMHgwMEI5LCAweDA2MUIsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwNjFGLAotICAgIDB4MDZDMSwgMHgwNjIxLCAweDA2MjIsIDB4MDYyMywgMHgwNjI0LCAweDA2MjUsIDB4MDYyNiwgMHgwNjI3LAotICAgIDB4MDYyOCwgMHgwNjI5LCAweDA2MkEsIDB4MDYyQiwgMHgwNjJDLCAweDA2MkQsIDB4MDYyRSwgMHgwNjJGLAotICAgIDB4MDYzMCwgMHgwNjMxLCAweDA2MzIsIDB4MDYzMywgMHgwNjM0LCAweDA2MzUsIDB4MDYzNiwgMHgwMEQ3LAotICAgIDB4MDYzNywgMHgwNjM4LCAweDA2MzksIDB4MDYzQSwgMHgwNjQwLCAweDA2NDEsIDB4MDY0MiwgMHgwNjQzLAotICAgIDB4MDBFMCwgMHgwNjQ0LCAweDAwRTIsIDB4MDY0NSwgMHgwNjQ2LCAweDA2NDcsIDB4MDY0OCwgMHgwMEU3LAotICAgIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwNjQ5LCAweDA2NEEsIDB4MDBFRSwgMHgwMEVGLAotICAgIDB4MDY0QiwgMHgwNjRDLCAweDA2NEQsIDB4MDY0RSwgMHgwMEY0LCAweDA2NEYsIDB4MDY1MCwgMHgwMEY3LAotICAgIDB4MDY1MSwgMHgwMEY5LCAweDA2NTIsIDB4MDBGQiwgMHgwMEZDLCAweDIwMEUsIDB4MjAwRiwgMHgwNkQyLAorICAgIDB4MjBBQywgMHgwNjdFLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAyQzYsCisgICAgMHgyMDMwLCAweDA2NzksIDB4MjAzOSwgMHgwMTUyLCAweDA2ODYsIDB4MDY5OCwgMHgwNjg4LCAweDA2QUYsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDA2QTksIDB4MjEyMiwgMHgwNjkxLAorICAgIDB4MjAzQSwgMHgwMTUzLCAweDIwMEMsIDB4MjAwRCwgMHgwNkJBLCAweDAwQTAsIDB4MDYwQywgMHgwMEEyLCAweDAwQTMsCisgICAgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LCAweDAwQTgsIDB4MDBBOSwgMHgwNkJFLCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAwQjgsIDB4MDBCOSwgMHgwNjFCLCAweDAwQkIsIDB4MDBCQywgMHgwMEJELCAweDAwQkUsCisgICAgMHgwNjFGLCAweDA2QzEsIDB4MDYyMSwgMHgwNjIyLCAweDA2MjMsIDB4MDYyNCwgMHgwNjI1LCAweDA2MjYsIDB4MDYyNywKKyAgICAweDA2MjgsIDB4MDYyOSwgMHgwNjJBLCAweDA2MkIsIDB4MDYyQywgMHgwNjJELCAweDA2MkUsIDB4MDYyRiwgMHgwNjMwLAorICAgIDB4MDYzMSwgMHgwNjMyLCAweDA2MzMsIDB4MDYzNCwgMHgwNjM1LCAweDA2MzYsIDB4MDBENywgMHgwNjM3LCAweDA2MzgsCisgICAgMHgwNjM5LCAweDA2M0EsIDB4MDY0MCwgMHgwNjQxLCAweDA2NDIsIDB4MDY0MywgMHgwMEUwLCAweDA2NDQsIDB4MDBFMiwKKyAgICAweDA2NDUsIDB4MDY0NiwgMHgwNjQ3LCAweDA2NDgsIDB4MDBFNywgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLAorICAgIDB4MDY0OSwgMHgwNjRBLCAweDAwRUUsIDB4MDBFRiwgMHgwNjRCLCAweDA2NEMsIDB4MDY0RCwgMHgwNjRFLCAweDAwRjQsCisgICAgMHgwNjRGLCAweDA2NTAsIDB4MDBGNywgMHgwNjUxLCAweDAwRjksIDB4MDY1MiwgMHgwMEZCLCAweDAwRkMsIDB4MjAwRSwKKyAgICAweDIwMEYsIDB4MDZEMiwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTdVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDAwMCwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDAwMCwgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwQTgsIDB4MDJDNywgMHgwMEI4LAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDAwMCwgMHgyMTIyLCAweDAwMDAsIDB4MjAzQSwgMHgwMDAwLCAweDAwQUYsIDB4MDJEQiwgMHgwMDAwLAotICAgIDB4MDBBMCwgMHgwMDAwLCAweDAwQTIsIDB4MDBBMywgMHgwMEE0LCAweDAwMDAsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBEOCwgMHgwMEE5LCAweDAxNTYsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMEM2LAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDBGOCwgMHgwMEI5LCAweDAxNTcsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEU2LAotICAgIDB4MDEwNCwgMHgwMTJFLCAweDAxMDAsIDB4MDEwNiwgMHgwMEM0LCAweDAwQzUsIDB4MDExOCwgMHgwMTEyLAotICAgIDB4MDEwQywgMHgwMEM5LCAweDAxNzksIDB4MDExNiwgMHgwMTIyLCAweDAxMzYsIDB4MDEyQSwgMHgwMTNCLAotICAgIDB4MDE2MCwgMHgwMTQzLCAweDAxNDUsIDB4MDBEMywgMHgwMTRDLCAweDAwRDUsIDB4MDBENiwgMHgwMEQ3LAotICAgIDB4MDE3MiwgMHgwMTQxLCAweDAxNUEsIDB4MDE2QSwgMHgwMERDLCAweDAxN0IsIDB4MDE3RCwgMHgwMERGLAotICAgIDB4MDEwNSwgMHgwMTJGLCAweDAxMDEsIDB4MDEwNywgMHgwMEU0LCAweDAwRTUsIDB4MDExOSwgMHgwMTEzLAotICAgIDB4MDEwRCwgMHgwMEU5LCAweDAxN0EsIDB4MDExNywgMHgwMTIzLCAweDAxMzcsIDB4MDEyQiwgMHgwMTNDLAotICAgIDB4MDE2MSwgMHgwMTQ0LCAweDAxNDYsIDB4MDBGMywgMHgwMTRELCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LAotICAgIDB4MDE3MywgMHgwMTQyLCAweDAxNUIsIDB4MDE2QiwgMHgwMEZDLCAweDAxN0MsIDB4MDE3RSwgMHgwMkQ5LAorICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDAwMCwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAwMDAsCisgICAgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwQTgsIDB4MDJDNywgMHgwMEI4LCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MjEyMiwgMHgwMDAwLAorICAgIDB4MjAzQSwgMHgwMDAwLCAweDAwQUYsIDB4MDJEQiwgMHgwMDAwLCAweDAwQTAsIDB4MDAwMCwgMHgwMEEyLCAweDAwQTMsCisgICAgMHgwMEE0LCAweDAwMDAsIDB4MDBBNiwgMHgwMEE3LCAweDAwRDgsIDB4MDBBOSwgMHgwMTU2LCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwMEM2LCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAwRjgsIDB4MDBCOSwgMHgwMTU3LCAweDAwQkIsIDB4MDBCQywgMHgwMEJELCAweDAwQkUsCisgICAgMHgwMEU2LCAweDAxMDQsIDB4MDEyRSwgMHgwMTAwLCAweDAxMDYsIDB4MDBDNCwgMHgwMEM1LCAweDAxMTgsIDB4MDExMiwKKyAgICAweDAxMEMsIDB4MDBDOSwgMHgwMTc5LCAweDAxMTYsIDB4MDEyMiwgMHgwMTM2LCAweDAxMkEsIDB4MDEzQiwgMHgwMTYwLAorICAgIDB4MDE0MywgMHgwMTQ1LCAweDAwRDMsIDB4MDE0QywgMHgwMEQ1LCAweDAwRDYsIDB4MDBENywgMHgwMTcyLCAweDAxNDEsCisgICAgMHgwMTVBLCAweDAxNkEsIDB4MDBEQywgMHgwMTdCLCAweDAxN0QsIDB4MDBERiwgMHgwMTA1LCAweDAxMkYsIDB4MDEwMSwKKyAgICAweDAxMDcsIDB4MDBFNCwgMHgwMEU1LCAweDAxMTksIDB4MDExMywgMHgwMTBELCAweDAwRTksIDB4MDE3QSwgMHgwMTE3LAorICAgIDB4MDEyMywgMHgwMTM3LCAweDAxMkIsIDB4MDEzQywgMHgwMTYxLCAweDAxNDQsIDB4MDE0NiwgMHgwMEYzLCAweDAxNEQsCisgICAgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywgMHgwMTczLCAweDAxNDIsIDB4MDE1QiwgMHgwMTZCLCAweDAwRkMsIDB4MDE3QywKKyAgICAweDAxN0UsIDB4MDJEOSwKIH07CiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludDhfdAkJbV9DaGFyc2V0OwotICAgIGNvbnN0IEZYX1dDSEFSKgltX3BVbmljb2RlczsKKyAgdWludDhfdCBtX0NoYXJzZXQ7CisgIGNvbnN0IEZYX1dDSEFSKiBtX3BVbmljb2RlczsKIH0gRlhfQ2hhcnNldFVuaWNvZGVzOwogY29uc3QgRlhfQ2hhcnNldFVuaWNvZGVzIGdfRlhfQ2hhcnNldFVuaWNvZGVzW10gPSB7Ci0gICAgeyBGWEZPTlRfVEhBSV9DSEFSU0VULCBnX0ZYX0NQODc0VW5pY29kZXMgfSwKLSAgICB7IEZYRk9OVF9FQVNURVVST1BFX0NIQVJTRVQsIGdfRlhfQ1AxMjUwVW5pY29kZXMgfSwKLSAgICB7IEZYRk9OVF9SVVNTSUFOX0NIQVJTRVQsIGdfRlhfQ1AxMjUxVW5pY29kZXMgfSwKLSAgICB7IEZYRk9OVF9HUkVFS19DSEFSU0VULCBnX0ZYX0NQMTI1M1VuaWNvZGVzIH0sCi0gICAgeyBGWEZPTlRfVFVSS0lTSF9DSEFSU0VULCBnX0ZYX0NQMTI1NFVuaWNvZGVzIH0sCi0gICAgeyBGWEZPTlRfSEVCUkVXX0NIQVJTRVQsIGdfRlhfQ1AxMjU1VW5pY29kZXMgfSwKLSAgICB7IEZYRk9OVF9BUkFCSUNfQ0hBUlNFVCwgZ19GWF9DUDEyNTZVbmljb2RlcyB9LAotICAgIHsgRlhGT05UX0JBTFRJQ19DSEFSU0VULCBnX0ZYX0NQMTI1N1VuaWNvZGVzIH0sCisgICAge0ZYRk9OVF9USEFJX0NIQVJTRVQsIGdfRlhfQ1A4NzRVbmljb2Rlc30sCisgICAge0ZYRk9OVF9FQVNURVVST1BFX0NIQVJTRVQsIGdfRlhfQ1AxMjUwVW5pY29kZXN9LAorICAgIHtGWEZPTlRfUlVTU0lBTl9DSEFSU0VULCBnX0ZYX0NQMTI1MVVuaWNvZGVzfSwKKyAgICB7RlhGT05UX0dSRUVLX0NIQVJTRVQsIGdfRlhfQ1AxMjUzVW5pY29kZXN9LAorICAgIHtGWEZPTlRfVFVSS0lTSF9DSEFSU0VULCBnX0ZYX0NQMTI1NFVuaWNvZGVzfSwKKyAgICB7RlhGT05UX0hFQlJFV19DSEFSU0VULCBnX0ZYX0NQMTI1NVVuaWNvZGVzfSwKKyAgICB7RlhGT05UX0FSQUJJQ19DSEFSU0VULCBnX0ZYX0NQMTI1NlVuaWNvZGVzfSwKKyAgICB7RlhGT05UX0JBTFRJQ19DSEFSU0VULCBnX0ZYX0NQMTI1N1VuaWNvZGVzfSwKIH07CiAjaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0X0RFU0tUT1BfKQotc3RhdGljIHZvaWQgX0luc2VydFdpZHRoQXJyYXkoSERDIGhEQywgaW50IHN0YXJ0LCBpbnQgZW5kLCBDUERGX0FycmF5KiBwV2lkdGhBcnJheSkKLXsKLSAgICBpbnQgc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKLSAgICBpbnQqIHdpZHRocyA9IEZYX0FsbG9jKGludCwgc2l6ZSk7Ci0gICAgR2V0Q2hhcldpZHRoKGhEQywgc3RhcnQsIGVuZCwgd2lkdGhzKTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSArKykKLSAgICAgICAgaWYgKHdpZHRoc1tpXSAhPSAqd2lkdGhzKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGlmIChpID09IHNpemUpIHsKLSAgICAgICAgaW50IGZpcnN0ID0gcFdpZHRoQXJyYXktPkdldEludGVnZXIocFdpZHRoQXJyYXktPkdldENvdW50KCkgLSAxKTsKLSAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoZmlyc3QgKyBzaXplIC0gMSk7Ci0gICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKCp3aWR0aHMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5MSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICBwV2lkdGhBcnJheS0+QWRkKHBXaWR0aEFycmF5MSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgICAgICBwV2lkdGhBcnJheTEtPkFkZEludGVnZXIod2lkdGhzW2ldKTsKLSAgICAgICAgfQorc3RhdGljIHZvaWQgX0luc2VydFdpZHRoQXJyYXkoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSkgeworICBpbnQgc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKKyAgaW50KiB3aWR0aHMgPSBGWF9BbGxvYyhpbnQsIHNpemUpOworICBHZXRDaGFyV2lkdGgoaERDLCBzdGFydCwgZW5kLCB3aWR0aHMpOworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8IHNpemU7IGkrKykKKyAgICBpZiAod2lkdGhzW2ldICE9ICp3aWR0aHMpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBGWF9GcmVlKHdpZHRocyk7CisgIGlmIChpID09IHNpemUpIHsKKyAgICBpbnQgZmlyc3QgPSBwV2lkdGhBcnJheS0+R2V0SW50ZWdlcihwV2lkdGhBcnJheS0+R2V0Q291bnQoKSAtIDEpOworICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKGZpcnN0ICsgc2l6ZSAtIDEpOworICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKCp3aWR0aHMpOworICB9IGVsc2UgeworICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5MSA9IG5ldyBDUERGX0FycmF5OworICAgIHBXaWR0aEFycmF5LT5BZGQocFdpZHRoQXJyYXkxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICBwV2lkdGhBcnJheTEtPkFkZEludGVnZXIod2lkdGhzW2ldKTsKKyAgICB9CisgIH0KKyAgRlhfRnJlZSh3aWR0aHMpOwogfQotQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUpCi17Ci0gICAgTE9HRk9OVEEgbGZhOwotICAgIEZYU1lTX21lbWNweSgmbGZhLCBwTG9nRm9udCwgKGNoYXIqKWxmYS5sZkZhY2VOYW1lIC0gKGNoYXIqKSZsZmEpOwotICAgIENGWF9CeXRlU3RyaW5nIGZhY2UgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocExvZ0ZvbnQtPmxmRmFjZU5hbWUpOwotICAgIGlmIChmYWNlLkdldExlbmd0aCgpID49IExGX0ZBQ0VTSVpFKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWFNZU19zdHJjcHkobGZhLmxmRmFjZU5hbWUsIGZhY2UuY19zdHIoKSk7Ci0gICAgcmV0dXJuIEFkZFdpbmRvd3NGb250KCZsZmEsIGJWZXJ0LCBiVHJhbnNsYXRlTmFtZSk7CitDUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZFdpbmRvd3NGb250KExPR0ZPTlRXKiBwTG9nRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSkgeworICBMT0dGT05UQSBsZmE7CisgIEZYU1lTX21lbWNweSgmbGZhLCBwTG9nRm9udCwgKGNoYXIqKWxmYS5sZkZhY2VOYW1lIC0gKGNoYXIqKSZsZmEpOworICBDRlhfQnl0ZVN0cmluZyBmYWNlID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBMb2dGb250LT5sZkZhY2VOYW1lKTsKKyAgaWYgKGZhY2UuR2V0TGVuZ3RoKCkgPj0gTEZfRkFDRVNJWkUpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWFNZU19zdHJjcHkobGZhLmxmRmFjZU5hbWUsIGZhY2UuY19zdHIoKSk7CisgIHJldHVybiBBZGRXaW5kb3dzRm9udCgmbGZhLCBiVmVydCwgYlRyYW5zbGF0ZU5hbWUpOwogfQotZXh0ZXJuIENGWF9CeXRlU3RyaW5nIF9GUERGX0dldE5hbWVGcm9tVFQoY29uc3QgdWludDhfdCogbmFtZV90YWJsZSwgRlhfRFdPUkQgbmFtZSk7Ci1DRlhfQnl0ZVN0cmluZyBfRlBERl9HZXRQU05hbWVGcm9tVFQoSERDIGhEQykKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7Ci0gICAgRFdPUkQgc2l6ZSA9IDo6R2V0Rm9udERhdGEoaERDLCAnZW1hbicsIDAsIE5VTEwsIDApOwotICAgIGlmIChzaXplICE9IEdESV9FUlJPUikgewotICAgICAgICBMUEJZVEUgYnVmZmVyID0gRlhfQWxsb2MoQllURSwgc2l6ZSk7Ci0gICAgICAgIDo6R2V0Rm9udERhdGEoaERDLCAnZW1hbicsIDAsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIHJlc3VsdCA9IF9GUERGX0dldE5hbWVGcm9tVFQoYnVmZmVyLCA2KTsKLSAgICAgICAgRlhfRnJlZShidWZmZXIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworZXh0ZXJuIENGWF9CeXRlU3RyaW5nIF9GUERGX0dldE5hbWVGcm9tVFQoY29uc3QgdWludDhfdCogbmFtZV90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5hbWUpOworQ0ZYX0J5dGVTdHJpbmcgX0ZQREZfR2V0UFNOYW1lRnJvbVRUKEhEQyBoREMpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OworICBEV09SRCBzaXplID0gOjpHZXRGb250RGF0YShoREMsICdlbWFuJywgMCwgTlVMTCwgMCk7CisgIGlmIChzaXplICE9IEdESV9FUlJPUikgeworICAgIExQQllURSBidWZmZXIgPSBGWF9BbGxvYyhCWVRFLCBzaXplKTsKKyAgICA6OkdldEZvbnREYXRhKGhEQywgJ2VtYW4nLCAwLCBidWZmZXIsIHNpemUpOworICAgIHJlc3VsdCA9IF9GUERGX0dldE5hbWVGcm9tVFQoYnVmZmVyLCA2KTsKKyAgICBGWF9GcmVlKGJ1ZmZlcik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKIH0KLUNQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkV2luZG93c0ZvbnQoTE9HRk9OVEEqIHBMb2dGb250LCBGWF9CT09MIGJWZXJ0LCBGWF9CT09MIGJUcmFuc2xhdGVOYW1lKQotewotICAgIHBMb2dGb250LT5sZkhlaWdodCA9IC0xMDAwOwotICAgIHBMb2dGb250LT5sZldpZHRoID0gMDsKLSAgICBIR0RJT0JKIGhGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0QShwTG9nRm9udCk7Ci0gICAgSERDIGhEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhOVUxMKTsKLSAgICBoRm9udCA9IFNlbGVjdE9iamVjdChoREMsIGhGb250KTsKLSAgICBpbnQgdG1fc2l6ZSA9IEdldE91dGxpbmVUZXh0TWV0cmljcyhoREMsIDAsIE5VTEwpOwotICAgIGlmICh0bV9zaXplID09IDApIHsKLSAgICAgICAgaEZvbnQgPSBTZWxlY3RPYmplY3QoaERDLCBoRm9udCk7Ci0gICAgICAgIERlbGV0ZU9iamVjdChoRm9udCk7Ci0gICAgICAgIERlbGV0ZURDKGhEQyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBMUEJZVEUgdG1fYnVmID0gRlhfQWxsb2MoQllURSwgdG1fc2l6ZSk7Ci0gICAgT1VUTElORVRFWFRNRVRSSUMqIHB0bSA9IChPVVRMSU5FVEVYVE1FVFJJQyopdG1fYnVmOwotICAgIEdldE91dGxpbmVUZXh0TWV0cmljcyhoREMsIHRtX3NpemUsIHB0bSk7Ci0gICAgaW50IGZsYWdzID0gMCwgaXRhbGljYW5nbGUsIGFzY2VuZCwgZGVzY2VuZCwgY2FwaGVpZ2h0LCBiYm94WzRdOwotICAgIGlmIChwTG9nRm9udC0+bGZJdGFsaWMpIHsKLSAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9JVEFMSUM7Ci0gICAgfQotICAgIGlmICgocExvZ0ZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgJiAzKSA9PSBGSVhFRF9QSVRDSCkgewotICAgICAgICBmbGFncyB8PSBQREZGT05UX0ZJWEVEUElUQ0g7Ci0gICAgfQotICAgIGlmICgocExvZ0ZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgJiAweGY4KSA9PSBGRl9ST01BTikgewotICAgICAgICBmbGFncyB8PSBQREZGT05UX1NFUklGOwotICAgIH0KLSAgICBpZiAoKHBMb2dGb250LT5sZlBpdGNoQW5kRmFtaWx5ICYgMHhmOCkgPT0gRkZfU0NSSVBUKSB7Ci0gICAgICAgIGZsYWdzIHw9IFBERkZPTlRfU0NSSVBUOwotICAgIH0KLSAgICBGWF9CT09MIGJDSksgPSBwTG9nRm9udC0+bGZDaGFyU2V0ID09IENISU5FU0VCSUc1X0NIQVJTRVQgfHwgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBHQjIzMTJfQ0hBUlNFVCB8fAotICAgICAgICAgICAgICAgICAgIHBMb2dGb250LT5sZkNoYXJTZXQgPT0gSEFOR0VVTF9DSEFSU0VUIHx8IHBMb2dGb250LT5sZkNoYXJTZXQgPT0gU0hJRlRKSVNfQ0hBUlNFVDsKLSAgICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udDsKLSAgICBpZiAoYlRyYW5zbGF0ZU5hbWUgJiYgYkNKSykgewotICAgICAgICBiYXNlZm9udCA9IF9GUERGX0dldFBTTmFtZUZyb21UVChoREMpOwotICAgIH0KLSAgICBpZiAoYmFzZWZvbnQuSXNFbXB0eSgpKSB7Ci0gICAgICAgIGJhc2Vmb250ID0gcExvZ0ZvbnQtPmxmRmFjZU5hbWU7Ci0gICAgfQotICAgIGl0YWxpY2FuZ2xlID0gcHRtLT5vdG1JdGFsaWNBbmdsZSAvIDEwOwotICAgIGFzY2VuZCA9IHB0bS0+b3RtcmNGb250Qm94LnRvcDsKLSAgICBkZXNjZW5kID0gcHRtLT5vdG1yY0ZvbnRCb3guYm90dG9tOwotICAgIGNhcGhlaWdodCA9IHB0bS0+b3Rtc0NhcEVtSGVpZ2h0OwotICAgIGJib3hbMF0gPSBwdG0tPm90bXJjRm9udEJveC5sZWZ0OwotICAgIGJib3hbMV0gPSBwdG0tPm90bXJjRm9udEJveC5ib3R0b207Ci0gICAgYmJveFsyXSA9IHB0bS0+b3RtcmNGb250Qm94LnJpZ2h0OwotICAgIGJib3hbM10gPSBwdG0tPm90bXJjRm9udEJveC50b3A7Ci0gICAgRlhfRnJlZSh0bV9idWYpOwotICAgIGJhc2Vmb250LlJlcGxhY2UoIiAiLCAiIik7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQmFzZURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJUeXBlIiwgIkZvbnQiKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IHBCYXNlRGljdDsKLSAgICBpZiAoIWJDSkspIHsKLSAgICAgICAgaWYgKHBMb2dGb250LT5sZkNoYXJTZXQgPT0gQU5TSV9DSEFSU0VUIHx8IHBMb2dGb250LT5sZkNoYXJTZXQgPT0gREVGQVVMVF9DSEFSU0VUIHx8Ci0gICAgICAgICAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBTWU1CT0xfQ0hBUlNFVCkgewotICAgICAgICAgICAgaWYgKHBMb2dGb250LT5sZkNoYXJTZXQgPT0gU1lNQk9MX0NIQVJTRVQpIHsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBQREZGT05UX1NZTUJPTElDOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBQREZGT05UX05PTlNZTUJPTElDOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkVuY29kaW5nIiksICJXaW5BbnNpRW5jb2RpbmciKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKTsgaSArKykKLSAgICAgICAgICAgICAgICBpZiAoZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9DaGFyc2V0ID09IHBMb2dGb250LT5sZkNoYXJTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKSkgewotICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEVuY29kaW5nID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgICAgICAgICBwRW5jb2RpbmctPlNldEF0TmFtZShGWF9CU1RSQygiQmFzZUVuY29kaW5nIiksICJXaW5BbnNpRW5jb2RpbmciKTsKLSAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgICAgICAgICBwQXJyYXktPkFkZEludGVnZXIoMTI4KTsKLSAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFVuaWNvZGVzID0gZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9wVW5pY29kZXM7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMjg7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IFBERl9BZG9iZU5hbWVGcm9tVW5pY29kZShwVW5pY29kZXNbal0pOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkTmFtZShGWF9CU1RSQygiLm5vdGRlZiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRW5jb2RpbmctPlNldEF0KEZYX0JTVFJDKCJEaWZmZXJlbmNlcyIpLCBwQXJyYXkpOwotICAgICAgICAgICAgICAgIEFkZEluZGlyZWN0T2JqZWN0KHBFbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgcEJhc2VEaWN0LT5TZXRBdFJlZmVyZW5jZShGWF9CU1RSQygiRW5jb2RpbmciKSwgdGhpcywgcEVuY29kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocExvZ0ZvbnQtPmxmV2VpZ2h0ID4gRldfTUVESVVNICYmIHBMb2dGb250LT5sZkl0YWxpYykgewotICAgICAgICAgICAgYmFzZWZvbnQgKz0gIixCb2xkSXRhbGljIjsKLSAgICAgICAgfSBlbHNlIGlmIChwTG9nRm9udC0+bGZXZWlnaHQgPiBGV19NRURJVU0pIHsKLSAgICAgICAgICAgIGJhc2Vmb250ICs9ICIsQm9sZCI7Ci0gICAgICAgIH0gZWxzZSBpZiAocExvZ0ZvbnQtPmxmSXRhbGljKSB7Ci0gICAgICAgICAgICBiYXNlZm9udCArPSAiLEl0YWxpYyI7Ci0gICAgICAgIH0KLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiVHJ1ZVR5cGUiKTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOwotICAgICAgICBwQmFzZURpY3QtPlNldEF0TnVtYmVyKCJGaXJzdENoYXIiLCAzMik7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROdW1iZXIoIkxhc3RDaGFyIiwgMjU1KTsKLSAgICAgICAgaW50IGNoYXJfd2lkdGhzWzIyNF07Ci0gICAgICAgIEdldENoYXJXaWR0aChoREMsIDMyLCAyNTUsIGNoYXJfd2lkdGhzKTsKLSAgICAgICAgQ1BERl9BcnJheSogcFdpZHRocyA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIyNDsgaSArKykgewotICAgICAgICAgICAgcFdpZHRocy0+QWRkSW50ZWdlcihjaGFyX3dpZHRoc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdCgiV2lkdGhzIiwgcFdpZHRocyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKLSAgICAgICAgcEZvbnREaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY21hcDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgb3JkZXJpbmc7Ci0gICAgICAgIGludCBzdXBwbGVtZW50OwotICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICBzd2l0Y2ggKHBMb2dGb250LT5sZkNoYXJTZXQpIHsKLSAgICAgICAgICAgIGNhc2UgQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKLSAgICAgICAgICAgICAgICBjbWFwID0gYlZlcnQgPyAiRVRlbm1zLUI1LVYiIDogIkVUZW5tcy1CNS1IIjsKLSAgICAgICAgICAgICAgICBvcmRlcmluZyA9ICJDTlMxIjsKLSAgICAgICAgICAgICAgICBzdXBwbGVtZW50ID0gNDsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgR0IyMzEyX0NIQVJTRVQ6Ci0gICAgICAgICAgICAgICAgY21hcCA9IGJWZXJ0ID8gIkdCSy1FVUMtViIgOiAiR0JLLUVVQy1IIjsKLSAgICAgICAgICAgICAgICBvcmRlcmluZyA9ICJHQjEiLCBzdXBwbGVtZW50ID0gMjsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig3NzE2KTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4MjAsIDB4MjAsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig4MTQpOwotICAgICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHgyMSwgMHg3ZSwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBIQU5HRVVMX0NIQVJTRVQ6Ci0gICAgICAgICAgICAgICAgY21hcCA9IGJWZXJ0ID8gIktTQ21zLVVIQy1WIiA6ICJLU0Ntcy1VSEMtSCI7Ci0gICAgICAgICAgICAgICAgb3JkZXJpbmcgPSAiS29yZWExIjsKLSAgICAgICAgICAgICAgICBzdXBwbGVtZW50ID0gMjsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0hJRlRKSVNfQ0hBUlNFVDoKLSAgICAgICAgICAgICAgICBjbWFwID0gYlZlcnQgPyAiOTBtcy1SS1NKLVYiIDogIjkwbXMtUktTSi1IIjsKLSAgICAgICAgICAgICAgICBvcmRlcmluZyA9ICJKYXBhbjEiOwotICAgICAgICAgICAgICAgIHN1cHBsZW1lbnQgPSA1OwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDIzMSk7Ci0gICAgICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoaERDLCAweDIwLCAweDdkLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMzI2KTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4YTAsIDB4YTAsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigzMjcpOwotICAgICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHhhMSwgMHhkZiwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDYzMSk7Ci0gICAgICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoaERDLCAweDdlLCAweDdlLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiVHlwZTAiKTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOwotICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiRW5jb2RpbmciLCBjbWFwKTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdCgiVyIsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udCIpOwotICAgICAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJDSURGb250VHlwZTIiKTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOwotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBDSURTeXNJbmZvID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgcENJRFN5c0luZm8tPlNldEF0U3RyaW5nKCJSZWdpc3RyeSIsICJBZG9iZSIpOwotICAgICAgICBwQ0lEU3lzSW5mby0+U2V0QXRTdHJpbmcoIk9yZGVyaW5nIiwgb3JkZXJpbmcpOwotICAgICAgICBwQ0lEU3lzSW5mby0+U2V0QXRJbnRlZ2VyKCJTdXBwbGVtZW50Iiwgc3VwcGxlbWVudCk7Ci0gICAgICAgIHBGb250RGljdC0+U2V0QXQoIkNJRFN5c3RlbUluZm8iLCBwQ0lEU3lzSW5mbyk7Ci0gICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICBwQmFzZURpY3QtPlNldEF0KCJEZXNjZW5kYW50Rm9udHMiLCBwQXJyYXkpOwotICAgICAgICBBZGRJbmRpcmVjdE9iamVjdChwRm9udERpY3QpOwotICAgICAgICBwQXJyYXktPkFkZFJlZmVyZW5jZSh0aGlzLCBwRm9udERpY3QpOwotICAgIH0KLSAgICBBZGRJbmRpcmVjdE9iamVjdChwQmFzZURpY3QpOwotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICBwRm9udERlc2MtPlNldEF0TmFtZSgiVHlwZSIsICJGb250RGVzY3JpcHRvciIpOwotICAgIHBGb250RGVzYy0+U2V0QXROYW1lKCJGb250TmFtZSIsIGJhc2Vmb250KTsKLSAgICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiRmxhZ3MiLCBmbGFncyk7Ci0gICAgQ1BERl9BcnJheSogcEJCb3ggPSBuZXcgQ1BERl9BcnJheTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgcEJCb3gtPkFkZEludGVnZXIoYmJveFtpXSk7Ci0gICAgfQotICAgIHBGb250RGVzYy0+U2V0QXQoIkZvbnRCQm94IiwgcEJCb3gpOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJJdGFsaWNBbmdsZSIsIGl0YWxpY2FuZ2xlKTsKLSAgICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiQXNjZW50IiwgYXNjZW5kKTsKLSAgICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiRGVzY2VudCIsIGRlc2NlbmQpOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJDYXBIZWlnaHQiLCBjYXBoZWlnaHQpOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJTdGVtViIsIHBMb2dGb250LT5sZldlaWdodCAvIDUpOwotICAgIEFkZEluZGlyZWN0T2JqZWN0KHBGb250RGVzYyk7Ci0gICAgcEZvbnREaWN0LT5TZXRBdFJlZmVyZW5jZSgiRm9udERlc2NyaXB0b3IiLCB0aGlzLCBwRm9udERlc2MpOworQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRXaW5kb3dzRm9udChMT0dGT05UQSogcExvZ0ZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUpIHsKKyAgcExvZ0ZvbnQtPmxmSGVpZ2h0ID0gLTEwMDA7CisgIHBMb2dGb250LT5sZldpZHRoID0gMDsKKyAgSEdESU9CSiBoRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdEEocExvZ0ZvbnQpOworICBIREMgaERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOworICBoRm9udCA9IFNlbGVjdE9iamVjdChoREMsIGhGb250KTsKKyAgaW50IHRtX3NpemUgPSBHZXRPdXRsaW5lVGV4dE1ldHJpY3MoaERDLCAwLCBOVUxMKTsKKyAgaWYgKHRtX3NpemUgPT0gMCkgewogICAgIGhGb250ID0gU2VsZWN0T2JqZWN0KGhEQywgaEZvbnQpOwogICAgIERlbGV0ZU9iamVjdChoRm9udCk7CiAgICAgRGVsZXRlREMoaERDKTsKLSAgICByZXR1cm4gTG9hZEZvbnQocEJhc2VEaWN0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBMUEJZVEUgdG1fYnVmID0gRlhfQWxsb2MoQllURSwgdG1fc2l6ZSk7CisgIE9VVExJTkVURVhUTUVUUklDKiBwdG0gPSAoT1VUTElORVRFWFRNRVRSSUMqKXRtX2J1ZjsKKyAgR2V0T3V0bGluZVRleHRNZXRyaWNzKGhEQywgdG1fc2l6ZSwgcHRtKTsKKyAgaW50IGZsYWdzID0gMCwgaXRhbGljYW5nbGUsIGFzY2VuZCwgZGVzY2VuZCwgY2FwaGVpZ2h0LCBiYm94WzRdOworICBpZiAocExvZ0ZvbnQtPmxmSXRhbGljKSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9JVEFMSUM7CisgIH0KKyAgaWYgKChwTG9nRm9udC0+bGZQaXRjaEFuZEZhbWlseSAmIDMpID09IEZJWEVEX1BJVENIKSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9GSVhFRFBJVENIOworICB9CisgIGlmICgocExvZ0ZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgJiAweGY4KSA9PSBGRl9ST01BTikgeworICAgIGZsYWdzIHw9IFBERkZPTlRfU0VSSUY7CisgIH0KKyAgaWYgKChwTG9nRm9udC0+bGZQaXRjaEFuZEZhbWlseSAmIDB4ZjgpID09IEZGX1NDUklQVCkgeworICAgIGZsYWdzIHw9IFBERkZPTlRfU0NSSVBUOworICB9CisgIEZYX0JPT0wgYkNKSyA9IHBMb2dGb250LT5sZkNoYXJTZXQgPT0gQ0hJTkVTRUJJRzVfQ0hBUlNFVCB8fAorICAgICAgICAgICAgICAgICBwTG9nRm9udC0+bGZDaGFyU2V0ID09IEdCMjMxMl9DSEFSU0VUIHx8CisgICAgICAgICAgICAgICAgIHBMb2dGb250LT5sZkNoYXJTZXQgPT0gSEFOR0VVTF9DSEFSU0VUIHx8CisgICAgICAgICAgICAgICAgIHBMb2dGb250LT5sZkNoYXJTZXQgPT0gU0hJRlRKSVNfQ0hBUlNFVDsKKyAgQ0ZYX0J5dGVTdHJpbmcgYmFzZWZvbnQ7CisgIGlmIChiVHJhbnNsYXRlTmFtZSAmJiBiQ0pLKSB7CisgICAgYmFzZWZvbnQgPSBfRlBERl9HZXRQU05hbWVGcm9tVFQoaERDKTsKKyAgfQorICBpZiAoYmFzZWZvbnQuSXNFbXB0eSgpKSB7CisgICAgYmFzZWZvbnQgPSBwTG9nRm9udC0+bGZGYWNlTmFtZTsKKyAgfQorICBpdGFsaWNhbmdsZSA9IHB0bS0+b3RtSXRhbGljQW5nbGUgLyAxMDsKKyAgYXNjZW5kID0gcHRtLT5vdG1yY0ZvbnRCb3gudG9wOworICBkZXNjZW5kID0gcHRtLT5vdG1yY0ZvbnRCb3guYm90dG9tOworICBjYXBoZWlnaHQgPSBwdG0tPm90bXNDYXBFbUhlaWdodDsKKyAgYmJveFswXSA9IHB0bS0+b3RtcmNGb250Qm94LmxlZnQ7CisgIGJib3hbMV0gPSBwdG0tPm90bXJjRm9udEJveC5ib3R0b207CisgIGJib3hbMl0gPSBwdG0tPm90bXJjRm9udEJveC5yaWdodDsKKyAgYmJveFszXSA9IHB0bS0+b3RtcmNGb250Qm94LnRvcDsKKyAgRlhfRnJlZSh0bV9idWYpOworICBiYXNlZm9udC5SZXBsYWNlKCIgIiwgIiIpOworICBDUERGX0RpY3Rpb25hcnkqIHBCYXNlRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJUeXBlIiwgIkZvbnQiKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBwQmFzZURpY3Q7CisgIGlmICghYkNKSykgeworICAgIGlmIChwTG9nRm9udC0+bGZDaGFyU2V0ID09IEFOU0lfQ0hBUlNFVCB8fAorICAgICAgICBwTG9nRm9udC0+bGZDaGFyU2V0ID09IERFRkFVTFRfQ0hBUlNFVCB8fAorICAgICAgICBwTG9nRm9udC0+bGZDaGFyU2V0ID09IFNZTUJPTF9DSEFSU0VUKSB7CisgICAgICBpZiAocExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBTWU1CT0xfQ0hBUlNFVCkgeworICAgICAgICBmbGFncyB8PSBQREZGT05UX1NZTUJPTElDOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKKyAgICAgIH0KKyAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJFbmNvZGluZyIpLCAiV2luQW5zaUVuY29kaW5nIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKTsKKyAgICAgICAgICAgaSsrKQorICAgICAgICBpZiAoZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9DaGFyc2V0ID09IHBMb2dGb250LT5sZkNoYXJTZXQpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgaWYgKGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKSkgeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBFbmNvZGluZyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgICAgIHBFbmNvZGluZy0+U2V0QXROYW1lKEZYX0JTVFJDKCJCYXNlRW5jb2RpbmciKSwgIldpbkFuc2lFbmNvZGluZyIpOworICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgICAgICAgcEFycmF5LT5BZGRJbnRlZ2VyKDEyOCk7CisgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVW5pY29kZXMgPSBnX0ZYX0NoYXJzZXRVbmljb2Rlc1tpXS5tX3BVbmljb2RlczsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMjg7IGorKykgeworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBQREZfQWRvYmVOYW1lRnJvbVVuaWNvZGUocFVuaWNvZGVzW2pdKTsKKyAgICAgICAgICBpZiAobmFtZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHBBcnJheS0+QWRkTmFtZShGWF9CU1RSQygiLm5vdGRlZiIpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcEFycmF5LT5BZGROYW1lKG5hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwRW5jb2RpbmctPlNldEF0KEZYX0JTVFJDKCJEaWZmZXJlbmNlcyIpLCBwQXJyYXkpOworICAgICAgICBBZGRJbmRpcmVjdE9iamVjdChwRW5jb2RpbmcpOworICAgICAgICBwQmFzZURpY3QtPlNldEF0UmVmZXJlbmNlKEZYX0JTVFJDKCJFbmNvZGluZyIpLCB0aGlzLCBwRW5jb2RpbmcpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocExvZ0ZvbnQtPmxmV2VpZ2h0ID4gRldfTUVESVVNICYmIHBMb2dGb250LT5sZkl0YWxpYykgeworICAgICAgYmFzZWZvbnQgKz0gIixCb2xkSXRhbGljIjsKKyAgICB9IGVsc2UgaWYgKHBMb2dGb250LT5sZldlaWdodCA+IEZXX01FRElVTSkgeworICAgICAgYmFzZWZvbnQgKz0gIixCb2xkIjsKKyAgICB9IGVsc2UgaWYgKHBMb2dGb250LT5sZkl0YWxpYykgeworICAgICAgYmFzZWZvbnQgKz0gIixJdGFsaWMiOworICAgIH0KKyAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJUcnVlVHlwZSIpOworICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJCYXNlRm9udCIsIGJhc2Vmb250KTsKKyAgICBwQmFzZURpY3QtPlNldEF0TnVtYmVyKCJGaXJzdENoYXIiLCAzMik7CisgICAgcEJhc2VEaWN0LT5TZXRBdE51bWJlcigiTGFzdENoYXIiLCAyNTUpOworICAgIGludCBjaGFyX3dpZHRoc1syMjRdOworICAgIEdldENoYXJXaWR0aChoREMsIDMyLCAyNTUsIGNoYXJfd2lkdGhzKTsKKyAgICBDUERGX0FycmF5KiBwV2lkdGhzID0gbmV3IENQREZfQXJyYXk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMjQ7IGkrKykgeworICAgICAgcFdpZHRocy0+QWRkSW50ZWdlcihjaGFyX3dpZHRoc1tpXSk7CisgICAgfQorICAgIHBCYXNlRGljdC0+U2V0QXQoIldpZHRocyIsIHBXaWR0aHMpOworICB9IGVsc2UgeworICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7CisgICAgcEZvbnREaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBDRlhfQnl0ZVN0cmluZyBjbWFwOworICAgIENGWF9CeXRlU3RyaW5nIG9yZGVyaW5nOworICAgIGludCBzdXBwbGVtZW50OworICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgICAgc3dpdGNoIChwTG9nRm9udC0+bGZDaGFyU2V0KSB7CisgICAgICBjYXNlIENISU5FU0VCSUc1X0NIQVJTRVQ6CisgICAgICAgIGNtYXAgPSBiVmVydCA/ICJFVGVubXMtQjUtViIgOiAiRVRlbm1zLUI1LUgiOworICAgICAgICBvcmRlcmluZyA9ICJDTlMxIjsKKyAgICAgICAgc3VwcGxlbWVudCA9IDQ7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDEpOworICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdCMjMxMl9DSEFSU0VUOgorICAgICAgICBjbWFwID0gYlZlcnQgPyAiR0JLLUVVQy1WIiA6ICJHQkstRVVDLUgiOworICAgICAgICBvcmRlcmluZyA9ICJHQjEiLCBzdXBwbGVtZW50ID0gMjsKKyAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoNzcxNik7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHgyMCwgMHgyMCwgcFdpZHRoQXJyYXkpOworICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig4MTQpOworICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4MjEsIDB4N2UsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTkdFVUxfQ0hBUlNFVDoKKyAgICAgICAgY21hcCA9IGJWZXJ0ID8gIktTQ21zLVVIQy1WIiA6ICJLU0Ntcy1VSEMtSCI7CisgICAgICAgIG9yZGVyaW5nID0gIktvcmVhMSI7CisgICAgICAgIHN1cHBsZW1lbnQgPSAyOworICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKKyAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoaERDLCAweDIwLCAweDdlLCBwV2lkdGhBcnJheSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTSElGVEpJU19DSEFSU0VUOgorICAgICAgICBjbWFwID0gYlZlcnQgPyAiOTBtcy1SS1NKLVYiIDogIjkwbXMtUktTSi1IIjsKKyAgICAgICAgb3JkZXJpbmcgPSAiSmFwYW4xIjsKKyAgICAgICAgc3VwcGxlbWVudCA9IDU7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDIzMSk7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHgyMCwgMHg3ZCwgcFdpZHRoQXJyYXkpOworICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigzMjYpOworICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4YTAsIDB4YTAsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMzI3KTsKKyAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoaERDLCAweGExLCAweGRmLCBwV2lkdGhBcnJheSk7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDYzMSk7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHg3ZSwgMHg3ZSwgcFdpZHRoQXJyYXkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiVHlwZTAiKTsKKyAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiQmFzZUZvbnQiLCBiYXNlZm9udCk7CisgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkVuY29kaW5nIiwgY21hcCk7CisgICAgcEZvbnREaWN0LT5TZXRBdCgiVyIsIHBXaWR0aEFycmF5KTsKKyAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJGb250Iik7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiQ0lERm9udFR5cGUyIik7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOworICAgIENQREZfRGljdGlvbmFyeSogcENJRFN5c0luZm8gPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgIHBDSURTeXNJbmZvLT5TZXRBdFN0cmluZygiUmVnaXN0cnkiLCAiQWRvYmUiKTsKKyAgICBwQ0lEU3lzSW5mby0+U2V0QXRTdHJpbmcoIk9yZGVyaW5nIiwgb3JkZXJpbmcpOworICAgIHBDSURTeXNJbmZvLT5TZXRBdEludGVnZXIoIlN1cHBsZW1lbnQiLCBzdXBwbGVtZW50KTsKKyAgICBwRm9udERpY3QtPlNldEF0KCJDSURTeXN0ZW1JbmZvIiwgcENJRFN5c0luZm8pOworICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OworICAgIHBCYXNlRGljdC0+U2V0QXQoIkRlc2NlbmRhbnRGb250cyIsIHBBcnJheSk7CisgICAgQWRkSW5kaXJlY3RPYmplY3QocEZvbnREaWN0KTsKKyAgICBwQXJyYXktPkFkZFJlZmVyZW5jZSh0aGlzLCBwRm9udERpY3QpOworICB9CisgIEFkZEluZGlyZWN0T2JqZWN0KHBCYXNlRGljdCk7CisgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcEZvbnREZXNjLT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udERlc2NyaXB0b3IiKTsKKyAgcEZvbnREZXNjLT5TZXRBdE5hbWUoIkZvbnROYW1lIiwgYmFzZWZvbnQpOworICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiRmxhZ3MiLCBmbGFncyk7CisgIENQREZfQXJyYXkqIHBCQm94ID0gbmV3IENQREZfQXJyYXk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgcEJCb3gtPkFkZEludGVnZXIoYmJveFtpXSk7CisgIH0KKyAgcEZvbnREZXNjLT5TZXRBdCgiRm9udEJCb3giLCBwQkJveCk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJJdGFsaWNBbmdsZSIsIGl0YWxpY2FuZ2xlKTsKKyAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkFzY2VudCIsIGFzY2VuZCk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJEZXNjZW50IiwgZGVzY2VuZCk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJDYXBIZWlnaHQiLCBjYXBoZWlnaHQpOworICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiU3RlbVYiLCBwTG9nRm9udC0+bGZXZWlnaHQgLyA1KTsKKyAgQWRkSW5kaXJlY3RPYmplY3QocEZvbnREZXNjKTsKKyAgcEZvbnREaWN0LT5TZXRBdFJlZmVyZW5jZSgiRm9udERlc2NyaXB0b3IiLCB0aGlzLCBwRm9udERlc2MpOworICBoRm9udCA9IFNlbGVjdE9iamVjdChoREMsIGhGb250KTsKKyAgRGVsZXRlT2JqZWN0KGhGb250KTsKKyAgRGVsZXRlREMoaERDKTsKKyAgcmV0dXJuIExvYWRGb250KHBCYXNlRGljdCk7CiB9CiAjZW5kaWYKLSNpZiAoX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfKQotdWludDMyX3QgRlhfR2V0TGFuZ0hhc2hDb2RlKCBjb25zdCBGWF9DSEFSKiBwU3RyKQotewotICAgIEZYU1lTX2Fzc2VydCggcFN0ciAhPSBOVUxMKTsKLSAgICBpbnQzMl90IGlMZW5ndGggPSBGWFNZU19zdHJsZW4ocFN0cik7Ci0gICAgY29uc3QgRlhfQ0hBUiogcFN0ckVuZCA9IHBTdHIgKyBpTGVuZ3RoOwotICAgIHVpbnQzMl90IHVIYXNoQ29kZSA9IDA7Ci0gICAgd2hpbGUgKCBwU3RyIDwgcFN0ckVuZCkgewotICAgICAgICB1SGFzaENvZGUgPSAzMSAqIHVIYXNoQ29kZSArIHRvbG93ZXIoKnBTdHIrKyk7Ci0gICAgfQotICAgIHJldHVybiB1SGFzaENvZGU7CisjaWYgKF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfKQordWludDMyX3QgRlhfR2V0TGFuZ0hhc2hDb2RlKGNvbnN0IEZYX0NIQVIqIHBTdHIpIHsKKyAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCk7CisgIGludDMyX3QgaUxlbmd0aCA9IEZYU1lTX3N0cmxlbihwU3RyKTsKKyAgY29uc3QgRlhfQ0hBUiogcFN0ckVuZCA9IHBTdHIgKyBpTGVuZ3RoOworICB1aW50MzJfdCB1SGFzaENvZGUgPSAwOworICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKKyAgICB1SGFzaENvZGUgPSAzMSAqIHVIYXNoQ29kZSArIHRvbG93ZXIoKnBTdHIrKyk7CisgIH0KKyAgcmV0dXJuIHVIYXNoQ29kZTsKIH0KIHN0cnVjdCBGWF9MQU5HMkNTIHsKLSAgICBGWF9EV09SRCAgICB1TGFuZzsKLSAgICBpbnQgICAgICAgICB1Q2hhcnNldDsKLX0qRlhfTFBMQU5HMkNTOworICBGWF9EV09SRCB1TGFuZzsKKyAgaW50IHVDaGFyc2V0OworfSAqIEZYX0xQTEFORzJDUzsKIHN0YXRpYyBjb25zdCBGWF9MQU5HMkNTIGdzX0ZYTGFuZzJDaGFyc2V0VGFibGVbXSA9IHsKLSAgICB7MzEwOSwgMH0sCi0gICAgezMxMjEsIDE3OH0sCi0gICAgezMxMjksIDE2Mn0sCi0gICAgezMxMzksIDIwNH0sCi0gICAgezMxNDEsIDIwNH0sCi0gICAgezMxNjYsIDB9LAotICAgIHszMTg0LCAyMzh9LAotICAgIHszMTk3LCAwfSwKLSAgICB7MzIwMSwgMH0sCi0gICAgezMyMzksIDE2MX0sCi0gICAgezMyNDEsIDB9LAotICAgIHszMjQ2LCAwfSwKLSAgICB7MzI0NywgMTg2fSwKLSAgICB7MzI0OCwgMH0sCi0gICAgezMyNTksIDE3OH0sCi0gICAgezMyNjcsIDB9LAotICAgIHszMjczLCAwfSwKLSAgICB7MzI3NiwgMH0sCi0gICAgezMzMDEsIDB9LAotICAgIHszMzEwLCAxfSwKLSAgICB7MzMyNSwgMTc3fSwKLSAgICB7MzMyOSwgMX0sCi0gICAgezMzMzgsIDIzOH0sCi0gICAgezMzNDEsIDIzOH0sCi0gICAgezMzNDUsIDF9LAotICAgIHszMzU1LCAwfSwKLSAgICB7MzM3MCwgMH0sCi0gICAgezMzNzEsIDB9LAotICAgIHszMzgzLCAxMjh9LAotICAgIHszNDI0LCAyMDR9LAotICAgIHszNDI3LCAxfSwKLSAgICB7MzQyOCwgMTI5fSwKLSAgICB7MzQzNiwgMTc4fSwKLSAgICB7MzQ2NCwgMTg2fSwKLSAgICB7MzQ2NiwgMTg2fSwKLSAgICB7MzQ4NiwgMjA0fSwKLSAgICB7MzQ4NywgMH0sCi0gICAgezM0OTMsIDF9LAotICAgIHszNDk0LCAwfSwKLSAgICB7MzUwOCwgMH0sCi0gICAgezM1MTgsIDB9LAotICAgIHszNTIwLCAwfSwKLSAgICB7MzU2OSwgMX0sCi0gICAgezM1ODAsIDIzOH0sCi0gICAgezM1ODgsIDB9LAotICAgIHszNjQ1LCAyMzh9LAotICAgIHszNjUxLCAyMDR9LAotICAgIHszNjcyLCAyMzh9LAotICAgIHszNjczLCAyMzh9LAotICAgIHszNjc4LCAyMzh9LAotICAgIHszNjc5LCAyMzh9LAotICAgIHszNjgzLCAwfSwKLSAgICB7MzY4NCwgMH0sCi0gICAgezM2OTMsIDF9LAotICAgIHszNjk3LCAxfSwKLSAgICB7MzcwMCwgMjIyfSwKLSAgICB7MzcxMCwgMTYyfSwKLSAgICB7MzczNCwgMjA0fSwKLSAgICB7Mzc0MSwgMTc4fSwKLSAgICB7Mzc0OSwgMTYyfSwKLSAgICB7Mzc2MywgMTYzfSwKLSAgICB7Mzg4NiwgMTM0fSwKLSAgICB7MTA1OTQzLCAwfSwKLSAgICB7MTA2Mzc1LCAxfSwKLSAgICB7MzkyMzQ1MTgzNywgMTM0fSwKKyAgICB7MzEwOSwgMH0sICAgICAgICAgezMxMjEsIDE3OH0sIHszMTI5LCAxNjJ9LCB7MzEzOSwgMjA0fSwgezMxNDEsIDIwNH0sCisgICAgezMxNjYsIDB9LCAgICAgICAgIHszMTg0LCAyMzh9LCB7MzE5NywgMH0sICAgezMyMDEsIDB9LCAgIHszMjM5LCAxNjF9LAorICAgIHszMjQxLCAwfSwgICAgICAgICB7MzI0NiwgMH0sICAgezMyNDcsIDE4Nn0sIHszMjQ4LCAwfSwgICB7MzI1OSwgMTc4fSwKKyAgICB7MzI2NywgMH0sICAgICAgICAgezMyNzMsIDB9LCAgIHszMjc2LCAwfSwgICB7MzMwMSwgMH0sICAgezMzMTAsIDF9LAorICAgIHszMzI1LCAxNzd9LCAgICAgICB7MzMyOSwgMX0sICAgezMzMzgsIDIzOH0sIHszMzQxLCAyMzh9LCB7MzM0NSwgMX0sCisgICAgezMzNTUsIDB9LCAgICAgICAgIHszMzcwLCAwfSwgICB7MzM3MSwgMH0sICAgezMzODMsIDEyOH0sIHszNDI0LCAyMDR9LAorICAgIHszNDI3LCAxfSwgICAgICAgICB7MzQyOCwgMTI5fSwgezM0MzYsIDE3OH0sIHszNDY0LCAxODZ9LCB7MzQ2NiwgMTg2fSwKKyAgICB7MzQ4NiwgMjA0fSwgICAgICAgezM0ODcsIDB9LCAgIHszNDkzLCAxfSwgICB7MzQ5NCwgMH0sICAgezM1MDgsIDB9LAorICAgIHszNTE4LCAwfSwgICAgICAgICB7MzUyMCwgMH0sICAgezM1NjksIDF9LCAgIHszNTgwLCAyMzh9LCB7MzU4OCwgMH0sCisgICAgezM2NDUsIDIzOH0sICAgICAgIHszNjUxLCAyMDR9LCB7MzY3MiwgMjM4fSwgezM2NzMsIDIzOH0sIHszNjc4LCAyMzh9LAorICAgIHszNjc5LCAyMzh9LCAgICAgICB7MzY4MywgMH0sICAgezM2ODQsIDB9LCAgIHszNjkzLCAxfSwgICB7MzY5NywgMX0sCisgICAgezM3MDAsIDIyMn0sICAgICAgIHszNzEwLCAxNjJ9LCB7MzczNCwgMjA0fSwgezM3NDEsIDE3OH0sIHszNzQ5LCAxNjJ9LAorICAgIHszNzYzLCAxNjN9LCAgICAgICB7Mzg4NiwgMTM0fSwgezEwNTk0MywgMH0sIHsxMDYzNzUsIDF9LCB7MzkyMzQ1MTgzNywgMTM0fSwKICAgICB7MzkyMzQ1MTgzOCwgMTM2fSwKIH07Ci1zdGF0aWMgRlhfV09SRCBGWF9HZXRDc0Zyb21MYW5nQ29kZSh1aW50MzJfdCB1Q29kZSkKLXsKLSAgICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gICAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdzX0ZYTGFuZzJDaGFyc2V0VGFibGUpIC8gc2l6ZW9mKEZYX0xBTkcyQ1MpIC0gMTsKLSAgICB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpIHsKLSAgICAgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKLSAgICAgICAgY29uc3QgRlhfTEFORzJDUyAmY2hhcnNldCA9IGdzX0ZYTGFuZzJDaGFyc2V0VGFibGVbaU1pZF07Ci0gICAgICAgIGlmICh1Q29kZSA9PSBjaGFyc2V0LnVMYW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hhcnNldC51Q2hhcnNldDsKLSAgICAgICAgfQotICAgICAgICBpZiAodUNvZGUgPCBjaGFyc2V0LnVMYW5nKSB7Ci0gICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgcmV0dXJuIDA7Ci19Ci1zdGF0aWMgRlhfV09SRCBGWF9HZXRDaGFyc2V0RnJvbUxhbmcoY29uc3QgRlhfQ0hBUiogcExhbmcsIGludDMyX3QgaUxlbmd0aCkKLXsKLSAgICBGWFNZU19hc3NlcnQocExhbmcpOwotICAgIGlmIChpTGVuZ3RoIDwgMCkgewotICAgICAgICBpTGVuZ3RoID0gRlhTWVNfc3RybGVuKHBMYW5nKTsKK3N0YXRpYyBGWF9XT1JEIEZYX0dldENzRnJvbUxhbmdDb2RlKHVpbnQzMl90IHVDb2RlKSB7CisgIGludDMyX3QgaVN0YXJ0ID0gMDsKKyAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdzX0ZYTGFuZzJDaGFyc2V0VGFibGUpIC8gc2l6ZW9mKEZYX0xBTkcyQ1MpIC0gMTsKKyAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7CisgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKKyAgICBjb25zdCBGWF9MQU5HMkNTJiBjaGFyc2V0ID0gZ3NfRlhMYW5nMkNoYXJzZXRUYWJsZVtpTWlkXTsKKyAgICBpZiAodUNvZGUgPT0gY2hhcnNldC51TGFuZykgeworICAgICAgcmV0dXJuIGNoYXJzZXQudUNoYXJzZXQ7CiAgICAgfQotICAgIHVpbnQzMl90IHVIYXNoID0gRlhfR2V0TGFuZ0hhc2hDb2RlKHBMYW5nKTsKLSAgICByZXR1cm4gRlhfR2V0Q3NGcm9tTGFuZ0NvZGUodUhhc2gpOwotfQotc3RhdGljIHZvaWQgX0NGU3RyaW5nMkNGWEJ5dGVTdHJpbmcoQ0ZTdHJpbmdSZWYgc3JjLCBDRlhfQnl0ZVN0cmluZyAmZGVzdCkKLXsKLSAgICBTSW50MzIgbGVuID0gIENGU3RyaW5nR2V0TGVuZ3RoKHNyYyk7Ci0gICAgQ0ZSYW5nZSByYW5nZSA9IENGUmFuZ2VNYWtlKDAsIGxlbik7Ci0gICAgQ0ZJbmRleCB1c2VkID0gMDsKLSAgICBVSW50OCogcEJ1ZmZlciA9IChVSW50OCopY2FsbG9jKGxlbisxLCBzaXplb2YoVUludDgpKTsKLSAgICBDRlN0cmluZ0dldEJ5dGVzKHNyYywgcmFuZ2UsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksIDAsIGZhbHNlLCBwQnVmZmVyLCBsZW4sICZ1c2VkKTsKLSAgICBkZXN0ID0gKEZYX0NIQVIqKXBCdWZmZXI7Ci0gICAgZnJlZShwQnVmZmVyKTsKLX0KLUZYX0JPT0wgSXNIYXNDaGFyU2V0KENGQXJyYXlSZWYgbGFuZ3VhZ2VzLCBjb25zdCBDRlhfRFdvcmRBcnJheSAmY2hhclNldHMpCi17Ci0gICAgaW50IGlDb3VudCA9IGNoYXJTZXRzLkdldFNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IENGQXJyYXlHZXRDb3VudChsYW5ndWFnZXMpOyArK2kpIHsKLSAgICAgICAgQ0ZTdHJpbmdSZWYgbGFuZ3VhZ2UgPSAoQ0ZTdHJpbmdSZWYpQ0ZBcnJheUdldFZhbHVlQXRJbmRleChsYW5ndWFnZXMsIGkpOwotICAgICAgICBGWF9EV09SRCBDaGFyU2V0ID0gRlhfR2V0Q2hhcnNldEZyb21MYW5nKENGU3RyaW5nR2V0Q1N0cmluZ1B0cihsYW5ndWFnZSwga0NGU3RyaW5nRW5jb2RpbmdNYWNSb21hbiksIC0xKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpQ291bnQ7ICsraikgewotICAgICAgICAgICAgaWYgKENoYXJTZXQgPT0gY2hhclNldHNbal0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci12b2lkIEZYX0dldENoYXJXaWR0aChDVEZvbnRSZWYgZm9udCwgVW5pQ2hhciBzdGFydCwgVW5pQ2hhciBlbmQsIGludCogd2lkdGgpCi17Ci0gICAgQ0dGbG9hdCBzaXplID0gQ1RGb250R2V0U2l6ZShmb250KTsKLSAgICBmb3IgKDsgc3RhcnQgPD0gZW5kOyArK3N0YXJ0KSB7Ci0gICAgICAgIENHR2x5cGggcEdseXBoID0gMDsKLSAgICAgICAgQ0ZJbmRleCBjb3VudCA9IDE7Ci0gICAgICAgIENURm9udEdldEdseXBoc0ZvckNoYXJhY3RlcnMoZm9udCwgJnN0YXJ0LCAmcEdseXBoLCBjb3VudCk7Ci0gICAgICAgIENHU2l6ZSBhZHZhbmNlczsKLSAgICAgICAgQ1RGb250R2V0QWR2YW5jZXNGb3JHbHlwaHMoZm9udCwga0NURm9udERlZmF1bHRPcmllbnRhdGlvbiwgJnBHbHlwaCwgJmFkdmFuY2VzLCAxKTsKLSAgICAgICAgKndpZHRoID0gKGludCkoYWR2YW5jZXMud2lkdGggLyBzaXplICogMTAwMCkgOwotICAgICAgICB3aWR0aCsrOwotICAgIH0KLX0KLXN0YXRpYyB2b2lkIF9JbnNlcnRXaWR0aEFycmF5KENURm9udFJlZiBmb250LCBpbnQgc3RhcnQsIGludCBlbmQsIENQREZfQXJyYXkqIHBXaWR0aEFycmF5KQotewotICAgIGludCBzaXplID0gZW5kIC0gc3RhcnQgKyAxOwotICAgIGludCogd2lkdGhzID0gRlhfQWxsb2MoaW50LCBzaXplKTsKLSAgICBGWF9HZXRDaGFyV2lkdGgoZm9udCwgc3RhcnQsIGVuZCwgd2lkdGhzKTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSArKykKLSAgICAgICAgaWYgKHdpZHRoc1tpXSAhPSAqd2lkdGhzKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGlmIChpID09IHNpemUpIHsKLSAgICAgICAgaW50IGZpcnN0ID0gcFdpZHRoQXJyYXktPkdldEludGVnZXIocFdpZHRoQXJyYXktPkdldENvdW50KCkgLSAxKTsKLSAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoZmlyc3QgKyBzaXplIC0gMSk7Ci0gICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKCp3aWR0aHMpOworICAgIGlmICh1Q29kZSA8IGNoYXJzZXQudUxhbmcpIHsKKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsKICAgICB9IGVsc2UgewotICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheTEgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgcFdpZHRoQXJyYXktPkFkZChwV2lkdGhBcnJheTEpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICAgICAgcFdpZHRoQXJyYXkxLT5BZGRJbnRlZ2VyKHdpZHRoc1tpXSk7Ci0gICAgICAgIH0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwogICAgIH0KLSAgICBGWF9GcmVlKHdpZHRocyk7CisgIH07CisgIHJldHVybiAwOwogfQotQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRNYWNGb250KENURm9udFJlZiBwRm9udCwgRlhfQk9PTCBiVmVydCwgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSkKLXsKLSAgICBDVEZvbnRSZWYgZm9udCA9IChDVEZvbnRSZWYpcEZvbnQ7Ci0gICAgQ1RGb250RGVzY3JpcHRvclJlZiBkZXNjcmlwdG9yID0gQ1RGb250Q29weUZvbnREZXNjcmlwdG9yKGZvbnQpOwotICAgIGlmIChkZXNjcmlwdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitzdGF0aWMgRlhfV09SRCBGWF9HZXRDaGFyc2V0RnJvbUxhbmcoY29uc3QgRlhfQ0hBUiogcExhbmcsIGludDMyX3QgaUxlbmd0aCkgeworICBGWFNZU19hc3NlcnQocExhbmcpOworICBpZiAoaUxlbmd0aCA8IDApIHsKKyAgICBpTGVuZ3RoID0gRlhTWVNfc3RybGVuKHBMYW5nKTsKKyAgfQorICB1aW50MzJfdCB1SGFzaCA9IEZYX0dldExhbmdIYXNoQ29kZShwTGFuZyk7CisgIHJldHVybiBGWF9HZXRDc0Zyb21MYW5nQ29kZSh1SGFzaCk7Cit9CitzdGF0aWMgdm9pZCBfQ0ZTdHJpbmcyQ0ZYQnl0ZVN0cmluZyhDRlN0cmluZ1JlZiBzcmMsIENGWF9CeXRlU3RyaW5nJiBkZXN0KSB7CisgIFNJbnQzMiBsZW4gPSBDRlN0cmluZ0dldExlbmd0aChzcmMpOworICBDRlJhbmdlIHJhbmdlID0gQ0ZSYW5nZU1ha2UoMCwgbGVuKTsKKyAgQ0ZJbmRleCB1c2VkID0gMDsKKyAgVUludDgqIHBCdWZmZXIgPSAoVUludDgqKWNhbGxvYyhsZW4gKyAxLCBzaXplb2YoVUludDgpKTsKKyAgQ0ZTdHJpbmdHZXRCeXRlcyhzcmMsIHJhbmdlLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJLCAwLCBmYWxzZSwgcEJ1ZmZlciwgbGVuLAorICAgICAgICAgICAgICAgICAgICZ1c2VkKTsKKyAgZGVzdCA9IChGWF9DSEFSKilwQnVmZmVyOworICBmcmVlKHBCdWZmZXIpOworfQorRlhfQk9PTCBJc0hhc0NoYXJTZXQoQ0ZBcnJheVJlZiBsYW5ndWFnZXMsIGNvbnN0IENGWF9EV29yZEFycmF5JiBjaGFyU2V0cykgeworICBpbnQgaUNvdW50ID0gY2hhclNldHMuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IENGQXJyYXlHZXRDb3VudChsYW5ndWFnZXMpOyArK2kpIHsKKyAgICBDRlN0cmluZ1JlZiBsYW5ndWFnZSA9IChDRlN0cmluZ1JlZilDRkFycmF5R2V0VmFsdWVBdEluZGV4KGxhbmd1YWdlcywgaSk7CisgICAgRlhfRFdPUkQgQ2hhclNldCA9IEZYX0dldENoYXJzZXRGcm9tTGFuZygKKyAgICAgICAgQ0ZTdHJpbmdHZXRDU3RyaW5nUHRyKGxhbmd1YWdlLCBrQ0ZTdHJpbmdFbmNvZGluZ01hY1JvbWFuKSwgLTEpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgaUNvdW50OyArK2opIHsKKyAgICAgIGlmIChDaGFyU2V0ID09IGNoYXJTZXRzW2pdKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udDsKLSAgICBGWF9CT09MIGJDSksgPSBGQUxTRTsKLSAgICBpbnQgZmxhZ3MgPSAwLCBpdGFsaWNhbmdsZSA9IDAsIGFzY2VuZCA9IDAsIGRlc2NlbmQgPSAwLCBjYXBoZWlnaHQgPSAwLCBiYm94WzRdOwotICAgIEZYU1lTX21lbXNldChiYm94LCAwLCBzaXplb2YoaW50KSAqIDQpOwotICAgIENGQXJyYXlSZWYgbGFuZ3VhZ2VzID0gKENGQXJyYXlSZWYpQ1RGb250RGVzY3JpcHRvckNvcHlBdHRyaWJ1dGUoZGVzY3JpcHRvciwga0NURm9udExhbmd1YWdlc0F0dHJpYnV0ZSk7Ci0gICAgaWYgKGxhbmd1YWdlcyA9PSBOVUxMKSB7Ci0gICAgICAgIENGUmVsZWFzZShkZXNjcmlwdG9yKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQordm9pZCBGWF9HZXRDaGFyV2lkdGgoQ1RGb250UmVmIGZvbnQsIFVuaUNoYXIgc3RhcnQsIFVuaUNoYXIgZW5kLCBpbnQqIHdpZHRoKSB7CisgIENHRmxvYXQgc2l6ZSA9IENURm9udEdldFNpemUoZm9udCk7CisgIGZvciAoOyBzdGFydCA8PSBlbmQ7ICsrc3RhcnQpIHsKKyAgICBDR0dseXBoIHBHbHlwaCA9IDA7CisgICAgQ0ZJbmRleCBjb3VudCA9IDE7CisgICAgQ1RGb250R2V0R2x5cGhzRm9yQ2hhcmFjdGVycyhmb250LCAmc3RhcnQsICZwR2x5cGgsIGNvdW50KTsKKyAgICBDR1NpemUgYWR2YW5jZXM7CisgICAgQ1RGb250R2V0QWR2YW5jZXNGb3JHbHlwaHMoZm9udCwga0NURm9udERlZmF1bHRPcmllbnRhdGlvbiwgJnBHbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWR2YW5jZXMsIDEpOworICAgICp3aWR0aCA9IChpbnQpKGFkdmFuY2VzLndpZHRoIC8gc2l6ZSAqIDEwMDApOworICAgIHdpZHRoKys7CisgIH0KK30KK3N0YXRpYyB2b2lkIF9JbnNlcnRXaWR0aEFycmF5KENURm9udFJlZiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5KSB7CisgIGludCBzaXplID0gZW5kIC0gc3RhcnQgKyAxOworICBpbnQqIHdpZHRocyA9IEZYX0FsbG9jKGludCwgc2l6ZSk7CisgIEZYX0dldENoYXJXaWR0aChmb250LCBzdGFydCwgZW5kLCB3aWR0aHMpOworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8IHNpemU7IGkrKykKKyAgICBpZiAod2lkdGhzW2ldICE9ICp3aWR0aHMpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBDRlhfRFdvcmRBcnJheSBjaGFyU2V0czsKLSAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpOwotICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfR0IyMzEyX0NIQVJTRVQpOwotICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKTsKLSAgICBjaGFyU2V0cy5BZGQoRlhGT05UX1NISUZUSklTX0NIQVJTRVQpOwotICAgIGlmIChJc0hhc0NoYXJTZXQobGFuZ3VhZ2VzLCBjaGFyU2V0cykpIHsKLSAgICAgICAgYkNKSyA9IFRSVUU7CisgIGlmIChpID09IHNpemUpIHsKKyAgICBpbnQgZmlyc3QgPSBwV2lkdGhBcnJheS0+R2V0SW50ZWdlcihwV2lkdGhBcnJheS0+R2V0Q291bnQoKSAtIDEpOworICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKGZpcnN0ICsgc2l6ZSAtIDEpOworICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKCp3aWR0aHMpOworICB9IGVsc2UgeworICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5MSA9IG5ldyBDUERGX0FycmF5OworICAgIHBXaWR0aEFycmF5LT5BZGQocFdpZHRoQXJyYXkxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICBwV2lkdGhBcnJheTEtPkFkZEludGVnZXIod2lkdGhzW2ldKTsKICAgICB9CisgIH0KKyAgRlhfRnJlZSh3aWR0aHMpOworfQorQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRNYWNGb250KENURm9udFJlZiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUpIHsKKyAgQ1RGb250UmVmIGZvbnQgPSAoQ1RGb250UmVmKXBGb250OworICBDVEZvbnREZXNjcmlwdG9yUmVmIGRlc2NyaXB0b3IgPSBDVEZvbnRDb3B5Rm9udERlc2NyaXB0b3IoZm9udCk7CisgIGlmIChkZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udDsKKyAgRlhfQk9PTCBiQ0pLID0gRkFMU0U7CisgIGludCBmbGFncyA9IDAsIGl0YWxpY2FuZ2xlID0gMCwgYXNjZW5kID0gMCwgZGVzY2VuZCA9IDAsIGNhcGhlaWdodCA9IDAsCisgICAgICBiYm94WzRdOworICBGWFNZU19tZW1zZXQoYmJveCwgMCwgc2l6ZW9mKGludCkgKiA0KTsKKyAgQ0ZBcnJheVJlZiBsYW5ndWFnZXMgPSAoQ0ZBcnJheVJlZilDVEZvbnREZXNjcmlwdG9yQ29weUF0dHJpYnV0ZSgKKyAgICAgIGRlc2NyaXB0b3IsIGtDVEZvbnRMYW5ndWFnZXNBdHRyaWJ1dGUpOworICBpZiAobGFuZ3VhZ2VzID09IE5VTEwpIHsKICAgICBDRlJlbGVhc2UoZGVzY3JpcHRvcik7Ci0gICAgQ0ZEaWN0aW9uYXJ5UmVmIHRyYWl0cyA9IChDRkRpY3Rpb25hcnlSZWYpQ1RGb250Q29weVRyYWl0cyhmb250KTsKLSAgICBpZiAodHJhaXRzID09IE5VTEwpIHsKLSAgICAgICAgQ0ZSZWxlYXNlKGxhbmd1YWdlcyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRk51bWJlclJlZiBzeWJvbGljVHJhaXQgPSAoQ0ZOdW1iZXJSZWYpQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUodHJhaXRzLCBrQ1RGb250U3ltYm9saWNUcmFpdCk7Ci0gICAgQ1RGb250U3ltYm9saWNUcmFpdHMgdHJhaXQgPSAwOwotICAgIENGTnVtYmVyR2V0VmFsdWUoc3lib2xpY1RyYWl0LCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmdHJhaXQpOwotICAgIGlmICh0cmFpdCAmIGtDVEZvbnRJdGFsaWNUcmFpdCkgewotICAgICAgICBmbGFncyB8PSBQREZGT05UX0lUQUxJQzsKLSAgICB9Ci0gICAgaWYgKHRyYWl0ICYga0NURm9udE1vbm9TcGFjZVRyYWl0KSB7Ci0gICAgICAgIGZsYWdzIHw9IFBERkZPTlRfRklYRURQSVRDSDsKLSAgICB9Ci0gICAgaWYgKHRyYWl0ICYga0NURm9udE1vZGVyblNlcmlmc0NsYXNzKSB7Ci0gICAgICAgIGZsYWdzIHw9IFBERkZPTlRfU0VSSUY7Ci0gICAgfQotICAgIGlmICh0cmFpdCAmIGtDVEZvbnRTY3JpcHRzQ2xhc3MpIHsKLSAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9TQ1JJUFQ7Ci0gICAgfQotICAgIENGTnVtYmVyUmVmIHdlaWdodFRyYWl0ID0gKENGTnVtYmVyUmVmKUNGRGljdGlvbmFyeUdldFZhbHVlKHRyYWl0cywga0NURm9udFdlaWdodFRyYWl0KTsKLSAgICBGbG9hdDMyIHdlaWdodCA9IDA7Ci0gICAgQ0ZOdW1iZXJHZXRWYWx1ZSh3ZWlnaHRUcmFpdCwga0NGTnVtYmVyRmxvYXQzMlR5cGUsICZ3ZWlnaHQpOwotICAgIGl0YWxpY2FuZ2xlID0gQ1RGb250R2V0U2xhbnRBbmdsZShmb250KTsKLSAgICBhc2NlbmQgICAgICA9IENURm9udEdldEFzY2VudChmb250KTsKLSAgICBkZXNjZW5kICAgICA9IENURm9udEdldERlc2NlbnQoZm9udCk7Ci0gICAgY2FwaGVpZ2h0ICAgPSBDVEZvbnRHZXRDYXBIZWlnaHQoZm9udCk7Ci0gICAgQ0dSZWN0IGJveCAgPSBDVEZvbnRHZXRCb3VuZGluZ0JveChmb250KTsKLSAgICBiYm94WzBdICAgICA9IGJveC5vcmlnaW4ueDsKLSAgICBiYm94WzFdICAgICA9IGJveC5vcmlnaW4ueTsKLSAgICBiYm94WzJdICAgICA9IGJveC5vcmlnaW4ueCArIGJveC5zaXplLndpZHRoOwotICAgIGJib3hbM10gICAgID0gYm94Lm9yaWdpbi55ICsgYm94LnNpemUuaGVpZ2h0OwotICAgIGlmIChiVHJhbnNsYXRlTmFtZSAmJiBiQ0pLKSB7Ci0gICAgICAgIENGU3RyaW5nUmVmIHBvc3ROYW1lID0gQ1RGb250Q29weVBvc3RTY3JpcHROYW1lKGZvbnQpOwotICAgICAgICBfQ0ZTdHJpbmcyQ0ZYQnl0ZVN0cmluZyhwb3N0TmFtZSwgYmFzZWZvbnQpOwotICAgICAgICBDRlJlbGVhc2UocG9zdE5hbWUpOwotICAgIH0KLSAgICBpZiAoYmFzZWZvbnQuSXNFbXB0eSgpKSB7Ci0gICAgICAgIENGU3RyaW5nUmVmIGZ1bGxOYW1lID0gQ1RGb250Q29weUZ1bGxOYW1lKGZvbnQpOwotICAgICAgICBfQ0ZTdHJpbmcyQ0ZYQnl0ZVN0cmluZyhmdWxsTmFtZSwgYmFzZWZvbnQpOwotICAgICAgICBDRlJlbGVhc2UoZnVsbE5hbWUpOwotICAgIH0KLSAgICBiYXNlZm9udC5SZXBsYWNlKCIgIiwgIiIpOwotICAgIENQREZfRGljdGlvbmFyeSogcEJhc2VEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IHBCYXNlRGljdDsKLSAgICBpZiAoIWJDSkspIHsKLSAgICAgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfQU5TSV9DSEFSU0VUKTsKLSAgICAgICAgY2hhclNldHMuQWRkKEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQpOwotICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX1NZTUJPTF9DSEFSU0VUKTsKLSAgICAgICAgaWYgKElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgewotICAgICAgICAgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX1NZTUJPTF9DSEFSU0VUKTsKLSAgICAgICAgICAgIGlmIChJc0hhc0NoYXJTZXQobGFuZ3VhZ2VzLCBjaGFyU2V0cykpIHsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBQREZGT05UX1NZTUJPTElDOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBQREZGT05UX05PTlNZTUJPTElDOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkVuY29kaW5nIiksICJXaW5BbnNpRW5jb2RpbmciKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7Ci0gICAgICAgICAgICBzaXplX3QgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKTsgaSArKykgewotICAgICAgICAgICAgICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgIGNoYXJTZXRzLkFkZChnX0ZYX0NoYXJzZXRVbmljb2Rlc1tpXS5tX0NoYXJzZXQpOwotICAgICAgICAgICAgICAgIGlmIChJc0hhc0NoYXJTZXQobGFuZ3VhZ2VzLCBjaGFyU2V0cykpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKSkgewotICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEVuY29kaW5nID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgICAgICAgICBwRW5jb2RpbmctPlNldEF0TmFtZShGWF9CU1RSQygiQmFzZUVuY29kaW5nIiksICJXaW5BbnNpRW5jb2RpbmciKTsKLSAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgICAgICAgICBwQXJyYXktPkFkZEludGVnZXIoMTI4KTsKLSAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFVuaWNvZGVzID0gZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9wVW5pY29kZXM7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMjg7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IFBERl9BZG9iZU5hbWVGcm9tVW5pY29kZShwVW5pY29kZXNbal0pOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkTmFtZShGWF9CU1RSQygiLm5vdGRlZiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRW5jb2RpbmctPlNldEF0KEZYX0JTVFJDKCJEaWZmZXJlbmNlcyIpLCBwQXJyYXkpOwotICAgICAgICAgICAgICAgIEFkZEluZGlyZWN0T2JqZWN0KHBFbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgcEJhc2VEaWN0LT5TZXRBdFJlZmVyZW5jZShGWF9CU1RSQygiRW5jb2RpbmciKSwgdGhpcywgcEVuY29kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAod2VpZ2h0ID4gMC4wICYmIHRyYWl0ICYga0NURm9udEl0YWxpY1RyYWl0KSB7Ci0gICAgICAgICAgICBiYXNlZm9udCArPSAiLEJvbGRJdGFsaWMiOwotICAgICAgICB9IGVsc2UgaWYgKHdlaWdodCA+IDAuMCkgewotICAgICAgICAgICAgYmFzZWZvbnQgKz0gIixCb2xkIjsKLSAgICAgICAgfSBlbHNlIGlmICh0cmFpdCAmIGtDVEZvbnRJdGFsaWNUcmFpdCkgewotICAgICAgICAgICAgYmFzZWZvbnQgKz0gIixJdGFsaWMiOwotICAgICAgICB9Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIlRydWVUeXBlIik7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJCYXNlRm9udCIsIGJhc2Vmb250KTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE51bWJlcigiRmlyc3RDaGFyIiwgMzIpOwotICAgICAgICBwQmFzZURpY3QtPlNldEF0TnVtYmVyKCJMYXN0Q2hhciIsIDI1NSk7Ci0gICAgICAgIGludCBjaGFyX3dpZHRoc1syMjRdOwotICAgICAgICBGWF9HZXRDaGFyV2lkdGgoZm9udCwgMzIsIDI1NSwgY2hhcl93aWR0aHMpOwotICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhzID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjI0OyBpICsrKSB7Ci0gICAgICAgICAgICBwV2lkdGhzLT5BZGRJbnRlZ2VyKGNoYXJfd2lkdGhzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBwQmFzZURpY3QtPlNldEF0KCJXaWR0aHMiLCBwV2lkdGhzKTsKLSAgICB9ICBlbHNlIHsKLSAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKLSAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gTlVMTDsKLSAgICAgICAgcEZvbnREaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY21hcDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgb3JkZXJpbmc7Ci0gICAgICAgIGludCBzdXBwbGVtZW50OwotICAgICAgICBGWF9CT09MIGJGb3VuZCA9IEZBTFNFOwotICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKLSAgICAgICAgY2hhclNldHMuQWRkKEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUKTsKLSAgICAgICAgaWYgKElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgewotICAgICAgICAgICAgY21hcCA9IGJWZXJ0ID8gIkVUZW5tcy1CNS1WIiA6ICJFVGVubXMtQjUtSCI7Ci0gICAgICAgICAgICBvcmRlcmluZyA9ICJDTlMxIjsKLSAgICAgICAgICAgIHN1cHBsZW1lbnQgPSA0OwotICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMSk7Ci0gICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweDIwLCAweDdlLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICBiRm91bmQgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOwotICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0dCMjMxMl9DSEFSU0VUKTsKLSAgICAgICAgaWYgKCFiRm91bmQgJiYgSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7Ci0gICAgICAgICAgICBjbWFwID0gYlZlcnQgPyAiR0JLLUVVQy1WIiA6ICJHQkstRVVDLUgiOwotICAgICAgICAgICAgb3JkZXJpbmcgPSAiR0IxIiwgc3VwcGxlbWVudCA9IDI7Ci0gICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig3NzE2KTsKLSAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjAsIDB4MjAsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDgxNCk7Ci0gICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweDIxLCAweDdlLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICBiRm91bmQgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOwotICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCk7Ci0gICAgICAgIGlmICghYkZvdW5kICYmIElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgewotICAgICAgICAgICAgY21hcCA9IGJWZXJ0ID8gIktTQ21zLVVIQy1WIiA6ICJLU0Ntcy1VSEMtSCI7Ci0gICAgICAgICAgICBvcmRlcmluZyA9ICJLb3JlYTEiOwotICAgICAgICAgICAgc3VwcGxlbWVudCA9IDI7Ci0gICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKLSAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgIGJGb3VuZCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCk7Ci0gICAgICAgIGlmICghYkZvdW5kICYmIElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgewotICAgICAgICAgICAgY21hcCA9IGJWZXJ0ID8gIjkwbXMtUktTSi1WIiA6ICI5MG1zLVJLU0otSCI7Ci0gICAgICAgICAgICBvcmRlcmluZyA9ICJKYXBhbjEiOwotICAgICAgICAgICAgc3VwcGxlbWVudCA9IDU7Ci0gICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigyMzEpOwotICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHgyMCwgMHg3ZCwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMzI2KTsKLSAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4YTAsIDB4YTAsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDMyNyk7Ci0gICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweGExLCAweGRmLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig2MzEpOwotICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHg3ZSwgMHg3ZSwgcFdpZHRoQXJyYXkpOwotICAgICAgICB9Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIlR5cGUwIik7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJCYXNlRm9udCIsIGJhc2Vmb250KTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkVuY29kaW5nIiwgY21hcCk7Ci0gICAgICAgIHBGb250RGljdC0+U2V0QXQoIlciLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgIHBGb250RGljdC0+U2V0QXROYW1lKCJUeXBlIiwgIkZvbnQiKTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiQ0lERm9udFR5cGUyIik7Ci0gICAgICAgIHBGb250RGljdC0+U2V0QXROYW1lKCJCYXNlRm9udCIsIGJhc2Vmb250KTsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ0lEU3lzSW5mbyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgICAgIHBDSURTeXNJbmZvLT5TZXRBdFN0cmluZygiUmVnaXN0cnkiLCAiQWRvYmUiKTsKLSAgICAgICAgcENJRFN5c0luZm8tPlNldEF0U3RyaW5nKCJPcmRlcmluZyIsIG9yZGVyaW5nKTsKLSAgICAgICAgcENJRFN5c0luZm8tPlNldEF0SW50ZWdlcigiU3VwcGxlbWVudCIsIHN1cHBsZW1lbnQpOwotICAgICAgICBwRm9udERpY3QtPlNldEF0KCJDSURTeXN0ZW1JbmZvIiwgcENJRFN5c0luZm8pOwotICAgICAgICBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdCgiRGVzY2VuZGFudEZvbnRzIiwgcEFycmF5KTsKLSAgICAgICAgQWRkSW5kaXJlY3RPYmplY3QocEZvbnREaWN0KTsKLSAgICAgICAgcEFycmF5LT5BZGRSZWZlcmVuY2UodGhpcywgcEZvbnREaWN0KTsKLSAgICB9Ci0gICAgQWRkSW5kaXJlY3RPYmplY3QocEJhc2VEaWN0KTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGVzYyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udERlc2NyaXB0b3IiKTsKLSAgICBwRm9udERlc2MtPlNldEF0TmFtZSgiRm9udE5hbWUiLCBiYXNlZm9udCk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkZsYWdzIiwgZmxhZ3MpOwotICAgIENQREZfQXJyYXkqIHBCQm94ID0gbmV3IENQREZfQXJyYXk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgIHBCQm94LT5BZGRJbnRlZ2VyKGJib3hbaV0pOwotICAgIH0KLSAgICBwRm9udERlc2MtPlNldEF0KCJGb250QkJveCIsIHBCQm94KTsKLSAgICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiSXRhbGljQW5nbGUiLCBpdGFsaWNhbmdsZSk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkFzY2VudCIsIGFzY2VuZCk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkRlc2NlbnQiLCBkZXNjZW5kKTsKLSAgICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiQ2FwSGVpZ2h0IiwgY2FwaGVpZ2h0KTsKLSAgICBDR0Zsb2F0IGZTdGVtViA9IDA7Ci0gICAgaW50MTZfdCBtaW5fd2lkdGggPSBTSFJUX01BWDsKLSAgICBzdGF0aWMgY29uc3QgVW5pQ2hhciBzdGVtX2NoYXJzW10gPSB7J2knLCAnSScsICchJywgJzEnfTsKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBzaXplb2Yoc3RlbV9jaGFycykgLyBzaXplb2Yoc3RlbV9jaGFyc1swXSk7Ci0gICAgQ0dHbHlwaCBnbHlwaHNbY291bnRdOwotICAgIENHUmVjdCBib3VuZGluZ1JlY3RzW2NvdW50XTsKLSAgICBpZiAoQ1RGb250R2V0R2x5cGhzRm9yQ2hhcmFjdGVycyhmb250LCBzdGVtX2NoYXJzLCBnbHlwaHMsIGNvdW50KSkgewotICAgICAgICBDVEZvbnRHZXRCb3VuZGluZ1JlY3RzRm9yR2x5cGhzKGZvbnQsIGtDVEZvbnRIb3Jpem9udGFsT3JpZW50YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzLCBib3VuZGluZ1JlY3RzLCBjb3VudCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaW50MTZfdCB3aWR0aCA9IGJvdW5kaW5nUmVjdHNbaV0uc2l6ZS53aWR0aDsKLSAgICAgICAgICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPCBtaW5fd2lkdGgpIHsKLSAgICAgICAgICAgICAgICBtaW5fd2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgICAgICBmU3RlbVYgPSBtaW5fd2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIlN0ZW1WIiwgZlN0ZW1WKTsKLSAgICBBZGRJbmRpcmVjdE9iamVjdChwRm9udERlc2MpOwotICAgIHBGb250RGljdC0+U2V0QXRSZWZlcmVuY2UoIkZvbnREZXNjcmlwdG9yIiwgdGhpcywgcEZvbnREZXNjKTsKLSAgICBDRlJlbGVhc2UodHJhaXRzKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfRFdvcmRBcnJheSBjaGFyU2V0czsKKyAgY2hhclNldHMuQWRkKEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUKTsKKyAgY2hhclNldHMuQWRkKEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCk7CisgIGNoYXJTZXRzLkFkZChGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKTsKKyAgY2hhclNldHMuQWRkKEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKKyAgaWYgKElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgeworICAgIGJDSksgPSBUUlVFOworICB9CisgIENGUmVsZWFzZShkZXNjcmlwdG9yKTsKKyAgQ0ZEaWN0aW9uYXJ5UmVmIHRyYWl0cyA9IChDRkRpY3Rpb25hcnlSZWYpQ1RGb250Q29weVRyYWl0cyhmb250KTsKKyAgaWYgKHRyYWl0cyA9PSBOVUxMKSB7CiAgICAgQ0ZSZWxlYXNlKGxhbmd1YWdlcyk7Ci0gICAgcmV0dXJuIExvYWRGb250KHBCYXNlRGljdCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZOdW1iZXJSZWYgc3lib2xpY1RyYWl0ID0KKyAgICAgIChDRk51bWJlclJlZilDRkRpY3Rpb25hcnlHZXRWYWx1ZSh0cmFpdHMsIGtDVEZvbnRTeW1ib2xpY1RyYWl0KTsKKyAgQ1RGb250U3ltYm9saWNUcmFpdHMgdHJhaXQgPSAwOworICBDRk51bWJlckdldFZhbHVlKHN5Ym9saWNUcmFpdCwga0NGTnVtYmVyU0ludDMyVHlwZSwgJnRyYWl0KTsKKyAgaWYgKHRyYWl0ICYga0NURm9udEl0YWxpY1RyYWl0KSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9JVEFMSUM7CisgIH0KKyAgaWYgKHRyYWl0ICYga0NURm9udE1vbm9TcGFjZVRyYWl0KSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9GSVhFRFBJVENIOworICB9CisgIGlmICh0cmFpdCAmIGtDVEZvbnRNb2Rlcm5TZXJpZnNDbGFzcykgeworICAgIGZsYWdzIHw9IFBERkZPTlRfU0VSSUY7CisgIH0KKyAgaWYgKHRyYWl0ICYga0NURm9udFNjcmlwdHNDbGFzcykgeworICAgIGZsYWdzIHw9IFBERkZPTlRfU0NSSVBUOworICB9CisgIENGTnVtYmVyUmVmIHdlaWdodFRyYWl0ID0KKyAgICAgIChDRk51bWJlclJlZilDRkRpY3Rpb25hcnlHZXRWYWx1ZSh0cmFpdHMsIGtDVEZvbnRXZWlnaHRUcmFpdCk7CisgIEZsb2F0MzIgd2VpZ2h0ID0gMDsKKyAgQ0ZOdW1iZXJHZXRWYWx1ZSh3ZWlnaHRUcmFpdCwga0NGTnVtYmVyRmxvYXQzMlR5cGUsICZ3ZWlnaHQpOworICBpdGFsaWNhbmdsZSA9IENURm9udEdldFNsYW50QW5nbGUoZm9udCk7CisgIGFzY2VuZCA9IENURm9udEdldEFzY2VudChmb250KTsKKyAgZGVzY2VuZCA9IENURm9udEdldERlc2NlbnQoZm9udCk7CisgIGNhcGhlaWdodCA9IENURm9udEdldENhcEhlaWdodChmb250KTsKKyAgQ0dSZWN0IGJveCA9IENURm9udEdldEJvdW5kaW5nQm94KGZvbnQpOworICBiYm94WzBdID0gYm94Lm9yaWdpbi54OworICBiYm94WzFdID0gYm94Lm9yaWdpbi55OworICBiYm94WzJdID0gYm94Lm9yaWdpbi54ICsgYm94LnNpemUud2lkdGg7CisgIGJib3hbM10gPSBib3gub3JpZ2luLnkgKyBib3guc2l6ZS5oZWlnaHQ7CisgIGlmIChiVHJhbnNsYXRlTmFtZSAmJiBiQ0pLKSB7CisgICAgQ0ZTdHJpbmdSZWYgcG9zdE5hbWUgPSBDVEZvbnRDb3B5UG9zdFNjcmlwdE5hbWUoZm9udCk7CisgICAgX0NGU3RyaW5nMkNGWEJ5dGVTdHJpbmcocG9zdE5hbWUsIGJhc2Vmb250KTsKKyAgICBDRlJlbGVhc2UocG9zdE5hbWUpOworICB9CisgIGlmIChiYXNlZm9udC5Jc0VtcHR5KCkpIHsKKyAgICBDRlN0cmluZ1JlZiBmdWxsTmFtZSA9IENURm9udENvcHlGdWxsTmFtZShmb250KTsKKyAgICBfQ0ZTdHJpbmcyQ0ZYQnl0ZVN0cmluZyhmdWxsTmFtZSwgYmFzZWZvbnQpOworICAgIENGUmVsZWFzZShmdWxsTmFtZSk7CisgIH0KKyAgYmFzZWZvbnQuUmVwbGFjZSgiICIsICIiKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQmFzZURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IHBCYXNlRGljdDsKKyAgaWYgKCFiQ0pLKSB7CisgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7CisgICAgY2hhclNldHMuQWRkKEZYRk9OVF9BTlNJX0NIQVJTRVQpOworICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfREVGQVVMVF9DSEFSU0VUKTsKKyAgICBjaGFyU2V0cy5BZGQoRlhGT05UX1NZTUJPTF9DSEFSU0VUKTsKKyAgICBpZiAoSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7CisgICAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKKyAgICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfU1lNQk9MX0NIQVJTRVQpOworICAgICAgaWYgKElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgeworICAgICAgICBmbGFncyB8PSBQREZGT05UX1NZTUJPTElDOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKKyAgICAgIH0KKyAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJFbmNvZGluZyIpLCAiV2luQW5zaUVuY29kaW5nIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7CisgICAgICBzaXplX3QgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKTsKKyAgICAgICAgICAgaSsrKSB7CisgICAgICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOworICAgICAgICBjaGFyU2V0cy5BZGQoZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9DaGFyc2V0KTsKKyAgICAgICAgaWYgKElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaSA8IHNpemVvZiBnX0ZYX0NoYXJzZXRVbmljb2RlcyAvIHNpemVvZihGWF9DaGFyc2V0VW5pY29kZXMpKSB7CisgICAgICAgIENQREZfRGljdGlvbmFyeSogcEVuY29kaW5nID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICAgICAgcEVuY29kaW5nLT5TZXRBdE5hbWUoRlhfQlNUUkMoIkJhc2VFbmNvZGluZyIpLCAiV2luQW5zaUVuY29kaW5nIik7CisgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OworICAgICAgICBwQXJyYXktPkFkZEludGVnZXIoMTI4KTsKKyAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBVbmljb2RlcyA9IGdfRlhfQ2hhcnNldFVuaWNvZGVzW2ldLm1fcFVuaWNvZGVzOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEyODsgaisrKSB7CisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IFBERl9BZG9iZU5hbWVGcm9tVW5pY29kZShwVW5pY29kZXNbal0pOworICAgICAgICAgIGlmIChuYW1lLklzRW1wdHkoKSkgeworICAgICAgICAgICAgcEFycmF5LT5BZGROYW1lKEZYX0JTVFJDKCIubm90ZGVmIikpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQXJyYXktPkFkZE5hbWUobmFtZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBFbmNvZGluZy0+U2V0QXQoRlhfQlNUUkMoIkRpZmZlcmVuY2VzIiksIHBBcnJheSk7CisgICAgICAgIEFkZEluZGlyZWN0T2JqZWN0KHBFbmNvZGluZyk7CisgICAgICAgIHBCYXNlRGljdC0+U2V0QXRSZWZlcmVuY2UoRlhfQlNUUkMoIkVuY29kaW5nIiksIHRoaXMsIHBFbmNvZGluZyk7CisgICAgICB9CisgICAgfQorICAgIGlmICh3ZWlnaHQgPiAwLjAgJiYgdHJhaXQgJiBrQ1RGb250SXRhbGljVHJhaXQpIHsKKyAgICAgIGJhc2Vmb250ICs9ICIsQm9sZEl0YWxpYyI7CisgICAgfSBlbHNlIGlmICh3ZWlnaHQgPiAwLjApIHsKKyAgICAgIGJhc2Vmb250ICs9ICIsQm9sZCI7CisgICAgfSBlbHNlIGlmICh0cmFpdCAmIGtDVEZvbnRJdGFsaWNUcmFpdCkgeworICAgICAgYmFzZWZvbnQgKz0gIixJdGFsaWMiOworICAgIH0KKyAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJUcnVlVHlwZSIpOworICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJCYXNlRm9udCIsIGJhc2Vmb250KTsKKyAgICBwQmFzZURpY3QtPlNldEF0TnVtYmVyKCJGaXJzdENoYXIiLCAzMik7CisgICAgcEJhc2VEaWN0LT5TZXRBdE51bWJlcigiTGFzdENoYXIiLCAyNTUpOworICAgIGludCBjaGFyX3dpZHRoc1syMjRdOworICAgIEZYX0dldENoYXJXaWR0aChmb250LCAzMiwgMjU1LCBjaGFyX3dpZHRocyk7CisgICAgQ1BERl9BcnJheSogcFdpZHRocyA9IG5ldyBDUERGX0FycmF5OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjI0OyBpKyspIHsKKyAgICAgIHBXaWR0aHMtPkFkZEludGVnZXIoY2hhcl93aWR0aHNbaV0pOworICAgIH0KKyAgICBwQmFzZURpY3QtPlNldEF0KCJXaWR0aHMiLCBwV2lkdGhzKTsKKyAgfSBlbHNlIHsKKyAgICBmbGFncyB8PSBQREZGT05UX05PTlNZTUJPTElDOworICAgIENQREZfQXJyYXkqIHBBcnJheSA9IE5VTEw7CisgICAgcEZvbnREaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBDRlhfQnl0ZVN0cmluZyBjbWFwOworICAgIENGWF9CeXRlU3RyaW5nIG9yZGVyaW5nOworICAgIGludCBzdXBwbGVtZW50OworICAgIEZYX0JPT0wgYkZvdW5kID0gRkFMU0U7CisgICAgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKKyAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpOworICAgIGlmIChJc0hhc0NoYXJTZXQobGFuZ3VhZ2VzLCBjaGFyU2V0cykpIHsKKyAgICAgIGNtYXAgPSBiVmVydCA/ICJFVGVubXMtQjUtViIgOiAiRVRlbm1zLUI1LUgiOworICAgICAgb3JkZXJpbmcgPSAiQ05TMSI7CisgICAgICBzdXBwbGVtZW50ID0gNDsKKyAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDEpOworICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHgyMCwgMHg3ZSwgcFdpZHRoQXJyYXkpOworICAgICAgYkZvdW5kID0gVFJVRTsKKyAgICB9CisgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7CisgICAgY2hhclNldHMuQWRkKEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCk7CisgICAgaWYgKCFiRm91bmQgJiYgSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7CisgICAgICBjbWFwID0gYlZlcnQgPyAiR0JLLUVVQy1WIiA6ICJHQkstRVVDLUgiOworICAgICAgb3JkZXJpbmcgPSAiR0IxIiwgc3VwcGxlbWVudCA9IDI7CisgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig3NzE2KTsKKyAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjAsIDB4MjAsIHBXaWR0aEFycmF5KTsKKyAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDgxNCk7CisgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweDIxLCAweDdlLCBwV2lkdGhBcnJheSk7CisgICAgICBiRm91bmQgPSBUUlVFOworICAgIH0KKyAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKKyAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCk7CisgICAgaWYgKCFiRm91bmQgJiYgSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7CisgICAgICBjbWFwID0gYlZlcnQgPyAiS1NDbXMtVUhDLVYiIDogIktTQ21zLVVIQy1IIjsKKyAgICAgIG9yZGVyaW5nID0gIktvcmVhMSI7CisgICAgICBzdXBwbGVtZW50ID0gMjsKKyAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDEpOworICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHgyMCwgMHg3ZSwgcFdpZHRoQXJyYXkpOworICAgICAgYkZvdW5kID0gVFJVRTsKKyAgICB9CisgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7CisgICAgY2hhclNldHMuQWRkKEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKKyAgICBpZiAoIWJGb3VuZCAmJiBJc0hhc0NoYXJTZXQobGFuZ3VhZ2VzLCBjaGFyU2V0cykpIHsKKyAgICAgIGNtYXAgPSBiVmVydCA/ICI5MG1zLVJLU0otViIgOiAiOTBtcy1SS1NKLUgiOworICAgICAgb3JkZXJpbmcgPSAiSmFwYW4xIjsKKyAgICAgIHN1cHBsZW1lbnQgPSA1OworICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMjMxKTsKKyAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjAsIDB4N2QsIHBXaWR0aEFycmF5KTsKKyAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDMyNik7CisgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweGEwLCAweGEwLCBwV2lkdGhBcnJheSk7CisgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigzMjcpOworICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHhhMSwgMHhkZiwgcFdpZHRoQXJyYXkpOworICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoNjMxKTsKKyAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4N2UsIDB4N2UsIHBXaWR0aEFycmF5KTsKKyAgICB9CisgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiVHlwZTAiKTsKKyAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiQmFzZUZvbnQiLCBiYXNlZm9udCk7CisgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkVuY29kaW5nIiwgY21hcCk7CisgICAgcEZvbnREaWN0LT5TZXRBdCgiVyIsIHBXaWR0aEFycmF5KTsKKyAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJGb250Iik7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiQ0lERm9udFR5cGUyIik7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOworICAgIENQREZfRGljdGlvbmFyeSogcENJRFN5c0luZm8gPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgIHBDSURTeXNJbmZvLT5TZXRBdFN0cmluZygiUmVnaXN0cnkiLCAiQWRvYmUiKTsKKyAgICBwQ0lEU3lzSW5mby0+U2V0QXRTdHJpbmcoIk9yZGVyaW5nIiwgb3JkZXJpbmcpOworICAgIHBDSURTeXNJbmZvLT5TZXRBdEludGVnZXIoIlN1cHBsZW1lbnQiLCBzdXBwbGVtZW50KTsKKyAgICBwRm9udERpY3QtPlNldEF0KCJDSURTeXN0ZW1JbmZvIiwgcENJRFN5c0luZm8pOworICAgIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OworICAgIHBCYXNlRGljdC0+U2V0QXQoIkRlc2NlbmRhbnRGb250cyIsIHBBcnJheSk7CisgICAgQWRkSW5kaXJlY3RPYmplY3QocEZvbnREaWN0KTsKKyAgICBwQXJyYXktPkFkZFJlZmVyZW5jZSh0aGlzLCBwRm9udERpY3QpOworICB9CisgIEFkZEluZGlyZWN0T2JqZWN0KHBCYXNlRGljdCk7CisgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcEZvbnREZXNjLT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udERlc2NyaXB0b3IiKTsKKyAgcEZvbnREZXNjLT5TZXRBdE5hbWUoIkZvbnROYW1lIiwgYmFzZWZvbnQpOworICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiRmxhZ3MiLCBmbGFncyk7CisgIENQREZfQXJyYXkqIHBCQm94ID0gbmV3IENQREZfQXJyYXk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgcEJCb3gtPkFkZEludGVnZXIoYmJveFtpXSk7CisgIH0KKyAgcEZvbnREZXNjLT5TZXRBdCgiRm9udEJCb3giLCBwQkJveCk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJJdGFsaWNBbmdsZSIsIGl0YWxpY2FuZ2xlKTsKKyAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkFzY2VudCIsIGFzY2VuZCk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJEZXNjZW50IiwgZGVzY2VuZCk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJDYXBIZWlnaHQiLCBjYXBoZWlnaHQpOworICBDR0Zsb2F0IGZTdGVtViA9IDA7CisgIGludDE2X3QgbWluX3dpZHRoID0gU0hSVF9NQVg7CisgIHN0YXRpYyBjb25zdCBVbmlDaGFyIHN0ZW1fY2hhcnNbXSA9IHsnaScsICdJJywgJyEnLCAnMSd9OworICBjb25zdCBzaXplX3QgY291bnQgPSBzaXplb2Yoc3RlbV9jaGFycykgLyBzaXplb2Yoc3RlbV9jaGFyc1swXSk7CisgIENHR2x5cGggZ2x5cGhzW2NvdW50XTsKKyAgQ0dSZWN0IGJvdW5kaW5nUmVjdHNbY291bnRdOworICBpZiAoQ1RGb250R2V0R2x5cGhzRm9yQ2hhcmFjdGVycyhmb250LCBzdGVtX2NoYXJzLCBnbHlwaHMsIGNvdW50KSkgeworICAgIENURm9udEdldEJvdW5kaW5nUmVjdHNGb3JHbHlwaHMoZm9udCwga0NURm9udEhvcml6b250YWxPcmllbnRhdGlvbiwgZ2x5cGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRpbmdSZWN0cywgY291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgaW50MTZfdCB3aWR0aCA9IGJvdW5kaW5nUmVjdHNbaV0uc2l6ZS53aWR0aDsKKyAgICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPCBtaW5fd2lkdGgpIHsKKyAgICAgICAgbWluX3dpZHRoID0gd2lkdGg7CisgICAgICAgIGZTdGVtViA9IG1pbl93aWR0aDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIlN0ZW1WIiwgZlN0ZW1WKTsKKyAgQWRkSW5kaXJlY3RPYmplY3QocEZvbnREZXNjKTsKKyAgcEZvbnREaWN0LT5TZXRBdFJlZmVyZW5jZSgiRm9udERlc2NyaXB0b3IiLCB0aGlzLCBwRm9udERlc2MpOworICBDRlJlbGVhc2UodHJhaXRzKTsKKyAgQ0ZSZWxlYXNlKGxhbmd1YWdlcyk7CisgIHJldHVybiBMb2FkRm9udChwQmFzZURpY3QpOwogfQogI2VuZGlmCi1zdGF0aWMgdm9pZCBfSW5zZXJ0V2lkdGhBcnJheTEoQ0ZYX0ZvbnQqIHBGb250LCBJRlhfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcsIEZYX1dDSEFSIHN0YXJ0LCBGWF9XQ0hBUiBlbmQsIENQREZfQXJyYXkqIHBXaWR0aEFycmF5KQotewotICAgIGludCBzaXplID0gZW5kIC0gc3RhcnQgKyAxOwotICAgIGludCogd2lkdGhzID0gRlhfQWxsb2MoaW50LCBzaXplKTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICBpbnQgZ2x5cGhfaW5kZXggPSBwRW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHN0YXJ0ICsgaSk7Ci0gICAgICAgIHdpZHRoc1tpXSA9IHBGb250LT5HZXRHbHlwaFdpZHRoKGdseXBoX2luZGV4KTsKK3N0YXRpYyB2b2lkIF9JbnNlcnRXaWR0aEFycmF5MShDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSkgeworICBpbnQgc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKKyAgaW50KiB3aWR0aHMgPSBGWF9BbGxvYyhpbnQsIHNpemUpOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGludCBnbHlwaF9pbmRleCA9IHBFbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUoc3RhcnQgKyBpKTsKKyAgICB3aWR0aHNbaV0gPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaF9pbmRleCk7CisgIH0KKyAgZm9yIChpID0gMTsgaSA8IHNpemU7IGkrKykKKyAgICBpZiAod2lkdGhzW2ldICE9ICp3aWR0aHMpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSArKykKLSAgICAgICAgaWYgKHdpZHRoc1tpXSAhPSAqd2lkdGhzKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGlmIChpID09IHNpemUpIHsKLSAgICAgICAgaW50IGZpcnN0ID0gcFdpZHRoQXJyYXktPkdldEludGVnZXIocFdpZHRoQXJyYXktPkdldENvdW50KCkgLSAxKTsKLSAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoZmlyc3QgKyBzaXplIC0gMSk7Ci0gICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKCp3aWR0aHMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5MSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICBwV2lkdGhBcnJheS0+QWRkKHBXaWR0aEFycmF5MSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgICAgICBwV2lkdGhBcnJheTEtPkFkZEludGVnZXIod2lkdGhzW2ldKTsKLSAgICAgICAgfQorICBpZiAoaSA9PSBzaXplKSB7CisgICAgaW50IGZpcnN0ID0gcFdpZHRoQXJyYXktPkdldEludGVnZXIocFdpZHRoQXJyYXktPkdldENvdW50KCkgLSAxKTsKKyAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcihmaXJzdCArIHNpemUgLSAxKTsKKyAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigqd2lkdGhzKTsKKyAgfSBlbHNlIHsKKyAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheTEgPSBuZXcgQ1BERl9BcnJheTsKKyAgICBwV2lkdGhBcnJheS0+QWRkKHBXaWR0aEFycmF5MSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcFdpZHRoQXJyYXkxLT5BZGRJbnRlZ2VyKHdpZHRoc1tpXSk7CiAgICAgfQotICAgIEZYX0ZyZWUod2lkdGhzKTsKKyAgfQorICBGWF9GcmVlKHdpZHRocyk7CiB9Ci1DUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZEZvbnQoQ0ZYX0ZvbnQqIHBGb250LCBpbnQgY2hhcnNldCwgRlhfQk9PTCBiVmVydCkKLXsKLSAgICBpZiAocEZvbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKK0NQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkRm9udChDRlhfRm9udCogcEZvbnQsIGludCBjaGFyc2V0LCBGWF9CT09MIGJWZXJ0KSB7CisgIGlmIChwRm9udCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfQk9PTCBiQ0pLID0gY2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCB8fAorICAgICAgICAgICAgICAgICBjaGFyc2V0ID09IEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCB8fAorICAgICAgICAgICAgICAgICBjaGFyc2V0ID09IEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQgfHwKKyAgICAgICAgICAgICAgICAgY2hhcnNldCA9PSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDsKKyAgQ0ZYX0J5dGVTdHJpbmcgYmFzZWZvbnQgPSBwRm9udC0+R2V0RmFtaWx5TmFtZSgpOworICBiYXNlZm9udC5SZXBsYWNlKCIgIiwgIiIpOworICBpbnQgZmxhZ3MgPSAwOworICBpZiAocEZvbnQtPklzQm9sZCgpKSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9GT1JDRUJPTEQ7CisgIH0KKyAgaWYgKHBGb250LT5Jc0l0YWxpYygpKSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9JVEFMSUM7CisgIH0KKyAgaWYgKHBGb250LT5Jc0ZpeGVkV2lkdGgoKSkgeworICAgIGZsYWdzIHw9IFBERkZPTlRfRklYRURQSVRDSDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBCYXNlRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJUeXBlIiwgIkZvbnQiKTsKKyAgSUZYX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nID0gRlhHRV9DcmVhdGVVbmljb2RlRW5jb2RpbmcocEZvbnQpOworICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IHBCYXNlRGljdDsKKyAgaWYgKCFiQ0pLKSB7CisgICAgQ1BERl9BcnJheSogcFdpZHRocyA9IG5ldyBDUERGX0FycmF5OworICAgIGludCBjaGFyY29kZTsKKyAgICBmb3IgKGNoYXJjb2RlID0gMzI7IGNoYXJjb2RlIDwgMTI4OyBjaGFyY29kZSsrKSB7CisgICAgICBpbnQgZ2x5cGhfaW5kZXggPSBwRW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgIGludCBjaGFyX3dpZHRoID0gcEZvbnQtPkdldEdseXBoV2lkdGgoZ2x5cGhfaW5kZXgpOworICAgICAgcFdpZHRocy0+QWRkSW50ZWdlcihjaGFyX3dpZHRoKTsKICAgICB9Ci0gICAgRlhfQk9PTCBiQ0pLID0gY2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCB8fCBjaGFyc2V0ID09IEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCB8fAotICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPT0gRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCB8fCBjaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUOwotICAgIENGWF9CeXRlU3RyaW5nIGJhc2Vmb250ID0gcEZvbnQtPkdldEZhbWlseU5hbWUoKTsKLSAgICBiYXNlZm9udC5SZXBsYWNlKCIgIiwgIiIpOwotICAgIGludCBmbGFncyA9IDA7Ci0gICAgaWYgKHBGb250LT5Jc0JvbGQoKSkgewotICAgICAgICBmbGFncyB8PSBQREZGT05UX0ZPUkNFQk9MRDsKLSAgICB9Ci0gICAgaWYgKHBGb250LT5Jc0l0YWxpYygpKSB7Ci0gICAgICAgIGZsYWdzIHw9IFBERkZPTlRfSVRBTElDOwotICAgIH0KLSAgICBpZiAocEZvbnQtPklzRml4ZWRXaWR0aCgpKSB7Ci0gICAgICAgIGZsYWdzIHw9IFBERkZPTlRfRklYRURQSVRDSDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQmFzZURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJUeXBlIiwgIkZvbnQiKTsKLSAgICBJRlhfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcgPSBGWEdFX0NyZWF0ZVVuaWNvZGVFbmNvZGluZyhwRm9udCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBwQmFzZURpY3Q7Ci0gICAgaWYgKCFiQ0pLKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBXaWR0aHMgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgaW50IGNoYXJjb2RlOwotICAgICAgICBmb3IgKGNoYXJjb2RlID0gMzI7IGNoYXJjb2RlIDwgMTI4OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgaW50IGdseXBoX2luZGV4ID0gcEVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgICAgICAgICBpbnQgY2hhcl93aWR0aCA9IHBGb250LT5HZXRHbHlwaFdpZHRoKGdseXBoX2luZGV4KTsKLSAgICAgICAgICAgIHBXaWR0aHMtPkFkZEludGVnZXIoY2hhcl93aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCB8fCBjaGFyc2V0ID09IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQgfHwKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID09IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVCkgewotICAgICAgICAgICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX1NZTUJPTF9DSEFSU0VUKSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9TWU1CT0xJQzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJFbmNvZGluZyIpLCAiV2luQW5zaUVuY29kaW5nIik7Ci0gICAgICAgICAgICBmb3IgKGNoYXJjb2RlID0gMTI4OyBjaGFyY29kZSA8PSAyNTU7IGNoYXJjb2RlICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGdseXBoX2luZGV4ID0gcEVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgICAgICAgICAgICAgaW50IGNoYXJfd2lkdGggPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaF9pbmRleCk7Ci0gICAgICAgICAgICAgICAgcFdpZHRocy0+QWRkSW50ZWdlcihjaGFyX3dpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7Ci0gICAgICAgICAgICBzaXplX3QgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKTsgaSArKykKLSAgICAgICAgICAgICAgICBpZiAoZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9DaGFyc2V0ID09IGNoYXJzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKSkgewotICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEVuY29kaW5nRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgICAgICAgICAgICAgcEVuY29kaW5nRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJCYXNlRW5jb2RpbmciKSwgIldpbkFuc2lFbmNvZGluZyIpOwotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkSW50ZWdlcigxMjgpOwotICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVW5pY29kZXMgPSBnX0ZYX0NoYXJzZXRVbmljb2Rlc1tpXS5tX3BVbmljb2RlczsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEyODsgaiArKykgewotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKHBVbmljb2Rlc1tqXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGROYW1lKEZYX0JTVFJDKCIubm90ZGVmIikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGROYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCBnbHlwaF9pbmRleCA9IHBFbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUocFVuaWNvZGVzW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJfd2lkdGggPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaF9pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHBXaWR0aHMtPkFkZEludGVnZXIoY2hhcl93aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBFbmNvZGluZ0RpY3QtPlNldEF0KEZYX0JTVFJDKCJEaWZmZXJlbmNlcyIpLCBwQXJyYXkpOwotICAgICAgICAgICAgICAgIEFkZEluZGlyZWN0T2JqZWN0KHBFbmNvZGluZ0RpY3QpOwotICAgICAgICAgICAgICAgIHBCYXNlRGljdC0+U2V0QXRSZWZlcmVuY2UoRlhfQlNUUkMoIkVuY29kaW5nIiksIHRoaXMsIHBFbmNvZGluZ0RpY3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwRm9udC0+SXNCb2xkKCkgJiYgcEZvbnQtPklzSXRhbGljKCkpIHsKLSAgICAgICAgICAgIGJhc2Vmb250ICs9ICIsQm9sZEl0YWxpYyI7Ci0gICAgICAgIH0gZWxzZSBpZiAocEZvbnQtPklzQm9sZCgpKSB7Ci0gICAgICAgICAgICBiYXNlZm9udCArPSAiLEJvbGQiOwotICAgICAgICB9IGVsc2UgaWYgKHBGb250LT5Jc0l0YWxpYygpKSB7Ci0gICAgICAgICAgICBiYXNlZm9udCArPSAiLEl0YWxpYyI7Ci0gICAgICAgIH0KLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiVHJ1ZVR5cGUiKTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOwotICAgICAgICBwQmFzZURpY3QtPlNldEF0TnVtYmVyKCJGaXJzdENoYXIiLCAzMik7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROdW1iZXIoIkxhc3RDaGFyIiwgMjU1KTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdCgiV2lkdGhzIiwgcFdpZHRocyk7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCB8fAorICAgICAgICBjaGFyc2V0ID09IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVCkgeworICAgICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX1NZTUJPTF9DSEFSU0VUKSB7CisgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfU1lNQk9MSUM7CisgICAgICB9IGVsc2UgewogICAgICAgICBmbGFncyB8PSBQREZGT05UX05PTlNZTUJPTElDOwotICAgICAgICBwRm9udERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjbWFwOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBvcmRlcmluZzsKLSAgICAgICAgaW50IHN1cHBsZW1lbnQ7Ci0gICAgICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgIHN3aXRjaCAoY2hhcnNldCkgewotICAgICAgICAgICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKLSAgICAgICAgICAgICAgICBjbWFwID0gYlZlcnQgPyAiRVRlbm1zLUI1LVYiIDogIkVUZW5tcy1CNS1IIjsKLSAgICAgICAgICAgICAgICBvcmRlcmluZyA9ICJDTlMxIjsKLSAgICAgICAgICAgICAgICBzdXBwbGVtZW50ID0gNDsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZywgMHgyMCwgMHg3ZSwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQ6Ci0gICAgICAgICAgICAgICAgY21hcCA9IGJWZXJ0ID8gIkdCSy1FVUMtViIgOiAiR0JLLUVVQy1IIjsKLSAgICAgICAgICAgICAgICBvcmRlcmluZyA9ICJHQjEiLCBzdXBwbGVtZW50ID0gMjsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig3NzE2KTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZywgMHgyMCwgMHgyMCwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDgxNCk7Ci0gICAgICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcsIDB4MjEsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVDoKLSAgICAgICAgICAgICAgICBjbWFwID0gYlZlcnQgPyAiS1NDbXMtVUhDLVYiIDogIktTQ21zLVVIQy1IIjsKLSAgICAgICAgICAgICAgICBvcmRlcmluZyA9ICJLb3JlYTEiOwotICAgICAgICAgICAgICAgIHN1cHBsZW1lbnQgPSAyOwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDEpOwotICAgICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5MShwRm9udCwgcEVuY29kaW5nLCAweDIwLCAweDdlLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYRk9OVF9TSElGVEpJU19DSEFSU0VUOgotICAgICAgICAgICAgICAgIGNtYXAgPSBiVmVydCA/ICI5MG1zLVJLU0otViIgOiAiOTBtcy1SS1NKLUgiOwotICAgICAgICAgICAgICAgIG9yZGVyaW5nID0gIkphcGFuMSI7Ci0gICAgICAgICAgICAgICAgc3VwcGxlbWVudCA9IDU7Ci0gICAgICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMjMxKTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZywgMHgyMCwgMHg3ZCwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDMyNik7Ci0gICAgICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcsIDB4YTAsIDB4YTAsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigzMjcpOwotICAgICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5MShwRm9udCwgcEVuY29kaW5nLCAweGExLCAweGRmLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoNjMxKTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZywgMHg3ZSwgMHg3ZSwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkVuY29kaW5nIiksICJXaW5BbnNpRW5jb2RpbmciKTsKKyAgICAgIGZvciAoY2hhcmNvZGUgPSAxMjg7IGNoYXJjb2RlIDw9IDI1NTsgY2hhcmNvZGUrKykgeworICAgICAgICBpbnQgZ2x5cGhfaW5kZXggPSBwRW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgICAgaW50IGNoYXJfd2lkdGggPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaF9pbmRleCk7CisgICAgICAgIHBXaWR0aHMtPkFkZEludGVnZXIoY2hhcl93aWR0aCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7CisgICAgICBzaXplX3QgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKTsKKyAgICAgICAgICAgaSsrKQorICAgICAgICBpZiAoZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9DaGFyc2V0ID09IGNoYXJzZXQpIHsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJUeXBlMCIpOwotICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiQmFzZUZvbnQiLCBiYXNlZm9udCk7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJFbmNvZGluZyIsIGNtYXApOwotICAgICAgICBwRm9udERpY3QtPlNldEF0KCJXIiwgcFdpZHRoQXJyYXkpOwotICAgICAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJGb250Iik7Ci0gICAgICAgIHBGb250RGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIkNJREZvbnRUeXBlMiIpOwotICAgICAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiQmFzZUZvbnQiLCBiYXNlZm9udCk7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcENJRFN5c0luZm8gPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICBwQ0lEU3lzSW5mby0+U2V0QXRTdHJpbmcoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7Ci0gICAgICAgIHBDSURTeXNJbmZvLT5TZXRBdFN0cmluZygiT3JkZXJpbmciLCBvcmRlcmluZyk7Ci0gICAgICAgIHBDSURTeXNJbmZvLT5TZXRBdEludGVnZXIoIlN1cHBsZW1lbnQiLCBzdXBwbGVtZW50KTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdCgiQ0lEU3lzdGVtSW5mbyIsIHBDSURTeXNJbmZvKTsKKyAgICAgIGlmIChpIDwgc2l6ZW9mIGdfRlhfQ2hhcnNldFVuaWNvZGVzIC8gc2l6ZW9mKEZYX0NoYXJzZXRVbmljb2RlcykpIHsKKyAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jb2RpbmdEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICAgICAgcEVuY29kaW5nRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJCYXNlRW5jb2RpbmciKSwgIldpbkFuc2lFbmNvZGluZyIpOwogICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdCgiRGVzY2VuZGFudEZvbnRzIiwgcEFycmF5KTsKLSAgICAgICAgQWRkSW5kaXJlY3RPYmplY3QocEZvbnREaWN0KTsKLSAgICAgICAgcEFycmF5LT5BZGRSZWZlcmVuY2UodGhpcywgcEZvbnREaWN0KTsKLSAgICB9Ci0gICAgQWRkSW5kaXJlY3RPYmplY3QocEJhc2VEaWN0KTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGVzYyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udERlc2NyaXB0b3IiKTsKLSAgICBwRm9udERlc2MtPlNldEF0TmFtZSgiRm9udE5hbWUiLCBiYXNlZm9udCk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkZsYWdzIiwgZmxhZ3MpOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJJdGFsaWNBbmdsZSIsIHBGb250LT5tX3BTdWJzdEZvbnQgPyBwRm9udC0+bV9wU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlIDogMCk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkFzY2VudCIsIHBGb250LT5HZXRBc2NlbnQoKSk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkRlc2NlbnQiLCBwRm9udC0+R2V0RGVzY2VudCgpKTsKLSAgICBGWF9SRUNUIGJib3g7Ci0gICAgcEZvbnQtPkdldEJCb3goYmJveCk7Ci0gICAgQ1BERl9BcnJheSogcEJCb3ggPSBuZXcgQ1BERl9BcnJheTsKLSAgICBwQkJveC0+QWRkSW50ZWdlcihiYm94LmxlZnQpOwotICAgIHBCQm94LT5BZGRJbnRlZ2VyKGJib3guYm90dG9tKTsKLSAgICBwQkJveC0+QWRkSW50ZWdlcihiYm94LnJpZ2h0KTsKLSAgICBwQkJveC0+QWRkSW50ZWdlcihiYm94LnRvcCk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdCgiRm9udEJCb3giLCBwQkJveCk7Ci0gICAgaW50MzJfdCBuU3RlbVYgPSAwOwotICAgIGlmIChwRm9udC0+bV9wU3Vic3RGb250KSB7Ci0gICAgICAgIG5TdGVtViA9IHBGb250LT5tX3BTdWJzdEZvbnQtPm1fV2VpZ2h0IC8gNTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0aWMgY29uc3QgRlhfQ0hBUiBzdGVtX2NoYXJzW10gPSB7J2knLCAnSScsICchJywgJzEnfTsKLSAgICAgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHN0ZW1fY2hhcnMpIC8gc2l6ZW9mKHN0ZW1fY2hhcnNbMF0pOwotICAgICAgICBGWF9EV09SRCBnbHlwaCA9IHBFbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUoc3RlbV9jaGFyc1swXSk7Ci0gICAgICAgIG5TdGVtViA9IHBGb250LT5HZXRHbHlwaFdpZHRoKGdseXBoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBnbHlwaCA9IHBFbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUoc3RlbV9jaGFyc1tpXSk7Ci0gICAgICAgICAgICBpbnQgd2lkdGggPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaCk7Ci0gICAgICAgICAgICBpZiAod2lkdGggPiAwICYmIHdpZHRoIDwgblN0ZW1WKSB7Ci0gICAgICAgICAgICAgICAgblN0ZW1WID0gd2lkdGg7Ci0gICAgICAgICAgICB9CisgICAgICAgIHBBcnJheS0+QWRkSW50ZWdlcigxMjgpOworICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFVuaWNvZGVzID0gZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9wVW5pY29kZXM7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTI4OyBqKyspIHsKKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKHBVbmljb2Rlc1tqXSk7CisgICAgICAgICAgaWYgKG5hbWUuSXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwQXJyYXktPkFkZE5hbWUoRlhfQlNUUkMoIi5ub3RkZWYiKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBBcnJheS0+QWRkTmFtZShuYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaW50IGdseXBoX2luZGV4ID0gcEVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShwVW5pY29kZXNbal0pOworICAgICAgICAgIGludCBjaGFyX3dpZHRoID0gcEZvbnQtPkdldEdseXBoV2lkdGgoZ2x5cGhfaW5kZXgpOworICAgICAgICAgIHBXaWR0aHMtPkFkZEludGVnZXIoY2hhcl93aWR0aCk7CiAgICAgICAgIH0KKyAgICAgICAgcEVuY29kaW5nRGljdC0+U2V0QXQoRlhfQlNUUkMoIkRpZmZlcmVuY2VzIiksIHBBcnJheSk7CisgICAgICAgIEFkZEluZGlyZWN0T2JqZWN0KHBFbmNvZGluZ0RpY3QpOworICAgICAgICBwQmFzZURpY3QtPlNldEF0UmVmZXJlbmNlKEZYX0JTVFJDKCJFbmNvZGluZyIpLCB0aGlzLCBwRW5jb2RpbmdEaWN0KTsKKyAgICAgIH0KICAgICB9Ci0gICAgZGVsZXRlIHBFbmNvZGluZzsKLSAgICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiU3RlbVYiLCBuU3RlbVYpOwotICAgIEFkZEluZGlyZWN0T2JqZWN0KHBGb250RGVzYyk7Ci0gICAgcEZvbnREaWN0LT5TZXRBdFJlZmVyZW5jZSgiRm9udERlc2NyaXB0b3IiLCB0aGlzLCBwRm9udERlc2MpOwotICAgIHJldHVybiBMb2FkRm9udChwQmFzZURpY3QpOworICAgIGlmIChwRm9udC0+SXNCb2xkKCkgJiYgcEZvbnQtPklzSXRhbGljKCkpIHsKKyAgICAgIGJhc2Vmb250ICs9ICIsQm9sZEl0YWxpYyI7CisgICAgfSBlbHNlIGlmIChwRm9udC0+SXNCb2xkKCkpIHsKKyAgICAgIGJhc2Vmb250ICs9ICIsQm9sZCI7CisgICAgfSBlbHNlIGlmIChwRm9udC0+SXNJdGFsaWMoKSkgeworICAgICAgYmFzZWZvbnQgKz0gIixJdGFsaWMiOworICAgIH0KKyAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJUcnVlVHlwZSIpOworICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJCYXNlRm9udCIsIGJhc2Vmb250KTsKKyAgICBwQmFzZURpY3QtPlNldEF0TnVtYmVyKCJGaXJzdENoYXIiLCAzMik7CisgICAgcEJhc2VEaWN0LT5TZXRBdE51bWJlcigiTGFzdENoYXIiLCAyNTUpOworICAgIHBCYXNlRGljdC0+U2V0QXQoIldpZHRocyIsIHBXaWR0aHMpOworICB9IGVsc2UgeworICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7CisgICAgcEZvbnREaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBDRlhfQnl0ZVN0cmluZyBjbWFwOworICAgIENGWF9CeXRlU3RyaW5nIG9yZGVyaW5nOworICAgIGludCBzdXBwbGVtZW50OworICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgICAgc3dpdGNoIChjaGFyc2V0KSB7CisgICAgICBjYXNlIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUOgorICAgICAgICBjbWFwID0gYlZlcnQgPyAiRVRlbm1zLUI1LVYiIDogIkVUZW5tcy1CNS1IIjsKKyAgICAgICAgb3JkZXJpbmcgPSAiQ05TMSI7CisgICAgICAgIHN1cHBsZW1lbnQgPSA0OworICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKKyAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDoKKyAgICAgICAgY21hcCA9IGJWZXJ0ID8gIkdCSy1FVUMtViIgOiAiR0JLLUVVQy1IIjsKKyAgICAgICAgb3JkZXJpbmcgPSAiR0IxIiwgc3VwcGxlbWVudCA9IDI7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDc3MTYpOworICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZywgMHgyMCwgMHgyMCwgcFdpZHRoQXJyYXkpOworICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig4MTQpOworICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZywgMHgyMSwgMHg3ZSwgcFdpZHRoQXJyYXkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVDoKKyAgICAgICAgY21hcCA9IGJWZXJ0ID8gIktTQ21zLVVIQy1WIiA6ICJLU0Ntcy1VSEMtSCI7CisgICAgICAgIG9yZGVyaW5nID0gIktvcmVhMSI7CisgICAgICAgIHN1cHBsZW1lbnQgPSAyOworICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKKyAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYRk9OVF9TSElGVEpJU19DSEFSU0VUOgorICAgICAgICBjbWFwID0gYlZlcnQgPyAiOTBtcy1SS1NKLVYiIDogIjkwbXMtUktTSi1IIjsKKyAgICAgICAgb3JkZXJpbmcgPSAiSmFwYW4xIjsKKyAgICAgICAgc3VwcGxlbWVudCA9IDU7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDIzMSk7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5MShwRm9udCwgcEVuY29kaW5nLCAweDIwLCAweDdkLCBwV2lkdGhBcnJheSk7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDMyNik7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5MShwRm9udCwgcEVuY29kaW5nLCAweGEwLCAweGEwLCBwV2lkdGhBcnJheSk7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDMyNyk7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5MShwRm9udCwgcEVuY29kaW5nLCAweGExLCAweGRmLCBwV2lkdGhBcnJheSk7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDYzMSk7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5MShwRm9udCwgcEVuY29kaW5nLCAweDdlLCAweDdlLCBwV2lkdGhBcnJheSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJUeXBlMCIpOworICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJCYXNlRm9udCIsIGJhc2Vmb250KTsKKyAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiRW5jb2RpbmciLCBjbWFwKTsKKyAgICBwRm9udERpY3QtPlNldEF0KCJXIiwgcFdpZHRoQXJyYXkpOworICAgIHBGb250RGljdC0+U2V0QXROYW1lKCJUeXBlIiwgIkZvbnQiKTsKKyAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJDSURGb250VHlwZTIiKTsKKyAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiQmFzZUZvbnQiLCBiYXNlZm9udCk7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ0lEU3lzSW5mbyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgcENJRFN5c0luZm8tPlNldEF0U3RyaW5nKCJSZWdpc3RyeSIsICJBZG9iZSIpOworICAgIHBDSURTeXNJbmZvLT5TZXRBdFN0cmluZygiT3JkZXJpbmciLCBvcmRlcmluZyk7CisgICAgcENJRFN5c0luZm8tPlNldEF0SW50ZWdlcigiU3VwcGxlbWVudCIsIHN1cHBsZW1lbnQpOworICAgIHBGb250RGljdC0+U2V0QXQoIkNJRFN5c3RlbUluZm8iLCBwQ0lEU3lzSW5mbyk7CisgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgICAgcEJhc2VEaWN0LT5TZXRBdCgiRGVzY2VuZGFudEZvbnRzIiwgcEFycmF5KTsKKyAgICBBZGRJbmRpcmVjdE9iamVjdChwRm9udERpY3QpOworICAgIHBBcnJheS0+QWRkUmVmZXJlbmNlKHRoaXMsIHBGb250RGljdCk7CisgIH0KKyAgQWRkSW5kaXJlY3RPYmplY3QocEJhc2VEaWN0KTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICBwRm9udERlc2MtPlNldEF0TmFtZSgiVHlwZSIsICJGb250RGVzY3JpcHRvciIpOworICBwRm9udERlc2MtPlNldEF0TmFtZSgiRm9udE5hbWUiLCBiYXNlZm9udCk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJGbGFncyIsIGZsYWdzKTsKKyAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoCisgICAgICAiSXRhbGljQW5nbGUiLAorICAgICAgcEZvbnQtPm1fcFN1YnN0Rm9udCA/IHBGb250LT5tX3BTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGUgOiAwKTsKKyAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkFzY2VudCIsIHBGb250LT5HZXRBc2NlbnQoKSk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJEZXNjZW50IiwgcEZvbnQtPkdldERlc2NlbnQoKSk7CisgIEZYX1JFQ1QgYmJveDsKKyAgcEZvbnQtPkdldEJCb3goYmJveCk7CisgIENQREZfQXJyYXkqIHBCQm94ID0gbmV3IENQREZfQXJyYXk7CisgIHBCQm94LT5BZGRJbnRlZ2VyKGJib3gubGVmdCk7CisgIHBCQm94LT5BZGRJbnRlZ2VyKGJib3guYm90dG9tKTsKKyAgcEJCb3gtPkFkZEludGVnZXIoYmJveC5yaWdodCk7CisgIHBCQm94LT5BZGRJbnRlZ2VyKGJib3gudG9wKTsKKyAgcEZvbnREZXNjLT5TZXRBdCgiRm9udEJCb3giLCBwQkJveCk7CisgIGludDMyX3QgblN0ZW1WID0gMDsKKyAgaWYgKHBGb250LT5tX3BTdWJzdEZvbnQpIHsKKyAgICBuU3RlbVYgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX1dlaWdodCAvIDU7CisgIH0gZWxzZSB7CisgICAgc3RhdGljIGNvbnN0IEZYX0NIQVIgc3RlbV9jaGFyc1tdID0geydpJywgJ0knLCAnIScsICcxJ307CisgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHN0ZW1fY2hhcnMpIC8gc2l6ZW9mKHN0ZW1fY2hhcnNbMF0pOworICAgIEZYX0RXT1JEIGdseXBoID0gcEVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShzdGVtX2NoYXJzWzBdKTsKKyAgICBuU3RlbVYgPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaCk7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBnbHlwaCA9IHBFbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUoc3RlbV9jaGFyc1tpXSk7CisgICAgICBpbnQgd2lkdGggPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaCk7CisgICAgICBpZiAod2lkdGggPiAwICYmIHdpZHRoIDwgblN0ZW1WKSB7CisgICAgICAgIG5TdGVtViA9IHdpZHRoOworICAgICAgfQorICAgIH0KKyAgfQorICBkZWxldGUgcEVuY29kaW5nOworICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiU3RlbVYiLCBuU3RlbVYpOworICBBZGRJbmRpcmVjdE9iamVjdChwRm9udERlc2MpOworICBwRm9udERpY3QtPlNldEF0UmVmZXJlbmNlKCJGb250RGVzY3JpcHRvciIsIHRoaXMsIHBGb250RGVzYyk7CisgIHJldHVybiBMb2FkRm9udChwQmFzZURpY3QpOwogfQotc3RhdGljIGludCBJbnNlcnREZWxldGVQREZQYWdlKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGFnZXNUb0dvLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLCBGWF9CT09MIGJJbnNlcnQsIENGWF9QdHJBcnJheSYgc3RhY2tMaXN0KQotewotICAgIENQREZfQXJyYXkqIHBLaWRMaXN0ID0gcFBhZ2VzLT5HZXRBcnJheSgiS2lkcyIpOwotICAgIGlmICghcEtpZExpc3QpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgbktpZHMgPSBwS2lkTGlzdC0+R2V0Q291bnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5LaWRzOyBpICsrKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEtpZCA9IHBLaWRMaXN0LT5HZXREaWN0KGkpOwotICAgICAgICBpZiAocEtpZC0+R2V0U3RyaW5nKCJUeXBlIikgPT0gRlhfQlNUUkMoIlBhZ2UiKSkgewotICAgICAgICAgICAgaWYgKG5QYWdlc1RvR28gPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChiSW5zZXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBLaWRMaXN0LT5JbnNlcnRBdChpLCBDUERGX1JlZmVyZW5jZTo6Q3JlYXRlKHBEb2MsIHBQYWdlLT5HZXRPYmpOdW0oKSkpOwotICAgICAgICAgICAgICAgICAgICBwUGFnZS0+U2V0QXRSZWZlcmVuY2UoIlBhcmVudCIsIHBEb2MsIHBQYWdlcy0+R2V0T2JqTnVtKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBLaWRMaXN0LT5SZW1vdmVBdChpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFBhZ2VzLT5TZXRBdEludGVnZXIoIkNvdW50IiwgcFBhZ2VzLT5HZXRJbnRlZ2VyKCJDb3VudCIpICsgKGJJbnNlcnQgPyAxIDogLTEpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5QYWdlc1RvR28gLS07CitzdGF0aWMgaW50IEluc2VydERlbGV0ZVBERlBhZ2UoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBhZ2VzVG9HbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluc2VydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkmIHN0YWNrTGlzdCkgeworICBDUERGX0FycmF5KiBwS2lkTGlzdCA9IHBQYWdlcy0+R2V0QXJyYXkoIktpZHMiKTsKKyAgaWYgKCFwS2lkTGlzdCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpbnQgbktpZHMgPSBwS2lkTGlzdC0+R2V0Q291bnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuS2lkczsgaSsrKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZExpc3QtPkdldERpY3QoaSk7CisgICAgaWYgKHBLaWQtPkdldFN0cmluZygiVHlwZSIpID09IEZYX0JTVFJDKCJQYWdlIikpIHsKKyAgICAgIGlmIChuUGFnZXNUb0dvID09IDApIHsKKyAgICAgICAgaWYgKGJJbnNlcnQpIHsKKyAgICAgICAgICBwS2lkTGlzdC0+SW5zZXJ0QXQoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2U6OkNyZWF0ZShwRG9jLCBwUGFnZS0+R2V0T2JqTnVtKCkpKTsKKyAgICAgICAgICBwUGFnZS0+U2V0QXRSZWZlcmVuY2UoIlBhcmVudCIsIHBEb2MsIHBQYWdlcy0+R2V0T2JqTnVtKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IG5QYWdlcyA9IHBLaWQtPkdldEludGVnZXIoIkNvdW50Iik7Ci0gICAgICAgICAgICBpZiAoblBhZ2VzVG9HbyA8IG5QYWdlcykgewotICAgICAgICAgICAgICAgIGludCBzdGFja0NvdW50ID0gc3RhY2tMaXN0LkdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN0YWNrQ291bnQ7ICsraikgewotICAgICAgICAgICAgICAgICAgICBpZiAocEtpZCA9PSBzdGFja0xpc3Rbal0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGFja0xpc3QuQWRkKHBLaWQpOwotICAgICAgICAgICAgICAgIGlmIChJbnNlcnREZWxldGVQREZQYWdlKHBEb2MsIHBLaWQsIG5QYWdlc1RvR28sIHBQYWdlLCBiSW5zZXJ0LCBzdGFja0xpc3QpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YWNrTGlzdC5SZW1vdmVBdChzdGFja0NvdW50KTsKLSAgICAgICAgICAgICAgICBwUGFnZXMtPlNldEF0SW50ZWdlcigiQ291bnQiLCBwUGFnZXMtPkdldEludGVnZXIoIkNvdW50IikgKyAoYkluc2VydCA/IDEgOiAtMSkpOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgblBhZ2VzVG9HbyAtPSBuUGFnZXM7CisgICAgICAgICAgcEtpZExpc3QtPlJlbW92ZUF0KGkpOwogICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotc3RhdGljIGludCBJbnNlcnROZXdQYWdlKENQREZfRG9jdW1lbnQqIHBEb2MsIGludCBpUGFnZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIENGWF9EV29yZEFycmF5ICZwYWdlTGlzdCkKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOwotICAgIGlmICghcFJvb3QpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlcyA9IHBSb290LT5HZXREaWN0KEZYX0JTVFJDKCJQYWdlcyIpKTsKLSAgICBpZiAoIXBQYWdlcykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBuUGFnZXMgPSBwRG9jLT5HZXRQYWdlQ291bnQoKTsKLSAgICBpZiAoaVBhZ2UgPCAwIHx8IGlQYWdlID4gblBhZ2VzKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKGlQYWdlID09IG5QYWdlcykgewotICAgICAgICBDUERGX0FycmF5KiBwUGFnZXNMaXN0ID0gcFBhZ2VzLT5HZXRBcnJheShGWF9CU1RSQygiS2lkcyIpKTsKLSAgICAgICAgaWYgKCFwUGFnZXNMaXN0KSB7Ci0gICAgICAgICAgICBwUGFnZXNMaXN0ID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgICAgICBwUGFnZXMtPlNldEF0KEZYX0JTVFJDKCJLaWRzIiksIHBQYWdlc0xpc3QpOwotICAgICAgICB9Ci0gICAgICAgIHBQYWdlc0xpc3QtPkFkZChwUGFnZURpY3QsIHBEb2MpOwotICAgICAgICBwUGFnZXMtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiQ291bnQiKSwgblBhZ2VzICsgMSk7Ci0gICAgICAgIHBQYWdlRGljdC0+U2V0QXRSZWZlcmVuY2UoRlhfQlNUUkMoIlBhcmVudCIpLCBwRG9jLCBwUGFnZXMtPkdldE9iak51bSgpKTsKKyAgICAgICAgcFBhZ2VzLT5TZXRBdEludGVnZXIoIkNvdW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhZ2VzLT5HZXRJbnRlZ2VyKCJDb3VudCIpICsgKGJJbnNlcnQgPyAxIDogLTEpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBuUGFnZXNUb0dvLS07CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IHN0YWNrOwotICAgICAgICBzdGFjay5BZGQocFBhZ2VzKTsKLSAgICAgICAgaWYgKEluc2VydERlbGV0ZVBERlBhZ2UocERvYywgcFBhZ2VzLCBpUGFnZSwgcFBhZ2VEaWN0LCBUUlVFLCBzdGFjaykgPCAwKSB7CisgICAgICBpbnQgblBhZ2VzID0gcEtpZC0+R2V0SW50ZWdlcigiQ291bnQiKTsKKyAgICAgIGlmIChuUGFnZXNUb0dvIDwgblBhZ2VzKSB7CisgICAgICAgIGludCBzdGFja0NvdW50ID0gc3RhY2tMaXN0LkdldFNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdGFja0NvdW50OyArK2opIHsKKyAgICAgICAgICBpZiAocEtpZCA9PSBzdGFja0xpc3Rbal0pIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgc3RhY2tMaXN0LkFkZChwS2lkKTsKKyAgICAgICAgaWYgKEluc2VydERlbGV0ZVBERlBhZ2UocERvYywgcEtpZCwgblBhZ2VzVG9HbywgcFBhZ2UsIGJJbnNlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTGlzdCkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN0YWNrTGlzdC5SZW1vdmVBdChzdGFja0NvdW50KTsKKyAgICAgICAgcFBhZ2VzLT5TZXRBdEludGVnZXIoIkNvdW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhZ2VzLT5HZXRJbnRlZ2VyKCJDb3VudCIpICsgKGJJbnNlcnQgPyAxIDogLTEpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBuUGFnZXNUb0dvIC09IG5QYWdlczsKICAgICB9Ci0gICAgcGFnZUxpc3QuSW5zZXJ0QXQoaVBhZ2UsIHBQYWdlRGljdC0+R2V0T2JqTnVtKCkpOwotICAgIHJldHVybiBpUGFnZTsKKyAgfQorICByZXR1cm4gMDsKIH0KLUNQREZfRGljdGlvbmFyeSogQ1BERl9Eb2N1bWVudDo6Q3JlYXRlTmV3UGFnZShpbnQgaVBhZ2UpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgcERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJQYWdlIik7Ci0gICAgRlhfRFdPUkQgZHdPYmpOdW0gPSBBZGRJbmRpcmVjdE9iamVjdChwRGljdCk7Ci0gICAgaWYgKEluc2VydE5ld1BhZ2UodGhpcywgaVBhZ2UsIHBEaWN0LCBtX1BhZ2VMaXN0KSA8IDApIHsKLSAgICAgICAgUmVsZWFzZUluZGlyZWN0T2JqZWN0KGR3T2JqTnVtKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitzdGF0aWMgaW50IEluc2VydE5ld1BhZ2UoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RXb3JkQXJyYXkmIHBhZ2VMaXN0KSB7CisgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CisgIGlmICghcFJvb3QpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMgPSBwUm9vdC0+R2V0RGljdChGWF9CU1RSQygiUGFnZXMiKSk7CisgIGlmICghcFBhZ2VzKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBuUGFnZXMgPSBwRG9jLT5HZXRQYWdlQ291bnQoKTsKKyAgaWYgKGlQYWdlIDwgMCB8fCBpUGFnZSA+IG5QYWdlcykgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoaVBhZ2UgPT0gblBhZ2VzKSB7CisgICAgQ1BERl9BcnJheSogcFBhZ2VzTGlzdCA9IHBQYWdlcy0+R2V0QXJyYXkoRlhfQlNUUkMoIktpZHMiKSk7CisgICAgaWYgKCFwUGFnZXNMaXN0KSB7CisgICAgICBwUGFnZXNMaXN0ID0gbmV3IENQREZfQXJyYXk7CisgICAgICBwUGFnZXMtPlNldEF0KEZYX0JTVFJDKCJLaWRzIiksIHBQYWdlc0xpc3QpOwogICAgIH0KLSAgICByZXR1cm4gcERpY3Q7Ci19Ci1pbnQgX1BERl9HZXRTdGFuZGFyZEZvbnROYW1lKENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKLUNQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkU3RhbmRhcmRGb250KGNvbnN0IEZYX0NIQVIqIGZvbnQsIENQREZfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZShmb250LCAtMSk7Ci0gICAgaWYgKF9QREZfR2V0U3RhbmRhcmRGb250TmFtZShuYW1lKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBHZXRQYWdlRGF0YSgpLT5HZXRTdGFuZGFyZEZvbnQobmFtZSwgcEVuY29kaW5nKTsKLX0KLXZvaWQgQ1BERl9Eb2N1bWVudDo6RGVsZXRlUGFnZShpbnQgaVBhZ2UpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IEdldFJvb3QoKTsKLSAgICBpZiAocFJvb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gcFJvb3QtPkdldERpY3QoIlBhZ2VzIik7Ci0gICAgaWYgKHBQYWdlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IG5QYWdlcyA9IHBQYWdlcy0+R2V0SW50ZWdlcigiQ291bnQiKTsKLSAgICBpZiAoaVBhZ2UgPCAwIHx8IGlQYWdlID49IG5QYWdlcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIHBQYWdlc0xpc3QtPkFkZChwUGFnZURpY3QsIHBEb2MpOworICAgIHBQYWdlcy0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJDb3VudCIpLCBuUGFnZXMgKyAxKTsKKyAgICBwUGFnZURpY3QtPlNldEF0UmVmZXJlbmNlKEZYX0JTVFJDKCJQYXJlbnQiKSwgcERvYywgcFBhZ2VzLT5HZXRPYmpOdW0oKSk7CisgIH0gZWxzZSB7CiAgICAgQ0ZYX1B0ckFycmF5IHN0YWNrOwogICAgIHN0YWNrLkFkZChwUGFnZXMpOwotICAgIGlmIChJbnNlcnREZWxldGVQREZQYWdlKHRoaXMsIHBQYWdlcywgaVBhZ2UsIE5VTEwsIEZBTFNFLCBzdGFjaykgPCAwKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoSW5zZXJ0RGVsZXRlUERGUGFnZShwRG9jLCBwUGFnZXMsIGlQYWdlLCBwUGFnZURpY3QsIFRSVUUsIHN0YWNrKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgbV9QYWdlTGlzdC5SZW1vdmVBdChpUGFnZSk7CisgIH0KKyAgcGFnZUxpc3QuSW5zZXJ0QXQoaVBhZ2UsIHBQYWdlRGljdC0+R2V0T2JqTnVtKCkpOworICByZXR1cm4gaVBhZ2U7CiB9Ci1DUERGX09iamVjdCogRlBERkFQSV9HZXRQYWdlQXR0cihDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKTsKLXZvaWQgRlBERkFQSV9GbGF0UGFnZUF0dHIoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkKLXsKLSAgICBpZiAocFBhZ2VEaWN0LT5LZXlFeGlzdChuYW1lKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERkFQSV9HZXRQYWdlQXR0cihwUGFnZURpY3QsIG5hbWUpOwotICAgIGlmIChwT2JqKSB7Ci0gICAgICAgIHBQYWdlRGljdC0+U2V0QXQobmFtZSwgcE9iai0+Q2xvbmUoKSk7Ci0gICAgfQorQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0RvY3VtZW50OjpDcmVhdGVOZXdQYWdlKGludCBpUGFnZSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJQYWdlIik7CisgIEZYX0RXT1JEIGR3T2JqTnVtID0gQWRkSW5kaXJlY3RPYmplY3QocERpY3QpOworICBpZiAoSW5zZXJ0TmV3UGFnZSh0aGlzLCBpUGFnZSwgcERpY3QsIG1fUGFnZUxpc3QpIDwgMCkgeworICAgIFJlbGVhc2VJbmRpcmVjdE9iamVjdChkd09iak51bSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHBEaWN0OworfQoraW50IF9QREZfR2V0U3RhbmRhcmRGb250TmFtZShDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CitDUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZFN0YW5kYXJkRm9udChjb25zdCBGWF9DSEFSKiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250RW5jb2RpbmcqIHBFbmNvZGluZykgeworICBDRlhfQnl0ZVN0cmluZyBuYW1lKGZvbnQsIC0xKTsKKyAgaWYgKF9QREZfR2V0U3RhbmRhcmRGb250TmFtZShuYW1lKSA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gR2V0UGFnZURhdGEoKS0+R2V0U3RhbmRhcmRGb250KG5hbWUsIHBFbmNvZGluZyk7Cit9Cit2b2lkIENQREZfRG9jdW1lbnQ6OkRlbGV0ZVBhZ2UoaW50IGlQYWdlKSB7CisgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBHZXRSb290KCk7CisgIGlmIChwUm9vdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gcFJvb3QtPkdldERpY3QoIlBhZ2VzIik7CisgIGlmIChwUGFnZXMgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgblBhZ2VzID0gcFBhZ2VzLT5HZXRJbnRlZ2VyKCJDb3VudCIpOworICBpZiAoaVBhZ2UgPCAwIHx8IGlQYWdlID49IG5QYWdlcykgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfUHRyQXJyYXkgc3RhY2s7CisgIHN0YWNrLkFkZChwUGFnZXMpOworICBpZiAoSW5zZXJ0RGVsZXRlUERGUGFnZSh0aGlzLCBwUGFnZXMsIGlQYWdlLCBOVUxMLCBGQUxTRSwgc3RhY2spIDwgMCkgeworICAgIHJldHVybjsKKyAgfQorICBtX1BhZ2VMaXN0LlJlbW92ZUF0KGlQYWdlKTsKK30KK0NQREZfT2JqZWN0KiBGUERGQVBJX0dldFBhZ2VBdHRyKENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKTsKK3ZvaWQgRlBERkFQSV9GbGF0UGFnZUF0dHIoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgeworICBpZiAocFBhZ2VEaWN0LT5LZXlFeGlzdChuYW1lKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX09iamVjdCogcE9iaiA9IEZQREZBUElfR2V0UGFnZUF0dHIocFBhZ2VEaWN0LCBuYW1lKTsKKyAgaWYgKHBPYmopIHsKKyAgICBwUGFnZURpY3QtPlNldEF0KG5hbWUsIHBPYmotPkNsb25lKCkpOworICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfaW1hZ2UuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2ltYWdlLmNwcAppbmRleCBkYWQ3MzI2Li45ZWE5NGJkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfaW1hZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9pbWFnZS5jcHAKQEAgLTEwLDM2MCArMTAsMzgwIEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgiCiAjaW5jbHVkZSAiLi4vZnBkZl9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICIuLi9mcGRmX3JlbmRlci9yZW5kZXJfaW50LmgiCi1DUERGX0RpY3Rpb25hcnkqIENQREZfSW1hZ2U6OkluaXRKUEVHKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKQotewotICAgIGludDMyX3Qgd2lkdGg7Ci0gICAgaW50MzJfdCBoZWlnaHQ7Ci0gICAgaW50MzJfdCBudW1fY29tcHM7Ci0gICAgaW50MzJfdCBiaXRzOwotICAgIEZYX0JPT0wgY29sb3JfdHJhbnM7Ci0gICAgaWYgKCFDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Ci0gICAgICAgICAgICBMb2FkSW5mbyhwRGF0YSwgc2l6ZSwgd2lkdGgsIGhlaWdodCwgbnVtX2NvbXBzLCBiaXRzLCBjb2xvcl90cmFucykpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitDUERGX0RpY3Rpb25hcnkqIENQREZfSW1hZ2U6OkluaXRKUEVHKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKSB7CisgIGludDMyX3Qgd2lkdGg7CisgIGludDMyX3QgaGVpZ2h0OworICBpbnQzMl90IG51bV9jb21wczsKKyAgaW50MzJfdCBiaXRzOworICBGWF9CT09MIGNvbG9yX3RyYW5zOworICBpZiAoIUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5Mb2FkSW5mbygKKyAgICAgICAgICBwRGF0YSwgc2l6ZSwgd2lkdGgsIGhlaWdodCwgbnVtX2NvbXBzLCBiaXRzLCBjb2xvcl90cmFucykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJYT2JqZWN0Iik7CisgIHBEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiSW1hZ2UiKTsKKyAgcERpY3QtPlNldEF0SW50ZWdlcigiV2lkdGgiLCB3aWR0aCk7CisgIHBEaWN0LT5TZXRBdEludGVnZXIoIkhlaWdodCIsIGhlaWdodCk7CisgIGNvbnN0IEZYX0NIQVIqIGNzbmFtZSA9IE5VTEw7CisgIGlmIChudW1fY29tcHMgPT0gMSkgeworICAgIGNzbmFtZSA9ICJEZXZpY2VHcmF5IjsKKyAgfSBlbHNlIGlmIChudW1fY29tcHMgPT0gMykgeworICAgIGNzbmFtZSA9ICJEZXZpY2VSR0IiOworICB9IGVsc2UgaWYgKG51bV9jb21wcyA9PSA0KSB7CisgICAgY3NuYW1lID0gIkRldmljZUNNWUsiOworICAgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKKyAgICBmb3IgKGludCBuID0gMDsgbiA8IDQ7IG4rKykgeworICAgICAgcERlY29kZS0+QWRkSW50ZWdlcigxKTsKKyAgICAgIHBEZWNvZGUtPkFkZEludGVnZXIoMCk7CiAgICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIHBEaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiWE9iamVjdCIpOwotICAgIHBEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiSW1hZ2UiKTsKLSAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKCJXaWR0aCIsIHdpZHRoKTsKLSAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKCJIZWlnaHQiLCBoZWlnaHQpOwotICAgIGNvbnN0IEZYX0NIQVIqIGNzbmFtZSA9IE5VTEw7Ci0gICAgaWYgKG51bV9jb21wcyA9PSAxKSB7Ci0gICAgICAgIGNzbmFtZSA9ICJEZXZpY2VHcmF5IjsKLSAgICB9IGVsc2UgaWYgKG51bV9jb21wcyA9PSAzKSB7Ci0gICAgICAgIGNzbmFtZSA9ICJEZXZpY2VSR0IiOwotICAgIH0gZWxzZSBpZiAobnVtX2NvbXBzID09IDQpIHsKLSAgICAgICAgY3NuYW1lID0gIkRldmljZUNNWUsiOwotICAgICAgICBDUERGX0FycmF5KiBwRGVjb2RlID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7Ci0gICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgNDsgbiArKykgewotICAgICAgICAgICAgcERlY29kZS0+QWRkSW50ZWdlcigxKTsKLSAgICAgICAgICAgIHBEZWNvZGUtPkFkZEludGVnZXIoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJEZWNvZGUiKSwgcERlY29kZSk7Ci0gICAgfQotICAgIHBEaWN0LT5TZXRBdE5hbWUoIkNvbG9yU3BhY2UiLCBjc25hbWUpOwotICAgIHBEaWN0LT5TZXRBdEludGVnZXIoIkJpdHNQZXJDb21wb25lbnQiLCBiaXRzKTsKLSAgICBwRGljdC0+U2V0QXROYW1lKCJGaWx0ZXIiLCAiRENURGVjb2RlIik7Ci0gICAgaWYgKCFjb2xvcl90cmFucykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJtcyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgICAgIHBEaWN0LT5TZXRBdCgiRGVjb2RlUGFybXMiLCBwUGFybXMpOwotICAgICAgICBwUGFybXMtPlNldEF0SW50ZWdlcigiQ29sb3JUcmFuc2Zvcm0iLCAwKTsKLSAgICB9Ci0gICAgbV9iSXNNYXNrID0gRkFMU0U7Ci0gICAgbV9XaWR0aCA9IHdpZHRoOwotICAgIG1fSGVpZ2h0ID0gaGVpZ2h0OwotICAgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgewotICAgICAgICBtX3BTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBwRGljdDsKKyAgICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkRlY29kZSIpLCBwRGVjb2RlKTsKKyAgfQorICBwRGljdC0+U2V0QXROYW1lKCJDb2xvclNwYWNlIiwgY3NuYW1lKTsKKyAgcERpY3QtPlNldEF0SW50ZWdlcigiQml0c1BlckNvbXBvbmVudCIsIGJpdHMpOworICBwRGljdC0+U2V0QXROYW1lKCJGaWx0ZXIiLCAiRENURGVjb2RlIik7CisgIGlmICghY29sb3JfdHJhbnMpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJtcyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgcERpY3QtPlNldEF0KCJEZWNvZGVQYXJtcyIsIHBQYXJtcyk7CisgICAgcFBhcm1zLT5TZXRBdEludGVnZXIoIkNvbG9yVHJhbnNmb3JtIiwgMCk7CisgIH0KKyAgbV9iSXNNYXNrID0gRkFMU0U7CisgIG1fV2lkdGggPSB3aWR0aDsKKyAgbV9IZWlnaHQgPSBoZWlnaHQ7CisgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgeworICAgIG1fcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKKyAgfQorICByZXR1cm4gcERpY3Q7CiB9Ci12b2lkIENQREZfSW1hZ2U6OlNldEpwZWdJbWFnZSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSkKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gSW5pdEpQRUcocERhdGEsIHNpemUpOwotICAgIGlmICghcERpY3QpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BTdHJlYW0tPkluaXRTdHJlYW0ocERhdGEsIHNpemUsIHBEaWN0KTsKK3ZvaWQgQ1BERl9JbWFnZTo6U2V0SnBlZ0ltYWdlKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBJbml0SlBFRyhwRGF0YSwgc2l6ZSk7CisgIGlmICghcERpY3QpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wU3RyZWFtLT5Jbml0U3RyZWFtKHBEYXRhLCBzaXplLCBwRGljdCk7CiB9Ci12b2lkIENQREZfSW1hZ2U6OlNldEpwZWdJbWFnZShJRlhfRmlsZVJlYWQgKnBGaWxlKQotewotICAgIEZYX0RXT1JEIHNpemUgPSAoRlhfRFdPUkQpcEZpbGUtPkdldFNpemUoKTsKLSAgICBpZiAoIXNpemUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9EV09SRCBkd0VzdGltYXRlU2l6ZSA9IHNpemU7Ci0gICAgaWYgKGR3RXN0aW1hdGVTaXplID4gODE5MikgewotICAgICAgICBkd0VzdGltYXRlU2l6ZSA9IDgxOTI7Ci0gICAgfQotICAgIHVpbnQ4X3QqIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgZHdFc3RpbWF0ZVNpemUpOwotICAgIHBGaWxlLT5SZWFkQmxvY2socERhdGEsIDAsIGR3RXN0aW1hdGVTaXplKTsKLSAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gSW5pdEpQRUcocERhdGEsIGR3RXN0aW1hdGVTaXplKTsKK3ZvaWQgQ1BERl9JbWFnZTo6U2V0SnBlZ0ltYWdlKElGWF9GaWxlUmVhZCogcEZpbGUpIHsKKyAgRlhfRFdPUkQgc2l6ZSA9IChGWF9EV09SRClwRmlsZS0+R2V0U2l6ZSgpOworICBpZiAoIXNpemUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRFdPUkQgZHdFc3RpbWF0ZVNpemUgPSBzaXplOworICBpZiAoZHdFc3RpbWF0ZVNpemUgPiA4MTkyKSB7CisgICAgZHdFc3RpbWF0ZVNpemUgPSA4MTkyOworICB9CisgIHVpbnQ4X3QqIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgZHdFc3RpbWF0ZVNpemUpOworICBwRmlsZS0+UmVhZEJsb2NrKHBEYXRhLCAwLCBkd0VzdGltYXRlU2l6ZSk7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBJbml0SlBFRyhwRGF0YSwgZHdFc3RpbWF0ZVNpemUpOworICBGWF9GcmVlKHBEYXRhKTsKKyAgaWYgKCFwRGljdCAmJiBzaXplID4gZHdFc3RpbWF0ZVNpemUpIHsKKyAgICBwRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOworICAgIHBGaWxlLT5SZWFkQmxvY2socERhdGEsIDAsIHNpemUpOworICAgIHBEaWN0ID0gSW5pdEpQRUcocERhdGEsIHNpemUpOwogICAgIEZYX0ZyZWUocERhdGEpOwotICAgIGlmICghcERpY3QgJiYgc2l6ZSA+IGR3RXN0aW1hdGVTaXplKSB7Ci0gICAgICAgIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7Ci0gICAgICAgIHBGaWxlLT5SZWFkQmxvY2socERhdGEsIDAsIHNpemUpOwotICAgICAgICBwRGljdCA9IEluaXRKUEVHKHBEYXRhLCBzaXplKTsKLSAgICAgICAgRlhfRnJlZShwRGF0YSk7Ci0gICAgfQotICAgIGlmICghcERpY3QpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BTdHJlYW0tPkluaXRTdHJlYW0ocEZpbGUsIHBEaWN0KTsKKyAgfQorICBpZiAoIXBEaWN0KSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcFN0cmVhbS0+SW5pdFN0cmVhbShwRmlsZSwgcERpY3QpOwogfQotdm9pZCBfRENURW5jb2RlQml0bWFwKENQREZfRGljdGlvbmFyeSAqcEJpdG1hcERpY3QsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IHF1YWxpdHksIHVpbnQ4X3QqICZidWYsIEZYX1NUUlNJWkUgJnNpemUpCi17Ci19Ci12b2lkIF9KQklHMkVuY29kZUJpdG1hcChDUERGX0RpY3Rpb25hcnkgKnBCaXRtYXBEaWN0LCBjb25zdCBDRlhfRElCaXRtYXAgKnBCaXRtYXAsIENQREZfRG9jdW1lbnQgKnBEb2MsIHVpbnQ4X3QqICZidWYsIEZYX1NUUlNJWkUgJnNpemUsIEZYX0JPT0wgYkxvc3NMZXNzKQotewotfQotdm9pZCBDUERGX0ltYWdlOjpTZXRJbWFnZShjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QgaUNvbXByZXNzLCBJRlhfRmlsZVdyaXRlICpwRmlsZVdyaXRlLCBJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFzaywgY29uc3QgQ1BERl9JbWFnZVNldFBhcmFtKiBwUGFyYW0pCi17Ci0gICAgaW50MzJfdCBCaXRtYXBXaWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7Ci0gICAgaW50MzJfdCBCaXRtYXBIZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICBpZiAoQml0bWFwV2lkdGggPCAxIHx8IEJpdG1hcEhlaWdodCA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBfRENURW5jb2RlQml0bWFwKENQREZfRGljdGlvbmFyeSogcEJpdG1hcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSYgc2l6ZSkge30KK3ZvaWQgX0pCSUcyRW5jb2RlQml0bWFwKENQREZfRGljdGlvbmFyeSogcEJpdG1hcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUmIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb3NzTGVzcykge30KK3ZvaWQgQ1BERl9JbWFnZTo6U2V0SW1hZ2UoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb21wcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVXcml0ZSogcEZpbGVXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfSW1hZ2VTZXRQYXJhbSogcFBhcmFtKSB7CisgIGludDMyX3QgQml0bWFwV2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOworICBpbnQzMl90IEJpdG1hcEhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOworICBpZiAoQml0bWFwV2lkdGggPCAxIHx8IEJpdG1hcEhlaWdodCA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdWludDhfdCogc3JjX2J1ZiA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOworICBpbnQzMl90IHNyY19waXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CisgIGludDMyX3QgYnBwID0gcEJpdG1hcC0+R2V0QlBQKCk7CisgIEZYX0JPT0wgYlVzZU1hdHRlID0KKyAgICAgIHBQYXJhbSAmJiBwUGFyYW0tPnBNYXR0ZUNvbG9yICYmIChwQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIlhPYmplY3QiKSk7CisgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgRlhfQlNUUkMoIkltYWdlIikpOworICBwRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJXaWR0aCIpLCBCaXRtYXBXaWR0aCk7CisgIHBEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkhlaWdodCIpLCBCaXRtYXBIZWlnaHQpOworICB1aW50OF90KiBkZXN0X2J1ZiA9IE5VTEw7CisgIEZYX1NUUlNJWkUgZGVzdF9waXRjaCA9IDAsIGRlc3Rfc2l6ZSA9IDAsIG9wVHlwZSA9IC0xOworICBpZiAoYnBwID09IDEpIHsKKyAgICBpbnQzMl90IHJlc2V0X2EgPSAwLCByZXNldF9yID0gMCwgcmVzZXRfZyA9IDAsIHJlc2V0X2IgPSAwOworICAgIGludDMyX3Qgc2V0X2EgPSAwLCBzZXRfciA9IDAsIHNldF9nID0gMCwgc2V0X2IgPSAwOworICAgIGlmICghcEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgeworICAgICAgQXJnYkRlY29kZShwQml0bWFwLT5HZXRQYWxldHRlQXJnYigwKSwgcmVzZXRfYSwgcmVzZXRfciwgcmVzZXRfZywKKyAgICAgICAgICAgICAgICAgcmVzZXRfYik7CisgICAgICBBcmdiRGVjb2RlKHBCaXRtYXAtPkdldFBhbGV0dGVBcmdiKDEpLCBzZXRfYSwgc2V0X3IsIHNldF9nLCBzZXRfYik7CiAgICAgfQotICAgIHVpbnQ4X3QqIHNyY19idWYgPSBwQml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICBpbnQzMl90IHNyY19waXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgaW50MzJfdCBicHAgPSBwQml0bWFwLT5HZXRCUFAoKTsKLSAgICBGWF9CT09MIGJVc2VNYXR0ZSA9IHBQYXJhbSAmJiBwUGFyYW0tPnBNYXR0ZUNvbG9yICYmIChwQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJUeXBlIiksIEZYX0JTVFJDKCJYT2JqZWN0IikpOwotICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgRlhfQlNUUkMoIkltYWdlIikpOwotICAgIHBEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIldpZHRoIiksIEJpdG1hcFdpZHRoKTsKLSAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSwgQml0bWFwSGVpZ2h0KTsKLSAgICB1aW50OF90KiBkZXN0X2J1ZiA9IE5VTEw7Ci0gICAgRlhfU1RSU0laRSBkZXN0X3BpdGNoID0gMCwgZGVzdF9zaXplID0gMCwgb3BUeXBlID0gLTE7Ci0gICAgaWYgKGJwcCA9PSAxKSB7Ci0gICAgICAgIGludDMyX3QgcmVzZXRfYSA9IDAsIHJlc2V0X3IgPSAwLCByZXNldF9nID0gMCwgcmVzZXRfYiA9IDA7Ci0gICAgICAgIGludDMyX3Qgc2V0X2EgPSAwLCBzZXRfciA9IDAsIHNldF9nID0gMCwgc2V0X2IgPSAwOwotICAgICAgICBpZiAoIXBCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIEFyZ2JEZWNvZGUocEJpdG1hcC0+R2V0UGFsZXR0ZUFyZ2IoMCksIHJlc2V0X2EsIHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2IpOwotICAgICAgICAgICAgQXJnYkRlY29kZShwQml0bWFwLT5HZXRQYWxldHRlQXJnYigxKSwgc2V0X2EsIHNldF9yLCBzZXRfZywgc2V0X2IpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXRfYSA9PSAwIHx8IHJlc2V0X2EgPT0gMCkgewotICAgICAgICAgICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJJbWFnZU1hc2siKSwgbmV3IENQREZfQm9vbGVhbihUUlVFKSk7Ci0gICAgICAgICAgICBpZiAocmVzZXRfYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgICAgICAgICAgcEFycmF5LT5BZGRJbnRlZ2VyKDEpOwotICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkSW50ZWdlcigwKTsKLSAgICAgICAgICAgICAgICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkRlY29kZSIpLCBwQXJyYXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1BERl9BcnJheSogcENTID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgICAgICBwQ1MtPkFkZE5hbWUoRlhfQlNUUkMoIkluZGV4ZWQiKSk7Ci0gICAgICAgICAgICBwQ1MtPkFkZE5hbWUoRlhfQlNUUkMoIkRldmljZVJHQiIpKTsKLSAgICAgICAgICAgIHBDUy0+QWRkSW50ZWdlcigxKTsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGN0OwotICAgICAgICAgICAgRlhfQ0hBUiogcEJ1ZiA9IGN0LkdldEJ1ZmZlcig2KTsKLSAgICAgICAgICAgIHBCdWZbMF0gPSAoRlhfQ0hBUilyZXNldF9yOwotICAgICAgICAgICAgcEJ1ZlsxXSA9IChGWF9DSEFSKXJlc2V0X2c7Ci0gICAgICAgICAgICBwQnVmWzJdID0gKEZYX0NIQVIpcmVzZXRfYjsKLSAgICAgICAgICAgIHBCdWZbM10gPSAoRlhfQ0hBUilzZXRfcjsKLSAgICAgICAgICAgIHBCdWZbNF0gPSAoRlhfQ0hBUilzZXRfZzsKLSAgICAgICAgICAgIHBCdWZbNV0gPSAoRlhfQ0hBUilzZXRfYjsKLSAgICAgICAgICAgIGN0LlJlbGVhc2VCdWZmZXIoNik7Ci0gICAgICAgICAgICBwQ1MtPkFkZChDUERGX1N0cmluZzo6Q3JlYXRlKGN0LCBUUlVFKSk7Ci0gICAgICAgICAgICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSwgcENTKTsKLSAgICAgICAgfQotICAgICAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IiksIDEpOwotICAgICAgICBkZXN0X3BpdGNoID0gKEJpdG1hcFdpZHRoICsgNykgLyA4OwotICAgICAgICBpZiAoKGlDb21wcmVzcyAmIDB4MDMpID09IFBERl9JTUFHRV9OT19DT01QUkVTUykgewotICAgICAgICAgICAgb3BUeXBlID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9wVHlwZSA9IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGJwcCA9PSA4KSB7Ci0gICAgICAgIGludDMyX3QgaVBhbGV0dGUgPSBwQml0bWFwLT5HZXRQYWxldHRlU2l6ZSgpOwotICAgICAgICBpZiAoaVBhbGV0dGUgPiAwKSB7Ci0gICAgICAgICAgICBDUERGX0FycmF5KiBwQ1MgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgICAgIG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwQ1MpOwotICAgICAgICAgICAgcENTLT5BZGROYW1lKEZYX0JTVFJDKCJJbmRleGVkIikpOwotICAgICAgICAgICAgcENTLT5BZGROYW1lKEZYX0JTVFJDKCJEZXZpY2VSR0IiKSk7Ci0gICAgICAgICAgICBwQ1MtPkFkZEludGVnZXIoaVBhbGV0dGUgLSAxKTsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHBDb2xvclRhYmxlID0gRlhfQWxsb2MyRCh1aW50OF90LCBpUGFsZXR0ZSwgMyk7Ci0gICAgICAgICAgICB1aW50OF90KiBwdHIgPSBwQ29sb3JUYWJsZTsKLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlQYWxldHRlOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiA9IHBCaXRtYXAtPkdldFBhbGV0dGVBcmdiKGkpOwotICAgICAgICAgICAgICAgIHB0clswXSA9ICh1aW50OF90KShhcmdiID4+IDE2KTsKLSAgICAgICAgICAgICAgICBwdHJbMV0gPSAodWludDhfdCkoYXJnYiA+PiA4KTsKLSAgICAgICAgICAgICAgICBwdHJbMl0gPSAodWludDhfdClhcmdiOwotICAgICAgICAgICAgICAgIHB0ciArPSAzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9TdHJlYW0gKnBDVFMgPSBDUERGX1N0cmVhbTo6Q3JlYXRlKHBDb2xvclRhYmxlLCBpUGFsZXR0ZSAqIDMsIENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCkpOwotICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBDVFMpOwotICAgICAgICAgICAgcENTLT5BZGRSZWZlcmVuY2UobV9wRG9jdW1lbnQsIHBDVFMpOwotICAgICAgICAgICAgcERpY3QtPlNldEF0UmVmZXJlbmNlKEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIG1fcERvY3VtZW50LCBwQ1MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpLCBGWF9CU1RSQygiRGV2aWNlR3JheSIpKTsKLSAgICAgICAgfQotICAgICAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IiksIDgpOwotICAgICAgICBpZiAoKGlDb21wcmVzcyAmIDB4MDMpID09IFBERl9JTUFHRV9OT19DT01QUkVTUykgewotICAgICAgICAgICAgZGVzdF9waXRjaCA9IEJpdG1hcFdpZHRoOwotICAgICAgICAgICAgb3BUeXBlID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9wVHlwZSA9IDA7Ci0gICAgICAgIH0KKyAgICBpZiAoc2V0X2EgPT0gMCB8fCByZXNldF9hID09IDApIHsKKyAgICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiSW1hZ2VNYXNrIiksIG5ldyBDUERGX0Jvb2xlYW4oVFJVRSkpOworICAgICAgaWYgKHJlc2V0X2EgPT0gMCkgeworICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgICAgICAgcEFycmF5LT5BZGRJbnRlZ2VyKDEpOworICAgICAgICBwQXJyYXktPkFkZEludGVnZXIoMCk7CisgICAgICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiRGVjb2RlIiksIHBBcnJheSk7CisgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpLCBGWF9CU1RSQygiRGV2aWNlUkdCIikpOwotICAgICAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IiksIDgpOwotICAgICAgICBpZiAoKGlDb21wcmVzcyAmIDB4MDMpID09IFBERl9JTUFHRV9OT19DT01QUkVTUykgewotICAgICAgICAgICAgZGVzdF9waXRjaCA9IEJpdG1hcFdpZHRoICogMzsKLSAgICAgICAgICAgIG9wVHlwZSA9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvcFR5cGUgPSAwOwotICAgICAgICB9CisgICAgICBDUERGX0FycmF5KiBwQ1MgPSBuZXcgQ1BERl9BcnJheTsKKyAgICAgIHBDUy0+QWRkTmFtZShGWF9CU1RSQygiSW5kZXhlZCIpKTsKKyAgICAgIHBDUy0+QWRkTmFtZShGWF9CU1RSQygiRGV2aWNlUkdCIikpOworICAgICAgcENTLT5BZGRJbnRlZ2VyKDEpOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3Q7CisgICAgICBGWF9DSEFSKiBwQnVmID0gY3QuR2V0QnVmZmVyKDYpOworICAgICAgcEJ1ZlswXSA9IChGWF9DSEFSKXJlc2V0X3I7CisgICAgICBwQnVmWzFdID0gKEZYX0NIQVIpcmVzZXRfZzsKKyAgICAgIHBCdWZbMl0gPSAoRlhfQ0hBUilyZXNldF9iOworICAgICAgcEJ1ZlszXSA9IChGWF9DSEFSKXNldF9yOworICAgICAgcEJ1Zls0XSA9IChGWF9DSEFSKXNldF9nOworICAgICAgcEJ1Zls1XSA9IChGWF9DSEFSKXNldF9iOworICAgICAgY3QuUmVsZWFzZUJ1ZmZlcig2KTsKKyAgICAgIHBDUy0+QWRkKENQREZfU3RyaW5nOjpDcmVhdGUoY3QsIFRSVUUpKTsKKyAgICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiQ29sb3JTcGFjZSIpLCBwQ1MpOwogICAgIH0KLSAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBNYXNrQml0bWFwID0gTlVMTDsKLSAgICBGWF9CT09MIGJEZWxldGVNYXNrID0gRkFMU0U7Ci0gICAgaWYgKHBCaXRtYXAtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgcE1hc2tCaXRtYXAgPSBwQml0bWFwLT5HZXRBbHBoYU1hc2soKTsKLSAgICAgICAgYkRlbGV0ZU1hc2sgPSBUUlVFOworICAgIHBEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSwgMSk7CisgICAgZGVzdF9waXRjaCA9IChCaXRtYXBXaWR0aCArIDcpIC8gODsKKyAgICBpZiAoKGlDb21wcmVzcyAmIDB4MDMpID09IFBERl9JTUFHRV9OT19DT01QUkVTUykgeworICAgICAgb3BUeXBlID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgb3BUeXBlID0gMDsKICAgICB9Ci0gICAgaWYgKCFwTWFza0JpdG1hcCAmJiBwTWFzaykgewotICAgICAgICBGWERJQl9Gb3JtYXQgbWFza0Zvcm1hdCA9IHBNYXNrLT5HZXRGb3JtYXQoKTsKLSAgICAgICAgaWYgKG1hc2tGb3JtYXQgPT0gRlhESUJfMWJwcE1hc2sgfHwgbWFza0Zvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgewotICAgICAgICAgICAgcE1hc2tCaXRtYXAgPSBwTWFzazsKLSAgICAgICAgfQorICB9IGVsc2UgaWYgKGJwcCA9PSA4KSB7CisgICAgaW50MzJfdCBpUGFsZXR0ZSA9IHBCaXRtYXAtPkdldFBhbGV0dGVTaXplKCk7CisgICAgaWYgKGlQYWxldHRlID4gMCkgeworICAgICAgQ1BERl9BcnJheSogcENTID0gbmV3IENQREZfQXJyYXk7CisgICAgICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocENTKTsKKyAgICAgIHBDUy0+QWRkTmFtZShGWF9CU1RSQygiSW5kZXhlZCIpKTsKKyAgICAgIHBDUy0+QWRkTmFtZShGWF9CU1RSQygiRGV2aWNlUkdCIikpOworICAgICAgcENTLT5BZGRJbnRlZ2VyKGlQYWxldHRlIC0gMSk7CisgICAgICB1aW50OF90KiBwQ29sb3JUYWJsZSA9IEZYX0FsbG9jMkQodWludDhfdCwgaVBhbGV0dGUsIDMpOworICAgICAgdWludDhfdCogcHRyID0gcENvbG9yVGFibGU7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpUGFsZXR0ZTsgaSsrKSB7CisgICAgICAgIEZYX0RXT1JEIGFyZ2IgPSBwQml0bWFwLT5HZXRQYWxldHRlQXJnYihpKTsKKyAgICAgICAgcHRyWzBdID0gKHVpbnQ4X3QpKGFyZ2IgPj4gMTYpOworICAgICAgICBwdHJbMV0gPSAodWludDhfdCkoYXJnYiA+PiA4KTsKKyAgICAgICAgcHRyWzJdID0gKHVpbnQ4X3QpYXJnYjsKKyAgICAgICAgcHRyICs9IDM7CisgICAgICB9CisgICAgICBDUERGX1N0cmVhbSogcENUUyA9IENQREZfU3RyZWFtOjpDcmVhdGUocENvbG9yVGFibGUsIGlQYWxldHRlICogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpKTsKKyAgICAgIG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwQ1RTKTsKKyAgICAgIHBDUy0+QWRkUmVmZXJlbmNlKG1fcERvY3VtZW50LCBwQ1RTKTsKKyAgICAgIHBEaWN0LT5TZXRBdFJlZmVyZW5jZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpLCBtX3BEb2N1bWVudCwgcENTKTsKKyAgICB9IGVsc2UgeworICAgICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpLCBGWF9CU1RSQygiRGV2aWNlR3JheSIpKTsKICAgICB9Ci0gICAgaWYgKHBNYXNrQml0bWFwKSB7Ci0gICAgICAgIGludDMyX3QgbWFza1dpZHRoID0gcE1hc2tCaXRtYXAtPkdldFdpZHRoKCk7Ci0gICAgICAgIGludDMyX3QgbWFza0hlaWdodCA9IHBNYXNrQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICAgICAgdWludDhfdCogbWFza19idWYgPSBOVUxMOwotICAgICAgICBGWF9TVFJTSVpFIG1hc2tfc2l6ZTsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFza0RpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICBwTWFza0RpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiVHlwZSIpLCBGWF9CU1RSQygiWE9iamVjdCIpKTsKLSAgICAgICAgcE1hc2tEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgRlhfQlNUUkMoIkltYWdlIikpOwotICAgICAgICBwTWFza0RpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSwgbWFza1dpZHRoKTsKLSAgICAgICAgcE1hc2tEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkhlaWdodCIpLCBtYXNrSGVpZ2h0KTsKLSAgICAgICAgcE1hc2tEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSwgRlhfQlNUUkMoIkRldmljZUdyYXkiKSk7Ci0gICAgICAgIHBNYXNrRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IiksIDgpOwotICAgICAgICBpZiAocE1hc2tCaXRtYXAtPkdldEJQUCgpID09IDggJiYgKGlDb21wcmVzcyAmIFBERl9JTUFHRV9NQVNLX0xPU1NZX0NPTVBSRVNTKSAhPSAwKSB7Ci0gICAgICAgICAgICBfRENURW5jb2RlQml0bWFwKHBNYXNrRGljdCwgcE1hc2tCaXRtYXAsIHBQYXJhbSA/IHBQYXJhbS0+blF1YWxpdHkgOiA3NSwgbWFza19idWYsIG1hc2tfc2l6ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocE1hc2tCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCXzFicHBNYXNrKSB7Ci0gICAgICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocE1hc2tEaWN0LCBwTWFza0JpdG1hcCwgbV9wRG9jdW1lbnQsIG1hc2tfYnVmLCBtYXNrX3NpemUsIFRSVUUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWFza19idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG1hc2tIZWlnaHQsIG1hc2tXaWR0aCk7Ci0gICAgICAgICAgICBtYXNrX3NpemUgPSBtYXNrSGVpZ2h0ICogbWFza1dpZHRoOyAgLy8gU2FmZSBzaW5jZSBjaGVja2VkIGFsbG9jIHJldHVybmVkLgotICAgICAgICAgICAgZm9yIChpbnQzMl90IGEgPSAwOyBhIDwgbWFza0hlaWdodDsgYSArKykgewotICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShtYXNrX2J1ZiArIGEgKiBtYXNrV2lkdGgsIHBNYXNrQml0bWFwLT5HZXRTY2FubGluZShhKSwgbWFza1dpZHRoKTsKLSAgICAgICAgICAgIH0KKyAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IiksIDgpOworICAgIGlmICgoaUNvbXByZXNzICYgMHgwMykgPT0gUERGX0lNQUdFX05PX0NPTVBSRVNTKSB7CisgICAgICBkZXN0X3BpdGNoID0gQml0bWFwV2lkdGg7CisgICAgICBvcFR5cGUgPSAxOworICAgIH0gZWxzZSB7CisgICAgICBvcFR5cGUgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIEZYX0JTVFJDKCJEZXZpY2VSR0IiKSk7CisgICAgcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpLCA4KTsKKyAgICBpZiAoKGlDb21wcmVzcyAmIDB4MDMpID09IFBERl9JTUFHRV9OT19DT01QUkVTUykgeworICAgICAgZGVzdF9waXRjaCA9IEJpdG1hcFdpZHRoICogMzsKKyAgICAgIG9wVHlwZSA9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgIG9wVHlwZSA9IDA7CisgICAgfQorICB9CisgIGNvbnN0IENGWF9ESUJpdG1hcCogcE1hc2tCaXRtYXAgPSBOVUxMOworICBGWF9CT09MIGJEZWxldGVNYXNrID0gRkFMU0U7CisgIGlmIChwQml0bWFwLT5IYXNBbHBoYSgpKSB7CisgICAgcE1hc2tCaXRtYXAgPSBwQml0bWFwLT5HZXRBbHBoYU1hc2soKTsKKyAgICBiRGVsZXRlTWFzayA9IFRSVUU7CisgIH0KKyAgaWYgKCFwTWFza0JpdG1hcCAmJiBwTWFzaykgeworICAgIEZYRElCX0Zvcm1hdCBtYXNrRm9ybWF0ID0gcE1hc2stPkdldEZvcm1hdCgpOworICAgIGlmIChtYXNrRm9ybWF0ID09IEZYRElCXzFicHBNYXNrIHx8IG1hc2tGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKKyAgICAgIHBNYXNrQml0bWFwID0gcE1hc2s7CisgICAgfQorICB9CisgIGlmIChwTWFza0JpdG1hcCkgeworICAgIGludDMyX3QgbWFza1dpZHRoID0gcE1hc2tCaXRtYXAtPkdldFdpZHRoKCk7CisgICAgaW50MzJfdCBtYXNrSGVpZ2h0ID0gcE1hc2tCaXRtYXAtPkdldEhlaWdodCgpOworICAgIHVpbnQ4X3QqIG1hc2tfYnVmID0gTlVMTDsKKyAgICBGWF9TVFJTSVpFIG1hc2tfc2l6ZTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBNYXNrRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgcE1hc2tEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIlhPYmplY3QiKSk7CisgICAgcE1hc2tEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgRlhfQlNUUkMoIkltYWdlIikpOworICAgIHBNYXNrRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJXaWR0aCIpLCBtYXNrV2lkdGgpOworICAgIHBNYXNrRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSwgbWFza0hlaWdodCk7CisgICAgcE1hc2tEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSwgRlhfQlNUUkMoIkRldmljZUdyYXkiKSk7CisgICAgcE1hc2tEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSwgOCk7CisgICAgaWYgKHBNYXNrQml0bWFwLT5HZXRCUFAoKSA9PSA4ICYmCisgICAgICAgIChpQ29tcHJlc3MgJiBQREZfSU1BR0VfTUFTS19MT1NTWV9DT01QUkVTUykgIT0gMCkgeworICAgICAgX0RDVEVuY29kZUJpdG1hcChwTWFza0RpY3QsIHBNYXNrQml0bWFwLCBwUGFyYW0gPyBwUGFyYW0tPm5RdWFsaXR5IDogNzUsCisgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfYnVmLCBtYXNrX3NpemUpOworICAgIH0gZWxzZSBpZiAocE1hc2tCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCXzFicHBNYXNrKSB7CisgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocE1hc2tEaWN0LCBwTWFza0JpdG1hcCwgbV9wRG9jdW1lbnQsIG1hc2tfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfc2l6ZSwgVFJVRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1hc2tfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCBtYXNrSGVpZ2h0LCBtYXNrV2lkdGgpOworICAgICAgbWFza19zaXplID0gbWFza0hlaWdodCAqIG1hc2tXaWR0aDsgIC8vIFNhZmUgc2luY2UgY2hlY2tlZCBhbGxvYyByZXR1cm5lZC4KKyAgICAgIGZvciAoaW50MzJfdCBhID0gMDsgYSA8IG1hc2tIZWlnaHQ7IGErKykgeworICAgICAgICBGWFNZU19tZW1jcHkobWFza19idWYgKyBhICogbWFza1dpZHRoLCBwTWFza0JpdG1hcC0+R2V0U2NhbmxpbmUoYSksCisgICAgICAgICAgICAgICAgICAgICBtYXNrV2lkdGgpOworICAgICAgfQorICAgIH0KKyAgICBwTWFza0RpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIG1hc2tfc2l6ZSk7CisgICAgaWYgKGJVc2VNYXR0ZSkgeworICAgICAgaW50IGEsIHIsIGcsIGI7CisgICAgICBBcmdiRGVjb2RlKCoocFBhcmFtLT5wTWF0dGVDb2xvciksIGEsIHIsIGcsIGIpOworICAgICAgQ1BERl9BcnJheSogcE1hdHRlID0gbmV3IENQREZfQXJyYXk7CisgICAgICBwTWF0dGUtPkFkZEludGVnZXIocik7CisgICAgICBwTWF0dGUtPkFkZEludGVnZXIoZyk7CisgICAgICBwTWF0dGUtPkFkZEludGVnZXIoYik7CisgICAgICBwTWFza0RpY3QtPlNldEF0KEZYX0JTVFJDKCJNYXR0ZSIpLCBwTWF0dGUpOworICAgIH0KKyAgICBDUERGX1N0cmVhbSogcE1hc2tTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0obWFza19idWYsIG1hc2tfc2l6ZSwgcE1hc2tEaWN0KTsKKyAgICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocE1hc2tTdHJlYW0pOworICAgIHBEaWN0LT5TZXRBdFJlZmVyZW5jZShGWF9CU1RSQygiU01hc2siKSwgbV9wRG9jdW1lbnQsIHBNYXNrU3RyZWFtKTsKKyAgICBpZiAoYkRlbGV0ZU1hc2spIHsKKyAgICAgIGRlbGV0ZSBwTWFza0JpdG1hcDsKKyAgICB9CisgIH0KKyAgRlhfQk9PTCBiU3RyZWFtID0gcEZpbGVXcml0ZSAhPSBOVUxMICYmIHBGaWxlUmVhZCAhPSBOVUxMOworICBpZiAob3BUeXBlID09IDApIHsKKyAgICBpZiAoaUNvbXByZXNzICYgUERGX0lNQUdFX0xPU1NMRVNTX0NPTVBSRVNTKSB7CisgICAgICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSkgeworICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocERpY3QsIHBCaXRtYXAsIG1fcERvY3VtZW50LCBkZXN0X2J1ZiwgZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA9PSAxKSB7CisgICAgICAgIF9KQklHMkVuY29kZUJpdG1hcChwRGljdCwgcEJpdG1hcCwgbV9wRG9jdW1lbnQsIGRlc3RfYnVmLCBkZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgICAgICB9IGVsc2UgaWYgKHBCaXRtYXAtPkdldEJQUCgpID49IDggJiYgcEJpdG1hcC0+R2V0UGFsZXR0ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBwTmV3Qml0bWFwID0gbmV3IENGWF9ESUJpdG1hcCgpOworICAgICAgICBwTmV3Qml0bWFwLT5Db3B5KHBCaXRtYXApOworICAgICAgICBwTmV3Qml0bWFwLT5Db252ZXJ0Rm9ybWF0KEZYRElCX1JnYik7CisgICAgICAgIFNldEltYWdlKHBOZXdCaXRtYXAsIGlDb21wcmVzcywgcEZpbGVXcml0ZSwgcEZpbGVSZWFkKTsKKyAgICAgICAgaWYgKHBEaWN0KSB7CisgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKKyAgICAgICAgICBwRGljdCA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgcE1hc2tEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBtYXNrX3NpemUpOworICAgICAgICBpZiAoZGVzdF9idWYpIHsKKyAgICAgICAgICBGWF9GcmVlKGRlc3RfYnVmKTsKKyAgICAgICAgICBkZXN0X2J1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zaXplID0gMDsKKyAgICAgICAgZGVsZXRlIHBOZXdCaXRtYXA7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChiVXNlTWF0dGUpIHsKLSAgICAgICAgICAgIGludCBhLCByLCBnLCBiOwotICAgICAgICAgICAgQXJnYkRlY29kZSgqKHBQYXJhbS0+cE1hdHRlQ29sb3IpLCBhLCByLCBnLCBiKTsKLSAgICAgICAgICAgIENQREZfQXJyYXkqIHBNYXR0ZSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICAgICAgcE1hdHRlLT5BZGRJbnRlZ2VyKHIpOwotICAgICAgICAgICAgcE1hdHRlLT5BZGRJbnRlZ2VyKGcpOwotICAgICAgICAgICAgcE1hdHRlLT5BZGRJbnRlZ2VyKGIpOwotICAgICAgICAgICAgcE1hc2tEaWN0LT5TZXRBdChGWF9CU1RSQygiTWF0dGUiKSwgcE1hdHRlKTsKLSAgICAgICAgfQotICAgICAgICBDUERGX1N0cmVhbSogcE1hc2tTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0obWFza19idWYsIG1hc2tfc2l6ZSwgcE1hc2tEaWN0KTsKLSAgICAgICAgbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBNYXNrU3RyZWFtKTsKLSAgICAgICAgcERpY3QtPlNldEF0UmVmZXJlbmNlKEZYX0JTVFJDKCJTTWFzayIpLCBtX3BEb2N1bWVudCwgcE1hc2tTdHJlYW0pOwotICAgICAgICBpZiAoYkRlbGV0ZU1hc2spIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwTWFza0JpdG1hcDsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9CT09MIGJTdHJlYW0gPSBwRmlsZVdyaXRlICE9IE5VTEwgJiYgcEZpbGVSZWFkICE9IE5VTEw7Ci0gICAgaWYgKG9wVHlwZSA9PSAwKSB7Ci0gICAgICAgIGlmIChpQ29tcHJlc3MgJiBQREZfSU1BR0VfTE9TU0xFU1NfQ09NUFJFU1MpIHsKLSAgICAgICAgICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgX0pCSUcyRW5jb2RlQml0bWFwKHBEaWN0LCBwQml0bWFwLCBtX3BEb2N1bWVudCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSwgVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIF9KQklHMkVuY29kZUJpdG1hcChwRGljdCwgcEJpdG1hcCwgbV9wRG9jdW1lbnQsIGRlc3RfYnVmLCBkZXN0X3NpemUsIEZBTFNFKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPj0gOCAmJiBwQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCAqcE5ld0JpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXAoKTsKLSAgICAgICAgICAgICAgICBwTmV3Qml0bWFwLT5Db3B5KHBCaXRtYXApOwotICAgICAgICAgICAgICAgIHBOZXdCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfUmdiKTsKLSAgICAgICAgICAgICAgICBTZXRJbWFnZShwTmV3Qml0bWFwLCBpQ29tcHJlc3MsIHBGaWxlV3JpdGUsIHBGaWxlUmVhZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBEaWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHBEaWN0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRlc3RfYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBOZXdCaXRtYXA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYlVzZU1hdHRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCAqcE5ld0JpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgcE5ld0JpdG1hcC0+Q3JlYXRlKEJpdG1hcFdpZHRoLCBCaXRtYXBIZWlnaHQsIEZYRElCX0FyZ2IpOwotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfYnVmID0gcE5ld0JpdG1hcC0+R2V0QnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX29mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBCaXRtYXBIZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX29mZnNldCA9IHJvdyAqIHNyY19waXRjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBCaXRtYXBXaWR0aDsgY29sdW1uICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYWxwaGEgPSBzcmNfYnVmW3NyY19vZmZzZXQgKyAzXSAvIDI1NS4wZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmW3NyY19vZmZzZXRdID0gKHVpbnQ4X3QpKHNyY19idWZbc3JjX29mZnNldF0gKiBhbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZltzcmNfb2Zmc2V0ICsgMV0gPSAodWludDhfdCkoc3JjX2J1ZltzcmNfb2Zmc2V0ICsgMV0gKiBhbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZltzcmNfb2Zmc2V0ICsgMl0gPSAodWludDhfdCkoc3JjX2J1ZltzcmNfb2Zmc2V0ICsgMl0gKiBhbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZltzcmNfb2Zmc2V0ICsgM10gPSAodWludDhfdCkoc3JjX2J1ZltzcmNfb2Zmc2V0ICsgM10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19vZmZzZXQgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBfRENURW5jb2RlQml0bWFwKHBEaWN0LCBwTmV3Qml0bWFwLCBwUGFyYW0gPyBwUGFyYW0tPm5RdWFsaXR5IDogNzUsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcE5ld0JpdG1hcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBfRENURW5jb2RlQml0bWFwKHBEaWN0LCBwQml0bWFwLCBwUGFyYW0gPyBwUGFyYW0tPm5RdWFsaXR5IDogNzUsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYlN0cmVhbSkgewotICAgICAgICAgICAgcEZpbGVXcml0ZS0+V3JpdGVCbG9jayhkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICAgICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOwotICAgICAgICAgICAgZGVzdF9idWYgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChvcFR5cGUgPT0gMSkgewotICAgICAgICBpZiAoIWJTdHJlYW0pIHsKLSAgICAgICAgICAgIGRlc3RfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCBkZXN0X3BpdGNoLCBCaXRtYXBIZWlnaHQpOwotICAgICAgICAgICAgZGVzdF9zaXplID0gZGVzdF9waXRjaCAqIEJpdG1hcEhlaWdodDsgIC8vIFNhZmUgc2luY2UgY2hlY2tlZCBhbGxvYyByZXR1cm5lZC4KLSAgICAgICAgfQotICAgICAgICB1aW50OF90KiBwRGVzdCA9IGRlc3RfYnVmOwotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBCaXRtYXBIZWlnaHQ7IGkgKyspIHsKLSAgICAgICAgICAgIGlmICghYlN0cmVhbSkgewotICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShwRGVzdCwgc3JjX2J1ZiwgZGVzdF9waXRjaCk7Ci0gICAgICAgICAgICAgICAgcERlc3QgKz0gZGVzdF9waXRjaDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEZpbGVXcml0ZS0+V3JpdGVCbG9jayhzcmNfYnVmLCBkZXN0X3BpdGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY19idWYgKz0gc3JjX3BpdGNoOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChvcFR5cGUgPT0gMikgewotICAgICAgICBpZiAoIWJTdHJlYW0pIHsKLSAgICAgICAgICAgIGRlc3RfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCBkZXN0X3BpdGNoLCBCaXRtYXBIZWlnaHQpOwotICAgICAgICAgICAgZGVzdF9zaXplID0gZGVzdF9waXRjaCAqIEJpdG1hcEhlaWdodDsgIC8vIFNhZmUgc2luY2UgY2hlY2tlZCBhbGxvYyByZXR1cm5lZC4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RfYnVmID0gRlhfQWxsb2ModWludDhfdCwgZGVzdF9waXRjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCogcERlc3QgPSBkZXN0X2J1ZjsKLSAgICAgICAgaW50MzJfdCBzcmNfb2Zmc2V0ID0gMDsKLSAgICAgICAgaW50MzJfdCBkZXN0X29mZnNldCA9IDA7Ci0gICAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBCaXRtYXBIZWlnaHQ7IHJvdyArKykgeworICAgICAgICAgIENGWF9ESUJpdG1hcCogcE5ld0JpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXAoKTsKKyAgICAgICAgICBwTmV3Qml0bWFwLT5DcmVhdGUoQml0bWFwV2lkdGgsIEJpdG1hcEhlaWdodCwgRlhESUJfQXJnYik7CisgICAgICAgICAgdWludDhfdCogZHN0X2J1ZiA9IHBOZXdCaXRtYXAtPkdldEJ1ZmZlcigpOworICAgICAgICAgIGludDMyX3Qgc3JjX29mZnNldCA9IDA7CisgICAgICAgICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IEJpdG1hcEhlaWdodDsgcm93KyspIHsKICAgICAgICAgICAgIHNyY19vZmZzZXQgPSByb3cgKiBzcmNfcGl0Y2g7Ci0gICAgICAgICAgICBmb3IgKGludDMyX3QgY29sdW1uID0gMDsgY29sdW1uIDwgQml0bWFwV2lkdGg7IGNvbHVtbiArKykgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGFscGhhID0gYlVzZU1hdHRlID8gc3JjX2J1ZltzcmNfb2Zmc2V0ICsgM10gLyAyNTUuMGYgOiAxOwotICAgICAgICAgICAgICAgIHBEZXN0W2Rlc3Rfb2Zmc2V0XSA9ICh1aW50OF90KShzcmNfYnVmW3NyY19vZmZzZXQgKyAyXSAqIGFscGhhKTsKLSAgICAgICAgICAgICAgICBwRGVzdFtkZXN0X29mZnNldCArIDFdID0gKHVpbnQ4X3QpKHNyY19idWZbc3JjX29mZnNldCArIDFdICogYWxwaGEpOwotICAgICAgICAgICAgICAgIHBEZXN0W2Rlc3Rfb2Zmc2V0ICsgMl0gPSAodWludDhfdCkoc3JjX2J1ZltzcmNfb2Zmc2V0XSAqIGFscGhhKTsKLSAgICAgICAgICAgICAgICBkZXN0X29mZnNldCArPSAzOwotICAgICAgICAgICAgICAgIHNyY19vZmZzZXQgKz0gYnBwID09IDI0ID8gMyA6IDQ7CisgICAgICAgICAgICBmb3IgKGludDMyX3QgY29sdW1uID0gMDsgY29sdW1uIDwgQml0bWFwV2lkdGg7IGNvbHVtbisrKSB7CisgICAgICAgICAgICAgIEZYX0ZMT0FUIGFscGhhID0gc3JjX2J1ZltzcmNfb2Zmc2V0ICsgM10gLyAyNTUuMGY7CisgICAgICAgICAgICAgIGRzdF9idWZbc3JjX29mZnNldF0gPSAodWludDhfdCkoc3JjX2J1ZltzcmNfb2Zmc2V0XSAqIGFscGhhKTsKKyAgICAgICAgICAgICAgZHN0X2J1ZltzcmNfb2Zmc2V0ICsgMV0gPQorICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKHNyY19idWZbc3JjX29mZnNldCArIDFdICogYWxwaGEpOworICAgICAgICAgICAgICBkc3RfYnVmW3NyY19vZmZzZXQgKyAyXSA9CisgICAgICAgICAgICAgICAgICAodWludDhfdCkoc3JjX2J1ZltzcmNfb2Zmc2V0ICsgMl0gKiBhbHBoYSk7CisgICAgICAgICAgICAgIGRzdF9idWZbc3JjX29mZnNldCArIDNdID0gKHVpbnQ4X3QpKHNyY19idWZbc3JjX29mZnNldCArIDNdKTsKKyAgICAgICAgICAgICAgc3JjX29mZnNldCArPSA0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICBwRmlsZVdyaXRlLT5Xcml0ZUJsb2NrKHBEZXN0LCBkZXN0X3BpdGNoKTsKLSAgICAgICAgICAgICAgICBwRGVzdCA9IGRlc3RfYnVmOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwRGVzdCArPSBkZXN0X3BpdGNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9vZmZzZXQgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBfRENURW5jb2RlQml0bWFwKHBEaWN0LCBwTmV3Qml0bWFwLCBwUGFyYW0gPyBwUGFyYW0tPm5RdWFsaXR5IDogNzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgICAgICAgICBkZWxldGUgcE5ld0JpdG1hcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfRENURW5jb2RlQml0bWFwKHBEaWN0LCBwQml0bWFwLCBwUGFyYW0gPyBwUGFyYW0tPm5RdWFsaXR5IDogNzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKICAgICAgICAgfQotICAgICAgICBpZiAoYlN0cmVhbSkgewotICAgICAgICAgICAgRlhfRnJlZShkZXN0X2J1Zik7Ci0gICAgICAgICAgICBkZXN0X2J1ZiA9IE5VTEw7Ci0gICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1fcFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKKyAgICBpZiAoYlN0cmVhbSkgeworICAgICAgcEZpbGVXcml0ZS0+V3JpdGVCbG9jayhkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOworICAgICAgZGVzdF9idWYgPSBOVUxMOwogICAgIH0KKyAgfSBlbHNlIGlmIChvcFR5cGUgPT0gMSkgewogICAgIGlmICghYlN0cmVhbSkgewotICAgICAgICBtX3BTdHJlYW0tPkluaXRTdHJlYW0oZGVzdF9idWYsIGRlc3Rfc2l6ZSwgcERpY3QpOworICAgICAgZGVzdF9idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIGRlc3RfcGl0Y2gsIEJpdG1hcEhlaWdodCk7CisgICAgICBkZXN0X3NpemUgPQorICAgICAgICAgIGRlc3RfcGl0Y2ggKiBCaXRtYXBIZWlnaHQ7ICAvLyBTYWZlIHNpbmNlIGNoZWNrZWQgYWxsb2MgcmV0dXJuZWQuCisgICAgfQorICAgIHVpbnQ4X3QqIHBEZXN0ID0gZGVzdF9idWY7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgQml0bWFwSGVpZ2h0OyBpKyspIHsKKyAgICAgIGlmICghYlN0cmVhbSkgeworICAgICAgICBGWFNZU19tZW1jcHkocERlc3QsIHNyY19idWYsIGRlc3RfcGl0Y2gpOworICAgICAgICBwRGVzdCArPSBkZXN0X3BpdGNoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcEZpbGVXcml0ZS0+V3JpdGVCbG9jayhzcmNfYnVmLCBkZXN0X3BpdGNoKTsKKyAgICAgIH0KKyAgICAgIHNyY19idWYgKz0gc3JjX3BpdGNoOworICAgIH0KKyAgfSBlbHNlIGlmIChvcFR5cGUgPT0gMikgeworICAgIGlmICghYlN0cmVhbSkgeworICAgICAgZGVzdF9idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIGRlc3RfcGl0Y2gsIEJpdG1hcEhlaWdodCk7CisgICAgICBkZXN0X3NpemUgPQorICAgICAgICAgIGRlc3RfcGl0Y2ggKiBCaXRtYXBIZWlnaHQ7ICAvLyBTYWZlIHNpbmNlIGNoZWNrZWQgYWxsb2MgcmV0dXJuZWQuCiAgICAgfSBlbHNlIHsKLSAgICAgICAgcEZpbGVXcml0ZS0+Rmx1c2goKTsKLSAgICAgICAgbV9wU3RyZWFtLT5Jbml0U3RyZWFtKHBGaWxlUmVhZCwgcERpY3QpOworICAgICAgZGVzdF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBkZXN0X3BpdGNoKTsKICAgICB9Ci0gICAgbV9iSXNNYXNrID0gcEJpdG1hcC0+SXNBbHBoYU1hc2soKTsKLSAgICBtX1dpZHRoID0gQml0bWFwV2lkdGg7Ci0gICAgbV9IZWlnaHQgPSBCaXRtYXBIZWlnaHQ7Ci0gICAgaWYgKGRlc3RfYnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOworICAgIHVpbnQ4X3QqIHBEZXN0ID0gZGVzdF9idWY7CisgICAgaW50MzJfdCBzcmNfb2Zmc2V0ID0gMDsKKyAgICBpbnQzMl90IGRlc3Rfb2Zmc2V0ID0gMDsKKyAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgQml0bWFwSGVpZ2h0OyByb3crKykgeworICAgICAgc3JjX29mZnNldCA9IHJvdyAqIHNyY19waXRjaDsKKyAgICAgIGZvciAoaW50MzJfdCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBCaXRtYXBXaWR0aDsgY29sdW1uKyspIHsKKyAgICAgICAgRlhfRkxPQVQgYWxwaGEgPSBiVXNlTWF0dGUgPyBzcmNfYnVmW3NyY19vZmZzZXQgKyAzXSAvIDI1NS4wZiA6IDE7CisgICAgICAgIHBEZXN0W2Rlc3Rfb2Zmc2V0XSA9ICh1aW50OF90KShzcmNfYnVmW3NyY19vZmZzZXQgKyAyXSAqIGFscGhhKTsKKyAgICAgICAgcERlc3RbZGVzdF9vZmZzZXQgKyAxXSA9ICh1aW50OF90KShzcmNfYnVmW3NyY19vZmZzZXQgKyAxXSAqIGFscGhhKTsKKyAgICAgICAgcERlc3RbZGVzdF9vZmZzZXQgKyAyXSA9ICh1aW50OF90KShzcmNfYnVmW3NyY19vZmZzZXRdICogYWxwaGEpOworICAgICAgICBkZXN0X29mZnNldCArPSAzOworICAgICAgICBzcmNfb2Zmc2V0ICs9IGJwcCA9PSAyNCA/IDMgOiA0OworICAgICAgfQorICAgICAgaWYgKGJTdHJlYW0pIHsKKyAgICAgICAgcEZpbGVXcml0ZS0+V3JpdGVCbG9jayhwRGVzdCwgZGVzdF9waXRjaCk7CisgICAgICAgIHBEZXN0ID0gZGVzdF9idWY7CisgICAgICB9IGVsc2UgeworICAgICAgICBwRGVzdCArPSBkZXN0X3BpdGNoOworICAgICAgfQorICAgICAgZGVzdF9vZmZzZXQgPSAwOwogICAgIH0KKyAgICBpZiAoYlN0cmVhbSkgeworICAgICAgRlhfRnJlZShkZXN0X2J1Zik7CisgICAgICBkZXN0X2J1ZiA9IE5VTEw7CisgICAgfQorICB9CisgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgeworICAgIG1fcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKKyAgfQorICBpZiAoIWJTdHJlYW0pIHsKKyAgICBtX3BTdHJlYW0tPkluaXRTdHJlYW0oZGVzdF9idWYsIGRlc3Rfc2l6ZSwgcERpY3QpOworICB9IGVsc2UgeworICAgIHBGaWxlV3JpdGUtPkZsdXNoKCk7CisgICAgbV9wU3RyZWFtLT5Jbml0U3RyZWFtKHBGaWxlUmVhZCwgcERpY3QpOworICB9CisgIG1fYklzTWFzayA9IHBCaXRtYXAtPklzQWxwaGFNYXNrKCk7CisgIG1fV2lkdGggPSBCaXRtYXBXaWR0aDsKKyAgbV9IZWlnaHQgPSBCaXRtYXBIZWlnaHQ7CisgIGlmIChkZXN0X2J1ZikgeworICAgIEZYX0ZyZWUoZGVzdF9idWYpOworICB9CiB9Ci12b2lkIENQREZfSW1hZ2U6OlJlc2V0Q2FjaGUoQ1BERl9QYWdlKiBwUGFnZSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKQotewotICAgIHBQYWdlLT5HZXRSZW5kZXJDYWNoZSgpLT5SZXNldEJpdG1hcChtX3BTdHJlYW0sIHBCaXRtYXApOwordm9pZCBDUERGX0ltYWdlOjpSZXNldENhY2hlKENQREZfUGFnZSogcFBhZ2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCkgeworICBwUGFnZS0+R2V0UmVuZGVyQ2FjaGUoKS0+UmVzZXRCaXRtYXAobV9wU3RyZWFtLCBwQml0bWFwKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZvbnRfaW50LmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mb250X2ludC5oCmluZGV4IGY1N2U1MjcuLmQ3Y2JlMWIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZvbnRfaW50LmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZm9udF9pbnQuaApAQCAtNywxNzAgKzcsMTY3IEBACiAjZGVmaW5lIENPUkVfU1JDX0ZQREZBUElfRlBERl9GT05UX0ZPTlRfSU5UX0hfCiAKIHR5cGVkZWYgdm9pZCogRlhGVF9MaWJyYXJ5OwotY2xhc3MgQ1BERl9DTWFwTWFuYWdlcgotewotcHVibGljOgotICAgIENQREZfQ01hcE1hbmFnZXIoKTsKLSAgICB+Q1BERl9DTWFwTWFuYWdlcigpOwotICAgIHZvaWQqCQkJCUdldFBhY2thZ2UoRlhfQk9PTCBiUHJvbXB0KTsKLSAgICBDUERGX0NNYXAqCQkJCUdldFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJQcm9tcHQpOwotICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqCUdldENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBGWF9CT09MIGJQcm9tcHQpOwotICAgIHZvaWQJCQkJCVJlbG9hZEFsbCgpOwotcHJpdmF0ZToKLSAgICBDUERGX0NNYXAqCQkJCUxvYWRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgIEZYX0JPT0wgYlByb21wdCk7Ci0gICAgQ1BERl9DSUQyVW5pY29kZU1hcCoJTG9hZENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBGWF9CT09MIGJQcm9tcHQpOwotICAgIHZvaWQJCQkJCURyb3BBbGwoRlhfQk9PTCBiUmVsb2FkKTsKLSAgICBGWF9CT09MCQkJCQltX2JQcm9tcHRlZDsKLSAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCW1fQ01hcHM7Ci0gICAgQ1BERl9DSUQyVW5pY29kZU1hcCoJbV9DSUQyVW5pY29kZU1hcHNbNl07CitjbGFzcyBDUERGX0NNYXBNYW5hZ2VyIHsKKyBwdWJsaWM6CisgIENQREZfQ01hcE1hbmFnZXIoKTsKKyAgfkNQREZfQ01hcE1hbmFnZXIoKTsKKyAgdm9pZCogR2V0UGFja2FnZShGWF9CT09MIGJQcm9tcHQpOworICBDUERGX0NNYXAqIEdldFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJQcm9tcHQpOworICBDUERGX0NJRDJVbmljb2RlTWFwKiBHZXRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0KTsKKyAgdm9pZCBSZWxvYWRBbGwoKTsKKworIHByaXZhdGU6CisgIENQREZfQ01hcCogTG9hZFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJQcm9tcHQpOworICBDUERGX0NJRDJVbmljb2RlTWFwKiBMb2FkQ0lEMlVuaWNvZGVNYXAoaW50IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdCk7CisgIHZvaWQgRHJvcEFsbChGWF9CT09MIGJSZWxvYWQpOworICBGWF9CT09MIG1fYlByb21wdGVkOworICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyIG1fQ01hcHM7CisgIENQREZfQ0lEMlVuaWNvZGVNYXAqIG1fQ0lEMlVuaWNvZGVNYXBzWzZdOwogfTsKLWNsYXNzIENQREZfRm9udEdsb2JhbHMKLXsKLXB1YmxpYzoKLSAgICBDUERGX0ZvbnRHbG9iYWxzKCk7Ci0gICAgfkNQREZfRm9udEdsb2JhbHMoKTsKLSAgICB2b2lkCQkJCUNsZWFyQWxsKCk7Ci0gICAgdm9pZAkJCQlDbGVhcih2b2lkKiBrZXkpOwotICAgIENQREZfRm9udCoJCQlGaW5kKHZvaWQqIGtleSwgaW50IGluZGV4KTsKLSAgICB2b2lkCQkJCVNldCh2b2lkKiBrZXksIGludCBpbmRleCwgQ1BERl9Gb250KiBwRm9udCk7Ci0gICAgQ1BERl9DTWFwTWFuYWdlcgltX0NNYXBNYW5hZ2VyOwotICAgIHN0cnVjdCB7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBGWENNQVBfQ01hcCoJbV9wTWFwTGlzdDsKLSAgICAgICAgaW50CQkJCW1fQ291bnQ7Ci0gICAgfSBtX0VtYmVkZGVkQ2hhcnNldHNbTlVNQkVSX09GX0NJRFNFVFNdOwotICAgIHN0cnVjdCB7Ci0gICAgICAgIGNvbnN0IEZYX1dPUkQqCW1fcE1hcDsKLSAgICAgICAgaW50CQkJCW1fQ291bnQ7Ci0gICAgfSBtX0VtYmVkZGVkVG9Vbmljb2Rlc1tOVU1CRVJfT0ZfQ0lEU0VUU107Ci1wcml2YXRlOgotICAgIENGWF9NYXBQdHJUb1B0cgkJbV9wU3RvY2tNYXA7Ci0gICAgdWludDhfdCoJCQltX3BDb250cmFzdFJhbXBzOworY2xhc3MgQ1BERl9Gb250R2xvYmFscyB7CisgcHVibGljOgorICBDUERGX0ZvbnRHbG9iYWxzKCk7CisgIH5DUERGX0ZvbnRHbG9iYWxzKCk7CisgIHZvaWQgQ2xlYXJBbGwoKTsKKyAgdm9pZCBDbGVhcih2b2lkKiBrZXkpOworICBDUERGX0ZvbnQqIEZpbmQodm9pZCoga2V5LCBpbnQgaW5kZXgpOworICB2b2lkIFNldCh2b2lkKiBrZXksIGludCBpbmRleCwgQ1BERl9Gb250KiBwRm9udCk7CisgIENQREZfQ01hcE1hbmFnZXIgbV9DTWFwTWFuYWdlcjsKKyAgc3RydWN0IHsKKyAgICBjb25zdCBzdHJ1Y3QgRlhDTUFQX0NNYXAqIG1fcE1hcExpc3Q7CisgICAgaW50IG1fQ291bnQ7CisgIH0gbV9FbWJlZGRlZENoYXJzZXRzW05VTUJFUl9PRl9DSURTRVRTXTsKKyAgc3RydWN0IHsKKyAgICBjb25zdCBGWF9XT1JEKiBtX3BNYXA7CisgICAgaW50IG1fQ291bnQ7CisgIH0gbV9FbWJlZGRlZFRvVW5pY29kZXNbTlVNQkVSX09GX0NJRFNFVFNdOworCisgcHJpdmF0ZToKKyAgQ0ZYX01hcFB0clRvUHRyIG1fcFN0b2NrTWFwOworICB1aW50OF90KiBtX3BDb250cmFzdFJhbXBzOwogfTsKIHN0cnVjdCBfQ01hcF9Db2RlUmFuZ2UgewotICAgIGludAkJCW1fQ2hhclNpemU7Ci0gICAgdWludDhfdAkJbV9Mb3dlcls0XTsKLSAgICB1aW50OF90CQltX1VwcGVyWzRdOworICBpbnQgbV9DaGFyU2l6ZTsKKyAgdWludDhfdCBtX0xvd2VyWzRdOworICB1aW50OF90IG1fVXBwZXJbNF07CiB9OwotY2xhc3MgQ1BERl9DTWFwUGFyc2VyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9DTWFwUGFyc2VyKCk7Ci0gICAgfkNQREZfQ01hcFBhcnNlcigpIHt9Ci0gICAgRlhfQk9PTAlJbml0aWFsaXplKENQREZfQ01hcCopOwotICAgIHZvaWQJUGFyc2VXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKLSAgICBDRlhfQmluYXJ5QnVmCW1fQWRkTWFwczsKLXByaXZhdGU6Ci0gICAgQ1BERl9DTWFwKgltX3BDTWFwOwotICAgIGludAkJCQltX1N0YXR1czsKLSAgICBpbnQJCQkJbV9Db2RlU2VxOwotICAgIEZYX0RXT1JECQltX0NvZGVQb2ludHNbNF07Ci0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8X0NNYXBfQ29kZVJhbmdlPgltX0NvZGVSYW5nZXM7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJbV9SZWdpc3RyeSwgbV9PcmRlcmluZywgbV9TdXBwbGVtZW50OwotICAgIENGWF9CeXRlU3RyaW5nCW1fTGFzdFdvcmQ7CitjbGFzcyBDUERGX0NNYXBQYXJzZXIgeworIHB1YmxpYzoKKyAgQ1BERl9DTWFwUGFyc2VyKCk7CisgIH5DUERGX0NNYXBQYXJzZXIoKSB7fQorICBGWF9CT09MIEluaXRpYWxpemUoQ1BERl9DTWFwKik7CisgIHZvaWQgUGFyc2VXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKKyAgQ0ZYX0JpbmFyeUJ1ZiBtX0FkZE1hcHM7CisKKyBwcml2YXRlOgorICBDUERGX0NNYXAqIG1fcENNYXA7CisgIGludCBtX1N0YXR1czsKKyAgaW50IG1fQ29kZVNlcTsKKyAgRlhfRFdPUkQgbV9Db2RlUG9pbnRzWzRdOworICBDRlhfQXJyYXlUZW1wbGF0ZTxfQ01hcF9Db2RlUmFuZ2U+IG1fQ29kZVJhbmdlczsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9SZWdpc3RyeSwgbV9PcmRlcmluZywgbV9TdXBwbGVtZW50OworICBDRlhfQnl0ZVN0cmluZyBtX0xhc3RXb3JkOwogfTsKLSNkZWZpbmUgQ0lEQ09ESU5HX1VOS05PV04JMAotI2RlZmluZSBDSURDT0RJTkdfR0IJCTEKLSNkZWZpbmUgQ0lEQ09ESU5HX0JJRzUJCTIKLSNkZWZpbmUgQ0lEQ09ESU5HX0pJUwkJMwotI2RlZmluZSBDSURDT0RJTkdfS09SRUEJCTQKLSNkZWZpbmUgQ0lEQ09ESU5HX1VDUzIJCTUKLSNkZWZpbmUgQ0lEQ09ESU5HX0NJRAkJNgotI2RlZmluZSBDSURDT0RJTkdfVVRGMTYJCTcKLWNsYXNzIENQREZfQ01hcAotewotcHVibGljOgotICAgIENQREZfQ01hcCgpOwotICAgIEZYX0JPT0wJCQkJCUxvYWRQcmVkZWZpbmVkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsIGNvbnN0IEZYX0NIQVIqIG5hbWUsIEZYX0JPT0wgYlByb21wdENKSyk7Ci0gICAgRlhfQk9PTAkJCQkJTG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOwotICAgIHZvaWQJCQkJCVJlbGVhc2UoKTsKLSAgICBGWF9CT09MCQkJCQlJc0xvYWRlZCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iTG9hZGVkOwotICAgIH0KLSAgICBpbnQJCQkJCQlHZXRDaGFyc2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0NoYXJzZXQ7Ci0gICAgfQotICAgIEZYX0JPT0wJCQkJCUlzVmVydFdyaXRpbmcoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYlZlcnRpY2FsOwotICAgIH0KLSAgICBGWF9XT1JECQkJCQlDSURGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OwotICAgIEZYX0RXT1JECQkJCUNoYXJDb2RlRnJvbUNJRChGWF9XT1JEIENJRCkgY29uc3Q7Ci0gICAgaW50CQkJCQkJR2V0Q2hhclNpemUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OwotICAgIEZYX0RXT1JECQkJCUdldE5leHRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBuU3RyTGVuLCBpbnQmIG9mZnNldCkgY29uc3Q7Ci0gICAgaW50CQkJCQkJQ291bnRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBzaXplKSBjb25zdDsKLSAgICBpbnQJCQkJCQlBcHBlbmRDaGFyKEZYX0NIQVIqIHN0ciwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OwotICAgIHR5cGVkZWYgZW51bSB7T25lQnl0ZSwgVHdvQnl0ZXMsIE1peGVkVHdvQnl0ZXMsIE1peGVkRm91ckJ5dGVzfSBDb2RpbmdTY2hlbWU7Ci1wcm90ZWN0ZWQ6Ci0gICAgfkNQREZfQ01hcCgpOwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfQ01hcFBhcnNlcjsKLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX0NNYXBNYW5hZ2VyOwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfQ0lERm9udDsKLXByb3RlY3RlZDoKLSAgICBDRlhfQnl0ZVN0cmluZwkJCW1fUHJlZGVmaW5lZENNYXA7Ci0gICAgRlhfQk9PTAkJCQkJbV9iVmVydGljYWw7Ci0gICAgaW50CQkJCQkJbV9DaGFyc2V0LCBtX0NvZGluZzsKLSAgICBDb2RpbmdTY2hlbWUJCQltX0NvZGluZ1NjaGVtZTsKLSAgICBpbnQJCQkJCQltX25Db2RlUmFuZ2VzOwotICAgIHVpbnQ4X3QqCQkJCW1fcExlYWRpbmdCeXRlczsKLSAgICBGWF9XT1JEKgkJCQltX3BNYXBwaW5nOwotICAgIHVpbnQ4X3QqCQkJCW1fcEFkZE1hcHBpbmc7Ci0gICAgRlhfQk9PTAkJCQkJbV9iTG9hZGVkOwotICAgIGNvbnN0IEZYQ01BUF9DTWFwKgkJbV9wRW1iZWRNYXA7Ci0gICAgQ1BERl9DTWFwKgkJCQltX3BVc2VNYXA7CisjZGVmaW5lIENJRENPRElOR19VTktOT1dOIDAKKyNkZWZpbmUgQ0lEQ09ESU5HX0dCIDEKKyNkZWZpbmUgQ0lEQ09ESU5HX0JJRzUgMgorI2RlZmluZSBDSURDT0RJTkdfSklTIDMKKyNkZWZpbmUgQ0lEQ09ESU5HX0tPUkVBIDQKKyNkZWZpbmUgQ0lEQ09ESU5HX1VDUzIgNQorI2RlZmluZSBDSURDT0RJTkdfQ0lEIDYKKyNkZWZpbmUgQ0lEQ09ESU5HX1VURjE2IDcKK2NsYXNzIENQREZfQ01hcCB7CisgcHVibGljOgorICBDUERGX0NNYXAoKTsKKyAgRlhfQk9PTCBMb2FkUHJlZGVmaW5lZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvbXB0Q0pLKTsKKyAgRlhfQk9PTCBMb2FkRW1iZWRkZWQoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSk7CisgIHZvaWQgUmVsZWFzZSgpOworICBGWF9CT09MIElzTG9hZGVkKCkgY29uc3QgeyByZXR1cm4gbV9iTG9hZGVkOyB9CisgIGludCBHZXRDaGFyc2V0KCkgeyByZXR1cm4gbV9DaGFyc2V0OyB9CisgIEZYX0JPT0wgSXNWZXJ0V3JpdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fYlZlcnRpY2FsOyB9CisgIEZYX1dPUkQgQ0lERnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKKyAgRlhfRFdPUkQgQ2hhckNvZGVGcm9tQ0lEKEZYX1dPUkQgQ0lEKSBjb25zdDsKKyAgaW50IEdldENoYXJTaXplKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKKyAgRlhfRFdPUkQgR2V0TmV4dENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywgaW50IG5TdHJMZW4sIGludCYgb2Zmc2V0KSBjb25zdDsKKyAgaW50IENvdW50Q2hhcihjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgc2l6ZSkgY29uc3Q7CisgIGludCBBcHBlbmRDaGFyKEZYX0NIQVIqIHN0ciwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OworICB0eXBlZGVmIGVudW0geworICAgIE9uZUJ5dGUsCisgICAgVHdvQnl0ZXMsCisgICAgTWl4ZWRUd29CeXRlcywKKyAgICBNaXhlZEZvdXJCeXRlcworICB9IENvZGluZ1NjaGVtZTsKKworIHByb3RlY3RlZDoKKyAgfkNQREZfQ01hcCgpOworICBmcmllbmQgY2xhc3MgQ1BERl9DTWFwUGFyc2VyOworICBmcmllbmQgY2xhc3MgQ1BERl9DTWFwTWFuYWdlcjsKKyAgZnJpZW5kIGNsYXNzIENQREZfQ0lERm9udDsKKworIHByb3RlY3RlZDoKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9QcmVkZWZpbmVkQ01hcDsKKyAgRlhfQk9PTCBtX2JWZXJ0aWNhbDsKKyAgaW50IG1fQ2hhcnNldCwgbV9Db2Rpbmc7CisgIENvZGluZ1NjaGVtZSBtX0NvZGluZ1NjaGVtZTsKKyAgaW50IG1fbkNvZGVSYW5nZXM7CisgIHVpbnQ4X3QqIG1fcExlYWRpbmdCeXRlczsKKyAgRlhfV09SRCogbV9wTWFwcGluZzsKKyAgdWludDhfdCogbV9wQWRkTWFwcGluZzsKKyAgRlhfQk9PTCBtX2JMb2FkZWQ7CisgIGNvbnN0IEZYQ01BUF9DTWFwKiBtX3BFbWJlZE1hcDsKKyAgQ1BERl9DTWFwKiBtX3BVc2VNYXA7CiB9OwotY2xhc3MgQ1BERl9QcmVkZWZpbmVkQ01hcAotewotcHVibGljOgotICAgIGNvbnN0IEZYX0NIQVIqCW1fcE5hbWU7Ci0gICAgaW50CQkJbV9DaGFyc2V0OwotICAgIGludAkJCW1fQ29kaW5nOwotICAgIENQREZfQ01hcDo6Q29kaW5nU2NoZW1lCW1fQ29kaW5nU2NoZW1lOwotICAgIEZYX0RXT1JECW1fTGVhZGluZ1NlZ0NvdW50OwotICAgIHVpbnQ4X3QJCW1fTGVhZGluZ1NlZ3NbNF07CitjbGFzcyBDUERGX1ByZWRlZmluZWRDTWFwIHsKKyBwdWJsaWM6CisgIGNvbnN0IEZYX0NIQVIqIG1fcE5hbWU7CisgIGludCBtX0NoYXJzZXQ7CisgIGludCBtX0NvZGluZzsKKyAgQ1BERl9DTWFwOjpDb2RpbmdTY2hlbWUgbV9Db2RpbmdTY2hlbWU7CisgIEZYX0RXT1JEIG1fTGVhZGluZ1NlZ0NvdW50OworICB1aW50OF90IG1fTGVhZGluZ1NlZ3NbNF07CiB9OwogdHlwZWRlZiBzdHJ1Y3QgX0ZpbGVIZWFkZXIgewotICAgIHVpbnQ4X3QJCWJ0VGFnWzRdOwotICAgIHVpbnQ4X3QJCWJ0VmVyc2lvbjsKLSAgICB1aW50OF90CQlidEZvcm1hdDsKLSAgICB1aW50OF90CQlidFJlc2VydmVkMVsyXTsKLSAgICBGWF9EV09SRAlkd1N0YXJ0SW5kZXg7Ci0gICAgRlhfRFdPUkQJZHdFbmRJbmRleDsKLSAgICBGWF9EV09SRAlkd0RhdGFTaXplOwotICAgIEZYX0RXT1JECWR3RGF0YU9mZnNldDsKLSAgICBGWF9EV09SRAlkd1JlY29yZFNpemU7CisgIHVpbnQ4X3QgYnRUYWdbNF07CisgIHVpbnQ4X3QgYnRWZXJzaW9uOworICB1aW50OF90IGJ0Rm9ybWF0OworICB1aW50OF90IGJ0UmVzZXJ2ZWQxWzJdOworICBGWF9EV09SRCBkd1N0YXJ0SW5kZXg7CisgIEZYX0RXT1JEIGR3RW5kSW5kZXg7CisgIEZYX0RXT1JEIGR3RGF0YVNpemU7CisgIEZYX0RXT1JEIGR3RGF0YU9mZnNldDsKKyAgRlhfRFdPUkQgZHdSZWNvcmRTaXplOwogfSBGWE1QX0ZJTEVIRUFERVI7Ci1jbGFzcyBDUERGX0NJRDJVbmljb2RlTWFwCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9DSUQyVW5pY29kZU1hcCgpOwotICAgIH5DUERGX0NJRDJVbmljb2RlTWFwKCk7Ci0gICAgRlhfQk9PTAkJSW5pdGlhbGl6ZSgpOwotICAgIEZYX0JPT0wJCUlzTG9hZGVkKCk7Ci0gICAgdm9pZAkJTG9hZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0Q0pLKTsKLSAgICBGWF9XQ0hBUglVbmljb2RlRnJvbUNJRChGWF9XT1JEIENJRCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgaW50CQkJbV9DaGFyc2V0OwotICAgIGNvbnN0IEZYX1dPUkQqCW1fcEVtYmVkZGVkTWFwOwotICAgIEZYX0RXT1JECW1fRW1iZWRkZWRDb3VudDsKK2NsYXNzIENQREZfQ0lEMlVuaWNvZGVNYXAgeworIHB1YmxpYzoKKyAgQ1BERl9DSUQyVW5pY29kZU1hcCgpOworICB+Q1BERl9DSUQyVW5pY29kZU1hcCgpOworICBGWF9CT09MIEluaXRpYWxpemUoKTsKKyAgRlhfQk9PTCBJc0xvYWRlZCgpOworICB2b2lkIExvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdENKSyk7CisgIEZYX1dDSEFSIFVuaWNvZGVGcm9tQ0lEKEZYX1dPUkQgQ0lEKTsKKworIHByb3RlY3RlZDoKKyAgaW50IG1fQ2hhcnNldDsKKyAgY29uc3QgRlhfV09SRCogbV9wRW1iZWRkZWRNYXA7CisgIEZYX0RXT1JEIG1fRW1iZWRkZWRDb3VudDsKIH07Ci1jbGFzcyBDUERGX1RvVW5pY29kZU1hcAotewotcHVibGljOgotICAgIHZvaWQJCQkJCUxvYWQoQ1BERl9TdHJlYW0qIHBTdHJlYW0pOwotICAgIENGWF9XaWRlU3RyaW5nCQkJTG9va3VwKEZYX0RXT1JEIGNoYXJjb2RlKTsKLSAgICBGWF9EV09SRAkJCQlSZXZlcnNlTG9va3VwKEZYX1dDSEFSIHVuaWNvZGUpOwotcHJvdGVjdGVkOgotICAgIENGWF9DTWFwRFdvcmRUb0RXb3JkCW1fTWFwOwotICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqCW1fcEJhc2VNYXA7Ci0gICAgQ0ZYX1dpZGVUZXh0QnVmCQkJbV9NdWx0aUNoYXJCdWY7CitjbGFzcyBDUERGX1RvVW5pY29kZU1hcCB7CisgcHVibGljOgorICB2b2lkIExvYWQoQ1BERl9TdHJlYW0qIHBTdHJlYW0pOworICBDRlhfV2lkZVN0cmluZyBMb29rdXAoRlhfRFdPUkQgY2hhcmNvZGUpOworICBGWF9EV09SRCBSZXZlcnNlTG9va3VwKEZYX1dDSEFSIHVuaWNvZGUpOworCisgcHJvdGVjdGVkOgorICBDRlhfQ01hcERXb3JkVG9EV29yZCBtX01hcDsKKyAgQ1BERl9DSUQyVW5pY29kZU1hcCogbV9wQmFzZU1hcDsKKyAgQ0ZYX1dpZGVUZXh0QnVmIG1fTXVsdGlDaGFyQnVmOwogfTsKLWNsYXNzIENQREZfRm9udENoYXJNYXAgOiBwdWJsaWMgQ0ZYX0NoYXJNYXAKLXsKLXB1YmxpYzoKLSAgICBDUERGX0ZvbnRDaGFyTWFwKENQREZfRm9udCogcEZvbnQpOwotICAgIENQREZfRm9udCoJCW1fcEZvbnQ7CitjbGFzcyBDUERGX0ZvbnRDaGFyTWFwIDogcHVibGljIENGWF9DaGFyTWFwIHsKKyBwdWJsaWM6CisgIENQREZfRm9udENoYXJNYXAoQ1BERl9Gb250KiBwRm9udCk7CisgIENQREZfRm9udCogbV9wRm9udDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlBERkFQSV9GUERGX0ZPTlRfRk9OVF9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnQuY3BwCmluZGV4IDgwMzdhOGMuLjAxMDcwMDAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250LmNwcApAQCAtMTIsMTczNSArMTIsMTc4NiBAQAogI2luY2x1ZGUgIi4uL2ZwZGZfcGFnZS9wYWdlaW50LmgiCiAjaW5jbHVkZSAiZm9udF9pbnQuaCIKIAotRlhfQk9PTCBGVF9Vc2VUVENoYXJtYXAoRlhGVF9GYWNlIGZhY2UsIGludCBwbGF0Zm9ybV9pZCwgaW50IGVuY29kaW5nX2lkKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSk7IGkgKyspIHsKLSAgICAgICAgaWYgKEZYRlRfR2V0X0NoYXJtYXBfUGxhdGZvcm1JRChGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW2ldKSA9PSBwbGF0Zm9ybV9pZCAmJgotICAgICAgICAgICAgICAgIEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmdJRChGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW2ldKSA9PSBlbmNvZGluZ19pZCkgewotICAgICAgICAgICAgRlhGVF9TZXRfQ2hhcm1hcChmYWNlLCBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW2ldKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9CitGWF9CT09MIEZUX1VzZVRUQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwgaW50IHBsYXRmb3JtX2lkLCBpbnQgZW5jb2RpbmdfaWQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsgaSsrKSB7CisgICAgaWYgKEZYRlRfR2V0X0NoYXJtYXBfUGxhdGZvcm1JRChGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW2ldKSA9PQorICAgICAgICAgICAgcGxhdGZvcm1faWQgJiYKKyAgICAgICAgRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZ0lEKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pID09CisgICAgICAgICAgICBlbmNvZGluZ19pZCkgeworICAgICAgRlhGVF9TZXRfQ2hhcm1hcChmYWNlLCBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW2ldKTsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotQ1BERl9Gb250R2xvYmFsczo6Q1BERl9Gb250R2xvYmFscygpCi0gICAgOiBtX3BDb250cmFzdFJhbXBzKE5VTEwpCi17Ci0gICAgRlhTWVNfbWVtc2V0KG1fRW1iZWRkZWRDaGFyc2V0cywgMCwgc2l6ZW9mKG1fRW1iZWRkZWRDaGFyc2V0cykpOwotICAgIEZYU1lTX21lbXNldChtX0VtYmVkZGVkVG9Vbmljb2RlcywgMCwgc2l6ZW9mKG1fRW1iZWRkZWRUb1VuaWNvZGVzKSk7CitDUERGX0ZvbnRHbG9iYWxzOjpDUERGX0ZvbnRHbG9iYWxzKCkgOiBtX3BDb250cmFzdFJhbXBzKE5VTEwpIHsKKyAgRlhTWVNfbWVtc2V0KG1fRW1iZWRkZWRDaGFyc2V0cywgMCwgc2l6ZW9mKG1fRW1iZWRkZWRDaGFyc2V0cykpOworICBGWFNZU19tZW1zZXQobV9FbWJlZGRlZFRvVW5pY29kZXMsIDAsIHNpemVvZihtX0VtYmVkZGVkVG9Vbmljb2RlcykpOwogfQotQ1BERl9Gb250R2xvYmFsczo6fkNQREZfRm9udEdsb2JhbHMoKQotewotICAgIENsZWFyQWxsKCk7Ci0gICAgaWYgKG1fcENvbnRyYXN0UmFtcHMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDb250cmFzdFJhbXBzKTsKLSAgICB9CitDUERGX0ZvbnRHbG9iYWxzOjp+Q1BERl9Gb250R2xvYmFscygpIHsKKyAgQ2xlYXJBbGwoKTsKKyAgaWYgKG1fcENvbnRyYXN0UmFtcHMpIHsKKyAgICBGWF9GcmVlKG1fcENvbnRyYXN0UmFtcHMpOworICB9CiB9Ci1jbGFzcyBDRlhfU3RvY2tGb250QXJyYXkKLXsKLXB1YmxpYzoKLSAgICBDRlhfU3RvY2tGb250QXJyYXkoKQotICAgIHsKLSAgICAgICAgRlhTWVNfbWVtc2V0KG1fcFN0b2NrRm9udHMsIDAsIHNpemVvZihtX3BTdG9ja0ZvbnRzKSk7CitjbGFzcyBDRlhfU3RvY2tGb250QXJyYXkgeworIHB1YmxpYzoKKyAgQ0ZYX1N0b2NrRm9udEFycmF5KCkgeworICAgIEZYU1lTX21lbXNldChtX3BTdG9ja0ZvbnRzLCAwLCBzaXplb2YobV9wU3RvY2tGb250cykpOworICB9CisgIH5DRlhfU3RvY2tGb250QXJyYXkoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUobV9wU3RvY2tGb250cyk7IGkrKykgeworICAgICAgaWYgKCFtX3BTdG9ja0ZvbnRzW2ldKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gbV9wU3RvY2tGb250c1tpXS0+R2V0Rm9udERpY3QoKTsKKyAgICAgIGlmIChwRm9udERpY3QpCisgICAgICAgIHBGb250RGljdC0+UmVsZWFzZSgpOworICAgICAgZGVsZXRlIG1fcFN0b2NrRm9udHNbaV07CiAgICAgfQotICAgIH5DRlhfU3RvY2tGb250QXJyYXkoKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUobV9wU3RvY2tGb250cyk7IGkrKykgewotICAgICAgICAgICAgaWYgKCFtX3BTdG9ja0ZvbnRzW2ldKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBtX3BTdG9ja0ZvbnRzW2ldLT5HZXRGb250RGljdCgpOwotICAgICAgICAgICAgaWYgKHBGb250RGljdCkKLSAgICAgICAgICAgICAgICBwRm9udERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BTdG9ja0ZvbnRzW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIENQREZfRm9udCogR2V0Rm9udChpbnQgaW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IEZYX0FycmF5U2l6ZShtX3BTdG9ja0ZvbnRzKSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICByZXR1cm4gbV9wU3RvY2tGb250c1tpbmRleF07Ci0gICAgfQotICAgIHZvaWQgU2V0Rm9udChpbnQgaW5kZXgsIENQREZfRm9udCogZm9udCkKLSAgICB7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gRlhfQXJyYXlTaXplKG1fcFN0b2NrRm9udHMpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBkZWxldGUgbV9wU3RvY2tGb250c1tpbmRleF07Ci0gICAgICAgIG1fcFN0b2NrRm9udHNbaW5kZXhdID0gZm9udDsKLSAgICB9Ci1wcml2YXRlOgotICAgIENQREZfRm9udCogbV9wU3RvY2tGb250c1sxNF07CisgIH0KKyAgQ1BERl9Gb250KiBHZXRGb250KGludCBpbmRleCkgY29uc3QgeworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gRlhfQXJyYXlTaXplKG1fcFN0b2NrRm9udHMpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG1fcFN0b2NrRm9udHNbaW5kZXhdOworICB9CisgIHZvaWQgU2V0Rm9udChpbnQgaW5kZXgsIENQREZfRm9udCogZm9udCkgeworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gRlhfQXJyYXlTaXplKG1fcFN0b2NrRm9udHMpKQorICAgICAgcmV0dXJuOworICAgIGRlbGV0ZSBtX3BTdG9ja0ZvbnRzW2luZGV4XTsKKyAgICBtX3BTdG9ja0ZvbnRzW2luZGV4XSA9IGZvbnQ7CisgIH0KKworIHByaXZhdGU6CisgIENQREZfRm9udCogbV9wU3RvY2tGb250c1sxNF07CiB9OwotQ1BERl9Gb250KiBDUERGX0ZvbnRHbG9iYWxzOjpGaW5kKHZvaWQqIGtleSwgaW50IGluZGV4KQotewotICAgIHZvaWQqIHZhbHVlID0gTlVMTDsKLSAgICBpZiAoIW1fcFN0b2NrTWFwLkxvb2t1cChrZXksIHZhbHVlKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCF2YWx1ZSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENGWF9TdG9ja0ZvbnRBcnJheSo+KHZhbHVlKS0+R2V0Rm9udChpbmRleCk7CitDUERGX0ZvbnQqIENQREZfRm9udEdsb2JhbHM6OkZpbmQodm9pZCoga2V5LCBpbnQgaW5kZXgpIHsKKyAgdm9pZCogdmFsdWUgPSBOVUxMOworICBpZiAoIW1fcFN0b2NrTWFwLkxvb2t1cChrZXksIHZhbHVlKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghdmFsdWUpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZYX1N0b2NrRm9udEFycmF5Kj4odmFsdWUpLT5HZXRGb250KGluZGV4KTsKIH0KLXZvaWQgQ1BERl9Gb250R2xvYmFsczo6U2V0KHZvaWQqIGtleSwgaW50IGluZGV4LCBDUERGX0ZvbnQqIHBGb250KQotewotICAgIHZvaWQqIHZhbHVlID0gTlVMTDsKLSAgICBDRlhfU3RvY2tGb250QXJyYXkqIGZvbnRfYXJyYXkgPSBOVUxMOwotICAgIGlmIChtX3BTdG9ja01hcC5Mb29rdXAoa2V5LCB2YWx1ZSkpIHsKLSAgICAgICAgZm9udF9hcnJheSA9IHN0YXRpY19jYXN0PENGWF9TdG9ja0ZvbnRBcnJheSo+KHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb250X2FycmF5ID0gbmV3IENGWF9TdG9ja0ZvbnRBcnJheSgpOwotICAgICAgICBtX3BTdG9ja01hcC5TZXRBdChrZXksIGZvbnRfYXJyYXkpOwotICAgIH0KLSAgICBmb250X2FycmF5LT5TZXRGb250KGluZGV4LCBwRm9udCk7Cit2b2lkIENQREZfRm9udEdsb2JhbHM6OlNldCh2b2lkKiBrZXksIGludCBpbmRleCwgQ1BERl9Gb250KiBwRm9udCkgeworICB2b2lkKiB2YWx1ZSA9IE5VTEw7CisgIENGWF9TdG9ja0ZvbnRBcnJheSogZm9udF9hcnJheSA9IE5VTEw7CisgIGlmIChtX3BTdG9ja01hcC5Mb29rdXAoa2V5LCB2YWx1ZSkpIHsKKyAgICBmb250X2FycmF5ID0gc3RhdGljX2Nhc3Q8Q0ZYX1N0b2NrRm9udEFycmF5Kj4odmFsdWUpOworICB9IGVsc2UgeworICAgIGZvbnRfYXJyYXkgPSBuZXcgQ0ZYX1N0b2NrRm9udEFycmF5KCk7CisgICAgbV9wU3RvY2tNYXAuU2V0QXQoa2V5LCBmb250X2FycmF5KTsKKyAgfQorICBmb250X2FycmF5LT5TZXRGb250KGluZGV4LCBwRm9udCk7CiB9Ci12b2lkIENQREZfRm9udEdsb2JhbHM6OkNsZWFyKHZvaWQqIGtleSkKLXsKK3ZvaWQgQ1BERl9Gb250R2xvYmFsczo6Q2xlYXIodm9pZCoga2V5KSB7CisgIHZvaWQqIHZhbHVlID0gTlVMTDsKKyAgaWYgKCFtX3BTdG9ja01hcC5Mb29rdXAoa2V5LCB2YWx1ZSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgZGVsZXRlIHN0YXRpY19jYXN0PENGWF9TdG9ja0ZvbnRBcnJheSo+KHZhbHVlKTsKKyAgbV9wU3RvY2tNYXAuUmVtb3ZlS2V5KGtleSk7Cit9Cit2b2lkIENQREZfRm9udEdsb2JhbHM6OkNsZWFyQWxsKCkgeworICBGWF9QT1NJVElPTiBwb3MgPSBtX3BTdG9ja01hcC5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICB2b2lkKiBrZXkgPSBOVUxMOwogICAgIHZvaWQqIHZhbHVlID0gTlVMTDsKLSAgICBpZiAoIW1fcFN0b2NrTWFwLkxvb2t1cChrZXksIHZhbHVlKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIG1fcFN0b2NrTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwogICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxDRlhfU3RvY2tGb250QXJyYXkqPih2YWx1ZSk7CiAgICAgbV9wU3RvY2tNYXAuUmVtb3ZlS2V5KGtleSk7CisgIH0KIH0KLXZvaWQgQ1BERl9Gb250R2xvYmFsczo6Q2xlYXJBbGwoKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fcFN0b2NrTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIHZvaWQqIGtleSA9IE5VTEw7Ci0gICAgICAgIHZvaWQqIHZhbHVlID0gTlVMTDsKLSAgICAgICAgbV9wU3RvY2tNYXAuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxDRlhfU3RvY2tGb250QXJyYXkqPih2YWx1ZSk7Ci0gICAgICAgIG1fcFN0b2NrTWFwLlJlbW92ZUtleShrZXkpOwotICAgIH0KK0NQREZfRm9udDo6Q1BERl9Gb250KGludCBmb250dHlwZSkgOiBtX0ZvbnRUeXBlKGZvbnR0eXBlKSB7CisgIG1fRm9udEJCb3gubGVmdCA9IG1fRm9udEJCb3gucmlnaHQgPSBtX0ZvbnRCQm94LnRvcCA9IG1fRm9udEJCb3guYm90dG9tID0gMDsKKyAgbV9TdGVtViA9IG1fQXNjZW50ID0gbV9EZXNjZW50ID0gbV9JdGFsaWNBbmdsZSA9IDA7CisgIG1fcEZvbnRGaWxlID0gTlVMTDsKKyAgbV9GbGFncyA9IDA7CisgIG1fcFRvVW5pY29kZU1hcCA9IE5VTEw7CisgIG1fYlRvVW5pY29kZUxvYWRlZCA9IEZBTFNFOworICBtX3BDaGFyTWFwID0gbmV3IENQREZfRm9udENoYXJNYXAodGhpcyk7CiB9Ci1DUERGX0ZvbnQ6OkNQREZfRm9udChpbnQgZm9udHR5cGUpIDogbV9Gb250VHlwZShmb250dHlwZSkKLXsKLSAgICBtX0ZvbnRCQm94LmxlZnQgPSBtX0ZvbnRCQm94LnJpZ2h0ID0gbV9Gb250QkJveC50b3AgPSBtX0ZvbnRCQm94LmJvdHRvbSA9IDA7Ci0gICAgbV9TdGVtViA9IG1fQXNjZW50ID0gbV9EZXNjZW50ID0gbV9JdGFsaWNBbmdsZSA9IDA7Ci0gICAgbV9wRm9udEZpbGUgPSBOVUxMOwotICAgIG1fRmxhZ3MgPSAwOwotICAgIG1fcFRvVW5pY29kZU1hcCA9IE5VTEw7Ci0gICAgbV9iVG9Vbmljb2RlTG9hZGVkID0gRkFMU0U7Ci0gICAgbV9wQ2hhck1hcCA9IG5ldyBDUERGX0ZvbnRDaGFyTWFwKHRoaXMpOwotfQotQ1BERl9Gb250Ojp+Q1BERl9Gb250KCkKLXsKLSAgICBkZWxldGUgbV9wQ2hhck1hcDsKLSAgICBtX3BDaGFyTWFwID0gTlVMTDsKK0NQREZfRm9udDo6fkNQREZfRm9udCgpIHsKKyAgZGVsZXRlIG1fcENoYXJNYXA7CisgIG1fcENoYXJNYXAgPSBOVUxMOwogCi0gICAgZGVsZXRlIG1fcFRvVW5pY29kZU1hcDsKLSAgICBtX3BUb1VuaWNvZGVNYXAgPSBOVUxMOworICBkZWxldGUgbV9wVG9Vbmljb2RlTWFwOworICBtX3BUb1VuaWNvZGVNYXAgPSBOVUxMOwogCi0gICAgaWYgKG1fcEZvbnRGaWxlKSB7Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoKENQREZfU3RyZWFtKiltX3BGb250RmlsZS0+R2V0U3RyZWFtKCkpOwotICAgIH0KKyAgaWYgKG1fcEZvbnRGaWxlKSB7CisgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VGb250RmlsZVN0cmVhbUFjYygKKyAgICAgICAgKENQREZfU3RyZWFtKiltX3BGb250RmlsZS0+R2V0U3RyZWFtKCkpOworICB9CiB9Ci1GWF9CT09MIENQREZfRm9udDo6SXNWZXJ0V3JpdGluZygpIGNvbnN0Ci17Ci0gICAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBGQUxTRTsKLSAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gR2V0Q0lERm9udCgpOwotICAgIGlmIChwQ0lERm9udCkgewotICAgICAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOworRlhfQk9PTCBDUERGX0ZvbnQ6OklzVmVydFdyaXRpbmcoKSBjb25zdCB7CisgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CisgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBHZXRDSURGb250KCk7CisgIGlmIChwQ0lERm9udCkgeworICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CisgIH0gZWxzZSB7CisgICAgYlZlcnRXcml0aW5nID0gbV9Gb250LklzVmVydGljYWwoKTsKKyAgfQorICByZXR1cm4gYlZlcnRXcml0aW5nOworfQorQ0ZYX0J5dGVTdHJpbmcgQ1BERl9Gb250OjpHZXRGb250VHlwZU5hbWUoKSBjb25zdCB7CisgIHN3aXRjaCAobV9Gb250VHlwZSkgeworICAgIGNhc2UgUERGRk9OVF9UWVBFMToKKyAgICAgIHJldHVybiBGWF9CU1RSQygiVHlwZTEiKTsKKyAgICBjYXNlIFBERkZPTlRfVFJVRVRZUEU6CisgICAgICByZXR1cm4gRlhfQlNUUkMoIlRydWVUeXBlIik7CisgICAgY2FzZSBQREZGT05UX1RZUEUzOgorICAgICAgcmV0dXJuIEZYX0JTVFJDKCJUeXBlMyIpOworICAgIGNhc2UgUERGRk9OVF9DSURGT05UOgorICAgICAgcmV0dXJuIEZYX0JTVFJDKCJUeXBlMCIpOworICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworfQordm9pZCBDUERGX0ZvbnQ6OkFwcGVuZENoYXIoQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsKKyAgY2hhciBidWZbNF07CisgIGludCBsZW4gPSBBcHBlbmRDaGFyKGJ1ZiwgY2hhcmNvZGUpOworICBpZiAobGVuID09IDEpIHsKKyAgICBzdHIgKz0gYnVmWzBdOworICB9IGVsc2UgeworICAgIHN0ciArPSBDRlhfQnl0ZVN0cmluZyhidWYsIGxlbik7CisgIH0KK30KK0NGWF9XaWRlU3RyaW5nIENQREZfRm9udDo6VW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QgeworICBpZiAoIW1fYlRvVW5pY29kZUxvYWRlZCkgeworICAgICgoQ1BERl9Gb250Kil0aGlzKS0+TG9hZFVuaWNvZGVNYXAoKTsKKyAgfQorICBpZiAobV9wVG9Vbmljb2RlTWFwKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQgPSBtX3BUb1VuaWNvZGVNYXAtPkxvb2t1cChjaGFyY29kZSk7CisgICAgaWYgKCF3c1JldC5Jc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiB3c1JldDsKKyAgICB9CisgIH0KKyAgRlhfV0NIQVIgdW5pY29kZSA9IF9Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgaWYgKHVuaWNvZGUgPT0gMCkgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisgIHJldHVybiB1bmljb2RlOworfQorRlhfRFdPUkQgQ1BERl9Gb250OjpDaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIHVuaWNvZGUpIGNvbnN0IHsKKyAgaWYgKCFtX2JUb1VuaWNvZGVMb2FkZWQpIHsKKyAgICAoKENQREZfRm9udCopdGhpcyktPkxvYWRVbmljb2RlTWFwKCk7CisgIH0KKyAgaWYgKG1fcFRvVW5pY29kZU1hcCkgeworICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gbV9wVG9Vbmljb2RlTWFwLT5SZXZlcnNlTG9va3VwKHVuaWNvZGUpOworICAgIGlmIChjaGFyY29kZSkgeworICAgICAgcmV0dXJuIGNoYXJjb2RlOworICAgIH0KKyAgfQorICByZXR1cm4gX0NoYXJDb2RlRnJvbVVuaWNvZGUodW5pY29kZSk7Cit9CitDRlhfV2lkZVN0cmluZyBDUERGX0ZvbnQ6OkRlY29kZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSBjb25zdCB7CisgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKKyAgaW50IHNyY19sZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIHJlc3VsdC5SZXNlcnZlKHNyY19sZW4pOworICBjb25zdCBGWF9DSEFSKiBzcmNfYnVmID0gc3RyOworICBpbnQgc3JjX3BvcyA9IDA7CisgIHdoaWxlIChzcmNfcG9zIDwgc3JjX2xlbikgeworICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gR2V0TmV4dENoYXIoc3JjX2J1Ziwgc3JjX2xlbiwgc3JjX3Bvcyk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9IFVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICAgIGlmICghdW5pY29kZS5Jc0VtcHR5KCkpIHsKKyAgICAgIHJlc3VsdCArPSB1bmljb2RlOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJWZXJ0V3JpdGluZyA9IG1fRm9udC5Jc1ZlcnRpY2FsKCk7CisgICAgICByZXN1bHQgKz0gKEZYX1dDSEFSKWNoYXJjb2RlOwogICAgIH0KLSAgICByZXR1cm4gYlZlcnRXcml0aW5nOworICB9CisgIHJldHVybiByZXN1bHQ7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0ZvbnQ6OkdldEZvbnRUeXBlTmFtZSgpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX0ZvbnRUeXBlKSB7Ci0gICAgICAgIGNhc2UgUERGRk9OVF9UWVBFMToKLSAgICAgICAgICAgIHJldHVybiBGWF9CU1RSQygiVHlwZTEiKTsKLSAgICAgICAgY2FzZSBQREZGT05UX1RSVUVUWVBFOgotICAgICAgICAgICAgcmV0dXJuIEZYX0JTVFJDKCJUcnVlVHlwZSIpOwotICAgICAgICBjYXNlIFBERkZPTlRfVFlQRTM6Ci0gICAgICAgICAgICByZXR1cm4gRlhfQlNUUkMoIlR5cGUzIik7Ci0gICAgICAgIGNhc2UgUERGRk9OVF9DSURGT05UOgotICAgICAgICAgICAgcmV0dXJuIEZYX0JTVFJDKCJUeXBlMCIpOwotICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKK0NGWF9CeXRlU3RyaW5nIENQREZfRm9udDo6RW5jb2RlU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIGNvbnN0IHsKKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OworICBpbnQgc3JjX2xlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgRlhfQ0hBUiogZGVzdF9idWYgPSByZXN1bHQuR2V0QnVmZmVyKHNyY19sZW4gKiAyKTsKKyAgY29uc3QgRlhfV0NIQVIqIHNyY19idWYgPSBzdHIuY19zdHIoKTsKKyAgaW50IGRlc3RfcG9zID0gMDsKKyAgZm9yIChpbnQgc3JjX3BvcyA9IDA7IHNyY19wb3MgPCBzcmNfbGVuOyBzcmNfcG9zKyspIHsKKyAgICBGWF9EV09SRCBjaGFyY29kZSA9IENoYXJDb2RlRnJvbVVuaWNvZGUoc3JjX2J1ZltzcmNfcG9zXSk7CisgICAgZGVzdF9wb3MgKz0gQXBwZW5kQ2hhcihkZXN0X2J1ZiArIGRlc3RfcG9zLCBjaGFyY29kZSk7CisgIH0KKyAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoZGVzdF9wb3MpOworICByZXR1cm4gcmVzdWx0OwogfQotdm9pZCBDUERGX0ZvbnQ6OkFwcGVuZENoYXIoQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci17Ci0gICAgY2hhciBidWZbNF07Ci0gICAgaW50IGxlbiA9IEFwcGVuZENoYXIoYnVmLCBjaGFyY29kZSk7Ci0gICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgIHN0ciArPSBidWZbMF07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RyICs9IENGWF9CeXRlU3RyaW5nKGJ1ZiwgbGVuKTsKK3ZvaWQgQ1BERl9Gb250OjpMb2FkRm9udERlc2NyaXB0b3IoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MpIHsKKyAgbV9GbGFncyA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiRmxhZ3MiKSwgUERGRk9OVF9OT05TWU1CT0xJQyk7CisgIGludCBJdGFsaWNBbmdsZSA9IDA7CisgIEZYX0JPT0wgYkV4aXN0SXRhbGljQW5nbGUgPSBGQUxTRTsKKyAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkl0YWxpY0FuZ2xlIikpKSB7CisgICAgSXRhbGljQW5nbGUgPSBwRm9udERlc2MtPkdldEludGVnZXIoRlhfQlNUUkMoIkl0YWxpY0FuZ2xlIikpOworICAgIGJFeGlzdEl0YWxpY0FuZ2xlID0gVFJVRTsKKyAgfQorICBpZiAoSXRhbGljQW5nbGUgPCAwKSB7CisgICAgbV9GbGFncyB8PSBQREZGT05UX0lUQUxJQzsKKyAgICBtX0l0YWxpY0FuZ2xlID0gSXRhbGljQW5nbGU7CisgIH0KKyAgRlhfQk9PTCBiRXhpc3RTdGVtViA9IEZBTFNFOworICBpZiAocEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiU3RlbVYiKSkpIHsKKyAgICBtX1N0ZW1WID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJTdGVtViIpKTsKKyAgICBiRXhpc3RTdGVtViA9IFRSVUU7CisgIH0KKyAgRlhfQk9PTCBiRXhpc3RBc2NlbnQgPSBGQUxTRTsKKyAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkFzY2VudCIpKSkgeworICAgIG1fQXNjZW50ID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJBc2NlbnQiKSk7CisgICAgYkV4aXN0QXNjZW50ID0gVFJVRTsKKyAgfQorICBGWF9CT09MIGJFeGlzdERlc2NlbnQgPSBGQUxTRTsKKyAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkRlc2NlbnQiKSkpIHsKKyAgICBtX0Rlc2NlbnQgPSBwRm9udERlc2MtPkdldEludGVnZXIoRlhfQlNUUkMoIkRlc2NlbnQiKSk7CisgICAgYkV4aXN0RGVzY2VudCA9IFRSVUU7CisgIH0KKyAgRlhfQk9PTCBiRXhpc3RDYXBIZWlnaHQgPSBGQUxTRTsKKyAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkNhcEhlaWdodCIpKSkgeworICAgIGJFeGlzdENhcEhlaWdodCA9IFRSVUU7CisgIH0KKyAgaWYgKGJFeGlzdEl0YWxpY0FuZ2xlICYmIGJFeGlzdEFzY2VudCAmJiBiRXhpc3RDYXBIZWlnaHQgJiYgYkV4aXN0RGVzY2VudCAmJgorICAgICAgYkV4aXN0U3RlbVYpIHsKKyAgICBtX0ZsYWdzIHw9IFBERkZPTlRfVVNFRVhURVJOQVRUUjsKKyAgfQorICBpZiAobV9EZXNjZW50ID4gMTApIHsKKyAgICBtX0Rlc2NlbnQgPSAtbV9EZXNjZW50OworICB9CisgIENQREZfQXJyYXkqIHBCQm94ID0gcEZvbnREZXNjLT5HZXRBcnJheShGWF9CU1RSQygiRm9udEJCb3giKSk7CisgIGlmIChwQkJveCkgeworICAgIG1fRm9udEJCb3gubGVmdCA9IHBCQm94LT5HZXRJbnRlZ2VyKDApOworICAgIG1fRm9udEJCb3guYm90dG9tID0gcEJCb3gtPkdldEludGVnZXIoMSk7CisgICAgbV9Gb250QkJveC5yaWdodCA9IHBCQm94LT5HZXRJbnRlZ2VyKDIpOworICAgIG1fRm9udEJCb3gudG9wID0gcEJCb3gtPkdldEludGVnZXIoMyk7CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBGb250RmlsZSA9IHBGb250RGVzYy0+R2V0U3RyZWFtKEZYX0JTVFJDKCJGb250RmlsZSIpKTsKKyAgaWYgKHBGb250RmlsZSA9PSBOVUxMKSB7CisgICAgcEZvbnRGaWxlID0gcEZvbnREZXNjLT5HZXRTdHJlYW0oRlhfQlNUUkMoIkZvbnRGaWxlMiIpKTsKKyAgfQorICBpZiAocEZvbnRGaWxlID09IE5VTEwpIHsKKyAgICBwRm9udEZpbGUgPSBwRm9udERlc2MtPkdldFN0cmVhbShGWF9CU1RSQygiRm9udEZpbGUzIikpOworICB9CisgIGlmIChwRm9udEZpbGUpIHsKKyAgICBtX3BGb250RmlsZSA9IG1fcERvY3VtZW50LT5Mb2FkRm9udEZpbGUocEZvbnRGaWxlKTsKKyAgICBpZiAobV9wRm9udEZpbGUgPT0gTlVMTCkgeworICAgICAgcmV0dXJuOwogICAgIH0KLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfRm9udDo6VW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKLXsKLSAgICBpZiAoIW1fYlRvVW5pY29kZUxvYWRlZCkgewotICAgICAgICAoKENQREZfRm9udCopdGhpcyktPkxvYWRVbmljb2RlTWFwKCk7Ci0gICAgfQotICAgIGlmIChtX3BUb1VuaWNvZGVNYXApIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQgPSBtX3BUb1VuaWNvZGVNYXAtPkxvb2t1cChjaGFyY29kZSk7Ci0gICAgICAgIGlmICghd3NSZXQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3NSZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfV0NIQVIgdW5pY29kZSA9IF9Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICBpZiAodW5pY29kZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gdW5pY29kZTsKLX0KLUZYX0RXT1JEIENQREZfRm9udDo6Q2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKSBjb25zdAotewotICAgIGlmICghbV9iVG9Vbmljb2RlTG9hZGVkKSB7Ci0gICAgICAgICgoQ1BERl9Gb250Kil0aGlzKS0+TG9hZFVuaWNvZGVNYXAoKTsKLSAgICB9Ci0gICAgaWYgKG1fcFRvVW5pY29kZU1hcCkgewotICAgICAgICBGWF9EV09SRCBjaGFyY29kZSA9IG1fcFRvVW5pY29kZU1hcC0+UmV2ZXJzZUxvb2t1cCh1bmljb2RlKTsKLSAgICAgICAgaWYgKGNoYXJjb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hhcmNvZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIF9DaGFyQ29kZUZyb21Vbmljb2RlKHVuaWNvZGUpOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb250OjpEZWNvZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgY29uc3QKLXsKLSAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgaW50IHNyY19sZW4gPSBzdHIuR2V0TGVuZ3RoKCk7Ci0gICAgcmVzdWx0LlJlc2VydmUoc3JjX2xlbik7Ci0gICAgY29uc3QgRlhfQ0hBUiogc3JjX2J1ZiA9IHN0cjsKLSAgICBpbnQgc3JjX3BvcyA9IDA7Ci0gICAgd2hpbGUgKHNyY19wb3MgPCBzcmNfbGVuKSB7Ci0gICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gR2V0TmV4dENoYXIoc3JjX2J1Ziwgc3JjX2xlbiwgc3JjX3Bvcyk7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHVuaWNvZGUgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICAgICAgaWYgKCF1bmljb2RlLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmVzdWx0ICs9IHVuaWNvZGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gKEZYX1dDSEFSKWNoYXJjb2RlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0ZvbnQ6OkVuY29kZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSBjb25zdAotewotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsKLSAgICBpbnQgc3JjX2xlbiA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgICBGWF9DSEFSKiBkZXN0X2J1ZiA9IHJlc3VsdC5HZXRCdWZmZXIoc3JjX2xlbiAqIDIpOwotICAgIGNvbnN0IEZYX1dDSEFSKiBzcmNfYnVmID0gc3RyLmNfc3RyKCk7Ci0gICAgaW50IGRlc3RfcG9zID0gMDsKLSAgICBmb3IgKGludCBzcmNfcG9zID0gMDsgc3JjX3BvcyA8IHNyY19sZW47IHNyY19wb3MgKyspIHsKLSAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBDaGFyQ29kZUZyb21Vbmljb2RlKHNyY19idWZbc3JjX3Bvc10pOwotICAgICAgICBkZXN0X3BvcyArPSBBcHBlbmRDaGFyKGRlc3RfYnVmICsgZGVzdF9wb3MsIGNoYXJjb2RlKTsKLSAgICB9Ci0gICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoZGVzdF9wb3MpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci12b2lkIENQREZfRm9udDo6TG9hZEZvbnREZXNjcmlwdG9yKENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjKQotewotICAgIG1fRmxhZ3MgPSBwRm9udERlc2MtPkdldEludGVnZXIoRlhfQlNUUkMoIkZsYWdzIiksIFBERkZPTlRfTk9OU1lNQk9MSUMpOwotICAgIGludCBJdGFsaWNBbmdsZSA9IDA7Ci0gICAgRlhfQk9PTCBiRXhpc3RJdGFsaWNBbmdsZSA9IEZBTFNFOwotICAgIGlmIChwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJJdGFsaWNBbmdsZSIpKSkgewotICAgICAgICBJdGFsaWNBbmdsZSA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiSXRhbGljQW5nbGUiKSk7Ci0gICAgICAgIGJFeGlzdEl0YWxpY0FuZ2xlID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKEl0YWxpY0FuZ2xlIDwgMCkgewotICAgICAgICBtX0ZsYWdzIHw9IFBERkZPTlRfSVRBTElDOwotICAgICAgICBtX0l0YWxpY0FuZ2xlID0gSXRhbGljQW5nbGU7Ci0gICAgfQotICAgIEZYX0JPT0wgYkV4aXN0U3RlbVYgPSBGQUxTRTsKLSAgICBpZiAocEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiU3RlbVYiKSkpIHsKLSAgICAgICAgbV9TdGVtViA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiU3RlbVYiKSk7Ci0gICAgICAgIGJFeGlzdFN0ZW1WID0gVFJVRTsKLSAgICB9Ci0gICAgRlhfQk9PTCBiRXhpc3RBc2NlbnQgPSBGQUxTRTsKLSAgICBpZiAocEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiQXNjZW50IikpKSB7Ci0gICAgICAgIG1fQXNjZW50ID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJBc2NlbnQiKSk7Ci0gICAgICAgIGJFeGlzdEFzY2VudCA9IFRSVUU7Ci0gICAgfQotICAgIEZYX0JPT0wgYkV4aXN0RGVzY2VudCA9IEZBTFNFOwotICAgIGlmIChwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJEZXNjZW50IikpKSB7Ci0gICAgICAgIG1fRGVzY2VudCA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiRGVzY2VudCIpKTsKLSAgICAgICAgYkV4aXN0RGVzY2VudCA9IFRSVUU7Ci0gICAgfQotICAgIEZYX0JPT0wgYkV4aXN0Q2FwSGVpZ2h0ID0gRkFMU0U7Ci0gICAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkNhcEhlaWdodCIpKSkgewotICAgICAgICBiRXhpc3RDYXBIZWlnaHQgPSBUUlVFOwotICAgIH0KLSAgICBpZiAoYkV4aXN0SXRhbGljQW5nbGUgJiYgYkV4aXN0QXNjZW50ICYmIGJFeGlzdENhcEhlaWdodCAmJiBiRXhpc3REZXNjZW50ICYmIGJFeGlzdFN0ZW1WKSB7Ci0gICAgICAgIG1fRmxhZ3MgfD0gUERGRk9OVF9VU0VFWFRFUk5BVFRSOwotICAgIH0KLSAgICBpZiAobV9EZXNjZW50ID4gMTApIHsKLSAgICAgICAgbV9EZXNjZW50ID0gLW1fRGVzY2VudDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEJCb3ggPSBwRm9udERlc2MtPkdldEFycmF5KEZYX0JTVFJDKCJGb250QkJveCIpKTsKLSAgICBpZiAocEJCb3gpIHsKLSAgICAgICAgbV9Gb250QkJveC5sZWZ0ID0gcEJCb3gtPkdldEludGVnZXIoMCk7Ci0gICAgICAgIG1fRm9udEJCb3guYm90dG9tID0gcEJCb3gtPkdldEludGVnZXIoMSk7Ci0gICAgICAgIG1fRm9udEJCb3gucmlnaHQgPSBwQkJveC0+R2V0SW50ZWdlcigyKTsKLSAgICAgICAgbV9Gb250QkJveC50b3AgPSBwQkJveC0+R2V0SW50ZWdlcigzKTsKLSAgICB9Ci0gICAgQ1BERl9TdHJlYW0qIHBGb250RmlsZSA9IHBGb250RGVzYy0+R2V0U3RyZWFtKEZYX0JTVFJDKCJGb250RmlsZSIpKTsKLSAgICBpZiAocEZvbnRGaWxlID09IE5VTEwpIHsKLSAgICAgICAgcEZvbnRGaWxlID0gcEZvbnREZXNjLT5HZXRTdHJlYW0oRlhfQlNUUkMoIkZvbnRGaWxlMiIpKTsKLSAgICB9Ci0gICAgaWYgKHBGb250RmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHBGb250RmlsZSA9IHBGb250RGVzYy0+R2V0U3RyZWFtKEZYX0JTVFJDKCJGb250RmlsZTMiKSk7Ci0gICAgfQotICAgIGlmIChwRm9udEZpbGUpIHsKLSAgICAgICAgbV9wRm9udEZpbGUgPSBtX3BEb2N1bWVudC0+TG9hZEZvbnRGaWxlKHBGb250RmlsZSk7Ci0gICAgICAgIGlmIChtX3BGb250RmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgdWludDhfdCogcEZvbnREYXRhID0gbV9wRm9udEZpbGUtPkdldERhdGEoKTsKLSAgICAgICAgRlhfRFdPUkQgZHdGb250U2l6ZSA9IG1fcEZvbnRGaWxlLT5HZXRTaXplKCk7Ci0gICAgICAgIG1fRm9udC5Mb2FkRW1iZWRkZWQocEZvbnREYXRhLCBkd0ZvbnRTaXplKTsKLSAgICAgICAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgbV9wRm9udEZpbGUgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotfQotc2hvcnQgVFQyUERGKGludCBtLCBGWEZUX0ZhY2UgZmFjZSkKLXsKLSAgICBpbnQgdXBtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKGZhY2UpOwotICAgIGlmICh1cG0gPT0gMCkgewotICAgICAgICByZXR1cm4gKHNob3J0KW07Ci0gICAgfQotICAgIHJldHVybiAobSAqIDEwMDAgKyB1cG0gLyAyKSAvIHVwbTsKLX0KLXZvaWQgQ1BERl9Gb250OjpDaGVja0ZvbnRNZXRyaWNzKCkKLXsKLSAgICBpZiAobV9Gb250QkJveC50b3AgPT0gMCAmJiBtX0ZvbnRCQm94LmJvdHRvbSA9PSAwICYmIG1fRm9udEJCb3gubGVmdCA9PSAwICYmIG1fRm9udEJCb3gucmlnaHQgPT0gMCkgewotICAgICAgICBpZiAobV9Gb250Lm1fRmFjZSkgewotICAgICAgICAgICAgbV9Gb250QkJveC5sZWZ0ID0gVFQyUERGKEZYRlRfR2V0X0ZhY2VfeE1pbihtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7Ci0gICAgICAgICAgICBtX0ZvbnRCQm94LmJvdHRvbSA9IFRUMlBERihGWEZUX0dldF9GYWNlX3lNaW4obV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOwotICAgICAgICAgICAgbV9Gb250QkJveC5yaWdodCA9IFRUMlBERihGWEZUX0dldF9GYWNlX3hNYXgobV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOwotICAgICAgICAgICAgbV9Gb250QkJveC50b3AgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV95TWF4KG1fRm9udC5tX0ZhY2UpLCBtX0ZvbnQubV9GYWNlKTsKLSAgICAgICAgICAgIG1fQXNjZW50ID0gVFQyUERGKEZYRlRfR2V0X0ZhY2VfQXNjZW5kZXIobV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOwotICAgICAgICAgICAgbV9EZXNjZW50ID0gVFQyUERGKEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKG1fRm9udC5tX0ZhY2UpLCBtX0ZvbnQubV9GYWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfUkVDVCByZWN0OwotICAgICAgICAgICAgICAgIEdldENoYXJCQm94KGksIHJlY3QpOwotICAgICAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgPT0gcmVjdC5yaWdodCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJGaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBtX0ZvbnRCQm94ID0gcmVjdDsKLSAgICAgICAgICAgICAgICAgICAgYkZpcnN0ID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fRm9udEJCb3gudG9wIDwgcmVjdC50b3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fRm9udEJCb3gudG9wID0gcmVjdC50b3A7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fRm9udEJCb3gucmlnaHQgPCByZWN0LnJpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX0ZvbnRCQm94LnJpZ2h0ID0gcmVjdC5yaWdodDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobV9Gb250QkJveC5sZWZ0ID4gcmVjdC5sZWZ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX0ZvbnRCQm94LmxlZnQgPSByZWN0LmxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fRm9udEJCb3guYm90dG9tID4gcmVjdC5ib3R0b20pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fRm9udEJCb3guYm90dG9tID0gcmVjdC5ib3R0b207Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fQXNjZW50ID09IDAgJiYgbV9EZXNjZW50ID09IDApIHsKLSAgICAgICAgRlhfUkVDVCByZWN0OwotICAgICAgICBHZXRDaGFyQkJveCgnQScsIHJlY3QpOwotICAgICAgICBpZiAocmVjdC5ib3R0b20gPT0gcmVjdC50b3ApIHsKLSAgICAgICAgICAgIG1fQXNjZW50ID0gbV9Gb250QkJveC50b3A7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0FzY2VudCA9IHJlY3QudG9wOwotICAgICAgICB9Ci0gICAgICAgIEdldENoYXJCQm94KCdnJywgcmVjdCk7Ci0gICAgICAgIGlmIChyZWN0LmJvdHRvbSA9PSByZWN0LnRvcCkgewotICAgICAgICAgICAgbV9EZXNjZW50ID0gbV9Gb250QkJveC5ib3R0b207Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0Rlc2NlbnQgPSByZWN0LmJvdHRvbTsKLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgQ1BERl9Gb250OjpMb2FkVW5pY29kZU1hcCgpCi17Ci0gICAgbV9iVG9Vbmljb2RlTG9hZGVkID0gVFJVRTsKLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG1fcEZvbnREaWN0LT5HZXRTdHJlYW0oRlhfQlNUUkMoIlRvVW5pY29kZSIpKTsKLSAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wVG9Vbmljb2RlTWFwID0gbmV3IENQREZfVG9Vbmljb2RlTWFwOwotICAgIG1fcFRvVW5pY29kZU1hcC0+TG9hZChwU3RyZWFtKTsKLX0KLWludCBDUERGX0ZvbnQ6OkdldFN0cmluZ1dpZHRoKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBzaXplKQotewotICAgIGludCBvZmZzZXQgPSAwOwotICAgIGludCB3aWR0aCA9IDA7Ci0gICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKLSAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBHZXROZXh0Q2hhcihwU3RyaW5nLCBzaXplLCBvZmZzZXQpOwotICAgICAgICB3aWR0aCArPSBHZXRDaGFyV2lkdGhGKGNoYXJjb2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdpZHRoOwotfQotaW50IENQREZfRm9udDo6R2V0Q2hhclR5cGVXaWR0aChGWF9EV09SRCBjaGFyY29kZSkKLXsKKyAgICBjb25zdCB1aW50OF90KiBwRm9udERhdGEgPSBtX3BGb250RmlsZS0+R2V0RGF0YSgpOworICAgIEZYX0RXT1JEIGR3Rm9udFNpemUgPSBtX3BGb250RmlsZS0+R2V0U2l6ZSgpOworICAgIG1fRm9udC5Mb2FkRW1iZWRkZWQocEZvbnREYXRhLCBkd0ZvbnRTaXplKTsKICAgICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgbV9wRm9udEZpbGUgPSBOVUxMOwogICAgIH0KLSAgICBpbnQgZ2x5cGhfaW5kZXggPSBHbHlwaEZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgaWYgKGdseXBoX2luZGV4ID09IDB4ZmZmZikgewotICAgICAgICByZXR1cm4gMDsKKyAgfQorfQorc2hvcnQgVFQyUERGKGludCBtLCBGWEZUX0ZhY2UgZmFjZSkgeworICBpbnQgdXBtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKGZhY2UpOworICBpZiAodXBtID09IDApIHsKKyAgICByZXR1cm4gKHNob3J0KW07CisgIH0KKyAgcmV0dXJuIChtICogMTAwMCArIHVwbSAvIDIpIC8gdXBtOworfQordm9pZCBDUERGX0ZvbnQ6OkNoZWNrRm9udE1ldHJpY3MoKSB7CisgIGlmIChtX0ZvbnRCQm94LnRvcCA9PSAwICYmIG1fRm9udEJCb3guYm90dG9tID09IDAgJiYgbV9Gb250QkJveC5sZWZ0ID09IDAgJiYKKyAgICAgIG1fRm9udEJCb3gucmlnaHQgPT0gMCkgeworICAgIGlmIChtX0ZvbnQubV9GYWNlKSB7CisgICAgICBtX0ZvbnRCQm94LmxlZnQgPQorICAgICAgICAgIFRUMlBERihGWEZUX0dldF9GYWNlX3hNaW4obV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOworICAgICAgbV9Gb250QkJveC5ib3R0b20gPQorICAgICAgICAgIFRUMlBERihGWEZUX0dldF9GYWNlX3lNaW4obV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOworICAgICAgbV9Gb250QkJveC5yaWdodCA9CisgICAgICAgICAgVFQyUERGKEZYRlRfR2V0X0ZhY2VfeE1heChtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7CisgICAgICBtX0ZvbnRCQm94LnRvcCA9IFRUMlBERihGWEZUX0dldF9GYWNlX3lNYXgobV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOworICAgICAgbV9Bc2NlbnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7CisgICAgICBtX0Rlc2NlbnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOworICAgIH0gZWxzZSB7CisgICAgICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIEZYX1JFQ1QgcmVjdDsKKyAgICAgICAgR2V0Q2hhckJCb3goaSwgcmVjdCk7CisgICAgICAgIGlmIChyZWN0LmxlZnQgPT0gcmVjdC5yaWdodCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChiRmlyc3QpIHsKKyAgICAgICAgICBtX0ZvbnRCQm94ID0gcmVjdDsKKyAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAobV9Gb250QkJveC50b3AgPCByZWN0LnRvcCkgeworICAgICAgICAgICAgbV9Gb250QkJveC50b3AgPSByZWN0LnRvcDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRm9udEJCb3gucmlnaHQgPCByZWN0LnJpZ2h0KSB7CisgICAgICAgICAgICBtX0ZvbnRCQm94LnJpZ2h0ID0gcmVjdC5yaWdodDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRm9udEJCb3gubGVmdCA+IHJlY3QubGVmdCkgeworICAgICAgICAgICAgbV9Gb250QkJveC5sZWZ0ID0gcmVjdC5sZWZ0OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9Gb250QkJveC5ib3R0b20gPiByZWN0LmJvdHRvbSkgeworICAgICAgICAgICAgbV9Gb250QkJveC5ib3R0b20gPSByZWN0LmJvdHRvbTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIG1fRm9udC5HZXRHbHlwaFdpZHRoKGdseXBoX2luZGV4KTsKKyAgfQorICBpZiAobV9Bc2NlbnQgPT0gMCAmJiBtX0Rlc2NlbnQgPT0gMCkgeworICAgIEZYX1JFQ1QgcmVjdDsKKyAgICBHZXRDaGFyQkJveCgnQScsIHJlY3QpOworICAgIGlmIChyZWN0LmJvdHRvbSA9PSByZWN0LnRvcCkgeworICAgICAgbV9Bc2NlbnQgPSBtX0ZvbnRCQm94LnRvcDsKKyAgICB9IGVsc2UgeworICAgICAgbV9Bc2NlbnQgPSByZWN0LnRvcDsKKyAgICB9CisgICAgR2V0Q2hhckJCb3goJ2cnLCByZWN0KTsKKyAgICBpZiAocmVjdC5ib3R0b20gPT0gcmVjdC50b3ApIHsKKyAgICAgIG1fRGVzY2VudCA9IG1fRm9udEJCb3guYm90dG9tOworICAgIH0gZWxzZSB7CisgICAgICBtX0Rlc2NlbnQgPSByZWN0LmJvdHRvbTsKKyAgICB9CisgIH0KK30KK3ZvaWQgQ1BERl9Gb250OjpMb2FkVW5pY29kZU1hcCgpIHsKKyAgbV9iVG9Vbmljb2RlTG9hZGVkID0gVFJVRTsKKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBtX3BGb250RGljdC0+R2V0U3RyZWFtKEZYX0JTVFJDKCJUb1VuaWNvZGUiKSk7CisgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wVG9Vbmljb2RlTWFwID0gbmV3IENQREZfVG9Vbmljb2RlTWFwOworICBtX3BUb1VuaWNvZGVNYXAtPkxvYWQocFN0cmVhbSk7Cit9CitpbnQgQ1BERl9Gb250OjpHZXRTdHJpbmdXaWR0aChjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgc2l6ZSkgeworICBpbnQgb2Zmc2V0ID0gMDsKKyAgaW50IHdpZHRoID0gMDsKKyAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICBGWF9EV09SRCBjaGFyY29kZSA9IEdldE5leHRDaGFyKHBTdHJpbmcsIHNpemUsIG9mZnNldCk7CisgICAgd2lkdGggKz0gR2V0Q2hhcldpZHRoRihjaGFyY29kZSk7CisgIH0KKyAgcmV0dXJuIHdpZHRoOworfQoraW50IENQREZfRm9udDo6R2V0Q2hhclR5cGVXaWR0aChGWF9EV09SRCBjaGFyY29kZSkgeworICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IGdseXBoX2luZGV4ID0gR2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICBpZiAoZ2x5cGhfaW5kZXggPT0gMHhmZmZmKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIG1fRm9udC5HZXRHbHlwaFdpZHRoKGdseXBoX2luZGV4KTsKIH0KIGludCBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUoQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotQ1BERl9Gb250KiBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZm9udG5hbWUobmFtZSk7Ci0gICAgaW50IGZvbnRfaWQgPSBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUoZm9udG5hbWUpOwotICAgIGlmIChmb250X2lkIDwgMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IHBGb250R2xvYmFscy0+RmluZChwRG9jLCBmb250X2lkKTsKLSAgICBpZiAocEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIHBGb250OwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKLSAgICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJUeXBlIiksIEZYX0JTVFJDKCJGb250IikpOwotICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgRlhfQlNUUkMoIlR5cGUxIikpOwotICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkJhc2VGb250IiksIGZvbnRuYW1lKTsKLSAgICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJFbmNvZGluZyIpLCBGWF9CU1RSQygiV2luQW5zaUVuY29kaW5nIikpOwotICAgIHBGb250ID0gQ1BERl9Gb250OjpDcmVhdGVGb250RihOVUxMLCBwRGljdCk7Ci0gICAgcEZvbnRHbG9iYWxzLT5TZXQocERvYywgZm9udF9pZCwgcEZvbnQpOworQ1BERl9Gb250KiBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgZm9udG5hbWUobmFtZSk7CisgIGludCBmb250X2lkID0gX1BERl9HZXRTdGFuZGFyZEZvbnROYW1lKGZvbnRuYW1lKTsKKyAgaWYgKGZvbnRfaWQgPCAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0KKyAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOworICBDUERGX0ZvbnQqIHBGb250ID0gcEZvbnRHbG9iYWxzLT5GaW5kKHBEb2MsIGZvbnRfaWQpOworICBpZiAocEZvbnQpIHsKICAgICByZXR1cm4gcEZvbnQ7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CisgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIkZvbnQiKSk7CisgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgRlhfQlNUUkMoIlR5cGUxIikpOworICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJCYXNlRm9udCIpLCBmb250bmFtZSk7CisgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkVuY29kaW5nIiksIEZYX0JTVFJDKCJXaW5BbnNpRW5jb2RpbmciKSk7CisgIHBGb250ID0gQ1BERl9Gb250OjpDcmVhdGVGb250RihOVUxMLCBwRGljdCk7CisgIHBGb250R2xvYmFscy0+U2V0KHBEb2MsIGZvbnRfaWQsIHBGb250KTsKKyAgcmV0dXJuIHBGb250OwogfQotY29uc3QgdWludDhfdCBDaGluZXNlRm9udE5hbWVzW11bNV0gPSB7Ci0gICAgezB4Q0IsIDB4Q0UsIDB4Q0MsIDB4RTUsIDB4MDB9LAotICAgIHsweEJGLCAweEFDLCAweENDLCAweEU1LCAweDAwfSwKLSAgICB7MHhCQSwgMHhEQSwgMHhDQywgMHhFNSwgMHgwMH0sCi0gICAgezB4QjcsIDB4QzIsIDB4Q0IsIDB4Q0UsIDB4MDB9LAotICAgIHsweEQwLCAweEMyLCAweENCLCAweENFLCAweDAwfQotfTsKLUNQREZfRm9udCogQ1BERl9Gb250OjpDcmVhdGVGb250RihDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyB0eXBlID0gcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSk7Ci0gICAgQ1BERl9Gb250KiBwRm9udDsKLSAgICBpZiAodHlwZSA9PSBGWF9CU1RSQygiVHJ1ZVR5cGUiKSkgewotICAgICAgICB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18gfHwgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8gfHwgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXyB8fCBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYmFzZWZvbnQgPSBwRm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZUZvbnQiKSk7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB0YWcgPSBiYXNlZm9udC5MZWZ0KDQpOwotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBzaXplb2YoQ2hpbmVzZUZvbnROYW1lcykgLyBzaXplb2YoQ2hpbmVzZUZvbnROYW1lc1swXSk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKUNoaW5lc2VGb250TmFtZXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpIDwgY291bnQpIHsKLSAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGVzYyA9IHBGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiRm9udERlc2NyaXB0b3IiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBGb250RGVzYyA9PSBOVUxMIHx8ICFwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJGb250RmlsZTIiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcEZvbnQgPSBuZXcgQ1BERl9DSURGb250OwotICAgICAgICAgICAgICAgICAgICBwRm9udC0+bV9wRm9udERpY3QgPSBwRm9udERpY3Q7Ci0gICAgICAgICAgICAgICAgICAgIHBGb250LT5tX3BEb2N1bWVudCA9IHBEb2M7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcEZvbnQtPkxvYWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBGb250OwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBGb250OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KK2NvbnN0IHVpbnQ4X3QgQ2hpbmVzZUZvbnROYW1lc1tdWzVdID0ge3sweENCLCAweENFLCAweENDLCAweEU1LCAweDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEJGLCAweEFDLCAweENDLCAweEU1LCAweDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEJBLCAweERBLCAweENDLCAweEU1LCAweDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEI3LCAweEMyLCAweENCLCAweENFLCAweDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEQwLCAweEMyLCAweENCLCAweENFLCAweDAwfX07CitDUERGX0ZvbnQqIENQREZfRm9udDo6Q3JlYXRlRm9udEYoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCkgeworICBDRlhfQnl0ZVN0cmluZyB0eXBlID0gcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSk7CisgIENQREZfRm9udCogcEZvbnQ7CisgIGlmICh0eXBlID09IEZYX0JTVFJDKCJUcnVlVHlwZSIpKSB7CisgICAgeworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18gfHwgXAorICAgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8ICAgXAorICAgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQU5EUk9JRF8gfHwgXAorICAgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udCA9IHBGb250RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJCYXNlRm9udCIpKTsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHRhZyA9IGJhc2Vmb250LkxlZnQoNCk7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBjb3VudCA9IHNpemVvZihDaGluZXNlRm9udE5hbWVzKSAvIHNpemVvZihDaGluZXNlRm9udE5hbWVzWzBdKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGlmICh0YWcgPT0gQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKUNoaW5lc2VGb250TmFtZXNbaV0pKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChpIDwgY291bnQpIHsKKyAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPQorICAgICAgICAgICAgcEZvbnREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGb250RGVzY3JpcHRvciIpKTsKKyAgICAgICAgaWYgKHBGb250RGVzYyA9PSBOVUxMIHx8ICFwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJGb250RmlsZTIiKSkpIHsKKyAgICAgICAgICBwRm9udCA9IG5ldyBDUERGX0NJREZvbnQ7CisgICAgICAgICAgcEZvbnQtPm1fcEZvbnREaWN0ID0gcEZvbnREaWN0OworICAgICAgICAgIHBGb250LT5tX3BEb2N1bWVudCA9IHBEb2M7CisgICAgICAgICAgaWYgKCFwRm9udC0+TG9hZCgpKSB7CisgICAgICAgICAgICBkZWxldGUgcEZvbnQ7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHBGb250OworICAgICAgICB9CisgICAgICB9CiAjZW5kaWYKLSAgICAgICAgfQotICAgICAgICBwRm9udCA9IG5ldyBDUERGX1RydWVUeXBlRm9udDsKLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRlhfQlNUUkMoIlR5cGUzIikpIHsKLSAgICAgICAgcEZvbnQgPSBuZXcgQ1BERl9UeXBlM0ZvbnQ7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IEZYX0JTVFJDKCJUeXBlMCIpKSB7Ci0gICAgICAgIHBGb250ID0gbmV3IENQREZfQ0lERm9udDsKLSAgICB9IGVsc2UgewotICAgICAgICBwRm9udCA9IG5ldyBDUERGX1R5cGUxRm9udDsKICAgICB9Ci0gICAgcEZvbnQtPm1fcEZvbnREaWN0ID0gcEZvbnREaWN0OwotICAgIHBGb250LT5tX3BEb2N1bWVudCA9IHBEb2M7Ci0gICAgaWYgKCFwRm9udC0+TG9hZCgpKSB7Ci0gICAgICAgIGRlbGV0ZSBwRm9udDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwRm9udDsKKyAgICBwRm9udCA9IG5ldyBDUERGX1RydWVUeXBlRm9udDsKKyAgfSBlbHNlIGlmICh0eXBlID09IEZYX0JTVFJDKCJUeXBlMyIpKSB7CisgICAgcEZvbnQgPSBuZXcgQ1BERl9UeXBlM0ZvbnQ7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBGWF9CU1RSQygiVHlwZTAiKSkgeworICAgIHBGb250ID0gbmV3IENQREZfQ0lERm9udDsKKyAgfSBlbHNlIHsKKyAgICBwRm9udCA9IG5ldyBDUERGX1R5cGUxRm9udDsKKyAgfQorICBwRm9udC0+bV9wRm9udERpY3QgPSBwRm9udERpY3Q7CisgIHBGb250LT5tX3BEb2N1bWVudCA9IHBEb2M7CisgIGlmICghcEZvbnQtPkxvYWQoKSkgeworICAgIGRlbGV0ZSBwRm9udDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcEZvbnQ7CiB9Ci1GWF9CT09MIENQREZfRm9udDo6TG9hZCgpCi17Ci0gICAgaWYgKG1fcEZvbnREaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyB0eXBlID0gbV9wRm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKTsKLSAgICBtX0Jhc2VGb250ID0gbV9wRm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZUZvbnQiKSk7Ci0gICAgaWYgKHR5cGUgPT0gRlhfQlNUUkMoIk1NVHlwZTEiKSkgewotICAgICAgICB0eXBlID0gRlhfQlNUUkMoIlR5cGUxIik7Ci0gICAgfQotICAgIHJldHVybiBfTG9hZCgpOworRlhfQk9PTCBDUERGX0ZvbnQ6OkxvYWQoKSB7CisgIGlmIChtX3BGb250RGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9CeXRlU3RyaW5nIHR5cGUgPSBtX3BGb250RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpOworICBtX0Jhc2VGb250ID0gbV9wRm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZUZvbnQiKSk7CisgIGlmICh0eXBlID09IEZYX0JTVFJDKCJNTVR5cGUxIikpIHsKKyAgICB0eXBlID0gRlhfQlNUUkMoIlR5cGUxIik7CisgIH0KKyAgcmV0dXJuIF9Mb2FkKCk7CiB9Ci1zdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgX0ZvbnRNYXBfR2V0V2lkZVN0cmluZyhDRlhfQ2hhck1hcCogcE1hcCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJ5dGVzdHIpCi17Ci0gICAgcmV0dXJuICgoQ1BERl9Gb250Q2hhck1hcCopcE1hcCktPm1fcEZvbnQtPkRlY29kZVN0cmluZyhieXRlc3RyKTsKK3N0YXRpYyBDRlhfV2lkZVN0cmluZyBfRm9udE1hcF9HZXRXaWRlU3RyaW5nKENGWF9DaGFyTWFwKiBwTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJ5dGVzdHIpIHsKKyAgcmV0dXJuICgoQ1BERl9Gb250Q2hhck1hcCopcE1hcCktPm1fcEZvbnQtPkRlY29kZVN0cmluZyhieXRlc3RyKTsKIH0KLXN0YXRpYyBDRlhfQnl0ZVN0cmluZyBfRm9udE1hcF9HZXRCeXRlU3RyaW5nKENGWF9DaGFyTWFwKiBwTWFwLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd2lkZXN0cikKLXsKLSAgICByZXR1cm4gKChDUERGX0ZvbnRDaGFyTWFwKilwTWFwKS0+bV9wRm9udC0+RW5jb2RlU3RyaW5nKHdpZGVzdHIpOworc3RhdGljIENGWF9CeXRlU3RyaW5nIF9Gb250TWFwX0dldEJ5dGVTdHJpbmcoQ0ZYX0NoYXJNYXAqIHBNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd2lkZXN0cikgeworICByZXR1cm4gKChDUERGX0ZvbnRDaGFyTWFwKilwTWFwKS0+bV9wRm9udC0+RW5jb2RlU3RyaW5nKHdpZGVzdHIpOwogfQotQ1BERl9Gb250Q2hhck1hcDo6Q1BERl9Gb250Q2hhck1hcChDUERGX0ZvbnQqIHBGb250KQotewotICAgIG1fR2V0Qnl0ZVN0cmluZyA9IF9Gb250TWFwX0dldEJ5dGVTdHJpbmc7Ci0gICAgbV9HZXRXaWRlU3RyaW5nID0gX0ZvbnRNYXBfR2V0V2lkZVN0cmluZzsKLSAgICBtX3BGb250ID0gcEZvbnQ7CitDUERGX0ZvbnRDaGFyTWFwOjpDUERGX0ZvbnRDaGFyTWFwKENQREZfRm9udCogcEZvbnQpIHsKKyAgbV9HZXRCeXRlU3RyaW5nID0gX0ZvbnRNYXBfR2V0Qnl0ZVN0cmluZzsKKyAgbV9HZXRXaWRlU3RyaW5nID0gX0ZvbnRNYXBfR2V0V2lkZVN0cmluZzsKKyAgbV9wRm9udCA9IHBGb250OwogfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Ub1VuaWNvZGVNYXA6Okxvb2t1cChGWF9EV09SRCBjaGFyY29kZSkKLXsKLSAgICBGWF9EV09SRCB2YWx1ZTsKLSAgICBpZiAobV9NYXAuTG9va3VwKGNoYXJjb2RlLCB2YWx1ZSkpIHsKLSAgICAgICAgRlhfV0NIQVIgdW5pY29kZSA9IChGWF9XQ0hBUikodmFsdWUgJiAweGZmZmYpOwotICAgICAgICBpZiAodW5pY29kZSAhPSAweGZmZmYpIHsKLSAgICAgICAgICAgIHJldHVybiB1bmljb2RlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEZYX1dDSEFSKiBidWYgPSBtX011bHRpQ2hhckJ1Zi5HZXRCdWZmZXIoKTsKLSAgICAgICAgRlhfRFdPUkQgYnVmX2xlbiA9IG1fTXVsdGlDaGFyQnVmLkdldExlbmd0aCgpOwotICAgICAgICBpZiAoYnVmID09IE5VTEwgfHwgYnVmX2xlbiA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBpbmRleCA9IHZhbHVlID4+IDE2OwotICAgICAgICBpZiAoaW5kZXggPj0gYnVmX2xlbikgewotICAgICAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgbGVuID0gYnVmW2luZGV4XTsKLSAgICAgICAgaWYgKGluZGV4ICsgbGVuIDwgaW5kZXggfHwgaW5kZXggKyBsZW4gPj0gYnVmX2xlbikgewotICAgICAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKGJ1ZiArIGluZGV4ICsgMSwgbGVuKTsKK0NGWF9XaWRlU3RyaW5nIENQREZfVG9Vbmljb2RlTWFwOjpMb29rdXAoRlhfRFdPUkQgY2hhcmNvZGUpIHsKKyAgRlhfRFdPUkQgdmFsdWU7CisgIGlmIChtX01hcC5Mb29rdXAoY2hhcmNvZGUsIHZhbHVlKSkgeworICAgIEZYX1dDSEFSIHVuaWNvZGUgPSAoRlhfV0NIQVIpKHZhbHVlICYgMHhmZmZmKTsKKyAgICBpZiAodW5pY29kZSAhPSAweGZmZmYpIHsKKyAgICAgIHJldHVybiB1bmljb2RlOwogICAgIH0KLSAgICBpZiAobV9wQmFzZU1hcCkgewotICAgICAgICByZXR1cm4gbV9wQmFzZU1hcC0+VW5pY29kZUZyb21DSUQoKEZYX1dPUkQpY2hhcmNvZGUpOworICAgIGNvbnN0IEZYX1dDSEFSKiBidWYgPSBtX011bHRpQ2hhckJ1Zi5HZXRCdWZmZXIoKTsKKyAgICBGWF9EV09SRCBidWZfbGVuID0gbV9NdWx0aUNoYXJCdWYuR2V0TGVuZ3RoKCk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMIHx8IGJ1Zl9sZW4gPT0gMCkgeworICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CiAgICAgfQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIEZYX0RXT1JEIGluZGV4ID0gdmFsdWUgPj4gMTY7CisgICAgaWYgKGluZGV4ID49IGJ1Zl9sZW4pIHsKKyAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIH0KKyAgICBGWF9EV09SRCBsZW4gPSBidWZbaW5kZXhdOworICAgIGlmIChpbmRleCArIGxlbiA8IGluZGV4IHx8IGluZGV4ICsgbGVuID49IGJ1Zl9sZW4pIHsKKyAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoYnVmICsgaW5kZXggKyAxLCBsZW4pOworICB9CisgIGlmIChtX3BCYXNlTWFwKSB7CisgICAgcmV0dXJuIG1fcEJhc2VNYXAtPlVuaWNvZGVGcm9tQ0lEKChGWF9XT1JEKWNoYXJjb2RlKTsKKyAgfQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKIH0KLUZYX0RXT1JEIENQREZfVG9Vbmljb2RlTWFwOjpSZXZlcnNlTG9va3VwKEZYX1dDSEFSIHVuaWNvZGUpCi17Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9NYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgRlhfRFdPUkQga2V5LCB2YWx1ZTsKLSAgICAgICAgbV9NYXAuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGlmICgoRlhfV0NIQVIpdmFsdWUgPT0gdW5pY29kZSkgewotICAgICAgICAgICAgcmV0dXJuIGtleTsKLSAgICAgICAgfQorRlhfRFdPUkQgQ1BERl9Ub1VuaWNvZGVNYXA6OlJldmVyc2VMb29rdXAoRlhfV0NIQVIgdW5pY29kZSkgeworICBGWF9QT1NJVElPTiBwb3MgPSBtX01hcC5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBGWF9EV09SRCBrZXksIHZhbHVlOworICAgIG1fTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOworICAgIGlmICgoRlhfV0NIQVIpdmFsdWUgPT0gdW5pY29kZSkgeworICAgICAgcmV0dXJuIGtleTsKICAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CitzdGF0aWMgRlhfRFdPUkQgX1N0cmluZ1RvQ29kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgeworICBjb25zdCBGWF9DSEFSKiBidWYgPSBzdHIuR2V0Q1N0cigpOworICBpbnQgbGVuID0gc3RyLkdldExlbmd0aCgpOworICBpZiAobGVuID09IDApIHsKICAgICByZXR1cm4gMDsKLX0KLXN0YXRpYyBGWF9EV09SRCBfU3RyaW5nVG9Db2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKQotewotICAgIGNvbnN0IEZYX0NIQVIqIGJ1ZiA9IHN0ci5HZXRDU3RyKCk7Ci0gICAgaW50IGxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludCByZXN1bHQgPSAwOwotICAgIGlmIChidWZbMF0gPT0gJzwnKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyBpICsrKSB7Ci0gICAgICAgICAgICBpbnQgZGlnaXQ7Ci0gICAgICAgICAgICBpZiAoYnVmW2ldID49ICcwJyAmJiBidWZbaV0gPD0gJzknKSB7Ci0gICAgICAgICAgICAgICAgZGlnaXQgPSBidWZbaV0gLSAnMCc7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZltpXSA+PSAnYScgJiYgYnVmW2ldIDw9ICdmJykgewotICAgICAgICAgICAgICAgIGRpZ2l0ID0gYnVmW2ldIC0gJ2EnICsgMTA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZltpXSA+PSAnQScgJiYgYnVmW2ldIDw9ICdGJykgewotICAgICAgICAgICAgICAgIGRpZ2l0ID0gYnVmW2ldIC0gJ0EnICsgMTA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICogMTYgKyBkaWdpdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSArKykgewotICAgICAgICBpZiAoYnVmW2ldIDwgJzAnIHx8IGJ1ZltpXSA+ICc5JykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICogMTAgKyBidWZbaV0gLSAnMCc7CisgIH0KKyAgaW50IHJlc3VsdCA9IDA7CisgIGlmIChidWZbMF0gPT0gJzwnKSB7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkrKykgeworICAgICAgaW50IGRpZ2l0OworICAgICAgaWYgKGJ1ZltpXSA+PSAnMCcgJiYgYnVmW2ldIDw9ICc5JykgeworICAgICAgICBkaWdpdCA9IGJ1ZltpXSAtICcwJzsKKyAgICAgIH0gZWxzZSBpZiAoYnVmW2ldID49ICdhJyAmJiBidWZbaV0gPD0gJ2YnKSB7CisgICAgICAgIGRpZ2l0ID0gYnVmW2ldIC0gJ2EnICsgMTA7CisgICAgICB9IGVsc2UgaWYgKGJ1ZltpXSA+PSAnQScgJiYgYnVmW2ldIDw9ICdGJykgeworICAgICAgICBkaWdpdCA9IGJ1ZltpXSAtICdBJyArIDEwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXN1bHQgPSByZXN1bHQgKiAxNiArIGRpZ2l0OwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBpZiAoYnVmW2ldIDwgJzAnIHx8IGJ1ZltpXSA+ICc5JykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHJlc3VsdCA9IHJlc3VsdCAqIDEwICsgYnVmW2ldIC0gJzAnOworICB9CisgIHJldHVybiByZXN1bHQ7CiB9Ci1zdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgX1N0cmluZ0RhdGFBZGQoQ0ZYX1dpZGVTdHJpbmcgc3RyKQotewotICAgIENGWF9XaWRlU3RyaW5nIHJldDsKLSAgICBpbnQgbGVuID0gc3RyLkdldExlbmd0aCgpOwotICAgIEZYX1dDSEFSIHZhbHVlID0gMTsKLSAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwIDsgLS1pKSB7Ci0gICAgICAgIEZYX1dDSEFSIGNoID0gc3RyW2ldICsgdmFsdWU7Ci0gICAgICAgIGlmIChjaCA8IHN0cltpXSkgewotICAgICAgICAgICAgcmV0Lkluc2VydCgwLCAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldC5JbnNlcnQoMCwgY2gpOwotICAgICAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICB9CitzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgX1N0cmluZ0RhdGFBZGQoQ0ZYX1dpZGVTdHJpbmcgc3RyKSB7CisgIENGWF9XaWRlU3RyaW5nIHJldDsKKyAgaW50IGxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgRlhfV0NIQVIgdmFsdWUgPSAxOworICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICBGWF9XQ0hBUiBjaCA9IHN0cltpXSArIHZhbHVlOworICAgIGlmIChjaCA8IHN0cltpXSkgeworICAgICAgcmV0Lkluc2VydCgwLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0Lkluc2VydCgwLCBjaCk7CisgICAgICB2YWx1ZSA9IDA7CiAgICAgfQotICAgIGlmICh2YWx1ZSkgewotICAgICAgICByZXQuSW5zZXJ0KDAsIHZhbHVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKKyAgfQorICBpZiAodmFsdWUpIHsKKyAgICByZXQuSW5zZXJ0KDAsIHZhbHVlKTsKKyAgfQorICByZXR1cm4gcmV0OwogfQotc3RhdGljIENGWF9XaWRlU3RyaW5nIF9TdHJpbmdUb1dpZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpCi17Ci0gICAgY29uc3QgRlhfQ0hBUiogYnVmID0gc3RyLkdldENTdHIoKTsKLSAgICBpbnQgbGVuID0gc3RyLkdldExlbmd0aCgpOwotICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OwotICAgIGlmIChidWZbMF0gPT0gJzwnKSB7Ci0gICAgICAgIGludCBieXRlX3BvcyA9IDA7Ci0gICAgICAgIEZYX1dDSEFSIGNoID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkgKyspIHsKLSAgICAgICAgICAgIGludCBkaWdpdDsKLSAgICAgICAgICAgIGlmIChidWZbaV0gPj0gJzAnICYmIGJ1ZltpXSA8PSAnOScpIHsKLSAgICAgICAgICAgICAgICBkaWdpdCA9IGJ1ZltpXSAtICcwJzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVmW2ldID49ICdhJyAmJiBidWZbaV0gPD0gJ2YnKSB7Ci0gICAgICAgICAgICAgICAgZGlnaXQgPSBidWZbaV0gLSAnYScgKyAxMDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVmW2ldID49ICdBJyAmJiBidWZbaV0gPD0gJ0YnKSB7Ci0gICAgICAgICAgICAgICAgZGlnaXQgPSBidWZbaV0gLSAnQScgKyAxMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaCA9IGNoICogMTYgKyBkaWdpdDsKLSAgICAgICAgICAgIGJ5dGVfcG9zICsrOwotICAgICAgICAgICAgaWYgKGJ5dGVfcG9zID09IDQpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2g7Ci0gICAgICAgICAgICAgICAgYnl0ZV9wb3MgPSAwOwotICAgICAgICAgICAgICAgIGNoID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBpZiAoYnVmWzBdID09ICcoJykgeworc3RhdGljIENGWF9XaWRlU3RyaW5nIF9TdHJpbmdUb1dpZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIHsKKyAgY29uc3QgRlhfQ0hBUiogYnVmID0gc3RyLkdldENTdHIoKTsKKyAgaW50IGxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgaWYgKGxlbiA9PSAwKSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICBpZiAoYnVmWzBdID09ICc8JykgeworICAgIGludCBieXRlX3BvcyA9IDA7CisgICAgRlhfV0NIQVIgY2ggPSAwOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGludCBkaWdpdDsKKyAgICAgIGlmIChidWZbaV0gPj0gJzAnICYmIGJ1ZltpXSA8PSAnOScpIHsKKyAgICAgICAgZGlnaXQgPSBidWZbaV0gLSAnMCc7CisgICAgICB9IGVsc2UgaWYgKGJ1ZltpXSA+PSAnYScgJiYgYnVmW2ldIDw9ICdmJykgeworICAgICAgICBkaWdpdCA9IGJ1ZltpXSAtICdhJyArIDEwOworICAgICAgfSBlbHNlIGlmIChidWZbaV0gPj0gJ0EnICYmIGJ1ZltpXSA8PSAnRicpIHsKKyAgICAgICAgZGlnaXQgPSBidWZbaV0gLSAnQScgKyAxMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2ggPSBjaCAqIDE2ICsgZGlnaXQ7CisgICAgICBieXRlX3BvcysrOworICAgICAgaWYgKGJ5dGVfcG9zID09IDQpIHsKKyAgICAgICAgcmVzdWx0ICs9IGNoOworICAgICAgICBieXRlX3BvcyA9IDA7CisgICAgICAgIGNoID0gMDsKKyAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBpZiAoYnVmWzBdID09ICcoJykgeworICB9CisgIHJldHVybiByZXN1bHQ7CiB9Ci12b2lkIENQREZfVG9Vbmljb2RlTWFwOjpMb2FkKENQREZfU3RyZWFtKiBwU3RyZWFtKQotewotICAgIGludCBDSURTZXQgPSAwOwotICAgIENQREZfU3RyZWFtQWNjIHN0cmVhbTsKLSAgICBzdHJlYW0uTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOwotICAgIENQREZfU2ltcGxlUGFyc2VyIHBhcnNlcihzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpKTsKLSAgICBtX01hcC5Fc3RpbWF0ZVNpemUoc3RyZWFtLkdldFNpemUoKSAvIDgsIDEwMjQpOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKLSAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBicmVhazsKK3ZvaWQgQ1BERl9Ub1VuaWNvZGVNYXA6OkxvYWQoQ1BERl9TdHJlYW0qIHBTdHJlYW0pIHsKKyAgaW50IENJRFNldCA9IDA7CisgIENQREZfU3RyZWFtQWNjIHN0cmVhbTsKKyAgc3RyZWFtLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKKyAgQ1BERl9TaW1wbGVQYXJzZXIgcGFyc2VyKHN0cmVhbS5HZXREYXRhKCksIHN0cmVhbS5HZXRTaXplKCkpOworICBtX01hcC5Fc3RpbWF0ZVNpemUoc3RyZWFtLkdldFNpemUoKSAvIDgsIDEwMjQpOworICB3aGlsZSAoMSkgeworICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiYmVnaW5iZmNoYXIiKSkgeworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgd29yZCA9IHBhcnNlci5HZXRXb3JkKCk7CisgICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSB8fCB3b3JkID09IEZYX0JTVFJDKCJlbmRiZmNoYXIiKSkgeworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJiZWdpbmJmY2hhciIpKSB7Ci0gICAgICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICAgIHdvcmQgPSBwYXJzZXIuR2V0V29yZCgpOwotICAgICAgICAgICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSB8fCB3b3JkID09IEZYX0JTVFJDKCJlbmRiZmNoYXIiKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjY29kZSA9IF9TdHJpbmdUb0NvZGUod29yZCk7Ci0gICAgICAgICAgICAgICAgd29yZCA9IHBhcnNlci5HZXRXb3JkKCk7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZGVzdGNvZGUgPSBfU3RyaW5nVG9XaWRlU3RyaW5nKHdvcmQpOwotICAgICAgICAgICAgICAgIGludCBsZW4gPSBkZXN0Y29kZS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBtX01hcC5TZXRBdChzcmNjb2RlLCBkZXN0Y29kZS5HZXRBdCgwKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9NYXAuU2V0QXQoc3JjY29kZSwgbV9NdWx0aUNoYXJCdWYuR2V0TGVuZ3RoKCkgKiAweDEwMDAwICsgMHhmZmZmKTsKLSAgICAgICAgICAgICAgICAgICAgbV9NdWx0aUNoYXJCdWYuQXBwZW5kQ2hhcihkZXN0Y29kZS5HZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmIDw8IGRlc3Rjb2RlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh3b3JkID09IEZYX0JTVFJDKCJiZWdpbmJmcmFuZ2UiKSkgewotICAgICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBsb3csIGhpZ2g7Ci0gICAgICAgICAgICAgICAgbG93ID0gcGFyc2VyLkdldFdvcmQoKTsKLSAgICAgICAgICAgICAgICBpZiAobG93LklzRW1wdHkoKSB8fCBsb3cgPT0gRlhfQlNUUkMoImVuZGJmcmFuZ2UiKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGlnaCA9IHBhcnNlci5HZXRXb3JkKCk7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgbG93Y29kZSA9IF9TdHJpbmdUb0NvZGUobG93KTsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBoaWdoY29kZSA9IChsb3djb2RlICYgMHhmZmZmZmYwMCkgfCAoX1N0cmluZ1RvQ29kZShoaWdoKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIGlmIChoaWdoY29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RhcnQgPSBwYXJzZXIuR2V0V29yZCgpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSBGWF9CU1RSQygiWyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgY29kZSA9IGxvd2NvZGU7IGNvZGUgPD0gaGlnaGNvZGU7IGNvZGUgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGRlc3QgPSBwYXJzZXIuR2V0V29yZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZGVzdGNvZGUgPSBfU3RyaW5nVG9XaWRlU3RyaW5nKGRlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IGRlc3Rjb2RlLkdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hcC5TZXRBdChjb2RlLCBkZXN0Y29kZS5HZXRBdCgwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFwLlNldEF0KGNvZGUsIG1fTXVsdGlDaGFyQnVmLkdldExlbmd0aCgpICogMHgxMDAwMCArIDB4ZmZmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NdWx0aUNoYXJCdWYuQXBwZW5kQ2hhcihkZXN0Y29kZS5HZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NdWx0aUNoYXJCdWYgPDwgZGVzdGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGFyc2VyLkdldFdvcmQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBkZXN0Y29kZSA9IF9TdHJpbmdUb1dpZGVTdHJpbmcoc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gZGVzdGNvZGUuR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHZhbHVlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9TdHJpbmdUb0NvZGUoc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBjb2RlID0gbG93Y29kZTsgY29kZSA8PSBoaWdoY29kZTsgY29kZSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFwLlNldEF0KGNvZGUsIHZhbHVlKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBjb2RlID0gbG93Y29kZTsgY29kZSA8PSBoaWdoY29kZTsgY29kZSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHJldGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gbG93Y29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRjb2RlID0gZGVzdGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Y29kZSA9IF9TdHJpbmdEYXRhQWRkKGRlc3Rjb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXAuU2V0QXQoY29kZSwgbV9NdWx0aUNoYXJCdWYuR2V0TGVuZ3RoKCkgKiAweDEwMDAwICsgMHhmZmZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX011bHRpQ2hhckJ1Zi5BcHBlbmRDaGFyKHJldGNvZGUuR2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmIDw8IHJldGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGNvZGUgPSByZXRjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9BZG9iZS1Lb3JlYTEtVUNTMiIpKSB7Ci0gICAgICAgICAgICBDSURTZXQgPSBDSURTRVRfS09SRUExOwotICAgICAgICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9BZG9iZS1KYXBhbjEtVUNTMiIpKSB7Ci0gICAgICAgICAgICBDSURTZXQgPSBDSURTRVRfSkFQQU4xOwotICAgICAgICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9BZG9iZS1DTlMxLVVDUzIiKSkgewotICAgICAgICAgICAgQ0lEU2V0ID0gQ0lEU0VUX0NOUzE7Ci0gICAgICAgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygiL0Fkb2JlLUdCMS1VQ1MyIikpIHsKLSAgICAgICAgICAgIENJRFNldCA9IENJRFNFVF9HQjE7CisgICAgICAgIEZYX0RXT1JEIHNyY2NvZGUgPSBfU3RyaW5nVG9Db2RlKHdvcmQpOworICAgICAgICB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZGVzdGNvZGUgPSBfU3RyaW5nVG9XaWRlU3RyaW5nKHdvcmQpOworICAgICAgICBpbnQgbGVuID0gZGVzdGNvZGUuR2V0TGVuZ3RoKCk7CisgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgfQotICAgIGlmIChDSURTZXQpIHsKLSAgICAgICAgbV9wQmFzZU1hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpLT5tX0NNYXBNYW5hZ2VyLkdldENJRDJVbmljb2RlTWFwKENJRFNldCwgRkFMU0UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcEJhc2VNYXAgPSBOVUxMOwotICAgIH0KLX0KLXN0YXRpYyBGWF9CT09MIEdldFByZWRlZmluZWRFbmNvZGluZyhpbnQmIGJhc2VtYXAsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIldpbkFuc2lFbmNvZGluZyIpKSB7Ci0gICAgICAgIGJhc2VtYXAgPSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBGWF9CU1RSQygiTWFjUm9tYW5FbmNvZGluZyIpKSB7Ci0gICAgICAgIGJhc2VtYXAgPSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIk1hY0V4cGVydEVuY29kaW5nIikpIHsKLSAgICAgICAgYmFzZW1hcCA9IFBERkZPTlRfRU5DT0RJTkdfTUFDRVhQRVJUOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIlBERkRvY0VuY29kaW5nIikpIHsKLSAgICAgICAgYmFzZW1hcCA9IFBERkZPTlRfRU5DT0RJTkdfUERGRE9DOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENQREZfRm9udDo6TG9hZFBERkVuY29kaW5nKENQREZfT2JqZWN0KiBwRW5jb2RpbmcsIGludCYgaUJhc2VFbmNvZGluZywgQ0ZYX0J5dGVTdHJpbmcqJiBwQ2hhck5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbWJlZGRlZCwgRlhfQk9PTCBiVHJ1ZVR5cGUpCi17Ci0gICAgaWYgKHBFbmNvZGluZyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChtX0Jhc2VGb250ID09IEZYX0JTVFJDKCJTeW1ib2wiKSkgewotICAgICAgICAgICAgaUJhc2VFbmNvZGluZyA9IGJUcnVlVHlwZSA/IFBERkZPTlRfRU5DT0RJTkdfTVNfU1lNQk9MIDogUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0w7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWJFbWJlZGRlZCAmJiBpQmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTikgewotICAgICAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwRW5jb2RpbmctPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICBpZiAoaUJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX0FET0JFX1NZTUJPTCB8fCBpQmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykgJiYgbV9CYXNlRm9udCA9PSBGWF9CU1RSQygiU3ltYm9sIikpIHsKLSAgICAgICAgICAgIGlmICghYlRydWVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRW5jb2RpbmcgPSBwRW5jb2RpbmctPkdldFN0cmluZygpOwotICAgICAgICBpZiAoYnNFbmNvZGluZy5Db21wYXJlKEZYX0JTVFJDKCJNYWNFeHBlcnRFbmNvZGluZyIpKSA9PSAwKSB7Ci0gICAgICAgICAgICBic0VuY29kaW5nID0gRlhfQlNUUkMoIldpbkFuc2lFbmNvZGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIEdldFByZWRlZmluZWRFbmNvZGluZyhpQmFzZUVuY29kaW5nLCBic0VuY29kaW5nKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocEVuY29kaW5nLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEVuY29kaW5nOwotICAgIGlmIChpQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MICYmIGlCYXNlRW5jb2RpbmcgIT0gUERGRk9OVF9FTkNPRElOR19aQVBGRElOR0JBVFMpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGluZyA9IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkJhc2VFbmNvZGluZyIpKTsKLSAgICAgICAgaWYgKGJzRW5jb2RpbmcuQ29tcGFyZShGWF9CU1RSQygiTWFjRXhwZXJ0RW5jb2RpbmciKSkgPT0gMCAmJiBiVHJ1ZVR5cGUpIHsKLSAgICAgICAgICAgIGJzRW5jb2RpbmcgPSBGWF9CU1RSQygiV2luQW5zaUVuY29kaW5nIik7Ci0gICAgICAgIH0KLSAgICAgICAgR2V0UHJlZGVmaW5lZEVuY29kaW5nKGlCYXNlRW5jb2RpbmcsIGJzRW5jb2RpbmcpOwotICAgIH0KLSAgICBpZiAoKCFiRW1iZWRkZWQgfHwgYlRydWVUeXBlKSAmJiBpQmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTikgewotICAgICAgICBpQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcERpZmZzID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEaWZmZXJlbmNlcyIpKTsKLSAgICBpZiAocERpZmZzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwQ2hhck5hbWVzID0gbmV3IENGWF9CeXRlU3RyaW5nWzI1Nl07Ci0gICAgRlhfRFdPUkQgY3VyX2NvZGUgPSAwOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwRGlmZnMtPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcERpZmZzLT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgIGlmIChwRWxlbWVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEVsZW1lbnQtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICAgICAgaWYgKGN1cl9jb2RlIDwgMjU2KSB7Ci0gICAgICAgICAgICAgICAgcENoYXJOYW1lc1tjdXJfY29kZV0gPSAoKENQREZfTmFtZSopcEVsZW1lbnQpLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cl9jb2RlICsrOworICAgICAgICBpZiAobGVuID09IDEpIHsKKyAgICAgICAgICBtX01hcC5TZXRBdChzcmNjb2RlLCBkZXN0Y29kZS5HZXRBdCgwKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjdXJfY29kZSA9IHBFbGVtZW50LT5HZXRJbnRlZ2VyKCk7CisgICAgICAgICAgbV9NYXAuU2V0QXQoc3JjY29kZSwgbV9NdWx0aUNoYXJCdWYuR2V0TGVuZ3RoKCkgKiAweDEwMDAwICsgMHhmZmZmKTsKKyAgICAgICAgICBtX011bHRpQ2hhckJ1Zi5BcHBlbmRDaGFyKGRlc3Rjb2RlLkdldExlbmd0aCgpKTsKKyAgICAgICAgICBtX011bHRpQ2hhckJ1ZiA8PCBkZXN0Y29kZTsKICAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9Gb250OjpJc1N0YW5kYXJkRm9udCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fRm9udFR5cGUgIT0gUERGRk9OVF9UWVBFMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3BGb250RmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCgoQ1BERl9UeXBlMUZvbnQqKXRoaXMpLT5HZXRCYXNlMTRGb250KCkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1DUERGX1NpbXBsZUZvbnQ6OkNQREZfU2ltcGxlRm9udChpbnQgZm9udHR5cGUpIDogQ1BERl9Gb250KGZvbnR0eXBlKQotewotICAgIEZYU1lTX21lbXNldChtX0NoYXJCQm94LCAweGZmLCBzaXplb2YgbV9DaGFyQkJveCk7Ci0gICAgRlhTWVNfbWVtc2V0KG1fQ2hhcldpZHRoLCAweGZmLCBzaXplb2YgbV9DaGFyV2lkdGgpOwotICAgIEZYU1lTX21lbXNldChtX0dseXBoSW5kZXgsIDB4ZmYsIHNpemVvZiBtX0dseXBoSW5kZXgpOwotICAgIEZYU1lTX21lbXNldChtX0V4dEdJRCwgMHhmZiwgc2l6ZW9mIG1fRXh0R0lEKTsKLSAgICBtX3BDaGFyTmFtZXMgPSBOVUxMOwotICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19CVUlMVElOOwotfQotQ1BERl9TaW1wbGVGb250Ojp+Q1BERl9TaW1wbGVGb250KCkKLXsKLSAgICBkZWxldGVbXSBtX3BDaGFyTmFtZXM7Ci19Ci1pbnQgQ1BERl9TaW1wbGVGb250OjpHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgRlhfQk9PTCAqcFZlcnRHbHlwaCkKLXsKLSAgICBpZiAocFZlcnRHbHlwaCkgewotICAgICAgICAqcFZlcnRHbHlwaCA9IEZBTFNFOwotICAgIH0KLSAgICBpZiAoY2hhcmNvZGUgPiAweGZmKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gbV9HbHlwaEluZGV4Wyh1aW50OF90KWNoYXJjb2RlXTsKLSAgICBpZiAoaW5kZXggPT0gMHhmZmZmKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotfQotdm9pZCBDUERGX1NpbXBsZUZvbnQ6OkxvYWRDaGFyTWV0cmljcyhpbnQgY2hhcmNvZGUpCi17Ci0gICAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChjaGFyY29kZSA8IDAgfHwgY2hhcmNvZGUgPiAweGZmKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGdseXBoX2luZGV4ID0gbV9HbHlwaEluZGV4W2NoYXJjb2RlXTsKLSAgICBpZiAoZ2x5cGhfaW5kZXggPT0gMHhmZmZmKSB7Ci0gICAgICAgIGlmIChtX3BGb250RmlsZSA9PSBOVUxMICYmIGNoYXJjb2RlICE9IDMyKSB7Ci0gICAgICAgICAgICBMb2FkQ2hhck1ldHJpY3MoMzIpOwotICAgICAgICAgICAgbV9DaGFyQkJveFtjaGFyY29kZV0gPSBtX0NoYXJCQm94WzMyXTsKLSAgICAgICAgICAgIGlmIChtX2JVc2VGb250V2lkdGgpIHsKLSAgICAgICAgICAgICAgICBtX0NoYXJXaWR0aFtjaGFyY29kZV0gPSBtX0NoYXJXaWR0aFszMl07CisgICAgICB9CisgICAgfSBlbHNlIGlmICh3b3JkID09IEZYX0JTVFJDKCJiZWdpbmJmcmFuZ2UiKSkgeworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG93LCBoaWdoOworICAgICAgICBsb3cgPSBwYXJzZXIuR2V0V29yZCgpOworICAgICAgICBpZiAobG93LklzRW1wdHkoKSB8fCBsb3cgPT0gRlhfQlNUUkMoImVuZGJmcmFuZ2UiKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGhpZ2ggPSBwYXJzZXIuR2V0V29yZCgpOworICAgICAgICBGWF9EV09SRCBsb3djb2RlID0gX1N0cmluZ1RvQ29kZShsb3cpOworICAgICAgICBGWF9EV09SRCBoaWdoY29kZSA9CisgICAgICAgICAgICAobG93Y29kZSAmIDB4ZmZmZmZmMDApIHwgKF9TdHJpbmdUb0NvZGUoaGlnaCkgJiAweGZmKTsKKyAgICAgICAgaWYgKGhpZ2hjb2RlID09IChGWF9EV09SRCktMSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0YXJ0ID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgICAgICAgaWYgKHN0YXJ0ID09IEZYX0JTVFJDKCJbIikpIHsKKyAgICAgICAgICBmb3IgKEZYX0RXT1JEIGNvZGUgPSBsb3djb2RlOyBjb2RlIDw9IGhpZ2hjb2RlOyBjb2RlKyspIHsKKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGRlc3QgPSBwYXJzZXIuR2V0V29yZCgpOworICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZGVzdGNvZGUgPSBfU3RyaW5nVG9XaWRlU3RyaW5nKGRlc3QpOworICAgICAgICAgICAgaW50IGxlbiA9IGRlc3Rjb2RlLkdldExlbmd0aCgpOworICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbiA9PSAxKSB7CisgICAgICAgICAgICAgIG1fTWFwLlNldEF0KGNvZGUsIGRlc3Rjb2RlLkdldEF0KDApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG1fTWFwLlNldEF0KGNvZGUsIG1fTXVsdGlDaGFyQnVmLkdldExlbmd0aCgpICogMHgxMDAwMCArIDB4ZmZmZik7CisgICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmLkFwcGVuZENoYXIoZGVzdGNvZGUuR2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgICBtX011bHRpQ2hhckJ1ZiA8PCBkZXN0Y29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcGFyc2VyLkdldFdvcmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyBkZXN0Y29kZSA9IF9TdHJpbmdUb1dpZGVTdHJpbmcoc3RhcnQpOworICAgICAgICAgIGludCBsZW4gPSBkZXN0Y29kZS5HZXRMZW5ndGgoKTsKKyAgICAgICAgICBGWF9EV09SRCB2YWx1ZSA9IDA7CisgICAgICAgICAgaWYgKGxlbiA9PSAxKSB7CisgICAgICAgICAgICB2YWx1ZSA9IF9TdHJpbmdUb0NvZGUoc3RhcnQpOworICAgICAgICAgICAgZm9yIChGWF9EV09SRCBjb2RlID0gbG93Y29kZTsgY29kZSA8PSBoaWdoY29kZTsgY29kZSsrKSB7CisgICAgICAgICAgICAgIG1fTWFwLlNldEF0KGNvZGUsIHZhbHVlKyspOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGNvZGUgPSBsb3djb2RlOyBjb2RlIDw9IGhpZ2hjb2RlOyBjb2RlKyspIHsKKyAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgcmV0Y29kZTsKKyAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gbG93Y29kZSkgeworICAgICAgICAgICAgICAgIHJldGNvZGUgPSBkZXN0Y29kZTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXRjb2RlID0gX1N0cmluZ0RhdGFBZGQoZGVzdGNvZGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG1fTWFwLlNldEF0KGNvZGUsIG1fTXVsdGlDaGFyQnVmLkdldExlbmd0aCgpICogMHgxMDAwMCArIDB4ZmZmZik7CisgICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmLkFwcGVuZENoYXIocmV0Y29kZS5HZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmIDw8IHJldGNvZGU7CisgICAgICAgICAgICAgIGRlc3Rjb2RlID0gcmV0Y29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygiL0Fkb2JlLUtvcmVhMS1VQ1MyIikpIHsKKyAgICAgIENJRFNldCA9IENJRFNFVF9LT1JFQTE7CisgICAgfSBlbHNlIGlmICh3b3JkID09IEZYX0JTVFJDKCIvQWRvYmUtSmFwYW4xLVVDUzIiKSkgeworICAgICAgQ0lEU2V0ID0gQ0lEU0VUX0pBUEFOMTsKKyAgICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9BZG9iZS1DTlMxLVVDUzIiKSkgeworICAgICAgQ0lEU2V0ID0gQ0lEU0VUX0NOUzE7CisgICAgfSBlbHNlIGlmICh3b3JkID09IEZYX0JTVFJDKCIvQWRvYmUtR0IxLVVDUzIiKSkgeworICAgICAgQ0lEU2V0ID0gQ0lEU0VUX0dCMTsKICAgICB9Ci0gICAgaW50IGVyciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZvbnQubV9GYWNlLCBnbHlwaF9pbmRleCwgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7Ci0gICAgaWYgKGVycikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fQ2hhckJCb3hbY2hhcmNvZGVdLkxlZnQgPSBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRm9udC5tX0ZhY2UpLCBtX0ZvbnQubV9GYWNlKTsKLSAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodCA9IFRUMlBERihGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9Gb250Lm1fRmFjZSkgKyBGWEZUX0dldF9HbHlwaF9XaWR0aChtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7Ci0gICAgbV9DaGFyQkJveFtjaGFyY29kZV0uVG9wID0gVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7Ci0gICAgbV9DaGFyQkJveFtjaGFyY29kZV0uQm90dG9tID0gVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZvbnQubV9GYWNlKSAtIEZYRlRfR2V0X0dseXBoX0hlaWdodChtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7Ci0gICAgaWYgKG1fYlVzZUZvbnRXaWR0aCkgewotICAgICAgICBpbnQgVFRfV2lkdGggPSBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UobV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOwotICAgICAgICBpZiAobV9DaGFyV2lkdGhbY2hhcmNvZGVdID09IDB4ZmZmZikgewotICAgICAgICAgICAgbV9DaGFyV2lkdGhbY2hhcmNvZGVdID0gVFRfV2lkdGg7Ci0gICAgICAgIH0gZWxzZSBpZiAoVFRfV2lkdGggJiYgIUlzRW1iZWRkZWQoKSkgewotICAgICAgICAgICAgbV9DaGFyQkJveFtjaGFyY29kZV0uUmlnaHQgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodCAqIG1fQ2hhcldpZHRoW2NoYXJjb2RlXSAvIFRUX1dpZHRoOwotICAgICAgICAgICAgbV9DaGFyQkJveFtjaGFyY29kZV0uTGVmdCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLkxlZnQgKiBtX0NoYXJXaWR0aFtjaGFyY29kZV0gLyBUVF9XaWR0aDsKLSAgICAgICAgfQotICAgIH0KKyAgfQorICBpZiAoQ0lEU2V0KSB7CisgICAgbV9wQmFzZU1hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKQorICAgICAgICAgICAgICAgICAgICAgLT5HZXRQYWdlTW9kdWxlKCkKKyAgICAgICAgICAgICAgICAgICAgIC0+R2V0Rm9udEdsb2JhbHMoKQorICAgICAgICAgICAgICAgICAgICAgLT5tX0NNYXBNYW5hZ2VyLkdldENJRDJVbmljb2RlTWFwKENJRFNldCwgRkFMU0UpOworICB9IGVsc2UgeworICAgIG1fcEJhc2VNYXAgPSBOVUxMOworICB9CiB9Ci1pbnQgQ1BERl9TaW1wbGVGb250OjpHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwpCi17Ci0gICAgaWYgKGNoYXJjb2RlID4gMHhmZikgewotICAgICAgICBjaGFyY29kZSA9IDA7CitzdGF0aWMgRlhfQk9PTCBHZXRQcmVkZWZpbmVkRW5jb2RpbmcoaW50JiBiYXNlbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiB2YWx1ZSkgeworICBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIldpbkFuc2lFbmNvZGluZyIpKSB7CisgICAgYmFzZW1hcCA9IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSTsKKyAgfSBlbHNlIGlmICh2YWx1ZSA9PSBGWF9CU1RSQygiTWFjUm9tYW5FbmNvZGluZyIpKSB7CisgICAgYmFzZW1hcCA9IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU47CisgIH0gZWxzZSBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIk1hY0V4cGVydEVuY29kaW5nIikpIHsKKyAgICBiYXNlbWFwID0gUERGRk9OVF9FTkNPRElOR19NQUNFWFBFUlQ7CisgIH0gZWxzZSBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIlBERkRvY0VuY29kaW5nIikpIHsKKyAgICBiYXNlbWFwID0gUERGRk9OVF9FTkNPRElOR19QREZET0M7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX0ZvbnQ6OkxvYWRQREZFbmNvZGluZyhDUERGX09iamVjdCogcEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGlCYXNlRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nKiYgcENoYXJOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW1iZWRkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRydWVUeXBlKSB7CisgIGlmIChwRW5jb2RpbmcgPT0gTlVMTCkgeworICAgIGlmIChtX0Jhc2VGb250ID09IEZYX0JTVFJDKCJTeW1ib2wiKSkgeworICAgICAgaUJhc2VFbmNvZGluZyA9IGJUcnVlVHlwZSA/IFBERkZPTlRfRU5DT0RJTkdfTVNfU1lNQk9MCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0w7CisgICAgfSBlbHNlIGlmICghYkVtYmVkZGVkICYmIGlCYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19CVUlMVElOKSB7CisgICAgICBpQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJOwogICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBFbmNvZGluZy0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7CisgICAgaWYgKGlCYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0wgfHwKKyAgICAgICAgaUJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKG1fRmxhZ3MgJiBQREZGT05UX1NZTUJPTElDKSAmJiBtX0Jhc2VGb250ID09IEZYX0JTVFJDKCJTeW1ib2wiKSkgeworICAgICAgaWYgKCFiVHJ1ZVR5cGUpIHsKKyAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0VuY29kaW5nID0gcEVuY29kaW5nLT5HZXRTdHJpbmcoKTsKKyAgICBpZiAoYnNFbmNvZGluZy5Db21wYXJlKEZYX0JTVFJDKCJNYWNFeHBlcnRFbmNvZGluZyIpKSA9PSAwKSB7CisgICAgICBic0VuY29kaW5nID0gRlhfQlNUUkMoIldpbkFuc2lFbmNvZGluZyIpOworICAgIH0KKyAgICBHZXRQcmVkZWZpbmVkRW5jb2RpbmcoaUJhc2VFbmNvZGluZywgYnNFbmNvZGluZyk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChwRW5jb2RpbmctPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEVuY29kaW5nOworICBpZiAoaUJhc2VFbmNvZGluZyAhPSBQREZGT05UX0VOQ09ESU5HX0FET0JFX1NZTUJPTCAmJgorICAgICAgaUJhc2VFbmNvZGluZyAhPSBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUykgeworICAgIENGWF9CeXRlU3RyaW5nIGJzRW5jb2RpbmcgPSBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJCYXNlRW5jb2RpbmciKSk7CisgICAgaWYgKGJzRW5jb2RpbmcuQ29tcGFyZShGWF9CU1RSQygiTWFjRXhwZXJ0RW5jb2RpbmciKSkgPT0gMCAmJiBiVHJ1ZVR5cGUpIHsKKyAgICAgIGJzRW5jb2RpbmcgPSBGWF9CU1RSQygiV2luQW5zaUVuY29kaW5nIik7CisgICAgfQorICAgIEdldFByZWRlZmluZWRFbmNvZGluZyhpQmFzZUVuY29kaW5nLCBic0VuY29kaW5nKTsKKyAgfQorICBpZiAoKCFiRW1iZWRkZWQgfHwgYlRydWVUeXBlKSAmJiBpQmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTikgeworICAgIGlCYXNlRW5jb2RpbmcgPSBQREZGT05UX0VOQ09ESU5HX1NUQU5EQVJEOworICB9CisgIENQREZfQXJyYXkqIHBEaWZmcyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGlmZmVyZW5jZXMiKSk7CisgIGlmIChwRGlmZnMgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBwQ2hhck5hbWVzID0gbmV3IENGWF9CeXRlU3RyaW5nWzI1Nl07CisgIEZYX0RXT1JEIGN1cl9jb2RlID0gMDsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBEaWZmcy0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcERpZmZzLT5HZXRFbGVtZW50VmFsdWUoaSk7CisgICAgaWYgKHBFbGVtZW50ID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAocEVsZW1lbnQtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgeworICAgICAgaWYgKGN1cl9jb2RlIDwgMjU2KSB7CisgICAgICAgIHBDaGFyTmFtZXNbY3VyX2NvZGVdID0gKChDUERGX05hbWUqKXBFbGVtZW50KS0+R2V0U3RyaW5nKCk7CisgICAgICB9CisgICAgICBjdXJfY29kZSsrOworICAgIH0gZWxzZSB7CisgICAgICBjdXJfY29kZSA9IHBFbGVtZW50LT5HZXRJbnRlZ2VyKCk7CisgICAgfQorICB9Cit9CitGWF9CT09MIENQREZfRm9udDo6SXNTdGFuZGFyZEZvbnQoKSBjb25zdCB7CisgIGlmIChtX0ZvbnRUeXBlICE9IFBERkZPTlRfVFlQRTEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcEZvbnRGaWxlICE9IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCgoQ1BERl9UeXBlMUZvbnQqKXRoaXMpLT5HZXRCYXNlMTRGb250KCkgPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorQ1BERl9TaW1wbGVGb250OjpDUERGX1NpbXBsZUZvbnQoaW50IGZvbnR0eXBlKSA6IENQREZfRm9udChmb250dHlwZSkgeworICBGWFNZU19tZW1zZXQobV9DaGFyQkJveCwgMHhmZiwgc2l6ZW9mIG1fQ2hhckJCb3gpOworICBGWFNZU19tZW1zZXQobV9DaGFyV2lkdGgsIDB4ZmYsIHNpemVvZiBtX0NoYXJXaWR0aCk7CisgIEZYU1lTX21lbXNldChtX0dseXBoSW5kZXgsIDB4ZmYsIHNpemVvZiBtX0dseXBoSW5kZXgpOworICBGWFNZU19tZW1zZXQobV9FeHRHSUQsIDB4ZmYsIHNpemVvZiBtX0V4dEdJRCk7CisgIG1fcENoYXJOYW1lcyA9IE5VTEw7CisgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19CVUlMVElOOworfQorQ1BERl9TaW1wbGVGb250Ojp+Q1BERl9TaW1wbGVGb250KCkgeworICBkZWxldGVbXSBtX3BDaGFyTmFtZXM7Cit9CitpbnQgQ1BERl9TaW1wbGVGb250OjpHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgRlhfQk9PTCogcFZlcnRHbHlwaCkgeworICBpZiAocFZlcnRHbHlwaCkgeworICAgICpwVmVydEdseXBoID0gRkFMU0U7CisgIH0KKyAgaWYgKGNoYXJjb2RlID4gMHhmZikgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpbnQgaW5kZXggPSBtX0dseXBoSW5kZXhbKHVpbnQ4X3QpY2hhcmNvZGVdOworICBpZiAoaW5kZXggPT0gMHhmZmZmKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBpbmRleDsKK30KK3ZvaWQgQ1BERl9TaW1wbGVGb250OjpMb2FkQ2hhck1ldHJpY3MoaW50IGNoYXJjb2RlKSB7CisgIGlmIChtX0ZvbnQubV9GYWNlID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGNoYXJjb2RlIDwgMCB8fCBjaGFyY29kZSA+IDB4ZmYpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGdseXBoX2luZGV4ID0gbV9HbHlwaEluZGV4W2NoYXJjb2RlXTsKKyAgaWYgKGdseXBoX2luZGV4ID09IDB4ZmZmZikgeworICAgIGlmIChtX3BGb250RmlsZSA9PSBOVUxMICYmIGNoYXJjb2RlICE9IDMyKSB7CisgICAgICBMb2FkQ2hhck1ldHJpY3MoMzIpOworICAgICAgbV9DaGFyQkJveFtjaGFyY29kZV0gPSBtX0NoYXJCQm94WzMyXTsKKyAgICAgIGlmIChtX2JVc2VGb250V2lkdGgpIHsKKyAgICAgICAgbV9DaGFyV2lkdGhbY2hhcmNvZGVdID0gbV9DaGFyV2lkdGhbMzJdOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaW50IGVyciA9IEZYRlRfTG9hZF9HbHlwaCgKKyAgICAgIG1fRm9udC5tX0ZhY2UsIGdseXBoX2luZGV4LAorICAgICAgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7CisgIGlmIChlcnIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9DaGFyQkJveFtjaGFyY29kZV0uTGVmdCA9CisgICAgICBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRm9udC5tX0ZhY2UpLCBtX0ZvbnQubV9GYWNlKTsKKyAgbV9DaGFyQkJveFtjaGFyY29kZV0uUmlnaHQgPQorICAgICAgVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChtX0ZvbnQubV9GYWNlKSArCisgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0dseXBoX1dpZHRoKG1fRm9udC5tX0ZhY2UpLAorICAgICAgICAgICAgIG1fRm9udC5tX0ZhY2UpOworICBtX0NoYXJCQm94W2NoYXJjb2RlXS5Ub3AgPQorICAgICAgVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7CisgIG1fQ2hhckJCb3hbY2hhcmNvZGVdLkJvdHRvbSA9CisgICAgICBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRm9udC5tX0ZhY2UpIC0KKyAgICAgICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfSGVpZ2h0KG1fRm9udC5tX0ZhY2UpLAorICAgICAgICAgICAgIG1fRm9udC5tX0ZhY2UpOworICBpZiAobV9iVXNlRm9udFdpZHRoKSB7CisgICAgaW50IFRUX1dpZHRoID0KKyAgICAgICAgVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRm9udC5tX0ZhY2UpLCBtX0ZvbnQubV9GYWNlKTsKICAgICBpZiAobV9DaGFyV2lkdGhbY2hhcmNvZGVdID09IDB4ZmZmZikgewotICAgICAgICBMb2FkQ2hhck1ldHJpY3MoY2hhcmNvZGUpOwotICAgICAgICBpZiAobV9DaGFyV2lkdGhbY2hhcmNvZGVdID09IDB4ZmZmZikgewotICAgICAgICAgICAgbV9DaGFyV2lkdGhbY2hhcmNvZGVdID0gMDsKLSAgICAgICAgfQorICAgICAgbV9DaGFyV2lkdGhbY2hhcmNvZGVdID0gVFRfV2lkdGg7CisgICAgfSBlbHNlIGlmIChUVF9XaWR0aCAmJiAhSXNFbWJlZGRlZCgpKSB7CisgICAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodCA9CisgICAgICAgICAgbV9DaGFyQkJveFtjaGFyY29kZV0uUmlnaHQgKiBtX0NoYXJXaWR0aFtjaGFyY29kZV0gLyBUVF9XaWR0aDsKKyAgICAgIG1fQ2hhckJCb3hbY2hhcmNvZGVdLkxlZnQgPQorICAgICAgICAgIG1fQ2hhckJCb3hbY2hhcmNvZGVdLkxlZnQgKiBtX0NoYXJXaWR0aFtjaGFyY29kZV0gLyBUVF9XaWR0aDsKICAgICB9Ci0gICAgcmV0dXJuIChpbnQxNl90KW1fQ2hhcldpZHRoW2NoYXJjb2RlXTsKKyAgfQogfQotdm9pZCBDUERGX1NpbXBsZUZvbnQ6OkdldENoYXJCQm94KEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9SRUNUJiByZWN0LCBpbnQgbGV2ZWwpCi17Ci0gICAgaWYgKGNoYXJjb2RlID4gMHhmZikgewotICAgICAgICBjaGFyY29kZSA9IDA7CitpbnQgQ1BERl9TaW1wbGVGb250OjpHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwpIHsKKyAgaWYgKGNoYXJjb2RlID4gMHhmZikgeworICAgIGNoYXJjb2RlID0gMDsKKyAgfQorICBpZiAobV9DaGFyV2lkdGhbY2hhcmNvZGVdID09IDB4ZmZmZikgeworICAgIExvYWRDaGFyTWV0cmljcyhjaGFyY29kZSk7CisgICAgaWYgKG1fQ2hhcldpZHRoW2NoYXJjb2RlXSA9PSAweGZmZmYpIHsKKyAgICAgIG1fQ2hhcldpZHRoW2NoYXJjb2RlXSA9IDA7CiAgICAgfQotICAgIGlmIChtX0NoYXJCQm94W2NoYXJjb2RlXS5MZWZ0ID09IChpbnQxNl90KTB4ZmZmZikgewotICAgICAgICBMb2FkQ2hhck1ldHJpY3MoY2hhcmNvZGUpOwotICAgIH0KLSAgICByZWN0LmxlZnQgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5MZWZ0OwotICAgIHJlY3QucmlnaHQgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodDsKLSAgICByZWN0LmJvdHRvbSA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLkJvdHRvbTsKLSAgICByZWN0LnRvcCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLlRvcDsKKyAgfQorICByZXR1cm4gKGludDE2X3QpbV9DaGFyV2lkdGhbY2hhcmNvZGVdOwogfQotY29uc3QgRlhfQ0hBUiogR2V0QWRvYmVDaGFyTmFtZShpbnQgaUJhc2VFbmNvZGluZywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcqIHBDaGFyTmFtZXMsIGludCBjaGFyY29kZSkKLXsKLSAgICBBU1NFUlQoY2hhcmNvZGUgPj0gMCAmJiBjaGFyY29kZSA8IDI1Nik7Ci0gICAgaWYgKGNoYXJjb2RlIDwgMCB8fCBjaGFyY29kZSA+PSAyNTYpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBOVUxMOwotICAgIGlmIChwQ2hhck5hbWVzKSB7Ci0gICAgICAgIG5hbWUgPSBwQ2hhck5hbWVzW2NoYXJjb2RlXTsKLSAgICB9Ci0gICAgaWYgKChuYW1lID09IE5VTEwgfHwgbmFtZVswXSA9PSAwKSAmJiBpQmFzZUVuY29kaW5nKSB7Ci0gICAgICAgIG5hbWUgPSBQREZfQ2hhck5hbWVGcm9tUHJlZGVmaW5lZENoYXJTZXQoaUJhc2VFbmNvZGluZywgY2hhcmNvZGUpOwotICAgIH0KLSAgICBpZiAobmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWU7Cit2b2lkIENQREZfU2ltcGxlRm9udDo6R2V0Q2hhckJCb3goRlhfRFdPUkQgY2hhcmNvZGUsIEZYX1JFQ1QmIHJlY3QsIGludCBsZXZlbCkgeworICBpZiAoY2hhcmNvZGUgPiAweGZmKSB7CisgICAgY2hhcmNvZGUgPSAwOworICB9CisgIGlmIChtX0NoYXJCQm94W2NoYXJjb2RlXS5MZWZ0ID09IChpbnQxNl90KTB4ZmZmZikgeworICAgIExvYWRDaGFyTWV0cmljcyhjaGFyY29kZSk7CisgIH0KKyAgcmVjdC5sZWZ0ID0gbV9DaGFyQkJveFtjaGFyY29kZV0uTGVmdDsKKyAgcmVjdC5yaWdodCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLlJpZ2h0OworICByZWN0LmJvdHRvbSA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLkJvdHRvbTsKKyAgcmVjdC50b3AgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5Ub3A7CiB9Ci1GWF9CT09MIENQREZfU2ltcGxlRm9udDo6TG9hZENvbW1vbigpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBtX3BGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiRm9udERlc2NyaXB0b3IiKSk7Ci0gICAgaWYgKHBGb250RGVzYykgewotICAgICAgICBMb2FkRm9udERlc2NyaXB0b3IocEZvbnREZXNjKTsKK2NvbnN0IEZYX0NIQVIqIEdldEFkb2JlQ2hhck5hbWUoaW50IGlCYXNlRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nKiBwQ2hhck5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcmNvZGUpIHsKKyAgQVNTRVJUKGNoYXJjb2RlID49IDAgJiYgY2hhcmNvZGUgPCAyNTYpOworICBpZiAoY2hhcmNvZGUgPCAwIHx8IGNoYXJjb2RlID49IDI1NikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBOVUxMOworICBpZiAocENoYXJOYW1lcykgeworICAgIG5hbWUgPSBwQ2hhck5hbWVzW2NoYXJjb2RlXTsKKyAgfQorICBpZiAoKG5hbWUgPT0gTlVMTCB8fCBuYW1lWzBdID09IDApICYmIGlCYXNlRW5jb2RpbmcpIHsKKyAgICBuYW1lID0gUERGX0NoYXJOYW1lRnJvbVByZWRlZmluZWRDaGFyU2V0KGlCYXNlRW5jb2RpbmcsIGNoYXJjb2RlKTsKKyAgfQorICBpZiAobmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBuYW1lOworfQorRlhfQk9PTCBDUERGX1NpbXBsZUZvbnQ6OkxvYWRDb21tb24oKSB7CisgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkZvbnREZXNjcmlwdG9yIikpOworICBpZiAocEZvbnREZXNjKSB7CisgICAgTG9hZEZvbnREZXNjcmlwdG9yKHBGb250RGVzYyk7CisgIH0KKyAgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkgPSBtX3BGb250RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldpZHRocyIpKTsKKyAgaW50IHdpZHRoX3N0YXJ0ID0gMCwgd2lkdGhfZW5kID0gLTE7CisgIG1fYlVzZUZvbnRXaWR0aCA9IFRSVUU7CisgIGlmIChwV2lkdGhBcnJheSkgeworICAgIG1fYlVzZUZvbnRXaWR0aCA9IEZBTFNFOworICAgIGlmIChwRm9udERlc2MgJiYgcEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiTWlzc2luZ1dpZHRoIikpKSB7CisgICAgICBpbnQgTWlzc2luZ1dpZHRoID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJNaXNzaW5nV2lkdGgiKSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIG1fQ2hhcldpZHRoW2ldID0gTWlzc2luZ1dpZHRoOworICAgICAgfQogICAgIH0KLSAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSA9IG1fcEZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiV2lkdGhzIikpOwotICAgIGludCB3aWR0aF9zdGFydCA9IDAsIHdpZHRoX2VuZCA9IC0xOwotICAgIG1fYlVzZUZvbnRXaWR0aCA9IFRSVUU7Ci0gICAgaWYgKHBXaWR0aEFycmF5KSB7Ci0gICAgICAgIG1fYlVzZUZvbnRXaWR0aCA9IEZBTFNFOwotICAgICAgICBpZiAocEZvbnREZXNjICYmIHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIk1pc3NpbmdXaWR0aCIpKSkgewotICAgICAgICAgICAgaW50IE1pc3NpbmdXaWR0aCA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiTWlzc2luZ1dpZHRoIikpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBtX0NoYXJXaWR0aFtpXSA9IE1pc3NpbmdXaWR0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aWR0aF9zdGFydCA9IG1fcEZvbnREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJGaXJzdENoYXIiKSwgMCk7Ci0gICAgICAgIHdpZHRoX2VuZCA9IG1fcEZvbnREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJMYXN0Q2hhciIpLCAwKTsKLSAgICAgICAgaWYgKHdpZHRoX3N0YXJ0ID49IDAgJiYgd2lkdGhfc3RhcnQgPD0gMjU1KSB7Ci0gICAgICAgICAgICBpZiAod2lkdGhfZW5kIDw9IDAgfHwgd2lkdGhfZW5kID49IHdpZHRoX3N0YXJ0ICsgKGludClwV2lkdGhBcnJheS0+R2V0Q291bnQoKSkgewotICAgICAgICAgICAgICAgIHdpZHRoX2VuZCA9IHdpZHRoX3N0YXJ0ICsgcFdpZHRoQXJyYXktPkdldENvdW50KCkgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHdpZHRoX2VuZCA+IDI1NSkgewotICAgICAgICAgICAgICAgIHdpZHRoX2VuZCA9IDI1NTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSB3aWR0aF9zdGFydDsgaSA8PSB3aWR0aF9lbmQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBtX0NoYXJXaWR0aFtpXSA9IHBXaWR0aEFycmF5LT5HZXRJbnRlZ2VyKGkgLSB3aWR0aF9zdGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICB3aWR0aF9zdGFydCA9IG1fcEZvbnREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJGaXJzdENoYXIiKSwgMCk7CisgICAgd2lkdGhfZW5kID0gbV9wRm9udERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkxhc3RDaGFyIiksIDApOworICAgIGlmICh3aWR0aF9zdGFydCA+PSAwICYmIHdpZHRoX3N0YXJ0IDw9IDI1NSkgeworICAgICAgaWYgKHdpZHRoX2VuZCA8PSAwIHx8CisgICAgICAgICAgd2lkdGhfZW5kID49IHdpZHRoX3N0YXJ0ICsgKGludClwV2lkdGhBcnJheS0+R2V0Q291bnQoKSkgeworICAgICAgICB3aWR0aF9lbmQgPSB3aWR0aF9zdGFydCArIHBXaWR0aEFycmF5LT5HZXRDb3VudCgpIC0gMTsKKyAgICAgIH0KKyAgICAgIGlmICh3aWR0aF9lbmQgPiAyNTUpIHsKKyAgICAgICAgd2lkdGhfZW5kID0gMjU1OworICAgICAgfQorICAgICAgZm9yIChpbnQgaSA9IHdpZHRoX3N0YXJ0OyBpIDw9IHdpZHRoX2VuZDsgaSsrKSB7CisgICAgICAgIG1fQ2hhcldpZHRoW2ldID0gcFdpZHRoQXJyYXktPkdldEludGVnZXIoaSAtIHdpZHRoX3N0YXJ0KTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1fcEZvbnRGaWxlID09IE5VTEwpIHsKLSAgICAgICAgTG9hZFN1YnN0Rm9udCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtX0Jhc2VGb250LkdldExlbmd0aCgpID4gOCAmJiBtX0Jhc2VGb250WzddID09ICcrJykgewotICAgICAgICAgICAgbV9CYXNlRm9udCA9IG1fQmFzZUZvbnQuTWlkKDgpOwotICAgICAgICB9CisgIH0KKyAgaWYgKG1fcEZvbnRGaWxlID09IE5VTEwpIHsKKyAgICBMb2FkU3Vic3RGb250KCk7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fQmFzZUZvbnQuR2V0TGVuZ3RoKCkgPiA4ICYmIG1fQmFzZUZvbnRbN10gPT0gJysnKSB7CisgICAgICBtX0Jhc2VGb250ID0gbV9CYXNlRm9udC5NaWQoOCk7CiAgICAgfQotICAgIGlmICghKG1fRmxhZ3MgJiBQREZGT05UX1NZTUJPTElDKSkgewotICAgICAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQ7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwRW5jb2RpbmcgPSBtX3BGb250RGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJFbmNvZGluZyIpKTsKLSAgICBMb2FkUERGRW5jb2RpbmcocEVuY29kaW5nLCBtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBtX3BGb250RmlsZSAhPSBOVUxMLCBtX0ZvbnQuSXNUVEZvbnQoKSk7Ci0gICAgTG9hZEdseXBoTWFwKCk7Ci0gICAgZGVsZXRlW10gbV9wQ2hhck5hbWVzOwotICAgIG1fcENoYXJOYW1lcyA9IE5VTEw7Ci0gICAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKG1fRmxhZ3MgJiBQREZGT05UX0FMTENBUCkgewotICAgICAgICB1bnNpZ25lZCBjaGFyIGxvd2VyY2FzZXNbXSA9IHsnYScsICd6JywgMHhlMCwgMHhmNiwgMHhmOCwgMHhmZH07Ci0gICAgICAgIGZvciAoc2l6ZV90IHJhbmdlID0gMDsgcmFuZ2UgPCBzaXplb2YgbG93ZXJjYXNlcyAvIDI7IHJhbmdlICsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbG93ZXJjYXNlc1tyYW5nZSAqIDJdOyBpIDw9IGxvd2VyY2FzZXNbcmFuZ2UgKiAyICsgMV07IGkgKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2ldICE9IDB4ZmZmZiAmJiBtX3BGb250RmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbaV0gPSBtX0dseXBoSW5kZXhbaSAtIDMyXTsKLSAgICAgICAgICAgICAgICBpZiAobV9DaGFyV2lkdGhbaSAtIDMyXSkgewotICAgICAgICAgICAgICAgICAgICBtX0NoYXJXaWR0aFtpXSA9IG1fQ2hhcldpZHRoW2kgLSAzMl07Ci0gICAgICAgICAgICAgICAgICAgIG1fQ2hhckJCb3hbaV0gPSBtX0NoYXJCQm94W2kgLSAzMl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIENoZWNrRm9udE1ldHJpY3MoKTsKKyAgfQorICBpZiAoIShtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykpIHsKKyAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQ7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBFbmNvZGluZyA9IG1fcEZvbnREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkVuY29kaW5nIikpOworICBMb2FkUERGRW5jb2RpbmcocEVuY29kaW5nLCBtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBtX3BGb250RmlsZSAhPSBOVUxMLAorICAgICAgICAgICAgICAgICAgbV9Gb250LklzVFRGb250KCkpOworICBMb2FkR2x5cGhNYXAoKTsKKyAgZGVsZXRlW10gbV9wQ2hhck5hbWVzOworICBtX3BDaGFyTmFtZXMgPSBOVUxMOworICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENQREZfU2ltcGxlRm9udDo6TG9hZFN1YnN0Rm9udCgpCi17Ci0gICAgaWYgKCFtX2JVc2VGb250V2lkdGggJiYgIShtX0ZsYWdzICYgUERGRk9OVF9GSVhFRFBJVENIKSkgewotICAgICAgICBpbnQgd2lkdGggPSAwLCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAobV9DaGFyV2lkdGhbaV0gPT0gMCB8fCBtX0NoYXJXaWR0aFtpXSA9PSAweGZmZmYpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3aWR0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGggPSBtX0NoYXJXaWR0aFtpXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggIT0gbV9DaGFyV2lkdGhbaV0pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgfQorICBpZiAobV9GbGFncyAmIFBERkZPTlRfQUxMQ0FQKSB7CisgICAgdW5zaWduZWQgY2hhciBsb3dlcmNhc2VzW10gPSB7J2EnLCAneicsIDB4ZTAsIDB4ZjYsIDB4ZjgsIDB4ZmR9OworICAgIGZvciAoc2l6ZV90IHJhbmdlID0gMDsgcmFuZ2UgPCBzaXplb2YgbG93ZXJjYXNlcyAvIDI7IHJhbmdlKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSBsb3dlcmNhc2VzW3JhbmdlICogMl07IGkgPD0gbG93ZXJjYXNlc1tyYW5nZSAqIDIgKyAxXTsgaSsrKSB7CisgICAgICAgIGlmIChtX0dseXBoSW5kZXhbaV0gIT0gMHhmZmZmICYmIG1fcEZvbnRGaWxlICE9IE5VTEwpIHsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSAyNTYgJiYgd2lkdGgpIHsKLSAgICAgICAgICAgIG1fRmxhZ3MgfD0gUERGRk9OVF9GSVhFRFBJVENIOworICAgICAgICBtX0dseXBoSW5kZXhbaV0gPSBtX0dseXBoSW5kZXhbaSAtIDMyXTsKKyAgICAgICAgaWYgKG1fQ2hhcldpZHRoW2kgLSAzMl0pIHsKKyAgICAgICAgICBtX0NoYXJXaWR0aFtpXSA9IG1fQ2hhcldpZHRoW2kgLSAzMl07CisgICAgICAgICAgbV9DaGFyQkJveFtpXSA9IG1fQ2hhckJCb3hbaSAtIDMyXTsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBpbnQgd2VpZ2h0ID0gbV9TdGVtViA8IDE0MCA/IG1fU3RlbVYgKiA1IDogKG1fU3RlbVYgKiA0ICsgMTQwKTsKLSAgICBtX0ZvbnQuTG9hZFN1YnN0KG1fQmFzZUZvbnQsIElzRm9udFR5cGUoUERGRk9OVF9UUlVFVFlQRSksIG1fRmxhZ3MsIHdlaWdodCwgbV9JdGFsaWNBbmdsZSwgMCk7Ci0gICAgaWYgKG1fRm9udC5tX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9OT05TWU1CT0wpIHsKLSAgICB9CisgIH0KKyAgQ2hlY2tGb250TWV0cmljcygpOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9TaW1wbGVGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9CYXNlRW5jb2RpbmcgIT0gUERGRk9OVF9FTkNPRElOR19CVUlMVElOICYmIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MICYmCi0gICAgICAgICAgIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOwotfQotQ1BERl9UeXBlMUZvbnQ6OkNQREZfVHlwZTFGb250KCkgOiBDUERGX1NpbXBsZUZvbnQoUERGRk9OVF9UWVBFMSkKLXsKLSAgICBtX0Jhc2UxNEZvbnQgPSAtMTsKLX0KLUZYX0JPT0wgQ1BERl9UeXBlMUZvbnQ6Ol9Mb2FkKCkKLXsKLSAgICBtX0Jhc2UxNEZvbnQgPSBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUobV9CYXNlRm9udCk7Ci0gICAgaWYgKG1fQmFzZTE0Rm9udCA+PSAwKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkZvbnREZXNjcmlwdG9yIikpOwotICAgICAgICBpZiAocEZvbnREZXNjICYmIHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkZsYWdzIikpKSB7Ci0gICAgICAgICAgICBtX0ZsYWdzID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJGbGFncyIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fRmxhZ3MgPSBtX0Jhc2UxNEZvbnQgPj0gMTIgPyBQREZGT05UX1NZTUJPTElDIDogUERGRk9OVF9OT05TWU1CT0xJQzsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9CYXNlMTRGb250IDwgNCkKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9DaGFyV2lkdGhbaV0gPSA2MDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGlmIChtX0Jhc2UxNEZvbnQgPT0gMTIpIHsKLSAgICAgICAgICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0w7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9CYXNlMTRGb250ID09IDEzKSB7Ci0gICAgICAgICAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOwotICAgICAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBQREZGT05UX05PTlNZTUJPTElDKSB7Ci0gICAgICAgICAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQ7Ci0gICAgICAgIH0KK3ZvaWQgQ1BERl9TaW1wbGVGb250OjpMb2FkU3Vic3RGb250KCkgeworICBpZiAoIW1fYlVzZUZvbnRXaWR0aCAmJiAhKG1fRmxhZ3MgJiBQREZGT05UX0ZJWEVEUElUQ0gpKSB7CisgICAgaW50IHdpZHRoID0gMCwgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIGlmIChtX0NoYXJXaWR0aFtpXSA9PSAwIHx8IG1fQ2hhcldpZHRoW2ldID09IDB4ZmZmZikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICh3aWR0aCA9PSAwKSB7CisgICAgICAgIHdpZHRoID0gbV9DaGFyV2lkdGhbaV07CisgICAgICB9IGVsc2UgaWYgKHdpZHRoICE9IG1fQ2hhcldpZHRoW2ldKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gTG9hZENvbW1vbigpOworICAgIGlmIChpID09IDI1NiAmJiB3aWR0aCkgeworICAgICAgbV9GbGFncyB8PSBQREZGT05UX0ZJWEVEUElUQ0g7CisgICAgfQorICB9CisgIGludCB3ZWlnaHQgPSBtX1N0ZW1WIDwgMTQwID8gbV9TdGVtViAqIDUgOiAobV9TdGVtViAqIDQgKyAxNDApOworICBtX0ZvbnQuTG9hZFN1YnN0KG1fQmFzZUZvbnQsIElzRm9udFR5cGUoUERGRk9OVF9UUlVFVFlQRSksIG1fRmxhZ3MsIHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICBtX0l0YWxpY0FuZ2xlLCAwKTsKKyAgaWYgKG1fRm9udC5tX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9OT05TWU1CT0wpIHsKKyAgfQogfQotc3RhdGljIEZYX0JPT0wgRlRfVXNlVHlwZTFDaGFybWFwKEZYRlRfRmFjZSBmYWNlKQotewotICAgIGlmIChGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KGZhY2UpID09IDEgJiYKLSAgICAgICAgICAgIEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVswXSkgPT0gRlhGVF9FTkNPRElOR19VTklDT0RFKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVswXSkgPT0gRlhGVF9FTkNPRElOR19VTklDT0RFKSB7Ci0gICAgICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVsxXSk7CitGWF9CT09MIENQREZfU2ltcGxlRm9udDo6SXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTiAmJgorICAgICAgICAgbV9CYXNlRW5jb2RpbmcgIT0gUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0wgJiYKKyAgICAgICAgIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOworfQorQ1BERl9UeXBlMUZvbnQ6OkNQREZfVHlwZTFGb250KCkgOiBDUERGX1NpbXBsZUZvbnQoUERGRk9OVF9UWVBFMSkgeworICBtX0Jhc2UxNEZvbnQgPSAtMTsKK30KK0ZYX0JPT0wgQ1BERl9UeXBlMUZvbnQ6Ol9Mb2FkKCkgeworICBtX0Jhc2UxNEZvbnQgPSBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUobV9CYXNlRm9udCk7CisgIGlmIChtX0Jhc2UxNEZvbnQgPj0gMCkgeworICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0KKyAgICAgICAgbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkZvbnREZXNjcmlwdG9yIikpOworICAgIGlmIChwRm9udERlc2MgJiYgcEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiRmxhZ3MiKSkpIHsKKyAgICAgIG1fRmxhZ3MgPSBwRm9udERlc2MtPkdldEludGVnZXIoRlhfQlNUUkMoIkZsYWdzIikpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVswXSk7CisgICAgICBtX0ZsYWdzID0gbV9CYXNlMTRGb250ID49IDEyID8gUERGRk9OVF9TWU1CT0xJQyA6IFBERkZPTlRfTk9OU1lNQk9MSUM7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIGlmIChtX0Jhc2UxNEZvbnQgPCA0KQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBtX0NoYXJXaWR0aFtpXSA9IDYwMDsKKyAgICAgIH0KKyAgICBpZiAobV9CYXNlMTRGb250ID09IDEyKSB7CisgICAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MOworICAgIH0gZWxzZSBpZiAobV9CYXNlMTRGb250ID09IDEzKSB7CisgICAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOworICAgIH0gZWxzZSBpZiAobV9GbGFncyAmIFBERkZPTlRfTk9OU1lNQk9MSUMpIHsKKyAgICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIExvYWRDb21tb24oKTsKK30KK3N0YXRpYyBGWF9CT09MIEZUX1VzZVR5cGUxQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSkgeworICBpZiAoRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgPT0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgPT0gMSAmJgorICAgICAgRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpWzBdKSA9PQorICAgICAgICAgIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpWzBdKSA9PQorICAgICAgRlhGVF9FTkNPRElOR19VTklDT0RFKSB7CisgICAgRlhGVF9TZXRfQ2hhcm1hcChmYWNlLCBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpWzFdKTsKKyAgfSBlbHNlIHsKKyAgICBGWEZUX1NldF9DaGFybWFwKGZhY2UsIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbMF0pOworICB9CisgIHJldHVybiBUUlVFOwogfQogZXh0ZXJuIEZYX1dDSEFSIEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoaW50IGVuY29kaW5nLCBGWF9EV09SRCBjaGFyY29kZSk7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KICNpbmNsdWRlICIuLi8uLi9meGdlL2FwcGxlL2FwcGxlX2ludC5oIgogI2VuZGlmCi1pbnQgQ1BERl9UeXBlMUZvbnQ6OkdseXBoRnJvbUNoYXJDb2RlRXh0KEZYX0RXT1JEIGNoYXJjb2RlKQotewotICAgIGlmIChjaGFyY29kZSA+IDB4ZmYpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgaW5kZXggPSBtX0V4dEdJRFsodWludDhfdCljaGFyY29kZV07Ci0gICAgaWYgKGluZGV4ID09IDB4ZmZmZikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiBpbmRleDsKK2ludCBDUERGX1R5cGUxRm9udDo6R2x5cGhGcm9tQ2hhckNvZGVFeHQoRlhfRFdPUkQgY2hhcmNvZGUpIHsKKyAgaWYgKGNoYXJjb2RlID4gMHhmZikgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpbnQgaW5kZXggPSBtX0V4dEdJRFsodWludDhfdCljaGFyY29kZV07CisgIGlmIChpbmRleCA9PSAweGZmZmYpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIGluZGV4OwogfQotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCiBzdHJ1Y3QgX0dseXBoTmFtZU1hcCB7Ci0gICAgY29uc3QgRlhfQ0hBUiogbV9wU3RyQWRvYmU7Ci0gICAgY29uc3QgRlhfQ0hBUiogbV9wU3RyVW5pY29kZTsKKyAgY29uc3QgRlhfQ0hBUiogbV9wU3RyQWRvYmU7CisgIGNvbnN0IEZYX0NIQVIqIG1fcFN0clVuaWNvZGU7CiB9Owotc3RhdGljIGNvbnN0IF9HbHlwaE5hbWVNYXAgZ19HbHlwaE5hbWVTdWJzdHNbXSA9IHsKLSAgICB7ImZmIiwgInVuaUZCMDAifSwKLSAgICB7ImZpIiwgInVuaUZCMDEifSwKLSAgICB7ImZsIiwgInVuaUZCMDIifSwKLSAgICB7ImZmaSIsICJ1bmlGQjAzIn0sCi0gICAgeyJmZmwiLCAidW5pRkIwNCJ9Ci19Oworc3RhdGljIGNvbnN0IF9HbHlwaE5hbWVNYXAgZ19HbHlwaE5hbWVTdWJzdHNbXSA9IHt7ImZmIiwgInVuaUZCMDAifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJmaSIsICJ1bmlGQjAxIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZmwiLCAidW5pRkIwMiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImZmaSIsICJ1bmlGQjAzIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZmZsIiwgInVuaUZCMDQifX07CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IGNvbXBhcmVTdHJpbmcoY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiBlbGVtZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYU1lTX3N0cmljbXAoKGNvbnN0IEZYX0NIQVIqKWtleSwgKChfR2x5cGhOYW1lTWFwKillbGVtZW50KS0+bV9wU3RyQWRvYmUpOwotICAgIH0KK3N0YXRpYyBpbnQgY29tcGFyZVN0cmluZyhjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpIHsKKyAgcmV0dXJuIEZYU1lTX3N0cmljbXAoKGNvbnN0IEZYX0NIQVIqKWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChfR2x5cGhOYW1lTWFwKillbGVtZW50KS0+bV9wU3RyQWRvYmUpOwogfQotc3RhdGljIGNvbnN0IEZYX0NIQVIqIF9HbHlwaE5hbWVSZW1hcChjb25zdCBGWF9DSEFSKiBwU3RyQWRvYmUpCi17Ci0gICAgX0dseXBoTmFtZU1hcCogZm91bmQgPSAoX0dseXBoTmFtZU1hcCopRlhTWVNfYnNlYXJjaChwU3RyQWRvYmUsIGdfR2x5cGhOYW1lU3Vic3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIGdfR2x5cGhOYW1lU3Vic3RzIC8gc2l6ZW9mKF9HbHlwaE5hbWVNYXApLCBzaXplb2YoX0dseXBoTmFtZU1hcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyaW5nKTsKLSAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgcmV0dXJuIGZvdW5kLT5tX3BTdHJVbmljb2RlOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBjb25zdCBGWF9DSEFSKiBfR2x5cGhOYW1lUmVtYXAoY29uc3QgRlhfQ0hBUiogcFN0ckFkb2JlKSB7CisgIF9HbHlwaE5hbWVNYXAqIGZvdW5kID0gKF9HbHlwaE5hbWVNYXAqKUZYU1lTX2JzZWFyY2goCisgICAgICBwU3RyQWRvYmUsIGdfR2x5cGhOYW1lU3Vic3RzLAorICAgICAgc2l6ZW9mIGdfR2x5cGhOYW1lU3Vic3RzIC8gc2l6ZW9mKF9HbHlwaE5hbWVNYXApLCBzaXplb2YoX0dseXBoTmFtZU1hcCksCisgICAgICBjb21wYXJlU3RyaW5nKTsKKyAgaWYgKGZvdW5kKSB7CisgICAgcmV0dXJuIGZvdW5kLT5tX3BTdHJVbmljb2RlOworICB9CisgIHJldHVybiBOVUxMOwogfQogI2VuZGlmCi12b2lkIENQREZfVHlwZTFGb250OjpMb2FkR2x5cGhNYXAoKQotewotICAgIGlmIChtX0ZvbnQubV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDUERGX1R5cGUxRm9udDo6TG9hZEdseXBoTWFwKCkgeworICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgRlhfQk9PTCBiQ29yZVRleHQgPSBUUlVFOworICBDUXVhcnR6MkQmIHF1YXJ0ejJkID0KKyAgICAgICgoQ0FwcGxlUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOworICBpZiAoIW1fRm9udC5tX3BQbGF0Zm9ybUZvbnQpIHsKKyAgICBpZiAobV9Gb250LkdldFBzTmFtZSgpID09IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkRGSGVpU3RkLVc1IikpIHsKKyAgICAgIGJDb3JlVGV4dCA9IEZBTFNFOwogICAgIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBGWF9CT09MIGJDb3JlVGV4dCA9IFRSVUU7Ci0gICAgQ1F1YXJ0ejJEICYgcXVhcnR6MmQgPSAoKENBcHBsZVBsYXRmb3JtICopIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOwotICAgIGlmICghbV9Gb250Lm1fcFBsYXRmb3JtRm9udCkgewotICAgICAgICBpZiAobV9Gb250LkdldFBzTmFtZSgpID09IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkRGSGVpU3RkLVc1IikpIHsKLSAgICAgICAgICAgIGJDb3JlVGV4dCA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1fRm9udC5tX3BQbGF0Zm9ybUZvbnQgPSBxdWFydHoyZC5DcmVhdGVGb250KG1fRm9udC5tX3BGb250RGF0YSwgbV9Gb250Lm1fZHdTaXplKTsKLSAgICAgICAgaWYgKE5VTEwgPT0gbV9Gb250Lm1fcFBsYXRmb3JtRm9udCkgewotICAgICAgICAgICAgYkNvcmVUZXh0ID0gRkFMU0U7Ci0gICAgICAgIH0KKyAgICBtX0ZvbnQubV9wUGxhdGZvcm1Gb250ID0KKyAgICAgICAgcXVhcnR6MmQuQ3JlYXRlRm9udChtX0ZvbnQubV9wRm9udERhdGEsIG1fRm9udC5tX2R3U2l6ZSk7CisgICAgaWYgKE5VTEwgPT0gbV9Gb250Lm1fcFBsYXRmb3JtRm9udCkgeworICAgICAgYkNvcmVUZXh0ID0gRkFMU0U7CiAgICAgfQorICB9CiAjZW5kaWYKLSAgICBpZiAoIUlzRW1iZWRkZWQoKSAmJiAobV9CYXNlMTRGb250IDwgMTIpICYmIG1fRm9udC5Jc1RURm9udCgpKSB7Ci0gICAgICAgIGlmIChGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMCkpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOwotICAgICAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHByZWZpeFs0XSA9IHsweDAwLCAweGYwLCAweGYxLCAweGYyfTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB1bmljb2RlID0gcHJlZml4W2pdICogMjU2ICsgY2hhcmNvZGU7Ci0gICAgICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIHVuaWNvZGUpOwotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIG5hbWVfZ2x5cGhbMjU2XTsKLSAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQubV9GYWNlLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLCBuYW1lX2dseXBoLCAyNTYpOwotICAgICAgICAgICAgICAgICAgICBuYW1lX2dseXBoWzI1NV0gPSAwOwotICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBuYW1lX2N0ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBuYW1lX2dseXBoLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJLCBrQ0ZBbGxvY2F0b3JOdWxsKTsKLSAgICAgICAgICAgICAgICAgICAgbV9FeHRHSURbY2hhcmNvZGVdID0gQ0dGb250R2V0R2x5cGhXaXRoR2x5cGhOYW1lKChDR0ZvbnRSZWYpbV9Gb250Lm1fcFBsYXRmb3JtRm9udCwgbmFtZV9jdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lX2N0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlJlbGVhc2UobmFtZV9jdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgaWYgKCFJc0VtYmVkZGVkKCkgJiYgKG1fQmFzZTE0Rm9udCA8IDEyKSAmJiBtX0ZvbnQuSXNUVEZvbnQoKSkgeworICAgIGlmIChGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMCkpIHsKKyAgICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOworICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgeworICAgICAgICBjb25zdCB1aW50OF90IHByZWZpeFs0XSA9IHsweDAwLCAweGYwLCAweGYxLCAweGYyfTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICBGWF9XT1JEIHVuaWNvZGUgPSBwcmVmaXhbal0gKiAyNTYgKyBjaGFyY29kZTsKKyAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCB1bmljb2RlKTsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOworICAgICAgICAgIEZYRlRfR2V0X0dseXBoX05hbWUobV9Gb250Lm1fRmFjZSwgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSwgbmFtZV9nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1Nik7CisgICAgICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKKyAgICAgICAgICBDRlN0cmluZ1JlZiBuYW1lX2N0ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSgKKyAgICAgICAgICAgICAga0NGQWxsb2NhdG9yRGVmYXVsdCwgbmFtZV9nbHlwaCwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSwKKyAgICAgICAgICAgICAga0NGQWxsb2NhdG9yTnVsbCk7CisgICAgICAgICAgbV9FeHRHSURbY2hhcmNvZGVdID0gQ0dGb250R2V0R2x5cGhXaXRoR2x5cGhOYW1lKAorICAgICAgICAgICAgICAoQ0dGb250UmVmKW1fRm9udC5tX3BQbGF0Zm9ybUZvbnQsIG5hbWVfY3QpOworICAgICAgICAgIGlmIChuYW1lX2N0KSB7CisgICAgICAgICAgICBDRlJlbGVhc2UobmFtZV9jdCk7CisgICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiR290T25lID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJHb3RPbmUpIHsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgICAgICAgICBpZiAoIWJDb3JlVGV4dCkgewotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkobV9FeHRHSUQsIG1fR2x5cGhJbmRleCwgMjU2KTsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKKyAgICAgICAgICAgIGJHb3RPbmUgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEZYRlRfU2VsZWN0X0NoYXJtYXAobV9Gb250Lm1fRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKTsKLSAgICAgICAgaWYgKG1fQmFzZUVuY29kaW5nID09IDApIHsKLSAgICAgICAgICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fcENoYXJOYW1lcywgY2hhcmNvZGUpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKLSAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0pOwotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICAgICAgRlhfQ0hBUiBuYW1lX2dseXBoWzI1Nl07Ci0gICAgICAgICAgICBGWEZUX0dldF9HbHlwaF9OYW1lKG1fRm9udC5tX0ZhY2UsIG1fR2x5cGhJbmRleFtjaGFyY29kZV0sIG5hbWVfZ2x5cGgsIDI1Nik7Ci0gICAgICAgICAgICBuYW1lX2dseXBoWzI1NV0gPSAwOwotICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgbmFtZV9jdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoa0NGQWxsb2NhdG9yRGVmYXVsdCwgbmFtZV9nbHlwaCwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSwga0NGQWxsb2NhdG9yTnVsbCk7Ci0gICAgICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoKENHRm9udFJlZiltX0ZvbnQubV9wUGxhdGZvcm1Gb250LCBuYW1lX2N0KTsKLSAgICAgICAgICAgIGlmIChuYW1lX2N0KSB7Ci0gICAgICAgICAgICAgICAgQ0ZSZWxlYXNlKG5hbWVfY3QpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9PSAwICYmIEZYU1lTX3N0cmNtcChuYW1lLCAiLm5vdGRlZiIpID09IDApIHsKLSAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gMHgyMDsKLSAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCAweDIwKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgICAgICAgICBGWF9DSEFSIG5hbWVfZ2x5cGhbMjU2XTsKLSAgICAgICAgICAgICAgICBGWEZUX0dldF9HbHlwaF9OYW1lKG1fRm9udC5tX0ZhY2UsIG1fR2x5cGhJbmRleFtjaGFyY29kZV0sIG5hbWVfZ2x5cGgsIDI1Nik7Ci0gICAgICAgICAgICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKLSAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBuYW1lX2N0ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBuYW1lX2dseXBoLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJLCBrQ0ZBbGxvY2F0b3JOdWxsKTsKLSAgICAgICAgICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoKENHRm9udFJlZiltX0ZvbnQubV9wUGxhdGZvcm1Gb250LCBuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZV9jdCkgewotICAgICAgICAgICAgICAgICAgICBDRlJlbGVhc2UobmFtZV9jdCk7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgICAgIH0KKyAgICAgIGlmIChiR290T25lKSB7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KICAgICAgICAgaWYgKCFiQ29yZVRleHQpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShtX0V4dEdJRCwgbV9HbHlwaEluZGV4LCAyNTYpOworICAgICAgICAgIEZYU1lTX21lbWNweShtX0V4dEdJRCwgbV9HbHlwaEluZGV4LCAyNTYpOwogICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgcmV0dXJuOworICAgICAgfQogICAgIH0KLSAgICBGVF9Vc2VUeXBlMUNoYXJtYXAobV9Gb250Lm1fRmFjZSk7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgaWYgKGJDb3JlVGV4dCkgewotICAgICAgICBpZiAobV9GbGFncyAmIFBERkZPTlRfU1lNQk9MSUMpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlICsrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fcENoYXJOYW1lcywgY2hhcmNvZGUpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5tX0ZhY2UsIChjaGFyKiluYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgbmFtZV9jdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoa0NGQWxsb2NhdG9yRGVmYXVsdCwgbmFtZSwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSwga0NGQWxsb2NhdG9yTnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIG1fRXh0R0lEW2NoYXJjb2RlXSA9IENHRm9udEdldEdseXBoV2l0aEdseXBoTmFtZSgoQ0dGb250UmVmKW1fRm9udC5tX3BQbGF0Zm9ybUZvbnQsIG5hbWVfY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZV9jdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSZWxlYXNlKG5hbWVfY3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgY2hhcmNvZGUpOwotICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB1bmljb2RlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUgPSBGVF9Vbmljb2RlRnJvbUNoYXJDb2RlKFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQsIGNoYXJjb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIG5hbWVfZ2x5cGhbMjU2XTsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG5hbWVfZ2x5cGgsIDAsIHNpemVvZihuYW1lX2dseXBoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0dseXBoX05hbWUobV9Gb250Lm1fRmFjZSwgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSwgbmFtZV9nbHlwaCwgMjU2KTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVuaWNvZGUgPT0gMCAmJiBuYW1lX2dseXBoWzBdICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUgPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZV9nbHlwaCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IHVuaWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWVfZ2x5cGgsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksIGtDRkFsbG9jYXRvck51bGwpOwotICAgICAgICAgICAgICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoKENHRm9udFJlZiltX0ZvbnQubV9wUGxhdGZvcm1Gb250LCBuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVfY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKKyAgICBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSk7CisgICAgaWYgKG1fQmFzZUVuY29kaW5nID09IDApIHsKKyAgICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKKyAgICB9CisgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgeworICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9CisgICAgICAgICAgR2V0QWRvYmVDaGFyTmFtZShtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKKyAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQorICAgICAgICAgIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSk7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOworICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQubV9GYWNlLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLCBuYW1lX2dseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYpOworICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKKyAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KAorICAgICAgICAgIGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWVfZ2x5cGgsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksCisgICAgICAgICAga0NGQWxsb2NhdG9yTnVsbCk7CisgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoCisgICAgICAgICAgKENHRm9udFJlZiltX0ZvbnQubV9wUGxhdGZvcm1Gb250LCBuYW1lX2N0KTsKKyAgICAgIGlmIChuYW1lX2N0KSB7CisgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCAmJiBGWFNZU19zdHJjbXAobmFtZSwgIi5ub3RkZWYiKSA9PSAwKSB7CisgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSAweDIwOworICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCAweDIwKTsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgICAgICBGWF9DSEFSIG5hbWVfZ2x5cGhbMjU2XTsKKyAgICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQubV9GYWNlLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLCBuYW1lX2dseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1Nik7CisgICAgICAgIG5hbWVfZ2x5cGhbMjU1XSA9IDA7CisgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KAorICAgICAgICAgICAga0NGQWxsb2NhdG9yRGVmYXVsdCwgbmFtZV9nbHlwaCwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSwKKyAgICAgICAgICAgIGtDRkFsbG9jYXRvck51bGwpOworICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoCisgICAgICAgICAgICAoQ0dGb250UmVmKW1fRm9udC5tX3BQbGF0Zm9ybUZvbnQsIG5hbWVfY3QpOworICAgICAgICBpZiAobmFtZV9jdCkgeworICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKICAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJVbmljb2RlID0gRkFMU0U7Ci0gICAgICAgIGlmICgwID09IEZYRlRfU2VsZWN0X0NoYXJtYXAobV9Gb250Lm1fRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgewotICAgICAgICAgICAgYlVuaWNvZGUgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlICsrKSB7Ci0gICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0gR2V0QWRvYmVDaGFyTmFtZShtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOwotICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcFN0clVuaWNvZGUgPSBfR2x5cGhOYW1lUmVtYXAobmFtZSk7Ci0gICAgICAgICAgICBpZiAocFN0clVuaWNvZGUgJiYgMCA9PSBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5tX0ZhY2UsIChjaGFyKiluYW1lKSkgewotICAgICAgICAgICAgICAgIG5hbWUgPSBwU3RyVW5pY29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5tX0ZhY2UsIChjaGFyKiluYW1lKTsKLSAgICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWUsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksIGtDRkFsbG9jYXRvck51bGwpOwotICAgICAgICAgICAgbV9FeHRHSURbY2hhcmNvZGVdID0gQ0dGb250R2V0R2x5cGhXaXRoR2x5cGhOYW1lKChDR0ZvbnRSZWYpbV9Gb250Lm1fcFBsYXRmb3JtRm9udCwgbmFtZV9jdCk7Ci0gICAgICAgICAgICBpZiAobmFtZV9jdCkgewotICAgICAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoRlhTWVNfc3RyY21wKG5hbWUsICIubm90ZGVmIikgIT0gMCAmJiBGWFNZU19zdHJjbXAobmFtZSwgInNwYWNlIikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCBiVW5pY29kZSA/IG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gOiBjaGFyY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOwotICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9HbHlwaF9OYW1lKG1fRm9udC5tX0ZhY2UsIG1fR2x5cGhJbmRleFtjaGFyY29kZV0sIG5hbWVfZ2x5cGgsIDI1Nik7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVfZ2x5cGhbMjU1XSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWVfZ2x5cGgsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksIGtDRkFsbG9jYXRvck51bGwpOwotICAgICAgICAgICAgICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoKENHRm9udFJlZiltX0ZvbnQubV9wUGxhdGZvcm1Gb250LCBuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVfY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSAweDIwOwotICAgICAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gYlVuaWNvZGUgPyBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIDB4MjApIDogMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIG5hbWVfZ2x5cGhbMjU2XTsKLSAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQubV9GYWNlLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLCBuYW1lX2dseXBoLCAyNTYpOwotICAgICAgICAgICAgICAgICAgICBuYW1lX2dseXBoWzI1NV0gPSAwOwotICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBuYW1lX2N0ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBuYW1lX2dseXBoLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJLCBrQ0ZBbGxvY2F0b3JOdWxsKTsKLSAgICAgICAgICAgICAgICAgICAgbV9FeHRHSURbY2hhcmNvZGVdID0gQ0dGb250R2V0R2x5cGhXaXRoR2x5cGhOYW1lKChDR0ZvbnRSZWYpbV9Gb250Lm1fcFBsYXRmb3JtRm9udCwgbmFtZV9jdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lX2N0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlJlbGVhc2UobmFtZV9jdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOworI2VuZGlmCisgICAgICB9CisgICAgfQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgaWYgKCFiQ29yZVRleHQpIHsKKyAgICAgIEZYU1lTX21lbWNweShtX0V4dEdJRCwgbV9HbHlwaEluZGV4LCAyNTYpOwogICAgIH0KICNlbmRpZgorICAgIHJldHVybjsKKyAgfQorICBGVF9Vc2VUeXBlMUNoYXJtYXAobV9Gb250Lm1fRmFjZSk7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgaWYgKGJDb3JlVGV4dCkgewogICAgIGlmIChtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykgewotICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fcENoYXJOYW1lcywgY2hhcmNvZGUpOwotICAgICAgICAgICAgaWYgKG5hbWUpIHsKLSAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5tX0ZhY2UsIChjaGFyKiluYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgY2hhcmNvZGUpOwotICAgICAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHVuaWNvZGUgPSBGVF9Vbmljb2RlRnJvbUNoYXJDb2RlKFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQsIGNoYXJjb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVuaWNvZGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUiBuYW1lX2dseXBoWzI1Nl07Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQobmFtZV9nbHlwaCwgMCwgc2l6ZW9mKG5hbWVfZ2x5cGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0dseXBoX05hbWUobV9Gb250Lm1fRmFjZSwgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSwgbmFtZV9nbHlwaCwgMjU2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfZ2x5cGhbMjU1XSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZV9nbHlwaFswXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lX2dseXBoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gdW5pY29kZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSsrKSB7CisgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPQorICAgICAgICAgICAgR2V0QWRvYmVDaGFyTmFtZShtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgICAgIGlmIChuYW1lKSB7CisgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKKyAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICAgICAgRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQubV9GYWNlLCAoY2hhciopbmFtZSk7CisgICAgICAgICAgQ0ZTdHJpbmdSZWYgbmFtZV9jdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoCisgICAgICAgICAgICAgIGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWUsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksCisgICAgICAgICAgICAgIGtDRkFsbG9jYXRvck51bGwpOworICAgICAgICAgIG1fRXh0R0lEW2NoYXJjb2RlXSA9IENHRm9udEdldEdseXBoV2l0aEdseXBoTmFtZSgKKyAgICAgICAgICAgICAgKENHRm9udFJlZiltX0ZvbnQubV9wUGxhdGZvcm1Gb250LCBuYW1lX2N0KTsKKyAgICAgICAgICBpZiAobmFtZV9jdCkgeworICAgICAgICAgICAgQ0ZSZWxlYXNlKG5hbWVfY3QpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCBjaGFyY29kZSk7CisgICAgICAgICAgRlhfV0NIQVIgdW5pY29kZSA9IDA7CisgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKKyAgICAgICAgICAgIHVuaWNvZGUgPQorICAgICAgICAgICAgICAgIEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoUERGRk9OVF9FTkNPRElOR19TVEFOREFSRCwgY2hhcmNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBGWF9DSEFSIG5hbWVfZ2x5cGhbMjU2XTsKKyAgICAgICAgICBGWFNZU19tZW1zZXQobmFtZV9nbHlwaCwgMCwgc2l6ZW9mKG5hbWVfZ2x5cGgpKTsKKyAgICAgICAgICBGWEZUX0dldF9HbHlwaF9OYW1lKG1fRm9udC5tX0ZhY2UsIG1fR2x5cGhJbmRleFtjaGFyY29kZV0sIG5hbWVfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYpOworICAgICAgICAgIG5hbWVfZ2x5cGhbMjU1XSA9IDA7CisgICAgICAgICAgaWYgKHVuaWNvZGUgPT0gMCAmJiBuYW1lX2dseXBoWzBdICE9IDApIHsKKyAgICAgICAgICAgIHVuaWNvZGUgPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZV9nbHlwaCk7CisgICAgICAgICAgfQorICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSB1bmljb2RlOworICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KAorICAgICAgICAgICAgICBrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBuYW1lX2dseXBoLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJLAorICAgICAgICAgICAgICBrQ0ZBbGxvY2F0b3JOdWxsKTsKKyAgICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoCisgICAgICAgICAgICAgIChDR0ZvbnRSZWYpbV9Gb250Lm1fcFBsYXRmb3JtRm9udCwgbmFtZV9jdCk7CisgICAgICAgICAgaWYgKG5hbWVfY3QpIHsKKyAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgaWYgKCFiQ29yZVRleHQpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShtX0V4dEdJRCwgbV9HbHlwaEluZGV4LCAyNTYpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgcmV0dXJuOwogICAgIH0KICAgICBGWF9CT09MIGJVbmljb2RlID0gRkFMU0U7CiAgICAgaWYgKDAgPT0gRlhGVF9TZWxlY3RfQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpKSB7Ci0gICAgICAgIGJVbmljb2RlID0gVFJVRTsKKyAgICAgIGJVbmljb2RlID0gVFJVRTsKICAgICB9Ci0gICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fcENoYXJOYW1lcywgY2hhcmNvZGUpOwotICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSsrKSB7CisgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0KKyAgICAgICAgICBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKKyAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOworICAgICAgY29uc3QgRlhfQ0hBUiogcFN0clVuaWNvZGUgPSBfR2x5cGhOYW1lUmVtYXAobmFtZSk7CisgICAgICBpZiAocFN0clVuaWNvZGUgJiYgMCA9PSBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5tX0ZhY2UsIChjaGFyKiluYW1lKSkgeworICAgICAgICBuYW1lID0gcFN0clVuaWNvZGU7CisgICAgICB9CisgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQubV9GYWNlLCAoY2hhciopbmFtZSk7CisgICAgICBDRlN0cmluZ1JlZiBuYW1lX2N0ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSgKKyAgICAgICAgICBrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBuYW1lLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJLCBrQ0ZBbGxvY2F0b3JOdWxsKTsKKyAgICAgIG1fRXh0R0lEW2NoYXJjb2RlXSA9IENHRm9udEdldEdseXBoV2l0aEdseXBoTmFtZSgKKyAgICAgICAgICAoQ0dGb250UmVmKW1fRm9udC5tX3BQbGF0Zm9ybUZvbnQsIG5hbWVfY3QpOworICAgICAgaWYgKG5hbWVfY3QpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKG5hbWVfY3QpOworICAgICAgfQorICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCkgeworICAgICAgICBpZiAoRlhTWVNfc3RyY21wKG5hbWUsICIubm90ZGVmIikgIT0gMCAmJgorICAgICAgICAgICAgRlhTWVNfc3RyY21wKG5hbWUsICJzcGFjZSIpICE9IDApIHsKKyAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleCgKKyAgICAgICAgICAgICAgbV9Gb250Lm1fRmFjZSwKKyAgICAgICAgICAgICAgYlVuaWNvZGUgPyBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdIDogY2hhcmNvZGUpOworICAgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOworICAgICAgICAgIEZYRlRfR2V0X0dseXBoX05hbWUobV9Gb250Lm1fRmFjZSwgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSwgbmFtZV9nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1Nik7CisgICAgICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKKyAgICAgICAgICBDRlN0cmluZ1JlZiBuYW1lX2N0ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSgKKyAgICAgICAgICAgICAga0NGQWxsb2NhdG9yRGVmYXVsdCwgbmFtZV9nbHlwaCwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSwKKyAgICAgICAgICAgICAga0NGQWxsb2NhdG9yTnVsbCk7CisgICAgICAgICAgbV9FeHRHSURbY2hhcmNvZGVdID0gQ0dGb250R2V0R2x5cGhXaXRoR2x5cGhOYW1lKAorICAgICAgICAgICAgICAoQ0dGb250UmVmKW1fRm9udC5tX3BQbGF0Zm9ybUZvbnQsIG5hbWVfY3QpOworICAgICAgICAgIGlmIChuYW1lX2N0KSB7CisgICAgICAgICAgICBDRlJlbGVhc2UobmFtZV9jdCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSAweDIwOworICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQorICAgICAgICAgICAgICBiVW5pY29kZSA/IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgMHgyMCkgOiAweGZmZmY7CisgICAgICAgICAgRlhfQ0hBUiBuYW1lX2dseXBoWzI1Nl07CisgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQubV9GYWNlLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLCBuYW1lX2dseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2KTsKKyAgICAgICAgICBuYW1lX2dseXBoWzI1NV0gPSAwOworICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KAorICAgICAgICAgICAgICBrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBuYW1lX2dseXBoLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJLAorICAgICAgICAgICAgICBrQ0ZBbGxvY2F0b3JOdWxsKTsKKyAgICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoCisgICAgICAgICAgICAgIChDR0ZvbnRSZWYpbV9Gb250Lm1fcFBsYXRmb3JtRm9udCwgbmFtZV9jdCk7CisgICAgICAgICAgaWYgKG5hbWVfY3QpIHsKKyAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisjZW5kaWYKKyAgaWYgKG1fRmxhZ3MgJiBQREZGT05UX1NZTUJPTElDKSB7CisgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgeworICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9CisgICAgICAgICAgR2V0QWRvYmVDaGFyTmFtZShtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgICBpZiAobmFtZSkgewogICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOwotICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQubV9GYWNlLCAoY2hhciopbmFtZSk7Ci0gICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdID09IDApIHsKLSAgICAgICAgICAgIGlmIChGWFNZU19zdHJjbXAobmFtZSwgIi5ub3RkZWYiKSAhPSAwICYmIEZYU1lTX3N0cmNtcChuYW1lLCAic3BhY2UiKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgYlVuaWNvZGUgPyBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdIDogY2hhcmNvZGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gMHgyMDsKLSAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gMHhmZmZmOworICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICAgIEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250Lm1fRmFjZSwgKGNoYXIqKW5hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgY2hhcmNvZGUpOworICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSkgeworICAgICAgICAgIEZYX1dDSEFSIHVuaWNvZGUgPQorICAgICAgICAgICAgICBGVF9Vbmljb2RlRnJvbUNoYXJDb2RlKFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQsIGNoYXJjb2RlKTsKKyAgICAgICAgICBpZiAodW5pY29kZSA9PSAwKSB7CisgICAgICAgICAgICBGWF9DSEFSIG5hbWVfZ2x5cGhbMjU2XTsKKyAgICAgICAgICAgIEZYU1lTX21lbXNldChuYW1lX2dseXBoLCAwLCBzaXplb2YobmFtZV9nbHlwaCkpOworICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQubV9GYWNlLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2dseXBoLCAyNTYpOworICAgICAgICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKKyAgICAgICAgICAgIGlmIChuYW1lX2dseXBoWzBdICE9IDApIHsKKyAgICAgICAgICAgICAgdW5pY29kZSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lX2dseXBoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IHVuaWNvZGU7CiAgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KICAgICBpZiAoIWJDb3JlVGV4dCkgewotICAgICAgICBGWFNZU19tZW1jcHkobV9FeHRHSUQsIG1fR2x5cGhJbmRleCwgMjU2KTsKKyAgICAgIEZYU1lTX21lbWNweShtX0V4dEdJRCwgbV9HbHlwaEluZGV4LCAyNTYpOwogICAgIH0KICNlbmRpZgotfQotQ1BERl9Gb250RW5jb2Rpbmc6OkNQREZfRm9udEVuY29kaW5nKCkKLXsKLSAgICBGWFNZU19tZW1zZXQobV9Vbmljb2RlcywgMCwgc2l6ZW9mKG1fVW5pY29kZXMpKTsKLX0KLWludCBDUERGX0ZvbnRFbmNvZGluZzo6Q2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKSBjb25zdAotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKQotICAgICAgICBpZiAobV9Vbmljb2Rlc1tpXSA9PSB1bmljb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIHJldHVybiAtMTsKLX0KLUNQREZfRm9udEVuY29kaW5nOjpDUERGX0ZvbnRFbmNvZGluZyhpbnQgUHJlZGVmaW5lZEVuY29kaW5nKQotewotICAgIGNvbnN0IEZYX1dPUkQqIHBTcmMgPSBQREZfVW5pY29kZXNGb3JQcmVkZWZpbmVkQ2hhclNldChQcmVkZWZpbmVkRW5jb2RpbmcpOwotICAgIGlmICghcFNyYykgewotICAgICAgICBGWFNZU19tZW1zZXQobV9Vbmljb2RlcywgMCwgc2l6ZW9mKG1fVW5pY29kZXMpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICAgICAgbV9Vbmljb2Rlc1tpXSA9IHBTcmNbaV07Ci0gICAgICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9Gb250RW5jb2Rpbmc6OklzSWRlbnRpY2FsKENQREZfRm9udEVuY29kaW5nKiBwQW5vdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gRlhTWVNfbWVtY21wKG1fVW5pY29kZXMsIHBBbm90aGVyLT5tX1VuaWNvZGVzLCBzaXplb2YobV9Vbmljb2RlcykpID09IDA7Ci19Ci1DUERGX09iamVjdCogQ1BERl9Gb250RW5jb2Rpbmc6OlJlYWxpemUoKQotewotICAgIGludCBwcmVkZWZpbmVkID0gMDsKLSAgICBmb3IgKGludCBjcyA9IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSTsgY3MgPCBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUzsgY3MgKyspIHsKLSAgICAgICAgY29uc3QgRlhfV09SRCogcFNyYyA9IFBERl9Vbmljb2Rlc0ZvclByZWRlZmluZWRDaGFyU2V0KGNzKTsKLSAgICAgICAgRlhfQk9PTCBtYXRjaCA9IFRSVUU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKLSAgICAgICAgICAgIGlmIChtX1VuaWNvZGVzW2ldICE9IHBTcmNbaV0pIHsKLSAgICAgICAgICAgICAgICBtYXRjaCA9IEZBTFNFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXRjaCkgewotICAgICAgICAgICAgcHJlZGVmaW5lZCA9IGNzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHByZWRlZmluZWQpIHsKLSAgICAgICAgaWYgKHByZWRlZmluZWQgPT0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9OYW1lOjpDcmVhdGUoIldpbkFuc2lFbmNvZGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVkZWZpbmVkID09IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4pIHsKLSAgICAgICAgICAgIHJldHVybiBDUERGX05hbWU6OkNyZWF0ZSgiTWFjUm9tYW5FbmNvZGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVkZWZpbmVkID09IFBERkZPTlRfRU5DT0RJTkdfTUFDRVhQRVJUKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9OYW1lOjpDcmVhdGUoIk1hY0V4cGVydEVuY29kaW5nIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkJhc2VFbmNvZGluZyIpLCBGWF9CU1RSQygiV2luQW5zaUVuY29kaW5nIikpOwotICAgIGNvbnN0IEZYX1dPUkQqIHBTdGFuZGFyZCA9IFBERl9Vbmljb2Rlc0ZvclByZWRlZmluZWRDaGFyU2V0KFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSk7Ci0gICAgQ1BERl9BcnJheSogcERpZmYgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICBpZiAocFN0YW5kYXJkW2ldID09IG1fVW5pY29kZXNbaV0pIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHBEaWZmLT5BZGQoQ1BERl9OdW1iZXI6OkNyZWF0ZShpKSk7Ci0gICAgICAgIHBEaWZmLT5BZGQoQ1BERl9OYW1lOjpDcmVhdGUoUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKG1fVW5pY29kZXNbaV0pKSk7Ci0gICAgfQotICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiRGlmZmVyZW5jZXMiKSwgcERpZmYpOwotICAgIHJldHVybiBwRGljdDsKLX0KLUNQREZfVHJ1ZVR5cGVGb250OjpDUERGX1RydWVUeXBlRm9udCgpIDogQ1BERl9TaW1wbGVGb250KFBERkZPTlRfVFJVRVRZUEUpCi17Ci19Ci1GWF9CT09MIENQREZfVHJ1ZVR5cGVGb250OjpfTG9hZCgpCi17Ci0gICAgcmV0dXJuIExvYWRDb21tb24oKTsKLX0KLXZvaWQgQ1BERl9UcnVlVHlwZUZvbnQ6OkxvYWRHbHlwaE1hcCgpCi17Ci0gICAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBiYXNlRW5jb2RpbmcgPSBtX0Jhc2VFbmNvZGluZzsKLSAgICBpZiAobV9wRm9udEZpbGUgJiYgbV9Gb250Lm1fRmFjZS0+bnVtX2NoYXJtYXBzID4gMAotICAgICAgICAgICAgJiYgKGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOIHx8IGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpCi0gICAgICAgICAgICAmJiAobV9GbGFncyAmIFBERkZPTlRfU1lNQk9MSUMpKSB7Ci0gICAgICAgIEZYX0JPT0wgYlN1cHBvcnRXaW4gPSBGQUxTRTsKLSAgICAgICAgRlhfQk9PTCBiU3VwcG9ydE1hYyA9IEZBTFNFOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KG1fRm9udC5tX0ZhY2UpOyBpKyspIHsKLSAgICAgICAgICAgIGludCBwbGF0Zm9ybV9pZCA9IEZYRlRfR2V0X0NoYXJtYXBfUGxhdGZvcm1JRChGWEZUX0dldF9GYWNlX0NoYXJtYXBzKG1fRm9udC5tX0ZhY2UpW2ldKTsKLSAgICAgICAgICAgIGlmIChwbGF0Zm9ybV9pZCA9PSAwIHx8IHBsYXRmb3JtX2lkID09IDMpIHsKLSAgICAgICAgICAgICAgICBiU3VwcG9ydFdpbiA9IFRSVUU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBsYXRmb3JtX2lkID09IDAgfHwgcGxhdGZvcm1faWQgPT0gMSkgewotICAgICAgICAgICAgICAgIGJTdXBwb3J0TWFjID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSAmJiAhYlN1cHBvcnRXaW4pIHsKLSAgICAgICAgICAgIGJhc2VFbmNvZGluZyA9IGJTdXBwb3J0TWFjID8gUERGRk9OVF9FTkNPRElOR19NQUNST01BTiA6IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTjsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19NQUNST01BTiAmJiAhYlN1cHBvcnRNYWMpIHsKLSAgICAgICAgICAgIGJhc2VFbmNvZGluZyA9IGJTdXBwb3J0V2luID8gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJIDogUERGRk9OVF9FTkNPRElOR19CVUlMVElOOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICgoKGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOIHx8IGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpCi0gICAgICAgICAgICAmJiBtX3BDaGFyTmFtZXMgPT0gTlVMTCkgfHwgKG1fRmxhZ3MgJiBQREZGT05UX05PTlNZTUJPTElDKSkgewotICAgICAgICBpZiAoIUZYRlRfSGFzX0dseXBoX05hbWVzKG1fRm9udC5tX0ZhY2UpICYmICghbV9Gb250Lm1fRmFjZS0+bnVtX2NoYXJtYXBzIHx8ICFtX0ZvbnQubV9GYWNlLT5jaGFybWFwcykpIHsKLSAgICAgICAgICAgIGludCBuU3RhcnRDaGFyID0gbV9wRm9udERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkZpcnN0Q2hhciIpKTsKLSAgICAgICAgICAgIGlmKG5TdGFydENoYXIgPCAwIHx8IG5TdGFydENoYXIgPiAyNTUpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpbnQgY2hhcmNvZGUgPSAwOwotICAgICAgICAgICAgZm9yICg7IGNoYXJjb2RlIDwgblN0YXJ0Q2hhcjsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX1dPUkQgbkdseXBoID0gY2hhcmNvZGUgLSBuU3RhcnRDaGFyICsgMzsKLSAgICAgICAgICAgIGZvciAoOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyssIG5HbHlwaCArKykgewotICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBuR2x5cGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiTVNVbmljb2RlID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDMsIDEpOwotICAgICAgICBGWF9CT09MIGJNYWNSb21hbiA9IEZBTFNFLCBiTVNTeW1ib2wgPSBGQUxTRTsKLSAgICAgICAgaWYgKCFiTVNVbmljb2RlKSB7Ci0gICAgICAgICAgICBpZiAobV9GbGFncyAmIFBERkZPTlRfTk9OU1lNQk9MSUMpIHsKLSAgICAgICAgICAgICAgICBiTWFjUm9tYW4gPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMSwgMCk7Ci0gICAgICAgICAgICAgICAgYk1TU3ltYm9sID0gIWJNYWNSb21hbiAmJiBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJNU1N5bWJvbCA9IEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAzLCAwKTsKLSAgICAgICAgICAgICAgICBiTWFjUm9tYW4gPSAhYk1TU3ltYm9sICYmIEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAxLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJUb1VuaWNvZGUgPSBtX3BGb250RGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlRvVW5pY29kZSIpKTsKLSAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKGJhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IG1fcEZvbnRGaWxlID8gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCBjaGFyY29kZSkgOiAtMTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBpZiAoYk1TU3ltYm9sKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBwcmVmaXhbNF0gPSB7MHgwMCwgMHhmMCwgMHhmMSwgMHhmMn07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IHByZWZpeFtqXSAqIDI1NiArIGNoYXJjb2RlOwotICAgICAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCB1bmljb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJNU1VuaWNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiTWFjUm9tYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFjY29kZSA9IEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbWFjY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250Lm1fRmFjZSwgKGNoYXIgKiluYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIG1hY2NvZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtX0dseXBoSW5kZXhbY2hhcmNvZGVdID09IDAgfHwgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9PSAweGZmZmYpICYmIG5hbWUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiBGWFNZU19zdHJjbXAobmFtZSwgIi5ub3RkZWYiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIDMyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQubV9GYWNlLCAoY2hhciopbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiVG9Vbmljb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NVbmljb2RlID0gVW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3c1VuaWNvZGUuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIHdzVW5pY29kZVswXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSB3c1VuaWNvZGVbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIGNoYXJjb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMCkpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCBwcmVmaXhbNF0gPSB7MHgwMCwgMHhmMCwgMHhmMSwgMHhmMn07Ci0gICAgICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOwotICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfV09SRCB1bmljb2RlID0gcHJlZml4W2pdICogMjU2ICsgY2hhcmNvZGU7Ci0gICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICAgICAgYkdvdE9uZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYkdvdE9uZSkgewotICAgICAgICAgICAgaWYgKGJhc2VFbmNvZGluZyAhPSBQREZGT05UX0VOQ09ESU5HX0JVSUxUSU4pIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0gR2V0QWRvYmVDaGFyTmFtZShiYXNlRW5jb2RpbmcsIG1fcENoYXJOYW1lcywgY2hhcmNvZGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDEsIDApKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgY2hhcmNvZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDEsIDApKSB7Ci0gICAgICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOwotICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgY2hhcmNvZGUpOwotICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgY2hhcmNvZGUpOwotICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICBiR290T25lID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobV9wRm9udEZpbGUgfHwgYkdvdE9uZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgPT0gMCkgewotICAgICAgICBGWF9CT09MIGJHb3RPbmUgPSBGQUxTRTsKLSAgICAgICAgY29uc3QgRlhfV09SRCogcFVuaWNvZGVzID0gUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoYmFzZUVuY29kaW5nKTsKLSAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgICAgIGlmIChtX3BGb250RmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUoMCwgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFVuaWNvZGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBwVW5pY29kZXNbY2hhcmNvZGVdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IGNoYXJjb2RlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSk7Ci0gICAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSkgewotICAgICAgICAgICAgICAgIGJHb3RPbmUgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChiR290T25lKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IGNoYXJjb2RlOwotICAgIH0KLX0KLUNQREZfVHlwZTNGb250OjpDUERGX1R5cGUzRm9udCgpIDogQ1BERl9TaW1wbGVGb250KFBERkZPTlRfVFlQRTMpCi17Ci0gICAgbV9wUGFnZVJlc291cmNlcyA9IE5VTEw7Ci0gICAgRlhTWVNfbWVtc2V0KG1fQ2hhcldpZHRoTCwgMCwgc2l6ZW9mIG1fQ2hhcldpZHRoTCk7Ci19Ci1DUERGX1R5cGUzRm9udDo6fkNQREZfVHlwZTNGb250KCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0NhY2hlTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIHZvaWQqIGtleTsKLSAgICAgICAgdm9pZCogdmFsdWU7Ci0gICAgICAgIG1fQ2FjaGVNYXAuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGRlbGV0ZSAoQ1BERl9UeXBlM0NoYXIqKXZhbHVlOwotICAgIH0KLSAgICBtX0NhY2hlTWFwLlJlbW92ZUFsbCgpOwotICAgIHBvcyA9IG1fRGVsZXRlZE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICB2b2lkKiBrZXk7Ci0gICAgICAgIHZvaWQqIHZhbHVlOwotICAgICAgICBtX0RlbGV0ZWRNYXAuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGRlbGV0ZSAoQ1BERl9UeXBlM0NoYXIqKWtleTsKLSAgICB9Ci19Ci1GWF9CT09MIENQREZfVHlwZTNGb250OjpfTG9hZCgpCi17Ci0gICAgbV9wRm9udFJlc291cmNlcyA9IG1fcEZvbnREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7Ci0gICAgQ1BERl9BcnJheSogcE1hdHJpeCA9IG1fcEZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRm9udE1hdHJpeCIpKTsKLSAgICBGWF9GTE9BVCB4c2NhbGUgPSAxLjBmLCB5c2NhbGUgPSAxLjBmOwotICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgIG1fRm9udE1hdHJpeCA9IHBNYXRyaXgtPkdldE1hdHJpeCgpOwotICAgICAgICB4c2NhbGUgPSBtX0ZvbnRNYXRyaXguYTsKLSAgICAgICAgeXNjYWxlID0gbV9Gb250TWF0cml4LmQ7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBCQm94ID0gbV9wRm9udERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJGb250QkJveCIpKTsKLSAgICBpZiAocEJCb3gpIHsKLSAgICAgICAgbV9Gb250QkJveC5sZWZ0ID0gKGludDMyX3QpKEZYU1lTX011bChwQkJveC0+R2V0TnVtYmVyKDApLCB4c2NhbGUpICogMTAwMCk7Ci0gICAgICAgIG1fRm9udEJCb3guYm90dG9tID0gKGludDMyX3QpKEZYU1lTX011bChwQkJveC0+R2V0TnVtYmVyKDEpLCB5c2NhbGUpICogMTAwMCk7Ci0gICAgICAgIG1fRm9udEJCb3gucmlnaHQgPSAoaW50MzJfdCkoRlhTWVNfTXVsKHBCQm94LT5HZXROdW1iZXIoMiksIHhzY2FsZSkgKiAxMDAwKTsKLSAgICAgICAgbV9Gb250QkJveC50b3AgPSAoaW50MzJfdCkoRlhTWVNfTXVsKHBCQm94LT5HZXROdW1iZXIoMyksIHlzY2FsZSkgKiAxMDAwKTsKLSAgICB9Ci0gICAgaW50IFN0YXJ0Q2hhciA9IG1fcEZvbnREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJGaXJzdENoYXIiKSk7Ci0gICAgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkgPSBtX3BGb250RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldpZHRocyIpKTsKLSAgICBpZiAocFdpZHRoQXJyYXkgJiYgKFN0YXJ0Q2hhciA+PSAwICYmIFN0YXJ0Q2hhciA8IDI1NikpIHsKLSAgICAgICAgRlhfRFdPUkQgY291bnQgPSBwV2lkdGhBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgaWYgKGNvdW50ID4gMjU2KSB7Ci0gICAgICAgICAgICBjb3VudCA9IDI1NjsKLSAgICAgICAgfQotICAgICAgICBpZiAoU3RhcnRDaGFyICsgY291bnQgPiAyNTYpIHsKLSAgICAgICAgICAgIGNvdW50ID0gMjU2IC0gU3RhcnRDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICAgICAgbV9DaGFyV2lkdGhMW1N0YXJ0Q2hhciArIGldID0gRlhTWVNfcm91bmQoRlhTWVNfTXVsKHBXaWR0aEFycmF5LT5HZXROdW1iZXIoaSksIHhzY2FsZSkgKiAxMDAwKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX3BDaGFyUHJvY3MgPSBtX3BGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiQ2hhclByb2NzIikpOwotICAgIENQREZfT2JqZWN0KiBwRW5jb2RpbmcgPSBtX3BGb250RGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJFbmNvZGluZyIpKTsKLSAgICBpZiAocEVuY29kaW5nKSB7Ci0gICAgICAgIExvYWRQREZFbmNvZGluZyhwRW5jb2RpbmcsIG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIEZBTFNFLCBGQUxTRSk7Ci0gICAgICAgIGlmIChtX3BDaGFyTmFtZXMpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2ldID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG1fcENoYXJOYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tpXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tpXSA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDUERGX1R5cGUzRm9udDo6Q2hlY2tUeXBlM0ZvbnRNZXRyaWNzKCkKLXsKLSAgICBDaGVja0ZvbnRNZXRyaWNzKCk7Ci19Ci1DUERGX1R5cGUzQ2hhciogQ1BERl9UeXBlM0ZvbnQ6OkxvYWRDaGFyKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwpCi17Ci0gICAgaWYgKGxldmVsID49IF9GUERGX01BWF9UWVBFM19GT1JNX0xFVkVMXykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9UeXBlM0NoYXIqIHBDaGFyID0gTlVMTDsKLSAgICBpZiAobV9DYWNoZU1hcC5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpY2hhcmNvZGUsICh2b2lkKiYpcENoYXIpKSB7Ci0gICAgICAgIGlmIChwQ2hhci0+bV9iUGFnZVJlcXVpcmVkICYmIG1fcFBhZ2VSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQ2hhcjsKLSAgICAgICAgICAgIG1fQ2FjaGVNYXAuUmVtb3ZlS2V5KCh2b2lkKikodWludHB0cl90KWNoYXJjb2RlKTsKLSAgICAgICAgICAgIHJldHVybiBMb2FkQ2hhcihjaGFyY29kZSwgbGV2ZWwgKyAxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcENoYXI7Ci0gICAgfQotICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfQk9PTCBiVW5pY29kZSA9IEZBTFNFOworICBpZiAoMCA9PSBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkpIHsKKyAgICBiVW5pY29kZSA9IFRSVUU7CisgIH0KKyAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgeworICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPQorICAgICAgICBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgY29udGludWU7CiAgICAgfQotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKikobV9wQ2hhclByb2NzID8gbV9wQ2hhclByb2NzLT5HZXRFbGVtZW50VmFsdWUobmFtZSkgOiBOVUxMKTsKLSAgICBpZiAocFN0cmVhbSA9PSBOVUxMIHx8IHBTdHJlYW0tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7CisgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250Lm1fRmFjZSwgKGNoYXIqKW5hbWUpOworICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdID09IDApIHsKKyAgICAgIGlmIChGWFNZU19zdHJjbXAobmFtZSwgIi5ub3RkZWYiKSAhPSAwICYmCisgICAgICAgICAgRlhTWVNfc3RyY21wKG5hbWUsICJzcGFjZSIpICE9IDApIHsKKyAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoCisgICAgICAgICAgICBtX0ZvbnQubV9GYWNlLAorICAgICAgICAgICAgYlVuaWNvZGUgPyBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdIDogY2hhcmNvZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IDB4MjA7CisgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSAweGZmZmY7CisgICAgICB9CiAgICAgfQotICAgIHBDaGFyID0gbmV3IENQREZfVHlwZTNDaGFyOwotICAgIHBDaGFyLT5tX3BGb3JtID0gbmV3IENQREZfRm9ybShtX3BEb2N1bWVudCwgbV9wRm9udFJlc291cmNlcyA/IG1fcEZvbnRSZXNvdXJjZXMgOiBtX3BQYWdlUmVzb3VyY2VzLCBwU3RyZWFtLCBOVUxMKTsKLSAgICBwQ2hhci0+bV9wRm9ybS0+UGFyc2VDb250ZW50KE5VTEwsIE5VTEwsIHBDaGFyLCBOVUxMLCBsZXZlbCArIDEpOwotICAgIEZYX0ZMT0FUIHNjYWxlID0gbV9Gb250TWF0cml4LkdldFhVbml0KCk7Ci0gICAgcENoYXItPm1fV2lkdGggPSAoaW50MzJfdCkocENoYXItPm1fV2lkdGggKiBzY2FsZSArIDAuNWYpOwotICAgIEZYX1JFQ1QgJnJjQkJveCA9IHBDaGFyLT5tX0JCb3g7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBjaGFyX3JlY3QoKEZYX0ZMT0FUKXJjQkJveC5sZWZ0IC8gMTAwMC4wZiwgKEZYX0ZMT0FUKXJjQkJveC5ib3R0b20gLyAxMDAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClyY0JCb3gucmlnaHQgLyAxMDAwLjBmLCAoRlhfRkxPQVQpcmNCQm94LnRvcCAvIDEwMDAuMGYpOwotICAgIGlmIChyY0JCb3gucmlnaHQgPD0gcmNCQm94LmxlZnQgfHwgcmNCQm94LmJvdHRvbSA+PSByY0JCb3gudG9wKSB7Ci0gICAgICAgIGNoYXJfcmVjdCA9IHBDaGFyLT5tX3BGb3JtLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgfQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgIGlmICghYkNvcmVUZXh0KSB7CisgICAgRlhTWVNfbWVtY3B5KG1fRXh0R0lELCBtX0dseXBoSW5kZXgsIDI1Nik7CisgIH0KKyNlbmRpZgorfQorQ1BERl9Gb250RW5jb2Rpbmc6OkNQREZfRm9udEVuY29kaW5nKCkgeworICBGWFNZU19tZW1zZXQobV9Vbmljb2RlcywgMCwgc2l6ZW9mKG1fVW5pY29kZXMpKTsKK30KK2ludCBDUERGX0ZvbnRFbmNvZGluZzo6Q2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKG1fVW5pY29kZXNbaV0gPT0gdW5pY29kZSkgeworICAgICAgcmV0dXJuIGk7CiAgICAgfQotICAgIGNoYXJfcmVjdC5UcmFuc2Zvcm0oJm1fRm9udE1hdHJpeCk7Ci0gICAgcmNCQm94LmxlZnQgPSBGWFNZU19yb3VuZChjaGFyX3JlY3QubGVmdCAqIDEwMDApOwotICAgIHJjQkJveC5yaWdodCA9IEZYU1lTX3JvdW5kKGNoYXJfcmVjdC5yaWdodCAqIDEwMDApOwotICAgIHJjQkJveC50b3AgPSBGWFNZU19yb3VuZChjaGFyX3JlY3QudG9wICogMTAwMCk7Ci0gICAgcmNCQm94LmJvdHRvbSA9IEZYU1lTX3JvdW5kKGNoYXJfcmVjdC5ib3R0b20gKiAxMDAwKTsKLSAgICBtX0NhY2hlTWFwLlNldEF0KCh2b2lkKikodWludHB0cl90KWNoYXJjb2RlLCBwQ2hhcik7Ci0gICAgaWYgKHBDaGFyLT5tX3BGb3JtLT5Db3VudE9iamVjdHMoKSA9PSAwKSB7Ci0gICAgICAgIGRlbGV0ZSBwQ2hhci0+bV9wRm9ybTsKLSAgICAgICAgcENoYXItPm1fcEZvcm0gPSBOVUxMOworICByZXR1cm4gLTE7Cit9CitDUERGX0ZvbnRFbmNvZGluZzo6Q1BERl9Gb250RW5jb2RpbmcoaW50IFByZWRlZmluZWRFbmNvZGluZykgeworICBjb25zdCBGWF9XT1JEKiBwU3JjID0gUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoUHJlZGVmaW5lZEVuY29kaW5nKTsKKyAgaWYgKCFwU3JjKSB7CisgICAgRlhTWVNfbWVtc2V0KG1fVW5pY29kZXMsIDAsIHNpemVvZihtX1VuaWNvZGVzKSk7CisgIH0gZWxzZQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIG1fVW5pY29kZXNbaV0gPSBwU3JjW2ldOworICAgIH0KK30KK0ZYX0JPT0wgQ1BERl9Gb250RW5jb2Rpbmc6OklzSWRlbnRpY2FsKENQREZfRm9udEVuY29kaW5nKiBwQW5vdGhlcikgY29uc3QgeworICByZXR1cm4gRlhTWVNfbWVtY21wKG1fVW5pY29kZXMsIHBBbm90aGVyLT5tX1VuaWNvZGVzLCBzaXplb2YobV9Vbmljb2RlcykpID09CisgICAgICAgICAwOworfQorQ1BERl9PYmplY3QqIENQREZfRm9udEVuY29kaW5nOjpSZWFsaXplKCkgeworICBpbnQgcHJlZGVmaW5lZCA9IDA7CisgIGZvciAoaW50IGNzID0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJOyBjcyA8IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOworICAgICAgIGNzKyspIHsKKyAgICBjb25zdCBGWF9XT1JEKiBwU3JjID0gUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoY3MpOworICAgIEZYX0JPT0wgbWF0Y2ggPSBUUlVFOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgIGlmIChtX1VuaWNvZGVzW2ldICE9IHBTcmNbaV0pIHsKKyAgICAgICAgbWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChtYXRjaCkgeworICAgICAgcHJlZGVmaW5lZCA9IGNzOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChwcmVkZWZpbmVkKSB7CisgICAgaWYgKHByZWRlZmluZWQgPT0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKSB7CisgICAgICByZXR1cm4gQ1BERl9OYW1lOjpDcmVhdGUoIldpbkFuc2lFbmNvZGluZyIpOworICAgIH0KKyAgICBpZiAocHJlZGVmaW5lZCA9PSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOKSB7CisgICAgICByZXR1cm4gQ1BERl9OYW1lOjpDcmVhdGUoIk1hY1JvbWFuRW5jb2RpbmciKTsKKyAgICB9CisgICAgaWYgKHByZWRlZmluZWQgPT0gUERGRk9OVF9FTkNPRElOR19NQUNFWFBFUlQpIHsKKyAgICAgIHJldHVybiBDUERGX05hbWU6OkNyZWF0ZSgiTWFjRXhwZXJ0RW5jb2RpbmciKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CisgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkJhc2VFbmNvZGluZyIpLCBGWF9CU1RSQygiV2luQW5zaUVuY29kaW5nIikpOworICBjb25zdCBGWF9XT1JEKiBwU3RhbmRhcmQgPQorICAgICAgUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKTsKKyAgQ1BERl9BcnJheSogcERpZmYgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgIGlmIChwU3RhbmRhcmRbaV0gPT0gbV9Vbmljb2Rlc1tpXSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHBEaWZmLT5BZGQoQ1BERl9OdW1iZXI6OkNyZWF0ZShpKSk7CisgICAgcERpZmYtPkFkZChDUERGX05hbWU6OkNyZWF0ZShQREZfQWRvYmVOYW1lRnJvbVVuaWNvZGUobV9Vbmljb2Rlc1tpXSkpKTsKKyAgfQorICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkRpZmZlcmVuY2VzIiksIHBEaWZmKTsKKyAgcmV0dXJuIHBEaWN0OworfQorQ1BERl9UcnVlVHlwZUZvbnQ6OkNQREZfVHJ1ZVR5cGVGb250KCkgOiBDUERGX1NpbXBsZUZvbnQoUERGRk9OVF9UUlVFVFlQRSkge30KK0ZYX0JPT0wgQ1BERl9UcnVlVHlwZUZvbnQ6Ol9Mb2FkKCkgeworICByZXR1cm4gTG9hZENvbW1vbigpOworfQordm9pZCBDUERGX1RydWVUeXBlRm9udDo6TG9hZEdseXBoTWFwKCkgeworICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBiYXNlRW5jb2RpbmcgPSBtX0Jhc2VFbmNvZGluZzsKKyAgaWYgKG1fcEZvbnRGaWxlICYmIG1fRm9udC5tX0ZhY2UtPm51bV9jaGFybWFwcyA+IDAgJiYKKyAgICAgIChiYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19NQUNST01BTiB8fAorICAgICAgIGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpICYmCisgICAgICAobV9GbGFncyAmIFBERkZPTlRfU1lNQk9MSUMpKSB7CisgICAgRlhfQk9PTCBiU3VwcG9ydFdpbiA9IEZBTFNFOworICAgIEZYX0JPT0wgYlN1cHBvcnRNYWMgPSBGQUxTRTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KG1fRm9udC5tX0ZhY2UpOyBpKyspIHsKKyAgICAgIGludCBwbGF0Zm9ybV9pZCA9CisgICAgICAgICAgRlhGVF9HZXRfQ2hhcm1hcF9QbGF0Zm9ybUlEKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMobV9Gb250Lm1fRmFjZSlbaV0pOworICAgICAgaWYgKHBsYXRmb3JtX2lkID09IDAgfHwgcGxhdGZvcm1faWQgPT0gMykgeworICAgICAgICBiU3VwcG9ydFdpbiA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKHBsYXRmb3JtX2lkID09IDAgfHwgcGxhdGZvcm1faWQgPT0gMSkgeworICAgICAgICBiU3VwcG9ydE1hYyA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGlmIChiYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJICYmICFiU3VwcG9ydFdpbikgeworICAgICAgYmFzZUVuY29kaW5nID0KKyAgICAgICAgICBiU3VwcG9ydE1hYyA/IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4gOiBQREZGT05UX0VOQ09ESU5HX0JVSUxUSU47CisgICAgfSBlbHNlIGlmIChiYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19NQUNST01BTiAmJiAhYlN1cHBvcnRNYWMpIHsKKyAgICAgIGJhc2VFbmNvZGluZyA9CisgICAgICAgICAgYlN1cHBvcnRXaW4gPyBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kgOiBQREZGT05UX0VOQ09ESU5HX0JVSUxUSU47CisgICAgfQorICB9CisgIGlmICgoKGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOIHx8CisgICAgICAgIGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpICYmCisgICAgICAgbV9wQ2hhck5hbWVzID09IE5VTEwpIHx8CisgICAgICAobV9GbGFncyAmIFBERkZPTlRfTk9OU1lNQk9MSUMpKSB7CisgICAgaWYgKCFGWEZUX0hhc19HbHlwaF9OYW1lcyhtX0ZvbnQubV9GYWNlKSAmJgorICAgICAgICAoIW1fRm9udC5tX0ZhY2UtPm51bV9jaGFybWFwcyB8fCAhbV9Gb250Lm1fRmFjZS0+Y2hhcm1hcHMpKSB7CisgICAgICBpbnQgblN0YXJ0Q2hhciA9IG1fcEZvbnREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJGaXJzdENoYXIiKSk7CisgICAgICBpZiAoblN0YXJ0Q2hhciA8IDAgfHwgblN0YXJ0Q2hhciA+IDI1NSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBpbnQgY2hhcmNvZGUgPSAwOworICAgICAgZm9yICg7IGNoYXJjb2RlIDwgblN0YXJ0Q2hhcjsgY2hhcmNvZGUrKykgeworICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gMDsKKyAgICAgIH0KKyAgICAgIEZYX1dPUkQgbkdseXBoID0gY2hhcmNvZGUgLSBuU3RhcnRDaGFyICsgMzsKKyAgICAgIGZvciAoOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKywgbkdseXBoKyspIHsKKyAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IG5HbHlwaDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgRlhfQk9PTCBiTVNVbmljb2RlID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDMsIDEpOworICAgIEZYX0JPT0wgYk1hY1JvbWFuID0gRkFMU0UsIGJNU1N5bWJvbCA9IEZBTFNFOworICAgIGlmICghYk1TVW5pY29kZSkgeworICAgICAgaWYgKG1fRmxhZ3MgJiBQREZGT05UX05PTlNZTUJPTElDKSB7CisgICAgICAgIGJNYWNSb21hbiA9IEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAxLCAwKTsKKyAgICAgICAgYk1TU3ltYm9sID0gIWJNYWNSb21hbiAmJiBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBiTVNTeW1ib2wgPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMCk7CisgICAgICAgIGJNYWNSb21hbiA9ICFiTVNTeW1ib2wgJiYgRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDEsIDApOworICAgICAgfQorICAgIH0KKyAgICBGWF9CT09MIGJUb1VuaWNvZGUgPSBtX3BGb250RGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlRvVW5pY29kZSIpKTsKKyAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSsrKSB7CisgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0KKyAgICAgICAgICBHZXRBZG9iZUNoYXJOYW1lKGJhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQorICAgICAgICAgICAgbV9wRm9udEZpbGUgPyBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIGNoYXJjb2RlKSA6IC0xOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7CisgICAgICBpZiAoYk1TU3ltYm9sKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgcHJlZml4WzRdID0gezB4MDAsIDB4ZjAsIDB4ZjEsIDB4ZjJ9OworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IHByZWZpeFtqXSAqIDI1NiArIGNoYXJjb2RlOworICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIHVuaWNvZGUpOworICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSkgeworICAgICAgICBpZiAoYk1TVW5pY29kZSkgeworICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KAorICAgICAgICAgICAgICBtX0ZvbnQubV9GYWNlLCBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdKTsKKyAgICAgICAgfSBlbHNlIGlmIChiTWFjUm9tYW4pIHsKKyAgICAgICAgICBGWF9EV09SRCBtYWNjb2RlID0gRlRfQ2hhckNvZGVGcm9tVW5pY29kZSgKKyAgICAgICAgICAgICAgRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSk7CisgICAgICAgICAgaWYgKCFtYWNjb2RlKSB7CisgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICAgICAgICBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5tX0ZhY2UsIChjaGFyKiluYW1lKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9CisgICAgICAgICAgICAgICAgRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCBtYWNjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICgobV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9PSAwIHx8IG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMHhmZmZmKSAmJgorICAgICAgICAgIG5hbWUgIT0gTlVMTCkgeworICAgICAgICBpZiAobmFtZVswXSA9PSAnLicgJiYgRlhTWVNfc3RyY21wKG5hbWUsICIubm90ZGVmIikgPT0gMCkgeworICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIDMyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICAgICAgRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQubV9GYWNlLCAoY2hhciopbmFtZSk7CisgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCkgeworICAgICAgICAgICAgaWYgKGJUb1VuaWNvZGUpIHsKKyAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NVbmljb2RlID0gVW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgICAgICAgICAgICAgIGlmICghd3NVbmljb2RlLklzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQorICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIHdzVW5pY29kZVswXSk7CisgICAgICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IHdzVW5pY29kZVswXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCkgeworICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgY2hhcmNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAzLCAwKSkgeworICAgIGNvbnN0IHVpbnQ4X3QgcHJlZml4WzRdID0gezB4MDAsIDB4ZjAsIDB4ZjEsIDB4ZjJ9OworICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOworICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IHByZWZpeFtqXSAqIDI1NiArIGNoYXJjb2RlOworICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCB1bmljb2RlKTsKKyAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKKyAgICAgICAgICBiR290T25lID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoYkdvdE9uZSkgeworICAgICAgaWYgKGJhc2VFbmNvZGluZyAhPSBQREZGT05UX0VOQ09ESU5HX0JVSUxUSU4pIHsKKyAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgeworICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPQorICAgICAgICAgICAgICBHZXRBZG9iZUNoYXJOYW1lKGJhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDEsIDApKSB7CisgICAgICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyspIHsKKyAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0KKyAgICAgICAgICAgICAgRlRfVW5pY29kZUZyb21DaGFyQ29kZShGWEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOLCBjaGFyY29kZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYgKEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAxLCAwKSkgeworICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOworICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyspIHsKKyAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIGNoYXJjb2RlKTsKKyAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPQorICAgICAgICAgIEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgY2hhcmNvZGUpOworICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKKyAgICAgICAgYkdvdE9uZSA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGlmIChtX3BGb250RmlsZSB8fCBiR290T25lKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgPT0gMCkgeworICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOworICAgIGNvbnN0IEZYX1dPUkQqIHBVbmljb2RlcyA9IFBERl9Vbmljb2Rlc0ZvclByZWRlZmluZWRDaGFyU2V0KGJhc2VFbmNvZGluZyk7CisgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgeworICAgICAgaWYgKG1fcEZvbnRGaWxlID09IE5VTEwpIHsKKyAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUoMCwgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgICAgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOworICAgICAgICB9IGVsc2UgaWYgKHBVbmljb2RlcykgeworICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBwVW5pY29kZXNbY2hhcmNvZGVdOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gY2hhcmNvZGU7CisgICAgICB9CisgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0pOworICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKKyAgICAgICAgYkdvdE9uZSA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGlmIChiR290T25lKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyspIHsKKyAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gY2hhcmNvZGU7CisgIH0KK30KK0NQREZfVHlwZTNGb250OjpDUERGX1R5cGUzRm9udCgpIDogQ1BERl9TaW1wbGVGb250KFBERkZPTlRfVFlQRTMpIHsKKyAgbV9wUGFnZVJlc291cmNlcyA9IE5VTEw7CisgIEZYU1lTX21lbXNldChtX0NoYXJXaWR0aEwsIDAsIHNpemVvZiBtX0NoYXJXaWR0aEwpOworfQorQ1BERl9UeXBlM0ZvbnQ6On5DUERGX1R5cGUzRm9udCgpIHsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9DYWNoZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICB2b2lkKiBrZXk7CisgICAgdm9pZCogdmFsdWU7CisgICAgbV9DYWNoZU1hcC5HZXROZXh0QXNzb2MocG9zLCBrZXksIHZhbHVlKTsKKyAgICBkZWxldGUgKENQREZfVHlwZTNDaGFyKil2YWx1ZTsKKyAgfQorICBtX0NhY2hlTWFwLlJlbW92ZUFsbCgpOworICBwb3MgPSBtX0RlbGV0ZWRNYXAuR2V0U3RhcnRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgdm9pZCoga2V5OworICAgIHZvaWQqIHZhbHVlOworICAgIG1fRGVsZXRlZE1hcC5HZXROZXh0QXNzb2MocG9zLCBrZXksIHZhbHVlKTsKKyAgICBkZWxldGUgKENQREZfVHlwZTNDaGFyKilrZXk7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9UeXBlM0ZvbnQ6Ol9Mb2FkKCkgeworICBtX3BGb250UmVzb3VyY2VzID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKKyAgQ1BERl9BcnJheSogcE1hdHJpeCA9IG1fcEZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRm9udE1hdHJpeCIpKTsKKyAgRlhfRkxPQVQgeHNjYWxlID0gMS4wZiwgeXNjYWxlID0gMS4wZjsKKyAgaWYgKHBNYXRyaXgpIHsKKyAgICBtX0ZvbnRNYXRyaXggPSBwTWF0cml4LT5HZXRNYXRyaXgoKTsKKyAgICB4c2NhbGUgPSBtX0ZvbnRNYXRyaXguYTsKKyAgICB5c2NhbGUgPSBtX0ZvbnRNYXRyaXguZDsKKyAgfQorICBDUERGX0FycmF5KiBwQkJveCA9IG1fcEZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRm9udEJCb3giKSk7CisgIGlmIChwQkJveCkgeworICAgIG1fRm9udEJCb3gubGVmdCA9IChpbnQzMl90KShGWFNZU19NdWwocEJCb3gtPkdldE51bWJlcigwKSwgeHNjYWxlKSAqIDEwMDApOworICAgIG1fRm9udEJCb3guYm90dG9tID0KKyAgICAgICAgKGludDMyX3QpKEZYU1lTX011bChwQkJveC0+R2V0TnVtYmVyKDEpLCB5c2NhbGUpICogMTAwMCk7CisgICAgbV9Gb250QkJveC5yaWdodCA9IChpbnQzMl90KShGWFNZU19NdWwocEJCb3gtPkdldE51bWJlcigyKSwgeHNjYWxlKSAqIDEwMDApOworICAgIG1fRm9udEJCb3gudG9wID0gKGludDMyX3QpKEZYU1lTX011bChwQkJveC0+R2V0TnVtYmVyKDMpLCB5c2NhbGUpICogMTAwMCk7CisgIH0KKyAgaW50IFN0YXJ0Q2hhciA9IG1fcEZvbnREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJGaXJzdENoYXIiKSk7CisgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbV9wRm9udERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJXaWR0aHMiKSk7CisgIGlmIChwV2lkdGhBcnJheSAmJiAoU3RhcnRDaGFyID49IDAgJiYgU3RhcnRDaGFyIDwgMjU2KSkgeworICAgIEZYX0RXT1JEIGNvdW50ID0gcFdpZHRoQXJyYXktPkdldENvdW50KCk7CisgICAgaWYgKGNvdW50ID4gMjU2KSB7CisgICAgICBjb3VudCA9IDI1NjsKKyAgICB9CisgICAgaWYgKFN0YXJ0Q2hhciArIGNvdW50ID4gMjU2KSB7CisgICAgICBjb3VudCA9IDI1NiAtIFN0YXJ0Q2hhcjsKKyAgICB9CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIG1fQ2hhcldpZHRoTFtTdGFydENoYXIgKyBpXSA9CisgICAgICAgICAgRlhTWVNfcm91bmQoRlhTWVNfTXVsKHBXaWR0aEFycmF5LT5HZXROdW1iZXIoaSksIHhzY2FsZSkgKiAxMDAwKTsKKyAgICB9CisgIH0KKyAgbV9wQ2hhclByb2NzID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkNoYXJQcm9jcyIpKTsKKyAgQ1BERl9PYmplY3QqIHBFbmNvZGluZyA9IG1fcEZvbnREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkVuY29kaW5nIikpOworICBpZiAocEVuY29kaW5nKSB7CisgICAgTG9hZFBERkVuY29kaW5nKHBFbmNvZGluZywgbV9CYXNlRW5jb2RpbmcsIG1fcENoYXJOYW1lcywgRkFMU0UsIEZBTFNFKTsKKyAgICBpZiAobV9wQ2hhck5hbWVzKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tpXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShtX3BDaGFyTmFtZXNbaV0pOworICAgICAgICBpZiAobV9FbmNvZGluZy5tX1VuaWNvZGVzW2ldID09IDApIHsKKyAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbaV0gPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX1R5cGUzRm9udDo6Q2hlY2tUeXBlM0ZvbnRNZXRyaWNzKCkgeworICBDaGVja0ZvbnRNZXRyaWNzKCk7Cit9CitDUERGX1R5cGUzQ2hhciogQ1BERl9UeXBlM0ZvbnQ6OkxvYWRDaGFyKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwpIHsKKyAgaWYgKGxldmVsID49IF9GUERGX01BWF9UWVBFM19GT1JNX0xFVkVMXykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfVHlwZTNDaGFyKiBwQ2hhciA9IE5VTEw7CisgIGlmIChtX0NhY2hlTWFwLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdCljaGFyY29kZSwgKHZvaWQqJilwQ2hhcikpIHsKKyAgICBpZiAocENoYXItPm1fYlBhZ2VSZXF1aXJlZCAmJiBtX3BQYWdlUmVzb3VyY2VzKSB7CisgICAgICBkZWxldGUgcENoYXI7CisgICAgICBtX0NhY2hlTWFwLlJlbW92ZUtleSgodm9pZCopKHVpbnRwdHJfdCljaGFyY29kZSk7CisgICAgICByZXR1cm4gTG9hZENoYXIoY2hhcmNvZGUsIGxldmVsICsgMSk7CiAgICAgfQogICAgIHJldHVybiBwQ2hhcjsKKyAgfQorICBjb25zdCBGWF9DSEFSKiBuYW1lID0KKyAgICAgIEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fcENoYXJOYW1lcywgY2hhcmNvZGUpOworICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPQorICAgICAgKENQREZfU3RyZWFtKikobV9wQ2hhclByb2NzID8gbV9wQ2hhclByb2NzLT5HZXRFbGVtZW50VmFsdWUobmFtZSkgOiBOVUxMKTsKKyAgaWYgKHBTdHJlYW0gPT0gTlVMTCB8fCBwU3RyZWFtLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHBDaGFyID0gbmV3IENQREZfVHlwZTNDaGFyOworICBwQ2hhci0+bV9wRm9ybSA9IG5ldyBDUERGX0Zvcm0oCisgICAgICBtX3BEb2N1bWVudCwgbV9wRm9udFJlc291cmNlcyA/IG1fcEZvbnRSZXNvdXJjZXMgOiBtX3BQYWdlUmVzb3VyY2VzLAorICAgICAgcFN0cmVhbSwgTlVMTCk7CisgIHBDaGFyLT5tX3BGb3JtLT5QYXJzZUNvbnRlbnQoTlVMTCwgTlVMTCwgcENoYXIsIE5VTEwsIGxldmVsICsgMSk7CisgIEZYX0ZMT0FUIHNjYWxlID0gbV9Gb250TWF0cml4LkdldFhVbml0KCk7CisgIHBDaGFyLT5tX1dpZHRoID0gKGludDMyX3QpKHBDaGFyLT5tX1dpZHRoICogc2NhbGUgKyAwLjVmKTsKKyAgRlhfUkVDVCYgcmNCQm94ID0gcENoYXItPm1fQkJveDsKKyAgQ0ZYX0Zsb2F0UmVjdCBjaGFyX3JlY3QoCisgICAgICAoRlhfRkxPQVQpcmNCQm94LmxlZnQgLyAxMDAwLjBmLCAoRlhfRkxPQVQpcmNCQm94LmJvdHRvbSAvIDEwMDAuMGYsCisgICAgICAoRlhfRkxPQVQpcmNCQm94LnJpZ2h0IC8gMTAwMC4wZiwgKEZYX0ZMT0FUKXJjQkJveC50b3AgLyAxMDAwLjBmKTsKKyAgaWYgKHJjQkJveC5yaWdodCA8PSByY0JCb3gubGVmdCB8fCByY0JCb3guYm90dG9tID49IHJjQkJveC50b3ApIHsKKyAgICBjaGFyX3JlY3QgPSBwQ2hhci0+bV9wRm9ybS0+Q2FsY0JvdW5kaW5nQm94KCk7CisgIH0KKyAgY2hhcl9yZWN0LlRyYW5zZm9ybSgmbV9Gb250TWF0cml4KTsKKyAgcmNCQm94LmxlZnQgPSBGWFNZU19yb3VuZChjaGFyX3JlY3QubGVmdCAqIDEwMDApOworICByY0JCb3gucmlnaHQgPSBGWFNZU19yb3VuZChjaGFyX3JlY3QucmlnaHQgKiAxMDAwKTsKKyAgcmNCQm94LnRvcCA9IEZYU1lTX3JvdW5kKGNoYXJfcmVjdC50b3AgKiAxMDAwKTsKKyAgcmNCQm94LmJvdHRvbSA9IEZYU1lTX3JvdW5kKGNoYXJfcmVjdC5ib3R0b20gKiAxMDAwKTsKKyAgbV9DYWNoZU1hcC5TZXRBdCgodm9pZCopKHVpbnRwdHJfdCljaGFyY29kZSwgcENoYXIpOworICBpZiAocENoYXItPm1fcEZvcm0tPkNvdW50T2JqZWN0cygpID09IDApIHsKKyAgICBkZWxldGUgcENoYXItPm1fcEZvcm07CisgICAgcENoYXItPm1fcEZvcm0gPSBOVUxMOworICB9CisgIHJldHVybiBwQ2hhcjsKIH0KLWludCBDUERGX1R5cGUzRm9udDo6R2V0Q2hhcldpZHRoRihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsKQotewotICAgIGlmIChjaGFyY29kZSA+IDB4ZmYpIHsKLSAgICAgICAgY2hhcmNvZGUgPSAwOwotICAgIH0KLSAgICBpZiAobV9DaGFyV2lkdGhMW2NoYXJjb2RlXSkgewotICAgICAgICByZXR1cm4gbV9DaGFyV2lkdGhMW2NoYXJjb2RlXTsKLSAgICB9Ci0gICAgQ1BERl9UeXBlM0NoYXIqIHBDaGFyID0gTG9hZENoYXIoY2hhcmNvZGUsIGxldmVsKTsKLSAgICBpZiAocENoYXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHBDaGFyLT5tX1dpZHRoOworaW50IENQREZfVHlwZTNGb250OjpHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwpIHsKKyAgaWYgKGNoYXJjb2RlID4gMHhmZikgeworICAgIGNoYXJjb2RlID0gMDsKKyAgfQorICBpZiAobV9DaGFyV2lkdGhMW2NoYXJjb2RlXSkgeworICAgIHJldHVybiBtX0NoYXJXaWR0aExbY2hhcmNvZGVdOworICB9CisgIENQREZfVHlwZTNDaGFyKiBwQ2hhciA9IExvYWRDaGFyKGNoYXJjb2RlLCBsZXZlbCk7CisgIGlmIChwQ2hhciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHBDaGFyLT5tX1dpZHRoOwogfQotdm9pZCBDUERGX1R5cGUzRm9udDo6R2V0Q2hhckJCb3goRlhfRFdPUkQgY2hhcmNvZGUsIEZYX1JFQ1QmIHJlY3QsIGludCBsZXZlbCkKLXsKLSAgICBDUERGX1R5cGUzQ2hhciogcENoYXIgPSBMb2FkQ2hhcihjaGFyY29kZSwgbGV2ZWwpOwotICAgIGlmIChwQ2hhciA9PSBOVUxMKSB7Ci0gICAgICAgIHJlY3QubGVmdCA9IHJlY3QucmlnaHQgPSByZWN0LnRvcCA9IHJlY3QuYm90dG9tID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWN0ID0gcENoYXItPm1fQkJveDsKK3ZvaWQgQ1BERl9UeXBlM0ZvbnQ6OkdldENoYXJCQm94KEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9SRUNUJiByZWN0LCBpbnQgbGV2ZWwpIHsKKyAgQ1BERl9UeXBlM0NoYXIqIHBDaGFyID0gTG9hZENoYXIoY2hhcmNvZGUsIGxldmVsKTsKKyAgaWYgKHBDaGFyID09IE5VTEwpIHsKKyAgICByZWN0LmxlZnQgPSByZWN0LnJpZ2h0ID0gcmVjdC50b3AgPSByZWN0LmJvdHRvbSA9IDA7CisgICAgcmV0dXJuOworICB9CisgIHJlY3QgPSBwQ2hhci0+bV9CQm94OwogfQotQ1BERl9UeXBlM0NoYXI6OkNQREZfVHlwZTNDaGFyKCkKLXsKLSAgICBtX3BGb3JtID0gTlVMTDsKLSAgICBtX3BCaXRtYXAgPSBOVUxMOwotICAgIG1fYlBhZ2VSZXF1aXJlZCA9IEZBTFNFOwotICAgIG1fYkNvbG9yZWQgPSBGQUxTRTsKK0NQREZfVHlwZTNDaGFyOjpDUERGX1R5cGUzQ2hhcigpIHsKKyAgbV9wRm9ybSA9IE5VTEw7CisgIG1fcEJpdG1hcCA9IE5VTEw7CisgIG1fYlBhZ2VSZXF1aXJlZCA9IEZBTFNFOworICBtX2JDb2xvcmVkID0gRkFMU0U7CiB9Ci1DUERGX1R5cGUzQ2hhcjo6fkNQREZfVHlwZTNDaGFyKCkKLXsKLSAgICBkZWxldGUgbV9wRm9ybTsKLSAgICBkZWxldGUgbV9wQml0bWFwOworQ1BERl9UeXBlM0NoYXI6On5DUERGX1R5cGUzQ2hhcigpIHsKKyAgZGVsZXRlIG1fcEZvcm07CisgIGRlbGV0ZSBtX3BCaXRtYXA7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2hhcnNldC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2hhcnNldC5jcHAKaW5kZXggYmY1Yjc1Ny4uYTBiNjVhZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X2NoYXJzZXQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udF9jaGFyc2V0LmNwcApAQCAtMTIsNjAwICsxMiwxNzY3IEBACiBleHRlcm4gY29uc3QgRlhfV09SRCBQREZEb2NFbmNvZGluZ1syNTZdOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IF9Vbmljb2RlQWx0IHsKLSAgICBGWF9XT1JECW1fVW5pY29kZTsKLSAgICBjb25zdCBGWF9DSEFSKiBtX0FsdGVyOworICBGWF9XT1JEIG1fVW5pY29kZTsKKyAgY29uc3QgRlhfQ0hBUiogbV9BbHRlcjsKIH0gVW5pY29kZUFsdHNbXSA9IHsKLSAgICB7MHgwMGEwLCAiICJ9LCB7MHgwMGExLCAiISJ9LCB7MHgwMGEyLCAiYyJ9LCB7MHgwMGEzLCAiUCJ9LCB7MHgwMGE0LCAibyJ9LAotICAgIHsweDAwYTUsICJZIn0sIHsweDAwYTYsICJ8In0sIHsweDAwYTcsICJTIn0sIHsweDAwYTksICIoQykifSwgezB4MDBhYSwgImEifSwKLSAgICB7MHgwMGFiLCAiPDwifSwgezB4MDBhYywgIi18In0sIHsweDAwYWUsICIoUikifSwgezB4MDBhZiwgIi0ifSwKLSAgICB7MHgwMGIwLCAibyJ9LCB7MHgwMGIxLCAiKy8tIn0sIHsweDAwYjIsICJeMiJ9LCB7IDB4MDBiMywgIl4zIn0sCi0gICAgezB4MDBiNCwgIicifSwgezB4MDBiNSwgInUifSwgezB4MDBiNiwgIlAifSwgezB4MDBiNywgIi4ifSwKLSAgICB7MHgwMGI5LCAiXjEifSwgezB4MDBiYSwgIm8ifSwgezB4MDBiYiwgIj4+In0sIHsweDAwYmMsICIxLzQifSwKLSAgICB7MHgwMGJkLCAiMS8yIn0sIHsweDAwYmUsICIzLzQifSwgIHsweDAwYmYsICI/In0sIHsweDAwYzAsICJBIn0sCi0gICAgezB4MDBjMSwgIkEifSwgezB4MDBjMiwgIkEifSwgezB4MDBjMywgIkEifSwgezB4MDBjNCwgIkEifSwKLSAgICB7MHgwMGM1LCAiQSJ9LCB7MHgwMGM2LCAiQUUifSwgezB4MDBjNywgIkMifSwgezB4MDBjOCwgIkUifSwKLSAgICB7MHgwMGM5LCAiRSJ9LCB7MHgwMGNhLCAiRSJ9LCB7MHgwMGNiLCAiRSJ9LCB7MHgwMGNjLCAiSSJ9LAotICAgIHsweDAwY2QsICJJIn0sIHsweDAwY2UsICJJIn0sIHsweDAwY2YsICJJIn0sCi0gICAgezB4MDBkMSwgIk4ifSwgezB4MDBkMiwgIk8ifSwgezB4MDBkMywgIk8ifSwgezB4MDBkNCwgIk8ifSwKLSAgICB7MHgwMGQ1LCAiTyJ9LCB7MHgwMGQ2LCAiTyJ9LCB7MHgwMGQ3LCAieCJ9LCB7MHgwMGQ4LCAiTyJ9LAotICAgIHsweDAwZDksICJVIn0sIHsweDAwZGEsICJVIn0sIHsweDAwZGIsICJVIn0sIHsweDAwZGMsICJVIn0sCi0gICAgezB4MDBkZCwgIlkifSwgezB4MDBkZiwgIlMifSwgezB4MDBlMCwgImEifSwKLSAgICB7MHgwMGUxLCAiYSJ9LCB7MHgwMGUyLCAiYSJ9LCB7MHgwMGUzLCAiYSJ9LCB7MHgwMGU0LCAiYSJ9LAotICAgIHsweDAwZTUsICJhIn0sIHsweDAwZTYsICJhZSJ9LCB7MHgwMGU3LCAiYyJ9LCB7MHgwMGU4LCAiZSJ9LAotICAgIHsweDAwZTksICJlIn0sIHsweDAwZWEsICJlIn0sIHsweDAwZWIsICJlIn0sIHsweDAwZWMsICJpIn0sCi0gICAgezB4MDBlZCwgImkifSwgezB4MDBlZSwgImkifSwgezB4MDBlZiwgImkifSwKLSAgICB7MHgwMGYxLCAibiJ9LCB7MHgwMGYyLCAibyJ9LCB7MHgwMGYzLCAibyJ9LCB7MHgwMGY0LCAibyJ9LAotICAgIHsweDAwZjUsICJvIn0sIHsweDAwZjYsICJvIn0sIHsweDAwZjcsICIvIn0sIHsweDAwZjgsICJvIn0sCi0gICAgezB4MDBmOSwgInUifSwgezB4MDBmYSwgInUifSwgezB4MDBmYiwgInUifSwgezB4MDBmYywgInUifSwKLSAgICB7MHgwMGZkLCAieSJ9LCB7MHgwMGZmLCAieSJ9LAotICAgIHsweDAyYjAsICJoIn0sIHsweDAyYjIsICJqIn0sIHsweDAyYjMsICJyIn0sIHsweDAyYjcsICJ3In0sCi0gICAgezB4MDJiOCwgInkifSwgezB4MDJiOSwgIicifSwgezB4MDJiYSwgIlwiIn0sIHsweDAyYmIsICInIn0sCi0gICAgezB4MDJiYywgIicifSwgezB4MDJiZCwgIicifSwgezB4MDJiZSwgIicifSwgezB4MDJiZiwgIicifSwKLSAgICB7MHgwMmMyLCAiPCJ9LCB7MHgwMmMzLCAiPiJ9LCB7MHgwMmM0LCAiXiJ9LCB7MHgwMmM1LCAidiJ9LAotICAgIHsweDAyYzYsICJeIn0sIHsweDAyYzcsICJ2In0sIHsweDAyYzgsICInIn0sIHsweDAyYzksICItIn0sCi0gICAgezB4MDJjYSwgIicifSwgezB4MDJjYiwgIicifSwgezB4MDJjYywgIi4ifSwgezB4MDJjZCwgIl8ifSwKLSAgICB7MHgyMDEwLCAiLSJ9LCB7MHgyMDEyLCAiLSJ9LCB7MHgyMDEzLCAiLSJ9LCB7MHgyMDE0LCAiLS0ifSwKLSAgICB7MHgyMDE1LCAiLS0ifSwgezB4MjAxNiwgInwifSwgezB4MjAxNywgIl8ifSwKLSAgICB7MHgyMDE4LCAiJyJ9LCB7MHgyMDE5LCAiJyJ9LCB7MHgyMDFhLCAiLCJ9LCB7MHgyMDFiLCAiJyJ9LAotICAgIHsweDIwMWMsICJcIiJ9LCB7MHgyMDFkLCAiXCIifSwgezB4MjAxZSwgIiwifSwgezB4MjAxZiwgIicifSwKLSAgICB7MHgyMDIwLCAiKyJ9LCB7MHgyMDIxLCAiKyJ9LCB7MHgyMDIyLCAiKiJ9LCB7MHgyMDIzLCAiPiJ9LAotICAgIHsweDIwMjQsICIuIn0sIHsweDIwMjUsICIuLiJ9LCB7MHgyMDI3LCAiLiJ9LCB7MHgyMDMyLCAiJyJ9LAotICAgIHsweDIwMzMsICJcIiJ9LCB7MHgyMDM1LCAiJyJ9LCB7MHgyMDM2LCAiXCIifSwgezB4MjAzOCwgIl4ifSwKLSAgICB7MHgyMDM5LCAiPCJ9LCB7MHgyMDNhLCAiPiJ9LCB7MHgyMDNiLCAiKiJ9LCB7MHgyMDNjLCAiISEifSwKLSAgICB7MHgyMDNkLCAiPyEifSwgezB4MjAzZSwgIi0ifSwgezB4MjA0NCwgIi8ifSwgezB4MjA0NywgIj8/In0sCi0gICAgezB4MjA0OCwgIj8hIn0sIHsweDIwNDksICIhPyJ9LCB7MHgyMDRlLCAiKiJ9LCB7MHgyMDUyLCAiJSJ9LAotICAgIHsweDIxMjIsICIoVE0pIn0sCi0gICAgezB4MjIxMiwgIi0ifSwgezB4MjIxNSwgIi8ifSwgezB4MjIxNiwgIlxcIn0sIHsweDIyMTcsICIqIn0sCi0gICAgezB4MjIxOCwgIioifSwgezB4MjIxOSwgIioifSwgezB4MjIyMywgInwifSwgezB4MjJjNSwgIi4ifSwKLSAgICB7MHgyNjZmLCAiIyJ9LAotICAgIHswWEY2RDksICIoQykifSwgezBYRjZEQSwgIihDKSJ9LCB7MFhGNkRCLCAiKFRNKSJ9LAotICAgIHswWEY4RTgsICIoQykifSwgezB4ZjhlOSwgIihDKSJ9LCB7MFhGOEVBLCAiKFRNKSJ9LAotICAgIHsweGZiMDEsICJmaSJ9LCB7MHhmYjAyLCAiZmwifQotfTsKLWNvbnN0IEZYX0NIQVIqIEZDU19HZXRBbHRTdHIoRlhfV0NIQVIgdW5pY29kZSkKLXsKLSAgICBpbnQgYmVnaW4gPSAwOwotICAgIGludCBlbmQgPSBzaXplb2YgVW5pY29kZUFsdHMgLyBzaXplb2Yoc3RydWN0IF9Vbmljb2RlQWx0KSAtIDE7Ci0gICAgd2hpbGUgKGJlZ2luIDw9IGVuZCkgewotICAgICAgICBpbnQgbWlkZGxlID0gKGJlZ2luICsgZW5kKSAvIDI7Ci0gICAgICAgIEZYX1dPUkQgbWlkZGxlY29kZSA9IFVuaWNvZGVBbHRzW21pZGRsZV0ubV9Vbmljb2RlOwotICAgICAgICBpZiAobWlkZGxlY29kZSA+IHVuaWNvZGUpIHsKLSAgICAgICAgICAgIGVuZCA9IG1pZGRsZSAtIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAobWlkZGxlY29kZSA8IHVuaWNvZGUpIHsKLSAgICAgICAgICAgIGJlZ2luID0gbWlkZGxlICsgMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBVbmljb2RlQWx0c1ttaWRkbGVdLm1fQWx0ZXI7Ci0gICAgICAgIH0KKyAgICB7MHgwMGEwLCAiICJ9LCAgICB7MHgwMGExLCAiISJ9LCAgIHsweDAwYTIsICJjIn0sICAgezB4MDBhMywgIlAifSwKKyAgICB7MHgwMGE0LCAibyJ9LCAgICB7MHgwMGE1LCAiWSJ9LCAgIHsweDAwYTYsICJ8In0sICAgezB4MDBhNywgIlMifSwKKyAgICB7MHgwMGE5LCAiKEMpIn0sICB7MHgwMGFhLCAiYSJ9LCAgIHsweDAwYWIsICI8PCJ9LCAgezB4MDBhYywgIi18In0sCisgICAgezB4MDBhZSwgIihSKSJ9LCAgezB4MDBhZiwgIi0ifSwgICB7MHgwMGIwLCAibyJ9LCAgIHsweDAwYjEsICIrLy0ifSwKKyAgICB7MHgwMGIyLCAiXjIifSwgICB7MHgwMGIzLCAiXjMifSwgIHsweDAwYjQsICInIn0sICAgezB4MDBiNSwgInUifSwKKyAgICB7MHgwMGI2LCAiUCJ9LCAgICB7MHgwMGI3LCAiLiJ9LCAgIHsweDAwYjksICJeMSJ9LCAgezB4MDBiYSwgIm8ifSwKKyAgICB7MHgwMGJiLCAiPj4ifSwgICB7MHgwMGJjLCAiMS80In0sIHsweDAwYmQsICIxLzIifSwgezB4MDBiZSwgIjMvNCJ9LAorICAgIHsweDAwYmYsICI/In0sICAgIHsweDAwYzAsICJBIn0sICAgezB4MDBjMSwgIkEifSwgICB7MHgwMGMyLCAiQSJ9LAorICAgIHsweDAwYzMsICJBIn0sICAgIHsweDAwYzQsICJBIn0sICAgezB4MDBjNSwgIkEifSwgICB7MHgwMGM2LCAiQUUifSwKKyAgICB7MHgwMGM3LCAiQyJ9LCAgICB7MHgwMGM4LCAiRSJ9LCAgIHsweDAwYzksICJFIn0sICAgezB4MDBjYSwgIkUifSwKKyAgICB7MHgwMGNiLCAiRSJ9LCAgICB7MHgwMGNjLCAiSSJ9LCAgIHsweDAwY2QsICJJIn0sICAgezB4MDBjZSwgIkkifSwKKyAgICB7MHgwMGNmLCAiSSJ9LCAgICB7MHgwMGQxLCAiTiJ9LCAgIHsweDAwZDIsICJPIn0sICAgezB4MDBkMywgIk8ifSwKKyAgICB7MHgwMGQ0LCAiTyJ9LCAgICB7MHgwMGQ1LCAiTyJ9LCAgIHsweDAwZDYsICJPIn0sICAgezB4MDBkNywgIngifSwKKyAgICB7MHgwMGQ4LCAiTyJ9LCAgICB7MHgwMGQ5LCAiVSJ9LCAgIHsweDAwZGEsICJVIn0sICAgezB4MDBkYiwgIlUifSwKKyAgICB7MHgwMGRjLCAiVSJ9LCAgICB7MHgwMGRkLCAiWSJ9LCAgIHsweDAwZGYsICJTIn0sICAgezB4MDBlMCwgImEifSwKKyAgICB7MHgwMGUxLCAiYSJ9LCAgICB7MHgwMGUyLCAiYSJ9LCAgIHsweDAwZTMsICJhIn0sICAgezB4MDBlNCwgImEifSwKKyAgICB7MHgwMGU1LCAiYSJ9LCAgICB7MHgwMGU2LCAiYWUifSwgIHsweDAwZTcsICJjIn0sICAgezB4MDBlOCwgImUifSwKKyAgICB7MHgwMGU5LCAiZSJ9LCAgICB7MHgwMGVhLCAiZSJ9LCAgIHsweDAwZWIsICJlIn0sICAgezB4MDBlYywgImkifSwKKyAgICB7MHgwMGVkLCAiaSJ9LCAgICB7MHgwMGVlLCAiaSJ9LCAgIHsweDAwZWYsICJpIn0sICAgezB4MDBmMSwgIm4ifSwKKyAgICB7MHgwMGYyLCAibyJ9LCAgICB7MHgwMGYzLCAibyJ9LCAgIHsweDAwZjQsICJvIn0sICAgezB4MDBmNSwgIm8ifSwKKyAgICB7MHgwMGY2LCAibyJ9LCAgICB7MHgwMGY3LCAiLyJ9LCAgIHsweDAwZjgsICJvIn0sICAgezB4MDBmOSwgInUifSwKKyAgICB7MHgwMGZhLCAidSJ9LCAgICB7MHgwMGZiLCAidSJ9LCAgIHsweDAwZmMsICJ1In0sICAgezB4MDBmZCwgInkifSwKKyAgICB7MHgwMGZmLCAieSJ9LCAgICB7MHgwMmIwLCAiaCJ9LCAgIHsweDAyYjIsICJqIn0sICAgezB4MDJiMywgInIifSwKKyAgICB7MHgwMmI3LCAidyJ9LCAgICB7MHgwMmI4LCAieSJ9LCAgIHsweDAyYjksICInIn0sICAgezB4MDJiYSwgIlwiIn0sCisgICAgezB4MDJiYiwgIicifSwgICAgezB4MDJiYywgIicifSwgICB7MHgwMmJkLCAiJyJ9LCAgIHsweDAyYmUsICInIn0sCisgICAgezB4MDJiZiwgIicifSwgICAgezB4MDJjMiwgIjwifSwgICB7MHgwMmMzLCAiPiJ9LCAgIHsweDAyYzQsICJeIn0sCisgICAgezB4MDJjNSwgInYifSwgICAgezB4MDJjNiwgIl4ifSwgICB7MHgwMmM3LCAidiJ9LCAgIHsweDAyYzgsICInIn0sCisgICAgezB4MDJjOSwgIi0ifSwgICAgezB4MDJjYSwgIicifSwgICB7MHgwMmNiLCAiJyJ9LCAgIHsweDAyY2MsICIuIn0sCisgICAgezB4MDJjZCwgIl8ifSwgICAgezB4MjAxMCwgIi0ifSwgICB7MHgyMDEyLCAiLSJ9LCAgIHsweDIwMTMsICItIn0sCisgICAgezB4MjAxNCwgIi0tIn0sICAgezB4MjAxNSwgIi0tIn0sICB7MHgyMDE2LCAifCJ9LCAgIHsweDIwMTcsICJfIn0sCisgICAgezB4MjAxOCwgIicifSwgICAgezB4MjAxOSwgIicifSwgICB7MHgyMDFhLCAiLCJ9LCAgIHsweDIwMWIsICInIn0sCisgICAgezB4MjAxYywgIlwiIn0sICAgezB4MjAxZCwgIlwiIn0sICB7MHgyMDFlLCAiLCJ9LCAgIHsweDIwMWYsICInIn0sCisgICAgezB4MjAyMCwgIisifSwgICAgezB4MjAyMSwgIisifSwgICB7MHgyMDIyLCAiKiJ9LCAgIHsweDIwMjMsICI+In0sCisgICAgezB4MjAyNCwgIi4ifSwgICAgezB4MjAyNSwgIi4uIn0sICB7MHgyMDI3LCAiLiJ9LCAgIHsweDIwMzIsICInIn0sCisgICAgezB4MjAzMywgIlwiIn0sICAgezB4MjAzNSwgIicifSwgICB7MHgyMDM2LCAiXCIifSwgIHsweDIwMzgsICJeIn0sCisgICAgezB4MjAzOSwgIjwifSwgICAgezB4MjAzYSwgIj4ifSwgICB7MHgyMDNiLCAiKiJ9LCAgIHsweDIwM2MsICIhISJ9LAorICAgIHsweDIwM2QsICI/ISJ9LCAgIHsweDIwM2UsICItIn0sICAgezB4MjA0NCwgIi8ifSwgICB7MHgyMDQ3LCAiPz8ifSwKKyAgICB7MHgyMDQ4LCAiPyEifSwgICB7MHgyMDQ5LCAiIT8ifSwgIHsweDIwNGUsICIqIn0sICAgezB4MjA1MiwgIiUifSwKKyAgICB7MHgyMTIyLCAiKFRNKSJ9LCB7MHgyMjEyLCAiLSJ9LCAgIHsweDIyMTUsICIvIn0sICAgezB4MjIxNiwgIlxcIn0sCisgICAgezB4MjIxNywgIioifSwgICAgezB4MjIxOCwgIioifSwgICB7MHgyMjE5LCAiKiJ9LCAgIHsweDIyMjMsICJ8In0sCisgICAgezB4MjJjNSwgIi4ifSwgICAgezB4MjY2ZiwgIiMifSwgICB7MFhGNkQ5LCAiKEMpIn0sIHswWEY2REEsICIoQykifSwKKyAgICB7MFhGNkRCLCAiKFRNKSJ9LCB7MFhGOEU4LCAiKEMpIn0sIHsweGY4ZTksICIoQykifSwgezBYRjhFQSwgIihUTSkifSwKKyAgICB7MHhmYjAxLCAiZmkifSwgICB7MHhmYjAyLCAiZmwifX07Citjb25zdCBGWF9DSEFSKiBGQ1NfR2V0QWx0U3RyKEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgaW50IGJlZ2luID0gMDsKKyAgaW50IGVuZCA9IHNpemVvZiBVbmljb2RlQWx0cyAvIHNpemVvZihzdHJ1Y3QgX1VuaWNvZGVBbHQpIC0gMTsKKyAgd2hpbGUgKGJlZ2luIDw9IGVuZCkgeworICAgIGludCBtaWRkbGUgPSAoYmVnaW4gKyBlbmQpIC8gMjsKKyAgICBGWF9XT1JEIG1pZGRsZWNvZGUgPSBVbmljb2RlQWx0c1ttaWRkbGVdLm1fVW5pY29kZTsKKyAgICBpZiAobWlkZGxlY29kZSA+IHVuaWNvZGUpIHsKKyAgICAgIGVuZCA9IG1pZGRsZSAtIDE7CisgICAgfSBlbHNlIGlmIChtaWRkbGVjb2RlIDwgdW5pY29kZSkgeworICAgICAgYmVnaW4gPSBtaWRkbGUgKyAxOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gVW5pY29kZUFsdHNbbWlkZGxlXS5tX0FsdGVyOwogICAgIH0KLSAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KIHN0YXRpYyBjb25zdCBGWF9XT1JEIFN0YW5kYXJkRW5jb2RpbmdbMjU2XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDIwMTksCi0gICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKLSAgICAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsCi0gICAgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAotICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwKLSAgICAweDAwNWEsIDB4MDA1YiwgMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLCAweDIwMTgsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCi0gICAgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLAotICAgIDB4MDA2ZSwgMHgwMDZmLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKLSAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwYTEsIDB4MDBhMiwgMHgwMGEzLCAweDIwNDQsIDB4MDBhNSwgMHgwMTkyLCAweDAwYTcsIDB4MDBhNCwgMHgwMDI3LAotICAgIDB4MjAxYywgMHgwMGFiLCAweDIwMzksIDB4MjAzYSwgMHhmYjAxLCAweGZiMDIsIDB4MDAwMCwgMHgyMDEzLCAweDIwMjAsIDB4MjAyMSwKLSAgICAweDAwYjcsIDB4MDAwMCwgMHgwMGI2LCAweDIwMjIsIDB4MjAxYSwgMHgyMDFlLCAweDIwMWQsIDB4MDBiYiwgMHgyMDI2LCAweDIwMzAsCi0gICAgMHgwMDAwLCAweDAwYmYsIDB4MDAwMCwgMHgwMDYwLCAweDAwYjQsIDB4MDJjNiwgMHgwMmRjLCAweDAwYWYsIDB4MDJkOCwgMHgwMmQ5LAotICAgIDB4MDBhOCwgMHgwMDAwLCAweDAyZGEsIDB4MDBiOCwgMHgwMDAwLCAweDAyZGQsIDB4MDJkYiwgMHgwMmM3LCAweDIwMTQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDBjNiwgMHgwMDAwLCAweDAwYWEsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAxNDEsIDB4MDBkOCwgMHgwMTUyLCAweDAwYmEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDBlNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMTMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMTQyLCAweDAwZjgsCi0gICAgMHgwMTUzLCAweDAwZGYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMAotfTsKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorICAgIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MjAxOSwgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsCisgICAgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwKKyAgICAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLAorICAgIDB4MDAzZiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsIDB4MDA1MCwKKyAgICAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAorICAgIDB4MDA1YSwgMHgwMDViLCAweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsIDB4MjAxOCwgMHgwMDYxLCAweDAwNjIsCisgICAgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKyAgICAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LAorICAgIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwgMHgwMDdjLCAweDAwN2QsCisgICAgMHgwMDdlLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDBhMSwKKyAgICAweDAwYTIsIDB4MDBhMywgMHgyMDQ0LCAweDAwYTUsIDB4MDE5MiwgMHgwMGE3LCAweDAwYTQsIDB4MDAyNywgMHgyMDFjLAorICAgIDB4MDBhYiwgMHgyMDM5LCAweDIwM2EsIDB4ZmIwMSwgMHhmYjAyLCAweDAwMDAsIDB4MjAxMywgMHgyMDIwLCAweDIwMjEsCisgICAgMHgwMGI3LCAweDAwMDAsIDB4MDBiNiwgMHgyMDIyLCAweDIwMWEsIDB4MjAxZSwgMHgyMDFkLCAweDAwYmIsIDB4MjAyNiwKKyAgICAweDIwMzAsIDB4MDAwMCwgMHgwMGJmLCAweDAwMDAsIDB4MDA2MCwgMHgwMGI0LCAweDAyYzYsIDB4MDJkYywgMHgwMGFmLAorICAgIDB4MDJkOCwgMHgwMmQ5LCAweDAwYTgsIDB4MDAwMCwgMHgwMmRhLCAweDAwYjgsIDB4MDAwMCwgMHgwMmRkLCAweDAyZGIsCisgICAgMHgwMmM3LCAweDIwMTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDBjNiwgMHgwMDAwLCAweDAwYWEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMTQxLCAweDAwZDgsCisgICAgMHgwMTUyLCAweDAwYmEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwZTYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMTMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMTQyLCAweDAwZjgsIDB4MDE1MywgMHgwMGRmLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMH07CiBzdGF0aWMgY29uc3QgRlhfV09SRCBNYWNSb21hbkVuY29kaW5nWzI1Nl0gPSB7Ci0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAotICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwgMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLCAweDAwMzAsIDB4MDAzMSwKLSAgICAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCi0gICAgMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLCAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LAotICAgIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKLSAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksCi0gICAgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAotICAgIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMsIDB4MDA2ZCwKLSAgICAweDAwNmUsIDB4MDA2ZiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCi0gICAgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLCAweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwMDAsIDB4MDBjNCwgMHgwMGM1LAotICAgIDB4MDBjNywgMHgwMGM5LCAweDAwZDEsIDB4MDBkNiwgMHgwMGRjLCAweDAwZTEsIDB4MDBlMCwgMHgwMGUyLCAweDAwZTQsIDB4MDBlMywKLSAgICAweDAwZTUsIDB4MDBlNywgMHgwMGU5LCAweDAwZTgsIDB4MDBlYSwgMHgwMGViLCAweDAwZWQsIDB4MDBlYywgMHgwMGVlLCAweDAwZWYsCi0gICAgMHgwMGYxLCAweDAwZjMsIDB4MDBmMiwgMHgwMGY0LCAweDAwZjYsIDB4MDBmNSwgMHgwMGZhLCAweDAwZjksIDB4MDBmYiwgMHgwMGZjLAotICAgIDB4MjAyMCwgMHgwMGIwLCAweDAwYTIsIDB4MDBhMywgMHgwMGE3LCAweDIwMjIsIDB4MDBiNiwgMHgwMGRmLCAweDAwYWUsIDB4MDBhOSwKLSAgICAweDIxMjIsIDB4MDBiNCwgMHgwMGE4LCAweDAwMDAsIDB4MDBjNiwgMHgwMGQ4LCAweDAwMDAsIDB4MDBiMSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMGE1LCAweDAwYjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwYWEsIDB4MDBiYSwgMHgwMDAwLAotICAgIDB4MDBlNiwgMHgwMGY4LCAweDAwYmYsIDB4MDBhMywgMHgwMGFjLCAweDAwMDAsIDB4MDE5MiwgMHgwMDAwLCAweDAwMDAsIDB4MDBhYiwKLSAgICAweDAwYmIsIDB4MjAyNiwgMHgwMDIwLCAweDAwYzAsIDB4MDBjMywgMHgwMGQ1LCAweDAxNTIsIDB4MDE1MywgMHgyMDEzLCAweDIwMTQsCi0gICAgMHgyMDFjLCAweDIwMWQsIDB4MjAxOCwgMHgyMDE5LCAweDAwZjcsIDB4MDAwMCwgMHgwMGZmLCAweDAxNzgsIDB4MjA0NCwgMHgwMGE0LAotICAgIDB4MjAzOSwgMHgyMDNhLCAweGZiMDEsIDB4ZmIwMiwgMHgyMDIxLCAweDAwYjcsIDB4MjAxYSwgMHgyMDFlLCAweDIwMzAsIDB4MDBjMiwKLSAgICAweDAwY2EsIDB4MDBjMSwgMHgwMGNiLCAweDAwYzgsIDB4MDBjZCwgMHgwMGNlLCAweDAwY2YsIDB4MDBjYywgMHgwMGQzLCAweDAwZDQsCi0gICAgMHgwMDAwLCAweDAwZDIsIDB4MDBkYSwgMHgwMGRiLCAweDAwZDksIDB4MDEzMSwgMHgwMmM2LCAweDAyZGMsIDB4MDBhZiwgMHgwMmQ4LAotICAgIDB4MDJkOSwgMHgwMmRhLCAweDAwYjgsIDB4MDJkZCwgMHgwMmRiLCAweDAyYzcKLX07CisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKyAgICAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwgMHgwMDJjLAorICAgIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsCisgICAgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwgMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwKKyAgICAweDAwM2YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLCAweDAwNTAsCisgICAgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwKKyAgICAweDAwNWEsIDB4MDA1YiwgMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLAorICAgIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisgICAgMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwKKyAgICAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLAorICAgIDB4MDA3ZSwgMHgwMDAwLCAweDAwYzQsIDB4MDBjNSwgMHgwMGM3LCAweDAwYzksIDB4MDBkMSwgMHgwMGQ2LCAweDAwZGMsCisgICAgMHgwMGUxLCAweDAwZTAsIDB4MDBlMiwgMHgwMGU0LCAweDAwZTMsIDB4MDBlNSwgMHgwMGU3LCAweDAwZTksIDB4MDBlOCwKKyAgICAweDAwZWEsIDB4MDBlYiwgMHgwMGVkLCAweDAwZWMsIDB4MDBlZSwgMHgwMGVmLCAweDAwZjEsIDB4MDBmMywgMHgwMGYyLAorICAgIDB4MDBmNCwgMHgwMGY2LCAweDAwZjUsIDB4MDBmYSwgMHgwMGY5LCAweDAwZmIsIDB4MDBmYywgMHgyMDIwLCAweDAwYjAsCisgICAgMHgwMGEyLCAweDAwYTMsIDB4MDBhNywgMHgyMDIyLCAweDAwYjYsIDB4MDBkZiwgMHgwMGFlLCAweDAwYTksIDB4MjEyMiwKKyAgICAweDAwYjQsIDB4MDBhOCwgMHgwMDAwLCAweDAwYzYsIDB4MDBkOCwgMHgwMDAwLCAweDAwYjEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDBhNSwgMHgwMGI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMGFhLCAweDAwYmEsCisgICAgMHgwMDAwLCAweDAwZTYsIDB4MDBmOCwgMHgwMGJmLCAweDAwYTMsIDB4MDBhYywgMHgwMDAwLCAweDAxOTIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDBhYiwgMHgwMGJiLCAweDIwMjYsIDB4MDAyMCwgMHgwMGMwLCAweDAwYzMsIDB4MDBkNSwgMHgwMTUyLAorICAgIDB4MDE1MywgMHgyMDEzLCAweDIwMTQsIDB4MjAxYywgMHgyMDFkLCAweDIwMTgsIDB4MjAxOSwgMHgwMGY3LCAweDAwMDAsCisgICAgMHgwMGZmLCAweDAxNzgsIDB4MjA0NCwgMHgwMGE0LCAweDIwMzksIDB4MjAzYSwgMHhmYjAxLCAweGZiMDIsIDB4MjAyMSwKKyAgICAweDAwYjcsIDB4MjAxYSwgMHgyMDFlLCAweDIwMzAsIDB4MDBjMiwgMHgwMGNhLCAweDAwYzEsIDB4MDBjYiwgMHgwMGM4LAorICAgIDB4MDBjZCwgMHgwMGNlLCAweDAwY2YsIDB4MDBjYywgMHgwMGQzLCAweDAwZDQsIDB4MDAwMCwgMHgwMGQyLCAweDAwZGEsCisgICAgMHgwMGRiLCAweDAwZDksIDB4MDEzMSwgMHgwMmM2LCAweDAyZGMsIDB4MDBhZiwgMHgwMmQ4LCAweDAyZDksIDB4MDJkYSwKKyAgICAweDAwYjgsIDB4MDJkZCwgMHgwMmRiLCAweDAyYzd9Owogc3RhdGljIGNvbnN0IEZYX1dPUkQgQWRvYmVXaW5BbnNpRW5jb2RpbmdbMjU2XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKLSAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKLSAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKLSAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKLSAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKLSAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKLSAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKLSAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKLSAgICAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKLSAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKLSAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKLSAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MjAyMiwKLSAgICAweDIwYWMsIDB4MjAyMiwgMHgyMDFhLCAweDAxOTIsIDB4MjAxZSwgMHgyMDI2LCAweDIwMjAsIDB4MjAyMSwKLSAgICAweDAyYzYsIDB4MjAzMCwgMHgwMTYwLCAweDIwMzksCTB4MDE1MiwgMHgyMDIyLCAweDAxN2QsIDB4MjAyMiwKLSAgICAweDIwMjIsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWMsIDB4MjAxZCwgMHgyMDIyLCAweDIwMTMsIDB4MjAxNCwKLSAgICAweDAyZGMsIDB4MjEyMiwgMHgwMTYxLCAweDIwM2EsIDB4MDE1MywgMHgyMDIyLCAweDAxN2UsIDB4MDE3OCwKLSAgICAweDAwMjAsIDB4MDBhMSwgMHgwMGEyLCAweDAwYTMsIDB4MDBhNCwgMHgwMGE1LCAweDAwYTYsIDB4MDBhNywKLSAgICAweDAwYTgsIDB4MDBhOSwgMHgwMGFhLCAweDAwYWIsIDB4MDBhYywgMHgwMDJkLCAweDAwYWUsIDB4MDBhZiwKLSAgICAweDAwYjAsIDB4MDBiMSwgMHgwMGIyLCAweDAwYjMsIDB4MDBiNCwgMHgwMGI1LCAweDAwYjYsIDB4MDBiNywKLSAgICAweDAwYjgsIDB4MDBiOSwgMHgwMGJhLCAweDAwYmIsIDB4MDBiYywgMHgwMGJkLCAweDAwYmUsIDB4MDBiZiwKLSAgICAweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsIDB4MDBjNCwgMHgwMGM1LCAweDAwYzYsIDB4MDBjNywKLSAgICAweDAwYzgsIDB4MDBjOSwgMHgwMGNhLCAweDAwY2IsIDB4MDBjYywgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwKLSAgICAweDAwZDAsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsIDB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKLSAgICAweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsIDB4MDBkYywgMHgwMGRkLCAweDAwZGUsIDB4MDBkZiwKLSAgICAweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywKLSAgICAweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKLSAgICAweDAwZjAsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsIDB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywKLSAgICAweDAwZjgsIDB4MDBmOSwgMHgwMGZhLCAweDAwZmIsIDB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZgotfTsKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorICAgIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsCisgICAgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwKKyAgICAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLAorICAgIDB4MDAzZiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsIDB4MDA1MCwKKyAgICAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAorICAgIDB4MDA1YSwgMHgwMDViLCAweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsCisgICAgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKyAgICAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LAorICAgIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwgMHgwMDdjLCAweDAwN2QsCisgICAgMHgwMDdlLCAweDIwMjIsIDB4MjBhYywgMHgyMDIyLCAweDIwMWEsIDB4MDE5MiwgMHgyMDFlLCAweDIwMjYsIDB4MjAyMCwKKyAgICAweDIwMjEsIDB4MDJjNiwgMHgyMDMwLCAweDAxNjAsIDB4MjAzOSwgMHgwMTUyLCAweDIwMjIsIDB4MDE3ZCwgMHgyMDIyLAorICAgIDB4MjAyMiwgMHgyMDE4LCAweDIwMTksIDB4MjAxYywgMHgyMDFkLCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAyZGMsCisgICAgMHgyMTIyLCAweDAxNjEsIDB4MjAzYSwgMHgwMTUzLCAweDIwMjIsIDB4MDE3ZSwgMHgwMTc4LCAweDAwMjAsIDB4MDBhMSwKKyAgICAweDAwYTIsIDB4MDBhMywgMHgwMGE0LCAweDAwYTUsIDB4MDBhNiwgMHgwMGE3LCAweDAwYTgsIDB4MDBhOSwgMHgwMGFhLAorICAgIDB4MDBhYiwgMHgwMGFjLCAweDAwMmQsIDB4MDBhZSwgMHgwMGFmLCAweDAwYjAsIDB4MDBiMSwgMHgwMGIyLCAweDAwYjMsCisgICAgMHgwMGI0LCAweDAwYjUsIDB4MDBiNiwgMHgwMGI3LCAweDAwYjgsIDB4MDBiOSwgMHgwMGJhLCAweDAwYmIsIDB4MDBiYywKKyAgICAweDAwYmQsIDB4MDBiZSwgMHgwMGJmLCAweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsIDB4MDBjNCwgMHgwMGM1LAorICAgIDB4MDBjNiwgMHgwMGM3LCAweDAwYzgsIDB4MDBjOSwgMHgwMGNhLCAweDAwY2IsIDB4MDBjYywgMHgwMGNkLCAweDAwY2UsCisgICAgMHgwMGNmLCAweDAwZDAsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsIDB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKKyAgICAweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsIDB4MDBkYywgMHgwMGRkLCAweDAwZGUsIDB4MDBkZiwgMHgwMGUwLAorICAgIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywgMHgwMGU4LCAweDAwZTksCisgICAgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwgMHgwMGYwLCAweDAwZjEsIDB4MDBmMiwKKyAgICAweDAwZjMsIDB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywgMHgwMGY4LCAweDAwZjksIDB4MDBmYSwgMHgwMGZiLAorICAgIDB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZn07CiBzdGF0aWMgY29uc3QgRlhfV09SRCBNYWNFeHBlcnRFbmNvZGluZ1syNTZdID0gewotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMjAsIDB4ZjcyMSwgMHhmNmY4LCAweGY3YTIsIDB4ZjcyNCwgMHhmNmU0LCAweGY3MjYsIDB4ZjdiNCwKLSAgICAweDIwN2QsIDB4MjA3ZSwgMHgyMDI1LCAweDIwMjQsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MjA0NCwgMHhmNzMwLCAweGY3MzEsCi0gICAgMHhmNzMyLCAweGY3MzMsIDB4ZjczNCwgMHhmNzM1LCAweGY3MzYsIDB4ZjczNywgMHhmNzM4LCAweGY3MzksIDB4MDAzYSwgMHgwMDNiLAotICAgIDB4MDAwMCwgMHhmNmRlLCAweDAwMDAsIDB4ZjczZiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGY3ZjAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDBiYywgMHgwMGJkLCAweDAwYmUsIDB4MjE1YiwgMHgyMTVjLCAweDIxNWQsIDB4MjE1ZSwgMHgyMTUzLCAweDIxNTQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHhmYjAwLCAweGZiMDEsIDB4ZmIwMiwgMHhmYjAzLAotICAgIDB4ZmIwNCwgMHgyMDhkLCAweDAwMDAsIDB4MjA4ZSwgMHhmNmY2LCAweGY2ZTUsIDB4Zjc2MCwgMHhmNzYxLCAweGY3NjIsIDB4Zjc2MywKLSAgICAweGY3NjQsIDB4Zjc2NSwgMHhmNzY2LCAweGY3NjcsIDB4Zjc2OCwgMHhmNzY5LCAweGY3NmEsIDB4Zjc2YiwgMHhmNzZjLCAweGY3NmQsCi0gICAgMHhmNzZlLCAweGY3NmYsIDB4Zjc3MCwgMHhmNzcxLCAweGY3NzIsIDB4Zjc3MywgMHhmNzc0LCAweGY3NzUsIDB4Zjc3NiwgMHhmNzc3LAotICAgIDB4Zjc3OCwgMHhmNzc5LCAweGY3N2EsIDB4MjBhMSwgMHhmNmRjLCAweGY2ZGQsIDB4ZjZmZSwgMHgwMDAwLCAweDAwMDAsIDB4ZjZlOSwKLSAgICAweGY2ZTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHhmN2UxLCAweGY3ZTAsIDB4ZjdlMiwgMHhmN2U0LCAweGY3ZTMsCi0gICAgMHhmN2U1LCAweGY3ZTcsIDB4ZjdlOSwgMHhmN2U4LCAweGY3ZWEsIDB4ZjdlYiwgMHhmN2VkLCAweGY3ZWMsIDB4ZjdlZSwgMHhmN2VmLAotICAgIDB4ZjdmMSwgMHhmN2YzLCAweGY3ZjIsIDB4ZjdmNCwgMHhmN2Y2LCAweGY3ZjUsIDB4ZjdmYSwgMHhmN2Y5LCAweGY3ZmIsIDB4ZjdmYywKLSAgICAweDAwMDAsIDB4MjA3OCwgMHgyMDg0LCAweDIwODMsIDB4MjA4NiwgMHgyMDg4LCAweDIwODcsIDB4ZjZmZCwgMHgwMDAwLCAweGY2ZGYsCi0gICAgMHgyMDgyLCAweDAwMDAsIDB4ZjdhOCwgMHgwMDAwLCAweGY2ZjUsIDB4ZjZmZCwgMHgyMDg1LCAweDAwMDAsIDB4ZjZlMSwgMHhmNmU3LAotICAgIDB4ZjdmZCwgMHgwMDAwLCAweGY2ZTMsIDB4MDAwMCwgMHgwMDAwLCAweGY3ZmUsIDB4MDAwMCwgMHgyMDg5LCAweDIwODAsIDB4ZjZmZiwKLSAgICAweGY3ZTYsIDB4ZjdmOCwgMHhmN2JmLCAweDIwODEsIDB4ZjZlOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweGY3YjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGY2ZmEsIDB4MjAxMiwgMHhmNmU2LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHhmN2ExLCAweDAwMDAsIDB4ZjdmZiwgMHgwMDAwLCAweDAwYjksIDB4MDBiMiwKLSAgICAweDAwYjMsIDB4MjA3NCwgMHgyMDc1LCAweDIwNzYsIDB4MjA3NywgMHgyMDc5LCAweDIwNzAsIDB4MDAwMCwgMHhmNmVjLCAweGY2ZjEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHhmNmVkLCAweGY2ZjIsIDB4ZjZlYiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHhmNmVlLCAweGY2ZmIsIDB4ZjZmNCwgMHhmN2FmLCAweGY2ZWEsIDB4MjA3ZiwgMHhmNmVmLCAweGY2ZTIsIDB4ZjZlOCwKLSAgICAweGY2ZjcsIDB4ZjZmYywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwCi19OworICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMjAsIDB4ZjcyMSwgMHhmNmY4LCAweGY3YTIsCisgICAgMHhmNzI0LCAweGY2ZTQsIDB4ZjcyNiwgMHhmN2I0LCAweDIwN2QsIDB4MjA3ZSwgMHgyMDI1LCAweDIwMjQsIDB4MDAyYywKKyAgICAweDAwMmQsIDB4MDAyZSwgMHgyMDQ0LCAweGY3MzAsIDB4ZjczMSwgMHhmNzMyLCAweGY3MzMsIDB4ZjczNCwgMHhmNzM1LAorICAgIDB4ZjczNiwgMHhmNzM3LCAweGY3MzgsIDB4ZjczOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAwMCwgMHhmNmRlLCAweDAwMDAsCisgICAgMHhmNzNmLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ZjdmMCwgMHgwMDAwLCAweDAwMDAsIDB4MDBiYywKKyAgICAweDAwYmQsIDB4MDBiZSwgMHgyMTViLCAweDIxNWMsIDB4MjE1ZCwgMHgyMTVlLCAweDIxNTMsIDB4MjE1NCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGZiMDAsIDB4ZmIwMSwgMHhmYjAyLCAweGZiMDMsCisgICAgMHhmYjA0LCAweDIwOGQsIDB4MDAwMCwgMHgyMDhlLCAweGY2ZjYsIDB4ZjZlNSwgMHhmNzYwLCAweGY3NjEsIDB4Zjc2MiwKKyAgICAweGY3NjMsIDB4Zjc2NCwgMHhmNzY1LCAweGY3NjYsIDB4Zjc2NywgMHhmNzY4LCAweGY3NjksIDB4Zjc2YSwgMHhmNzZiLAorICAgIDB4Zjc2YywgMHhmNzZkLCAweGY3NmUsIDB4Zjc2ZiwgMHhmNzcwLCAweGY3NzEsIDB4Zjc3MiwgMHhmNzczLCAweGY3NzQsCisgICAgMHhmNzc1LCAweGY3NzYsIDB4Zjc3NywgMHhmNzc4LCAweGY3NzksIDB4Zjc3YSwgMHgyMGExLCAweGY2ZGMsIDB4ZjZkZCwKKyAgICAweGY2ZmUsIDB4MDAwMCwgMHgwMDAwLCAweGY2ZTksIDB4ZjZlMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ZjdlMSwgMHhmN2UwLCAweGY3ZTIsIDB4ZjdlNCwgMHhmN2UzLCAweGY3ZTUsIDB4ZjdlNywgMHhmN2U5LCAweGY3ZTgsCisgICAgMHhmN2VhLCAweGY3ZWIsIDB4ZjdlZCwgMHhmN2VjLCAweGY3ZWUsIDB4ZjdlZiwgMHhmN2YxLCAweGY3ZjMsIDB4ZjdmMiwKKyAgICAweGY3ZjQsIDB4ZjdmNiwgMHhmN2Y1LCAweGY3ZmEsIDB4ZjdmOSwgMHhmN2ZiLCAweGY3ZmMsIDB4MDAwMCwgMHgyMDc4LAorICAgIDB4MjA4NCwgMHgyMDgzLCAweDIwODYsIDB4MjA4OCwgMHgyMDg3LCAweGY2ZmQsIDB4MDAwMCwgMHhmNmRmLCAweDIwODIsCisgICAgMHgwMDAwLCAweGY3YTgsIDB4MDAwMCwgMHhmNmY1LCAweGY2ZmQsIDB4MjA4NSwgMHgwMDAwLCAweGY2ZTEsIDB4ZjZlNywKKyAgICAweGY3ZmQsIDB4MDAwMCwgMHhmNmUzLCAweDAwMDAsIDB4MDAwMCwgMHhmN2ZlLCAweDAwMDAsIDB4MjA4OSwgMHgyMDgwLAorICAgIDB4ZjZmZiwgMHhmN2U2LCAweGY3ZjgsIDB4ZjdiZiwgMHgyMDgxLCAweGY2ZTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHhmN2I4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweGY2ZmEsIDB4MjAxMiwgMHhmNmU2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ZjdhMSwgMHgwMDAwLAorICAgIDB4ZjdmZiwgMHgwMDAwLCAweDAwYjksIDB4MDBiMiwgMHgwMGIzLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsCisgICAgMHgyMDc5LCAweDIwNzAsIDB4MDAwMCwgMHhmNmVjLCAweGY2ZjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ZjZlZCwKKyAgICAweGY2ZjIsIDB4ZjZlYiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ZjZlZSwgMHhmNmZiLAorICAgIDB4ZjZmNCwgMHhmN2FmLCAweGY2ZWEsIDB4MjA3ZiwgMHhmNmVmLCAweGY2ZTIsIDB4ZjZlOCwgMHhmNmY3LCAweGY2ZmMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwfTsKIHN0YXRpYyBjb25zdCBGWF9XT1JEIEFkb2JlU3ltYm9sRW5jb2RpbmdbMjU2XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMjAsIDB4MDAyMSwgMHgyMjAwLCAweDAwMjMsIDB4MjIwMywgMHgwMDI1LCAweDAwMjYsIDB4MjIwQiwKLSAgICAweDAwMjgsIDB4MDAyOSwgMHgyMjE3LCAweDAwMkIsIDB4MDAyQywgMHgyMjEyLCAweDAwMkUsIDB4MDAyRiwKLSAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKLSAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwKLSAgICAweDIyNDUsIDB4MDM5MSwgMHgwMzkyLCAweDAzQTcsIDB4MDM5NCwgMHgwMzk1LCAweDAzQTYsIDB4MDM5MywKLSAgICAweDAzOTcsIDB4MDM5OSwgMHgwM0QxLCAweDAzOUEsIDB4MDM5QiwgMHgwMzlDLCAweDAzOUQsIDB4MDM5RiwKLSAgICAweDAzQTAsIDB4MDM5OCwgMHgwM0ExLCAweDAzQTMsIDB4MDNBNCwgMHgwM0E1LCAweDAzQzIsIDB4MDNBOSwKLSAgICAweDAzOUUsIDB4MDNBOCwgMHgwMzk2LCAweDAwNUIsIDB4MjIzNCwgMHgwMDVELCAweDIyQTUsIDB4MDA1RiwKLSAgICAweEY4RTUsIDB4MDNCMSwgMHgwM0IyLCAweDAzQzcsIDB4MDNCNCwgMHgwM0I1LCAweDAzQzYsIDB4MDNCMywKLSAgICAweDAzQjcsIDB4MDNCOSwgMHgwM0Q1LCAweDAzQkEsIDB4MDNCQiwgMHgwM0JDLCAweDAzQkQsIDB4MDNCRiwKLSAgICAweDAzQzAsIDB4MDNCOCwgMHgwM0MxLCAweDAzQzMsIDB4MDNDNCwgMHgwM0M1LCAweDAzRDYsIDB4MDNDOSwKLSAgICAweDAzQkUsIDB4MDNDOCwgMHgwM0I2LCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDIyM0MsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDIwQUMsIDB4MDNEMiwgMHgyMDMyLCAweDIyNjQsIDB4MjA0NCwgMHgyMjFFLCAweDAxOTIsIDB4MjY2MywKLSAgICAweDI2NjYsIDB4MjY2NSwgMHgyNjYwLCAweDIxOTQsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTIsIDB4MjE5MywKLSAgICAweDAwQjAsIDB4MDBCMSwgMHgyMDMzLCAweDIyNjUsIDB4MDBENywgMHgyMjFELCAweDIyMDIsIDB4MjAyMiwKLSAgICAweDAwRjcsIDB4MjI2MCwgMHgyMjYxLCAweDIyNDgsIDB4MjAyNiwgMHhGOEU2LCAweEY4RTcsIDB4MjFCNSwKLSAgICAweDIxMzUsIDB4MjExMSwgMHgyMTFDLCAweDIxMTgsIDB4MjI5NywgMHgyMjk1LCAweDIyMDUsIDB4MjIyOSwKLSAgICAweDIyMkEsIDB4MjI4MywgMHgyMjg3LCAweDIyODQsIDB4MjI4MiwgMHgyMjg2LCAweDIyMDgsIDB4MjIwOSwKLSAgICAweDIyMjAsIDB4MjIwNywgMHhGNkRBLCAweEY2RDksIDB4RjZEQiwgMHgyMjBGLCAweDIyMUEsIDB4MjJDNSwKLSAgICAweDAwQUMsIDB4MjIyNywgMHgyMjI4LCAweDIxRDQsIDB4MjFEMCwgMHgyMUQxLCAweDIxRDIsIDB4MjFEMywKLSAgICAweDI1Q0EsIDB4MjMyOSwgMHhGOEU4LCAweEY4RTksIDB4RjhFQSwgMHgyMjExLCAweEY4RUIsIDB4RjhFQywKLSAgICAweEY4RUQsIDB4RjhFRSwgMHhGOEVGLCAweEY4RjAsIDB4RjhGMSwgMHhGOEYyLCAweEY4RjMsIDB4RjhGNCwKLSAgICAweDAwMDAsIDB4MjMyQSwgMHgyMjJCLCAweDIzMjAsIDB4RjhGNSwgMHgyMzIxLCAweEY4RjYsIDB4RjhGNywKLSAgICAweEY4RjgsIDB4RjhGOSwgMHhGOEZBLCAweEY4RkIsIDB4RjhGQywgMHhGOEZELCAweEY4RkUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMjEsIDB4MjIwMCwgMHgwMDIzLAorICAgIDB4MjIwMywgMHgwMDI1LCAweDAwMjYsIDB4MjIwQiwgMHgwMDI4LCAweDAwMjksIDB4MjIxNywgMHgwMDJCLCAweDAwMkMsCisgICAgMHgyMjEyLCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwKKyAgICAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLAorICAgIDB4MDAzRiwgMHgyMjQ1LCAweDAzOTEsIDB4MDM5MiwgMHgwM0E3LCAweDAzOTQsIDB4MDM5NSwgMHgwM0E2LCAweDAzOTMsCisgICAgMHgwMzk3LCAweDAzOTksIDB4MDNEMSwgMHgwMzlBLCAweDAzOUIsIDB4MDM5QywgMHgwMzlELCAweDAzOUYsIDB4MDNBMCwKKyAgICAweDAzOTgsIDB4MDNBMSwgMHgwM0EzLCAweDAzQTQsIDB4MDNBNSwgMHgwM0MyLCAweDAzQTksIDB4MDM5RSwgMHgwM0E4LAorICAgIDB4MDM5NiwgMHgwMDVCLCAweDIyMzQsIDB4MDA1RCwgMHgyMkE1LCAweDAwNUYsIDB4RjhFNSwgMHgwM0IxLCAweDAzQjIsCisgICAgMHgwM0M3LCAweDAzQjQsIDB4MDNCNSwgMHgwM0M2LCAweDAzQjMsIDB4MDNCNywgMHgwM0I5LCAweDAzRDUsIDB4MDNCQSwKKyAgICAweDAzQkIsIDB4MDNCQywgMHgwM0JELCAweDAzQkYsIDB4MDNDMCwgMHgwM0I4LCAweDAzQzEsIDB4MDNDMywgMHgwM0M0LAorICAgIDB4MDNDNSwgMHgwM0Q2LCAweDAzQzksIDB4MDNCRSwgMHgwM0M4LCAweDAzQjYsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsCisgICAgMHgyMjNDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQUMsIDB4MDNEMiwKKyAgICAweDIwMzIsIDB4MjI2NCwgMHgyMDQ0LCAweDIyMUUsIDB4MDE5MiwgMHgyNjYzLCAweDI2NjYsIDB4MjY2NSwgMHgyNjYwLAorICAgIDB4MjE5NCwgMHgyMTkwLCAweDIxOTEsIDB4MjE5MiwgMHgyMTkzLCAweDAwQjAsIDB4MDBCMSwgMHgyMDMzLCAweDIyNjUsCisgICAgMHgwMEQ3LCAweDIyMUQsIDB4MjIwMiwgMHgyMDIyLCAweDAwRjcsIDB4MjI2MCwgMHgyMjYxLCAweDIyNDgsIDB4MjAyNiwKKyAgICAweEY4RTYsIDB4RjhFNywgMHgyMUI1LCAweDIxMzUsIDB4MjExMSwgMHgyMTFDLCAweDIxMTgsIDB4MjI5NywgMHgyMjk1LAorICAgIDB4MjIwNSwgMHgyMjI5LCAweDIyMkEsIDB4MjI4MywgMHgyMjg3LCAweDIyODQsIDB4MjI4MiwgMHgyMjg2LCAweDIyMDgsCisgICAgMHgyMjA5LCAweDIyMjAsIDB4MjIwNywgMHhGNkRBLCAweEY2RDksIDB4RjZEQiwgMHgyMjBGLCAweDIyMUEsIDB4MjJDNSwKKyAgICAweDAwQUMsIDB4MjIyNywgMHgyMjI4LCAweDIxRDQsIDB4MjFEMCwgMHgyMUQxLCAweDIxRDIsIDB4MjFEMywgMHgyNUNBLAorICAgIDB4MjMyOSwgMHhGOEU4LCAweEY4RTksIDB4RjhFQSwgMHgyMjExLCAweEY4RUIsIDB4RjhFQywgMHhGOEVELCAweEY4RUUsCisgICAgMHhGOEVGLCAweEY4RjAsIDB4RjhGMSwgMHhGOEYyLCAweEY4RjMsIDB4RjhGNCwgMHgwMDAwLCAweDIzMkEsIDB4MjIyQiwKKyAgICAweDIzMjAsIDB4RjhGNSwgMHgyMzIxLCAweEY4RjYsIDB4RjhGNywgMHhGOEY4LCAweEY4RjksIDB4RjhGQSwgMHhGOEZCLAorICAgIDB4RjhGQywgMHhGOEZELCAweEY4RkUsIDB4MDAwMCwKIH07CiBzdGF0aWMgY29uc3QgRlhfV09SRCBaYXBmRW5jb2RpbmdbMjU2XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMjAsIDB4MjcwMSwgMHgyNzAyLCAweDI3MDMsIDB4MjcwNCwgMHgyNjBFLCAweDI3MDYsIDB4MjcwNywKLSAgICAweDI3MDgsIDB4MjcwOSwgMHgyNjFCLCAweDI2MUUsIDB4MjcwQywgMHgyNzBELCAweDI3MEUsIDB4MjcwRiwKLSAgICAweDI3MTAsIDB4MjcxMSwgMHgyNzEyLCAweDI3MTMsIDB4MjcxNCwgMHgyNzE1LCAweDI3MTYsIDB4MjcxNywKLSAgICAweDI3MTgsIDB4MjcxOSwgMHgyNzFBLCAweDI3MUIsIDB4MjcxQywgMHgyNzFELCAweDI3MUUsIDB4MjcxRiwKLSAgICAweDI3MjAsIDB4MjcyMSwgMHgyNzIyLCAweDI3MjMsIDB4MjcyNCwgMHgyNzI1LCAweDI3MjYsIDB4MjcyNywKLSAgICAweDI2MDUsIDB4MjcyOSwgMHgyNzJBLCAweDI3MkIsIDB4MjcyQywgMHgyNzJELCAweDI3MkUsIDB4MjcyRiwKLSAgICAweDI3MzAsIDB4MjczMSwgMHgyNzMyLCAweDI3MzMsIDB4MjczNCwgMHgyNzM1LCAweDI3MzYsIDB4MjczNywKLSAgICAweDI3MzgsIDB4MjczOSwgMHgyNzNBLCAweDI3M0IsIDB4MjczQywgMHgyNzNELCAweDI3M0UsIDB4MjczRiwKLSAgICAweDI3NDAsIDB4Mjc0MSwgMHgyNzQyLCAweDI3NDMsIDB4Mjc0NCwgMHgyNzQ1LCAweDI3NDYsIDB4Mjc0NywKLSAgICAweDI3NDgsIDB4Mjc0OSwgMHgyNzRBLCAweDI3NEIsIDB4MjVDRiwgMHgyNzRELCAweDI1QTAsIDB4Mjc0RiwKLSAgICAweDI3NTAsIDB4Mjc1MSwgMHgyNzUyLCAweDI1QjIsIDB4MjVCQywgMHgyNUM2LCAweDI3NTYsIDB4MjVENywKLSAgICAweDI3NTgsIDB4Mjc1OSwgMHgyNzVBLCAweDI3NUIsIDB4Mjc1QywgMHgyNzVELCAweDI3NUUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4Mjc2MSwgMHgyNzYyLCAweDI3NjMsIDB4Mjc2NCwgMHgyNzY1LCAweDI3NjYsIDB4Mjc2NywKLSAgICAweDI2NjMsIDB4MjY2NiwgMHgyNjY1LCAweDI2NjAsIDB4MjQ2MCwgMHgyNDYxLCAweDI0NjIsIDB4MjQ2MywKLSAgICAweDI0NjQsIDB4MjQ2NSwgMHgyNDY2LCAweDI0NjcsIDB4MjQ2OCwgMHgyNDY5LCAweDI3NzYsIDB4Mjc3NywKLSAgICAweDI3NzgsIDB4Mjc3OSwgMHgyNzdBLCAweDI3N0IsIDB4Mjc3QywgMHgyNzdELCAweDI3N0UsIDB4Mjc3RiwKLSAgICAweDI3ODAsIDB4Mjc4MSwgMHgyNzgyLCAweDI3ODMsIDB4Mjc4NCwgMHgyNzg1LCAweDI3ODYsIDB4Mjc4NywKLSAgICAweDI3ODgsIDB4Mjc4OSwgMHgyNzhBLCAweDI3OEIsIDB4Mjc4QywgMHgyNzhELCAweDI3OEUsIDB4Mjc4RiwKLSAgICAweDI3OTAsIDB4Mjc5MSwgMHgyNzkyLCAweDI3OTMsIDB4Mjc5NCwgMHgyMTkyLCAweDIxOTQsIDB4MjE5NSwKLSAgICAweDI3OTgsIDB4Mjc5OSwgMHgyNzlBLCAweDI3OUIsIDB4Mjc5QywgMHgyNzlELCAweDI3OUUsIDB4Mjc5RiwKLSAgICAweDI3QTAsIDB4MjdBMSwgMHgyN0EyLCAweDI3QTMsIDB4MjdBNCwgMHgyN0E1LCAweDI3QTYsIDB4MjdBNywKLSAgICAweDI3QTgsIDB4MjdBOSwgMHgyN0FBLCAweDI3QUIsIDB4MjdBQywgMHgyN0FELCAweDI3QUUsIDB4MjdBRiwKLSAgICAweDAwMDAsIDB4MjdCMSwgMHgyN0IyLCAweDI3QjMsIDB4MjdCNCwgMHgyN0I1LCAweDI3QjYsIDB4MjdCNywKLSAgICAweDI3QjgsIDB4MjdCOSwgMHgyN0JBLCAweDI3QkIsIDB4MjdCQywgMHgyN0JELCAweDI3QkUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDIwLCAweDI3MDEsIDB4MjcwMiwgMHgyNzAzLAorICAgIDB4MjcwNCwgMHgyNjBFLCAweDI3MDYsIDB4MjcwNywgMHgyNzA4LCAweDI3MDksIDB4MjYxQiwgMHgyNjFFLCAweDI3MEMsCisgICAgMHgyNzBELCAweDI3MEUsIDB4MjcwRiwgMHgyNzEwLCAweDI3MTEsIDB4MjcxMiwgMHgyNzEzLCAweDI3MTQsIDB4MjcxNSwKKyAgICAweDI3MTYsIDB4MjcxNywgMHgyNzE4LCAweDI3MTksIDB4MjcxQSwgMHgyNzFCLCAweDI3MUMsIDB4MjcxRCwgMHgyNzFFLAorICAgIDB4MjcxRiwgMHgyNzIwLCAweDI3MjEsIDB4MjcyMiwgMHgyNzIzLCAweDI3MjQsIDB4MjcyNSwgMHgyNzI2LCAweDI3MjcsCisgICAgMHgyNjA1LCAweDI3MjksIDB4MjcyQSwgMHgyNzJCLCAweDI3MkMsIDB4MjcyRCwgMHgyNzJFLCAweDI3MkYsIDB4MjczMCwKKyAgICAweDI3MzEsIDB4MjczMiwgMHgyNzMzLCAweDI3MzQsIDB4MjczNSwgMHgyNzM2LCAweDI3MzcsIDB4MjczOCwgMHgyNzM5LAorICAgIDB4MjczQSwgMHgyNzNCLCAweDI3M0MsIDB4MjczRCwgMHgyNzNFLCAweDI3M0YsIDB4Mjc0MCwgMHgyNzQxLCAweDI3NDIsCisgICAgMHgyNzQzLCAweDI3NDQsIDB4Mjc0NSwgMHgyNzQ2LCAweDI3NDcsIDB4Mjc0OCwgMHgyNzQ5LCAweDI3NEEsIDB4Mjc0QiwKKyAgICAweDI1Q0YsIDB4Mjc0RCwgMHgyNUEwLCAweDI3NEYsIDB4Mjc1MCwgMHgyNzUxLCAweDI3NTIsIDB4MjVCMiwgMHgyNUJDLAorICAgIDB4MjVDNiwgMHgyNzU2LCAweDI1RDcsIDB4Mjc1OCwgMHgyNzU5LCAweDI3NUEsIDB4Mjc1QiwgMHgyNzVDLCAweDI3NUQsCisgICAgMHgyNzVFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4Mjc2MSwKKyAgICAweDI3NjIsIDB4Mjc2MywgMHgyNzY0LCAweDI3NjUsIDB4Mjc2NiwgMHgyNzY3LCAweDI2NjMsIDB4MjY2NiwgMHgyNjY1LAorICAgIDB4MjY2MCwgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLCAweDI0NjQsIDB4MjQ2NSwgMHgyNDY2LCAweDI0NjcsCisgICAgMHgyNDY4LCAweDI0NjksIDB4Mjc3NiwgMHgyNzc3LCAweDI3NzgsIDB4Mjc3OSwgMHgyNzdBLCAweDI3N0IsIDB4Mjc3QywKKyAgICAweDI3N0QsIDB4Mjc3RSwgMHgyNzdGLCAweDI3ODAsIDB4Mjc4MSwgMHgyNzgyLCAweDI3ODMsIDB4Mjc4NCwgMHgyNzg1LAorICAgIDB4Mjc4NiwgMHgyNzg3LCAweDI3ODgsIDB4Mjc4OSwgMHgyNzhBLCAweDI3OEIsIDB4Mjc4QywgMHgyNzhELCAweDI3OEUsCisgICAgMHgyNzhGLCAweDI3OTAsIDB4Mjc5MSwgMHgyNzkyLCAweDI3OTMsIDB4Mjc5NCwgMHgyMTkyLCAweDIxOTQsIDB4MjE5NSwKKyAgICAweDI3OTgsIDB4Mjc5OSwgMHgyNzlBLCAweDI3OUIsIDB4Mjc5QywgMHgyNzlELCAweDI3OUUsIDB4Mjc5RiwgMHgyN0EwLAorICAgIDB4MjdBMSwgMHgyN0EyLCAweDI3QTMsIDB4MjdBNCwgMHgyN0E1LCAweDI3QTYsIDB4MjdBNywgMHgyN0E4LCAweDI3QTksCisgICAgMHgyN0FBLCAweDI3QUIsIDB4MjdBQywgMHgyN0FELCAweDI3QUUsIDB4MjdBRiwgMHgwMDAwLCAweDI3QjEsIDB4MjdCMiwKKyAgICAweDI3QjMsIDB4MjdCNCwgMHgyN0I1LCAweDI3QjYsIDB4MjdCNywgMHgyN0I4LCAweDI3QjksIDB4MjdCQSwgMHgyN0JCLAorICAgIDB4MjdCQywgMHgyN0JELCAweDI3QkUsIDB4MDAwMCwKIH07CiBzdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgU3RhbmRhcmRFbmNvZGluZ05hbWVzWzIyNF0gPSB7Ci0gICAgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwKLSAgICAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwKLSAgICAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLAotICAgICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLAotICAgICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwKLSAgICAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwKLSAgICAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwKLSAgICAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwKLSAgICAicXVvdGVsZWZ0IiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLAotICAgICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLAotICAgICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLAotICAgICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCAiZXhjbGFtZG93biIsICJjZW50IiwgInN0ZXJsaW5nIiwgImZyYWN0aW9uIiwgInllbiIsICJmbG9yaW4iLCAic2VjdGlvbiIsCi0gICAgImN1cnJlbmN5IiwgInF1b3Rlc2luZ2xlIiwgInF1b3RlZGJsbGVmdCIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLAotICAgIE5VTEwsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsIE5VTEwsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwKLSAgICAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInF1b3RlZGJscmlnaHQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAicGVydGhvdXNhbmQiLCBOVUxMLCAicXVlc3Rpb25kb3duIiwKLSAgICBOVUxMLCAiZ3JhdmUiLCAiYWN1dGUiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwKLSAgICAiZGllcmVzaXMiLCBOVUxMLCAicmluZyIsICJjZWRpbGxhIiwgTlVMTCwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLAotICAgICJlbWRhc2giLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgIkFFIiwgTlVMTCwgIm9yZGZlbWluaW5lIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAiTHNsYXNoIiwgIk9zbGFzaCIsICJPRSIsICJvcmRtYXNjdWxpbmUiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsICJhZSIsIE5VTEwsIE5VTEwsIE5VTEwsICJkb3RsZXNzaSIsIE5VTEwsIE5VTEwsCi0gICAgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgInNwYWNlIiwKKyAgICAiZXhjbGFtIiwKKyAgICAicXVvdGVkYmwiLAorICAgICJudW1iZXJzaWduIiwKKyAgICAiZG9sbGFyIiwKKyAgICAicGVyY2VudCIsCisgICAgImFtcGVyc2FuZCIsCisgICAgInF1b3RlcmlnaHQiLAorICAgICJwYXJlbmxlZnQiLAorICAgICJwYXJlbnJpZ2h0IiwKKyAgICAiYXN0ZXJpc2siLAorICAgICJwbHVzIiwKKyAgICAiY29tbWEiLAorICAgICJoeXBoZW4iLAorICAgICJwZXJpb2QiLAorICAgICJzbGFzaCIsCisgICAgInplcm8iLAorICAgICJvbmUiLAorICAgICJ0d28iLAorICAgICJ0aHJlZSIsCisgICAgImZvdXIiLAorICAgICJmaXZlIiwKKyAgICAic2l4IiwKKyAgICAic2V2ZW4iLAorICAgICJlaWdodCIsCisgICAgIm5pbmUiLAorICAgICJjb2xvbiIsCisgICAgInNlbWljb2xvbiIsCisgICAgImxlc3MiLAorICAgICJlcXVhbCIsCisgICAgImdyZWF0ZXIiLAorICAgICJxdWVzdGlvbiIsCisgICAgImF0IiwKKyAgICAiQSIsCisgICAgIkIiLAorICAgICJDIiwKKyAgICAiRCIsCisgICAgIkUiLAorICAgICJGIiwKKyAgICAiRyIsCisgICAgIkgiLAorICAgICJJIiwKKyAgICAiSiIsCisgICAgIksiLAorICAgICJMIiwKKyAgICAiTSIsCisgICAgIk4iLAorICAgICJPIiwKKyAgICAiUCIsCisgICAgIlEiLAorICAgICJSIiwKKyAgICAiUyIsCisgICAgIlQiLAorICAgICJVIiwKKyAgICAiViIsCisgICAgIlciLAorICAgICJYIiwKKyAgICAiWSIsCisgICAgIloiLAorICAgICJicmFja2V0bGVmdCIsCisgICAgImJhY2tzbGFzaCIsCisgICAgImJyYWNrZXRyaWdodCIsCisgICAgImFzY2lpY2lyY3VtIiwKKyAgICAidW5kZXJzY29yZSIsCisgICAgInF1b3RlbGVmdCIsCisgICAgImEiLAorICAgICJiIiwKKyAgICAiYyIsCisgICAgImQiLAorICAgICJlIiwKKyAgICAiZiIsCisgICAgImciLAorICAgICJoIiwKKyAgICAiaSIsCisgICAgImoiLAorICAgICJrIiwKKyAgICAibCIsCisgICAgIm0iLAorICAgICJuIiwKKyAgICAibyIsCisgICAgInAiLAorICAgICJxIiwKKyAgICAiciIsCisgICAgInMiLAorICAgICJ0IiwKKyAgICAidSIsCisgICAgInYiLAorICAgICJ3IiwKKyAgICAieCIsCisgICAgInkiLAorICAgICJ6IiwKKyAgICAiYnJhY2VsZWZ0IiwKKyAgICAiYmFyIiwKKyAgICAiYnJhY2VyaWdodCIsCisgICAgImFzY2lpdGlsZGUiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgImV4Y2xhbWRvd24iLAorICAgICJjZW50IiwKKyAgICAic3RlcmxpbmciLAorICAgICJmcmFjdGlvbiIsCisgICAgInllbiIsCisgICAgImZsb3JpbiIsCisgICAgInNlY3Rpb24iLAorICAgICJjdXJyZW5jeSIsCisgICAgInF1b3Rlc2luZ2xlIiwKKyAgICAicXVvdGVkYmxsZWZ0IiwKKyAgICAiZ3VpbGxlbW90bGVmdCIsCisgICAgImd1aWxzaW5nbGxlZnQiLAorICAgICJndWlsc2luZ2xyaWdodCIsCisgICAgImZpIiwKKyAgICAiZmwiLAorICAgIE5VTEwsCisgICAgImVuZGFzaCIsCisgICAgImRhZ2dlciIsCisgICAgImRhZ2dlcmRibCIsCisgICAgInBlcmlvZGNlbnRlcmVkIiwKKyAgICBOVUxMLAorICAgICJwYXJhZ3JhcGgiLAorICAgICJidWxsZXQiLAorICAgICJxdW90ZXNpbmdsYmFzZSIsCisgICAgInF1b3RlZGJsYmFzZSIsCisgICAgInF1b3RlZGJscmlnaHQiLAorICAgICJndWlsbGVtb3RyaWdodCIsCisgICAgImVsbGlwc2lzIiwKKyAgICAicGVydGhvdXNhbmQiLAorICAgIE5VTEwsCisgICAgInF1ZXN0aW9uZG93biIsCisgICAgTlVMTCwKKyAgICAiZ3JhdmUiLAorICAgICJhY3V0ZSIsCisgICAgImNpcmN1bWZsZXgiLAorICAgICJ0aWxkZSIsCisgICAgIm1hY3JvbiIsCisgICAgImJyZXZlIiwKKyAgICAiZG90YWNjZW50IiwKKyAgICAiZGllcmVzaXMiLAorICAgIE5VTEwsCisgICAgInJpbmciLAorICAgICJjZWRpbGxhIiwKKyAgICBOVUxMLAorICAgICJodW5nYXJ1bWxhdXQiLAorICAgICJvZ29uZWsiLAorICAgICJjYXJvbiIsCisgICAgImVtZGFzaCIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICAiQUUiLAorICAgIE5VTEwsCisgICAgIm9yZGZlbWluaW5lIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgICJMc2xhc2giLAorICAgICJPc2xhc2giLAorICAgICJPRSIsCisgICAgIm9yZG1hc2N1bGluZSIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgICJhZSIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgImRvdGxlc3NpIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgImxzbGFzaCIsCisgICAgIm9zbGFzaCIsCisgICAgIm9lIiwKKyAgICAiZ2VybWFuZGJscyIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKIH07CiBzdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgQWRvYmVXaW5BbnNpRW5jb2RpbmdOYW1lc1syMjRdID0gewotICAgICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLAotICAgICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLAotICAgICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsCi0gICAgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsCi0gICAgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLAotICAgICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLAotICAgICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLAotICAgICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLAotICAgICJncmF2ZSIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwKLSAgICAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwKLSAgICAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwKLSAgICAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiYnVsbGV0IiwKLSAgICAiRXVybyIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAiZmxvcmluIiwgInF1b3RlZGJsYmFzZSIsICJlbGxpcHNpcyIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwKLSAgICAiY2lyY3VtZmxleCIsICJwZXJ0aG91c2FuZCIsICJTY2Fyb24iLCAiZ3VpbHNpbmdsbGVmdCIsICJPRSIsICJidWxsZXQiLCAiWmNhcm9uIiwgImJ1bGxldCIsCi0gICAgImJ1bGxldCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJidWxsZXQiLCAiZW5kYXNoIiwgImVtZGFzaCIsCi0gICAgInRpbGRlIiwgInRyYWRlbWFyayIsICJzY2Fyb24iLCAiZ3VpbHNpbmdscmlnaHQiLCAib2UiLCAiYnVsbGV0IiwgInpjYXJvbiIsICJZZGllcmVzaXMiLAotICAgICJzcGFjZSIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiY3VycmVuY3kiLCAieWVuIiwgImJyb2tlbmJhciIsICJzZWN0aW9uIiwKLSAgICAiZGllcmVzaXMiLCAiY29weXJpZ2h0IiwgIm9yZGZlbWluaW5lIiwgImd1aWxsZW1vdGxlZnQiLCAibG9naWNhbG5vdCIsICJoeXBoZW4iLCAicmVnaXN0ZXJlZCIsICJtYWNyb24iLAotICAgICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiYWN1dGUiLCAibXUiLCAicGFyYWdyYXBoIiwgInBlcmlvZGNlbnRlcmVkIiwKLSAgICAiY2VkaWxsYSIsICJvbmVzdXBlcmlvciIsICJvcmRtYXNjdWxpbmUiLCAiZ3VpbGxlbW90cmlnaHQiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duIiwKLSAgICAiQWdyYXZlIiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBdGlsZGUiLCAiQWRpZXJlc2lzIiwgIkFyaW5nIiwgIkFFIiwgIkNjZWRpbGxhIiwKLSAgICAiRWdyYXZlIiwgIkVhY3V0ZSIsICJFY2lyY3VtZmxleCIsICJFZGllcmVzaXMiLCAiSWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLAotICAgICJFdGgiLCAiTnRpbGRlIiwgIk9ncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiT3RpbGRlIiwgIk9kaWVyZXNpcyIsICJtdWx0aXBseSIsCi0gICAgIk9zbGFzaCIsICJVZ3JhdmUiLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVkaWVyZXNpcyIsICJZYWN1dGUiLCAiVGhvcm4iLCAiZ2VybWFuZGJscyIsCi0gICAgImFncmF2ZSIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYXRpbGRlIiwgImFkaWVyZXNpcyIsICJhcmluZyIsICJhZSIsICJjY2VkaWxsYSIsCi0gICAgImVncmF2ZSIsICJlYWN1dGUiLCAiZWNpcmN1bWZsZXgiLCAiZWRpZXJlc2lzIiwgImlncmF2ZSIsICJpYWN1dGUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwKLSAgICAiZXRoIiwgIm50aWxkZSIsICJvZ3JhdmUiLCAib2FjdXRlIiwgIm9jaXJjdW1mbGV4IiwgIm90aWxkZSIsICJvZGllcmVzaXMiLCAiZGl2aWRlIiwKLSAgICAib3NsYXNoIiwgInVncmF2ZSIsICJ1YWN1dGUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgInlhY3V0ZSIsICJ0aG9ybiIsICJ5ZGllcmVzaXMiLAorICAgICJzcGFjZSIsCisgICAgImV4Y2xhbSIsCisgICAgInF1b3RlZGJsIiwKKyAgICAibnVtYmVyc2lnbiIsCisgICAgImRvbGxhciIsCisgICAgInBlcmNlbnQiLAorICAgICJhbXBlcnNhbmQiLAorICAgICJxdW90ZXNpbmdsZSIsCisgICAgInBhcmVubGVmdCIsCisgICAgInBhcmVucmlnaHQiLAorICAgICJhc3RlcmlzayIsCisgICAgInBsdXMiLAorICAgICJjb21tYSIsCisgICAgImh5cGhlbiIsCisgICAgInBlcmlvZCIsCisgICAgInNsYXNoIiwKKyAgICAiemVybyIsCisgICAgIm9uZSIsCisgICAgInR3byIsCisgICAgInRocmVlIiwKKyAgICAiZm91ciIsCisgICAgImZpdmUiLAorICAgICJzaXgiLAorICAgICJzZXZlbiIsCisgICAgImVpZ2h0IiwKKyAgICAibmluZSIsCisgICAgImNvbG9uIiwKKyAgICAic2VtaWNvbG9uIiwKKyAgICAibGVzcyIsCisgICAgImVxdWFsIiwKKyAgICAiZ3JlYXRlciIsCisgICAgInF1ZXN0aW9uIiwKKyAgICAiYXQiLAorICAgICJBIiwKKyAgICAiQiIsCisgICAgIkMiLAorICAgICJEIiwKKyAgICAiRSIsCisgICAgIkYiLAorICAgICJHIiwKKyAgICAiSCIsCisgICAgIkkiLAorICAgICJKIiwKKyAgICAiSyIsCisgICAgIkwiLAorICAgICJNIiwKKyAgICAiTiIsCisgICAgIk8iLAorICAgICJQIiwKKyAgICAiUSIsCisgICAgIlIiLAorICAgICJTIiwKKyAgICAiVCIsCisgICAgIlUiLAorICAgICJWIiwKKyAgICAiVyIsCisgICAgIlgiLAorICAgICJZIiwKKyAgICAiWiIsCisgICAgImJyYWNrZXRsZWZ0IiwKKyAgICAiYmFja3NsYXNoIiwKKyAgICAiYnJhY2tldHJpZ2h0IiwKKyAgICAiYXNjaWljaXJjdW0iLAorICAgICJ1bmRlcnNjb3JlIiwKKyAgICAiZ3JhdmUiLAorICAgICJhIiwKKyAgICAiYiIsCisgICAgImMiLAorICAgICJkIiwKKyAgICAiZSIsCisgICAgImYiLAorICAgICJnIiwKKyAgICAiaCIsCisgICAgImkiLAorICAgICJqIiwKKyAgICAiayIsCisgICAgImwiLAorICAgICJtIiwKKyAgICAibiIsCisgICAgIm8iLAorICAgICJwIiwKKyAgICAicSIsCisgICAgInIiLAorICAgICJzIiwKKyAgICAidCIsCisgICAgInUiLAorICAgICJ2IiwKKyAgICAidyIsCisgICAgIngiLAorICAgICJ5IiwKKyAgICAieiIsCisgICAgImJyYWNlbGVmdCIsCisgICAgImJhciIsCisgICAgImJyYWNlcmlnaHQiLAorICAgICJhc2NpaXRpbGRlIiwKKyAgICAiYnVsbGV0IiwKKyAgICAiRXVybyIsCisgICAgImJ1bGxldCIsCisgICAgInF1b3Rlc2luZ2xiYXNlIiwKKyAgICAiZmxvcmluIiwKKyAgICAicXVvdGVkYmxiYXNlIiwKKyAgICAiZWxsaXBzaXMiLAorICAgICJkYWdnZXIiLAorICAgICJkYWdnZXJkYmwiLAorICAgICJjaXJjdW1mbGV4IiwKKyAgICAicGVydGhvdXNhbmQiLAorICAgICJTY2Fyb24iLAorICAgICJndWlsc2luZ2xsZWZ0IiwKKyAgICAiT0UiLAorICAgICJidWxsZXQiLAorICAgICJaY2Fyb24iLAorICAgICJidWxsZXQiLAorICAgICJidWxsZXQiLAorICAgICJxdW90ZWxlZnQiLAorICAgICJxdW90ZXJpZ2h0IiwKKyAgICAicXVvdGVkYmxsZWZ0IiwKKyAgICAicXVvdGVkYmxyaWdodCIsCisgICAgImJ1bGxldCIsCisgICAgImVuZGFzaCIsCisgICAgImVtZGFzaCIsCisgICAgInRpbGRlIiwKKyAgICAidHJhZGVtYXJrIiwKKyAgICAic2Nhcm9uIiwKKyAgICAiZ3VpbHNpbmdscmlnaHQiLAorICAgICJvZSIsCisgICAgImJ1bGxldCIsCisgICAgInpjYXJvbiIsCisgICAgIllkaWVyZXNpcyIsCisgICAgInNwYWNlIiwKKyAgICAiZXhjbGFtZG93biIsCisgICAgImNlbnQiLAorICAgICJzdGVybGluZyIsCisgICAgImN1cnJlbmN5IiwKKyAgICAieWVuIiwKKyAgICAiYnJva2VuYmFyIiwKKyAgICAic2VjdGlvbiIsCisgICAgImRpZXJlc2lzIiwKKyAgICAiY29weXJpZ2h0IiwKKyAgICAib3JkZmVtaW5pbmUiLAorICAgICJndWlsbGVtb3RsZWZ0IiwKKyAgICAibG9naWNhbG5vdCIsCisgICAgImh5cGhlbiIsCisgICAgInJlZ2lzdGVyZWQiLAorICAgICJtYWNyb24iLAorICAgICJkZWdyZWUiLAorICAgICJwbHVzbWludXMiLAorICAgICJ0d29zdXBlcmlvciIsCisgICAgInRocmVlc3VwZXJpb3IiLAorICAgICJhY3V0ZSIsCisgICAgIm11IiwKKyAgICAicGFyYWdyYXBoIiwKKyAgICAicGVyaW9kY2VudGVyZWQiLAorICAgICJjZWRpbGxhIiwKKyAgICAib25lc3VwZXJpb3IiLAorICAgICJvcmRtYXNjdWxpbmUiLAorICAgICJndWlsbGVtb3RyaWdodCIsCisgICAgIm9uZXF1YXJ0ZXIiLAorICAgICJvbmVoYWxmIiwKKyAgICAidGhyZWVxdWFydGVycyIsCisgICAgInF1ZXN0aW9uZG93biIsCisgICAgIkFncmF2ZSIsCisgICAgIkFhY3V0ZSIsCisgICAgIkFjaXJjdW1mbGV4IiwKKyAgICAiQXRpbGRlIiwKKyAgICAiQWRpZXJlc2lzIiwKKyAgICAiQXJpbmciLAorICAgICJBRSIsCisgICAgIkNjZWRpbGxhIiwKKyAgICAiRWdyYXZlIiwKKyAgICAiRWFjdXRlIiwKKyAgICAiRWNpcmN1bWZsZXgiLAorICAgICJFZGllcmVzaXMiLAorICAgICJJZ3JhdmUiLAorICAgICJJYWN1dGUiLAorICAgICJJY2lyY3VtZmxleCIsCisgICAgIklkaWVyZXNpcyIsCisgICAgIkV0aCIsCisgICAgIk50aWxkZSIsCisgICAgIk9ncmF2ZSIsCisgICAgIk9hY3V0ZSIsCisgICAgIk9jaXJjdW1mbGV4IiwKKyAgICAiT3RpbGRlIiwKKyAgICAiT2RpZXJlc2lzIiwKKyAgICAibXVsdGlwbHkiLAorICAgICJPc2xhc2giLAorICAgICJVZ3JhdmUiLAorICAgICJVYWN1dGUiLAorICAgICJVY2lyY3VtZmxleCIsCisgICAgIlVkaWVyZXNpcyIsCisgICAgIllhY3V0ZSIsCisgICAgIlRob3JuIiwKKyAgICAiZ2VybWFuZGJscyIsCisgICAgImFncmF2ZSIsCisgICAgImFhY3V0ZSIsCisgICAgImFjaXJjdW1mbGV4IiwKKyAgICAiYXRpbGRlIiwKKyAgICAiYWRpZXJlc2lzIiwKKyAgICAiYXJpbmciLAorICAgICJhZSIsCisgICAgImNjZWRpbGxhIiwKKyAgICAiZWdyYXZlIiwKKyAgICAiZWFjdXRlIiwKKyAgICAiZWNpcmN1bWZsZXgiLAorICAgICJlZGllcmVzaXMiLAorICAgICJpZ3JhdmUiLAorICAgICJpYWN1dGUiLAorICAgICJpY2lyY3VtZmxleCIsCisgICAgImlkaWVyZXNpcyIsCisgICAgImV0aCIsCisgICAgIm50aWxkZSIsCisgICAgIm9ncmF2ZSIsCisgICAgIm9hY3V0ZSIsCisgICAgIm9jaXJjdW1mbGV4IiwKKyAgICAib3RpbGRlIiwKKyAgICAib2RpZXJlc2lzIiwKKyAgICAiZGl2aWRlIiwKKyAgICAib3NsYXNoIiwKKyAgICAidWdyYXZlIiwKKyAgICAidWFjdXRlIiwKKyAgICAidWNpcmN1bWZsZXgiLAorICAgICJ1ZGllcmVzaXMiLAorICAgICJ5YWN1dGUiLAorICAgICJ0aG9ybiIsCisgICAgInlkaWVyZXNpcyIsCiB9Owogc3RhdGljIGNvbnN0IEZYX0NIQVIqIGNvbnN0IE1hY1JvbWFuRW5jb2RpbmdOYW1lc1syMjRdID0gewotICAgICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLAotICAgICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLAotICAgICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsCi0gICAgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsCi0gICAgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLAotICAgICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLAotICAgICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLAotICAgICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLAotICAgICJncmF2ZSIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwKLSAgICAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwKLSAgICAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwKLSAgICAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCBOVUxMLAotICAgICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIk50aWxkZSIsICJPZGllcmVzaXMiLCAiVWRpZXJlc2lzIiwgImFhY3V0ZSIsCi0gICAgImFncmF2ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYXRpbGRlIiwgImFyaW5nIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlZ3JhdmUiLAotICAgICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiaWFjdXRlIiwgImlncmF2ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAibnRpbGRlIiwgIm9hY3V0ZSIsCi0gICAgIm9ncmF2ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib3RpbGRlIiwgInVhY3V0ZSIsICJ1Z3JhdmUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwKLSAgICAiZGFnZ2VyIiwgImRlZ3JlZSIsICJjZW50IiwgInN0ZXJsaW5nIiwgInNlY3Rpb24iLCAiYnVsbGV0IiwgInBhcmFncmFwaCIsICJnZXJtYW5kYmxzIiwKLSAgICAicmVnaXN0ZXJlZCIsICJjb3B5cmlnaHQiLCAidHJhZGVtYXJrIiwgImFjdXRlIiwgImRpZXJlc2lzIiwgIm5vdGVxdWFsIiwgIkFFIiwgIk9zbGFzaCIsCi0gICAgImluZmluaXR5IiwgInBsdXNtaW51cyIsICJsZXNzZXF1YWwiLCAiZ3JlYXRlcmVxdWFsIiwgInllbiIsICJtdSIsICJwYXJ0aWFsZGlmZiIsICJzdW1tYXRpb24iLAotICAgICJwcm9kdWN0IiwgInBpIiwgImludGVncmFsIiwgIm9yZGZlbWluaW5lIiwgIm9yZG1hc2N1bGluZSIsICJPbWVnYSIsICJhZSIsICJvc2xhc2giLAotICAgICJxdWVzdGlvbmRvd24iLCAiZXhjbGFtZG93biIsICJsb2dpY2Fsbm90IiwgInJhZGljYWwiLCAiZmxvcmluIiwgImFwcHJveGVxdWFsIiwgIkRlbHRhIiwgImd1aWxsZW1vdGxlZnQiLAotICAgICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJzcGFjZSIsICJBZ3JhdmUiLCAiQXRpbGRlIiwgIk90aWxkZSIsICJPRSIsICJvZSIsCi0gICAgImVuZGFzaCIsICJlbWRhc2giLCAicXVvdGVkYmxsZWZ0IiwgInF1b3RlZGJscmlnaHQiLCAicXVvdGVsZWZ0IiwgInF1b3RlcmlnaHQiLCAiZGl2aWRlIiwgImxvemVuZ2UiLAotICAgICJ5ZGllcmVzaXMiLCAiWWRpZXJlc2lzIiwgImZyYWN0aW9uIiwgImN1cnJlbmN5IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLAotICAgICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInBlcnRob3VzYW5kIiwgIkFjaXJjdW1mbGV4IiwgIkVjaXJjdW1mbGV4IiwgIkFhY3V0ZSIsCi0gICAgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsICJJZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwKLSAgICAiYXBwbGUiLCAiT2dyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZ3JhdmUiLCAiZG90bGVzc2kiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsCi0gICAgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLAorICAgICJzcGFjZSIsCisgICAgImV4Y2xhbSIsCisgICAgInF1b3RlZGJsIiwKKyAgICAibnVtYmVyc2lnbiIsCisgICAgImRvbGxhciIsCisgICAgInBlcmNlbnQiLAorICAgICJhbXBlcnNhbmQiLAorICAgICJxdW90ZXNpbmdsZSIsCisgICAgInBhcmVubGVmdCIsCisgICAgInBhcmVucmlnaHQiLAorICAgICJhc3RlcmlzayIsCisgICAgInBsdXMiLAorICAgICJjb21tYSIsCisgICAgImh5cGhlbiIsCisgICAgInBlcmlvZCIsCisgICAgInNsYXNoIiwKKyAgICAiemVybyIsCisgICAgIm9uZSIsCisgICAgInR3byIsCisgICAgInRocmVlIiwKKyAgICAiZm91ciIsCisgICAgImZpdmUiLAorICAgICJzaXgiLAorICAgICJzZXZlbiIsCisgICAgImVpZ2h0IiwKKyAgICAibmluZSIsCisgICAgImNvbG9uIiwKKyAgICAic2VtaWNvbG9uIiwKKyAgICAibGVzcyIsCisgICAgImVxdWFsIiwKKyAgICAiZ3JlYXRlciIsCisgICAgInF1ZXN0aW9uIiwKKyAgICAiYXQiLAorICAgICJBIiwKKyAgICAiQiIsCisgICAgIkMiLAorICAgICJEIiwKKyAgICAiRSIsCisgICAgIkYiLAorICAgICJHIiwKKyAgICAiSCIsCisgICAgIkkiLAorICAgICJKIiwKKyAgICAiSyIsCisgICAgIkwiLAorICAgICJNIiwKKyAgICAiTiIsCisgICAgIk8iLAorICAgICJQIiwKKyAgICAiUSIsCisgICAgIlIiLAorICAgICJTIiwKKyAgICAiVCIsCisgICAgIlUiLAorICAgICJWIiwKKyAgICAiVyIsCisgICAgIlgiLAorICAgICJZIiwKKyAgICAiWiIsCisgICAgImJyYWNrZXRsZWZ0IiwKKyAgICAiYmFja3NsYXNoIiwKKyAgICAiYnJhY2tldHJpZ2h0IiwKKyAgICAiYXNjaWljaXJjdW0iLAorICAgICJ1bmRlcnNjb3JlIiwKKyAgICAiZ3JhdmUiLAorICAgICJhIiwKKyAgICAiYiIsCisgICAgImMiLAorICAgICJkIiwKKyAgICAiZSIsCisgICAgImYiLAorICAgICJnIiwKKyAgICAiaCIsCisgICAgImkiLAorICAgICJqIiwKKyAgICAiayIsCisgICAgImwiLAorICAgICJtIiwKKyAgICAibiIsCisgICAgIm8iLAorICAgICJwIiwKKyAgICAicSIsCisgICAgInIiLAorICAgICJzIiwKKyAgICAidCIsCisgICAgInUiLAorICAgICJ2IiwKKyAgICAidyIsCisgICAgIngiLAorICAgICJ5IiwKKyAgICAieiIsCisgICAgImJyYWNlbGVmdCIsCisgICAgImJhciIsCisgICAgImJyYWNlcmlnaHQiLAorICAgICJhc2NpaXRpbGRlIiwKKyAgICBOVUxMLAorICAgICJBZGllcmVzaXMiLAorICAgICJBcmluZyIsCisgICAgIkNjZWRpbGxhIiwKKyAgICAiRWFjdXRlIiwKKyAgICAiTnRpbGRlIiwKKyAgICAiT2RpZXJlc2lzIiwKKyAgICAiVWRpZXJlc2lzIiwKKyAgICAiYWFjdXRlIiwKKyAgICAiYWdyYXZlIiwKKyAgICAiYWNpcmN1bWZsZXgiLAorICAgICJhZGllcmVzaXMiLAorICAgICJhdGlsZGUiLAorICAgICJhcmluZyIsCisgICAgImNjZWRpbGxhIiwKKyAgICAiZWFjdXRlIiwKKyAgICAiZWdyYXZlIiwKKyAgICAiZWNpcmN1bWZsZXgiLAorICAgICJlZGllcmVzaXMiLAorICAgICJpYWN1dGUiLAorICAgICJpZ3JhdmUiLAorICAgICJpY2lyY3VtZmxleCIsCisgICAgImlkaWVyZXNpcyIsCisgICAgIm50aWxkZSIsCisgICAgIm9hY3V0ZSIsCisgICAgIm9ncmF2ZSIsCisgICAgIm9jaXJjdW1mbGV4IiwKKyAgICAib2RpZXJlc2lzIiwKKyAgICAib3RpbGRlIiwKKyAgICAidWFjdXRlIiwKKyAgICAidWdyYXZlIiwKKyAgICAidWNpcmN1bWZsZXgiLAorICAgICJ1ZGllcmVzaXMiLAorICAgICJkYWdnZXIiLAorICAgICJkZWdyZWUiLAorICAgICJjZW50IiwKKyAgICAic3RlcmxpbmciLAorICAgICJzZWN0aW9uIiwKKyAgICAiYnVsbGV0IiwKKyAgICAicGFyYWdyYXBoIiwKKyAgICAiZ2VybWFuZGJscyIsCisgICAgInJlZ2lzdGVyZWQiLAorICAgICJjb3B5cmlnaHQiLAorICAgICJ0cmFkZW1hcmsiLAorICAgICJhY3V0ZSIsCisgICAgImRpZXJlc2lzIiwKKyAgICAibm90ZXF1YWwiLAorICAgICJBRSIsCisgICAgIk9zbGFzaCIsCisgICAgImluZmluaXR5IiwKKyAgICAicGx1c21pbnVzIiwKKyAgICAibGVzc2VxdWFsIiwKKyAgICAiZ3JlYXRlcmVxdWFsIiwKKyAgICAieWVuIiwKKyAgICAibXUiLAorICAgICJwYXJ0aWFsZGlmZiIsCisgICAgInN1bW1hdGlvbiIsCisgICAgInByb2R1Y3QiLAorICAgICJwaSIsCisgICAgImludGVncmFsIiwKKyAgICAib3JkZmVtaW5pbmUiLAorICAgICJvcmRtYXNjdWxpbmUiLAorICAgICJPbWVnYSIsCisgICAgImFlIiwKKyAgICAib3NsYXNoIiwKKyAgICAicXVlc3Rpb25kb3duIiwKKyAgICAiZXhjbGFtZG93biIsCisgICAgImxvZ2ljYWxub3QiLAorICAgICJyYWRpY2FsIiwKKyAgICAiZmxvcmluIiwKKyAgICAiYXBwcm94ZXF1YWwiLAorICAgICJEZWx0YSIsCisgICAgImd1aWxsZW1vdGxlZnQiLAorICAgICJndWlsbGVtb3RyaWdodCIsCisgICAgImVsbGlwc2lzIiwKKyAgICAic3BhY2UiLAorICAgICJBZ3JhdmUiLAorICAgICJBdGlsZGUiLAorICAgICJPdGlsZGUiLAorICAgICJPRSIsCisgICAgIm9lIiwKKyAgICAiZW5kYXNoIiwKKyAgICAiZW1kYXNoIiwKKyAgICAicXVvdGVkYmxsZWZ0IiwKKyAgICAicXVvdGVkYmxyaWdodCIsCisgICAgInF1b3RlbGVmdCIsCisgICAgInF1b3RlcmlnaHQiLAorICAgICJkaXZpZGUiLAorICAgICJsb3plbmdlIiwKKyAgICAieWRpZXJlc2lzIiwKKyAgICAiWWRpZXJlc2lzIiwKKyAgICAiZnJhY3Rpb24iLAorICAgICJjdXJyZW5jeSIsCisgICAgImd1aWxzaW5nbGxlZnQiLAorICAgICJndWlsc2luZ2xyaWdodCIsCisgICAgImZpIiwKKyAgICAiZmwiLAorICAgICJkYWdnZXJkYmwiLAorICAgICJwZXJpb2RjZW50ZXJlZCIsCisgICAgInF1b3Rlc2luZ2xiYXNlIiwKKyAgICAicXVvdGVkYmxiYXNlIiwKKyAgICAicGVydGhvdXNhbmQiLAorICAgICJBY2lyY3VtZmxleCIsCisgICAgIkVjaXJjdW1mbGV4IiwKKyAgICAiQWFjdXRlIiwKKyAgICAiRWRpZXJlc2lzIiwKKyAgICAiRWdyYXZlIiwKKyAgICAiSWFjdXRlIiwKKyAgICAiSWNpcmN1bWZsZXgiLAorICAgICJJZGllcmVzaXMiLAorICAgICJJZ3JhdmUiLAorICAgICJPYWN1dGUiLAorICAgICJPY2lyY3VtZmxleCIsCisgICAgImFwcGxlIiwKKyAgICAiT2dyYXZlIiwKKyAgICAiVWFjdXRlIiwKKyAgICAiVWNpcmN1bWZsZXgiLAorICAgICJVZ3JhdmUiLAorICAgICJkb3RsZXNzaSIsCisgICAgImNpcmN1bWZsZXgiLAorICAgICJ0aWxkZSIsCisgICAgIm1hY3JvbiIsCisgICAgImJyZXZlIiwKKyAgICAiZG90YWNjZW50IiwKKyAgICAicmluZyIsCisgICAgImNlZGlsbGEiLAorICAgICJodW5nYXJ1bWxhdXQiLAorICAgICJvZ29uZWsiLAorICAgICJjYXJvbiIsCiB9Owogc3RhdGljIGNvbnN0IEZYX0NIQVIqIGNvbnN0IE1hY0V4cGVydEVuY29kaW5nTmFtZXNbMjI0XSA9IHsKLSAgICAic3BhY2UiLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiY2VudG9sZHN0eWxlIiwgImRvbGxhcm9sZHN0eWxlIiwgImRvbGxhcnN1cGVyaW9yIiwgImFtcGVyc2FuZHNtYWxsIiwgIkFjdXRlc21hbGwiLAotICAgICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsCi0gICAgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsCi0gICAgImVpZ2h0b2xkc3R5bGUiLCAibmluZW9sZHN0eWxlIiwgImNvbG9uIiwgInNlbWljb2xvbiIsIE5VTEwsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgTlVMTCwgInF1ZXN0aW9uc21hbGwiLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJFdGhzbWFsbCIsIE5VTEwsIE5VTEwsICJvbmVxdWFydGVyIiwKLSAgICAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgImZmIiwgImZpIiwKLSAgICAiZmwiLCAiZmZpIiwgImZmbCIsICJwYXJlbmxlZnRpbmZlcmlvciIsIE5VTEwsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbmluZmVyaW9yIiwKLSAgICAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLAotICAgICJIc21hbGwiLCAiSXNtYWxsIiwgIkpzbWFsbCIsICJLc21hbGwiLCAiTHNtYWxsIiwgIk1zbWFsbCIsICJOc21hbGwiLCAiT3NtYWxsIiwKLSAgICAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsCi0gICAgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgTlVMTCwKLSAgICBOVUxMLCAiYXN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJBYWN1dGVzbWFsbCIsCi0gICAgIkFncmF2ZXNtYWxsIiwgIkFjaXJjdW1mbGV4c21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXRpbGRlc21hbGwiLCAiQXJpbmdzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwKLSAgICAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsICJJYWN1dGVzbWFsbCIsICJJZ3JhdmVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIk50aWxkZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwKLSAgICAiT2dyYXZlc21hbGwiLCAiT2NpcmN1bWZsZXhzbWFsbCIsICJPZGllcmVzaXNzbWFsbCIsICJPdGlsZGVzbWFsbCIsICJVYWN1dGVzbWFsbCIsICJVZ3JhdmVzbWFsbCIsICJVY2lyY3VtZmxleHNtYWxsIiwgIlVkaWVyZXNpc3NtYWxsIiwKLSAgICBOVUxMLCAiZWlnaHRzdXBlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiU2Nhcm9uc21hbGwiLAotICAgIE5VTEwsICJjZW50aW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCBOVUxMLCAiRGllcmVzaXNzbWFsbCIsIE5VTEwsICJDYXJvbnNtYWxsIiwgIlNjYXJvbnNtYWxsIiwKLSAgICAiZml2ZWluZmVyaW9yIiwgTlVMTCwgImNvbW1haW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiWWFjdXRlc21hbGwiLCBOVUxMLCAiZG9sbGFyaW5mZXJpb3IiLCBOVUxMLAotICAgIE5VTEwsICJUaG9ybnNtYWxsIiwgTlVMTCwgIm5pbmVpbmZlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAiWmNhcm9uc21hbGwiLCAiQUVzbWFsbCIsICJPc2xhc2hzbWFsbCIsCi0gICAgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWluZmVyaW9yIiwgImFzdXBlcmlvciIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgIkNlZGlsbGFzbWFsbCIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJPRXNtYWxsIiwKLSAgICAiZmlndXJlZGFzaCIsICJoeXBoZW5zdXBlcmlvciIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJleGNsYW1kb3duc21hbGwiLCBOVUxMLAotICAgICJZZGllcmVzaXNzbWFsbCIsIE5VTEwsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLAotICAgICJzZXZlbnN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvc3VwZXJpb3IiLCBOVUxMLCAiZXN1cGVyaW9yIiwgInJzdXBlcmlvciIsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgImlzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCAibHN1cGVyaW9yIiwgIk9nb25la3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiTWFjcm9uc21hbGwiLCAiYnN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJtc3VwZXJpb3IiLAotICAgICJjb21tYXN1cGVyaW9yIiwgInBlcmlvZHN1cGVyaW9yIiwgIkRvdGFjY2VudHNtYWxsIiwgIlJpbmdzbWFsbCIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgInNwYWNlIiwKKyAgICAiZXhjbGFtc21hbGwiLAorICAgICJIdW5nYXJ1bWxhdXRzbWFsbCIsCisgICAgImNlbnRvbGRzdHlsZSIsCisgICAgImRvbGxhcm9sZHN0eWxlIiwKKyAgICAiZG9sbGFyc3VwZXJpb3IiLAorICAgICJhbXBlcnNhbmRzbWFsbCIsCisgICAgIkFjdXRlc21hbGwiLAorICAgICJwYXJlbmxlZnRzdXBlcmlvciIsCisgICAgInBhcmVucmlnaHRzdXBlcmlvciIsCisgICAgInR3b2RvdGVubGVhZGVyIiwKKyAgICAib25lZG90ZW5sZWFkZXIiLAorICAgICJjb21tYSIsCisgICAgImh5cGhlbiIsCisgICAgInBlcmlvZCIsCisgICAgImZyYWN0aW9uIiwKKyAgICAiemVyb29sZHN0eWxlIiwKKyAgICAib25lb2xkc3R5bGUiLAorICAgICJ0d29vbGRzdHlsZSIsCisgICAgInRocmVlb2xkc3R5bGUiLAorICAgICJmb3Vyb2xkc3R5bGUiLAorICAgICJmaXZlb2xkc3R5bGUiLAorICAgICJzaXhvbGRzdHlsZSIsCisgICAgInNldmVub2xkc3R5bGUiLAorICAgICJlaWdodG9sZHN0eWxlIiwKKyAgICAibmluZW9sZHN0eWxlIiwKKyAgICAiY29sb24iLAorICAgICJzZW1pY29sb24iLAorICAgIE5VTEwsCisgICAgInRocmVlcXVhcnRlcnNlbWRhc2giLAorICAgIE5VTEwsCisgICAgInF1ZXN0aW9uc21hbGwiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgIkV0aHNtYWxsIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgIm9uZXF1YXJ0ZXIiLAorICAgICJvbmVoYWxmIiwKKyAgICAidGhyZWVxdWFydGVycyIsCisgICAgIm9uZWVpZ2h0aCIsCisgICAgInRocmVlZWlnaHRocyIsCisgICAgImZpdmVlaWdodGhzIiwKKyAgICAic2V2ZW5laWdodGhzIiwKKyAgICAib25ldGhpcmQiLAorICAgICJ0d290aGlyZHMiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgICJmZiIsCisgICAgImZpIiwKKyAgICAiZmwiLAorICAgICJmZmkiLAorICAgICJmZmwiLAorICAgICJwYXJlbmxlZnRpbmZlcmlvciIsCisgICAgTlVMTCwKKyAgICAicGFyZW5yaWdodGluZmVyaW9yIiwKKyAgICAiQ2lyY3VtZmxleHNtYWxsIiwKKyAgICAiaHlwaGVuaW5mZXJpb3IiLAorICAgICJHcmF2ZXNtYWxsIiwKKyAgICAiQXNtYWxsIiwKKyAgICAiQnNtYWxsIiwKKyAgICAiQ3NtYWxsIiwKKyAgICAiRHNtYWxsIiwKKyAgICAiRXNtYWxsIiwKKyAgICAiRnNtYWxsIiwKKyAgICAiR3NtYWxsIiwKKyAgICAiSHNtYWxsIiwKKyAgICAiSXNtYWxsIiwKKyAgICAiSnNtYWxsIiwKKyAgICAiS3NtYWxsIiwKKyAgICAiTHNtYWxsIiwKKyAgICAiTXNtYWxsIiwKKyAgICAiTnNtYWxsIiwKKyAgICAiT3NtYWxsIiwKKyAgICAiUHNtYWxsIiwKKyAgICAiUXNtYWxsIiwKKyAgICAiUnNtYWxsIiwKKyAgICAiU3NtYWxsIiwKKyAgICAiVHNtYWxsIiwKKyAgICAiVXNtYWxsIiwKKyAgICAiVnNtYWxsIiwKKyAgICAiV3NtYWxsIiwKKyAgICAiWHNtYWxsIiwKKyAgICAiWXNtYWxsIiwKKyAgICAiWnNtYWxsIiwKKyAgICAiY29sb25tb25ldGFyeSIsCisgICAgIm9uZWZpdHRlZCIsCisgICAgInJ1cGlhaCIsCisgICAgIlRpbGRlc21hbGwiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICAiYXN1cGVyaW9yIiwKKyAgICAiY2VudHN1cGVyaW9yIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgICJBYWN1dGVzbWFsbCIsCisgICAgIkFncmF2ZXNtYWxsIiwKKyAgICAiQWNpcmN1bWZsZXhzbWFsbCIsCisgICAgIkFkaWVyZXNpc3NtYWxsIiwKKyAgICAiQXRpbGRlc21hbGwiLAorICAgICJBcmluZ3NtYWxsIiwKKyAgICAiQ2NlZGlsbGFzbWFsbCIsCisgICAgIkVhY3V0ZXNtYWxsIiwKKyAgICAiRWdyYXZlc21hbGwiLAorICAgICJFY2lyY3VtZmxleHNtYWxsIiwKKyAgICAiRWRpZXJlc2lzc21hbGwiLAorICAgICJJYWN1dGVzbWFsbCIsCisgICAgIklncmF2ZXNtYWxsIiwKKyAgICAiSWNpcmN1bWZsZXhzbWFsbCIsCisgICAgIklkaWVyZXNpc3NtYWxsIiwKKyAgICAiTnRpbGRlc21hbGwiLAorICAgICJPYWN1dGVzbWFsbCIsCisgICAgIk9ncmF2ZXNtYWxsIiwKKyAgICAiT2NpcmN1bWZsZXhzbWFsbCIsCisgICAgIk9kaWVyZXNpc3NtYWxsIiwKKyAgICAiT3RpbGRlc21hbGwiLAorICAgICJVYWN1dGVzbWFsbCIsCisgICAgIlVncmF2ZXNtYWxsIiwKKyAgICAiVWNpcmN1bWZsZXhzbWFsbCIsCisgICAgIlVkaWVyZXNpc3NtYWxsIiwKKyAgICBOVUxMLAorICAgICJlaWdodHN1cGVyaW9yIiwKKyAgICAiZm91cmluZmVyaW9yIiwKKyAgICAidGhyZWVpbmZlcmlvciIsCisgICAgInNpeGluZmVyaW9yIiwKKyAgICAiZWlnaHRpbmZlcmlvciIsCisgICAgInNldmVuaW5mZXJpb3IiLAorICAgICJTY2Fyb25zbWFsbCIsCisgICAgTlVMTCwKKyAgICAiY2VudGluZmVyaW9yIiwKKyAgICAidHdvaW5mZXJpb3IiLAorICAgIE5VTEwsCisgICAgIkRpZXJlc2lzc21hbGwiLAorICAgIE5VTEwsCisgICAgIkNhcm9uc21hbGwiLAorICAgICJTY2Fyb25zbWFsbCIsCisgICAgImZpdmVpbmZlcmlvciIsCisgICAgTlVMTCwKKyAgICAiY29tbWFpbmZlcmlvciIsCisgICAgInBlcmlvZGluZmVyaW9yIiwKKyAgICAiWWFjdXRlc21hbGwiLAorICAgIE5VTEwsCisgICAgImRvbGxhcmluZmVyaW9yIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgIlRob3Juc21hbGwiLAorICAgIE5VTEwsCisgICAgIm5pbmVpbmZlcmlvciIsCisgICAgInplcm9pbmZlcmlvciIsCisgICAgIlpjYXJvbnNtYWxsIiwKKyAgICAiQUVzbWFsbCIsCisgICAgIk9zbGFzaHNtYWxsIiwKKyAgICAicXVlc3Rpb25kb3duc21hbGwiLAorICAgICJvbmVpbmZlcmlvciIsCisgICAgImFzdXBlcmlvciIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgIkNlZGlsbGFzbWFsbCIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgICJPRXNtYWxsIiwKKyAgICAiZmlndXJlZGFzaCIsCisgICAgImh5cGhlbnN1cGVyaW9yIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgICJleGNsYW1kb3duc21hbGwiLAorICAgIE5VTEwsCisgICAgIllkaWVyZXNpc3NtYWxsIiwKKyAgICBOVUxMLAorICAgICJvbmVzdXBlcmlvciIsCisgICAgInR3b3N1cGVyaW9yIiwKKyAgICAidGhyZWVzdXBlcmlvciIsCisgICAgImZvdXJzdXBlcmlvciIsCisgICAgImZpdmVzdXBlcmlvciIsCisgICAgInNpeHN1cGVyaW9yIiwKKyAgICAic2V2ZW5zdXBlcmlvciIsCisgICAgIm5pbmVzdXBlcmlvciIsCisgICAgInplcm9zdXBlcmlvciIsCisgICAgTlVMTCwKKyAgICAiZXN1cGVyaW9yIiwKKyAgICAicnN1cGVyaW9yIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICAiaXN1cGVyaW9yIiwKKyAgICAic3N1cGVyaW9yIiwKKyAgICAiZHN1cGVyaW9yIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgImxzdXBlcmlvciIsCisgICAgIk9nb25la3NtYWxsIiwKKyAgICAiQnJldmVzbWFsbCIsCisgICAgIk1hY3JvbnNtYWxsIiwKKyAgICAiYnN1cGVyaW9yIiwKKyAgICAibnN1cGVyaW9yIiwKKyAgICAibXN1cGVyaW9yIiwKKyAgICAiY29tbWFzdXBlcmlvciIsCisgICAgInBlcmlvZHN1cGVyaW9yIiwKKyAgICAiRG90YWNjZW50c21hbGwiLAorICAgICJSaW5nc21hbGwiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCiB9Owogc3RhdGljIGNvbnN0IEZYX0NIQVIqIGNvbnN0IFBERkRvY0VuY29kaW5nTmFtZXNbMjMyXSA9IHsKLSAgICAiYnJldmUiLCAiY2Fyb24iLCAiY2lyY3VtZmxleCIsICJkb3RhY2NlbnQiLCAiaHVuZ2FydW1sYXV0IiwgIm9nb25layIsICJyaW5nIiwgInRpbGRlIiwKLSAgICAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3Rlc2luZ2xlIiwKLSAgICAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwKLSAgICAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLAotICAgICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLAotICAgICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwKLSAgICAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwKLSAgICAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwKLSAgICAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwKLSAgICAiZ3JhdmUiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsCi0gICAgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsCi0gICAgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsCi0gICAgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgTlVMTCwKLSAgICAiYnVsbGV0MyIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgImVsbGlwc2lzIiwgImVtZGFzaCIsICJlbmRhc2giLCAiZmxvcmluIiwgImZyYWN0aW9uIiwKLSAgICAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJtaW51cyIsICJwZXJ0aG91c2FuZCIsICJxdW90ZWRibGJhc2UiLCAicXVvdGVkYmxsZWZ0IiwgInF1b3RlZGJscmlnaHQiLCAicXVvdGVsZWZ0IiwKLSAgICAicXVvdGVyaWdodCIsICJxdW90ZXNpbmdsYmFzZSIsICJ0cmFkZW1hcmsiLCAiZmkiLCAiZmwiLCAiTHNsYXNoIiwgIk9FIiwgIlNjYXJvbiIsCi0gICAgIllkaWVyZXNpcyIsICJaY2Fyb24yIiwgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvZSIsICJzY2Fyb24iLCAiemNhcm9uMiIsIE5VTEwsCi0gICAgIkV1cm8iLCAiZXhjbGFtZG93biIsICJjZW50IiwgInN0ZXJsaW5nIiwgImN1cnJlbmN5IiwgInllbiIsICJicm9rZW5iYXIiLCAic2VjdGlvbiIsCi0gICAgImRpZXJlc2lzIiwgImNvcHlyaWdodCIsICJvcmRmZW1pbmluZSIsICJndWlsbGVtb3RsZWZ0NCIsICJsb2dpY2Fsbm90IiwgTlVMTCwgInJlZ2lzdGVyZWQiLCAibWFjcm9uIiwKLSAgICAiZGVncmVlIiwgInBsdXNtaW51cyIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImFjdXRlIiwgIm11IiwgInBhcmFncmFwaCIsICJwZXJpb2RjZW50ZXJlZCIsCi0gICAgImNlZGlsbGEiLCAib25lc3VwZXJpb3IiLCAib3JkbWFzY3VsaW5lIiwgImd1aWxsZW1vdHJpZ2h0NCIsICJvbmVxdWFydGVyIiwgIm9uZWhhbGYiLCAidGhyZWVxdWFydGVycyIsICJxdWVzdGlvbmRvd24iLAotICAgICJBZ3JhdmUiLCAiQWFjdXRlIiwgIkFjaXJjdW1mbGV4IiwgIkF0aWxkZSIsICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQUUiLCAiQ2NlZGlsbGEiLAotICAgICJFZ3JhdmUiLCAiRWFjdXRlIiwgIkVjaXJjdW1mbGV4IiwgIkVkaWVyZXNpcyIsICJJZ3JhdmUiLCAiSWFjdXRlIiwgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsCi0gICAgIkV0aCIsICJOdGlsZGUiLCAiT2dyYXZlIiwgIk9hY3V0ZSIsICJPY2lyY3VtZmxleCIsICJPdGlsZGUiLCAiT2RpZXJlc2lzIiwgIm11bHRpcGx5IiwKLSAgICAiT3NsYXNoIiwgIlVncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIllhY3V0ZSIsICJUaG9ybiIsICJnZXJtYW5kYmxzIiwKLSAgICAiYWdyYXZlIiwgImFhY3V0ZSIsICJhY2lyY3VtZmxleCIsICJhdGlsZGUiLCAiYWRpZXJlc2lzIiwgImFyaW5nIiwgImFlIiwgImNjZWRpbGxhIiwKLSAgICAiZWdyYXZlIiwgImVhY3V0ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiaWdyYXZlIiwgImlhY3V0ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLAotICAgICJldGgiLCAibnRpbGRlIiwgIm9ncmF2ZSIsICJvYWN1dGUiLCAib2NpcmN1bWZsZXgiLCAib3RpbGRlIiwgIm9kaWVyZXNpcyIsICJkaXZpZGUiLAotICAgICJvc2xhc2giLCAidWdyYXZlIiwgInVhY3V0ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAieWFjdXRlIiwgInRob3JuIiwgInlkaWVyZXNpcyIsCisgICAgImJyZXZlIiwKKyAgICAiY2Fyb24iLAorICAgICJjaXJjdW1mbGV4IiwKKyAgICAiZG90YWNjZW50IiwKKyAgICAiaHVuZ2FydW1sYXV0IiwKKyAgICAib2dvbmVrIiwKKyAgICAicmluZyIsCisgICAgInRpbGRlIiwKKyAgICAic3BhY2UiLAorICAgICJleGNsYW0iLAorICAgICJxdW90ZWRibCIsCisgICAgIm51bWJlcnNpZ24iLAorICAgICJkb2xsYXIiLAorICAgICJwZXJjZW50IiwKKyAgICAiYW1wZXJzYW5kIiwKKyAgICAicXVvdGVzaW5nbGUiLAorICAgICJwYXJlbmxlZnQiLAorICAgICJwYXJlbnJpZ2h0IiwKKyAgICAiYXN0ZXJpc2siLAorICAgICJwbHVzIiwKKyAgICAiY29tbWEiLAorICAgICJoeXBoZW4iLAorICAgICJwZXJpb2QiLAorICAgICJzbGFzaCIsCisgICAgInplcm8iLAorICAgICJvbmUiLAorICAgICJ0d28iLAorICAgICJ0aHJlZSIsCisgICAgImZvdXIiLAorICAgICJmaXZlIiwKKyAgICAic2l4IiwKKyAgICAic2V2ZW4iLAorICAgICJlaWdodCIsCisgICAgIm5pbmUiLAorICAgICJjb2xvbiIsCisgICAgInNlbWljb2xvbiIsCisgICAgImxlc3MiLAorICAgICJlcXVhbCIsCisgICAgImdyZWF0ZXIiLAorICAgICJxdWVzdGlvbiIsCisgICAgImF0IiwKKyAgICAiQSIsCisgICAgIkIiLAorICAgICJDIiwKKyAgICAiRCIsCisgICAgIkUiLAorICAgICJGIiwKKyAgICAiRyIsCisgICAgIkgiLAorICAgICJJIiwKKyAgICAiSiIsCisgICAgIksiLAorICAgICJMIiwKKyAgICAiTSIsCisgICAgIk4iLAorICAgICJPIiwKKyAgICAiUCIsCisgICAgIlEiLAorICAgICJSIiwKKyAgICAiUyIsCisgICAgIlQiLAorICAgICJVIiwKKyAgICAiViIsCisgICAgIlciLAorICAgICJYIiwKKyAgICAiWSIsCisgICAgIloiLAorICAgICJicmFja2V0bGVmdCIsCisgICAgImJhY2tzbGFzaCIsCisgICAgImJyYWNrZXRyaWdodCIsCisgICAgImFzY2lpY2lyY3VtIiwKKyAgICAidW5kZXJzY29yZSIsCisgICAgImdyYXZlIiwKKyAgICAiYSIsCisgICAgImIiLAorICAgICJjIiwKKyAgICAiZCIsCisgICAgImUiLAorICAgICJmIiwKKyAgICAiZyIsCisgICAgImgiLAorICAgICJpIiwKKyAgICAiaiIsCisgICAgImsiLAorICAgICJsIiwKKyAgICAibSIsCisgICAgIm4iLAorICAgICJvIiwKKyAgICAicCIsCisgICAgInEiLAorICAgICJyIiwKKyAgICAicyIsCisgICAgInQiLAorICAgICJ1IiwKKyAgICAidiIsCisgICAgInciLAorICAgICJ4IiwKKyAgICAieSIsCisgICAgInoiLAorICAgICJicmFjZWxlZnQiLAorICAgICJiYXIiLAorICAgICJicmFjZXJpZ2h0IiwKKyAgICAiYXNjaWl0aWxkZSIsCisgICAgTlVMTCwKKyAgICAiYnVsbGV0MyIsCisgICAgImRhZ2dlciIsCisgICAgImRhZ2dlcmRibCIsCisgICAgImVsbGlwc2lzIiwKKyAgICAiZW1kYXNoIiwKKyAgICAiZW5kYXNoIiwKKyAgICAiZmxvcmluIiwKKyAgICAiZnJhY3Rpb24iLAorICAgICJndWlsc2luZ2xsZWZ0IiwKKyAgICAiZ3VpbHNpbmdscmlnaHQiLAorICAgICJtaW51cyIsCisgICAgInBlcnRob3VzYW5kIiwKKyAgICAicXVvdGVkYmxiYXNlIiwKKyAgICAicXVvdGVkYmxsZWZ0IiwKKyAgICAicXVvdGVkYmxyaWdodCIsCisgICAgInF1b3RlbGVmdCIsCisgICAgInF1b3RlcmlnaHQiLAorICAgICJxdW90ZXNpbmdsYmFzZSIsCisgICAgInRyYWRlbWFyayIsCisgICAgImZpIiwKKyAgICAiZmwiLAorICAgICJMc2xhc2giLAorICAgICJPRSIsCisgICAgIlNjYXJvbiIsCisgICAgIllkaWVyZXNpcyIsCisgICAgIlpjYXJvbjIiLAorICAgICJkb3RsZXNzaSIsCisgICAgImxzbGFzaCIsCisgICAgIm9lIiwKKyAgICAic2Nhcm9uIiwKKyAgICAiemNhcm9uMiIsCisgICAgTlVMTCwKKyAgICAiRXVybyIsCisgICAgImV4Y2xhbWRvd24iLAorICAgICJjZW50IiwKKyAgICAic3RlcmxpbmciLAorICAgICJjdXJyZW5jeSIsCisgICAgInllbiIsCisgICAgImJyb2tlbmJhciIsCisgICAgInNlY3Rpb24iLAorICAgICJkaWVyZXNpcyIsCisgICAgImNvcHlyaWdodCIsCisgICAgIm9yZGZlbWluaW5lIiwKKyAgICAiZ3VpbGxlbW90bGVmdDQiLAorICAgICJsb2dpY2Fsbm90IiwKKyAgICBOVUxMLAorICAgICJyZWdpc3RlcmVkIiwKKyAgICAibWFjcm9uIiwKKyAgICAiZGVncmVlIiwKKyAgICAicGx1c21pbnVzIiwKKyAgICAidHdvc3VwZXJpb3IiLAorICAgICJ0aHJlZXN1cGVyaW9yIiwKKyAgICAiYWN1dGUiLAorICAgICJtdSIsCisgICAgInBhcmFncmFwaCIsCisgICAgInBlcmlvZGNlbnRlcmVkIiwKKyAgICAiY2VkaWxsYSIsCisgICAgIm9uZXN1cGVyaW9yIiwKKyAgICAib3JkbWFzY3VsaW5lIiwKKyAgICAiZ3VpbGxlbW90cmlnaHQ0IiwKKyAgICAib25lcXVhcnRlciIsCisgICAgIm9uZWhhbGYiLAorICAgICJ0aHJlZXF1YXJ0ZXJzIiwKKyAgICAicXVlc3Rpb25kb3duIiwKKyAgICAiQWdyYXZlIiwKKyAgICAiQWFjdXRlIiwKKyAgICAiQWNpcmN1bWZsZXgiLAorICAgICJBdGlsZGUiLAorICAgICJBZGllcmVzaXMiLAorICAgICJBcmluZyIsCisgICAgIkFFIiwKKyAgICAiQ2NlZGlsbGEiLAorICAgICJFZ3JhdmUiLAorICAgICJFYWN1dGUiLAorICAgICJFY2lyY3VtZmxleCIsCisgICAgIkVkaWVyZXNpcyIsCisgICAgIklncmF2ZSIsCisgICAgIklhY3V0ZSIsCisgICAgIkljaXJjdW1mbGV4IiwKKyAgICAiSWRpZXJlc2lzIiwKKyAgICAiRXRoIiwKKyAgICAiTnRpbGRlIiwKKyAgICAiT2dyYXZlIiwKKyAgICAiT2FjdXRlIiwKKyAgICAiT2NpcmN1bWZsZXgiLAorICAgICJPdGlsZGUiLAorICAgICJPZGllcmVzaXMiLAorICAgICJtdWx0aXBseSIsCisgICAgIk9zbGFzaCIsCisgICAgIlVncmF2ZSIsCisgICAgIlVhY3V0ZSIsCisgICAgIlVjaXJjdW1mbGV4IiwKKyAgICAiVWRpZXJlc2lzIiwKKyAgICAiWWFjdXRlIiwKKyAgICAiVGhvcm4iLAorICAgICJnZXJtYW5kYmxzIiwKKyAgICAiYWdyYXZlIiwKKyAgICAiYWFjdXRlIiwKKyAgICAiYWNpcmN1bWZsZXgiLAorICAgICJhdGlsZGUiLAorICAgICJhZGllcmVzaXMiLAorICAgICJhcmluZyIsCisgICAgImFlIiwKKyAgICAiY2NlZGlsbGEiLAorICAgICJlZ3JhdmUiLAorICAgICJlYWN1dGUiLAorICAgICJlY2lyY3VtZmxleCIsCisgICAgImVkaWVyZXNpcyIsCisgICAgImlncmF2ZSIsCisgICAgImlhY3V0ZSIsCisgICAgImljaXJjdW1mbGV4IiwKKyAgICAiaWRpZXJlc2lzIiwKKyAgICAiZXRoIiwKKyAgICAibnRpbGRlIiwKKyAgICAib2dyYXZlIiwKKyAgICAib2FjdXRlIiwKKyAgICAib2NpcmN1bWZsZXgiLAorICAgICJvdGlsZGUiLAorICAgICJvZGllcmVzaXMiLAorICAgICJkaXZpZGUiLAorICAgICJvc2xhc2giLAorICAgICJ1Z3JhdmUiLAorICAgICJ1YWN1dGUiLAorICAgICJ1Y2lyY3VtZmxleCIsCisgICAgInVkaWVyZXNpcyIsCisgICAgInlhY3V0ZSIsCisgICAgInRob3JuIiwKKyAgICAieWRpZXJlc2lzIiwKIH07CiBzdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgQWRvYmVTeW1ib2xFbmNvZGluZ05hbWVzWzIyNF0gPSB7Ci0gICAgInNwYWNlIiwgImV4Y2xhbSIsICJ1bml2ZXJzYWwiLCAibnVtYmVyc2lnbiIsICJleGlzdGVudGlhbCIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJzdWNodGhhdCIsCi0gICAgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrbWF0aCIsICJwbHVzIiwgImNvbW1hIiwgIm1pbnVzIiwgInBlcmlvZCIsICJzbGFzaCIsCi0gICAgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwKLSAgICAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwKLSAgICAiY29uZ3J1ZW50IiwgIkFscGhhIiwgIkJldGEiLCAiQ2hpIiwgIkRlbHRhIiwgIkVwc2lsb24iLCAiUGhpIiwgIkdhbW1hIiwKLSAgICAiRXRhIiwgIklvdGEiLCAidGhldGExIiwgIkthcHBhIiwgIkxhbWJkYSIsICJNdSIsICJOdSIsICJPbWljcm9uIiwKLSAgICAiUGkiLCAiVGhldGEiLCAiUmhvIiwgIlNpZ21hIiwgIlRhdSIsICJVcHNpbG9uIiwgInNpZ21hMSIsICJPbWVnYSIsCi0gICAgIlhpIiwgIlBzaSIsICJaZXRhIiwgImJyYWNrZXRsZWZ0IiwgInRoZXJlZm9yZSIsICJicmFja2V0cmlnaHQiLCAicGVycGVuZGljdWxhciIsICJ1bmRlcnNjb3JlIiwKLSAgICAicmFkaWNhbGV4IiwgImFscGhhIiwgImJldGEiLCAiY2hpIiwgImRlbHRhIiwgImVwc2lsb24iLCAicGhpIiwgImdhbW1hIiwKLSAgICAiZXRhIiwgImlvdGEiLCAicGhpMSIsICJrYXBwYSIsICJsYW1iZGEiLCAibXUiLCAibnUiLCAib21pY3JvbiIsCi0gICAgInBpIiwgInRoZXRhIiwgInJobyIsICJzaWdtYSIsICJ0YXUiLCAidXBzaWxvbiIsICJvbWVnYTEiLCAib21lZ2EiLAotICAgICJ4aSIsICJwc2kiLCAiemV0YSIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAic2ltaWxhciIsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAiRXVybyIsICJVcHNpbG9uMSIsICJtaW51dGUiLCAibGVzc2VxdWFsIiwgImZyYWN0aW9uIiwgImluZmluaXR5IiwgImZsb3JpbiIsICJjbHViIiwKLSAgICAiZGlhbW9uZCIsICJoZWFydCIsICJzcGFkZSIsICJhcnJvd2JvdGgiLCAiYXJyb3dsZWZ0IiwgImFycm93dXAiLCAiYXJyb3dyaWdodCIsICJhcnJvd2Rvd24iLAotICAgICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInNlY29uZCIsICJncmVhdGVyZXF1YWwiLCAibXVsdGlwbHkiLCAicHJvcG9ydGlvbmFsIiwgInBhcnRpYWxkaWZmIiwgImJ1bGxldCIsCi0gICAgImRpdmlkZSIsICJub3RlcXVhbCIsICJlcXVpdmFsZW5jZSIsICJhcHByb3hlcXVhbCIsICJlbGxpcHNpcyIsICJhcnJvd3ZlcnRleCIsICJhcnJvd2hvcml6ZXgiLCAiY2FycmlhZ2VyZXR1cm4iLAotICAgICJhbGVwaCIsICJJZnJha3R1ciIsICJSZnJha3R1ciIsICJ3ZWllcnN0cmFzcyIsICJjaXJjbGVtdWx0aXBseSIsICJjaXJjbGVwbHVzIiwgImVtcHR5c2V0IiwgImludGVyc2VjdGlvbiIsCi0gICAgInVuaW9uIiwgInByb3BlcnN1cGVyc2V0IiwgInJlZmxleHN1cGVyc2V0IiwgIm5vdHN1YnNldCIsICJwcm9wZXJzdWJzZXQiLCAicmVmbGV4c3Vic2V0IiwgImVsZW1lbnQiLCAibm90ZWxlbWVudCIsCi0gICAgImFuZ2xlIiwgImdyYWRpZW50IiwgInJlZ2lzdGVyc2VyaWYiLCAiY29weXJpZ2h0c2VyaWYiLCAidHJhZGVtYXJrc2VyaWYiLCAicHJvZHVjdCIsICJyYWRpY2FsIiwgImRvdG1hdGgiLAotICAgICJsb2dpY2Fsbm90IiwgImxvZ2ljYWxhbmQiLCAibG9naWNhbG9yIiwgImFycm93ZGJsYm90aCIsICJhcnJvd2RibGxlZnQiLCAiYXJyb3dkYmx1cCIsICJhcnJvd2RibHJpZ2h0IiwgImFycm93ZGJsZG93biIsCi0gICAgImxvemVuZ2UiLCAiYW5nbGVsZWZ0IiwgInJlZ2lzdGVyc2FucyIsICJjb3B5cmlnaHRzYW5zIiwgInRyYWRlbWFya3NhbnMiLCAic3VtbWF0aW9uIiwgInBhcmVubGVmdHRwIiwgInBhcmVubGVmdGV4IiwKLSAgICAicGFyZW5sZWZ0YnQiLCAiYnJhY2tldGxlZnR0cCIsICJicmFja2V0bGVmdGV4IiwgImJyYWNrZXRsZWZ0YnQiLCAiYnJhY2VsZWZ0dHAiLCAiYnJhY2VsZWZ0bWlkIiwgImJyYWNlbGVmdGJ0IiwgImJyYWNlZXgiLAotICAgIE5VTEwsICJhbmdsZXJpZ2h0IiwgImludGVncmFsIiwgImludGVncmFsdHAiLCAiaW50ZWdyYWxleCIsICJpbnRlZ3JhbGJ0IiwgInBhcmVucmlnaHR0cCIsICJwYXJlbnJpZ2h0ZXgiLAotICAgICJwYXJlbnJpZ2h0YnQiLCAiYnJhY2tldHJpZ2h0dHAiLCAiYnJhY2tldHJpZ2h0ZXgiLCAiYnJhY2tldHJpZ2h0YnQiLCAiYnJhY2VyaWdodHRwIiwgImJyYWNlcmlnaHRtaWQiLCAiYnJhY2VyaWdodGJ0IiwgTlVMTCwKKyAgICAic3BhY2UiLAorICAgICJleGNsYW0iLAorICAgICJ1bml2ZXJzYWwiLAorICAgICJudW1iZXJzaWduIiwKKyAgICAiZXhpc3RlbnRpYWwiLAorICAgICJwZXJjZW50IiwKKyAgICAiYW1wZXJzYW5kIiwKKyAgICAic3VjaHRoYXQiLAorICAgICJwYXJlbmxlZnQiLAorICAgICJwYXJlbnJpZ2h0IiwKKyAgICAiYXN0ZXJpc2ttYXRoIiwKKyAgICAicGx1cyIsCisgICAgImNvbW1hIiwKKyAgICAibWludXMiLAorICAgICJwZXJpb2QiLAorICAgICJzbGFzaCIsCisgICAgInplcm8iLAorICAgICJvbmUiLAorICAgICJ0d28iLAorICAgICJ0aHJlZSIsCisgICAgImZvdXIiLAorICAgICJmaXZlIiwKKyAgICAic2l4IiwKKyAgICAic2V2ZW4iLAorICAgICJlaWdodCIsCisgICAgIm5pbmUiLAorICAgICJjb2xvbiIsCisgICAgInNlbWljb2xvbiIsCisgICAgImxlc3MiLAorICAgICJlcXVhbCIsCisgICAgImdyZWF0ZXIiLAorICAgICJxdWVzdGlvbiIsCisgICAgImNvbmdydWVudCIsCisgICAgIkFscGhhIiwKKyAgICAiQmV0YSIsCisgICAgIkNoaSIsCisgICAgIkRlbHRhIiwKKyAgICAiRXBzaWxvbiIsCisgICAgIlBoaSIsCisgICAgIkdhbW1hIiwKKyAgICAiRXRhIiwKKyAgICAiSW90YSIsCisgICAgInRoZXRhMSIsCisgICAgIkthcHBhIiwKKyAgICAiTGFtYmRhIiwKKyAgICAiTXUiLAorICAgICJOdSIsCisgICAgIk9taWNyb24iLAorICAgICJQaSIsCisgICAgIlRoZXRhIiwKKyAgICAiUmhvIiwKKyAgICAiU2lnbWEiLAorICAgICJUYXUiLAorICAgICJVcHNpbG9uIiwKKyAgICAic2lnbWExIiwKKyAgICAiT21lZ2EiLAorICAgICJYaSIsCisgICAgIlBzaSIsCisgICAgIlpldGEiLAorICAgICJicmFja2V0bGVmdCIsCisgICAgInRoZXJlZm9yZSIsCisgICAgImJyYWNrZXRyaWdodCIsCisgICAgInBlcnBlbmRpY3VsYXIiLAorICAgICJ1bmRlcnNjb3JlIiwKKyAgICAicmFkaWNhbGV4IiwKKyAgICAiYWxwaGEiLAorICAgICJiZXRhIiwKKyAgICAiY2hpIiwKKyAgICAiZGVsdGEiLAorICAgICJlcHNpbG9uIiwKKyAgICAicGhpIiwKKyAgICAiZ2FtbWEiLAorICAgICJldGEiLAorICAgICJpb3RhIiwKKyAgICAicGhpMSIsCisgICAgImthcHBhIiwKKyAgICAibGFtYmRhIiwKKyAgICAibXUiLAorICAgICJudSIsCisgICAgIm9taWNyb24iLAorICAgICJwaSIsCisgICAgInRoZXRhIiwKKyAgICAicmhvIiwKKyAgICAic2lnbWEiLAorICAgICJ0YXUiLAorICAgICJ1cHNpbG9uIiwKKyAgICAib21lZ2ExIiwKKyAgICAib21lZ2EiLAorICAgICJ4aSIsCisgICAgInBzaSIsCisgICAgInpldGEiLAorICAgICJicmFjZWxlZnQiLAorICAgICJiYXIiLAorICAgICJicmFjZXJpZ2h0IiwKKyAgICAic2ltaWxhciIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgIkV1cm8iLAorICAgICJVcHNpbG9uMSIsCisgICAgIm1pbnV0ZSIsCisgICAgImxlc3NlcXVhbCIsCisgICAgImZyYWN0aW9uIiwKKyAgICAiaW5maW5pdHkiLAorICAgICJmbG9yaW4iLAorICAgICJjbHViIiwKKyAgICAiZGlhbW9uZCIsCisgICAgImhlYXJ0IiwKKyAgICAic3BhZGUiLAorICAgICJhcnJvd2JvdGgiLAorICAgICJhcnJvd2xlZnQiLAorICAgICJhcnJvd3VwIiwKKyAgICAiYXJyb3dyaWdodCIsCisgICAgImFycm93ZG93biIsCisgICAgImRlZ3JlZSIsCisgICAgInBsdXNtaW51cyIsCisgICAgInNlY29uZCIsCisgICAgImdyZWF0ZXJlcXVhbCIsCisgICAgIm11bHRpcGx5IiwKKyAgICAicHJvcG9ydGlvbmFsIiwKKyAgICAicGFydGlhbGRpZmYiLAorICAgICJidWxsZXQiLAorICAgICJkaXZpZGUiLAorICAgICJub3RlcXVhbCIsCisgICAgImVxdWl2YWxlbmNlIiwKKyAgICAiYXBwcm94ZXF1YWwiLAorICAgICJlbGxpcHNpcyIsCisgICAgImFycm93dmVydGV4IiwKKyAgICAiYXJyb3dob3JpemV4IiwKKyAgICAiY2FycmlhZ2VyZXR1cm4iLAorICAgICJhbGVwaCIsCisgICAgIklmcmFrdHVyIiwKKyAgICAiUmZyYWt0dXIiLAorICAgICJ3ZWllcnN0cmFzcyIsCisgICAgImNpcmNsZW11bHRpcGx5IiwKKyAgICAiY2lyY2xlcGx1cyIsCisgICAgImVtcHR5c2V0IiwKKyAgICAiaW50ZXJzZWN0aW9uIiwKKyAgICAidW5pb24iLAorICAgICJwcm9wZXJzdXBlcnNldCIsCisgICAgInJlZmxleHN1cGVyc2V0IiwKKyAgICAibm90c3Vic2V0IiwKKyAgICAicHJvcGVyc3Vic2V0IiwKKyAgICAicmVmbGV4c3Vic2V0IiwKKyAgICAiZWxlbWVudCIsCisgICAgIm5vdGVsZW1lbnQiLAorICAgICJhbmdsZSIsCisgICAgImdyYWRpZW50IiwKKyAgICAicmVnaXN0ZXJzZXJpZiIsCisgICAgImNvcHlyaWdodHNlcmlmIiwKKyAgICAidHJhZGVtYXJrc2VyaWYiLAorICAgICJwcm9kdWN0IiwKKyAgICAicmFkaWNhbCIsCisgICAgImRvdG1hdGgiLAorICAgICJsb2dpY2Fsbm90IiwKKyAgICAibG9naWNhbGFuZCIsCisgICAgImxvZ2ljYWxvciIsCisgICAgImFycm93ZGJsYm90aCIsCisgICAgImFycm93ZGJsbGVmdCIsCisgICAgImFycm93ZGJsdXAiLAorICAgICJhcnJvd2RibHJpZ2h0IiwKKyAgICAiYXJyb3dkYmxkb3duIiwKKyAgICAibG96ZW5nZSIsCisgICAgImFuZ2xlbGVmdCIsCisgICAgInJlZ2lzdGVyc2FucyIsCisgICAgImNvcHlyaWdodHNhbnMiLAorICAgICJ0cmFkZW1hcmtzYW5zIiwKKyAgICAic3VtbWF0aW9uIiwKKyAgICAicGFyZW5sZWZ0dHAiLAorICAgICJwYXJlbmxlZnRleCIsCisgICAgInBhcmVubGVmdGJ0IiwKKyAgICAiYnJhY2tldGxlZnR0cCIsCisgICAgImJyYWNrZXRsZWZ0ZXgiLAorICAgICJicmFja2V0bGVmdGJ0IiwKKyAgICAiYnJhY2VsZWZ0dHAiLAorICAgICJicmFjZWxlZnRtaWQiLAorICAgICJicmFjZWxlZnRidCIsCisgICAgImJyYWNlZXgiLAorICAgIE5VTEwsCisgICAgImFuZ2xlcmlnaHQiLAorICAgICJpbnRlZ3JhbCIsCisgICAgImludGVncmFsdHAiLAorICAgICJpbnRlZ3JhbGV4IiwKKyAgICAiaW50ZWdyYWxidCIsCisgICAgInBhcmVucmlnaHR0cCIsCisgICAgInBhcmVucmlnaHRleCIsCisgICAgInBhcmVucmlnaHRidCIsCisgICAgImJyYWNrZXRyaWdodHRwIiwKKyAgICAiYnJhY2tldHJpZ2h0ZXgiLAorICAgICJicmFja2V0cmlnaHRidCIsCisgICAgImJyYWNlcmlnaHR0cCIsCisgICAgImJyYWNlcmlnaHRtaWQiLAorICAgICJicmFjZXJpZ2h0YnQiLAorICAgIE5VTEwsCiB9Owogc3RhdGljIGNvbnN0IEZYX0NIQVIqIGNvbnN0IFphcGZFbmNvZGluZ05hbWVzWzIyNF0gPSB7Ci0gICAgInNwYWNlIiwgImExIiwgImEyIiwgImEyMDIiLCAiYTMiLCAiYTQiLCAiYTUiLCAiYTExOSIsCi0gICAgImExMTgiLCAiYTExNyIsICJhMTEiLCAiYTEyIiwgImExMyIsICJhMTQiLCAiYTE1IiwgImExNiIsCi0gICAgImExMDUiLCAiYTE3IiwgImExOCIsICJhMTkiLCAiYTIwIiwgImEyMSIsICJhMjIiLCAiYTIzIiwKLSAgICAiYTI0IiwgImEyNSIsICJhMjYiLCAiYTI3IiwgImEyOCIsICJhNiIsICJhNyIsICJhOCIsCi0gICAgImE5IiwgImExMCIsICJhMjkiLCAiYTMwIiwgImEzMSIsICJhMzIiLCAiYTMzIiwgImEzNCIsCi0gICAgImEzNSIsICJhMzYiLCAiYTM3IiwgImEzOCIsICJhMzkiLCAiYTQwIiwgImE0MSIsICJhNDIiLAotICAgICJhNDMiLCAiYTQ0IiwgImE0NSIsICJhNDYiLCAiYTQ3IiwgImE0OCIsICJhNDkiLCAiYTUwIiwKLSAgICAiYTUxIiwgImE1MiIsICJhNTMiLCAiYTU0IiwgImE1NSIsICJhNTYiLCAiYTU3IiwgImE1OCIsCi0gICAgImE1OSIsICJhNjAiLCAiYTYxIiwgImE2MiIsICJhNjMiLCAiYTY0IiwgImE2NSIsICJhNjYiLAotICAgICJhNjciLCAiYTY4IiwgImE2OSIsICJhNzAiLCAiYTcxIiwgImE3MiIsICJhNzMiLCAiYTc0IiwKLSAgICAiYTIwMyIsICJhNzUiLCAiYTIwNCIsICJhNzYiLCAiYTc3IiwgImE3OCIsICJhNzkiLCAiYTgxIiwKLSAgICAiYTgyIiwgImE4MyIsICJhODQiLCAiYTk3IiwgImE5OCIsICJhOTkiLCAiYTEwMCIsIE5VTEwsCi0gICAgImE4OSIsICJhOTAiLCAiYTkzIiwgImE5NCIsICJhOTEiLCAiYTkyIiwgImEyMDUiLCAiYTg1IiwKLSAgICAiYTIwNiIsICJhODYiLCAiYTg3IiwgImE4OCIsICJhOTUiLCAiYTk2IiwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgImExMDEiLCAiYTEwMiIsICJhMTAzIiwgImExMDQiLCAiYTEwNiIsICJhMTA3IiwgImExMDgiLAotICAgICJhMTEyIiwgImExMTEiLCAiYTExMCIsICJhMTA5IiwgImExMjAiLCAiYTEyMSIsICJhMTIyIiwgImExMjMiLAotICAgICJhMTI0IiwgImExMjUiLCAiYTEyNiIsICJhMTI3IiwgImExMjgiLCAiYTEyOSIsICJhMTMwIiwgImExMzEiLAotICAgICJhMTMyIiwgImExMzMiLCAiYTEzNCIsICJhMTM1IiwgImExMzYiLCAiYTEzNyIsICJhMTM4IiwgImExMzkiLAotICAgICJhMTQwIiwgImExNDEiLCAiYTE0MiIsICJhMTQzIiwgImExNDQiLCAiYTE0NSIsICJhMTQ2IiwgImExNDciLAotICAgICJhMTQ4IiwgImExNDkiLCAiYTE1MCIsICJhMTUxIiwgImExNTIiLCAiYTE1MyIsICJhMTU0IiwgImExNTUiLAotICAgICJhMTU2IiwgImExNTciLCAiYTE1OCIsICJhMTU5IiwgImExNjAiLCAiYTE2MSIsICJhMTYzIiwgImExNjQiLAotICAgICJhMTk2IiwgImExNjUiLCAiYTE5MiIsICJhMTY2IiwgImExNjciLCAiYTE2OCIsICJhMTY5IiwgImExNzAiLAotICAgICJhMTcxIiwgImExNzIiLCAiYTE3MyIsICJhMTYyIiwgImExNzQiLCAiYTE3NSIsICJhMTc2IiwgImExNzciLAotICAgICJhMTc4IiwgImExNzkiLCAiYTE5MyIsICJhMTgwIiwgImExOTkiLCAiYTE4MSIsICJhMjAwIiwgImExODIiLAotICAgIE5VTEwsICJhMjAxIiwgImExODMiLCAiYTE4NCIsICJhMTk3IiwgImExODUiLCAiYTE5NCIsICJhMTk4IiwKLSAgICAiYTE4NiIsICJhMTk1IiwgImExODciLCAiYTE4OCIsICJhMTg5IiwgImExOTAiLCAiYTE5MSIsIE5VTEwKLX07Ci1jb25zdCBGWF9DSEFSKiAgUERGX0NoYXJOYW1lRnJvbVByZWRlZmluZWRDaGFyU2V0KGludCBlbmNvZGluZywgdWludDhfdCBjaGFyY29kZSkKLXsKLSAgICBpZiAoZW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19QREZET0MpIHsKLSAgICAgICAgaWYgKGNoYXJjb2RlIDwgMjQpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGNoYXJjb2RlIC09IDI0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjaGFyY29kZSA8IDMyKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBjaGFyY29kZSAtPSAzMjsKKyAgICAic3BhY2UiLCAiYTEiLCAgICJhMiIsICAgImEyMDIiLCAiYTMiLCAgICJhNCIsICAgImE1IiwgICAiYTExOSIsICJhMTE4IiwKKyAgICAiYTExNyIsICAiYTExIiwgICJhMTIiLCAgImExMyIsICAiYTE0IiwgICJhMTUiLCAgImExNiIsICAiYTEwNSIsICJhMTciLAorICAgICJhMTgiLCAgICJhMTkiLCAgImEyMCIsICAiYTIxIiwgICJhMjIiLCAgImEyMyIsICAiYTI0IiwgICJhMjUiLCAgImEyNiIsCisgICAgImEyNyIsICAgImEyOCIsICAiYTYiLCAgICJhNyIsICAgImE4IiwgICAiYTkiLCAgICJhMTAiLCAgImEyOSIsICAiYTMwIiwKKyAgICAiYTMxIiwgICAiYTMyIiwgICJhMzMiLCAgImEzNCIsICAiYTM1IiwgICJhMzYiLCAgImEzNyIsICAiYTM4IiwgICJhMzkiLAorICAgICJhNDAiLCAgICJhNDEiLCAgImE0MiIsICAiYTQzIiwgICJhNDQiLCAgImE0NSIsICAiYTQ2IiwgICJhNDciLCAgImE0OCIsCisgICAgImE0OSIsICAgImE1MCIsICAiYTUxIiwgICJhNTIiLCAgImE1MyIsICAiYTU0IiwgICJhNTUiLCAgImE1NiIsICAiYTU3IiwKKyAgICAiYTU4IiwgICAiYTU5IiwgICJhNjAiLCAgImE2MSIsICAiYTYyIiwgICJhNjMiLCAgImE2NCIsICAiYTY1IiwgICJhNjYiLAorICAgICJhNjciLCAgICJhNjgiLCAgImE2OSIsICAiYTcwIiwgICJhNzEiLCAgImE3MiIsICAiYTczIiwgICJhNzQiLCAgImEyMDMiLAorICAgICJhNzUiLCAgICJhMjA0IiwgImE3NiIsICAiYTc3IiwgICJhNzgiLCAgImE3OSIsICAiYTgxIiwgICJhODIiLCAgImE4MyIsCisgICAgImE4NCIsICAgImE5NyIsICAiYTk4IiwgICJhOTkiLCAgImExMDAiLCBOVUxMLCAgICJhODkiLCAgImE5MCIsICAiYTkzIiwKKyAgICAiYTk0IiwgICAiYTkxIiwgICJhOTIiLCAgImEyMDUiLCAiYTg1IiwgICJhMjA2IiwgImE4NiIsICAiYTg3IiwgICJhODgiLAorICAgICJhOTUiLCAgICJhOTYiLCAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwKKyAgICBOVUxMLCAgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsCisgICAgTlVMTCwgICAgTlVMTCwgICBOVUxMLCAgICJhMTAxIiwgImExMDIiLCAiYTEwMyIsICJhMTA0IiwgImExMDYiLCAiYTEwNyIsCisgICAgImExMDgiLCAgImExMTIiLCAiYTExMSIsICJhMTEwIiwgImExMDkiLCAiYTEyMCIsICJhMTIxIiwgImExMjIiLCAiYTEyMyIsCisgICAgImExMjQiLCAgImExMjUiLCAiYTEyNiIsICJhMTI3IiwgImExMjgiLCAiYTEyOSIsICJhMTMwIiwgImExMzEiLCAiYTEzMiIsCisgICAgImExMzMiLCAgImExMzQiLCAiYTEzNSIsICJhMTM2IiwgImExMzciLCAiYTEzOCIsICJhMTM5IiwgImExNDAiLCAiYTE0MSIsCisgICAgImExNDIiLCAgImExNDMiLCAiYTE0NCIsICJhMTQ1IiwgImExNDYiLCAiYTE0NyIsICJhMTQ4IiwgImExNDkiLCAiYTE1MCIsCisgICAgImExNTEiLCAgImExNTIiLCAiYTE1MyIsICJhMTU0IiwgImExNTUiLCAiYTE1NiIsICJhMTU3IiwgImExNTgiLCAiYTE1OSIsCisgICAgImExNjAiLCAgImExNjEiLCAiYTE2MyIsICJhMTY0IiwgImExOTYiLCAiYTE2NSIsICJhMTkyIiwgImExNjYiLCAiYTE2NyIsCisgICAgImExNjgiLCAgImExNjkiLCAiYTE3MCIsICJhMTcxIiwgImExNzIiLCAiYTE3MyIsICJhMTYyIiwgImExNzQiLCAiYTE3NSIsCisgICAgImExNzYiLCAgImExNzciLCAiYTE3OCIsICJhMTc5IiwgImExOTMiLCAiYTE4MCIsICJhMTk5IiwgImExODEiLCAiYTIwMCIsCisgICAgImExODIiLCAgTlVMTCwgICAiYTIwMSIsICJhMTgzIiwgImExODQiLCAiYTE5NyIsICJhMTg1IiwgImExOTQiLCAiYTE5OCIsCisgICAgImExODYiLCAgImExOTUiLCAiYTE4NyIsICJhMTg4IiwgImExODkiLCAiYTE5MCIsICJhMTkxIiwgTlVMTH07Citjb25zdCBGWF9DSEFSKiBQREZfQ2hhck5hbWVGcm9tUHJlZGVmaW5lZENoYXJTZXQoaW50IGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhcmNvZGUpIHsKKyAgaWYgKGVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfUERGRE9DKSB7CisgICAgaWYgKGNoYXJjb2RlIDwgMjQpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzd2l0Y2ggKGVuY29kaW5nKSB7Ci0gICAgICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19XSU5BTlNJOgotICAgICAgICAgICAgcmV0dXJuIEFkb2JlV2luQW5zaUVuY29kaW5nTmFtZXNbY2hhcmNvZGVdOwotICAgICAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU46Ci0gICAgICAgICAgICByZXR1cm4gTWFjUm9tYW5FbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX01BQ0VYUEVSVDoKLSAgICAgICAgICAgIHJldHVybiBNYWNFeHBlcnRFbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1NUQU5EQVJEOgotICAgICAgICAgICAgcmV0dXJuIFN0YW5kYXJkRW5jb2RpbmdOYW1lc1tjaGFyY29kZV07Ci0gICAgICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0w6Ci0gICAgICAgICAgICByZXR1cm4gQWRvYmVTeW1ib2xFbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUzoKLSAgICAgICAgICAgIHJldHVybiBaYXBmRW5jb2RpbmdOYW1lc1tjaGFyY29kZV07Ci0gICAgICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19QREZET0M6Ci0gICAgICAgICAgICByZXR1cm4gUERGRG9jRW5jb2RpbmdOYW1lc1tjaGFyY29kZV07CisgICAgY2hhcmNvZGUgLT0gMjQ7CisgIH0gZWxzZSB7CisgICAgaWYgKGNoYXJjb2RlIDwgMzIpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gTlVMTDsKKyAgICBjaGFyY29kZSAtPSAzMjsKKyAgfQorICBzd2l0Y2ggKGVuY29kaW5nKSB7CisgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k6CisgICAgICByZXR1cm4gQWRvYmVXaW5BbnNpRW5jb2RpbmdOYW1lc1tjaGFyY29kZV07CisgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOOgorICAgICAgcmV0dXJuIE1hY1JvbWFuRW5jb2RpbmdOYW1lc1tjaGFyY29kZV07CisgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX01BQ0VYUEVSVDoKKyAgICAgIHJldHVybiBNYWNFeHBlcnRFbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQ6CisgICAgICByZXR1cm4gU3RhbmRhcmRFbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MOgorICAgICAgcmV0dXJuIEFkb2JlU3ltYm9sRW5jb2RpbmdOYW1lc1tjaGFyY29kZV07CisgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUzoKKyAgICAgIHJldHVybiBaYXBmRW5jb2RpbmdOYW1lc1tjaGFyY29kZV07CisgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1BERkRPQzoKKyAgICAgIHJldHVybiBQREZEb2NFbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLUZYX1dDSEFSIEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoaW50IGVuY29kaW5nLCBGWF9EV09SRCBjaGFyY29kZSkKLXsKLSAgICBzd2l0Y2ggKGVuY29kaW5nKSB7Ci0gICAgICAgIGNhc2UgRlhGVF9FTkNPRElOR19VTklDT0RFOgotICAgICAgICAgICAgcmV0dXJuIChGWF9XT1JEKWNoYXJjb2RlOwotICAgICAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQ6Ci0gICAgICAgICAgICByZXR1cm4gU3RhbmRhcmRFbmNvZGluZ1sodWludDhfdCljaGFyY29kZV07Ci0gICAgICAgIGNhc2UgRlhGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQ6Ci0gICAgICAgICAgICByZXR1cm4gTWFjRXhwZXJ0RW5jb2RpbmdbKHVpbnQ4X3QpY2hhcmNvZGVdOwotICAgICAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMToKLSAgICAgICAgICAgIHJldHVybiBBZG9iZVdpbkFuc2lFbmNvZGluZ1sodWludDhfdCljaGFyY29kZV07Ci0gICAgICAgIGNhc2UgRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTjoKLSAgICAgICAgICAgIHJldHVybiBNYWNSb21hbkVuY29kaW5nWyh1aW50OF90KWNoYXJjb2RlXTsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1BERkRPQzoKLSAgICAgICAgICAgIHJldHVybiBQREZEb2NFbmNvZGluZ1sodWludDhfdCljaGFyY29kZV07Ci0gICAgfQotICAgIHJldHVybiAwOworRlhfV0NIQVIgRlRfVW5pY29kZUZyb21DaGFyQ29kZShpbnQgZW5jb2RpbmcsIEZYX0RXT1JEIGNoYXJjb2RlKSB7CisgIHN3aXRjaCAoZW5jb2RpbmcpIHsKKyAgICBjYXNlIEZYRlRfRU5DT0RJTkdfVU5JQ09ERToKKyAgICAgIHJldHVybiAoRlhfV09SRCljaGFyY29kZTsKKyAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQ6CisgICAgICByZXR1cm4gU3RhbmRhcmRFbmNvZGluZ1sodWludDhfdCljaGFyY29kZV07CisgICAgY2FzZSBGWEZUX0VOQ09ESU5HX0FET0JFX0VYUEVSVDoKKyAgICAgIHJldHVybiBNYWNFeHBlcnRFbmNvZGluZ1sodWludDhfdCljaGFyY29kZV07CisgICAgY2FzZSBGWEZUX0VOQ09ESU5HX0FET0JFX0xBVElOXzE6CisgICAgICByZXR1cm4gQWRvYmVXaW5BbnNpRW5jb2RpbmdbKHVpbnQ4X3QpY2hhcmNvZGVdOworICAgIGNhc2UgRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTjoKKyAgICAgIHJldHVybiBNYWNSb21hbkVuY29kaW5nWyh1aW50OF90KWNoYXJjb2RlXTsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfUERGRE9DOgorICAgICAgcmV0dXJuIFBERkRvY0VuY29kaW5nWyh1aW50OF90KWNoYXJjb2RlXTsKKyAgfQorICByZXR1cm4gMDsKIH0KLXN0YXRpYyBGWF9EV09SRCBQREZfRmluZENvZGUoY29uc3QgRlhfV09SRCogcENvZGVzLCBGWF9XT1JEIHVuaWNvZGUpCi17Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IDI1NjsgaSArKykKLSAgICAgICAgaWYgKHBDb2Rlc1tpXSA9PSB1bmljb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIHJldHVybiAwOworc3RhdGljIEZYX0RXT1JEIFBERl9GaW5kQ29kZShjb25zdCBGWF9XT1JEKiBwQ29kZXMsIEZYX1dPUkQgdW5pY29kZSkgeworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKHBDb2Rlc1tpXSA9PSB1bmljb2RlKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIHJldHVybiAwOwogfQogc3RhdGljIGNvbnN0IEZYX1dPUkQgTVNTeW1ib2xFbmNvZGluZ1syNTZdID0gewotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAzMiwgMzMsIDg3MDQsIDM1LCA4NzA3LCAzNywgMzgsIDg3MTUsCi0gICAgNDAsIDQxLCA4NzI3LCA0MywgNDQsIDg3MjIsIDQ2LCA0NywgNDgsIDQ5LAotICAgIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LAotICAgIDYwLCA2MSwgNjIsIDYzLCA4NzczLCA5MTMsIDkxNCwgOTM1LCA5MTYsIDkxNywKLSAgICA5MzQsIDkxNSwgOTE5LCA5MjEsIDk3NywgOTIyLCA5MjMsIDkyNCwgOTI1LCA5MjcsCi0gICAgOTI4LCA5MjAsIDkyOSwgOTMxLCA5MzIsIDkzMywgOTYyLCA5MzcsIDkyNiwgOTM2LAotICAgIDkxOCwgOTEsIDg3NTYsIDkzLCA4ODY5LCA5NSwgODI1NCwgOTQ1LCA5NDYsIDk2NywKLSAgICA5NDgsIDk0OSwgOTY2LCA5NDcsIDk1MSwgOTUzLCA5ODEsIDk1NCwgOTU1LCA5NTYsCi0gICAgOTU3LCA5NTksIDk2MCwgOTUyLCA5NjEsIDk2MywgOTY0LCA5NjUsIDk4MiwgOTY5LAotICAgIDk1OCwgOTY4LCA5NTAsIDEyMywgMTI0LCAxMjUsIDg3NjQsIDAsIDAsIDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCA5NzgsIDgyNDIsIDg4MDQsIDg3MjUsIDg3MzQsIDQwMiwgOTgyNywgOTgzMCwgOTgyOCwKLSAgICA5ODI0LCA4NTk2LCA4NTkyLCA4NTkzLCA4NTk0LCA4NTk1LCAxNzYsIDE3NywgODI0MywgODgwNSwKLSAgICAyMTUsIDg3MzMsIDg3MDYsIDg3MjksIDI0NywgODgwMCwgODgwMSwgODc3NiwgODk0MywgMCwKLSAgICAwLCA4NjI5LCAwLCA4NDY1LCA4NDc2LCA4NDcyLCA4ODU1LCA4ODUzLCA4NzA5LCA4NzQ1LAotICAgIDg3NDYsIDg4MzUsIDg4MzksIDg4MzYsIDg4MzQsIDg4MzgsIDg3MTIsIDg3MTMsIDg3MzYsIDg3MTEsCi0gICAgMTc0LCAxNjksIDg0ODIsIDg3MTksIDg3MzAsIDg5MDEsIDE3MiwgODc0MywgODc0NCwgODY2MCwKLSAgICA4NjU2LCA4NjU3LCA4NjU4LCA4NjU5LCA5Njc0LCA5MDAxLCAwLCAwLCAwLCA4NzIxLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMHgwMDAwLCA5MDAyLCA4NzQ3LCA4OTkyLCAwLCA4OTkzLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMAotfTsKLUZYX0RXT1JEIEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoaW50IGVuY29kaW5nLCBGWF9XQ0hBUiB1bmljb2RlKQotewotICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKLSAgICAgICAgY2FzZSBGWEZUX0VOQ09ESU5HX1VOSUNPREU6Ci0gICAgICAgICAgICByZXR1cm4gdW5pY29kZTsKLSAgICAgICAgY2FzZSBGWEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJEOgotICAgICAgICAgICAgcmV0dXJuIFBERl9GaW5kQ29kZShTdGFuZGFyZEVuY29kaW5nLCB1bmljb2RlKTsKLSAgICAgICAgY2FzZSBGWEZUX0VOQ09ESU5HX0FET0JFX0VYUEVSVDoKLSAgICAgICAgICAgIHJldHVybiBQREZfRmluZENvZGUoTWFjRXhwZXJ0RW5jb2RpbmcsIHVuaWNvZGUpOwotICAgICAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMToKLSAgICAgICAgICAgIHJldHVybiBQREZfRmluZENvZGUoQWRvYmVXaW5BbnNpRW5jb2RpbmcsIHVuaWNvZGUpOwotICAgICAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU46Ci0gICAgICAgICAgICByZXR1cm4gUERGX0ZpbmRDb2RlKE1hY1JvbWFuRW5jb2RpbmcsIHVuaWNvZGUpOwotICAgICAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfQ1VTVE9NOgotICAgICAgICAgICAgcmV0dXJuIFBERl9GaW5kQ29kZShQREZEb2NFbmNvZGluZywgdW5pY29kZSk7Ci0gICAgICAgIGNhc2UgRlhGVF9FTkNPRElOR19NU19TWU1CT0w6Ci0gICAgICAgICAgICByZXR1cm4gUERGX0ZpbmRDb2RlKE1TU3ltYm9sRW5jb2RpbmcsIHVuaWNvZGUpOwotICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMzIsICAgICAzMywgICAgIDg3MDQsICAgMzUsCisgICAgODcwNywgICAzNywgICAgIDM4LCAgICAgODcxNSwgICA0MCwgICAgIDQxLCAgICAgODcyNywgICA0MywgICAgIDQ0LAorICAgIDg3MjIsICAgNDYsICAgICA0NywgICAgIDQ4LCAgICAgNDksICAgICA1MCwgICAgIDUxLCAgICAgNTIsICAgICA1MywKKyAgICA1NCwgICAgIDU1LCAgICAgNTYsICAgICA1NywgICAgIDU4LCAgICAgNTksICAgICA2MCwgICAgIDYxLCAgICAgNjIsCisgICAgNjMsICAgICA4NzczLCAgIDkxMywgICAgOTE0LCAgICA5MzUsICAgIDkxNiwgICAgOTE3LCAgICA5MzQsICAgIDkxNSwKKyAgICA5MTksICAgIDkyMSwgICAgOTc3LCAgICA5MjIsICAgIDkyMywgICAgOTI0LCAgICA5MjUsICAgIDkyNywgICAgOTI4LAorICAgIDkyMCwgICAgOTI5LCAgICA5MzEsICAgIDkzMiwgICAgOTMzLCAgICA5NjIsICAgIDkzNywgICAgOTI2LCAgICA5MzYsCisgICAgOTE4LCAgICA5MSwgICAgIDg3NTYsICAgOTMsICAgICA4ODY5LCAgIDk1LCAgICAgODI1NCwgICA5NDUsICAgIDk0NiwKKyAgICA5NjcsICAgIDk0OCwgICAgOTQ5LCAgICA5NjYsICAgIDk0NywgICAgOTUxLCAgICA5NTMsICAgIDk4MSwgICAgOTU0LAorICAgIDk1NSwgICAgOTU2LCAgICA5NTcsICAgIDk1OSwgICAgOTYwLCAgICA5NTIsICAgIDk2MSwgICAgOTYzLCAgICA5NjQsCisgICAgOTY1LCAgICA5ODIsICAgIDk2OSwgICAgOTU4LCAgICA5NjgsICAgIDk1MCwgICAgMTIzLCAgICAxMjQsICAgIDEyNSwKKyAgICA4NzY0LCAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgOTc4LAorICAgIDgyNDIsICAgODgwNCwgICA4NzI1LCAgIDg3MzQsICAgNDAyLCAgICA5ODI3LCAgIDk4MzAsICAgOTgyOCwgICA5ODI0LAorICAgIDg1OTYsICAgODU5MiwgICA4NTkzLCAgIDg1OTQsICAgODU5NSwgICAxNzYsICAgIDE3NywgICAgODI0MywgICA4ODA1LAorICAgIDIxNSwgICAgODczMywgICA4NzA2LCAgIDg3MjksICAgMjQ3LCAgICA4ODAwLCAgIDg4MDEsICAgODc3NiwgICA4OTQzLAorICAgIDAsICAgICAgMCwgICAgICA4NjI5LCAgIDAsICAgICAgODQ2NSwgICA4NDc2LCAgIDg0NzIsICAgODg1NSwgICA4ODUzLAorICAgIDg3MDksICAgODc0NSwgICA4NzQ2LCAgIDg4MzUsICAgODgzOSwgICA4ODM2LCAgIDg4MzQsICAgODgzOCwgICA4NzEyLAorICAgIDg3MTMsICAgODczNiwgICA4NzExLCAgIDE3NCwgICAgMTY5LCAgICA4NDgyLCAgIDg3MTksICAgODczMCwgICA4OTAxLAorICAgIDE3MiwgICAgODc0MywgICA4NzQ0LCAgIDg2NjAsICAgODY1NiwgICA4NjU3LCAgIDg2NTgsICAgODY1OSwgICA5Njc0LAorICAgIDkwMDEsICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgODcyMSwgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB4MDAwMCwgOTAwMiwgICA4NzQ3LAorICAgIDg5OTIsICAgMCwgICAgICA4OTkzLCAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMH07CitGWF9EV09SRCBGVF9DaGFyQ29kZUZyb21Vbmljb2RlKGludCBlbmNvZGluZywgRlhfV0NIQVIgdW5pY29kZSkgeworICBzd2l0Y2ggKGVuY29kaW5nKSB7CisgICAgY2FzZSBGWEZUX0VOQ09ESU5HX1VOSUNPREU6CisgICAgICByZXR1cm4gdW5pY29kZTsKKyAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQ6CisgICAgICByZXR1cm4gUERGX0ZpbmRDb2RlKFN0YW5kYXJkRW5jb2RpbmcsIHVuaWNvZGUpOworICAgIGNhc2UgRlhGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQ6CisgICAgICByZXR1cm4gUERGX0ZpbmRDb2RlKE1hY0V4cGVydEVuY29kaW5nLCB1bmljb2RlKTsKKyAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMToKKyAgICAgIHJldHVybiBQREZfRmluZENvZGUoQWRvYmVXaW5BbnNpRW5jb2RpbmcsIHVuaWNvZGUpOworICAgIGNhc2UgRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTjoKKyAgICAgIHJldHVybiBQREZfRmluZENvZGUoTWFjUm9tYW5FbmNvZGluZywgdW5pY29kZSk7CisgICAgY2FzZSBGWEZUX0VOQ09ESU5HX0FET0JFX0NVU1RPTToKKyAgICAgIHJldHVybiBQREZfRmluZENvZGUoUERGRG9jRW5jb2RpbmcsIHVuaWNvZGUpOworICAgIGNhc2UgRlhGVF9FTkNPRElOR19NU19TWU1CT0w6CisgICAgICByZXR1cm4gUERGX0ZpbmRDb2RlKE1TU3ltYm9sRW5jb2RpbmcsIHVuaWNvZGUpOworICB9CisgIHJldHVybiAwOwogfQotY29uc3QgRlhfV09SRCogUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoaW50IGVuY29kaW5nKQotewotICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k6Ci0gICAgICAgICAgICByZXR1cm4gQWRvYmVXaW5BbnNpRW5jb2Rpbmc7Ci0gICAgICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19NQUNST01BTjoKLSAgICAgICAgICAgIHJldHVybiBNYWNSb21hbkVuY29kaW5nOwotICAgICAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfTUFDRVhQRVJUOgotICAgICAgICAgICAgcmV0dXJuIE1hY0V4cGVydEVuY29kaW5nOwotICAgICAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQ6Ci0gICAgICAgICAgICByZXR1cm4gU3RhbmRhcmRFbmNvZGluZzsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX0FET0JFX1NZTUJPTDoKLSAgICAgICAgICAgIHJldHVybiBBZG9iZVN5bWJvbEVuY29kaW5nOwotICAgICAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOgotICAgICAgICAgICAgcmV0dXJuIFphcGZFbmNvZGluZzsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1BERkRPQzoKLSAgICAgICAgICAgIHJldHVybiBQREZEb2NFbmNvZGluZzsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX01TX1NZTUJPTDoKLSAgICAgICAgICAgIHJldHVybiBNU1N5bWJvbEVuY29kaW5nOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKK2NvbnN0IEZYX1dPUkQqIFBERl9Vbmljb2Rlc0ZvclByZWRlZmluZWRDaGFyU2V0KGludCBlbmNvZGluZykgeworICBzd2l0Y2ggKGVuY29kaW5nKSB7CisgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k6CisgICAgICByZXR1cm4gQWRvYmVXaW5BbnNpRW5jb2Rpbmc7CisgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOOgorICAgICAgcmV0dXJuIE1hY1JvbWFuRW5jb2Rpbmc7CisgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX01BQ0VYUEVSVDoKKyAgICAgIHJldHVybiBNYWNFeHBlcnRFbmNvZGluZzsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQ6CisgICAgICByZXR1cm4gU3RhbmRhcmRFbmNvZGluZzsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MOgorICAgICAgcmV0dXJuIEFkb2JlU3ltYm9sRW5jb2Rpbmc7CisgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUzoKKyAgICAgIHJldHVybiBaYXBmRW5jb2Rpbmc7CisgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1BERkRPQzoKKyAgICAgIHJldHVybiBQREZEb2NFbmNvZGluZzsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfTVNfU1lNQk9MOgorICAgICAgcmV0dXJuIE1TU3ltYm9sRW5jb2Rpbmc7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci1GWF9EV09SRCBQREZfUHJlZGVmaW5lZENoYXJDb2RlRnJvbVVuaWNvZGUoaW50IGVuY29kaW5nLCBGWF9XQ0hBUiB1bmljb2RlKQotewotICAgIHJldHVybiBQREZfRmluZENvZGUoUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoZW5jb2RpbmcpLCB1bmljb2RlKTsKK0ZYX0RXT1JEIFBERl9QcmVkZWZpbmVkQ2hhckNvZGVGcm9tVW5pY29kZShpbnQgZW5jb2RpbmcsIEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgcmV0dXJuIFBERl9GaW5kQ29kZShQREZfVW5pY29kZXNGb3JQcmVkZWZpbmVkQ2hhclNldChlbmNvZGluZyksIHVuaWNvZGUpOwogfQogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKQEAgLTYxNSwxMyArMTc4MiwxMSBAQAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKLUZYX1dDSEFSIFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShjb25zdCBGWF9DSEFSKiBuYW1lKQotewotICAgIHJldHVybiAoRlhfV0NIQVIpKEZYRlRfdW5pY29kZV9mcm9tX2Fkb2JlX25hbWUobmFtZSkgJiAweDdGRkZGRkZGKTsKK0ZYX1dDSEFSIFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShjb25zdCBGWF9DSEFSKiBuYW1lKSB7CisgIHJldHVybiAoRlhfV0NIQVIpKEZYRlRfdW5pY29kZV9mcm9tX2Fkb2JlX25hbWUobmFtZSkgJiAweDdGRkZGRkZGKTsKIH0KLUNGWF9CeXRlU3RyaW5nIFBERl9BZG9iZU5hbWVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKQotewotICAgIGNoYXIgZ2x5cGhfbmFtZVs2NF07Ci0gICAgRlhGVF9hZG9iZV9uYW1lX2Zyb21fdW5pY29kZShnbHlwaF9uYW1lLCB1bmljb2RlKTsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoZ2x5cGhfbmFtZSwgLTEpOworQ0ZYX0J5dGVTdHJpbmcgUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgY2hhciBnbHlwaF9uYW1lWzY0XTsKKyAgRlhGVF9hZG9iZV9uYW1lX2Zyb21fdW5pY29kZShnbHlwaF9uYW1lLCB1bmljb2RlKTsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGdseXBoX25hbWUsIC0xKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udF9jaWQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X2NpZC5jcHAKaW5kZXggZjcwYjllYy4uM2M4YjI1NiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X2NpZC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X2NpZC5jcHAKQEAgLTEzLDE1ODMgKzEzLDE2NTMgQEAKICNpbmNsdWRlICJmb250X2ludC5oIgogCiBleHRlcm4gc2hvcnQgVFQyUERGKGludCBtLCBGWEZUX0ZhY2UgZmFjZSk7Ci1leHRlcm4gRlhfQk9PTCBGVF9Vc2VUVENoYXJtYXAoRlhGVF9GYWNlIGZhY2UsIGludCBwbGF0Zm9ybV9pZCwgaW50IGVuY29kaW5nX2lkKTsKK2V4dGVybiBGWF9CT09MIEZUX1VzZVRUQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhdGZvcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuY29kaW5nX2lkKTsKIAotQ1BERl9DTWFwTWFuYWdlcjo6Q1BERl9DTWFwTWFuYWdlcigpCi17Ci0gICAgbV9iUHJvbXB0ZWQgPSBGQUxTRTsKLSAgICBGWFNZU19tZW1zZXQobV9DSUQyVW5pY29kZU1hcHMsIDAsIHNpemVvZiBtX0NJRDJVbmljb2RlTWFwcyk7CitDUERGX0NNYXBNYW5hZ2VyOjpDUERGX0NNYXBNYW5hZ2VyKCkgeworICBtX2JQcm9tcHRlZCA9IEZBTFNFOworICBGWFNZU19tZW1zZXQobV9DSUQyVW5pY29kZU1hcHMsIDAsIHNpemVvZiBtX0NJRDJVbmljb2RlTWFwcyk7CiB9Ci1DUERGX0NNYXBNYW5hZ2VyOjp+Q1BERl9DTWFwTWFuYWdlcigpCi17Ci0gICAgRHJvcEFsbChGQUxTRSk7CitDUERGX0NNYXBNYW5hZ2VyOjp+Q1BERl9DTWFwTWFuYWdlcigpIHsKKyAgRHJvcEFsbChGQUxTRSk7CiB9Ci1DUERGX0NNYXAqIENQREZfQ01hcE1hbmFnZXI6OkdldFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJQcm9tcHRDSkspCi17CitDUERGX0NNYXAqIENQREZfQ01hcE1hbmFnZXI6OkdldFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm9tcHRDSkspIHsKKyAgQ1BERl9DTWFwKiBwQ01hcDsKKyAgaWYgKG1fQ01hcHMuTG9va3VwKG5hbWUsICh2b2lkKiYpcENNYXApKSB7CisgICAgcmV0dXJuIHBDTWFwOworICB9CisgIHBDTWFwID0gTG9hZFByZWRlZmluZWRDTWFwKG5hbWUsIGJQcm9tcHRDSkspOworICBpZiAobmFtZS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gcENNYXA7CisgIH0KKyAgbV9DTWFwcy5TZXRBdChuYW1lLCBwQ01hcCk7CisgIHJldHVybiBwQ01hcDsKK30KK0NQREZfQ01hcCogQ1BERl9DTWFwTWFuYWdlcjo6TG9hZFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvbXB0Q0pLKSB7CisgIENQREZfQ01hcCogcENNYXAgPSBuZXcgQ1BERl9DTWFwOworICBjb25zdCBGWF9DSEFSKiBwbmFtZSA9IG5hbWU7CisgIGlmICgqcG5hbWUgPT0gJy8nKSB7CisgICAgcG5hbWUrKzsKKyAgfQorICBwQ01hcC0+TG9hZFByZWRlZmluZWQodGhpcywgcG5hbWUsIGJQcm9tcHRDSkspOworICByZXR1cm4gcENNYXA7Cit9CitzdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgZ19DaGFyc2V0TmFtZXNbTlVNQkVSX09GX0NJRFNFVFNdID0geworICAgIE5VTEwsICJHQjEiLCAiQ05TMSIsICJKYXBhbjEiLCAiS29yZWExIiwgIlVDUyJ9Oworc3RhdGljIGNvbnN0IGludCBnX0NoYXJzZXRDUHNbTlVNQkVSX09GX0NJRFNFVFNdID0gezAsICAgOTM2LCA5NTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTMyLCA5NDksIDEyMDB9OworaW50IF9DaGFyc2V0RnJvbU9yZGVyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBPcmRlcmluZykgeworICBmb3IgKGludCBjaGFyc2V0ID0gMTsgY2hhcnNldCA8IE5VTUJFUl9PRl9DSURTRVRTOyBjaGFyc2V0KyspIHsKKyAgICBpZiAoT3JkZXJpbmcgPT0gQ0ZYX0J5dGVTdHJpbmdDKGdfQ2hhcnNldE5hbWVzW2NoYXJzZXRdKSkKKyAgICAgIHJldHVybiBjaGFyc2V0OworICB9CisgIHJldHVybiBDSURTRVRfVU5LTk9XTjsKK30KK3ZvaWQgQ1BERl9DTWFwTWFuYWdlcjo6UmVsb2FkQWxsKCkgeworICBEcm9wQWxsKFRSVUUpOworfQordm9pZCBDUERGX0NNYXBNYW5hZ2VyOjpEcm9wQWxsKEZYX0JPT0wgYlJlbG9hZCkgeworICBGWF9QT1NJVElPTiBwb3MgPSBtX0NNYXBzLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENGWF9CeXRlU3RyaW5nIG5hbWU7CiAgICAgQ1BERl9DTWFwKiBwQ01hcDsKLSAgICBpZiAobV9DTWFwcy5Mb29rdXAobmFtZSwgKHZvaWQqJilwQ01hcCkpIHsKLSAgICAgICAgcmV0dXJuIHBDTWFwOworICAgIG1fQ01hcHMuR2V0TmV4dEFzc29jKHBvcywgbmFtZSwgKHZvaWQqJilwQ01hcCk7CisgICAgaWYgKHBDTWFwID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBwQ01hcCA9IExvYWRQcmVkZWZpbmVkQ01hcChuYW1lLCBiUHJvbXB0Q0pLKTsKLSAgICBpZiAobmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIHBDTWFwOwotICAgIH0KLSAgICBtX0NNYXBzLlNldEF0KG5hbWUsIHBDTWFwKTsKLSAgICByZXR1cm4gcENNYXA7Ci19Ci1DUERGX0NNYXAqIENQREZfQ01hcE1hbmFnZXI6OkxvYWRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgRlhfQk9PTCBiUHJvbXB0Q0pLKQotewotICAgIENQREZfQ01hcCogcENNYXAgPSBuZXcgQ1BERl9DTWFwOwotICAgIGNvbnN0IEZYX0NIQVIqIHBuYW1lID0gbmFtZTsKLSAgICBpZiAoKnBuYW1lID09ICcvJykgewotICAgICAgICBwbmFtZSArKzsKLSAgICB9Ci0gICAgcENNYXAtPkxvYWRQcmVkZWZpbmVkKHRoaXMsIHBuYW1lLCBiUHJvbXB0Q0pLKTsKLSAgICByZXR1cm4gcENNYXA7Ci19Ci1zdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgZ19DaGFyc2V0TmFtZXNbTlVNQkVSX09GX0NJRFNFVFNdID0ge05VTEwsICJHQjEiLCAiQ05TMSIsICJKYXBhbjEiLCAiS29yZWExIiwgIlVDUyIgfTsKLXN0YXRpYyBjb25zdCBpbnQgZ19DaGFyc2V0Q1BzW05VTUJFUl9PRl9DSURTRVRTXSA9IHswLCA5MzYsIDk1MCwgOTMyLCA5NDksIDEyMDAgfTsKLWludCBfQ2hhcnNldEZyb21PcmRlcmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgT3JkZXJpbmcpCi17Ci0JZm9yIChpbnQgY2hhcnNldCA9IDE7IGNoYXJzZXQgPCBOVU1CRVJfT0ZfQ0lEU0VUUzsgY2hhcnNldCsrKSB7Ci0JCWlmIChPcmRlcmluZyA9PSBDRlhfQnl0ZVN0cmluZ0MoZ19DaGFyc2V0TmFtZXNbY2hhcnNldF0pKQotCQkJcmV0dXJuIGNoYXJzZXQ7Ci0JfQotCXJldHVybiBDSURTRVRfVU5LTk9XTjsKLX0KLXZvaWQgQ1BERl9DTWFwTWFuYWdlcjo6UmVsb2FkQWxsKCkKLXsKLSAgICBEcm9wQWxsKFRSVUUpOwotfQotdm9pZCBDUERGX0NNYXBNYW5hZ2VyOjpEcm9wQWxsKEZYX0JPT0wgYlJlbG9hZCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0NNYXBzLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWU7Ci0gICAgICAgIENQREZfQ01hcCogcENNYXA7Ci0gICAgICAgIG1fQ01hcHMuR2V0TmV4dEFzc29jKHBvcywgbmFtZSwgKHZvaWQqJilwQ01hcCk7Ci0gICAgICAgIGlmIChwQ01hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYlJlbG9hZCkgewotICAgICAgICAgICAgcENNYXAtPkxvYWRQcmVkZWZpbmVkKHRoaXMsIG5hbWUsIEZBTFNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQ01hcDsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZiBtX0NJRDJVbmljb2RlTWFwcyAvIHNpemVvZihDUERGX0NJRDJVbmljb2RlTWFwKik7IGkgKyspIHsKLSAgICAgICAgQ1BERl9DSUQyVW5pY29kZU1hcCogcE1hcCA9IG1fQ0lEMlVuaWNvZGVNYXBzW2ldOwotICAgICAgICBpZiAocE1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYlJlbG9hZCkgewotICAgICAgICAgICAgcE1hcC0+TG9hZCh0aGlzLCBpLCBGQUxTRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWxldGUgcE1hcDsKLSAgICAgICAgfQotICAgIH0KLX0KLUNQREZfQ0lEMlVuaWNvZGVNYXAqIENQREZfQ01hcE1hbmFnZXI6OkdldENJRDJVbmljb2RlTWFwKGludCBjaGFyc2V0LCBGWF9CT09MIGJQcm9tcHRDSkspCi17Ci0gICAgaWYgKG1fQ0lEMlVuaWNvZGVNYXBzW2NoYXJzZXRdID09IE5VTEwpIHsKLSAgICAgICAgbV9DSUQyVW5pY29kZU1hcHNbY2hhcnNldF0gPSBMb2FkQ0lEMlVuaWNvZGVNYXAoY2hhcnNldCwgYlByb21wdENKSyk7Ci0gICAgfQotICAgIHJldHVybiBtX0NJRDJVbmljb2RlTWFwc1tjaGFyc2V0XTsKLX0KLUNQREZfQ0lEMlVuaWNvZGVNYXAqIENQREZfQ01hcE1hbmFnZXI6OkxvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0Q0pLKQotewotICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqIHBNYXAgPSBuZXcgQ1BERl9DSUQyVW5pY29kZU1hcCgpOwotICAgIGlmICghcE1hcC0+SW5pdGlhbGl6ZSgpKSB7Ci0gICAgICAgIGRlbGV0ZSBwTWFwOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcE1hcC0+TG9hZCh0aGlzLCBjaGFyc2V0LCBiUHJvbXB0Q0pLKTsKLSAgICByZXR1cm4gcE1hcDsKLX0KLUNQREZfQ01hcFBhcnNlcjo6Q1BERl9DTWFwUGFyc2VyKCkKLXsKLSAgICBtX3BDTWFwID0gTlVMTDsKLSAgICBtX1N0YXR1cyA9IDA7Ci0gICAgbV9Db2RlU2VxID0gMDsKLX0KLUZYX0JPT0wJQ1BERl9DTWFwUGFyc2VyOjpJbml0aWFsaXplKENQREZfQ01hcCogcENNYXApCi17Ci0gICAgbV9wQ01hcCA9IHBDTWFwOwotICAgIG1fU3RhdHVzID0gMDsKLSAgICBtX0NvZGVTZXEgPSAwOwotICAgIG1fQWRkTWFwcy5Fc3RpbWF0ZVNpemUoMCwgMTAyNDApOwotICAgIHJldHVybiBUUlVFOwotfQotc3RhdGljIEZYX0RXT1JEIENNYXBfR2V0Q29kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpCi17Ci0gICAgaW50IG51bSA9IDA7Ci0gICAgaWYgKHdvcmQuR2V0QXQoMCkgPT0gJzwnKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgd29yZC5HZXRMZW5ndGgoKTsgaSArKykgewotICAgICAgICAgICAgdWludDhfdCBkaWdpdCA9IHdvcmQuR2V0QXQoaSk7Ci0gICAgICAgICAgICBpZiAoZGlnaXQgPj0gJzAnICYmIGRpZ2l0IDw9ICc5JykgewotICAgICAgICAgICAgICAgIGRpZ2l0ID0gZGlnaXQgLSAnMCc7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0ID49ICdhJyAmJiBkaWdpdCA8PSAnZicpIHsKLSAgICAgICAgICAgICAgICBkaWdpdCA9IGRpZ2l0IC0gJ2EnICsgMTA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0ID49ICdBJyAmJiBkaWdpdCA8PSAnRicpIHsKLSAgICAgICAgICAgICAgICBkaWdpdCA9IGRpZ2l0IC0gJ0EnICsgMTA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW0gPSBudW0gKiAxNiArIGRpZ2l0OwotICAgICAgICB9CisgICAgaWYgKGJSZWxvYWQpIHsKKyAgICAgIHBDTWFwLT5Mb2FkUHJlZGVmaW5lZCh0aGlzLCBuYW1lLCBGQUxTRSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JkLkdldExlbmd0aCgpOyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAod29yZC5HZXRBdChpKSA8ICcwJyB8fCB3b3JkLkdldEF0KGkpID4gJzknKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG51bSA9IG51bSAqIDEwICsgd29yZC5HZXRBdChpKSAtICcwJzsKLSAgICAgICAgfQorICAgICAgZGVsZXRlIHBDTWFwOwogICAgIH0KLSAgICByZXR1cm4gbnVtOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mIG1fQ0lEMlVuaWNvZGVNYXBzIC8gc2l6ZW9mKENQREZfQ0lEMlVuaWNvZGVNYXAqKTsKKyAgICAgICBpKyspIHsKKyAgICBDUERGX0NJRDJVbmljb2RlTWFwKiBwTWFwID0gbV9DSUQyVW5pY29kZU1hcHNbaV07CisgICAgaWYgKHBNYXAgPT0gTlVMTCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChiUmVsb2FkKSB7CisgICAgICBwTWFwLT5Mb2FkKHRoaXMsIGksIEZBTFNFKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVsZXRlIHBNYXA7CisgICAgfQorICB9CiB9Ci1zdGF0aWMgRlhfQk9PTCBfQ01hcF9HZXRDb2RlUmFuZ2UoX0NNYXBfQ29kZVJhbmdlJiByYW5nZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaXJzdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzZWNvbmQpCi17Ci0gICAgaWYgKGZpcnN0LkdldExlbmd0aCgpID09IDAgfHwgZmlyc3QuR2V0QXQoMCkgIT0gJzwnKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMTsgaSA8IGZpcnN0LkdldExlbmd0aCgpOyBpICsrKQotICAgICAgICBpZiAoZmlyc3QuR2V0QXQoaSkgPT0gJz4nKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIHJhbmdlLm1fQ2hhclNpemUgPSAoaSAtIDEpIC8gMjsKLSAgICBpZiAocmFuZ2UubV9DaGFyU2l6ZSA+IDQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2UubV9DaGFyU2l6ZTsgaSArKykgewotICAgICAgICB1aW50OF90IGRpZ2l0MSA9IGZpcnN0LkdldEF0KGkgKiAyICsgMSk7Ci0gICAgICAgIHVpbnQ4X3QgZGlnaXQyID0gZmlyc3QuR2V0QXQoaSAqIDIgKyAyKTsKLSAgICAgICAgdWludDhfdCBieXRlID0gKGRpZ2l0MSA+PSAnMCcgJiYgZGlnaXQxIDw9ICc5JykgPyAoZGlnaXQxIC0gJzAnKSA6ICgoZGlnaXQxICYgMHhkZikgLSAnQScgKyAxMCk7Ci0gICAgICAgIGJ5dGUgPSBieXRlICogMTYgKyAoKGRpZ2l0MiA+PSAnMCcgJiYgZGlnaXQyIDw9ICc5JykgPyAoZGlnaXQyIC0gJzAnKSA6ICgoZGlnaXQyICYgMHhkZikgLSAnQScgKyAxMCkpOwotICAgICAgICByYW5nZS5tX0xvd2VyW2ldID0gYnl0ZTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgc2l6ZSA9IHNlY29uZC5HZXRMZW5ndGgoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2UubV9DaGFyU2l6ZTsgaSArKykgewotICAgICAgICB1aW50OF90IGRpZ2l0MSA9ICgoRlhfRFdPUkQpaSAqIDIgKyAxIDwgc2l6ZSkgPyBzZWNvbmQuR2V0QXQoKEZYX1NUUlNJWkUpaSAqIDIgKyAxKSA6IDA7Ci0gICAgICAgIHVpbnQ4X3QgZGlnaXQyID0gKChGWF9EV09SRClpICogMiArIDIgPCBzaXplKSA/IHNlY29uZC5HZXRBdCgoRlhfU1RSU0laRSlpICogMiArIDIpIDogMDsKLSAgICAgICAgdWludDhfdCBieXRlID0gKGRpZ2l0MSA+PSAnMCcgJiYgZGlnaXQxIDw9ICc5JykgPyAoZGlnaXQxIC0gJzAnKSA6ICgoZGlnaXQxICYgMHhkZikgLSAnQScgKyAxMCk7Ci0gICAgICAgIGJ5dGUgPSBieXRlICogMTYgKyAoKGRpZ2l0MiA+PSAnMCcgJiYgZGlnaXQyIDw9ICc5JykgPyAoZGlnaXQyIC0gJzAnKSA6ICgoZGlnaXQyICYgMHhkZikgLSAnQScgKyAxMCkpOwotICAgICAgICByYW5nZS5tX1VwcGVyW2ldID0gYnl0ZTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CitDUERGX0NJRDJVbmljb2RlTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpHZXRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByb21wdENKSykgeworICBpZiAobV9DSUQyVW5pY29kZU1hcHNbY2hhcnNldF0gPT0gTlVMTCkgeworICAgIG1fQ0lEMlVuaWNvZGVNYXBzW2NoYXJzZXRdID0gTG9hZENJRDJVbmljb2RlTWFwKGNoYXJzZXQsIGJQcm9tcHRDSkspOworICB9CisgIHJldHVybiBtX0NJRDJVbmljb2RlTWFwc1tjaGFyc2V0XTsKIH0KLXN0YXRpYyBDRlhfQnl0ZVN0cmluZyBDTWFwX0dldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpCi17Ci0gICAgcmV0dXJuIHdvcmQuTWlkKDEsIHdvcmQuR2V0TGVuZ3RoKCkgLSAyKTsKK0NQREZfQ0lEMlVuaWNvZGVNYXAqIENQREZfQ01hcE1hbmFnZXI6OkxvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm9tcHRDSkspIHsKKyAgQ1BERl9DSUQyVW5pY29kZU1hcCogcE1hcCA9IG5ldyBDUERGX0NJRDJVbmljb2RlTWFwKCk7CisgIGlmICghcE1hcC0+SW5pdGlhbGl6ZSgpKSB7CisgICAgZGVsZXRlIHBNYXA7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcE1hcC0+TG9hZCh0aGlzLCBjaGFyc2V0LCBiUHJvbXB0Q0pLKTsKKyAgcmV0dXJuIHBNYXA7CiB9Ci12b2lkIENQREZfQ01hcFBhcnNlcjo6UGFyc2VXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgd29yZCkKLXsKLSAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKK0NQREZfQ01hcFBhcnNlcjo6Q1BERl9DTWFwUGFyc2VyKCkgeworICBtX3BDTWFwID0gTlVMTDsKKyAgbV9TdGF0dXMgPSAwOworICBtX0NvZGVTZXEgPSAwOworfQorRlhfQk9PTCBDUERGX0NNYXBQYXJzZXI6OkluaXRpYWxpemUoQ1BERl9DTWFwKiBwQ01hcCkgeworICBtX3BDTWFwID0gcENNYXA7CisgIG1fU3RhdHVzID0gMDsKKyAgbV9Db2RlU2VxID0gMDsKKyAgbV9BZGRNYXBzLkVzdGltYXRlU2l6ZSgwLCAxMDI0MCk7CisgIHJldHVybiBUUlVFOworfQorc3RhdGljIEZYX0RXT1JEIENNYXBfR2V0Q29kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpIHsKKyAgaW50IG51bSA9IDA7CisgIGlmICh3b3JkLkdldEF0KDApID09ICc8JykgeworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgd29yZC5HZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICB1aW50OF90IGRpZ2l0ID0gd29yZC5HZXRBdChpKTsKKyAgICAgIGlmIChkaWdpdCA+PSAnMCcgJiYgZGlnaXQgPD0gJzknKSB7CisgICAgICAgIGRpZ2l0ID0gZGlnaXQgLSAnMCc7CisgICAgICB9IGVsc2UgaWYgKGRpZ2l0ID49ICdhJyAmJiBkaWdpdCA8PSAnZicpIHsKKyAgICAgICAgZGlnaXQgPSBkaWdpdCAtICdhJyArIDEwOworICAgICAgfSBlbHNlIGlmIChkaWdpdCA+PSAnQScgJiYgZGlnaXQgPD0gJ0YnKSB7CisgICAgICAgIGRpZ2l0ID0gZGlnaXQgLSAnQScgKyAxMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudW07CisgICAgICB9CisgICAgICBudW0gPSBudW0gKiAxNiArIGRpZ2l0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmQuR2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgaWYgKHdvcmQuR2V0QXQoaSkgPCAnMCcgfHwgd29yZC5HZXRBdChpKSA+ICc5JykgeworICAgICAgICByZXR1cm4gbnVtOworICAgICAgfQorICAgICAgbnVtID0gbnVtICogMTAgKyB3b3JkLkdldEF0KGkpIC0gJzAnOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtOworfQorc3RhdGljIEZYX0JPT0wgX0NNYXBfR2V0Q29kZVJhbmdlKF9DTWFwX0NvZGVSYW5nZSYgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNlY29uZCkgeworICBpZiAoZmlyc3QuR2V0TGVuZ3RoKCkgPT0gMCB8fCBmaXJzdC5HZXRBdCgwKSAhPSAnPCcpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IGk7CisgIGZvciAoaSA9IDE7IGkgPCBmaXJzdC5HZXRMZW5ndGgoKTsgaSsrKQorICAgIGlmIChmaXJzdC5HZXRBdChpKSA9PSAnPicpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmFuZ2UubV9DaGFyU2l6ZSA9IChpIC0gMSkgLyAyOworICBpZiAocmFuZ2UubV9DaGFyU2l6ZSA+IDQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHJhbmdlLm1fQ2hhclNpemU7IGkrKykgeworICAgIHVpbnQ4X3QgZGlnaXQxID0gZmlyc3QuR2V0QXQoaSAqIDIgKyAxKTsKKyAgICB1aW50OF90IGRpZ2l0MiA9IGZpcnN0LkdldEF0KGkgKiAyICsgMik7CisgICAgdWludDhfdCBieXRlID0gKGRpZ2l0MSA+PSAnMCcgJiYgZGlnaXQxIDw9ICc5JykKKyAgICAgICAgICAgICAgICAgICAgICAgPyAoZGlnaXQxIC0gJzAnKQorICAgICAgICAgICAgICAgICAgICAgICA6ICgoZGlnaXQxICYgMHhkZikgLSAnQScgKyAxMCk7CisgICAgYnl0ZSA9IGJ5dGUgKiAxNiArICgoZGlnaXQyID49ICcwJyAmJiBkaWdpdDIgPD0gJzknKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGRpZ2l0MiAtICcwJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoZGlnaXQyICYgMHhkZikgLSAnQScgKyAxMCkpOworICAgIHJhbmdlLm1fTG93ZXJbaV0gPSBieXRlOworICB9CisgIEZYX0RXT1JEIHNpemUgPSBzZWNvbmQuR2V0TGVuZ3RoKCk7CisgIGZvciAoaSA9IDA7IGkgPCByYW5nZS5tX0NoYXJTaXplOyBpKyspIHsKKyAgICB1aW50OF90IGRpZ2l0MSA9CisgICAgICAgICgoRlhfRFdPUkQpaSAqIDIgKyAxIDwgc2l6ZSkgPyBzZWNvbmQuR2V0QXQoKEZYX1NUUlNJWkUpaSAqIDIgKyAxKSA6IDA7CisgICAgdWludDhfdCBkaWdpdDIgPQorICAgICAgICAoKEZYX0RXT1JEKWkgKiAyICsgMiA8IHNpemUpID8gc2Vjb25kLkdldEF0KChGWF9TVFJTSVpFKWkgKiAyICsgMikgOiAwOworICAgIHVpbnQ4X3QgYnl0ZSA9IChkaWdpdDEgPj0gJzAnICYmIGRpZ2l0MSA8PSAnOScpCisgICAgICAgICAgICAgICAgICAgICAgID8gKGRpZ2l0MSAtICcwJykKKyAgICAgICAgICAgICAgICAgICAgICAgOiAoKGRpZ2l0MSAmIDB4ZGYpIC0gJ0EnICsgMTApOworICAgIGJ5dGUgPSBieXRlICogMTYgKyAoKGRpZ2l0MiA+PSAnMCcgJiYgZGlnaXQyIDw9ICc5JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChkaWdpdDIgLSAnMCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGRpZ2l0MiAmIDB4ZGYpIC0gJ0EnICsgMTApKTsKKyAgICByYW5nZS5tX1VwcGVyW2ldID0gYnl0ZTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK3N0YXRpYyBDRlhfQnl0ZVN0cmluZyBDTWFwX0dldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpIHsKKyAgcmV0dXJuIHdvcmQuTWlkKDEsIHdvcmQuR2V0TGVuZ3RoKCkgLSAyKTsKK30KK3ZvaWQgQ1BERl9DTWFwUGFyc2VyOjpQYXJzZVdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB3b3JkKSB7CisgIGlmICh3b3JkLklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAod29yZCA9PSBGWF9CU1RSQygiYmVnaW5jaWRjaGFyIikpIHsKKyAgICBtX1N0YXR1cyA9IDE7CisgICAgbV9Db2RlU2VxID0gMDsKKyAgfSBlbHNlIGlmICh3b3JkID09IEZYX0JTVFJDKCJiZWdpbmNpZHJhbmdlIikpIHsKKyAgICBtX1N0YXR1cyA9IDI7CisgICAgbV9Db2RlU2VxID0gMDsKKyAgfSBlbHNlIGlmICh3b3JkID09IEZYX0JTVFJDKCJlbmRjaWRyYW5nZSIpIHx8CisgICAgICAgICAgICAgd29yZCA9PSBGWF9CU1RSQygiZW5kY2lkY2hhciIpKSB7CisgICAgbV9TdGF0dXMgPSAwOworICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9XTW9kZSIpKSB7CisgICAgbV9TdGF0dXMgPSA2OworICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9SZWdpc3RyeSIpKSB7CisgICAgbV9TdGF0dXMgPSAzOworICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9PcmRlcmluZyIpKSB7CisgICAgbV9TdGF0dXMgPSA0OworICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9TdXBwbGVtZW50IikpIHsKKyAgICBtX1N0YXR1cyA9IDU7CisgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygiYmVnaW5jb2Rlc3BhY2VyYW5nZSIpKSB7CisgICAgbV9TdGF0dXMgPSA3OworICAgIG1fQ29kZVNlcSA9IDA7CisgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygidXNlY21hcCIpKSB7CisgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gMSB8fCBtX1N0YXR1cyA9PSAyKSB7CisgICAgbV9Db2RlUG9pbnRzW21fQ29kZVNlcV0gPSBDTWFwX0dldENvZGUod29yZCk7CisgICAgbV9Db2RlU2VxKys7CisgICAgRlhfRFdPUkQgU3RhcnRDb2RlLCBFbmRDb2RlOworICAgIEZYX1dPUkQgU3RhcnRDSUQ7CisgICAgaWYgKG1fU3RhdHVzID09IDEpIHsKKyAgICAgIGlmIChtX0NvZGVTZXEgPCAyKSB7CiAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIEVuZENvZGUgPSBTdGFydENvZGUgPSBtX0NvZGVQb2ludHNbMF07CisgICAgICBTdGFydENJRCA9IChGWF9XT1JEKW1fQ29kZVBvaW50c1sxXTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1fQ29kZVNlcSA8IDMpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgU3RhcnRDb2RlID0gbV9Db2RlUG9pbnRzWzBdOworICAgICAgRW5kQ29kZSA9IG1fQ29kZVBvaW50c1sxXTsKKyAgICAgIFN0YXJ0Q0lEID0gKEZYX1dPUkQpbV9Db2RlUG9pbnRzWzJdOwogICAgIH0KLSAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiYmVnaW5jaWRjaGFyIikpIHsKLSAgICAgICAgbV9TdGF0dXMgPSAxOwotICAgICAgICBtX0NvZGVTZXEgPSAwOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygiYmVnaW5jaWRyYW5nZSIpKSB7Ci0gICAgICAgIG1fU3RhdHVzID0gMjsKLSAgICAgICAgbV9Db2RlU2VxID0gMDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoImVuZGNpZHJhbmdlIikgfHwgd29yZCA9PSBGWF9CU1RSQygiZW5kY2lkY2hhciIpKSB7Ci0gICAgICAgIG1fU3RhdHVzID0gMDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9XTW9kZSIpKSB7Ci0gICAgICAgIG1fU3RhdHVzID0gNjsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9SZWdpc3RyeSIpKSB7Ci0gICAgICAgIG1fU3RhdHVzID0gMzsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9PcmRlcmluZyIpKSB7Ci0gICAgICAgIG1fU3RhdHVzID0gNDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9TdXBwbGVtZW50IikpIHsKLSAgICAgICAgbV9TdGF0dXMgPSA1OwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygiYmVnaW5jb2Rlc3BhY2VyYW5nZSIpKSB7Ci0gICAgICAgIG1fU3RhdHVzID0gNzsKLSAgICAgICAgbV9Db2RlU2VxID0gMDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoInVzZWNtYXAiKSkgewotICAgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gMSB8fCBtX1N0YXR1cyA9PSAyKSB7Ci0gICAgICAgIG1fQ29kZVBvaW50c1ttX0NvZGVTZXFdID0gQ01hcF9HZXRDb2RlKHdvcmQpOwotICAgICAgICBtX0NvZGVTZXEgKys7Ci0gICAgICAgIEZYX0RXT1JEIFN0YXJ0Q29kZSwgRW5kQ29kZTsKLSAgICAgICAgRlhfV09SRCBTdGFydENJRDsKLSAgICAgICAgaWYgKG1fU3RhdHVzID09IDEpIHsKLSAgICAgICAgICAgIGlmIChtX0NvZGVTZXEgPCAyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW5kQ29kZSA9IFN0YXJ0Q29kZSA9IG1fQ29kZVBvaW50c1swXTsKLSAgICAgICAgICAgIFN0YXJ0Q0lEID0gKEZYX1dPUkQpbV9Db2RlUG9pbnRzWzFdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fQ29kZVNlcSA8IDMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdGFydENvZGUgPSBtX0NvZGVQb2ludHNbMF07Ci0gICAgICAgICAgICBFbmRDb2RlID0gbV9Db2RlUG9pbnRzWzFdOwotICAgICAgICAgICAgU3RhcnRDSUQgPSAoRlhfV09SRCltX0NvZGVQb2ludHNbMl07CisgICAgaWYgKEVuZENvZGUgPCAweDEwMDAwKSB7CisgICAgICBmb3IgKEZYX0RXT1JEIGNvZGUgPSBTdGFydENvZGU7IGNvZGUgPD0gRW5kQ29kZTsgY29kZSsrKSB7CisgICAgICAgIG1fcENNYXAtPm1fcE1hcHBpbmdbY29kZV0gPSAoRlhfV09SRCkoU3RhcnRDSUQgKyBjb2RlIC0gU3RhcnRDb2RlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgRlhfRFdPUkQgYnVmWzJdOworICAgICAgYnVmWzBdID0gU3RhcnRDb2RlOworICAgICAgYnVmWzFdID0gKChFbmRDb2RlIC0gU3RhcnRDb2RlKSA8PCAxNikgKyBTdGFydENJRDsKKyAgICAgIG1fQWRkTWFwcy5BcHBlbmRCbG9jayhidWYsIHNpemVvZiBidWYpOworICAgIH0KKyAgICBtX0NvZGVTZXEgPSAwOworICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDMpIHsKKyAgICBDTWFwX0dldFN0cmluZyh3b3JkKTsKKyAgICBtX1N0YXR1cyA9IDA7CisgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gNCkgeworICAgIG1fcENNYXAtPm1fQ2hhcnNldCA9IF9DaGFyc2V0RnJvbU9yZGVyaW5nKENNYXBfR2V0U3RyaW5nKHdvcmQpKTsKKyAgICBtX1N0YXR1cyA9IDA7CisgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gNSkgeworICAgIENNYXBfR2V0Q29kZSh3b3JkKTsKKyAgICBtX1N0YXR1cyA9IDA7CisgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gNikgeworICAgIG1fcENNYXAtPm1fYlZlcnRpY2FsID0gQ01hcF9HZXRDb2RlKHdvcmQpOworICAgIG1fU3RhdHVzID0gMDsKKyAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSA3KSB7CisgICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoImVuZGNvZGVzcGFjZXJhbmdlIikpIHsKKyAgICAgIGludCBuU2VncyA9IG1fQ29kZVJhbmdlcy5HZXRTaXplKCk7CisgICAgICBpZiAoblNlZ3MgPiAxKSB7CisgICAgICAgIG1fcENNYXAtPm1fQ29kaW5nU2NoZW1lID0gQ1BERl9DTWFwOjpNaXhlZEZvdXJCeXRlczsKKyAgICAgICAgbV9wQ01hcC0+bV9uQ29kZVJhbmdlcyA9IG5TZWdzOworICAgICAgICBtX3BDTWFwLT5tX3BMZWFkaW5nQnl0ZXMgPQorICAgICAgICAgICAgRlhfQWxsb2MyRCh1aW50OF90LCBuU2Vncywgc2l6ZW9mKF9DTWFwX0NvZGVSYW5nZSkpOworICAgICAgICBGWFNZU19tZW1jcHkobV9wQ01hcC0+bV9wTGVhZGluZ0J5dGVzLCBtX0NvZGVSYW5nZXMuR2V0RGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgblNlZ3MgKiBzaXplb2YoX0NNYXBfQ29kZVJhbmdlKSk7CisgICAgICB9IGVsc2UgaWYgKG5TZWdzID09IDEpIHsKKyAgICAgICAgbV9wQ01hcC0+bV9Db2RpbmdTY2hlbWUgPSAobV9Db2RlUmFuZ2VzWzBdLm1fQ2hhclNpemUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDUERGX0NNYXA6OlR3b0J5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ1BERl9DTWFwOjpPbmVCeXRlOworICAgICAgfQorICAgICAgbV9TdGF0dXMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwIHx8IHdvcmQuR2V0QXQoMCkgIT0gJzwnKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChtX0NvZGVTZXEgJSAyKSB7CisgICAgICAgIF9DTWFwX0NvZGVSYW5nZSByYW5nZTsKKyAgICAgICAgaWYgKF9DTWFwX0dldENvZGVSYW5nZShyYW5nZSwgbV9MYXN0V29yZCwgd29yZCkpIHsKKyAgICAgICAgICBtX0NvZGVSYW5nZXMuQWRkKHJhbmdlKTsKICAgICAgICAgfQotICAgICAgICBpZiAoRW5kQ29kZSA8IDB4MTAwMDApIHsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgY29kZSA9IFN0YXJ0Q29kZTsgY29kZSA8PSBFbmRDb2RlOyBjb2RlICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9wQ01hcC0+bV9wTWFwcGluZ1tjb2RlXSA9IChGWF9XT1JEKShTdGFydENJRCArIGNvZGUgLSBTdGFydENvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhfRFdPUkQgYnVmWzJdOwotICAgICAgICAgICAgYnVmWzBdID0gU3RhcnRDb2RlOwotICAgICAgICAgICAgYnVmWzFdID0gKChFbmRDb2RlIC0gU3RhcnRDb2RlKSA8PCAxNikgKyBTdGFydENJRDsKLSAgICAgICAgICAgIG1fQWRkTWFwcy5BcHBlbmRCbG9jayhidWYsIHNpemVvZiBidWYpOwotICAgICAgICB9Ci0gICAgICAgIG1fQ29kZVNlcSA9IDA7Ci0gICAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSAzKSB7Ci0gICAgICAgIENNYXBfR2V0U3RyaW5nKHdvcmQpOwotICAgICAgICBtX1N0YXR1cyA9IDA7Ci0gICAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSA0KSB7Ci0gICAgICAgIG1fcENNYXAtPm1fQ2hhcnNldCA9IF9DaGFyc2V0RnJvbU9yZGVyaW5nKENNYXBfR2V0U3RyaW5nKHdvcmQpKTsKLSAgICAgICAgbV9TdGF0dXMgPSAwOwotICAgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gNSkgewotICAgICAgICBDTWFwX0dldENvZGUod29yZCk7Ci0gICAgICAgIG1fU3RhdHVzID0gMDsKLSAgICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDYpIHsKLSAgICAgICAgbV9wQ01hcC0+bV9iVmVydGljYWwgPSBDTWFwX0dldENvZGUod29yZCk7Ci0gICAgICAgIG1fU3RhdHVzID0gMDsKLSAgICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDcpIHsKLSAgICAgICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoImVuZGNvZGVzcGFjZXJhbmdlIikpIHsKLSAgICAgICAgICAgIGludCBuU2VncyA9IG1fQ29kZVJhbmdlcy5HZXRTaXplKCk7Ci0gICAgICAgICAgICBpZiAoblNlZ3MgPiAxKSB7Ci0gICAgICAgICAgICAgICAgbV9wQ01hcC0+bV9Db2RpbmdTY2hlbWUgPSBDUERGX0NNYXA6Ok1peGVkRm91ckJ5dGVzOwotICAgICAgICAgICAgICAgIG1fcENNYXAtPm1fbkNvZGVSYW5nZXMgPSBuU2VnczsKLSAgICAgICAgICAgICAgICBtX3BDTWFwLT5tX3BMZWFkaW5nQnl0ZXMgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG5TZWdzLCBzaXplb2YoX0NNYXBfQ29kZVJhbmdlKSk7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcENNYXAtPm1fcExlYWRpbmdCeXRlcywgbV9Db2RlUmFuZ2VzLkdldERhdGEoKSwgblNlZ3MgKiBzaXplb2YoX0NNYXBfQ29kZVJhbmdlKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5TZWdzID09IDEpIHsKLSAgICAgICAgICAgICAgICBtX3BDTWFwLT5tX0NvZGluZ1NjaGVtZSA9IChtX0NvZGVSYW5nZXNbMF0ubV9DaGFyU2l6ZSA9PSAyKSA/IENQREZfQ01hcDo6VHdvQnl0ZXMgOiBDUERGX0NNYXA6Ok9uZUJ5dGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX1N0YXR1cyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwIHx8IHdvcmQuR2V0QXQoMCkgIT0gJzwnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fQ29kZVNlcSAlIDIpIHsKLSAgICAgICAgICAgICAgICBfQ01hcF9Db2RlUmFuZ2UgcmFuZ2U7Ci0gICAgICAgICAgICAgICAgaWYgKF9DTWFwX0dldENvZGVSYW5nZShyYW5nZSwgbV9MYXN0V29yZCwgd29yZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Db2RlUmFuZ2VzLkFkZChyYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9Db2RlU2VxICsrOwotICAgICAgICB9CisgICAgICB9CisgICAgICBtX0NvZGVTZXErKzsKICAgICB9Ci0gICAgbV9MYXN0V29yZCA9IHdvcmQ7CisgIH0KKyAgbV9MYXN0V29yZCA9IHdvcmQ7CiB9Ci1DUERGX0NNYXA6OkNQREZfQ01hcCgpCi17Ci0gICAgbV9DaGFyc2V0ID0gQ0lEU0VUX1VOS05PV047Ci0gICAgbV9Db2RpbmcgPSBDSURDT0RJTkdfVU5LTk9XTjsKLSAgICBtX0NvZGluZ1NjaGVtZSA9IFR3b0J5dGVzOwotICAgIG1fYlZlcnRpY2FsID0gMDsKLSAgICBtX2JMb2FkZWQgPSBGQUxTRTsKLSAgICBtX3BNYXBwaW5nID0gTlVMTDsKLSAgICBtX3BMZWFkaW5nQnl0ZXMgPSBOVUxMOwotICAgIG1fcEFkZE1hcHBpbmcgPSBOVUxMOwotICAgIG1fcEVtYmVkTWFwID0gTlVMTDsKLSAgICBtX3BVc2VNYXAgPSBOVUxMOwotICAgIG1fbkNvZGVSYW5nZXMgPSAwOworQ1BERl9DTWFwOjpDUERGX0NNYXAoKSB7CisgIG1fQ2hhcnNldCA9IENJRFNFVF9VTktOT1dOOworICBtX0NvZGluZyA9IENJRENPRElOR19VTktOT1dOOworICBtX0NvZGluZ1NjaGVtZSA9IFR3b0J5dGVzOworICBtX2JWZXJ0aWNhbCA9IDA7CisgIG1fYkxvYWRlZCA9IEZBTFNFOworICBtX3BNYXBwaW5nID0gTlVMTDsKKyAgbV9wTGVhZGluZ0J5dGVzID0gTlVMTDsKKyAgbV9wQWRkTWFwcGluZyA9IE5VTEw7CisgIG1fcEVtYmVkTWFwID0gTlVMTDsKKyAgbV9wVXNlTWFwID0gTlVMTDsKKyAgbV9uQ29kZVJhbmdlcyA9IDA7CiB9Ci1DUERGX0NNYXA6On5DUERGX0NNYXAoKQotewotICAgIGlmIChtX3BNYXBwaW5nKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wTWFwcGluZyk7Ci0gICAgfQotICAgIGlmIChtX3BBZGRNYXBwaW5nKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQWRkTWFwcGluZyk7Ci0gICAgfQotICAgIGlmIChtX3BMZWFkaW5nQnl0ZXMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BMZWFkaW5nQnl0ZXMpOwotICAgIH0KLSAgICBkZWxldGUgbV9wVXNlTWFwOworQ1BERl9DTWFwOjp+Q1BERl9DTWFwKCkgeworICBpZiAobV9wTWFwcGluZykgeworICAgIEZYX0ZyZWUobV9wTWFwcGluZyk7CisgIH0KKyAgaWYgKG1fcEFkZE1hcHBpbmcpIHsKKyAgICBGWF9GcmVlKG1fcEFkZE1hcHBpbmcpOworICB9CisgIGlmIChtX3BMZWFkaW5nQnl0ZXMpIHsKKyAgICBGWF9GcmVlKG1fcExlYWRpbmdCeXRlcyk7CisgIH0KKyAgZGVsZXRlIG1fcFVzZU1hcDsKIH0KLXZvaWQgQ1BERl9DTWFwOjpSZWxlYXNlKCkKLXsKLSAgICBpZiAobV9QcmVkZWZpbmVkQ01hcC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQordm9pZCBDUERGX0NNYXA6OlJlbGVhc2UoKSB7CisgIGlmIChtX1ByZWRlZmluZWRDTWFwLklzRW1wdHkoKSkgeworICAgIGRlbGV0ZSB0aGlzOworICB9CiB9CiBjb25zdCBDUERGX1ByZWRlZmluZWRDTWFwIGdfUHJlZGVmaW5lZENNYXBzW10gPSB7Ci0gICAgeyAiR0ItRVVDIiwgQ0lEU0VUX0dCMSwgQ0lEQ09ESU5HX0dCLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDEsIHsweGExLCAweGZlfSB9LAotICAgIHsgIkdCcGMtRVVDIiwgQ0lEU0VUX0dCMSwgQ0lEQ09ESU5HX0dCLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDEsIHsweGExLCAweGZjfSB9LAotICAgIHsgIkdCSy1FVUMiLCBDSURTRVRfR0IxLCBDSURDT0RJTkdfR0IsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMSwgezB4ODEsIDB4ZmV9IH0sCi0gICAgeyAiR0JLcC1FVUMiLCBDSURTRVRfR0IxLCBDSURDT0RJTkdfR0IsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMSwgezB4ODEsIDB4ZmV9IH0sCi0gICAgeyAiR0JLMkstRVVDIiwgQ0lEU0VUX0dCMSwgQ0lEQ09ESU5HX0dCLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDEsIHsweDgxLCAweGZlfSB9LAotICAgIHsgIkdCSzJLIiwgQ0lEU0VUX0dCMSwgQ0lEQ09ESU5HX0dCLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDEsIHsweDgxLCAweGZlfSB9LAotICAgIHsgIlVuaUdCLVVDUzIiLCBDSURTRVRfR0IxLCBDSURDT0RJTkdfVUNTMiwgQ1BERl9DTWFwOjpUd29CeXRlcyB9LAotICAgIHsgIlVuaUdCLVVURjE2IiwgQ0lEU0VUX0dCMSwgQ0lEQ09ESU5HX1VURjE2LCBDUERGX0NNYXA6OlR3b0J5dGVzIH0sCi0gICAgeyAiQjVwYyIsIENJRFNFVF9DTlMxLCBDSURDT0RJTkdfQklHNSwgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAxLCB7MHhhMSwgMHhmY30gfSwKLSAgICB7ICJIS3Njcy1CNSIsIENJRFNFVF9DTlMxLCBDSURDT0RJTkdfQklHNSwgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAxLCB7MHg4OCwgMHhmZX0gfSwKLSAgICB7ICJFVGVuLUI1IiwgQ0lEU0VUX0NOUzEsIENJRENPRElOR19CSUc1LCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDEsIHsweGExLCAweGZlfSB9LAotICAgIHsgIkVUZW5tcy1CNSIsIENJRFNFVF9DTlMxLCBDSURDT0RJTkdfQklHNSwgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAxLCB7MHhhMSwgMHhmZX0gfSwKLSAgICB7ICJVbmlDTlMtVUNTMiIsIENJRFNFVF9DTlMxLCBDSURDT0RJTkdfVUNTMiwgQ1BERl9DTWFwOjpUd29CeXRlcyB9LAotICAgIHsgIlVuaUNOUy1VVEYxNiIsIENJRFNFVF9DTlMxLCBDSURDT0RJTkdfVVRGMTYsIENQREZfQ01hcDo6VHdvQnl0ZXMgfSwKLSAgICB7ICI4M3B2LVJLU0oiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfSklTLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDIsIHsweDgxLCAweDlmLCAweGUwLCAweGZjfSB9LAotICAgIHsgIjkwbXMtUktTSiIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19KSVMsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMiwgezB4ODEsIDB4OWYsIDB4ZTAsIDB4ZmN9IH0sCi0gICAgeyAiOTBtc3AtUktTSiIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19KSVMsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMiwgezB4ODEsIDB4OWYsIDB4ZTAsIDB4ZmN9IH0sCi0gICAgeyAiOTBwdi1SS1NKIiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX0pJUywgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAyLCB7MHg4MSwgMHg5ZiwgMHhlMCwgMHhmY30gfSwKLSAgICB7ICJBZGQtUktTSiIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19KSVMsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMiwgezB4ODEsIDB4OWYsIDB4ZTAsIDB4ZmN9IH0sCi0gICAgeyAiRVVDIiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX0pJUywgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAyLCB7MHg4ZSwgMHg4ZSwgMHhhMSwgMHhmZX0gfSwKLSAgICB7ICJIIiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX0pJUywgQ1BERl9DTWFwOjpUd29CeXRlcywgMSwgezB4MjEsIDB4N2V9IH0sCi0gICAgeyAiViIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19KSVMsIENQREZfQ01hcDo6VHdvQnl0ZXMsIDEsIHsweDIxLCAweDdlfSB9LAotICAgIHsgIkV4dC1SS1NKIiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX0pJUywgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAyLCB7MHg4MSwgMHg5ZiwgMHhlMCwgMHhmY30gfSwKLSAgICB7ICJVbmlKSVMtVUNTMiIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19VQ1MyLCBDUERGX0NNYXA6OlR3b0J5dGVzIH0sCi0gICAgeyAiVW5pSklTLVVDUzItSFciLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfVUNTMiwgQ1BERl9DTWFwOjpUd29CeXRlcyB9LAotICAgIHsgIlVuaUpJUy1VVEYxNiIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19VVEYxNiwgQ1BERl9DTWFwOjpUd29CeXRlcyB9LAotICAgIHsgIktTQy1FVUMiLCBDSURTRVRfS09SRUExLCBDSURDT0RJTkdfS09SRUEsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMSwgezB4YTEsIDB4ZmV9IH0sCi0gICAgeyAiS1NDbXMtVUhDIiwgQ0lEU0VUX0tPUkVBMSwgQ0lEQ09ESU5HX0tPUkVBLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDEsIHsweDgxLCAweGZlfSB9LAotICAgIHsgIktTQ21zLVVIQy1IVyIsIENJRFNFVF9LT1JFQTEsIENJRENPRElOR19LT1JFQSwgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAxLCB7MHg4MSwgMHhmZX0gfSwKLSAgICB7ICJLU0NwYy1FVUMiLCBDSURTRVRfS09SRUExLCBDSURDT0RJTkdfS09SRUEsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMSwgezB4YTEsIDB4ZmR9IH0sCi0gICAgeyAiVW5pS1MtVUNTMiIsIENJRFNFVF9LT1JFQTEsIENJRENPRElOR19VQ1MyLCBDUERGX0NNYXA6OlR3b0J5dGVzIH0sCi0gICAgeyAiVW5pS1MtVVRGMTYiLCBDSURTRVRfS09SRUExLCBDSURDT0RJTkdfVVRGMTYsIENQREZfQ01hcDo6VHdvQnl0ZXMgfSwKLSAgICB7IE5VTEwsIDAsIDAgfQotfTsKLWV4dGVybiB2b2lkIEZQREZBUElfRmluZEVtYmVkZGVkQ01hcChjb25zdCBjaGFyKiBuYW1lLCBpbnQgY2hhcnNldCwgaW50IGNvZGluZywgY29uc3QgRlhDTUFQX0NNYXAqJiBwTWFwKTsKLWV4dGVybiBGWF9XT1JEIEZQREZBUElfQ0lERnJvbUNoYXJDb2RlKGNvbnN0IEZYQ01BUF9DTWFwKiBwTWFwLCBGWF9EV09SRCBjaGFyY29kZSk7Ci1GWF9CT09MIENQREZfQ01hcDo6TG9hZFByZWRlZmluZWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgY29uc3QgRlhfQ0hBUiogcE5hbWUsIEZYX0JPT0wgYlByb21wdENKSykKLXsKLSAgICBtX1ByZWRlZmluZWRDTWFwID0gcE5hbWU7Ci0gICAgaWYgKG1fUHJlZGVmaW5lZENNYXAgPT0gRlhfQlNUUkMoIklkZW50aXR5LUgiKSB8fCBtX1ByZWRlZmluZWRDTWFwID09IEZYX0JTVFJDKCJJZGVudGl0eS1WIikpIHsKLSAgICAgICAgbV9Db2RpbmcgPSBDSURDT0RJTkdfQ0lEOwotICAgICAgICBtX2JWZXJ0aWNhbCA9IHBOYW1lWzldID09ICdWJzsKLSAgICAgICAgbV9iTG9hZGVkID0gVFJVRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNtYXBpZCA9IG1fUHJlZGVmaW5lZENNYXA7Ci0gICAgbV9iVmVydGljYWwgPSBjbWFwaWQuUmlnaHQoMSkgPT0gRlhfQlNUUkMoIlYiKTsKLSAgICBpZiAoY21hcGlkLkdldExlbmd0aCgpID4gMikgewotICAgICAgICBjbWFwaWQgPSBjbWFwaWQuTGVmdChjbWFwaWQuR2V0TGVuZ3RoKCkgLSAyKTsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoZ19QcmVkZWZpbmVkQ01hcHNbaW5kZXhdLm1fcE5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbWFwaWQgPT0gQ0ZYX0J5dGVTdHJpbmdDKGdfUHJlZGVmaW5lZENNYXBzW2luZGV4XS5tX3BOYW1lKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaW5kZXggKys7Ci0gICAgfQotICAgIGNvbnN0IENQREZfUHJlZGVmaW5lZENNYXAmIG1hcCA9IGdfUHJlZGVmaW5lZENNYXBzW2luZGV4XTsKLSAgICBtX0NoYXJzZXQgPSBtYXAubV9DaGFyc2V0OwotICAgIG1fQ29kaW5nID0gbWFwLm1fQ29kaW5nOwotICAgIG1fQ29kaW5nU2NoZW1lID0gbWFwLm1fQ29kaW5nU2NoZW1lOwotICAgIGlmIChtX0NvZGluZ1NjaGVtZSA9PSBNaXhlZFR3b0J5dGVzKSB7Ci0gICAgICAgIG1fcExlYWRpbmdCeXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDI1Nik7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtYXAubV9MZWFkaW5nU2VnQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGIgPSBtYXAubV9MZWFkaW5nU2Vnc1tpICogMl07IGIgPD0gbWFwLm1fTGVhZGluZ1NlZ3NbaSAqIDIgKyAxXTsgYiArKykgewotICAgICAgICAgICAgICAgIG1fcExlYWRpbmdCeXRlc1tiXSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlBERkFQSV9GaW5kRW1iZWRkZWRDTWFwKHBOYW1lLCBtX0NoYXJzZXQsIG1fQ29kaW5nLCBtX3BFbWJlZE1hcCk7Ci0gICAgaWYgKG1fcEVtYmVkTWFwKSB7Ci0gICAgICAgIG1fYkxvYWRlZCA9IFRSVUU7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1leHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IGNvbXBhcmVfZHdvcmQoY29uc3Qgdm9pZCogZGF0YTEsIGNvbnN0IHZvaWQqIGRhdGEyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgqKEZYX0RXT1JEKilkYXRhMSkgLSAoKihGWF9EV09SRCopZGF0YTIpOwotICAgIH0KLX07Ci1GWF9CT09MIENQREZfQ01hcDo6TG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKQotewotICAgIG1fcE1hcHBpbmcgPSBGWF9BbGxvYyhGWF9XT1JELCA2NTUzNik7Ci0gICAgQ1BERl9DTWFwUGFyc2VyIHBhcnNlcjsKLSAgICBwYXJzZXIuSW5pdGlhbGl6ZSh0aGlzKTsKLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgocERhdGEsIHNpemUpOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gc3ludGF4LkdldFdvcmQoKTsKLSAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwYXJzZXIuUGFyc2VXb3JkKHdvcmQpOwotICAgIH0KLSAgICBpZiAobV9Db2RpbmdTY2hlbWUgPT0gTWl4ZWRGb3VyQnl0ZXMgJiYgcGFyc2VyLm1fQWRkTWFwcy5HZXRTaXplKCkpIHsKLSAgICAgICAgbV9wQWRkTWFwcGluZyA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBhcnNlci5tX0FkZE1hcHMuR2V0U2l6ZSgpICsgNCk7Ci0gICAgICAgICooRlhfRFdPUkQqKW1fcEFkZE1hcHBpbmcgPSBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSAvIDg7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BBZGRNYXBwaW5nICsgNCwgcGFyc2VyLm1fQWRkTWFwcy5HZXRCdWZmZXIoKSwgcGFyc2VyLm1fQWRkTWFwcy5HZXRTaXplKCkpOwotICAgICAgICBGWFNZU19xc29ydChtX3BBZGRNYXBwaW5nICsgNCwgcGFyc2VyLm1fQWRkTWFwcy5HZXRTaXplKCkgLyA4LCA4LCBjb21wYXJlX2R3b3JkKTsKLSAgICB9CisgICAgeyJHQi1FVUMiLAorICAgICBDSURTRVRfR0IxLAorICAgICBDSURDT0RJTkdfR0IsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAgezB4YTEsIDB4ZmV9fSwKKyAgICB7IkdCcGMtRVVDIiwKKyAgICAgQ0lEU0VUX0dCMSwKKyAgICAgQ0lEQ09ESU5HX0dCLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHsweGExLCAweGZjfX0sCisgICAgeyJHQkstRVVDIiwKKyAgICAgQ0lEU0VUX0dCMSwKKyAgICAgQ0lEQ09ESU5HX0dCLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHsweDgxLCAweGZlfX0sCisgICAgeyJHQktwLUVVQyIsCisgICAgIENJRFNFVF9HQjEsCisgICAgIENJRENPRElOR19HQiwKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAxLAorICAgICB7MHg4MSwgMHhmZX19LAorICAgIHsiR0JLMkstRVVDIiwKKyAgICAgQ0lEU0VUX0dCMSwKKyAgICAgQ0lEQ09ESU5HX0dCLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHsweDgxLCAweGZlfX0sCisgICAgeyJHQksySyIsCisgICAgIENJRFNFVF9HQjEsCisgICAgIENJRENPRElOR19HQiwKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAxLAorICAgICB7MHg4MSwgMHhmZX19LAorICAgIHsiVW5pR0ItVUNTMiIsIENJRFNFVF9HQjEsIENJRENPRElOR19VQ1MyLCBDUERGX0NNYXA6OlR3b0J5dGVzfSwKKyAgICB7IlVuaUdCLVVURjE2IiwgQ0lEU0VUX0dCMSwgQ0lEQ09ESU5HX1VURjE2LCBDUERGX0NNYXA6OlR3b0J5dGVzfSwKKyAgICB7IkI1cGMiLAorICAgICBDSURTRVRfQ05TMSwKKyAgICAgQ0lEQ09ESU5HX0JJRzUsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAgezB4YTEsIDB4ZmN9fSwKKyAgICB7IkhLc2NzLUI1IiwKKyAgICAgQ0lEU0VUX0NOUzEsCisgICAgIENJRENPRElOR19CSUc1LAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHsweDg4LCAweGZlfX0sCisgICAgeyJFVGVuLUI1IiwKKyAgICAgQ0lEU0VUX0NOUzEsCisgICAgIENJRENPRElOR19CSUc1LAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHsweGExLCAweGZlfX0sCisgICAgeyJFVGVubXMtQjUiLAorICAgICBDSURTRVRfQ05TMSwKKyAgICAgQ0lEQ09ESU5HX0JJRzUsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAgezB4YTEsIDB4ZmV9fSwKKyAgICB7IlVuaUNOUy1VQ1MyIiwgQ0lEU0VUX0NOUzEsIENJRENPRElOR19VQ1MyLCBDUERGX0NNYXA6OlR3b0J5dGVzfSwKKyAgICB7IlVuaUNOUy1VVEYxNiIsIENJRFNFVF9DTlMxLCBDSURDT0RJTkdfVVRGMTYsIENQREZfQ01hcDo6VHdvQnl0ZXN9LAorICAgIHsiODNwdi1SS1NKIiwKKyAgICAgQ0lEU0VUX0pBUEFOMSwKKyAgICAgQ0lEQ09ESU5HX0pJUywKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAyLAorICAgICB7MHg4MSwgMHg5ZiwgMHhlMCwgMHhmY319LAorICAgIHsiOTBtcy1SS1NKIiwKKyAgICAgQ0lEU0VUX0pBUEFOMSwKKyAgICAgQ0lEQ09ESU5HX0pJUywKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAyLAorICAgICB7MHg4MSwgMHg5ZiwgMHhlMCwgMHhmY319LAorICAgIHsiOTBtc3AtUktTSiIsCisgICAgIENJRFNFVF9KQVBBTjEsCisgICAgIENJRENPRElOR19KSVMsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMiwKKyAgICAgezB4ODEsIDB4OWYsIDB4ZTAsIDB4ZmN9fSwKKyAgICB7IjkwcHYtUktTSiIsCisgICAgIENJRFNFVF9KQVBBTjEsCisgICAgIENJRENPRElOR19KSVMsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMiwKKyAgICAgezB4ODEsIDB4OWYsIDB4ZTAsIDB4ZmN9fSwKKyAgICB7IkFkZC1SS1NKIiwKKyAgICAgQ0lEU0VUX0pBUEFOMSwKKyAgICAgQ0lEQ09ESU5HX0pJUywKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAyLAorICAgICB7MHg4MSwgMHg5ZiwgMHhlMCwgMHhmY319LAorICAgIHsiRVVDIiwKKyAgICAgQ0lEU0VUX0pBUEFOMSwKKyAgICAgQ0lEQ09ESU5HX0pJUywKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAyLAorICAgICB7MHg4ZSwgMHg4ZSwgMHhhMSwgMHhmZX19LAorICAgIHsiSCIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19KSVMsIENQREZfQ01hcDo6VHdvQnl0ZXMsIDEsIHsweDIxLCAweDdlfX0sCisgICAgeyJWIiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX0pJUywgQ1BERl9DTWFwOjpUd29CeXRlcywgMSwgezB4MjEsIDB4N2V9fSwKKyAgICB7IkV4dC1SS1NKIiwKKyAgICAgQ0lEU0VUX0pBUEFOMSwKKyAgICAgQ0lEQ09ESU5HX0pJUywKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAyLAorICAgICB7MHg4MSwgMHg5ZiwgMHhlMCwgMHhmY319LAorICAgIHsiVW5pSklTLVVDUzIiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfVUNTMiwgQ1BERl9DTWFwOjpUd29CeXRlc30sCisgICAgeyJVbmlKSVMtVUNTMi1IVyIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19VQ1MyLCBDUERGX0NNYXA6OlR3b0J5dGVzfSwKKyAgICB7IlVuaUpJUy1VVEYxNiIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19VVEYxNiwgQ1BERl9DTWFwOjpUd29CeXRlc30sCisgICAgeyJLU0MtRVVDIiwKKyAgICAgQ0lEU0VUX0tPUkVBMSwKKyAgICAgQ0lEQ09ESU5HX0tPUkVBLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHsweGExLCAweGZlfX0sCisgICAgeyJLU0Ntcy1VSEMiLAorICAgICBDSURTRVRfS09SRUExLAorICAgICBDSURDT0RJTkdfS09SRUEsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAgezB4ODEsIDB4ZmV9fSwKKyAgICB7IktTQ21zLVVIQy1IVyIsCisgICAgIENJRFNFVF9LT1JFQTEsCisgICAgIENJRENPRElOR19LT1JFQSwKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAxLAorICAgICB7MHg4MSwgMHhmZX19LAorICAgIHsiS1NDcGMtRVVDIiwKKyAgICAgQ0lEU0VUX0tPUkVBMSwKKyAgICAgQ0lEQ09ESU5HX0tPUkVBLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHsweGExLCAweGZkfX0sCisgICAgeyJVbmlLUy1VQ1MyIiwgQ0lEU0VUX0tPUkVBMSwgQ0lEQ09ESU5HX1VDUzIsIENQREZfQ01hcDo6VHdvQnl0ZXN9LAorICAgIHsiVW5pS1MtVVRGMTYiLCBDSURTRVRfS09SRUExLCBDSURDT0RJTkdfVVRGMTYsIENQREZfQ01hcDo6VHdvQnl0ZXN9LAorICAgIHtOVUxMLCAwLCAwfX07CitleHRlcm4gdm9pZCBGUERGQVBJX0ZpbmRFbWJlZGRlZENNYXAoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYQ01BUF9DTWFwKiYgcE1hcCk7CitleHRlcm4gRlhfV09SRCBGUERGQVBJX0NJREZyb21DaGFyQ29kZShjb25zdCBGWENNQVBfQ01hcCogcE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlKTsKK0ZYX0JPT0wgQ1BERl9DTWFwOjpMb2FkUHJlZGVmaW5lZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByb21wdENKSykgeworICBtX1ByZWRlZmluZWRDTWFwID0gcE5hbWU7CisgIGlmIChtX1ByZWRlZmluZWRDTWFwID09IEZYX0JTVFJDKCJJZGVudGl0eS1IIikgfHwKKyAgICAgIG1fUHJlZGVmaW5lZENNYXAgPT0gRlhfQlNUUkMoIklkZW50aXR5LVYiKSkgeworICAgIG1fQ29kaW5nID0gQ0lEQ09ESU5HX0NJRDsKKyAgICBtX2JWZXJ0aWNhbCA9IHBOYW1lWzldID09ICdWJzsKKyAgICBtX2JMb2FkZWQgPSBUUlVFOwogICAgIHJldHVybiBUUlVFOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNtYXBpZCA9IG1fUHJlZGVmaW5lZENNYXA7CisgIG1fYlZlcnRpY2FsID0gY21hcGlkLlJpZ2h0KDEpID09IEZYX0JTVFJDKCJWIik7CisgIGlmIChjbWFwaWQuR2V0TGVuZ3RoKCkgPiAyKSB7CisgICAgY21hcGlkID0gY21hcGlkLkxlZnQoY21hcGlkLkdldExlbmd0aCgpIC0gMik7CisgIH0KKyAgaW50IGluZGV4ID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoZ19QcmVkZWZpbmVkQ01hcHNbaW5kZXhdLm1fcE5hbWUgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoY21hcGlkID09IENGWF9CeXRlU3RyaW5nQyhnX1ByZWRlZmluZWRDTWFwc1tpbmRleF0ubV9wTmFtZSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpbmRleCsrOworICB9CisgIGNvbnN0IENQREZfUHJlZGVmaW5lZENNYXAmIG1hcCA9IGdfUHJlZGVmaW5lZENNYXBzW2luZGV4XTsKKyAgbV9DaGFyc2V0ID0gbWFwLm1fQ2hhcnNldDsKKyAgbV9Db2RpbmcgPSBtYXAubV9Db2Rpbmc7CisgIG1fQ29kaW5nU2NoZW1lID0gbWFwLm1fQ29kaW5nU2NoZW1lOworICBpZiAobV9Db2RpbmdTY2hlbWUgPT0gTWl4ZWRUd29CeXRlcykgeworICAgIG1fcExlYWRpbmdCeXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDI1Nik7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1hcC5tX0xlYWRpbmdTZWdDb3VudDsgaSsrKSB7CisgICAgICBmb3IgKGludCBiID0gbWFwLm1fTGVhZGluZ1NlZ3NbaSAqIDJdOyBiIDw9IG1hcC5tX0xlYWRpbmdTZWdzW2kgKiAyICsgMV07CisgICAgICAgICAgIGIrKykgeworICAgICAgICBtX3BMZWFkaW5nQnl0ZXNbYl0gPSAxOworICAgICAgfQorICAgIH0KKyAgfQorICBGUERGQVBJX0ZpbmRFbWJlZGRlZENNYXAocE5hbWUsIG1fQ2hhcnNldCwgbV9Db2RpbmcsIG1fcEVtYmVkTWFwKTsKKyAgaWYgKG1fcEVtYmVkTWFwKSB7CisgICAgbV9iTG9hZGVkID0gVFJVRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IGNvbXBhcmVDSUQoY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiBlbGVtZW50KQotICAgIHsKLSAgICAgICAgaWYgKCgqKEZYX0RXT1JEKilrZXkpIDwgKCooRlhfRFdPUkQqKWVsZW1lbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCgqKEZYX0RXT1JEKilrZXkpID4gKCooRlhfRFdPUkQqKWVsZW1lbnQpICsgKChGWF9EV09SRCopZWxlbWVudClbMV0gLyA2NTUzNikgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorc3RhdGljIGludCBjb21wYXJlX2R3b3JkKGNvbnN0IHZvaWQqIGRhdGExLCBjb25zdCB2b2lkKiBkYXRhMikgeworICByZXR1cm4gKCooRlhfRFdPUkQqKWRhdGExKSAtICgqKEZYX0RXT1JEKilkYXRhMik7Cit9CiB9OwotRlhfV09SRCBDUERGX0NNYXA6OkNJREZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKLXsKLSAgICBpZiAobV9Db2RpbmcgPT0gQ0lEQ09ESU5HX0NJRCkgewotICAgICAgICByZXR1cm4gKEZYX1dPUkQpY2hhcmNvZGU7CitGWF9CT09MIENQREZfQ01hcDo6TG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKSB7CisgIG1fcE1hcHBpbmcgPSBGWF9BbGxvYyhGWF9XT1JELCA2NTUzNik7CisgIENQREZfQ01hcFBhcnNlciBwYXJzZXI7CisgIHBhcnNlci5Jbml0aWFsaXplKHRoaXMpOworICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgocERhdGEsIHNpemUpOworICB3aGlsZSAoMSkgeworICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gc3ludGF4LkdldFdvcmQoKTsKKyAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBpZiAobV9wRW1iZWRNYXApIHsKLSAgICAgICAgcmV0dXJuIEZQREZBUElfQ0lERnJvbUNoYXJDb2RlKG1fcEVtYmVkTWFwLCBjaGFyY29kZSk7Ci0gICAgfQotICAgIGlmIChtX3BNYXBwaW5nID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChGWF9XT1JEKWNoYXJjb2RlOwotICAgIH0KLSAgICBpZiAoY2hhcmNvZGUgPj4gMTYpIHsKLSAgICAgICAgaWYgKG1fcEFkZE1hcHBpbmcpIHsKLSAgICAgICAgICAgIHZvaWQqIGZvdW5kID0gRlhTWVNfYnNlYXJjaCgmY2hhcmNvZGUsIG1fcEFkZE1hcHBpbmcgKyA0LCAqKEZYX0RXT1JEKiltX3BBZGRNYXBwaW5nLCA4LCBjb21wYXJlQ0lEKTsKLSAgICAgICAgICAgIGlmIChmb3VuZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcFVzZU1hcCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9wVXNlTWFwLT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoRlhfV09SRCkoKChGWF9EV09SRCopZm91bmQpWzFdICUgNjU1MzYgKyBjaGFyY29kZSAtICogKEZYX0RXT1JEKilmb3VuZCk7Ci0gICAgICAgIH0KKyAgICBwYXJzZXIuUGFyc2VXb3JkKHdvcmQpOworICB9CisgIGlmIChtX0NvZGluZ1NjaGVtZSA9PSBNaXhlZEZvdXJCeXRlcyAmJiBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSkgeworICAgIG1fcEFkZE1hcHBpbmcgPSBGWF9BbGxvYyh1aW50OF90LCBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSArIDQpOworICAgICooRlhfRFdPUkQqKW1fcEFkZE1hcHBpbmcgPSBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSAvIDg7CisgICAgRlhTWVNfbWVtY3B5KG1fcEFkZE1hcHBpbmcgKyA0LCBwYXJzZXIubV9BZGRNYXBzLkdldEJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSk7CisgICAgRlhTWVNfcXNvcnQobV9wQWRkTWFwcGluZyArIDQsIHBhcnNlci5tX0FkZE1hcHMuR2V0U2l6ZSgpIC8gOCwgOCwKKyAgICAgICAgICAgICAgICBjb21wYXJlX2R3b3JkKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK2V4dGVybiAiQyIgeworc3RhdGljIGludCBjb21wYXJlQ0lEKGNvbnN0IHZvaWQqIGtleSwgY29uc3Qgdm9pZCogZWxlbWVudCkgeworICBpZiAoKCooRlhfRFdPUkQqKWtleSkgPCAoKihGWF9EV09SRCopZWxlbWVudCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKCgqKEZYX0RXT1JEKilrZXkpID4KKyAgICAgICgqKEZYX0RXT1JEKillbGVtZW50KSArICgoRlhfRFdPUkQqKWVsZW1lbnQpWzFdIC8gNjU1MzYpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KK307CitGWF9XT1JEIENQREZfQ01hcDo6Q0lERnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCB7CisgIGlmIChtX0NvZGluZyA9PSBDSURDT0RJTkdfQ0lEKSB7CisgICAgcmV0dXJuIChGWF9XT1JEKWNoYXJjb2RlOworICB9CisgIGlmIChtX3BFbWJlZE1hcCkgeworICAgIHJldHVybiBGUERGQVBJX0NJREZyb21DaGFyQ29kZShtX3BFbWJlZE1hcCwgY2hhcmNvZGUpOworICB9CisgIGlmIChtX3BNYXBwaW5nID09IE5VTEwpIHsKKyAgICByZXR1cm4gKEZYX1dPUkQpY2hhcmNvZGU7CisgIH0KKyAgaWYgKGNoYXJjb2RlID4+IDE2KSB7CisgICAgaWYgKG1fcEFkZE1hcHBpbmcpIHsKKyAgICAgIHZvaWQqIGZvdW5kID0gRlhTWVNfYnNlYXJjaCgmY2hhcmNvZGUsIG1fcEFkZE1hcHBpbmcgKyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKW1fcEFkZE1hcHBpbmcsIDgsIGNvbXBhcmVDSUQpOworICAgICAgaWYgKGZvdW5kID09IE5VTEwpIHsKICAgICAgICAgaWYgKG1fcFVzZU1hcCkgewotICAgICAgICAgICAgcmV0dXJuIG1fcFVzZU1hcC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgICAgICByZXR1cm4gbV9wVXNlTWFwLT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcmV0dXJuIChGWF9XT1JEKSgoKEZYX0RXT1JEKilmb3VuZClbMV0gJSA2NTUzNiArIGNoYXJjb2RlIC0KKyAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZm91bmQpOwogICAgIH0KLSAgICBGWF9EV09SRCBDSUQgPSBtX3BNYXBwaW5nW2NoYXJjb2RlXTsKLSAgICBpZiAoIUNJRCAmJiBtX3BVc2VNYXApIHsKLSAgICAgICAgcmV0dXJuIG1fcFVzZU1hcC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIChGWF9XT1JEKUNJRDsKLX0KLXN0YXRpYyBpbnQgX0NoZWNrQ29kZVJhbmdlKHVpbnQ4X3QqIGNvZGVzLCBpbnQgc2l6ZSwgX0NNYXBfQ29kZVJhbmdlKiBwUmFuZ2VzLCBpbnQgblJhbmdlcykKLXsKLSAgICBpbnQgaVNlZyA9IG5SYW5nZXMgLSAxOwotICAgIHdoaWxlIChpU2VnID49IDApIHsKLSAgICAgICAgaWYgKHBSYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSA8IHNpemUpIHsKLSAgICAgICAgICAgIGlTZWcgLS07Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgaUNoYXIgPSAwOwotICAgICAgICB3aGlsZSAoaUNoYXIgPCBzaXplKSB7Ci0gICAgICAgICAgICBpZiAoY29kZXNbaUNoYXJdIDwgcFJhbmdlc1tpU2VnXS5tX0xvd2VyW2lDaGFyXSB8fAotICAgICAgICAgICAgICAgICAgICBjb2Rlc1tpQ2hhcl0gPiBwUmFuZ2VzW2lTZWddLm1fVXBwZXJbaUNoYXJdKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpQ2hhciArKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoaUNoYXIgPT0gcFJhbmdlc1tpU2VnXS5tX0NoYXJTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaUNoYXIpIHsKLSAgICAgICAgICAgIGlmIChzaXplID09IHBSYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaVNlZyAtLTsKKyAgICBpZiAobV9wVXNlTWFwKSB7CisgICAgICByZXR1cm4gbV9wVXNlTWFwLT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwogICAgIH0KICAgICByZXR1cm4gMDsKKyAgfQorICBGWF9EV09SRCBDSUQgPSBtX3BNYXBwaW5nW2NoYXJjb2RlXTsKKyAgaWYgKCFDSUQgJiYgbV9wVXNlTWFwKSB7CisgICAgcmV0dXJuIG1fcFVzZU1hcC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgfQorICByZXR1cm4gKEZYX1dPUkQpQ0lEOwogfQotRlhfRFdPUkQgQ1BERl9DTWFwOjpHZXROZXh0Q2hhcihjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgblN0ckxlbiwgaW50JiBvZmZzZXQpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX0NvZGluZ1NjaGVtZSkgewotICAgICAgICBjYXNlIE9uZUJ5dGU6Ci0gICAgICAgICAgICByZXR1cm4gKCh1aW50OF90KilwU3RyaW5nKVtvZmZzZXQrK107Ci0gICAgICAgIGNhc2UgVHdvQnl0ZXM6Ci0gICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgIHJldHVybiAoKHVpbnQ4X3QqKXBTdHJpbmcpW29mZnNldCAtIDJdICogMjU2ICsgKCh1aW50OF90KilwU3RyaW5nKVtvZmZzZXQgLSAxXTsKLSAgICAgICAgY2FzZSBNaXhlZFR3b0J5dGVzOiB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBieXRlMSA9ICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0KytdOwotICAgICAgICAgICAgICAgIGlmICghbV9wTGVhZGluZ0J5dGVzW2J5dGUxXSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnl0ZTIgPSAoKHVpbnQ4X3QqKXBTdHJpbmcpW29mZnNldCsrXTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZTEgKiAyNTYgKyBieXRlMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBNaXhlZEZvdXJCeXRlczogewotICAgICAgICAgICAgICAgIHVpbnQ4X3QgY29kZXNbNF07Ci0gICAgICAgICAgICAgICAgaW50IGNoYXJfc2l6ZSA9IDE7Ci0gICAgICAgICAgICAgICAgY29kZXNbMF0gPSAoKHVpbnQ4X3QqKXBTdHJpbmcpW29mZnNldCsrXTsKLSAgICAgICAgICAgICAgICBfQ01hcF9Db2RlUmFuZ2UqIHBSYW5nZXMgPSAoX0NNYXBfQ29kZVJhbmdlKiltX3BMZWFkaW5nQnl0ZXM7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IF9DaGVja0NvZGVSYW5nZShjb2RlcywgY2hhcl9zaXplLCBwUmFuZ2VzLCBtX25Db2RlUmFuZ2VzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhcl9zaXplOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmNvZGUgPSAoY2hhcmNvZGUgPDwgOCkgKyBjb2Rlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFyY29kZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcl9zaXplID09IDQgfHwgb2Zmc2V0ID09IG5TdHJMZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVzW2NoYXJfc2l6ZSArK10gPSAoKHVpbnQ4X3QqKXBTdHJpbmcpW29mZnNldCsrXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CitzdGF0aWMgaW50IF9DaGVja0NvZGVSYW5nZSh1aW50OF90KiBjb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NNYXBfQ29kZVJhbmdlKiBwUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5SYW5nZXMpIHsKKyAgaW50IGlTZWcgPSBuUmFuZ2VzIC0gMTsKKyAgd2hpbGUgKGlTZWcgPj0gMCkgeworICAgIGlmIChwUmFuZ2VzW2lTZWddLm1fQ2hhclNpemUgPCBzaXplKSB7CisgICAgICBpU2VnLS07CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1pbnQgQ1BERl9DTWFwOjpHZXRDaGFyU2l6ZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKG1fQ29kaW5nU2NoZW1lKSB7Ci0gICAgICAgIGNhc2UgT25lQnl0ZToKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICBjYXNlIFR3b0J5dGVzOgotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIGNhc2UgTWl4ZWRUd29CeXRlczoKLSAgICAgICAgY2FzZSBNaXhlZEZvdXJCeXRlczoKLSAgICAgICAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMDAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMDAwMDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiA0OworICAgIGludCBpQ2hhciA9IDA7CisgICAgd2hpbGUgKGlDaGFyIDwgc2l6ZSkgeworICAgICAgaWYgKGNvZGVzW2lDaGFyXSA8IHBSYW5nZXNbaVNlZ10ubV9Mb3dlcltpQ2hhcl0gfHwKKyAgICAgICAgICBjb2Rlc1tpQ2hhcl0gPiBwUmFuZ2VzW2lTZWddLm1fVXBwZXJbaUNoYXJdKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaUNoYXIrKzsKICAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci1pbnQgQ1BERl9DTWFwOjpDb3VudENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywgaW50IHNpemUpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX0NvZGluZ1NjaGVtZSkgewotICAgICAgICBjYXNlIE9uZUJ5dGU6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgY2FzZSBUd29CeXRlczoKLSAgICAgICAgICAgIHJldHVybiAoc2l6ZSArIDEpIC8gMjsKLSAgICAgICAgY2FzZSBNaXhlZFR3b0J5dGVzOiB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQgKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BMZWFkaW5nQnl0ZXNbKCh1aW50OF90KilwU3RyaW5nKVtpXV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE1peGVkRm91ckJ5dGVzOiB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMCwgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBHZXROZXh0Q2hhcihwU3RyaW5nLCBzaXplLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICAgICAgfQorICAgIGlmIChpQ2hhciA9PSBwUmFuZ2VzW2lTZWddLm1fQ2hhclNpemUpIHsKKyAgICAgIHJldHVybiAyOwogICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKKyAgICBpZiAoaUNoYXIpIHsKKyAgICAgIGlmIChzaXplID09IHBSYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSkgeworICAgICAgICByZXR1cm4gMjsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpU2VnLS07CisgIH0KKyAgcmV0dXJuIDA7CiB9Ci1pbnQgX0dldENoYXJTaXplKEZYX0RXT1JEIGNoYXJjb2RlLCBfQ01hcF9Db2RlUmFuZ2UqIHBSYW5nZXMsIGludCBpUmFuZ2VzU2l6ZSkKLXsKLSAgICBpZiAoIWlSYW5nZXNTaXplKSB7CitGWF9EV09SRCBDUERGX0NNYXA6OkdldE5leHRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU3RyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG9mZnNldCkgY29uc3QgeworICBzd2l0Y2ggKG1fQ29kaW5nU2NoZW1lKSB7CisgICAgY2FzZSBPbmVCeXRlOgorICAgICAgcmV0dXJuICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0KytdOworICAgIGNhc2UgVHdvQnl0ZXM6CisgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgIHJldHVybiAoKHVpbnQ4X3QqKXBTdHJpbmcpW29mZnNldCAtIDJdICogMjU2ICsKKyAgICAgICAgICAgICAoKHVpbnQ4X3QqKXBTdHJpbmcpW29mZnNldCAtIDFdOworICAgIGNhc2UgTWl4ZWRUd29CeXRlczogeworICAgICAgdWludDhfdCBieXRlMSA9ICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0KytdOworICAgICAgaWYgKCFtX3BMZWFkaW5nQnl0ZXNbYnl0ZTFdKSB7CisgICAgICAgIHJldHVybiBieXRlMTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3QgYnl0ZTIgPSAoKHVpbnQ4X3QqKXBTdHJpbmcpW29mZnNldCsrXTsKKyAgICAgIHJldHVybiBieXRlMSAqIDI1NiArIGJ5dGUyOworICAgIH0KKyAgICBjYXNlIE1peGVkRm91ckJ5dGVzOiB7CisgICAgICB1aW50OF90IGNvZGVzWzRdOworICAgICAgaW50IGNoYXJfc2l6ZSA9IDE7CisgICAgICBjb2Rlc1swXSA9ICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0KytdOworICAgICAgX0NNYXBfQ29kZVJhbmdlKiBwUmFuZ2VzID0gKF9DTWFwX0NvZGVSYW5nZSopbV9wTGVhZGluZ0J5dGVzOworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IHJldCA9IF9DaGVja0NvZGVSYW5nZShjb2RlcywgY2hhcl9zaXplLCBwUmFuZ2VzLCBtX25Db2RlUmFuZ2VzKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSAyKSB7CisgICAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSAwOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhcl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDgpICsgY29kZXNbaV07CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBjaGFyY29kZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hhcl9zaXplID09IDQgfHwgb2Zmc2V0ID09IG5TdHJMZW4pIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBjb2Rlc1tjaGFyX3NpemUrK10gPSAoKHVpbnQ4X3QqKXBTdHJpbmcpW29mZnNldCsrXTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KK2ludCBDUERGX0NNYXA6OkdldENoYXJTaXplKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCB7CisgIHN3aXRjaCAobV9Db2RpbmdTY2hlbWUpIHsKKyAgICBjYXNlIE9uZUJ5dGU6CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIFR3b0J5dGVzOgorICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBNaXhlZFR3b0J5dGVzOgorICAgIGNhc2UgTWl4ZWRGb3VyQnl0ZXM6CisgICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMCkgewogICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgdWludDhfdCBjb2Rlc1s0XTsKLSAgICBjb2Rlc1swXSA9IGNvZGVzWzFdID0gMHgwMDsKLSAgICBjb2Rlc1syXSA9ICh1aW50OF90KShjaGFyY29kZSA+PiA4ICYgMHhGRik7Ci0gICAgY29kZXNbM10gPSAodWludDhfdCljaGFyY29kZTsKLSAgICBpbnQgb2Zmc2V0ID0gMCwgc2l6ZSA9IDQ7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICAgICAgaW50IGlTZWcgPSBpUmFuZ2VzU2l6ZSAtIDE7Ci0gICAgICAgIHdoaWxlIChpU2VnID49IDApIHsKLSAgICAgICAgICAgIGlmIChwUmFuZ2VzW2lTZWddLm1fQ2hhclNpemUgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaVNlZyAtLTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpQ2hhciA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoaUNoYXIgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVzW29mZnNldCArIGlDaGFyXSA8IHBSYW5nZXNbaVNlZ10ubV9Mb3dlcltpQ2hhcl0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzW29mZnNldCArIGlDaGFyXSA+IHBSYW5nZXNbaVNlZ10ubV9VcHBlcltpQ2hhcl0pIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlDaGFyICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlDaGFyID09IHBSYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaVNlZyAtLTsKKyAgICAgIH0KKyAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwMDApIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgICB9CisgICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMDAwMDApIHsKKyAgICAgICAgcmV0dXJuIDM7CisgICAgICB9CisgICAgICByZXR1cm4gNDsKKyAgfQorICByZXR1cm4gMTsKK30KK2ludCBDUERGX0NNYXA6OkNvdW50Q2hhcihjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgc2l6ZSkgY29uc3QgeworICBzd2l0Y2ggKG1fQ29kaW5nU2NoZW1lKSB7CisgICAgY2FzZSBPbmVCeXRlOgorICAgICAgcmV0dXJuIHNpemU7CisgICAgY2FzZSBUd29CeXRlczoKKyAgICAgIHJldHVybiAoc2l6ZSArIDEpIC8gMjsKKyAgICBjYXNlIE1peGVkVHdvQnl0ZXM6IHsKKyAgICAgIGludCBjb3VudCA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBjb3VudCsrOworICAgICAgICBpZiAobV9wTGVhZGluZ0J5dGVzWygodWludDhfdCopcFN0cmluZylbaV1dKSB7CisgICAgICAgICAgaSsrOwogICAgICAgICB9Ci0gICAgICAgIHNpemUgLS07Ci0gICAgICAgIG9mZnNldCArKzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjb3VudDsKICAgICB9CisgICAgY2FzZSBNaXhlZEZvdXJCeXRlczogeworICAgICAgaW50IGNvdW50ID0gMCwgb2Zmc2V0ID0gMDsKKyAgICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7CisgICAgICAgIEdldE5leHRDaGFyKHBTdHJpbmcsIHNpemUsIG9mZnNldCk7CisgICAgICAgIGNvdW50Kys7CisgICAgICB9CisgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorICB9CisgIHJldHVybiBzaXplOworfQoraW50IF9HZXRDaGFyU2l6ZShGWF9EV09SRCBjaGFyY29kZSwgX0NNYXBfQ29kZVJhbmdlKiBwUmFuZ2VzLCBpbnQgaVJhbmdlc1NpemUpIHsKKyAgaWYgKCFpUmFuZ2VzU2l6ZSkgewogICAgIHJldHVybiAxOwotfQotaW50IENQREZfQ01hcDo6QXBwZW5kQ2hhcihGWF9DSEFSKiBzdHIsIEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdAotewotICAgIHN3aXRjaCAobV9Db2RpbmdTY2hlbWUpIHsKLSAgICAgICAgY2FzZSBPbmVCeXRlOgotICAgICAgICAgICAgc3RyWzBdID0gKHVpbnQ4X3QpY2hhcmNvZGU7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgY2FzZSBUd29CeXRlczoKLSAgICAgICAgICAgIHN0clswXSA9ICh1aW50OF90KShjaGFyY29kZSAvIDI1Nik7Ci0gICAgICAgICAgICBzdHJbMV0gPSAodWludDhfdCkoY2hhcmNvZGUgJSAyNTYpOwotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIGNhc2UgTWl4ZWRUd29CeXRlczoKLSAgICAgICAgY2FzZSBNaXhlZEZvdXJCeXRlczoKLSAgICAgICAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwKSB7Ci0gICAgICAgICAgICAgICAgX0NNYXBfQ29kZVJhbmdlKiBwUmFuZ2VzID0gKF9DTWFwX0NvZGVSYW5nZSopbV9wTGVhZGluZ0J5dGVzOwotICAgICAgICAgICAgICAgIGludCBpU2l6ZSA9IF9HZXRDaGFyU2l6ZShjaGFyY29kZSwgcFJhbmdlcywgbV9uQ29kZVJhbmdlcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGlTaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaVNpemUgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaVNpemUgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldChzdHIsIDAsIHNpemVvZih1aW50OF90KSAqIGlTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RyW2lTaXplIC0gMV0gPSAodWludDhfdCljaGFyY29kZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaVNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMDAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyWzBdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDgpOwotICAgICAgICAgICAgICAgIHN0clsxXSA9ICh1aW50OF90KWNoYXJjb2RlOwotICAgICAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYXJjb2RlIDwgMHgxMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyWzBdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDE2KTsKLSAgICAgICAgICAgICAgICBzdHJbMV0gPSAodWludDhfdCkoY2hhcmNvZGUgPj4gOCk7Ci0gICAgICAgICAgICAgICAgc3RyWzJdID0gKHVpbnQ4X3QpY2hhcmNvZGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJbMF0gPSAodWludDhfdCkoY2hhcmNvZGUgPj4gMjQpOwotICAgICAgICAgICAgc3RyWzFdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDE2KTsKLSAgICAgICAgICAgIHN0clsyXSA9ICh1aW50OF90KShjaGFyY29kZSA+PiA4KTsKLSAgICAgICAgICAgIHN0clszXSA9ICh1aW50OF90KWNoYXJjb2RlOwotICAgICAgICAgICAgcmV0dXJuIDQ7CisgIH0KKyAgdWludDhfdCBjb2Rlc1s0XTsKKyAgY29kZXNbMF0gPSBjb2Rlc1sxXSA9IDB4MDA7CisgIGNvZGVzWzJdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDggJiAweEZGKTsKKyAgY29kZXNbM10gPSAodWludDhfdCljaGFyY29kZTsKKyAgaW50IG9mZnNldCA9IDAsIHNpemUgPSA0OworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIGludCBpU2VnID0gaVJhbmdlc1NpemUgLSAxOworICAgIHdoaWxlIChpU2VnID49IDApIHsKKyAgICAgIGlmIChwUmFuZ2VzW2lTZWddLm1fQ2hhclNpemUgPCBzaXplKSB7CisgICAgICAgIGlTZWctLTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgaUNoYXIgPSAwOworICAgICAgd2hpbGUgKGlDaGFyIDwgc2l6ZSkgeworICAgICAgICBpZiAoY29kZXNbb2Zmc2V0ICsgaUNoYXJdIDwgcFJhbmdlc1tpU2VnXS5tX0xvd2VyW2lDaGFyXSB8fAorICAgICAgICAgICAgY29kZXNbb2Zmc2V0ICsgaUNoYXJdID4gcFJhbmdlc1tpU2VnXS5tX1VwcGVyW2lDaGFyXSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlDaGFyKys7CisgICAgICB9CisgICAgICBpZiAoaUNoYXIgPT0gcFJhbmdlc1tpU2VnXS5tX0NoYXJTaXplKSB7CisgICAgICAgIHJldHVybiBzaXplOworICAgICAgfQorICAgICAgaVNlZy0tOwogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICBzaXplLS07CisgICAgb2Zmc2V0Kys7CisgIH0KKyAgcmV0dXJuIDE7CiB9Ci1DUERGX0NJRDJVbmljb2RlTWFwOjpDUERGX0NJRDJVbmljb2RlTWFwKCkKLXsKLSAgICBtX0VtYmVkZGVkQ291bnQgPSAwOworaW50IENQREZfQ01hcDo6QXBwZW5kQ2hhcihGWF9DSEFSKiBzdHIsIEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCB7CisgIHN3aXRjaCAobV9Db2RpbmdTY2hlbWUpIHsKKyAgICBjYXNlIE9uZUJ5dGU6CisgICAgICBzdHJbMF0gPSAodWludDhfdCljaGFyY29kZTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgVHdvQnl0ZXM6CisgICAgICBzdHJbMF0gPSAodWludDhfdCkoY2hhcmNvZGUgLyAyNTYpOworICAgICAgc3RyWzFdID0gKHVpbnQ4X3QpKGNoYXJjb2RlICUgMjU2KTsKKyAgICAgIHJldHVybiAyOworICAgIGNhc2UgTWl4ZWRUd29CeXRlczoKKyAgICBjYXNlIE1peGVkRm91ckJ5dGVzOgorICAgICAgaWYgKGNoYXJjb2RlIDwgMHgxMDApIHsKKyAgICAgICAgX0NNYXBfQ29kZVJhbmdlKiBwUmFuZ2VzID0gKF9DTWFwX0NvZGVSYW5nZSopbV9wTGVhZGluZ0J5dGVzOworICAgICAgICBpbnQgaVNpemUgPSBfR2V0Q2hhclNpemUoY2hhcmNvZGUsIHBSYW5nZXMsIG1fbkNvZGVSYW5nZXMpOworICAgICAgICBpZiAoaVNpemUgPT0gMCkgeworICAgICAgICAgIGlTaXplID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaVNpemUgPiAxKSB7CisgICAgICAgICAgRlhTWVNfbWVtc2V0KHN0ciwgMCwgc2l6ZW9mKHVpbnQ4X3QpICogaVNpemUpOworICAgICAgICB9CisgICAgICAgIHN0cltpU2l6ZSAtIDFdID0gKHVpbnQ4X3QpY2hhcmNvZGU7CisgICAgICAgIHJldHVybiBpU2l6ZTsKKyAgICAgIH0KKyAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwMDApIHsKKyAgICAgICAgc3RyWzBdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDgpOworICAgICAgICBzdHJbMV0gPSAodWludDhfdCljaGFyY29kZTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgICB9CisgICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMDAwMDApIHsKKyAgICAgICAgc3RyWzBdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDE2KTsKKyAgICAgICAgc3RyWzFdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDgpOworICAgICAgICBzdHJbMl0gPSAodWludDhfdCljaGFyY29kZTsKKyAgICAgICAgcmV0dXJuIDM7CisgICAgICB9CisgICAgICBzdHJbMF0gPSAodWludDhfdCkoY2hhcmNvZGUgPj4gMjQpOworICAgICAgc3RyWzFdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDE2KTsKKyAgICAgIHN0clsyXSA9ICh1aW50OF90KShjaGFyY29kZSA+PiA4KTsKKyAgICAgIHN0clszXSA9ICh1aW50OF90KWNoYXJjb2RlOworICAgICAgcmV0dXJuIDQ7CisgIH0KKyAgcmV0dXJuIDA7CiB9Ci1DUERGX0NJRDJVbmljb2RlTWFwOjp+Q1BERl9DSUQyVW5pY29kZU1hcCgpCi17CitDUERGX0NJRDJVbmljb2RlTWFwOjpDUERGX0NJRDJVbmljb2RlTWFwKCkgeworICBtX0VtYmVkZGVkQ291bnQgPSAwOwogfQotRlhfQk9PTCBDUERGX0NJRDJVbmljb2RlTWFwOjpJbml0aWFsaXplKCkKLXsKLSAgICByZXR1cm4gVFJVRTsKK0NQREZfQ0lEMlVuaWNvZGVNYXA6On5DUERGX0NJRDJVbmljb2RlTWFwKCkge30KK0ZYX0JPT0wgQ1BERl9DSUQyVW5pY29kZU1hcDo6SW5pdGlhbGl6ZSgpIHsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfQ0lEMlVuaWNvZGVNYXA6OklzTG9hZGVkKCkKLXsKLSAgICByZXR1cm4gbV9FbWJlZGRlZENvdW50ICE9IDA7CitGWF9CT09MIENQREZfQ0lEMlVuaWNvZGVNYXA6OklzTG9hZGVkKCkgeworICByZXR1cm4gbV9FbWJlZGRlZENvdW50ICE9IDA7CiB9Ci1GWF9XQ0hBUiBDUERGX0NJRDJVbmljb2RlTWFwOjpVbmljb2RlRnJvbUNJRChGWF9XT1JEIENJRCkKLXsKLSAgICBpZiAobV9DaGFyc2V0ID09IENJRFNFVF9VTklDT0RFKSB7Ci0gICAgICAgIHJldHVybiBDSUQ7Ci0gICAgfQotICAgIGlmIChDSUQgPCBtX0VtYmVkZGVkQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIG1fcEVtYmVkZGVkTWFwW0NJRF07Ci0gICAgfQotICAgIHJldHVybiAwOworRlhfV0NIQVIgQ1BERl9DSUQyVW5pY29kZU1hcDo6VW5pY29kZUZyb21DSUQoRlhfV09SRCBDSUQpIHsKKyAgaWYgKG1fQ2hhcnNldCA9PSBDSURTRVRfVU5JQ09ERSkgeworICAgIHJldHVybiBDSUQ7CisgIH0KKyAgaWYgKENJRCA8IG1fRW1iZWRkZWRDb3VudCkgeworICAgIHJldHVybiBtX3BFbWJlZGRlZE1hcFtDSURdOworICB9CisgIHJldHVybiAwOwogfQotdm9pZCBGUERGQVBJX0xvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgY29uc3QgRlhfV09SRComIHBNYXAsIEZYX0RXT1JEJiBjb3VudCk7Ci12b2lkIENQREZfQ0lEMlVuaWNvZGVNYXA6OkxvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdENKSykKLXsKLSAgICBtX0NoYXJzZXQgPSBjaGFyc2V0OwotICAgIEZQREZBUElfTG9hZENJRDJVbmljb2RlTWFwKGNoYXJzZXQsIG1fcEVtYmVkZGVkTWFwLCBtX0VtYmVkZGVkQ291bnQpOwordm9pZCBGUERGQVBJX0xvYWRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV09SRComIHBNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb3VudCk7Cit2b2lkIENQREZfQ0lEMlVuaWNvZGVNYXA6OkxvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm9tcHRDSkspIHsKKyAgbV9DaGFyc2V0ID0gY2hhcnNldDsKKyAgRlBERkFQSV9Mb2FkQ0lEMlVuaWNvZGVNYXAoY2hhcnNldCwgbV9wRW1iZWRkZWRNYXAsIG1fRW1iZWRkZWRDb3VudCk7CiB9CiAjaW5jbHVkZSAidHRnc3VidGFibGUuaCIKLUNQREZfQ0lERm9udDo6Q1BERl9DSURGb250KCkgOiBDUERGX0ZvbnQoUERGRk9OVF9DSURGT05UKQotewotICAgIG1fcENNYXAgPSBOVUxMOwotICAgIG1fcEFsbG9jYXRlZENNYXAgPSBOVUxMOwotICAgIG1fcENJRDJVbmljb2RlTWFwID0gTlVMTDsKLSAgICBtX3BBbnNpV2lkdGhzID0gTlVMTDsKLSAgICBtX3BDSURUb0dJRE1hcCA9IE5VTEw7Ci0gICAgbV9iQ0lESXNHSUQgPSBGQUxTRTsKLSAgICBtX2JBZG9iZUNvdXJpZXJTdGQgPSBGQUxTRTsKLSAgICBtX3BUVEdTVUJUYWJsZSA9IE5VTEw7Ci0gICAgRlhTWVNfbWVtc2V0KG1fQ2hhckJCb3gsIDB4ZmYsIDI1NiAqIHNpemVvZihGWF9TTUFMTF9SRUNUKSk7CitDUERGX0NJREZvbnQ6OkNQREZfQ0lERm9udCgpIDogQ1BERl9Gb250KFBERkZPTlRfQ0lERk9OVCkgeworICBtX3BDTWFwID0gTlVMTDsKKyAgbV9wQWxsb2NhdGVkQ01hcCA9IE5VTEw7CisgIG1fcENJRDJVbmljb2RlTWFwID0gTlVMTDsKKyAgbV9wQW5zaVdpZHRocyA9IE5VTEw7CisgIG1fcENJRFRvR0lETWFwID0gTlVMTDsKKyAgbV9iQ0lESXNHSUQgPSBGQUxTRTsKKyAgbV9iQWRvYmVDb3VyaWVyU3RkID0gRkFMU0U7CisgIG1fcFRUR1NVQlRhYmxlID0gTlVMTDsKKyAgRlhTWVNfbWVtc2V0KG1fQ2hhckJCb3gsIDB4ZmYsIDI1NiAqIHNpemVvZihGWF9TTUFMTF9SRUNUKSk7CiB9Ci1DUERGX0NJREZvbnQ6On5DUERGX0NJREZvbnQoKQotewotICAgIGlmIChtX3BBbnNpV2lkdGhzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQW5zaVdpZHRocyk7Ci0gICAgfQotICAgIGRlbGV0ZSBtX3BBbGxvY2F0ZWRDTWFwOwotICAgIGRlbGV0ZSBtX3BDSURUb0dJRE1hcDsKLSAgICBkZWxldGUgbV9wVFRHU1VCVGFibGU7CitDUERGX0NJREZvbnQ6On5DUERGX0NJREZvbnQoKSB7CisgIGlmIChtX3BBbnNpV2lkdGhzKSB7CisgICAgRlhfRnJlZShtX3BBbnNpV2lkdGhzKTsKKyAgfQorICBkZWxldGUgbV9wQWxsb2NhdGVkQ01hcDsKKyAgZGVsZXRlIG1fcENJRFRvR0lETWFwOworICBkZWxldGUgbV9wVFRHU1VCVGFibGU7CiB9Ci1GWF9XT1JEIENQREZfQ0lERm9udDo6Q0lERnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdAotewotICAgIGlmIChtX3BDTWFwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChGWF9XT1JEKWNoYXJjb2RlOwotICAgIH0KLSAgICByZXR1cm4gbV9wQ01hcC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKK0ZYX1dPUkQgQ1BERl9DSURGb250OjpDSURGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsKKyAgaWYgKG1fcENNYXAgPT0gTlVMTCkgeworICAgIHJldHVybiAoRlhfV09SRCljaGFyY29kZTsKKyAgfQorICByZXR1cm4gbV9wQ01hcC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKIH0KLUZYX0JPT0wgQ1BERl9DSURGb250OjpJc1ZlcnRXcml0aW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wQ01hcCA/IG1fcENNYXAtPklzVmVydFdyaXRpbmcoKSA6IEZBTFNFOworRlhfQk9PTCBDUERGX0NJREZvbnQ6OklzVmVydFdyaXRpbmcoKSBjb25zdCB7CisgIHJldHVybiBtX3BDTWFwID8gbV9wQ01hcC0+SXNWZXJ0V3JpdGluZygpIDogRkFMU0U7CiB9CiBleHRlcm4gRlhfRFdPUkQgRlBERkFQSV9DaGFyQ29kZUZyb21DSUQoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIEZYX1dPUkQgY2lkKTsKLXN0YXRpYyBGWF9EV09SRCBfRW1iZWRkZWRDaGFyY29kZUZyb21Vbmljb2RlKGNvbnN0IEZYQ01BUF9DTWFwKiBwRW1iZWRNYXAsIGludCBjaGFyc2V0LCBGWF9XQ0hBUiB1bmljb2RlKQotewotICAgIGlmIChjaGFyc2V0IDw9IDAgfHwgY2hhcnNldCA+IDQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOwotICAgIGNvbnN0IEZYX1dPUkQqIHBDb2RlcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9wTWFwOwotICAgIGlmIChwQ29kZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IG5Db2RlcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9Db3VudDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db2RlczsgaSsrKSB7Ci0gICAgICAgIGlmIChwQ29kZXNbaV0gPT0gdW5pY29kZSkgewotICAgICAgICAgICAgRlhfRFdPUkQgQ2hhckNvZGUgPSBGUERGQVBJX0NoYXJDb2RlRnJvbUNJRChwRW1iZWRNYXAsIGkpOwotICAgICAgICAgICAgaWYgKENoYXJDb2RlID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDaGFyQ29kZTsKLSAgICAgICAgfQotICAgIH0KK3N0YXRpYyBGWF9EV09SRCBfRW1iZWRkZWRDaGFyY29kZUZyb21Vbmljb2RlKGNvbnN0IEZYQ01BUF9DTWFwKiBwRW1iZWRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgaWYgKGNoYXJzZXQgPD0gMCB8fCBjaGFyc2V0ID4gNCkgewogICAgIHJldHVybiAwOwotfQotc3RhdGljIEZYX1dDSEFSIF9FbWJlZGRlZFVuaWNvZGVGcm9tQ2hhcmNvZGUoY29uc3QgRlhDTUFQX0NNYXAqIHBFbWJlZE1hcCwgaW50IGNoYXJzZXQsIEZYX0RXT1JEIGNoYXJjb2RlKQotewotICAgIGlmIChjaGFyc2V0IDw9IDAgfHwgY2hhcnNldCA+IDQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEZYX1dPUkQgY2lkID0gRlBERkFQSV9DSURGcm9tQ2hhckNvZGUocEVtYmVkTWFwLCBjaGFyY29kZSk7Ci0gICAgaWYgKGNpZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKTsKLSAgICBjb25zdCBGWF9XT1JEKiBwQ29kZXMgPSBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW2NoYXJzZXRdLm1fcE1hcDsKLSAgICBpZiAocENvZGVzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChjaWQgPCBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW2NoYXJzZXRdLm1fQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIHBDb2Rlc1tjaWRdOwotICAgIH0KKyAgfQorICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPQorICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7CisgIGNvbnN0IEZYX1dPUkQqIHBDb2RlcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9wTWFwOworICBpZiAocENvZGVzID09IE5VTEwpIHsKICAgICByZXR1cm4gMDsKLX0KLUZYX1dDSEFSIENQREZfQ0lERm9udDo6X1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX3BDTWFwLT5tX0NvZGluZykgewotICAgICAgICBjYXNlIENJRENPRElOR19VQ1MyOgotICAgICAgICBjYXNlIENJRENPRElOR19VVEYxNjoKLSAgICAgICAgICAgIHJldHVybiAoRlhfV0NIQVIpY2hhcmNvZGU7Ci0gICAgICAgIGNhc2UgQ0lEQ09ESU5HX0NJRDoKLSAgICAgICAgICAgIGlmIChtX3BDSUQyVW5pY29kZU1hcCA9PSBOVUxMIHx8ICFtX3BDSUQyVW5pY29kZU1hcC0+SXNMb2FkZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1fcENJRDJVbmljb2RlTWFwLT5Vbmljb2RlRnJvbUNJRCgoRlhfV09SRCljaGFyY29kZSk7CisgIH0KKyAgaW50IG5Db2RlcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9Db3VudDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ29kZXM7IGkrKykgeworICAgIGlmIChwQ29kZXNbaV0gPT0gdW5pY29kZSkgeworICAgICAgRlhfRFdPUkQgQ2hhckNvZGUgPSBGUERGQVBJX0NoYXJDb2RlRnJvbUNJRChwRW1iZWRNYXAsIGkpOworICAgICAgaWYgKENoYXJDb2RlID09IDApIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICByZXR1cm4gQ2hhckNvZGU7CiAgICAgfQotICAgIGlmICghbV9wQ01hcC0+SXNMb2FkZWQoKSB8fCBtX3BDSUQyVW5pY29kZU1hcCA9PSBOVUxMIHx8ICFtX3BDSUQyVW5pY29kZU1hcC0+SXNMb2FkZWQoKSkgeworICB9CisgIHJldHVybiAwOworfQorc3RhdGljIEZYX1dDSEFSIF9FbWJlZGRlZFVuaWNvZGVGcm9tQ2hhcmNvZGUoY29uc3QgRlhDTUFQX0NNYXAqIHBFbWJlZE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUpIHsKKyAgaWYgKGNoYXJzZXQgPD0gMCB8fCBjaGFyc2V0ID4gNCkgeworICAgIHJldHVybiAwOworICB9CisgIEZYX1dPUkQgY2lkID0gRlBERkFQSV9DSURGcm9tQ2hhckNvZGUocEVtYmVkTWFwLCBjaGFyY29kZSk7CisgIGlmIChjaWQgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9CisgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKTsKKyAgY29uc3QgRlhfV09SRCogcENvZGVzID0gcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tjaGFyc2V0XS5tX3BNYXA7CisgIGlmIChwQ29kZXMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjaWQgPCBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW2NoYXJzZXRdLm1fQ291bnQpIHsKKyAgICByZXR1cm4gcENvZGVzW2NpZF07CisgIH0KKyAgcmV0dXJuIDA7Cit9CitGWF9XQ0hBUiBDUERGX0NJREZvbnQ6Ol9Vbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCB7CisgIHN3aXRjaCAobV9wQ01hcC0+bV9Db2RpbmcpIHsKKyAgICBjYXNlIENJRENPRElOR19VQ1MyOgorICAgIGNhc2UgQ0lEQ09ESU5HX1VURjE2OgorICAgICAgcmV0dXJuIChGWF9XQ0hBUiljaGFyY29kZTsKKyAgICBjYXNlIENJRENPRElOR19DSUQ6CisgICAgICBpZiAobV9wQ0lEMlVuaWNvZGVNYXAgPT0gTlVMTCB8fCAhbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXR1cm4gbV9wQ0lEMlVuaWNvZGVNYXAtPlVuaWNvZGVGcm9tQ0lEKChGWF9XT1JEKWNoYXJjb2RlKTsKKyAgfQorICBpZiAoIW1fcENNYXAtPklzTG9hZGVkKCkgfHwgbV9wQ0lEMlVuaWNvZGVNYXAgPT0gTlVMTCB8fAorICAgICAgIW1fcENJRDJVbmljb2RlTWFwLT5Jc0xvYWRlZCgpKSB7CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgICAgICBGWF9XQ0hBUiB1bmljb2RlOwotICAgICAgICBpbnQgY2hhcnNpemUgPSAxOwotICAgICAgICBpZiAoY2hhcmNvZGUgPiAyNTUpIHsKLSAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlICUgMjU2KSAqIDI1NiArIChjaGFyY29kZSAvIDI1Nik7Ci0gICAgICAgICAgICBjaGFyc2l6ZSA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHJldCA9IEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIoZ19DaGFyc2V0Q1BzW21fcENNYXAtPm1fQ29kaW5nXSwgMCwgKGNvbnN0IEZYX0NIQVIqKSZjaGFyY29kZSwgY2hhcnNpemUsICZ1bmljb2RlLCAxKTsKLSAgICAgICAgaWYgKHJldCAhPSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdW5pY29kZTsKKyAgICBGWF9XQ0hBUiB1bmljb2RlOworICAgIGludCBjaGFyc2l6ZSA9IDE7CisgICAgaWYgKGNoYXJjb2RlID4gMjU1KSB7CisgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSAlIDI1NikgKiAyNTYgKyAoY2hhcmNvZGUgLyAyNTYpOworICAgICAgY2hhcnNpemUgPSAyOworICAgIH0KKyAgICBpbnQgcmV0ID0gRlhTWVNfTXVsdGlCeXRlVG9XaWRlQ2hhcihnX0NoYXJzZXRDUHNbbV9wQ01hcC0+bV9Db2RpbmddLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9DSEFSKikmY2hhcmNvZGUsIGNoYXJzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bmljb2RlLCAxKTsKKyAgICBpZiAocmV0ICE9IDEpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gdW5pY29kZTsKICNlbmRpZgotICAgICAgICBpZiAobV9wQ01hcC0+bV9wRW1iZWRNYXApIHsKLSAgICAgICAgICAgIHJldHVybiBfRW1iZWRkZWRVbmljb2RlRnJvbUNoYXJjb2RlKG1fcENNYXAtPm1fcEVtYmVkTWFwLCBtX3BDTWFwLT5tX0NoYXJzZXQsIGNoYXJjb2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcENJRDJVbmljb2RlTWFwLT5Vbmljb2RlRnJvbUNJRChDSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpKTsKLX0KLUZYX0RXT1JEIENQREZfQ0lERm9udDo6X0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgdW5pY29kZSkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKG1fcENNYXAtPm1fQ29kaW5nKSB7Ci0gICAgICAgIGNhc2UgQ0lEQ09ESU5HX1VOS05PV046Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgY2FzZSBDSURDT0RJTkdfVUNTMjoKLSAgICAgICAgY2FzZSBDSURDT0RJTkdfVVRGMTY6Ci0gICAgICAgICAgICByZXR1cm4gdW5pY29kZTsKLSAgICAgICAgY2FzZSBDSURDT0RJTkdfQ0lEOiB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcENJRDJVbmljb2RlTWFwID09IE5VTEwgfHwgIW1fcENJRDJVbmljb2RlTWFwLT5Jc0xvYWRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCBDSUQgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChDSUQgPCA2NTUzNikgewotICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB0aGlzX3VuaWNvZGUgPSBtX3BDSUQyVW5pY29kZU1hcC0+VW5pY29kZUZyb21DSUQoKEZYX1dPUkQpQ0lEKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNfdW5pY29kZSA9PSB1bmljb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ0lEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENJRCArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHVuaWNvZGUgPCAweDgwKSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxGWF9EV09SRD4odW5pY29kZSk7Ci0gICAgfQotICAgIGlmIChtX3BDTWFwLT5tX0NvZGluZyA9PSBDSURDT0RJTkdfQ0lEKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgdWludDhfdCBidWZmZXJbMzJdOwotICAgIGludCByZXQgPSBGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKGdfQ2hhcnNldENQc1ttX3BDTWFwLT5tX0NvZGluZ10sIDAsICZ1bmljb2RlLCAxLCAoY2hhciopYnVmZmVyLCA0LCBOVUxMLCBOVUxMKTsKLSAgICBpZiAocmV0ID09IDEpIHsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlclswXTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBidWZmZXJbMF0gKiAyNTYgKyBidWZmZXJbMV07Ci0gICAgfQotI2Vsc2UKICAgICBpZiAobV9wQ01hcC0+bV9wRW1iZWRNYXApIHsKLSAgICAgICAgcmV0dXJuIF9FbWJlZGRlZENoYXJjb2RlRnJvbVVuaWNvZGUobV9wQ01hcC0+bV9wRW1iZWRNYXAsIG1fcENNYXAtPm1fQ2hhcnNldCwgdW5pY29kZSk7CisgICAgICByZXR1cm4gX0VtYmVkZGVkVW5pY29kZUZyb21DaGFyY29kZShtX3BDTWFwLT5tX3BFbWJlZE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENNYXAtPm1fQ2hhcnNldCwgY2hhcmNvZGUpOwogICAgIH0KLSNlbmRpZgogICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBtX3BDSUQyVW5pY29kZU1hcC0+VW5pY29kZUZyb21DSUQoQ0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKSk7CiB9Ci1zdGF0aWMgdm9pZCBGVF9Vc2VDSURDaGFybWFwKEZYRlRfRmFjZSBmYWNlLCBpbnQgY29kaW5nKQotewotICAgIGludCBlbmNvZGluZzsKLSAgICBzd2l0Y2ggKGNvZGluZykgewotICAgICAgICBjYXNlIENJRENPRElOR19HQjoKLSAgICAgICAgICAgIGVuY29kaW5nID0gRlhGVF9FTkNPRElOR19HQjIzMTI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSURDT0RJTkdfQklHNToKLSAgICAgICAgICAgIGVuY29kaW5nID0gRlhGVF9FTkNPRElOR19CSUc1OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0lEQ09ESU5HX0pJUzoKLSAgICAgICAgICAgIGVuY29kaW5nID0gRlhGVF9FTkNPRElOR19TSklTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0lEQ09ESU5HX0tPUkVBOgotICAgICAgICAgICAgZW5jb2RpbmcgPSBGWEZUX0VOQ09ESU5HX0pPSEFCOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlbmNvZGluZyA9IEZYRlRfRU5DT0RJTkdfVU5JQ09ERTsKLSAgICB9Ci0gICAgaW50IGVyciA9IEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgZW5jb2RpbmcpOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgZXJyID0gRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpOwotICAgIH0KLSAgICBpZiAoZXJyICYmIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSkpIHsKLSAgICAgICAgRlhGVF9TZXRfQ2hhcm1hcChmYWNlLCAqRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKSk7Ci0gICAgfQotfQotRlhfQk9PTCBDUERGX0NJREZvbnQ6Ol9Mb2FkKCkKLXsKLSAgICBpZiAobV9wRm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKSA9PSBGWF9CU1RSQygiVHJ1ZVR5cGUiKSkgewotICAgICAgICByZXR1cm4gTG9hZEdCMjMxMigpOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwRm9udHMgPSBtX3BGb250RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRlc2NlbmRhbnRGb250cyIpKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocEZvbnRzLT5HZXRDb3VudCgpICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBDSURGb250RGljdCA9IHBGb250cy0+R2V0RGljdCgwKTsKLSAgICBpZiAocENJREZvbnREaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX0Jhc2VGb250ID0gcENJREZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkJhc2VGb250IikpOwotICAgIGlmICgobV9CYXNlRm9udC5Db21wYXJlKCJDb3VyaWVyU3RkIikgPT0gMCB8fCBtX0Jhc2VGb250LkNvbXBhcmUoIkNvdXJpZXJTdGQtQm9sZCIpID09IDAKLSAgICAgICAgICAgIHx8IG1fQmFzZUZvbnQuQ29tcGFyZSgiQ291cmllclN0ZC1Cb2xkT2JsaXF1ZSIpID09IDAgfHwgbV9CYXNlRm9udC5Db21wYXJlKCJDb3VyaWVyU3RkLU9ibGlxdWUiKSA9PSAwKQotICAgICAgICAgICAgJiYgIUlzRW1iZWRkZWQoKSkgewotICAgICAgICBtX2JBZG9iZUNvdXJpZXJTdGQgPSBUUlVFOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGVzYyA9IHBDSURGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiRm9udERlc2NyaXB0b3IiKSk7Ci0gICAgaWYgKHBGb250RGVzYykgewotICAgICAgICBMb2FkRm9udERlc2NyaXB0b3IocEZvbnREZXNjKTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBFbmNvZGluZyA9IG1fcEZvbnREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkVuY29kaW5nIikpOwotICAgIGlmIChwRW5jb2RpbmcgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIHN1YnR5cGUgPSBwQ0lERm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKTsKLSAgICBtX2JUeXBlMSA9IEZBTFNFOwotICAgIGlmIChzdWJ0eXBlID09IEZYX0JTVFJDKCJDSURGb250VHlwZTAiKSkgewotICAgICAgICBtX2JUeXBlMSA9IFRSVUU7Ci0gICAgfQotICAgIGlmIChwRW5jb2RpbmctPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjbWFwID0gcEVuY29kaW5nLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgbV9wQ01hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpLT5tX0NNYXBNYW5hZ2VyLkdldFByZWRlZmluZWRDTWFwKGNtYXAsCi0gICAgICAgICAgICAgICAgICBtX3BGb250RmlsZSAmJiBtX2JUeXBlMSk7Ci0gICAgfSBlbHNlIGlmIChwRW5jb2RpbmctPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIG1fcEFsbG9jYXRlZENNYXAgPSBtX3BDTWFwID0gbmV3IENQREZfQ01hcDsKLSAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBFbmNvZGluZzsKLSAgICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgICAgICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOwotICAgICAgICBtX3BDTWFwLT5Mb2FkRW1iZWRkZWQoYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wQ01hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9DaGFyc2V0ID0gbV9wQ01hcC0+bV9DaGFyc2V0OwotICAgIGlmIChtX0NoYXJzZXQgPT0gQ0lEU0VUX1VOS05PV04pIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ0lESW5mbyA9IHBDSURGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiQ0lEU3lzdGVtSW5mbyIpKTsKLSAgICAgICAgaWYgKHBDSURJbmZvKSB7Ci0gICAgICAgICAgICBtX0NoYXJzZXQgPSBfQ2hhcnNldEZyb21PcmRlcmluZyhwQ0lESW5mby0+R2V0U3RyaW5nKEZYX0JTVFJDKCJPcmRlcmluZyIpKSk7CitGWF9EV09SRCBDUERGX0NJREZvbnQ6Ol9DaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIHVuaWNvZGUpIGNvbnN0IHsKKyAgc3dpdGNoIChtX3BDTWFwLT5tX0NvZGluZykgeworICAgIGNhc2UgQ0lEQ09ESU5HX1VOS05PV046CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIENJRENPRElOR19VQ1MyOgorICAgIGNhc2UgQ0lEQ09ESU5HX1VURjE2OgorICAgICAgcmV0dXJuIHVuaWNvZGU7CisgICAgY2FzZSBDSURDT0RJTkdfQ0lEOiB7CisgICAgICBpZiAobV9wQ0lEMlVuaWNvZGVNYXAgPT0gTlVMTCB8fCAhbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBGWF9EV09SRCBDSUQgPSAwOworICAgICAgd2hpbGUgKENJRCA8IDY1NTM2KSB7CisgICAgICAgIEZYX1dDSEFSIHRoaXNfdW5pY29kZSA9IG1fcENJRDJVbmljb2RlTWFwLT5Vbmljb2RlRnJvbUNJRCgoRlhfV09SRClDSUQpOworICAgICAgICBpZiAodGhpc191bmljb2RlID09IHVuaWNvZGUpIHsKKyAgICAgICAgICByZXR1cm4gQ0lEOwogICAgICAgICB9CisgICAgICAgIENJRCsrOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmIChtX0NoYXJzZXQgIT0gQ0lEU0VUX1VOS05PV04pCi0gICAgICAgIG1fcENJRDJVbmljb2RlTWFwID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCktPm1fQ01hcE1hbmFnZXIuR2V0Q0lEMlVuaWNvZGVNYXAobV9DaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnRGaWxlID09IE5VTEwgJiYgKG1fcENNYXAtPm1fQ29kaW5nID09IENJRENPRElOR19DSUQgfHwgcENJREZvbnREaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiVyIpKSkpOwotICAgIGlmIChtX0ZvbnQuR2V0RmFjZSgpKSB7Ci0gICAgICAgIGlmIChtX2JUeXBlMSkgewotICAgICAgICAgICAgRlhGVF9TZWxlY3RfQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlRfVXNlQ0lEQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCBtX3BDTWFwLT5tX0NvZGluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9EZWZhdWx0V2lkdGggPSBwQ0lERm9udERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkRXIiksIDEwMDApOwotICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gcENJREZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiVyIpKTsKLSAgICBpZiAocFdpZHRoQXJyYXkpIHsKLSAgICAgICAgTG9hZE1ldHJpY3NBcnJheShwV2lkdGhBcnJheSwgbV9XaWR0aExpc3QsIDEpOwotICAgIH0KLSAgICBpZiAoIUlzRW1iZWRkZWQoKSkgewotICAgICAgICBMb2FkU3Vic3RGb250KCk7Ci0gICAgfQotICAgIGlmICgxKSB7Ci0gICAgICAgIGlmIChtX3BGb250RmlsZSB8fCAoR2V0U3Vic3RGb250KCktPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9FWEFDVCkpIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwbWFwID0gcENJREZvbnREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNJRFRvR0lETWFwIikpOwotICAgICAgICAgICAgaWYgKHBtYXApIHsKLSAgICAgICAgICAgICAgICBpZiAocG1hcC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wQ0lEVG9HSURNYXAgPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgICAgICAgICAgICAgICAgIG1fcENJRFRvR0lETWFwLT5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBtYXAsIEZBTFNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBtYXAtPkdldFN0cmluZygpID09IEZYX0JTVFJDKCJJZGVudGl0eSIpKSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BGb250RmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9iQ0lESXNHSUQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9CisgIH0KKworICBpZiAodW5pY29kZSA8IDB4ODApIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfRFdPUkQ+KHVuaWNvZGUpOworICB9CisgIGlmIChtX3BDTWFwLT5tX0NvZGluZyA9PSBDSURDT0RJTkdfQ0lEKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgIHVpbnQ4X3QgYnVmZmVyWzMyXTsKKyAgaW50IHJldCA9CisgICAgICBGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKGdfQ2hhcnNldENQc1ttX3BDTWFwLT5tX0NvZGluZ10sIDAsICZ1bmljb2RlLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopYnVmZmVyLCA0LCBOVUxMLCBOVUxMKTsKKyAgaWYgKHJldCA9PSAxKSB7CisgICAgcmV0dXJuIGJ1ZmZlclswXTsKKyAgfQorICBpZiAocmV0ID09IDIpIHsKKyAgICByZXR1cm4gYnVmZmVyWzBdICogMjU2ICsgYnVmZmVyWzFdOworICB9CiAjZWxzZQotICAgICAgICAgICAgICAgICAgICBtX2JDSURJc0dJRCA9IFRSVUU7CisgIGlmIChtX3BDTWFwLT5tX3BFbWJlZE1hcCkgeworICAgIHJldHVybiBfRW1iZWRkZWRDaGFyY29kZUZyb21Vbmljb2RlKG1fcENNYXAtPm1fcEVtYmVkTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENNYXAtPm1fQ2hhcnNldCwgdW5pY29kZSk7CisgIH0KICNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBDaGVja0ZvbnRNZXRyaWNzKCk7Ci0gICAgaWYgKElzVmVydFdyaXRpbmcoKSkgewotICAgICAgICBwV2lkdGhBcnJheSA9IHBDSURGb250RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlcyIikpOwotICAgICAgICBpZiAocFdpZHRoQXJyYXkpIHsKLSAgICAgICAgICAgIExvYWRNZXRyaWNzQXJyYXkocFdpZHRoQXJyYXksIG1fVmVydE1ldHJpY3MsIDMpOwotICAgICAgICB9Ci0gICAgICAgIENQREZfQXJyYXkqIHBEZWZhdWx0QXJyYXkgPSBwQ0lERm9udERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEVzIiKSk7Ci0gICAgICAgIGlmIChwRGVmYXVsdEFycmF5KSB7Ci0gICAgICAgICAgICBtX0RlZmF1bHRWWSA9IHBEZWZhdWx0QXJyYXktPkdldEludGVnZXIoMCk7Ci0gICAgICAgICAgICBtX0RlZmF1bHRXMSA9IHBEZWZhdWx0QXJyYXktPkdldEludGVnZXIoMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0RlZmF1bHRWWSA9IDg4MDsKLSAgICAgICAgICAgIG1fRGVmYXVsdFcxID0gLTEwMDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiAwOwogfQotRlhfRkxPQVQgX0NJRFRyYW5zZm9ybVRvRmxvYXQodWludDhfdCBjaCkKLXsKLSAgICBpZiAoY2ggPCAxMjgpIHsKLSAgICAgICAgcmV0dXJuIGNoICogMS4wZiAvIDEyNzsKLSAgICB9Ci0gICAgcmV0dXJuICgtMjU1ICsgY2gpICogMS4wZiAvIDEyNzsKK3N0YXRpYyB2b2lkIEZUX1VzZUNJRENoYXJtYXAoRlhGVF9GYWNlIGZhY2UsIGludCBjb2RpbmcpIHsKKyAgaW50IGVuY29kaW5nOworICBzd2l0Y2ggKGNvZGluZykgeworICAgIGNhc2UgQ0lEQ09ESU5HX0dCOgorICAgICAgZW5jb2RpbmcgPSBGWEZUX0VOQ09ESU5HX0dCMjMxMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0lEQ09ESU5HX0JJRzU6CisgICAgICBlbmNvZGluZyA9IEZYRlRfRU5DT0RJTkdfQklHNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0lEQ09ESU5HX0pJUzoKKyAgICAgIGVuY29kaW5nID0gRlhGVF9FTkNPRElOR19TSklTOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSURDT0RJTkdfS09SRUE6CisgICAgICBlbmNvZGluZyA9IEZYRlRfRU5DT0RJTkdfSk9IQUI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZW5jb2RpbmcgPSBGWEZUX0VOQ09ESU5HX1VOSUNPREU7CisgIH0KKyAgaW50IGVyciA9IEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgZW5jb2RpbmcpOworICBpZiAoZXJyKSB7CisgICAgZXJyID0gRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpOworICB9CisgIGlmIChlcnIgJiYgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKSkgeworICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgKkZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSkpOworICB9CiB9Ci12b2lkIENQREZfQ0lERm9udDo6R2V0Q2hhckJCb3goRlhfRFdPUkQgY2hhcmNvZGUsIEZYX1JFQ1QmIHJlY3QsIGludCBsZXZlbCkKLXsKLSAgICBpZiAoY2hhcmNvZGUgPCAyNTYgJiYgbV9DaGFyQkJveFtjaGFyY29kZV0uUmlnaHQgIT0gLTEpIHsKLSAgICAgICAgcmVjdC5ib3R0b20gPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5Cb3R0b207Ci0gICAgICAgIHJlY3QubGVmdCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLkxlZnQ7Ci0gICAgICAgIHJlY3QucmlnaHQgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodDsKLSAgICAgICAgcmVjdC50b3AgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5Ub3A7Ci0gICAgICAgIHJldHVybjsKK0ZYX0JPT0wgQ1BERl9DSURGb250OjpfTG9hZCgpIHsKKyAgaWYgKG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkgPT0gRlhfQlNUUkMoIlRydWVUeXBlIikpIHsKKyAgICByZXR1cm4gTG9hZEdCMjMxMigpOworICB9CisgIENQREZfQXJyYXkqIHBGb250cyA9IG1fcEZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVzY2VuZGFudEZvbnRzIikpOworICBpZiAocEZvbnRzID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBGb250cy0+R2V0Q291bnQoKSAhPSAxKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfRGljdGlvbmFyeSogcENJREZvbnREaWN0ID0gcEZvbnRzLT5HZXREaWN0KDApOworICBpZiAocENJREZvbnREaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9CYXNlRm9udCA9IHBDSURGb250RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJCYXNlRm9udCIpKTsKKyAgaWYgKChtX0Jhc2VGb250LkNvbXBhcmUoIkNvdXJpZXJTdGQiKSA9PSAwIHx8CisgICAgICAgbV9CYXNlRm9udC5Db21wYXJlKCJDb3VyaWVyU3RkLUJvbGQiKSA9PSAwIHx8CisgICAgICAgbV9CYXNlRm9udC5Db21wYXJlKCJDb3VyaWVyU3RkLUJvbGRPYmxpcXVlIikgPT0gMCB8fAorICAgICAgIG1fQmFzZUZvbnQuQ29tcGFyZSgiQ291cmllclN0ZC1PYmxpcXVlIikgPT0gMCkgJiYKKyAgICAgICFJc0VtYmVkZGVkKCkpIHsKKyAgICBtX2JBZG9iZUNvdXJpZXJTdGQgPSBUUlVFOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0KKyAgICAgIHBDSURGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiRm9udERlc2NyaXB0b3IiKSk7CisgIGlmIChwRm9udERlc2MpIHsKKyAgICBMb2FkRm9udERlc2NyaXB0b3IocEZvbnREZXNjKTsKKyAgfQorICBDUERGX09iamVjdCogcEVuY29kaW5nID0gbV9wRm9udERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRW5jb2RpbmciKSk7CisgIGlmIChwRW5jb2RpbmcgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBzdWJ0eXBlID0gcENJREZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSk7CisgIG1fYlR5cGUxID0gRkFMU0U7CisgIGlmIChzdWJ0eXBlID09IEZYX0JTVFJDKCJDSURGb250VHlwZTAiKSkgeworICAgIG1fYlR5cGUxID0gVFJVRTsKKyAgfQorICBpZiAocEVuY29kaW5nLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBjbWFwID0gcEVuY29kaW5nLT5HZXRTdHJpbmcoKTsKKyAgICBtX3BDTWFwID0KKyAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpCisgICAgICAgICAgICAtPkdldFBhZ2VNb2R1bGUoKQorICAgICAgICAgICAgLT5HZXRGb250R2xvYmFscygpCisgICAgICAgICAgICAtPm1fQ01hcE1hbmFnZXIuR2V0UHJlZGVmaW5lZENNYXAoY21hcCwgbV9wRm9udEZpbGUgJiYgbV9iVHlwZTEpOworICB9IGVsc2UgaWYgKHBFbmNvZGluZy0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKKyAgICBtX3BBbGxvY2F0ZWRDTWFwID0gbV9wQ01hcCA9IG5ldyBDUERGX0NNYXA7CisgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBFbmNvZGluZzsKKyAgICBDUERGX1N0cmVhbUFjYyBhY2M7CisgICAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKKyAgICBtX3BDTWFwLT5Mb2FkRW1iZWRkZWQoYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BDTWFwID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9DaGFyc2V0ID0gbV9wQ01hcC0+bV9DaGFyc2V0OworICBpZiAobV9DaGFyc2V0ID09IENJRFNFVF9VTktOT1dOKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ0lESW5mbyA9CisgICAgICAgIHBDSURGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiQ0lEU3lzdGVtSW5mbyIpKTsKKyAgICBpZiAocENJREluZm8pIHsKKyAgICAgIG1fQ2hhcnNldCA9CisgICAgICAgICAgX0NoYXJzZXRGcm9tT3JkZXJpbmcocENJREluZm8tPkdldFN0cmluZyhGWF9CU1RSQygiT3JkZXJpbmciKSkpOwogICAgIH0KLSAgICBGWF9CT09MIGJWZXJ0ID0gRkFMU0U7Ci0gICAgaW50IGdseXBoX2luZGV4ID0gR2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUsICZiVmVydCk7Ci0gICAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZWN0ID0gRlhfUkVDVCgwLCAwLCAwLCAwKTsKKyAgfQorICBpZiAobV9DaGFyc2V0ICE9IENJRFNFVF9VTktOT1dOKQorICAgIG1fcENJRDJVbmljb2RlTWFwID0KKyAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpCisgICAgICAgICAgICAtPkdldFBhZ2VNb2R1bGUoKQorICAgICAgICAgICAgLT5HZXRGb250R2xvYmFscygpCisgICAgICAgICAgICAtPm1fQ01hcE1hbmFnZXIuR2V0Q0lEMlVuaWNvZGVNYXAoCisgICAgICAgICAgICAgICAgbV9DaGFyc2V0LAorICAgICAgICAgICAgICAgIG1fcEZvbnRGaWxlID09IE5VTEwgJiYgKG1fcENNYXAtPm1fQ29kaW5nID09IENJRENPRElOR19DSUQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ0lERm9udERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJXIikpKSk7CisgIGlmIChtX0ZvbnQuR2V0RmFjZSgpKSB7CisgICAgaWYgKG1fYlR5cGUxKSB7CisgICAgICBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVjdC5sZWZ0ID0gcmVjdC5ib3R0b20gPSByZWN0LnJpZ2h0ID0gcmVjdC50b3AgPSAwOwotICAgICAgICBGWEZUX0ZhY2UgZmFjZSA9IG1fRm9udC5tX0ZhY2U7Ci0gICAgICAgIGlmIChGWEZUX0lzX0ZhY2VfVHJpY2t5KGZhY2UpKSB7Ci0gICAgICAgICAgICBpbnQgZXJyID0gRlhGVF9Mb2FkX0dseXBoKGZhY2UsIGdseXBoX2luZGV4LCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKLSAgICAgICAgICAgIGlmICghZXJyKSB7Ci0gICAgICAgICAgICAgICAgRlhGVF9CQm94IGNib3g7Ci0gICAgICAgICAgICAgICAgRlhGVF9HbHlwaCBnbHlwaDsKLSAgICAgICAgICAgICAgICBlcnIgPSBGWEZUX0dldF9HbHlwaCgoKEZYRlRfRmFjZSlmYWNlKS0+Z2x5cGgsICZnbHlwaCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUywgJmNib3gpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfc2l6ZV94ID0gKChGWEZUX0ZhY2UpZmFjZSktPnNpemUtPm1ldHJpY3MueF9wcGVtOwotICAgICAgICAgICAgICAgICAgICBpbnQJcGl4ZWxfc2l6ZV95ID0gKChGWEZUX0ZhY2UpZmFjZSktPnNpemUtPm1ldHJpY3MueV9wcGVtOwotICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfc2l6ZV94ID09IDAgfHwgcGl4ZWxfc2l6ZV95ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCA9IGNib3gueE1pbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgPSBjYm94LnhNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCA9IGNib3gueU1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tID0gY2JveC55TWluOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ID0gY2JveC54TWluICogMTAwMCAvIHBpeGVsX3NpemVfeDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgPSBjYm94LnhNYXggKiAxMDAwIC8gcGl4ZWxfc2l6ZV94OwotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgPSBjYm94LnlNYXggKiAxMDAwIC8gcGl4ZWxfc2l6ZV95OwotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBjYm94LnlNaW4gKiAxMDAwIC8gcGl4ZWxfc2l6ZV95OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0LnRvcCA+IEZYRlRfR2V0X0ZhY2VfQXNjZW5kZXIoZmFjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wID0gRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmVjdC5ib3R0b20gPCBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihmYWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWEZUX0RvbmVfR2x5cGgoZ2x5cGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBlcnIgPSBGWEZUX0xvYWRfR2x5cGgoZmFjZSwgZ2x5cGhfaW5kZXgsIEZYRlRfTE9BRF9OT19TQ0FMRSk7Ci0gICAgICAgICAgICBpZiAoZXJyID09IDApIHsKLSAgICAgICAgICAgICAgICByZWN0LmxlZnQgPSBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKGZhY2UpLCBmYWNlKTsKLSAgICAgICAgICAgICAgICByZWN0LnJpZ2h0ID0gVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChmYWNlKSArIEZYRlRfR2V0X0dseXBoX1dpZHRoKGZhY2UpLCBmYWNlKTsKLSAgICAgICAgICAgICAgICByZWN0LnRvcCA9IFRUMlBERihGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1koZmFjZSksIGZhY2UpOwotICAgICAgICAgICAgICAgIHJlY3QudG9wICs9IHJlY3QudG9wIC8gNjQ7Ci0gICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKGZhY2UpIC0gRlhGVF9HZXRfR2x5cGhfSGVpZ2h0KGZhY2UpLCBmYWNlKTsKLSAgICAgICAgICAgIH0KKyAgICAgIEZUX1VzZUNJRENoYXJtYXAobV9Gb250LkdldEZhY2UoKSwgbV9wQ01hcC0+bV9Db2RpbmcpOworICAgIH0KKyAgfQorICBtX0RlZmF1bHRXaWR0aCA9IHBDSURGb250RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiRFciKSwgMTAwMCk7CisgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gcENJREZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiVyIpKTsKKyAgaWYgKHBXaWR0aEFycmF5KSB7CisgICAgTG9hZE1ldHJpY3NBcnJheShwV2lkdGhBcnJheSwgbV9XaWR0aExpc3QsIDEpOworICB9CisgIGlmICghSXNFbWJlZGRlZCgpKSB7CisgICAgTG9hZFN1YnN0Rm9udCgpOworICB9CisgIGlmICgxKSB7CisgICAgaWYgKG1fcEZvbnRGaWxlIHx8IChHZXRTdWJzdEZvbnQoKS0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX0VYQUNUKSkgeworICAgICAgQ1BERl9PYmplY3QqIHBtYXAgPQorICAgICAgICAgIHBDSURGb250RGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJDSURUb0dJRE1hcCIpKTsKKyAgICAgIGlmIChwbWFwKSB7CisgICAgICAgIGlmIChwbWFwLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgeworICAgICAgICAgIG1fcENJRFRvR0lETWFwID0gbmV3IENQREZfU3RyZWFtQWNjOworICAgICAgICAgIG1fcENJRFRvR0lETWFwLT5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBtYXAsIEZBTFNFKTsKKyAgICAgICAgfSBlbHNlIGlmIChwbWFwLT5HZXRTdHJpbmcoKSA9PSBGWF9CU1RSQygiSWRlbnRpdHkiKSkgeworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICAgICAgaWYgKG1fcEZvbnRGaWxlKSB7CisgICAgICAgICAgICBtX2JDSURJc0dJRCA9IFRSVUU7CisgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICBtX2JDSURJc0dJRCA9IFRSVUU7CisjZW5kaWYKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBpZiAobV9wRm9udEZpbGUgPT0gTlVMTCAmJiBtX0NoYXJzZXQgPT0gQ0lEU0VUX0pBUEFOMSkgewotICAgICAgICBGWF9XT1JEIENJRCA9IENJREZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBUcmFuc2Zvcm0gPSBHZXRDSURUcmFuc2Zvcm0oQ0lEKTsKLSAgICAgICAgaWYgKHBUcmFuc2Zvcm0gJiYgIWJWZXJ0KSB7Ci0gICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeChfQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzBdKSwgX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzJdKSwgX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVszXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzRdKSAqIDEwMDAgLCBfQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzVdKSAqIDEwMDApOwotICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0X2YocmVjdCk7Ci0gICAgICAgICAgICByZWN0X2YuVHJhbnNmb3JtKCZtYXRyaXgpOwotICAgICAgICAgICAgcmVjdCA9IHJlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgICAgIH0KKyAgfQorICBDaGVja0ZvbnRNZXRyaWNzKCk7CisgIGlmIChJc1ZlcnRXcml0aW5nKCkpIHsKKyAgICBwV2lkdGhBcnJheSA9IHBDSURGb250RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlcyIikpOworICAgIGlmIChwV2lkdGhBcnJheSkgeworICAgICAgTG9hZE1ldHJpY3NBcnJheShwV2lkdGhBcnJheSwgbV9WZXJ0TWV0cmljcywgMyk7CiAgICAgfQotICAgIGlmIChjaGFyY29kZSA8IDI1NikgewotICAgICAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5Cb3R0b20gPSAoc2hvcnQpcmVjdC5ib3R0b207Ci0gICAgICAgIG1fQ2hhckJCb3hbY2hhcmNvZGVdLkxlZnQgPSAoc2hvcnQpcmVjdC5sZWZ0OwotICAgICAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodCA9IChzaG9ydClyZWN0LnJpZ2h0OwotICAgICAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5Ub3AgPSAoc2hvcnQpcmVjdC50b3A7CisgICAgQ1BERl9BcnJheSogcERlZmF1bHRBcnJheSA9IHBDSURGb250RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRXMiIpKTsKKyAgICBpZiAocERlZmF1bHRBcnJheSkgeworICAgICAgbV9EZWZhdWx0VlkgPSBwRGVmYXVsdEFycmF5LT5HZXRJbnRlZ2VyKDApOworICAgICAgbV9EZWZhdWx0VzEgPSBwRGVmYXVsdEFycmF5LT5HZXRJbnRlZ2VyKDEpOworICAgIH0gZWxzZSB7CisgICAgICBtX0RlZmF1bHRWWSA9IDg4MDsKKyAgICAgIG1fRGVmYXVsdFcxID0gLTEwMDA7CiAgICAgfQorICB9CisgIHJldHVybiBUUlVFOwogfQotaW50IENQREZfQ0lERm9udDo6R2V0Q2hhcldpZHRoRihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsKQotewotICAgIGlmIChtX3BBbnNpV2lkdGhzICYmIGNoYXJjb2RlIDwgMHg4MCkgewotICAgICAgICByZXR1cm4gbV9wQW5zaVdpZHRoc1tjaGFyY29kZV07Ci0gICAgfQotICAgIEZYX1dPUkQgY2lkID0gQ0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICBpbnQgc2l6ZSA9IG1fV2lkdGhMaXN0LkdldFNpemUoKTsKLSAgICBGWF9EV09SRCogbGlzdCA9IG1fV2lkdGhMaXN0LkdldERhdGEoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMykgewotICAgICAgICBpZiAoY2lkID49IGxpc3RbaV0gJiYgY2lkIDw9IGxpc3RbaSArIDFdKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludClsaXN0W2kgKyAyXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbV9EZWZhdWx0V2lkdGg7CitGWF9GTE9BVCBfQ0lEVHJhbnNmb3JtVG9GbG9hdCh1aW50OF90IGNoKSB7CisgIGlmIChjaCA8IDEyOCkgeworICAgIHJldHVybiBjaCAqIDEuMGYgLyAxMjc7CisgIH0KKyAgcmV0dXJuICgtMjU1ICsgY2gpICogMS4wZiAvIDEyNzsKIH0KLXNob3J0IENQREZfQ0lERm9udDo6R2V0VmVydFdpZHRoKEZYX1dPUkQgQ0lEKSBjb25zdAotewotICAgIEZYX0RXT1JEIHZlcnRzaXplID0gbV9WZXJ0TWV0cmljcy5HZXRTaXplKCkgLyA1OwotICAgIGlmICh2ZXJ0c2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBtX0RlZmF1bHRXMTsKLSAgICB9Ci0gICAgY29uc3QgRlhfRFdPUkQqIHBUYWJsZSA9IG1fVmVydE1ldHJpY3MuR2V0RGF0YSgpOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCB2ZXJ0c2l6ZTsgaSArKykKLSAgICAgICAgaWYgKHBUYWJsZVtpICogNV0gPD0gQ0lEICYmIHBUYWJsZVtpICogNSArIDFdID49IENJRCkgewotICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkoaW50KXBUYWJsZVtpICogNSArIDJdOwordm9pZCBDUERGX0NJREZvbnQ6OkdldENoYXJCQm94KEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9SRUNUJiByZWN0LCBpbnQgbGV2ZWwpIHsKKyAgaWYgKGNoYXJjb2RlIDwgMjU2ICYmIG1fQ2hhckJCb3hbY2hhcmNvZGVdLlJpZ2h0ICE9IC0xKSB7CisgICAgcmVjdC5ib3R0b20gPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5Cb3R0b207CisgICAgcmVjdC5sZWZ0ID0gbV9DaGFyQkJveFtjaGFyY29kZV0uTGVmdDsKKyAgICByZWN0LnJpZ2h0ID0gbV9DaGFyQkJveFtjaGFyY29kZV0uUmlnaHQ7CisgICAgcmVjdC50b3AgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5Ub3A7CisgICAgcmV0dXJuOworICB9CisgIEZYX0JPT0wgYlZlcnQgPSBGQUxTRTsKKyAgaW50IGdseXBoX2luZGV4ID0gR2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUsICZiVmVydCk7CisgIGlmIChtX0ZvbnQubV9GYWNlID09IE5VTEwpIHsKKyAgICByZWN0ID0gRlhfUkVDVCgwLCAwLCAwLCAwKTsKKyAgfSBlbHNlIHsKKyAgICByZWN0LmxlZnQgPSByZWN0LmJvdHRvbSA9IHJlY3QucmlnaHQgPSByZWN0LnRvcCA9IDA7CisgICAgRlhGVF9GYWNlIGZhY2UgPSBtX0ZvbnQubV9GYWNlOworICAgIGlmIChGWEZUX0lzX0ZhY2VfVHJpY2t5KGZhY2UpKSB7CisgICAgICBpbnQgZXJyID0gRlhGVF9Mb2FkX0dseXBoKGZhY2UsIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKKyAgICAgIGlmICghZXJyKSB7CisgICAgICAgIEZYRlRfQkJveCBjYm94OworICAgICAgICBGWEZUX0dseXBoIGdseXBoOworICAgICAgICBlcnIgPSBGWEZUX0dldF9HbHlwaCgoKEZYRlRfRmFjZSlmYWNlKS0+Z2x5cGgsICZnbHlwaCk7CisgICAgICAgIGlmICghZXJyKSB7CisgICAgICAgICAgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUywgJmNib3gpOworICAgICAgICAgIGludCBwaXhlbF9zaXplX3ggPSAoKEZYRlRfRmFjZSlmYWNlKS0+c2l6ZS0+bWV0cmljcy54X3BwZW07CisgICAgICAgICAgaW50IHBpeGVsX3NpemVfeSA9ICgoRlhGVF9GYWNlKWZhY2UpLT5zaXplLT5tZXRyaWNzLnlfcHBlbTsKKyAgICAgICAgICBpZiAocGl4ZWxfc2l6ZV94ID09IDAgfHwgcGl4ZWxfc2l6ZV95ID09IDApIHsKKyAgICAgICAgICAgIHJlY3QubGVmdCA9IGNib3gueE1pbjsKKyAgICAgICAgICAgIHJlY3QucmlnaHQgPSBjYm94LnhNYXg7CisgICAgICAgICAgICByZWN0LnRvcCA9IGNib3gueU1heDsKKyAgICAgICAgICAgIHJlY3QuYm90dG9tID0gY2JveC55TWluOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWN0LmxlZnQgPSBjYm94LnhNaW4gKiAxMDAwIC8gcGl4ZWxfc2l6ZV94OworICAgICAgICAgICAgcmVjdC5yaWdodCA9IGNib3gueE1heCAqIDEwMDAgLyBwaXhlbF9zaXplX3g7CisgICAgICAgICAgICByZWN0LnRvcCA9IGNib3gueU1heCAqIDEwMDAgLyBwaXhlbF9zaXplX3k7CisgICAgICAgICAgICByZWN0LmJvdHRvbSA9IGNib3gueU1pbiAqIDEwMDAgLyBwaXhlbF9zaXplX3k7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChyZWN0LnRvcCA+IEZYRlRfR2V0X0ZhY2VfQXNjZW5kZXIoZmFjZSkpIHsKKyAgICAgICAgICAgIHJlY3QudG9wID0gRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihmYWNlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHJlY3QuYm90dG9tIDwgRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIoZmFjZSkpIHsKKyAgICAgICAgICAgIHJlY3QuYm90dG9tID0gRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIoZmFjZSk7CisgICAgICAgICAgfQorICAgICAgICAgIEZYRlRfRG9uZV9HbHlwaChnbHlwaCk7CiAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW50IGVyciA9IEZYRlRfTG9hZF9HbHlwaChmYWNlLCBnbHlwaF9pbmRleCwgRlhGVF9MT0FEX05PX1NDQUxFKTsKKyAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICByZWN0LmxlZnQgPSBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKGZhY2UpLCBmYWNlKTsKKyAgICAgICAgcmVjdC5yaWdodCA9IFRUMlBERigKKyAgICAgICAgICAgIEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChmYWNlKSArIEZYRlRfR2V0X0dseXBoX1dpZHRoKGZhY2UpLAorICAgICAgICAgICAgZmFjZSk7CisgICAgICAgIHJlY3QudG9wID0gVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShmYWNlKSwgZmFjZSk7CisgICAgICAgIHJlY3QudG9wICs9IHJlY3QudG9wIC8gNjQ7CisgICAgICAgIHJlY3QuYm90dG9tID0gVFQyUERGKAorICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKGZhY2UpIC0gRlhGVF9HZXRfR2x5cGhfSGVpZ2h0KGZhY2UpLAorICAgICAgICAgICAgZmFjZSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChtX3BGb250RmlsZSA9PSBOVUxMICYmIG1fQ2hhcnNldCA9PSBDSURTRVRfSkFQQU4xKSB7CisgICAgRlhfV09SRCBDSUQgPSBDSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICAgIGNvbnN0IHVpbnQ4X3QqIHBUcmFuc2Zvcm0gPSBHZXRDSURUcmFuc2Zvcm0oQ0lEKTsKKyAgICBpZiAocFRyYW5zZm9ybSAmJiAhYlZlcnQpIHsKKyAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bM10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVs0XSkgKiAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVs1XSkgKiAxMDAwKTsKKyAgICAgIENGWF9GbG9hdFJlY3QgcmVjdF9mKHJlY3QpOworICAgICAgcmVjdF9mLlRyYW5zZm9ybSgmbWF0cml4KTsKKyAgICAgIHJlY3QgPSByZWN0X2YuR2V0T3V0dGVyUmVjdCgpOworICAgIH0KKyAgfQorICBpZiAoY2hhcmNvZGUgPCAyNTYpIHsKKyAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5Cb3R0b20gPSAoc2hvcnQpcmVjdC5ib3R0b207CisgICAgbV9DaGFyQkJveFtjaGFyY29kZV0uTGVmdCA9IChzaG9ydClyZWN0LmxlZnQ7CisgICAgbV9DaGFyQkJveFtjaGFyY29kZV0uUmlnaHQgPSAoc2hvcnQpcmVjdC5yaWdodDsKKyAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5Ub3AgPSAoc2hvcnQpcmVjdC50b3A7CisgIH0KK30KK2ludCBDUERGX0NJREZvbnQ6OkdldENoYXJXaWR0aEYoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBsZXZlbCkgeworICBpZiAobV9wQW5zaVdpZHRocyAmJiBjaGFyY29kZSA8IDB4ODApIHsKKyAgICByZXR1cm4gbV9wQW5zaVdpZHRoc1tjaGFyY29kZV07CisgIH0KKyAgRlhfV09SRCBjaWQgPSBDSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICBpbnQgc2l6ZSA9IG1fV2lkdGhMaXN0LkdldFNpemUoKTsKKyAgRlhfRFdPUkQqIGxpc3QgPSBtX1dpZHRoTGlzdC5HZXREYXRhKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAzKSB7CisgICAgaWYgKGNpZCA+PSBsaXN0W2ldICYmIGNpZCA8PSBsaXN0W2kgKyAxXSkgeworICAgICAgcmV0dXJuIChpbnQpbGlzdFtpICsgMl07CisgICAgfQorICB9CisgIHJldHVybiBtX0RlZmF1bHRXaWR0aDsKK30KK3Nob3J0IENQREZfQ0lERm9udDo6R2V0VmVydFdpZHRoKEZYX1dPUkQgQ0lEKSBjb25zdCB7CisgIEZYX0RXT1JEIHZlcnRzaXplID0gbV9WZXJ0TWV0cmljcy5HZXRTaXplKCkgLyA1OworICBpZiAodmVydHNpemUgPT0gMCkgewogICAgIHJldHVybiBtX0RlZmF1bHRXMTsKKyAgfQorICBjb25zdCBGWF9EV09SRCogcFRhYmxlID0gbV9WZXJ0TWV0cmljcy5HZXREYXRhKCk7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCB2ZXJ0c2l6ZTsgaSsrKQorICAgIGlmIChwVGFibGVbaSAqIDVdIDw9IENJRCAmJiBwVGFibGVbaSAqIDUgKyAxXSA+PSBDSUQpIHsKKyAgICAgIHJldHVybiAoc2hvcnQpKGludClwVGFibGVbaSAqIDUgKyAyXTsKKyAgICB9CisgIHJldHVybiBtX0RlZmF1bHRXMTsKIH0KLXZvaWQgQ1BERl9DSURGb250OjpHZXRWZXJ0T3JpZ2luKEZYX1dPUkQgQ0lELCBzaG9ydCYgdngsIHNob3J0ICZ2eSkgY29uc3QKLXsKLSAgICBGWF9EV09SRCB2ZXJ0c2l6ZSA9IG1fVmVydE1ldHJpY3MuR2V0U2l6ZSgpIC8gNTsKLSAgICBpZiAodmVydHNpemUpIHsKLSAgICAgICAgY29uc3QgRlhfRFdPUkQqIHBUYWJsZSA9IG1fVmVydE1ldHJpY3MuR2V0RGF0YSgpOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgdmVydHNpemU7IGkgKyspCi0gICAgICAgICAgICBpZiAocFRhYmxlW2kgKiA1XSA8PSBDSUQgJiYgcFRhYmxlW2kgKiA1ICsgMV0gPj0gQ0lEKSB7Ci0gICAgICAgICAgICAgICAgdnggPSAoc2hvcnQpKGludClwVGFibGVbaSAqIDUgKyAzXTsKLSAgICAgICAgICAgICAgICB2eSA9IChzaG9ydCkoaW50KXBUYWJsZVtpICogNSArIDRdOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KK3ZvaWQgQ1BERl9DSURGb250OjpHZXRWZXJ0T3JpZ2luKEZYX1dPUkQgQ0lELCBzaG9ydCYgdngsIHNob3J0JiB2eSkgY29uc3QgeworICBGWF9EV09SRCB2ZXJ0c2l6ZSA9IG1fVmVydE1ldHJpY3MuR2V0U2l6ZSgpIC8gNTsKKyAgaWYgKHZlcnRzaXplKSB7CisgICAgY29uc3QgRlhfRFdPUkQqIHBUYWJsZSA9IG1fVmVydE1ldHJpY3MuR2V0RGF0YSgpOworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCB2ZXJ0c2l6ZTsgaSsrKQorICAgICAgaWYgKHBUYWJsZVtpICogNV0gPD0gQ0lEICYmIHBUYWJsZVtpICogNSArIDFdID49IENJRCkgeworICAgICAgICB2eCA9IChzaG9ydCkoaW50KXBUYWJsZVtpICogNSArIDNdOworICAgICAgICB2eSA9IChzaG9ydCkoaW50KXBUYWJsZVtpICogNSArIDRdOworICAgICAgICByZXR1cm47CisgICAgICB9CisgIH0KKyAgRlhfRFdPUkQgZHdXaWR0aCA9IG1fRGVmYXVsdFdpZHRoOworICBpbnQgc2l6ZSA9IG1fV2lkdGhMaXN0LkdldFNpemUoKTsKKyAgY29uc3QgRlhfRFdPUkQqIGxpc3QgPSBtX1dpZHRoTGlzdC5HZXREYXRhKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAzKSB7CisgICAgaWYgKENJRCA+PSBsaXN0W2ldICYmIENJRCA8PSBsaXN0W2kgKyAxXSkgeworICAgICAgZHdXaWR0aCA9IChGWF9XT1JEKWxpc3RbaSArIDJdOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIEZYX0RXT1JEIGR3V2lkdGggPSBtX0RlZmF1bHRXaWR0aDsKLSAgICBpbnQgc2l6ZSA9IG1fV2lkdGhMaXN0LkdldFNpemUoKTsKLSAgICBjb25zdCBGWF9EV09SRCogbGlzdCA9IG1fV2lkdGhMaXN0LkdldERhdGEoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMykgewotICAgICAgICBpZiAoQ0lEID49IGxpc3RbaV0gJiYgQ0lEIDw9IGxpc3RbaSArIDFdKSB7Ci0gICAgICAgICAgICBkd1dpZHRoID0gKEZYX1dPUkQpbGlzdFtpICsgMl07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICB2eCA9IChzaG9ydClkd1dpZHRoIC8gMjsKLSAgICB2eSA9IChzaG9ydCltX0RlZmF1bHRWWTsKKyAgfQorICB2eCA9IChzaG9ydClkd1dpZHRoIC8gMjsKKyAgdnkgPSAoc2hvcnQpbV9EZWZhdWx0Vlk7CiB9Ci1pbnQJQ1BERl9DSURGb250OjpHZXRHbHlwaEluZGV4KEZYX0RXT1JEIHVuaWNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGgpCi17Ci0gICAgaWYgKHBWZXJ0R2x5cGgpIHsKLSAgICAgICAgKnBWZXJ0R2x5cGggPSBGQUxTRTsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCB1bmljb2RlICk7Ci0gICAgaWYgKHVuaWNvZGUgPT0gMHgyNTAyKSB7Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0gICAgaWYgKGluZGV4ICYmIElzVmVydFdyaXRpbmcoKSkgewotICAgICAgICBpZiAobV9wVFRHU1VCVGFibGUpIHsKLSAgICAgICAgICAgIFRUX3VpbnQzMl90IHZpbmRleCA9IDA7Ci0gICAgICAgICAgICBtX3BUVEdTVUJUYWJsZS0+R2V0VmVydGljYWxHbHlwaChpbmRleCwgJnZpbmRleCk7Ci0gICAgICAgICAgICBpZiAodmluZGV4KSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSB2aW5kZXg7Ci0gICAgICAgICAgICAgICAgaWYgKHBWZXJ0R2x5cGgpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBWZXJ0R2x5cGggPSBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbmRleDsKK2ludCBDUERGX0NJREZvbnQ6OkdldEdseXBoSW5kZXgoRlhfRFdPUkQgdW5pY29kZSwgRlhfQk9PTCogcFZlcnRHbHlwaCkgeworICBpZiAocFZlcnRHbHlwaCkgeworICAgICpwVmVydEdseXBoID0gRkFMU0U7CisgIH0KKyAgaW50IGluZGV4ID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCB1bmljb2RlKTsKKyAgaWYgKHVuaWNvZGUgPT0gMHgyNTAyKSB7CisgICAgcmV0dXJuIGluZGV4OworICB9CisgIGlmIChpbmRleCAmJiBJc1ZlcnRXcml0aW5nKCkpIHsKKyAgICBpZiAobV9wVFRHU1VCVGFibGUpIHsKKyAgICAgIFRUX3VpbnQzMl90IHZpbmRleCA9IDA7CisgICAgICBtX3BUVEdTVUJUYWJsZS0+R2V0VmVydGljYWxHbHlwaChpbmRleCwgJnZpbmRleCk7CisgICAgICBpZiAodmluZGV4KSB7CisgICAgICAgIGluZGV4ID0gdmluZGV4OworICAgICAgICBpZiAocFZlcnRHbHlwaCkgeworICAgICAgICAgICpwVmVydEdseXBoID0gVFJVRTsKICAgICAgICAgfQotICAgICAgICBpZiAoTlVMTCA9PSBtX0ZvbnQubV9wR3N1YkRhdGEpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gMDsKLSAgICAgICAgICAgIGludCBlcnJvciA9IEZYRlRfTG9hZF9TZm50X1RhYmxlKCBtX0ZvbnQubV9GYWNlLCBGVF9NQUtFX1RBRygnRycsICdTJywgJ1UnLCAnQicpLCAwLCBOVUxMLCAmbGVuZ3RoKTsKLSAgICAgICAgICAgIGlmICghZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBtX0ZvbnQubV9wR3N1YkRhdGEgPSAodW5zaWduZWQgY2hhciopRlhfQWxsb2ModWludDhfdCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfU2ZudF9UYWJsZSggbV9Gb250Lm1fRmFjZSwgRlRfTUFLRV9UQUcoJ0cnLCAnUycsICdVJywgJ0InKSwgMCwgbV9Gb250Lm1fcEdzdWJEYXRhLCBOVUxMKTsKLSAgICAgICAgaWYgKCFlcnJvciAmJiBtX0ZvbnQubV9wR3N1YkRhdGEpIHsKLSAgICAgICAgICAgIG1fcFRUR1NVQlRhYmxlID0gbmV3IENGWF9DVFRHU1VCVGFibGU7Ci0gICAgICAgICAgICBtX3BUVEdTVUJUYWJsZS0+TG9hZEdTVUJUYWJsZSgoRlRfQnl0ZXMpbV9Gb250Lm1fcEdzdWJEYXRhKTsKLSAgICAgICAgICAgIFRUX3VpbnQzMl90IHZpbmRleCA9IDA7Ci0gICAgICAgICAgICBtX3BUVEdTVUJUYWJsZS0+R2V0VmVydGljYWxHbHlwaChpbmRleCwgJnZpbmRleCk7Ci0gICAgICAgICAgICBpZiAodmluZGV4KSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSB2aW5kZXg7Ci0gICAgICAgICAgICAgICAgaWYgKHBWZXJ0R2x5cGgpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBWZXJ0R2x5cGggPSBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICB9CisgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQotICAgIGlmIChwVmVydEdseXBoKSB7Ci0gICAgICAgICpwVmVydEdseXBoID0gRkFMU0U7CisgICAgaWYgKE5VTEwgPT0gbV9Gb250Lm1fcEdzdWJEYXRhKSB7CisgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aCA9IDA7CisgICAgICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfU2ZudF9UYWJsZSgKKyAgICAgICAgICBtX0ZvbnQubV9GYWNlLCBGVF9NQUtFX1RBRygnRycsICdTJywgJ1UnLCAnQicpLCAwLCBOVUxMLCAmbGVuZ3RoKTsKKyAgICAgIGlmICghZXJyb3IpIHsKKyAgICAgICAgbV9Gb250Lm1fcEdzdWJEYXRhID0gKHVuc2lnbmVkIGNoYXIqKUZYX0FsbG9jKHVpbnQ4X3QsIGxlbmd0aCk7CisgICAgICB9CisgICAgfQorICAgIGludCBlcnJvciA9CisgICAgICAgIEZYRlRfTG9hZF9TZm50X1RhYmxlKG1fRm9udC5tX0ZhY2UsIEZUX01BS0VfVEFHKCdHJywgJ1MnLCAnVScsICdCJyksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRm9udC5tX3BHc3ViRGF0YSwgTlVMTCk7CisgICAgaWYgKCFlcnJvciAmJiBtX0ZvbnQubV9wR3N1YkRhdGEpIHsKKyAgICAgIG1fcFRUR1NVQlRhYmxlID0gbmV3IENGWF9DVFRHU1VCVGFibGU7CisgICAgICBtX3BUVEdTVUJUYWJsZS0+TG9hZEdTVUJUYWJsZSgoRlRfQnl0ZXMpbV9Gb250Lm1fcEdzdWJEYXRhKTsKKyAgICAgIFRUX3VpbnQzMl90IHZpbmRleCA9IDA7CisgICAgICBtX3BUVEdTVUJUYWJsZS0+R2V0VmVydGljYWxHbHlwaChpbmRleCwgJnZpbmRleCk7CisgICAgICBpZiAodmluZGV4KSB7CisgICAgICAgIGluZGV4ID0gdmluZGV4OworICAgICAgICBpZiAocFZlcnRHbHlwaCkgeworICAgICAgICAgICpwVmVydEdseXBoID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KICAgICByZXR1cm4gaW5kZXg7CisgIH0KKyAgaWYgKHBWZXJ0R2x5cGgpIHsKKyAgICAqcFZlcnRHbHlwaCA9IEZBTFNFOworICB9CisgIHJldHVybiBpbmRleDsKIH0KLWludCBDUERGX0NJREZvbnQ6OkdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9CT09MICpwVmVydEdseXBoKQotewotICAgIGlmIChwVmVydEdseXBoKSB7Ci0gICAgICAgICpwVmVydEdseXBoID0gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3BGb250RmlsZSA9PSBOVUxMICYmIG1fcENJRFRvR0lETWFwID09IE5VTEwpIHsKLSAgICAgICAgRlhfV09SRCBjaWQgPSBDSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotICAgICAgICBGWF9XQ0hBUiB1bmljb2RlID0gMDsKLSAgICAgICAgaWYgKG1fYkNJRElzR0lEKSB7CitpbnQgQ1BERl9DSURGb250OjpHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgRlhfQk9PTCogcFZlcnRHbHlwaCkgeworICBpZiAocFZlcnRHbHlwaCkgeworICAgICpwVmVydEdseXBoID0gRkFMU0U7CisgIH0KKyAgaWYgKG1fcEZvbnRGaWxlID09IE5VTEwgJiYgbV9wQ0lEVG9HSURNYXAgPT0gTlVMTCkgeworICAgIEZYX1dPUkQgY2lkID0gQ0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICBGWF9XQ0hBUiB1bmljb2RlID0gMDsKKyAgICBpZiAobV9iQ0lESXNHSUQpIHsKICNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICAgICAgcmV0dXJuIGNpZDsKKyAgICAgIHJldHVybiBjaWQ7CiAjZWxzZQotICAgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBQREZGT05UX1NZTUJPTElDKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHVuaV9zdHIgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICAgICAgICAgIGlmICh1bmlfc3RyLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmljb2RlID0gdW5pX3N0ci5HZXRBdCgwKTsKKyAgICAgIGlmIChtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykgeworICAgICAgICByZXR1cm4gY2lkOworICAgICAgfQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pX3N0ciA9IFVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICAgICAgaWYgKHVuaV9zdHIuSXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBjaWQ7CisgICAgICB9CisgICAgICB1bmljb2RlID0gdW5pX3N0ci5HZXRBdCgwKTsKICNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICBpZiAoY2lkICYmIG1fcENJRDJVbmljb2RlTWFwICYmIG1fcENJRDJVbmljb2RlTWFwLT5Jc0xvYWRlZCgpKSB7CisgICAgICAgIHVuaWNvZGUgPSBtX3BDSUQyVW5pY29kZU1hcC0+VW5pY29kZUZyb21DSUQoY2lkKTsKKyAgICAgIH0KKyAgICAgIGlmICh1bmljb2RlID09IDApIHsKKyAgICAgICAgdW5pY29kZSA9IF9Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgIH0KKyAgICAgIGlmICh1bmljb2RlID09IDAgJiYgIShtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykpIHsKKyAgICAgICAgdW5pY29kZSA9IFVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpLkdldEF0KDApOworICAgICAgfQorICAgIH0KKyAgICBpZiAodW5pY29kZSA9PSAwKSB7CisgICAgICBpZiAoIW1fYkFkb2JlQ291cmllclN0ZCkgeworICAgICAgICByZXR1cm4gY2hhcmNvZGUgPT0gMCA/IC0xIDogKGludCljaGFyY29kZTsKKyAgICAgIH0KKyAgICAgIGNoYXJjb2RlICs9IDMxOworICAgICAgaW50IGluZGV4ID0gMCwgaUJhc2VFbmNvZGluZzsKKyAgICAgIEZYX0JPT0wgYk1TVW5pY29kZSA9IEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAzLCAxKTsKKyAgICAgIEZYX0JPT0wgYk1hY1JvbWFuID0gRkFMU0U7CisgICAgICBpZiAoIWJNU1VuaWNvZGUpIHsKKyAgICAgICAgYk1hY1JvbWFuID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDEsIDApOworICAgICAgfQorICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQ7CisgICAgICBpZiAoYk1TVW5pY29kZSkgeworICAgICAgICBpQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJOworICAgICAgfSBlbHNlIGlmIChiTWFjUm9tYW4pIHsKKyAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU47CisgICAgICB9CisgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0gR2V0QWRvYmVDaGFyTmFtZShpQmFzZUVuY29kaW5nLCBOVUxMLCBjaGFyY29kZSk7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBjaGFyY29kZSA9PSAwID8gLTEgOiAoaW50KWNoYXJjb2RlOworICAgICAgfQorICAgICAgRlhfV09SRCB1bmljb2RlID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOworICAgICAgaWYgKHVuaWNvZGUpIHsKKyAgICAgICAgaWYgKGJNU1VuaWNvZGUpIHsKKyAgICAgICAgICBpbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgdW5pY29kZSk7CisgICAgICAgIH0gZWxzZSBpZiAoYk1hY1JvbWFuKSB7CisgICAgICAgICAgRlhfRFdPUkQgbWFjY29kZSA9CisgICAgICAgICAgICAgIEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgdW5pY29kZSk7CisgICAgICAgICAgaW5kZXggPSAhbWFjY29kZSA/IEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250Lm1fRmFjZSwgKGNoYXIqKW5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgbWFjY29kZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY2lkICYmIG1fcENJRDJVbmljb2RlTWFwICYmIG1fcENJRDJVbmljb2RlTWFwLT5Jc0xvYWRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdW5pY29kZSA9IG1fcENJRDJVbmljb2RlTWFwLT5Vbmljb2RlRnJvbUNJRChjaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVuaWNvZGUgPT0gMCkgewotICAgICAgICAgICAgICAgIHVuaWNvZGUgPSBfVW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodW5pY29kZSA9PSAwICYmICEobV9GbGFncyAmIFBERkZPTlRfU1lNQk9MSUMpKSB7Ci0gICAgICAgICAgICAgICAgdW5pY29kZSA9IFVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpLkdldEF0KDApOwotICAgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIHVuaWNvZGUpOwogICAgICAgICB9Ci0gICAgICAgIGlmICh1bmljb2RlID09IDApIHsKLSAgICAgICAgICAgIGlmICghbV9iQWRvYmVDb3VyaWVyU3RkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJjb2RlID09IDAgPyAtMSA6IChpbnQpY2hhcmNvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGFyY29kZSArPSAzMTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDAsIGlCYXNlRW5jb2Rpbmc7Ci0gICAgICAgICAgICBGWF9CT09MIGJNU1VuaWNvZGUgPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMSk7Ci0gICAgICAgICAgICBGWF9CT09MIGJNYWNSb21hbiA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKCFiTVNVbmljb2RlKSB7Ci0gICAgICAgICAgICAgICAgYk1hY1JvbWFuID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDEsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQ7Ci0gICAgICAgICAgICBpZiAoYk1TVW5pY29kZSkgewotICAgICAgICAgICAgICAgIGlCYXNlRW5jb2RpbmcgPSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJNYWNSb21hbikgewotICAgICAgICAgICAgICAgIGlCYXNlRW5jb2RpbmcgPSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUoaUJhc2VFbmNvZGluZywgTlVMTCwgY2hhcmNvZGUpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjaGFyY29kZSA9PSAwID8gLTEgOiAoaW50KWNoYXJjb2RlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfV09SRCB1bmljb2RlID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKHVuaWNvZGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoYk1TVW5pY29kZSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiTWFjUm9tYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFjY29kZSA9IEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gIW1hY2NvZGUgPyBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5tX0ZhY2UsIChjaGFyICopbmFtZSkgOiBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIG1hY2NvZGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIHVuaWNvZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJjb2RlID09IDAgPyAtMSA6IChpbnQpY2hhcmNvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA9PSAweGZmZmYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2hhcmNvZGUgPT0gMCA/IC0xIDogKGludCljaGFyY29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9DaGFyc2V0ID09IENJRFNFVF9KQVBBTjEpIHsKLSAgICAgICAgICAgIGlmICh1bmljb2RlID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICB1bmljb2RlID0gJy8nOwotICAgICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGNoYXJjb2RlID09IDAgPyAtMSA6IChpbnQpY2hhcmNvZGU7CisgICAgICB9CisgICAgICBpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA9PSAweGZmZmYpIHsKKyAgICAgICAgcmV0dXJuIGNoYXJjb2RlID09IDAgPyAtMSA6IChpbnQpY2hhcmNvZGU7CisgICAgICB9CisgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorICAgIGlmIChtX0NoYXJzZXQgPT0gQ0lEU0VUX0pBUEFOMSkgeworICAgICAgaWYgKHVuaWNvZGUgPT0gJ1xcJykgeworICAgICAgICB1bmljb2RlID0gJy8nOworICAgICAgfQogI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICBlbHNlIGlmICh1bmljb2RlID09IDB4YTUpIHsKLSAgICAgICAgICAgICAgICB1bmljb2RlID0gMHg1YzsKLSAgICAgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHVuaWNvZGUgPT0gMHhhNSkgeworICAgICAgICB1bmljb2RlID0gMHg1YzsKKyAgICAgIH0KICNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0ZvbnQubV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiB1bmljb2RlOwotICAgICAgICB9Ci0gICAgICAgIGludCBlcnIgPSBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSk7Ci0gICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQobV9Gb250Lm1fRmFjZSk7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCByZXQgPSBGVF9DaGFyQ29kZUZyb21Vbmljb2RlKEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhtX0ZvbnQubV9GYWNlKVtpXSksIChGWF9XQ0hBUiljaGFyY29kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWEZUX1NldF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMobV9Gb250Lm1fRmFjZSlbaV0pOwotICAgICAgICAgICAgICAgIHVuaWNvZGUgPSAoRlhfV0NIQVIpcmV0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPT0gRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQobV9Gb250Lm1fRmFjZSkgJiYgaSkgewotICAgICAgICAgICAgICAgIEZYRlRfU2V0X0NoYXJtYXAobV9Gb250Lm1fRmFjZSwgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhtX0ZvbnQubV9GYWNlKVswXSk7Ci0gICAgICAgICAgICAgICAgdW5pY29kZSA9IChGWF9XQ0hBUiljaGFyY29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoRlhGVF9HZXRfRmFjZV9DaGFybWFwKG1fRm9udC5tX0ZhY2UpKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBHZXRHbHlwaEluZGV4KHVuaWNvZGUsIHBWZXJ0R2x5cGgpOwotICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVuaWNvZGUgOwogICAgIH0KICAgICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgIHJldHVybiB1bmljb2RlOwogICAgIH0KLSAgICBGWF9XT1JEIGNpZCA9IENJREZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgaWYgKG1fYlR5cGUxKSB7Ci0gICAgICAgIGlmIChOVUxMID09IG1fcENJRFRvR0lETWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2lkOworICAgIGludCBlcnIgPSBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChtX0ZvbnQubV9GYWNlKTsgaSsrKSB7CisgICAgICAgIEZYX0RXT1JEIHJldCA9IEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoCisgICAgICAgICAgICBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMobV9Gb250Lm1fRmFjZSlbaV0pLAorICAgICAgICAgICAgKEZYX1dDSEFSKWNoYXJjb2RlKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgRlhGVF9TZXRfQ2hhcm1hcChtX0ZvbnQubV9GYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMobV9Gb250Lm1fRmFjZSlbaV0pOworICAgICAgICB1bmljb2RlID0gKEZYX1dDSEFSKXJldDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoaSA9PSBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChtX0ZvbnQubV9GYWNlKSAmJiBpKSB7CisgICAgICAgIEZYRlRfU2V0X0NoYXJtYXAobV9Gb250Lm1fRmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKG1fRm9udC5tX0ZhY2UpWzBdKTsKKyAgICAgICAgdW5pY29kZSA9IChGWF9XQ0hBUiljaGFyY29kZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcChtX0ZvbnQubV9GYWNlKSkgeworICAgICAgaW50IGluZGV4ID0gR2V0R2x5cGhJbmRleCh1bmljb2RlLCBwVmVydEdseXBoKTsKKyAgICAgIGlmIChpbmRleCA9PSAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIHVuaWNvZGU7CisgIH0KKyAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBGWF9XT1JEIGNpZCA9IENJREZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgIGlmIChtX2JUeXBlMSkgeworICAgIGlmIChOVUxMID09IG1fcENJRFRvR0lETWFwKSB7CisgICAgICByZXR1cm4gY2lkOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wQ0lEVG9HSURNYXAgPT0gTlVMTCkgeworICAgICAgaWYgKG1fcEZvbnRGaWxlICYmIG1fcENNYXAtPm1fcE1hcHBpbmcgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gY2lkOworICAgICAgfQorICAgICAgaWYgKG1fcENNYXAtPm1fQ29kaW5nID09IENJRENPRElOR19VTktOT1dOIHx8CisgICAgICAgICAgRlhGVF9HZXRfRmFjZV9DaGFybWFwKG1fRm9udC5tX0ZhY2UpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGNpZDsKKyAgICAgIH0KKyAgICAgIGlmIChGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcChtX0ZvbnQubV9GYWNlKSkgPT0KKyAgICAgICAgICBGWEZUX0VOQ09ESU5HX1VOSUNPREUpIHsKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZV9zdHIgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgICAgaWYgKHVuaWNvZGVfc3RyLklzRW1wdHkoKSkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBjaGFyY29kZSA9IHVuaWNvZGVfc3RyLkdldEF0KDApOworICAgICAgfQorICAgICAgcmV0dXJuIEdldEdseXBoSW5kZXgoY2hhcmNvZGUsIHBWZXJ0R2x5cGgpOworICAgIH0KKyAgfQorICBGWF9EV09SRCBieXRlX3BvcyA9IGNpZCAqIDI7CisgIGlmIChieXRlX3BvcyArIDIgPiBtX3BDSURUb0dJRE1hcC0+R2V0U2l6ZSgpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNvbnN0IHVpbnQ4X3QqIHBkYXRhID0gbV9wQ0lEVG9HSURNYXAtPkdldERhdGEoKSArIGJ5dGVfcG9zOworICByZXR1cm4gcGRhdGFbMF0gKiAyNTYgKyBwZGF0YVsxXTsKK30KK0ZYX0RXT1JEIENQREZfQ0lERm9udDo6R2V0TmV4dENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdHJMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgb2Zmc2V0KSBjb25zdCB7CisgIHJldHVybiBtX3BDTWFwLT5HZXROZXh0Q2hhcihwU3RyaW5nLCBuU3RyTGVuLCBvZmZzZXQpOworfQoraW50IENQREZfQ0lERm9udDo6R2V0Q2hhclNpemUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcENNYXAtPkdldENoYXJTaXplKGNoYXJjb2RlKTsKK30KK2ludCBDUERGX0NJREZvbnQ6OkNvdW50Q2hhcihjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgc2l6ZSkgY29uc3QgeworICByZXR1cm4gbV9wQ01hcC0+Q291bnRDaGFyKHBTdHJpbmcsIHNpemUpOworfQoraW50IENQREZfQ0lERm9udDo6QXBwZW5kQ2hhcihGWF9DSEFSKiBzdHIsIEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCB7CisgIHJldHVybiBtX3BDTWFwLT5BcHBlbmRDaGFyKHN0ciwgY2hhcmNvZGUpOworfQorRlhfQk9PTCBDUERGX0NJREZvbnQ6OklzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCB7CisgIGlmICghbV9wQ01hcC0+SXNMb2FkZWQoKSB8fCBtX3BDSUQyVW5pY29kZU1hcCA9PSBOVUxMIHx8CisgICAgICAhbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkpIHsKKyAgICByZXR1cm4gbV9wQ01hcC0+bV9Db2RpbmcgIT0gQ0lEQ09ESU5HX1VOS05PV047CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfQ0lERm9udDo6SXNGb250U3R5bGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENQREZfQ0lERm9udDo6TG9hZFN1YnN0Rm9udCgpIHsKKyAgbV9Gb250LkxvYWRTdWJzdChtX0Jhc2VGb250LCAhbV9iVHlwZTEsIG1fRmxhZ3MsIG1fU3RlbVYgKiA1LCBtX0l0YWxpY0FuZ2xlLAorICAgICAgICAgICAgICAgICAgIGdfQ2hhcnNldENQc1ttX0NoYXJzZXRdLCBJc1ZlcnRXcml0aW5nKCkpOworfQordm9pZCBDUERGX0NJREZvbnQ6OkxvYWRNZXRyaWNzQXJyYXkoQ1BERl9BcnJheSogcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RXb3JkQXJyYXkmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRWxlbWVudHMpIHsKKyAgaW50IHdpZHRoX3N0YXR1cyA9IDA7CisgIGludCBpQ3VyRWxlbWVudCA9IDA7CisgIGludCBmaXJzdF9jb2RlID0gMCwgbGFzdF9jb2RlOworICBGWF9EV09SRCBjb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOworICAgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgICAgaWYgKHdpZHRoX3N0YXR1cyAhPSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwT2JqOworICAgICAgRlhfRFdPUkQgY291bnQgPSBwQXJyYXktPkdldENvdW50KCk7CisgICAgICBmb3IgKEZYX0RXT1JEIGogPSAwOyBqIDwgY291bnQ7IGogKz0gbkVsZW1lbnRzKSB7CisgICAgICAgIHJlc3VsdC5BZGQoZmlyc3RfY29kZSk7CisgICAgICAgIHJlc3VsdC5BZGQoZmlyc3RfY29kZSk7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbkVsZW1lbnRzOyBrKyspIHsKKyAgICAgICAgICByZXN1bHQuQWRkKHBBcnJheS0+R2V0SW50ZWdlcihqICsgaykpOworICAgICAgICB9CisgICAgICAgIGZpcnN0X2NvZGUrKzsKKyAgICAgIH0KKyAgICAgIHdpZHRoX3N0YXR1cyA9IDA7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1fcENJRFRvR0lETWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChtX3BGb250RmlsZSAmJiBtX3BDTWFwLT5tX3BNYXBwaW5nID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2lkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fcENNYXAtPm1fQ29kaW5nID09IENJRENPRElOR19VTktOT1dOIHx8IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcChtX0ZvbnQubV9GYWNlKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcChtX0ZvbnQubV9GYWNlKSkgPT0gRlhGVF9FTkNPRElOR19VTklDT0RFKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZV9zdHIgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICAgICAgICAgICAgICBpZiAodW5pY29kZV9zdHIuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hhcmNvZGUgPSB1bmljb2RlX3N0ci5HZXRBdCgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBHZXRHbHlwaEluZGV4KGNoYXJjb2RlLCBwVmVydEdseXBoKTsKKyAgICAgIGlmICh3aWR0aF9zdGF0dXMgPT0gMCkgeworICAgICAgICBmaXJzdF9jb2RlID0gcE9iai0+R2V0SW50ZWdlcigpOworICAgICAgICB3aWR0aF9zdGF0dXMgPSAxOworICAgICAgfSBlbHNlIGlmICh3aWR0aF9zdGF0dXMgPT0gMSkgeworICAgICAgICBsYXN0X2NvZGUgPSBwT2JqLT5HZXRJbnRlZ2VyKCk7CisgICAgICAgIHdpZHRoX3N0YXR1cyA9IDI7CisgICAgICAgIGlDdXJFbGVtZW50ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghaUN1ckVsZW1lbnQpIHsKKyAgICAgICAgICByZXN1bHQuQWRkKGZpcnN0X2NvZGUpOworICAgICAgICAgIHJlc3VsdC5BZGQobGFzdF9jb2RlKTsKICAgICAgICAgfQotICAgIH0KLSAgICBGWF9EV09SRCBieXRlX3BvcyA9IGNpZCAqIDI7Ci0gICAgaWYgKGJ5dGVfcG9zICsgMiA+IG1fcENJRFRvR0lETWFwLT5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBjb25zdCB1aW50OF90KiBwZGF0YSA9IG1fcENJRFRvR0lETWFwLT5HZXREYXRhKCkgKyBieXRlX3BvczsKLSAgICByZXR1cm4gcGRhdGFbMF0gKiAyNTYgKyBwZGF0YVsxXTsKLX0KLUZYX0RXT1JEIENQREZfQ0lERm9udDo6R2V0TmV4dENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywgaW50IG5TdHJMZW4sIGludCYgb2Zmc2V0KSBjb25zdAotewotICAgIHJldHVybiBtX3BDTWFwLT5HZXROZXh0Q2hhcihwU3RyaW5nLCBuU3RyTGVuLCBvZmZzZXQpOwotfQotaW50IENQREZfQ0lERm9udDo6R2V0Q2hhclNpemUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcENNYXAtPkdldENoYXJTaXplKGNoYXJjb2RlKTsKLX0KLWludCBDUERGX0NJREZvbnQ6OkNvdW50Q2hhcihjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgc2l6ZSkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wQ01hcC0+Q291bnRDaGFyKHBTdHJpbmcsIHNpemUpOwotfQotaW50IENQREZfQ0lERm9udDo6QXBwZW5kQ2hhcihGWF9DSEFSKiBzdHIsIEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdAotewotICAgIHJldHVybiBtX3BDTWFwLT5BcHBlbmRDaGFyKHN0ciwgY2hhcmNvZGUpOwotfQotRlhfQk9PTCBDUERGX0NJREZvbnQ6OklzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdAotewotICAgIGlmICghbV9wQ01hcC0+SXNMb2FkZWQoKSB8fCBtX3BDSUQyVW5pY29kZU1hcCA9PSBOVUxMIHx8ICFtX3BDSUQyVW5pY29kZU1hcC0+SXNMb2FkZWQoKSkgewotICAgICAgICByZXR1cm4gbV9wQ01hcC0+bV9Db2RpbmcgIT0gQ0lEQ09ESU5HX1VOS05PV047Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0NJREZvbnQ6OklzRm9udFN0eWxlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdAotewotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDUERGX0NJREZvbnQ6OkxvYWRTdWJzdEZvbnQoKQotewotICAgIG1fRm9udC5Mb2FkU3Vic3QobV9CYXNlRm9udCwgIW1fYlR5cGUxLCBtX0ZsYWdzLCBtX1N0ZW1WICogNSwgbV9JdGFsaWNBbmdsZSwgZ19DaGFyc2V0Q1BzW21fQ2hhcnNldF0sIElzVmVydFdyaXRpbmcoKSk7Ci19Ci12b2lkIENQREZfQ0lERm9udDo6TG9hZE1ldHJpY3NBcnJheShDUERGX0FycmF5KiBwQXJyYXksIENGWF9EV29yZEFycmF5JiByZXN1bHQsIGludCBuRWxlbWVudHMpCi17Ci0gICAgaW50IHdpZHRoX3N0YXR1cyA9IDA7Ci0gICAgaW50IGlDdXJFbGVtZW50ID0gMDsKLSAgICBpbnQgZmlyc3RfY29kZSA9IDAsIGxhc3RfY29kZTsKLSAgICBGWF9EV09SRCBjb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKLSAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJlc3VsdC5BZGQocE9iai0+R2V0SW50ZWdlcigpKTsKKyAgICAgICAgaUN1ckVsZW1lbnQrKzsKKyAgICAgICAgaWYgKGlDdXJFbGVtZW50ID09IG5FbGVtZW50cykgeworICAgICAgICAgIHdpZHRoX3N0YXR1cyA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIGlmICh3aWR0aF9zdGF0dXMgIT0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwT2JqOwotICAgICAgICAgICAgRlhfRFdPUkQgY291bnQgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGogPSAwOyBqIDwgY291bnQ7IGogKz0gbkVsZW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LkFkZChmaXJzdF9jb2RlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuQWRkKGZpcnN0X2NvZGUpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbkVsZW1lbnRzOyBrICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5BZGQocEFycmF5LT5HZXRJbnRlZ2VyKGogKyBrKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpcnN0X2NvZGUgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aWR0aF9zdGF0dXMgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHdpZHRoX3N0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmlyc3RfY29kZSA9IHBPYmotPkdldEludGVnZXIoKTsKLSAgICAgICAgICAgICAgICB3aWR0aF9zdGF0dXMgPSAxOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aWR0aF9zdGF0dXMgPT0gMSkgewotICAgICAgICAgICAgICAgIGxhc3RfY29kZSA9IHBPYmotPkdldEludGVnZXIoKTsKLSAgICAgICAgICAgICAgICB3aWR0aF9zdGF0dXMgPSAyOwotICAgICAgICAgICAgICAgIGlDdXJFbGVtZW50ID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpQ3VyRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuQWRkKGZpcnN0X2NvZGUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuQWRkKGxhc3RfY29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5BZGQocE9iai0+R2V0SW50ZWdlcigpKTsKLSAgICAgICAgICAgICAgICBpQ3VyRWxlbWVudCArKzsKLSAgICAgICAgICAgICAgICBpZiAoaUN1ckVsZW1lbnQgPT0gbkVsZW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoX3N0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICB9CiAgICAgfQorICB9CiB9Ci1GWF9CT09MIENQREZfQ0lERm9udDo6TG9hZEdCMjMxMigpCi17Ci0gICAgbV9CYXNlRm9udCA9IG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkJhc2VGb250IikpOwotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkZvbnREZXNjcmlwdG9yIikpOwotICAgIGlmIChwRm9udERlc2MpIHsKLSAgICAgICAgTG9hZEZvbnREZXNjcmlwdG9yKHBGb250RGVzYyk7Ci0gICAgfQotICAgIG1fQ2hhcnNldCA9IENJRFNFVF9HQjE7Ci0gICAgbV9iVHlwZTEgPSBGQUxTRTsKLSAgICBtX3BDTWFwID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCktPm1fQ01hcE1hbmFnZXIuR2V0UHJlZGVmaW5lZENNYXAoCi0gICAgICAgICAgICAgICAgICBGWF9CU1RSQygiR0JLLUVVQy1IIiksIEZBTFNFKTsKLSAgICBtX3BDSUQyVW5pY29kZU1hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpLT5tX0NNYXBNYW5hZ2VyLkdldENJRDJVbmljb2RlTWFwKG1fQ2hhcnNldCwgRkFMU0UpOwotICAgIGlmICghSXNFbWJlZGRlZCgpKSB7Ci0gICAgICAgIExvYWRTdWJzdEZvbnQoKTsKLSAgICB9Ci0gICAgQ2hlY2tGb250TWV0cmljcygpOwotICAgIG1fRGVmYXVsdFdpZHRoID0gMTAwMDsKLSAgICBtX3BBbnNpV2lkdGhzID0gRlhfQWxsb2MoRlhfV09SRCwgMTI4KTsKLSAgICBmb3IgKGludCBpID0gMzI7IGkgPCAxMjc7IGkgKyspIHsKLSAgICAgICAgbV9wQW5zaVdpZHRoc1tpXSA9IDUwMDsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQREZfQ0lERm9udDo6TG9hZEdCMjMxMigpIHsKKyAgbV9CYXNlRm9udCA9IG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkJhc2VGb250IikpOworICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGVzYyA9IG1fcEZvbnREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGb250RGVzY3JpcHRvciIpKTsKKyAgaWYgKHBGb250RGVzYykgeworICAgIExvYWRGb250RGVzY3JpcHRvcihwRm9udERlc2MpOworICB9CisgIG1fQ2hhcnNldCA9IENJRFNFVF9HQjE7CisgIG1fYlR5cGUxID0gRkFMU0U7CisgIG1fcENNYXAgPSBDUERGX01vZHVsZU1ncjo6R2V0KCkKKyAgICAgICAgICAgICAgICAtPkdldFBhZ2VNb2R1bGUoKQorICAgICAgICAgICAgICAgIC0+R2V0Rm9udEdsb2JhbHMoKQorICAgICAgICAgICAgICAgIC0+bV9DTWFwTWFuYWdlci5HZXRQcmVkZWZpbmVkQ01hcChGWF9CU1RSQygiR0JLLUVVQy1IIiksIEZBTFNFKTsKKyAgbV9wQ0lEMlVuaWNvZGVNYXAgPSBDUERGX01vZHVsZU1ncjo6R2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRQYWdlTW9kdWxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRGb250R2xvYmFscygpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bV9DTWFwTWFuYWdlci5HZXRDSUQyVW5pY29kZU1hcChtX0NoYXJzZXQsIEZBTFNFKTsKKyAgaWYgKCFJc0VtYmVkZGVkKCkpIHsKKyAgICBMb2FkU3Vic3RGb250KCk7CisgIH0KKyAgQ2hlY2tGb250TWV0cmljcygpOworICBtX0RlZmF1bHRXaWR0aCA9IDEwMDA7CisgIG1fcEFuc2lXaWR0aHMgPSBGWF9BbGxvYyhGWF9XT1JELCAxMjgpOworICBmb3IgKGludCBpID0gMzI7IGkgPCAxMjc7IGkrKykgeworICAgIG1fcEFuc2lXaWR0aHNbaV0gPSA1MDA7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiBjb25zdCBzdHJ1Y3QgX0NJRFRyYW5zZm9ybSB7Ci0gICAgRlhfV09SRAkJQ0lEOwotICAgIHVpbnQ4X3QJCWEsIGIsIGMsIGQsIGUsIGY7Ci19Ci1KYXBhbjFfVmVydENJRHNbXSA9IHsKLSAgICB7OTcsIDEyOSwgMCwgMCwgMTI3LCA1NSwgMH0sCi0gICAgezc4ODcsIDEyNywgMCwgMCwgMTI3LCA3NiwgODl9LAotICAgIHs3ODg4LCAxMjcsIDAsIDAsIDEyNywgNzksIDk0fSwKLSAgICB7Nzg4OSwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAotICAgIHs3ODkwLCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sCi0gICAgezc4OTEsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKLSAgICB7Nzg5MiwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAotICAgIHs3ODkzLCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sCi0gICAgezc4OTQsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKLSAgICB7Nzg5NSwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAotICAgIHs3ODk2LCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sCi0gICAgezc4OTcsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKLSAgICB7Nzg5OCwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAotICAgIHs3ODk5LCAwLCAxMjksIDEyNywgMCwgMTcsIDEwNH0sCi0gICAgezc5MDAsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKLSAgICB7NzkwMSwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMDR9LAotICAgIHs3OTAyLCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sCi0gICAgezc5MDMsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKLSAgICB7NzkwNCwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAotICAgIHs3OTA1LCAwLCAxMjksIDEyNywgMCwgMTcsIDExNH0sCi0gICAgezc5MDYsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKLSAgICB7NzkwNywgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAotICAgIHs3OTA4LCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sCi0gICAgezc5MDksIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKLSAgICB7NzkxMCwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAotICAgIHs3OTExLCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sCi0gICAgezc5MTIsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKLSAgICB7NzkxMywgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAotICAgIHs3OTE0LCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sCi0gICAgezc5MTUsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTE0fSwKLSAgICB7NzkxNiwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAotICAgIHs3OTE3LCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sCi0gICAgezc5MTgsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAotICAgIHs3OTE5LCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwKLSAgICB7NzkyMCwgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sCi0gICAgezc5MjEsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAotICAgIHs3OTIyLCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwKLSAgICB7NzkyMywgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sCi0gICAgezc5MjQsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAotICAgIHs3OTI1LCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwKLSAgICB7NzkyNiwgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sCi0gICAgezc5MjcsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAotICAgIHs3OTI4LCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwKLSAgICB7NzkyOSwgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sCi0gICAgezc5MzAsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAotICAgIHs3OTMxLCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwKLSAgICB7NzkzMiwgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sCi0gICAgezc5MzMsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAotICAgIHs3OTM0LCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwKLSAgICB7NzkzNSwgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sCi0gICAgezc5MzYsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAotICAgIHs3OTM3LCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwKLSAgICB7NzkzOCwgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sCi0gICAgezc5MzksIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAotICAgIHs4NzIwLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3MjEsIDAsIDEyOSwgMTI3LCAwLCAxMywgMTI3fSwKLSAgICB7ODcyMiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAotICAgIHs4NzIzLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3MjQsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODcyNSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzI2LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3MjcsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODcyOCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMTR9LAotICAgIHs4NzI5LCAwLCAxMjksIDEyNywgMCwgMTksIDExNH0sCi0gICAgezg3MzAsIDAsIDEyOSwgMTI3LCAwLCAzOCwgMTA4fSwKLSAgICB7ODczMSwgMCwgMTI5LCAxMjcsIDAsIDEzLCAxMDh9LAotICAgIHs4NzMyLCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg3MzMsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKLSAgICB7ODczNCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAotICAgIHs4NzM1LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg3MzYsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODczNywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzM4LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3MzksIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc0MCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzQxLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NDIsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc0MywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzQ0LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NDUsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc0NiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMTR9LAotICAgIHs4NzQ3LCAwLCAxMjksIDEyNywgMCwgMTksIDExNH0sCi0gICAgezg3NDgsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc0OSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzUwLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NTEsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc1MiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzUzLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NTQsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc1NSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzU2LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NTcsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc1OCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzU5LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NjAsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc2MSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzYyLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NjMsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc2NCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzY1LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NjYsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc2NywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzY4LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NjksIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc3MCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4NzcxLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NzIsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc3MywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4Nzc0LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NzUsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc3NiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4Nzc3LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCi0gICAgezg3NzgsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKLSAgICB7ODc3OSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMTR9LAotICAgIHs4NzgwLCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg3ODEsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTE0fSwKLSAgICB7ODc4MiwgMCwgMTI5LCAxMjcsIDAsIDEzLCAxMTR9LAotICAgIHs4NzgzLCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg3ODQsIDAsIDEyOSwgMTI3LCAwLCAxMywgMTE0fSwKLSAgICB7ODc4NSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAotICAgIHs4Nzg2LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg3ODcsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKLSAgICB7ODc4OCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAotICAgIHs4Nzg5LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg3OTAsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKLSAgICB7ODc5MSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAotICAgIHs4NzkyLCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg3OTMsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKLSAgICB7ODc5NCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAotICAgIHs4Nzk1LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg3OTYsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKLSAgICB7ODc5NywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAotICAgIHs4Nzk4LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg3OTksIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKLSAgICB7ODgwMCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAotICAgIHs4ODAxLCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg4MDIsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKLSAgICB7ODgwMywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAotICAgIHs4ODA0LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg4MDUsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKLSAgICB7ODgwNiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAotICAgIHs4ODA3LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg4MDgsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKLSAgICB7ODgwOSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAotICAgIHs4ODEwLCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCi0gICAgezg4MTEsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTE0fSwKLSAgICB7ODgxMiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAotICAgIHs4ODEzLCAwLCAxMjksIDEyNywgMCwgMTksIDExNH0sCi0gICAgezg4MTQsIDAsIDEyOSwgMTI3LCAwLCA3NiwgMTAyfSwKLSAgICB7ODgxNSwgMCwgMTI5LCAxMjcsIDAsIDEzLCAxMjF9LAotICAgIHs4ODE2LCAwLCAxMjksIDEyNywgMCwgMTksIDExNH0sCi0gICAgezg4MTcsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTI3fSwKLSAgICB7ODgxOCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMTR9LAotICAgIHs4ODE5LCAwLCAxMjksIDEyNywgMCwgMjE4LCAxMDh9LAorICBGWF9XT1JEIENJRDsKKyAgdWludDhfdCBhLCBiLCBjLCBkLCBlLCBmOworfSBKYXBhbjFfVmVydENJRHNbXSA9IHsKKyAgICB7OTcsIDEyOSwgMCwgMCwgMTI3LCA1NSwgMH0sICAgICB7Nzg4NywgMTI3LCAwLCAwLCAxMjcsIDc2LCA4OX0sCisgICAgezc4ODgsIDEyNywgMCwgMCwgMTI3LCA3OSwgOTR9LCAgezc4ODksIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKKyAgICB7Nzg5MCwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LCB7Nzg5MSwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAorICAgIHs3ODkyLCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sIHs3ODkzLCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sCisgICAgezc4OTQsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwgezc4OTUsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKKyAgICB7Nzg5NiwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LCB7Nzg5NywgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAorICAgIHs3ODk4LCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sIHs3ODk5LCAwLCAxMjksIDEyNywgMCwgMTcsIDEwNH0sCisgICAgezc5MDAsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwgezc5MDEsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTA0fSwKKyAgICB7NzkwMiwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LCB7NzkwMywgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAorICAgIHs3OTA0LCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sIHs3OTA1LCAwLCAxMjksIDEyNywgMCwgMTcsIDExNH0sCisgICAgezc5MDYsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwgezc5MDcsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKKyAgICB7NzkwOCwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LCB7NzkwOSwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LAorICAgIHs3OTEwLCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sIHs3OTExLCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sCisgICAgezc5MTIsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwgezc5MTMsIDAsIDEyOSwgMTI3LCAwLCAxNywgMTI3fSwKKyAgICB7NzkxNCwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMjd9LCB7NzkxNSwgMCwgMTI5LCAxMjcsIDAsIDE3LCAxMTR9LAorICAgIHs3OTE2LCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sIHs3OTE3LCAwLCAxMjksIDEyNywgMCwgMTcsIDEyN30sCisgICAgezc5MTgsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LCAgezc5MTksIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAorICAgIHs3OTIwLCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwgIHs3OTIxLCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwKKyAgICB7NzkyMiwgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sICB7NzkyMywgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sCisgICAgezc5MjQsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LCAgezc5MjUsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAorICAgIHs3OTI2LCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwgIHs3OTI3LCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwKKyAgICB7NzkyOCwgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sICB7NzkyOSwgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sCisgICAgezc5MzAsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LCAgezc5MzEsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAorICAgIHs3OTMyLCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwgIHs3OTMzLCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwKKyAgICB7NzkzNCwgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sICB7NzkzNSwgMTI3LCAwLCAwLCAxMjcsIDE4LCAyNX0sCisgICAgezc5MzYsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LCAgezc5MzcsIDEyNywgMCwgMCwgMTI3LCAxOCwgMjV9LAorICAgIHs3OTM4LCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwgIHs3OTM5LCAxMjcsIDAsIDAsIDEyNywgMTgsIDI1fSwKKyAgICB7ODcyMCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LCB7ODcyMSwgMCwgMTI5LCAxMjcsIDAsIDEzLCAxMjd9LAorICAgIHs4NzIyLCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sIHs4NzIzLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCisgICAgezg3MjQsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwgezg3MjUsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKKyAgICB7ODcyNiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LCB7ODcyNywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAorICAgIHs4NzI4LCAwLCAxMjksIDEyNywgMCwgMTksIDExNH0sIHs4NzI5LCAwLCAxMjksIDEyNywgMCwgMTksIDExNH0sCisgICAgezg3MzAsIDAsIDEyOSwgMTI3LCAwLCAzOCwgMTA4fSwgezg3MzEsIDAsIDEyOSwgMTI3LCAwLCAxMywgMTA4fSwKKyAgICB7ODczMiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LCB7ODczMywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAorICAgIHs4NzM0LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sIHs4NzM1LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCisgICAgezg3MzYsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwgezg3MzcsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKKyAgICB7ODczOCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LCB7ODczOSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAorICAgIHs4NzQwLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sIHs4NzQxLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCisgICAgezg3NDIsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwgezg3NDMsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKKyAgICB7ODc0NCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LCB7ODc0NSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAorICAgIHs4NzQ2LCAwLCAxMjksIDEyNywgMCwgMTksIDExNH0sIHs4NzQ3LCAwLCAxMjksIDEyNywgMCwgMTksIDExNH0sCisgICAgezg3NDgsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwgezg3NDksIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKKyAgICB7ODc1MCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LCB7ODc1MSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAorICAgIHs4NzUyLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sIHs4NzUzLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCisgICAgezg3NTQsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwgezg3NTUsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKKyAgICB7ODc1NiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LCB7ODc1NywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAorICAgIHs4NzU4LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sIHs4NzU5LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCisgICAgezg3NjAsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwgezg3NjEsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKKyAgICB7ODc2MiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LCB7ODc2MywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAorICAgIHs4NzY0LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sIHs4NzY1LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCisgICAgezg3NjYsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwgezg3NjcsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKKyAgICB7ODc2OCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LCB7ODc2OSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAorICAgIHs4NzcwLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sIHs4NzcxLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCisgICAgezg3NzIsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwgezg3NzMsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwKKyAgICB7ODc3NCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LCB7ODc3NSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDJ9LAorICAgIHs4Nzc2LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sIHs4Nzc3LCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sCisgICAgezg3NzgsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTAyfSwgezg3NzksIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTE0fSwKKyAgICB7ODc4MCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LCB7ODc4MSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMTR9LAorICAgIHs4NzgyLCAwLCAxMjksIDEyNywgMCwgMTMsIDExNH0sIHs4NzgzLCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCisgICAgezg3ODQsIDAsIDEyOSwgMTI3LCAwLCAxMywgMTE0fSwgezg3ODUsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKKyAgICB7ODc4NiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LCB7ODc4NywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAorICAgIHs4Nzg4LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sIHs4Nzg5LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCisgICAgezg3OTAsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwgezg3OTEsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKKyAgICB7ODc5MiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LCB7ODc5MywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAorICAgIHs4Nzk0LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sIHs4Nzk1LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCisgICAgezg3OTYsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwgezg3OTcsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKKyAgICB7ODc5OCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LCB7ODc5OSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAorICAgIHs4ODAwLCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sIHs4ODAxLCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCisgICAgezg4MDIsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwgezg4MDMsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKKyAgICB7ODgwNCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LCB7ODgwNSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LAorICAgIHs4ODA2LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sIHs4ODA3LCAwLCAxMjksIDEyNywgMCwgMTksIDEwOH0sCisgICAgezg4MDgsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwgezg4MDksIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTA4fSwKKyAgICB7ODgxMCwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMDh9LCB7ODgxMSwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMTR9LAorICAgIHs4ODEyLCAwLCAxMjksIDEyNywgMCwgMTksIDEwMn0sIHs4ODEzLCAwLCAxMjksIDEyNywgMCwgMTksIDExNH0sCisgICAgezg4MTQsIDAsIDEyOSwgMTI3LCAwLCA3NiwgMTAyfSwgezg4MTUsIDAsIDEyOSwgMTI3LCAwLCAxMywgMTIxfSwKKyAgICB7ODgxNiwgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMTR9LCB7ODgxNywgMCwgMTI5LCAxMjcsIDAsIDE5LCAxMjd9LAorICAgIHs4ODE4LCAwLCAxMjksIDEyNywgMCwgMTksIDExNH0sIHs4ODE5LCAwLCAxMjksIDEyNywgMCwgMjE4LCAxMDh9LAogfTsKLWNvbnN0IHVpbnQ4X3QqIENQREZfQ0lERm9udDo6R2V0Q0lEVHJhbnNmb3JtKEZYX1dPUkQgQ0lEKSBjb25zdAotewotICAgIGlmIChtX0NoYXJzZXQgIT0gQ0lEU0VUX0pBUEFOMSB8fCBtX3BGb250RmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpbnQgYmVnaW4gPSAwOwotICAgIGludCBlbmQgPSBzaXplb2YgSmFwYW4xX1ZlcnRDSURzIC8gc2l6ZW9mKHN0cnVjdCBfQ0lEVHJhbnNmb3JtKSAtIDE7Ci0gICAgd2hpbGUgKGJlZ2luIDw9IGVuZCkgewotICAgICAgICBpbnQgbWlkZGxlID0gKGJlZ2luICsgZW5kKSAvIDI7Ci0gICAgICAgIEZYX1dPUkQgbWlkZGxlY29kZSA9IEphcGFuMV9WZXJ0Q0lEc1ttaWRkbGVdLkNJRDsKLSAgICAgICAgaWYgKG1pZGRsZWNvZGUgPiBDSUQpIHsKLSAgICAgICAgICAgIGVuZCA9IG1pZGRsZSAtIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAobWlkZGxlY29kZSA8IENJRCkgewotICAgICAgICAgICAgYmVnaW4gPSBtaWRkbGUgKyAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICZKYXBhbjFfVmVydENJRHNbbWlkZGxlXS5hOwotICAgICAgICB9Ci0gICAgfQorY29uc3QgdWludDhfdCogQ1BERl9DSURGb250OjpHZXRDSURUcmFuc2Zvcm0oRlhfV09SRCBDSUQpIGNvbnN0IHsKKyAgaWYgKG1fQ2hhcnNldCAhPSBDSURTRVRfSkFQQU4xIHx8IG1fcEZvbnRGaWxlICE9IE5VTEwpIHsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbnQgYmVnaW4gPSAwOworICBpbnQgZW5kID0gc2l6ZW9mIEphcGFuMV9WZXJ0Q0lEcyAvIHNpemVvZihzdHJ1Y3QgX0NJRFRyYW5zZm9ybSkgLSAxOworICB3aGlsZSAoYmVnaW4gPD0gZW5kKSB7CisgICAgaW50IG1pZGRsZSA9IChiZWdpbiArIGVuZCkgLyAyOworICAgIEZYX1dPUkQgbWlkZGxlY29kZSA9IEphcGFuMV9WZXJ0Q0lEc1ttaWRkbGVdLkNJRDsKKyAgICBpZiAobWlkZGxlY29kZSA+IENJRCkgeworICAgICAgZW5kID0gbWlkZGxlIC0gMTsKKyAgICB9IGVsc2UgaWYgKG1pZGRsZWNvZGUgPCBDSUQpIHsKKyAgICAgIGJlZ2luID0gbWlkZGxlICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICZKYXBhbjFfVmVydENJRHNbbWlkZGxlXS5hOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmNwcAppbmRleCBhNjUzNTljLi5hMTcxN2E5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuY3BwCkBAIC05LDQ0MyArOSw0MTEgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKICNpbmNsdWRlICJ0dGdzdWJ0YWJsZS5oIgogCi1DRlhfR2x5cGhNYXA6OkNGWF9HbHlwaE1hcCgpCi17Ci19Ci1DRlhfR2x5cGhNYXA6On5DRlhfR2x5cGhNYXAoKQotewotfQorQ0ZYX0dseXBoTWFwOjpDRlhfR2x5cGhNYXAoKSB7fQorQ0ZYX0dseXBoTWFwOjp+Q0ZYX0dseXBoTWFwKCkge30KIGV4dGVybiAiQyIgewotICAgIHN0YXRpYyBpbnQgX0NvbXBhcmVJbnQoY29uc3Qgdm9pZCogcDEsIGNvbnN0IHZvaWQqIHAyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgqKEZYX0RXT1JEKilwMSkgLSAoKihGWF9EV09SRCopcDIpOwotICAgIH0KK3N0YXRpYyBpbnQgX0NvbXBhcmVJbnQoY29uc3Qgdm9pZCogcDEsIGNvbnN0IHZvaWQqIHAyKSB7CisgIHJldHVybiAoKihGWF9EV09SRCopcDEpIC0gKCooRlhfRFdPUkQqKXAyKTsKK30KIH07CiBzdHJ1Y3QgX0ludFBhaXIgewotICAgIGludDMyX3Qga2V5OwotICAgIGludDMyX3QgdmFsdWU7CisgIGludDMyX3Qga2V5OworICBpbnQzMl90IHZhbHVlOwogfTsKLXZvaWQgQ0ZYX0dseXBoTWFwOjpTZXRBdChpbnQga2V5LCBpbnQgdmFsdWUpCi17Ci0gICAgRlhfRFdPUkQgY291bnQgPSBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0ludFBhaXIpOwotICAgIF9JbnRQYWlyKiBidWYgPSAoX0ludFBhaXIqKW1fQnVmZmVyLkdldEJ1ZmZlcigpOwotICAgIF9JbnRQYWlyIHBhaXIgPSB7a2V5LCB2YWx1ZX07Ci0gICAgaWYgKGNvdW50ID09IDAgfHwga2V5ID4gYnVmW2NvdW50IC0gMV0ua2V5KSB7Ci0gICAgICAgIG1fQnVmZmVyLkFwcGVuZEJsb2NrKCZwYWlyLCBzaXplb2YoX0ludFBhaXIpKTsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDRlhfR2x5cGhNYXA6OlNldEF0KGludCBrZXksIGludCB2YWx1ZSkgeworICBGWF9EV09SRCBjb3VudCA9IG1fQnVmZmVyLkdldFNpemUoKSAvIHNpemVvZihfSW50UGFpcik7CisgIF9JbnRQYWlyKiBidWYgPSAoX0ludFBhaXIqKW1fQnVmZmVyLkdldEJ1ZmZlcigpOworICBfSW50UGFpciBwYWlyID0ge2tleSwgdmFsdWV9OworICBpZiAoY291bnQgPT0gMCB8fCBrZXkgPiBidWZbY291bnQgLSAxXS5rZXkpIHsKKyAgICBtX0J1ZmZlci5BcHBlbmRCbG9jaygmcGFpciwgc2l6ZW9mKF9JbnRQYWlyKSk7CisgICAgcmV0dXJuOworICB9CisgIGludCBsb3cgPSAwLCBoaWdoID0gY291bnQgLSAxOworICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKKyAgICBpbnQgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICBpZiAoYnVmW21pZF0ua2V5IDwga2V5KSB7CisgICAgICBsb3cgPSBtaWQgKyAxOworICAgIH0gZWxzZSBpZiAoYnVmW21pZF0ua2V5ID4ga2V5KSB7CisgICAgICBoaWdoID0gbWlkIC0gMTsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW21pZF0udmFsdWUgPSB2YWx1ZTsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgaW50IGxvdyA9IDAsIGhpZ2ggPSBjb3VudCAtIDE7Ci0gICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7Ci0gICAgICAgIGludCBtaWQgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgICBpZiAoYnVmW21pZF0ua2V5IDwga2V5KSB7Ci0gICAgICAgICAgICBsb3cgPSBtaWQgKyAxOwotICAgICAgICB9IGVsc2UgaWYgKGJ1ZlttaWRdLmtleSA+IGtleSkgewotICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZbbWlkXS52YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fQnVmZmVyLkluc2VydEJsb2NrKGxvdyAqIHNpemVvZihfSW50UGFpciksICZwYWlyLCBzaXplb2YoX0ludFBhaXIpKTsKKyAgfQorICBtX0J1ZmZlci5JbnNlcnRCbG9jayhsb3cgKiBzaXplb2YoX0ludFBhaXIpLCAmcGFpciwgc2l6ZW9mKF9JbnRQYWlyKSk7CiB9Ci1GWF9CT09MIENGWF9HbHlwaE1hcDo6TG9va3VwKGludCBrZXksIGludCAmdmFsdWUpCi17Ci0gICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJmtleSwgbV9CdWZmZXIuR2V0QnVmZmVyKCksIG1fQnVmZmVyLkdldFNpemUoKSAvIHNpemVvZihfSW50UGFpciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfSW50UGFpciksIF9Db21wYXJlSW50KTsKLSAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdmFsdWUgPSAoKEZYX0RXT1JEKilwUmVzdWx0KVsxXTsKLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ0ZYX0dseXBoTWFwOjpMb29rdXAoaW50IGtleSwgaW50JiB2YWx1ZSkgeworICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgma2V5LCBtX0J1ZmZlci5HZXRCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CdWZmZXIuR2V0U2l6ZSgpIC8gc2l6ZW9mKF9JbnRQYWlyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKF9JbnRQYWlyKSwgX0NvbXBhcmVJbnQpOworICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHZhbHVlID0gKChGWF9EV09SRCopcFJlc3VsdClbMV07CisgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpMb2FkR1NVQlRhYmxlKEZUX0J5dGVzIGdzdWIpCi17Ci0gICAgaGVhZGVyLlZlcnNpb24gPSBnc3ViWzBdIDw8IDI0IHwgZ3N1YlsxXSA8PCAxNiB8IGdzdWJbMl0gPDwgOCB8IGdzdWJbM107Ci0gICAgaWYoaGVhZGVyLlZlcnNpb24gIT0gMHgwMDAxMDAwMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGhlYWRlci5TY3JpcHRMaXN0ICA9IGdzdWJbNF0gPDwgOCB8IGdzdWJbNV07Ci0gICAgaGVhZGVyLkZlYXR1cmVMaXN0ID0gZ3N1Yls2XSA8PCA4IHwgZ3N1Yls3XTsKLSAgICBoZWFkZXIuTG9va3VwTGlzdCAgPSBnc3ViWzhdIDw8IDggfCBnc3ViWzldOwotICAgIHJldHVybiBQYXJzZSgKLSAgICAgICAgICAgICAgICZnc3ViW2hlYWRlci5TY3JpcHRMaXN0XSwKLSAgICAgICAgICAgICAgICZnc3ViW2hlYWRlci5GZWF0dXJlTGlzdF0sCitib29sIENGWF9DVFRHU1VCVGFibGU6OkxvYWRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1YikgeworICBoZWFkZXIuVmVyc2lvbiA9IGdzdWJbMF0gPDwgMjQgfCBnc3ViWzFdIDw8IDE2IHwgZ3N1YlsyXSA8PCA4IHwgZ3N1YlszXTsKKyAgaWYgKGhlYWRlci5WZXJzaW9uICE9IDB4MDAwMTAwMDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaGVhZGVyLlNjcmlwdExpc3QgPSBnc3ViWzRdIDw8IDggfCBnc3ViWzVdOworICBoZWFkZXIuRmVhdHVyZUxpc3QgPSBnc3ViWzZdIDw8IDggfCBnc3ViWzddOworICBoZWFkZXIuTG9va3VwTGlzdCA9IGdzdWJbOF0gPDwgOCB8IGdzdWJbOV07CisgIHJldHVybiBQYXJzZSgmZ3N1YltoZWFkZXIuU2NyaXB0TGlzdF0sICZnc3ViW2hlYWRlci5GZWF0dXJlTGlzdF0sCiAgICAgICAgICAgICAgICAmZ3N1YltoZWFkZXIuTG9va3VwTGlzdF0pOwogfQotYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRWZXJ0aWNhbEdseXBoKFRUX3VpbnQzMl90IGdseXBobnVtLCBUVF91aW50MzJfdCAqdmdseXBobnVtKQotewotICAgIFRUX3VpbnQzMl90IHRhZ1tdID0gewotICAgICAgICAoVFRfdWludDhfdCkndicgPDwgMjQgfAotICAgICAgICAoVFRfdWludDhfdCkncicgPDwgMTYgfAotICAgICAgICAoVFRfdWludDhfdCkndCcgPDwgIDggfAotICAgICAgICAoVFRfdWludDhfdCknMicsCi0gICAgICAgIChUVF91aW50OF90KSd2JyA8PCAyNCB8Ci0gICAgICAgIChUVF91aW50OF90KSdlJyA8PCAxNiB8Ci0gICAgICAgIChUVF91aW50OF90KSdyJyA8PCAgOCB8Ci0gICAgICAgIChUVF91aW50OF90KSd0JywKLSAgICB9OwotICAgIGlmICghbV9iRmVhdXR1cmVNYXBMb2FkKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU2NyaXB0TGlzdC5TY3JpcHRDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8CShTY3JpcHRMaXN0LlNjcmlwdFJlY29yZCArIGkpLT5TY3JpcHQuTGFuZ1N5c0NvdW50OyArK2opIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8ICgoU2NyaXB0TGlzdC5TY3JpcHRSZWNvcmQgKyBpKS0+U2NyaXB0LkxhbmdTeXNSZWNvcmQgKyBqKS0+TGFuZ1N5cy5GZWF0dXJlQ291bnQ7ICsraykgewotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBpbmRleCA9ICooKChTY3JpcHRMaXN0LlNjcmlwdFJlY29yZCArIGkpLT5TY3JpcHQuTGFuZ1N5c1JlY29yZCArIGopLT5MYW5nU3lzLkZlYXR1cmVJbmRleCArIGspOwotICAgICAgICAgICAgICAgICAgICBpZiAoRmVhdHVyZUxpc3QuRmVhdHVyZVJlY29yZFtpbmRleF0uRmVhdHVyZVRhZyA9PSB0YWdbMF0gfHwgRmVhdHVyZUxpc3QuRmVhdHVyZVJlY29yZFtpbmRleF0uRmVhdHVyZVRhZyA9PSB0YWdbMV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX2ZlYXR1cmVNYXAuTG9va3VwKGluZGV4LCB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZlYXR1cmVNYXAuU2V0QXQoaW5kZXgsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KK2Jvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0VmVydGljYWxHbHlwaChUVF91aW50MzJfdCBnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF91aW50MzJfdCogdmdseXBobnVtKSB7CisgIFRUX3VpbnQzMl90IHRhZ1tdID0geworICAgICAgKFRUX3VpbnQ4X3QpJ3YnIDw8IDI0IHwgKFRUX3VpbnQ4X3QpJ3InIDw8IDE2IHwgKFRUX3VpbnQ4X3QpJ3QnIDw8IDggfAorICAgICAgICAgIChUVF91aW50OF90KScyJywKKyAgICAgIChUVF91aW50OF90KSd2JyA8PCAyNCB8IChUVF91aW50OF90KSdlJyA8PCAxNiB8IChUVF91aW50OF90KSdyJyA8PCA4IHwKKyAgICAgICAgICAoVFRfdWludDhfdCkndCcsCisgIH07CisgIGlmICghbV9iRmVhdXR1cmVNYXBMb2FkKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTY3JpcHRMaXN0LlNjcmlwdENvdW50OyBpKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgKFNjcmlwdExpc3QuU2NyaXB0UmVjb3JkICsgaSktPlNjcmlwdC5MYW5nU3lzQ291bnQ7CisgICAgICAgICAgICsraikgeworICAgICAgICBmb3IgKGludCBrID0gMDsKKyAgICAgICAgICAgICBrIDwgKChTY3JpcHRMaXN0LlNjcmlwdFJlY29yZCArIGkpLT5TY3JpcHQuTGFuZ1N5c1JlY29yZCArIGopCisgICAgICAgICAgICAgICAgICAgICAtPkxhbmdTeXMuRmVhdHVyZUNvdW50OworICAgICAgICAgICAgICsraykgeworICAgICAgICAgIEZYX0RXT1JEIGluZGV4ID0KKyAgICAgICAgICAgICAgKigoKFNjcmlwdExpc3QuU2NyaXB0UmVjb3JkICsgaSktPlNjcmlwdC5MYW5nU3lzUmVjb3JkICsgaikKKyAgICAgICAgICAgICAgICAgICAgLT5MYW5nU3lzLkZlYXR1cmVJbmRleCArCisgICAgICAgICAgICAgICAgayk7CisgICAgICAgICAgaWYgKEZlYXR1cmVMaXN0LkZlYXR1cmVSZWNvcmRbaW5kZXhdLkZlYXR1cmVUYWcgPT0gdGFnWzBdIHx8CisgICAgICAgICAgICAgIEZlYXR1cmVMaXN0LkZlYXR1cmVSZWNvcmRbaW5kZXhdLkZlYXR1cmVUYWcgPT0gdGFnWzFdKSB7CisgICAgICAgICAgICBGWF9EV09SRCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghbV9mZWF0dXJlTWFwLkxvb2t1cChpbmRleCwgdmFsdWUpKSB7CisgICAgICAgICAgICAgIG1fZmVhdHVyZU1hcC5TZXRBdChpbmRleCwgaW5kZXgpOwogICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoIW1fZmVhdHVyZU1hcC5HZXRTdGFydFBvc2l0aW9uKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRmVhdHVyZUxpc3QuRmVhdHVyZUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEZlYXR1cmVMaXN0LkZlYXR1cmVSZWNvcmRbaV0uRmVhdHVyZVRhZyA9PSB0YWdbMF0gfHwgRmVhdHVyZUxpc3QuRmVhdHVyZVJlY29yZFtpXS5GZWF0dXJlVGFnID09IHRhZ1sxXSkgewotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtX2ZlYXR1cmVNYXAuTG9va3VwKGksIHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9mZWF0dXJlTWFwLlNldEF0KGksIGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fYkZlYXV0dXJlTWFwTG9hZCA9IFRSVUU7CisgICAgICB9CiAgICAgfQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fZmVhdHVyZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBGWF9EV09SRCBpbmRleCwgdmFsdWU7Ci0gICAgICAgIG1fZmVhdHVyZU1hcC5HZXROZXh0QXNzb2MocG9zLCBpbmRleCwgdmFsdWUpOwotICAgICAgICBpZihHZXRWZXJ0aWNhbEdseXBoU3ViKGdseXBobnVtLCB2Z2x5cGhudW0sCSZGZWF0dXJlTGlzdC5GZWF0dXJlUmVjb3JkW3ZhbHVlXS5GZWF0dXJlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKCFtX2ZlYXR1cmVNYXAuR2V0U3RhcnRQb3NpdGlvbigpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZlYXR1cmVMaXN0LkZlYXR1cmVDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChGZWF0dXJlTGlzdC5GZWF0dXJlUmVjb3JkW2ldLkZlYXR1cmVUYWcgPT0gdGFnWzBdIHx8CisgICAgICAgICAgICBGZWF0dXJlTGlzdC5GZWF0dXJlUmVjb3JkW2ldLkZlYXR1cmVUYWcgPT0gdGFnWzFdKSB7CisgICAgICAgICAgRlhfRFdPUkQgdmFsdWU7CisgICAgICAgICAgaWYgKCFtX2ZlYXR1cmVNYXAuTG9va3VwKGksIHZhbHVlKSkgeworICAgICAgICAgICAgbV9mZWF0dXJlTWFwLlNldEF0KGksIGkpOworICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgbV9iRmVhdXR1cmVNYXBMb2FkID0gVFJVRTsKKyAgfQorICBGWF9QT1NJVElPTiBwb3MgPSBtX2ZlYXR1cmVNYXAuR2V0U3RhcnRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgRlhfRFdPUkQgaW5kZXgsIHZhbHVlOworICAgIG1fZmVhdHVyZU1hcC5HZXROZXh0QXNzb2MocG9zLCBpbmRleCwgdmFsdWUpOworICAgIGlmIChHZXRWZXJ0aWNhbEdseXBoU3ViKGdseXBobnVtLCB2Z2x5cGhudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkZlYXR1cmVMaXN0LkZlYXR1cmVSZWNvcmRbdmFsdWVdLkZlYXR1cmUpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOwogfQotYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRWZXJ0aWNhbEdseXBoU3ViKAotICAgIFRUX3VpbnQzMl90IGdseXBobnVtLAotICAgIFRUX3VpbnQzMl90ICp2Z2x5cGhudW0sCi0gICAgc3RydWN0IFRGZWF0dXJlICpGZWF0dXJlKQotewotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBGZWF0dXJlLT5Mb29rdXBDb3VudDsgaSsrKSB7Ci0gICAgICAgIGludCBpbmRleCA9IEZlYXR1cmUtPkxvb2t1cExpc3RJbmRleFtpXTsKLSAgICAgICAgaWYoaW5kZXggPCAwIHx8IExvb2t1cExpc3QuTG9va3VwQ291bnQgPCBpbmRleCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTG9va3VwTGlzdC5Mb29rdXBbaW5kZXhdLkxvb2t1cFR5cGUgPT0gMSkgewotICAgICAgICAgICAgaWYoR2V0VmVydGljYWxHbHlwaFN1YjIoCi0gICAgICAgICAgICAgICAgICAgICAgICBnbHlwaG51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZnbHlwaG51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZMb29rdXBMaXN0Lkxvb2t1cFtpbmRleF0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK2Jvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0VmVydGljYWxHbHlwaFN1YihUVF91aW50MzJfdCBnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF91aW50MzJfdCogdmdseXBobnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBURmVhdHVyZSogRmVhdHVyZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IEZlYXR1cmUtPkxvb2t1cENvdW50OyBpKyspIHsKKyAgICBpbnQgaW5kZXggPSBGZWF0dXJlLT5Mb29rdXBMaXN0SW5kZXhbaV07CisgICAgaWYgKGluZGV4IDwgMCB8fCBMb29rdXBMaXN0Lkxvb2t1cENvdW50IDwgaW5kZXgpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKExvb2t1cExpc3QuTG9va3VwW2luZGV4XS5Mb29rdXBUeXBlID09IDEpIHsKKyAgICAgIGlmIChHZXRWZXJ0aWNhbEdseXBoU3ViMihnbHlwaG51bSwgdmdseXBobnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMb29rdXBMaXN0Lkxvb2t1cFtpbmRleF0pKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7CiB9Ci1ib29sIENGWF9DVFRHU1VCVGFibGU6OkdldFZlcnRpY2FsR2x5cGhTdWIyKAotICAgIFRUX3VpbnQzMl90IGdseXBobnVtLAotICAgIFRUX3VpbnQzMl90ICp2Z2x5cGhudW0sCi0gICAgc3RydWN0IFRMb29rdXAgKkxvb2t1cCkKLXsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgTG9va3VwLT5TdWJUYWJsZUNvdW50OyBpKyspIHsKLSAgICAgICAgc3dpdGNoKExvb2t1cC0+U3ViVGFibGVbaV0tPlN1YnN0Rm9ybWF0KSB7Ci0gICAgICAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgICAgICAgICAgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MSAqdGJsMSA9IChUU2luZ2xlU3Vic3RGb3JtYXQxKilMb29rdXAtPlN1YlRhYmxlW2ldOwotICAgICAgICAgICAgICAgICAgICBpZihHZXRDb3ZlcmFnZUluZGV4KHRibDEtPkNvdmVyYWdlLCBnbHlwaG51bSkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKnZnbHlwaG51bSA9IGdseXBobnVtICsgdGJsMS0+RGVsdGFHbHlwaElEOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAyOiB7Ci0gICAgICAgICAgICAgICAgICAgIFRTaW5nbGVTdWJzdEZvcm1hdDIgKnRibDIgPSAoVFNpbmdsZVN1YnN0Rm9ybWF0MiopTG9va3VwLT5TdWJUYWJsZVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gR2V0Q292ZXJhZ2VJbmRleCh0YmwyLT5Db3ZlcmFnZSwgZ2x5cGhudW0pOwotICAgICAgICAgICAgICAgICAgICBpZigwIDw9IGluZGV4ICYmIGluZGV4IDwgdGJsMi0+R2x5cGhDb3VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKnZnbHlwaG51bSA9IHRibDItPlN1YnN0aXR1dGVbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRWZXJ0aWNhbEdseXBoU3ViMihUVF91aW50MzJfdCBnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfdWludDMyX3QqIHZnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRMb29rdXAqIExvb2t1cCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IExvb2t1cC0+U3ViVGFibGVDb3VudDsgaSsrKSB7CisgICAgc3dpdGNoIChMb29rdXAtPlN1YlRhYmxlW2ldLT5TdWJzdEZvcm1hdCkgeworICAgICAgY2FzZSAxOiB7CisgICAgICAgIFRTaW5nbGVTdWJzdEZvcm1hdDEqIHRibDEgPSAoVFNpbmdsZVN1YnN0Rm9ybWF0MSopTG9va3VwLT5TdWJUYWJsZVtpXTsKKyAgICAgICAgaWYgKEdldENvdmVyYWdlSW5kZXgodGJsMS0+Q292ZXJhZ2UsIGdseXBobnVtKSA+PSAwKSB7CisgICAgICAgICAgKnZnbHlwaG51bSA9IGdseXBobnVtICsgdGJsMS0+RGVsdGFHbHlwaElEOworICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAyOiB7CisgICAgICAgIFRTaW5nbGVTdWJzdEZvcm1hdDIqIHRibDIgPSAoVFNpbmdsZVN1YnN0Rm9ybWF0MiopTG9va3VwLT5TdWJUYWJsZVtpXTsKKyAgICAgICAgaW50IGluZGV4ID0gLTE7CisgICAgICAgIGluZGV4ID0gR2V0Q292ZXJhZ2VJbmRleCh0YmwyLT5Db3ZlcmFnZSwgZ2x5cGhudW0pOworICAgICAgICBpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IHRibDItPkdseXBoQ291bnQpIHsKKyAgICAgICAgICAqdmdseXBobnVtID0gdGJsMi0+U3Vic3RpdHV0ZVtpbmRleF07CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gZmFsc2U7CiB9Ci1pbnQgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0Q292ZXJhZ2VJbmRleChzdHJ1Y3QgVENvdmVyYWdlRm9ybWF0QmFzZSAqQ292ZXJhZ2UsIFRUX3VpbnQzMl90IGcpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIGlmKENvdmVyYWdlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBzd2l0Y2goQ292ZXJhZ2UtPkNvdmVyYWdlRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgMTogewotICAgICAgICAgICAgICAgIFRDb3ZlcmFnZUZvcm1hdDEgKmMxID0gKFRDb3ZlcmFnZUZvcm1hdDEqKUNvdmVyYWdlOwotICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGMxLT5HbHlwaENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKFRUX3VpbnQzMl90KWMxLT5HbHlwaEFycmF5W2ldID09IGcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyOiB7Ci0gICAgICAgICAgICAgICAgVENvdmVyYWdlRm9ybWF0MiAqYzIgPSAoVENvdmVyYWdlRm9ybWF0MiopQ292ZXJhZ2U7Ci0gICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgYzItPlJhbmdlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBUVF91aW50MzJfdCBzID0gYzItPlJhbmdlUmVjb3JkW2ldLlN0YXJ0OwotICAgICAgICAgICAgICAgICAgICBUVF91aW50MzJfdCBlID0gYzItPlJhbmdlUmVjb3JkW2ldLkVuZDsKLSAgICAgICAgICAgICAgICAgICAgVFRfdWludDMyX3Qgc2kgPSBjMi0+UmFuZ2VSZWNvcmRbaV0uU3RhcnRDb3ZlcmFnZUluZGV4OwotICAgICAgICAgICAgICAgICAgICBpZiAocyA8PSBnICYmIGcgPD0gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpICsgZyAtIHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgIH0KK2ludCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRDb3ZlcmFnZUluZGV4KHN0cnVjdCBUQ292ZXJhZ2VGb3JtYXRCYXNlKiBDb3ZlcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX3VpbnQzMl90IGcpIHsKKyAgaW50IGkgPSAwOworICBpZiAoQ292ZXJhZ2UgPT0gTlVMTCkgewogICAgIHJldHVybiAtMTsKKyAgfQorICBzd2l0Y2ggKENvdmVyYWdlLT5Db3ZlcmFnZUZvcm1hdCkgeworICAgIGNhc2UgMTogeworICAgICAgVENvdmVyYWdlRm9ybWF0MSogYzEgPSAoVENvdmVyYWdlRm9ybWF0MSopQ292ZXJhZ2U7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgYzEtPkdseXBoQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoKFRUX3VpbnQzMl90KWMxLT5HbHlwaEFycmF5W2ldID09IGcpIHsKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjYXNlIDI6IHsKKyAgICAgIFRDb3ZlcmFnZUZvcm1hdDIqIGMyID0gKFRDb3ZlcmFnZUZvcm1hdDIqKUNvdmVyYWdlOworICAgICAgZm9yIChpID0gMDsgaSA8IGMyLT5SYW5nZUNvdW50OyBpKyspIHsKKyAgICAgICAgVFRfdWludDMyX3QgcyA9IGMyLT5SYW5nZVJlY29yZFtpXS5TdGFydDsKKyAgICAgICAgVFRfdWludDMyX3QgZSA9IGMyLT5SYW5nZVJlY29yZFtpXS5FbmQ7CisgICAgICAgIFRUX3VpbnQzMl90IHNpID0gYzItPlJhbmdlUmVjb3JkW2ldLlN0YXJ0Q292ZXJhZ2VJbmRleDsKKyAgICAgICAgaWYgKHMgPD0gZyAmJiBnIDw9IGUpIHsKKyAgICAgICAgICByZXR1cm4gc2kgKyBnIC0gczsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICByZXR1cm4gLTE7CiB9Ci1ib29sIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlKAotICAgIEZUX0J5dGVzIHNjcmlwdGxpc3QsCi0gICAgRlRfQnl0ZXMgZmVhdHVyZWxpc3QsCi0gICAgRlRfQnl0ZXMgbG9va3VwbGlzdCkKLXsKLSAgICBQYXJzZVNjcmlwdExpc3Qoc2NyaXB0bGlzdCwgJlNjcmlwdExpc3QpOwotICAgIFBhcnNlRmVhdHVyZUxpc3QoZmVhdHVyZWxpc3QsICZGZWF0dXJlTGlzdCk7Ci0gICAgUGFyc2VMb29rdXBMaXN0KGxvb2t1cGxpc3QsICZMb29rdXBMaXN0KTsKLSAgICByZXR1cm4gdHJ1ZTsKK2Jvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2UoRlRfQnl0ZXMgc2NyaXB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgZmVhdHVyZWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzIGxvb2t1cGxpc3QpIHsKKyAgUGFyc2VTY3JpcHRMaXN0KHNjcmlwdGxpc3QsICZTY3JpcHRMaXN0KTsKKyAgUGFyc2VGZWF0dXJlTGlzdChmZWF0dXJlbGlzdCwgJkZlYXR1cmVMaXN0KTsKKyAgUGFyc2VMb29rdXBMaXN0KGxvb2t1cGxpc3QsICZMb29rdXBMaXN0KTsKKyAgcmV0dXJuIHRydWU7CiB9Ci12b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlU2NyaXB0TGlzdChGVF9CeXRlcyByYXcsIHN0cnVjdCBUU2NyaXB0TGlzdCAqcmVjKQotewotICAgIGludCBpOwotICAgIEZUX0J5dGVzIHNwID0gcmF3OwotICAgIHJlYy0+U2NyaXB0Q291bnQgPSBHZXRVSW50MTYoc3ApOwotICAgIGlmKHJlYy0+U2NyaXB0Q291bnQgPD0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlYy0+U2NyaXB0UmVjb3JkID0gbmV3IHN0cnVjdCBUU2NyaXB0UmVjb3JkW3JlYy0+U2NyaXB0Q291bnRdOwotICAgIGZvcihpID0gMDsgaSA8IHJlYy0+U2NyaXB0Q291bnQ7IGkrKykgewotICAgICAgICByZWMtPlNjcmlwdFJlY29yZFtpXS5TY3JpcHRUYWcgPSBHZXRVSW50MzIoc3ApOwotICAgICAgICBUVF91aW50MTZfdCBvZmZzZXQgPSBHZXRVSW50MTYoc3ApOwotICAgICAgICBQYXJzZVNjcmlwdCgKLSAgICAgICAgICAgICZyYXdbb2Zmc2V0XSwKLSAgICAgICAgICAgICZyZWMtPlNjcmlwdFJlY29yZFtpXS5TY3JpcHQpOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VTY3JpcHQoRlRfQnl0ZXMgcmF3LCBzdHJ1Y3QgVFNjcmlwdCAqcmVjKQotewotICAgIGludCBpOwotICAgIEZUX0J5dGVzIHNwID0gcmF3OwotICAgIHJlYy0+RGVmYXVsdExhbmdTeXMgPSBHZXRVSW50MTYoc3ApOwotICAgIHJlYy0+TGFuZ1N5c0NvdW50ID0gR2V0VUludDE2KHNwKTsKLSAgICBpZihyZWMtPkxhbmdTeXNDb3VudCA8PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVjLT5MYW5nU3lzUmVjb3JkID0gbmV3IHN0cnVjdCBUTGFuZ1N5c1JlY29yZFtyZWMtPkxhbmdTeXNDb3VudF07Ci0gICAgZm9yKGkgPSAwOyBpIDwgcmVjLT5MYW5nU3lzQ291bnQ7IGkrKykgewotICAgICAgICByZWMtPkxhbmdTeXNSZWNvcmRbaV0uTGFuZ1N5c1RhZyA9IEdldFVJbnQzMihzcCk7Ci0gICAgICAgIFRUX3VpbnQxNl90IG9mZnNldCA9IEdldFVJbnQxNihzcCk7Ci0gICAgICAgIFBhcnNlTGFuZ1N5cygKLSAgICAgICAgICAgICZyYXdbb2Zmc2V0XSwKLSAgICAgICAgICAgICZyZWMtPkxhbmdTeXNSZWNvcmRbaV0uTGFuZ1N5cyk7Ci0gICAgfQotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUxhbmdTeXMoRlRfQnl0ZXMgcmF3LCBzdHJ1Y3QgVExhbmdTeXMgKnJlYykKLXsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICByZWMtPkxvb2t1cE9yZGVyID0gR2V0VUludDE2KHNwKTsKLSAgICByZWMtPlJlcUZlYXR1cmVJbmRleCA9IEdldFVJbnQxNihzcCk7Ci0gICAgcmVjLT5GZWF0dXJlQ291bnQgPSBHZXRVSW50MTYoc3ApOwotICAgIGlmKHJlYy0+RmVhdHVyZUNvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPkZlYXR1cmVJbmRleCA9IG5ldyBUVF91aW50MTZfdFtyZWMtPkZlYXR1cmVDb3VudF07Ci0gICAgRlhTWVNfbWVtc2V0KHJlYy0+RmVhdHVyZUluZGV4LCAwLCBzaXplb2YoVFRfdWludDE2X3QpICogcmVjLT5GZWF0dXJlQ291bnQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjLT5GZWF0dXJlQ291bnQ7ICsraSkgewotICAgICAgICByZWMtPkZlYXR1cmVJbmRleFtpXSA9IEdldFVJbnQxNihzcCk7Ci0gICAgfQotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUZlYXR1cmVMaXN0KEZUX0J5dGVzIHJhdywgVEZlYXR1cmVMaXN0ICpyZWMpCi17Ci0gICAgaW50IGk7Ci0gICAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gICAgcmVjLT5GZWF0dXJlQ291bnQgPSBHZXRVSW50MTYoc3ApOwotICAgIGlmKHJlYy0+RmVhdHVyZUNvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPkZlYXR1cmVSZWNvcmQgPSBuZXcgc3RydWN0IFRGZWF0dXJlUmVjb3JkW3JlYy0+RmVhdHVyZUNvdW50XTsKLSAgICBmb3IoaSA9IDA7IGkgPCByZWMtPkZlYXR1cmVDb3VudDsgaSsrKSB7Ci0gICAgICAgIHJlYy0+RmVhdHVyZVJlY29yZFtpXS5GZWF0dXJlVGFnID0gR2V0VUludDMyKHNwKTsKLSAgICAgICAgVFRfdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKLSAgICAgICAgUGFyc2VGZWF0dXJlKAotICAgICAgICAgICAgJnJhd1tvZmZzZXRdLAotICAgICAgICAgICAgJnJlYy0+RmVhdHVyZVJlY29yZFtpXS5GZWF0dXJlKTsKLSAgICB9Ci19Ci12b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlRmVhdHVyZShGVF9CeXRlcyByYXcsIFRGZWF0dXJlICpyZWMpCi17Ci0gICAgaW50IGk7Ci0gICAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gICAgcmVjLT5GZWF0dXJlUGFyYW1zID0gR2V0VUludDE2KHNwKTsKLSAgICByZWMtPkxvb2t1cENvdW50ID0gR2V0VUludDE2KHNwKTsKLSAgICBpZihyZWMtPkxvb2t1cENvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPkxvb2t1cExpc3RJbmRleCA9IG5ldyBUVF91aW50MTZfdFtyZWMtPkxvb2t1cENvdW50XTsKLSAgICBmb3IoaSA9IDA7IGkgPCByZWMtPkxvb2t1cENvdW50OyBpKyspIHsKLSAgICAgICAgcmVjLT5Mb29rdXBMaXN0SW5kZXhbaV0gPSBHZXRVSW50MTYoc3ApOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VMb29rdXBMaXN0KEZUX0J5dGVzIHJhdywgVExvb2t1cExpc3QgKnJlYykKLXsKLSAgICBpbnQgaTsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICByZWMtPkxvb2t1cENvdW50ID0gR2V0VUludDE2KHNwKTsKLSAgICBpZihyZWMtPkxvb2t1cENvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPkxvb2t1cCA9IG5ldyBzdHJ1Y3QgVExvb2t1cFtyZWMtPkxvb2t1cENvdW50XTsKLSAgICBmb3IoaSA9IDA7IGkgPCByZWMtPkxvb2t1cENvdW50OyBpKyspIHsKLSAgICAgICAgVFRfdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKLSAgICAgICAgUGFyc2VMb29rdXAoCi0gICAgICAgICAgICAmcmF3W29mZnNldF0sCi0gICAgICAgICAgICAmcmVjLT5Mb29rdXBbaV0pOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VMb29rdXAoRlRfQnl0ZXMgcmF3LCBUTG9va3VwICpyZWMpCi17Ci0gICAgaW50IGk7Ci0gICAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gICAgcmVjLT5Mb29rdXBUeXBlID0gR2V0VUludDE2KHNwKTsKLSAgICByZWMtPkxvb2t1cEZsYWcgPSBHZXRVSW50MTYoc3ApOwotICAgIHJlYy0+U3ViVGFibGVDb3VudCA9IEdldFVJbnQxNihzcCk7Ci0gICAgaWYocmVjLT5TdWJUYWJsZUNvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPlN1YlRhYmxlID0gbmV3IHN0cnVjdCBUU3ViVGFibGVCYXNlKltyZWMtPlN1YlRhYmxlQ291bnRdOwotICAgIGZvcihpID0gMDsgaSA8IHJlYy0+U3ViVGFibGVDb3VudDsgaSsrKSB7Ci0gICAgICAgIHJlYy0+U3ViVGFibGVbaV0gPSBOVUxMOwotICAgIH0KLSAgICBpZihyZWMtPkxvb2t1cFR5cGUgIT0gMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvcihpID0gMDsgaSA8IHJlYy0+U3ViVGFibGVDb3VudDsgaSsrKSB7Ci0gICAgICAgIFRUX3VpbnQxNl90IG9mZnNldCA9IEdldFVJbnQxNihzcCk7Ci0gICAgICAgIFBhcnNlU2luZ2xlU3Vic3QoCi0gICAgICAgICAgICAmcmF3W29mZnNldF0sCi0gICAgICAgICAgICAmcmVjLT5TdWJUYWJsZVtpXSk7Ci0gICAgfQotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUNvdmVyYWdlKEZUX0J5dGVzIHJhdywgVENvdmVyYWdlRm9ybWF0QmFzZSAqKnJlYykKLXsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICBUVF91aW50MTZfdCBGb3JtYXQgPSBHZXRVSW50MTYoc3ApOwotICAgIHN3aXRjaChGb3JtYXQpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgKnJlYyA9IG5ldyBUQ292ZXJhZ2VGb3JtYXQxKCk7Ci0gICAgICAgICAgICBQYXJzZUNvdmVyYWdlRm9ybWF0MShyYXcsIChUQ292ZXJhZ2VGb3JtYXQxKikqcmVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAqcmVjID0gbmV3IFRDb3ZlcmFnZUZvcm1hdDIoKTsKLSAgICAgICAgICAgIFBhcnNlQ292ZXJhZ2VGb3JtYXQyKHJhdywgKFRDb3ZlcmFnZUZvcm1hdDIqKSpyZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUNvdmVyYWdlRm9ybWF0MShGVF9CeXRlcyByYXcsIFRDb3ZlcmFnZUZvcm1hdDEgKnJlYykKLXsKLSAgICBpbnQgaTsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICBHZXRVSW50MTYoc3ApOwotICAgIHJlYy0+R2x5cGhDb3VudCA9IEdldFVJbnQxNihzcCk7Ci0gICAgaWYocmVjLT5HbHlwaENvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPkdseXBoQXJyYXkgPSBuZXcgVFRfdWludDE2X3RbcmVjLT5HbHlwaENvdW50XTsKLSAgICBmb3IoaSA9IDA7IGkgPCByZWMtPkdseXBoQ291bnQ7IGkrKykgewotICAgICAgICByZWMtPkdseXBoQXJyYXlbaV0gPSBHZXRVSW50MTYoc3ApOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VDb3ZlcmFnZUZvcm1hdDIoRlRfQnl0ZXMgcmF3LCBUQ292ZXJhZ2VGb3JtYXQyICpyZWMpCi17Ci0gICAgaW50IGk7Ci0gICAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gICAgR2V0VUludDE2KHNwKTsKLSAgICByZWMtPlJhbmdlQ291bnQgPSBHZXRVSW50MTYoc3ApOwotICAgIGlmKHJlYy0+UmFuZ2VDb3VudCA8PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVjLT5SYW5nZVJlY29yZCA9IG5ldyBUUmFuZ2VSZWNvcmRbcmVjLT5SYW5nZUNvdW50XTsKLSAgICBmb3IoaSA9IDA7IGkgPCByZWMtPlJhbmdlQ291bnQ7IGkrKykgewotICAgICAgICByZWMtPlJhbmdlUmVjb3JkW2ldLlN0YXJ0ID0gR2V0VUludDE2KHNwKTsKLSAgICAgICAgcmVjLT5SYW5nZVJlY29yZFtpXS5FbmQgPSBHZXRVSW50MTYoc3ApOwotICAgICAgICByZWMtPlJhbmdlUmVjb3JkW2ldLlN0YXJ0Q292ZXJhZ2VJbmRleCA9IEdldFVJbnQxNihzcCk7Ci0gICAgfQotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNpbmdsZVN1YnN0KEZUX0J5dGVzIHJhdywgVFN1YlRhYmxlQmFzZSAqKnJlYykKLXsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICBUVF91aW50MTZfdCBGb3JtYXQgPSBHZXRVSW50MTYoc3ApOwotICAgIHN3aXRjaChGb3JtYXQpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgKnJlYyA9IG5ldyBUU2luZ2xlU3Vic3RGb3JtYXQxKCk7Ci0gICAgICAgICAgICBQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MShyYXcsIChUU2luZ2xlU3Vic3RGb3JtYXQxKikqcmVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAqcmVjID0gbmV3IFRTaW5nbGVTdWJzdEZvcm1hdDIoKTsKLSAgICAgICAgICAgIFBhcnNlU2luZ2xlU3Vic3RGb3JtYXQyKHJhdywgKFRTaW5nbGVTdWJzdEZvcm1hdDIqKSpyZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MShGVF9CeXRlcyByYXcsIFRTaW5nbGVTdWJzdEZvcm1hdDEgKnJlYykKLXsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICBHZXRVSW50MTYoc3ApOwordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNjcmlwdExpc3QoRlRfQnl0ZXMgcmF3LCBzdHJ1Y3QgVFNjcmlwdExpc3QqIHJlYykgeworICBpbnQgaTsKKyAgRlRfQnl0ZXMgc3AgPSByYXc7CisgIHJlYy0+U2NyaXB0Q291bnQgPSBHZXRVSW50MTYoc3ApOworICBpZiAocmVjLT5TY3JpcHRDb3VudCA8PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHJlYy0+U2NyaXB0UmVjb3JkID0gbmV3IHN0cnVjdCBUU2NyaXB0UmVjb3JkW3JlYy0+U2NyaXB0Q291bnRdOworICBmb3IgKGkgPSAwOyBpIDwgcmVjLT5TY3JpcHRDb3VudDsgaSsrKSB7CisgICAgcmVjLT5TY3JpcHRSZWNvcmRbaV0uU2NyaXB0VGFnID0gR2V0VUludDMyKHNwKTsKICAgICBUVF91aW50MTZfdCBvZmZzZXQgPSBHZXRVSW50MTYoc3ApOwotICAgIFBhcnNlQ292ZXJhZ2UoCi0gICAgICAgICZyYXdbb2Zmc2V0XSwKLSAgICAgICAgJnJlYy0+Q292ZXJhZ2UpOwotICAgIHJlYy0+RGVsdGFHbHlwaElEID0gR2V0SW50MTYoc3ApOworICAgIFBhcnNlU2NyaXB0KCZyYXdbb2Zmc2V0XSwgJnJlYy0+U2NyaXB0UmVjb3JkW2ldLlNjcmlwdCk7CisgIH0KIH0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VTaW5nbGVTdWJzdEZvcm1hdDIoRlRfQnl0ZXMgcmF3LCBUU2luZ2xlU3Vic3RGb3JtYXQyICpyZWMpCi17Ci0gICAgaW50IGk7Ci0gICAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gICAgR2V0VUludDE2KHNwKTsKK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VTY3JpcHQoRlRfQnl0ZXMgcmF3LCBzdHJ1Y3QgVFNjcmlwdCogcmVjKSB7CisgIGludCBpOworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgcmVjLT5EZWZhdWx0TGFuZ1N5cyA9IEdldFVJbnQxNihzcCk7CisgIHJlYy0+TGFuZ1N5c0NvdW50ID0gR2V0VUludDE2KHNwKTsKKyAgaWYgKHJlYy0+TGFuZ1N5c0NvdW50IDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcmVjLT5MYW5nU3lzUmVjb3JkID0gbmV3IHN0cnVjdCBUTGFuZ1N5c1JlY29yZFtyZWMtPkxhbmdTeXNDb3VudF07CisgIGZvciAoaSA9IDA7IGkgPCByZWMtPkxhbmdTeXNDb3VudDsgaSsrKSB7CisgICAgcmVjLT5MYW5nU3lzUmVjb3JkW2ldLkxhbmdTeXNUYWcgPSBHZXRVSW50MzIoc3ApOwogICAgIFRUX3VpbnQxNl90IG9mZnNldCA9IEdldFVJbnQxNihzcCk7Ci0gICAgUGFyc2VDb3ZlcmFnZSgKLSAgICAgICAgJnJhd1tvZmZzZXRdLAotICAgICAgICAmcmVjLT5Db3ZlcmFnZSk7Ci0gICAgcmVjLT5HbHlwaENvdW50ID0gR2V0VUludDE2KHNwKTsKLSAgICBpZihyZWMtPkdseXBoQ291bnQgPD0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlYy0+U3Vic3RpdHV0ZSA9IG5ldyBUVF91aW50MTZfdFtyZWMtPkdseXBoQ291bnRdOwotICAgIGZvcihpID0gMDsgaSA8IHJlYy0+R2x5cGhDb3VudDsgaSsrKSB7Ci0gICAgICAgIHJlYy0+U3Vic3RpdHV0ZVtpXSA9IEdldFVJbnQxNihzcCk7Ci0gICAgfQorICAgIFBhcnNlTGFuZ1N5cygmcmF3W29mZnNldF0sICZyZWMtPkxhbmdTeXNSZWNvcmRbaV0uTGFuZ1N5cyk7CisgIH0KIH0KLUZYX0JPT0wgQ0ZYX0dTVUJUYWJsZTo6R2V0VmVydGljYWxHbHlwaChGWF9EV09SRCBnbHlwaG51bSwgRlhfRFdPUkQqIHZnbHlwaG51bSkKLXsKLSAgICByZXR1cm4gbV9Hc3ViSW1wLkdldFZlcnRpY2FsR2x5cGgoZ2x5cGhudW0sIHZnbHlwaG51bSk7Cit2b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlTGFuZ1N5cyhGVF9CeXRlcyByYXcsIHN0cnVjdCBUTGFuZ1N5cyogcmVjKSB7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICByZWMtPkxvb2t1cE9yZGVyID0gR2V0VUludDE2KHNwKTsKKyAgcmVjLT5SZXFGZWF0dXJlSW5kZXggPSBHZXRVSW50MTYoc3ApOworICByZWMtPkZlYXR1cmVDb3VudCA9IEdldFVJbnQxNihzcCk7CisgIGlmIChyZWMtPkZlYXR1cmVDb3VudCA8PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHJlYy0+RmVhdHVyZUluZGV4ID0gbmV3IFRUX3VpbnQxNl90W3JlYy0+RmVhdHVyZUNvdW50XTsKKyAgRlhTWVNfbWVtc2V0KHJlYy0+RmVhdHVyZUluZGV4LCAwLCBzaXplb2YoVFRfdWludDE2X3QpICogcmVjLT5GZWF0dXJlQ291bnQpOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlYy0+RmVhdHVyZUNvdW50OyArK2kpIHsKKyAgICByZWMtPkZlYXR1cmVJbmRleFtpXSA9IEdldFVJbnQxNihzcCk7CisgIH0KK30KK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VGZWF0dXJlTGlzdChGVF9CeXRlcyByYXcsIFRGZWF0dXJlTGlzdCogcmVjKSB7CisgIGludCBpOworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgcmVjLT5GZWF0dXJlQ291bnQgPSBHZXRVSW50MTYoc3ApOworICBpZiAocmVjLT5GZWF0dXJlQ291bnQgPD0gMCkgeworICAgIHJldHVybjsKKyAgfQorICByZWMtPkZlYXR1cmVSZWNvcmQgPSBuZXcgc3RydWN0IFRGZWF0dXJlUmVjb3JkW3JlYy0+RmVhdHVyZUNvdW50XTsKKyAgZm9yIChpID0gMDsgaSA8IHJlYy0+RmVhdHVyZUNvdW50OyBpKyspIHsKKyAgICByZWMtPkZlYXR1cmVSZWNvcmRbaV0uRmVhdHVyZVRhZyA9IEdldFVJbnQzMihzcCk7CisgICAgVFRfdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKKyAgICBQYXJzZUZlYXR1cmUoJnJhd1tvZmZzZXRdLCAmcmVjLT5GZWF0dXJlUmVjb3JkW2ldLkZlYXR1cmUpOworICB9Cit9Cit2b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlRmVhdHVyZShGVF9CeXRlcyByYXcsIFRGZWF0dXJlKiByZWMpIHsKKyAgaW50IGk7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICByZWMtPkZlYXR1cmVQYXJhbXMgPSBHZXRVSW50MTYoc3ApOworICByZWMtPkxvb2t1cENvdW50ID0gR2V0VUludDE2KHNwKTsKKyAgaWYgKHJlYy0+TG9va3VwQ291bnQgPD0gMCkgeworICAgIHJldHVybjsKKyAgfQorICByZWMtPkxvb2t1cExpc3RJbmRleCA9IG5ldyBUVF91aW50MTZfdFtyZWMtPkxvb2t1cENvdW50XTsKKyAgZm9yIChpID0gMDsgaSA8IHJlYy0+TG9va3VwQ291bnQ7IGkrKykgeworICAgIHJlYy0+TG9va3VwTGlzdEluZGV4W2ldID0gR2V0VUludDE2KHNwKTsKKyAgfQorfQordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUxvb2t1cExpc3QoRlRfQnl0ZXMgcmF3LCBUTG9va3VwTGlzdCogcmVjKSB7CisgIGludCBpOworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgcmVjLT5Mb29rdXBDb3VudCA9IEdldFVJbnQxNihzcCk7CisgIGlmIChyZWMtPkxvb2t1cENvdW50IDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcmVjLT5Mb29rdXAgPSBuZXcgc3RydWN0IFRMb29rdXBbcmVjLT5Mb29rdXBDb3VudF07CisgIGZvciAoaSA9IDA7IGkgPCByZWMtPkxvb2t1cENvdW50OyBpKyspIHsKKyAgICBUVF91aW50MTZfdCBvZmZzZXQgPSBHZXRVSW50MTYoc3ApOworICAgIFBhcnNlTG9va3VwKCZyYXdbb2Zmc2V0XSwgJnJlYy0+TG9va3VwW2ldKTsKKyAgfQorfQordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUxvb2t1cChGVF9CeXRlcyByYXcsIFRMb29rdXAqIHJlYykgeworICBpbnQgaTsKKyAgRlRfQnl0ZXMgc3AgPSByYXc7CisgIHJlYy0+TG9va3VwVHlwZSA9IEdldFVJbnQxNihzcCk7CisgIHJlYy0+TG9va3VwRmxhZyA9IEdldFVJbnQxNihzcCk7CisgIHJlYy0+U3ViVGFibGVDb3VudCA9IEdldFVJbnQxNihzcCk7CisgIGlmIChyZWMtPlN1YlRhYmxlQ291bnQgPD0gMCkgeworICAgIHJldHVybjsKKyAgfQorICByZWMtPlN1YlRhYmxlID0gbmV3IHN0cnVjdCBUU3ViVGFibGVCYXNlKltyZWMtPlN1YlRhYmxlQ291bnRdOworICBmb3IgKGkgPSAwOyBpIDwgcmVjLT5TdWJUYWJsZUNvdW50OyBpKyspIHsKKyAgICByZWMtPlN1YlRhYmxlW2ldID0gTlVMTDsKKyAgfQorICBpZiAocmVjLT5Mb29rdXBUeXBlICE9IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHJlYy0+U3ViVGFibGVDb3VudDsgaSsrKSB7CisgICAgVFRfdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKKyAgICBQYXJzZVNpbmdsZVN1YnN0KCZyYXdbb2Zmc2V0XSwgJnJlYy0+U3ViVGFibGVbaV0pOworICB9Cit9Cit2b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlQ292ZXJhZ2UoRlRfQnl0ZXMgcmF3LCBUQ292ZXJhZ2VGb3JtYXRCYXNlKiogcmVjKSB7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICBUVF91aW50MTZfdCBGb3JtYXQgPSBHZXRVSW50MTYoc3ApOworICBzd2l0Y2ggKEZvcm1hdCkgeworICAgIGNhc2UgMToKKyAgICAgICpyZWMgPSBuZXcgVENvdmVyYWdlRm9ybWF0MSgpOworICAgICAgUGFyc2VDb3ZlcmFnZUZvcm1hdDEocmF3LCAoVENvdmVyYWdlRm9ybWF0MSopKnJlYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAqcmVjID0gbmV3IFRDb3ZlcmFnZUZvcm1hdDIoKTsKKyAgICAgIFBhcnNlQ292ZXJhZ2VGb3JtYXQyKHJhdywgKFRDb3ZlcmFnZUZvcm1hdDIqKSpyZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VDb3ZlcmFnZUZvcm1hdDEoRlRfQnl0ZXMgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ292ZXJhZ2VGb3JtYXQxKiByZWMpIHsKKyAgaW50IGk7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICBHZXRVSW50MTYoc3ApOworICByZWMtPkdseXBoQ291bnQgPSBHZXRVSW50MTYoc3ApOworICBpZiAocmVjLT5HbHlwaENvdW50IDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcmVjLT5HbHlwaEFycmF5ID0gbmV3IFRUX3VpbnQxNl90W3JlYy0+R2x5cGhDb3VudF07CisgIGZvciAoaSA9IDA7IGkgPCByZWMtPkdseXBoQ291bnQ7IGkrKykgeworICAgIHJlYy0+R2x5cGhBcnJheVtpXSA9IEdldFVJbnQxNihzcCk7CisgIH0KK30KK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VDb3ZlcmFnZUZvcm1hdDIoRlRfQnl0ZXMgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ292ZXJhZ2VGb3JtYXQyKiByZWMpIHsKKyAgaW50IGk7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICBHZXRVSW50MTYoc3ApOworICByZWMtPlJhbmdlQ291bnQgPSBHZXRVSW50MTYoc3ApOworICBpZiAocmVjLT5SYW5nZUNvdW50IDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcmVjLT5SYW5nZVJlY29yZCA9IG5ldyBUUmFuZ2VSZWNvcmRbcmVjLT5SYW5nZUNvdW50XTsKKyAgZm9yIChpID0gMDsgaSA8IHJlYy0+UmFuZ2VDb3VudDsgaSsrKSB7CisgICAgcmVjLT5SYW5nZVJlY29yZFtpXS5TdGFydCA9IEdldFVJbnQxNihzcCk7CisgICAgcmVjLT5SYW5nZVJlY29yZFtpXS5FbmQgPSBHZXRVSW50MTYoc3ApOworICAgIHJlYy0+UmFuZ2VSZWNvcmRbaV0uU3RhcnRDb3ZlcmFnZUluZGV4ID0gR2V0VUludDE2KHNwKTsKKyAgfQorfQordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNpbmdsZVN1YnN0KEZUX0J5dGVzIHJhdywgVFN1YlRhYmxlQmFzZSoqIHJlYykgeworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgVFRfdWludDE2X3QgRm9ybWF0ID0gR2V0VUludDE2KHNwKTsKKyAgc3dpdGNoIChGb3JtYXQpIHsKKyAgICBjYXNlIDE6CisgICAgICAqcmVjID0gbmV3IFRTaW5nbGVTdWJzdEZvcm1hdDEoKTsKKyAgICAgIFBhcnNlU2luZ2xlU3Vic3RGb3JtYXQxKHJhdywgKFRTaW5nbGVTdWJzdEZvcm1hdDEqKSpyZWMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgKnJlYyA9IG5ldyBUU2luZ2xlU3Vic3RGb3JtYXQyKCk7CisgICAgICBQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MihyYXcsIChUU2luZ2xlU3Vic3RGb3JtYXQyKikqcmVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9Cit2b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlU2luZ2xlU3Vic3RGb3JtYXQxKEZUX0J5dGVzIHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MSogcmVjKSB7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICBHZXRVSW50MTYoc3ApOworICBUVF91aW50MTZfdCBvZmZzZXQgPSBHZXRVSW50MTYoc3ApOworICBQYXJzZUNvdmVyYWdlKCZyYXdbb2Zmc2V0XSwgJnJlYy0+Q292ZXJhZ2UpOworICByZWMtPkRlbHRhR2x5cGhJRCA9IEdldEludDE2KHNwKTsKK30KK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VTaW5nbGVTdWJzdEZvcm1hdDIoRlRfQnl0ZXMgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU2luZ2xlU3Vic3RGb3JtYXQyKiByZWMpIHsKKyAgaW50IGk7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICBHZXRVSW50MTYoc3ApOworICBUVF91aW50MTZfdCBvZmZzZXQgPSBHZXRVSW50MTYoc3ApOworICBQYXJzZUNvdmVyYWdlKCZyYXdbb2Zmc2V0XSwgJnJlYy0+Q292ZXJhZ2UpOworICByZWMtPkdseXBoQ291bnQgPSBHZXRVSW50MTYoc3ApOworICBpZiAocmVjLT5HbHlwaENvdW50IDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcmVjLT5TdWJzdGl0dXRlID0gbmV3IFRUX3VpbnQxNl90W3JlYy0+R2x5cGhDb3VudF07CisgIGZvciAoaSA9IDA7IGkgPCByZWMtPkdseXBoQ291bnQ7IGkrKykgeworICAgIHJlYy0+U3Vic3RpdHV0ZVtpXSA9IEdldFVJbnQxNihzcCk7CisgIH0KK30KK0ZYX0JPT0wgQ0ZYX0dTVUJUYWJsZTo6R2V0VmVydGljYWxHbHlwaChGWF9EV09SRCBnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogdmdseXBobnVtKSB7CisgIHJldHVybiBtX0dzdWJJbXAuR2V0VmVydGljYWxHbHlwaChnbHlwaG51bSwgdmdseXBobnVtKTsKIH0KIC8vIHN0YXRpYwotSUZYX0dTVUJUYWJsZSogSUZYX0dTVUJUYWJsZTo6Q3JlYXRlKENGWF9Gb250KiBwRm9udCkKLXsKLSAgICBpZiAoIXBGb250KSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoTlVMTCA9PSBwRm9udC0+bV9wR3N1YkRhdGEpIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGggPSAwOwotICAgICAgICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfU2ZudF9UYWJsZShwRm9udC0+bV9GYWNlLCBGVF9NQUtFX1RBRygnRycsICdTJywgJ1UnLCAnQicpLCAwLCBOVUxMLCAmbGVuZ3RoKTsKLSAgICAgICAgaWYgKCFlcnJvcikgewotICAgICAgICAgICAgcEZvbnQtPm1fcEdzdWJEYXRhID0gKHVuc2lnbmVkIGNoYXIqKUZYX0FsbG9jKHVpbnQ4X3QsIGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwRm9udC0+bV9wR3N1YkRhdGEpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBlcnJvciA9IEZYRlRfTG9hZF9TZm50X1RhYmxlKHBGb250LT5tX0ZhY2UsIEZUX01BS0VfVEFHKCdHJywgJ1MnLCAnVScsICdCJyksIDAsIHBGb250LT5tX3BHc3ViRGF0YSwgTlVMTCk7Ci0gICAgaWYgKCFlcnJvciAmJiBwRm9udC0+bV9wR3N1YkRhdGEpIHsKLSAgICAgICAgbm9uc3RkOjp1bmlxdWVfcHRyPENGWF9HU1VCVGFibGU+IHBHc3ViVGFibGUobmV3IENGWF9HU1VCVGFibGUpOwotICAgICAgICBpZiAocEdzdWJUYWJsZS0+bV9Hc3ViSW1wLkxvYWRHU1VCVGFibGUoKEZUX0J5dGVzKXBGb250LT5tX3BHc3ViRGF0YSkpIHsKLSAgICAgICAgICAgIHJldHVybiBwR3N1YlRhYmxlLnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgIH0KK0lGWF9HU1VCVGFibGUqIElGWF9HU1VCVGFibGU6OkNyZWF0ZShDRlhfRm9udCogcEZvbnQpIHsKKyAgaWYgKCFwRm9udCkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChOVUxMID09IHBGb250LT5tX3BHc3ViRGF0YSkgeworICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gMDsKKyAgICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfU2ZudF9UYWJsZSgKKyAgICAgICAgcEZvbnQtPm1fRmFjZSwgRlRfTUFLRV9UQUcoJ0cnLCAnUycsICdVJywgJ0InKSwgMCwgTlVMTCwgJmxlbmd0aCk7CisgICAgaWYgKCFlcnJvcikgeworICAgICAgcEZvbnQtPm1fcEdzdWJEYXRhID0gKHVuc2lnbmVkIGNoYXIqKUZYX0FsbG9jKHVpbnQ4X3QsIGxlbmd0aCk7CisgICAgfQorICAgIGlmICghcEZvbnQtPm1fcEdzdWJEYXRhKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgaW50IGVycm9yID0KKyAgICAgIEZYRlRfTG9hZF9TZm50X1RhYmxlKHBGb250LT5tX0ZhY2UsIEZUX01BS0VfVEFHKCdHJywgJ1MnLCAnVScsICdCJyksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+bV9wR3N1YkRhdGEsIE5VTEwpOworICBpZiAoIWVycm9yICYmIHBGb250LT5tX3BHc3ViRGF0YSkgeworICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxDRlhfR1NVQlRhYmxlPiBwR3N1YlRhYmxlKG5ldyBDRlhfR1NVQlRhYmxlKTsKKyAgICBpZiAocEdzdWJUYWJsZS0+bV9Hc3ViSW1wLkxvYWRHU1VCVGFibGUoKEZUX0J5dGVzKXBGb250LT5tX3BHc3ViRGF0YSkpIHsKKyAgICAgIHJldHVybiBwR3N1YlRhYmxlLnJlbGVhc2UoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuaAppbmRleCAxYjE4ZjgyLi5iNzE3YzdhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5oCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmgKQEAgLTExLDQwNCArMTEsMzkxIEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgImNvbW1vbi5oIgogCi1jbGFzcyBDRlhfR2x5cGhNYXAKLXsKLXB1YmxpYzoKLSAgICBDRlhfR2x5cGhNYXAoKTsKLSAgICB+Q0ZYX0dseXBoTWFwKCk7Ci0gICAgdm9pZAlTZXRBdChpbnQga2V5LCBpbnQgdmFsdWUpOwotICAgIEZYX0JPT0wJTG9va3VwKGludCBrZXksIGludCAmdmFsdWUpOwotcHJvdGVjdGVkOgotICAgIENGWF9CaW5hcnlCdWYJbV9CdWZmZXI7Ci19OwotY2xhc3MgQ0ZYX0NUVEdTVUJUYWJsZQotewotcHVibGljOgotICAgIENGWF9DVFRHU1VCVGFibGUodm9pZCk6IG1fYkZlYXV0dXJlTWFwTG9hZChGQUxTRSksIGxvYWRlZChmYWxzZSkge307Ci0gICAgQ0ZYX0NUVEdTVUJUYWJsZShGVF9CeXRlcyBnc3ViKTogbV9iRmVhdXR1cmVNYXBMb2FkKEZBTFNFKSwgbG9hZGVkKGZhbHNlKQotICAgIHsKLSAgICAgICAgTG9hZEdTVUJUYWJsZShnc3ViKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+Q0ZYX0NUVEdTVUJUYWJsZSgpIHt9Ci0gICAgYm9vbCBJc09rKHZvaWQpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbG9hZGVkOwotICAgIH0KLSAgICBib29sIExvYWRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1Yik7Ci0gICAgYm9vbCBHZXRWZXJ0aWNhbEdseXBoKFRUX3VpbnQzMl90IGdseXBobnVtLCBUVF91aW50MzJfdCAqdmdseXBobnVtKTsKLXByaXZhdGU6Ci0gICAgc3RydWN0IHR0X2dzdWJfaGVhZGVyIHsKLSAgICAgICAgVFRfdWludDMyX3QgVmVyc2lvbjsKLSAgICAgICAgVFRfdWludDE2X3QgU2NyaXB0TGlzdDsKLSAgICAgICAgVFRfdWludDE2X3QgRmVhdHVyZUxpc3Q7Ci0gICAgICAgIFRUX3VpbnQxNl90IExvb2t1cExpc3Q7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVExhbmdTeXMgewotICAgICAgICBUVF91aW50MTZfdCBMb29rdXBPcmRlcjsKLSAgICAgICAgVFRfdWludDE2X3QgUmVxRmVhdHVyZUluZGV4OwotICAgICAgICBUVF91aW50MTZfdCBGZWF0dXJlQ291bnQ7Ci0gICAgICAgIFRUX3VpbnQxNl90ICpGZWF0dXJlSW5kZXg7Ci0gICAgICAgIFRMYW5nU3lzKCk6IExvb2t1cE9yZGVyKDApLCBSZXFGZWF0dXJlSW5kZXgoMCksIEZlYXR1cmVDb3VudCgwKSwgRmVhdHVyZUluZGV4KE5VTEwpIHt9Ci0gICAgICAgIH5UTGFuZ1N5cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEZlYXR1cmVJbmRleCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIEZlYXR1cmVJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRMYW5nU3lzKGNvbnN0IFRMYW5nU3lzJik7Ci0gICAgICAgIFRMYW5nU3lzJiBvcGVyYXRvcj0oY29uc3QgVExhbmdTeXMmKTsKLSAgICB9OwotICAgIHN0cnVjdCBUTGFuZ1N5c1JlY29yZCB7Ci0gICAgICAgIFRUX3VpbnQzMl90IExhbmdTeXNUYWc7Ci0gICAgICAgIHN0cnVjdCBUTGFuZ1N5cyBMYW5nU3lzOwotICAgICAgICBUTGFuZ1N5c1JlY29yZCgpOiBMYW5nU3lzVGFnKDApIHt9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVExhbmdTeXNSZWNvcmQoY29uc3QgVExhbmdTeXNSZWNvcmQmKTsKLSAgICAgICAgVExhbmdTeXNSZWNvcmQmIG9wZXJhdG9yPShjb25zdCBUTGFuZ1N5c1JlY29yZCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRTY3JpcHQgewotICAgICAgICBUVF91aW50MTZfdCBEZWZhdWx0TGFuZ1N5czsKLSAgICAgICAgVFRfdWludDE2X3QgTGFuZ1N5c0NvdW50OwotICAgICAgICBzdHJ1Y3QgVExhbmdTeXNSZWNvcmQgKkxhbmdTeXNSZWNvcmQ7Ci0gICAgICAgIFRTY3JpcHQoKTogRGVmYXVsdExhbmdTeXMoMCksIExhbmdTeXNDb3VudCgwKSwgTGFuZ1N5c1JlY29yZChOVUxMKSB7fQotICAgICAgICB+VFNjcmlwdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKExhbmdTeXNSZWNvcmQpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBMYW5nU3lzUmVjb3JkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVFNjcmlwdChjb25zdCBUU2NyaXB0Jik7Ci0gICAgICAgIFRTY3JpcHQmIG9wZXJhdG9yPShjb25zdCBUU2NyaXB0Jik7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVFNjcmlwdFJlY29yZCB7Ci0gICAgICAgIFRUX3VpbnQzMl90IFNjcmlwdFRhZzsKLSAgICAgICAgc3RydWN0IFRTY3JpcHQgU2NyaXB0OwotICAgICAgICBUU2NyaXB0UmVjb3JkKCk6IFNjcmlwdFRhZygwKSB7fQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRTY3JpcHRSZWNvcmQoY29uc3QgVFNjcmlwdFJlY29yZCYpOwotICAgICAgICBUU2NyaXB0UmVjb3JkJiBvcGVyYXRvcj0oY29uc3QgVFNjcmlwdFJlY29yZCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRTY3JpcHRMaXN0IHsKLSAgICAgICAgVFRfdWludDE2X3QgU2NyaXB0Q291bnQ7Ci0gICAgICAgIHN0cnVjdCBUU2NyaXB0UmVjb3JkICpTY3JpcHRSZWNvcmQ7Ci0gICAgICAgIFRTY3JpcHRMaXN0KCk6IFNjcmlwdENvdW50KDApLCBTY3JpcHRSZWNvcmQoTlVMTCkge30KLSAgICAgICAgflRTY3JpcHRMaXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoU2NyaXB0UmVjb3JkKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlW10gU2NyaXB0UmVjb3JkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVFNjcmlwdExpc3QoY29uc3QgVFNjcmlwdExpc3QmKTsKLSAgICAgICAgVFNjcmlwdExpc3QmIG9wZXJhdG9yPShjb25zdCBUU2NyaXB0TGlzdCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRGZWF0dXJlIHsKLSAgICAgICAgVFRfdWludDE2X3QgRmVhdHVyZVBhcmFtczsKLSAgICAgICAgaW50IExvb2t1cENvdW50OwotICAgICAgICBUVF91aW50MTZfdCAqTG9va3VwTGlzdEluZGV4OwotICAgICAgICBURmVhdHVyZSgpOiBGZWF0dXJlUGFyYW1zKDApLCBMb29rdXBDb3VudCgwKSwgTG9va3VwTGlzdEluZGV4KE5VTEwpIHt9Ci0gICAgICAgIH5URmVhdHVyZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKExvb2t1cExpc3RJbmRleCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIExvb2t1cExpc3RJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRGZWF0dXJlKGNvbnN0IFRGZWF0dXJlJik7Ci0gICAgICAgIFRGZWF0dXJlJiBvcGVyYXRvcj0oY29uc3QgVEZlYXR1cmUmKTsKLSAgICB9OwotICAgIHN0cnVjdCBURmVhdHVyZVJlY29yZCB7Ci0gICAgICAgIFRUX3VpbnQzMl90IEZlYXR1cmVUYWc7Ci0gICAgICAgIHN0cnVjdCBURmVhdHVyZSBGZWF0dXJlOwotICAgICAgICBURmVhdHVyZVJlY29yZCgpOiBGZWF0dXJlVGFnKDApIHt9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVEZlYXR1cmVSZWNvcmQoY29uc3QgVEZlYXR1cmVSZWNvcmQmKTsKLSAgICAgICAgVEZlYXR1cmVSZWNvcmQmIG9wZXJhdG9yPShjb25zdCBURmVhdHVyZVJlY29yZCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRGZWF0dXJlTGlzdCB7Ci0gICAgICAgIGludCBGZWF0dXJlQ291bnQ7Ci0gICAgICAgIHN0cnVjdCBURmVhdHVyZVJlY29yZCAqRmVhdHVyZVJlY29yZDsKLSAgICAgICAgVEZlYXR1cmVMaXN0KCk6IEZlYXR1cmVDb3VudCgwKSwgRmVhdHVyZVJlY29yZChOVUxMKSB7fQotICAgICAgICB+VEZlYXR1cmVMaXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoRmVhdHVyZVJlY29yZCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIEZlYXR1cmVSZWNvcmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICBwcml2YXRlOgotICAgICAgICBURmVhdHVyZUxpc3QoY29uc3QgVEZlYXR1cmVMaXN0Jik7Ci0gICAgICAgIFRGZWF0dXJlTGlzdCYgb3BlcmF0b3I9KGNvbnN0IFRGZWF0dXJlTGlzdCYpOwotICAgIH07Ci0gICAgZW51bSBUTG9va3VwRmxhZyB7Ci0gICAgICAgIExPT0tVUEZMQUdfUmlnaHRUb0xlZnQgPSAweDAwMDEsCi0gICAgICAgIExPT0tVUEZMQUdfSWdub3JlQmFzZUdseXBocyA9IDB4MDAwMiwKLSAgICAgICAgTE9PS1VQRkxBR19JZ25vcmVMaWdhdHVyZXMgPSAweDAwMDQsCi0gICAgICAgIExPT0tVUEZMQUdfSWdub3JlTWFya3MgPSAweDAwMDgsCi0gICAgICAgIExPT0tVUEZMQUdfUmVzZXJ2ZWQgPSAweDAwRjAsCi0gICAgICAgIExPT0tVUEZMQUdfTWFya0F0dGFjaG1lbnRUeXBlID0gMHhGRjAwLAotICAgIH07Ci0gICAgc3RydWN0IFRDb3ZlcmFnZUZvcm1hdEJhc2UgewotICAgICAgICBUVF91aW50MTZfdCBDb3ZlcmFnZUZvcm1hdDsKLSAgICAgICAgQ0ZYX0dseXBoTWFwIG1fZ2x5cGhNYXA7Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdEJhc2UoKTogQ292ZXJhZ2VGb3JtYXQoMCkge30KLSAgICAgICAgdmlydHVhbCB+VENvdmVyYWdlRm9ybWF0QmFzZSgpIHt9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVENvdmVyYWdlRm9ybWF0QmFzZShjb25zdCBUQ292ZXJhZ2VGb3JtYXRCYXNlJik7Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdEJhc2UmIG9wZXJhdG9yPShjb25zdCBUQ292ZXJhZ2VGb3JtYXRCYXNlJik7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVENvdmVyYWdlRm9ybWF0MTogcHVibGljIFRDb3ZlcmFnZUZvcm1hdEJhc2UgewotICAgICAgICBUVF91aW50MTZfdCBHbHlwaENvdW50OwotICAgICAgICBUVF91aW50MTZfdCAqR2x5cGhBcnJheTsKLSAgICAgICAgVENvdmVyYWdlRm9ybWF0MSgpOiBHbHlwaENvdW50KDApLCBHbHlwaEFycmF5KE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvdmVyYWdlRm9ybWF0ID0gMTsKLSAgICAgICAgfQotICAgICAgICB+VENvdmVyYWdlRm9ybWF0MSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEdseXBoQXJyYXkpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBHbHlwaEFycmF5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVENvdmVyYWdlRm9ybWF0MShjb25zdCBUQ292ZXJhZ2VGb3JtYXQxJik7Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdDEmIG9wZXJhdG9yPShjb25zdCBUQ292ZXJhZ2VGb3JtYXQxJik7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVFJhbmdlUmVjb3JkIHsKLSAgICAgICAgVFRfdWludDE2X3QgU3RhcnQ7Ci0gICAgICAgIFRUX3VpbnQxNl90IEVuZDsKLSAgICAgICAgVFRfdWludDE2X3QgU3RhcnRDb3ZlcmFnZUluZGV4OwotICAgICAgICBUUmFuZ2VSZWNvcmQoKTogU3RhcnQoMCksIEVuZCgwKSwgU3RhcnRDb3ZlcmFnZUluZGV4KDApIHt9Ci0gICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID4gKGNvbnN0IFRSYW5nZVJlY29yZCAmcjEsIGNvbnN0IFRSYW5nZVJlY29yZCAmcjIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByMS5TdGFydCA+IHIyLlN0YXJ0OwotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVFJhbmdlUmVjb3JkKGNvbnN0IFRSYW5nZVJlY29yZCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRDb3ZlcmFnZUZvcm1hdDI6IHB1YmxpYyBUQ292ZXJhZ2VGb3JtYXRCYXNlIHsKLSAgICAgICAgVFRfdWludDE2X3QgUmFuZ2VDb3VudDsKLSAgICAgICAgc3RydWN0IFRSYW5nZVJlY29yZCAqUmFuZ2VSZWNvcmQ7Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdDIoKTogUmFuZ2VDb3VudCgwKSwgUmFuZ2VSZWNvcmQoTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgQ292ZXJhZ2VGb3JtYXQgPSAyOwotICAgICAgICB9Ci0gICAgICAgIH5UQ292ZXJhZ2VGb3JtYXQyKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoUmFuZ2VSZWNvcmQpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBSYW5nZVJlY29yZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdDIoY29uc3QgVENvdmVyYWdlRm9ybWF0MiYpOwotICAgICAgICBUQ292ZXJhZ2VGb3JtYXQyJiBvcGVyYXRvcj0oY29uc3QgVENvdmVyYWdlRm9ybWF0MiYpOwotICAgIH07Ci0gICAgc3RydWN0IFRDbGFzc0RlZkZvcm1hdEJhc2UgewotICAgICAgICBUVF91aW50MTZfdCBDbGFzc0Zvcm1hdDsKLSAgICAgICAgVENsYXNzRGVmRm9ybWF0QmFzZSgpOiBDbGFzc0Zvcm1hdCgwKSB7fQotICAgICAgICB2aXJ0dWFsIH5UQ2xhc3NEZWZGb3JtYXRCYXNlKCkge30KLSAgICBwcml2YXRlOgotICAgICAgICBUQ2xhc3NEZWZGb3JtYXRCYXNlKGNvbnN0IFRDbGFzc0RlZkZvcm1hdEJhc2UmKTsKLSAgICAgICAgVENsYXNzRGVmRm9ybWF0QmFzZSYgb3BlcmF0b3I9KGNvbnN0IFRDbGFzc0RlZkZvcm1hdEJhc2UmKTsKLSAgICB9OwotICAgIHN0cnVjdCBUQ2xhc3NEZWZGb3JtYXQxOiBwdWJsaWMgVENsYXNzRGVmRm9ybWF0QmFzZSB7Ci0gICAgICAgIFRUX3VpbnQxNl90IFN0YXJ0R2x5cGg7Ci0gICAgICAgIFRUX3VpbnQxNl90IEdseXBoQ291bnQ7Ci0gICAgICAgIFRUX3VpbnQxNl90ICpDbGFzc1ZhbHVlQXJyYXk7Ci0gICAgICAgIFRDbGFzc0RlZkZvcm1hdDEoKTogU3RhcnRHbHlwaCgwKSwgR2x5cGhDb3VudCgwKSwgQ2xhc3NWYWx1ZUFycmF5KE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzRm9ybWF0ID0gMTsKLSAgICAgICAgfQotICAgICAgICB+VENsYXNzRGVmRm9ybWF0MSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKENsYXNzVmFsdWVBcnJheSkgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIENsYXNzVmFsdWVBcnJheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRDbGFzc0RlZkZvcm1hdDEoY29uc3QgVENsYXNzRGVmRm9ybWF0MSYpOwotICAgICAgICBUQ2xhc3NEZWZGb3JtYXQxJiBvcGVyYXRvcj0oY29uc3QgVENsYXNzRGVmRm9ybWF0MSYpOwotICAgIH07Ci0gICAgc3RydWN0IFRDbGFzc1JhbmdlUmVjb3JkIHsKLSAgICAgICAgVFRfdWludDE2X3QgU3RhcnQ7Ci0gICAgICAgIFRUX3VpbnQxNl90IEVuZDsKLSAgICAgICAgVFRfdWludDE2X3QgQ2xhc3M7Ci0gICAgICAgIFRDbGFzc1JhbmdlUmVjb3JkKCk6IFN0YXJ0KDApLCBFbmQoMCksIENsYXNzKDApIHt9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVENsYXNzUmFuZ2VSZWNvcmQoY29uc3QgVENsYXNzUmFuZ2VSZWNvcmQmKTsKLSAgICAgICAgVENsYXNzUmFuZ2VSZWNvcmQmIG9wZXJhdG9yPShjb25zdCBUQ2xhc3NSYW5nZVJlY29yZCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRDbGFzc0RlZkZvcm1hdDI6IHB1YmxpYyBUQ2xhc3NEZWZGb3JtYXRCYXNlIHsKLSAgICAgICAgVFRfdWludDE2X3QgQ2xhc3NSYW5nZUNvdW50OwotICAgICAgICBzdHJ1Y3QgVENsYXNzUmFuZ2VSZWNvcmQgKkNsYXNzUmFuZ2VSZWNvcmQ7Ci0gICAgICAgIFRDbGFzc0RlZkZvcm1hdDIoKTogQ2xhc3NSYW5nZUNvdW50KDApLCBDbGFzc1JhbmdlUmVjb3JkKE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzRm9ybWF0ID0gMjsKLSAgICAgICAgfQotICAgICAgICB+VENsYXNzRGVmRm9ybWF0MigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKENsYXNzUmFuZ2VSZWNvcmQpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBDbGFzc1JhbmdlUmVjb3JkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVENsYXNzRGVmRm9ybWF0Mihjb25zdCBUQ2xhc3NEZWZGb3JtYXQyJik7Ci0gICAgICAgIFRDbGFzc0RlZkZvcm1hdDImIG9wZXJhdG9yPShjb25zdCBUQ2xhc3NEZWZGb3JtYXQyJik7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVERldmljZSB7Ci0gICAgICAgIFRUX3VpbnQxNl90IFN0YXJ0U2l6ZTsKLSAgICAgICAgVFRfdWludDE2X3QgRW5kU2l6ZTsKLSAgICAgICAgVFRfdWludDE2X3QgRGVsdGFGb3JtYXQ7Ci0gICAgICAgIFREZXZpY2UoKTogU3RhcnRTaXplKDApLCBFbmRTaXplKDApLCBEZWx0YUZvcm1hdCgwKSB7fQotICAgIHByaXZhdGU6Ci0gICAgICAgIFREZXZpY2UoY29uc3QgVERldmljZSYpOwotICAgICAgICBURGV2aWNlJiBvcGVyYXRvcj0oY29uc3QgVERldmljZSYpOwotICAgIH07Ci0gICAgc3RydWN0IFRTdWJUYWJsZUJhc2UgewotICAgICAgICBUVF91aW50MTZfdCBTdWJzdEZvcm1hdDsKLSAgICAgICAgVFN1YlRhYmxlQmFzZSgpOiBTdWJzdEZvcm1hdCgwKSB7fQotICAgICAgICB2aXJ0dWFsIH5UU3ViVGFibGVCYXNlKCkge30KLSAgICBwcml2YXRlOgotICAgICAgICBUU3ViVGFibGVCYXNlKGNvbnN0IFRTdWJUYWJsZUJhc2UmKTsKLSAgICAgICAgVFN1YlRhYmxlQmFzZSYgb3BlcmF0b3I9KGNvbnN0IFRTdWJUYWJsZUJhc2UmKTsKLSAgICB9OwotICAgIHN0cnVjdCBUU2luZ2xlU3Vic3RGb3JtYXQxOiBwdWJsaWMgVFN1YlRhYmxlQmFzZSB7Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdEJhc2UgKkNvdmVyYWdlOwotICAgICAgICBUVF9pbnQxNl90IERlbHRhR2x5cGhJRDsKLSAgICAgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MSgpOiBDb3ZlcmFnZShOVUxMKSwgRGVsdGFHbHlwaElEKDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1YnN0Rm9ybWF0ID0gMTsKLSAgICAgICAgfQotICAgICAgICB+VFNpbmdsZVN1YnN0Rm9ybWF0MSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGV0ZSBDb3ZlcmFnZTsKLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRTaW5nbGVTdWJzdEZvcm1hdDEoY29uc3QgVFNpbmdsZVN1YnN0Rm9ybWF0MSYpOwotICAgICAgICBUU2luZ2xlU3Vic3RGb3JtYXQxJiBvcGVyYXRvcj0oY29uc3QgVFNpbmdsZVN1YnN0Rm9ybWF0MSYpOwotICAgIH07Ci0gICAgc3RydWN0IFRTaW5nbGVTdWJzdEZvcm1hdDI6IHB1YmxpYyBUU3ViVGFibGVCYXNlIHsKLSAgICAgICAgVENvdmVyYWdlRm9ybWF0QmFzZSAqQ292ZXJhZ2U7Ci0gICAgICAgIFRUX3VpbnQxNl90IEdseXBoQ291bnQ7Ci0gICAgICAgIFRUX3VpbnQxNl90ICpTdWJzdGl0dXRlOwotICAgICAgICBUU2luZ2xlU3Vic3RGb3JtYXQyKCk6IENvdmVyYWdlKE5VTEwpLCBHbHlwaENvdW50KDApLCBTdWJzdGl0dXRlKE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1YnN0Rm9ybWF0ID0gMjsKLSAgICAgICAgfQotICAgICAgICB+VFNpbmdsZVN1YnN0Rm9ybWF0MigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGV0ZSBDb3ZlcmFnZTsKLSAgICAgICAgICAgIGRlbGV0ZVtdIFN1YnN0aXR1dGU7Ci0gICAgICAgIH0KLSAgICBwcml2YXRlOgotICAgICAgICBUU2luZ2xlU3Vic3RGb3JtYXQyKGNvbnN0IFRTaW5nbGVTdWJzdEZvcm1hdDImKTsKLSAgICAgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MiYgb3BlcmF0b3I9KGNvbnN0IFRTaW5nbGVTdWJzdEZvcm1hdDImKTsKLSAgICB9OwotICAgIHN0cnVjdCBUTG9va3VwIHsKLSAgICAgICAgVFRfdWludDE2X3QgTG9va3VwVHlwZTsKLSAgICAgICAgVFRfdWludDE2X3QgTG9va3VwRmxhZzsKLSAgICAgICAgVFRfdWludDE2X3QgU3ViVGFibGVDb3VudDsKLSAgICAgICAgc3RydWN0IFRTdWJUYWJsZUJhc2UgKipTdWJUYWJsZTsKLSAgICAgICAgVExvb2t1cCgpOiBMb29rdXBUeXBlKDApLCBMb29rdXBGbGFnKDApLCBTdWJUYWJsZUNvdW50KDApLCBTdWJUYWJsZShOVUxMKSB7fQotICAgICAgICB+VExvb2t1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFN1YlRhYmxlQ291bnQgPiAwICYmIFN1YlRhYmxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgU3ViVGFibGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTdWJUYWJsZVtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVsZXRlW10gU3ViVGFibGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICBwcml2YXRlOgotICAgICAgICBUTG9va3VwKGNvbnN0IFRMb29rdXAmKTsKLSAgICAgICAgVExvb2t1cCYgb3BlcmF0b3I9KGNvbnN0IFRMb29rdXAmKTsKLSAgICB9OwotICAgIHN0cnVjdCBUTG9va3VwTGlzdCB7Ci0gICAgICAgIGludCBMb29rdXBDb3VudDsKLSAgICAgICAgc3RydWN0IFRMb29rdXAgKkxvb2t1cDsKLSAgICAgICAgVExvb2t1cExpc3QoKTogTG9va3VwQ291bnQoMCksIExvb2t1cChOVUxMKSB7fQotICAgICAgICB+VExvb2t1cExpc3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihMb29rdXApIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBMb29rdXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICBwcml2YXRlOgotICAgICAgICBUTG9va3VwTGlzdChjb25zdCBUTG9va3VwTGlzdCYpOwotICAgICAgICBUTG9va3VwTGlzdCYgb3BlcmF0b3I9KGNvbnN0IFRMb29rdXBMaXN0Jik7Ci0gICAgfTsKLSAgICBib29sIFBhcnNlKAotICAgICAgICBGVF9CeXRlcyBzY3JpcHRsaXN0LAotICAgICAgICBGVF9CeXRlcyBmZWF0dXJlbGlzdCwKLSAgICAgICAgRlRfQnl0ZXMgbG9va3VwbGlzdCk7Ci0gICAgdm9pZCBQYXJzZVNjcmlwdExpc3QoRlRfQnl0ZXMgcmF3LCBUU2NyaXB0TGlzdCAqcmVjKTsKLSAgICB2b2lkIFBhcnNlU2NyaXB0KEZUX0J5dGVzIHJhdywgVFNjcmlwdCAqcmVjKTsKLSAgICB2b2lkIFBhcnNlTGFuZ1N5cyhGVF9CeXRlcyByYXcsIFRMYW5nU3lzICpyZWMpOwotICAgIHZvaWQgUGFyc2VGZWF0dXJlTGlzdChGVF9CeXRlcyByYXcsIFRGZWF0dXJlTGlzdCAqcmVjKTsKLSAgICB2b2lkIFBhcnNlRmVhdHVyZShGVF9CeXRlcyByYXcsIFRGZWF0dXJlICpyZWMpOwotICAgIHZvaWQgUGFyc2VMb29rdXBMaXN0KEZUX0J5dGVzIHJhdywgVExvb2t1cExpc3QgKnJlYyk7Ci0gICAgdm9pZCBQYXJzZUxvb2t1cChGVF9CeXRlcyByYXcsIFRMb29rdXAgKnJlYyk7Ci0gICAgdm9pZCBQYXJzZUNvdmVyYWdlKEZUX0J5dGVzIHJhdywgVENvdmVyYWdlRm9ybWF0QmFzZSAqKnJlYyk7Ci0gICAgdm9pZCBQYXJzZUNvdmVyYWdlRm9ybWF0MShGVF9CeXRlcyByYXcsIFRDb3ZlcmFnZUZvcm1hdDEgKnJlYyk7Ci0gICAgdm9pZCBQYXJzZUNvdmVyYWdlRm9ybWF0MihGVF9CeXRlcyByYXcsIFRDb3ZlcmFnZUZvcm1hdDIgKnJlYyk7Ci0gICAgdm9pZCBQYXJzZVNpbmdsZVN1YnN0KEZUX0J5dGVzIHJhdywgVFN1YlRhYmxlQmFzZSAqKnJlYyk7Ci0gICAgdm9pZCBQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MShGVF9CeXRlcyByYXcsIFRTaW5nbGVTdWJzdEZvcm1hdDEgKnJlYyk7Ci0gICAgdm9pZCBQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MihGVF9CeXRlcyByYXcsIFRTaW5nbGVTdWJzdEZvcm1hdDIgKnJlYyk7Ci0gICAgYm9vbCBHZXRWZXJ0aWNhbEdseXBoU3ViKAotICAgICAgICBUVF91aW50MzJfdCBnbHlwaG51bSwKLSAgICAgICAgVFRfdWludDMyX3QgKnZnbHlwaG51bSwKLSAgICAgICAgc3RydWN0IFRGZWF0dXJlICpGZWF0dXJlKTsKLSAgICBib29sIEdldFZlcnRpY2FsR2x5cGhTdWIyKAotICAgICAgICBUVF91aW50MzJfdCBnbHlwaG51bSwKLSAgICAgICAgVFRfdWludDMyX3QgKnZnbHlwaG51bSwKLSAgICAgICAgc3RydWN0IFRMb29rdXAgKkxvb2t1cCk7Ci0gICAgaW50IEdldENvdmVyYWdlSW5kZXgoc3RydWN0IFRDb3ZlcmFnZUZvcm1hdEJhc2UgKkNvdmVyYWdlLCBUVF91aW50MzJfdCBnKTsKLSAgICBUVF91aW50OF90IEdldFVJbnQ4KEZUX0J5dGVzJiBwKSBjb25zdAotICAgIHsKLSAgICAgICAgVFRfdWludDhfdCByZXQgPSBwWzBdOwotICAgICAgICBwICs9IDE7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIFRUX2ludDE2X3QgR2V0SW50MTYoRlRfQnl0ZXMmIHApIGNvbnN0Ci0gICAgewotICAgICAgICBUVF91aW50MTZfdCByZXQgPSBwWzBdIDw8IDggfCBwWzFdOwotICAgICAgICBwICs9IDI7Ci0gICAgICAgIHJldHVybiAqKFRUX2ludDE2X3QqKSZyZXQ7Ci0gICAgfQotICAgIFRUX3VpbnQxNl90IEdldFVJbnQxNihGVF9CeXRlcyYgcCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFRUX3VpbnQxNl90IHJldCA9IHBbMF0gPDwgOCB8IHBbMV07Ci0gICAgICAgIHAgKz0gMjsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgVFRfaW50MzJfdCBHZXRJbnQzMihGVF9CeXRlcyYgcCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFRUX3VpbnQzMl90IHJldCA9IHBbMF0gPDwgMjQgfCBwWzFdIDw8IDE2IHwgcFsyXSA8PCA4IHwgcFszXTsKLSAgICAgICAgcCArPSA0OwotICAgICAgICByZXR1cm4gKihUVF9pbnQzMl90KikmcmV0OwotICAgIH0KLSAgICBUVF91aW50MzJfdCBHZXRVSW50MzIoRlRfQnl0ZXMmIHApIGNvbnN0Ci0gICAgewotICAgICAgICBUVF91aW50MzJfdCByZXQgPSBwWzBdIDw8IDI0IHwgcFsxXSA8PCAxNiB8IHBbMl0gPDwgOCB8IHBbM107Ci0gICAgICAgIHAgKz0gNDsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgQ0ZYX0NNYXBEV29yZFRvRFdvcmQgbV9mZWF0dXJlTWFwOwotICAgIEZYX0JPT0wJbV9iRmVhdXR1cmVNYXBMb2FkOwotICAgIGJvb2wgbG9hZGVkOwotICAgIHN0cnVjdCB0dF9nc3ViX2hlYWRlciBoZWFkZXI7Ci0gICAgc3RydWN0IFRTY3JpcHRMaXN0IFNjcmlwdExpc3Q7Ci0gICAgc3RydWN0IFRGZWF0dXJlTGlzdCBGZWF0dXJlTGlzdDsKLSAgICBzdHJ1Y3QgVExvb2t1cExpc3QgTG9va3VwTGlzdDsKLX07Ci1jbGFzcyBDRlhfR1NVQlRhYmxlIGZpbmFsIDogcHVibGljIElGWF9HU1VCVGFibGUKLXsKLXB1YmxpYzoKLSAgICB+Q0ZYX0dTVUJUYWJsZSgpIG92ZXJyaWRlIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MIEdldFZlcnRpY2FsR2x5cGgoRlhfRFdPUkQgZ2x5cGhudW0sIEZYX0RXT1JEKiB2Z2x5cGhudW0pIG92ZXJyaWRlOworY2xhc3MgQ0ZYX0dseXBoTWFwIHsKKyBwdWJsaWM6CisgIENGWF9HbHlwaE1hcCgpOworICB+Q0ZYX0dseXBoTWFwKCk7CisgIHZvaWQgU2V0QXQoaW50IGtleSwgaW50IHZhbHVlKTsKKyAgRlhfQk9PTCBMb29rdXAoaW50IGtleSwgaW50JiB2YWx1ZSk7CiAKLSAgICBDRlhfQ1RUR1NVQlRhYmxlIG1fR3N1YkltcDsKKyBwcm90ZWN0ZWQ6CisgIENGWF9CaW5hcnlCdWYgbV9CdWZmZXI7Cit9OworY2xhc3MgQ0ZYX0NUVEdTVUJUYWJsZSB7CisgcHVibGljOgorICBDRlhfQ1RUR1NVQlRhYmxlKHZvaWQpIDogbV9iRmVhdXR1cmVNYXBMb2FkKEZBTFNFKSwgbG9hZGVkKGZhbHNlKXt9OworICBDRlhfQ1RUR1NVQlRhYmxlKEZUX0J5dGVzIGdzdWIpIDogbV9iRmVhdXR1cmVNYXBMb2FkKEZBTFNFKSwgbG9hZGVkKGZhbHNlKSB7CisgICAgTG9hZEdTVUJUYWJsZShnc3ViKTsKKyAgfQorICB2aXJ0dWFsIH5DRlhfQ1RUR1NVQlRhYmxlKCkge30KKyAgYm9vbCBJc09rKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGxvYWRlZDsgfQorICBib29sIExvYWRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1Yik7CisgIGJvb2wgR2V0VmVydGljYWxHbHlwaChUVF91aW50MzJfdCBnbHlwaG51bSwgVFRfdWludDMyX3QqIHZnbHlwaG51bSk7CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgdHRfZ3N1Yl9oZWFkZXIgeworICAgIFRUX3VpbnQzMl90IFZlcnNpb247CisgICAgVFRfdWludDE2X3QgU2NyaXB0TGlzdDsKKyAgICBUVF91aW50MTZfdCBGZWF0dXJlTGlzdDsKKyAgICBUVF91aW50MTZfdCBMb29rdXBMaXN0OworICB9OworICBzdHJ1Y3QgVExhbmdTeXMgeworICAgIFRUX3VpbnQxNl90IExvb2t1cE9yZGVyOworICAgIFRUX3VpbnQxNl90IFJlcUZlYXR1cmVJbmRleDsKKyAgICBUVF91aW50MTZfdCBGZWF0dXJlQ291bnQ7CisgICAgVFRfdWludDE2X3QqIEZlYXR1cmVJbmRleDsKKyAgICBUTGFuZ1N5cygpCisgICAgICAgIDogTG9va3VwT3JkZXIoMCksCisgICAgICAgICAgUmVxRmVhdHVyZUluZGV4KDApLAorICAgICAgICAgIEZlYXR1cmVDb3VudCgwKSwKKyAgICAgICAgICBGZWF0dXJlSW5kZXgoTlVMTCkge30KKyAgICB+VExhbmdTeXMoKSB7CisgICAgICBpZiAoRmVhdHVyZUluZGV4KSB7CisgICAgICAgIGRlbGV0ZVtdIEZlYXR1cmVJbmRleDsKKyAgICAgIH0KKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgVExhbmdTeXMoY29uc3QgVExhbmdTeXMmKTsKKyAgICBUTGFuZ1N5cyYgb3BlcmF0b3I9KGNvbnN0IFRMYW5nU3lzJik7CisgIH07CisgIHN0cnVjdCBUTGFuZ1N5c1JlY29yZCB7CisgICAgVFRfdWludDMyX3QgTGFuZ1N5c1RhZzsKKyAgICBzdHJ1Y3QgVExhbmdTeXMgTGFuZ1N5czsKKyAgICBUTGFuZ1N5c1JlY29yZCgpIDogTGFuZ1N5c1RhZygwKSB7fQorCisgICBwcml2YXRlOgorICAgIFRMYW5nU3lzUmVjb3JkKGNvbnN0IFRMYW5nU3lzUmVjb3JkJik7CisgICAgVExhbmdTeXNSZWNvcmQmIG9wZXJhdG9yPShjb25zdCBUTGFuZ1N5c1JlY29yZCYpOworICB9OworICBzdHJ1Y3QgVFNjcmlwdCB7CisgICAgVFRfdWludDE2X3QgRGVmYXVsdExhbmdTeXM7CisgICAgVFRfdWludDE2X3QgTGFuZ1N5c0NvdW50OworICAgIHN0cnVjdCBUTGFuZ1N5c1JlY29yZCogTGFuZ1N5c1JlY29yZDsKKyAgICBUU2NyaXB0KCkgOiBEZWZhdWx0TGFuZ1N5cygwKSwgTGFuZ1N5c0NvdW50KDApLCBMYW5nU3lzUmVjb3JkKE5VTEwpIHt9CisgICAgflRTY3JpcHQoKSB7CisgICAgICBpZiAoTGFuZ1N5c1JlY29yZCkgeworICAgICAgICBkZWxldGVbXSBMYW5nU3lzUmVjb3JkOworICAgICAgfQorICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBUU2NyaXB0KGNvbnN0IFRTY3JpcHQmKTsKKyAgICBUU2NyaXB0JiBvcGVyYXRvcj0oY29uc3QgVFNjcmlwdCYpOworICB9OworICBzdHJ1Y3QgVFNjcmlwdFJlY29yZCB7CisgICAgVFRfdWludDMyX3QgU2NyaXB0VGFnOworICAgIHN0cnVjdCBUU2NyaXB0IFNjcmlwdDsKKyAgICBUU2NyaXB0UmVjb3JkKCkgOiBTY3JpcHRUYWcoMCkge30KKworICAgcHJpdmF0ZToKKyAgICBUU2NyaXB0UmVjb3JkKGNvbnN0IFRTY3JpcHRSZWNvcmQmKTsKKyAgICBUU2NyaXB0UmVjb3JkJiBvcGVyYXRvcj0oY29uc3QgVFNjcmlwdFJlY29yZCYpOworICB9OworICBzdHJ1Y3QgVFNjcmlwdExpc3QgeworICAgIFRUX3VpbnQxNl90IFNjcmlwdENvdW50OworICAgIHN0cnVjdCBUU2NyaXB0UmVjb3JkKiBTY3JpcHRSZWNvcmQ7CisgICAgVFNjcmlwdExpc3QoKSA6IFNjcmlwdENvdW50KDApLCBTY3JpcHRSZWNvcmQoTlVMTCkge30KKyAgICB+VFNjcmlwdExpc3QoKSB7CisgICAgICBpZiAoU2NyaXB0UmVjb3JkKSB7CisgICAgICAgIGRlbGV0ZVtdIFNjcmlwdFJlY29yZDsKKyAgICAgIH0KKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgVFNjcmlwdExpc3QoY29uc3QgVFNjcmlwdExpc3QmKTsKKyAgICBUU2NyaXB0TGlzdCYgb3BlcmF0b3I9KGNvbnN0IFRTY3JpcHRMaXN0Jik7CisgIH07CisgIHN0cnVjdCBURmVhdHVyZSB7CisgICAgVFRfdWludDE2X3QgRmVhdHVyZVBhcmFtczsKKyAgICBpbnQgTG9va3VwQ291bnQ7CisgICAgVFRfdWludDE2X3QqIExvb2t1cExpc3RJbmRleDsKKyAgICBURmVhdHVyZSgpIDogRmVhdHVyZVBhcmFtcygwKSwgTG9va3VwQ291bnQoMCksIExvb2t1cExpc3RJbmRleChOVUxMKSB7fQorICAgIH5URmVhdHVyZSgpIHsKKyAgICAgIGlmIChMb29rdXBMaXN0SW5kZXgpIHsKKyAgICAgICAgZGVsZXRlW10gTG9va3VwTGlzdEluZGV4OworICAgICAgfQorICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBURmVhdHVyZShjb25zdCBURmVhdHVyZSYpOworICAgIFRGZWF0dXJlJiBvcGVyYXRvcj0oY29uc3QgVEZlYXR1cmUmKTsKKyAgfTsKKyAgc3RydWN0IFRGZWF0dXJlUmVjb3JkIHsKKyAgICBUVF91aW50MzJfdCBGZWF0dXJlVGFnOworICAgIHN0cnVjdCBURmVhdHVyZSBGZWF0dXJlOworICAgIFRGZWF0dXJlUmVjb3JkKCkgOiBGZWF0dXJlVGFnKDApIHt9CisKKyAgIHByaXZhdGU6CisgICAgVEZlYXR1cmVSZWNvcmQoY29uc3QgVEZlYXR1cmVSZWNvcmQmKTsKKyAgICBURmVhdHVyZVJlY29yZCYgb3BlcmF0b3I9KGNvbnN0IFRGZWF0dXJlUmVjb3JkJik7CisgIH07CisgIHN0cnVjdCBURmVhdHVyZUxpc3QgeworICAgIGludCBGZWF0dXJlQ291bnQ7CisgICAgc3RydWN0IFRGZWF0dXJlUmVjb3JkKiBGZWF0dXJlUmVjb3JkOworICAgIFRGZWF0dXJlTGlzdCgpIDogRmVhdHVyZUNvdW50KDApLCBGZWF0dXJlUmVjb3JkKE5VTEwpIHt9CisgICAgflRGZWF0dXJlTGlzdCgpIHsKKyAgICAgIGlmIChGZWF0dXJlUmVjb3JkKSB7CisgICAgICAgIGRlbGV0ZVtdIEZlYXR1cmVSZWNvcmQ7CisgICAgICB9CisgICAgfQorCisgICBwcml2YXRlOgorICAgIFRGZWF0dXJlTGlzdChjb25zdCBURmVhdHVyZUxpc3QmKTsKKyAgICBURmVhdHVyZUxpc3QmIG9wZXJhdG9yPShjb25zdCBURmVhdHVyZUxpc3QmKTsKKyAgfTsKKyAgZW51bSBUTG9va3VwRmxhZyB7CisgICAgTE9PS1VQRkxBR19SaWdodFRvTGVmdCA9IDB4MDAwMSwKKyAgICBMT09LVVBGTEFHX0lnbm9yZUJhc2VHbHlwaHMgPSAweDAwMDIsCisgICAgTE9PS1VQRkxBR19JZ25vcmVMaWdhdHVyZXMgPSAweDAwMDQsCisgICAgTE9PS1VQRkxBR19JZ25vcmVNYXJrcyA9IDB4MDAwOCwKKyAgICBMT09LVVBGTEFHX1Jlc2VydmVkID0gMHgwMEYwLAorICAgIExPT0tVUEZMQUdfTWFya0F0dGFjaG1lbnRUeXBlID0gMHhGRjAwLAorICB9OworICBzdHJ1Y3QgVENvdmVyYWdlRm9ybWF0QmFzZSB7CisgICAgVFRfdWludDE2X3QgQ292ZXJhZ2VGb3JtYXQ7CisgICAgQ0ZYX0dseXBoTWFwIG1fZ2x5cGhNYXA7CisgICAgVENvdmVyYWdlRm9ybWF0QmFzZSgpIDogQ292ZXJhZ2VGb3JtYXQoMCkge30KKyAgICB2aXJ0dWFsIH5UQ292ZXJhZ2VGb3JtYXRCYXNlKCkge30KKworICAgcHJpdmF0ZToKKyAgICBUQ292ZXJhZ2VGb3JtYXRCYXNlKGNvbnN0IFRDb3ZlcmFnZUZvcm1hdEJhc2UmKTsKKyAgICBUQ292ZXJhZ2VGb3JtYXRCYXNlJiBvcGVyYXRvcj0oY29uc3QgVENvdmVyYWdlRm9ybWF0QmFzZSYpOworICB9OworICBzdHJ1Y3QgVENvdmVyYWdlRm9ybWF0MSA6IHB1YmxpYyBUQ292ZXJhZ2VGb3JtYXRCYXNlIHsKKyAgICBUVF91aW50MTZfdCBHbHlwaENvdW50OworICAgIFRUX3VpbnQxNl90KiBHbHlwaEFycmF5OworICAgIFRDb3ZlcmFnZUZvcm1hdDEoKSA6IEdseXBoQ291bnQoMCksIEdseXBoQXJyYXkoTlVMTCkgeyBDb3ZlcmFnZUZvcm1hdCA9IDE7IH0KKyAgICB+VENvdmVyYWdlRm9ybWF0MSgpIHsKKyAgICAgIGlmIChHbHlwaEFycmF5KSB7CisgICAgICAgIGRlbGV0ZVtdIEdseXBoQXJyYXk7CisgICAgICB9CisgICAgfQorCisgICBwcml2YXRlOgorICAgIFRDb3ZlcmFnZUZvcm1hdDEoY29uc3QgVENvdmVyYWdlRm9ybWF0MSYpOworICAgIFRDb3ZlcmFnZUZvcm1hdDEmIG9wZXJhdG9yPShjb25zdCBUQ292ZXJhZ2VGb3JtYXQxJik7CisgIH07CisgIHN0cnVjdCBUUmFuZ2VSZWNvcmQgeworICAgIFRUX3VpbnQxNl90IFN0YXJ0OworICAgIFRUX3VpbnQxNl90IEVuZDsKKyAgICBUVF91aW50MTZfdCBTdGFydENvdmVyYWdlSW5kZXg7CisgICAgVFJhbmdlUmVjb3JkKCkgOiBTdGFydCgwKSwgRW5kKDApLCBTdGFydENvdmVyYWdlSW5kZXgoMCkge30KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgVFJhbmdlUmVjb3JkJiByMSwgY29uc3QgVFJhbmdlUmVjb3JkJiByMikgeworICAgICAgcmV0dXJuIHIxLlN0YXJ0ID4gcjIuU3RhcnQ7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIFRSYW5nZVJlY29yZChjb25zdCBUUmFuZ2VSZWNvcmQmKTsKKyAgfTsKKyAgc3RydWN0IFRDb3ZlcmFnZUZvcm1hdDIgOiBwdWJsaWMgVENvdmVyYWdlRm9ybWF0QmFzZSB7CisgICAgVFRfdWludDE2X3QgUmFuZ2VDb3VudDsKKyAgICBzdHJ1Y3QgVFJhbmdlUmVjb3JkKiBSYW5nZVJlY29yZDsKKyAgICBUQ292ZXJhZ2VGb3JtYXQyKCkgOiBSYW5nZUNvdW50KDApLCBSYW5nZVJlY29yZChOVUxMKSB7CisgICAgICBDb3ZlcmFnZUZvcm1hdCA9IDI7CisgICAgfQorICAgIH5UQ292ZXJhZ2VGb3JtYXQyKCkgeworICAgICAgaWYgKFJhbmdlUmVjb3JkKSB7CisgICAgICAgIGRlbGV0ZVtdIFJhbmdlUmVjb3JkOworICAgICAgfQorICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBUQ292ZXJhZ2VGb3JtYXQyKGNvbnN0IFRDb3ZlcmFnZUZvcm1hdDImKTsKKyAgICBUQ292ZXJhZ2VGb3JtYXQyJiBvcGVyYXRvcj0oY29uc3QgVENvdmVyYWdlRm9ybWF0MiYpOworICB9OworICBzdHJ1Y3QgVENsYXNzRGVmRm9ybWF0QmFzZSB7CisgICAgVFRfdWludDE2X3QgQ2xhc3NGb3JtYXQ7CisgICAgVENsYXNzRGVmRm9ybWF0QmFzZSgpIDogQ2xhc3NGb3JtYXQoMCkge30KKyAgICB2aXJ0dWFsIH5UQ2xhc3NEZWZGb3JtYXRCYXNlKCkge30KKworICAgcHJpdmF0ZToKKyAgICBUQ2xhc3NEZWZGb3JtYXRCYXNlKGNvbnN0IFRDbGFzc0RlZkZvcm1hdEJhc2UmKTsKKyAgICBUQ2xhc3NEZWZGb3JtYXRCYXNlJiBvcGVyYXRvcj0oY29uc3QgVENsYXNzRGVmRm9ybWF0QmFzZSYpOworICB9OworICBzdHJ1Y3QgVENsYXNzRGVmRm9ybWF0MSA6IHB1YmxpYyBUQ2xhc3NEZWZGb3JtYXRCYXNlIHsKKyAgICBUVF91aW50MTZfdCBTdGFydEdseXBoOworICAgIFRUX3VpbnQxNl90IEdseXBoQ291bnQ7CisgICAgVFRfdWludDE2X3QqIENsYXNzVmFsdWVBcnJheTsKKyAgICBUQ2xhc3NEZWZGb3JtYXQxKCkgOiBTdGFydEdseXBoKDApLCBHbHlwaENvdW50KDApLCBDbGFzc1ZhbHVlQXJyYXkoTlVMTCkgeworICAgICAgQ2xhc3NGb3JtYXQgPSAxOworICAgIH0KKyAgICB+VENsYXNzRGVmRm9ybWF0MSgpIHsKKyAgICAgIGlmIChDbGFzc1ZhbHVlQXJyYXkpIHsKKyAgICAgICAgZGVsZXRlW10gQ2xhc3NWYWx1ZUFycmF5OworICAgICAgfQorICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBUQ2xhc3NEZWZGb3JtYXQxKGNvbnN0IFRDbGFzc0RlZkZvcm1hdDEmKTsKKyAgICBUQ2xhc3NEZWZGb3JtYXQxJiBvcGVyYXRvcj0oY29uc3QgVENsYXNzRGVmRm9ybWF0MSYpOworICB9OworICBzdHJ1Y3QgVENsYXNzUmFuZ2VSZWNvcmQgeworICAgIFRUX3VpbnQxNl90IFN0YXJ0OworICAgIFRUX3VpbnQxNl90IEVuZDsKKyAgICBUVF91aW50MTZfdCBDbGFzczsKKyAgICBUQ2xhc3NSYW5nZVJlY29yZCgpIDogU3RhcnQoMCksIEVuZCgwKSwgQ2xhc3MoMCkge30KKworICAgcHJpdmF0ZToKKyAgICBUQ2xhc3NSYW5nZVJlY29yZChjb25zdCBUQ2xhc3NSYW5nZVJlY29yZCYpOworICAgIFRDbGFzc1JhbmdlUmVjb3JkJiBvcGVyYXRvcj0oY29uc3QgVENsYXNzUmFuZ2VSZWNvcmQmKTsKKyAgfTsKKyAgc3RydWN0IFRDbGFzc0RlZkZvcm1hdDIgOiBwdWJsaWMgVENsYXNzRGVmRm9ybWF0QmFzZSB7CisgICAgVFRfdWludDE2X3QgQ2xhc3NSYW5nZUNvdW50OworICAgIHN0cnVjdCBUQ2xhc3NSYW5nZVJlY29yZCogQ2xhc3NSYW5nZVJlY29yZDsKKyAgICBUQ2xhc3NEZWZGb3JtYXQyKCkgOiBDbGFzc1JhbmdlQ291bnQoMCksIENsYXNzUmFuZ2VSZWNvcmQoTlVMTCkgeworICAgICAgQ2xhc3NGb3JtYXQgPSAyOworICAgIH0KKyAgICB+VENsYXNzRGVmRm9ybWF0MigpIHsKKyAgICAgIGlmIChDbGFzc1JhbmdlUmVjb3JkKSB7CisgICAgICAgIGRlbGV0ZVtdIENsYXNzUmFuZ2VSZWNvcmQ7CisgICAgICB9CisgICAgfQorCisgICBwcml2YXRlOgorICAgIFRDbGFzc0RlZkZvcm1hdDIoY29uc3QgVENsYXNzRGVmRm9ybWF0MiYpOworICAgIFRDbGFzc0RlZkZvcm1hdDImIG9wZXJhdG9yPShjb25zdCBUQ2xhc3NEZWZGb3JtYXQyJik7CisgIH07CisgIHN0cnVjdCBURGV2aWNlIHsKKyAgICBUVF91aW50MTZfdCBTdGFydFNpemU7CisgICAgVFRfdWludDE2X3QgRW5kU2l6ZTsKKyAgICBUVF91aW50MTZfdCBEZWx0YUZvcm1hdDsKKyAgICBURGV2aWNlKCkgOiBTdGFydFNpemUoMCksIEVuZFNpemUoMCksIERlbHRhRm9ybWF0KDApIHt9CisKKyAgIHByaXZhdGU6CisgICAgVERldmljZShjb25zdCBURGV2aWNlJik7CisgICAgVERldmljZSYgb3BlcmF0b3I9KGNvbnN0IFREZXZpY2UmKTsKKyAgfTsKKyAgc3RydWN0IFRTdWJUYWJsZUJhc2UgeworICAgIFRUX3VpbnQxNl90IFN1YnN0Rm9ybWF0OworICAgIFRTdWJUYWJsZUJhc2UoKSA6IFN1YnN0Rm9ybWF0KDApIHt9CisgICAgdmlydHVhbCB+VFN1YlRhYmxlQmFzZSgpIHt9CisKKyAgIHByaXZhdGU6CisgICAgVFN1YlRhYmxlQmFzZShjb25zdCBUU3ViVGFibGVCYXNlJik7CisgICAgVFN1YlRhYmxlQmFzZSYgb3BlcmF0b3I9KGNvbnN0IFRTdWJUYWJsZUJhc2UmKTsKKyAgfTsKKyAgc3RydWN0IFRTaW5nbGVTdWJzdEZvcm1hdDEgOiBwdWJsaWMgVFN1YlRhYmxlQmFzZSB7CisgICAgVENvdmVyYWdlRm9ybWF0QmFzZSogQ292ZXJhZ2U7CisgICAgVFRfaW50MTZfdCBEZWx0YUdseXBoSUQ7CisgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MSgpIDogQ292ZXJhZ2UoTlVMTCksIERlbHRhR2x5cGhJRCgwKSB7IFN1YnN0Rm9ybWF0ID0gMTsgfQorICAgIH5UU2luZ2xlU3Vic3RGb3JtYXQxKCkgeyBkZWxldGUgQ292ZXJhZ2U7IH0KKworICAgcHJpdmF0ZToKKyAgICBUU2luZ2xlU3Vic3RGb3JtYXQxKGNvbnN0IFRTaW5nbGVTdWJzdEZvcm1hdDEmKTsKKyAgICBUU2luZ2xlU3Vic3RGb3JtYXQxJiBvcGVyYXRvcj0oY29uc3QgVFNpbmdsZVN1YnN0Rm9ybWF0MSYpOworICB9OworICBzdHJ1Y3QgVFNpbmdsZVN1YnN0Rm9ybWF0MiA6IHB1YmxpYyBUU3ViVGFibGVCYXNlIHsKKyAgICBUQ292ZXJhZ2VGb3JtYXRCYXNlKiBDb3ZlcmFnZTsKKyAgICBUVF91aW50MTZfdCBHbHlwaENvdW50OworICAgIFRUX3VpbnQxNl90KiBTdWJzdGl0dXRlOworICAgIFRTaW5nbGVTdWJzdEZvcm1hdDIoKSA6IENvdmVyYWdlKE5VTEwpLCBHbHlwaENvdW50KDApLCBTdWJzdGl0dXRlKE5VTEwpIHsKKyAgICAgIFN1YnN0Rm9ybWF0ID0gMjsKKyAgICB9CisgICAgflRTaW5nbGVTdWJzdEZvcm1hdDIoKSB7CisgICAgICBkZWxldGUgQ292ZXJhZ2U7CisgICAgICBkZWxldGVbXSBTdWJzdGl0dXRlOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBUU2luZ2xlU3Vic3RGb3JtYXQyKGNvbnN0IFRTaW5nbGVTdWJzdEZvcm1hdDImKTsKKyAgICBUU2luZ2xlU3Vic3RGb3JtYXQyJiBvcGVyYXRvcj0oY29uc3QgVFNpbmdsZVN1YnN0Rm9ybWF0MiYpOworICB9OworICBzdHJ1Y3QgVExvb2t1cCB7CisgICAgVFRfdWludDE2X3QgTG9va3VwVHlwZTsKKyAgICBUVF91aW50MTZfdCBMb29rdXBGbGFnOworICAgIFRUX3VpbnQxNl90IFN1YlRhYmxlQ291bnQ7CisgICAgc3RydWN0IFRTdWJUYWJsZUJhc2UqKiBTdWJUYWJsZTsKKyAgICBUTG9va3VwKCkKKyAgICAgICAgOiBMb29rdXBUeXBlKDApLCBMb29rdXBGbGFnKDApLCBTdWJUYWJsZUNvdW50KDApLCBTdWJUYWJsZShOVUxMKSB7fQorICAgIH5UTG9va3VwKCkgeworICAgICAgaWYgKFN1YlRhYmxlQ291bnQgPiAwICYmIFN1YlRhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTdWJUYWJsZUNvdW50OyBpKyspIHsKKyAgICAgICAgICBkZWxldGUgU3ViVGFibGVbaV07CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlW10gU3ViVGFibGU7CisgICAgICB9CisgICAgfQorCisgICBwcml2YXRlOgorICAgIFRMb29rdXAoY29uc3QgVExvb2t1cCYpOworICAgIFRMb29rdXAmIG9wZXJhdG9yPShjb25zdCBUTG9va3VwJik7CisgIH07CisgIHN0cnVjdCBUTG9va3VwTGlzdCB7CisgICAgaW50IExvb2t1cENvdW50OworICAgIHN0cnVjdCBUTG9va3VwKiBMb29rdXA7CisgICAgVExvb2t1cExpc3QoKSA6IExvb2t1cENvdW50KDApLCBMb29rdXAoTlVMTCkge30KKyAgICB+VExvb2t1cExpc3QoKSB7CisgICAgICBpZiAoTG9va3VwKSB7CisgICAgICAgIGRlbGV0ZVtdIExvb2t1cDsKKyAgICAgIH0KKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgVExvb2t1cExpc3QoY29uc3QgVExvb2t1cExpc3QmKTsKKyAgICBUTG9va3VwTGlzdCYgb3BlcmF0b3I9KGNvbnN0IFRMb29rdXBMaXN0Jik7CisgIH07CisgIGJvb2wgUGFyc2UoRlRfQnl0ZXMgc2NyaXB0bGlzdCwgRlRfQnl0ZXMgZmVhdHVyZWxpc3QsIEZUX0J5dGVzIGxvb2t1cGxpc3QpOworICB2b2lkIFBhcnNlU2NyaXB0TGlzdChGVF9CeXRlcyByYXcsIFRTY3JpcHRMaXN0KiByZWMpOworICB2b2lkIFBhcnNlU2NyaXB0KEZUX0J5dGVzIHJhdywgVFNjcmlwdCogcmVjKTsKKyAgdm9pZCBQYXJzZUxhbmdTeXMoRlRfQnl0ZXMgcmF3LCBUTGFuZ1N5cyogcmVjKTsKKyAgdm9pZCBQYXJzZUZlYXR1cmVMaXN0KEZUX0J5dGVzIHJhdywgVEZlYXR1cmVMaXN0KiByZWMpOworICB2b2lkIFBhcnNlRmVhdHVyZShGVF9CeXRlcyByYXcsIFRGZWF0dXJlKiByZWMpOworICB2b2lkIFBhcnNlTG9va3VwTGlzdChGVF9CeXRlcyByYXcsIFRMb29rdXBMaXN0KiByZWMpOworICB2b2lkIFBhcnNlTG9va3VwKEZUX0J5dGVzIHJhdywgVExvb2t1cCogcmVjKTsKKyAgdm9pZCBQYXJzZUNvdmVyYWdlKEZUX0J5dGVzIHJhdywgVENvdmVyYWdlRm9ybWF0QmFzZSoqIHJlYyk7CisgIHZvaWQgUGFyc2VDb3ZlcmFnZUZvcm1hdDEoRlRfQnl0ZXMgcmF3LCBUQ292ZXJhZ2VGb3JtYXQxKiByZWMpOworICB2b2lkIFBhcnNlQ292ZXJhZ2VGb3JtYXQyKEZUX0J5dGVzIHJhdywgVENvdmVyYWdlRm9ybWF0MiogcmVjKTsKKyAgdm9pZCBQYXJzZVNpbmdsZVN1YnN0KEZUX0J5dGVzIHJhdywgVFN1YlRhYmxlQmFzZSoqIHJlYyk7CisgIHZvaWQgUGFyc2VTaW5nbGVTdWJzdEZvcm1hdDEoRlRfQnl0ZXMgcmF3LCBUU2luZ2xlU3Vic3RGb3JtYXQxKiByZWMpOworICB2b2lkIFBhcnNlU2luZ2xlU3Vic3RGb3JtYXQyKEZUX0J5dGVzIHJhdywgVFNpbmdsZVN1YnN0Rm9ybWF0MiogcmVjKTsKKyAgYm9vbCBHZXRWZXJ0aWNhbEdseXBoU3ViKFRUX3VpbnQzMl90IGdseXBobnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfdWludDMyX3QqIHZnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBURmVhdHVyZSogRmVhdHVyZSk7CisgIGJvb2wgR2V0VmVydGljYWxHbHlwaFN1YjIoVFRfdWludDMyX3QgZ2x5cGhudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfdWludDMyX3QqIHZnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVExvb2t1cCogTG9va3VwKTsKKyAgaW50IEdldENvdmVyYWdlSW5kZXgoc3RydWN0IFRDb3ZlcmFnZUZvcm1hdEJhc2UqIENvdmVyYWdlLCBUVF91aW50MzJfdCBnKTsKKyAgVFRfdWludDhfdCBHZXRVSW50OChGVF9CeXRlcyYgcCkgY29uc3QgeworICAgIFRUX3VpbnQ4X3QgcmV0ID0gcFswXTsKKyAgICBwICs9IDE7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBUVF9pbnQxNl90IEdldEludDE2KEZUX0J5dGVzJiBwKSBjb25zdCB7CisgICAgVFRfdWludDE2X3QgcmV0ID0gcFswXSA8PCA4IHwgcFsxXTsKKyAgICBwICs9IDI7CisgICAgcmV0dXJuICooVFRfaW50MTZfdCopJnJldDsKKyAgfQorICBUVF91aW50MTZfdCBHZXRVSW50MTYoRlRfQnl0ZXMmIHApIGNvbnN0IHsKKyAgICBUVF91aW50MTZfdCByZXQgPSBwWzBdIDw8IDggfCBwWzFdOworICAgIHAgKz0gMjsKKyAgICByZXR1cm4gcmV0OworICB9CisgIFRUX2ludDMyX3QgR2V0SW50MzIoRlRfQnl0ZXMmIHApIGNvbnN0IHsKKyAgICBUVF91aW50MzJfdCByZXQgPSBwWzBdIDw8IDI0IHwgcFsxXSA8PCAxNiB8IHBbMl0gPDwgOCB8IHBbM107CisgICAgcCArPSA0OworICAgIHJldHVybiAqKFRUX2ludDMyX3QqKSZyZXQ7CisgIH0KKyAgVFRfdWludDMyX3QgR2V0VUludDMyKEZUX0J5dGVzJiBwKSBjb25zdCB7CisgICAgVFRfdWludDMyX3QgcmV0ID0gcFswXSA8PCAyNCB8IHBbMV0gPDwgMTYgfCBwWzJdIDw8IDggfCBwWzNdOworICAgIHAgKz0gNDsKKyAgICByZXR1cm4gcmV0OworICB9CisgIENGWF9DTWFwRFdvcmRUb0RXb3JkIG1fZmVhdHVyZU1hcDsKKyAgRlhfQk9PTCBtX2JGZWF1dHVyZU1hcExvYWQ7CisgIGJvb2wgbG9hZGVkOworICBzdHJ1Y3QgdHRfZ3N1Yl9oZWFkZXIgaGVhZGVyOworICBzdHJ1Y3QgVFNjcmlwdExpc3QgU2NyaXB0TGlzdDsKKyAgc3RydWN0IFRGZWF0dXJlTGlzdCBGZWF0dXJlTGlzdDsKKyAgc3RydWN0IFRMb29rdXBMaXN0IExvb2t1cExpc3Q7Cit9OworY2xhc3MgQ0ZYX0dTVUJUYWJsZSBmaW5hbCA6IHB1YmxpYyBJRlhfR1NVQlRhYmxlIHsKKyBwdWJsaWM6CisgIH5DRlhfR1NVQlRhYmxlKCkgb3ZlcnJpZGUge30KKyAgdmlydHVhbCBGWF9CT09MIEdldFZlcnRpY2FsR2x5cGgoRlhfRFdPUkQgZ2x5cGhudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiB2Z2x5cGhudW0pIG92ZXJyaWRlOworCisgIENGWF9DVFRHU1VCVGFibGUgbV9Hc3ViSW1wOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX1NSQ19GUERGQVBJX0ZQREZfRk9OVF9UVEdTVUJUQUJMRV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZS5jcHAKaW5kZXggZjQwNDM1Mi4uMDQyMWFiYSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2UuY3BwCkBAIC03LDkyICs3LDgyIEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgogI2luY2x1ZGUgInBhZ2VpbnQuaCIKLUNQREZfUGFnZU9iamVjdCogQ1BERl9QYWdlT2JqZWN0OjpDcmVhdGUoaW50IHR5cGUpCi17Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgUERGUEFHRV9URVhUOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX1RleHRPYmplY3Q7Ci0gICAgICAgIGNhc2UgUERGUEFHRV9JTUFHRToKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9JbWFnZU9iamVjdDsKLSAgICAgICAgY2FzZSBQREZQQUdFX1BBVEg6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENQREZfUGF0aE9iamVjdDsKLSAgICAgICAgY2FzZSBQREZQQUdFX1NIQURJTkc6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENQREZfU2hhZGluZ09iamVjdDsKLSAgICAgICAgY2FzZSBQREZQQUdFX0ZPUk06Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENQREZfRm9ybU9iamVjdDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CitDUERGX1BhZ2VPYmplY3QqIENQREZfUGFnZU9iamVjdDo6Q3JlYXRlKGludCB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgUERGUEFHRV9URVhUOgorICAgICAgcmV0dXJuIG5ldyBDUERGX1RleHRPYmplY3Q7CisgICAgY2FzZSBQREZQQUdFX0lNQUdFOgorICAgICAgcmV0dXJuIG5ldyBDUERGX0ltYWdlT2JqZWN0OworICAgIGNhc2UgUERGUEFHRV9QQVRIOgorICAgICAgcmV0dXJuIG5ldyBDUERGX1BhdGhPYmplY3Q7CisgICAgY2FzZSBQREZQQUdFX1NIQURJTkc6CisgICAgICByZXR1cm4gbmV3IENQREZfU2hhZGluZ09iamVjdDsKKyAgICBjYXNlIFBERlBBR0VfRk9STToKKyAgICAgIHJldHVybiBuZXcgQ1BERl9Gb3JtT2JqZWN0OworICB9CisgIHJldHVybiBOVUxMOwogfQotQ1BERl9QYWdlT2JqZWN0Ojp+Q1BERl9QYWdlT2JqZWN0KCkKLXsKK0NQREZfUGFnZU9iamVjdDo6fkNQREZfUGFnZU9iamVjdCgpIHt9CitDUERGX1BhZ2VPYmplY3QqIENQREZfUGFnZU9iamVjdDo6Q2xvbmUoKSBjb25zdCB7CisgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IENyZWF0ZShtX1R5cGUpOworICBwT2JqLT5Db3B5KHRoaXMpOworICByZXR1cm4gcE9iajsKIH0KLUNQREZfUGFnZU9iamVjdCogQ1BERl9QYWdlT2JqZWN0OjpDbG9uZSgpIGNvbnN0Ci17Ci0gICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gQ3JlYXRlKG1fVHlwZSk7Ci0gICAgcE9iai0+Q29weSh0aGlzKTsKLSAgICByZXR1cm4gcE9iajsKK3ZvaWQgQ1BERl9QYWdlT2JqZWN0OjpDb3B5KGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykgeworICBpZiAobV9UeXBlICE9IHBTcmMtPm1fVHlwZSkgeworICAgIHJldHVybjsKKyAgfQorICBDb3B5RGF0YShwU3JjKTsKKyAgQ29weVN0YXRlcygqcFNyYyk7CisgIG1fTGVmdCA9IHBTcmMtPm1fTGVmdDsKKyAgbV9SaWdodCA9IHBTcmMtPm1fUmlnaHQ7CisgIG1fVG9wID0gcFNyYy0+bV9Ub3A7CisgIG1fQm90dG9tID0gcFNyYy0+bV9Cb3R0b207CiB9Ci12b2lkIENQREZfUGFnZU9iamVjdDo6Q29weShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmMpCi17Ci0gICAgaWYgKG1fVHlwZSAhPSBwU3JjLT5tX1R5cGUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDb3B5RGF0YShwU3JjKTsKLSAgICBDb3B5U3RhdGVzKCpwU3JjKTsKLSAgICBtX0xlZnQgPSBwU3JjLT5tX0xlZnQ7Ci0gICAgbV9SaWdodCA9IHBTcmMtPm1fUmlnaHQ7Ci0gICAgbV9Ub3AgPSBwU3JjLT5tX1RvcDsKLSAgICBtX0JvdHRvbSA9IHBTcmMtPm1fQm90dG9tOwordm9pZCBDUERGX1BhZ2VPYmplY3Q6OkFwcGVuZENsaXBQYXRoKENQREZfUGF0aCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkF1dG9NZXJnZSkgeworICBtX0NsaXBQYXRoLkFwcGVuZFBhdGgocGF0aCwgdHlwZSwgYkF1dG9NZXJnZSk7CiB9Ci12b2lkIENQREZfUGFnZU9iamVjdDo6QXBwZW5kQ2xpcFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBGWF9CT09MIGJBdXRvTWVyZ2UpCi17Ci0gICAgbV9DbGlwUGF0aC5BcHBlbmRQYXRoKHBhdGgsIHR5cGUsIGJBdXRvTWVyZ2UpOwordm9pZCBDUERGX1BhZ2VPYmplY3Q6OkNvcHlDbGlwUGF0aChDUERGX1BhZ2VPYmplY3QqIHBPYmopIHsKKyAgbV9DbGlwUGF0aCA9IHBPYmotPm1fQ2xpcFBhdGg7CiB9Ci12b2lkIENQREZfUGFnZU9iamVjdDo6Q29weUNsaXBQYXRoKENQREZfUGFnZU9iamVjdCogcE9iaikKLXsKLSAgICBtX0NsaXBQYXRoID0gcE9iai0+bV9DbGlwUGF0aDsKK3ZvaWQgQ1BERl9QYWdlT2JqZWN0OjpSZW1vdmVDbGlwUGF0aCgpIHsKKyAgbV9DbGlwUGF0aC5TZXROdWxsKCk7CiB9Ci12b2lkIENQREZfUGFnZU9iamVjdDo6UmVtb3ZlQ2xpcFBhdGgoKQotewotICAgIG1fQ2xpcFBhdGguU2V0TnVsbCgpOwordm9pZCBDUERGX1BhZ2VPYmplY3Q6OlJlY2FsY0JCb3goKSB7CisgIHN3aXRjaCAobV9UeXBlKSB7CisgICAgY2FzZSBQREZQQUdFX1RFWFQ6CisgICAgICAoKENQREZfVGV4dE9iamVjdCopdGhpcyktPlJlY2FsY1Bvc2l0aW9uRGF0YSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZQQUdFX1BBVEg6CisgICAgICAoKENQREZfUGF0aE9iamVjdCopdGhpcyktPkNhbGNCb3VuZGluZ0JveCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZQQUdFX1NIQURJTkc6CisgICAgICAoKENQREZfU2hhZGluZ09iamVjdCopdGhpcyktPkNhbGNCb3VuZGluZ0JveCgpOworICAgICAgYnJlYWs7CisgIH0KIH0KLXZvaWQgQ1BERl9QYWdlT2JqZWN0OjpSZWNhbGNCQm94KCkKLXsKLSAgICBzd2l0Y2ggKG1fVHlwZSkgewotICAgICAgICBjYXNlIFBERlBBR0VfVEVYVDoKLSAgICAgICAgICAgICgoQ1BERl9UZXh0T2JqZWN0Kil0aGlzKS0+UmVjYWxjUG9zaXRpb25EYXRhKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZQQUdFX1BBVEg6Ci0gICAgICAgICAgICAoKENQREZfUGF0aE9iamVjdCopdGhpcyktPkNhbGNCb3VuZGluZ0JveCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGUEFHRV9TSEFESU5HOgotICAgICAgICAgICAgKChDUERGX1NoYWRpbmdPYmplY3QqKXRoaXMpLT5DYWxjQm91bmRpbmdCb3goKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KK3ZvaWQgQ1BERl9QYWdlT2JqZWN0OjpUcmFuc2Zvcm1DbGlwUGF0aChDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpIHsKKyAgaWYgKG1fQ2xpcFBhdGguSXNOdWxsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9DbGlwUGF0aC5HZXRNb2RpZnkoKTsKKyAgbV9DbGlwUGF0aC5UcmFuc2Zvcm0obWF0cml4KTsKIH0KLXZvaWQgQ1BERl9QYWdlT2JqZWN0OjpUcmFuc2Zvcm1DbGlwUGF0aChDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpCi17Ci0gICAgaWYgKG1fQ2xpcFBhdGguSXNOdWxsKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX0NsaXBQYXRoLkdldE1vZGlmeSgpOwotICAgIG1fQ2xpcFBhdGguVHJhbnNmb3JtKG1hdHJpeCk7Cit2b2lkIENQREZfUGFnZU9iamVjdDo6VHJhbnNmb3JtR2VuZXJhbFN0YXRlKENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkgeworICBpZiAobV9HZW5lcmFsU3RhdGUuSXNOdWxsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR1MgPSBtX0dlbmVyYWxTdGF0ZS5HZXRNb2RpZnkoKTsKKyAgcEdTLT5tX01hdHJpeC5Db25jYXQobWF0cml4KTsKIH0KLXZvaWQgQ1BERl9QYWdlT2JqZWN0OjpUcmFuc2Zvcm1HZW5lcmFsU3RhdGUoQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIGlmKG1fR2VuZXJhbFN0YXRlLklzTnVsbCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR1MgPSBtX0dlbmVyYWxTdGF0ZS5HZXRNb2RpZnkoKTsKLSAgICBwR1MtPm1fTWF0cml4LkNvbmNhdChtYXRyaXgpOwotfQotRlhfUkVDVCBDUERGX1BhZ2VPYmplY3Q6OkdldEJCb3goY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkgY29uc3QKLXsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QobV9MZWZ0LCBtX0JvdHRvbSwgbV9SaWdodCwgbV9Ub3ApOwotICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocmVjdCk7Ci0gICAgfQotICAgIHJldHVybiByZWN0LkdldE91dHRlclJlY3QoKTsKK0ZYX1JFQ1QgQ1BERl9QYWdlT2JqZWN0OjpHZXRCQm94KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0KG1fTGVmdCwgbV9Cb3R0b20sIG1fUmlnaHQsIG1fVG9wKTsKKyAgaWYgKHBNYXRyaXgpIHsKKyAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJlY3QpOworICB9CisgIHJldHVybiByZWN0LkdldE91dHRlclJlY3QoKTsKIH0KIAogQ1BERl9UZXh0T2JqZWN0OjpDUERGX1RleHRPYmplY3QoKQpAQCAtMTAwLDYyNSArOTAsNTg3IEBACiAgICAgICBtX1Bvc1koMCksCiAgICAgICBtX25DaGFycygwKSwKICAgICAgIG1fcENoYXJDb2RlcyhudWxscHRyKSwKLSAgICAgIG1fcENoYXJQb3MobnVsbHB0cikKLXsKLSAgICBtX1R5cGUgPSBQREZQQUdFX1RFWFQ7CisgICAgICBtX3BDaGFyUG9zKG51bGxwdHIpIHsKKyAgbV9UeXBlID0gUERGUEFHRV9URVhUOwogfQogCi1DUERGX1RleHRPYmplY3Q6On5DUERGX1RleHRPYmplY3QoKQotewotICAgIGlmIChtX25DaGFycyA+IDEgJiYgbV9wQ2hhckNvZGVzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQ2hhckNvZGVzKTsKLSAgICB9Ci0gICAgaWYgKG1fcENoYXJQb3MpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDaGFyUG9zKTsKLSAgICB9CitDUERGX1RleHRPYmplY3Q6On5DUERGX1RleHRPYmplY3QoKSB7CisgIGlmIChtX25DaGFycyA+IDEgJiYgbV9wQ2hhckNvZGVzKSB7CisgICAgRlhfRnJlZShtX3BDaGFyQ29kZXMpOworICB9CisgIGlmIChtX3BDaGFyUG9zKSB7CisgICAgRlhfRnJlZShtX3BDaGFyUG9zKTsKKyAgfQogfQogCi12b2lkIENQREZfVGV4dE9iamVjdDo6R2V0SXRlbUluZm8oaW50IGluZGV4LCBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3QKLXsKLSAgICBwSW5mby0+bV9DaGFyQ29kZSA9Ci0gICAgICAgIG1fbkNoYXJzID09IDEgPyAoRlhfRFdPUkQpKHVpbnRwdHJfdCltX3BDaGFyQ29kZXMgOiBtX3BDaGFyQ29kZXNbaW5kZXhdOwotICAgIHBJbmZvLT5tX09yaWdpblggPSBpbmRleCA/IG1fcENoYXJQb3NbaW5kZXggLSAxXSA6IDA7Ci0gICAgcEluZm8tPm1fT3JpZ2luWSA9IDA7Ci0gICAgaWYgKHBJbmZvLT5tX0NoYXJDb2RlID09IC0xKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICBpZiAocEZvbnQtPkdldEZvbnRUeXBlKCkgIT0gUERGRk9OVF9DSURGT05UKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCEoKENQREZfQ0lERm9udCopcEZvbnQpLT5Jc1ZlcnRXcml0aW5nKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9XT1JEIENJRCA9ICgoQ1BERl9DSURGb250KilwRm9udCktPkNJREZyb21DaGFyQ29kZShwSW5mby0+bV9DaGFyQ29kZSk7Ci0gICAgcEluZm8tPm1fT3JpZ2luWSA9IHBJbmZvLT5tX09yaWdpblg7Ci0gICAgcEluZm8tPm1fT3JpZ2luWCA9IDA7Ci0gICAgc2hvcnQgdngsIHZ5OwotICAgICgoQ1BERl9DSURGb250KilwRm9udCktPkdldFZlcnRPcmlnaW4oQ0lELCB2eCwgdnkpOwotICAgIEZYX0ZMT0FUIGZvbnRzaXplID0gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKLSAgICBwSW5mby0+bV9PcmlnaW5YIC09IGZvbnRzaXplICogdnggLyAxMDAwOwotICAgIHBJbmZvLT5tX09yaWdpblkgLT0gZm9udHNpemUgKiB2eSAvIDEwMDA7Cit2b2lkIENQREZfVGV4dE9iamVjdDo6R2V0SXRlbUluZm8oaW50IGluZGV4LCBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3QgeworICBwSW5mby0+bV9DaGFyQ29kZSA9CisgICAgICBtX25DaGFycyA9PSAxID8gKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9wQ2hhckNvZGVzIDogbV9wQ2hhckNvZGVzW2luZGV4XTsKKyAgcEluZm8tPm1fT3JpZ2luWCA9IGluZGV4ID8gbV9wQ2hhclBvc1tpbmRleCAtIDFdIDogMDsKKyAgcEluZm8tPm1fT3JpZ2luWSA9IDA7CisgIGlmIChwSW5mby0+bV9DaGFyQ29kZSA9PSAtMSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOworICBpZiAocEZvbnQtPkdldEZvbnRUeXBlKCkgIT0gUERGRk9OVF9DSURGT05UKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghKChDUERGX0NJREZvbnQqKXBGb250KS0+SXNWZXJ0V3JpdGluZygpKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX1dPUkQgQ0lEID0gKChDUERGX0NJREZvbnQqKXBGb250KS0+Q0lERnJvbUNoYXJDb2RlKHBJbmZvLT5tX0NoYXJDb2RlKTsKKyAgcEluZm8tPm1fT3JpZ2luWSA9IHBJbmZvLT5tX09yaWdpblg7CisgIHBJbmZvLT5tX09yaWdpblggPSAwOworICBzaG9ydCB2eCwgdnk7CisgICgoQ1BERl9DSURGb250KilwRm9udCktPkdldFZlcnRPcmlnaW4oQ0lELCB2eCwgdnkpOworICBGWF9GTE9BVCBmb250c2l6ZSA9IG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCk7CisgIHBJbmZvLT5tX09yaWdpblggLT0gZm9udHNpemUgKiB2eCAvIDEwMDA7CisgIHBJbmZvLT5tX09yaWdpblkgLT0gZm9udHNpemUgKiB2eSAvIDEwMDA7CiB9CiAKLWludCBDUERGX1RleHRPYmplY3Q6OkNvdW50Q2hhcnMoKSBjb25zdAotewotICAgIGlmIChtX25DaGFycyA9PSAxKSB7Ci0gICAgICAgIHJldHVybiAxOworaW50IENQREZfVGV4dE9iamVjdDo6Q291bnRDaGFycygpIGNvbnN0IHsKKyAgaWYgKG1fbkNoYXJzID09IDEpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpbnQgY291bnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzOyArK2kpCisgICAgaWYgKG1fcENoYXJDb2Rlc1tpXSAhPSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgICsrY291bnQ7CiAgICAgfQotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25DaGFyczsgKytpKQotICAgICAgICBpZiAobV9wQ2hhckNvZGVzW2ldICE9IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICArK2NvdW50OwotICAgICAgICB9Ci0gICAgcmV0dXJuIGNvdW50OworICByZXR1cm4gY291bnQ7CiB9CiAKIHZvaWQgQ1BERl9UZXh0T2JqZWN0OjpHZXRDaGFySW5mbyhpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrZXJuaW5nKSBjb25zdAotewotICAgIGlmIChtX25DaGFycyA9PSAxKSB7Ci0gICAgICAgIGNoYXJjb2RlID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9wQ2hhckNvZGVzOwotICAgICAgICBrZXJuaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYga2VybmluZykgY29uc3QgeworICBpZiAobV9uQ2hhcnMgPT0gMSkgeworICAgIGNoYXJjb2RlID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9wQ2hhckNvZGVzOworICAgIGtlcm5pbmcgPSAwOworICAgIHJldHVybjsKKyAgfQorICBpbnQgY291bnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzOyArK2kpIHsKKyAgICBpZiAobV9wQ2hhckNvZGVzW2ldICE9IChGWF9EV09SRCktMSkgeworICAgICAgaWYgKGNvdW50ID09IGluZGV4KSB7CisgICAgICAgIGNoYXJjb2RlID0gbV9wQ2hhckNvZGVzW2ldOworICAgICAgICBpZiAoaSA9PSBtX25DaGFycyAtIDEgfHwgbV9wQ2hhckNvZGVzW2kgKyAxXSAhPSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgICAgICBrZXJuaW5nID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBrZXJuaW5nID0gbV9wQ2hhclBvc1tpXTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICArK2NvdW50OwogICAgIH0KLSAgICBpbnQgY291bnQgPSAwOworICB9Cit9CisKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpHZXRDaGFySW5mbyhpbnQgaW5kZXgsIENQREZfVGV4dE9iamVjdEl0ZW0qIHBJbmZvKSBjb25zdCB7CisgIGlmIChtX25DaGFycyA9PSAxKSB7CisgICAgR2V0SXRlbUluZm8oMCwgcEluZm8pOworICAgIHJldHVybjsKKyAgfQorICBpbnQgY291bnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzOyArK2kpIHsKKyAgICBGWF9EV09SRCBjaGFyY29kZSA9IG1fcENoYXJDb2Rlc1tpXTsKKyAgICBpZiAoY2hhcmNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGNvdW50ID09IGluZGV4KSB7CisgICAgICBHZXRJdGVtSW5mbyhpLCBwSW5mbyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgKytjb3VudDsKKyAgfQorfQorCit2b2lkIENQREZfVGV4dE9iamVjdDo6Q29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjKSB7CisgIGNvbnN0IENQREZfVGV4dE9iamVjdCogcFNyY09iaiA9IChjb25zdCBDUERGX1RleHRPYmplY3QqKXBTcmM7CisgIGlmIChtX25DaGFycyA+IDEgJiYgbV9wQ2hhckNvZGVzKSB7CisgICAgRlhfRnJlZShtX3BDaGFyQ29kZXMpOworICAgIG1fcENoYXJDb2RlcyA9IG51bGxwdHI7CisgIH0KKyAgaWYgKG1fcENoYXJQb3MpIHsKKyAgICBGWF9GcmVlKG1fcENoYXJQb3MpOworICAgIG1fcENoYXJQb3MgPSBudWxscHRyOworICB9CisgIG1fbkNoYXJzID0gcFNyY09iai0+bV9uQ2hhcnM7CisgIGlmIChtX25DaGFycyA+IDEpIHsKKyAgICBtX3BDaGFyQ29kZXMgPSBGWF9BbGxvYyhGWF9EV09SRCwgbV9uQ2hhcnMpOworICAgIG1fcENoYXJQb3MgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbV9uQ2hhcnMgLSAxKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzOyArK2kpIHsKLSAgICAgICAgaWYgKG1fcENoYXJDb2Rlc1tpXSAhPSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgaWYgKGNvdW50ID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgY2hhcmNvZGUgPSBtX3BDaGFyQ29kZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gbV9uQ2hhcnMgLSAxIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1fcENoYXJDb2Rlc1tpICsgMV0gIT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAga2VybmluZyA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAga2VybmluZyA9IG1fcENoYXJQb3NbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrY291bnQ7Ci0gICAgICAgIH0KKyAgICAgIG1fcENoYXJDb2Rlc1tpXSA9IHBTcmNPYmotPm1fcENoYXJDb2Rlc1tpXTsKICAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25DaGFycyAtIDE7ICsraSkgeworICAgICAgbV9wQ2hhclBvc1tpXSA9IHBTcmNPYmotPm1fcENoYXJQb3NbaV07CisgICAgfQorICB9IGVsc2UgeworICAgIG1fcENoYXJDb2RlcyA9IHBTcmNPYmotPm1fcENoYXJDb2RlczsKKyAgfQorICBtX1Bvc1ggPSBwU3JjT2JqLT5tX1Bvc1g7CisgIG1fUG9zWSA9IHBTcmNPYmotPm1fUG9zWTsKIH0KIAotdm9pZCBDUERGX1RleHRPYmplY3Q6OkdldENoYXJJbmZvKGludCBpbmRleCwgQ1BERl9UZXh0T2JqZWN0SXRlbSogcEluZm8pIGNvbnN0Ci17Ci0gICAgaWYgKG1fbkNoYXJzID09IDEpIHsKLSAgICAgICAgR2V0SXRlbUluZm8oMCwgcEluZm8pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25DaGFyczsgKytpKSB7Ci0gICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gbV9wQ2hhckNvZGVzW2ldOwotICAgICAgICBpZiAoY2hhcmNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb3VudCA9PSBpbmRleCkgewotICAgICAgICAgICAgR2V0SXRlbUluZm8oaSwgcEluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKytjb3VudDsKLSAgICB9Ci19Ci0KLXZvaWQgQ1BERl9UZXh0T2JqZWN0OjpDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmMpCi17Ci0gICAgY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwU3JjT2JqID0gKGNvbnN0IENQREZfVGV4dE9iamVjdCopcFNyYzsKLSAgICBpZiAobV9uQ2hhcnMgPiAxICYmIG1fcENoYXJDb2RlcykgewotICAgICAgICBGWF9GcmVlKG1fcENoYXJDb2Rlcyk7Ci0gICAgICAgIG1fcENoYXJDb2RlcyA9IG51bGxwdHI7Ci0gICAgfQotICAgIGlmIChtX3BDaGFyUG9zKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQ2hhclBvcyk7Ci0gICAgICAgIG1fcENoYXJQb3MgPSBudWxscHRyOwotICAgIH0KLSAgICBtX25DaGFycyA9IHBTcmNPYmotPm1fbkNoYXJzOwotICAgIGlmIChtX25DaGFycyA+IDEpIHsKLSAgICAgICAgbV9wQ2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIG1fbkNoYXJzKTsKLSAgICAgICAgbV9wQ2hhclBvcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBtX25DaGFycyAtIDEpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzOyArK2kpIHsKLSAgICAgICAgICAgIG1fcENoYXJDb2Rlc1tpXSA9IHBTcmNPYmotPm1fcENoYXJDb2Rlc1tpXTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzIC0gMTsgKytpKSB7Ci0gICAgICAgICAgICBtX3BDaGFyUG9zW2ldID0gcFNyY09iai0+bV9wQ2hhclBvc1tpXTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcENoYXJDb2RlcyA9IHBTcmNPYmotPm1fcENoYXJDb2RlczsKLSAgICB9Ci0gICAgbV9Qb3NYID0gcFNyY09iai0+bV9Qb3NYOwotICAgIG1fUG9zWSA9IHBTcmNPYmotPm1fUG9zWTsKLX0KLQotdm9pZCBDUERGX1RleHRPYmplY3Q6OkdldFRleHRNYXRyaXgoQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCogcFRleHRNYXRyaXggPSBtX1RleHRTdGF0ZS5HZXRNYXRyaXgoKTsKLSAgICBwTWF0cml4LT5TZXQocFRleHRNYXRyaXhbMF0sCi0gICAgICAgICAgICAgICAgIHBUZXh0TWF0cml4WzJdLAotICAgICAgICAgICAgICAgICBwVGV4dE1hdHJpeFsxXSwKLSAgICAgICAgICAgICAgICAgcFRleHRNYXRyaXhbM10sCi0gICAgICAgICAgICAgICAgIG1fUG9zWCwKLSAgICAgICAgICAgICAgICAgbV9Qb3NZKTsKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpHZXRUZXh0TWF0cml4KENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpIGNvbnN0IHsKKyAgRlhfRkxPQVQqIHBUZXh0TWF0cml4ID0gbV9UZXh0U3RhdGUuR2V0TWF0cml4KCk7CisgIHBNYXRyaXgtPlNldChwVGV4dE1hdHJpeFswXSwgcFRleHRNYXRyaXhbMl0sIHBUZXh0TWF0cml4WzFdLCBwVGV4dE1hdHJpeFszXSwKKyAgICAgICAgICAgICAgIG1fUG9zWCwgbV9Qb3NZKTsKIH0KIAogdm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFNlZ21lbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nKiBwU3RycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcEtlcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5zZWdzKQotewotICAgIGlmIChtX25DaGFycyA+IDEgJiYgbV9wQ2hhckNvZGVzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQ2hhckNvZGVzKTsKLSAgICAgICAgbV9wQ2hhckNvZGVzID0gbnVsbHB0cjsKLSAgICB9Ci0gICAgaWYgKG1fcENoYXJQb3MpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDaGFyUG9zKTsKLSAgICAgICAgbV9wQ2hhclBvcyA9IG51bGxwdHI7Ci0gICAgfQotICAgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7Ci0gICAgbV9uQ2hhcnMgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnNlZ3M7ICsraSkgewotICAgICAgICBtX25DaGFycyArPSBwRm9udC0+Q291bnRDaGFyKHBTdHJzW2ldLCBwU3Ryc1tpXS5HZXRMZW5ndGgoKSk7Ci0gICAgfQotICAgIG1fbkNoYXJzICs9IG5zZWdzIC0gMTsKLSAgICBpZiAobV9uQ2hhcnMgPiAxKSB7Ci0gICAgICAgIG1fcENoYXJDb2RlcyA9IEZYX0FsbG9jKEZYX0RXT1JELCBtX25DaGFycyk7Ci0gICAgICAgIG1fcENoYXJQb3MgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbV9uQ2hhcnMgLSAxKTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2VnczsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBzZWdtZW50ID0gcFN0cnNbaV07Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMCwgbGVuID0gcFN0cnNbaV0uR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgbV9wQ2hhckNvZGVzW2luZGV4KytdID0KLSAgICAgICAgICAgICAgICAgICAgcEZvbnQtPkdldE5leHRDaGFyKHNlZ21lbnQsIGxlbiwgb2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpICE9IG5zZWdzIC0gMSkgewotICAgICAgICAgICAgICAgIG1fcENoYXJQb3NbaW5kZXggLSAxXSA9IHBLZXJuaW5nW2ldOwotICAgICAgICAgICAgICAgIG1fcENoYXJDb2Rlc1tpbmRleCsrXSA9IChGWF9EV09SRCkgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIG1fcENoYXJDb2RlcyA9Ci0gICAgICAgICAgICAoRlhfRFdPUkQqKSh1aW50cHRyX3QpcEZvbnQtPkdldE5leHRDaGFyKHBTdHJzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3Ryc1swXS5HZXRMZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKLSAgICB9Ci19Ci0KLXZvaWQgQ1BERl9UZXh0T2JqZWN0OjpTZXRUZXh0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpCi17Ci0gICAgU2V0U2VnbWVudHMoJnN0ciwgbnVsbHB0ciwgMSk7Ci0gICAgUmVjYWxjUG9zaXRpb25EYXRhKCk7Ci19Ci0KLXZvaWQgQ1BERl9UZXh0T2JqZWN0OjpTZXRFbXB0eSgpCi17Ci0gICAgaWYgKG1fbkNoYXJzID4gMSAmJiBtX3BDaGFyQ29kZXMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDaGFyQ29kZXMpOwotICAgIH0KLSAgICBpZiAobV9uQ2hhcnMgPiAxICYmIG1fcENoYXJQb3MpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDaGFyUG9zKTsKLSAgICB9Ci0gICAgbV9uQ2hhcnMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuc2VncykgeworICBpZiAobV9uQ2hhcnMgPiAxICYmIG1fcENoYXJDb2RlcykgeworICAgIEZYX0ZyZWUobV9wQ2hhckNvZGVzKTsKICAgICBtX3BDaGFyQ29kZXMgPSBudWxscHRyOworICB9CisgIGlmIChtX3BDaGFyUG9zKSB7CisgICAgRlhfRnJlZShtX3BDaGFyUG9zKTsKICAgICBtX3BDaGFyUG9zID0gbnVsbHB0cjsKLSAgICBtX0xlZnQgPSBtX1JpZ2h0ID0gbV9Qb3NYOwotICAgIG1fVG9wID0gbV9Cb3R0b20gPSBtX1Bvc1k7CisgIH0KKyAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKKyAgbV9uQ2hhcnMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG5zZWdzOyArK2kpIHsKKyAgICBtX25DaGFycyArPSBwRm9udC0+Q291bnRDaGFyKHBTdHJzW2ldLCBwU3Ryc1tpXS5HZXRMZW5ndGgoKSk7CisgIH0KKyAgbV9uQ2hhcnMgKz0gbnNlZ3MgLSAxOworICBpZiAobV9uQ2hhcnMgPiAxKSB7CisgICAgbV9wQ2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIG1fbkNoYXJzKTsKKyAgICBtX3BDaGFyUG9zID0gRlhfQWxsb2MoRlhfRkxPQVQsIG1fbkNoYXJzIC0gMSk7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zZWdzOyArK2kpIHsKKyAgICAgIGNvbnN0IEZYX0NIQVIqIHNlZ21lbnQgPSBwU3Ryc1tpXTsKKyAgICAgIGludCBvZmZzZXQgPSAwLCBsZW4gPSBwU3Ryc1tpXS5HZXRMZW5ndGgoKTsKKyAgICAgIHdoaWxlIChvZmZzZXQgPCBsZW4pIHsKKyAgICAgICAgbV9wQ2hhckNvZGVzW2luZGV4KytdID0gcEZvbnQtPkdldE5leHRDaGFyKHNlZ21lbnQsIGxlbiwgb2Zmc2V0KTsKKyAgICAgIH0KKyAgICAgIGlmIChpICE9IG5zZWdzIC0gMSkgeworICAgICAgICBtX3BDaGFyUG9zW2luZGV4IC0gMV0gPSBwS2VybmluZ1tpXTsKKyAgICAgICAgbV9wQ2hhckNvZGVzW2luZGV4KytdID0gKEZYX0RXT1JEKS0xOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBtX3BDaGFyQ29kZXMgPSAoRlhfRFdPUkQqKSh1aW50cHRyX3QpcEZvbnQtPkdldE5leHRDaGFyKAorICAgICAgICBwU3Ryc1swXSwgcFN0cnNbMF0uR2V0TGVuZ3RoKCksIG9mZnNldCk7CisgIH0KK30KKwordm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFRleHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgeworICBTZXRTZWdtZW50cygmc3RyLCBudWxscHRyLCAxKTsKKyAgUmVjYWxjUG9zaXRpb25EYXRhKCk7Cit9CisKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpTZXRFbXB0eSgpIHsKKyAgaWYgKG1fbkNoYXJzID4gMSAmJiBtX3BDaGFyQ29kZXMpIHsKKyAgICBGWF9GcmVlKG1fcENoYXJDb2Rlcyk7CisgIH0KKyAgaWYgKG1fbkNoYXJzID4gMSAmJiBtX3BDaGFyUG9zKSB7CisgICAgRlhfRnJlZShtX3BDaGFyUG9zKTsKKyAgfQorICBtX25DaGFycyA9IDA7CisgIG1fcENoYXJDb2RlcyA9IG51bGxwdHI7CisgIG1fcENoYXJQb3MgPSBudWxscHRyOworICBtX0xlZnQgPSBtX1JpZ2h0ID0gbV9Qb3NYOworICBtX1RvcCA9IG1fQm90dG9tID0gbV9Qb3NZOwogfQogCiB2b2lkIENQREZfVGV4dE9iamVjdDo6U2V0VGV4dChDRlhfQnl0ZVN0cmluZyogcFN0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcEtlcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNlZ3MpCi17Ci0gICAgU2V0U2VnbWVudHMocFN0cnMsIHBLZXJuaW5nLCBuU2Vncyk7Ci0gICAgUmVjYWxjUG9zaXRpb25EYXRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNlZ3MpIHsKKyAgU2V0U2VnbWVudHMocFN0cnMsIHBLZXJuaW5nLCBuU2Vncyk7CisgIFJlY2FsY1Bvc2l0aW9uRGF0YSgpOwogfQogCiB2b2lkIENQREZfVGV4dE9iamVjdDo6U2V0VGV4dChpbnQgbkNoYXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBDaGFyQ29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcEtlcm5pbmdzKQotewotICAgIGlmIChtX25DaGFycyA+IDEgJiYgbV9wQ2hhckNvZGVzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQ2hhckNvZGVzKTsKLSAgICAgICAgbV9wQ2hhckNvZGVzID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwS2VybmluZ3MpIHsKKyAgaWYgKG1fbkNoYXJzID4gMSAmJiBtX3BDaGFyQ29kZXMpIHsKKyAgICBGWF9GcmVlKG1fcENoYXJDb2Rlcyk7CisgICAgbV9wQ2hhckNvZGVzID0gbnVsbHB0cjsKKyAgfQorICBpZiAobV9wQ2hhclBvcykgeworICAgIEZYX0ZyZWUobV9wQ2hhclBvcyk7CisgICAgbV9wQ2hhclBvcyA9IG51bGxwdHI7CisgIH0KKyAgaW50IG5LZXJuaW5ncyA9IDA7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbkNoYXJzIC0gMTsgKytpKSB7CisgICAgaWYgKHBLZXJuaW5nc1tpXSAhPSAwKSB7CisgICAgICArK25LZXJuaW5nczsKICAgICB9Ci0gICAgaWYgKG1fcENoYXJQb3MpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDaGFyUG9zKTsKLSAgICAgICAgbV9wQ2hhclBvcyA9IG51bGxwdHI7CisgIH0KKyAgbV9uQ2hhcnMgPSBuQ2hhcnMgKyBuS2VybmluZ3M7CisgIGlmIChtX25DaGFycyA+IDEpIHsKKyAgICBtX3BDaGFyQ29kZXMgPSBGWF9BbGxvYyhGWF9EV09SRCwgbV9uQ2hhcnMpOworICAgIG1fcENoYXJQb3MgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbV9uQ2hhcnMgLSAxKTsKKyAgICBmb3IgKGludCBpID0gMCwgaW5kZXggPSAwOyBpIDwgbkNoYXJzOyArK2kpIHsKKyAgICAgIG1fcENoYXJDb2Rlc1tpbmRleCsrXSA9IHBDaGFyQ29kZXNbaV07CisgICAgICBpZiAocEtlcm5pbmdzW2ldICE9IDAgJiYgaSAhPSBuQ2hhcnMgLSAxKSB7CisgICAgICAgIG1fcENoYXJDb2Rlc1tpbmRleF0gPSAoRlhfRFdPUkQpLTE7CisgICAgICAgIG1fcENoYXJQb3NbaW5kZXggLSAxXSA9IHBLZXJuaW5nc1tpXTsKKyAgICAgICAgKytpbmRleDsKKyAgICAgIH0KICAgICB9Ci0gICAgaW50IG5LZXJuaW5ncyA9IDA7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5DaGFycyAtIDE7ICsraSkgewotICAgICAgICBpZiAocEtlcm5pbmdzW2ldICE9IDApIHsKLSAgICAgICAgICAgICsrbktlcm5pbmdzOwotICAgICAgICB9CisgIH0gZWxzZSB7CisgICAgbV9wQ2hhckNvZGVzID0gKEZYX0RXT1JEKikodWludHB0cl90KXBDaGFyQ29kZXNbMF07CisgIH0KKyAgUmVjYWxjUG9zaXRpb25EYXRhKCk7Cit9CisKK0ZYX0ZMT0FUIENQREZfVGV4dE9iamVjdDo6R2V0Q2hhcldpZHRoKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCB7CisgIEZYX0ZMT0FUIGZvbnRzaXplID0gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSAvIDEwMDA7CisgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7CisgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CisgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+R2V0Q0lERm9udCgpOworICBpZiAocENJREZvbnQpIHsKKyAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOworICB9CisgIGlmICghYlZlcnRXcml0aW5nKQorICAgIHJldHVybiBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyY29kZSwgMCkgKiBmb250c2l6ZTsKKworICBGWF9XT1JEIENJRCA9IHBDSURGb250LT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICByZXR1cm4gcENJREZvbnQtPkdldFZlcnRXaWR0aChDSUQpICogZm9udHNpemU7Cit9CisKK0ZYX0ZMT0FUIENQREZfVGV4dE9iamVjdDo6R2V0U3BhY2VDaGFyV2lkdGgoKSBjb25zdCB7CisgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7CisgIEZYX0RXT1JEIGNoYXJDb2RlID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpLT5DaGFyQ29kZUZyb21Vbmljb2RlKDMyKTsKKyAgaWYgKGNoYXJDb2RlICE9IChGWF9EV09SRCktMSkgeworICAgIHJldHVybiBHZXRDaGFyV2lkdGgoY2hhckNvZGUpOworICB9CisgIEZYX0ZMT0FUIGZvbnRTaXplID0gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSAvIDQwMDAuMGY7CisgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CisgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+R2V0Q0lERm9udCgpOworICBpZiAocENJREZvbnQpIHsKKyAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOworICB9CisgIEZYX1JFQ1QgZm9udFJlY3Q7CisgIHBGb250LT5HZXRGb250QkJveChmb250UmVjdCk7CisgIGZvbnRTaXplICo9CisgICAgICBiVmVydFdyaXRpbmcgPyAoRlhfRkxPQVQpZm9udFJlY3QuSGVpZ2h0KCkgOiAoRlhfRkxPQVQpZm9udFJlY3QuV2lkdGgoKTsKKyAgcmV0dXJuIGZvbnRTaXplOworfQorCit2b2lkIENQREZfVGV4dE9iamVjdDo6R2V0Q2hhclJlY3QoaW50IGluZGV4LCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdCB7CisgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7CisgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CisgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+R2V0Q0lERm9udCgpOworICBpZiAocENJREZvbnQpIHsKKyAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOworICB9CisgIEZYX0ZMT0FUIGZvbnRzaXplID0gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSAvIDEwMDA7CisgIGludCBjb3VudCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ2hhcnM7ICsraSkgeworICAgIEZYX0RXT1JEIGNoYXJjb2RlID0KKyAgICAgICAgbV9uQ2hhcnMgPT0gMSA/IChGWF9EV09SRCkodWludHB0cl90KW1fcENoYXJDb2RlcyA6IG1fcENoYXJDb2Rlc1tpXTsKKyAgICBpZiAoY2hhcmNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgbV9uQ2hhcnMgPSBuQ2hhcnMgKyBuS2VybmluZ3M7Ci0gICAgaWYgKG1fbkNoYXJzID4gMSkgewotICAgICAgICBtX3BDaGFyQ29kZXMgPSBGWF9BbGxvYyhGWF9EV09SRCwgbV9uQ2hhcnMpOwotICAgICAgICBtX3BDaGFyUG9zID0gRlhfQWxsb2MoRlhfRkxPQVQsIG1fbkNoYXJzIC0gMSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwLCBpbmRleCA9IDA7IGkgPCBuQ2hhcnM7ICsraSkgewotICAgICAgICAgICAgbV9wQ2hhckNvZGVzW2luZGV4KytdID0gcENoYXJDb2Rlc1tpXTsKLSAgICAgICAgICAgIGlmIChwS2VybmluZ3NbaV0gIT0gMCAmJiBpICE9IG5DaGFycyAtIDEpIHsKLSAgICAgICAgICAgICAgICBtX3BDaGFyQ29kZXNbaW5kZXhdID0gKEZYX0RXT1JEKSAtIDE7Ci0gICAgICAgICAgICAgICAgbV9wQ2hhclBvc1tpbmRleCAtIDFdID0gcEtlcm5pbmdzW2ldOwotICAgICAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBpZiAoY291bnQgIT0gaW5kZXgpIHsKKyAgICAgICsrY291bnQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgRlhfRkxPQVQgY3VycG9zID0gaSA+IDAgPyBtX3BDaGFyUG9zW2kgLSAxXSA6IDA7CisgICAgRlhfUkVDVCBjaGFyX3JlY3Q7CisgICAgcEZvbnQtPkdldENoYXJCQm94KGNoYXJjb2RlLCBjaGFyX3JlY3QsIDApOworICAgIGlmICghYlZlcnRXcml0aW5nKSB7CisgICAgICByZWN0LmxlZnQgPSBjdXJwb3MgKyBjaGFyX3JlY3QubGVmdCAqIGZvbnRzaXplOworICAgICAgcmVjdC5yaWdodCA9IGN1cnBvcyArIGNoYXJfcmVjdC5yaWdodCAqIGZvbnRzaXplOworICAgICAgcmVjdC50b3AgPSBjaGFyX3JlY3QudG9wICogZm9udHNpemU7CisgICAgICByZWN0LmJvdHRvbSA9IGNoYXJfcmVjdC5ib3R0b20gKiBmb250c2l6ZTsKICAgICB9IGVsc2UgewotICAgICAgICBtX3BDaGFyQ29kZXMgPSAoRlhfRFdPUkQqKSh1aW50cHRyX3QpcENoYXJDb2Rlc1swXTsKKyAgICAgIEZYX1dPUkQgQ0lEID0gcENJREZvbnQtPkNJREZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgICAgICBzaG9ydCB2eCwgdnk7CisgICAgICBwQ0lERm9udC0+R2V0VmVydE9yaWdpbihDSUQsIHZ4LCB2eSk7CisgICAgICBjaGFyX3JlY3QubGVmdCAtPSB2eDsKKyAgICAgIGNoYXJfcmVjdC5yaWdodCAtPSB2eDsKKyAgICAgIGNoYXJfcmVjdC50b3AgLT0gdnk7CisgICAgICBjaGFyX3JlY3QuYm90dG9tIC09IHZ5OworICAgICAgcmVjdC5sZWZ0ID0gY2hhcl9yZWN0LmxlZnQgKiBmb250c2l6ZTsKKyAgICAgIHJlY3QucmlnaHQgPSBjaGFyX3JlY3QucmlnaHQgKiBmb250c2l6ZTsKKyAgICAgIHJlY3QudG9wID0gY3VycG9zICsgY2hhcl9yZWN0LnRvcCAqIGZvbnRzaXplOworICAgICAgcmVjdC5ib3R0b20gPSBjdXJwb3MgKyBjaGFyX3JlY3QuYm90dG9tICogZm9udHNpemU7CiAgICAgfQotICAgIFJlY2FsY1Bvc2l0aW9uRGF0YSgpOwotfQotCi1GWF9GTE9BVCBDUERGX1RleHRPYmplY3Q6OkdldENoYXJXaWR0aChGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCBmb250c2l6ZSA9IG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7Ci0gICAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBGQUxTRTsKLSAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKLSAgICBpZiAocENJREZvbnQpIHsKLSAgICAgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKLSAgICB9Ci0gICAgaWYgKCFiVmVydFdyaXRpbmcpCi0gICAgICAgIHJldHVybiBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyY29kZSwgMCkgKiBmb250c2l6ZTsKLQotICAgIEZYX1dPUkQgQ0lEID0gcENJREZvbnQtPkNJREZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgcmV0dXJuIHBDSURGb250LT5HZXRWZXJ0V2lkdGgoQ0lEKSAqIGZvbnRzaXplOwotfQotCi1GWF9GTE9BVCBDUERGX1RleHRPYmplY3Q6OkdldFNwYWNlQ2hhcldpZHRoKCkgY29uc3QKLXsKLSAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOwotICAgIEZYX0RXT1JEIGNoYXJDb2RlID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpLT5DaGFyQ29kZUZyb21Vbmljb2RlKDMyKTsKLSAgICBpZiAoY2hhckNvZGUgIT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuIEdldENoYXJXaWR0aChjaGFyQ29kZSk7Ci0gICAgfQotICAgIEZYX0ZMT0FUIGZvbnRTaXplID0gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSAvIDQwMDAuMGY7Ci0gICAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBGQUxTRTsKLSAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKLSAgICBpZiAocENJREZvbnQpIHsKLSAgICAgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKLSAgICB9Ci0gICAgRlhfUkVDVCBmb250UmVjdDsKLSAgICBwRm9udC0+R2V0Rm9udEJCb3goZm9udFJlY3QpOwotICAgIGZvbnRTaXplICo9IGJWZXJ0V3JpdGluZyA/Ci0gICAgICAgIChGWF9GTE9BVClmb250UmVjdC5IZWlnaHQoKSA6IChGWF9GTE9BVClmb250UmVjdC5XaWR0aCgpOwotICAgIHJldHVybiBmb250U2l6ZTsKLX0KLQotdm9pZCBDUERGX1RleHRPYmplY3Q6OkdldENoYXJSZWN0KGludCBpbmRleCwgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QKLXsKLSAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOwotICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7Ci0gICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7Ci0gICAgaWYgKHBDSURGb250KSB7Ci0gICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7Ci0gICAgfQotICAgIEZYX0ZMT0FUIGZvbnRzaXplID0gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzOyArK2kpIHsKLSAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBtX25DaGFycyA9PSAxID8KLSAgICAgICAgICAgIChGWF9EV09SRCkodWludHB0cl90KW1fcENoYXJDb2RlcyA6IG1fcENoYXJDb2Rlc1tpXTsKLSAgICAgICAgaWYgKGNoYXJjb2RlID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY291bnQgIT0gaW5kZXgpIHsKLSAgICAgICAgICAgICsrY291bnQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBjdXJwb3MgPSBpID4gMCA/IG1fcENoYXJQb3NbaSAtIDFdIDogMDsKLSAgICAgICAgRlhfUkVDVCBjaGFyX3JlY3Q7Ci0gICAgICAgIHBGb250LT5HZXRDaGFyQkJveChjaGFyY29kZSwgY2hhcl9yZWN0LCAwKTsKLSAgICAgICAgaWYgKCFiVmVydFdyaXRpbmcpIHsKLSAgICAgICAgICAgIHJlY3QubGVmdCA9IGN1cnBvcyArIGNoYXJfcmVjdC5sZWZ0ICogZm9udHNpemU7Ci0gICAgICAgICAgICByZWN0LnJpZ2h0ID0gY3VycG9zICsgY2hhcl9yZWN0LnJpZ2h0ICogZm9udHNpemU7Ci0gICAgICAgICAgICByZWN0LnRvcCA9IGNoYXJfcmVjdC50b3AgKiBmb250c2l6ZTsKLSAgICAgICAgICAgIHJlY3QuYm90dG9tID0gY2hhcl9yZWN0LmJvdHRvbSAqIGZvbnRzaXplOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhfV09SRCBDSUQgPSBwQ0lERm9udC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICAgICAgICAgIHNob3J0IHZ4LCB2eTsKLSAgICAgICAgICAgIHBDSURGb250LT5HZXRWZXJ0T3JpZ2luKENJRCwgdngsIHZ5KTsKLSAgICAgICAgICAgIGNoYXJfcmVjdC5sZWZ0IC09IHZ4OwotICAgICAgICAgICAgY2hhcl9yZWN0LnJpZ2h0IC09IHZ4OwotICAgICAgICAgICAgY2hhcl9yZWN0LnRvcCAtPSB2eTsKLSAgICAgICAgICAgIGNoYXJfcmVjdC5ib3R0b20gLT0gdnk7Ci0gICAgICAgICAgICByZWN0LmxlZnQgPSBjaGFyX3JlY3QubGVmdCAqIGZvbnRzaXplOwotICAgICAgICAgICAgcmVjdC5yaWdodCA9IGNoYXJfcmVjdC5yaWdodCAqIGZvbnRzaXplOwotICAgICAgICAgICAgcmVjdC50b3AgPSBjdXJwb3MgKyBjaGFyX3JlY3QudG9wICogZm9udHNpemU7Ci0gICAgICAgICAgICByZWN0LmJvdHRvbSA9IGN1cnBvcyArIGNoYXJfcmVjdC5ib3R0b20gKiBmb250c2l6ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIHJldHVybjsKKyAgfQogfQogCiB2b2lkIENQREZfVGV4dE9iamVjdDo6Q2FsY1Bvc2l0aW9uRGF0YShGWF9GTE9BVCogcFRleHRBZHZhbmNlWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwVGV4dEFkdmFuY2VZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaG9yel9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkKLXsKLSAgICBGWF9GTE9BVCBjdXJwb3MgPSAwOwotICAgIEZYX0ZMT0FUIG1pbl94ID0gMTAwMDAgKiAxLjBmOwotICAgIEZYX0ZMT0FUIG1heF94ID0gLTEwMDAwICogMS4wZjsKLSAgICBGWF9GTE9BVCBtaW5feSA9IDEwMDAwICogMS4wZjsKLSAgICBGWF9GTE9BVCBtYXhfeSA9IC0xMDAwMCAqIDEuMGY7Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOwotICAgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+R2V0Q0lERm9udCgpOwotICAgIGlmIChwQ0lERm9udCkgewotICAgICAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSB7CisgIEZYX0ZMT0FUIGN1cnBvcyA9IDA7CisgIEZYX0ZMT0FUIG1pbl94ID0gMTAwMDAgKiAxLjBmOworICBGWF9GTE9BVCBtYXhfeCA9IC0xMDAwMCAqIDEuMGY7CisgIEZYX0ZMT0FUIG1pbl95ID0gMTAwMDAgKiAxLjBmOworICBGWF9GTE9BVCBtYXhfeSA9IC0xMDAwMCAqIDEuMGY7CisgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7CisgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CisgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+R2V0Q0lERm9udCgpOworICBpZiAocENJREZvbnQpIHsKKyAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOworICB9CisgIEZYX0ZMT0FUIGZvbnRzaXplID0gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25DaGFyczsgKytpKSB7CisgICAgRlhfRFdPUkQgY2hhcmNvZGUgPQorICAgICAgICBtX25DaGFycyA9PSAxID8gKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9wQ2hhckNvZGVzIDogbV9wQ2hhckNvZGVzW2ldOworICAgIGlmIChjaGFyY29kZSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgIGN1cnBvcyAtPSBGWFNZU19NdWwobV9wQ2hhclBvc1tpIC0gMV0sIGZvbnRzaXplKSAvIDEwMDA7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgRlhfRkxPQVQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ2hhcnM7ICsraSkgewotICAgICAgICBGWF9EV09SRCBjaGFyY29kZSA9IG1fbkNoYXJzID09IDEgPwotICAgICAgICAgICAgKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9wQ2hhckNvZGVzIDogbV9wQ2hhckNvZGVzW2ldOwotICAgICAgICBpZiAoY2hhcmNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgIGN1cnBvcyAtPSBGWFNZU19NdWwobV9wQ2hhclBvc1tpIC0gMV0sIGZvbnRzaXplKSAvIDEwMDA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaSkgewotICAgICAgICAgICAgbV9wQ2hhclBvc1tpIC0gMV0gPSBjdXJwb3M7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfUkVDVCBjaGFyX3JlY3Q7Ci0gICAgICAgIHBGb250LT5HZXRDaGFyQkJveChjaGFyY29kZSwgY2hhcl9yZWN0LCBsZXZlbCk7Ci0gICAgICAgIEZYX0ZMT0FUIGNoYXJ3aWR0aDsKLSAgICAgICAgaWYgKCFiVmVydFdyaXRpbmcpIHsKLSAgICAgICAgICAgIGlmIChtaW5feSA+IGNoYXJfcmVjdC50b3ApIHsKLSAgICAgICAgICAgICAgICBtaW5feSA9IChGWF9GTE9BVCljaGFyX3JlY3QudG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heF95IDwgY2hhcl9yZWN0LnRvcCkgewotICAgICAgICAgICAgICAgIG1heF95ID0gKEZYX0ZMT0FUKWNoYXJfcmVjdC50b3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWluX3kgPiBjaGFyX3JlY3QuYm90dG9tKSB7Ci0gICAgICAgICAgICAgICAgbWluX3kgPSAoRlhfRkxPQVQpY2hhcl9yZWN0LmJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtYXhfeSA8IGNoYXJfcmVjdC5ib3R0b20pIHsKLSAgICAgICAgICAgICAgICBtYXhfeSA9IChGWF9GTE9BVCljaGFyX3JlY3QuYm90dG9tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl9sZWZ0ID0gY3VycG9zICsgY2hhcl9yZWN0LmxlZnQgKiBmb250c2l6ZSAvIDEwMDA7Ci0gICAgICAgICAgICBGWF9GTE9BVCBjaGFyX3JpZ2h0ID0gY3VycG9zICsgY2hhcl9yZWN0LnJpZ2h0ICogZm9udHNpemUgLyAxMDAwOwotICAgICAgICAgICAgaWYgKG1pbl94ID4gY2hhcl9sZWZ0KSB7Ci0gICAgICAgICAgICAgICAgbWluX3ggPSBjaGFyX2xlZnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWF4X3ggPCBjaGFyX2xlZnQpIHsKLSAgICAgICAgICAgICAgICBtYXhfeCA9IGNoYXJfbGVmdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtaW5feCA+IGNoYXJfcmlnaHQpIHsKLSAgICAgICAgICAgICAgICBtaW5feCA9IGNoYXJfcmlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWF4X3ggPCBjaGFyX3JpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgbWF4X3ggPSBjaGFyX3JpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hhcndpZHRoID0gcEZvbnQtPkdldENoYXJXaWR0aEYoY2hhcmNvZGUsIGxldmVsKSAqIGZvbnRzaXplIC8gMTAwMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYX1dPUkQgQ0lEID0gcENJREZvbnQtPkNJREZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgICAgICAgICBzaG9ydCB2eDsKLSAgICAgICAgICAgIHNob3J0IHZ5OwotICAgICAgICAgICAgcENJREZvbnQtPkdldFZlcnRPcmlnaW4oQ0lELCB2eCwgdnkpOwotICAgICAgICAgICAgY2hhcl9yZWN0LmxlZnQgLT0gdng7Ci0gICAgICAgICAgICBjaGFyX3JlY3QucmlnaHQgLT0gdng7Ci0gICAgICAgICAgICBjaGFyX3JlY3QudG9wIC09IHZ5OwotICAgICAgICAgICAgY2hhcl9yZWN0LmJvdHRvbSAtPSB2eTsKLSAgICAgICAgICAgIGlmIChtaW5feCA+IGNoYXJfcmVjdC5sZWZ0KSB7Ci0gICAgICAgICAgICAgICAgbWluX3ggPSAoRlhfRkxPQVQpY2hhcl9yZWN0LmxlZnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWF4X3ggPCBjaGFyX3JlY3QubGVmdCkgewotICAgICAgICAgICAgICAgIG1heF94ID0gKEZYX0ZMT0FUKWNoYXJfcmVjdC5sZWZ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1pbl94ID4gY2hhcl9yZWN0LnJpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgbWluX3ggPSAoRlhfRkxPQVQpY2hhcl9yZWN0LnJpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heF94IDwgY2hhcl9yZWN0LnJpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgbWF4X3ggPSAoRlhfRkxPQVQpY2hhcl9yZWN0LnJpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl90b3AgPSBjdXJwb3MgKyBjaGFyX3JlY3QudG9wICogZm9udHNpemUgLyAxMDAwOwotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl9ib3R0b20gPSBjdXJwb3MgKyBjaGFyX3JlY3QuYm90dG9tICogZm9udHNpemUgLyAxMDAwOwotICAgICAgICAgICAgaWYgKG1pbl95ID4gY2hhcl90b3ApIHsKLSAgICAgICAgICAgICAgICBtaW5feSA9IGNoYXJfdG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heF95IDwgY2hhcl90b3ApIHsKLSAgICAgICAgICAgICAgICBtYXhfeSA9IGNoYXJfdG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1pbl95ID4gY2hhcl9ib3R0b20pIHsKLSAgICAgICAgICAgICAgICBtaW5feSA9IGNoYXJfYm90dG9tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heF95IDwgY2hhcl9ib3R0b20pIHsKLSAgICAgICAgICAgICAgICBtYXhfeSA9IGNoYXJfYm90dG9tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hhcndpZHRoID0gcENJREZvbnQtPkdldFZlcnRXaWR0aChDSUQpICogZm9udHNpemUgLyAxMDAwOwotICAgICAgICB9Ci0gICAgICAgIGN1cnBvcyArPSBjaGFyd2lkdGg7Ci0gICAgICAgIGlmIChjaGFyY29kZSA9PSAnICcgJiYgKCFwQ0lERm9udCB8fCBwQ0lERm9udC0+R2V0Q2hhclNpemUoMzIpID09IDEpKSB7Ci0gICAgICAgICAgICBjdXJwb3MgKz0gbV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fV29yZFNwYWNlOwotICAgICAgICB9Ci0gICAgICAgIGN1cnBvcyArPSBtX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2U7CisgICAgaWYgKGkpIHsKKyAgICAgIG1fcENoYXJQb3NbaSAtIDFdID0gY3VycG9zOwogICAgIH0KLSAgICBpZiAoYlZlcnRXcml0aW5nKSB7Ci0gICAgICAgIGlmIChwVGV4dEFkdmFuY2VYKSB7Ci0gICAgICAgICAgICAqcFRleHRBZHZhbmNlWCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBUZXh0QWR2YW5jZVkpIHsKLSAgICAgICAgICAgICpwVGV4dEFkdmFuY2VZID0gY3VycG9zOwotICAgICAgICB9Ci0gICAgICAgIG1pbl94ID0gbWluX3ggKiBmb250c2l6ZSAvIDEwMDA7Ci0gICAgICAgIG1heF94ID0gbWF4X3ggKiBmb250c2l6ZSAvIDEwMDA7CisgICAgRlhfUkVDVCBjaGFyX3JlY3Q7CisgICAgcEZvbnQtPkdldENoYXJCQm94KGNoYXJjb2RlLCBjaGFyX3JlY3QsIGxldmVsKTsKKyAgICBGWF9GTE9BVCBjaGFyd2lkdGg7CisgICAgaWYgKCFiVmVydFdyaXRpbmcpIHsKKyAgICAgIGlmIChtaW5feSA+IGNoYXJfcmVjdC50b3ApIHsKKyAgICAgICAgbWluX3kgPSAoRlhfRkxPQVQpY2hhcl9yZWN0LnRvcDsKKyAgICAgIH0KKyAgICAgIGlmIChtYXhfeSA8IGNoYXJfcmVjdC50b3ApIHsKKyAgICAgICAgbWF4X3kgPSAoRlhfRkxPQVQpY2hhcl9yZWN0LnRvcDsKKyAgICAgIH0KKyAgICAgIGlmIChtaW5feSA+IGNoYXJfcmVjdC5ib3R0b20pIHsKKyAgICAgICAgbWluX3kgPSAoRlhfRkxPQVQpY2hhcl9yZWN0LmJvdHRvbTsKKyAgICAgIH0KKyAgICAgIGlmIChtYXhfeSA8IGNoYXJfcmVjdC5ib3R0b20pIHsKKyAgICAgICAgbWF4X3kgPSAoRlhfRkxPQVQpY2hhcl9yZWN0LmJvdHRvbTsKKyAgICAgIH0KKyAgICAgIEZYX0ZMT0FUIGNoYXJfbGVmdCA9IGN1cnBvcyArIGNoYXJfcmVjdC5sZWZ0ICogZm9udHNpemUgLyAxMDAwOworICAgICAgRlhfRkxPQVQgY2hhcl9yaWdodCA9IGN1cnBvcyArIGNoYXJfcmVjdC5yaWdodCAqIGZvbnRzaXplIC8gMTAwMDsKKyAgICAgIGlmIChtaW5feCA+IGNoYXJfbGVmdCkgeworICAgICAgICBtaW5feCA9IGNoYXJfbGVmdDsKKyAgICAgIH0KKyAgICAgIGlmIChtYXhfeCA8IGNoYXJfbGVmdCkgeworICAgICAgICBtYXhfeCA9IGNoYXJfbGVmdDsKKyAgICAgIH0KKyAgICAgIGlmIChtaW5feCA+IGNoYXJfcmlnaHQpIHsKKyAgICAgICAgbWluX3ggPSBjaGFyX3JpZ2h0OworICAgICAgfQorICAgICAgaWYgKG1heF94IDwgY2hhcl9yaWdodCkgeworICAgICAgICBtYXhfeCA9IGNoYXJfcmlnaHQ7CisgICAgICB9CisgICAgICBjaGFyd2lkdGggPSBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyY29kZSwgbGV2ZWwpICogZm9udHNpemUgLyAxMDAwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwVGV4dEFkdmFuY2VYKSB7Ci0gICAgICAgICAgICAqcFRleHRBZHZhbmNlWCA9IEZYU1lTX011bChjdXJwb3MsIGhvcnpfc2NhbGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwVGV4dEFkdmFuY2VZKSB7Ci0gICAgICAgICAgICAqcFRleHRBZHZhbmNlWSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgbWluX3kgPSBtaW5feSAqIGZvbnRzaXplIC8gMTAwMDsKLSAgICAgICAgbWF4X3kgPSBtYXhfeSAqIGZvbnRzaXplIC8gMTAwMDsKKyAgICAgIEZYX1dPUkQgQ0lEID0gcENJREZvbnQtPkNJREZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgICAgICBzaG9ydCB2eDsKKyAgICAgIHNob3J0IHZ5OworICAgICAgcENJREZvbnQtPkdldFZlcnRPcmlnaW4oQ0lELCB2eCwgdnkpOworICAgICAgY2hhcl9yZWN0LmxlZnQgLT0gdng7CisgICAgICBjaGFyX3JlY3QucmlnaHQgLT0gdng7CisgICAgICBjaGFyX3JlY3QudG9wIC09IHZ5OworICAgICAgY2hhcl9yZWN0LmJvdHRvbSAtPSB2eTsKKyAgICAgIGlmIChtaW5feCA+IGNoYXJfcmVjdC5sZWZ0KSB7CisgICAgICAgIG1pbl94ID0gKEZYX0ZMT0FUKWNoYXJfcmVjdC5sZWZ0OworICAgICAgfQorICAgICAgaWYgKG1heF94IDwgY2hhcl9yZWN0LmxlZnQpIHsKKyAgICAgICAgbWF4X3ggPSAoRlhfRkxPQVQpY2hhcl9yZWN0LmxlZnQ7CisgICAgICB9CisgICAgICBpZiAobWluX3ggPiBjaGFyX3JlY3QucmlnaHQpIHsKKyAgICAgICAgbWluX3ggPSAoRlhfRkxPQVQpY2hhcl9yZWN0LnJpZ2h0OworICAgICAgfQorICAgICAgaWYgKG1heF94IDwgY2hhcl9yZWN0LnJpZ2h0KSB7CisgICAgICAgIG1heF94ID0gKEZYX0ZMT0FUKWNoYXJfcmVjdC5yaWdodDsKKyAgICAgIH0KKyAgICAgIEZYX0ZMT0FUIGNoYXJfdG9wID0gY3VycG9zICsgY2hhcl9yZWN0LnRvcCAqIGZvbnRzaXplIC8gMTAwMDsKKyAgICAgIEZYX0ZMT0FUIGNoYXJfYm90dG9tID0gY3VycG9zICsgY2hhcl9yZWN0LmJvdHRvbSAqIGZvbnRzaXplIC8gMTAwMDsKKyAgICAgIGlmIChtaW5feSA+IGNoYXJfdG9wKSB7CisgICAgICAgIG1pbl95ID0gY2hhcl90b3A7CisgICAgICB9CisgICAgICBpZiAobWF4X3kgPCBjaGFyX3RvcCkgeworICAgICAgICBtYXhfeSA9IGNoYXJfdG9wOworICAgICAgfQorICAgICAgaWYgKG1pbl95ID4gY2hhcl9ib3R0b20pIHsKKyAgICAgICAgbWluX3kgPSBjaGFyX2JvdHRvbTsKKyAgICAgIH0KKyAgICAgIGlmIChtYXhfeSA8IGNoYXJfYm90dG9tKSB7CisgICAgICAgIG1heF95ID0gY2hhcl9ib3R0b207CisgICAgICB9CisgICAgICBjaGFyd2lkdGggPSBwQ0lERm9udC0+R2V0VmVydFdpZHRoKENJRCkgKiBmb250c2l6ZSAvIDEwMDA7CiAgICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIEdldFRleHRNYXRyaXgoJm1hdHJpeCk7Ci0gICAgbV9MZWZ0ID0gbWluX3g7Ci0gICAgbV9SaWdodCA9IG1heF94OwotICAgIG1fQm90dG9tID0gbWluX3k7Ci0gICAgbV9Ub3AgPSBtYXhfeTsKLSAgICBtYXRyaXguVHJhbnNmb3JtUmVjdChtX0xlZnQsIG1fUmlnaHQsIG1fVG9wLCBtX0JvdHRvbSk7Ci0gICAgaW50IHRleHRtb2RlID0gbV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fVGV4dE1vZGU7Ci0gICAgaWYgKHRleHRtb2RlID09IDEgfHwgdGV4dG1vZGUgPT0gMiB8fCB0ZXh0bW9kZSA9PSA1IHx8IHRleHRtb2RlID09IDYpIHsKLSAgICAgICAgRlhfRkxPQVQgaGFsZl93aWR0aCA9IG1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKS0+bV9MaW5lV2lkdGggLyAyOwotICAgICAgICBtX0xlZnQgLT0gaGFsZl93aWR0aDsKLSAgICAgICAgbV9SaWdodCArPSBoYWxmX3dpZHRoOwotICAgICAgICBtX1RvcCArPSBoYWxmX3dpZHRoOwotICAgICAgICBtX0JvdHRvbSAtPSBoYWxmX3dpZHRoOworICAgIGN1cnBvcyArPSBjaGFyd2lkdGg7CisgICAgaWYgKGNoYXJjb2RlID09ICcgJyAmJiAoIXBDSURGb250IHx8IHBDSURGb250LT5HZXRDaGFyU2l6ZSgzMikgPT0gMSkpIHsKKyAgICAgIGN1cnBvcyArPSBtX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9Xb3JkU3BhY2U7CiAgICAgfQorICAgIGN1cnBvcyArPSBtX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2U7CisgIH0KKyAgaWYgKGJWZXJ0V3JpdGluZykgeworICAgIGlmIChwVGV4dEFkdmFuY2VYKSB7CisgICAgICAqcFRleHRBZHZhbmNlWCA9IDA7CisgICAgfQorICAgIGlmIChwVGV4dEFkdmFuY2VZKSB7CisgICAgICAqcFRleHRBZHZhbmNlWSA9IGN1cnBvczsKKyAgICB9CisgICAgbWluX3ggPSBtaW5feCAqIGZvbnRzaXplIC8gMTAwMDsKKyAgICBtYXhfeCA9IG1heF94ICogZm9udHNpemUgLyAxMDAwOworICB9IGVsc2UgeworICAgIGlmIChwVGV4dEFkdmFuY2VYKSB7CisgICAgICAqcFRleHRBZHZhbmNlWCA9IEZYU1lTX011bChjdXJwb3MsIGhvcnpfc2NhbGUpOworICAgIH0KKyAgICBpZiAocFRleHRBZHZhbmNlWSkgeworICAgICAgKnBUZXh0QWR2YW5jZVkgPSAwOworICAgIH0KKyAgICBtaW5feSA9IG1pbl95ICogZm9udHNpemUgLyAxMDAwOworICAgIG1heF95ID0gbWF4X3kgKiBmb250c2l6ZSAvIDEwMDA7CisgIH0KKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7CisgIEdldFRleHRNYXRyaXgoJm1hdHJpeCk7CisgIG1fTGVmdCA9IG1pbl94OworICBtX1JpZ2h0ID0gbWF4X3g7CisgIG1fQm90dG9tID0gbWluX3k7CisgIG1fVG9wID0gbWF4X3k7CisgIG1hdHJpeC5UcmFuc2Zvcm1SZWN0KG1fTGVmdCwgbV9SaWdodCwgbV9Ub3AsIG1fQm90dG9tKTsKKyAgaW50IHRleHRtb2RlID0gbV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fVGV4dE1vZGU7CisgIGlmICh0ZXh0bW9kZSA9PSAxIHx8IHRleHRtb2RlID09IDIgfHwgdGV4dG1vZGUgPT0gNSB8fCB0ZXh0bW9kZSA9PSA2KSB7CisgICAgRlhfRkxPQVQgaGFsZl93aWR0aCA9IG1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKS0+bV9MaW5lV2lkdGggLyAyOworICAgIG1fTGVmdCAtPSBoYWxmX3dpZHRoOworICAgIG1fUmlnaHQgKz0gaGFsZl93aWR0aDsKKyAgICBtX1RvcCArPSBoYWxmX3dpZHRoOworICAgIG1fQm90dG9tIC09IGhhbGZfd2lkdGg7CisgIH0KIH0KIAotdm9pZCBDUERGX1RleHRPYmplY3Q6OkNhbGNDaGFyUG9zKEZYX0ZMT0FUKiBwUG9zQXJyYXkpIGNvbnN0Ci17Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOwotICAgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+R2V0Q0lERm9udCgpOwotICAgIGlmIChwQ0lERm9udCkgewotICAgICAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOwordm9pZCBDUERGX1RleHRPYmplY3Q6OkNhbGNDaGFyUG9zKEZYX0ZMT0FUKiBwUG9zQXJyYXkpIGNvbnN0IHsKKyAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKKyAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBGQUxTRTsKKyAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7CisgIGlmIChwQ0lERm9udCkgeworICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CisgIH0KKyAgRlhfRkxPQVQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOworICBmb3IgKGludCBpID0gMCwgaW5kZXggPSAwOyBpIDwgbV9uQ2hhcnM7ICsraSkgeworICAgIEZYX0RXT1JEIGNoYXJjb2RlID0KKyAgICAgICAgbV9uQ2hhcnMgPT0gMSA/IChGWF9EV09SRCkodWludHB0cl90KW1fcENoYXJDb2RlcyA6IG1fcENoYXJDb2Rlc1tpXTsKKyAgICBpZiAoY2hhcmNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgRlhfRkxPQVQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwLCBpbmRleCA9IDA7IGkgPCBtX25DaGFyczsgKytpKSB7Ci0gICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gbV9uQ2hhcnMgPT0gMSA/Ci0gICAgICAgICAgICAoRlhfRFdPUkQpKHVpbnRwdHJfdCltX3BDaGFyQ29kZXMgOiBtX3BDaGFyQ29kZXNbaV07Ci0gICAgICAgIGlmIChjaGFyY29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcFBvc0FycmF5W2luZGV4KytdID0gaSA/IG1fcENoYXJQb3NbaSAtIDFdIDogMDsKLSAgICAgICAgRlhfRkxPQVQgY2hhcndpZHRoOwotICAgICAgICBpZiAoYlZlcnRXcml0aW5nKSB7Ci0gICAgICAgICAgICBGWF9XT1JEIENJRCA9IHBDSURGb250LT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotICAgICAgICAgICAgY2hhcndpZHRoID0gcENJREZvbnQtPkdldFZlcnRXaWR0aChDSUQpICogZm9udHNpemUgLyAxMDAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhcndpZHRoID0gcEZvbnQtPkdldENoYXJXaWR0aEYoY2hhcmNvZGUpICogZm9udHNpemUgLyAxMDAwOwotICAgICAgICB9Ci0gICAgICAgIHBQb3NBcnJheVtpbmRleF0gPSBwUG9zQXJyYXlbaW5kZXggLSAxXSArIGNoYXJ3aWR0aDsKLSAgICAgICAgaW5kZXgrKzsKKyAgICBwUG9zQXJyYXlbaW5kZXgrK10gPSBpID8gbV9wQ2hhclBvc1tpIC0gMV0gOiAwOworICAgIEZYX0ZMT0FUIGNoYXJ3aWR0aDsKKyAgICBpZiAoYlZlcnRXcml0aW5nKSB7CisgICAgICBGWF9XT1JEIENJRCA9IHBDSURGb250LT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICAgICAgY2hhcndpZHRoID0gcENJREZvbnQtPkdldFZlcnRXaWR0aChDSUQpICogZm9udHNpemUgLyAxMDAwOworICAgIH0gZWxzZSB7CisgICAgICBjaGFyd2lkdGggPSBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyY29kZSkgKiBmb250c2l6ZSAvIDEwMDA7CiAgICAgfQorICAgIHBQb3NBcnJheVtpbmRleF0gPSBwUG9zQXJyYXlbaW5kZXggLSAxXSArIGNoYXJ3aWR0aDsKKyAgICBpbmRleCsrOworICB9CiB9CiAKLXZvaWQgQ1BERl9UZXh0T2JqZWN0OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIG1fVGV4dFN0YXRlLkdldE1vZGlmeSgpOwotICAgIENGWF9BZmZpbmVNYXRyaXggdGV4dF9tYXRyaXg7Ci0gICAgR2V0VGV4dE1hdHJpeCgmdGV4dF9tYXRyaXgpOwotICAgIHRleHRfbWF0cml4LkNvbmNhdChtYXRyaXgpOwotICAgIEZYX0ZMT0FUKiBwVGV4dE1hdHJpeCA9IG1fVGV4dFN0YXRlLkdldE1hdHJpeCgpOwotICAgIHBUZXh0TWF0cml4WzBdID0gdGV4dF9tYXRyaXguR2V0QSgpOwotICAgIHBUZXh0TWF0cml4WzFdID0gdGV4dF9tYXRyaXguR2V0QygpOwotICAgIHBUZXh0TWF0cml4WzJdID0gdGV4dF9tYXRyaXguR2V0QigpOwotICAgIHBUZXh0TWF0cml4WzNdID0gdGV4dF9tYXRyaXguR2V0RCgpOwotICAgIG1fUG9zWCA9IHRleHRfbWF0cml4LkdldEUoKTsKLSAgICBtX1Bvc1kgPSB0ZXh0X21hdHJpeC5HZXRGKCk7Ci0gICAgQ2FsY1Bvc2l0aW9uRGF0YShudWxscHRyLCBudWxscHRyLCAwKTsKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KSB7CisgIG1fVGV4dFN0YXRlLkdldE1vZGlmeSgpOworICBDRlhfQWZmaW5lTWF0cml4IHRleHRfbWF0cml4OworICBHZXRUZXh0TWF0cml4KCZ0ZXh0X21hdHJpeCk7CisgIHRleHRfbWF0cml4LkNvbmNhdChtYXRyaXgpOworICBGWF9GTE9BVCogcFRleHRNYXRyaXggPSBtX1RleHRTdGF0ZS5HZXRNYXRyaXgoKTsKKyAgcFRleHRNYXRyaXhbMF0gPSB0ZXh0X21hdHJpeC5HZXRBKCk7CisgIHBUZXh0TWF0cml4WzFdID0gdGV4dF9tYXRyaXguR2V0QygpOworICBwVGV4dE1hdHJpeFsyXSA9IHRleHRfbWF0cml4LkdldEIoKTsKKyAgcFRleHRNYXRyaXhbM10gPSB0ZXh0X21hdHJpeC5HZXREKCk7CisgIG1fUG9zWCA9IHRleHRfbWF0cml4LkdldEUoKTsKKyAgbV9Qb3NZID0gdGV4dF9tYXRyaXguR2V0RigpOworICBDYWxjUG9zaXRpb25EYXRhKG51bGxwdHIsIG51bGxwdHIsIDApOwogfQogCi12b2lkIENQREZfVGV4dE9iamVjdDo6U2V0UG9zaXRpb24oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkKLXsKLSAgICBGWF9GTE9BVCBkeCA9IHggLSBtX1Bvc1g7Ci0gICAgRlhfRkxPQVQgZHkgPSB5IC0gbV9Qb3NZOwotICAgIG1fUG9zWCA9IHg7Ci0gICAgbV9Qb3NZID0geTsKLSAgICBtX0xlZnQgKz0gZHg7Ci0gICAgbV9SaWdodCArPSBkeDsKLSAgICBtX1RvcCArPSBkeTsKLSAgICBtX0JvdHRvbSArPSBkeTsKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpTZXRQb3NpdGlvbihGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSB7CisgIEZYX0ZMT0FUIGR4ID0geCAtIG1fUG9zWDsKKyAgRlhfRkxPQVQgZHkgPSB5IC0gbV9Qb3NZOworICBtX1Bvc1ggPSB4OworICBtX1Bvc1kgPSB5OworICBtX0xlZnQgKz0gZHg7CisgIG1fUmlnaHQgKz0gZHg7CisgIG1fVG9wICs9IGR5OworICBtX0JvdHRvbSArPSBkeTsKIH0KIAogdm9pZCBDUERGX1RleHRPYmplY3Q6OlNldERhdGEoaW50IG5DaGFycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwQ2hhckNvZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkpCi17Ci0gICAgQVNTRVJUKG1fbkNoYXJzID09IDApOwotICAgIG1fbkNoYXJzID0gbkNoYXJzOwotICAgIG1fUG9zWCA9IHg7Ci0gICAgbV9Qb3NZID0geTsKLSAgICBpZiAobkNoYXJzID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobkNoYXJzID09IDEpIHsKLSAgICAgICAgbV9wQ2hhckNvZGVzID0gKEZYX0RXT1JEKikodWludHB0cl90KSAqIHBDaGFyQ29kZXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wQ2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIG5DaGFycyk7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BDaGFyQ29kZXMsIHBDaGFyQ29kZXMsIHNpemVvZihGWF9EV09SRCkqbkNoYXJzKTsKLSAgICAgICAgbV9wQ2hhclBvcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBuQ2hhcnMgLSAxKTsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fcENoYXJQb3MsIHBDaGFyUG9zLCBzaXplb2YoRlhfRkxPQVQpICogKG5DaGFycyAtIDEpKTsKLSAgICB9Ci0gICAgUmVjYWxjUG9zaXRpb25EYXRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5KSB7CisgIEFTU0VSVChtX25DaGFycyA9PSAwKTsKKyAgbV9uQ2hhcnMgPSBuQ2hhcnM7CisgIG1fUG9zWCA9IHg7CisgIG1fUG9zWSA9IHk7CisgIGlmIChuQ2hhcnMgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobkNoYXJzID09IDEpIHsKKyAgICBtX3BDaGFyQ29kZXMgPSAoRlhfRFdPUkQqKSh1aW50cHRyX3QpKnBDaGFyQ29kZXM7CisgIH0gZWxzZSB7CisgICAgbV9wQ2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIG5DaGFycyk7CisgICAgRlhTWVNfbWVtY3B5KG1fcENoYXJDb2RlcywgcENoYXJDb2Rlcywgc2l6ZW9mKEZYX0RXT1JEKSAqIG5DaGFycyk7CisgICAgbV9wQ2hhclBvcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBuQ2hhcnMgLSAxKTsKKyAgICBGWFNZU19tZW1jcHkobV9wQ2hhclBvcywgcENoYXJQb3MsIHNpemVvZihGWF9GTE9BVCkgKiAobkNoYXJzIC0gMSkpOworICB9CisgIFJlY2FsY1Bvc2l0aW9uRGF0YSgpOwogfQogCi12b2lkIENQREZfVGV4dE9iamVjdDo6U2V0VGV4dFN0YXRlKENQREZfVGV4dFN0YXRlIFRleHRTdGF0ZSkKLXsKLSAgICBtX1RleHRTdGF0ZSA9IFRleHRTdGF0ZTsKLSAgICBDYWxjUG9zaXRpb25EYXRhKG51bGxwdHIsIG51bGxwdHIsIDApOwordm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFRleHRTdGF0ZShDUERGX1RleHRTdGF0ZSBUZXh0U3RhdGUpIHsKKyAgbV9UZXh0U3RhdGUgPSBUZXh0U3RhdGU7CisgIENhbGNQb3NpdGlvbkRhdGEobnVsbHB0ciwgbnVsbHB0ciwgMCk7CiB9CiAKLUNQREZfU2hhZGluZ09iamVjdDo6Q1BERl9TaGFkaW5nT2JqZWN0KCkKLXsKLSAgICBtX3BTaGFkaW5nID0gTlVMTDsKLSAgICBtX1R5cGUgPSBQREZQQUdFX1NIQURJTkc7CitDUERGX1NoYWRpbmdPYmplY3Q6OkNQREZfU2hhZGluZ09iamVjdCgpIHsKKyAgbV9wU2hhZGluZyA9IE5VTEw7CisgIG1fVHlwZSA9IFBERlBBR0VfU0hBRElORzsKIH0KLUNQREZfU2hhZGluZ09iamVjdDo6fkNQREZfU2hhZGluZ09iamVjdCgpCi17CitDUERGX1NoYWRpbmdPYmplY3Q6On5DUERGX1NoYWRpbmdPYmplY3QoKSB7fQordm9pZCBDUERGX1NoYWRpbmdPYmplY3Q6OkNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykgeworICBDUERGX1NoYWRpbmdPYmplY3QqIHBTcmNPYmogPSAoQ1BERl9TaGFkaW5nT2JqZWN0KilwU3JjOworICBtX3BTaGFkaW5nID0gcFNyY09iai0+bV9wU2hhZGluZzsKKyAgaWYgKG1fcFNoYWRpbmcgJiYgbV9wU2hhZGluZy0+bV9wRG9jdW1lbnQpIHsKKyAgICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBtX3BTaGFkaW5nLT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKKyAgICBtX3BTaGFkaW5nID0gKENQREZfU2hhZGluZ1BhdHRlcm4qKXBEb2NQYWdlRGF0YS0+R2V0UGF0dGVybigKKyAgICAgICAgbV9wU2hhZGluZy0+bV9wU2hhZGluZ09iaiwgbV9wU2hhZGluZy0+bV9iU2hhZGluZ09iaiwKKyAgICAgICAgJm1fcFNoYWRpbmctPm1fUGFyZW50TWF0cml4KTsKKyAgfQorICBtX01hdHJpeCA9IHBTcmNPYmotPm1fTWF0cml4OwogfQotdm9pZCBDUERGX1NoYWRpbmdPYmplY3Q6OkNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykKLXsKLSAgICBDUERGX1NoYWRpbmdPYmplY3QqIHBTcmNPYmogPSAoQ1BERl9TaGFkaW5nT2JqZWN0KilwU3JjOwotICAgIG1fcFNoYWRpbmcgPSBwU3JjT2JqLT5tX3BTaGFkaW5nOwotICAgIGlmIChtX3BTaGFkaW5nICYmIG1fcFNoYWRpbmctPm1fcERvY3VtZW50KSB7Ci0gICAgICAgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IG1fcFNoYWRpbmctPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOwotICAgICAgICBtX3BTaGFkaW5nID0gKENQREZfU2hhZGluZ1BhdHRlcm4qKXBEb2NQYWdlRGF0YS0+R2V0UGF0dGVybihtX3BTaGFkaW5nLT5tX3BTaGFkaW5nT2JqLCBtX3BTaGFkaW5nLT5tX2JTaGFkaW5nT2JqLCAmbV9wU2hhZGluZy0+bV9QYXJlbnRNYXRyaXgpOwotICAgIH0KLSAgICBtX01hdHJpeCA9IHBTcmNPYmotPm1fTWF0cml4OwotfQotdm9pZCBDUERGX1NoYWRpbmdPYmplY3Q6OlRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpCi17Ci0gICAgaWYgKCFtX0NsaXBQYXRoLklzTnVsbCgpKSB7Ci0gICAgICAgIG1fQ2xpcFBhdGguR2V0TW9kaWZ5KCk7Ci0gICAgICAgIG1fQ2xpcFBhdGguVHJhbnNmb3JtKG1hdHJpeCk7Ci0gICAgfQotICAgIG1fTWF0cml4LkNvbmNhdChtYXRyaXgpOwotICAgIGlmICghbV9DbGlwUGF0aC5Jc051bGwoKSkgewotICAgICAgICBDYWxjQm91bmRpbmdCb3goKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtYXRyaXguVHJhbnNmb3JtUmVjdChtX0xlZnQsIG1fUmlnaHQsIG1fVG9wLCBtX0JvdHRvbSk7Ci0gICAgfQotfQotdm9pZCBDUERGX1NoYWRpbmdPYmplY3Q6OkNhbGNCb3VuZGluZ0JveCgpCi17Ci0gICAgaWYgKG1fQ2xpcFBhdGguSXNOdWxsKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBtX0NsaXBQYXRoLkdldENsaXBCb3goKTsKLSAgICBtX0xlZnQgPSByZWN0LmxlZnQ7Ci0gICAgbV9Cb3R0b20gPSByZWN0LmJvdHRvbTsKLSAgICBtX1JpZ2h0ID0gcmVjdC5yaWdodDsKLSAgICBtX1RvcCA9IHJlY3QudG9wOwotfQotQ1BERl9Gb3JtT2JqZWN0Ojp+Q1BERl9Gb3JtT2JqZWN0KCkKLXsKLSAgICBkZWxldGUgbV9wRm9ybTsKLX0KLXZvaWQgQ1BERl9Gb3JtT2JqZWN0OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIG1fRm9ybU1hdHJpeC5Db25jYXQobWF0cml4KTsKK3ZvaWQgQ1BERl9TaGFkaW5nT2JqZWN0OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KSB7CisgIGlmICghbV9DbGlwUGF0aC5Jc051bGwoKSkgeworICAgIG1fQ2xpcFBhdGguR2V0TW9kaWZ5KCk7CisgICAgbV9DbGlwUGF0aC5UcmFuc2Zvcm0obWF0cml4KTsKKyAgfQorICBtX01hdHJpeC5Db25jYXQobWF0cml4KTsKKyAgaWYgKCFtX0NsaXBQYXRoLklzTnVsbCgpKSB7CiAgICAgQ2FsY0JvdW5kaW5nQm94KCk7CisgIH0gZWxzZSB7CisgICAgbWF0cml4LlRyYW5zZm9ybVJlY3QobV9MZWZ0LCBtX1JpZ2h0LCBtX1RvcCwgbV9Cb3R0b20pOworICB9CiB9Ci12b2lkIENQREZfRm9ybU9iamVjdDo6Q29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjKQotewotICAgIGNvbnN0IENQREZfRm9ybU9iamVjdCogcFNyY09iaiA9IChjb25zdCBDUERGX0Zvcm1PYmplY3QqKXBTcmM7Ci0gICAgZGVsZXRlIG1fcEZvcm07Ci0gICAgbV9wRm9ybSA9IHBTcmNPYmotPm1fcEZvcm0tPkNsb25lKCk7Ci0gICAgbV9Gb3JtTWF0cml4ID0gcFNyY09iai0+bV9Gb3JtTWF0cml4Owordm9pZCBDUERGX1NoYWRpbmdPYmplY3Q6OkNhbGNCb3VuZGluZ0JveCgpIHsKKyAgaWYgKG1fQ2xpcFBhdGguSXNOdWxsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gbV9DbGlwUGF0aC5HZXRDbGlwQm94KCk7CisgIG1fTGVmdCA9IHJlY3QubGVmdDsKKyAgbV9Cb3R0b20gPSByZWN0LmJvdHRvbTsKKyAgbV9SaWdodCA9IHJlY3QucmlnaHQ7CisgIG1fVG9wID0gcmVjdC50b3A7CiB9Ci12b2lkIENQREZfRm9ybU9iamVjdDo6Q2FsY0JvdW5kaW5nQm94KCkKLXsKLSAgICBDRlhfRmxvYXRSZWN0IGZvcm1fcmVjdCA9IG1fcEZvcm0tPkNhbGNCb3VuZGluZ0JveCgpOwotICAgIGZvcm1fcmVjdC5UcmFuc2Zvcm0oJm1fRm9ybU1hdHJpeCk7Ci0gICAgbV9MZWZ0ID0gZm9ybV9yZWN0LmxlZnQ7Ci0gICAgbV9Cb3R0b20gPSBmb3JtX3JlY3QuYm90dG9tOwotICAgIG1fUmlnaHQgPSBmb3JtX3JlY3QucmlnaHQ7Ci0gICAgbV9Ub3AgPSBmb3JtX3JlY3QudG9wOworQ1BERl9Gb3JtT2JqZWN0Ojp+Q1BERl9Gb3JtT2JqZWN0KCkgeworICBkZWxldGUgbV9wRm9ybTsKK30KK3ZvaWQgQ1BERl9Gb3JtT2JqZWN0OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KSB7CisgIG1fRm9ybU1hdHJpeC5Db25jYXQobWF0cml4KTsKKyAgQ2FsY0JvdW5kaW5nQm94KCk7Cit9Cit2b2lkIENQREZfRm9ybU9iamVjdDo6Q29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjKSB7CisgIGNvbnN0IENQREZfRm9ybU9iamVjdCogcFNyY09iaiA9IChjb25zdCBDUERGX0Zvcm1PYmplY3QqKXBTcmM7CisgIGRlbGV0ZSBtX3BGb3JtOworICBtX3BGb3JtID0gcFNyY09iai0+bV9wRm9ybS0+Q2xvbmUoKTsKKyAgbV9Gb3JtTWF0cml4ID0gcFNyY09iai0+bV9Gb3JtTWF0cml4OworfQordm9pZCBDUERGX0Zvcm1PYmplY3Q6OkNhbGNCb3VuZGluZ0JveCgpIHsKKyAgQ0ZYX0Zsb2F0UmVjdCBmb3JtX3JlY3QgPSBtX3BGb3JtLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgZm9ybV9yZWN0LlRyYW5zZm9ybSgmbV9Gb3JtTWF0cml4KTsKKyAgbV9MZWZ0ID0gZm9ybV9yZWN0LmxlZnQ7CisgIG1fQm90dG9tID0gZm9ybV9yZWN0LmJvdHRvbTsKKyAgbV9SaWdodCA9IGZvcm1fcmVjdC5yaWdodDsKKyAgbV9Ub3AgPSBmb3JtX3JlY3QudG9wOwogfQogQ1BERl9QYWdlT2JqZWN0czo6Q1BERl9QYWdlT2JqZWN0cyhGWF9CT09MIGJSZWxlYXNlTWVtYmVycykKICAgICA6IG1fcEZvcm1EaWN0KG51bGxwdHIpLApAQCAtNzMxLDM0NSArNjgzLDMzOSBAQAogICAgICAgbV9iQmFja2dyb3VuZEFscGhhTmVlZGVkKEZBTFNFKSwKICAgICAgIG1fYlJlbGVhc2VNZW1iZXJzKGJSZWxlYXNlTWVtYmVycyksCiAgICAgICBtX3BQYXJzZXIobnVsbHB0ciksCi0gICAgICBtX1BhcnNlU3RhdGUoQ09OVEVOVF9OT1RfUEFSU0VEKQoteworICAgICAgbV9QYXJzZVN0YXRlKENPTlRFTlRfTk9UX1BBUlNFRCkge30KK0NQREZfUGFnZU9iamVjdHM6On5DUERGX1BhZ2VPYmplY3RzKCkgeworICBkZWxldGUgbV9wUGFyc2VyOworICBpZiAoIW1fYlJlbGVhc2VNZW1iZXJzKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0TGlzdC5HZXRIZWFkUG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIGRlbGV0ZSAoQ1BERl9QYWdlT2JqZWN0KiltX09iamVjdExpc3QuR2V0TmV4dChwb3MpOworICB9CiB9Ci1DUERGX1BhZ2VPYmplY3RzOjp+Q1BERl9QYWdlT2JqZWN0cygpCi17Ci0gICAgZGVsZXRlIG1fcFBhcnNlcjsKLSAgICBpZiAoIW1fYlJlbGVhc2VNZW1iZXJzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgZGVsZXRlIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7Ci0gICAgfQotfQotdm9pZCBDUERGX1BhZ2VPYmplY3RzOjpDb250aW51ZVBhcnNlKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmIChtX3BQYXJzZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcFBhcnNlci0+Q29udGludWUocFBhdXNlKTsKLSAgICBpZiAobV9wUGFyc2VyLT5HZXRTdGF0dXMoKSA9PSBDUERGX0NvbnRlbnRQYXJzZXI6OkRvbmUpIHsKLSAgICAgICAgbV9QYXJzZVN0YXRlID0gQ09OVEVOVF9QQVJTRUQ7Ci0gICAgICAgIGRlbGV0ZSBtX3BQYXJzZXI7Ci0gICAgICAgIG1fcFBhcnNlciA9IE5VTEw7Ci0gICAgfQotfQotRlhfUE9TSVRJT04gQ1BERl9QYWdlT2JqZWN0czo6SW5zZXJ0T2JqZWN0KEZYX1BPU0lUSU9OIHBvc0luc2VydEFmdGVyLCBDUERGX1BhZ2VPYmplY3QqIHBOZXdPYmplY3QpCi17Ci0gICAgaWYgKCFwb3NJbnNlcnRBZnRlcikgewotICAgICAgICByZXR1cm4gbV9PYmplY3RMaXN0LkFkZEhlYWQocE5ld09iamVjdCk7Ci0gICAgfQotICAgIHJldHVybiBtX09iamVjdExpc3QuSW5zZXJ0QWZ0ZXIocG9zSW5zZXJ0QWZ0ZXIsIHBOZXdPYmplY3QpOwotfQotaW50IENQREZfUGFnZU9iamVjdHM6OkdldE9iamVjdEluZGV4KENQREZfUGFnZU9iamVjdCogcE9iaikgY29uc3QKLXsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0TGlzdC5HZXRIZWFkUG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfUGFnZU9iamVjdCogcFRoaXNPYmogPSAoQ1BERl9QYWdlT2JqZWN0KiltX09iamVjdExpc3QuR2V0TmV4dChwb3MpOwotICAgICAgICBpZiAocFRoaXNPYmogPT0gcE9iaikgewotICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0gICAgICAgIGluZGV4ICsrOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci1DUERGX1BhZ2VPYmplY3QqIENQREZfUGFnZU9iamVjdHM6OkdldE9iamVjdEJ5SW5kZXgoaW50IGluZGV4KSBjb25zdAotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0TGlzdC5GaW5kSW5kZXgoaW5kZXgpOwotICAgIGlmIChwb3MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXRBdChwb3MpOwotfQotdm9pZCBDUERGX1BhZ2VPYmplY3RzOjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0TGlzdC5HZXRIZWFkUG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7Ci0gICAgICAgIHBPYmotPlRyYW5zZm9ybShtYXRyaXgpOwotICAgIH0KLX0KLUNGWF9GbG9hdFJlY3QgQ1BERl9QYWdlT2JqZWN0czo6Q2FsY0JvdW5kaW5nQm94KCkgY29uc3QKLXsKLSAgICBpZiAobV9PYmplY3RMaXN0LkdldENvdW50KCkgPT0gMCkgewotICAgICAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAwLCAwKTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tOwotICAgIGxlZnQgPSBib3R0b20gPSAxMDAwMDAwICogMS4wZjsKLSAgICByaWdodCA9IHRvcCA9IC0xMDAwMDAwICogMS4wZjsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX09iamVjdExpc3QuR2V0SGVhZFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPSAoQ1BERl9QYWdlT2JqZWN0KiltX09iamVjdExpc3QuR2V0TmV4dChwb3MpOwotICAgICAgICBpZiAobGVmdCA+IHBPYmotPm1fTGVmdCkgewotICAgICAgICAgICAgbGVmdCA9IHBPYmotPm1fTGVmdDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmlnaHQgPCBwT2JqLT5tX1JpZ2h0KSB7Ci0gICAgICAgICAgICByaWdodCA9IHBPYmotPm1fUmlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRvcCA8IHBPYmotPm1fVG9wKSB7Ci0gICAgICAgICAgICB0b3AgPSBwT2JqLT5tX1RvcDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYm90dG9tID4gcE9iai0+bV9Cb3R0b20pIHsKLSAgICAgICAgICAgIGJvdHRvbSA9IHBPYmotPm1fQm90dG9tOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBDRlhfRmxvYXRSZWN0KGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7Ci19Ci12b2lkIENQREZfUGFnZU9iamVjdHM6OkxvYWRUcmFuc0luZm8oKQotewotICAgIGlmIChtX3BGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwR3JvdXAgPSBtX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiR3JvdXAiKSk7Ci0gICAgaWYgKHBHcm91cCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBHcm91cC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTIikpICE9IEZYX0JTVFJDKCJUcmFuc3BhcmVuY3kiKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fVHJhbnNwYXJlbmN5IHw9IFBERlRSQU5TX0dST1VQOwotICAgIGlmIChwR3JvdXAtPkdldEludGVnZXIoRlhfQlNUUkMoIkkiKSkpIHsKLSAgICAgICAgbV9UcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfSVNPTEFURUQ7Ci0gICAgfQotICAgIGlmIChwR3JvdXAtPkdldEludGVnZXIoRlhfQlNUUkMoIksiKSkpIHsKLSAgICAgICAgbV9UcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfS05PQ0tPVVQ7Ci0gICAgfQotfQotdm9pZCBDUERGX1BhZ2VPYmplY3RzOjpDbGVhckNhY2hlT2JqZWN0cygpCi17Ci0gICAgbV9QYXJzZVN0YXRlID0gQ09OVEVOVF9OT1RfUEFSU0VEOwordm9pZCBDUERGX1BhZ2VPYmplY3RzOjpDb250aW51ZVBhcnNlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGlmIChtX3BQYXJzZXIgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BQYXJzZXItPkNvbnRpbnVlKHBQYXVzZSk7CisgIGlmIChtX3BQYXJzZXItPkdldFN0YXR1cygpID09IENQREZfQ29udGVudFBhcnNlcjo6RG9uZSkgeworICAgIG1fUGFyc2VTdGF0ZSA9IENPTlRFTlRfUEFSU0VEOwogICAgIGRlbGV0ZSBtX3BQYXJzZXI7CiAgICAgbV9wUGFyc2VyID0gTlVMTDsKLSAgICBpZiAobV9iUmVsZWFzZU1lbWJlcnMpIHsKLSAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOwotICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICBkZWxldGUgKENQREZfUGFnZU9iamVjdCopbV9PYmplY3RMaXN0LkdldE5leHQocG9zKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX09iamVjdExpc3QuUmVtb3ZlQWxsKCk7CisgIH0KIH0KLUNQREZfUGFnZTo6Q1BERl9QYWdlKCkKLXsKLSAgICBtX3BQYWdlUmVuZGVyID0gTlVMTDsKK0ZYX1BPU0lUSU9OIENQREZfUGFnZU9iamVjdHM6Okluc2VydE9iamVjdChGWF9QT1NJVElPTiBwb3NJbnNlcnRBZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBOZXdPYmplY3QpIHsKKyAgaWYgKCFwb3NJbnNlcnRBZnRlcikgeworICAgIHJldHVybiBtX09iamVjdExpc3QuQWRkSGVhZChwTmV3T2JqZWN0KTsKKyAgfQorICByZXR1cm4gbV9PYmplY3RMaXN0Lkluc2VydEFmdGVyKHBvc0luc2VydEFmdGVyLCBwTmV3T2JqZWN0KTsKIH0KLXZvaWQgQ1BERl9QYWdlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIEZYX0JPT0wgYlBhZ2VDYWNoZSkKLXsKLSAgICBtX3BEb2N1bWVudCA9IChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQ7Ci0gICAgbV9wRm9ybURpY3QgPSBwUGFnZURpY3Q7Ci0gICAgaWYgKGJQYWdlQ2FjaGUpIHsKLSAgICAgICAgbV9wUGFnZVJlbmRlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCktPkNyZWF0ZVBhZ2VDYWNoZSh0aGlzKTsKK2ludCBDUERGX1BhZ2VPYmplY3RzOjpHZXRPYmplY3RJbmRleChDUERGX1BhZ2VPYmplY3QqIHBPYmopIGNvbnN0IHsKKyAgaW50IGluZGV4ID0gMDsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgQ1BERl9QYWdlT2JqZWN0KiBwVGhpc09iaiA9IChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7CisgICAgaWYgKHBUaGlzT2JqID09IHBPYmopIHsKKyAgICAgIHJldHVybiBpbmRleDsKICAgICB9Ci0gICAgaWYgKHBQYWdlRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIG1fUGFnZVdpZHRoID0gbV9QYWdlSGVpZ2h0ID0gMTAwICogMS4wZjsKLSAgICAgICAgbV9wUGFnZVJlc291cmNlcyA9IG1fcFJlc291cmNlcyA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBhZ2VBdHRyID0gR2V0UGFnZUF0dHIoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKLSAgICBtX3BSZXNvdXJjZXMgPSBwYWdlQXR0ciA/IHBhZ2VBdHRyLT5HZXREaWN0KCkgOiBOVUxMOwotICAgIG1fcFBhZ2VSZXNvdXJjZXMgPSBtX3BSZXNvdXJjZXM7Ci0gICAgQ1BERl9PYmplY3QqIHBSb3RhdGUgPSBHZXRQYWdlQXR0cihGWF9CU1RSQygiUm90YXRlIikpOwotICAgIGludCByb3RhdGUgPSAwOwotICAgIGlmIChwUm90YXRlKSB7Ci0gICAgICAgIHJvdGF0ZSA9IHBSb3RhdGUtPkdldEludGVnZXIoKSAvIDkwICUgNDsKLSAgICB9Ci0gICAgaWYgKHJvdGF0ZSA8IDApIHsKLSAgICAgICAgcm90YXRlICs9IDQ7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBNZWRpYUJveCwgKnBDcm9wQm94OwotICAgIHBNZWRpYUJveCA9IChDUERGX0FycmF5KilHZXRQYWdlQXR0cihGWF9CU1RSQygiTWVkaWFCb3giKSk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBtZWRpYWJveDsKLSAgICBpZiAocE1lZGlhQm94KSB7Ci0gICAgICAgIG1lZGlhYm94ID0gcE1lZGlhQm94LT5HZXRSZWN0KCk7Ci0gICAgICAgIG1lZGlhYm94Lk5vcm1hbGl6ZSgpOwotICAgIH0KLSAgICBpZiAobWVkaWFib3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIG1lZGlhYm94ID0gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCA2MTIsIDc5Mik7Ci0gICAgfQotICAgIHBDcm9wQm94ID0gKENQREZfQXJyYXkqKUdldFBhZ2VBdHRyKEZYX0JTVFJDKCJDcm9wQm94IikpOwotICAgIGlmIChwQ3JvcEJveCkgewotICAgICAgICBtX0JCb3ggPSBwQ3JvcEJveC0+R2V0UmVjdCgpOwotICAgICAgICBtX0JCb3guTm9ybWFsaXplKCk7Ci0gICAgfQotICAgIGlmIChtX0JCb3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIG1fQkJveCA9IG1lZGlhYm94OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fQkJveC5JbnRlcnNlY3QobWVkaWFib3gpOwotICAgIH0KLSAgICBpZiAocm90YXRlICUgMikgewotICAgICAgICBtX1BhZ2VIZWlnaHQgPSBtX0JCb3gucmlnaHQgLSBtX0JCb3gubGVmdDsKLSAgICAgICAgbV9QYWdlV2lkdGggPSBtX0JCb3gudG9wIC0gbV9CQm94LmJvdHRvbTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1BhZ2VXaWR0aCA9IG1fQkJveC5yaWdodCAtIG1fQkJveC5sZWZ0OwotICAgICAgICBtX1BhZ2VIZWlnaHQgPSBtX0JCb3gudG9wIC0gbV9CQm94LmJvdHRvbTsKLSAgICB9Ci0gICAgc3dpdGNoIChyb3RhdGUpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgbV9QYWdlTWF0cml4LlNldCgxLjBmLCAwLCAwLCAxLjBmLCAtbV9CQm94LmxlZnQsIC1tX0JCb3guYm90dG9tKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBtX1BhZ2VNYXRyaXguU2V0KDAsIC0xLjBmLCAxLjBmLCAwLCAtbV9CQm94LmJvdHRvbSwgbV9CQm94LnJpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBtX1BhZ2VNYXRyaXguU2V0KC0xLjBmLCAwLCAwLCAtMS4wZiwgbV9CQm94LnJpZ2h0LCBtX0JCb3gudG9wKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBtX1BhZ2VNYXRyaXguU2V0KDAsIDEuMGYsIC0xLjBmLCAwLCBtX0JCb3gudG9wLCAtbV9CQm94LmxlZnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG1fVHJhbnNwYXJlbmN5ID0gUERGVFJBTlNfSVNPTEFURUQ7Ci0gICAgTG9hZFRyYW5zSW5mbygpOworICAgIGluZGV4Kys7CisgIH0KKyAgcmV0dXJuIC0xOwogfQotdm9pZCBDUERGX1BhZ2U6OlN0YXJ0UGFyc2UoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLCBGWF9CT09MIGJSZVBhcnNlKQotewotICAgIGlmIChiUmVQYXJzZSkgewotICAgICAgICBDbGVhckNhY2hlT2JqZWN0cygpOworQ1BERl9QYWdlT2JqZWN0KiBDUERGX1BhZ2VPYmplY3RzOjpHZXRPYmplY3RCeUluZGV4KGludCBpbmRleCkgY29uc3QgeworICBGWF9QT1NJVElPTiBwb3MgPSBtX09iamVjdExpc3QuRmluZEluZGV4KGluZGV4KTsKKyAgaWYgKHBvcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXRBdChwb3MpOworfQordm9pZCBDUERGX1BhZ2VPYmplY3RzOjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KSB7CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0TGlzdC5HZXRIZWFkUG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7CisgICAgcE9iai0+VHJhbnNmb3JtKG1hdHJpeCk7CisgIH0KK30KK0NGWF9GbG9hdFJlY3QgQ1BERl9QYWdlT2JqZWN0czo6Q2FsY0JvdW5kaW5nQm94KCkgY29uc3QgeworICBpZiAobV9PYmplY3RMaXN0LkdldENvdW50KCkgPT0gMCkgeworICAgIHJldHVybiBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOworICB9CisgIEZYX0ZMT0FUIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbTsKKyAgbGVmdCA9IGJvdHRvbSA9IDEwMDAwMDAgKiAxLjBmOworICByaWdodCA9IHRvcCA9IC0xMDAwMDAwICogMS4wZjsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gKENQREZfUGFnZU9iamVjdCopbV9PYmplY3RMaXN0LkdldE5leHQocG9zKTsKKyAgICBpZiAobGVmdCA+IHBPYmotPm1fTGVmdCkgeworICAgICAgbGVmdCA9IHBPYmotPm1fTGVmdDsKICAgICB9Ci0gICAgaWYgKG1fUGFyc2VTdGF0ZSA9PSBDT05URU5UX1BBUlNFRCB8fCBtX1BhcnNlU3RhdGUgPT0gQ09OVEVOVF9QQVJTSU5HKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAocmlnaHQgPCBwT2JqLT5tX1JpZ2h0KSB7CisgICAgICByaWdodCA9IHBPYmotPm1fUmlnaHQ7CiAgICAgfQotICAgIG1fcFBhcnNlciA9IG5ldyBDUERGX0NvbnRlbnRQYXJzZXI7Ci0gICAgbV9wUGFyc2VyLT5TdGFydCh0aGlzLCBwT3B0aW9ucyk7Ci0gICAgbV9QYXJzZVN0YXRlID0gQ09OVEVOVF9QQVJTSU5HOwotfQotdm9pZCBDUERGX1BhZ2U6OlBhcnNlQ29udGVudChDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMsIEZYX0JPT0wgYlJlUGFyc2UpCi17Ci0gICAgU3RhcnRQYXJzZShwT3B0aW9ucywgYlJlUGFyc2UpOwotICAgIENvbnRpbnVlUGFyc2UoTlVMTCk7Ci19Ci1DUERGX1BhZ2U6On5DUERGX1BhZ2UoKQotewotICAgIGlmIChtX3BQYWdlUmVuZGVyKSB7Ci0gICAgICAgIElQREZfUmVuZGVyTW9kdWxlKiBwTW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRSZW5kZXJNb2R1bGUoKTsKLSAgICAgICAgcE1vZHVsZS0+RGVzdHJveVBhZ2VDYWNoZShtX3BQYWdlUmVuZGVyKTsKKyAgICBpZiAodG9wIDwgcE9iai0+bV9Ub3ApIHsKKyAgICAgIHRvcCA9IHBPYmotPm1fVG9wOwogICAgIH0KLX0KLUNQREZfT2JqZWN0KiBGUERGQVBJX0dldFBhZ2VBdHRyKENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpCi17Ci0gICAgaW50IGxldmVsID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBQYWdlRGljdC0+R2V0RWxlbWVudFZhbHVlKG5hbWUpOwotICAgICAgICBpZiAocE9iaikgewotICAgICAgICAgICAgcmV0dXJuIHBPYmo7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50ID0gcFBhZ2VEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJQYXJlbnQiKSk7Ci0gICAgICAgIGlmICghcFBhcmVudCB8fCBwUGFyZW50ID09IHBQYWdlRGljdCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcFBhZ2VEaWN0ID0gcFBhcmVudDsKLSAgICAgICAgbGV2ZWwgKys7Ci0gICAgICAgIGlmIChsZXZlbCA9PSAxMDAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgIGlmIChib3R0b20gPiBwT2JqLT5tX0JvdHRvbSkgeworICAgICAgYm90dG9tID0gcE9iai0+bV9Cb3R0b207CiAgICAgfQorICB9CisgIHJldHVybiBDRlhfRmxvYXRSZWN0KGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7CiB9Ci1DUERGX09iamVjdCogQ1BERl9QYWdlOjpHZXRQYWdlQXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEZQREZBUElfR2V0UGFnZUF0dHIobV9wRm9ybURpY3QsIG5hbWUpOwordm9pZCBDUERGX1BhZ2VPYmplY3RzOjpMb2FkVHJhbnNJbmZvKCkgeworICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBHcm91cCA9IG1fcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJHcm91cCIpKTsKKyAgaWYgKHBHcm91cCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChwR3JvdXAtPkdldFN0cmluZyhGWF9CU1RSQygiUyIpKSAhPSBGWF9CU1RSQygiVHJhbnNwYXJlbmN5IikpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9UcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfR1JPVVA7CisgIGlmIChwR3JvdXAtPkdldEludGVnZXIoRlhfQlNUUkMoIkkiKSkpIHsKKyAgICBtX1RyYW5zcGFyZW5jeSB8PSBQREZUUkFOU19JU09MQVRFRDsKKyAgfQorICBpZiAocEdyb3VwLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJLIikpKSB7CisgICAgbV9UcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfS05PQ0tPVVQ7CisgIH0KIH0KLUNQREZfRm9ybTo6Q1BERl9Gb3JtKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsIENQREZfU3RyZWFtKiBwRm9ybVN0cmVhbSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50UmVzb3VyY2VzKQotewotICAgIG1fcERvY3VtZW50ID0gcERvYzsKLSAgICBtX3BGb3JtU3RyZWFtID0gcEZvcm1TdHJlYW07Ci0gICAgbV9wRm9ybURpY3QgPSBwRm9ybVN0cmVhbSA/IHBGb3JtU3RyZWFtLT5HZXREaWN0KCkgOiBOVUxMOwotICAgIG1fcFJlc291cmNlcyA9IG1fcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7Ci0gICAgbV9wUGFnZVJlc291cmNlcyA9IHBQYWdlUmVzb3VyY2VzOwotICAgIGlmIChtX3BSZXNvdXJjZXMgPT0gTlVMTCkgewotICAgICAgICBtX3BSZXNvdXJjZXMgPSBwUGFyZW50UmVzb3VyY2VzOwotICAgIH0KLSAgICBpZiAobV9wUmVzb3VyY2VzID09IE5VTEwpIHsKLSAgICAgICAgbV9wUmVzb3VyY2VzID0gcFBhZ2VSZXNvdXJjZXM7Ci0gICAgfQotICAgIG1fVHJhbnNwYXJlbmN5ID0gMDsKLSAgICBMb2FkVHJhbnNJbmZvKCk7Ci19Ci1DUERGX0Zvcm06On5DUERGX0Zvcm0oKQotewotfQotdm9pZCBDUERGX0Zvcm06OlN0YXJ0UGFyc2UoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLCBDRlhfQWZmaW5lTWF0cml4KiBwUGFyZW50TWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgaW50IGxldmVsKQotewotICAgIGlmIChtX1BhcnNlU3RhdGUgPT0gQ09OVEVOVF9QQVJTRUQgfHwgbV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0lORykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcFBhcnNlciA9IG5ldyBDUERGX0NvbnRlbnRQYXJzZXI7Ci0gICAgbV9wUGFyc2VyLT5TdGFydCh0aGlzLCBwR3JhcGhpY1N0YXRlcywgcFBhcmVudE1hdHJpeCwgcFR5cGUzQ2hhciwgcE9wdGlvbnMsIGxldmVsKTsKLSAgICBtX1BhcnNlU3RhdGUgPSBDT05URU5UX1BBUlNJTkc7Ci19Ci12b2lkIENQREZfRm9ybTo6UGFyc2VDb250ZW50KENQREZfQWxsU3RhdGVzKiBwR3JhcGhpY1N0YXRlcywgQ0ZYX0FmZmluZU1hdHJpeCogcFBhcmVudE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgaW50IGxldmVsKQotewotICAgIFN0YXJ0UGFyc2UocEdyYXBoaWNTdGF0ZXMsIHBQYXJlbnRNYXRyaXgsIHBUeXBlM0NoYXIsIHBPcHRpb25zLCBsZXZlbCk7Ci0gICAgQ29udGludWVQYXJzZShOVUxMKTsKLX0KLUNQREZfRm9ybSogQ1BERl9Gb3JtOjpDbG9uZSgpIGNvbnN0Ci17Ci0gICAgQ1BERl9Gb3JtKiBwQ2xvbmUgPSBuZXcgQ1BERl9Gb3JtKG1fcERvY3VtZW50LCBtX3BQYWdlUmVzb3VyY2VzLCBtX3BGb3JtU3RyZWFtLCBtX3BSZXNvdXJjZXMpOwordm9pZCBDUERGX1BhZ2VPYmplY3RzOjpDbGVhckNhY2hlT2JqZWN0cygpIHsKKyAgbV9QYXJzZVN0YXRlID0gQ09OVEVOVF9OT1RfUEFSU0VEOworICBkZWxldGUgbV9wUGFyc2VyOworICBtX3BQYXJzZXIgPSBOVUxMOworICBpZiAobV9iUmVsZWFzZU1lbWJlcnMpIHsKICAgICBGWF9QT1NJVElPTiBwb3MgPSBtX09iamVjdExpc3QuR2V0SGVhZFBvc2l0aW9uKCk7CiAgICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPSAoQ1BERl9QYWdlT2JqZWN0KiltX09iamVjdExpc3QuR2V0TmV4dChwb3MpOwotICAgICAgICBwQ2xvbmUtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBPYmotPkNsb25lKCkpOworICAgICAgZGVsZXRlIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7CiAgICAgfQotICAgIHJldHVybiBwQ2xvbmU7CisgIH0KKyAgbV9PYmplY3RMaXN0LlJlbW92ZUFsbCgpOwogfQotdm9pZCBDUERGX1BhZ2U6OkdldERpc3BsYXlNYXRyaXgoQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4LCBpbnQgeFBvcywgaW50IHlQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFNpemUsIGludCB5U2l6ZSwgaW50IGlSb3RhdGUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fUGFnZVdpZHRoID09IDAgfHwgbV9QYWdlSGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IGRpc3BsYXlfbWF0cml4OwotICAgIGludCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyOwotICAgIGlSb3RhdGUgJT0gNDsKLSAgICBzd2l0Y2ggKGlSb3RhdGUpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgeDAgPSB4UG9zOwotICAgICAgICAgICAgeTAgPSB5UG9zICsgeVNpemU7Ci0gICAgICAgICAgICB4MSA9IHhQb3M7Ci0gICAgICAgICAgICB5MSA9IHlQb3M7Ci0gICAgICAgICAgICB4MiA9IHhQb3MgKyB4U2l6ZTsKLSAgICAgICAgICAgIHkyID0geVBvcyArIHlTaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHgwID0geFBvczsKLSAgICAgICAgICAgIHkwID0geVBvczsKLSAgICAgICAgICAgIHgxID0geFBvcyArIHhTaXplOwotICAgICAgICAgICAgeTEgPSB5UG9zOwotICAgICAgICAgICAgeDIgPSB4UG9zOwotICAgICAgICAgICAgeTIgPSB5UG9zICsgeVNpemU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgeDAgPSB4UG9zICsgeFNpemU7Ci0gICAgICAgICAgICB5MCA9IHlQb3M7Ci0gICAgICAgICAgICB4MSA9IHhQb3MgKyB4U2l6ZTsKLSAgICAgICAgICAgIHkxID0geVBvcyArIHlTaXplOwotICAgICAgICAgICAgeDIgPSB4UG9zOwotICAgICAgICAgICAgeTIgPSB5UG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHgwID0geFBvcyArIHhTaXplOwotICAgICAgICAgICAgeTAgPSB5UG9zICsgeVNpemU7Ci0gICAgICAgICAgICB4MSA9IHhQb3M7Ci0gICAgICAgICAgICB5MSA9IHlQb3MgKyB5U2l6ZTsKLSAgICAgICAgICAgIHgyID0geFBvcyArIHhTaXplOwotICAgICAgICAgICAgeTIgPSB5UG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRpc3BsYXlfbWF0cml4LlNldChGWFNZU19EaXYoKEZYX0ZMT0FUKSh4MiAtIHgwKSwgbV9QYWdlV2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19EaXYoKEZYX0ZMT0FUKSh5MiAtIHkwKSwgbV9QYWdlV2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19EaXYoKEZYX0ZMT0FUKSh4MSAtIHgwKSwgbV9QYWdlSGVpZ2h0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfRGl2KChGWF9GTE9BVCkoeTEgLSB5MCksIG1fUGFnZUhlaWdodCksCi0gICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCl4MCwgKEZYX0ZMT0FUKXkwKTsKLSAgICBtYXRyaXggPSBtX1BhZ2VNYXRyaXg7Ci0gICAgbWF0cml4LkNvbmNhdChkaXNwbGF5X21hdHJpeCk7CitDUERGX1BhZ2U6OkNQREZfUGFnZSgpIHsKKyAgbV9wUGFnZVJlbmRlciA9IE5VTEw7CiB9Ci1DUERGX1BhcnNlT3B0aW9uczo6Q1BERl9QYXJzZU9wdGlvbnMoKQotewotICAgIG1fYlRleHRPbmx5ID0gRkFMU0U7Ci0gICAgbV9iTWFya2VkQ29udGVudCA9IFRSVUU7Ci0gICAgbV9iU2VwYXJhdGVGb3JtID0gVFJVRTsKLSAgICBtX2JEZWNvZGVJbmxpbmVJbWFnZSA9IEZBTFNFOwordm9pZCBDUERGX1BhZ2U6OkxvYWQoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWdlQ2FjaGUpIHsKKyAgbV9wRG9jdW1lbnQgPSAoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50OworICBtX3BGb3JtRGljdCA9IHBQYWdlRGljdDsKKyAgaWYgKGJQYWdlQ2FjaGUpIHsKKyAgICBtX3BQYWdlUmVuZGVyID0KKyAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRSZW5kZXJNb2R1bGUoKS0+Q3JlYXRlUGFnZUNhY2hlKHRoaXMpOworICB9CisgIGlmIChwUGFnZURpY3QgPT0gTlVMTCkgeworICAgIG1fUGFnZVdpZHRoID0gbV9QYWdlSGVpZ2h0ID0gMTAwICogMS4wZjsKKyAgICBtX3BQYWdlUmVzb3VyY2VzID0gbV9wUmVzb3VyY2VzID0gTlVMTDsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9PYmplY3QqIHBhZ2VBdHRyID0gR2V0UGFnZUF0dHIoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKKyAgbV9wUmVzb3VyY2VzID0gcGFnZUF0dHIgPyBwYWdlQXR0ci0+R2V0RGljdCgpIDogTlVMTDsKKyAgbV9wUGFnZVJlc291cmNlcyA9IG1fcFJlc291cmNlczsKKyAgQ1BERl9PYmplY3QqIHBSb3RhdGUgPSBHZXRQYWdlQXR0cihGWF9CU1RSQygiUm90YXRlIikpOworICBpbnQgcm90YXRlID0gMDsKKyAgaWYgKHBSb3RhdGUpIHsKKyAgICByb3RhdGUgPSBwUm90YXRlLT5HZXRJbnRlZ2VyKCkgLyA5MCAlIDQ7CisgIH0KKyAgaWYgKHJvdGF0ZSA8IDApIHsKKyAgICByb3RhdGUgKz0gNDsKKyAgfQorICBDUERGX0FycmF5ICpwTWVkaWFCb3gsICpwQ3JvcEJveDsKKyAgcE1lZGlhQm94ID0gKENQREZfQXJyYXkqKUdldFBhZ2VBdHRyKEZYX0JTVFJDKCJNZWRpYUJveCIpKTsKKyAgQ0ZYX0Zsb2F0UmVjdCBtZWRpYWJveDsKKyAgaWYgKHBNZWRpYUJveCkgeworICAgIG1lZGlhYm94ID0gcE1lZGlhQm94LT5HZXRSZWN0KCk7CisgICAgbWVkaWFib3guTm9ybWFsaXplKCk7CisgIH0KKyAgaWYgKG1lZGlhYm94LklzRW1wdHkoKSkgeworICAgIG1lZGlhYm94ID0gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCA2MTIsIDc5Mik7CisgIH0KKyAgcENyb3BCb3ggPSAoQ1BERl9BcnJheSopR2V0UGFnZUF0dHIoRlhfQlNUUkMoIkNyb3BCb3giKSk7CisgIGlmIChwQ3JvcEJveCkgeworICAgIG1fQkJveCA9IHBDcm9wQm94LT5HZXRSZWN0KCk7CisgICAgbV9CQm94Lk5vcm1hbGl6ZSgpOworICB9CisgIGlmIChtX0JCb3guSXNFbXB0eSgpKSB7CisgICAgbV9CQm94ID0gbWVkaWFib3g7CisgIH0gZWxzZSB7CisgICAgbV9CQm94LkludGVyc2VjdChtZWRpYWJveCk7CisgIH0KKyAgaWYgKHJvdGF0ZSAlIDIpIHsKKyAgICBtX1BhZ2VIZWlnaHQgPSBtX0JCb3gucmlnaHQgLSBtX0JCb3gubGVmdDsKKyAgICBtX1BhZ2VXaWR0aCA9IG1fQkJveC50b3AgLSBtX0JCb3guYm90dG9tOworICB9IGVsc2UgeworICAgIG1fUGFnZVdpZHRoID0gbV9CQm94LnJpZ2h0IC0gbV9CQm94LmxlZnQ7CisgICAgbV9QYWdlSGVpZ2h0ID0gbV9CQm94LnRvcCAtIG1fQkJveC5ib3R0b207CisgIH0KKyAgc3dpdGNoIChyb3RhdGUpIHsKKyAgICBjYXNlIDA6CisgICAgICBtX1BhZ2VNYXRyaXguU2V0KDEuMGYsIDAsIDAsIDEuMGYsIC1tX0JCb3gubGVmdCwgLW1fQkJveC5ib3R0b20pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgbV9QYWdlTWF0cml4LlNldCgwLCAtMS4wZiwgMS4wZiwgMCwgLW1fQkJveC5ib3R0b20sIG1fQkJveC5yaWdodCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBtX1BhZ2VNYXRyaXguU2V0KC0xLjBmLCAwLCAwLCAtMS4wZiwgbV9CQm94LnJpZ2h0LCBtX0JCb3gudG9wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIG1fUGFnZU1hdHJpeC5TZXQoMCwgMS4wZiwgLTEuMGYsIDAsIG1fQkJveC50b3AsIC1tX0JCb3gubGVmdCk7CisgICAgICBicmVhazsKKyAgfQorICBtX1RyYW5zcGFyZW5jeSA9IFBERlRSQU5TX0lTT0xBVEVEOworICBMb2FkVHJhbnNJbmZvKCk7Cit9Cit2b2lkIENQREZfUGFnZTo6U3RhcnRQYXJzZShDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMsIEZYX0JPT0wgYlJlUGFyc2UpIHsKKyAgaWYgKGJSZVBhcnNlKSB7CisgICAgQ2xlYXJDYWNoZU9iamVjdHMoKTsKKyAgfQorICBpZiAobV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0VEIHx8IG1fUGFyc2VTdGF0ZSA9PSBDT05URU5UX1BBUlNJTkcpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wUGFyc2VyID0gbmV3IENQREZfQ29udGVudFBhcnNlcjsKKyAgbV9wUGFyc2VyLT5TdGFydCh0aGlzLCBwT3B0aW9ucyk7CisgIG1fUGFyc2VTdGF0ZSA9IENPTlRFTlRfUEFSU0lORzsKK30KK3ZvaWQgQ1BERl9QYWdlOjpQYXJzZUNvbnRlbnQoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLCBGWF9CT09MIGJSZVBhcnNlKSB7CisgIFN0YXJ0UGFyc2UocE9wdGlvbnMsIGJSZVBhcnNlKTsKKyAgQ29udGludWVQYXJzZShOVUxMKTsKK30KK0NQREZfUGFnZTo6fkNQREZfUGFnZSgpIHsKKyAgaWYgKG1fcFBhZ2VSZW5kZXIpIHsKKyAgICBJUERGX1JlbmRlck1vZHVsZSogcE1vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCk7CisgICAgcE1vZHVsZS0+RGVzdHJveVBhZ2VDYWNoZShtX3BQYWdlUmVuZGVyKTsKKyAgfQorfQorQ1BERl9PYmplY3QqIEZQREZBUElfR2V0UGFnZUF0dHIoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIHsKKyAgaW50IGxldmVsID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IHBQYWdlRGljdC0+R2V0RWxlbWVudFZhbHVlKG5hbWUpOworICAgIGlmIChwT2JqKSB7CisgICAgICByZXR1cm4gcE9iajsKKyAgICB9CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50ID0gcFBhZ2VEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJQYXJlbnQiKSk7CisgICAgaWYgKCFwUGFyZW50IHx8IHBQYXJlbnQgPT0gcFBhZ2VEaWN0KSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcFBhZ2VEaWN0ID0gcFBhcmVudDsKKyAgICBsZXZlbCsrOworICAgIGlmIChsZXZlbCA9PSAxMDAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KK30KK0NQREZfT2JqZWN0KiBDUERGX1BhZ2U6OkdldFBhZ2VBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QgeworICByZXR1cm4gRlBERkFQSV9HZXRQYWdlQXR0cihtX3BGb3JtRGljdCwgbmFtZSk7Cit9CitDUERGX0Zvcm06OkNQREZfRm9ybShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwRm9ybVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudFJlc291cmNlcykgeworICBtX3BEb2N1bWVudCA9IHBEb2M7CisgIG1fcEZvcm1TdHJlYW0gPSBwRm9ybVN0cmVhbTsKKyAgbV9wRm9ybURpY3QgPSBwRm9ybVN0cmVhbSA/IHBGb3JtU3RyZWFtLT5HZXREaWN0KCkgOiBOVUxMOworICBtX3BSZXNvdXJjZXMgPSBtX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiUmVzb3VyY2VzIikpOworICBtX3BQYWdlUmVzb3VyY2VzID0gcFBhZ2VSZXNvdXJjZXM7CisgIGlmIChtX3BSZXNvdXJjZXMgPT0gTlVMTCkgeworICAgIG1fcFJlc291cmNlcyA9IHBQYXJlbnRSZXNvdXJjZXM7CisgIH0KKyAgaWYgKG1fcFJlc291cmNlcyA9PSBOVUxMKSB7CisgICAgbV9wUmVzb3VyY2VzID0gcFBhZ2VSZXNvdXJjZXM7CisgIH0KKyAgbV9UcmFuc3BhcmVuY3kgPSAwOworICBMb2FkVHJhbnNJbmZvKCk7Cit9CitDUERGX0Zvcm06On5DUERGX0Zvcm0oKSB7fQordm9pZCBDUERGX0Zvcm06OlN0YXJ0UGFyc2UoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFBhcmVudE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSB7CisgIGlmIChtX1BhcnNlU3RhdGUgPT0gQ09OVEVOVF9QQVJTRUQgfHwgbV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0lORykgeworICAgIHJldHVybjsKKyAgfQorICBtX3BQYXJzZXIgPSBuZXcgQ1BERl9Db250ZW50UGFyc2VyOworICBtX3BQYXJzZXItPlN0YXJ0KHRoaXMsIHBHcmFwaGljU3RhdGVzLCBwUGFyZW50TWF0cml4LCBwVHlwZTNDaGFyLCBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBsZXZlbCk7CisgIG1fUGFyc2VTdGF0ZSA9IENPTlRFTlRfUEFSU0lORzsKK30KK3ZvaWQgQ1BERl9Gb3JtOjpQYXJzZUNvbnRlbnQoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwUGFyZW50TWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpIHsKKyAgU3RhcnRQYXJzZShwR3JhcGhpY1N0YXRlcywgcFBhcmVudE1hdHJpeCwgcFR5cGUzQ2hhciwgcE9wdGlvbnMsIGxldmVsKTsKKyAgQ29udGludWVQYXJzZShOVUxMKTsKK30KK0NQREZfRm9ybSogQ1BERl9Gb3JtOjpDbG9uZSgpIGNvbnN0IHsKKyAgQ1BERl9Gb3JtKiBwQ2xvbmUgPQorICAgICAgbmV3IENQREZfRm9ybShtX3BEb2N1bWVudCwgbV9wUGFnZVJlc291cmNlcywgbV9wRm9ybVN0cmVhbSwgbV9wUmVzb3VyY2VzKTsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gKENQREZfUGFnZU9iamVjdCopbV9PYmplY3RMaXN0LkdldE5leHQocG9zKTsKKyAgICBwQ2xvbmUtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBPYmotPkNsb25lKCkpOworICB9CisgIHJldHVybiBwQ2xvbmU7Cit9Cit2b2lkIENQREZfUGFnZTo6R2V0RGlzcGxheU1hdHJpeChDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlSb3RhdGUpIGNvbnN0IHsKKyAgaWYgKG1fUGFnZVdpZHRoID09IDAgfHwgbV9QYWdlSGVpZ2h0ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0FmZmluZU1hdHJpeCBkaXNwbGF5X21hdHJpeDsKKyAgaW50IHgwLCB5MCwgeDEsIHkxLCB4MiwgeTI7CisgIGlSb3RhdGUgJT0gNDsKKyAgc3dpdGNoIChpUm90YXRlKSB7CisgICAgY2FzZSAwOgorICAgICAgeDAgPSB4UG9zOworICAgICAgeTAgPSB5UG9zICsgeVNpemU7CisgICAgICB4MSA9IHhQb3M7CisgICAgICB5MSA9IHlQb3M7CisgICAgICB4MiA9IHhQb3MgKyB4U2l6ZTsKKyAgICAgIHkyID0geVBvcyArIHlTaXplOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgeDAgPSB4UG9zOworICAgICAgeTAgPSB5UG9zOworICAgICAgeDEgPSB4UG9zICsgeFNpemU7CisgICAgICB5MSA9IHlQb3M7CisgICAgICB4MiA9IHhQb3M7CisgICAgICB5MiA9IHlQb3MgKyB5U2l6ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHgwID0geFBvcyArIHhTaXplOworICAgICAgeTAgPSB5UG9zOworICAgICAgeDEgPSB4UG9zICsgeFNpemU7CisgICAgICB5MSA9IHlQb3MgKyB5U2l6ZTsKKyAgICAgIHgyID0geFBvczsKKyAgICAgIHkyID0geVBvczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHgwID0geFBvcyArIHhTaXplOworICAgICAgeTAgPSB5UG9zICsgeVNpemU7CisgICAgICB4MSA9IHhQb3M7CisgICAgICB5MSA9IHlQb3MgKyB5U2l6ZTsKKyAgICAgIHgyID0geFBvcyArIHhTaXplOworICAgICAgeTIgPSB5UG9zOworICAgICAgYnJlYWs7CisgIH0KKyAgZGlzcGxheV9tYXRyaXguU2V0KEZYU1lTX0RpdigoRlhfRkxPQVQpKHgyIC0geDApLCBtX1BhZ2VXaWR0aCksCisgICAgICAgICAgICAgICAgICAgICBGWFNZU19EaXYoKEZYX0ZMT0FUKSh5MiAtIHkwKSwgbV9QYWdlV2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgRlhTWVNfRGl2KChGWF9GTE9BVCkoeDEgLSB4MCksIG1fUGFnZUhlaWdodCksCisgICAgICAgICAgICAgICAgICAgICBGWFNZU19EaXYoKEZYX0ZMT0FUKSh5MSAtIHkwKSwgbV9QYWdlSGVpZ2h0KSwgKEZYX0ZMT0FUKXgwLAorICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXkwKTsKKyAgbWF0cml4ID0gbV9QYWdlTWF0cml4OworICBtYXRyaXguQ29uY2F0KGRpc3BsYXlfbWF0cml4KTsKK30KK0NQREZfUGFyc2VPcHRpb25zOjpDUERGX1BhcnNlT3B0aW9ucygpIHsKKyAgbV9iVGV4dE9ubHkgPSBGQUxTRTsKKyAgbV9iTWFya2VkQ29udGVudCA9IFRSVUU7CisgIG1fYlNlcGFyYXRlRm9ybSA9IFRSVUU7CisgIG1fYkRlY29kZUlubGluZUltYWdlID0gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9jb2xvcnMuY3BwCmluZGV4IDE5ODA1NGUuLmMwNzgwNmMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9jb2xvcnMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9jb2xvcnMuY3BwCkBAIC0xMiwxNDM2ICsxMiwxNTQzIEBACiAKIG5hbWVzcGFjZSB7CiAKLXZvaWQgc1JHQl90b19BZG9iZUNNWUsoRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspCi17Ci0gICAgYyA9IDEuMGYgLSBSOwotICAgIG0gPSAxLjBmIC0gRzsKLSAgICB5ID0gMS4wZiAtIEI7Ci0gICAgayA9IGM7Ci0gICAgaWYgKG0gPCBrKSB7Ci0gICAgICAgIGsgPSBtOwotICAgIH0KLSAgICBpZiAoeSA8IGspIHsKLSAgICAgICAgayA9IHk7Ci0gICAgfQordm9pZCBzUkdCX3RvX0Fkb2JlQ01ZSyhGWF9GTE9BVCBSLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYywKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG0sCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB5LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaykgeworICBjID0gMS4wZiAtIFI7CisgIG0gPSAxLjBmIC0gRzsKKyAgeSA9IDEuMGYgLSBCOworICBrID0gYzsKKyAgaWYgKG0gPCBrKSB7CisgICAgayA9IG07CisgIH0KKyAgaWYgKHkgPCBrKSB7CisgICAgayA9IHk7CisgIH0KIH0KIAogaW50IENvbXBvbmVudHNGb3JGYW1pbHkoaW50IGZhbWlseSkgewotICAgIGlmIChmYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKQotICAgICAgICByZXR1cm4gMzsKLSAgICBpZiAoZmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpCi0gICAgICAgIHJldHVybiAxOwotICAgIHJldHVybiA0OworICBpZiAoZmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikKKyAgICByZXR1cm4gMzsKKyAgaWYgKGZhbWlseSA9PSBQREZDU19ERVZJQ0VHUkFZKQorICAgIHJldHVybiAxOworICByZXR1cm4gNDsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKIENQREZfRGV2aWNlQ1M6OkNQREZfRGV2aWNlQ1MoQ1BERl9Eb2N1bWVudCogcERvYywgaW50IGZhbWlseSkKLSAgICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgZmFtaWx5LCBDb21wb25lbnRzRm9yRmFtaWx5KGZhbWlseSkpIHsKLX0KKyAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBmYW1pbHksIENvbXBvbmVudHNGb3JGYW1pbHkoZmFtaWx5KSkge30KIAotRlhfQk9PTCBDUERGX0RldmljZUNTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewotICAgICAgICBSID0gcEJ1ZlswXTsKLSAgICAgICAgaWYgKFIgPCAwKSB7Ci0gICAgICAgICAgICBSID0gMDsKLSAgICAgICAgfSBlbHNlIGlmIChSID4gMSkgewotICAgICAgICAgICAgUiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgRyA9IHBCdWZbMV07Ci0gICAgICAgIGlmIChHIDwgMCkgewotICAgICAgICAgICAgRyA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoRyA+IDEpIHsKLSAgICAgICAgICAgIEcgPSAxOwotICAgICAgICB9Ci0gICAgICAgIEIgPSBwQnVmWzJdOwotICAgICAgICBpZiAoQiA8IDApIHsKLSAgICAgICAgICAgIEIgPSAwOwotICAgICAgICB9IGVsc2UgaWYgKEIgPiAxKSB7Ci0gICAgICAgICAgICBCID0gMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSkgewotICAgICAgICBSID0gKnBCdWY7Ci0gICAgICAgIGlmIChSIDwgMCkgewotICAgICAgICAgICAgUiA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoUiA+IDEpIHsKLSAgICAgICAgICAgIFIgPSAxOwotICAgICAgICB9Ci0gICAgICAgIEcgPSBCID0gUjsKLSAgICB9IGVsc2UgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKLSAgICAgICAgaWYgKCFtX2R3U3RkQ29udmVyc2lvbikgewotICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IocEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSwgUiwgRywgQik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCBrID0gcEJ1ZlszXTsKLSAgICAgICAgICAgIFIgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIHBCdWZbMF0gKyBrKTsKLSAgICAgICAgICAgIEcgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIHBCdWZbMV0gKyBrKTsKLSAgICAgICAgICAgIEIgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIHBCdWZbMl0gKyBrKTsKLSAgICAgICAgfQorRlhfQk9PTCBDUERGX0RldmljZUNTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IHsKKyAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgeworICAgIFIgPSBwQnVmWzBdOworICAgIGlmIChSIDwgMCkgeworICAgICAgUiA9IDA7CisgICAgfSBlbHNlIGlmIChSID4gMSkgeworICAgICAgUiA9IDE7CisgICAgfQorICAgIEcgPSBwQnVmWzFdOworICAgIGlmIChHIDwgMCkgeworICAgICAgRyA9IDA7CisgICAgfSBlbHNlIGlmIChHID4gMSkgeworICAgICAgRyA9IDE7CisgICAgfQorICAgIEIgPSBwQnVmWzJdOworICAgIGlmIChCIDwgMCkgeworICAgICAgQiA9IDA7CisgICAgfSBlbHNlIGlmIChCID4gMSkgeworICAgICAgQiA9IDE7CisgICAgfQorICB9IGVsc2UgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpIHsKKyAgICBSID0gKnBCdWY7CisgICAgaWYgKFIgPCAwKSB7CisgICAgICBSID0gMDsKKyAgICB9IGVsc2UgaWYgKFIgPiAxKSB7CisgICAgICBSID0gMTsKKyAgICB9CisgICAgRyA9IEIgPSBSOworICB9IGVsc2UgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKKyAgICBpZiAoIW1fZHdTdGRDb252ZXJzaW9uKSB7CisgICAgICBBZG9iZUNNWUtfdG9fc1JHQihwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLCBwQnVmWzNdLCBSLCBHLCBCKTsKICAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlQobV9GYW1pbHkgPT0gUERGQ1NfUEFUVEVSTik7Ci0gICAgICAgIFIgPSBHID0gQiA9IDA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIEZYX0ZMT0FUIGsgPSBwQnVmWzNdOworICAgICAgUiA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgcEJ1ZlswXSArIGspOworICAgICAgRyA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgcEJ1ZlsxXSArIGspOworICAgICAgQiA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgcEJ1ZlsyXSArIGspOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9EZXZpY2VDUzo6dl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3QKLXsKLSAgICBpZiAobV9GYW1pbHkgIT0gUERGQ1NfREVWSUNFQ01ZSykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGMgPSBwQnVmWzBdOwotICAgIG0gPSBwQnVmWzFdOwotICAgIHkgPSBwQnVmWzJdOwotICAgIGsgPSBwQnVmWzNdOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0RldmljZUNTOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewotICAgICAgICBwQnVmWzBdID0gUjsKLSAgICAgICAgcEJ1ZlsxXSA9IEc7Ci0gICAgICAgIHBCdWZbMl0gPSBCOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpIHsKLSAgICAgICAgaWYgKFIgPT0gRyAmJiBSID09IEIpIHsKLSAgICAgICAgICAgICpwQnVmID0gUjsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKLSAgICAgICAgc1JHQl90b19BZG9iZUNNWUsoUiwgRywgQiwgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KKyAgfSBlbHNlIHsKKyAgICBBU1NFUlQobV9GYW1pbHkgPT0gUERGQ1NfUEFUVEVSTik7CisgICAgUiA9IEcgPSBCID0gMDsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfRGV2aWNlQ1M6OnZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3QKLXsKLSAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSB7Ci0gICAgICAgIEFkb2JlQ01ZS190b19zUkdCKGMsIG0sIHksIGssIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0pOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKLSAgICAgICAgcEJ1ZlswXSA9IGM7Ci0gICAgICAgIHBCdWZbMV0gPSBtOwotICAgICAgICBwQnVmWzJdID0geTsKLSAgICAgICAgcEJ1ZlszXSA9IGs7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KK0ZYX0JPT0wgQ1BERl9EZXZpY2VDUzo6dl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGspIGNvbnN0IHsKKyAgaWYgKG1fRmFtaWx5ICE9IFBERkNTX0RFVklDRUNNWUspIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgYyA9IHBCdWZbMF07CisgIG0gPSBwQnVmWzFdOworICB5ID0gcEJ1ZlsyXTsKKyAgayA9IHBCdWZbM107CisgIHJldHVybiBUUlVFOwogfQotc3RhdGljIHZvaWQgUmV2ZXJzZVJHQih1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscykKLXsKLSAgICBpZiAocERlc3RCdWYgPT0gcFNyY0J1ZikKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgdGVtcCA9IHBEZXN0QnVmWzJdOwotICAgICAgICAgICAgcERlc3RCdWZbMl0gPSBwRGVzdEJ1ZlswXTsKLSAgICAgICAgICAgIHBEZXN0QnVmWzBdID0gdGVtcDsKLSAgICAgICAgICAgIHBEZXN0QnVmICs9IDM7Ci0gICAgICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpICsrKSB7Ci0gICAgICAgICAgICAqcERlc3RCdWYgKysgPSBwU3JjQnVmWzJdOwotICAgICAgICAgICAgKnBEZXN0QnVmICsrID0gcFNyY0J1ZlsxXTsKLSAgICAgICAgICAgICpwRGVzdEJ1ZiArKyA9IHBTcmNCdWZbMF07Ci0gICAgICAgICAgICBwU3JjQnVmICs9IDM7Ci0gICAgICAgIH0KLX0KLXZvaWQgQ1BERl9EZXZpY2VDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKLXsKLSAgICBpZiAoYlRyYW5zTWFzayAmJiBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpICsrKSB7Ci0gICAgICAgICAgICBpbnQgayA9IDI1NSAtIHBTcmNCdWZbM107Ci0gICAgICAgICAgICBwRGVzdEJ1ZlswXSA9ICgoMjU1IC0gcFNyY0J1ZlswXSkgKiBrKSAvIDI1NTsKLSAgICAgICAgICAgIHBEZXN0QnVmWzFdID0gKCgyNTUgLSBwU3JjQnVmWzFdKSAqIGspIC8gMjU1OwotICAgICAgICAgICAgcERlc3RCdWZbMl0gPSAoKDI1NSAtIHBTcmNCdWZbMl0pICogaykgLyAyNTU7Ci0gICAgICAgICAgICBwRGVzdEJ1ZiArPSAzOwotICAgICAgICAgICAgcFNyY0J1ZiArPSA0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewotICAgICAgICBSZXZlcnNlUkdCKHBEZXN0QnVmLCBwU3JjQnVmLCBwaXhlbHMpOwotICAgIH0gZWxzZSBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewotICAgICAgICAgICAgKnBEZXN0QnVmICsrID0gcFNyY0J1ZltpXTsKLSAgICAgICAgICAgICpwRGVzdEJ1ZiArKyA9IHBTcmNCdWZbaV07Ci0gICAgICAgICAgICAqcERlc3RCdWYgKysgPSBwU3JjQnVmW2ldOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKLSAgICAgICAgICAgIGlmICghbV9kd1N0ZENvbnZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEocFNyY0J1ZlswXSwgcFNyY0J1ZlsxXSwgcFNyY0J1ZlsyXSwgcFNyY0J1ZlszXSwgcERlc3RCdWZbMl0sIHBEZXN0QnVmWzFdLCBwRGVzdEJ1ZlswXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QgayA9IHBTcmNCdWZbM107Ci0gICAgICAgICAgICAgICAgcERlc3RCdWZbMl0gPSAyNTUgLSBGWF9NSU4oMjU1LCBwU3JjQnVmWzBdICsgayk7Ci0gICAgICAgICAgICAgICAgcERlc3RCdWZbMV0gPSAyNTUgLSBGWF9NSU4oMjU1LCBwU3JjQnVmWzFdICsgayk7Ci0gICAgICAgICAgICAgICAgcERlc3RCdWZbMF0gPSAyNTUgLSBGWF9NSU4oMjU1LCBwU3JjQnVmWzJdICsgayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU3JjQnVmICs9IDQ7Ci0gICAgICAgICAgICBwRGVzdEJ1ZiArPSAzOwotICAgICAgICB9Ci0gICAgfQotfQotY29uc3QgdWludDhfdCBnX3NSR0JTYW1wbGVzMVtdID0gewotICAgIDAsICAgMywgICA2LCAgMTAsICAxMywgIDE1LCAgMTgsICAyMCwgIDIyLCAgMjMsICAyNSwgIDI3LCAgMjgsICAzMCwgIDMxLCAgMzIsCi0gICAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LCAgNDksCi0gICAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTYsICA1NywgIDU4LCAgNTgsICA1OSwgIDYwLCAgNjEsCi0gICAgNjEsICA2MiwgIDYyLCAgNjMsICA2NCwgIDY0LCAgNjUsICA2NiwgIDY2LCAgNjcsICA2NywgIDY4LCAgNjgsICA2OSwgIDcwLCAgNzAsCi0gICAgNzEsICA3MSwgIDcyLCAgNzIsICA3MywgIDczLCAgNzQsICA3NCwgIDc1LCAgNzYsICA3NiwgIDc3LCAgNzcsICA3OCwgIDc4LCAgNzksCi0gICAgNzksICA3OSwgIDgwLCAgODAsICA4MSwgIDgxLCAgODIsICA4MiwgIDgzLCAgODMsICA4NCwgIDg0LCAgODUsICA4NSwgIDg1LCAgODYsCi0gICAgODYsICA4NywgIDg3LCAgODgsICA4OCwgIDg4LCAgODksICA4OSwgIDkwLCAgOTAsICA5MSwgIDkxLCAgOTEsICA5MiwgIDkyLCAgOTMsCi0gICAgOTMsICA5MywgIDk0LCAgOTQsICA5NSwgIDk1LCAgOTUsICA5NiwgIDk2LCAgOTcsICA5NywgIDk3LCAgOTgsICA5OCwgIDk4LCAgOTksCi0gICAgOTksICA5OSwgMTAwLCAxMDAsIDEwMSwgMTAxLCAxMDEsIDEwMiwgMTAyLCAxMDIsIDEwMywgMTAzLCAxMDMsIDEwNCwgMTA0LCAxMDQsCi0gICAgMTA1LCAxMDUsIDEwNiwgMTA2LCAxMDYsIDEwNywgMTA3LCAxMDcsIDEwOCwgMTA4LCAxMDgsIDEwOSwgMTA5LCAxMDksIDExMCwgMTEwLAotICAgIDExMCwgMTEwLCAxMTEsIDExMSwgMTExLCAxMTIsIDExMiwgMTEyLCAxMTMsIDExMywgMTEzLCAxMTQsIDExNCwgMTE0LCAxMTUsIDExNSwKLSAgICAxMTUsIDExNSwgMTE2LCAxMTYsIDExNiwgMTE3LCAxMTcsIDExNywgMTE4LCAxMTgsIDExOCwgMTE4LCAxMTksIDExOSwgMTE5LCAxMjAsCi19OwotY29uc3QgdWludDhfdCBnX3NSR0JTYW1wbGVzMltdID0gewotICAgIDEyMCwgMTIxLCAxMjIsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwKLSAgICAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDgsIDE0OSwgMTUwLCAxNTEsCi0gICAgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwgMTU5LCAxNjAsIDE2MSwgMTYyLCAxNjMsIDE2MywgMTY0LAotICAgIDE2NSwgMTY2LCAxNjcsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzMsIDE3NCwgMTc1LCAxNzUsIDE3NiwKLSAgICAxNzcsIDE3OCwgMTc4LCAxNzksIDE4MCwgMTgwLCAxODEsIDE4MiwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODUsIDE4NiwgMTg3LCAxODcsCi0gICAgMTg4LCAxODksIDE4OSwgMTkwLCAxOTAsIDE5MSwgMTkyLCAxOTIsIDE5MywgMTk0LCAxOTQsIDE5NSwgMTk2LCAxOTYsIDE5NywgMTk3LAotICAgIDE5OCwgMTk5LCAxOTksIDIwMCwgMjAwLCAyMDEsIDIwMiwgMjAyLCAyMDMsIDIwMywgMjA0LCAyMDUsIDIwNSwgMjA2LCAyMDYsIDIwNywKLSAgICAyMDgsIDIwOCwgMjA5LCAyMDksIDIxMCwgMjEwLCAyMTEsIDIxMiwgMjEyLCAyMTMsIDIxMywgMjE0LCAyMTQsIDIxNSwgMjE1LCAyMTYsCi0gICAgMjE2LCAyMTcsIDIxOCwgMjE4LCAyMTksIDIxOSwgMjIwLCAyMjAsIDIyMSwgMjIxLCAyMjIsIDIyMiwgMjIzLCAyMjMsIDIyNCwgMjI0LAotICAgIDIyNSwgMjI2LCAyMjYsIDIyNywgMjI3LCAyMjgsIDIyOCwgMjI5LCAyMjksIDIzMCwgMjMwLCAyMzEsIDIzMSwgMjMyLCAyMzIsIDIzMywKLSAgICAyMzMsIDIzNCwgMjM0LCAyMzUsIDIzNSwgMjM2LCAyMzYsIDIzNywgMjM3LCAyMzgsIDIzOCwgMjM4LCAyMzksIDIzOSwgMjQwLCAyNDAsCi0gICAgMjQxLCAyNDEsIDI0MiwgMjQyLCAyNDMsIDI0MywgMjQ0LCAyNDQsIDI0NSwgMjQ1LCAyNDYsIDI0NiwgMjQ2LCAyNDcsIDI0NywgMjQ4LAotICAgIDI0OCwgMjQ5LCAyNDksIDI1MCwgMjUwLCAyNTEsIDI1MSwgMjUxLCAyNTIsIDI1MiwgMjUzLCAyNTMsIDI1NCwgMjU0LCAyNTUsIDI1NSwKLX07Ci0KLXN0YXRpYyBGWF9GTE9BVCBSR0JfQ29udmVyc2lvbihGWF9GTE9BVCBjb2xvckNvbXBvbmVudCkKLXsKLSAgICBpZiAoY29sb3JDb21wb25lbnQgPiAxKSB7Ci0gICAgICAgIGNvbG9yQ29tcG9uZW50ID0gMTsKLSAgICB9Ci0gICAgaWYgKGNvbG9yQ29tcG9uZW50IDwgMCkgewotICAgICAgICBjb2xvckNvbXBvbmVudCA9IDA7Ci0gICAgfQotICAgIGludCBzY2FsZSA9IChpbnQpKGNvbG9yQ29tcG9uZW50ICogMTAyMyk7Ci0gICAgaWYgKHNjYWxlIDwgMCkgewotICAgICAgICBzY2FsZSA9IDA7Ci0gICAgfQotICAgIGlmIChzY2FsZSA8IDE5MikgewotICAgICAgICBjb2xvckNvbXBvbmVudCA9IChnX3NSR0JTYW1wbGVzMVtzY2FsZV0gLyAyNTUuMGYpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgY29sb3JDb21wb25lbnQgPSAoZ19zUkdCU2FtcGxlczJbc2NhbGUgLyA0IC0gNDhdIC8gMjU1LjBmKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbG9yQ29tcG9uZW50OwotfQotCi1zdGF0aWMgdm9pZCBYWVpfdG9fc1JHQihGWF9GTE9BVCBYLCBGWF9GTE9BVCBZLCBGWF9GTE9BVCBaLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKQotewotICAgIEZYX0ZMT0FUIFIxID0gMy4yNDEwZiAqIFggLSAxLjUzNzRmICogWSAtIDAuNDk4NmYgKiBaOwotICAgIEZYX0ZMT0FUIEcxID0gLTAuOTY5MmYgKiBYICsgMS44NzYwZiAqIFkgKyAwLjA0MTZmICogWjsKLSAgICBGWF9GTE9BVCBCMSA9ICAwLjA1NTZmICogWCAtIDAuMjA0MGYgKiBZICsgMS4wNTcwZiAqIFo7Ci0KLSAgICBSID0gUkdCX0NvbnZlcnNpb24oUjEpOwotICAgIEcgPSBSR0JfQ29udmVyc2lvbihHMSk7Ci0gICAgQiA9IFJHQl9Db252ZXJzaW9uKEIxKTsKLX0KLQotc3RhdGljIHZvaWQgWFlaX3RvX3NSR0JfV2hpdGVQb2ludChGWF9GTE9BVCBYLCBGWF9GTE9BVCBZLCBGWF9GTE9BVCBaLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCLCBGWF9GTE9BVCBYdywgRlhfRkxPQVQgWXcsIEZYX0ZMT0FUIFp3KQotewotICAgIC8vIFRoZSBmb2xsb3dpbmcgUkdCX3h5eiBpcyBiYXNlZCBvbgotICAgIC8vIHNSR0IgdmFsdWUge1J4LFJ5fT17MC42NCwgMC4zM30sIHtHeCxHeX09ezAuMzAsIDAuNjB9LCB7QngsQnl9PXswLjE1LCAwLjA2fQotCi0gICAgRlhfRkxPQVQgUnggPSAwLjY0ZiwgUnkgPSAwLjMzZjsKLSAgICBGWF9GTE9BVCBHeCA9IDAuMzBmLCBHeSA9IDAuNjBmOwotICAgIEZYX0ZMT0FUIEJ4ID0gMC4xNWYsIEJ5ID0gMC4wNmY7Ci0gICAgQ0ZYX01hdHJpeF8zYnkzIFJHQl94eXooUngsIEd4LCBCeCwgUnksIEd5LCBCeSwgMSAtIFJ4IC0gUnksIDEgLSBHeCAtIEd5LCAxIC0gQnggLSBCeSk7Ci0gICAgQ0ZYX1ZlY3Rvcl8zYnkxIHdoaXRlUG9pbnQoWHcsIFl3LCBadyk7Ci0gICAgQ0ZYX1ZlY3Rvcl8zYnkxIFhZWihYLCBZLCBaKTsKLQotICAgIENGWF9WZWN0b3JfM2J5MSBSR0JfU3VtX1hZWiA9IFJHQl94eXouSW52ZXJzZSgpLlRyYW5zZm9ybVZlY3Rvcih3aGl0ZVBvaW50KTsKLSAgICBDRlhfTWF0cml4XzNieTMgUkdCX1NVTV9YWVpfRElBRyhSR0JfU3VtX1hZWi5hLCAwLCAwLCAwLCBSR0JfU3VtX1hZWi5iLCAwLCAwLCAwLCBSR0JfU3VtX1hZWi5jKTsKLSAgICBDRlhfTWF0cml4XzNieTMgTSA9IFJHQl94eXouTXVsdGlwbHkoUkdCX1NVTV9YWVpfRElBRyk7Ci0gICAgQ0ZYX1ZlY3Rvcl8zYnkxIFJHQiA9IE0uSW52ZXJzZSgpLlRyYW5zZm9ybVZlY3RvcihYWVopOwotCi0gICAgUiA9IFJHQl9Db252ZXJzaW9uKFJHQi5hKTsKLSAgICBHID0gUkdCX0NvbnZlcnNpb24oUkdCLmIpOwotICAgIEIgPSBSR0JfQ29udmVyc2lvbihSR0IuYyk7Ci19Ci1jbGFzcyBDUERGX0NhbEdyYXkgOiBwdWJsaWMgQ1BERl9Db2xvclNwYWNlCi17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQ1BERl9DYWxHcmF5KENQREZfRG9jdW1lbnQqIHBEb2MpCi0gICAgICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX0NBTEdSQVksIDEpIHsKLSAgICB9Ci0gICAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTAlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0IG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIEZYX0ZMT0FUIG1fV2hpdGVQb2ludFszXTsKLSAgICBGWF9GTE9BVCBtX0JsYWNrUG9pbnRbM107Ci0gICAgRlhfRkxPQVQgbV9HYW1tYTsKLX07Ci0KLUZYX0JPT0wgQ1BERl9DYWxHcmF5Ojp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQotewotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwQXJyYXktPkdldERpY3QoMSk7Ci0gICAgQ1BERl9BcnJheSogcFBhcmFtID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJXaGl0ZVBvaW50IikpOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpICsrKSB7Ci0gICAgICAgIG1fV2hpdGVQb2ludFtpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyKGkpIDogMDsKLSAgICB9Ci0gICAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJCbGFja1BvaW50IikpOwotICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpICsrKSB7Ci0gICAgICAgIG1fQmxhY2tQb2ludFtpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyKGkpIDogMDsKLSAgICB9Ci0gICAgbV9HYW1tYSA9IHBEaWN0LT5HZXROdW1iZXIoRlhfQlNUUkMoIkdhbW1hIikpOwotICAgIGlmIChtX0dhbW1hID09IDApIHsKLSAgICAgICAgbV9HYW1tYSA9IDEuMGY7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0NhbEdyYXk6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKLXsKLSAgICBSID0gRyA9IEIgPSAqcEJ1ZjsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9DYWxHcmF5OjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0Ci17Ci0gICAgaWYgKFIgPT0gRyAmJiBSID09IEIpIHsKLSAgICAgICAgKnBCdWYgPSBSOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotdm9pZCBDUERGX0NhbEdyYXk6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0Ci17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKLSAgICAgICAgKnBEZXN0QnVmICsrID0gcFNyY0J1ZltpXTsKLSAgICAgICAgKnBEZXN0QnVmICsrID0gcFNyY0J1ZltpXTsKLSAgICAgICAgKnBEZXN0QnVmICsrID0gcFNyY0J1ZltpXTsKLSAgICB9Ci19Ci1jbGFzcyBDUERGX0NhbFJHQiA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UKLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBDUERGX0NhbFJHQihDUERGX0RvY3VtZW50KiBwRG9jKQotICAgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19DQUxSR0IsIDMpIHsKLSAgICB9Ci0gICAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgRlhfRkxPQVQgbV9XaGl0ZVBvaW50WzNdOwotICAgIEZYX0ZMT0FUIG1fQmxhY2tQb2ludFszXTsKLSAgICBGWF9GTE9BVCBtX0dhbW1hWzNdOwotICAgIEZYX0ZMT0FUIG1fTWF0cml4WzldOwotICAgIEZYX0JPT0wgbV9iR2FtbWE7Ci0gICAgRlhfQk9PTCBtX2JNYXRyaXg7Ci19OwotRlhfQk9PTCBDUERGX0NhbFJHQjo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0KDEpOwotICAgIGlmICghcERpY3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIENQREZfQXJyYXkqIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiV2hpdGVQb2ludCIpKTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArKykgewotICAgICAgICBtX1doaXRlUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7Ci0gICAgfQotICAgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQmxhY2tQb2ludCIpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArKykgewotICAgICAgICBtX0JsYWNrUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7Ci0gICAgfQotICAgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiR2FtbWEiKSk7Ci0gICAgaWYgKHBQYXJhbSkgewotICAgICAgICBtX2JHYW1tYSA9IFRSVUU7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpICsrKSB7Ci0gICAgICAgICAgICBtX0dhbW1hW2ldID0gcFBhcmFtLT5HZXROdW1iZXIoaSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX2JHYW1tYSA9IEZBTFNFOwotICAgIH0KLSAgICBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIk1hdHJpeCIpKTsKLSAgICBpZiAocFBhcmFtKSB7Ci0gICAgICAgIG1fYk1hdHJpeCA9IFRSVUU7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpICsrKSB7Ci0gICAgICAgICAgICBtX01hdHJpeFtpXSA9IHBQYXJhbS0+R2V0TnVtYmVyKGkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9iTWF0cml4ID0gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0NhbFJHQjo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAotewotICAgIEZYX0ZMT0FUIEFfID0gcEJ1ZlswXTsKLSAgICBGWF9GTE9BVCBCXyA9IHBCdWZbMV07Ci0gICAgRlhfRkxPQVQgQ18gPSBwQnVmWzJdOwotICAgIGlmIChtX2JHYW1tYSkgewotICAgICAgICBBXyA9IChGWF9GTE9BVClGWFNZU19wb3coQV8sIG1fR2FtbWFbMF0pOwotICAgICAgICBCXyA9IChGWF9GTE9BVClGWFNZU19wb3coQl8sIG1fR2FtbWFbMV0pOwotICAgICAgICBDXyA9IChGWF9GTE9BVClGWFNZU19wb3coQ18sIG1fR2FtbWFbMl0pOwotICAgIH0KLSAgICBGWF9GTE9BVCBYLCBZLCBaOwotICAgIGlmIChtX2JNYXRyaXgpIHsKLSAgICAgICAgWCA9IG1fTWF0cml4WzBdICogQV8gKyBtX01hdHJpeFszXSAqIEJfICsgbV9NYXRyaXhbNl0gKiBDXzsKLSAgICAgICAgWSA9IG1fTWF0cml4WzFdICogQV8gKyBtX01hdHJpeFs0XSAqIEJfICsgbV9NYXRyaXhbN10gKiBDXzsKLSAgICAgICAgWiA9IG1fTWF0cml4WzJdICogQV8gKyBtX01hdHJpeFs1XSAqIEJfICsgbV9NYXRyaXhbOF0gKiBDXzsKLSAgICB9IGVsc2UgewotICAgICAgICBYID0gQV87Ci0gICAgICAgIFkgPSBCXzsKLSAgICAgICAgWiA9IENfOwotICAgIH0KLSAgICBYWVpfdG9fc1JHQl9XaGl0ZVBvaW50KFgsIFksIFosIFIsIEcsIEIsIG1fV2hpdGVQb2ludFswXSwgbV9XaGl0ZVBvaW50WzFdLCBtX1doaXRlUG9pbnRbMl0pOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0NhbFJHQjo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAoteworRlhfQk9PTCBDUERGX0RldmljZUNTOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IHsKKyAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewogICAgIHBCdWZbMF0gPSBSOwogICAgIHBCdWZbMV0gPSBHOwogICAgIHBCdWZbMl0gPSBCOwogICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDUERGX0NhbFJHQjo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKLXsKLSAgICBpZiAoYlRyYW5zTWFzaykgewotICAgICAgICBGWF9GTE9BVCBDYWxbM107Ci0gICAgICAgIEZYX0ZMT0FUIFIsIEcsIEI7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKLSAgICAgICAgICAgIENhbFswXSA9ICgoRlhfRkxPQVQpcFNyY0J1ZlsyXSkgLyAyNTU7Ci0gICAgICAgICAgICBDYWxbMV0gPSAoKEZYX0ZMT0FUKXBTcmNCdWZbMV0pIC8gMjU1OwotICAgICAgICAgICAgQ2FsWzJdID0gKChGWF9GTE9BVClwU3JjQnVmWzBdKSAvIDI1NTsKLSAgICAgICAgICAgIEdldFJHQihDYWwsIFIsIEcsIEIpOwotICAgICAgICAgICAgcERlc3RCdWZbMF0gPSBGWFNZU19yb3VuZChCICogMjU1KTsKLSAgICAgICAgICAgIHBEZXN0QnVmWzFdID0gRlhTWVNfcm91bmQoRyAqIDI1NSk7Ci0gICAgICAgICAgICBwRGVzdEJ1ZlsyXSA9IEZYU1lTX3JvdW5kKFIgKiAyNTUpOwotICAgICAgICAgICAgcFNyY0J1ZiArPSAzOwotICAgICAgICAgICAgcERlc3RCdWYgKz0gMzsKLSAgICAgICAgfQorICB9CisgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VHUkFZKSB7CisgICAgaWYgKFIgPT0gRyAmJiBSID09IEIpIHsKKyAgICAgICpwQnVmID0gUjsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKKyAgICBzUkdCX3RvX0Fkb2JlQ01ZSyhSLCBHLCBCLCBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLCBwQnVmWzNdKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfRGV2aWNlQ1M6OnZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGspIGNvbnN0IHsKKyAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgeworICAgIEFkb2JlQ01ZS190b19zUkdCKGMsIG0sIHksIGssIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0pOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7CisgICAgcEJ1ZlswXSA9IGM7CisgICAgcEJ1ZlsxXSA9IG07CisgICAgcEJ1ZlsyXSA9IHk7CisgICAgcEJ1ZlszXSA9IGs7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorc3RhdGljIHZvaWQgUmV2ZXJzZVJHQih1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscykgeworICBpZiAocERlc3RCdWYgPT0gcFNyY0J1ZikKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICB1aW50OF90IHRlbXAgPSBwRGVzdEJ1ZlsyXTsKKyAgICAgIHBEZXN0QnVmWzJdID0gcERlc3RCdWZbMF07CisgICAgICBwRGVzdEJ1ZlswXSA9IHRlbXA7CisgICAgICBwRGVzdEJ1ZiArPSAzOworICAgIH0KKyAgZWxzZQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKKyAgICAgICpwRGVzdEJ1ZisrID0gcFNyY0J1ZlsyXTsKKyAgICAgICpwRGVzdEJ1ZisrID0gcFNyY0J1ZlsxXTsKKyAgICAgICpwRGVzdEJ1ZisrID0gcFNyY0J1ZlswXTsKKyAgICAgIHBTcmNCdWYgKz0gMzsKKyAgICB9Cit9Cit2b2lkIENQREZfRGV2aWNlQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QgeworICBpZiAoYlRyYW5zTWFzayAmJiBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkrKykgeworICAgICAgaW50IGsgPSAyNTUgLSBwU3JjQnVmWzNdOworICAgICAgcERlc3RCdWZbMF0gPSAoKDI1NSAtIHBTcmNCdWZbMF0pICogaykgLyAyNTU7CisgICAgICBwRGVzdEJ1ZlsxXSA9ICgoMjU1IC0gcFNyY0J1ZlsxXSkgKiBrKSAvIDI1NTsKKyAgICAgIHBEZXN0QnVmWzJdID0gKCgyNTUgLSBwU3JjQnVmWzJdKSAqIGspIC8gMjU1OworICAgICAgcERlc3RCdWYgKz0gMzsKKyAgICAgIHBTcmNCdWYgKz0gNDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKICAgICBSZXZlcnNlUkdCKHBEZXN0QnVmLCBwU3JjQnVmLCBwaXhlbHMpOwotfQotY2xhc3MgQ1BERl9MYWJDUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UKLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBDUERGX0xhYkNTKENQREZfRG9jdW1lbnQqIHBEb2MpCi0gICAgICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX0xBQiwgMykgeworICB9IGVsc2UgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbaV07CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbaV07CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbaV07CiAgICAgfQotICAgIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LCBGWF9GTE9BVCYgdmFsdWUsIEZYX0ZMT0FUJiBtaW4sIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTAlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wJU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIFRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdDsKLQotICAgIEZYX0ZMT0FUIG1fV2hpdGVQb2ludFszXTsKLSAgICBGWF9GTE9BVCBtX0JsYWNrUG9pbnRbM107Ci0gICAgRlhfRkxPQVQgbV9SYW5nZXNbNF07CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkrKykgeworICAgICAgaWYgKCFtX2R3U3RkQ29udmVyc2lvbikgeworICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEocFNyY0J1ZlswXSwgcFNyY0J1ZlsxXSwgcFNyY0J1ZlsyXSwgcFNyY0J1ZlszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0QnVmWzJdLCBwRGVzdEJ1ZlsxXSwgcERlc3RCdWZbMF0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDhfdCBrID0gcFNyY0J1ZlszXTsKKyAgICAgICAgcERlc3RCdWZbMl0gPSAyNTUgLSBGWF9NSU4oMjU1LCBwU3JjQnVmWzBdICsgayk7CisgICAgICAgIHBEZXN0QnVmWzFdID0gMjU1IC0gRlhfTUlOKDI1NSwgcFNyY0J1ZlsxXSArIGspOworICAgICAgICBwRGVzdEJ1ZlswXSA9IDI1NSAtIEZYX01JTigyNTUsIHBTcmNCdWZbMl0gKyBrKTsKKyAgICAgIH0KKyAgICAgIHBTcmNCdWYgKz0gNDsKKyAgICAgIHBEZXN0QnVmICs9IDM7CisgICAgfQorICB9Cit9Citjb25zdCB1aW50OF90IGdfc1JHQlNhbXBsZXMxW10gPSB7CisgICAgMCwgICAzLCAgIDYsICAgMTAsICAxMywgIDE1LCAgMTgsICAyMCwgIDIyLCAgMjMsICAyNSwgIDI3LCAgMjgsICAzMCwgIDMxLAorICAgIDMyLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyAgICA0OCwgIDQ5LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTYsICA1NywgIDU4LCAgNTgsCisgICAgNTksICA2MCwgIDYxLCAgNjEsICA2MiwgIDYyLCAgNjMsICA2NCwgIDY0LCAgNjUsICA2NiwgIDY2LCAgNjcsICA2NywgIDY4LAorICAgIDY4LCAgNjksICA3MCwgIDcwLCAgNzEsICA3MSwgIDcyLCAgNzIsICA3MywgIDczLCAgNzQsICA3NCwgIDc1LCAgNzYsICA3NiwKKyAgICA3NywgIDc3LCAgNzgsICA3OCwgIDc5LCAgNzksICA3OSwgIDgwLCAgODAsICA4MSwgIDgxLCAgODIsICA4MiwgIDgzLCAgODMsCisgICAgODQsICA4NCwgIDg1LCAgODUsICA4NSwgIDg2LCAgODYsICA4NywgIDg3LCAgODgsICA4OCwgIDg4LCAgODksICA4OSwgIDkwLAorICAgIDkwLCAgOTEsICA5MSwgIDkxLCAgOTIsICA5MiwgIDkzLCAgOTMsICA5MywgIDk0LCAgOTQsICA5NSwgIDk1LCAgOTUsICA5NiwKKyAgICA5NiwgIDk3LCAgOTcsICA5NywgIDk4LCAgOTgsICA5OCwgIDk5LCAgOTksICA5OSwgIDEwMCwgMTAwLCAxMDEsIDEwMSwgMTAxLAorICAgIDEwMiwgMTAyLCAxMDIsIDEwMywgMTAzLCAxMDMsIDEwNCwgMTA0LCAxMDQsIDEwNSwgMTA1LCAxMDYsIDEwNiwgMTA2LCAxMDcsCisgICAgMTA3LCAxMDcsIDEwOCwgMTA4LCAxMDgsIDEwOSwgMTA5LCAxMDksIDExMCwgMTEwLCAxMTAsIDExMCwgMTExLCAxMTEsIDExMSwKKyAgICAxMTIsIDExMiwgMTEyLCAxMTMsIDExMywgMTEzLCAxMTQsIDExNCwgMTE0LCAxMTUsIDExNSwgMTE1LCAxMTUsIDExNiwgMTE2LAorICAgIDExNiwgMTE3LCAxMTcsIDExNywgMTE4LCAxMTgsIDExOCwgMTE4LCAxMTksIDExOSwgMTE5LCAxMjAsCiB9OwotRlhfQk9PTCBDUERGX0xhYkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQotewotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwQXJyYXktPkdldERpY3QoMSk7Ci0gICAgaWYgKCFwRGljdCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiV2hpdGVQb2ludCIpKTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArKykgewotICAgICAgICBtX1doaXRlUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7Ci0gICAgfQotICAgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQmxhY2tQb2ludCIpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArKykgewotICAgICAgICBtX0JsYWNrUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7Ci0gICAgfQotICAgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiUmFuZ2UiKSk7Ci0gICAgY29uc3QgRlhfRkxPQVQgZGVmX3Jhbmdlc1s0XSA9IHsgLTEwMCAqIDEuMGYsIDEwMCAqIDEuMGYsIC0xMDAgKiAxLjBmLCAxMDAgKiAxLjBmfTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICBtX1Jhbmdlc1tpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyKGkpIDogZGVmX3Jhbmdlc1tpXTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENQREZfTGFiQ1M6OkdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwgRlhfRkxPQVQmIHZhbHVlLCBGWF9GTE9BVCYgbWluLCBGWF9GTE9BVCYgbWF4KSBjb25zdAotewotICAgIGFzc2VydChpQ29tcG9uZW50IDwgMyk7Ci0gICAgdmFsdWUgPSAwOwotICAgIGlmIChpQ29tcG9uZW50ID09IDApIHsKLSAgICAgICAgbWluID0gMDsKLSAgICAgICAgbWF4ID0gMTAwICogMS4wZjsKLSAgICB9IGVsc2UgewotICAgICAgICBtaW4gPSBtX1Jhbmdlc1tpQ29tcG9uZW50ICogMiAtIDJdOwotICAgICAgICBtYXggPSBtX1Jhbmdlc1tpQ29tcG9uZW50ICogMiAtIDFdOwotICAgICAgICBpZiAodmFsdWUgPCBtaW4pIHsKLSAgICAgICAgICAgIHZhbHVlID0gbWluOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gbWF4KSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IG1heDsKLSAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9MYWJDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAotewotICAgIEZYX0ZMT0FUIExzdGFyID0gcEJ1ZlswXTsKLSAgICBGWF9GTE9BVCBhc3RhciA9IHBCdWZbMV07Ci0gICAgRlhfRkxPQVQgYnN0YXIgPSBwQnVmWzJdOwotICAgIEZYX0ZMT0FUIE0gPSAoTHN0YXIgKyAxNi4wZikgLyAxMTYuMGY7Ci0gICAgRlhfRkxPQVQgTCA9IE0gKyBhc3RhciAvIDUwMC4wZjsKLSAgICBGWF9GTE9BVCBOID0gTSAtIGJzdGFyIC8gMjAwLjBmOwotICAgIEZYX0ZMT0FUIFgsIFksIFo7Ci0gICAgaWYgKEwgPCAwLjIwNjlmKSB7Ci0gICAgICAgIFggPSAwLjk1N2YgKiAwLjEyODQyZiAqIChMIC0gMC4xMzc5Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgWCA9IDAuOTU3ZiAqIEwgKiBMICogTDsKLSAgICB9Ci0gICAgaWYgKE0gPCAwLjIwNjlmKSB7Ci0gICAgICAgIFkgPSAwLjEyODQyZiAqIChNIC0gMC4xMzc5Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgWSA9IE0gKiBNICogTTsKLSAgICB9Ci0gICAgaWYgKE4gPCAwLjIwNjlmKSB7Ci0gICAgICAgIFogPSAxLjA4ODlmICogMC4xMjg0MmYgKiAoTiAtIDAuMTM3OWYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFogPSAxLjA4ODlmICogTiAqIE4gKiBOOwotICAgIH0KLSAgICBYWVpfdG9fc1JHQihYLCBZLCBaLCBSLCBHLCBCKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9MYWJDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAotewotICAgIHJldHVybiBGQUxTRTsKLX0KLXZvaWQgQ1BERl9MYWJDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewotICAgICAgICBGWF9GTE9BVCBsYWJbM107Ci0gICAgICAgIEZYX0ZMT0FUIFIsIEcsIEI7Ci0gICAgICAgIGxhYlswXSA9IChwU3JjQnVmWzBdICogMTAwIC8gMjU1LjBmKTsKLSAgICAgICAgbGFiWzFdID0gKEZYX0ZMT0FUKShwU3JjQnVmWzFdIC0gMTI4KTsKLSAgICAgICAgbGFiWzJdID0gKEZYX0ZMT0FUKShwU3JjQnVmWzJdIC0gMTI4KTsKLSAgICAgICAgR2V0UkdCKGxhYiwgUiwgRywgQik7Ci0gICAgICAgIHBEZXN0QnVmWzBdID0gKGludDMyX3QpKEIgKiAyNTUpOwotICAgICAgICBwRGVzdEJ1ZlsxXSA9IChpbnQzMl90KShHICogMjU1KTsKLSAgICAgICAgcERlc3RCdWZbMl0gPSAoaW50MzJfdCkoUiAqIDI1NSk7Ci0gICAgICAgIHBEZXN0QnVmICs9IDM7Ci0gICAgICAgIHBTcmNCdWYgKz0gMzsKLSAgICB9Ci19Ci1DUERGX0ljY1Byb2ZpbGU6OkNQREZfSWNjUHJvZmlsZShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKToKLSAgICBtX2JzUkdCKEZBTFNFKSwKLSAgICBtX3BUcmFuc2Zvcm0oTlVMTCksCi0gICAgbV9uU3JjQ29tcG9uZW50cygwKQotewotICAgIGlmIChkd1NpemUgPT0gMzE0NCAmJiBGWFNZU19tZW1jbXAocERhdGEgKyAweDE5MCwgInNSR0IgSUVDNjE5NjYtMi4xIiwgMTcpID09IDApIHsKLSAgICAgICAgbV9ic1JHQiA9IFRSVUU7Ci0gICAgICAgIG1fblNyY0NvbXBvbmVudHMgPSAzOwotICAgIH0KLSAgICBlbHNlIGlmIChDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEljY01vZHVsZSgpKSB7Ci0gICAgICAgIG1fcFRyYW5zZm9ybSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCktPkNyZWF0ZVRyYW5zZm9ybV9zUkdCKHBEYXRhLCBkd1NpemUsIG1fblNyY0NvbXBvbmVudHMpOwotICAgIH0KLX0KLUNQREZfSWNjUHJvZmlsZTo6fkNQREZfSWNjUHJvZmlsZSgpCi17Ci0gICAgaWYgKG1fcFRyYW5zZm9ybSkgewotICAgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEljY01vZHVsZSgpLT5EZXN0cm95VHJhbnNmb3JtKG1fcFRyYW5zZm9ybSk7Ci0gICAgfQotfQotY2xhc3MgQ1BERl9JQ0NCYXNlZENTIDogcHVibGljIENQREZfQ29sb3JTcGFjZQotewotcHVibGljOgotICAgIGV4cGxpY2l0IENQREZfSUNDQmFzZWRDUyhDUERGX0RvY3VtZW50KiBwRG9jKQotICAgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19JQ0NCQVNFRCwgMCksCi0gICAgICAgICAgbV9wQWx0ZXJDUyhudWxscHRyKSwKLSAgICAgICAgICBtX3BQcm9maWxlKG51bGxwdHIpLAotICAgICAgICAgIG1fcENhY2hlKG51bGxwdHIpLAotICAgICAgICAgIG1fcFJhbmdlcyhudWxscHRyKSwKLSAgICAgICAgICBtX2JPd24oRkFMU0UpIHsKLSAgICB9Ci0gICAgfkNQREZfSUNDQmFzZWRDUygpIG92ZXJyaWRlOwotCi0gICAgRlhfQk9PTAl2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTAlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wJdl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIG92ZXJyaWRlOwotICAgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgQ1BERl9Db2xvclNwYWNlKiBtX3BBbHRlckNTOwotICAgIENQREZfSWNjUHJvZmlsZSogbV9wUHJvZmlsZTsKLSAgICB1aW50OF90KiBtX3BDYWNoZTsKLSAgICBGWF9GTE9BVCogbV9wUmFuZ2VzOwotICAgIEZYX0JPT0wJbV9iT3duOworY29uc3QgdWludDhfdCBnX3NSR0JTYW1wbGVzMltdID0geworICAgIDEyMCwgMTIxLCAxMjIsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsCisgICAgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDgsIDE0OSwKKyAgICAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwgMTU5LCAxNjAsIDE2MSwgMTYyLAorICAgIDE2MywgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzMsCisgICAgMTc0LCAxNzUsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc4LCAxNzksIDE4MCwgMTgwLCAxODEsIDE4MiwgMTgyLCAxODMsIDE4NCwKKyAgICAxODUsIDE4NSwgMTg2LCAxODcsIDE4NywgMTg4LCAxODksIDE4OSwgMTkwLCAxOTAsIDE5MSwgMTkyLCAxOTIsIDE5MywgMTk0LAorICAgIDE5NCwgMTk1LCAxOTYsIDE5NiwgMTk3LCAxOTcsIDE5OCwgMTk5LCAxOTksIDIwMCwgMjAwLCAyMDEsIDIwMiwgMjAyLCAyMDMsCisgICAgMjAzLCAyMDQsIDIwNSwgMjA1LCAyMDYsIDIwNiwgMjA3LCAyMDgsIDIwOCwgMjA5LCAyMDksIDIxMCwgMjEwLCAyMTEsIDIxMiwKKyAgICAyMTIsIDIxMywgMjEzLCAyMTQsIDIxNCwgMjE1LCAyMTUsIDIxNiwgMjE2LCAyMTcsIDIxOCwgMjE4LCAyMTksIDIxOSwgMjIwLAorICAgIDIyMCwgMjIxLCAyMjEsIDIyMiwgMjIyLCAyMjMsIDIyMywgMjI0LCAyMjQsIDIyNSwgMjI2LCAyMjYsIDIyNywgMjI3LCAyMjgsCisgICAgMjI4LCAyMjksIDIyOSwgMjMwLCAyMzAsIDIzMSwgMjMxLCAyMzIsIDIzMiwgMjMzLCAyMzMsIDIzNCwgMjM0LCAyMzUsIDIzNSwKKyAgICAyMzYsIDIzNiwgMjM3LCAyMzcsIDIzOCwgMjM4LCAyMzgsIDIzOSwgMjM5LCAyNDAsIDI0MCwgMjQxLCAyNDEsIDI0MiwgMjQyLAorICAgIDI0MywgMjQzLCAyNDQsIDI0NCwgMjQ1LCAyNDUsIDI0NiwgMjQ2LCAyNDYsIDI0NywgMjQ3LCAyNDgsIDI0OCwgMjQ5LCAyNDksCisgICAgMjUwLCAyNTAsIDI1MSwgMjUxLCAyNTEsIDI1MiwgMjUyLCAyNTMsIDI1MywgMjU0LCAyNTQsIDI1NSwgMjU1LAogfTsKIAotQ1BERl9JQ0NCYXNlZENTOjp+Q1BERl9JQ0NCYXNlZENTKCkKLXsKLSAgICBpZiAobV9wQ2FjaGUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDYWNoZSk7Ci0gICAgfQotICAgIGlmIChtX3BSYW5nZXMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BSYW5nZXMpOwotICAgIH0KLSAgICBpZiAobV9wQWx0ZXJDUyAmJiBtX2JPd24pIHsKLSAgICAgICAgbV9wQWx0ZXJDUy0+UmVsZWFzZUNTKCk7Ci0gICAgfQotICAgIGlmIChtX3BQcm9maWxlICYmIG1fcERvY3VtZW50KSB7Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlSWNjUHJvZmlsZShtX3BQcm9maWxlKTsKLSAgICB9CitzdGF0aWMgRlhfRkxPQVQgUkdCX0NvbnZlcnNpb24oRlhfRkxPQVQgY29sb3JDb21wb25lbnQpIHsKKyAgaWYgKGNvbG9yQ29tcG9uZW50ID4gMSkgeworICAgIGNvbG9yQ29tcG9uZW50ID0gMTsKKyAgfQorICBpZiAoY29sb3JDb21wb25lbnQgPCAwKSB7CisgICAgY29sb3JDb21wb25lbnQgPSAwOworICB9CisgIGludCBzY2FsZSA9IChpbnQpKGNvbG9yQ29tcG9uZW50ICogMTAyMyk7CisgIGlmIChzY2FsZSA8IDApIHsKKyAgICBzY2FsZSA9IDA7CisgIH0KKyAgaWYgKHNjYWxlIDwgMTkyKSB7CisgICAgY29sb3JDb21wb25lbnQgPSAoZ19zUkdCU2FtcGxlczFbc2NhbGVdIC8gMjU1LjBmKTsKKyAgfSBlbHNlIHsKKyAgICBjb2xvckNvbXBvbmVudCA9IChnX3NSR0JTYW1wbGVzMltzY2FsZSAvIDQgLSA0OF0gLyAyNTUuMGYpOworICB9CisgIHJldHVybiBjb2xvckNvbXBvbmVudDsKIH0KIAotRlhfQk9PTCBDUERGX0lDQ0Jhc2VkQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCi17Ci0gICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwQXJyYXktPkdldFN0cmVhbSgxKTsKLSAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wUHJvZmlsZSA9IHBEb2MtPkxvYWRJY2NQcm9maWxlKHBTdHJlYW0pOwotICAgIGlmICghbV9wUHJvZmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fbkNvbXBvbmVudHMgPSBtX3BQcm9maWxlLT5HZXRDb21wb25lbnRzKCk7IC8vVHJ5IHVzaW5nIHRoZSBuQ29tcG9uZW50cyBmcm9tIElDQyBwcm9maWxlCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKLSAgICBpZiAobV9wUHJvZmlsZS0+bV9wVHJhbnNmb3JtID09IE5VTEwpIHsgLy8gTm8gdmFsaWQgSUNDIHByb2ZpbGUgb3IgdXNpbmcgc1JHQgotICAgICAgICBDUERGX09iamVjdCogcEFsdGVyQ1NPYmogPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkFsdGVybmF0ZSIpKSA6IE5VTEw7Ci0gICAgICAgIGlmIChwQWx0ZXJDU09iaikgewotICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQWx0ZXJDUyA9IENQREZfQ29sb3JTcGFjZTo6TG9hZChwRG9jLCBwQWx0ZXJDU09iaik7Ci0gICAgICAgICAgICBpZiAocEFsdGVyQ1MpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9uQ29tcG9uZW50cyA9PSAwKSB7IC8vIE5PIHZhbGlkIElDQyBwcm9maWxlCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQWx0ZXJDUy0+Q291bnRDb21wb25lbnRzKCkgPiAwKSB7IC8vIFVzZSBBbHRlcm5hdGl2ZSBjb2xvcnNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBtX25Db21wb25lbnRzID0gcEFsdGVyQ1MtPkNvdW50Q29tcG9uZW50cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9wQWx0ZXJDUyA9IHBBbHRlckNTOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9iT3duID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gTm8gdmFsaWQgYWx0ZXJuYXRpdmUgY29sb3JzcGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgcEFsdGVyQ1MtPlJlbGVhc2VDUygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRGljdENvbXBvbmVudHMgPSBwRGljdCA/IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJOIikpIDogMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuRGljdENvbXBvbmVudHMgIT0gMSAmJiBuRGljdENvbXBvbmVudHMgIT0gMyAmJiBuRGljdENvbXBvbmVudHMgIT0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPSBuRGljdENvbXBvbmVudHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KK3N0YXRpYyB2b2lkIFhZWl90b19zUkdCKEZYX0ZMT0FUIFgsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBZLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgWiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgeworICBGWF9GTE9BVCBSMSA9IDMuMjQxMGYgKiBYIC0gMS41Mzc0ZiAqIFkgLSAwLjQ5ODZmICogWjsKKyAgRlhfRkxPQVQgRzEgPSAtMC45NjkyZiAqIFggKyAxLjg3NjBmICogWSArIDAuMDQxNmYgKiBaOworICBGWF9GTE9BVCBCMSA9IDAuMDU1NmYgKiBYIC0gMC4yMDQwZiAqIFkgKyAxLjA1NzBmICogWjsKIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsgLy8gVXNpbmcgc1JHQgotICAgICAgICAgICAgICAgICAgICBpZiAocEFsdGVyQ1MtPkNvdW50Q29tcG9uZW50cygpICE9IG1fbkNvbXBvbmVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHRlckNTLT5SZWxlYXNlQ1MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEFsdGVyQ1MgPSBwQWx0ZXJDUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYk93biA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX3BBbHRlckNTKSB7Ci0gICAgICAgICAgICBpZiAobV9uQ29tcG9uZW50cyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbV9wQWx0ZXJDUyA9IEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChtX25Db21wb25lbnRzID09IDMpIHsKLSAgICAgICAgICAgICAgICBtX3BBbHRlckNTID0gR2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobV9uQ29tcG9uZW50cyA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgbV9wQWx0ZXJDUyA9IEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFQ01ZSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcFJhbmdlcyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiUmFuZ2UiKSk7Ci0gICAgbV9wUmFuZ2VzID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uQ29tcG9uZW50cywgMik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzICogMjsgaSArKykgewotICAgICAgICBpZiAocFJhbmdlcykgewotICAgICAgICAgICAgbV9wUmFuZ2VzW2ldID0gcFJhbmdlcy0+R2V0TnVtYmVyKGkpOwotICAgICAgICB9IGVsc2UgaWYgKGkgJSAyKSB7Ci0gICAgICAgICAgICBtX3BSYW5nZXNbaV0gPSAxLjBmOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wUmFuZ2VzW2ldID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgUiA9IFJHQl9Db252ZXJzaW9uKFIxKTsKKyAgRyA9IFJHQl9Db252ZXJzaW9uKEcxKTsKKyAgQiA9IFJHQl9Db252ZXJzaW9uKEIxKTsKIH0KLUZYX0JPT0wgQ1BERl9JQ0NCYXNlZENTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcFByb2ZpbGUgJiYgbV9wUHJvZmlsZS0+bV9ic1JHQikgewotICAgICAgICBSID0gcEJ1ZlswXTsKLSAgICAgICAgRyA9IHBCdWZbMV07Ci0gICAgICAgIEIgPSBwQnVmWzJdOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgSUNvZGVjX0ljY01vZHVsZSAqcEljY01vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgaWYgKG1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSA9PSBOVUxMIHx8IHBJY2NNb2R1bGUgPT0gTlVMTCkgewotICAgICAgICBpZiAobV9wQWx0ZXJDUykgewotICAgICAgICAgICAgbV9wQWx0ZXJDUy0+R2V0UkdCKHBCdWYsIFIsIEcsIEIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUiA9IEcgPSBCID0gMC4wZjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgcmdiWzNdOwotICAgIHBJY2NNb2R1bGUtPlNldENvbXBvbmVudHMobV9uQ29tcG9uZW50cyk7Ci0gICAgcEljY01vZHVsZS0+VHJhbnNsYXRlKG1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSwgcEJ1ZiwgcmdiKTsKLSAgICBSID0gcmdiWzBdOwotICAgIEcgPSByZ2JbMV07Ci0gICAgQiA9IHJnYlsyXTsKLSAgICByZXR1cm4gVFJVRTsKKworc3RhdGljIHZvaWQgWFlaX3RvX3NSR0JfV2hpdGVQb2ludChGWF9GTE9BVCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBYdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgWXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFp3KSB7CisgIC8vIFRoZSBmb2xsb3dpbmcgUkdCX3h5eiBpcyBiYXNlZCBvbgorICAvLyBzUkdCIHZhbHVlIHtSeCxSeX09ezAuNjQsIDAuMzN9LCB7R3gsR3l9PXswLjMwLCAwLjYwfSwge0J4LEJ5fT17MC4xNSwgMC4wNn0KKworICBGWF9GTE9BVCBSeCA9IDAuNjRmLCBSeSA9IDAuMzNmOworICBGWF9GTE9BVCBHeCA9IDAuMzBmLCBHeSA9IDAuNjBmOworICBGWF9GTE9BVCBCeCA9IDAuMTVmLCBCeSA9IDAuMDZmOworICBDRlhfTWF0cml4XzNieTMgUkdCX3h5eihSeCwgR3gsIEJ4LCBSeSwgR3ksIEJ5LCAxIC0gUnggLSBSeSwgMSAtIEd4IC0gR3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBCeCAtIEJ5KTsKKyAgQ0ZYX1ZlY3Rvcl8zYnkxIHdoaXRlUG9pbnQoWHcsIFl3LCBadyk7CisgIENGWF9WZWN0b3JfM2J5MSBYWVooWCwgWSwgWik7CisKKyAgQ0ZYX1ZlY3Rvcl8zYnkxIFJHQl9TdW1fWFlaID0gUkdCX3h5ei5JbnZlcnNlKCkuVHJhbnNmb3JtVmVjdG9yKHdoaXRlUG9pbnQpOworICBDRlhfTWF0cml4XzNieTMgUkdCX1NVTV9YWVpfRElBRyhSR0JfU3VtX1hZWi5hLCAwLCAwLCAwLCBSR0JfU3VtX1hZWi5iLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBSR0JfU3VtX1hZWi5jKTsKKyAgQ0ZYX01hdHJpeF8zYnkzIE0gPSBSR0JfeHl6Lk11bHRpcGx5KFJHQl9TVU1fWFlaX0RJQUcpOworICBDRlhfVmVjdG9yXzNieTEgUkdCID0gTS5JbnZlcnNlKCkuVHJhbnNmb3JtVmVjdG9yKFhZWik7CisKKyAgUiA9IFJHQl9Db252ZXJzaW9uKFJHQi5hKTsKKyAgRyA9IFJHQl9Db252ZXJzaW9uKFJHQi5iKTsKKyAgQiA9IFJHQl9Db252ZXJzaW9uKFJHQi5jKTsKIH0KLUZYX0JPT0wgQ1BERl9JQ0NCYXNlZENTOjp2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAotewotICAgIGlmIChtX25Db21wb25lbnRzICE9IDQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBjID0gcEJ1ZlswXTsKLSAgICBtID0gcEJ1ZlsxXTsKLSAgICB5ID0gcEJ1ZlsyXTsKLSAgICBrID0gcEJ1ZlszXTsKLSAgICByZXR1cm4gVFJVRTsKK2NsYXNzIENQREZfQ2FsR3JheSA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9DYWxHcmF5KENQREZfRG9jdW1lbnQqIHBEb2MpCisgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19DQUxHUkFZLCAxKSB7fQorICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgRlhfRkxPQVQgbV9XaGl0ZVBvaW50WzNdOworICBGWF9GTE9BVCBtX0JsYWNrUG9pbnRbM107CisgIEZYX0ZMT0FUIG1fR2FtbWE7Cit9OworCitGWF9CT09MIENQREZfQ2FsR3JheTo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0KDEpOworICBDUERGX0FycmF5KiBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldoaXRlUG9pbnQiKSk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgbV9XaGl0ZVBvaW50W2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXIoaSkgOiAwOworICB9CisgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQmxhY2tQb2ludCIpKTsKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIG1fQmxhY2tQb2ludFtpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyKGkpIDogMDsKKyAgfQorICBtX0dhbW1hID0gcERpY3QtPkdldE51bWJlcihGWF9CU1RSQygiR2FtbWEiKSk7CisgIGlmIChtX0dhbW1hID09IDApIHsKKyAgICBtX0dhbW1hID0gMS4wZjsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9JQ0NCYXNlZENTOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0Ci17CitGWF9CT09MIENQREZfQ2FsR3JheTo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCB7CisgIFIgPSBHID0gQiA9ICpwQnVmOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9DYWxHcmF5OjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IHsKKyAgaWYgKFIgPT0gRyAmJiBSID09IEIpIHsKKyAgICAqcEJ1ZiA9IFI7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQordm9pZCBDUERGX0NhbEdyYXk6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkrKykgeworICAgICpwRGVzdEJ1ZisrID0gcFNyY0J1ZltpXTsKKyAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbaV07CisgICAgKnBEZXN0QnVmKysgPSBwU3JjQnVmW2ldOworICB9Cit9CitjbGFzcyBDUERGX0NhbFJHQiA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9DYWxSR0IoQ1BERl9Eb2N1bWVudCogcERvYykKKyAgICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX0NBTFJHQiwgMykge30KKyAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIFNldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgUiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRywKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgQikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdCBvdmVycmlkZTsKKworICBGWF9GTE9BVCBtX1doaXRlUG9pbnRbM107CisgIEZYX0ZMT0FUIG1fQmxhY2tQb2ludFszXTsKKyAgRlhfRkxPQVQgbV9HYW1tYVszXTsKKyAgRlhfRkxPQVQgbV9NYXRyaXhbOV07CisgIEZYX0JPT0wgbV9iR2FtbWE7CisgIEZYX0JPT0wgbV9iTWF0cml4OworfTsKK0ZYX0JPT0wgQ1BERl9DYWxSR0I6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBBcnJheS0+R2V0RGljdCgxKTsKKyAgaWYgKCFwRGljdCkKICAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERl9BcnJheSogcFBhcmFtID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJXaGl0ZVBvaW50IikpOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIG1fV2hpdGVQb2ludFtpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyKGkpIDogMDsKKyAgfQorICBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkJsYWNrUG9pbnQiKSk7CisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBtX0JsYWNrUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7CisgIH0KKyAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJHYW1tYSIpKTsKKyAgaWYgKHBQYXJhbSkgeworICAgIG1fYkdhbW1hID0gVFJVRTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICBtX0dhbW1hW2ldID0gcFBhcmFtLT5HZXROdW1iZXIoaSk7CisgICAgfQorICB9IGVsc2UgeworICAgIG1fYkdhbW1hID0gRkFMU0U7CisgIH0KKyAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJNYXRyaXgiKSk7CisgIGlmIChwUGFyYW0pIHsKKyAgICBtX2JNYXRyaXggPSBUUlVFOworICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKyAgICAgIG1fTWF0cml4W2ldID0gcFBhcmFtLT5HZXROdW1iZXIoaSk7CisgICAgfQorICB9IGVsc2UgeworICAgIG1fYk1hdHJpeCA9IEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDUERGX0lDQ0Jhc2VkQ1M6OkVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkKLXsKLSAgICBDUERGX0NvbG9yU3BhY2U6OkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOworRlhfQk9PTCBDUERGX0NhbFJHQjo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCB7CisgIEZYX0ZMT0FUIEFfID0gcEJ1ZlswXTsKKyAgRlhfRkxPQVQgQl8gPSBwQnVmWzFdOworICBGWF9GTE9BVCBDXyA9IHBCdWZbMl07CisgIGlmIChtX2JHYW1tYSkgeworICAgIEFfID0gKEZYX0ZMT0FUKUZYU1lTX3BvdyhBXywgbV9HYW1tYVswXSk7CisgICAgQl8gPSAoRlhfRkxPQVQpRlhTWVNfcG93KEJfLCBtX0dhbW1hWzFdKTsKKyAgICBDXyA9IChGWF9GTE9BVClGWFNZU19wb3coQ18sIG1fR2FtbWFbMl0pOworICB9CisgIEZYX0ZMT0FUIFgsIFksIFo7CisgIGlmIChtX2JNYXRyaXgpIHsKKyAgICBYID0gbV9NYXRyaXhbMF0gKiBBXyArIG1fTWF0cml4WzNdICogQl8gKyBtX01hdHJpeFs2XSAqIENfOworICAgIFkgPSBtX01hdHJpeFsxXSAqIEFfICsgbV9NYXRyaXhbNF0gKiBCXyArIG1fTWF0cml4WzddICogQ187CisgICAgWiA9IG1fTWF0cml4WzJdICogQV8gKyBtX01hdHJpeFs1XSAqIEJfICsgbV9NYXRyaXhbOF0gKiBDXzsKKyAgfSBlbHNlIHsKKyAgICBYID0gQV87CisgICAgWSA9IEJfOworICAgIFogPSBDXzsKKyAgfQorICBYWVpfdG9fc1JHQl9XaGl0ZVBvaW50KFgsIFksIFosIFIsIEcsIEIsIG1fV2hpdGVQb2ludFswXSwgbV9XaGl0ZVBvaW50WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fV2hpdGVQb2ludFsyXSk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX0NhbFJHQjo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCB7CisgIHBCdWZbMF0gPSBSOworICBwQnVmWzFdID0gRzsKKyAgcEJ1ZlsyXSA9IEI7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX0NhbFJHQjo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0IHsKKyAgaWYgKGJUcmFuc01hc2spIHsKKyAgICBGWF9GTE9BVCBDYWxbM107CisgICAgRlhfRkxPQVQgUiwgRywgQjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICBDYWxbMF0gPSAoKEZYX0ZMT0FUKXBTcmNCdWZbMl0pIC8gMjU1OworICAgICAgQ2FsWzFdID0gKChGWF9GTE9BVClwU3JjQnVmWzFdKSAvIDI1NTsKKyAgICAgIENhbFsyXSA9ICgoRlhfRkxPQVQpcFNyY0J1ZlswXSkgLyAyNTU7CisgICAgICBHZXRSR0IoQ2FsLCBSLCBHLCBCKTsKKyAgICAgIHBEZXN0QnVmWzBdID0gRlhTWVNfcm91bmQoQiAqIDI1NSk7CisgICAgICBwRGVzdEJ1ZlsxXSA9IEZYU1lTX3JvdW5kKEcgKiAyNTUpOworICAgICAgcERlc3RCdWZbMl0gPSBGWFNZU19yb3VuZChSICogMjU1KTsKKyAgICAgIHBTcmNCdWYgKz0gMzsKKyAgICAgIHBEZXN0QnVmICs9IDM7CisgICAgfQorICB9CisgIFJldmVyc2VSR0IocERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscyk7Cit9CitjbGFzcyBDUERGX0xhYkNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX0xhYkNTKENQREZfRG9jdW1lbnQqIHBEb2MpCisgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19MQUIsIDMpIHt9CisgIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0OworCisgIEZYX0ZMT0FUIG1fV2hpdGVQb2ludFszXTsKKyAgRlhfRkxPQVQgbV9CbGFja1BvaW50WzNdOworICBGWF9GTE9BVCBtX1Jhbmdlc1s0XTsKK307CitGWF9CT09MIENQREZfTGFiQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBBcnJheS0+R2V0RGljdCgxKTsKKyAgaWYgKCFwRGljdCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0FycmF5KiBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldoaXRlUG9pbnQiKSk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgbV9XaGl0ZVBvaW50W2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXIoaSkgOiAwOworICB9CisgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQmxhY2tQb2ludCIpKTsKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIG1fQmxhY2tQb2ludFtpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyKGkpIDogMDsKKyAgfQorICBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlJhbmdlIikpOworICBjb25zdCBGWF9GTE9BVCBkZWZfcmFuZ2VzWzRdID0gey0xMDAgKiAxLjBmLCAxMDAgKiAxLjBmLCAtMTAwICogMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgKiAxLjBmfTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIG1fUmFuZ2VzW2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXIoaSkgOiBkZWZfcmFuZ2VzW2ldOworICB9CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX0xhYkNTOjpHZXREZWZhdWx0VmFsdWUoaW50IGlDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG1heCkgY29uc3QgeworICBhc3NlcnQoaUNvbXBvbmVudCA8IDMpOworICB2YWx1ZSA9IDA7CisgIGlmIChpQ29tcG9uZW50ID09IDApIHsKKyAgICBtaW4gPSAwOworICAgIG1heCA9IDEwMCAqIDEuMGY7CisgIH0gZWxzZSB7CisgICAgbWluID0gbV9SYW5nZXNbaUNvbXBvbmVudCAqIDIgLSAyXTsKKyAgICBtYXggPSBtX1Jhbmdlc1tpQ29tcG9uZW50ICogMiAtIDFdOworICAgIGlmICh2YWx1ZSA8IG1pbikgeworICAgICAgdmFsdWUgPSBtaW47CisgICAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkgeworICAgICAgdmFsdWUgPSBtYXg7CisgICAgfQorICB9Cit9CitGWF9CT09MIENQREZfTGFiQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3QgeworICBGWF9GTE9BVCBMc3RhciA9IHBCdWZbMF07CisgIEZYX0ZMT0FUIGFzdGFyID0gcEJ1ZlsxXTsKKyAgRlhfRkxPQVQgYnN0YXIgPSBwQnVmWzJdOworICBGWF9GTE9BVCBNID0gKExzdGFyICsgMTYuMGYpIC8gMTE2LjBmOworICBGWF9GTE9BVCBMID0gTSArIGFzdGFyIC8gNTAwLjBmOworICBGWF9GTE9BVCBOID0gTSAtIGJzdGFyIC8gMjAwLjBmOworICBGWF9GTE9BVCBYLCBZLCBaOworICBpZiAoTCA8IDAuMjA2OWYpIHsKKyAgICBYID0gMC45NTdmICogMC4xMjg0MmYgKiAoTCAtIDAuMTM3OWYpOworICB9IGVsc2UgeworICAgIFggPSAwLjk1N2YgKiBMICogTCAqIEw7CisgIH0KKyAgaWYgKE0gPCAwLjIwNjlmKSB7CisgICAgWSA9IDAuMTI4NDJmICogKE0gLSAwLjEzNzlmKTsKKyAgfSBlbHNlIHsKKyAgICBZID0gTSAqIE0gKiBNOworICB9CisgIGlmIChOIDwgMC4yMDY5ZikgeworICAgIFogPSAxLjA4ODlmICogMC4xMjg0MmYgKiAoTiAtIDAuMTM3OWYpOworICB9IGVsc2UgeworICAgIFogPSAxLjA4ODlmICogTiAqIE4gKiBOOworICB9CisgIFhZWl90b19zUkdCKFgsIFksIFosIFIsIEcsIEIpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9MYWJDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCB7CisgIHJldHVybiBGQUxTRTsKK30KK3ZvaWQgQ1BERl9MYWJDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNNYXNrKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKKyAgICBGWF9GTE9BVCBsYWJbM107CisgICAgRlhfRkxPQVQgUiwgRywgQjsKKyAgICBsYWJbMF0gPSAocFNyY0J1ZlswXSAqIDEwMCAvIDI1NS4wZik7CisgICAgbGFiWzFdID0gKEZYX0ZMT0FUKShwU3JjQnVmWzFdIC0gMTI4KTsKKyAgICBsYWJbMl0gPSAoRlhfRkxPQVQpKHBTcmNCdWZbMl0gLSAxMjgpOworICAgIEdldFJHQihsYWIsIFIsIEcsIEIpOworICAgIHBEZXN0QnVmWzBdID0gKGludDMyX3QpKEIgKiAyNTUpOworICAgIHBEZXN0QnVmWzFdID0gKGludDMyX3QpKEcgKiAyNTUpOworICAgIHBEZXN0QnVmWzJdID0gKGludDMyX3QpKFIgKiAyNTUpOworICAgIHBEZXN0QnVmICs9IDM7CisgICAgcFNyY0J1ZiArPSAzOworICB9Cit9CitDUERGX0ljY1Byb2ZpbGU6OkNQREZfSWNjUHJvZmlsZShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKQorICAgIDogbV9ic1JHQihGQUxTRSksIG1fcFRyYW5zZm9ybShOVUxMKSwgbV9uU3JjQ29tcG9uZW50cygwKSB7CisgIGlmIChkd1NpemUgPT0gMzE0NCAmJgorICAgICAgRlhTWVNfbWVtY21wKHBEYXRhICsgMHgxOTAsICJzUkdCIElFQzYxOTY2LTIuMSIsIDE3KSA9PSAwKSB7CisgICAgbV9ic1JHQiA9IFRSVUU7CisgICAgbV9uU3JjQ29tcG9uZW50cyA9IDM7CisgIH0gZWxzZSBpZiAoQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKSkgeworICAgIG1fcFRyYW5zZm9ybSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCktPkNyZWF0ZVRyYW5zZm9ybV9zUkdCKAorICAgICAgICBwRGF0YSwgZHdTaXplLCBtX25TcmNDb21wb25lbnRzKTsKKyAgfQorfQorQ1BERl9JY2NQcm9maWxlOjp+Q1BERl9JY2NQcm9maWxlKCkgeworICBpZiAobV9wVHJhbnNmb3JtKSB7CisgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKS0+RGVzdHJveVRyYW5zZm9ybShtX3BUcmFuc2Zvcm0pOworICB9Cit9CitjbGFzcyBDUERGX0lDQ0Jhc2VkQ1MgOiBwdWJsaWMgQ1BERl9Db2xvclNwYWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfSUNDQmFzZWRDUyhDUERGX0RvY3VtZW50KiBwRG9jKQorICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfSUNDQkFTRUQsIDApLAorICAgICAgICBtX3BBbHRlckNTKG51bGxwdHIpLAorICAgICAgICBtX3BQcm9maWxlKG51bGxwdHIpLAorICAgICAgICBtX3BDYWNoZShudWxscHRyKSwKKyAgICAgICAgbV9wUmFuZ2VzKG51bGxwdHIpLAorICAgICAgICBtX2JPd24oRkFMU0UpIHt9CisgIH5DUERGX0lDQ0Jhc2VkQ1MoKSBvdmVycmlkZTsKKworICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCB2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjLAorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHksCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIG92ZXJyaWRlOworICB2b2lkIFRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc01hc2sgPSBGQUxTRSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgQ1BERl9Db2xvclNwYWNlKiBtX3BBbHRlckNTOworICBDUERGX0ljY1Byb2ZpbGUqIG1fcFByb2ZpbGU7CisgIHVpbnQ4X3QqIG1fcENhY2hlOworICBGWF9GTE9BVCogbV9wUmFuZ2VzOworICBGWF9CT09MIG1fYk93bjsKK307CisKK0NQREZfSUNDQmFzZWRDUzo6fkNQREZfSUNDQmFzZWRDUygpIHsKKyAgaWYgKG1fcENhY2hlKSB7CisgICAgRlhfRnJlZShtX3BDYWNoZSk7CisgIH0KKyAgaWYgKG1fcFJhbmdlcykgeworICAgIEZYX0ZyZWUobV9wUmFuZ2VzKTsKKyAgfQorICBpZiAobV9wQWx0ZXJDUyAmJiBtX2JPd24pIHsKKyAgICBtX3BBbHRlckNTLT5SZWxlYXNlQ1MoKTsKKyAgfQorICBpZiAobV9wUHJvZmlsZSAmJiBtX3BEb2N1bWVudCkgeworICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlSWNjUHJvZmlsZShtX3BQcm9maWxlKTsKKyAgfQorfQorCitGWF9CT09MIENQREZfSUNDQmFzZWRDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgeworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBBcnJheS0+R2V0U3RyZWFtKDEpOworICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcFByb2ZpbGUgPSBwRG9jLT5Mb2FkSWNjUHJvZmlsZShwU3RyZWFtKTsKKyAgaWYgKCFtX3BQcm9maWxlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fbkNvbXBvbmVudHMgPQorICAgICAgbV9wUHJvZmlsZQorICAgICAgICAgIC0+R2V0Q29tcG9uZW50cygpOyAgLy8gVHJ5IHVzaW5nIHRoZSBuQ29tcG9uZW50cyBmcm9tIElDQyBwcm9maWxlCisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CisgIGlmIChtX3BQcm9maWxlLT5tX3BUcmFuc2Zvcm0gPT0gTlVMTCkgeyAgLy8gTm8gdmFsaWQgSUNDIHByb2ZpbGUgb3IgdXNpbmcgc1JHQgorICAgIENQREZfT2JqZWN0KiBwQWx0ZXJDU09iaiA9CisgICAgICAgIHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQWx0ZXJuYXRlIikpIDogTlVMTDsKKyAgICBpZiAocEFsdGVyQ1NPYmopIHsKKyAgICAgIENQREZfQ29sb3JTcGFjZSogcEFsdGVyQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkxvYWQocERvYywgcEFsdGVyQ1NPYmopOworICAgICAgaWYgKHBBbHRlckNTKSB7CisgICAgICAgIGlmIChtX25Db21wb25lbnRzID09IDApIHsgICAgICAgICAgICAgICAgIC8vIE5PIHZhbGlkIElDQyBwcm9maWxlCisgICAgICAgICAgaWYgKHBBbHRlckNTLT5Db3VudENvbXBvbmVudHMoKSA+IDApIHsgIC8vIFVzZSBBbHRlcm5hdGl2ZSBjb2xvcnNwYWNlCisgICAgICAgICAgICBtX25Db21wb25lbnRzID0gcEFsdGVyQ1MtPkNvdW50Q29tcG9uZW50cygpOworICAgICAgICAgICAgbV9wQWx0ZXJDUyA9IHBBbHRlckNTOworICAgICAgICAgICAgbV9iT3duID0gVFJVRTsKKyAgICAgICAgICB9IGVsc2UgeyAgLy8gTm8gdmFsaWQgYWx0ZXJuYXRpdmUgY29sb3JzcGFjZQorICAgICAgICAgICAgcEFsdGVyQ1MtPlJlbGVhc2VDUygpOworICAgICAgICAgICAgaW50MzJfdCBuRGljdENvbXBvbmVudHMgPQorICAgICAgICAgICAgICAgIHBEaWN0ID8gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIk4iKSkgOiAwOworICAgICAgICAgICAgaWYgKG5EaWN0Q29tcG9uZW50cyAhPSAxICYmIG5EaWN0Q29tcG9uZW50cyAhPSAzICYmCisgICAgICAgICAgICAgICAgbkRpY3RDb21wb25lbnRzICE9IDQpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9uQ29tcG9uZW50cyA9IG5EaWN0Q29tcG9uZW50czsKKyAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsgIC8vIFVzaW5nIHNSR0IKKyAgICAgICAgICBpZiAocEFsdGVyQ1MtPkNvdW50Q29tcG9uZW50cygpICE9IG1fbkNvbXBvbmVudHMpIHsKKyAgICAgICAgICAgIHBBbHRlckNTLT5SZWxlYXNlQ1MoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9wQWx0ZXJDUyA9IHBBbHRlckNTOworICAgICAgICAgICAgbV9iT3duID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFtX3BBbHRlckNTKSB7CisgICAgICBpZiAobV9uQ29tcG9uZW50cyA9PSAxKSB7CisgICAgICAgIG1fcEFsdGVyQ1MgPSBHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpOworICAgICAgfSBlbHNlIGlmIChtX25Db21wb25lbnRzID09IDMpIHsKKyAgICAgICAgbV9wQWx0ZXJDUyA9IEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKTsKKyAgICAgIH0gZWxzZSBpZiAobV9uQ29tcG9uZW50cyA9PSA0KSB7CisgICAgICAgIG1fcEFsdGVyQ1MgPSBHZXRTdG9ja0NTKFBERkNTX0RFVklDRUNNWUspOworICAgICAgfQorICAgIH0KKyAgfQorICBDUERGX0FycmF5KiBwUmFuZ2VzID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJSYW5nZSIpKTsKKyAgbV9wUmFuZ2VzID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uQ29tcG9uZW50cywgMik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50cyAqIDI7IGkrKykgeworICAgIGlmIChwUmFuZ2VzKSB7CisgICAgICBtX3BSYW5nZXNbaV0gPSBwUmFuZ2VzLT5HZXROdW1iZXIoaSk7CisgICAgfSBlbHNlIGlmIChpICUgMikgeworICAgICAgbV9wUmFuZ2VzW2ldID0gMS4wZjsKKyAgICB9IGVsc2UgeworICAgICAgbV9wUmFuZ2VzW2ldID0gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfSUNDQmFzZWRDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCB7CisgIGlmIChtX3BQcm9maWxlICYmIG1fcFByb2ZpbGUtPm1fYnNSR0IpIHsKKyAgICBSID0gcEJ1ZlswXTsKKyAgICBHID0gcEJ1ZlsxXTsKKyAgICBCID0gcEJ1ZlsyXTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgaWYgKG1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSA9PSBOVUxMIHx8IHBJY2NNb2R1bGUgPT0gTlVMTCkgewogICAgIGlmIChtX3BBbHRlckNTKSB7Ci0gICAgICAgIG1fcEFsdGVyQ1MtPkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOworICAgICAgbV9wQWx0ZXJDUy0+R2V0UkdCKHBCdWYsIFIsIEcsIEIpOworICAgIH0gZWxzZSB7CisgICAgICBSID0gRyA9IEIgPSAwLjBmOwogICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9GTE9BVCByZ2JbM107CisgIHBJY2NNb2R1bGUtPlNldENvbXBvbmVudHMobV9uQ29tcG9uZW50cyk7CisgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZShtX3BQcm9maWxlLT5tX3BUcmFuc2Zvcm0sIHBCdWYsIHJnYik7CisgIFIgPSByZ2JbMF07CisgIEcgPSByZ2JbMV07CisgIEIgPSByZ2JbMl07CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDUERGX0lDQ0Jhc2VkQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0Ci17Ci0gICAgaWYgKG1fcFByb2ZpbGUtPm1fYnNSR0IpIHsKLSAgICAgICAgUmV2ZXJzZVJHQihwRGVzdEJ1ZiwgcFNyY0J1ZiwgcGl4ZWxzKTsKLSAgICB9IGVsc2UgaWYgKG1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSkgewotICAgICAgICBpbnQgbk1heENvbG9ycyA9IDE7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSArKykgewotICAgICAgICAgICAgbk1heENvbG9ycyAqPSA1MjsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9uQ29tcG9uZW50cyA+IDMgfHwgaW1hZ2Vfd2lkdGggKiBpbWFnZV9oZWlnaHQgPCBuTWF4Q29sb3JzICogMyAvIDIpIHsKLSAgICAgICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCktPlRyYW5zbGF0ZVNjYW5saW5lKG1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSwgcERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9wQ2FjaGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICgoQ1BERl9JQ0NCYXNlZENTKil0aGlzKS0+bV9wQ2FjaGUgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG5NYXhDb2xvcnMsIDMpOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRlbXBfc3JjID0gRlhfQWxsb2MyRCh1aW50OF90LCBuTWF4Q29sb3JzLCBtX25Db21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBwU3JjID0gdGVtcF9zcmM7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTWF4Q29sb3JzOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yID0gaTsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb3JkZXIgPSBuTWF4Q29sb3JzIC8gNTI7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgbV9uQ29tcG9uZW50czsgYyArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgKnBTcmMrKyA9ICh1aW50OF90KShjb2xvciAvIG9yZGVyICogNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAlPSBvcmRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyIC89IDUyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCktPlRyYW5zbGF0ZVNjYW5saW5lKG1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSwgbV9wQ2FjaGUsIHRlbXBfc3JjLCBuTWF4Q29sb3JzKTsKLSAgICAgICAgICAgICAgICBGWF9GcmVlKHRlbXBfc3JjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IG1fbkNvbXBvbmVudHM7IGMgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCAqIDUyICsgKCpwU3JjQnVmKSAvIDU7Ci0gICAgICAgICAgICAgICAgICAgIHBTcmNCdWYgKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4ICo9IDM7Ci0gICAgICAgICAgICAgICAgKnBEZXN0QnVmKysgPSBtX3BDYWNoZVtpbmRleF07Ci0gICAgICAgICAgICAgICAgKnBEZXN0QnVmKysgPSBtX3BDYWNoZVtpbmRleCArIDFdOwotICAgICAgICAgICAgICAgICpwRGVzdEJ1ZisrID0gbV9wQ2FjaGVbaW5kZXggKyAyXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9wQWx0ZXJDUykgewotICAgICAgICBtX3BBbHRlckNTLT5UcmFuc2xhdGVJbWFnZUxpbmUocERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscywgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCk7Ci0gICAgfQorRlhfQk9PTCBDUERGX0lDQ0Jhc2VkQ1M6OnZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGspIGNvbnN0IHsKKyAgaWYgKG1fbkNvbXBvbmVudHMgIT0gNCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjID0gcEJ1ZlswXTsKKyAgbSA9IHBCdWZbMV07CisgIHkgPSBwQnVmWzJdOworICBrID0gcEJ1ZlszXTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1jbGFzcyBDUERGX0luZGV4ZWRDUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UKLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBDUERGX0luZGV4ZWRDUyhDUERGX0RvY3VtZW50KiBwRG9jKQotICAgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19JTkRFWEVELCAxKSwKLSAgICAgICAgICBtX3BCYXNlQ1MobnVsbHB0ciksCi0gICAgICAgICAgbV9wQ291bnRlZEJhc2VDUyhudWxscHRyKSwKLSAgICAgICAgICBtX3BDb21wTWluTWF4KG51bGxwdHIpIHsKK0ZYX0JPT0wgQ1BERl9JQ0NCYXNlZENTOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IHsKKyAgcmV0dXJuIEZBTFNFOworfQordm9pZCBDUERGX0lDQ0Jhc2VkQ1M6OkVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkgeworICBDUERGX0NvbG9yU3BhY2U6OkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOworICBpZiAobV9wQWx0ZXJDUykgeworICAgIG1fcEFsdGVyQ1MtPkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOworICB9Cit9Cit2b2lkIENQREZfSUNDQmFzZWRDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QgeworICBpZiAobV9wUHJvZmlsZS0+bV9ic1JHQikgeworICAgIFJldmVyc2VSR0IocERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscyk7CisgIH0gZWxzZSBpZiAobV9wUHJvZmlsZS0+bV9wVHJhbnNmb3JtKSB7CisgICAgaW50IG5NYXhDb2xvcnMgPSAxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSsrKSB7CisgICAgICBuTWF4Q29sb3JzICo9IDUyOwogICAgIH0KLSAgICB+Q1BERl9JbmRleGVkQ1MoKSBvdmVycmlkZTsKKyAgICBpZiAobV9uQ29tcG9uZW50cyA+IDMgfHwgaW1hZ2Vfd2lkdGggKiBpbWFnZV9oZWlnaHQgPCBuTWF4Q29sb3JzICogMyAvIDIpIHsKKyAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCktPlRyYW5zbGF0ZVNjYW5saW5lKAorICAgICAgICAgIG1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSwgcERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX3BDYWNoZSA9PSBOVUxMKSB7CisgICAgICAgICgoQ1BERl9JQ0NCYXNlZENTKil0aGlzKS0+bV9wQ2FjaGUgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG5NYXhDb2xvcnMsIDMpOworICAgICAgICB1aW50OF90KiB0ZW1wX3NyYyA9IEZYX0FsbG9jMkQodWludDhfdCwgbk1heENvbG9ycywgbV9uQ29tcG9uZW50cyk7CisgICAgICAgIHVpbnQ4X3QqIHBTcmMgPSB0ZW1wX3NyYzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTWF4Q29sb3JzOyBpKyspIHsKKyAgICAgICAgICBGWF9EV09SRCBjb2xvciA9IGk7CisgICAgICAgICAgRlhfRFdPUkQgb3JkZXIgPSBuTWF4Q29sb3JzIC8gNTI7CisgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBtX25Db21wb25lbnRzOyBjKyspIHsKKyAgICAgICAgICAgICpwU3JjKysgPSAodWludDhfdCkoY29sb3IgLyBvcmRlciAqIDUpOworICAgICAgICAgICAgY29sb3IgJT0gb3JkZXI7CisgICAgICAgICAgICBvcmRlciAvPSA1MjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKS0+VHJhbnNsYXRlU2NhbmxpbmUoCisgICAgICAgICAgICBtX3BQcm9maWxlLT5tX3BUcmFuc2Zvcm0sIG1fcENhY2hlLCB0ZW1wX3NyYywgbk1heENvbG9ycyk7CisgICAgICAgIEZYX0ZyZWUodGVtcF9zcmMpOworICAgICAgfQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkrKykgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IG1fbkNvbXBvbmVudHM7IGMrKykgeworICAgICAgICAgIGluZGV4ID0gaW5kZXggKiA1MiArICgqcFNyY0J1ZikgLyA1OworICAgICAgICAgIHBTcmNCdWYrKzsKKyAgICAgICAgfQorICAgICAgICBpbmRleCAqPSAzOworICAgICAgICAqcERlc3RCdWYrKyA9IG1fcENhY2hlW2luZGV4XTsKKyAgICAgICAgKnBEZXN0QnVmKysgPSBtX3BDYWNoZVtpbmRleCArIDFdOworICAgICAgICAqcERlc3RCdWYrKyA9IG1fcENhY2hlW2luZGV4ICsgMl07CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKG1fcEFsdGVyQ1MpIHsKKyAgICBtX3BBbHRlckNTLT5UcmFuc2xhdGVJbWFnZUxpbmUocERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscywgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2hlaWdodCk7CisgIH0KK30KK2NsYXNzIENQREZfSW5kZXhlZENTIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX0luZGV4ZWRDUyhDUERGX0RvY3VtZW50KiBwRG9jKQorICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfSU5ERVhFRCwgMSksCisgICAgICAgIG1fcEJhc2VDUyhudWxscHRyKSwKKyAgICAgICAgbV9wQ291bnRlZEJhc2VDUyhudWxscHRyKSwKKyAgICAgICAgbV9wQ29tcE1pbk1heChudWxscHRyKSB7fQorICB+Q1BERl9JbmRleGVkQ1MoKSBvdmVycmlkZTsKIAotICAgIEZYX0JPT0wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTAlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICAgIENQREZfQ29sb3JTcGFjZSogR2V0QmFzZUNTKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIG92ZXJyaWRlOworICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIENQREZfQ29sb3JTcGFjZSogR2V0QmFzZUNTKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKSBvdmVycmlkZTsKIAotICAgIENQREZfQ29sb3JTcGFjZSogbV9wQmFzZUNTOwotICAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIG1fcENvdW50ZWRCYXNlQ1M7Ci0gICAgaW50IG1fbkJhc2VDb21wb25lbnRzOwotICAgIGludAltX01heEluZGV4OwotICAgIENGWF9CeXRlU3RyaW5nIG1fVGFibGU7Ci0gICAgRlhfRkxPQVQqIG1fcENvbXBNaW5NYXg7CisgIENQREZfQ29sb3JTcGFjZSogbV9wQmFzZUNTOworICBDUERGX0NvdW50ZWRDb2xvclNwYWNlKiBtX3BDb3VudGVkQmFzZUNTOworICBpbnQgbV9uQmFzZUNvbXBvbmVudHM7CisgIGludCBtX01heEluZGV4OworICBDRlhfQnl0ZVN0cmluZyBtX1RhYmxlOworICBGWF9GTE9BVCogbV9wQ29tcE1pbk1heDsKIH07Ci1DUERGX0luZGV4ZWRDUzo6fkNQREZfSW5kZXhlZENTKCkKLXsKLSAgICBpZiAobV9wQ29tcE1pbk1heCkgewotICAgICAgICBGWF9GcmVlKG1fcENvbXBNaW5NYXgpOwotICAgIH0KLSAgICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IG1fcENvdW50ZWRCYXNlQ1MgPyBtX3BDb3VudGVkQmFzZUNTLT5nZXQoKSA6IE5VTEw7Ci0gICAgaWYgKHBDUyAmJiBtX3BEb2N1bWVudCkgewotICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTLT5HZXRBcnJheSgpKTsKLSAgICB9CitDUERGX0luZGV4ZWRDUzo6fkNQREZfSW5kZXhlZENTKCkgeworICBpZiAobV9wQ29tcE1pbk1heCkgeworICAgIEZYX0ZyZWUobV9wQ29tcE1pbk1heCk7CisgIH0KKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBtX3BDb3VudGVkQmFzZUNTID8gbV9wQ291bnRlZEJhc2VDUy0+Z2V0KCkgOiBOVUxMOworICBpZiAocENTICYmIG1fcERvY3VtZW50KSB7CisgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9JbmRleGVkQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCi17Ci0gICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGX0luZGV4ZWRDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgeworICBpZiAocEFycmF5LT5HZXRDb3VudCgpIDwgNCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX09iamVjdCogcEJhc2VPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgxKTsKKyAgaWYgKHBCYXNlT2JqID09IG1fcEFycmF5KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IHBEb2MtPkdldFBhZ2VEYXRhKCk7CisgIG1fcEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQmFzZU9iaiwgTlVMTCk7CisgIGlmIChtX3BCYXNlQ1MgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BDb3VudGVkQmFzZUNTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BCYXNlQ1MtPkdldEFycmF5KCkpOworICBtX25CYXNlQ29tcG9uZW50cyA9IG1fcEJhc2VDUy0+Q291bnRDb21wb25lbnRzKCk7CisgIG1fcENvbXBNaW5NYXggPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25CYXNlQ29tcG9uZW50cywgMik7CisgIEZYX0ZMT0FUIGRlZnZhbHVlOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkJhc2VDb21wb25lbnRzOyBpKyspIHsKKyAgICBtX3BCYXNlQ1MtPkdldERlZmF1bHRWYWx1ZShpLCBkZWZ2YWx1ZSwgbV9wQ29tcE1pbk1heFtpICogMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29tcE1pbk1heFtpICogMiArIDFdKTsKKyAgICBtX3BDb21wTWluTWF4W2kgKiAyICsgMV0gLT0gbV9wQ29tcE1pbk1heFtpICogMl07CisgIH0KKyAgbV9NYXhJbmRleCA9IHBBcnJheS0+R2V0SW50ZWdlcigyKTsKKyAgQ1BERl9PYmplY3QqIHBUYWJsZU9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDMpOworICBpZiAocFRhYmxlT2JqID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBUYWJsZU9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKKyAgICBtX1RhYmxlID0gKChDUERGX1N0cmluZyopcFRhYmxlT2JqKS0+R2V0U3RyaW5nKCk7CisgIH0gZWxzZSBpZiAocFRhYmxlT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgeworICAgIENQREZfU3RyZWFtQWNjIGFjYzsKKyAgICBhY2MuTG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwVGFibGVPYmosIEZBTFNFKTsKKyAgICBtX1RhYmxlID0gQ0ZYX0J5dGVTdHJpbmdDKGFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZfSW5kZXhlZENTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IHsKKyAgaW50IGluZGV4ID0gKGludDMyX3QpKCpwQnVmKTsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG1fTWF4SW5kZXgpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fbkJhc2VDb21wb25lbnRzKSB7CisgICAgaWYgKGluZGV4ID09IElOVF9NQVggfHwgKGluZGV4ICsgMSkgPiBJTlRfTUFYIC8gbV9uQmFzZUNvbXBvbmVudHMgfHwKKyAgICAgICAgKGluZGV4ICsgMSkgKiBtX25CYXNlQ29tcG9uZW50cyA+IChpbnQpbV9UYWJsZS5HZXRMZW5ndGgoKSkgeworICAgICAgUiA9IEcgPSBCID0gMDsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBCYXNlT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMSk7Ci0gICAgaWYgKHBCYXNlT2JqID09IG1fcEFycmF5KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gcERvYy0+R2V0UGFnZURhdGEoKTsKLSAgICBtX3BCYXNlQ1MgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocEJhc2VPYmosIE5VTEwpOwotICAgIGlmIChtX3BCYXNlQ1MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IENvbXBzKG1fbkJhc2VDb21wb25lbnRzKTsKKyAgRlhfRkxPQVQqIGNvbXBzID0gQ29tcHM7CisgIGNvbnN0IHVpbnQ4X3QqIHBUYWJsZSA9IG1fVGFibGU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQmFzZUNvbXBvbmVudHM7IGkrKykgeworICAgIGNvbXBzW2ldID0KKyAgICAgICAgbV9wQ29tcE1pbk1heFtpICogMl0gKworICAgICAgICBtX3BDb21wTWluTWF4W2kgKiAyICsgMV0gKiBwVGFibGVbaW5kZXggKiBtX25CYXNlQ29tcG9uZW50cyArIGldIC8gMjU1OworICB9CisgIG1fcEJhc2VDUy0+R2V0UkdCKGNvbXBzLCBSLCBHLCBCKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitDUERGX0NvbG9yU3BhY2UqIENQREZfSW5kZXhlZENTOjpHZXRCYXNlQ1MoKSBjb25zdCB7CisgIHJldHVybiBtX3BCYXNlQ1M7Cit9Cit2b2lkIENQREZfSW5kZXhlZENTOjpFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIHsKKyAgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKKyAgaWYgKG1fcEJhc2VDUykgeworICAgIG1fcEJhc2VDUy0+RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CisgIH0KK30KKyNkZWZpbmUgTUFYX1BBVFRFUk5fQ09MT1JDT01QUyAxNgordHlwZWRlZiBzdHJ1Y3QgX1BhdHRlcm5WYWx1ZSB7CisgIENQREZfUGF0dGVybiogbV9wUGF0dGVybjsKKyAgQ1BERl9Db3VudGVkUGF0dGVybiogbV9wQ291bnRlZFBhdHRlcm47CisgIGludCBtX25Db21wczsKKyAgRlhfRkxPQVQgbV9Db21wc1tNQVhfUEFUVEVSTl9DT0xPUkNPTVBTXTsKK30gUGF0dGVyblZhbHVlOworQ1BERl9QYXR0ZXJuQ1M6On5DUERGX1BhdHRlcm5DUygpIHsKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBtX3BDb3VudGVkQmFzZUNTID8gbV9wQ291bnRlZEJhc2VDUy0+Z2V0KCkgOiBOVUxMOworICBpZiAocENTICYmIG1fcERvY3VtZW50KSB7CisgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9QYXR0ZXJuQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKKyAgQ1BERl9PYmplY3QqIHBCYXNlQ1MgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgxKTsKKyAgaWYgKHBCYXNlQ1MgPT0gbV9wQXJyYXkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gcERvYy0+R2V0UGFnZURhdGEoKTsKKyAgbV9wQmFzZUNTID0gcERvY1BhZ2VEYXRhLT5HZXRDb2xvclNwYWNlKHBCYXNlQ1MsIE5VTEwpOworICBpZiAobV9wQmFzZUNTKSB7CisgICAgaWYgKG1fcEJhc2VDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BDb3VudGVkQmFzZUNTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BCYXNlQ1MtPkdldEFycmF5KCkpOwotICAgIG1fbkJhc2VDb21wb25lbnRzID0gbV9wQmFzZUNTLT5Db3VudENvbXBvbmVudHMoKTsKLSAgICBtX3BDb21wTWluTWF4ID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uQmFzZUNvbXBvbmVudHMsIDIpOwotICAgIEZYX0ZMT0FUIGRlZnZhbHVlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQmFzZUNvbXBvbmVudHM7IGkgKyspIHsKLSAgICAgICAgbV9wQmFzZUNTLT5HZXREZWZhdWx0VmFsdWUoaSwgZGVmdmFsdWUsIG1fcENvbXBNaW5NYXhbaSAqIDJdLCBtX3BDb21wTWluTWF4W2kgKiAyICsgMV0pOwotICAgICAgICBtX3BDb21wTWluTWF4W2kgKiAyICsgMV0gLT0gbV9wQ29tcE1pbk1heFtpICogMl07CisgICAgbV9uQ29tcG9uZW50cyA9IG1fcEJhc2VDUy0+Q291bnRDb21wb25lbnRzKCkgKyAxOworICAgIGlmIChtX3BCYXNlQ1MtPkNvdW50Q29tcG9uZW50cygpID4gTUFYX1BBVFRFUk5fQ09MT1JDT01QUykgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBtX01heEluZGV4ID0gcEFycmF5LT5HZXRJbnRlZ2VyKDIpOwotICAgIENQREZfT2JqZWN0KiBwVGFibGVPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgzKTsKLSAgICBpZiAocFRhYmxlT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocFRhYmxlT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewotICAgICAgICBtX1RhYmxlID0gKChDUERGX1N0cmluZyopcFRhYmxlT2JqKS0+R2V0U3RyaW5nKCk7Ci0gICAgfSBlbHNlIGlmIChwVGFibGVPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICAgICAgYWNjLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcFRhYmxlT2JqLCBGQUxTRSk7Ci0gICAgICAgIG1fVGFibGUgPSBDRlhfQnl0ZVN0cmluZ0MoYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIG1fbkNvbXBvbmVudHMgPSAxOworICB9CisgIHJldHVybiBUUlVFOwogfQorRlhfQk9PTCBDUERGX1BhdHRlcm5DUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCB7CisgIGlmIChtX3BCYXNlQ1MpIHsKKyAgICBBU1NFUlQobV9wQmFzZUNTLT5HZXRGYW1pbHkoKSAhPSBQREZDU19QQVRURVJOKTsKKyAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKXBCdWY7CisgICAgaWYgKG1fcEJhc2VDUy0+R2V0UkdCKHB2YWx1ZS0+bV9Db21wcywgUiwgRywgQikpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBSID0gRyA9IEIgPSAwLjc1ZjsKKyAgcmV0dXJuIEZBTFNFOworfQorQ1BERl9Db2xvclNwYWNlKiBDUERGX1BhdHRlcm5DUzo6R2V0QmFzZUNTKCkgY29uc3QgeworICByZXR1cm4gbV9wQmFzZUNTOworfQorY2xhc3MgQ1BERl9TZXBhcmF0aW9uQ1MgOiBwdWJsaWMgQ1BERl9Db2xvclNwYWNlIHsKKyBwdWJsaWM6CisgIENQREZfU2VwYXJhdGlvbkNTKENQREZfRG9jdW1lbnQqIHBEb2MpCisgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19TRVBBUkFUSU9OLCAxKSwKKyAgICAgICAgbV9wQWx0Q1MobnVsbHB0ciksCisgICAgICAgIG1fcEZ1bmMobnVsbHB0cikge30KKyAgfkNQREZfU2VwYXJhdGlvbkNTKCkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKSBvdmVycmlkZTsKIAotRlhfQk9PTCBDUERGX0luZGV4ZWRDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAotewotICAgIGludCBpbmRleCA9IChpbnQzMl90KSgqcEJ1Zik7Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG1fTWF4SW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9uQmFzZUNvbXBvbmVudHMpIHsKLSAgICAgICAgaWYgKGluZGV4ID09IElOVF9NQVggfHwgKGluZGV4ICsgMSkgPiBJTlRfTUFYIC8gbV9uQmFzZUNvbXBvbmVudHMgfHwKLSAgICAgICAgICAgICAgICAoaW5kZXggKyAxKSptX25CYXNlQ29tcG9uZW50cyA+IChpbnQpbV9UYWJsZS5HZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgUiA9IEcgPSBCID0gMDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gQ29tcHMobV9uQmFzZUNvbXBvbmVudHMpOwotICAgIEZYX0ZMT0FUKiBjb21wcyA9IENvbXBzOwotICAgIGNvbnN0IHVpbnQ4X3QqIHBUYWJsZSA9IG1fVGFibGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25CYXNlQ29tcG9uZW50czsgaSArKykgewotICAgICAgICBjb21wc1tpXSA9IG1fcENvbXBNaW5NYXhbaSAqIDJdICsgbV9wQ29tcE1pbk1heFtpICogMiArIDFdICogcFRhYmxlW2luZGV4ICogbV9uQmFzZUNvbXBvbmVudHMgKyBpXSAvIDI1NTsKLSAgICB9Ci0gICAgbV9wQmFzZUNTLT5HZXRSR0IoY29tcHMsIFIsIEcsIEIpOwotICAgIHJldHVybiBUUlVFOwotfQotQ1BERl9Db2xvclNwYWNlKkNQREZfSW5kZXhlZENTOjpHZXRCYXNlQ1MoKSBjb25zdAotewotICAgIHJldHVybiBtX3BCYXNlQ1M7Ci19Ci12b2lkIENQREZfSW5kZXhlZENTOjpFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0gICAgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKLSAgICBpZiAobV9wQmFzZUNTKSB7Ci0gICAgICAgIG1fcEJhc2VDUy0+RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7Ci0gICAgfQotfQotI2RlZmluZSBNQVhfUEFUVEVSTl9DT0xPUkNPTVBTCTE2Ci10eXBlZGVmIHN0cnVjdCBfUGF0dGVyblZhbHVlIHsKLSAgICBDUERGX1BhdHRlcm4qCW1fcFBhdHRlcm47Ci0gICAgQ1BERl9Db3VudGVkUGF0dGVybioJbV9wQ291bnRlZFBhdHRlcm47Ci0gICAgaW50CQkJCW1fbkNvbXBzOwotICAgIEZYX0ZMT0FUCQltX0NvbXBzW01BWF9QQVRURVJOX0NPTE9SQ09NUFNdOwotfSBQYXR0ZXJuVmFsdWU7Ci1DUERGX1BhdHRlcm5DUzo6fkNQREZfUGF0dGVybkNTKCkKLXsKLSAgICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IG1fcENvdW50ZWRCYXNlQ1MgPyBtX3BDb3VudGVkQmFzZUNTLT5nZXQoKSA6IE5VTEw7Ci0gICAgaWYgKHBDUyAmJiBtX3BEb2N1bWVudCkgewotCSAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTLT5HZXRBcnJheSgpKTsKLSAgICB9Ci19Ci1GWF9CT09MIENQREZfUGF0dGVybkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQotewotICAgIENQREZfT2JqZWN0KiBwQmFzZUNTID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMSk7Ci0gICAgaWYgKHBCYXNlQ1MgPT0gbV9wQXJyYXkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBwRG9jLT5HZXRQYWdlRGF0YSgpOwotICAgIG1fcEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQmFzZUNTLCBOVUxMKTsKLSAgICBpZiAobV9wQmFzZUNTKSB7Ci0gICAgICAgIGlmIChtX3BCYXNlQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX3BDb3VudGVkQmFzZUNTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BCYXNlQ1MtPkdldEFycmF5KCkpOwotICAgICAgICBtX25Db21wb25lbnRzID0gbV9wQmFzZUNTLT5Db3VudENvbXBvbmVudHMoKSArIDE7Ci0gICAgICAgIGlmIChtX3BCYXNlQ1MtPkNvdW50Q29tcG9uZW50cygpID4gTUFYX1BBVFRFUk5fQ09MT1JDT01QUykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9uQ29tcG9uZW50cyA9IDE7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1BhdHRlcm5DUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAotewotICAgIGlmIChtX3BCYXNlQ1MpIHsKLSAgICAgICAgQVNTRVJUKG1fcEJhc2VDUy0+R2V0RmFtaWx5KCkgIT0gUERGQ1NfUEFUVEVSTik7Ci0gICAgICAgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopcEJ1ZjsKLSAgICAgICAgaWYgKG1fcEJhc2VDUy0+R2V0UkdCKHB2YWx1ZS0+bV9Db21wcywgUiwgRywgQikpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIFIgPSBHID0gQiA9IDAuNzVmOwotICAgIHJldHVybiBGQUxTRTsKLX0KLUNQREZfQ29sb3JTcGFjZSogQ1BERl9QYXR0ZXJuQ1M6OkdldEJhc2VDUygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcEJhc2VDUzsKLX0KLWNsYXNzIENQREZfU2VwYXJhdGlvbkNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZQotewotcHVibGljOgotICAgIENQREZfU2VwYXJhdGlvbkNTKENQREZfRG9jdW1lbnQqIHBEb2MpCi0gICAgICAgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19TRVBBUkFUSU9OLCAxKSwKLSAgICAgICAgICAgICAgbV9wQWx0Q1MobnVsbHB0ciksCi0gICAgICAgICAgICAgIG1fcEZ1bmMobnVsbHB0cikgewotICAgIH0KLSAgICB+Q1BERl9TZXBhcmF0aW9uQ1MoKSBvdmVycmlkZTsKLSAgICB2b2lkIEdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwgRlhfRkxPQVQmIHZhbHVlLCBGWF9GTE9BVCYgbWluLCBGWF9GTE9BVCYgbWF4KSBjb25zdCBvdmVycmlkZTsKLSAgICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICAgIEZYX0JPT0wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkgb3ZlcnJpZGU7Ci0KLSAgICBDUERGX0NvbG9yU3BhY2UqIG1fcEFsdENTOwotICAgIENQREZfRnVuY3Rpb24qIG1fcEZ1bmM7Ci0gICAgZW51bSB7IE5vbmUsIEFsbCwgQ29sb3JhbnQgfSBtX1R5cGU7CisgIENQREZfQ29sb3JTcGFjZSogbV9wQWx0Q1M7CisgIENQREZfRnVuY3Rpb24qIG1fcEZ1bmM7CisgIGVudW0geyBOb25lLCBBbGwsIENvbG9yYW50IH0gbV9UeXBlOwogfTsKLUNQREZfU2VwYXJhdGlvbkNTOjp+Q1BERl9TZXBhcmF0aW9uQ1MoKQotewotICAgIGlmIChtX3BBbHRDUykgewotICAgICAgICBtX3BBbHRDUy0+UmVsZWFzZUNTKCk7Ci0gICAgfQotICAgIGRlbGV0ZSBtX3BGdW5jOworQ1BERl9TZXBhcmF0aW9uQ1M6On5DUERGX1NlcGFyYXRpb25DUygpIHsKKyAgaWYgKG1fcEFsdENTKSB7CisgICAgbV9wQWx0Q1MtPlJlbGVhc2VDUygpOworICB9CisgIGRlbGV0ZSBtX3BGdW5jOwogfQotdm9pZCBDUERGX1NlcGFyYXRpb25DUzo6R2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LCBGWF9GTE9BVCYgdmFsdWUsIEZYX0ZMT0FUJiBtaW4sIEZYX0ZMT0FUJiBtYXgpIGNvbnN0Ci17Ci0gICAgdmFsdWUgPSAxLjBmOwotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gMS4wZjsKK3ZvaWQgQ1BERl9TZXBhcmF0aW9uQ1M6OkdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWF4KSBjb25zdCB7CisgIHZhbHVlID0gMS4wZjsKKyAgbWluID0gMDsKKyAgbWF4ID0gMS4wZjsKIH0KLUZYX0JPT0wgQ1BERl9TZXBhcmF0aW9uQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IHBBcnJheS0+R2V0U3RyaW5nKDEpOwotICAgIGlmIChuYW1lID09IEZYX0JTVFJDKCJOb25lIikpIHsKLSAgICAgICAgbV9UeXBlID0gTm9uZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1R5cGUgPSBDb2xvcmFudDsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBBbHRDUyA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDIpOwotICAgICAgICBpZiAocEFsdENTID09IG1fcEFycmF5KSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wQWx0Q1MgPSBMb2FkKHBEb2MsIHBBbHRDUyk7Ci0gICAgICAgIGlmICghbV9wQWx0Q1MpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcEZ1bmNPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgzKTsKLSAgICAgICAgaWYgKHBGdW5jT2JqICYmIHBGdW5jT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgICAgIG1fcEZ1bmMgPSBDUERGX0Z1bmN0aW9uOjpMb2FkKHBGdW5jT2JqKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wRnVuYyAmJiBtX3BGdW5jLT5Db3VudE91dHB1dHMoKSA8IG1fcEFsdENTLT5Db3VudENvbXBvbmVudHMoKSkgewotICAgICAgICAgICAgZGVsZXRlIG1fcEZ1bmM7Ci0gICAgICAgICAgICBtX3BGdW5jID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9TZXBhcmF0aW9uQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKLXsKLSAgICBpZiAobV9UeXBlID09IE5vbmUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wRnVuYyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChtX3BBbHRDUyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5Db21wcyA9IG1fcEFsdENTLT5Db3VudENvbXBvbmVudHMoKTsKLSAgICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdHMobkNvbXBzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ29tcHM7IGkgKyspIHsKLSAgICAgICAgICAgIHJlc3VsdHNbaV0gPSAqcEJ1ZjsKLSAgICAgICAgfQotICAgICAgICBtX3BBbHRDUy0+R2V0UkdCKHJlc3VsdHMsIFIsIEcsIEIpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdHMobV9wRnVuYy0+Q291bnRPdXRwdXRzKCkpOwotICAgIGludCBucmVzdWx0cyA9IDA7Ci0gICAgbV9wRnVuYy0+Q2FsbChwQnVmLCAxLCByZXN1bHRzLCBucmVzdWx0cyk7Ci0gICAgaWYgKG5yZXN1bHRzID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wQWx0Q1MpIHsKLSAgICAgICAgbV9wQWx0Q1MtPkdldFJHQihyZXN1bHRzLCBSLCBHLCBCKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIFIgPSBHID0gQiA9IDA7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotdm9pZCBDUERGX1NlcGFyYXRpb25DUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQotewotICAgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7Ci0gICAgaWYgKG1fcEFsdENTKSB7Ci0gICAgICAgIG1fcEFsdENTLT5FbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKLSAgICB9Ci19Ci1jbGFzcyBDUERGX0RldmljZU5DUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UKLXsKLXB1YmxpYzoKLSAgICBDUERGX0RldmljZU5DUyhDUERGX0RvY3VtZW50KiBwRG9jKQotICAgICAgICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfREVWSUNFTiwgMCksCi0gICAgICAgICAgICAgIG1fcEFsdENTKG51bGxwdHIpLAotICAgICAgICAgICAgICBtX3BGdW5jKG51bGxwdHIpIHsKLSAgICB9Ci0gICAgfkNQREZfRGV2aWNlTkNTKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBHZXREZWZhdWx0VmFsdWUoaW50IGlDb21wb25lbnQsIEZYX0ZMT0FUJiB2YWx1ZSwgRlhfRkxPQVQmIG1pbiwgRlhfRkxPQVQmIG1heCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIG92ZXJyaWRlOwotCi0gICAgQ1BERl9Db2xvclNwYWNlKiBtX3BBbHRDUzsKLSAgICBDUERGX0Z1bmN0aW9uKiBtX3BGdW5jOwotfTsKLUNQREZfRGV2aWNlTkNTOjp+Q1BERl9EZXZpY2VOQ1MoKQotewotICAgIGRlbGV0ZSBtX3BGdW5jOwotICAgIGlmIChtX3BBbHRDUykgewotICAgICAgICBtX3BBbHRDUy0+UmVsZWFzZUNTKCk7Ci0gICAgfQotfQotdm9pZCBDUERGX0RldmljZU5DUzo6R2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LCBGWF9GTE9BVCYgdmFsdWUsIEZYX0ZMT0FUJiBtaW4sIEZYX0ZMT0FUJiBtYXgpIGNvbnN0Ci17Ci0gICAgdmFsdWUgPSAxLjBmOwotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gMS4wZjsKLX0KLUZYX0JPT0wgQ1BERl9EZXZpY2VOQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgxKTsKLSAgICBpZiAoIXBPYmopIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fbkNvbXBvbmVudHMgPSAoKENQREZfQXJyYXkqKXBPYmopLT5HZXRDb3VudCgpOworRlhfQk9PTCBDUERGX1NlcGFyYXRpb25DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgeworICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gcEFycmF5LT5HZXRTdHJpbmcoMSk7CisgIGlmIChuYW1lID09IEZYX0JTVFJDKCJOb25lIikpIHsKKyAgICBtX1R5cGUgPSBOb25lOworICB9IGVsc2UgeworICAgIG1fVHlwZSA9IENvbG9yYW50OwogICAgIENQREZfT2JqZWN0KiBwQWx0Q1MgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgyKTsKLSAgICBpZiAoIXBBbHRDUyB8fCBwQWx0Q1MgPT0gbV9wQXJyYXkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChwQWx0Q1MgPT0gbV9wQXJyYXkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9wQWx0Q1MgPSBMb2FkKHBEb2MsIHBBbHRDUyk7Ci0gICAgbV9wRnVuYyA9IENQREZfRnVuY3Rpb246OkxvYWQocEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMykpOwotICAgIGlmIChtX3BBbHRDUyA9PSBOVUxMIHx8IG1fcEZ1bmMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFtX3BBbHRDUykgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZiAobV9wRnVuYy0+Q291bnRPdXRwdXRzKCkgPCBtX3BBbHRDUy0+Q291bnRDb21wb25lbnRzKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIENQREZfT2JqZWN0KiBwRnVuY09iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDMpOworICAgIGlmIChwRnVuY09iaiAmJiBwRnVuY09iai0+R2V0VHlwZSgpICE9IFBERk9CSl9OQU1FKSB7CisgICAgICBtX3BGdW5jID0gQ1BERl9GdW5jdGlvbjo6TG9hZChwRnVuY09iaik7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIGlmIChtX3BGdW5jICYmIG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpIDwgbV9wQWx0Q1MtPkNvdW50Q29tcG9uZW50cygpKSB7CisgICAgICBkZWxldGUgbV9wRnVuYzsKKyAgICAgIG1fcEZ1bmMgPSBOVUxMOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9EZXZpY2VOQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKLXsKLSAgICBpZiAobV9wRnVuYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9TZXBhcmF0aW9uQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3QgeworICBpZiAobV9UeXBlID09IE5vbmUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcEZ1bmMgPT0gTlVMTCkgeworICAgIGlmIChtX3BBbHRDUyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKLSAgICBpbnQgbnJlc3VsdHMgPSAwOwotICAgIG1fcEZ1bmMtPkNhbGwocEJ1ZiwgbV9uQ29tcG9uZW50cywgcmVzdWx0cywgbnJlc3VsdHMpOwotICAgIGlmIChucmVzdWx0cyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpbnQgbkNvbXBzID0gbV9wQWx0Q1MtPkNvdW50Q29tcG9uZW50cygpOworICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKG5Db21wcyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ29tcHM7IGkrKykgeworICAgICAgcmVzdWx0c1tpXSA9ICpwQnVmOwogICAgIH0KICAgICBtX3BBbHRDUy0+R2V0UkdCKHJlc3VsdHMsIFIsIEcsIEIpOwogICAgIHJldHVybiBUUlVFOworICB9CisgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKKyAgaW50IG5yZXN1bHRzID0gMDsKKyAgbV9wRnVuYy0+Q2FsbChwQnVmLCAxLCByZXN1bHRzLCBucmVzdWx0cyk7CisgIGlmIChucmVzdWx0cyA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BBbHRDUykgeworICAgIG1fcEFsdENTLT5HZXRSR0IocmVzdWx0cywgUiwgRywgQik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgUiA9IEcgPSBCID0gMDsKKyAgcmV0dXJuIEZBTFNFOwogfQotdm9pZCBDUERGX0RldmljZU5DUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQotewotICAgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7Ci0gICAgaWYgKG1fcEFsdENTKSB7Ci0gICAgICAgIG1fcEFsdENTLT5FbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKLSAgICB9Cit2b2lkIENQREZfU2VwYXJhdGlvbkNTOjpFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIHsKKyAgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKKyAgaWYgKG1fcEFsdENTKSB7CisgICAgbV9wQWx0Q1MtPkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOworICB9CiB9Ci1DUERGX0NvbG9yU3BhY2UqIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhpbnQgZmFtaWx5KQotewotICAgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0U3RvY2tDUyhmYW1pbHkpOzsKK2NsYXNzIENQREZfRGV2aWNlTkNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7CisgcHVibGljOgorICBDUERGX0RldmljZU5DUyhDUERGX0RvY3VtZW50KiBwRG9jKQorICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfREVWSUNFTiwgMCksCisgICAgICAgIG1fcEFsdENTKG51bGxwdHIpLAorICAgICAgICBtX3BGdW5jKG51bGxwdHIpIHt9CisgIH5DUERGX0RldmljZU5DUygpIG92ZXJyaWRlOworICB2b2lkIEdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWluLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWF4KSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkgb3ZlcnJpZGU7CisKKyAgQ1BERl9Db2xvclNwYWNlKiBtX3BBbHRDUzsKKyAgQ1BERl9GdW5jdGlvbiogbV9wRnVuYzsKK307CitDUERGX0RldmljZU5DUzo6fkNQREZfRGV2aWNlTkNTKCkgeworICBkZWxldGUgbV9wRnVuYzsKKyAgaWYgKG1fcEFsdENTKSB7CisgICAgbV9wQWx0Q1MtPlJlbGVhc2VDUygpOworICB9CiB9Ci1DUERGX0NvbG9yU3BhY2UqIF9DU0Zyb21OYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKQotewotICAgIGlmIChuYW1lID09IEZYX0JTVFJDKCJEZXZpY2VSR0IiKSB8fCBuYW1lID09IEZYX0JTVFJDKCJSR0IiKSkgewotICAgICAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQik7Cit2b2lkIENQREZfRGV2aWNlTkNTOjpHZXREZWZhdWx0VmFsdWUoaW50IGlDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG1heCkgY29uc3QgeworICB2YWx1ZSA9IDEuMGY7CisgIG1pbiA9IDA7CisgIG1heCA9IDEuMGY7Cit9CitGWF9CT09MIENQREZfRGV2aWNlTkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMSk7CisgIGlmICghcE9iaikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX25Db21wb25lbnRzID0gKChDUERGX0FycmF5KilwT2JqKS0+R2V0Q291bnQoKTsKKyAgQ1BERl9PYmplY3QqIHBBbHRDUyA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDIpOworICBpZiAoIXBBbHRDUyB8fCBwQWx0Q1MgPT0gbV9wQXJyYXkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wQWx0Q1MgPSBMb2FkKHBEb2MsIHBBbHRDUyk7CisgIG1fcEZ1bmMgPSBDUERGX0Z1bmN0aW9uOjpMb2FkKHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDMpKTsKKyAgaWYgKG1fcEFsdENTID09IE5VTEwgfHwgbV9wRnVuYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BGdW5jLT5Db3VudE91dHB1dHMoKSA8IG1fcEFsdENTLT5Db3VudENvbXBvbmVudHMoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9EZXZpY2VOQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3QgeworICBpZiAobV9wRnVuYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKKyAgaW50IG5yZXN1bHRzID0gMDsKKyAgbV9wRnVuYy0+Q2FsbChwQnVmLCBtX25Db21wb25lbnRzLCByZXN1bHRzLCBucmVzdWx0cyk7CisgIGlmIChucmVzdWx0cyA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcEFsdENTLT5HZXRSR0IocmVzdWx0cywgUiwgRywgQik7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX0RldmljZU5DUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKSB7CisgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CisgIGlmIChtX3BBbHRDUykgeworICAgIG1fcEFsdENTLT5FbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKKyAgfQorfQorQ1BERl9Db2xvclNwYWNlKiBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoaW50IGZhbWlseSkgeworICByZXR1cm4gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldFN0b2NrQ1MoZmFtaWx5KTsKKyAgOworfQorQ1BERl9Db2xvclNwYWNlKiBfQ1NGcm9tTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgeworICBpZiAobmFtZSA9PSBGWF9CU1RSQygiRGV2aWNlUkdCIikgfHwgbmFtZSA9PSBGWF9CU1RSQygiUkdCIikpIHsKKyAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQik7CisgIH0KKyAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZUdyYXkiKSB8fCBuYW1lID09IEZYX0JTVFJDKCJHIikpIHsKKyAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpOworICB9CisgIGlmIChuYW1lID09IEZYX0JTVFJDKCJEZXZpY2VDTVlLIikgfHwgbmFtZSA9PSBGWF9CU1RSQygiQ01ZSyIpKSB7CisgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKKyAgfQorICBpZiAobmFtZSA9PSBGWF9CU1RSQygiUGF0dGVybiIpKSB7CisgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19QQVRURVJOKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KK0NQREZfQ29sb3JTcGFjZSogQ1BERl9Db2xvclNwYWNlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7CisgICAgcmV0dXJuIF9DU0Zyb21OYW1lKHBPYmotPkdldFN0cmluZygpKTsKKyAgfQorICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKChDUERGX1N0cmVhbSopcE9iaiktPkdldERpY3QoKTsKKyAgICBpZiAoIXBEaWN0KSB7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZUdyYXkiKSB8fCBuYW1lID09IEZYX0JTVFJDKCJHIikpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VHUkFZKTsKLSAgICB9Ci0gICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZUNNWUsiKSB8fCBuYW1lID09IEZYX0JTVFJDKCJDTVlLIikpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKLSAgICB9Ci0gICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIlBhdHRlcm4iKSkgewotICAgICAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX1BBVFRFUk4pOworICAgIENQREZfQ29sb3JTcGFjZSogcFJldCA9IE5VTEw7CisgICAgRlhfUE9TSVRJT04gcG9zID0gcERpY3QtPkdldFN0YXJ0UG9zKCk7CisgICAgd2hpbGUgKHBvcykgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNLZXk7CisgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gcERpY3QtPkdldE5leHRFbGVtZW50KHBvcywgYnNLZXkpOworICAgICAgaWYgKHBWYWx1ZSAmJiBwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgeworICAgICAgICBwUmV0ID0gX0NTRnJvbU5hbWUocFZhbHVlLT5HZXRTdHJpbmcoKSk7CisgICAgICB9CisgICAgICBpZiAocFJldCkgeworICAgICAgICByZXR1cm4gcFJldDsKKyAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcE9iajsKKyAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBGYW1pbHlPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgwKTsKKyAgaWYgKCFwRmFtaWx5T2JqKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgZmFtaWx5bmFtZSA9IHBGYW1pbHlPYmotPkdldFN0cmluZygpOworICBpZiAocEFycmF5LT5HZXRDb3VudCgpID09IDEpIHsKKyAgICByZXR1cm4gX0NTRnJvbU5hbWUoZmFtaWx5bmFtZSk7CisgIH0KKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBOVUxMOworICBGWF9EV09SRCBpZCA9IGZhbWlseW5hbWUuR2V0SUQoKTsKKyAgaWYgKGlkID09IEZYQlNUUl9JRCgnQycsICdhJywgJ2wnLCAnRycpKSB7CisgICAgcENTID0gbmV3IENQREZfQ2FsR3JheShwRG9jKTsKKyAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0MnLCAnYScsICdsJywgJ1InKSkgeworICAgIHBDUyA9IG5ldyBDUERGX0NhbFJHQihwRG9jKTsKKyAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0wnLCAnYScsICdiJywgMCkpIHsKKyAgICBwQ1MgPSBuZXcgQ1BERl9MYWJDUyhwRG9jKTsKKyAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0knLCAnQycsICdDJywgJ0InKSkgeworICAgIHBDUyA9IG5ldyBDUERGX0lDQ0Jhc2VkQ1MocERvYyk7CisgIH0gZWxzZSBpZiAoaWQgPT0gRlhCU1RSX0lEKCdJJywgJ24nLCAnZCcsICdlJykgfHwKKyAgICAgICAgICAgICBpZCA9PSBGWEJTVFJfSUQoJ0knLCAwLCAwLCAwKSkgeworICAgIHBDUyA9IG5ldyBDUERGX0luZGV4ZWRDUyhwRG9jKTsKKyAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ1MnLCAnZScsICdwJywgJ2EnKSkgeworICAgIHBDUyA9IG5ldyBDUERGX1NlcGFyYXRpb25DUyhwRG9jKTsKKyAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0QnLCAnZScsICd2JywgJ2knKSkgeworICAgIHBDUyA9IG5ldyBDUERGX0RldmljZU5DUyhwRG9jKTsKKyAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ1AnLCAnYScsICd0JywgJ3QnKSkgeworICAgIHBDUyA9IG5ldyBDUERGX1BhdHRlcm5DUyhwRG9jKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwQ1MtPm1fcEFycmF5ID0gcEFycmF5OworICBpZiAoIXBDUy0+dl9Mb2FkKHBEb2MsIHBBcnJheSkpIHsKKyAgICBwQ1MtPlJlbGVhc2VDUygpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBwQ1M7CiB9Ci1DUERGX0NvbG9yU3BhY2UqIENQREZfQ29sb3JTcGFjZTo6TG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgIHJldHVybiBfQ1NGcm9tTmFtZShwT2JqLT5HZXRTdHJpbmcoKSk7Ci0gICAgfQotICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gKChDUERGX1N0cmVhbSAqKXBPYmopLT5HZXREaWN0KCk7Ci0gICAgICAgIGlmICghcERpY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIENQREZfQ29sb3JTcGFjZSAqcFJldCA9IE5VTEw7Ci0gICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBEaWN0LT5HZXRTdGFydFBvcygpOwotICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0tleTsKLSAgICAgICAgICAgIENQREZfT2JqZWN0ICpwVmFsdWUgPSBwRGljdC0+R2V0TmV4dEVsZW1lbnQocG9zLCBic0tleSk7Ci0gICAgICAgICAgICBpZiAocFZhbHVlICYmIHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgICAgICAgICAgcFJldCA9IF9DU0Zyb21OYW1lKHBWYWx1ZS0+R2V0U3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBSZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcFJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwT2JqOwotICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QgKnBGYW1pbHlPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgwKTsKLSAgICBpZiAoIXBGYW1pbHlPYmopIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGZhbWlseW5hbWUgPSBwRmFtaWx5T2JqLT5HZXRTdHJpbmcoKTsKLSAgICBpZiAocEFycmF5LT5HZXRDb3VudCgpID09IDEpIHsKLSAgICAgICAgcmV0dXJuIF9DU0Zyb21OYW1lKGZhbWlseW5hbWUpOwotICAgIH0KLSAgICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IE5VTEw7Ci0gICAgRlhfRFdPUkQgaWQgPSBmYW1pbHluYW1lLkdldElEKCk7Ci0gICAgaWYgKGlkID09IEZYQlNUUl9JRCgnQycsICdhJywgJ2wnLCAnRycpKSB7Ci0gICAgICAgIHBDUyA9IG5ldyBDUERGX0NhbEdyYXkocERvYyk7Ci0gICAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0MnLCAnYScsICdsJywgJ1InKSkgewotICAgICAgICBwQ1MgPSBuZXcgQ1BERl9DYWxSR0IocERvYyk7Ci0gICAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0wnLCAnYScsICdiJywgMCkpIHsKLSAgICAgICAgcENTID0gbmV3IENQREZfTGFiQ1MocERvYyk7Ci0gICAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0knLCAnQycsICdDJywgJ0InKSkgewotICAgICAgICBwQ1MgPSBuZXcgQ1BERl9JQ0NCYXNlZENTKHBEb2MpOwotICAgIH0gZWxzZSBpZiAoaWQgPT0gRlhCU1RSX0lEKCdJJywgJ24nLCAnZCcsICdlJykgfHwgaWQgPT0gRlhCU1RSX0lEKCdJJywgMCwgMCwgMCkpIHsKLSAgICAgICAgcENTID0gbmV3IENQREZfSW5kZXhlZENTKHBEb2MpOwotICAgIH0gZWxzZSBpZiAoaWQgPT0gRlhCU1RSX0lEKCdTJywgJ2UnLCAncCcsICdhJykpIHsKLSAgICAgICAgcENTID0gbmV3IENQREZfU2VwYXJhdGlvbkNTKHBEb2MpOwotICAgIH0gZWxzZSBpZiAoaWQgPT0gRlhCU1RSX0lEKCdEJywgJ2UnLCAndicsICdpJykpIHsKLSAgICAgICAgcENTID0gbmV3IENQREZfRGV2aWNlTkNTKHBEb2MpOwotICAgIH0gZWxzZSBpZiAoaWQgPT0gRlhCU1RSX0lEKCdQJywgJ2EnLCAndCcsICd0JykpIHsKLSAgICAgICAgcENTID0gbmV3IENQREZfUGF0dGVybkNTKHBEb2MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwQ1MtPm1fcEFycmF5ID0gcEFycmF5OwotICAgIGlmICghcENTLT52X0xvYWQocERvYywgcEFycmF5KSkgewotICAgICAgICBwQ1MtPlJlbGVhc2VDUygpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHBDUzsKK3ZvaWQgQ1BERl9Db2xvclNwYWNlOjpSZWxlYXNlQ1MoKSB7CisgIGlmICh0aGlzID09IEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAodGhpcyA9PSBHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICh0aGlzID09IEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFQ01ZSykpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHRoaXMgPT0gR2V0U3RvY2tDUyhQREZDU19QQVRURVJOKSkgeworICAgIHJldHVybjsKKyAgfQorICBkZWxldGUgdGhpczsKIH0KLXZvaWQgQ1BERl9Db2xvclNwYWNlOjpSZWxlYXNlQ1MoKQotewotICAgIGlmICh0aGlzID09IEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0aGlzID09IEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodGhpcyA9PSBHZXRTdG9ja0NTKFBERkNTX0RFVklDRUNNWUspKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRoaXMgPT0gR2V0U3RvY2tDUyhQREZDU19QQVRURVJOKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGRlbGV0ZSB0aGlzOworaW50IENQREZfQ29sb3JTcGFjZTo6R2V0QnVmU2l6ZSgpIGNvbnN0IHsKKyAgaWYgKG1fRmFtaWx5ID09IFBERkNTX1BBVFRFUk4pIHsKKyAgICByZXR1cm4gc2l6ZW9mKFBhdHRlcm5WYWx1ZSk7CisgIH0KKyAgcmV0dXJuIG1fbkNvbXBvbmVudHMgKiBzaXplb2YoRlhfRkxPQVQpOwogfQotaW50IENQREZfQ29sb3JTcGFjZTo6R2V0QnVmU2l6ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgcmV0dXJuIHNpemVvZihQYXR0ZXJuVmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gbV9uQ29tcG9uZW50cyAqIHNpemVvZihGWF9GTE9BVCk7CitGWF9GTE9BVCogQ1BERl9Db2xvclNwYWNlOjpDcmVhdGVCdWYoKSB7CisgIGludCBzaXplID0gR2V0QnVmU2l6ZSgpOworICB1aW50OF90KiBwQnVmID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7CisgIHJldHVybiAoRlhfRkxPQVQqKXBCdWY7CiB9Ci1GWF9GTE9BVCogQ1BERl9Db2xvclNwYWNlOjpDcmVhdGVCdWYoKQotewotICAgIGludCBzaXplID0gR2V0QnVmU2l6ZSgpOwotICAgIHVpbnQ4X3QqIHBCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKLSAgICByZXR1cm4gKEZYX0ZMT0FUKilwQnVmOwotfQotRlhfQk9PTCBDUERGX0NvbG9yU3BhY2U6OnNSR0IoKSBjb25zdAotewotICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChtX0ZhbWlseSAhPSBQREZDU19JQ0NCQVNFRCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfSUNDQmFzZWRDUyogcENTID0gKENQREZfSUNDQmFzZWRDUyopdGhpczsKLSAgICByZXR1cm4gcENTLT5tX3BQcm9maWxlLT5tX2JzUkdCOwotfQotRlhfQk9PTCBDUERGX0NvbG9yU3BhY2U6OkdldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAotewotICAgIGlmICh2X0dldENNWUsocEJ1ZiwgYywgbSwgeSwgaykpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIEZYX0ZMT0FUIFIsIEcsIEI7Ci0gICAgaWYgKCFHZXRSR0IocEJ1ZiwgUiwgRywgQikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBzUkdCX3RvX0Fkb2JlQ01ZSyhSLCBHLCBCLCBjLCBtLCB5LCBrKTsKK0ZYX0JPT0wgQ1BERl9Db2xvclNwYWNlOjpzUkdCKCkgY29uc3QgeworICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKG1fRmFtaWx5ICE9IFBERkNTX0lDQ0JBU0VEKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfSUNDQmFzZWRDUyogcENTID0gKENQREZfSUNDQmFzZWRDUyopdGhpczsKKyAgcmV0dXJuIHBDUy0+bV9wUHJvZmlsZS0+bV9ic1JHQjsKIH0KLUZYX0JPT0wgQ1BERl9Db2xvclNwYWNlOjpTZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrKSBjb25zdAotewotICAgIGlmICh2X1NldENNWUsocEJ1ZiwgYywgbSwgeSwgaykpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIEZYX0ZMT0FUIFIsIEcsIEI7Ci0gICAgQWRvYmVDTVlLX3RvX3NSR0IoYywgbSwgeSwgaywgUiwgRywgQik7Ci0gICAgcmV0dXJuIFNldFJHQihwQnVmLCBSLCBHLCBCKTsKK0ZYX0JPT0wgQ1BERl9Db2xvclNwYWNlOjpHZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGspIGNvbnN0IHsKKyAgaWYgKHZfR2V0Q01ZSyhwQnVmLCBjLCBtLCB5LCBrKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIEZYX0ZMT0FUIFIsIEcsIEI7CisgIGlmICghR2V0UkdCKHBCdWYsIFIsIEcsIEIpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHNSR0JfdG9fQWRvYmVDTVlLKFIsIEcsIEIsIGMsIG0sIHksIGspOworICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1BERl9Db2xvclNwYWNlOjpHZXREZWZhdWx0Q29sb3IoRlhfRkxPQVQqIGJ1ZikgY29uc3QKLXsKLSAgICBpZiAoYnVmID09IE5VTEwgfHwgbV9GYW1pbHkgPT0gUERGQ1NfUEFUVEVSTikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0ZMT0FUIG1pbiwgbWF4OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSArKykgewotICAgICAgICBHZXREZWZhdWx0VmFsdWUoaSwgYnVmW2ldLCBtaW4sIG1heCk7Ci0gICAgfQorRlhfQk9PTCBDUERGX0NvbG9yU3BhY2U6OlNldENNWUsoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBrKSBjb25zdCB7CisgIGlmICh2X1NldENNWUsocEJ1ZiwgYywgbSwgeSwgaykpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9GTE9BVCBSLCBHLCBCOworICBBZG9iZUNNWUtfdG9fc1JHQihjLCBtLCB5LCBrLCBSLCBHLCBCKTsKKyAgcmV0dXJuIFNldFJHQihwQnVmLCBSLCBHLCBCKTsKIH0KLWludCBDUERGX0NvbG9yU3BhY2U6OkdldE1heEluZGV4KCkgY29uc3QKLXsKLSAgICBpZiAobV9GYW1pbHkgIT0gUERGQ1NfSU5ERVhFRCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ1BERl9JbmRleGVkQ1MqIHBDUyA9IChDUERGX0luZGV4ZWRDUyopdGhpczsKLSAgICByZXR1cm4gcENTLT5tX01heEluZGV4Owordm9pZCBDUERGX0NvbG9yU3BhY2U6OkdldERlZmF1bHRDb2xvcihGWF9GTE9BVCogYnVmKSBjb25zdCB7CisgIGlmIChidWYgPT0gTlVMTCB8fCBtX0ZhbWlseSA9PSBQREZDU19QQVRURVJOKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0ZMT0FUIG1pbiwgbWF4OworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkrKykgeworICAgIEdldERlZmF1bHRWYWx1ZShpLCBidWZbaV0sIG1pbiwgbWF4KTsKKyAgfQogfQotdm9pZCBDUERGX0NvbG9yU3BhY2U6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0Ci17Ci0gICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHNyY2J1ZihtX25Db21wb25lbnRzKTsKLSAgICBGWF9GTE9BVCogc3JjID0gc3JjYnVmOwotICAgIEZYX0ZMT0FUIFIsIEcsIEI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtX25Db21wb25lbnRzOyBqICsrKQotICAgICAgICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0lOREVYRUQpIHsKLSAgICAgICAgICAgICAgICBzcmNbal0gPSAoRlhfRkxPQVQpKCpzcmNfYnVmICsrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjW2pdID0gKEZYX0ZMT0FUKSgqc3JjX2J1ZiArKykgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIEdldFJHQihzcmMsIFIsIEcsIEIpOwotICAgICAgICAqZGVzdF9idWYgKysgPSAoaW50MzJfdCkoQiAqIDI1NSk7Ci0gICAgICAgICpkZXN0X2J1ZiArKyA9IChpbnQzMl90KShHICogMjU1KTsKLSAgICAgICAgKmRlc3RfYnVmICsrID0gKGludDMyX3QpKFIgKiAyNTUpOwotICAgIH0KK2ludCBDUERGX0NvbG9yU3BhY2U6OkdldE1heEluZGV4KCkgY29uc3QgeworICBpZiAobV9GYW1pbHkgIT0gUERGQ1NfSU5ERVhFRCkgeworICAgIHJldHVybiAwOworICB9CisgIENQREZfSW5kZXhlZENTKiBwQ1MgPSAoQ1BERl9JbmRleGVkQ1MqKXRoaXM7CisgIHJldHVybiBwQ1MtPm1fTWF4SW5kZXg7CiB9Ci12b2lkIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQotewotICAgIGlmIChiRW5hYmxlZCkgewotICAgICAgICBtX2R3U3RkQ29udmVyc2lvbiArKzsKLSAgICB9IGVsc2UgaWYgKG1fZHdTdGRDb252ZXJzaW9uKSB7Ci0gICAgICAgIG1fZHdTdGRDb252ZXJzaW9uIC0tOwotICAgIH0KK3ZvaWQgQ1BERl9Db2xvclNwYWNlOjpUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNNYXNrKSBjb25zdCB7CisgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBzcmNidWYobV9uQ29tcG9uZW50cyk7CisgIEZYX0ZMT0FUKiBzcmMgPSBzcmNidWY7CisgIEZYX0ZMT0FUIFIsIEcsIEI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fbkNvbXBvbmVudHM7IGorKykKKyAgICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19JTkRFWEVEKSB7CisgICAgICAgIHNyY1tqXSA9IChGWF9GTE9BVCkoKnNyY19idWYrKyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmNbal0gPSAoRlhfRkxPQVQpKCpzcmNfYnVmKyspIC8gMjU1OworICAgICAgfQorICAgIEdldFJHQihzcmMsIFIsIEcsIEIpOworICAgICpkZXN0X2J1ZisrID0gKGludDMyX3QpKEIgKiAyNTUpOworICAgICpkZXN0X2J1ZisrID0gKGludDMyX3QpKEcgKiAyNTUpOworICAgICpkZXN0X2J1ZisrID0gKGludDMyX3QpKFIgKiAyNTUpOworICB9CiB9Ci1DUERGX0NvbG9yOjpDUERGX0NvbG9yKGludCBmYW1pbHkpCi17Ci0gICAgbV9wQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoZmFtaWx5KTsKLSAgICBpbnQgbkNvbXBzID0gMzsKLSAgICBpZiAoZmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpIHsKLSAgICAgICAgbkNvbXBzID0gMTsKLSAgICB9IGVsc2UgaWYgKGZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7Ci0gICAgICAgIG5Db21wcyA9IDQ7Ci0gICAgfQotICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKEZYX0ZMT0FULCBuQ29tcHMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvbXBzOyBpICsrKSB7Ci0gICAgICAgIG1fcEJ1ZmZlcltpXSA9IDA7Ci0gICAgfQordm9pZCBDUERGX0NvbG9yU3BhY2U6OkVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkgeworICBpZiAoYkVuYWJsZWQpIHsKKyAgICBtX2R3U3RkQ29udmVyc2lvbisrOworICB9IGVsc2UgaWYgKG1fZHdTdGRDb252ZXJzaW9uKSB7CisgICAgbV9kd1N0ZENvbnZlcnNpb24tLTsKKyAgfQogfQotQ1BERl9Db2xvcjo6fkNQREZfQ29sb3IoKQotewotICAgIFJlbGVhc2VCdWZmZXIoKTsKLSAgICBSZWxlYXNlQ29sb3JTcGFjZSgpOworQ1BERl9Db2xvcjo6Q1BERl9Db2xvcihpbnQgZmFtaWx5KSB7CisgIG1fcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKGZhbWlseSk7CisgIGludCBuQ29tcHMgPSAzOworICBpZiAoZmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpIHsKKyAgICBuQ29tcHMgPSAxOworICB9IGVsc2UgaWYgKGZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7CisgICAgbkNvbXBzID0gNDsKKyAgfQorICBtX3BCdWZmZXIgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbkNvbXBzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ29tcHM7IGkrKykgeworICAgIG1fcEJ1ZmZlcltpXSA9IDA7CisgIH0KIH0KLXZvaWQgQ1BERl9Db2xvcjo6UmVsZWFzZUJ1ZmZlcigpCi17Ci0gICAgaWYgKCFtX3BCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgUGF0dGVyblZhbHVlKiBwdmFsdWUgPSAoUGF0dGVyblZhbHVlKiltX3BCdWZmZXI7Ci0gICAgICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBwdmFsdWUtPm1fcENvdW50ZWRQYXR0ZXJuID8gcHZhbHVlLT5tX3BDb3VudGVkUGF0dGVybi0+Z2V0KCkgOiBOVUxMOwotICAgICAgICBpZiAocFBhdHRlcm4gJiYgcFBhdHRlcm4tPm1fcERvY3VtZW50KSB7Ci0gICAgICAgICAgICBDUERGX0RvY1BhZ2VEYXRhICpwUGFnZURhdGEgPSBwUGF0dGVybi0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCk7Ci0gICAgICAgICAgICBpZiAocFBhZ2VEYXRhKSB7Ci0gICAgICAgICAgICAgICAgcFBhZ2VEYXRhLT5SZWxlYXNlUGF0dGVybihwUGF0dGVybi0+bV9wUGF0dGVybk9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfRnJlZShtX3BCdWZmZXIpOwotICAgIG1fcEJ1ZmZlciA9IE5VTEw7CitDUERGX0NvbG9yOjp+Q1BERl9Db2xvcigpIHsKKyAgUmVsZWFzZUJ1ZmZlcigpOworICBSZWxlYXNlQ29sb3JTcGFjZSgpOwogfQotdm9pZCBDUERGX0NvbG9yOjpSZWxlYXNlQ29sb3JTcGFjZSgpCi17Ci0gICAgaWYgKG1fcENTICYmIG1fcENTLT5tX3BEb2N1bWVudCAmJiBtX3BDUy0+R2V0QXJyYXkoKSkgewotICAgICAgICBtX3BDUy0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKG1fcENTLT5HZXRBcnJheSgpKTsKLSAgICAgICAgbV9wQ1MgPSBOVUxMOwordm9pZCBDUERGX0NvbG9yOjpSZWxlYXNlQnVmZmVyKCkgeworICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKKyAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKW1fcEJ1ZmZlcjsKKyAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0KKyAgICAgICAgcHZhbHVlLT5tX3BDb3VudGVkUGF0dGVybiA/IHB2YWx1ZS0+bV9wQ291bnRlZFBhdHRlcm4tPmdldCgpIDogTlVMTDsKKyAgICBpZiAocFBhdHRlcm4gJiYgcFBhdHRlcm4tPm1fcERvY3VtZW50KSB7CisgICAgICBDUERGX0RvY1BhZ2VEYXRhKiBwUGFnZURhdGEgPSBwUGF0dGVybi0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCk7CisgICAgICBpZiAocFBhZ2VEYXRhKSB7CisgICAgICAgIHBQYWdlRGF0YS0+UmVsZWFzZVBhdHRlcm4ocFBhdHRlcm4tPm1fcFBhdHRlcm5PYmopOworICAgICAgfQogICAgIH0KKyAgfQorICBGWF9GcmVlKG1fcEJ1ZmZlcik7CisgIG1fcEJ1ZmZlciA9IE5VTEw7CiB9Ci12b2lkIENQREZfQ29sb3I6OlNldENvbG9yU3BhY2UoQ1BERl9Db2xvclNwYWNlKiBwQ1MpCi17Ci0gICAgaWYgKG1fcENTID09IHBDUykgewotICAgICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1fcEJ1ZmZlciA9IHBDUy0+Q3JlYXRlQnVmKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUmVsZWFzZUNvbG9yU3BhY2UoKTsKLSAgICAgICAgbV9wQ1MgPSBwQ1M7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9Db2xvcjo6UmVsZWFzZUNvbG9yU3BhY2UoKSB7CisgIGlmIChtX3BDUyAmJiBtX3BDUy0+bV9wRG9jdW1lbnQgJiYgbV9wQ1MtPkdldEFycmF5KCkpIHsKKyAgICBtX3BDUy0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKG1fcENTLT5HZXRBcnJheSgpKTsKKyAgICBtX3BDUyA9IE5VTEw7CisgIH0KK30KK3ZvaWQgQ1BERl9Db2xvcjo6U2V0Q29sb3JTcGFjZShDUERGX0NvbG9yU3BhY2UqIHBDUykgeworICBpZiAobV9wQ1MgPT0gcENTKSB7CisgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICBtX3BCdWZmZXIgPSBwQ1MtPkNyZWF0ZUJ1ZigpOwogICAgIH0KLSAgICBSZWxlYXNlQnVmZmVyKCk7CiAgICAgUmVsZWFzZUNvbG9yU3BhY2UoKTsKICAgICBtX3BDUyA9IHBDUzsKLSAgICBpZiAobV9wQ1MpIHsKLSAgICAgICAgbV9wQnVmZmVyID0gcENTLT5DcmVhdGVCdWYoKTsKLSAgICAgICAgcENTLT5HZXREZWZhdWx0Q29sb3IobV9wQnVmZmVyKTsKLSAgICB9CisgICAgcmV0dXJuOworICB9CisgIFJlbGVhc2VCdWZmZXIoKTsKKyAgUmVsZWFzZUNvbG9yU3BhY2UoKTsKKyAgbV9wQ1MgPSBwQ1M7CisgIGlmIChtX3BDUykgeworICAgIG1fcEJ1ZmZlciA9IHBDUy0+Q3JlYXRlQnVmKCk7CisgICAgcENTLT5HZXREZWZhdWx0Q29sb3IobV9wQnVmZmVyKTsKKyAgfQogfQotdm9pZCBDUERGX0NvbG9yOjpTZXRWYWx1ZShGWF9GTE9BVCogY29tcHMpCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fcENTLT5HZXRGYW1pbHkoKSAhPSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIsIGNvbXBzLCBtX3BDUy0+Q291bnRDb21wb25lbnRzKCkgKiBzaXplb2YoRlhfRkxPQVQpKTsKLSAgICB9Cit2b2lkIENQREZfQ29sb3I6OlNldFZhbHVlKEZYX0ZMT0FUKiBjb21wcykgeworICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcENTLT5HZXRGYW1pbHkoKSAhPSBQREZDU19QQVRURVJOKSB7CisgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciwgY29tcHMsIG1fcENTLT5Db3VudENvbXBvbmVudHMoKSAqIHNpemVvZihGWF9GTE9BVCkpOworICB9CiB9Ci12b2lkIENQREZfQ29sb3I6OlNldFZhbHVlKENQREZfUGF0dGVybiogcFBhdHRlcm4sIEZYX0ZMT0FUKiBjb21wcywgaW50IG5jb21wcykKLXsKLSAgICBpZiAobmNvbXBzID4gTUFYX1BBVFRFUk5fQ09MT1JDT01QUykgewotICAgICAgICByZXR1cm47Cit2b2lkIENQREZfQ29sb3I6OlNldFZhbHVlKENQREZfUGF0dGVybiogcFBhdHRlcm4sIEZYX0ZMT0FUKiBjb21wcywgaW50IG5jb21wcykgeworICBpZiAobmNvbXBzID4gTUFYX1BBVFRFUk5fQ09MT1JDT01QUykgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9wQ1MgPT0gTlVMTCB8fCBtX3BDUy0+R2V0RmFtaWx5KCkgIT0gUERGQ1NfUEFUVEVSTikgeworICAgIGlmIChtX3BCdWZmZXIpIHsKKyAgICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKICAgICB9Ci0gICAgaWYgKG1fcENTID09IE5VTEwgfHwgbV9wQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgaWYgKG1fcEJ1ZmZlcikgewotICAgICAgICAgICAgRlhfRnJlZShtX3BCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1fcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX1BBVFRFUk4pOwotICAgICAgICBtX3BCdWZmZXIgPSBtX3BDUy0+Q3JlYXRlQnVmKCk7CisgICAgbV9wQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfUEFUVEVSTik7CisgICAgbV9wQnVmZmVyID0gbV9wQ1MtPkNyZWF0ZUJ1ZigpOworICB9CisgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IE5VTEw7CisgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopbV9wQnVmZmVyOworICBpZiAocHZhbHVlLT5tX3BQYXR0ZXJuICYmIHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wRG9jdW1lbnQpIHsKKyAgICBwRG9jUGFnZURhdGEgPSBwdmFsdWUtPm1fcFBhdHRlcm4tPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOworICAgIGlmIChwRG9jUGFnZURhdGEpIHsKKyAgICAgIHBEb2NQYWdlRGF0YS0+UmVsZWFzZVBhdHRlcm4ocHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BQYXR0ZXJuT2JqKTsKICAgICB9Ci0gICAgQ1BERl9Eb2NQYWdlRGF0YSAqcERvY1BhZ2VEYXRhID0gTlVMTDsKKyAgfQorICBwdmFsdWUtPm1fbkNvbXBzID0gbmNvbXBzOworICBwdmFsdWUtPm1fcFBhdHRlcm4gPSBwUGF0dGVybjsKKyAgaWYgKG5jb21wcykgeworICAgIEZYU1lTX21lbWNweShwdmFsdWUtPm1fQ29tcHMsIGNvbXBzLCBuY29tcHMgKiBzaXplb2YoRlhfRkxPQVQpKTsKKyAgfQorICBwdmFsdWUtPm1fcENvdW50ZWRQYXR0ZXJuID0gTlVMTDsKKyAgaWYgKHBQYXR0ZXJuICYmIHBQYXR0ZXJuLT5tX3BEb2N1bWVudCkgeworICAgIGlmICghcERvY1BhZ2VEYXRhKSB7CisgICAgICBwRG9jUGFnZURhdGEgPSBwUGF0dGVybi0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCk7CisgICAgfQorICAgIHB2YWx1ZS0+bV9wQ291bnRlZFBhdHRlcm4gPQorICAgICAgICBwRG9jUGFnZURhdGEtPkZpbmRQYXR0ZXJuUHRyKHBQYXR0ZXJuLT5tX3BQYXR0ZXJuT2JqKTsKKyAgfQorfQordm9pZCBDUERGX0NvbG9yOjpDb3B5KGNvbnN0IENQREZfQ29sb3IqIHBTcmMpIHsKKyAgUmVsZWFzZUJ1ZmZlcigpOworICBSZWxlYXNlQ29sb3JTcGFjZSgpOworICBtX3BDUyA9IHBTcmMtPm1fcENTOworICBpZiAobV9wQ1MgJiYgbV9wQ1MtPm1fcERvY3VtZW50KSB7CisgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbV9wQ1MtPkdldEFycmF5KCk7CisgICAgaWYgKHBBcnJheSkgeworICAgICAgbV9wQ1MgPSBtX3BDUy0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldENvcGllZENvbG9yU3BhY2UocEFycmF5KTsKKyAgICB9CisgIH0KKyAgaWYgKG1fcENTID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wQnVmZmVyID0gbV9wQ1MtPkNyZWF0ZUJ1ZigpOworICBGWFNZU19tZW1jcHkobV9wQnVmZmVyLCBwU3JjLT5tX3BCdWZmZXIsIG1fcENTLT5HZXRCdWZTaXplKCkpOworICBpZiAobV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKICAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKW1fcEJ1ZmZlcjsKICAgICBpZiAocHZhbHVlLT5tX3BQYXR0ZXJuICYmIHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wRG9jdW1lbnQpIHsKLSAgICAgICAgcERvY1BhZ2VEYXRhID0gcHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKLSAgICAgICAgaWYgKHBEb2NQYWdlRGF0YSkgewotICAgICAgICAgICAgcERvY1BhZ2VEYXRhLT5SZWxlYXNlUGF0dGVybihwdmFsdWUtPm1fcFBhdHRlcm4tPm1fcFBhdHRlcm5PYmopOwotICAgICAgICB9CisgICAgICBwdmFsdWUtPm1fcFBhdHRlcm4gPQorICAgICAgICAgIHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldFBhdHRlcm4oCisgICAgICAgICAgICAgIHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wUGF0dGVybk9iaiwgRkFMU0UsCisgICAgICAgICAgICAgICZwdmFsdWUtPm1fcFBhdHRlcm4tPm1fUGFyZW50TWF0cml4KTsKICAgICB9Ci0gICAgcHZhbHVlLT5tX25Db21wcyA9IG5jb21wczsKLSAgICBwdmFsdWUtPm1fcFBhdHRlcm4gPSBwUGF0dGVybjsKLSAgICBpZiAobmNvbXBzKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweShwdmFsdWUtPm1fQ29tcHMsIGNvbXBzLCBuY29tcHMgKiBzaXplb2YoRlhfRkxPQVQpKTsKLSAgICB9Ci0gICAgcHZhbHVlLT5tX3BDb3VudGVkUGF0dGVybiA9IE5VTEw7Ci0gICAgaWYgKHBQYXR0ZXJuICYmIHBQYXR0ZXJuLT5tX3BEb2N1bWVudCkKLSAgICB7Ci0gICAgICAgIGlmICghcERvY1BhZ2VEYXRhKSB7Ci0gICAgICAgICAgICBwRG9jUGFnZURhdGEgPSBwUGF0dGVybi0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHZhbHVlLT5tX3BDb3VudGVkUGF0dGVybiA9IHBEb2NQYWdlRGF0YS0+RmluZFBhdHRlcm5QdHIocFBhdHRlcm4tPm1fcFBhdHRlcm5PYmopOwotICAgIH0KKyAgfQogfQotdm9pZCBDUERGX0NvbG9yOjpDb3B5KGNvbnN0IENQREZfQ29sb3IqIHBTcmMpCi17Ci0gICAgUmVsZWFzZUJ1ZmZlcigpOwotICAgIFJlbGVhc2VDb2xvclNwYWNlKCk7Ci0gICAgbV9wQ1MgPSBwU3JjLT5tX3BDUzsKLSAgICBpZiAobV9wQ1MgJiYgbV9wQ1MtPm1fcERvY3VtZW50KSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG1fcENTLT5HZXRBcnJheSgpOwotICAgICAgICBpZiAocEFycmF5KSB7Ci0gICAgICAgICAgICBtX3BDUyA9IG1fcENTLT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Q29waWVkQ29sb3JTcGFjZShwQXJyYXkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX3BDUyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wQnVmZmVyID0gbV9wQ1MtPkNyZWF0ZUJ1ZigpOwotICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIsIHBTcmMtPm1fcEJ1ZmZlciwgbV9wQ1MtPkdldEJ1ZlNpemUoKSk7Ci0gICAgaWYgKG1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopbV9wQnVmZmVyOwotICAgICAgICBpZiAocHZhbHVlLT5tX3BQYXR0ZXJuICYmIHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wRG9jdW1lbnQpIHsKLSAgICAgICAgICAgIHB2YWx1ZS0+bV9wUGF0dGVybiA9IHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldFBhdHRlcm4ocHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BQYXR0ZXJuT2JqLCBGQUxTRSwgJnB2YWx1ZS0+bV9wUGF0dGVybi0+bV9QYXJlbnRNYXRyaXgpOwotICAgICAgICB9Ci0gICAgfQorRlhfQk9PTCBDUERGX0NvbG9yOjpHZXRSR0IoaW50JiBSLCBpbnQmIEcsIGludCYgQikgY29uc3QgeworICBpZiAobV9wQ1MgPT0gTlVMTCB8fCBtX3BCdWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9GTE9BVCByID0gMC4wZiwgZyA9IDAuMGYsIGIgPSAwLjBmOworICBpZiAoIW1fcENTLT5HZXRSR0IobV9wQnVmZmVyLCByLCBnLCBiKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBSID0gKGludDMyX3QpKHIgKiAyNTUgKyAwLjVmKTsKKyAgRyA9IChpbnQzMl90KShnICogMjU1ICsgMC41Zik7CisgIEIgPSAoaW50MzJfdCkoYiAqIDI1NSArIDAuNWYpOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9Db2xvcjo6R2V0UkdCKGludCYgUiwgaW50JiBHLCBpbnQmIEIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcENTID09IE5VTEwgfHwgbV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9GTE9BVCByPTAuMGYsIGc9MC4wZiwgYj0wLjBmOwotICAgIGlmICghbV9wQ1MtPkdldFJHQihtX3BCdWZmZXIsIHIsIGcsIGIpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgUiA9IChpbnQzMl90KShyICogMjU1ICsgMC41Zik7Ci0gICAgRyA9IChpbnQzMl90KShnICogMjU1ICsgMC41Zik7Ci0gICAgQiA9IChpbnQzMl90KShiICogMjU1ICsgMC41Zik7Ci0gICAgcmV0dXJuIFRSVUU7CitDUERGX1BhdHRlcm4qIENQREZfQ29sb3I6OkdldFBhdHRlcm4oKSBjb25zdCB7CisgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCB8fCBtX3BDUy0+R2V0RmFtaWx5KCkgIT0gUERGQ1NfUEFUVEVSTikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopbV9wQnVmZmVyOworICByZXR1cm4gcHZhbHVlLT5tX3BQYXR0ZXJuOwogfQotQ1BERl9QYXR0ZXJuKiBDUERGX0NvbG9yOjpHZXRQYXR0ZXJuKCkgY29uc3QKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwgfHwgbV9wQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopbV9wQnVmZmVyOwotICAgIHJldHVybiBwdmFsdWUtPm1fcFBhdHRlcm47CitDUERGX0NvbG9yU3BhY2UqIENQREZfQ29sb3I6OkdldFBhdHRlcm5DUygpIGNvbnN0IHsKKyAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMIHx8IG1fcENTLT5HZXRGYW1pbHkoKSAhPSBQREZDU19QQVRURVJOKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG1fcENTLT5HZXRCYXNlQ1MoKTsKIH0KLUNQREZfQ29sb3JTcGFjZSogQ1BERl9Db2xvcjo6R2V0UGF0dGVybkNTKCkgY29uc3QKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwgfHwgbV9wQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtX3BDUy0+R2V0QmFzZUNTKCk7CitGWF9GTE9BVCogQ1BERl9Db2xvcjo6R2V0UGF0dGVybkNvbG9yKCkgY29uc3QgeworICBpZiAobV9wQnVmZmVyID09IE5VTEwgfHwgbV9wQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKW1fcEJ1ZmZlcjsKKyAgcmV0dXJuIHB2YWx1ZS0+bV9uQ29tcHMgPyBwdmFsdWUtPm1fQ29tcHMgOiBOVUxMOwogfQotRlhfRkxPQVQqIENQREZfQ29sb3I6OkdldFBhdHRlcm5Db2xvcigpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMIHx8IG1fcENTLT5HZXRGYW1pbHkoKSAhPSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKW1fcEJ1ZmZlcjsKLSAgICByZXR1cm4gcHZhbHVlLT5tX25Db21wcyA/IHB2YWx1ZS0+bV9Db21wcyA6IE5VTEw7Ci19Ci1GWF9CT09MIENQREZfQ29sb3I6OklzRXF1YWwoY29uc3QgQ1BERl9Db2xvciYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcENTICE9IG90aGVyLm1fcENTIHx8IG1fcENTID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gRlhTWVNfbWVtY21wKG1fcEJ1ZmZlciwgb3RoZXIubV9wQnVmZmVyLCBtX3BDUy0+R2V0QnVmU2l6ZSgpKSA9PSAwOworRlhfQk9PTCBDUERGX0NvbG9yOjpJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdCB7CisgIGlmIChtX3BDUyAhPSBvdGhlci5tX3BDUyB8fCBtX3BDUyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGWFNZU19tZW1jbXAobV9wQnVmZmVyLCBvdGhlci5tX3BCdWZmZXIsIG1fcENTLT5HZXRCdWZTaXplKCkpID09IDA7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZG9jLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9kb2MuY3BwCmluZGV4IDA1MjMzYTEuLjc0ZTMzYjUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9kb2MuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9kb2MuY3BwCkBAIC0xMCw2MjggKzEwLDYwNiBAQAogI2luY2x1ZGUgIi4uL2ZwZGZfZm9udC9mb250X2ludC5oIgogI2luY2x1ZGUgInBhZ2VpbnQuaCIKIAotY2xhc3MgQ1BERl9QYWdlTW9kdWxlIDogcHVibGljIElQREZfUGFnZU1vZHVsZQotewotcHVibGljOgotICAgIENQREZfUGFnZU1vZHVsZSgpCi0gICAgICAgIDogbV9TdG9ja0dyYXlDUyhudWxscHRyLCBQREZDU19ERVZJQ0VHUkFZKSwKLSAgICAgICAgICBtX1N0b2NrUkdCQ1MobnVsbHB0ciwgUERGQ1NfREVWSUNFUkdCKSwKLSAgICAgICAgICBtX1N0b2NrQ01ZS0NTKG51bGxwdHIsIFBERkNTX0RFVklDRUNNWUspLAotICAgICAgICAgIG1fU3RvY2tQYXR0ZXJuQ1MobnVsbHB0cikge30KK2NsYXNzIENQREZfUGFnZU1vZHVsZSA6IHB1YmxpYyBJUERGX1BhZ2VNb2R1bGUgeworIHB1YmxpYzoKKyAgQ1BERl9QYWdlTW9kdWxlKCkKKyAgICAgIDogbV9TdG9ja0dyYXlDUyhudWxscHRyLCBQREZDU19ERVZJQ0VHUkFZKSwKKyAgICAgICAgbV9TdG9ja1JHQkNTKG51bGxwdHIsIFBERkNTX0RFVklDRVJHQiksCisgICAgICAgIG1fU3RvY2tDTVlLQ1MobnVsbHB0ciwgUERGQ1NfREVWSUNFQ01ZSyksCisgICAgICAgIG1fU3RvY2tQYXR0ZXJuQ1MobnVsbHB0cikge30KIAotcHJpdmF0ZToKLSAgICB+Q1BERl9QYWdlTW9kdWxlKCkgb3ZlcnJpZGUge30KKyBwcml2YXRlOgorICB+Q1BERl9QYWdlTW9kdWxlKCkgb3ZlcnJpZGUge30KIAotICAgIENQREZfRG9jUGFnZURhdGEqIENyZWF0ZURvY0RhdGEoQ1BERl9Eb2N1bWVudCogcERvYykgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1BERl9Eb2NQYWdlRGF0YShwRG9jKTsKLSAgICB9CisgIENQREZfRG9jUGFnZURhdGEqIENyZWF0ZURvY0RhdGEoQ1BERl9Eb2N1bWVudCogcERvYykgb3ZlcnJpZGUgeworICAgIHJldHVybiBuZXcgQ1BERl9Eb2NQYWdlRGF0YShwRG9jKTsKKyAgfQogCi0gICAgdm9pZCBSZWxlYXNlRG9jKENQREZfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlOwotICAgIHZvaWQgQ2xlYXJEb2MoQ1BERl9Eb2N1bWVudCogcERvYykgb3ZlcnJpZGU7CisgIHZvaWQgUmVsZWFzZURvYyhDUERGX0RvY3VtZW50KiBwRG9jKSBvdmVycmlkZTsKKyAgdm9pZCBDbGVhckRvYyhDUERGX0RvY3VtZW50KiBwRG9jKSBvdmVycmlkZTsKIAotICAgIENQREZfRm9udEdsb2JhbHMqIEdldEZvbnRHbG9iYWxzKCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiAmbV9Gb250R2xvYmFsczsKLSAgICB9CisgIENQREZfRm9udEdsb2JhbHMqIEdldEZvbnRHbG9iYWxzKCkgb3ZlcnJpZGUgeyByZXR1cm4gJm1fRm9udEdsb2JhbHM7IH0KIAotICAgIHZvaWQgQ2xlYXJTdG9ja0ZvbnQoQ1BERl9Eb2N1bWVudCogcERvYykgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIG1fRm9udEdsb2JhbHMuQ2xlYXIocERvYyk7Ci0gICAgfQorICB2b2lkIENsZWFyU3RvY2tGb250KENQREZfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlIHsKKyAgICBtX0ZvbnRHbG9iYWxzLkNsZWFyKHBEb2MpOworICB9CiAKLSAgICBDUERGX0NvbG9yU3BhY2UqIEdldFN0b2NrQ1MoaW50IGZhbWlseSkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBOb3RpZnlDSktBdmFpbGFibGUoKSBvdmVycmlkZTsKKyAgQ1BERl9Db2xvclNwYWNlKiBHZXRTdG9ja0NTKGludCBmYW1pbHkpIG92ZXJyaWRlOworICB2b2lkIE5vdGlmeUNKS0F2YWlsYWJsZSgpIG92ZXJyaWRlOwogCi0gICAgQ1BERl9Gb250R2xvYmFscyBtX0ZvbnRHbG9iYWxzOwotICAgIENQREZfRGV2aWNlQ1MgbV9TdG9ja0dyYXlDUzsKLSAgICBDUERGX0RldmljZUNTIG1fU3RvY2tSR0JDUzsKLSAgICBDUERGX0RldmljZUNTIG1fU3RvY2tDTVlLQ1M7Ci0gICAgQ1BERl9QYXR0ZXJuQ1MgbV9TdG9ja1BhdHRlcm5DUzsKKyAgQ1BERl9Gb250R2xvYmFscyBtX0ZvbnRHbG9iYWxzOworICBDUERGX0RldmljZUNTIG1fU3RvY2tHcmF5Q1M7CisgIENQREZfRGV2aWNlQ1MgbV9TdG9ja1JHQkNTOworICBDUERGX0RldmljZUNTIG1fU3RvY2tDTVlLQ1M7CisgIENQREZfUGF0dGVybkNTIG1fU3RvY2tQYXR0ZXJuQ1M7CiB9OwogCi1DUERGX0NvbG9yU3BhY2UqIENQREZfUGFnZU1vZHVsZTo6R2V0U3RvY2tDUyhpbnQgZmFtaWx5KQotewotICAgIGlmIChmYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSkgewotICAgICAgICByZXR1cm4gJm1fU3RvY2tHcmF5Q1M7Ci0gICAgfQotICAgIGlmIChmYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSB7Ci0gICAgICAgIHJldHVybiAmbV9TdG9ja1JHQkNTOwotICAgIH0KLSAgICBpZiAoZmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKLSAgICAgICAgcmV0dXJuICZtX1N0b2NrQ01ZS0NTOwotICAgIH0KLSAgICBpZiAoZmFtaWx5ID09IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgcmV0dXJuICZtX1N0b2NrUGF0dGVybkNTOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKK0NQREZfQ29sb3JTcGFjZSogQ1BERl9QYWdlTW9kdWxlOjpHZXRTdG9ja0NTKGludCBmYW1pbHkpIHsKKyAgaWYgKGZhbWlseSA9PSBQREZDU19ERVZJQ0VHUkFZKSB7CisgICAgcmV0dXJuICZtX1N0b2NrR3JheUNTOworICB9CisgIGlmIChmYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSB7CisgICAgcmV0dXJuICZtX1N0b2NrUkdCQ1M7CisgIH0KKyAgaWYgKGZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7CisgICAgcmV0dXJuICZtX1N0b2NrQ01ZS0NTOworICB9CisgIGlmIChmYW1pbHkgPT0gUERGQ1NfUEFUVEVSTikgeworICAgIHJldHVybiAmbV9TdG9ja1BhdHRlcm5DUzsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBDUERGX01vZHVsZU1ncjo6SW5pdFBhZ2VNb2R1bGUoKQotewotICAgIG1fcFBhZ2VNb2R1bGUucmVzZXQobmV3IENQREZfUGFnZU1vZHVsZSk7Cit2b2lkIENQREZfTW9kdWxlTWdyOjpJbml0UGFnZU1vZHVsZSgpIHsKKyAgbV9wUGFnZU1vZHVsZS5yZXNldChuZXcgQ1BERl9QYWdlTW9kdWxlKTsKIH0KIAotdm9pZCBDUERGX1BhZ2VNb2R1bGU6OlJlbGVhc2VEb2MoQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBkZWxldGUgcERvYy0+R2V0UGFnZURhdGEoKTsKK3ZvaWQgQ1BERl9QYWdlTW9kdWxlOjpSZWxlYXNlRG9jKENQREZfRG9jdW1lbnQqIHBEb2MpIHsKKyAgZGVsZXRlIHBEb2MtPkdldFBhZ2VEYXRhKCk7CiB9Ci12b2lkIENQREZfUGFnZU1vZHVsZTo6Q2xlYXJEb2MoQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBwRG9jLT5HZXRQYWdlRGF0YSgpLT5DbGVhcihGQUxTRSk7Cit2b2lkIENQREZfUGFnZU1vZHVsZTo6Q2xlYXJEb2MoQ1BERl9Eb2N1bWVudCogcERvYykgeworICBwRG9jLT5HZXRQYWdlRGF0YSgpLT5DbGVhcihGQUxTRSk7CiB9Ci12b2lkIENQREZfUGFnZU1vZHVsZTo6Tm90aWZ5Q0pLQXZhaWxhYmxlKCkKLXsKLSAgICBtX0ZvbnRHbG9iYWxzLm1fQ01hcE1hbmFnZXIuUmVsb2FkQWxsKCk7Cit2b2lkIENQREZfUGFnZU1vZHVsZTo6Tm90aWZ5Q0pLQXZhaWxhYmxlKCkgeworICBtX0ZvbnRHbG9iYWxzLm1fQ01hcE1hbmFnZXIuUmVsb2FkQWxsKCk7CiB9CiAKLUNQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6TG9hZEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpCi17Ci0gICAgQVNTRVJUKHBGb250RGljdCk7Ci0gICAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKS0+R2V0Rm9udChwRm9udERpY3QsIEZBTFNFKTsKK0NQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6TG9hZEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpIHsKKyAgQVNTRVJUKHBGb250RGljdCk7CisgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldEZvbnQocEZvbnREaWN0LCBGQUxTRSk7CiB9CiAKLUNQREZfU3RyZWFtQWNjKiBDUERGX0RvY3VtZW50OjpMb2FkRm9udEZpbGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pCi17Ci0gICAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKS0+R2V0Rm9udEZpbGVTdHJlYW1BY2MocFN0cmVhbSk7CitDUERGX1N0cmVhbUFjYyogQ1BERl9Eb2N1bWVudDo6TG9hZEZvbnRGaWxlKENQREZfU3RyZWFtKiBwU3RyZWFtKSB7CisgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldEZvbnRGaWxlU3RyZWFtQWNjKHBTdHJlYW0pOwogfQogCiBDUERGX0NvbG9yU3BhY2UqIF9DU0Zyb21OYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKLUNQREZfQ29sb3JTcGFjZSogQ1BERl9Eb2N1bWVudDo6TG9hZENvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDU09iaiwgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzKQotewotICAgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldENvbG9yU3BhY2UocENTT2JqLCBwUmVzb3VyY2VzKTsKK0NQREZfQ29sb3JTcGFjZSogQ1BERl9Eb2N1bWVudDo6TG9hZENvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDU09iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzKSB7CisgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldENvbG9yU3BhY2UocENTT2JqLCBwUmVzb3VyY2VzKTsKIH0KLUNQREZfUGF0dGVybiogQ1BERl9Eb2N1bWVudDo6TG9hZFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpCi17Ci0gICAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKS0+R2V0UGF0dGVybihwUGF0dGVybk9iaiwgYlNoYWRpbmcsIG1hdHJpeCk7CitDUERGX1BhdHRlcm4qIENQREZfRG9jdW1lbnQ6OkxvYWRQYXR0ZXJuKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hhZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4KSB7CisgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldFBhdHRlcm4ocFBhdHRlcm5PYmosIGJTaGFkaW5nLCBtYXRyaXgpOwogfQotQ1BERl9JY2NQcm9maWxlKiBDUERGX0RvY3VtZW50OjpMb2FkSWNjUHJvZmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSkKLXsKLSAgICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRJY2NQcm9maWxlKHBTdHJlYW0pOworQ1BERl9JY2NQcm9maWxlKiBDUERGX0RvY3VtZW50OjpMb2FkSWNjUHJvZmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSkgeworICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRJY2NQcm9maWxlKHBTdHJlYW0pOwogfQotQ1BERl9JbWFnZSogQ1BERl9Eb2N1bWVudDo6TG9hZEltYWdlRihDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBpZiAoIXBPYmopIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYU1lTX2Fzc2VydChwT2JqLT5HZXRPYmpOdW0oKSk7Ci0gICAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKS0+R2V0SW1hZ2UocE9iaik7CitDUERGX0ltYWdlKiBDUERGX0RvY3VtZW50OjpMb2FkSW1hZ2VGKENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGlmICghcE9iaikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYU1lTX2Fzc2VydChwT2JqLT5HZXRPYmpOdW0oKSk7CisgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldEltYWdlKHBPYmopOwogfQotdm9pZCBDUERGX0RvY3VtZW50OjpSZW1vdmVDb2xvclNwYWNlRnJvbVBhZ2VEYXRhKENQREZfT2JqZWN0KiBwQ1NPYmopCi17Ci0gICAgaWYgKCFwQ1NPYmopIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBHZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1NPYmopOwordm9pZCBDUERGX0RvY3VtZW50OjpSZW1vdmVDb2xvclNwYWNlRnJvbVBhZ2VEYXRhKENQREZfT2JqZWN0KiBwQ1NPYmopIHsKKyAgaWYgKCFwQ1NPYmopIHsKKyAgICByZXR1cm47CisgIH0KKyAgR2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTT2JqKTsKIH0KIENQREZfRG9jUGFnZURhdGE6OkNQREZfRG9jUGFnZURhdGEoQ1BERl9Eb2N1bWVudCogcFBERkRvYykKLSAgICA6IG1fcFBERkRvYyhwUERGRG9jKSwKLSAgICAgIG1fYkZvcmNlQ2xlYXIoRkFMU0UpCi17CisgICAgOiBtX3BQREZEb2MocFBERkRvYyksIG1fYkZvcmNlQ2xlYXIoRkFMU0UpIHt9CisKK0NQREZfRG9jUGFnZURhdGE6On5DUERGX0RvY1BhZ2VEYXRhKCkgeworICBDbGVhcihGQUxTRSk7CisgIENsZWFyKFRSVUUpOworCisgIGZvciAoYXV0byYgaXQgOiBtX1BhdHRlcm5NYXApCisgICAgZGVsZXRlIGl0LnNlY29uZDsKKyAgbV9QYXR0ZXJuTWFwLmNsZWFyKCk7CisKKyAgZm9yIChhdXRvJiBpdCA6IG1fRm9udE1hcCkKKyAgICBkZWxldGUgaXQuc2Vjb25kOworICBtX0ZvbnRNYXAuY2xlYXIoKTsKKworICBmb3IgKGF1dG8mIGl0IDogbV9Db2xvclNwYWNlTWFwKQorICAgIGRlbGV0ZSBpdC5zZWNvbmQ7CisgIG1fQ29sb3JTcGFjZU1hcC5jbGVhcigpOwogfQogCi1DUERGX0RvY1BhZ2VEYXRhOjp+Q1BERl9Eb2NQYWdlRGF0YSgpCi17Ci0gICAgQ2xlYXIoRkFMU0UpOwotICAgIENsZWFyKFRSVUUpOwordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpDbGVhcihGWF9CT09MIGJGb3JjZVJlbGVhc2UpIHsKKyAgbV9iRm9yY2VDbGVhciA9IGJGb3JjZVJlbGVhc2U7CiAKLSAgICBmb3IgKGF1dG8mIGl0IDogbV9QYXR0ZXJuTWFwKQotICAgICAgICBkZWxldGUgaXQuc2Vjb25kOwotICAgIG1fUGF0dGVybk1hcC5jbGVhcigpOworICBmb3IgKGF1dG8mIGl0IDogbV9QYXR0ZXJuTWFwKSB7CisgICAgQ1BERl9Db3VudGVkUGF0dGVybiogcHREYXRhID0gaXQuc2Vjb25kOworICAgIGlmICghcHREYXRhLT5nZXQoKSkKKyAgICAgIGNvbnRpbnVlOwogCi0gICAgZm9yIChhdXRvJiBpdCA6IG1fRm9udE1hcCkKLSAgICAgICAgZGVsZXRlIGl0LnNlY29uZDsKLSAgICBtX0ZvbnRNYXAuY2xlYXIoKTsKKyAgICBpZiAoYkZvcmNlUmVsZWFzZSB8fCBwdERhdGEtPnVzZV9jb3VudCgpIDwgMikgeworICAgICAgcHREYXRhLT5nZXQoKS0+U2V0Rm9yY2VDbGVhcihiRm9yY2VSZWxlYXNlKTsKKyAgICAgIHB0RGF0YS0+Y2xlYXIoKTsKKyAgICB9CisgIH0KIAotICAgIGZvciAoYXV0byYgaXQgOiBtX0NvbG9yU3BhY2VNYXApCi0gICAgICAgIGRlbGV0ZSBpdC5zZWNvbmQ7Ci0gICAgbV9Db2xvclNwYWNlTWFwLmNsZWFyKCk7CisgIGZvciAoYXV0byYgaXQgOiBtX0ZvbnRNYXApIHsKKyAgICBDUERGX0NvdW50ZWRGb250KiBmb250RGF0YSA9IGl0LnNlY29uZDsKKyAgICBpZiAoIWZvbnREYXRhLT5nZXQoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGJGb3JjZVJlbGVhc2UgfHwgZm9udERhdGEtPnVzZV9jb3VudCgpIDwgMikgeworICAgICAgZm9udERhdGEtPmNsZWFyKCk7CisgICAgfQorICB9CisKKyAgZm9yIChhdXRvJiBpdCA6IG1fQ29sb3JTcGFjZU1hcCkgeworICAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIGNzRGF0YSA9IGl0LnNlY29uZDsKKyAgICBpZiAoIWNzRGF0YS0+Z2V0KCkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IGNzRGF0YS0+dXNlX2NvdW50KCkgPCAyKSB7CisgICAgICBjc0RhdGEtPmdldCgpLT5SZWxlYXNlQ1MoKTsKKyAgICAgIGNzRGF0YS0+cmVzZXQobnVsbHB0cik7CisgICAgfQorICB9CisKKyAgZm9yIChhdXRvIGl0ID0gbV9JY2NQcm9maWxlTWFwLmJlZ2luKCk7IGl0ICE9IG1fSWNjUHJvZmlsZU1hcC5lbmQoKTspIHsKKyAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOworICAgIENQREZfQ291bnRlZEljY1Byb2ZpbGUqIGlwRGF0YSA9IGN1cnJfaXQtPnNlY29uZDsKKyAgICBpZiAoIWlwRGF0YS0+Z2V0KCkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IGlwRGF0YS0+dXNlX2NvdW50KCkgPCAyKSB7CisgICAgICBDUERGX1N0cmVhbSogaXBLZXkgPSBjdXJyX2l0LT5maXJzdDsKKyAgICAgIEZYX1BPU0lUSU9OIHBvczIgPSBtX0hhc2hQcm9maWxlTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgICAgIHdoaWxlIChwb3MyKSB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5OworICAgICAgICBDUERGX1N0cmVhbSogcEZpbmRTdHJlYW0gPSBudWxscHRyOworICAgICAgICBtX0hhc2hQcm9maWxlTWFwLkdldE5leHRBc3NvYyhwb3MyLCBic0tleSwgKHZvaWQqJilwRmluZFN0cmVhbSk7CisgICAgICAgIGlmIChpcEtleSA9PSBwRmluZFN0cmVhbSkgeworICAgICAgICAgIG1fSGFzaFByb2ZpbGVNYXAuUmVtb3ZlS2V5KGJzS2V5KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVsZXRlIGlwRGF0YS0+Z2V0KCk7CisgICAgICBkZWxldGUgaXBEYXRhOworICAgICAgbV9JY2NQcm9maWxlTWFwLmVyYXNlKGN1cnJfaXQpOworICAgIH0KKyAgfQorCisgIGZvciAoYXV0byBpdCA9IG1fRm9udEZpbGVNYXAuYmVnaW4oKTsgaXQgIT0gbV9Gb250RmlsZU1hcC5lbmQoKTspIHsKKyAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOworICAgIENQREZfQ291bnRlZFN0cmVhbUFjYyogZnREYXRhID0gY3Vycl9pdC0+c2Vjb25kOworICAgIGlmICghZnREYXRhLT5nZXQoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGJGb3JjZVJlbGVhc2UgfHwgZnREYXRhLT51c2VfY291bnQoKSA8IDIpIHsKKyAgICAgIGRlbGV0ZSBmdERhdGEtPmdldCgpOworICAgICAgZGVsZXRlIGZ0RGF0YTsKKyAgICAgIG1fRm9udEZpbGVNYXAuZXJhc2UoY3Vycl9pdCk7CisgICAgfQorICB9CisKKyAgZm9yIChhdXRvIGl0ID0gbV9JbWFnZU1hcC5iZWdpbigpOyBpdCAhPSBtX0ltYWdlTWFwLmVuZCgpOykgeworICAgIGF1dG8gY3Vycl9pdCA9IGl0Kys7CisgICAgQ1BERl9Db3VudGVkSW1hZ2UqIGltYWdlRGF0YSA9IGN1cnJfaXQtPnNlY29uZDsKKyAgICBpZiAoIWltYWdlRGF0YS0+Z2V0KCkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IGltYWdlRGF0YS0+dXNlX2NvdW50KCkgPCAyKSB7CisgICAgICBkZWxldGUgaW1hZ2VEYXRhLT5nZXQoKTsKKyAgICAgIGRlbGV0ZSBpbWFnZURhdGE7CisgICAgICBtX0ltYWdlTWFwLmVyYXNlKGN1cnJfaXQpOworICAgIH0KKyAgfQogfQogCi12b2lkIENQREZfRG9jUGFnZURhdGE6OkNsZWFyKEZYX0JPT0wgYkZvcmNlUmVsZWFzZSkKLXsKLSAgICBtX2JGb3JjZUNsZWFyID0gYkZvcmNlUmVsZWFzZTsKLQotICAgIGZvciAoYXV0byYgaXQgOiBtX1BhdHRlcm5NYXApIHsKLSAgICAgICAgQ1BERl9Db3VudGVkUGF0dGVybiogcHREYXRhID0gaXQuc2Vjb25kOwotICAgICAgICBpZiAoIXB0RGF0YS0+Z2V0KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoYkZvcmNlUmVsZWFzZSB8fCBwdERhdGEtPnVzZV9jb3VudCgpIDwgMikgewotICAgICAgICAgICAgcHREYXRhLT5nZXQoKS0+U2V0Rm9yY2VDbGVhcihiRm9yY2VSZWxlYXNlKTsKLSAgICAgICAgICAgIHB0RGF0YS0+Y2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoYXV0byYgaXQgOiBtX0ZvbnRNYXApIHsKLSAgICAgICAgQ1BERl9Db3VudGVkRm9udCogZm9udERhdGEgPSBpdC5zZWNvbmQ7Ci0gICAgICAgIGlmICghZm9udERhdGEtPmdldCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKGJGb3JjZVJlbGVhc2UgfHwgZm9udERhdGEtPnVzZV9jb3VudCgpIDwgMikgewotICAgICAgICAgICAgZm9udERhdGEtPmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8mIGl0IDogbV9Db2xvclNwYWNlTWFwKSB7Ci0gICAgICAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIGNzRGF0YSA9IGl0LnNlY29uZDsKLSAgICAgICAgaWYgKCFjc0RhdGEtPmdldCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKGJGb3JjZVJlbGVhc2UgfHwgY3NEYXRhLT51c2VfY291bnQoKSA8IDIpIHsKLSAgICAgICAgICAgIGNzRGF0YS0+Z2V0KCktPlJlbGVhc2VDUygpOwotICAgICAgICAgICAgY3NEYXRhLT5yZXNldChudWxscHRyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoYXV0byBpdCA9IG1fSWNjUHJvZmlsZU1hcC5iZWdpbigpOyBpdCAhPSBtX0ljY1Byb2ZpbGVNYXAuZW5kKCk7KSB7Ci0gICAgICAgIGF1dG8gY3Vycl9pdCA9IGl0Kys7Ci0gICAgICAgIENQREZfQ291bnRlZEljY1Byb2ZpbGUqIGlwRGF0YSA9IGN1cnJfaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKCFpcERhdGEtPmdldCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKGJGb3JjZVJlbGVhc2UgfHwgaXBEYXRhLT51c2VfY291bnQoKSA8IDIpIHsKLSAgICAgICAgICAgIENQREZfU3RyZWFtKiBpcEtleSA9IGN1cnJfaXQtPmZpcnN0OwotICAgICAgICAgICAgRlhfUE9TSVRJT04gcG9zMiA9IG1fSGFzaFByb2ZpbGVNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgICAgICAgICAgd2hpbGUgKHBvczIpIHsKLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0tleTsKLSAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcEZpbmRTdHJlYW0gPSBudWxscHRyOwotICAgICAgICAgICAgICAgIG1fSGFzaFByb2ZpbGVNYXAuR2V0TmV4dEFzc29jKHBvczIsIGJzS2V5LCAodm9pZComKXBGaW5kU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBpZiAoaXBLZXkgPT0gcEZpbmRTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgbV9IYXNoUHJvZmlsZU1hcC5SZW1vdmVLZXkoYnNLZXkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWxldGUgaXBEYXRhLT5nZXQoKTsKLSAgICAgICAgICAgIGRlbGV0ZSBpcERhdGE7Ci0gICAgICAgICAgICBtX0ljY1Byb2ZpbGVNYXAuZXJhc2UoY3Vycl9pdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gaXQgPSBtX0ZvbnRGaWxlTWFwLmJlZ2luKCk7IGl0ICE9IG1fRm9udEZpbGVNYXAuZW5kKCk7KSB7Ci0gICAgICAgIGF1dG8gY3Vycl9pdCA9IGl0Kys7Ci0gICAgICAgIENQREZfQ291bnRlZFN0cmVhbUFjYyogZnREYXRhID0gY3Vycl9pdC0+c2Vjb25kOwotICAgICAgICBpZiAoIWZ0RGF0YS0+Z2V0KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoYkZvcmNlUmVsZWFzZSB8fCBmdERhdGEtPnVzZV9jb3VudCgpIDwgMikgewotICAgICAgICAgICAgZGVsZXRlIGZ0RGF0YS0+Z2V0KCk7Ci0gICAgICAgICAgICBkZWxldGUgZnREYXRhOwotICAgICAgICAgICAgbV9Gb250RmlsZU1hcC5lcmFzZShjdXJyX2l0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoYXV0byBpdCA9IG1fSW1hZ2VNYXAuYmVnaW4oKTsgaXQgIT0gbV9JbWFnZU1hcC5lbmQoKTspIHsKLSAgICAgICAgYXV0byBjdXJyX2l0ID0gaXQrKzsKLSAgICAgICAgQ1BERl9Db3VudGVkSW1hZ2UqIGltYWdlRGF0YSA9IGN1cnJfaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKCFpbWFnZURhdGEtPmdldCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKGJGb3JjZVJlbGVhc2UgfHwgaW1hZ2VEYXRhLT51c2VfY291bnQoKSA8IDIpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBpbWFnZURhdGEtPmdldCgpOwotICAgICAgICAgICAgZGVsZXRlIGltYWdlRGF0YTsKLSAgICAgICAgICAgIG1fSW1hZ2VNYXAuZXJhc2UoY3Vycl9pdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUNQREZfRm9udCogQ1BERl9Eb2NQYWdlRGF0YTo6R2V0Rm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCwgRlhfQk9PTCBmaW5kT25seSkKLXsKLSAgICBpZiAoIXBGb250RGljdCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGZpbmRPbmx5KSB7Ci0gICAgICAgIGF1dG8gaXQgPSBtX0ZvbnRNYXAuZmluZChwRm9udERpY3QpOwotICAgICAgICBpZiAoaXQgIT0gbV9Gb250TWFwLmVuZCgpICYmIGl0LT5zZWNvbmQtPmdldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZC0+QWRkUmVmKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgQ1BERl9Db3VudGVkRm9udCogZm9udERhdGEgPSBudWxscHRyOworQ1BERl9Gb250KiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgZmluZE9ubHkpIHsKKyAgaWYgKCFwRm9udERpY3QpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoZmluZE9ubHkpIHsKICAgICBhdXRvIGl0ID0gbV9Gb250TWFwLmZpbmQocEZvbnREaWN0KTsKLSAgICBpZiAoaXQgIT0gbV9Gb250TWFwLmVuZCgpKSB7Ci0gICAgICAgIGZvbnREYXRhID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGZvbnREYXRhLT5nZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZvbnREYXRhLT5BZGRSZWYoKTsKLSAgICAgICAgfQorICAgIGlmIChpdCAhPSBtX0ZvbnRNYXAuZW5kKCkgJiYgaXQtPnNlY29uZC0+Z2V0KCkpIHsKKyAgICAgIHJldHVybiBpdC0+c2Vjb25kLT5BZGRSZWYoKTsKICAgICB9Ci0KLSAgICBDUERGX0ZvbnQqIHBGb250ID0gQ1BERl9Gb250OjpDcmVhdGVGb250RihtX3BQREZEb2MsIHBGb250RGljdCk7Ci0gICAgaWYgKCFwRm9udCkgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgaWYgKCFmb250RGF0YSkgewotICAgICAgICBmb250RGF0YSA9IG5ldyBDUERGX0NvdW50ZWRGb250KHBGb250KTsKLSAgICAgICAgbV9Gb250TWFwW3BGb250RGljdF0gPSBmb250RGF0YTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb250RGF0YS0+cmVzZXQocEZvbnQpOwotICAgIH0KLSAgICByZXR1cm4gZm9udERhdGEtPkFkZFJlZigpOwotfQotCi1DUERGX0ZvbnQqIENQREZfRG9jUGFnZURhdGE6OkdldFN0YW5kYXJkRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZvbnROYW1lLCBDUERGX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nKQotewotICAgIGlmIChmb250TmFtZS5Jc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgZm9yIChhdXRvJiBpdCA6IG1fRm9udE1hcCkgewotICAgICAgICBDUERGX0NvdW50ZWRGb250KiBmb250RGF0YSA9IGl0LnNlY29uZDsKLSAgICAgICAgQ1BERl9Gb250KiBwRm9udCA9IGZvbnREYXRhLT5nZXQoKTsKLSAgICAgICAgaWYgKCFwRm9udCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAocEZvbnQtPkdldEJhc2VGb250KCkgIT0gZm9udE5hbWUpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHBGb250LT5Jc0VtYmVkZGVkKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpICE9IFBERkZPTlRfVFlQRTEpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHBGb250LT5HZXRGb250RGljdCgpLT5LZXlFeGlzdChGWF9CU1RSQygiV2lkdGhzIikpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgQ1BERl9UeXBlMUZvbnQqIHBUMUZvbnQgPSBwRm9udC0+R2V0VHlwZTFGb250KCk7Ci0gICAgICAgIGlmIChwRW5jb2RpbmcgJiYgIXBUMUZvbnQtPkdldEVuY29kaW5nKCktPklzSWRlbnRpY2FsKHBFbmNvZGluZykpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICByZXR1cm4gZm9udERhdGEtPkFkZFJlZigpOwotICAgIH0KLQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIkZvbnQiKSk7Ci0gICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiU3VidHlwZSIpLCBGWF9CU1RSQygiVHlwZTEiKSk7Ci0gICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiQmFzZUZvbnQiKSwgZm9udE5hbWUpOwotICAgIGlmIChwRW5jb2RpbmcpIHsKLSAgICAgICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJFbmNvZGluZyIpLCBwRW5jb2RpbmctPlJlYWxpemUoKSk7Ci0gICAgfQotICAgIG1fcFBERkRvYy0+QWRkSW5kaXJlY3RPYmplY3QocERpY3QpOwotICAgIENQREZfRm9udCogcEZvbnQgPSBDUERGX0ZvbnQ6OkNyZWF0ZUZvbnRGKG1fcFBERkRvYywgcERpY3QpOwotICAgIGlmICghcEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIENQREZfQ291bnRlZEZvbnQqIGZvbnREYXRhID0gbmV3IENQREZfQ291bnRlZEZvbnQocEZvbnQpOwotICAgIG1fRm9udE1hcFtwRGljdF0gPSBmb250RGF0YTsKLSAgICByZXR1cm4gZm9udERhdGEtPkFkZFJlZigpOwotfQotCi12b2lkIENQREZfRG9jUGFnZURhdGE6OlJlbGVhc2VGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0KQotewotICAgIGlmICghcEZvbnREaWN0KQotICAgICAgICByZXR1cm47Ci0KLSAgICBhdXRvIGl0ID0gbV9Gb250TWFwLmZpbmQocEZvbnREaWN0KTsKLSAgICBpZiAoaXQgPT0gbV9Gb250TWFwLmVuZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDUERGX0NvdW50ZWRGb250KiBmb250RGF0YSA9IGl0LT5zZWNvbmQ7Ci0gICAgaWYgKGZvbnREYXRhLT5nZXQoKSkgewotICAgICAgICBmb250RGF0YS0+UmVtb3ZlUmVmKCk7Ci0gICAgICAgIGlmIChmb250RGF0YS0+dXNlX2NvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgZm9udERhdGEtPmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUNQREZfQ29sb3JTcGFjZSogQ1BERl9Eb2NQYWdlRGF0YTo6R2V0Q29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqLCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMpCi17Ci0gICAgaWYgKCFwQ1NPYmopIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwQ1NPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gcENTT2JqLT5HZXRDb25zdFN0cmluZygpOwotICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IF9DU0Zyb21OYW1lKG5hbWUpOwotICAgICAgICBpZiAoIXBDUyAmJiBwUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBMaXN0ID0gcFJlc291cmNlcy0+R2V0RGljdChGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKLSAgICAgICAgICAgIGlmIChwTGlzdCkgewotICAgICAgICAgICAgICAgIHBDU09iaiA9IHBMaXN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldENvbG9yU3BhY2UocENTT2JqLCBOVUxMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocENTID09IE5VTEwgfHwgcFJlc291cmNlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gcENTOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcENvbG9yU3BhY2VzID0gcFJlc291cmNlcy0+R2V0RGljdChGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKLSAgICAgICAgaWYgKHBDb2xvclNwYWNlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gcENTOwotICAgICAgICB9Ci0gICAgICAgIENQREZfT2JqZWN0KiBwRGVmYXVsdENTID0gTlVMTDsKLSAgICAgICAgc3dpdGNoIChwQ1MtPkdldEZhbWlseSgpKSB7Ci0gICAgICAgICAgICBjYXNlIFBERkNTX0RFVklDRVJHQjoKLSAgICAgICAgICAgICAgICBwRGVmYXVsdENTID0gcENvbG9yU3BhY2VzLT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkRlZmF1bHRSR0IiKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBERkNTX0RFVklDRUdSQVk6Ci0gICAgICAgICAgICAgICAgcERlZmF1bHRDUyA9IHBDb2xvclNwYWNlcy0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJEZWZhdWx0R3JheSIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUERGQ1NfREVWSUNFQ01ZSzoKLSAgICAgICAgICAgICAgICBwRGVmYXVsdENTID0gcENvbG9yU3BhY2VzLT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkRlZmF1bHRDTVlLIikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRGVmYXVsdENTID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBwQ1M7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEdldENvbG9yU3BhY2UocERlZmF1bHRDUywgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKHBDU09iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBDU09iajsKLSAgICBpZiAocEFycmF5LT5HZXRDb3VudCgpID09IDApCi0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPT0gMSkKLSAgICAgICAgcmV0dXJuIEdldENvbG9yU3BhY2UocEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMCksIHBSZXNvdXJjZXMpOwotCi0gICAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogY3NEYXRhID0gbnVsbHB0cjsKLSAgICBhdXRvIGl0ID0gbV9Db2xvclNwYWNlTWFwLmZpbmQocENTT2JqKTsKLSAgICBpZiAoaXQgIT0gbV9Db2xvclNwYWNlTWFwLmVuZCgpKSB7Ci0gICAgICAgIGNzRGF0YSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChjc0RhdGEtPmdldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3NEYXRhLT5BZGRSZWYoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpMb2FkKG1fcFBERkRvYywgcEFycmF5KTsKLSAgICBpZiAoIXBDUykKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBpZiAoIWNzRGF0YSkgewotICAgICAgICBjc0RhdGEgPSBuZXcgQ1BERl9Db3VudGVkQ29sb3JTcGFjZShwQ1MpOwotICAgICAgICBtX0NvbG9yU3BhY2VNYXBbcENTT2JqXSA9IGNzRGF0YTsKLSAgICB9IGVsc2UgewotICAgICAgICBjc0RhdGEtPnJlc2V0KHBDUyk7Ci0gICAgfQotICAgIHJldHVybiBjc0RhdGEtPkFkZFJlZigpOwotfQotCi1DUERGX0NvbG9yU3BhY2UqIENQREZfRG9jUGFnZURhdGE6OkdldENvcGllZENvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDU09iaikKLXsKLSAgICBpZiAoIXBDU09iaikKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBhdXRvIGl0ID0gbV9Db2xvclNwYWNlTWFwLmZpbmQocENTT2JqKTsKLSAgICBpZiAoaXQgIT0gbV9Db2xvclNwYWNlTWFwLmVuZCgpKQotICAgICAgICByZXR1cm4gaXQtPnNlY29uZC0+QWRkUmVmKCk7Ci0KICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIENQREZfQ291bnRlZEZvbnQqIGZvbnREYXRhID0gbnVsbHB0cjsKKyAgYXV0byBpdCA9IG1fRm9udE1hcC5maW5kKHBGb250RGljdCk7CisgIGlmIChpdCAhPSBtX0ZvbnRNYXAuZW5kKCkpIHsKKyAgICBmb250RGF0YSA9IGl0LT5zZWNvbmQ7CisgICAgaWYgKGZvbnREYXRhLT5nZXQoKSkgeworICAgICAgcmV0dXJuIGZvbnREYXRhLT5BZGRSZWYoKTsKKyAgICB9CisgIH0KKworICBDUERGX0ZvbnQqIHBGb250ID0gQ1BERl9Gb250OjpDcmVhdGVGb250RihtX3BQREZEb2MsIHBGb250RGljdCk7CisgIGlmICghcEZvbnQpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoIWZvbnREYXRhKSB7CisgICAgZm9udERhdGEgPSBuZXcgQ1BERl9Db3VudGVkRm9udChwRm9udCk7CisgICAgbV9Gb250TWFwW3BGb250RGljdF0gPSBmb250RGF0YTsKKyAgfSBlbHNlIHsKKyAgICBmb250RGF0YS0+cmVzZXQocEZvbnQpOworICB9CisgIHJldHVybiBmb250RGF0YS0+QWRkUmVmKCk7CiB9CiAKLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZUNvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDb2xvclNwYWNlKQotewotICAgIGlmICghcENvbG9yU3BhY2UpCi0gICAgICAgIHJldHVybjsKK0NQREZfRm9udCogQ1BERl9Eb2NQYWdlRGF0YTo6R2V0U3RhbmRhcmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nKSB7CisgIGlmIChmb250TmFtZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBhdXRvIGl0ID0gbV9Db2xvclNwYWNlTWFwLmZpbmQocENvbG9yU3BhY2UpOwotICAgIGlmIChpdCA9PSBtX0NvbG9yU3BhY2VNYXAuZW5kKCkpCi0gICAgICAgIHJldHVybjsKKyAgZm9yIChhdXRvJiBpdCA6IG1fRm9udE1hcCkgeworICAgIENQREZfQ291bnRlZEZvbnQqIGZvbnREYXRhID0gaXQuc2Vjb25kOworICAgIENQREZfRm9udCogcEZvbnQgPSBmb250RGF0YS0+Z2V0KCk7CisgICAgaWYgKCFwRm9udCkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChwRm9udC0+R2V0QmFzZUZvbnQoKSAhPSBmb250TmFtZSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChwRm9udC0+SXNFbWJlZGRlZCgpKQorICAgICAgY29udGludWU7CisgICAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpICE9IFBERkZPTlRfVFlQRTEpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAocEZvbnQtPkdldEZvbnREaWN0KCktPktleUV4aXN0KEZYX0JTVFJDKCJXaWR0aHMiKSkpCisgICAgICBjb250aW51ZTsKIAotICAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIGNzRGF0YSA9IGl0LT5zZWNvbmQ7CisgICAgQ1BERl9UeXBlMUZvbnQqIHBUMUZvbnQgPSBwRm9udC0+R2V0VHlwZTFGb250KCk7CisgICAgaWYgKHBFbmNvZGluZyAmJiAhcFQxRm9udC0+R2V0RW5jb2RpbmcoKS0+SXNJZGVudGljYWwocEVuY29kaW5nKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgcmV0dXJuIGZvbnREYXRhLT5BZGRSZWYoKTsKKyAgfQorCisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJUeXBlIiksIEZYX0JTVFJDKCJGb250IikpOworICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJTdWJ0eXBlIiksIEZYX0JTVFJDKCJUeXBlMSIpKTsKKyAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiQmFzZUZvbnQiKSwgZm9udE5hbWUpOworICBpZiAocEVuY29kaW5nKSB7CisgICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJFbmNvZGluZyIpLCBwRW5jb2RpbmctPlJlYWxpemUoKSk7CisgIH0KKyAgbV9wUERGRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwRGljdCk7CisgIENQREZfRm9udCogcEZvbnQgPSBDUERGX0ZvbnQ6OkNyZWF0ZUZvbnRGKG1fcFBERkRvYywgcERpY3QpOworICBpZiAoIXBGb250KSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgQ1BERl9Db3VudGVkRm9udCogZm9udERhdGEgPSBuZXcgQ1BERl9Db3VudGVkRm9udChwRm9udCk7CisgIG1fRm9udE1hcFtwRGljdF0gPSBmb250RGF0YTsKKyAgcmV0dXJuIGZvbnREYXRhLT5BZGRSZWYoKTsKK30KKwordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpSZWxlYXNlRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCkgeworICBpZiAoIXBGb250RGljdCkKKyAgICByZXR1cm47CisKKyAgYXV0byBpdCA9IG1fRm9udE1hcC5maW5kKHBGb250RGljdCk7CisgIGlmIChpdCA9PSBtX0ZvbnRNYXAuZW5kKCkpCisgICAgcmV0dXJuOworCisgIENQREZfQ291bnRlZEZvbnQqIGZvbnREYXRhID0gaXQtPnNlY29uZDsKKyAgaWYgKGZvbnREYXRhLT5nZXQoKSkgeworICAgIGZvbnREYXRhLT5SZW1vdmVSZWYoKTsKKyAgICBpZiAoZm9udERhdGEtPnVzZV9jb3VudCgpID09IDApIHsKKyAgICAgIGZvbnREYXRhLT5jbGVhcigpOworICAgIH0KKyAgfQorfQorCitDUERGX0NvbG9yU3BhY2UqIENQREZfRG9jUGFnZURhdGE6OkdldENvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDU09iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMpIHsKKyAgaWYgKCFwQ1NPYmopIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAocENTT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gcENTT2JqLT5HZXRDb25zdFN0cmluZygpOworICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gX0NTRnJvbU5hbWUobmFtZSk7CisgICAgaWYgKCFwQ1MgJiYgcFJlc291cmNlcykgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGlzdCA9IHBSZXNvdXJjZXMtPkdldERpY3QoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSk7CisgICAgICBpZiAocExpc3QpIHsKKyAgICAgICAgcENTT2JqID0gcExpc3QtPkdldEVsZW1lbnRWYWx1ZShuYW1lKTsKKyAgICAgICAgcmV0dXJuIEdldENvbG9yU3BhY2UocENTT2JqLCBOVUxMKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBDUyA9PSBOVUxMIHx8IHBSZXNvdXJjZXMgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIHBDUzsKKyAgICB9CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ29sb3JTcGFjZXMgPSBwUmVzb3VyY2VzLT5HZXREaWN0KEZYX0JTVFJDKCJDb2xvclNwYWNlIikpOworICAgIGlmIChwQ29sb3JTcGFjZXMgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIHBDUzsKKyAgICB9CisgICAgQ1BERl9PYmplY3QqIHBEZWZhdWx0Q1MgPSBOVUxMOworICAgIHN3aXRjaCAocENTLT5HZXRGYW1pbHkoKSkgeworICAgICAgY2FzZSBQREZDU19ERVZJQ0VSR0I6CisgICAgICAgIHBEZWZhdWx0Q1MgPSBwQ29sb3JTcGFjZXMtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRGVmYXVsdFJHQiIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBERkNTX0RFVklDRUdSQVk6CisgICAgICAgIHBEZWZhdWx0Q1MgPSBwQ29sb3JTcGFjZXMtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRGVmYXVsdEdyYXkiKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQREZDU19ERVZJQ0VDTVlLOgorICAgICAgICBwRGVmYXVsdENTID0gcENvbG9yU3BhY2VzLT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkRlZmF1bHRDTVlLIikpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHBEZWZhdWx0Q1MgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIHBDUzsKKyAgICB9CisgICAgcmV0dXJuIEdldENvbG9yU3BhY2UocERlZmF1bHRDUywgTlVMTCk7CisgIH0KKworICBpZiAocENTT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKQorICAgIHJldHVybiBudWxscHRyOworICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcENTT2JqOworICBpZiAocEFycmF5LT5HZXRDb3VudCgpID09IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChwQXJyYXktPkdldENvdW50KCkgPT0gMSkKKyAgICByZXR1cm4gR2V0Q29sb3JTcGFjZShwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgwKSwgcFJlc291cmNlcyk7CisKKyAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogY3NEYXRhID0gbnVsbHB0cjsKKyAgYXV0byBpdCA9IG1fQ29sb3JTcGFjZU1hcC5maW5kKHBDU09iaik7CisgIGlmIChpdCAhPSBtX0NvbG9yU3BhY2VNYXAuZW5kKCkpIHsKKyAgICBjc0RhdGEgPSBpdC0+c2Vjb25kOwogICAgIGlmIChjc0RhdGEtPmdldCgpKSB7Ci0gICAgICAgIGNzRGF0YS0+UmVtb3ZlUmVmKCk7Ci0gICAgICAgIGlmIChjc0RhdGEtPnVzZV9jb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIGNzRGF0YS0+Z2V0KCktPlJlbGVhc2VDUygpOwotICAgICAgICAgICAgY3NEYXRhLT5yZXNldChudWxscHRyKTsKLSAgICAgICAgfQorICAgICAgcmV0dXJuIGNzRGF0YS0+QWRkUmVmKCk7CiAgICAgfQorICB9CisKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkxvYWQobV9wUERGRG9jLCBwQXJyYXkpOworICBpZiAoIXBDUykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpZiAoIWNzRGF0YSkgeworICAgIGNzRGF0YSA9IG5ldyBDUERGX0NvdW50ZWRDb2xvclNwYWNlKHBDUyk7CisgICAgbV9Db2xvclNwYWNlTWFwW3BDU09ial0gPSBjc0RhdGE7CisgIH0gZWxzZSB7CisgICAgY3NEYXRhLT5yZXNldChwQ1MpOworICB9CisgIHJldHVybiBjc0RhdGEtPkFkZFJlZigpOwogfQogCi1DUERGX1BhdHRlcm4qIENQREZfRG9jUGFnZURhdGE6OkdldFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpCi17Ci0gICAgaWYgKCFwUGF0dGVybk9iaikKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7CitDUERGX0NvbG9yU3BhY2UqIENQREZfRG9jUGFnZURhdGE6OkdldENvcGllZENvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDU09iaikgeworICBpZiAoIXBDU09iaikKKyAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIENQREZfQ291bnRlZFBhdHRlcm4qIHB0RGF0YSA9IG51bGxwdHI7Ci0gICAgYXV0byBpdCA9IG1fUGF0dGVybk1hcC5maW5kKHBQYXR0ZXJuT2JqKTsKLSAgICBpZiAoaXQgIT0gbV9QYXR0ZXJuTWFwLmVuZCgpKSB7Ci0gICAgICAgIHB0RGF0YSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChwdERhdGEtPmdldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHREYXRhLT5BZGRSZWYoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gbnVsbHB0cjsKLSAgICBpZiAoYlNoYWRpbmcpIHsKLSAgICAgICAgcFBhdHRlcm4gPSBuZXcgQ1BERl9TaGFkaW5nUGF0dGVybihtX3BQREZEb2MsIHBQYXR0ZXJuT2JqLCBiU2hhZGluZywgbWF0cml4KTsKLSAgICB9IGVsc2UgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhdHRlcm5PYmogPyBwUGF0dGVybk9iai0+R2V0RGljdCgpIDogbnVsbHB0cjsKLSAgICAgICAgaWYgKHBEaWN0KSB7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQYXR0ZXJuVHlwZSIpKTsKLSAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHsKLSAgICAgICAgICAgICAgICBwUGF0dGVybiA9IG5ldyBDUERGX1RpbGluZ1BhdHRlcm4obV9wUERGRG9jLCBwUGF0dGVybk9iaiwgbWF0cml4KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgcFBhdHRlcm4gPSBuZXcgQ1BERl9TaGFkaW5nUGF0dGVybihtX3BQREZEb2MsIHBQYXR0ZXJuT2JqLCBGQUxTRSwgbWF0cml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIXBQYXR0ZXJuKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgYXV0byBpdCA9IG1fQ29sb3JTcGFjZU1hcC5maW5kKHBDU09iaik7CisgIGlmIChpdCAhPSBtX0NvbG9yU3BhY2VNYXAuZW5kKCkpCisgICAgcmV0dXJuIGl0LT5zZWNvbmQtPkFkZFJlZigpOwogCi0gICAgaWYgKCFwdERhdGEpIHsKLSAgICAgICAgcHREYXRhID0gbmV3IENQREZfQ291bnRlZFBhdHRlcm4ocFBhdHRlcm4pOwotICAgICAgICBtX1BhdHRlcm5NYXBbcFBhdHRlcm5PYmpdID0gcHREYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHB0RGF0YS0+cmVzZXQocFBhdHRlcm4pOwotICAgIH0KLSAgICByZXR1cm4gcHREYXRhLT5BZGRSZWYoKTsKKyAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZVBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqKQotewotICAgIGlmICghcFBhdHRlcm5PYmopCi0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZUNvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDb2xvclNwYWNlKSB7CisgIGlmICghcENvbG9yU3BhY2UpCisgICAgcmV0dXJuOwogCi0gICAgYXV0byBpdCA9IG1fUGF0dGVybk1hcC5maW5kKHBQYXR0ZXJuT2JqKTsKLSAgICBpZiAoaXQgPT0gbV9QYXR0ZXJuTWFwLmVuZCgpKQotICAgICAgICByZXR1cm47CisgIGF1dG8gaXQgPSBtX0NvbG9yU3BhY2VNYXAuZmluZChwQ29sb3JTcGFjZSk7CisgIGlmIChpdCA9PSBtX0NvbG9yU3BhY2VNYXAuZW5kKCkpCisgICAgcmV0dXJuOwogCi0gICAgQ1BERl9Db3VudGVkUGF0dGVybiogcHREYXRhID0gaXQtPnNlY29uZDsKKyAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogY3NEYXRhID0gaXQtPnNlY29uZDsKKyAgaWYgKGNzRGF0YS0+Z2V0KCkpIHsKKyAgICBjc0RhdGEtPlJlbW92ZVJlZigpOworICAgIGlmIChjc0RhdGEtPnVzZV9jb3VudCgpID09IDApIHsKKyAgICAgIGNzRGF0YS0+Z2V0KCktPlJlbGVhc2VDUygpOworICAgICAgY3NEYXRhLT5yZXNldChudWxscHRyKTsKKyAgICB9CisgIH0KK30KKworQ1BERl9QYXR0ZXJuKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRQYXR0ZXJuKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGFkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCkgeworICBpZiAoIXBQYXR0ZXJuT2JqKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZfQ291bnRlZFBhdHRlcm4qIHB0RGF0YSA9IG51bGxwdHI7CisgIGF1dG8gaXQgPSBtX1BhdHRlcm5NYXAuZmluZChwUGF0dGVybk9iaik7CisgIGlmIChpdCAhPSBtX1BhdHRlcm5NYXAuZW5kKCkpIHsKKyAgICBwdERhdGEgPSBpdC0+c2Vjb25kOwogICAgIGlmIChwdERhdGEtPmdldCgpKSB7Ci0gICAgICAgIHB0RGF0YS0+UmVtb3ZlUmVmKCk7Ci0gICAgICAgIGlmIChwdERhdGEtPnVzZV9jb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIHB0RGF0YS0+Y2xlYXIoKTsKLSAgICAgICAgfQorICAgICAgcmV0dXJuIHB0RGF0YS0+QWRkUmVmKCk7CiAgICAgfQotfQotCi1DUERGX0ltYWdlKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRJbWFnZShDUERGX09iamVjdCogcEltYWdlU3RyZWFtKQotewotICAgIGlmICghcEltYWdlU3RyZWFtKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGNvbnN0IEZYX0RXT1JEIGR3SW1hZ2VPYmpOdW0gPSBwSW1hZ2VTdHJlYW0tPkdldE9iak51bSgpOwotICAgIGF1dG8gaXQgPSBtX0ltYWdlTWFwLmZpbmQoZHdJbWFnZU9iak51bSk7Ci0gICAgaWYgKGl0ICE9IG1fSW1hZ2VNYXAuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQtPkFkZFJlZigpOworICB9CisgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBudWxscHRyOworICBpZiAoYlNoYWRpbmcpIHsKKyAgICBwUGF0dGVybiA9CisgICAgICAgIG5ldyBDUERGX1NoYWRpbmdQYXR0ZXJuKG1fcFBERkRvYywgcFBhdHRlcm5PYmosIGJTaGFkaW5nLCBtYXRyaXgpOworICB9IGVsc2UgeworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGF0dGVybk9iaiA/IHBQYXR0ZXJuT2JqLT5HZXREaWN0KCkgOiBudWxscHRyOworICAgIGlmIChwRGljdCkgeworICAgICAgaW50IHR5cGUgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUGF0dGVyblR5cGUiKSk7CisgICAgICBpZiAodHlwZSA9PSAxKSB7CisgICAgICAgIHBQYXR0ZXJuID0gbmV3IENQREZfVGlsaW5nUGF0dGVybihtX3BQREZEb2MsIHBQYXR0ZXJuT2JqLCBtYXRyaXgpOworICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHsKKyAgICAgICAgcFBhdHRlcm4gPQorICAgICAgICAgICAgbmV3IENQREZfU2hhZGluZ1BhdHRlcm4obV9wUERGRG9jLCBwUGF0dGVybk9iaiwgRkFMU0UsIG1hdHJpeCk7CisgICAgICB9CiAgICAgfQorICB9CisgIGlmICghcFBhdHRlcm4pCisgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBDUERGX0ltYWdlKiBwSW1hZ2UgPSBuZXcgQ1BERl9JbWFnZShtX3BQREZEb2MpOwotICAgIHBJbWFnZS0+TG9hZEltYWdlRigoQ1BERl9TdHJlYW0qKXBJbWFnZVN0cmVhbSwgRkFMU0UpOwotCi0gICAgQ1BERl9Db3VudGVkSW1hZ2UqIGltYWdlRGF0YSA9IG5ldyBDUERGX0NvdW50ZWRJbWFnZShwSW1hZ2UpOwotICAgIG1fSW1hZ2VNYXBbZHdJbWFnZU9iak51bV0gPSBpbWFnZURhdGE7Ci0gICAgcmV0dXJuIGltYWdlRGF0YS0+QWRkUmVmKCk7CisgIGlmICghcHREYXRhKSB7CisgICAgcHREYXRhID0gbmV3IENQREZfQ291bnRlZFBhdHRlcm4ocFBhdHRlcm4pOworICAgIG1fUGF0dGVybk1hcFtwUGF0dGVybk9ial0gPSBwdERhdGE7CisgIH0gZWxzZSB7CisgICAgcHREYXRhLT5yZXNldChwUGF0dGVybik7CisgIH0KKyAgcmV0dXJuIHB0RGF0YS0+QWRkUmVmKCk7CiB9CiAKLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZUltYWdlKENQREZfT2JqZWN0KiBwSW1hZ2VTdHJlYW0pCi17Ci0gICAgaWYgKCFwSW1hZ2VTdHJlYW0gfHwgIXBJbWFnZVN0cmVhbS0+R2V0T2JqTnVtKCkpCi0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZVBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqKSB7CisgIGlmICghcFBhdHRlcm5PYmopCisgICAgcmV0dXJuOwogCi0gICAgYXV0byBpdCA9IG1fSW1hZ2VNYXAuZmluZChwSW1hZ2VTdHJlYW0tPkdldE9iak51bSgpKTsKLSAgICBpZiAoaXQgPT0gbV9JbWFnZU1hcC5lbmQoKSkKLSAgICAgICAgcmV0dXJuOworICBhdXRvIGl0ID0gbV9QYXR0ZXJuTWFwLmZpbmQocFBhdHRlcm5PYmopOworICBpZiAoaXQgPT0gbV9QYXR0ZXJuTWFwLmVuZCgpKQorICAgIHJldHVybjsKIAotICAgIENQREZfQ291bnRlZEltYWdlKiBpbWFnZSA9IGl0LT5zZWNvbmQ7Ci0gICAgaWYgKCFpbWFnZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW1hZ2UtPlJlbW92ZVJlZigpOwotICAgIGlmIChpbWFnZS0+dXNlX2NvdW50KCkgPT0gMCkgewotICAgICAgICBkZWxldGUgaW1hZ2UtPmdldCgpOwotICAgICAgICBkZWxldGUgaW1hZ2U7Ci0gICAgICAgIG1fSW1hZ2VNYXAuZXJhc2UoaXQpOworICBDUERGX0NvdW50ZWRQYXR0ZXJuKiBwdERhdGEgPSBpdC0+c2Vjb25kOworICBpZiAocHREYXRhLT5nZXQoKSkgeworICAgIHB0RGF0YS0+UmVtb3ZlUmVmKCk7CisgICAgaWYgKHB0RGF0YS0+dXNlX2NvdW50KCkgPT0gMCkgeworICAgICAgcHREYXRhLT5jbGVhcigpOwogICAgIH0KKyAgfQogfQogCi1DUERGX0ljY1Byb2ZpbGUqIENQREZfRG9jUGFnZURhdGE6OkdldEljY1Byb2ZpbGUoQ1BERl9TdHJlYW0qIHBJY2NQcm9maWxlU3RyZWFtKQotewotICAgIGlmICghcEljY1Byb2ZpbGVTdHJlYW0pCi0gICAgICAgIHJldHVybiBOVUxMOworQ1BERl9JbWFnZSogQ1BERl9Eb2NQYWdlRGF0YTo6R2V0SW1hZ2UoQ1BERl9PYmplY3QqIHBJbWFnZVN0cmVhbSkgeworICBpZiAoIXBJbWFnZVN0cmVhbSkKKyAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIGF1dG8gaXQgPSBtX0ljY1Byb2ZpbGVNYXAuZmluZChwSWNjUHJvZmlsZVN0cmVhbSk7Ci0gICAgaWYgKGl0ICE9IG1fSWNjUHJvZmlsZU1hcC5lbmQoKSkgewotICAgICAgICByZXR1cm4gaXQtPnNlY29uZC0+QWRkUmVmKCk7CisgIGNvbnN0IEZYX0RXT1JEIGR3SW1hZ2VPYmpOdW0gPSBwSW1hZ2VTdHJlYW0tPkdldE9iak51bSgpOworICBhdXRvIGl0ID0gbV9JbWFnZU1hcC5maW5kKGR3SW1hZ2VPYmpOdW0pOworICBpZiAoaXQgIT0gbV9JbWFnZU1hcC5lbmQoKSkgeworICAgIHJldHVybiBpdC0+c2Vjb25kLT5BZGRSZWYoKTsKKyAgfQorCisgIENQREZfSW1hZ2UqIHBJbWFnZSA9IG5ldyBDUERGX0ltYWdlKG1fcFBERkRvYyk7CisgIHBJbWFnZS0+TG9hZEltYWdlRigoQ1BERl9TdHJlYW0qKXBJbWFnZVN0cmVhbSwgRkFMU0UpOworCisgIENQREZfQ291bnRlZEltYWdlKiBpbWFnZURhdGEgPSBuZXcgQ1BERl9Db3VudGVkSW1hZ2UocEltYWdlKTsKKyAgbV9JbWFnZU1hcFtkd0ltYWdlT2JqTnVtXSA9IGltYWdlRGF0YTsKKyAgcmV0dXJuIGltYWdlRGF0YS0+QWRkUmVmKCk7Cit9CisKK3ZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZUltYWdlKENQREZfT2JqZWN0KiBwSW1hZ2VTdHJlYW0pIHsKKyAgaWYgKCFwSW1hZ2VTdHJlYW0gfHwgIXBJbWFnZVN0cmVhbS0+R2V0T2JqTnVtKCkpCisgICAgcmV0dXJuOworCisgIGF1dG8gaXQgPSBtX0ltYWdlTWFwLmZpbmQocEltYWdlU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgIGlmIChpdCA9PSBtX0ltYWdlTWFwLmVuZCgpKQorICAgIHJldHVybjsKKworICBDUERGX0NvdW50ZWRJbWFnZSogaW1hZ2UgPSBpdC0+c2Vjb25kOworICBpZiAoIWltYWdlKQorICAgIHJldHVybjsKKworICBpbWFnZS0+UmVtb3ZlUmVmKCk7CisgIGlmIChpbWFnZS0+dXNlX2NvdW50KCkgPT0gMCkgeworICAgIGRlbGV0ZSBpbWFnZS0+Z2V0KCk7CisgICAgZGVsZXRlIGltYWdlOworICAgIG1fSW1hZ2VNYXAuZXJhc2UoaXQpOworICB9Cit9CisKK0NQREZfSWNjUHJvZmlsZSogQ1BERl9Eb2NQYWdlRGF0YTo6R2V0SWNjUHJvZmlsZSgKKyAgICBDUERGX1N0cmVhbSogcEljY1Byb2ZpbGVTdHJlYW0pIHsKKyAgaWYgKCFwSWNjUHJvZmlsZVN0cmVhbSkKKyAgICByZXR1cm4gTlVMTDsKKworICBhdXRvIGl0ID0gbV9JY2NQcm9maWxlTWFwLmZpbmQocEljY1Byb2ZpbGVTdHJlYW0pOworICBpZiAoaXQgIT0gbV9JY2NQcm9maWxlTWFwLmVuZCgpKSB7CisgICAgcmV0dXJuIGl0LT5zZWNvbmQtPkFkZFJlZigpOworICB9CisKKyAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtOworICBzdHJlYW0uTG9hZEFsbERhdGEocEljY1Byb2ZpbGVTdHJlYW0sIEZBTFNFKTsKKyAgdWludDhfdCBkaWdlc3RbMjBdOworICBDUERGX1N0cmVhbSogcENvcGllZFN0cmVhbSA9IG51bGxwdHI7CisgIENSWVBUX1NIQTFHZW5lcmF0ZShzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpLCBkaWdlc3QpOworICBpZiAobV9IYXNoUHJvZmlsZU1hcC5Mb29rdXAoQ0ZYX0J5dGVTdHJpbmdDKGRpZ2VzdCwgMjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqJilwQ29waWVkU3RyZWFtKSkgeworICAgIGF1dG8gaXRfY29waWVkX3N0cmVhbSA9IG1fSWNjUHJvZmlsZU1hcC5maW5kKHBDb3BpZWRTdHJlYW0pOworICAgIHJldHVybiBpdF9jb3BpZWRfc3RyZWFtLT5zZWNvbmQtPkFkZFJlZigpOworICB9CisgIENQREZfSWNjUHJvZmlsZSogcFByb2ZpbGUgPQorICAgICAgbmV3IENQREZfSWNjUHJvZmlsZShzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpKTsKKyAgQ1BERl9Db3VudGVkSWNjUHJvZmlsZSogaXBEYXRhID0gbmV3IENQREZfQ291bnRlZEljY1Byb2ZpbGUocFByb2ZpbGUpOworICBtX0ljY1Byb2ZpbGVNYXBbcEljY1Byb2ZpbGVTdHJlYW1dID0gaXBEYXRhOworICBtX0hhc2hQcm9maWxlTWFwLlNldEF0KENGWF9CeXRlU3RyaW5nQyhkaWdlc3QsIDIwKSwgcEljY1Byb2ZpbGVTdHJlYW0pOworICByZXR1cm4gaXBEYXRhLT5BZGRSZWYoKTsKK30KKwordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpSZWxlYXNlSWNjUHJvZmlsZShDUERGX0ljY1Byb2ZpbGUqIHBJY2NQcm9maWxlKSB7CisgIEFTU0VSVChwSWNjUHJvZmlsZSk7CisKKyAgZm9yIChhdXRvIGl0ID0gbV9JY2NQcm9maWxlTWFwLmJlZ2luKCk7IGl0ICE9IG1fSWNjUHJvZmlsZU1hcC5lbmQoKTsgKytpdCkgeworICAgIENQREZfQ291bnRlZEljY1Byb2ZpbGUqIHByb2ZpbGUgPSBpdC0+c2Vjb25kOworICAgIGlmIChwcm9maWxlLT5nZXQoKSAhPSBwSWNjUHJvZmlsZSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgcHJvZmlsZS0+UmVtb3ZlUmVmKCk7CisgICAgaWYgKHByb2ZpbGUtPnVzZV9jb3VudCgpID09IDApIHsKKyAgICAgIGRlbGV0ZSBwcm9maWxlLT5nZXQoKTsKKyAgICAgIGRlbGV0ZSBwcm9maWxlOworICAgICAgbV9JY2NQcm9maWxlTWFwLmVyYXNlKGl0KTsKKyAgICAgIHJldHVybjsKICAgICB9Ci0KLSAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW07Ci0gICAgc3RyZWFtLkxvYWRBbGxEYXRhKHBJY2NQcm9maWxlU3RyZWFtLCBGQUxTRSk7Ci0gICAgdWludDhfdCBkaWdlc3RbMjBdOwotICAgIENQREZfU3RyZWFtKiBwQ29waWVkU3RyZWFtID0gbnVsbHB0cjsKLSAgICBDUllQVF9TSEExR2VuZXJhdGUoc3RyZWFtLkdldERhdGEoKSwgc3RyZWFtLkdldFNpemUoKSwgZGlnZXN0KTsKLSAgICBpZiAobV9IYXNoUHJvZmlsZU1hcC5Mb29rdXAoQ0ZYX0J5dGVTdHJpbmdDKGRpZ2VzdCwgMjApLCAodm9pZComKXBDb3BpZWRTdHJlYW0pKSB7Ci0gICAgICAgIGF1dG8gaXRfY29waWVkX3N0cmVhbSA9IG1fSWNjUHJvZmlsZU1hcC5maW5kKHBDb3BpZWRTdHJlYW0pOwotICAgICAgICByZXR1cm4gaXRfY29waWVkX3N0cmVhbS0+c2Vjb25kLT5BZGRSZWYoKTsKLSAgICB9Ci0gICAgQ1BERl9JY2NQcm9maWxlKiBwUHJvZmlsZSA9IG5ldyBDUERGX0ljY1Byb2ZpbGUoc3RyZWFtLkdldERhdGEoKSwgc3RyZWFtLkdldFNpemUoKSk7Ci0gICAgQ1BERl9Db3VudGVkSWNjUHJvZmlsZSogaXBEYXRhID0gbmV3IENQREZfQ291bnRlZEljY1Byb2ZpbGUocFByb2ZpbGUpOwotICAgIG1fSWNjUHJvZmlsZU1hcFtwSWNjUHJvZmlsZVN0cmVhbV0gPSBpcERhdGE7Ci0gICAgbV9IYXNoUHJvZmlsZU1hcC5TZXRBdChDRlhfQnl0ZVN0cmluZ0MoZGlnZXN0LCAyMCksIHBJY2NQcm9maWxlU3RyZWFtKTsKLSAgICByZXR1cm4gaXBEYXRhLT5BZGRSZWYoKTsKKyAgfQogfQogCi12b2lkIENQREZfRG9jUGFnZURhdGE6OlJlbGVhc2VJY2NQcm9maWxlKENQREZfSWNjUHJvZmlsZSogcEljY1Byb2ZpbGUpCi17Ci0gICAgQVNTRVJUKHBJY2NQcm9maWxlKTsKK0NQREZfU3RyZWFtQWNjKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRGb250RmlsZVN0cmVhbUFjYygKKyAgICBDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0pIHsKKyAgQVNTRVJUKHBGb250U3RyZWFtKTsKIAotICAgIGZvciAoYXV0byBpdCA9IG1fSWNjUHJvZmlsZU1hcC5iZWdpbigpOyBpdCAhPSBtX0ljY1Byb2ZpbGVNYXAuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgQ1BERl9Db3VudGVkSWNjUHJvZmlsZSogcHJvZmlsZSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChwcm9maWxlLT5nZXQoKSAhPSBwSWNjUHJvZmlsZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOworICBhdXRvIGl0ID0gbV9Gb250RmlsZU1hcC5maW5kKHBGb250U3RyZWFtKTsKKyAgaWYgKGl0ICE9IG1fRm9udEZpbGVNYXAuZW5kKCkpCisgICAgcmV0dXJuIGl0LT5zZWNvbmQtPkFkZFJlZigpOwogCi0gICAgICAgIHByb2ZpbGUtPlJlbW92ZVJlZigpOwotICAgICAgICBpZiAocHJvZmlsZS0+dXNlX2NvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgZGVsZXRlIHByb2ZpbGUtPmdldCgpOwotICAgICAgICAgICAgZGVsZXRlIHByb2ZpbGU7Ci0gICAgICAgICAgICBtX0ljY1Byb2ZpbGVNYXAuZXJhc2UoaXQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IHBGb250U3RyZWFtLT5HZXREaWN0KCk7CisgIGludDMyX3Qgb3JnX3NpemUgPSBwRm9udERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aDEiKSkgKworICAgICAgICAgICAgICAgICAgICAgcEZvbnREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgyIikpICsKKyAgICAgICAgICAgICAgICAgICAgIHBGb250RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoMyIpKTsKKyAgaWYgKG9yZ19zaXplIDwgMCkKKyAgICBvcmdfc2l6ZSA9IDA7CisKKyAgQ1BERl9TdHJlYW1BY2MqIHBGb250RmlsZSA9IG5ldyBDUERGX1N0cmVhbUFjYzsKKyAgcEZvbnRGaWxlLT5Mb2FkQWxsRGF0YShwRm9udFN0cmVhbSwgRkFMU0UsIG9yZ19zaXplKTsKKworICBDUERGX0NvdW50ZWRTdHJlYW1BY2MqIGZ0RGF0YSA9IG5ldyBDUERGX0NvdW50ZWRTdHJlYW1BY2MocEZvbnRGaWxlKTsKKyAgbV9Gb250RmlsZU1hcFtwRm9udFN0cmVhbV0gPSBmdERhdGE7CisgIHJldHVybiBmdERhdGEtPkFkZFJlZigpOwogfQogCi1DUERGX1N0cmVhbUFjYyogQ1BERl9Eb2NQYWdlRGF0YTo6R2V0Rm9udEZpbGVTdHJlYW1BY2MoQ1BERl9TdHJlYW0qIHBGb250U3RyZWFtKQotewotICAgIEFTU0VSVChwRm9udFN0cmVhbSk7Cit2b2lkIENQREZfRG9jUGFnZURhdGE6OlJlbGVhc2VGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb3JjZSkgeworICBpZiAoIXBGb250U3RyZWFtKQorICAgIHJldHVybjsKIAotICAgIGF1dG8gaXQgPSBtX0ZvbnRGaWxlTWFwLmZpbmQocEZvbnRTdHJlYW0pOwotICAgIGlmIChpdCAhPSBtX0ZvbnRGaWxlTWFwLmVuZCgpKQotICAgICAgICByZXR1cm4gaXQtPnNlY29uZC0+QWRkUmVmKCk7CisgIGF1dG8gaXQgPSBtX0ZvbnRGaWxlTWFwLmZpbmQocEZvbnRTdHJlYW0pOworICBpZiAoaXQgPT0gbV9Gb250RmlsZU1hcC5lbmQoKSkKKyAgICByZXR1cm47CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IHBGb250U3RyZWFtLT5HZXREaWN0KCk7Ci0gICAgaW50MzJfdCBvcmdfc2l6ZSA9IHBGb250RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoMSIpKSArCi0gICAgICAgICAgICAgICAgICAgICAgIHBGb250RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoMiIpKSArCi0gICAgICAgICAgICAgICAgICAgICAgIHBGb250RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoMyIpKTsKLSAgICBpZiAob3JnX3NpemUgPCAwKQotICAgICAgICBvcmdfc2l6ZSA9IDA7CisgIENQREZfQ291bnRlZFN0cmVhbUFjYyogZmluZERhdGEgPSBpdC0+c2Vjb25kOworICBpZiAoIWZpbmREYXRhKQorICAgIHJldHVybjsKIAotICAgIENQREZfU3RyZWFtQWNjKiBwRm9udEZpbGUgPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgcEZvbnRGaWxlLT5Mb2FkQWxsRGF0YShwRm9udFN0cmVhbSwgRkFMU0UsIG9yZ19zaXplKTsKLQotICAgIENQREZfQ291bnRlZFN0cmVhbUFjYyogZnREYXRhID0gbmV3IENQREZfQ291bnRlZFN0cmVhbUFjYyhwRm9udEZpbGUpOwotICAgIG1fRm9udEZpbGVNYXBbcEZvbnRTdHJlYW1dID0gZnREYXRhOwotICAgIHJldHVybiBmdERhdGEtPkFkZFJlZigpOworICBmaW5kRGF0YS0+UmVtb3ZlUmVmKCk7CisgIGlmIChmaW5kRGF0YS0+dXNlX2NvdW50KCkgPT0gMCB8fCBiRm9yY2UpIHsKKyAgICBkZWxldGUgZmluZERhdGEtPmdldCgpOworICAgIGRlbGV0ZSBmaW5kRGF0YTsKKyAgICBtX0ZvbnRGaWxlTWFwLmVyYXNlKGl0KTsKKyAgfQogfQogCi12b2lkIENQREZfRG9jUGFnZURhdGE6OlJlbGVhc2VGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0sIEZYX0JPT0wgYkZvcmNlKQotewotICAgIGlmICghcEZvbnRTdHJlYW0pCi0gICAgICAgIHJldHVybjsKK0NQREZfQ291bnRlZENvbG9yU3BhY2UqIENQREZfRG9jUGFnZURhdGE6OkZpbmRDb2xvclNwYWNlUHRyKAorICAgIENQREZfT2JqZWN0KiBwQ1NPYmopIGNvbnN0IHsKKyAgaWYgKCFwQ1NPYmopCisgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBhdXRvIGl0ID0gbV9Gb250RmlsZU1hcC5maW5kKHBGb250U3RyZWFtKTsKLSAgICBpZiAoaXQgPT0gbV9Gb250RmlsZU1hcC5lbmQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ1BERl9Db3VudGVkU3RyZWFtQWNjKiBmaW5kRGF0YSA9IGl0LT5zZWNvbmQ7Ci0gICAgaWYgKCFmaW5kRGF0YSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZmluZERhdGEtPlJlbW92ZVJlZigpOwotICAgIGlmIChmaW5kRGF0YS0+dXNlX2NvdW50KCkgPT0gMCB8fCBiRm9yY2UpIHsKLSAgICAgICAgZGVsZXRlIGZpbmREYXRhLT5nZXQoKTsKLSAgICAgICAgZGVsZXRlIGZpbmREYXRhOwotICAgICAgICBtX0ZvbnRGaWxlTWFwLmVyYXNlKGl0KTsKLSAgICB9CisgIGF1dG8gaXQgPSBtX0NvbG9yU3BhY2VNYXAuZmluZChwQ1NPYmopOworICByZXR1cm4gaXQgIT0gbV9Db2xvclNwYWNlTWFwLmVuZCgpID8gaXQtPnNlY29uZCA6IG51bGxwdHI7CiB9CiAKLUNQREZfQ291bnRlZENvbG9yU3BhY2UqIENQREZfRG9jUGFnZURhdGE6OkZpbmRDb2xvclNwYWNlUHRyKENQREZfT2JqZWN0KiBwQ1NPYmopIGNvbnN0Ci17Ci0gICAgaWYgKCFwQ1NPYmopCi0gICAgICAgIHJldHVybiBudWxscHRyOworQ1BERl9Db3VudGVkUGF0dGVybiogQ1BERl9Eb2NQYWdlRGF0YTo6RmluZFBhdHRlcm5QdHIoCisgICAgQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqKSBjb25zdCB7CisgIGlmICghcFBhdHRlcm5PYmopCisgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBhdXRvIGl0ID0gbV9Db2xvclNwYWNlTWFwLmZpbmQocENTT2JqKTsKLSAgICByZXR1cm4gaXQgIT0gbV9Db2xvclNwYWNlTWFwLmVuZCgpID8gaXQtPnNlY29uZCA6IG51bGxwdHI7Ci19Ci0KLUNQREZfQ291bnRlZFBhdHRlcm4qIENQREZfRG9jUGFnZURhdGE6OkZpbmRQYXR0ZXJuUHRyKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaikgY29uc3QKLXsKLSAgICBpZiAoIXBQYXR0ZXJuT2JqKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGF1dG8gaXQgPSBtX1BhdHRlcm5NYXAuZmluZChwUGF0dGVybk9iaik7Ci0gICAgcmV0dXJuIGl0ICE9IG1fUGF0dGVybk1hcC5lbmQoKSA/IGl0LT5zZWNvbmQgOiBudWxscHRyOworICBhdXRvIGl0ID0gbV9QYXR0ZXJuTWFwLmZpbmQocFBhdHRlcm5PYmopOworICByZXR1cm4gaXQgIT0gbV9QYXR0ZXJuTWFwLmVuZCgpID8gaXQtPnNlY29uZCA6IG51bGxwdHI7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZnVuYy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZnVuYy5jcHAKaW5kZXggYzk2MWY4Yi4uODdmZjBhMyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2Z1bmMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9mdW5jLmNwcApAQCAtMTMsODkzICsxMyw5MDcgQEAKICNpbmNsdWRlICJwYWdlaW50LmgiCiAKIGNsYXNzIENQREZfUFNFbmdpbmU7Ci10eXBlZGVmIGVudW0ge1BTT1BfQURELCBQU09QX1NVQiwgUFNPUF9NVUwsIFBTT1BfRElWLCBQU09QX0lESVYsIFBTT1BfTU9ELAotICAgICAgICAgICAgICBQU09QX05FRywgUFNPUF9BQlMsIFBTT1BfQ0VJTElORywgUFNPUF9GTE9PUiwgUFNPUF9ST1VORCwgUFNPUF9UUlVOQ0FURSwKLSAgICAgICAgICAgICAgUFNPUF9TUVJULCBQU09QX1NJTiwgUFNPUF9DT1MsIFBTT1BfQVRBTiwgUFNPUF9FWFAsIFBTT1BfTE4sIFBTT1BfTE9HLAotICAgICAgICAgICAgICBQU09QX0NWSSwgUFNPUF9DVlIsIFBTT1BfRVEsIFBTT1BfTkUsIFBTT1BfR1QsIFBTT1BfR0UsIFBTT1BfTFQsIFBTT1BfTEUsCi0gICAgICAgICAgICAgIFBTT1BfQU5ELCBQU09QX09SLCBQU09QX1hPUiwgUFNPUF9OT1QsIFBTT1BfQklUU0hJRlQsIFBTT1BfVFJVRSwgUFNPUF9GQUxTRSwKLSAgICAgICAgICAgICAgUFNPUF9JRiwgUFNPUF9JRkVMU0UsIFBTT1BfUE9QLCBQU09QX0VYQ0gsIFBTT1BfRFVQLCBQU09QX0NPUFksCi0gICAgICAgICAgICAgIFBTT1BfSU5ERVgsIFBTT1BfUk9MTCwgUFNPUF9QUk9DLCBQU09QX0NPTlNUCi0gICAgICAgICAgICAgfSBQREZfUFNPUDsKLWNsYXNzIENQREZfUFNQcm9jCi17Ci1wdWJsaWM6Ci0gICAgfkNQREZfUFNQcm9jKCk7Ci0gICAgRlhfQk9PTAlQYXJzZShDUERGX1NpbXBsZVBhcnNlciYgcGFyc2VyKTsKLSAgICBGWF9CT09MCUV4ZWN1dGUoQ1BERl9QU0VuZ2luZSogcEVuZ2luZSk7Ci0gICAgQ0ZYX1B0ckFycmF5CQltX09wZXJhdG9yczsKK3R5cGVkZWYgZW51bSB7CisgIFBTT1BfQURELAorICBQU09QX1NVQiwKKyAgUFNPUF9NVUwsCisgIFBTT1BfRElWLAorICBQU09QX0lESVYsCisgIFBTT1BfTU9ELAorICBQU09QX05FRywKKyAgUFNPUF9BQlMsCisgIFBTT1BfQ0VJTElORywKKyAgUFNPUF9GTE9PUiwKKyAgUFNPUF9ST1VORCwKKyAgUFNPUF9UUlVOQ0FURSwKKyAgUFNPUF9TUVJULAorICBQU09QX1NJTiwKKyAgUFNPUF9DT1MsCisgIFBTT1BfQVRBTiwKKyAgUFNPUF9FWFAsCisgIFBTT1BfTE4sCisgIFBTT1BfTE9HLAorICBQU09QX0NWSSwKKyAgUFNPUF9DVlIsCisgIFBTT1BfRVEsCisgIFBTT1BfTkUsCisgIFBTT1BfR1QsCisgIFBTT1BfR0UsCisgIFBTT1BfTFQsCisgIFBTT1BfTEUsCisgIFBTT1BfQU5ELAorICBQU09QX09SLAorICBQU09QX1hPUiwKKyAgUFNPUF9OT1QsCisgIFBTT1BfQklUU0hJRlQsCisgIFBTT1BfVFJVRSwKKyAgUFNPUF9GQUxTRSwKKyAgUFNPUF9JRiwKKyAgUFNPUF9JRkVMU0UsCisgIFBTT1BfUE9QLAorICBQU09QX0VYQ0gsCisgIFBTT1BfRFVQLAorICBQU09QX0NPUFksCisgIFBTT1BfSU5ERVgsCisgIFBTT1BfUk9MTCwKKyAgUFNPUF9QUk9DLAorICBQU09QX0NPTlNUCit9IFBERl9QU09QOworY2xhc3MgQ1BERl9QU1Byb2MgeworIHB1YmxpYzoKKyAgfkNQREZfUFNQcm9jKCk7CisgIEZYX0JPT0wgUGFyc2UoQ1BERl9TaW1wbGVQYXJzZXImIHBhcnNlcik7CisgIEZYX0JPT0wgRXhlY3V0ZShDUERGX1BTRW5naW5lKiBwRW5naW5lKTsKKyAgQ0ZYX1B0ckFycmF5IG1fT3BlcmF0b3JzOwogfTsKICNkZWZpbmUgUFNFTkdJTkVfU1RBQ0tTSVpFIDEwMAotY2xhc3MgQ1BERl9QU0VuZ2luZQotewotcHVibGljOgotICAgIENQREZfUFNFbmdpbmUoKTsKLSAgICB+Q1BERl9QU0VuZ2luZSgpOwotICAgIEZYX0JPT0wJUGFyc2UoY29uc3QgRlhfQ0hBUiogc3RyaW5nLCBpbnQgc2l6ZSk7Ci0gICAgRlhfQk9PTAlFeGVjdXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX01haW5Qcm9jLkV4ZWN1dGUodGhpcyk7Ci0gICAgfQotICAgIEZYX0JPT0wJRG9PcGVyYXRvcihQREZfUFNPUCBvcCk7Ci0gICAgdm9pZAlSZXNldCgpCi0gICAgewotICAgICAgICBtX1N0YWNrQ291bnQgPSAwOwotICAgIH0KLSAgICB2b2lkCVB1c2goRlhfRkxPQVQgdmFsdWUpOwotICAgIHZvaWQJUHVzaChpbnQgdmFsdWUpCi0gICAgewotICAgICAgICBQdXNoKChGWF9GTE9BVCl2YWx1ZSk7Ci0gICAgfQotICAgIEZYX0ZMT0FUCVBvcCgpOwotICAgIGludAkJR2V0U3RhY2tTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1N0YWNrQ291bnQ7Ci0gICAgfQotcHJpdmF0ZToKLSAgICBGWF9GTE9BVAltX1N0YWNrW1BTRU5HSU5FX1NUQUNLU0laRV07Ci0gICAgaW50CQltX1N0YWNrQ291bnQ7Ci0gICAgQ1BERl9QU1Byb2MJbV9NYWluUHJvYzsKK2NsYXNzIENQREZfUFNFbmdpbmUgeworIHB1YmxpYzoKKyAgQ1BERl9QU0VuZ2luZSgpOworICB+Q1BERl9QU0VuZ2luZSgpOworICBGWF9CT09MIFBhcnNlKGNvbnN0IEZYX0NIQVIqIHN0cmluZywgaW50IHNpemUpOworICBGWF9CT09MIEV4ZWN1dGUoKSB7IHJldHVybiBtX01haW5Qcm9jLkV4ZWN1dGUodGhpcyk7IH0KKyAgRlhfQk9PTCBEb09wZXJhdG9yKFBERl9QU09QIG9wKTsKKyAgdm9pZCBSZXNldCgpIHsgbV9TdGFja0NvdW50ID0gMDsgfQorICB2b2lkIFB1c2goRlhfRkxPQVQgdmFsdWUpOworICB2b2lkIFB1c2goaW50IHZhbHVlKSB7IFB1c2goKEZYX0ZMT0FUKXZhbHVlKTsgfQorICBGWF9GTE9BVCBQb3AoKTsKKyAgaW50IEdldFN0YWNrU2l6ZSgpIHsgcmV0dXJuIG1fU3RhY2tDb3VudDsgfQorCisgcHJpdmF0ZToKKyAgRlhfRkxPQVQgbV9TdGFja1tQU0VOR0lORV9TVEFDS1NJWkVdOworICBpbnQgbV9TdGFja0NvdW50OworICBDUERGX1BTUHJvYyBtX01haW5Qcm9jOwogfTsKLUNQREZfUFNQcm9jOjp+Q1BERl9QU1Byb2MoKQotewotICAgIGludCBzaXplID0gbV9PcGVyYXRvcnMuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICBpZiAobV9PcGVyYXRvcnNbaV0gPT0gKHZvaWQqKVBTT1BfUFJPQykgewotICAgICAgICAgICAgZGVsZXRlIChDUERGX1BTUHJvYyopbV9PcGVyYXRvcnNbaSArIDFdOwotICAgICAgICAgICAgaSArKzsKLSAgICAgICAgfSBlbHNlIGlmIChtX09wZXJhdG9yc1tpXSA9PSAodm9pZCopUFNPUF9DT05TVCkgewotICAgICAgICAgICAgRlhfRnJlZSgoRlhfRkxPQVQqKW1fT3BlcmF0b3JzW2kgKyAxXSk7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9CitDUERGX1BTUHJvYzo6fkNQREZfUFNQcm9jKCkgeworICBpbnQgc2l6ZSA9IG1fT3BlcmF0b3JzLkdldFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpZiAobV9PcGVyYXRvcnNbaV0gPT0gKHZvaWQqKVBTT1BfUFJPQykgeworICAgICAgZGVsZXRlIChDUERGX1BTUHJvYyopbV9PcGVyYXRvcnNbaSArIDFdOworICAgICAgaSsrOworICAgIH0gZWxzZSBpZiAobV9PcGVyYXRvcnNbaV0gPT0gKHZvaWQqKVBTT1BfQ09OU1QpIHsKKyAgICAgIEZYX0ZyZWUoKEZYX0ZMT0FUKiltX09wZXJhdG9yc1tpICsgMV0pOworICAgICAgaSsrOwogICAgIH0KKyAgfQogfQotRlhfQk9PTCBDUERGX1BTUHJvYzo6RXhlY3V0ZShDUERGX1BTRW5naW5lKiBwRW5naW5lKQotewotICAgIGludCBzaXplID0gbV9PcGVyYXRvcnMuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICBQREZfUFNPUCBvcCA9IChQREZfUFNPUCkodWludHB0cl90KW1fT3BlcmF0b3JzW2ldOwotICAgICAgICBpZiAob3AgPT0gUFNPUF9QUk9DKSB7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9IGVsc2UgaWYgKG9wID09IFBTT1BfQ09OU1QpIHsKLSAgICAgICAgICAgIHBFbmdpbmUtPlB1c2goKihGWF9GTE9BVCopbV9PcGVyYXRvcnNbaSArIDFdKTsKLSAgICAgICAgICAgIGkgKys7Ci0gICAgICAgIH0gZWxzZSBpZiAob3AgPT0gUFNPUF9JRikgewotICAgICAgICAgICAgaWYgKGkgPCAyIHx8IG1fT3BlcmF0b3JzW2kgLSAyXSAhPSAodm9pZCopUFNPUF9QUk9DKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChpbnQpcEVuZ2luZS0+UG9wKCkpIHsKLSAgICAgICAgICAgICAgICAoKENQREZfUFNQcm9jKiltX09wZXJhdG9yc1tpIC0gMV0pLT5FeGVjdXRlKHBFbmdpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG9wID09IFBTT1BfSUZFTFNFKSB7Ci0gICAgICAgICAgICBpZiAoaSA8IDQgfHwgbV9PcGVyYXRvcnNbaSAtIDJdICE9ICh2b2lkKilQU09QX1BST0MgfHwKLSAgICAgICAgICAgICAgICAgICAgbV9PcGVyYXRvcnNbaSAtIDRdICE9ICh2b2lkKilQU09QX1BST0MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGludClwRW5naW5lLT5Qb3AoKSkgewotICAgICAgICAgICAgICAgICgoQ1BERl9QU1Byb2MqKW1fT3BlcmF0b3JzW2kgLSAzXSktPkV4ZWN1dGUocEVuZ2luZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICgoQ1BERl9QU1Byb2MqKW1fT3BlcmF0b3JzW2kgLSAxXSktPkV4ZWN1dGUocEVuZ2luZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRW5naW5lLT5Eb09wZXJhdG9yKG9wKTsKLSAgICAgICAgfQorRlhfQk9PTCBDUERGX1BTUHJvYzo6RXhlY3V0ZShDUERGX1BTRW5naW5lKiBwRW5naW5lKSB7CisgIGludCBzaXplID0gbV9PcGVyYXRvcnMuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIFBERl9QU09QIG9wID0gKFBERl9QU09QKSh1aW50cHRyX3QpbV9PcGVyYXRvcnNbaV07CisgICAgaWYgKG9wID09IFBTT1BfUFJPQykgeworICAgICAgaSsrOworICAgIH0gZWxzZSBpZiAob3AgPT0gUFNPUF9DT05TVCkgeworICAgICAgcEVuZ2luZS0+UHVzaCgqKEZYX0ZMT0FUKiltX09wZXJhdG9yc1tpICsgMV0pOworICAgICAgaSsrOworICAgIH0gZWxzZSBpZiAob3AgPT0gUFNPUF9JRikgeworICAgICAgaWYgKGkgPCAyIHx8IG1fT3BlcmF0b3JzW2kgLSAyXSAhPSAodm9pZCopUFNPUF9QUk9DKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmICgoaW50KXBFbmdpbmUtPlBvcCgpKSB7CisgICAgICAgICgoQ1BERl9QU1Byb2MqKW1fT3BlcmF0b3JzW2kgLSAxXSktPkV4ZWN1dGUocEVuZ2luZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChvcCA9PSBQU09QX0lGRUxTRSkgeworICAgICAgaWYgKGkgPCA0IHx8IG1fT3BlcmF0b3JzW2kgLSAyXSAhPSAodm9pZCopUFNPUF9QUk9DIHx8CisgICAgICAgICAgbV9PcGVyYXRvcnNbaSAtIDRdICE9ICh2b2lkKilQU09QX1BST0MpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaWYgKChpbnQpcEVuZ2luZS0+UG9wKCkpIHsKKyAgICAgICAgKChDUERGX1BTUHJvYyopbV9PcGVyYXRvcnNbaSAtIDNdKS0+RXhlY3V0ZShwRW5naW5lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICgoQ1BERl9QU1Byb2MqKW1fT3BlcmF0b3JzW2kgLSAxXSktPkV4ZWN1dGUocEVuZ2luZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHBFbmdpbmUtPkRvT3BlcmF0b3Iob3ApOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUNQREZfUFNFbmdpbmU6OkNQREZfUFNFbmdpbmUoKQotewotICAgIG1fU3RhY2tDb3VudCA9IDA7CitDUERGX1BTRW5naW5lOjpDUERGX1BTRW5naW5lKCkgeworICBtX1N0YWNrQ291bnQgPSAwOwogfQotQ1BERl9QU0VuZ2luZTo6fkNQREZfUFNFbmdpbmUoKQoteworQ1BERl9QU0VuZ2luZTo6fkNQREZfUFNFbmdpbmUoKSB7fQordm9pZCBDUERGX1BTRW5naW5lOjpQdXNoKEZYX0ZMT0FUIHYpIHsKKyAgaWYgKG1fU3RhY2tDb3VudCA9PSAxMDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9TdGFja1ttX1N0YWNrQ291bnQrK10gPSB2OwogfQotdm9pZCBDUERGX1BTRW5naW5lOjpQdXNoKEZYX0ZMT0FUIHYpCi17Ci0gICAgaWYgKG1fU3RhY2tDb3VudCA9PSAxMDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX1N0YWNrW21fU3RhY2tDb3VudCsrXSA9IHY7Ci19Ci1GWF9GTE9BVCBDUERGX1BTRW5naW5lOjpQb3AoKQotewotICAgIGlmIChtX1N0YWNrQ291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fU3RhY2tbLS1tX1N0YWNrQ291bnRdOworRlhfRkxPQVQgQ1BERl9QU0VuZ2luZTo6UG9wKCkgeworICBpZiAobV9TdGFja0NvdW50ID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gbV9TdGFja1stLW1fU3RhY2tDb3VudF07CiB9CiBjb25zdCBzdHJ1Y3QgX1BERl9QU09wTmFtZSB7Ci0gICAgY29uc3QgRlhfQ0hBUiogbmFtZTsKLSAgICBQREZfUFNPUCBvcDsKLX0gX1BERl9QU09wTmFtZXNbXSA9IHsKLSAgICB7ImFkZCIsIFBTT1BfQUREfSwgeyJzdWIiLCBQU09QX1NVQn0sIHsibXVsIiwgUFNPUF9NVUx9LCB7ImRpdiIsIFBTT1BfRElWfSwKLSAgICB7ImlkaXYiLCBQU09QX0lESVZ9LCB7Im1vZCIsIFBTT1BfTU9EfSwgeyJuZWciLCBQU09QX05FR30sIHsiYWJzIiwgUFNPUF9BQlN9LAotICAgIHsiY2VpbGluZyIsIFBTT1BfQ0VJTElOR30sIHsiZmxvb3IiLCBQU09QX0ZMT09SfSwgeyJyb3VuZCIsIFBTT1BfUk9VTkR9LAotICAgIHsidHJ1bmNhdGUiLCBQU09QX1RSVU5DQVRFfSwgeyJzcXJ0IiwgUFNPUF9TUVJUfSwgeyJzaW4iLCBQU09QX1NJTn0sCi0gICAgeyJjb3MiLCBQU09QX0NPU30sIHsiYXRhbiIsIFBTT1BfQVRBTn0sIHsiZXhwIiwgUFNPUF9FWFB9LCB7ImxuIiwgUFNPUF9MTn0sCi0gICAgeyJsb2ciLCBQU09QX0xPR30sIHsiY3ZpIiwgUFNPUF9DVkl9LCB7ImN2ciIsIFBTT1BfQ1ZSfSwgeyJlcSIsIFBTT1BfRVF9LAotICAgIHsibmUiLCBQU09QX05FfSwgeyJndCIsIFBTT1BfR1R9LCB7ImdlIiwgUFNPUF9HRX0sIHsibHQiLCBQU09QX0xUfSwKLSAgICB7ImxlIiwgUFNPUF9MRX0sIHsiYW5kIiwgUFNPUF9BTkR9LCB7Im9yIiwgUFNPUF9PUn0sIHsieG9yIiwgUFNPUF9YT1J9LAotICAgIHsibm90IiwgUFNPUF9OT1R9LCB7ImJpdHNoaWZ0IiwgUFNPUF9CSVRTSElGVH0sIHsidHJ1ZSIsIFBTT1BfVFJVRX0sCi0gICAgeyJmYWxzZSIsIFBTT1BfRkFMU0V9LCB7ImlmIiwgUFNPUF9JRn0sIHsiaWZlbHNlIiwgUFNPUF9JRkVMU0V9LAotICAgIHsicG9wIiwgUFNPUF9QT1B9LCB7ImV4Y2giLCBQU09QX0VYQ0h9LCB7ImR1cCIsIFBTT1BfRFVQfSwKLSAgICB7ImNvcHkiLCBQU09QX0NPUFl9LCB7ImluZGV4IiwgUFNPUF9JTkRFWH0sIHsicm9sbCIsIFBTT1BfUk9MTH0sCi0gICAge05VTEwsIFBTT1BfUFJPQ30KLX07Ci1GWF9CT09MIENQREZfUFNFbmdpbmU6OlBhcnNlKGNvbnN0IEZYX0NIQVIqIHN0cmluZywgaW50IHNpemUpCi17Ci0gICAgQ1BERl9TaW1wbGVQYXJzZXIgcGFyc2VyKCh1aW50OF90KilzdHJpbmcsIHNpemUpOwotICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKLSAgICBpZiAod29yZCAhPSBGWF9CU1RSQygieyIpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fTWFpblByb2MuUGFyc2UocGFyc2VyKTsKKyAgY29uc3QgRlhfQ0hBUiogbmFtZTsKKyAgUERGX1BTT1Agb3A7Cit9IF9QREZfUFNPcE5hbWVzW10gPSB7eyJhZGQiLCBQU09QX0FERH0sICAgICAgICAgeyJzdWIiLCBQU09QX1NVQn0sCisgICAgICAgICAgICAgICAgICAgICAgeyJtdWwiLCBQU09QX01VTH0sICAgICAgICAgeyJkaXYiLCBQU09QX0RJVn0sCisgICAgICAgICAgICAgICAgICAgICAgeyJpZGl2IiwgUFNPUF9JRElWfSwgICAgICAgeyJtb2QiLCBQU09QX01PRH0sCisgICAgICAgICAgICAgICAgICAgICAgeyJuZWciLCBQU09QX05FR30sICAgICAgICAgeyJhYnMiLCBQU09QX0FCU30sCisgICAgICAgICAgICAgICAgICAgICAgeyJjZWlsaW5nIiwgUFNPUF9DRUlMSU5HfSwgeyJmbG9vciIsIFBTT1BfRkxPT1J9LAorICAgICAgICAgICAgICAgICAgICAgIHsicm91bmQiLCBQU09QX1JPVU5EfSwgICAgIHsidHJ1bmNhdGUiLCBQU09QX1RSVU5DQVRFfSwKKyAgICAgICAgICAgICAgICAgICAgICB7InNxcnQiLCBQU09QX1NRUlR9LCAgICAgICB7InNpbiIsIFBTT1BfU0lOfSwKKyAgICAgICAgICAgICAgICAgICAgICB7ImNvcyIsIFBTT1BfQ09TfSwgICAgICAgICB7ImF0YW4iLCBQU09QX0FUQU59LAorICAgICAgICAgICAgICAgICAgICAgIHsiZXhwIiwgUFNPUF9FWFB9LCAgICAgICAgIHsibG4iLCBQU09QX0xOfSwKKyAgICAgICAgICAgICAgICAgICAgICB7ImxvZyIsIFBTT1BfTE9HfSwgICAgICAgICB7ImN2aSIsIFBTT1BfQ1ZJfSwKKyAgICAgICAgICAgICAgICAgICAgICB7ImN2ciIsIFBTT1BfQ1ZSfSwgICAgICAgICB7ImVxIiwgUFNPUF9FUX0sCisgICAgICAgICAgICAgICAgICAgICAgeyJuZSIsIFBTT1BfTkV9LCAgICAgICAgICAgeyJndCIsIFBTT1BfR1R9LAorICAgICAgICAgICAgICAgICAgICAgIHsiZ2UiLCBQU09QX0dFfSwgICAgICAgICAgIHsibHQiLCBQU09QX0xUfSwKKyAgICAgICAgICAgICAgICAgICAgICB7ImxlIiwgUFNPUF9MRX0sICAgICAgICAgICB7ImFuZCIsIFBTT1BfQU5EfSwKKyAgICAgICAgICAgICAgICAgICAgICB7Im9yIiwgUFNPUF9PUn0sICAgICAgICAgICB7InhvciIsIFBTT1BfWE9SfSwKKyAgICAgICAgICAgICAgICAgICAgICB7Im5vdCIsIFBTT1BfTk9UfSwgICAgICAgICB7ImJpdHNoaWZ0IiwgUFNPUF9CSVRTSElGVH0sCisgICAgICAgICAgICAgICAgICAgICAgeyJ0cnVlIiwgUFNPUF9UUlVFfSwgICAgICAgeyJmYWxzZSIsIFBTT1BfRkFMU0V9LAorICAgICAgICAgICAgICAgICAgICAgIHsiaWYiLCBQU09QX0lGfSwgICAgICAgICAgIHsiaWZlbHNlIiwgUFNPUF9JRkVMU0V9LAorICAgICAgICAgICAgICAgICAgICAgIHsicG9wIiwgUFNPUF9QT1B9LCAgICAgICAgIHsiZXhjaCIsIFBTT1BfRVhDSH0sCisgICAgICAgICAgICAgICAgICAgICAgeyJkdXAiLCBQU09QX0RVUH0sICAgICAgICAgeyJjb3B5IiwgUFNPUF9DT1BZfSwKKyAgICAgICAgICAgICAgICAgICAgICB7ImluZGV4IiwgUFNPUF9JTkRFWH0sICAgICB7InJvbGwiLCBQU09QX1JPTEx9LAorICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBQU09QX1BST0N9fTsKK0ZYX0JPT0wgQ1BERl9QU0VuZ2luZTo6UGFyc2UoY29uc3QgRlhfQ0hBUiogc3RyaW5nLCBpbnQgc2l6ZSkgeworICBDUERGX1NpbXBsZVBhcnNlciBwYXJzZXIoKHVpbnQ4X3QqKXN0cmluZywgc2l6ZSk7CisgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgaWYgKHdvcmQgIT0gRlhfQlNUUkMoInsiKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gbV9NYWluUHJvYy5QYXJzZShwYXJzZXIpOwogfQotRlhfQk9PTCBDUERGX1BTUHJvYzo6UGFyc2UoQ1BERl9TaW1wbGVQYXJzZXImIHBhcnNlcikKLXsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IHBhcnNlci5HZXRXb3JkKCk7Ci0gICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJ9IikpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJ7IikpIHsKLSAgICAgICAgICAgIENQREZfUFNQcm9jKiBwUHJvYyA9IG5ldyBDUERGX1BTUHJvYzsKLSAgICAgICAgICAgIG1fT3BlcmF0b3JzLkFkZCgodm9pZCopUFNPUF9QUk9DKTsKLSAgICAgICAgICAgIG1fT3BlcmF0b3JzLkFkZChwUHJvYyk7Ci0gICAgICAgICAgICBpZiAoIXBQcm9jLT5QYXJzZShwYXJzZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgd2hpbGUgKF9QREZfUFNPcE5hbWVzW2ldLm5hbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAod29yZCA9PSBDRlhfQnl0ZVN0cmluZ0MoX1BERl9QU09wTmFtZXNbaV0ubmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9PcGVyYXRvcnMuQWRkKCh2b2lkKilfUERGX1BTT3BOYW1lc1tpXS5vcCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKF9QREZfUFNPcE5hbWVzW2ldLm5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwZCA9IEZYX0FsbG9jKEZYX0ZMT0FULCAxKTsKLSAgICAgICAgICAgICAgICAqcGQgPSBGWF9hdG9mKHdvcmQpOwotICAgICAgICAgICAgICAgIG1fT3BlcmF0b3JzLkFkZCgodm9pZCopUFNPUF9DT05TVCk7Ci0gICAgICAgICAgICAgICAgbV9PcGVyYXRvcnMuQWRkKHBkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorRlhfQk9PTCBDUERGX1BTUHJvYzo6UGFyc2UoQ1BERl9TaW1wbGVQYXJzZXImIHBhcnNlcikgeworICB3aGlsZSAoMSkgeworICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIn0iKSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJ7IikpIHsKKyAgICAgIENQREZfUFNQcm9jKiBwUHJvYyA9IG5ldyBDUERGX1BTUHJvYzsKKyAgICAgIG1fT3BlcmF0b3JzLkFkZCgodm9pZCopUFNPUF9QUk9DKTsKKyAgICAgIG1fT3BlcmF0b3JzLkFkZChwUHJvYyk7CisgICAgICBpZiAoIXBQcm9jLT5QYXJzZShwYXJzZXIpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW50IGkgPSAwOworICAgICAgd2hpbGUgKF9QREZfUFNPcE5hbWVzW2ldLm5hbWUpIHsKKyAgICAgICAgaWYgKHdvcmQgPT0gQ0ZYX0J5dGVTdHJpbmdDKF9QREZfUFNPcE5hbWVzW2ldLm5hbWUpKSB7CisgICAgICAgICAgbV9PcGVyYXRvcnMuQWRkKCh2b2lkKilfUERGX1BTT3BOYW1lc1tpXS5vcCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgICAgfQorICAgICAgaWYgKF9QREZfUFNPcE5hbWVzW2ldLm5hbWUgPT0gTlVMTCkgeworICAgICAgICBGWF9GTE9BVCogcGQgPSBGWF9BbGxvYyhGWF9GTE9BVCwgMSk7CisgICAgICAgICpwZCA9IEZYX2F0b2Yod29yZCk7CisgICAgICAgIG1fT3BlcmF0b3JzLkFkZCgodm9pZCopUFNPUF9DT05TVCk7CisgICAgICAgIG1fT3BlcmF0b3JzLkFkZChwZCk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NWYKLUZYX0JPT0wgQ1BERl9QU0VuZ2luZTo6RG9PcGVyYXRvcihQREZfUFNPUCBvcCkKLXsKLSAgICBpbnQgaTEsIGkyOwotICAgIEZYX0ZMT0FUIGQxLCBkMjsKLSAgICBzd2l0Y2ggKG9wKSB7Ci0gICAgICAgIGNhc2UgUFNPUF9BREQ6Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgZDIgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goZDEgKyBkMik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX1NVQjoKLSAgICAgICAgICAgIGQyID0gUG9wKCk7Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaChkMSAtIGQyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfTVVMOgotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIGQyID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKGQxICogZDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9ESVY6Ci0gICAgICAgICAgICBkMiA9IFBvcCgpOwotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goZDEgLyBkMik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0lESVY6Ci0gICAgICAgICAgICBpMiA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICBpMSA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKGkxIC8gaTIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9NT0Q6Ci0gICAgICAgICAgICBpMiA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICBpMSA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKGkxICUgaTIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9ORUc6Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaCgtZDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9BQlM6Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfZmFicyhkMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9DRUlMSU5HOgotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX2NlaWwoZDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfRkxPT1I6Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfZmxvb3IoZDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfUk9VTkQ6Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaChGWFNZU19yb3VuZChkMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9UUlVOQ0FURToKLSAgICAgICAgICAgIGkxID0gKGludClQb3AoKTsKLSAgICAgICAgICAgIFB1c2goaTEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9TUVJUOgotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX3NxcnQoZDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfU0lOOgotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX3NpbihkMSAqIFBJIC8gMTgwLjBmKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0NPUzoKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19jb3MoZDEgKiBQSSAvIDE4MC4wZikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9BVEFOOgotICAgICAgICAgICAgZDIgPSBQb3AoKTsKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBkMSA9IChGWF9GTE9BVCkoRlhTWVNfYXRhbjIoZDEsIGQyKSAqIDE4MC4wIC8gUEkpOwotICAgICAgICAgICAgaWYgKGQxIDwgMCkgewotICAgICAgICAgICAgICAgIGQxICs9IDM2MDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFB1c2goZDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9FWFA6Ci0gICAgICAgICAgICBkMiA9IFBvcCgpOwotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX3BvdyhkMSwgZDIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfTE46Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfbG9nKGQxKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0xPRzoKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19sb2cxMChkMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9DVkk6Ci0gICAgICAgICAgICBpMSA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKGkxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfQ1ZSOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9FUToKLSAgICAgICAgICAgIGQyID0gUG9wKCk7Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaCgoaW50KShkMSA9PSBkMikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9ORToKLSAgICAgICAgICAgIGQyID0gUG9wKCk7Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaCgoaW50KShkMSAhPSBkMikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9HVDoKLSAgICAgICAgICAgIGQyID0gUG9wKCk7Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaCgoaW50KShkMSA+IGQyKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0dFOgotICAgICAgICAgICAgZDIgPSBQb3AoKTsKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKChpbnQpKGQxID49IGQyKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0xUOgotICAgICAgICAgICAgZDIgPSBQb3AoKTsKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKChpbnQpKGQxIDwgZDIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfTEU6Ci0gICAgICAgICAgICBkMiA9IFBvcCgpOwotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goKGludCkoZDEgPD0gZDIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfQU5EOgotICAgICAgICAgICAgaTEgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgaTIgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgUHVzaChpMSAmIGkyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfT1I6Ci0gICAgICAgICAgICBpMSA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICBpMiA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKGkxIHwgaTIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9YT1I6Ci0gICAgICAgICAgICBpMSA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICBpMiA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKGkxIF4gaTIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9OT1Q6Ci0gICAgICAgICAgICBpMSA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKChpbnQpIWkxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfQklUU0hJRlQ6IHsKLSAgICAgICAgICAgICAgICBpbnQgc2hpZnQgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgICAgIGludCBpID0gKGludClQb3AoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB1c2goaSA8PCBzaGlmdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgUHVzaChpID4+IC1zaGlmdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBTT1BfVFJVRToKLSAgICAgICAgICAgIFB1c2goMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0ZBTFNFOgotICAgICAgICAgICAgUHVzaCgwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfUE9QOgotICAgICAgICAgICAgUG9wKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0VYQ0g6Ci0gICAgICAgICAgICBkMiA9IFBvcCgpOwotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goZDIpOwotICAgICAgICAgICAgUHVzaChkMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0RVUDoKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKGQxKTsKLSAgICAgICAgICAgIFB1c2goZDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9DT1BZOiB7Ci0gICAgICAgICAgICAgICAgaW50IG4gPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgICAgIGlmIChuIDwgMCB8fCBuID4gUFNFTkdJTkVfU1RBQ0tTSVpFIHx8IG1fU3RhY2tDb3VudCArIG4gPiBQU0VOR0lORV9TVEFDS1NJWkUgfHwgbiA+IG1fU3RhY2tDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fU3RhY2tbbV9TdGFja0NvdW50ICsgaV0gPSBtX1N0YWNrW21fU3RhY2tDb3VudCArIGkgLSBuXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9TdGFja0NvdW50ICs9IG47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUFNPUF9JTkRFWDogewotICAgICAgICAgICAgICAgIGludCBuID0gKGludClQb3AoKTsKLSAgICAgICAgICAgICAgICBpZiAobiA8IDAgfHwgbiA+PSBtX1N0YWNrQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB1c2gobV9TdGFja1ttX1N0YWNrQ291bnQgLSBuIC0gMV0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBTT1BfUk9MTDogewotICAgICAgICAgICAgICAgIGludCBqID0gKGludClQb3AoKTsKLSAgICAgICAgICAgICAgICBpbnQgbiA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1fU3RhY2tDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobiA8IDAgfHwgbiA+IG1fU3RhY2tDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGogPCAwKQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IC1qOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmaXJzdCA9IG1fU3RhY2tbbV9TdGFja0NvdW50IC0gbl07Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbiAtIDE7IGlpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TdGFja1ttX1N0YWNrQ291bnQgLSBuICsgaWldID0gbV9TdGFja1ttX1N0YWNrQ291bnQgLSBuICsgaWkgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fU3RhY2tbbV9TdGFja0NvdW50IC0gMV0gPSBmaXJzdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsYXN0ID0gbV9TdGFja1ttX1N0YWNrQ291bnQgLSAxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG4gLSAxOyBpaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3RhY2tbbV9TdGFja0NvdW50IC0gaWkgLSAxXSA9IG1fU3RhY2tbbV9TdGFja0NvdW50IC0gaWkgLSAyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fU3RhY2tbbV9TdGFja0NvdW50IC0gaWkgLSAxXSA9IGxhc3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOworRlhfQk9PTCBDUERGX1BTRW5naW5lOjpEb09wZXJhdG9yKFBERl9QU09QIG9wKSB7CisgIGludCBpMSwgaTI7CisgIEZYX0ZMT0FUIGQxLCBkMjsKKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUFNPUF9BREQ6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIFB1c2goZDEgKyBkMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfU1VCOgorICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKGQxIC0gZDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX01VTDoKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBkMiA9IFBvcCgpOworICAgICAgUHVzaChkMSAqIGQyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9ESVY6CisgICAgICBkMiA9IFBvcCgpOworICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goZDEgLyBkMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfSURJVjoKKyAgICAgIGkyID0gKGludClQb3AoKTsKKyAgICAgIGkxID0gKGludClQb3AoKTsKKyAgICAgIFB1c2goaTEgLyBpMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTU9EOgorICAgICAgaTIgPSAoaW50KVBvcCgpOworICAgICAgaTEgPSAoaW50KVBvcCgpOworICAgICAgUHVzaChpMSAlIGkyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9ORUc6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgtZDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0FCUzoKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19mYWJzKGQxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfQ0VJTElORzoKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19jZWlsKGQxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfRkxPT1I6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfZmxvb3IoZDEpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9ST1VORDoKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKEZYU1lTX3JvdW5kKGQxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfVFJVTkNBVEU6CisgICAgICBpMSA9IChpbnQpUG9wKCk7CisgICAgICBQdXNoKGkxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9TUVJUOgorICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX3NxcnQoZDEpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9TSU46CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfc2luKGQxICogUEkgLyAxODAuMGYpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9DT1M6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfY29zKGQxICogUEkgLyAxODAuMGYpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9BVEFOOgorICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBkMSA9IChGWF9GTE9BVCkoRlhTWVNfYXRhbjIoZDEsIGQyKSAqIDE4MC4wIC8gUEkpOworICAgICAgaWYgKGQxIDwgMCkgeworICAgICAgICBkMSArPSAzNjA7CisgICAgICB9CisgICAgICBQdXNoKGQxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9FWFA6CisgICAgICBkMiA9IFBvcCgpOworICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX3BvdyhkMSwgZDIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9MTjoKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19sb2coZDEpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9MT0c6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfbG9nMTAoZDEpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9DVkk6CisgICAgICBpMSA9IChpbnQpUG9wKCk7CisgICAgICBQdXNoKGkxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9DVlI6CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfRVE6CisgICAgICBkMiA9IFBvcCgpOworICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goKGludCkoZDEgPT0gZDIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9ORToKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoaW50KShkMSAhPSBkMikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0dUOgorICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKChpbnQpKGQxID4gZDIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9HRToKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoaW50KShkMSA+PSBkMikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0xUOgorICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKChpbnQpKGQxIDwgZDIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9MRToKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoaW50KShkMSA8PSBkMikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0FORDoKKyAgICAgIGkxID0gKGludClQb3AoKTsKKyAgICAgIGkyID0gKGludClQb3AoKTsKKyAgICAgIFB1c2goaTEgJiBpMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfT1I6CisgICAgICBpMSA9IChpbnQpUG9wKCk7CisgICAgICBpMiA9IChpbnQpUG9wKCk7CisgICAgICBQdXNoKGkxIHwgaTIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX1hPUjoKKyAgICAgIGkxID0gKGludClQb3AoKTsKKyAgICAgIGkyID0gKGludClQb3AoKTsKKyAgICAgIFB1c2goaTEgXiBpMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTk9UOgorICAgICAgaTEgPSAoaW50KVBvcCgpOworICAgICAgUHVzaCgoaW50KSFpMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfQklUU0hJRlQ6IHsKKyAgICAgIGludCBzaGlmdCA9IChpbnQpUG9wKCk7CisgICAgICBpbnQgaSA9IChpbnQpUG9wKCk7CisgICAgICBpZiAoc2hpZnQgPiAwKSB7CisgICAgICAgIFB1c2goaSA8PCBzaGlmdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBQdXNoKGkgPj4gLXNoaWZ0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLXN0YXRpYyBGWF9GTE9BVCBQREZfSW50ZXJwb2xhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeG1pbiwgRlhfRkxPQVQgeG1heCwgRlhfRkxPQVQgeW1pbiwgRlhfRkxPQVQgeW1heCkKLXsKLSAgICByZXR1cm4gKCh4IC0geG1pbikgKiAoeW1heCAtIHltaW4pIC8gKHhtYXggLSB4bWluKSkgKyB5bWluOwotfQotc3RhdGljIEZYX0RXT1JEIF9HZXRCaXRzMzIoY29uc3QgdWludDhfdCogcERhdGEsIGludCBiaXRwb3MsIGludCBuYml0cykKLXsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5iaXRzOyBpICsrKQotICAgICAgICBpZiAocERhdGFbKGJpdHBvcyArIGkpIC8gOF0gJiAoMSA8PCAoNyAtIChiaXRwb3MgKyBpKSAlIDgpKSkgewotICAgICAgICAgICAgcmVzdWx0IHw9IDEgPDwgKG5iaXRzIC0gaSAtIDEpOworICAgIGNhc2UgUFNPUF9UUlVFOgorICAgICAgUHVzaCgxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9GQUxTRToKKyAgICAgIFB1c2goMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfUE9QOgorICAgICAgUG9wKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfRVhDSDoKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChkMik7CisgICAgICBQdXNoKGQxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9EVVA6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChkMSk7CisgICAgICBQdXNoKGQxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9DT1BZOiB7CisgICAgICBpbnQgbiA9IChpbnQpUG9wKCk7CisgICAgICBpZiAobiA8IDAgfHwgbiA+IFBTRU5HSU5FX1NUQUNLU0laRSB8fAorICAgICAgICAgIG1fU3RhY2tDb3VudCArIG4gPiBQU0VOR0lORV9TVEFDS1NJWkUgfHwgbiA+IG1fU3RhY2tDb3VudCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIG1fU3RhY2tbbV9TdGFja0NvdW50ICsgaV0gPSBtX1N0YWNrW21fU3RhY2tDb3VudCArIGkgLSBuXTsKKyAgICAgIH0KKyAgICAgIG1fU3RhY2tDb3VudCArPSBuOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFNPUF9JTkRFWDogeworICAgICAgaW50IG4gPSAoaW50KVBvcCgpOworICAgICAgaWYgKG4gPCAwIHx8IG4gPj0gbV9TdGFja0NvdW50KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgUHVzaChtX1N0YWNrW21fU3RhY2tDb3VudCAtIG4gLSAxXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQU09QX1JPTEw6IHsKKyAgICAgIGludCBqID0gKGludClQb3AoKTsKKyAgICAgIGludCBuID0gKGludClQb3AoKTsKKyAgICAgIGlmIChtX1N0YWNrQ291bnQgPT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChuIDwgMCB8fCBuID4gbV9TdGFja0NvdW50KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGogPCAwKQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IC1qOyBpKyspIHsKKyAgICAgICAgICBGWF9GTE9BVCBmaXJzdCA9IG1fU3RhY2tbbV9TdGFja0NvdW50IC0gbl07CisgICAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG4gLSAxOyBpaSsrKSB7CisgICAgICAgICAgICBtX1N0YWNrW21fU3RhY2tDb3VudCAtIG4gKyBpaV0gPSBtX1N0YWNrW21fU3RhY2tDb3VudCAtIG4gKyBpaSArIDFdOworICAgICAgICAgIH0KKyAgICAgICAgICBtX1N0YWNrW21fU3RhY2tDb3VudCAtIDFdID0gZmlyc3Q7CiAgICAgICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworICAgICAgZWxzZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGo7IGkrKykgeworICAgICAgICAgIEZYX0ZMT0FUIGxhc3QgPSBtX1N0YWNrW21fU3RhY2tDb3VudCAtIDFdOworICAgICAgICAgIGludCBpaTsKKyAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBuIC0gMTsgaWkrKykgeworICAgICAgICAgICAgbV9TdGFja1ttX1N0YWNrQ291bnQgLSBpaSAtIDFdID0gbV9TdGFja1ttX1N0YWNrQ291bnQgLSBpaSAtIDJdOworICAgICAgICAgIH0KKyAgICAgICAgICBtX1N0YWNrW21fU3RhY2tDb3VudCAtIGlpIC0gMV0gPSBsYXN0OworICAgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBUUlVFOworfQorc3RhdGljIEZYX0ZMT0FUIFBERl9JbnRlcnBvbGF0ZShGWF9GTE9BVCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4bWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4bWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5bWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5bWF4KSB7CisgIHJldHVybiAoKHggLSB4bWluKSAqICh5bWF4IC0geW1pbikgLyAoeG1heCAtIHhtaW4pKSArIHltaW47Cit9CitzdGF0aWMgRlhfRFdPUkQgX0dldEJpdHMzMihjb25zdCB1aW50OF90KiBwRGF0YSwgaW50IGJpdHBvcywgaW50IG5iaXRzKSB7CisgIGludCByZXN1bHQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG5iaXRzOyBpKyspCisgICAgaWYgKHBEYXRhWyhiaXRwb3MgKyBpKSAvIDhdICYgKDEgPDwgKDcgLSAoYml0cG9zICsgaSkgJSA4KSkpIHsKKyAgICAgIHJlc3VsdCB8PSAxIDw8IChuYml0cyAtIGkgLSAxKTsKKyAgICB9CisgIHJldHVybiByZXN1bHQ7CiB9CiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgRlhfRkxPQVQJZW5jb2RlX21heCwgZW5jb2RlX21pbjsKLSAgICBpbnQJCQlzaXplczsKKyAgRlhfRkxPQVQgZW5jb2RlX21heCwgZW5jb2RlX21pbjsKKyAgaW50IHNpemVzOwogfSBTYW1wbGVFbmNvZGVJbmZvOwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEZYX0ZMT0FUCWRlY29kZV9tYXgsIGRlY29kZV9taW47Ci19IFNhbXBsZURlY29kZUluZm87Ci1jbGFzcyBDUERGX1NhbXBsZWRGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24KLXsKLXB1YmxpYzoKLSAgICBDUERGX1NhbXBsZWRGdW5jKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9TYW1wbGVkRnVuYygpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7Ci0gICAgU2FtcGxlRW5jb2RlSW5mbyoJbV9wRW5jb2RlSW5mbzsKLSAgICBTYW1wbGVEZWNvZGVJbmZvKgltX3BEZWNvZGVJbmZvOwotICAgIEZYX0RXT1JECW1fbkJpdHNQZXJTYW1wbGU7Ci0gICAgRlhfRFdPUkQJbV9TYW1wbGVNYXg7Ci0gICAgQ1BERl9TdHJlYW1BY2MqCW1fcFNhbXBsZVN0cmVhbTsKK3R5cGVkZWYgc3RydWN0IHsgRlhfRkxPQVQgZGVjb2RlX21heCwgZGVjb2RlX21pbjsgfSBTYW1wbGVEZWNvZGVJbmZvOworY2xhc3MgQ1BERl9TYW1wbGVkRnVuYyA6IHB1YmxpYyBDUERGX0Z1bmN0aW9uIHsKKyBwdWJsaWM6CisgIENQREZfU2FtcGxlZEZ1bmMoKTsKKyAgdmlydHVhbCB+Q1BERl9TYW1wbGVkRnVuYygpOworICB2aXJ0dWFsIEZYX0JPT0wgdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgdmlydHVhbCBGWF9CT09MIHZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CisgIFNhbXBsZUVuY29kZUluZm8qIG1fcEVuY29kZUluZm87CisgIFNhbXBsZURlY29kZUluZm8qIG1fcERlY29kZUluZm87CisgIEZYX0RXT1JEIG1fbkJpdHNQZXJTYW1wbGU7CisgIEZYX0RXT1JEIG1fU2FtcGxlTWF4OworICBDUERGX1N0cmVhbUFjYyogbV9wU2FtcGxlU3RyZWFtOwogfTsKLUNQREZfU2FtcGxlZEZ1bmM6OkNQREZfU2FtcGxlZEZ1bmMoKQotewotICAgIG1fcFNhbXBsZVN0cmVhbSA9IE5VTEw7Ci0gICAgbV9wRW5jb2RlSW5mbyA9IE5VTEw7Ci0gICAgbV9wRGVjb2RlSW5mbyA9IE5VTEw7CitDUERGX1NhbXBsZWRGdW5jOjpDUERGX1NhbXBsZWRGdW5jKCkgeworICBtX3BTYW1wbGVTdHJlYW0gPSBOVUxMOworICBtX3BFbmNvZGVJbmZvID0gTlVMTDsKKyAgbV9wRGVjb2RlSW5mbyA9IE5VTEw7CiB9Ci1DUERGX1NhbXBsZWRGdW5jOjp+Q1BERl9TYW1wbGVkRnVuYygpCi17Ci0gICAgZGVsZXRlIG1fcFNhbXBsZVN0cmVhbTsKLSAgICBpZiAobV9wRW5jb2RlSW5mbykgewotICAgICAgICBGWF9GcmVlKG1fcEVuY29kZUluZm8pOwotICAgIH0KLSAgICBpZiAobV9wRGVjb2RlSW5mbykgewotICAgICAgICBGWF9GcmVlKG1fcERlY29kZUluZm8pOwotICAgIH0KK0NQREZfU2FtcGxlZEZ1bmM6On5DUERGX1NhbXBsZWRGdW5jKCkgeworICBkZWxldGUgbV9wU2FtcGxlU3RyZWFtOworICBpZiAobV9wRW5jb2RlSW5mbykgeworICAgIEZYX0ZyZWUobV9wRW5jb2RlSW5mbyk7CisgIH0KKyAgaWYgKG1fcERlY29kZUluZm8pIHsKKyAgICBGWF9GcmVlKG1fcERlY29kZUluZm8pOworICB9CiB9Ci1GWF9CT09MIENQREZfU2FtcGxlZEZ1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGX1NhbXBsZWRGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgaWYgKHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwT2JqOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworICBDUERGX0FycmF5KiBwU2l6ZSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiU2l6ZSIpKTsKKyAgQ1BERl9BcnJheSogcEVuY29kZSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRW5jb2RlIikpOworICBDUERGX0FycmF5KiBwRGVjb2RlID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEZWNvZGUiKSk7CisgIG1fbkJpdHNQZXJTYW1wbGUgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlclNhbXBsZSIpKTsKKyAgaWYgKG1fbkJpdHNQZXJTYW1wbGUgPiAzMikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX1NhbXBsZU1heCA9IDB4ZmZmZmZmZmYgPj4gKDMyIC0gbV9uQml0c1BlclNhbXBsZSk7CisgIG1fcFNhbXBsZVN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbUFjYzsKKyAgbV9wU2FtcGxlU3RyZWFtLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgIG1fcEVuY29kZUluZm8gPSBGWF9BbGxvYyhTYW1wbGVFbmNvZGVJbmZvLCBtX25JbnB1dHMpOworICBGWF9TQUZFX0RXT1JEIG5Ub3RhbFNhbXBsZUJpdHMgPSAxOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0czsgaSsrKSB7CisgICAgbV9wRW5jb2RlSW5mb1tpXS5zaXplcyA9IHBTaXplID8gcFNpemUtPkdldEludGVnZXIoaSkgOiAwOworICAgIGlmICghcFNpemUgJiYgaSA9PSAwKSB7CisgICAgICBtX3BFbmNvZGVJbmZvW2ldLnNpemVzID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlNpemUiKSk7CiAgICAgfQotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwT2JqOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0gICAgQ1BERl9BcnJheSogcFNpemUgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlNpemUiKSk7Ci0gICAgQ1BERl9BcnJheSogcEVuY29kZSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRW5jb2RlIikpOwotICAgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRlY29kZSIpKTsKLSAgICBtX25CaXRzUGVyU2FtcGxlID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJTYW1wbGUiKSk7Ci0gICAgaWYgKG1fbkJpdHNQZXJTYW1wbGUgPiAzMikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgblRvdGFsU2FtcGxlQml0cyAqPSBtX3BFbmNvZGVJbmZvW2ldLnNpemVzOworICAgIGlmIChwRW5jb2RlKSB7CisgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9taW4gPSBwRW5jb2RlLT5HZXRGbG9hdChpICogMik7CisgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9tYXggPSBwRW5jb2RlLT5HZXRGbG9hdChpICogMiArIDEpOworICAgIH0gZWxzZSB7CisgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9taW4gPSAwOworICAgICAgaWYgKG1fcEVuY29kZUluZm9baV0uc2l6ZXMgPT0gMSkgeworICAgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9tYXggPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9wRW5jb2RlSW5mb1tpXS5lbmNvZGVfbWF4ID0gKEZYX0ZMT0FUKW1fcEVuY29kZUluZm9baV0uc2l6ZXMgLSAxOworICAgICAgfQogICAgIH0KLSAgICBtX1NhbXBsZU1heCA9IDB4ZmZmZmZmZmYgPj4gKDMyIC0gbV9uQml0c1BlclNhbXBsZSk7Ci0gICAgbV9wU2FtcGxlU3RyZWFtID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgIG1fcFNhbXBsZVN0cmVhbS0+TG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOwotICAgIG1fcEVuY29kZUluZm8gPSBGWF9BbGxvYyhTYW1wbGVFbmNvZGVJbmZvLCBtX25JbnB1dHMpOwotICAgIEZYX1NBRkVfRFdPUkQgblRvdGFsU2FtcGxlQml0cyA9IDE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkgKyspIHsKLSAgICAgICAgbV9wRW5jb2RlSW5mb1tpXS5zaXplcyA9IHBTaXplID8gcFNpemUtPkdldEludGVnZXIoaSkgOiAwOwotICAgICAgICBpZiAoIXBTaXplICYmIGkgPT0gMCkgewotICAgICAgICAgICAgbV9wRW5jb2RlSW5mb1tpXS5zaXplcyA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJTaXplIikpOwotICAgICAgICB9Ci0gICAgICAgIG5Ub3RhbFNhbXBsZUJpdHMgKj0gbV9wRW5jb2RlSW5mb1tpXS5zaXplczsKLSAgICAgICAgaWYgKHBFbmNvZGUpIHsKLSAgICAgICAgICAgIG1fcEVuY29kZUluZm9baV0uZW5jb2RlX21pbiA9IHBFbmNvZGUtPkdldEZsb2F0KGkgKiAyKTsKLSAgICAgICAgICAgIG1fcEVuY29kZUluZm9baV0uZW5jb2RlX21heCA9IHBFbmNvZGUtPkdldEZsb2F0KGkgKiAyICsgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9taW4gPSAwOwotICAgICAgICAgICAgaWYgKG1fcEVuY29kZUluZm9baV0uc2l6ZXMgPT0gMSkgewotICAgICAgICAgICAgICAgIG1fcEVuY29kZUluZm9baV0uZW5jb2RlX21heCA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fcEVuY29kZUluZm9baV0uZW5jb2RlX21heCA9IChGWF9GTE9BVCltX3BFbmNvZGVJbmZvW2ldLnNpemVzIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICB9CisgIG5Ub3RhbFNhbXBsZUJpdHMgKj0gbV9uQml0c1BlclNhbXBsZTsKKyAgblRvdGFsU2FtcGxlQml0cyAqPSBtX25PdXRwdXRzOworICBGWF9TQUZFX0RXT1JEIG5Ub3RhbFNhbXBsZUJ5dGVzID0gblRvdGFsU2FtcGxlQml0czsKKyAgblRvdGFsU2FtcGxlQnl0ZXMgKz0gNzsKKyAgblRvdGFsU2FtcGxlQnl0ZXMgLz0gODsKKyAgaWYgKCFuVG90YWxTYW1wbGVCeXRlcy5Jc1ZhbGlkKCkgfHwgblRvdGFsU2FtcGxlQnl0ZXMuVmFsdWVPckRpZSgpID09IDAgfHwKKyAgICAgIG5Ub3RhbFNhbXBsZUJ5dGVzLlZhbHVlT3JEaWUoKSA+IG1fcFNhbXBsZVN0cmVhbS0+R2V0U2l6ZSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcERlY29kZUluZm8gPSBGWF9BbGxvYyhTYW1wbGVEZWNvZGVJbmZvLCBtX25PdXRwdXRzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25PdXRwdXRzOyBpKyspIHsKKyAgICBpZiAocERlY29kZSkgeworICAgICAgbV9wRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWluID0gcERlY29kZS0+R2V0RmxvYXQoMiAqIGkpOworICAgICAgbV9wRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWF4ID0gcERlY29kZS0+R2V0RmxvYXQoMiAqIGkgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9wRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWluID0gbV9wUmFuZ2VzW2kgKiAyXTsKKyAgICAgIG1fcERlY29kZUluZm9baV0uZGVjb2RlX21heCA9IG1fcFJhbmdlc1tpICogMiArIDFdOwogICAgIH0KLSAgICBuVG90YWxTYW1wbGVCaXRzICo9IG1fbkJpdHNQZXJTYW1wbGU7Ci0gICAgblRvdGFsU2FtcGxlQml0cyAqPSBtX25PdXRwdXRzOwotICAgIEZYX1NBRkVfRFdPUkQgblRvdGFsU2FtcGxlQnl0ZXMgPSBuVG90YWxTYW1wbGVCaXRzOwotICAgIG5Ub3RhbFNhbXBsZUJ5dGVzICs9IDc7Ci0gICAgblRvdGFsU2FtcGxlQnl0ZXMgLz0gODsKLSAgICBpZiAoIW5Ub3RhbFNhbXBsZUJ5dGVzLklzVmFsaWQoKSB8fAotICAgICAgICBuVG90YWxTYW1wbGVCeXRlcy5WYWx1ZU9yRGllKCkgPT0gMCB8fAotICAgICAgICBuVG90YWxTYW1wbGVCeXRlcy5WYWx1ZU9yRGllKCkgPiBtX3BTYW1wbGVTdHJlYW0tPkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcERlY29kZUluZm8gPSBGWF9BbGxvYyhTYW1wbGVEZWNvZGVJbmZvLCBtX25PdXRwdXRzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkgKyspIHsKLSAgICAgICAgaWYgKHBEZWNvZGUpIHsKLSAgICAgICAgICAgIG1fcERlY29kZUluZm9baV0uZGVjb2RlX21pbiA9IHBEZWNvZGUtPkdldEZsb2F0KDIgKiBpKTsKLSAgICAgICAgICAgIG1fcERlY29kZUluZm9baV0uZGVjb2RlX21heCA9IHBEZWNvZGUtPkdldEZsb2F0KDIgKiBpICsgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BEZWNvZGVJbmZvW2ldLmRlY29kZV9taW4gPSBtX3BSYW5nZXNbaSAqIDJdOwotICAgICAgICAgICAgbV9wRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWF4ID0gbV9wUmFuZ2VzW2kgKiAyICsgMV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfU2FtcGxlZEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QKLXsKLSAgICBpbnQgcG9zID0gMDsKLSAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gZW5jb2RlZF9pbnB1dF9idWYobV9uSW5wdXRzKTsKLSAgICBGWF9GTE9BVCogZW5jb2RlZF9pbnB1dCA9IGVuY29kZWRfaW5wdXRfYnVmOwotICAgIENGWF9GaXhlZEJ1Zkdyb3c8aW50LCAzMj4gaW50X2J1ZihtX25JbnB1dHMgKiAyKTsKLSAgICBpbnQqIGluZGV4ID0gaW50X2J1ZjsKLSAgICBpbnQqIGJsb2Nrc2l6ZSA9IGluZGV4ICsgbV9uSW5wdXRzOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpICsrKSB7Ci0gICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgIGJsb2Nrc2l6ZVtpXSA9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBibG9ja3NpemVbaV0gPSBibG9ja3NpemVbaSAtIDFdICogbV9wRW5jb2RlSW5mb1tpIC0gMV0uc2l6ZXM7CitGWF9CT09MIENQREZfU2FtcGxlZEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QgeworICBpbnQgcG9zID0gMDsKKyAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IGVuY29kZWRfaW5wdXRfYnVmKG1fbklucHV0cyk7CisgIEZYX0ZMT0FUKiBlbmNvZGVkX2lucHV0ID0gZW5jb2RlZF9pbnB1dF9idWY7CisgIENGWF9GaXhlZEJ1Zkdyb3c8aW50LCAzMj4gaW50X2J1ZihtX25JbnB1dHMgKiAyKTsKKyAgaW50KiBpbmRleCA9IGludF9idWY7CisgIGludCogYmxvY2tzaXplID0gaW5kZXggKyBtX25JbnB1dHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpKyspIHsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICBibG9ja3NpemVbaV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICBibG9ja3NpemVbaV0gPSBibG9ja3NpemVbaSAtIDFdICogbV9wRW5jb2RlSW5mb1tpIC0gMV0uc2l6ZXM7CisgICAgfQorICAgIGVuY29kZWRfaW5wdXRbaV0gPSBQREZfSW50ZXJwb2xhdGUoCisgICAgICAgIGlucHV0c1tpXSwgbV9wRG9tYWluc1tpICogMl0sIG1fcERvbWFpbnNbaSAqIDIgKyAxXSwKKyAgICAgICAgbV9wRW5jb2RlSW5mb1tpXS5lbmNvZGVfbWluLCBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9tYXgpOworICAgIGluZGV4W2ldID0gKGludCllbmNvZGVkX2lucHV0W2ldOworICAgIGlmIChpbmRleFtpXSA8IDApIHsKKyAgICAgIGluZGV4W2ldID0gMDsKKyAgICB9IGVsc2UgaWYgKGluZGV4W2ldID4gbV9wRW5jb2RlSW5mb1tpXS5zaXplcyAtIDEpIHsKKyAgICAgIGluZGV4W2ldID0gbV9wRW5jb2RlSW5mb1tpXS5zaXplcyAtIDE7CisgICAgfQorICAgIHBvcyArPSBpbmRleFtpXSAqIGJsb2Nrc2l6ZVtpXTsKKyAgfQorICBGWF9TQUZFX0lOVDMyIGJpdHNfdG9fb3V0cHV0ID0gbV9uT3V0cHV0czsKKyAgYml0c190b19vdXRwdXQgKj0gbV9uQml0c1BlclNhbXBsZTsKKyAgaWYgKCFiaXRzX3RvX291dHB1dC5Jc1ZhbGlkKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfU0FGRV9JTlQzMiBiaXRwb3MgPSBwb3M7CisgIGJpdHBvcyAqPSBiaXRzX3RvX291dHB1dC5WYWx1ZU9yRGllKCk7CisgIGlmICghYml0cG9zLklzVmFsaWQoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9TQUZFX0lOVDMyIHJhbmdlX2NoZWNrID0gYml0cG9zOworICByYW5nZV9jaGVjayArPSBiaXRzX3RvX291dHB1dC5WYWx1ZU9yRGllKCk7CisgIGlmICghcmFuZ2VfY2hlY2suSXNWYWxpZCgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IHVpbnQ4X3QqIHBTYW1wbGVEYXRhID0gbV9wU2FtcGxlU3RyZWFtLT5HZXREYXRhKCk7CisgIGlmICghcFNhbXBsZURhdGEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpbnQgaiA9IDA7IGogPCBtX25PdXRwdXRzOyBqKyspIHsKKyAgICBGWF9EV09SRCBzYW1wbGUgPQorICAgICAgICBfR2V0Qml0czMyKHBTYW1wbGVEYXRhLCBiaXRwb3MuVmFsdWVPckRpZSgpICsgaiAqIG1fbkJpdHNQZXJTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgbV9uQml0c1BlclNhbXBsZSk7CisgICAgRlhfRkxPQVQgZW5jb2RlZCA9IChGWF9GTE9BVClzYW1wbGU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkrKykgeworICAgICAgaWYgKGluZGV4W2ldID09IG1fcEVuY29kZUluZm9baV0uc2l6ZXMgLSAxKSB7CisgICAgICAgIGlmIChpbmRleFtpXSA9PSAwKSB7CisgICAgICAgICAgZW5jb2RlZCA9IGVuY29kZWRfaW5wdXRbaV0gKiAoRlhfRkxPQVQpc2FtcGxlOwogICAgICAgICB9Ci0gICAgICAgIGVuY29kZWRfaW5wdXRbaV0gPSBQREZfSW50ZXJwb2xhdGUoaW5wdXRzW2ldLCBtX3BEb21haW5zW2kgKiAyXSwgbV9wRG9tYWluc1tpICogMiArIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEVuY29kZUluZm9baV0uZW5jb2RlX21pbiwgbV9wRW5jb2RlSW5mb1tpXS5lbmNvZGVfbWF4KTsKLSAgICAgICAgaW5kZXhbaV0gPSAoaW50KWVuY29kZWRfaW5wdXRbaV07Ci0gICAgICAgIGlmIChpbmRleFtpXSA8IDApIHsKLSAgICAgICAgICAgIGluZGV4W2ldID0gMDsKLSAgICAgICAgfSBlbHNlIGlmIChpbmRleFtpXSA+IG1fcEVuY29kZUluZm9baV0uc2l6ZXMgLSAxKSB7Ci0gICAgICAgICAgICBpbmRleFtpXSA9IG1fcEVuY29kZUluZm9baV0uc2l6ZXMgLSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRlhfU0FGRV9JTlQzMiBiaXRwb3MyID0gYmxvY2tzaXplW2ldOworICAgICAgICBiaXRwb3MyICs9IHBvczsKKyAgICAgICAgYml0cG9zMiAqPSBtX25PdXRwdXRzOworICAgICAgICBiaXRwb3MyICs9IGo7CisgICAgICAgIGJpdHBvczIgKj0gbV9uQml0c1BlclNhbXBsZTsKKyAgICAgICAgaWYgKCFiaXRwb3MyLklzVmFsaWQoKSkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQotICAgICAgICBwb3MgKz0gaW5kZXhbaV0gKiBibG9ja3NpemVbaV07CisgICAgICAgIEZYX0RXT1JEIHNhbXBsZTEgPQorICAgICAgICAgICAgX0dldEJpdHMzMihwU2FtcGxlRGF0YSwgYml0cG9zMi5WYWx1ZU9yRGllKCksIG1fbkJpdHNQZXJTYW1wbGUpOworICAgICAgICBlbmNvZGVkICs9IChlbmNvZGVkX2lucHV0W2ldIC0gaW5kZXhbaV0pICoKKyAgICAgICAgICAgICAgICAgICAoKEZYX0ZMT0FUKXNhbXBsZTEgLSAoRlhfRkxPQVQpc2FtcGxlKTsKKyAgICAgIH0KICAgICB9Ci0gICAgRlhfU0FGRV9JTlQzMiBiaXRzX3RvX291dHB1dCA9IG1fbk91dHB1dHM7Ci0gICAgYml0c190b19vdXRwdXQgKj0gbV9uQml0c1BlclNhbXBsZTsKLSAgICBpZiAoIWJpdHNfdG9fb3V0cHV0LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX1NBRkVfSU5UMzIgYml0cG9zID0gcG9zOwotICAgIGJpdHBvcyAqPSBiaXRzX3RvX291dHB1dC5WYWx1ZU9yRGllKCk7Ci0gICAgaWYgKCFiaXRwb3MuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfU0FGRV9JTlQzMiByYW5nZV9jaGVjayA9IGJpdHBvczsKLSAgICByYW5nZV9jaGVjayArPSBiaXRzX3RvX291dHB1dC5WYWx1ZU9yRGllKCk7Ci0gICAgaWYgKCFyYW5nZV9jaGVjay5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBjb25zdCB1aW50OF90KiBwU2FtcGxlRGF0YSA9IG1fcFNhbXBsZVN0cmVhbS0+R2V0RGF0YSgpOwotICAgIGlmICghcFNhbXBsZURhdGEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fbk91dHB1dHM7IGogKyspIHsKLSAgICAgICAgRlhfRFdPUkQgc2FtcGxlID0gX0dldEJpdHMzMihwU2FtcGxlRGF0YSwgYml0cG9zLlZhbHVlT3JEaWUoKSArIGogKiBtX25CaXRzUGVyU2FtcGxlLCBtX25CaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgRlhfRkxPQVQgZW5jb2RlZCA9IChGWF9GTE9BVClzYW1wbGU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAoaW5kZXhbaV0gPT0gbV9wRW5jb2RlSW5mb1tpXS5zaXplcyAtIDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXhbaV0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkID0gZW5jb2RlZF9pbnB1dFtpXSAqIChGWF9GTE9BVClzYW1wbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGWF9TQUZFX0lOVDMyIGJpdHBvczIgPSBibG9ja3NpemVbaV07Ci0gICAgICAgICAgICAgICAgYml0cG9zMiArPSBwb3M7Ci0gICAgICAgICAgICAgICAgYml0cG9zMiAqPSBtX25PdXRwdXRzOwotICAgICAgICAgICAgICAgIGJpdHBvczIgKz0gajsKLSAgICAgICAgICAgICAgICBiaXRwb3MyICo9IG1fbkJpdHNQZXJTYW1wbGU7Ci0gICAgICAgICAgICAgICAgaWYgKCFiaXRwb3MyLklzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNhbXBsZTEgPSBfR2V0Qml0czMyKHBTYW1wbGVEYXRhLCBiaXRwb3MyLlZhbHVlT3JEaWUoKSwgbV9uQml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZCArPSAoZW5jb2RlZF9pbnB1dFtpXSAtIGluZGV4W2ldKSAqICgoRlhfRkxPQVQpc2FtcGxlMSAtIChGWF9GTE9BVClzYW1wbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdHNbal0gPSBQREZfSW50ZXJwb2xhdGUoZW5jb2RlZCwgMCwgKEZYX0ZMT0FUKW1fU2FtcGxlTWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERlY29kZUluZm9bal0uZGVjb2RlX21pbiwgbV9wRGVjb2RlSW5mb1tqXS5kZWNvZGVfbWF4KTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmVzdWx0c1tqXSA9IFBERl9JbnRlcnBvbGF0ZShlbmNvZGVkLCAwLCAoRlhfRkxPQVQpbV9TYW1wbGVNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZWNvZGVJbmZvW2pdLmRlY29kZV9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZWNvZGVJbmZvW2pdLmRlY29kZV9tYXgpOworICB9CisgIHJldHVybiBUUlVFOwogfQotY2xhc3MgQ1BERl9QU0Z1bmMgOiBwdWJsaWMgQ1BERl9GdW5jdGlvbgotewotcHVibGljOgotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7Ci0gICAgQ1BERl9QU0VuZ2luZSBtX1BTOworY2xhc3MgQ1BERl9QU0Z1bmMgOiBwdWJsaWMgQ1BERl9GdW5jdGlvbiB7CisgcHVibGljOgorICB2aXJ0dWFsIEZYX0JPT0wgdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgdmlydHVhbCBGWF9CT09MIHZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CisgIENQREZfUFNFbmdpbmUgbV9QUzsKIH07Ci1GWF9CT09MIENQREZfUFNGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopCi17Ci0gICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBPYmo7Ci0gICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7Ci0gICAgcmV0dXJuIG1fUFMuUGFyc2UoKGNvbnN0IEZYX0NIQVIqKWFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOworRlhfQk9PTCBDUERGX1BTRnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSB7CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwT2JqOworICBDUERGX1N0cmVhbUFjYyBhY2M7CisgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgIHJldHVybiBtX1BTLlBhcnNlKChjb25zdCBGWF9DSEFSKilhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKIH0KLUZYX0JPT0wgQ1BERl9QU0Z1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QKLXsKLSAgICBDUERGX1BTRW5naW5lJiBQUyA9IChDUERGX1BTRW5naW5lJiltX1BTOwotICAgIFBTLlJlc2V0KCk7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fbklucHV0czsgaSArKykgewotICAgICAgICBQUy5QdXNoKGlucHV0c1tpXSk7Ci0gICAgfQotICAgIFBTLkV4ZWN1dGUoKTsKLSAgICBpZiAoUFMuR2V0U3RhY2tTaXplKCkgPCBtX25PdXRwdXRzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkgKyspIHsKLSAgICAgICAgcmVzdWx0c1ttX25PdXRwdXRzIC0gaSAtIDFdID0gUFMuUG9wKCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBDUERGX1BTRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdCB7CisgIENQREZfUFNFbmdpbmUmIFBTID0gKENQREZfUFNFbmdpbmUmKW1fUFM7CisgIFBTLlJlc2V0KCk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpKyspIHsKKyAgICBQUy5QdXNoKGlucHV0c1tpXSk7CisgIH0KKyAgUFMuRXhlY3V0ZSgpOworICBpZiAoUFMuR2V0U3RhY2tTaXplKCkgPCBtX25PdXRwdXRzKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBtX25PdXRwdXRzOyBpKyspIHsKKyAgICByZXN1bHRzW21fbk91dHB1dHMgLSBpIC0gMV0gPSBQUy5Qb3AoKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLWNsYXNzIENQREZfRXhwSW50RnVuYyA6IHB1YmxpYyBDUERGX0Z1bmN0aW9uCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9FeHBJbnRGdW5jKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9FeHBJbnRGdW5jKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdDsKLSAgICBGWF9GTE9BVAltX0V4cG9uZW50OwotICAgIEZYX0ZMT0FUKgltX3BCZWdpblZhbHVlczsKLSAgICBGWF9GTE9BVCoJbV9wRW5kVmFsdWVzOwotICAgIGludAkJbV9uT3JpZ091dHB1dHM7CitjbGFzcyBDUERGX0V4cEludEZ1bmMgOiBwdWJsaWMgQ1BERl9GdW5jdGlvbiB7CisgcHVibGljOgorICBDUERGX0V4cEludEZ1bmMoKTsKKyAgdmlydHVhbCB+Q1BERl9FeHBJbnRGdW5jKCk7CisgIHZpcnR1YWwgRlhfQk9PTCB2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopOworICB2aXJ0dWFsIEZYX0JPT0wgdl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdDsKKyAgRlhfRkxPQVQgbV9FeHBvbmVudDsKKyAgRlhfRkxPQVQqIG1fcEJlZ2luVmFsdWVzOworICBGWF9GTE9BVCogbV9wRW5kVmFsdWVzOworICBpbnQgbV9uT3JpZ091dHB1dHM7CiB9OwotQ1BERl9FeHBJbnRGdW5jOjpDUERGX0V4cEludEZ1bmMoKQotewotICAgIG1fcEJlZ2luVmFsdWVzID0gTlVMTDsKLSAgICBtX3BFbmRWYWx1ZXMgPSBOVUxMOworQ1BERl9FeHBJbnRGdW5jOjpDUERGX0V4cEludEZ1bmMoKSB7CisgIG1fcEJlZ2luVmFsdWVzID0gTlVMTDsKKyAgbV9wRW5kVmFsdWVzID0gTlVMTDsKIH0KLUNQREZfRXhwSW50RnVuYzo6fkNQREZfRXhwSW50RnVuYygpCi17Ci0gICAgaWYgKG1fcEJlZ2luVmFsdWVzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQmVnaW5WYWx1ZXMpOwotICAgIH0KLSAgICBpZiAobV9wRW5kVmFsdWVzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRW5kVmFsdWVzKTsKLSAgICB9CitDUERGX0V4cEludEZ1bmM6On5DUERGX0V4cEludEZ1bmMoKSB7CisgIGlmIChtX3BCZWdpblZhbHVlcykgeworICAgIEZYX0ZyZWUobV9wQmVnaW5WYWx1ZXMpOworICB9CisgIGlmIChtX3BFbmRWYWx1ZXMpIHsKKyAgICBGWF9GcmVlKG1fcEVuZFZhbHVlcyk7CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9FeHBJbnRGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBPYmotPkdldERpY3QoKTsKLSAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZfRXhwSW50RnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7CisgIGlmIChwRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfQXJyYXkqIHBBcnJheTAgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkMwIikpOworICBpZiAobV9uT3V0cHV0cyA9PSAwKSB7CisgICAgbV9uT3V0cHV0cyA9IDE7CisgICAgaWYgKHBBcnJheTApIHsKKyAgICAgIG1fbk91dHB1dHMgPSBwQXJyYXkwLT5HZXRDb3VudCgpOwogICAgIH0KLSAgICBDUERGX0FycmF5KiBwQXJyYXkwID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJDMCIpKTsKLSAgICBpZiAobV9uT3V0cHV0cyA9PSAwKSB7Ci0gICAgICAgIG1fbk91dHB1dHMgPSAxOwotICAgICAgICBpZiAocEFycmF5MCkgewotICAgICAgICAgICAgbV9uT3V0cHV0cyA9IHBBcnJheTAtPkdldENvdW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5MSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQzEiKSk7Ci0gICAgbV9wQmVnaW5WYWx1ZXMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25PdXRwdXRzLCAyKTsKLSAgICBtX3BFbmRWYWx1ZXMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25PdXRwdXRzLCAyKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkgKyspIHsKLSAgICAgICAgbV9wQmVnaW5WYWx1ZXNbaV0gPSBwQXJyYXkwID8gcEFycmF5MC0+R2V0RmxvYXQoaSkgOiAwLjBmOwotICAgICAgICBtX3BFbmRWYWx1ZXNbaV0gPSBwQXJyYXkxID8gcEFycmF5MS0+R2V0RmxvYXQoaSkgOiAxLjBmOwotICAgIH0KLSAgICBtX0V4cG9uZW50ID0gcERpY3QtPkdldEZsb2F0KEZYX0JTVFJDKCJOIikpOwotICAgIG1fbk9yaWdPdXRwdXRzID0gbV9uT3V0cHV0czsKLSAgICBpZiAobV9uT3V0cHV0cyAmJiBtX25JbnB1dHMgPiBJTlRfTUFYIC8gbV9uT3V0cHV0cykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fbk91dHB1dHMgKj0gbV9uSW5wdXRzOwotICAgIHJldHVybiBUUlVFOworICB9CisgIENQREZfQXJyYXkqIHBBcnJheTEgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkMxIikpOworICBtX3BCZWdpblZhbHVlcyA9IEZYX0FsbG9jMkQoRlhfRkxPQVQsIG1fbk91dHB1dHMsIDIpOworICBtX3BFbmRWYWx1ZXMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25PdXRwdXRzLCAyKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25PdXRwdXRzOyBpKyspIHsKKyAgICBtX3BCZWdpblZhbHVlc1tpXSA9IHBBcnJheTAgPyBwQXJyYXkwLT5HZXRGbG9hdChpKSA6IDAuMGY7CisgICAgbV9wRW5kVmFsdWVzW2ldID0gcEFycmF5MSA/IHBBcnJheTEtPkdldEZsb2F0KGkpIDogMS4wZjsKKyAgfQorICBtX0V4cG9uZW50ID0gcERpY3QtPkdldEZsb2F0KEZYX0JTVFJDKCJOIikpOworICBtX25PcmlnT3V0cHV0cyA9IG1fbk91dHB1dHM7CisgIGlmIChtX25PdXRwdXRzICYmIG1fbklucHV0cyA+IElOVF9NQVggLyBtX25PdXRwdXRzKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fbk91dHB1dHMgKj0gbV9uSW5wdXRzOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9FeHBJbnRGdW5jOjp2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0Ci17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkgKyspCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbV9uT3JpZ091dHB1dHM7IGogKyspIHsKLSAgICAgICAgICAgIHJlc3VsdHNbaSAqIG1fbk9yaWdPdXRwdXRzICsgal0gPSBtX3BCZWdpblZhbHVlc1tqXSArIChGWF9GTE9BVClGWFNZU19wb3coaW5wdXRzW2ldLCBtX0V4cG9uZW50KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcEVuZFZhbHVlc1tqXSAtIG1fcEJlZ2luVmFsdWVzW2pdKTsKLSAgICAgICAgfQotICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBDUERGX0V4cEludEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0czsgaSsrKQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgbV9uT3JpZ091dHB1dHM7IGorKykgeworICAgICAgcmVzdWx0c1tpICogbV9uT3JpZ091dHB1dHMgKyBqXSA9CisgICAgICAgICAgbV9wQmVnaW5WYWx1ZXNbal0gKworICAgICAgICAgIChGWF9GTE9BVClGWFNZU19wb3coaW5wdXRzW2ldLCBtX0V4cG9uZW50KSAqCisgICAgICAgICAgICAgIChtX3BFbmRWYWx1ZXNbal0gLSBtX3BCZWdpblZhbHVlc1tqXSk7CisgICAgfQorICByZXR1cm4gVFJVRTsKIH0KLWNsYXNzIENQREZfU3RpdGNoRnVuYyA6IHB1YmxpYyBDUERGX0Z1bmN0aW9uCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9TdGl0Y2hGdW5jKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9TdGl0Y2hGdW5jKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdDsKLSAgICBpbnQJCQltX25TdWJzOwotICAgIENQREZfRnVuY3Rpb24qKiBtX3BTdWJGdW5jdGlvbnM7Ci0gICAgRlhfRkxPQVQqCW1fcEJvdW5kczsKLSAgICBGWF9GTE9BVCoJbV9wRW5jb2RlOworY2xhc3MgQ1BERl9TdGl0Y2hGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24geworIHB1YmxpYzoKKyAgQ1BERl9TdGl0Y2hGdW5jKCk7CisgIHZpcnR1YWwgfkNQREZfU3RpdGNoRnVuYygpOworICB2aXJ0dWFsIEZYX0JPT0wgdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgdmlydHVhbCBGWF9CT09MIHZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7CisgIGludCBtX25TdWJzOworICBDUERGX0Z1bmN0aW9uKiogbV9wU3ViRnVuY3Rpb25zOworICBGWF9GTE9BVCogbV9wQm91bmRzOworICBGWF9GTE9BVCogbV9wRW5jb2RlOwogfTsKLUNQREZfU3RpdGNoRnVuYzo6Q1BERl9TdGl0Y2hGdW5jKCkKLXsKLSAgICBtX25TdWJzID0gMDsKLSAgICBtX3BTdWJGdW5jdGlvbnMgPSBOVUxMOwotICAgIG1fcEJvdW5kcyA9IE5VTEw7Ci0gICAgbV9wRW5jb2RlID0gTlVMTDsKK0NQREZfU3RpdGNoRnVuYzo6Q1BERl9TdGl0Y2hGdW5jKCkgeworICBtX25TdWJzID0gMDsKKyAgbV9wU3ViRnVuY3Rpb25zID0gTlVMTDsKKyAgbV9wQm91bmRzID0gTlVMTDsKKyAgbV9wRW5jb2RlID0gTlVMTDsKIH0KLUNQREZfU3RpdGNoRnVuYzo6fkNQREZfU3RpdGNoRnVuYygpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25TdWJzOyBpICsrKQotICAgICAgICBkZWxldGUgbV9wU3ViRnVuY3Rpb25zW2ldOwotICAgIGlmIChtX3BTdWJGdW5jdGlvbnMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTdWJGdW5jdGlvbnMpOwotICAgIH0KLSAgICBpZiAobV9wQm91bmRzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQm91bmRzKTsKLSAgICB9Ci0gICAgaWYgKG1fcEVuY29kZSkgewotICAgICAgICBGWF9GcmVlKG1fcEVuY29kZSk7Ci0gICAgfQorQ1BERl9TdGl0Y2hGdW5jOjp+Q1BERl9TdGl0Y2hGdW5jKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1fblN1YnM7IGkrKykKKyAgICBkZWxldGUgbV9wU3ViRnVuY3Rpb25zW2ldOworICBpZiAobV9wU3ViRnVuY3Rpb25zKSB7CisgICAgRlhfRnJlZShtX3BTdWJGdW5jdGlvbnMpOworICB9CisgIGlmIChtX3BCb3VuZHMpIHsKKyAgICBGWF9GcmVlKG1fcEJvdW5kcyk7CisgIH0KKyAgaWYgKG1fcEVuY29kZSkgeworICAgIEZYX0ZyZWUobV9wRW5jb2RlKTsKKyAgfQogfQotRlhfQk9PTCBDUERGX1N0aXRjaEZ1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOwotICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9TdGl0Y2hGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBPYmotPkdldERpY3QoKTsKKyAgaWYgKHBEaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJGdW5jdGlvbnMiKSk7CisgIGlmIChwQXJyYXkgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX25TdWJzID0gcEFycmF5LT5HZXRDb3VudCgpOworICBpZiAobV9uU3VicyA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcFN1YkZ1bmN0aW9ucyA9IEZYX0FsbG9jKENQREZfRnVuY3Rpb24qLCBtX25TdWJzKTsKKyAgbV9uT3V0cHV0cyA9IDA7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbV9uU3ViczsgaSsrKSB7CisgICAgQ1BERl9PYmplY3QqIHBTdWIgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKKyAgICBpZiAocFN1YiA9PSBwT2JqKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRnVuY3Rpb25zIikpOwotICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fblN1YnMgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgaWYgKG1fblN1YnMgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcFN1YkZ1bmN0aW9ucyA9IEZYX0FsbG9jKENQREZfRnVuY3Rpb24qLCBtX25TdWJzKTsKLSAgICBtX25PdXRwdXRzID0gMDsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9uU3ViczsgaSArKykgewotICAgICAgICBDUERGX09iamVjdCogcFN1YiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOwotICAgICAgICBpZiAocFN1YiA9PSBwT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wU3ViRnVuY3Rpb25zW2ldID0gQ1BERl9GdW5jdGlvbjo6TG9hZChwU3ViKTsKLSAgICAgICAgaWYgKG1fcFN1YkZ1bmN0aW9uc1tpXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFN1YkZ1bmN0aW9uc1tpXS0+Q291bnRPdXRwdXRzKCkgPiBtX25PdXRwdXRzKSB7Ci0gICAgICAgICAgICBtX25PdXRwdXRzID0gbV9wU3ViRnVuY3Rpb25zW2ldLT5Db3VudE91dHB1dHMoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX3BCb3VuZHMgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbV9uU3VicyArIDEpOwotICAgIG1fcEJvdW5kc1swXSA9IG1fcERvbWFpbnNbMF07Ci0gICAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJCb3VuZHMiKSk7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fblN1YnMgLSAxOyBpICsrKSB7Ci0gICAgICAgIG1fcEJvdW5kc1tpICsgMV0gPSBwQXJyYXktPkdldEZsb2F0KGkpOwotICAgIH0KLSAgICBtX3BCb3VuZHNbbV9uU3Vic10gPSBtX3BEb21haW5zWzFdOwotICAgIG1fcEVuY29kZSA9IEZYX0FsbG9jMkQoRlhfRkxPQVQsIG1fblN1YnMsIDIpOwotICAgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRW5jb2RlIikpOwotICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBtX25TdWJzICogMjsgaSArKykgewotICAgICAgICBtX3BFbmNvZGVbaV0gPSBwQXJyYXktPkdldEZsb2F0KGkpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9TdGl0Y2hGdW5jOjp2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIG91dHB1dHMpIGNvbnN0Ci17Ci0gICAgRlhfRkxPQVQgaW5wdXQgPSBpbnB1dHNbMF07Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fblN1YnMgLSAxOyBpICsrKQotICAgICAgICBpZiAoaW5wdXQgPCBtX3BCb3VuZHNbaSArIDFdKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgIG1fcFN1YkZ1bmN0aW9uc1tpXSA9IENQREZfRnVuY3Rpb246OkxvYWQocFN1Yik7CiAgICAgaWYgKG1fcFN1YkZ1bmN0aW9uc1tpXSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaW5wdXQgPSBQREZfSW50ZXJwb2xhdGUoaW5wdXQsIG1fcEJvdW5kc1tpXSwgbV9wQm91bmRzW2kgKyAxXSwgbV9wRW5jb2RlW2kgKiAyXSwgbV9wRW5jb2RlW2kgKiAyICsgMV0pOwotICAgIGludCBucmVzdWx0czsKLSAgICBtX3BTdWJGdW5jdGlvbnNbaV0tPkNhbGwoJmlucHV0LCBtX25JbnB1dHMsIG91dHB1dHMsIG5yZXN1bHRzKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBpZiAobV9wU3ViRnVuY3Rpb25zW2ldLT5Db3VudE91dHB1dHMoKSA+IG1fbk91dHB1dHMpIHsKKyAgICAgIG1fbk91dHB1dHMgPSBtX3BTdWJGdW5jdGlvbnNbaV0tPkNvdW50T3V0cHV0cygpOworICAgIH0KKyAgfQorICBtX3BCb3VuZHMgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbV9uU3VicyArIDEpOworICBtX3BCb3VuZHNbMF0gPSBtX3BEb21haW5zWzBdOworICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkJvdW5kcyIpKTsKKyAgaWYgKHBBcnJheSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBtX25TdWJzIC0gMTsgaSsrKSB7CisgICAgbV9wQm91bmRzW2kgKyAxXSA9IHBBcnJheS0+R2V0RmxvYXQoaSk7CisgIH0KKyAgbV9wQm91bmRzW21fblN1YnNdID0gbV9wRG9tYWluc1sxXTsKKyAgbV9wRW5jb2RlID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uU3VicywgMik7CisgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRW5jb2RlIikpOworICBpZiAocEFycmF5ID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG1fblN1YnMgKiAyOyBpKyspIHsKKyAgICBtX3BFbmNvZGVbaV0gPSBwQXJyYXktPkdldEZsb2F0KGkpOworICB9CisgIHJldHVybiBUUlVFOwogfQotQ1BERl9GdW5jdGlvbiogQ1BERl9GdW5jdGlvbjo6TG9hZChDUERGX09iamVjdCogcEZ1bmNPYmopCi17Ci0gICAgaWYgKHBGdW5jT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitGWF9CT09MIENQREZfU3RpdGNoRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiBvdXRwdXRzKSBjb25zdCB7CisgIEZYX0ZMT0FUIGlucHV0ID0gaW5wdXRzWzBdOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1fblN1YnMgLSAxOyBpKyspCisgICAgaWYgKGlucHV0IDwgbV9wQm91bmRzW2kgKyAxXSkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIENQREZfRnVuY3Rpb24qIHBGdW5jID0gTlVMTDsKLSAgICBpbnQgdHlwZTsKLSAgICBpZiAocEZ1bmNPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHR5cGUgPSAoKENQREZfU3RyZWFtKilwRnVuY09iaiktPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiRnVuY3Rpb25UeXBlIikpOwotICAgIH0gZWxzZSBpZiAocEZ1bmNPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICB0eXBlID0gKChDUERGX0RpY3Rpb25hcnkqKXBGdW5jT2JqKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiRnVuY3Rpb25UeXBlIikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAodHlwZSA9PSAwKSB7Ci0gICAgICAgIHBGdW5jID0gbmV3IENQREZfU2FtcGxlZEZ1bmM7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHsKLSAgICAgICAgcEZ1bmMgPSBuZXcgQ1BERl9FeHBJbnRGdW5jOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSAzKSB7Ci0gICAgICAgIHBGdW5jID0gbmV3IENQREZfU3RpdGNoRnVuYzsKLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gNCkgewotICAgICAgICBwRnVuYyA9IG5ldyBDUERGX1BTRnVuYzsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFwRnVuYy0+SW5pdChwRnVuY09iaikpIHsKLSAgICAgICAgZGVsZXRlIHBGdW5jOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHBGdW5jOworICBpZiAobV9wU3ViRnVuY3Rpb25zW2ldID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW5wdXQgPSBQREZfSW50ZXJwb2xhdGUoaW5wdXQsIG1fcEJvdW5kc1tpXSwgbV9wQm91bmRzW2kgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRW5jb2RlW2kgKiAyXSwgbV9wRW5jb2RlW2kgKiAyICsgMV0pOworICBpbnQgbnJlc3VsdHM7CisgIG1fcFN1YkZ1bmN0aW9uc1tpXS0+Q2FsbCgmaW5wdXQsIG1fbklucHV0cywgb3V0cHV0cywgbnJlc3VsdHMpOworICByZXR1cm4gVFJVRTsKIH0KLUNQREZfRnVuY3Rpb246OkNQREZfRnVuY3Rpb24oKQoteworQ1BERl9GdW5jdGlvbiogQ1BERl9GdW5jdGlvbjo6TG9hZChDUERGX09iamVjdCogcEZ1bmNPYmopIHsKKyAgaWYgKHBGdW5jT2JqID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0Z1bmN0aW9uKiBwRnVuYyA9IE5VTEw7CisgIGludCB0eXBlOworICBpZiAocEZ1bmNPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CisgICAgdHlwZSA9ICgoQ1BERl9TdHJlYW0qKXBGdW5jT2JqKQorICAgICAgICAgICAgICAgLT5HZXREaWN0KCkKKyAgICAgICAgICAgICAgIC0+R2V0SW50ZWdlcihGWF9CU1RSQygiRnVuY3Rpb25UeXBlIikpOworICB9IGVsc2UgaWYgKHBGdW5jT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICB0eXBlID0gKChDUERGX0RpY3Rpb25hcnkqKXBGdW5jT2JqKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiRnVuY3Rpb25UeXBlIikpOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICh0eXBlID09IDApIHsKKyAgICBwRnVuYyA9IG5ldyBDUERGX1NhbXBsZWRGdW5jOworICB9IGVsc2UgaWYgKHR5cGUgPT0gMikgeworICAgIHBGdW5jID0gbmV3IENQREZfRXhwSW50RnVuYzsKKyAgfSBlbHNlIGlmICh0eXBlID09IDMpIHsKKyAgICBwRnVuYyA9IG5ldyBDUERGX1N0aXRjaEZ1bmM7CisgIH0gZWxzZSBpZiAodHlwZSA9PSA0KSB7CisgICAgcEZ1bmMgPSBuZXcgQ1BERl9QU0Z1bmM7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCFwRnVuYy0+SW5pdChwRnVuY09iaikpIHsKKyAgICBkZWxldGUgcEZ1bmM7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHBGdW5jOworfQorQ1BERl9GdW5jdGlvbjo6Q1BERl9GdW5jdGlvbigpIHsKKyAgbV9wRG9tYWlucyA9IE5VTEw7CisgIG1fcFJhbmdlcyA9IE5VTEw7Cit9CitDUERGX0Z1bmN0aW9uOjp+Q1BERl9GdW5jdGlvbigpIHsKKyAgaWYgKG1fcERvbWFpbnMpIHsKKyAgICBGWF9GcmVlKG1fcERvbWFpbnMpOwogICAgIG1fcERvbWFpbnMgPSBOVUxMOworICB9CisgIGlmIChtX3BSYW5nZXMpIHsKKyAgICBGWF9GcmVlKG1fcFJhbmdlcyk7CiAgICAgbV9wUmFuZ2VzID0gTlVMTDsKKyAgfQogfQotQ1BERl9GdW5jdGlvbjo6fkNQREZfRnVuY3Rpb24oKQotewotICAgIGlmIChtX3BEb21haW5zKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRG9tYWlucyk7Ci0gICAgICAgIG1fcERvbWFpbnMgPSBOVUxMOworRlhfQk9PTCBDUERGX0Z1bmN0aW9uOjpJbml0KENQREZfT2JqZWN0KiBwT2JqKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3Q7CisgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgeworICAgIHBEaWN0ID0gKChDUERGX1N0cmVhbSopcE9iaiktPkdldERpY3QoKTsKKyAgfSBlbHNlIHsKKyAgICBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7CisgIH0KKyAgQ1BERl9BcnJheSogcERvbWFpbnMgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRvbWFpbiIpKTsKKyAgaWYgKHBEb21haW5zID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9uSW5wdXRzID0gcERvbWFpbnMtPkdldENvdW50KCkgLyAyOworICBpZiAobV9uSW5wdXRzID09IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wRG9tYWlucyA9IEZYX0FsbG9jMkQoRlhfRkxPQVQsIG1fbklucHV0cywgMik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzICogMjsgaSsrKSB7CisgICAgbV9wRG9tYWluc1tpXSA9IHBEb21haW5zLT5HZXRGbG9hdChpKTsKKyAgfQorICBDUERGX0FycmF5KiBwUmFuZ2VzID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJSYW5nZSIpKTsKKyAgbV9uT3V0cHV0cyA9IDA7CisgIGlmIChwUmFuZ2VzKSB7CisgICAgbV9uT3V0cHV0cyA9IHBSYW5nZXMtPkdldENvdW50KCkgLyAyOworICAgIG1fcFJhbmdlcyA9IEZYX0FsbG9jMkQoRlhfRkxPQVQsIG1fbk91dHB1dHMsIDIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uT3V0cHV0cyAqIDI7IGkrKykgeworICAgICAgbV9wUmFuZ2VzW2ldID0gcFJhbmdlcy0+R2V0RmxvYXQoaSk7CiAgICAgfQorICB9CisgIEZYX0RXT1JEIG9sZF9vdXRwdXRzID0gbV9uT3V0cHV0czsKKyAgaWYgKCF2X0luaXQocE9iaikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcFJhbmdlcyAmJiBtX25PdXRwdXRzID4gKGludClvbGRfb3V0cHV0cykgeworICAgIG1fcFJhbmdlcyA9IEZYX1JlYWxsb2MoRlhfRkxPQVQsIG1fcFJhbmdlcywgbV9uT3V0cHV0cyAqIDIpOwogICAgIGlmIChtX3BSYW5nZXMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BSYW5nZXMpOwotICAgICAgICBtX3BSYW5nZXMgPSBOVUxMOworICAgICAgRlhTWVNfbWVtc2V0KG1fcFJhbmdlcyArIChvbGRfb3V0cHV0cyAqIDIpLCAwLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9GTE9BVCkgKiAobV9uT3V0cHV0cyAtIG9sZF9vdXRwdXRzKSAqIDIpOwogICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9GdW5jdGlvbjo6SW5pdChDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0OwotICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICBwRGljdCA9ICgoQ1BERl9TdHJlYW0qKXBPYmopLT5HZXREaWN0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqOworRlhfQk9PTCBDUERGX0Z1bmN0aW9uOjpDYWxsKEZYX0ZMT0FUKiBpbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBucmVzdWx0cykgY29uc3QgeworICBpZiAobV9uSW5wdXRzICE9IG5pbnB1dHMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbnJlc3VsdHMgPSBtX25PdXRwdXRzOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0czsgaSsrKSB7CisgICAgaWYgKGlucHV0c1tpXSA8IG1fcERvbWFpbnNbaSAqIDJdKSB7CisgICAgICBpbnB1dHNbaV0gPSBtX3BEb21haW5zW2kgKiAyXTsKKyAgICB9IGVsc2UgaWYgKGlucHV0c1tpXSA+IG1fcERvbWFpbnNbaSAqIDIgKyAxXSkgeworICAgICAgaW5wdXRzW2ldID0gbV9wRG9tYWluc1tpICogMl0gKyAxOwogICAgIH0KLSAgICBDUERGX0FycmF5KiBwRG9tYWlucyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRG9tYWluIikpOwotICAgIGlmIChwRG9tYWlucyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB2X0NhbGwoaW5wdXRzLCByZXN1bHRzKTsKKyAgaWYgKG1fcFJhbmdlcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uT3V0cHV0czsgaSsrKSB7CisgICAgICBpZiAocmVzdWx0c1tpXSA8IG1fcFJhbmdlc1tpICogMl0pIHsKKyAgICAgICAgcmVzdWx0c1tpXSA9IG1fcFJhbmdlc1tpICogMl07CisgICAgICB9IGVsc2UgaWYgKHJlc3VsdHNbaV0gPiBtX3BSYW5nZXNbaSAqIDIgKyAxXSkgeworICAgICAgICByZXN1bHRzW2ldID0gbV9wUmFuZ2VzW2kgKiAyICsgMV07CisgICAgICB9CiAgICAgfQotICAgIG1fbklucHV0cyA9IHBEb21haW5zLT5HZXRDb3VudCgpIC8gMjsKLSAgICBpZiAobV9uSW5wdXRzID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BEb21haW5zID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uSW5wdXRzLCAyKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0cyAqIDI7IGkgKyspIHsKLSAgICAgICAgbV9wRG9tYWluc1tpXSA9IHBEb21haW5zLT5HZXRGbG9hdChpKTsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcFJhbmdlcyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiUmFuZ2UiKSk7Ci0gICAgbV9uT3V0cHV0cyA9IDA7Ci0gICAgaWYgKHBSYW5nZXMpIHsKLSAgICAgICAgbV9uT3V0cHV0cyA9IHBSYW5nZXMtPkdldENvdW50KCkgLyAyOwotICAgICAgICBtX3BSYW5nZXMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25PdXRwdXRzLCAyKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25PdXRwdXRzICogMjsgaSArKykgewotICAgICAgICAgICAgbV9wUmFuZ2VzW2ldID0gcFJhbmdlcy0+R2V0RmxvYXQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfRFdPUkQgb2xkX291dHB1dHMgPSBtX25PdXRwdXRzOwotICAgIGlmICghdl9Jbml0KHBPYmopKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcFJhbmdlcyAmJiBtX25PdXRwdXRzID4gKGludClvbGRfb3V0cHV0cykgewotICAgICAgICBtX3BSYW5nZXMgPSBGWF9SZWFsbG9jKEZYX0ZMT0FULCBtX3BSYW5nZXMsIG1fbk91dHB1dHMgKiAyKTsKLSAgICAgICAgaWYgKG1fcFJhbmdlcykgewotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcFJhbmdlcyArIChvbGRfb3V0cHV0cyAqIDIpLCAwLCBzaXplb2YoRlhfRkxPQVQpICogKG1fbk91dHB1dHMgLSBvbGRfb3V0cHV0cykgKiAyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9GdW5jdGlvbjo6Q2FsbChGWF9GTE9BVCogaW5wdXRzLCBpbnQgbmlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMsIGludCYgbnJlc3VsdHMpIGNvbnN0Ci17Ci0gICAgaWYgKG1fbklucHV0cyAhPSBuaW5wdXRzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbnJlc3VsdHMgPSBtX25PdXRwdXRzOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpICsrKSB7Ci0gICAgICAgIGlmIChpbnB1dHNbaV0gPCBtX3BEb21haW5zW2kgKiAyXSkgewotICAgICAgICAgICAgaW5wdXRzW2ldID0gbV9wRG9tYWluc1tpICogMl07Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRzW2ldID4gbV9wRG9tYWluc1tpICogMiArIDFdKSB7Ci0gICAgICAgICAgICBpbnB1dHNbaV0gPSBtX3BEb21haW5zW2kgKiAyXSArIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdl9DYWxsKGlucHV0cywgcmVzdWx0cyk7Ci0gICAgaWYgKG1fcFJhbmdlcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkgKyspIHsKLSAgICAgICAgICAgIGlmIChyZXN1bHRzW2ldIDwgbV9wUmFuZ2VzW2kgKiAyXSkgewotICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBtX3BSYW5nZXNbaSAqIDJdOwotICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHRzW2ldID4gbV9wUmFuZ2VzW2kgKiAyICsgMV0pIHsKLSAgICAgICAgICAgICAgICByZXN1bHRzW2ldID0gbV9wUmFuZ2VzW2kgKiAyICsgMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZ3JhcGhfc3RhdGUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2dyYXBoX3N0YXRlLmNwcAppbmRleCBiNGQwMzBlLi5lMDEwYTI4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZ3JhcGhfc3RhdGUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9ncmFwaF9zdGF0ZS5jcHAKQEAgLTExLDY5OSArMTEsNjgyIEBACiAjaW5jbHVkZSAiLi4vZnBkZl9yZW5kZXIvcmVuZGVyX2ludC5oIgogI2luY2x1ZGUgInBhZ2VpbnQuaCIKIAotdm9pZCBDUERGX0dyYXBoaWNTdGF0ZXM6OkRlZmF1bHRTdGF0ZXMoKQotewotICAgIG1fQ29sb3JTdGF0ZS5OZXcoKS0+RGVmYXVsdCgpOwordm9pZCBDUERGX0dyYXBoaWNTdGF0ZXM6OkRlZmF1bHRTdGF0ZXMoKSB7CisgIG1fQ29sb3JTdGF0ZS5OZXcoKS0+RGVmYXVsdCgpOwogfQotdm9pZCBDUERGX0dyYXBoaWNTdGF0ZXM6OkNvcHlTdGF0ZXMoY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzJiBzcmMpCi17Ci0gICAgbV9DbGlwUGF0aCA9IHNyYy5tX0NsaXBQYXRoOwotICAgIG1fR3JhcGhTdGF0ZSA9IHNyYy5tX0dyYXBoU3RhdGU7Ci0gICAgbV9Db2xvclN0YXRlID0gc3JjLm1fQ29sb3JTdGF0ZTsKLSAgICBtX1RleHRTdGF0ZSA9IHNyYy5tX1RleHRTdGF0ZTsKLSAgICBtX0dlbmVyYWxTdGF0ZSA9IHNyYy5tX0dlbmVyYWxTdGF0ZTsKK3ZvaWQgQ1BERl9HcmFwaGljU3RhdGVzOjpDb3B5U3RhdGVzKGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyYgc3JjKSB7CisgIG1fQ2xpcFBhdGggPSBzcmMubV9DbGlwUGF0aDsKKyAgbV9HcmFwaFN0YXRlID0gc3JjLm1fR3JhcGhTdGF0ZTsKKyAgbV9Db2xvclN0YXRlID0gc3JjLm1fQ29sb3JTdGF0ZTsKKyAgbV9UZXh0U3RhdGUgPSBzcmMubV9UZXh0U3RhdGU7CisgIG1fR2VuZXJhbFN0YXRlID0gc3JjLm1fR2VuZXJhbFN0YXRlOwogfQotQ1BERl9DbGlwUGF0aERhdGE6OkNQREZfQ2xpcFBhdGhEYXRhKCkKLXsKLSAgICBtX1BhdGhDb3VudCA9IDA7CitDUERGX0NsaXBQYXRoRGF0YTo6Q1BERl9DbGlwUGF0aERhdGEoKSB7CisgIG1fUGF0aENvdW50ID0gMDsKKyAgbV9wUGF0aExpc3QgPSBOVUxMOworICBtX3BUeXBlTGlzdCA9IE5VTEw7CisgIG1fVGV4dENvdW50ID0gMDsKKyAgbV9wVGV4dExpc3QgPSBOVUxMOworfQorQ1BERl9DbGlwUGF0aERhdGE6On5DUERGX0NsaXBQYXRoRGF0YSgpIHsKKyAgaW50IGk7CisgIGRlbGV0ZVtdIG1fcFBhdGhMaXN0OworICBpZiAobV9wVHlwZUxpc3QpIHsKKyAgICBGWF9GcmVlKG1fcFR5cGVMaXN0KTsKKyAgfQorICBmb3IgKGkgPSBtX1RleHRDb3VudCAtIDE7IGkgPiAtMTsgaS0tKQorICAgIGRlbGV0ZSBtX3BUZXh0TGlzdFtpXTsKKyAgaWYgKG1fcFRleHRMaXN0KSB7CisgICAgRlhfRnJlZShtX3BUZXh0TGlzdCk7CisgIH0KK30KK0NQREZfQ2xpcFBhdGhEYXRhOjpDUERGX0NsaXBQYXRoRGF0YShjb25zdCBDUERGX0NsaXBQYXRoRGF0YSYgc3JjKSB7CisgIG1fcFBhdGhMaXN0ID0gTlVMTDsKKyAgbV9wUGF0aExpc3QgPSBOVUxMOworICBtX3BUZXh0TGlzdCA9IE5VTEw7CisgIG1fUGF0aENvdW50ID0gc3JjLm1fUGF0aENvdW50OworICBpZiAobV9QYXRoQ291bnQpIHsKKyAgICBpbnQgYWxsb2Nfc2l6ZSA9IG1fUGF0aENvdW50OworICAgIGlmIChhbGxvY19zaXplICUgOCkgeworICAgICAgYWxsb2Nfc2l6ZSArPSA4IC0gKGFsbG9jX3NpemUgJSA4KTsKKyAgICB9CisgICAgbV9wUGF0aExpc3QgPSBuZXcgQ1BERl9QYXRoW2FsbG9jX3NpemVdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9QYXRoQ291bnQ7IGkrKykgeworICAgICAgbV9wUGF0aExpc3RbaV0gPSBzcmMubV9wUGF0aExpc3RbaV07CisgICAgfQorICAgIG1fcFR5cGVMaXN0ID0gRlhfQWxsb2ModWludDhfdCwgYWxsb2Nfc2l6ZSk7CisgICAgRlhTWVNfbWVtY3B5KG1fcFR5cGVMaXN0LCBzcmMubV9wVHlwZUxpc3QsIG1fUGF0aENvdW50KTsKKyAgfSBlbHNlIHsKICAgICBtX3BQYXRoTGlzdCA9IE5VTEw7CiAgICAgbV9wVHlwZUxpc3QgPSBOVUxMOwotICAgIG1fVGV4dENvdW50ID0gMDsKKyAgfQorICBtX1RleHRDb3VudCA9IHNyYy5tX1RleHRDb3VudDsKKyAgaWYgKG1fVGV4dENvdW50KSB7CisgICAgbV9wVGV4dExpc3QgPSBGWF9BbGxvYyhDUERGX1RleHRPYmplY3QqLCBtX1RleHRDb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRDb3VudDsgaSsrKSB7CisgICAgICBpZiAoc3JjLm1fcFRleHRMaXN0W2ldKSB7CisgICAgICAgIG1fcFRleHRMaXN0W2ldID0gbmV3IENQREZfVGV4dE9iamVjdDsKKyAgICAgICAgbV9wVGV4dExpc3RbaV0tPkNvcHkoc3JjLm1fcFRleHRMaXN0W2ldKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fcFRleHRMaXN0W2ldID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CiAgICAgbV9wVGV4dExpc3QgPSBOVUxMOworICB9CiB9Ci1DUERGX0NsaXBQYXRoRGF0YTo6fkNQREZfQ2xpcFBhdGhEYXRhKCkKLXsKLSAgICBpbnQgaTsKLSAgICBkZWxldGVbXSBtX3BQYXRoTGlzdDsKLSAgICBpZiAobV9wVHlwZUxpc3QpIHsKLSAgICAgICAgRlhfRnJlZShtX3BUeXBlTGlzdCk7Ci0gICAgfQotICAgIGZvciAoaSA9IG1fVGV4dENvdW50IC0gMTsgaSA+IC0xOyBpIC0tKQotICAgICAgICBkZWxldGUgbV9wVGV4dExpc3RbaV07Ci0gICAgaWYgKG1fcFRleHRMaXN0KSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wVGV4dExpc3QpOwotICAgIH0KK3ZvaWQgQ1BERl9DbGlwUGF0aERhdGE6OlNldENvdW50KGludCBwYXRoX2NvdW50LCBpbnQgdGV4dF9jb3VudCkgeworICBBU1NFUlQobV9UZXh0Q291bnQgPT0gMCAmJiBtX1BhdGhDb3VudCA9PSAwKTsKKyAgaWYgKHBhdGhfY291bnQpIHsKKyAgICBtX1BhdGhDb3VudCA9IHBhdGhfY291bnQ7CisgICAgaW50IGFsbG9jX3NpemUgPSAocGF0aF9jb3VudCArIDcpIC8gOCAqIDg7CisgICAgbV9wUGF0aExpc3QgPSBuZXcgQ1BERl9QYXRoW2FsbG9jX3NpemVdOworICAgIG1fcFR5cGVMaXN0ID0gRlhfQWxsb2ModWludDhfdCwgYWxsb2Nfc2l6ZSk7CisgIH0KKyAgaWYgKHRleHRfY291bnQpIHsKKyAgICBtX1RleHRDb3VudCA9IHRleHRfY291bnQ7CisgICAgbV9wVGV4dExpc3QgPSBGWF9BbGxvYyhDUERGX1RleHRPYmplY3QqLCB0ZXh0X2NvdW50KTsKKyAgfQogfQotQ1BERl9DbGlwUGF0aERhdGE6OkNQREZfQ2xpcFBhdGhEYXRhKGNvbnN0IENQREZfQ2xpcFBhdGhEYXRhJiBzcmMpCi17Ci0gICAgbV9wUGF0aExpc3QgPSBOVUxMOwotICAgIG1fcFBhdGhMaXN0ID0gTlVMTDsKLSAgICBtX3BUZXh0TGlzdCA9IE5VTEw7Ci0gICAgbV9QYXRoQ291bnQgPSBzcmMubV9QYXRoQ291bnQ7Ci0gICAgaWYgKG1fUGF0aENvdW50KSB7Ci0gICAgICAgIGludCBhbGxvY19zaXplID0gbV9QYXRoQ291bnQ7Ci0gICAgICAgIGlmIChhbGxvY19zaXplICUgOCkgewotICAgICAgICAgICAgYWxsb2Nfc2l6ZSArPSA4IC0gKGFsbG9jX3NpemUgJSA4KTsKLSAgICAgICAgfQotICAgICAgICBtX3BQYXRoTGlzdCA9IG5ldyBDUERGX1BhdGhbYWxsb2Nfc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9QYXRoQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIG1fcFBhdGhMaXN0W2ldID0gc3JjLm1fcFBhdGhMaXN0W2ldOwotICAgICAgICB9Ci0gICAgICAgIG1fcFR5cGVMaXN0ID0gRlhfQWxsb2ModWludDhfdCwgYWxsb2Nfc2l6ZSk7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BUeXBlTGlzdCwgc3JjLm1fcFR5cGVMaXN0LCBtX1BhdGhDb3VudCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wUGF0aExpc3QgPSBOVUxMOwotICAgICAgICBtX3BUeXBlTGlzdCA9IE5VTEw7CitDUERGX1JlY3QgQ1BERl9DbGlwUGF0aDo6R2V0Q2xpcEJveCgpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJlY3Q7CisgIEZYX0JPT0wgYlN0YXJ0ZWQgPSBGQUxTRTsKKyAgaW50IGNvdW50ID0gR2V0UGF0aENvdW50KCk7CisgIGlmIChjb3VudCkgeworICAgIHJlY3QgPSBHZXRQYXRoKDApLkdldEJvdW5kaW5nQm94KCk7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBDUERGX1JlY3QgcGF0aF9yZWN0ID0gR2V0UGF0aChpKS5HZXRCb3VuZGluZ0JveCgpOworICAgICAgcmVjdC5JbnRlcnNlY3QocGF0aF9yZWN0KTsKICAgICB9Ci0gICAgbV9UZXh0Q291bnQgPSBzcmMubV9UZXh0Q291bnQ7Ci0gICAgaWYgKG1fVGV4dENvdW50KSB7Ci0gICAgICAgIG1fcFRleHRMaXN0ID0gRlhfQWxsb2MoQ1BERl9UZXh0T2JqZWN0KiwgbV9UZXh0Q291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fVGV4dENvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAoc3JjLm1fcFRleHRMaXN0W2ldKSB7Ci0gICAgICAgICAgICAgICAgbV9wVGV4dExpc3RbaV0gPSBuZXcgQ1BERl9UZXh0T2JqZWN0OwotICAgICAgICAgICAgICAgIG1fcFRleHRMaXN0W2ldLT5Db3B5KHNyYy5tX3BUZXh0TGlzdFtpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fcFRleHRMaXN0W2ldID0gTlVMTDsKLSAgICAgICAgICAgIH0KKyAgICBiU3RhcnRlZCA9IFRSVUU7CisgIH0KKyAgY291bnQgPSBHZXRUZXh0Q291bnQoKTsKKyAgaWYgKGNvdW50KSB7CisgICAgQ1BERl9SZWN0IGxheWVyX3JlY3Q7CisgICAgRlhfQk9PTCBiTGF5ZXJTdGFydGVkID0gRkFMU0U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gR2V0VGV4dChpKTsKKyAgICAgIGlmIChwVGV4dE9iaiA9PSBOVUxMKSB7CisgICAgICAgIGlmICghYlN0YXJ0ZWQpIHsKKyAgICAgICAgICByZWN0ID0gbGF5ZXJfcmVjdDsKKyAgICAgICAgICBiU3RhcnRlZCA9IFRSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVjdC5JbnRlcnNlY3QobGF5ZXJfcmVjdCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX3BUZXh0TGlzdCA9IE5VTEw7CisgICAgICAgIGJMYXllclN0YXJ0ZWQgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghYkxheWVyU3RhcnRlZCkgeworICAgICAgICAgIGxheWVyX3JlY3QgPSBwVGV4dE9iai0+R2V0QkJveChOVUxMKTsKKyAgICAgICAgICBiTGF5ZXJTdGFydGVkID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsYXllcl9yZWN0LlVuaW9uKHBUZXh0T2JqLT5HZXRCQm94KE5VTEwpKTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KKyAgfQorICByZXR1cm4gcmVjdDsKIH0KLXZvaWQgQ1BERl9DbGlwUGF0aERhdGE6OlNldENvdW50KGludCBwYXRoX2NvdW50LCBpbnQgdGV4dF9jb3VudCkKLXsKLSAgICBBU1NFUlQobV9UZXh0Q291bnQgPT0gMCAmJiBtX1BhdGhDb3VudCA9PSAwKTsKLSAgICBpZiAocGF0aF9jb3VudCkgewotICAgICAgICBtX1BhdGhDb3VudCA9IHBhdGhfY291bnQ7Ci0gICAgICAgIGludCBhbGxvY19zaXplID0gKHBhdGhfY291bnQgKyA3KSAvIDggKiA4OwotICAgICAgICBtX3BQYXRoTGlzdCA9IG5ldyBDUERGX1BhdGhbYWxsb2Nfc2l6ZV07Ci0gICAgICAgIG1fcFR5cGVMaXN0ID0gRlhfQWxsb2ModWludDhfdCwgYWxsb2Nfc2l6ZSk7Cit2b2lkIENQREZfQ2xpcFBhdGg6OkFwcGVuZFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBGWF9CT09MIGJBdXRvTWVyZ2UpIHsKKyAgQ1BERl9DbGlwUGF0aERhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7CisgIGlmIChwRGF0YS0+bV9QYXRoQ291bnQgJiYgYkF1dG9NZXJnZSkgeworICAgIENQREZfUGF0aCBvbGRfcGF0aCA9IHBEYXRhLT5tX3BQYXRoTGlzdFtwRGF0YS0+bV9QYXRoQ291bnQgLSAxXTsKKyAgICBpZiAob2xkX3BhdGguSXNSZWN0KCkpIHsKKyAgICAgIENQREZfUmVjdCBvbGRfcmVjdChvbGRfcGF0aC5HZXRQb2ludFgoMCksIG9sZF9wYXRoLkdldFBvaW50WSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfcGF0aC5HZXRQb2ludFgoMiksIG9sZF9wYXRoLkdldFBvaW50WSgyKSk7CisgICAgICBDUERGX1JlY3QgbmV3X3JlY3QgPSBwYXRoLkdldEJvdW5kaW5nQm94KCk7CisgICAgICBpZiAob2xkX3JlY3QuQ29udGFpbnMobmV3X3JlY3QpKSB7CisgICAgICAgIHBEYXRhLT5tX1BhdGhDb3VudC0tOworICAgICAgICBwRGF0YS0+bV9wUGF0aExpc3RbcERhdGEtPm1fUGF0aENvdW50XS5TZXROdWxsKCk7CisgICAgICB9CiAgICAgfQotICAgIGlmICh0ZXh0X2NvdW50KSB7Ci0gICAgICAgIG1fVGV4dENvdW50ID0gdGV4dF9jb3VudDsKLSAgICAgICAgbV9wVGV4dExpc3QgPSBGWF9BbGxvYyhDUERGX1RleHRPYmplY3QqLCB0ZXh0X2NvdW50KTsKKyAgfQorICBpZiAocERhdGEtPm1fUGF0aENvdW50ICUgOCA9PSAwKSB7CisgICAgQ1BERl9QYXRoKiBwTmV3UGF0aCA9IG5ldyBDUERGX1BhdGhbcERhdGEtPm1fUGF0aENvdW50ICsgOF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwRGF0YS0+bV9QYXRoQ291bnQ7IGkrKykgeworICAgICAgcE5ld1BhdGhbaV0gPSBwRGF0YS0+bV9wUGF0aExpc3RbaV07CiAgICAgfQorICAgIGRlbGV0ZVtdIHBEYXRhLT5tX3BQYXRoTGlzdDsKKyAgICB1aW50OF90KiBwTmV3VHlwZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBEYXRhLT5tX1BhdGhDb3VudCArIDgpOworICAgIEZYU1lTX21lbWNweShwTmV3VHlwZSwgcERhdGEtPm1fcFR5cGVMaXN0LCBwRGF0YS0+bV9QYXRoQ291bnQpOworICAgIGlmIChwRGF0YS0+bV9wVHlwZUxpc3QpIHsKKyAgICAgIEZYX0ZyZWUocERhdGEtPm1fcFR5cGVMaXN0KTsKKyAgICB9CisgICAgcERhdGEtPm1fcFBhdGhMaXN0ID0gcE5ld1BhdGg7CisgICAgcERhdGEtPm1fcFR5cGVMaXN0ID0gcE5ld1R5cGU7CisgIH0KKyAgcERhdGEtPm1fcFBhdGhMaXN0W3BEYXRhLT5tX1BhdGhDb3VudF0gPSBwYXRoOworICBwRGF0YS0+bV9wVHlwZUxpc3RbcERhdGEtPm1fUGF0aENvdW50XSA9ICh1aW50OF90KXR5cGU7CisgIHBEYXRhLT5tX1BhdGhDb3VudCsrOwogfQotQ1BERl9SZWN0IENQREZfQ2xpcFBhdGg6OkdldENsaXBCb3goKSBjb25zdAotewotICAgIENQREZfUmVjdCByZWN0OwotICAgIEZYX0JPT0wgYlN0YXJ0ZWQgPSBGQUxTRTsKLSAgICBpbnQgY291bnQgPSBHZXRQYXRoQ291bnQoKTsKLSAgICBpZiAoY291bnQpIHsKLSAgICAgICAgcmVjdCA9IEdldFBhdGgoMCkuR2V0Qm91bmRpbmdCb3goKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICAgICAgQ1BERl9SZWN0IHBhdGhfcmVjdCA9IEdldFBhdGgoaSkuR2V0Qm91bmRpbmdCb3goKTsKLSAgICAgICAgICAgIHJlY3QuSW50ZXJzZWN0KHBhdGhfcmVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgYlN0YXJ0ZWQgPSBUUlVFOwotICAgIH0KLSAgICBjb3VudCA9IEdldFRleHRDb3VudCgpOwotICAgIGlmIChjb3VudCkgewotICAgICAgICBDUERGX1JlY3QgbGF5ZXJfcmVjdDsKLSAgICAgICAgRlhfQk9PTCBiTGF5ZXJTdGFydGVkID0gRkFMU0U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBHZXRUZXh0KGkpOwotICAgICAgICAgICAgaWYgKHBUZXh0T2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWJTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3QgPSBsYXllcl9yZWN0OwotICAgICAgICAgICAgICAgICAgICBiU3RhcnRlZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdC5JbnRlcnNlY3QobGF5ZXJfcmVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJMYXllclN0YXJ0ZWQgPSBGQUxTRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFiTGF5ZXJTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxheWVyX3JlY3QgPSBwVGV4dE9iai0+R2V0QkJveChOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgYkxheWVyU3RhcnRlZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGF5ZXJfcmVjdC5VbmlvbihwVGV4dE9iai0+R2V0QkJveChOVUxMKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWN0OwotfQotdm9pZCBDUERGX0NsaXBQYXRoOjpBcHBlbmRQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgRlhfQk9PTCBiQXV0b01lcmdlKQotewotICAgIENQREZfQ2xpcFBhdGhEYXRhKiBwRGF0YSA9IEdldE1vZGlmeSgpOwotICAgIGlmIChwRGF0YS0+bV9QYXRoQ291bnQgJiYgYkF1dG9NZXJnZSkgewotICAgICAgICBDUERGX1BhdGggb2xkX3BhdGggPSBwRGF0YS0+bV9wUGF0aExpc3RbcERhdGEtPm1fUGF0aENvdW50IC0gMV07Ci0gICAgICAgIGlmIChvbGRfcGF0aC5Jc1JlY3QoKSkgewotICAgICAgICAgICAgQ1BERl9SZWN0IG9sZF9yZWN0KG9sZF9wYXRoLkdldFBvaW50WCgwKSwgb2xkX3BhdGguR2V0UG9pbnRZKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9wYXRoLkdldFBvaW50WCgyKSwgb2xkX3BhdGguR2V0UG9pbnRZKDIpKTsKLSAgICAgICAgICAgIENQREZfUmVjdCBuZXdfcmVjdCA9IHBhdGguR2V0Qm91bmRpbmdCb3goKTsKLSAgICAgICAgICAgIGlmIChvbGRfcmVjdC5Db250YWlucyhuZXdfcmVjdCkpIHsKLSAgICAgICAgICAgICAgICBwRGF0YS0+bV9QYXRoQ291bnQgLS07Ci0gICAgICAgICAgICAgICAgcERhdGEtPm1fcFBhdGhMaXN0W3BEYXRhLT5tX1BhdGhDb3VudF0uU2V0TnVsbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwRGF0YS0+bV9QYXRoQ291bnQgJSA4ID09IDApIHsKLSAgICAgICAgQ1BERl9QYXRoKiBwTmV3UGF0aCA9IG5ldyBDUERGX1BhdGhbcERhdGEtPm1fUGF0aENvdW50ICsgOF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcERhdGEtPm1fUGF0aENvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBwTmV3UGF0aFtpXSA9IHBEYXRhLT5tX3BQYXRoTGlzdFtpXTsKLSAgICAgICAgfQotICAgICAgICBkZWxldGVbXSBwRGF0YS0+bV9wUGF0aExpc3Q7Ci0gICAgICAgIHVpbnQ4X3QqIHBOZXdUeXBlID0gRlhfQWxsb2ModWludDhfdCwgcERhdGEtPm1fUGF0aENvdW50ICsgOCk7Ci0gICAgICAgIEZYU1lTX21lbWNweShwTmV3VHlwZSwgcERhdGEtPm1fcFR5cGVMaXN0LCBwRGF0YS0+bV9QYXRoQ291bnQpOwotICAgICAgICBpZiAocERhdGEtPm1fcFR5cGVMaXN0KSB7Ci0gICAgICAgICAgICBGWF9GcmVlKHBEYXRhLT5tX3BUeXBlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcERhdGEtPm1fcFBhdGhMaXN0ID0gcE5ld1BhdGg7Ci0gICAgICAgIHBEYXRhLT5tX3BUeXBlTGlzdCA9IHBOZXdUeXBlOwotICAgIH0KLSAgICBwRGF0YS0+bV9wUGF0aExpc3RbcERhdGEtPm1fUGF0aENvdW50XSA9IHBhdGg7Ci0gICAgcERhdGEtPm1fcFR5cGVMaXN0W3BEYXRhLT5tX1BhdGhDb3VudF0gPSAodWludDhfdCl0eXBlOwotICAgIHBEYXRhLT5tX1BhdGhDb3VudCArKzsKLX0KLXZvaWQgQ1BERl9DbGlwUGF0aDo6RGVsZXRlUGF0aChpbnQgaW5kZXgpCi17Ci0gICAgQ1BERl9DbGlwUGF0aERhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7Ci0gICAgaWYgKGluZGV4ID49IHBEYXRhLT5tX1BhdGhDb3VudCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBEYXRhLT5tX3BQYXRoTGlzdFtpbmRleF0uU2V0TnVsbCgpOwotICAgIGZvciAoaW50IGkgPSBpbmRleDsgaSA8IHBEYXRhLT5tX1BhdGhDb3VudCAtIDE7IGkgKyspIHsKLSAgICAgICAgcERhdGEtPm1fcFBhdGhMaXN0W2ldID0gcERhdGEtPm1fcFBhdGhMaXN0W2kgKyAxXTsKLSAgICB9Ci0gICAgcERhdGEtPm1fcFBhdGhMaXN0W3BEYXRhLT5tX1BhdGhDb3VudCAtIDFdLlNldE51bGwoKTsKLSAgICBGWFNZU19tZW1tb3ZlKHBEYXRhLT5tX3BUeXBlTGlzdCArIGluZGV4LCBwRGF0YS0+bV9wVHlwZUxpc3QgKyBpbmRleCArIDEsIHBEYXRhLT5tX1BhdGhDb3VudCAtIGluZGV4IC0gMSk7Ci0gICAgcERhdGEtPm1fUGF0aENvdW50IC0tOwordm9pZCBDUERGX0NsaXBQYXRoOjpEZWxldGVQYXRoKGludCBpbmRleCkgeworICBDUERGX0NsaXBQYXRoRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKKyAgaWYgKGluZGV4ID49IHBEYXRhLT5tX1BhdGhDb3VudCkgeworICAgIHJldHVybjsKKyAgfQorICBwRGF0YS0+bV9wUGF0aExpc3RbaW5kZXhdLlNldE51bGwoKTsKKyAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgcERhdGEtPm1fUGF0aENvdW50IC0gMTsgaSsrKSB7CisgICAgcERhdGEtPm1fcFBhdGhMaXN0W2ldID0gcERhdGEtPm1fcFBhdGhMaXN0W2kgKyAxXTsKKyAgfQorICBwRGF0YS0+bV9wUGF0aExpc3RbcERhdGEtPm1fUGF0aENvdW50IC0gMV0uU2V0TnVsbCgpOworICBGWFNZU19tZW1tb3ZlKHBEYXRhLT5tX3BUeXBlTGlzdCArIGluZGV4LCBwRGF0YS0+bV9wVHlwZUxpc3QgKyBpbmRleCArIDEsCisgICAgICAgICAgICAgICAgcERhdGEtPm1fUGF0aENvdW50IC0gaW5kZXggLSAxKTsKKyAgcERhdGEtPm1fUGF0aENvdW50LS07CiB9CiAjZGVmaW5lIEZQREZfQ0xJUFBBVEhfTUFYX1RFWFRTIDEwMjQKLXZvaWQgQ1BERl9DbGlwUGF0aDo6QXBwZW5kVGV4dHMoQ1BERl9UZXh0T2JqZWN0KiogcFRleHRzLCBpbnQgY291bnQpCi17Ci0gICAgQ1BERl9DbGlwUGF0aERhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7Ci0gICAgaWYgKHBEYXRhLT5tX1RleHRDb3VudCArIGNvdW50ID4gRlBERl9DTElQUEFUSF9NQVhfVEVYVFMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICAgICAgZGVsZXRlIHBUZXh0c1tpXTsKK3ZvaWQgQ1BERl9DbGlwUGF0aDo6QXBwZW5kVGV4dHMoQ1BERl9UZXh0T2JqZWN0KiogcFRleHRzLCBpbnQgY291bnQpIHsKKyAgQ1BERl9DbGlwUGF0aERhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7CisgIGlmIChwRGF0YS0+bV9UZXh0Q291bnQgKyBjb3VudCA+IEZQREZfQ0xJUFBBVEhfTUFYX1RFWFRTKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBkZWxldGUgcFRleHRzW2ldOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9UZXh0T2JqZWN0KiogcE5ld0xpc3QgPQorICAgICAgRlhfQWxsb2MoQ1BERl9UZXh0T2JqZWN0KiwgcERhdGEtPm1fVGV4dENvdW50ICsgY291bnQgKyAxKTsKKyAgaWYgKHBEYXRhLT5tX3BUZXh0TGlzdCkgeworICAgIEZYU1lTX21lbWNweShwTmV3TGlzdCwgcERhdGEtPm1fcFRleHRMaXN0LAorICAgICAgICAgICAgICAgICBwRGF0YS0+bV9UZXh0Q291bnQgKiBzaXplb2YoQ1BERl9UZXh0T2JqZWN0KikpOworICAgIEZYX0ZyZWUocERhdGEtPm1fcFRleHRMaXN0KTsKKyAgfQorICBwRGF0YS0+bV9wVGV4dExpc3QgPSBwTmV3TGlzdDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgcERhdGEtPm1fcFRleHRMaXN0W3BEYXRhLT5tX1RleHRDb3VudCArIGldID0gcFRleHRzW2ldOworICB9CisgIHBEYXRhLT5tX3BUZXh0TGlzdFtwRGF0YS0+bV9UZXh0Q291bnQgKyBjb3VudF0gPSBOVUxMOworICBwRGF0YS0+bV9UZXh0Q291bnQgKz0gY291bnQgKyAxOworfQordm9pZCBDUERGX0NsaXBQYXRoOjpUcmFuc2Zvcm0oY29uc3QgQ1BERl9NYXRyaXgmIG1hdHJpeCkgeworICBDUERGX0NsaXBQYXRoRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBwRGF0YS0+bV9QYXRoQ291bnQ7IGkrKykgeworICAgIHBEYXRhLT5tX3BQYXRoTGlzdFtpXS5UcmFuc2Zvcm0oJm1hdHJpeCk7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHBEYXRhLT5tX1RleHRDb3VudDsgaSsrKQorICAgIGlmIChwRGF0YS0+bV9wVGV4dExpc3RbaV0pIHsKKyAgICAgIHBEYXRhLT5tX3BUZXh0TGlzdFtpXS0+VHJhbnNmb3JtKG1hdHJpeCk7CisgICAgfQorfQorQ1BERl9Db2xvclN0YXRlRGF0YTo6Q1BERl9Db2xvclN0YXRlRGF0YShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhJiBzcmMpIHsKKyAgbV9GaWxsQ29sb3IuQ29weSgmc3JjLm1fRmlsbENvbG9yKTsKKyAgbV9GaWxsUkdCID0gc3JjLm1fRmlsbFJHQjsKKyAgbV9TdHJva2VDb2xvci5Db3B5KCZzcmMubV9TdHJva2VDb2xvcik7CisgIG1fU3Ryb2tlUkdCID0gc3JjLm1fU3Ryb2tlUkdCOworfQordm9pZCBDUERGX0NvbG9yU3RhdGVEYXRhOjpEZWZhdWx0KCkgeworICBtX0ZpbGxSR0IgPSBtX1N0cm9rZVJHQiA9IDA7CisgIG1fRmlsbENvbG9yLlNldENvbG9yU3BhY2UoQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpKTsKKyAgbV9TdHJva2VDb2xvci5TZXRDb2xvclNwYWNlKENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VHUkFZKSk7Cit9Cit2b2lkIENQREZfQ29sb3JTdGF0ZTo6U2V0RmlsbENvbG9yKENQREZfQ29sb3JTcGFjZSogcENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblZhbHVlcykgeworICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwRGF0YSA9IEdldE1vZGlmeSgpOworICBTZXRDb2xvcihwRGF0YS0+bV9GaWxsQ29sb3IsIHBEYXRhLT5tX0ZpbGxSR0IsIHBDUywgcFZhbHVlLCBuVmFsdWVzKTsKK30KK3ZvaWQgQ1BERl9Db2xvclN0YXRlOjpTZXRTdHJva2VDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuVmFsdWVzKSB7CisgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7CisgIFNldENvbG9yKHBEYXRhLT5tX1N0cm9rZUNvbG9yLCBwRGF0YS0+bV9TdHJva2VSR0IsIHBDUywgcFZhbHVlLCBuVmFsdWVzKTsKK30KK3ZvaWQgQ1BERl9Db2xvclN0YXRlOjpTZXRDb2xvcihDUERGX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5WYWx1ZXMpIHsKKyAgaWYgKHBDUykgeworICAgIGNvbG9yLlNldENvbG9yU3BhY2UocENTKTsKKyAgfSBlbHNlIGlmIChjb2xvci5Jc051bGwoKSkgeworICAgIGNvbG9yLlNldENvbG9yU3BhY2UoQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpKTsKKyAgfQorICBpZiAoY29sb3IubV9wQ1MtPkNvdW50Q29tcG9uZW50cygpID4gblZhbHVlcykgeworICAgIHJldHVybjsKKyAgfQorICBjb2xvci5TZXRWYWx1ZShwVmFsdWUpOworICBpbnQgUiwgRywgQjsKKyAgcmdiID0gY29sb3IuR2V0UkdCKFIsIEcsIEIpID8gRlhTWVNfUkdCKFIsIEcsIEIpIDogKEZYX0RXT1JEKS0xOworfQordm9pZCBDUERGX0NvbG9yU3RhdGU6OlNldEZpbGxQYXR0ZXJuKENQREZfUGF0dGVybiogcFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblZhbHVlcykgeworICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwRGF0YSA9IEdldE1vZGlmeSgpOworICBwRGF0YS0+bV9GaWxsQ29sb3IuU2V0VmFsdWUocFBhdHRlcm4sIHBWYWx1ZSwgblZhbHVlcyk7CisgIGludCBSLCBHLCBCOworICBGWF9CT09MIHJldCA9IHBEYXRhLT5tX0ZpbGxDb2xvci5HZXRSR0IoUiwgRywgQik7CisgIGlmIChwUGF0dGVybi0+bV9QYXR0ZXJuVHlwZSA9PSAxICYmCisgICAgICAoKENQREZfVGlsaW5nUGF0dGVybiopcFBhdHRlcm4pLT5tX2JDb2xvcmVkICYmICFyZXQpIHsKKyAgICBwRGF0YS0+bV9GaWxsUkdCID0gMHgwMEJGQkZCRjsKKyAgICByZXR1cm47CisgIH0KKyAgcERhdGEtPm1fRmlsbFJHQiA9IHJldCA/IEZYU1lTX1JHQihSLCBHLCBCKSA6IChGWF9EV09SRCktMTsKK30KK3ZvaWQgQ1BERl9Db2xvclN0YXRlOjpTZXRTdHJva2VQYXR0ZXJuKENQREZfUGF0dGVybiogcFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5WYWx1ZXMpIHsKKyAgQ1BERl9Db2xvclN0YXRlRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKKyAgcERhdGEtPm1fU3Ryb2tlQ29sb3IuU2V0VmFsdWUocFBhdHRlcm4sIHBWYWx1ZSwgblZhbHVlcyk7CisgIGludCBSLCBHLCBCOworICBGWF9CT09MIHJldCA9IHBEYXRhLT5tX1N0cm9rZUNvbG9yLkdldFJHQihSLCBHLCBCKTsKKyAgaWYgKHBQYXR0ZXJuLT5tX1BhdHRlcm5UeXBlID09IDEgJiYKKyAgICAgICgoQ1BERl9UaWxpbmdQYXR0ZXJuKilwUGF0dGVybiktPm1fYkNvbG9yZWQgJiYgIXJldCkgeworICAgIHBEYXRhLT5tX1N0cm9rZVJHQiA9IDB4MDBCRkJGQkY7CisgICAgcmV0dXJuOworICB9CisgIHBEYXRhLT5tX1N0cm9rZVJHQiA9CisgICAgICBwRGF0YS0+bV9TdHJva2VDb2xvci5HZXRSR0IoUiwgRywgQikgPyBGWFNZU19SR0IoUiwgRywgQikgOiAoRlhfRFdPUkQpLTE7Cit9CitDUERGX1RleHRTdGF0ZURhdGE6OkNQREZfVGV4dFN0YXRlRGF0YSgpIHsKKyAgbV9wRm9udCA9IE5VTEw7CisgIG1fcERvY3VtZW50ID0gTlVMTDsKKyAgbV9Gb250U2l6ZSA9IDEuMGY7CisgIG1fV29yZFNwYWNlID0gMDsKKyAgbV9DaGFyU3BhY2UgPSAwOworICBtX1RleHRNb2RlID0gMDsKKyAgbV9NYXRyaXhbMF0gPSBtX01hdHJpeFszXSA9IDEuMGY7CisgIG1fTWF0cml4WzFdID0gbV9NYXRyaXhbMl0gPSAwOworICBtX0NUTVswXSA9IG1fQ1RNWzNdID0gMS4wZjsKKyAgbV9DVE1bMV0gPSBtX0NUTVsyXSA9IDA7Cit9CitDUERGX1RleHRTdGF0ZURhdGE6OkNQREZfVGV4dFN0YXRlRGF0YShjb25zdCBDUERGX1RleHRTdGF0ZURhdGEmIHNyYykgeworICBpZiAodGhpcyA9PSAmc3JjKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYU1lTX21lbWNweSh0aGlzLCAmc3JjLCBzaXplb2YoQ1BERl9UZXh0U3RhdGVEYXRhKSk7CisgIGlmIChtX3BEb2N1bWVudCAmJiBtX3BGb250KSB7CisgICAgbV9wRm9udCA9CisgICAgICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5HZXRGb250KG1fcEZvbnQtPkdldEZvbnREaWN0KCksIEZBTFNFKTsKKyAgfQorfQorQ1BERl9UZXh0U3RhdGVEYXRhOjp+Q1BERl9UZXh0U3RhdGVEYXRhKCkgeworICBpZiAobV9wRG9jdW1lbnQgJiYgbV9wRm9udCkgeworICAgIENQREZfRG9jUGFnZURhdGEqIHBQYWdlRGF0YSA9IG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOworICAgIGlmIChwUGFnZURhdGEgJiYgIXBQYWdlRGF0YS0+SXNGb3JjZUNsZWFyKCkpIHsKKyAgICAgIHBQYWdlRGF0YS0+UmVsZWFzZUZvbnQobV9wRm9udC0+R2V0Rm9udERpY3QoKSk7CisgICAgfQorICB9Cit9Cit2b2lkIENQREZfVGV4dFN0YXRlOjpTZXRGb250KENQREZfRm9udCogcEZvbnQpIHsKKyAgQ1BERl9UZXh0U3RhdGVEYXRhKiBwU3RhdGVEYXRhID0gR2V0TW9kaWZ5KCk7CisgIGlmIChwU3RhdGVEYXRhKSB7CisgICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBTdGF0ZURhdGEtPm1fcERvY3VtZW50OworICAgIENQREZfRG9jUGFnZURhdGEqIHBQYWdlRGF0YSA9IHBEb2MgPyBwRG9jLT5HZXRQYWdlRGF0YSgpIDogTlVMTDsKKyAgICBpZiAocFBhZ2VEYXRhICYmIHBTdGF0ZURhdGEtPm1fcEZvbnQgJiYgIXBQYWdlRGF0YS0+SXNGb3JjZUNsZWFyKCkpIHsKKyAgICAgIHBQYWdlRGF0YS0+UmVsZWFzZUZvbnQocFN0YXRlRGF0YS0+bV9wRm9udC0+R2V0Rm9udERpY3QoKSk7CisgICAgfQorICAgIHBTdGF0ZURhdGEtPm1fcERvY3VtZW50ID0gcEZvbnQgPyBwRm9udC0+bV9wRG9jdW1lbnQgOiBOVUxMOworICAgIHBTdGF0ZURhdGEtPm1fcEZvbnQgPSBwRm9udDsKKyAgfQorfQorRlhfRkxPQVQgQ1BERl9UZXh0U3RhdGU6OkdldEZvbnRTaXplVigpIGNvbnN0IHsKKyAgRlhfRkxPQVQqIHBNYXRyaXggPSBHZXRNYXRyaXgoKTsKKyAgRlhfRkxPQVQgdW5pdCA9IEZYU1lTX3NxcnQyKHBNYXRyaXhbMV0sIHBNYXRyaXhbM10pOworICBGWF9GTE9BVCBzaXplID0gRlhTWVNfTXVsKHVuaXQsIEdldEZvbnRTaXplKCkpOworICByZXR1cm4gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMoc2l6ZSk7Cit9CitGWF9GTE9BVCBDUERGX1RleHRTdGF0ZTo6R2V0Rm9udFNpemVIKCkgY29uc3QgeworICBGWF9GTE9BVCogcE1hdHJpeCA9IEdldE1hdHJpeCgpOworICBGWF9GTE9BVCB1bml0ID0gRlhTWVNfc3FydDIocE1hdHJpeFswXSwgcE1hdHJpeFsyXSk7CisgIEZYX0ZMT0FUIHNpemUgPSBGWFNZU19NdWwodW5pdCwgR2V0Rm9udFNpemUoKSk7CisgIHJldHVybiAoRlhfRkxPQVQpRlhTWVNfZmFicyhzaXplKTsKK30KK0ZYX0ZMT0FUIENQREZfVGV4dFN0YXRlOjpHZXRCYXNlbGluZUFuZ2xlKCkgY29uc3QgeworICBGWF9GTE9BVCogbV9NYXRyaXggPSBHZXRNYXRyaXgoKTsKKyAgcmV0dXJuIEZYU1lTX2F0YW4yKG1fTWF0cml4WzJdLCBtX01hdHJpeFswXSk7Cit9CitGWF9GTE9BVCBDUERGX1RleHRTdGF0ZTo6R2V0U2hlYXJBbmdsZSgpIGNvbnN0IHsKKyAgRlhfRkxPQVQqIG1fTWF0cml4ID0gR2V0TWF0cml4KCk7CisgIEZYX0ZMT0FUIHNoZWFyX2FuZ2xlID0gRlhTWVNfYXRhbjIobV9NYXRyaXhbMV0sIG1fTWF0cml4WzNdKTsKKyAgcmV0dXJuIEdldEJhc2VsaW5lQW5nbGUoKSArIHNoZWFyX2FuZ2xlOworfQorQ1BERl9HZW5lcmFsU3RhdGVEYXRhOjpDUERGX0dlbmVyYWxTdGF0ZURhdGEoKSB7CisgIEZYU1lTX21lbXNldCh0aGlzLCAwLCBzaXplb2YoQ1BERl9HZW5lcmFsU3RhdGVEYXRhKSk7CisgIEZYU1lTX3N0cmNweSgoRlhfQ0hBUiopbV9CbGVuZE1vZGUsICJOb3JtYWwiKTsKKyAgbV9TdHJva2VBbHBoYSA9IDEuMGY7CisgIG1fRmlsbEFscGhhID0gMS4wZjsKKyAgbV9GbGF0bmVzcyA9IDEuMGY7CisgIG1fTWF0cml4LlNldElkZW50aXR5KCk7Cit9CitDUERGX0dlbmVyYWxTdGF0ZURhdGE6OkNQREZfR2VuZXJhbFN0YXRlRGF0YShjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEmIHNyYykgeworICBGWFNZU19tZW1jcHkodGhpcywgJnNyYywgc2l6ZW9mKENQREZfR2VuZXJhbFN0YXRlRGF0YSkpOworICBpZiAoc3JjLm1fcFRyYW5zZmVyRnVuYyAmJiBzcmMubV9wVHJhbnNmZXJGdW5jLT5tX3BQREZEb2MpIHsKKyAgICBDUERGX0RvY1JlbmRlckRhdGEqIHBEb2NDYWNoZSA9CisgICAgICAgIHNyYy5tX3BUcmFuc2ZlckZ1bmMtPm1fcFBERkRvYy0+R2V0UmVuZGVyRGF0YSgpOworICAgIGlmICghcERvY0NhY2hlKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG1fcFRyYW5zZmVyRnVuYyA9IHBEb2NDYWNoZS0+R2V0VHJhbnNmZXJGdW5jKG1fcFRSKTsKKyAgfQorfQorQ1BERl9HZW5lcmFsU3RhdGVEYXRhOjp+Q1BERl9HZW5lcmFsU3RhdGVEYXRhKCkgeworICBpZiAobV9wVHJhbnNmZXJGdW5jICYmIG1fcFRyYW5zZmVyRnVuYy0+bV9wUERGRG9jKSB7CisgICAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBwRG9jQ2FjaGUgPSBtX3BUcmFuc2ZlckZ1bmMtPm1fcFBERkRvYy0+R2V0UmVuZGVyRGF0YSgpOworICAgIGlmICghcERvY0NhY2hlKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHBEb2NDYWNoZS0+UmVsZWFzZVRyYW5zZmVyRnVuYyhtX3BUUik7CisgIH0KK30KK3N0YXRpYyBpbnQgR2V0QmxlbmRUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbW9kZSkgeworICBzd2l0Y2ggKG1vZGUuR2V0SUQoKSkgeworICAgIGNhc2UgRlhCU1RSX0lEKCdOJywgJ28nLCAncicsICdtJyk6CisgICAgY2FzZSBGWEJTVFJfSUQoJ0MnLCAnbycsICdtJywgJ3AnKToKKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9OT1JNQUw7CisgICAgY2FzZSBGWEJTVFJfSUQoJ00nLCAndScsICdsJywgJ3QnKToKKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9NVUxUSVBMWTsKKyAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdjJywgJ3InLCAnZScpOgorICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX1NDUkVFTjsKKyAgICBjYXNlIEZYQlNUUl9JRCgnTycsICd2JywgJ2UnLCAncicpOgorICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX09WRVJMQVk7CisgICAgY2FzZSBGWEJTVFJfSUQoJ0QnLCAnYScsICdyJywgJ2snKToKKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9EQVJLRU47CisgICAgY2FzZSBGWEJTVFJfSUQoJ0wnLCAnaScsICdnJywgJ2gnKToKKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9MSUdIVEVOOworICAgIGNhc2UgRlhCU1RSX0lEKCdDJywgJ28nLCAnbCcsICdvJyk6CisgICAgICBpZiAobW9kZS5HZXRMZW5ndGgoKSA9PSAxMCkgeworICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfQ09MT1JET0RHRTsKKyAgICAgIH0KKyAgICAgIGlmIChtb2RlLkdldExlbmd0aCgpID09IDkpIHsKKyAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX0NPTE9SQlVSTjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9DT0xPUjsKKyAgICBjYXNlIEZYQlNUUl9JRCgnSCcsICdhJywgJ3InLCAnZCcpOgorICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX0hBUkRMSUdIVDsKKyAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdvJywgJ2YnLCAndCcpOgorICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX1NPRlRMSUdIVDsKKyAgICBjYXNlIEZYQlNUUl9JRCgnRCcsICdpJywgJ2YnLCAnZicpOgorICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX0RJRkZFUkVOQ0U7CisgICAgY2FzZSBGWEJTVFJfSUQoJ0UnLCAneCcsICdjJywgJ2wnKToKKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9FWENMVVNJT047CisgICAgY2FzZSBGWEJTVFJfSUQoJ0gnLCAndScsICdlJywgMCk6CisgICAgICByZXR1cm4gRlhESUJfQkxFTkRfSFVFOworICAgIGNhc2UgRlhCU1RSX0lEKCdTJywgJ2EnLCAndCcsICd1Jyk6CisgICAgICByZXR1cm4gRlhESUJfQkxFTkRfU0FUVVJBVElPTjsKKyAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICd1JywgJ20nLCAnaScpOgorICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX0xVTUlOT1NJVFk7CisgIH0KKyAgcmV0dXJuIEZYRElCX0JMRU5EX05PUk1BTDsKK30KK3ZvaWQgQ1BERl9HZW5lcmFsU3RhdGVEYXRhOjpTZXRCbGVuZE1vZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBibGVuZF9tb2RlKSB7CisgIGlmIChibGVuZF9tb2RlLkdldExlbmd0aCgpID4gMTUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhTWVNfbWVtY3B5KG1fQmxlbmRNb2RlLCBibGVuZF9tb2RlLkdldFB0cigpLCBibGVuZF9tb2RlLkdldExlbmd0aCgpKTsKKyAgbV9CbGVuZE1vZGVbYmxlbmRfbW9kZS5HZXRMZW5ndGgoKV0gPSAwOworICBtX0JsZW5kVHlwZSA9IDo6R2V0QmxlbmRUeXBlKGJsZW5kX21vZGUpOworfQoraW50IFJJX1N0cmluZ1RvSWQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHJpKSB7CisgIEZYX0RXT1JEIGlkID0gcmkuR2V0SUQoKTsKKyAgaWYgKGlkID09IEZYQlNUUl9JRCgnQScsICdiJywgJ3MnLCAnbycpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGlkID09IEZYQlNUUl9JRCgnUycsICdhJywgJ3QnLCAndScpKSB7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgaWYgKGlkID09IEZYQlNUUl9JRCgnUCcsICdlJywgJ3InLCAnYycpKSB7CisgICAgcmV0dXJuIDM7CisgIH0KKyAgcmV0dXJuIDA7Cit9Cit2b2lkIENQREZfR2VuZXJhbFN0YXRlOjpTZXRSZW5kZXJJbnRlbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHJpKSB7CisgIEdldE1vZGlmeSgpLT5tX1JlbmRlckludGVudCA9IFJJX1N0cmluZ1RvSWQocmkpOworfQorQ1BERl9BbGxTdGF0ZXM6OkNQREZfQWxsU3RhdGVzKCkgeworICBtX1RleHRYID0gbV9UZXh0WSA9IG1fVGV4dExpbmVYID0gbV9UZXh0TGluZVkgPSAwOworICBtX1RleHRMZWFkaW5nID0gMDsKKyAgbV9UZXh0UmlzZSA9IDA7CisgIG1fVGV4dEhvcnpTY2FsZSA9IDEuMGY7Cit9CitDUERGX0FsbFN0YXRlczo6fkNQREZfQWxsU3RhdGVzKCkge30KK3ZvaWQgQ1BERl9BbGxTdGF0ZXM6OkNvcHkoY29uc3QgQ1BERl9BbGxTdGF0ZXMmIHNyYykgeworICBDb3B5U3RhdGVzKHNyYyk7CisgIG1fVGV4dE1hdHJpeC5Db3B5KHNyYy5tX1RleHRNYXRyaXgpOworICBtX1BhcmVudE1hdHJpeC5Db3B5KHNyYy5tX1BhcmVudE1hdHJpeCk7CisgIG1fQ1RNLkNvcHkoc3JjLm1fQ1RNKTsKKyAgbV9UZXh0WCA9IHNyYy5tX1RleHRYOworICBtX1RleHRZID0gc3JjLm1fVGV4dFk7CisgIG1fVGV4dExpbmVYID0gc3JjLm1fVGV4dExpbmVYOworICBtX1RleHRMaW5lWSA9IHNyYy5tX1RleHRMaW5lWTsKKyAgbV9UZXh0TGVhZGluZyA9IHNyYy5tX1RleHRMZWFkaW5nOworICBtX1RleHRSaXNlID0gc3JjLm1fVGV4dFJpc2U7CisgIG1fVGV4dEhvcnpTY2FsZSA9IHNyYy5tX1RleHRIb3J6U2NhbGU7Cit9Cit2b2lkIENQREZfQWxsU3RhdGVzOjpTZXRMaW5lRGFzaChDUERGX0FycmF5KiBwQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwaGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHNjYWxlKSB7CisgIENGWF9HcmFwaFN0YXRlRGF0YSogcERhdGEgPSBtX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCk7CisgIHBEYXRhLT5tX0Rhc2hQaGFzZSA9IEZYU1lTX011bChwaGFzZSwgc2NhbGUpOworICBwRGF0YS0+U2V0RGFzaENvdW50KHBBcnJheS0+R2V0Q291bnQoKSk7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgIHBEYXRhLT5tX0Rhc2hBcnJheVtpXSA9IEZYU1lTX011bChwQXJyYXktPkdldE51bWJlcihpKSwgc2NhbGUpOworICB9Cit9Cit2b2lkIENQREZfQWxsU3RhdGVzOjpQcm9jZXNzRXh0R1MoQ1BERl9EaWN0aW9uYXJ5KiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyKiBwUGFyc2VyKSB7CisgIENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxTdGF0ZSA9IG1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpOworICBGWF9QT1NJVElPTiBwb3MgPSBwR1MtPkdldFN0YXJ0UG9zKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBrZXlfc3RyOworICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBHUy0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXlfc3RyKTsKKyAgICBDUERGX09iamVjdCogcE9iamVjdCA9IHBFbGVtZW50ID8gcEVsZW1lbnQtPkdldERpcmVjdCgpIDogTlVMTDsKKyAgICBpZiAocE9iamVjdCA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgRlhfRFdPUkQga2V5ID0ga2V5X3N0ci5HZXRJRCgpOworICAgIHN3aXRjaCAoa2V5KSB7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICdXJywgMCwgMCk6CisgICAgICAgIG1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKS0+bV9MaW5lV2lkdGggPSBwT2JqZWN0LT5HZXROdW1iZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICdDJywgMCwgMCk6CisgICAgICAgIG1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKS0+bV9MaW5lQ2FwID0KKyAgICAgICAgICAgIChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXApcE9iamVjdC0+R2V0SW50ZWdlcigpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdMJywgJ0onLCAwLCAwKToKKyAgICAgICAgbV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpLT5tX0xpbmVKb2luID0KKyAgICAgICAgICAgIChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luKXBPYmplY3QtPkdldEludGVnZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnTScsICdMJywgMCwgMCk6CisgICAgICAgIG1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKS0+bV9NaXRlckxpbWl0ID0gcE9iamVjdC0+R2V0TnVtYmVyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0QnLCAwLCAwLCAwKTogeworICAgICAgICBpZiAocE9iamVjdC0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgeworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9UZXh0T2JqZWN0KiogcE5ld0xpc3QgPSBGWF9BbGxvYyhDUERGX1RleHRPYmplY3QqLCBwRGF0YS0+bV9UZXh0Q291bnQgKyBjb3VudCArIDEpOwotICAgIGlmIChwRGF0YS0+bV9wVGV4dExpc3QpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KHBOZXdMaXN0LCBwRGF0YS0+bV9wVGV4dExpc3QsIHBEYXRhLT5tX1RleHRDb3VudCAqIHNpemVvZihDUERGX1RleHRPYmplY3QqKSk7Ci0gICAgICAgIEZYX0ZyZWUocERhdGEtPm1fcFRleHRMaXN0KTsKLSAgICB9Ci0gICAgcERhdGEtPm1fcFRleHRMaXN0ID0gcE5ld0xpc3Q7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBwRGF0YS0+bV9wVGV4dExpc3RbcERhdGEtPm1fVGV4dENvdW50ICsgaV0gPSBwVGV4dHNbaV07Ci0gICAgfQotICAgIHBEYXRhLT5tX3BUZXh0TGlzdFtwRGF0YS0+bV9UZXh0Q291bnQgKyBjb3VudF0gPSBOVUxMOwotICAgIHBEYXRhLT5tX1RleHRDb3VudCArPSBjb3VudCArIDE7Ci19Ci12b2lkIENQREZfQ2xpcFBhdGg6OlRyYW5zZm9ybShjb25zdCBDUERGX01hdHJpeCYgbWF0cml4KQotewotICAgIENQREZfQ2xpcFBhdGhEYXRhKiBwRGF0YSA9IEdldE1vZGlmeSgpOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBwRGF0YS0+bV9QYXRoQ291bnQ7IGkgKyspIHsKLSAgICAgICAgcERhdGEtPm1fcFBhdGhMaXN0W2ldLlRyYW5zZm9ybSgmbWF0cml4KTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IHBEYXRhLT5tX1RleHRDb3VudDsgaSArKykKLSAgICAgICAgaWYgKHBEYXRhLT5tX3BUZXh0TGlzdFtpXSkgewotICAgICAgICAgICAgcERhdGEtPm1fcFRleHRMaXN0W2ldLT5UcmFuc2Zvcm0obWF0cml4KTsKKyAgICAgICAgQ1BERl9BcnJheSogcERhc2ggPSAoQ1BERl9BcnJheSopcE9iamVjdDsKKyAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcERhc2gtPkdldEFycmF5KDApOworICAgICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotfQotQ1BERl9Db2xvclN0YXRlRGF0YTo6Q1BERl9Db2xvclN0YXRlRGF0YShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhJiBzcmMpCi17Ci0gICAgbV9GaWxsQ29sb3IuQ29weSgmc3JjLm1fRmlsbENvbG9yKTsKLSAgICBtX0ZpbGxSR0IgPSBzcmMubV9GaWxsUkdCOwotICAgIG1fU3Ryb2tlQ29sb3IuQ29weSgmc3JjLm1fU3Ryb2tlQ29sb3IpOwotICAgIG1fU3Ryb2tlUkdCID0gc3JjLm1fU3Ryb2tlUkdCOwotfQotdm9pZCBDUERGX0NvbG9yU3RhdGVEYXRhOjpEZWZhdWx0KCkKLXsKLSAgICBtX0ZpbGxSR0IgPSBtX1N0cm9rZVJHQiA9IDA7Ci0gICAgbV9GaWxsQ29sb3IuU2V0Q29sb3JTcGFjZShDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSkpOwotICAgIG1fU3Ryb2tlQ29sb3IuU2V0Q29sb3JTcGFjZShDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSkpOwotfQotdm9pZCBDUERGX0NvbG9yU3RhdGU6OlNldEZpbGxDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpCi17Ci0gICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKLSAgICBTZXRDb2xvcihwRGF0YS0+bV9GaWxsQ29sb3IsIHBEYXRhLT5tX0ZpbGxSR0IsIHBDUywgcFZhbHVlLCBuVmFsdWVzKTsKLX0KLXZvaWQgQ1BERl9Db2xvclN0YXRlOjpTZXRTdHJva2VDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpCi17Ci0gICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKLSAgICBTZXRDb2xvcihwRGF0YS0+bV9TdHJva2VDb2xvciwgcERhdGEtPm1fU3Ryb2tlUkdCLCBwQ1MsIHBWYWx1ZSwgblZhbHVlcyk7Ci19Ci12b2lkIENQREZfQ29sb3JTdGF0ZTo6U2V0Q29sb3IoQ1BERl9Db2xvciYgY29sb3IsIEZYX0RXT1JEJiByZ2IsIENQREZfQ29sb3JTcGFjZSogcENTLCBGWF9GTE9BVCogcFZhbHVlLCBpbnQgblZhbHVlcykKLXsKLSAgICBpZiAocENTKSB7Ci0gICAgICAgIGNvbG9yLlNldENvbG9yU3BhY2UocENTKTsKLSAgICB9IGVsc2UgaWYgKGNvbG9yLklzTnVsbCgpKSB7Ci0gICAgICAgIGNvbG9yLlNldENvbG9yU3BhY2UoQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpKTsKLSAgICB9Ci0gICAgaWYgKGNvbG9yLm1fcENTLT5Db3VudENvbXBvbmVudHMoKSA+IG5WYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjb2xvci5TZXRWYWx1ZShwVmFsdWUpOwotICAgIGludCBSLCBHLCBCOwotICAgIHJnYiA9IGNvbG9yLkdldFJHQihSLCBHLCBCKSA/IEZYU1lTX1JHQihSLCBHLCBCKSA6IChGWF9EV09SRCkgLSAxOwotfQotdm9pZCBDUERGX0NvbG9yU3RhdGU6OlNldEZpbGxQYXR0ZXJuKENQREZfUGF0dGVybiogcFBhdHRlcm4sIEZYX0ZMT0FUKiBwVmFsdWUsIGludCBuVmFsdWVzKQotewotICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7Ci0gICAgcERhdGEtPm1fRmlsbENvbG9yLlNldFZhbHVlKHBQYXR0ZXJuLCBwVmFsdWUsIG5WYWx1ZXMpOwotICAgIGludCBSLCBHLCBCOwotICAgIEZYX0JPT0wgcmV0ID0gcERhdGEtPm1fRmlsbENvbG9yLkdldFJHQihSLCBHLCBCKTsKLSAgICBpZiAocFBhdHRlcm4tPm1fUGF0dGVyblR5cGUgPT0gMSAmJiAoKENQREZfVGlsaW5nUGF0dGVybiopcFBhdHRlcm4pLT5tX2JDb2xvcmVkICYmICFyZXQpIHsKLSAgICAgICAgcERhdGEtPm1fRmlsbFJHQiA9IDB4MDBCRkJGQkY7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcERhdGEtPm1fRmlsbFJHQiA9IHJldCA/IEZYU1lTX1JHQihSLCBHLCBCKSA6IChGWF9EV09SRCkgLSAxOwotfQotdm9pZCBDUERGX0NvbG9yU3RhdGU6OlNldFN0cm9rZVBhdHRlcm4oQ1BERl9QYXR0ZXJuKiBwUGF0dGVybiwgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpCi17Ci0gICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKLSAgICBwRGF0YS0+bV9TdHJva2VDb2xvci5TZXRWYWx1ZShwUGF0dGVybiwgcFZhbHVlLCBuVmFsdWVzKTsKLSAgICBpbnQgUiwgRywgQjsKLSAgICBGWF9CT09MIHJldCA9IHBEYXRhLT5tX1N0cm9rZUNvbG9yLkdldFJHQihSLCBHLCBCKTsKLSAgICBpZiAocFBhdHRlcm4tPm1fUGF0dGVyblR5cGUgPT0gMSAmJiAoKENQREZfVGlsaW5nUGF0dGVybiopcFBhdHRlcm4pLT5tX2JDb2xvcmVkICYmICFyZXQpIHsKLSAgICAgICAgcERhdGEtPm1fU3Ryb2tlUkdCID0gMHgwMEJGQkZCRjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwRGF0YS0+bV9TdHJva2VSR0IgPSBwRGF0YS0+bV9TdHJva2VDb2xvci5HZXRSR0IoUiwgRywgQikgPyBGWFNZU19SR0IoUiwgRywgQikgOiAoRlhfRFdPUkQpIC0gMTsKLX0KLUNQREZfVGV4dFN0YXRlRGF0YTo6Q1BERl9UZXh0U3RhdGVEYXRhKCkKLXsKLSAgICBtX3BGb250ID0gTlVMTDsKLSAgICBtX3BEb2N1bWVudCA9IE5VTEw7Ci0gICAgbV9Gb250U2l6ZSA9IDEuMGY7Ci0gICAgbV9Xb3JkU3BhY2UgPSAwOwotICAgIG1fQ2hhclNwYWNlID0gMDsKLSAgICBtX1RleHRNb2RlID0gMDsKLSAgICBtX01hdHJpeFswXSA9IG1fTWF0cml4WzNdID0gMS4wZjsKLSAgICBtX01hdHJpeFsxXSA9IG1fTWF0cml4WzJdID0gMDsKLSAgICBtX0NUTVswXSA9IG1fQ1RNWzNdID0gMS4wZjsKLSAgICBtX0NUTVsxXSA9IG1fQ1RNWzJdID0gMDsKLX0KLUNQREZfVGV4dFN0YXRlRGF0YTo6Q1BERl9UZXh0U3RhdGVEYXRhKGNvbnN0IENQREZfVGV4dFN0YXRlRGF0YSYgc3JjKQotewotICAgIGlmICh0aGlzID09ICZzcmMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU19tZW1jcHkodGhpcywgJnNyYywgc2l6ZW9mKENQREZfVGV4dFN0YXRlRGF0YSkpOwotICAgIGlmIChtX3BEb2N1bWVudCAmJiBtX3BGb250KSB7Ci0gICAgICAgIG1fcEZvbnQgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChtX3BGb250LT5HZXRGb250RGljdCgpLCBGQUxTRSk7Ci0gICAgfQotfQotQ1BERl9UZXh0U3RhdGVEYXRhOjp+Q1BERl9UZXh0U3RhdGVEYXRhKCkKLXsKLSAgICBpZiAobV9wRG9jdW1lbnQgJiYgbV9wRm9udCkgewotICAgICAgICBDUERGX0RvY1BhZ2VEYXRhICpwUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKLSAgICAgICAgaWYgKHBQYWdlRGF0YSAmJiAhcFBhZ2VEYXRhLT5Jc0ZvcmNlQ2xlYXIoKSkgewotICAgICAgICAgICAgcFBhZ2VEYXRhLT5SZWxlYXNlRm9udChtX3BGb250LT5HZXRGb250RGljdCgpKTsKKyAgICAgICAgU2V0TGluZURhc2gocEFycmF5LCBwRGFzaC0+R2V0TnVtYmVyKDEpLCAxLjBmKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEZYQlNUUl9JRCgnUicsICdJJywgMCwgMCk6CisgICAgICAgIG1fR2VuZXJhbFN0YXRlLlNldFJlbmRlckludGVudChwT2JqZWN0LT5HZXRTdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0YnLCAnbycsICduJywgJ3QnKTogeworICAgICAgICBpZiAocE9iamVjdC0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgeworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBDUERGX1RleHRTdGF0ZTo6U2V0Rm9udChDUERGX0ZvbnQqIHBGb250KQotewotICAgIENQREZfVGV4dFN0YXRlRGF0YSogcFN0YXRlRGF0YSA9IEdldE1vZGlmeSgpOwotICAgIGlmIChwU3RhdGVEYXRhKSB7Ci0gICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBwU3RhdGVEYXRhLT5tX3BEb2N1bWVudDsKLSAgICAgICAgQ1BERl9Eb2NQYWdlRGF0YSAqcFBhZ2VEYXRhID0gcERvYyA/IHBEb2MtPkdldFBhZ2VEYXRhKCkgOiBOVUxMOwotICAgICAgICBpZiAocFBhZ2VEYXRhICYmIHBTdGF0ZURhdGEtPm1fcEZvbnQgJiYgIXBQYWdlRGF0YS0+SXNGb3JjZUNsZWFyKCkpIHsKLSAgICAgICAgICAgIHBQYWdlRGF0YS0+UmVsZWFzZUZvbnQocFN0YXRlRGF0YS0+bV9wRm9udC0+R2V0Rm9udERpY3QoKSk7CisgICAgICAgIENQREZfQXJyYXkqIHBGb250ID0gKENQREZfQXJyYXkqKXBPYmplY3Q7CisgICAgICAgIG1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX0ZvbnRTaXplID0gcEZvbnQtPkdldE51bWJlcigxKTsKKyAgICAgICAgbV9UZXh0U3RhdGUuU2V0Rm9udChwUGFyc2VyLT5GaW5kRm9udChwRm9udC0+R2V0U3RyaW5nKDApKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGWEJTVFJfSUQoJ1QnLCAnUicsIDAsIDApOgorICAgICAgICBpZiAocEdTLT5LZXlFeGlzdChGWF9CU1RSQygiVFIyIikpKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgcFN0YXRlRGF0YS0+bV9wRG9jdW1lbnQgPSBwRm9udCA/IHBGb250LT5tX3BEb2N1bWVudCA6IE5VTEw7Ci0gICAgICAgIHBTdGF0ZURhdGEtPm1fcEZvbnQgPSBwRm9udDsKLSAgICB9Ci19Ci1GWF9GTE9BVCBDUERGX1RleHRTdGF0ZTo6R2V0Rm9udFNpemVWKCkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCogcE1hdHJpeCA9IEdldE1hdHJpeCgpOwotICAgIEZYX0ZMT0FUIHVuaXQgPSBGWFNZU19zcXJ0MihwTWF0cml4WzFdLCBwTWF0cml4WzNdKTsKLSAgICBGWF9GTE9BVCBzaXplID0gRlhTWVNfTXVsKHVuaXQsIEdldEZvbnRTaXplKCkpOwotICAgIHJldHVybiAoRlhfRkxPQVQpRlhTWVNfZmFicyhzaXplKTsKLX0KLUZYX0ZMT0FUIENQREZfVGV4dFN0YXRlOjpHZXRGb250U2l6ZUgoKSBjb25zdAotewotICAgIEZYX0ZMT0FUKiBwTWF0cml4ID0gR2V0TWF0cml4KCk7Ci0gICAgRlhfRkxPQVQgdW5pdCA9IEZYU1lTX3NxcnQyKHBNYXRyaXhbMF0sIHBNYXRyaXhbMl0pOwotICAgIEZYX0ZMT0FUIHNpemUgPSBGWFNZU19NdWwodW5pdCwgR2V0Rm9udFNpemUoKSk7Ci0gICAgcmV0dXJuIChGWF9GTE9BVClGWFNZU19mYWJzKHNpemUpOwotfQotRlhfRkxPQVQgQ1BERl9UZXh0U3RhdGU6OkdldEJhc2VsaW5lQW5nbGUoKSBjb25zdAotewotICAgIEZYX0ZMT0FUKiBtX01hdHJpeCA9IEdldE1hdHJpeCgpOwotICAgIHJldHVybiBGWFNZU19hdGFuMihtX01hdHJpeFsyXSwgbV9NYXRyaXhbMF0pOwotfQotRlhfRkxPQVQgQ1BERl9UZXh0U3RhdGU6OkdldFNoZWFyQW5nbGUoKSBjb25zdAotewotICAgIEZYX0ZMT0FUKiBtX01hdHJpeCA9IEdldE1hdHJpeCgpOwotICAgIEZYX0ZMT0FUIHNoZWFyX2FuZ2xlID0gRlhTWVNfYXRhbjIobV9NYXRyaXhbMV0sIG1fTWF0cml4WzNdKTsKLSAgICByZXR1cm4gR2V0QmFzZWxpbmVBbmdsZSgpICsgc2hlYXJfYW5nbGU7Ci19Ci1DUERGX0dlbmVyYWxTdGF0ZURhdGE6OkNQREZfR2VuZXJhbFN0YXRlRGF0YSgpCi17Ci0gICAgRlhTWVNfbWVtc2V0KHRoaXMsIDAsIHNpemVvZihDUERGX0dlbmVyYWxTdGF0ZURhdGEpKTsKLSAgICBGWFNZU19zdHJjcHkoKEZYX0NIQVIqKW1fQmxlbmRNb2RlLCAiTm9ybWFsIik7Ci0gICAgbV9TdHJva2VBbHBoYSA9IDEuMGY7Ci0gICAgbV9GaWxsQWxwaGEgPSAxLjBmOwotICAgIG1fRmxhdG5lc3MgPSAxLjBmOwotICAgIG1fTWF0cml4LlNldElkZW50aXR5KCk7Ci19Ci1DUERGX0dlbmVyYWxTdGF0ZURhdGE6OkNQREZfR2VuZXJhbFN0YXRlRGF0YShjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEmIHNyYykKLXsKLSAgICBGWFNZU19tZW1jcHkodGhpcywgJnNyYywgc2l6ZW9mKENQREZfR2VuZXJhbFN0YXRlRGF0YSkpOwotICAgIGlmIChzcmMubV9wVHJhbnNmZXJGdW5jICYmIHNyYy5tX3BUcmFuc2ZlckZ1bmMtPm1fcFBERkRvYykgewotICAgICAgICBDUERGX0RvY1JlbmRlckRhdGEqIHBEb2NDYWNoZSA9IHNyYy5tX3BUcmFuc2ZlckZ1bmMtPm1fcFBERkRvYy0+R2V0UmVuZGVyRGF0YSgpOwotICAgICAgICBpZiAoIXBEb2NDYWNoZSkgewotICAgICAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ1QnLCAnUicsICcyJywgMCk6CisgICAgICAgIGlmIChwT2JqZWN0ICYmIHBPYmplY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfTkFNRSkgeworICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcFRSID0gcE9iamVjdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX3BUUiA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgbV9wVHJhbnNmZXJGdW5jID0gcERvY0NhY2hlLT5HZXRUcmFuc2ZlckZ1bmMobV9wVFIpOwotICAgIH0KLX0KLUNQREZfR2VuZXJhbFN0YXRlRGF0YTo6fkNQREZfR2VuZXJhbFN0YXRlRGF0YSgpCi17Ci0gICAgaWYgKG1fcFRyYW5zZmVyRnVuYyAmJiBtX3BUcmFuc2ZlckZ1bmMtPm1fcFBERkRvYykgewotICAgICAgICBDUERGX0RvY1JlbmRlckRhdGEqIHBEb2NDYWNoZSA9IG1fcFRyYW5zZmVyRnVuYy0+bV9wUERGRG9jLT5HZXRSZW5kZXJEYXRhKCk7Ci0gICAgICAgIGlmICghcERvY0NhY2hlKSB7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0InLCAnTScsIDAsIDApOiB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIG1vZGU7CisgICAgICAgIGlmIChwT2JqZWN0LT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgICAgICAgbW9kZSA9ICgoQ1BERl9BcnJheSopcE9iamVjdCktPkdldFN0cmluZygwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtb2RlID0gcE9iamVjdC0+R2V0U3RyaW5nKCk7CiAgICAgICAgIH0KLSAgICAgICAgcERvY0NhY2hlLT5SZWxlYXNlVHJhbnNmZXJGdW5jKG1fcFRSKTsKLSAgICB9Ci19Ci1zdGF0aWMgaW50IEdldEJsZW5kVHlwZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1vZGUpCi17Ci0gICAgc3dpdGNoIChtb2RlLkdldElEKCkpIHsKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ04nLCAnbycsICdyJywgJ20nKToKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0MnLCAnbycsICdtJywgJ3AnKToKLSAgICAgICAgICAgIHJldHVybiBGWERJQl9CTEVORF9OT1JNQUw7Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdNJywgJ3UnLCAnbCcsICd0Jyk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfTVVMVElQTFk7Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdTJywgJ2MnLCAncicsICdlJyk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfU0NSRUVOOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTycsICd2JywgJ2UnLCAncicpOgotICAgICAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX09WRVJMQVk7Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdEJywgJ2EnLCAncicsICdrJyk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfREFSS0VOOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICdpJywgJ2cnLCAnaCcpOgotICAgICAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX0xJR0hURU47Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdDJywgJ28nLCAnbCcsICdvJyk6Ci0gICAgICAgICAgICBpZiAobW9kZS5HZXRMZW5ndGgoKSA9PSAxMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGWERJQl9CTEVORF9DT0xPUkRPREdFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1vZGUuR2V0TGVuZ3RoKCkgPT0gOSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGWERJQl9CTEVORF9DT0xPUkJVUk47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfQ09MT1I7Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdIJywgJ2EnLCAncicsICdkJyk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfSEFSRExJR0hUOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdvJywgJ2YnLCAndCcpOgotICAgICAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX1NPRlRMSUdIVDsKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0QnLCAnaScsICdmJywgJ2YnKToKLSAgICAgICAgICAgIHJldHVybiBGWERJQl9CTEVORF9ESUZGRVJFTkNFOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnRScsICd4JywgJ2MnLCAnbCcpOgotICAgICAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX0VYQ0xVU0lPTjsKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0gnLCAndScsICdlJywgMCk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfSFVFOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdhJywgJ3QnLCAndScpOgotICAgICAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX1NBVFVSQVRJT047Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdMJywgJ3UnLCAnbScsICdpJyk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfTFVNSU5PU0lUWTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYRElCX0JMRU5EX05PUk1BTDsKLX0KLXZvaWQgQ1BERl9HZW5lcmFsU3RhdGVEYXRhOjpTZXRCbGVuZE1vZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBibGVuZF9tb2RlKQotewotICAgIGlmIChibGVuZF9tb2RlLkdldExlbmd0aCgpID4gMTUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU19tZW1jcHkobV9CbGVuZE1vZGUsIGJsZW5kX21vZGUuR2V0UHRyKCksIGJsZW5kX21vZGUuR2V0TGVuZ3RoKCkpOwotICAgIG1fQmxlbmRNb2RlW2JsZW5kX21vZGUuR2V0TGVuZ3RoKCldID0gMDsKLSAgICBtX0JsZW5kVHlwZSA9IDo6R2V0QmxlbmRUeXBlKGJsZW5kX21vZGUpOwotfQotaW50IFJJX1N0cmluZ1RvSWQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHJpKQotewotICAgIEZYX0RXT1JEIGlkID0gcmkuR2V0SUQoKTsKLSAgICBpZiAoaWQgPT0gRlhCU1RSX0lEKCdBJywgJ2InLCAncycsICdvJykpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChpZCA9PSBGWEJTVFJfSUQoJ1MnLCAnYScsICd0JywgJ3UnKSkgewotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgaWYgKGlkID09IEZYQlNUUl9JRCgnUCcsICdlJywgJ3InLCAnYycpKSB7Ci0gICAgICAgIHJldHVybiAzOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLXZvaWQgQ1BERl9HZW5lcmFsU3RhdGU6OlNldFJlbmRlckludGVudChjb25zdCBDRlhfQnl0ZVN0cmluZyYgcmkpCi17Ci0gICAgR2V0TW9kaWZ5KCktPm1fUmVuZGVySW50ZW50ID0gUklfU3RyaW5nVG9JZChyaSk7Ci19Ci1DUERGX0FsbFN0YXRlczo6Q1BERl9BbGxTdGF0ZXMoKQotewotICAgIG1fVGV4dFggPSBtX1RleHRZID0gbV9UZXh0TGluZVggPSBtX1RleHRMaW5lWSA9IDA7Ci0gICAgbV9UZXh0TGVhZGluZyA9IDA7Ci0gICAgbV9UZXh0UmlzZSA9IDA7Ci0gICAgbV9UZXh0SG9yelNjYWxlID0gMS4wZjsKLX0KLUNQREZfQWxsU3RhdGVzOjp+Q1BERl9BbGxTdGF0ZXMoKQotewotfQotdm9pZCBDUERGX0FsbFN0YXRlczo6Q29weShjb25zdCBDUERGX0FsbFN0YXRlcyYgc3JjKQotewotICAgIENvcHlTdGF0ZXMoc3JjKTsKLSAgICBtX1RleHRNYXRyaXguQ29weShzcmMubV9UZXh0TWF0cml4KTsKLSAgICBtX1BhcmVudE1hdHJpeC5Db3B5KHNyYy5tX1BhcmVudE1hdHJpeCk7Ci0gICAgbV9DVE0uQ29weShzcmMubV9DVE0pOwotICAgIG1fVGV4dFggPSBzcmMubV9UZXh0WDsKLSAgICBtX1RleHRZID0gc3JjLm1fVGV4dFk7Ci0gICAgbV9UZXh0TGluZVggPSBzcmMubV9UZXh0TGluZVg7Ci0gICAgbV9UZXh0TGluZVkgPSBzcmMubV9UZXh0TGluZVk7Ci0gICAgbV9UZXh0TGVhZGluZyA9IHNyYy5tX1RleHRMZWFkaW5nOwotICAgIG1fVGV4dFJpc2UgPSBzcmMubV9UZXh0UmlzZTsKLSAgICBtX1RleHRIb3J6U2NhbGUgPSBzcmMubV9UZXh0SG9yelNjYWxlOwotfQotdm9pZCBDUERGX0FsbFN0YXRlczo6U2V0TGluZURhc2goQ1BERl9BcnJheSogcEFycmF5LCBGWF9GTE9BVCBwaGFzZSwgRlhfRkxPQVQgc2NhbGUpCi17Ci0gICAgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwRGF0YSA9IG1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKTsKLSAgICBwRGF0YS0+bV9EYXNoUGhhc2UgPSBGWFNZU19NdWwocGhhc2UsIHNjYWxlKTsKLSAgICBwRGF0YS0+U2V0RGFzaENvdW50KHBBcnJheS0+R2V0Q291bnQoKSk7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICBwRGF0YS0+bV9EYXNoQXJyYXlbaV0gPSBGWFNZU19NdWwocEFycmF5LT5HZXROdW1iZXIoaSksIHNjYWxlKTsKLSAgICB9Ci19Ci12b2lkIENQREZfQWxsU3RhdGVzOjpQcm9jZXNzRXh0R1MoQ1BERl9EaWN0aW9uYXJ5KiBwR1MsIENQREZfU3RyZWFtQ29udGVudFBhcnNlciogcFBhcnNlcikKLXsKLSAgICBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsU3RhdGUgPSBtX0dlbmVyYWxTdGF0ZS5HZXRNb2RpZnkoKTsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwR1MtPkdldFN0YXJ0UG9zKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXlfc3RyOwotICAgICAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwR1MtPkdldE5leHRFbGVtZW50KHBvcywga2V5X3N0cik7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqZWN0ID0gcEVsZW1lbnQgPyBwRWxlbWVudC0+R2V0RGlyZWN0KCkgOiBOVUxMOwotICAgICAgICBpZiAocE9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcEdlbmVyYWxTdGF0ZS0+U2V0QmxlbmRNb2RlKG1vZGUpOworICAgICAgICBpZiAocEdlbmVyYWxTdGF0ZS0+bV9CbGVuZFR5cGUgPiBGWERJQl9CTEVORF9NVUxUSVBMWSkgeworICAgICAgICAgIHBQYXJzZXItPkdldE9iamVjdExpc3QoKS0+bV9iQmFja2dyb3VuZEFscGhhTmVlZGVkID0gVFJVRTsKICAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBrZXkgPSBrZXlfc3RyLkdldElEKCk7Ci0gICAgICAgIHN3aXRjaCAoa2V5KSB7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICdXJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgbV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpLT5tX0xpbmVXaWR0aCA9IHBPYmplY3QtPkdldE51bWJlcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0wnLCAnQycsIDAsIDApOgotICAgICAgICAgICAgICAgIG1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKS0+bV9MaW5lQ2FwID0gKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcClwT2JqZWN0LT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICdKJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgbV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpLT5tX0xpbmVKb2luID0gKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW4pcE9iamVjdC0+R2V0SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ00nLCAnTCcsIDAsIDApOgotICAgICAgICAgICAgICAgIG1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKS0+bV9NaXRlckxpbWl0ID0gcE9iamVjdC0+R2V0TnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnRCcsIDAsIDAsIDApOgl7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwT2JqZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwRGFzaCA9IChDUERGX0FycmF5KilwT2JqZWN0OwotICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwRGFzaC0+R2V0QXJyYXkoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU2V0TGluZURhc2gocEFycmF5LCBwRGFzaC0+R2V0TnVtYmVyKDEpLCAxLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ1InLCAnSScsIDAsIDApOgotICAgICAgICAgICAgICAgIG1fR2VuZXJhbFN0YXRlLlNldFJlbmRlckludGVudChwT2JqZWN0LT5HZXRTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnRicsICdvJywgJ24nLCAndCcpOgl7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwT2JqZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwRm9udCA9IChDUERGX0FycmF5KilwT2JqZWN0OwotICAgICAgICAgICAgICAgICAgICBtX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9Gb250U2l6ZSA9IHBGb250LT5HZXROdW1iZXIoMSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fVGV4dFN0YXRlLlNldEZvbnQocFBhcnNlci0+RmluZEZvbnQocEZvbnQtPkdldFN0cmluZygwKSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnVCcsICdSJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgaWYgKHBHUy0+S2V5RXhpc3QoRlhfQlNUUkMoIlRSMiIpKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnVCcsICdSJywgJzInLCAwKToKLSAgICAgICAgICAgICAgICBpZiAocE9iamVjdCAmJiBwT2JqZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9wVFIgPSBwT2JqZWN0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcFRSID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnQicsICdNJywgMCwgMCk6CXsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbW9kZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBPYmplY3QtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAoKENQREZfQXJyYXkqKXBPYmplY3QpLT5HZXRTdHJpbmcoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gcE9iamVjdC0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+U2V0QmxlbmRNb2RlKG1vZGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEdlbmVyYWxTdGF0ZS0+bV9CbGVuZFR5cGUgPiBGWERJQl9CTEVORF9NVUxUSVBMWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcnNlci0+R2V0T2JqZWN0TGlzdCgpLT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdTJywgJ00nLCAnYScsICdzJyk6Ci0gICAgICAgICAgICAgICAgaWYgKHBPYmplY3QgJiYgcE9iamVjdC0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcFNvZnRNYXNrID0gcE9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHBHZW5lcmFsU3RhdGUtPm1fU01hc2tNYXRyaXgsICZwUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9DVE0sIHNpemVvZihDUERGX01hdHJpeCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcFNvZnRNYXNrID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnQycsICdBJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VBbHBoYSA9IFBERl9DbGlwRmxvYXQocE9iamVjdC0+R2V0TnVtYmVyKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ2MnLCAnYScsIDAsIDApOgotICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fRmlsbEFscGhhID0gUERGX0NsaXBGbG9hdChwT2JqZWN0LT5HZXROdW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTycsICdQJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VPUCA9IHBPYmplY3QtPkdldEludGVnZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXBHUy0+S2V5RXhpc3QoRlhfQlNUUkMoIm9wIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fRmlsbE9QID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdvJywgJ3AnLCAwLCAwKToKLSAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxPUCA9IHBPYmplY3QtPkdldEludGVnZXIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdPJywgJ1AnLCAnTScsIDApOgotICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fT1BNb2RlID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0InLCAnRycsIDAsIDApOgotICAgICAgICAgICAgICAgIGlmIChwR1MtPktleUV4aXN0KEZYX0JTVFJDKCJCRzIiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0InLCAnRycsICcyJywgMCk6Ci0gICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9wQkcgPSBwT2JqZWN0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ1UnLCAnQycsICdSJywgMCk6Ci0gICAgICAgICAgICAgICAgaWYgKHBHUy0+S2V5RXhpc3QoRlhfQlNUUkMoIlVDUjIiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ1UnLCAnQycsICdSJywgJzInKToKLSAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX3BVQ1IgPSBwT2JqZWN0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0gnLCAnVCcsIDAsIDApOgotICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcEhUID0gcE9iamVjdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdGJywgJ0wnLCAwLCAwKToKLSAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX0ZsYXRuZXNzID0gcE9iamVjdC0+R2V0TnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdNJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9TbW9vdGhuZXNzID0gcE9iamVjdC0+R2V0TnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdBJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VBZGp1c3QgPSBwT2JqZWN0LT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnQScsICdJJywgJ1MnLCAwKToKLSAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX0FscGhhU291cmNlID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ1QnLCAnSycsIDAsIDApOgotICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fVGV4dEtub2Nrb3V0ID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdTJywgJ00nLCAnYScsICdzJyk6CisgICAgICAgIGlmIChwT2JqZWN0ICYmIHBPYmplY3QtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcFNvZnRNYXNrID0gcE9iamVjdDsKKyAgICAgICAgICBGWFNZU19tZW1jcHkocEdlbmVyYWxTdGF0ZS0+bV9TTWFza01hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX0NUTSwgc2l6ZW9mKENQREZfTWF0cml4KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9wU29mdE1hc2sgPSBOVUxMOwogICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0MnLCAnQScsIDAsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX1N0cm9rZUFscGhhID0gUERGX0NsaXBGbG9hdChwT2JqZWN0LT5HZXROdW1iZXIoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ2MnLCAnYScsIDAsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxBbHBoYSA9IFBERl9DbGlwRmxvYXQocE9iamVjdC0+R2V0TnVtYmVyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdPJywgJ1AnLCAwLCAwKToKKyAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VPUCA9IHBPYmplY3QtPkdldEludGVnZXIoKTsKKyAgICAgICAgaWYgKCFwR1MtPktleUV4aXN0KEZYX0JTVFJDKCJvcCIpKSkgeworICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fRmlsbE9QID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ28nLCAncCcsIDAsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxPUCA9IHBPYmplY3QtPkdldEludGVnZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnTycsICdQJywgJ00nLCAwKToKKyAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9PUE1vZGUgPSBwT2JqZWN0LT5HZXRJbnRlZ2VyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0InLCAnRycsIDAsIDApOgorICAgICAgICBpZiAocEdTLT5LZXlFeGlzdChGWF9CU1RSQygiQkcyIikpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdCJywgJ0cnLCAnMicsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX3BCRyA9IHBPYmplY3Q7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ1UnLCAnQycsICdSJywgMCk6CisgICAgICAgIGlmIChwR1MtPktleUV4aXN0KEZYX0JTVFJDKCJVQ1IyIikpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdVJywgJ0MnLCAnUicsICcyJyk6CisgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcFVDUiA9IHBPYmplY3Q7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0gnLCAnVCcsIDAsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX3BIVCA9IHBPYmplY3Q7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0YnLCAnTCcsIDAsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX0ZsYXRuZXNzID0gcE9iamVjdC0+R2V0TnVtYmVyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ1MnLCAnTScsIDAsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX1Ntb290aG5lc3MgPSBwT2JqZWN0LT5HZXROdW1iZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdBJywgMCwgMCk6CisgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fU3Ryb2tlQWRqdXN0ID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdBJywgJ0knLCAnUycsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX0FscGhhU291cmNlID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdUJywgJ0snLCAwLCAwKToKKyAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9UZXh0S25vY2tvdXQgPSBwT2JqZWN0LT5HZXRJbnRlZ2VyKCk7CisgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBwR2VuZXJhbFN0YXRlLT5tX01hdHJpeCA9IG1fQ1RNOworICB9CisgIHBHZW5lcmFsU3RhdGUtPm1fTWF0cml4ID0gbV9DVE07CiB9Ci1DUERGX0NvbnRlbnRNYXJrSXRlbTo6Q1BERl9Db250ZW50TWFya0l0ZW0oKQotewotICAgIG1fUGFyYW1UeXBlID0gTm9uZTsKK0NQREZfQ29udGVudE1hcmtJdGVtOjpDUERGX0NvbnRlbnRNYXJrSXRlbSgpIHsKKyAgbV9QYXJhbVR5cGUgPSBOb25lOwogfQotQ1BERl9Db250ZW50TWFya0l0ZW06OkNQREZfQ29udGVudE1hcmtJdGVtKGNvbnN0IENQREZfQ29udGVudE1hcmtJdGVtJiBzcmMpCi17Ci0gICAgbV9NYXJrTmFtZSA9IHNyYy5tX01hcmtOYW1lOwotICAgIG1fUGFyYW1UeXBlID0gc3JjLm1fUGFyYW1UeXBlOwotICAgIGlmIChtX1BhcmFtVHlwZSA9PSBEaXJlY3REaWN0KSB7Ci0gICAgICAgIG1fcFBhcmFtID0gKChDUERGX0RpY3Rpb25hcnkqKXNyYy5tX3BQYXJhbSktPkNsb25lKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wUGFyYW0gPSBzcmMubV9wUGFyYW07CitDUERGX0NvbnRlbnRNYXJrSXRlbTo6Q1BERl9Db250ZW50TWFya0l0ZW0oY29uc3QgQ1BERl9Db250ZW50TWFya0l0ZW0mIHNyYykgeworICBtX01hcmtOYW1lID0gc3JjLm1fTWFya05hbWU7CisgIG1fUGFyYW1UeXBlID0gc3JjLm1fUGFyYW1UeXBlOworICBpZiAobV9QYXJhbVR5cGUgPT0gRGlyZWN0RGljdCkgeworICAgIG1fcFBhcmFtID0gKChDUERGX0RpY3Rpb25hcnkqKXNyYy5tX3BQYXJhbSktPkNsb25lKCk7CisgIH0gZWxzZSB7CisgICAgbV9wUGFyYW0gPSBzcmMubV9wUGFyYW07CisgIH0KK30KK0NQREZfQ29udGVudE1hcmtJdGVtOjp+Q1BERl9Db250ZW50TWFya0l0ZW0oKSB7CisgIGlmIChtX1BhcmFtVHlwZSA9PSBEaXJlY3REaWN0ICYmIG1fcFBhcmFtKSB7CisgICAgKChDUERGX0RpY3Rpb25hcnkqKW1fcFBhcmFtKS0+UmVsZWFzZSgpOworICB9Cit9CitGWF9CT09MIENQREZfQ29udGVudE1hcmtJdGVtOjpIYXNNQ0lEKCkgY29uc3QgeworICBpZiAobV9wUGFyYW0gJiYKKyAgICAgIChtX1BhcmFtVHlwZSA9PSBEaXJlY3REaWN0IHx8IG1fUGFyYW1UeXBlID09IFByb3BlcnRpZXNEaWN0KSkgeworICAgIHJldHVybiAoKENQREZfRGljdGlvbmFyeSopbV9wUGFyYW0pLT5LZXlFeGlzdChGWF9CU1RSQygiTUNJRCIpKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitDUERGX0NvbnRlbnRNYXJrRGF0YTo6Q1BERl9Db250ZW50TWFya0RhdGEoY29uc3QgQ1BERl9Db250ZW50TWFya0RhdGEmIHNyYykgeworICBmb3IgKGludCBpID0gMDsgaSA8IHNyYy5tX01hcmtzLkdldFNpemUoKTsgaSsrKSB7CisgICAgbV9NYXJrcy5BZGQoc3JjLm1fTWFya3NbaV0pOworICB9Cit9CitpbnQgQ1BERl9Db250ZW50TWFya0RhdGE6OkdldE1DSUQoKSBjb25zdCB7CisgIENQREZfQ29udGVudE1hcmtJdGVtOjpQYXJhbVR5cGUgdHlwZSA9IENQREZfQ29udGVudE1hcmtJdGVtOjpOb25lOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fTWFya3MuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICB0eXBlID0gbV9NYXJrc1tpXS5HZXRQYXJhbVR5cGUoKTsKKyAgICBpZiAodHlwZSA9PSBDUERGX0NvbnRlbnRNYXJrSXRlbTo6UHJvcGVydGllc0RpY3QgfHwKKyAgICAgICAgdHlwZSA9PSBDUERGX0NvbnRlbnRNYXJrSXRlbTo6RGlyZWN0RGljdCkgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKW1fTWFya3NbaV0uR2V0UGFyYW0oKTsKKyAgICAgIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIk1DSUQiKSkpIHsKKyAgICAgICAgcmV0dXJuIHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJNQ0lEIikpOworICAgICAgfQogICAgIH0KKyAgfQorICByZXR1cm4gLTE7CiB9Ci1DUERGX0NvbnRlbnRNYXJrSXRlbTo6fkNQREZfQ29udGVudE1hcmtJdGVtKCkKLXsKLSAgICBpZiAobV9QYXJhbVR5cGUgPT0gRGlyZWN0RGljdCAmJiBtX3BQYXJhbSkgewotICAgICAgICAoKENQREZfRGljdGlvbmFyeSopbV9wUGFyYW0pLT5SZWxlYXNlKCk7Ci0gICAgfQordm9pZCBDUERGX0NvbnRlbnRNYXJrRGF0YTo6QWRkTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGlyZWN0KSB7CisgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gbV9NYXJrcy5BZGQoKTsKKyAgaXRlbS5TZXROYW1lKG5hbWUpOworICBpZiAocERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpdGVtLlNldFBhcmFtKGJEaXJlY3QgPyBDUERGX0NvbnRlbnRNYXJrSXRlbTo6RGlyZWN0RGljdAorICAgICAgICAgICAgICAgICAgICAgICAgOiBDUERGX0NvbnRlbnRNYXJrSXRlbTo6UHJvcGVydGllc0RpY3QsCisgICAgICAgICAgICAgICAgYkRpcmVjdCA/IHBEaWN0LT5DbG9uZSgpIDogcERpY3QpOwogfQotRlhfQk9PTAlDUERGX0NvbnRlbnRNYXJrSXRlbTo6SGFzTUNJRCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcFBhcmFtICYmIChtX1BhcmFtVHlwZSA9PSBEaXJlY3REaWN0IHx8IG1fUGFyYW1UeXBlID09IFByb3BlcnRpZXNEaWN0KSkgewotICAgICAgICByZXR1cm4gKChDUERGX0RpY3Rpb25hcnkgKiltX3BQYXJhbSktPktleUV4aXN0KEZYX0JTVFJDKCJNQ0lEIikpOwotICAgIH0KK3ZvaWQgQ1BERl9Db250ZW50TWFya0RhdGE6OkRlbGV0ZUxhc3RNYXJrKCkgeworICBpbnQgc2l6ZSA9IG1fTWFya3MuR2V0U2l6ZSgpOworICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fTWFya3MuUmVtb3ZlQXQoc2l6ZSAtIDEpOworfQorRlhfQk9PTCBDUERGX0NvbnRlbnRNYXJrOjpIYXNNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaykgY29uc3QgeworICBpZiAobV9wT2JqZWN0ID09IE5VTEwpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3BPYmplY3QtPkNvdW50SXRlbXMoKTsgaSsrKSB7CisgICAgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBtX3BPYmplY3QtPkdldEl0ZW0oaSk7CisgICAgaWYgKGl0ZW0uR2V0TmFtZSgpID09IG1hcmspIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1DUERGX0NvbnRlbnRNYXJrRGF0YTo6Q1BERl9Db250ZW50TWFya0RhdGEoY29uc3QgQ1BERl9Db250ZW50TWFya0RhdGEmIHNyYykKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNyYy5tX01hcmtzLkdldFNpemUoKTsgaSArKykgewotICAgICAgICBtX01hcmtzLkFkZChzcmMubV9NYXJrc1tpXSk7Ci0gICAgfQotfQotaW50IENQREZfQ29udGVudE1hcmtEYXRhOjpHZXRNQ0lEKCkgY29uc3QKLXsKLSAgICBDUERGX0NvbnRlbnRNYXJrSXRlbTo6UGFyYW1UeXBlIHR5cGUgPSBDUERGX0NvbnRlbnRNYXJrSXRlbTo6Tm9uZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fTWFya3MuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIHR5cGUgPSBtX01hcmtzW2ldLkdldFBhcmFtVHlwZSgpOwotICAgICAgICBpZiAodHlwZSA9PSBDUERGX0NvbnRlbnRNYXJrSXRlbTo6UHJvcGVydGllc0RpY3QgfHwgdHlwZSA9PSBDUERGX0NvbnRlbnRNYXJrSXRlbTo6RGlyZWN0RGljdCkgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCA9IChDUERGX0RpY3Rpb25hcnkgKiltX01hcmtzW2ldLkdldFBhcmFtKCk7Ci0gICAgICAgICAgICBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJNQ0lEIikpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJNQ0lEIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLXZvaWQgQ1BERl9Db250ZW50TWFya0RhdGE6OkFkZE1hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIENQREZfRGljdGlvbmFyeSogcERpY3QsIEZYX0JPT0wgYkRpcmVjdCkKLXsKLSAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IG1fTWFya3MuQWRkKCk7Ci0gICAgaXRlbS5TZXROYW1lKG5hbWUpOwotICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaXRlbS5TZXRQYXJhbShiRGlyZWN0ID8gQ1BERl9Db250ZW50TWFya0l0ZW06OkRpcmVjdERpY3QgOiBDUERGX0NvbnRlbnRNYXJrSXRlbTo6UHJvcGVydGllc0RpY3QsCi0gICAgICAgICAgICAgICAgICBiRGlyZWN0ID8gcERpY3QtPkNsb25lKCkgOiBwRGljdCk7Ci19Ci12b2lkIENQREZfQ29udGVudE1hcmtEYXRhOjpEZWxldGVMYXN0TWFyaygpCi17Ci0gICAgaW50IHNpemUgPSBtX01hcmtzLkdldFNpemUoKTsKLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9NYXJrcy5SZW1vdmVBdChzaXplIC0gMSk7Ci19Ci1GWF9CT09MIENQREZfQ29udGVudE1hcms6Okhhc01hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBtYXJrKSBjb25zdAotewotICAgIGlmIChtX3BPYmplY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9wT2JqZWN0LT5Db3VudEl0ZW1zKCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBtX3BPYmplY3QtPkdldEl0ZW0oaSk7Ci0gICAgICAgIGlmIChpdGVtLkdldE5hbWUoKSA9PSBtYXJrKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KK0ZYX0JPT0wgQ1BERl9Db250ZW50TWFyazo6TG9va3VwTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiYgcERpY3QpIGNvbnN0IHsKKyAgaWYgKG1fcE9iamVjdCA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0NvbnRlbnRNYXJrOjpMb29rdXBNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaywgQ1BERl9EaWN0aW9uYXJ5KiYgcERpY3QpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcE9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1fcE9iamVjdC0+Q291bnRJdGVtcygpOyBpKyspIHsKKyAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IG1fcE9iamVjdC0+R2V0SXRlbShpKTsKKyAgICBpZiAoaXRlbS5HZXROYW1lKCkgPT0gbWFyaykgeworICAgICAgcERpY3QgPSBOVUxMOworICAgICAgaWYgKGl0ZW0uR2V0UGFyYW1UeXBlKCkgPT0gQ1BERl9Db250ZW50TWFya0l0ZW06OlByb3BlcnRpZXNEaWN0IHx8CisgICAgICAgICAgaXRlbS5HZXRQYXJhbVR5cGUoKSA9PSBDUERGX0NvbnRlbnRNYXJrSXRlbTo6RGlyZWN0RGljdCkgeworICAgICAgICBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWl0ZW0uR2V0UGFyYW0oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fcE9iamVjdC0+Q291bnRJdGVtcygpOyBpICsrKSB7Ci0gICAgICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gbV9wT2JqZWN0LT5HZXRJdGVtKGkpOwotICAgICAgICBpZiAoaXRlbS5HZXROYW1lKCkgPT0gbWFyaykgewotICAgICAgICAgICAgcERpY3QgPSBOVUxMOwotICAgICAgICAgICAgaWYgKGl0ZW0uR2V0UGFyYW1UeXBlKCkgPT0gQ1BERl9Db250ZW50TWFya0l0ZW06OlByb3BlcnRpZXNEaWN0IHx8Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW0uR2V0UGFyYW1UeXBlKCkgPT0gQ1BERl9Db250ZW50TWFya0l0ZW06OkRpcmVjdERpY3QpIHsKLSAgICAgICAgICAgICAgICBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWl0ZW0uR2V0UGFyYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfaW1hZ2UuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2ltYWdlLmNwcAppbmRleCBhYWJmZDE0Li5lOWY3MGMxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfaW1hZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9pbWFnZS5jcHAKQEAgLTcsOTkgKzcsOTIgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgogI2luY2x1ZGUgInBhZ2VpbnQuaCIKLUNQREZfSW1hZ2VPYmplY3Q6OkNQREZfSW1hZ2VPYmplY3QoKQotewotICAgIG1fcEltYWdlID0gTlVMTDsKLSAgICBtX1R5cGUgPSBQREZQQUdFX0lNQUdFOworQ1BERl9JbWFnZU9iamVjdDo6Q1BERl9JbWFnZU9iamVjdCgpIHsKKyAgbV9wSW1hZ2UgPSBOVUxMOworICBtX1R5cGUgPSBQREZQQUdFX0lNQUdFOwogfQotQ1BERl9JbWFnZU9iamVjdDo6fkNQREZfSW1hZ2VPYmplY3QoKQotewotICAgIGlmICghbV9wSW1hZ2UpIHsKLSAgICAgICAgcmV0dXJuOworQ1BERl9JbWFnZU9iamVjdDo6fkNQREZfSW1hZ2VPYmplY3QoKSB7CisgIGlmICghbV9wSW1hZ2UpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcEltYWdlLT5Jc0lubGluZSgpIHx8CisgICAgICAobV9wSW1hZ2UtPkdldFN0cmVhbSgpICYmIG1fcEltYWdlLT5HZXRTdHJlYW0oKS0+R2V0T2JqTnVtKCkgPT0gMCkpIHsKKyAgICBkZWxldGUgbV9wSW1hZ2U7CisgIH0gZWxzZSB7CisgICAgbV9wSW1hZ2UtPkdldERvY3VtZW50KCktPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VJbWFnZShtX3BJbWFnZS0+R2V0U3RyZWFtKCkpOworICB9Cit9Cit2b2lkIENQREZfSW1hZ2VPYmplY3Q6OkNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykgeworICBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwU3JjT2JqID0gKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqKXBTcmM7CisgIGlmIChtX3BJbWFnZSkgeworICAgIG1fcEltYWdlLT5SZWxlYXNlKCk7CisgIH0KKyAgbV9wSW1hZ2UgPSBwU3JjT2JqLT5tX3BJbWFnZS0+Q2xvbmUoKTsKKyAgbV9NYXRyaXggPSBwU3JjT2JqLT5tX01hdHJpeDsKK30KK3ZvaWQgQ1BERl9JbWFnZU9iamVjdDo6VHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkgeworICBtX01hdHJpeC5Db25jYXQobWF0cml4KTsKKyAgQ2FsY0JvdW5kaW5nQm94KCk7Cit9Cit2b2lkIENQREZfSW1hZ2VPYmplY3Q6OkNhbGNCb3VuZGluZ0JveCgpIHsKKyAgbV9MZWZ0ID0gbV9Cb3R0b20gPSAwOworICBtX1JpZ2h0ID0gbV9Ub3AgPSAxLjBmOworICBtX01hdHJpeC5UcmFuc2Zvcm1SZWN0KG1fTGVmdCwgbV9SaWdodCwgbV9Ub3AsIG1fQm90dG9tKTsKK30KK3ZvaWQgQ1BERl9JbWFnZTo6UmVsZWFzZSgpIHsKKyAgaWYgKG1fYklubGluZSB8fCAobV9wU3RyZWFtICYmIG1fcFN0cmVhbS0+R2V0T2JqTnVtKCkgPT0gMCkpIHsKKyAgICBkZWxldGUgdGhpczsKKyAgfQorfQorQ1BERl9JbWFnZSogQ1BERl9JbWFnZTo6Q2xvbmUoKSB7CisgIGlmIChtX3BTdHJlYW0tPkdldE9iak51bSgpKSB7CisgICAgcmV0dXJuIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5HZXRJbWFnZShtX3BTdHJlYW0pOworICB9CisgIENQREZfSW1hZ2UqIHBJbWFnZSA9IG5ldyBDUERGX0ltYWdlKG1fcERvY3VtZW50KTsKKyAgcEltYWdlLT5Mb2FkSW1hZ2VGKChDUERGX1N0cmVhbSopKChDUERGX09iamVjdCopbV9wU3RyZWFtKS0+Q2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgIG1fYklubGluZSk7CisgIGlmIChtX2JJbmxpbmUpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBJbmxpbmVEaWN0ID0gKENQREZfRGljdGlvbmFyeSopbV9wSW5saW5lRGljdC0+Q2xvbmUoVFJVRSk7CisgICAgcEltYWdlLT5TZXRJbmxpbmVEaWN0KHBJbmxpbmVEaWN0KTsKKyAgfQorICByZXR1cm4gcEltYWdlOworfQorQ1BERl9JbWFnZTo6Q1BERl9JbWFnZShDUERGX0RvY3VtZW50KiBwRG9jKSB7CisgIG1fcERvY3VtZW50ID0gcERvYzsKKyAgbV9wU3RyZWFtID0gTlVMTDsKKyAgbV9wT0MgPSBOVUxMOworICBtX2JJbmxpbmUgPSBGQUxTRTsKKyAgbV9wSW5saW5lRGljdCA9IE5VTEw7CisgIG1fcERJQlNvdXJjZSA9IE5VTEw7CisgIG1fcE1hc2sgPSBOVUxMOworICBtX01hdHRlQ29sb3IgPSAwOworfQorQ1BERl9JbWFnZTo6fkNQREZfSW1hZ2UoKSB7CisgIGlmIChtX2JJbmxpbmUpIHsKKyAgICBpZiAobV9wU3RyZWFtKSB7CisgICAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsKICAgICB9Ci0gICAgaWYgKG1fcEltYWdlLT5Jc0lubGluZSgpIHx8IChtX3BJbWFnZS0+R2V0U3RyZWFtKCkgJiYgbV9wSW1hZ2UtPkdldFN0cmVhbSgpLT5HZXRPYmpOdW0oKSA9PSAwKSkgewotICAgICAgICBkZWxldGUgbV9wSW1hZ2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wSW1hZ2UtPkdldERvY3VtZW50KCktPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VJbWFnZShtX3BJbWFnZS0+R2V0U3RyZWFtKCkpOworICAgIGlmIChtX3BJbmxpbmVEaWN0KSB7CisgICAgICBtX3BJbmxpbmVEaWN0LT5SZWxlYXNlKCk7CiAgICAgfQorICB9CiB9Ci12b2lkIENQREZfSW1hZ2VPYmplY3Q6OkNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykKLXsKLSAgICBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwU3JjT2JqID0gKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqKXBTcmM7Ci0gICAgaWYgKG1fcEltYWdlKSB7Ci0gICAgICAgIG1fcEltYWdlLT5SZWxlYXNlKCk7Ci0gICAgfQotICAgIG1fcEltYWdlID0gcFNyY09iai0+bV9wSW1hZ2UtPkNsb25lKCk7Ci0gICAgbV9NYXRyaXggPSBwU3JjT2JqLT5tX01hdHJpeDsKLX0KLXZvaWQgQ1BERl9JbWFnZU9iamVjdDo6VHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkKLXsKLSAgICBtX01hdHJpeC5Db25jYXQobWF0cml4KTsKLSAgICBDYWxjQm91bmRpbmdCb3goKTsKLX0KLXZvaWQgQ1BERl9JbWFnZU9iamVjdDo6Q2FsY0JvdW5kaW5nQm94KCkKLXsKLSAgICBtX0xlZnQgPSBtX0JvdHRvbSA9IDA7Ci0gICAgbV9SaWdodCA9IG1fVG9wID0gMS4wZjsKLSAgICBtX01hdHJpeC5UcmFuc2Zvcm1SZWN0KG1fTGVmdCwgbV9SaWdodCwgbV9Ub3AsIG1fQm90dG9tKTsKLX0KLXZvaWQgQ1BERl9JbWFnZTo6UmVsZWFzZSgpCi17Ci0gICAgaWYgKG1fYklubGluZSB8fCAobV9wU3RyZWFtICYmIG1fcFN0cmVhbS0+R2V0T2JqTnVtKCkgPT0gMCkpIHsKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotfQotQ1BERl9JbWFnZSogQ1BERl9JbWFnZTo6Q2xvbmUoKQotewotICAgIGlmIChtX3BTdHJlYW0tPkdldE9iak51bSgpKSB7Ci0gICAgICAgIHJldHVybiBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0SW1hZ2UobV9wU3RyZWFtKTsKLSAgICB9Ci0gICAgQ1BERl9JbWFnZSogcEltYWdlID0gbmV3IENQREZfSW1hZ2UobV9wRG9jdW1lbnQpOwotICAgIHBJbWFnZS0+TG9hZEltYWdlRigoQ1BERl9TdHJlYW0qKSgoQ1BERl9PYmplY3QqKW1fcFN0cmVhbSktPkNsb25lKCksIG1fYklubGluZSk7Ci0gICAgaWYgKG1fYklubGluZSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBJbmxpbmVEaWN0ID0gKENQREZfRGljdGlvbmFyeSopbV9wSW5saW5lRGljdC0+Q2xvbmUoVFJVRSk7Ci0gICAgICAgIHBJbWFnZS0+U2V0SW5saW5lRGljdChwSW5saW5lRGljdCk7Ci0gICAgfQotICAgIHJldHVybiBwSW1hZ2U7Ci19Ci1DUERGX0ltYWdlOjpDUERGX0ltYWdlKENQREZfRG9jdW1lbnQqIHBEb2MpCi17Ci0gICAgbV9wRG9jdW1lbnQgPSBwRG9jOwotICAgIG1fcFN0cmVhbSA9IE5VTEw7Ci0gICAgbV9wT0MgPSBOVUxMOwotICAgIG1fYklubGluZSA9IEZBTFNFOworRlhfQk9PTCBDUERGX0ltYWdlOjpMb2FkSW1hZ2VGKENQREZfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJJbmxpbmUpIHsKKyAgbV9wU3RyZWFtID0gcFN0cmVhbTsKKyAgaWYgKG1fYklubGluZSAmJiBtX3BJbmxpbmVEaWN0KSB7CisgICAgbV9wSW5saW5lRGljdC0+UmVsZWFzZSgpOwogICAgIG1fcElubGluZURpY3QgPSBOVUxMOwotICAgIG1fcERJQlNvdXJjZSA9IE5VTEw7Ci0gICAgbV9wTWFzayA9IE5VTEw7Ci0gICAgbV9NYXR0ZUNvbG9yID0gMDsKLX0KLUNQREZfSW1hZ2U6On5DUERGX0ltYWdlKCkKLXsKLSAgICBpZiAobV9iSW5saW5lKSB7Ci0gICAgICAgIGlmIChtX3BTdHJlYW0pIHsKLSAgICAgICAgICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BJbmxpbmVEaWN0KSB7Ci0gICAgICAgICAgICBtX3BJbmxpbmVEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1GWF9CT09MIENQREZfSW1hZ2U6OkxvYWRJbWFnZUYoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYklubGluZSkKLXsKLSAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOwotICAgIGlmIChtX2JJbmxpbmUgJiYgbV9wSW5saW5lRGljdCkgewotICAgICAgICBtX3BJbmxpbmVEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fcElubGluZURpY3QgPSBOVUxMOwotICAgIH0KLSAgICBtX2JJbmxpbmUgPSBiSW5saW5lOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0gICAgaWYgKG1fYklubGluZSkgewotICAgICAgICBtX3BJbmxpbmVEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcERpY3QtPkNsb25lKCk7Ci0gICAgfQotICAgIG1fcE9DID0gcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIk9DIikpOwotICAgIG1fYklzTWFzayA9ICFwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSkgfHwgcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkltYWdlTWFzayIpKTsKLSAgICBtX2JJbnRlcnBvbGF0ZSA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJJbnRlcnBvbGF0ZSIpKTsKLSAgICBtX0hlaWdodCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7Ci0gICAgbV9XaWR0aCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJXaWR0aCIpKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgfQorICBtX2JJbmxpbmUgPSBiSW5saW5lOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworICBpZiAobV9iSW5saW5lKSB7CisgICAgbV9wSW5saW5lRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBEaWN0LT5DbG9uZSgpOworICB9CisgIG1fcE9DID0gcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIk9DIikpOworICBtX2JJc01hc2sgPSAhcERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJDb2xvclNwYWNlIikpIHx8CisgICAgICAgICAgICAgIHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJJbWFnZU1hc2siKSk7CisgIG1fYkludGVycG9sYXRlID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkludGVycG9sYXRlIikpOworICBtX0hlaWdodCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7CisgIG1fV2lkdGggPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSk7CisgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlci5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyLmNwcAppbmRleCA4OTJlMjE1Li40N2JhNDZhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyLmNwcApAQCAtOSw3ICs5LDExIEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgiCiAjaW5jbHVkZSAicGFnZWludC5oIgogCi0jZGVmaW5lIFJFUVVJUkVfUEFSQU1TKGNvdW50KSBpZiAobV9QYXJhbUNvdW50ICE9IGNvdW50KSB7IG1fYkFib3J0ID0gVFJVRTsgcmV0dXJuOyB9CisjZGVmaW5lIFJFUVVJUkVfUEFSQU1TKGNvdW50KSAgXAorICBpZiAobV9QYXJhbUNvdW50ICE9IGNvdW50KSB7IFwKKyAgICBtX2JBYm9ydCA9IFRSVUU7ICAgICAgICAgICBcCisgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6Q1BERl9TdHJlYW1Db250ZW50UGFyc2VyKAogICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKQEAgLTQ1LDE1MzkgKzQ5LDE1NTYgQEAKICAgICAgIG1fcExhc3RDbG9uZUltYWdlRGljdChudWxscHRyKSwKICAgICAgIG1fYlJlbGVhc2VMYXN0RGljdChUUlVFKSwKICAgICAgIG1fYkNvbG9yZWQoRkFMU0UpLAotICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nKEZBTFNFKQotewotICAgIGlmIChwbXRDb250ZW50VG9Vc2VyKSB7Ci0gICAgICAgIG1fbXRDb250ZW50VG9Vc2VyID0gKnBtdENvbnRlbnRUb1VzZXI7Ci0gICAgfQotICAgIGlmIChwT3B0aW9ucykgewotICAgICAgICBtX09wdGlvbnMgPSAqcE9wdGlvbnM7Ci0gICAgfQotICAgIGlmICghbV9wUmVzb3VyY2VzKSB7Ci0gICAgICAgIG1fcFJlc291cmNlcyA9IG1fcFBhcmVudFJlc291cmNlczsKLSAgICB9Ci0gICAgaWYgKCFtX3BSZXNvdXJjZXMpIHsKLSAgICAgICAgbV9wUmVzb3VyY2VzID0gbV9wUGFnZVJlc291cmNlczsKLSAgICB9Ci0gICAgaWYgKHBCQm94KSB7Ci0gICAgICAgIG1fQkJveCA9ICpwQkJveDsKLSAgICB9Ci0gICAgaWYgKHBTdGF0ZXMpIHsKLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5Db3B5KCpwU3RhdGVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fR2VuZXJhbFN0YXRlLk5ldygpOwotICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fR3JhcGhTdGF0ZS5OZXcoKTsKLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5OZXcoKTsKLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuTmV3KCk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKG1fVHlwZTNEYXRhKTsgKytpKSB7Ci0gICAgICAgIG1fVHlwZTNEYXRhW2ldID0gMC4wOwotICAgIH0KKyAgICAgIG1fYlJlc291cmNlTWlzc2luZyhGQUxTRSkgeworICBpZiAocG10Q29udGVudFRvVXNlcikgeworICAgIG1fbXRDb250ZW50VG9Vc2VyID0gKnBtdENvbnRlbnRUb1VzZXI7CisgIH0KKyAgaWYgKHBPcHRpb25zKSB7CisgICAgbV9PcHRpb25zID0gKnBPcHRpb25zOworICB9CisgIGlmICghbV9wUmVzb3VyY2VzKSB7CisgICAgbV9wUmVzb3VyY2VzID0gbV9wUGFyZW50UmVzb3VyY2VzOworICB9CisgIGlmICghbV9wUmVzb3VyY2VzKSB7CisgICAgbV9wUmVzb3VyY2VzID0gbV9wUGFnZVJlc291cmNlczsKKyAgfQorICBpZiAocEJCb3gpIHsKKyAgICBtX0JCb3ggPSAqcEJCb3g7CisgIH0KKyAgaWYgKHBTdGF0ZXMpIHsKKyAgICBtX3BDdXJTdGF0ZXMtPkNvcHkoKnBTdGF0ZXMpOworICB9IGVsc2UgeworICAgIG1fcEN1clN0YXRlcy0+bV9HZW5lcmFsU3RhdGUuTmV3KCk7CisgICAgbV9wQ3VyU3RhdGVzLT5tX0dyYXBoU3RhdGUuTmV3KCk7CisgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5OZXcoKTsKKyAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5OZXcoKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShtX1R5cGUzRGF0YSk7ICsraSkgeworICAgIG1fVHlwZTNEYXRhW2ldID0gMC4wOworICB9CiB9CiAKLUNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6fkNQREZfU3RyZWFtQ29udGVudFBhcnNlcigpCi17Ci0gICAgQ2xlYXJBbGxQYXJhbXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fU3RhdGVTdGFjay5HZXRTaXplKCk7ICsraSkgewotICAgICAgICBkZWxldGUgKENQREZfQWxsU3RhdGVzKiltX1N0YXRlU3RhY2tbaV07Ci0gICAgfQotICAgIGlmIChtX3BQYXRoUG9pbnRzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wUGF0aFBvaW50cyk7Ci0gICAgfQotICAgIGlmIChtX3BMYXN0SW1hZ2VEaWN0KSB7Ci0gICAgICAgIG1fcExhc3RJbWFnZURpY3QtPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgaWYgKG1fcExhc3RDbG9uZUltYWdlRGljdCkgewotICAgICAgICBtX3BMYXN0Q2xvbmVJbWFnZURpY3QtPlJlbGVhc2UoKTsKLSAgICB9CitDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6On5DUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoKSB7CisgIENsZWFyQWxsUGFyYW1zKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9TdGF0ZVN0YWNrLkdldFNpemUoKTsgKytpKSB7CisgICAgZGVsZXRlIChDUERGX0FsbFN0YXRlcyopbV9TdGF0ZVN0YWNrW2ldOworICB9CisgIGlmIChtX3BQYXRoUG9pbnRzKSB7CisgICAgRlhfRnJlZShtX3BQYXRoUG9pbnRzKTsKKyAgfQorICBpZiAobV9wTGFzdEltYWdlRGljdCkgeworICAgIG1fcExhc3RJbWFnZURpY3QtPlJlbGVhc2UoKTsKKyAgfQorICBpZiAobV9wTGFzdENsb25lSW1hZ2VEaWN0KSB7CisgICAgbV9wTGFzdENsb25lSW1hZ2VEaWN0LT5SZWxlYXNlKCk7CisgIH0KIH0KLWludCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldE5leHRQYXJhbVBvcygpCi17Ci0gICAgaWYgKG1fUGFyYW1Db3VudCA9PSBQQVJBTV9CVUZfU0laRSkgewotICAgICAgICBtX1BhcmFtU3RhcnRQb3MgKys7Ci0gICAgICAgIGlmIChtX1BhcmFtU3RhcnRQb3MgPT0gUEFSQU1fQlVGX1NJWkUpIHsKLSAgICAgICAgICAgIG1fUGFyYW1TdGFydFBvcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fUGFyYW1CdWYxW21fUGFyYW1TdGFydFBvc10ubV9UeXBlID09IDApIHsKLSAgICAgICAgICAgIGlmIChDUERGX09iamVjdCogcE9iamVjdCA9IG1fUGFyYW1CdWYxW21fUGFyYW1TdGFydFBvc10ubV9wT2JqZWN0KQotICAgICAgICAgICAgICAgIHBPYmplY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9QYXJhbVN0YXJ0UG9zOworaW50IENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6R2V0TmV4dFBhcmFtUG9zKCkgeworICBpZiAobV9QYXJhbUNvdW50ID09IFBBUkFNX0JVRl9TSVpFKSB7CisgICAgbV9QYXJhbVN0YXJ0UG9zKys7CisgICAgaWYgKG1fUGFyYW1TdGFydFBvcyA9PSBQQVJBTV9CVUZfU0laRSkgeworICAgICAgbV9QYXJhbVN0YXJ0UG9zID0gMDsKICAgICB9Ci0gICAgaW50IGluZGV4ID0gbV9QYXJhbVN0YXJ0UG9zICsgbV9QYXJhbUNvdW50OwotICAgIGlmIChpbmRleCA+PSBQQVJBTV9CVUZfU0laRSkgewotICAgICAgICBpbmRleCAtPSBQQVJBTV9CVUZfU0laRTsKKyAgICBpZiAobV9QYXJhbUJ1ZjFbbV9QYXJhbVN0YXJ0UG9zXS5tX1R5cGUgPT0gMCkgeworICAgICAgaWYgKENQREZfT2JqZWN0KiBwT2JqZWN0ID0gbV9QYXJhbUJ1ZjFbbV9QYXJhbVN0YXJ0UG9zXS5tX3BPYmplY3QpCisgICAgICAgIHBPYmplY3QtPlJlbGVhc2UoKTsKICAgICB9Ci0gICAgbV9QYXJhbUNvdW50ICsrOwotICAgIHJldHVybiBpbmRleDsKKyAgICByZXR1cm4gbV9QYXJhbVN0YXJ0UG9zOworICB9CisgIGludCBpbmRleCA9IG1fUGFyYW1TdGFydFBvcyArIG1fUGFyYW1Db3VudDsKKyAgaWYgKGluZGV4ID49IFBBUkFNX0JVRl9TSVpFKSB7CisgICAgaW5kZXggLT0gUEFSQU1fQlVGX1NJWkU7CisgIH0KKyAgbV9QYXJhbUNvdW50Kys7CisgIHJldHVybiBpbmRleDsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGROYW1lUGFyYW0oY29uc3QgRlhfQ0hBUiogbmFtZSwgaW50IGxlbikKLXsKLSAgICBpbnQgaW5kZXggPSBHZXROZXh0UGFyYW1Qb3MoKTsKLSAgICBpZiAobGVuID4gMzIpIHsKLSAgICAgICAgbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fVHlwZSA9IDA7Ci0gICAgICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX3BPYmplY3QgPSBDUERGX05hbWU6OkNyZWF0ZShQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0MobmFtZSwgbGVuKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX1R5cGUgPSBQREZPQkpfTkFNRTsKLSAgICAgICAgaWYgKEZYU1lTX21lbWNocihuYW1lLCAnIycsIGxlbikgPT0gTlVMTCkgewotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fUGFyYW1CdWYxW2luZGV4XS5tX05hbWUubV9CdWZmZXIsIG5hbWUsIGxlbik7Ci0gICAgICAgICAgICBtX1BhcmFtQnVmMVtpbmRleF0ubV9OYW1lLm1fTGVuID0gbGVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG5hbWUsIGxlbikpOwotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fUGFyYW1CdWYxW2luZGV4XS5tX05hbWUubV9CdWZmZXIsIHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fTmFtZS5tX0xlbiA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGROdW1iZXJQYXJhbShjb25zdCBGWF9DSEFSKiBzdHIsIGludCBsZW4pCi17Ci0gICAgaW50IGluZGV4ID0gR2V0TmV4dFBhcmFtUG9zKCk7Ci0gICAgbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fVHlwZSA9IFBERk9CSl9OVU1CRVI7Ci0gICAgRlhfYXRvbnVtKENGWF9CeXRlU3RyaW5nQyhzdHIsIGxlbiksIG1fUGFyYW1CdWYxW2luZGV4XS5tX051bWJlci5tX2JJbnRlZ2VyLAotICAgICAgICAgICAgICAmbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fTnVtYmVyLm1fSW50ZWdlcik7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkT2JqZWN0UGFyYW0oQ1BERl9PYmplY3QqIHBPYmopCi17Ci0gICAgaW50IGluZGV4ID0gR2V0TmV4dFBhcmFtUG9zKCk7Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkTmFtZVBhcmFtKGNvbnN0IEZYX0NIQVIqIG5hbWUsIGludCBsZW4pIHsKKyAgaW50IGluZGV4ID0gR2V0TmV4dFBhcmFtUG9zKCk7CisgIGlmIChsZW4gPiAzMikgewogICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX1R5cGUgPSAwOwotICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX3BPYmplY3QgPSBwT2JqOworICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX3BPYmplY3QgPQorICAgICAgICBDUERGX05hbWU6OkNyZWF0ZShQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0MobmFtZSwgbGVuKSkpOworICB9IGVsc2UgeworICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX1R5cGUgPSBQREZPQkpfTkFNRTsKKyAgICBpZiAoRlhTWVNfbWVtY2hyKG5hbWUsICcjJywgbGVuKSA9PSBOVUxMKSB7CisgICAgICBGWFNZU19tZW1jcHkobV9QYXJhbUJ1ZjFbaW5kZXhdLm1fTmFtZS5tX0J1ZmZlciwgbmFtZSwgbGVuKTsKKyAgICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX05hbWUubV9MZW4gPSBsZW47CisgICAgfSBlbHNlIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IFBERl9OYW1lRGVjb2RlKENGWF9CeXRlU3RyaW5nQyhuYW1lLCBsZW4pKTsKKyAgICAgIEZYU1lTX21lbWNweShtX1BhcmFtQnVmMVtpbmRleF0ubV9OYW1lLm1fQnVmZmVyLCBzdHIuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICBzdHIuR2V0TGVuZ3RoKCkpOworICAgICAgbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fTmFtZS5tX0xlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgICB9CisgIH0KIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpDbGVhckFsbFBhcmFtcygpCi17Ci0gICAgRlhfRFdPUkQgaW5kZXggPSBtX1BhcmFtU3RhcnRQb3M7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fUGFyYW1Db3VudDsgaSArKykgewotICAgICAgICBpZiAobV9QYXJhbUJ1ZjFbaW5kZXhdLm1fVHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoQ1BERl9PYmplY3QqIHBPYmplY3QgPSBtX1BhcmFtQnVmMVtpbmRleF0ubV9wT2JqZWN0KQotICAgICAgICAgICAgICAgIHBPYmplY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBpbmRleCArKzsKLSAgICAgICAgaWYgKGluZGV4ID09IFBBUkFNX0JVRl9TSVpFKSB7Ci0gICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9QYXJhbVN0YXJ0UG9zID0gMDsKLSAgICBtX1BhcmFtQ291bnQgPSAwOwordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZE51bWJlclBhcmFtKGNvbnN0IEZYX0NIQVIqIHN0ciwgaW50IGxlbikgeworICBpbnQgaW5kZXggPSBHZXROZXh0UGFyYW1Qb3MoKTsKKyAgbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fVHlwZSA9IFBERk9CSl9OVU1CRVI7CisgIEZYX2F0b251bShDRlhfQnl0ZVN0cmluZ0Moc3RyLCBsZW4pLCBtX1BhcmFtQnVmMVtpbmRleF0ubV9OdW1iZXIubV9iSW50ZWdlciwKKyAgICAgICAgICAgICZtX1BhcmFtQnVmMVtpbmRleF0ubV9OdW1iZXIubV9JbnRlZ2VyKTsKIH0KLUNQREZfT2JqZWN0KiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldE9iamVjdChGWF9EV09SRCBpbmRleCkKLXsKLSAgICBpZiAoaW5kZXggPj0gbV9QYXJhbUNvdW50KSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZE9iamVjdFBhcmFtKENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGludCBpbmRleCA9IEdldE5leHRQYXJhbVBvcygpOworICBtX1BhcmFtQnVmMVtpbmRleF0ubV9UeXBlID0gMDsKKyAgbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fcE9iamVjdCA9IHBPYmo7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6Q2xlYXJBbGxQYXJhbXMoKSB7CisgIEZYX0RXT1JEIGluZGV4ID0gbV9QYXJhbVN0YXJ0UG9zOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9QYXJhbUNvdW50OyBpKyspIHsKKyAgICBpZiAobV9QYXJhbUJ1ZjFbaW5kZXhdLm1fVHlwZSA9PSAwKSB7CisgICAgICBpZiAoQ1BERl9PYmplY3QqIHBPYmplY3QgPSBtX1BhcmFtQnVmMVtpbmRleF0ubV9wT2JqZWN0KQorICAgICAgICBwT2JqZWN0LT5SZWxlYXNlKCk7CiAgICAgfQotICAgIGludCByZWFsX2luZGV4ID0gbV9QYXJhbVN0YXJ0UG9zICsgbV9QYXJhbUNvdW50IC0gaW5kZXggLSAxOwotICAgIGlmIChyZWFsX2luZGV4ID49IFBBUkFNX0JVRl9TSVpFKSB7Ci0gICAgICAgIHJlYWxfaW5kZXggLT0gUEFSQU1fQlVGX1NJWkU7CisgICAgaW5kZXgrKzsKKyAgICBpZiAoaW5kZXggPT0gUEFSQU1fQlVGX1NJWkUpIHsKKyAgICAgIGluZGV4ID0gMDsKICAgICB9Ci0gICAgX0NvbnRlbnRQYXJhbSYgcGFyYW0gPSBtX1BhcmFtQnVmMVtyZWFsX2luZGV4XTsKLSAgICBpZiAocGFyYW0ubV9UeXBlID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgQ1BERl9OdW1iZXIqIHBOdW1iZXIgPSBDUERGX051bWJlcjo6Q3JlYXRlKHBhcmFtLm1fTnVtYmVyLm1fYkludGVnZXIsICZwYXJhbS5tX051bWJlci5tX0ludGVnZXIpOwotICAgICAgICBwYXJhbS5tX1R5cGUgPSAwOwotICAgICAgICBwYXJhbS5tX3BPYmplY3QgPSBwTnVtYmVyOwotICAgICAgICByZXR1cm4gcE51bWJlcjsKLSAgICB9Ci0gICAgaWYgKHBhcmFtLm1fVHlwZSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICBDUERGX05hbWUqIHBOYW1lID0gQ1BERl9OYW1lOjpDcmVhdGUoQ0ZYX0J5dGVTdHJpbmcocGFyYW0ubV9OYW1lLm1fQnVmZmVyLCBwYXJhbS5tX05hbWUubV9MZW4pKTsKLSAgICAgICAgcGFyYW0ubV9UeXBlID0gMDsKLSAgICAgICAgcGFyYW0ubV9wT2JqZWN0ID0gcE5hbWU7Ci0gICAgICAgIHJldHVybiBwTmFtZTsKLSAgICB9Ci0gICAgaWYgKHBhcmFtLm1fVHlwZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbS5tX3BPYmplY3Q7Ci0gICAgfQotICAgIEFTU0VSVChGQUxTRSk7CisgIH0KKyAgbV9QYXJhbVN0YXJ0UG9zID0gMDsKKyAgbV9QYXJhbUNvdW50ID0gMDsKK30KK0NQREZfT2JqZWN0KiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldE9iamVjdChGWF9EV09SRCBpbmRleCkgeworICBpZiAoaW5kZXggPj0gbV9QYXJhbUNvdW50KSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IHJlYWxfaW5kZXggPSBtX1BhcmFtU3RhcnRQb3MgKyBtX1BhcmFtQ291bnQgLSBpbmRleCAtIDE7CisgIGlmIChyZWFsX2luZGV4ID49IFBBUkFNX0JVRl9TSVpFKSB7CisgICAgcmVhbF9pbmRleCAtPSBQQVJBTV9CVUZfU0laRTsKKyAgfQorICBfQ29udGVudFBhcmFtJiBwYXJhbSA9IG1fUGFyYW1CdWYxW3JlYWxfaW5kZXhdOworICBpZiAocGFyYW0ubV9UeXBlID09IFBERk9CSl9OVU1CRVIpIHsKKyAgICBDUERGX051bWJlciogcE51bWJlciA9IENQREZfTnVtYmVyOjpDcmVhdGUocGFyYW0ubV9OdW1iZXIubV9iSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtLm1fTnVtYmVyLm1fSW50ZWdlcik7CisgICAgcGFyYW0ubV9UeXBlID0gMDsKKyAgICBwYXJhbS5tX3BPYmplY3QgPSBwTnVtYmVyOworICAgIHJldHVybiBwTnVtYmVyOworICB9CisgIGlmIChwYXJhbS5tX1R5cGUgPT0gUERGT0JKX05BTUUpIHsKKyAgICBDUERGX05hbWUqIHBOYW1lID0gQ1BERl9OYW1lOjpDcmVhdGUoCisgICAgICAgIENGWF9CeXRlU3RyaW5nKHBhcmFtLm1fTmFtZS5tX0J1ZmZlciwgcGFyYW0ubV9OYW1lLm1fTGVuKSk7CisgICAgcGFyYW0ubV9UeXBlID0gMDsKKyAgICBwYXJhbS5tX3BPYmplY3QgPSBwTmFtZTsKKyAgICByZXR1cm4gcE5hbWU7CisgIH0KKyAgaWYgKHBhcmFtLm1fVHlwZSA9PSAwKSB7CisgICAgcmV0dXJuIHBhcmFtLm1fcE9iamVjdDsKKyAgfQorICBBU1NFUlQoRkFMU0UpOworICByZXR1cm4gTlVMTDsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6R2V0U3RyaW5nKEZYX0RXT1JEIGluZGV4KQotewotICAgIGlmIChpbmRleCA+PSBtX1BhcmFtQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIGludCByZWFsX2luZGV4ID0gbV9QYXJhbVN0YXJ0UG9zICsgbV9QYXJhbUNvdW50IC0gaW5kZXggLSAxOwotICAgIGlmIChyZWFsX2luZGV4ID49IFBBUkFNX0JVRl9TSVpFKSB7Ci0gICAgICAgIHJlYWxfaW5kZXggLT0gUEFSQU1fQlVGX1NJWkU7Ci0gICAgfQotICAgIF9Db250ZW50UGFyYW0mIHBhcmFtID0gbV9QYXJhbUJ1ZjFbcmVhbF9pbmRleF07Ci0gICAgaWYgKHBhcmFtLm1fVHlwZSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcocGFyYW0ubV9OYW1lLm1fQnVmZmVyLCBwYXJhbS5tX05hbWUubV9MZW4pOwotICAgIH0KLSAgICBpZiAocGFyYW0ubV9UeXBlID09IDAgJiYgcGFyYW0ubV9wT2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBwYXJhbS5tX3BPYmplY3QtPkdldFN0cmluZygpOwotICAgIH0KK0NGWF9CeXRlU3RyaW5nIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6R2V0U3RyaW5nKEZYX0RXT1JEIGluZGV4KSB7CisgIGlmIChpbmRleCA+PSBtX1BhcmFtQ291bnQpIHsKICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgfQorICBpbnQgcmVhbF9pbmRleCA9IG1fUGFyYW1TdGFydFBvcyArIG1fUGFyYW1Db3VudCAtIGluZGV4IC0gMTsKKyAgaWYgKHJlYWxfaW5kZXggPj0gUEFSQU1fQlVGX1NJWkUpIHsKKyAgICByZWFsX2luZGV4IC09IFBBUkFNX0JVRl9TSVpFOworICB9CisgIF9Db250ZW50UGFyYW0mIHBhcmFtID0gbV9QYXJhbUJ1ZjFbcmVhbF9pbmRleF07CisgIGlmIChwYXJhbS5tX1R5cGUgPT0gUERGT0JKX05BTUUpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcocGFyYW0ubV9OYW1lLm1fQnVmZmVyLCBwYXJhbS5tX05hbWUubV9MZW4pOworICB9CisgIGlmIChwYXJhbS5tX1R5cGUgPT0gMCAmJiBwYXJhbS5tX3BPYmplY3QpIHsKKyAgICByZXR1cm4gcGFyYW0ubV9wT2JqZWN0LT5HZXRTdHJpbmcoKTsKKyAgfQorICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKIH0KLUZYX0ZMT0FUIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6R2V0TnVtYmVyKEZYX0RXT1JEIGluZGV4KQotewotICAgIGlmIChpbmRleCA+PSBtX1BhcmFtQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludCByZWFsX2luZGV4ID0gbV9QYXJhbVN0YXJ0UG9zICsgbV9QYXJhbUNvdW50IC0gaW5kZXggLSAxOwotICAgIGlmIChyZWFsX2luZGV4ID49IFBBUkFNX0JVRl9TSVpFKSB7Ci0gICAgICAgIHJlYWxfaW5kZXggLT0gUEFSQU1fQlVGX1NJWkU7Ci0gICAgfQotICAgIF9Db250ZW50UGFyYW0mIHBhcmFtID0gbV9QYXJhbUJ1ZjFbcmVhbF9pbmRleF07Ci0gICAgaWYgKHBhcmFtLm1fVHlwZSA9PSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbS5tX051bWJlci5tX2JJbnRlZ2VyID8gKEZYX0ZMT0FUKXBhcmFtLm1fTnVtYmVyLm1fSW50ZWdlciA6IHBhcmFtLm1fTnVtYmVyLm1fRmxvYXQ7Ci0gICAgfQotICAgIGlmIChwYXJhbS5tX1R5cGUgPT0gMCAmJiBwYXJhbS5tX3BPYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtLm1fcE9iamVjdC0+R2V0TnVtYmVyKCk7Ci0gICAgfQorRlhfRkxPQVQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpHZXROdW1iZXIoRlhfRFdPUkQgaW5kZXgpIHsKKyAgaWYgKGluZGV4ID49IG1fUGFyYW1Db3VudCkgewogICAgIHJldHVybiAwOworICB9CisgIGludCByZWFsX2luZGV4ID0gbV9QYXJhbVN0YXJ0UG9zICsgbV9QYXJhbUNvdW50IC0gaW5kZXggLSAxOworICBpZiAocmVhbF9pbmRleCA+PSBQQVJBTV9CVUZfU0laRSkgeworICAgIHJlYWxfaW5kZXggLT0gUEFSQU1fQlVGX1NJWkU7CisgIH0KKyAgX0NvbnRlbnRQYXJhbSYgcGFyYW0gPSBtX1BhcmFtQnVmMVtyZWFsX2luZGV4XTsKKyAgaWYgKHBhcmFtLm1fVHlwZSA9PSBQREZPQkpfTlVNQkVSKSB7CisgICAgcmV0dXJuIHBhcmFtLm1fTnVtYmVyLm1fYkludGVnZXIgPyAoRlhfRkxPQVQpcGFyYW0ubV9OdW1iZXIubV9JbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJhbS5tX051bWJlci5tX0Zsb2F0OworICB9CisgIGlmIChwYXJhbS5tX1R5cGUgPT0gMCAmJiBwYXJhbS5tX3BPYmplY3QpIHsKKyAgICByZXR1cm4gcGFyYW0ubV9wT2JqZWN0LT5HZXROdW1iZXIoKTsKKyAgfQorICByZXR1cm4gMDsKIH0KLUZYX0ZMT0FUIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6R2V0TnVtYmVyMTYoRlhfRFdPUkQgaW5kZXgpCi17Ci0gICAgcmV0dXJuIEdldE51bWJlcihpbmRleCk7CitGWF9GTE9BVCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldE51bWJlcjE2KEZYX0RXT1JEIGluZGV4KSB7CisgIHJldHVybiBHZXROdW1iZXIoaW5kZXgpOwogfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OlNldEdyYXBoaWNTdGF0ZXMoQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBGWF9CT09MIGJDb2xvciwgRlhfQk9PTCBiVGV4dCwgRlhfQk9PTCBiR3JhcGgpCi17Ci0gICAgcE9iai0+bV9HZW5lcmFsU3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fR2VuZXJhbFN0YXRlOwotICAgIHBPYmotPm1fQ2xpcFBhdGggPSBtX3BDdXJTdGF0ZXMtPm1fQ2xpcFBhdGg7Ci0gICAgcE9iai0+bV9Db250ZW50TWFyayA9IG1fQ3VyQ29udGVudE1hcms7Ci0gICAgaWYgKGJDb2xvcikgewotICAgICAgICBwT2JqLT5tX0NvbG9yU3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZTsKLSAgICB9Ci0gICAgaWYgKGJHcmFwaCkgewotICAgICAgICBwT2JqLT5tX0dyYXBoU3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fR3JhcGhTdGF0ZTsKLSAgICB9Ci0gICAgaWYgKGJUZXh0KSB7Ci0gICAgICAgIHBPYmotPm1fVGV4dFN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZTsKLSAgICB9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6U2V0R3JhcGhpY1N0YXRlcyhDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJHcmFwaCkgeworICBwT2JqLT5tX0dlbmVyYWxTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9HZW5lcmFsU3RhdGU7CisgIHBPYmotPm1fQ2xpcFBhdGggPSBtX3BDdXJTdGF0ZXMtPm1fQ2xpcFBhdGg7CisgIHBPYmotPm1fQ29udGVudE1hcmsgPSBtX0N1ckNvbnRlbnRNYXJrOworICBpZiAoYkNvbG9yKSB7CisgICAgcE9iai0+bV9Db2xvclN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGU7CisgIH0KKyAgaWYgKGJHcmFwaCkgeworICAgIHBPYmotPm1fR3JhcGhTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9HcmFwaFN0YXRlOworICB9CisgIGlmIChiVGV4dCkgeworICAgIHBPYmotPm1fVGV4dFN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZTsKKyAgfQogfQogCi1jb25zdCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6Ok9wQ29kZSBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OmdfT3BDb2Rlc1tdID0KLXsKLSAgICB7RlhCU1RSX0lEKCciJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTmV4dExpbmVTaG93VGV4dF9TcGFjZX0sCi0gICAge0ZYQlNUUl9JRCgnXCcnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9OZXh0TGluZVNob3dUZXh0fSwKLSAgICB7RlhCU1RSX0lEKCdCJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFN0cm9rZVBhdGh9LAotICAgIHtGWEJTVFJfSUQoJ0InLCAnKicsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsU3Ryb2tlUGF0aH0sCi0gICAge0ZYQlNUUl9JRCgnQicsICdEJywgJ0MnLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luTWFya2VkQ29udGVudF9EaWN0aW9uYXJ5fSwKLSAgICB7RlhCU1RSX0lEKCdCJywgJ0knLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luSW1hZ2V9LAotICAgIHtGWEJTVFJfSUQoJ0InLCAnTScsICdDJywgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnR9LAotICAgIHtGWEJTVFJfSUQoJ0InLCAnVCcsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5UZXh0fSwKLSAgICB7RlhCU1RSX0lEKCdCJywgJ1gnLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luU2VjdGlvblVuZGVmaW5lZH0sCi0gICAge0ZYQlNUUl9JRCgnQycsICdTJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclNwYWNlX1N0cm9rZX0sCi0gICAge0ZYQlNUUl9JRCgnRCcsICdQJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9NYXJrUGxhY2VfRGljdGlvbmFyeX0sCi0gICAge0ZYQlNUUl9JRCgnRCcsICdvJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FeGVjdXRlWE9iamVjdH0sCi0gICAge0ZYQlNUUl9JRCgnRScsICdJJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRJbWFnZX0sCi0gICAge0ZYQlNUUl9JRCgnRScsICdNJywgJ0MnLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VuZE1hcmtlZENvbnRlbnR9LAotICAgIHtGWEJTVFJfSUQoJ0UnLCAnVCcsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kVGV4dH0sCi0gICAge0ZYQlNUUl9JRCgnRScsICdYJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRTZWN0aW9uVW5kZWZpbmVkfSwKLSAgICB7RlhCU1RSX0lEKCdGJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFBhdGhPbGR9LAotICAgIHtGWEJTVFJfSUQoJ0cnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRHcmF5X1N0cm9rZX0sCi0gICAge0ZYQlNUUl9JRCgnSScsICdEJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbkltYWdlRGF0YX0sCi0gICAge0ZYQlNUUl9JRCgnSicsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVDYXB9LAotICAgIHtGWEJTVFJfSUQoJ0snLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDTVlLQ29sb3JfU3Ryb2tlfSwKLSAgICB7RlhCU1RSX0lEKCdNJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0TWl0ZXJMaW1pdH0sCi0gICAge0ZYQlNUUl9JRCgnTScsICdQJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9NYXJrUGxhY2V9LAotICAgIHtGWEJTVFJfSUQoJ1EnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9SZXN0b3JlR3JhcGhTdGF0ZX0sCi0gICAge0ZYQlNUUl9JRCgnUicsICdHJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRSR0JDb2xvcl9TdHJva2V9LAotICAgIHtGWEJTVFJfSUQoJ1MnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TdHJva2VQYXRofSwKLSAgICB7RlhCU1RSX0lEKCdTJywgJ0MnLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yX1N0cm9rZX0sCi0gICAge0ZYQlNUUl9JRCgnUycsICdDJywgJ04nLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yUFNfU3Ryb2tlfSwKLSAgICB7RlhCU1RSX0lEKCdUJywgJyonLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUb05leHRMaW5lfSwKLSAgICB7RlhCU1RSX0lEKCdUJywgJ0QnLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUZXh0UG9pbnRfU2V0TGVhZGluZ30sCi0gICAge0ZYQlNUUl9JRCgnVCcsICdKJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TaG93VGV4dF9Qb3NpdGlvbmluZ30sCi0gICAge0ZYQlNUUl9JRCgnVCcsICdMJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRUZXh0TGVhZGluZ30sCi0gICAge0ZYQlNUUl9JRCgnVCcsICdjJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDaGFyU3BhY2V9LAotICAgIHtGWEJTVFJfSUQoJ1QnLCAnZCcsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRleHRQb2ludH0sCi0gICAge0ZYQlNUUl9JRCgnVCcsICdmJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRGb250fSwKLSAgICB7RlhCU1RSX0lEKCdUJywgJ2onLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1Nob3dUZXh0fSwKLSAgICB7RlhCU1RSX0lEKCdUJywgJ20nLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFRleHRNYXRyaXh9LAotICAgIHtGWEJTVFJfSUQoJ1QnLCAncicsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dFJlbmRlck1vZGV9LAotICAgIHtGWEJTVFJfSUQoJ1QnLCAncycsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dFJpc2V9LAotICAgIHtGWEJTVFJfSUQoJ1QnLCAndycsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0V29yZFNwYWNlfSwKLSAgICB7RlhCU1RSX0lEKCdUJywgJ3onLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEhvcnpTY2FsZX0sCi0gICAge0ZYQlNUUl9JRCgnVycsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0NsaXB9LAotICAgIHtGWEJTVFJfSUQoJ1cnLCAnKicsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9DbGlwfSwKLSAgICB7RlhCU1RSX0lEKCdiJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xvc2VGaWxsU3Ryb2tlUGF0aH0sCi0gICAge0ZYQlNUUl9JRCgnYicsICcqJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZUVPRmlsbFN0cm9rZVBhdGh9LAotICAgIHtGWEJTVFJfSUQoJ2MnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DdXJ2ZVRvXzEyM30sCi0gICAge0ZYQlNUUl9JRCgnYycsICdtJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9Db25jYXRNYXRyaXh9LAotICAgIHtGWEJTVFJfSUQoJ2MnLCAncycsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JTcGFjZV9GaWxsfSwKLSAgICB7RlhCU1RSX0lEKCdkJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0RGFzaH0sCi0gICAge0ZYQlNUUl9JRCgnZCcsICcwJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDaGFyV2lkdGh9LAotICAgIHtGWEJTVFJfSUQoJ2QnLCAnMScsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2FjaGVkRGV2aWNlfSwKLSAgICB7RlhCU1RSX0lEKCdmJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFBhdGh9LAotICAgIHtGWEJTVFJfSUQoJ2YnLCAnKicsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsUGF0aH0sCi0gICAge0ZYQlNUUl9JRCgnZycsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEdyYXlfRmlsbH0sCi0gICAge0ZYQlNUUl9JRCgnZycsICdzJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRFeHRlbmRHcmFwaFN0YXRlfSwKLSAgICB7RlhCU1RSX0lEKCdoJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xvc2VQYXRofSwKLSAgICB7RlhCU1RSX0lEKCdpJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0RmxhdH0sCi0gICAge0ZYQlNUUl9JRCgnaicsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVKb2lufSwKLSAgICB7RlhCU1RSX0lEKCdrJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q01ZS0NvbG9yX0ZpbGx9LAotICAgIHtGWEJTVFJfSUQoJ2wnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9MaW5lVG99LAotICAgIHtGWEJTVFJfSUQoJ20nLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9Nb3ZlVG99LAotICAgIHtGWEJTVFJfSUQoJ24nLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRQYXRofSwKLSAgICB7RlhCU1RSX0lEKCdxJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2F2ZUdyYXBoU3RhdGV9LAotICAgIHtGWEJTVFJfSUQoJ3InLCAnZScsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfUmVjdGFuZ2xlfSwKLSAgICB7RlhCU1RSX0lEKCdyJywgJ2cnLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFJHQkNvbG9yX0ZpbGx9LAotICAgIHtGWEJTVFJfSUQoJ3InLCAnaScsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0UmVuZGVySW50ZW50fSwKLSAgICB7RlhCU1RSX0lEKCdzJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xvc2VTdHJva2VQYXRofSwKLSAgICB7RlhCU1RSX0lEKCdzJywgJ2MnLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yX0ZpbGx9LAotICAgIHtGWEJTVFJfSUQoJ3MnLCAnYycsICduJywgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclBTX0ZpbGx9LAotICAgIHtGWEJTVFJfSUQoJ3MnLCAnaCcsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2hhZGVGaWxsfSwKLSAgICB7RlhCU1RSX0lEKCd2JywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ3VydmVUb18yM30sCi0gICAge0ZYQlNUUl9JRCgndycsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVXaWR0aH0sCi0gICAge0ZYQlNUUl9JRCgneScsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0N1cnZlVG9fMTN9LAorY29uc3QgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpPcENvZGUgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpnX09wQ29kZXNbXSA9IHsKKyAgICB7RlhCU1RSX0lEKCciJywgMCwgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9OZXh0TGluZVNob3dUZXh0X1NwYWNlfSwKKyAgICB7RlhCU1RSX0lEKCdcJycsIDAsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTmV4dExpbmVTaG93VGV4dH0sCisgICAge0ZYQlNUUl9JRCgnQicsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFN0cm9rZVBhdGh9LAorICAgIHtGWEJTVFJfSUQoJ0InLCAnKicsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsU3Ryb2tlUGF0aH0sCisgICAge0ZYQlNUUl9JRCgnQicsICdEJywgJ0MnLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luTWFya2VkQ29udGVudF9EaWN0aW9uYXJ5fSwKKyAgICB7RlhCU1RSX0lEKCdCJywgJ0knLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luSW1hZ2V9LAorICAgIHtGWEJTVFJfSUQoJ0InLCAnTScsICdDJywgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnR9LAorICAgIHtGWEJTVFJfSUQoJ0InLCAnVCcsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5UZXh0fSwKKyAgICB7RlhCU1RSX0lEKCdCJywgJ1gnLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luU2VjdGlvblVuZGVmaW5lZH0sCisgICAge0ZYQlNUUl9JRCgnQycsICdTJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclNwYWNlX1N0cm9rZX0sCisgICAge0ZYQlNUUl9JRCgnRCcsICdQJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9NYXJrUGxhY2VfRGljdGlvbmFyeX0sCisgICAge0ZYQlNUUl9JRCgnRCcsICdvJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FeGVjdXRlWE9iamVjdH0sCisgICAge0ZYQlNUUl9JRCgnRScsICdJJywgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRJbWFnZX0sCisgICAge0ZYQlNUUl9JRCgnRScsICdNJywgJ0MnLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VuZE1hcmtlZENvbnRlbnR9LAorICAgIHtGWEJTVFJfSUQoJ0UnLCAnVCcsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kVGV4dH0sCisgICAge0ZYQlNUUl9JRCgnRScsICdYJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRTZWN0aW9uVW5kZWZpbmVkfSwKKyAgICB7RlhCU1RSX0lEKCdGJywgMCwgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9GaWxsUGF0aE9sZH0sCisgICAge0ZYQlNUUl9JRCgnRycsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0R3JheV9TdHJva2V9LAorICAgIHtGWEJTVFJfSUQoJ0knLCAnRCcsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5JbWFnZURhdGF9LAorICAgIHtGWEJTVFJfSUQoJ0onLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVDYXB9LAorICAgIHtGWEJTVFJfSUQoJ0snLCAwLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENNWUtDb2xvcl9TdHJva2V9LAorICAgIHtGWEJTVFJfSUQoJ00nLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldE1pdGVyTGltaXR9LAorICAgIHtGWEJTVFJfSUQoJ00nLCAnUCcsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTWFya1BsYWNlfSwKKyAgICB7RlhCU1RSX0lEKCdRJywgMCwgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9SZXN0b3JlR3JhcGhTdGF0ZX0sCisgICAge0ZYQlNUUl9JRCgnUicsICdHJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRSR0JDb2xvcl9TdHJva2V9LAorICAgIHtGWEJTVFJfSUQoJ1MnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1N0cm9rZVBhdGh9LAorICAgIHtGWEJTVFJfSUQoJ1MnLCAnQycsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JfU3Ryb2tlfSwKKyAgICB7RlhCU1RSX0lEKCdTJywgJ0MnLCAnTicsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JQU19TdHJva2V9LAorICAgIHtGWEJTVFJfSUQoJ1QnLCAnKicsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRvTmV4dExpbmV9LAorICAgIHtGWEJTVFJfSUQoJ1QnLCAnRCcsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRleHRQb2ludF9TZXRMZWFkaW5nfSwKKyAgICB7RlhCU1RSX0lEKCdUJywgJ0onLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1Nob3dUZXh0X1Bvc2l0aW9uaW5nfSwKKyAgICB7RlhCU1RSX0lEKCdUJywgJ0wnLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFRleHRMZWFkaW5nfSwKKyAgICB7RlhCU1RSX0lEKCdUJywgJ2MnLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENoYXJTcGFjZX0sCisgICAge0ZYQlNUUl9JRCgnVCcsICdkJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9Nb3ZlVGV4dFBvaW50fSwKKyAgICB7RlhCU1RSX0lEKCdUJywgJ2YnLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEZvbnR9LAorICAgIHtGWEJTVFJfSUQoJ1QnLCAnaicsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2hvd1RleHR9LAorICAgIHtGWEJTVFJfSUQoJ1QnLCAnbScsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dE1hdHJpeH0sCisgICAge0ZYQlNUUl9JRCgnVCcsICdyJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRUZXh0UmVuZGVyTW9kZX0sCisgICAge0ZYQlNUUl9JRCgnVCcsICdzJywgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRUZXh0UmlzZX0sCisgICAge0ZYQlNUUl9JRCgnVCcsICd3JywgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRXb3JkU3BhY2V9LAorICAgIHtGWEJTVFJfSUQoJ1QnLCAneicsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0SG9yelNjYWxlfSwKKyAgICB7RlhCU1RSX0lEKCdXJywgMCwgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbGlwfSwKKyAgICB7RlhCU1RSX0lEKCdXJywgJyonLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPQ2xpcH0sCisgICAge0ZYQlNUUl9JRCgnYicsIDAsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xvc2VGaWxsU3Ryb2tlUGF0aH0sCisgICAge0ZYQlNUUl9JRCgnYicsICcqJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZUVPRmlsbFN0cm9rZVBhdGh9LAorICAgIHtGWEJTVFJfSUQoJ2MnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0N1cnZlVG9fMTIzfSwKKyAgICB7RlhCU1RSX0lEKCdjJywgJ20nLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0NvbmNhdE1hdHJpeH0sCisgICAge0ZYQlNUUl9JRCgnYycsICdzJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclNwYWNlX0ZpbGx9LAorICAgIHtGWEJTVFJfSUQoJ2QnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldERhc2h9LAorICAgIHtGWEJTVFJfSUQoJ2QnLCAnMCcsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2hhcldpZHRofSwKKyAgICB7RlhCU1RSX0lEKCdkJywgJzEnLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENhY2hlZERldmljZX0sCisgICAge0ZYQlNUUl9JRCgnZicsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFBhdGh9LAorICAgIHtGWEJTVFJfSUQoJ2YnLCAnKicsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsUGF0aH0sCisgICAge0ZYQlNUUl9JRCgnZycsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0R3JheV9GaWxsfSwKKyAgICB7RlhCU1RSX0lEKCdnJywgJ3MnLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEV4dGVuZEdyYXBoU3RhdGV9LAorICAgIHtGWEJTVFJfSUQoJ2gnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0Nsb3NlUGF0aH0sCisgICAge0ZYQlNUUl9JRCgnaScsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0RmxhdH0sCisgICAge0ZYQlNUUl9JRCgnaicsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0TGluZUpvaW59LAorICAgIHtGWEJTVFJfSUQoJ2snLCAwLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENNWUtDb2xvcl9GaWxsfSwKKyAgICB7RlhCU1RSX0lEKCdsJywgMCwgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9MaW5lVG99LAorICAgIHtGWEJTVFJfSUQoJ20nLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUb30sCisgICAge0ZYQlNUUl9JRCgnbicsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kUGF0aH0sCisgICAge0ZYQlNUUl9JRCgncScsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2F2ZUdyYXBoU3RhdGV9LAorICAgIHtGWEJTVFJfSUQoJ3InLCAnZScsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfUmVjdGFuZ2xlfSwKKyAgICB7RlhCU1RSX0lEKCdyJywgJ2cnLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFJHQkNvbG9yX0ZpbGx9LAorICAgIHtGWEJTVFJfSUQoJ3InLCAnaScsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0UmVuZGVySW50ZW50fSwKKyAgICB7RlhCU1RSX0lEKCdzJywgMCwgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZVN0cm9rZVBhdGh9LAorICAgIHtGWEJTVFJfSUQoJ3MnLCAnYycsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JfRmlsbH0sCisgICAge0ZYQlNUUl9JRCgncycsICdjJywgJ24nLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yUFNfRmlsbH0sCisgICAge0ZYQlNUUl9JRCgncycsICdoJywgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TaGFkZUZpbGx9LAorICAgIHtGWEJTVFJfSUQoJ3YnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0N1cnZlVG9fMjN9LAorICAgIHtGWEJTVFJfSUQoJ3cnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVXaWR0aH0sCisgICAge0ZYQlNUUl9JRCgneScsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ3VydmVUb18xM30sCiB9OwotRlhfQk9PTCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6Ok9uT3BlcmF0b3IoY29uc3QgRlhfQ0hBUiogb3ApCi17Ci0gICAgaW50IGkgPSAwOwotICAgIEZYX0RXT1JEIG9waWQgPSAwOwotICAgIHdoaWxlIChpIDwgNCAmJiBvcFtpXSkgewotICAgICAgICBvcGlkID0gKG9waWQgPDwgOCkgKyBvcFtpXTsKLSAgICAgICAgaSArKzsKK0ZYX0JPT0wgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpPbk9wZXJhdG9yKGNvbnN0IEZYX0NIQVIqIG9wKSB7CisgIGludCBpID0gMDsKKyAgRlhfRFdPUkQgb3BpZCA9IDA7CisgIHdoaWxlIChpIDwgNCAmJiBvcFtpXSkgeworICAgIG9waWQgPSAob3BpZCA8PCA4KSArIG9wW2ldOworICAgIGkrKzsKKyAgfQorICB3aGlsZSAoaSA8IDQpIHsKKyAgICBvcGlkIDw8PSA4OworICAgIGkrKzsKKyAgfTsKKyAgaW50IGxvdyA9IDAsIGhpZ2ggPSBzaXplb2YgZ19PcENvZGVzIC8gc2l6ZW9mKE9wQ29kZSkgLSAxOworICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKKyAgICBpbnQgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICBpbnQgY29tcGFyZSA9IG9waWQgLSBnX09wQ29kZXNbbWlkZGxlXS5tX09wSWQ7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgKHRoaXMtPipnX09wQ29kZXNbbWlkZGxlXS5tX09wSGFuZGxlcikoKTsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICB3aGlsZSAoaSA8IDQpIHsKLSAgICAgICAgb3BpZCA8PD0gODsKLSAgICAgICAgaSArKzsKLSAgICB9OwotICAgIGludCBsb3cgPSAwLCBoaWdoID0gc2l6ZW9mIGdfT3BDb2RlcyAvIHNpemVvZihPcENvZGUpIC0gMTsKLSAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKLSAgICAgICAgaW50IG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICAgIGludCBjb21wYXJlID0gb3BpZCAtIGdfT3BDb2Rlc1ttaWRkbGVdLm1fT3BJZDsKLSAgICAgICAgaWYgKGNvbXBhcmUgPT0gMCkgewotICAgICAgICAgICAgKHRoaXMtPipnX09wQ29kZXNbbWlkZGxlXS5tX09wSGFuZGxlcikoKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wYXJlIDwgMCkgewotICAgICAgICAgICAgaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgICB9CisgICAgaWYgKGNvbXBhcmUgPCAwKSB7CisgICAgICBoaWdoID0gbWlkZGxlIC0gMTsKKyAgICB9IGVsc2UgeworICAgICAgbG93ID0gbWlkZGxlICsgMTsKICAgICB9Ci0gICAgcmV0dXJuIG1fQ29tcGF0Q291bnQgIT0gMDsKKyAgfQorICByZXR1cm4gbV9Db21wYXRDb3VudCAhPSAwOwogfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZUZpbGxTdHJva2VQYXRoKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSGFuZGxlX0Nsb3NlUGF0aCgpOwotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIFRSVUUpOwordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZUZpbGxTdHJva2VQYXRoKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIEhhbmRsZV9DbG9zZVBhdGgoKTsKKyAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgVFJVRSk7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0ZpbGxTdHJva2VQYXRoKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgVFJVRSk7Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0ZpbGxTdHJva2VQYXRoKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIFRSVUUpOwogfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZUVPRmlsbFN0cm9rZVBhdGgoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBZGRQYXRoUG9pbnQobV9QYXRoU3RhcnRYLCBtX1BhdGhTdGFydFksIEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRSk7Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCBUUlVFKTsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xvc2VFT0ZpbGxTdHJva2VQYXRoKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIEFkZFBhdGhQb2ludChtX1BhdGhTdGFydFgsIG1fUGF0aFN0YXJ0WSwgRlhQVF9MSU5FVE8gfCBGWFBUX0NMT1NFRklHVVJFKTsKKyAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCBUUlVFKTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsU3Ryb2tlUGF0aCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX0FMVEVSTkFURSwgVFJVRSk7Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPRmlsbFN0cm9rZVBhdGgoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCBUUlVFKTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5NYXJrZWRDb250ZW50X0RpY3Rpb25hcnkoKQotewotICAgIGlmICghbV9PcHRpb25zLm1fYk1hcmtlZENvbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyB0YWcgPSBHZXRTdHJpbmcoMSk7Ci0gICAgQ1BERl9PYmplY3QqIHBQcm9wZXJ0eSA9IEdldE9iamVjdCgwKTsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5NYXJrZWRDb250ZW50X0RpY3Rpb25hcnkoKSB7CisgIGlmICghbV9PcHRpb25zLm1fYk1hcmtlZENvbnRlbnQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgdGFnID0gR2V0U3RyaW5nKDEpOworICBDUERGX09iamVjdCogcFByb3BlcnR5ID0gR2V0T2JqZWN0KDApOworICBpZiAocFByb3BlcnR5ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfQk9PTCBiRGlyZWN0ID0gVFJVRTsKKyAgaWYgKHBQcm9wZXJ0eS0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7CisgICAgcFByb3BlcnR5ID0gRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJQcm9wZXJ0aWVzIiksIHBQcm9wZXJ0eS0+R2V0U3RyaW5nKCkpOwogICAgIGlmIChwUHJvcGVydHkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CisgICAgICByZXR1cm47CiAgICAgfQotICAgIEZYX0JPT0wgYkRpcmVjdCA9IFRSVUU7Ci0gICAgaWYgKHBQcm9wZXJ0eS0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgIHBQcm9wZXJ0eSA9IEZpbmRSZXNvdXJjZU9iaihGWF9CU1RSQygiUHJvcGVydGllcyIpLCBwUHJvcGVydHktPkdldFN0cmluZygpKTsKLSAgICAgICAgaWYgKHBQcm9wZXJ0eSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYkRpcmVjdCA9IEZBTFNFOwotICAgIH0KLSAgICBpZiAocFByb3BlcnR5LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX0N1ckNvbnRlbnRNYXJrLkdldE1vZGlmeSgpLT5BZGRNYXJrKHRhZywgKENQREZfRGljdGlvbmFyeSopcFByb3BlcnR5LCBiRGlyZWN0KTsKKyAgICBiRGlyZWN0ID0gRkFMU0U7CisgIH0KKyAgaWYgKHBQcm9wZXJ0eS0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fQ3VyQ29udGVudE1hcmsuR2V0TW9kaWZ5KCktPkFkZE1hcmsodGFnLCAoQ1BERl9EaWN0aW9uYXJ5KilwUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRpcmVjdCk7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luTWFya2VkQ29udGVudCgpCi17Ci0gICAgaWYgKCFtX09wdGlvbnMubV9iTWFya2VkQ29udGVudCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIHRhZyA9IEdldFN0cmluZygwKTsKLSAgICBtX0N1ckNvbnRlbnRNYXJrLkdldE1vZGlmeSgpLT5BZGRNYXJrKHRhZywgTlVMTCwgRkFMU0UpOwordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnQoKSB7CisgIGlmICghbV9PcHRpb25zLm1fYk1hcmtlZENvbnRlbnQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgdGFnID0gR2V0U3RyaW5nKDApOworICBtX0N1ckNvbnRlbnRNYXJrLkdldE1vZGlmeSgpLT5BZGRNYXJrKHRhZywgTlVMTCwgRkFMU0UpOwogfQogc3RydWN0IF9GWF9CU1RSIHsKLSAgICBjb25zdCBGWF9DSEFSKgltX1B0cjsKLSAgICBpbnQJCQltX1NpemU7CisgIGNvbnN0IEZYX0NIQVIqIG1fUHRyOworICBpbnQgbV9TaXplOwogfTsKLSNkZWZpbmUgX0ZYX0JTVFJDKHN0cikge3N0ciwgc2l6ZW9mKHN0ciktMX0KKyNkZWZpbmUgX0ZYX0JTVFJDKHN0cikgXAorICB7IHN0ciwgc2l6ZW9mKHN0cikgLSAxIH0KIGNvbnN0IF9GWF9CU1RSIF9QREZfSW5saW5lS2V5QWJicltdID0gewotICAgIF9GWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpLCBfRlhfQlNUUkMoIkJQQyIpLAotICAgIF9GWF9CU1RSQygiQ29sb3JTcGFjZSIpLCBfRlhfQlNUUkMoIkNTIiksCi0gICAgX0ZYX0JTVFJDKCJEZWNvZGUiKSwgX0ZYX0JTVFJDKCJEIiksCi0gICAgX0ZYX0JTVFJDKCJEZWNvZGVQYXJtcyIpLCBfRlhfQlNUUkMoIkRQIiksCi0gICAgX0ZYX0JTVFJDKCJGaWx0ZXIiKSwgX0ZYX0JTVFJDKCJGIiksCi0gICAgX0ZYX0JTVFJDKCJIZWlnaHQiKSwgX0ZYX0JTVFJDKCJIIiksCi0gICAgX0ZYX0JTVFJDKCJJbWFnZU1hc2siKSwgX0ZYX0JTVFJDKCJJTSIpLAotICAgIF9GWF9CU1RSQygiSW50ZXJwb2xhdGUiKSwgX0ZYX0JTVFJDKCJJIiksCi0gICAgX0ZYX0JTVFJDKCJXaWR0aCIpLCBfRlhfQlNUUkMoIlciKSwKKyAgICBfRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSwKKyAgICBfRlhfQlNUUkMoIkJQQyIpLAorICAgIF9GWF9CU1RSQygiQ29sb3JTcGFjZSIpLAorICAgIF9GWF9CU1RSQygiQ1MiKSwKKyAgICBfRlhfQlNUUkMoIkRlY29kZSIpLAorICAgIF9GWF9CU1RSQygiRCIpLAorICAgIF9GWF9CU1RSQygiRGVjb2RlUGFybXMiKSwKKyAgICBfRlhfQlNUUkMoIkRQIiksCisgICAgX0ZYX0JTVFJDKCJGaWx0ZXIiKSwKKyAgICBfRlhfQlNUUkMoIkYiKSwKKyAgICBfRlhfQlNUUkMoIkhlaWdodCIpLAorICAgIF9GWF9CU1RSQygiSCIpLAorICAgIF9GWF9CU1RSQygiSW1hZ2VNYXNrIiksCisgICAgX0ZYX0JTVFJDKCJJTSIpLAorICAgIF9GWF9CU1RSQygiSW50ZXJwb2xhdGUiKSwKKyAgICBfRlhfQlNUUkMoIkkiKSwKKyAgICBfRlhfQlNUUkMoIldpZHRoIiksCisgICAgX0ZYX0JTVFJDKCJXIiksCiB9OwogY29uc3QgX0ZYX0JTVFIgX1BERl9JbmxpbmVWYWx1ZUFiYnJbXSA9IHsKLSAgICBfRlhfQlNUUkMoIkRldmljZUdyYXkiKSwgX0ZYX0JTVFJDKCJHIiksCi0gICAgX0ZYX0JTVFJDKCJEZXZpY2VSR0IiKSwgX0ZYX0JTVFJDKCJSR0IiKSwKLSAgICBfRlhfQlNUUkMoIkRldmljZUNNWUsiKSwgX0ZYX0JTVFJDKCJDTVlLIiksCi0gICAgX0ZYX0JTVFJDKCJJbmRleGVkIiksIF9GWF9CU1RSQygiSSIpLAotICAgIF9GWF9CU1RSQygiQVNDSUlIZXhEZWNvZGUiKSwgX0ZYX0JTVFJDKCJBSHgiKSwKLSAgICBfRlhfQlNUUkMoIkFTQ0lJODVEZWNvZGUiKSwgX0ZYX0JTVFJDKCJBODUiKSwKLSAgICBfRlhfQlNUUkMoIkxaV0RlY29kZSIpLCBfRlhfQlNUUkMoIkxaVyIpLAotICAgIF9GWF9CU1RSQygiRmxhdGVEZWNvZGUiKSwgX0ZYX0JTVFJDKCJGbCIpLAorICAgIF9GWF9CU1RSQygiRGV2aWNlR3JheSIpLCAgICAgIF9GWF9CU1RSQygiRyIpLAorICAgIF9GWF9CU1RSQygiRGV2aWNlUkdCIiksICAgICAgIF9GWF9CU1RSQygiUkdCIiksCisgICAgX0ZYX0JTVFJDKCJEZXZpY2VDTVlLIiksICAgICAgX0ZYX0JTVFJDKCJDTVlLIiksCisgICAgX0ZYX0JTVFJDKCJJbmRleGVkIiksICAgICAgICAgX0ZYX0JTVFJDKCJJIiksCisgICAgX0ZYX0JTVFJDKCJBU0NJSUhleERlY29kZSIpLCAgX0ZYX0JTVFJDKCJBSHgiKSwKKyAgICBfRlhfQlNUUkMoIkFTQ0lJODVEZWNvZGUiKSwgICBfRlhfQlNUUkMoIkE4NSIpLAorICAgIF9GWF9CU1RSQygiTFpXRGVjb2RlIiksICAgICAgIF9GWF9CU1RSQygiTFpXIiksCisgICAgX0ZYX0JTVFJDKCJGbGF0ZURlY29kZSIpLCAgICAgX0ZYX0JTVFJDKCJGbCIpLAogICAgIF9GWF9CU1RSQygiUnVuTGVuZ3RoRGVjb2RlIiksIF9GWF9CU1RSQygiUkwiKSwKLSAgICBfRlhfQlNUUkMoIkNDSVRURmF4RGVjb2RlIiksIF9GWF9CU1RSQygiQ0NGIiksCi0gICAgX0ZYX0JTVFJDKCJEQ1REZWNvZGUiKSwgX0ZYX0JTVFJDKCJEQ1QiKSwKKyAgICBfRlhfQlNUUkMoIkNDSVRURmF4RGVjb2RlIiksICBfRlhfQlNUUkMoIkNDRiIpLAorICAgIF9GWF9CU1RSQygiRENURGVjb2RlIiksICAgICAgIF9GWF9CU1RSQygiRENUIiksCiB9Owotc3RhdGljIENGWF9CeXRlU3RyaW5nQyBfUERGX0ZpbmRGdWxsTmFtZShjb25zdCBfRlhfQlNUUiogdGFibGUsIGludCBjb3VudCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBhYmJyKQotewotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAoaSA8IGNvdW50KSB7Ci0gICAgICAgIGlmIChhYmJyLkdldExlbmd0aCgpID09IHRhYmxlW2kgKyAxXS5tX1NpemUgJiYgRlhTWVNfbWVtY21wKGFiYnIuR2V0UHRyKCksIHRhYmxlW2kgKyAxXS5tX1B0ciwgYWJici5HZXRMZW5ndGgoKSkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyh0YWJsZVtpXS5tX1B0ciwgdGFibGVbaV0ubV9TaXplKTsKK3N0YXRpYyBDRlhfQnl0ZVN0cmluZ0MgX1BERl9GaW5kRnVsbE5hbWUoY29uc3QgX0ZYX0JTVFIqIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYWJicikgeworICBpbnQgaSA9IDA7CisgIHdoaWxlIChpIDwgY291bnQpIHsKKyAgICBpZiAoYWJici5HZXRMZW5ndGgoKSA9PSB0YWJsZVtpICsgMV0ubV9TaXplICYmCisgICAgICAgIEZYU1lTX21lbWNtcChhYmJyLkdldFB0cigpLCB0YWJsZVtpICsgMV0ubV9QdHIsIGFiYnIuR2V0TGVuZ3RoKCkpID09CisgICAgICAgICAgICAwKSB7CisgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKHRhYmxlW2ldLm1fUHRyLCB0YWJsZVtpXS5tX1NpemUpOworICAgIH0KKyAgICBpICs9IDI7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOworfQordm9pZCBfUERGX1JlcGxhY2VBYmJyKENQREZfT2JqZWN0KiBwT2JqKSB7CisgIHN3aXRjaCAocE9iai0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWTogeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7CisgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwRGljdC0+R2V0U3RhcnRQb3MoKTsKKyAgICAgIHdoaWxlIChwb3MpIHsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OworICAgICAgICBDUERGX09iamVjdCogdmFsdWUgPSBwRGljdC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOworICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgZnVsbG5hbWUgPSBfUERGX0ZpbmRGdWxsTmFtZSgKKyAgICAgICAgICAgIF9QREZfSW5saW5lS2V5QWJiciwgc2l6ZW9mIF9QREZfSW5saW5lS2V5QWJiciAvIHNpemVvZihfRlhfQlNUUiksCisgICAgICAgICAgICBrZXkpOworICAgICAgICBpZiAoIWZ1bGxuYW1lLklzRW1wdHkoKSkgeworICAgICAgICAgIHBEaWN0LT5SZXBsYWNlS2V5KGtleSwgZnVsbG5hbWUpOworICAgICAgICAgIGtleSA9IGZ1bGxuYW1lOwogICAgICAgICB9Ci0gICAgICAgIGkgKz0gMjsKLSAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOwotfQotdm9pZCBfUERGX1JlcGxhY2VBYmJyKENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIHN3aXRjaCAocE9iai0+R2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKLSAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKLSAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwRGljdC0+R2V0U3RhcnRQb3MoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHZhbHVlID0gcERpY3QtPkdldE5leHRFbGVtZW50KHBvcywga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIGZ1bGxuYW1lID0gX1BERl9GaW5kRnVsbE5hbWUoX1BERl9JbmxpbmVLZXlBYmJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgX1BERl9JbmxpbmVLZXlBYmJyIC8gc2l6ZW9mKF9GWF9CU1RSKSwga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmdWxsbmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEaWN0LT5SZXBsYWNlS2V5KGtleSwgZnVsbG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gZnVsbG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSB2YWx1ZS0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IF9QREZfRmluZEZ1bGxOYW1lKF9QREZfSW5saW5lVmFsdWVBYmJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgX1BERl9JbmxpbmVWYWx1ZUFiYnIgLyBzaXplb2YoX0ZYX0JTVFIpLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnVsbG5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpY3QtPlNldEF0TmFtZShrZXksIGZ1bGxuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9QREZfUmVwbGFjZUFiYnIodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwT2JqOwotICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcEFycmF5LT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEVsZW1lbnQtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IHBFbGVtZW50LT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyBmdWxsbmFtZSA9IF9QREZfRmluZEZ1bGxOYW1lKF9QREZfSW5saW5lVmFsdWVBYmJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIF9QREZfSW5saW5lVmFsdWVBYmJyIC8gc2l6ZW9mKF9GWF9CU1RSKSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZ1bGxuYW1lLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBcnJheS0+U2V0QXQoaSwgQ1BERl9OYW1lOjpDcmVhdGUoZnVsbG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9QREZfUmVwbGFjZUFiYnIocEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgIH0KLX0KLXN0YXRpYyBDRlhfQnl0ZVN0cmluZ0MgX1BERl9GaW5kQWJick5hbWUoY29uc3QgX0ZYX0JTVFIqIHRhYmxlLCBpbnQgY291bnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZnVsbE5hbWUpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChpIDwgY291bnQpIHsKLSAgICAgICAgaWYgKGZ1bGxOYW1lLkdldExlbmd0aCgpID09IHRhYmxlW2ldLm1fU2l6ZSAmJiBGWFNZU19tZW1jbXAoZnVsbE5hbWUuR2V0UHRyKCksIHRhYmxlW2ldLm1fUHRyLCBmdWxsTmFtZS5HZXRMZW5ndGgoKSkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyh0YWJsZVtpICsgMV0ubV9QdHIsIHRhYmxlW2kgKyAxXS5tX1NpemUpOwotICAgICAgICB9Ci0gICAgICAgIGkgKz0gMjsKLSAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOwotfQotdm9pZCBfUERGX1JlcGxhY2VGdWxsKENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIHN3aXRjaCAocE9iai0+R2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKLSAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKLSAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwRGljdC0+R2V0U3RhcnRQb3MoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHZhbHVlID0gcERpY3QtPkdldE5leHRFbGVtZW50KHBvcywga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIGFiYnJOYW1lID0gX1BERl9GaW5kQWJick5hbWUoX1BERl9JbmxpbmVLZXlBYmJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX1BERl9JbmxpbmVLZXlBYmJyKSAvIHNpemVvZihfRlhfQlNUUiksIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYWJick5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGljdC0+UmVwbGFjZUtleShrZXksIGFiYnJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGFiYnJOYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gdmFsdWUtPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWJick5hbWUgPSBfUERGX0ZpbmRBYmJyTmFtZShfUERGX0lubGluZVZhbHVlQWJiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKF9QREZfSW5saW5lVmFsdWVBYmJyKSAvIHNpemVvZihfRlhfQlNUUiksIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhYmJyTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGljdC0+U2V0QXROYW1lKGtleSwgYWJick5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgX1BERl9SZXBsYWNlRnVsbCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX0FSUkFZOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBPYmo7Ci0gICAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwQXJyYXktPkdldEVsZW1lbnQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRWxlbWVudC0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gcEVsZW1lbnQtPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIGFiYnJOYW1lID0gX1BERl9GaW5kQWJick5hbWUoX1BERl9JbmxpbmVWYWx1ZUFiYnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgX1BERl9JbmxpbmVWYWx1ZUFiYnIgLyBzaXplb2YoX0ZYX0JTVFIpLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWJick5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5TZXRBdChpLCBDUERGX05hbWU6OkNyZWF0ZShhYmJyTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgX1BERl9SZXBsYWNlRnVsbChwRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpblRleHQoKQotewotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TWF0cml4LlNldCgxLjBmLCAwLCAwLCAxLjBmLCAwLCAwKTsKLSAgICBPbkNoYW5nZVRleHRNYXRyaXgoKTsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggPSAwOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WSA9IDA7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWCA9IDA7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWSA9IDA7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luU2VjdGlvblVuZGVmaW5lZCgpCi17Ci0gICAgbV9Db21wYXRDb3VudCArKzsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ3VydmVUb18xMjMoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDUpLCBHZXROdW1iZXIoNCksIEZYUFRfQkVaSUVSVE8pOwotICAgIEFkZFBhdGhQb2ludChHZXROdW1iZXIoMyksIEdldE51bWJlcigyKSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgQWRkUGF0aFBvaW50KEdldE51bWJlcigxKSwgR2V0TnVtYmVyKDApLCBGWFBUX0JFWklFUlRPKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ29uY2F0TWF0cml4KCkKLXsKLSAgICBGWF9GTE9BVCBhMiA9IEdldE51bWJlcjE2KDUpLCBiMiA9IEdldE51bWJlcjE2KDQpLCBjMiA9IEdldE51bWJlcjE2KDMpLCBkMiA9IEdldE51bWJlcjE2KDIpOwotICAgIEZYX0ZMT0FUIGUyID0gR2V0TnVtYmVyKDEpLCBmMiA9IEdldE51bWJlcigwKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG5ld19tYXRyaXgoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMik7Ci0gICAgbmV3X21hdHJpeC5Db25jYXQobV9wQ3VyU3RhdGVzLT5tX0NUTSk7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0NUTSA9IG5ld19tYXRyaXg7Ci0gICAgT25DaGFuZ2VUZXh0TWF0cml4KCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yU3BhY2VfRmlsbCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzbmFtZSA9IEdldFN0cmluZygwKTsKLSAgICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IEZpbmRDb2xvclNwYWNlKGNzbmFtZSk7Ci0gICAgaWYgKHBDUyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuR2V0TW9kaWZ5KCktPm1fRmlsbENvbG9yLlNldENvbG9yU3BhY2UocENTKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JTcGFjZV9TdHJva2UoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc25hbWUgPSBHZXRTdHJpbmcoMCk7Ci0gICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBGaW5kQ29sb3JTcGFjZShjc25hbWUpOwotICAgIGlmIChwQ1MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLkdldE1vZGlmeSgpLT5tX1N0cm9rZUNvbG9yLlNldENvbG9yU3BhY2UocENTKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0RGFzaCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IEdldE9iamVjdCgxKSA/IEdldE9iamVjdCgxKS0+R2V0QXJyYXkoKSA6IE5VTEw7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wQ3VyU3RhdGVzLT5TZXRMaW5lRGFzaChwQXJyYXksIEdldE51bWJlcigwKSwgMS4wZik7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENoYXJXaWR0aCgpCi17Ci0gICAgbV9UeXBlM0RhdGFbMF0gPSBHZXROdW1iZXIoMSk7Ci0gICAgbV9UeXBlM0RhdGFbMV0gPSBHZXROdW1iZXIoMCk7Ci0gICAgbV9iQ29sb3JlZCA9IFRSVUU7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENhY2hlZERldmljZSgpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpICsrKSB7Ci0gICAgICAgIG1fVHlwZTNEYXRhW2ldID0gR2V0TnVtYmVyKDUgLSBpKTsKLSAgICB9Ci0gICAgbV9iQ29sb3JlZCA9IEZBTFNFOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FeGVjdXRlWE9iamVjdCgpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IEdldFN0cmluZygwKTsKLSAgICBpZiAobmFtZSA9PSBtX0xhc3RJbWFnZU5hbWUgJiYgbV9wTGFzdEltYWdlICYmIG1fcExhc3RJbWFnZS0+R2V0U3RyZWFtKCkgJiYgbV9wTGFzdEltYWdlLT5HZXRTdHJlYW0oKS0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgQWRkSW1hZ2UoTlVMTCwgbV9wTGFzdEltYWdlLCBGQUxTRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICBDUERGX09iamVjdCogcFJlcyA9IE5VTEw7Ci0gICAgICAgIGlmIChtX3BSZXNvdXJjZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BSZXNvdXJjZXMgPT0gbV9wUGFnZVJlc291cmNlcykgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGlzdCA9IG1fcFJlc291cmNlcy0+R2V0RGljdChGWF9CU1RSQygiWE9iamVjdCIpKTsKLSAgICAgICAgICAgIGlmIChwTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFJlcyA9IHBMaXN0LT5HZXRFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgaWYgKHBSZXMgPT0gTlVMTCB8fCBwUmVzLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gdmFsdWUtPkdldFN0cmluZygpOworICAgICAgICAgIGZ1bGxuYW1lID0gX1BERl9GaW5kRnVsbE5hbWUoCisgICAgICAgICAgICAgIF9QREZfSW5saW5lVmFsdWVBYmJyLAorICAgICAgICAgICAgICBzaXplb2YgX1BERl9JbmxpbmVWYWx1ZUFiYnIgLyBzaXplb2YoX0ZYX0JTVFIpLCBuYW1lKTsKKyAgICAgICAgICBpZiAoIWZ1bGxuYW1lLklzRW1wdHkoKSkgeworICAgICAgICAgICAgcERpY3QtPlNldEF0TmFtZShrZXksIGZ1bGxuYW1lKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBMaXN0ID0gbV9wUmVzb3VyY2VzLT5HZXREaWN0KEZYX0JTVFJDKCJYT2JqZWN0IikpOwotICAgICAgICAgICAgaWYgKHBMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9wUGFnZVJlc291cmNlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGlzdCA9IG1fcFBhZ2VSZXNvdXJjZXMtPkdldERpY3QoRlhfQlNUUkMoIlhPYmplY3QiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwUmVzID0gcExpc3QtPkdldEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBSZXMgPT0gTlVMTCB8fCBwUmVzLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwUmVzID0gcExpc3QtPkdldEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBSZXMgPT0gTlVMTCB8fCBwUmVzLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgIF9QREZfUmVwbGFjZUFiYnIodmFsdWUpOwogICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYkZvcm07Ci0gICAgICAgIGlmIChtX3BEb2N1bWVudC0+SXNGb3JtU3RyZWFtKCgoQ1BERl9SZWZlcmVuY2UqKXBSZXMpLT5HZXRSZWZPYmpOdW0oKSwgYkZvcm0pICYmICFiRm9ybSkgewotICAgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX0FSUkFZOiB7CisgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcE9iajsKKyAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgICAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwQXJyYXktPkdldEVsZW1lbnQoaSk7CisgICAgICAgIGlmIChwRWxlbWVudC0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7CisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IHBFbGVtZW50LT5HZXRTdHJpbmcoKTsKKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgZnVsbG5hbWUgPSBfUERGX0ZpbmRGdWxsTmFtZSgKKyAgICAgICAgICAgICAgX1BERl9JbmxpbmVWYWx1ZUFiYnIsCisgICAgICAgICAgICAgIHNpemVvZiBfUERGX0lubGluZVZhbHVlQWJiciAvIHNpemVvZihfRlhfQlNUUiksIG5hbWUpOworICAgICAgICAgIGlmICghZnVsbG5hbWUuSXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwQXJyYXktPlNldEF0KGksIENQREZfTmFtZTo6Q3JlYXRlKGZ1bGxuYW1lKSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIF9QREZfUmVwbGFjZUFiYnIocEVsZW1lbnQpOwogICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKICAgICB9Ci0gICAgQ1BERl9TdHJlYW0qIHBYT2JqZWN0ID0gKENQREZfU3RyZWFtKilGaW5kUmVzb3VyY2VPYmooRlhfQlNUUkMoIlhPYmplY3QiKSwgbmFtZSk7Ci0gICAgaWYgKHBYT2JqZWN0ID09IE5VTEwgfHwgcFhPYmplY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7Ci0gICAgICAgIHJldHVybjsKKyAgfQorfQorc3RhdGljIENGWF9CeXRlU3RyaW5nQyBfUERGX0ZpbmRBYmJyTmFtZShjb25zdCBfRlhfQlNUUiogdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmdWxsTmFtZSkgeworICBpbnQgaSA9IDA7CisgIHdoaWxlIChpIDwgY291bnQpIHsKKyAgICBpZiAoZnVsbE5hbWUuR2V0TGVuZ3RoKCkgPT0gdGFibGVbaV0ubV9TaXplICYmCisgICAgICAgIEZYU1lTX21lbWNtcChmdWxsTmFtZS5HZXRQdHIoKSwgdGFibGVbaV0ubV9QdHIsIGZ1bGxOYW1lLkdldExlbmd0aCgpKSA9PQorICAgICAgICAgICAgMCkgeworICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyh0YWJsZVtpICsgMV0ubV9QdHIsIHRhYmxlW2kgKyAxXS5tX1NpemUpOwogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZ0MgdHlwZSA9IHBYT2JqZWN0LT5HZXREaWN0KCkgPyBwWE9iamVjdC0+R2V0RGljdCgpLT5HZXRDb25zdFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKSA6IENGWF9CeXRlU3RyaW5nQygpOwotICAgIGlmICh0eXBlID09IEZYX0JTVFJDKCJJbWFnZSIpKSB7Ci0gICAgICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICBpICs9IDI7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOworfQordm9pZCBfUERGX1JlcGxhY2VGdWxsKENQREZfT2JqZWN0KiBwT2JqKSB7CisgIHN3aXRjaCAocE9iai0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWTogeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7CisgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwRGljdC0+R2V0U3RhcnRQb3MoKTsKKyAgICAgIHdoaWxlIChwb3MpIHsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OworICAgICAgICBDUERGX09iamVjdCogdmFsdWUgPSBwRGljdC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOworICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgYWJick5hbWUgPSBfUERGX0ZpbmRBYmJyTmFtZSgKKyAgICAgICAgICAgIF9QREZfSW5saW5lS2V5QWJiciwgc2l6ZW9mKF9QREZfSW5saW5lS2V5QWJicikgLyBzaXplb2YoX0ZYX0JTVFIpLAorICAgICAgICAgICAga2V5KTsKKyAgICAgICAgaWYgKCFhYmJyTmFtZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICBwRGljdC0+UmVwbGFjZUtleShrZXksIGFiYnJOYW1lKTsKKyAgICAgICAgICBrZXkgPSBhYmJyTmFtZTsKICAgICAgICAgfQotICAgICAgICBDUERGX0ltYWdlT2JqZWN0KiBwT2JqID0gQWRkSW1hZ2UocFhPYmplY3QsIE5VTEwsIEZBTFNFKTsKLSAgICAgICAgbV9MYXN0SW1hZ2VOYW1lID0gbmFtZTsKLSAgICAgICAgbV9wTGFzdEltYWdlID0gcE9iai0+bV9wSW1hZ2U7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IEZYX0JTVFJDKCJGb3JtIikpIHsKLSAgICAgICAgQWRkRm9ybShwWE9iamVjdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRGb3JtKENQREZfU3RyZWFtKiBwU3RyZWFtKQotewotICAgIGlmICghbV9PcHRpb25zLm1fYlNlcGFyYXRlRm9ybSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMgPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldERpY3QoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKLSAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBmb3JtX21hdHJpeCA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0TWF0cml4KEZYX0JTVFJDKCJNYXRyaXgiKSk7Ci0gICAgICAgIGZvcm1fbWF0cml4LkNvbmNhdChtX3BDdXJTdGF0ZXMtPm1fQ1RNKTsKLSAgICAgICAgQ1BERl9BcnJheSogcEJCb3ggPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldEFycmF5KEZYX0JTVFJDKCJCQm94IikpOwotICAgICAgICBDRlhfRmxvYXRSZWN0IGZvcm1fYmJveDsKLSAgICAgICAgQ1BERl9QYXRoIENsaXBQYXRoOwotICAgICAgICBpZiAocEJCb3gpIHsKLSAgICAgICAgICAgIGZvcm1fYmJveCA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0UmVjdChGWF9CU1RSQygiQkJveCIpKTsKLSAgICAgICAgICAgIENsaXBQYXRoLk5ldygpOwotICAgICAgICAgICAgQ2xpcFBhdGguQXBwZW5kUmVjdChmb3JtX2Jib3gubGVmdCwgZm9ybV9iYm94LmJvdHRvbSwgZm9ybV9iYm94LnJpZ2h0LCBmb3JtX2Jib3gudG9wKTsKLSAgICAgICAgICAgIENsaXBQYXRoLlRyYW5zZm9ybSgmZm9ybV9tYXRyaXgpOwotICAgICAgICAgICAgZm9ybV9iYm94LlRyYW5zZm9ybSgmZm9ybV9tYXRyaXgpOworICAgICAgICBpZiAodmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgeworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSB2YWx1ZS0+R2V0U3RyaW5nKCk7CisgICAgICAgICAgYWJick5hbWUgPSBfUERGX0ZpbmRBYmJyTmFtZSgKKyAgICAgICAgICAgICAgX1BERl9JbmxpbmVWYWx1ZUFiYnIsCisgICAgICAgICAgICAgIHNpemVvZihfUERGX0lubGluZVZhbHVlQWJicikgLyBzaXplb2YoX0ZYX0JTVFIpLCBuYW1lKTsKKyAgICAgICAgICBpZiAoIWFiYnJOYW1lLklzRW1wdHkoKSkgeworICAgICAgICAgICAgcERpY3QtPlNldEF0TmFtZShrZXksIGFiYnJOYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX1BERl9SZXBsYWNlRnVsbCh2YWx1ZSk7CiAgICAgICAgIH0KLSAgICAgICAgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyIHBhcnNlcigKLSAgICAgICAgICAgIG1fcERvY3VtZW50LCBtX3BQYWdlUmVzb3VyY2VzLCBtX3BSZXNvdXJjZXMsICZtX210Q29udGVudFRvVXNlciwKLSAgICAgICAgICAgIG1fcE9iamVjdExpc3QsIHBSZXNvdXJjZXMsICZmb3JtX2Jib3gsICZtX09wdGlvbnMsCi0gICAgICAgICAgICBtX3BDdXJTdGF0ZXMuZ2V0KCksIG1fTGV2ZWwgKyAxKTsKLSAgICAgICAgcGFyc2VyLm1fcEN1clN0YXRlcy0+bV9DVE0gPSBmb3JtX21hdHJpeDsKLSAgICAgICAgaWYgKENsaXBQYXRoLk5vdE51bGwoKSkgewotICAgICAgICAgICAgcGFyc2VyLm1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKENsaXBQYXRoLCBGWEZJTExfV0lORElORywgVFJVRSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfQVJSQVk6IHsKKyAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwT2JqOworICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBBcnJheS0+R2V0RWxlbWVudChpKTsKKyAgICAgICAgaWYgKHBFbGVtZW50LT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gcEVsZW1lbnQtPkdldFN0cmluZygpOworICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyBhYmJyTmFtZSA9IF9QREZfRmluZEFiYnJOYW1lKAorICAgICAgICAgICAgICBfUERGX0lubGluZVZhbHVlQWJiciwKKyAgICAgICAgICAgICAgc2l6ZW9mIF9QREZfSW5saW5lVmFsdWVBYmJyIC8gc2l6ZW9mKF9GWF9CU1RSKSwgbmFtZSk7CisgICAgICAgICAgaWYgKCFhYmJyTmFtZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHBBcnJheS0+U2V0QXQoaSwgQ1BERl9OYW1lOjpDcmVhdGUoYWJick5hbWUpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX1BERl9SZXBsYWNlRnVsbChwRWxlbWVudCk7CiAgICAgICAgIH0KLSAgICAgICAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtOwotICAgICAgICBzdHJlYW0uTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOwotICAgICAgICBpZiAoc3RyZWFtLkdldFNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VyLlBhcnNlKHN0cmVhbS5HZXREYXRhKCksIHN0cmVhbS5HZXRTaXplKCksIDApOwotICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBicmVhazsKICAgICB9Ci0gICAgQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiA9IG5ldyBDUERGX0Zvcm1PYmplY3Q7Ci0gICAgcEZvcm1PYmotPm1fcEZvcm0gPSBuZXcgQ1BERl9Gb3JtKG1fcERvY3VtZW50LCBtX3BQYWdlUmVzb3VyY2VzLCBwU3RyZWFtLCBtX3BSZXNvdXJjZXMpOwotICAgIHBGb3JtT2JqLT5tX0Zvcm1NYXRyaXggPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNOwotICAgIHBGb3JtT2JqLT5tX0Zvcm1NYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKLSAgICBDUERGX0FsbFN0YXRlcyBzdGF0dXM7Ci0gICAgc3RhdHVzLm1fR2VuZXJhbFN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX0dlbmVyYWxTdGF0ZTsKLSAgICBzdGF0dXMubV9HcmFwaFN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX0dyYXBoU3RhdGU7Ci0gICAgc3RhdHVzLm1fQ29sb3JTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlOwotICAgIHN0YXR1cy5tX1RleHRTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGU7Ci0gICAgcEZvcm1PYmotPm1fcEZvcm0tPlBhcnNlQ29udGVudCgmc3RhdHVzLCBOVUxMLCBOVUxMLCAmbV9PcHRpb25zLCBtX0xldmVsICsgMSk7Ci0gICAgaWYgKCFtX3BPYmplY3RMaXN0LT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgJiYgcEZvcm1PYmotPm1fcEZvcm0tPm1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCkgewotICAgICAgICBtX3BPYmplY3RMaXN0LT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgPSBUUlVFOwotICAgIH0KLSAgICBwRm9ybU9iai0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0gICAgU2V0R3JhcGhpY1N0YXRlcyhwRm9ybU9iaiwgVFJVRSwgVFJVRSwgVFJVRSk7Ci0gICAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocEZvcm1PYmopOworICB9CiB9Ci1DUERGX0ltYWdlT2JqZWN0KiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZEltYWdlKENQREZfU3RyZWFtKiBwU3RyZWFtLCBDUERGX0ltYWdlKiBwSW1hZ2UsIEZYX0JPT0wgYklubGluZSkKLXsKLSAgICBpZiAocFN0cmVhbSA9PSBOVUxMICYmIHBJbWFnZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IEltYWdlTWF0cml4OwotICAgIEltYWdlTWF0cml4LkNvcHkobV9wQ3VyU3RhdGVzLT5tX0NUTSk7Ci0gICAgSW1hZ2VNYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKLSAgICBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmogPSBuZXcgQ1BERl9JbWFnZU9iamVjdDsKLSAgICBpZiAocEltYWdlKSB7Ci0gICAgICAgIHBJbWFnZU9iai0+bV9wSW1hZ2UgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0SW1hZ2UocEltYWdlLT5HZXRTdHJlYW0oKSk7Ci0gICAgfSBlbHNlIGlmIChwU3RyZWFtLT5HZXRPYmpOdW0oKSkgewotICAgICAgICBwSW1hZ2VPYmotPm1fcEltYWdlID0gbV9wRG9jdW1lbnQtPkxvYWRJbWFnZUYocFN0cmVhbSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEltYWdlT2JqLT5tX3BJbWFnZSA9IG5ldyBDUERGX0ltYWdlKG1fcERvY3VtZW50KTsKLSAgICAgICAgcEltYWdlT2JqLT5tX3BJbWFnZS0+TG9hZEltYWdlRihwU3RyZWFtLCBiSW5saW5lKTsKLSAgICB9Ci0gICAgU2V0R3JhcGhpY1N0YXRlcyhwSW1hZ2VPYmosIHBJbWFnZU9iai0+bV9wSW1hZ2UtPklzTWFzaygpLCBGQUxTRSwgRkFMU0UpOwotICAgIHBJbWFnZU9iai0+bV9NYXRyaXggPSBJbWFnZU1hdHJpeDsKLSAgICBwSW1hZ2VPYmotPkNhbGNCb3VuZGluZ0JveCgpOwotICAgIG1fcE9iamVjdExpc3QtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBJbWFnZU9iaik7Ci0gICAgcmV0dXJuIHBJbWFnZU9iajsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5UZXh0KCkgeworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dE1hdHJpeC5TZXQoMS4wZiwgMCwgMCwgMS4wZiwgMCwgMCk7CisgIE9uQ2hhbmdlVGV4dE1hdHJpeCgpOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggPSAwOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFkgPSAwOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVYID0gMDsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWSA9IDA7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01hcmtQbGFjZV9EaWN0aW9uYXJ5KCkKLXsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5TZWN0aW9uVW5kZWZpbmVkKCkgeworICBtX0NvbXBhdENvdW50Kys7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VuZEltYWdlKCkKLXsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ3VydmVUb18xMjMoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkUGF0aFBvaW50KEdldE51bWJlcig1KSwgR2V0TnVtYmVyKDQpLCBGWFBUX0JFWklFUlRPKTsKKyAgQWRkUGF0aFBvaW50KEdldE51bWJlcigzKSwgR2V0TnVtYmVyKDIpLCBGWFBUX0JFWklFUlRPKTsKKyAgQWRkUGF0aFBvaW50KEdldE51bWJlcigxKSwgR2V0TnVtYmVyKDApLCBGWFBUX0JFWklFUlRPKTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kTWFya2VkQ29udGVudCgpCi17Ci0gICAgaWYgKCFtX09wdGlvbnMubV9iTWFya2VkQ29udGVudCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX0N1ckNvbnRlbnRNYXJrLklzTnVsbCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGNvdW50ID0gbV9DdXJDb250ZW50TWFyay5HZXRPYmplY3QoKS0+Q291bnRJdGVtcygpOwotICAgIGlmIChjb3VudCA9PSAxKSB7Ci0gICAgICAgIG1fQ3VyQ29udGVudE1hcmsuU2V0TnVsbCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fQ3VyQ29udGVudE1hcmsuR2V0TW9kaWZ5KCktPkRlbGV0ZUxhc3RNYXJrKCk7Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0NvbmNhdE1hdHJpeCgpIHsKKyAgRlhfRkxPQVQgYTIgPSBHZXROdW1iZXIxNig1KSwgYjIgPSBHZXROdW1iZXIxNig0KSwgYzIgPSBHZXROdW1iZXIxNigzKSwKKyAgICAgICAgICAgZDIgPSBHZXROdW1iZXIxNigyKTsKKyAgRlhfRkxPQVQgZTIgPSBHZXROdW1iZXIoMSksIGYyID0gR2V0TnVtYmVyKDApOworICBDRlhfQWZmaW5lTWF0cml4IG5ld19tYXRyaXgoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMik7CisgIG5ld19tYXRyaXguQ29uY2F0KG1fcEN1clN0YXRlcy0+bV9DVE0pOworICBtX3BDdXJTdGF0ZXMtPm1fQ1RNID0gbmV3X21hdHJpeDsKKyAgT25DaGFuZ2VUZXh0TWF0cml4KCk7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VuZFRleHQoKQotewotICAgIGludCBjb3VudCA9IG1fQ2xpcFRleHRMaXN0LkdldFNpemUoKTsKLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX1RleHRNb2RlIDwgNCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0ID0gKENQREZfVGV4dE9iamVjdCopbV9DbGlwVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgICAgICAgICBkZWxldGUgcFRleHQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fQ2xpcFBhdGguQXBwZW5kVGV4dHMoKENQREZfVGV4dE9iamVjdCoqKW1fQ2xpcFRleHRMaXN0LkdldERhdGEoKSwgY291bnQpOwotICAgIH0KLSAgICBtX0NsaXBUZXh0TGlzdC5SZW1vdmVBbGwoKTsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JTcGFjZV9GaWxsKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzbmFtZSA9IEdldFN0cmluZygwKTsKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBGaW5kQ29sb3JTcGFjZShjc25hbWUpOworICBpZiAocENTID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuR2V0TW9kaWZ5KCktPm1fRmlsbENvbG9yLlNldENvbG9yU3BhY2UocENTKTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kU2VjdGlvblVuZGVmaW5lZCgpCi17Ci0gICAgaWYgKG1fQ29tcGF0Q291bnQpIHsKLSAgICAgICAgbV9Db21wYXRDb3VudCAtLTsKLSAgICB9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yU3BhY2VfU3Ryb2tlKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzbmFtZSA9IEdldFN0cmluZygwKTsKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBGaW5kQ29sb3JTcGFjZShjc25hbWUpOworICBpZiAocENTID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuR2V0TW9kaWZ5KCktPm1fU3Ryb2tlQ29sb3IuU2V0Q29sb3JTcGFjZShwQ1MpOwogfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9GaWxsUGF0aCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIEZBTFNFKTsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0RGFzaCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkgPSBHZXRPYmplY3QoMSkgPyBHZXRPYmplY3QoMSktPkdldEFycmF5KCkgOiBOVUxMOworICBpZiAocEFycmF5ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wQ3VyU3RhdGVzLT5TZXRMaW5lRGFzaChwQXJyYXksIEdldE51bWJlcigwKSwgMS4wZik7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0ZpbGxQYXRoT2xkKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgRkFMU0UpOwordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDaGFyV2lkdGgoKSB7CisgIG1fVHlwZTNEYXRhWzBdID0gR2V0TnVtYmVyKDEpOworICBtX1R5cGUzRGF0YVsxXSA9IEdldE51bWJlcigwKTsKKyAgbV9iQ29sb3JlZCA9IFRSVUU7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPRmlsbFBhdGgoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIEZBTFNFKTsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2FjaGVkRGV2aWNlKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgIG1fVHlwZTNEYXRhW2ldID0gR2V0TnVtYmVyKDUgLSBpKTsKKyAgfQorICBtX2JDb2xvcmVkID0gRkFMU0U7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEdyYXlfRmlsbCgpCi17Ci0gICAgRlhfRkxPQVQgdmFsdWUgPSBHZXROdW1iZXIoMCk7Ci0gICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSk7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0RmlsbENvbG9yKHBDUywgJnZhbHVlLCAxKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0R3JheV9TdHJva2UoKQotewotICAgIEZYX0ZMT0FUIHZhbHVlID0gR2V0TnVtYmVyKDApOwotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpOwotICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldFN0cm9rZUNvbG9yKHBDUywgJnZhbHVlLCAxKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0RXh0ZW5kR3JhcGhTdGF0ZSgpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IEdldFN0cmluZygwKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBHUyA9IChDUERGX0RpY3Rpb25hcnkqKUZpbmRSZXNvdXJjZU9iaihGWF9CU1RSQygiRXh0R1N0YXRlIiksIG5hbWUpOwotICAgIGlmIChwR1MgPT0gTlVMTCB8fCBwR1MtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcEN1clN0YXRlcy0+UHJvY2Vzc0V4dEdTKHBHUywgdGhpcyk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0Nsb3NlUGF0aCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX1BhdGhQb2ludENvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9QYXRoU3RhcnRYICE9IG1fUGF0aEN1cnJlbnRYIHx8IG1fUGF0aFN0YXJ0WSAhPSBtX1BhdGhDdXJyZW50WSkgewotICAgICAgICBBZGRQYXRoUG9pbnQobV9QYXRoU3RhcnRYLCBtX1BhdGhTdGFydFksIEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRSk7Ci0gICAgfSBlbHNlIGlmIChtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX0ZsYWcgIT0gRlhQVF9NT1ZFVE8pIHsKLSAgICAgICAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9GbGFnIHw9IEZYUFRfQ0xPU0VGSUdVUkU7Ci0gICAgfQotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRGbGF0KCkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpLT5tX0ZsYXRuZXNzID0gR2V0TnVtYmVyKDApOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbkltYWdlRGF0YSgpCi17Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVKb2luKCkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKS0+bV9MaW5lSm9pbiA9IChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luKUdldEludGVnZXIoMCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVDYXAoKQotewotICAgIG1fcEN1clN0YXRlcy0+bV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpLT5tX0xpbmVDYXAgPSAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwKUdldEludGVnZXIoMCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENNWUtDb2xvcl9GaWxsKCkKLXsKLSAgICBSRVFVSVJFX1BBUkFNUyg0KTsKLSAgICBGWF9GTE9BVCB2YWx1ZXNbNF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcigzIC0gaSk7Ci0gICAgfQotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUNNWUspOwotICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcihwQ1MsIHZhbHVlcywgNCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENNWUtDb2xvcl9TdHJva2UoKQotewotICAgIFJFUVVJUkVfUEFSQU1TKDQpOwotICAgIEZYX0ZMT0FUIHZhbHVlc1s0XTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKDMgLSBpKTsKLSAgICB9Ci0gICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFQ01ZSyk7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0U3Ryb2tlQ29sb3IocENTLCB2YWx1ZXMsIDQpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9MaW5lVG8oKQotewotICAgIFJFUVVJUkVfUEFSQU1TKDIpOwotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCksIEZYUFRfTElORVRPKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRvKCkKLXsKLSAgICBSRVFVSVJFX1BBUkFNUygyKTsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIG1fcFN5bnRheC0+U2tpcFBhdGhPYmplY3QoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCksIEZYUFRfTU9WRVRPKTsKLSAgICBQYXJzZVBhdGhPYmplY3QoKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0TWl0ZXJMaW1pdCgpCi17Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCktPm1fTWl0ZXJMaW1pdCA9IEdldE51bWJlcigwKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTWFya1BsYWNlKCkKLXsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kUGF0aCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFkZFBhdGhPYmplY3QoMCwgRkFMU0UpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TYXZlR3JhcGhTdGF0ZSgpCi17Ci0gICAgQ1BERl9BbGxTdGF0ZXMqIHBTdGF0ZXMgPSBuZXcgQ1BERl9BbGxTdGF0ZXM7Ci0gICAgcFN0YXRlcy0+Q29weSgqbV9wQ3VyU3RhdGVzKTsKLSAgICBtX1N0YXRlU3RhY2suQWRkKHBTdGF0ZXMpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9SZXN0b3JlR3JhcGhTdGF0ZSgpCi17Ci0gICAgaW50IHNpemUgPSBtX1N0YXRlU3RhY2suR2V0U2l6ZSgpOwotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0FsbFN0YXRlcyogcFN0YXRlcyA9IChDUERGX0FsbFN0YXRlcyopbV9TdGF0ZVN0YWNrLkdldEF0KHNpemUgLSAxKTsKLSAgICBtX3BDdXJTdGF0ZXMtPkNvcHkoKnBTdGF0ZXMpOwotICAgIGRlbGV0ZSBwU3RhdGVzOwotICAgIG1fU3RhdGVTdGFjay5SZW1vdmVBdChzaXplIC0gMSk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1JlY3RhbmdsZSgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0ZMT0FUIHggPSBHZXROdW1iZXIoMyksIHkgPSBHZXROdW1iZXIoMik7Ci0gICAgRlhfRkxPQVQgdyA9IEdldE51bWJlcigxKSwgaCA9IEdldE51bWJlcigwKTsKLSAgICBBZGRQYXRoUmVjdCh4LCB5LCB3LCBoKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRQYXRoUmVjdChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB3LCBGWF9GTE9BVCBoKQotewotICAgIEFkZFBhdGhQb2ludCh4LCB5LCBGWFBUX01PVkVUTyk7Ci0gICAgQWRkUGF0aFBvaW50KHggKyB3LCB5LCBGWFBUX0xJTkVUTyk7Ci0gICAgQWRkUGF0aFBvaW50KHggKyB3LCB5ICsgaCwgRlhQVF9MSU5FVE8pOwotICAgIEFkZFBhdGhQb2ludCh4LCB5ICsgaCwgRlhQVF9MSU5FVE8pOwotICAgIEFkZFBhdGhQb2ludCh4LCB5LCBGWFBUX0xJTkVUTyB8IEZYUFRfQ0xPU0VGSUdVUkUpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRSR0JDb2xvcl9GaWxsKCkKLXsKLSAgICBSRVFVSVJFX1BBUkFNUygzKTsKLSAgICBGWF9GTE9BVCB2YWx1ZXNbM107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpICsrKSB7Ci0gICAgICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcigyIC0gaSk7Ci0gICAgfQotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQik7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0RmlsbENvbG9yKHBDUywgdmFsdWVzLCAzKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0UkdCQ29sb3JfU3Ryb2tlKCkKLXsKLSAgICBSRVFVSVJFX1BBUkFNUygzKTsKLSAgICBGWF9GTE9BVCB2YWx1ZXNbM107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpICsrKSB7Ci0gICAgICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcigyIC0gaSk7Ci0gICAgfQotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQik7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0U3Ryb2tlQ29sb3IocENTLCB2YWx1ZXMsIDMpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRSZW5kZXJJbnRlbnQoKQotewotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZVN0cm9rZVBhdGgoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBIYW5kbGVfQ2xvc2VQYXRoKCk7Ci0gICAgQWRkUGF0aE9iamVjdCgwLCBUUlVFKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU3Ryb2tlUGF0aCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFkZFBhdGhPYmplY3QoMCwgVFJVRSk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yX0ZpbGwoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9GTE9BVCB2YWx1ZXNbNF07Ci0gICAgaW50IG5hcmdzID0gbV9QYXJhbUNvdW50OwotICAgIGlmIChuYXJncyA+IDQpIHsKLSAgICAgICAgbmFyZ3MgPSA0OwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hcmdzOyBpICsrKSB7Ci0gICAgICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcihuYXJncyAtIGkgLSAxKTsKLSAgICB9Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0RmlsbENvbG9yKE5VTEwsIHZhbHVlcywgbmFyZ3MpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvcl9TdHJva2UoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9GTE9BVCB2YWx1ZXNbNF07Ci0gICAgaW50IG5hcmdzID0gbV9QYXJhbUNvdW50OwotICAgIGlmIChuYXJncyA+IDQpIHsKLSAgICAgICAgbmFyZ3MgPSA0OwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hcmdzOyBpICsrKSB7Ci0gICAgICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcihuYXJncyAtIGkgLSAxKTsKLSAgICB9Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0U3Ryb2tlQ29sb3IoTlVMTCwgdmFsdWVzLCBuYXJncyk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yUFNfRmlsbCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwTGFzdFBhcmFtID0gR2V0T2JqZWN0KDApOwotICAgIGlmIChwTGFzdFBhcmFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbmFyZ3MgPSBtX1BhcmFtQ291bnQ7Ci0gICAgaW50IG52YWx1ZXMgPSBuYXJnczsKLSAgICBpZiAocExhc3RQYXJhbS0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgIG52YWx1ZXMgLS07Ci0gICAgfQotICAgIEZYX0ZMT0FUKiB2YWx1ZXMgPSBOVUxMOwotICAgIGlmIChudmFsdWVzKSB7Ci0gICAgICAgIHZhbHVlcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBudmFsdWVzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudmFsdWVzOyBpICsrKSB7Ci0gICAgICAgICAgICB2YWx1ZXNbaV0gPSBHZXROdW1iZXIobmFyZ3MgLSBpIC0gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG52YWx1ZXMgIT0gbmFyZ3MpIHsKLSAgICAgICAgQ1BERl9QYXR0ZXJuKiBwUGF0dGVybiA9IEZpbmRQYXR0ZXJuKEdldFN0cmluZygwKSwgRkFMU0UpOwotICAgICAgICBpZiAocFBhdHRlcm4pIHsKLSAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldEZpbGxQYXR0ZXJuKHBQYXR0ZXJuLCB2YWx1ZXMsIG52YWx1ZXMpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0RmlsbENvbG9yKE5VTEwsIHZhbHVlcywgbnZhbHVlcyk7Ci0gICAgfQotICAgIGlmICh2YWx1ZXMpIHsKLSAgICAgICAgRlhfRnJlZSh2YWx1ZXMpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JQU19TdHJva2UoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcExhc3RQYXJhbSA9IEdldE9iamVjdCgwKTsKLSAgICBpZiAocExhc3RQYXJhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IG5hcmdzID0gbV9QYXJhbUNvdW50OwotICAgIGludCBudmFsdWVzID0gbmFyZ3M7Ci0gICAgaWYgKHBMYXN0UGFyYW0tPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICBudmFsdWVzIC0tOwotICAgIH0KLSAgICBGWF9GTE9BVCogdmFsdWVzID0gTlVMTDsKLSAgICBpZiAobnZhbHVlcykgewotICAgICAgICB2YWx1ZXMgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbnZhbHVlcyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnZhbHVlczsgaSArKykgewotICAgICAgICAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKG5hcmdzIC0gaSAtIDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChudmFsdWVzICE9IG5hcmdzKSB7Ci0gICAgICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIEZBTFNFKTsKLSAgICAgICAgaWYgKHBQYXR0ZXJuKSB7Ci0gICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VQYXR0ZXJuKHBQYXR0ZXJuLCB2YWx1ZXMsIG52YWx1ZXMpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0U3Ryb2tlQ29sb3IoTlVMTCwgdmFsdWVzLCBudmFsdWVzKTsKLSAgICB9Ci0gICAgaWYgKHZhbHVlcykgewotICAgICAgICBGWF9GcmVlKHZhbHVlcyk7Ci0gICAgfQotfQotQ0ZYX0Zsb2F0UmVjdCBfR2V0U2hhZGluZ0JCb3goQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGludCB0eXBlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywgQ1BERl9Db2xvclNwYWNlKiBwQ1MpOwotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TaGFkZUZpbGwoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBUUlVFKTsKLSAgICBpZiAocFBhdHRlcm4gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwUGF0dGVybi0+bV9QYXR0ZXJuVHlwZSAhPSBQQVRURVJOX1NIQURJTkcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX1NoYWRpbmdQYXR0ZXJuKiBwU2hhZGluZyA9IChDUERGX1NoYWRpbmdQYXR0ZXJuKilwUGF0dGVybjsKLSAgICBpZiAoIXBTaGFkaW5nLT5tX2JTaGFkaW5nT2JqKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFwU2hhZGluZy0+TG9hZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9TaGFkaW5nT2JqZWN0KiBwT2JqID0gbmV3IENQREZfU2hhZGluZ09iamVjdDsKLSAgICBwT2JqLT5tX3BTaGFkaW5nID0gcFNoYWRpbmc7Ci0gICAgU2V0R3JhcGhpY1N0YXRlcyhwT2JqLCBGQUxTRSwgRkFMU0UsIEZBTFNFKTsKLSAgICBwT2JqLT5tX01hdHJpeCA9IG1fcEN1clN0YXRlcy0+bV9DVE07Ci0gICAgcE9iai0+bV9NYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKLSAgICBDRlhfRmxvYXRSZWN0IGJib3g7Ci0gICAgaWYgKCFwT2JqLT5tX0NsaXBQYXRoLklzTnVsbCgpKSB7Ci0gICAgICAgIGJib3ggPSBwT2JqLT5tX0NsaXBQYXRoLkdldENsaXBCb3goKTsKLSAgICB9IGVsc2UgewotICAgICAgICBiYm94ID0gbV9CQm94OwotICAgIH0KLSAgICBpZiAocFNoYWRpbmctPm1fU2hhZGluZ1R5cGUgPj0gNCkgewotICAgICAgICBiYm94LkludGVyc2VjdChfR2V0U2hhZGluZ0JCb3goKENQREZfU3RyZWFtKilwU2hhZGluZy0+bV9wU2hhZGluZ09iaiwgcFNoYWRpbmctPm1fU2hhZGluZ1R5cGUsICZwT2JqLT5tX01hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaGFkaW5nLT5tX3BGdW5jdGlvbnMsIHBTaGFkaW5nLT5tX25GdW5jcywgcFNoYWRpbmctPm1fcENTKSk7Ci0gICAgfQotICAgIHBPYmotPm1fTGVmdCA9IGJib3gubGVmdDsKLSAgICBwT2JqLT5tX1JpZ2h0ID0gYmJveC5yaWdodDsKLSAgICBwT2JqLT5tX1RvcCA9IGJib3gudG9wOwotICAgIHBPYmotPm1fQm90dG9tID0gYmJveC5ib3R0b207Ci0gICAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocE9iaik7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENoYXJTcGFjZSgpCi17Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9DaGFyU3BhY2UgPSBHZXROdW1iZXIoMCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUZXh0UG9pbnQoKQotewotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVggKz0gR2V0TnVtYmVyKDEpOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVkgKz0gR2V0TnVtYmVyKDApOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WCA9IG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVg7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRZID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRleHRQb2ludF9TZXRMZWFkaW5nKCkKLXsKLSAgICBIYW5kbGVfTW92ZVRleHRQb2ludCgpOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGVhZGluZyA9IC1HZXROdW1iZXIoMCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEZvbnQoKQotewotICAgIEZYX0ZMT0FUIGZzID0gR2V0TnVtYmVyKDApOwotICAgIGlmIChmcyA9PSAwKSB7Ci0gICAgICAgIGZzID0gbV9EZWZGb250U2l6ZTsKLSAgICB9Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9Gb250U2l6ZSA9IGZzOwotICAgIENQREZfRm9udCogcEZvbnQgPSBGaW5kRm9udChHZXRTdHJpbmcoMSkpOwotICAgIGlmIChwRm9udCkgewotICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLlNldEZvbnQocEZvbnQpOwotICAgIH0KLX0KLUNQREZfT2JqZWN0KiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRSZXNvdXJjZU9iaihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHR5cGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKQotewordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FeGVjdXRlWE9iamVjdCgpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IEdldFN0cmluZygwKTsKKyAgaWYgKG5hbWUgPT0gbV9MYXN0SW1hZ2VOYW1lICYmIG1fcExhc3RJbWFnZSAmJiBtX3BMYXN0SW1hZ2UtPkdldFN0cmVhbSgpICYmCisgICAgICBtX3BMYXN0SW1hZ2UtPkdldFN0cmVhbSgpLT5HZXRPYmpOdW0oKSkgeworICAgIEFkZEltYWdlKE5VTEwsIG1fcExhc3RJbWFnZSwgRkFMU0UpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgQ1BERl9PYmplY3QqIHBSZXMgPSBOVUxMOwogICAgIGlmIChtX3BSZXNvdXJjZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIHJldHVybjsKICAgICB9CiAgICAgaWYgKG1fcFJlc291cmNlcyA9PSBtX3BQYWdlUmVzb3VyY2VzKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcExpc3QgPSBtX3BSZXNvdXJjZXMtPkdldERpY3QodHlwZSk7Ci0gICAgICAgIGlmIChwTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcExpc3QgPSBtX3BSZXNvdXJjZXMtPkdldERpY3QoRlhfQlNUUkMoIlhPYmplY3QiKSk7CisgICAgICBpZiAocExpc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBwUmVzID0gcExpc3QtPkdldEVsZW1lbnQobmFtZSk7CisgICAgICBpZiAocFJlcyA9PSBOVUxMIHx8IHBSZXMtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGlzdCA9IG1fcFJlc291cmNlcy0+R2V0RGljdChGWF9CU1RSQygiWE9iamVjdCIpKTsKKyAgICAgIGlmIChwTGlzdCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChtX3BQYWdlUmVzb3VyY2VzID09IE5VTEwpIHsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QqIHBSZXMgPSBwTGlzdC0+R2V0RWxlbWVudFZhbHVlKG5hbWUpOwotICAgICAgICByZXR1cm4gcFJlczsKKyAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGlzdCA9IG1fcFBhZ2VSZXNvdXJjZXMtPkdldERpY3QoRlhfQlNUUkMoIlhPYmplY3QiKSk7CisgICAgICAgIGlmIChwTGlzdCA9PSBOVUxMKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBSZXMgPSBwTGlzdC0+R2V0RWxlbWVudChuYW1lKTsKKyAgICAgICAgaWYgKHBSZXMgPT0gTlVMTCB8fCBwUmVzLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcFJlcyA9IHBMaXN0LT5HZXRFbGVtZW50KG5hbWUpOworICAgICAgICBpZiAocFJlcyA9PSBOVUxMIHx8IHBSZXMtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CiAgICAgfQorICAgIEZYX0JPT0wgYkZvcm07CisgICAgaWYgKG1fcERvY3VtZW50LT5Jc0Zvcm1TdHJlYW0oKChDUERGX1JlZmVyZW5jZSopcFJlcyktPkdldFJlZk9iak51bSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGb3JtKSAmJgorICAgICAgICAhYkZvcm0pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBYT2JqZWN0ID0KKyAgICAgIChDUERGX1N0cmVhbSopRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJYT2JqZWN0IiksIG5hbWUpOworICBpZiAocFhPYmplY3QgPT0gTlVMTCB8fCBwWE9iamVjdC0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKKyAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOworICAgIHJldHVybjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZ0MgdHlwZSA9CisgICAgICBwWE9iamVjdC0+R2V0RGljdCgpCisgICAgICAgICAgPyBwWE9iamVjdC0+R2V0RGljdCgpLT5HZXRDb25zdFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKQorICAgICAgICAgIDogQ0ZYX0J5dGVTdHJpbmdDKCk7CisgIGlmICh0eXBlID09IEZYX0JTVFJDKCJJbWFnZSIpKSB7CisgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDUERGX0ltYWdlT2JqZWN0KiBwT2JqID0gQWRkSW1hZ2UocFhPYmplY3QsIE5VTEwsIEZBTFNFKTsKKyAgICBtX0xhc3RJbWFnZU5hbWUgPSBuYW1lOworICAgIG1fcExhc3RJbWFnZSA9IHBPYmotPm1fcEltYWdlOworICB9IGVsc2UgaWYgKHR5cGUgPT0gRlhfQlNUUkMoIkZvcm0iKSkgeworICAgIEFkZEZvcm0ocFhPYmplY3QpOworICB9IGVsc2UgeworICAgIHJldHVybjsKKyAgfQorfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZEZvcm0oQ1BERl9TdHJlYW0qIHBTdHJlYW0pIHsKKyAgaWYgKCFtX09wdGlvbnMubV9iU2VwYXJhdGVGb3JtKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzID0KKyAgICAgICAgcFN0cmVhbS0+R2V0RGljdCgpLT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7CisgICAgQ0ZYX0FmZmluZU1hdHJpeCBmb3JtX21hdHJpeCA9CisgICAgICAgIHBTdHJlYW0tPkdldERpY3QoKS0+R2V0TWF0cml4KEZYX0JTVFJDKCJNYXRyaXgiKSk7CisgICAgZm9ybV9tYXRyaXguQ29uY2F0KG1fcEN1clN0YXRlcy0+bV9DVE0pOworICAgIENQREZfQXJyYXkqIHBCQm94ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRBcnJheShGWF9CU1RSQygiQkJveCIpKTsKKyAgICBDRlhfRmxvYXRSZWN0IGZvcm1fYmJveDsKKyAgICBDUERGX1BhdGggQ2xpcFBhdGg7CisgICAgaWYgKHBCQm94KSB7CisgICAgICBmb3JtX2Jib3ggPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldFJlY3QoRlhfQlNUUkMoIkJCb3giKSk7CisgICAgICBDbGlwUGF0aC5OZXcoKTsKKyAgICAgIENsaXBQYXRoLkFwcGVuZFJlY3QoZm9ybV9iYm94LmxlZnQsIGZvcm1fYmJveC5ib3R0b20sIGZvcm1fYmJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybV9iYm94LnRvcCk7CisgICAgICBDbGlwUGF0aC5UcmFuc2Zvcm0oJmZvcm1fbWF0cml4KTsKKyAgICAgIGZvcm1fYmJveC5UcmFuc2Zvcm0oJmZvcm1fbWF0cml4KTsKKyAgICB9CisgICAgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyIHBhcnNlcihtX3BEb2N1bWVudCwgbV9wUGFnZVJlc291cmNlcywgbV9wUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fbXRDb250ZW50VG9Vc2VyLCBtX3BPYmplY3RMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlc291cmNlcywgJmZvcm1fYmJveCwgJm1fT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1clN0YXRlcy5nZXQoKSwgbV9MZXZlbCArIDEpOworICAgIHBhcnNlci5tX3BDdXJTdGF0ZXMtPm1fQ1RNID0gZm9ybV9tYXRyaXg7CisgICAgaWYgKENsaXBQYXRoLk5vdE51bGwoKSkgeworICAgICAgcGFyc2VyLm1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKENsaXBQYXRoLCBGWEZJTExfV0lORElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsKKyAgICB9CisgICAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtOworICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgICAgaWYgKHN0cmVhbS5HZXRTaXplKCkgPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwYXJzZXIuUGFyc2Uoc3RyZWFtLkdldERhdGEoKSwgc3RyZWFtLkdldFNpemUoKSwgMCk7CisgICAgcmV0dXJuOworICB9CisgIENQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSBuZXcgQ1BERl9Gb3JtT2JqZWN0OworICBwRm9ybU9iai0+bV9wRm9ybSA9CisgICAgICBuZXcgQ1BERl9Gb3JtKG1fcERvY3VtZW50LCBtX3BQYWdlUmVzb3VyY2VzLCBwU3RyZWFtLCBtX3BSZXNvdXJjZXMpOworICBwRm9ybU9iai0+bV9Gb3JtTWF0cml4ID0gbV9wQ3VyU3RhdGVzLT5tX0NUTTsKKyAgcEZvcm1PYmotPm1fRm9ybU1hdHJpeC5Db25jYXQobV9tdENvbnRlbnRUb1VzZXIpOworICBDUERGX0FsbFN0YXRlcyBzdGF0dXM7CisgIHN0YXR1cy5tX0dlbmVyYWxTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9HZW5lcmFsU3RhdGU7CisgIHN0YXR1cy5tX0dyYXBoU3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fR3JhcGhTdGF0ZTsKKyAgc3RhdHVzLm1fQ29sb3JTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlOworICBzdGF0dXMubV9UZXh0U3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlOworICBwRm9ybU9iai0+bV9wRm9ybS0+UGFyc2VDb250ZW50KCZzdGF0dXMsIE5VTEwsIE5VTEwsICZtX09wdGlvbnMsIG1fTGV2ZWwgKyAxKTsKKyAgaWYgKCFtX3BPYmplY3RMaXN0LT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgJiYKKyAgICAgIHBGb3JtT2JqLT5tX3BGb3JtLT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQpIHsKKyAgICBtX3BPYmplY3RMaXN0LT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgPSBUUlVFOworICB9CisgIHBGb3JtT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgU2V0R3JhcGhpY1N0YXRlcyhwRm9ybU9iaiwgVFJVRSwgVFJVRSwgVFJVRSk7CisgIG1fcE9iamVjdExpc3QtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBGb3JtT2JqKTsKK30KK0NQREZfSW1hZ2VPYmplY3QqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkSW1hZ2UoQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfSW1hZ2UqIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5saW5lKSB7CisgIGlmIChwU3RyZWFtID09IE5VTEwgJiYgcEltYWdlID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfQWZmaW5lTWF0cml4IEltYWdlTWF0cml4OworICBJbWFnZU1hdHJpeC5Db3B5KG1fcEN1clN0YXRlcy0+bV9DVE0pOworICBJbWFnZU1hdHJpeC5Db25jYXQobV9tdENvbnRlbnRUb1VzZXIpOworICBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmogPSBuZXcgQ1BERl9JbWFnZU9iamVjdDsKKyAgaWYgKHBJbWFnZSkgeworICAgIHBJbWFnZU9iai0+bV9wSW1hZ2UgPQorICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0SW1hZ2UocEltYWdlLT5HZXRTdHJlYW0oKSk7CisgIH0gZWxzZSBpZiAocFN0cmVhbS0+R2V0T2JqTnVtKCkpIHsKKyAgICBwSW1hZ2VPYmotPm1fcEltYWdlID0gbV9wRG9jdW1lbnQtPkxvYWRJbWFnZUYocFN0cmVhbSk7CisgIH0gZWxzZSB7CisgICAgcEltYWdlT2JqLT5tX3BJbWFnZSA9IG5ldyBDUERGX0ltYWdlKG1fcERvY3VtZW50KTsKKyAgICBwSW1hZ2VPYmotPm1fcEltYWdlLT5Mb2FkSW1hZ2VGKHBTdHJlYW0sIGJJbmxpbmUpOworICB9CisgIFNldEdyYXBoaWNTdGF0ZXMocEltYWdlT2JqLCBwSW1hZ2VPYmotPm1fcEltYWdlLT5Jc01hc2soKSwgRkFMU0UsIEZBTFNFKTsKKyAgcEltYWdlT2JqLT5tX01hdHJpeCA9IEltYWdlTWF0cml4OworICBwSW1hZ2VPYmotPkNhbGNCb3VuZGluZ0JveCgpOworICBtX3BPYmplY3RMaXN0LT5tX09iamVjdExpc3QuQWRkVGFpbChwSW1hZ2VPYmopOworICByZXR1cm4gcEltYWdlT2JqOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9NYXJrUGxhY2VfRGljdGlvbmFyeSgpIHt9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VuZEltYWdlKCkge30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kTWFya2VkQ29udGVudCgpIHsKKyAgaWYgKCFtX09wdGlvbnMubV9iTWFya2VkQ29udGVudCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9DdXJDb250ZW50TWFyay5Jc051bGwoKSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgY291bnQgPSBtX0N1ckNvbnRlbnRNYXJrLkdldE9iamVjdCgpLT5Db3VudEl0ZW1zKCk7CisgIGlmIChjb3VudCA9PSAxKSB7CisgICAgbV9DdXJDb250ZW50TWFyay5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisgIG1fQ3VyQ29udGVudE1hcmsuR2V0TW9kaWZ5KCktPkRlbGV0ZUxhc3RNYXJrKCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VuZFRleHQoKSB7CisgIGludCBjb3VudCA9IG1fQ2xpcFRleHRMaXN0LkdldFNpemUoKTsKKyAgaWYgKGNvdW50ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fVGV4dE1vZGUgPCA0KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0ID0gKENQREZfVGV4dE9iamVjdCopbV9DbGlwVGV4dExpc3QuR2V0QXQoaSk7CisgICAgICBkZWxldGUgcFRleHQ7CisgICAgfQorICB9IGVsc2UgeworICAgIG1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRUZXh0cygKKyAgICAgICAgKENQREZfVGV4dE9iamVjdCoqKW1fQ2xpcFRleHRMaXN0LkdldERhdGEoKSwgY291bnQpOworICB9CisgIG1fQ2xpcFRleHRMaXN0LlJlbW92ZUFsbCgpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRTZWN0aW9uVW5kZWZpbmVkKCkgeworICBpZiAobV9Db21wYXRDb3VudCkgeworICAgIG1fQ29tcGF0Q291bnQtLTsKKyAgfQorfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9GaWxsUGF0aCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGRQYXRoT2JqZWN0KEZYRklMTF9XSU5ESU5HLCBGQUxTRSk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0ZpbGxQYXRoT2xkKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIEZBTFNFKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsUGF0aCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGRQYXRoT2JqZWN0KEZYRklMTF9BTFRFUk5BVEUsIEZBTFNFKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0R3JheV9GaWxsKCkgeworICBGWF9GTE9BVCB2YWx1ZSA9IEdldE51bWJlcigwKTsKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSk7CisgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcihwQ1MsICZ2YWx1ZSwgMSk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEdyYXlfU3Ryb2tlKCkgeworICBGWF9GTE9BVCB2YWx1ZSA9IEdldE51bWJlcigwKTsKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSk7CisgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldFN0cm9rZUNvbG9yKHBDUywgJnZhbHVlLCAxKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0RXh0ZW5kR3JhcGhTdGF0ZSgpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IEdldFN0cmluZygwKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwR1MgPQorICAgICAgKENQREZfRGljdGlvbmFyeSopRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJFeHRHU3RhdGUiKSwgbmFtZSk7CisgIGlmIChwR1MgPT0gTlVMTCB8fCBwR1MtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CisgICAgcmV0dXJuOworICB9CisgIG1fcEN1clN0YXRlcy0+UHJvY2Vzc0V4dEdTKHBHUywgdGhpcyk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0Nsb3NlUGF0aCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9QYXRoUG9pbnRDb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX1BhdGhTdGFydFggIT0gbV9QYXRoQ3VycmVudFggfHwgbV9QYXRoU3RhcnRZICE9IG1fUGF0aEN1cnJlbnRZKSB7CisgICAgQWRkUGF0aFBvaW50KG1fUGF0aFN0YXJ0WCwgbV9QYXRoU3RhcnRZLCBGWFBUX0xJTkVUTyB8IEZYUFRfQ0xPU0VGSUdVUkUpOworICB9IGVsc2UgaWYgKG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fRmxhZyAhPSBGWFBUX01PVkVUTykgeworICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fRmxhZyB8PSBGWFBUX0NMT1NFRklHVVJFOworICB9Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEZsYXQoKSB7CisgIG1fcEN1clN0YXRlcy0+bV9HZW5lcmFsU3RhdGUuR2V0TW9kaWZ5KCktPm1fRmxhdG5lc3MgPSBHZXROdW1iZXIoMCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luSW1hZ2VEYXRhKCkge30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0TGluZUpvaW4oKSB7CisgIG1fcEN1clN0YXRlcy0+bV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpLT5tX0xpbmVKb2luID0KKyAgICAgIChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luKUdldEludGVnZXIoMCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVDYXAoKSB7CisgIG1fcEN1clN0YXRlcy0+bV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpLT5tX0xpbmVDYXAgPQorICAgICAgKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcClHZXRJbnRlZ2VyKDApOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDTVlLQ29sb3JfRmlsbCgpIHsKKyAgUkVRVUlSRV9QQVJBTVMoNCk7CisgIEZYX0ZMT0FUIHZhbHVlc1s0XTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICB2YWx1ZXNbaV0gPSBHZXROdW1iZXIoMyAtIGkpOworICB9CisgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUNNWUspOworICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IocENTLCB2YWx1ZXMsIDQpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDTVlLQ29sb3JfU3Ryb2tlKCkgeworICBSRVFVSVJFX1BBUkFNUyg0KTsKKyAgRlhfRkxPQVQgdmFsdWVzWzRdOworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcigzIC0gaSk7CisgIH0KKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFQ01ZSyk7CisgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldFN0cm9rZUNvbG9yKHBDUywgdmFsdWVzLCA0KTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTGluZVRvKCkgeworICBSRVFVSVJFX1BBUkFNUygyKTsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCksIEZYUFRfTElORVRPKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRvKCkgeworICBSRVFVSVJFX1BBUkFNUygyKTsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIG1fcFN5bnRheC0+U2tpcFBhdGhPYmplY3QoKTsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkUGF0aFBvaW50KEdldE51bWJlcigxKSwgR2V0TnVtYmVyKDApLCBGWFBUX01PVkVUTyk7CisgIFBhcnNlUGF0aE9iamVjdCgpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRNaXRlckxpbWl0KCkgeworICBtX3BDdXJTdGF0ZXMtPm1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKS0+bV9NaXRlckxpbWl0ID0gR2V0TnVtYmVyKDApOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9NYXJrUGxhY2UoKSB7fQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRQYXRoKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIEFkZFBhdGhPYmplY3QoMCwgRkFMU0UpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TYXZlR3JhcGhTdGF0ZSgpIHsKKyAgQ1BERl9BbGxTdGF0ZXMqIHBTdGF0ZXMgPSBuZXcgQ1BERl9BbGxTdGF0ZXM7CisgIHBTdGF0ZXMtPkNvcHkoKm1fcEN1clN0YXRlcyk7CisgIG1fU3RhdGVTdGFjay5BZGQocFN0YXRlcyk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1Jlc3RvcmVHcmFwaFN0YXRlKCkgeworICBpbnQgc2l6ZSA9IG1fU3RhdGVTdGFjay5HZXRTaXplKCk7CisgIGlmIChzaXplID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9BbGxTdGF0ZXMqIHBTdGF0ZXMgPSAoQ1BERl9BbGxTdGF0ZXMqKW1fU3RhdGVTdGFjay5HZXRBdChzaXplIC0gMSk7CisgIG1fcEN1clN0YXRlcy0+Q29weSgqcFN0YXRlcyk7CisgIGRlbGV0ZSBwU3RhdGVzOworICBtX1N0YXRlU3RhY2suUmVtb3ZlQXQoc2l6ZSAtIDEpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9SZWN0YW5nbGUoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRkxPQVQgeCA9IEdldE51bWJlcigzKSwgeSA9IEdldE51bWJlcigyKTsKKyAgRlhfRkxPQVQgdyA9IEdldE51bWJlcigxKSwgaCA9IEdldE51bWJlcigwKTsKKyAgQWRkUGF0aFJlY3QoeCwgeSwgdywgaCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkUGF0aFJlY3QoRlhfRkxPQVQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaCkgeworICBBZGRQYXRoUG9pbnQoeCwgeSwgRlhQVF9NT1ZFVE8pOworICBBZGRQYXRoUG9pbnQoeCArIHcsIHksIEZYUFRfTElORVRPKTsKKyAgQWRkUGF0aFBvaW50KHggKyB3LCB5ICsgaCwgRlhQVF9MSU5FVE8pOworICBBZGRQYXRoUG9pbnQoeCwgeSArIGgsIEZYUFRfTElORVRPKTsKKyAgQWRkUGF0aFBvaW50KHgsIHksIEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRSk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFJHQkNvbG9yX0ZpbGwoKSB7CisgIFJFUVVJUkVfUEFSQU1TKDMpOworICBGWF9GTE9BVCB2YWx1ZXNbM107CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKDIgLSBpKTsKKyAgfQorICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpOworICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IocENTLCB2YWx1ZXMsIDMpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRSR0JDb2xvcl9TdHJva2UoKSB7CisgIFJFUVVJUkVfUEFSQU1TKDMpOworICBGWF9GTE9BVCB2YWx1ZXNbM107CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKDIgLSBpKTsKKyAgfQorICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpOworICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VDb2xvcihwQ1MsIHZhbHVlcywgMyk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFJlbmRlckludGVudCgpIHt9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0Nsb3NlU3Ryb2tlUGF0aCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBIYW5kbGVfQ2xvc2VQYXRoKCk7CisgIEFkZFBhdGhPYmplY3QoMCwgVFJVRSk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1N0cm9rZVBhdGgoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkUGF0aE9iamVjdCgwLCBUUlVFKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JfRmlsbCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9GTE9BVCB2YWx1ZXNbNF07CisgIGludCBuYXJncyA9IG1fUGFyYW1Db3VudDsKKyAgaWYgKG5hcmdzID4gNCkgeworICAgIG5hcmdzID0gNDsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG5hcmdzOyBpKyspIHsKKyAgICB2YWx1ZXNbaV0gPSBHZXROdW1iZXIobmFyZ3MgLSBpIC0gMSk7CisgIH0KKyAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0RmlsbENvbG9yKE5VTEwsIHZhbHVlcywgbmFyZ3MpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvcl9TdHJva2UoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRkxPQVQgdmFsdWVzWzRdOworICBpbnQgbmFyZ3MgPSBtX1BhcmFtQ291bnQ7CisgIGlmIChuYXJncyA+IDQpIHsKKyAgICBuYXJncyA9IDQ7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYXJnczsgaSsrKSB7CisgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKG5hcmdzIC0gaSAtIDEpOworICB9CisgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldFN0cm9rZUNvbG9yKE5VTEwsIHZhbHVlcywgbmFyZ3MpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclBTX0ZpbGwoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9PYmplY3QqIHBMYXN0UGFyYW0gPSBHZXRPYmplY3QoMCk7CisgIGlmIChwTGFzdFBhcmFtID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IG5hcmdzID0gbV9QYXJhbUNvdW50OworICBpbnQgbnZhbHVlcyA9IG5hcmdzOworICBpZiAocExhc3RQYXJhbS0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7CisgICAgbnZhbHVlcy0tOworICB9CisgIEZYX0ZMT0FUKiB2YWx1ZXMgPSBOVUxMOworICBpZiAobnZhbHVlcykgeworICAgIHZhbHVlcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBudmFsdWVzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG52YWx1ZXM7IGkrKykgeworICAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKG5hcmdzIC0gaSAtIDEpOworICAgIH0KKyAgfQorICBpZiAobnZhbHVlcyAhPSBuYXJncykgeworICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIEZBTFNFKTsKKyAgICBpZiAocFBhdHRlcm4pIHsKKyAgICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldEZpbGxQYXR0ZXJuKHBQYXR0ZXJuLCB2YWx1ZXMsIG52YWx1ZXMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IoTlVMTCwgdmFsdWVzLCBudmFsdWVzKTsKKyAgfQorICBpZiAodmFsdWVzKSB7CisgICAgRlhfRnJlZSh2YWx1ZXMpOworICB9Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yUFNfU3Ryb2tlKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfT2JqZWN0KiBwTGFzdFBhcmFtID0gR2V0T2JqZWN0KDApOworICBpZiAocExhc3RQYXJhbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBuYXJncyA9IG1fUGFyYW1Db3VudDsKKyAgaW50IG52YWx1ZXMgPSBuYXJnczsKKyAgaWYgKHBMYXN0UGFyYW0tPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgeworICAgIG52YWx1ZXMtLTsKKyAgfQorICBGWF9GTE9BVCogdmFsdWVzID0gTlVMTDsKKyAgaWYgKG52YWx1ZXMpIHsKKyAgICB2YWx1ZXMgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbnZhbHVlcyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudmFsdWVzOyBpKyspIHsKKyAgICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcihuYXJncyAtIGkgLSAxKTsKKyAgICB9CisgIH0KKyAgaWYgKG52YWx1ZXMgIT0gbmFyZ3MpIHsKKyAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBGQUxTRSk7CisgICAgaWYgKHBQYXR0ZXJuKSB7CisgICAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VQYXR0ZXJuKHBQYXR0ZXJuLCB2YWx1ZXMsIG52YWx1ZXMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VDb2xvcihOVUxMLCB2YWx1ZXMsIG52YWx1ZXMpOworICB9CisgIGlmICh2YWx1ZXMpIHsKKyAgICBGWF9GcmVlKHZhbHVlcyk7CisgIH0KK30KK0NGWF9GbG9hdFJlY3QgX0dldFNoYWRpbmdCQm94KENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUyk7Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NoYWRlRmlsbCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBUUlVFKTsKKyAgaWYgKHBQYXR0ZXJuID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBQYXR0ZXJuLT5tX1BhdHRlcm5UeXBlICE9IFBBVFRFUk5fU0hBRElORykgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1NoYWRpbmdQYXR0ZXJuKiBwU2hhZGluZyA9IChDUERGX1NoYWRpbmdQYXR0ZXJuKilwUGF0dGVybjsKKyAgaWYgKCFwU2hhZGluZy0+bV9iU2hhZGluZ09iaikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBTaGFkaW5nLT5Mb2FkKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9TaGFkaW5nT2JqZWN0KiBwT2JqID0gbmV3IENQREZfU2hhZGluZ09iamVjdDsKKyAgcE9iai0+bV9wU2hhZGluZyA9IHBTaGFkaW5nOworICBTZXRHcmFwaGljU3RhdGVzKHBPYmosIEZBTFNFLCBGQUxTRSwgRkFMU0UpOworICBwT2JqLT5tX01hdHJpeCA9IG1fcEN1clN0YXRlcy0+bV9DVE07CisgIHBPYmotPm1fTWF0cml4LkNvbmNhdChtX210Q29udGVudFRvVXNlcik7CisgIENGWF9GbG9hdFJlY3QgYmJveDsKKyAgaWYgKCFwT2JqLT5tX0NsaXBQYXRoLklzTnVsbCgpKSB7CisgICAgYmJveCA9IHBPYmotPm1fQ2xpcFBhdGguR2V0Q2xpcEJveCgpOworICB9IGVsc2UgeworICAgIGJib3ggPSBtX0JCb3g7CisgIH0KKyAgaWYgKHBTaGFkaW5nLT5tX1NoYWRpbmdUeXBlID49IDQpIHsKKyAgICBiYm94LkludGVyc2VjdChfR2V0U2hhZGluZ0JCb3goKENQREZfU3RyZWFtKilwU2hhZGluZy0+bV9wU2hhZGluZ09iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNoYWRpbmctPm1fU2hhZGluZ1R5cGUsICZwT2JqLT5tX01hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNoYWRpbmctPm1fcEZ1bmN0aW9ucywgcFNoYWRpbmctPm1fbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2hhZGluZy0+bV9wQ1MpKTsKKyAgfQorICBwT2JqLT5tX0xlZnQgPSBiYm94LmxlZnQ7CisgIHBPYmotPm1fUmlnaHQgPSBiYm94LnJpZ2h0OworICBwT2JqLT5tX1RvcCA9IGJib3gudG9wOworICBwT2JqLT5tX0JvdHRvbSA9IGJib3guYm90dG9tOworICBtX3BPYmplY3RMaXN0LT5tX09iamVjdExpc3QuQWRkVGFpbChwT2JqKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2hhclNwYWNlKCkgeworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX0NoYXJTcGFjZSA9IEdldE51bWJlcigwKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRleHRQb2ludCgpIHsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWCArPSBHZXROdW1iZXIoMSk7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVkgKz0gR2V0TnVtYmVyKDApOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVYOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFkgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVZOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9Nb3ZlVGV4dFBvaW50X1NldExlYWRpbmcoKSB7CisgIEhhbmRsZV9Nb3ZlVGV4dFBvaW50KCk7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGVhZGluZyA9IC1HZXROdW1iZXIoMCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEZvbnQoKSB7CisgIEZYX0ZMT0FUIGZzID0gR2V0TnVtYmVyKDApOworICBpZiAoZnMgPT0gMCkgeworICAgIGZzID0gbV9EZWZGb250U2l6ZTsKKyAgfQorICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX0ZvbnRTaXplID0gZnM7CisgIENQREZfRm9udCogcEZvbnQgPSBGaW5kRm9udChHZXRTdHJpbmcoMSkpOworICBpZiAocEZvbnQpIHsKKyAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLlNldEZvbnQocEZvbnQpOworICB9Cit9CitDUERGX09iamVjdCogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpGaW5kUmVzb3VyY2VPYmooCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0eXBlLAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7CisgIGlmIChtX3BSZXNvdXJjZXMgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChtX3BSZXNvdXJjZXMgPT0gbV9wUGFnZVJlc291cmNlcykgewogICAgIENQREZfRGljdGlvbmFyeSogcExpc3QgPSBtX3BSZXNvdXJjZXMtPkdldERpY3QodHlwZSk7CiAgICAgaWYgKHBMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgaWYgKG1fcFBhZ2VSZXNvdXJjZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGlzdCA9IG1fcFBhZ2VSZXNvdXJjZXMtPkdldERpY3QodHlwZSk7Ci0gICAgICAgIGlmIChwTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcFJlcyA9IHBMaXN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7Ci0gICAgICAgIHJldHVybiBwUmVzOworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIENQREZfT2JqZWN0KiBwUmVzID0gcExpc3QtPkdldEVsZW1lbnRWYWx1ZShuYW1lKTsKICAgICByZXR1cm4gcFJlczsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBMaXN0ID0gbV9wUmVzb3VyY2VzLT5HZXREaWN0KHR5cGUpOworICBpZiAocExpc3QgPT0gTlVMTCkgeworICAgIGlmIChtX3BQYWdlUmVzb3VyY2VzID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBMaXN0ID0gbV9wUGFnZVJlc291cmNlcy0+R2V0RGljdCh0eXBlKTsKKyAgICBpZiAocExpc3QgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIENQREZfT2JqZWN0KiBwUmVzID0gcExpc3QtPkdldEVsZW1lbnRWYWx1ZShuYW1lKTsKKyAgICByZXR1cm4gcFJlczsKKyAgfQorICBDUERGX09iamVjdCogcFJlcyA9IHBMaXN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7CisgIHJldHVybiBwUmVzOwogfQotQ1BERl9Gb250KiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKQotewotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gKENQREZfRGljdGlvbmFyeSopRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJGb250IiksIG5hbWUpOwotICAgIGlmIChwRm9udERpY3QgPT0gTlVMTCB8fCBwRm9udERpY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOwotICAgICAgICByZXR1cm4gQ1BERl9Gb250OjpHZXRTdG9ja0ZvbnQobV9wRG9jdW1lbnQsIEZYX0JTVFJDKCJIZWx2ZXRpY2EiKSk7Ci0gICAgfQotICAgIENQREZfRm9udCogcEZvbnQgPSBtX3BEb2N1bWVudC0+TG9hZEZvbnQocEZvbnREaWN0KTsKLSAgICBpZiAocEZvbnQgJiYgcEZvbnQtPkdldFR5cGUzRm9udCgpKSB7Ci0gICAgICAgIHBGb250LT5HZXRUeXBlM0ZvbnQoKS0+U2V0UGFnZVJlc291cmNlcyhtX3BSZXNvdXJjZXMpOwotICAgICAgICBwRm9udC0+R2V0VHlwZTNGb250KCktPkNoZWNrVHlwZTNGb250TWV0cmljcygpOwotICAgIH0KLSAgICByZXR1cm4gcEZvbnQ7CitDUERGX0ZvbnQqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPQorICAgICAgKENQREZfRGljdGlvbmFyeSopRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJGb250IiksIG5hbWUpOworICBpZiAocEZvbnREaWN0ID09IE5VTEwgfHwgcEZvbnREaWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOworICAgIHJldHVybiBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChtX3BEb2N1bWVudCwgRlhfQlNUUkMoIkhlbHZldGljYSIpKTsKKyAgfQorICBDUERGX0ZvbnQqIHBGb250ID0gbV9wRG9jdW1lbnQtPkxvYWRGb250KHBGb250RGljdCk7CisgIGlmIChwRm9udCAmJiBwRm9udC0+R2V0VHlwZTNGb250KCkpIHsKKyAgICBwRm9udC0+R2V0VHlwZTNGb250KCktPlNldFBhZ2VSZXNvdXJjZXMobV9wUmVzb3VyY2VzKTsKKyAgICBwRm9udC0+R2V0VHlwZTNGb250KCktPkNoZWNrVHlwZTNGb250TWV0cmljcygpOworICB9CisgIHJldHVybiBwRm9udDsKIH0KLUNQREZfQ29sb3JTcGFjZSogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpGaW5kQ29sb3JTcGFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKLXsKLSAgICBpZiAobmFtZSA9PSBGWF9CU1RSQygiUGF0dGVybiIpKSB7Ci0gICAgICAgIHJldHVybiBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfUEFUVEVSTik7CitDUERGX0NvbG9yU3BhY2UqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZENvbG9yU3BhY2UoCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsKKyAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIlBhdHRlcm4iKSkgeworICAgIHJldHVybiBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfUEFUVEVSTik7CisgIH0KKyAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZUdyYXkiKSB8fCBuYW1lID09IEZYX0JTVFJDKCJEZXZpY2VDTVlLIikgfHwKKyAgICAgIG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZVJHQiIpKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgZGVmbmFtZSA9ICJEZWZhdWx0IjsKKyAgICBkZWZuYW1lICs9IG5hbWUuTWlkKDcpOworICAgIENQREZfT2JqZWN0KiBwRGVmT2JqID0gRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIGRlZm5hbWUpOworICAgIGlmIChwRGVmT2JqID09IE5VTEwpIHsKKyAgICAgIGlmIChuYW1lID09IEZYX0JTVFJDKCJEZXZpY2VHcmF5IikpIHsKKyAgICAgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VHUkFZKTsKKyAgICAgIH0KKyAgICAgIGlmIChuYW1lID09IEZYX0JTVFJDKCJEZXZpY2VSR0IiKSkgeworICAgICAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQik7CisgICAgICB9CisgICAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUNNWUspOwogICAgIH0KLSAgICBpZiAobmFtZSA9PSBGWF9CU1RSQygiRGV2aWNlR3JheSIpIHx8IG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZUNNWUsiKSB8fCBuYW1lID09IEZYX0JTVFJDKCJEZXZpY2VSR0IiKSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBkZWZuYW1lID0gIkRlZmF1bHQiOwotICAgICAgICBkZWZuYW1lICs9IG5hbWUuTWlkKDcpOwotICAgICAgICBDUERGX09iamVjdCogcERlZk9iaiA9IEZpbmRSZXNvdXJjZU9iaihGWF9CU1RSQygiQ29sb3JTcGFjZSIpLCBkZWZuYW1lKTsKLSAgICAgICAgaWYgKHBEZWZPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZUdyYXkiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBGWF9CU1RSQygiRGV2aWNlUkdCIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUNNWUspOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtX3BEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocERlZk9iaik7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBGaW5kUmVzb3VyY2VPYmooRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSwgbmFtZSk7Ci0gICAgaWYgKHBDU09iaiA9PSBOVUxMKSB7Ci0gICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbV9wRG9jdW1lbnQtPkxvYWRDb2xvclNwYWNlKHBDU09iaik7CisgICAgcmV0dXJuIG1fcERvY3VtZW50LT5Mb2FkQ29sb3JTcGFjZShwRGVmT2JqKTsKKyAgfQorICBDUERGX09iamVjdCogcENTT2JqID0gRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIG5hbWUpOworICBpZiAocENTT2JqID09IE5VTEwpIHsKKyAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBtX3BEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocENTT2JqKTsKIH0KLUNQREZfUGF0dGVybiogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpGaW5kUGF0dGVybihjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgRlhfQk9PTCBiU2hhZGluZykKLXsKLSAgICBDUERGX09iamVjdCogcFBhdHRlcm4gPSBGaW5kUmVzb3VyY2VPYmooYlNoYWRpbmcgPyBGWF9CU1RSQygiU2hhZGluZyIpIDogRlhfQlNUUkMoIlBhdHRlcm4iKSwgbmFtZSk7Ci0gICAgaWYgKHBQYXR0ZXJuID09IE5VTEwgfHwgKHBQYXR0ZXJuLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm4tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSkgewotICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcERvY3VtZW50LT5Mb2FkUGF0dGVybihwUGF0dGVybiwgYlNoYWRpbmcsICZtX3BDdXJTdGF0ZXMtPm1fUGFyZW50TWF0cml4KTsKK0NQREZfUGF0dGVybiogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpGaW5kUGF0dGVybihjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGFkaW5nKSB7CisgIENQREZfT2JqZWN0KiBwUGF0dGVybiA9IEZpbmRSZXNvdXJjZU9iaigKKyAgICAgIGJTaGFkaW5nID8gRlhfQlNUUkMoIlNoYWRpbmciKSA6IEZYX0JTVFJDKCJQYXR0ZXJuIiksIG5hbWUpOworICBpZiAocFBhdHRlcm4gPT0gTlVMTCB8fCAocFBhdHRlcm4tPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm4tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSkgeworICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG1fcERvY3VtZW50LT5Mb2FkUGF0dGVybihwUGF0dGVybiwgYlNoYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fcEN1clN0YXRlcy0+bV9QYXJlbnRNYXRyaXgpOwogfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkNvbnZlcnRUZXh0U3BhY2UoRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KQotewotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TWF0cml4LlRyYW5zZm9ybSh4LCB5LCB4LCB5KTsKLSAgICBDb252ZXJ0VXNlclNwYWNlKHgsIHkpOwordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkNvbnZlcnRUZXh0U3BhY2UoRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KSB7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0TWF0cml4LlRyYW5zZm9ybSh4LCB5LCB4LCB5KTsKKyAgQ29udmVydFVzZXJTcGFjZSh4LCB5KTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpDb252ZXJ0VXNlclNwYWNlKEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fQ1RNLlRyYW5zZm9ybSh4LCB5LCB4LCB5KTsKLSAgICBtX210Q29udGVudFRvVXNlci5UcmFuc2Zvcm0oeCwgeSwgeCwgeSk7Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6Q29udmVydFVzZXJTcGFjZShGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpIHsKKyAgbV9wQ3VyU3RhdGVzLT5tX0NUTS5UcmFuc2Zvcm0oeCwgeSwgeCwgeSk7CisgIG1fbXRDb250ZW50VG9Vc2VyLlRyYW5zZm9ybSh4LCB5LCB4LCB5KTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRUZXh0T2JqZWN0KENGWF9CeXRlU3RyaW5nKiBwU3RycywgRlhfRkxPQVQgZkluaXRLZXJuaW5nLCBGWF9GTE9BVCogcEtlcm5pbmcsIGludCBuc2VncykKLXsKLSAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250KCk7Ci0gICAgaWYgKHBGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZkluaXRLZXJuaW5nICE9IDApIHsKLSAgICAgICAgaWYgKCFwRm9udC0+SXNWZXJ0V3JpdGluZygpKSB7Ci0gICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggLT0gRlhTWVNfTXVsKGZJbml0S2VybmluZywgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpKSAvIDEwMDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFkgLT0gRlhTWVNfTXVsKGZJbml0S2VybmluZywgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpKSAvIDEwMDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5zZWdzID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgdGV4dG1vZGU7Ci0gICAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpID09IFBERkZPTlRfVFlQRTMpIHsKLSAgICAgICAgdGV4dG1vZGUgPSAwOwordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZFRleHRPYmplY3QoQ0ZYX0J5dGVTdHJpbmcqIHBTdHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkluaXRLZXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBLZXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5zZWdzKSB7CisgIENQREZfRm9udCogcEZvbnQgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldEZvbnQoKTsKKyAgaWYgKHBGb250ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGZJbml0S2VybmluZyAhPSAwKSB7CisgICAgaWYgKCFwRm9udC0+SXNWZXJ0V3JpdGluZygpKSB7CisgICAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggLT0KKyAgICAgICAgICBGWFNZU19NdWwoZkluaXRLZXJuaW5nLCBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkpIC8KKyAgICAgICAgICAxMDAwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHRleHRtb2RlID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9UZXh0TW9kZTsKKyAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WSAtPQorICAgICAgICAgIEZYU1lTX011bChmSW5pdEtlcm5pbmcsIG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSkgLworICAgICAgICAgIDEwMDA7CiAgICAgfQotICAgIENQREZfVGV4dE9iamVjdCogcFRleHQgPSBuZXcgQ1BERl9UZXh0T2JqZWN0OwotICAgIG1fcExhc3RUZXh0T2JqZWN0ID0gcFRleHQ7Ci0gICAgU2V0R3JhcGhpY1N0YXRlcyhwVGV4dCwgVFJVRSwgVFJVRSwgVFJVRSk7Ci0gICAgaWYgKHRleHRtb2RlICYmIHRleHRtb2RlICE9IDMgJiYgdGV4dG1vZGUgIT0gNCAmJiB0ZXh0bW9kZSAhPSA3KSB7Ci0gICAgICAgIEZYX0ZMT0FUKiBwQ1RNID0gcFRleHQtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX0NUTTsKLSAgICAgICAgcENUTVswXSA9IG1fcEN1clN0YXRlcy0+bV9DVE0uYTsKLSAgICAgICAgcENUTVsxXSA9IG1fcEN1clN0YXRlcy0+bV9DVE0uYzsKLSAgICAgICAgcENUTVsyXSA9IG1fcEN1clN0YXRlcy0+bV9DVE0uYjsKLSAgICAgICAgcENUTVszXSA9IG1fcEN1clN0YXRlcy0+bV9DVE0uZDsKKyAgfQorICBpZiAobnNlZ3MgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgdGV4dG1vZGU7CisgIGlmIChwRm9udC0+R2V0Rm9udFR5cGUoKSA9PSBQREZGT05UX1RZUEUzKSB7CisgICAgdGV4dG1vZGUgPSAwOworICB9IGVsc2UgeworICAgIHRleHRtb2RlID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9UZXh0TW9kZTsKKyAgfQorICBDUERGX1RleHRPYmplY3QqIHBUZXh0ID0gbmV3IENQREZfVGV4dE9iamVjdDsKKyAgbV9wTGFzdFRleHRPYmplY3QgPSBwVGV4dDsKKyAgU2V0R3JhcGhpY1N0YXRlcyhwVGV4dCwgVFJVRSwgVFJVRSwgVFJVRSk7CisgIGlmICh0ZXh0bW9kZSAmJiB0ZXh0bW9kZSAhPSAzICYmIHRleHRtb2RlICE9IDQgJiYgdGV4dG1vZGUgIT0gNykgeworICAgIEZYX0ZMT0FUKiBwQ1RNID0gcFRleHQtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX0NUTTsKKyAgICBwQ1RNWzBdID0gbV9wQ3VyU3RhdGVzLT5tX0NUTS5hOworICAgIHBDVE1bMV0gPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNLmM7CisgICAgcENUTVsyXSA9IG1fcEN1clN0YXRlcy0+bV9DVE0uYjsKKyAgICBwQ1RNWzNdID0gbV9wQ3VyU3RhdGVzLT5tX0NUTS5kOworICB9CisgIHBUZXh0LT5TZXRTZWdtZW50cyhwU3RycywgcEtlcm5pbmcsIG5zZWdzKTsKKyAgcFRleHQtPm1fUG9zWCA9IG1fcEN1clN0YXRlcy0+bV9UZXh0WDsKKyAgcFRleHQtPm1fUG9zWSA9IG1fcEN1clN0YXRlcy0+bV9UZXh0WSArIG1fcEN1clN0YXRlcy0+bV9UZXh0UmlzZTsKKyAgQ29udmVydFRleHRTcGFjZShwVGV4dC0+bV9Qb3NYLCBwVGV4dC0+bV9Qb3NZKTsKKyAgRlhfRkxPQVQgeF9hZHZhbmNlLCB5X2FkdmFuY2U7CisgIHBUZXh0LT5DYWxjUG9zaXRpb25EYXRhKCZ4X2FkdmFuY2UsICZ5X2FkdmFuY2UsIG1fcEN1clN0YXRlcy0+bV9UZXh0SG9yelNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtX0xldmVsKTsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRYICs9IHhfYWR2YW5jZTsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRZICs9IHlfYWR2YW5jZTsKKyAgaWYgKHRleHRtb2RlID4gMykgeworICAgIENQREZfVGV4dE9iamVjdCogcENvcHkgPSBuZXcgQ1BERl9UZXh0T2JqZWN0OworICAgIHBDb3B5LT5Db3B5KHBUZXh0KTsKKyAgICBtX0NsaXBUZXh0TGlzdC5BZGQocENvcHkpOworICB9CisgIG1fcE9iamVjdExpc3QtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBUZXh0KTsKKyAgaWYgKHBLZXJuaW5nICYmIHBLZXJuaW5nW25zZWdzIC0gMV0gIT0gMCkgeworICAgIGlmICghcEZvbnQtPklzVmVydFdyaXRpbmcoKSkgeworICAgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRYIC09CisgICAgICAgICAgRlhTWVNfTXVsKHBLZXJuaW5nW25zZWdzIC0gMV0sCisgICAgICAgICAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSkgLworICAgICAgICAgIDEwMDA7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WSAtPQorICAgICAgICAgIEZYU1lTX011bChwS2VybmluZ1tuc2VncyAtIDFdLAorICAgICAgICAgICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkpIC8KKyAgICAgICAgICAxMDAwOwogICAgIH0KLSAgICBwVGV4dC0+U2V0U2VnbWVudHMocFN0cnMsIHBLZXJuaW5nLCBuc2Vncyk7Ci0gICAgcFRleHQtPm1fUG9zWCA9IG1fcEN1clN0YXRlcy0+bV9UZXh0WDsKLSAgICBwVGV4dC0+bV9Qb3NZID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRZICsgbV9wQ3VyU3RhdGVzLT5tX1RleHRSaXNlOwotICAgIENvbnZlcnRUZXh0U3BhY2UocFRleHQtPm1fUG9zWCwgcFRleHQtPm1fUG9zWSk7Ci0gICAgRlhfRkxPQVQgeF9hZHZhbmNlLCB5X2FkdmFuY2U7Ci0gICAgcFRleHQtPkNhbGNQb3NpdGlvbkRhdGEoJnhfYWR2YW5jZSwgJnlfYWR2YW5jZSwgbV9wQ3VyU3RhdGVzLT5tX1RleHRIb3J6U2NhbGUsIG1fTGV2ZWwpOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WCArPSB4X2FkdmFuY2U7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRZICs9IHlfYWR2YW5jZTsKLSAgICBpZiAodGV4dG1vZGUgPiAzKSB7Ci0gICAgICAgIENQREZfVGV4dE9iamVjdCogcENvcHkgPSBuZXcgQ1BERl9UZXh0T2JqZWN0OwotICAgICAgICBwQ29weS0+Q29weShwVGV4dCk7Ci0gICAgICAgIG1fQ2xpcFRleHRMaXN0LkFkZChwQ29weSk7CisgIH0KK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2hvd1RleHQoKSB7CisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IEdldFN0cmluZygwKTsKKyAgaWYgKHN0ci5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkVGV4dE9iamVjdCgmc3RyLCAwLCBOVUxMLCAxKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2hvd1RleHRfUG9zaXRpb25pbmcoKSB7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IEdldE9iamVjdCgwKSA/IEdldE9iamVjdCgwKS0+R2V0QXJyYXkoKSA6IE5VTEw7CisgIGlmIChwQXJyYXkgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgbiA9IHBBcnJheS0+R2V0Q291bnQoKSwgbnNlZ3MgPSAwLCBpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKKyAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKKyAgICAgIG5zZWdzKys7CiAgICAgfQotICAgIG1fcE9iamVjdExpc3QtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBUZXh0KTsKLSAgICBpZiAocEtlcm5pbmcgJiYgcEtlcm5pbmdbbnNlZ3MgLSAxXSAhPSAwKSB7Ci0gICAgICAgIGlmICghcEZvbnQtPklzVmVydFdyaXRpbmcoKSkgewotICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRYIC09IEZYU1lTX011bChwS2VybmluZ1tuc2VncyAtIDFdLCBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkpIC8gMTAwMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WSAtPSBGWFNZU19NdWwocEtlcm5pbmdbbnNlZ3MgLSAxXSwgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpKSAvIDEwMDA7Ci0gICAgICAgIH0KKyAgfQorICBpZiAobnNlZ3MgPT0gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WCAtPQorICAgICAgICAgIEZYU1lTX011bChwQXJyYXktPkdldE51bWJlcihpKSwKKyAgICAgICAgICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpKSAvCisgICAgICAgICAgMTAwMDsKKyAgICB9OworICAgIHJldHVybjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyogcFN0cnMgPSBuZXcgQ0ZYX0J5dGVTdHJpbmdbbnNlZ3NdOworICBGWF9GTE9BVCogcEtlcm5pbmcgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbnNlZ3MpOworICBpbnQgaVNlZ21lbnQgPSAwOworICBGWF9GTE9BVCBmSW5pdEtlcm5pbmcgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKKyAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOworICAgICAgaWYgKHN0ci5Jc0VtcHR5KCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBwU3Ryc1tpU2VnbWVudF0gPSBzdHI7CisgICAgICBwS2VybmluZ1tpU2VnbWVudCsrXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIEZYX0ZMT0FUIG51bSA9IHBPYmogPyBwT2JqLT5HZXROdW1iZXIoKSA6IDA7CisgICAgICBpZiAoaVNlZ21lbnQgPT0gMCkgeworICAgICAgICBmSW5pdEtlcm5pbmcgKz0gbnVtOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcEtlcm5pbmdbaVNlZ21lbnQgLSAxXSArPSBudW07CisgICAgICB9CiAgICAgfQorICB9CisgIEFkZFRleHRPYmplY3QocFN0cnMsIGZJbml0S2VybmluZywgcEtlcm5pbmcsIGlTZWdtZW50KTsKKyAgZGVsZXRlW10gcFN0cnM7CisgIEZYX0ZyZWUocEtlcm5pbmcpOwogfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TaG93VGV4dCgpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gR2V0U3RyaW5nKDApOwotICAgIGlmIChzdHIuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dExlYWRpbmcoKSB7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGVhZGluZyA9IEdldE51bWJlcigwKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dE1hdHJpeCgpIHsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRNYXRyaXguU2V0KEdldE51bWJlcjE2KDUpLCBHZXROdW1iZXIxNig0KSwgR2V0TnVtYmVyMTYoMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXROdW1iZXIxNigyKSwgR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCkpOworICBPbkNoYW5nZVRleHRNYXRyaXgoKTsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRYID0gMDsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRZID0gMDsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWCA9IDA7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVkgPSAwOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6Ok9uQ2hhbmdlVGV4dE1hdHJpeCgpIHsKKyAgQ0ZYX0FmZmluZU1hdHJpeCB0ZXh0X21hdHJpeChtX3BDdXJTdGF0ZXMtPm1fVGV4dEhvcnpTY2FsZSwgMC4wZiwgMC4wZiwgMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAwLjBmKTsKKyAgdGV4dF9tYXRyaXguQ29uY2F0KG1fcEN1clN0YXRlcy0+bV9UZXh0TWF0cml4KTsKKyAgdGV4dF9tYXRyaXguQ29uY2F0KG1fcEN1clN0YXRlcy0+bV9DVE0pOworICB0ZXh0X21hdHJpeC5Db25jYXQobV9tdENvbnRlbnRUb1VzZXIpOworICBGWF9GTE9BVCogcFRleHRNYXRyaXggPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX01hdHJpeDsKKyAgcFRleHRNYXRyaXhbMF0gPSB0ZXh0X21hdHJpeC5hOworICBwVGV4dE1hdHJpeFsxXSA9IHRleHRfbWF0cml4LmM7CisgIHBUZXh0TWF0cml4WzJdID0gdGV4dF9tYXRyaXguYjsKKyAgcFRleHRNYXRyaXhbM10gPSB0ZXh0X21hdHJpeC5kOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRUZXh0UmVuZGVyTW9kZSgpIHsKKyAgaW50IG1vZGUgPSBHZXRJbnRlZ2VyKDApOworICBpZiAobW9kZSA8IDAgfHwgbW9kZSA+IDcpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9UZXh0TW9kZSA9IG1vZGU7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFRleHRSaXNlKCkgeworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFJpc2UgPSBHZXROdW1iZXIoMCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFdvcmRTcGFjZSgpIHsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9Xb3JkU3BhY2UgPSBHZXROdW1iZXIoMCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEhvcnpTY2FsZSgpIHsKKyAgaWYgKG1fUGFyYW1Db3VudCAhPSAxKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0SG9yelNjYWxlID0gR2V0TnVtYmVyKDApIC8gMTAwOworICBPbkNoYW5nZVRleHRNYXRyaXgoKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRvTmV4dExpbmUoKSB7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVkgLT0gbV9wQ3VyU3RhdGVzLT5tX1RleHRMZWFkaW5nOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVYOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFkgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVZOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DdXJ2ZVRvXzIzKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIEFkZFBhdGhQb2ludChtX1BhdGhDdXJyZW50WCwgbV9QYXRoQ3VycmVudFksIEZYUFRfQkVaSUVSVE8pOworICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDMpLCBHZXROdW1iZXIoMiksIEZYUFRfQkVaSUVSVE8pOworICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCksIEZYUFRfQkVaSUVSVE8pOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRMaW5lV2lkdGgoKSB7CisgIEZYX0ZMT0FUIHdpZHRoID0gR2V0TnVtYmVyKDApOworICBtX3BDdXJTdGF0ZXMtPm1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKS0+bV9MaW5lV2lkdGggPSB3aWR0aDsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xpcCgpIHsKKyAgbV9QYXRoQ2xpcFR5cGUgPSBGWEZJTExfV0lORElORzsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9DbGlwKCkgeworICBtX1BhdGhDbGlwVHlwZSA9IEZYRklMTF9BTFRFUk5BVEU7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0N1cnZlVG9fMTMoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkUGF0aFBvaW50KEdldE51bWJlcigzKSwgR2V0TnVtYmVyKDIpLCBGWFBUX0JFWklFUlRPKTsKKyAgQWRkUGF0aFBvaW50KEdldE51bWJlcigxKSwgR2V0TnVtYmVyKDApLCBGWFBUX0JFWklFUlRPKTsKKyAgQWRkUGF0aFBvaW50KEdldE51bWJlcigxKSwgR2V0TnVtYmVyKDApLCBGWFBUX0JFWklFUlRPKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTmV4dExpbmVTaG93VGV4dCgpIHsKKyAgSGFuZGxlX01vdmVUb05leHRMaW5lKCk7CisgIEhhbmRsZV9TaG93VGV4dCgpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9OZXh0TGluZVNob3dUZXh0X1NwYWNlKCkgeworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX1dvcmRTcGFjZSA9IEdldE51bWJlcigyKTsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9DaGFyU3BhY2UgPSBHZXROdW1iZXIoMSk7CisgIEhhbmRsZV9OZXh0TGluZVNob3dUZXh0KCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0ludmFsaWQoKSB7fQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZFBhdGhQb2ludChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBpbnQgZmxhZykgeworICBtX1BhdGhDdXJyZW50WCA9IHg7CisgIG1fUGF0aEN1cnJlbnRZID0geTsKKyAgaWYgKGZsYWcgPT0gRlhQVF9NT1ZFVE8pIHsKKyAgICBtX1BhdGhTdGFydFggPSB4OworICAgIG1fUGF0aFN0YXJ0WSA9IHk7CisgICAgaWYgKG1fUGF0aFBvaW50Q291bnQgJiYKKyAgICAgICAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSB7CisgICAgICBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX1BvaW50WCA9IHg7CisgICAgICBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX1BvaW50WSA9IHk7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIEFkZFRleHRPYmplY3QoJnN0ciwgMCwgTlVMTCwgMSk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1Nob3dUZXh0X1Bvc2l0aW9uaW5nKCkKLXsKLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBHZXRPYmplY3QoMCkgPyBHZXRPYmplY3QoMCktPkdldEFycmF5KCkgOiBOVUxMOwotICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CisgIH0gZWxzZSBpZiAobV9QYXRoUG9pbnRDb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fUGF0aFBvaW50Q291bnQrKzsKKyAgaWYgKG1fUGF0aFBvaW50Q291bnQgPiBtX1BhdGhBbGxvY1NpemUpIHsKKyAgICBpbnQgbmV3c2l6ZSA9IG1fUGF0aFBvaW50Q291bnQgKyAyNTY7CisgICAgRlhfUEFUSFBPSU5UKiBwTmV3UG9pbnRzID0gRlhfQWxsb2MoRlhfUEFUSFBPSU5ULCBuZXdzaXplKTsKKyAgICBpZiAobV9QYXRoQWxsb2NTaXplKSB7CisgICAgICBGWFNZU19tZW1jcHkocE5ld1BvaW50cywgbV9wUGF0aFBvaW50cywKKyAgICAgICAgICAgICAgICAgICBtX1BhdGhBbGxvY1NpemUgKiBzaXplb2YoRlhfUEFUSFBPSU5UKSk7CisgICAgICBGWF9GcmVlKG1fcFBhdGhQb2ludHMpOwogICAgIH0KLSAgICBpbnQgbiA9IHBBcnJheS0+R2V0Q291bnQoKSwgbnNlZ3MgPSAwLCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpICsrKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewotICAgICAgICAgICAgbnNlZ3MgKys7Ci0gICAgICAgIH0KKyAgICBtX3BQYXRoUG9pbnRzID0gcE5ld1BvaW50czsKKyAgICBtX1BhdGhBbGxvY1NpemUgPSBuZXdzaXplOworICB9CisgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fRmxhZyA9IGZsYWc7CisgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRYID0geDsKKyAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9Qb2ludFkgPSB5OworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZFBhdGhPYmplY3QoaW50IEZpbGxUeXBlLCBGWF9CT09MIGJTdHJva2UpIHsKKyAgaW50IFBhdGhQb2ludENvdW50ID0gbV9QYXRoUG9pbnRDb3VudCwgUGF0aENsaXBUeXBlID0gbV9QYXRoQ2xpcFR5cGU7CisgIG1fUGF0aFBvaW50Q291bnQgPSAwOworICBtX1BhdGhDbGlwVHlwZSA9IDA7CisgIGlmIChQYXRoUG9pbnRDb3VudCA8PSAxKSB7CisgICAgaWYgKFBhdGhQb2ludENvdW50ICYmIFBhdGhDbGlwVHlwZSkgeworICAgICAgQ1BERl9QYXRoIHBhdGg7CisgICAgICBwYXRoLk5ldygpLT5BcHBlbmRSZWN0KDAsIDAsIDAsIDApOworICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgocGF0aCwgRlhGSUxMX1dJTkRJTkcsIFRSVUUpOwogICAgIH0KLSAgICBpZiAobnNlZ3MgPT0gMCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSArKykgewotICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRYIC09IEZYU1lTX011bChwQXJyYXktPkdldE51bWJlcihpKSwgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpKSAvIDEwMDA7Ci0gICAgICAgIH07Ci0gICAgICAgIHJldHVybjsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKFBhdGhQb2ludENvdW50ICYmCisgICAgICBtX3BQYXRoUG9pbnRzW1BhdGhQb2ludENvdW50IC0gMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSB7CisgICAgUGF0aFBvaW50Q291bnQtLTsKKyAgfQorICBDUERGX1BhdGggUGF0aDsKKyAgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEgPSBQYXRoLk5ldygpOworICBwUGF0aERhdGEtPlNldFBvaW50Q291bnQoUGF0aFBvaW50Q291bnQpOworICBGWFNZU19tZW1jcHkocFBhdGhEYXRhLT5HZXRQb2ludHMoKSwgbV9wUGF0aFBvaW50cywKKyAgICAgICAgICAgICAgIHNpemVvZihGWF9QQVRIUE9JTlQpICogUGF0aFBvaW50Q291bnQpOworICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCA9IG1fcEN1clN0YXRlcy0+bV9DVE07CisgIG1hdHJpeC5Db25jYXQobV9tdENvbnRlbnRUb1VzZXIpOworICBpZiAoYlN0cm9rZSB8fCBGaWxsVHlwZSkgeworICAgIENQREZfUGF0aE9iamVjdCogcFBhdGhPYmogPSBuZXcgQ1BERl9QYXRoT2JqZWN0OworICAgIHBQYXRoT2JqLT5tX2JTdHJva2UgPSBiU3Ryb2tlOworICAgIHBQYXRoT2JqLT5tX0ZpbGxUeXBlID0gRmlsbFR5cGU7CisgICAgcFBhdGhPYmotPm1fUGF0aCA9IFBhdGg7CisgICAgcFBhdGhPYmotPm1fTWF0cml4ID0gbWF0cml4OworICAgIFNldEdyYXBoaWNTdGF0ZXMocFBhdGhPYmosIFRSVUUsIEZBTFNFLCBUUlVFKTsKKyAgICBwUGF0aE9iai0+Q2FsY0JvdW5kaW5nQm94KCk7CisgICAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocFBhdGhPYmopOworICB9CisgIGlmIChQYXRoQ2xpcFR5cGUpIHsKKyAgICBpZiAoIW1hdHJpeC5Jc0lkZW50aXR5KCkpIHsKKyAgICAgIFBhdGguVHJhbnNmb3JtKCZtYXRyaXgpOworICAgICAgbWF0cml4LlNldElkZW50aXR5KCk7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nKiBwU3RycyA9IG5ldyBDRlhfQnl0ZVN0cmluZ1tuc2Vnc107Ci0gICAgRlhfRkxPQVQqIHBLZXJuaW5nID0gRlhfQWxsb2MoRlhfRkxPQVQsIG5zZWdzKTsKLSAgICBpbnQgaVNlZ21lbnQgPSAwOwotICAgIEZYX0ZMT0FUIGZJbml0S2VybmluZyA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG47IGkgKyspIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKLSAgICAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSSU5HKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChzdHIuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU3Ryc1tpU2VnbWVudF0gPSBzdHI7Ci0gICAgICAgICAgICBwS2VybmluZ1tpU2VnbWVudCArK10gPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhfRkxPQVQgbnVtID0gcE9iaiA/IHBPYmotPkdldE51bWJlcigpIDogMDsKLSAgICAgICAgICAgIGlmIChpU2VnbWVudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZkluaXRLZXJuaW5nICs9IG51bTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEtlcm5pbmdbaVNlZ21lbnQgLSAxXSArPSBudW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQWRkVGV4dE9iamVjdChwU3RycywgZkluaXRLZXJuaW5nLCBwS2VybmluZywgaVNlZ21lbnQpOwotICAgIGRlbGV0ZVtdIHBTdHJzOwotICAgIEZYX0ZyZWUocEtlcm5pbmcpOworICAgIG1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKFBhdGgsIFBhdGhDbGlwVHlwZSwgVFJVRSk7CisgIH0KIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dExlYWRpbmcoKQotewotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGVhZGluZyA9IEdldE51bWJlcigwKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dE1hdHJpeCgpCi17Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRNYXRyaXguU2V0KEdldE51bWJlcjE2KDUpLCBHZXROdW1iZXIxNig0KSwgR2V0TnVtYmVyMTYoMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE51bWJlcjE2KDIpLCBHZXROdW1iZXIoMSksIEdldE51bWJlcigwKSk7Ci0gICAgT25DaGFuZ2VUZXh0TWF0cml4KCk7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRYID0gMDsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFkgPSAwOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVggPSAwOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVkgPSAwOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6Ok9uQ2hhbmdlVGV4dE1hdHJpeCgpCi17Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCB0ZXh0X21hdHJpeChtX3BDdXJTdGF0ZXMtPm1fVGV4dEhvcnpTY2FsZSwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZik7Ci0gICAgdGV4dF9tYXRyaXguQ29uY2F0KG1fcEN1clN0YXRlcy0+bV9UZXh0TWF0cml4KTsKLSAgICB0ZXh0X21hdHJpeC5Db25jYXQobV9wQ3VyU3RhdGVzLT5tX0NUTSk7Ci0gICAgdGV4dF9tYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKLSAgICBGWF9GTE9BVCogcFRleHRNYXRyaXggPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX01hdHJpeDsKLSAgICBwVGV4dE1hdHJpeFswXSA9IHRleHRfbWF0cml4LmE7Ci0gICAgcFRleHRNYXRyaXhbMV0gPSB0ZXh0X21hdHJpeC5jOwotICAgIHBUZXh0TWF0cml4WzJdID0gdGV4dF9tYXRyaXguYjsKLSAgICBwVGV4dE1hdHJpeFszXSA9IHRleHRfbWF0cml4LmQ7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFRleHRSZW5kZXJNb2RlKCkKLXsKLSAgICBpbnQgbW9kZSA9IEdldEludGVnZXIoMCk7Ci0gICAgaWYgKG1vZGUgPCAwIHx8IG1vZGUgPiA3KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9UZXh0TW9kZSA9IG1vZGU7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFRleHRSaXNlKCkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFJpc2UgPSBHZXROdW1iZXIoMCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFdvcmRTcGFjZSgpCi17Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9Xb3JkU3BhY2UgPSBHZXROdW1iZXIoMCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEhvcnpTY2FsZSgpCi17Ci0gICAgaWYgKG1fUGFyYW1Db3VudCAhPSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRIb3J6U2NhbGUgPSBHZXROdW1iZXIoMCkgLyAxMDA7Ci0gICAgT25DaGFuZ2VUZXh0TWF0cml4KCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUb05leHRMaW5lKCkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVZIC09IG1fcEN1clN0YXRlcy0+bV9UZXh0TGVhZGluZzsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVYOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WSA9IG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0N1cnZlVG9fMjMoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBZGRQYXRoUG9pbnQobV9QYXRoQ3VycmVudFgsIG1fUGF0aEN1cnJlbnRZLCBGWFBUX0JFWklFUlRPKTsKLSAgICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDMpLCBHZXROdW1iZXIoMiksIEZYUFRfQkVaSUVSVE8pOwotICAgIEFkZFBhdGhQb2ludChHZXROdW1iZXIoMSksIEdldE51bWJlcigwKSwgRlhQVF9CRVpJRVJUTyk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVXaWR0aCgpCi17Ci0gICAgRlhfRkxPQVQgd2lkdGggPSBHZXROdW1iZXIoMCk7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCktPm1fTGluZVdpZHRoID0gd2lkdGg7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0NsaXAoKQotewotICAgIG1fUGF0aENsaXBUeXBlID0gRlhGSUxMX1dJTkRJTkc7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPQ2xpcCgpCi17Ci0gICAgbV9QYXRoQ2xpcFR5cGUgPSBGWEZJTExfQUxURVJOQVRFOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DdXJ2ZVRvXzEzKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQWRkUGF0aFBvaW50KEdldE51bWJlcigzKSwgR2V0TnVtYmVyKDIpLCBGWFBUX0JFWklFUlRPKTsKLSAgICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCksIEZYUFRfQkVaSUVSVE8pOwotICAgIEFkZFBhdGhQb2ludChHZXROdW1iZXIoMSksIEdldE51bWJlcigwKSwgRlhQVF9CRVpJRVJUTyk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX05leHRMaW5lU2hvd1RleHQoKQotewotICAgIEhhbmRsZV9Nb3ZlVG9OZXh0TGluZSgpOwotICAgIEhhbmRsZV9TaG93VGV4dCgpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9OZXh0TGluZVNob3dUZXh0X1NwYWNlKCkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX1dvcmRTcGFjZSA9IEdldE51bWJlcigyKTsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX0NoYXJTcGFjZSA9IEdldE51bWJlcigxKTsKLSAgICBIYW5kbGVfTmV4dExpbmVTaG93VGV4dCgpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9JbnZhbGlkKCkKLXsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRQYXRoUG9pbnQoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgaW50IGZsYWcpCi17Ci0gICAgbV9QYXRoQ3VycmVudFggPSB4OwotICAgIG1fUGF0aEN1cnJlbnRZID0geTsKLSAgICBpZiAoZmxhZyA9PSBGWFBUX01PVkVUTykgewotICAgICAgICBtX1BhdGhTdGFydFggPSB4OwotICAgICAgICBtX1BhdGhTdGFydFkgPSB5OwotICAgICAgICBpZiAobV9QYXRoUG9pbnRDb3VudCAmJiBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8pIHsKLSAgICAgICAgICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRYID0geDsKLSAgICAgICAgICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRZID0geTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9QYXRoUG9pbnRDb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9QYXRoUG9pbnRDb3VudCArKzsKLSAgICBpZiAobV9QYXRoUG9pbnRDb3VudCA+IG1fUGF0aEFsbG9jU2l6ZSkgewotICAgICAgICBpbnQgbmV3c2l6ZSA9IG1fUGF0aFBvaW50Q291bnQgKyAyNTY7Ci0gICAgICAgIEZYX1BBVEhQT0lOVCogcE5ld1BvaW50cyA9IEZYX0FsbG9jKEZYX1BBVEhQT0lOVCwgbmV3c2l6ZSk7Ci0gICAgICAgIGlmIChtX1BhdGhBbGxvY1NpemUpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShwTmV3UG9pbnRzLCBtX3BQYXRoUG9pbnRzLCBtX1BhdGhBbGxvY1NpemUgKiBzaXplb2YoRlhfUEFUSFBPSU5UKSk7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcFBhdGhQb2ludHMpOwotICAgICAgICB9Ci0gICAgICAgIG1fcFBhdGhQb2ludHMgPSBwTmV3UG9pbnRzOwotICAgICAgICBtX1BhdGhBbGxvY1NpemUgPSBuZXdzaXplOwotICAgIH0KLSAgICBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX0ZsYWcgPSBmbGFnOwotICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRYID0geDsKLSAgICBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX1BvaW50WSA9IHk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkUGF0aE9iamVjdChpbnQgRmlsbFR5cGUsIEZYX0JPT0wgYlN0cm9rZSkKLXsKLSAgICBpbnQgUGF0aFBvaW50Q291bnQgPSBtX1BhdGhQb2ludENvdW50LCBQYXRoQ2xpcFR5cGUgPSBtX1BhdGhDbGlwVHlwZTsKLSAgICBtX1BhdGhQb2ludENvdW50ID0gMDsKLSAgICBtX1BhdGhDbGlwVHlwZSA9IDA7Ci0gICAgaWYgKFBhdGhQb2ludENvdW50IDw9IDEpIHsKLSAgICAgICAgaWYgKFBhdGhQb2ludENvdW50ICYmIFBhdGhDbGlwVHlwZSkgewotICAgICAgICAgICAgQ1BERl9QYXRoIHBhdGg7Ci0gICAgICAgICAgICBwYXRoLk5ldygpLT5BcHBlbmRSZWN0KDAsIDAsIDAsIDApOwotICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgocGF0aCwgRlhGSUxMX1dJTkRJTkcsIFRSVUUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKFBhdGhQb2ludENvdW50ICYmIG1fcFBhdGhQb2ludHNbUGF0aFBvaW50Q291bnQgLSAxXS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8pIHsKLSAgICAgICAgUGF0aFBvaW50Q291bnQgLS07Ci0gICAgfQotICAgIENQREZfUGF0aCBQYXRoOwotICAgIENGWF9QYXRoRGF0YSogcFBhdGhEYXRhID0gUGF0aC5OZXcoKTsKLSAgICBwUGF0aERhdGEtPlNldFBvaW50Q291bnQoUGF0aFBvaW50Q291bnQpOwotICAgIEZYU1lTX21lbWNweShwUGF0aERhdGEtPkdldFBvaW50cygpLCBtX3BQYXRoUG9pbnRzLCBzaXplb2YoRlhfUEFUSFBPSU5UKSAqIFBhdGhQb2ludENvdW50KTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCA9IG1fcEN1clN0YXRlcy0+bV9DVE07Ci0gICAgbWF0cml4LkNvbmNhdChtX210Q29udGVudFRvVXNlcik7Ci0gICAgaWYgKGJTdHJva2UgfHwgRmlsbFR5cGUpIHsKLSAgICAgICAgQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiA9IG5ldyBDUERGX1BhdGhPYmplY3Q7Ci0gICAgICAgIHBQYXRoT2JqLT5tX2JTdHJva2UgPSBiU3Ryb2tlOwotICAgICAgICBwUGF0aE9iai0+bV9GaWxsVHlwZSA9IEZpbGxUeXBlOwotICAgICAgICBwUGF0aE9iai0+bV9QYXRoID0gUGF0aDsKLSAgICAgICAgcFBhdGhPYmotPm1fTWF0cml4ID0gbWF0cml4OwotICAgICAgICBTZXRHcmFwaGljU3RhdGVzKHBQYXRoT2JqLCBUUlVFLCBGQUxTRSwgVFJVRSk7Ci0gICAgICAgIHBQYXRoT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKLSAgICAgICAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocFBhdGhPYmopOwotICAgIH0KLSAgICBpZiAoUGF0aENsaXBUeXBlKSB7Ci0gICAgICAgIGlmICghbWF0cml4LklzSWRlbnRpdHkoKSkgewotICAgICAgICAgICAgUGF0aC5UcmFuc2Zvcm0oJm1hdHJpeCk7Ci0gICAgICAgICAgICBtYXRyaXguU2V0SWRlbnRpdHkoKTsKLSAgICAgICAgfQotICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fQ2xpcFBhdGguQXBwZW5kUGF0aChQYXRoLCBQYXRoQ2xpcFR5cGUsIFRSVUUpOwotICAgIH0KLX0KLUNGWF9CeXRlU3RyaW5nIF9GUERGX0J5dGVTdHJpbmdGcm9tSGV4KENGWF9CaW5hcnlCdWYmIHNyY19idWYpCi17Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7Ci0gICAgaW50IGNvZGUgPSAwOwotICAgIGNvbnN0IHVpbnQ4X3QqIHN0ciA9IHNyY19idWYuR2V0QnVmZmVyKCk7Ci0gICAgRlhfRFdPUkQgc2l6ZSA9IHNyY19idWYuR2V0U2l6ZSgpOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgY2ggPSBzdHJbaV07Ci0gICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICcwJykgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICcwJzsKLSAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcigoY2hhciljb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJGaXJzdCA9ICFiRmlyc3Q7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgewotICAgICAgICAgICAgaWYgKGJGaXJzdCkgewotICAgICAgICAgICAgICAgIGNvZGUgPSAoY2ggLSAnQScgKyAxMCkgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICdBJyArIDEwOwotICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKChjaGFyKWNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkZpcnN0ID0gIWJGaXJzdDsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICdhJyArIDEwKSAqIDE2OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2RlICs9IGNoIC0gJ2EnICsgMTA7Ci0gICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoKGNoYXIpY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiRmlyc3QgPSAhYkZpcnN0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghYkZpcnN0KSB7CitDRlhfQnl0ZVN0cmluZyBfRlBERl9CeXRlU3RyaW5nRnJvbUhleChDRlhfQmluYXJ5QnVmJiBzcmNfYnVmKSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsKKyAgaW50IGNvZGUgPSAwOworICBjb25zdCB1aW50OF90KiBzdHIgPSBzcmNfYnVmLkdldEJ1ZmZlcigpOworICBGWF9EV09SRCBzaXplID0gc3JjX2J1Zi5HZXRTaXplKCk7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICB1aW50OF90IGNoID0gc3RyW2ldOworICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICBpZiAoYkZpcnN0KSB7CisgICAgICAgIGNvZGUgPSAoY2ggLSAnMCcpICogMTY7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb2RlICs9IGNoIC0gJzAnOwogICAgICAgICBidWYuQXBwZW5kQ2hhcigoY2hhciljb2RlKTsKKyAgICAgIH0KKyAgICAgIGJGaXJzdCA9ICFiRmlyc3Q7CisgICAgfSBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSB7CisgICAgICBpZiAoYkZpcnN0KSB7CisgICAgICAgIGNvZGUgPSAoY2ggLSAnQScgKyAxMCkgKiAxNjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvZGUgKz0gY2ggLSAnQScgKyAxMDsKKyAgICAgICAgYnVmLkFwcGVuZENoYXIoKGNoYXIpY29kZSk7CisgICAgICB9CisgICAgICBiRmlyc3QgPSAhYkZpcnN0OworICAgIH0gZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgeworICAgICAgaWYgKGJGaXJzdCkgeworICAgICAgICBjb2RlID0gKGNoIC0gJ2EnICsgMTApICogMTY7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb2RlICs9IGNoIC0gJ2EnICsgMTA7CisgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKChjaGFyKWNvZGUpOworICAgICAgfQorICAgICAgYkZpcnN0ID0gIWJGaXJzdDsKICAgICB9Ci0gICAgcmV0dXJuIGJ1Zi5HZXRCeXRlU3RyaW5nKCk7CisgIH0KKyAgaWYgKCFiRmlyc3QpIHsKKyAgICBidWYuQXBwZW5kQ2hhcigoY2hhciljb2RlKTsKKyAgfQorICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkLmNwcAppbmRleCBiMmNmY2U3Li43ODE2OTYxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyX29sZC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlcl9vbGQuY3BwCkBAIC0xOCwxMTE4ICsxOCwxMTY4IEBACiAgICAgIklJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJIgogICAgICJJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSSIKICAgICAiSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUkiOwotRlhfQk9PTCBfUERGX0hhc0ludmFsaWRPcENoYXIoY29uc3QgRlhfQ0hBUiogb3ApCi17Ci0gICAgaWYoIW9wKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdWludDhfdCBjaDsKLSAgICB3aGlsZSgoY2ggPSAqb3ArKykpIHsKLSAgICAgICAgaWYoX1BERl9PcENoYXJUeXBlW2NoXSA9PSAnSScpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQorRlhfQk9PTCBfUERGX0hhc0ludmFsaWRPcENoYXIoY29uc3QgRlhfQ0hBUiogb3ApIHsKKyAgaWYgKCFvcCkgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB1aW50OF90IGNoOworICB3aGlsZSAoKGNoID0gKm9wKyspKSB7CisgICAgaWYgKF9QREZfT3BDaGFyVHlwZVtjaF0gPT0gJ0knKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogY2xhc3MgQ1BERl9TdHJlYW1QYXJzZXJBdXRvQ2xlYXJlciB7Ci0gIHB1YmxpYzoKLSAgICBDUERGX1N0cmVhbVBhcnNlckF1dG9DbGVhcmVyKENQREZfU3RyZWFtUGFyc2VyKiogc2NvcGVkX3ZhcmlhYmxlLCBDUERGX1N0cmVhbVBhcnNlciogbmV3X3BhcnNlcikKLSAgICAgICAgICAgIDogc2NvcGVkX3ZhcmlhYmxlXyhzY29wZWRfdmFyaWFibGUpIHsKLSAgICAgICAgKnNjb3BlZF92YXJpYWJsZV8gPSBuZXdfcGFyc2VyOwotICAgIH0KLSAgICB+Q1BERl9TdHJlYW1QYXJzZXJBdXRvQ2xlYXJlcigpIHsgKnNjb3BlZF92YXJpYWJsZV8gPSBOVUxMOyB9Ci0gIHByaXZhdGU6Ci0gICAgQ1BERl9TdHJlYW1QYXJzZXIqKiBzY29wZWRfdmFyaWFibGVfOworIHB1YmxpYzoKKyAgQ1BERl9TdHJlYW1QYXJzZXJBdXRvQ2xlYXJlcihDUERGX1N0cmVhbVBhcnNlcioqIHNjb3BlZF92YXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbVBhcnNlciogbmV3X3BhcnNlcikKKyAgICAgIDogc2NvcGVkX3ZhcmlhYmxlXyhzY29wZWRfdmFyaWFibGUpIHsKKyAgICAqc2NvcGVkX3ZhcmlhYmxlXyA9IG5ld19wYXJzZXI7CisgIH0KKyAgfkNQREZfU3RyZWFtUGFyc2VyQXV0b0NsZWFyZXIoKSB7ICpzY29wZWRfdmFyaWFibGVfID0gTlVMTDsgfQorCisgcHJpdmF0ZToKKyAgQ1BERl9TdHJlYW1QYXJzZXIqKiBzY29wZWRfdmFyaWFibGVfOwogfTsKLUZYX0RXT1JEIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6UGFyc2UoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSwgRlhfRFdPUkQgbWF4X2Nvc3QpCi17Ci0gICAgaWYgKG1fTGV2ZWwgPiBfRlBERl9NQVhfRk9STV9MRVZFTF8pIHsKLSAgICAgICAgcmV0dXJuIGR3U2l6ZTsKK0ZYX0RXT1JEIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6UGFyc2UoY29uc3QgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWF4X2Nvc3QpIHsKKyAgaWYgKG1fTGV2ZWwgPiBfRlBERl9NQVhfRk9STV9MRVZFTF8pIHsKKyAgICByZXR1cm4gZHdTaXplOworICB9CisgIEZYX0RXT1JEIEluaXRPYmpDb3VudCA9IG1fcE9iamVjdExpc3QtPkNvdW50T2JqZWN0cygpOworICBDUERGX1N0cmVhbVBhcnNlciBzeW50YXgocERhdGEsIGR3U2l6ZSk7CisgIENQREZfU3RyZWFtUGFyc2VyQXV0b0NsZWFyZXIgYXV0b19jbGVhcmVyKCZtX3BTeW50YXgsICZzeW50YXgpOworICBtX0NvbXBhdENvdW50ID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICBGWF9EV09SRCBjb3N0ID0gbV9wT2JqZWN0TGlzdC0+Q291bnRPYmplY3RzKCkgLSBJbml0T2JqQ291bnQ7CisgICAgaWYgKG1heF9jb3N0ICYmIGNvc3QgPj0gbWF4X2Nvc3QpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBGWF9EV09SRCBJbml0T2JqQ291bnQgPSBtX3BPYmplY3RMaXN0LT5Db3VudE9iamVjdHMoKTsKLSAgICBDUERGX1N0cmVhbVBhcnNlciBzeW50YXgocERhdGEsIGR3U2l6ZSk7Ci0gICAgQ1BERl9TdHJlYW1QYXJzZXJBdXRvQ2xlYXJlciBhdXRvX2NsZWFyZXIoJm1fcFN5bnRheCwgJnN5bnRheCk7Ci0gICAgbV9Db21wYXRDb3VudCA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgRlhfRFdPUkQgY29zdCA9IG1fcE9iamVjdExpc3QtPkNvdW50T2JqZWN0cygpIC0gSW5pdE9iakNvdW50OwotICAgICAgICBpZiAobWF4X2Nvc3QgJiYgY29zdCA+PSBtYXhfY29zdCkgewotICAgICAgICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChzeW50YXguUGFyc2VOZXh0RWxlbWVudCgpKSB7CisgICAgICBjYXNlIENQREZfU3RyZWFtUGFyc2VyOjpFbmRPZkRhdGE6CisgICAgICAgIHJldHVybiBtX3BTeW50YXgtPkdldFBvcygpOworICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6S2V5d29yZDoKKyAgICAgICAgaWYgKCFPbk9wZXJhdG9yKChjaGFyKilzeW50YXguR2V0V29yZEJ1ZigpKSAmJgorICAgICAgICAgICAgX1BERl9IYXNJbnZhbGlkT3BDaGFyKChjaGFyKilzeW50YXguR2V0V29yZEJ1ZigpKSkgeworICAgICAgICAgIG1fYkFib3J0ID0gVFJVRTsKICAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHN5bnRheC5QYXJzZU5leHRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6OkVuZE9mRGF0YToKLSAgICAgICAgICAgICAgICByZXR1cm4gbV9wU3ludGF4LT5HZXRQb3MoKTsKLSAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6OktleXdvcmQ6Ci0gICAgICAgICAgICAgICAgaWYoIU9uT3BlcmF0b3IoKGNoYXIqKXN5bnRheC5HZXRXb3JkQnVmKCkpICYmIF9QREZfSGFzSW52YWxpZE9wQ2hhcigoY2hhciopc3ludGF4LkdldFdvcmRCdWYoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9iQWJvcnQgPSBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9iQWJvcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcFN5bnRheC0+R2V0UG9zKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENsZWFyQWxsUGFyYW1zKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENQREZfU3RyZWFtUGFyc2VyOjpOdW1iZXI6Ci0gICAgICAgICAgICAgICAgQWRkTnVtYmVyUGFyYW0oKGNoYXIqKXN5bnRheC5HZXRXb3JkQnVmKCksIHN5bnRheC5HZXRXb3JkU2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6Ok5hbWU6Ci0gICAgICAgICAgICAgICAgQWRkTmFtZVBhcmFtKChjb25zdCBGWF9DSEFSKilzeW50YXguR2V0V29yZEJ1ZigpICsgMSwgc3ludGF4LkdldFdvcmRTaXplKCkgLSAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQWRkT2JqZWN0UGFyYW0oc3ludGF4LkdldE9iamVjdCgpKTsKKyAgICAgICAgaWYgKG1fYkFib3J0KSB7CisgICAgICAgICAgcmV0dXJuIG1fcFN5bnRheC0+R2V0UG9zKCk7CiAgICAgICAgIH0KKyAgICAgICAgQ2xlYXJBbGxQYXJhbXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENQREZfU3RyZWFtUGFyc2VyOjpOdW1iZXI6CisgICAgICAgIEFkZE51bWJlclBhcmFtKChjaGFyKilzeW50YXguR2V0V29yZEJ1ZigpLCBzeW50YXguR2V0V29yZFNpemUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6TmFtZToKKyAgICAgICAgQWRkTmFtZVBhcmFtKChjb25zdCBGWF9DSEFSKilzeW50YXguR2V0V29yZEJ1ZigpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgIHN5bnRheC5HZXRXb3JkU2l6ZSgpIC0gMSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgQWRkT2JqZWN0UGFyYW0oc3ludGF4LkdldE9iamVjdCgpKTsKICAgICB9Ci0gICAgcmV0dXJuIG1fcFN5bnRheC0+R2V0UG9zKCk7CisgIH0KKyAgcmV0dXJuIG1fcFN5bnRheC0+R2V0UG9zKCk7CiB9CiB2b2lkIF9QREZfUmVwbGFjZUFiYnIoQ1BERl9PYmplY3QqIHBPYmopOwotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbkltYWdlKCkKLXsKLSAgICBGWF9GSUxFU0laRSBzYXZlUG9zID0gbV9wU3ludGF4LT5HZXRQb3MoKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBDUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSB0eXBlID0gbV9wU3ludGF4LT5QYXJzZU5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmICh0eXBlID09IENQREZfU3RyZWFtUGFyc2VyOjpLZXl3b3JkKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0tleXdvcmQobV9wU3ludGF4LT5HZXRXb3JkQnVmKCksIG1fcFN5bnRheC0+R2V0V29yZFNpemUoKSk7Ci0gICAgICAgICAgICBpZiAoYnNLZXl3b3JkICE9IEZYX0JTVFJDKCJJRCIpKSB7Ci0gICAgICAgICAgICAgICAgbV9wU3ludGF4LT5TZXRQb3Moc2F2ZVBvcyk7Ci0gICAgICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUgIT0gQ1BERl9TdHJlYW1QYXJzZXI6Ok5hbWUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGtleSgoY29uc3QgRlhfQ0hBUiopbV9wU3ludGF4LT5HZXRXb3JkQnVmKCkgKyAxLCBtX3BTeW50YXgtPkdldFdvcmRTaXplKCkgLSAxKTsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BTeW50YXgtPlJlYWROZXh0T2JqZWN0KCk7Ci0gICAgICAgIGlmICgha2V5LklzRW1wdHkoKSkgewotICAgICAgICAgICAgcERpY3QtPlNldEF0KGtleSwgcE9iaiwgbV9wRG9jdW1lbnQpOwotICAgICAgICB9IGVsc2UgaWYgKHBPYmopIHsKLSAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBfUERGX1JlcGxhY2VBYmJyKHBEaWN0KTsKLSAgICBDUERGX09iamVjdCogcENTT2JqID0gTlVMTDsKLSAgICBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJDb2xvclNwYWNlIikpKSB7Ci0gICAgICAgIHBDU09iaiA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSk7Ci0gICAgICAgIGlmIChwQ1NPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IHBDU09iai0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBGWF9CU1RSQygiRGV2aWNlUkdCIikgJiYgbmFtZSAhPSBGWF9CU1RSQygiRGV2aWNlR3JheSIpICYmIG5hbWUgIT0gRlhfQlNUUkMoIkRldmljZUNNWUsiKSkgewotICAgICAgICAgICAgICAgIHBDU09iaiA9IEZpbmRSZXNvdXJjZU9iaihGWF9CU1RSQygiQ29sb3JTcGFjZSIpLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAocENTT2JqICYmICFwQ1NPYmotPkdldE9iak51bSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDU09iaiA9IHBDU09iai0+Q2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIHBDU09iaiwgbV9wRG9jdW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG1fcFN5bnRheC0+UmVhZElubGluZVN0cmVhbShtX3BEb2N1bWVudCwgcERpY3QsIHBDU09iaiwgbV9PcHRpb25zLm1fYkRlY29kZUlubGluZUltYWdlKTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBDUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSB0eXBlID0gbV9wU3ludGF4LT5QYXJzZU5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmICh0eXBlID09IENQREZfU3RyZWFtUGFyc2VyOjpFbmRPZkRhdGEpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlICE9IENQREZfU3RyZWFtUGFyc2VyOjpLZXl3b3JkKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wU3ludGF4LT5HZXRXb3JkU2l6ZSgpID09IDIgJiYgbV9wU3ludGF4LT5HZXRXb3JkQnVmKClbMF0gPT0gJ0UnICYmCi0gICAgICAgICAgICAgICAgbV9wU3ludGF4LT5HZXRXb3JkQnVmKClbMV0gPT0gJ0knKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIGlmIChwU3RyZWFtKSB7Ci0gICAgICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICB9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luSW1hZ2UoKSB7CisgIEZYX0ZJTEVTSVpFIHNhdmVQb3MgPSBtX3BTeW50YXgtPkdldFBvcygpOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKKyAgd2hpbGUgKDEpIHsKKyAgICBDUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSB0eXBlID0gbV9wU3ludGF4LT5QYXJzZU5leHRFbGVtZW50KCk7CisgICAgaWYgKHR5cGUgPT0gQ1BERl9TdHJlYW1QYXJzZXI6OktleXdvcmQpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5d29yZChtX3BTeW50YXgtPkdldFdvcmRCdWYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTeW50YXgtPkdldFdvcmRTaXplKCkpOworICAgICAgaWYgKGJzS2V5d29yZCAhPSBGWF9CU1RSQygiSUQiKSkgeworICAgICAgICBtX3BTeW50YXgtPlNldFBvcyhzYXZlUG9zKTsKKyAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuOworICAgICAgfQogICAgIH0KLSAgICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJTdWJ0eXBlIiksIEZYX0JTVFJDKCJJbWFnZSIpKTsKLSAgICBDUERGX0ltYWdlT2JqZWN0ICpwSW1nT2JqID0gQWRkSW1hZ2UocFN0cmVhbSwgTlVMTCwgVFJVRSk7Ci0gICAgaWYgKCFwSW1nT2JqKSB7Ci0gICAgICAgIGlmIChwU3RyZWFtKSB7Ci0gICAgICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOworICAgIGlmICh0eXBlICE9IENQREZfU3RyZWFtUGFyc2VyOjpOYW1lKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgQ0ZYX0J5dGVTdHJpbmcga2V5KChjb25zdCBGWF9DSEFSKiltX3BTeW50YXgtPkdldFdvcmRCdWYoKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgIG1fcFN5bnRheC0+R2V0V29yZFNpemUoKSAtIDEpOworICAgIENQREZfT2JqZWN0KiBwT2JqID0gbV9wU3ludGF4LT5SZWFkTmV4dE9iamVjdCgpOworICAgIGlmICgha2V5LklzRW1wdHkoKSkgeworICAgICAgcERpY3QtPlNldEF0KGtleSwgcE9iaiwgbV9wRG9jdW1lbnQpOworICAgIH0gZWxzZSBpZiAocE9iaikgeworICAgICAgcE9iai0+UmVsZWFzZSgpOworICAgIH0KKyAgfQorICBfUERGX1JlcGxhY2VBYmJyKHBEaWN0KTsKKyAgQ1BERl9PYmplY3QqIHBDU09iaiA9IE5VTEw7CisgIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSkpIHsKKyAgICBwQ1NPYmogPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJDb2xvclNwYWNlIikpOworICAgIGlmIChwQ1NPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IHBDU09iai0+R2V0U3RyaW5nKCk7CisgICAgICBpZiAobmFtZSAhPSBGWF9CU1RSQygiRGV2aWNlUkdCIikgJiYgbmFtZSAhPSBGWF9CU1RSQygiRGV2aWNlR3JheSIpICYmCisgICAgICAgICAgbmFtZSAhPSBGWF9CU1RSQygiRGV2aWNlQ01ZSyIpKSB7CisgICAgICAgIHBDU09iaiA9IEZpbmRSZXNvdXJjZU9iaihGWF9CU1RSQygiQ29sb3JTcGFjZSIpLCBuYW1lKTsKKyAgICAgICAgaWYgKHBDU09iaiAmJiAhcENTT2JqLT5HZXRPYmpOdW0oKSkgeworICAgICAgICAgIHBDU09iaiA9IHBDU09iai0+Q2xvbmUoKTsKKyAgICAgICAgICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSwgcENTT2JqLCBtX3BEb2N1bWVudCk7CiAgICAgICAgIH0KKyAgICAgIH0KICAgICB9CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBtX3BTeW50YXgtPlJlYWRJbmxpbmVTdHJlYW0oCisgICAgICBtX3BEb2N1bWVudCwgcERpY3QsIHBDU09iaiwgbV9PcHRpb25zLm1fYkRlY29kZUlubGluZUltYWdlKTsKKyAgd2hpbGUgKDEpIHsKKyAgICBDUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSB0eXBlID0gbV9wU3ludGF4LT5QYXJzZU5leHRFbGVtZW50KCk7CisgICAgaWYgKHR5cGUgPT0gQ1BERl9TdHJlYW1QYXJzZXI6OkVuZE9mRGF0YSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh0eXBlICE9IENQREZfU3RyZWFtUGFyc2VyOjpLZXl3b3JkKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKG1fcFN5bnRheC0+R2V0V29yZFNpemUoKSA9PSAyICYmIG1fcFN5bnRheC0+R2V0V29yZEJ1ZigpWzBdID09ICdFJyAmJgorICAgICAgICBtX3BTeW50YXgtPkdldFdvcmRCdWYoKVsxXSA9PSAnSScpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgaWYgKHBTdHJlYW0pIHsKKyAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgcERpY3QtPlJlbGVhc2UoKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgRlhfQlNUUkMoIkltYWdlIikpOworICBDUERGX0ltYWdlT2JqZWN0KiBwSW1nT2JqID0gQWRkSW1hZ2UocFN0cmVhbSwgTlVMTCwgVFJVRSk7CisgIGlmICghcEltZ09iaikgeworICAgIGlmIChwU3RyZWFtKSB7CisgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBEaWN0LT5SZWxlYXNlKCk7CisgICAgfQorICB9CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6UGFyc2VQYXRoT2JqZWN0KCkKLXsKLSAgICBGWF9GTE9BVCBwYXJhbXNbNl0gPSB7fTsKLSAgICBpbnQgblBhcmFtcyA9IDA7Ci0gICAgaW50IGxhc3RfcG9zID0gbV9wU3ludGF4LT5HZXRQb3MoKTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBDUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSB0eXBlID0gbV9wU3ludGF4LT5QYXJzZU5leHRFbGVtZW50KCk7Ci0gICAgICAgIEZYX0JPT0wgYlByb2Nlc3NlZCA9IFRSVUU7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6RW5kT2ZEYXRhOgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6OktleXdvcmQ6IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IG1fcFN5bnRheC0+R2V0V29yZFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1fcFN5bnRheC0+R2V0V29yZEJ1ZigpWzBdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgRlhQVF9NT1ZFVE8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGFyYW1zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgRlhQVF9MSU5FVE8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGFyYW1zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMl0sIHBhcmFtc1szXSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbNF0sIHBhcmFtc1s1XSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KG1fUGF0aEN1cnJlbnRYLCBtX1BhdGhDdXJyZW50WSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMl0sIHBhcmFtc1szXSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd5JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1swXSwgcGFyYW1zWzFdLCBGWFBUX0JFWklFUlRPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1syXSwgcGFyYW1zWzNdLCBGWFBUX0JFWklFUlRPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1syXSwgcGFyYW1zWzNdLCBGWFBUX0JFWklFUlRPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBhcmFtcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVfQ2xvc2VQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wU3ludGF4LT5HZXRXb3JkQnVmKClbMF0gPT0gJ3InICYmIG1fcFN5bnRheC0+R2V0V29yZEJ1ZigpWzFdID09ICdlJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhSZWN0KHBhcmFtc1swXSwgcGFyYW1zWzFdLCBwYXJhbXNbMl0sIHBhcmFtc1szXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgblBhcmFtcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYlByb2Nlc3NlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9wb3MgPSBtX3BTeW50YXgtPkdldFBvcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6Ok51bWJlcjogewotICAgICAgICAgICAgICAgICAgICBpZiAoblBhcmFtcyA9PSA2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbnRlZ2VyOwotICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIEZYX2F0b251bShDRlhfQnl0ZVN0cmluZ0MobV9wU3ludGF4LT5HZXRXb3JkQnVmKCksIG1fcFN5bnRheC0+R2V0V29yZFNpemUoKSksIGJJbnRlZ2VyLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbXNbblBhcmFtcysrXSA9IGJJbnRlZ2VyID8gKEZYX0ZMT0FUKXZhbHVlIDogKihGWF9GTE9BVCopJnZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6UGFyc2VQYXRoT2JqZWN0KCkgeworICBGWF9GTE9BVCBwYXJhbXNbNl0gPSB7fTsKKyAgaW50IG5QYXJhbXMgPSAwOworICBpbnQgbGFzdF9wb3MgPSBtX3BTeW50YXgtPkdldFBvcygpOworICB3aGlsZSAoMSkgeworICAgIENQREZfU3RyZWFtUGFyc2VyOjpTeW50YXhUeXBlIHR5cGUgPSBtX3BTeW50YXgtPlBhcnNlTmV4dEVsZW1lbnQoKTsKKyAgICBGWF9CT09MIGJQcm9jZXNzZWQgPSBUUlVFOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6RW5kT2ZEYXRhOgorICAgICAgICByZXR1cm47CisgICAgICBjYXNlIENQREZfU3RyZWFtUGFyc2VyOjpLZXl3b3JkOiB7CisgICAgICAgIGludCBsZW4gPSBtX3BTeW50YXgtPkdldFdvcmRTaXplKCk7CisgICAgICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgICAgIHN3aXRjaCAobV9wU3ludGF4LT5HZXRXb3JkQnVmKClbMF0pIHsKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICBBZGRQYXRoUG9pbnQocGFyYW1zWzBdLCBwYXJhbXNbMV0sIEZYUFRfTU9WRVRPKTsKKyAgICAgICAgICAgICAgblBhcmFtcyA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgRlhQVF9MSU5FVE8pOworICAgICAgICAgICAgICBuUGFyYW1zID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1swXSwgcGFyYW1zWzFdLCBGWFBUX0JFWklFUlRPKTsKKyAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1syXSwgcGFyYW1zWzNdLCBGWFBUX0JFWklFUlRPKTsKKyAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1s0XSwgcGFyYW1zWzVdLCBGWFBUX0JFWklFUlRPKTsKKyAgICAgICAgICAgICAgblBhcmFtcyA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChtX1BhdGhDdXJyZW50WCwgbV9QYXRoQ3VycmVudFksIEZYUFRfQkVaSUVSVE8pOworICAgICAgICAgICAgICBBZGRQYXRoUG9pbnQocGFyYW1zWzBdLCBwYXJhbXNbMV0sIEZYUFRfQkVaSUVSVE8pOworICAgICAgICAgICAgICBBZGRQYXRoUG9pbnQocGFyYW1zWzJdLCBwYXJhbXNbM10sIEZYUFRfQkVaSUVSVE8pOworICAgICAgICAgICAgICBuUGFyYW1zID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1swXSwgcGFyYW1zWzFdLCBGWFBUX0JFWklFUlRPKTsKKyAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1syXSwgcGFyYW1zWzNdLCBGWFBUX0JFWklFUlRPKTsKKyAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1syXSwgcGFyYW1zWzNdLCBGWFBUX0JFWklFUlRPKTsKKyAgICAgICAgICAgICAgblBhcmFtcyA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgIEhhbmRsZV9DbG9zZVBhdGgoKTsKKyAgICAgICAgICAgICAgblBhcmFtcyA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gRkFMU0U7CisgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSAyKSB7CisgICAgICAgICAgaWYgKG1fcFN5bnRheC0+R2V0V29yZEJ1ZigpWzBdID09ICdyJyAmJgorICAgICAgICAgICAgICBtX3BTeW50YXgtPkdldFdvcmRCdWYoKVsxXSA9PSAnZScpIHsKKyAgICAgICAgICAgIEFkZFBhdGhSZWN0KHBhcmFtc1swXSwgcGFyYW1zWzFdLCBwYXJhbXNbMl0sIHBhcmFtc1szXSk7CisgICAgICAgICAgICBuUGFyYW1zID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYlByb2Nlc3NlZCA9IEZBTFNFOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBiUHJvY2Vzc2VkID0gRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFiUHJvY2Vzc2VkKSB7Ci0gICAgICAgICAgICBtX3BTeW50YXgtPlNldFBvcyhsYXN0X3Bvcyk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChiUHJvY2Vzc2VkKSB7CisgICAgICAgICAgbGFzdF9wb3MgPSBtX3BTeW50YXgtPkdldFBvcygpOwogICAgICAgICB9Ci0gICAgfQotfQotQ1BERl9TdHJlYW1QYXJzZXI6OkNQREZfU3RyZWFtUGFyc2VyKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpCi17Ci0gICAgbV9wQnVmID0gcERhdGE7Ci0gICAgbV9TaXplID0gZHdTaXplOwotICAgIG1fUG9zID0gMDsKLSAgICBtX3BMYXN0T2JqID0gTlVMTDsKLX0KLUNQREZfU3RyZWFtUGFyc2VyOjp+Q1BERl9TdHJlYW1QYXJzZXIoKQotewotICAgIGlmIChtX3BMYXN0T2JqKSB7Ci0gICAgICAgIG1fcExhc3RPYmotPlJlbGVhc2UoKTsKLSAgICB9Ci19Ci1GWF9EV09SRCBfRGVjb2RlQWxsU2NhbmxpbmVzKElDb2RlY19TY2FubGluZURlY29kZXIqIHBEZWNvZGVyLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgaWYgKHBEZWNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChGWF9EV09SRCkgLSAxOwotICAgIH0KLSAgICBpbnQgbmNvbXBzID0gcERlY29kZXItPkNvdW50Q29tcHMoKTsKLSAgICBpbnQgYnBjID0gcERlY29kZXItPkdldEJQQygpOwotICAgIGludCB3aWR0aCA9IHBEZWNvZGVyLT5HZXRXaWR0aCgpOwotICAgIGludCBoZWlnaHQgPSBwRGVjb2Rlci0+R2V0SGVpZ2h0KCk7Ci0gICAgaW50IHBpdGNoID0gKHdpZHRoICogbmNvbXBzICogYnBjICsgNykgLyA4OwotICAgIGlmIChoZWlnaHQgPT0gMCB8fCBwaXRjaCA+ICgxIDw8IDMwKSAvIGhlaWdodCkgewotICAgICAgICBkZWxldGUgcERlY29kZXI7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZGVzdF9idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIHBpdGNoLCBoZWlnaHQpOwotICAgIGRlc3Rfc2l6ZSA9IHBpdGNoICogaGVpZ2h0OyAgLy8gU2FmZSBzaW5jZSBjaGVja2VkIGFsbG9jIHJldHVybmVkLgotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIHBMaW5lID0gcERlY29kZXItPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgIGlmIChwTGluZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIENQREZfU3RyZWFtUGFyc2VyOjpOdW1iZXI6IHsKKyAgICAgICAgaWYgKG5QYXJhbXMgPT0gNikgeworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIEZYU1lTX21lbWNweShkZXN0X2J1ZiArIHJvdyAqIHBpdGNoLCBwTGluZSwgcGl0Y2gpOworICAgICAgICBGWF9CT09MIGJJbnRlZ2VyOworICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgIEZYX2F0b251bSgKKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyhtX3BTeW50YXgtPkdldFdvcmRCdWYoKSwgbV9wU3ludGF4LT5HZXRXb3JkU2l6ZSgpKSwKKyAgICAgICAgICAgIGJJbnRlZ2VyLCAmdmFsdWUpOworICAgICAgICBwYXJhbXNbblBhcmFtcysrXSA9IGJJbnRlZ2VyID8gKEZYX0ZMT0FUKXZhbHVlIDogKihGWF9GTE9BVCopJnZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJQcm9jZXNzZWQgPSBGQUxTRTsKICAgICB9Ci0gICAgRlhfRFdPUkQgc3Jjb2ZmID0gcERlY29kZXItPkdldFNyY09mZnNldCgpOworICAgIGlmICghYlByb2Nlc3NlZCkgeworICAgICAgbV9wU3ludGF4LT5TZXRQb3MobGFzdF9wb3MpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorQ1BERl9TdHJlYW1QYXJzZXI6OkNQREZfU3RyZWFtUGFyc2VyKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpIHsKKyAgbV9wQnVmID0gcERhdGE7CisgIG1fU2l6ZSA9IGR3U2l6ZTsKKyAgbV9Qb3MgPSAwOworICBtX3BMYXN0T2JqID0gTlVMTDsKK30KK0NQREZfU3RyZWFtUGFyc2VyOjp+Q1BERl9TdHJlYW1QYXJzZXIoKSB7CisgIGlmIChtX3BMYXN0T2JqKSB7CisgICAgbV9wTGFzdE9iai0+UmVsZWFzZSgpOworICB9Cit9CitGWF9EV09SRCBfRGVjb2RlQWxsU2NhbmxpbmVzKElDb2RlY19TY2FubGluZURlY29kZXIqIHBEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIHsKKyAgaWYgKHBEZWNvZGVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gKEZYX0RXT1JEKS0xOworICB9CisgIGludCBuY29tcHMgPSBwRGVjb2Rlci0+Q291bnRDb21wcygpOworICBpbnQgYnBjID0gcERlY29kZXItPkdldEJQQygpOworICBpbnQgd2lkdGggPSBwRGVjb2Rlci0+R2V0V2lkdGgoKTsKKyAgaW50IGhlaWdodCA9IHBEZWNvZGVyLT5HZXRIZWlnaHQoKTsKKyAgaW50IHBpdGNoID0gKHdpZHRoICogbmNvbXBzICogYnBjICsgNykgLyA4OworICBpZiAoaGVpZ2h0ID09IDAgfHwgcGl0Y2ggPiAoMSA8PCAzMCkgLyBoZWlnaHQpIHsKICAgICBkZWxldGUgcERlY29kZXI7Ci0gICAgcmV0dXJuIHNyY29mZjsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZGVzdF9idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIHBpdGNoLCBoZWlnaHQpOworICBkZXN0X3NpemUgPSBwaXRjaCAqIGhlaWdodDsgIC8vIFNhZmUgc2luY2UgY2hlY2tlZCBhbGxvYyByZXR1cm5lZC4KKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgIHVpbnQ4X3QqIHBMaW5lID0gcERlY29kZXItPkdldFNjYW5saW5lKHJvdyk7CisgICAgaWYgKHBMaW5lID09IE5VTEwpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBGWFNZU19tZW1jcHkoZGVzdF9idWYgKyByb3cgKiBwaXRjaCwgcExpbmUsIHBpdGNoKTsKKyAgfQorICBGWF9EV09SRCBzcmNvZmYgPSBwRGVjb2Rlci0+R2V0U3JjT2Zmc2V0KCk7CisgIGRlbGV0ZSBwRGVjb2RlcjsKKyAgcmV0dXJuIHNyY29mZjsKIH0KLUlDb2RlY19TY2FubGluZURlY29kZXIqIEZQREZBUElfQ3JlYXRlRmF4RGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpOwotRlhfRFdPUkQgX0E4NURlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKLUZYX0RXT1JEIF9IZXhEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci1GWF9EV09SRCBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotRlhfRFdPUkQgUERGX0RlY29kZUlubGluZVN0cmVhbShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBDRlhfQnl0ZVN0cmluZyYgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW0sIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKLXsKLSAgICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiQ0NJVFRGYXhEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJDQ0YiKSkgewotICAgICAgICBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBwRGVjb2RlciA9IEZQREZBUElfQ3JlYXRlRmF4RGVjb2RlcihzcmNfYnVmLCBsaW1pdCwgd2lkdGgsIGhlaWdodCwgcFBhcmFtKTsKLSAgICAgICAgcmV0dXJuIF9EZWNvZGVBbGxTY2FubGluZXMocERlY29kZXIsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgIH0KLSAgICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiQVNDSUk4NURlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkE4NSIpKSB7Ci0gICAgICAgIHJldHVybiBfQTg1RGVjb2RlKHNyY19idWYsIGxpbWl0LCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICB9Ci0gICAgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkFTQ0lJSGV4RGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiQUh4IikpIHsKLSAgICAgICAgcmV0dXJuIF9IZXhEZWNvZGUoc3JjX2J1ZiwgbGltaXQsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgIH0KLSAgICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiRmxhdGVEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJGbCIpKSB7Ci0gICAgICAgIHJldHVybiBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRkFMU0UsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIGRlc3Rfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgfQotICAgIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJMWldEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJMWlciKSkgewotICAgICAgICByZXR1cm4gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKFRSVUUsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIDAsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgIH0KLSAgICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiRENURGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiRENUIikpIHsKLSAgICAgICAgSUNvZGVjX1NjYW5saW5lRGVjb2RlciogcERlY29kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcigKLSAgICAgICAgICAgIHNyY19idWYsIGxpbWl0LCB3aWR0aCwgaGVpZ2h0LCAwLCBwUGFyYW0gPyBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbG9yVHJhbnNmb3JtIiksIDEpIDogMSk7Ci0gICAgICAgIHJldHVybiBfRGVjb2RlQWxsU2NhbmxpbmVzKHBEZWNvZGVyLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICB9Ci0gICAgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIlJ1bkxlbmd0aERlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIlJMIikpIHsKLSAgICAgICAgcmV0dXJuIFJ1bkxlbmd0aERlY29kZShzcmNfYnVmLCBsaW1pdCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgfQotICAgIGRlc3Rfc2l6ZSA9IDA7Ci0gICAgZGVzdF9idWYgPSAwOwotICAgIHJldHVybiAoRlhfRFdPUkQpIC0gMTsKK0lDb2RlY19TY2FubGluZURlY29kZXIqIEZQREZBUElfQ3JlYXRlRmF4RGVjb2RlcigKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0LAorICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcyk7CitGWF9EV09SRCBfQTg1RGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpOworRlhfRFdPUkQgX0hleERlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKK0ZYX0RXT1JEIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShGWF9CT09MIGJMWlcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpOworRlhfRFdPUkQgUERGX0RlY29kZUlubGluZVN0cmVhbShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiQ0NJVFRGYXhEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJDQ0YiKSkgeworICAgIElDb2RlY19TY2FubGluZURlY29kZXIqIHBEZWNvZGVyID0KKyAgICAgICAgRlBERkFQSV9DcmVhdGVGYXhEZWNvZGVyKHNyY19idWYsIGxpbWl0LCB3aWR0aCwgaGVpZ2h0LCBwUGFyYW0pOworICAgIHJldHVybiBfRGVjb2RlQWxsU2NhbmxpbmVzKHBEZWNvZGVyLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgfQorICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiQVNDSUk4NURlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkE4NSIpKSB7CisgICAgcmV0dXJuIF9BODVEZWNvZGUoc3JjX2J1ZiwgbGltaXQsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICB9CisgIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJBU0NJSUhleERlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkFIeCIpKSB7CisgICAgcmV0dXJuIF9IZXhEZWNvZGUoc3JjX2J1ZiwgbGltaXQsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICB9CisgIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJGbGF0ZURlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkZsIikpIHsKKyAgICByZXR1cm4gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKEZBTFNFLCBzcmNfYnVmLCBsaW1pdCwgcFBhcmFtLCBkZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgfQorICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiTFpXRGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiTFpXIikpIHsKKyAgICByZXR1cm4gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKFRSVUUsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIDAsIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zaXplKTsKKyAgfQorICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiRENURGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiRENUIikpIHsKKyAgICBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBwRGVjb2RlciA9CisgICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKAorICAgICAgICAgICAgc3JjX2J1ZiwgbGltaXQsIHdpZHRoLCBoZWlnaHQsIDAsCisgICAgICAgICAgICBwUGFyYW0gPyBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbG9yVHJhbnNmb3JtIiksIDEpIDogMSk7CisgICAgcmV0dXJuIF9EZWNvZGVBbGxTY2FubGluZXMocERlY29kZXIsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICB9CisgIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJSdW5MZW5ndGhEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJSTCIpKSB7CisgICAgcmV0dXJuIFJ1bkxlbmd0aERlY29kZShzcmNfYnVmLCBsaW1pdCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisgIH0KKyAgZGVzdF9zaXplID0gMDsKKyAgZGVzdF9idWYgPSAwOworICByZXR1cm4gKEZYX0RXT1JEKS0xOwogfQotQ1BERl9TdHJlYW0qIENQREZfU3RyZWFtUGFyc2VyOjpSZWFkSW5saW5lU3RyZWFtKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfT2JqZWN0KiBwQ1NPYmosIEZYX0JPT0wgYkRlY29kZSkKLXsKLSAgICBpZiAobV9Qb3MgPT0gbV9TaXplKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworQ1BERl9TdHJlYW0qIENQREZfU3RyZWFtUGFyc2VyOjpSZWFkSW5saW5lU3RyZWFtKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcENTT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRlY29kZSkgeworICBpZiAobV9Qb3MgPT0gbV9TaXplKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKFBERl9DaGFyVHlwZVttX3BCdWZbbV9Qb3NdXSA9PSAnVycpIHsKKyAgICBtX1BvcysrOworICB9CisgIENGWF9CeXRlU3RyaW5nIERlY29kZXI7CisgIENQREZfRGljdGlvbmFyeSogcFBhcmFtID0gTlVMTDsKKyAgQ1BERl9PYmplY3QqIHBGaWx0ZXIgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJGaWx0ZXIiKSk7CisgIGlmIChwRmlsdGVyID09IE5VTEwpIHsKKyAgfSBlbHNlIGlmIChwRmlsdGVyLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgRGVjb2RlciA9ICgoQ1BERl9BcnJheSopcEZpbHRlciktPkdldFN0cmluZygwKTsKKyAgICBDUERGX0FycmF5KiBwUGFyYW1zID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEZWNvZGVQYXJtcyIpKTsKKyAgICBpZiAocFBhcmFtcykgeworICAgICAgcFBhcmFtID0gcFBhcmFtcy0+R2V0RGljdCgwKTsKICAgICB9Ci0gICAgaWYgKFBERl9DaGFyVHlwZVttX3BCdWZbbV9Qb3NdXSA9PSAnVycpIHsKLSAgICAgICAgbV9Qb3MgKys7CisgIH0gZWxzZSB7CisgICAgRGVjb2RlciA9IHBGaWx0ZXItPkdldFN0cmluZygpOworICAgIHBQYXJhbSA9IHBEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJEZWNvZGVQYXJtcyIpKTsKKyAgfQorICBGWF9EV09SRCB3aWR0aCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJXaWR0aCIpKTsKKyAgRlhfRFdPUkQgaGVpZ2h0ID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkhlaWdodCIpKTsKKyAgRlhfRFdPUkQgT3JpZ1NpemUgPSAwOworICBpZiAocENTT2JqICE9IE5VTEwpIHsKKyAgICBGWF9EV09SRCBicGMgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpKTsKKyAgICBGWF9EV09SRCBuQ29tcG9uZW50cyA9IDE7CisgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBwRG9jLT5Mb2FkQ29sb3JTcGFjZShwQ1NPYmopOworICAgIGlmIChwQ1MgPT0gTlVMTCkgeworICAgICAgbkNvbXBvbmVudHMgPSAzOworICAgIH0gZWxzZSB7CisgICAgICBuQ29tcG9uZW50cyA9IHBDUy0+Q291bnRDb21wb25lbnRzKCk7CisgICAgICBwRG9jLT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1NPYmopOwogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGVyOwotICAgIENQREZfRGljdGlvbmFyeSogcFBhcmFtID0gTlVMTDsKLSAgICBDUERGX09iamVjdCogcEZpbHRlciA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZpbHRlciIpKTsKLSAgICBpZiAocEZpbHRlciA9PSBOVUxMKSB7Ci0gICAgfSBlbHNlIGlmIChwRmlsdGVyLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIERlY29kZXIgPSAoKENQREZfQXJyYXkqKXBGaWx0ZXIpLT5HZXRTdHJpbmcoMCk7CisgICAgRlhfRFdPUkQgcGl0Y2ggPSB3aWR0aDsKKyAgICBpZiAoYnBjICYmIHBpdGNoID4gSU5UX01BWCAvIGJwYykgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBpdGNoICo9IGJwYzsKKyAgICBpZiAobkNvbXBvbmVudHMgJiYgcGl0Y2ggPiBJTlRfTUFYIC8gbkNvbXBvbmVudHMpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwaXRjaCAqPSBuQ29tcG9uZW50czsKKyAgICBpZiAocGl0Y2ggPiBJTlRfTUFYIC0gNykgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBpdGNoICs9IDc7CisgICAgcGl0Y2ggLz0gODsKKyAgICBPcmlnU2l6ZSA9IHBpdGNoOworICB9IGVsc2UgeworICAgIGlmICh3aWR0aCA+IElOVF9NQVggLSA3KSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgT3JpZ1NpemUgPSAoKHdpZHRoICsgNykgLyA4KTsKKyAgfQorICBpZiAoaGVpZ2h0ICYmIE9yaWdTaXplID4gSU5UX01BWCAvIGhlaWdodCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIE9yaWdTaXplICo9IGhlaWdodDsKKyAgdWludDhfdCogcERhdGEgPSBOVUxMOworICBGWF9EV09SRCBkd1N0cmVhbVNpemU7CisgIGlmIChEZWNvZGVyLklzRW1wdHkoKSkgeworICAgIGlmIChPcmlnU2l6ZSA+IG1fU2l6ZSAtIG1fUG9zKSB7CisgICAgICBPcmlnU2l6ZSA9IG1fU2l6ZSAtIG1fUG9zOworICAgIH0KKyAgICBwRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIE9yaWdTaXplKTsKKyAgICBGWFNZU19tZW1jcHkocERhdGEsIG1fcEJ1ZiArIG1fUG9zLCBPcmlnU2l6ZSk7CisgICAgZHdTdHJlYW1TaXplID0gT3JpZ1NpemU7CisgICAgbV9Qb3MgKz0gT3JpZ1NpemU7CisgIH0gZWxzZSB7CisgICAgRlhfRFdPUkQgZHdEZXN0U2l6ZSA9IE9yaWdTaXplOworICAgIGR3U3RyZWFtU2l6ZSA9CisgICAgICAgIFBERl9EZWNvZGVJbmxpbmVTdHJlYW0obV9wQnVmICsgbV9Qb3MsIG1fU2l6ZSAtIG1fUG9zLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXIsIHBQYXJhbSwgcERhdGEsIGR3RGVzdFNpemUpOworICAgIGlmICgoaW50KWR3U3RyZWFtU2l6ZSA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoYkRlY29kZSkgeworICAgICAgbV9Qb3MgKz0gZHdTdHJlYW1TaXplOworICAgICAgZHdTdHJlYW1TaXplID0gZHdEZXN0U2l6ZTsKKyAgICAgIGlmIChwRmlsdGVyLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgICAgICgoQ1BERl9BcnJheSopcEZpbHRlciktPlJlbW92ZUF0KDApOwogICAgICAgICBDUERGX0FycmF5KiBwUGFyYW1zID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEZWNvZGVQYXJtcyIpKTsKICAgICAgICAgaWYgKHBQYXJhbXMpIHsKLSAgICAgICAgICAgIHBQYXJhbSA9IHBQYXJhbXMtPkdldERpY3QoMCk7CisgICAgICAgICAgcFBhcmFtcy0+UmVtb3ZlQXQoMCk7CiAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBEaWN0LT5SZW1vdmVBdChGWF9CU1RSQygiRmlsdGVyIikpOworICAgICAgICBwRGljdC0+UmVtb3ZlQXQoRlhfQlNUUkMoIkRlY29kZVBhcm1zIikpOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIERlY29kZXIgPSBwRmlsdGVyLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgcFBhcmFtID0gcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkRlY29kZVBhcm1zIikpOworICAgICAgaWYgKHBEYXRhKSB7CisgICAgICAgIEZYX0ZyZWUocERhdGEpOworICAgICAgfQorICAgICAgRlhfRFdPUkQgZHdTYXZlUG9zID0gbV9Qb3M7CisgICAgICBtX1BvcyArPSBkd1N0cmVhbVNpemU7CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICBGWF9EV09SRCBkd1ByZXZQb3MgPSBtX1BvczsKKyAgICAgICAgQ1BERl9TdHJlYW1QYXJzZXI6OlN5bnRheFR5cGUgdHlwZSA9IFBhcnNlTmV4dEVsZW1lbnQoKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gQ1BERl9TdHJlYW1QYXJzZXI6OkVuZE9mRGF0YSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlICE9IENQREZfU3RyZWFtUGFyc2VyOjpLZXl3b3JkKSB7CisgICAgICAgICAgZHdTdHJlYW1TaXplICs9IG1fUG9zIC0gZHdQcmV2UG9zOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChHZXRXb3JkU2l6ZSgpID09IDIgJiYgR2V0V29yZEJ1ZigpWzBdID09ICdFJyAmJgorICAgICAgICAgICAgR2V0V29yZEJ1ZigpWzFdID09ICdJJykgeworICAgICAgICAgIG1fUG9zID0gZHdQcmV2UG9zOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGR3U3RyZWFtU2l6ZSArPSBtX1BvcyAtIGR3UHJldlBvczsKKyAgICAgIH0KKyAgICAgIG1fUG9zID0gZHdTYXZlUG9zOworICAgICAgcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBkd1N0cmVhbVNpemUpOworICAgICAgRlhTWVNfbWVtY3B5KHBEYXRhLCBtX3BCdWYgKyBtX1BvcywgZHdTdHJlYW1TaXplKTsKKyAgICAgIG1fUG9zICs9IGR3U3RyZWFtU2l6ZTsKICAgICB9Ci0gICAgRlhfRFdPUkQgd2lkdGggPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSk7Ci0gICAgRlhfRFdPUkQgaGVpZ2h0ID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkhlaWdodCIpKTsKLSAgICBGWF9EV09SRCBPcmlnU2l6ZSA9IDA7Ci0gICAgaWYgKHBDU09iaiAhPSBOVUxMKSB7Ci0gICAgICAgIEZYX0RXT1JEIGJwYyA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IikpOwotICAgICAgICBGWF9EV09SRCBuQ29tcG9uZW50cyA9IDE7Ci0gICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gcERvYy0+TG9hZENvbG9yU3BhY2UocENTT2JqKTsKLSAgICAgICAgaWYgKHBDUyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBuQ29tcG9uZW50cyA9IDM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuQ29tcG9uZW50cyA9IHBDUy0+Q291bnRDb21wb25lbnRzKCk7Ci0gICAgICAgICAgICBwRG9jLT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1NPYmopOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIHBpdGNoID0gd2lkdGg7Ci0gICAgICAgIGlmIChicGMgJiYgcGl0Y2ggPiBJTlRfTUFYIC8gYnBjKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBwaXRjaCAqPSBicGM7Ci0gICAgICAgIGlmIChuQ29tcG9uZW50cyAmJiBwaXRjaCA+IElOVF9NQVggLyBuQ29tcG9uZW50cykgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcGl0Y2ggKj0gbkNvbXBvbmVudHM7Ci0gICAgICAgIGlmIChwaXRjaCA+IElOVF9NQVggLSA3KSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBwaXRjaCArPSA3OwotICAgICAgICBwaXRjaCAvPSA4OwotICAgICAgICBPcmlnU2l6ZSA9IHBpdGNoOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICh3aWR0aCA+IElOVF9NQVggLSA3KSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBPcmlnU2l6ZSA9ICgod2lkdGggKyA3KSAvIDgpOwotICAgIH0KLSAgICBpZiAoaGVpZ2h0ICYmIE9yaWdTaXplID4gSU5UX01BWCAvIGhlaWdodCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgT3JpZ1NpemUgKj0gaGVpZ2h0OwotICAgIHVpbnQ4X3QqIHBEYXRhID0gTlVMTDsKLSAgICBGWF9EV09SRCBkd1N0cmVhbVNpemU7Ci0gICAgaWYgKERlY29kZXIuSXNFbXB0eSgpKSB7Ci0gICAgICAgIGlmIChPcmlnU2l6ZSA+IG1fU2l6ZSAtIG1fUG9zKSB7Ci0gICAgICAgICAgICBPcmlnU2l6ZSA9IG1fU2l6ZSAtIG1fUG9zOwotICAgICAgICB9Ci0gICAgICAgIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgT3JpZ1NpemUpOwotICAgICAgICBGWFNZU19tZW1jcHkocERhdGEsIG1fcEJ1ZiArIG1fUG9zLCBPcmlnU2l6ZSk7Ci0gICAgICAgIGR3U3RyZWFtU2l6ZSA9IE9yaWdTaXplOwotICAgICAgICBtX1BvcyArPSBPcmlnU2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWF9EV09SRCBkd0Rlc3RTaXplID0gT3JpZ1NpemU7Ci0gICAgICAgIGR3U3RyZWFtU2l6ZSA9IFBERl9EZWNvZGVJbmxpbmVTdHJlYW0obV9wQnVmICsgbV9Qb3MsIG1fU2l6ZSAtIG1fUG9zLCB3aWR0aCwgaGVpZ2h0LCBEZWNvZGVyLCBwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEsIGR3RGVzdFNpemUpOwotICAgICAgICBpZiAoKGludClkd1N0cmVhbVNpemUgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYkRlY29kZSkgewotICAgICAgICAgICAgbV9Qb3MgKz0gZHdTdHJlYW1TaXplOwotICAgICAgICAgICAgZHdTdHJlYW1TaXplID0gZHdEZXN0U2l6ZTsKLSAgICAgICAgICAgIGlmIChwRmlsdGVyLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICAgICAgKChDUERGX0FycmF5KilwRmlsdGVyKS0+UmVtb3ZlQXQoMCk7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcFBhcmFtcyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVjb2RlUGFybXMiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+UmVtb3ZlQXQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwRGljdC0+UmVtb3ZlQXQoRlhfQlNUUkMoIkZpbHRlciIpKTsKLSAgICAgICAgICAgICAgICBwRGljdC0+UmVtb3ZlQXQoRlhfQlNUUkMoIkRlY29kZVBhcm1zIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBEYXRhKSB7Ci0gICAgICAgICAgICAgICAgRlhfRnJlZShwRGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9EV09SRCBkd1NhdmVQb3MgPSBtX1BvczsKLSAgICAgICAgICAgIG1fUG9zICs9IGR3U3RyZWFtU2l6ZTsKLSAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQcmV2UG9zID0gbV9Qb3M7Ci0gICAgICAgICAgICAgICAgQ1BERl9TdHJlYW1QYXJzZXI6OlN5bnRheFR5cGUgdHlwZSA9IFBhcnNlTmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBDUERGX1N0cmVhbVBhcnNlcjo6RW5kT2ZEYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBDUERGX1N0cmVhbVBhcnNlcjo6S2V5d29yZCkgewotICAgICAgICAgICAgICAgICAgICBkd1N0cmVhbVNpemUgKz0gbV9Qb3MgLSBkd1ByZXZQb3M7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoR2V0V29yZFNpemUoKSA9PSAyICYmIEdldFdvcmRCdWYoKVswXSA9PSAnRScgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIEdldFdvcmRCdWYoKVsxXSA9PSAnSScpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Qb3MgPSBkd1ByZXZQb3M7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkd1N0cmVhbVNpemUgKz0gbV9Qb3MgLSBkd1ByZXZQb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX1BvcyA9IGR3U2F2ZVBvczsKLSAgICAgICAgICAgIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgZHdTdHJlYW1TaXplKTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShwRGF0YSwgbV9wQnVmICsgbV9Qb3MsIGR3U3RyZWFtU2l6ZSk7Ci0gICAgICAgICAgICBtX1BvcyArPSBkd1N0cmVhbVNpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIChpbnQpZHdTdHJlYW1TaXplKTsKLSAgICByZXR1cm4gQ1BERl9TdHJlYW06OkNyZWF0ZShwRGF0YSwgZHdTdHJlYW1TaXplLCBwRGljdCk7CisgIH0KKyAgcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIChpbnQpZHdTdHJlYW1TaXplKTsKKyAgcmV0dXJuIENQREZfU3RyZWFtOjpDcmVhdGUocERhdGEsIGR3U3RyZWFtU2l6ZSwgcERpY3QpOwogfQogI2RlZmluZSBNQVhfV09SRF9CVUZGRVIgMjU2Ci0jZGVmaW5lIE1BWF9TVFJJTkdfTEVOR1RICTMyNzY3CisjZGVmaW5lIE1BWF9TVFJJTkdfTEVOR1RIIDMyNzY3CiAjZGVmaW5lIEZYRFdPUkRfVFJVRSBGWERXT1JEX0ZST01fTFNCRklSU1QoMHg2NTc1NzI3NCkKICNkZWZpbmUgRlhEV09SRF9OVUxMIEZYRFdPUkRfRlJPTV9MU0JGSVJTVCgweDZjNmM3NTZlKQogI2RlZmluZSBGWERXT1JEX0ZBTFMgRlhEV09SRF9GUk9NX0xTQkZJUlNUKDB4NzM2YzYxNjYpCi1DUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSBDUERGX1N0cmVhbVBhcnNlcjo6UGFyc2VOZXh0RWxlbWVudCgpCi17Ci0gICAgaWYgKG1fcExhc3RPYmopIHsKLSAgICAgICAgbV9wTGFzdE9iai0+UmVsZWFzZSgpOwotICAgICAgICBtX3BMYXN0T2JqID0gTlVMTDsKLSAgICB9Ci0gICAgbV9Xb3JkU2l6ZSA9IDA7Ci0gICAgRlhfQk9PTCBiSXNOdW1iZXIgPSBUUlVFOwotICAgIGlmIChtX1BvcyA+PSBtX1NpemUpIHsKK0NQREZfU3RyZWFtUGFyc2VyOjpTeW50YXhUeXBlIENQREZfU3RyZWFtUGFyc2VyOjpQYXJzZU5leHRFbGVtZW50KCkgeworICBpZiAobV9wTGFzdE9iaikgeworICAgIG1fcExhc3RPYmotPlJlbGVhc2UoKTsKKyAgICBtX3BMYXN0T2JqID0gTlVMTDsKKyAgfQorICBtX1dvcmRTaXplID0gMDsKKyAgRlhfQk9PTCBiSXNOdW1iZXIgPSBUUlVFOworICBpZiAobV9Qb3MgPj0gbV9TaXplKSB7CisgICAgcmV0dXJuIEVuZE9mRGF0YTsKKyAgfQorICBpbnQgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgIGludCB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgd2hpbGUgKDEpIHsKKyAgICB3aGlsZSAodHlwZSA9PSAnVycpIHsKKyAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKICAgICAgICAgcmV0dXJuIEVuZE9mRGF0YTsKKyAgICAgIH0KKyAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgfQotICAgIGludCBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICBpbnQgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgd2hpbGUgKHR5cGUgPT0gJ1cnKSB7Ci0gICAgICAgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVuZE9mRGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOwotICAgICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoICE9ICclJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRW5kT2ZEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgfQotICAgIGlmICh0eXBlID09ICdEJyAmJiBjaCAhPSAnLycpIHsKLSAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgIG1fcExhc3RPYmogPSBSZWFkTmV4dE9iamVjdCgpOwotICAgICAgICByZXR1cm4gT3RoZXJzOworICAgIGlmIChjaCAhPSAnJScpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KICAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAobV9Xb3JkU2l6ZSA8IE1BWF9XT1JEX0JVRkZFUikgewotICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSAhPSAnTicpIHsKLSAgICAgICAgICAgIGJJc051bWJlciA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgeworICAgICAgICByZXR1cm4gRW5kT2ZEYXRhOworICAgICAgfQorICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgfQorICBpZiAodHlwZSA9PSAnRCcgJiYgY2ggIT0gJy8nKSB7CisgICAgbV9Qb3MtLTsKKyAgICBtX3BMYXN0T2JqID0gUmVhZE5leHRPYmplY3QoKTsKKyAgICByZXR1cm4gT3RoZXJzOworICB9CisgIHdoaWxlICgxKSB7CisgICAgaWYgKG1fV29yZFNpemUgPCBNQVhfV09SRF9CVUZGRVIpIHsKKyAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CisgICAgfQorICAgIGlmICh0eXBlICE9ICdOJykgeworICAgICAgYklzTnVtYmVyID0gRkFMU0U7CisgICAgfQorICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKKyAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgICBpZiAodHlwZSA9PSAnRCcgfHwgdHlwZSA9PSAnVycpIHsKKyAgICAgIG1fUG9zLS07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemVdID0gMDsKKyAgaWYgKGJJc051bWJlcikgeworICAgIHJldHVybiBOdW1iZXI7CisgIH0KKyAgaWYgKG1fV29yZEJ1ZmZlclswXSA9PSAnLycpIHsKKyAgICByZXR1cm4gTmFtZTsKKyAgfQorICBpZiAobV9Xb3JkU2l6ZSA9PSA0KSB7CisgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX1RSVUUpIHsKKyAgICAgIG1fcExhc3RPYmogPSBDUERGX0Jvb2xlYW46OkNyZWF0ZShUUlVFKTsKKyAgICAgIHJldHVybiBPdGhlcnM7CisgICAgfQorICAgIGlmICgqKEZYX0RXT1JEKiltX1dvcmRCdWZmZXIgPT0gRlhEV09SRF9OVUxMKSB7CisgICAgICBtX3BMYXN0T2JqID0gQ1BERl9OdWxsOjpDcmVhdGUoKTsKKyAgICAgIHJldHVybiBPdGhlcnM7CisgICAgfQorICB9IGVsc2UgaWYgKG1fV29yZFNpemUgPT0gNSkgeworICAgIGlmICgqKEZYX0RXT1JEKiltX1dvcmRCdWZmZXIgPT0gRlhEV09SRF9GQUxTICYmIG1fV29yZEJ1ZmZlcls0XSA9PSAnZScpIHsKKyAgICAgIG1fcExhc3RPYmogPSBDUERGX0Jvb2xlYW46OkNyZWF0ZShGQUxTRSk7CisgICAgICByZXR1cm4gT3RoZXJzOworICAgIH0KKyAgfQorICByZXR1cm4gS2V5d29yZDsKK30KK3ZvaWQgQ1BERl9TdHJlYW1QYXJzZXI6OlNraXBQYXRoT2JqZWN0KCkgeworICBGWF9EV09SRCBjb21tYW5kX3N0YXJ0cG9zID0gbV9Qb3M7CisgIGlmIChtX1BvcyA+PSBtX1NpemUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGNoID0gbV9wQnVmW21fUG9zKytdOworICBpbnQgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgIHdoaWxlICgxKSB7CisgICAgd2hpbGUgKHR5cGUgPT0gJ1cnKSB7CisgICAgICBpZiAobV9Qb3MgPj0gbV9TaXplKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgICAgfQorICAgIGlmICh0eXBlICE9ICdOJykgeworICAgICAgbV9Qb3MgPSBjb21tYW5kX3N0YXJ0cG9zOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3aGlsZSAoMSkgeworICAgICAgd2hpbGUgKHR5cGUgIT0gJ1cnKSB7CisgICAgICAgIGlmIChtX1BvcyA+PSBtX1NpemUpIHsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CiAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgICAgICBpZiAodHlwZSA9PSAnRCcgfHwgdHlwZSA9PSAnVycpIHsKLSAgICAgICAgICAgIG1fUG9zIC0tOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB3aGlsZSAodHlwZSA9PSAnVycpIHsKKyAgICAgICAgaWYgKG1fUG9zID49IG1fU2l6ZSkgeworICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgIH0KLSAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZV0gPSAwOwotICAgIGlmIChiSXNOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIE51bWJlcjsKLSAgICB9Ci0gICAgaWYgKG1fV29yZEJ1ZmZlclswXSA9PSAnLycpIHsKLSAgICAgICAgcmV0dXJuIE5hbWU7Ci0gICAgfQotICAgIGlmIChtX1dvcmRTaXplID09IDQpIHsKLSAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX1RSVUUpIHsKLSAgICAgICAgICAgIG1fcExhc3RPYmogPSBDUERGX0Jvb2xlYW46OkNyZWF0ZShUUlVFKTsKLSAgICAgICAgICAgIHJldHVybiBPdGhlcnM7CisgICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgICAgIH0KKyAgICAgIGlmICh0eXBlID09ICdOJykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEZYX0RXT1JEIG9wX3N0YXJ0cG9zID0gbV9Qb3MgLSAxOworICAgICAgd2hpbGUgKHR5cGUgIT0gJ1cnICYmIHR5cGUgIT0gJ0QnKSB7CisgICAgICAgIGlmIChtX1BvcyA+PSBtX1NpemUpIHsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX05VTEwpIHsKLSAgICAgICAgICAgIG1fcExhc3RPYmogPSBDUERGX051bGw6OkNyZWF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIE90aGVyczsKKyAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICAgICAgfQorICAgICAgaWYgKG1fUG9zIC0gb3Bfc3RhcnRwb3MgPT0gMikgeworICAgICAgICBpbnQgb3AgPSBtX3BCdWZbb3Bfc3RhcnRwb3NdOworICAgICAgICBpZiAob3AgPT0gJ20nIHx8IG9wID09ICdsJyB8fCBvcCA9PSAnYycgfHwgb3AgPT0gJ3YnIHx8IG9wID09ICd5JykgeworICAgICAgICAgIGNvbW1hbmRfc3RhcnRwb3MgPSBtX1BvczsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9Xb3JkU2l6ZSA9PSA1KSB7Ci0gICAgICAgIGlmICgqKEZYX0RXT1JEKiltX1dvcmRCdWZmZXIgPT0gRlhEV09SRF9GQUxTICYmIG1fV29yZEJ1ZmZlcls0XSA9PSAnZScpIHsKLSAgICAgICAgICAgIG1fcExhc3RPYmogPSBDUERGX0Jvb2xlYW46OkNyZWF0ZShGQUxTRSk7Ci0gICAgICAgICAgICByZXR1cm4gT3RoZXJzOworICAgICAgfSBlbHNlIGlmIChtX1BvcyAtIG9wX3N0YXJ0cG9zID09IDMpIHsKKyAgICAgICAgaWYgKG1fcEJ1ZltvcF9zdGFydHBvc10gPT0gJ3InICYmIG1fcEJ1ZltvcF9zdGFydHBvcyArIDFdID09ICdlJykgeworICAgICAgICAgIGNvbW1hbmRfc3RhcnRwb3MgPSBtX1BvczsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgfQorICAgICAgbV9Qb3MgPSBjb21tYW5kX3N0YXJ0cG9zOworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICByZXR1cm4gS2V5d29yZDsKKyAgfQogfQotdm9pZCBDUERGX1N0cmVhbVBhcnNlcjo6U2tpcFBhdGhPYmplY3QoKQotewotICAgIEZYX0RXT1JEIGNvbW1hbmRfc3RhcnRwb3MgPSBtX1BvczsKLSAgICBpZiAobV9Qb3MgPj0gbV9TaXplKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGNoID0gbV9wQnVmW21fUG9zKytdOwotICAgIGludCB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICB3aGlsZSAodHlwZSA9PSAnVycpIHsKLSAgICAgICAgICAgIGlmIChtX1BvcyA+PSBtX1NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlICE9ICdOJykgewotICAgICAgICAgICAgbV9Qb3MgPSBjb21tYW5kX3N0YXJ0cG9zOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICB3aGlsZSAodHlwZSAhPSAnVycpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9Qb3MgPj0gbV9TaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAodHlwZSA9PSAnVycpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9Qb3MgPj0gbV9TaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSAnTicpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0RXT1JEIG9wX3N0YXJ0cG9zID0gbV9Qb3MgLSAxOwotICAgICAgICAgICAgd2hpbGUgKHR5cGUgIT0gJ1cnICYmIHR5cGUgIT0gJ0QnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fUG9zID49IG1fU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOwotICAgICAgICAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fUG9zIC0gb3Bfc3RhcnRwb3MgPT0gMikgewotICAgICAgICAgICAgICAgIGludCBvcCA9IG1fcEJ1ZltvcF9zdGFydHBvc107Ci0gICAgICAgICAgICAgICAgaWYgKG9wID09ICdtJyB8fCBvcCA9PSAnbCcgfHwgb3AgPT0gJ2MnIHx8IG9wID09ICd2JyB8fCBvcCA9PSAneScpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9zdGFydHBvcyA9IG1fUG9zOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fUG9zIC0gb3Bfc3RhcnRwb3MgPT0gMykgewotICAgICAgICAgICAgICAgIGlmIChtX3BCdWZbb3Bfc3RhcnRwb3NdID09ICdyJyAmJiBtX3BCdWZbb3Bfc3RhcnRwb3MgKyAxXSA9PSAnZScpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9zdGFydHBvcyA9IG1fUG9zOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX1BvcyA9IGNvbW1hbmRfc3RhcnRwb3M7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUERGX09iamVjdCogQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWROZXh0T2JqZWN0KEZYX0JPT0wgYkFsbG93TmVzdGVkQXJyYXksIEZYX0JPT0wgYkluQXJyYXkpCi17Ci0gICAgRlhfQk9PTCBiSXNOdW1iZXI7Ci0gICAgR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAobV9Xb3JkU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoYklzTnVtYmVyKSB7Ci0gICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplXSA9IDA7Ci0gICAgICAgIHJldHVybiBDUERGX051bWJlcjo6Q3JlYXRlKENGWF9CeXRlU3RyaW5nQyhtX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpKTsKLSAgICB9Ci0gICAgaW50IGZpcnN0X2NoYXIgPSBtX1dvcmRCdWZmZXJbMF07Ci0gICAgaWYgKGZpcnN0X2NoYXIgPT0gJy8nKSB7Ci0gICAgICAgIHJldHVybiBDUERGX05hbWU6OkNyZWF0ZShQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0MobV9Xb3JkQnVmZmVyICsgMSwgbV9Xb3JkU2l6ZSAtIDEpKSk7Ci0gICAgfQotICAgIGlmIChmaXJzdF9jaGFyID09ICcoJykgewotICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShSZWFkU3RyaW5nKCkpOwotICAgIH0KLSAgICBpZiAoZmlyc3RfY2hhciA9PSAnPCcpIHsKLSAgICAgICAgaWYgKG1fV29yZFNpemUgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoUmVhZEhleFN0cmluZygpLCBUUlVFKTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIEdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgICAgICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX1dvcmRTaXplID09IDIgJiYgbV9Xb3JkQnVmZmVyWzBdID09ICc+JykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fV29yZEJ1ZmZlclswXSAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5ID0gUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSk7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IFJlYWROZXh0T2JqZWN0KFRSVUUpOwotICAgICAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChwRGljdCkgewotICAgICAgICAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgha2V5LklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHBEaWN0LT5TZXRBdChrZXksIHBPYmopOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBEaWN0OwotICAgIH0KLSAgICBpZiAoZmlyc3RfY2hhciA9PSAnWycpIHsKLSAgICAgICAgaWYgKCFiQWxsb3dOZXN0ZWRBcnJheSAmJiBiSW5BcnJheSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IFJlYWROZXh0T2JqZWN0KGJBbGxvd05lc3RlZEFycmF5LCBUUlVFKTsKLSAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAwIHx8IG1fV29yZEJ1ZmZlclswXSA9PSAnXScpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBBcnJheTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fV29yZEJ1ZmZlclswXSA9PSAnWycpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwQXJyYXktPkFkZChwT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9Xb3JkU2l6ZSA9PSA0KSB7Ci0gICAgICAgIGlmICgqKEZYX0RXT1JEKiltX1dvcmRCdWZmZXIgPT0gRlhEV09SRF9UUlVFKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9Cb29sZWFuOjpDcmVhdGUoVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX05VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBDUERGX051bGw6OkNyZWF0ZSgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtX1dvcmRTaXplID09IDUpIHsKLSAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX0ZBTFMgJiYgbV9Xb3JkQnVmZmVyWzRdID09ICdlJykgewotICAgICAgICAgICAgcmV0dXJuIENQREZfQm9vbGVhbjo6Q3JlYXRlKEZBTFNFKTsKLSAgICAgICAgfQotICAgIH0KK0NQREZfT2JqZWN0KiBDUERGX1N0cmVhbVBhcnNlcjo6UmVhZE5leHRPYmplY3QoRlhfQk9PTCBiQWxsb3dOZXN0ZWRBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5BcnJheSkgeworICBGWF9CT09MIGJJc051bWJlcjsKKyAgR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgaWYgKG1fV29yZFNpemUgPT0gMCkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChiSXNOdW1iZXIpIHsKKyAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZV0gPSAwOworICAgIHJldHVybiBDUERGX051bWJlcjo6Q3JlYXRlKENGWF9CeXRlU3RyaW5nQyhtX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpKTsKKyAgfQorICBpbnQgZmlyc3RfY2hhciA9IG1fV29yZEJ1ZmZlclswXTsKKyAgaWYgKGZpcnN0X2NoYXIgPT0gJy8nKSB7CisgICAgcmV0dXJuIENQREZfTmFtZTo6Q3JlYXRlKAorICAgICAgICBQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0MobV9Xb3JkQnVmZmVyICsgMSwgbV9Xb3JkU2l6ZSAtIDEpKSk7CisgIH0KKyAgaWYgKGZpcnN0X2NoYXIgPT0gJygnKSB7CisgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoUmVhZFN0cmluZygpKTsKKyAgfQorICBpZiAoZmlyc3RfY2hhciA9PSAnPCcpIHsKKyAgICBpZiAobV9Xb3JkU2l6ZSA9PSAxKSB7CisgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShSZWFkSGV4U3RyaW5nKCksIFRSVUUpOworICAgIH0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgICAgIGlmIChtX1dvcmRTaXplID09IDApIHsKKyAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAyICYmIG1fV29yZEJ1ZmZlclswXSA9PSAnPicpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAobV9Xb3JkQnVmZmVyWzBdICE9ICcvJykgeworICAgICAgICBwRGljdC0+UmVsZWFzZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGtleSA9CisgICAgICAgICAgUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSk7CisgICAgICBDUERGX09iamVjdCogcE9iaiA9IFJlYWROZXh0T2JqZWN0KFRSVUUpOworICAgICAgaWYgKHBPYmogPT0gTlVMTCkgeworICAgICAgICBpZiAocERpY3QpIHsKKyAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgaWYgKCFrZXkuSXNFbXB0eSgpKSB7CisgICAgICAgIHBEaWN0LT5TZXRBdChrZXksIHBPYmopOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcE9iai0+UmVsZWFzZSgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcERpY3Q7CisgIH0KKyAgaWYgKGZpcnN0X2NoYXIgPT0gJ1snKSB7CisgICAgaWYgKCFiQWxsb3dOZXN0ZWRBcnJheSAmJiBiSW5BcnJheSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOworICAgIHdoaWxlICgxKSB7CisgICAgICBDUERGX09iamVjdCogcE9iaiA9IFJlYWROZXh0T2JqZWN0KGJBbGxvd05lc3RlZEFycmF5LCBUUlVFKTsKKyAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICAgICAgaWYgKG1fV29yZFNpemUgPT0gMCB8fCBtX1dvcmRCdWZmZXJbMF0gPT0gJ10nKSB7CisgICAgICAgICAgcmV0dXJuIHBBcnJheTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9Xb3JkQnVmZmVyWzBdID09ICdbJykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwQXJyYXktPkFkZChwT2JqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKG1fV29yZFNpemUgPT0gNCkgeworICAgIGlmICgqKEZYX0RXT1JEKiltX1dvcmRCdWZmZXIgPT0gRlhEV09SRF9UUlVFKSB7CisgICAgICByZXR1cm4gQ1BERl9Cb29sZWFuOjpDcmVhdGUoVFJVRSk7CisgICAgfQorICAgIGlmICgqKEZYX0RXT1JEKiltX1dvcmRCdWZmZXIgPT0gRlhEV09SRF9OVUxMKSB7CisgICAgICByZXR1cm4gQ1BERl9OdWxsOjpDcmVhdGUoKTsKKyAgICB9CisgIH0gZWxzZSBpZiAobV9Xb3JkU2l6ZSA9PSA1KSB7CisgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX0ZBTFMgJiYgbV9Xb3JkQnVmZmVyWzRdID09ICdlJykgeworICAgICAgcmV0dXJuIENQREZfQm9vbGVhbjo6Q3JlYXRlKEZBTFNFKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci12b2lkIENQREZfU3RyZWFtUGFyc2VyOjpHZXROZXh0V29yZChGWF9CT09MJiBiSXNOdW1iZXIpCi17Ci0gICAgbV9Xb3JkU2l6ZSA9IDA7Ci0gICAgYklzTnVtYmVyID0gVFJVRTsKLSAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7Cit2b2lkIENQREZfU3RyZWFtUGFyc2VyOjpHZXROZXh0V29yZChGWF9CT09MJiBiSXNOdW1iZXIpIHsKKyAgbV9Xb3JkU2l6ZSA9IDA7CisgIGJJc051bWJlciA9IFRSVUU7CisgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGNoID0gbV9wQnVmW21fUG9zKytdOworICBpbnQgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgIHdoaWxlICgxKSB7CisgICAgd2hpbGUgKHR5cGUgPT0gJ1cnKSB7CisgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7CiAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgfQotICAgIGludCBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICBpbnQgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgICAgaWYgKGNoICE9ICclJykgeworICAgICAgYnJlYWs7CisgICAgfQogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHdoaWxlICh0eXBlID09ICdXJykgewotICAgICAgICAgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOwotICAgICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICAgICAgaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgIH0KKyAgaWYgKHR5cGUgPT0gJ0QnKSB7CisgICAgYklzTnVtYmVyID0gRkFMU0U7CisgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKKyAgICBpZiAoY2ggPT0gJy8nKSB7CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7CisgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjaCAhPSAnJScpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CiAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgIH0KLSAgICBpZiAodHlwZSA9PSAnRCcpIHsKLSAgICAgICAgYklzTnVtYmVyID0gRkFMU0U7Ci0gICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7Ci0gICAgICAgIGlmIChjaCA9PSAnLycpIHsKLSAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOwotICAgICAgICAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgICAgICAgICAgICAgIGlmICh0eXBlICE9ICdSJyAmJiB0eXBlICE9ICdOJykgewotICAgICAgICAgICAgICAgICAgICBtX1BvcyAtLTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9Xb3JkU2l6ZSA8IE1BWF9XT1JEX0JVRkZFUikgewotICAgICAgICAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPCcpIHsKLSAgICAgICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpIHsKLSAgICAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX1BvcyAtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPicpIHsKLSAgICAgICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnPicpIHsKLSAgICAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX1BvcyAtLTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgIT0gJ1InICYmIHR5cGUgIT0gJ04nKSB7CisgICAgICAgICAgbV9Qb3MtLTsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAobV9Xb3JkU2l6ZSA8IE1BWF9XT1JEX0JVRkZFUikgewotICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKKyAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwogICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlICE9ICdOJykgewotICAgICAgICAgICAgYklzTnVtYmVyID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOwotICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgaWYgKHR5cGUgPT0gJ0QnIHx8IHR5cGUgPT0gJ1cnKSB7Ci0gICAgICAgICAgICBtX1BvcyAtLTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjaCA9PSAnPCcpIHsKKyAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgICAgICBpZiAoY2ggPT0gJzwnKSB7CisgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX1Bvcy0tOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7CisgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICAgICAgaWYgKGNoID09ICc+JykgeworICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9Qb3MtLTsKKyAgICAgIH0KICAgICB9Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX1N0cmVhbVBhcnNlcjo6UmVhZFN0cmluZygpCi17CisgICAgcmV0dXJuOworICB9CisgIHdoaWxlICgxKSB7CisgICAgaWYgKG1fV29yZFNpemUgPCBNQVhfV09SRF9CVUZGRVIpIHsKKyAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CisgICAgfQorICAgIGlmICh0eXBlICE9ICdOJykgeworICAgICAgYklzTnVtYmVyID0gRkFMU0U7CisgICAgfQogICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIGludCBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICAgIGludCBwYXJsZXZlbCA9IDA7Ci0gICAgaW50IHN0YXR1cyA9IDAsIGlFc2NDb2RlID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnKScpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmxldmVsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWYuR2V0TGVuZ3RoKCkgPiBNQVhfU1RSSU5HX0xFTkdUSCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYuR2V0QnVmZmVyKCksIE1BWF9TVFJJTkdfTEVOR1RIKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWYuR2V0Qnl0ZVN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhcmxldmVsIC0tOwotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcignKScpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmxldmVsICsrOwotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcignKCcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xcJykgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKChjaGFyKWNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKLSAgICAgICAgICAgICAgICAgICAgaUVzY0NvZGUgPSBjaCAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnbicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAncicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xyJyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAndCcpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1x0Jyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnYicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xiJyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnZicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xmJyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc3JykgewotICAgICAgICAgICAgICAgICAgICBpRXNjQ29kZSA9IGlFc2NDb2RlICogOCArIGNoIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAzOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGlFc2NDb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlFc2NDb2RlID0gaUVzY0NvZGUgKiA4ICsgY2ggLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGlFc2NDb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKKyAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKKyAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgICBpZiAodHlwZSA9PSAnRCcgfHwgdHlwZSA9PSAnVycpIHsKKyAgICAgIG1fUG9zLS07CisgICAgICBicmVhazsKICAgICB9Ci0gICAgaWYgKG1fU2l6ZSA+IG1fUG9zKSB7Ci0gICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOwotICAgIH0KLSAgICBpZiAoYnVmLkdldExlbmd0aCgpID4gTUFYX1NUUklOR19MRU5HVEgpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGJ1Zi5HZXRCdWZmZXIoKSwgTUFYX1NUUklOR19MRU5HVEgpOwotICAgIH0KLSAgICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKKyAgfQogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWRIZXhTdHJpbmcoKQoteworQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWRTdHJpbmcoKSB7CisgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgfQorICBpbnQgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIGludCBwYXJsZXZlbCA9IDA7CisgIGludCBzdGF0dXMgPSAwLCBpRXNjQ29kZSA9IDA7CisgIHdoaWxlICgxKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKGNoID09ICcpJykgeworICAgICAgICAgIGlmIChwYXJsZXZlbCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYnVmLkdldExlbmd0aCgpID4gTUFYX1NUUklOR19MRU5HVEgpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGJ1Zi5HZXRCdWZmZXIoKSwgTUFYX1NUUklOR19MRU5HVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5HZXRCeXRlU3RyaW5nKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHBhcmxldmVsLS07CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJyknKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKCcpIHsKKyAgICAgICAgICBwYXJsZXZlbCsrOworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCcoJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xcJykgeworICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoKGNoYXIpY2gpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc3JykgeworICAgICAgICAgIGlFc2NDb2RlID0gY2ggLSAnMCc7CisgICAgICAgICAgc3RhdHVzID0gMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggPT0gJ24nKSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xuJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3InKSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xyJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3QnKSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1x0Jyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2InKSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xiJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2YnKSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xmJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgIHN0YXR1cyA9IDQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGNoKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKKyAgICAgICAgICBpRXNjQ29kZSA9IGlFc2NDb2RlICogOCArIGNoIC0gJzAnOworICAgICAgICAgIHN0YXR1cyA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoaUVzY0NvZGUpOworICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKSB7CisgICAgICAgICAgaUVzY0NvZGUgPSBpRXNjQ29kZSAqIDggKyBjaCAtICcwJzsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7CisgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7CisgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgaWYgKGNoICE9ICdcbicpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CiAgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBpbnQgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7Ci0gICAgaW50IGNvZGUgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChjaCA9PSAnPicpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICcwJykgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICcwJzsKLSAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcigoY2hhciljb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJGaXJzdCA9ICFiRmlyc3Q7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgewotICAgICAgICAgICAgaWYgKGJGaXJzdCkgewotICAgICAgICAgICAgICAgIGNvZGUgPSAoY2ggLSAnQScgKyAxMCkgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICdBJyArIDEwOwotICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKChjaGFyKWNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkZpcnN0ID0gIWJGaXJzdDsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICdhJyArIDEwKSAqIDE2OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2RlICs9IGNoIC0gJ2EnICsgMTA7Ci0gICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoKGNoYXIpY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiRmlyc3QgPSAhYkZpcnN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICB9CisgIGlmIChtX1NpemUgPiBtX1BvcykgeworICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICB9CisgIGlmIChidWYuR2V0TGVuZ3RoKCkgPiBNQVhfU1RSSU5HX0xFTkdUSCkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYuR2V0QnVmZmVyKCksIE1BWF9TVFJJTkdfTEVOR1RIKTsKKyAgfQorICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKK30KK0NGWF9CeXRlU3RyaW5nIENQREZfU3RyZWFtUGFyc2VyOjpSZWFkSGV4U3RyaW5nKCkgeworICBpZiAobV9TaXplIDw9IG1fUG9zKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIH0KKyAgaW50IGNoID0gbV9wQnVmW21fUG9zKytdOworICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7CisgIGludCBjb2RlID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoY2ggPT0gJz4nKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgaWYgKCFiRmlyc3QpIHsKKyAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgaWYgKGJGaXJzdCkgeworICAgICAgICBjb2RlID0gKGNoIC0gJzAnKSAqIDE2OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZSArPSBjaCAtICcwJzsKICAgICAgICAgYnVmLkFwcGVuZENoYXIoKGNoYXIpY29kZSk7CisgICAgICB9CisgICAgICBiRmlyc3QgPSAhYkZpcnN0OworICAgIH0gZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgeworICAgICAgaWYgKGJGaXJzdCkgeworICAgICAgICBjb2RlID0gKGNoIC0gJ0EnICsgMTApICogMTY7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb2RlICs9IGNoIC0gJ0EnICsgMTA7CisgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKChjaGFyKWNvZGUpOworICAgICAgfQorICAgICAgYkZpcnN0ID0gIWJGaXJzdDsKKyAgICB9IGVsc2UgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHsKKyAgICAgIGlmIChiRmlyc3QpIHsKKyAgICAgICAgY29kZSA9IChjaCAtICdhJyArIDEwKSAqIDE2OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZSArPSBjaCAtICdhJyArIDEwOworICAgICAgICBidWYuQXBwZW5kQ2hhcigoY2hhciljb2RlKTsKKyAgICAgIH0KKyAgICAgIGJGaXJzdCA9ICFiRmlyc3Q7CiAgICAgfQotICAgIGlmIChidWYuR2V0TGVuZ3RoKCkgPiBNQVhfU1RSSU5HX0xFTkdUSCkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoYnVmLkdldEJ1ZmZlcigpLCBNQVhfU1RSSU5HX0xFTkdUSCk7CisgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBidWYuR2V0Qnl0ZVN0cmluZygpOworICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICB9CisgIGlmICghYkZpcnN0KSB7CisgICAgYnVmLkFwcGVuZENoYXIoKGNoYXIpY29kZSk7CisgIH0KKyAgaWYgKGJ1Zi5HZXRMZW5ndGgoKSA+IE1BWF9TVFJJTkdfTEVOR1RIKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGJ1Zi5HZXRCdWZmZXIoKSwgTUFYX1NUUklOR19MRU5HVEgpOworICB9CisgIHJldHVybiBidWYuR2V0Qnl0ZVN0cmluZygpOwogfQotI2RlZmluZSBQQUdFUEFSU0VfU1RBR0VfR0VUQ09OVEVOVAkJMQotI2RlZmluZSBQQUdFUEFSU0VfU1RBR0VfUEFSU0UJCQkyCi0jZGVmaW5lIFBBR0VQQVJTRV9TVEFHRV9DSEVDS0NMSVAJCTMKLUNQREZfQ29udGVudFBhcnNlcjo6Q1BERl9Db250ZW50UGFyc2VyKCkKLXsKLSAgICBtX3BQYXJzZXIgPSBOVUxMOwotICAgIG1fcFN0cmVhbUFycmF5ID0gTlVMTDsKLSAgICBtX3BTaW5nbGVTdHJlYW0gPSBOVUxMOwotICAgIG1fcERhdGEgPSBOVUxMOwotICAgIG1fU3RhdHVzID0gUmVhZHk7Ci0gICAgbV9wVHlwZTNDaGFyID0gTlVMTDsKKyNkZWZpbmUgUEFHRVBBUlNFX1NUQUdFX0dFVENPTlRFTlQgMQorI2RlZmluZSBQQUdFUEFSU0VfU1RBR0VfUEFSU0UgMgorI2RlZmluZSBQQUdFUEFSU0VfU1RBR0VfQ0hFQ0tDTElQIDMKK0NQREZfQ29udGVudFBhcnNlcjo6Q1BERl9Db250ZW50UGFyc2VyKCkgeworICBtX3BQYXJzZXIgPSBOVUxMOworICBtX3BTdHJlYW1BcnJheSA9IE5VTEw7CisgIG1fcFNpbmdsZVN0cmVhbSA9IE5VTEw7CisgIG1fcERhdGEgPSBOVUxMOworICBtX1N0YXR1cyA9IFJlYWR5OworICBtX3BUeXBlM0NoYXIgPSBOVUxMOwogfQotQ1BERl9Db250ZW50UGFyc2VyOjp+Q1BERl9Db250ZW50UGFyc2VyKCkKLXsKLSAgICBDbGVhcigpOworQ1BERl9Db250ZW50UGFyc2VyOjp+Q1BERl9Db250ZW50UGFyc2VyKCkgeworICBDbGVhcigpOwogfQotdm9pZCBDUERGX0NvbnRlbnRQYXJzZXI6OkNsZWFyKCkKLXsKLSAgICBkZWxldGUgbV9wUGFyc2VyOwotICAgIGRlbGV0ZSBtX3BTaW5nbGVTdHJlYW07Ci0gICAgaWYgKG1fcFN0cmVhbUFycmF5KSB7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25TdHJlYW1zOyBpICsrKQotICAgICAgICAgICAgZGVsZXRlIG1fcFN0cmVhbUFycmF5W2ldOwotICAgICAgICBGWF9GcmVlKG1fcFN0cmVhbUFycmF5KTsKLSAgICB9Ci0gICAgaWYgKG1fcERhdGEgJiYgbV9wU2luZ2xlU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgRlhfRnJlZSgodm9pZCopbV9wRGF0YSk7Ci0gICAgfQotICAgIG1fcFBhcnNlciA9IE5VTEw7Ci0gICAgbV9wU3RyZWFtQXJyYXkgPSBOVUxMOwotICAgIG1fcFNpbmdsZVN0cmVhbSA9IE5VTEw7Ci0gICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgbV9TdGF0dXMgPSBSZWFkeTsKK3ZvaWQgQ1BERl9Db250ZW50UGFyc2VyOjpDbGVhcigpIHsKKyAgZGVsZXRlIG1fcFBhcnNlcjsKKyAgZGVsZXRlIG1fcFNpbmdsZVN0cmVhbTsKKyAgaWYgKG1fcFN0cmVhbUFycmF5KSB7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fblN0cmVhbXM7IGkrKykKKyAgICAgIGRlbGV0ZSBtX3BTdHJlYW1BcnJheVtpXTsKKyAgICBGWF9GcmVlKG1fcFN0cmVhbUFycmF5KTsKKyAgfQorICBpZiAobV9wRGF0YSAmJiBtX3BTaW5nbGVTdHJlYW0gPT0gTlVMTCkgeworICAgIEZYX0ZyZWUoKHZvaWQqKW1fcERhdGEpOworICB9CisgIG1fcFBhcnNlciA9IE5VTEw7CisgIG1fcFN0cmVhbUFycmF5ID0gTlVMTDsKKyAgbV9wU2luZ2xlU3RyZWFtID0gTlVMTDsKKyAgbV9wRGF0YSA9IE5VTEw7CisgIG1fU3RhdHVzID0gUmVhZHk7CiB9Ci12b2lkIENQREZfQ29udGVudFBhcnNlcjo6U3RhcnQoQ1BERl9QYWdlKiBwUGFnZSwgQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zKQotewotICAgIGlmIChtX1N0YXR1cyAhPSBSZWFkeSB8fCBwUGFnZSA9PSBOVUxMIHx8IHBQYWdlLT5tX3BEb2N1bWVudCA9PSBOVUxMIHx8IHBQYWdlLT5tX3BGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIG1fU3RhdHVzID0gRG9uZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BPYmplY3RzID0gcFBhZ2U7Ci0gICAgbV9iRm9ybSA9IEZBTFNFOwotICAgIGlmIChwT3B0aW9ucykgewotICAgICAgICBtX09wdGlvbnMgPSAqcE9wdGlvbnM7Ci0gICAgfQotICAgIG1fU3RhdHVzID0gVG9CZUNvbnRpbnVlZDsKLSAgICBtX0ludGVybmFsU3RhZ2UgPSBQQUdFUEFSU0VfU1RBR0VfR0VUQ09OVEVOVDsKLSAgICBtX0N1cnJlbnRPZmZzZXQgPSAwOwotICAgIENQREZfT2JqZWN0KiBwQ29udGVudCA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJDb250ZW50cyIpKTsKLSAgICBpZiAocENvbnRlbnQgPT0gTlVMTCkgewotICAgICAgICBtX1N0YXR1cyA9IERvbmU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBDb250ZW50LT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICBtX25TdHJlYW1zID0gMDsKLSAgICAgICAgbV9wU2luZ2xlU3RyZWFtID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgICAgICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcENvbnRlbnQsIEZBTFNFKTsKLSAgICB9IGVsc2UgaWYgKHBDb250ZW50LT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQ29udGVudDsKLSAgICAgICAgbV9uU3RyZWFtcyA9IHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgaWYgKG1fblN0cmVhbXMgPT0gMCkgewotICAgICAgICAgICAgbV9TdGF0dXMgPSBEb25lOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fcFN0cmVhbUFycmF5ID0gRlhfQWxsb2MoQ1BERl9TdHJlYW1BY2MqLCBtX25TdHJlYW1zKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1N0YXR1cyA9IERvbmU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci12b2lkIENQREZfQ29udGVudFBhcnNlcjo6U3RhcnQoQ1BERl9Gb3JtKiBwRm9ybSwgQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgsIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLCBDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMsIGludCBsZXZlbCkKLXsKLSAgICBtX3BUeXBlM0NoYXIgPSBwVHlwZTNDaGFyOwotICAgIG1fcE9iamVjdHMgPSBwRm9ybTsKLSAgICBtX2JGb3JtID0gVFJVRTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IGZvcm1fbWF0cml4ID0gcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXRNYXRyaXgoRlhfQlNUUkMoIk1hdHJpeCIpKTsKLSAgICBpZiAocEdyYXBoaWNTdGF0ZXMpIHsKLSAgICAgICAgZm9ybV9tYXRyaXguQ29uY2F0KHBHcmFwaGljU3RhdGVzLT5tX0NUTSk7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBCQm94ID0gcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQkJveCIpKTsKLSAgICBDRlhfRmxvYXRSZWN0IGZvcm1fYmJveDsKLSAgICBDUERGX1BhdGggQ2xpcFBhdGg7Ci0gICAgaWYgKHBCQm94KSB7Ci0gICAgICAgIGZvcm1fYmJveCA9IHBCQm94LT5HZXRSZWN0KCk7Ci0gICAgICAgIENsaXBQYXRoLk5ldygpOwotICAgICAgICBDbGlwUGF0aC5BcHBlbmRSZWN0KGZvcm1fYmJveC5sZWZ0LCBmb3JtX2Jib3guYm90dG9tLCBmb3JtX2Jib3gucmlnaHQsIGZvcm1fYmJveC50b3ApOwotICAgICAgICBDbGlwUGF0aC5UcmFuc2Zvcm0oJmZvcm1fbWF0cml4KTsKLSAgICAgICAgaWYgKHBQYXJlbnRNYXRyaXgpIHsKLSAgICAgICAgICAgIENsaXBQYXRoLlRyYW5zZm9ybShwUGFyZW50TWF0cml4KTsKLSAgICAgICAgfQotICAgICAgICBmb3JtX2Jib3guVHJhbnNmb3JtKCZmb3JtX21hdHJpeCk7Ci0gICAgICAgIGlmIChwUGFyZW50TWF0cml4KSB7Ci0gICAgICAgICAgICBmb3JtX2Jib3guVHJhbnNmb3JtKHBQYXJlbnRNYXRyaXgpOwotICAgICAgICB9Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcyA9IHBGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiUmVzb3VyY2VzIikpOwotICAgIG1fcFBhcnNlciA9IG5ldyBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoCi0gICAgICAgIHBGb3JtLT5tX3BEb2N1bWVudCwgcEZvcm0tPm1fcFBhZ2VSZXNvdXJjZXMsIHBGb3JtLT5tX3BSZXNvdXJjZXMsCi0gICAgICAgIHBQYXJlbnRNYXRyaXgsIHBGb3JtLCBwUmVzb3VyY2VzLCAmZm9ybV9iYm94LCBwT3B0aW9ucywgcEdyYXBoaWNTdGF0ZXMsCi0gICAgICAgIGxldmVsKTsKLSAgICAKLSAgICBtX3BQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX0NUTSA9IGZvcm1fbWF0cml4OwotICAgIG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fUGFyZW50TWF0cml4ID0gZm9ybV9tYXRyaXg7Ci0gICAgaWYgKENsaXBQYXRoLk5vdE51bGwoKSkgewotICAgICAgICBtX3BQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoQ2xpcFBhdGgsIEZYRklMTF9XSU5ESU5HLCBUUlVFKTsKLSAgICB9Ci0gICAgaWYgKHBGb3JtLT5tX1RyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQKSB7Ci0gICAgICAgIENQREZfR2VuZXJhbFN0YXRlRGF0YSogcERhdGEgPSBtX3BQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX0dlbmVyYWxTdGF0ZS5HZXRNb2RpZnkoKTsKLSAgICAgICAgcERhdGEtPm1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOwotICAgICAgICBwRGF0YS0+bV9TdHJva2VBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHBEYXRhLT5tX0ZpbGxBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHBEYXRhLT5tX3BTb2Z0TWFzayA9IE5VTEw7Ci0gICAgfQordm9pZCBDUERGX0NvbnRlbnRQYXJzZXI6OlN0YXJ0KENQREZfUGFnZSogcFBhZ2UsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucykgeworICBpZiAobV9TdGF0dXMgIT0gUmVhZHkgfHwgcFBhZ2UgPT0gTlVMTCB8fCBwUGFnZS0+bV9wRG9jdW1lbnQgPT0gTlVMTCB8fAorICAgICAgcFBhZ2UtPm1fcEZvcm1EaWN0ID09IE5VTEwpIHsKKyAgICBtX1N0YXR1cyA9IERvbmU7CisgICAgcmV0dXJuOworICB9CisgIG1fcE9iamVjdHMgPSBwUGFnZTsKKyAgbV9iRm9ybSA9IEZBTFNFOworICBpZiAocE9wdGlvbnMpIHsKKyAgICBtX09wdGlvbnMgPSAqcE9wdGlvbnM7CisgIH0KKyAgbV9TdGF0dXMgPSBUb0JlQ29udGludWVkOworICBtX0ludGVybmFsU3RhZ2UgPSBQQUdFUEFSU0VfU1RBR0VfR0VUQ09OVEVOVDsKKyAgbV9DdXJyZW50T2Zmc2V0ID0gMDsKKyAgQ1BERl9PYmplY3QqIHBDb250ZW50ID0KKyAgICAgIHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJDb250ZW50cyIpKTsKKyAgaWYgKHBDb250ZW50ID09IE5VTEwpIHsKKyAgICBtX1N0YXR1cyA9IERvbmU7CisgICAgcmV0dXJuOworICB9CisgIGlmIChwQ29udGVudC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKICAgICBtX25TdHJlYW1zID0gMDsKICAgICBtX3BTaW5nbGVTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgaWYgKHBGb3JtLT5tX3BEb2N1bWVudCkgewotICAgICAgICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBGb3JtLT5tX3BGb3JtU3RyZWFtLCBGQUxTRSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wU2luZ2xlU3RyZWFtLT5Mb2FkQWxsRGF0YShwRm9ybS0+bV9wRm9ybVN0cmVhbSwgRkFMU0UpOworICAgIG1fcFNpbmdsZVN0cmVhbS0+TG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwQ29udGVudCwgRkFMU0UpOworICB9IGVsc2UgaWYgKHBDb250ZW50LT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50OworICAgIG1fblN0cmVhbXMgPSBwQXJyYXktPkdldENvdW50KCk7CisgICAgaWYgKG1fblN0cmVhbXMgPT0gMCkgeworICAgICAgbV9TdGF0dXMgPSBEb25lOworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKW1fcFNpbmdsZVN0cmVhbS0+R2V0RGF0YSgpOwotICAgIG1fU2l6ZSA9IG1fcFNpbmdsZVN0cmVhbS0+R2V0U2l6ZSgpOwotICAgIG1fU3RhdHVzID0gVG9CZUNvbnRpbnVlZDsKLSAgICBtX0ludGVybmFsU3RhZ2UgPSBQQUdFUEFSU0VfU1RBR0VfUEFSU0U7Ci0gICAgbV9DdXJyZW50T2Zmc2V0ID0gMDsKKyAgICBtX3BTdHJlYW1BcnJheSA9IEZYX0FsbG9jKENQREZfU3RyZWFtQWNjKiwgbV9uU3RyZWFtcyk7CisgIH0gZWxzZSB7CisgICAgbV9TdGF0dXMgPSBEb25lOworICAgIHJldHVybjsKKyAgfQogfQotdm9pZCBDUERGX0NvbnRlbnRQYXJzZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGludCBzdGVwcyA9IDA7Ci0gICAgd2hpbGUgKG1fU3RhdHVzID09IFRvQmVDb250aW51ZWQpIHsKLSAgICAgICAgaWYgKG1fSW50ZXJuYWxTdGFnZSA9PSBQQUdFUEFSU0VfU1RBR0VfR0VUQ09OVEVOVCkgewotICAgICAgICAgICAgaWYgKG1fQ3VycmVudE9mZnNldCA9PSBtX25TdHJlYW1zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcFN0cmVhbUFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX25TdHJlYW1zOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplID0gbV9wU3RyZWFtQXJyYXlbaV0tPkdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX1NpemUgKyBzaXplICsgMSA8PSBtX1NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1N0YXR1cyA9IERvbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbV9TaXplICs9IHNpemUgKyAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBtX1NpemUpOwotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBwb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9uU3RyZWFtczsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBwb3MsIG1fcFN0cmVhbUFycmF5W2ldLT5HZXREYXRhKCksIG1fcFN0cmVhbUFycmF5W2ldLT5HZXRTaXplKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IG1fcFN0cmVhbUFycmF5W2ldLT5HZXRTaXplKCkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGF0YVtwb3MgLSAxXSA9ICcgJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtX3BTdHJlYW1BcnJheVtpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKG1fcFN0cmVhbUFycmF5KTsKLSAgICAgICAgICAgICAgICAgICAgbV9wU3RyZWFtQXJyYXkgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcERhdGEgPSAodWludDhfdCopbV9wU2luZ2xlU3RyZWFtLT5HZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1fU2l6ZSA9IG1fcFNpbmdsZVN0cmVhbS0+R2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX0ludGVybmFsU3RhZ2UgPSBQQUdFUEFSU0VfU1RBR0VfUEFSU0U7Ci0gICAgICAgICAgICAgICAgbV9DdXJyZW50T2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcENvbnRlbnQgPSBtX3BPYmplY3RzLT5tX3BGb3JtRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkNvbnRlbnRzIikpOwotICAgICAgICAgICAgICAgIG1fcFN0cmVhbUFycmF5W21fQ3VycmVudE9mZnNldF0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW1PYmogPSAoQ1BERl9TdHJlYW0qKShwQ29udGVudCA/IHBDb250ZW50LT5HZXRFbGVtZW50VmFsdWUobV9DdXJyZW50T2Zmc2V0KSA6IE5VTEwpOwotICAgICAgICAgICAgICAgIG1fcFN0cmVhbUFycmF5W21fQ3VycmVudE9mZnNldF0tPkxvYWRBbGxEYXRhKHBTdHJlYW1PYmosIEZBTFNFKTsKLSAgICAgICAgICAgICAgICBtX0N1cnJlbnRPZmZzZXQgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fSW50ZXJuYWxTdGFnZSA9PSBQQUdFUEFSU0VfU1RBR0VfUEFSU0UpIHsKLSAgICAgICAgICAgIGlmICghbV9wUGFyc2VyKSB7Ci0gICAgICAgICAgICAgICAgbV9wUGFyc2VyID0gbmV3IENQREZfU3RyZWFtQ29udGVudFBhcnNlcigKLSAgICAgICAgICAgICAgICAgICAgbV9wT2JqZWN0cy0+bV9wRG9jdW1lbnQsIG1fcE9iamVjdHMtPm1fcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIsIG1fcE9iamVjdHMsIG1fcE9iamVjdHMtPm1fcFJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgJm1fcE9iamVjdHMtPm1fQkJveCwgJm1fT3B0aW9ucywgbnVsbHB0ciwgMCk7Ci0gICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9Db2xvclN0YXRlLkdldE1vZGlmeSgpLT5EZWZhdWx0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9DdXJyZW50T2Zmc2V0ID49IG1fU2l6ZSkgewotICAgICAgICAgICAgICAgIG1fSW50ZXJuYWxTdGFnZSA9IFBBR0VQQVJTRV9TVEFHRV9DSEVDS0NMSVA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fQ3VycmVudE9mZnNldCArPSBtX3BQYXJzZXItPlBhcnNlKG1fcERhdGEgKyBtX0N1cnJlbnRPZmZzZXQsIG1fU2l6ZSAtIG1fQ3VycmVudE9mZnNldCwgUEFSU0VfU1RFUF9MSU1JVCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcFBhcnNlci0+U2hvdWxkQWJvcnQoKSkgewotICAgICAgICAgICAgICAgICAgICBtX0ludGVybmFsU3RhZ2UgPSBQQUdFUEFSU0VfU1RBR0VfQ0hFQ0tDTElQOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fSW50ZXJuYWxTdGFnZSA9PSBQQUdFUEFSU0VfU1RBR0VfQ0hFQ0tDTElQKSB7Ci0gICAgICAgICAgICBpZiAobV9wVHlwZTNDaGFyKSB7Ci0gICAgICAgICAgICAgICAgbV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkID0gbV9wUGFyc2VyLT5Jc0NvbG9yZWQoKTsKLSAgICAgICAgICAgICAgICBtX3BUeXBlM0NoYXItPm1fV2lkdGggPSBGWFNZU19yb3VuZChtX3BQYXJzZXItPkdldFR5cGUzRGF0YSgpWzBdICogMTAwMCk7Ci0gICAgICAgICAgICAgICAgbV9wVHlwZTNDaGFyLT5tX0JCb3gubGVmdCA9IEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+R2V0VHlwZTNEYXRhKClbMl0gKiAxMDAwKTsKLSAgICAgICAgICAgICAgICBtX3BUeXBlM0NoYXItPm1fQkJveC5ib3R0b20gPSBGWFNZU19yb3VuZChtX3BQYXJzZXItPkdldFR5cGUzRGF0YSgpWzNdICogMTAwMCk7Ci0gICAgICAgICAgICAgICAgbV9wVHlwZTNDaGFyLT5tX0JCb3gucmlnaHQgPSBGWFNZU19yb3VuZChtX3BQYXJzZXItPkdldFR5cGUzRGF0YSgpWzRdICogMTAwMCk7Ci0gICAgICAgICAgICAgICAgbV9wVHlwZTNDaGFyLT5tX0JCb3gudG9wID0gRlhTWVNfcm91bmQobV9wUGFyc2VyLT5HZXRUeXBlM0RhdGEoKVs1XSAqIDEwMDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gbV9wT2JqZWN0cy0+bV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOwotICAgICAgICAgICAgd2hpbGUgKHBvcykgewotICAgICAgICAgICAgICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IChDUERGX1BhZ2VPYmplY3QqKW1fcE9iamVjdHMtPm1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBPYmotPm1fQ2xpcFBhdGguSXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwT2JqLT5tX0NsaXBQYXRoLkdldFBhdGhDb3VudCgpICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwT2JqLT5tX0NsaXBQYXRoLkdldFRleHRDb3VudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDUERGX1BhdGggQ2xpcFBhdGggPSBwT2JqLT5tX0NsaXBQYXRoLkdldFBhdGgoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFDbGlwUGF0aC5Jc1JlY3QoKSB8fCBwT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9TSEFESU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0IG9sZF9yZWN0KENsaXBQYXRoLkdldFBvaW50WCgwKSwgQ2xpcFBhdGguR2V0UG9pbnRZKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFBhdGguR2V0UG9pbnRYKDIpLCBDbGlwUGF0aC5HZXRQb2ludFkoMikpOwotICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3Qgb2JqX3JlY3QocE9iai0+bV9MZWZ0LCBwT2JqLT5tX0JvdHRvbSwgcE9iai0+bV9SaWdodCwgcE9iai0+bV9Ub3ApOwotICAgICAgICAgICAgICAgIGlmIChvbGRfcmVjdC5Db250YWlucyhvYmpfcmVjdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcE9iai0+bV9DbGlwUGF0aC5TZXROdWxsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9TdGF0dXMgPSBEb25lOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0ZXBzICsrOwotICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KK3ZvaWQgQ1BERl9Db250ZW50UGFyc2VyOjpTdGFydChDUERGX0Zvcm0qIHBGb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQWxsU3RhdGVzKiBwR3JhcGhpY1N0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwUGFyZW50TWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpIHsKKyAgbV9wVHlwZTNDaGFyID0gcFR5cGUzQ2hhcjsKKyAgbV9wT2JqZWN0cyA9IHBGb3JtOworICBtX2JGb3JtID0gVFJVRTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBmb3JtX21hdHJpeCA9CisgICAgICBwRm9ybS0+bV9wRm9ybURpY3QtPkdldE1hdHJpeChGWF9CU1RSQygiTWF0cml4IikpOworICBpZiAocEdyYXBoaWNTdGF0ZXMpIHsKKyAgICBmb3JtX21hdHJpeC5Db25jYXQocEdyYXBoaWNTdGF0ZXMtPm1fQ1RNKTsKKyAgfQorICBDUERGX0FycmF5KiBwQkJveCA9IHBGb3JtLT5tX3BGb3JtRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkJCb3giKSk7CisgIENGWF9GbG9hdFJlY3QgZm9ybV9iYm94OworICBDUERGX1BhdGggQ2xpcFBhdGg7CisgIGlmIChwQkJveCkgeworICAgIGZvcm1fYmJveCA9IHBCQm94LT5HZXRSZWN0KCk7CisgICAgQ2xpcFBhdGguTmV3KCk7CisgICAgQ2xpcFBhdGguQXBwZW5kUmVjdChmb3JtX2Jib3gubGVmdCwgZm9ybV9iYm94LmJvdHRvbSwgZm9ybV9iYm94LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybV9iYm94LnRvcCk7CisgICAgQ2xpcFBhdGguVHJhbnNmb3JtKCZmb3JtX21hdHJpeCk7CisgICAgaWYgKHBQYXJlbnRNYXRyaXgpIHsKKyAgICAgIENsaXBQYXRoLlRyYW5zZm9ybShwUGFyZW50TWF0cml4KTsKICAgICB9CisgICAgZm9ybV9iYm94LlRyYW5zZm9ybSgmZm9ybV9tYXRyaXgpOworICAgIGlmIChwUGFyZW50TWF0cml4KSB7CisgICAgICBmb3JtX2Jib3guVHJhbnNmb3JtKHBQYXJlbnRNYXRyaXgpOworICAgIH0KKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMgPQorICAgICAgcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7CisgIG1fcFBhcnNlciA9IG5ldyBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoCisgICAgICBwRm9ybS0+bV9wRG9jdW1lbnQsIHBGb3JtLT5tX3BQYWdlUmVzb3VyY2VzLCBwRm9ybS0+bV9wUmVzb3VyY2VzLAorICAgICAgcFBhcmVudE1hdHJpeCwgcEZvcm0sIHBSZXNvdXJjZXMsICZmb3JtX2Jib3gsIHBPcHRpb25zLCBwR3JhcGhpY1N0YXRlcywKKyAgICAgIGxldmVsKTsKKworICBtX3BQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX0NUTSA9IGZvcm1fbWF0cml4OworICBtX3BQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX1BhcmVudE1hdHJpeCA9IGZvcm1fbWF0cml4OworICBpZiAoQ2xpcFBhdGguTm90TnVsbCgpKSB7CisgICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKENsaXBQYXRoLCBGWEZJTExfV0lORElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisgIH0KKyAgaWYgKHBGb3JtLT5tX1RyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQKSB7CisgICAgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwRGF0YSA9CisgICAgICAgIG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpOworICAgIHBEYXRhLT5tX0JsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTDsKKyAgICBwRGF0YS0+bV9TdHJva2VBbHBoYSA9IDEuMGY7CisgICAgcERhdGEtPm1fRmlsbEFscGhhID0gMS4wZjsKKyAgICBwRGF0YS0+bV9wU29mdE1hc2sgPSBOVUxMOworICB9CisgIG1fblN0cmVhbXMgPSAwOworICBtX3BTaW5nbGVTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7CisgIGlmIChwRm9ybS0+bV9wRG9jdW1lbnQpIHsKKyAgICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBGb3JtLT5tX3BGb3JtU3RyZWFtLCBGQUxTRSk7CisgIH0gZWxzZSB7CisgICAgbV9wU2luZ2xlU3RyZWFtLT5Mb2FkQWxsRGF0YShwRm9ybS0+bV9wRm9ybVN0cmVhbSwgRkFMU0UpOworICB9CisgIG1fcERhdGEgPSAodWludDhfdCopbV9wU2luZ2xlU3RyZWFtLT5HZXREYXRhKCk7CisgIG1fU2l6ZSA9IG1fcFNpbmdsZVN0cmVhbS0+R2V0U2l6ZSgpOworICBtX1N0YXR1cyA9IFRvQmVDb250aW51ZWQ7CisgIG1fSW50ZXJuYWxTdGFnZSA9IFBBR0VQQVJTRV9TVEFHRV9QQVJTRTsKKyAgbV9DdXJyZW50T2Zmc2V0ID0gMDsKK30KK3ZvaWQgQ1BERl9Db250ZW50UGFyc2VyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpbnQgc3RlcHMgPSAwOworICB3aGlsZSAobV9TdGF0dXMgPT0gVG9CZUNvbnRpbnVlZCkgeworICAgIGlmIChtX0ludGVybmFsU3RhZ2UgPT0gUEFHRVBBUlNFX1NUQUdFX0dFVENPTlRFTlQpIHsKKyAgICAgIGlmIChtX0N1cnJlbnRPZmZzZXQgPT0gbV9uU3RyZWFtcykgeworICAgICAgICBpZiAobV9wU3RyZWFtQXJyYXkpIHsKKyAgICAgICAgICBtX1NpemUgPSAwOworICAgICAgICAgIEZYX0RXT1JEIGk7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fblN0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IG1fcFN0cmVhbUFycmF5W2ldLT5HZXRTaXplKCk7CisgICAgICAgICAgICBpZiAobV9TaXplICsgc2l6ZSArIDEgPD0gbV9TaXplKSB7CisgICAgICAgICAgICAgIG1fU3RhdHVzID0gRG9uZTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9TaXplICs9IHNpemUgKyAxOworICAgICAgICAgIH0KKyAgICAgICAgICBtX3BEYXRhID0gRlhfQWxsb2ModWludDhfdCwgbV9TaXplKTsKKyAgICAgICAgICBGWF9EV09SRCBwb3MgPSAwOworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX25TdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIEZYU1lTX21lbWNweShtX3BEYXRhICsgcG9zLCBtX3BTdHJlYW1BcnJheVtpXS0+R2V0RGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0cmVhbUFycmF5W2ldLT5HZXRTaXplKCkpOworICAgICAgICAgICAgcG9zICs9IG1fcFN0cmVhbUFycmF5W2ldLT5HZXRTaXplKCkgKyAxOworICAgICAgICAgICAgbV9wRGF0YVtwb3MgLSAxXSA9ICcgJzsKKyAgICAgICAgICAgIGRlbGV0ZSBtX3BTdHJlYW1BcnJheVtpXTsKKyAgICAgICAgICB9CisgICAgICAgICAgRlhfRnJlZShtX3BTdHJlYW1BcnJheSk7CisgICAgICAgICAgbV9wU3RyZWFtQXJyYXkgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fcERhdGEgPSAodWludDhfdCopbV9wU2luZ2xlU3RyZWFtLT5HZXREYXRhKCk7CisgICAgICAgICAgbV9TaXplID0gbV9wU2luZ2xlU3RyZWFtLT5HZXRTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbV9JbnRlcm5hbFN0YWdlID0gUEFHRVBBUlNFX1NUQUdFX1BBUlNFOworICAgICAgICBtX0N1cnJlbnRPZmZzZXQgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1BERl9BcnJheSogcENvbnRlbnQgPQorICAgICAgICAgICAgbV9wT2JqZWN0cy0+bV9wRm9ybURpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJDb250ZW50cyIpKTsKKyAgICAgICAgbV9wU3RyZWFtQXJyYXlbbV9DdXJyZW50T2Zmc2V0XSA9IG5ldyBDUERGX1N0cmVhbUFjYzsKKyAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW1PYmogPQorICAgICAgICAgICAgKENQREZfU3RyZWFtKikocENvbnRlbnQgPyBwQ29udGVudC0+R2V0RWxlbWVudFZhbHVlKG1fQ3VycmVudE9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCk7CisgICAgICAgIG1fcFN0cmVhbUFycmF5W21fQ3VycmVudE9mZnNldF0tPkxvYWRBbGxEYXRhKHBTdHJlYW1PYmosIEZBTFNFKTsKKyAgICAgICAgbV9DdXJyZW50T2Zmc2V0Kys7CisgICAgICB9CisgICAgfQorICAgIGlmIChtX0ludGVybmFsU3RhZ2UgPT0gUEFHRVBBUlNFX1NUQUdFX1BBUlNFKSB7CisgICAgICBpZiAoIW1fcFBhcnNlcikgeworICAgICAgICBtX3BQYXJzZXIgPSBuZXcgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyKAorICAgICAgICAgICAgbV9wT2JqZWN0cy0+bV9wRG9jdW1lbnQsIG1fcE9iamVjdHMtPm1fcFBhZ2VSZXNvdXJjZXMsIG51bGxwdHIsCisgICAgICAgICAgICBudWxscHRyLCBtX3BPYmplY3RzLCBtX3BPYmplY3RzLT5tX3BSZXNvdXJjZXMsICZtX3BPYmplY3RzLT5tX0JCb3gsCisgICAgICAgICAgICAmbV9PcHRpb25zLCBudWxscHRyLCAwKTsKKyAgICAgICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9Db2xvclN0YXRlLkdldE1vZGlmeSgpLT5EZWZhdWx0KCk7CisgICAgICB9CisgICAgICBpZiAobV9DdXJyZW50T2Zmc2V0ID49IG1fU2l6ZSkgeworICAgICAgICBtX0ludGVybmFsU3RhZ2UgPSBQQUdFUEFSU0VfU1RBR0VfQ0hFQ0tDTElQOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9DdXJyZW50T2Zmc2V0ICs9CisgICAgICAgICAgICBtX3BQYXJzZXItPlBhcnNlKG1fcERhdGEgKyBtX0N1cnJlbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2l6ZSAtIG1fQ3VycmVudE9mZnNldCwgUEFSU0VfU1RFUF9MSU1JVCk7CisgICAgICAgIGlmIChtX3BQYXJzZXItPlNob3VsZEFib3J0KCkpIHsKKyAgICAgICAgICBtX0ludGVybmFsU3RhZ2UgPSBQQUdFUEFSU0VfU1RBR0VfQ0hFQ0tDTElQOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChtX0ludGVybmFsU3RhZ2UgPT0gUEFHRVBBUlNFX1NUQUdFX0NIRUNLQ0xJUCkgeworICAgICAgaWYgKG1fcFR5cGUzQ2hhcikgeworICAgICAgICBtX3BUeXBlM0NoYXItPm1fYkNvbG9yZWQgPSBtX3BQYXJzZXItPklzQ29sb3JlZCgpOworICAgICAgICBtX3BUeXBlM0NoYXItPm1fV2lkdGggPQorICAgICAgICAgICAgRlhTWVNfcm91bmQobV9wUGFyc2VyLT5HZXRUeXBlM0RhdGEoKVswXSAqIDEwMDApOworICAgICAgICBtX3BUeXBlM0NoYXItPm1fQkJveC5sZWZ0ID0KKyAgICAgICAgICAgIEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+R2V0VHlwZTNEYXRhKClbMl0gKiAxMDAwKTsKKyAgICAgICAgbV9wVHlwZTNDaGFyLT5tX0JCb3guYm90dG9tID0KKyAgICAgICAgICAgIEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+R2V0VHlwZTNEYXRhKClbM10gKiAxMDAwKTsKKyAgICAgICAgbV9wVHlwZTNDaGFyLT5tX0JCb3gucmlnaHQgPQorICAgICAgICAgICAgRlhTWVNfcm91bmQobV9wUGFyc2VyLT5HZXRUeXBlM0RhdGEoKVs0XSAqIDEwMDApOworICAgICAgICBtX3BUeXBlM0NoYXItPm1fQkJveC50b3AgPQorICAgICAgICAgICAgRlhTWVNfcm91bmQobV9wUGFyc2VyLT5HZXRUeXBlM0RhdGEoKVs1XSAqIDEwMDApOworICAgICAgfQorICAgICAgRlhfUE9TSVRJT04gcG9zID0gbV9wT2JqZWN0cy0+bV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOworICAgICAgd2hpbGUgKHBvcykgeworICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPQorICAgICAgICAgICAgKENQREZfUGFnZU9iamVjdCopbV9wT2JqZWN0cy0+bV9PYmplY3RMaXN0LkdldE5leHQocG9zKTsKKyAgICAgICAgaWYgKHBPYmotPm1fQ2xpcFBhdGguSXNOdWxsKCkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocE9iai0+bV9DbGlwUGF0aC5HZXRQYXRoQ291bnQoKSAhPSAxKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBPYmotPm1fQ2xpcFBhdGguR2V0VGV4dENvdW50KCkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDUERGX1BhdGggQ2xpcFBhdGggPSBwT2JqLT5tX0NsaXBQYXRoLkdldFBhdGgoMCk7CisgICAgICAgIGlmICghQ2xpcFBhdGguSXNSZWN0KCkgfHwgcE9iai0+bV9UeXBlID09IFBERlBBR0VfU0hBRElORykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIENGWF9GbG9hdFJlY3Qgb2xkX3JlY3QoQ2xpcFBhdGguR2V0UG9pbnRYKDApLCBDbGlwUGF0aC5HZXRQb2ludFkoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFBhdGguR2V0UG9pbnRYKDIpLCBDbGlwUGF0aC5HZXRQb2ludFkoMikpOworICAgICAgICBDRlhfRmxvYXRSZWN0IG9ial9yZWN0KHBPYmotPm1fTGVmdCwgcE9iai0+bV9Cb3R0b20sIHBPYmotPm1fUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iai0+bV9Ub3ApOworICAgICAgICBpZiAob2xkX3JlY3QuQ29udGFpbnMob2JqX3JlY3QpKSB7CisgICAgICAgICAgcE9iai0+bV9DbGlwUGF0aC5TZXROdWxsKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1fU3RhdHVzID0gRG9uZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RlcHMrKzsKKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0aC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0aC5jcHAKaW5kZXggOTBhNTA4ZS4uODFiNjliYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhdGguY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXRoLmNwcApAQCAtOCw0NSArOCw0MSBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKICNpbmNsdWRlICJwYWdlaW50LmgiCi12b2lkIENQREZfUGF0aE9iamVjdDo6Q29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjKQotewotICAgIGNvbnN0IENQREZfUGF0aE9iamVjdCogcFNyY09iaiA9IChjb25zdCBDUERGX1BhdGhPYmplY3QqKXBTcmM7Ci0gICAgbV9QYXRoID0gcFNyY09iai0+bV9QYXRoOwotICAgIG1fRmlsbFR5cGUgPSBwU3JjT2JqLT5tX0ZpbGxUeXBlOwotICAgIG1fYlN0cm9rZSA9IHBTcmNPYmotPm1fYlN0cm9rZTsKLSAgICBtX01hdHJpeCA9IHBTcmNPYmotPm1fTWF0cml4Owordm9pZCBDUERGX1BhdGhPYmplY3Q6OkNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykgeworICBjb25zdCBDUERGX1BhdGhPYmplY3QqIHBTcmNPYmogPSAoY29uc3QgQ1BERl9QYXRoT2JqZWN0KilwU3JjOworICBtX1BhdGggPSBwU3JjT2JqLT5tX1BhdGg7CisgIG1fRmlsbFR5cGUgPSBwU3JjT2JqLT5tX0ZpbGxUeXBlOworICBtX2JTdHJva2UgPSBwU3JjT2JqLT5tX2JTdHJva2U7CisgIG1fTWF0cml4ID0gcFNyY09iai0+bV9NYXRyaXg7CiB9Ci12b2lkIENQREZfUGF0aE9iamVjdDo6VHJhbnNmb3JtKGNvbnN0IENQREZfTWF0cml4JiBtYXRyaXgpCi17Ci0gICAgbV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7Ci0gICAgQ2FsY0JvdW5kaW5nQm94KCk7Cit2b2lkIENQREZfUGF0aE9iamVjdDo6VHJhbnNmb3JtKGNvbnN0IENQREZfTWF0cml4JiBtYXRyaXgpIHsKKyAgbV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7CisgIENhbGNCb3VuZGluZ0JveCgpOwogfQotdm9pZCBDUERGX1BhdGhPYmplY3Q6OlNldEdyYXBoU3RhdGUoQ1BERl9HcmFwaFN0YXRlIEdyYXBoU3RhdGUpCi17Ci0gICAgbV9HcmFwaFN0YXRlID0gR3JhcGhTdGF0ZTsKLSAgICBDYWxjQm91bmRpbmdCb3goKTsKK3ZvaWQgQ1BERl9QYXRoT2JqZWN0OjpTZXRHcmFwaFN0YXRlKENQREZfR3JhcGhTdGF0ZSBHcmFwaFN0YXRlKSB7CisgIG1fR3JhcGhTdGF0ZSA9IEdyYXBoU3RhdGU7CisgIENhbGNCb3VuZGluZ0JveCgpOwogfQotdm9pZCBDUERGX1BhdGhPYmplY3Q6OkNhbGNCb3VuZGluZ0JveCgpCi17Ci0gICAgaWYgKG1fUGF0aC5Jc051bGwoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmVjdDsKLSAgICBGWF9GTE9BVCB3aWR0aCA9IG1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKS0+bV9MaW5lV2lkdGg7Ci0gICAgaWYgKG1fYlN0cm9rZSAmJiB3aWR0aCAhPSAwKSB7Ci0gICAgICAgIHJlY3QgPSBtX1BhdGguR2V0Qm91bmRpbmdCb3god2lkdGgsIG1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKS0+bV9NaXRlckxpbWl0KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZWN0ID0gbV9QYXRoLkdldEJvdW5kaW5nQm94KCk7Ci0gICAgfQotICAgIHJlY3QuVHJhbnNmb3JtKCZtX01hdHJpeCk7Ci0gICAgaWYgKHdpZHRoID09IDAgJiYgbV9iU3Ryb2tlKSB7Ci0gICAgICAgIHJlY3QubGVmdCArPSAtMC41ZjsKLSAgICAgICAgcmVjdC5yaWdodCArPSAwLjVmOwotICAgICAgICByZWN0LmJvdHRvbSArPSAtMC41ZjsKLSAgICAgICAgcmVjdC50b3AgKz0gMC41ZjsKLSAgICB9Ci0gICAgbV9MZWZ0ID0gcmVjdC5sZWZ0OwotICAgIG1fUmlnaHQgPSByZWN0LnJpZ2h0OwotICAgIG1fVG9wID0gcmVjdC50b3A7Ci0gICAgbV9Cb3R0b20gPSByZWN0LmJvdHRvbTsKK3ZvaWQgQ1BERl9QYXRoT2JqZWN0OjpDYWxjQm91bmRpbmdCb3goKSB7CisgIGlmIChtX1BhdGguSXNOdWxsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICBGWF9GTE9BVCB3aWR0aCA9IG1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKS0+bV9MaW5lV2lkdGg7CisgIGlmIChtX2JTdHJva2UgJiYgd2lkdGggIT0gMCkgeworICAgIHJlY3QgPSBtX1BhdGguR2V0Qm91bmRpbmdCb3god2lkdGgsIG1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKS0+bV9NaXRlckxpbWl0KTsKKyAgfSBlbHNlIHsKKyAgICByZWN0ID0gbV9QYXRoLkdldEJvdW5kaW5nQm94KCk7CisgIH0KKyAgcmVjdC5UcmFuc2Zvcm0oJm1fTWF0cml4KTsKKyAgaWYgKHdpZHRoID09IDAgJiYgbV9iU3Ryb2tlKSB7CisgICAgcmVjdC5sZWZ0ICs9IC0wLjVmOworICAgIHJlY3QucmlnaHQgKz0gMC41ZjsKKyAgICByZWN0LmJvdHRvbSArPSAtMC41ZjsKKyAgICByZWN0LnRvcCArPSAwLjVmOworICB9CisgIG1fTGVmdCA9IHJlY3QubGVmdDsKKyAgbV9SaWdodCA9IHJlY3QucmlnaHQ7CisgIG1fVG9wID0gcmVjdC50b3A7CisgIG1fQm90dG9tID0gcmVjdC5ib3R0b207CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0dGVybi5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0dGVybi5jcHAKaW5kZXggNDhiM2E0MC4uM2Y5MTVhNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhdHRlcm4uY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXR0ZXJuLmNwcApAQCAtNywyODMgKzcsMjk0IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgogI2luY2x1ZGUgInBhZ2VpbnQuaCIKIAotQ1BERl9QYXR0ZXJuOjpDUERGX1BhdHRlcm4oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFBhcmVudE1hdHJpeCkgOgotICAgIG1fcFBhdHRlcm5PYmooTlVMTCksIG1fUGF0dGVyblR5cGUoUEFUVEVSTl9USUxJTkcpLCBtX3BEb2N1bWVudChOVUxMKSwgbV9iRm9yY2VDbGVhcihGQUxTRSkKLXsKLSAgICBpZiAocFBhcmVudE1hdHJpeCkgewotICAgICAgICBtX1BhcmVudE1hdHJpeCA9ICpwUGFyZW50TWF0cml4OwotICAgIH0KK0NQREZfUGF0dGVybjo6Q1BERl9QYXR0ZXJuKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgpCisgICAgOiBtX3BQYXR0ZXJuT2JqKE5VTEwpLAorICAgICAgbV9QYXR0ZXJuVHlwZShQQVRURVJOX1RJTElORyksCisgICAgICBtX3BEb2N1bWVudChOVUxMKSwKKyAgICAgIG1fYkZvcmNlQ2xlYXIoRkFMU0UpIHsKKyAgaWYgKHBQYXJlbnRNYXRyaXgpIHsKKyAgICBtX1BhcmVudE1hdHJpeCA9ICpwUGFyZW50TWF0cml4OworICB9CiB9Ci1DUERGX1BhdHRlcm46On5DUERGX1BhdHRlcm4oKQoteworQ1BERl9QYXR0ZXJuOjp+Q1BERl9QYXR0ZXJuKCkge30KK0NQREZfVGlsaW5nUGF0dGVybjo6Q1BERl9UaWxpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFBhdHRlcm5PYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwYXJlbnRNYXRyaXgpCisgICAgOiBDUERGX1BhdHRlcm4ocGFyZW50TWF0cml4KSB7CisgIG1fUGF0dGVyblR5cGUgPSBQQVRURVJOX1RJTElORzsKKyAgbV9wUGF0dGVybk9iaiA9IHBQYXR0ZXJuT2JqOworICBtX3BEb2N1bWVudCA9IHBEb2M7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQYXR0ZXJuT2JqLT5HZXREaWN0KCk7CisgIEFTU0VSVChwRGljdCAhPSBOVUxMKTsKKyAgbV9QYXR0ZXJuMkZvcm0gPSBwRGljdC0+R2V0TWF0cml4KEZYX0JTVFJDKCJNYXRyaXgiKSk7CisgIG1fYkNvbG9yZWQgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUGFpbnRUeXBlIikpID09IDE7CisgIGlmIChwYXJlbnRNYXRyaXgpIHsKKyAgICBtX1BhdHRlcm4yRm9ybS5Db25jYXQoKnBhcmVudE1hdHJpeCk7CisgIH0KKyAgbV9wRm9ybSA9IE5VTEw7CiB9Ci1DUERGX1RpbGluZ1BhdHRlcm46OkNQREZfVGlsaW5nUGF0dGVybihDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX09iamVjdCogcFBhdHRlcm5PYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBhcmVudE1hdHJpeCkgOgotICAgIENQREZfUGF0dGVybihwYXJlbnRNYXRyaXgpCi17Ci0gICAgbV9QYXR0ZXJuVHlwZSA9IFBBVFRFUk5fVElMSU5HOwotICAgIG1fcFBhdHRlcm5PYmogPSBwUGF0dGVybk9iajsKLSAgICBtX3BEb2N1bWVudCA9IHBEb2M7CitDUERGX1RpbGluZ1BhdHRlcm46On5DUERGX1RpbGluZ1BhdHRlcm4oKSB7CisgIGRlbGV0ZSBtX3BGb3JtOworICBtX3BGb3JtID0gTlVMTDsKK30KK0ZYX0JPT0wgQ1BERl9UaWxpbmdQYXR0ZXJuOjpMb2FkKCkgeworICBpZiAobV9wRm9ybSAhPSBOVUxMKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBhdHRlcm5PYmotPkdldERpY3QoKTsKKyAgaWYgKHBEaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9iQ29sb3JlZCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQYWludFR5cGUiKSkgPT0gMTsKKyAgbV9YU3RlcCA9IChGWF9GTE9BVClGWFNZU19mYWJzKHBEaWN0LT5HZXROdW1iZXIoRlhfQlNUUkMoIlhTdGVwIikpKTsKKyAgbV9ZU3RlcCA9IChGWF9GTE9BVClGWFNZU19mYWJzKHBEaWN0LT5HZXROdW1iZXIoRlhfQlNUUkMoIllTdGVwIikpKTsKKyAgaWYgKG1fcFBhdHRlcm5PYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKiltX3BQYXR0ZXJuT2JqOworICBtX3BGb3JtID0gbmV3IENQREZfRm9ybShtX3BEb2N1bWVudCwgTlVMTCwgcFN0cmVhbSk7CisgIG1fcEZvcm0tPlBhcnNlQ29udGVudChOVUxMLCAmbV9QYXJlbnRNYXRyaXgsIE5VTEwsIE5VTEwpOworICBtX0JCb3ggPSBwRGljdC0+R2V0UmVjdChGWF9CU1RSQygiQkJveCIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitDUERGX1NoYWRpbmdQYXR0ZXJuOjpDUERGX1NoYWRpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hhZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KQorICAgIDogQ1BERl9QYXR0ZXJuKHBhcmVudE1hdHJpeCkgeworICBtX1BhdHRlcm5UeXBlID0gUEFUVEVSTl9TSEFESU5HOworICBtX3BQYXR0ZXJuT2JqID0gYlNoYWRpbmcgPyBOVUxMIDogcFBhdHRlcm5PYmo7CisgIG1fcERvY3VtZW50ID0gcERvYzsKKyAgbV9iU2hhZGluZ09iaiA9IGJTaGFkaW5nOworICBpZiAoIWJTaGFkaW5nKSB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBhdHRlcm5PYmotPkdldERpY3QoKTsKICAgICBBU1NFUlQocERpY3QgIT0gTlVMTCk7CiAgICAgbV9QYXR0ZXJuMkZvcm0gPSBwRGljdC0+R2V0TWF0cml4KEZYX0JTVFJDKCJNYXRyaXgiKSk7Ci0gICAgbV9iQ29sb3JlZCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQYWludFR5cGUiKSkgPT0gMTsKKyAgICBtX3BTaGFkaW5nT2JqID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiU2hhZGluZyIpKTsKICAgICBpZiAocGFyZW50TWF0cml4KSB7Ci0gICAgICAgIG1fUGF0dGVybjJGb3JtLkNvbmNhdCgqcGFyZW50TWF0cml4KTsKKyAgICAgIG1fUGF0dGVybjJGb3JtLkNvbmNhdCgqcGFyZW50TWF0cml4KTsKICAgICB9Ci0gICAgbV9wRm9ybSA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgbV9wU2hhZGluZ09iaiA9IHBQYXR0ZXJuT2JqOworICB9CisgIG1fU2hhZGluZ1R5cGUgPSAwOworICBtX3BDUyA9IE5VTEw7CisgIG1fbkZ1bmNzID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBtX3BGdW5jdGlvbnNbaV0gPSBOVUxMOworICB9CisgIG1fcENvdW50ZWRDUyA9IE5VTEw7CiB9Ci1DUERGX1RpbGluZ1BhdHRlcm46On5DUERGX1RpbGluZ1BhdHRlcm4oKQotewotICAgIGRlbGV0ZSBtX3BGb3JtOwotICAgIG1fcEZvcm0gPSBOVUxMOworQ1BERl9TaGFkaW5nUGF0dGVybjo6fkNQREZfU2hhZGluZ1BhdHRlcm4oKSB7CisgIENsZWFyKCk7CiB9Ci1GWF9CT09MIENQREZfVGlsaW5nUGF0dGVybjo6TG9hZCgpCi17Ci0gICAgaWYgKG1fcEZvcm0gIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBhdHRlcm5PYmotPkdldERpY3QoKTsKLSAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fYkNvbG9yZWQgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUGFpbnRUeXBlIikpID09IDE7Ci0gICAgbV9YU3RlcCA9IChGWF9GTE9BVClGWFNZU19mYWJzKHBEaWN0LT5HZXROdW1iZXIoRlhfQlNUUkMoIlhTdGVwIikpKTsKLSAgICBtX1lTdGVwID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMocERpY3QtPkdldE51bWJlcihGWF9CU1RSQygiWVN0ZXAiKSkpOwotICAgIGlmIChtX3BQYXR0ZXJuT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKiltX3BQYXR0ZXJuT2JqOwotICAgIG1fcEZvcm0gPSBuZXcgQ1BERl9Gb3JtKG1fcERvY3VtZW50LCBOVUxMLCBwU3RyZWFtKTsKLSAgICBtX3BGb3JtLT5QYXJzZUNvbnRlbnQoTlVMTCwgJm1fUGFyZW50TWF0cml4LCBOVUxMLCBOVUxMKTsKLSAgICBtX0JCb3ggPSBwRGljdC0+R2V0UmVjdChGWF9CU1RSQygiQkJveCIpKTsKK3ZvaWQgQ1BERl9TaGFkaW5nUGF0dGVybjo6Q2xlYXIoKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uRnVuY3M7IGkrKykgeworICAgIGRlbGV0ZSBtX3BGdW5jdGlvbnNbaV07CisgICAgbV9wRnVuY3Rpb25zW2ldID0gTlVMTDsKKyAgfQorICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IG1fcENvdW50ZWRDUyA/IG1fcENvdW50ZWRDUy0+Z2V0KCkgOiBOVUxMOworICBpZiAocENTICYmIG1fcERvY3VtZW50KSB7CisgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7CisgIH0KKyAgbV9TaGFkaW5nVHlwZSA9IDA7CisgIG1fcENTID0gTlVMTDsKKyAgbV9wQ291bnRlZENTID0gTlVMTDsKKyAgbV9uRnVuY3MgPSAwOworfQorRlhfQk9PTCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpMb2FkKCkgeworICBpZiAobV9TaGFkaW5nVHlwZSAhPSAwKSB7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci1DUERGX1NoYWRpbmdQYXR0ZXJuOjpDUERGX1NoYWRpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KSA6IENQREZfUGF0dGVybihwYXJlbnRNYXRyaXgpCi17Ci0gICAgbV9QYXR0ZXJuVHlwZSA9IFBBVFRFUk5fU0hBRElORzsKLSAgICBtX3BQYXR0ZXJuT2JqID0gYlNoYWRpbmcgPyBOVUxMIDogcFBhdHRlcm5PYmo7Ci0gICAgbV9wRG9jdW1lbnQgPSBwRG9jOwotICAgIG1fYlNoYWRpbmdPYmogPSBiU2hhZGluZzsKLSAgICBpZiAoIWJTaGFkaW5nKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQYXR0ZXJuT2JqLT5HZXREaWN0KCk7Ci0gICAgICAgIEFTU0VSVChwRGljdCAhPSBOVUxMKTsKLSAgICAgICAgbV9QYXR0ZXJuMkZvcm0gPSBwRGljdC0+R2V0TWF0cml4KEZYX0JTVFJDKCJNYXRyaXgiKSk7Ci0gICAgICAgIG1fcFNoYWRpbmdPYmogPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJTaGFkaW5nIikpOwotICAgICAgICBpZiAocGFyZW50TWF0cml4KSB7Ci0gICAgICAgICAgICBtX1BhdHRlcm4yRm9ybS5Db25jYXQoKnBhcmVudE1hdHJpeCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX3BTaGFkaW5nT2JqID0gcFBhdHRlcm5PYmo7Ci0gICAgfQotICAgIG1fU2hhZGluZ1R5cGUgPSAwOwotICAgIG1fcENTID0gTlVMTDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBTaGFkaW5nRGljdCA9CisgICAgICBtX3BTaGFkaW5nT2JqID8gbV9wU2hhZGluZ09iai0+R2V0RGljdCgpIDogTlVMTDsKKyAgaWYgKHBTaGFkaW5nRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX25GdW5jcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uRnVuY3M7IGkrKykKKyAgICAgIGRlbGV0ZSBtX3BGdW5jdGlvbnNbaV07CiAgICAgbV9uRnVuY3MgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICBtX3BGdW5jdGlvbnNbaV0gPSBOVUxMOwotICAgIH0KLSAgICBtX3BDb3VudGVkQ1MgPSBOVUxMOwotfQotQ1BERl9TaGFkaW5nUGF0dGVybjo6fkNQREZfU2hhZGluZ1BhdHRlcm4oKQotewotICAgIENsZWFyKCk7Ci19Ci12b2lkIENQREZfU2hhZGluZ1BhdHRlcm46OkNsZWFyKCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkZ1bmNzOyBpICsrKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BGdW5jdGlvbnNbaV07Ci0gICAgICAgIG1fcEZ1bmN0aW9uc1tpXSA9IE5VTEw7Ci0gICAgfQotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gbV9wQ291bnRlZENTID8gbV9wQ291bnRlZENTLT5nZXQoKSA6IE5VTEw7Ci0gICAgaWYgKHBDUyAmJiBtX3BEb2N1bWVudCkgewotICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTLT5HZXRBcnJheSgpKTsKLSAgICB9Ci0gICAgbV9TaGFkaW5nVHlwZSA9IDA7Ci0gICAgbV9wQ1MgPSBOVUxMOwotICAgIG1fcENvdW50ZWRDUyA9IE5VTEw7Ci0gICAgbV9uRnVuY3MgPSAwOwotfQotRlhfQk9PTCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpMb2FkKCkKLXsKLSAgICBpZiAobV9TaGFkaW5nVHlwZSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBTaGFkaW5nRGljdCA9IG1fcFNoYWRpbmdPYmogPyBtX3BTaGFkaW5nT2JqLT5HZXREaWN0KCkgOiBOVUxMOwotICAgIGlmIChwU2hhZGluZ0RpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX25GdW5jcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkZ1bmNzOyBpICsrKQotICAgICAgICAgICAgZGVsZXRlIG1fcEZ1bmN0aW9uc1tpXTsKLSAgICAgICAgbV9uRnVuY3MgPSAwOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcEZ1bmMgPSBwU2hhZGluZ0RpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRnVuY3Rpb24iKSk7Ci0gICAgaWYgKHBGdW5jKSB7Ci0gICAgICAgIGlmIChwRnVuYy0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgbV9uRnVuY3MgPSAoKENQREZfQXJyYXkqKXBGdW5jKS0+R2V0Q291bnQoKTsKLSAgICAgICAgICAgIGlmIChtX25GdW5jcyA+IDQpIHsKLSAgICAgICAgICAgICAgICBtX25GdW5jcyA9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkZ1bmNzOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9wRnVuY3Rpb25zW2ldID0gQ1BERl9GdW5jdGlvbjo6TG9hZCgoKENQREZfQXJyYXkqKXBGdW5jKS0+R2V0RWxlbWVudFZhbHVlKGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcEZ1bmN0aW9uc1swXSA9IENQREZfRnVuY3Rpb246OkxvYWQocEZ1bmMpOwotICAgICAgICAgICAgbV9uRnVuY3MgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBwU2hhZGluZ0RpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKLSAgICBpZiAocENTT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKLSAgICBtX3BDUyA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIE5VTEwpOwotICAgIGlmIChtX3BDUykgewotICAgICAgICBtX3BDb3VudGVkQ1MgPSBwRG9jUGFnZURhdGEtPkZpbmRDb2xvclNwYWNlUHRyKG1fcENTLT5HZXRBcnJheSgpKTsKLSAgICB9Ci0gICAgbV9TaGFkaW5nVHlwZSA9IHBTaGFkaW5nRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiU2hhZGluZ1R5cGUiKSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfU2hhZGluZ1BhdHRlcm46OlJlbG9hZCgpCi17Ci0gICAgQ2xlYXIoKTsKLSAgICByZXR1cm4gTG9hZCgpOwotfQotRlhfQk9PTCBDUERGX01lc2hTdHJlYW06OkxvYWQoQ1BERl9TdHJlYW0qIHBTaGFkaW5nU3RyZWFtLCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLCBDUERGX0NvbG9yU3BhY2UqIHBDUykKLXsKLSAgICBtX1N0cmVhbS5Mb2FkQWxsRGF0YShwU2hhZGluZ1N0cmVhbSk7Ci0gICAgbV9CaXRTdHJlYW0uSW5pdChtX1N0cmVhbS5HZXREYXRhKCksIG1fU3RyZWFtLkdldFNpemUoKSk7Ci0gICAgbV9wRnVuY3MgPSBwRnVuY3M7Ci0gICAgbV9uRnVuY3MgPSBuRnVuY3M7Ci0gICAgbV9wQ1MgPSBwQ1M7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTaGFkaW5nU3RyZWFtLT5HZXREaWN0KCk7Ci0gICAgbV9uQ29vcmRCaXRzID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb29yZGluYXRlIikpOwotICAgIG1fbkNvbXBCaXRzID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSk7Ci0gICAgbV9uRmxhZ0JpdHMgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckZsYWciKSk7Ci0gICAgaWYgKCFtX25Db29yZEJpdHMgfHwgIW1fbkNvbXBCaXRzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50IG5Db21wcyA9IHBDUy0+Q291bnRDb21wb25lbnRzKCk7Ci0gICAgaWYgKG5Db21wcyA+IDgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX25Db21wcyA9IG5GdW5jcyA/IDEgOiBuQ29tcHM7Ci0gICAgaWYgKCgoaW50KW1fbkNvbXBzIDwgMCkgfHwgbV9uQ29tcHMgPiA4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9Db29yZE1heCA9IG1fbkNvb3JkQml0cyA9PSAzMiA/IC0xIDogKDEgPDwgbV9uQ29vcmRCaXRzKSAtIDE7Ci0gICAgbV9Db21wTWF4ID0gKDEgPDwgbV9uQ29tcEJpdHMpIC0gMTsKLSAgICBDUERGX0FycmF5KiBwRGVjb2RlID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEZWNvZGUiKSk7Ci0gICAgaWYgKHBEZWNvZGUgPT0gTlVMTCB8fCBwRGVjb2RlLT5HZXRDb3VudCgpICE9IDQgKyBtX25Db21wcyAqIDIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3htaW4gPSBwRGVjb2RlLT5HZXROdW1iZXIoMCk7Ci0gICAgbV94bWF4ID0gcERlY29kZS0+R2V0TnVtYmVyKDEpOwotICAgIG1feW1pbiA9IHBEZWNvZGUtPkdldE51bWJlcigyKTsKLSAgICBtX3ltYXggPSBwRGVjb2RlLT5HZXROdW1iZXIoMyk7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fbkNvbXBzOyBpICsrKSB7Ci0gICAgICAgIG1fQ29sb3JNaW5baV0gPSBwRGVjb2RlLT5HZXROdW1iZXIoaSAqIDIgKyA0KTsKLSAgICAgICAgbV9Db2xvck1heFtpXSA9IHBEZWNvZGUtPkdldE51bWJlcihpICogMiArIDUpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0RXT1JEIENQREZfTWVzaFN0cmVhbTo6R2V0RmxhZygpCi17Ci0gICAgcmV0dXJuIG1fQml0U3RyZWFtLkdldEJpdHMobV9uRmxhZ0JpdHMpICYgMHgwMzsKLX0KLXZvaWQgQ1BERl9NZXNoU3RyZWFtOjpHZXRDb29yZHMoRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KQotewotICAgIGlmIChtX25Db29yZEJpdHMgPT0gMzIpIHsKLSAgICAgICAgeCA9IG1feG1pbiArIChGWF9GTE9BVCkobV9CaXRTdHJlYW0uR2V0Qml0cyhtX25Db29yZEJpdHMpICogKG1feG1heCAtIG1feG1pbikgLyAoZG91YmxlKW1fQ29vcmRNYXgpOwotICAgICAgICB5ID0gbV95bWluICsgKEZYX0ZMT0FUKShtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvb3JkQml0cykgKiAobV95bWF4IC0gbV95bWluKSAvIChkb3VibGUpbV9Db29yZE1heCk7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBGdW5jID0gcFNoYWRpbmdEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZ1bmN0aW9uIikpOworICBpZiAocEZ1bmMpIHsKKyAgICBpZiAocEZ1bmMtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICAgIG1fbkZ1bmNzID0gKChDUERGX0FycmF5KilwRnVuYyktPkdldENvdW50KCk7CisgICAgICBpZiAobV9uRnVuY3MgPiA0KSB7CisgICAgICAgIG1fbkZ1bmNzID0gNDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uRnVuY3M7IGkrKykgeworICAgICAgICBtX3BGdW5jdGlvbnNbaV0gPQorICAgICAgICAgICAgQ1BERl9GdW5jdGlvbjo6TG9hZCgoKENQREZfQXJyYXkqKXBGdW5jKS0+R2V0RWxlbWVudFZhbHVlKGkpKTsKKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICB4ID0gbV94bWluICsgbV9CaXRTdHJlYW0uR2V0Qml0cyhtX25Db29yZEJpdHMpICogKG1feG1heCAtIG1feG1pbikgLyBtX0Nvb3JkTWF4OwotICAgICAgICB5ID0gbV95bWluICsgbV9CaXRTdHJlYW0uR2V0Qml0cyhtX25Db29yZEJpdHMpICogKG1feW1heCAtIG1feW1pbikgLyBtX0Nvb3JkTWF4OworICAgICAgbV9wRnVuY3Rpb25zWzBdID0gQ1BERl9GdW5jdGlvbjo6TG9hZChwRnVuYyk7CisgICAgICBtX25GdW5jcyA9IDE7CiAgICAgfQorICB9CisgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBwU2hhZGluZ0RpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKKyAgaWYgKHBDU09iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOworICBtX3BDUyA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIE5VTEwpOworICBpZiAobV9wQ1MpIHsKKyAgICBtX3BDb3VudGVkQ1MgPSBwRG9jUGFnZURhdGEtPkZpbmRDb2xvclNwYWNlUHRyKG1fcENTLT5HZXRBcnJheSgpKTsKKyAgfQorICBtX1NoYWRpbmdUeXBlID0gcFNoYWRpbmdEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJTaGFkaW5nVHlwZSIpKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENQREZfTWVzaFN0cmVhbTo6R2V0Q29sb3IoRlhfRkxPQVQmIHIsIEZYX0ZMT0FUJiBnLCBGWF9GTE9BVCYgYikKLXsKLSAgICBGWF9EV09SRCBpOwotICAgIEZYX0ZMT0FUIGNvbG9yX3ZhbHVlWzhdOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX25Db21wczsgaSArKykgewotICAgICAgICBjb2xvcl92YWx1ZVtpXSA9IG1fQ29sb3JNaW5baV0gKyBtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvbXBCaXRzKSAqIChtX0NvbG9yTWF4W2ldIC0gbV9Db2xvck1pbltpXSkgLyBtX0NvbXBNYXg7Ci0gICAgfQotICAgIGlmIChtX25GdW5jcykgewotICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhSZXN1bHRzID0gODsKLSAgICAgICAgRlhfRkxPQVQgcmVzdWx0W2tNYXhSZXN1bHRzXTsKLSAgICAgICAgaW50IG5SZXN1bHRzOwotICAgICAgICBGWFNZU19tZW1zZXQocmVzdWx0LCAwLCBzaXplb2YocmVzdWx0KSk7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25GdW5jczsgaSArKykgewotICAgICAgICAgICAgaWYgKG1fcEZ1bmNzW2ldICYmIG1fcEZ1bmNzW2ldLT5Db3VudE91dHB1dHMoKSA8PSBrTWF4UmVzdWx0cykgewotICAgICAgICAgICAgICAgIG1fcEZ1bmNzW2ldLT5DYWxsKGNvbG9yX3ZhbHVlLCAxLCByZXN1bHQsIG5SZXN1bHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX3BDUy0+R2V0UkdCKHJlc3VsdCwgciwgZywgYik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wQ1MtPkdldFJHQihjb2xvcl92YWx1ZSwgciwgZywgYik7Ci0gICAgfQorRlhfQk9PTCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpSZWxvYWQoKSB7CisgIENsZWFyKCk7CisgIHJldHVybiBMb2FkKCk7CiB9Ci1GWF9EV09SRCBDUERGX01lc2hTdHJlYW06OkdldFZlcnRleChDUERGX01lc2hWZXJ0ZXgmIHZlcnRleCwgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJCaXRtYXApCi17Ci0gICAgRlhfRFdPUkQgZmxhZyA9IEdldEZsYWcoKTsKLSAgICBHZXRDb29yZHModmVydGV4LngsIHZlcnRleC55KTsKLSAgICBwT2JqZWN0MkJpdG1hcC0+VHJhbnNmb3JtKHZlcnRleC54LCB2ZXJ0ZXgueSk7Ci0gICAgR2V0Q29sb3IodmVydGV4LnIsIHZlcnRleC5nLCB2ZXJ0ZXguYik7CitGWF9CT09MIENQREZfTWVzaFN0cmVhbTo6TG9hZChDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTKSB7CisgIG1fU3RyZWFtLkxvYWRBbGxEYXRhKHBTaGFkaW5nU3RyZWFtKTsKKyAgbV9CaXRTdHJlYW0uSW5pdChtX1N0cmVhbS5HZXREYXRhKCksIG1fU3RyZWFtLkdldFNpemUoKSk7CisgIG1fcEZ1bmNzID0gcEZ1bmNzOworICBtX25GdW5jcyA9IG5GdW5jczsKKyAgbV9wQ1MgPSBwQ1M7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU2hhZGluZ1N0cmVhbS0+R2V0RGljdCgpOworICBtX25Db29yZEJpdHMgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvb3JkaW5hdGUiKSk7CisgIG1fbkNvbXBCaXRzID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSk7CisgIG1fbkZsYWdCaXRzID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJGbGFnIikpOworICBpZiAoIW1fbkNvb3JkQml0cyB8fCAhbV9uQ29tcEJpdHMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IG5Db21wcyA9IHBDUy0+Q291bnRDb21wb25lbnRzKCk7CisgIGlmIChuQ29tcHMgPiA4KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fbkNvbXBzID0gbkZ1bmNzID8gMSA6IG5Db21wczsKKyAgaWYgKCgoaW50KW1fbkNvbXBzIDwgMCkgfHwgbV9uQ29tcHMgPiA4KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fQ29vcmRNYXggPSBtX25Db29yZEJpdHMgPT0gMzIgPyAtMSA6ICgxIDw8IG1fbkNvb3JkQml0cykgLSAxOworICBtX0NvbXBNYXggPSAoMSA8PCBtX25Db21wQml0cykgLSAxOworICBDUERGX0FycmF5KiBwRGVjb2RlID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEZWNvZGUiKSk7CisgIGlmIChwRGVjb2RlID09IE5VTEwgfHwgcERlY29kZS0+R2V0Q291bnQoKSAhPSA0ICsgbV9uQ29tcHMgKiAyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1feG1pbiA9IHBEZWNvZGUtPkdldE51bWJlcigwKTsKKyAgbV94bWF4ID0gcERlY29kZS0+R2V0TnVtYmVyKDEpOworICBtX3ltaW4gPSBwRGVjb2RlLT5HZXROdW1iZXIoMik7CisgIG1feW1heCA9IHBEZWNvZGUtPkdldE51bWJlcigzKTsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fbkNvbXBzOyBpKyspIHsKKyAgICBtX0NvbG9yTWluW2ldID0gcERlY29kZS0+R2V0TnVtYmVyKGkgKiAyICsgNCk7CisgICAgbV9Db2xvck1heFtpXSA9IHBEZWNvZGUtPkdldE51bWJlcihpICogMiArIDUpOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfRFdPUkQgQ1BERl9NZXNoU3RyZWFtOjpHZXRGbGFnKCkgeworICByZXR1cm4gbV9CaXRTdHJlYW0uR2V0Qml0cyhtX25GbGFnQml0cykgJiAweDAzOworfQordm9pZCBDUERGX01lc2hTdHJlYW06OkdldENvb3JkcyhGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpIHsKKyAgaWYgKG1fbkNvb3JkQml0cyA9PSAzMikgeworICAgIHggPSBtX3htaW4gKyAoRlhfRkxPQVQpKG1fQml0U3RyZWFtLkdldEJpdHMobV9uQ29vcmRCaXRzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1feG1heCAtIG1feG1pbikgLyAoZG91YmxlKW1fQ29vcmRNYXgpOworICAgIHkgPSBtX3ltaW4gKyAoRlhfRkxPQVQpKG1fQml0U3RyZWFtLkdldEJpdHMobV9uQ29vcmRCaXRzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1feW1heCAtIG1feW1pbikgLyAoZG91YmxlKW1fQ29vcmRNYXgpOworICB9IGVsc2UgeworICAgIHggPSBtX3htaW4gKworICAgICAgICBtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvb3JkQml0cykgKiAobV94bWF4IC0gbV94bWluKSAvIG1fQ29vcmRNYXg7CisgICAgeSA9IG1feW1pbiArCisgICAgICAgIG1fQml0U3RyZWFtLkdldEJpdHMobV9uQ29vcmRCaXRzKSAqIChtX3ltYXggLSBtX3ltaW4pIC8gbV9Db29yZE1heDsKKyAgfQorfQordm9pZCBDUERGX01lc2hTdHJlYW06OkdldENvbG9yKEZYX0ZMT0FUJiByLCBGWF9GTE9BVCYgZywgRlhfRkxPQVQmIGIpIHsKKyAgRlhfRFdPUkQgaTsKKyAgRlhfRkxPQVQgY29sb3JfdmFsdWVbOF07CisgIGZvciAoaSA9IDA7IGkgPCBtX25Db21wczsgaSsrKSB7CisgICAgY29sb3JfdmFsdWVbaV0gPSBtX0NvbG9yTWluW2ldICsKKyAgICAgICAgICAgICAgICAgICAgIG1fQml0U3RyZWFtLkdldEJpdHMobV9uQ29tcEJpdHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAobV9Db2xvck1heFtpXSAtIG1fQ29sb3JNaW5baV0pIC8gbV9Db21wTWF4OworICB9CisgIGlmIChtX25GdW5jcykgeworICAgIHN0YXRpYyBjb25zdCBpbnQga01heFJlc3VsdHMgPSA4OworICAgIEZYX0ZMT0FUIHJlc3VsdFtrTWF4UmVzdWx0c107CisgICAgaW50IG5SZXN1bHRzOworICAgIEZYU1lTX21lbXNldChyZXN1bHQsIDAsIHNpemVvZihyZXN1bHQpKTsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9uRnVuY3M7IGkrKykgeworICAgICAgaWYgKG1fcEZ1bmNzW2ldICYmIG1fcEZ1bmNzW2ldLT5Db3VudE91dHB1dHMoKSA8PSBrTWF4UmVzdWx0cykgeworICAgICAgICBtX3BGdW5jc1tpXS0+Q2FsbChjb2xvcl92YWx1ZSwgMSwgcmVzdWx0LCBuUmVzdWx0cyk7CisgICAgICB9CisgICAgfQorICAgIG1fcENTLT5HZXRSR0IocmVzdWx0LCByLCBnLCBiKTsKKyAgfSBlbHNlIHsKKyAgICBtX3BDUy0+R2V0UkdCKGNvbG9yX3ZhbHVlLCByLCBnLCBiKTsKKyAgfQorfQorRlhfRFdPUkQgQ1BERl9NZXNoU3RyZWFtOjpHZXRWZXJ0ZXgoQ1BERl9NZXNoVmVydGV4JiB2ZXJ0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCkgeworICBGWF9EV09SRCBmbGFnID0gR2V0RmxhZygpOworICBHZXRDb29yZHModmVydGV4LngsIHZlcnRleC55KTsKKyAgcE9iamVjdDJCaXRtYXAtPlRyYW5zZm9ybSh2ZXJ0ZXgueCwgdmVydGV4LnkpOworICBHZXRDb2xvcih2ZXJ0ZXguciwgdmVydGV4LmcsIHZlcnRleC5iKTsKKyAgbV9CaXRTdHJlYW0uQnl0ZUFsaWduKCk7CisgIHJldHVybiBmbGFnOworfQorRlhfQk9PTCBDUERGX01lc2hTdHJlYW06OkdldFZlcnRleFJvdyhDUERGX01lc2hWZXJ0ZXgqIHZlcnRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAobV9CaXRTdHJlYW0uSXNFT0YoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBHZXRDb29yZHModmVydGV4W2ldLngsIHZlcnRleFtpXS55KTsKKyAgICBwT2JqZWN0MkJpdG1hcC0+VHJhbnNmb3JtKHZlcnRleFtpXS54LCB2ZXJ0ZXhbaV0ueSk7CisgICAgR2V0Q29sb3IodmVydGV4W2ldLnIsIHZlcnRleFtpXS5nLCB2ZXJ0ZXhbaV0uYik7CiAgICAgbV9CaXRTdHJlYW0uQnl0ZUFsaWduKCk7Ci0gICAgcmV0dXJuIGZsYWc7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfTWVzaFN0cmVhbTo6R2V0VmVydGV4Um93KENQREZfTWVzaFZlcnRleCogdmVydGV4LCBpbnQgY291bnQsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgaWYgKG1fQml0U3RyZWFtLklzRU9GKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBHZXRDb29yZHModmVydGV4W2ldLngsIHZlcnRleFtpXS55KTsKLSAgICAgICAgcE9iamVjdDJCaXRtYXAtPlRyYW5zZm9ybSh2ZXJ0ZXhbaV0ueCwgdmVydGV4W2ldLnkpOwotICAgICAgICBHZXRDb2xvcih2ZXJ0ZXhbaV0uciwgdmVydGV4W2ldLmcsIHZlcnRleFtpXS5iKTsKLSAgICAgICAgbV9CaXRTdHJlYW0uQnl0ZUFsaWduKCk7CitDRlhfRmxvYXRSZWN0IF9HZXRTaGFkaW5nQkJveChDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MpIHsKKyAgaWYgKHBTdHJlYW0gPT0gTlVMTCB8fCBwU3RyZWFtLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSB8fAorICAgICAgcEZ1bmNzID09IE5VTEwgfHwgcENTID09IE5VTEwpIHsKKyAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAwLCAwKTsKKyAgfQorICBDUERGX01lc2hTdHJlYW0gc3RyZWFtOworICBpZiAoIXN0cmVhbS5Mb2FkKHBTdHJlYW0sIHBGdW5jcywgbkZ1bmNzLCBwQ1MpKSB7CisgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICBGWF9CT09MIGJTdGFydGVkID0gRkFMU0U7CisgIEZYX0JPT0wgYkdvdXJhdWQgPSB0eXBlID09IDQgfHwgdHlwZSA9PSA1OworICBpbnQgZnVsbF9wb2ludF9jb3VudCA9IHR5cGUgPT0gNyA/IDE2IDogKHR5cGUgPT0gNiA/IDEyIDogMSk7CisgIGludCBmdWxsX2NvbG9yX2NvdW50ID0gKHR5cGUgPT0gNiB8fCB0eXBlID09IDcpID8gNCA6IDE7CisgIHdoaWxlICghc3RyZWFtLm1fQml0U3RyZWFtLklzRU9GKCkpIHsKKyAgICBGWF9EV09SRCBmbGFnID0gMDsKKyAgICBpZiAodHlwZSAhPSA1KSB7CisgICAgICBmbGFnID0gc3RyZWFtLkdldEZsYWcoKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1DRlhfRmxvYXRSZWN0IF9HZXRTaGFkaW5nQkJveChDUERGX1N0cmVhbSogcFN0cmVhbSwgaW50IHR5cGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLCBDUERGX0NvbG9yU3BhY2UqIHBDUykKLXsKLSAgICBpZiAocFN0cmVhbSA9PSBOVUxMIHx8IHBTdHJlYW0tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNIHx8IHBGdW5jcyA9PSBOVUxMIHx8IHBDUyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOworICAgIGludCBwb2ludF9jb3VudCA9IGZ1bGxfcG9pbnRfY291bnQsIGNvbG9yX2NvdW50ID0gZnVsbF9jb2xvcl9jb3VudDsKKyAgICBpZiAoIWJHb3VyYXVkICYmIGZsYWcpIHsKKyAgICAgIHBvaW50X2NvdW50IC09IDQ7CisgICAgICBjb2xvcl9jb3VudCAtPSAyOwogICAgIH0KLSAgICBDUERGX01lc2hTdHJlYW0gc3RyZWFtOwotICAgIGlmICghc3RyZWFtLkxvYWQocFN0cmVhbSwgcEZ1bmNzLCBuRnVuY3MsIHBDUykpIHsKLSAgICAgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb2ludF9jb3VudDsgaSsrKSB7CisgICAgICBGWF9GTE9BVCB4LCB5OworICAgICAgc3RyZWFtLkdldENvb3Jkcyh4LCB5KTsKKyAgICAgIGlmIChiU3RhcnRlZCkgeworICAgICAgICByZWN0LlVwZGF0ZVJlY3QoeCwgeSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWN0LkluaXRSZWN0KHgsIHkpOworICAgICAgICBiU3RhcnRlZCA9IFRSVUU7CisgICAgICB9CiAgICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmVjdDsKLSAgICBGWF9CT09MIGJTdGFydGVkID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiR291cmF1ZCA9IHR5cGUgPT0gNCB8fCB0eXBlID09IDU7Ci0gICAgaW50IGZ1bGxfcG9pbnRfY291bnQgPSB0eXBlID09IDcgPyAxNiA6ICh0eXBlID09IDYgPyAxMiA6IDEpOwotICAgIGludCBmdWxsX2NvbG9yX2NvdW50ID0gKHR5cGUgPT0gNiB8fCB0eXBlID09IDcpID8gNCA6IDE7Ci0gICAgd2hpbGUgKCFzdHJlYW0ubV9CaXRTdHJlYW0uSXNFT0YoKSkgewotICAgICAgICBGWF9EV09SRCBmbGFnID0gMDsKLSAgICAgICAgaWYgKHR5cGUgIT0gNSkgewotICAgICAgICAgICAgZmxhZyA9IHN0cmVhbS5HZXRGbGFnKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHBvaW50X2NvdW50ID0gZnVsbF9wb2ludF9jb3VudCwgY29sb3JfY291bnQgPSBmdWxsX2NvbG9yX2NvdW50OwotICAgICAgICBpZiAoIWJHb3VyYXVkICYmIGZsYWcpIHsKLSAgICAgICAgICAgIHBvaW50X2NvdW50IC09IDQ7Ci0gICAgICAgICAgICBjb2xvcl9jb3VudCAtPSAyOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9pbnRfY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHgsIHk7Ci0gICAgICAgICAgICBzdHJlYW0uR2V0Q29vcmRzKHgsIHkpOwotICAgICAgICAgICAgaWYgKGJTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5VcGRhdGVSZWN0KHgsIHkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWN0LkluaXRSZWN0KHgsIHkpOwotICAgICAgICAgICAgICAgIGJTdGFydGVkID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdHJlYW0ubV9CaXRTdHJlYW0uU2tpcEJpdHMoc3RyZWFtLm1fbkNvbXBzICogc3RyZWFtLm1fbkNvbXBCaXRzICogY29sb3JfY291bnQpOwotICAgICAgICBpZiAoYkdvdXJhdWQpIHsKLSAgICAgICAgICAgIHN0cmVhbS5tX0JpdFN0cmVhbS5CeXRlQWxpZ24oKTsKLSAgICAgICAgfQorICAgIHN0cmVhbS5tX0JpdFN0cmVhbS5Ta2lwQml0cyhzdHJlYW0ubV9uQ29tcHMgKiBzdHJlYW0ubV9uQ29tcEJpdHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9jb3VudCk7CisgICAgaWYgKGJHb3VyYXVkKSB7CisgICAgICBzdHJlYW0ubV9CaXRTdHJlYW0uQnl0ZUFsaWduKCk7CiAgICAgfQotICAgIHJlY3QuVHJhbnNmb3JtKHBNYXRyaXgpOwotICAgIHJldHVybiByZWN0OworICB9CisgIHJlY3QuVHJhbnNmb3JtKHBNYXRyaXgpOworICByZXR1cm4gcmVjdDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaAppbmRleCA1ZjVkNzY3Li5jOTMxYWY3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvcGFnZWludC5oCkBAIC0xMiw0ODYgKzEyLDUwNyBAQAogI2luY2x1ZGUgIi4uLy4uLy4uLy4uL3RoaXJkX3BhcnR5L2Jhc2Uvbm9uc3RkX3VuaXF1ZV9wdHIuaCIKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCiAKLSNkZWZpbmUgUEFSU0VfU1RFUF9MSU1JVAkJMTAwCisjZGVmaW5lIFBBUlNFX1NURVBfTElNSVQgMTAwCiAKLWNsYXNzIENQREZfU3RyZWFtUGFyc2VyCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1N0cmVhbVBhcnNlciB7CisgcHVibGljOgorICBDUERGX1N0cmVhbVBhcnNlcihjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKKyAgfkNQREZfU3RyZWFtUGFyc2VyKCk7CiAKLSAgICBDUERGX1N0cmVhbVBhcnNlcihjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKLSAgICB+Q1BERl9TdHJlYW1QYXJzZXIoKTsKKyAgQ1BERl9TdHJlYW0qIFJlYWRJbmxpbmVTdHJlYW0oQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBDU09iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVjb2RlKTsKKyAgdHlwZWRlZiBlbnVtIHsgRW5kT2ZEYXRhLCBOdW1iZXIsIEtleXdvcmQsIE5hbWUsIE90aGVycyB9IFN5bnRheFR5cGU7CiAKLSAgICBDUERGX1N0cmVhbSoJCVJlYWRJbmxpbmVTdHJlYW0oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9PYmplY3QqIHBDU09iaiwgRlhfQk9PTCBiRGVjb2RlKTsKLSAgICB0eXBlZGVmIGVudW0geyBFbmRPZkRhdGEsIE51bWJlciwgS2V5d29yZCwgTmFtZSwgT3RoZXJzIH0gU3ludGF4VHlwZTsKKyAgU3ludGF4VHlwZSBQYXJzZU5leHRFbGVtZW50KCk7CisgIHVpbnQ4X3QqIEdldFdvcmRCdWYoKSB7IHJldHVybiBtX1dvcmRCdWZmZXI7IH0KKyAgRlhfRFdPUkQgR2V0V29yZFNpemUoKSB7IHJldHVybiBtX1dvcmRTaXplOyB9CisgIENQREZfT2JqZWN0KiBHZXRPYmplY3QoKSB7CisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BMYXN0T2JqOworICAgIG1fcExhc3RPYmogPSBOVUxMOworICAgIHJldHVybiBwT2JqOworICB9CisgIEZYX0RXT1JEIEdldFBvcygpIHsgcmV0dXJuIG1fUG9zOyB9CisgIHZvaWQgU2V0UG9zKEZYX0RXT1JEIHBvcykgeyBtX1BvcyA9IHBvczsgfQogCi0gICAgU3ludGF4VHlwZQkJCVBhcnNlTmV4dEVsZW1lbnQoKTsKLSAgICB1aW50OF90KgkJCUdldFdvcmRCdWYoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fV29yZEJ1ZmZlcjsKLSAgICB9Ci0gICAgRlhfRFdPUkQJCQlHZXRXb3JkU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9Xb3JkU2l6ZTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqCQlHZXRPYmplY3QoKQotICAgIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BMYXN0T2JqOwotICAgICAgICBtX3BMYXN0T2JqID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIHBPYmo7Ci0gICAgfQotICAgIEZYX0RXT1JECQkJR2V0UG9zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1BvczsKLSAgICB9Ci0gICAgdm9pZAkJCQlTZXRQb3MoRlhfRFdPUkQgcG9zKQotICAgIHsKLSAgICAgICAgbV9Qb3MgPSBwb3M7Ci0gICAgfQorICBDUERGX09iamVjdCogUmVhZE5leHRPYmplY3QoRlhfQk9PTCBiQWxsb3dOZXN0ZWRBcnJheSA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5BcnJheSA9IEZBTFNFKTsKKyAgdm9pZCBTa2lwUGF0aE9iamVjdCgpOwogCi0gICAgQ1BERl9PYmplY3QqCQlSZWFkTmV4dE9iamVjdChGWF9CT09MIGJBbGxvd05lc3RlZEFycmF5ID0gRkFMU0UsIEZYX0JPT0wgYkluQXJyYXkgPSBGQUxTRSk7Ci0gICAgdm9pZAkJCQlTa2lwUGF0aE9iamVjdCgpOwotcHJvdGVjdGVkOgotICAgIHZvaWQJCQkJR2V0TmV4dFdvcmQoRlhfQk9PTCYgYklzTnVtYmVyKTsKLSAgICBDRlhfQnl0ZVN0cmluZwkJUmVhZFN0cmluZygpOwotICAgIENGWF9CeXRlU3RyaW5nCQlSZWFkSGV4U3RyaW5nKCk7Ci0gICAgY29uc3QgdWludDhfdCoJCW1fcEJ1ZjsKLSAgICBGWF9EV09SRAkJCW1fU2l6ZTsKLSAgICBGWF9EV09SRAkJCW1fUG9zOwotICAgIHVpbnQ4X3QJCQkJbV9Xb3JkQnVmZmVyWzI1Nl07Ci0gICAgRlhfRFdPUkQJCQltX1dvcmRTaXplOwotICAgIENQREZfT2JqZWN0KgkJbV9wTGFzdE9iajsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgR2V0TmV4dFdvcmQoRlhfQk9PTCYgYklzTnVtYmVyKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgUmVhZFN0cmluZygpOworICBDRlhfQnl0ZVN0cmluZyBSZWFkSGV4U3RyaW5nKCk7CisgIGNvbnN0IHVpbnQ4X3QqIG1fcEJ1ZjsKKyAgRlhfRFdPUkQgbV9TaXplOworICBGWF9EV09SRCBtX1BvczsKKyAgdWludDhfdCBtX1dvcmRCdWZmZXJbMjU2XTsKKyAgRlhfRFdPUkQgbV9Xb3JkU2l6ZTsKKyAgQ1BERl9PYmplY3QqIG1fcExhc3RPYmo7CiB9OwogdHlwZWRlZiBlbnVtIHsKLSAgICBQREZPUF9DbG9zZUZpbGxTdHJva2VQYXRoID0gMCwgUERGT1BfRmlsbFN0cm9rZVBhdGgsCi0gICAgUERGT1BfQ2xvc2VFT0ZpbGxTdHJva2VQYXRoLCBQREZPUF9FT0ZpbGxTdHJva2VQYXRoLAotICAgIFBERk9QX0JlZ2luTWFya2VkQ29udGVudF9EaWN0aW9uYXJ5LCBQREZPUF9CZWdpbkltYWdlLAotICAgIFBERk9QX0JlZ2luTWFya2VkQ29udGVudCwgUERGT1BfQmVnaW5UZXh0LAotICAgIFBERk9QX0JlZ2luU2VjdGlvblVuZGVmaW5lZCwgUERGT1BfQ3VydmVUb18xMjMsCi0gICAgUERGT1BfQ29uY2F0TWF0cml4LCBQREZPUF9TZXRDb2xvclNwYWNlX0ZpbGwsCi0gICAgUERGT1BfU2V0Q29sb3JTcGFjZV9TdHJva2UsIFBERk9QX1NldERhc2gsCi0gICAgUERGT1BfU2V0Q2hhcldpZHRoLCBQREZPUF9TZXRDYWNoZWREZXZpY2UsCi0gICAgUERGT1BfRXhlY3V0ZVhPYmplY3QsIFBERk9QX01hcmtQbGFjZV9EaWN0aW9uYXJ5LAotICAgIFBERk9QX0VuZEltYWdlLCBQREZPUF9FbmRNYXJrZWRDb250ZW50LAotICAgIFBERk9QX0VuZFRleHQsIFBERk9QX0VuZFNlY3Rpb25VbmRlZmluZWQsCi0gICAgUERGT1BfRmlsbFBhdGgsIFBERk9QX0ZpbGxQYXRoT2xkLAotICAgIFBERk9QX0VPRmlsbFBhdGgsIFBERk9QX1NldEdyYXlfRmlsbCwKLSAgICBQREZPUF9TZXRHcmF5X1N0cm9rZSwgUERGT1BfU2V0RXh0ZW5kR3JhcGhTdGF0ZSwKLSAgICBQREZPUF9DbG9zZVBhdGgsIFBERk9QX1NldEZsYXQsCi0gICAgUERGT1BfQmVnaW5JbWFnZURhdGEsIFBERk9QX1NldExpbmVKb2luLAotICAgIFBERk9QX1NldExpbmVDYXAsIFBERk9QX1NldENNWUtDb2xvcl9GaWxsLAotICAgIFBERk9QX1NldENNWUtDb2xvcl9TdHJva2UsIFBERk9QX0xpbmVUbywKLSAgICBQREZPUF9Nb3ZlVG8sIFBERk9QX1NldE1pdGVyTGltaXQsCi0gICAgUERGT1BfTWFya1BsYWNlLCBQREZPUF9FbmRQYXRoLAotICAgIFBERk9QX1NhdmVHcmFwaFN0YXRlLCBQREZPUF9SZXN0b3JlR3JhcGhTdGF0ZSwKLSAgICBQREZPUF9SZWN0YW5nbGUsIFBERk9QX1NldFJHQkNvbG9yX0ZpbGwsCi0gICAgUERGT1BfU2V0UkdCQ29sb3JfU3Ryb2tlLCBQREZPUF9TZXRSZW5kZXJJbnRlbnQsCi0gICAgUERGT1BfQ2xvc2VTdHJva2VQYXRoLCBQREZPUF9TdHJva2VQYXRoLAotICAgIFBERk9QX1NldENvbG9yX0ZpbGwsIFBERk9QX1NldENvbG9yX1N0cm9rZSwKLSAgICBQREZPUF9TZXRDb2xvclBTX0ZpbGwsIFBERk9QX1NldENvbG9yUFNfU3Ryb2tlLAotICAgIFBERk9QX1NoYWRlRmlsbCwgUERGT1BfU2V0Q2hhclNwYWNlLAotICAgIFBERk9QX01vdmVUZXh0UG9pbnQsIFBERk9QX01vdmVUZXh0UG9pbnRfU2V0TGVhZGluZywKLSAgICBQREZPUF9TZXRGb250LCBQREZPUF9TaG93VGV4dCwKLSAgICBQREZPUF9TaG93VGV4dF9Qb3NpdGlvbmluZywgUERGT1BfU2V0VGV4dExlYWRpbmcsCi0gICAgUERGT1BfU2V0VGV4dE1hdHJpeCwgUERGT1BfU2V0VGV4dFJlbmRlck1vZGUsCi0gICAgUERGT1BfU2V0VGV4dFJpc2UsIFBERk9QX1NldFdvcmRTcGFjZSwKLSAgICBQREZPUF9TZXRIb3J6U2NhbGUsIFBERk9QX01vdmVUb05leHRMaW5lLAotICAgIFBERk9QX0N1cnZlVG9fMjMsIFBERk9QX1NldExpbmVXaWR0aCwKLSAgICBQREZPUF9DbGlwLCBQREZPUF9FT0NsaXAsCi0gICAgUERGT1BfQ3VydmVUb18xMywgUERGT1BfTmV4dExpbmVTaG93VGV4dCwKLSAgICBQREZPUF9OZXh0TGluZVNob3dUZXh0X1NwYWNlLCBQREZPUF9JbnZhbGlkCisgIFBERk9QX0Nsb3NlRmlsbFN0cm9rZVBhdGggPSAwLAorICBQREZPUF9GaWxsU3Ryb2tlUGF0aCwKKyAgUERGT1BfQ2xvc2VFT0ZpbGxTdHJva2VQYXRoLAorICBQREZPUF9FT0ZpbGxTdHJva2VQYXRoLAorICBQREZPUF9CZWdpbk1hcmtlZENvbnRlbnRfRGljdGlvbmFyeSwKKyAgUERGT1BfQmVnaW5JbWFnZSwKKyAgUERGT1BfQmVnaW5NYXJrZWRDb250ZW50LAorICBQREZPUF9CZWdpblRleHQsCisgIFBERk9QX0JlZ2luU2VjdGlvblVuZGVmaW5lZCwKKyAgUERGT1BfQ3VydmVUb18xMjMsCisgIFBERk9QX0NvbmNhdE1hdHJpeCwKKyAgUERGT1BfU2V0Q29sb3JTcGFjZV9GaWxsLAorICBQREZPUF9TZXRDb2xvclNwYWNlX1N0cm9rZSwKKyAgUERGT1BfU2V0RGFzaCwKKyAgUERGT1BfU2V0Q2hhcldpZHRoLAorICBQREZPUF9TZXRDYWNoZWREZXZpY2UsCisgIFBERk9QX0V4ZWN1dGVYT2JqZWN0LAorICBQREZPUF9NYXJrUGxhY2VfRGljdGlvbmFyeSwKKyAgUERGT1BfRW5kSW1hZ2UsCisgIFBERk9QX0VuZE1hcmtlZENvbnRlbnQsCisgIFBERk9QX0VuZFRleHQsCisgIFBERk9QX0VuZFNlY3Rpb25VbmRlZmluZWQsCisgIFBERk9QX0ZpbGxQYXRoLAorICBQREZPUF9GaWxsUGF0aE9sZCwKKyAgUERGT1BfRU9GaWxsUGF0aCwKKyAgUERGT1BfU2V0R3JheV9GaWxsLAorICBQREZPUF9TZXRHcmF5X1N0cm9rZSwKKyAgUERGT1BfU2V0RXh0ZW5kR3JhcGhTdGF0ZSwKKyAgUERGT1BfQ2xvc2VQYXRoLAorICBQREZPUF9TZXRGbGF0LAorICBQREZPUF9CZWdpbkltYWdlRGF0YSwKKyAgUERGT1BfU2V0TGluZUpvaW4sCisgIFBERk9QX1NldExpbmVDYXAsCisgIFBERk9QX1NldENNWUtDb2xvcl9GaWxsLAorICBQREZPUF9TZXRDTVlLQ29sb3JfU3Ryb2tlLAorICBQREZPUF9MaW5lVG8sCisgIFBERk9QX01vdmVUbywKKyAgUERGT1BfU2V0TWl0ZXJMaW1pdCwKKyAgUERGT1BfTWFya1BsYWNlLAorICBQREZPUF9FbmRQYXRoLAorICBQREZPUF9TYXZlR3JhcGhTdGF0ZSwKKyAgUERGT1BfUmVzdG9yZUdyYXBoU3RhdGUsCisgIFBERk9QX1JlY3RhbmdsZSwKKyAgUERGT1BfU2V0UkdCQ29sb3JfRmlsbCwKKyAgUERGT1BfU2V0UkdCQ29sb3JfU3Ryb2tlLAorICBQREZPUF9TZXRSZW5kZXJJbnRlbnQsCisgIFBERk9QX0Nsb3NlU3Ryb2tlUGF0aCwKKyAgUERGT1BfU3Ryb2tlUGF0aCwKKyAgUERGT1BfU2V0Q29sb3JfRmlsbCwKKyAgUERGT1BfU2V0Q29sb3JfU3Ryb2tlLAorICBQREZPUF9TZXRDb2xvclBTX0ZpbGwsCisgIFBERk9QX1NldENvbG9yUFNfU3Ryb2tlLAorICBQREZPUF9TaGFkZUZpbGwsCisgIFBERk9QX1NldENoYXJTcGFjZSwKKyAgUERGT1BfTW92ZVRleHRQb2ludCwKKyAgUERGT1BfTW92ZVRleHRQb2ludF9TZXRMZWFkaW5nLAorICBQREZPUF9TZXRGb250LAorICBQREZPUF9TaG93VGV4dCwKKyAgUERGT1BfU2hvd1RleHRfUG9zaXRpb25pbmcsCisgIFBERk9QX1NldFRleHRMZWFkaW5nLAorICBQREZPUF9TZXRUZXh0TWF0cml4LAorICBQREZPUF9TZXRUZXh0UmVuZGVyTW9kZSwKKyAgUERGT1BfU2V0VGV4dFJpc2UsCisgIFBERk9QX1NldFdvcmRTcGFjZSwKKyAgUERGT1BfU2V0SG9yelNjYWxlLAorICBQREZPUF9Nb3ZlVG9OZXh0TGluZSwKKyAgUERGT1BfQ3VydmVUb18yMywKKyAgUERGT1BfU2V0TGluZVdpZHRoLAorICBQREZPUF9DbGlwLAorICBQREZPUF9FT0NsaXAsCisgIFBERk9QX0N1cnZlVG9fMTMsCisgIFBERk9QX05leHRMaW5lU2hvd1RleHQsCisgIFBERk9QX05leHRMaW5lU2hvd1RleHRfU3BhY2UsCisgIFBERk9QX0ludmFsaWQKIH0gUERGT1A7Ci0jZGVmaW5lIFBBUkFNX0JVRl9TSVpFCTE2CisjZGVmaW5lIFBBUkFNX0JVRl9TSVpFIDE2CiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50CQkJbV9UeXBlOwotICAgIHVuaW9uIHsKLSAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIEZYX0JPT0wJCW1fYkludGVnZXI7Ci0gICAgICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICAgICAgaW50CQltX0ludGVnZXI7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgbV9GbG9hdDsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0gbV9OdW1iZXI7Ci0gICAgICAgIENQREZfT2JqZWN0KgltX3BPYmplY3Q7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICBpbnQJCQltX0xlbjsKLSAgICAgICAgICAgIGNoYXIJCW1fQnVmZmVyWzMyXTsKLSAgICAgICAgfSBtX05hbWU7Ci0gICAgfTsKKyAgaW50IG1fVHlwZTsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBGWF9CT09MIG1fYkludGVnZXI7CisgICAgICB1bmlvbiB7CisgICAgICAgIGludCBtX0ludGVnZXI7CisgICAgICAgIEZYX0ZMT0FUIG1fRmxvYXQ7CisgICAgICB9OworICAgIH0gbV9OdW1iZXI7CisgICAgQ1BERl9PYmplY3QqIG1fcE9iamVjdDsKKyAgICBzdHJ1Y3QgeworICAgICAgaW50IG1fTGVuOworICAgICAgY2hhciBtX0J1ZmZlclszMl07CisgICAgfSBtX05hbWU7CisgIH07CiB9IF9Db250ZW50UGFyYW07Ci0jZGVmaW5lIF9GUERGX01BWF9GT1JNX0xFVkVMXwkJMzAKLSNkZWZpbmUgX0ZQREZfTUFYX1RZUEUzX0ZPUk1fTEVWRUxfCTQKKyNkZWZpbmUgX0ZQREZfTUFYX0ZPUk1fTEVWRUxfIDMwCisjZGVmaW5lIF9GUERGX01BWF9UWVBFM19GT1JNX0xFVkVMXyA0CiAjZGVmaW5lIF9GUERGX01BWF9PQkpFQ1RfU1RBQ0tfU0laRV8gNTEyCi1jbGFzcyBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIKLXsKLXB1YmxpYzoKLSAgICBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoCi0gICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudFJlc291cmNlcywKLSAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcG10Q29udGVudFRvVXNlciwKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0cyogcE9iakxpc3QsCi0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcywKLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCogcEJCb3gsCi0gICAgICAgIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywKLSAgICAgICAgQ1BERl9BbGxTdGF0ZXMqIHBBbGxTdGF0ZXMsCi0gICAgICAgIGludCBsZXZlbCk7Ci0gICAgfkNQREZfU3RyZWFtQ29udGVudFBhcnNlcigpOworY2xhc3MgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyIHsKKyBwdWJsaWM6CisgIENQREZfU3RyZWFtQ29udGVudFBhcnNlcihDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudFJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBtdENvbnRlbnRUb1VzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3RzKiBwT2JqTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QqIHBCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BbGxTdGF0ZXMqIHBBbGxTdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpOworICB+Q1BERl9TdHJlYW1Db250ZW50UGFyc2VyKCk7CiAKLSAgICBGWF9CT09MIFNob3VsZEFib3J0KCkgY29uc3QgeyByZXR1cm4gbV9iQWJvcnQ7IH0KLSAgICBDUERGX1BhZ2VPYmplY3RzKiBHZXRPYmplY3RMaXN0KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0TGlzdDsgfQotICAgIENQREZfQWxsU3RhdGVzKiBHZXRDdXJTdGF0ZXMoKSBjb25zdCB7IHJldHVybiBtX3BDdXJTdGF0ZXMuZ2V0KCk7IH0KLSAgICBGWF9CT09MIElzQ29sb3JlZCgpIGNvbnN0IHsgcmV0dXJuIG1fYkNvbG9yZWQ7IH0KLSAgICBjb25zdCBGWF9GTE9BVCogR2V0VHlwZTNEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9UeXBlM0RhdGE7IH0KKyAgRlhfQk9PTCBTaG91bGRBYm9ydCgpIGNvbnN0IHsgcmV0dXJuIG1fYkFib3J0OyB9CisgIENQREZfUGFnZU9iamVjdHMqIEdldE9iamVjdExpc3QoKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3RMaXN0OyB9CisgIENQREZfQWxsU3RhdGVzKiBHZXRDdXJTdGF0ZXMoKSBjb25zdCB7IHJldHVybiBtX3BDdXJTdGF0ZXMuZ2V0KCk7IH0KKyAgRlhfQk9PTCBJc0NvbG9yZWQoKSBjb25zdCB7IHJldHVybiBtX2JDb2xvcmVkOyB9CisgIGNvbnN0IEZYX0ZMT0FUKiBHZXRUeXBlM0RhdGEoKSBjb25zdCB7IHJldHVybiBtX1R5cGUzRGF0YTsgfQogCi0gICAgdm9pZAkJCQlBZGROdW1iZXJQYXJhbShjb25zdCBGWF9DSEFSKiBzdHIsIGludCBsZW4pOwotICAgIHZvaWQJCQkJQWRkT2JqZWN0UGFyYW0oQ1BERl9PYmplY3QqIHBPYmopOwotICAgIHZvaWQJCQkJQWRkTmFtZVBhcmFtKGNvbnN0IEZYX0NIQVIqIG5hbWUsIGludCBzaXplKTsKLSAgICBpbnQJCQkJCUdldE5leHRQYXJhbVBvcygpOwotICAgIHZvaWQJCQkJQ2xlYXJBbGxQYXJhbXMoKTsKLSAgICBDUERGX09iamVjdCoJCUdldE9iamVjdChGWF9EV09SRCBpbmRleCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldFN0cmluZyhGWF9EV09SRCBpbmRleCk7Ci0gICAgRlhfRkxPQVQJCQlHZXROdW1iZXIoRlhfRFdPUkQgaW5kZXgpOwotICAgIEZYX0ZMT0FUCQlHZXROdW1iZXIxNihGWF9EV09SRCBpbmRleCk7Ci0gICAgaW50CQkJCQlHZXRJbnRlZ2VyKEZYX0RXT1JEIGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChpbnQzMl90KShHZXROdW1iZXIoaW5kZXgpKTsKLSAgICB9Ci0gICAgRlhfQk9PTAkJCQlPbk9wZXJhdG9yKGNvbnN0IEZYX0NIQVIqIG9wKTsKLSAgICB2b2lkCQkJCUJpZ0Nhc2VDYWxsZXIoaW50IGluZGV4KTsKLSAgICBGWF9EV09SRAkJCUdldFBhcnNlUG9zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BTeW50YXgtPkdldFBvcygpOwotICAgIH0KLSAgICB2b2lkCQkJCUFkZFRleHRPYmplY3QoQ0ZYX0J5dGVTdHJpbmcqIHBUZXh0LCBGWF9GTE9BVCBmSW5pdEtlcm5pbmcsIEZYX0ZMT0FUKiBwS2VybmluZywgaW50IGNvdW50KTsKKyAgdm9pZCBBZGROdW1iZXJQYXJhbShjb25zdCBGWF9DSEFSKiBzdHIsIGludCBsZW4pOworICB2b2lkIEFkZE9iamVjdFBhcmFtKENQREZfT2JqZWN0KiBwT2JqKTsKKyAgdm9pZCBBZGROYW1lUGFyYW0oY29uc3QgRlhfQ0hBUiogbmFtZSwgaW50IHNpemUpOworICBpbnQgR2V0TmV4dFBhcmFtUG9zKCk7CisgIHZvaWQgQ2xlYXJBbGxQYXJhbXMoKTsKKyAgQ1BERl9PYmplY3QqIEdldE9iamVjdChGWF9EV09SRCBpbmRleCk7CisgIENGWF9CeXRlU3RyaW5nIEdldFN0cmluZyhGWF9EV09SRCBpbmRleCk7CisgIEZYX0ZMT0FUIEdldE51bWJlcihGWF9EV09SRCBpbmRleCk7CisgIEZYX0ZMT0FUIEdldE51bWJlcjE2KEZYX0RXT1JEIGluZGV4KTsKKyAgaW50IEdldEludGVnZXIoRlhfRFdPUkQgaW5kZXgpIHsgcmV0dXJuIChpbnQzMl90KShHZXROdW1iZXIoaW5kZXgpKTsgfQorICBGWF9CT09MIE9uT3BlcmF0b3IoY29uc3QgRlhfQ0hBUiogb3ApOworICB2b2lkIEJpZ0Nhc2VDYWxsZXIoaW50IGluZGV4KTsKKyAgRlhfRFdPUkQgR2V0UGFyc2VQb3MoKSB7IHJldHVybiBtX3BTeW50YXgtPkdldFBvcygpOyB9CisgIHZvaWQgQWRkVGV4dE9iamVjdChDRlhfQnl0ZVN0cmluZyogcFRleHQsCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmSW5pdEtlcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcEtlcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpOwogCi0gICAgdm9pZAkJCQlDb252ZXJ0VXNlclNwYWNlKEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSk7Ci0gICAgdm9pZAkJCQlDb252ZXJ0VGV4dFNwYWNlKEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSk7Ci0gICAgdm9pZAkJCQlPbkNoYW5nZVRleHRNYXRyaXgoKTsKLSAgICBGWF9EV09SRAkJCVBhcnNlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUsIEZYX0RXT1JEIG1heF9jb3N0KTsKLSAgICB2b2lkCQkJCVBhcnNlUGF0aE9iamVjdCgpOwotICAgIHZvaWQJCQkJQWRkUGF0aFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGludCBmbGFnKTsKLSAgICB2b2lkCQkJCUFkZFBhdGhSZWN0KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHcsIEZYX0ZMT0FUIGgpOwotICAgIHZvaWQJCQkJQWRkUGF0aE9iamVjdChpbnQgRmlsbFR5cGUsIEZYX0JPT0wgYlN0cm9rZSk7Ci0gICAgQ1BERl9JbWFnZU9iamVjdCoJQWRkSW1hZ2UoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENQREZfSW1hZ2UqIHBJbWFnZSwgRlhfQk9PTCBiSW5saW5lKTsKLSAgICB2b2lkCQkJCUFkZER1cGxpY2F0ZUltYWdlKCk7Ci0gICAgdm9pZAkJCQlBZGRGb3JtKENQREZfU3RyZWFtKik7Ci0gICAgdm9pZAkJCQlTZXRHcmFwaGljU3RhdGVzKENQREZfUGFnZU9iamVjdCogcE9iaiwgRlhfQk9PTCBiQ29sb3IsIEZYX0JPT0wgYlRleHQsIEZYX0JPT0wgYkdyYXBoKTsKLSAgICB2b2lkCQkJCVNhdmVTdGF0ZXMoQ1BERl9BbGxTdGF0ZXMqKTsKLSAgICB2b2lkCQkJCVJlc3RvcmVTdGF0ZXMoQ1BERl9BbGxTdGF0ZXMqKTsKLSAgICBDUERGX0ZvbnQqCQkJRmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotICAgIENQREZfQ29sb3JTcGFjZSoJRmluZENvbG9yU3BhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotICAgIENQREZfUGF0dGVybioJCUZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJTaGFkaW5nKTsKLSAgICBDUERGX09iamVjdCoJCUZpbmRSZXNvdXJjZU9iaihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHR5cGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKKyAgdm9pZCBDb252ZXJ0VXNlclNwYWNlKEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSk7CisgIHZvaWQgQ29udmVydFRleHRTcGFjZShGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpOworICB2b2lkIE9uQ2hhbmdlVGV4dE1hdHJpeCgpOworICBGWF9EV09SRCBQYXJzZShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplLCBGWF9EV09SRCBtYXhfY29zdCk7CisgIHZvaWQgUGFyc2VQYXRoT2JqZWN0KCk7CisgIHZvaWQgQWRkUGF0aFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGludCBmbGFnKTsKKyAgdm9pZCBBZGRQYXRoUmVjdChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB3LCBGWF9GTE9BVCBoKTsKKyAgdm9pZCBBZGRQYXRoT2JqZWN0KGludCBGaWxsVHlwZSwgRlhfQk9PTCBiU3Ryb2tlKTsKKyAgQ1BERl9JbWFnZU9iamVjdCogQWRkSW1hZ2UoQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfSW1hZ2UqIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5saW5lKTsKKyAgdm9pZCBBZGREdXBsaWNhdGVJbWFnZSgpOworICB2b2lkIEFkZEZvcm0oQ1BERl9TdHJlYW0qKTsKKyAgdm9pZCBTZXRHcmFwaGljU3RhdGVzKENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdyYXBoKTsKKyAgdm9pZCBTYXZlU3RhdGVzKENQREZfQWxsU3RhdGVzKik7CisgIHZvaWQgUmVzdG9yZVN0YXRlcyhDUERGX0FsbFN0YXRlcyopOworICBDUERGX0ZvbnQqIEZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKKyAgQ1BERl9Db2xvclNwYWNlKiBGaW5kQ29sb3JTcGFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CisgIENQREZfUGF0dGVybiogRmluZFBhdHRlcm4oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIEZYX0JPT0wgYlNoYWRpbmcpOworICBDUERGX09iamVjdCogRmluZFJlc291cmNlT2JqKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CiAKLXByb3RlY3RlZDoKLSAgICBzdHJ1Y3QgT3BDb2RlIHsKLSAgICAgICAgRlhfRFdPUkQgbV9PcElkOwotICAgICAgICB2b2lkIChDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OiptX09wSGFuZGxlcikoKTsKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBPcENvZGUgZ19PcENvZGVzW107CisgcHJvdGVjdGVkOgorICBzdHJ1Y3QgT3BDb2RlIHsKKyAgICBGWF9EV09SRCBtX09wSWQ7CisgICAgdm9pZCAoQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjoqbV9PcEhhbmRsZXIpKCk7CisgIH07CisgIHN0YXRpYyBjb25zdCBPcENvZGUgZ19PcENvZGVzW107CiAKLSAgICB2b2lkIEhhbmRsZV9DbG9zZUZpbGxTdHJva2VQYXRoKCk7Ci0gICAgdm9pZCBIYW5kbGVfRmlsbFN0cm9rZVBhdGgoKTsKLSAgICB2b2lkIEhhbmRsZV9DbG9zZUVPRmlsbFN0cm9rZVBhdGgoKTsKLSAgICB2b2lkIEhhbmRsZV9FT0ZpbGxTdHJva2VQYXRoKCk7Ci0gICAgdm9pZCBIYW5kbGVfQmVnaW5NYXJrZWRDb250ZW50X0RpY3Rpb25hcnkoKTsKLSAgICB2b2lkIEhhbmRsZV9CZWdpbkltYWdlKCk7Ci0gICAgdm9pZCBIYW5kbGVfQmVnaW5NYXJrZWRDb250ZW50KCk7Ci0gICAgdm9pZCBIYW5kbGVfQmVnaW5UZXh0KCk7Ci0gICAgdm9pZCBIYW5kbGVfQmVnaW5TZWN0aW9uVW5kZWZpbmVkKCk7Ci0gICAgdm9pZCBIYW5kbGVfQ3VydmVUb18xMjMoKTsKLSAgICB2b2lkIEhhbmRsZV9Db25jYXRNYXRyaXgoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRDb2xvclNwYWNlX0ZpbGwoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRDb2xvclNwYWNlX1N0cm9rZSgpOwotICAgIHZvaWQgSGFuZGxlX1NldERhc2goKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRDaGFyV2lkdGgoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRDYWNoZWREZXZpY2UoKTsKLSAgICB2b2lkIEhhbmRsZV9FeGVjdXRlWE9iamVjdCgpOwotICAgIHZvaWQgSGFuZGxlX01hcmtQbGFjZV9EaWN0aW9uYXJ5KCk7Ci0gICAgdm9pZCBIYW5kbGVfRW5kSW1hZ2UoKTsKLSAgICB2b2lkIEhhbmRsZV9FbmRNYXJrZWRDb250ZW50KCk7Ci0gICAgdm9pZCBIYW5kbGVfRW5kVGV4dCgpOwotICAgIHZvaWQgSGFuZGxlX0VuZFNlY3Rpb25VbmRlZmluZWQoKTsKLSAgICB2b2lkIEhhbmRsZV9GaWxsUGF0aCgpOwotICAgIHZvaWQgSGFuZGxlX0ZpbGxQYXRoT2xkKCk7Ci0gICAgdm9pZCBIYW5kbGVfRU9GaWxsUGF0aCgpOwotICAgIHZvaWQgSGFuZGxlX1NldEdyYXlfRmlsbCgpOwotICAgIHZvaWQgSGFuZGxlX1NldEdyYXlfU3Ryb2tlKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0RXh0ZW5kR3JhcGhTdGF0ZSgpOwotICAgIHZvaWQgSGFuZGxlX0Nsb3NlUGF0aCgpOwotICAgIHZvaWQgSGFuZGxlX1NldEZsYXQoKTsKLSAgICB2b2lkIEhhbmRsZV9CZWdpbkltYWdlRGF0YSgpOwotICAgIHZvaWQgSGFuZGxlX1NldExpbmVKb2luKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0TGluZUNhcCgpOwotICAgIHZvaWQgSGFuZGxlX1NldENNWUtDb2xvcl9GaWxsKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0Q01ZS0NvbG9yX1N0cm9rZSgpOwotICAgIHZvaWQgSGFuZGxlX0xpbmVUbygpOwotICAgIHZvaWQgSGFuZGxlX01vdmVUbygpOwotICAgIHZvaWQgSGFuZGxlX1NldE1pdGVyTGltaXQoKTsKLSAgICB2b2lkIEhhbmRsZV9NYXJrUGxhY2UoKTsKLSAgICB2b2lkIEhhbmRsZV9FbmRQYXRoKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2F2ZUdyYXBoU3RhdGUoKTsKLSAgICB2b2lkIEhhbmRsZV9SZXN0b3JlR3JhcGhTdGF0ZSgpOwotICAgIHZvaWQgSGFuZGxlX1JlY3RhbmdsZSgpOwotICAgIHZvaWQgSGFuZGxlX1NldFJHQkNvbG9yX0ZpbGwoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRSR0JDb2xvcl9TdHJva2UoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRSZW5kZXJJbnRlbnQoKTsKLSAgICB2b2lkIEhhbmRsZV9DbG9zZVN0cm9rZVBhdGgoKTsKLSAgICB2b2lkIEhhbmRsZV9TdHJva2VQYXRoKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0Q29sb3JfRmlsbCgpOwotICAgIHZvaWQgSGFuZGxlX1NldENvbG9yX1N0cm9rZSgpOwotICAgIHZvaWQgSGFuZGxlX1NldENvbG9yUFNfRmlsbCgpOwotICAgIHZvaWQgSGFuZGxlX1NldENvbG9yUFNfU3Ryb2tlKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2hhZGVGaWxsKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0Q2hhclNwYWNlKCk7Ci0gICAgdm9pZCBIYW5kbGVfTW92ZVRleHRQb2ludCgpOwotICAgIHZvaWQgSGFuZGxlX01vdmVUZXh0UG9pbnRfU2V0TGVhZGluZygpOwotICAgIHZvaWQgSGFuZGxlX1NldEZvbnQoKTsKLSAgICB2b2lkIEhhbmRsZV9TaG93VGV4dCgpOwotICAgIHZvaWQgSGFuZGxlX1Nob3dUZXh0X1Bvc2l0aW9uaW5nKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0VGV4dExlYWRpbmcoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRUZXh0TWF0cml4KCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0VGV4dFJlbmRlck1vZGUoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRUZXh0UmlzZSgpOwotICAgIHZvaWQgSGFuZGxlX1NldFdvcmRTcGFjZSgpOwotICAgIHZvaWQgSGFuZGxlX1NldEhvcnpTY2FsZSgpOwotICAgIHZvaWQgSGFuZGxlX01vdmVUb05leHRMaW5lKCk7Ci0gICAgdm9pZCBIYW5kbGVfQ3VydmVUb18yMygpOwotICAgIHZvaWQgSGFuZGxlX1NldExpbmVXaWR0aCgpOwotICAgIHZvaWQgSGFuZGxlX0NsaXAoKTsKLSAgICB2b2lkIEhhbmRsZV9FT0NsaXAoKTsKLSAgICB2b2lkIEhhbmRsZV9DdXJ2ZVRvXzEzKCk7Ci0gICAgdm9pZCBIYW5kbGVfTmV4dExpbmVTaG93VGV4dCgpOwotICAgIHZvaWQgSGFuZGxlX05leHRMaW5lU2hvd1RleHRfU3BhY2UoKTsKLSAgICB2b2lkIEhhbmRsZV9JbnZhbGlkKCk7CisgIHZvaWQgSGFuZGxlX0Nsb3NlRmlsbFN0cm9rZVBhdGgoKTsKKyAgdm9pZCBIYW5kbGVfRmlsbFN0cm9rZVBhdGgoKTsKKyAgdm9pZCBIYW5kbGVfQ2xvc2VFT0ZpbGxTdHJva2VQYXRoKCk7CisgIHZvaWQgSGFuZGxlX0VPRmlsbFN0cm9rZVBhdGgoKTsKKyAgdm9pZCBIYW5kbGVfQmVnaW5NYXJrZWRDb250ZW50X0RpY3Rpb25hcnkoKTsKKyAgdm9pZCBIYW5kbGVfQmVnaW5JbWFnZSgpOworICB2b2lkIEhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnQoKTsKKyAgdm9pZCBIYW5kbGVfQmVnaW5UZXh0KCk7CisgIHZvaWQgSGFuZGxlX0JlZ2luU2VjdGlvblVuZGVmaW5lZCgpOworICB2b2lkIEhhbmRsZV9DdXJ2ZVRvXzEyMygpOworICB2b2lkIEhhbmRsZV9Db25jYXRNYXRyaXgoKTsKKyAgdm9pZCBIYW5kbGVfU2V0Q29sb3JTcGFjZV9GaWxsKCk7CisgIHZvaWQgSGFuZGxlX1NldENvbG9yU3BhY2VfU3Ryb2tlKCk7CisgIHZvaWQgSGFuZGxlX1NldERhc2goKTsKKyAgdm9pZCBIYW5kbGVfU2V0Q2hhcldpZHRoKCk7CisgIHZvaWQgSGFuZGxlX1NldENhY2hlZERldmljZSgpOworICB2b2lkIEhhbmRsZV9FeGVjdXRlWE9iamVjdCgpOworICB2b2lkIEhhbmRsZV9NYXJrUGxhY2VfRGljdGlvbmFyeSgpOworICB2b2lkIEhhbmRsZV9FbmRJbWFnZSgpOworICB2b2lkIEhhbmRsZV9FbmRNYXJrZWRDb250ZW50KCk7CisgIHZvaWQgSGFuZGxlX0VuZFRleHQoKTsKKyAgdm9pZCBIYW5kbGVfRW5kU2VjdGlvblVuZGVmaW5lZCgpOworICB2b2lkIEhhbmRsZV9GaWxsUGF0aCgpOworICB2b2lkIEhhbmRsZV9GaWxsUGF0aE9sZCgpOworICB2b2lkIEhhbmRsZV9FT0ZpbGxQYXRoKCk7CisgIHZvaWQgSGFuZGxlX1NldEdyYXlfRmlsbCgpOworICB2b2lkIEhhbmRsZV9TZXRHcmF5X1N0cm9rZSgpOworICB2b2lkIEhhbmRsZV9TZXRFeHRlbmRHcmFwaFN0YXRlKCk7CisgIHZvaWQgSGFuZGxlX0Nsb3NlUGF0aCgpOworICB2b2lkIEhhbmRsZV9TZXRGbGF0KCk7CisgIHZvaWQgSGFuZGxlX0JlZ2luSW1hZ2VEYXRhKCk7CisgIHZvaWQgSGFuZGxlX1NldExpbmVKb2luKCk7CisgIHZvaWQgSGFuZGxlX1NldExpbmVDYXAoKTsKKyAgdm9pZCBIYW5kbGVfU2V0Q01ZS0NvbG9yX0ZpbGwoKTsKKyAgdm9pZCBIYW5kbGVfU2V0Q01ZS0NvbG9yX1N0cm9rZSgpOworICB2b2lkIEhhbmRsZV9MaW5lVG8oKTsKKyAgdm9pZCBIYW5kbGVfTW92ZVRvKCk7CisgIHZvaWQgSGFuZGxlX1NldE1pdGVyTGltaXQoKTsKKyAgdm9pZCBIYW5kbGVfTWFya1BsYWNlKCk7CisgIHZvaWQgSGFuZGxlX0VuZFBhdGgoKTsKKyAgdm9pZCBIYW5kbGVfU2F2ZUdyYXBoU3RhdGUoKTsKKyAgdm9pZCBIYW5kbGVfUmVzdG9yZUdyYXBoU3RhdGUoKTsKKyAgdm9pZCBIYW5kbGVfUmVjdGFuZ2xlKCk7CisgIHZvaWQgSGFuZGxlX1NldFJHQkNvbG9yX0ZpbGwoKTsKKyAgdm9pZCBIYW5kbGVfU2V0UkdCQ29sb3JfU3Ryb2tlKCk7CisgIHZvaWQgSGFuZGxlX1NldFJlbmRlckludGVudCgpOworICB2b2lkIEhhbmRsZV9DbG9zZVN0cm9rZVBhdGgoKTsKKyAgdm9pZCBIYW5kbGVfU3Ryb2tlUGF0aCgpOworICB2b2lkIEhhbmRsZV9TZXRDb2xvcl9GaWxsKCk7CisgIHZvaWQgSGFuZGxlX1NldENvbG9yX1N0cm9rZSgpOworICB2b2lkIEhhbmRsZV9TZXRDb2xvclBTX0ZpbGwoKTsKKyAgdm9pZCBIYW5kbGVfU2V0Q29sb3JQU19TdHJva2UoKTsKKyAgdm9pZCBIYW5kbGVfU2hhZGVGaWxsKCk7CisgIHZvaWQgSGFuZGxlX1NldENoYXJTcGFjZSgpOworICB2b2lkIEhhbmRsZV9Nb3ZlVGV4dFBvaW50KCk7CisgIHZvaWQgSGFuZGxlX01vdmVUZXh0UG9pbnRfU2V0TGVhZGluZygpOworICB2b2lkIEhhbmRsZV9TZXRGb250KCk7CisgIHZvaWQgSGFuZGxlX1Nob3dUZXh0KCk7CisgIHZvaWQgSGFuZGxlX1Nob3dUZXh0X1Bvc2l0aW9uaW5nKCk7CisgIHZvaWQgSGFuZGxlX1NldFRleHRMZWFkaW5nKCk7CisgIHZvaWQgSGFuZGxlX1NldFRleHRNYXRyaXgoKTsKKyAgdm9pZCBIYW5kbGVfU2V0VGV4dFJlbmRlck1vZGUoKTsKKyAgdm9pZCBIYW5kbGVfU2V0VGV4dFJpc2UoKTsKKyAgdm9pZCBIYW5kbGVfU2V0V29yZFNwYWNlKCk7CisgIHZvaWQgSGFuZGxlX1NldEhvcnpTY2FsZSgpOworICB2b2lkIEhhbmRsZV9Nb3ZlVG9OZXh0TGluZSgpOworICB2b2lkIEhhbmRsZV9DdXJ2ZVRvXzIzKCk7CisgIHZvaWQgSGFuZGxlX1NldExpbmVXaWR0aCgpOworICB2b2lkIEhhbmRsZV9DbGlwKCk7CisgIHZvaWQgSGFuZGxlX0VPQ2xpcCgpOworICB2b2lkIEhhbmRsZV9DdXJ2ZVRvXzEzKCk7CisgIHZvaWQgSGFuZGxlX05leHRMaW5lU2hvd1RleHQoKTsKKyAgdm9pZCBIYW5kbGVfTmV4dExpbmVTaG93VGV4dF9TcGFjZSgpOworICB2b2lkIEhhbmRsZV9JbnZhbGlkKCk7CiAKLSAgICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BEb2N1bWVudDsKLSAgICBDUERGX0RpY3Rpb25hcnkqIG1fcFBhZ2VSZXNvdXJjZXM7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BQYXJlbnRSZXNvdXJjZXM7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BSZXNvdXJjZXM7Ci0gICAgQ1BERl9QYWdlT2JqZWN0cyogbV9wT2JqZWN0TGlzdDsKLSAgICBpbnQgbV9MZXZlbDsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG1fbXRDb250ZW50VG9Vc2VyOwotICAgIENGWF9GbG9hdFJlY3QgbV9CQm94OwotICAgIENQREZfUGFyc2VPcHRpb25zIG1fT3B0aW9uczsKLSAgICBfQ29udGVudFBhcmFtIG1fUGFyYW1CdWYxW1BBUkFNX0JVRl9TSVpFXTsKLSAgICBGWF9EV09SRCBtX1BhcmFtU3RhcnRQb3M7Ci0gICAgRlhfRFdPUkQgbV9QYXJhbUNvdW50OwotICAgIEZYX0JPT0wgbV9iQWJvcnQ7Ci0gICAgQ1BERl9TdHJlYW1QYXJzZXIqIG1fcFN5bnRheDsKLSAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BbGxTdGF0ZXM+IG1fcEN1clN0YXRlczsKLSAgICBDUERGX0NvbnRlbnRNYXJrIG1fQ3VyQ29udGVudE1hcms7Ci0gICAgQ0ZYX1B0ckFycmF5IG1fQ2xpcFRleHRMaXN0OwotICAgIENQREZfVGV4dE9iamVjdCogbV9wTGFzdFRleHRPYmplY3Q7Ci0gICAgRlhfRkxPQVQgbV9EZWZGb250U2l6ZTsKLSAgICBpbnQgbV9Db21wYXRDb3VudDsKLSAgICBGWF9QQVRIUE9JTlQqIG1fcFBhdGhQb2ludHM7Ci0gICAgaW50IG1fUGF0aFBvaW50Q291bnQ7Ci0gICAgaW50IG1fUGF0aEFsbG9jU2l6ZTsKLSAgICBGWF9GTE9BVCBtX1BhdGhTdGFydFg7Ci0gICAgRlhfRkxPQVQgbV9QYXRoU3RhcnRZOwotICAgIEZYX0ZMT0FUIG1fUGF0aEN1cnJlbnRYOwotICAgIEZYX0ZMT0FUIG1fUGF0aEN1cnJlbnRZOwotICAgIGludCBtX1BhdGhDbGlwVHlwZTsKLSAgICBDRlhfQnl0ZVN0cmluZyBtX0xhc3RJbWFnZU5hbWU7Ci0gICAgQ1BERl9JbWFnZSogbV9wTGFzdEltYWdlOwotICAgIENGWF9CaW5hcnlCdWYgbV9MYXN0SW1hZ2VEaWN0OwotICAgIENGWF9CaW5hcnlCdWYgbV9MYXN0SW1hZ2VEYXRhOwotICAgIENQREZfRGljdGlvbmFyeSogbV9wTGFzdEltYWdlRGljdDsKLSAgICBDUERGX0RpY3Rpb25hcnkqIG1fcExhc3RDbG9uZUltYWdlRGljdDsKLSAgICBGWF9CT09MIG1fYlJlbGVhc2VMYXN0RGljdDsKLSAgICBGWF9CT09MIG1fYlNhbWVMYXN0RGljdDsKLSAgICBGWF9CT09MIG1fYkNvbG9yZWQ7Ci0gICAgRlhfRkxPQVQgbV9UeXBlM0RhdGFbNl07Ci0gICAgRlhfQk9PTCBtX2JSZXNvdXJjZU1pc3Npbmc7Ci0gICAgQ0ZYX1B0ckFycmF5IG1fU3RhdGVTdGFjazsKKyAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7CisgIENQREZfRGljdGlvbmFyeSogbV9wUGFnZVJlc291cmNlczsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BQYXJlbnRSZXNvdXJjZXM7CisgIENQREZfRGljdGlvbmFyeSogbV9wUmVzb3VyY2VzOworICBDUERGX1BhZ2VPYmplY3RzKiBtX3BPYmplY3RMaXN0OworICBpbnQgbV9MZXZlbDsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtX210Q29udGVudFRvVXNlcjsKKyAgQ0ZYX0Zsb2F0UmVjdCBtX0JCb3g7CisgIENQREZfUGFyc2VPcHRpb25zIG1fT3B0aW9uczsKKyAgX0NvbnRlbnRQYXJhbSBtX1BhcmFtQnVmMVtQQVJBTV9CVUZfU0laRV07CisgIEZYX0RXT1JEIG1fUGFyYW1TdGFydFBvczsKKyAgRlhfRFdPUkQgbV9QYXJhbUNvdW50OworICBGWF9CT09MIG1fYkFib3J0OworICBDUERGX1N0cmVhbVBhcnNlciogbV9wU3ludGF4OworICBub25zdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BbGxTdGF0ZXM+IG1fcEN1clN0YXRlczsKKyAgQ1BERl9Db250ZW50TWFyayBtX0N1ckNvbnRlbnRNYXJrOworICBDRlhfUHRyQXJyYXkgbV9DbGlwVGV4dExpc3Q7CisgIENQREZfVGV4dE9iamVjdCogbV9wTGFzdFRleHRPYmplY3Q7CisgIEZYX0ZMT0FUIG1fRGVmRm9udFNpemU7CisgIGludCBtX0NvbXBhdENvdW50OworICBGWF9QQVRIUE9JTlQqIG1fcFBhdGhQb2ludHM7CisgIGludCBtX1BhdGhQb2ludENvdW50OworICBpbnQgbV9QYXRoQWxsb2NTaXplOworICBGWF9GTE9BVCBtX1BhdGhTdGFydFg7CisgIEZYX0ZMT0FUIG1fUGF0aFN0YXJ0WTsKKyAgRlhfRkxPQVQgbV9QYXRoQ3VycmVudFg7CisgIEZYX0ZMT0FUIG1fUGF0aEN1cnJlbnRZOworICBpbnQgbV9QYXRoQ2xpcFR5cGU7CisgIENGWF9CeXRlU3RyaW5nIG1fTGFzdEltYWdlTmFtZTsKKyAgQ1BERl9JbWFnZSogbV9wTGFzdEltYWdlOworICBDRlhfQmluYXJ5QnVmIG1fTGFzdEltYWdlRGljdDsKKyAgQ0ZYX0JpbmFyeUJ1ZiBtX0xhc3RJbWFnZURhdGE7CisgIENQREZfRGljdGlvbmFyeSogbV9wTGFzdEltYWdlRGljdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BMYXN0Q2xvbmVJbWFnZURpY3Q7CisgIEZYX0JPT0wgbV9iUmVsZWFzZUxhc3REaWN0OworICBGWF9CT09MIG1fYlNhbWVMYXN0RGljdDsKKyAgRlhfQk9PTCBtX2JDb2xvcmVkOworICBGWF9GTE9BVCBtX1R5cGUzRGF0YVs2XTsKKyAgRlhfQk9PTCBtX2JSZXNvdXJjZU1pc3Npbmc7CisgIENGWF9QdHJBcnJheSBtX1N0YXRlU3RhY2s7CiB9OwotY2xhc3MgQ1BERl9Db250ZW50UGFyc2VyCi17Ci1wdWJsaWM6Ci0gICAgZW51bSBQYXJzZVN0YXR1cyB7Ci0gICAgICAgIFJlYWR5LAotICAgICAgICBUb0JlQ29udGludWVkLAotICAgICAgICBEb25lCi0gICAgfTsKK2NsYXNzIENQREZfQ29udGVudFBhcnNlciB7CisgcHVibGljOgorICBlbnVtIFBhcnNlU3RhdHVzIHsgUmVhZHksIFRvQmVDb250aW51ZWQsIERvbmUgfTsKIAotICAgIENQREZfQ29udGVudFBhcnNlcigpOwotICAgIH5DUERGX0NvbnRlbnRQYXJzZXIoKTsKKyAgQ1BERl9Db250ZW50UGFyc2VyKCk7CisgIH5DUERGX0NvbnRlbnRQYXJzZXIoKTsKIAotICAgIFBhcnNlU3RhdHVzCQkJR2V0U3RhdHVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1N0YXR1czsKLSAgICB9Ci0gICAgdm9pZAkJCQlTdGFydChDUERGX1BhZ2UqIHBQYWdlLCBDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMpOwotICAgIHZvaWQJCQkJU3RhcnQoQ1BERl9Gb3JtKiBwRm9ybSwgQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLCBDRlhfQWZmaW5lTWF0cml4KiBwUGFyZW50TWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgaW50IGxldmVsKTsKLSAgICB2b2lkCQkJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgUGFyc2VTdGF0dXMgR2V0U3RhdHVzKCkgeyByZXR1cm4gbV9TdGF0dXM7IH0KKyAgdm9pZCBTdGFydChDUERGX1BhZ2UqIHBQYWdlLCBDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMpOworICB2b2lkIFN0YXJ0KENQREZfRm9ybSogcEZvcm0sCisgICAgICAgICAgICAgQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAorICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgsCisgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsCisgICAgICAgICAgICAgQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgIGludCBsZXZlbCk7CisgIHZvaWQgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogCi1wcm90ZWN0ZWQ6Ci0gICAgdm9pZAkJCQlDbGVhcigpOwotICAgIFBhcnNlU3RhdHVzCQkJbV9TdGF0dXM7Ci0gICAgQ1BERl9QYWdlT2JqZWN0cyoJbV9wT2JqZWN0czsKLSAgICBGWF9CT09MCQkJCW1fYkZvcm07Ci0gICAgQ1BERl9QYXJzZU9wdGlvbnMJbV9PcHRpb25zOwotICAgIENQREZfVHlwZTNDaGFyKgkJbV9wVHlwZTNDaGFyOwotICAgIGludAkJCQkJbV9JbnRlcm5hbFN0YWdlOwotICAgIENQREZfU3RyZWFtQWNjKgkJbV9wU2luZ2xlU3RyZWFtOwotICAgIENQREZfU3RyZWFtQWNjKioJbV9wU3RyZWFtQXJyYXk7Ci0gICAgRlhfRFdPUkQJCQltX25TdHJlYW1zOwotICAgIHVpbnQ4X3QqCQkJbV9wRGF0YTsKLSAgICBGWF9EV09SRAkJCW1fU2l6ZTsKLSAgICBjbGFzcyBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIqCW1fcFBhcnNlcjsKLSAgICBGWF9EV09SRAkJCW1fQ3VycmVudE9mZnNldDsKLSAgICBDUERGX1N0cmVhbUZpbHRlcioJbV9wU3RyZWFtRmlsdGVyOworIHByb3RlY3RlZDoKKyAgdm9pZCBDbGVhcigpOworICBQYXJzZVN0YXR1cyBtX1N0YXR1czsKKyAgQ1BERl9QYWdlT2JqZWN0cyogbV9wT2JqZWN0czsKKyAgRlhfQk9PTCBtX2JGb3JtOworICBDUERGX1BhcnNlT3B0aW9ucyBtX09wdGlvbnM7CisgIENQREZfVHlwZTNDaGFyKiBtX3BUeXBlM0NoYXI7CisgIGludCBtX0ludGVybmFsU3RhZ2U7CisgIENQREZfU3RyZWFtQWNjKiBtX3BTaW5nbGVTdHJlYW07CisgIENQREZfU3RyZWFtQWNjKiogbV9wU3RyZWFtQXJyYXk7CisgIEZYX0RXT1JEIG1fblN0cmVhbXM7CisgIHVpbnQ4X3QqIG1fcERhdGE7CisgIEZYX0RXT1JEIG1fU2l6ZTsKKyAgY2xhc3MgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyKiBtX3BQYXJzZXI7CisgIEZYX0RXT1JEIG1fQ3VycmVudE9mZnNldDsKKyAgQ1BERl9TdHJlYW1GaWx0ZXIqIG1fcFN0cmVhbUZpbHRlcjsKIH07Ci1jbGFzcyBDUERGX0FsbFN0YXRlcyA6IHB1YmxpYyBDUERGX0dyYXBoaWNTdGF0ZXMKLXsKLXB1YmxpYzoKLSAgICBDUERGX0FsbFN0YXRlcygpOwotICAgIH5DUERGX0FsbFN0YXRlcygpOwotICAgIHZvaWQJQ29weShjb25zdCBDUERGX0FsbFN0YXRlcyYgc3JjKTsKLSAgICB2b2lkCVByb2Nlc3NFeHRHUyhDUERGX0RpY3Rpb25hcnkqIHBHUywgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyKiBwUGFyc2VyKTsKLSAgICB2b2lkCVNldExpbmVEYXNoKENQREZfQXJyYXkqLCBGWF9GTE9BVCwgRlhfRkxPQVQgc2NhbGUpOwotICAgIENGWF9BZmZpbmVNYXRyaXgJCW1fVGV4dE1hdHJpeCwgbV9DVE0sIG1fUGFyZW50TWF0cml4OwotICAgIEZYX0ZMT0FUCQkJCW1fVGV4dFgsIG1fVGV4dFksIG1fVGV4dExpbmVYLCBtX1RleHRMaW5lWTsKLSAgICBGWF9GTE9BVAkJCQltX1RleHRMZWFkaW5nLCBtX1RleHRSaXNlLCBtX1RleHRIb3J6U2NhbGU7CitjbGFzcyBDUERGX0FsbFN0YXRlcyA6IHB1YmxpYyBDUERGX0dyYXBoaWNTdGF0ZXMgeworIHB1YmxpYzoKKyAgQ1BERl9BbGxTdGF0ZXMoKTsKKyAgfkNQREZfQWxsU3RhdGVzKCk7CisgIHZvaWQgQ29weShjb25zdCBDUERGX0FsbFN0YXRlcyYgc3JjKTsKKyAgdm9pZCBQcm9jZXNzRXh0R1MoQ1BERl9EaWN0aW9uYXJ5KiBwR1MsIENQREZfU3RyZWFtQ29udGVudFBhcnNlciogcFBhcnNlcik7CisgIHZvaWQgU2V0TGluZURhc2goQ1BERl9BcnJheSosIEZYX0ZMT0FULCBGWF9GTE9BVCBzY2FsZSk7CisgIENGWF9BZmZpbmVNYXRyaXggbV9UZXh0TWF0cml4LCBtX0NUTSwgbV9QYXJlbnRNYXRyaXg7CisgIEZYX0ZMT0FUIG1fVGV4dFgsIG1fVGV4dFksIG1fVGV4dExpbmVYLCBtX1RleHRMaW5lWTsKKyAgRlhfRkxPQVQgbV9UZXh0TGVhZGluZywgbV9UZXh0UmlzZSwgbV9UZXh0SG9yelNjYWxlOwogfTsKIAotY2xhc3MgQ1BERl9Eb2NQYWdlRGF0YQotewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgQ1BERl9Eb2NQYWdlRGF0YShDUERGX0RvY3VtZW50ICpwUERGRG9jKTsKLSAgICB+Q1BERl9Eb2NQYWdlRGF0YSgpOworY2xhc3MgQ1BERl9Eb2NQYWdlRGF0YSB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX0RvY1BhZ2VEYXRhKENQREZfRG9jdW1lbnQqIHBQREZEb2MpOworICB+Q1BERl9Eb2NQYWdlRGF0YSgpOwogCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIENsZWFyKEZYX0JPT0wgYlJlbGVhc2UgPSBGQUxTRSk7Ci0gICAgQ1BERl9Gb250KiAgICAgICAgICAgICAgICAgIEdldEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QsIEZYX0JPT0wgZmluZE9ubHkpOwotICAgIENQREZfRm9udCogICAgICAgICAgICAgICAgICBHZXRTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmb250TmFtZSwgQ1BERl9Gb250RW5jb2RpbmcqIHBFbmNvZGluZyk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0KTsKLSAgICBDUERGX0NvbG9yU3BhY2UqICAgICAgICAgICAgR2V0Q29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqLCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMpOwotICAgIENQREZfQ29sb3JTcGFjZSogICAgICAgICAgICBHZXRDb3BpZWRDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ1NPYmopOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlQ29sb3JTcGFjZShDUERGX09iamVjdCogcENvbG9yU3BhY2UpOwotICAgIENQREZfUGF0dGVybiogICAgICAgICAgICAgICBHZXRQYXR0ZXJuKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4KTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZVBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqKTsKLSAgICBDUERGX0ltYWdlKiAgICAgICAgICAgICAgICAgR2V0SW1hZ2UoQ1BERl9PYmplY3QqIHBJbWFnZVN0cmVhbSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VJbWFnZShDUERGX09iamVjdCogcEltYWdlU3RyZWFtKTsKLSAgICBDUERGX0ljY1Byb2ZpbGUqICAgICAgICAgICAgR2V0SWNjUHJvZmlsZShDUERGX1N0cmVhbSogcEljY1Byb2ZpbGVTdHJlYW0pOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlSWNjUHJvZmlsZShDUERGX0ljY1Byb2ZpbGUqIHBJY2NQcm9maWxlKTsKLSAgICBDUERGX1N0cmVhbUFjYyogICAgICAgICAgICAgR2V0Rm9udEZpbGVTdHJlYW1BY2MoQ1BERl9TdHJlYW0qIHBGb250U3RyZWFtKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZUZvbnRGaWxlU3RyZWFtQWNjKENQREZfU3RyZWFtKiBwRm9udFN0cmVhbSwgRlhfQk9PTCBiRm9yY2UgPSBGQUxTRSk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgIElzRm9yY2VDbGVhcigpIGNvbnN0IHtyZXR1cm4gbV9iRm9yY2VDbGVhcjt9DQotICAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqICAgICBGaW5kQ29sb3JTcGFjZVB0cihDUERGX09iamVjdCogcENTT2JqKSBjb25zdDsNCi0gICAgQ1BERl9Db3VudGVkUGF0dGVybiogICAgICAgIEZpbmRQYXR0ZXJuUHRyKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaikgY29uc3Q7CisgIHZvaWQgQ2xlYXIoRlhfQk9PTCBiUmVsZWFzZSA9IEZBTFNFKTsKKyAgQ1BERl9Gb250KiBHZXRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0LCBGWF9CT09MIGZpbmRPbmx5KTsKKyAgQ1BERl9Gb250KiBHZXRTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250RW5jb2RpbmcqIHBFbmNvZGluZyk7CisgIHZvaWQgUmVsZWFzZUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpOworICBDUERGX0NvbG9yU3BhY2UqIEdldENvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDU09iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcyk7CisgIENQREZfQ29sb3JTcGFjZSogR2V0Q29waWVkQ29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqKTsKKyAgdm9pZCBSZWxlYXNlQ29sb3JTcGFjZShDUERGX09iamVjdCogcENvbG9yU3BhY2UpOworICBDUERGX1BhdHRlcm4qIEdldFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hhZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCk7CisgIHZvaWQgUmVsZWFzZVBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqKTsKKyAgQ1BERl9JbWFnZSogR2V0SW1hZ2UoQ1BERl9PYmplY3QqIHBJbWFnZVN0cmVhbSk7CisgIHZvaWQgUmVsZWFzZUltYWdlKENQREZfT2JqZWN0KiBwSW1hZ2VTdHJlYW0pOworICBDUERGX0ljY1Byb2ZpbGUqIEdldEljY1Byb2ZpbGUoQ1BERl9TdHJlYW0qIHBJY2NQcm9maWxlU3RyZWFtKTsKKyAgdm9pZCBSZWxlYXNlSWNjUHJvZmlsZShDUERGX0ljY1Byb2ZpbGUqIHBJY2NQcm9maWxlKTsKKyAgQ1BERl9TdHJlYW1BY2MqIEdldEZvbnRGaWxlU3RyZWFtQWNjKENQREZfU3RyZWFtKiBwRm9udFN0cmVhbSk7CisgIHZvaWQgUmVsZWFzZUZvbnRGaWxlU3RyZWFtQWNjKENQREZfU3RyZWFtKiBwRm9udFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9yY2UgPSBGQUxTRSk7CisgIEZYX0JPT0wgSXNGb3JjZUNsZWFyKCkgY29uc3QgeyByZXR1cm4gbV9iRm9yY2VDbGVhcjsgfQorICBDUERGX0NvdW50ZWRDb2xvclNwYWNlKiBGaW5kQ29sb3JTcGFjZVB0cihDUERGX09iamVjdCogcENTT2JqKSBjb25zdDsKKyAgQ1BERl9Db3VudGVkUGF0dGVybiogRmluZFBhdHRlcm5QdHIoQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqKSBjb25zdDsKIAotICBwcml2YXRlOgotICAgIHVzaW5nIENQREZfQ291bnRlZEZvbnQgPSBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9Gb250PjsKLSAgICB1c2luZyBDUERGX0NvdW50ZWRJY2NQcm9maWxlID0gQ1BERl9Db3VudGVkT2JqZWN0PENQREZfSWNjUHJvZmlsZT47Ci0gICAgdXNpbmcgQ1BERl9Db3VudGVkSW1hZ2UgPSBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9JbWFnZT47Ci0gICAgdXNpbmcgQ1BERl9Db3VudGVkU3RyZWFtQWNjID0gQ1BERl9Db3VudGVkT2JqZWN0PENQREZfU3RyZWFtQWNjPjsKKyBwcml2YXRlOgorICB1c2luZyBDUERGX0NvdW50ZWRGb250ID0gQ1BERl9Db3VudGVkT2JqZWN0PENQREZfRm9udD47CisgIHVzaW5nIENQREZfQ291bnRlZEljY1Byb2ZpbGUgPSBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9JY2NQcm9maWxlPjsKKyAgdXNpbmcgQ1BERl9Db3VudGVkSW1hZ2UgPSBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9JbWFnZT47CisgIHVzaW5nIENQREZfQ291bnRlZFN0cmVhbUFjYyA9IENQREZfQ291bnRlZE9iamVjdDxDUERGX1N0cmVhbUFjYz47CiAKLSAgICB1c2luZyBDUERGX0NvbG9yU3BhY2VNYXAgPSBzdGQ6Om1hcDxDUERGX09iamVjdCosIENQREZfQ291bnRlZENvbG9yU3BhY2UqPjsKLSAgICB1c2luZyBDUERGX0ZvbnRGaWxlTWFwID0gc3RkOjptYXA8Q1BERl9TdHJlYW0qLCBDUERGX0NvdW50ZWRTdHJlYW1BY2MqPjsKLSAgICB1c2luZyBDUERGX0ZvbnRNYXAgPSBzdGQ6Om1hcDxDUERGX0RpY3Rpb25hcnkqLCBDUERGX0NvdW50ZWRGb250Kj47Ci0gICAgdXNpbmcgQ1BERl9JY2NQcm9maWxlTWFwID0gc3RkOjptYXA8Q1BERl9TdHJlYW0qLCBDUERGX0NvdW50ZWRJY2NQcm9maWxlKj47Ci0gICAgdXNpbmcgQ1BERl9JbWFnZU1hcCA9IHN0ZDo6bWFwPEZYX0RXT1JELCBDUERGX0NvdW50ZWRJbWFnZSo+OwotICAgIHVzaW5nIENQREZfUGF0dGVybk1hcCA9IHN0ZDo6bWFwPENQREZfT2JqZWN0KiwgQ1BERl9Db3VudGVkUGF0dGVybio+OworICB1c2luZyBDUERGX0NvbG9yU3BhY2VNYXAgPSBzdGQ6Om1hcDxDUERGX09iamVjdCosIENQREZfQ291bnRlZENvbG9yU3BhY2UqPjsKKyAgdXNpbmcgQ1BERl9Gb250RmlsZU1hcCA9IHN0ZDo6bWFwPENQREZfU3RyZWFtKiwgQ1BERl9Db3VudGVkU3RyZWFtQWNjKj47CisgIHVzaW5nIENQREZfRm9udE1hcCA9IHN0ZDo6bWFwPENQREZfRGljdGlvbmFyeSosIENQREZfQ291bnRlZEZvbnQqPjsKKyAgdXNpbmcgQ1BERl9JY2NQcm9maWxlTWFwID0gc3RkOjptYXA8Q1BERl9TdHJlYW0qLCBDUERGX0NvdW50ZWRJY2NQcm9maWxlKj47CisgIHVzaW5nIENQREZfSW1hZ2VNYXAgPSBzdGQ6Om1hcDxGWF9EV09SRCwgQ1BERl9Db3VudGVkSW1hZ2UqPjsKKyAgdXNpbmcgQ1BERl9QYXR0ZXJuTWFwID0gc3RkOjptYXA8Q1BERl9PYmplY3QqLCBDUERGX0NvdW50ZWRQYXR0ZXJuKj47CiAKLSAgICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BQREZEb2M7Ci0gICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX0hhc2hQcm9maWxlTWFwOwotICAgIEZYX0JPT0wgbV9iRm9yY2VDbGVhcjsKKyAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wUERGRG9jOworICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyIG1fSGFzaFByb2ZpbGVNYXA7CisgIEZYX0JPT0wgbV9iRm9yY2VDbGVhcjsKIAotICAgIENQREZfQ29sb3JTcGFjZU1hcCBtX0NvbG9yU3BhY2VNYXA7Ci0gICAgQ1BERl9Gb250RmlsZU1hcCBtX0ZvbnRGaWxlTWFwOwotICAgIENQREZfRm9udE1hcCBtX0ZvbnRNYXA7Ci0gICAgQ1BERl9JY2NQcm9maWxlTWFwIG1fSWNjUHJvZmlsZU1hcDsKLSAgICBDUERGX0ltYWdlTWFwIG1fSW1hZ2VNYXA7Ci0gICAgQ1BERl9QYXR0ZXJuTWFwIG1fUGF0dGVybk1hcDsKKyAgQ1BERl9Db2xvclNwYWNlTWFwIG1fQ29sb3JTcGFjZU1hcDsKKyAgQ1BERl9Gb250RmlsZU1hcCBtX0ZvbnRGaWxlTWFwOworICBDUERGX0ZvbnRNYXAgbV9Gb250TWFwOworICBDUERGX0ljY1Byb2ZpbGVNYXAgbV9JY2NQcm9maWxlTWFwOworICBDUERGX0ltYWdlTWFwIG1fSW1hZ2VNYXA7CisgIENQREZfUGF0dGVybk1hcCBtX1BhdHRlcm5NYXA7CiB9OwogCi1jbGFzcyBDUERGX0Z1bmN0aW9uCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIENQREZfRnVuY3Rpb24qCUxvYWQoQ1BERl9PYmplY3QqIHBGdW5jT2JqKTsKLSAgICB2aXJ0dWFsIH5DUERGX0Z1bmN0aW9uKCk7Ci0gICAgRlhfQk9PTAkJQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBpbnQgbmlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMsIGludCYgbnJlc3VsdHMpIGNvbnN0OwotICAgIGludAkJCUNvdW50SW5wdXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25JbnB1dHM7Ci0gICAgfQotICAgIGludAkJCUNvdW50T3V0cHV0cygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9uT3V0cHV0czsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgQ1BERl9GdW5jdGlvbigpOwotICAgIGludAkJCW1fbklucHV0cywgbV9uT3V0cHV0czsKLSAgICBGWF9GTE9BVCoJbV9wRG9tYWluczsKLSAgICBGWF9GTE9BVCoJbV9wUmFuZ2VzOwotICAgIEZYX0JPT0wJCUluaXQoQ1BERl9PYmplY3QqIHBPYmopOwotICAgIHZpcnR1YWwgRlhfQk9PTAl2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJdl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdCA9IDA7CitjbGFzcyBDUERGX0Z1bmN0aW9uIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDUERGX0Z1bmN0aW9uKiBMb2FkKENQREZfT2JqZWN0KiBwRnVuY09iaik7CisgIHZpcnR1YWwgfkNQREZfRnVuY3Rpb24oKTsKKyAgRlhfQk9PTCBDYWxsKEZYX0ZMT0FUKiBpbnB1dHMsCisgICAgICAgICAgICAgICBpbnQgbmlucHV0cywKKyAgICAgICAgICAgICAgIEZYX0ZMT0FUKiByZXN1bHRzLAorICAgICAgICAgICAgICAgaW50JiBucmVzdWx0cykgY29uc3Q7CisgIGludCBDb3VudElucHV0cygpIHsgcmV0dXJuIG1fbklucHV0czsgfQorICBpbnQgQ291bnRPdXRwdXRzKCkgeyByZXR1cm4gbV9uT3V0cHV0czsgfQorCisgcHJvdGVjdGVkOgorICBDUERGX0Z1bmN0aW9uKCk7CisgIGludCBtX25JbnB1dHMsIG1fbk91dHB1dHM7CisgIEZYX0ZMT0FUKiBtX3BEb21haW5zOworICBGWF9GTE9BVCogbV9wUmFuZ2VzOworICBGWF9CT09MIEluaXQoQ1BERl9PYmplY3QqIHBPYmopOworICB2aXJ0dWFsIEZYX0JPT0wgdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCB2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0ID0gMDsKIH07Ci1jbGFzcyBDUERGX0ljY1Byb2ZpbGUKLXsKLXB1YmxpYzoKLSAgICBDUERGX0ljY1Byb2ZpbGUoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSk7Ci0gICAgfkNQREZfSWNjUHJvZmlsZSgpOwotICAgIGludDMyX3QgR2V0Q29tcG9uZW50cygpIGNvbnN0IHsgcmV0dXJuIG1fblNyY0NvbXBvbmVudHM7IH0KLSAgICBGWF9CT09MCQkJCQltX2JzUkdCOwotICAgIHZvaWQqCQkJCW1fcFRyYW5zZm9ybTsKLXByaXZhdGU6Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICBtX25TcmNDb21wb25lbnRzOworY2xhc3MgQ1BERl9JY2NQcm9maWxlIHsKKyBwdWJsaWM6CisgIENQREZfSWNjUHJvZmlsZShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKKyAgfkNQREZfSWNjUHJvZmlsZSgpOworICBpbnQzMl90IEdldENvbXBvbmVudHMoKSBjb25zdCB7IHJldHVybiBtX25TcmNDb21wb25lbnRzOyB9CisgIEZYX0JPT0wgbV9ic1JHQjsKKyAgdm9pZCogbV9wVHJhbnNmb3JtOworCisgcHJpdmF0ZToKKyAgaW50MzJfdCBtX25TcmNDb21wb25lbnRzOwogfTsKIAotY2xhc3MgQ1BERl9EZXZpY2VDUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UKLXsKLXB1YmxpYzoKLSAgICBDUERGX0RldmljZUNTKENQREZfRG9jdW1lbnQqIHBEb2MsIGludCBmYW1pbHkpOworY2xhc3MgQ1BERl9EZXZpY2VDUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UgeworIHB1YmxpYzoKKyAgQ1BERl9EZXZpY2VDUyhDUERGX0RvY3VtZW50KiBwRG9jLCBpbnQgZmFtaWx5KTsKIAotICAgIEZYX0JPT0wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAotICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAotICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgICBGWF9CT09MIFNldFJHQihGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAotICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCi0gICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCB2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGMsCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG0sCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHksCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGspIGNvbnN0IG92ZXJyaWRlOwotICAgIEZYX0JPT0wgdl9TZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGMsCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbSwKLSAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGspIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc01hc2sgPSBGQUxTRSkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIHZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGMsCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtLAorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGspIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIHZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbSwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdCBvdmVycmlkZTsKIH07CiAKLWNsYXNzIENQREZfUGF0dGVybkNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZQotewotcHVibGljOgotICAgIGV4cGxpY2l0IENQREZfUGF0dGVybkNTKENQREZfRG9jdW1lbnQqIHBEb2MpCi0gICAgICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX1BBVFRFUk4sIDEpLAotICAgICAgICAgIG1fcEJhc2VDUyhudWxscHRyKSwKLSAgICAgICAgICBtX3BDb3VudGVkQmFzZUNTKG51bGxwdHIpIHsKLSAgICB9Ci0gICAgfkNQREZfUGF0dGVybkNTKCkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKLSAgICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKLSAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKLSAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgQ1BERl9Db2xvclNwYWNlKiBHZXRCYXNlQ1MoKSBjb25zdCBvdmVycmlkZTsKK2NsYXNzIENQREZfUGF0dGVybkNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX1BhdHRlcm5DUyhDUERGX0RvY3VtZW50KiBwRG9jKQorICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfUEFUVEVSTiwgMSksCisgICAgICAgIG1fcEJhc2VDUyhudWxscHRyKSwKKyAgICAgICAgbV9wQ291bnRlZEJhc2VDUyhudWxscHRyKSB7fQorICB+Q1BERl9QYXR0ZXJuQ1MoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOworICBDUERGX0NvbG9yU3BhY2UqIEdldEJhc2VDUygpIGNvbnN0IG92ZXJyaWRlOwogCi1wcml2YXRlOgotICAgIENQREZfQ29sb3JTcGFjZSogbV9wQmFzZUNTOwotICAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIG1fcENvdW50ZWRCYXNlQ1M7CisgcHJpdmF0ZToKKyAgQ1BERl9Db2xvclNwYWNlKiBtX3BCYXNlQ1M7CisgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIG1fcENvdW50ZWRCYXNlQ1M7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZBUElfRlBERl9QQUdFX1BBR0VJTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZmlsdGVyc19pbnQuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZmlsdGVyc19pbnQuaAppbmRleCAyZWM1NGZiLi41NzE4MDE0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZpbHRlcnNfaW50LmgKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9maWx0ZXJzX2ludC5oCkBAIC03LDEyMCArNywxMzkgQEAKICNpZm5kZWYgQ09SRV9TUkNfRlBERkFQSV9GUERGX1BBUlNFUl9GSUxURVJTX0lOVF9IXwogI2RlZmluZSBDT1JFX1NSQ19GUERGQVBJX0ZQREZfUEFSU0VSX0ZJTFRFUlNfSU5UX0hfCiAKLWNsYXNzIENQREZfRGVjcnlwdEZpbHRlciA6IHB1YmxpYyBDRlhfRGF0YUZpbHRlcgotewotcHVibGljOgotICAgIENQREZfRGVjcnlwdEZpbHRlcihDUERGX0NyeXB0b0hhbmRsZXIqIHBDcnlwdG9IYW5kbGVyLCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSk7Ci0gICAgdmlydHVhbCB+Q1BERl9EZWNyeXB0RmlsdGVyKCk7Ci0gICAgdmlydHVhbAl2b2lkCXZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKLSAgICB2aXJ0dWFsIHZvaWQJdl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIENQREZfQ3J5cHRvSGFuZGxlcioJbV9wQ3J5cHRvSGFuZGxlcjsKLSAgICB2b2lkKgkJbV9wQ29udGV4dDsKLSAgICBGWF9EV09SRAkJbV9PYmpOdW0sIG1fR2VuTnVtOworY2xhc3MgQ1BERl9EZWNyeXB0RmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyIHsKKyBwdWJsaWM6CisgIENQREZfRGVjcnlwdEZpbHRlcihDUERGX0NyeXB0b0hhbmRsZXIqIHBDcnlwdG9IYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2VubnVtKTsKKyAgdmlydHVhbCB+Q1BERl9EZWNyeXB0RmlsdGVyKCk7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIENQREZfQ3J5cHRvSGFuZGxlciogbV9wQ3J5cHRvSGFuZGxlcjsKKyAgdm9pZCogbV9wQ29udGV4dDsKKyAgRlhfRFdPUkQgbV9PYmpOdW0sIG1fR2VuTnVtOwogfTsKLWNsYXNzIENQREZfRmxhdGVGaWx0ZXIgOiBwdWJsaWMgQ0ZYX0RhdGFGaWx0ZXIKLXsKLXB1YmxpYzoKLSAgICBDUERGX0ZsYXRlRmlsdGVyKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9GbGF0ZUZpbHRlcigpOwotICAgIHZpcnR1YWwJdm9pZAl2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7fQotICAgIHZvaWQqCQkJbV9wQ29udGV4dDsKLSAgICB1aW50OF90CQkJbV9EZXN0QnVmZmVyW0ZQREZfRklMVEVSX0JVRkZFUl9TSVpFXTsKK2NsYXNzIENQREZfRmxhdGVGaWx0ZXIgOiBwdWJsaWMgQ0ZYX0RhdGFGaWx0ZXIgeworIHB1YmxpYzoKKyAgQ1BERl9GbGF0ZUZpbHRlcigpOworICB2aXJ0dWFsIH5DUERGX0ZsYXRlRmlsdGVyKCk7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KKyAgdm9pZCogbV9wQ29udGV4dDsKKyAgdWludDhfdCBtX0Rlc3RCdWZmZXJbRlBERl9GSUxURVJfQlVGRkVSX1NJWkVdOwogfTsKLWNsYXNzIENQREZfTHp3RmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9MendGaWx0ZXIoRlhfQk9PTCBiRWFybHlDaGFuZ2UpOwotICAgIHZpcnR1YWwgfkNQREZfTHp3RmlsdGVyKCkge30KLSAgICB2aXJ0dWFsCXZvaWQJdl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KLSAgICBGWF9CT09MCQkJbV9iRWFybHlDaGFuZ2U7Ci0gICAgRlhfRFdPUkQJCW1fQ29kZUFycmF5WzUwMjFdOwotICAgIEZYX0RXT1JECQltX25Db2RlczsKLSAgICBGWF9EV09SRAkJbV9Db2RlTGVuOwotICAgIEZYX0RXT1JECQltX09sZENvZGU7Ci0gICAgdWludDhfdAkJCW1fTGFzdENoYXI7Ci0gICAgRlhfRFdPUkQJCW1fbkxlZnRCaXRzLCBtX0xlZnRCaXRzOwotICAgIHVpbnQ4X3QJCQltX0RlY29kZVN0YWNrWzQwMDBdOwotICAgIEZYX0RXT1JECQltX1N0YWNrTGVuOwotICAgIHZvaWQJCQlBZGRDb2RlKEZYX0RXT1JEIHByZWZpeF9jb2RlLCB1aW50OF90IGFwcGVuZF9jaGFyKTsKLSAgICB2b2lkCQkJRGVjb2RlU3RyaW5nKEZYX0RXT1JEIGNvZGUpOworY2xhc3MgQ1BERl9MendGaWx0ZXIgOiBwdWJsaWMgQ0ZYX0RhdGFGaWx0ZXIgeworIHB1YmxpYzoKKyAgQ1BERl9MendGaWx0ZXIoRlhfQk9PTCBiRWFybHlDaGFuZ2UpOworICB2aXJ0dWFsIH5DUERGX0x6d0ZpbHRlcigpIHt9CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KKyAgRlhfQk9PTCBtX2JFYXJseUNoYW5nZTsKKyAgRlhfRFdPUkQgbV9Db2RlQXJyYXlbNTAyMV07CisgIEZYX0RXT1JEIG1fbkNvZGVzOworICBGWF9EV09SRCBtX0NvZGVMZW47CisgIEZYX0RXT1JEIG1fT2xkQ29kZTsKKyAgdWludDhfdCBtX0xhc3RDaGFyOworICBGWF9EV09SRCBtX25MZWZ0Qml0cywgbV9MZWZ0Qml0czsKKyAgdWludDhfdCBtX0RlY29kZVN0YWNrWzQwMDBdOworICBGWF9EV09SRCBtX1N0YWNrTGVuOworICB2b2lkIEFkZENvZGUoRlhfRFdPUkQgcHJlZml4X2NvZGUsIHVpbnQ4X3QgYXBwZW5kX2NoYXIpOworICB2b2lkIERlY29kZVN0cmluZyhGWF9EV09SRCBjb2RlKTsKIH07Ci1jbGFzcyBDUERGX1ByZWRpY3RvckZpbHRlciA6IHB1YmxpYyBDRlhfRGF0YUZpbHRlcgotewotcHVibGljOgotICAgIENQREZfUHJlZGljdG9yRmlsdGVyKGludCBwcmVkaWN0b3IsIGludCBjb2xvcnMsIGludCBicGMsIGludCBjb2xzKTsKLSAgICB2aXJ0dWFsIH5DUERGX1ByZWRpY3RvckZpbHRlcigpOwotICAgIHZpcnR1YWwJdm9pZAl2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7fQotICAgIEZYX0JPT0wJCQltX2JUaWZmOwotICAgIEZYX0RXT1JECQltX1BpdGNoLCBtX0JwcDsKLSAgICB1aW50OF90KgkJbV9wUmVmTGluZTsKLSAgICB1aW50OF90KgkJbV9wQ3VyTGluZTsKLSAgICBGWF9EV09SRAkJbV9pTGluZSwgbV9MaW5lSW5TaXplOworY2xhc3MgQ1BERl9QcmVkaWN0b3JGaWx0ZXIgOiBwdWJsaWMgQ0ZYX0RhdGFGaWx0ZXIgeworIHB1YmxpYzoKKyAgQ1BERl9QcmVkaWN0b3JGaWx0ZXIoaW50IHByZWRpY3RvciwgaW50IGNvbG9ycywgaW50IGJwYywgaW50IGNvbHMpOworICB2aXJ0dWFsIH5DUERGX1ByZWRpY3RvckZpbHRlcigpOworICB2aXJ0dWFsIHZvaWQgdl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOworICB2aXJ0dWFsIHZvaWQgdl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpIHt9CisgIEZYX0JPT0wgbV9iVGlmZjsKKyAgRlhfRFdPUkQgbV9QaXRjaCwgbV9CcHA7CisgIHVpbnQ4X3QqIG1fcFJlZkxpbmU7CisgIHVpbnQ4X3QqIG1fcEN1ckxpbmU7CisgIEZYX0RXT1JEIG1faUxpbmUsIG1fTGluZUluU2l6ZTsKIH07Ci1jbGFzcyBDUERGX0FzY2lpSGV4RmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9Bc2NpaUhleEZpbHRlcigpOwotICAgIHZpcnR1YWwgfkNQREZfQXNjaWlIZXhGaWx0ZXIoKSB7fQotICAgIHZpcnR1YWwJdm9pZAl2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7fQotICAgIGludAkJCQltX1N0YXRlOwotICAgIGludAkJCQltX0ZpcnN0RGlnaXQ7CitjbGFzcyBDUERGX0FzY2lpSGV4RmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyIHsKKyBwdWJsaWM6CisgIENQREZfQXNjaWlIZXhGaWx0ZXIoKTsKKyAgdmlydHVhbCB+Q1BERl9Bc2NpaUhleEZpbHRlcigpIHt9CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KKyAgaW50IG1fU3RhdGU7CisgIGludCBtX0ZpcnN0RGlnaXQ7CiB9OwotY2xhc3MgQ1BERl9Bc2NpaTg1RmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9Bc2NpaTg1RmlsdGVyKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9Bc2NpaTg1RmlsdGVyKCkge30KLSAgICB2aXJ0dWFsCXZvaWQJdl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KLSAgICBpbnQJCQkJbV9TdGF0ZTsKLSAgICBpbnQJCQkJbV9DaGFyQ291bnQ7Ci0gICAgRlhfRFdPUkQJCW1fQ3VyRFdvcmQ7CitjbGFzcyBDUERGX0FzY2lpODVGaWx0ZXIgOiBwdWJsaWMgQ0ZYX0RhdGFGaWx0ZXIgeworIHB1YmxpYzoKKyAgQ1BERl9Bc2NpaTg1RmlsdGVyKCk7CisgIHZpcnR1YWwgfkNQREZfQXNjaWk4NUZpbHRlcigpIHt9CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KKyAgaW50IG1fU3RhdGU7CisgIGludCBtX0NoYXJDb3VudDsKKyAgRlhfRFdPUkQgbV9DdXJEV29yZDsKIH07Ci1jbGFzcyBDUERGX1J1bkxlbkZpbHRlciA6IHB1YmxpYyBDRlhfRGF0YUZpbHRlcgotewotcHVibGljOgotICAgIENQREZfUnVuTGVuRmlsdGVyKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9SdW5MZW5GaWx0ZXIoKSB7fQotICAgIHZpcnR1YWwJdm9pZAl2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7fQotICAgIGludAkJCQltX1N0YXRlOwotICAgIEZYX0RXT1JECQltX0NvdW50OworY2xhc3MgQ1BERl9SdW5MZW5GaWx0ZXIgOiBwdWJsaWMgQ0ZYX0RhdGFGaWx0ZXIgeworIHB1YmxpYzoKKyAgQ1BERl9SdW5MZW5GaWx0ZXIoKTsKKyAgdmlydHVhbCB+Q1BERl9SdW5MZW5GaWx0ZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQgdl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOworICB2aXJ0dWFsIHZvaWQgdl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpIHt9CisgIGludCBtX1N0YXRlOworICBGWF9EV09SRCBtX0NvdW50OwogfTsKLWNsYXNzIENQREZfSnBlZ0ZpbHRlciA6IHB1YmxpYyBDRlhfRGF0YUZpbHRlcgotewotcHVibGljOgotICAgIENQREZfSnBlZ0ZpbHRlcigpOwotICAgIHZpcnR1YWwgfkNQREZfSnBlZ0ZpbHRlcigpOwotICAgIHZpcnR1YWwJdm9pZAl2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7fQotICAgIHZvaWQqCQkJbV9wQ29udGV4dDsKLSAgICBDRlhfQmluYXJ5QnVmCW1fSW5wdXRCdWY7Ci0gICAgdWludDhfdCoJCW1fcFNjYW5saW5lOwotICAgIGludAkJCQltX1BpdGNoLCBtX0hlaWdodCwgbV9XaWR0aCwgbV9uQ29tcHMsIG1faUxpbmU7Ci0gICAgRlhfQk9PTAkJCW1fYkdvdEhlYWRlcjsKK2NsYXNzIENQREZfSnBlZ0ZpbHRlciA6IHB1YmxpYyBDRlhfRGF0YUZpbHRlciB7CisgcHVibGljOgorICBDUERGX0pwZWdGaWx0ZXIoKTsKKyAgdmlydHVhbCB+Q1BERl9KcGVnRmlsdGVyKCk7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KKyAgdm9pZCogbV9wQ29udGV4dDsKKyAgQ0ZYX0JpbmFyeUJ1ZiBtX0lucHV0QnVmOworICB1aW50OF90KiBtX3BTY2FubGluZTsKKyAgaW50IG1fUGl0Y2gsIG1fSGVpZ2h0LCBtX1dpZHRoLCBtX25Db21wcywgbV9pTGluZTsKKyAgRlhfQk9PTCBtX2JHb3RIZWFkZXI7CiB9OwotY2xhc3MgQ1BERl9GYXhGaWx0ZXIgOiBwdWJsaWMgQ0ZYX0RhdGFGaWx0ZXIKLXsKLXB1YmxpYzoKLSAgICBDUERGX0ZheEZpbHRlcigpOwotICAgIHZpcnR1YWwgfkNQREZfRmF4RmlsdGVyKCk7Ci0gICAgRlhfQk9PTAkJCUluaXRpYWxpemUoaW50IEVuY29kaW5nLCBpbnQgYkVuZE9mTGluZSwgaW50IGJCeXRlQWxpZ24sIGludCBiQmxhY2ssIGludCBuUm93cywgaW50IG5Db2x1bW5zKTsKLSAgICB2aXJ0dWFsCXZvaWQJdl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgaW50CQkJCW1fRW5jb2RpbmcsIG1fYkVuZE9mTGluZSwgbV9iQnl0ZUFsaWduLCBtX2JCbGFjazsKLSAgICBpbnQJCQkJbV9uUm93cywgbV9uQ29sdW1ucywgbV9QaXRjaCwgbV9pUm93OwotICAgIHVpbnQ4X3QqCQltX3BTY2FubGluZUJ1ZjsKLQl1aW50OF90KgkJbV9wUmVmQnVmOwotICAgIENGWF9CaW5hcnlCdWYJbV9JbnB1dEJ1ZjsKLSAgICBpbnQJCQkJbV9JbnB1dEJpdFBvczsKLSAgICB2b2lkCQkJUHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgYml0cG9zLCBGWF9CT09MIGJGaW5pc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKLSAgICBGWF9CT09MCQkJUmVhZExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKTsKK2NsYXNzIENQREZfRmF4RmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyIHsKKyBwdWJsaWM6CisgIENQREZfRmF4RmlsdGVyKCk7CisgIHZpcnR1YWwgfkNQREZfRmF4RmlsdGVyKCk7CisgIEZYX0JPT0wgSW5pdGlhbGl6ZShpbnQgRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICBpbnQgYkVuZE9mTGluZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBiQnl0ZUFsaWduLAorICAgICAgICAgICAgICAgICAgICAgaW50IGJCbGFjaywKKyAgICAgICAgICAgICAgICAgICAgIGludCBuUm93cywKKyAgICAgICAgICAgICAgICAgICAgIGludCBuQ29sdW1ucyk7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIHZpcnR1YWwgdm9pZCB2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIGludCBtX0VuY29kaW5nLCBtX2JFbmRPZkxpbmUsIG1fYkJ5dGVBbGlnbiwgbV9iQmxhY2s7CisgIGludCBtX25Sb3dzLCBtX25Db2x1bW5zLCBtX1BpdGNoLCBtX2lSb3c7CisgIHVpbnQ4X3QqIG1fcFNjYW5saW5lQnVmOworICB1aW50OF90KiBtX3BSZWZCdWY7CisgIENGWF9CaW5hcnlCdWYgbV9JbnB1dEJ1ZjsKKyAgaW50IG1fSW5wdXRCaXRQb3M7CisgIHZvaWQgUHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQmIGJpdHBvcywKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGaW5pc2gsCisgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOworICBGWF9CT09MIFJlYWRMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcyk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZBUElfRlBERl9QQVJTRVJfRklMVEVSU19JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmNwcAppbmRleCA0N2MwOGZiLi44NWJhMTMwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuY3BwCkBAIC04LDUyMCArOCw1NzUgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKICNpbmNsdWRlIDxsaW1pdHMuaD4KLSNkZWZpbmUgX1NUUkVBTV9NQVhfU0laRV8JCTIwICogMTAyNCAqIDEwMjQKLUZYX0RXT1JEIF9BODVEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKLXsKLSAgICBkZXN0X3NpemUgPSAwOwotICAgIGRlc3RfYnVmID0gTlVMTDsKLSAgICBpZiAoc3JjX3NpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKKyNkZWZpbmUgX1NUUkVBTV9NQVhfU0laRV8gMjAgKiAxMDI0ICogMTAyNAorRlhfRFdPUkQgX0E4NURlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIGRlc3Rfc2l6ZSA9IDA7CisgIGRlc3RfYnVmID0gTlVMTDsKKyAgaWYgKHNyY19zaXplID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGWF9EV09SRCB6Y291bnQgPSAwOworICBGWF9EV09SRCBwb3MgPSAwOworICB3aGlsZSAocG9zIDwgc3JjX3NpemUpIHsKKyAgICB1aW50OF90IGNoID0gc3JjX2J1Zltwb3NdOworICAgIGlmIChjaCA8ICchJyAmJiBjaCAhPSAnXG4nICYmIGNoICE9ICdccicgJiYgY2ggIT0gJyAnICYmIGNoICE9ICdcdCcpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBGWF9EV09SRCB6Y291bnQgPSAwOwotICAgIEZYX0RXT1JEIHBvcyA9IDA7Ci0gICAgd2hpbGUgKHBvcyA8IHNyY19zaXplKSB7Ci0gICAgICAgIHVpbnQ4X3QgY2ggPSBzcmNfYnVmW3Bvc107Ci0gICAgICAgIGlmIChjaCA8ICchJyAmJiBjaCAhPSAnXG4nICYmIGNoICE9ICdccicgJiYgY2ggIT0gJyAnICYmIGNoICE9ICdcdCcpIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChjaCA9PSAneicpIHsKKyAgICAgIHpjb3VudCsrOworICAgIH0gZWxzZSBpZiAoY2ggPiAndScpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwb3MrKzsKKyAgfQorICBpZiAocG9zID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoemNvdW50ID4gVUlOVF9NQVggLyA0KSB7CisgICAgcmV0dXJuIChGWF9EV09SRCktMTsKKyAgfQorICBpZiAoemNvdW50ICogNCA+IFVJTlRfTUFYIC0gKHBvcyAtIHpjb3VudCkpIHsKKyAgICByZXR1cm4gKEZYX0RXT1JEKS0xOworICB9CisgIGRlc3RfYnVmID0gRlhfQWxsb2ModWludDhfdCwgemNvdW50ICogNCArIChwb3MgLSB6Y291bnQpKTsKKyAgaW50IHN0YXRlID0gMDsKKyAgdWludDMyX3QgcmVzID0gMDsKKyAgcG9zID0gZGVzdF9zaXplID0gMDsKKyAgd2hpbGUgKHBvcyA8IHNyY19zaXplKSB7CisgICAgdWludDhfdCBjaCA9IHNyY19idWZbcG9zKytdOworICAgIGlmIChjaCA9PSAnXG4nIHx8IGNoID09ICdccicgfHwgY2ggPT0gJyAnIHx8IGNoID09ICdcdCcpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoY2ggPT0gJ3onKSB7CisgICAgICBGWFNZU19tZW1zZXQoZGVzdF9idWYgKyBkZXN0X3NpemUsIDAsIDQpOworICAgICAgc3RhdGUgPSAwOworICAgICAgcmVzID0gMDsKKyAgICAgIGRlc3Rfc2l6ZSArPSA0OworICAgIH0gZWxzZSB7CisgICAgICBpZiAoY2ggPCAnIScgfHwgY2ggPiAndScpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXMgPSByZXMgKiA4NSArIGNoIC0gMzM7CisgICAgICBzdGF0ZSsrOworICAgICAgaWYgKHN0YXRlID09IDUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICBkZXN0X2J1ZltkZXN0X3NpemUrK10gPSAodWludDhfdCkocmVzID4+ICgzIC0gaSkgKiA4KTsKICAgICAgICAgfQotICAgICAgICBpZiAoY2ggPT0gJ3onKSB7Ci0gICAgICAgICAgICB6Y291bnQgKys7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPiAndScpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBvcyArKzsKKyAgICAgICAgc3RhdGUgPSAwOworICAgICAgICByZXMgPSAwOworICAgICAgfQogICAgIH0KLSAgICBpZiAocG9zID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHN0YXRlKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gc3RhdGU7IGkgPCA1OyBpKyspIHsKKyAgICAgIHJlcyA9IHJlcyAqIDg1ICsgODQ7CiAgICAgfQotICAgIGlmICh6Y291bnQgPiBVSU5UX01BWCAvIDQpIHsKLSAgICAgICAgcmV0dXJuIChGWF9EV09SRCkgLSAxOworICAgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZSAtIDE7IGkrKykgeworICAgICAgZGVzdF9idWZbZGVzdF9zaXplKytdID0gKHVpbnQ4X3QpKHJlcyA+PiAoMyAtIGkpICogOCk7CiAgICAgfQotICAgIGlmICh6Y291bnQgKiA0ID4gVUlOVF9NQVggLSAocG9zIC0gemNvdW50KSkgewotICAgICAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7Ci0gICAgfQotICAgIGRlc3RfYnVmID0gRlhfQWxsb2ModWludDhfdCwgemNvdW50ICogNCArIChwb3MgLSB6Y291bnQpKTsKLSAgICBpbnQgc3RhdGUgPSAwOwotICAgIHVpbnQzMl90IHJlcyA9IDA7Ci0gICAgcG9zID0gZGVzdF9zaXplID0gMDsKLSAgICB3aGlsZSAocG9zIDwgc3JjX3NpemUpIHsKLSAgICAgICAgdWludDhfdCBjaCA9IHNyY19idWZbcG9zKytdOwotICAgICAgICBpZiAoY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IGNoID09ICcgJyB8fCBjaCA9PSAnXHQnKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2ggPT0gJ3onKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQoZGVzdF9idWYgKyBkZXN0X3NpemUsIDAsIDQpOwotICAgICAgICAgICAgc3RhdGUgPSAwOwotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGRlc3Rfc2l6ZSArPSA0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGNoIDwgJyEnIHx8IGNoID4gJ3UnKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXMgPSByZXMgKiA4NSArIGNoIC0gMzM7Ci0gICAgICAgICAgICBzdGF0ZSArKzsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSA1KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3Rfc2l6ZSsrXSA9ICh1aW50OF90KShyZXMgPj4gKDMgLSBpKSAqIDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoc3RhdGUpIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IHN0YXRlOyBpIDwgNTsgaSArKykgewotICAgICAgICAgICAgcmVzID0gcmVzICogODUgKyA4NDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhdGUgLSAxOyBpICsrKSB7Ci0gICAgICAgICAgICBkZXN0X2J1ZltkZXN0X3NpemUrK10gPSAodWludDhfdCkocmVzID4+ICgzIC0gaSkgKiA4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocG9zIDwgc3JjX3NpemUgJiYgc3JjX2J1Zltwb3NdID09ICc+JykgewotICAgICAgICBwb3MgKys7Ci0gICAgfQotICAgIHJldHVybiBwb3M7CisgIH0KKyAgaWYgKHBvcyA8IHNyY19zaXplICYmIHNyY19idWZbcG9zXSA9PSAnPicpIHsKKyAgICBwb3MrKzsKKyAgfQorICByZXR1cm4gcG9zOwogfQotRlhfRFdPUkQgX0hleERlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIEZYX0RXT1JEIGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpICsrKQotICAgICAgICBpZiAoc3JjX2J1ZltpXSA9PSAnPicpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgZGVzdF9idWYgPSBGWF9BbGxvYyggdWludDhfdCwgaSAvIDIgKyAxKTsKLSAgICBkZXN0X3NpemUgPSAwOwotICAgIEZYX0JPT0wgYkZpcnN0RGlnaXQgPSBUUlVFOwotICAgIGZvciAoaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSArKykgewotICAgICAgICB1aW50OF90IGNoID0gc3JjX2J1ZltpXTsKLSAgICAgICAgaWYgKGNoID09ICcgJyB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGRpZ2l0OwotICAgICAgICBpZiAoY2ggPD0gJzknICYmIGNoID49ICcwJykgewotICAgICAgICAgICAgZGlnaXQgPSBjaCAtICcwJzsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnZicgJiYgY2ggPj0gJ2EnKSB7Ci0gICAgICAgICAgICBkaWdpdCA9IGNoIC0gJ2EnICsgMTA7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykgewotICAgICAgICAgICAgZGlnaXQgPSBjaCAtICdBJyArIDEwOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc+JykgewotICAgICAgICAgICAgaSArKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJGaXJzdERpZ2l0KSB7Ci0gICAgICAgICAgICBkZXN0X2J1ZltkZXN0X3NpemVdID0gZGlnaXQgKiAxNjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3Rfc2l6ZSArK10gKz0gZGlnaXQ7Ci0gICAgICAgIH0KLSAgICAgICAgYkZpcnN0RGlnaXQgPSAhYkZpcnN0RGlnaXQ7CitGWF9EV09SRCBfSGV4RGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIHsKKyAgRlhfRFdPUkQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpKyspCisgICAgaWYgKHNyY19idWZbaV0gPT0gJz4nKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgaWYgKCFiRmlyc3REaWdpdCkgewotICAgICAgICBkZXN0X3NpemUgKys7CisgIGRlc3RfYnVmID0gRlhfQWxsb2ModWludDhfdCwgaSAvIDIgKyAxKTsKKyAgZGVzdF9zaXplID0gMDsKKyAgRlhfQk9PTCBiRmlyc3REaWdpdCA9IFRSVUU7CisgIGZvciAoaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSsrKSB7CisgICAgdWludDhfdCBjaCA9IHNyY19idWZbaV07CisgICAgaWYgKGNoID09ICcgJyB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xyJykgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIHJldHVybiBpOworICAgIGludCBkaWdpdDsKKyAgICBpZiAoY2ggPD0gJzknICYmIGNoID49ICcwJykgeworICAgICAgZGlnaXQgPSBjaCAtICcwJzsKKyAgICB9IGVsc2UgaWYgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHsKKyAgICAgIGRpZ2l0ID0gY2ggLSAnYScgKyAxMDsKKyAgICB9IGVsc2UgaWYgKGNoIDw9ICdGJyAmJiBjaCA+PSAnQScpIHsKKyAgICAgIGRpZ2l0ID0gY2ggLSAnQScgKyAxMDsKKyAgICB9IGVsc2UgaWYgKGNoID09ICc+JykgeworICAgICAgaSsrOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoYkZpcnN0RGlnaXQpIHsKKyAgICAgIGRlc3RfYnVmW2Rlc3Rfc2l6ZV0gPSBkaWdpdCAqIDE2OworICAgIH0gZWxzZSB7CisgICAgICBkZXN0X2J1ZltkZXN0X3NpemUrK10gKz0gZGlnaXQ7CisgICAgfQorICAgIGJGaXJzdERpZ2l0ID0gIWJGaXJzdERpZ2l0OworICB9CisgIGlmICghYkZpcnN0RGlnaXQpIHsKKyAgICBkZXN0X3NpemUrKzsKKyAgfQorICByZXR1cm4gaTsKIH0KLUZYX0RXT1JEIFJ1bkxlbmd0aERlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIEZYX0RXT1JEIGkgPSAwOwotICAgIEZYX0RXT1JEIG9sZDsKLSAgICBkZXN0X3NpemUgPSAwOwotICAgIHdoaWxlIChpIDwgc3JjX3NpemUpIHsKLSAgICAgICAgaWYgKHNyY19idWZbaV0gPCAxMjgpIHsKLSAgICAgICAgICAgIG9sZCA9IGRlc3Rfc2l6ZTsKLSAgICAgICAgICAgIGRlc3Rfc2l6ZSArPSBzcmNfYnVmW2ldICsgMTsKLSAgICAgICAgICAgIGlmIChkZXN0X3NpemUgPCBvbGQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpICs9IHNyY19idWZbaV0gKyAyOwotICAgICAgICB9IGVsc2UgaWYgKHNyY19idWZbaV0gPiAxMjgpIHsKLSAgICAgICAgICAgIG9sZCA9IGRlc3Rfc2l6ZTsKLSAgICAgICAgICAgIGRlc3Rfc2l6ZSArPSAyNTcgLSBzcmNfYnVmW2ldOwotICAgICAgICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoRlhfRFdPUkQpIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CitGWF9EV09SRCBSdW5MZW5ndGhEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICBGWF9EV09SRCBpID0gMDsKKyAgRlhfRFdPUkQgb2xkOworICBkZXN0X3NpemUgPSAwOworICB3aGlsZSAoaSA8IHNyY19zaXplKSB7CisgICAgaWYgKHNyY19idWZbaV0gPCAxMjgpIHsKKyAgICAgIG9sZCA9IGRlc3Rfc2l6ZTsKKyAgICAgIGRlc3Rfc2l6ZSArPSBzcmNfYnVmW2ldICsgMTsKKyAgICAgIGlmIChkZXN0X3NpemUgPCBvbGQpIHsKKyAgICAgICAgcmV0dXJuIChGWF9EV09SRCktMTsKKyAgICAgIH0KKyAgICAgIGkgKz0gc3JjX2J1ZltpXSArIDI7CisgICAgfSBlbHNlIGlmIChzcmNfYnVmW2ldID4gMTI4KSB7CisgICAgICBvbGQgPSBkZXN0X3NpemU7CisgICAgICBkZXN0X3NpemUgKz0gMjU3IC0gc3JjX2J1ZltpXTsKKyAgICAgIGlmIChkZXN0X3NpemUgPCBvbGQpIHsKKyAgICAgICAgcmV0dXJuIChGWF9EV09SRCktMTsKKyAgICAgIH0KKyAgICAgIGkgKz0gMjsKKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmIChkZXN0X3NpemUgPj0gX1NUUkVBTV9NQVhfU0laRV8pIHsKLSAgICAgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChkZXN0X3NpemUgPj0gX1NUUkVBTV9NQVhfU0laRV8pIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZGVzdF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBkZXN0X3NpemUpOworICBpID0gMDsKKyAgaW50IGRlc3RfY291bnQgPSAwOworICB3aGlsZSAoaSA8IHNyY19zaXplKSB7CisgICAgaWYgKHNyY19idWZbaV0gPCAxMjgpIHsKKyAgICAgIEZYX0RXT1JEIGNvcHlfbGVuID0gc3JjX2J1ZltpXSArIDE7CisgICAgICBGWF9EV09SRCBidWZfbGVmdCA9IHNyY19zaXplIC0gaSAtIDE7CisgICAgICBpZiAoYnVmX2xlZnQgPCBjb3B5X2xlbikgeworICAgICAgICBGWF9EV09SRCBkZWx0YSA9IGNvcHlfbGVuIC0gYnVmX2xlZnQ7CisgICAgICAgIGNvcHlfbGVuID0gYnVmX2xlZnQ7CisgICAgICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiArIGRlc3RfY291bnQgKyBjb3B5X2xlbiwgJ1wwJywgZGVsdGEpOworICAgICAgfQorICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfYnVmICsgZGVzdF9jb3VudCwgc3JjX2J1ZiArIGkgKyAxLCBjb3B5X2xlbik7CisgICAgICBkZXN0X2NvdW50ICs9IHNyY19idWZbaV0gKyAxOworICAgICAgaSArPSBzcmNfYnVmW2ldICsgMjsKKyAgICB9IGVsc2UgaWYgKHNyY19idWZbaV0gPiAxMjgpIHsKKyAgICAgIGludCBmaWxsID0gMDsKKyAgICAgIGlmIChpIDwgc3JjX3NpemUgLSAxKSB7CisgICAgICAgIGZpbGwgPSBzcmNfYnVmW2kgKyAxXTsKKyAgICAgIH0KKyAgICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiArIGRlc3RfY291bnQsIGZpbGwsIDI1NyAtIHNyY19idWZbaV0pOworICAgICAgZGVzdF9jb3VudCArPSAyNTcgLSBzcmNfYnVmW2ldOworICAgICAgaSArPSAyOworICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgZGVzdF9idWYgPSBGWF9BbGxvYyggdWludDhfdCwgZGVzdF9zaXplKTsKLSAgICBpID0gMDsKLSAgICBpbnQgZGVzdF9jb3VudCA9IDA7Ci0gICAgd2hpbGUgKGkgPCBzcmNfc2l6ZSkgewotICAgICAgICBpZiAoc3JjX2J1ZltpXSA8IDEyOCkgewotICAgICAgICAgICAgRlhfRFdPUkQgY29weV9sZW4gPSBzcmNfYnVmW2ldICsgMTsKLSAgICAgICAgICAgIEZYX0RXT1JEIGJ1Zl9sZWZ0ID0gc3JjX3NpemUgLSBpIC0gMTsKLSAgICAgICAgICAgIGlmIChidWZfbGVmdCA8IGNvcHlfbGVuKSB7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVsdGEgPSBjb3B5X2xlbiAtIGJ1Zl9sZWZ0OwotICAgICAgICAgICAgICAgIGNvcHlfbGVuID0gYnVmX2xlZnQ7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmICsgZGVzdF9jb3VudCArIGNvcHlfbGVuLCAnXDAnLCBkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9idWYgKyBkZXN0X2NvdW50LCBzcmNfYnVmICsgaSArIDEsIGNvcHlfbGVuKTsKLSAgICAgICAgICAgIGRlc3RfY291bnQgKz0gc3JjX2J1ZltpXSArIDE7Ci0gICAgICAgICAgICBpICs9IHNyY19idWZbaV0gKyAyOwotICAgICAgICB9IGVsc2UgaWYgKHNyY19idWZbaV0gPiAxMjgpIHsKLSAgICAgICAgICAgIGludCBmaWxsID0gMDsKLSAgICAgICAgICAgIGlmIChpIDwgc3JjX3NpemUgLSAxKSB7Ci0gICAgICAgICAgICAgICAgZmlsbCA9IHNyY19idWZbaSArIDFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmICsgZGVzdF9jb3VudCwgZmlsbCwgMjU3IC0gc3JjX2J1ZltpXSk7Ci0gICAgICAgICAgICBkZXN0X2NvdW50ICs9IDI1NyAtIHNyY19idWZbaV07Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9EV09SRCByZXQgPSBpICsgMTsKLSAgICBpZiAocmV0ID4gc3JjX3NpemUpIHsKLSAgICAgICAgcmV0ID0gc3JjX3NpemU7Ci0gICAgfQotICAgIHJldHVybiByZXQ7CisgIH0KKyAgRlhfRFdPUkQgcmV0ID0gaSArIDE7CisgIGlmIChyZXQgPiBzcmNfc2l6ZSkgeworICAgIHJldCA9IHNyY19zaXplOworICB9CisgIHJldHVybiByZXQ7CiB9Ci1JQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBGUERGQVBJX0NyZWF0ZUZheERlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKQotewotICAgIGludCBLID0gMDsKLSAgICBGWF9CT09MIEVuZE9mTGluZSA9IEZBTFNFOwotICAgIEZYX0JPT0wgQnl0ZUFsaWduID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBCbGFja0lzMSA9IEZBTFNFOwotICAgIGludCBDb2x1bW5zID0gMTcyODsKLSAgICBpbnQgUm93cyA9IDA7Ci0gICAgaWYgKHBQYXJhbXMpIHsKLSAgICAgICAgSyA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIksiKSk7Ci0gICAgICAgIEVuZE9mTGluZSA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkVuZE9mTGluZSIpKTsKLSAgICAgICAgQnl0ZUFsaWduID0gcFBhcmFtcy0+R2V0SW50ZWdlcihGWF9CU1RSQygiRW5jb2RlZEJ5dGVBbGlnbiIpKTsKLSAgICAgICAgQmxhY2tJczEgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCbGFja0lzMSIpKTsKLSAgICAgICAgQ29sdW1ucyA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbHVtbnMiKSwgMTcyOCk7Ci0gICAgICAgIFJvd3MgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSb3dzIikpOwotICAgICAgICBpZiAoUm93cyA+IFVTSFJUX01BWCkgewotICAgICAgICAgICAgUm93cyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKENvbHVtbnMgPD0gMCB8fCBSb3dzIDwgMCB8fCBDb2x1bW5zID4gVVNIUlRfTUFYIHx8IFJvd3MgPiBVU0hSVF9NQVgpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CitJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBGUERGQVBJX0NyZWF0ZUZheERlY29kZXIoCisgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCwKKyAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpIHsKKyAgaW50IEsgPSAwOworICBGWF9CT09MIEVuZE9mTGluZSA9IEZBTFNFOworICBGWF9CT09MIEJ5dGVBbGlnbiA9IEZBTFNFOworICBGWF9CT09MIEJsYWNrSXMxID0gRkFMU0U7CisgIGludCBDb2x1bW5zID0gMTcyODsKKyAgaW50IFJvd3MgPSAwOworICBpZiAocFBhcmFtcykgeworICAgIEsgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJLIikpOworICAgIEVuZE9mTGluZSA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkVuZE9mTGluZSIpKTsKKyAgICBCeXRlQWxpZ24gPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJFbmNvZGVkQnl0ZUFsaWduIikpOworICAgIEJsYWNrSXMxID0gcFBhcmFtcy0+R2V0SW50ZWdlcihGWF9CU1RSQygiQmxhY2tJczEiKSk7CisgICAgQ29sdW1ucyA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbHVtbnMiKSwgMTcyOCk7CisgICAgUm93cyA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIlJvd3MiKSk7CisgICAgaWYgKFJvd3MgPiBVU0hSVF9NQVgpIHsKKyAgICAgIFJvd3MgPSAwOwogICAgIH0KLSAgICByZXR1cm4gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRGYXhNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcihzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIEssIEVuZE9mTGluZSwgQnl0ZUFsaWduLCBCbGFja0lzMSwgQ29sdW1ucywgUm93cyk7CisgICAgaWYgKENvbHVtbnMgPD0gMCB8fCBSb3dzIDwgMCB8fCBDb2x1bW5zID4gVVNIUlRfTUFYIHx8IFJvd3MgPiBVU0hSVF9NQVgpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICByZXR1cm4gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRGYXhNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcigKKyAgICAgIHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LCBLLCBFbmRPZkxpbmUsIEJ5dGVBbGlnbiwgQmxhY2tJczEsCisgICAgICBDb2x1bW5zLCBSb3dzKTsKIH0KLXN0YXRpYyBGWF9CT09MIENoZWNrRmxhdGVEZWNvZGVQYXJhbXMoaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKQotewotICAgIGlmIChDb2x1bW5zIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBjaGVjayA9IENvbHVtbnM7Ci0gICAgaWYgKENvbG9ycyA8IDAgfHwgKGNoZWNrID4gMCAmJiBDb2xvcnMgPiBJTlRfTUFYIC8gY2hlY2spKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgY2hlY2sgKj0gQ29sb3JzOwotICAgIGlmIChCaXRzUGVyQ29tcG9uZW50IDwgMCB8fAotICAgICAgICAgICAgKGNoZWNrID4gMCAmJiBCaXRzUGVyQ29tcG9uZW50ID4gSU5UX01BWCAvIGNoZWNrKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGNoZWNrICo9IEJpdHNQZXJDb21wb25lbnQ7Ci0gICAgaWYgKGNoZWNrID4gSU5UX01BWCAtIDcpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKK3N0YXRpYyBGWF9CT09MIENoZWNrRmxhdGVEZWNvZGVQYXJhbXMoaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zKSB7CisgIGlmIChDb2x1bW5zIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgY2hlY2sgPSBDb2x1bW5zOworICBpZiAoQ29sb3JzIDwgMCB8fCAoY2hlY2sgPiAwICYmIENvbG9ycyA+IElOVF9NQVggLyBjaGVjaykpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY2hlY2sgKj0gQ29sb3JzOworICBpZiAoQml0c1BlckNvbXBvbmVudCA8IDAgfHwKKyAgICAgIChjaGVjayA+IDAgJiYgQml0c1BlckNvbXBvbmVudCA+IElOVF9NQVggLyBjaGVjaykpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY2hlY2sgKj0gQml0c1BlckNvbXBvbmVudDsKKyAgaWYgKGNoZWNrID4gSU5UX01BWCAtIDcpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1JQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBGUERGQVBJX0NyZWF0ZUZsYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpCi17Ci0gICAgaW50IHByZWRpY3RvciA9IDA7Ci0gICAgaW50IENvbG9ycyA9IDAsIEJpdHNQZXJDb21wb25lbnQgPSAwLCBDb2x1bW5zID0gMDsKLSAgICBpZiAocFBhcmFtcykgewotICAgICAgICBwcmVkaWN0b3IgPSAoKENQREZfRGljdGlvbmFyeSopcFBhcmFtcyktPkdldEludGVnZXIoRlhfQlNUUkMoIlByZWRpY3RvciIpKTsKLSAgICAgICAgQ29sb3JzID0gcFBhcmFtcy0+R2V0SW50ZWdlcihGWF9CU1RSQygiQ29sb3JzIiksIDEpOwotICAgICAgICBCaXRzUGVyQ29tcG9uZW50ID0gcFBhcmFtcy0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpLCA4KTsKLSAgICAgICAgQ29sdW1ucyA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbHVtbnMiKSwgMSk7Ci0gICAgICAgIGlmICghQ2hlY2tGbGF0ZURlY29kZVBhcmFtcyhDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGbGF0ZURlY29kZXIoCisgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCwKKyAgICBpbnQgbkNvbXBzLAorICAgIGludCBicGMsCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKSB7CisgIGludCBwcmVkaWN0b3IgPSAwOworICBpbnQgQ29sb3JzID0gMCwgQml0c1BlckNvbXBvbmVudCA9IDAsIENvbHVtbnMgPSAwOworICBpZiAocFBhcmFtcykgeworICAgIHByZWRpY3RvciA9ICgoQ1BERl9EaWN0aW9uYXJ5KilwUGFyYW1zKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiUHJlZGljdG9yIikpOworICAgIENvbG9ycyA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbG9ycyIpLCAxKTsKKyAgICBCaXRzUGVyQ29tcG9uZW50ID0gcFBhcmFtcy0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpLCA4KTsKKyAgICBDb2x1bW5zID0gcFBhcmFtcy0+R2V0SW50ZWdlcihGWF9CU1RSQygiQ29sdW1ucyIpLCAxKTsKKyAgICBpZiAoIUNoZWNrRmxhdGVEZWNvZGVQYXJhbXMoQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKSkgeworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEZsYXRlTW9kdWxlKCktPkNyZWF0ZURlY29kZXIoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBuQ29tcHMsIGJwYywgcHJlZGljdG9yLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpOworICB9CisgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEZsYXRlTW9kdWxlKCktPkNyZWF0ZURlY29kZXIoCisgICAgICBzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgbkNvbXBzLCBicGMsIHByZWRpY3RvciwgQ29sb3JzLAorICAgICAgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucyk7CiB9Ci1GWF9EV09SRCBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgaW50IHByZWRpY3RvciA9IDA7Ci0gICAgRlhfQk9PTCBiRWFybHlDaGFuZ2UgPSBUUlVFOwotICAgIGludCBDb2xvcnMgPSAwLCBCaXRzUGVyQ29tcG9uZW50ID0gMCwgQ29sdW1ucyA9IDA7Ci0gICAgaWYgKHBQYXJhbXMpIHsKLSAgICAgICAgcHJlZGljdG9yID0gKChDUERGX0RpY3Rpb25hcnkqKXBQYXJhbXMpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQcmVkaWN0b3IiKSk7Ci0gICAgICAgIGJFYXJseUNoYW5nZSA9ICgoQ1BERl9EaWN0aW9uYXJ5KilwUGFyYW1zKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiRWFybHlDaGFuZ2UiKSwgMSk7Ci0gICAgICAgIENvbG9ycyA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbG9ycyIpLCAxKTsKLSAgICAgICAgQml0c1BlckNvbXBvbmVudCA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSwgOCk7Ci0gICAgICAgIENvbHVtbnMgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJDb2x1bW5zIiksIDEpOwotICAgICAgICBpZiAoIUNoZWNrRmxhdGVEZWNvZGVQYXJhbXMoQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKSkgewotICAgICAgICAgICAgcmV0dXJuIChGWF9EV09SRCkgLSAxOwotICAgICAgICB9CitGWF9EV09SRCBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIGludCBwcmVkaWN0b3IgPSAwOworICBGWF9CT09MIGJFYXJseUNoYW5nZSA9IFRSVUU7CisgIGludCBDb2xvcnMgPSAwLCBCaXRzUGVyQ29tcG9uZW50ID0gMCwgQ29sdW1ucyA9IDA7CisgIGlmIChwUGFyYW1zKSB7CisgICAgcHJlZGljdG9yID0gKChDUERGX0RpY3Rpb25hcnkqKXBQYXJhbXMpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQcmVkaWN0b3IiKSk7CisgICAgYkVhcmx5Q2hhbmdlID0KKyAgICAgICAgKChDUERGX0RpY3Rpb25hcnkqKXBQYXJhbXMpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJFYXJseUNoYW5nZSIpLCAxKTsKKyAgICBDb2xvcnMgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJDb2xvcnMiKSwgMSk7CisgICAgQml0c1BlckNvbXBvbmVudCA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSwgOCk7CisgICAgQ29sdW1ucyA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbHVtbnMiKSwgMSk7CisgICAgaWYgKCFDaGVja0ZsYXRlRGVjb2RlUGFyYW1zKENvbG9ycywgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucykpIHsKKyAgICAgIHJldHVybiAoRlhfRFdPUkQpLTE7CiAgICAgfQotICAgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEZsYXRlTW9kdWxlKCktPkZsYXRlT3JMWldEZWNvZGUoYkxaVywgc3JjX2J1Ziwgc3JjX3NpemUsCi0gICAgICAgICAgICBiRWFybHlDaGFuZ2UsIHByZWRpY3RvciwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zLCBlc3RpbWF0ZWRfc2l6ZSwKLSAgICAgICAgICAgIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICB9CisgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEZsYXRlTW9kdWxlKCktPkZsYXRlT3JMWldEZWNvZGUoCisgICAgICBiTFpXLCBzcmNfYnVmLCBzcmNfc2l6ZSwgYkVhcmx5Q2hhbmdlLCBwcmVkaWN0b3IsIENvbG9ycywKKyAgICAgIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMsIGVzdGltYXRlZF9zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKIH0KLUZYX0JPT0wgUERGX0RhdGFEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwgQ0ZYX0J5dGVTdHJpbmcmIEltYWdlRW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSomIHBJbWFnZVBhcm1zLCBGWF9EV09SRCBsYXN0X2VzdGltYXRlZF9zaXplLCBGWF9CT09MIGJJbWFnZUFjYykKK0ZYX0JPT0wgUERGX0RhdGFEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIEltYWdlRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSomIHBJbWFnZVBhcm1zLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBsYXN0X2VzdGltYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbWFnZUFjYykKIAogewotICAgIENQREZfT2JqZWN0KiBwRGVjb2RlciA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRmlsdGVyIikpIDogTlVMTDsKLSAgICBpZiAocERlY29kZXIgPT0gTlVMTCB8fCAocERlY29kZXItPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkgJiYgcERlY29kZXItPkdldFR5cGUoKSAhPSBQREZPQkpfTkFNRSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICBDUERGX09iamVjdCogcERlY29kZXIgPQorICAgICAgcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJGaWx0ZXIiKSkgOiBOVUxMOworICBpZiAocERlY29kZXIgPT0gTlVMTCB8fCAocERlY29kZXItPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05BTUUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfT2JqZWN0KiBwUGFyYW1zID0KKyAgICAgIHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRGVjb2RlUGFybXMiKSkgOiBOVUxMOworICBDRlhfQnl0ZVN0cmluZ0FycmF5IERlY29kZXJMaXN0OworICBDRlhfUHRyQXJyYXkgUGFyYW1MaXN0OworICBpZiAocERlY29kZXItPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICBpZiAocFBhcmFtcyAmJiBwUGFyYW1zLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CisgICAgICBwUGFyYW1zID0gTlVMTDsKICAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBQYXJhbXMgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkRlY29kZVBhcm1zIikpIDogTlVMTDsKLSAgICBDRlhfQnl0ZVN0cmluZ0FycmF5IERlY29kZXJMaXN0OwotICAgIENGWF9QdHJBcnJheSBQYXJhbUxpc3Q7Ci0gICAgaWYgKHBEZWNvZGVyLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIGlmIChwUGFyYW1zICYmIHBQYXJhbXMtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIHBQYXJhbXMgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIENQREZfQXJyYXkqIHBEZWNvZGVycyA9IChDUERGX0FycmF5KilwRGVjb2RlcjsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBEZWNvZGVycy0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHN0ciA9IHBEZWNvZGVycy0+R2V0Q29uc3RTdHJpbmcoaSk7Ci0gICAgICAgICAgICBEZWNvZGVyTGlzdC5BZGQoc3RyKTsKLSAgICAgICAgICAgIGlmIChwUGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1MaXN0LkFkZCgoKENQREZfQXJyYXkqKXBQYXJhbXMpLT5HZXREaWN0KGkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1MaXN0LkFkZChOVUxMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIENQREZfQXJyYXkqIHBEZWNvZGVycyA9IChDUERGX0FycmF5KilwRGVjb2RlcjsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcERlY29kZXJzLT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nQyBzdHIgPSBwRGVjb2RlcnMtPkdldENvbnN0U3RyaW5nKGkpOworICAgICAgRGVjb2Rlckxpc3QuQWRkKHN0cik7CisgICAgICBpZiAocFBhcmFtcykgeworICAgICAgICBQYXJhbUxpc3QuQWRkKCgoQ1BERl9BcnJheSopcFBhcmFtcyktPkdldERpY3QoaSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUGFyYW1MaXN0LkFkZChOVUxMKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgRGVjb2Rlckxpc3QuQWRkKHBEZWNvZGVyLT5HZXRDb25zdFN0cmluZygpKTsKKyAgICBQYXJhbUxpc3QuQWRkKHBQYXJhbXMgPyBwUGFyYW1zLT5HZXREaWN0KCkgOiBOVUxMKTsKKyAgfQorICB1aW50OF90KiBsYXN0X2J1ZiA9ICh1aW50OF90KilzcmNfYnVmOworICBGWF9EV09SRCBsYXN0X3NpemUgPSBzcmNfc2l6ZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBEZWNvZGVyTGlzdC5HZXRTaXplKCk7IGkrKykgeworICAgIGludCBlc3RpbWF0ZWRfc2l6ZSA9CisgICAgICAgIGkgPT0gRGVjb2Rlckxpc3QuR2V0U2l6ZSgpIC0gMSA/IGxhc3RfZXN0aW1hdGVkX3NpemUgOiAwOworICAgIENGWF9CeXRlU3RyaW5nIGRlY29kZXIgPSBEZWNvZGVyTGlzdFtpXTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbSA9IChDUERGX0RpY3Rpb25hcnkqKVBhcmFtTGlzdFtpXTsKKyAgICB1aW50OF90KiBuZXdfYnVmID0gTlVMTDsKKyAgICBGWF9EV09SRCBuZXdfc2l6ZSA9IChGWF9EV09SRCktMTsKKyAgICBpbnQgb2Zmc2V0ID0gLTE7CisgICAgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkZsYXRlRGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiRmwiKSkgeworICAgICAgaWYgKGJJbWFnZUFjYyAmJiBpID09IERlY29kZXJMaXN0LkdldFNpemUoKSAtIDEpIHsKKyAgICAgICAgSW1hZ2VFbmNvZGluZyA9IEZYX0JTVFJDKCJGbGF0ZURlY29kZSIpOworICAgICAgICBkZXN0X2J1ZiA9ICh1aW50OF90KilsYXN0X2J1ZjsKKyAgICAgICAgZGVzdF9zaXplID0gbGFzdF9zaXplOworICAgICAgICBwSW1hZ2VQYXJtcyA9IHBQYXJhbTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgICBvZmZzZXQgPSBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRkFMU0UsIGxhc3RfYnVmLCBsYXN0X3NpemUsIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOworICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiTFpXRGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiTFpXIikpIHsKKyAgICAgIG9mZnNldCA9IEZQREZBUElfRmxhdGVPckxaV0RlY29kZShUUlVFLCBsYXN0X2J1ZiwgbGFzdF9zaXplLCBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkX3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKKyAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkFTQ0lJODVEZWNvZGUiKSB8fAorICAgICAgICAgICAgICAgZGVjb2RlciA9PSBGWF9CU1RSQygiQTg1IikpIHsKKyAgICAgIG9mZnNldCA9IF9BODVEZWNvZGUobGFzdF9idWYsIGxhc3Rfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOworICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiQVNDSUlIZXhEZWNvZGUiKSB8fAorICAgICAgICAgICAgICAgZGVjb2RlciA9PSBGWF9CU1RSQygiQUh4IikpIHsKKyAgICAgIG9mZnNldCA9IF9IZXhEZWNvZGUobGFzdF9idWYsIGxhc3Rfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOworICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiUnVuTGVuZ3RoRGVjb2RlIikgfHwKKyAgICAgICAgICAgICAgIGRlY29kZXIgPT0gRlhfQlNUUkMoIlJMIikpIHsKKyAgICAgIGlmIChiSW1hZ2VBY2MgJiYgaSA9PSBEZWNvZGVyTGlzdC5HZXRTaXplKCkgLSAxKSB7CisgICAgICAgIEltYWdlRW5jb2RpbmcgPSBGWF9CU1RSQygiUnVuTGVuZ3RoRGVjb2RlIik7CisgICAgICAgIGRlc3RfYnVmID0gKHVpbnQ4X3QqKWxhc3RfYnVmOworICAgICAgICBkZXN0X3NpemUgPSBsYXN0X3NpemU7CisgICAgICAgIHBJbWFnZVBhcm1zID0gcFBhcmFtOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCA9IFJ1bkxlbmd0aERlY29kZShsYXN0X2J1ZiwgbGFzdF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgRGVjb2Rlckxpc3QuQWRkKHBEZWNvZGVyLT5HZXRDb25zdFN0cmluZygpKTsKLSAgICAgICAgUGFyYW1MaXN0LkFkZChwUGFyYW1zID8gcFBhcmFtcy0+R2V0RGljdCgpIDogTlVMTCk7CisgICAgICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiRENUIikpIHsKKyAgICAgICAgZGVjb2RlciA9ICJEQ1REZWNvZGUiOworICAgICAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJDQ0YiKSkgeworICAgICAgICBkZWNvZGVyID0gIkNDSVRURmF4RGVjb2RlIjsKKyAgICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiQ3J5cHQiKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEltYWdlRW5jb2RpbmcgPSBkZWNvZGVyOworICAgICAgcEltYWdlUGFybXMgPSBwUGFyYW07CisgICAgICBkZXN0X2J1ZiA9ICh1aW50OF90KilsYXN0X2J1ZjsKKyAgICAgIGRlc3Rfc2l6ZSA9IGxhc3Rfc2l6ZTsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICB1aW50OF90KiBsYXN0X2J1ZiA9ICh1aW50OF90KilzcmNfYnVmOwotICAgIEZYX0RXT1JEIGxhc3Rfc2l6ZSA9IHNyY19zaXplOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRGVjb2Rlckxpc3QuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIGludCBlc3RpbWF0ZWRfc2l6ZSA9IGkgPT0gRGVjb2Rlckxpc3QuR2V0U2l6ZSgpIC0gMSA/IGxhc3RfZXN0aW1hdGVkX3NpemUgOiAwOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBkZWNvZGVyID0gRGVjb2Rlckxpc3RbaV07Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhcmFtID0gKENQREZfRGljdGlvbmFyeSopUGFyYW1MaXN0W2ldOwotICAgICAgICB1aW50OF90KiBuZXdfYnVmID0gTlVMTDsKLSAgICAgICAgRlhfRFdPUkQgbmV3X3NpemUgPSAoRlhfRFdPUkQpIC0gMTsKLSAgICAgICAgaW50IG9mZnNldCA9IC0xOwotICAgICAgICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiRmxhdGVEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJGbCIpKSB7Ci0gICAgICAgICAgICBpZiAoYkltYWdlQWNjICYmIGkgPT0gRGVjb2Rlckxpc3QuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICAgICAgICAgIEltYWdlRW5jb2RpbmcgPSBGWF9CU1RSQygiRmxhdGVEZWNvZGUiKTsKLSAgICAgICAgICAgICAgICBkZXN0X2J1ZiA9ICh1aW50OF90KilsYXN0X2J1ZjsKLSAgICAgICAgICAgICAgICBkZXN0X3NpemUgPSBsYXN0X3NpemU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGFybXMgPSBwUGFyYW07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgPSBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRkFMU0UsIGxhc3RfYnVmLCBsYXN0X3NpemUsIHBQYXJhbSwgZXN0aW1hdGVkX3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKLSAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJMWldEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJMWlciKSkgewotICAgICAgICAgICAgb2Zmc2V0ID0gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKFRSVUUsIGxhc3RfYnVmLCBsYXN0X3NpemUsIHBQYXJhbSwgZXN0aW1hdGVkX3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKLSAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJBU0NJSTg1RGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiQTg1IikpIHsKLSAgICAgICAgICAgIG9mZnNldCA9IF9BODVEZWNvZGUobGFzdF9idWYsIGxhc3Rfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOwotICAgICAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkFTQ0lJSGV4RGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiQUh4IikpIHsKLSAgICAgICAgICAgIG9mZnNldCA9IF9IZXhEZWNvZGUobGFzdF9idWYsIGxhc3Rfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOwotICAgICAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIlJ1bkxlbmd0aERlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIlJMIikpIHsKLSAgICAgICAgICAgIGlmIChiSW1hZ2VBY2MgJiYgaSA9PSBEZWNvZGVyTGlzdC5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VFbmNvZGluZyA9IEZYX0JTVFJDKCJSdW5MZW5ndGhEZWNvZGUiKTsKLSAgICAgICAgICAgICAgICBkZXN0X2J1ZiA9ICh1aW50OF90KilsYXN0X2J1ZjsKLSAgICAgICAgICAgICAgICBkZXN0X3NpemUgPSBsYXN0X3NpemU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGFybXMgPSBwUGFyYW07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgPSBSdW5MZW5ndGhEZWNvZGUobGFzdF9idWYsIGxhc3Rfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkRDVCIpKSB7Ci0gICAgICAgICAgICAgICAgZGVjb2RlciA9ICJEQ1REZWNvZGUiOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJDQ0YiKSkgewotICAgICAgICAgICAgICAgIGRlY29kZXIgPSAiQ0NJVFRGYXhEZWNvZGUiOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJDcnlwdCIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbWFnZUVuY29kaW5nID0gZGVjb2RlcjsKLSAgICAgICAgICAgIHBJbWFnZVBhcm1zID0gcFBhcmFtOwotICAgICAgICAgICAgZGVzdF9idWYgPSAodWludDhfdCopbGFzdF9idWY7Ci0gICAgICAgICAgICBkZXN0X3NpemUgPSBsYXN0X3NpemU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGFzdF9idWYgIT0gc3JjX2J1ZikgewotICAgICAgICAgICAgRlhfRnJlZShsYXN0X2J1Zik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGxhc3RfYnVmID0gbmV3X2J1ZjsKLSAgICAgICAgbGFzdF9zaXplID0gbmV3X3NpemU7CisgICAgaWYgKGxhc3RfYnVmICE9IHNyY19idWYpIHsKKyAgICAgIEZYX0ZyZWUobGFzdF9idWYpOwogICAgIH0KLSAgICBJbWFnZUVuY29kaW5nID0gIiI7Ci0gICAgcEltYWdlUGFybXMgPSBOVUxMOwotICAgIGRlc3RfYnVmID0gbGFzdF9idWY7Ci0gICAgZGVzdF9zaXplID0gbGFzdF9zaXplOwotICAgIHJldHVybiBUUlVFOworICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgbGFzdF9idWYgPSBuZXdfYnVmOworICAgIGxhc3Rfc2l6ZSA9IG5ld19zaXplOworICB9CisgIEltYWdlRW5jb2RpbmcgPSAiIjsKKyAgcEltYWdlUGFybXMgPSBOVUxMOworICBkZXN0X2J1ZiA9IGxhc3RfYnVmOworICBkZXN0X3NpemUgPSBsYXN0X3NpemU7CisgIHJldHVybiBUUlVFOwogfQogZXh0ZXJuIGNvbnN0IEZYX1dPUkQgUERGRG9jRW5jb2RpbmdbMjU2XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywgMHgwMDA4LCAweDAwMDksCi0gICAgMHgwMDBhLCAweDAwMGIsIDB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwgMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAotICAgIDB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywgMHgwMmQ4LCAweDAyYzcsIDB4MDJjNiwgMHgwMmQ5LCAweDAyZGQsIDB4MDJkYiwKLSAgICAweDAyZGEsIDB4MDJkYywgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCi0gICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKLSAgICAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsCi0gICAgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAotICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwKLSAgICAweDAwNWEsIDB4MDA1YiwgMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCi0gICAgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLAotICAgIDB4MDA2ZSwgMHgwMDZmLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKLSAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDAwMCwgMHgyMDIyLCAweDIwMjAsCi0gICAgMHgyMDIxLCAweDIwMjYsIDB4MjAxNCwgMHgyMDEzLCAweDAxOTIsIDB4MjA0NCwgMHgyMDM5LCAweDIwM2EsIDB4MjIxMiwgMHgyMDMwLAotICAgIDB4MjAxZSwgMHgyMDFjLCAweDIwMWQsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWEsIDB4MjEyMiwgMHhmYjAxLCAweGZiMDIsIDB4MDE0MSwKLSAgICAweDAxNTIsIDB4MDE2MCwgMHgwMTc4LCAweDAxN2QsIDB4MDEzMSwgMHgwMTQyLCAweDAxNTMsIDB4MDE2MSwgMHgwMTdlLCAweDAwMDAsCi0gICAgMHgyMGFjLCAweDAwYTEsIDB4MDBhMiwgMHgwMGEzLCAweDAwYTQsIDB4MDBhNSwgMHgwMGE2LCAweDAwYTcsIDB4MDBhOCwgMHgwMGE5LAotICAgIDB4MDBhYSwgMHgwMGFiLCAweDAwYWMsIDB4MDAwMCwgMHgwMGFlLCAweDAwYWYsIDB4MDBiMCwgMHgwMGIxLCAweDAwYjIsIDB4MDBiMywKLSAgICAweDAwYjQsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsIDB4MDBiOCwgMHgwMGI5LCAweDAwYmEsIDB4MDBiYiwgMHgwMGJjLCAweDAwYmQsCi0gICAgMHgwMGJlLCAweDAwYmYsIDB4MDBjMCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMywgMHgwMGM0LCAweDAwYzUsIDB4MDBjNiwgMHgwMGM3LAotICAgIDB4MDBjOCwgMHgwMGM5LCAweDAwY2EsIDB4MDBjYiwgMHgwMGNjLCAweDAwY2QsIDB4MDBjZSwgMHgwMGNmLCAweDAwZDAsIDB4MDBkMSwKLSAgICAweDAwZDIsIDB4MDBkMywgMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgwMGQ3LCAweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsCi0gICAgMHgwMGRjLCAweDAwZGQsIDB4MDBkZSwgMHgwMGRmLCAweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LAotICAgIDB4MDBlNiwgMHgwMGU3LCAweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKLSAgICAweDAwZjAsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsIDB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywgMHgwMGY4LCAweDAwZjksCi0gICAgMHgwMGZhLCAweDAwZmIsIDB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZgotfTsKLUNGWF9XaWRlU3RyaW5nIFBERl9EZWNvZGVUZXh0KGNvbnN0IHVpbnQ4X3QqIHNyY19kYXRhLCBGWF9EV09SRCBzcmNfbGVuLCBDRlhfQ2hhck1hcCogcENoYXJNYXApCi17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OwotICAgIGlmIChzcmNfbGVuID49IDIgJiYgKChzcmNfZGF0YVswXSA9PSAweGZlICYmIHNyY19kYXRhWzFdID09IDB4ZmYpIHx8IChzcmNfZGF0YVswXSA9PSAweGZmICYmIHNyY19kYXRhWzFdID09IDB4ZmUpKSkgewotICAgICAgICBGWF9CT09MIGJCRSA9IHNyY19kYXRhWzBdID09IDB4ZmU7Ci0gICAgICAgIEZYX0RXT1JEIG1heF9jaGFycyA9IChzcmNfbGVuIC0gMikgLyAyOwotICAgICAgICBpZiAoIW1heF9jaGFycykgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2RhdGFbMF0gPT0gMHhmZikgewotICAgICAgICAgICAgYkJFID0gIXNyY19kYXRhWzJdOwotICAgICAgICB9Ci0gICAgICAgIEZYX1dDSEFSKiBkZXN0X2J1ZiA9IHJlc3VsdC5HZXRCdWZmZXIobWF4X2NoYXJzKTsKLSAgICAgICAgY29uc3QgdWludDhfdCogdW5pX3N0ciA9IHNyY19kYXRhICsgMjsKLSAgICAgICAgaW50IGRlc3RfcG9zID0gMDsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1heF9jaGFycyAqIDI7IGkgKz0gMikgewotICAgICAgICAgICAgRlhfV09SRCB1bmljb2RlID0gYkJFID8gKHVuaV9zdHJbaV0gPDwgOCB8IHVuaV9zdHJbaSArIDFdKSA6ICh1bmlfc3RyW2kgKyAxXSA8PCA4IHwgdW5pX3N0cltpXSk7Ci0gICAgICAgICAgICBpZiAodW5pY29kZSA9PSAweDFiKSB7Ci0gICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbWF4X2NoYXJzICogMikgewotICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHVuaWNvZGUgPSBiQkUgPyAodW5pX3N0cltpXSA8PCA4IHwgdW5pX3N0cltpICsgMV0pIDogKHVuaV9zdHJbaSArIDFdIDw8IDggfCB1bmlfc3RyW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgICAgICBpZiAodW5pY29kZSA9PSAweDFiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9idWZbZGVzdF9wb3MrK10gPSB1bmljb2RlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKGRlc3RfcG9zKTsKLSAgICB9IGVsc2UgaWYgKHBDaGFyTWFwID09IE5VTEwpIHsKLSAgICAgICAgRlhfV0NIQVIqIGRlc3RfYnVmID0gcmVzdWx0LkdldEJ1ZmZlcihzcmNfbGVuKTsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHNyY19sZW47IGkgKyspIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2ldID0gUERGRG9jRW5jb2Rpbmdbc3JjX2RhdGFbaV1dOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKHNyY19sZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAoKnBDaGFyTWFwLT5tX0dldFdpZGVTdHJpbmcpKHBDaGFyTWFwLCBDRlhfQnl0ZVN0cmluZygoY29uc3QgRlhfQ0hBUiopc3JjX2RhdGEsIHNyY19sZW4pKTsKKyAgICAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywgMHgwMDA4LAorICAgIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsIDB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwgMHgwMDEwLCAweDAwMTEsCisgICAgMHgwMDEyLCAweDAwMTMsIDB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywgMHgwMmQ4LCAweDAyYzcsIDB4MDJjNiwKKyAgICAweDAyZDksIDB4MDJkZCwgMHgwMmRiLCAweDAyZGEsIDB4MDJkYywgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorICAgIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsCisgICAgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwKKyAgICAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLAorICAgIDB4MDAzZiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsIDB4MDA1MCwKKyAgICAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAorICAgIDB4MDA1YSwgMHgwMDViLCAweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsCisgICAgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKyAgICAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LAorICAgIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwgMHgwMDdjLCAweDAwN2QsCisgICAgMHgwMDdlLCAweDAwMDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LCAweDIwMTMsIDB4MDE5MiwKKyAgICAweDIwNDQsIDB4MjAzOSwgMHgyMDNhLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFlLCAweDIwMWMsIDB4MjAxZCwgMHgyMDE4LAorICAgIDB4MjAxOSwgMHgyMDFhLCAweDIxMjIsIDB4ZmIwMSwgMHhmYjAyLCAweDAxNDEsIDB4MDE1MiwgMHgwMTYwLCAweDAxNzgsCisgICAgMHgwMTdkLCAweDAxMzEsIDB4MDE0MiwgMHgwMTUzLCAweDAxNjEsIDB4MDE3ZSwgMHgwMDAwLCAweDIwYWMsIDB4MDBhMSwKKyAgICAweDAwYTIsIDB4MDBhMywgMHgwMGE0LCAweDAwYTUsIDB4MDBhNiwgMHgwMGE3LCAweDAwYTgsIDB4MDBhOSwgMHgwMGFhLAorICAgIDB4MDBhYiwgMHgwMGFjLCAweDAwMDAsIDB4MDBhZSwgMHgwMGFmLCAweDAwYjAsIDB4MDBiMSwgMHgwMGIyLCAweDAwYjMsCisgICAgMHgwMGI0LCAweDAwYjUsIDB4MDBiNiwgMHgwMGI3LCAweDAwYjgsIDB4MDBiOSwgMHgwMGJhLCAweDAwYmIsIDB4MDBiYywKKyAgICAweDAwYmQsIDB4MDBiZSwgMHgwMGJmLCAweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsIDB4MDBjNCwgMHgwMGM1LAorICAgIDB4MDBjNiwgMHgwMGM3LCAweDAwYzgsIDB4MDBjOSwgMHgwMGNhLCAweDAwY2IsIDB4MDBjYywgMHgwMGNkLCAweDAwY2UsCisgICAgMHgwMGNmLCAweDAwZDAsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsIDB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKKyAgICAweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsIDB4MDBkYywgMHgwMGRkLCAweDAwZGUsIDB4MDBkZiwgMHgwMGUwLAorICAgIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywgMHgwMGU4LCAweDAwZTksCisgICAgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwgMHgwMGYwLCAweDAwZjEsIDB4MDBmMiwKKyAgICAweDAwZjMsIDB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywgMHgwMGY4LCAweDAwZjksIDB4MDBmYSwgMHgwMGZiLAorICAgIDB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZn07CitDRlhfV2lkZVN0cmluZyBQREZfRGVjb2RlVGV4dChjb25zdCB1aW50OF90KiBzcmNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ2hhck1hcCogcENoYXJNYXApIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICBpZiAoc3JjX2xlbiA+PSAyICYmICgoc3JjX2RhdGFbMF0gPT0gMHhmZSAmJiBzcmNfZGF0YVsxXSA9PSAweGZmKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAoc3JjX2RhdGFbMF0gPT0gMHhmZiAmJiBzcmNfZGF0YVsxXSA9PSAweGZlKSkpIHsKKyAgICBGWF9CT09MIGJCRSA9IHNyY19kYXRhWzBdID09IDB4ZmU7CisgICAgRlhfRFdPUkQgbWF4X2NoYXJzID0gKHNyY19sZW4gLSAyKSAvIDI7CisgICAgaWYgKCFtYXhfY2hhcnMpIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIHJldHVybiByZXN1bHQ7CisgICAgaWYgKHNyY19kYXRhWzBdID09IDB4ZmYpIHsKKyAgICAgIGJCRSA9ICFzcmNfZGF0YVsyXTsKKyAgICB9CisgICAgRlhfV0NIQVIqIGRlc3RfYnVmID0gcmVzdWx0LkdldEJ1ZmZlcihtYXhfY2hhcnMpOworICAgIGNvbnN0IHVpbnQ4X3QqIHVuaV9zdHIgPSBzcmNfZGF0YSArIDI7CisgICAgaW50IGRlc3RfcG9zID0gMDsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbWF4X2NoYXJzICogMjsgaSArPSAyKSB7CisgICAgICBGWF9XT1JEIHVuaWNvZGUgPSBiQkUgPyAodW5pX3N0cltpXSA8PCA4IHwgdW5pX3N0cltpICsgMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodW5pX3N0cltpICsgMV0gPDwgOCB8IHVuaV9zdHJbaV0pOworICAgICAgaWYgKHVuaWNvZGUgPT0gMHgxYikgeworICAgICAgICBpICs9IDI7CisgICAgICAgIHdoaWxlIChpIDwgbWF4X2NoYXJzICogMikgeworICAgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IGJCRSA/ICh1bmlfc3RyW2ldIDw8IDggfCB1bmlfc3RyW2kgKyAxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodW5pX3N0cltpICsgMV0gPDwgOCB8IHVuaV9zdHJbaV0pOworICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICBpZiAodW5pY29kZSA9PSAweDFiKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3RfYnVmW2Rlc3RfcG9zKytdID0gdW5pY29kZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoZGVzdF9wb3MpOworICB9IGVsc2UgaWYgKHBDaGFyTWFwID09IE5VTEwpIHsKKyAgICBGWF9XQ0hBUiogZGVzdF9idWYgPSByZXN1bHQuR2V0QnVmZmVyKHNyY19sZW4pOworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzcmNfbGVuOyBpKyspIHsKKyAgICAgIGRlc3RfYnVmW2ldID0gUERGRG9jRW5jb2Rpbmdbc3JjX2RhdGFbaV1dOworICAgIH0KKyAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihzcmNfbGVuKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKCpwQ2hhck1hcC0+bV9HZXRXaWRlU3RyaW5nKSgKKyAgICAgICAgcENoYXJNYXAsIENGWF9CeXRlU3RyaW5nKChjb25zdCBGWF9DSEFSKilzcmNfZGF0YSwgc3JjX2xlbikpOworICB9CisgIHJldHVybiByZXN1bHQ7CiB9Ci1DRlhfQnl0ZVN0cmluZyBQREZfRW5jb2RlVGV4dChjb25zdCBGWF9XQ0hBUiogcFN0cmluZywgaW50IGxlbiwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwKQotewotICAgIGlmIChsZW4gPT0gLTEpIHsKLSAgICAgICAgbGVuID0gRlhTWVNfd2NzbGVuKHBTdHJpbmcpOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7Ci0gICAgaWYgKHBDaGFyTWFwID09IE5VTEwpIHsKLSAgICAgICAgRlhfQ0hBUiogZGVzdF9idWYxID0gcmVzdWx0LkdldEJ1ZmZlcihsZW4pOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArKykgewotICAgICAgICAgICAgaW50IGNvZGU7Ci0gICAgICAgICAgICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgMjU2OyBjb2RlICsrKQotICAgICAgICAgICAgICAgIGlmIChQREZEb2NFbmNvZGluZ1tjb2RlXSA9PSBwU3RyaW5nW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb2RlID09IDI1NikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9idWYxW2ldID0gY29kZTsKK0NGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVUZXh0KGNvbnN0IEZYX1dDSEFSKiBwU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DaGFyTWFwKiBwQ2hhck1hcCkgeworICBpZiAobGVuID09IC0xKSB7CisgICAgbGVuID0gRlhTWVNfd2NzbGVuKHBTdHJpbmcpOworICB9CisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsKKyAgaWYgKHBDaGFyTWFwID09IE5VTEwpIHsKKyAgICBGWF9DSEFSKiBkZXN0X2J1ZjEgPSByZXN1bHQuR2V0QnVmZmVyKGxlbik7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpbnQgY29kZTsKKyAgICAgIGZvciAoY29kZSA9IDA7IGNvZGUgPCAyNTY7IGNvZGUrKykKKyAgICAgICAgaWYgKFBERkRvY0VuY29kaW5nW2NvZGVdID09IHBTdHJpbmdbaV0pIHsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihpKTsKLSAgICAgICAgaWYgKGkgPT0gbGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9CisgICAgICBpZiAoY29kZSA9PSAyNTYpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZXN0X2J1ZjFbaV0gPSBjb2RlOwogICAgIH0KLQotICAgIGlmKGxlbiA+IElOVF9NQVgvMi0xKQotICAgIHsKLSAgICAgICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoMCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoaSk7CisgICAgaWYgKGkgPT0gbGVuKSB7CisgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KKyAgfQogCi0gICAgaW50IGVuY0xlbiA9IGxlbiAqIDIgKyAyOwotCi0gICAgdWludDhfdCogZGVzdF9idWYyID0gKHVpbnQ4X3QqKXJlc3VsdC5HZXRCdWZmZXIoZW5jTGVuKTsKLSAgICBkZXN0X2J1ZjJbMF0gPSAweGZlOwotICAgIGRlc3RfYnVmMlsxXSA9IDB4ZmY7Ci0gICAgZGVzdF9idWYyICs9IDI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgKyspIHsKLSAgICAgICAgKmRlc3RfYnVmMisrID0gcFN0cmluZ1tpXSA+PiA4OwotICAgICAgICAqZGVzdF9idWYyKysgPSAodWludDhfdClwU3RyaW5nW2ldOwotICAgIH0KLSAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihlbmNMZW4pOworICBpZiAobGVuID4gSU5UX01BWCAvIDIgLSAxKSB7CisgICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoMCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGludCBlbmNMZW4gPSBsZW4gKiAyICsgMjsKKworICB1aW50OF90KiBkZXN0X2J1ZjIgPSAodWludDhfdCopcmVzdWx0LkdldEJ1ZmZlcihlbmNMZW4pOworICBkZXN0X2J1ZjJbMF0gPSAweGZlOworICBkZXN0X2J1ZjJbMV0gPSAweGZmOworICBkZXN0X2J1ZjIgKz0gMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICpkZXN0X2J1ZjIrKyA9IHBTdHJpbmdbaV0gPj4gODsKKyAgICAqZGVzdF9idWYyKysgPSAodWludDhfdClwU3RyaW5nW2ldOworICB9CisgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKGVuY0xlbik7CisgIHJldHVybiByZXN1bHQ7CiB9Ci1DRlhfQnl0ZVN0cmluZyBQREZfRW5jb2RlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMsIEZYX0JPT0wgYkhleCkKLXsKLSAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0OwotICAgIGludCBzcmNsZW4gPSBzcmMuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKGJIZXgpIHsKLSAgICAgICAgcmVzdWx0LkFwcGVuZENoYXIoJzwnKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNsZW47IGkgKyspIHsKLSAgICAgICAgICAgIHJlc3VsdC5BcHBlbmRDaGFyKCIwMTIzNDU2Nzg5QUJDREVGIltzcmNbaV0gLyAxNl0pOwotICAgICAgICAgICAgcmVzdWx0LkFwcGVuZENoYXIoIjAxMjM0NTY3ODlBQkNERUYiW3NyY1tpXSAlIDE2XSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LkFwcGVuZENoYXIoJz4nKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5HZXRCeXRlU3RyaW5nKCk7CitDRlhfQnl0ZVN0cmluZyBQREZfRW5jb2RlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMsIEZYX0JPT0wgYkhleCkgeworICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0OworICBpbnQgc3JjbGVuID0gc3JjLkdldExlbmd0aCgpOworICBpZiAoYkhleCkgeworICAgIHJlc3VsdC5BcHBlbmRDaGFyKCc8Jyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNsZW47IGkrKykgeworICAgICAgcmVzdWx0LkFwcGVuZENoYXIoIjAxMjM0NTY3ODlBQkNERUYiW3NyY1tpXSAvIDE2XSk7CisgICAgICByZXN1bHQuQXBwZW5kQ2hhcigiMDEyMzQ1Njc4OUFCQ0RFRiJbc3JjW2ldICUgMTZdKTsKICAgICB9Ci0gICAgcmVzdWx0LkFwcGVuZENoYXIoJygnKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNyY2xlbjsgaSArKykgewotICAgICAgICB1aW50OF90IGNoID0gc3JjW2ldOwotICAgICAgICBpZiAoY2ggPT0gJyknIHx8IGNoID09ICdcXCcgfHwgY2ggPT0gJygnKSB7Ci0gICAgICAgICAgICByZXN1bHQuQXBwZW5kQ2hhcignXFwnKTsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAweDBhKSB7Ci0gICAgICAgICAgICByZXN1bHQgPDwgRlhfQlNUUkMoIlxcbiIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gMHgwZCkgewotICAgICAgICAgICAgcmVzdWx0IDw8IEZYX0JTVFJDKCJcXHIiKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5BcHBlbmRDaGFyKGNoKTsKLSAgICB9Ci0gICAgcmVzdWx0LkFwcGVuZENoYXIoJyknKTsKKyAgICByZXN1bHQuQXBwZW5kQ2hhcignPicpOwogICAgIHJldHVybiByZXN1bHQuR2V0Qnl0ZVN0cmluZygpOwotfQotdm9pZCBGbGF0ZUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKTsKLSAgICBpZiAocEVuY29kZXJzKSB7Ci0gICAgICAgIHBFbmNvZGVycy0+R2V0RmxhdGVNb2R1bGUoKS0+RW5jb2RlKHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgfQorICByZXN1bHQuQXBwZW5kQ2hhcignKCcpOworICBmb3IgKGludCBpID0gMDsgaSA8IHNyY2xlbjsgaSsrKSB7CisgICAgdWludDhfdCBjaCA9IHNyY1tpXTsKKyAgICBpZiAoY2ggPT0gJyknIHx8IGNoID09ICdcXCcgfHwgY2ggPT0gJygnKSB7CisgICAgICByZXN1bHQuQXBwZW5kQ2hhcignXFwnKTsKKyAgICB9IGVsc2UgaWYgKGNoID09IDB4MGEpIHsKKyAgICAgIHJlc3VsdCA8PCBGWF9CU1RSQygiXFxuIik7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgaWYgKGNoID09IDB4MGQpIHsKKyAgICAgIHJlc3VsdCA8PCBGWF9CU1RSQygiXFxyIik7CisgICAgICBjb250aW51ZTsKICAgICB9CisgICAgcmVzdWx0LkFwcGVuZENoYXIoY2gpOworICB9CisgIHJlc3VsdC5BcHBlbmRDaGFyKCcpJyk7CisgIHJldHVybiByZXN1bHQuR2V0Qnl0ZVN0cmluZygpOwogfQotdm9pZCBGbGF0ZUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zLAotICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOwotICAgIGlmIChwRW5jb2RlcnMpIHsKLSAgICAgICAgcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5FbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIHByZWRpY3RvciwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICB9Cit2b2lkIEZsYXRlRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIHsKKyAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOworICBpZiAocEVuY29kZXJzKSB7CisgICAgcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5FbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICB9CiB9Ci1GWF9EV09SRCBGbGF0ZURlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKTsKLSAgICBpZiAocEVuY29kZXJzKSB7Ci0gICAgICAgIHJldHVybiBwRW5jb2RlcnMtPkdldEZsYXRlTW9kdWxlKCktPkZsYXRlT3JMWldEZWNvZGUoRkFMU0UsIHNyY19idWYsIHNyY19zaXplLCBGQUxTRSwgMCwgMCwgMCwgMCwgMCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiAwOwordm9pZCBGbGF0ZUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zLAorICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIHsKKyAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOworICBpZiAocEVuY29kZXJzKSB7CisgICAgcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5FbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIHByZWRpY3RvciwgQ29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMsIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2l6ZSk7CisgIH0KK30KK0ZYX0RXT1JEIEZsYXRlRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIHsKKyAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOworICBpZiAocEVuY29kZXJzKSB7CisgICAgcmV0dXJuIHBFbmNvZGVycy0+R2V0RmxhdGVNb2R1bGUoKS0+RmxhdGVPckxaV0RlY29kZSgKKyAgICAgICAgRkFMU0UsIHNyY19idWYsIHNyY19zaXplLCBGQUxTRSwgMCwgMCwgMCwgMCwgMCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisgIH0KKyAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZV9lbWJlZGRlcnRlc3QuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGVfZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCA2Zjk3YzA4Li4zZGE1MjJkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZV9lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlX2VtYmVkZGVydGVzdC5jcHAKQEAgLTEyLDE1ICsxMiwxNiBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCi1jbGFzcyBGUERGUGFyc2VyRGVjb2RlRW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7Ci19OworY2xhc3MgRlBERlBhcnNlckRlY29kZUVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CiAKIC8vIE5PVEU6IHB5dGhvbidzIHpsaWIuY29tcHJlc3MoKSBhbmQgemxpYi5kZWNvbXByZXNzKCkgbWF5IGJlIHVzZWZ1bCBmb3IKIC8vIGV4dGVybmFsIHZhbGlkYXRpb24gb2YgdGhlIEZsYXRlRW5jb2RlL0ZsYXRlRGVjb2RlIHRlc3QgY2FzZXMuCiAKLSNkZWZpbmUgVEVTVF9DQVNFKGlucHV0X2xpdGVyYWwsIGV4cGVjdGVkX2xpdGVyYWwpIFwKLSAgeyAoY29uc3QgdW5zaWduZWQgY2hhciopaW5wdXRfbGl0ZXJhbCwgc2l6ZW9mKGlucHV0X2xpdGVyYWwpIC0gMSwgXAotICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKilleHBlY3RlZF9saXRlcmFsLCBzaXplb2YoZXhwZWN0ZWRfbGl0ZXJhbCkgLSAxIH0KKyNkZWZpbmUgVEVTVF9DQVNFKGlucHV0X2xpdGVyYWwsIGV4cGVjdGVkX2xpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBpbnB1dF9saXRlcmFsLCBzaXplb2YoaW5wdXRfbGl0ZXJhbCkgLSAxLCAgICAgICAgIFwKKyAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKWV4cGVjdGVkX2xpdGVyYWwsIHNpemVvZihleHBlY3RlZF9saXRlcmFsKSAtIDEgXAorICB9CiAKIFRFU1RfRihGUERGUGFyc2VyRGVjb2RlRW1iZWRkZXJ0ZXN0LCBGbGF0ZUVuY29kZSkgewogICBzdHJ1Y3QgRmxhdGVFbmNvZGVDYXNlIHsKQEAgLTI5LDIxICszMCwyMCBAQAogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGV4cGVjdGVkOwogICAgIHVuc2lnbmVkIGludCBleHBlY3RlZF9zaXplOwogICB9IGZsYXRlX2VuY29kZV9jYXNlc1tdID0gewotICAgIFRFU1RfQ0FTRSgiIiwgIlx4NzhceDljXHgwM1x4MDBceDAwXHgwMFx4MDBceDAxIiksCi0gICAgVEVTVF9DQVNFKCIgIiwgIlx4NzhceDljXHg1M1x4MDBceDAwXHgwMFx4MjFceDAwXHgyMSIpLAotICAgIFRFU1RfQ0FTRSgiMTIzIiwgIlx4NzhceDljXHgzM1x4MzRceDMyXHgwNlx4MDBcMDFceDJkXHgwMFx4OTciKSwKLSAgICBURVNUX0NBU0UoIlx4MDBceGZmIiwgIlx4NzhceDljXHg2M1x4ZjhceDBmXHgwMFx4MDFceDAxXHgwMVx4MDAiKSwKLSAgICBURVNUX0NBU0UoIjEgMCAwIC0xIDI5IDc2MyBjbVxuMCAwIDU1NSA3MzUgcmVcblcgblxucVxuMCAwIDU1NSA3MzQuMzk0IHJlXG4iCi0gICAgICAgICAgICAgICJXIG5cbnFcbjAuODAwOSAwIDAgMC44MDA5IDAgMCBjbVxuMSAxIDEgUkcgMSAxIDEgcmdcbi9HMCBnc1xuIgotICAgICAgICAgICAgICAiMCAwIDY5MyA5MTcgcmVcbmZcblFcblFcbiIKLSAgICAgICAgICAgICAgLAotICAgICAgICAgICAgICAiXHg3OFx4OWNceDMzXHg1NFx4MzBceDAwXHg0Mlx4NWRceDQzXHgwNVx4MjNceDRiXHgwNVx4NzNceDMzXHg2MyIKLSAgICAgICAgICAgICAgIlx4ODVceGU0XHg1Y1x4MmVceDkwXHg4MFx4YTlceGE5XHhhOVx4ODJceGI5XHhiMVx4YTlceDQyXHg1MVx4MmEiCi0gICAgICAgICAgICAgICJceDU3XHhiOFx4NDJceDFlXHg1N1x4MjFceDkyXHhhMFx4ODlceDllXHhiMVx4YTVceDA5XHg5Mlx4ODRceDllIgotICAgICAgICAgICAgICAiXHg4NVx4ODFceDgxXHgyNVx4ZDhceDE0XHgyNFx4MjZceGQwXHgxOFx4NDNceDA1XHgxMFx4MGNceDcyXHg1NyIKLSAgICAgICAgICAgICAgIlx4ODBceDMwXHg4YVx4ZDJceGI5XHhmNFx4ZGRceDBkXHgxNFx4ZDJceDhiXHhjMVx4NDZceDk5XHg1OVx4MWEiCi0gICAgICAgICAgICAgICJceDJiXHg1OFx4MWFceDlhXHg4M1x4OGNceDQ5XHhlM1x4MGFceDA0XHg0Mlx4MDBceDM3XHg0Y1x4MWJceDQyIgotICAgICAgICAgICAgICApLAorICAgICAgVEVTVF9DQVNFKCIiLCAiXHg3OFx4OWNceDAzXHgwMFx4MDBceDAwXHgwMFx4MDEiKSwKKyAgICAgIFRFU1RfQ0FTRSgiICIsICJceDc4XHg5Y1x4NTNceDAwXHgwMFx4MDBceDIxXHgwMFx4MjEiKSwKKyAgICAgIFRFU1RfQ0FTRSgiMTIzIiwgIlx4NzhceDljXHgzM1x4MzRceDMyXHgwNlx4MDBcMDFceDJkXHgwMFx4OTciKSwKKyAgICAgIFRFU1RfQ0FTRSgiXHgwMFx4ZmYiLCAiXHg3OFx4OWNceDYzXHhmOFx4MGZceDAwXHgwMVx4MDFceDAxXHgwMCIpLAorICAgICAgVEVTVF9DQVNFKAorICAgICAgICAgICIxIDAgMCAtMSAyOSA3NjMgY21cbjAgMCA1NTUgNzM1IHJlXG5XIG5cbnFcbjAgMCA1NTUgNzM0LjM5NCByZVxuIgorICAgICAgICAgICJXIG5cbnFcbjAuODAwOSAwIDAgMC44MDA5IDAgMCBjbVxuMSAxIDEgUkcgMSAxIDEgcmdcbi9HMCBnc1xuIgorICAgICAgICAgICIwIDAgNjkzIDkxNyByZVxuZlxuUVxuUVxuIiwKKyAgICAgICAgICAiXHg3OFx4OWNceDMzXHg1NFx4MzBceDAwXHg0Mlx4NWRceDQzXHgwNVx4MjNceDRiXHgwNVx4NzNceDMzXHg2MyIKKyAgICAgICAgICAiXHg4NVx4ZTRceDVjXHgyZVx4OTBceDgwXHhhOVx4YTlceGE5XHg4Mlx4YjlceGIxXHhhOVx4NDJceDUxXHgyYSIKKyAgICAgICAgICAiXHg1N1x4YjhceDQyXHgxZVx4NTdceDIxXHg5Mlx4YTBceDg5XHg5ZVx4YjFceGE1XHgwOVx4OTJceDg0XHg5ZSIKKyAgICAgICAgICAiXHg4NVx4ODFceDgxXHgyNVx4ZDhceDE0XHgyNFx4MjZceGQwXHgxOFx4NDNceDA1XHgxMFx4MGNceDcyXHg1NyIKKyAgICAgICAgICAiXHg4MFx4MzBceDhhXHhkMlx4YjlceGY0XHhkZFx4MGRceDE0XHhkMlx4OGJceGMxXHg0Nlx4OTlceDU5XHgxYSIKKyAgICAgICAgICAiXHgyYlx4NThceDFhXHg5YVx4ODNceDhjXHg0OVx4ZTNceDBhXHgwNFx4NDJceDAwXHgzN1x4NGNceDFiXHg0MiIpLAogICB9OwogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGZsYXRlX2VuY29kZV9jYXNlcyk7ICsraSkgewpAQCAtNjYsMjMgKzY2LDIxIEBACiAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZXhwZWN0ZWQ7CiAgICAgdW5zaWduZWQgaW50IGV4cGVjdGVkX3NpemU7CiAgIH0gZmxhdGVfZGVjb2RlX2Nhc2VzW10gPSB7Ci0gICAgVEVTVF9DQVNFKCIiLCAiIiksCi0gICAgVEVTVF9DQVNFKCJwcmVwb3N0ZXJvdXMgbm9uc2Vuc2UiLCAiIiksCi0gICAgVEVTVF9DQVNFKCJceDc4XHg5Y1x4MDNceDAwXHgwMFx4MDBceDAwXHgwMSIsICIiKSwKLSAgICBURVNUX0NBU0UoIlx4NzhceDljXHg1M1x4MDBceDAwXHgwMFx4MjFceDAwXHgyMSIsICIgIiksCi0gICAgVEVTVF9DQVNFKCJceDc4XHg5Y1x4MzNceDM0XHgzMlx4MDZceDAwXDAxXHgyZFx4MDBceDk3IiwgIjEyMyIpLAotICAgIFRFU1RfQ0FTRSgiXHg3OFx4OWNceDYzXHhmOFx4MGZceDAwXHgwMVx4MDFceDAxXHgwMCIsICJceDAwXHhmZiIpLAotICAgIFRFU1RfQ0FTRSgiXHg3OFx4OWNceDMzXHg1NFx4MzBceDAwXHg0Mlx4NWRceDQzXHgwNVx4MjNceDRiXHgwNVx4NzNceDMzXHg2MyIKLSAgICAgICAgICAgICAgIlx4ODVceGU0XHg1Y1x4MmVceDkwXHg4MFx4YTlceGE5XHhhOVx4ODJceGI5XHhiMVx4YTlceDQyXHg1MVx4MmEiCi0gICAgICAgICAgICAgICJceDU3XHhiOFx4NDJceDFlXHg1N1x4MjFceDkyXHhhMFx4ODlceDllXHhiMVx4YTVceDA5XHg5Mlx4ODRceDllIgotICAgICAgICAgICAgICAiXHg4NVx4ODFceDgxXHgyNVx4ZDhceDE0XHgyNFx4MjZceGQwXHgxOFx4NDNceDA1XHgxMFx4MGNceDcyXHg1NyIKLSAgICAgICAgICAgICAgIlx4ODBceDMwXHg4YVx4ZDJceGI5XHhmNFx4ZGRceDBkXHgxNFx4ZDJceDhiXHhjMVx4NDZceDk5XHg1OVx4MWEiCi0gICAgICAgICAgICAgICJceDJiXHg1OFx4MWFceDlhXHg4M1x4OGNceDQ5XHhlM1x4MGFceDA0XHg0Mlx4MDBceDM3XHg0Y1x4MWJceDQyIgotICAgICAgICAgICAgICAsCi0gICAgICAgICAgICAgICIxIDAgMCAtMSAyOSA3NjMgY21cbjAgMCA1NTUgNzM1IHJlXG5XIG5cbnFcbjAgMCA1NTUgNzM0LjM5NCByZVxuIgotICAgICAgICAgICAgICAiVyBuXG5xXG4wLjgwMDkgMCAwIDAuODAwOSAwIDAgY21cbjEgMSAxIFJHIDEgMSAxIHJnXG4vRzAgZ3NcbiIKLSAgICAgICAgICAgICAgIjAgMCA2OTMgOTE3IHJlXG5mXG5RXG5RXG4iCi0gICAgICAgICAgICAgICksCisgICAgICBURVNUX0NBU0UoIiIsICIiKSwgVEVTVF9DQVNFKCJwcmVwb3N0ZXJvdXMgbm9uc2Vuc2UiLCAiIiksCisgICAgICBURVNUX0NBU0UoIlx4NzhceDljXHgwM1x4MDBceDAwXHgwMFx4MDBceDAxIiwgIiIpLAorICAgICAgVEVTVF9DQVNFKCJceDc4XHg5Y1x4NTNceDAwXHgwMFx4MDBceDIxXHgwMFx4MjEiLCAiICIpLAorICAgICAgVEVTVF9DQVNFKCJceDc4XHg5Y1x4MzNceDM0XHgzMlx4MDZceDAwXDAxXHgyZFx4MDBceDk3IiwgIjEyMyIpLAorICAgICAgVEVTVF9DQVNFKCJceDc4XHg5Y1x4NjNceGY4XHgwZlx4MDBceDAxXHgwMVx4MDFceDAwIiwgIlx4MDBceGZmIiksCisgICAgICBURVNUX0NBU0UoCisgICAgICAgICAgIlx4NzhceDljXHgzM1x4NTRceDMwXHgwMFx4NDJceDVkXHg0M1x4MDVceDIzXHg0Ylx4MDVceDczXHgzM1x4NjMiCisgICAgICAgICAgIlx4ODVceGU0XHg1Y1x4MmVceDkwXHg4MFx4YTlceGE5XHhhOVx4ODJceGI5XHhiMVx4YTlceDQyXHg1MVx4MmEiCisgICAgICAgICAgIlx4NTdceGI4XHg0Mlx4MWVceDU3XHgyMVx4OTJceGEwXHg4OVx4OWVceGIxXHhhNVx4MDlceDkyXHg4NFx4OWUiCisgICAgICAgICAgIlx4ODVceDgxXHg4MVx4MjVceGQ4XHgxNFx4MjRceDI2XHhkMFx4MThceDQzXHgwNVx4MTBceDBjXHg3Mlx4NTciCisgICAgICAgICAgIlx4ODBceDMwXHg4YVx4ZDJceGI5XHhmNFx4ZGRceDBkXHgxNFx4ZDJceDhiXHhjMVx4NDZceDk5XHg1OVx4MWEiCisgICAgICAgICAgIlx4MmJceDU4XHgxYVx4OWFceDgzXHg4Y1x4NDlceGUzXHgwYVx4MDRceDQyXHgwMFx4MzdceDRjXHgxYlx4NDIiLAorICAgICAgICAgICIxIDAgMCAtMSAyOSA3NjMgY21cbjAgMCA1NTUgNzM1IHJlXG5XIG5cbnFcbjAgMCA1NTUgNzM0LjM5NCByZVxuIgorICAgICAgICAgICJXIG5cbnFcbjAuODAwOSAwIDAgMC44MDA5IDAgMCBjbVxuMSAxIDEgUkcgMSAxIDEgcmdcbi9HMCBnc1xuIgorICAgICAgICAgICIwIDAgNjkzIDkxNyByZVxuZlxuUVxuUVxuIiksCiAgIH07CiAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZmxhdGVfZGVjb2RlX2Nhc2VzKTsgKytpKSB7CkBAIC05OCw1ICs5Niw0IEBACiAgIH0KIH0KIAotCiAjdW5kZWYgVEVTVF9DQVNFCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RvY3VtZW50LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwCmluZGV4IGMwZjQ1YzUuLjBkN2JkZDggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwCkBAIC03LDM2MyArNywzNTUgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKIAotQ1BERl9Eb2N1bWVudDo6Q1BERl9Eb2N1bWVudChDUERGX1BhcnNlciogcFBhcnNlcikgOiBDUERGX0luZGlyZWN0T2JqZWN0cyhwUGFyc2VyKQotewotICAgIEFTU0VSVChwUGFyc2VyICE9IE5VTEwpOwotICAgIG1fcFJvb3REaWN0ID0gTlVMTDsKLSAgICBtX3BJbmZvRGljdCA9IE5VTEw7Ci0gICAgbV9iTGluZWFyaXplZCA9IEZBTFNFOwotICAgIG1fZHdGaXJzdFBhZ2VObyA9IDA7Ci0gICAgbV9kd0ZpcnN0UGFnZU9iak51bSA9IDA7Ci0gICAgbV9wRG9jUGFnZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5DcmVhdGVEb2NEYXRhKHRoaXMpOwotICAgIG1fcERvY1JlbmRlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7CitDUERGX0RvY3VtZW50OjpDUERGX0RvY3VtZW50KENQREZfUGFyc2VyKiBwUGFyc2VyKQorICAgIDogQ1BERl9JbmRpcmVjdE9iamVjdHMocFBhcnNlcikgeworICBBU1NFUlQocFBhcnNlciAhPSBOVUxMKTsKKyAgbV9wUm9vdERpY3QgPSBOVUxMOworICBtX3BJbmZvRGljdCA9IE5VTEw7CisgIG1fYkxpbmVhcml6ZWQgPSBGQUxTRTsKKyAgbV9kd0ZpcnN0UGFnZU5vID0gMDsKKyAgbV9kd0ZpcnN0UGFnZU9iak51bSA9IDA7CisgIG1fcERvY1BhZ2UgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+Q3JlYXRlRG9jRGF0YSh0aGlzKTsKKyAgbV9wRG9jUmVuZGVyID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRSZW5kZXJNb2R1bGUoKS0+Q3JlYXRlRG9jRGF0YSh0aGlzKTsKIH0KLUNQREZfRG9jUGFnZURhdGEqIENQREZfRG9jdW1lbnQ6OkdldFZhbGlkYXRlUGFnZURhdGEoKQotewotICAgIGlmIChtX3BEb2NQYWdlKSB7Ci0gICAgICAgIHJldHVybiBtX3BEb2NQYWdlOwotICAgIH0KLSAgICBtX3BEb2NQYWdlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7CitDUERGX0RvY1BhZ2VEYXRhKiBDUERGX0RvY3VtZW50OjpHZXRWYWxpZGF0ZVBhZ2VEYXRhKCkgeworICBpZiAobV9wRG9jUGFnZSkgewogICAgIHJldHVybiBtX3BEb2NQYWdlOworICB9CisgIG1fcERvY1BhZ2UgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+Q3JlYXRlRG9jRGF0YSh0aGlzKTsKKyAgcmV0dXJuIG1fcERvY1BhZ2U7CiB9Ci1DUERGX0RvY1JlbmRlckRhdGEqIENQREZfRG9jdW1lbnQ6OkdldFZhbGlkYXRlUmVuZGVyRGF0YSgpCi17Ci0gICAgaWYgKG1fcERvY1JlbmRlcikgewotICAgICAgICByZXR1cm4gbV9wRG9jUmVuZGVyOwotICAgIH0KLSAgICBtX3BEb2NSZW5kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFJlbmRlck1vZHVsZSgpLT5DcmVhdGVEb2NEYXRhKHRoaXMpOworQ1BERl9Eb2NSZW5kZXJEYXRhKiBDUERGX0RvY3VtZW50OjpHZXRWYWxpZGF0ZVJlbmRlckRhdGEoKSB7CisgIGlmIChtX3BEb2NSZW5kZXIpIHsKICAgICByZXR1cm4gbV9wRG9jUmVuZGVyOworICB9CisgIG1fcERvY1JlbmRlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7CisgIHJldHVybiBtX3BEb2NSZW5kZXI7CiB9Ci12b2lkIENQREZfRG9jdW1lbnQ6OkxvYWREb2MoKQotewotICAgIG1fTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOwotICAgIENQREZfT2JqZWN0KiBwUm9vdE9iaiA9IEdldEluZGlyZWN0T2JqZWN0KG1fcFBhcnNlci0+R2V0Um9vdE9iak51bSgpKTsKLSAgICBpZiAocFJvb3RPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcFJvb3REaWN0ID0gcFJvb3RPYmotPkdldERpY3QoKTsKLSAgICBpZiAobV9wUm9vdERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwSW5mb09iaiA9IEdldEluZGlyZWN0T2JqZWN0KG1fcFBhcnNlci0+R2V0SW5mb09iak51bSgpKTsKLSAgICBpZiAocEluZm9PYmopIHsKLSAgICAgICAgbV9wSW5mb0RpY3QgPSBwSW5mb09iai0+R2V0RGljdCgpOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwSURBcnJheSA9IG1fcFBhcnNlci0+R2V0SURBcnJheSgpOwotICAgIGlmIChwSURBcnJheSkgewotICAgICAgICBtX0lEMSA9IHBJREFycmF5LT5HZXRTdHJpbmcoMCk7Ci0gICAgICAgIG1fSUQyID0gcElEQXJyYXktPkdldFN0cmluZygxKTsKLSAgICB9Ci0gICAgbV9QYWdlTGlzdC5TZXRTaXplKF9HZXRQYWdlQ291bnQoKSk7Cit2b2lkIENQREZfRG9jdW1lbnQ6OkxvYWREb2MoKSB7CisgIG1fTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOworICBDUERGX09iamVjdCogcFJvb3RPYmogPSBHZXRJbmRpcmVjdE9iamVjdChtX3BQYXJzZXItPkdldFJvb3RPYmpOdW0oKSk7CisgIGlmIChwUm9vdE9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcFJvb3REaWN0ID0gcFJvb3RPYmotPkdldERpY3QoKTsKKyAgaWYgKG1fcFJvb3REaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9PYmplY3QqIHBJbmZvT2JqID0gR2V0SW5kaXJlY3RPYmplY3QobV9wUGFyc2VyLT5HZXRJbmZvT2JqTnVtKCkpOworICBpZiAocEluZm9PYmopIHsKKyAgICBtX3BJbmZvRGljdCA9IHBJbmZvT2JqLT5HZXREaWN0KCk7CisgIH0KKyAgQ1BERl9BcnJheSogcElEQXJyYXkgPSBtX3BQYXJzZXItPkdldElEQXJyYXkoKTsKKyAgaWYgKHBJREFycmF5KSB7CisgICAgbV9JRDEgPSBwSURBcnJheS0+R2V0U3RyaW5nKDApOworICAgIG1fSUQyID0gcElEQXJyYXktPkdldFN0cmluZygxKTsKKyAgfQorICBtX1BhZ2VMaXN0LlNldFNpemUoX0dldFBhZ2VDb3VudCgpKTsKIH0KLXZvaWQgQ1BERl9Eb2N1bWVudDo6TG9hZEFzeW5Eb2MoQ1BERl9EaWN0aW9uYXJ5ICpwTGluZWFyaXplZCkKLXsKLSAgICBtX2JMaW5lYXJpemVkID0gVFJVRTsKLSAgICBtX0xhc3RPYmpOdW0gPSBtX3BQYXJzZXItPkdldExhc3RPYmpOdW0oKTsKLSAgICBDUERGX09iamVjdCogaW5kaXJlY3RPYmogPSBHZXRJbmRpcmVjdE9iamVjdChtX3BQYXJzZXItPkdldFJvb3RPYmpOdW0oKSk7Ci0gICAgbV9wUm9vdERpY3QgPSBpbmRpcmVjdE9iaiA/IGluZGlyZWN0T2JqLT5HZXREaWN0KCkgOiBOVUxMOwotICAgIGlmIChtX3BSb290RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW5kaXJlY3RPYmogPSBHZXRJbmRpcmVjdE9iamVjdChtX3BQYXJzZXItPkdldEluZm9PYmpOdW0oKSk7Ci0gICAgbV9wSW5mb0RpY3QgPSBpbmRpcmVjdE9iaiA/IGluZGlyZWN0T2JqLT5HZXREaWN0KCkgOiBOVUxMOwotICAgIENQREZfQXJyYXkqIHBJREFycmF5ID0gbV9wUGFyc2VyLT5HZXRJREFycmF5KCk7Ci0gICAgaWYgKHBJREFycmF5KSB7Ci0gICAgICAgIG1fSUQxID0gcElEQXJyYXktPkdldFN0cmluZygwKTsKLSAgICAgICAgbV9JRDIgPSBwSURBcnJheS0+R2V0U3RyaW5nKDEpOwotICAgIH0KLSAgICBGWF9EV09SRCBkd1BhZ2VDb3VudCA9IDA7Ci0gICAgQ1BERl9PYmplY3QgKnBDb3VudCA9IHBMaW5lYXJpemVkLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJOIikpOwotICAgIGlmIChwQ291bnQgJiYgcENvdW50LT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICBkd1BhZ2VDb3VudCA9IHBDb3VudC0+R2V0SW50ZWdlcigpOwotICAgIH0KLSAgICBtX1BhZ2VMaXN0LlNldFNpemUoZHdQYWdlQ291bnQpOwotICAgIENQREZfT2JqZWN0ICpwTm8gPSBwTGluZWFyaXplZC0+R2V0RWxlbWVudChGWF9CU1RSQygiUCIpKTsKLSAgICBpZiAocE5vICYmIHBOby0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgbV9kd0ZpcnN0UGFnZU5vID0gcE5vLT5HZXRJbnRlZ2VyKCk7Ci0gICAgfQotICAgIENQREZfT2JqZWN0ICpwT2JqTnVtID0gcExpbmVhcml6ZWQtPkdldEVsZW1lbnQoRlhfQlNUUkMoIk8iKSk7Ci0gICAgaWYgKHBPYmpOdW0gJiYgcE9iak51bS0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgbV9kd0ZpcnN0UGFnZU9iak51bSA9IHBPYmpOdW0tPkdldEludGVnZXIoKTsKLSAgICB9Cit2b2lkIENQREZfRG9jdW1lbnQ6OkxvYWRBc3luRG9jKENQREZfRGljdGlvbmFyeSogcExpbmVhcml6ZWQpIHsKKyAgbV9iTGluZWFyaXplZCA9IFRSVUU7CisgIG1fTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOworICBDUERGX09iamVjdCogaW5kaXJlY3RPYmogPSBHZXRJbmRpcmVjdE9iamVjdChtX3BQYXJzZXItPkdldFJvb3RPYmpOdW0oKSk7CisgIG1fcFJvb3REaWN0ID0gaW5kaXJlY3RPYmogPyBpbmRpcmVjdE9iai0+R2V0RGljdCgpIDogTlVMTDsKKyAgaWYgKG1fcFJvb3REaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW5kaXJlY3RPYmogPSBHZXRJbmRpcmVjdE9iamVjdChtX3BQYXJzZXItPkdldEluZm9PYmpOdW0oKSk7CisgIG1fcEluZm9EaWN0ID0gaW5kaXJlY3RPYmogPyBpbmRpcmVjdE9iai0+R2V0RGljdCgpIDogTlVMTDsKKyAgQ1BERl9BcnJheSogcElEQXJyYXkgPSBtX3BQYXJzZXItPkdldElEQXJyYXkoKTsKKyAgaWYgKHBJREFycmF5KSB7CisgICAgbV9JRDEgPSBwSURBcnJheS0+R2V0U3RyaW5nKDApOworICAgIG1fSUQyID0gcElEQXJyYXktPkdldFN0cmluZygxKTsKKyAgfQorICBGWF9EV09SRCBkd1BhZ2VDb3VudCA9IDA7CisgIENQREZfT2JqZWN0KiBwQ291bnQgPSBwTGluZWFyaXplZC0+R2V0RWxlbWVudChGWF9CU1RSQygiTiIpKTsKKyAgaWYgKHBDb3VudCAmJiBwQ291bnQtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CisgICAgZHdQYWdlQ291bnQgPSBwQ291bnQtPkdldEludGVnZXIoKTsKKyAgfQorICBtX1BhZ2VMaXN0LlNldFNpemUoZHdQYWdlQ291bnQpOworICBDUERGX09iamVjdCogcE5vID0gcExpbmVhcml6ZWQtPkdldEVsZW1lbnQoRlhfQlNUUkMoIlAiKSk7CisgIGlmIChwTm8gJiYgcE5vLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgeworICAgIG1fZHdGaXJzdFBhZ2VObyA9IHBOby0+R2V0SW50ZWdlcigpOworICB9CisgIENQREZfT2JqZWN0KiBwT2JqTnVtID0gcExpbmVhcml6ZWQtPkdldEVsZW1lbnQoRlhfQlNUUkMoIk8iKSk7CisgIGlmIChwT2JqTnVtICYmIHBPYmpOdW0tPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CisgICAgbV9kd0ZpcnN0UGFnZU9iak51bSA9IHBPYmpOdW0tPkdldEludGVnZXIoKTsKKyAgfQogfQotdm9pZCBDUERGX0RvY3VtZW50OjpMb2FkUGFnZXMoKQotewotICAgIG1fUGFnZUxpc3QuU2V0U2l6ZShfR2V0UGFnZUNvdW50KCkpOwordm9pZCBDUERGX0RvY3VtZW50OjpMb2FkUGFnZXMoKSB7CisgIG1fUGFnZUxpc3QuU2V0U2l6ZShfR2V0UGFnZUNvdW50KCkpOwogfQogZXh0ZXJuIHZvaWQgRlBERl9UVEZhY2VNYXBwZXJfUmVsZWFzZURvYyhDUERGX0RvY3VtZW50Kik7Ci1DUERGX0RvY3VtZW50Ojp+Q1BERl9Eb2N1bWVudCgpCi17Ci0gICAgaWYgKG1fcERvY1BhZ2UpIHsKLSAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPlJlbGVhc2VEb2ModGhpcyk7Ci0gICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5DbGVhclN0b2NrRm9udCh0aGlzKTsKLSAgICB9Ci0gICAgaWYgKG1fcERvY1JlbmRlcikgewotICAgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFJlbmRlck1vZHVsZSgpLT5EZXN0cm95RG9jRGF0YShtX3BEb2NSZW5kZXIpOwotICAgIH0KK0NQREZfRG9jdW1lbnQ6On5DUERGX0RvY3VtZW50KCkgeworICBpZiAobV9wRG9jUGFnZSkgeworICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5SZWxlYXNlRG9jKHRoaXMpOworICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5DbGVhclN0b2NrRm9udCh0aGlzKTsKKyAgfQorICBpZiAobV9wRG9jUmVuZGVyKSB7CisgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRSZW5kZXJNb2R1bGUoKS0+RGVzdHJveURvY0RhdGEobV9wRG9jUmVuZGVyKTsKKyAgfQogfQotI2RlZmluZQkJRlhfTUFYX1BBR0VfTEVWRUwJCQkxMDI0Ci1DUERGX0RpY3Rpb25hcnkqIENQREZfRG9jdW1lbnQ6Ol9GaW5kUERGUGFnZShDUERGX0RpY3Rpb25hcnkqIHBQYWdlcywgaW50IGlQYWdlLCBpbnQgblBhZ2VzVG9HbywgaW50IGxldmVsKQotewotICAgIENQREZfQXJyYXkqIHBLaWRMaXN0ID0gcFBhZ2VzLT5HZXRBcnJheShGWF9CU1RSQygiS2lkcyIpKTsKLSAgICBpZiAocEtpZExpc3QgPT0gTlVMTCkgewotICAgICAgICBpZiAoblBhZ2VzVG9HbyA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gcFBhZ2VzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAobGV2ZWwgPj0gRlhfTUFYX1BBR0VfTEVWRUwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGludCBuS2lkcyA9IHBLaWRMaXN0LT5HZXRDb3VudCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbktpZHM7IGkgKyspIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZExpc3QtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwS2lkID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5QYWdlc1RvR28gLS07Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEtpZCA9PSBwUGFnZXMpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcEtpZC0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKLSAgICAgICAgICAgIGlmIChuUGFnZXNUb0dvID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcEtpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fUGFnZUxpc3QuU2V0QXQoaVBhZ2UgLSBuUGFnZXNUb0dvLCBwS2lkLT5HZXRPYmpOdW0oKSk7Ci0gICAgICAgICAgICBuUGFnZXNUb0dvIC0tOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IG5QYWdlcyA9IHBLaWQtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvdW50IikpOwotICAgICAgICAgICAgaWYgKG5QYWdlc1RvR28gPCBuUGFnZXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX0ZpbmRQREZQYWdlKHBLaWQsIGlQYWdlLCBuUGFnZXNUb0dvLCBsZXZlbCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgblBhZ2VzVG9HbyAtPSBuUGFnZXM7Ci0gICAgICAgIH0KKyNkZWZpbmUgRlhfTUFYX1BBR0VfTEVWRUwgMTAyNAorQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0RvY3VtZW50OjpfRmluZFBERlBhZ2UoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBhZ2VzVG9HbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkgeworICBDUERGX0FycmF5KiBwS2lkTGlzdCA9IHBQYWdlcy0+R2V0QXJyYXkoRlhfQlNUUkMoIktpZHMiKSk7CisgIGlmIChwS2lkTGlzdCA9PSBOVUxMKSB7CisgICAgaWYgKG5QYWdlc1RvR28gPT0gMCkgeworICAgICAgcmV0dXJuIHBQYWdlczsKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7Ci19Ci1DUERGX0RpY3Rpb25hcnkqIENQREZfRG9jdW1lbnQ6OkdldFBhZ2UoaW50IGlQYWdlKQotewotICAgIGlmIChpUGFnZSA8IDAgfHwgaVBhZ2UgPj0gbV9QYWdlTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGxldmVsID49IEZYX01BWF9QQUdFX0xFVkVMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IG5LaWRzID0gcEtpZExpc3QtPkdldENvdW50KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbktpZHM7IGkrKykgeworICAgIENQREZfRGljdGlvbmFyeSogcEtpZCA9IHBLaWRMaXN0LT5HZXREaWN0KGkpOworICAgIGlmIChwS2lkID09IE5VTEwpIHsKKyAgICAgIG5QYWdlc1RvR28tLTsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAobV9iTGluZWFyaXplZCAmJiAoaVBhZ2UgPT0gKGludCltX2R3Rmlyc3RQYWdlTm8pKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0SW5kaXJlY3RPYmplY3QobV9kd0ZpcnN0UGFnZU9iak51bSk7Ci0gICAgICAgIGlmIChwT2JqICYmIHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgcmV0dXJuIChDUERGX0RpY3Rpb25hcnkqKXBPYmo7Ci0gICAgICAgIH0KKyAgICBpZiAocEtpZCA9PSBwUGFnZXMpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpbnQgb2JqbnVtID0gbV9QYWdlTGlzdC5HZXRBdChpUGFnZSk7Ci0gICAgaWYgKG9iam51bSkgewotICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IEdldEluZGlyZWN0T2JqZWN0KG9iam51bSk7Ci0gICAgICAgIEFTU0VSVChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpOwotICAgICAgICByZXR1cm4gKENQREZfRGljdGlvbmFyeSopcE9iajsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IEdldFJvb3QoKTsKLSAgICBpZiAocFJvb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMgPSBwUm9vdC0+R2V0RGljdChGWF9CU1RSQygiUGFnZXMiKSk7Ci0gICAgaWYgKHBQYWdlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlID0gX0ZpbmRQREZQYWdlKHBQYWdlcywgaVBhZ2UsIGlQYWdlLCAwKTsKLSAgICBpZiAocFBhZ2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbV9QYWdlTGlzdC5TZXRBdChpUGFnZSwgcFBhZ2UtPkdldE9iak51bSgpKTsKLSAgICByZXR1cm4gcFBhZ2U7Ci19Ci1pbnQgQ1BERl9Eb2N1bWVudDo6X0ZpbmRQYWdlSW5kZXgoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwgRlhfRFdPUkQmIHNraXBfY291bnQsIEZYX0RXT1JEIG9iam51bSwgaW50JiBpbmRleCwgaW50IGxldmVsKQotewotICAgIGlmIChwTm9kZS0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKLSAgICAgICAgQ1BERl9BcnJheSogcEtpZExpc3QgPSBwTm9kZS0+R2V0QXJyYXkoRlhfQlNUUkMoIktpZHMiKSk7Ci0gICAgICAgIGlmIChwS2lkTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxldmVsID49IEZYX01BWF9QQUdFX0xFVkVMKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgY291bnQgPSBwTm9kZS0+R2V0SW50ZWdlcihGWF9CU1RSQygiQ291bnQiKSk7Ci0gICAgICAgIGlmIChjb3VudCA8PSBza2lwX2NvdW50KSB7Ci0gICAgICAgICAgICBza2lwX2NvdW50IC09IGNvdW50OwotICAgICAgICAgICAgaW5kZXggKz0gY291bnQ7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvdW50ICYmIGNvdW50ID09IHBLaWRMaXN0LT5HZXRDb3VudCgpKSB7Ci0gICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcEtpZCA9IHBLaWRMaXN0LT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgICAgIGlmIChwS2lkICYmIHBLaWQtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKENQREZfUmVmZXJlbmNlKikgcEtpZCktPkdldFJlZk9iak51bSgpID09IG9iam51bSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9QYWdlTGlzdC5TZXRBdChpbmRleCArIGksIG9iam51bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggKyBpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkTGlzdC0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZExpc3QtPkdldERpY3QoaSk7Ci0gICAgICAgICAgICBpZiAocEtpZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocEtpZCA9PSBwTm9kZSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGZvdW5kX2luZGV4ID0gX0ZpbmRQYWdlSW5kZXgocEtpZCwgc2tpcF9jb3VudCwgb2JqbnVtLCBpbmRleCwgbGV2ZWwgKyAxKTsKLSAgICAgICAgICAgIGlmIChmb3VuZF9pbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kX2luZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgaWYgKCFwS2lkLT5LZXlFeGlzdChGWF9CU1RSQygiS2lkcyIpKSkgeworICAgICAgaWYgKG5QYWdlc1RvR28gPT0gMCkgeworICAgICAgICByZXR1cm4gcEtpZDsKKyAgICAgIH0KKyAgICAgIG1fUGFnZUxpc3QuU2V0QXQoaVBhZ2UgLSBuUGFnZXNUb0dvLCBwS2lkLT5HZXRPYmpOdW0oKSk7CisgICAgICBuUGFnZXNUb0dvLS07CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG9iam51bSA9PSBwTm9kZS0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2tpcF9jb3VudCkgewotICAgICAgICAgICAgc2tpcF9jb3VudC0tOwotICAgICAgICB9Ci0gICAgICAgIGluZGV4ICsrOworICAgICAgaW50IG5QYWdlcyA9IHBLaWQtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvdW50IikpOworICAgICAgaWYgKG5QYWdlc1RvR28gPCBuUGFnZXMpIHsKKyAgICAgICAgcmV0dXJuIF9GaW5kUERGUGFnZShwS2lkLCBpUGFnZSwgblBhZ2VzVG9HbywgbGV2ZWwgKyAxKTsKKyAgICAgIH0KKyAgICAgIG5QYWdlc1RvR28gLT0gblBhZ2VzOwogICAgIH0KLSAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci1pbnQgQ1BERl9Eb2N1bWVudDo6R2V0UGFnZUluZGV4KEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICBGWF9EV09SRCBuUGFnZXMgPSBtX1BhZ2VMaXN0LkdldFNpemUoKTsKLSAgICBGWF9EV09SRCBza2lwX2NvdW50ID0gMDsKLSAgICBGWF9CT09MIGJTa2lwcGVkID0gRkFMU0U7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5QYWdlczsgaSArKykgewotICAgICAgICBGWF9EV09SRCBvYmpudW0xID0gbV9QYWdlTGlzdC5HZXRBdChpKTsKLSAgICAgICAgaWYgKG9iam51bTEgPT0gb2JqbnVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWJTa2lwcGVkICYmIG9iam51bTEgPT0gMCkgewotICAgICAgICAgICAgc2tpcF9jb3VudCA9IGk7Ci0gICAgICAgICAgICBiU2tpcHBlZCA9IFRSVUU7Ci0gICAgICAgIH0KK0NQREZfRGljdGlvbmFyeSogQ1BERl9Eb2N1bWVudDo6R2V0UGFnZShpbnQgaVBhZ2UpIHsKKyAgaWYgKGlQYWdlIDwgMCB8fCBpUGFnZSA+PSBtX1BhZ2VMaXN0LkdldFNpemUoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChtX2JMaW5lYXJpemVkICYmIChpUGFnZSA9PSAoaW50KW1fZHdGaXJzdFBhZ2VObykpIHsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IEdldEluZGlyZWN0T2JqZWN0KG1fZHdGaXJzdFBhZ2VPYmpOdW0pOworICAgIGlmIChwT2JqICYmIHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgICAgcmV0dXJuIChDUERGX0RpY3Rpb25hcnkqKXBPYmo7CiAgICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBHZXRSb290KCk7Ci0gICAgaWYgKHBSb290ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlcyA9IHBSb290LT5HZXREaWN0KEZYX0JTVFJDKCJQYWdlcyIpKTsKLSAgICBpZiAocFBhZ2VzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHJldHVybiBfRmluZFBhZ2VJbmRleChwUGFnZXMsIHNraXBfY291bnQsIG9iam51bSwgaW5kZXgpOworICB9CisgIGludCBvYmpudW0gPSBtX1BhZ2VMaXN0LkdldEF0KGlQYWdlKTsKKyAgaWYgKG9iam51bSkgeworICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0SW5kaXJlY3RPYmplY3Qob2JqbnVtKTsKKyAgICBBU1NFUlQocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKTsKKyAgICByZXR1cm4gKENQREZfRGljdGlvbmFyeSopcE9iajsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gR2V0Um9vdCgpOworICBpZiAocFJvb3QgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gcFJvb3QtPkdldERpY3QoRlhfQlNUUkMoIlBhZ2VzIikpOworICBpZiAocFBhZ2VzID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlID0gX0ZpbmRQREZQYWdlKHBQYWdlcywgaVBhZ2UsIGlQYWdlLCAwKTsKKyAgaWYgKHBQYWdlID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBtX1BhZ2VMaXN0LlNldEF0KGlQYWdlLCBwUGFnZS0+R2V0T2JqTnVtKCkpOworICByZXR1cm4gcFBhZ2U7CiB9Ci1pbnQgQ1BERl9Eb2N1bWVudDo6R2V0UGFnZUNvdW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9QYWdlTGlzdC5HZXRTaXplKCk7Ci19Ci1zdGF0aWMgaW50IF9Db3VudFBhZ2VzKENQREZfRGljdGlvbmFyeSogcFBhZ2VzLCBpbnQgbGV2ZWwpCi17Ci0gICAgaWYgKGxldmVsID4gMTI4KSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQgY291bnQgPSBwUGFnZXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvdW50IikpOwotICAgIGlmIChjb3VudCA+IDAgJiYgY291bnQgPCBGUERGX1BBR0VfTUFYX05VTSkgewotICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBLaWRMaXN0ID0gcFBhZ2VzLT5HZXRBcnJheShGWF9CU1RSQygiS2lkcyIpKTsKK2ludCBDUERGX0RvY3VtZW50OjpfRmluZFBhZ2VJbmRleChDUERGX0RpY3Rpb25hcnkqIHBOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBza2lwX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkgeworICBpZiAocE5vZGUtPktleUV4aXN0KEZYX0JTVFJDKCJLaWRzIikpKSB7CisgICAgQ1BERl9BcnJheSogcEtpZExpc3QgPSBwTm9kZS0+R2V0QXJyYXkoRlhfQlNUUkMoIktpZHMiKSk7CiAgICAgaWYgKHBLaWRMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGNvdW50ID0gMDsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZExpc3QtPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZExpc3QtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwS2lkID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcEtpZC0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKLSAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291bnQgKz0gX0NvdW50UGFnZXMocEtpZCwgbGV2ZWwgKyAxKTsKLSAgICAgICAgfQorICAgIGlmIChsZXZlbCA+PSBGWF9NQVhfUEFHRV9MRVZFTCkgeworICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBwUGFnZXMtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiQ291bnQiKSwgY291bnQpOworICAgIEZYX0RXT1JEIGNvdW50ID0gcE5vZGUtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvdW50IikpOworICAgIGlmIChjb3VudCA8PSBza2lwX2NvdW50KSB7CisgICAgICBza2lwX2NvdW50IC09IGNvdW50OworICAgICAgaW5kZXggKz0gY291bnQ7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChjb3VudCAmJiBjb3VudCA9PSBwS2lkTGlzdC0+R2V0Q291bnQoKSkgeworICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBLaWQgPSBwS2lkTGlzdC0+R2V0RWxlbWVudChpKTsKKyAgICAgICAgaWYgKHBLaWQgJiYgcEtpZC0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICAgICAgICBpZiAoKChDUERGX1JlZmVyZW5jZSopcEtpZCktPkdldFJlZk9iak51bSgpID09IG9iam51bSkgeworICAgICAgICAgICAgbV9QYWdlTGlzdC5TZXRBdChpbmRleCArIGksIG9iam51bSk7CisgICAgICAgICAgICByZXR1cm4gaW5kZXggKyBpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZExpc3QtPkdldENvdW50KCk7IGkrKykgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZExpc3QtPkdldERpY3QoaSk7CisgICAgICBpZiAocEtpZCA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHBLaWQgPT0gcE5vZGUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgZm91bmRfaW5kZXggPQorICAgICAgICAgIF9GaW5kUGFnZUluZGV4KHBLaWQsIHNraXBfY291bnQsIG9iam51bSwgaW5kZXgsIGxldmVsICsgMSk7CisgICAgICBpZiAoZm91bmRfaW5kZXggPj0gMCkgeworICAgICAgICByZXR1cm4gZm91bmRfaW5kZXg7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChvYmpudW0gPT0gcE5vZGUtPkdldE9iak51bSgpKSB7CisgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorICAgIGlmIChza2lwX2NvdW50KSB7CisgICAgICBza2lwX2NvdW50LS07CisgICAgfQorICAgIGluZGV4Kys7CisgIH0KKyAgcmV0dXJuIC0xOworfQoraW50IENQREZfRG9jdW1lbnQ6OkdldFBhZ2VJbmRleChGWF9EV09SRCBvYmpudW0pIHsKKyAgRlhfRFdPUkQgblBhZ2VzID0gbV9QYWdlTGlzdC5HZXRTaXplKCk7CisgIEZYX0RXT1JEIHNraXBfY291bnQgPSAwOworICBGWF9CT09MIGJTa2lwcGVkID0gRkFMU0U7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuUGFnZXM7IGkrKykgeworICAgIEZYX0RXT1JEIG9iam51bTEgPSBtX1BhZ2VMaXN0LkdldEF0KGkpOworICAgIGlmIChvYmpudW0xID09IG9iam51bSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIGlmICghYlNraXBwZWQgJiYgb2JqbnVtMSA9PSAwKSB7CisgICAgICBza2lwX2NvdW50ID0gaTsKKyAgICAgIGJTa2lwcGVkID0gVFJVRTsKKyAgICB9CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IEdldFJvb3QoKTsKKyAgaWYgKHBSb290ID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMgPSBwUm9vdC0+R2V0RGljdChGWF9CU1RSQygiUGFnZXMiKSk7CisgIGlmIChwUGFnZXMgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpbnQgaW5kZXggPSAwOworICByZXR1cm4gX0ZpbmRQYWdlSW5kZXgocFBhZ2VzLCBza2lwX2NvdW50LCBvYmpudW0sIGluZGV4KTsKK30KK2ludCBDUERGX0RvY3VtZW50OjpHZXRQYWdlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBtX1BhZ2VMaXN0LkdldFNpemUoKTsKK30KK3N0YXRpYyBpbnQgX0NvdW50UGFnZXMoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMsIGludCBsZXZlbCkgeworICBpZiAobGV2ZWwgPiAxMjgpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgY291bnQgPSBwUGFnZXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvdW50IikpOworICBpZiAoY291bnQgPiAwICYmIGNvdW50IDwgRlBERl9QQUdFX01BWF9OVU0pIHsKICAgICByZXR1cm4gY291bnQ7CisgIH0KKyAgQ1BERl9BcnJheSogcEtpZExpc3QgPSBwUGFnZXMtPkdldEFycmF5KEZYX0JTVFJDKCJLaWRzIikpOworICBpZiAocEtpZExpc3QgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGNvdW50ID0gMDsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRMaXN0LT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkTGlzdC0+R2V0RGljdChpKTsKKyAgICBpZiAocEtpZCA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFwS2lkLT5LZXlFeGlzdChGWF9CU1RSQygiS2lkcyIpKSkgeworICAgICAgY291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgY291bnQgKz0gX0NvdW50UGFnZXMocEtpZCwgbGV2ZWwgKyAxKTsKKyAgICB9CisgIH0KKyAgcFBhZ2VzLT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkNvdW50IiksIGNvdW50KTsKKyAgcmV0dXJuIGNvdW50OwogfQotaW50IENQREZfRG9jdW1lbnQ6Ol9HZXRQYWdlQ291bnQoKSBjb25zdAotewotICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBHZXRSb290KCk7Ci0gICAgaWYgKHBSb290ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gcFJvb3QtPkdldERpY3QoRlhfQlNUUkMoIlBhZ2VzIikpOwotICAgIGlmIChwUGFnZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKCFwUGFnZXMtPktleUV4aXN0KEZYX0JTVFJDKCJLaWRzIikpKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gX0NvdW50UGFnZXMocFBhZ2VzLCAwKTsKK2ludCBDUERGX0RvY3VtZW50OjpfR2V0UGFnZUNvdW50KCkgY29uc3QgeworICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gR2V0Um9vdCgpOworICBpZiAocFJvb3QgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gcFJvb3QtPkdldERpY3QoRlhfQlNUUkMoIlBhZ2VzIikpOworICBpZiAocFBhZ2VzID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIXBQYWdlcy0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gX0NvdW50UGFnZXMocFBhZ2VzLCAwKTsKIH0KLUZYX0JPT0wgQ1BERl9Eb2N1bWVudDo6SXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sIENQREZfRGljdGlvbmFyeSogcFRoaXNQYWdlRGljdCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fUGFnZUxpc3QuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gR2V0UGFnZShpKTsKLSAgICAgICAgaWYgKHBQYWdlRGljdCA9PSBwVGhpc1BhZ2VEaWN0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKK0ZYX0JPT0wgQ1BERl9Eb2N1bWVudDo6SXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwVGhpc1BhZ2VEaWN0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9QYWdlTGlzdC5HZXRTaXplKCk7IGkrKykgeworICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gR2V0UGFnZShpKTsKKyAgICBpZiAocFBhZ2VEaWN0ID09IHBUaGlzUGFnZURpY3QpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDUERGX09iamVjdCogcENvbnRlbnRzID0KKyAgICAgICAgcFBhZ2VEaWN0ID8gcFBhZ2VEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJDb250ZW50cyIpKSA6IE5VTEw7CisgICAgaWYgKHBDb250ZW50cyA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHBDb250ZW50cy0+R2V0RGlyZWN0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50cy0+R2V0RGlyZWN0KCk7CisgICAgICBmb3IgKEZYX0RXT1JEIGogPSAwOyBqIDwgcEFycmF5LT5HZXRDb3VudCgpOyBqKyspIHsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBSZWYgPSBwQXJyYXktPkdldEVsZW1lbnQoaik7CisgICAgICAgIGlmIChwUmVmID09IE5VTEwgfHwgcFJlZi0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcENvbnRlbnRzID0gcFBhZ2VEaWN0ID8gcFBhZ2VEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJDb250ZW50cyIpKSA6IE5VTEw7Ci0gICAgICAgIGlmIChwQ29udGVudHMgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgoKENQREZfUmVmZXJlbmNlKilwUmVmKS0+R2V0UmVmT2JqTnVtKCkgPT0gb2JqbnVtKSB7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBDb250ZW50cy0+R2V0RGlyZWN0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50cy0+R2V0RGlyZWN0KCk7Ci0gICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGogPSAwOyBqIDwgcEFycmF5LT5HZXRDb3VudCgpOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBSZWYgPSBwQXJyYXktPkdldEVsZW1lbnQoaik7Ci0gICAgICAgICAgICAgICAgaWYgKHBSZWYgPT0gTlVMTCB8fCBwUmVmLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCgoQ1BERl9SZWZlcmVuY2UqKSBwUmVmKS0+R2V0UmVmT2JqTnVtKCkgPT0gb2JqbnVtKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwQ29udGVudHMtPkdldE9iak51bSgpID09IG9iam51bSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBDb250ZW50cy0+R2V0T2JqTnVtKCkgPT0gb2JqbnVtKSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0RXT1JEIENQREZfRG9jdW1lbnQ6OkdldFVzZXJQZXJtaXNzaW9ucyhGWF9CT09MIGJDaGVja1JldmlzaW9uKSBjb25zdAotewotICAgIGlmIChtX3BQYXJzZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7Ci0gICAgfQotICAgIHJldHVybiBtX3BQYXJzZXItPkdldFBlcm1pc3Npb25zKGJDaGVja1JldmlzaW9uKTsKK0ZYX0RXT1JEIENQREZfRG9jdW1lbnQ6OkdldFVzZXJQZXJtaXNzaW9ucyhGWF9CT09MIGJDaGVja1JldmlzaW9uKSBjb25zdCB7CisgIGlmIChtX3BQYXJzZXIgPT0gTlVMTCkgeworICAgIHJldHVybiAoRlhfRFdPUkQpLTE7CisgIH0KKyAgcmV0dXJuIG1fcFBhcnNlci0+R2V0UGVybWlzc2lvbnMoYkNoZWNrUmV2aXNpb24pOwogfQotRlhfQk9PTCBDUERGX0RvY3VtZW50OjpJc093bmVyKCkgY29uc3QKLXsKLSAgICBpZiAobV9wUGFyc2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBtX3BQYXJzZXItPklzT3duZXIoKTsKK0ZYX0JPT0wgQ1BERl9Eb2N1bWVudDo6SXNPd25lcigpIGNvbnN0IHsKKyAgaWYgKG1fcFBhcnNlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIG1fcFBhcnNlci0+SXNPd25lcigpOwogfQotRlhfQk9PTCBDUERGX0RvY3VtZW50OjpJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBGWF9CT09MJiBiRm9ybSkgY29uc3QKLXsKLSAgICB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqOwotICAgICAgICBpZiAobV9JbmRpcmVjdE9ianMuTG9va3VwKCh2b2lkKikodWludHB0cl90KW9iam51bSwgKHZvaWQqJilwT2JqKSkgewotICAgICAgICAgICAgYkZvcm0gPSBwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSAmJgotICAgICAgICAgICAgICAgICAgICAoKENQREZfU3RyZWFtKilwT2JqKS0+R2V0RGljdCgpLT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkgPT0gRlhfQlNUUkMoIkZvcm0iKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9CitGWF9CT09MIENQREZfRG9jdW1lbnQ6OklzRm9ybVN0cmVhbShGWF9EV09SRCBvYmpudW0sIEZYX0JPT0wmIGJGb3JtKSBjb25zdCB7CisgIHsKKyAgICBDUERGX09iamVjdCogcE9iajsKKyAgICBpZiAobV9JbmRpcmVjdE9ianMuTG9va3VwKCh2b2lkKikodWludHB0cl90KW9iam51bSwgKHZvaWQqJilwT2JqKSkgeworICAgICAgYkZvcm0gPSBwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSAmJgorICAgICAgICAgICAgICAoKENQREZfU3RyZWFtKilwT2JqKS0+R2V0RGljdCgpLT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkgPT0KKyAgICAgICAgICAgICAgICAgIEZYX0JTVFJDKCJGb3JtIik7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgaWYgKG1fcFBhcnNlciA9PSBOVUxMKSB7Ci0gICAgICAgIGJGb3JtID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gbV9wUGFyc2VyLT5Jc0Zvcm1TdHJlYW0ob2JqbnVtLCBiRm9ybSk7CisgIH0KKyAgaWYgKG1fcFBhcnNlciA9PSBOVUxMKSB7CisgICAgYkZvcm0gPSBGQUxTRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gbV9wUGFyc2VyLT5Jc0Zvcm1TdHJlYW0ob2JqbnVtLCBiRm9ybSk7CiB9Ci12b2lkIENQREZfRG9jdW1lbnQ6OkNsZWFyUGFnZURhdGEoKQotewotICAgIGlmIChtX3BEb2NQYWdlKSB7Ci0gICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5DbGVhckRvYyh0aGlzKTsKLSAgICB9Cit2b2lkIENQREZfRG9jdW1lbnQ6OkNsZWFyUGFnZURhdGEoKSB7CisgIGlmIChtX3BEb2NQYWdlKSB7CisgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkNsZWFyRG9jKHRoaXMpOworICB9CiB9Ci12b2lkIENQREZfRG9jdW1lbnQ6OkNsZWFyUmVuZGVyRGF0YSgpCi17Ci0gICAgaWYgKG1fcERvY1JlbmRlcikgewotICAgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFJlbmRlck1vZHVsZSgpLT5DbGVhckRvY0RhdGEobV9wRG9jUmVuZGVyKTsKLSAgICB9Cit2b2lkIENQREZfRG9jdW1lbnQ6OkNsZWFyUmVuZGVyRGF0YSgpIHsKKyAgaWYgKG1fcERvY1JlbmRlcikgeworICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCktPkNsZWFyRG9jRGF0YShtX3BEb2NSZW5kZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2VuY3J5cHQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9lbmNyeXB0LmNwcAppbmRleCA5ZjM1NmE0Li41NWU2NDhhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2VuY3J5cHQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZW5jcnlwdC5jcHAKQEAgLTgsOTUyICs4LDEwMzkgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Zkcm0vZnhfY3J5cHQuaCIKIGNvbnN0IHVpbnQ4X3QgZGVmcGFzc2NvZGVbMzJdID0gewotICAgIDB4MjgsIDB4YmYsIDB4NGUsIDB4NWUsIDB4NGUsIDB4NzUsIDB4OGEsIDB4NDEsCi0gICAgMHg2NCwgMHgwMCwgMHg0ZSwgMHg1NiwgMHhmZiwgMHhmYSwgMHgwMSwgMHgwOCwKLSAgICAweDJlLCAweDJlLCAweDAwLCAweGI2LCAweGQwLCAweDY4LCAweDNlLCAweDgwLAotICAgIDB4MmYsIDB4MGMsIDB4YTksIDB4ZmUsIDB4NjQsIDB4NTMsIDB4NjksIDB4N2EKLX07Ci12b2lkIENhbGNFbmNyeXB0S2V5KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHQsIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGtleSwgaW50IGtleWxlbiwgRlhfQk9PTCBiSWdub3JlTWV0YSwgQ1BERl9BcnJheSogcElkQXJyYXkpCi17Ci0gICAgaW50IHJldmlzaW9uID0gcEVuY3J5cHQtPkdldEludGVnZXIoRlhfQlNUUkMoIlIiKSk7Ci0gICAgdWludDhfdCBwYXNzY29kZVszMl07Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IDMyOyBpICsrKSB7Ci0gICAgICAgIHBhc3Njb2RlW2ldID0gaSA8IHBhc3Nfc2l6ZSA/IHBhc3N3b3JkW2ldIDogZGVmcGFzc2NvZGVbaSAtIHBhc3Nfc2l6ZV07CisgICAgMHgyOCwgMHhiZiwgMHg0ZSwgMHg1ZSwgMHg0ZSwgMHg3NSwgMHg4YSwgMHg0MSwgMHg2NCwgMHgwMCwgMHg0ZSwKKyAgICAweDU2LCAweGZmLCAweGZhLCAweDAxLCAweDA4LCAweDJlLCAweDJlLCAweDAwLCAweGI2LCAweGQwLCAweDY4LAorICAgIDB4M2UsIDB4ODAsIDB4MmYsIDB4MGMsIDB4YTksIDB4ZmUsIDB4NjQsIDB4NTMsIDB4NjksIDB4N2F9Owordm9pZCBDYWxjRW5jcnlwdEtleShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcGFzc19zaXplLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgIGludCBrZXlsZW4sCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklnbm9yZU1ldGEsCisgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBJZEFycmF5KSB7CisgIGludCByZXZpc2lvbiA9IHBFbmNyeXB0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSIikpOworICB1aW50OF90IHBhc3Njb2RlWzMyXTsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICBwYXNzY29kZVtpXSA9IGkgPCBwYXNzX3NpemUgPyBwYXNzd29yZFtpXSA6IGRlZnBhc3Njb2RlW2kgLSBwYXNzX3NpemVdOworICB9CisgIHVpbnQ4X3QgbWQ1WzEwMF07CisgIENSWVBUX01ENVN0YXJ0KG1kNSk7CisgIENSWVBUX01ENVVwZGF0ZShtZDUsIHBhc3Njb2RlLCAzMik7CisgIENGWF9CeXRlU3RyaW5nIG9rZXkgPSBwRW5jcnlwdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJPIikpOworICBDUllQVF9NRDVVcGRhdGUobWQ1LCAodWludDhfdCopb2tleS5jX3N0cigpLCBva2V5LkdldExlbmd0aCgpKTsKKyAgRlhfRFdPUkQgcGVybSA9IHBFbmNyeXB0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQIikpOworICBDUllQVF9NRDVVcGRhdGUobWQ1LCAodWludDhfdCopJnBlcm0sIDQpOworICBpZiAocElkQXJyYXkpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBpZCA9IHBJZEFycmF5LT5HZXRTdHJpbmcoMCk7CisgICAgQ1JZUFRfTUQ1VXBkYXRlKG1kNSwgKHVpbnQ4X3QqKWlkLmNfc3RyKCksIGlkLkdldExlbmd0aCgpKTsKKyAgfQorICBpZiAoIWJJZ25vcmVNZXRhICYmIHJldmlzaW9uID49IDMgJiYKKyAgICAgICFwRW5jcnlwdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiRW5jcnlwdE1ldGFkYXRhIiksIDEpKSB7CisgICAgRlhfRFdPUkQgdGFnID0gKEZYX0RXT1JEKS0xOworICAgIENSWVBUX01ENVVwZGF0ZShtZDUsICh1aW50OF90KikmdGFnLCA0KTsKKyAgfQorICB1aW50OF90IGRpZ2VzdFsxNl07CisgIENSWVBUX01ENUZpbmlzaChtZDUsIGRpZ2VzdCk7CisgIEZYX0RXT1JEIGNvcHlfbGVuID0ga2V5bGVuOworICBpZiAoY29weV9sZW4gPiBzaXplb2YoZGlnZXN0KSkgeworICAgIGNvcHlfbGVuID0gc2l6ZW9mKGRpZ2VzdCk7CisgIH0KKyAgaWYgKHJldmlzaW9uID49IDMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHsKKyAgICAgIENSWVBUX01ENUdlbmVyYXRlKGRpZ2VzdCwgY29weV9sZW4sIGRpZ2VzdCk7CisgICAgfQorICB9CisgIEZYU1lTX21lbXNldChrZXksIDAsIGtleWxlbik7CisgIEZYU1lTX21lbWNweShrZXksIGRpZ2VzdCwgY29weV9sZW4pOworfQorQ1BERl9DcnlwdG9IYW5kbGVyKiBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDcmVhdGVDcnlwdG9IYW5kbGVyKCkgeworICByZXR1cm4gbmV3IENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOworfQordHlwZWRlZiBzdHJ1Y3QgX1BERl9DUllQVE9JVEVNIHsKKyAgaW50MzJfdCBtX0NpcGhlcjsKKyAgaW50MzJfdCBtX0tleUxlbjsKKyAgRlhfQk9PTCBtX2JDaGVja2VkOworICBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlciogbV9wQ3J5cHRvSGFuZGxlcjsKK30gUERGX0NSWVBUT0lURU07CitDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkgeworICBtX1ZlcnNpb24gPSAwOworICBtX1JldmlzaW9uID0gMDsKKyAgbV9wUGFyc2VyID0gTlVMTDsKKyAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOworICBtX2JPd25lciA9IEZBTFNFOworICBtX1Blcm1pc3Npb25zID0gMDsKKyAgbV9DaXBoZXIgPSBGWENJUEhFUl9OT05FOworICBtX0tleUxlbiA9IDA7Cit9CitDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjp+Q1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcigpIHt9CitGWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6Ok9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KSB7CisgIG1fcFBhcnNlciA9IHBQYXJzZXI7CisgIGlmICghTG9hZERpY3QocEVuY3J5cHREaWN0KSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfTk9ORSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBDaGVja1NlY3VyaXR5KG1fS2V5TGVuKTsKK30KK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tTZWN1cml0eShpbnQzMl90IGtleV9sZW4pIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgcGFzc3dvcmQgPSBtX3BQYXJzZXItPkdldFBhc3N3b3JkKCk7CisgIGlmIChDaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBwYXNzd29yZC5HZXRMZW5ndGgoKSwgVFJVRSwgbV9FbmNyeXB0S2V5LAorICAgICAgICAgICAgICAgICAgICBrZXlfbGVuKSkgeworICAgIGlmIChwYXNzd29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgIGlmICghQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIEZBTFNFLCBtX0VuY3J5cHRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2xlbikpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICBtX2JPd25lciA9IFRSVUU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkLkdldExlbmd0aCgpLCBGQUxTRSwgbV9FbmNyeXB0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICBrZXlfbGVuKTsKK30KK0ZYX0RXT1JEIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkdldFBlcm1pc3Npb25zKCkgeworICByZXR1cm4gbV9QZXJtaXNzaW9uczsKK30KK3N0YXRpYyBGWF9CT09MIF9Mb2FkQ3J5cHRJbmZvKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBjaXBoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGtleWxlbikgeworICBpbnQgVmVyc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiViIpKTsKKyAgY2lwaGVyID0gRlhDSVBIRVJfUkM0OworICBrZXlsZW4gPSAwOworICBpZiAoVmVyc2lvbiA+PSA0KSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ3J5cHRGaWx0ZXJzID0gcEVuY3J5cHREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJDRiIpKTsKKyAgICBpZiAocENyeXB0RmlsdGVycyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmIChuYW1lID09IEZYX0JTVFJDKCJJZGVudGl0eSIpKSB7CisgICAgICBjaXBoZXIgPSBGWENJUEhFUl9OT05FOworICAgIH0gZWxzZSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEZWZGaWx0ZXIgPSBwQ3J5cHRGaWx0ZXJzLT5HZXREaWN0KG5hbWUpOworICAgICAgaWYgKHBEZWZGaWx0ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpbnQgbktleUJpdHMgPSAwOworICAgICAgaWYgKFZlcnNpb24gPT0gNCkgeworICAgICAgICBuS2V5Qml0cyA9IHBEZWZGaWx0ZXItPkdldEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCAwKTsKKyAgICAgICAgaWYgKG5LZXlCaXRzID09IDApIHsKKyAgICAgICAgICBuS2V5Qml0cyA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIDEyOCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5LZXlCaXRzID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSwgMjU2KTsKKyAgICAgIH0KKyAgICAgIGlmIChuS2V5Qml0cyA8IDQwKSB7CisgICAgICAgIG5LZXlCaXRzICo9IDg7CisgICAgICB9CisgICAgICBrZXlsZW4gPSBuS2V5Qml0cyAvIDg7CisgICAgICBDRlhfQnl0ZVN0cmluZyBjaXBoZXJfbmFtZSA9IHBEZWZGaWx0ZXItPkdldFN0cmluZyhGWF9CU1RSQygiQ0ZNIikpOworICAgICAgaWYgKGNpcGhlcl9uYW1lID09IEZYX0JTVFJDKCJBRVNWMiIpIHx8CisgICAgICAgICAgY2lwaGVyX25hbWUgPT0gRlhfQlNUUkMoIkFFU1YzIikpIHsKKyAgICAgICAgY2lwaGVyID0gRlhDSVBIRVJfQUVTOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBrZXlsZW4gPQorICAgICAgICBWZXJzaW9uID4gMSA/IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIDQwKSAvIDggOiA1OworICB9CisgIGlmIChrZXlsZW4gPiAzMiB8fCBrZXlsZW4gPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCkgeworICBtX3BFbmNyeXB0RGljdCA9IHBFbmNyeXB0RGljdDsKKyAgbV9iT3duZXIgPSBGQUxTRTsKKyAgbV9WZXJzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJWIikpOworICBtX1JldmlzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSIikpOworICBtX1Blcm1pc3Npb25zID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQIiksIC0xKTsKKyAgaWYgKG1fVmVyc2lvbiA8IDQpIHsKKyAgICByZXR1cm4gX0xvYWRDcnlwdEluZm8ocEVuY3J5cHREaWN0LCBDRlhfQnl0ZVN0cmluZygpLCBtX0NpcGhlciwgbV9LZXlMZW4pOworICB9CisgIENGWF9CeXRlU3RyaW5nIHN0bWZfbmFtZSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdG1GIikpOworICBDRlhfQnl0ZVN0cmluZyBzdHJmX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RyRiIpKTsKKyAgaWYgKHN0bWZfbmFtZSAhPSBzdHJmX25hbWUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIHN0cmZfbmFtZSwgbV9DaXBoZXIsIG1fS2V5TGVuKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6TG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGtleV9sZW4pIHsKKyAgbV9wRW5jcnlwdERpY3QgPSBwRW5jcnlwdERpY3Q7CisgIG1fYk93bmVyID0gRkFMU0U7CisgIG1fVmVyc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiViIpKTsKKyAgbV9SZXZpc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUiIpKTsKKyAgbV9QZXJtaXNzaW9ucyA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUCIpLCAtMSk7CisgIENGWF9CeXRlU3RyaW5nIHN0cmZfbmFtZSwgc3RtZl9uYW1lOworICBpZiAobV9WZXJzaW9uID49IDQpIHsKKyAgICBzdG1mX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RtRiIpKTsKKyAgICBzdHJmX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RyRiIpKTsKKyAgICBpZiAoc3RtZl9uYW1lICE9IHN0cmZfbmFtZSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBpZiAoIV9Mb2FkQ3J5cHRJbmZvKHBFbmNyeXB0RGljdCwgc3RyZl9uYW1lLCBjaXBoZXIsIGtleV9sZW4pKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fQ2lwaGVyID0gY2lwaGVyOworICBtX0tleUxlbiA9IGtleV9sZW47CisgIHJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6R2V0Q3J5cHRJbmZvKGludCYgY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdComIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYga2V5bGVuKSB7CisgIGNpcGhlciA9IG1fQ2lwaGVyOworICBidWZmZXIgPSBtX0VuY3J5cHRLZXk7CisgIGtleWxlbiA9IG1fS2V5TGVuOworICByZXR1cm4gVFJVRTsKK30KKyNkZWZpbmUgRlhfR0VUXzMyV09SRChuLCBiLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChuKSA9IChGWF9EV09SRCkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50NjRfdCkoYilbKGkpXSA8PCAyNCkgfCAoKHVpbnQ2NF90KShiKVsoaSkgKyAxXSA8PCAxNikgfCBcCisgICAgICAgICgodWludDY0X3QpKGIpWyhpKSArIDJdIDw8IDgpIHwgKCh1aW50NjRfdCkoYilbKGkpICsgM10pKTsgICAgXAorICB9CitpbnQgQmlnT3JkZXI2NEJpdHNNb2QzKHVpbnQ4X3QqIGRhdGEpIHsKKyAgdWludDY0X3QgcmV0ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBGWF9EV09SRCB2YWx1ZTsKKyAgICBGWF9HRVRfMzJXT1JEKHZhbHVlLCBkYXRhLCA0ICogaSk7CisgICAgcmV0IDw8PSAzMjsKKyAgICByZXQgfD0gdmFsdWU7CisgICAgcmV0ICU9IDM7CisgIH0KKyAgcmV0dXJuIChpbnQpcmV0OworfQordm9pZCBSZXZpc2lvbjZfSGFzaChjb25zdCB1aW50OF90KiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2FsdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBoYXNoKSB7CisgIGludCBpQmxvY2tTaXplID0gMzI7CisgIHVpbnQ4X3Qgc2hhWzEyOF07CisgIENSWVBUX1NIQTI1NlN0YXJ0KHNoYSk7CisgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHBhc3N3b3JkLCBzaXplKTsKKyAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgc2FsdCwgOCk7CisgIGlmICh2ZWN0b3IpIHsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCB2ZWN0b3IsIDQ4KTsKKyAgfQorICB1aW50OF90IGRpZ2VzdFszMl07CisgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIGRpZ2VzdCk7CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIHVpbnQ4X3QqIGlucHV0ID0gZGlnZXN0OworICB1aW50OF90KiBrZXkgPSBpbnB1dDsKKyAgdWludDhfdCogaXYgPSBpbnB1dCArIDE2OworICB1aW50OF90KiBFID0gYnVmLkdldEJ1ZmZlcigpOworICBpbnQgaUJ1ZkxlbiA9IGJ1Zi5HZXRMZW5ndGgoKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGludGVyRGlnZXN0OworICBpbnQgaSA9IDA7CisgIHVpbnQ4X3QqIGFlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOworICB3aGlsZSAoaSA8IDY0IHx8IGkgPCBFW2lCdWZMZW4gLSAxXSArIDMyKSB7CisgICAgaW50IGlSb3VuZFNpemUgPSBzaXplICsgaUJsb2NrU2l6ZTsKKyAgICBpZiAodmVjdG9yKSB7CisgICAgICBpUm91bmRTaXplICs9IDQ4OworICAgIH0KKyAgICBpQnVmTGVuID0gaVJvdW5kU2l6ZSAqIDY0OworICAgIGJ1Zi5Fc3RpbWF0ZVNpemUoaUJ1Zkxlbik7CisgICAgRSA9IGJ1Zi5HZXRCdWZmZXIoKTsKKyAgICBDRlhfQnl0ZVRleHRCdWYgY29udGVudDsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDY0OyArK2opIHsKKyAgICAgIGNvbnRlbnQuQXBwZW5kQmxvY2socGFzc3dvcmQsIHNpemUpOworICAgICAgY29udGVudC5BcHBlbmRCbG9jayhpbnB1dCwgaUJsb2NrU2l6ZSk7CisgICAgICBpZiAodmVjdG9yKSB7CisgICAgICAgIGNvbnRlbnQuQXBwZW5kQmxvY2sodmVjdG9yLCA0OCk7CisgICAgICB9CisgICAgfQorICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBrZXksIDE2LCBUUlVFKTsKKyAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKKyAgICBDUllQVF9BRVNFbmNyeXB0KGFlcywgRSwgY29udGVudC5HZXRCdWZmZXIoKSwgaUJ1Zkxlbik7CisgICAgaW50IGlIYXNoID0gMDsKKyAgICBzd2l0Y2ggKEJpZ09yZGVyNjRCaXRzTW9kMyhFKSkgeworICAgICAgY2FzZSAwOgorICAgICAgICBpSGFzaCA9IDA7CisgICAgICAgIGlCbG9ja1NpemUgPSAzMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlIYXNoID0gMTsKKyAgICAgICAgaUJsb2NrU2l6ZSA9IDQ4OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlIYXNoID0gMjsKKyAgICAgICAgaUJsb2NrU2l6ZSA9IDY0OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaW50ZXJEaWdlc3QuRXN0aW1hdGVTaXplKGlCbG9ja1NpemUpOworICAgIGlucHV0ID0gaW50ZXJEaWdlc3QuR2V0QnVmZmVyKCk7CisgICAgaWYgKGlIYXNoID09IDApIHsKKyAgICAgIENSWVBUX1NIQTI1NkdlbmVyYXRlKEUsIGlCdWZMZW4sIGlucHV0KTsKKyAgICB9IGVsc2UgaWYgKGlIYXNoID09IDEpIHsKKyAgICAgIENSWVBUX1NIQTM4NEdlbmVyYXRlKEUsIGlCdWZMZW4sIGlucHV0KTsKKyAgICB9IGVsc2UgaWYgKGlIYXNoID09IDIpIHsKKyAgICAgIENSWVBUX1NIQTUxMkdlbmVyYXRlKEUsIGlCdWZMZW4sIGlucHV0KTsKKyAgICB9CisgICAga2V5ID0gaW5wdXQ7CisgICAgaXYgPSBpbnB1dCArIDE2OworICAgICsraTsKKyAgfQorICBGWF9GcmVlKGFlcyk7CisgIGlmIChoYXNoKSB7CisgICAgRlhTWVNfbWVtY3B5KGhhc2gsIGlucHV0LCAzMik7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X0NoZWNrUGFzc3dvcmQoCisgICAgY29uc3QgdWludDhfdCogcGFzc3dvcmQsCisgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICBGWF9CT09MIGJPd25lciwKKyAgICB1aW50OF90KiBrZXkpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgb2tleSA9IG1fcEVuY3J5cHREaWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJPIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDRlhfQnl0ZVN0cmluZygpOworICBpZiAob2tleS5HZXRMZW5ndGgoKSA8IDQ4KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9CeXRlU3RyaW5nIHVrZXkgPSBtX3BFbmNyeXB0RGljdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiVSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgaWYgKHVrZXkuR2V0TGVuZ3RoKCkgPCA0OCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjb25zdCB1aW50OF90KiBwa2V5ID0gYk93bmVyID8gKGNvbnN0IHVpbnQ4X3QqKW9rZXkgOiAoY29uc3QgdWludDhfdCopdWtleTsKKyAgdWludDhfdCBzaGFbMTI4XTsKKyAgdWludDhfdCBkaWdlc3RbMzJdOworICBpZiAobV9SZXZpc2lvbiA+PSA2KSB7CisgICAgUmV2aXNpb242X0hhc2gocGFzc3dvcmQsIHNpemUsIChjb25zdCB1aW50OF90Kilwa2V5ICsgMzIsCisgICAgICAgICAgICAgICAgICAgKGJPd25lciA/IChjb25zdCB1aW50OF90Kil1a2V5IDogTlVMTCksIGRpZ2VzdCk7CisgIH0gZWxzZSB7CisgICAgQ1JZUFRfU0hBMjU2U3RhcnQoc2hhKTsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBwYXNzd29yZCwgc2l6ZSk7CisgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgcGtleSArIDMyLCA4KTsKKyAgICBpZiAoYk93bmVyKSB7CisgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCB1a2V5LCA0OCk7CisgICAgfQorICAgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIGRpZ2VzdCk7CisgIH0KKyAgaWYgKEZYU1lTX21lbWNtcChkaWdlc3QsIHBrZXksIDMyKSAhPSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChrZXkgPT0gTlVMTCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChtX1JldmlzaW9uID49IDYpIHsKKyAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgc2l6ZSwgKGNvbnN0IHVpbnQ4X3QqKXBrZXkgKyA0MCwKKyAgICAgICAgICAgICAgICAgICAoYk93bmVyID8gKGNvbnN0IHVpbnQ4X3QqKXVrZXkgOiBOVUxMKSwgZGlnZXN0KTsKKyAgfSBlbHNlIHsKKyAgICBDUllQVF9TSEEyNTZTdGFydChzaGEpOworICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHBhc3N3b3JkLCBzaXplKTsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBwa2V5ICsgNDAsIDgpOworICAgIGlmIChiT3duZXIpIHsKKyAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHVrZXksIDQ4KTsKKyAgICB9CisgICAgQ1JZUFRfU0hBMjU2RmluaXNoKHNoYSwgZGlnZXN0KTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBla2V5ID0KKyAgICAgIG1fcEVuY3J5cHREaWN0CisgICAgICAgICAgPyBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKGJPd25lciA/IEZYX0JTVFJDKCJPRSIpIDogRlhfQlNUUkMoIlVFIikpCisgICAgICAgICAgOiBDRlhfQnl0ZVN0cmluZygpOworICBpZiAoZWtleS5HZXRMZW5ndGgoKSA8IDMyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHVpbnQ4X3QqIGFlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOworICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwgZGlnZXN0LCAzMiwgRkFMU0UpOworICB1aW50OF90IGl2WzE2XTsKKyAgRlhTWVNfbWVtc2V0KGl2LCAwLCAxNik7CisgIENSWVBUX0FFU1NldElWKGFlcywgaXYpOworICBDUllQVF9BRVNEZWNyeXB0KGFlcywga2V5LCBla2V5LCAzMik7CisgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBrZXksIDMyLCBGQUxTRSk7CisgIENSWVBUX0FFU1NldElWKGFlcywgaXYpOworICBDRlhfQnl0ZVN0cmluZyBwZXJtcyA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlBlcm1zIikpOworICBpZiAocGVybXMuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHVpbnQ4X3QgcGVybXNfYnVmWzE2XTsKKyAgRlhTWVNfbWVtc2V0KHBlcm1zX2J1ZiwgMCwgc2l6ZW9mKHBlcm1zX2J1ZikpOworICBGWF9EV09SRCBjb3B5X2xlbiA9IHNpemVvZihwZXJtc19idWYpOworICBpZiAoY29weV9sZW4gPiAoRlhfRFdPUkQpcGVybXMuR2V0TGVuZ3RoKCkpIHsKKyAgICBjb3B5X2xlbiA9IHBlcm1zLkdldExlbmd0aCgpOworICB9CisgIEZYU1lTX21lbWNweShwZXJtc19idWYsIChjb25zdCB1aW50OF90KilwZXJtcywgY29weV9sZW4pOworICB1aW50OF90IGJ1ZlsxNl07CisgIENSWVBUX0FFU0RlY3J5cHQoYWVzLCBidWYsIHBlcm1zX2J1ZiwgMTYpOworICBGWF9GcmVlKGFlcyk7CisgIGlmIChidWZbOV0gIT0gJ2EnIHx8IGJ1ZlsxMF0gIT0gJ2QnIHx8IGJ1ZlsxMV0gIT0gJ2InKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChGWERXT1JEX0dFVF9MU0JGSVJTVChidWYpICE9IG1fUGVybWlzc2lvbnMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKChidWZbOF0gPT0gJ1QnICYmICFJc01ldGFkYXRhRW5jcnlwdGVkKCkpIHx8CisgICAgICAoYnVmWzhdID09ICdGJyAmJiBJc01ldGFkYXRhRW5jcnlwdGVkKCkpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQoraW50IENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGtleSkgeworICByZXR1cm4gQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc19zaXplLCBiT3duZXIsIGtleSwgbV9LZXlMZW4pOworfQoraW50IENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGtleV9sZW4pIHsKKyAgaWYgKG1fUmV2aXNpb24gPj0gNSkgeworICAgIHJldHVybiBBRVMyNTZfQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgc2l6ZSwgYk93bmVyLCBrZXkpOworICB9CisgIHVpbnQ4X3Qga2V5YnVmWzMyXTsKKyAgaWYgKGtleSA9PSBOVUxMKSB7CisgICAga2V5ID0ga2V5YnVmOworICB9CisgIGlmIChiT3duZXIpIHsKKyAgICByZXR1cm4gQ2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBrZXksIGtleV9sZW4pOworICB9CisgIHJldHVybiBDaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgc2l6ZSwgRkFMU0UsIGtleSwga2V5X2xlbikgfHwKKyAgICAgICAgIENoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBUUlVFLCBrZXksIGtleV9sZW4pOworfQorRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1VzZXJQYXNzd29yZCgKKyAgICBjb25zdCB1aW50OF90KiBwYXNzd29yZCwKKyAgICBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgRlhfQk9PTCBiSWdub3JlRW5jcnlwdE1ldGEsCisgICAgdWludDhfdCoga2V5LAorICAgIGludDMyX3Qga2V5X2xlbikgeworICBDYWxjRW5jcnlwdEtleShtX3BFbmNyeXB0RGljdCwgcGFzc3dvcmQsIHBhc3Nfc2l6ZSwga2V5LCBrZXlfbGVuLAorICAgICAgICAgICAgICAgICBiSWdub3JlRW5jcnlwdE1ldGEsIG1fcFBhcnNlci0+R2V0SURBcnJheSgpKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgdWtleSA9IG1fcEVuY3J5cHREaWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJVIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDRlhfQnl0ZVN0cmluZygpOworICBpZiAodWtleS5HZXRMZW5ndGgoKSA8IDE2KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHVpbnQ4X3QgdWtleWJ1ZlszMl07CisgIGlmIChtX1JldmlzaW9uID09IDIpIHsKKyAgICBGWFNZU19tZW1jcHkodWtleWJ1ZiwgZGVmcGFzc2NvZGUsIDMyKTsKKyAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayh1a2V5YnVmLCAzMiwga2V5LCBrZXlfbGVuKTsKKyAgfSBlbHNlIHsKKyAgICB1aW50OF90IHRlc3RbMzJdLCB0bXBrZXlbMzJdOworICAgIEZYX0RXT1JEIGNvcHlfbGVuID0gc2l6ZW9mKHRlc3QpOworICAgIGlmIChjb3B5X2xlbiA+IChGWF9EV09SRCl1a2V5LkdldExlbmd0aCgpKSB7CisgICAgICBjb3B5X2xlbiA9IHVrZXkuR2V0TGVuZ3RoKCk7CisgICAgfQorICAgIEZYU1lTX21lbXNldCh0ZXN0LCAwLCBzaXplb2YodGVzdCkpOworICAgIEZYU1lTX21lbXNldCh0bXBrZXksIDAsIHNpemVvZih0bXBrZXkpKTsKKyAgICBGWFNZU19tZW1jcHkodGVzdCwgdWtleS5jX3N0cigpLCBjb3B5X2xlbik7CisgICAgZm9yIChpbnQgaSA9IDE5OyBpID49IDA7IGktLSkgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrZXlfbGVuOyBqKyspIHsKKyAgICAgICAgdG1wa2V5W2pdID0ga2V5W2pdIF4gaTsKKyAgICAgIH0KKyAgICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHRlc3QsIDMyLCB0bXBrZXksIGtleV9sZW4pOwogICAgIH0KICAgICB1aW50OF90IG1kNVsxMDBdOwogICAgIENSWVBUX01ENVN0YXJ0KG1kNSk7Ci0gICAgQ1JZUFRfTUQ1VXBkYXRlKG1kNSwgcGFzc2NvZGUsIDMyKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBva2V5ID0gcEVuY3J5cHQtPkdldFN0cmluZyhGWF9CU1RSQygiTyIpKTsKLSAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCAodWludDhfdCopb2tleS5jX3N0cigpLCBva2V5LkdldExlbmd0aCgpKTsKLSAgICBGWF9EV09SRCBwZXJtID0gcEVuY3J5cHQtPkdldEludGVnZXIoRlhfQlNUUkMoIlAiKSk7Ci0gICAgQ1JZUFRfTUQ1VXBkYXRlKG1kNSwgKHVpbnQ4X3QqKSZwZXJtLCA0KTsKKyAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCBkZWZwYXNzY29kZSwgMzIpOworICAgIENQREZfQXJyYXkqIHBJZEFycmF5ID0gbV9wUGFyc2VyLT5HZXRJREFycmF5KCk7CiAgICAgaWYgKHBJZEFycmF5KSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGlkID0gcElkQXJyYXktPkdldFN0cmluZygwKTsKLSAgICAgICAgQ1JZUFRfTUQ1VXBkYXRlKG1kNSwgKHVpbnQ4X3QqKWlkLmNfc3RyKCksIGlkLkdldExlbmd0aCgpKTsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGlkID0gcElkQXJyYXktPkdldFN0cmluZygwKTsKKyAgICAgIENSWVBUX01ENVVwZGF0ZShtZDUsICh1aW50OF90KilpZC5jX3N0cigpLCBpZC5HZXRMZW5ndGgoKSk7CiAgICAgfQotICAgIGlmICghYklnbm9yZU1ldGEgJiYgcmV2aXNpb24gPj0gMyAmJiAhcEVuY3J5cHQtPkdldEludGVnZXIoRlhfQlNUUkMoIkVuY3J5cHRNZXRhZGF0YSIpLCAxKSkgewotICAgICAgICBGWF9EV09SRCB0YWcgPSAoRlhfRFdPUkQpIC0gMTsKLSAgICAgICAgQ1JZUFRfTUQ1VXBkYXRlKG1kNSwgKHVpbnQ4X3QqKSZ0YWcsIDQpOwotICAgIH0KLSAgICB1aW50OF90IGRpZ2VzdFsxNl07Ci0gICAgQ1JZUFRfTUQ1RmluaXNoKG1kNSwgZGlnZXN0KTsKLSAgICBGWF9EV09SRCBjb3B5X2xlbiA9IGtleWxlbjsKLSAgICBpZiAoY29weV9sZW4gPiBzaXplb2YoZGlnZXN0KSkgewotICAgICAgICBjb3B5X2xlbiA9IHNpemVvZihkaWdlc3QpOwotICAgIH0KLSAgICBpZiAocmV2aXNpb24gPj0gMykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpICsrKSB7Ci0gICAgICAgICAgICBDUllQVF9NRDVHZW5lcmF0ZShkaWdlc3QsIGNvcHlfbGVuLCBkaWdlc3QpOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYU1lTX21lbXNldChrZXksIDAsIGtleWxlbik7Ci0gICAgRlhTWVNfbWVtY3B5KGtleSwgZGlnZXN0LCBjb3B5X2xlbik7Ci19Ci1DUERGX0NyeXB0b0hhbmRsZXIqIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNyZWF0ZUNyeXB0b0hhbmRsZXIoKQotewotICAgIHJldHVybiBuZXcgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI7Ci19Ci10eXBlZGVmIHN0cnVjdCBfUERGX0NSWVBUT0lURU0gIHsKLSAgICBpbnQzMl90CW1fQ2lwaGVyOwotICAgIGludDMyX3QJbV9LZXlMZW47Ci0gICAgRlhfQk9PTAkJbV9iQ2hlY2tlZDsKLSAgICBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcioJbV9wQ3J5cHRvSGFuZGxlcjsKLX0gUERGX0NSWVBUT0lURU07Ci1DUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkKLXsKLSAgICBtX1ZlcnNpb24gPSAwOwotICAgIG1fUmV2aXNpb24gPSAwOwotICAgIG1fcFBhcnNlciA9IE5VTEw7Ci0gICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOwotICAgIG1fYk93bmVyID0gRkFMU0U7Ci0gICAgbV9QZXJtaXNzaW9ucyA9IDA7Ci0gICAgbV9DaXBoZXIgPSBGWENJUEhFUl9OT05FOwotICAgIG1fS2V5TGVuID0gMDsKLX0KLUNQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6On5DUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkKLXsKLX0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6T25Jbml0KENQREZfUGFyc2VyKiBwUGFyc2VyLCBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCkKLXsKLSAgICBtX3BQYXJzZXIgPSBwUGFyc2VyOwotICAgIGlmICghTG9hZERpY3QocEVuY3J5cHREaWN0KSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gQ2hlY2tTZWN1cml0eShtX0tleUxlbik7Ci19Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrU2VjdXJpdHkoaW50MzJfdCBrZXlfbGVuKQotewotICAgIENGWF9CeXRlU3RyaW5nIHBhc3N3b3JkID0gbV9wUGFyc2VyLT5HZXRQYXNzd29yZCgpOwotICAgIGlmIChDaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBwYXNzd29yZC5HZXRMZW5ndGgoKSwgVFJVRSwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuKSkgewotICAgICAgICBpZiAocGFzc3dvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAoIUNoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkLkdldExlbmd0aCgpLCBGQUxTRSwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX2JPd25lciA9IFRSVUU7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIEZBTFNFLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pOwotfQotRlhfRFdPUkQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6R2V0UGVybWlzc2lvbnMoKQotewotICAgIHJldHVybiBtX1Blcm1pc3Npb25zOwotfQotc3RhdGljIEZYX0JPT0wgX0xvYWRDcnlwdEluZm8oQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBjaXBoZXIsIGludCYga2V5bGVuKQotewotICAgIGludCBWZXJzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJWIikpOwotICAgIGNpcGhlciA9IEZYQ0lQSEVSX1JDNDsKLSAgICBrZXlsZW4gPSAwOwotICAgIGlmIChWZXJzaW9uID49IDQpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ3J5cHRGaWx0ZXJzID0gcEVuY3J5cHREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJDRiIpKTsKLSAgICAgICAgaWYgKHBDcnlwdEZpbHRlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lID09IEZYX0JTVFJDKCJJZGVudGl0eSIpKSB7Ci0gICAgICAgICAgICBjaXBoZXIgPSBGWENJUEhFUl9OT05FOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGVmRmlsdGVyID0gcENyeXB0RmlsdGVycy0+R2V0RGljdChuYW1lKTsKLSAgICAgICAgICAgIGlmIChwRGVmRmlsdGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbktleUJpdHMgPSAwOwotICAgICAgICAgICAgaWYgKFZlcnNpb24gPT0gNCkgewotICAgICAgICAgICAgICAgIG5LZXlCaXRzID0gcERlZkZpbHRlci0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIDApOwotICAgICAgICAgICAgICAgIGlmIChuS2V5Qml0cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5LZXlCaXRzID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSwgMTI4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5LZXlCaXRzID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSwgMjU2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuS2V5Qml0cyA8IDQwKSB7Ci0gICAgICAgICAgICAgICAgbktleUJpdHMgKj0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGtleWxlbiA9IG5LZXlCaXRzIC8gODsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNpcGhlcl9uYW1lID0gcERlZkZpbHRlci0+R2V0U3RyaW5nKEZYX0JTVFJDKCJDRk0iKSk7Ci0gICAgICAgICAgICBpZiAoY2lwaGVyX25hbWUgPT0gRlhfQlNUUkMoIkFFU1YyIikgfHwgY2lwaGVyX25hbWUgPT0gRlhfQlNUUkMoIkFFU1YzIikpIHsKLSAgICAgICAgICAgICAgICBjaXBoZXIgPSBGWENJUEhFUl9BRVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBrZXlsZW4gPSBWZXJzaW9uID4gMSA/IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIDQwKSAvIDggOiA1OwotICAgIH0KLSAgICBpZiAoa2V5bGVuID4gMzIgfHwga2V5bGVuIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorICAgIENSWVBUX01ENUZpbmlzaChtZDUsIHVrZXlidWYpOworICAgIHJldHVybiBGWFNZU19tZW1jbXAodGVzdCwgdWtleWJ1ZiwgMTYpID09IDA7CisgIH0KKyAgaWYgKEZYU1lTX21lbWNtcCgodm9pZCopdWtleS5jX3N0cigpLCB1a2V5YnVmLCAxNikgPT0gMCkgewogICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6TG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpCi17Ci0gICAgbV9wRW5jcnlwdERpY3QgPSBwRW5jcnlwdERpY3Q7Ci0gICAgbV9iT3duZXIgPSBGQUxTRTsKLSAgICBtX1ZlcnNpb24gPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlYiKSk7Ci0gICAgbV9SZXZpc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUiIpKTsKLSAgICBtX1Blcm1pc3Npb25zID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQIiksIC0xKTsKLSAgICBpZiAobV9WZXJzaW9uIDwgNCkgewotICAgICAgICByZXR1cm4gX0xvYWRDcnlwdEluZm8ocEVuY3J5cHREaWN0LCBDRlhfQnl0ZVN0cmluZygpLCBtX0NpcGhlciwgbV9LZXlMZW4pOworQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6R2V0VXNlclBhc3N3b3JkKAorICAgIGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsCisgICAgRlhfRFdPUkQgcGFzc19zaXplKSB7CisgIHJldHVybiBHZXRVc2VyUGFzc3dvcmQob3duZXJfcGFzcywgcGFzc19zaXplLCBtX0tleUxlbik7Cit9CitDRlhfQnl0ZVN0cmluZyBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRVc2VyUGFzc3dvcmQoCisgICAgY29uc3QgdWludDhfdCogb3duZXJfcGFzcywKKyAgICBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgaW50MzJfdCBrZXlfbGVuKSB7CisgIENGWF9CeXRlU3RyaW5nIG9rZXkgPSBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJPIikpOworICB1aW50OF90IHBhc3Njb2RlWzMyXTsKKyAgRlhfRFdPUkQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICBwYXNzY29kZVtpXSA9IGkgPCBwYXNzX3NpemUgPyBvd25lcl9wYXNzW2ldIDogZGVmcGFzc2NvZGVbaSAtIHBhc3Nfc2l6ZV07CisgIH0KKyAgdWludDhfdCBkaWdlc3RbMTZdOworICBDUllQVF9NRDVHZW5lcmF0ZShwYXNzY29kZSwgMzIsIGRpZ2VzdCk7CisgIGlmIChtX1JldmlzaW9uID49IDMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHsKKyAgICAgIENSWVBUX01ENUdlbmVyYXRlKGRpZ2VzdCwgMTYsIGRpZ2VzdCk7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIHN0bWZfbmFtZSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdG1GIikpOwotICAgIENGWF9CeXRlU3RyaW5nIHN0cmZfbmFtZSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdHJGIikpOwotICAgIGlmIChzdG1mX25hbWUgIT0gc3RyZl9uYW1lKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB1aW50OF90IGVuY2tleVszMl07CisgIEZYU1lTX21lbXNldChlbmNrZXksIDAsIHNpemVvZihlbmNrZXkpKTsKKyAgRlhfRFdPUkQgY29weV9sZW4gPSBrZXlfbGVuOworICBpZiAoY29weV9sZW4gPiBzaXplb2YoZGlnZXN0KSkgeworICAgIGNvcHlfbGVuID0gc2l6ZW9mKGRpZ2VzdCk7CisgIH0KKyAgRlhTWVNfbWVtY3B5KGVuY2tleSwgZGlnZXN0LCBjb3B5X2xlbik7CisgIGludCBva2V5bGVuID0gb2tleS5HZXRMZW5ndGgoKTsKKyAgaWYgKG9rZXlsZW4gPiAzMikgeworICAgIG9rZXlsZW4gPSAzMjsKKyAgfQorICB1aW50OF90IG9rZXlidWZbNjRdOworICBGWFNZU19tZW1zZXQob2tleWJ1ZiwgMCwgc2l6ZW9mKG9rZXlidWYpKTsKKyAgRlhTWVNfbWVtY3B5KG9rZXlidWYsIG9rZXkuY19zdHIoKSwgb2tleWxlbik7CisgIGlmIChtX1JldmlzaW9uID09IDIpIHsKKyAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhva2V5YnVmLCBva2V5bGVuLCBlbmNrZXksIGtleV9sZW4pOworICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAxOTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIHVpbnQ4X3QgdGVtcGtleVszMl07CisgICAgICBGWFNZU19tZW1zZXQodGVtcGtleSwgMCwgc2l6ZW9mKHRlbXBrZXkpKTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbV9LZXlMZW47IGorKykgeworICAgICAgICB0ZW1wa2V5W2pdID0gZW5ja2V5W2pdIF4gaTsKKyAgICAgIH0KKyAgICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKG9rZXlidWYsIG9rZXlsZW4sIHRlbXBrZXksIGtleV9sZW4pOwogICAgIH0KLSAgICBpZiAoIV9Mb2FkQ3J5cHRJbmZvKHBFbmNyeXB0RGljdCwgc3RyZl9uYW1lLCBtX0NpcGhlciwgbV9LZXlMZW4pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIH0KKyAgaW50IGxlbiA9IDMyOworICB3aGlsZSAobGVuICYmIGRlZnBhc3Njb2RlW2xlbiAtIDFdID09IG9rZXlidWZbbGVuIC0gMV0pIHsKKyAgICBsZW4tLTsKKyAgfQorICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcob2tleWJ1ZiwgbGVuKTsKK30KK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tPd25lclBhc3N3b3JkKAorICAgIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAorICAgIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKKyAgICB1aW50OF90KiBrZXksCisgICAgaW50MzJfdCBrZXlfbGVuKSB7CisgIENGWF9CeXRlU3RyaW5nIHVzZXJfcGFzcyA9IEdldFVzZXJQYXNzd29yZChwYXNzd29yZCwgcGFzc19zaXplLCBrZXlfbGVuKTsKKyAgaWYgKENoZWNrVXNlclBhc3N3b3JkKHVzZXJfcGFzcywgdXNlcl9wYXNzLkdldExlbmd0aCgpLCBGQUxTRSwga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAga2V5X2xlbikpIHsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gQ2hlY2tVc2VyUGFzc3dvcmQodXNlcl9wYXNzLCB1c2VyX3Bhc3MuR2V0TGVuZ3RoKCksIFRSVUUsIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9sZW4pOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgRlhfRFdPUkQgdHlwZSwgaW50JiBjaXBoZXIsIGludCYga2V5X2xlbikKLXsKLSAgICBtX3BFbmNyeXB0RGljdCA9IHBFbmNyeXB0RGljdDsKLSAgICBtX2JPd25lciA9IEZBTFNFOwotICAgIG1fVmVyc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiViIpKTsKLSAgICBtX1JldmlzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSIikpOwotICAgIG1fUGVybWlzc2lvbnMgPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlAiKSwgLTEpOwotICAgIENGWF9CeXRlU3RyaW5nIHN0cmZfbmFtZSwgc3RtZl9uYW1lOwotICAgIGlmIChtX1ZlcnNpb24gPj0gNCkgewotICAgICAgICBzdG1mX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RtRiIpKTsKLSAgICAgICAgc3RyZl9uYW1lID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN0ckYiKSk7Ci0gICAgICAgIGlmIChzdG1mX25hbWUgIT0gc3RyZl9uYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIHN0cmZfbmFtZSwgY2lwaGVyLCBrZXlfbGVuKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fQ2lwaGVyID0gY2lwaGVyOwotICAgIG1fS2V5TGVuID0ga2V5X2xlbjsKLSAgICByZXR1cm4gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6SXNNZXRhZGF0YUVuY3J5cHRlZCgpIHsKKyAgcmV0dXJuIG1fcEVuY3J5cHREaWN0LT5HZXRCb29sZWFuKEZYX0JTVFJDKCJFbmNyeXB0TWV0YWRhdGEiKSwgVFJVRSk7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkdldENyeXB0SW5mbyhpbnQmIGNpcGhlciwgY29uc3QgdWludDhfdComIGJ1ZmZlciwgaW50JiBrZXlsZW4pCi17Ci0gICAgY2lwaGVyID0gbV9DaXBoZXI7Ci0gICAgYnVmZmVyID0gbV9FbmNyeXB0S2V5OwotICAgIGtleWxlbiA9IG1fS2V5TGVuOwotICAgIHJldHVybiBUUlVFOworQ1BERl9TZWN1cml0eUhhbmRsZXIqIEZQREZfQ3JlYXRlU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKSB7CisgIHJldHVybiBuZXcgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjsKIH0KLSNkZWZpbmUgRlhfR0VUXzMyV09SRChuLGIsaSkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJCQkJCQlcCi0gICAgICAgIChuKSA9IChGWF9EV09SRCkoKCAodWludDY0X3QpIChiKVsoaSldIDw8IDI0ICkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgfCAoICh1aW50NjRfdCkgKGIpWyhpKSArIDFdIDw8IDE2ICkJCQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgICB8ICggKHVpbnQ2NF90KSAoYilbKGkpICsgMl0gPDwgIDggKQkJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCAodWludDY0X3QpIChiKVsoaSkgKyAzXSAgICAgICApKTsJCQkJCVwKLSAgICB9Ci1pbnQgQmlnT3JkZXI2NEJpdHNNb2QzKHVpbnQ4X3QqIGRhdGEpCi17Ci0gICAgdWludDY0X3QgcmV0ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgewotICAgICAgICBGWF9EV09SRCB2YWx1ZTsKLSAgICAgICAgRlhfR0VUXzMyV09SRCh2YWx1ZSwgZGF0YSwgNCAqIGkpOwotICAgICAgICByZXQgPDw9IDMyOwotICAgICAgICByZXQgfD0gdmFsdWU7Ci0gICAgICAgIHJldCAlPSAzOwotICAgIH0KLSAgICByZXR1cm4gKGludClyZXQ7Ci19Ci12b2lkIFJldmlzaW9uNl9IYXNoKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBjb25zdCB1aW50OF90KiBzYWx0LCBjb25zdCB1aW50OF90KiB2ZWN0b3IsIHVpbnQ4X3QqIGhhc2gpCi17Ci0gICAgaW50IGlCbG9ja1NpemUgPSAzMjsKK3ZvaWQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6T25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBJZEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1c2VyX3Bhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHVzZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogb3duZXJfcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb3duZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdHlwZSkgeworICBpbnQgY2lwaGVyID0gMCwga2V5X2xlbiA9IDA7CisgIGlmICghTG9hZERpY3QocEVuY3J5cHREaWN0LCB0eXBlLCBjaXBoZXIsIGtleV9sZW4pKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChiRGVmYXVsdCAmJiAob3duZXJfcGFzcyA9PSBOVUxMIHx8IG93bmVyX3NpemUgPT0gMCkpIHsKKyAgICBvd25lcl9wYXNzID0gdXNlcl9wYXNzOworICAgIG93bmVyX3NpemUgPSB1c2VyX3NpemU7CisgIH0KKyAgaWYgKG1fUmV2aXNpb24gPj0gNSkgeworICAgIGludCB0ID0gKGludCl0aW1lKE5VTEwpOwogICAgIHVpbnQ4X3Qgc2hhWzEyOF07CiAgICAgQ1JZUFRfU0hBMjU2U3RhcnQoc2hhKTsKLSAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBwYXNzd29yZCwgc2l6ZSk7Ci0gICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgc2FsdCwgOCk7Ci0gICAgaWYgKHZlY3RvcikgewotICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCB2ZWN0b3IsIDQ4KTsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCAodWludDhfdCopJnQsIHNpemVvZiB0KTsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBtX0VuY3J5cHRLZXksIDMyKTsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCAodWludDhfdCopInRoZXJlIiwgNSk7CisgICAgQ1JZUFRfU0hBMjU2RmluaXNoKHNoYSwgbV9FbmNyeXB0S2V5KTsKKyAgICBBRVMyNTZfU2V0UGFzc3dvcmQocEVuY3J5cHREaWN0LCB1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgRkFMU0UsIG1fRW5jcnlwdEtleSk7CisgICAgaWYgKGJEZWZhdWx0KSB7CisgICAgICBBRVMyNTZfU2V0UGFzc3dvcmQocEVuY3J5cHREaWN0LCBvd25lcl9wYXNzLCBvd25lcl9zaXplLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fRW5jcnlwdEtleSk7CisgICAgICBBRVMyNTZfU2V0UGVybXMoCisgICAgICAgICAgcEVuY3J5cHREaWN0LCBtX1Blcm1pc3Npb25zLAorICAgICAgICAgIHBFbmNyeXB0RGljdC0+R2V0Qm9vbGVhbihGWF9CU1RSQygiRW5jcnlwdE1ldGFkYXRhIiksIFRSVUUpLAorICAgICAgICAgIG1fRW5jcnlwdEtleSk7CiAgICAgfQotICAgIHVpbnQ4X3QgZGlnZXN0WzMyXTsKLSAgICBDUllQVF9TSEEyNTZGaW5pc2goc2hhLCBkaWdlc3QpOwotICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgdWludDhfdCogaW5wdXQgPSBkaWdlc3Q7Ci0gICAgdWludDhfdCoga2V5ID0gaW5wdXQ7Ci0gICAgdWludDhfdCogaXYgPSBpbnB1dCArIDE2OwotICAgIHVpbnQ4X3QqIEUgPSBidWYuR2V0QnVmZmVyKCk7Ci0gICAgaW50IGlCdWZMZW4gPSBidWYuR2V0TGVuZ3RoKCk7Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGludGVyRGlnZXN0OwotICAgIGludCBpID0gMDsKLSAgICB1aW50OF90KiBhZXMgPSBGWF9BbGxvYyh1aW50OF90LCAyMDQ4KTsKLSAgICB3aGlsZSAoaSA8IDY0IHx8IGkgPCBFW2lCdWZMZW4gLSAxXSAgKyAzMikgewotICAgICAgICBpbnQgaVJvdW5kU2l6ZSA9IHNpemUgKyBpQmxvY2tTaXplOwotICAgICAgICBpZiAodmVjdG9yKSB7Ci0gICAgICAgICAgICBpUm91bmRTaXplICs9IDQ4OwotICAgICAgICB9Ci0gICAgICAgIGlCdWZMZW4gPSBpUm91bmRTaXplICogNjQ7Ci0gICAgICAgIGJ1Zi5Fc3RpbWF0ZVNpemUoaUJ1Zkxlbik7Ci0gICAgICAgIEUgPSBidWYuR2V0QnVmZmVyKCk7Ci0gICAgICAgIENGWF9CeXRlVGV4dEJ1ZiBjb250ZW50OwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDY0OyArK2opIHsKLSAgICAgICAgICAgIGNvbnRlbnQuQXBwZW5kQmxvY2socGFzc3dvcmQsIHNpemUpOwotICAgICAgICAgICAgY29udGVudC5BcHBlbmRCbG9jayhpbnB1dCwgaUJsb2NrU2l6ZSk7Ci0gICAgICAgICAgICBpZiAodmVjdG9yKSB7Ci0gICAgICAgICAgICAgICAgY29udGVudC5BcHBlbmRCbG9jayh2ZWN0b3IsIDQ4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwga2V5LCAxNiwgVFJVRSk7Ci0gICAgICAgIENSWVBUX0FFU1NldElWKGFlcywgaXYpOwotICAgICAgICBDUllQVF9BRVNFbmNyeXB0KGFlcywgRSwgY29udGVudC5HZXRCdWZmZXIoKSwgaUJ1Zkxlbik7Ci0gICAgICAgIGludCBpSGFzaCA9IDA7Ci0gICAgICAgIHN3aXRjaCAoQmlnT3JkZXI2NEJpdHNNb2QzKEUpKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgaUhhc2ggPSAwOwotICAgICAgICAgICAgICAgIGlCbG9ja1NpemUgPSAzMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBpSGFzaCA9IDE7Ci0gICAgICAgICAgICAgICAgaUJsb2NrU2l6ZSA9IDQ4OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpSGFzaCA9IDI7Ci0gICAgICAgICAgICAgICAgaUJsb2NrU2l6ZSA9IDY0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGludGVyRGlnZXN0LkVzdGltYXRlU2l6ZShpQmxvY2tTaXplKTsKLSAgICAgICAgaW5wdXQgPSBpbnRlckRpZ2VzdC5HZXRCdWZmZXIoKTsKLSAgICAgICAgaWYgKGlIYXNoID09IDApIHsKLSAgICAgICAgICAgIENSWVBUX1NIQTI1NkdlbmVyYXRlKEUsIGlCdWZMZW4sIGlucHV0KTsKLSAgICAgICAgfSBlbHNlIGlmIChpSGFzaCA9PSAxKSB7Ci0gICAgICAgICAgICBDUllQVF9TSEEzODRHZW5lcmF0ZShFLCBpQnVmTGVuLCBpbnB1dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaUhhc2ggPT0gMikgewotICAgICAgICAgICAgQ1JZUFRfU0hBNTEyR2VuZXJhdGUoRSwgaUJ1ZkxlbiwgaW5wdXQpOwotICAgICAgICB9Ci0gICAgICAgIGtleSA9IGlucHV0OwotICAgICAgICBpdiA9IGlucHV0ICsgMTY7Ci0gICAgICAgICsraTsKLSAgICB9Ci0gICAgRlhfRnJlZShhZXMpOwotICAgIGlmIChoYXNoKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweShoYXNoLCBpbnB1dCwgMzIpOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X0NoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsCi0gICAgICAgIEZYX0JPT0wgYk93bmVyLCB1aW50OF90KiBrZXkpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgb2tleSA9IG1fcEVuY3J5cHREaWN0ID8gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiTyIpKSA6IENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgaWYgKG9rZXkuR2V0TGVuZ3RoKCkgPCA0OCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIHVrZXkgPSBtX3BFbmNyeXB0RGljdCA/IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlUiKSkgOiBDRlhfQnl0ZVN0cmluZygpOwotICAgIGlmICh1a2V5LkdldExlbmd0aCgpIDwgNDgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBjb25zdCB1aW50OF90KiBwa2V5ID0gYk93bmVyID8gKGNvbnN0IHVpbnQ4X3QqKW9rZXkgOiAoY29uc3QgdWludDhfdCopdWtleTsKLSAgICB1aW50OF90IHNoYVsxMjhdOwotICAgIHVpbnQ4X3QgZGlnZXN0WzMyXTsKLSAgICBpZiAobV9SZXZpc2lvbiA+PSA2KSB7Ci0gICAgICAgIFJldmlzaW9uNl9IYXNoKHBhc3N3b3JkLCBzaXplLCAoY29uc3QgdWludDhfdCopcGtleSArIDMyLCAoYk93bmVyID8gKGNvbnN0IHVpbnQ4X3QqKXVrZXkgOiBOVUxMKSwgZGlnZXN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBDUllQVF9TSEEyNTZTdGFydChzaGEpOwotICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBwYXNzd29yZCwgc2l6ZSk7Ci0gICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHBrZXkgKyAzMiwgOCk7Ci0gICAgICAgIGlmIChiT3duZXIpIHsKLSAgICAgICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHVrZXksIDQ4KTsKLSAgICAgICAgfQotICAgICAgICBDUllQVF9TSEEyNTZGaW5pc2goc2hhLCBkaWdlc3QpOwotICAgIH0KLSAgICBpZiAoRlhTWVNfbWVtY21wKGRpZ2VzdCwgcGtleSwgMzIpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoa2V5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChtX1JldmlzaW9uID49IDYpIHsKLSAgICAgICAgUmV2aXNpb242X0hhc2gocGFzc3dvcmQsIHNpemUsIChjb25zdCB1aW50OF90Kilwa2V5ICsgNDAsIChiT3duZXIgPyAoY29uc3QgdWludDhfdCopdWtleSA6IE5VTEwpLCBkaWdlc3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENSWVBUX1NIQTI1NlN0YXJ0KHNoYSk7Ci0gICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHBhc3N3b3JkLCBzaXplKTsKLSAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgcGtleSArIDQwLCA4KTsKLSAgICAgICAgaWYgKGJPd25lcikgewotICAgICAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgdWtleSwgNDgpOwotICAgICAgICB9Ci0gICAgICAgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIGRpZ2VzdCk7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGVrZXkgPSBtX3BFbmNyeXB0RGljdCA/IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoYk93bmVyID8gRlhfQlNUUkMoIk9FIikgOiBGWF9CU1RSQygiVUUiKSkgOiBDRlhfQnl0ZVN0cmluZygpOwotICAgIGlmIChla2V5LkdldExlbmd0aCgpIDwgMzIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB1aW50OF90KiBhZXMgPSBGWF9BbGxvYyh1aW50OF90LCAyMDQ4KTsKLSAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwgZGlnZXN0LCAzMiwgRkFMU0UpOwotICAgIHVpbnQ4X3QgaXZbMTZdOwotICAgIEZYU1lTX21lbXNldChpdiwgMCwgMTYpOwotICAgIENSWVBUX0FFU1NldElWKGFlcywgaXYpOwotICAgIENSWVBUX0FFU0RlY3J5cHQoYWVzLCBrZXksIGVrZXksIDMyKTsKLSAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwga2V5LCAzMiwgRkFMU0UpOwotICAgIENSWVBUX0FFU1NldElWKGFlcywgaXYpOwotICAgIENGWF9CeXRlU3RyaW5nIHBlcm1zID0gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiUGVybXMiKSk7Ci0gICAgaWYgKHBlcm1zLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHVpbnQ4X3QgcGVybXNfYnVmWzE2XTsKLSAgICBGWFNZU19tZW1zZXQocGVybXNfYnVmLCAwLCBzaXplb2YocGVybXNfYnVmKSk7Ci0gICAgRlhfRFdPUkQgY29weV9sZW4gPSBzaXplb2YocGVybXNfYnVmKTsKLSAgICBpZiAoY29weV9sZW4gPiAoRlhfRFdPUkQpcGVybXMuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgY29weV9sZW4gPSBwZXJtcy5HZXRMZW5ndGgoKTsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5KHBlcm1zX2J1ZiwgKGNvbnN0IHVpbnQ4X3QqKXBlcm1zLCBjb3B5X2xlbik7Ci0gICAgdWludDhfdCBidWZbMTZdOwotICAgIENSWVBUX0FFU0RlY3J5cHQoYWVzLCBidWYsIHBlcm1zX2J1ZiwgMTYpOwotICAgIEZYX0ZyZWUoYWVzKTsKLSAgICBpZiAoYnVmWzldICE9ICdhJyB8fCBidWZbMTBdICE9ICdkJyB8fCBidWZbMTFdICE9ICdiJykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChGWERXT1JEX0dFVF9MU0JGSVJTVChidWYpICE9IG1fUGVybWlzc2lvbnMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoKGJ1Zls4XSA9PSAnVCcgJiYgIUlzTWV0YWRhdGFFbmNyeXB0ZWQoKSkgfHwgKGJ1Zls4XSA9PSAnRicgJiYgSXNNZXRhZGF0YUVuY3J5cHRlZCgpKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotaW50IENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgRlhfQk9PTCBiT3duZXIsIHVpbnQ4X3QqIGtleSkKLXsKLSAgICByZXR1cm4gQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc19zaXplLCBiT3duZXIsIGtleSwgbV9LZXlMZW4pOwotfQotaW50IENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYk93bmVyLCB1aW50OF90KiBrZXksIGludDMyX3Qga2V5X2xlbikKLXsKLSAgICBpZiAobV9SZXZpc2lvbiA+PSA1KSB7Ci0gICAgICAgIHJldHVybiBBRVMyNTZfQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgc2l6ZSwgYk93bmVyLCBrZXkpOwotICAgIH0KLSAgICB1aW50OF90IGtleWJ1ZlszMl07Ci0gICAgaWYgKGtleSA9PSBOVUxMKSB7Ci0gICAgICAgIGtleSA9IGtleWJ1ZjsKLSAgICB9Ci0gICAgaWYgKGJPd25lcikgewotICAgICAgICByZXR1cm4gQ2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBrZXksIGtleV9sZW4pOwotICAgIH0KLSAgICByZXR1cm4gQ2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHNpemUsIEZBTFNFLCBrZXksIGtleV9sZW4pIHx8IENoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBUUlVFLCBrZXksIGtleV9sZW4pOwotfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1VzZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLAotICAgICAgICBGWF9CT09MIGJJZ25vcmVFbmNyeXB0TWV0YSwgdWludDhfdCoga2V5LCBpbnQzMl90IGtleV9sZW4pCi17Ci0gICAgQ2FsY0VuY3J5cHRLZXkobV9wRW5jcnlwdERpY3QsIHBhc3N3b3JkLCBwYXNzX3NpemUsIGtleSwga2V5X2xlbiwgYklnbm9yZUVuY3J5cHRNZXRhLAotICAgICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0SURBcnJheSgpKTsKLSAgICBDRlhfQnl0ZVN0cmluZyB1a2V5ID0gbV9wRW5jcnlwdERpY3QgPyBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJVIikpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICBpZiAodWtleS5HZXRMZW5ndGgoKSA8IDE2KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdWludDhfdCB1a2V5YnVmWzMyXTsKLSAgICBpZiAobV9SZXZpc2lvbiA9PSAyKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweSh1a2V5YnVmLCBkZWZwYXNzY29kZSwgMzIpOwotICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayh1a2V5YnVmLCAzMiwga2V5LCBrZXlfbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50OF90IHRlc3RbMzJdLCB0bXBrZXlbMzJdOwotICAgICAgICBGWF9EV09SRCBjb3B5X2xlbiA9IHNpemVvZih0ZXN0KTsKLSAgICAgICAgaWYgKGNvcHlfbGVuID4gKEZYX0RXT1JEKXVrZXkuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGNvcHlfbGVuID0gdWtleS5HZXRMZW5ndGgoKTsKLSAgICAgICAgfQotICAgICAgICBGWFNZU19tZW1zZXQodGVzdCwgMCwgc2l6ZW9mKHRlc3QpKTsKLSAgICAgICAgRlhTWVNfbWVtc2V0KHRtcGtleSwgMCwgc2l6ZW9mKHRtcGtleSkpOwotICAgICAgICBGWFNZU19tZW1jcHkodGVzdCwgdWtleS5jX3N0cigpLCBjb3B5X2xlbik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOTsgaSA+PSAwOyBpIC0tKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGtleV9sZW47IGogKyspIHsKLSAgICAgICAgICAgICAgICB0bXBrZXlbal0gPSBrZXlbal0gXiBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2sodGVzdCwgMzIsIHRtcGtleSwga2V5X2xlbik7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBtZDVbMTAwXTsKLSAgICAgICAgQ1JZUFRfTUQ1U3RhcnQobWQ1KTsKLSAgICAgICAgQ1JZUFRfTUQ1VXBkYXRlKG1kNSwgZGVmcGFzc2NvZGUsIDMyKTsKLSAgICAgICAgQ1BERl9BcnJheSogcElkQXJyYXkgPSBtX3BQYXJzZXItPkdldElEQXJyYXkoKTsKLSAgICAgICAgaWYgKHBJZEFycmF5KSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBpZCA9IHBJZEFycmF5LT5HZXRTdHJpbmcoMCk7Ci0gICAgICAgICAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCAodWludDhfdCopaWQuY19zdHIoKSwgaWQuR2V0TGVuZ3RoKCkpOwotICAgICAgICB9Ci0gICAgICAgIENSWVBUX01ENUZpbmlzaChtZDUsIHVrZXlidWYpOwotICAgICAgICByZXR1cm4gRlhTWVNfbWVtY21wKHRlc3QsIHVrZXlidWYsIDE2KSA9PSAwOwotICAgIH0KLSAgICBpZiAoRlhTWVNfbWVtY21wKCh2b2lkKil1a2V5LmNfc3RyKCksIHVrZXlidWYsIDE2KSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRVc2VyUGFzc3dvcmQoY29uc3QgdWludDhfdCogb3duZXJfcGFzcywgRlhfRFdPUkQgcGFzc19zaXplKQotewotICAgIHJldHVybiBHZXRVc2VyUGFzc3dvcmQob3duZXJfcGFzcywgcGFzc19zaXplLCBtX0tleUxlbik7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRVc2VyUGFzc3dvcmQoY29uc3QgdWludDhfdCogb3duZXJfcGFzcywgRlhfRFdPUkQgcGFzc19zaXplLCBpbnQzMl90IGtleV9sZW4pCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgb2tleSA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIk8iKSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChiRGVmYXVsdCkgewogICAgIHVpbnQ4X3QgcGFzc2NvZGVbMzJdOwogICAgIEZYX0RXT1JEIGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDMyOyBpICsrKSB7Ci0gICAgICAgIHBhc3Njb2RlW2ldID0gaSA8IHBhc3Nfc2l6ZSA/IG93bmVyX3Bhc3NbaV0gOiBkZWZwYXNzY29kZVtpIC0gcGFzc19zaXplXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgcGFzc2NvZGVbaV0gPQorICAgICAgICAgIGkgPCBvd25lcl9zaXplID8gb3duZXJfcGFzc1tpXSA6IGRlZnBhc3Njb2RlW2kgLSBvd25lcl9zaXplXTsKICAgICB9CiAgICAgdWludDhfdCBkaWdlc3RbMTZdOwogICAgIENSWVBUX01ENUdlbmVyYXRlKHBhc3Njb2RlLCAzMiwgZGlnZXN0KTsKICAgICBpZiAobV9SZXZpc2lvbiA+PSAzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTA7IGkgKyspIHsKLSAgICAgICAgICAgIENSWVBUX01ENUdlbmVyYXRlKGRpZ2VzdCwgMTYsIGRpZ2VzdCk7Ci0gICAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTA7IGkrKykgeworICAgICAgICBDUllQVF9NRDVHZW5lcmF0ZShkaWdlc3QsIDE2LCBkaWdlc3QpOworICAgICAgfQogICAgIH0KICAgICB1aW50OF90IGVuY2tleVszMl07Ci0gICAgRlhTWVNfbWVtc2V0KGVuY2tleSwgMCwgc2l6ZW9mKGVuY2tleSkpOwotICAgIEZYX0RXT1JEIGNvcHlfbGVuID0ga2V5X2xlbjsKLSAgICBpZiAoY29weV9sZW4gPiBzaXplb2YoZGlnZXN0KSkgewotICAgICAgICBjb3B5X2xlbiA9IHNpemVvZihkaWdlc3QpOworICAgIEZYU1lTX21lbWNweShlbmNrZXksIGRpZ2VzdCwga2V5X2xlbik7CisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgIHBhc3Njb2RlW2ldID0gaSA8IHVzZXJfc2l6ZSA/IHVzZXJfcGFzc1tpXSA6IGRlZnBhc3Njb2RlW2kgLSB1c2VyX3NpemVdOwogICAgIH0KLSAgICBGWFNZU19tZW1jcHkoZW5ja2V5LCBkaWdlc3QsIGNvcHlfbGVuKTsKLSAgICBpbnQgb2tleWxlbiA9IG9rZXkuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKG9rZXlsZW4gPiAzMikgewotICAgICAgICBva2V5bGVuID0gMzI7Ci0gICAgfQotICAgIHVpbnQ4X3Qgb2tleWJ1Zls2NF07Ci0gICAgRlhTWVNfbWVtc2V0KG9rZXlidWYsIDAsIHNpemVvZihva2V5YnVmKSk7Ci0gICAgRlhTWVNfbWVtY3B5KG9rZXlidWYsIG9rZXkuY19zdHIoKSwgb2tleWxlbik7Ci0gICAgaWYgKG1fUmV2aXNpb24gPT0gMikgewotICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhva2V5YnVmLCBva2V5bGVuLCBlbmNrZXksIGtleV9sZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOTsgaSA+PSAwOyBpIC0tKSB7Ci0gICAgICAgICAgICB1aW50OF90IHRlbXBrZXlbMzJdOwotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KHRlbXBrZXksIDAsIHNpemVvZih0ZW1wa2V5KSk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fS2V5TGVuOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgdGVtcGtleVtqXSA9IGVuY2tleVtqXSBeIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhva2V5YnVmLCBva2V5bGVuLCB0ZW1wa2V5LCBrZXlfbGVuKTsKKyAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhwYXNzY29kZSwgMzIsIGVuY2tleSwga2V5X2xlbik7CisgICAgdWludDhfdCB0ZW1wa2V5WzMyXTsKKyAgICBpZiAobV9SZXZpc2lvbiA+PSAzKSB7CisgICAgICBmb3IgKGkgPSAxOyBpIDw9IDE5OyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrZXlfbGVuOyBqKyspIHsKKyAgICAgICAgICB0ZW1wa2V5W2pdID0gZW5ja2V5W2pdIF4gKHVpbnQ4X3QpaTsKICAgICAgICAgfQorICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhwYXNzY29kZSwgMzIsIHRlbXBrZXksIGtleV9sZW4pOworICAgICAgfQogICAgIH0KLSAgICBpbnQgbGVuID0gMzI7Ci0gICAgd2hpbGUgKGxlbiAmJiBkZWZwYXNzY29kZVtsZW4gLSAxXSA9PSBva2V5YnVmW2xlbiAtIDFdKSB7Ci0gICAgICAgIGxlbiAtLTsKKyAgICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJPIiksIENGWF9CeXRlU3RyaW5nKHBhc3Njb2RlLCAzMikpOworICB9CisgIENhbGNFbmNyeXB0S2V5KG1fcEVuY3J5cHREaWN0LCAodWludDhfdCopdXNlcl9wYXNzLCB1c2VyX3NpemUsIG1fRW5jcnlwdEtleSwKKyAgICAgICAgICAgICAgICAga2V5X2xlbiwgRkFMU0UsIHBJZEFycmF5KTsKKyAgaWYgKG1fUmV2aXNpb24gPCAzKSB7CisgICAgdWludDhfdCB0ZW1wYnVmWzMyXTsKKyAgICBGWFNZU19tZW1jcHkodGVtcGJ1ZiwgZGVmcGFzc2NvZGUsIDMyKTsKKyAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayh0ZW1wYnVmLCAzMiwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuKTsKKyAgICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJVIiksIENGWF9CeXRlU3RyaW5nKHRlbXBidWYsIDMyKSk7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCBtZDVbMTAwXTsKKyAgICBDUllQVF9NRDVTdGFydChtZDUpOworICAgIENSWVBUX01ENVVwZGF0ZShtZDUsIGRlZnBhc3Njb2RlLCAzMik7CisgICAgaWYgKHBJZEFycmF5KSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBpZCA9IHBJZEFycmF5LT5HZXRTdHJpbmcoMCk7CisgICAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCAodWludDhfdCopaWQuY19zdHIoKSwgaWQuR2V0TGVuZ3RoKCkpOwogICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcob2tleWJ1ZiwgbGVuKTsKKyAgICB1aW50OF90IGRpZ2VzdFszMl07CisgICAgQ1JZUFRfTUQ1RmluaXNoKG1kNSwgZGlnZXN0KTsKKyAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhkaWdlc3QsIDE2LCBtX0VuY3J5cHRLZXksIGtleV9sZW4pOworICAgIHVpbnQ4X3QgdGVtcGtleVszMl07CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTk7IGkrKykgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrZXlfbGVuOyBqKyspIHsKKyAgICAgICAgdGVtcGtleVtqXSA9IG1fRW5jcnlwdEtleVtqXSBeICh1aW50OF90KWk7CisgICAgICB9CisgICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhkaWdlc3QsIDE2LCB0ZW1wa2V5LCBrZXlfbGVuKTsKKyAgICB9CisgICAgQ1JZUFRfTUQ1R2VuZXJhdGUoZGlnZXN0LCAxNiwgZGlnZXN0ICsgMTYpOworICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIlUiKSwgQ0ZYX0J5dGVTdHJpbmcoZGlnZXN0LCAzMikpOworICB9CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrT3duZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLAotICAgICAgICB1aW50OF90KiBrZXksIGludDMyX3Qga2V5X2xlbikKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyB1c2VyX3Bhc3MgPSBHZXRVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHBhc3Nfc2l6ZSwga2V5X2xlbik7Ci0gICAgaWYgKENoZWNrVXNlclBhc3N3b3JkKHVzZXJfcGFzcywgdXNlcl9wYXNzLkdldExlbmd0aCgpLCBGQUxTRSwga2V5LCBrZXlfbGVuKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIENoZWNrVXNlclBhc3N3b3JkKHVzZXJfcGFzcywgdXNlcl9wYXNzLkdldExlbmd0aCgpLCBUUlVFLCBrZXksIGtleV9sZW4pOwordm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElkQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVzZXJfcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdXNlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvd25lcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0eXBlKSB7CisgIE9uQ3JlYXRlKHBFbmNyeXB0RGljdCwgcElkQXJyYXksIHVzZXJfcGFzcywgdXNlcl9zaXplLCBvd25lcl9wYXNzLCBvd25lcl9zaXplLAorICAgICAgICAgICBUUlVFLCB0eXBlKTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6SXNNZXRhZGF0YUVuY3J5cHRlZCgpCi17Ci0gICAgcmV0dXJuIG1fcEVuY3J5cHREaWN0LT5HZXRCb29sZWFuKEZYX0JTVFJDKCJFbmNyeXB0TWV0YWRhdGEiKSwgVFJVRSk7Cit2b2lkIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6Ok9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwSWRBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB1c2VyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHR5cGUpIHsKKyAgT25DcmVhdGUocEVuY3J5cHREaWN0LCBwSWRBcnJheSwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIE5VTEwsIDAsIEZBTFNFLCB0eXBlKTsKIH0KLUNQREZfU2VjdXJpdHlIYW5kbGVyKiBGUERGX0NyZWF0ZVN0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkKLXsKLSAgICByZXR1cm4gbmV3IENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI7Cit2b2lkIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkFFUzI1Nl9TZXRQYXNzd29yZCgKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICBjb25zdCB1aW50OF90KiBwYXNzd29yZCwKKyAgICBGWF9EV09SRCBzaXplLAorICAgIEZYX0JPT0wgYk93bmVyLAorICAgIGNvbnN0IHVpbnQ4X3QqIGtleSkgeworICB1aW50OF90IHNoYVsxMjhdOworICBDUllQVF9TSEExU3RhcnQoc2hhKTsKKyAgQ1JZUFRfU0hBMVVwZGF0ZShzaGEsIGtleSwgMzIpOworICBDUllQVF9TSEExVXBkYXRlKHNoYSwgKHVpbnQ4X3QqKSJoZWxsbyIsIDUpOworICB1aW50OF90IGRpZ2VzdFsyMF07CisgIENSWVBUX1NIQTFGaW5pc2goc2hhLCBkaWdlc3QpOworICBDRlhfQnl0ZVN0cmluZyB1a2V5ID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlUiKSk7CisgIHVpbnQ4X3QgZGlnZXN0MVs0OF07CisgIGlmIChtX1JldmlzaW9uID49IDYpIHsKKyAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgc2l6ZSwgZGlnZXN0LAorICAgICAgICAgICAgICAgICAgIChiT3duZXIgPyAoY29uc3QgdWludDhfdCopdWtleSA6IE5VTEwpLCBkaWdlc3QxKTsKKyAgfSBlbHNlIHsKKyAgICBDUllQVF9TSEEyNTZTdGFydChzaGEpOworICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHBhc3N3b3JkLCBzaXplKTsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBkaWdlc3QsIDgpOworICAgIGlmIChiT3duZXIpIHsKKyAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHVrZXksIHVrZXkuR2V0TGVuZ3RoKCkpOworICAgIH0KKyAgICBDUllQVF9TSEEyNTZGaW5pc2goc2hhLCBkaWdlc3QxKTsKKyAgfQorICBGWFNZU19tZW1jcHkoZGlnZXN0MSArIDMyLCBkaWdlc3QsIDE2KTsKKyAgcEVuY3J5cHREaWN0LT5TZXRBdFN0cmluZyhiT3duZXIgPyBGWF9CU1RSQygiTyIpIDogRlhfQlNUUkMoIlUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyhkaWdlc3QxLCA0OCkpOworICBpZiAobV9SZXZpc2lvbiA+PSA2KSB7CisgICAgUmV2aXNpb242X0hhc2gocGFzc3dvcmQsIHNpemUsIGRpZ2VzdCArIDgsCisgICAgICAgICAgICAgICAgICAgKGJPd25lciA/IChjb25zdCB1aW50OF90Kil1a2V5IDogTlVMTCksIGRpZ2VzdDEpOworICB9IGVsc2UgeworICAgIENSWVBUX1NIQTI1NlN0YXJ0KHNoYSk7CisgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgcGFzc3dvcmQsIHNpemUpOworICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIGRpZ2VzdCArIDgsIDgpOworICAgIGlmIChiT3duZXIpIHsKKyAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHVrZXksIHVrZXkuR2V0TGVuZ3RoKCkpOworICAgIH0KKyAgICBDUllQVF9TSEEyNTZGaW5pc2goc2hhLCBkaWdlc3QxKTsKKyAgfQorICB1aW50OF90KiBhZXMgPSBGWF9BbGxvYyh1aW50OF90LCAyMDQ4KTsKKyAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGRpZ2VzdDEsIDMyLCBUUlVFKTsKKyAgdWludDhfdCBpdlsxNl07CisgIEZYU1lTX21lbXNldChpdiwgMCwgMTYpOworICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKKyAgQ1JZUFRfQUVTRW5jcnlwdChhZXMsIGRpZ2VzdDEsIGtleSwgMzIpOworICBGWF9GcmVlKGFlcyk7CisgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoYk93bmVyID8gRlhfQlNUUkMoIk9FIikgOiBGWF9CU1RSQygiVUUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyhkaWdlc3QxLCAzMikpOwogfQotdm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9BcnJheSogcElkQXJyYXksCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVzZXJfcGFzcywgRlhfRFdPUkQgdXNlcl9zaXplLAotICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLCBGWF9EV09SRCBvd25lcl9zaXplLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9EV09SRCB0eXBlKQotewotICAgIGludCBjaXBoZXIgPSAwLCBrZXlfbGVuID0gMDsKLSAgICBpZiAoIUxvYWREaWN0KHBFbmNyeXB0RGljdCwgdHlwZSwgY2lwaGVyLCBrZXlfbGVuKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChiRGVmYXVsdCAmJiAob3duZXJfcGFzcyA9PSBOVUxMIHx8IG93bmVyX3NpemUgPT0gMCkpIHsKLSAgICAgICAgb3duZXJfcGFzcyA9IHVzZXJfcGFzczsKLSAgICAgICAgb3duZXJfc2l6ZSA9IHVzZXJfc2l6ZTsKLSAgICB9Ci0gICAgaWYgKG1fUmV2aXNpb24gPj0gNSkgewotICAgICAgICBpbnQgdCA9IChpbnQpdGltZShOVUxMKTsKLSAgICAgICAgdWludDhfdCBzaGFbMTI4XTsKLSAgICAgICAgQ1JZUFRfU0hBMjU2U3RhcnQoc2hhKTsKLSAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgKHVpbnQ4X3QqKSZ0LCBzaXplb2YgdCk7Ci0gICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIG1fRW5jcnlwdEtleSwgMzIpOwotICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCAodWludDhfdCopInRoZXJlIiwgNSk7Ci0gICAgICAgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIG1fRW5jcnlwdEtleSk7Ci0gICAgICAgIEFFUzI1Nl9TZXRQYXNzd29yZChwRW5jcnlwdERpY3QsIHVzZXJfcGFzcywgdXNlcl9zaXplLCBGQUxTRSwgbV9FbmNyeXB0S2V5KTsKLSAgICAgICAgaWYgKGJEZWZhdWx0KSB7Ci0gICAgICAgICAgICBBRVMyNTZfU2V0UGFzc3dvcmQocEVuY3J5cHREaWN0LCBvd25lcl9wYXNzLCBvd25lcl9zaXplLCBUUlVFLCBtX0VuY3J5cHRLZXkpOwotICAgICAgICAgICAgQUVTMjU2X1NldFBlcm1zKHBFbmNyeXB0RGljdCwgbV9QZXJtaXNzaW9ucywgcEVuY3J5cHREaWN0LT5HZXRCb29sZWFuKEZYX0JTVFJDKCJFbmNyeXB0TWV0YWRhdGEiKSwgVFJVRSksIG1fRW5jcnlwdEtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoYkRlZmF1bHQpIHsKLSAgICAgICAgdWludDhfdCBwYXNzY29kZVszMl07Ci0gICAgICAgIEZYX0RXT1JEIGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSArKykgewotICAgICAgICAgICAgcGFzc2NvZGVbaV0gPSBpIDwgb3duZXJfc2l6ZSA/IG93bmVyX3Bhc3NbaV0gOiBkZWZwYXNzY29kZVtpIC0gb3duZXJfc2l6ZV07Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBkaWdlc3RbMTZdOwotICAgICAgICBDUllQVF9NRDVHZW5lcmF0ZShwYXNzY29kZSwgMzIsIGRpZ2VzdCk7Ci0gICAgICAgIGlmIChtX1JldmlzaW9uID49IDMpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTA7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBDUllQVF9NRDVHZW5lcmF0ZShkaWdlc3QsIDE2LCBkaWdlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgZW5ja2V5WzMyXTsKLSAgICAgICAgRlhTWVNfbWVtY3B5KGVuY2tleSwgZGlnZXN0LCBrZXlfbGVuKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpICsrKSB7Ci0gICAgICAgICAgICBwYXNzY29kZVtpXSA9IGkgPCB1c2VyX3NpemUgPyB1c2VyX3Bhc3NbaV0gOiBkZWZwYXNzY29kZVtpIC0gdXNlcl9zaXplXTsKLSAgICAgICAgfQotICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhwYXNzY29kZSwgMzIsIGVuY2tleSwga2V5X2xlbik7Ci0gICAgICAgIHVpbnQ4X3QgdGVtcGtleVszMl07Ci0gICAgICAgIGlmIChtX1JldmlzaW9uID49IDMpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gMTk7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGtleV9sZW47IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcGtleVtqXSA9IGVuY2tleVtqXSBeICh1aW50OF90KWk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHBhc3Njb2RlLCAzMiwgdGVtcGtleSwga2V5X2xlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEVuY3J5cHREaWN0LT5TZXRBdFN0cmluZyhGWF9CU1RSQygiTyIpLCBDRlhfQnl0ZVN0cmluZyhwYXNzY29kZSwgMzIpKTsKLSAgICB9Ci0gICAgQ2FsY0VuY3J5cHRLZXkobV9wRW5jcnlwdERpY3QsICh1aW50OF90Kil1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuLCBGQUxTRSwgcElkQXJyYXkpOwotICAgIGlmIChtX1JldmlzaW9uIDwgMykgewotICAgICAgICB1aW50OF90IHRlbXBidWZbMzJdOwotICAgICAgICBGWFNZU19tZW1jcHkodGVtcGJ1ZiwgZGVmcGFzc2NvZGUsIDMyKTsKLSAgICAgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2sodGVtcGJ1ZiwgMzIsIG1fRW5jcnlwdEtleSwga2V5X2xlbik7Ci0gICAgICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIlUiKSwgQ0ZYX0J5dGVTdHJpbmcodGVtcGJ1ZiwgMzIpKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50OF90IG1kNVsxMDBdOwotICAgICAgICBDUllQVF9NRDVTdGFydChtZDUpOwotICAgICAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCBkZWZwYXNzY29kZSwgMzIpOwotICAgICAgICBpZiAocElkQXJyYXkpIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGlkID0gcElkQXJyYXktPkdldFN0cmluZygwKTsKLSAgICAgICAgICAgIENSWVBUX01ENVVwZGF0ZShtZDUsICh1aW50OF90KilpZC5jX3N0cigpLCBpZC5HZXRMZW5ndGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBkaWdlc3RbMzJdOwotICAgICAgICBDUllQVF9NRDVGaW5pc2gobWQ1LCBkaWdlc3QpOwotICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhkaWdlc3QsIDE2LCBtX0VuY3J5cHRLZXksIGtleV9sZW4pOwotICAgICAgICB1aW50OF90IHRlbXBrZXlbMzJdOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAxOTsgaSArKykgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrZXlfbGVuOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgdGVtcGtleVtqXSA9IG1fRW5jcnlwdEtleVtqXSBeICh1aW50OF90KWk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhkaWdlc3QsIDE2LCB0ZW1wa2V5LCBrZXlfbGVuKTsKLSAgICAgICAgfQotICAgICAgICBDUllQVF9NRDVHZW5lcmF0ZShkaWdlc3QsIDE2LCBkaWdlc3QgKyAxNik7Ci0gICAgICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIlUiKSwgQ0ZYX0J5dGVTdHJpbmcoZGlnZXN0LCAzMikpOwotICAgIH0KK3ZvaWQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X1NldFBlcm1zKAorICAgIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAorICAgIEZYX0RXT1JEIHBlcm1pc3Npb25zLAorICAgIEZYX0JPT0wgYkVuY3J5cHRNZXRhZGF0YSwKKyAgICBjb25zdCB1aW50OF90KiBrZXkpIHsKKyAgdWludDhfdCBidWZbMTZdOworICBidWZbMF0gPSAodWludDhfdClwZXJtaXNzaW9uczsKKyAgYnVmWzFdID0gKHVpbnQ4X3QpKHBlcm1pc3Npb25zID4+IDgpOworICBidWZbMl0gPSAodWludDhfdCkocGVybWlzc2lvbnMgPj4gMTYpOworICBidWZbM10gPSAodWludDhfdCkocGVybWlzc2lvbnMgPj4gMjQpOworICBidWZbNF0gPSAweGZmOworICBidWZbNV0gPSAweGZmOworICBidWZbNl0gPSAweGZmOworICBidWZbN10gPSAweGZmOworICBidWZbOF0gPSBiRW5jcnlwdE1ldGFkYXRhID8gJ1QnIDogJ0YnOworICBidWZbOV0gPSAnYSc7CisgIGJ1ZlsxMF0gPSAnZCc7CisgIGJ1ZlsxMV0gPSAnYic7CisgIHVpbnQ4X3QqIGFlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOworICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwga2V5LCAzMiwgVFJVRSk7CisgIHVpbnQ4X3QgaXZbMTZdLCBidWYxWzE2XTsKKyAgRlhTWVNfbWVtc2V0KGl2LCAwLCAxNik7CisgIENSWVBUX0FFU1NldElWKGFlcywgaXYpOworICBDUllQVF9BRVNFbmNyeXB0KGFlcywgYnVmMSwgYnVmLCAxNik7CisgIEZYX0ZyZWUoYWVzKTsKKyAgcEVuY3J5cHREaWN0LT5TZXRBdFN0cmluZyhGWF9CU1RSQygiUGVybXMiKSwgQ0ZYX0J5dGVTdHJpbmcoYnVmMSwgMTYpKTsKIH0KLXZvaWQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6T25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfQXJyYXkqIHBJZEFycmF5LAotICAgICAgICBjb25zdCB1aW50OF90KiB1c2VyX3Bhc3MsIEZYX0RXT1JEIHVzZXJfc2l6ZSwKLSAgICAgICAgY29uc3QgdWludDhfdCogb3duZXJfcGFzcywgRlhfRFdPUkQgb3duZXJfc2l6ZSwgRlhfRFdPUkQgdHlwZSkKLXsKLSAgICBPbkNyZWF0ZShwRW5jcnlwdERpY3QsIHBJZEFycmF5LCB1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgb3duZXJfcGFzcywgb3duZXJfc2l6ZSwgVFJVRSwgdHlwZSk7Ci19Ci12b2lkIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6Ok9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBDUERGX0FycmF5KiBwSWRBcnJheSwgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLCBGWF9EV09SRCB1c2VyX3NpemUsIEZYX0RXT1JEIHR5cGUpCi17Ci0gICAgT25DcmVhdGUocEVuY3J5cHREaWN0LCBwSWRBcnJheSwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIE5VTEwsIDAsIEZBTFNFLCB0eXBlKTsKLX0KLXZvaWQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X1NldFBhc3N3b3JkKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBjb25zdCB1aW50OF90KiBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiT3duZXIsIGNvbnN0IHVpbnQ4X3QqIGtleSkKLXsKLSAgICB1aW50OF90IHNoYVsxMjhdOwotICAgIENSWVBUX1NIQTFTdGFydChzaGEpOwotICAgIENSWVBUX1NIQTFVcGRhdGUoc2hhLCBrZXksIDMyKTsKLSAgICBDUllQVF9TSEExVXBkYXRlKHNoYSwgKHVpbnQ4X3QqKSJoZWxsbyIsIDUpOwotICAgIHVpbnQ4X3QgZGlnZXN0WzIwXTsKLSAgICBDUllQVF9TSEExRmluaXNoKHNoYSwgZGlnZXN0KTsKLSAgICBDRlhfQnl0ZVN0cmluZyB1a2V5ID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlUiKSk7Ci0gICAgdWludDhfdCBkaWdlc3QxWzQ4XTsKLSAgICBpZiAobV9SZXZpc2lvbiA+PSA2KSB7Ci0gICAgICAgIFJldmlzaW9uNl9IYXNoKHBhc3N3b3JkLCBzaXplLCBkaWdlc3QsIChiT3duZXIgPyAoY29uc3QgdWludDhfdCopdWtleSA6IE5VTEwpLCBkaWdlc3QxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDUllQVF9TSEEyNTZTdGFydChzaGEpOwotICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBwYXNzd29yZCwgc2l6ZSk7Ci0gICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIGRpZ2VzdCwgOCk7Ci0gICAgICAgIGlmIChiT3duZXIpIHsKLSAgICAgICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHVrZXksIHVrZXkuR2V0TGVuZ3RoKCkpOwotICAgICAgICB9Ci0gICAgICAgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIGRpZ2VzdDEpOwotICAgIH0KLSAgICBGWFNZU19tZW1jcHkoZGlnZXN0MSArIDMyLCBkaWdlc3QsIDE2KTsKLSAgICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKGJPd25lciA/IEZYX0JTVFJDKCJPIikgOiBGWF9CU1RSQygiVSIpLCBDRlhfQnl0ZVN0cmluZyhkaWdlc3QxLCA0OCkpOwotICAgIGlmIChtX1JldmlzaW9uID49IDYpIHsKLSAgICAgICAgUmV2aXNpb242X0hhc2gocGFzc3dvcmQsIHNpemUsIGRpZ2VzdCArIDgsIChiT3duZXIgPyAoY29uc3QgdWludDhfdCopdWtleSA6IE5VTEwpLCBkaWdlc3QxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDUllQVF9TSEEyNTZTdGFydChzaGEpOwotICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBwYXNzd29yZCwgc2l6ZSk7Ci0gICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIGRpZ2VzdCArIDgsIDgpOwotICAgICAgICBpZiAoYk93bmVyKSB7Ci0gICAgICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCB1a2V5LCB1a2V5LkdldExlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICBDUllQVF9TSEEyNTZGaW5pc2goc2hhLCBkaWdlc3QxKTsKLSAgICB9Ci0gICAgdWludDhfdCogYWVzID0gRlhfQWxsb2ModWludDhfdCwgMjA0OCk7Ci0gICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGRpZ2VzdDEsIDMyLCBUUlVFKTsKLSAgICB1aW50OF90IGl2WzE2XTsKLSAgICBGWFNZU19tZW1zZXQoaXYsIDAsIDE2KTsKLSAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKLSAgICBDUllQVF9BRVNFbmNyeXB0KGFlcywgZGlnZXN0MSwga2V5LCAzMik7Ci0gICAgRlhfRnJlZShhZXMpOwotICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoYk93bmVyID8gRlhfQlNUUkMoIk9FIikgOiBGWF9CU1RSQygiVUUiKSwgQ0ZYX0J5dGVTdHJpbmcoZGlnZXN0MSwgMzIpKTsKLX0KLXZvaWQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X1NldFBlcm1zKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9EV09SRCBwZXJtaXNzaW9ucywKLSAgICAgICAgRlhfQk9PTCBiRW5jcnlwdE1ldGFkYXRhLCBjb25zdCB1aW50OF90KiBrZXkpCi17Ci0gICAgdWludDhfdCBidWZbMTZdOwotICAgIGJ1ZlswXSA9ICh1aW50OF90KXBlcm1pc3Npb25zOwotICAgIGJ1ZlsxXSA9ICh1aW50OF90KShwZXJtaXNzaW9ucyA+PiA4KTsKLSAgICBidWZbMl0gPSAodWludDhfdCkocGVybWlzc2lvbnMgPj4gMTYpOwotICAgIGJ1ZlszXSA9ICh1aW50OF90KShwZXJtaXNzaW9ucyA+PiAyNCk7Ci0gICAgYnVmWzRdID0gMHhmZjsKLSAgICBidWZbNV0gPSAweGZmOwotICAgIGJ1Zls2XSA9IDB4ZmY7Ci0gICAgYnVmWzddID0gMHhmZjsKLSAgICBidWZbOF0gPSBiRW5jcnlwdE1ldGFkYXRhID8gJ1QnIDogJ0YnOwotICAgIGJ1Zls5XSA9ICdhJzsKLSAgICBidWZbMTBdID0gJ2QnOwotICAgIGJ1ZlsxMV0gPSAnYic7Ci0gICAgdWludDhfdCogYWVzID0gRlhfQWxsb2ModWludDhfdCwgMjA0OCk7Ci0gICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMzIsIFRSVUUpOwotICAgIHVpbnQ4X3QgaXZbMTZdLCBidWYxWzE2XTsKLSAgICBGWFNZU19tZW1zZXQoaXYsIDAsIDE2KTsKLSAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKLSAgICBDUllQVF9BRVNFbmNyeXB0KGFlcywgYnVmMSwgYnVmLCAxNik7Ci0gICAgRlhfRnJlZShhZXMpOwotICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIlBlcm1zIiksIENGWF9CeXRlU3RyaW5nKGJ1ZjEsIDE2KSk7Ci19Ci12b2lkIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDcnlwdEJsb2NrKEZYX0JPT0wgYkVuY3J5cHQsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfYnVmLCBzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdWludDhfdCByZWFsa2V5WzE2XTsKLSAgICBpbnQgcmVhbGtleWxlbiA9IDE2OwotICAgIGlmIChtX0NpcGhlciAhPSBGWENJUEhFUl9BRVMgfHwgbV9LZXlMZW4gIT0gMzIpIHsKLSAgICAgICAgdWludDhfdCBrZXkxWzMyXTsKLSAgICAgICAgRlhTWVNfbWVtY3B5KGtleTEsIG1fRW5jcnlwdEtleSwgbV9LZXlMZW4pOwotICAgICAgICBrZXkxW21fS2V5TGVuICsgMF0gPSAodWludDhfdClvYmpudW07Ci0gICAgICAgIGtleTFbbV9LZXlMZW4gKyAxXSA9ICh1aW50OF90KShvYmpudW0gPj4gOCk7Ci0gICAgICAgIGtleTFbbV9LZXlMZW4gKyAyXSA9ICh1aW50OF90KShvYmpudW0gPj4gMTYpOwotICAgICAgICBrZXkxW21fS2V5TGVuICsgM10gPSAodWludDhfdClnZW5udW07Ci0gICAgICAgIGtleTFbbV9LZXlMZW4gKyA0XSA9ICh1aW50OF90KShnZW5udW0gPj4gOCk7Ci0gICAgICAgIEZYU1lTX21lbWNweShrZXkxICsgbV9LZXlMZW4sICZvYmpudW0sIDMpOwotICAgICAgICBGWFNZU19tZW1jcHkoa2V5MSArIG1fS2V5TGVuICsgMywgJmdlbm51bSwgMik7Ci0gICAgICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShrZXkxICsgbV9LZXlMZW4gKyA1LCAic0FsVCIsIDQpOwotICAgICAgICB9Ci0gICAgICAgIENSWVBUX01ENUdlbmVyYXRlKGtleTEsIG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyA/IG1fS2V5TGVuICsgOSA6IG1fS2V5TGVuICsgNSwgcmVhbGtleSk7Ci0gICAgICAgIHJlYWxrZXlsZW4gPSBtX0tleUxlbiArIDU7Ci0gICAgICAgIGlmIChyZWFsa2V5bGVuID4gMTYpIHsKLSAgICAgICAgICAgIHJlYWxrZXlsZW4gPSAxNjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7Ci0gICAgICAgIENSWVBUX0FFU1NldEtleShtX3BBRVNDb250ZXh0LCAxNiwgbV9LZXlMZW4gPT0gMzIgPyBtX0VuY3J5cHRLZXkgOiByZWFsa2V5LCBtX0tleUxlbiwgYkVuY3J5cHQpOwotICAgICAgICBpZiAoYkVuY3J5cHQpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgaXZbMTZdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSArKykgewotICAgICAgICAgICAgICAgIGl2W2ldID0gKHVpbnQ4X3QpcmFuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1JZUFRfQUVTU2V0SVYobV9wQUVTQ29udGV4dCwgaXYpOwotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfYnVmLCBpdiwgMTYpOwotICAgICAgICAgICAgaW50IG5ibG9ja3MgPSBzcmNfc2l6ZSAvIDE2OwotICAgICAgICAgICAgQ1JZUFRfQUVTRW5jcnlwdChtX3BBRVNDb250ZXh0LCBkZXN0X2J1ZiArIDE2LCBzcmNfYnVmLCBuYmxvY2tzICogMTYpOwotICAgICAgICAgICAgdWludDhfdCBwYWRkaW5nWzE2XTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShwYWRkaW5nLCBzcmNfYnVmICsgbmJsb2NrcyAqIDE2LCBzcmNfc2l6ZSAlIDE2KTsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChwYWRkaW5nICsgc3JjX3NpemUgJSAxNiwgMTYgLSBzcmNfc2l6ZSAlIDE2LCAxNiAtIHNyY19zaXplICUgMTYpOwotICAgICAgICAgICAgQ1JZUFRfQUVTRW5jcnlwdChtX3BBRVNDb250ZXh0LCBkZXN0X2J1ZiArIG5ibG9ja3MgKiAxNiArIDE2LCBwYWRkaW5nLCAxNik7Ci0gICAgICAgICAgICBkZXN0X3NpemUgPSAzMiArIG5ibG9ja3MgKiAxNjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENSWVBUX0FFU1NldElWKG1fcEFFU0NvbnRleHQsIHNyY19idWYpOwotICAgICAgICAgICAgQ1JZUFRfQUVTRGVjcnlwdChtX3BBRVNDb250ZXh0LCBkZXN0X2J1Ziwgc3JjX2J1ZiArIDE2LCBzcmNfc2l6ZSAtIDE2KTsKLSAgICAgICAgICAgIGRlc3Rfc2l6ZSA9IHNyY19zaXplIC0gMTY7Ci0gICAgICAgICAgICBkZXN0X3NpemUgLT0gZGVzdF9idWZbZGVzdF9zaXplIC0gMV07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlQoZGVzdF9zaXplID09IHNyY19zaXplKTsKLSAgICAgICAgaWYgKGRlc3RfYnVmICE9IHNyY19idWYpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X2J1Ziwgc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgICAgICB9Ci0gICAgICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKGRlc3RfYnVmLCBkZXN0X3NpemUsIHJlYWxrZXksIHJlYWxrZXlsZW4pOwotICAgIH0KLX0KLXR5cGVkZWYgc3RydWN0IF9BRVNDcnlwdENvbnRleHQgewotICAgIHVpbnQ4X3QJCW1fQ29udGV4dFsyMDQ4XTsKLSAgICBGWF9CT09MCQltX2JJVjsKLSAgICB1aW50OF90CQltX0Jsb2NrWzE2XTsKLSAgICBGWF9EV09SRAltX0Jsb2NrT2Zmc2V0OwotfSBBRVNDcnlwdENvbnRleHQ7Ci12b2lkKiBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgRlhfQk9PTCBiRW5jcnlwdCkKLXsKLSAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfTk9ORSkgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyAmJiBtX0tleUxlbiA9PSAzMikgewotICAgICAgICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gRlhfQWxsb2MoQUVTQ3J5cHRDb250ZXh0LCAxKTsKLSAgICAgICAgcENvbnRleHQtPm1fYklWID0gVFJVRTsKLSAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOwotICAgICAgICBDUllQVF9BRVNTZXRLZXkocENvbnRleHQtPm1fQ29udGV4dCwgMTYsIG1fRW5jcnlwdEtleSwgMzIsIGJFbmNyeXB0KTsKLSAgICAgICAgaWYgKGJFbmNyeXB0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tbaV0gPSAodWludDhfdClyYW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUllQVF9BRVNTZXRJVihwQ29udGV4dC0+bV9Db250ZXh0LCBwQ29udGV4dC0+bV9CbG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBDb250ZXh0OwotICAgIH0KLSAgICB1aW50OF90IGtleTFbNDhdOwordm9pZCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRCbG9jayhGWF9CT09MIGJFbmNyeXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdlbm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7CisgICAgRlhTWVNfbWVtY3B5KGRlc3RfYnVmLCBzcmNfYnVmLCBzcmNfc2l6ZSk7CisgICAgcmV0dXJuOworICB9CisgIHVpbnQ4X3QgcmVhbGtleVsxNl07CisgIGludCByZWFsa2V5bGVuID0gMTY7CisgIGlmIChtX0NpcGhlciAhPSBGWENJUEhFUl9BRVMgfHwgbV9LZXlMZW4gIT0gMzIpIHsKKyAgICB1aW50OF90IGtleTFbMzJdOwogICAgIEZYU1lTX21lbWNweShrZXkxLCBtX0VuY3J5cHRLZXksIG1fS2V5TGVuKTsKKyAgICBrZXkxW21fS2V5TGVuICsgMF0gPSAodWludDhfdClvYmpudW07CisgICAga2V5MVttX0tleUxlbiArIDFdID0gKHVpbnQ4X3QpKG9iam51bSA+PiA4KTsKKyAgICBrZXkxW21fS2V5TGVuICsgMl0gPSAodWludDhfdCkob2JqbnVtID4+IDE2KTsKKyAgICBrZXkxW21fS2V5TGVuICsgM10gPSAodWludDhfdClnZW5udW07CisgICAga2V5MVttX0tleUxlbiArIDRdID0gKHVpbnQ4X3QpKGdlbm51bSA+PiA4KTsKICAgICBGWFNZU19tZW1jcHkoa2V5MSArIG1fS2V5TGVuLCAmb2JqbnVtLCAzKTsKICAgICBGWFNZU19tZW1jcHkoa2V5MSArIG1fS2V5TGVuICsgMywgJmdlbm51bSwgMik7CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewotICAgICAgICBGWFNZU19tZW1jcHkoa2V5MSArIG1fS2V5TGVuICsgNSwgInNBbFQiLCA0KTsKKyAgICAgIEZYU1lTX21lbWNweShrZXkxICsgbV9LZXlMZW4gKyA1LCAic0FsVCIsIDQpOwogICAgIH0KLSAgICB1aW50OF90IHJlYWxrZXlbMTZdOwotICAgIENSWVBUX01ENUdlbmVyYXRlKGtleTEsIG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyA/IG1fS2V5TGVuICsgOSA6IG1fS2V5TGVuICsgNSwgcmVhbGtleSk7Ci0gICAgaW50IHJlYWxrZXlsZW4gPSBtX0tleUxlbiArIDU7CisgICAgQ1JZUFRfTUQ1R2VuZXJhdGUoCisgICAgICAgIGtleTEsIG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyA/IG1fS2V5TGVuICsgOSA6IG1fS2V5TGVuICsgNSwgcmVhbGtleSk7CisgICAgcmVhbGtleWxlbiA9IG1fS2V5TGVuICsgNTsKICAgICBpZiAocmVhbGtleWxlbiA+IDE2KSB7Ci0gICAgICAgIHJlYWxrZXlsZW4gPSAxNjsKKyAgICAgIHJlYWxrZXlsZW4gPSAxNjsKICAgICB9Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewotICAgICAgICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gRlhfQWxsb2MoQUVTQ3J5cHRDb250ZXh0LCAxKTsKLSAgICAgICAgcENvbnRleHQtPm1fYklWID0gVFJVRTsKLSAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOwotICAgICAgICBDUllQVF9BRVNTZXRLZXkocENvbnRleHQtPm1fQ29udGV4dCwgMTYsIHJlYWxrZXksIDE2LCBiRW5jcnlwdCk7Ci0gICAgICAgIGlmIChiRW5jcnlwdCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSArKykgewotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tX0Jsb2NrW2ldID0gKHVpbnQ4X3QpcmFuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1JZUFRfQUVTU2V0SVYocENvbnRleHQtPm1fQ29udGV4dCwgcENvbnRleHQtPm1fQmxvY2spOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwQ29udGV4dDsKLSAgICB9Ci0gICAgdm9pZCogcENvbnRleHQgPSBGWF9BbGxvYyh1aW50OF90LCAxMDQwKTsKLSAgICBDUllQVF9BcmNGb3VyU2V0dXAocENvbnRleHQsIHJlYWxrZXksIHJlYWxrZXlsZW4pOwotICAgIHJldHVybiBwQ29udGV4dDsKLX0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZiwgRlhfQk9PTCBiRW5jcnlwdCkKLXsKLSAgICBpZiAoIWNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfTk9ORSkgewotICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfUkM0KSB7Ci0gICAgICAgIGludCBvbGRfc2l6ZSA9IGRlc3RfYnVmLkdldFNpemUoKTsKLSAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHQoY29udGV4dCwgZGVzdF9idWYuR2V0QnVmZmVyKCkgKyBvbGRfc2l6ZSwgc3JjX3NpemUpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgQUVTQ3J5cHRDb250ZXh0KiBwQ29udGV4dCA9IChBRVNDcnlwdENvbnRleHQqKWNvbnRleHQ7Ci0gICAgaWYgKHBDb250ZXh0LT5tX2JJViAmJiBiRW5jcnlwdCkgewotICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhwQ29udGV4dC0+bV9CbG9jaywgMTYpOwotICAgICAgICBwQ29udGV4dC0+bV9iSVYgPSBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgc3JjX29mZiA9IDA7Ci0gICAgRlhfRFdPUkQgc3JjX2xlZnQgPSBzcmNfc2l6ZTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBGWF9EV09SRCBjb3B5X3NpemUgPSAxNiAtIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0OwotICAgICAgICBpZiAoY29weV9zaXplID4gc3JjX2xlZnQpIHsKLSAgICAgICAgICAgIGNvcHlfc2l6ZSA9IHNyY19sZWZ0OwotICAgICAgICB9Ci0gICAgICAgIEZYU1lTX21lbWNweShwQ29udGV4dC0+bV9CbG9jayArIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0LCBzcmNfYnVmICsgc3JjX29mZiwgY29weV9zaXplKTsKLSAgICAgICAgc3JjX29mZiArPSBjb3B5X3NpemU7Ci0gICAgICAgIHNyY19sZWZ0IC09IGNvcHlfc2l6ZTsKLSAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgKz0gY29weV9zaXplOwotICAgICAgICBpZiAocENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPT0gMTYpIHsKLSAgICAgICAgICAgIGlmICghYkVuY3J5cHQgJiYgcENvbnRleHQtPm1fYklWKSB7Ci0gICAgICAgICAgICAgICAgQ1JZUFRfQUVTU2V0SVYocENvbnRleHQtPm1fQ29udGV4dCwgcENvbnRleHQtPm1fQmxvY2spOwotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tX2JJViA9IEZBTFNFOwotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjX29mZiA8IHNyY19zaXplKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBibG9ja19idWZbMTZdOwotICAgICAgICAgICAgICAgIGlmIChiRW5jcnlwdCkgewotICAgICAgICAgICAgICAgICAgICBDUllQVF9BRVNFbmNyeXB0KHBDb250ZXh0LT5tX0NvbnRleHQsIGJsb2NrX2J1ZiwgcENvbnRleHQtPm1fQmxvY2ssIDE2KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDUllQVF9BRVNEZWNyeXB0KHBDb250ZXh0LT5tX0NvbnRleHQsIGJsb2NrX2J1ZiwgcENvbnRleHQtPm1fQmxvY2ssIDE2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soYmxvY2tfYnVmLCAxNik7Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghc3JjX2xlZnQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRGaW5pc2godm9pZCogY29udGV4dCwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYsIEZYX0JPT0wgYkVuY3J5cHQpCi17Ci0gICAgaWYgKCFjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9SQzQpIHsKLSAgICAgICAgRlhfRnJlZShjb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIEFFU0NyeXB0Q29udGV4dCogcENvbnRleHQgPSAoQUVTQ3J5cHRDb250ZXh0Kiljb250ZXh0OworICB9CisgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKKyAgICBDUllQVF9BRVNTZXRLZXkobV9wQUVTQ29udGV4dCwgMTYsIG1fS2V5TGVuID09IDMyID8gbV9FbmNyeXB0S2V5IDogcmVhbGtleSwKKyAgICAgICAgICAgICAgICAgICAgbV9LZXlMZW4sIGJFbmNyeXB0KTsKICAgICBpZiAoYkVuY3J5cHQpIHsKLSAgICAgICAgdWludDhfdCBibG9ja19idWZbMTZdOwotICAgICAgICBpZiAocENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPT0gMTYpIHsKLSAgICAgICAgICAgIENSWVBUX0FFU0VuY3J5cHQocENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywgMTYpOwotICAgICAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soYmxvY2tfYnVmLCAxNik7Ci0gICAgICAgICAgICBwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtc2V0KHBDb250ZXh0LT5tX0Jsb2NrICsgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQsICh1aW50OF90KSgxNiAtIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0KSwgMTYgLSBwQ29udGV4dC0+bV9CbG9ja09mZnNldCk7Ci0gICAgICAgIENSWVBUX0FFU0VuY3J5cHQocENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywgMTYpOwotICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhibG9ja19idWYsIDE2KTsKLSAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID09IDE2KSB7Ci0gICAgICAgIHVpbnQ4X3QgYmxvY2tfYnVmWzE2XTsKLSAgICAgICAgQ1JZUFRfQUVTRGVjcnlwdChwQ29udGV4dC0+bV9Db250ZXh0LCBibG9ja19idWYsIHBDb250ZXh0LT5tX0Jsb2NrLCAxNik7Ci0gICAgICAgIGlmIChibG9ja19idWZbMTVdIDw9IDE2KSB7Ci0gICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhibG9ja19idWYsIDE2IC0gYmxvY2tfYnVmWzE1XSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfRnJlZShwQ29udGV4dCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkKiBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtKQotewotICAgIHJldHVybiBDcnlwdFN0YXJ0KG9iam51bSwgZ2VubnVtLCBGQUxTRSk7Ci19Ci1GWF9EV09SRCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdEdldFNpemUoRlhfRFdPUkQgc3JjX3NpemUpCi17Ci0gICAgcmV0dXJuIG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyA/IHNyY19zaXplIC0gMTYgOiBzcmNfc2l6ZTsKLX0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkluaXQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyKQotewotICAgIGNvbnN0IHVpbnQ4X3QqIGtleTsKLSAgICBpZiAoIXBTZWN1cml0eUhhbmRsZXItPkdldENyeXB0SW5mbyhtX0NpcGhlciwga2V5LCBtX0tleUxlbikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9LZXlMZW4gPiAzMiB8fCBtX0tleUxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9DaXBoZXIgIT0gRlhDSVBIRVJfTk9ORSkgewotICAgICAgICBGWFNZU19tZW1jcHkobV9FbmNyeXB0S2V5LCBrZXksIG1fS2V5TGVuKTsKLSAgICB9Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewotICAgICAgICBtX3BBRVNDb250ZXh0ID0gRlhfQWxsb2ModWludDhfdCwgMjA0OCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6SW5pdChpbnQgY2lwaGVyLCBjb25zdCB1aW50OF90KiBrZXksIGludCBrZXlsZW4pCi17Ci0gICAgaWYgKGNpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKLSAgICAgICAgc3dpdGNoKGtleWxlbikgewotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNpcGhlciA9PSBGWENJUEhFUl9BRVMyKSB7Ci0gICAgICAgIGlmIChrZXlsZW4gIT0gMzIpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoY2lwaGVyID09IEZYQ0lQSEVSX1JDNCkgewotICAgICAgICBpZiAoa2V5bGVuIDwgNSB8fCBrZXlsZW4gPiAxNikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CisgICAgICB1aW50OF90IGl2WzE2XTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBpdltpXSA9ICh1aW50OF90KXJhbmQoKTsKKyAgICAgIH0KKyAgICAgIENSWVBUX0FFU1NldElWKG1fcEFFU0NvbnRleHQsIGl2KTsKKyAgICAgIEZYU1lTX21lbWNweShkZXN0X2J1ZiwgaXYsIDE2KTsKKyAgICAgIGludCBuYmxvY2tzID0gc3JjX3NpemUgLyAxNjsKKyAgICAgIENSWVBUX0FFU0VuY3J5cHQobV9wQUVTQ29udGV4dCwgZGVzdF9idWYgKyAxNiwgc3JjX2J1ZiwgbmJsb2NrcyAqIDE2KTsKKyAgICAgIHVpbnQ4X3QgcGFkZGluZ1sxNl07CisgICAgICBGWFNZU19tZW1jcHkocGFkZGluZywgc3JjX2J1ZiArIG5ibG9ja3MgKiAxNiwgc3JjX3NpemUgJSAxNik7CisgICAgICBGWFNZU19tZW1zZXQocGFkZGluZyArIHNyY19zaXplICUgMTYsIDE2IC0gc3JjX3NpemUgJSAxNiwKKyAgICAgICAgICAgICAgICAgICAxNiAtIHNyY19zaXplICUgMTYpOworICAgICAgQ1JZUFRfQUVTRW5jcnlwdChtX3BBRVNDb250ZXh0LCBkZXN0X2J1ZiArIG5ibG9ja3MgKiAxNiArIDE2LCBwYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAxNik7CisgICAgICBkZXN0X3NpemUgPSAzMiArIG5ibG9ja3MgKiAxNjsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoa2V5bGVuID4gMzIpIHsKLSAgICAgICAgICAgIGtleWxlbiA9IDMyOworICAgICAgQ1JZUFRfQUVTU2V0SVYobV9wQUVTQ29udGV4dCwgc3JjX2J1Zik7CisgICAgICBDUllQVF9BRVNEZWNyeXB0KG1fcEFFU0NvbnRleHQsIGRlc3RfYnVmLCBzcmNfYnVmICsgMTYsIHNyY19zaXplIC0gMTYpOworICAgICAgZGVzdF9zaXplID0gc3JjX3NpemUgLSAxNjsKKyAgICAgIGRlc3Rfc2l6ZSAtPSBkZXN0X2J1ZltkZXN0X3NpemUgLSAxXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQVNTRVJUKGRlc3Rfc2l6ZSA9PSBzcmNfc2l6ZSk7CisgICAgaWYgKGRlc3RfYnVmICE9IHNyY19idWYpIHsKKyAgICAgIEZYU1lTX21lbWNweShkZXN0X2J1Ziwgc3JjX2J1Ziwgc3JjX3NpemUpOworICAgIH0KKyAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhkZXN0X2J1ZiwgZGVzdF9zaXplLCByZWFsa2V5LCByZWFsa2V5bGVuKTsKKyAgfQorfQordHlwZWRlZiBzdHJ1Y3QgX0FFU0NyeXB0Q29udGV4dCB7CisgIHVpbnQ4X3QgbV9Db250ZXh0WzIwNDhdOworICBGWF9CT09MIG1fYklWOworICB1aW50OF90IG1fQmxvY2tbMTZdOworICBGWF9EV09SRCBtX0Jsb2NrT2Zmc2V0OworfSBBRVNDcnlwdENvbnRleHQ7Cit2b2lkKiBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnZW5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmNyeXB0KSB7CisgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKyAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyAmJiBtX0tleUxlbiA9PSAzMikgeworICAgIEFFU0NyeXB0Q29udGV4dCogcENvbnRleHQgPSBGWF9BbGxvYyhBRVNDcnlwdENvbnRleHQsIDEpOworICAgIHBDb250ZXh0LT5tX2JJViA9IFRSVUU7CisgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOworICAgIENSWVBUX0FFU1NldEtleShwQ29udGV4dC0+bV9Db250ZXh0LCAxNiwgbV9FbmNyeXB0S2V5LCAzMiwgYkVuY3J5cHQpOworICAgIGlmIChiRW5jcnlwdCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIHBDb250ZXh0LT5tX0Jsb2NrW2ldID0gKHVpbnQ4X3QpcmFuZCgpOworICAgICAgfQorICAgICAgQ1JZUFRfQUVTU2V0SVYocENvbnRleHQtPm1fQ29udGV4dCwgcENvbnRleHQtPm1fQmxvY2spOworICAgIH0KKyAgICByZXR1cm4gcENvbnRleHQ7CisgIH0KKyAgdWludDhfdCBrZXkxWzQ4XTsKKyAgRlhTWVNfbWVtY3B5KGtleTEsIG1fRW5jcnlwdEtleSwgbV9LZXlMZW4pOworICBGWFNZU19tZW1jcHkoa2V5MSArIG1fS2V5TGVuLCAmb2JqbnVtLCAzKTsKKyAgRlhTWVNfbWVtY3B5KGtleTEgKyBtX0tleUxlbiArIDMsICZnZW5udW0sIDIpOworICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7CisgICAgRlhTWVNfbWVtY3B5KGtleTEgKyBtX0tleUxlbiArIDUsICJzQWxUIiwgNCk7CisgIH0KKyAgdWludDhfdCByZWFsa2V5WzE2XTsKKyAgQ1JZUFRfTUQ1R2VuZXJhdGUoCisgICAgICBrZXkxLCBtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMgPyBtX0tleUxlbiArIDkgOiBtX0tleUxlbiArIDUsIHJlYWxrZXkpOworICBpbnQgcmVhbGtleWxlbiA9IG1fS2V5TGVuICsgNTsKKyAgaWYgKHJlYWxrZXlsZW4gPiAxNikgeworICAgIHJlYWxrZXlsZW4gPSAxNjsKKyAgfQorICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7CisgICAgQUVTQ3J5cHRDb250ZXh0KiBwQ29udGV4dCA9IEZYX0FsbG9jKEFFU0NyeXB0Q29udGV4dCwgMSk7CisgICAgcENvbnRleHQtPm1fYklWID0gVFJVRTsKKyAgICBwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9IDA7CisgICAgQ1JZUFRfQUVTU2V0S2V5KHBDb250ZXh0LT5tX0NvbnRleHQsIDE2LCByZWFsa2V5LCAxNiwgYkVuY3J5cHQpOworICAgIGlmIChiRW5jcnlwdCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIHBDb250ZXh0LT5tX0Jsb2NrW2ldID0gKHVpbnQ4X3QpcmFuZCgpOworICAgICAgfQorICAgICAgQ1JZUFRfQUVTU2V0SVYocENvbnRleHQtPm1fQ29udGV4dCwgcENvbnRleHQtPm1fQmxvY2spOworICAgIH0KKyAgICByZXR1cm4gcENvbnRleHQ7CisgIH0KKyAgdm9pZCogcENvbnRleHQgPSBGWF9BbGxvYyh1aW50OF90LCAxMDQwKTsKKyAgQ1JZUFRfQXJjRm91clNldHVwKHBDb250ZXh0LCByZWFsa2V5LCByZWFsa2V5bGVuKTsKKyAgcmV0dXJuIHBDb250ZXh0OworfQorRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5jcnlwdCkgeworICBpZiAoIWNvbnRleHQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKKyAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhzcmNfYnVmLCBzcmNfc2l6ZSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX1JDNCkgeworICAgIGludCBvbGRfc2l6ZSA9IGRlc3RfYnVmLkdldFNpemUoKTsKKyAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhzcmNfYnVmLCBzcmNfc2l6ZSk7CisgICAgQ1JZUFRfQXJjRm91ckNyeXB0KGNvbnRleHQsIGRlc3RfYnVmLkdldEJ1ZmZlcigpICsgb2xkX3NpemUsIHNyY19zaXplKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gKEFFU0NyeXB0Q29udGV4dCopY29udGV4dDsKKyAgaWYgKHBDb250ZXh0LT5tX2JJViAmJiBiRW5jcnlwdCkgeworICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKHBDb250ZXh0LT5tX0Jsb2NrLCAxNik7CisgICAgcENvbnRleHQtPm1fYklWID0gRkFMU0U7CisgIH0KKyAgRlhfRFdPUkQgc3JjX29mZiA9IDA7CisgIEZYX0RXT1JEIHNyY19sZWZ0ID0gc3JjX3NpemU7CisgIHdoaWxlICgxKSB7CisgICAgRlhfRFdPUkQgY29weV9zaXplID0gMTYgLSBwQ29udGV4dC0+bV9CbG9ja09mZnNldDsKKyAgICBpZiAoY29weV9zaXplID4gc3JjX2xlZnQpIHsKKyAgICAgIGNvcHlfc2l6ZSA9IHNyY19sZWZ0OworICAgIH0KKyAgICBGWFNZU19tZW1jcHkocENvbnRleHQtPm1fQmxvY2sgKyBwQ29udGV4dC0+bV9CbG9ja09mZnNldCwgc3JjX2J1ZiArIHNyY19vZmYsCisgICAgICAgICAgICAgICAgIGNvcHlfc2l6ZSk7CisgICAgc3JjX29mZiArPSBjb3B5X3NpemU7CisgICAgc3JjX2xlZnQgLT0gY29weV9zaXplOworICAgIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ICs9IGNvcHlfc2l6ZTsKKyAgICBpZiAocENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPT0gMTYpIHsKKyAgICAgIGlmICghYkVuY3J5cHQgJiYgcENvbnRleHQtPm1fYklWKSB7CisgICAgICAgIENSWVBUX0FFU1NldElWKHBDb250ZXh0LT5tX0NvbnRleHQsIHBDb250ZXh0LT5tX0Jsb2NrKTsKKyAgICAgICAgcENvbnRleHQtPm1fYklWID0gRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoc3JjX29mZiA8IHNyY19zaXplKSB7CisgICAgICAgIHVpbnQ4X3QgYmxvY2tfYnVmWzE2XTsKKyAgICAgICAgaWYgKGJFbmNyeXB0KSB7CisgICAgICAgICAgQ1JZUFRfQUVTRW5jcnlwdChwQ29udGV4dC0+bV9Db250ZXh0LCBibG9ja19idWYsIHBDb250ZXh0LT5tX0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENSWVBUX0FFU0RlY3J5cHQocENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKICAgICAgICAgfQorICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhibG9ja19idWYsIDE2KTsKKyAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOworICAgICAgfQogICAgIH0KLSAgICBtX0NpcGhlciA9IGNpcGhlcjsKLSAgICBtX0tleUxlbiA9IGtleWxlbjsKLSAgICBGWFNZU19tZW1jcHkobV9FbmNyeXB0S2V5LCBrZXksIGtleWxlbik7Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewotICAgICAgICBtX3BBRVNDb250ZXh0ID0gRlhfQWxsb2ModWludDhfdCwgMjA0OCk7CisgICAgaWYgKCFzcmNfbGVmdCkgeworICAgICAgYnJlYWs7CiAgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRGaW5pc2godm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5jcnlwdCkgeworICBpZiAoIWNvbnRleHQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKICAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQotewotICAgIHJldHVybiBDcnlwdFN0cmVhbShjb250ZXh0LCBzcmNfYnVmLCBzcmNfc2l6ZSwgZGVzdF9idWYsIEZBTFNFKTsKLX0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRGaW5pc2godm9pZCogY29udGV4dCwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCi17Ci0gICAgcmV0dXJuIENyeXB0RmluaXNoKGNvbnRleHQsIGRlc3RfYnVmLCBGQUxTRSk7Ci19Ci1GWF9EV09SRCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RW5jcnlwdEdldFNpemUoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkKLXsKLSAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7Ci0gICAgICAgIHJldHVybiBzcmNfc2l6ZSArIDMyOwotICAgIH0KLSAgICByZXR1cm4gc3JjX3NpemU7Ci19Ci1GWF9CT09MIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpFbmNyeXB0Q29udGVudChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIENyeXB0QmxvY2soVFJVRSwgb2JqbnVtLCBnZW5udW0sIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgfQorICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfUkM0KSB7CisgICAgRlhfRnJlZShjb250ZXh0KTsKICAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ1BERl9DcnlwdG9IYW5kbGVyOjpEZWNyeXB0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBDRlhfQnl0ZVN0cmluZyYgc3RyKQotewotICAgIENGWF9CaW5hcnlCdWYgZGVzdF9idWY7Ci0gICAgdm9pZCogY29udGV4dCA9IERlY3J5cHRTdGFydChvYmpudW0sIGdlbm51bSk7Ci0gICAgRGVjcnlwdFN0cmVhbShjb250ZXh0LCAoY29uc3QgdWludDhfdCopc3RyLCBzdHIuR2V0TGVuZ3RoKCksIGRlc3RfYnVmKTsKLSAgICBEZWNyeXB0RmluaXNoKGNvbnRleHQsIGRlc3RfYnVmKTsKLSAgICBzdHIgPSBkZXN0X2J1ZjsKLX0KLUNQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcigpCi17Ci0gICAgbV9wQUVTQ29udGV4dCA9IE5VTEw7Ci0gICAgbV9DaXBoZXIgPSBGWENJUEhFUl9OT05FOwotICAgIG1fS2V5TGVuID0gMDsKLX0KLUNQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjp+Q1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXIoKQotewotICAgIGlmIChtX3BBRVNDb250ZXh0KSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQUVTQ29udGV4dCk7CisgIH0KKyAgQUVTQ3J5cHRDb250ZXh0KiBwQ29udGV4dCA9IChBRVNDcnlwdENvbnRleHQqKWNvbnRleHQ7CisgIGlmIChiRW5jcnlwdCkgeworICAgIHVpbnQ4X3QgYmxvY2tfYnVmWzE2XTsKKyAgICBpZiAocENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPT0gMTYpIHsKKyAgICAgIENSWVBUX0FFU0VuY3J5cHQocENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywgMTYpOworICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soYmxvY2tfYnVmLCAxNik7CisgICAgICBwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9IDA7CiAgICAgfQorICAgIEZYU1lTX21lbXNldChwQ29udGV4dC0+bV9CbG9jayArIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0LAorICAgICAgICAgICAgICAgICAodWludDhfdCkoMTYgLSBwQ29udGV4dC0+bV9CbG9ja09mZnNldCksCisgICAgICAgICAgICAgICAgIDE2IC0gcENvbnRleHQtPm1fQmxvY2tPZmZzZXQpOworICAgIENSWVBUX0FFU0VuY3J5cHQocENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywgMTYpOworICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKGJsb2NrX2J1ZiwgMTYpOworICB9IGVsc2UgaWYgKHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID09IDE2KSB7CisgICAgdWludDhfdCBibG9ja19idWZbMTZdOworICAgIENSWVBUX0FFU0RlY3J5cHQocENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywgMTYpOworICAgIGlmIChibG9ja19idWZbMTVdIDw9IDE2KSB7CisgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhibG9ja19idWYsIDE2IC0gYmxvY2tfYnVmWzE1XSk7CisgICAgfQorICB9CisgIEZYX0ZyZWUocENvbnRleHQpOworICByZXR1cm4gVFJVRTsKK30KK3ZvaWQqIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpEZWNyeXB0U3RhcnQoRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnZW5udW0pIHsKKyAgcmV0dXJuIENyeXB0U3RhcnQob2JqbnVtLCBnZW5udW0sIEZBTFNFKTsKK30KK0ZYX0RXT1JEIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpEZWNyeXB0R2V0U2l6ZShGWF9EV09SRCBzcmNfc2l6ZSkgeworICByZXR1cm4gbV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTID8gc3JjX3NpemUgLSAxNiA6IHNyY19zaXplOworfQorRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6SW5pdCgKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICBDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlcikgeworICBjb25zdCB1aW50OF90KiBrZXk7CisgIGlmICghcFNlY3VyaXR5SGFuZGxlci0+R2V0Q3J5cHRJbmZvKG1fQ2lwaGVyLCBrZXksIG1fS2V5TGVuKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9LZXlMZW4gPiAzMiB8fCBtX0tleUxlbiA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fQ2lwaGVyICE9IEZYQ0lQSEVSX05PTkUpIHsKKyAgICBGWFNZU19tZW1jcHkobV9FbmNyeXB0S2V5LCBrZXksIG1fS2V5TGVuKTsKKyAgfQorICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7CisgICAgbV9wQUVTQ29udGV4dCA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6SW5pdChpbnQgY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlsZW4pIHsKKyAgaWYgKGNpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKKyAgICBzd2l0Y2ggKGtleWxlbikgeworICAgICAgY2FzZSAxNjoKKyAgICAgIGNhc2UgMjQ6CisgICAgICBjYXNlIDMyOgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0gZWxzZSBpZiAoY2lwaGVyID09IEZYQ0lQSEVSX0FFUzIpIHsKKyAgICBpZiAoa2V5bGVuICE9IDMyKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9IGVsc2UgaWYgKGNpcGhlciA9PSBGWENJUEhFUl9SQzQpIHsKKyAgICBpZiAoa2V5bGVuIDwgNSB8fCBrZXlsZW4gPiAxNikgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoa2V5bGVuID4gMzIpIHsKKyAgICAgIGtleWxlbiA9IDMyOworICAgIH0KKyAgfQorICBtX0NpcGhlciA9IGNpcGhlcjsKKyAgbV9LZXlMZW4gPSBrZXlsZW47CisgIEZYU1lTX21lbWNweShtX0VuY3J5cHRLZXksIGtleSwga2V5bGVuKTsKKyAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgeworICAgIG1fcEFFU0NvbnRleHQgPSBGWF9BbGxvYyh1aW50OF90LCAyMDQ4KTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7CisgIHJldHVybiBDcnlwdFN0cmVhbShjb250ZXh0LCBzcmNfYnVmLCBzcmNfc2l6ZSwgZGVzdF9idWYsIEZBTFNFKTsKK30KK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRGaW5pc2godm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpIHsKKyAgcmV0dXJuIENyeXB0RmluaXNoKGNvbnRleHQsIGRlc3RfYnVmLCBGQUxTRSk7Cit9CitGWF9EV09SRCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RW5jcnlwdEdldFNpemUoRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSkgeworICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7CisgICAgcmV0dXJuIHNyY19zaXplICsgMzI7CisgIH0KKyAgcmV0dXJuIHNyY19zaXplOworfQorRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RW5jcnlwdENvbnRlbnQoRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2VubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIENyeXB0QmxvY2soVFJVRSwgb2JqbnVtLCBnZW5udW0sIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENQREZfQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdChGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnZW5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7CisgIENGWF9CaW5hcnlCdWYgZGVzdF9idWY7CisgIHZvaWQqIGNvbnRleHQgPSBEZWNyeXB0U3RhcnQob2JqbnVtLCBnZW5udW0pOworICBEZWNyeXB0U3RyZWFtKGNvbnRleHQsIChjb25zdCB1aW50OF90KilzdHIsIHN0ci5HZXRMZW5ndGgoKSwgZGVzdF9idWYpOworICBEZWNyeXB0RmluaXNoKGNvbnRleHQsIGRlc3RfYnVmKTsKKyAgc3RyID0gZGVzdF9idWY7Cit9CitDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXIoKSB7CisgIG1fcEFFU0NvbnRleHQgPSBOVUxMOworICBtX0NpcGhlciA9IEZYQ0lQSEVSX05PTkU7CisgIG1fS2V5TGVuID0gMDsKK30KK0NQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjp+Q1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXIoKSB7CisgIGlmIChtX3BBRVNDb250ZXh0KSB7CisgICAgRlhfRnJlZShtX3BBRVNDb250ZXh0KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwCmluZGV4IDE5NThmYWIuLjE5MzU5YWQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmRmLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZkZi5jcHAKQEAgLTUsMjkgKzUsMjUgQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaCIKLUNGREZfRG9jdW1lbnQ6OkNGREZfRG9jdW1lbnQoKSA6IENQREZfSW5kaXJlY3RPYmplY3RzKE5VTEwpCi17Ci0gICAgbV9wUm9vdERpY3QgPSBOVUxMOwotICAgIG1fcEZpbGUgPSBOVUxMOwotICAgIG1fYk93bkZpbGUgPSBGQUxTRTsKK0NGREZfRG9jdW1lbnQ6OkNGREZfRG9jdW1lbnQoKSA6IENQREZfSW5kaXJlY3RPYmplY3RzKE5VTEwpIHsKKyAgbV9wUm9vdERpY3QgPSBOVUxMOworICBtX3BGaWxlID0gTlVMTDsKKyAgbV9iT3duRmlsZSA9IEZBTFNFOwogfQotQ0ZERl9Eb2N1bWVudDo6fkNGREZfRG9jdW1lbnQoKQotewotICAgIGlmIChtX2JPd25GaWxlICYmIG1fcEZpbGUpIHsKLSAgICAgICAgbV9wRmlsZS0+UmVsZWFzZSgpOwotICAgIH0KK0NGREZfRG9jdW1lbnQ6On5DRkRGX0RvY3VtZW50KCkgeworICBpZiAobV9iT3duRmlsZSAmJiBtX3BGaWxlKSB7CisgICAgbV9wRmlsZS0+UmVsZWFzZSgpOworICB9CiB9Ci1DRkRGX0RvY3VtZW50KiBDRkRGX0RvY3VtZW50OjpDcmVhdGVOZXdEb2MoKQotewotICAgIENGREZfRG9jdW1lbnQqIHBEb2MgPSBuZXcgQ0ZERl9Eb2N1bWVudDsKLSAgICBwRG9jLT5tX3BSb290RGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocERvYy0+bV9wUm9vdERpY3QpOwotICAgIENQREZfRGljdGlvbmFyeSogcEZERkRpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIHBEb2MtPm1fcFJvb3REaWN0LT5TZXRBdChGWF9CU1RSQygiRkRGIiksIHBGREZEaWN0KTsKLSAgICByZXR1cm4gcERvYzsKK0NGREZfRG9jdW1lbnQqIENGREZfRG9jdW1lbnQ6OkNyZWF0ZU5ld0RvYygpIHsKKyAgQ0ZERl9Eb2N1bWVudCogcERvYyA9IG5ldyBDRkRGX0RvY3VtZW50OworICBwRG9jLT5tX3BSb290RGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBEb2MtPm1fcFJvb3REaWN0KTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRkRGRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIHBEb2MtPm1fcFJvb3REaWN0LT5TZXRBdChGWF9CU1RSQygiRkRGIiksIHBGREZEaWN0KTsKKyAgcmV0dXJuIHBEb2M7CiB9Ci1DRkRGX0RvY3VtZW50KiBDRkRGX0RvY3VtZW50OjpQYXJzZUZpbGUoSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSkKLXsKK0NGREZfRG9jdW1lbnQqIENGREZfRG9jdW1lbnQ6OlBhcnNlRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWF9CT09MIGJPd25GaWxlKSB7CiAgIGlmICghcEZpbGUpIHsKICAgICByZXR1cm4gTlVMTDsKICAgfQpAQCAtMzksMTUxICszNSwxNTIgQEAKICAgfQogICByZXR1cm4gcERvYzsKIH0KLUNGREZfRG9jdW1lbnQqIENGREZfRG9jdW1lbnQ6OlBhcnNlTWVtb3J5KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKQotewotICAgIHJldHVybiBDRkRGX0RvY3VtZW50OjpQYXJzZUZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCh1aW50OF90KilwRGF0YSwgc2l6ZSksIFRSVUUpOworQ0ZERl9Eb2N1bWVudCogQ0ZERl9Eb2N1bWVudDo6UGFyc2VNZW1vcnkoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUpIHsKKyAgcmV0dXJuIENGREZfRG9jdW1lbnQ6OlBhcnNlRmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0oKHVpbnQ4X3QqKXBEYXRhLCBzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsKIH0KLXZvaWQgQ0ZERl9Eb2N1bWVudDo6UGFyc2VTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSkKLXsKLSAgICBtX3BGaWxlID0gcEZpbGU7Ci0gICAgbV9iT3duRmlsZSA9IGJPd25GaWxlOwotICAgIENQREZfU3ludGF4UGFyc2VyIHBhcnNlcjsKLSAgICBwYXJzZXIuSW5pdFBhcnNlcihtX3BGaWxlLCAwKTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBGWF9CT09MIGJOdW1iZXI7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBwYXJzZXIuR2V0TmV4dFdvcmQoYk51bWJlcik7Ci0gICAgICAgIGlmIChiTnVtYmVyKSB7Ci0gICAgICAgICAgICBGWF9EV09SRCBvYmpudW0gPSBGWFNZU19hdG9pKHdvcmQpOwotICAgICAgICAgICAgd29yZCA9IHBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKLSAgICAgICAgICAgIGlmICghYk51bWJlcikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd29yZCA9IHBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKLSAgICAgICAgICAgIGlmICh3b3JkICE9IEZYX0JTVFJDKCJvYmoiKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwYXJzZXIuR2V0T2JqZWN0KHRoaXMsIG9iam51bSwgMCwgMCk7Ci0gICAgICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbnNlcnRJbmRpcmVjdE9iamVjdChvYmpudW0sIHBPYmopOwotICAgICAgICAgICAgd29yZCA9IHBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKLSAgICAgICAgICAgIGlmICh3b3JkICE9IEZYX0JTVFJDKCJlbmRvYmoiKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHdvcmQgIT0gRlhfQlNUUkMoInRyYWlsZXIiKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFpbkRpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwYXJzZXIuR2V0T2JqZWN0KHRoaXMsIDAsIDAsIDApOwotICAgICAgICAgICAgaWYgKHBNYWluRGljdCA9PSBOVUxMIHx8IHBNYWluRGljdC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BSb290RGljdCA9IHBNYWluRGljdC0+R2V0RGljdChGWF9CU1RSQygiUm9vdCIpKTsKLSAgICAgICAgICAgIHBNYWluRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1GWF9CT09MIENGREZfRG9jdW1lbnQ6OldyaXRlQnVmKENGWF9CeXRlVGV4dEJ1ZiYgYnVmKSBjb25zdAotewotICAgIGlmIChtX3BSb290RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgYnVmIDw8IEZYX0JTVFJDKCIlRkRGLTEuMlxyXG4iKTsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0luZGlyZWN0T2Jqcy5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUocG9zKSB7Ci0gICAgICAgIHNpemVfdCBvYmpudW07Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqOwotICAgICAgICBtX0luZGlyZWN0T2Jqcy5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKW9iam51bSwgKHZvaWQqJilwT2JqKTsKLSAgICAgICAgYnVmIDw8IChGWF9EV09SRClvYmpudW0gPDwgRlhfQlNUUkMoIiAwIG9ialxyXG4iKSA8PCBwT2JqIDw8IEZYX0JTVFJDKCJcclxuZW5kb2JqXHJcblxyXG4iKTsKLSAgICB9Ci0gICAgYnVmIDw8IEZYX0JTVFJDKCJ0cmFpbGVyXHJcbjw8L1Jvb3QgIikgPDwgbV9wUm9vdERpY3QtPkdldE9iak51bSgpIDw8IEZYX0JTVFJDKCIgMCBSPj5cclxuJSVFT0ZcclxuIik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1DRlhfV2lkZVN0cmluZyBDRkRGX0RvY3VtZW50OjpHZXRXaW4zMlBhdGgoKSBjb25zdAotewotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BSb290RGljdCA/IG1fcFJvb3REaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGREYiKSkgOiBOVUxMOwotICAgIENQREZfT2JqZWN0KiBwRmlsZVNwZWMgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkYiKSkgOiBOVUxMOwotICAgIGlmIChwRmlsZVNwZWMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgaWYgKHBGaWxlU3BlYy0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgcmV0dXJuIEZQREZfRmlsZVNwZWNfR2V0V2luMzJQYXRoKG1fcFJvb3REaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGREYiKSkpOwotICAgIH0KLSAgICByZXR1cm4gRlBERl9GaWxlU3BlY19HZXRXaW4zMlBhdGgocEZpbGVTcGVjKTsKLX0KLXN0YXRpYyBDRlhfV2lkZVN0cmluZyBDaGFuZ2VTbGFzaChjb25zdCBGWF9XQ0hBUiogc3RyKQotewotICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICB3aGlsZSAoKnN0cikgewotICAgICAgICBpZiAoKnN0ciA9PSAnXFwnKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gJy8nOwotICAgICAgICB9IGVsc2UgaWYgKCpzdHIgPT0gJy8nKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gJ1xcJzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSAqc3RyOwotICAgICAgICB9Ci0gICAgICAgIHN0ciArKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLXZvaWQgRlBERl9GaWxlU3BlY19TZXRXaW4zMlBhdGgoQ1BERl9PYmplY3QqIHBGaWxlU3BlYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVwYXRoKQotewotICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICBpZiAoZmlsZXBhdGguR2V0TGVuZ3RoKCkgPiAxICYmIGZpbGVwYXRoWzFdID09ICc6JykgewotICAgICAgICByZXN1bHQgPSBMIi8iOwotICAgICAgICByZXN1bHQgKz0gZmlsZXBhdGhbMF07Ci0gICAgICAgIGlmIChmaWxlcGF0aFsyXSAhPSAnXFwnKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gJy8nOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSBDaGFuZ2VTbGFzaChmaWxlcGF0aC5jX3N0cigpICsgMik7Ci0gICAgfSBlbHNlIGlmIChmaWxlcGF0aC5HZXRMZW5ndGgoKSA+IDEgJiYgZmlsZXBhdGhbMF0gPT0gJ1xcJyAmJiBmaWxlcGF0aFsxXSA9PSAnXFwnKSB7Ci0gICAgICAgIHJlc3VsdCA9IENoYW5nZVNsYXNoKGZpbGVwYXRoLmNfc3RyKCkgKyAxKTsKK3ZvaWQgQ0ZERl9Eb2N1bWVudDo6UGFyc2VTdHJlYW0oSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSkgeworICBtX3BGaWxlID0gcEZpbGU7CisgIG1fYk93bkZpbGUgPSBiT3duRmlsZTsKKyAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOworICBwYXJzZXIuSW5pdFBhcnNlcihtX3BGaWxlLCAwKTsKKyAgd2hpbGUgKDEpIHsKKyAgICBGWF9CT09MIGJOdW1iZXI7CisgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IHBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKKyAgICBpZiAoYk51bWJlcikgeworICAgICAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKKyAgICAgIHdvcmQgPSBwYXJzZXIuR2V0TmV4dFdvcmQoYk51bWJlcik7CisgICAgICBpZiAoIWJOdW1iZXIpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB3b3JkID0gcGFyc2VyLkdldE5leHRXb3JkKGJOdW1iZXIpOworICAgICAgaWYgKHdvcmQgIT0gRlhfQlNUUkMoIm9iaiIpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwYXJzZXIuR2V0T2JqZWN0KHRoaXMsIG9iam51bSwgMCwgMCk7CisgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgSW5zZXJ0SW5kaXJlY3RPYmplY3Qob2JqbnVtLCBwT2JqKTsKKyAgICAgIHdvcmQgPSBwYXJzZXIuR2V0TmV4dFdvcmQoYk51bWJlcik7CisgICAgICBpZiAod29yZCAhPSBGWF9CU1RSQygiZW5kb2JqIikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gQ2hhbmdlU2xhc2goZmlsZXBhdGguY19zdHIoKSk7CisgICAgICBpZiAod29yZCAhPSBGWF9CU1RSQygidHJhaWxlciIpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFpbkRpY3QgPQorICAgICAgICAgIChDUERGX0RpY3Rpb25hcnkqKXBhcnNlci5HZXRPYmplY3QodGhpcywgMCwgMCwgMCk7CisgICAgICBpZiAocE1haW5EaWN0ID09IE5VTEwgfHwgcE1haW5EaWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBtX3BSb290RGljdCA9IHBNYWluRGljdC0+R2V0RGljdChGWF9CU1RSQygiUm9vdCIpKTsKKyAgICAgIHBNYWluRGljdC0+UmVsZWFzZSgpOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmIChwRmlsZVNwZWMtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSSU5HKSB7Ci0gICAgICAgIHBGaWxlU3BlYy0+U2V0U3RyaW5nKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShyZXN1bHQpKTsKLSAgICB9IGVsc2UgaWYgKHBGaWxlU3BlYy0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICgoQ1BERl9EaWN0aW9uYXJ5KilwRmlsZVNwZWMpLT5TZXRBdFN0cmluZyhGWF9CU1RSQygiRiIpLCBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocmVzdWx0KSk7Ci0gICAgICAgICgoQ1BERl9EaWN0aW9uYXJ5KilwRmlsZVNwZWMpLT5TZXRBdFN0cmluZyhGWF9CU1RSQygiVUYiKSwgUERGX0VuY29kZVRleHQocmVzdWx0KSk7Ci0gICAgICAgICgoQ1BERl9EaWN0aW9uYXJ5KilwRmlsZVNwZWMpLT5SZW1vdmVBdChGWF9CU1RSQygiRlMiKSk7Ci0gICAgfQorICB9CiB9Ci1DRlhfV2lkZVN0cmluZwlGUERGX0ZpbGVTcGVjX0dldFdpbjMyUGF0aChjb25zdCBDUERGX09iamVjdCogcEZpbGVTcGVjKQotewotICAgIENGWF9XaWRlU3RyaW5nIHdzRmlsZU5hbWU7Ci0gICAgaWYgKHBGaWxlU3BlYy0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRmlsZVNwZWM7Ci0gICAgICAgIHdzRmlsZU5hbWUgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoRlhfQlNUUkMoIlVGIikpOwotICAgICAgICBpZiAod3NGaWxlTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHdzRmlsZU5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkYiKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGUyIpKSA9PSBGWF9CU1RSQygiVVJMIikpIHsKLSAgICAgICAgICAgIHJldHVybiB3c0ZpbGVOYW1lOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3c0ZpbGVOYW1lLklzRW1wdHkoKSAmJiBwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIkRPUyIpKSkgewotICAgICAgICAgICAgd3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRE9TIikpKTsKLSAgICAgICAgfQorRlhfQk9PTCBDRkRGX0RvY3VtZW50OjpXcml0ZUJ1ZihDRlhfQnl0ZVRleHRCdWYmIGJ1ZikgY29uc3QgeworICBpZiAobV9wUm9vdERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBidWYgPDwgRlhfQlNUUkMoIiVGREYtMS4yXHJcbiIpOworICBGWF9QT1NJVElPTiBwb3MgPSBtX0luZGlyZWN0T2Jqcy5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBzaXplX3Qgb2JqbnVtOworICAgIENQREZfT2JqZWN0KiBwT2JqOworICAgIG1fSW5kaXJlY3RPYmpzLkdldE5leHRBc3NvYyhwb3MsICh2b2lkKiYpb2JqbnVtLCAodm9pZComKXBPYmopOworICAgIGJ1ZiA8PCAoRlhfRFdPUkQpb2JqbnVtIDw8IEZYX0JTVFJDKCIgMCBvYmpcclxuIikgPDwgcE9iagorICAgICAgICA8PCBGWF9CU1RSQygiXHJcbmVuZG9ialxyXG5cclxuIik7CisgIH0KKyAgYnVmIDw8IEZYX0JTVFJDKCJ0cmFpbGVyXHJcbjw8L1Jvb3QgIikgPDwgbV9wUm9vdERpY3QtPkdldE9iak51bSgpCisgICAgICA8PCBGWF9CU1RSQygiIDAgUj4+XHJcbiUlRU9GXHJcbiIpOworICByZXR1cm4gVFJVRTsKK30KK0NGWF9XaWRlU3RyaW5nIENGREZfRG9jdW1lbnQ6OkdldFdpbjMyUGF0aCgpIGNvbnN0IHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9CisgICAgICBtX3BSb290RGljdCA/IG1fcFJvb3REaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGREYiKSkgOiBOVUxMOworICBDUERGX09iamVjdCogcEZpbGVTcGVjID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJGIikpIDogTlVMTDsKKyAgaWYgKHBGaWxlU3BlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgaWYgKHBGaWxlU3BlYy0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKKyAgICByZXR1cm4gRlBERl9GaWxlU3BlY19HZXRXaW4zMlBhdGgobV9wUm9vdERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkZERiIpKSk7CisgIH0KKyAgcmV0dXJuIEZQREZfRmlsZVNwZWNfR2V0V2luMzJQYXRoKHBGaWxlU3BlYyk7Cit9CitzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgQ2hhbmdlU2xhc2goY29uc3QgRlhfV0NIQVIqIHN0cikgeworICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7CisgIHdoaWxlICgqc3RyKSB7CisgICAgaWYgKCpzdHIgPT0gJ1xcJykgeworICAgICAgcmVzdWx0ICs9ICcvJzsKKyAgICB9IGVsc2UgaWYgKCpzdHIgPT0gJy8nKSB7CisgICAgICByZXN1bHQgKz0gJ1xcJzsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICpzdHI7CiAgICAgfQotICAgIGVsc2UgaWYgKCFwRmlsZVNwZWMpCi0gICAgICAgIHdzRmlsZU5hbWUgPSBDRlhfV2lkZVN0cmluZygpOwotICAgIGVsc2UgewotICAgICAgICB3c0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRmlsZVNwZWMtPkdldFN0cmluZygpKTsKKyAgICBzdHIrKzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQordm9pZCBGUERGX0ZpbGVTcGVjX1NldFdpbjMyUGF0aChDUERGX09iamVjdCogcEZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgZmlsZXBhdGgpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICBpZiAoZmlsZXBhdGguR2V0TGVuZ3RoKCkgPiAxICYmIGZpbGVwYXRoWzFdID09ICc6JykgeworICAgIHJlc3VsdCA9IEwiLyI7CisgICAgcmVzdWx0ICs9IGZpbGVwYXRoWzBdOworICAgIGlmIChmaWxlcGF0aFsyXSAhPSAnXFwnKSB7CisgICAgICByZXN1bHQgKz0gJy8nOwogICAgIH0KLSAgICBpZiAod3NGaWxlTmFtZVswXSAhPSAnLycpIHsKLSAgICAgICAgcmV0dXJuIENoYW5nZVNsYXNoKHdzRmlsZU5hbWUuY19zdHIoKSk7CisgICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoKGZpbGVwYXRoLmNfc3RyKCkgKyAyKTsKKyAgfSBlbHNlIGlmIChmaWxlcGF0aC5HZXRMZW5ndGgoKSA+IDEgJiYgZmlsZXBhdGhbMF0gPT0gJ1xcJyAmJgorICAgICAgICAgICAgIGZpbGVwYXRoWzFdID09ICdcXCcpIHsKKyAgICByZXN1bHQgPSBDaGFuZ2VTbGFzaChmaWxlcGF0aC5jX3N0cigpICsgMSk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gQ2hhbmdlU2xhc2goZmlsZXBhdGguY19zdHIoKSk7CisgIH0KKyAgaWYgKHBGaWxlU3BlYy0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKKyAgICBwRmlsZVNwZWMtPlNldFN0cmluZyhDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocmVzdWx0KSk7CisgIH0gZWxzZSBpZiAocEZpbGVTcGVjLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICAoKENQREZfRGljdGlvbmFyeSopcEZpbGVTcGVjKQorICAgICAgICAtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJGIiksIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShyZXN1bHQpKTsKKyAgICAoKENQREZfRGljdGlvbmFyeSopcEZpbGVTcGVjKQorICAgICAgICAtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJVRiIpLCBQREZfRW5jb2RlVGV4dChyZXN1bHQpKTsKKyAgICAoKENQREZfRGljdGlvbmFyeSopcEZpbGVTcGVjKS0+UmVtb3ZlQXQoRlhfQlNUUkMoIkZTIikpOworICB9Cit9CitDRlhfV2lkZVN0cmluZyBGUERGX0ZpbGVTcGVjX0dldFdpbjMyUGF0aChjb25zdCBDUERGX09iamVjdCogcEZpbGVTcGVjKSB7CisgIENGWF9XaWRlU3RyaW5nIHdzRmlsZU5hbWU7CisgIGlmIChwRmlsZVNwZWMtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRmlsZVNwZWM7CisgICAgd3NGaWxlTmFtZSA9IHBEaWN0LT5HZXRVbmljb2RlVGV4dChGWF9CU1RSQygiVUYiKSk7CisgICAgaWYgKHdzRmlsZU5hbWUuSXNFbXB0eSgpKSB7CisgICAgICB3c0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGIikpKTsKICAgICB9Ci0gICAgaWYgKHdzRmlsZU5hbWVbMl0gPT0gJy8nKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICAgICAgcmVzdWx0ICs9IHdzRmlsZU5hbWVbMV07Ci0gICAgICAgIHJlc3VsdCArPSAnOic7Ci0gICAgICAgIHJlc3VsdCArPSBDaGFuZ2VTbGFzaCh3c0ZpbGVOYW1lLmNfc3RyKCkgKyAyKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRlMiKSkgPT0gRlhfQlNUUkMoIlVSTCIpKSB7CisgICAgICByZXR1cm4gd3NGaWxlTmFtZTsKICAgICB9CisgICAgaWYgKHdzRmlsZU5hbWUuSXNFbXB0eSgpICYmIHBEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiRE9TIikpKSB7CisgICAgICB3c0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJET1MiKSkpOworICAgIH0KKyAgfSBlbHNlIGlmICghcEZpbGVTcGVjKQorICAgIHdzRmlsZU5hbWUgPSBDRlhfV2lkZVN0cmluZygpOworICBlbHNlIHsKKyAgICB3c0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRmlsZVNwZWMtPkdldFN0cmluZygpKTsKKyAgfQorICBpZiAod3NGaWxlTmFtZVswXSAhPSAnLycpIHsKKyAgICByZXR1cm4gQ2hhbmdlU2xhc2god3NGaWxlTmFtZS5jX3N0cigpKTsKKyAgfQorICBpZiAod3NGaWxlTmFtZVsyXSA9PSAnLycpIHsKICAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgcmVzdWx0ICs9ICdcXCc7Ci0gICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoKHdzRmlsZU5hbWUuY19zdHIoKSk7CisgICAgcmVzdWx0ICs9IHdzRmlsZU5hbWVbMV07CisgICAgcmVzdWx0ICs9ICc6JzsKKyAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2god3NGaWxlTmFtZS5jX3N0cigpICsgMik7CiAgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7CisgIHJlc3VsdCArPSAnXFwnOworICByZXN1bHQgKz0gQ2hhbmdlU2xhc2god3NGaWxlTmFtZS5jX3N0cigpKTsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmlsdGVycy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZpbHRlcnMuY3BwCmluZGV4IGZlZDQ1NDYuLjhjYjQzMjAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmlsdGVycy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9maWx0ZXJzLmNwcApAQCAtMTIsODg4ICsxMiw5MTggQEAKIAogZXh0ZXJuICJDIiB7CiAKLXN0YXRpYyB2b2lkKiBteV9hbGxvY19mdW5jKHZvaWQqIG9wYXF1ZSwgdW5zaWduZWQgaW50IGl0ZW1zLCB1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLSAgICByZXR1cm4gRlhfQWxsb2MyRCh1aW50OF90LCBpdGVtcywgc2l6ZSk7CitzdGF0aWMgdm9pZCogbXlfYWxsb2NfZnVuYyh2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkgeworICByZXR1cm4gRlhfQWxsb2MyRCh1aW50OF90LCBpdGVtcywgc2l6ZSk7CiB9Ci1zdGF0aWMgdm9pZCBteV9mcmVlX2Z1bmModm9pZCogb3BhcXVlLCB2b2lkKiBhZGRyZXNzKQotewotICAgIEZYX0ZyZWUoYWRkcmVzcyk7CitzdGF0aWMgdm9pZCBteV9mcmVlX2Z1bmModm9pZCogb3BhcXVlLCB2b2lkKiBhZGRyZXNzKSB7CisgIEZYX0ZyZWUoYWRkcmVzcyk7CiB9CiAKIH0gIC8vIGV4dGVybiAiQyIKIAotQ0ZYX0RhdGFGaWx0ZXI6OkNGWF9EYXRhRmlsdGVyKCkKLXsKLSAgICBtX2JFT0YgPSBGQUxTRTsKLSAgICBtX3BEZXN0RmlsdGVyID0gTlVMTDsKLSAgICBtX1NyY1BvcyA9IDA7CitDRlhfRGF0YUZpbHRlcjo6Q0ZYX0RhdGFGaWx0ZXIoKSB7CisgIG1fYkVPRiA9IEZBTFNFOworICBtX3BEZXN0RmlsdGVyID0gTlVMTDsKKyAgbV9TcmNQb3MgPSAwOwogfQotQ0ZYX0RhdGFGaWx0ZXI6On5DRlhfRGF0YUZpbHRlcigpCi17Ci0gICAgZGVsZXRlIG1fcERlc3RGaWx0ZXI7CitDRlhfRGF0YUZpbHRlcjo6fkNGWF9EYXRhRmlsdGVyKCkgeworICBkZWxldGUgbV9wRGVzdEZpbHRlcjsKIH0KLXZvaWQgQ0ZYX0RhdGFGaWx0ZXI6OlNldERlc3RGaWx0ZXIoQ0ZYX0RhdGFGaWx0ZXIqIHBGaWx0ZXIpCi17Ci0gICAgaWYgKG1fcERlc3RGaWx0ZXIpIHsKLSAgICAgICAgbV9wRGVzdEZpbHRlci0+U2V0RGVzdEZpbHRlcihwRmlsdGVyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BEZXN0RmlsdGVyID0gcEZpbHRlcjsKLSAgICB9Cit2b2lkIENGWF9EYXRhRmlsdGVyOjpTZXREZXN0RmlsdGVyKENGWF9EYXRhRmlsdGVyKiBwRmlsdGVyKSB7CisgIGlmIChtX3BEZXN0RmlsdGVyKSB7CisgICAgbV9wRGVzdEZpbHRlci0+U2V0RGVzdEZpbHRlcihwRmlsdGVyKTsKKyAgfSBlbHNlIHsKKyAgICBtX3BEZXN0RmlsdGVyID0gcEZpbHRlcjsKKyAgfQogfQotdm9pZCBDRlhfRGF0YUZpbHRlcjo6RmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQotewotICAgIGlmIChtX2JFT0YpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX1NyY1BvcyArPSBzcmNfc2l6ZTsKLSAgICBpZiAobV9wRGVzdEZpbHRlcikgewotICAgICAgICBDRlhfQmluYXJ5QnVmIHRlbXBfYnVmOwotICAgICAgICB0ZW1wX2J1Zi5Fc3RpbWF0ZVNpemUoRlBERl9GSUxURVJfQlVGRkVSX1NJWkUsIEZQREZfRklMVEVSX0JVRkZFUl9TSVpFKTsKLSAgICAgICAgdl9GaWx0ZXJJbihzcmNfYnVmLCBzcmNfc2l6ZSwgdGVtcF9idWYpOwotICAgICAgICBtX3BEZXN0RmlsdGVyLT5GaWx0ZXJJbih0ZW1wX2J1Zi5HZXRCdWZmZXIoKSwgdGVtcF9idWYuR2V0U2l6ZSgpLCBkZXN0X2J1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdl9GaWx0ZXJJbihzcmNfYnVmLCBzcmNfc2l6ZSwgZGVzdF9idWYpOwotICAgIH0KK3ZvaWQgQ0ZYX0RhdGFGaWx0ZXI6OkZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7CisgIGlmIChtX2JFT0YpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9TcmNQb3MgKz0gc3JjX3NpemU7CisgIGlmIChtX3BEZXN0RmlsdGVyKSB7CisgICAgQ0ZYX0JpbmFyeUJ1ZiB0ZW1wX2J1ZjsKKyAgICB0ZW1wX2J1Zi5Fc3RpbWF0ZVNpemUoRlBERl9GSUxURVJfQlVGRkVSX1NJWkUsIEZQREZfRklMVEVSX0JVRkZFUl9TSVpFKTsKKyAgICB2X0ZpbHRlckluKHNyY19idWYsIHNyY19zaXplLCB0ZW1wX2J1Zik7CisgICAgbV9wRGVzdEZpbHRlci0+RmlsdGVySW4odGVtcF9idWYuR2V0QnVmZmVyKCksIHRlbXBfYnVmLkdldFNpemUoKSwgZGVzdF9idWYpOworICB9IGVsc2UgeworICAgIHZfRmlsdGVySW4oc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmKTsKKyAgfQogfQotdm9pZCBDRlhfRGF0YUZpbHRlcjo6RmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQotewotICAgIGlmIChtX3BEZXN0RmlsdGVyKSB7Ci0gICAgICAgIENGWF9CaW5hcnlCdWYgdGVtcF9idWY7Ci0gICAgICAgIHZfRmlsdGVyRmluaXNoKHRlbXBfYnVmKTsKLSAgICAgICAgaWYgKHRlbXBfYnVmLkdldFNpemUoKSkgewotICAgICAgICAgICAgbV9wRGVzdEZpbHRlci0+RmlsdGVySW4odGVtcF9idWYuR2V0QnVmZmVyKCksIHRlbXBfYnVmLkdldFNpemUoKSwgZGVzdF9idWYpOwotICAgICAgICB9Ci0gICAgICAgIG1fcERlc3RGaWx0ZXItPkZpbHRlckZpbmlzaChkZXN0X2J1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdl9GaWx0ZXJGaW5pc2goZGVzdF9idWYpOwordm9pZCBDRlhfRGF0YUZpbHRlcjo6RmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7CisgIGlmIChtX3BEZXN0RmlsdGVyKSB7CisgICAgQ0ZYX0JpbmFyeUJ1ZiB0ZW1wX2J1ZjsKKyAgICB2X0ZpbHRlckZpbmlzaCh0ZW1wX2J1Zik7CisgICAgaWYgKHRlbXBfYnVmLkdldFNpemUoKSkgeworICAgICAgbV9wRGVzdEZpbHRlci0+RmlsdGVySW4odGVtcF9idWYuR2V0QnVmZmVyKCksIHRlbXBfYnVmLkdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmKTsKICAgICB9Ci0gICAgbV9iRU9GID0gVFJVRTsKKyAgICBtX3BEZXN0RmlsdGVyLT5GaWx0ZXJGaW5pc2goZGVzdF9idWYpOworICB9IGVsc2UgeworICAgIHZfRmlsdGVyRmluaXNoKGRlc3RfYnVmKTsKKyAgfQorICBtX2JFT0YgPSBUUlVFOwogfQotdm9pZCBDRlhfRGF0YUZpbHRlcjo6UmVwb3J0RU9GKEZYX0RXT1JEIGxlZnRfaW5wdXQpCi17Ci0gICAgaWYgKG1fYkVPRikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fYkVPRiA9IFRSVUU7Ci0gICAgbV9TcmNQb3MgLT0gbGVmdF9pbnB1dDsKK3ZvaWQgQ0ZYX0RhdGFGaWx0ZXI6OlJlcG9ydEVPRihGWF9EV09SRCBsZWZ0X2lucHV0KSB7CisgIGlmIChtX2JFT0YpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9iRU9GID0gVFJVRTsKKyAgbV9TcmNQb3MgLT0gbGVmdF9pbnB1dDsKIH0KLUNGWF9EYXRhRmlsdGVyKiBGUERGX0NyZWF0ZUZpbHRlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0gICAgRlhfRFdPUkQgaWQgPSBuYW1lLkdldElEKCk7Ci0gICAgc3dpdGNoIChpZCkgewotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnRicsICdsJywgJ2EnLCAndCcpOgotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnRicsICdsJywgMCwgMCk6Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdMJywgJ1onLCAnVycsICdEJyk6Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdMJywgJ1onLCAnVycsIDApOiB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0RhdGFGaWx0ZXIqIHBGaWx0ZXI7Ci0gICAgICAgICAgICAgICAgaWYgKGlkID09IEZYQlNUUl9JRCgnTCcsICdaJywgJ1cnLCAnRCcpIHx8IGlkID09IEZYQlNUUl9JRCgnTCcsICdaJywgJ1cnLCAwKSkgewotICAgICAgICAgICAgICAgICAgICBwRmlsdGVyID0gbmV3IENQREZfTHp3RmlsdGVyKHBQYXJhbSA/IHBQYXJhbS0+R2V0SW50ZWdlcigiRWFybHlDaGFuZ2UiLCAxKSA6IDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBGaWx0ZXIgPSBuZXcgQ1BERl9GbGF0ZUZpbHRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChwUGFyYW0gPyBwUGFyYW0tPkdldEludGVnZXIoIlByZWRpY3RvciIsIDEpIDogMSkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9EYXRhRmlsdGVyKiBwUHJlZGljdG9yID0gbmV3IENQREZfUHJlZGljdG9yRmlsdGVyKHBQYXJhbS0+R2V0SW50ZWdlcihGWF9CU1RSQygiUHJlZGljdG9yIiksIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+R2V0SW50ZWdlcihGWF9CU1RSQygiQ29sb3JzIiksIDEpLCBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSwgOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJDb2x1bW5zIiksIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgcEZpbHRlci0+U2V0RGVzdEZpbHRlcihwUHJlZGljdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBGaWx0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdBJywgJ1MnLCAnQycsICdJJyk6Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSAiQVNDSUlIZXhEZWNvZGUiKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX0FzY2lpSGV4RmlsdGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX0FzY2lpODVGaWx0ZXI7Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdBJywgJ0gnLCAneCcsIDApOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX0FzY2lpSGV4RmlsdGVyOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnQScsICc4JywgJzUnLCAwKToKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9Bc2NpaTg1RmlsdGVyOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnUicsICd1JywgJ24nLCAnTCcpOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX1J1bkxlbkZpbHRlcjsKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0MnLCAnQycsICdJJywgJ1QnKTogewotICAgICAgICAgICAgICAgIGludCBFbmNvZGluZyA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGJFbmRPZkxpbmUgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBpbnQgYkJ5dGVBbGlnbiA9IEZBTFNFOwotICAgICAgICAgICAgICAgIGludCBiQmxhY2sgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBpbnQgblJvd3MgPSAwOwotICAgICAgICAgICAgICAgIGludCBuQ29sdW1ucyA9IDE3Mjg7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbSkgewotICAgICAgICAgICAgICAgICAgICBFbmNvZGluZyA9IHBQYXJhbS0+R2V0SW50ZWdlcihGWF9CU1RSQygiSyIpKTsKLSAgICAgICAgICAgICAgICAgICAgYkVuZE9mTGluZSA9IHBQYXJhbS0+R2V0SW50ZWdlcihGWF9CU1RSQygiRW5kT2ZMaW5lIikpOwotICAgICAgICAgICAgICAgICAgICBiQnl0ZUFsaWduID0gcFBhcmFtLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJFbmNvZGVkQnl0ZUFsaWduIikpOwotICAgICAgICAgICAgICAgICAgICBiQmxhY2sgPSBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkJsYWNrSXMxIikpOwotICAgICAgICAgICAgICAgICAgICBuQ29sdW1ucyA9IHBQYXJhbS0+R2V0SW50ZWdlcihGWF9CU1RSQygiQ29sdW1ucyIpLCAxNzI4KTsKLSAgICAgICAgICAgICAgICAgICAgblJvd3MgPSBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIlJvd3MiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuQ29sdW1ucyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5Db2x1bW5zID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuUm93cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5Sb3dzID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDUERGX0ZheEZpbHRlciogcEZpbHRlciA9IG5ldyBDUERGX0ZheEZpbHRlcigpOwotICAgICAgICAgICAgICAgIHBGaWx0ZXItPkluaXRpYWxpemUoRW5jb2RpbmcsIGJFbmRPZkxpbmUsIGJCeXRlQWxpZ24sIGJCbGFjaywgblJvd3MsIG5Db2x1bW5zKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcEZpbHRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0QnLCAnQycsICdUJywgJ0QnKToKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9KcGVnRmlsdGVyOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CitDRlhfRGF0YUZpbHRlciogRlBERl9DcmVhdGVGaWx0ZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CisgIEZYX0RXT1JEIGlkID0gbmFtZS5HZXRJRCgpOworICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBGWEJTVFJfSUQoJ0YnLCAnbCcsICdhJywgJ3QnKToKKyAgICBjYXNlIEZYQlNUUl9JRCgnRicsICdsJywgMCwgMCk6CisgICAgY2FzZSBGWEJTVFJfSUQoJ0wnLCAnWicsICdXJywgJ0QnKToKKyAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICdaJywgJ1cnLCAwKTogeworICAgICAgQ0ZYX0RhdGFGaWx0ZXIqIHBGaWx0ZXI7CisgICAgICBpZiAoaWQgPT0gRlhCU1RSX0lEKCdMJywgJ1onLCAnVycsICdEJykgfHwKKyAgICAgICAgICBpZCA9PSBGWEJTVFJfSUQoJ0wnLCAnWicsICdXJywgMCkpIHsKKyAgICAgICAgcEZpbHRlciA9IG5ldyBDUERGX0x6d0ZpbHRlcigKKyAgICAgICAgICAgIHBQYXJhbSA/IHBQYXJhbS0+R2V0SW50ZWdlcigiRWFybHlDaGFuZ2UiLCAxKSA6IDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcEZpbHRlciA9IG5ldyBDUERGX0ZsYXRlRmlsdGVyOworICAgICAgfQorICAgICAgaWYgKChwUGFyYW0gPyBwUGFyYW0tPkdldEludGVnZXIoIlByZWRpY3RvciIsIDEpIDogMSkgPiAxKSB7CisgICAgICAgIENGWF9EYXRhRmlsdGVyKiBwUHJlZGljdG9yID0gbmV3IENQREZfUHJlZGljdG9yRmlsdGVyKAorICAgICAgICAgICAgcFBhcmFtLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQcmVkaWN0b3IiKSwgMSksCisgICAgICAgICAgICBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbG9ycyIpLCAxKSwKKyAgICAgICAgICAgIHBQYXJhbS0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpLCA4KSwKKyAgICAgICAgICAgIHBQYXJhbS0+R2V0SW50ZWdlcihGWF9CU1RSQygiQ29sdW1ucyIpLCAxKSk7CisgICAgICAgIHBGaWx0ZXItPlNldERlc3RGaWx0ZXIocFByZWRpY3Rvcik7CisgICAgICB9CisgICAgICByZXR1cm4gcEZpbHRlcjsKICAgICB9CisgICAgY2FzZSBGWEJTVFJfSUQoJ0EnLCAnUycsICdDJywgJ0knKToKKyAgICAgIGlmIChuYW1lID09ICJBU0NJSUhleERlY29kZSIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDUERGX0FzY2lpSGV4RmlsdGVyOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBDUERGX0FzY2lpODVGaWx0ZXI7CisgICAgY2FzZSBGWEJTVFJfSUQoJ0EnLCAnSCcsICd4JywgMCk6CisgICAgICByZXR1cm4gbmV3IENQREZfQXNjaWlIZXhGaWx0ZXI7CisgICAgY2FzZSBGWEJTVFJfSUQoJ0EnLCAnOCcsICc1JywgMCk6CisgICAgICByZXR1cm4gbmV3IENQREZfQXNjaWk4NUZpbHRlcjsKKyAgICBjYXNlIEZYQlNUUl9JRCgnUicsICd1JywgJ24nLCAnTCcpOgorICAgICAgcmV0dXJuIG5ldyBDUERGX1J1bkxlbkZpbHRlcjsKKyAgICBjYXNlIEZYQlNUUl9JRCgnQycsICdDJywgJ0knLCAnVCcpOiB7CisgICAgICBpbnQgRW5jb2RpbmcgPSAwOworICAgICAgaW50IGJFbmRPZkxpbmUgPSBGQUxTRTsKKyAgICAgIGludCBiQnl0ZUFsaWduID0gRkFMU0U7CisgICAgICBpbnQgYkJsYWNrID0gRkFMU0U7CisgICAgICBpbnQgblJvd3MgPSAwOworICAgICAgaW50IG5Db2x1bW5zID0gMTcyODsKKyAgICAgIGlmIChwUGFyYW0pIHsKKyAgICAgICAgRW5jb2RpbmcgPSBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIksiKSk7CisgICAgICAgIGJFbmRPZkxpbmUgPSBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkVuZE9mTGluZSIpKTsKKyAgICAgICAgYkJ5dGVBbGlnbiA9IHBQYXJhbS0+R2V0SW50ZWdlcihGWF9CU1RSQygiRW5jb2RlZEJ5dGVBbGlnbiIpKTsKKyAgICAgICAgYkJsYWNrID0gcFBhcmFtLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCbGFja0lzMSIpKTsKKyAgICAgICAgbkNvbHVtbnMgPSBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbHVtbnMiKSwgMTcyOCk7CisgICAgICAgIG5Sb3dzID0gcFBhcmFtLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSb3dzIikpOworICAgICAgfQorICAgICAgaWYgKG5Db2x1bW5zID09IDApIHsKKyAgICAgICAgbkNvbHVtbnMgPSB3aWR0aDsKKyAgICAgIH0KKyAgICAgIGlmIChuUm93cyA9PSAwKSB7CisgICAgICAgIG5Sb3dzID0gaGVpZ2h0OworICAgICAgfQorICAgICAgQ1BERl9GYXhGaWx0ZXIqIHBGaWx0ZXIgPSBuZXcgQ1BERl9GYXhGaWx0ZXIoKTsKKyAgICAgIHBGaWx0ZXItPkluaXRpYWxpemUoRW5jb2RpbmcsIGJFbmRPZkxpbmUsIGJCeXRlQWxpZ24sIGJCbGFjaywgblJvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5Db2x1bW5zKTsKKyAgICAgIHJldHVybiBwRmlsdGVyOworICAgIH0KKyAgICBjYXNlIEZYQlNUUl9JRCgnRCcsICdDJywgJ1QnLCAnRCcpOgorICAgICAgcmV0dXJuIG5ldyBDUERGX0pwZWdGaWx0ZXI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICB9CiB9Ci1DRlhfRGF0YUZpbHRlciogX0ZQREZfQ3JlYXRlRmlsdGVyRnJvbURpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLXsKLSAgICBDUERGX09iamVjdCogcERlY29kZXIgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJGaWx0ZXIiKTsKLSAgICBpZiAocERlY29kZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKK0NGWF9EYXRhRmlsdGVyKiBfRlBERl9DcmVhdGVGaWx0ZXJGcm9tRGljdChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7CisgIENQREZfT2JqZWN0KiBwRGVjb2RlciA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkZpbHRlciIpOworICBpZiAocERlY29kZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENGWF9EYXRhRmlsdGVyKiBwRmlyc3RGaWx0ZXIgPSBOVUxMOworICBpbnQgd2lkdGggPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSksCisgICAgICBoZWlnaHQgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiSGVpZ2h0IikpOworICBDUERGX09iamVjdCogcFBhcmFtcyA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkRlY29kZVBhcm1zIik7CisgIGlmIChwRGVjb2Rlci0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgIGlmIChwUGFyYW1zICYmIHBQYXJhbXMtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKKyAgICAgIHBQYXJhbXMgPSBOVUxMOwogICAgIH0KLSAgICBDRlhfRGF0YUZpbHRlciogcEZpcnN0RmlsdGVyID0gTlVMTDsKLSAgICBpbnQgd2lkdGggPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSksIGhlaWdodCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7Ci0gICAgQ1BERl9PYmplY3QqIHBQYXJhbXMgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJEZWNvZGVQYXJtcyIpOwotICAgIGlmIChwRGVjb2Rlci0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICBpZiAocFBhcmFtcyAmJiBwUGFyYW1zLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICBwUGFyYW1zID0gTlVMTDsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgKChDUERGX0FycmF5KilwRGVjb2RlciktPkdldENvdW50KCk7IGkrKykgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9ICgoQ1BERl9BcnJheSopcERlY29kZXIpLT5HZXRTdHJpbmcoaSk7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbSA9IE5VTEw7CisgICAgICBpZiAocFBhcmFtcykgeworICAgICAgICBwUGFyYW0gPSAoKENQREZfQXJyYXkqKXBQYXJhbXMpLT5HZXREaWN0KGkpOworICAgICAgfQorICAgICAgQ0ZYX0RhdGFGaWx0ZXIqIHBEZXN0RmlsdGVyID0KKyAgICAgICAgICBGUERGX0NyZWF0ZUZpbHRlcihuYW1lLCBwUGFyYW0sIHdpZHRoLCBoZWlnaHQpOworICAgICAgaWYgKHBEZXN0RmlsdGVyKSB7CisgICAgICAgIGlmIChwRmlyc3RGaWx0ZXIgPT0gTlVMTCkgeworICAgICAgICAgIHBGaXJzdEZpbHRlciA9IHBEZXN0RmlsdGVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBGaXJzdEZpbHRlci0+U2V0RGVzdEZpbHRlcihwRGVzdEZpbHRlcik7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8ICgoQ1BERl9BcnJheSopcERlY29kZXIpLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gKChDUERGX0FycmF5KilwRGVjb2RlciktPkdldFN0cmluZyhpKTsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhcmFtID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChwUGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgcFBhcmFtID0gKChDUERGX0FycmF5KilwUGFyYW1zKS0+R2V0RGljdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENGWF9EYXRhRmlsdGVyKiBwRGVzdEZpbHRlciA9IEZQREZfQ3JlYXRlRmlsdGVyKG5hbWUsIHBQYXJhbSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBpZiAocERlc3RGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAocEZpcnN0RmlsdGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcEZpcnN0RmlsdGVyID0gcERlc3RGaWx0ZXI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcEZpcnN0RmlsdGVyLT5TZXREZXN0RmlsdGVyKHBEZXN0RmlsdGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAocFBhcmFtcyAmJiBwUGFyYW1zLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgICAgIHBQYXJhbXMgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHBGaXJzdEZpbHRlciA9IEZQREZfQ3JlYXRlRmlsdGVyKHBEZWNvZGVyLT5HZXRTdHJpbmcoKSwgKENQREZfRGljdGlvbmFyeSopcFBhcmFtcywgd2lkdGgsIGhlaWdodCk7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBwRmlyc3RGaWx0ZXI7CisgIH0gZWxzZSB7CisgICAgaWYgKHBQYXJhbXMgJiYgcFBhcmFtcy0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgICBwUGFyYW1zID0gTlVMTDsKKyAgICB9CisgICAgcEZpcnN0RmlsdGVyID0gRlBERl9DcmVhdGVGaWx0ZXIocERlY29kZXItPkdldFN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDUERGX0RpY3Rpb25hcnkqKXBQYXJhbXMsIHdpZHRoLCBoZWlnaHQpOworICB9CisgIHJldHVybiBwRmlyc3RGaWx0ZXI7CiB9Ci1DUERGX1N0cmVhbUZpbHRlciogQ1BERl9TdHJlYW06OkdldFN0cmVhbUZpbHRlcihGWF9CT09MIGJSYXcpIGNvbnN0Ci17Ci0gICAgQ0ZYX0RhdGFGaWx0ZXIqIHBGaXJzdEZpbHRlciA9IE5VTEw7Ci0gICAgaWYgKG1fcENyeXB0b0hhbmRsZXIpIHsKLSAgICAgICAgcEZpcnN0RmlsdGVyID0gbmV3IENQREZfRGVjcnlwdEZpbHRlcihtX3BDcnlwdG9IYW5kbGVyLCBtX09iak51bSwgbV9HZW5OdW0pOworQ1BERl9TdHJlYW1GaWx0ZXIqIENQREZfU3RyZWFtOjpHZXRTdHJlYW1GaWx0ZXIoRlhfQk9PTCBiUmF3KSBjb25zdCB7CisgIENGWF9EYXRhRmlsdGVyKiBwRmlyc3RGaWx0ZXIgPSBOVUxMOworICBpZiAobV9wQ3J5cHRvSGFuZGxlcikgeworICAgIHBGaXJzdEZpbHRlciA9IG5ldyBDUERGX0RlY3J5cHRGaWx0ZXIobV9wQ3J5cHRvSGFuZGxlciwgbV9PYmpOdW0sIG1fR2VuTnVtKTsKKyAgfQorICBpZiAoIWJSYXcpIHsKKyAgICBDRlhfRGF0YUZpbHRlciogcEZpbHRlciA9IF9GUERGX0NyZWF0ZUZpbHRlckZyb21EaWN0KG1fcERpY3QpOworICAgIGlmIChwRmlsdGVyKSB7CisgICAgICBpZiAocEZpcnN0RmlsdGVyID09IE5VTEwpIHsKKyAgICAgICAgcEZpcnN0RmlsdGVyID0gcEZpbHRlcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBGaXJzdEZpbHRlci0+U2V0RGVzdEZpbHRlcihwRmlsdGVyKTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFiUmF3KSB7Ci0gICAgICAgIENGWF9EYXRhRmlsdGVyKiBwRmlsdGVyID0gX0ZQREZfQ3JlYXRlRmlsdGVyRnJvbURpY3QobV9wRGljdCk7Ci0gICAgICAgIGlmIChwRmlsdGVyKSB7Ci0gICAgICAgICAgICBpZiAocEZpcnN0RmlsdGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwRmlyc3RGaWx0ZXIgPSBwRmlsdGVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwRmlyc3RGaWx0ZXItPlNldERlc3RGaWx0ZXIocEZpbHRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9TdHJlYW1GaWx0ZXIqIHBTdHJlYW1GaWx0ZXIgPSBuZXcgQ1BERl9TdHJlYW1GaWx0ZXI7Ci0gICAgcFN0cmVhbUZpbHRlci0+bV9wU3RyZWFtID0gdGhpczsKLSAgICBwU3RyZWFtRmlsdGVyLT5tX3BGaWx0ZXIgPSBwRmlyc3RGaWx0ZXI7Ci0gICAgcFN0cmVhbUZpbHRlci0+bV9wQnVmZmVyID0gTlVMTDsKLSAgICBwU3RyZWFtRmlsdGVyLT5tX1NyY09mZnNldCA9IDA7Ci0gICAgcmV0dXJuIHBTdHJlYW1GaWx0ZXI7CisgIH0KKyAgQ1BERl9TdHJlYW1GaWx0ZXIqIHBTdHJlYW1GaWx0ZXIgPSBuZXcgQ1BERl9TdHJlYW1GaWx0ZXI7CisgIHBTdHJlYW1GaWx0ZXItPm1fcFN0cmVhbSA9IHRoaXM7CisgIHBTdHJlYW1GaWx0ZXItPm1fcEZpbHRlciA9IHBGaXJzdEZpbHRlcjsKKyAgcFN0cmVhbUZpbHRlci0+bV9wQnVmZmVyID0gTlVMTDsKKyAgcFN0cmVhbUZpbHRlci0+bV9TcmNPZmZzZXQgPSAwOworICByZXR1cm4gcFN0cmVhbUZpbHRlcjsKIH0KLUNQREZfU3RyZWFtRmlsdGVyOjp+Q1BERl9TdHJlYW1GaWx0ZXIoKQotewotICAgIGRlbGV0ZSBtX3BGaWx0ZXI7Ci0gICAgZGVsZXRlIG1fcEJ1ZmZlcjsKK0NQREZfU3RyZWFtRmlsdGVyOjp+Q1BERl9TdHJlYW1GaWx0ZXIoKSB7CisgIGRlbGV0ZSBtX3BGaWx0ZXI7CisgIGRlbGV0ZSBtX3BCdWZmZXI7CiB9Ci0jZGVmaW5lIEZQREZfRklMVEVSX0JVRkZFUl9JTl9TSVpFCUZQREZfRklMVEVSX0JVRkZFUl9TSVpFCi1GWF9EV09SRCBDUERGX1N0cmVhbUZpbHRlcjo6UmVhZEJsb2NrKHVpbnQ4X3QqIGJ1ZmZlciwgRlhfRFdPUkQgYnVmX3NpemUpCi17Ci0gICAgaWYgKG1fcEZpbHRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEZYX0RXT1JEIHJlYWRfc2l6ZSA9IG1fcFN0cmVhbS0+R2V0UmF3U2l6ZSgpIC0gbV9TcmNPZmZzZXQ7Ci0gICAgICAgIGlmIChyZWFkX3NpemUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlYWRfc2l6ZSA+IGJ1Zl9zaXplKSB7Ci0gICAgICAgICAgICByZWFkX3NpemUgPSBidWZfc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBtX3BTdHJlYW0tPlJlYWRSYXdEYXRhKG1fU3JjT2Zmc2V0LCBidWZmZXIsIHJlYWRfc2l6ZSk7Ci0gICAgICAgIG1fU3JjT2Zmc2V0ICs9IHJlYWRfc2l6ZTsKLSAgICAgICAgcmV0dXJuIHJlYWRfc2l6ZTsKKyNkZWZpbmUgRlBERl9GSUxURVJfQlVGRkVSX0lOX1NJWkUgRlBERl9GSUxURVJfQlVGRkVSX1NJWkUKK0ZYX0RXT1JEIENQREZfU3RyZWFtRmlsdGVyOjpSZWFkQmxvY2sodWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBidWZfc2l6ZSkgeworICBpZiAobV9wRmlsdGVyID09IE5VTEwpIHsKKyAgICBGWF9EV09SRCByZWFkX3NpemUgPSBtX3BTdHJlYW0tPkdldFJhd1NpemUoKSAtIG1fU3JjT2Zmc2V0OworICAgIGlmIChyZWFkX3NpemUgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIEZYX0RXT1JEIHJlYWRfc2l6ZSA9IDA7Ci0gICAgaWYgKG1fcEJ1ZmZlcikgewotICAgICAgICByZWFkX3NpemUgPSBSZWFkTGVmdE92ZXIoYnVmZmVyLCBidWZfc2l6ZSk7Ci0gICAgICAgIGlmIChyZWFkX3NpemUgPT0gYnVmX3NpemUpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFkX3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyICs9IHJlYWRfc2l6ZTsKLSAgICAgICAgYnVmX3NpemUgLT0gcmVhZF9zaXplOwotICAgIH0KLSAgICBBU1NFUlQobV9wQnVmZmVyID09IE5VTEwpOwotICAgIGlmIChtX3BGaWx0ZXItPklzRU9GKCkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRfc2l6ZTsKLSAgICB9Ci0gICAgbV9wQnVmZmVyID0gbmV3IENGWF9CaW5hcnlCdWY7Ci0gICAgbV9wQnVmZmVyLT5Fc3RpbWF0ZVNpemUoRlBERl9GSUxURVJfQlVGRkVSX1NJWkUsIEZQREZfRklMVEVSX0JVRkZFUl9TSVpFKTsKLSAgICBtX0J1Zk9mZnNldCA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaW50IHNyY19zaXplID0gbV9wU3RyZWFtLT5HZXRSYXdTaXplKCkgLSBtX1NyY09mZnNldDsKLSAgICAgICAgaWYgKHNyY19zaXplID09IDApIHsKLSAgICAgICAgICAgIG1fcEZpbHRlci0+RmlsdGVyRmluaXNoKCptX3BCdWZmZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19zaXplID4gRlBERl9GSUxURVJfQlVGRkVSX0lOX1NJWkUpIHsKLSAgICAgICAgICAgIHNyY19zaXplID0gRlBERl9GSUxURVJfQlVGRkVSX0lOX1NJWkU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX3BTdHJlYW0tPlJlYWRSYXdEYXRhKG1fU3JjT2Zmc2V0LCBtX1NyY0J1ZmZlciwgc3JjX3NpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBtX1NyY09mZnNldCArPSBzcmNfc2l6ZTsKLSAgICAgICAgbV9wRmlsdGVyLT5GaWx0ZXJJbihtX1NyY0J1ZmZlciwgc3JjX3NpemUsICptX3BCdWZmZXIpOwotICAgICAgICBpZiAobV9wQnVmZmVyLT5HZXRTaXplKCkgPj0gKGludClidWZfc2l6ZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlYWRfc2l6ZSArIFJlYWRMZWZ0T3ZlcihidWZmZXIsIGJ1Zl9zaXplKTsKLX0KLUZYX0RXT1JEIENQREZfU3RyZWFtRmlsdGVyOjpSZWFkTGVmdE92ZXIodWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBidWZfc2l6ZSkKLXsKLSAgICBGWF9EV09SRCByZWFkX3NpemUgPSBtX3BCdWZmZXItPkdldFNpemUoKSAtIG1fQnVmT2Zmc2V0OwogICAgIGlmIChyZWFkX3NpemUgPiBidWZfc2l6ZSkgewotICAgICAgICByZWFkX3NpemUgPSBidWZfc2l6ZTsKKyAgICAgIHJlYWRfc2l6ZSA9IGJ1Zl9zaXplOwogICAgIH0KLSAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCBtX3BCdWZmZXItPkdldEJ1ZmZlcigpICsgbV9CdWZPZmZzZXQsIHJlYWRfc2l6ZSk7Ci0gICAgbV9CdWZPZmZzZXQgKz0gcmVhZF9zaXplOwotICAgIGlmIChtX0J1Zk9mZnNldCA9PSAoRlhfRFdPUkQpbV9wQnVmZmVyLT5HZXRTaXplKCkpIHsKLSAgICAgICAgZGVsZXRlIG1fcEJ1ZmZlcjsKLSAgICAgICAgbV9wQnVmZmVyID0gTlVMTDsKLSAgICB9CisgICAgbV9wU3RyZWFtLT5SZWFkUmF3RGF0YShtX1NyY09mZnNldCwgYnVmZmVyLCByZWFkX3NpemUpOworICAgIG1fU3JjT2Zmc2V0ICs9IHJlYWRfc2l6ZTsKICAgICByZXR1cm4gcmVhZF9zaXplOwotfQotQ1BERl9EZWNyeXB0RmlsdGVyOjpDUERGX0RlY3J5cHRGaWx0ZXIoQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvSGFuZGxlciwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pCi17Ci0gICAgbV9wQ3J5cHRvSGFuZGxlciA9IHBDcnlwdG9IYW5kbGVyOwotICAgIG1fcENvbnRleHQgPSBOVUxMOwotICAgIG1fT2JqTnVtID0gb2JqbnVtOwotICAgIG1fR2VuTnVtID0gZ2VubnVtOwotfQotQ1BERl9EZWNyeXB0RmlsdGVyOjp+Q1BERl9EZWNyeXB0RmlsdGVyKCkKLXsKLSAgICBDRlhfQmluYXJ5QnVmIGJ1ZjsKLSAgICBpZiAobV9wQ29udGV4dCkgewotICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0RmluaXNoKG1fcENvbnRleHQsIGJ1Zik7CisgIH0KKyAgRlhfRFdPUkQgcmVhZF9zaXplID0gMDsKKyAgaWYgKG1fcEJ1ZmZlcikgeworICAgIHJlYWRfc2l6ZSA9IFJlYWRMZWZ0T3ZlcihidWZmZXIsIGJ1Zl9zaXplKTsKKyAgICBpZiAocmVhZF9zaXplID09IGJ1Zl9zaXplKSB7CisgICAgICByZXR1cm4gcmVhZF9zaXplOwogICAgIH0KLX0KLXZvaWQgQ1BERl9EZWNyeXB0RmlsdGVyOjp2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBpZiAobV9wQ29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcENvbnRleHQgPSBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0U3RhcnQobV9PYmpOdW0sIG1fR2VuTnVtKTsKKyAgICBidWZmZXIgKz0gcmVhZF9zaXplOworICAgIGJ1Zl9zaXplIC09IHJlYWRfc2l6ZTsKKyAgfQorICBBU1NFUlQobV9wQnVmZmVyID09IE5VTEwpOworICBpZiAobV9wRmlsdGVyLT5Jc0VPRigpKSB7CisgICAgcmV0dXJuIHJlYWRfc2l6ZTsKKyAgfQorICBtX3BCdWZmZXIgPSBuZXcgQ0ZYX0JpbmFyeUJ1ZjsKKyAgbV9wQnVmZmVyLT5Fc3RpbWF0ZVNpemUoRlBERl9GSUxURVJfQlVGRkVSX1NJWkUsIEZQREZfRklMVEVSX0JVRkZFUl9TSVpFKTsKKyAgbV9CdWZPZmZzZXQgPSAwOworICB3aGlsZSAoMSkgeworICAgIGludCBzcmNfc2l6ZSA9IG1fcFN0cmVhbS0+R2V0UmF3U2l6ZSgpIC0gbV9TcmNPZmZzZXQ7CisgICAgaWYgKHNyY19zaXplID09IDApIHsKKyAgICAgIG1fcEZpbHRlci0+RmlsdGVyRmluaXNoKCptX3BCdWZmZXIpOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHRTdHJlYW0obV9wQ29udGV4dCwgc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmKTsKKyAgICBpZiAoc3JjX3NpemUgPiBGUERGX0ZJTFRFUl9CVUZGRVJfSU5fU0laRSkgeworICAgICAgc3JjX3NpemUgPSBGUERGX0ZJTFRFUl9CVUZGRVJfSU5fU0laRTsKKyAgICB9CisgICAgaWYgKCFtX3BTdHJlYW0tPlJlYWRSYXdEYXRhKG1fU3JjT2Zmc2V0LCBtX1NyY0J1ZmZlciwgc3JjX3NpemUpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbV9TcmNPZmZzZXQgKz0gc3JjX3NpemU7CisgICAgbV9wRmlsdGVyLT5GaWx0ZXJJbihtX1NyY0J1ZmZlciwgc3JjX3NpemUsICptX3BCdWZmZXIpOworICAgIGlmIChtX3BCdWZmZXItPkdldFNpemUoKSA+PSAoaW50KWJ1Zl9zaXplKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlYWRfc2l6ZSArIFJlYWRMZWZ0T3ZlcihidWZmZXIsIGJ1Zl9zaXplKTsKIH0KLXZvaWQgQ1BERl9EZWNyeXB0RmlsdGVyOjp2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBtX2JFT0YgPSBUUlVFOwotICAgIGlmIChtX3BDb250ZXh0ID09IE5VTEwpIHsKK0ZYX0RXT1JEIENQREZfU3RyZWFtRmlsdGVyOjpSZWFkTGVmdE92ZXIodWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBidWZfc2l6ZSkgeworICBGWF9EV09SRCByZWFkX3NpemUgPSBtX3BCdWZmZXItPkdldFNpemUoKSAtIG1fQnVmT2Zmc2V0OworICBpZiAocmVhZF9zaXplID4gYnVmX3NpemUpIHsKKyAgICByZWFkX3NpemUgPSBidWZfc2l6ZTsKKyAgfQorICBGWFNZU19tZW1jcHkoYnVmZmVyLCBtX3BCdWZmZXItPkdldEJ1ZmZlcigpICsgbV9CdWZPZmZzZXQsIHJlYWRfc2l6ZSk7CisgIG1fQnVmT2Zmc2V0ICs9IHJlYWRfc2l6ZTsKKyAgaWYgKG1fQnVmT2Zmc2V0ID09IChGWF9EV09SRCltX3BCdWZmZXItPkdldFNpemUoKSkgeworICAgIGRlbGV0ZSBtX3BCdWZmZXI7CisgICAgbV9wQnVmZmVyID0gTlVMTDsKKyAgfQorICByZXR1cm4gcmVhZF9zaXplOworfQorQ1BERl9EZWNyeXB0RmlsdGVyOjpDUERGX0RlY3J5cHRGaWx0ZXIoQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdlbm51bSkgeworICBtX3BDcnlwdG9IYW5kbGVyID0gcENyeXB0b0hhbmRsZXI7CisgIG1fcENvbnRleHQgPSBOVUxMOworICBtX09iak51bSA9IG9iam51bTsKKyAgbV9HZW5OdW0gPSBnZW5udW07Cit9CitDUERGX0RlY3J5cHRGaWx0ZXI6On5DUERGX0RlY3J5cHRGaWx0ZXIoKSB7CisgIENGWF9CaW5hcnlCdWYgYnVmOworICBpZiAobV9wQ29udGV4dCkgeworICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHRGaW5pc2gobV9wQ29udGV4dCwgYnVmKTsKKyAgfQorfQordm9pZCBDUERGX0RlY3J5cHRGaWx0ZXI6OnZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpIHsKKyAgaWYgKG1fcENvbnRleHQgPT0gTlVMTCkgeworICAgIG1fcENvbnRleHQgPSBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0U3RhcnQobV9PYmpOdW0sIG1fR2VuTnVtKTsKKyAgfQorICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0U3RyZWFtKG1fcENvbnRleHQsIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1Zik7Cit9Cit2b2lkIENQREZfRGVjcnlwdEZpbHRlcjo6dl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpIHsKKyAgbV9iRU9GID0gVFJVRTsKKyAgaWYgKG1fcENvbnRleHQgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0RmluaXNoKG1fcENvbnRleHQsIGRlc3RfYnVmKTsKKyAgbV9wQ29udGV4dCA9IE5VTEw7Cit9CitDUERGX0ZsYXRlRmlsdGVyOjpDUERGX0ZsYXRlRmlsdGVyKCkgeworICBtX3BDb250ZXh0ID0gTlVMTDsKK30KK0NQREZfRmxhdGVGaWx0ZXI6On5DUERGX0ZsYXRlRmlsdGVyKCkgeworICBpZiAobV9wQ29udGV4dCkgeworICAgIEZQREZBUElfRmxhdGVFbmQobV9wQ29udGV4dCk7CisgIH0KK30KK3ZvaWQgQ1BERl9GbGF0ZUZpbHRlcjo6dl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7CisgIGlmIChtX3BDb250ZXh0ID09IE5VTEwpIHsKKyAgICBtX3BDb250ZXh0ID0gRlBERkFQSV9GbGF0ZUluaXQobXlfYWxsb2NfZnVuYywgbXlfZnJlZV9mdW5jKTsKKyAgfQorICBGUERGQVBJX0ZsYXRlSW5wdXQobV9wQ29udGV4dCwgc3JjX2J1Ziwgc3JjX3NpemUpOworICB3aGlsZSAoMSkgeworICAgIGludCByZXQgPQorICAgICAgICBGUERGQVBJX0ZsYXRlT3V0cHV0KG1fcENvbnRleHQsIG1fRGVzdEJ1ZmZlciwgRlBERl9GSUxURVJfQlVGRkVSX1NJWkUpOworICAgIGludCBvdXRfc2l6ZSA9CisgICAgICAgIEZQREZfRklMVEVSX0JVRkZFUl9TSVpFIC0gRlBERkFQSV9GbGF0ZUdldEF2YWlsT3V0KG1fcENvbnRleHQpOworICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKG1fRGVzdEJ1ZmZlciwgb3V0X3NpemUpOworICAgIGlmIChyZXQgPT0gWl9CVUZfRVJST1IpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocmV0ICE9IFpfT0spIHsKKyAgICAgIFJlcG9ydEVPRihGUERGQVBJX0ZsYXRlR2V0QXZhaWxJbihtX3BDb250ZXh0KSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KK0NQREZfTHp3RmlsdGVyOjpDUERGX0x6d0ZpbHRlcihGWF9CT09MIGJFYXJseUNoYW5nZSkgeworICBtX2JFYXJseUNoYW5nZSA9IGJFYXJseUNoYW5nZSA/IDEgOiAwOworICBtX0NvZGVMZW4gPSA5OworICBtX25Db2RlcyA9IDA7CisgIG1fbkxlZnRCaXRzID0gMDsKKyAgbV9MZWZ0Qml0cyA9IDA7CisgIG1fT2xkQ29kZSA9IChGWF9EV09SRCktMTsKK30KK3ZvaWQgQ1BERl9MendGaWx0ZXI6OnZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSsrKSB7CisgICAgaWYgKG1fbkxlZnRCaXRzICsgOCA8IG1fQ29kZUxlbikgeworICAgICAgbV9uTGVmdEJpdHMgKz0gODsKKyAgICAgIG1fTGVmdEJpdHMgPSAobV9MZWZ0Qml0cyA8PCA4KSB8IHNyY19idWZbaV07CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgRlhfRFdPUkQgbmV3X2JpdHMgPSBtX0NvZGVMZW4gLSBtX25MZWZ0Qml0czsKKyAgICBGWF9EV09SRCBjb2RlID0gKG1fTGVmdEJpdHMgPDwgbmV3X2JpdHMpIHwgKHNyY19idWZbaV0gPj4gKDggLSBuZXdfYml0cykpOworICAgIG1fbkxlZnRCaXRzID0gOCAtIG5ld19iaXRzOworICAgIG1fTGVmdEJpdHMgPSBzcmNfYnVmW2ldICUgKDEgPDwgbV9uTGVmdEJpdHMpOworICAgIGlmIChjb2RlIDwgMjU2KSB7CisgICAgICBkZXN0X2J1Zi5BcHBlbmRCeXRlKCh1aW50OF90KWNvZGUpOworICAgICAgbV9MYXN0Q2hhciA9ICh1aW50OF90KWNvZGU7CisgICAgICBpZiAobV9PbGRDb2RlICE9IC0xKSB7CisgICAgICAgIEFkZENvZGUobV9PbGRDb2RlLCBtX0xhc3RDaGFyKTsKKyAgICAgIH0KKyAgICAgIG1fT2xkQ29kZSA9IGNvZGU7CisgICAgfSBlbHNlIGlmIChjb2RlID09IDI1NikgeworICAgICAgbV9Db2RlTGVuID0gOTsKKyAgICAgIG1fbkNvZGVzID0gMDsKKyAgICAgIG1fT2xkQ29kZSA9IChGWF9EV09SRCktMTsKKyAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMjU3KSB7CisgICAgICBSZXBvcnRFT0Yoc3JjX3NpemUgLSBpIC0gMSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX09sZENvZGUgPT0gLTEpIHsKKyAgICAgICAgUmVwb3J0RU9GKHNyY19zaXplIC0gaSAtIDEpOwogICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHRGaW5pc2gobV9wQ29udGV4dCwgZGVzdF9idWYpOwotICAgIG1fcENvbnRleHQgPSBOVUxMOwotfQotQ1BERl9GbGF0ZUZpbHRlcjo6Q1BERl9GbGF0ZUZpbHRlcigpCi17Ci0gICAgbV9wQ29udGV4dCA9IE5VTEw7Ci19Ci1DUERGX0ZsYXRlRmlsdGVyOjp+Q1BERl9GbGF0ZUZpbHRlcigpCi17Ci0gICAgaWYgKG1fcENvbnRleHQpIHsKLSAgICAgICAgRlBERkFQSV9GbGF0ZUVuZChtX3BDb250ZXh0KTsKLSAgICB9Ci19Ci12b2lkIENQREZfRmxhdGVGaWx0ZXI6OnZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQotewotICAgIGlmIChtX3BDb250ZXh0ID09IE5VTEwpIHsKLSAgICAgICAgbV9wQ29udGV4dCA9IEZQREZBUElfRmxhdGVJbml0KG15X2FsbG9jX2Z1bmMsIG15X2ZyZWVfZnVuYyk7Ci0gICAgfQotICAgIEZQREZBUElfRmxhdGVJbnB1dChtX3BDb250ZXh0LCBzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaW50IHJldCA9IEZQREZBUElfRmxhdGVPdXRwdXQobV9wQ29udGV4dCwgbV9EZXN0QnVmZmVyLCBGUERGX0ZJTFRFUl9CVUZGRVJfU0laRSk7Ci0gICAgICAgIGludCBvdXRfc2l6ZSA9IEZQREZfRklMVEVSX0JVRkZFUl9TSVpFIC0gRlBERkFQSV9GbGF0ZUdldEF2YWlsT3V0KG1fcENvbnRleHQpOwotICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhtX0Rlc3RCdWZmZXIsIG91dF9zaXplKTsKLSAgICAgICAgaWYgKHJldCA9PSBaX0JVRl9FUlJPUikgewotICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBtX1N0YWNrTGVuID0gMDsKKyAgICAgIGlmIChjb2RlID49IG1fbkNvZGVzICsgMjU4KSB7CisgICAgICAgIGlmIChtX1N0YWNrTGVuIDwgc2l6ZW9mKG1fRGVjb2RlU3RhY2spKSB7CisgICAgICAgICAgbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuKytdID0gbV9MYXN0Q2hhcjsKICAgICAgICAgfQotICAgICAgICBpZiAocmV0ICE9IFpfT0spIHsKLSAgICAgICAgICAgIFJlcG9ydEVPRihGUERGQVBJX0ZsYXRlR2V0QXZhaWxJbihtX3BDb250ZXh0KSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLUNQREZfTHp3RmlsdGVyOjpDUERGX0x6d0ZpbHRlcihGWF9CT09MIGJFYXJseUNoYW5nZSkKLXsKLSAgICBtX2JFYXJseUNoYW5nZSA9IGJFYXJseUNoYW5nZSA/IDEgOiAwOwotICAgIG1fQ29kZUxlbiA9IDk7Ci0gICAgbV9uQ29kZXMgPSAwOwotICAgIG1fbkxlZnRCaXRzID0gMDsKLSAgICBtX0xlZnRCaXRzID0gMDsKLSAgICBtX09sZENvZGUgPSAoRlhfRFdPUkQpIC0gMTsKLX0KLXZvaWQgQ1BERl9MendGaWx0ZXI6OnZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQotewotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSArKykgewotICAgICAgICBpZiAobV9uTGVmdEJpdHMgKyA4IDwgbV9Db2RlTGVuKSB7Ci0gICAgICAgICAgICBtX25MZWZ0Qml0cyArPSA4OwotICAgICAgICAgICAgbV9MZWZ0Qml0cyA9IChtX0xlZnRCaXRzIDw8IDgpIHwgc3JjX2J1ZltpXTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIG5ld19iaXRzID0gbV9Db2RlTGVuIC0gbV9uTGVmdEJpdHM7Ci0gICAgICAgIEZYX0RXT1JEIGNvZGUgPSAobV9MZWZ0Qml0cyA8PCBuZXdfYml0cykgfCAoc3JjX2J1ZltpXSA+PiAoOCAtIG5ld19iaXRzKSk7Ci0gICAgICAgIG1fbkxlZnRCaXRzID0gOCAtIG5ld19iaXRzOwotICAgICAgICBtX0xlZnRCaXRzID0gc3JjX2J1ZltpXSAlICgxIDw8IG1fbkxlZnRCaXRzKTsKLSAgICAgICAgaWYgKGNvZGUgPCAyNTYpIHsKLSAgICAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJ5dGUoKHVpbnQ4X3QpY29kZSk7Ci0gICAgICAgICAgICBtX0xhc3RDaGFyID0gKHVpbnQ4X3QpY29kZTsKLSAgICAgICAgICAgIGlmIChtX09sZENvZGUgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBBZGRDb2RlKG1fT2xkQ29kZSwgbV9MYXN0Q2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX09sZENvZGUgPSBjb2RlOwotICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMjU2KSB7Ci0gICAgICAgICAgICBtX0NvZGVMZW4gPSA5OwotICAgICAgICAgICAgbV9uQ29kZXMgPSAwOwotICAgICAgICAgICAgbV9PbGRDb2RlID0gKEZYX0RXT1JEKSAtIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAyNTcpIHsKLSAgICAgICAgICAgIFJlcG9ydEVPRihzcmNfc2l6ZSAtIGkgLSAxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX09sZENvZGUgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBSZXBvcnRFT0Yoc3JjX3NpemUgLSBpIC0gMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9TdGFja0xlbiA9IDA7Ci0gICAgICAgICAgICBpZiAoY29kZSA+PSBtX25Db2RlcyArIDI1OCkgewotICAgICAgICAgICAgICAgIGlmIChtX1N0YWNrTGVuIDwgc2l6ZW9mKG1fRGVjb2RlU3RhY2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbisrXSA9IG1fTGFzdENoYXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERlY29kZVN0cmluZyhtX09sZENvZGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhOVUxMLCBtX1N0YWNrTGVuKTsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHBPdXRwdXQgPSBkZXN0X2J1Zi5HZXRCdWZmZXIoKSArIGRlc3RfYnVmLkdldFNpemUoKSAtIG1fU3RhY2tMZW47Ci0gICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGNjID0gMDsgY2MgPCBtX1N0YWNrTGVuOyBjYyArKykgewotICAgICAgICAgICAgICAgIHBPdXRwdXRbY2NdID0gbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuIC0gY2MgLSAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fTGFzdENoYXIgPSBtX0RlY29kZVN0YWNrW21fU3RhY2tMZW4gLSAxXTsKLSAgICAgICAgICAgIGlmIChtX09sZENvZGUgPCAyNTYpIHsKLSAgICAgICAgICAgICAgICBBZGRDb2RlKG1fT2xkQ29kZSwgbV9MYXN0Q2hhcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fT2xkQ29kZSAtIDI1OCA+PSBtX25Db2RlcykgewotICAgICAgICAgICAgICAgIFJlcG9ydEVPRihzcmNfc2l6ZSAtIGkgLSAxKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFkZENvZGUobV9PbGRDb2RlLCBtX0xhc3RDaGFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fT2xkQ29kZSA9IGNvZGU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENQREZfTHp3RmlsdGVyOjpBZGRDb2RlKEZYX0RXT1JEIHByZWZpeF9jb2RlLCB1aW50OF90IGFwcGVuZF9jaGFyKQotewotICAgIGlmIChtX25Db2RlcyArIG1fYkVhcmx5Q2hhbmdlID09IDQwOTQpIHsKKyAgICAgICAgRGVjb2RlU3RyaW5nKG1fT2xkQ29kZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7CisgICAgICB9CisgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhOVUxMLCBtX1N0YWNrTGVuKTsKKyAgICAgIHVpbnQ4X3QqIHBPdXRwdXQgPSBkZXN0X2J1Zi5HZXRCdWZmZXIoKSArIGRlc3RfYnVmLkdldFNpemUoKSAtIG1fU3RhY2tMZW47CisgICAgICBmb3IgKEZYX0RXT1JEIGNjID0gMDsgY2MgPCBtX1N0YWNrTGVuOyBjYysrKSB7CisgICAgICAgIHBPdXRwdXRbY2NdID0gbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuIC0gY2MgLSAxXTsKKyAgICAgIH0KKyAgICAgIG1fTGFzdENoYXIgPSBtX0RlY29kZVN0YWNrW21fU3RhY2tMZW4gLSAxXTsKKyAgICAgIGlmIChtX09sZENvZGUgPCAyNTYpIHsKKyAgICAgICAgQWRkQ29kZShtX09sZENvZGUsIG1fTGFzdENoYXIpOworICAgICAgfSBlbHNlIGlmIChtX09sZENvZGUgLSAyNTggPj0gbV9uQ29kZXMpIHsKKyAgICAgICAgUmVwb3J0RU9GKHNyY19zaXplIC0gaSAtIDEpOwogICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgeworICAgICAgICBBZGRDb2RlKG1fT2xkQ29kZSwgbV9MYXN0Q2hhcik7CisgICAgICB9CisgICAgICBtX09sZENvZGUgPSBjb2RlOwogICAgIH0KLSAgICBtX0NvZGVBcnJheVttX25Db2RlcyArK10gPSAocHJlZml4X2NvZGUgPDwgMTYpIHwgYXBwZW5kX2NoYXI7Ci0gICAgaWYgKG1fbkNvZGVzICsgbV9iRWFybHlDaGFuZ2UgPT0gNTEyIC0gMjU4KSB7Ci0gICAgICAgIG1fQ29kZUxlbiA9IDEwOwotICAgIH0gZWxzZSBpZiAobV9uQ29kZXMgKyBtX2JFYXJseUNoYW5nZSA9PSAxMDI0IC0gMjU4KSB7Ci0gICAgICAgIG1fQ29kZUxlbiA9IDExOwotICAgIH0gZWxzZSBpZiAobV9uQ29kZXMgKyBtX2JFYXJseUNoYW5nZSA9PSAyMDQ4IC0gMjU4KSB7Ci0gICAgICAgIG1fQ29kZUxlbiA9IDEyOwotICAgIH0KKyAgfQogfQotdm9pZCBDUERGX0x6d0ZpbHRlcjo6RGVjb2RlU3RyaW5nKEZYX0RXT1JEIGNvZGUpCi17Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaW50IGluZGV4ID0gY29kZSAtIDI1ODsKLSAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSAoaW50KW1fbkNvZGVzKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBkYXRhID0gbV9Db2RlQXJyYXlbaW5kZXhdOwotICAgICAgICBpZiAobV9TdGFja0xlbiA+PSBzaXplb2YobV9EZWNvZGVTdGFjaykpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtX0RlY29kZVN0YWNrW21fU3RhY2tMZW4rK10gPSAodWludDhfdClkYXRhOwotICAgICAgICBjb2RlID0gZGF0YSA+PiAxNjsKK3ZvaWQgQ1BERl9MendGaWx0ZXI6OkFkZENvZGUoRlhfRFdPUkQgcHJlZml4X2NvZGUsIHVpbnQ4X3QgYXBwZW5kX2NoYXIpIHsKKyAgaWYgKG1fbkNvZGVzICsgbV9iRWFybHlDaGFuZ2UgPT0gNDA5NCkgeworICAgIHJldHVybjsKKyAgfQorICBtX0NvZGVBcnJheVttX25Db2RlcysrXSA9IChwcmVmaXhfY29kZSA8PCAxNikgfCBhcHBlbmRfY2hhcjsKKyAgaWYgKG1fbkNvZGVzICsgbV9iRWFybHlDaGFuZ2UgPT0gNTEyIC0gMjU4KSB7CisgICAgbV9Db2RlTGVuID0gMTA7CisgIH0gZWxzZSBpZiAobV9uQ29kZXMgKyBtX2JFYXJseUNoYW5nZSA9PSAxMDI0IC0gMjU4KSB7CisgICAgbV9Db2RlTGVuID0gMTE7CisgIH0gZWxzZSBpZiAobV9uQ29kZXMgKyBtX2JFYXJseUNoYW5nZSA9PSAyMDQ4IC0gMjU4KSB7CisgICAgbV9Db2RlTGVuID0gMTI7CisgIH0KK30KK3ZvaWQgQ1BERl9MendGaWx0ZXI6OkRlY29kZVN0cmluZyhGWF9EV09SRCBjb2RlKSB7CisgIHdoaWxlICgxKSB7CisgICAgaW50IGluZGV4ID0gY29kZSAtIDI1ODsKKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IChpbnQpbV9uQ29kZXMpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KKyAgICBGWF9EV09SRCBkYXRhID0gbV9Db2RlQXJyYXlbaW5kZXhdOwogICAgIGlmIChtX1N0YWNrTGVuID49IHNpemVvZihtX0RlY29kZVN0YWNrKSkgewotICAgICAgICByZXR1cm47CisgICAgICByZXR1cm47CiAgICAgfQotICAgIG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbisrXSA9ICh1aW50OF90KWNvZGU7CisgICAgbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuKytdID0gKHVpbnQ4X3QpZGF0YTsKKyAgICBjb2RlID0gZGF0YSA+PiAxNjsKKyAgfQorICBpZiAobV9TdGFja0xlbiA+PSBzaXplb2YobV9EZWNvZGVTdGFjaykpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuKytdID0gKHVpbnQ4X3QpY29kZTsKIH0KLUNQREZfUHJlZGljdG9yRmlsdGVyOjpDUERGX1ByZWRpY3RvckZpbHRlcihpbnQgcHJlZGljdG9yLCBpbnQgY29sb3JzLCBpbnQgYnBjLCBpbnQgY29scykKLXsKLSAgICBtX2JUaWZmID0gcHJlZGljdG9yIDwgMTA7Ci0gICAgbV9wUmVmTGluZSA9IE5VTEw7Ci0gICAgbV9wQ3VyTGluZSA9IE5VTEw7Ci0gICAgbV9pTGluZSA9IDA7Ci0gICAgbV9MaW5lSW5TaXplID0gMDsKLSAgICBtX0JwcCA9IChjb2xvcnMgKiBicGMgKyA3KSAvIDg7Ci0gICAgbV9QaXRjaCA9IChjb2xvcnMgKiBicGMgKiBjb2xzICsgNykgLyA4OworQ1BERl9QcmVkaWN0b3JGaWx0ZXI6OkNQREZfUHJlZGljdG9yRmlsdGVyKGludCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xzKSB7CisgIG1fYlRpZmYgPSBwcmVkaWN0b3IgPCAxMDsKKyAgbV9wUmVmTGluZSA9IE5VTEw7CisgIG1fcEN1ckxpbmUgPSBOVUxMOworICBtX2lMaW5lID0gMDsKKyAgbV9MaW5lSW5TaXplID0gMDsKKyAgbV9CcHAgPSAoY29sb3JzICogYnBjICsgNykgLyA4OworICBtX1BpdGNoID0gKGNvbG9ycyAqIGJwYyAqIGNvbHMgKyA3KSAvIDg7CisgIGlmICghbV9iVGlmZikgeworICAgIG1fUGl0Y2grKzsKKyAgfQorfQorQ1BERl9QcmVkaWN0b3JGaWx0ZXI6On5DUERGX1ByZWRpY3RvckZpbHRlcigpIHsKKyAgaWYgKG1fcEN1ckxpbmUpIHsKKyAgICBGWF9GcmVlKG1fcEN1ckxpbmUpOworICB9CisgIGlmIChtX3BSZWZMaW5lKSB7CisgICAgRlhfRnJlZShtX3BSZWZMaW5lKTsKKyAgfQorfQorc3RhdGljIHVpbnQ4X3QgUGFldGhQcmVkaWN0b3IoaW50IGEsIGludCBiLCBpbnQgYykgeworICBpbnQgcCA9IGEgKyBiIC0gYzsKKyAgaW50IHBhID0gRlhTWVNfYWJzKHAgLSBhKTsKKyAgaW50IHBiID0gRlhTWVNfYWJzKHAgLSBiKTsKKyAgaW50IHBjID0gRlhTWVNfYWJzKHAgLSBjKTsKKyAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKSB7CisgICAgcmV0dXJuICh1aW50OF90KWE7CisgIH0KKyAgaWYgKHBiIDw9IHBjKSB7CisgICAgcmV0dXJuICh1aW50OF90KWI7CisgIH0KKyAgcmV0dXJuICh1aW50OF90KWM7Cit9CitzdGF0aWMgdm9pZCBQTkdfUHJlZGljdG9yTGluZSh1aW50OF90KiBjdXJfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmVmX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHApIHsKKyAgdWludDhfdCB0YWcgPSBjdXJfYnVmWzBdOworICBpZiAodGFnID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgY3VyX2J1ZisrOworICBpZiAocmVmX2J1ZikgeworICAgIHJlZl9idWYrKzsKKyAgfQorICBmb3IgKGludCBieXRlID0gMDsgYnl0ZSA8IHBpdGNoOyBieXRlKyspIHsKKyAgICB1aW50OF90IHJhd19ieXRlID0gY3VyX2J1ZltieXRlXTsKKyAgICBzd2l0Y2ggKHRhZykgeworICAgICAgY2FzZSAxOiB7CisgICAgICAgIHVpbnQ4X3QgbGVmdCA9IDA7CisgICAgICAgIGlmIChieXRlID49IEJwcCkgeworICAgICAgICAgIGxlZnQgPSBjdXJfYnVmW2J5dGUgLSBCcHBdOworICAgICAgICB9CisgICAgICAgIGN1cl9idWZbYnl0ZV0gPSByYXdfYnl0ZSArIGxlZnQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAyOiB7CisgICAgICAgIHVpbnQ4X3QgdXAgPSAwOworICAgICAgICBpZiAocmVmX2J1ZikgeworICAgICAgICAgIHVwID0gcmVmX2J1ZltieXRlXTsKKyAgICAgICAgfQorICAgICAgICBjdXJfYnVmW2J5dGVdID0gcmF3X2J5dGUgKyB1cDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDM6IHsKKyAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKKyAgICAgICAgaWYgKGJ5dGUgPj0gQnBwKSB7CisgICAgICAgICAgbGVmdCA9IGN1cl9idWZbYnl0ZSAtIEJwcF07CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCB1cCA9IDA7CisgICAgICAgIGlmIChyZWZfYnVmKSB7CisgICAgICAgICAgdXAgPSByZWZfYnVmW2J5dGVdOworICAgICAgICB9CisgICAgICAgIGN1cl9idWZbYnl0ZV0gPSByYXdfYnl0ZSArICh1cCArIGxlZnQpIC8gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKKyAgICAgICAgaWYgKGJ5dGUgPj0gQnBwKSB7CisgICAgICAgICAgbGVmdCA9IGN1cl9idWZbYnl0ZSAtIEJwcF07CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCB1cCA9IDA7CisgICAgICAgIGlmIChyZWZfYnVmKSB7CisgICAgICAgICAgdXAgPSByZWZfYnVmW2J5dGVdOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgdXBwZXJfbGVmdCA9IDA7CisgICAgICAgIGlmIChieXRlID49IEJwcCAmJiByZWZfYnVmKSB7CisgICAgICAgICAgdXBwZXJfbGVmdCA9IHJlZl9idWZbYnl0ZSAtIEJwcF07CisgICAgICAgIH0KKyAgICAgICAgY3VyX2J1ZltieXRlXSA9IHJhd19ieXRlICsgUGFldGhQcmVkaWN0b3IobGVmdCwgdXAsIHVwcGVyX2xlZnQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KK3ZvaWQgQ1BERl9QcmVkaWN0b3JGaWx0ZXI6OnZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7CisgIGlmIChtX3BDdXJMaW5lID09IE5VTEwpIHsKKyAgICBtX3BDdXJMaW5lID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7CiAgICAgaWYgKCFtX2JUaWZmKSB7Ci0gICAgICAgIG1fUGl0Y2ggKys7CisgICAgICBtX3BSZWZMaW5lID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7CiAgICAgfQotfQotQ1BERl9QcmVkaWN0b3JGaWx0ZXI6On5DUERGX1ByZWRpY3RvckZpbHRlcigpCi17Ci0gICAgaWYgKG1fcEN1ckxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDdXJMaW5lKTsKKyAgfQorICB3aGlsZSAoMSkgeworICAgIEZYX0RXT1JEIHJlYWRfc2l6ZSA9IG1fUGl0Y2ggLSBtX0xpbmVJblNpemU7CisgICAgaWYgKHJlYWRfc2l6ZSA+IHNyY19zaXplKSB7CisgICAgICByZWFkX3NpemUgPSBzcmNfc2l6ZTsKICAgICB9Ci0gICAgaWYgKG1fcFJlZkxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BSZWZMaW5lKTsKKyAgICBGWFNZU19tZW1jcHkobV9wQ3VyTGluZSArIG1fTGluZUluU2l6ZSwgc3JjX2J1ZiwgcmVhZF9zaXplKTsKKyAgICBtX0xpbmVJblNpemUgKz0gcmVhZF9zaXplOworICAgIGlmIChtX0xpbmVJblNpemUgPCBtX1BpdGNoKSB7CisgICAgICBicmVhazsKICAgICB9Ci19Ci1zdGF0aWMgdWludDhfdCBQYWV0aFByZWRpY3RvcihpbnQgYSwgaW50IGIsIGludCBjKQotewotICAgIGludCBwID0gYSArIGIgLSBjOwotICAgIGludCBwYSA9IEZYU1lTX2FicyhwIC0gYSk7Ci0gICAgaW50IHBiID0gRlhTWVNfYWJzKHAgLSBiKTsKLSAgICBpbnQgcGMgPSBGWFNZU19hYnMocCAtIGMpOwotICAgIGlmIChwYSA8PSBwYiAmJiBwYSA8PSBwYykgewotICAgICAgICByZXR1cm4gKHVpbnQ4X3QpYTsKLSAgICB9Ci0gICAgaWYgKHBiIDw9IHBjKSB7Ci0gICAgICAgIHJldHVybiAodWludDhfdCliOwotICAgIH0KLSAgICByZXR1cm4gKHVpbnQ4X3QpYzsKLX0KLXN0YXRpYyB2b2lkIFBOR19QcmVkaWN0b3JMaW5lKHVpbnQ4X3QqIGN1cl9idWYsIHVpbnQ4X3QqIHJlZl9idWYsIGludCBwaXRjaCwgaW50IEJwcCkKLXsKLSAgICB1aW50OF90IHRhZyA9IGN1cl9idWZbMF07Ci0gICAgaWYgKHRhZyA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY3VyX2J1ZiArKzsKLSAgICBpZiAocmVmX2J1ZikgewotICAgICAgICByZWZfYnVmICsrOwotICAgIH0KLSAgICBmb3IgKGludCBieXRlID0gMDsgYnl0ZSA8IHBpdGNoOyBieXRlICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgcmF3X2J5dGUgPSBjdXJfYnVmW2J5dGVdOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgICAgY2FzZSAxOgl7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJwcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGN1cl9idWZbYnl0ZSAtIEJwcF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY3VyX2J1ZltieXRlXSA9IHJhd19ieXRlICsgbGVmdDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAyOiB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVmX2J1ZikgewotICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSByZWZfYnVmW2J5dGVdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGN1cl9idWZbYnl0ZV0gPSByYXdfYnl0ZSArIHVwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDM6IHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPj0gQnBwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gY3VyX2J1ZltieXRlIC0gQnBwXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1aW50OF90IHVwID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlZl9idWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gcmVmX2J1ZltieXRlXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjdXJfYnVmW2J5dGVdID0gcmF3X2J5dGUgKyAodXAgKyBsZWZ0KSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgNDogewotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSBCcHApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBjdXJfYnVmW2J5dGUgLSBCcHBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVmX2J1ZikgewotICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSByZWZfYnVmW2J5dGVdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBwZXJfbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJwcCAmJiByZWZfYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cHBlcl9sZWZ0ID0gcmVmX2J1ZltieXRlIC0gQnBwXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjdXJfYnVmW2J5dGVdID0gcmF3X2J5dGUgKyBQYWV0aFByZWRpY3RvcihsZWZ0LCB1cCwgdXBwZXJfbGVmdCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgQ1BERl9QcmVkaWN0b3JGaWx0ZXI6OnZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQotewotICAgIGlmIChtX3BDdXJMaW5lID09IE5VTEwpIHsKLSAgICAgICAgbV9wQ3VyTGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOwotICAgICAgICBpZiAoIW1fYlRpZmYpIHsKLSAgICAgICAgICAgIG1fcFJlZkxpbmUgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBGWF9EV09SRCByZWFkX3NpemUgPSBtX1BpdGNoIC0gbV9MaW5lSW5TaXplOwotICAgICAgICBpZiAocmVhZF9zaXplID4gc3JjX3NpemUpIHsKLSAgICAgICAgICAgIHJlYWRfc2l6ZSA9IHNyY19zaXplOwotICAgICAgICB9Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BDdXJMaW5lICsgbV9MaW5lSW5TaXplLCBzcmNfYnVmLCByZWFkX3NpemUpOwotICAgICAgICBtX0xpbmVJblNpemUgKz0gcmVhZF9zaXplOwotICAgICAgICBpZiAobV9MaW5lSW5TaXplIDwgbV9QaXRjaCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3JjX2J1ZiArPSByZWFkX3NpemU7Ci0gICAgICAgIHNyY19zaXplIC09IHJlYWRfc2l6ZTsKLSAgICAgICAgaWYgKG1fYlRpZmYpIHsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgYnl0ZSA9IG1fQnBwOyBieXRlIDwgbV9QaXRjaDsgYnl0ZSArKykgewotICAgICAgICAgICAgICAgIG1fcEN1ckxpbmVbYnl0ZV0gKz0gbV9wQ3VyTGluZVtieXRlIC0gbV9CcHBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2sobV9wQ3VyTGluZSwgbV9QaXRjaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQTkdfUHJlZGljdG9yTGluZShtX3BDdXJMaW5lLCBtX2lMaW5lID8gbV9wUmVmTGluZSA6IE5VTEwsIG1fUGl0Y2ggLSAxLCBtX0JwcCk7Ci0gICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhtX3BDdXJMaW5lICsgMSwgbV9QaXRjaCAtIDEpOwotICAgICAgICAgICAgbV9pTGluZSArKzsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHRlbXAgPSBtX3BDdXJMaW5lOwotICAgICAgICAgICAgbV9wQ3VyTGluZSA9IG1fcFJlZkxpbmU7Ci0gICAgICAgICAgICBtX3BSZWZMaW5lID0gdGVtcDsKLSAgICAgICAgfQotICAgICAgICBtX0xpbmVJblNpemUgPSAwOwotICAgIH0KLX0KLUNQREZfQXNjaWk4NUZpbHRlcjo6Q1BERl9Bc2NpaTg1RmlsdGVyKCkKLXsKLSAgICBtX1N0YXRlID0gMDsKLSAgICBtX0NoYXJDb3VudCA9IDA7Ci19Ci12b2lkIENQREZfQXNjaWk4NUZpbHRlcjo6dl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCi17Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHNyY19zaXplOyBpICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgYnl0ZSA9IHNyY19idWZbaV07Ci0gICAgICAgIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKG1fU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSAnIScgJiYgYnl0ZSA8PSAndScpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGRpZ2l0ID0gYnl0ZSAtICchJzsKLSAgICAgICAgICAgICAgICAgICAgbV9DdXJEV29yZCA9IGRpZ2l0OwotICAgICAgICAgICAgICAgICAgICBtX0NoYXJDb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIG1fU3RhdGUgPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAneicpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHplcm8gPSAwOwotICAgICAgICAgICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jaygmemVybywgNCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICd+JykgewotICAgICAgICAgICAgICAgICAgICBtX1N0YXRlID0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPj0gJyEnICYmIGJ5dGUgPD0gJ3UnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlnaXQgPSBieXRlIC0gJyEnOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJEV29yZCA9IG1fQ3VyRFdvcmQgKiA4NSArIGRpZ2l0OwotICAgICAgICAgICAgICAgICAgICAgICAgbV9DaGFyQ291bnQgKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9DaGFyQ291bnQgPT0gNSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCeXRlKCh1aW50OF90KShtX0N1ckRXb3JkID4+ICgzIC0gaSkgKiA4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3RhdGUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJ34nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9DaGFyQ291bnQgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gbV9DaGFyQ291bnQ7IGkgPCA1OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyRFdvcmQgPSBtX0N1ckRXb3JkICogODUgKyA4NDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fQ2hhckNvdW50IC0gMTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCeXRlKCh1aW50OF90KShtX0N1ckRXb3JkID4+ICgzIC0gaSkgKiA4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbV9TdGF0ZSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGlmIChieXRlID09ICc+JykgewotICAgICAgICAgICAgICAgICAgICBSZXBvcnRFT0Yoc3JjX3NpemUgLSBpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUERGX0FzY2lpSGV4RmlsdGVyOjpDUERGX0FzY2lpSGV4RmlsdGVyKCkKLXsKLSAgICBtX1N0YXRlID0gMDsKLX0KLXZvaWQgQ1BERl9Bc2NpaUhleEZpbHRlcjo6dl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCi17Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHNyY19zaXplOyBpICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgYnl0ZSA9IHNyY19idWZbaV07Ci0gICAgICAgIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZGlnaXQ7Ci0gICAgICAgIGlmIChieXRlID49ICcwJyAmJiBieXRlIDw9ICc5JykgewotICAgICAgICAgICAgZGlnaXQgPSBieXRlIC0gJzAnOwotICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPj0gJ2EnICYmIGJ5dGUgPD0gJ2YnKSB7Ci0gICAgICAgICAgICBkaWdpdCA9IGJ5dGUgLSAnYScgKyAxMDsKLSAgICAgICAgfSBlbHNlIGlmIChieXRlID49ICdBJyAmJiBieXRlIDw9ICdGJykgewotICAgICAgICAgICAgZGlnaXQgPSBieXRlIC0gJ0EnICsgMTA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9TdGF0ZSkgewotICAgICAgICAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJ5dGUobV9GaXJzdERpZ2l0ICogMTYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUmVwb3J0RU9GKHNyY19zaXplIC0gaSAtIDEpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX1N0YXRlID09IDApIHsKLSAgICAgICAgICAgIG1fRmlyc3REaWdpdCA9IGRpZ2l0OwotICAgICAgICAgICAgbV9TdGF0ZSArKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJ5dGUobV9GaXJzdERpZ2l0ICogMTYgKyBkaWdpdCk7Ci0gICAgICAgICAgICBtX1N0YXRlIC0tOwotICAgICAgICB9Ci0gICAgfQotfQotQ1BERl9SdW5MZW5GaWx0ZXI6OkNQREZfUnVuTGVuRmlsdGVyKCkKLXsKLSAgICBtX1N0YXRlID0gMDsKLSAgICBtX0NvdW50ID0gMDsKLX0KLXZvaWQgQ1BERl9SdW5MZW5GaWx0ZXI6OnZfRmlsdGVySW4oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQotewotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSArKykgewotICAgICAgICB1aW50OF90IGJ5dGUgPSBzcmNfYnVmW2ldOwotICAgICAgICBzd2l0Y2ggKG1fU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBpZiAoYnl0ZSA8IDEyOCkgewotICAgICAgICAgICAgICAgICAgICBtX1N0YXRlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgbV9Db3VudCA9IGJ5dGUgKyAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAxMjgpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVwb3J0RU9GKHNyY19zaXplIC0gaSAtIDEpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9TdGF0ZSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIG1fQ291bnQgPSAyNTcgLSBieXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCeXRlKGJ5dGUpOwotICAgICAgICAgICAgICAgIG1fQ291bnQgLS07Ci0gICAgICAgICAgICAgICAgaWYgKG1fQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtX1N0YXRlID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6CXsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soTlVMTCwgbV9Db3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X2J1Zi5HZXRCdWZmZXIoKSArIGRlc3RfYnVmLkdldFNpemUoKSAtIG1fQ291bnQsIGJ5dGUsIG1fQ291bnQpOwotICAgICAgICAgICAgICAgICAgICBtX1N0YXRlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotQ1BERl9KcGVnRmlsdGVyOjpDUERGX0pwZWdGaWx0ZXIoKQotewotICAgIG1fcENvbnRleHQgPSBOVUxMOwotICAgIG1fYkdvdEhlYWRlciA9IEZBTFNFOwotICAgIG1fcFNjYW5saW5lID0gTlVMTDsKLSAgICBtX2lMaW5lID0gMDsKLX0KLUNQREZfSnBlZ0ZpbHRlcjo6fkNQREZfSnBlZ0ZpbHRlcigpCi17Ci0gICAgaWYgKG1fcFNjYW5saW5lKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wU2NhbmxpbmUpOwotICAgIH0KLSAgICBpZiAobV9wQ29udGV4dCkgewotICAgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+RmluaXNoKG1fcENvbnRleHQpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9KcGVnRmlsdGVyOjp2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBpZiAobV9wQ29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcENvbnRleHQgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+U3RhcnQoKTsKLSAgICB9Ci0gICAgY29uc3QgdWludDhfdCoganBlZ19zcmNfYnVmOwotICAgIEZYX0RXT1JEIGpwZWdfc3JjX3NpemU7Ci0gICAgQ0ZYX0JpbmFyeUJ1ZiB0ZW1wX2J1ZjsKLSAgICBpZiAobV9JbnB1dEJ1Zi5HZXRTaXplKCkpIHsKLSAgICAgICAgdGVtcF9idWYuRXN0aW1hdGVTaXplKG1fSW5wdXRCdWYuR2V0U2l6ZSgpICsgc3JjX3NpemUpOwotICAgICAgICB0ZW1wX2J1Zi5BcHBlbmRCbG9jayhtX0lucHV0QnVmLkdldEJ1ZmZlcigpLCBtX0lucHV0QnVmLkdldFNpemUoKSk7Ci0gICAgICAgIG1fSW5wdXRCdWYuQ2xlYXIoKTsKLSAgICAgICAgdGVtcF9idWYuQXBwZW5kQmxvY2soc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgICAgICBqcGVnX3NyY19idWYgPSB0ZW1wX2J1Zi5HZXRCdWZmZXIoKTsKLSAgICAgICAganBlZ19zcmNfc2l6ZSA9IHRlbXBfYnVmLkdldFNpemUoKTsKKyAgICBzcmNfYnVmICs9IHJlYWRfc2l6ZTsKKyAgICBzcmNfc2l6ZSAtPSByZWFkX3NpemU7CisgICAgaWYgKG1fYlRpZmYpIHsKKyAgICAgIGZvciAoRlhfRFdPUkQgYnl0ZSA9IG1fQnBwOyBieXRlIDwgbV9QaXRjaDsgYnl0ZSsrKSB7CisgICAgICAgIG1fcEN1ckxpbmVbYnl0ZV0gKz0gbV9wQ3VyTGluZVtieXRlIC0gbV9CcHBdOworICAgICAgfQorICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2sobV9wQ3VyTGluZSwgbV9QaXRjaCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAganBlZ19zcmNfYnVmID0gc3JjX2J1ZjsKLSAgICAgICAganBlZ19zcmNfc2l6ZSA9IHNyY19zaXplOworICAgICAgUE5HX1ByZWRpY3RvckxpbmUobV9wQ3VyTGluZSwgbV9pTGluZSA/IG1fcFJlZkxpbmUgOiBOVUxMLCBtX1BpdGNoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQnBwKTsKKyAgICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKG1fcEN1ckxpbmUgKyAxLCBtX1BpdGNoIC0gMSk7CisgICAgICBtX2lMaW5lKys7CisgICAgICB1aW50OF90KiB0ZW1wID0gbV9wQ3VyTGluZTsKKyAgICAgIG1fcEN1ckxpbmUgPSBtX3BSZWZMaW5lOworICAgICAgbV9wUmVmTGluZSA9IHRlbXA7CiAgICAgfQotICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5JbnB1dChtX3BDb250ZXh0LCBqcGVnX3NyY19idWYsIGpwZWdfc3JjX3NpemUpOwotICAgIGlmICghbV9iR290SGVhZGVyKSB7Ci0gICAgICAgIGludCByZXQgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+UmVhZEhlYWRlcihtX3BDb250ZXh0LCAmbV9XaWR0aCwgJm1fSGVpZ2h0LCAmbV9uQ29tcHMpOwotICAgICAgICBpbnQgbGVmdF9zaXplID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPkdldEF2YWlsSW5wdXQobV9wQ29udGV4dCk7Ci0gICAgICAgIGlmIChyZXQgPT0gMSkgewotICAgICAgICAgICAgUmVwb3J0RU9GKGxlZnRfc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgICAgICBtX0lucHV0QnVmLkFwcGVuZEJsb2NrKGpwZWdfc3JjX2J1ZiArIGpwZWdfc3JjX3NpemUgLSBsZWZ0X3NpemUsIGxlZnRfc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPlN0YXJ0U2NhbmxpbmUobV9wQ29udGV4dCwgMSk7Ci0gICAgICAgIG1fYkdvdEhlYWRlciA9IFRSVUU7Ci0gICAgICAgIG1fUGl0Y2ggPSBtX1dpZHRoICogbV9uQ29tcHM7Ci0gICAgfQotICAgIGlmIChtX3BTY2FubGluZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcFNjYW5saW5lID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCArIDQpOwotICAgIH0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoIUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5SZWFkU2NhbmxpbmUobV9wQ29udGV4dCwgbV9wU2NhbmxpbmUpKSB7Ci0gICAgICAgICAgICBpbnQgbGVmdF9zaXplID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPkdldEF2YWlsSW5wdXQobV9wQ29udGV4dCk7Ci0gICAgICAgICAgICBtX0lucHV0QnVmLkFwcGVuZEJsb2NrKGpwZWdfc3JjX2J1ZiArIGpwZWdfc3JjX3NpemUgLSBsZWZ0X3NpemUsIGxlZnRfc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhtX3BTY2FubGluZSwgbV9QaXRjaCk7Ci0gICAgICAgIG1faUxpbmUgKys7Ci0gICAgICAgIGlmIChtX2lMaW5lID09IG1fSGVpZ2h0KSB7Ci0gICAgICAgICAgICBSZXBvcnRFT0YoQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPkdldEF2YWlsSW5wdXQobV9wQ29udGV4dCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQorICAgIG1fTGluZUluU2l6ZSA9IDA7CisgIH0KIH0KLUNQREZfRmF4RmlsdGVyOjpDUERGX0ZheEZpbHRlcigpCi17Ci0gICAgbV9FbmNvZGluZyA9IDA7Ci0gICAgbV9iRW5kT2ZMaW5lID0gRkFMU0U7Ci0gICAgbV9iQnl0ZUFsaWduID0gRkFMU0U7Ci0gICAgbV9iQmxhY2sgPSBGQUxTRTsKLSAgICBtX25Sb3dzID0gMDsKLSAgICBtX25Db2x1bW5zID0gMDsKLSAgICBtX1BpdGNoID0gMDsKLSAgICBtX3BTY2FubGluZUJ1ZiA9IE5VTEw7Ci0gICAgbV9wUmVmQnVmID0gTlVMTDsKLSAgICBtX2lSb3cgPSAwOwotICAgIG1fSW5wdXRCaXRQb3MgPSAwOworQ1BERl9Bc2NpaTg1RmlsdGVyOjpDUERGX0FzY2lpODVGaWx0ZXIoKSB7CisgIG1fU3RhdGUgPSAwOworICBtX0NoYXJDb3VudCA9IDA7CiB9Ci1DUERGX0ZheEZpbHRlcjo6fkNQREZfRmF4RmlsdGVyKCkKLXsKLSAgICBpZiAobV9wU2NhbmxpbmVCdWYpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTY2FubGluZUJ1Zik7Cit2b2lkIENQREZfQXNjaWk4NUZpbHRlcjo6dl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgeworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgc3JjX3NpemU7IGkrKykgeworICAgIHVpbnQ4X3QgYnl0ZSA9IHNyY19idWZbaV07CisgICAgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAobV9wUmVmQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wUmVmQnVmKTsKKyAgICBzd2l0Y2ggKG1fU3RhdGUpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKGJ5dGUgPj0gJyEnICYmIGJ5dGUgPD0gJ3UnKSB7CisgICAgICAgICAgaW50IGRpZ2l0ID0gYnl0ZSAtICchJzsKKyAgICAgICAgICBtX0N1ckRXb3JkID0gZGlnaXQ7CisgICAgICAgICAgbV9DaGFyQ291bnQgPSAxOworICAgICAgICAgIG1fU3RhdGUgPSAxOworICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJ3onKSB7CisgICAgICAgICAgaW50IHplcm8gPSAwOworICAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKCZ6ZXJvLCA0KTsKKyAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICd+JykgeworICAgICAgICAgIG1fU3RhdGUgPSAyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmIChieXRlID49ICchJyAmJiBieXRlIDw9ICd1JykgeworICAgICAgICAgIGludCBkaWdpdCA9IGJ5dGUgLSAnISc7CisgICAgICAgICAgbV9DdXJEV29yZCA9IG1fQ3VyRFdvcmQgKiA4NSArIGRpZ2l0OworICAgICAgICAgIG1fQ2hhckNvdW50Kys7CisgICAgICAgICAgaWYgKG1fQ2hhckNvdW50ID09IDUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJ5dGUoKHVpbnQ4X3QpKG1fQ3VyRFdvcmQgPj4gKDMgLSBpKSAqIDgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fU3RhdGUgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICd+JykgeworICAgICAgICAgIGlmIChtX0NoYXJDb3VudCA+IDEpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gbV9DaGFyQ291bnQ7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgICAgbV9DdXJEV29yZCA9IG1fQ3VyRFdvcmQgKiA4NSArIDg0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fQ2hhckNvdW50IC0gMTsgaSsrKSB7CisgICAgICAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJ5dGUoKHVpbnQ4X3QpKG1fQ3VyRFdvcmQgPj4gKDMgLSBpKSAqIDgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgbV9TdGF0ZSA9IDI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChieXRlID09ICc+JykgeworICAgICAgICAgIFJlcG9ydEVPRihzcmNfc2l6ZSAtIGkgLSAxKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgfQorICB9CiB9Ci1GWF9CT09MIENQREZfRmF4RmlsdGVyOjpJbml0aWFsaXplKGludCBFbmNvZGluZywgaW50IGJFbmRPZkxpbmUsIGludCBiQnl0ZUFsaWduLCBpbnQgYkJsYWNrLCBpbnQgblJvd3MsIGludCBuQ29sdW1ucykKLXsKLSAgICBtX0VuY29kaW5nID0gRW5jb2Rpbmc7Ci0gICAgbV9iRW5kT2ZMaW5lID0gYkVuZE9mTGluZTsKLSAgICBtX2JCeXRlQWxpZ24gPSBiQnl0ZUFsaWduOwotICAgIG1fYkJsYWNrID0gYkJsYWNrOwotICAgIG1fblJvd3MgPSBuUm93czsKLSAgICBtX25Db2x1bW5zID0gbkNvbHVtbnM7Ci0gICAgbV9QaXRjaCA9IChtX25Db2x1bW5zICsgNykgLyA4OwotICAgIG1fcFNjYW5saW5lQnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7Ci0gICAgbV9wUmVmQnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7Ci0gICAgRlhTWVNfbWVtc2V0KG1fcFNjYW5saW5lQnVmLCAweGZmLCBtX1BpdGNoKTsKLSAgICBGWFNZU19tZW1zZXQobV9wUmVmQnVmLCAweGZmLCBtX1BpdGNoKTsKLSAgICBtX2lSb3cgPSAwOwotICAgIG1fSW5wdXRCaXRQb3MgPSAwOwotICAgIHJldHVybiBUUlVFOworQ1BERl9Bc2NpaUhleEZpbHRlcjo6Q1BERl9Bc2NpaUhleEZpbHRlcigpIHsKKyAgbV9TdGF0ZSA9IDA7CiB9Ci12b2lkIENQREZfRmF4RmlsdGVyOjp2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBjb25zdCB1aW50OF90KiBmYXhfc3JjX2J1ZjsKLSAgICBGWF9EV09SRCBmYXhfc3JjX3NpemU7Ci0gICAgQ0ZYX0JpbmFyeUJ1ZiB0ZW1wX2J1ZjsKLSAgICBpbnQgYml0cG9zOwotICAgIGlmIChtX0lucHV0QnVmLkdldFNpemUoKSkgewotICAgICAgICB0ZW1wX2J1Zi5Fc3RpbWF0ZVNpemUobV9JbnB1dEJ1Zi5HZXRTaXplKCkgKyBzcmNfc2l6ZSk7Ci0gICAgICAgIHRlbXBfYnVmLkFwcGVuZEJsb2NrKG1fSW5wdXRCdWYuR2V0QnVmZmVyKCksIG1fSW5wdXRCdWYuR2V0U2l6ZSgpKTsKLSAgICAgICAgbV9JbnB1dEJ1Zi5DbGVhcigpOwotICAgICAgICB0ZW1wX2J1Zi5BcHBlbmRCbG9jayhzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgICAgIGZheF9zcmNfYnVmID0gdGVtcF9idWYuR2V0QnVmZmVyKCk7Ci0gICAgICAgIGZheF9zcmNfc2l6ZSA9IHRlbXBfYnVmLkdldFNpemUoKTsKLSAgICAgICAgYml0cG9zID0gbV9JbnB1dEJpdFBvczsKK3ZvaWQgQ1BERl9Bc2NpaUhleEZpbHRlcjo6dl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSsrKSB7CisgICAgdWludDhfdCBieXRlID0gc3JjX2J1ZltpXTsKKyAgICBpZiAoUERGX0NoYXJUeXBlW2J5dGVdID09ICdXJykgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBkaWdpdDsKKyAgICBpZiAoYnl0ZSA+PSAnMCcgJiYgYnl0ZSA8PSAnOScpIHsKKyAgICAgIGRpZ2l0ID0gYnl0ZSAtICcwJzsKKyAgICB9IGVsc2UgaWYgKGJ5dGUgPj0gJ2EnICYmIGJ5dGUgPD0gJ2YnKSB7CisgICAgICBkaWdpdCA9IGJ5dGUgLSAnYScgKyAxMDsKKyAgICB9IGVsc2UgaWYgKGJ5dGUgPj0gJ0EnICYmIGJ5dGUgPD0gJ0YnKSB7CisgICAgICBkaWdpdCA9IGJ5dGUgLSAnQScgKyAxMDsKICAgICB9IGVsc2UgewotICAgICAgICBmYXhfc3JjX2J1ZiA9IHNyY19idWY7Ci0gICAgICAgIGZheF9zcmNfc2l6ZSA9IHNyY19zaXplOwotICAgICAgICBiaXRwb3MgPSAwOworICAgICAgaWYgKG1fU3RhdGUpIHsKKyAgICAgICAgZGVzdF9idWYuQXBwZW5kQnl0ZShtX0ZpcnN0RGlnaXQgKiAxNik7CisgICAgICB9CisgICAgICBSZXBvcnRFT0Yoc3JjX3NpemUgLSBpIC0gMSk7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIFByb2Nlc3NEYXRhKGZheF9zcmNfYnVmLCBmYXhfc3JjX3NpemUsIGJpdHBvcywgRkFMU0UsIGRlc3RfYnVmKTsKLSAgICBpbnQgbGVmdF9iaXRzID0gZmF4X3NyY19zaXplICogOCAtIGJpdHBvczsKLSAgICBtX0lucHV0QnVmLkFwcGVuZEJsb2NrKGZheF9zcmNfYnVmICsgYml0cG9zIC8gOCwgKGxlZnRfYml0cyArIDcpIC8gOCk7Ci0gICAgbV9JbnB1dEJpdFBvcyA9IGJpdHBvcyAlIDg7CisgICAgaWYgKG1fU3RhdGUgPT0gMCkgeworICAgICAgbV9GaXJzdERpZ2l0ID0gZGlnaXQ7CisgICAgICBtX1N0YXRlKys7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3RfYnVmLkFwcGVuZEJ5dGUobV9GaXJzdERpZ2l0ICogMTYgKyBkaWdpdCk7CisgICAgICBtX1N0YXRlLS07CisgICAgfQorICB9CiB9Ci12b2lkIENQREZfRmF4RmlsdGVyOjp2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBQcm9jZXNzRGF0YShtX0lucHV0QnVmLkdldEJ1ZmZlcigpLCBtX0lucHV0QnVmLkdldFNpemUoKSwgbV9JbnB1dEJpdFBvcywgVFJVRSwgZGVzdF9idWYpOworQ1BERl9SdW5MZW5GaWx0ZXI6OkNQREZfUnVuTGVuRmlsdGVyKCkgeworICBtX1N0YXRlID0gMDsKKyAgbV9Db3VudCA9IDA7Cit9Cit2b2lkIENQREZfUnVuTGVuRmlsdGVyOjp2X0ZpbHRlckluKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgeworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgc3JjX3NpemU7IGkrKykgeworICAgIHVpbnQ4X3QgYnl0ZSA9IHNyY19idWZbaV07CisgICAgc3dpdGNoIChtX1N0YXRlKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGlmIChieXRlIDwgMTI4KSB7CisgICAgICAgICAgbV9TdGF0ZSA9IDE7CisgICAgICAgICAgbV9Db3VudCA9IGJ5dGUgKyAxOworICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gMTI4KSB7CisgICAgICAgICAgUmVwb3J0RU9GKHNyY19zaXplIC0gaSAtIDEpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX1N0YXRlID0gMjsKKyAgICAgICAgICBtX0NvdW50ID0gMjU3IC0gYnl0ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgZGVzdF9idWYuQXBwZW5kQnl0ZShieXRlKTsKKyAgICAgICAgbV9Db3VudC0tOworICAgICAgICBpZiAobV9Db3VudCA9PSAwKSB7CisgICAgICAgICAgbV9TdGF0ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soTlVMTCwgbV9Db3VudCk7CisgICAgICAgIEZYU1lTX21lbXNldChkZXN0X2J1Zi5HZXRCdWZmZXIoKSArIGRlc3RfYnVmLkdldFNpemUoKSAtIG1fQ291bnQsIGJ5dGUsCisgICAgICAgICAgICAgICAgICAgICBtX0NvdW50KTsKKyAgICAgICAgbV9TdGF0ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorQ1BERl9KcGVnRmlsdGVyOjpDUERGX0pwZWdGaWx0ZXIoKSB7CisgIG1fcENvbnRleHQgPSBOVUxMOworICBtX2JHb3RIZWFkZXIgPSBGQUxTRTsKKyAgbV9wU2NhbmxpbmUgPSBOVUxMOworICBtX2lMaW5lID0gMDsKK30KK0NQREZfSnBlZ0ZpbHRlcjo6fkNQREZfSnBlZ0ZpbHRlcigpIHsKKyAgaWYgKG1fcFNjYW5saW5lKSB7CisgICAgRlhfRnJlZShtX3BTY2FubGluZSk7CisgIH0KKyAgaWYgKG1fcENvbnRleHQpIHsKKyAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+RmluaXNoKG1fcENvbnRleHQpOworICB9Cit9Cit2b2lkIENQREZfSnBlZ0ZpbHRlcjo6dl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgeworICBpZiAobV9wQ29udGV4dCA9PSBOVUxMKSB7CisgICAgbV9wQ29udGV4dCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5TdGFydCgpOworICB9CisgIGNvbnN0IHVpbnQ4X3QqIGpwZWdfc3JjX2J1ZjsKKyAgRlhfRFdPUkQganBlZ19zcmNfc2l6ZTsKKyAgQ0ZYX0JpbmFyeUJ1ZiB0ZW1wX2J1ZjsKKyAgaWYgKG1fSW5wdXRCdWYuR2V0U2l6ZSgpKSB7CisgICAgdGVtcF9idWYuRXN0aW1hdGVTaXplKG1fSW5wdXRCdWYuR2V0U2l6ZSgpICsgc3JjX3NpemUpOworICAgIHRlbXBfYnVmLkFwcGVuZEJsb2NrKG1fSW5wdXRCdWYuR2V0QnVmZmVyKCksIG1fSW5wdXRCdWYuR2V0U2l6ZSgpKTsKKyAgICBtX0lucHV0QnVmLkNsZWFyKCk7CisgICAgdGVtcF9idWYuQXBwZW5kQmxvY2soc3JjX2J1Ziwgc3JjX3NpemUpOworICAgIGpwZWdfc3JjX2J1ZiA9IHRlbXBfYnVmLkdldEJ1ZmZlcigpOworICAgIGpwZWdfc3JjX3NpemUgPSB0ZW1wX2J1Zi5HZXRTaXplKCk7CisgIH0gZWxzZSB7CisgICAganBlZ19zcmNfYnVmID0gc3JjX2J1ZjsKKyAgICBqcGVnX3NyY19zaXplID0gc3JjX3NpemU7CisgIH0KKyAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPklucHV0KG1fcENvbnRleHQsIGpwZWdfc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfc3JjX3NpemUpOworICBpZiAoIW1fYkdvdEhlYWRlcikgeworICAgIGludCByZXQgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+UmVhZEhlYWRlcigKKyAgICAgICAgbV9wQ29udGV4dCwgJm1fV2lkdGgsICZtX0hlaWdodCwgJm1fbkNvbXBzKTsKKyAgICBpbnQgbGVmdF9zaXplID0KKyAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPkdldEF2YWlsSW5wdXQobV9wQ29udGV4dCk7CisgICAgaWYgKHJldCA9PSAxKSB7CisgICAgICBSZXBvcnRFT0YobGVmdF9zaXplKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHJldCA9PSAyKSB7CisgICAgICBtX0lucHV0QnVmLkFwcGVuZEJsb2NrKGpwZWdfc3JjX2J1ZiArIGpwZWdfc3JjX3NpemUgLSBsZWZ0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfc2l6ZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5TdGFydFNjYW5saW5lKG1fcENvbnRleHQsIDEpOworICAgIG1fYkdvdEhlYWRlciA9IFRSVUU7CisgICAgbV9QaXRjaCA9IG1fV2lkdGggKiBtX25Db21wczsKKyAgfQorICBpZiAobV9wU2NhbmxpbmUgPT0gTlVMTCkgeworICAgIG1fcFNjYW5saW5lID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCArIDQpOworICB9CisgIHdoaWxlICgxKSB7CisgICAgaWYgKCFDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+UmVhZFNjYW5saW5lKG1fcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFNjYW5saW5lKSkgeworICAgICAgaW50IGxlZnRfc2l6ZSA9CisgICAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPkdldEF2YWlsSW5wdXQobV9wQ29udGV4dCk7CisgICAgICBtX0lucHV0QnVmLkFwcGVuZEJsb2NrKGpwZWdfc3JjX2J1ZiArIGpwZWdfc3JjX3NpemUgLSBsZWZ0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVzdF9idWYuQXBwZW5kQmxvY2sobV9wU2NhbmxpbmUsIG1fUGl0Y2gpOworICAgIG1faUxpbmUrKzsKKyAgICBpZiAobV9pTGluZSA9PSBtX0hlaWdodCkgeworICAgICAgUmVwb3J0RU9GKAorICAgICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5HZXRBdmFpbElucHV0KG1fcENvbnRleHQpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KK0NQREZfRmF4RmlsdGVyOjpDUERGX0ZheEZpbHRlcigpIHsKKyAgbV9FbmNvZGluZyA9IDA7CisgIG1fYkVuZE9mTGluZSA9IEZBTFNFOworICBtX2JCeXRlQWxpZ24gPSBGQUxTRTsKKyAgbV9iQmxhY2sgPSBGQUxTRTsKKyAgbV9uUm93cyA9IDA7CisgIG1fbkNvbHVtbnMgPSAwOworICBtX1BpdGNoID0gMDsKKyAgbV9wU2NhbmxpbmVCdWYgPSBOVUxMOworICBtX3BSZWZCdWYgPSBOVUxMOworICBtX2lSb3cgPSAwOworICBtX0lucHV0Qml0UG9zID0gMDsKK30KK0NQREZfRmF4RmlsdGVyOjp+Q1BERl9GYXhGaWx0ZXIoKSB7CisgIGlmIChtX3BTY2FubGluZUJ1ZikgeworICAgIEZYX0ZyZWUobV9wU2NhbmxpbmVCdWYpOworICB9CisgIGlmIChtX3BSZWZCdWYpIHsKKyAgICBGWF9GcmVlKG1fcFJlZkJ1Zik7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9GYXhGaWx0ZXI6OkluaXRpYWxpemUoaW50IEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYkVuZE9mTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJCeXRlQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiQmxhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db2x1bW5zKSB7CisgIG1fRW5jb2RpbmcgPSBFbmNvZGluZzsKKyAgbV9iRW5kT2ZMaW5lID0gYkVuZE9mTGluZTsKKyAgbV9iQnl0ZUFsaWduID0gYkJ5dGVBbGlnbjsKKyAgbV9iQmxhY2sgPSBiQmxhY2s7CisgIG1fblJvd3MgPSBuUm93czsKKyAgbV9uQ29sdW1ucyA9IG5Db2x1bW5zOworICBtX1BpdGNoID0gKG1fbkNvbHVtbnMgKyA3KSAvIDg7CisgIG1fcFNjYW5saW5lQnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7CisgIG1fcFJlZkJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOworICBGWFNZU19tZW1zZXQobV9wU2NhbmxpbmVCdWYsIDB4ZmYsIG1fUGl0Y2gpOworICBGWFNZU19tZW1zZXQobV9wUmVmQnVmLCAweGZmLCBtX1BpdGNoKTsKKyAgbV9pUm93ID0gMDsKKyAgbV9JbnB1dEJpdFBvcyA9IDA7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX0ZheEZpbHRlcjo6dl9GaWx0ZXJJbihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpIHsKKyAgY29uc3QgdWludDhfdCogZmF4X3NyY19idWY7CisgIEZYX0RXT1JEIGZheF9zcmNfc2l6ZTsKKyAgQ0ZYX0JpbmFyeUJ1ZiB0ZW1wX2J1ZjsKKyAgaW50IGJpdHBvczsKKyAgaWYgKG1fSW5wdXRCdWYuR2V0U2l6ZSgpKSB7CisgICAgdGVtcF9idWYuRXN0aW1hdGVTaXplKG1fSW5wdXRCdWYuR2V0U2l6ZSgpICsgc3JjX3NpemUpOworICAgIHRlbXBfYnVmLkFwcGVuZEJsb2NrKG1fSW5wdXRCdWYuR2V0QnVmZmVyKCksIG1fSW5wdXRCdWYuR2V0U2l6ZSgpKTsKKyAgICBtX0lucHV0QnVmLkNsZWFyKCk7CisgICAgdGVtcF9idWYuQXBwZW5kQmxvY2soc3JjX2J1Ziwgc3JjX3NpemUpOworICAgIGZheF9zcmNfYnVmID0gdGVtcF9idWYuR2V0QnVmZmVyKCk7CisgICAgZmF4X3NyY19zaXplID0gdGVtcF9idWYuR2V0U2l6ZSgpOworICAgIGJpdHBvcyA9IG1fSW5wdXRCaXRQb3M7CisgIH0gZWxzZSB7CisgICAgZmF4X3NyY19idWYgPSBzcmNfYnVmOworICAgIGZheF9zcmNfc2l6ZSA9IHNyY19zaXplOworICAgIGJpdHBvcyA9IDA7CisgIH0KKyAgUHJvY2Vzc0RhdGEoZmF4X3NyY19idWYsIGZheF9zcmNfc2l6ZSwgYml0cG9zLCBGQUxTRSwgZGVzdF9idWYpOworICBpbnQgbGVmdF9iaXRzID0gZmF4X3NyY19zaXplICogOCAtIGJpdHBvczsKKyAgbV9JbnB1dEJ1Zi5BcHBlbmRCbG9jayhmYXhfc3JjX2J1ZiArIGJpdHBvcyAvIDgsIChsZWZ0X2JpdHMgKyA3KSAvIDgpOworICBtX0lucHV0Qml0UG9zID0gYml0cG9zICUgODsKK30KK3ZvaWQgQ1BERl9GYXhGaWx0ZXI6OnZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7CisgIFByb2Nlc3NEYXRhKG1fSW5wdXRCdWYuR2V0QnVmZmVyKCksIG1fSW5wdXRCdWYuR2V0U2l6ZSgpLCBtX0lucHV0Qml0UG9zLCBUUlVFLAorICAgICAgICAgICAgICBkZXN0X2J1Zik7CiB9CiBGWF9CT09MIF9GYXhTa2lwRU9MKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcyk7Ci1GWF9CT09MIF9GYXhHNEdldFJvdyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MsIHVpbnQ4X3QqIGRlc3RfYnVmLCBjb25zdCB1aW50OF90KiByZWZfYnVmLCBpbnQgY29sdW1ucyk7Ci1GWF9CT09MIF9GYXhHZXQxRExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGNvbHVtbnMpOwotdm9pZCBDUERGX0ZheEZpbHRlcjo6UHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgYml0cG9zLCBGWF9CT09MIGJGaW5pc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBpbnQgYml0c2l6ZSA9IHNyY19zaXplICogODsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoKGJpdHNpemUgPCBiaXRwb3MgKyAyNTYpICYmICFiRmluaXNoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHN0YXJ0X2JpdHBvcyA9IGJpdHBvczsKLSAgICAgICAgRlhTWVNfbWVtc2V0KG1fcFNjYW5saW5lQnVmLCAweGZmLCBtX1BpdGNoKTsKLSAgICAgICAgaWYgKCFSZWFkTGluZShzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MpKSB7Ci0gICAgICAgICAgICBiaXRwb3MgPSBzdGFydF9iaXRwb3M7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fRW5jb2RpbmcpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShtX3BSZWZCdWYsIG1fcFNjYW5saW5lQnVmLCBtX1BpdGNoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9iQmxhY2spIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9QaXRjaDsgaSArKykgewotICAgICAgICAgICAgICAgIG1fcFNjYW5saW5lQnVmW2ldID0gfm1fcFNjYW5saW5lQnVmW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKG1fcFNjYW5saW5lQnVmLCBtX1BpdGNoKTsKLSAgICAgICAgbV9pUm93ICsrOwotICAgICAgICBpZiAobV9pUm93ID09IG1fblJvd3MpIHsKLSAgICAgICAgICAgIFJlcG9ydEVPRihzcmNfc2l6ZSAtIChiaXRwb3MgKyA3KSAvIDgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CitGWF9CT09MIF9GYXhHNEdldFJvdyhjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHNpemUsCisgICAgICAgICAgICAgICAgICAgICBpbnQmIGJpdHBvcywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmVmX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5zKTsKK0ZYX0JPT0wgX0ZheEdldDFETGluZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGludCYgYml0cG9zLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5zKTsKK3ZvaWQgQ1BERl9GYXhGaWx0ZXI6OlByb2Nlc3NEYXRhKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgYml0cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmluaXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpIHsKKyAgaW50IGJpdHNpemUgPSBzcmNfc2l6ZSAqIDg7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKChiaXRzaXplIDwgYml0cG9zICsgMjU2KSAmJiAhYkZpbmlzaCkgeworICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBpbnQgc3RhcnRfYml0cG9zID0gYml0cG9zOworICAgIEZYU1lTX21lbXNldChtX3BTY2FubGluZUJ1ZiwgMHhmZiwgbV9QaXRjaCk7CisgICAgaWYgKCFSZWFkTGluZShzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MpKSB7CisgICAgICBiaXRwb3MgPSBzdGFydF9iaXRwb3M7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtX0VuY29kaW5nKSB7CisgICAgICBGWFNZU19tZW1jcHkobV9wUmVmQnVmLCBtX3BTY2FubGluZUJ1ZiwgbV9QaXRjaCk7CisgICAgfQorICAgIGlmIChtX2JCbGFjaykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BpdGNoOyBpKyspIHsKKyAgICAgICAgbV9wU2NhbmxpbmVCdWZbaV0gPSB+bV9wU2NhbmxpbmVCdWZbaV07CisgICAgICB9CisgICAgfQorICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKG1fcFNjYW5saW5lQnVmLCBtX1BpdGNoKTsKKyAgICBtX2lSb3crKzsKKyAgICBpZiAobV9pUm93ID09IG1fblJvd3MpIHsKKyAgICAgIFJlcG9ydEVPRihzcmNfc2l6ZSAtIChiaXRwb3MgKyA3KSAvIDgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQogfQotRlhfQk9PTCBDUERGX0ZheEZpbHRlcjo6UmVhZExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKQotewotICAgIGlmICghX0ZheFNraXBFT0woc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZfRmF4RmlsdGVyOjpSZWFkTGluZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGJpdHBvcykgeworICBpZiAoIV9GYXhTa2lwRU9MKHNyY19idWYsIGJpdHNpemUsIGJpdHBvcykpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfQk9PTCByZXQ7CisgIGlmIChtX0VuY29kaW5nIDwgMCkgeworICAgIHJldCA9IF9GYXhHNEdldFJvdyhzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX3BSZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgIG1fbkNvbHVtbnMpOworICB9IGVsc2UgaWYgKG1fRW5jb2RpbmcgPT0gMCkgeworICAgIHJldCA9IF9GYXhHZXQxRExpbmUoc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9uQ29sdW1ucyk7CisgIH0gZWxzZSB7CisgICAgaWYgKGJpdHBvcyA9PSBiaXRzaXplKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIEZYX0JPT0wgcmV0OwotICAgIGlmIChtX0VuY29kaW5nIDwgMCkgewotICAgICAgICByZXQgPSBfRmF4RzRHZXRSb3coc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9wUmVmQnVmLCBtX25Db2x1bW5zKTsKLSAgICB9IGVsc2UgaWYgKG1fRW5jb2RpbmcgPT0gMCkgewotICAgICAgICByZXQgPSBfRmF4R2V0MURMaW5lKHNyY19idWYsIGJpdHNpemUsIGJpdHBvcywgbV9wU2NhbmxpbmVCdWYsIG1fbkNvbHVtbnMpOworICAgIEZYX0JPT0wgYk5leHQxRCA9IHNyY19idWZbYml0cG9zIC8gOF0gJiAoMSA8PCAoNyAtIGJpdHBvcyAlIDgpKTsKKyAgICBiaXRwb3MrKzsKKyAgICBpZiAoYk5leHQxRCkgeworICAgICAgcmV0ID0gX0ZheEdldDFETGluZShzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX25Db2x1bW5zKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYml0cG9zID09IGJpdHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJOZXh0MUQgPSBzcmNfYnVmW2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MgJSA4KSk7Ci0gICAgICAgIGJpdHBvcyArKzsKLSAgICAgICAgaWYgKGJOZXh0MUQpIHsKLSAgICAgICAgICAgIHJldCA9IF9GYXhHZXQxRExpbmUoc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9uQ29sdW1ucyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBfRmF4RzRHZXRSb3coc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9wUmVmQnVmLCBtX25Db2x1bW5zKTsKLSAgICAgICAgfQorICAgICAgcmV0ID0gX0ZheEc0R2V0Um93KHNyY19idWYsIGJpdHNpemUsIGJpdHBvcywgbV9wU2NhbmxpbmVCdWYsIG1fcFJlZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX25Db2x1bW5zKTsKICAgICB9Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcmV0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX2JFbmRPZkxpbmUpCisgICAgaWYgKCFfRmF4U2tpcEVPTChzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmIChtX2JFbmRPZkxpbmUpCi0gICAgICAgIGlmICghX0ZheFNraXBFT0woc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgaWYgKG1fYkJ5dGVBbGlnbikgewotICAgICAgICBiaXRwb3MgPSAoYml0cG9zICsgNykgLyA4ICogODsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIGlmIChtX2JCeXRlQWxpZ24pIHsKKyAgICBiaXRwb3MgPSAoYml0cG9zICsgNykgLyA4ICogODsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfb2JqZWN0cy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX29iamVjdHMuY3BwCmluZGV4IDgxNjJmZmYuLmQ0ZGViMWQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfb2JqZWN0cy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9vYmplY3RzLmNwcApAQCAtNywxMjgzICs3LDEyNDYgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogCi0vL3N0YXRpYworLy8gc3RhdGljCiBpbnQgQ1BERl9PYmplY3Q6OnNfbkN1clJlZkRlcHRoID0gMDsKIAotdm9pZCBDUERGX09iamVjdDo6UmVsZWFzZSgpCi17Ci0gICAgaWYgKG1fT2JqTnVtKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9PYmplY3Q6OlJlbGVhc2UoKSB7CisgIGlmIChtX09iak51bSkgeworICAgIHJldHVybjsKKyAgfQorICBEZXN0cm95KCk7Cit9Cit2b2lkIENQREZfT2JqZWN0OjpEZXN0cm95KCkgeworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgUERGT0JKX1NUUklORzoKKyAgICAgIGRlbGV0ZSAoQ1BERl9TdHJpbmcqKXRoaXM7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERk9CSl9OQU1FOgorICAgICAgZGVsZXRlIChDUERGX05hbWUqKXRoaXM7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERk9CSl9BUlJBWToKKyAgICAgIGRlbGV0ZSAoQ1BERl9BcnJheSopdGhpczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6CisgICAgICBkZWxldGUgKENQREZfRGljdGlvbmFyeSopdGhpczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGT0JKX1NUUkVBTToKKyAgICAgIGRlbGV0ZSAoQ1BERl9TdHJlYW0qKXRoaXM7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZGVsZXRlIHRoaXM7CisgIH0KK30KK0NGWF9CeXRlU3RyaW5nIENQREZfT2JqZWN0OjpHZXRTdHJpbmcoKSBjb25zdCB7CisgIHN3aXRjaCAobV9UeXBlKSB7CisgICAgY2FzZSBQREZPQkpfQk9PTEVBTjoKKyAgICAgIHJldHVybiAoKENQREZfQm9vbGVhbiopdGhpcyktPm1fYlZhbHVlID8gInRydWUiIDogImZhbHNlIjsKKyAgICBjYXNlIFBERk9CSl9OVU1CRVI6CisgICAgICByZXR1cm4gKChDUERGX051bWJlciopdGhpcyktPkdldFN0cmluZygpOworICAgIGNhc2UgUERGT0JKX1NUUklORzoKKyAgICAgIHJldHVybiAoKENQREZfU3RyaW5nKil0aGlzKS0+bV9TdHJpbmc7CisgICAgY2FzZSBQREZPQkpfTkFNRToKKyAgICAgIHJldHVybiAoKENQREZfTmFtZSopdGhpcyktPm1fTmFtZTsKKyAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKKyAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKikodm9pZCopdGhpczsKKyAgICAgIGlmIChwUmVmLT5tX3BPYmpMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBDUERGX09iamVjdCogcE9iaiA9CisgICAgICAgICAgcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+bV9SZWZPYmpOdW0pOworICAgICAgaWYgKHBPYmogPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwT2JqLT5HZXRTdHJpbmcoKTsKICAgICB9Ci0gICAgRGVzdHJveSgpOworICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwogfQotdm9pZCBDUERGX09iamVjdDo6RGVzdHJveSgpCi17Ci0gICAgc3dpdGNoIChtX1R5cGUpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfU1RSSU5HOgotICAgICAgICAgICAgZGVsZXRlIChDUERGX1N0cmluZyopdGhpczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERk9CSl9OQU1FOgotICAgICAgICAgICAgZGVsZXRlIChDUERGX05hbWUqKXRoaXM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZPQkpfQVJSQVk6Ci0gICAgICAgICAgICBkZWxldGUgKENQREZfQXJyYXkqKXRoaXM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWToKLSAgICAgICAgICAgIGRlbGV0ZSAoQ1BERl9EaWN0aW9uYXJ5Kil0aGlzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUkVBTToKLSAgICAgICAgICAgIGRlbGV0ZSAoQ1BERl9TdHJlYW0qKXRoaXM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzOworQ0ZYX0J5dGVTdHJpbmdDIENQREZfT2JqZWN0OjpHZXRDb25zdFN0cmluZygpIGNvbnN0IHsKKyAgc3dpdGNoIChtX1R5cGUpIHsKKyAgICBjYXNlIFBERk9CSl9TVFJJTkc6CisgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKChjb25zdCB1aW50OF90KikoKENQREZfU3RyaW5nKil0aGlzKS0+bV9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1BERl9TdHJpbmcqKXRoaXMpLT5tX1N0cmluZy5HZXRMZW5ndGgoKSk7CisgICAgY2FzZSBQREZPQkpfTkFNRToKKyAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKGNvbnN0IHVpbnQ4X3QqKSgoQ1BERl9OYW1lKil0aGlzKS0+bV9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENQREZfTmFtZSopdGhpcyktPm1fTmFtZS5HZXRMZW5ndGgoKSk7CisgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CisgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IChDUERGX1JlZmVyZW5jZSopKHZvaWQqKXRoaXM7CisgICAgICBpZiAocFJlZi0+bV9wT2JqTGlzdCA9PSBOVUxMKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ1BERl9PYmplY3QqIHBPYmogPQorICAgICAgICAgIHBSZWYtPm1fcE9iakxpc3QtPkdldEluZGlyZWN0T2JqZWN0KHBSZWYtPm1fUmVmT2JqTnVtKTsKKyAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOworICAgICAgfQorICAgICAgcmV0dXJuIHBPYmotPkdldENvbnN0U3RyaW5nKCk7CiAgICAgfQorICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfT2JqZWN0OjpHZXRTdHJpbmcoKSBjb25zdAotewotICAgIHN3aXRjaCAobV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX0JPT0xFQU46Ci0gICAgICAgICAgICByZXR1cm4gKChDUERGX0Jvb2xlYW4qKXRoaXMpLT5tX2JWYWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0gICAgICAgIGNhc2UgUERGT0JKX05VTUJFUjoKLSAgICAgICAgICAgIHJldHVybiAoKENQREZfTnVtYmVyKil0aGlzKS0+R2V0U3RyaW5nKCk7Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUklORzoKLSAgICAgICAgICAgIHJldHVybiAoKENQREZfU3RyaW5nKil0aGlzKS0+bV9TdHJpbmc7Ci0gICAgICAgIGNhc2UgUERGT0JKX05BTUU6Ci0gICAgICAgICAgICByZXR1cm4gKChDUERGX05hbWUqKXRoaXMpLT5tX05hbWU7Ci0gICAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogewotICAgICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKikodm9pZCopdGhpczsKLSAgICAgICAgICAgICAgICBpZiAocFJlZi0+bV9wT2JqTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBSZWYtPm1fcE9iakxpc3QtPkdldEluZGlyZWN0T2JqZWN0KHBSZWYtPm1fUmVmT2JqTnVtKTsKLSAgICAgICAgICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcE9iai0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotfQotQ0ZYX0J5dGVTdHJpbmdDIENQREZfT2JqZWN0OjpHZXRDb25zdFN0cmluZygpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX1R5cGUpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfU1RSSU5HOgotICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygoY29uc3QgdWludDhfdCopKChDUERGX1N0cmluZyopdGhpcyktPm1fU3RyaW5nLCAoKENQREZfU3RyaW5nKil0aGlzKS0+bV9TdHJpbmcuR2V0TGVuZ3RoKCkpOwotICAgICAgICBjYXNlIFBERk9CSl9OQU1FOgotICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygoY29uc3QgdWludDhfdCopKChDUERGX05hbWUqKXRoaXMpLT5tX05hbWUsICgoQ1BERl9OYW1lKil0aGlzKS0+bV9OYW1lLkdldExlbmd0aCgpKTsKLSAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKSh2b2lkKil0aGlzOwotICAgICAgICAgICAgICAgIGlmIChwUmVmLT5tX3BPYmpMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+bV9SZWZPYmpOdW0pOwotICAgICAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcE9iai0+R2V0Q29uc3RTdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOwotfQotRlhfRkxPQVQgQ1BERl9PYmplY3Q6OkdldE51bWJlcigpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX1R5cGUpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfTlVNQkVSOgotICAgICAgICAgICAgcmV0dXJuICgoQ1BERl9OdW1iZXIqKXRoaXMpLT5HZXROdW1iZXIoKTsKLSAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKSh2b2lkKil0aGlzOwotICAgICAgICAgICAgICAgIGlmIChwUmVmLT5tX3BPYmpMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+bV9SZWZPYmpOdW0pOwotICAgICAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBwT2JqLT5HZXROdW1iZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1GWF9GTE9BVCBDUERGX09iamVjdDo6R2V0TnVtYmVyMTYoKSBjb25zdAotewotICAgIHJldHVybiBHZXROdW1iZXIoKTsKLX0KLWludCBDUERGX09iamVjdDo6R2V0SW50ZWdlcigpIGNvbnN0Ci17Ci0gICAgQ0ZYX0F1dG9SZXN0b3JlcjxpbnQ+IHJlc3RvcmVyKCZzX25DdXJSZWZEZXB0aCk7Ci0gICAgaWYgKCsrc19uQ3VyUmVmRGVwdGggPiBPQkpFQ1RfUkVGX01BWF9ERVBUSCkgeworRlhfRkxPQVQgQ1BERl9PYmplY3Q6OkdldE51bWJlcigpIGNvbnN0IHsKKyAgc3dpdGNoIChtX1R5cGUpIHsKKyAgICBjYXNlIFBERk9CSl9OVU1CRVI6CisgICAgICByZXR1cm4gKChDUERGX051bWJlciopdGhpcyktPkdldE51bWJlcigpOworICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogeworICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKSh2b2lkKil0aGlzOworICAgICAgaWYgKHBSZWYtPm1fcE9iakxpc3QgPT0gTlVMTCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIENQREZfT2JqZWN0KiBwT2JqID0KKyAgICAgICAgICBwUmVmLT5tX3BPYmpMaXN0LT5HZXRJbmRpcmVjdE9iamVjdChwUmVmLT5tX1JlZk9iak51bSk7CisgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcmV0dXJuIHBPYmotPkdldE51bWJlcigpOwogICAgIH0KLSAgICBzd2l0Y2ggKG1fVHlwZSkgewotICAgICAgICBjYXNlIFBERk9CSl9CT09MRUFOOgotICAgICAgICAgICAgcmV0dXJuICgoQ1BERl9Cb29sZWFuKil0aGlzKS0+bV9iVmFsdWU7Ci0gICAgICAgIGNhc2UgUERGT0JKX05VTUJFUjoKLSAgICAgICAgICAgIHJldHVybiAoKENQREZfTnVtYmVyKil0aGlzKS0+R2V0SW50ZWdlcigpOwotICAgICAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKLSAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IChDUERGX1JlZmVyZW5jZSopKHZvaWQqKXRoaXM7Ci0gICAgICAgICAgICAgICAgUEFSU0VfQ09OVEVYVCBjb250ZXh0OwotICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldCgmY29udGV4dCwgMCwgc2l6ZW9mKFBBUlNFX0NPTlRFWFQpKTsKLSAgICAgICAgICAgICAgICBpZiAocFJlZi0+bV9wT2JqTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBSZWYtPm1fcE9iakxpc3QtPkdldEluZGlyZWN0T2JqZWN0KHBSZWYtPm1fUmVmT2JqTnVtLCAmY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBPYmotPkdldEludGVnZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CitGWF9GTE9BVCBDUERGX09iamVjdDo6R2V0TnVtYmVyMTYoKSBjb25zdCB7CisgIHJldHVybiBHZXROdW1iZXIoKTsKK30KK2ludCBDUERGX09iamVjdDo6R2V0SW50ZWdlcigpIGNvbnN0IHsKKyAgQ0ZYX0F1dG9SZXN0b3JlcjxpbnQ+IHJlc3RvcmVyKCZzX25DdXJSZWZEZXB0aCk7CisgIGlmICgrK3NfbkN1clJlZkRlcHRoID4gT0JKRUNUX1JFRl9NQVhfREVQVEgpIHsKICAgICByZXR1cm4gMDsKLX0KLUNQREZfRGljdGlvbmFyeSogQ1BERl9PYmplY3Q6OkdldERpY3QoKSBjb25zdAotewotICAgIHN3aXRjaCAobV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfRGljdGlvbmFyeSopdGhpczsKLSAgICAgICAgY2FzZSBQREZPQkpfU1RSRUFNOgotICAgICAgICAgICAgcmV0dXJuICgoQ1BERl9TdHJlYW0qKXRoaXMpLT5HZXREaWN0KCk7Ci0gICAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogewotICAgICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKil0aGlzOwotICAgICAgICAgICAgICAgIGlmIChwUmVmLT5tX3BPYmpMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+bV9SZWZPYmpOdW0pOwotICAgICAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBwT2JqLT5HZXREaWN0KCk7Ci0gICAgICAgICAgICB9CisgIH0KKyAgc3dpdGNoIChtX1R5cGUpIHsKKyAgICBjYXNlIFBERk9CSl9CT09MRUFOOgorICAgICAgcmV0dXJuICgoQ1BERl9Cb29sZWFuKil0aGlzKS0+bV9iVmFsdWU7CisgICAgY2FzZSBQREZPQkpfTlVNQkVSOgorICAgICAgcmV0dXJuICgoQ1BERl9OdW1iZXIqKXRoaXMpLT5HZXRJbnRlZ2VyKCk7CisgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CisgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IChDUERGX1JlZmVyZW5jZSopKHZvaWQqKXRoaXM7CisgICAgICBQQVJTRV9DT05URVhUIGNvbnRleHQ7CisgICAgICBGWFNZU19tZW1zZXQoJmNvbnRleHQsIDAsIHNpemVvZihQQVJTRV9DT05URVhUKSk7CisgICAgICBpZiAocFJlZi0+bV9wT2JqTGlzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgQ1BERl9PYmplY3QqIHBPYmogPQorICAgICAgICAgIHBSZWYtPm1fcE9iakxpc3QtPkdldEluZGlyZWN0T2JqZWN0KHBSZWYtPm1fUmVmT2JqTnVtLCAmY29udGV4dCk7CisgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcmV0dXJuIHBPYmotPkdldEludGVnZXIoKTsKICAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIDA7CiB9Ci1DUERGX0FycmF5KiBDUERGX09iamVjdDo6R2V0QXJyYXkoKSBjb25zdAotewotICAgIGlmIChtX1R5cGUgPT0gUERGT0JKX0FSUkFZKQotICAgICAgICByZXR1cm4gKENQREZfQXJyYXkqKXRoaXM7CitDUERGX0RpY3Rpb25hcnkqIENQREZfT2JqZWN0OjpHZXREaWN0KCkgY29uc3QgeworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6CisgICAgICByZXR1cm4gKENQREZfRGljdGlvbmFyeSopdGhpczsKKyAgICBjYXNlIFBERk9CSl9TVFJFQU06CisgICAgICByZXR1cm4gKChDUERGX1N0cmVhbSopdGhpcyktPkdldERpY3QoKTsKKyAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKKyAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKil0aGlzOworICAgICAgaWYgKHBSZWYtPm1fcE9iakxpc3QgPT0gTlVMTCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIENQREZfT2JqZWN0KiBwT2JqID0KKyAgICAgICAgICBwUmVmLT5tX3BPYmpMaXN0LT5HZXRJbmRpcmVjdE9iamVjdChwUmVmLT5tX1JlZk9iak51bSk7CisgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgcmV0dXJuIHBPYmotPkdldERpY3QoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitDUERGX0FycmF5KiBDUERGX09iamVjdDo6R2V0QXJyYXkoKSBjb25zdCB7CisgIGlmIChtX1R5cGUgPT0gUERGT0JKX0FSUkFZKQorICAgIHJldHVybiAoQ1BERl9BcnJheSopdGhpczsKIAotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gTlVMTDsKIH0KLXZvaWQgQ1BERl9PYmplY3Q6OlNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKQotewotICAgIEFTU0VSVCh0aGlzICE9IE5VTEwpOwotICAgIHN3aXRjaCAobV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX0JPT0xFQU46Ci0gICAgICAgICAgICAoKENQREZfQm9vbGVhbiopdGhpcyktPm1fYlZhbHVlID0gc3RyID09IEZYX0JTVFJDKCJ0cnVlIikgPyAxIDogMDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBQREZPQkpfTlVNQkVSOgotICAgICAgICAgICAgKChDUERGX051bWJlciopdGhpcyktPlNldFN0cmluZyhzdHIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIFBERk9CSl9TVFJJTkc6Ci0gICAgICAgICAgICAoKENQREZfU3RyaW5nKil0aGlzKS0+bV9TdHJpbmcgPSBzdHI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgUERGT0JKX05BTUU6Ci0gICAgICAgICAgICAoKENQREZfTmFtZSopdGhpcyktPm1fTmFtZSA9IHN0cjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQVNTRVJUKEZBTFNFKTsKK3ZvaWQgQ1BERl9PYmplY3Q6OlNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7CisgIEFTU0VSVCh0aGlzICE9IE5VTEwpOworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgUERGT0JKX0JPT0xFQU46CisgICAgICAoKENQREZfQm9vbGVhbiopdGhpcyktPm1fYlZhbHVlID0gc3RyID09IEZYX0JTVFJDKCJ0cnVlIikgPyAxIDogMDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFBERk9CSl9OVU1CRVI6CisgICAgICAoKENQREZfTnVtYmVyKil0aGlzKS0+U2V0U3RyaW5nKHN0cik7CisgICAgICByZXR1cm47CisgICAgY2FzZSBQREZPQkpfU1RSSU5HOgorICAgICAgKChDUERGX1N0cmluZyopdGhpcyktPm1fU3RyaW5nID0gc3RyOworICAgICAgcmV0dXJuOworICAgIGNhc2UgUERGT0JKX05BTUU6CisgICAgICAoKENQREZfTmFtZSopdGhpcyktPm1fTmFtZSA9IHN0cjsKKyAgICAgIHJldHVybjsKKyAgfQorICBBU1NFUlQoRkFMU0UpOwogfQotaW50IENQREZfT2JqZWN0OjpHZXREaXJlY3RUeXBlKCkgY29uc3QKLXsKLSAgICBpZiAobV9UeXBlICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgcmV0dXJuIG1fVHlwZTsKLSAgICB9Ci0gICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKXRoaXM7Ci0gICAgcmV0dXJuIHBSZWYtPm1fcE9iakxpc3QtPkdldEluZGlyZWN0VHlwZShwUmVmLT5tX1JlZk9iak51bSk7CitpbnQgQ1BERl9PYmplY3Q6OkdldERpcmVjdFR5cGUoKSBjb25zdCB7CisgIGlmIChtX1R5cGUgIT0gUERGT0JKX1JFRkVSRU5DRSkgeworICAgIHJldHVybiBtX1R5cGU7CisgIH0KKyAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKXRoaXM7CisgIHJldHVybiBwUmVmLT5tX3BPYmpMaXN0LT5HZXRJbmRpcmVjdFR5cGUocFJlZi0+bV9SZWZPYmpOdW0pOwogfQotRlhfQk9PTCBDUERGX09iamVjdDo6SXNJZGVudGljYWwoQ1BERl9PYmplY3QqIHBPdGhlcikgY29uc3QKLXsKLSAgICBpZiAodGhpcyA9PSBwT3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQREZfT2JqZWN0OjpJc0lkZW50aWNhbChDUERGX09iamVjdCogcE90aGVyKSBjb25zdCB7CisgIGlmICh0aGlzID09IHBPdGhlcikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChwT3RoZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocE90aGVyLT5tX1R5cGUgIT0gbV9UeXBlKSB7CisgICAgaWYgKG1fVHlwZSA9PSBQREZPQkpfUkVGRVJFTkNFICYmIEdldERpcmVjdCgpKSB7CisgICAgICByZXR1cm4gR2V0RGlyZWN0KCktPklzSWRlbnRpY2FsKHBPdGhlcik7CiAgICAgfQotICAgIGlmIChwT3RoZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChwT3RoZXItPm1fVHlwZSAhPSBtX1R5cGUpIHsKLSAgICAgICAgaWYgKG1fVHlwZSA9PSBQREZPQkpfUkVGRVJFTkNFICYmIEdldERpcmVjdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gR2V0RGlyZWN0KCktPklzSWRlbnRpY2FsKHBPdGhlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBPdGhlci0+bV9UeXBlID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIHJldHVybiBJc0lkZW50aWNhbChwT3RoZXItPkdldERpcmVjdCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHN3aXRjaCAobV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX0JPT0xFQU46Ci0gICAgICAgICAgICByZXR1cm4gKCgoQ1BERl9Cb29sZWFuKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX0Jvb2xlYW4qKXBPdGhlcikpOwotICAgICAgICBjYXNlIFBERk9CSl9OVU1CRVI6Ci0gICAgICAgICAgICByZXR1cm4gKCgoQ1BERl9OdW1iZXIqKXRoaXMpLT5JZGVudGljYWwoKENQREZfTnVtYmVyKilwT3RoZXIpKTsKLSAgICAgICAgY2FzZSBQREZPQkpfU1RSSU5HOgotICAgICAgICAgICAgcmV0dXJuICgoKENQREZfU3RyaW5nKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX1N0cmluZyopcE90aGVyKSk7Ci0gICAgICAgIGNhc2UgUERGT0JKX05BTUU6Ci0gICAgICAgICAgICByZXR1cm4gKCgoQ1BERl9OYW1lKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX05hbWUqKXBPdGhlcikpOwotICAgICAgICBjYXNlIFBERk9CSl9BUlJBWToKLSAgICAgICAgICAgIHJldHVybiAoKChDUERGX0FycmF5Kil0aGlzKS0+SWRlbnRpY2FsKChDUERGX0FycmF5KilwT3RoZXIpKTsKLSAgICAgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWToKLSAgICAgICAgICAgIHJldHVybiAoKChDUERGX0RpY3Rpb25hcnkqKXRoaXMpLT5JZGVudGljYWwoKENQREZfRGljdGlvbmFyeSopcE90aGVyKSk7Ci0gICAgICAgIGNhc2UgUERGT0JKX05VTEw6Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgY2FzZSBQREZPQkpfU1RSRUFNOgotICAgICAgICAgICAgcmV0dXJuICgoKENQREZfU3RyZWFtKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX1N0cmVhbSopcE90aGVyKSk7Ci0gICAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRToKLSAgICAgICAgICAgIHJldHVybiAoKChDUERGX1JlZmVyZW5jZSopdGhpcyktPklkZW50aWNhbCgoQ1BERl9SZWZlcmVuY2UqKXBPdGhlcikpOworICAgIGlmIChwT3RoZXItPm1fVHlwZSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgICByZXR1cm4gSXNJZGVudGljYWwocE90aGVyLT5HZXREaXJlY3QoKSk7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgUERGT0JKX0JPT0xFQU46CisgICAgICByZXR1cm4gKCgoQ1BERl9Cb29sZWFuKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX0Jvb2xlYW4qKXBPdGhlcikpOworICAgIGNhc2UgUERGT0JKX05VTUJFUjoKKyAgICAgIHJldHVybiAoKChDUERGX051bWJlciopdGhpcyktPklkZW50aWNhbCgoQ1BERl9OdW1iZXIqKXBPdGhlcikpOworICAgIGNhc2UgUERGT0JKX1NUUklORzoKKyAgICAgIHJldHVybiAoKChDUERGX1N0cmluZyopdGhpcyktPklkZW50aWNhbCgoQ1BERl9TdHJpbmcqKXBPdGhlcikpOworICAgIGNhc2UgUERGT0JKX05BTUU6CisgICAgICByZXR1cm4gKCgoQ1BERl9OYW1lKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX05hbWUqKXBPdGhlcikpOworICAgIGNhc2UgUERGT0JKX0FSUkFZOgorICAgICAgcmV0dXJuICgoKENQREZfQXJyYXkqKXRoaXMpLT5JZGVudGljYWwoKENQREZfQXJyYXkqKXBPdGhlcikpOworICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6CisgICAgICByZXR1cm4gKCgoQ1BERl9EaWN0aW9uYXJ5Kil0aGlzKS0+SWRlbnRpY2FsKChDUERGX0RpY3Rpb25hcnkqKXBPdGhlcikpOworICAgIGNhc2UgUERGT0JKX05VTEw6CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIFBERk9CSl9TVFJFQU06CisgICAgICByZXR1cm4gKCgoQ1BERl9TdHJlYW0qKXRoaXMpLT5JZGVudGljYWwoKENQREZfU3RyZWFtKilwT3RoZXIpKTsKKyAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6CisgICAgICByZXR1cm4gKCgoQ1BERl9SZWZlcmVuY2UqKXRoaXMpLT5JZGVudGljYWwoKENQREZfUmVmZXJlbmNlKilwT3RoZXIpKTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1DUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkdldERpcmVjdCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fVHlwZSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKXRoaXM7Ci0gICAgfQotICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKikodm9pZCopdGhpczsKLSAgICBpZiAocFJlZi0+bV9wT2JqTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+bV9SZWZPYmpOdW0pOwotfQotQ1BERl9PYmplY3QqIENQREZfT2JqZWN0OjpDbG9uZShGWF9CT09MIGJEaXJlY3QpIGNvbnN0Ci17Ci0gICAgQ0ZYX01hcFB0clRvUHRyIHZpc2l0ZWQ7Ci0gICAgcmV0dXJuIENsb25lSW50ZXJuYWwoYkRpcmVjdCwgJnZpc2l0ZWQpOwotfQotQ1BERl9PYmplY3QqIENQREZfT2JqZWN0OjpDbG9uZUludGVybmFsKEZYX0JPT0wgYkRpcmVjdCwgQ0ZYX01hcFB0clRvUHRyKiB2aXNpdGVkKSBjb25zdAotewotICAgIHN3aXRjaCAobV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX0JPT0xFQU46Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENQREZfQm9vbGVhbigoKENQREZfQm9vbGVhbiopdGhpcyktPm1fYlZhbHVlKTsKLSAgICAgICAgY2FzZSBQREZPQkpfTlVNQkVSOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX051bWJlcigoKENQREZfTnVtYmVyKil0aGlzKS0+bV9iSW50ZWdlciwgJigoQ1BERl9OdW1iZXIqKXRoaXMpLT5tX0ludGVnZXIpOwotICAgICAgICBjYXNlIFBERk9CSl9TVFJJTkc6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENQREZfU3RyaW5nKCgoQ1BERl9TdHJpbmcqKXRoaXMpLT5tX1N0cmluZywgKChDUERGX1N0cmluZyopdGhpcyktPklzSGV4KCkpOwotICAgICAgICBjYXNlIFBERk9CSl9OQU1FOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX05hbWUoKChDUERGX05hbWUqKXRoaXMpLT5tX05hbWUpOwotICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBDb3B5ID0gbmV3IENQREZfQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwVGhpcyA9IChDUERGX0FycmF5Kil0aGlzOwotICAgICAgICAgICAgICAgIGludCBuID0gcFRoaXMtPkdldENvdW50KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiB2YWx1ZSA9IChDUERGX09iamVjdCopcFRoaXMtPm1fT2JqZWN0cy5HZXRBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgcENvcHktPm1fT2JqZWN0cy5BZGQodmFsdWUtPkNsb25lSW50ZXJuYWwoYkRpcmVjdCwgdmlzaXRlZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcENvcHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKLSAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBDb3B5ID0gbmV3IENQREZfRGljdGlvbmFyeSgpOwotICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFRoaXMgPSAoQ1BERl9EaWN0aW9uYXJ5Kil0aGlzOwotICAgICAgICAgICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBUaGlzLT5tX01hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHBvcykgewotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXk7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleSwgKHZvaWQqJil2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDb3B5LT5tX01hcC5TZXRBdChrZXksIHZhbHVlLT5DbG9uZUludGVybmFsKGJEaXJlY3QsIHZpc2l0ZWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBDb3B5OwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9OVUxMOiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX051bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUkVBTTogewotICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwVGhpcyA9IChDUERGX1N0cmVhbSopdGhpczsKLSAgICAgICAgICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgICAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHBUaGlzLCBUUlVFKTsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJlYW1TaXplID0gYWNjLkdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFRoaXMtPkdldERpY3QoKTsKLSAgICAgICAgICAgICAgICBpZiAocERpY3QpCi0gICAgICAgICAgICAgICAgICAgIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopKChDUERGX09iamVjdCopcERpY3QpLT5DbG9uZUludGVybmFsKGJEaXJlY3QsIHZpc2l0ZWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9TdHJlYW0oYWNjLkRldGFjaERhdGEoKSwgc3RyZWFtU2l6ZSwgcERpY3QpOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKLSAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IChDUERGX1JlZmVyZW5jZSopdGhpczsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpfbnVtID0gcFJlZi0+bV9SZWZPYmpOdW07Ci0gICAgICAgICAgICAgICAgaWYgKGJEaXJlY3QgJiYgIXZpc2l0ZWQtPkdldFZhbHVlQXQoKHZvaWQqKSh1aW50cHRyX3Qpb2JqX251bSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdmlzaXRlZC0+U2V0QXQoKHZvaWQqKSh1aW50cHRyX3Qpb2JqX251bSwgKHZvaWQqKTEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXBSZWYtPkdldERpcmVjdCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBSZWYtPkdldERpcmVjdCgpLT5DbG9uZUludGVybmFsKFRSVUUsIHZpc2l0ZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENQREZfUmVmZXJlbmNlKHBSZWYtPm1fcE9iakxpc3QsIG9ial9udW0pOwotICAgICAgICAgICAgfQotICAgIH0KK0NQREZfT2JqZWN0KiBDUERGX09iamVjdDo6R2V0RGlyZWN0KCkgY29uc3QgeworICBpZiAobV9UeXBlICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICByZXR1cm4gKENQREZfT2JqZWN0Kil0aGlzOworICB9CisgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKikodm9pZCopdGhpczsKKyAgaWYgKHBSZWYtPm1fcE9iakxpc3QgPT0gTlVMTCkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBwUmVmLT5tX3BPYmpMaXN0LT5HZXRJbmRpcmVjdE9iamVjdChwUmVmLT5tX1JlZk9iak51bSk7CiB9Ci1DUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkNsb25lUmVmKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jKSBjb25zdAotewotICAgIGlmIChtX09iak51bSkgewotICAgICAgICByZXR1cm4gbmV3IENQREZfUmVmZXJlbmNlKHBEb2MsIG1fT2JqTnVtKTsKLSAgICB9Ci0gICAgcmV0dXJuIENsb25lKCk7CitDUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkNsb25lKEZYX0JPT0wgYkRpcmVjdCkgY29uc3QgeworICBDRlhfTWFwUHRyVG9QdHIgdmlzaXRlZDsKKyAgcmV0dXJuIENsb25lSW50ZXJuYWwoYkRpcmVjdCwgJnZpc2l0ZWQpOwogfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9PYmplY3Q6OkdldFVuaWNvZGVUZXh0KENGWF9DaGFyTWFwKiBwQ2hhck1hcCkgY29uc3QKLXsKLSAgICBpZiAobV9UeXBlID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgcmV0dXJuIFBERl9EZWNvZGVUZXh0KCgoQ1BERl9TdHJpbmcqKXRoaXMpLT5tX1N0cmluZywgcENoYXJNYXApOworQ1BERl9PYmplY3QqIENQREZfT2JqZWN0OjpDbG9uZUludGVybmFsKEZYX0JPT0wgYkRpcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWFwUHRyVG9QdHIqIHZpc2l0ZWQpIGNvbnN0IHsKKyAgc3dpdGNoIChtX1R5cGUpIHsKKyAgICBjYXNlIFBERk9CSl9CT09MRUFOOgorICAgICAgcmV0dXJuIG5ldyBDUERGX0Jvb2xlYW4oKChDUERGX0Jvb2xlYW4qKXRoaXMpLT5tX2JWYWx1ZSk7CisgICAgY2FzZSBQREZPQkpfTlVNQkVSOgorICAgICAgcmV0dXJuIG5ldyBDUERGX051bWJlcigoKENQREZfTnVtYmVyKil0aGlzKS0+bV9iSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJigoQ1BERl9OdW1iZXIqKXRoaXMpLT5tX0ludGVnZXIpOworICAgIGNhc2UgUERGT0JKX1NUUklORzoKKyAgICAgIHJldHVybiBuZXcgQ1BERl9TdHJpbmcoKChDUERGX1N0cmluZyopdGhpcyktPm1fU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENQREZfU3RyaW5nKil0aGlzKS0+SXNIZXgoKSk7CisgICAgY2FzZSBQREZPQkpfTkFNRToKKyAgICAgIHJldHVybiBuZXcgQ1BERl9OYW1lKCgoQ1BERl9OYW1lKil0aGlzKS0+bV9OYW1lKTsKKyAgICBjYXNlIFBERk9CSl9BUlJBWTogeworICAgICAgQ1BERl9BcnJheSogcENvcHkgPSBuZXcgQ1BERl9BcnJheSgpOworICAgICAgQ1BERl9BcnJheSogcFRoaXMgPSAoQ1BERl9BcnJheSopdGhpczsKKyAgICAgIGludCBuID0gcFRoaXMtPkdldENvdW50KCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBDUERGX09iamVjdCogdmFsdWUgPSAoQ1BERl9PYmplY3QqKXBUaGlzLT5tX09iamVjdHMuR2V0QXQoaSk7CisgICAgICAgIHBDb3B5LT5tX09iamVjdHMuQWRkKHZhbHVlLT5DbG9uZUludGVybmFsKGJEaXJlY3QsIHZpc2l0ZWQpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwQ29weTsKICAgICB9Ci0gICAgaWYgKG1fVHlwZSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIENQREZfU3RyZWFtQWNjIHN0cmVhbTsKLSAgICAgICAgc3RyZWFtLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopdGhpcywgRkFMU0UpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQgPSBQREZfRGVjb2RlVGV4dChzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpLCBwQ2hhck1hcCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWTogeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ29weSA9IG5ldyBDUERGX0RpY3Rpb25hcnkoKTsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcFRoaXMgPSAoQ1BERl9EaWN0aW9uYXJ5Kil0aGlzOworICAgICAgRlhfUE9TSVRJT04gcG9zID0gcFRoaXMtPm1fTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgICAgIHdoaWxlIChwb3MpIHsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OworICAgICAgICBDUERGX09iamVjdCogdmFsdWU7CisgICAgICAgIHBUaGlzLT5tX01hcC5HZXROZXh0QXNzb2MocG9zLCBrZXksICh2b2lkKiYpdmFsdWUpOworICAgICAgICBwQ29weS0+bV9NYXAuU2V0QXQoa2V5LCB2YWx1ZS0+Q2xvbmVJbnRlcm5hbChiRGlyZWN0LCB2aXNpdGVkKSk7CisgICAgICB9CisgICAgICByZXR1cm4gcENvcHk7CiAgICAgfQotICAgIGlmIChtX1R5cGUgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgcmV0dXJuIFBERl9EZWNvZGVUZXh0KCgoQ1BERl9OYW1lKil0aGlzKS0+bV9OYW1lLCBwQ2hhck1hcCk7CisgICAgY2FzZSBQREZPQkpfTlVMTDogeworICAgICAgcmV0dXJuIG5ldyBDUERGX051bGw7CiAgICAgfQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIGNhc2UgUERGT0JKX1NUUkVBTTogeworICAgICAgQ1BERl9TdHJlYW0qIHBUaGlzID0gKENQREZfU3RyZWFtKil0aGlzOworICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOworICAgICAgYWNjLkxvYWRBbGxEYXRhKHBUaGlzLCBUUlVFKTsKKyAgICAgIEZYX0RXT1JEIHN0cmVhbVNpemUgPSBhY2MuR2V0U2l6ZSgpOworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBUaGlzLT5HZXREaWN0KCk7CisgICAgICBpZiAocERpY3QpCisgICAgICAgIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopKChDUERGX09iamVjdCopcERpY3QpCisgICAgICAgICAgICAgICAgICAgIC0+Q2xvbmVJbnRlcm5hbChiRGlyZWN0LCB2aXNpdGVkKTsKKyAgICAgIHJldHVybiBuZXcgQ1BERl9TdHJlYW0oYWNjLkRldGFjaERhdGEoKSwgc3RyZWFtU2l6ZSwgcERpY3QpOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKKyAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKil0aGlzOworICAgICAgRlhfRFdPUkQgb2JqX251bSA9IHBSZWYtPm1fUmVmT2JqTnVtOworICAgICAgaWYgKGJEaXJlY3QgJiYgIXZpc2l0ZWQtPkdldFZhbHVlQXQoKHZvaWQqKSh1aW50cHRyX3Qpb2JqX251bSkpIHsKKyAgICAgICAgdmlzaXRlZC0+U2V0QXQoKHZvaWQqKSh1aW50cHRyX3Qpb2JqX251bSwgKHZvaWQqKTEpOworICAgICAgICBpZiAoIXBSZWYtPkdldERpcmVjdCgpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIHJldHVybiBwUmVmLT5HZXREaXJlY3QoKS0+Q2xvbmVJbnRlcm5hbChUUlVFLCB2aXNpdGVkKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgQ1BERl9SZWZlcmVuY2UocFJlZi0+bV9wT2JqTGlzdCwgb2JqX251bSk7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOwogfQotdm9pZCBDUERGX09iamVjdDo6U2V0VW5pY29kZVRleHQoY29uc3QgRlhfV0NIQVIqIHBVbmljb2RlcywgaW50IGxlbikKLXsKLSAgICBpZiAobV9UeXBlID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgKChDUERGX1N0cmluZyopdGhpcyktPm1fU3RyaW5nID0gUERGX0VuY29kZVRleHQocFVuaWNvZGVzLCBsZW4pOwotICAgIH0gZWxzZSBpZiAobV9UeXBlID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0ID0gUERGX0VuY29kZVRleHQocFVuaWNvZGVzLCBsZW4pOwotICAgICAgICAoKENQREZfU3RyZWFtKil0aGlzKS0+U2V0RGF0YSgodWludDhfdCopcmVzdWx0LmNfc3RyKCksIHJlc3VsdC5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKLSAgICB9CitDUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkNsb25lUmVmKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jKSBjb25zdCB7CisgIGlmIChtX09iak51bSkgeworICAgIHJldHVybiBuZXcgQ1BERl9SZWZlcmVuY2UocERvYywgbV9PYmpOdW0pOworICB9CisgIHJldHVybiBDbG9uZSgpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9PYmplY3Q6OkdldFVuaWNvZGVUZXh0KENGWF9DaGFyTWFwKiBwQ2hhck1hcCkgY29uc3QgeworICBpZiAobV9UeXBlID09IFBERk9CSl9TVFJJTkcpIHsKKyAgICByZXR1cm4gUERGX0RlY29kZVRleHQoKChDUERGX1N0cmluZyopdGhpcyktPm1fU3RyaW5nLCBwQ2hhck1hcCk7CisgIH0KKyAgaWYgKG1fVHlwZSA9PSBQREZPQkpfU1RSRUFNKSB7CisgICAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtOworICAgIHN0cmVhbS5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXRoaXMsIEZBTFNFKTsKKyAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQgPQorICAgICAgICBQREZfRGVjb2RlVGV4dChzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpLCBwQ2hhck1hcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBpZiAobV9UeXBlID09IFBERk9CSl9OQU1FKSB7CisgICAgcmV0dXJuIFBERl9EZWNvZGVUZXh0KCgoQ1BERl9OYW1lKil0aGlzKS0+bV9OYW1lLCBwQ2hhck1hcCk7CisgIH0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Cit9Cit2b2lkIENQREZfT2JqZWN0OjpTZXRVbmljb2RlVGV4dChjb25zdCBGWF9XQ0hBUiogcFVuaWNvZGVzLCBpbnQgbGVuKSB7CisgIGlmIChtX1R5cGUgPT0gUERGT0JKX1NUUklORykgeworICAgICgoQ1BERl9TdHJpbmcqKXRoaXMpLT5tX1N0cmluZyA9IFBERl9FbmNvZGVUZXh0KHBVbmljb2RlcywgbGVuKTsKKyAgfSBlbHNlIGlmIChtX1R5cGUgPT0gUERGT0JKX1NUUkVBTSkgeworICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdCA9IFBERl9FbmNvZGVUZXh0KHBVbmljb2RlcywgbGVuKTsKKyAgICAoKENQREZfU3RyZWFtKil0aGlzKQorICAgICAgICAtPlNldERhdGEoKHVpbnQ4X3QqKXJlc3VsdC5jX3N0cigpLCByZXN1bHQuR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7CisgIH0KIH0KIAogQ1BERl9OdW1iZXI6OkNQREZfTnVtYmVyKGludCB2YWx1ZSkKLSAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKFRSVUUpLCBtX0ludGVnZXIodmFsdWUpIHsKLX0KKyAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKFRSVUUpLCBtX0ludGVnZXIodmFsdWUpIHt9CiAKIENQREZfTnVtYmVyOjpDUERGX051bWJlcihGWF9GTE9BVCB2YWx1ZSkKLSAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKEZBTFNFKSwgbV9GbG9hdCh2YWx1ZSkgewotfQorICAgIDogQ1BERl9PYmplY3QoUERGT0JKX05VTUJFUiksIG1fYkludGVnZXIoRkFMU0UpLCBtX0Zsb2F0KHZhbHVlKSB7fQogCiBDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoRlhfQk9PTCBiSW50ZWdlciwgdm9pZCogcERhdGEpCi0gICAgOiBDUERGX09iamVjdChQREZPQkpfTlVNQkVSKSwgbV9iSW50ZWdlcihiSW50ZWdlciksIG1fSW50ZWdlcigqKGludCopcERhdGEpIHsKKyAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLAorICAgICAgbV9iSW50ZWdlcihiSW50ZWdlciksCisgICAgICBtX0ludGVnZXIoKihpbnQqKXBEYXRhKSB7fQorCitDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpCisgICAgOiBDUERGX09iamVjdChQREZPQkpfTlVNQkVSKSB7CisgIEZYX2F0b251bShzdHIsIG1fYkludGVnZXIsICZtX0ludGVnZXIpOwogfQogCi1DUERGX051bWJlcjo6Q1BERl9OdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIDogQ1BERl9PYmplY3QoUERGT0JKX05VTUJFUikgewotICAgIEZYX2F0b251bShzdHIsIG1fYkludGVnZXIsICZtX0ludGVnZXIpOwordm9pZCBDUERGX051bWJlcjo6U2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7CisgIEZYX2F0b251bShzdHIsIG1fYkludGVnZXIsICZtX0ludGVnZXIpOwogfQotCi12b2lkIENQREZfTnVtYmVyOjpTZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpCi17Ci0gICAgRlhfYXRvbnVtKHN0ciwgbV9iSW50ZWdlciwgJm1fSW50ZWdlcik7CitGWF9CT09MIENQREZfTnVtYmVyOjpJZGVudGljYWwoQ1BERl9OdW1iZXIqIHBPdGhlcikgY29uc3QgeworICByZXR1cm4gbV9iSW50ZWdlciA9PSBwT3RoZXItPm1fYkludGVnZXIgJiYgbV9JbnRlZ2VyID09IHBPdGhlci0+bV9JbnRlZ2VyOwogfQotRlhfQk9PTCBDUERGX051bWJlcjo6SWRlbnRpY2FsKENQREZfTnVtYmVyKiBwT3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYkludGVnZXIgPT0gcE90aGVyLT5tX2JJbnRlZ2VyICYmIG1fSW50ZWdlciA9PSBwT3RoZXItPm1fSW50ZWdlcjsKK0NGWF9CeXRlU3RyaW5nIENQREZfTnVtYmVyOjpHZXRTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiBtX2JJbnRlZ2VyID8gQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIobV9JbnRlZ2VyLCBGWEZPUk1BVF9TSUdORUQpCisgICAgICAgICAgICAgICAgICAgIDogQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEZsb2F0KG1fRmxvYXQpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9OdW1iZXI6OkdldFN0cmluZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYkludGVnZXIgPyBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihtX0ludGVnZXIsIEZYRk9STUFUX1NJR05FRCkgOiBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0RmxvYXQobV9GbG9hdCk7Cit2b2lkIENQREZfTnVtYmVyOjpTZXROdW1iZXIoRlhfRkxPQVQgdmFsdWUpIHsKKyAgbV9iSW50ZWdlciA9IEZBTFNFOworICBtX0Zsb2F0ID0gdmFsdWU7CiB9Ci12b2lkIENQREZfTnVtYmVyOjpTZXROdW1iZXIoRlhfRkxPQVQgdmFsdWUpCi17Ci0gICAgbV9iSW50ZWdlciA9IEZBTFNFOwotICAgIG1fRmxvYXQgPSB2YWx1ZTsKK0NQREZfU3RyaW5nOjpDUERGX1N0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKQorICAgIDogQ1BERl9PYmplY3QoUERGT0JKX1NUUklORyksIG1fYkhleChGQUxTRSkgeworICBtX1N0cmluZyA9IFBERl9FbmNvZGVUZXh0KHN0cik7CiB9Ci1DUERGX1N0cmluZzo6Q1BERl9TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9iSGV4KEZBTFNFKSB7Ci0gICAgbV9TdHJpbmcgPSBQREZfRW5jb2RlVGV4dChzdHIpOworQ1BERl9BcnJheTo6fkNQREZfQXJyYXkoKSB7CisgIGludCBzaXplID0gbV9PYmplY3RzLkdldFNpemUoKTsKKyAgQ1BERl9PYmplY3QqKiBwTGlzdCA9IChDUERGX09iamVjdCoqKW1fT2JqZWN0cy5HZXREYXRhKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYgKHBMaXN0W2ldKQorICAgICAgcExpc3RbaV0tPlJlbGVhc2UoKTsKKyAgfQogfQotQ1BERl9BcnJheTo6fkNQREZfQXJyYXkoKQotewotICAgIGludCBzaXplID0gbV9PYmplY3RzLkdldFNpemUoKTsKLSAgICBDUERGX09iamVjdCoqIHBMaXN0ID0gKENQREZfT2JqZWN0KiopbV9PYmplY3RzLkdldERhdGEoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKLSAgICAgICAgaWYgKHBMaXN0W2ldKQotICAgICAgICAgICAgcExpc3RbaV0tPlJlbGVhc2UoKTsKLSAgICB9Ci19Ci1DRlhfRmxvYXRSZWN0IENQREZfQXJyYXk6OkdldFJlY3QoKQotewotICAgIENGWF9GbG9hdFJlY3QgcmVjdDsKLSAgICBpZiAobV9UeXBlICE9IFBERk9CSl9BUlJBWSB8fCBtX09iamVjdHMuR2V0U2l6ZSgpICE9IDQpIHsKLSAgICAgICAgcmV0dXJuIHJlY3Q7Ci0gICAgfQotICAgIHJlY3QubGVmdCA9IEdldE51bWJlcigwKTsKLSAgICByZWN0LmJvdHRvbSA9IEdldE51bWJlcigxKTsKLSAgICByZWN0LnJpZ2h0ID0gR2V0TnVtYmVyKDIpOwotICAgIHJlY3QudG9wID0gR2V0TnVtYmVyKDMpOworQ0ZYX0Zsb2F0UmVjdCBDUERGX0FycmF5OjpHZXRSZWN0KCkgeworICBDRlhfRmxvYXRSZWN0IHJlY3Q7CisgIGlmIChtX1R5cGUgIT0gUERGT0JKX0FSUkFZIHx8IG1fT2JqZWN0cy5HZXRTaXplKCkgIT0gNCkgewogICAgIHJldHVybiByZWN0OworICB9CisgIHJlY3QubGVmdCA9IEdldE51bWJlcigwKTsKKyAgcmVjdC5ib3R0b20gPSBHZXROdW1iZXIoMSk7CisgIHJlY3QucmlnaHQgPSBHZXROdW1iZXIoMik7CisgIHJlY3QudG9wID0gR2V0TnVtYmVyKDMpOworICByZXR1cm4gcmVjdDsKIH0KLUNGWF9BZmZpbmVNYXRyaXggQ1BERl9BcnJheTo6R2V0TWF0cml4KCkKLXsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICBpZiAobV9UeXBlICE9IFBERk9CSl9BUlJBWSB8fCBtX09iamVjdHMuR2V0U2l6ZSgpICE9IDYpIHsKLSAgICAgICAgcmV0dXJuIG1hdHJpeDsKLSAgICB9Ci0gICAgbWF0cml4LlNldChHZXROdW1iZXIoMCksIEdldE51bWJlcigxKSwgR2V0TnVtYmVyKDIpLCBHZXROdW1iZXIoMyksIEdldE51bWJlcig0KSwgR2V0TnVtYmVyKDUpKTsKK0NGWF9BZmZpbmVNYXRyaXggQ1BERl9BcnJheTo6R2V0TWF0cml4KCkgeworICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKKyAgaWYgKG1fVHlwZSAhPSBQREZPQkpfQVJSQVkgfHwgbV9PYmplY3RzLkdldFNpemUoKSAhPSA2KSB7CiAgICAgcmV0dXJuIG1hdHJpeDsKKyAgfQorICBtYXRyaXguU2V0KEdldE51bWJlcigwKSwgR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMiksIEdldE51bWJlcigzKSwKKyAgICAgICAgICAgICBHZXROdW1iZXIoNCksIEdldE51bWJlcig1KSk7CisgIHJldHVybiBtYXRyaXg7CiB9Ci1DUERGX09iamVjdCogQ1BERl9BcnJheTo6R2V0RWxlbWVudChGWF9EV09SRCBpKSBjb25zdAotewotICAgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKENQREZfT2JqZWN0KiltX09iamVjdHMuR2V0QXQoaSk7Ci19Ci1DUERGX09iamVjdCogQ1BERl9BcnJheTo6R2V0RWxlbWVudFZhbHVlKEZYX0RXT1JEIGkpIGNvbnN0Ci17Ci0gICAgaWYgKGkgPj0gKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiAoKENQREZfT2JqZWN0KiltX09iamVjdHMuR2V0QXQoaSkpLT5HZXREaXJlY3QoKTsKLX0KLUNGWF9CeXRlU3RyaW5nIENQREZfQXJyYXk6OkdldFN0cmluZyhGWF9EV09SRCBpKSBjb25zdAotewotICAgIGlmIChpIDwgKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHAgPSAoQ1BERl9PYmplY3QqKW1fT2JqZWN0cy5HZXRBdChpKTsKLSAgICAgICAgcmV0dXJuIHAtPkdldFN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLX0KLUNGWF9CeXRlU3RyaW5nQyBDUERGX0FycmF5OjpHZXRDb25zdFN0cmluZyhGWF9EV09SRCBpKSBjb25zdAotewotICAgIGlmIChpIDwgKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHAgPSAoQ1BERl9PYmplY3QqKW1fT2JqZWN0cy5HZXRBdChpKTsKLSAgICAgICAgcmV0dXJuIHAtPkdldENvbnN0U3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKLX0KLWludCBDUERGX0FycmF5OjpHZXRJbnRlZ2VyKEZYX0RXT1JEIGkpIGNvbnN0Ci17Ci0gICAgaWYgKGkgPj0gKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwID0gKENQREZfT2JqZWN0KiltX09iamVjdHMuR2V0QXQoaSk7Ci0gICAgcmV0dXJuIHAtPkdldEludGVnZXIoKTsKLX0KLUZYX0ZMT0FUIENQREZfQXJyYXk6OkdldE51bWJlcihGWF9EV09SRCBpKSBjb25zdAotewotICAgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcCA9IChDUERGX09iamVjdCopbV9PYmplY3RzLkdldEF0KGkpOwotICAgIHJldHVybiBwLT5HZXROdW1iZXIoKTsKLX0KLUNQREZfRGljdGlvbmFyeSogQ1BERl9BcnJheTo6R2V0RGljdChGWF9EV09SRCBpKSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gR2V0RWxlbWVudFZhbHVlKGkpOwotICAgIGlmICghcCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHAtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm4gKENQREZfRGljdGlvbmFyeSopcDsKLSAgICB9Ci0gICAgaWYgKHAtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiAoKENQREZfU3RyZWFtKilwKS0+R2V0RGljdCgpOwotICAgIH0KK0NQREZfT2JqZWN0KiBDUERGX0FycmF5OjpHZXRFbGVtZW50KEZYX0RXT1JEIGkpIGNvbnN0IHsKKyAgaWYgKGkgPj0gKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpIHsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gKENQREZfT2JqZWN0KiltX09iamVjdHMuR2V0QXQoaSk7CiB9Ci1DUERGX1N0cmVhbSogQ1BERl9BcnJheTo6R2V0U3RyZWFtKEZYX0RXT1JEIGkpIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBHZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgaWYgKHAgPT0gTlVMTCB8fCBwLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChDUERGX1N0cmVhbSopcDsKK0NQREZfT2JqZWN0KiBDUERGX0FycmF5OjpHZXRFbGVtZW50VmFsdWUoRlhfRFdPUkQgaSkgY29uc3QgeworICBpZiAoaSA+PSAoRlhfRFdPUkQpbV9PYmplY3RzLkdldFNpemUoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiAoKENQREZfT2JqZWN0KiltX09iamVjdHMuR2V0QXQoaSkpLT5HZXREaXJlY3QoKTsKIH0KLUNQREZfQXJyYXkqIENQREZfQXJyYXk6OkdldEFycmF5KEZYX0RXT1JEIGkpIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBHZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgaWYgKHAgPT0gTlVMTCB8fCBwLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKENQREZfQXJyYXkqKXA7Ci19Ci12b2lkIENQREZfQXJyYXk6OlJlbW92ZUF0KEZYX0RXT1JEIGkpCi17Ci0gICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpOwotICAgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CitDRlhfQnl0ZVN0cmluZyBDUERGX0FycmF5OjpHZXRTdHJpbmcoRlhfRFdPUkQgaSkgY29uc3QgeworICBpZiAoaSA8IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKSB7CiAgICAgQ1BERl9PYmplY3QqIHAgPSAoQ1BERl9PYmplY3QqKW1fT2JqZWN0cy5HZXRBdChpKTsKLSAgICBpZiAocCkKLSAgICAgICAgcC0+UmVsZWFzZSgpOwotICAgIG1fT2JqZWN0cy5SZW1vdmVBdChpKTsKKyAgICByZXR1cm4gcC0+R2V0U3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CiB9Ci12b2lkIENQREZfQXJyYXk6OlNldEF0KEZYX0RXT1JEIGksIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMpCi17Ci0gICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpOwotICAgIEFTU0VSVChpIDwgKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpOwotICAgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBPbGQgPSAoQ1BERl9PYmplY3QqKW1fT2JqZWN0cy5HZXRBdChpKTsKLSAgICBpZiAocE9sZCkKLSAgICAgICAgcE9sZC0+UmVsZWFzZSgpOwotICAgIGlmIChwT2JqLT5HZXRPYmpOdW0oKSkgewotICAgICAgICBBU1NFUlQocE9ianMgIT0gTlVMTCk7Ci0gICAgICAgIHBPYmogPSBDUERGX1JlZmVyZW5jZTo6Q3JlYXRlKHBPYmpzLCBwT2JqLT5HZXRPYmpOdW0oKSk7Ci0gICAgfQotICAgIG1fT2JqZWN0cy5TZXRBdChpLCBwT2JqKTsKK0NGWF9CeXRlU3RyaW5nQyBDUERGX0FycmF5OjpHZXRDb25zdFN0cmluZyhGWF9EV09SRCBpKSBjb25zdCB7CisgIGlmIChpIDwgKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpIHsKKyAgICBDUERGX09iamVjdCogcCA9IChDUERGX09iamVjdCopbV9PYmplY3RzLkdldEF0KGkpOworICAgIHJldHVybiBwLT5HZXRDb25zdFN0cmluZygpOworICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKIH0KLXZvaWQgQ1BERl9BcnJheTo6SW5zZXJ0QXQoRlhfRFdPUkQgaW5kZXgsIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMpCi17Ci0gICAgQVNTRVJUKHBPYmogIT0gTlVMTCk7Ci0gICAgaWYgKHBPYmotPkdldE9iak51bSgpKSB7Ci0gICAgICAgIEFTU0VSVChwT2JqcyAhPSBOVUxMKTsKLSAgICAgICAgcE9iaiA9IENQREZfUmVmZXJlbmNlOjpDcmVhdGUocE9ianMsIHBPYmotPkdldE9iak51bSgpKTsKLSAgICB9Ci0gICAgbV9PYmplY3RzLkluc2VydEF0KGluZGV4LCBwT2JqKTsKLX0KLXZvaWQgQ1BERl9BcnJheTo6QWRkKENQREZfT2JqZWN0KiBwT2JqLCBDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMpCi17Ci0gICAgQVNTRVJUKHBPYmogIT0gTlVMTCk7Ci0gICAgaWYgKHBPYmotPkdldE9iak51bSgpKSB7Ci0gICAgICAgIEFTU0VSVChwT2JqcyAhPSBOVUxMKTsKLSAgICAgICAgcE9iaiA9IENQREZfUmVmZXJlbmNlOjpDcmVhdGUocE9ianMsIHBPYmotPkdldE9iak51bSgpKTsKLSAgICB9Ci0gICAgbV9PYmplY3RzLkFkZChwT2JqKTsKLX0KLXZvaWQgQ1BERl9BcnJheTo6QWRkTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKQotewotICAgIEFTU0VSVChtX1R5cGUgPT0gUERGT0JKX0FSUkFZKTsKLSAgICBBZGQobmV3IENQREZfTmFtZShzdHIpKTsKLX0KLXZvaWQgQ1BERl9BcnJheTo6QWRkU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpCi17Ci0gICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpOwotICAgIEFkZChuZXcgQ1BERl9TdHJpbmcoc3RyKSk7Ci19Ci12b2lkIENQREZfQXJyYXk6OkFkZEludGVnZXIoaW50IGkpCi17Ci0gICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpOwotICAgIEFkZChuZXcgQ1BERl9OdW1iZXIoaSkpOwotfQotdm9pZCBDUERGX0FycmF5OjpBZGROdW1iZXIoRlhfRkxPQVQgZikKLXsKLSAgICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9BUlJBWSk7Ci0gICAgQ1BERl9OdW1iZXIqIHBOdW1iZXIgPSBuZXcgQ1BERl9OdW1iZXI7Ci0gICAgcE51bWJlci0+U2V0TnVtYmVyKGYpOwotICAgIEFkZChwTnVtYmVyKTsKLX0KLXZvaWQgQ1BERl9BcnJheTo6QWRkUmVmZXJlbmNlKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pCi17Ci0gICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpOwotICAgIEFkZChuZXcgQ1BERl9SZWZlcmVuY2UocERvYywgb2JqbnVtKSk7Ci19Ci1GWF9CT09MIENQREZfQXJyYXk6OklkZW50aWNhbChDUERGX0FycmF5KiBwT3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fT2JqZWN0cy5HZXRTaXplKCkgIT0gcE90aGVyLT5tX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX09iamVjdHMuR2V0U2l6ZSgpOyBpICsrKQotICAgICAgICBpZiAoISgoQ1BERl9PYmplY3QqKW1fT2JqZWN0c1tpXSktPklzSWRlbnRpY2FsKChDUERGX09iamVjdCopcE90aGVyLT5tX09iamVjdHNbaV0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUNQREZfRGljdGlvbmFyeTo6fkNQREZfRGljdGlvbmFyeSgpCi17Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9NYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgdm9pZCogdmFsdWUgPSBtX01hcC5HZXROZXh0VmFsdWUocG9zKTsKLSAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgKChDUERGX09iamVjdCopdmFsdWUpLT5SZWxlYXNlKCk7Ci0gICAgfQotfQotRlhfUE9TSVRJT04gQ1BERl9EaWN0aW9uYXJ5OjpHZXRTdGFydFBvcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLX0KLUNQREZfT2JqZWN0KiBDUERGX0RpY3Rpb25hcnk6OkdldE5leHRFbGVtZW50KEZYX1BPU0lUSU9OJiBwb3MsIENGWF9CeXRlU3RyaW5nJiBrZXkpIGNvbnN0Ci17Ci0gICAgaWYgKHBvcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcDsKLSAgICBtX01hcC5HZXROZXh0QXNzb2MocG9zLCBrZXksICh2b2lkKiYpcCk7Ci0gICAgcmV0dXJuIHA7Ci19Ci1DUERGX09iamVjdCogQ1BERl9EaWN0aW9uYXJ5OjpHZXRFbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKLSAgICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOwotICAgIHJldHVybiBwOwotfQotQ1BERl9PYmplY3QqIENQREZfRGljdGlvbmFyeTo6R2V0RWxlbWVudFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKLSAgICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOwotICAgIHJldHVybiBwID8gcC0+R2V0RGlyZWN0KCkgOiBOVUxMOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EaWN0aW9uYXJ5OjpHZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwotICAgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7Ci0gICAgaWYgKHApIHsKLSAgICAgICAgcmV0dXJuIHAtPkdldFN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLX0KLUNGWF9CeXRlU3RyaW5nQyBDUERGX0RpY3Rpb25hcnk6OkdldENvbnN0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKLSAgICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOwotICAgIGlmIChwKSB7Ci0gICAgICAgIHJldHVybiBwLT5HZXRDb25zdFN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKCk7Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX0RpY3Rpb25hcnk6OkdldFVuaWNvZGVUZXh0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBDRlhfQ2hhck1hcCogcENoYXJNYXApIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwotICAgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7Ci0gICAgaWYgKHApIHsKLSAgICAgICAgaWYocC0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIHAgPSAoKENQREZfUmVmZXJlbmNlKilwKS0+R2V0RGlyZWN0KCk7Ci0gICAgICAgICAgICBpZiAocCkgewotICAgICAgICAgICAgICAgIHJldHVybiBwLT5HZXRVbmljb2RlVGV4dChwQ2hhck1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcC0+R2V0VW5pY29kZVRleHQocENoYXJNYXApOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EaWN0aW9uYXJ5OjpHZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmKSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKLSAgICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOwotICAgIGlmIChwKSB7Ci0gICAgICAgIHJldHVybiBwLT5HZXRTdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGRlZik7Ci19Ci1DRlhfQnl0ZVN0cmluZ0MgQ1BERl9EaWN0aW9uYXJ5OjpHZXRDb25zdFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBkZWYpIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwotICAgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7Ci0gICAgaWYgKHApIHsKLSAgICAgICAgcmV0dXJuIHAtPkdldENvbnN0U3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoZGVmKTsKLX0KLWludCBDUERGX0RpY3Rpb25hcnk6OkdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwotICAgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7Ci0gICAgaWYgKHApIHsKLSAgICAgICAgcmV0dXJuIHAtPkdldEludGVnZXIoKTsKLSAgICB9CitpbnQgQ1BERl9BcnJheTo6R2V0SW50ZWdlcihGWF9EV09SRCBpKSBjb25zdCB7CisgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKSB7CiAgICAgcmV0dXJuIDA7CisgIH0KKyAgQ1BERl9PYmplY3QqIHAgPSAoQ1BERl9PYmplY3QqKW1fT2JqZWN0cy5HZXRBdChpKTsKKyAgcmV0dXJuIHAtPkdldEludGVnZXIoKTsKIH0KLWludCBDUERGX0RpY3Rpb25hcnk6OkdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludCBkZWYpIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwotICAgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7Ci0gICAgaWYgKHApIHsKLSAgICAgICAgcmV0dXJuIHAtPkdldEludGVnZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlZjsKLX0KLUZYX0ZMT0FUIENQREZfRGljdGlvbmFyeTo6R2V0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKLSAgICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOwotICAgIGlmIChwKSB7Ci0gICAgICAgIHJldHVybiBwLT5HZXROdW1iZXIoKTsKLSAgICB9CitGWF9GTE9BVCBDUERGX0FycmF5OjpHZXROdW1iZXIoRlhfRFdPUkQgaSkgY29uc3QgeworICBpZiAoaSA+PSAoRlhfRFdPUkQpbV9PYmplY3RzLkdldFNpemUoKSkgewogICAgIHJldHVybiAwOworICB9CisgIENQREZfT2JqZWN0KiBwID0gKENQREZfT2JqZWN0KiltX09iamVjdHMuR2V0QXQoaSk7CisgIHJldHVybiBwLT5HZXROdW1iZXIoKTsKIH0KLUZYX0JPT0wgQ1BERl9EaWN0aW9uYXJ5OjpHZXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJEZWZhdWx0KSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKLSAgICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOwotICAgIGlmIChwICYmIHAtPkdldFR5cGUoKSA9PSBQREZPQkpfQk9PTEVBTikgewotICAgICAgICByZXR1cm4gcC0+R2V0SW50ZWdlcigpOwotICAgIH0KLSAgICByZXR1cm4gYkRlZmF1bHQ7CitDUERGX0RpY3Rpb25hcnkqIENQREZfQXJyYXk6OkdldERpY3QoRlhfRFdPUkQgaSkgY29uc3QgeworICBDUERGX09iamVjdCogcCA9IEdldEVsZW1lbnRWYWx1ZShpKTsKKyAgaWYgKCFwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHAtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIHJldHVybiAoQ1BERl9EaWN0aW9uYXJ5KilwOworICB9CisgIGlmIChwLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgeworICAgIHJldHVybiAoKENQREZfU3RyZWFtKilwKS0+R2V0RGljdCgpOworICB9CisgIHJldHVybiBOVUxMOwogfQotQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0RpY3Rpb25hcnk6OkdldERpY3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBHZXRFbGVtZW50VmFsdWUoa2V5KTsKLSAgICBpZiAoIXApIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIGlmIChwLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuIChDUERGX0RpY3Rpb25hcnkqKXA7Ci0gICAgfQotICAgIGlmIChwLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gKChDUERGX1N0cmVhbSopcCktPkdldERpY3QoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGxwdHI7CitDUERGX1N0cmVhbSogQ1BERl9BcnJheTo6R2V0U3RyZWFtKEZYX0RXT1JEIGkpIGNvbnN0IHsKKyAgQ1BERl9PYmplY3QqIHAgPSBHZXRFbGVtZW50VmFsdWUoaSk7CisgIGlmIChwID09IE5VTEwgfHwgcC0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gKENQREZfU3RyZWFtKilwOwogfQotQ1BERl9BcnJheSogQ1BERl9EaWN0aW9uYXJ5OjpHZXRBcnJheShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QKLXsKLSAgICBDUERGX09iamVjdCogcCA9IEdldEVsZW1lbnRWYWx1ZShrZXkpOwotICAgIGlmIChwID09IE5VTEwgfHwgcC0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChDUERGX0FycmF5KilwOworQ1BERl9BcnJheSogQ1BERl9BcnJheTo6R2V0QXJyYXkoRlhfRFdPUkQgaSkgY29uc3QgeworICBDUERGX09iamVjdCogcCA9IEdldEVsZW1lbnRWYWx1ZShpKTsKKyAgaWYgKHAgPT0gTlVMTCB8fCBwLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIChDUERGX0FycmF5KilwOwogfQotQ1BERl9TdHJlYW0qIENQREZfRGljdGlvbmFyeTo6R2V0U3RyZWFtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gR2V0RWxlbWVudFZhbHVlKGtleSk7Ci0gICAgaWYgKHAgPT0gTlVMTCB8fCBwLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChDUERGX1N0cmVhbSopcDsKLX0KLUNGWF9GbG9hdFJlY3QgQ1BERl9EaWN0aW9uYXJ5OjpHZXRSZWN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdAotewotICAgIENGWF9GbG9hdFJlY3QgcmVjdDsKLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBHZXRBcnJheShrZXkpOwotICAgIGlmIChwQXJyYXkpIHsKLSAgICAgICAgcmVjdCA9IHBBcnJheS0+R2V0UmVjdCgpOwotICAgIH0KLSAgICByZXR1cm4gcmVjdDsKLX0KLUNGWF9BZmZpbmVNYXRyaXggQ1BERl9EaWN0aW9uYXJ5OjpHZXRNYXRyaXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0Ci17Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gR2V0QXJyYXkoa2V5KTsKLSAgICBpZiAocEFycmF5KSB7Ci0gICAgICAgIG1hdHJpeCA9IHBBcnJheS0+R2V0TWF0cml4KCk7Ci0gICAgfQotICAgIHJldHVybiBtYXRyaXg7Ci19Ci1GWF9CT09MIENQREZfRGljdGlvbmFyeTo6S2V5RXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0Ci17Ci0gICAgdm9pZCogdmFsdWU7Ci0gICAgcmV0dXJuIG1fTWFwLkxvb2t1cChrZXksIHZhbHVlKTsKLX0KLXZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgQ1BERl9PYmplY3QqIHBPYmosIENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqcykKLXsKLSAgICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9ESUNUSU9OQVJZKTsKLSAgICBDUERGX09iamVjdCogcCA9IE5VTEw7Ci0gICAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKLSAgICBpZiAocCA9PSBwT2JqKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHApCi0gICAgICAgIHAtPlJlbGVhc2UoKTsKLSAgICBpZiAocE9iaikgewotICAgICAgICBpZiAocE9iai0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgIEFTU0VSVChwT2JqcyAhPSBOVUxMKTsKLSAgICAgICAgICAgIHBPYmogPSBDUERGX1JlZmVyZW5jZTo6Q3JlYXRlKHBPYmpzLCBwT2JqLT5HZXRPYmpOdW0oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9NYXAuU2V0QXQoa2V5LCBwT2JqKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX01hcC5SZW1vdmVLZXkoa2V5KTsKLSAgICB9Ci19Ci12b2lkIENQREZfRGljdGlvbmFyeTo6QWRkVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIEFTU0VSVChtX1R5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlkpOwotICAgIG1fTWFwLkFkZFZhbHVlKGtleSwgcE9iaik7Ci19Ci12b2lkIENQREZfRGljdGlvbmFyeTo6UmVtb3ZlQXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpCi17Ci0gICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSk7Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwotICAgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7Ci0gICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQordm9pZCBDUERGX0FycmF5OjpSZW1vdmVBdChGWF9EV09SRCBpKSB7CisgIEFTU0VSVChtX1R5cGUgPT0gUERGT0JKX0FSUkFZKTsKKyAgaWYgKGkgPj0gKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9PYmplY3QqIHAgPSAoQ1BERl9PYmplY3QqKW1fT2JqZWN0cy5HZXRBdChpKTsKKyAgaWYgKHApCiAgICAgcC0+UmVsZWFzZSgpOworICBtX09iamVjdHMuUmVtb3ZlQXQoaSk7Cit9Cit2b2lkIENQREZfQXJyYXk6OlNldEF0KEZYX0RXT1JEIGksCisgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMpIHsKKyAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpOworICBBU1NFUlQoaSA8IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKTsKKyAgaWYgKGkgPj0gKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9PYmplY3QqIHBPbGQgPSAoQ1BERl9PYmplY3QqKW1fT2JqZWN0cy5HZXRBdChpKTsKKyAgaWYgKHBPbGQpCisgICAgcE9sZC0+UmVsZWFzZSgpOworICBpZiAocE9iai0+R2V0T2JqTnVtKCkpIHsKKyAgICBBU1NFUlQocE9ianMgIT0gTlVMTCk7CisgICAgcE9iaiA9IENQREZfUmVmZXJlbmNlOjpDcmVhdGUocE9ianMsIHBPYmotPkdldE9iak51bSgpKTsKKyAgfQorICBtX09iamVjdHMuU2V0QXQoaSwgcE9iaik7Cit9Cit2b2lkIENQREZfQXJyYXk6Okluc2VydEF0KEZYX0RXT1JEIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpzKSB7CisgIEFTU0VSVChwT2JqICE9IE5VTEwpOworICBpZiAocE9iai0+R2V0T2JqTnVtKCkpIHsKKyAgICBBU1NFUlQocE9ianMgIT0gTlVMTCk7CisgICAgcE9iaiA9IENQREZfUmVmZXJlbmNlOjpDcmVhdGUocE9ianMsIHBPYmotPkdldE9iak51bSgpKTsKKyAgfQorICBtX09iamVjdHMuSW5zZXJ0QXQoaW5kZXgsIHBPYmopOworfQordm9pZCBDUERGX0FycmF5OjpBZGQoQ1BERl9PYmplY3QqIHBPYmosIENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqcykgeworICBBU1NFUlQocE9iaiAhPSBOVUxMKTsKKyAgaWYgKHBPYmotPkdldE9iak51bSgpKSB7CisgICAgQVNTRVJUKHBPYmpzICE9IE5VTEwpOworICAgIHBPYmogPSBDUERGX1JlZmVyZW5jZTo6Q3JlYXRlKHBPYmpzLCBwT2JqLT5HZXRPYmpOdW0oKSk7CisgIH0KKyAgbV9PYmplY3RzLkFkZChwT2JqKTsKK30KK3ZvaWQgQ1BERl9BcnJheTo6QWRkTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7CisgIEFTU0VSVChtX1R5cGUgPT0gUERGT0JKX0FSUkFZKTsKKyAgQWRkKG5ldyBDUERGX05hbWUoc3RyKSk7Cit9Cit2b2lkIENQREZfQXJyYXk6OkFkZFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7CisgIEFTU0VSVChtX1R5cGUgPT0gUERGT0JKX0FSUkFZKTsKKyAgQWRkKG5ldyBDUERGX1N0cmluZyhzdHIpKTsKK30KK3ZvaWQgQ1BERl9BcnJheTo6QWRkSW50ZWdlcihpbnQgaSkgeworICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9BUlJBWSk7CisgIEFkZChuZXcgQ1BERl9OdW1iZXIoaSkpOworfQordm9pZCBDUERGX0FycmF5OjpBZGROdW1iZXIoRlhfRkxPQVQgZikgeworICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9BUlJBWSk7CisgIENQREZfTnVtYmVyKiBwTnVtYmVyID0gbmV3IENQREZfTnVtYmVyOworICBwTnVtYmVyLT5TZXROdW1iZXIoZik7CisgIEFkZChwTnVtYmVyKTsKK30KK3ZvaWQgQ1BERl9BcnJheTo6QWRkUmVmZXJlbmNlKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pIHsKKyAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpOworICBBZGQobmV3IENQREZfUmVmZXJlbmNlKHBEb2MsIG9iam51bSkpOworfQorRlhfQk9PTCBDUERGX0FycmF5OjpJZGVudGljYWwoQ1BERl9BcnJheSogcE90aGVyKSBjb25zdCB7CisgIGlmIChtX09iamVjdHMuR2V0U2l6ZSgpICE9IHBPdGhlci0+bV9PYmplY3RzLkdldFNpemUoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1fT2JqZWN0cy5HZXRTaXplKCk7IGkrKykKKyAgICBpZiAoISgoQ1BERl9PYmplY3QqKW1fT2JqZWN0c1tpXSkKKyAgICAgICAgICAgICAtPklzSWRlbnRpY2FsKChDUERGX09iamVjdCopcE90aGVyLT5tX09iamVjdHNbaV0pKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KK0NQREZfRGljdGlvbmFyeTo6fkNQREZfRGljdGlvbmFyeSgpIHsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9NYXAuR2V0U3RhcnRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgdm9pZCogdmFsdWUgPSBtX01hcC5HZXROZXh0VmFsdWUocG9zKTsKKyAgICBpZiAodmFsdWUpCisgICAgICAoKENQREZfT2JqZWN0Kil2YWx1ZSktPlJlbGVhc2UoKTsKKyAgfQorfQorRlhfUE9TSVRJT04gQ1BERl9EaWN0aW9uYXJ5OjpHZXRTdGFydFBvcygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKK30KK0NQREZfT2JqZWN0KiBDUERGX0RpY3Rpb25hcnk6OkdldE5leHRFbGVtZW50KEZYX1BPU0lUSU9OJiBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdCB7CisgIGlmIChwb3MgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfT2JqZWN0KiBwOworICBtX01hcC5HZXROZXh0QXNzb2MocG9zLCBrZXksICh2b2lkKiYpcCk7CisgIHJldHVybiBwOworfQorQ1BERl9PYmplY3QqIENQREZfRGljdGlvbmFyeTo6R2V0RWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QgeworICBDUERGX09iamVjdCogcCA9IE5VTEw7CisgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7CisgIHJldHVybiBwOworfQorQ1BERl9PYmplY3QqIENQREZfRGljdGlvbmFyeTo6R2V0RWxlbWVudFZhbHVlKAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKKyAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKKyAgcmV0dXJuIHAgPyBwLT5HZXREaXJlY3QoKSA6IE5VTEw7Cit9CitDRlhfQnl0ZVN0cmluZyBDUERGX0RpY3Rpb25hcnk6OkdldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QgeworICBDUERGX09iamVjdCogcCA9IE5VTEw7CisgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7CisgIGlmIChwKSB7CisgICAgcmV0dXJuIHAtPkdldFN0cmluZygpOworICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworfQorQ0ZYX0J5dGVTdHJpbmdDIENQREZfRGljdGlvbmFyeTo6R2V0Q29uc3RTdHJpbmcoCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0IHsKKyAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOworICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOworICBpZiAocCkgeworICAgIHJldHVybiBwLT5HZXRDb25zdFN0cmluZygpOworICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKK30KK0NGWF9XaWRlU3RyaW5nIENQREZfRGljdGlvbmFyeTo6R2V0VW5pY29kZVRleHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DaGFyTWFwKiBwQ2hhck1hcCkgY29uc3QgeworICBDUERGX09iamVjdCogcCA9IE5VTEw7CisgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7CisgIGlmIChwKSB7CisgICAgaWYgKHAtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgICBwID0gKChDUERGX1JlZmVyZW5jZSopcCktPkdldERpcmVjdCgpOworICAgICAgaWYgKHApIHsKKyAgICAgICAgcmV0dXJuIHAtPkdldFVuaWNvZGVUZXh0KHBDaGFyTWFwKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHAtPkdldFVuaWNvZGVUZXh0KHBDaGFyTWFwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Cit9CitDRlhfQnl0ZVN0cmluZyBDUERGX0RpY3Rpb25hcnk6OkdldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmKSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKKyAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKKyAgaWYgKHApIHsKKyAgICByZXR1cm4gcC0+R2V0U3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGRlZik7Cit9CitDRlhfQnl0ZVN0cmluZ0MgQ1BERl9EaWN0aW9uYXJ5OjpHZXRDb25zdFN0cmluZygKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZikgY29uc3QgeworICBDUERGX09iamVjdCogcCA9IE5VTEw7CisgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7CisgIGlmIChwKSB7CisgICAgcmV0dXJuIHAtPkdldENvbnN0U3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhkZWYpOworfQoraW50IENQREZfRGljdGlvbmFyeTo6R2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QgeworICBDUERGX09iamVjdCogcCA9IE5VTEw7CisgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7CisgIGlmIChwKSB7CisgICAgcmV0dXJuIHAtPkdldEludGVnZXIoKTsKKyAgfQorICByZXR1cm4gMDsKK30KK2ludCBDUERGX0RpY3Rpb25hcnk6OkdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludCBkZWYpIGNvbnN0IHsKKyAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOworICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOworICBpZiAocCkgeworICAgIHJldHVybiBwLT5HZXRJbnRlZ2VyKCk7CisgIH0KKyAgcmV0dXJuIGRlZjsKK30KK0ZYX0ZMT0FUIENQREZfRGljdGlvbmFyeTo6R2V0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKKyAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKKyAgaWYgKHApIHsKKyAgICByZXR1cm4gcC0+R2V0TnVtYmVyKCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitGWF9CT09MIENQREZfRGljdGlvbmFyeTo6R2V0Qm9vbGVhbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRlZmF1bHQpIGNvbnN0IHsKKyAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOworICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOworICBpZiAocCAmJiBwLT5HZXRUeXBlKCkgPT0gUERGT0JKX0JPT0xFQU4pIHsKKyAgICByZXR1cm4gcC0+R2V0SW50ZWdlcigpOworICB9CisgIHJldHVybiBiRGVmYXVsdDsKK30KK0NQREZfRGljdGlvbmFyeSogQ1BERl9EaWN0aW9uYXJ5OjpHZXREaWN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwID0gR2V0RWxlbWVudFZhbHVlKGtleSk7CisgIGlmICghcCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChwLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICByZXR1cm4gKENQREZfRGljdGlvbmFyeSopcDsKKyAgfQorICBpZiAocC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKKyAgICByZXR1cm4gKChDUERGX1N0cmVhbSopcCktPkdldERpY3QoKTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KK0NQREZfQXJyYXkqIENQREZfRGljdGlvbmFyeTo6R2V0QXJyYXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0IHsKKyAgQ1BERl9PYmplY3QqIHAgPSBHZXRFbGVtZW50VmFsdWUoa2V5KTsKKyAgaWYgKHAgPT0gTlVMTCB8fCBwLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIChDUERGX0FycmF5KilwOworfQorQ1BERl9TdHJlYW0qIENQREZfRGljdGlvbmFyeTo6R2V0U3RyZWFtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwID0gR2V0RWxlbWVudFZhbHVlKGtleSk7CisgIGlmIChwID09IE5VTEwgfHwgcC0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gKENQREZfU3RyZWFtKilwOworfQorQ0ZYX0Zsb2F0UmVjdCBDUERGX0RpY3Rpb25hcnk6OkdldFJlY3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICBDUERGX0FycmF5KiBwQXJyYXkgPSBHZXRBcnJheShrZXkpOworICBpZiAocEFycmF5KSB7CisgICAgcmVjdCA9IHBBcnJheS0+R2V0UmVjdCgpOworICB9CisgIHJldHVybiByZWN0OworfQorQ0ZYX0FmZmluZU1hdHJpeCBDUERGX0RpY3Rpb25hcnk6OkdldE1hdHJpeChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QgeworICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gR2V0QXJyYXkoa2V5KTsKKyAgaWYgKHBBcnJheSkgeworICAgIG1hdHJpeCA9IHBBcnJheS0+R2V0TWF0cml4KCk7CisgIH0KKyAgcmV0dXJuIG1hdHJpeDsKK30KK0ZYX0JPT0wgQ1BERl9EaWN0aW9uYXJ5OjpLZXlFeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QgeworICB2b2lkKiB2YWx1ZTsKKyAgcmV0dXJuIG1fTWFwLkxvb2t1cChrZXksIHZhbHVlKTsKK30KK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMpIHsKKyAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSk7CisgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKKyAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKKyAgaWYgKHAgPT0gcE9iaikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAocCkKKyAgICBwLT5SZWxlYXNlKCk7CisgIGlmIChwT2JqKSB7CisgICAgaWYgKHBPYmotPkdldE9iak51bSgpKSB7CisgICAgICBBU1NFUlQocE9ianMgIT0gTlVMTCk7CisgICAgICBwT2JqID0gQ1BERl9SZWZlcmVuY2U6OkNyZWF0ZShwT2JqcywgcE9iai0+R2V0T2JqTnVtKCkpOworICAgIH0KKyAgICBtX01hcC5TZXRBdChrZXksIHBPYmopOworICB9IGVsc2UgewogICAgIG1fTWFwLlJlbW92ZUtleShrZXkpOworICB9CiB9Ci12b2lkIENQREZfRGljdGlvbmFyeTo6UmVwbGFjZUtleShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG9sZGtleSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuZXdrZXkpCi17Ci0gICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSk7Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwotICAgIG1fTWFwLkxvb2t1cChvbGRrZXksICh2b2lkKiYpcCk7Ci0gICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Cit2b2lkIENQREZfRGljdGlvbmFyeTo6QWRkVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIENQREZfT2JqZWN0KiBwT2JqKSB7CisgIEFTU0VSVChtX1R5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlkpOworICBtX01hcC5BZGRWYWx1ZShrZXksIHBPYmopOworfQordm9pZCBDUERGX0RpY3Rpb25hcnk6OlJlbW92ZUF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSB7CisgIEFTU0VSVChtX1R5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlkpOworICBDUERGX09iamVjdCogcCA9IE5VTEw7CisgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7CisgIGlmIChwID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgcC0+UmVsZWFzZSgpOworICBtX01hcC5SZW1vdmVLZXkoa2V5KTsKK30KK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpSZXBsYWNlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb2xka2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuZXdrZXkpIHsKKyAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSk7CisgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKKyAgbV9NYXAuTG9va3VwKG9sZGtleSwgKHZvaWQqJilwKTsKKyAgaWYgKHAgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBtX01hcC5SZW1vdmVLZXkob2xka2V5KTsKKyAgbV9NYXAuU2V0QXQobmV3a2V5LCBwKTsKK30KK0ZYX0JPT0wgQ1BERl9EaWN0aW9uYXJ5OjpJZGVudGljYWwoQ1BERl9EaWN0aW9uYXJ5KiBwT3RoZXIpIGNvbnN0IHsKKyAgaWYgKHBPdGhlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX01hcC5HZXRDb3VudCgpICE9IHBPdGhlci0+bV9NYXAuR2V0Q291bnQoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9QT1NJVElPTiBwb3MgPSBtX01hcC5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBrZXk7CisgICAgdm9pZCogdmFsdWU7CisgICAgbV9NYXAuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7CisgICAgaWYgKCF2YWx1ZSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoISgoQ1BERl9PYmplY3QqKXZhbHVlKS0+SXNJZGVudGljYWwocE90aGVyLT5HZXRFbGVtZW50KGtleSkpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIG1fTWFwLlJlbW92ZUtleShvbGRrZXkpOwotICAgIG1fTWFwLlNldEF0KG5ld2tleSwgcCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfRGljdGlvbmFyeTo6SWRlbnRpY2FsKENQREZfRGljdGlvbmFyeSogcE90aGVyKSBjb25zdAotewotICAgIGlmIChwT3RoZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX01hcC5HZXRDb3VudCgpICE9IHBPdGhlci0+bV9NYXAuR2V0Q291bnQoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgdm9pZCogdmFsdWU7Ci0gICAgICAgIG1fTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICBpZiAoIXZhbHVlKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoISgoQ1BERl9PYmplY3QqKXZhbHVlKS0+SXNJZGVudGljYWwocE90aGVyLT5HZXRFbGVtZW50KGtleSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Cit2b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBpbnQgaSkgeworICBTZXRBdChrZXksIG5ldyBDUERGX051bWJlcihpKSk7CiB9Ci12b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBpbnQgaSkKLXsKLSAgICBTZXRBdChrZXksIG5ldyBDUERGX051bWJlcihpKSk7Cit2b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgeworICBTZXRBdChrZXksIG5ldyBDUERGX05hbWUobmFtZSkpOwogfQotdm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldEF0TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCi17Ci0gICAgU2V0QXQoa2V5LCBuZXcgQ1BERl9OYW1lKG5hbWUpKTsKK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7CisgIFNldEF0KGtleSwgbmV3IENQREZfU3RyaW5nKHN0cikpOwogfQotdm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldEF0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKQotewotICAgIFNldEF0KGtleSwgbmV3IENQREZfU3RyaW5nKHN0cikpOwordm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldEF0UmVmZXJlbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSkgeworICBTZXRBdChrZXksIG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBvYmpudW0pKTsKIH0KLXZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdFJlZmVyZW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MsIEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICBTZXRBdChrZXksIG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBvYmpudW0pKTsKK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpBZGRSZWZlcmVuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0pIHsKKyAgQWRkVmFsdWUoa2V5LCBuZXcgQ1BERl9SZWZlcmVuY2UocERvYywgb2JqbnVtKSk7CiB9Ci12b2lkIENQREZfRGljdGlvbmFyeTo6QWRkUmVmZXJlbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgRlhfRFdPUkQgb2JqbnVtKQotewotICAgIEFkZFZhbHVlKGtleSwgbmV3IENQREZfUmVmZXJlbmNlKHBEb2MsIG9iam51bSkpOwordm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldEF0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9GTE9BVCBmKSB7CisgIENQREZfTnVtYmVyKiBwTnVtYmVyID0gbmV3IENQREZfTnVtYmVyOworICBwTnVtYmVyLT5TZXROdW1iZXIoZik7CisgIFNldEF0KGtleSwgcE51bWJlcik7CiB9Ci12b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIEZYX0ZMT0FUIGYpCi17Ci0gICAgQ1BERl9OdW1iZXIqIHBOdW1iZXIgPSBuZXcgQ1BERl9OdW1iZXI7Ci0gICAgcE51bWJlci0+U2V0TnVtYmVyKGYpOwotICAgIFNldEF0KGtleSwgcE51bWJlcik7Cit2b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJWYWx1ZSkgeworICBTZXRBdChrZXksIG5ldyBDUERGX0Jvb2xlYW4oYlZhbHVlKSk7CiB9Ci12b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJWYWx1ZSkKLXsKLSAgICBTZXRBdChrZXksIG5ldyBDUERGX0Jvb2xlYW4oYlZhbHVlKSk7Cit2b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXRSZWN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSB7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OworICBwQXJyYXktPkFkZE51bWJlcihyZWN0LmxlZnQpOworICBwQXJyYXktPkFkZE51bWJlcihyZWN0LmJvdHRvbSk7CisgIHBBcnJheS0+QWRkTnVtYmVyKHJlY3QucmlnaHQpOworICBwQXJyYXktPkFkZE51bWJlcihyZWN0LnRvcCk7CisgIFNldEF0KGtleSwgcEFycmF5KTsKIH0KLXZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdFJlY3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpCi17Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7Ci0gICAgcEFycmF5LT5BZGROdW1iZXIocmVjdC5sZWZ0KTsKLSAgICBwQXJyYXktPkFkZE51bWJlcihyZWN0LmJvdHRvbSk7Ci0gICAgcEFycmF5LT5BZGROdW1iZXIocmVjdC5yaWdodCk7Ci0gICAgcEFycmF5LT5BZGROdW1iZXIocmVjdC50b3ApOwotICAgIFNldEF0KGtleSwgcEFycmF5KTsKLX0KLXZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdE1hdHJpeChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OwotICAgIHBBcnJheS0+QWRkTnVtYmVyMTYobWF0cml4LmEpOwotICAgIHBBcnJheS0+QWRkTnVtYmVyMTYobWF0cml4LmIpOwotICAgIHBBcnJheS0+QWRkTnVtYmVyMTYobWF0cml4LmMpOwotICAgIHBBcnJheS0+QWRkTnVtYmVyMTYobWF0cml4LmQpOwotICAgIHBBcnJheS0+QWRkTnVtYmVyKG1hdHJpeC5lKTsKLSAgICBwQXJyYXktPkFkZE51bWJlcihtYXRyaXguZik7Ci0gICAgU2V0QXQoa2V5LCBwQXJyYXkpOwordm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldEF0TWF0cml4KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkgeworICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgcEFycmF5LT5BZGROdW1iZXIxNihtYXRyaXguYSk7CisgIHBBcnJheS0+QWRkTnVtYmVyMTYobWF0cml4LmIpOworICBwQXJyYXktPkFkZE51bWJlcjE2KG1hdHJpeC5jKTsKKyAgcEFycmF5LT5BZGROdW1iZXIxNihtYXRyaXguZCk7CisgIHBBcnJheS0+QWRkTnVtYmVyKG1hdHJpeC5lKTsKKyAgcEFycmF5LT5BZGROdW1iZXIobWF0cml4LmYpOworICBTZXRBdChrZXksIHBBcnJheSk7CiB9CiBDUERGX1N0cmVhbTo6Q1BERl9TdHJlYW0odWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIENQREZfRGljdGlvbmFyeSogcERpY3QpCiAgICAgOiBDUERGX09iamVjdChQREZPQkpfU1RSRUFNKSB7Ci0gICAgbV9wRGljdCA9IHBEaWN0OwotICAgIG1fZHdTaXplID0gc2l6ZTsKLSAgICBtX0dlbk51bSA9IChGWF9EV09SRCkgLSAxOwotICAgIG1fcERhdGFCdWYgPSBwRGF0YTsKLSAgICBtX3BDcnlwdG9IYW5kbGVyID0gTlVMTDsKKyAgbV9wRGljdCA9IHBEaWN0OworICBtX2R3U2l6ZSA9IHNpemU7CisgIG1fR2VuTnVtID0gKEZYX0RXT1JEKS0xOworICBtX3BEYXRhQnVmID0gcERhdGE7CisgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOwogfQotQ1BERl9TdHJlYW06On5DUERGX1N0cmVhbSgpCi17Ci0gICAgaWYgKG1fR2VuTnVtID09IChGWF9EV09SRCkgLSAxICYmIG1fcERhdGFCdWYgIT0gTlVMTCkgewotICAgICAgICBGWF9GcmVlKG1fcERhdGFCdWYpOwotICAgIH0KK0NQREZfU3RyZWFtOjp+Q1BERl9TdHJlYW0oKSB7CisgIGlmIChtX0dlbk51bSA9PSAoRlhfRFdPUkQpLTEgJiYgbV9wRGF0YUJ1ZiAhPSBOVUxMKSB7CisgICAgRlhfRnJlZShtX3BEYXRhQnVmKTsKKyAgfQorICBpZiAobV9wRGljdCkgeworICAgIG1fcERpY3QtPlJlbGVhc2UoKTsKKyAgfQorfQordm9pZCBDUERGX1N0cmVhbTo6SW5pdFN0cmVhbShDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7CisgIGlmIChwRGljdCkgewogICAgIGlmIChtX3BEaWN0KSB7Ci0gICAgICAgIG1fcERpY3QtPlJlbGVhc2UoKTsKKyAgICAgIG1fcERpY3QtPlJlbGVhc2UoKTsKICAgICB9CisgICAgbV9wRGljdCA9IHBEaWN0OworICB9CisgIGlmIChtX0dlbk51bSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICBpZiAobV9wRGF0YUJ1ZikgeworICAgICAgRlhfRnJlZShtX3BEYXRhQnVmKTsKKyAgICB9CisgIH0KKyAgbV9HZW5OdW0gPSAwOworICBtX3BGaWxlID0gTlVMTDsKKyAgbV9wQ3J5cHRvSGFuZGxlciA9IE5VTEw7CisgIG1fRmlsZU9mZnNldCA9IDA7CiB9Ci12b2lkIENQREZfU3RyZWFtOjpJbml0U3RyZWFtKENQREZfRGljdGlvbmFyeSogcERpY3QpCi17Ci0gICAgaWYgKHBEaWN0KSB7Ci0gICAgICAgIGlmIChtX3BEaWN0KSB7Ci0gICAgICAgICAgICBtX3BEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGljdCA9IHBEaWN0Owordm9pZCBDUERGX1N0cmVhbTo6SW5pdFN0cmVhbSh1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgeworICBJbml0U3RyZWFtKHBEaWN0KTsKKyAgbV9HZW5OdW0gPSAoRlhfRFdPUkQpLTE7CisgIG1fcERhdGFCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKKyAgaWYgKHBEYXRhKSB7CisgICAgRlhTWVNfbWVtY3B5KG1fcERhdGFCdWYsIHBEYXRhLCBzaXplKTsKKyAgfQorICBtX2R3U2l6ZSA9IHNpemU7CisgIGlmIChtX3BEaWN0KSB7CisgICAgbV9wRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSwgc2l6ZSk7CisgIH0KK30KK3ZvaWQgQ1BERl9TdHJlYW06OlNldERhdGEoY29uc3QgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbXByZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktlZXBCdWYpIHsKKyAgaWYgKG1fR2VuTnVtID09IChGWF9EV09SRCktMSkgeworICAgIGlmIChtX3BEYXRhQnVmKSB7CisgICAgICBGWF9GcmVlKG1fcERhdGFCdWYpOwogICAgIH0KLSAgICBpZiAobV9HZW5OdW0gPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgaWYgKG1fcERhdGFCdWYpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9wRGF0YUJ1Zik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9HZW5OdW0gPSAwOwotICAgIG1fcEZpbGUgPSBOVUxMOworICB9IGVsc2UgeworICAgIG1fR2VuTnVtID0gKEZYX0RXT1JEKS0xOwogICAgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOwotICAgIG1fRmlsZU9mZnNldCA9IDA7Ci19Ci12b2lkIENQREZfU3RyZWFtOjpJbml0U3RyZWFtKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQotewotICAgIEluaXRTdHJlYW0ocERpY3QpOwotICAgIG1fR2VuTnVtID0gKEZYX0RXT1JEKSAtIDE7CisgIH0KKyAgaWYgKGJLZWVwQnVmKSB7CisgICAgbV9wRGF0YUJ1ZiA9ICh1aW50OF90KilwRGF0YTsKKyAgfSBlbHNlIHsKICAgICBtX3BEYXRhQnVmID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7CiAgICAgaWYgKHBEYXRhKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BEYXRhQnVmLCBwRGF0YSwgc2l6ZSk7CisgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YUJ1ZiwgcERhdGEsIHNpemUpOwogICAgIH0KLSAgICBtX2R3U2l6ZSA9IHNpemU7Ci0gICAgaWYgKG1fcERpY3QpIHsKLSAgICAgICAgbV9wRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSwgc2l6ZSk7Ci0gICAgfQorICB9CisgIG1fZHdTaXplID0gc2l6ZTsKKyAgaWYgKG1fcERpY3QgPT0gTlVMTCkgeworICAgIG1fcERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICB9CisgIG1fcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIHNpemUpOworICBpZiAoIWJDb21wcmVzc2VkKSB7CisgICAgbV9wRGljdC0+UmVtb3ZlQXQoRlhfQlNUUkMoIkZpbHRlciIpKTsKKyAgICBtX3BEaWN0LT5SZW1vdmVBdChGWF9CU1RSQygiRGVjb2RlUGFybXMiKSk7CisgIH0KIH0KLXZvaWQgQ1BERl9TdHJlYW06OlNldERhdGEoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYkNvbXByZXNzZWQsIEZYX0JPT0wgYktlZXBCdWYpCi17Ci0gICAgaWYgKG1fR2VuTnVtID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgIGlmIChtX3BEYXRhQnVmKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcERhdGFCdWYpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9HZW5OdW0gPSAoRlhfRFdPUkQpIC0gMTsKLSAgICAgICAgbV9wQ3J5cHRvSGFuZGxlciA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChiS2VlcEJ1ZikgewotICAgICAgICBtX3BEYXRhQnVmID0gKHVpbnQ4X3QqKXBEYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERhdGFCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKLSAgICAgICAgaWYgKHBEYXRhKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YUJ1ZiwgcERhdGEsIHNpemUpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fZHdTaXplID0gc2l6ZTsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIH0KLSAgICBtX3BEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBzaXplKTsKLSAgICBpZiAoIWJDb21wcmVzc2VkKSB7Ci0gICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KEZYX0JTVFJDKCJGaWx0ZXIiKSk7Ci0gICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KEZYX0JTVFJDKCJEZWNvZGVQYXJtcyIpKTsKLSAgICB9CitGWF9CT09MIENQREZfU3RyZWFtOjpSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplKSBjb25zdCB7CisgIGlmICgobV9HZW5OdW0gIT0gKEZYX0RXT1JEKS0xKSAmJiBtX3BGaWxlKSB7CisgICAgcmV0dXJuIG1fcEZpbGUtPlJlYWRCbG9jayhidWYsIG1fRmlsZU9mZnNldCArIG9mZnNldCwgc2l6ZSk7CisgIH0KKyAgaWYgKG1fcERhdGFCdWYpIHsKKyAgICBGWFNZU19tZW1jcHkoYnVmLCBtX3BEYXRhQnVmICsgb2Zmc2V0LCBzaXplKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9TdHJlYW06OlJlYWRSYXdEYXRhKEZYX0ZJTEVTSVpFIG9mZnNldCwgdWludDhfdCogYnVmLCBGWF9EV09SRCBzaXplKSBjb25zdAotewotICAgIGlmICgobV9HZW5OdW0gIT0gKEZYX0RXT1JEKSAtIDEpICYmIG1fcEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIG1fcEZpbGUtPlJlYWRCbG9jayhidWYsIG1fRmlsZU9mZnNldCArIG9mZnNldCwgc2l6ZSk7Cit2b2lkIENQREZfU3RyZWFtOjpJbml0U3RyZWFtKElGWF9GaWxlUmVhZCogcEZpbGUsIENQREZfRGljdGlvbmFyeSogcERpY3QpIHsKKyAgSW5pdFN0cmVhbShwRGljdCk7CisgIG1fcEZpbGUgPSBwRmlsZTsKKyAgbV9kd1NpemUgPSAoRlhfRFdPUkQpcEZpbGUtPkdldFNpemUoKTsKKyAgaWYgKG1fcERpY3QpIHsKKyAgICBtX3BEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBtX2R3U2l6ZSk7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9TdHJlYW06OklkZW50aWNhbChDUERGX1N0cmVhbSogcE90aGVyKSBjb25zdCB7CisgIGlmICghbV9wRGljdCkKKyAgICByZXR1cm4gcE90aGVyLT5tX3BEaWN0ID8gRkFMU0UgOiBUUlVFOworCisgIGlmICghbV9wRGljdC0+SWRlbnRpY2FsKHBPdGhlci0+bV9wRGljdCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fZHdTaXplICE9IHBPdGhlci0+bV9kd1NpemUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fR2VuTnVtICE9IChGWF9EV09SRCktMSAmJiBwT3RoZXItPm1fR2VuTnVtICE9IChGWF9EV09SRCktMSkgeworICAgIGlmIChtX3BGaWxlID09IHBPdGhlci0+bV9wRmlsZSAmJiBtX3BGaWxlID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBpZiAobV9wRGF0YUJ1ZikgewotICAgICAgICBGWFNZU19tZW1jcHkoYnVmLCBtX3BEYXRhQnVmICsgb2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoIW1fcEZpbGUgfHwgIXBPdGhlci0+bV9wRmlsZSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICB1aW50OF90IHNyY0J1ZlsxMDI0XTsKKyAgICB1aW50OF90IGRlc3RCdWZbMTAyNF07CisgICAgRlhfRFdPUkQgc2l6ZSA9IG1fZHdTaXplOworICAgIEZYX0RXT1JEIHNyY09mZnNldCA9IG1fRmlsZU9mZnNldDsKKyAgICBGWF9EV09SRCBkZXN0T2Zmc2V0ID0gcE90aGVyLT5tX0ZpbGVPZmZzZXQ7CisgICAgaWYgKG1fcEZpbGUgPT0gcE90aGVyLT5tX3BGaWxlICYmIHNyY09mZnNldCA9PSBkZXN0T2Zmc2V0KSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICBGWF9EV09SRCBhY3R1YWxTaXplID0gc2l6ZSA+IDEwMjQgPyAxMDI0IDogc2l6ZTsKKyAgICAgIG1fcEZpbGUtPlJlYWRCbG9jayhzcmNCdWYsIHNyY09mZnNldCwgYWN0dWFsU2l6ZSk7CisgICAgICBwT3RoZXItPm1fcEZpbGUtPlJlYWRCbG9jayhkZXN0QnVmLCBkZXN0T2Zmc2V0LCBhY3R1YWxTaXplKTsKKyAgICAgIGlmIChGWFNZU19tZW1jbXAoc3JjQnVmLCBkZXN0QnVmLCBhY3R1YWxTaXplKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIHNpemUgLT0gYWN0dWFsU2l6ZTsKKyAgICAgIHNyY09mZnNldCArPSBhY3R1YWxTaXplOworICAgICAgZGVzdE9mZnNldCArPSBhY3R1YWxTaXplOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ1BERl9TdHJlYW06OkluaXRTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLXsKLSAgICBJbml0U3RyZWFtKHBEaWN0KTsKLSAgICBtX3BGaWxlID0gcEZpbGU7Ci0gICAgbV9kd1NpemUgPSAoRlhfRFdPUkQpcEZpbGUtPkdldFNpemUoKTsKLSAgICBpZiAobV9wRGljdCkgewotICAgICAgICBtX3BEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBtX2R3U2l6ZSk7CisgIH0KKyAgaWYgKG1fR2VuTnVtICE9IChGWF9EV09SRCktMSB8fCBwT3RoZXItPm1fR2VuTnVtICE9IChGWF9EV09SRCktMSkgeworICAgIElGWF9GaWxlUmVhZCogcEZpbGUgPSBOVUxMOworICAgIHVpbnQ4X3QqIHBCdWYgPSBOVUxMOworICAgIEZYX0RXT1JEIG9mZnNldCA9IDA7CisgICAgaWYgKG1fR2VuTnVtICE9IChGWF9EV09SRCktMSkgeworICAgICAgcEZpbGUgPSBtX3BGaWxlOworICAgICAgcEJ1ZiA9IHBPdGhlci0+bV9wRGF0YUJ1ZjsKKyAgICAgIG9mZnNldCA9IG1fRmlsZU9mZnNldDsKICAgICB9Ci19Ci1GWF9CT09MIENQREZfU3RyZWFtOjpJZGVudGljYWwoQ1BERl9TdHJlYW0qIHBPdGhlcikgY29uc3QKLXsKLSAgICBpZiAoIW1fcERpY3QpCi0gICAgICAgIHJldHVybiBwT3RoZXItPm1fcERpY3QgPyBGQUxTRSA6IFRSVUU7Ci0KLSAgICBpZiAoIW1fcERpY3QtPklkZW50aWNhbChwT3RoZXItPm1fcERpY3QpKSB7CisgICAgaWYgKHBPdGhlci0+bV9HZW5OdW0gIT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICBwRmlsZSA9IHBPdGhlci0+bV9wRmlsZTsKKyAgICAgIHBCdWYgPSBtX3BEYXRhQnVmOworICAgICAgb2Zmc2V0ID0gcE90aGVyLT5tX0ZpbGVPZmZzZXQ7CisgICAgfQorICAgIGlmIChOVUxMID09IHBCdWYpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgdWludDhfdCBzcmNCdWZbMTAyNF07CisgICAgRlhfRFdPUkQgc2l6ZSA9IG1fZHdTaXplOworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgRlhfRFdPUkQgYWN0dWFsU2l6ZSA9IHN0ZDo6bWluKHNpemUsIDEwMjRVKTsKKyAgICAgIHBGaWxlLT5SZWFkQmxvY2soc3JjQnVmLCBvZmZzZXQsIGFjdHVhbFNpemUpOworICAgICAgaWYgKEZYU1lTX21lbWNtcChzcmNCdWYsIHBCdWYsIGFjdHVhbFNpemUpICE9IDApIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgcEJ1ZiArPSBhY3R1YWxTaXplOworICAgICAgc2l6ZSAtPSBhY3R1YWxTaXplOworICAgICAgb2Zmc2V0ICs9IGFjdHVhbFNpemU7CiAgICAgfQotICAgIGlmIChtX2R3U2l6ZSAhPSBwT3RoZXItPm1fZHdTaXplKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fR2VuTnVtICE9IChGWF9EV09SRCkgLSAxICYmIHBPdGhlci0+bV9HZW5OdW0gIT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgaWYgKG1fcEZpbGUgPT0gcE90aGVyLT5tX3BGaWxlICYmIG1fcEZpbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX3BGaWxlIHx8ICFwT3RoZXItPm1fcEZpbGUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IHNyY0J1ZlsxMDI0XTsKLSAgICAgICAgdWludDhfdCBkZXN0QnVmWzEwMjRdOwotICAgICAgICBGWF9EV09SRCBzaXplID0gbV9kd1NpemU7Ci0gICAgICAgIEZYX0RXT1JEIHNyY09mZnNldCA9IG1fRmlsZU9mZnNldDsKLSAgICAgICAgRlhfRFdPUkQgZGVzdE9mZnNldCA9IHBPdGhlci0+bV9GaWxlT2Zmc2V0OwotICAgICAgICBpZiAobV9wRmlsZSA9PSBwT3RoZXItPm1fcEZpbGUgJiYgc3JjT2Zmc2V0ID09IGRlc3RPZmZzZXQpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChzaXplID4gMCkgewotICAgICAgICAgICAgRlhfRFdPUkQgYWN0dWFsU2l6ZSA9IHNpemUgPiAxMDI0ID8gMTAyNCA6IHNpemU7Ci0gICAgICAgICAgICBtX3BGaWxlLT5SZWFkQmxvY2soc3JjQnVmLCBzcmNPZmZzZXQsIGFjdHVhbFNpemUpOwotICAgICAgICAgICAgcE90aGVyLT5tX3BGaWxlLT5SZWFkQmxvY2soZGVzdEJ1ZiwgZGVzdE9mZnNldCwgYWN0dWFsU2l6ZSk7Ci0gICAgICAgICAgICBpZiAoRlhTWVNfbWVtY21wKHNyY0J1ZiwgZGVzdEJ1ZiwgYWN0dWFsU2l6ZSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemUgLT0gYWN0dWFsU2l6ZTsKLSAgICAgICAgICAgIHNyY09mZnNldCArPSBhY3R1YWxTaXplOwotICAgICAgICAgICAgZGVzdE9mZnNldCArPSBhY3R1YWxTaXplOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAobV9HZW5OdW0gIT0gKEZYX0RXT1JEKSAtIDEgfHwgcE90aGVyLT5tX0dlbk51bSAhPSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlID0gTlVMTDsKLSAgICAgICAgdWludDhfdCogcEJ1ZiA9IE5VTEw7Ci0gICAgICAgIEZYX0RXT1JEIG9mZnNldCA9IDA7Ci0gICAgICAgIGlmIChtX0dlbk51bSAhPSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgcEZpbGUgPSBtX3BGaWxlOwotICAgICAgICAgICAgcEJ1ZiA9IHBPdGhlci0+bV9wRGF0YUJ1ZjsKLSAgICAgICAgICAgIG9mZnNldCA9IG1fRmlsZU9mZnNldDsKLSAgICAgICAgfQotICAgICAgICBpZiAocE90aGVyLT5tX0dlbk51bSAhPSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgcEZpbGUgPSBwT3RoZXItPm1fcEZpbGU7Ci0gICAgICAgICAgICBwQnVmID0gbV9wRGF0YUJ1ZjsKLSAgICAgICAgICAgIG9mZnNldCA9IHBPdGhlci0+bV9GaWxlT2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChOVUxMID09IHBCdWYpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IHNyY0J1ZlsxMDI0XTsKLSAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IG1fZHdTaXplOwotICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGFjdHVhbFNpemUgPSBzdGQ6Om1pbihzaXplLCAxMDI0VSk7Ci0gICAgICAgICAgICBwRmlsZS0+UmVhZEJsb2NrKHNyY0J1Ziwgb2Zmc2V0LCBhY3R1YWxTaXplKTsKLSAgICAgICAgICAgIGlmIChGWFNZU19tZW1jbXAoc3JjQnVmLCBwQnVmLCBhY3R1YWxTaXplKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEJ1ZiArPSBhY3R1YWxTaXplOwotICAgICAgICAgICAgc2l6ZSAtPSBhY3R1YWxTaXplOwotICAgICAgICAgICAgb2Zmc2V0ICs9IGFjdHVhbFNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGWFNZU19tZW1jbXAobV9wRGF0YUJ1ZiwgcE90aGVyLT5tX3BEYXRhQnVmLCBtX2R3U2l6ZSkgPT0gMDsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRlhTWVNfbWVtY21wKG1fcERhdGFCdWYsIHBPdGhlci0+bV9wRGF0YUJ1ZiwgbV9kd1NpemUpID09IDA7CiB9Ci1DUERGX1N0cmVhbSogQ1BERl9TdHJlYW06OkNsb25lKEZYX0JPT0wgYkRpcmVjdCwgRlBERl9MUEZDbG9uZVN0cmVhbUNhbGxiYWNrIGxwZkNhbGxiYWNrLCB2b2lkKiBwVXNlckRhdGEpIGNvbnN0Ci17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwQ2xvbmVEaWN0ID0gKENQREZfRGljdGlvbmFyeSopbV9wRGljdC0+Q2xvbmUoYkRpcmVjdCk7Ci0gICAgSUZYX0ZpbGVTdHJlYW0gKnBGUyA9IE5VTEw7Ci0gICAgaWYgKGxwZkNhbGxiYWNrKSB7Ci0gICAgICAgIHBGUyA9IGxwZkNhbGxiYWNrKChDUERGX1N0cmVhbSopdGhpcywgcFVzZXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKCFwRlMpIHsKLSAgICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgICAgICBhY2MuTG9hZEFsbERhdGEodGhpcywgVFJVRSk7Ci0gICAgICAgIEZYX0RXT1JEIHN0cmVhbVNpemUgPSBhY2MuR2V0U2l6ZSgpOwotICAgICAgICByZXR1cm4gbmV3IENQREZfU3RyZWFtKGFjYy5EZXRhY2hEYXRhKCksIHN0cmVhbVNpemUsIHBDbG9uZURpY3QpOwotICAgIH0KLSAgICBDUERGX1N0cmVhbSogcE9iaiA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKLSAgICBDUERGX1N0cmVhbUZpbHRlciAqcFNGID0gR2V0U3RyZWFtRmlsdGVyKFRSVUUpOwotICAgIGlmIChwU0YpIHsKLSAgICAgICAgdWludDhfdCogcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIDQwOTYpOwotICAgICAgICBGWF9EV09SRCBkd1JlYWQ7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGR3UmVhZCA9IHBTRi0+UmVhZEJsb2NrKHBCdWYsIDQwOTYpOwotICAgICAgICAgICAgaWYgKGR3UmVhZCkgewotICAgICAgICAgICAgICAgIHBGUy0+V3JpdGVCbG9jayhwQnVmLCBkd1JlYWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChkd1JlYWQgPT0gNDA5Nik7Ci0gICAgICAgIHBGUy0+Rmx1c2goKTsKLSAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgZGVsZXRlIHBTRjsKLSAgICB9Ci0gICAgcE9iai0+SW5pdFN0cmVhbSgoSUZYX0ZpbGVSZWFkKilwRlMsIHBDbG9uZURpY3QpOwotICAgIHJldHVybiBwT2JqOworQ1BERl9TdHJlYW0qIENQREZfU3RyZWFtOjpDbG9uZShGWF9CT09MIGJEaXJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTFBGQ2xvbmVTdHJlYW1DYWxsYmFjayBscGZDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKSBjb25zdCB7CisgIENQREZfRGljdGlvbmFyeSogcENsb25lRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKW1fcERpY3QtPkNsb25lKGJEaXJlY3QpOworICBJRlhfRmlsZVN0cmVhbSogcEZTID0gTlVMTDsKKyAgaWYgKGxwZkNhbGxiYWNrKSB7CisgICAgcEZTID0gbHBmQ2FsbGJhY2soKENQREZfU3RyZWFtKil0aGlzLCBwVXNlckRhdGEpOworICB9CisgIGlmICghcEZTKSB7CisgICAgQ1BERl9TdHJlYW1BY2MgYWNjOworICAgIGFjYy5Mb2FkQWxsRGF0YSh0aGlzLCBUUlVFKTsKKyAgICBGWF9EV09SRCBzdHJlYW1TaXplID0gYWNjLkdldFNpemUoKTsKKyAgICByZXR1cm4gbmV3IENQREZfU3RyZWFtKGFjYy5EZXRhY2hEYXRhKCksIHN0cmVhbVNpemUsIHBDbG9uZURpY3QpOworICB9CisgIENQREZfU3RyZWFtKiBwT2JqID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICBDUERGX1N0cmVhbUZpbHRlciogcFNGID0gR2V0U3RyZWFtRmlsdGVyKFRSVUUpOworICBpZiAocFNGKSB7CisgICAgdWludDhfdCogcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIDQwOTYpOworICAgIEZYX0RXT1JEIGR3UmVhZDsKKyAgICBkbyB7CisgICAgICBkd1JlYWQgPSBwU0YtPlJlYWRCbG9jayhwQnVmLCA0MDk2KTsKKyAgICAgIGlmIChkd1JlYWQpIHsKKyAgICAgICAgcEZTLT5Xcml0ZUJsb2NrKHBCdWYsIGR3UmVhZCk7CisgICAgICB9CisgICAgfSB3aGlsZSAoZHdSZWFkID09IDQwOTYpOworICAgIHBGUy0+Rmx1c2goKTsKKyAgICBGWF9GcmVlKHBCdWYpOworICAgIGRlbGV0ZSBwU0Y7CisgIH0KKyAgcE9iai0+SW5pdFN0cmVhbSgoSUZYX0ZpbGVSZWFkKilwRlMsIHBDbG9uZURpY3QpOworICByZXR1cm4gcE9iajsKIH0KLWV4dGVybiBGWF9CT09MIFBERl9EYXRhRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplLCBDRlhfQnl0ZVN0cmluZyYgSW1hZ2VFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSomIHBJbWFnZVBhcm1zLCBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwgRlhfQk9PTCBiSW1hZ2VBY2MpOwotQ1BERl9TdHJlYW1BY2M6OkNQREZfU3RyZWFtQWNjKCkKLXsKLSAgICBtX2JOZXdCdWYgPSBGQUxTRTsKK2V4dGVybiBGWF9CT09MIFBERl9EYXRhRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIEltYWdlRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqJiBwSW1hZ2VQYXJtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1hZ2VBY2MpOworQ1BERl9TdHJlYW1BY2M6OkNQREZfU3RyZWFtQWNjKCkgeworICBtX2JOZXdCdWYgPSBGQUxTRTsKKyAgbV9wRGF0YSA9IE5VTEw7CisgIG1fZHdTaXplID0gMDsKKyAgbV9wSW1hZ2VQYXJhbSA9IE5VTEw7CisgIG1fcFN0cmVhbSA9IE5VTEw7CisgIG1fcFNyY0RhdGEgPSBOVUxMOworfQordm9pZCBDUERGX1N0cmVhbUFjYzo6TG9hZEFsbERhdGEoY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSYXdBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltYWdlQWNjKSB7CisgIGlmIChwU3RyZWFtID09IE5VTEwgfHwgcFN0cmVhbS0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wU3RyZWFtID0gcFN0cmVhbTsKKyAgaWYgKHBTdHJlYW0tPklzTWVtb3J5QmFzZWQoKSAmJgorICAgICAgKCFwU3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KEZYX0JTVFJDKCJGaWx0ZXIiKSkgfHwgYlJhd0FjY2VzcykpIHsKKyAgICBtX2R3U2l6ZSA9IHBTdHJlYW0tPm1fZHdTaXplOworICAgIG1fcERhdGEgPSAodWludDhfdCopcFN0cmVhbS0+bV9wRGF0YUJ1ZjsKKyAgICByZXR1cm47CisgIH0KKyAgdWludDhfdCogcFNyY0RhdGE7CisgIEZYX0RXT1JEIGR3U3JjU2l6ZSA9IHBTdHJlYW0tPm1fZHdTaXplOworICBpZiAoZHdTcmNTaXplID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwU3RyZWFtLT5Jc01lbW9yeUJhc2VkKCkpIHsKKyAgICBwU3JjRGF0YSA9IG1fcFNyY0RhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBkd1NyY1NpemUpOworICAgIGlmICghcFN0cmVhbS0+UmVhZFJhd0RhdGEoMCwgcFNyY0RhdGEsIGR3U3JjU2l6ZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcFNyY0RhdGEgPSBwU3RyZWFtLT5tX3BEYXRhQnVmOworICB9CisgIHVpbnQ4X3QqIHBEZWNyeXB0ZWREYXRhOworICBGWF9EV09SRCBkd0RlY3J5cHRlZFNpemU7CisgIGlmIChwU3RyZWFtLT5tX3BDcnlwdG9IYW5kbGVyKSB7CisgICAgQ0ZYX0JpbmFyeUJ1ZiBkZXN0X2J1ZjsKKyAgICBkZXN0X2J1Zi5Fc3RpbWF0ZVNpemUocFN0cmVhbS0+bV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdEdldFNpemUoZHdTcmNTaXplKSk7CisgICAgdm9pZCogY29udGV4dCA9IHBTdHJlYW0tPm1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHRTdGFydCgKKyAgICAgICAgcFN0cmVhbS0+R2V0T2JqTnVtKCksIHBTdHJlYW0tPm1fR2VuTnVtKTsKKyAgICBwU3RyZWFtLT5tX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0U3RyZWFtKGNvbnRleHQsIHBTcmNEYXRhLCBkd1NyY1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1Zik7CisgICAgcFN0cmVhbS0+bV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdEZpbmlzaChjb250ZXh0LCBkZXN0X2J1Zik7CisgICAgcERlY3J5cHRlZERhdGEgPSBkZXN0X2J1Zi5HZXRCdWZmZXIoKTsKKyAgICBkd0RlY3J5cHRlZFNpemUgPSBkZXN0X2J1Zi5HZXRTaXplKCk7CisgICAgZGVzdF9idWYuRGV0YWNoQnVmZmVyKCk7CisgIH0gZWxzZSB7CisgICAgcERlY3J5cHRlZERhdGEgPSBwU3JjRGF0YTsKKyAgICBkd0RlY3J5cHRlZFNpemUgPSBkd1NyY1NpemU7CisgIH0KKyAgaWYgKCFwU3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KEZYX0JTVFJDKCJGaWx0ZXIiKSkgfHwgYlJhd0FjY2VzcykgeworICAgIG1fcERhdGEgPSBwRGVjcnlwdGVkRGF0YTsKKyAgICBtX2R3U2l6ZSA9IGR3RGVjcnlwdGVkU2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBGWF9CT09MIGJSZXQgPSBQREZfRGF0YURlY29kZSgKKyAgICAgICAgcERlY3J5cHRlZERhdGEsIGR3RGVjcnlwdGVkU2l6ZSwgbV9wU3RyZWFtLT5HZXREaWN0KCksIG1fcERhdGEsCisgICAgICAgIG1fZHdTaXplLCBtX0ltYWdlRGVjb2RlciwgbV9wSW1hZ2VQYXJhbSwgZXN0aW1hdGVkX3NpemUsIGJJbWFnZUFjYyk7CisgICAgaWYgKCFiUmV0KSB7CisgICAgICBtX3BEYXRhID0gcERlY3J5cHRlZERhdGE7CisgICAgICBtX2R3U2l6ZSA9IGR3RGVjcnlwdGVkU2l6ZTsKKyAgICB9CisgIH0KKyAgaWYgKHBTcmNEYXRhICE9IHBTdHJlYW0tPm1fcERhdGFCdWYgJiYgcFNyY0RhdGEgIT0gbV9wRGF0YSkgeworICAgIEZYX0ZyZWUocFNyY0RhdGEpOworICB9CisgIGlmIChwRGVjcnlwdGVkRGF0YSAhPSBwU3JjRGF0YSAmJiBwRGVjcnlwdGVkRGF0YSAhPSBtX3BEYXRhKSB7CisgICAgRlhfRnJlZShwRGVjcnlwdGVkRGF0YSk7CisgIH0KKyAgbV9wU3JjRGF0YSA9IE5VTEw7CisgIG1fYk5ld0J1ZiA9IG1fcERhdGEgIT0gcFN0cmVhbS0+bV9wRGF0YUJ1ZjsKK30KK0NQREZfU3RyZWFtQWNjOjp+Q1BERl9TdHJlYW1BY2MoKSB7CisgIGlmIChtX2JOZXdCdWYgJiYgbV9wRGF0YSkgeworICAgIEZYX0ZyZWUobV9wRGF0YSk7CisgIH0KKyAgaWYgKG1fcFNyY0RhdGEpIHsKKyAgICBGWF9GcmVlKG1fcFNyY0RhdGEpOworICB9Cit9Citjb25zdCB1aW50OF90KiBDUERGX1N0cmVhbUFjYzo6R2V0RGF0YSgpIGNvbnN0IHsKKyAgaWYgKG1fYk5ld0J1ZikgeworICAgIHJldHVybiBtX3BEYXRhOworICB9CisgIGlmICghbV9wU3RyZWFtKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG1fcFN0cmVhbS0+bV9wRGF0YUJ1ZjsKK30KK0ZYX0RXT1JEIENQREZfU3RyZWFtQWNjOjpHZXRTaXplKCkgY29uc3QgeworICBpZiAobV9iTmV3QnVmKSB7CisgICAgcmV0dXJuIG1fZHdTaXplOworICB9CisgIGlmICghbV9wU3RyZWFtKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIG1fcFN0cmVhbS0+bV9kd1NpemU7Cit9Cit1aW50OF90KiBDUERGX1N0cmVhbUFjYzo6RGV0YWNoRGF0YSgpIHsKKyAgaWYgKG1fYk5ld0J1ZikgeworICAgIHVpbnQ4X3QqIHAgPSBtX3BEYXRhOwogICAgIG1fcERhdGEgPSBOVUxMOwogICAgIG1fZHdTaXplID0gMDsKLSAgICBtX3BJbWFnZVBhcmFtID0gTlVMTDsKLSAgICBtX3BTdHJlYW0gPSBOVUxMOwotICAgIG1fcFNyY0RhdGEgPSBOVUxMOwotfQotdm9pZCBDUERGX1N0cmVhbUFjYzo6TG9hZEFsbERhdGEoY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYlJhd0FjY2VzcywgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbWFnZUFjYykKLXsKLSAgICBpZiAocFN0cmVhbSA9PSBOVUxMIHx8IHBTdHJlYW0tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wU3RyZWFtID0gcFN0cmVhbTsKLSAgICBpZiAocFN0cmVhbS0+SXNNZW1vcnlCYXNlZCgpICYmCi0gICAgICAgICAgICAoIXBTdHJlYW0tPkdldERpY3QoKS0+S2V5RXhpc3QoRlhfQlNUUkMoIkZpbHRlciIpKSB8fCBiUmF3QWNjZXNzKSkgewotICAgICAgICBtX2R3U2l6ZSA9IHBTdHJlYW0tPm1fZHdTaXplOwotICAgICAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKXBTdHJlYW0tPm1fcERhdGFCdWY7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdWludDhfdCogcFNyY0RhdGE7Ci0gICAgRlhfRFdPUkQgZHdTcmNTaXplID0gcFN0cmVhbS0+bV9kd1NpemU7Ci0gICAgaWYgKGR3U3JjU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFwU3RyZWFtLT5Jc01lbW9yeUJhc2VkKCkpIHsKLSAgICAgICAgcFNyY0RhdGEgPSBtX3BTcmNEYXRhID0gRlhfQWxsb2ModWludDhfdCwgZHdTcmNTaXplKTsKLSAgICAgICAgaWYgKCFwU3RyZWFtLT5SZWFkUmF3RGF0YSgwLCBwU3JjRGF0YSwgZHdTcmNTaXplKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcFNyY0RhdGEgPSBwU3RyZWFtLT5tX3BEYXRhQnVmOwotICAgIH0KLSAgICB1aW50OF90KiBwRGVjcnlwdGVkRGF0YTsKLSAgICBGWF9EV09SRCBkd0RlY3J5cHRlZFNpemU7Ci0gICAgaWYgKHBTdHJlYW0tPm1fcENyeXB0b0hhbmRsZXIpIHsKLSAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiBkZXN0X2J1ZjsKLSAgICAgICAgZGVzdF9idWYuRXN0aW1hdGVTaXplKHBTdHJlYW0tPm1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHRHZXRTaXplKGR3U3JjU2l6ZSkpOwotICAgICAgICB2b2lkKiBjb250ZXh0ID0gcFN0cmVhbS0+bV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdFN0YXJ0KHBTdHJlYW0tPkdldE9iak51bSgpLCBwU3RyZWFtLT5tX0dlbk51bSk7Ci0gICAgICAgIHBTdHJlYW0tPm1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHRTdHJlYW0oY29udGV4dCwgcFNyY0RhdGEsIGR3U3JjU2l6ZSwgZGVzdF9idWYpOwotICAgICAgICBwU3RyZWFtLT5tX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0RmluaXNoKGNvbnRleHQsIGRlc3RfYnVmKTsKLSAgICAgICAgcERlY3J5cHRlZERhdGEgPSBkZXN0X2J1Zi5HZXRCdWZmZXIoKTsKLSAgICAgICAgZHdEZWNyeXB0ZWRTaXplID0gZGVzdF9idWYuR2V0U2l6ZSgpOwotICAgICAgICBkZXN0X2J1Zi5EZXRhY2hCdWZmZXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwRGVjcnlwdGVkRGF0YSA9IHBTcmNEYXRhOwotICAgICAgICBkd0RlY3J5cHRlZFNpemUgPSBkd1NyY1NpemU7Ci0gICAgfQotICAgIGlmICghcFN0cmVhbS0+R2V0RGljdCgpLT5LZXlFeGlzdChGWF9CU1RSQygiRmlsdGVyIikpIHx8IGJSYXdBY2Nlc3MpIHsKLSAgICAgICAgbV9wRGF0YSA9IHBEZWNyeXB0ZWREYXRhOwotICAgICAgICBtX2R3U2l6ZSA9IGR3RGVjcnlwdGVkU2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWF9CT09MIGJSZXQgPSBQREZfRGF0YURlY29kZShwRGVjcnlwdGVkRGF0YSwgZHdEZWNyeXB0ZWRTaXplLCBtX3BTdHJlYW0tPkdldERpY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGF0YSwgbV9kd1NpemUsIG1fSW1hZ2VEZWNvZGVyLCBtX3BJbWFnZVBhcmFtLCBlc3RpbWF0ZWRfc2l6ZSwgYkltYWdlQWNjKTsKLSAgICAgICAgaWYgKCFiUmV0KSB7Ci0gICAgICAgICAgICBtX3BEYXRhID0gcERlY3J5cHRlZERhdGE7Ci0gICAgICAgICAgICBtX2R3U2l6ZSA9IGR3RGVjcnlwdGVkU2l6ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocFNyY0RhdGEgIT0gcFN0cmVhbS0+bV9wRGF0YUJ1ZiAmJiBwU3JjRGF0YSAhPSBtX3BEYXRhKSB7Ci0gICAgICAgIEZYX0ZyZWUocFNyY0RhdGEpOwotICAgIH0KLSAgICBpZiAocERlY3J5cHRlZERhdGEgIT0gcFNyY0RhdGEgJiYgcERlY3J5cHRlZERhdGEgIT0gbV9wRGF0YSkgewotICAgICAgICBGWF9GcmVlKHBEZWNyeXB0ZWREYXRhKTsKLSAgICB9Ci0gICAgbV9wU3JjRGF0YSA9IE5VTEw7Ci0gICAgbV9iTmV3QnVmID0gbV9wRGF0YSAhPSBwU3RyZWFtLT5tX3BEYXRhQnVmOwotfQotQ1BERl9TdHJlYW1BY2M6On5DUERGX1N0cmVhbUFjYygpCi17Ci0gICAgaWYgKG1fYk5ld0J1ZiAmJiBtX3BEYXRhKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRGF0YSk7Ci0gICAgfQotICAgIGlmIChtX3BTcmNEYXRhKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wU3JjRGF0YSk7Ci0gICAgfQotfQotY29uc3QgdWludDhfdCogQ1BERl9TdHJlYW1BY2M6OkdldERhdGEoKSBjb25zdAotewotICAgIGlmIChtX2JOZXdCdWYpIHsKLSAgICAgICAgcmV0dXJuIG1fcERhdGE7Ci0gICAgfQotICAgIGlmICghbV9wU3RyZWFtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbV9wU3RyZWFtLT5tX3BEYXRhQnVmOwotfQotRlhfRFdPUkQgQ1BERl9TdHJlYW1BY2M6OkdldFNpemUoKSBjb25zdAotewotICAgIGlmIChtX2JOZXdCdWYpIHsKLSAgICAgICAgcmV0dXJuIG1fZHdTaXplOwotICAgIH0KLSAgICBpZiAoIW1fcFN0cmVhbSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcFN0cmVhbS0+bV9kd1NpemU7Ci19Ci11aW50OF90KiBDUERGX1N0cmVhbUFjYzo6RGV0YWNoRGF0YSgpCi17Ci0gICAgaWYgKG1fYk5ld0J1ZikgewotICAgICAgICB1aW50OF90KiBwID0gbV9wRGF0YTsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgICAgIG1fZHdTaXplID0gMDsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotICAgIHVpbnQ4X3QqIHAgPSBGWF9BbGxvYyh1aW50OF90LCBtX2R3U2l6ZSk7Ci0gICAgRlhTWVNfbWVtY3B5KHAsIG1fcERhdGEsIG1fZHdTaXplKTsKICAgICByZXR1cm4gcDsKKyAgfQorICB1aW50OF90KiBwID0gRlhfQWxsb2ModWludDhfdCwgbV9kd1NpemUpOworICBGWFNZU19tZW1jcHkocCwgbV9wRGF0YSwgbV9kd1NpemUpOworICByZXR1cm4gcDsKIH0KLXZvaWQgQ1BERl9SZWZlcmVuY2U6OlNldFJlZihDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgRlhfRFdPUkQgb2JqbnVtKQotewotICAgIG1fcE9iakxpc3QgPSBwRG9jOwotICAgIG1fUmVmT2JqTnVtID0gb2JqbnVtOwordm9pZCBDUERGX1JlZmVyZW5jZTo6U2V0UmVmKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pIHsKKyAgbV9wT2JqTGlzdCA9IHBEb2M7CisgIG1fUmVmT2JqTnVtID0gb2JqbnVtOwogfQotQ1BERl9JbmRpcmVjdE9iamVjdHM6OkNQREZfSW5kaXJlY3RPYmplY3RzKENQREZfUGFyc2VyKiBwUGFyc2VyKQotewotICAgIG1fcFBhcnNlciA9IHBQYXJzZXI7Ci0gICAgbV9JbmRpcmVjdE9ianMuSW5pdEhhc2hUYWJsZSgxMDEzKTsKLSAgICBpZiAocFBhcnNlcikgewotICAgICAgICBtX0xhc3RPYmpOdW0gPSBtX3BQYXJzZXItPkdldExhc3RPYmpOdW0oKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX0xhc3RPYmpOdW0gPSAwOwotICAgIH0KK0NQREZfSW5kaXJlY3RPYmplY3RzOjpDUERGX0luZGlyZWN0T2JqZWN0cyhDUERGX1BhcnNlciogcFBhcnNlcikgeworICBtX3BQYXJzZXIgPSBwUGFyc2VyOworICBtX0luZGlyZWN0T2Jqcy5Jbml0SGFzaFRhYmxlKDEwMTMpOworICBpZiAocFBhcnNlcikgeworICAgIG1fTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOworICB9IGVsc2UgeworICAgIG1fTGFzdE9iak51bSA9IDA7CisgIH0KIH0KLUNQREZfSW5kaXJlY3RPYmplY3RzOjp+Q1BERl9JbmRpcmVjdE9iamVjdHMoKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fSW5kaXJlY3RPYmpzLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIHZvaWQqIGtleTsKLSAgICAgICAgdm9pZCogdmFsdWU7Ci0gICAgICAgIG1fSW5kaXJlY3RPYmpzLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICAoKENQREZfT2JqZWN0Kil2YWx1ZSktPkRlc3Ryb3koKTsKLSAgICB9Ci19Ci1DUERGX09iamVjdCogQ1BERl9JbmRpcmVjdE9iamVjdHM6OkdldEluZGlyZWN0T2JqZWN0KEZYX0RXT1JEIG9iam51bSwgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KQotewotICAgIGlmIChvYmpudW0gPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CitDUERGX0luZGlyZWN0T2JqZWN0czo6fkNQREZfSW5kaXJlY3RPYmplY3RzKCkgeworICBGWF9QT1NJVElPTiBwb3MgPSBtX0luZGlyZWN0T2Jqcy5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICB2b2lkKiBrZXk7CiAgICAgdm9pZCogdmFsdWU7Ci0gICAgewotICAgICAgICBpZiAobV9JbmRpcmVjdE9ianMuTG9va3VwKCh2b2lkKikodWludHB0cl90KW9iam51bSwgdmFsdWUpKSB7Ci0gICAgICAgICAgICBpZiAoKChDUERGX09iamVjdCopdmFsdWUpLT5HZXRPYmpOdW0oKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBOVUxMOwotICAgIGlmIChtX3BQYXJzZXIpIHsKLSAgICAgICAgcE9iaiA9IG1fcFBhcnNlci0+UGFyc2VJbmRpcmVjdE9iamVjdCh0aGlzLCBvYmpudW0sIHBDb250ZXh0KTsKLSAgICB9Ci0gICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcE9iai0+bV9PYmpOdW0gPSBvYmpudW07Ci0gICAgaWYgKG1fTGFzdE9iak51bSA8IG9iam51bSkgewotICAgICAgICBtX0xhc3RPYmpOdW0gPSBvYmpudW07Ci0gICAgfQotICAgIGlmIChtX0luZGlyZWN0T2Jqcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCB2YWx1ZSkpIHsKLSAgICAgICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgICAgICAoKENQREZfT2JqZWN0ICopdmFsdWUpLT5EZXN0cm95KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9JbmRpcmVjdE9ianMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCBwT2JqKTsKLSAgICByZXR1cm4gcE9iajsKLX0KLWludCBDUERGX0luZGlyZWN0T2JqZWN0czo6R2V0SW5kaXJlY3RUeXBlKEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICB2b2lkKiB2YWx1ZTsKLSAgICBpZiAobV9JbmRpcmVjdE9ianMuTG9va3VwKCh2b2lkKikodWludHB0cl90KW9iam51bSwgdmFsdWUpKSB7Ci0gICAgICAgIHJldHVybiAoKENQREZfT2JqZWN0Kil2YWx1ZSktPkdldFR5cGUoKTsKLSAgICB9Ci0gICAgaWYgKG1fcFBhcnNlcikgewotICAgICAgICBQQVJTRV9DT05URVhUIGNvbnRleHQ7Ci0gICAgICAgIEZYU1lTX21lbXNldCgmY29udGV4dCwgMCwgc2l6ZW9mKFBBUlNFX0NPTlRFWFQpKTsKLSAgICAgICAgY29udGV4dC5tX0ZsYWdzID0gUERGUEFSU0VfVFlQRU9OTFk7Ci0gICAgICAgIHJldHVybiAoaW50KSh1aW50cHRyX3QpbV9wUGFyc2VyLT5QYXJzZUluZGlyZWN0T2JqZWN0KHRoaXMsIG9iam51bSwgJmNvbnRleHQpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLUZYX0RXT1JEIENQREZfSW5kaXJlY3RPYmplY3RzOjpBZGRJbmRpcmVjdE9iamVjdChDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBpZiAocE9iai0+bV9PYmpOdW0pIHsKLSAgICAgICAgcmV0dXJuIHBPYmotPm1fT2JqTnVtOwotICAgIH0KLSAgICBtX0xhc3RPYmpOdW0gKys7Ci0gICAgbV9JbmRpcmVjdE9ianMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpbV9MYXN0T2JqTnVtLCBwT2JqKTsKLSAgICBwT2JqLT5tX09iak51bSA9IG1fTGFzdE9iak51bTsKLSAgICByZXR1cm4gbV9MYXN0T2JqTnVtOwotfQotdm9pZCBDUERGX0luZGlyZWN0T2JqZWN0czo6UmVsZWFzZUluZGlyZWN0T2JqZWN0KEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICB2b2lkKiB2YWx1ZTsKLSAgICBpZiAoIW1fSW5kaXJlY3RPYmpzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sIHZhbHVlKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgoKENQREZfT2JqZWN0Kil2YWx1ZSktPkdldE9iak51bSgpID09IC0xKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgbV9JbmRpcmVjdE9ianMuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7CiAgICAgKChDUERGX09iamVjdCopdmFsdWUpLT5EZXN0cm95KCk7Ci0gICAgbV9JbmRpcmVjdE9ianMuUmVtb3ZlS2V5KCh2b2lkKikodWludHB0cl90KW9iam51bSk7CisgIH0KIH0KLXZvaWQgQ1BERl9JbmRpcmVjdE9iamVjdHM6Okluc2VydEluZGlyZWN0T2JqZWN0KEZYX0RXT1JEIG9iam51bSwgQ1BERl9PYmplY3QqIHBPYmopCi17Ci0gICAgaWYgKG9iam51bSA9PSAwIHx8IHBPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHZvaWQqIHZhbHVlID0gTlVMTDsKK0NQREZfT2JqZWN0KiBDUERGX0luZGlyZWN0T2JqZWN0czo6R2V0SW5kaXJlY3RPYmplY3QoCisgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCkgeworICBpZiAob2JqbnVtID09IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB2b2lkKiB2YWx1ZTsKKyAgewogICAgIGlmIChtX0luZGlyZWN0T2Jqcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCB2YWx1ZSkpIHsKLSAgICAgICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAocE9iai0+R2V0R2VuTnVtKCkgPD0gKChDUERGX09iamVjdCopdmFsdWUpLT5HZXRHZW5OdW0oKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgoQ1BERl9PYmplY3QqKXZhbHVlKS0+RGVzdHJveSgpOwotICAgICAgICAgfQorICAgICAgaWYgKCgoQ1BERl9PYmplY3QqKXZhbHVlKS0+R2V0T2JqTnVtKCkgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICByZXR1cm4gKENQREZfT2JqZWN0Kil2YWx1ZTsKICAgICB9Ci0gICAgcE9iai0+bV9PYmpOdW0gPSBvYmpudW07Ci0gICAgbV9JbmRpcmVjdE9ianMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCBwT2JqKTsKLSAgICBpZiAobV9MYXN0T2JqTnVtIDwgb2JqbnVtKSB7Ci0gICAgICAgIG1fTGFzdE9iak51bSA9IG9iam51bTsKKyAgfQorICBDUERGX09iamVjdCogcE9iaiA9IE5VTEw7CisgIGlmIChtX3BQYXJzZXIpIHsKKyAgICBwT2JqID0gbV9wUGFyc2VyLT5QYXJzZUluZGlyZWN0T2JqZWN0KHRoaXMsIG9iam51bSwgcENvbnRleHQpOworICB9CisgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwT2JqLT5tX09iak51bSA9IG9iam51bTsKKyAgaWYgKG1fTGFzdE9iak51bSA8IG9iam51bSkgeworICAgIG1fTGFzdE9iak51bSA9IG9iam51bTsKKyAgfQorICBpZiAobV9JbmRpcmVjdE9ianMuTG9va3VwKCh2b2lkKikodWludHB0cl90KW9iam51bSwgdmFsdWUpKSB7CisgICAgaWYgKHZhbHVlKSB7CisgICAgICAoKENQREZfT2JqZWN0Kil2YWx1ZSktPkRlc3Ryb3koKTsKICAgICB9CisgIH0KKyAgbV9JbmRpcmVjdE9ianMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCBwT2JqKTsKKyAgcmV0dXJuIHBPYmo7CiB9Ci1GWF9EV09SRCBDUERGX0luZGlyZWN0T2JqZWN0czo6R2V0TGFzdE9iak51bSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fTGFzdE9iak51bTsKK2ludCBDUERGX0luZGlyZWN0T2JqZWN0czo6R2V0SW5kaXJlY3RUeXBlKEZYX0RXT1JEIG9iam51bSkgeworICB2b2lkKiB2YWx1ZTsKKyAgaWYgKG1fSW5kaXJlY3RPYmpzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sIHZhbHVlKSkgeworICAgIHJldHVybiAoKENQREZfT2JqZWN0Kil2YWx1ZSktPkdldFR5cGUoKTsKKyAgfQorICBpZiAobV9wUGFyc2VyKSB7CisgICAgUEFSU0VfQ09OVEVYVCBjb250ZXh0OworICAgIEZYU1lTX21lbXNldCgmY29udGV4dCwgMCwgc2l6ZW9mKFBBUlNFX0NPTlRFWFQpKTsKKyAgICBjb250ZXh0Lm1fRmxhZ3MgPSBQREZQQVJTRV9UWVBFT05MWTsKKyAgICByZXR1cm4gKGludCkodWludHB0cl90KW1fcFBhcnNlci0+UGFyc2VJbmRpcmVjdE9iamVjdCh0aGlzLCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQpOworICB9CisgIHJldHVybiAwOworfQorRlhfRFdPUkQgQ1BERl9JbmRpcmVjdE9iamVjdHM6OkFkZEluZGlyZWN0T2JqZWN0KENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGlmIChwT2JqLT5tX09iak51bSkgeworICAgIHJldHVybiBwT2JqLT5tX09iak51bTsKKyAgfQorICBtX0xhc3RPYmpOdW0rKzsKKyAgbV9JbmRpcmVjdE9ianMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpbV9MYXN0T2JqTnVtLCBwT2JqKTsKKyAgcE9iai0+bV9PYmpOdW0gPSBtX0xhc3RPYmpOdW07CisgIHJldHVybiBtX0xhc3RPYmpOdW07Cit9Cit2b2lkIENQREZfSW5kaXJlY3RPYmplY3RzOjpSZWxlYXNlSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgb2JqbnVtKSB7CisgIHZvaWQqIHZhbHVlOworICBpZiAoIW1fSW5kaXJlY3RPYmpzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sIHZhbHVlKSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoKChDUERGX09iamVjdCopdmFsdWUpLT5HZXRPYmpOdW0oKSA9PSAtMSkgeworICAgIHJldHVybjsKKyAgfQorICAoKENQREZfT2JqZWN0Kil2YWx1ZSktPkRlc3Ryb3koKTsKKyAgbV9JbmRpcmVjdE9ianMuUmVtb3ZlS2V5KCh2b2lkKikodWludHB0cl90KW9iam51bSk7Cit9Cit2b2lkIENQREZfSW5kaXJlY3RPYmplY3RzOjpJbnNlcnRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaikgeworICBpZiAob2JqbnVtID09IDAgfHwgcE9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIHZvaWQqIHZhbHVlID0gTlVMTDsKKyAgaWYgKG1fSW5kaXJlY3RPYmpzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sIHZhbHVlKSkgeworICAgIGlmICh2YWx1ZSkgeworICAgICAgaWYgKHBPYmotPkdldEdlbk51bSgpIDw9ICgoQ1BERl9PYmplY3QqKXZhbHVlKS0+R2V0R2VuTnVtKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgKChDUERGX09iamVjdCopdmFsdWUpLT5EZXN0cm95KCk7CisgICAgfQorICB9CisgIHBPYmotPm1fT2JqTnVtID0gb2JqbnVtOworICBtX0luZGlyZWN0T2Jqcy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sIHBPYmopOworICBpZiAobV9MYXN0T2JqTnVtIDwgb2JqbnVtKSB7CisgICAgbV9MYXN0T2JqTnVtID0gb2JqbnVtOworICB9Cit9CitGWF9EV09SRCBDUERGX0luZGlyZWN0T2JqZWN0czo6R2V0TGFzdE9iak51bSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fTGFzdE9iak51bTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyLmNwcAppbmRleCBlNGQzNTcxLi5hZDRkNDU5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlci5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXIuY3BwCkBAIC0xMyw0NjAwICsxMyw0NjU2IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCiAjaW5jbHVkZSAiLi4vZnBkZl9wYWdlL3BhZ2VpbnQuaCIKIAotRlhfQk9PTCBJc1NpZ25hdHVyZURpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLXsKLSAgICBDUERGX09iamVjdCogcFR5cGUgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJUeXBlIikpOworRlhfQk9PTCBJc1NpZ25hdHVyZURpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgeworICBDUERGX09iamVjdCogcFR5cGUgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJUeXBlIikpOworICBpZiAoIXBUeXBlKSB7CisgICAgcFR5cGUgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJGVCIpKTsKICAgICBpZiAoIXBUeXBlKSB7Ci0gICAgICAgIHBUeXBlID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRlQiKSk7Ci0gICAgICAgIGlmICghcFR5cGUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQorICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZiAocFR5cGUtPkdldFN0cmluZygpID09IEZYX0JTVFJDKCJTaWciKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChwVHlwZS0+R2V0U3RyaW5nKCkgPT0gRlhfQlNUUkMoIlNpZyIpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotc3RhdGljIGludDMyX3QgX0NvbXBhcmVEV29yZChjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpCi17Ci0gICAgcmV0dXJuICgqKEZYX0RXT1JEKilwMSkgLSAoKihGWF9EV09SRCopcDIpOworc3RhdGljIGludDMyX3QgX0NvbXBhcmVEV29yZChjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpIHsKKyAgcmV0dXJuICgqKEZYX0RXT1JEKilwMSkgLSAoKihGWF9EV09SRCopcDIpOwogfQotc3RhdGljIGludCBfQ29tcGFyZUZpbGVTaXplKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikKLXsKLSAgICBGWF9GSUxFU0laRSByZXQgPSAoKihGWF9GSUxFU0laRSopcDEpIC0gKCooRlhfRklMRVNJWkUqKXAyKTsKLSAgICBpZiAocmV0ID4gMCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKK3N0YXRpYyBpbnQgX0NvbXBhcmVGaWxlU2l6ZShjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpIHsKKyAgRlhfRklMRVNJWkUgcmV0ID0gKCooRlhfRklMRVNJWkUqKXAxKSAtICgqKEZYX0ZJTEVTSVpFKilwMik7CisgIGlmIChyZXQgPiAwKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHJldCA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7CiB9CiAKLUNQREZfUGFyc2VyOjpDUERGX1BhcnNlcigpCi17CitDUERGX1BhcnNlcjo6Q1BERl9QYXJzZXIoKSB7CisgIG1fcERvY3VtZW50ID0gTlVMTDsKKyAgbV9wVHJhaWxlciA9IE5VTEw7CisgIG1fcEVuY3J5cHREaWN0ID0gTlVMTDsKKyAgbV9wU2VjdXJpdHlIYW5kbGVyID0gTlVMTDsKKyAgbV9wTGluZWFyaXplZCA9IE5VTEw7CisgIG1fZHdGaXJzdFBhZ2VObyA9IDA7CisgIG1fZHdYcmVmU3RhcnRPYmpOdW0gPSAwOworICBtX2JPd25GaWxlUmVhZCA9IFRSVUU7CisgIG1fRmlsZVZlcnNpb24gPSAwOworICBtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlciA9IEZBTFNFOworfQorQ1BERl9QYXJzZXI6On5DUERGX1BhcnNlcigpIHsKKyAgQ2xvc2VQYXJzZXIoRkFMU0UpOworfQorRlhfRFdPUkQgQ1BERl9QYXJzZXI6OkdldExhc3RPYmpOdW0oKSB7CisgIEZYX0RXT1JEIGR3U2l6ZSA9IG1fQ3Jvc3NSZWYuR2V0U2l6ZSgpOworICByZXR1cm4gZHdTaXplID8gZHdTaXplIC0gMSA6IDA7Cit9Cit2b2lkIENQREZfUGFyc2VyOjpTZXRFbmNyeXB0RGljdGlvbmFyeShDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7CisgIG1fcEVuY3J5cHREaWN0ID0gcERpY3Q7Cit9Cit2b2lkIENQREZfUGFyc2VyOjpDbG9zZVBhcnNlcihGWF9CT09MIGJSZVBhcnNlKSB7CisgIG1fYlZlcnNpb25VcGRhdGVkID0gRkFMU0U7CisgIGlmICghYlJlUGFyc2UpIHsKKyAgICBkZWxldGUgbV9wRG9jdW1lbnQ7CiAgICAgbV9wRG9jdW1lbnQgPSBOVUxMOworICB9CisgIGlmIChtX3BUcmFpbGVyKSB7CisgICAgbV9wVHJhaWxlci0+UmVsZWFzZSgpOwogICAgIG1fcFRyYWlsZXIgPSBOVUxMOwotICAgIG1fcEVuY3J5cHREaWN0ID0gTlVMTDsKLSAgICBtX3BTZWN1cml0eUhhbmRsZXIgPSBOVUxMOworICB9CisgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOworICBTZXRFbmNyeXB0RGljdGlvbmFyeShOVUxMKTsKKyAgaWYgKG1fYk93bkZpbGVSZWFkICYmIG1fU3ludGF4Lm1fcEZpbGVBY2Nlc3MpIHsKKyAgICBtX1N5bnRheC5tX3BGaWxlQWNjZXNzLT5SZWxlYXNlKCk7CisgICAgbV9TeW50YXgubV9wRmlsZUFjY2VzcyA9IE5VTEw7CisgIH0KKyAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RTdHJlYW1NYXAuR2V0U3RhcnRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgdm9pZCogb2JqbnVtOworICAgIENQREZfU3RyZWFtQWNjKiBwU3RyZWFtOworICAgIG1fT2JqZWN0U3RyZWFtTWFwLkdldE5leHRBc3NvYyhwb3MsIG9iam51bSwgKHZvaWQqJilwU3RyZWFtKTsKKyAgICBkZWxldGUgcFN0cmVhbTsKKyAgfQorICBtX09iamVjdFN0cmVhbU1hcC5SZW1vdmVBbGwoKTsKKyAgbV9Tb3J0ZWRPZmZzZXQuUmVtb3ZlQWxsKCk7CisgIG1fQ3Jvc3NSZWYuUmVtb3ZlQWxsKCk7CisgIG1fVjVUeXBlLlJlbW92ZUFsbCgpOworICBtX09ialZlcnNpb24uUmVtb3ZlQWxsKCk7CisgIGludDMyX3QgaUxlbiA9IG1fVHJhaWxlcnMuR2V0U2l6ZSgpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuOyArK2kpIHsKKyAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiB0cmFpbGVyID0gbV9UcmFpbGVycy5HZXRBdChpKSkKKyAgICAgIHRyYWlsZXItPlJlbGVhc2UoKTsKKyAgfQorICBtX1RyYWlsZXJzLlJlbW92ZUFsbCgpOworICBpZiAobV9wTGluZWFyaXplZCkgeworICAgIG1fcExpbmVhcml6ZWQtPlJlbGVhc2UoKTsKICAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKLSAgICBtX2R3Rmlyc3RQYWdlTm8gPSAwOwotICAgIG1fZHdYcmVmU3RhcnRPYmpOdW0gPSAwOwotICAgIG1fYk93bkZpbGVSZWFkID0gVFJVRTsKLSAgICBtX0ZpbGVWZXJzaW9uID0gMDsKLSAgICBtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlciA9IEZBTFNFOworICB9CiB9Ci1DUERGX1BhcnNlcjo6fkNQREZfUGFyc2VyKCkKLXsKLSAgICBDbG9zZVBhcnNlcihGQUxTRSk7CitzdGF0aWMgaW50MzJfdCBHZXRIZWFkZXJPZmZzZXQoSUZYX0ZpbGVSZWFkKiBwRmlsZSkgeworICBGWF9EV09SRCB0YWcgPSBGWERXT1JEX0ZST01fTFNCRklSU1QoMHg0NjQ0NTAyNSk7CisgIHVpbnQ4X3QgYnVmWzRdOworICBpbnQzMl90IG9mZnNldCA9IDA7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKCFwRmlsZS0+UmVhZEJsb2NrKGJ1Ziwgb2Zmc2V0LCA0KSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKihGWF9EV09SRCopYnVmID09IHRhZykgeworICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisgICAgb2Zmc2V0Kys7CisgICAgaWYgKG9mZnNldCA+IDEwMjQpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOwogfQotRlhfRFdPUkQgQ1BERl9QYXJzZXI6OkdldExhc3RPYmpOdW0oKQotewotICAgIEZYX0RXT1JEIGR3U2l6ZSA9IG1fQ3Jvc3NSZWYuR2V0U2l6ZSgpOwotICAgIHJldHVybiBkd1NpemUgPyBkd1NpemUgLSAxIDogMDsKK0ZYX0RXT1JEIENQREZfUGFyc2VyOjpTdGFydFBhcnNlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBGWF9CT09MIGJSZVBhcnNlKSB7CisgIElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MgPSBGWF9DcmVhdGVGaWxlUmVhZChmaWxlbmFtZSk7CisgIGlmICghcEZpbGVBY2Nlc3MpIHsKKyAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRklMRTsKKyAgfQorICByZXR1cm4gU3RhcnRQYXJzZShwRmlsZUFjY2VzcywgYlJlUGFyc2UpOwogfQotdm9pZCBDUERGX1BhcnNlcjo6U2V0RW5jcnlwdERpY3Rpb25hcnkoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLXsKLSAgICBtX3BFbmNyeXB0RGljdCA9IHBEaWN0OwotfQotdm9pZCBDUERGX1BhcnNlcjo6Q2xvc2VQYXJzZXIoRlhfQk9PTCBiUmVQYXJzZSkKLXsKLSAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IEZBTFNFOwotICAgIGlmICghYlJlUGFyc2UpIHsKLSAgICAgICAgZGVsZXRlIG1fcERvY3VtZW50OwotICAgICAgICBtX3BEb2N1bWVudCA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChtX3BUcmFpbGVyKSB7Ci0gICAgICAgIG1fcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICAgICAgbV9wVHJhaWxlciA9IE5VTEw7Ci0gICAgfQotICAgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOwotICAgIFNldEVuY3J5cHREaWN0aW9uYXJ5KE5VTEwpOwotICAgIGlmIChtX2JPd25GaWxlUmVhZCAmJiBtX1N5bnRheC5tX3BGaWxlQWNjZXNzKSB7Ci0gICAgICAgIG1fU3ludGF4Lm1fcEZpbGVBY2Nlc3MtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9TeW50YXgubV9wRmlsZUFjY2VzcyA9IE5VTEw7Ci0gICAgfQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0U3RyZWFtTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIHZvaWQqIG9iam51bTsKLSAgICAgICAgQ1BERl9TdHJlYW1BY2MqIHBTdHJlYW07Ci0gICAgICAgIG1fT2JqZWN0U3RyZWFtTWFwLkdldE5leHRBc3NvYyhwb3MsIG9iam51bSwgKHZvaWQqJilwU3RyZWFtKTsKLSAgICAgICAgZGVsZXRlIHBTdHJlYW07Ci0gICAgfQotICAgIG1fT2JqZWN0U3RyZWFtTWFwLlJlbW92ZUFsbCgpOwotICAgIG1fU29ydGVkT2Zmc2V0LlJlbW92ZUFsbCgpOwotICAgIG1fQ3Jvc3NSZWYuUmVtb3ZlQWxsKCk7Ci0gICAgbV9WNVR5cGUuUmVtb3ZlQWxsKCk7Ci0gICAgbV9PYmpWZXJzaW9uLlJlbW92ZUFsbCgpOwotICAgIGludDMyX3QgaUxlbiA9IG1fVHJhaWxlcnMuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW47ICsraSkgewotICAgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiB0cmFpbGVyID0gbV9UcmFpbGVycy5HZXRBdChpKSkKLSAgICAgICAgICAgIHRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbV9UcmFpbGVycy5SZW1vdmVBbGwoKTsKLSAgICBpZiAobV9wTGluZWFyaXplZCkgewotICAgICAgICBtX3BMaW5lYXJpemVkLT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fcExpbmVhcml6ZWQgPSBOVUxMOwotICAgIH0KLX0KLXN0YXRpYyBpbnQzMl90IEdldEhlYWRlck9mZnNldChJRlhfRmlsZVJlYWQqIHBGaWxlKQotewotICAgIEZYX0RXT1JEIHRhZyA9IEZYRFdPUkRfRlJPTV9MU0JGSVJTVCgweDQ2NDQ1MDI1KTsKLSAgICB1aW50OF90IGJ1Zls0XTsKLSAgICBpbnQzMl90IG9mZnNldCA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKCFwRmlsZS0+UmVhZEJsb2NrKGJ1Ziwgb2Zmc2V0LCA0KSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqKEZYX0RXT1JEKilidWYgPT0gdGFnKSB7Ci0gICAgICAgICAgICByZXR1cm4gb2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgaWYgKG9mZnNldCA+IDEwMjQpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6U3RhcnRQYXJzZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgRlhfQk9PTCBiUmVQYXJzZSkKLXsKLSAgICBJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzID0gRlhfQ3JlYXRlRmlsZVJlYWQoZmlsZW5hbWUpOwotICAgIGlmICghcEZpbGVBY2Nlc3MpIHsKLSAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZJTEU7Ci0gICAgfQotICAgIHJldHVybiBTdGFydFBhcnNlKHBGaWxlQWNjZXNzLCBiUmVQYXJzZSk7Ci19Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6U3RhcnRQYXJzZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUsIEZYX0JPT0wgYlJlUGFyc2UpCi17Ci0gICAgSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcyA9IEZYX0NyZWF0ZUZpbGVSZWFkKGZpbGVuYW1lKTsKLSAgICBpZiAoIXBGaWxlQWNjZXNzKSB7Ci0gICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GSUxFOwotICAgIH0KLSAgICByZXR1cm4gU3RhcnRQYXJzZShwRmlsZUFjY2VzcywgYlJlUGFyc2UpOworRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBGWF9CT09MIGJSZVBhcnNlKSB7CisgIElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MgPSBGWF9DcmVhdGVGaWxlUmVhZChmaWxlbmFtZSk7CisgIGlmICghcEZpbGVBY2Nlc3MpIHsKKyAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRklMRTsKKyAgfQorICByZXR1cm4gU3RhcnRQYXJzZShwRmlsZUFjY2VzcywgYlJlUGFyc2UpOwogfQogQ1BERl9TZWN1cml0eUhhbmRsZXIqIEZQREZfQ3JlYXRlU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKTsKIENQREZfU2VjdXJpdHlIYW5kbGVyKiBGUERGX0NyZWF0ZVB1YktleUhhbmRsZXIodm9pZCopOwotRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfQk9PTCBiUmVQYXJzZSwgRlhfQk9PTCBiT3duRmlsZVJlYWQpCi17Ci0gICAgQ2xvc2VQYXJzZXIoYlJlUGFyc2UpOwotICAgIG1fYlhSZWZTdHJlYW0gPSBGQUxTRTsKLSAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKLSAgICBtX2JPd25GaWxlUmVhZCA9IGJPd25GaWxlUmVhZDsKLSAgICBpbnQzMl90IG9mZnNldCA9IEdldEhlYWRlck9mZnNldChwRmlsZUFjY2Vzcyk7Ci0gICAgaWYgKG9mZnNldCA9PSAtMSkgewotICAgICAgICBpZiAoYk93bkZpbGVSZWFkICYmIHBGaWxlQWNjZXNzKSB7Ci0gICAgICAgICAgICBwRmlsZUFjY2Vzcy0+UmVsZWFzZSgpOwotICAgICAgICB9CitGWF9EV09SRCBDUERGX1BhcnNlcjo6U3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVQYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk93bkZpbGVSZWFkKSB7CisgIENsb3NlUGFyc2VyKGJSZVBhcnNlKTsKKyAgbV9iWFJlZlN0cmVhbSA9IEZBTFNFOworICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKKyAgbV9iT3duRmlsZVJlYWQgPSBiT3duRmlsZVJlYWQ7CisgIGludDMyX3Qgb2Zmc2V0ID0gR2V0SGVhZGVyT2Zmc2V0KHBGaWxlQWNjZXNzKTsKKyAgaWYgKG9mZnNldCA9PSAtMSkgeworICAgIGlmIChiT3duRmlsZVJlYWQgJiYgcEZpbGVBY2Nlc3MpIHsKKyAgICAgIHBGaWxlQWNjZXNzLT5SZWxlYXNlKCk7CisgICAgfQorICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CisgIH0KKyAgbV9TeW50YXguSW5pdFBhcnNlcihwRmlsZUFjY2Vzcywgb2Zmc2V0KTsKKyAgdWludDhfdCBjaDsKKyAgaWYgKCFtX1N5bnRheC5HZXRDaGFyQXQoNSwgY2gpKSB7CisgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgfQorICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgIG1fRmlsZVZlcnNpb24gPSAoY2ggLSAnMCcpICogMTA7CisgIH0KKyAgaWYgKCFtX1N5bnRheC5HZXRDaGFyQXQoNywgY2gpKSB7CisgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgfQorICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgIG1fRmlsZVZlcnNpb24gKz0gY2ggLSAnMCc7CisgIH0KKyAgaWYgKG1fU3ludGF4Lm1fRmlsZUxlbiA8IG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0ICsgOSkgeworICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CisgIH0KKyAgbV9TeW50YXguUmVzdG9yZVBvcyhtX1N5bnRheC5tX0ZpbGVMZW4gLSBtX1N5bnRheC5tX0hlYWRlck9mZnNldCAtIDkpOworICBpZiAoIWJSZVBhcnNlKSB7CisgICAgbV9wRG9jdW1lbnQgPSBuZXcgQ1BERl9Eb2N1bWVudCh0aGlzKTsKKyAgfQorICBGWF9CT09MIGJYUmVmUmVidWlsdCA9IEZBTFNFOworICBpZiAobV9TeW50YXguU2VhcmNoV29yZChGWF9CU1RSQygic3RhcnR4cmVmIiksIFRSVUUsIEZBTFNFLCA0MDk2KSkgeworICAgIEZYX0ZJTEVTSVpFIHN0YXJ0eHJlZl9vZmZzZXQgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnN0YXJ0eHJlZl9vZmZzZXQsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmVGaWxlU2l6ZSk7CisgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgeworICAgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKHN0YXJ0eHJlZl9vZmZzZXQpOworICAgIH0KKyAgICBtX1N5bnRheC5HZXRLZXl3b3JkKCk7CisgICAgRlhfQk9PTCBiTnVtYmVyOworICAgIENGWF9CeXRlU3RyaW5nIHhyZWZwb3Nfc3RyID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYk51bWJlcik7CisgICAgaWYgKCFiTnVtYmVyKSB7CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOworICAgIH0KKyAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gKEZYX0ZJTEVTSVpFKUZYU1lTX2F0b2k2NCh4cmVmcG9zX3N0cik7CisgICAgaWYgKCFMb2FkQWxsQ3Jvc3NSZWZWNChtX0xhc3RYUmVmT2Zmc2V0KSAmJgorICAgICAgICAhTG9hZEFsbENyb3NzUmVmVjUobV9MYXN0WFJlZk9mZnNldCkpIHsKKyAgICAgIGlmICghUmVidWlsZENyb3NzUmVmKCkpIHsKICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgICAgIH0KKyAgICAgIGJYUmVmUmVidWlsdCA9IFRSVUU7CisgICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKICAgICB9Ci0gICAgbV9TeW50YXguSW5pdFBhcnNlcihwRmlsZUFjY2Vzcywgb2Zmc2V0KTsKLSAgICB1aW50OF90IGNoOwotICAgIGlmICghbV9TeW50YXguR2V0Q2hhckF0KDUsIGNoKSkgewotICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOworICB9IGVsc2UgeworICAgIGlmICghUmVidWlsZENyb3NzUmVmKCkpIHsKKyAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CiAgICAgfQotICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgICAgIG1fRmlsZVZlcnNpb24gPSAoY2ggLSAnMCcpICogMTA7CisgICAgYlhSZWZSZWJ1aWx0ID0gVFJVRTsKKyAgfQorICBGWF9EV09SRCBkd1JldCA9IFNldEVuY3J5cHRIYW5kbGVyKCk7CisgIGlmIChkd1JldCAhPSBQREZQQVJTRV9FUlJPUl9TVUNDRVNTKSB7CisgICAgcmV0dXJuIGR3UmV0OworICB9CisgIG1fcERvY3VtZW50LT5Mb2FkRG9jKCk7CisgIGlmIChtX3BEb2N1bWVudC0+R2V0Um9vdCgpID09IE5VTEwgfHwgbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpID09IDApIHsKKyAgICBpZiAoYlhSZWZSZWJ1aWx0KSB7CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwogICAgIH0KLSAgICBpZiAoIW1fU3ludGF4LkdldENoYXJBdCg3LCBjaCkpIHsKLSAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgICBSZWxlYXNlRW5jcnlwdEhhbmRsZXIoKTsKKyAgICBpZiAoIVJlYnVpbGRDcm9zc1JlZigpKSB7CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwogICAgIH0KLSAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewotICAgICAgICBtX0ZpbGVWZXJzaW9uICs9IGNoIC0gJzAnOwotICAgIH0KLSAgICBpZiAobV9TeW50YXgubV9GaWxlTGVuIDwgIG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0ICsgOSkgewotICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgIH0KLSAgICBtX1N5bnRheC5SZXN0b3JlUG9zKG1fU3ludGF4Lm1fRmlsZUxlbiAtIG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0IC0gOSk7Ci0gICAgaWYgKCFiUmVQYXJzZSkgewotICAgICAgICBtX3BEb2N1bWVudCA9IG5ldyBDUERGX0RvY3VtZW50KHRoaXMpOwotICAgIH0KLSAgICBGWF9CT09MIGJYUmVmUmVidWlsdCA9IEZBTFNFOwotICAgIGlmIChtX1N5bnRheC5TZWFyY2hXb3JkKEZYX0JTVFJDKCJzdGFydHhyZWYiKSwgVFJVRSwgRkFMU0UsIDQwOTYpKSB7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIHN0YXJ0eHJlZl9vZmZzZXQgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZzdGFydHhyZWZfb2Zmc2V0LCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7Ci0gICAgICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChzdGFydHhyZWZfb2Zmc2V0KTsKLSAgICAgICAgfQotICAgICAgICBtX1N5bnRheC5HZXRLZXl3b3JkKCk7Ci0gICAgICAgIEZYX0JPT0wgYk51bWJlcjsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgeHJlZnBvc19zdHIgPSBtX1N5bnRheC5HZXROZXh0V29yZChiTnVtYmVyKTsKLSAgICAgICAgaWYgKCFiTnVtYmVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgICAgICB9Ci0gICAgICAgIG1fTGFzdFhSZWZPZmZzZXQgPSAoRlhfRklMRVNJWkUpRlhTWVNfYXRvaTY0KHhyZWZwb3Nfc3RyKTsKLSAgICAgICAgaWYgKCFMb2FkQWxsQ3Jvc3NSZWZWNChtX0xhc3RYUmVmT2Zmc2V0KSAmJiAhTG9hZEFsbENyb3NzUmVmVjUobV9MYXN0WFJlZk9mZnNldCkpIHsKLSAgICAgICAgICAgIGlmICghUmVidWlsZENyb3NzUmVmKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYlhSZWZSZWJ1aWx0ID0gVFJVRTsKLSAgICAgICAgICAgIG1fTGFzdFhSZWZPZmZzZXQgPSAwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSkgewotICAgICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKLSAgICAgICAgfQotICAgICAgICBiWFJlZlJlYnVpbHQgPSBUUlVFOwotICAgIH0KLSAgICBGWF9EV09SRCBkd1JldCA9IFNldEVuY3J5cHRIYW5kbGVyKCk7CisgICAgZHdSZXQgPSBTZXRFbmNyeXB0SGFuZGxlcigpOwogICAgIGlmIChkd1JldCAhPSBQREZQQVJTRV9FUlJPUl9TVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBkd1JldDsKKyAgICAgIHJldHVybiBkd1JldDsKICAgICB9CiAgICAgbV9wRG9jdW1lbnQtPkxvYWREb2MoKTsKLSAgICBpZiAobV9wRG9jdW1lbnQtPkdldFJvb3QoKSA9PSBOVUxMIHx8IG1fcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgIGlmIChiWFJlZlJlYnVpbHQpIHsKLSAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7Ci0gICAgICAgIH0KLSAgICAgICAgUmVsZWFzZUVuY3J5cHRIYW5kbGVyKCk7Ci0gICAgICAgIGlmICghUmVidWlsZENyb3NzUmVmKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZHdSZXQgPSBTZXRFbmNyeXB0SGFuZGxlcigpOwotICAgICAgICBpZiAoZHdSZXQgIT0gUERGUEFSU0VfRVJST1JfU1VDQ0VTUykgewotICAgICAgICAgICAgcmV0dXJuIGR3UmV0OwotICAgICAgICB9Ci0gICAgICAgIG1fcERvY3VtZW50LT5Mb2FkRG9jKCk7Ci0gICAgICAgIGlmIChtX3BEb2N1bWVudC0+R2V0Um9vdCgpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7Ci0gICAgICAgIH0KKyAgICBpZiAobV9wRG9jdW1lbnQtPkdldFJvb3QoKSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwogICAgIH0KLSAgICBGWFNZU19xc29ydChtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7Ci0gICAgRlhfRFdPUkQgUm9vdE9iak51bSA9IEdldFJvb3RPYmpOdW0oKTsKLSAgICBpZiAoUm9vdE9iak51bSA9PSAwKSB7Ci0gICAgICAgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOwotICAgICAgICBSZWJ1aWxkQ3Jvc3NSZWYoKTsKLSAgICAgICAgUm9vdE9iak51bSA9IEdldFJvb3RPYmpOdW0oKTsKLSAgICAgICAgaWYgKFJvb3RPYmpOdW0gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKLSAgICAgICAgfQotICAgICAgICBkd1JldCA9IFNldEVuY3J5cHRIYW5kbGVyKCk7Ci0gICAgICAgIGlmIChkd1JldCAhPSBQREZQQVJTRV9FUlJPUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICByZXR1cm4gZHdSZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fcFNlY3VyaXR5SGFuZGxlciAmJiAhbV9wU2VjdXJpdHlIYW5kbGVyLT5Jc01ldGFkYXRhRW5jcnlwdGVkKCkpIHsKLSAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBNZXRhZGF0YSA9IChDUERGX1JlZmVyZW5jZSopbV9wRG9jdW1lbnQtPkdldFJvb3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiTWV0YWRhdGEiKSk7Ci0gICAgICAgIGlmIChwTWV0YWRhdGEgJiYgcE1ldGFkYXRhLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgbV9TeW50YXgubV9NZXRhZGF0YU9iam51bSA9IHBNZXRhZGF0YS0+R2V0UmVmT2JqTnVtKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX1NVQ0NFU1M7Ci19Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6U2V0RW5jcnlwdEhhbmRsZXIoKQoteworICB9CisgIEZYU1lTX3Fzb3J0KG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLAorICAgICAgICAgICAgICBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKKyAgRlhfRFdPUkQgUm9vdE9iak51bSA9IEdldFJvb3RPYmpOdW0oKTsKKyAgaWYgKFJvb3RPYmpOdW0gPT0gMCkgewogICAgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOwotICAgIFNldEVuY3J5cHREaWN0aW9uYXJ5KE5VTEwpOwotICAgIGlmIChtX3BUcmFpbGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgICBSZWJ1aWxkQ3Jvc3NSZWYoKTsKKyAgICBSb290T2JqTnVtID0gR2V0Um9vdE9iak51bSgpOworICAgIGlmIChSb290T2JqTnVtID09IDApIHsKKyAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CiAgICAgfQotICAgIENQREZfT2JqZWN0KiBwRW5jcnlwdE9iaiA9IG1fcFRyYWlsZXItPkdldEVsZW1lbnQoRlhfQlNUUkMoIkVuY3J5cHQiKSk7Ci0gICAgaWYgKHBFbmNyeXB0T2JqKSB7Ci0gICAgICAgIGlmIChwRW5jcnlwdE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICBTZXRFbmNyeXB0RGljdGlvbmFyeSgoQ1BERl9EaWN0aW9uYXJ5KilwRW5jcnlwdE9iaik7Ci0gICAgICAgIH0gZWxzZSBpZiAocEVuY3J5cHRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICBwRW5jcnlwdE9iaiA9IG1fcERvY3VtZW50LT5HZXRJbmRpcmVjdE9iamVjdCgoKENQREZfUmVmZXJlbmNlKilwRW5jcnlwdE9iaiktPkdldFJlZk9iak51bSgpKTsKLSAgICAgICAgICAgIGlmIChwRW5jcnlwdE9iaikgewotICAgICAgICAgICAgICAgIFNldEVuY3J5cHREaWN0aW9uYXJ5KHBFbmNyeXB0T2JqLT5HZXREaWN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgZHdSZXQgPSBTZXRFbmNyeXB0SGFuZGxlcigpOworICAgIGlmIChkd1JldCAhPSBQREZQQVJTRV9FUlJPUl9TVUNDRVNTKSB7CisgICAgICByZXR1cm4gZHdSZXQ7CiAgICAgfQotICAgIGlmIChtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlcikgewotICAgICAgICBGWF9EV09SRCBlcnIgPSBQREZQQVJTRV9FUlJPUl9IQU5ETEVSOwotICAgICAgICBpZiAobV9wU2VjdXJpdHlIYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9IQU5ETEVSOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbV9wU2VjdXJpdHlIYW5kbGVyLT5PbkluaXQodGhpcywgbV9wRW5jcnlwdERpY3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0b0hhbmRsZXIgPSBtX3BTZWN1cml0eUhhbmRsZXItPkNyZWF0ZUNyeXB0b0hhbmRsZXIoKTsKLSAgICAgICAgaWYgKCFwQ3J5cHRvSGFuZGxlci0+SW5pdChtX3BFbmNyeXB0RGljdCwgbV9wU2VjdXJpdHlIYW5kbGVyKSkgewotICAgICAgICAgICAgZGVsZXRlIHBDcnlwdG9IYW5kbGVyOwotICAgICAgICAgICAgcENyeXB0b0hhbmRsZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0hBTkRMRVI7Ci0gICAgICAgIH0KLSAgICAgICAgbV9TeW50YXguU2V0RW5jcnlwdChwQ3J5cHRvSGFuZGxlcik7Ci0gICAgfSBlbHNlIGlmIChtX3BFbmNyeXB0RGljdCkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBmaWx0ZXIgPSBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGaWx0ZXIiKSk7Ci0gICAgICAgIENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyID0gTlVMTDsKLSAgICAgICAgRlhfRFdPUkQgZXJyID0gUERGUEFSU0VfRVJST1JfSEFORExFUjsKLSAgICAgICAgaWYgKGZpbHRlciA9PSBGWF9CU1RSQygiU3RhbmRhcmQiKSkgewotICAgICAgICAgICAgcFNlY3VyaXR5SGFuZGxlciA9IEZQREZfQ3JlYXRlU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKTsKLSAgICAgICAgICAgIGVyciA9IFBERlBBUlNFX0VSUk9SX1BBU1NXT1JEOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwU2VjdXJpdHlIYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9IQU5ETEVSOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcFNlY3VyaXR5SGFuZGxlci0+T25Jbml0KHRoaXMsIG1fcEVuY3J5cHREaWN0KSkgewotICAgICAgICAgICAgZGVsZXRlIHBTZWN1cml0eUhhbmRsZXI7Ci0gICAgICAgICAgICBwU2VjdXJpdHlIYW5kbGVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wU2VjdXJpdHlIYW5kbGVyID0gcFNlY3VyaXR5SGFuZGxlcjsKLSAgICAgICAgQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvSGFuZGxlciA9IHBTZWN1cml0eUhhbmRsZXItPkNyZWF0ZUNyeXB0b0hhbmRsZXIoKTsKLSAgICAgICAgaWYgKCFwQ3J5cHRvSGFuZGxlci0+SW5pdChtX3BFbmNyeXB0RGljdCwgbV9wU2VjdXJpdHlIYW5kbGVyKSkgewotICAgICAgICAgICAgZGVsZXRlIHBDcnlwdG9IYW5kbGVyOwotICAgICAgICAgICAgcENyeXB0b0hhbmRsZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0hBTkRMRVI7Ci0gICAgICAgIH0KLSAgICAgICAgbV9TeW50YXguU2V0RW5jcnlwdChwQ3J5cHRvSGFuZGxlcik7CisgIH0KKyAgaWYgKG1fcFNlY3VyaXR5SGFuZGxlciAmJiAhbV9wU2VjdXJpdHlIYW5kbGVyLT5Jc01ldGFkYXRhRW5jcnlwdGVkKCkpIHsKKyAgICBDUERGX1JlZmVyZW5jZSogcE1ldGFkYXRhID0KKyAgICAgICAgKENQREZfUmVmZXJlbmNlKiltX3BEb2N1bWVudC0+R2V0Um9vdCgpLT5HZXRFbGVtZW50KAorICAgICAgICAgICAgRlhfQlNUUkMoIk1ldGFkYXRhIikpOworICAgIGlmIChwTWV0YWRhdGEgJiYgcE1ldGFkYXRhLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgeworICAgICAgbV9TeW50YXgubV9NZXRhZGF0YU9iam51bSA9IHBNZXRhZGF0YS0+R2V0UmVmT2JqTnVtKCk7CiAgICAgfQotICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9TVUNDRVNTOworICB9CisgIHJldHVybiBQREZQQVJTRV9FUlJPUl9TVUNDRVNTOwogfQotdm9pZCBDUERGX1BhcnNlcjo6UmVsZWFzZUVuY3J5cHRIYW5kbGVyKCkKLXsKLSAgICBkZWxldGUgbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlcjsKLSAgICBtX1N5bnRheC5tX3BDcnlwdG9IYW5kbGVyID0gTlVMTDsKLSAgICBpZiAoIW1fYkZvcmNlVXNlU2VjdXJpdHlIYW5kbGVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BTZWN1cml0eUhhbmRsZXI7Ci0gICAgICAgIG1fcFNlY3VyaXR5SGFuZGxlciA9IE5VTEw7CitGWF9EV09SRCBDUERGX1BhcnNlcjo6U2V0RW5jcnlwdEhhbmRsZXIoKSB7CisgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOworICBTZXRFbmNyeXB0RGljdGlvbmFyeShOVUxMKTsKKyAgaWYgKG1fcFRyYWlsZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBFbmNyeXB0T2JqID0gbV9wVHJhaWxlci0+R2V0RWxlbWVudChGWF9CU1RSQygiRW5jcnlwdCIpKTsKKyAgaWYgKHBFbmNyeXB0T2JqKSB7CisgICAgaWYgKHBFbmNyeXB0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICAgIFNldEVuY3J5cHREaWN0aW9uYXJ5KChDUERGX0RpY3Rpb25hcnkqKXBFbmNyeXB0T2JqKTsKKyAgICB9IGVsc2UgaWYgKHBFbmNyeXB0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgeworICAgICAgcEVuY3J5cHRPYmogPSBtX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3QoCisgICAgICAgICAgKChDUERGX1JlZmVyZW5jZSopcEVuY3J5cHRPYmopLT5HZXRSZWZPYmpOdW0oKSk7CisgICAgICBpZiAocEVuY3J5cHRPYmopIHsKKyAgICAgICAgU2V0RW5jcnlwdERpY3Rpb25hcnkocEVuY3J5cHRPYmotPkdldERpY3QoKSk7CisgICAgICB9CiAgICAgfQorICB9CisgIGlmIChtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlcikgeworICAgIEZYX0RXT1JEIGVyciA9IFBERlBBUlNFX0VSUk9SX0hBTkRMRVI7CisgICAgaWYgKG1fcFNlY3VyaXR5SGFuZGxlciA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfSEFORExFUjsKKyAgICB9CisgICAgaWYgKCFtX3BTZWN1cml0eUhhbmRsZXItPk9uSW5pdCh0aGlzLCBtX3BFbmNyeXB0RGljdCkpIHsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0b0hhbmRsZXIgPQorICAgICAgICBtX3BTZWN1cml0eUhhbmRsZXItPkNyZWF0ZUNyeXB0b0hhbmRsZXIoKTsKKyAgICBpZiAoIXBDcnlwdG9IYW5kbGVyLT5Jbml0KG1fcEVuY3J5cHREaWN0LCBtX3BTZWN1cml0eUhhbmRsZXIpKSB7CisgICAgICBkZWxldGUgcENyeXB0b0hhbmRsZXI7CisgICAgICBwQ3J5cHRvSGFuZGxlciA9IE5VTEw7CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfSEFORExFUjsKKyAgICB9CisgICAgbV9TeW50YXguU2V0RW5jcnlwdChwQ3J5cHRvSGFuZGxlcik7CisgIH0gZWxzZSBpZiAobV9wRW5jcnlwdERpY3QpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBmaWx0ZXIgPSBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGaWx0ZXIiKSk7CisgICAgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIgPSBOVUxMOworICAgIEZYX0RXT1JEIGVyciA9IFBERlBBUlNFX0VSUk9SX0hBTkRMRVI7CisgICAgaWYgKGZpbHRlciA9PSBGWF9CU1RSQygiU3RhbmRhcmQiKSkgeworICAgICAgcFNlY3VyaXR5SGFuZGxlciA9IEZQREZfQ3JlYXRlU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKTsKKyAgICAgIGVyciA9IFBERlBBUlNFX0VSUk9SX1BBU1NXT1JEOworICAgIH0KKyAgICBpZiAocFNlY3VyaXR5SGFuZGxlciA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfSEFORExFUjsKKyAgICB9CisgICAgaWYgKCFwU2VjdXJpdHlIYW5kbGVyLT5PbkluaXQodGhpcywgbV9wRW5jcnlwdERpY3QpKSB7CisgICAgICBkZWxldGUgcFNlY3VyaXR5SGFuZGxlcjsKKyAgICAgIHBTZWN1cml0eUhhbmRsZXIgPSBOVUxMOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbV9wU2VjdXJpdHlIYW5kbGVyID0gcFNlY3VyaXR5SGFuZGxlcjsKKyAgICBDUERGX0NyeXB0b0hhbmRsZXIqIHBDcnlwdG9IYW5kbGVyID0KKyAgICAgICAgcFNlY3VyaXR5SGFuZGxlci0+Q3JlYXRlQ3J5cHRvSGFuZGxlcigpOworICAgIGlmICghcENyeXB0b0hhbmRsZXItPkluaXQobV9wRW5jcnlwdERpY3QsIG1fcFNlY3VyaXR5SGFuZGxlcikpIHsKKyAgICAgIGRlbGV0ZSBwQ3J5cHRvSGFuZGxlcjsKKyAgICAgIHBDcnlwdG9IYW5kbGVyID0gTlVMTDsKKyAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9IQU5ETEVSOworICAgIH0KKyAgICBtX1N5bnRheC5TZXRFbmNyeXB0KHBDcnlwdG9IYW5kbGVyKTsKKyAgfQorICByZXR1cm4gUERGUEFSU0VfRVJST1JfU1VDQ0VTUzsKIH0KLUZYX0ZJTEVTSVpFIENQREZfUGFyc2VyOjpHZXRPYmplY3RPZmZzZXQoRlhfRFdPUkQgb2JqbnVtKQotewotICAgIGlmIChvYmpudW0gPj0gKEZYX0RXT1JEKW1fQ3Jvc3NSZWYuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBtX0Nyb3NzUmVmW29iam51bV07Ci0gICAgfQotICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKLSAgICAgICAgcmV0dXJuIG1fQ3Jvc3NSZWZbKGludDMyX3QpbV9Dcm9zc1JlZltvYmpudW1dXTsKLSAgICB9Cit2b2lkIENQREZfUGFyc2VyOjpSZWxlYXNlRW5jcnlwdEhhbmRsZXIoKSB7CisgIGRlbGV0ZSBtX1N5bnRheC5tX3BDcnlwdG9IYW5kbGVyOworICBtX1N5bnRheC5tX3BDcnlwdG9IYW5kbGVyID0gTlVMTDsKKyAgaWYgKCFtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlcikgeworICAgIGRlbGV0ZSBtX3BTZWN1cml0eUhhbmRsZXI7CisgICAgbV9wU2VjdXJpdHlIYW5kbGVyID0gTlVMTDsKKyAgfQorfQorRlhfRklMRVNJWkUgQ1BERl9QYXJzZXI6OkdldE9iamVjdE9mZnNldChGWF9EV09SRCBvYmpudW0pIHsKKyAgaWYgKG9iam51bSA+PSAoRlhfRFdPUkQpbV9Dcm9zc1JlZi5HZXRTaXplKCkpIHsKICAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAxKSB7CisgICAgcmV0dXJuIG1fQ3Jvc3NSZWZbb2JqbnVtXTsKKyAgfQorICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAyKSB7CisgICAgcmV0dXJuIG1fQ3Jvc3NSZWZbKGludDMyX3QpbV9Dcm9zc1JlZltvYmpudW1dXTsKKyAgfQorICByZXR1cm4gMDsKIH0KLXN0YXRpYyBpbnQzMl90IEdldERpcmVjdEludGVnZXIoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBwRGljdC0+R2V0RWxlbWVudChrZXkpOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICByZXR1cm4gKChDUERGX051bWJlciopcE9iaiktPkdldEludGVnZXIoKTsKLSAgICB9CitzdGF0aWMgaW50MzJfdCBHZXREaXJlY3RJbnRlZ2VyKENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gcERpY3QtPkdldEVsZW1lbnQoa2V5KTsKKyAgaWYgKHBPYmogPT0gTlVMTCkgewogICAgIHJldHVybiAwOworICB9CisgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgeworICAgIHJldHVybiAoKENQREZfTnVtYmVyKilwT2JqKS0+R2V0SW50ZWdlcigpOworICB9CisgIHJldHVybiAwOwogfQotc3RhdGljIEZYX0JPT0wgQ2hlY2tEaXJlY3RUeXBlKENQREZfRGljdGlvbmFyeSogcERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBpbnQzMl90IGlUeXBlKQotewotICAgIENQREZfT2JqZWN0KiBwT2JqID0gcERpY3QtPkdldEVsZW1lbnQoa2V5KTsKLSAgICBpZiAoIXBPYmopIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBwT2JqLT5HZXRUeXBlKCkgPT0gaVR5cGU7CitzdGF0aWMgRlhfQk9PTCBDaGVja0RpcmVjdFR5cGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUeXBlKSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gcERpY3QtPkdldEVsZW1lbnQoa2V5KTsKKyAgaWYgKCFwT2JqKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIHBPYmotPkdldFR5cGUoKSA9PSBpVHlwZTsKIH0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHhyZWZwb3MpCi17Ci0gICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCBUUlVFLCBGQUxTRSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgeHJlZnBvcykgeworICBpZiAoIUxvYWRDcm9zc1JlZlY0KHhyZWZwb3MsIDAsIFRSVUUsIEZBTFNFKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BUcmFpbGVyID0gTG9hZFRyYWlsZXJWNCgpOworICBpZiAobV9wVHJhaWxlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludDMyX3QgeHJlZnNpemUgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJTaXplIikpOworICBpZiAoeHJlZnNpemUgPD0gMCB8fCB4cmVmc2l6ZSA+ICgxIDw8IDIwKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX0Nyb3NzUmVmLlNldFNpemUoeHJlZnNpemUpOworICBtX1Y1VHlwZS5TZXRTaXplKHhyZWZzaXplKTsKKyAgQ0ZYX0ZpbGVTaXplQXJyYXkgQ3Jvc3NSZWZMaXN0LCBYUmVmU3RyZWFtTGlzdDsKKyAgQ3Jvc3NSZWZMaXN0LkFkZCh4cmVmcG9zKTsKKyAgWFJlZlN0cmVhbUxpc3QuQWRkKEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlhSZWZTdG0iKSkpOworICBpZiAoIUNoZWNrRGlyZWN0VHlwZShtX3BUcmFpbGVyLCBGWF9CU1RSQygiUHJldiIpLCBQREZPQkpfTlVNQkVSKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9GSUxFU0laRSBuZXd4cmVmcG9zID0gR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLCBGWF9CU1RSQygiUHJldiIpKTsKKyAgaWYgKG5ld3hyZWZwb3MgPT0geHJlZnBvcykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB4cmVmcG9zID0gbmV3eHJlZnBvczsKKyAgd2hpbGUgKHhyZWZwb3MpIHsKKyAgICBDcm9zc1JlZkxpc3QuSW5zZXJ0QXQoMCwgeHJlZnBvcyk7CisgICAgTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgVFJVRSwgRkFMU0UpOworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBMb2FkVHJhaWxlclY0KCk7CisgICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgbV9wVHJhaWxlciA9IExvYWRUcmFpbGVyVjQoKTsKLSAgICBpZiAobV9wVHJhaWxlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIUNoZWNrRGlyZWN0VHlwZShwRGljdCwgRlhfQlNUUkMoIlByZXYiKSwgUERGT0JKX05VTUJFUikpIHsKKyAgICAgIHBEaWN0LT5SZWxlYXNlKCk7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGludDMyX3QgeHJlZnNpemUgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJTaXplIikpOwotICAgIGlmICh4cmVmc2l6ZSA8PSAwIHx8IHhyZWZzaXplID4gKDEgPDwgMjApKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9Dcm9zc1JlZi5TZXRTaXplKHhyZWZzaXplKTsKLSAgICBtX1Y1VHlwZS5TZXRTaXplKHhyZWZzaXplKTsKLSAgICBDRlhfRmlsZVNpemVBcnJheSBDcm9zc1JlZkxpc3QsIFhSZWZTdHJlYW1MaXN0OwotICAgIENyb3NzUmVmTGlzdC5BZGQoeHJlZnBvcyk7Ci0gICAgWFJlZlN0cmVhbUxpc3QuQWRkKEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlhSZWZTdG0iKSkpOwotICAgIGlmICghQ2hlY2tEaXJlY3RUeXBlKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJQcmV2IiksIFBERk9CSl9OVU1CRVIpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRklMRVNJWkUgbmV3eHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlByZXYiKSk7CisgICAgbmV3eHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIocERpY3QsIEZYX0JTVFJDKCJQcmV2IikpOwogICAgIGlmIChuZXd4cmVmcG9zID09IHhyZWZwb3MpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgcERpY3QtPlJlbGVhc2UoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgeHJlZnBvcyA9IG5ld3hyZWZwb3M7Ci0gICAgd2hpbGUgKHhyZWZwb3MpIHsKLSAgICAgICAgQ3Jvc3NSZWZMaXN0Lkluc2VydEF0KDAsIHhyZWZwb3MpOwotICAgICAgICBMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCBUUlVFLCBGQUxTRSk7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBMb2FkVHJhaWxlclY0KCk7Ci0gICAgICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFDaGVja0RpcmVjdFR5cGUocERpY3QsIEZYX0JTVFJDKCJQcmV2IiksIFBERk9CSl9OVU1CRVIpKSB7Ci0gICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG5ld3hyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKHBEaWN0LCBGWF9CU1RSQygiUHJldiIpKTsKLSAgICAgICAgaWYgKG5ld3hyZWZwb3MgPT0geHJlZnBvcykgewotICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICB4cmVmcG9zID0gbmV3eHJlZnBvczsKLSAgICAgICAgWFJlZlN0cmVhbUxpc3QuSW5zZXJ0QXQoMCwgcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlhSZWZTdG0iKSkpOwotICAgICAgICBtX1RyYWlsZXJzLkFkZChwRGljdCk7CisgICAgWFJlZlN0cmVhbUxpc3QuSW5zZXJ0QXQoMCwgcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlhSZWZTdG0iKSkpOworICAgIG1fVHJhaWxlcnMuQWRkKHBEaWN0KTsKKyAgfQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBDcm9zc1JlZkxpc3QuR2V0U2l6ZSgpOyBpKyspCisgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNChDcm9zc1JlZkxpc3RbaV0sIFhSZWZTdHJlYW1MaXN0W2ldLCBGQUxTRSwgaSA9PSAwKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBDcm9zc1JlZkxpc3QuR2V0U2l6ZSgpOyBpICsrKQotICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY0KENyb3NzUmVmTGlzdFtpXSwgWFJlZlN0cmVhbUxpc3RbaV0sIEZBTFNFLCBpID09IDApKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgeHJlZnBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCkKLXsKLSAgICBpZiAoIUxvYWRMaW5lYXJpemVkQ3Jvc3NSZWZWNCh4cmVmcG9zLCBkd09iakNvdW50KSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgeHJlZnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd09iakNvdW50KSB7CisgIGlmICghTG9hZExpbmVhcml6ZWRDcm9zc1JlZlY0KHhyZWZwb3MsIGR3T2JqQ291bnQpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcFRyYWlsZXIgPSBMb2FkVHJhaWxlclY0KCk7CisgIGlmIChtX3BUcmFpbGVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50MzJfdCB4cmVmc2l6ZSA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlNpemUiKSk7CisgIGlmICh4cmVmc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9GaWxlU2l6ZUFycmF5IENyb3NzUmVmTGlzdCwgWFJlZlN0cmVhbUxpc3Q7CisgIENyb3NzUmVmTGlzdC5BZGQoeHJlZnBvcyk7CisgIFhSZWZTdHJlYW1MaXN0LkFkZChHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJYUmVmU3RtIikpKTsKKyAgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlByZXYiKSk7CisgIHdoaWxlICh4cmVmcG9zKSB7CisgICAgQ3Jvc3NSZWZMaXN0Lkluc2VydEF0KDAsIHhyZWZwb3MpOworICAgIExvYWRDcm9zc1JlZlY0KHhyZWZwb3MsIDAsIFRSVUUsIEZBTFNFKTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gTG9hZFRyYWlsZXJWNCgpOworICAgIGlmIChwRGljdCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIG1fcFRyYWlsZXIgPSBMb2FkVHJhaWxlclY0KCk7Ci0gICAgaWYgKG1fcFRyYWlsZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIocERpY3QsIEZYX0JTVFJDKCJQcmV2IikpOworICAgIFhSZWZTdHJlYW1MaXN0Lkluc2VydEF0KDAsIHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJYUmVmU3RtIikpKTsKKyAgICBtX1RyYWlsZXJzLkFkZChwRGljdCk7CisgIH0KKyAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgQ3Jvc3NSZWZMaXN0LkdldFNpemUoKTsgaSsrKQorICAgIGlmICghTG9hZENyb3NzUmVmVjQoQ3Jvc3NSZWZMaXN0W2ldLCBYUmVmU3RyZWFtTGlzdFtpXSwgRkFMU0UsIGkgPT0gMCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaW50MzJfdCB4cmVmc2l6ZSA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlNpemUiKSk7Ci0gICAgaWYgKHhyZWZzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfRmlsZVNpemVBcnJheSBDcm9zc1JlZkxpc3QsIFhSZWZTdHJlYW1MaXN0OwotICAgIENyb3NzUmVmTGlzdC5BZGQoeHJlZnBvcyk7Ci0gICAgWFJlZlN0cmVhbUxpc3QuQWRkKEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlhSZWZTdG0iKSkpOwotICAgIHhyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJQcmV2IikpOwotICAgIHdoaWxlICh4cmVmcG9zKSB7Ci0gICAgICAgIENyb3NzUmVmTGlzdC5JbnNlcnRBdCgwLCB4cmVmcG9zKTsKLSAgICAgICAgTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgVFJVRSwgRkFMU0UpOwotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gTG9hZFRyYWlsZXJWNCgpOwotICAgICAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHhyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKHBEaWN0LCBGWF9CU1RSQygiUHJldiIpKTsKLSAgICAgICAgWFJlZlN0cmVhbUxpc3QuSW5zZXJ0QXQoMCwgcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlhSZWZTdG0iKSkpOwotICAgICAgICBtX1RyYWlsZXJzLkFkZChwRGljdCk7Ci0gICAgfQotICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IENyb3NzUmVmTGlzdC5HZXRTaXplKCk7IGkgKyspCi0gICAgICAgIGlmICghTG9hZENyb3NzUmVmVjQoQ3Jvc3NSZWZMaXN0W2ldLCBYUmVmU3RyZWFtTGlzdFtpXSwgRkFMU0UsIGkgPT0gMCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIHJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIGR3T2JqQ291bnQpCi17Ci0gICAgRlhfRklMRVNJWkUgZHdTdGFydFBvcyA9IHBvcyAtIG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0OwotICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoZHdTdGFydFBvcyk7Ci0gICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnBvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOworRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZExpbmVhcml6ZWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd09iakNvdW50KSB7CisgIEZYX0ZJTEVTSVpFIGR3U3RhcnRQb3MgPSBwb3MgLSBtX1N5bnRheC5tX0hlYWRlck9mZnNldDsKKyAgbV9TeW50YXguUmVzdG9yZVBvcyhkd1N0YXJ0UG9zKTsKKyAgdm9pZCogcFJlc3VsdCA9CisgICAgICBGWFNZU19ic2VhcmNoKCZwb3MsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKKyAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgeworICAgIG1fU29ydGVkT2Zmc2V0LkFkZChwb3MpOworICB9CisgIEZYX0RXT1JEIHN0YXJ0X29iam51bSA9IDA7CisgIEZYX0RXT1JEIGNvdW50ID0gZHdPYmpDb3VudDsKKyAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgIGludDMyX3QgcmVjb3Jkc2l6ZSA9IDIwOworICBjaGFyKiBwQnVmID0gRlhfQWxsb2MoY2hhciwgMTAyNCAqIHJlY29yZHNpemUgKyAxKTsKKyAgcEJ1ZlsxMDI0ICogcmVjb3Jkc2l6ZV0gPSAnXDAnOworICBpbnQzMl90IG5CbG9ja3MgPSBjb3VudCAvIDEwMjQgKyAxOworICBmb3IgKGludDMyX3QgYmxvY2sgPSAwOyBibG9jayA8IG5CbG9ja3M7IGJsb2NrKyspIHsKKyAgICBpbnQzMl90IGJsb2NrX3NpemUgPSBibG9jayA9PSBuQmxvY2tzIC0gMSA/IGNvdW50ICUgMTAyNCA6IDEwMjQ7CisgICAgRlhfRFdPUkQgZHdSZWFkU2l6ZSA9IGJsb2NrX3NpemUgKiByZWNvcmRzaXplOworICAgIGlmICgoRlhfRklMRVNJWkUpKGR3U3RhcnRQb3MgKyBkd1JlYWRTaXplKSA+IG1fU3ludGF4Lm1fRmlsZUxlbikgeworICAgICAgRlhfRnJlZShwQnVmKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFtX1N5bnRheC5SZWFkQmxvY2soKHVpbnQ4X3QqKXBCdWYsIGR3UmVhZFNpemUpKSB7CisgICAgICBGWF9GcmVlKHBCdWYpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIHsKKyAgICAgIEZYX0RXT1JEIG9iam51bSA9IHN0YXJ0X29iam51bSArIGJsb2NrICogMTAyNCArIGk7CisgICAgICBjaGFyKiBwRW50cnkgPSBwQnVmICsgaSAqIHJlY29yZHNpemU7CisgICAgICBpZiAocEVudHJ5WzE3XSA9PSAnZicpIHsKKyAgICAgICAgbV9Dcm9zc1JlZi5TZXRBdEdyb3cob2JqbnVtLCAwKTsKKyAgICAgICAgbV9WNVR5cGUuU2V0QXRHcm93KG9iam51bSwgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IG9mZnNldCA9IEZYU1lTX2F0b2kocEVudHJ5KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgICAgICAgZm9yIChpbnQzMl90IGMgPSAwOyBjIDwgMTA7IGMrKykgeworICAgICAgICAgICAgaWYgKHBFbnRyeVtjXSA8ICcwJyB8fCBwRW50cnlbY10gPiAnOScpIHsKKyAgICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtX0Nyb3NzUmVmLlNldEF0R3JvdyhvYmpudW0sIG9mZnNldCk7CisgICAgICAgIGludDMyX3QgdmVyc2lvbiA9IEZYU1lTX2F0b2kocEVudHJ5ICsgMTEpOworICAgICAgICBpZiAodmVyc2lvbiA+PSAxKSB7CisgICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIG1fT2JqVmVyc2lvbi5TZXRBdEdyb3cob2JqbnVtLCB2ZXJzaW9uKTsKKyAgICAgICAgaWYgKG1fQ3Jvc3NSZWZbb2JqbnVtXSA8IG1fU3ludGF4Lm1fRmlsZUxlbikgeworICAgICAgICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKAorICAgICAgICAgICAgICAmbV9Dcm9zc1JlZltvYmpudW1dLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksCisgICAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7CisgICAgICAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKG1fQ3Jvc3NSZWZbb2JqbnVtXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1fVjVUeXBlLlNldEF0R3JvdyhvYmpudW0sIDEpOworICAgICAgfQorICAgIH0KKyAgfQorICBGWF9GcmVlKHBCdWYpOworICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zICsgY291bnQgKiByZWNvcmRzaXplKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfUGFyc2VyOjpMb2FkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBzdHJlYW1wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTa2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmlyc3QpIHsKKyAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOworICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpICE9IEZYX0JTVFJDKCJ4cmVmIikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdm9pZCogcFJlc3VsdCA9CisgICAgICBGWFNZU19ic2VhcmNoKCZwb3MsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKKyAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgeworICAgIG1fU29ydGVkT2Zmc2V0LkFkZChwb3MpOworICB9CisgIGlmIChzdHJlYW1wb3MpIHsKKyAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmc3RyZWFtcG9zLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlRmlsZVNpemUpOwogICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKHBvcyk7CisgICAgICBtX1NvcnRlZE9mZnNldC5BZGQoc3RyZWFtcG9zKTsKICAgICB9Ci0gICAgRlhfRFdPUkQgc3RhcnRfb2JqbnVtID0gMDsKLSAgICBGWF9EV09SRCBjb3VudCA9IGR3T2JqQ291bnQ7CisgIH0KKyAgd2hpbGUgKDEpIHsKICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKKyAgICBGWF9CT09MIGJJc051bWJlcjsKKyAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFiSXNOdW1iZXIpIHsKKyAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIEZYX0RXT1JEIHN0YXJ0X29iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CisgICAgaWYgKHN0YXJ0X29iam51bSA+PSAoMSA8PCAyMCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgRlhfRFdPUkQgY291bnQgPSBtX1N5bnRheC5HZXREaXJlY3ROdW0oKTsKKyAgICBtX1N5bnRheC5Ub05leHRXb3JkKCk7CisgICAgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgICAgRlhfQk9PTCBiRmlyc3RJdGVtID0gRkFMU0U7CiAgICAgaW50MzJfdCByZWNvcmRzaXplID0gMjA7Ci0gICAgY2hhciogcEJ1ZiA9IEZYX0FsbG9jKGNoYXIsIDEwMjQgKiByZWNvcmRzaXplICsgMSk7Ci0gICAgcEJ1ZlsxMDI0ICogcmVjb3Jkc2l6ZV0gPSAnXDAnOwotICAgIGludDMyX3QgbkJsb2NrcyA9IGNvdW50IC8gMTAyNCArIDE7Ci0gICAgZm9yIChpbnQzMl90IGJsb2NrID0gMDsgYmxvY2sgPCBuQmxvY2tzOyBibG9jayArKykgeworICAgIGlmIChiRmlyc3QpIHsKKyAgICAgIGJGaXJzdEl0ZW0gPSBUUlVFOworICAgIH0KKyAgICBtX2R3WHJlZlN0YXJ0T2JqTnVtID0gc3RhcnRfb2JqbnVtOworICAgIGlmICghYlNraXApIHsKKyAgICAgIGNoYXIqIHBCdWYgPSBGWF9BbGxvYyhjaGFyLCAxMDI0ICogcmVjb3Jkc2l6ZSArIDEpOworICAgICAgcEJ1ZlsxMDI0ICogcmVjb3Jkc2l6ZV0gPSAnXDAnOworICAgICAgaW50MzJfdCBuQmxvY2tzID0gY291bnQgLyAxMDI0ICsgMTsKKyAgICAgIEZYX0JPT0wgYkZpcnN0QmxvY2sgPSBUUlVFOworICAgICAgZm9yIChpbnQzMl90IGJsb2NrID0gMDsgYmxvY2sgPCBuQmxvY2tzOyBibG9jaysrKSB7CiAgICAgICAgIGludDMyX3QgYmxvY2tfc2l6ZSA9IGJsb2NrID09IG5CbG9ja3MgLSAxID8gY291bnQgJSAxMDI0IDogMTAyNDsKLSAgICAgICAgRlhfRFdPUkQgZHdSZWFkU2l6ZSA9IGJsb2NrX3NpemUgKiByZWNvcmRzaXplOwotICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKShkd1N0YXJ0UG9zICsgZHdSZWFkU2l6ZSkgPiBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKLSAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX1N5bnRheC5SZWFkQmxvY2soKHVpbnQ4X3QqKXBCdWYsIGR3UmVhZFNpemUpKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKHBCdWYpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IHN0YXJ0X29iam51bSArIGJsb2NrICogMTAyNCArIGk7Ci0gICAgICAgICAgICBjaGFyKiBwRW50cnkgPSBwQnVmICsgaSAqIHJlY29yZHNpemU7Ci0gICAgICAgICAgICBpZiAocEVudHJ5WzE3XSA9PSAnZicpIHsKLSAgICAgICAgICAgICAgICBtX0Nyb3NzUmVmLlNldEF0R3JvdyhvYmpudW0sIDApOwotICAgICAgICAgICAgICAgIG1fVjVUeXBlLlNldEF0R3JvdyhvYmpudW0sIDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCA9IEZYU1lTX2F0b2kocEVudHJ5KTsKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGMgPSAwOyBjIDwgMTA7IGMgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRW50cnlbY10gPCAnMCcgfHwgcEVudHJ5W2NdID4gJzknKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9Dcm9zc1JlZi5TZXRBdEdyb3cob2JqbnVtLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiA9IEZYU1lTX2F0b2kocEVudHJ5ICsgMTEpOwotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX09ialZlcnNpb24uU2V0QXRHcm93KG9iam51bSwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgaWYgKG1fQ3Jvc3NSZWZbb2JqbnVtXSA8IG1fU3ludGF4Lm1fRmlsZUxlbikgewotICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmbV9Dcm9zc1JlZltvYmpudW1dLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChtX0Nyb3NzUmVmW29iam51bV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fVjVUeXBlLlNldEF0R3JvdyhvYmpudW0sIDEpOworICAgICAgICBtX1N5bnRheC5SZWFkQmxvY2soKHVpbnQ4X3QqKXBCdWYsIGJsb2NrX3NpemUgKiByZWNvcmRzaXplKTsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gc3RhcnRfb2JqbnVtICsgYmxvY2sgKiAxMDI0ICsgaTsKKyAgICAgICAgICBjaGFyKiBwRW50cnkgPSBwQnVmICsgaSAqIHJlY29yZHNpemU7CisgICAgICAgICAgaWYgKHBFbnRyeVsxN10gPT0gJ2YnKSB7CisgICAgICAgICAgICBpZiAoYkZpcnN0SXRlbSkgeworICAgICAgICAgICAgICBvYmpudW0gPSAwOworICAgICAgICAgICAgICBiRmlyc3RJdGVtID0gRkFMU0U7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYkZpcnN0QmxvY2spIHsKKyAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gKEZYX0ZJTEVTSVpFKUZYU1lTX2F0b2k2NChwRW50cnkpOworICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb24gPSBGWFNZU19hdG9pKHBFbnRyeSArIDExKTsKKyAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAwICYmIHZlcnNpb24gPT0gNjU1MzUgJiYgc3RhcnRfb2JqbnVtICE9IDApIHsKKyAgICAgICAgICAgICAgICBzdGFydF9vYmpudW0tLTsKKyAgICAgICAgICAgICAgICBvYmpudW0gPSAwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX0Nyb3NzUmVmLlNldEF0R3JvdyhvYmpudW0sIDApOworICAgICAgICAgICAgbV9WNVR5cGUuU2V0QXRHcm93KG9iam51bSwgMCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQocEVudHJ5KTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgICBmb3IgKGludDMyX3QgYyA9IDA7IGMgPCAxMDsgYysrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBFbnRyeVtjXSA8ICcwJyB8fCBwRW50cnlbY10gPiAnOScpIHsKKyAgICAgICAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7CisgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX0Nyb3NzUmVmLlNldEF0R3JvdyhvYmpudW0sIG9mZnNldCk7CisgICAgICAgICAgICBpbnQzMl90IHZlcnNpb24gPSBGWFNZU19hdG9pKHBFbnRyeSArIDExKTsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IDEpIHsKKyAgICAgICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9PYmpWZXJzaW9uLlNldEF0R3JvdyhvYmpudW0sIHZlcnNpb24pOworICAgICAgICAgICAgaWYgKG1fQ3Jvc3NSZWZbb2JqbnVtXSA8IG1fU3ludGF4Lm1fRmlsZUxlbikgeworICAgICAgICAgICAgICB2b2lkKiBwUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgIEZYU1lTX2JzZWFyY2goJm1fQ3Jvc3NSZWZbb2JqbnVtXSwgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlRmlsZVNpemUpOworICAgICAgICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKG1fQ3Jvc3NSZWZbb2JqbnVtXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fVjVUeXBlLlNldEF0R3JvdyhvYmpudW0sIDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYkZpcnN0QmxvY2spIHsKKyAgICAgICAgICAgIGJGaXJzdEJsb2NrID0gRkFMU0U7CisgICAgICAgICAgfQogICAgICAgICB9CisgICAgICB9CisgICAgICBGWF9GcmVlKHBCdWYpOwogICAgIH0KLSAgICBGWF9GcmVlKHBCdWYpOwogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MgKyBjb3VudCAqIHJlY29yZHNpemUpOwotICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChzdHJlYW1wb3MpCisgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNShzdHJlYW1wb3MsIHN0cmVhbXBvcywgRkFMU0UpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUgc3RyZWFtcG9zLCBGWF9CT09MIGJTa2lwLCBGWF9CT09MIGJGaXJzdCkKLXsKLSAgICBtX1N5bnRheC5SZXN0b3JlUG9zKHBvcyk7Ci0gICAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSBGWF9CU1RSQygieHJlZiIpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHhyZWZwb3MpIHsKKyAgaWYgKCFMb2FkQ3Jvc3NSZWZWNSh4cmVmcG9zLCB4cmVmcG9zLCBUUlVFKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB3aGlsZSAoeHJlZnBvcykKKyAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIEZBTFNFKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmcG9zLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7Ci0gICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQocG9zKTsKKyAgbV9PYmplY3RTdHJlYW1NYXAuSW5pdEhhc2hUYWJsZSgxMDEsIEZBTFNFKTsKKyAgbV9iWFJlZlN0cmVhbSA9IFRSVUU7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX1BhcnNlcjo6UmVidWlsZENyb3NzUmVmKCkgeworICBtX0Nyb3NzUmVmLlJlbW92ZUFsbCgpOworICBtX1Y1VHlwZS5SZW1vdmVBbGwoKTsKKyAgbV9Tb3J0ZWRPZmZzZXQuUmVtb3ZlQWxsKCk7CisgIG1fT2JqVmVyc2lvbi5SZW1vdmVBbGwoKTsKKyAgaWYgKG1fcFRyYWlsZXIpIHsKKyAgICBtX3BUcmFpbGVyLT5SZWxlYXNlKCk7CisgICAgbV9wVHJhaWxlciA9IE5VTEw7CisgIH0KKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbnQzMl90IGluc2lkZV9pbmRleCA9IDA7CisgIEZYX0RXT1JEIG9iam51bSA9IDAsIGdlbm51bSA9IDA7CisgIGludDMyX3QgZGVwdGggPSAwOworICB1aW50OF90KiBidWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCA0MDk2KTsKKyAgRlhfRklMRVNJWkUgcG9zID0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7CisgIEZYX0ZJTEVTSVpFIHN0YXJ0X3BvcyA9IDAsIHN0YXJ0X3BvczEgPSAwOworICBGWF9GSUxFU0laRSBsYXN0X29iaiA9IC0xLCBsYXN0X3hyZWYgPSAtMSwgbGFzdF90cmFpbGVyID0gLTE7CisgIHdoaWxlIChwb3MgPCBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKKyAgICBGWF9CT09MIGJPdmVyRmxvdyA9IEZBTFNFOworICAgIEZYX0RXT1JEIHNpemUgPSAoRlhfRFdPUkQpKG1fU3ludGF4Lm1fRmlsZUxlbiAtIHBvcyk7CisgICAgaWYgKHNpemUgPiA0MDk2KSB7CisgICAgICBzaXplID0gNDA5NjsKICAgICB9Ci0gICAgaWYgKHN0cmVhbXBvcykgewotICAgICAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmc3RyZWFtcG9zLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7Ci0gICAgICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChzdHJlYW1wb3MpOwotICAgICAgICB9CisgICAgaWYgKCFtX1N5bnRheC5tX3BGaWxlQWNjZXNzLT5SZWFkQmxvY2soYnVmZmVyLCBwb3MsIHNpemUpKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIHVpbnQ4X3QgYnl0ZSA9IGJ1ZmZlcltpXTsKKyAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBpZiAoUERGX0NoYXJUeXBlW2J5dGVdID09ICdXJykgeworICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGJ5dGUgPD0gJzknICYmIGJ5dGUgPj0gJzAnKSB7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYnl0ZSA9PSAnJScpIHsKKyAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSA5OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYnl0ZSA9PSAnKCcpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDEwOworICAgICAgICAgICAgZGVwdGggPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYnl0ZSA9PSAnPCcpIHsKKyAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDE7CisgICAgICAgICAgICBzdGF0dXMgPSAxMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGJ5dGUgPT0gJ1xcJykgeworICAgICAgICAgICAgc3RhdHVzID0gMTM7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChieXRlID09ICd0JykgeworICAgICAgICAgICAgc3RhdHVzID0gNzsKKyAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIHN0YXJ0X29iam51bSA9IEZYU1lTX2F0b2kod29yZCk7Ci0gICAgICAgIGlmIChzdGFydF9vYmpudW0gPj0gKDEgPDwgMjApKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgY291bnQgPSBtX1N5bnRheC5HZXREaXJlY3ROdW0oKTsKLSAgICAgICAgbV9TeW50YXguVG9OZXh0V29yZCgpOwotICAgICAgICBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICAgICAgRlhfQk9PTCBiRmlyc3RJdGVtID0gRkFMU0U7Ci0gICAgICAgIGludDMyX3QgcmVjb3Jkc2l6ZSA9IDIwOwotICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICBiRmlyc3RJdGVtID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBtX2R3WHJlZlN0YXJ0T2JqTnVtID0gc3RhcnRfb2JqbnVtOwotICAgICAgICBpZiAoIWJTa2lwKSB7Ci0gICAgICAgICAgICBjaGFyKiBwQnVmID0gRlhfQWxsb2MoY2hhciwgMTAyNCAqIHJlY29yZHNpemUgKyAxKTsKLSAgICAgICAgICAgIHBCdWZbMTAyNCAqIHJlY29yZHNpemVdID0gJ1wwJzsKLSAgICAgICAgICAgIGludDMyX3QgbkJsb2NrcyA9IGNvdW50IC8gMTAyNCArIDE7Ci0gICAgICAgICAgICBGWF9CT09MIGJGaXJzdEJsb2NrID0gVFJVRTsKLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBibG9jayA9IDA7IGJsb2NrIDwgbkJsb2NrczsgYmxvY2sgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGJsb2NrX3NpemUgPSBibG9jayA9PSBuQmxvY2tzIC0gMSA/IGNvdW50ICUgMTAyNCA6IDEwMjQ7Ci0gICAgICAgICAgICAgICAgbV9TeW50YXguUmVhZEJsb2NrKCh1aW50OF90KilwQnVmLCBibG9ja19zaXplICogcmVjb3Jkc2l6ZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0gPSBzdGFydF9vYmpudW0gKyBibG9jayAqIDEwMjQgKyBpOwotICAgICAgICAgICAgICAgICAgICBjaGFyKiBwRW50cnkgPSBwQnVmICsgaSAqIHJlY29yZHNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRW50cnlbMTddID09ICdmJykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJGaXJzdEl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpudW0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaXJzdEl0ZW0gPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiRmlyc3RCbG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQocEVudHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb24gPSBGWFNZU19hdG9pKHBFbnRyeSArIDExKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IDAgJiYgdmVyc2lvbiA9PSA2NTUzNSAmJiBzdGFydF9vYmpudW0gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9vYmpudW0tLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqbnVtID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX0Nyb3NzUmVmLlNldEF0R3JvdyhvYmpudW0sIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9WNVR5cGUuU2V0QXRHcm93KG9iam51bSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSAoRlhfRklMRVNJWkUpRlhTWVNfYXRvaTY0KHBFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgYyA9IDA7IGMgPCAxMDsgYyArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEVudHJ5W2NdIDwgJzAnIHx8IHBFbnRyeVtjXSA+ICc5JykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3Jvc3NSZWYuU2V0QXRHcm93KG9iam51bSwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiA9IEZYU1lTX2F0b2kocEVudHJ5ICsgMTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPj0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlZlcnNpb25VcGRhdGVkID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fT2JqVmVyc2lvbi5TZXRBdEdyb3cob2JqbnVtLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Nyb3NzUmVmW29iam51bV0gPCBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmbV9Dcm9zc1JlZltvYmpudW1dLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQobV9Dcm9zc1JlZltvYmpudW1dKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX1Y1VHlwZS5TZXRBdEdyb3cob2JqbnVtLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYkZpcnN0QmxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJGaXJzdEJsb2NrID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GcmVlKHBCdWYpOwotICAgICAgICB9Ci0gICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MgKyBjb3VudCAqIHJlY29yZHNpemUpOwotICAgIH0KLSAgICBpZiAoc3RyZWFtcG9zKQotICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHN0cmVhbXBvcywgc3RyZWFtcG9zLCBGQUxTRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgeHJlZnBvcykKLXsKLSAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIFRSVUUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgd2hpbGUgKHhyZWZwb3MpCi0gICAgICAgIGlmICghTG9hZENyb3NzUmVmVjUoeHJlZnBvcywgeHJlZnBvcywgRkFMU0UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICBtX09iamVjdFN0cmVhbU1hcC5Jbml0SGFzaFRhYmxlKDEwMSwgRkFMU0UpOwotICAgIG1fYlhSZWZTdHJlYW0gPSBUUlVFOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6UmVidWlsZENyb3NzUmVmKCkKLXsKLSAgICBtX0Nyb3NzUmVmLlJlbW92ZUFsbCgpOwotICAgIG1fVjVUeXBlLlJlbW92ZUFsbCgpOwotICAgIG1fU29ydGVkT2Zmc2V0LlJlbW92ZUFsbCgpOwotICAgIG1fT2JqVmVyc2lvbi5SZW1vdmVBbGwoKTsKLSAgICBpZiAobV9wVHJhaWxlcikgewotICAgICAgICBtX3BUcmFpbGVyLT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fcFRyYWlsZXIgPSBOVUxMOwotICAgIH0KLSAgICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCBpbnNpZGVfaW5kZXggPSAwOwotICAgIEZYX0RXT1JEIG9iam51bSA9IDAsIGdlbm51bSA9IDA7Ci0gICAgaW50MzJfdCBkZXB0aCA9IDA7Ci0gICAgdWludDhfdCogYnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgNDA5Nik7Ci0gICAgRlhfRklMRVNJWkUgcG9zID0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7Ci0gICAgRlhfRklMRVNJWkUgc3RhcnRfcG9zID0gMCwgc3RhcnRfcG9zMSA9IDA7Ci0gICAgRlhfRklMRVNJWkUgbGFzdF9vYmogPSAtMSwgbGFzdF94cmVmID0gLTEsIGxhc3RfdHJhaWxlciA9IC0xOwotICAgIHdoaWxlIChwb3MgPCBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKLSAgICAgICAgRlhfQk9PTCBiT3ZlckZsb3cgPSBGQUxTRTsKLSAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IChGWF9EV09SRCkobV9TeW50YXgubV9GaWxlTGVuIC0gcG9zKTsKLSAgICAgICAgaWYgKHNpemUgPiA0MDk2KSB7Ci0gICAgICAgICAgICBzaXplID0gNDA5NjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1fU3ludGF4Lm1fcEZpbGVBY2Nlc3MtPlJlYWRCbG9jayhidWZmZXIsIHBvcywgc2l6ZSkpIHsKKyAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPD0gJzknICYmIGJ5dGUgPj0gJzAnKSB7CisgICAgICAgICAgICBzdGFydF9wb3MgPSBwb3MgKyBpOworICAgICAgICAgICAgc3RhdHVzID0gMjsKKyAgICAgICAgICAgIG9iam51bSA9IGJ5dGUgLSAnMCc7CisgICAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICd0JykgeworICAgICAgICAgICAgc3RhdHVzID0gNzsKKyAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDE7CisgICAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICd4JykgeworICAgICAgICAgICAgc3RhdHVzID0gODsKKyAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgaWYgKGJ5dGUgPD0gJzknICYmIGJ5dGUgPj0gJzAnKSB7CisgICAgICAgICAgICBvYmpudW0gPSBvYmpudW0gKiAxMCArIGJ5dGUgLSAnMCc7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICAgICAgdWludDhfdCBieXRlID0gYnVmZmVyW2ldOwotICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChieXRlIDw9ICc5JyAmJiBieXRlID49ICcwJykgewotICAgICAgICAgICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PSAnJScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA5OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChieXRlID09ICcoJykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT0gJzwnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT0gJ1xcJykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT0gJ3QnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA3OwotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlIDw9ICc5JyAmJiBieXRlID49ICcwJykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zID0gcG9zICsgaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmpudW0gPSBieXRlIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJ3QnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA3OwotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICd4JykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLWk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPD0gJzknICYmIGJ5dGUgPj0gJzAnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmpudW0gPSBvYmpudW0gKiAxMCArIGJ5dGUgLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAzOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPD0gJzknICYmIGJ5dGUgPj0gJzAnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MxID0gcG9zICsgaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZW5udW0gPSBieXRlIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJ3QnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA3OwotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA8PSAnOScgJiYgYnl0ZSA+PSAnMCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbm51bSA9IGdlbm51bSAqIDEwICsgYnl0ZSAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLWk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT0gJ28nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA2OwotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlIDw9ICc5JyAmJiBieXRlID49ICcwJykgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JqbnVtID0gZ2VubnVtOwotICAgICAgICAgICAgICAgICAgICAgICAgZ2VubnVtID0gYnl0ZSAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcyA9IHN0YXJ0X3BvczE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MxID0gcG9zICsgaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAndCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5zaWRlX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgIT0gJ2InKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlICE9ICdqJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUERGX0NoYXJUeXBlW2J5dGVdID09ICdXJyB8fCBQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ0QnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmpudW0gPiAweDEwMDAwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvYmpfcG9zID0gc3RhcnRfcG9zIC0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Rfb2JqID0gc3RhcnRfcG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmb2JqX3BvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQob2JqX3Bvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2JqX2VuZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0ICpwT2JqZWN0ID0gUGFyc2VJbmRpcmVjdE9iamVjdEF0QnlTdHJpY3QobV9wRG9jdW1lbnQsIG9ial9wb3MsIG9iam51bSwgTlVMTCwgJm9ial9lbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iamVjdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlUeXBlID0JcE9iamVjdC0+R2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlUeXBlID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopcE9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRGljdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJUeXBlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlID0gcERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiVHlwZSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChic1ZhbHVlID09IEZYX0JTVFJDKCJYUmVmIikgJiYgcERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJTaXplIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBSb290ID0gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIlJvb3QiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBSb290ICYmIHBSb290LT5HZXREaWN0KCkgJiYgcFJvb3QtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiUGFnZXMiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRyYWlsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFpbGVyID0gKENQREZfRGljdGlvbmFyeSopcERpY3QtPkNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3Mob2JqX3Bvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG1fU3ludGF4LkZpbmRUYWcoRlhfQlNUUkMoIm9iaiIpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG5MZW4gPSBvYmpfZW5kIC0gb2JqX3BvcyAtIG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChGWF9EV09SRCluTGVuID4gc2l6ZSAtIGkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IG9ial9lbmQgKyBtX1N5bnRheC5tX0hlYWRlck9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJPdmVyRmxvdyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IChGWF9EV09SRCluTGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Nyb3NzUmVmLkdldFNpemUoKSA+IChpbnQzMl90KW9iam51bSAmJiBtX0Nyb3NzUmVmW29iam51bV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwT2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2xkZ2VuID0gbV9PYmpWZXJzaW9uLkdldEF0KG9iam51bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Dcm9zc1JlZltvYmpudW1dID0gb2JqX3BvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX09ialZlcnNpb24uU2V0QXQob2JqbnVtLCAoaW50MTZfdClnZW5udW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRnZW4gIT0gZ2VubnVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlZlcnNpb25VcGRhdGVkID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Nyb3NzUmVmLlNldEF0R3JvdyhvYmpudW0sIG9ial9wb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9WNVR5cGUuU2V0QXRHcm93KG9iam51bSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX09ialZlcnNpb24uU2V0QXRHcm93KG9iam51bSwgKGludDE2X3QpZ2VubnVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iamVjdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluc2lkZV9pbmRleCA9PSA3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUERGX0NoYXJUeXBlW2J5dGVdID09ICdXJyB8fCBQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ0QnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF90cmFpbGVyID0gcG9zICsgaSAtIDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MgKyBpIC0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gbV9TeW50YXguR2V0T2JqZWN0KG1fcERvY3VtZW50LCAwLCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iaikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZICYmIHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBUcmFpbGVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyID0gKChDUERGX1N0cmVhbSopcE9iaiktPkdldERpY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYWlsZXIgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUcmFpbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRyYWlsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBSb290ID0gcFRyYWlsZXItPkdldEVsZW1lbnQoRlhfQlNUUkMoIlJvb3QiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUm9vdCA9PSBOVUxMIHx8IChwUm9vdC0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9EV09SRCltX0Nyb3NzUmVmLkdldFNpemUoKSA+ICgoQ1BERl9SZWZlcmVuY2UqKXBSb290KS0+R2V0UmVmT2JqTnVtKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3Jvc3NSZWYuR2V0QXQoKChDUERGX1JlZmVyZW5jZSopcFJvb3QpLT5HZXRSZWZPYmpOdW0oKSkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBUcmFpbGVyLT5HZXRTdGFydFBvcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBvcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBUcmFpbGVyLT5HZXROZXh0RWxlbWVudChwb3MsIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhaWxlci0+U2V0QXQoa2V5LCBwT2JqLT5DbG9uZSgpLCBtX3BEb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYWlsZXIgPSAoQ1BERl9EaWN0aW9uYXJ5KilwVHJhaWxlci0+Q2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYWlsZXIgPSBwVHJhaWxlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBkd1NhdmVQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cldvcmQgPSBtX1N5bnRheC5HZXRLZXl3b3JkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyV29yZC5Db21wYXJlKEZYX0JTVFJDKCJzdGFydHhyZWYiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk51bWJlciA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNPZmZzZXQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9MYXN0WFJlZk9mZnNldCA9IEZYU1lTX2F0b2koYnNPZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoZHdTYXZlUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAidHJhaWxlciJbaW5zaWRlX2luZGV4XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbnNpZGVfaW5kZXggPT0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF94cmVmID0gcG9zICsgaSAtIDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gInhyZWYiW2luc2lkZV9pbmRleF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZV9pbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PSAnXHInIHx8IGJ5dGUgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PSAnKScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGVwdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT0gJzwnICYmIGluc2lkZV9pbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxMjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICc+JykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICAgICAgICAtLWk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ0QnIHx8IFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAnJScgfHwgYnl0ZSA9PSAnKCcgfHwgYnl0ZSA9PSAnPCcgfHwgYnl0ZSA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluc2lkZV9pbmRleCA9PSA2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gImVuZG9iaiJbaW5zaWRlX2luZGV4XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYk92ZXJGbG93KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcG9zICs9IHNpemU7Ci0gICAgfQotICAgIGlmIChsYXN0X3hyZWYgIT0gLTEgJiYgbGFzdF94cmVmID4gbGFzdF9vYmopIHsKLSAgICAgICAgbGFzdF90cmFpbGVyID0gbGFzdF94cmVmOwotICAgIH0gZWxzZSBpZiAobGFzdF90cmFpbGVyID09IC0xIHx8IGxhc3RfeHJlZiA8IGxhc3Rfb2JqKSB7Ci0gICAgICAgIGxhc3RfdHJhaWxlciA9IG1fU3ludGF4Lm1fRmlsZUxlbjsKLSAgICB9Ci0gICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gbGFzdF90cmFpbGVyIC0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7Ci0gICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJm9mZnNldCwgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKG9mZnNldCk7Ci0gICAgfQotICAgIEZYX0ZyZWUoYnVmZmVyKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXN0YXRpYyBGWF9EV09SRCBfR2V0VmFySW50KGNvbnN0IHVpbnQ4X3QqIHAsIGludDMyX3QgbikKLXsKLSAgICBGWF9EV09SRCByZXN1bHQgPSAwOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG47IGkgKyspIHsKLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICogMjU2ICsgcFtpXTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUmIHByZXYsIEZYX0JPT0wgYk1haW5YUmVmKQotewotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilQYXJzZUluZGlyZWN0T2JqZWN0QXQobV9wRG9jdW1lbnQsIHBvcywgMCwgTlVMTCk7Ci0gICAgaWYgKCFwU3RyZWFtKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcERvY3VtZW50KSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSAqIHBEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKLSAgICAgICAgaWYgKCFwRGljdCB8fCBwRGljdC0+R2V0T2JqTnVtKCkgIT0gcFN0cmVhbS0+bV9PYmpOdW0pIHsKLSAgICAgICAgICAgIG1fcERvY3VtZW50LT5JbnNlcnRJbmRpcmVjdE9iamVjdChwU3RyZWFtLT5tX09iak51bSwgcFN0cmVhbSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocFN0cmVhbS0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBTdHJlYW0tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcHJldiA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiUHJldiIpKTsKLSAgICBpbnQzMl90IHNpemUgPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXIoRlhfQlNUUkMoIlNpemUiKSk7Ci0gICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoYk1haW5YUmVmKSB7Ci0gICAgICAgIG1fcFRyYWlsZXIgPSAoQ1BERl9EaWN0aW9uYXJ5KilwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCk7Ci0gICAgICAgIG1fQ3Jvc3NSZWYuU2V0U2l6ZShzaXplKTsKLSAgICAgICAgaWYgKG1fVjVUeXBlLlNldFNpemUoc2l6ZSkpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChtX1Y1VHlwZS5HZXREYXRhKCksIDAsIHNpemUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9UcmFpbGVycy5BZGQoKENQREZfRGljdGlvbmFyeSopcFN0cmVhbS0+R2V0RGljdCgpLT5DbG9uZSgpKTsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+ID4gYXJySW5kZXg7Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRBcnJheShGWF9CU1RSQygiSW5kZXgiKSk7Ci0gICAgaWYgKHBBcnJheSkgewotICAgICAgICBGWF9EV09SRCBuUGFpclNpemUgPSBwQXJyYXktPkdldENvdW50KCkgLyAyOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgblBhaXJTaXplOyBpKyspIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwU3RhcnROdW1PYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaSAqIDIpOwotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBDb3VudE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpICogMiArIDEpOwotICAgICAgICAgICAgaWYgKHBTdGFydE51bU9iaiAmJiBwU3RhcnROdW1PYmotPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSCi0gICAgICAgICAgICAgICAgJiYgcENvdW50T2JqICYmIHBDb3VudE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgICAgICAgICBpbnQgblN0YXJ0TnVtID0gcFN0YXJ0TnVtT2JqLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgaW50IG5Db3VudCA9IHBDb3VudE9iai0+R2V0SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIGlmIChuU3RhcnROdW0gPj0gMCAmJiBuQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyckluZGV4LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihuU3RhcnROdW0sIG5Db3VudCkpOworICAgICAgICAgIH0gZWxzZSBpZiAoUERGX0NoYXJUeXBlW2J5dGVdID09ICdXJykgeworICAgICAgICAgICAgc3RhdHVzID0gMzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgc3RhdHVzID0gMTQ7CisgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIGlmIChieXRlIDw9ICc5JyAmJiBieXRlID49ICcwJykgeworICAgICAgICAgICAgc3RhcnRfcG9zMSA9IHBvcyArIGk7CisgICAgICAgICAgICBzdGF0dXMgPSA0OworICAgICAgICAgICAgZ2VubnVtID0gYnl0ZSAtICcwJzsKKyAgICAgICAgICB9IGVsc2UgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAndCcpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDc7CisgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgIGlmIChieXRlIDw9ICc5JyAmJiBieXRlID49ICcwJykgeworICAgICAgICAgICAgZ2VubnVtID0gZ2VubnVtICogMTAgKyBieXRlIC0gJzAnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnKSB7CisgICAgICAgICAgICBzdGF0dXMgPSA1OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgIGlmIChieXRlID09ICdvJykgeworICAgICAgICAgICAgc3RhdHVzID0gNjsKKyAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDE7CisgICAgICAgICAgfSBlbHNlIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPD0gJzknICYmIGJ5dGUgPj0gJzAnKSB7CisgICAgICAgICAgICBvYmpudW0gPSBnZW5udW07CisgICAgICAgICAgICBnZW5udW0gPSBieXRlIC0gJzAnOworICAgICAgICAgICAgc3RhcnRfcG9zID0gc3RhcnRfcG9zMTsKKyAgICAgICAgICAgIHN0YXJ0X3BvczEgPSBwb3MgKyBpOworICAgICAgICAgICAgc3RhdHVzID0gNDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJ3QnKSB7CisgICAgICAgICAgICBzdGF0dXMgPSA3OworICAgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICBzd2l0Y2ggKGluc2lkZV9pbmRleCkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICBpZiAoYnl0ZSAhPSAnYicpIHsKKyAgICAgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXgrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgaWYgKGJ5dGUgIT0gJ2onKSB7CisgICAgICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4Kys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnIHx8IFBERl9DaGFyVHlwZVtieXRlXSA9PSAnRCcpIHsKKyAgICAgICAgICAgICAgICBpZiAob2JqbnVtID4gMHgxMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChhcnJJbmRleC5zaXplKCkgPT0gMCkgewotICAgICAgICBhcnJJbmRleC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoMCwgc2l6ZSkpOwotICAgIH0KLSAgICBwQXJyYXkgPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldEFycmF5KEZYX0JTVFJDKCJXIikpOwotICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0ZYX0RXb3JkQXJyYXkgV2lkdGhBcnJheTsKLSAgICBGWF9TQUZFX0RXT1JEIGR3QWNjV2lkdGggPSAwOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgV2lkdGhBcnJheS5BZGQocEFycmF5LT5HZXRJbnRlZ2VyKGkpKTsKLSAgICAgICAgZHdBY2NXaWR0aCArPSBXaWR0aEFycmF5W2ldOwotICAgIH0KLSAgICBpZiAoIWR3QWNjV2lkdGguSXNWYWxpZCgpIHx8IFdpZHRoQXJyYXkuR2V0U2l6ZSgpIDwgMykgewotICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgdG90YWxXaWR0aCA9IGR3QWNjV2lkdGguVmFsdWVPckRpZSgpOwotICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSk7Ci0gICAgY29uc3QgdWludDhfdCogcERhdGEgPSBhY2MuR2V0RGF0YSgpOwotICAgIEZYX0RXT1JEIGR3VG90YWxTaXplID0gYWNjLkdldFNpemUoKTsKLSAgICBGWF9EV09SRCBzZWdpbmRleCA9IDA7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGFyckluZGV4LnNpemUoKTsgaSArKykgewotICAgICAgICBpbnQzMl90IHN0YXJ0bnVtID0gYXJySW5kZXhbaV0uZmlyc3Q7Ci0gICAgICAgIGlmIChzdGFydG51bSA8IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIG1fZHdYcmVmU3RhcnRPYmpOdW0gPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRCwgaW50MzJfdD4gKHN0YXJ0bnVtKTsKLSAgICAgICAgRlhfRFdPUkQgY291bnQgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRCwgaW50MzJfdD4gKGFyckluZGV4W2ldLnNlY29uZCk7Ci0gICAgICAgIEZYX1NBRkVfRFdPUkQgZHdDYWN1bGF0ZWRTaXplID0gc2VnaW5kZXg7Ci0gICAgICAgIGR3Q2FjdWxhdGVkU2l6ZSArPSBjb3VudDsKLSAgICAgICAgZHdDYWN1bGF0ZWRTaXplICo9IHRvdGFsV2lkdGg7Ci0gICAgICAgIGlmICghZHdDYWN1bGF0ZWRTaXplLklzVmFsaWQoKSB8fCBkd0NhY3VsYXRlZFNpemUuVmFsdWVPckRpZSgpID4gZHdUb3RhbFNpemUpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNlZ3N0YXJ0ID0gcERhdGEgKyBzZWdpbmRleCAqIHRvdGFsV2lkdGg7Ci0gICAgICAgIEZYX1NBRkVfRFdPUkQgZHdNYXhPYmpOdW0gPSBzdGFydG51bTsKLSAgICAgICAgZHdNYXhPYmpOdW0gKz0gY291bnQ7Ci0gICAgICAgIEZYX0RXT1JEIGR3VjVTaXplID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQsIGludDMyX3Q+IChtX1Y1VHlwZS5HZXRTaXplKCkpOwotICAgICAgICBpZiAoIWR3TWF4T2JqTnVtLklzVmFsaWQoKSB8fCBkd01heE9iak51bS5WYWx1ZU9yRGllKCkgPiBkd1Y1U2l6ZSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChGWF9EV09SRCBqID0gMDsgaiA8IGNvdW50OyBqICsrKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHR5cGUgPSAxOwotICAgICAgICAgICAgY29uc3QgdWludDhfdCogZW50cnlzdGFydCA9IHNlZ3N0YXJ0ICsgaiAqIHRvdGFsV2lkdGg7Ci0gICAgICAgICAgICBpZiAoV2lkdGhBcnJheVswXSkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBfR2V0VmFySW50KGVudHJ5c3RhcnQsIFdpZHRoQXJyYXlbMF0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fVjVUeXBlW3N0YXJ0bnVtICsgal0gPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gX0dldFZhckludChlbnRyeXN0YXJ0ICsgV2lkdGhBcnJheVswXSwgV2lkdGhBcnJheVsxXSk7Ci0gICAgICAgICAgICAgICAgbV9Dcm9zc1JlZltzdGFydG51bSArIGpdID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZvZmZzZXQsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKKyAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvYmpfcG9zID0gc3RhcnRfcG9zIC0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7CisgICAgICAgICAgICAgICAgbGFzdF9vYmogPSBzdGFydF9wb3M7CisgICAgICAgICAgICAgICAgdm9pZCogcFJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgIEZYU1lTX2JzZWFyY2goJm9ial9wb3MsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmVGaWxlU2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChvYmpfcG9zKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9WNVR5cGVbc3RhcnRudW0gKyBqXSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9WNVR5cGVbc3RhcnRudW0gKyBqXSA9IHR5cGU7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9Dcm9zc1JlZltzdGFydG51bSArIGpdID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gX0dldFZhckludChlbnRyeXN0YXJ0ICsgV2lkdGhBcnJheVswXSwgV2lkdGhBcnJheVsxXSk7Ci0gICAgICAgICAgICAgICAgbV9Dcm9zc1JlZltzdGFydG51bSArIGpdID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJm9mZnNldCwgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvYmpfZW5kID0gMDsKKyAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iamVjdCA9IFBhcnNlSW5kaXJlY3RPYmplY3RBdEJ5U3RyaWN0KAorICAgICAgICAgICAgICAgICAgICBtX3BEb2N1bWVudCwgb2JqX3Bvcywgb2JqbnVtLCBOVUxMLCAmb2JqX2VuZCk7CisgICAgICAgICAgICAgICAgaWYgKHBPYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgIGludCBpVHlwZSA9IHBPYmplY3QtPkdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgIGlmIChpVHlwZSA9PSBQREZPQkpfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwT2JqZWN0OworICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocERpY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJUeXBlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJUeXBlIikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJzVmFsdWUgPT0gRlhfQlNUUkMoIlhSZWYiKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiU2l6ZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFJvb3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIlJvb3QiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUm9vdCAmJiBwUm9vdC0+R2V0RGljdCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUm9vdC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQYWdlcyIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BUcmFpbGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFpbGVyLT5SZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYWlsZXIgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRGljdC0+Q2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3Mob2JqX3Bvcyk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbV9TeW50YXguRmluZFRhZyhGWF9CU1RSQygib2JqIiksIDApOworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IG1fVjVUeXBlLkdldFNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fVjVUeXBlW29mZnNldF0gPSAyNTU7CisgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMzsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgbkxlbiA9IG9ial9lbmQgLSBvYmpfcG9zIC0gb2Zmc2V0OworICAgICAgICAgICAgICAgIGlmICgoRlhfRFdPUkQpbkxlbiA+IHNpemUgLSBpKSB7CisgICAgICAgICAgICAgICAgICBwb3MgPSBvYmpfZW5kICsgbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7CisgICAgICAgICAgICAgICAgICBiT3ZlckZsb3cgPSBUUlVFOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBpICs9IChGWF9EV09SRCluTGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobV9Dcm9zc1JlZi5HZXRTaXplKCkgPiAoaW50MzJfdClvYmpudW0gJiYKKyAgICAgICAgICAgICAgICAgICAgbV9Dcm9zc1JlZltvYmpudW1dKSB7CisgICAgICAgICAgICAgICAgICBpZiAocE9iamVjdCkgeworICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvbGRnZW4gPSBtX09ialZlcnNpb24uR2V0QXQob2JqbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgbV9Dcm9zc1JlZltvYmpudW1dID0gb2JqX3BvczsKKyAgICAgICAgICAgICAgICAgICAgbV9PYmpWZXJzaW9uLlNldEF0KG9iam51bSwgKGludDE2X3QpZ2VubnVtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGdlbiAhPSBnZW5udW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgbV9Dcm9zc1JlZi5TZXRBdEdyb3cob2JqbnVtLCBvYmpfcG9zKTsKKyAgICAgICAgICAgICAgICAgIG1fVjVUeXBlLlNldEF0R3JvdyhvYmpudW0sIDEpOworICAgICAgICAgICAgICAgICAgbV9PYmpWZXJzaW9uLlNldEF0R3JvdyhvYmpudW0sIChpbnQxNl90KWdlbm51bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgICBwT2JqZWN0LT5SZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgaWYgKGluc2lkZV9pbmRleCA9PSA3KSB7CisgICAgICAgICAgICBpZiAoUERGX0NoYXJUeXBlW2J5dGVdID09ICdXJyB8fCBQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ0QnKSB7CisgICAgICAgICAgICAgIGxhc3RfdHJhaWxlciA9IHBvcyArIGkgLSA3OworICAgICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKHBvcyArIGkgLSBtX1N5bnRheC5tX0hlYWRlck9mZnNldCk7CisgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gbV9TeW50YXguR2V0T2JqZWN0KG1fcERvY3VtZW50LCAwLCAwLCAwKTsKKyAgICAgICAgICAgICAgaWYgKHBPYmopIHsKKyAgICAgICAgICAgICAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZICYmCisgICAgICAgICAgICAgICAgICAgIHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFRyYWlsZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyID0gKChDUERGX1N0cmVhbSopcE9iaiktPkdldERpY3QoKTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChwVHJhaWxlcikgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9wVHJhaWxlcikgeworICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwUm9vdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJSb290IikpOworICAgICAgICAgICAgICAgICAgICAgIGlmIChwUm9vdCA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChwUm9vdC0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9EV09SRCltX0Nyb3NzUmVmLkdldFNpemUoKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDUERGX1JlZmVyZW5jZSopcFJvb3QpLT5HZXRSZWZPYmpOdW0oKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Dcm9zc1JlZi5HZXRBdCgoKENQREZfUmVmZXJlbmNlKilwUm9vdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0UmVmT2JqTnVtKCkpICE9IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwVHJhaWxlci0+R2V0U3RhcnRQb3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OworICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlci0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFpbGVyLT5TZXRBdChrZXksIHBPYmotPkNsb25lKCksIG1fcERvY3VtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcE9iai0+UmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYWlsZXIgPSAoQ1BERl9EaWN0aW9uYXJ5KilwVHJhaWxlci0+Q2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhaWxlciA9IHBUcmFpbGVyOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBkd1NhdmVQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyV29yZCA9IG1fU3ludGF4LkdldEtleXdvcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cldvcmQuQ29tcGFyZShGWF9CU1RSQygic3RhcnR4cmVmIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOdW1iZXIgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzT2Zmc2V0ID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYk51bWJlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gRlhTWVNfYXRvaShic09mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoZHdTYXZlUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcE9iai0+UmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNlZ2luZGV4ICs9IGNvdW50OworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gInRyYWlsZXIiW2luc2lkZV9pbmRleF0pIHsKKyAgICAgICAgICAgIGluc2lkZV9pbmRleCsrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgIGlmIChpbnNpZGVfaW5kZXggPT0gNCkgeworICAgICAgICAgICAgbGFzdF94cmVmID0gcG9zICsgaSAtIDQ7CisgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAieHJlZiJbaW5zaWRlX2luZGV4XSkgeworICAgICAgICAgICAgaW5zaWRlX2luZGV4Kys7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6CisgICAgICAgICAgaWYgKGJ5dGUgPT0gJ1xyJyB8fCBieXRlID09ICdcbicpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOgorICAgICAgICAgIGlmIChieXRlID09ICcpJykgeworICAgICAgICAgICAgaWYgKGRlcHRoID4gMCkgeworICAgICAgICAgICAgICBkZXB0aC0tOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAnKCcpIHsKKyAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghZGVwdGgpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExOgorICAgICAgICAgIGlmIChieXRlID09ICc8JyAmJiBpbnNpZGVfaW5kZXggPT0gMSkgeworICAgICAgICAgICAgc3RhdHVzID0gMTI7CisgICAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICc+JykgeworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAtLWk7CisgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICBpZiAoUERGX0NoYXJUeXBlW2J5dGVdID09ICdEJyB8fCBQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnKSB7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICBpZiAoUERGX0NoYXJUeXBlW2J5dGVdID09ICdXJykgeworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJyUnIHx8IGJ5dGUgPT0gJygnIHx8IGJ5dGUgPT0gJzwnIHx8CisgICAgICAgICAgICAgICAgICAgICBieXRlID09ICdcXCcpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgfSBlbHNlIGlmIChpbnNpZGVfaW5kZXggPT0gNikgeworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gImVuZG9iaiJbaW5zaWRlX2luZGV4XSkgeworICAgICAgICAgICAgaW5zaWRlX2luZGV4Kys7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGJPdmVyRmxvdykgeworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQorICAgIHBvcyArPSBzaXplOworICB9CisgIGlmIChsYXN0X3hyZWYgIT0gLTEgJiYgbGFzdF94cmVmID4gbGFzdF9vYmopIHsKKyAgICBsYXN0X3RyYWlsZXIgPSBsYXN0X3hyZWY7CisgIH0gZWxzZSBpZiAobGFzdF90cmFpbGVyID09IC0xIHx8IGxhc3RfeHJlZiA8IGxhc3Rfb2JqKSB7CisgICAgbGFzdF90cmFpbGVyID0gbV9TeW50YXgubV9GaWxlTGVuOworICB9CisgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IGxhc3RfdHJhaWxlciAtIG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0OworICB2b2lkKiBwUmVzdWx0ID0KKyAgICAgIEZYU1lTX2JzZWFyY2goJm9mZnNldCwgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOworICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7CisgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKG9mZnNldCk7CisgIH0KKyAgRlhfRnJlZShidWZmZXIpOworICByZXR1cm4gVFJVRTsKK30KK3N0YXRpYyBGWF9EV09SRCBfR2V0VmFySW50KGNvbnN0IHVpbnQ4X3QqIHAsIGludDMyX3QgbikgeworICBGWF9EV09SRCByZXN1bHQgPSAwOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICByZXN1bHQgPSByZXN1bHQgKiAyNTYgKyBwW2ldOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CitGWF9CT09MIENQREZfUGFyc2VyOjpMb2FkQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSYgcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1haW5YUmVmKSB7CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0KKyAgICAgIChDUERGX1N0cmVhbSopUGFyc2VJbmRpcmVjdE9iamVjdEF0KG1fcERvY3VtZW50LCBwb3MsIDAsIE5VTEwpOworICBpZiAoIXBTdHJlYW0pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcERvY3VtZW50KSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgICAgaWYgKCFwRGljdCB8fCBwRGljdC0+R2V0T2JqTnVtKCkgIT0gcFN0cmVhbS0+bV9PYmpOdW0pIHsKKyAgICAgIG1fcERvY3VtZW50LT5JbnNlcnRJbmRpcmVjdE9iamVjdChwU3RyZWFtLT5tX09iak51bSwgcFN0cmVhbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChwU3RyZWFtLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgeworICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7CisgICAgICB9CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIGlmIChwU3RyZWFtLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBwcmV2ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQcmV2IikpOworICBpbnQzMl90IHNpemUgPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXIoRlhfQlNUUkMoIlNpemUiKSk7CisgIGlmIChzaXplIDwgMCkgewogICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKGJNYWluWFJlZikgeworICAgIG1fcFRyYWlsZXIgPSAoQ1BERl9EaWN0aW9uYXJ5KilwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCk7CisgICAgbV9Dcm9zc1JlZi5TZXRTaXplKHNpemUpOworICAgIGlmIChtX1Y1VHlwZS5TZXRTaXplKHNpemUpKSB7CisgICAgICBGWFNZU19tZW1zZXQobV9WNVR5cGUuR2V0RGF0YSgpLCAwLCBzaXplKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbV9UcmFpbGVycy5BZGQoKENQREZfRGljdGlvbmFyeSopcFN0cmVhbS0+R2V0RGljdCgpLT5DbG9uZSgpKTsKKyAgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4gPiBhcnJJbmRleDsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRBcnJheShGWF9CU1RSQygiSW5kZXgiKSk7CisgIGlmIChwQXJyYXkpIHsKKyAgICBGWF9EV09SRCBuUGFpclNpemUgPSBwQXJyYXktPkdldENvdW50KCkgLyAyOworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuUGFpclNpemU7IGkrKykgeworICAgICAgQ1BERl9PYmplY3QqIHBTdGFydE51bU9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpICogMik7CisgICAgICBDUERGX09iamVjdCogcENvdW50T2JqID0gcEFycmF5LT5HZXRFbGVtZW50KGkgKiAyICsgMSk7CisgICAgICBpZiAocFN0YXJ0TnVtT2JqICYmIHBTdGFydE51bU9iai0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIgJiYKKyAgICAgICAgICBwQ291bnRPYmogJiYgcENvdW50T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgeworICAgICAgICBpbnQgblN0YXJ0TnVtID0gcFN0YXJ0TnVtT2JqLT5HZXRJbnRlZ2VyKCk7CisgICAgICAgIGludCBuQ291bnQgPSBwQ291bnRPYmotPkdldEludGVnZXIoKTsKKyAgICAgICAgaWYgKG5TdGFydE51bSA+PSAwICYmIG5Db3VudCA+IDApIHsKKyAgICAgICAgICBhcnJJbmRleC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoblN0YXJ0TnVtLCBuQ291bnQpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoYXJySW5kZXguc2l6ZSgpID09IDApIHsKKyAgICBhcnJJbmRleC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoMCwgc2l6ZSkpOworICB9CisgIHBBcnJheSA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0QXJyYXkoRlhfQlNUUkMoIlciKSk7CisgIGlmIChwQXJyYXkgPT0gTlVMTCkgeworICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0RXb3JkQXJyYXkgV2lkdGhBcnJheTsKKyAgRlhfU0FGRV9EV09SRCBkd0FjY1dpZHRoID0gMDsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgV2lkdGhBcnJheS5BZGQocEFycmF5LT5HZXRJbnRlZ2VyKGkpKTsKKyAgICBkd0FjY1dpZHRoICs9IFdpZHRoQXJyYXlbaV07CisgIH0KKyAgaWYgKCFkd0FjY1dpZHRoLklzVmFsaWQoKSB8fCBXaWR0aEFycmF5LkdldFNpemUoKSA8IDMpIHsKKyAgICBwU3RyZWFtLT5SZWxlYXNlKCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0RXT1JEIHRvdGFsV2lkdGggPSBkd0FjY1dpZHRoLlZhbHVlT3JEaWUoKTsKKyAgQ1BERl9TdHJlYW1BY2MgYWNjOworICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSk7CisgIGNvbnN0IHVpbnQ4X3QqIHBEYXRhID0gYWNjLkdldERhdGEoKTsKKyAgRlhfRFdPUkQgZHdUb3RhbFNpemUgPSBhY2MuR2V0U2l6ZSgpOworICBGWF9EV09SRCBzZWdpbmRleCA9IDA7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBhcnJJbmRleC5zaXplKCk7IGkrKykgeworICAgIGludDMyX3Qgc3RhcnRudW0gPSBhcnJJbmRleFtpXS5maXJzdDsKKyAgICBpZiAoc3RhcnRudW0gPCAwKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgbV9kd1hyZWZTdGFydE9iak51bSA9CisgICAgICAgIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JELCBpbnQzMl90PihzdGFydG51bSk7CisgICAgRlhfRFdPUkQgY291bnQgPQorICAgICAgICBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRCwgaW50MzJfdD4oYXJySW5kZXhbaV0uc2Vjb25kKTsKKyAgICBGWF9TQUZFX0RXT1JEIGR3Q2FjdWxhdGVkU2l6ZSA9IHNlZ2luZGV4OworICAgIGR3Q2FjdWxhdGVkU2l6ZSArPSBjb3VudDsKKyAgICBkd0NhY3VsYXRlZFNpemUgKj0gdG90YWxXaWR0aDsKKyAgICBpZiAoIWR3Q2FjdWxhdGVkU2l6ZS5Jc1ZhbGlkKCkgfHwKKyAgICAgICAgZHdDYWN1bGF0ZWRTaXplLlZhbHVlT3JEaWUoKSA+IGR3VG90YWxTaXplKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCogc2Vnc3RhcnQgPSBwRGF0YSArIHNlZ2luZGV4ICogdG90YWxXaWR0aDsKKyAgICBGWF9TQUZFX0RXT1JEIGR3TWF4T2JqTnVtID0gc3RhcnRudW07CisgICAgZHdNYXhPYmpOdW0gKz0gY291bnQ7CisgICAgRlhfRFdPUkQgZHdWNVNpemUgPQorICAgICAgICBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRCwgaW50MzJfdD4obV9WNVR5cGUuR2V0U2l6ZSgpKTsKKyAgICBpZiAoIWR3TWF4T2JqTnVtLklzVmFsaWQoKSB8fCBkd01heE9iak51bS5WYWx1ZU9yRGllKCkgPiBkd1Y1U2l6ZSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZvciAoRlhfRFdPUkQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisgICAgICBpbnQzMl90IHR5cGUgPSAxOworICAgICAgY29uc3QgdWludDhfdCogZW50cnlzdGFydCA9IHNlZ3N0YXJ0ICsgaiAqIHRvdGFsV2lkdGg7CisgICAgICBpZiAoV2lkdGhBcnJheVswXSkgeworICAgICAgICB0eXBlID0gX0dldFZhckludChlbnRyeXN0YXJ0LCBXaWR0aEFycmF5WzBdKTsKKyAgICAgIH0KKyAgICAgIGlmIChtX1Y1VHlwZVtzdGFydG51bSArIGpdID09IDI1NSkgeworICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPQorICAgICAgICAgICAgX0dldFZhckludChlbnRyeXN0YXJ0ICsgV2lkdGhBcnJheVswXSwgV2lkdGhBcnJheVsxXSk7CisgICAgICAgIG1fQ3Jvc3NSZWZbc3RhcnRudW0gKyBqXSA9IG9mZnNldDsKKyAgICAgICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJm9mZnNldCwgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOworICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAobV9WNVR5cGVbc3RhcnRudW0gKyBqXSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIG1fVjVUeXBlW3N0YXJ0bnVtICsgal0gPSB0eXBlOworICAgICAgaWYgKHR5cGUgPT0gMCkgeworICAgICAgICBtX0Nyb3NzUmVmW3N0YXJ0bnVtICsgal0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0KKyAgICAgICAgICAgIF9HZXRWYXJJbnQoZW50cnlzdGFydCArIFdpZHRoQXJyYXlbMF0sIFdpZHRoQXJyYXlbMV0pOworICAgICAgICBtX0Nyb3NzUmVmW3N0YXJ0bnVtICsgal0gPSBvZmZzZXQ7CisgICAgICAgIGlmICh0eXBlID09IDEpIHsKKyAgICAgICAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmb2Zmc2V0LCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOworICAgICAgICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChvZmZzZXQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbV9WNVR5cGUuR2V0U2l6ZSgpKSB7CisgICAgICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICAgIG1fVjVUeXBlW29mZnNldF0gPSAyNTU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgc2VnaW5kZXggKz0gY291bnQ7CisgIH0KKyAgcFN0cmVhbS0+UmVsZWFzZSgpOworICByZXR1cm4gVFJVRTsKK30KK0NQREZfQXJyYXkqIENQREZfUGFyc2VyOjpHZXRJREFycmF5KCkgeworICBDUERGX09iamVjdCogcElEID0gbV9wVHJhaWxlciA/IG1fcFRyYWlsZXItPkdldEVsZW1lbnQoRlhfQlNUUkMoIklEIikpIDogTlVMTDsKKyAgaWYgKHBJRCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHBJRC0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICBwSUQgPSBQYXJzZUluZGlyZWN0T2JqZWN0KE5VTEwsICgoQ1BERl9SZWZlcmVuY2UqKXBJRCktPkdldFJlZk9iak51bSgpKTsKKyAgICBtX3BUcmFpbGVyLT5TZXRBdChGWF9CU1RSQygiSUQiKSwgcElEKTsKKyAgfQorICBpZiAocElEID09IE5VTEwgfHwgcElELT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIChDUERGX0FycmF5KilwSUQ7Cit9CitGWF9EV09SRCBDUERGX1BhcnNlcjo6R2V0Um9vdE9iak51bSgpIHsKKyAgQ1BERl9PYmplY3QqIHBSZWYgPQorICAgICAgbV9wVHJhaWxlciA/IG1fcFRyYWlsZXItPkdldEVsZW1lbnQoRlhfQlNUUkMoIlJvb3QiKSkgOiBOVUxMOworICBpZiAocFJlZiA9PSBOVUxMIHx8IHBSZWYtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuICgoQ1BERl9SZWZlcmVuY2UqKXBSZWYpLT5HZXRSZWZPYmpOdW0oKTsKK30KK0ZYX0RXT1JEIENQREZfUGFyc2VyOjpHZXRJbmZvT2JqTnVtKCkgeworICBDUERGX09iamVjdCogcFJlZiA9CisgICAgICBtX3BUcmFpbGVyID8gbV9wVHJhaWxlci0+R2V0RWxlbWVudChGWF9CU1RSQygiSW5mbyIpKSA6IE5VTEw7CisgIGlmIChwUmVmID09IE5VTEwgfHwgcFJlZi0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gKChDUERGX1JlZmVyZW5jZSopcFJlZiktPkdldFJlZk9iak51bSgpOworfQorRlhfQk9PTCBDUERGX1BhcnNlcjo6SXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgRlhfQk9PTCYgYkZvcm0pIHsKKyAgYkZvcm0gPSBGQUxTRTsKKyAgaWYgKG9iam51bSA+PSAoRlhfRFdPUkQpbV9Dcm9zc1JlZi5HZXRTaXplKCkpIHsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKG1fVjVUeXBlW29iam51bV0gPT0gMikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fQ3Jvc3NSZWZbb2JqbnVtXTsKKyAgdm9pZCogcFJlc3VsdCA9CisgICAgICBGWFNZU19ic2VhcmNoKCZwb3MsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKKyAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICgoRlhfRklMRVNJWkUqKXBSZXN1bHQgLSAoRlhfRklMRVNJWkUqKW1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSA9PQorICAgICAgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpIC0gMSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9GSUxFU0laRSBzaXplID0gKChGWF9GSUxFU0laRSopcFJlc3VsdClbMV0gLSBwb3M7CisgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOworICBtX1N5bnRheC5SZXN0b3JlUG9zKHBvcyk7CisgIGJGb3JtID0gbV9TeW50YXguU2VhcmNoTXVsdGlXb3JkKEZYX0JTVFJDKCIvRm9ybVwwc3RyZWFtIiksIFRSVUUsIHNpemUpID09IDA7CisgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICByZXR1cm4gVFJVRTsKIH0KLUNQREZfQXJyYXkqIENQREZfUGFyc2VyOjpHZXRJREFycmF5KCkKLXsKLSAgICBDUERGX09iamVjdCogcElEID0gbV9wVHJhaWxlciA/IG1fcFRyYWlsZXItPkdldEVsZW1lbnQoRlhfQlNUUkMoIklEIikpIDogTlVMTDsKLSAgICBpZiAocElEID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwSUQtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgIHBJRCA9IFBhcnNlSW5kaXJlY3RPYmplY3QoTlVMTCwgKChDUERGX1JlZmVyZW5jZSopcElEKS0+R2V0UmVmT2JqTnVtKCkpOwotICAgICAgICBtX3BUcmFpbGVyLT5TZXRBdChGWF9CU1RSQygiSUQiKSwgcElEKTsKLSAgICB9Ci0gICAgaWYgKHBJRCA9PSBOVUxMIHx8IHBJRC0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChDUERGX0FycmF5KilwSUQ7Ci19Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6R2V0Um9vdE9iak51bSgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBSZWYgPSBtX3BUcmFpbGVyID8gbV9wVHJhaWxlci0+R2V0RWxlbWVudChGWF9CU1RSQygiUm9vdCIpKSA6IE5VTEw7Ci0gICAgaWYgKHBSZWYgPT0gTlVMTCB8fCBwUmVmLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuICgoQ1BERl9SZWZlcmVuY2UqKSBwUmVmKS0+R2V0UmVmT2JqTnVtKCk7Ci19Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6R2V0SW5mb09iak51bSgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBSZWYgPSBtX3BUcmFpbGVyID8gbV9wVHJhaWxlci0+R2V0RWxlbWVudChGWF9CU1RSQygiSW5mbyIpKSA6IE5VTEw7Ci0gICAgaWYgKHBSZWYgPT0gTlVMTCB8fCBwUmVmLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuICgoQ1BERl9SZWZlcmVuY2UqKSBwUmVmKS0+R2V0UmVmT2JqTnVtKCk7Ci19Ci1GWF9CT09MIENQREZfUGFyc2VyOjpJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBGWF9CT09MJiBiRm9ybSkKLXsKLSAgICBiRm9ybSA9IEZBTFNFOwotICAgIGlmIChvYmpudW0gPj0gKEZYX0RXT1JEKW1fQ3Jvc3NSZWYuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KK0NQREZfT2JqZWN0KiBDUERGX1BhcnNlcjo6UGFyc2VJbmRpcmVjdE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KSB7CisgIGlmIChvYmpudW0gPj0gKEZYX0RXT1JEKW1fQ3Jvc3NSZWYuR2V0U2l6ZSgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKG1fVjVUeXBlW29iam51bV0gPT0gMSB8fCBtX1Y1VHlwZVtvYmpudW1dID09IDI1NSkgewogICAgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fQ3Jvc3NSZWZbb2JqbnVtXTsKLSAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmcG9zLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7CisgICAgaWYgKHBvcyA8PSAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFBhcnNlSW5kaXJlY3RPYmplY3RBdChwT2JqTGlzdCwgcG9zLCBvYmpudW0sIHBDb250ZXh0KTsKKyAgfQorICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAyKSB7CisgICAgQ1BERl9TdHJlYW1BY2MqIHBPYmpTdHJlYW0gPSBHZXRPYmplY3RTdHJlYW0oKEZYX0RXT1JEKW1fQ3Jvc3NSZWZbb2JqbnVtXSk7CisgICAgaWYgKHBPYmpTdHJlYW0gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGludDMyX3QgbiA9IHBPYmpTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiTiIpKTsKKyAgICBpbnQzMl90IG9mZnNldCA9IHBPYmpTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiRmlyc3QiKSk7CisgICAgQ1BERl9TeW50YXhQYXJzZXIgc3ludGF4OworICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKAorICAgICAgICAodWludDhfdCopcE9ialN0cmVhbS0+R2V0RGF0YSgpLCAoc2l6ZV90KXBPYmpTdHJlYW0tPkdldFNpemUoKSwgRkFMU0UpKTsKKyAgICBzeW50YXguSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKKyAgICBDUERGX09iamVjdCogcFJldCA9IE5VTEw7CisgICAgd2hpbGUgKG4pIHsKKyAgICAgIEZYX0RXT1JEIHRoaXNudW0gPSBzeW50YXguR2V0RGlyZWN0TnVtKCk7CisgICAgICBGWF9EV09SRCB0aGlzb2ZmID0gc3ludGF4LkdldERpcmVjdE51bSgpOworICAgICAgaWYgKHRoaXNudW0gPT0gb2JqbnVtKSB7CisgICAgICAgIHN5bnRheC5SZXN0b3JlUG9zKG9mZnNldCArIHRoaXNvZmYpOworICAgICAgICBwUmV0ID0gc3ludGF4LkdldE9iamVjdChwT2JqTGlzdCwgMCwgMCwgcENvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIG4tLTsKKyAgICB9CisgICAgcmV0dXJuIHBSZXQ7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitDUERGX1N0cmVhbUFjYyogQ1BERl9QYXJzZXI6OkdldE9iamVjdFN0cmVhbShGWF9EV09SRCBvYmpudW0pIHsKKyAgQ1BERl9TdHJlYW1BY2MqIHBTdHJlYW1BY2MgPSBOVUxMOworICBpZiAobV9PYmplY3RTdHJlYW1NYXAuTG9va3VwKCh2b2lkKikodWludHB0cl90KW9iam51bSwgKHZvaWQqJilwU3RyZWFtQWNjKSkgeworICAgIHJldHVybiBwU3RyZWFtQWNjOworICB9CisgIGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtID0KKyAgICAgIG1fcERvY3VtZW50ID8gKENQREZfU3RyZWFtKiltX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3Qob2JqbnVtKSA6IE5VTEw7CisgIGlmIChwU3RyZWFtID09IE5VTEwgfHwgcFN0cmVhbS0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwU3RyZWFtQWNjID0gbmV3IENQREZfU3RyZWFtQWNjOworICBwU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtKTsKKyAgbV9PYmplY3RTdHJlYW1NYXAuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCBwU3RyZWFtQWNjKTsKKyAgcmV0dXJuIHBTdHJlYW1BY2M7Cit9CitGWF9GSUxFU0laRSBDUERGX1BhcnNlcjo6R2V0T2JqZWN0U2l6ZShGWF9EV09SRCBvYmpudW0pIHsKKyAgaWYgKG9iam51bSA+PSAoRlhfRFdPUkQpbV9Dcm9zc1JlZi5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAyKSB7CisgICAgb2JqbnVtID0gKEZYX0RXT1JEKW1fQ3Jvc3NSZWZbb2JqbnVtXTsKKyAgfQorICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAxIHx8IG1fVjVUeXBlW29iam51bV0gPT0gMjU1KSB7CisgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gbV9Dcm9zc1JlZltvYmpudW1dOworICAgIGlmIChvZmZzZXQgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZvZmZzZXQsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmVGaWxlU2l6ZSk7CiAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBpZiAoKEZYX0ZJTEVTSVpFKilwUmVzdWx0IC0gKEZYX0ZJTEVTSVpFKiltX1NvcnRlZE9mZnNldC5HZXREYXRhKCkgPT0gbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKChGWF9GSUxFU0laRSopcFJlc3VsdCAtIChGWF9GSUxFU0laRSopbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpID09CisgICAgICAgIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSAtIDEpIHsKKyAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBGWF9GSUxFU0laRSBzaXplID0gKChGWF9GSUxFU0laRSopcFJlc3VsdClbMV0gLSBwb3M7CisgICAgcmV0dXJuICgoRlhfRklMRVNJWkUqKXBSZXN1bHQpWzFdIC0gb2Zmc2V0OworICB9CisgIHJldHVybiAwOworfQordm9pZCBDUERGX1BhcnNlcjo6R2V0SW5kaXJlY3RCaW5hcnkoRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgc2l6ZSkgeworICBwQnVmZmVyID0gTlVMTDsKKyAgc2l6ZSA9IDA7CisgIGlmIChvYmpudW0gPj0gKEZYX0RXT1JEKW1fQ3Jvc3NSZWYuR2V0U2l6ZSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKKyAgICBDUERGX1N0cmVhbUFjYyogcE9ialN0cmVhbSA9IEdldE9iamVjdFN0cmVhbSgoRlhfRFdPUkQpbV9Dcm9zc1JlZltvYmpudW1dKTsKKyAgICBpZiAocE9ialN0cmVhbSA9PSBOVUxMKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGludDMyX3QgbiA9IHBPYmpTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiTiIpKTsKKyAgICBpbnQzMl90IG9mZnNldCA9IHBPYmpTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiRmlyc3QiKSk7CisgICAgQ1BERl9TeW50YXhQYXJzZXIgc3ludGF4OworICAgIGNvbnN0IHVpbnQ4X3QqIHBEYXRhID0gcE9ialN0cmVhbS0+R2V0RGF0YSgpOworICAgIEZYX0RXT1JEIHRvdGFsc2l6ZSA9IHBPYmpTdHJlYW0tPkdldFNpemUoKTsKKyAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKAorICAgICAgICBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oKHVpbnQ4X3QqKXBEYXRhLCAoc2l6ZV90KXRvdGFsc2l6ZSwgRkFMU0UpKTsKKyAgICBzeW50YXguSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKKyAgICB3aGlsZSAobikgeworICAgICAgRlhfRFdPUkQgdGhpc251bSA9IHN5bnRheC5HZXREaXJlY3ROdW0oKTsKKyAgICAgIEZYX0RXT1JEIHRoaXNvZmYgPSBzeW50YXguR2V0RGlyZWN0TnVtKCk7CisgICAgICBpZiAodGhpc251bSA9PSBvYmpudW0pIHsKKyAgICAgICAgaWYgKG4gPT0gMSkgeworICAgICAgICAgIHNpemUgPSB0b3RhbHNpemUgLSAodGhpc29mZiArIG9mZnNldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3ludGF4LkdldERpcmVjdE51bSgpOyAgLy8gU2tpcCBuZXh0bnVtLgorICAgICAgICAgIEZYX0RXT1JEIG5leHRvZmYgPSBzeW50YXguR2V0RGlyZWN0TnVtKCk7CisgICAgICAgICAgc2l6ZSA9IG5leHRvZmYgLSB0aGlzb2ZmOworICAgICAgICB9CisgICAgICAgIHBCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKKyAgICAgICAgRlhTWVNfbWVtY3B5KHBCdWZmZXIsIHBEYXRhICsgdGhpc29mZiArIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG4tLTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDEpIHsKKyAgICBGWF9GSUxFU0laRSBwb3MgPSBtX0Nyb3NzUmVmW29iam51bV07CisgICAgaWYgKHBvcyA9PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQogICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICBiRm9ybSA9IG1fU3ludGF4LlNlYXJjaE11bHRpV29yZChGWF9CU1RSQygiL0Zvcm1cMHN0cmVhbSIpLCBUUlVFLCBzaXplKSA9PSAwOworICAgIEZYX0JPT0wgYklzTnVtYmVyOworICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOworICAgIGlmICghYklzTnVtYmVyKSB7CisgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgRlhfRFdPUkQgcGFyc2VyX29iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CisgICAgaWYgKHBhcnNlcl9vYmpudW0gJiYgcGFyc2VyX29iam51bSAhPSBvYmpudW0pIHsKKyAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgICBpZiAoIWJJc051bWJlcikgeworICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtX1N5bnRheC5HZXRLZXl3b3JkKCkgIT0gRlhfQlNUUkMoIm9iaiIpKSB7CisgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdm9pZCogcFJlc3VsdCA9CisgICAgICAgIEZYU1lTX2JzZWFyY2goJnBvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7CisgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgeworICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIEZYX0ZJTEVTSVpFIG5leHRvZmYgPSAoKEZYX0ZJTEVTSVpFKilwUmVzdWx0KVsxXTsKKyAgICBGWF9CT09MIGJOZXh0T2ZmVmFsaWQgPSBGQUxTRTsKKyAgICBpZiAobmV4dG9mZiAhPSBwb3MpIHsKKyAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MobmV4dG9mZik7CisgICAgICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJ4cmVmIikpIHsKKyAgICAgICAgYk5leHRPZmZWYWxpZCA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKGJJc051bWJlcikgeworICAgICAgICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgICAgICAgaWYgKGJJc051bWJlciAmJiBtX1N5bnRheC5HZXRLZXl3b3JkKCkgPT0gRlhfQlNUUkMoIm9iaiIpKSB7CisgICAgICAgICAgYk5leHRPZmZWYWxpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFiTmV4dE9mZlZhbGlkKSB7CisgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKHBvcyk7CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpID09IEZYX0JTVFJDKCJlbmRvYmoiKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChtX1N5bnRheC5TYXZlUG9zKCkgPT0gbV9TeW50YXgubV9GaWxlTGVuKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG5leHRvZmYgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgICAgfQorICAgIHNpemUgPSAoRlhfRFdPUkQpKG5leHRvZmYgLSBwb3MpOworICAgIHBCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKKyAgICBtX1N5bnRheC5SZXN0b3JlUG9zKHBvcyk7CisgICAgbV9TeW50YXguUmVhZEJsb2NrKHBCdWZmZXIsIHNpemUpOwogICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgIHJldHVybiBUUlVFOworICB9CiB9Ci1DUERGX09iamVjdCogQ1BERl9QYXJzZXI6OlBhcnNlSW5kaXJlY3RPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KQotewotICAgIGlmIChvYmpudW0gPj0gKEZYX0RXT1JEKW1fQ3Jvc3NSZWYuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworQ1BERl9PYmplY3QqIENQREZfUGFyc2VyOjpQYXJzZUluZGlyZWN0T2JqZWN0QXQoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSU0VfQ09OVEVYVCogcENvbnRleHQpIHsKKyAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKKyAgRlhfQk9PTCBiSXNOdW1iZXI7CisgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOworICBpZiAoIWJJc051bWJlcikgeworICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYX0ZJTEVTSVpFIG9iak9mZnNldCA9IG1fU3ludGF4LlNhdmVQb3MoKTsKKyAgb2JqT2Zmc2V0IC09IHdvcmQuR2V0TGVuZ3RoKCk7CisgIEZYX0RXT1JEIHBhcnNlcl9vYmpudW0gPSBGWFNZU19hdG9pKHdvcmQpOworICBpZiAob2JqbnVtICYmIHBhcnNlcl9vYmpudW0gIT0gb2JqbnVtKSB7CisgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CisgIGlmICghYklzTnVtYmVyKSB7CisgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfRFdPUkQgcGFyc2VyX2dlbm51bSA9IEZYU1lTX2F0b2kod29yZCk7CisgIGlmIChtX1N5bnRheC5HZXRLZXl3b3JkKCkgIT0gRlhfQlNUUkMoIm9iaiIpKSB7CisgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBPYmogPQorICAgICAgbV9TeW50YXguR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIHBhcnNlcl9nZW5udW0sIHBDb250ZXh0KTsKKyAgbV9TeW50YXguU2F2ZVBvcygpOworICBDRlhfQnl0ZVN0cmluZyBic1dvcmQgPSBtX1N5bnRheC5HZXRLZXl3b3JkKCk7CisgIGlmIChic1dvcmQgPT0gRlhfQlNUUkMoImVuZG9iaiIpKSB7CisgICAgbV9TeW50YXguU2F2ZVBvcygpOworICB9CisgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICBpZiAocE9iaikgeworICAgIGlmICghb2JqbnVtKSB7CisgICAgICBwT2JqLT5tX09iak51bSA9IHBhcnNlcl9vYmpudW07CiAgICAgfQotICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDEgfHwgbV9WNVR5cGVbb2JqbnVtXSA9PSAyNTUpIHsKLSAgICAgICAgRlhfRklMRVNJWkUgcG9zID0gbV9Dcm9zc1JlZltvYmpudW1dOwotICAgICAgICBpZiAocG9zIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQYXJzZUluZGlyZWN0T2JqZWN0QXQocE9iakxpc3QsIHBvcywgb2JqbnVtLCBwQ29udGV4dCk7Ci0gICAgfQotICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKLSAgICAgICAgQ1BERl9TdHJlYW1BY2MqIHBPYmpTdHJlYW0gPSBHZXRPYmplY3RTdHJlYW0oKEZYX0RXT1JEKW1fQ3Jvc3NSZWZbb2JqbnVtXSk7Ci0gICAgICAgIGlmIChwT2JqU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgbiA9IHBPYmpTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiTiIpKTsKLSAgICAgICAgaW50MzJfdCBvZmZzZXQgPSBwT2JqU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXIoRlhfQlNUUkMoIkZpcnN0IikpOwotICAgICAgICBDUERGX1N5bnRheFBhcnNlciBzeW50YXg7Ci0gICAgICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCh1aW50OF90KilwT2JqU3RyZWFtLT5HZXREYXRhKCksIChzaXplX3QpcE9ialN0cmVhbS0+R2V0U2l6ZSgpLCBGQUxTRSkpOwotICAgICAgICBzeW50YXguSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBSZXQgPSBOVUxMOwotICAgICAgICB3aGlsZSAobikgewotICAgICAgICAgICAgRlhfRFdPUkQgdGhpc251bSA9IHN5bnRheC5HZXREaXJlY3ROdW0oKTsKLSAgICAgICAgICAgIEZYX0RXT1JEIHRoaXNvZmYgPSBzeW50YXguR2V0RGlyZWN0TnVtKCk7Ci0gICAgICAgICAgICBpZiAodGhpc251bSA9PSBvYmpudW0pIHsKLSAgICAgICAgICAgICAgICBzeW50YXguUmVzdG9yZVBvcyhvZmZzZXQgKyB0aGlzb2ZmKTsKLSAgICAgICAgICAgICAgICBwUmV0ID0gc3ludGF4LkdldE9iamVjdChwT2JqTGlzdCwgMCwgMCwgcENvbnRleHQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbiAtLTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcFJldDsKKyAgICBwT2JqLT5tX0dlbk51bSA9IHBhcnNlcl9nZW5udW07CisgIH0KKyAgcmV0dXJuIHBPYmo7Cit9CitDUERGX09iamVjdCogQ1BERl9QYXJzZXI6OlBhcnNlSW5kaXJlY3RPYmplY3RBdEJ5U3RyaWN0KAorICAgIENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwKKyAgICBGWF9GSUxFU0laRSBwb3MsCisgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwKKyAgICBGWF9GSUxFU0laRSogcFJlc3VsdFBvcykgeworICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKKyAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOworICBGWF9CT09MIGJJc051bWJlcjsKKyAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CisgIGlmICghYklzTnVtYmVyKSB7CisgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfRFdPUkQgcGFyc2VyX29iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CisgIGlmIChvYmpudW0gJiYgcGFyc2VyX29iam51bSAhPSBvYmpudW0pIHsKKyAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgaWYgKCFiSXNOdW1iZXIpIHsKKyAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWF9EV09SRCBnZW5udW0gPSBGWFNZU19hdG9pKHdvcmQpOworICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpICE9IEZYX0JTVFJDKCJvYmoiKSkgeworICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfT2JqZWN0KiBwT2JqID0KKyAgICAgIG1fU3ludGF4LkdldE9iamVjdEJ5U3RyaWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSwgcENvbnRleHQpOworICBpZiAocFJlc3VsdFBvcykgeworICAgICpwUmVzdWx0UG9zID0gbV9TeW50YXgubV9Qb3M7CisgIH0KKyAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgIHJldHVybiBwT2JqOworfQorQ1BERl9EaWN0aW9uYXJ5KiBDUERGX1BhcnNlcjo6TG9hZFRyYWlsZXJWNCgpIHsKKyAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSBGWF9CU1RSQygidHJhaWxlciIpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBPYmogPSBtX1N5bnRheC5HZXRPYmplY3QobV9wRG9jdW1lbnQsIDAsIDAsIDApOworICBpZiAocE9iaiA9PSBOVUxMIHx8IHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIGlmIChwT2JqKSB7CisgICAgICBwT2JqLT5SZWxlYXNlKCk7CiAgICAgfQogICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqOwogfQotQ1BERl9TdHJlYW1BY2MqIENQREZfUGFyc2VyOjpHZXRPYmplY3RTdHJlYW0oRlhfRFdPUkQgb2JqbnVtKQotewotICAgIENQREZfU3RyZWFtQWNjKiBwU3RyZWFtQWNjID0gTlVMTDsKLSAgICBpZiAobV9PYmplY3RTdHJlYW1NYXAuTG9va3VwKCh2b2lkKikodWludHB0cl90KW9iam51bSwgKHZvaWQqJilwU3RyZWFtQWNjKSkgewotICAgICAgICByZXR1cm4gcFN0cmVhbUFjYzsKK0ZYX0RXT1JEIENQREZfUGFyc2VyOjpHZXRQZXJtaXNzaW9ucyhGWF9CT09MIGJDaGVja1JldmlzaW9uKSB7CisgIGlmIChtX3BTZWN1cml0eUhhbmRsZXIgPT0gTlVMTCkgeworICAgIHJldHVybiAoRlhfRFdPUkQpLTE7CisgIH0KKyAgRlhfRFdPUkQgZHdQZXJtaXNzaW9uID0gbV9wU2VjdXJpdHlIYW5kbGVyLT5HZXRQZXJtaXNzaW9ucygpOworICBpZiAobV9wRW5jcnlwdERpY3QgJiYKKyAgICAgIG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkZpbHRlciIpKSA9PSBGWF9CU1RSQygiU3RhbmRhcmQiKSkgeworICAgIGR3UGVybWlzc2lvbiAmPSAweEZGRkZGRkZDOworICAgIGR3UGVybWlzc2lvbiB8PSAweEZGRkZGMEMwOworICAgIGlmIChiQ2hlY2tSZXZpc2lvbiAmJiBtX3BFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUiIpKSA9PSAyKSB7CisgICAgICBkd1Blcm1pc3Npb24gJj0gMHhGRkZGRjBGRjsKICAgICB9Ci0gICAgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBtX3BEb2N1bWVudCA/IChDUERGX1N0cmVhbSopbV9wRG9jdW1lbnQtPkdldEluZGlyZWN0T2JqZWN0KG9iam51bSkgOiBOVUxMOwotICAgIGlmIChwU3RyZWFtID09IE5VTEwgfHwgcFN0cmVhbS0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBTdHJlYW1BY2MgPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgcFN0cmVhbUFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSk7Ci0gICAgbV9PYmplY3RTdHJlYW1NYXAuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCBwU3RyZWFtQWNjKTsKLSAgICByZXR1cm4gcFN0cmVhbUFjYzsKKyAgfQorICByZXR1cm4gZHdQZXJtaXNzaW9uOwogfQotRlhfRklMRVNJWkUgQ1BERl9QYXJzZXI6OkdldE9iamVjdFNpemUoRlhfRFdPUkQgb2JqbnVtKQotewotICAgIGlmIChvYmpudW0gPj0gKEZYX0RXT1JEKW1fQ3Jvc3NSZWYuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAyKSB7Ci0gICAgICAgIG9iam51bSA9IChGWF9EV09SRCltX0Nyb3NzUmVmW29iam51bV07Ci0gICAgfQotICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDEgfHwgbV9WNVR5cGVbb2JqbnVtXSA9PSAyNTUpIHsKLSAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gbV9Dcm9zc1JlZltvYmpudW1dOwotICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZvZmZzZXQsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKLSAgICAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChGWF9GSUxFU0laRSopcFJlc3VsdCAtIChGWF9GSUxFU0laRSopbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpID09IG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoKEZYX0ZJTEVTSVpFKilwUmVzdWx0KVsxXSAtIG9mZnNldDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CitGWF9CT09MIENQREZfUGFyc2VyOjpJc093bmVyKCkgeworICByZXR1cm4gbV9wU2VjdXJpdHlIYW5kbGVyID09IE5VTEwgPyBUUlVFIDogbV9wU2VjdXJpdHlIYW5kbGVyLT5Jc093bmVyKCk7CiB9Ci12b2lkIENQREZfUGFyc2VyOjpHZXRJbmRpcmVjdEJpbmFyeShGWF9EV09SRCBvYmpudW0sIHVpbnQ4X3QqJiBwQnVmZmVyLCBGWF9EV09SRCYgc2l6ZSkKLXsKLSAgICBwQnVmZmVyID0gTlVMTDsKLSAgICBzaXplID0gMDsKLSAgICBpZiAob2JqbnVtID49IChGWF9EV09SRCltX0Nyb3NzUmVmLkdldFNpemUoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKLSAgICAgICAgQ1BERl9TdHJlYW1BY2MqIHBPYmpTdHJlYW0gPSBHZXRPYmplY3RTdHJlYW0oKEZYX0RXT1JEKW1fQ3Jvc3NSZWZbb2JqbnVtXSk7Ci0gICAgICAgIGlmIChwT2JqU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IG4gPSBwT2JqU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXIoRlhfQlNUUkMoIk4iKSk7Ci0gICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gcE9ialN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJGaXJzdCIpKTsKLSAgICAgICAgQ1BERl9TeW50YXhQYXJzZXIgc3ludGF4OwotICAgICAgICBjb25zdCB1aW50OF90KiBwRGF0YSA9IHBPYmpTdHJlYW0tPkdldERhdGEoKTsKLSAgICAgICAgRlhfRFdPUkQgdG90YWxzaXplID0gcE9ialN0cmVhbS0+R2V0U2l6ZSgpOwotICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopcERhdGEsIChzaXplX3QpdG90YWxzaXplLCBGQUxTRSkpOwotICAgICAgICBzeW50YXguSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKLSAgICAgICAgd2hpbGUgKG4pIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIHRoaXNudW0gPSBzeW50YXguR2V0RGlyZWN0TnVtKCk7Ci0gICAgICAgICAgICBGWF9EV09SRCB0aGlzb2ZmID0gc3ludGF4LkdldERpcmVjdE51bSgpOwotICAgICAgICAgICAgaWYgKHRoaXNudW0gPT0gb2JqbnVtKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBzaXplID0gdG90YWxzaXplIC0gKHRoaXNvZmYgKyBvZmZzZXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bnRheC5HZXREaXJlY3ROdW0oKTsgIC8vIFNraXAgbmV4dG51bS4KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbmV4dG9mZiA9IHN5bnRheC5HZXREaXJlY3ROdW0oKTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IG5leHRvZmYgLSB0aGlzb2ZmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHBCdWZmZXIsIHBEYXRhICsgdGhpc29mZiArIG9mZnNldCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbiAtLTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDEpIHsKLSAgICAgICAgRlhfRklMRVNJWkUgcG9zID0gbV9Dcm9zc1JlZltvYmpudW1dOwotICAgICAgICBpZiAocG9zID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOwotICAgICAgICBGWF9CT09MIGJJc051bWJlcjsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgICAgIGlmICghYklzTnVtYmVyKSB7Ci0gICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBwYXJzZXJfb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKLSAgICAgICAgaWYgKHBhcnNlcl9vYmpudW0gJiYgcGFyc2VyX29iam51bSAhPSBvYmpudW0pIHsKLSAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgICAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSBGWF9CU1RSQygib2JqIikpIHsKLSAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZwb3MsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKLSAgICAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRklMRVNJWkUgbmV4dG9mZiA9ICgoRlhfRklMRVNJWkUqKXBSZXN1bHQpWzFdOwotICAgICAgICBGWF9CT09MIGJOZXh0T2ZmVmFsaWQgPSBGQUxTRTsKLSAgICAgICAgaWYgKG5leHRvZmYgIT0gcG9zKSB7Ci0gICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKG5leHRvZmYpOwotICAgICAgICAgICAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgICAgICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygieHJlZiIpKSB7Ci0gICAgICAgICAgICAgICAgYk5leHRPZmZWYWxpZCA9IFRSVUU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJJc051bWJlcikgewotICAgICAgICAgICAgICAgIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgICAgICAgICAgICAgIGlmIChiSXNOdW1iZXIgJiYgbV9TeW50YXguR2V0S2V5d29yZCgpID09IEZYX0JTVFJDKCJvYmoiKSkgewotICAgICAgICAgICAgICAgICAgICBiTmV4dE9mZlZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiTmV4dE9mZlZhbGlkKSB7Ci0gICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKHBvcyk7Ci0gICAgICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICAgIGlmIChtX1N5bnRheC5HZXRLZXl3b3JkKCkgPT0gRlhfQlNUUkMoImVuZG9iaiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9TeW50YXguU2F2ZVBvcygpID09IG1fU3ludGF4Lm1fRmlsZUxlbikgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0b2ZmID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgICAgICB9Ci0gICAgICAgIHNpemUgPSAoRlhfRFdPUkQpKG5leHRvZmYgLSBwb3MpOwotICAgICAgICBwQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7Ci0gICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICAgICAgbV9TeW50YXguUmVhZEJsb2NrKHBCdWZmZXIsIHNpemUpOwotICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICB9Cit2b2lkIENQREZfUGFyc2VyOjpTZXRTZWN1cml0eUhhbmRsZXIoQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9yY2VkKSB7CisgIEFTU0VSVChtX3BTZWN1cml0eUhhbmRsZXIgPT0gTlVMTCk7CisgIGlmICghbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIpIHsKKyAgICBkZWxldGUgbV9wU2VjdXJpdHlIYW5kbGVyOworICAgIG1fcFNlY3VyaXR5SGFuZGxlciA9IE5VTEw7CisgIH0KKyAgbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIgPSBiRm9yY2VkOworICBtX3BTZWN1cml0eUhhbmRsZXIgPSBwU2VjdXJpdHlIYW5kbGVyOworICBpZiAobV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlciA9IHBTZWN1cml0eUhhbmRsZXItPkNyZWF0ZUNyeXB0b0hhbmRsZXIoKTsKKyAgbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlci0+SW5pdChOVUxMLCBwU2VjdXJpdHlIYW5kbGVyKTsKIH0KLUNQREZfT2JqZWN0KiBDUERGX1BhcnNlcjo6UGFyc2VJbmRpcmVjdE9iamVjdEF0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBvYmpudW0sCi0gICAgICAgIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KQotewotICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKLSAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0ZJTEVTSVpFIG9iak9mZnNldCA9IG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICBvYmpPZmZzZXQgLT0gd29yZC5HZXRMZW5ndGgoKTsKLSAgICBGWF9EV09SRCBwYXJzZXJfb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKLSAgICBpZiAob2JqbnVtICYmIHBhcnNlcl9vYmpudW0gIT0gb2JqbnVtKSB7Ci0gICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9EV09SRCBwYXJzZXJfZ2VubnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKLSAgICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpICE9IEZYX0JTVFJDKCJvYmoiKSkgewotICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwT2JqID0gbV9TeW50YXguR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIHBhcnNlcl9nZW5udW0sIHBDb250ZXh0KTsKLSAgICBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNXb3JkID0gbV9TeW50YXguR2V0S2V5d29yZCgpOwotICAgIGlmIChic1dvcmQgPT0gRlhfQlNUUkMoImVuZG9iaiIpKSB7Ci0gICAgICAgIG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICB9Ci0gICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgaWYgKHBPYmopIHsKLSAgICAgICAgaWYgKCFvYmpudW0pIHsKLSAgICAgICAgICAgIHBPYmotPm1fT2JqTnVtID0gcGFyc2VyX29iam51bTsKLSAgICAgICAgfQotICAgICAgICBwT2JqLT5tX0dlbk51bSA9IHBhcnNlcl9nZW5udW07Ci0gICAgfQotICAgIHJldHVybiBwT2JqOwotfQotQ1BERl9PYmplY3QqIENQREZfUGFyc2VyOjpQYXJzZUluZGlyZWN0T2JqZWN0QXRCeVN0cmljdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgb2JqbnVtLAotICAgICAgICBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCogcENvbnRleHQsIEZYX0ZJTEVTSVpFICpwUmVzdWx0UG9zKQotewotICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKLSAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0RXT1JEIHBhcnNlcl9vYmpudW0gPSBGWFNZU19hdG9pKHdvcmQpOwotICAgIGlmIChvYmpudW0gJiYgcGFyc2VyX29iam51bSAhPSBvYmpudW0pIHsKLSAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0RXT1JEIGdlbm51bSA9IEZYU1lTX2F0b2kod29yZCk7Ci0gICAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSBGWF9CU1RSQygib2JqIikpIHsKLSAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcE9iaiA9IG1fU3ludGF4LkdldE9iamVjdEJ5U3RyaWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSwgcENvbnRleHQpOwotICAgIGlmIChwUmVzdWx0UG9zKSB7Ci0gICAgICAgICpwUmVzdWx0UG9zID0gbV9TeW50YXgubV9Qb3M7Ci0gICAgfQotICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgIHJldHVybiBwT2JqOwotfQotQ1BERl9EaWN0aW9uYXJ5KiBDUERGX1BhcnNlcjo6TG9hZFRyYWlsZXJWNCgpCi17Ci0gICAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSBGWF9CU1RSQygidHJhaWxlciIpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcE9iaiA9IG1fU3ludGF4LkdldE9iamVjdChtX3BEb2N1bWVudCwgMCwgMCwgMCk7Ci0gICAgaWYgKHBPYmogPT0gTlVMTCB8fCBwT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgaWYgKHBPYmopIHsKLSAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChDUERGX0RpY3Rpb25hcnkqKXBPYmo7Ci19Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6R2V0UGVybWlzc2lvbnMoRlhfQk9PTCBiQ2hlY2tSZXZpc2lvbikKLXsKLSAgICBpZiAobV9wU2VjdXJpdHlIYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChGWF9EV09SRCkgLSAxOwotICAgIH0KLSAgICBGWF9EV09SRCBkd1Blcm1pc3Npb24gPSBtX3BTZWN1cml0eUhhbmRsZXItPkdldFBlcm1pc3Npb25zKCk7Ci0gICAgaWYgKG1fcEVuY3J5cHREaWN0ICYmIG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkZpbHRlciIpKSA9PSBGWF9CU1RSQygiU3RhbmRhcmQiKSkgewotICAgICAgICBkd1Blcm1pc3Npb24gJj0gMHhGRkZGRkZGQzsKLSAgICAgICAgZHdQZXJtaXNzaW9uIHw9IDB4RkZGRkYwQzA7Ci0gICAgICAgIGlmKGJDaGVja1JldmlzaW9uICYmIG1fcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSIikpID09IDIpIHsKLSAgICAgICAgICAgIGR3UGVybWlzc2lvbiAmPSAweEZGRkZGMEZGOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkd1Blcm1pc3Npb247Ci19Ci1GWF9CT09MIENQREZfUGFyc2VyOjpJc093bmVyKCkKLXsKLSAgICByZXR1cm4gbV9wU2VjdXJpdHlIYW5kbGVyID09IE5VTEwgPyBUUlVFIDogbV9wU2VjdXJpdHlIYW5kbGVyLT5Jc093bmVyKCk7Ci19Ci12b2lkIENQREZfUGFyc2VyOjpTZXRTZWN1cml0eUhhbmRsZXIoQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIsIEZYX0JPT0wgYkZvcmNlZCkKLXsKLSAgICBBU1NFUlQobV9wU2VjdXJpdHlIYW5kbGVyID09IE5VTEwpOwotICAgIGlmICghbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIpIHsKLSAgICAgICAgZGVsZXRlIG1fcFNlY3VyaXR5SGFuZGxlcjsKLSAgICAgICAgbV9wU2VjdXJpdHlIYW5kbGVyID0gTlVMTDsKLSAgICB9Ci0gICAgbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIgPSBiRm9yY2VkOwotICAgIG1fcFNlY3VyaXR5SGFuZGxlciA9IHBTZWN1cml0eUhhbmRsZXI7Ci0gICAgaWYgKG1fYkZvcmNlVXNlU2VjdXJpdHlIYW5kbGVyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlciA9IHBTZWN1cml0eUhhbmRsZXItPkNyZWF0ZUNyeXB0b0hhbmRsZXIoKTsKLSAgICBtX1N5bnRheC5tX3BDcnlwdG9IYW5kbGVyLT5Jbml0KE5VTEwsIHBTZWN1cml0eUhhbmRsZXIpOwotfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6SXNMaW5lYXJpemVkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBvZmZzZXQpCi17Ci0gICAgbV9TeW50YXguSW5pdFBhcnNlcihwRmlsZUFjY2Vzcywgb2Zmc2V0KTsKLSAgICBtX1N5bnRheC5SZXN0b3JlUG9zKG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0ICsgOSk7Ci0gICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgRlhfQk9PTCBiSXNOdW1iZXI7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9EV09SRCBvYmpudW0gPSBGWFNZU19hdG9pKHdvcmQpOwotICAgIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgIGlmICghYklzTnVtYmVyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgZ2VubnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKLSAgICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpICE9IEZYX0JTVFJDKCJvYmoiKSkgewotICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BMaW5lYXJpemVkID0gbV9TeW50YXguR2V0T2JqZWN0KE5VTEwsIG9iam51bSwgZ2VubnVtLCAwKTsKLSAgICBpZiAoIW1fcExpbmVhcml6ZWQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wTGluZWFyaXplZC0+R2V0RGljdCgpICYmIG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiTGluZWFyaXplZCIpKSkgewotICAgICAgICBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgICAgICBDUERGX09iamVjdCAqcExlbiA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiTCIpKTsKLSAgICAgICAgaWYgKCFwTGVuKSB7Ci0gICAgICAgICAgICBtX3BMaW5lYXJpemVkLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocExlbi0+R2V0SW50ZWdlcigpICE9IChpbnQpcEZpbGVBY2Nlc3MtPkdldFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIENQREZfT2JqZWN0ICpwTm8gPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIlAiKSk7Ci0gICAgICAgIGlmIChwTm8gJiYgcE5vLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICAgICAgbV9kd0ZpcnN0UGFnZU5vID0gcE5vLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QgKnBUYWJsZSA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiVCIpKTsKLSAgICAgICAgaWYgKHBUYWJsZSAmJiBwVGFibGUtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gcFRhYmxlLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIG1fcExpbmVhcml6ZWQtPlJlbGVhc2UoKTsKLSAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OklzTGluZWFyaXplZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2Zmc2V0KSB7CisgIG1fU3ludGF4LkluaXRQYXJzZXIocEZpbGVBY2Nlc3MsIG9mZnNldCk7CisgIG1fU3ludGF4LlJlc3RvcmVQb3MobV9TeW50YXgubV9IZWFkZXJPZmZzZXQgKyA5KTsKKyAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgIEZYX0JPT0wgYklzTnVtYmVyOworICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgaWYgKCFiSXNOdW1iZXIpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKKyAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7CisgIGlmICghYklzTnVtYmVyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0RXT1JEIGdlbm51bSA9IEZYU1lTX2F0b2kod29yZCk7CisgIGlmIChtX1N5bnRheC5HZXRLZXl3b3JkKCkgIT0gRlhfQlNUUkMoIm9iaiIpKSB7CisgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcExpbmVhcml6ZWQgPSBtX1N5bnRheC5HZXRPYmplY3QoTlVMTCwgb2JqbnVtLCBnZW5udW0sIDApOworICBpZiAoIW1fcExpbmVhcml6ZWQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcExpbmVhcml6ZWQtPkdldERpY3QoKSAmJgorICAgICAgbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJMaW5lYXJpemVkIikpKSB7CisgICAgbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgICBDUERGX09iamVjdCogcExlbiA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiTCIpKTsKKyAgICBpZiAoIXBMZW4pIHsKKyAgICAgIG1fcExpbmVhcml6ZWQtPlJlbGVhc2UoKTsKKyAgICAgIG1fcExpbmVhcml6ZWQgPSBOVUxMOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAocExlbi0+R2V0SW50ZWdlcigpICE9IChpbnQpcEZpbGVBY2Nlc3MtPkdldFNpemUoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBDUERGX09iamVjdCogcE5vID0gbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQIikpOworICAgIGlmIChwTm8gJiYgcE5vLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgeworICAgICAgbV9kd0ZpcnN0UGFnZU5vID0gcE5vLT5HZXRJbnRlZ2VyKCk7CisgICAgfQorICAgIENQREZfT2JqZWN0KiBwVGFibGUgPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIlQiKSk7CisgICAgaWYgKHBUYWJsZSAmJiBwVGFibGUtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CisgICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gcFRhYmxlLT5HZXRJbnRlZ2VyKCk7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisgIG1fcExpbmVhcml6ZWQtPlJlbGVhc2UoKTsKKyAgbV9wTGluZWFyaXplZCA9IE5VTEw7CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0RXT1JEIENQREZfUGFyc2VyOjpTdGFydEFzeW5QYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9CT09MIGJSZVBhcnNlLCBGWF9CT09MIGJPd25GaWxlUmVhZCkKLXsKLSAgICBDbG9zZVBhcnNlcihiUmVQYXJzZSk7Ci0gICAgbV9iWFJlZlN0cmVhbSA9IEZBTFNFOworRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0QXN5blBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVQYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPd25GaWxlUmVhZCkgeworICBDbG9zZVBhcnNlcihiUmVQYXJzZSk7CisgIG1fYlhSZWZTdHJlYW0gPSBGQUxTRTsKKyAgbV9MYXN0WFJlZk9mZnNldCA9IDA7CisgIG1fYk93bkZpbGVSZWFkID0gYk93bkZpbGVSZWFkOworICBpbnQzMl90IG9mZnNldCA9IEdldEhlYWRlck9mZnNldChwRmlsZUFjY2Vzcyk7CisgIGlmIChvZmZzZXQgPT0gLTEpIHsKKyAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOworICB9CisgIGlmICghSXNMaW5lYXJpemVkRmlsZShwRmlsZUFjY2Vzcywgb2Zmc2V0KSkgeworICAgIG1fU3ludGF4Lm1fcEZpbGVBY2Nlc3MgPSBOVUxMOworICAgIHJldHVybiBTdGFydFBhcnNlKHBGaWxlQWNjZXNzLCBiUmVQYXJzZSwgYk93bkZpbGVSZWFkKTsKKyAgfQorICBpZiAoIWJSZVBhcnNlKSB7CisgICAgbV9wRG9jdW1lbnQgPSBuZXcgQ1BERl9Eb2N1bWVudCh0aGlzKTsKKyAgfQorICBGWF9GSUxFU0laRSBkd0ZpcnN0WFJlZk9mZnNldCA9IG1fU3ludGF4LlNhdmVQb3MoKTsKKyAgRlhfQk9PTCBiWFJlZlJlYnVpbHQgPSBGQUxTRTsKKyAgRlhfQk9PTCBiTG9hZFY0ID0gRkFMU0U7CisgIGlmICghKGJMb2FkVjQgPSBMb2FkQ3Jvc3NSZWZWNChkd0ZpcnN0WFJlZk9mZnNldCwgMCwgRkFMU0UsIEZBTFNFKSkgJiYKKyAgICAgICFMb2FkQ3Jvc3NSZWZWNShkd0ZpcnN0WFJlZk9mZnNldCwgZHdGaXJzdFhSZWZPZmZzZXQsIFRSVUUpKSB7CisgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSkgeworICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgICB9CisgICAgYlhSZWZSZWJ1aWx0ID0gVFJVRTsKICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKLSAgICBtX2JPd25GaWxlUmVhZCA9IGJPd25GaWxlUmVhZDsKLSAgICBpbnQzMl90IG9mZnNldCA9IEdldEhlYWRlck9mZnNldChwRmlsZUFjY2Vzcyk7Ci0gICAgaWYgKG9mZnNldCA9PSAtMSkgewotICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOworICB9CisgIGlmIChiTG9hZFY0KSB7CisgICAgbV9wVHJhaWxlciA9IExvYWRUcmFpbGVyVjQoKTsKKyAgICBpZiAobV9wVHJhaWxlciA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmICghSXNMaW5lYXJpemVkRmlsZShwRmlsZUFjY2Vzcywgb2Zmc2V0KSkgewotICAgICAgICBtX1N5bnRheC5tX3BGaWxlQWNjZXNzID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIFN0YXJ0UGFyc2UocEZpbGVBY2Nlc3MsIGJSZVBhcnNlLCBiT3duRmlsZVJlYWQpOworICAgIGludDMyX3QgeHJlZnNpemUgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJTaXplIikpOworICAgIGlmICh4cmVmc2l6ZSA+IDApIHsKKyAgICAgIG1fQ3Jvc3NSZWYuU2V0U2l6ZSh4cmVmc2l6ZSk7CisgICAgICBtX1Y1VHlwZS5TZXRTaXplKHhyZWZzaXplKTsKICAgICB9Ci0gICAgaWYgKCFiUmVQYXJzZSkgewotICAgICAgICBtX3BEb2N1bWVudCA9IG5ldyBDUERGX0RvY3VtZW50KHRoaXMpOworICB9CisgIEZYX0RXT1JEIGR3UmV0ID0gU2V0RW5jcnlwdEhhbmRsZXIoKTsKKyAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpIHsKKyAgICByZXR1cm4gZHdSZXQ7CisgIH0KKyAgbV9wRG9jdW1lbnQtPkxvYWRBc3luRG9jKG1fcExpbmVhcml6ZWQtPkdldERpY3QoKSk7CisgIGlmIChtX3BEb2N1bWVudC0+R2V0Um9vdCgpID09IE5VTEwgfHwgbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpID09IDApIHsKKyAgICBpZiAoYlhSZWZSZWJ1aWx0KSB7CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwogICAgIH0KLSAgICBGWF9GSUxFU0laRSBkd0ZpcnN0WFJlZk9mZnNldCA9IG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICBGWF9CT09MIGJYUmVmUmVidWlsdCA9IEZBTFNFOwotICAgIEZYX0JPT0wgYkxvYWRWNCA9IEZBTFNFOwotICAgIGlmICghKGJMb2FkVjQgPSBMb2FkQ3Jvc3NSZWZWNChkd0ZpcnN0WFJlZk9mZnNldCwgMCwgRkFMU0UsIEZBTFNFKSkgJiYgIUxvYWRDcm9zc1JlZlY1KGR3Rmlyc3RYUmVmT2Zmc2V0LCBkd0ZpcnN0WFJlZk9mZnNldCwgVFJVRSkpIHsKLSAgICAgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSkgewotICAgICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKLSAgICAgICAgfQotICAgICAgICBiWFJlZlJlYnVpbHQgPSBUUlVFOwotICAgICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKKyAgICBSZWxlYXNlRW5jcnlwdEhhbmRsZXIoKTsKKyAgICBpZiAoIVJlYnVpbGRDcm9zc1JlZigpKSB7CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwogICAgIH0KLSAgICBpZiAoYkxvYWRWNCkgewotICAgICAgICBtX3BUcmFpbGVyID0gTG9hZFRyYWlsZXJWNCgpOwotICAgICAgICBpZiAobV9wVHJhaWxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCB4cmVmc2l6ZSA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlNpemUiKSk7Ci0gICAgICAgIGlmICh4cmVmc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIG1fQ3Jvc3NSZWYuU2V0U2l6ZSh4cmVmc2l6ZSk7Ci0gICAgICAgICAgICBtX1Y1VHlwZS5TZXRTaXplKHhyZWZzaXplKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9EV09SRCBkd1JldCA9IFNldEVuY3J5cHRIYW5kbGVyKCk7CisgICAgZHdSZXQgPSBTZXRFbmNyeXB0SGFuZGxlcigpOwogICAgIGlmIChkd1JldCAhPSBQREZQQVJTRV9FUlJPUl9TVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBkd1JldDsKKyAgICAgIHJldHVybiBkd1JldDsKICAgICB9CiAgICAgbV9wRG9jdW1lbnQtPkxvYWRBc3luRG9jKG1fcExpbmVhcml6ZWQtPkdldERpY3QoKSk7Ci0gICAgaWYgKG1fcERvY3VtZW50LT5HZXRSb290KCkgPT0gTlVMTCB8fCBtX3BEb2N1bWVudC0+R2V0UGFnZUNvdW50KCkgPT0gMCkgewotICAgICAgICBpZiAoYlhSZWZSZWJ1aWx0KSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgICAgICB9Ci0gICAgICAgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOwotICAgICAgICBpZiAoIVJlYnVpbGRDcm9zc1JlZigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgICAgICB9Ci0gICAgICAgIGR3UmV0ID0gU2V0RW5jcnlwdEhhbmRsZXIoKTsKLSAgICAgICAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBkd1JldDsKLSAgICAgICAgfQotICAgICAgICBtX3BEb2N1bWVudC0+TG9hZEFzeW5Eb2MobV9wTGluZWFyaXplZC0+R2V0RGljdCgpKTsKLSAgICAgICAgaWYgKG1fcERvY3VtZW50LT5HZXRSb290KCkgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKLSAgICAgICAgfQorICAgIGlmIChtX3BEb2N1bWVudC0+R2V0Um9vdCgpID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CiAgICAgfQotICAgIEZYU1lTX3Fzb3J0KG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKLSAgICBGWF9EV09SRCBSb290T2JqTnVtID0gR2V0Um9vdE9iak51bSgpOworICB9CisgIEZYU1lTX3Fzb3J0KG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLAorICAgICAgICAgICAgICBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKKyAgRlhfRFdPUkQgUm9vdE9iak51bSA9IEdldFJvb3RPYmpOdW0oKTsKKyAgaWYgKFJvb3RPYmpOdW0gPT0gMCkgeworICAgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOworICAgIFJlYnVpbGRDcm9zc1JlZigpOworICAgIFJvb3RPYmpOdW0gPSBHZXRSb290T2JqTnVtKCk7CiAgICAgaWYgKFJvb3RPYmpOdW0gPT0gMCkgewotICAgICAgICBSZWxlYXNlRW5jcnlwdEhhbmRsZXIoKTsKLSAgICAgICAgUmVidWlsZENyb3NzUmVmKCk7Ci0gICAgICAgIFJvb3RPYmpOdW0gPSBHZXRSb290T2JqTnVtKCk7Ci0gICAgICAgIGlmIChSb290T2JqTnVtID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZHdSZXQgPSBTZXRFbmNyeXB0SGFuZGxlcigpOwotICAgICAgICBpZiAoZHdSZXQgIT0gUERGUEFSU0VfRVJST1JfU1VDQ0VTUykgewotICAgICAgICAgICAgcmV0dXJuIGR3UmV0OwotICAgICAgICB9CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwogICAgIH0KLSAgICBpZiAobV9wU2VjdXJpdHlIYW5kbGVyICYmIG1fcFNlY3VyaXR5SGFuZGxlci0+SXNNZXRhZGF0YUVuY3J5cHRlZCgpKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwTWV0YWRhdGEgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJNZXRhZGF0YSIpKTsKLSAgICAgICAgaWYgKHBNZXRhZGF0YSAmJiBwTWV0YWRhdGEtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICBtX1N5bnRheC5tX01ldGFkYXRhT2JqbnVtID0gKChDUERGX1JlZmVyZW5jZSopIHBNZXRhZGF0YSktPkdldFJlZk9iak51bSgpOwotICAgICAgICB9CisgICAgZHdSZXQgPSBTZXRFbmNyeXB0SGFuZGxlcigpOworICAgIGlmIChkd1JldCAhPSBQREZQQVJTRV9FUlJPUl9TVUNDRVNTKSB7CisgICAgICByZXR1cm4gZHdSZXQ7CiAgICAgfQotICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9TVUNDRVNTOworICB9CisgIGlmIChtX3BTZWN1cml0eUhhbmRsZXIgJiYgbV9wU2VjdXJpdHlIYW5kbGVyLT5Jc01ldGFkYXRhRW5jcnlwdGVkKCkpIHsKKyAgICBDUERGX09iamVjdCogcE1ldGFkYXRhID0KKyAgICAgICAgbV9wRG9jdW1lbnQtPkdldFJvb3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiTWV0YWRhdGEiKSk7CisgICAgaWYgKHBNZXRhZGF0YSAmJiBwTWV0YWRhdGEtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgICBtX1N5bnRheC5tX01ldGFkYXRhT2JqbnVtID0gKChDUERGX1JlZmVyZW5jZSopcE1ldGFkYXRhKS0+R2V0UmVmT2JqTnVtKCk7CisgICAgfQorICB9CisgIHJldHVybiBQREZQQVJTRV9FUlJPUl9TVUNDRVNTOwogfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHhyZWZwb3MpCi17CitGWF9CT09MIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgeHJlZnBvcykgeworICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIEZBTFNFKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB3aGlsZSAoeHJlZnBvcykKICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIEZBTFNFKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHdoaWxlICh4cmVmcG9zKQotICAgICAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIEZBTFNFKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgbV9PYmplY3RTdHJlYW1NYXAuSW5pdEhhc2hUYWJsZSgxMDEsIEZBTFNFKTsKLSAgICBtX2JYUmVmU3RyZWFtID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgbV9PYmplY3RTdHJlYW1NYXAuSW5pdEhhc2hUYWJsZSgxMDEsIEZBTFNFKTsKKyAgbV9iWFJlZlN0cmVhbSA9IFRSVUU7CisgIHJldHVybiBUUlVFOwogfQotRlhfRFdPUkQgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkTWFpblhSZWZUYWJsZSgpCi17Ci0gICAgRlhfRFdPUkQgZHdTYXZlTWV0YWRhdGFPYmpudW0gPSBtX1N5bnRheC5tX01ldGFkYXRhT2JqbnVtOwotICAgIG1fU3ludGF4Lm1fTWV0YWRhdGFPYmpudW0gPSAwOwotICAgIGlmIChtX3BUcmFpbGVyKSB7Ci0gICAgICAgIG1fcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICAgICAgbV9wVHJhaWxlciA9IE5VTEw7CitGWF9EV09SRCBDUERGX1BhcnNlcjo6TG9hZExpbmVhcml6ZWRNYWluWFJlZlRhYmxlKCkgeworICBGWF9EV09SRCBkd1NhdmVNZXRhZGF0YU9iam51bSA9IG1fU3ludGF4Lm1fTWV0YWRhdGFPYmpudW07CisgIG1fU3ludGF4Lm1fTWV0YWRhdGFPYmpudW0gPSAwOworICBpZiAobV9wVHJhaWxlcikgeworICAgIG1fcFRyYWlsZXItPlJlbGVhc2UoKTsKKyAgICBtX3BUcmFpbGVyID0gTlVMTDsKKyAgfQorICBtX1N5bnRheC5SZXN0b3JlUG9zKG1fTGFzdFhSZWZPZmZzZXQgLSBtX1N5bnRheC5tX0hlYWRlck9mZnNldCk7CisgIHVpbnQ4X3QgY2ggPSAwOworICBGWF9EV09SRCBkd0NvdW50ID0gMDsKKyAgbV9TeW50YXguR2V0TmV4dENoYXIoY2gpOworICBpbnQzMl90IHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICB3aGlsZSAodHlwZSA9PSAnVycpIHsKKyAgICArK2R3Q291bnQ7CisgICAgaWYgKG1fU3ludGF4Lm1fRmlsZUxlbiA+PQorICAgICAgICAoRlhfRklMRVNJWkUpKG1fU3ludGF4LlNhdmVQb3MoKSArIG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0KSkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1fU3ludGF4LlJlc3RvcmVQb3MobV9MYXN0WFJlZk9mZnNldCAtIG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0KTsKLSAgICB1aW50OF90IGNoID0gMDsKLSAgICBGWF9EV09SRCBkd0NvdW50ID0gMDsKICAgICBtX1N5bnRheC5HZXROZXh0Q2hhcihjaCk7Ci0gICAgaW50MzJfdCB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICB3aGlsZSAodHlwZSA9PSAnVycpIHsKLSAgICAgICAgKytkd0NvdW50OwotICAgICAgICBpZiAobV9TeW50YXgubV9GaWxlTGVuID49IChGWF9GSUxFU0laRSkobV9TeW50YXguU2F2ZVBvcygpICsgbV9TeW50YXgubV9IZWFkZXJPZmZzZXQpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtX1N5bnRheC5HZXROZXh0Q2hhcihjaCk7Ci0gICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgIH0KLSAgICBtX0xhc3RYUmVmT2Zmc2V0ICs9IGR3Q291bnQ7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RTdHJlYW1NYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgdm9pZCogb2JqbnVtOwotICAgICAgICBDUERGX1N0cmVhbUFjYyogcFN0cmVhbTsKLSAgICAgICAgbV9PYmplY3RTdHJlYW1NYXAuR2V0TmV4dEFzc29jKHBvcywgb2JqbnVtLCAodm9pZComKXBTdHJlYW0pOwotICAgICAgICBkZWxldGUgcFN0cmVhbTsKLSAgICB9Ci0gICAgbV9PYmplY3RTdHJlYW1NYXAuUmVtb3ZlQWxsKCk7Ci0gICAgaWYgKCFMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjQobV9MYXN0WFJlZk9mZnNldCwgbV9kd1hyZWZTdGFydE9iak51bSkgJiYgIUxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNShtX0xhc3RYUmVmT2Zmc2V0KSkgewotICAgICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKLSAgICAgICAgbV9TeW50YXgubV9NZXRhZGF0YU9iam51bSA9IGR3U2F2ZU1ldGFkYXRhT2JqbnVtOwotICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgIH0KLSAgICBGWFNZU19xc29ydChtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7CisgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgIH0KKyAgbV9MYXN0WFJlZk9mZnNldCArPSBkd0NvdW50OworICBGWF9QT1NJVElPTiBwb3MgPSBtX09iamVjdFN0cmVhbU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICB2b2lkKiBvYmpudW07CisgICAgQ1BERl9TdHJlYW1BY2MqIHBTdHJlYW07CisgICAgbV9PYmplY3RTdHJlYW1NYXAuR2V0TmV4dEFzc29jKHBvcywgb2JqbnVtLCAodm9pZComKXBTdHJlYW0pOworICAgIGRlbGV0ZSBwU3RyZWFtOworICB9CisgIG1fT2JqZWN0U3RyZWFtTWFwLlJlbW92ZUFsbCgpOworICBpZiAoIUxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNChtX0xhc3RYUmVmT2Zmc2V0LCBtX2R3WHJlZlN0YXJ0T2JqTnVtKSAmJgorICAgICAgIUxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNShtX0xhc3RYUmVmT2Zmc2V0KSkgeworICAgIG1fTGFzdFhSZWZPZmZzZXQgPSAwOwogICAgIG1fU3ludGF4Lm1fTWV0YWRhdGFPYmpudW0gPSBkd1NhdmVNZXRhZGF0YU9iam51bTsKLSAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfU1VDQ0VTUzsKKyAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOworICB9CisgIEZYU1lTX3Fzb3J0KG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLAorICAgICAgICAgICAgICBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKKyAgbV9TeW50YXgubV9NZXRhZGF0YU9iam51bSA9IGR3U2F2ZU1ldGFkYXRhT2JqbnVtOworICByZXR1cm4gUERGUEFSU0VfRVJST1JfU1VDQ0VTUzsKIH0KIAogLy8gc3RhdGljCiBpbnQgQ1BERl9TeW50YXhQYXJzZXI6OnNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoID0gMDsKIAotQ1BERl9TeW50YXhQYXJzZXI6OkNQREZfU3ludGF4UGFyc2VyKCkKLXsKLSAgICBtX3BGaWxlQWNjZXNzID0gTlVMTDsKLSAgICBtX3BDcnlwdG9IYW5kbGVyID0gTlVMTDsKLSAgICBtX3BGaWxlQnVmID0gTlVMTDsKLSAgICBtX0J1ZlNpemUgPSBDUERGX01vZHVsZU1ncjo6a0ZpbGVCdWZTaXplOwotICAgIG1fcEZpbGVCdWYgPSBOVUxMOwotICAgIG1fTWV0YWRhdGFPYmpudW0gPSAwOwotICAgIG1fZHdXb3JkUG9zID0gMDsKLSAgICBtX2JGaWxlU3RyZWFtID0gRkFMU0U7CitDUERGX1N5bnRheFBhcnNlcjo6Q1BERl9TeW50YXhQYXJzZXIoKSB7CisgIG1fcEZpbGVBY2Nlc3MgPSBOVUxMOworICBtX3BDcnlwdG9IYW5kbGVyID0gTlVMTDsKKyAgbV9wRmlsZUJ1ZiA9IE5VTEw7CisgIG1fQnVmU2l6ZSA9IENQREZfTW9kdWxlTWdyOjprRmlsZUJ1ZlNpemU7CisgIG1fcEZpbGVCdWYgPSBOVUxMOworICBtX01ldGFkYXRhT2JqbnVtID0gMDsKKyAgbV9kd1dvcmRQb3MgPSAwOworICBtX2JGaWxlU3RyZWFtID0gRkFMU0U7CiB9Ci1DUERGX1N5bnRheFBhcnNlcjo6fkNQREZfU3ludGF4UGFyc2VyKCkKLXsKLSAgICBpZiAobV9wRmlsZUJ1ZikgewotICAgICAgICBGWF9GcmVlKG1fcEZpbGVCdWYpOwotICAgIH0KK0NQREZfU3ludGF4UGFyc2VyOjp+Q1BERl9TeW50YXhQYXJzZXIoKSB7CisgIGlmIChtX3BGaWxlQnVmKSB7CisgICAgRlhfRnJlZShtX3BGaWxlQnVmKTsKKyAgfQogfQotRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6R2V0Q2hhckF0KEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpCi17Ci0gICAgRlhfRklMRVNJWkUgc2F2ZV9wb3MgPSBtX1BvczsKLSAgICBtX1BvcyA9IHBvczsKLSAgICBGWF9CT09MIHJldCA9IEdldE5leHRDaGFyKGNoKTsKLSAgICBtX1BvcyA9IHNhdmVfcG9zOwotICAgIHJldHVybiByZXQ7CitGWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpHZXRDaGFyQXQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCkgeworICBGWF9GSUxFU0laRSBzYXZlX3BvcyA9IG1fUG9zOworICBtX1BvcyA9IHBvczsKKyAgRlhfQk9PTCByZXQgPSBHZXROZXh0Q2hhcihjaCk7CisgIG1fUG9zID0gc2F2ZV9wb3M7CisgIHJldHVybiByZXQ7CiB9Ci1GWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpHZXROZXh0Q2hhcih1aW50OF90JiBjaCkKLXsKLSAgICBGWF9GSUxFU0laRSBwb3MgPSBtX1BvcyArIG1fSGVhZGVyT2Zmc2V0OwotICAgIGlmIChwb3MgPj0gbV9GaWxlTGVuKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OkdldE5leHRDaGFyKHVpbnQ4X3QmIGNoKSB7CisgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fUG9zICsgbV9IZWFkZXJPZmZzZXQ7CisgIGlmIChwb3MgPj0gbV9GaWxlTGVuKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX0J1Zk9mZnNldCA+PSBwb3MgfHwgKEZYX0ZJTEVTSVpFKShtX0J1Zk9mZnNldCArIG1fQnVmU2l6ZSkgPD0gcG9zKSB7CisgICAgRlhfRklMRVNJWkUgcmVhZF9wb3MgPSBwb3M7CisgICAgRlhfRFdPUkQgcmVhZF9zaXplID0gbV9CdWZTaXplOworICAgIGlmICgoRlhfRklMRVNJWkUpcmVhZF9zaXplID4gbV9GaWxlTGVuKSB7CisgICAgICByZWFkX3NpemUgPSAoRlhfRFdPUkQpbV9GaWxlTGVuOwogICAgIH0KLSAgICBpZiAobV9CdWZPZmZzZXQgPj0gcG9zIHx8IChGWF9GSUxFU0laRSkobV9CdWZPZmZzZXQgKyBtX0J1ZlNpemUpIDw9IHBvcykgewotICAgICAgICBGWF9GSUxFU0laRSByZWFkX3BvcyA9IHBvczsKLSAgICAgICAgRlhfRFdPUkQgcmVhZF9zaXplID0gbV9CdWZTaXplOwotICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKXJlYWRfc2l6ZSA+IG1fRmlsZUxlbikgewotICAgICAgICAgICAgcmVhZF9zaXplID0gKEZYX0RXT1JEKW1fRmlsZUxlbjsKLSAgICAgICAgfQotICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKShyZWFkX3BvcyArIHJlYWRfc2l6ZSkgPiBtX0ZpbGVMZW4pIHsKLSAgICAgICAgICAgIGlmIChtX0ZpbGVMZW4gPCAoRlhfRklMRVNJWkUpcmVhZF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmVhZF9wb3MgPSAwOwotICAgICAgICAgICAgICAgIHJlYWRfc2l6ZSA9IChGWF9EV09SRCltX0ZpbGVMZW47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlYWRfcG9zID0gbV9GaWxlTGVuIC0gcmVhZF9zaXplOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghbV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKG1fcEZpbGVCdWYsIHJlYWRfcG9zLCByZWFkX3NpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9CdWZPZmZzZXQgPSByZWFkX3BvczsKKyAgICBpZiAoKEZYX0ZJTEVTSVpFKShyZWFkX3BvcyArIHJlYWRfc2l6ZSkgPiBtX0ZpbGVMZW4pIHsKKyAgICAgIGlmIChtX0ZpbGVMZW4gPCAoRlhfRklMRVNJWkUpcmVhZF9zaXplKSB7CisgICAgICAgIHJlYWRfcG9zID0gMDsKKyAgICAgICAgcmVhZF9zaXplID0gKEZYX0RXT1JEKW1fRmlsZUxlbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlYWRfcG9zID0gbV9GaWxlTGVuIC0gcmVhZF9zaXplOworICAgICAgfQogICAgIH0KLSAgICBjaCA9IG1fcEZpbGVCdWZbcG9zIC0gbV9CdWZPZmZzZXRdOwotICAgIG1fUG9zICsrOwotICAgIHJldHVybiBUUlVFOworICAgIGlmICghbV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKG1fcEZpbGVCdWYsIHJlYWRfcG9zLCByZWFkX3NpemUpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIG1fQnVmT2Zmc2V0ID0gcmVhZF9wb3M7CisgIH0KKyAgY2ggPSBtX3BGaWxlQnVmW3BvcyAtIG1fQnVmT2Zmc2V0XTsKKyAgbV9Qb3MrKzsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpHZXRDaGFyQXRCYWNrd2FyZChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKQotewotICAgIHBvcyArPSBtX0hlYWRlck9mZnNldDsKLSAgICBpZiAocG9zID49IG1fRmlsZUxlbikgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpHZXRDaGFyQXRCYWNrd2FyZChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKSB7CisgIHBvcyArPSBtX0hlYWRlck9mZnNldDsKKyAgaWYgKHBvcyA+PSBtX0ZpbGVMZW4pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fQnVmT2Zmc2V0ID49IHBvcyB8fCAoRlhfRklMRVNJWkUpKG1fQnVmT2Zmc2V0ICsgbV9CdWZTaXplKSA8PSBwb3MpIHsKKyAgICBGWF9GSUxFU0laRSByZWFkX3BvczsKKyAgICBpZiAocG9zIDwgKEZYX0ZJTEVTSVpFKW1fQnVmU2l6ZSkgeworICAgICAgcmVhZF9wb3MgPSAwOworICAgIH0gZWxzZSB7CisgICAgICByZWFkX3BvcyA9IHBvcyAtIG1fQnVmU2l6ZSArIDE7CiAgICAgfQotICAgIGlmIChtX0J1Zk9mZnNldCA+PSBwb3MgfHwgKEZYX0ZJTEVTSVpFKShtX0J1Zk9mZnNldCArIG1fQnVmU2l6ZSkgPD0gcG9zKSB7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIHJlYWRfcG9zOwotICAgICAgICBpZiAocG9zIDwgKEZYX0ZJTEVTSVpFKW1fQnVmU2l6ZSkgewotICAgICAgICAgICAgcmVhZF9wb3MgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVhZF9wb3MgPSBwb3MgLSBtX0J1ZlNpemUgKyAxOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIHJlYWRfc2l6ZSA9IG1fQnVmU2l6ZTsKLSAgICAgICAgaWYgKChGWF9GSUxFU0laRSkocmVhZF9wb3MgKyByZWFkX3NpemUpID4gbV9GaWxlTGVuKSB7Ci0gICAgICAgICAgICBpZiAobV9GaWxlTGVuIDwgKEZYX0ZJTEVTSVpFKXJlYWRfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJlYWRfcG9zID0gMDsKLSAgICAgICAgICAgICAgICByZWFkX3NpemUgPSAoRlhfRFdPUkQpbV9GaWxlTGVuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWFkX3BvcyA9IG1fRmlsZUxlbiAtIHJlYWRfc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIW1fcEZpbGVBY2Nlc3MtPlJlYWRCbG9jayhtX3BGaWxlQnVmLCByZWFkX3BvcywgcmVhZF9zaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1fQnVmT2Zmc2V0ID0gcmVhZF9wb3M7CisgICAgRlhfRFdPUkQgcmVhZF9zaXplID0gbV9CdWZTaXplOworICAgIGlmICgoRlhfRklMRVNJWkUpKHJlYWRfcG9zICsgcmVhZF9zaXplKSA+IG1fRmlsZUxlbikgeworICAgICAgaWYgKG1fRmlsZUxlbiA8IChGWF9GSUxFU0laRSlyZWFkX3NpemUpIHsKKyAgICAgICAgcmVhZF9wb3MgPSAwOworICAgICAgICByZWFkX3NpemUgPSAoRlhfRFdPUkQpbV9GaWxlTGVuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVhZF9wb3MgPSBtX0ZpbGVMZW4gLSByZWFkX3NpemU7CisgICAgICB9CiAgICAgfQotICAgIGNoID0gbV9wRmlsZUJ1Zltwb3MgLSBtX0J1Zk9mZnNldF07Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKCFtX3BGaWxlQWNjZXNzLT5SZWFkQmxvY2sobV9wRmlsZUJ1ZiwgcmVhZF9wb3MsIHJlYWRfc2l6ZSkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgbV9CdWZPZmZzZXQgPSByZWFkX3BvczsKKyAgfQorICBjaCA9IG1fcEZpbGVCdWZbcG9zIC0gbV9CdWZPZmZzZXRdOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRCbG9jayh1aW50OF90KiBwQnVmLCBGWF9EV09SRCBzaXplKQotewotICAgIGlmICghbV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKHBCdWYsIG1fUG9zICsgbV9IZWFkZXJPZmZzZXQsIHNpemUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9Qb3MgKz0gc2l6ZTsKLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRCbG9jayh1aW50OF90KiBwQnVmLCBGWF9EV09SRCBzaXplKSB7CisgIGlmICghbV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKHBCdWYsIG1fUG9zICsgbV9IZWFkZXJPZmZzZXQsIHNpemUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fUG9zICs9IHNpemU7CisgIHJldHVybiBUUlVFOwogfQogI2RlZmluZSBNQVhfV09SRF9CVUZGRVIgMjU2Ci12b2lkIENQREZfU3ludGF4UGFyc2VyOjpHZXROZXh0V29yZCgpCi17Ci0gICAgbV9Xb3JkU2l6ZSA9IDA7Ci0gICAgbV9iSXNOdW1iZXIgPSBUUlVFOwotICAgIHVpbnQ4X3QgY2g7Ci0gICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKK3ZvaWQgQ1BERl9TeW50YXhQYXJzZXI6OkdldE5leHRXb3JkKCkgeworICBtX1dvcmRTaXplID0gMDsKKyAgbV9iSXNOdW1iZXIgPSBUUlVFOworICB1aW50OF90IGNoOworICBpZiAoIUdldE5leHRDaGFyKGNoKSkgeworICAgIHJldHVybjsKKyAgfQorICB1aW50OF90IHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICB3aGlsZSAoMSkgeworICAgIHdoaWxlICh0eXBlID09ICdXJykgeworICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgfQotICAgIHVpbnQ4X3QgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgICAgaWYgKGNoICE9ICclJykgeworICAgICAgYnJlYWs7CisgICAgfQogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHdoaWxlICh0eXBlID09ICdXJykgewotICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2ggIT0gJyUnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgfQorICBpZiAodHlwZSA9PSAnRCcpIHsKKyAgICBtX2JJc051bWJlciA9IEZBTFNFOworICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CisgICAgaWYgKGNoID09ICcvJykgeworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgfQotICAgIGlmICh0eXBlID09ICdEJykgewotICAgICAgICBtX2JJc051bWJlciA9IEZBTFNFOwotICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwotICAgICAgICBpZiAoY2ggPT0gJy8nKSB7Ci0gICAgICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gJ1InICYmIHR5cGUgIT0gJ04nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fUG9zIC0tOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX1dvcmRTaXplIDwgTUFYX1dPUkRfQlVGRkVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc8JykgewotICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJzwnKSB7Ci0gICAgICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7Ci0gICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnPicpIHsKLSAgICAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX1BvcyAtLTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgIT0gJ1InICYmIHR5cGUgIT0gJ04nKSB7CisgICAgICAgICAgbV9Qb3MtLTsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAobV9Xb3JkU2l6ZSA8IE1BWF9XT1JEX0JVRkZFUikgewotICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKKyAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwogICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlICE9ICdOJykgewotICAgICAgICAgICAgbV9iSXNOdW1iZXIgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgICAgICBpZiAodHlwZSA9PSAnRCcgfHwgdHlwZSA9PSAnVycpIHsKLSAgICAgICAgICAgIG1fUG9zIC0tOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX1N5bnRheFBhcnNlcjo6UmVhZFN0cmluZygpCi17Ci0gICAgdWludDhfdCBjaDsKLSAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBpbnQzMl90IHBhcmxldmVsID0gMDsKLSAgICBpbnQzMl90IHN0YXR1cyA9IDAsIGlFc2NDb2RlID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnKScpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmxldmVsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWYuR2V0Qnl0ZVN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhcmxldmVsIC0tOwotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcignKScpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmxldmVsICsrOwotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcignKCcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xcJykgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKLSAgICAgICAgICAgICAgICAgICAgaUVzY0NvZGUgPSBjaCAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnbicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAncicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xyJyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAndCcpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1x0Jyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnYicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xiJyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnZicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xmJyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc3JykgewotICAgICAgICAgICAgICAgICAgICBpRXNjQ29kZSA9IGlFc2NDb2RlICogOCArIGNoIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAzOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGlFc2NDb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlFc2NDb2RlID0gaUVzY0NvZGUgKiA4ICsgY2ggLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGlFc2NDb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgR2V0TmV4dENoYXIoY2gpOwotICAgIHJldHVybiBidWYuR2V0Qnl0ZVN0cmluZygpOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRIZXhTdHJpbmcoKQotewotICAgIHVpbnQ4X3QgY2g7Ci0gICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENGWF9CaW5hcnlCdWYgYnVmOwotICAgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsKLSAgICB1aW50OF90IGNvZGUgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChjaCA9PSAnPicpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICcwJykgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICcwJzsKLSAgICAgICAgICAgICAgICBidWYuQXBwZW5kQnl0ZSgodWludDhfdCljb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJGaXJzdCA9ICFiRmlyc3Q7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgewotICAgICAgICAgICAgaWYgKGJGaXJzdCkgewotICAgICAgICAgICAgICAgIGNvZGUgPSAoY2ggLSAnQScgKyAxMCkgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICdBJyArIDEwOwotICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRCeXRlKCh1aW50OF90KWNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkZpcnN0ID0gIWJGaXJzdDsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICdhJyArIDEwKSAqIDE2OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2RlICs9IGNoIC0gJ2EnICsgMTA7Ci0gICAgICAgICAgICAgICAgYnVmLkFwcGVuZEJ5dGUoKHVpbnQ4X3QpY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiRmlyc3QgPSAhYkZpcnN0OwotICAgICAgICB9Ci0gICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWJGaXJzdCkgewotICAgICAgICBidWYuQXBwZW5kQnl0ZSgodWludDhfdCljb2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Zi5HZXRCeXRlU3RyaW5nKCk7Ci19Ci12b2lkIENQREZfU3ludGF4UGFyc2VyOjpUb05leHRMaW5lKCkKLXsKLSAgICB1aW50OF90IGNoOwotICAgIHdoaWxlIChHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaCA9PSAnXHInKSB7Ci0gICAgICAgICAgICBHZXROZXh0Q2hhcihjaCk7Ci0gICAgICAgICAgICBpZiAoY2ggIT0gJ1xuJykgewotICAgICAgICAgICAgICAgIC0tbV9Qb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgQ1BERl9TeW50YXhQYXJzZXI6OlRvTmV4dFdvcmQoKQotewotICAgIHVpbnQ4X3QgY2g7Ci0gICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNoID09ICc8JykgeworICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKGNoID09ICc8JykgeworICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9Qb3MtLTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNoID09ICc+JykgeworICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKGNoID09ICc+JykgeworICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9Qb3MtLTsKKyAgICAgIH0KICAgICB9Ci0gICAgdWludDhfdCB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICB3aGlsZSAodHlwZSA9PSAnVycpIHsKLSAgICAgICAgICAgIG1fZHdXb3JkUG9zID0gbV9Qb3M7Ci0gICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICAgIHJldHVybjsKKyAgfQorICB3aGlsZSAoMSkgeworICAgIGlmIChtX1dvcmRTaXplIDwgTUFYX1dPUkRfQlVGRkVSKSB7CisgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOworICAgIH0KKyAgICBpZiAodHlwZSAhPSAnTicpIHsKKyAgICAgIG1fYklzTnVtYmVyID0gRkFMU0U7CisgICAgfQorICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICAgIGlmICh0eXBlID09ICdEJyB8fCB0eXBlID09ICdXJykgeworICAgICAgbV9Qb3MtLTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRTdHJpbmcoKSB7CisgIHVpbnQ4X3QgY2g7CisgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIH0KKyAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgaW50MzJfdCBwYXJsZXZlbCA9IDA7CisgIGludDMyX3Qgc3RhdHVzID0gMCwgaUVzY0NvZGUgPSAwOworICB3aGlsZSAoMSkgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGlmIChjaCA9PSAnKScpIHsKKyAgICAgICAgICBpZiAocGFybGV2ZWwgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGJ1Zi5HZXRCeXRlU3RyaW5nKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHBhcmxldmVsLS07CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJyknKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKCcpIHsKKyAgICAgICAgICBwYXJsZXZlbCsrOworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCcoJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xcJykgeworICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoY2gpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjaCAhPSAnJScpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKSB7CisgICAgICAgICAgaUVzY0NvZGUgPSBjaCAtICcwJzsKKyAgICAgICAgICBzdGF0dXMgPSAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChjaCA9PSAnbicpIHsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcignXG4nKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAncicpIHsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcignXHInKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAndCcpIHsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcignXHQnKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnYicpIHsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcignXGInKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnZicpIHsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcignXGYnKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgc3RhdHVzID0gNDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoY2gpOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc3JykgeworICAgICAgICAgIGlFc2NDb2RlID0gaUVzY0NvZGUgKiA4ICsgY2ggLSAnMCc7CisgICAgICAgICAgc3RhdHVzID0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7CisgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKKyAgICAgICAgICBpRXNjQ29kZSA9IGlFc2NDb2RlICogOCArIGNoIC0gJzAnOworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGlFc2NDb2RlKTsKKyAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGlFc2NDb2RlKTsKKyAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OgorICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICBpZiAoY2ggIT0gJ1xuJykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIEdldE5leHRDaGFyKGNoKTsKKyAgcmV0dXJuIGJ1Zi5HZXRCeXRlU3RyaW5nKCk7Cit9CitDRlhfQnl0ZVN0cmluZyBDUERGX1N5bnRheFBhcnNlcjo6UmVhZEhleFN0cmluZygpIHsKKyAgdWludDhfdCBjaDsKKyAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgfQorICBDRlhfQmluYXJ5QnVmIGJ1ZjsKKyAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOworICB1aW50OF90IGNvZGUgPSAwOworICB3aGlsZSAoMSkgeworICAgIGlmIChjaCA9PSAnPicpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgaWYgKGJGaXJzdCkgeworICAgICAgICBjb2RlID0gKGNoIC0gJzAnKSAqIDE2OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZSArPSBjaCAtICcwJzsKKyAgICAgICAgYnVmLkFwcGVuZEJ5dGUoKHVpbnQ4X3QpY29kZSk7CisgICAgICB9CisgICAgICBiRmlyc3QgPSAhYkZpcnN0OworICAgIH0gZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgeworICAgICAgaWYgKGJGaXJzdCkgeworICAgICAgICBjb2RlID0gKGNoIC0gJ0EnICsgMTApICogMTY7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb2RlICs9IGNoIC0gJ0EnICsgMTA7CisgICAgICAgIGJ1Zi5BcHBlbmRCeXRlKCh1aW50OF90KWNvZGUpOworICAgICAgfQorICAgICAgYkZpcnN0ID0gIWJGaXJzdDsKKyAgICB9IGVsc2UgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHsKKyAgICAgIGlmIChiRmlyc3QpIHsKKyAgICAgICAgY29kZSA9IChjaCAtICdhJyArIDEwKSAqIDE2OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZSArPSBjaCAtICdhJyArIDEwOworICAgICAgICBidWYuQXBwZW5kQnl0ZSgodWludDhfdCljb2RlKTsKKyAgICAgIH0KKyAgICAgIGJGaXJzdCA9ICFiRmlyc3Q7CisgICAgfQorICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFiRmlyc3QpIHsKKyAgICBidWYuQXBwZW5kQnl0ZSgodWludDhfdCljb2RlKTsKKyAgfQorICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKK30KK3ZvaWQgQ1BERl9TeW50YXhQYXJzZXI6OlRvTmV4dExpbmUoKSB7CisgIHVpbnQ4X3QgY2g7CisgIHdoaWxlIChHZXROZXh0Q2hhcihjaCkpIHsKKyAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgICBHZXROZXh0Q2hhcihjaCk7CisgICAgICBpZiAoY2ggIT0gJ1xuJykgeworICAgICAgICAtLW1fUG9zOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9Cit2b2lkIENQREZfU3ludGF4UGFyc2VyOjpUb05leHRXb3JkKCkgeworICB1aW50OF90IGNoOworICBpZiAoIUdldE5leHRDaGFyKGNoKSkgeworICAgIHJldHVybjsKKyAgfQorICB1aW50OF90IHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICB3aGlsZSAoMSkgeworICAgIHdoaWxlICh0eXBlID09ICdXJykgeworICAgICAgbV9kd1dvcmRQb3MgPSBtX1BvczsKKyAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICAgIH0KKyAgICBpZiAoY2ggIT0gJyUnKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICB9CisgIG1fUG9zLS07Cit9CitDRlhfQnl0ZVN0cmluZyBDUERGX1N5bnRheFBhcnNlcjo6R2V0TmV4dFdvcmQoRlhfQk9PTCYgYklzTnVtYmVyKSB7CisgIEdldE5leHRXb3JkKCk7CisgIGJJc051bWJlciA9IG1fYklzTnVtYmVyOworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKW1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSk7Cit9CitDRlhfQnl0ZVN0cmluZyBDUERGX1N5bnRheFBhcnNlcjo6R2V0S2V5d29yZCgpIHsKKyAgR2V0TmV4dFdvcmQoKTsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKChjb25zdCBGWF9DSEFSKiltX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpOworfQorQ1BERl9PYmplY3QqIENQREZfU3ludGF4UGFyc2VyOjpHZXRPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2VubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSU0VfQ09OVEVYVCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWNyeXB0KSB7CisgIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50UmVjdXJzaW9uRGVwdGgpOworICBpZiAoKytzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA+IGtQYXJzZXJNYXhSZWN1cnNpb25EZXB0aCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7CisgIEZYX0JPT0wgYlR5cGVPbmx5ID0gcENvbnRleHQgJiYgKHBDb250ZXh0LT5tX0ZsYWdzICYgUERGUEFSU0VfVFlQRU9OTFkpOworICBGWF9CT09MIGJJc051bWJlcjsKKyAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7CisgIENQREZfT2JqZWN0KiBwUmV0ID0gTlVMTDsKKyAgaWYgKHdvcmQuR2V0TGVuZ3RoKCkgPT0gMCkgeworICAgIGlmIChiVHlwZU9ubHkpIHsKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9JTlZBTElEOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoYklzTnVtYmVyKSB7CisgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKKyAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7CisgICAgaWYgKGJJc051bWJlcikgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQyID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgICAgIGlmIChuZXh0d29yZDIgPT0gRlhfQlNUUkMoIlIiKSkgeworICAgICAgICBGWF9EV09SRCBvYmpudW0gPSBGWFNZU19hdG9pKHdvcmQpOworICAgICAgICBpZiAoYlR5cGVPbmx5KSB7CisgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX1JFRkVSRU5DRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IENQREZfUmVmZXJlbmNlKHBPYmpMaXN0LCBvYmpudW0pOworICAgICAgfQorICAgIH0KKyAgICBtX1BvcyA9IFNhdmVkUG9zOworICAgIGlmIChiVHlwZU9ubHkpIHsKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9OVU1CRVI7CisgICAgfQorICAgIHJldHVybiBDUERGX051bWJlcjo6Q3JlYXRlKHdvcmQpOworICB9CisgIGlmICh3b3JkID09IEZYX0JTVFJDKCJ0cnVlIikgfHwgd29yZCA9PSBGWF9CU1RSQygiZmFsc2UiKSkgeworICAgIGlmIChiVHlwZU9ubHkpIHsKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9CT09MRUFOOworICAgIH0KKyAgICBwUmV0ID0gQ1BERl9Cb29sZWFuOjpDcmVhdGUod29yZCA9PSBGWF9CU1RSQygidHJ1ZSIpKTsKKyAgICByZXR1cm4gcFJldDsKKyAgfQorICBpZiAod29yZCA9PSBGWF9CU1RSQygibnVsbCIpKSB7CisgICAgaWYgKGJUeXBlT25seSkgeworICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX05VTEw7CisgICAgfQorICAgIHBSZXQgPSBDUERGX051bGw6OkNyZWF0ZSgpOworICAgIHJldHVybiBwUmV0OworICB9CisgIGlmICh3b3JkID09IEZYX0JTVFJDKCIoIikpIHsKKyAgICBpZiAoYlR5cGVPbmx5KSB7CisgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfU1RSSU5HOworICAgIH0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBSZWFkU3RyaW5nKCk7CisgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIgJiYgYkRlY3J5cHQpIHsKKyAgICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHQob2JqbnVtLCBnZW5udW0sIHN0cik7CisgICAgfQorICAgIHBSZXQgPSBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgRkFMU0UpOworICAgIHJldHVybiBwUmV0OworICB9CisgIGlmICh3b3JkID09IEZYX0JTVFJDKCI8IikpIHsKKyAgICBpZiAoYlR5cGVPbmx5KSB7CisgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfU1RSSU5HOworICAgIH0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBSZWFkSGV4U3RyaW5nKCk7CisgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIgJiYgYkRlY3J5cHQpIHsKKyAgICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHQob2JqbnVtLCBnZW5udW0sIHN0cik7CisgICAgfQorICAgIHBSZXQgPSBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgVFJVRSk7CisgICAgcmV0dXJuIHBSZXQ7CisgIH0KKyAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIlsiKSkgeworICAgIGlmIChiVHlwZU9ubHkpIHsKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9BUlJBWTsKKyAgICB9CisgICAgQ1BERl9BcnJheSogcEFycmF5ID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSk7CisgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBwQXJyYXk7CisgICAgICB9CisgICAgICBwQXJyYXktPkFkZChwT2JqKTsKKyAgICB9CisgIH0KKyAgaWYgKHdvcmRbMF0gPT0gJy8nKSB7CisgICAgaWYgKGJUeXBlT25seSkgeworICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX05BTUU7CisgICAgfQorICAgIHBSZXQgPSBDUERGX05hbWU6OkNyZWF0ZSgKKyAgICAgICAgUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSkpOworICAgIHJldHVybiBwUmV0OworICB9CisgIGlmICh3b3JkID09IEZYX0JTVFJDKCI8PCIpKSB7CisgICAgaWYgKGJUeXBlT25seSkgeworICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX0RJQ1RJT05BUlk7CisgICAgfQorICAgIGlmIChwQ29udGV4dCkgeworICAgICAgcENvbnRleHQtPm1fRGljdFN0YXJ0ID0gU2F2ZWRQb3M7CisgICAgfQorICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOworICAgIGludDMyX3QgbktleXMgPSAwOworICAgIEZYX0ZJTEVTSVpFIGR3U2lnblZhbHVlUG9zID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgICBDRlhfQnl0ZVN0cmluZyBrZXkgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOworICAgICAgaWYgKGtleS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKHBEaWN0KQorICAgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvcyAtIGtleS5HZXRMZW5ndGgoKTsKKyAgICAgIGlmIChrZXkgPT0gRlhfQlNUUkMoIj4+IikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoa2V5ID09IEZYX0JTVFJDKCJlbmRvYmoiKSkgeworICAgICAgICBtX1BvcyA9IFNhdmVkUG9zOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChrZXlbMF0gIT0gJy8nKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgbktleXMrKzsKKyAgICAgIGtleSA9IFBERl9OYW1lRGVjb2RlKGtleSk7CisgICAgICBpZiAoa2V5ID09IEZYX0JTVFJDKCIvQ29udGVudHMiKSkgeworICAgICAgICBkd1NpZ25WYWx1ZVBvcyA9IG1fUG9zOworICAgICAgfQorICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBHZXRPYmplY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtKTsKKyAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoa2V5LkdldExlbmd0aCgpID49IDEpIHsKKyAgICAgICAgaWYgKG5LZXlzIDwgMzIpIHsKKyAgICAgICAgICBwRGljdC0+U2V0QXQoQ0ZYX0J5dGVTdHJpbmdDKGtleS5jX3N0cigpICsgMSwga2V5LkdldExlbmd0aCgpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgIHBPYmopOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBEaWN0LT5BZGRWYWx1ZShDRlhfQnl0ZVN0cmluZ0Moa2V5LmNfc3RyKCkgKyAxLCBrZXkuR2V0TGVuZ3RoKCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iaik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKElzU2lnbmF0dXJlRGljdChwRGljdCkpIHsKKyAgICAgIEZYX0ZJTEVTSVpFIGR3U2F2ZVBvcyA9IG1fUG9zOworICAgICAgbV9Qb3MgPSBkd1NpZ25WYWx1ZVBvczsKKyAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSwgTlVMTCwgRkFMU0UpOworICAgICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJDb250ZW50cyIpLCBwT2JqKTsKKyAgICAgIG1fUG9zID0gZHdTYXZlUG9zOworICAgIH0KKyAgICBpZiAocENvbnRleHQpIHsKKyAgICAgIHBDb250ZXh0LT5tX0RpY3RFbmQgPSBtX1BvczsKKyAgICAgIGlmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX05PU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBwRGljdDsKKyAgICAgIH0KKyAgICB9CisgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKKyAgICBGWF9CT09MIGJJc051bWJlcjsKKyAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7CisgICAgaWYgKG5leHR3b3JkID09IEZYX0JTVFJDKCJzdHJlYW0iKSkgeworICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBSZWFkU3RyZWFtKHBEaWN0LCBwQ29udGV4dCwgb2JqbnVtLCBnZW5udW0pOworICAgICAgaWYgKHBTdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIHBTdHJlYW07CisgICAgICB9CisgICAgICBpZiAocERpY3QpCisgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgbV9Qb3MgPSBTYXZlZFBvczsKKyAgICAgIHJldHVybiBwRGljdDsKKyAgICB9CisgIH0KKyAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIj4+IikpIHsKKyAgICBtX1BvcyA9IFNhdmVkUG9zOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChiVHlwZU9ubHkpIHsKKyAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfSU5WQUxJRDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KK0NQREZfT2JqZWN0KiBDUERGX1N5bnRheFBhcnNlcjo6R2V0T2JqZWN0QnlTdHJpY3QoCisgICAgQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LAorICAgIEZYX0RXT1JEIG9iam51bSwKKyAgICBGWF9EV09SRCBnZW5udW0sCisgICAgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KSB7CisgIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50UmVjdXJzaW9uRGVwdGgpOworICBpZiAoKytzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA+IGtQYXJzZXJNYXhSZWN1cnNpb25EZXB0aCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7CisgIEZYX0JPT0wgYlR5cGVPbmx5ID0gcENvbnRleHQgJiYgKHBDb250ZXh0LT5tX0ZsYWdzICYgUERGUEFSU0VfVFlQRU9OTFkpOworICBGWF9CT09MIGJJc051bWJlcjsKKyAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7CisgIGlmICh3b3JkLkdldExlbmd0aCgpID09IDApIHsKKyAgICBpZiAoYlR5cGVPbmx5KSB7CisgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfSU5WQUxJRDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGJJc051bWJlcikgeworICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7CisgICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOworICAgIGlmIChiSXNOdW1iZXIpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIG5leHR3b3JkMiA9IEdldE5leHRXb3JkKGJJc051bWJlcik7CisgICAgICBpZiAobmV4dHdvcmQyID09IEZYX0JTVFJDKCJSIikpIHsKKyAgICAgICAgaWYgKGJUeXBlT25seSkgeworICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9SRUZFUkVOQ0U7CisgICAgICAgIH0KKyAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDUERGX1JlZmVyZW5jZShwT2JqTGlzdCwgb2JqbnVtKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9Qb3MgPSBTYXZlZFBvczsKKyAgICBpZiAoYlR5cGVPbmx5KSB7CisgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfTlVNQkVSOworICAgIH0KKyAgICByZXR1cm4gQ1BERl9OdW1iZXI6OkNyZWF0ZSh3b3JkKTsKKyAgfQorICBpZiAod29yZCA9PSBGWF9CU1RSQygidHJ1ZSIpIHx8IHdvcmQgPT0gRlhfQlNUUkMoImZhbHNlIikpIHsKKyAgICBpZiAoYlR5cGVPbmx5KSB7CisgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfQk9PTEVBTjsKKyAgICB9CisgICAgcmV0dXJuIENQREZfQm9vbGVhbjo6Q3JlYXRlKHdvcmQgPT0gRlhfQlNUUkMoInRydWUiKSk7CisgIH0KKyAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIm51bGwiKSkgeworICAgIGlmIChiVHlwZU9ubHkpIHsKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9OVUxMOworICAgIH0KKyAgICByZXR1cm4gQ1BERl9OdWxsOjpDcmVhdGUoKTsKKyAgfQorICBpZiAod29yZCA9PSBGWF9CU1RSQygiKCIpKSB7CisgICAgaWYgKGJUeXBlT25seSkgeworICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX1NUUklORzsKKyAgICB9CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gUmVhZFN0cmluZygpOworICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyKSB7CisgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOworICAgIH0KKyAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIEZBTFNFKTsKKyAgfQorICBpZiAod29yZCA9PSBGWF9CU1RSQygiPCIpKSB7CisgICAgaWYgKGJUeXBlT25seSkgeworICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX1NUUklORzsKKyAgICB9CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gUmVhZEhleFN0cmluZygpOworICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyKSB7CisgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOworICAgIH0KKyAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIFRSVUUpOworICB9CisgIGlmICh3b3JkID09IEZYX0JTVFJDKCJbIikpIHsKKyAgICBpZiAoYlR5cGVPbmx5KSB7CisgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfQVJSQVk7CisgICAgfQorICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOworICAgIHdoaWxlICgxKSB7CisgICAgICBDUERGX09iamVjdCogcE9iaiA9IEdldE9iamVjdChwT2JqTGlzdCwgb2JqbnVtLCBnZW5udW0pOworICAgICAgaWYgKHBPYmogPT0gTlVMTCkgeworICAgICAgICBpZiAobV9Xb3JkQnVmZmVyWzBdID09ICddJykgeworICAgICAgICAgIHJldHVybiBwQXJyYXk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBBcnJheSkgeworICAgICAgICAgIHBBcnJheS0+UmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgcEFycmF5LT5BZGQocE9iaik7CisgICAgfQorICB9CisgIGlmICh3b3JkWzBdID09ICcvJykgeworICAgIGlmIChiVHlwZU9ubHkpIHsKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9OQU1FOworICAgIH0KKyAgICByZXR1cm4gQ1BERl9OYW1lOjpDcmVhdGUoCisgICAgICAgIFBERl9OYW1lRGVjb2RlKENGWF9CeXRlU3RyaW5nQyhtX1dvcmRCdWZmZXIgKyAxLCBtX1dvcmRTaXplIC0gMSkpKTsKKyAgfQorICBpZiAod29yZCA9PSBGWF9CU1RSQygiPDwiKSkgeworICAgIGlmIChiVHlwZU9ubHkpIHsKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9ESUNUSU9OQVJZOworICAgIH0KKyAgICBpZiAocENvbnRleHQpIHsKKyAgICAgIHBDb250ZXh0LT5tX0RpY3RTdGFydCA9IFNhdmVkUG9zOworICAgIH0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7CisgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOworICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5ID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgICAgIGlmIChrZXkuSXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChwRGljdCkgeworICAgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBpZiAoa2V5ID09IEZYX0JTVFJDKCI+PiIpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGtleSA9PSBGWF9CU1RSQygiZW5kb2JqIikpIHsKKyAgICAgICAgbV9Qb3MgPSBTYXZlZFBvczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoa2V5WzBdICE9ICcvJykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGtleSA9IFBERl9OYW1lRGVjb2RlKGtleSk7CisgICAgICBDUERGX09iamVjdCogcE9iaiA9IEdldE9iamVjdChwT2JqTGlzdCwgb2JqbnVtLCBnZW5udW0pOworICAgICAgaWYgKHBPYmogPT0gTlVMTCkgeworICAgICAgICBpZiAocERpY3QpIHsKKyAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgY2g7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgIH0KLSAgICBtX1BvcyAtLTsKLX0KLUNGWF9CeXRlU3RyaW5nIENQREZfU3ludGF4UGFyc2VyOjpHZXROZXh0V29yZChGWF9CT09MJiBiSXNOdW1iZXIpCi17Ci0gICAgR2V0TmV4dFdvcmQoKTsKLSAgICBiSXNOdW1iZXIgPSBtX2JJc051bWJlcjsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKW1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSk7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX1N5bnRheFBhcnNlcjo6R2V0S2V5d29yZCgpCi17Ci0gICAgR2V0TmV4dFdvcmQoKTsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKW1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSk7Ci19Ci1DUERGX09iamVjdCogQ1BERl9TeW50YXhQYXJzZXI6OkdldE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwgRlhfQk9PTCBiRGVjcnlwdCkKLXsKLSAgICBDRlhfQXV0b1Jlc3RvcmVyPGludD4gcmVzdG9yZXIoJnNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoKTsKLSAgICBpZiAoKytzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA+IGtQYXJzZXJNYXhSZWN1cnNpb25EZXB0aCkgewogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmIChrZXkuR2V0TGVuZ3RoKCkgPiAxKSB7CisgICAgICAgIHBEaWN0LT5BZGRWYWx1ZShDRlhfQnl0ZVN0cmluZ0Moa2V5LmNfc3RyKCkgKyAxLCBrZXkuR2V0TGVuZ3RoKCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPYmopOworICAgICAgfQorICAgIH0KKyAgICBpZiAocENvbnRleHQpIHsKKyAgICAgIHBDb250ZXh0LT5tX0RpY3RFbmQgPSBtX1BvczsKKyAgICAgIGlmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX05PU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBwRGljdDsKKyAgICAgIH0KICAgICB9CiAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKLSAgICBGWF9CT09MIGJUeXBlT25seSA9IHBDb250ZXh0ICYmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX1RZUEVPTkxZKTsKICAgICBGWF9CT09MIGJJc051bWJlcjsKLSAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBDUERGX09iamVjdCogcFJldCA9IE5VTEw7Ci0gICAgaWYgKHdvcmQuR2V0TGVuZ3RoKCkgPT0gMCkgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfSU5WQUxJRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7CisgICAgaWYgKG5leHR3b3JkID09IEZYX0JTVFJDKCJzdHJlYW0iKSkgeworICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBSZWFkU3RyZWFtKHBEaWN0LCBwQ29udGV4dCwgb2JqbnVtLCBnZW5udW0pOworICAgICAgaWYgKHBTdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIHBTdHJlYW07CisgICAgICB9CisgICAgICBpZiAocERpY3QpIHsKKyAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBtX1BvcyA9IFNhdmVkUG9zOworICAgICAgcmV0dXJuIHBEaWN0OwogICAgIH0KLSAgICBpZiAoYklzTnVtYmVyKSB7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIG5leHR3b3JkID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgaWYgKGJJc051bWJlcikgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQyID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChuZXh0d29yZDIgPT0gRlhfQlNUUkMoIlIiKSkgewotICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJUeXBlT25seSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfUkVGRVJFTkNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENQREZfUmVmZXJlbmNlKHBPYmpMaXN0LCBvYmpudW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fUG9zID0gU2F2ZWRQb3M7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9OVU1CRVI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENQREZfTnVtYmVyOjpDcmVhdGUod29yZCk7Ci0gICAgfQotICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJ0cnVlIikgfHwgd29yZCA9PSBGWF9CU1RSQygiZmFsc2UiKSkgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfQk9PTEVBTjsKLSAgICAgICAgfQotICAgICAgICBwUmV0ID0gQ1BERl9Cb29sZWFuOjpDcmVhdGUod29yZCA9PSBGWF9CU1RSQygidHJ1ZSIpKTsKLSAgICAgICAgcmV0dXJuIHBSZXQ7Ci0gICAgfQotICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJudWxsIikpIHsKLSAgICAgICAgaWYgKGJUeXBlT25seSkgewotICAgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcFJldCA9IENQREZfTnVsbDo6Q3JlYXRlKCk7Ci0gICAgICAgIHJldHVybiBwUmV0OwotICAgIH0KLSAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiKCIpKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9TVFJJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gUmVhZFN0cmluZygpOwotICAgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlciAmJiBiRGVjcnlwdCkgewotICAgICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdChvYmpudW0sIGdlbm51bSwgc3RyKTsKLSAgICAgICAgfQotICAgICAgICBwUmV0ID0gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIEZBTFNFKTsKLSAgICAgICAgcmV0dXJuIHBSZXQ7Ci0gICAgfQotICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCI8IikpIHsKLSAgICAgICAgaWYgKGJUeXBlT25seSkgewotICAgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX1NUUklORzsKLSAgICAgICAgfQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBSZWFkSGV4U3RyaW5nKCk7Ci0gICAgICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyICYmIGJEZWNyeXB0KSB7Ci0gICAgICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOwotICAgICAgICB9Ci0gICAgICAgIHBSZXQgPSBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgVFJVRSk7Ci0gICAgICAgIHJldHVybiBwUmV0OwotICAgIH0KLSAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiWyIpKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9BUlJBWTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSk7Ci0gICAgICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBBcnJheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBcnJheS0+QWRkKHBPYmopOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh3b3JkWzBdID09ICcvJykgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfTkFNRTsKLSAgICAgICAgfQotICAgICAgICBwUmV0ID0gQ1BERl9OYW1lOjpDcmVhdGUoUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSkpOwotICAgICAgICByZXR1cm4gcFJldDsKLSAgICB9Ci0gICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIjw8IikpIHsKLSAgICAgICAgaWYgKGJUeXBlT25seSkgewotICAgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX0RJQ1RJT05BUlk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDb250ZXh0KSB7Ci0gICAgICAgICAgICBwQ29udGV4dC0+bV9EaWN0U3RhcnQgPSBTYXZlZFBvczsKLSAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKLSAgICAgICAgaW50MzJfdCBuS2V5cyA9IDA7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIGR3U2lnblZhbHVlUG9zID0gMDsKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOwotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5ID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChrZXkuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBEaWN0KQotICAgICAgICAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvcyAtIGtleS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gRlhfQlNUUkMoIj4+IikpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChrZXkgPT0gRlhfQlNUUkMoImVuZG9iaiIpKSB7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgPSBTYXZlZFBvczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChrZXlbMF0gIT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuS2V5cyArKzsKLSAgICAgICAgICAgIGtleSA9IFBERl9OYW1lRGVjb2RlKGtleSk7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IEZYX0JTVFJDKCIvQ29udGVudHMiKSkgewotICAgICAgICAgICAgICAgIGR3U2lnblZhbHVlUG9zID0gbV9Qb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IEdldE9iamVjdChwT2JqTGlzdCwgb2JqbnVtLCBnZW5udW0pOwotICAgICAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtleS5HZXRMZW5ndGgoKSA+PSAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5LZXlzIDwgMzIpIHsKLSAgICAgICAgICAgICAgICAgICAgcERpY3QtPlNldEF0KENGWF9CeXRlU3RyaW5nQyhrZXkuY19zdHIoKSArIDEsIGtleS5HZXRMZW5ndGgoKSAtIDEpLCBwT2JqKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRGljdC0+QWRkVmFsdWUoQ0ZYX0J5dGVTdHJpbmdDKGtleS5jX3N0cigpICsgMSwga2V5LkdldExlbmd0aCgpIC0gMSksIHBPYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoSXNTaWduYXR1cmVEaWN0KHBEaWN0KSkgewotICAgICAgICAgICAgRlhfRklMRVNJWkUgZHdTYXZlUG9zID0gbV9Qb3M7Ci0gICAgICAgICAgICBtX1BvcyA9IGR3U2lnblZhbHVlUG9zOwotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBHZXRPYmplY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtLCBOVUxMLCBGQUxTRSk7Ci0gICAgICAgICAgICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkNvbnRlbnRzIiksIHBPYmopOwotICAgICAgICAgICAgbV9Qb3MgPSBkd1NhdmVQb3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDb250ZXh0KSB7Ci0gICAgICAgICAgICBwQ29udGV4dC0+bV9EaWN0RW5kID0gbV9Qb3M7Ci0gICAgICAgICAgICBpZiAocENvbnRleHQtPm1fRmxhZ3MgJiBQREZQQVJTRV9OT1NUUkVBTSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwRGljdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOwotICAgICAgICBGWF9CT09MIGJJc051bWJlcjsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgICAgICBpZiAobmV4dHdvcmQgPT0gRlhfQlNUUkMoInN0cmVhbSIpKSB7Ci0gICAgICAgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IFJlYWRTdHJlYW0ocERpY3QsIHBDb250ZXh0LCBvYmpudW0sIGdlbm51bSk7Ci0gICAgICAgICAgICBpZiAocFN0cmVhbSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwU3RyZWFtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBEaWN0KQotICAgICAgICAgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fUG9zID0gU2F2ZWRQb3M7Ci0gICAgICAgICAgICByZXR1cm4gcERpY3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIj4+IikpIHsKLSAgICAgICAgbV9Qb3MgPSBTYXZlZFBvczsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX0lOVkFMSUQ7Ci0gICAgfQorICB9CisgIGlmICh3b3JkID09IEZYX0JTVFJDKCI+PiIpKSB7CisgICAgbV9Qb3MgPSBTYXZlZFBvczsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoYlR5cGVPbmx5KSB7CisgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX0lOVkFMSUQ7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci1DUERGX09iamVjdCogQ1BERl9TeW50YXhQYXJzZXI6OkdldE9iamVjdEJ5U3RyaWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCkKLXsKLSAgICBDRlhfQXV0b1Jlc3RvcmVyPGludD4gcmVzdG9yZXIoJnNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoKTsKLSAgICBpZiAoKytzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA+IGtQYXJzZXJNYXhSZWN1cnNpb25EZXB0aCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKLSAgICBGWF9CT09MIGJUeXBlT25seSA9IHBDb250ZXh0ICYmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX1RZUEVPTkxZKTsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKLSAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9JTlZBTElEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoYklzTnVtYmVyKSB7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIG5leHR3b3JkID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgaWYgKGJJc051bWJlcikgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQyID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChuZXh0d29yZDIgPT0gRlhfQlNUUkMoIlIiKSkgewotICAgICAgICAgICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX1JFRkVSRU5DRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENQREZfUmVmZXJlbmNlKHBPYmpMaXN0LCBvYmpudW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fUG9zID0gU2F2ZWRQb3M7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9OVU1CRVI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENQREZfTnVtYmVyOjpDcmVhdGUod29yZCk7Ci0gICAgfQotICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJ0cnVlIikgfHwgd29yZCA9PSBGWF9CU1RSQygiZmFsc2UiKSkgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfQk9PTEVBTjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ1BERl9Cb29sZWFuOjpDcmVhdGUod29yZCA9PSBGWF9CU1RSQygidHJ1ZSIpKTsKLSAgICB9Ci0gICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIm51bGwiKSkgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ1BERl9OdWxsOjpDcmVhdGUoKTsKLSAgICB9Ci0gICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIigiKSkgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfU1RSSU5HOwotICAgICAgICB9Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IFJlYWRTdHJpbmcoKTsKLSAgICAgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIpIHsKLSAgICAgICAgICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHQob2JqbnVtLCBnZW5udW0sIHN0cik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoc3RyLCBGQUxTRSk7Ci0gICAgfQotICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCI8IikpIHsKLSAgICAgICAgaWYgKGJUeXBlT25seSkgewotICAgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX1NUUklORzsKLSAgICAgICAgfQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBSZWFkSGV4U3RyaW5nKCk7Ci0gICAgICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyKSB7Ci0gICAgICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKHN0ciwgVFJVRSk7Ci0gICAgfQotICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJbIikpIHsKLSAgICAgICAgaWYgKGJUeXBlT25seSkgewotICAgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX0FSUkFZOwotICAgICAgICB9Ci0gICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBHZXRPYmplY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtKTsKLSAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9Xb3JkQnVmZmVyWzBdID09ICddJykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEFycmF5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBBcnJheS0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBcnJheS0+QWRkKHBPYmopOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh3b3JkWzBdID09ICcvJykgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfTkFNRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ1BERl9OYW1lOjpDcmVhdGUoUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSkpOwotICAgIH0KLSAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiPDwiKSkgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfRElDVElPTkFSWTsKLSAgICAgICAgfQotICAgICAgICBpZiAocENvbnRleHQpIHsKLSAgICAgICAgICAgIHBDb250ZXh0LT5tX0RpY3RTdGFydCA9IFNhdmVkUG9zOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOwotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5ID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChrZXkuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBEaWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtleSA9PSBGWF9CU1RSQygiPj4iKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtleSA9PSBGWF9CU1RSQygiZW5kb2JqIikpIHsKLSAgICAgICAgICAgICAgICBtX1BvcyA9IFNhdmVkUG9zOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtleVswXSAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGtleSA9IFBERl9OYW1lRGVjb2RlKGtleSk7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IEdldE9iamVjdChwT2JqTGlzdCwgb2JqbnVtLCBnZW5udW0pOwotICAgICAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChwRGljdCkgewotICAgICAgICAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50OF90IGNoOwotICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChrZXkuR2V0TGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgcERpY3QtPkFkZFZhbHVlKENGWF9CeXRlU3RyaW5nQyhrZXkuY19zdHIoKSArIDEsIGtleS5HZXRMZW5ndGgoKSAtIDEpLCBwT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocENvbnRleHQpIHsKLSAgICAgICAgICAgIHBDb250ZXh0LT5tX0RpY3RFbmQgPSBtX1BvczsKLSAgICAgICAgICAgIGlmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX05PU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBEaWN0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgICAgIGlmIChuZXh0d29yZCA9PSBGWF9CU1RSQygic3RyZWFtIikpIHsKLSAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gUmVhZFN0cmVhbShwRGljdCwgcENvbnRleHQsIG9iam51bSwgZ2VubnVtKTsKLSAgICAgICAgICAgIGlmIChwU3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBTdHJlYW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocERpY3QpIHsKLSAgICAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1BvcyA9IFNhdmVkUG9zOwotICAgICAgICAgICAgcmV0dXJuIHBEaWN0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCI+PiIpKSB7Ci0gICAgICAgIG1fUG9zID0gU2F2ZWRQb3M7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9JTlZBTElEOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLUNQREZfU3RyZWFtKiBDUERGX1N5bnRheFBhcnNlcjo6UmVhZFN0cmVhbShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwKLSAgICAgICAgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pCi17Ci0gICAgQ1BERl9PYmplY3QqIHBMZW5PYmogPSBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiTGVuZ3RoIikpOwotICAgIEZYX0ZJTEVTSVpFIGxlbiA9IDA7Ci0gICAgaWYgKHBMZW5PYmogJiYgKChwTGVuT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCgoKENQREZfUmVmZXJlbmNlKilwTGVuT2JqKS0+R2V0T2JqTGlzdCgpICE9IE5VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgICAoKENQREZfUmVmZXJlbmNlKilwTGVuT2JqKS0+R2V0UmVmT2JqTnVtKCkgIT0gb2JqbnVtKSkpIHsKLSAgICAgICAgbGVuID0gcExlbk9iai0+R2V0SW50ZWdlcigpOwotICAgIH0KK0NQREZfU3RyZWFtKiBDUERGX1N5bnRheFBhcnNlcjo6UmVhZFN0cmVhbShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnZW5udW0pIHsKKyAgQ1BERl9PYmplY3QqIHBMZW5PYmogPSBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiTGVuZ3RoIikpOworICBGWF9GSUxFU0laRSBsZW4gPSAwOworICBpZiAocExlbk9iaiAmJiAoKHBMZW5PYmotPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB8fAorICAgICAgICAgICAgICAgICAgKCgoKENQREZfUmVmZXJlbmNlKilwTGVuT2JqKS0+R2V0T2JqTGlzdCgpICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgICAgKChDUERGX1JlZmVyZW5jZSopcExlbk9iaiktPkdldFJlZk9iak51bSgpICE9IG9iam51bSkpKSB7CisgICAgbGVuID0gcExlbk9iai0+R2V0SW50ZWdlcigpOworICB9CiAKLSAgICBUb05leHRMaW5lKCk7Ci0gICAgRlhfRklMRVNJWkUgU3RyZWFtU3RhcnRQb3MgPSBtX1BvczsKLSAgICBpZiAocENvbnRleHQpIHsKLSAgICAgICAgcENvbnRleHQtPm1fRGF0YVN0YXJ0ID0gbV9Qb3M7Ci0gICAgfQorICBUb05leHRMaW5lKCk7CisgIEZYX0ZJTEVTSVpFIFN0cmVhbVN0YXJ0UG9zID0gbV9Qb3M7CisgIGlmIChwQ29udGV4dCkgeworICAgIHBDb250ZXh0LT5tX0RhdGFTdGFydCA9IG1fUG9zOworICB9CiAKLSAgICBDUERGX0NyeXB0b0hhbmRsZXIqIHBDcnlwdG9IYW5kbGVyID0gb2JqbnVtID09IChGWF9EV09SRCltX01ldGFkYXRhT2JqbnVtID8gTlVMTCA6IG1fcENyeXB0b0hhbmRsZXI7Ci0gICAgaWYgKHBDcnlwdG9IYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9GSUxFU0laRT4gcG9zID0gbV9Qb3M7Ci0gICAgICAgIHBvcyArPSBsZW47Ci0gICAgICAgIGlmIChwb3MuSXNWYWxpZCgpICYmIHBvcy5WYWx1ZU9yRGllKCkgPCBtX0ZpbGVMZW4pIHsKLSAgICAgICAgICAgIG1fUG9zID0gcG9zLlZhbHVlT3JEaWUoKTsKLSAgICAgICAgfQotICAgICAgICBHZXROZXh0V29yZCgpOwotICAgICAgICBpZiAobV9Xb3JkU2l6ZSA8IDkgfHwgRlhTWVNfbWVtY21wKG1fV29yZEJ1ZmZlciwgImVuZHN0cmVhbSIsIDkpKSB7Ci0gICAgICAgICAgICBtX1BvcyA9IFN0cmVhbVN0YXJ0UG9zOwotICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gRmluZFRhZyhGWF9CU1RSQygiZW5kc3RyZWFtIiksIDApOwotICAgICAgICAgICAgaWYgKG9mZnNldCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgY3VyUG9zID0gbV9Qb3M7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgPSBTdHJlYW1TdGFydFBvczsKLSAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBlbmRvYmpPZmZzZXQgPSBGaW5kVGFnKEZYX0JTVFJDKCJlbmRvYmoiKSwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZG9iak9mZnNldCA8IG9mZnNldCAmJiBlbmRvYmpPZmZzZXQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBlbmRvYmpPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Qb3MgPSBjdXJQb3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnl0ZTEsIGJ5dGUyOwotICAgICAgICAgICAgICAgIEdldENoYXJBdChTdHJlYW1TdGFydFBvcyArIG9mZnNldCAtIDEsIGJ5dGUxKTsKLSAgICAgICAgICAgICAgICBHZXRDaGFyQXQoU3RyZWFtU3RhcnRQb3MgKyBvZmZzZXQgLSAyLCBieXRlMik7Ci0gICAgICAgICAgICAgICAgaWYgKGJ5dGUxID09IDB4MGEgJiYgYnl0ZTIgPT0gMHgwZCkgewotICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUxID09IDB4MGEgfHwgYnl0ZTEgPT0gMHgwZCkgewotICAgICAgICAgICAgICAgICAgICBsZW4gLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxlbiA9IChGWF9EV09SRClvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIGxlbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fUG9zID0gU3RyZWFtU3RhcnRQb3M7Ci0gICAgICAgICAgICAgICAgaWYgKEZpbmRUYWcoRlhfQlNUUkMoImVuZG9iaiIpLCAwKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fUG9zID0gU3RyZWFtU3RhcnRQb3M7CisgIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0b0hhbmRsZXIgPQorICAgICAgb2JqbnVtID09IChGWF9EV09SRCltX01ldGFkYXRhT2JqbnVtID8gTlVMTCA6IG1fcENyeXB0b0hhbmRsZXI7CisgIGlmIChwQ3J5cHRvSGFuZGxlciA9PSBOVUxMKSB7CisgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9GSUxFU0laRT4gcG9zID0gbV9Qb3M7CisgICAgcG9zICs9IGxlbjsKKyAgICBpZiAocG9zLklzVmFsaWQoKSAmJiBwb3MuVmFsdWVPckRpZSgpIDwgbV9GaWxlTGVuKSB7CisgICAgICBtX1BvcyA9IHBvcy5WYWx1ZU9yRGllKCk7CiAgICAgfQotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtOwotICAgIHVpbnQ4X3QqIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgbGVuKTsKLSAgICBSZWFkQmxvY2socERhdGEsIGxlbik7Ci0gICAgaWYgKHBDcnlwdG9IYW5kbGVyKSB7Ci0gICAgICAgIENGWF9CaW5hcnlCdWYgZGVzdF9idWY7Ci0gICAgICAgIGRlc3RfYnVmLkVzdGltYXRlU2l6ZShwQ3J5cHRvSGFuZGxlci0+RGVjcnlwdEdldFNpemUobGVuKSk7Ci0gICAgICAgIHZvaWQqIGNvbnRleHQgPSBwQ3J5cHRvSGFuZGxlci0+RGVjcnlwdFN0YXJ0KG9iam51bSwgZ2VubnVtKTsKLSAgICAgICAgcENyeXB0b0hhbmRsZXItPkRlY3J5cHRTdHJlYW0oY29udGV4dCwgcERhdGEsIGxlbiwgZGVzdF9idWYpOwotICAgICAgICBwQ3J5cHRvSGFuZGxlci0+RGVjcnlwdEZpbmlzaChjb250ZXh0LCBkZXN0X2J1Zik7Ci0gICAgICAgIEZYX0ZyZWUocERhdGEpOwotICAgICAgICBwRGF0YSA9IGRlc3RfYnVmLkdldEJ1ZmZlcigpOwotICAgICAgICBsZW4gPSBkZXN0X2J1Zi5HZXRTaXplKCk7Ci0gICAgICAgIGRlc3RfYnVmLkRldGFjaEJ1ZmZlcigpOwotICAgIH0KLSAgICBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKHBEYXRhLCBsZW4sIHBEaWN0KTsKLSAgICBpZiAocENvbnRleHQpIHsKLSAgICAgICAgcENvbnRleHQtPm1fRGF0YUVuZCA9IHBDb250ZXh0LT5tX0RhdGFTdGFydCArIGxlbjsKLSAgICB9Ci0gICAgU3RyZWFtU3RhcnRQb3MgPSBtX1BvczsKICAgICBHZXROZXh0V29yZCgpOwotICAgIGlmIChtX1dvcmRTaXplID09IDYgJiYgMCA9PSBGWFNZU19tZW1jbXAobV9Xb3JkQnVmZmVyLCAiZW5kb2JqIiwgNikpIHsKKyAgICBpZiAobV9Xb3JkU2l6ZSA8IDkgfHwgRlhTWVNfbWVtY21wKG1fV29yZEJ1ZmZlciwgImVuZHN0cmVhbSIsIDkpKSB7CisgICAgICBtX1BvcyA9IFN0cmVhbVN0YXJ0UG9zOworICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gRmluZFRhZyhGWF9CU1RSQygiZW5kc3RyZWFtIiksIDApOworICAgICAgaWYgKG9mZnNldCA+PSAwKSB7CisgICAgICAgIEZYX0ZJTEVTSVpFIGN1clBvcyA9IG1fUG9zOwogICAgICAgICBtX1BvcyA9IFN0cmVhbVN0YXJ0UG9zOwotICAgIH0KLSAgICByZXR1cm4gcFN0cmVhbTsKLX0KLXZvaWQgQ1BERl9TeW50YXhQYXJzZXI6OkluaXRQYXJzZXIoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfRFdPUkQgSGVhZGVyT2Zmc2V0KQotewotICAgIGlmIChtX3BGaWxlQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRmlsZUJ1Zik7Ci0gICAgICAgIG1fcEZpbGVCdWYgPSBOVUxMOwotICAgIH0KLSAgICBtX3BGaWxlQnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9CdWZTaXplKTsKLSAgICBtX0hlYWRlck9mZnNldCA9IEhlYWRlck9mZnNldDsKLSAgICBtX0ZpbGVMZW4gPSBwRmlsZUFjY2Vzcy0+R2V0U2l6ZSgpOwotICAgIG1fUG9zID0gMDsKLSAgICBtX3BGaWxlQWNjZXNzID0gcEZpbGVBY2Nlc3M7Ci0gICAgbV9CdWZPZmZzZXQgPSAwOwotICAgIHBGaWxlQWNjZXNzLT5SZWFkQmxvY2sobV9wRmlsZUJ1ZiwgMCwgKHNpemVfdCkoKEZYX0ZJTEVTSVpFKW1fQnVmU2l6ZSA+IG1fRmlsZUxlbiA/IG1fRmlsZUxlbiA6IG1fQnVmU2l6ZSkpOwotfQotaW50MzJfdCBDUERGX1N5bnRheFBhcnNlcjo6R2V0RGlyZWN0TnVtKCkKLXsKLSAgICBHZXROZXh0V29yZCgpOwotICAgIGlmICghbV9iSXNOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplXSA9IDA7Ci0gICAgcmV0dXJuIEZYU1lTX2F0b2koKGNvbnN0IEZYX0NIQVIqKW1fV29yZEJ1ZmZlcik7Ci19Ci1GWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpJc1dob2xlV29yZChGWF9GSUxFU0laRSBzdGFydHBvcywgRlhfRklMRVNJWkUgbGltaXQsIGNvbnN0IHVpbnQ4X3QqIHRhZywgRlhfRFdPUkQgdGFnbGVuKQotewotICAgIHVpbnQ4X3QgdHlwZSA9IFBERl9DaGFyVHlwZVt0YWdbMF1dOwotICAgIEZYX0JPT0wgYkNoZWNrTGVmdCA9IHR5cGUgIT0gJ0QnICYmIHR5cGUgIT0gJ1cnOwotICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbdGFnW3RhZ2xlbiAtIDFdXTsKLSAgICBGWF9CT09MIGJDaGVja1JpZ2h0ID0gdHlwZSAhPSAnRCcgJiYgdHlwZSAhPSAnVyc7Ci0gICAgdWludDhfdCBjaDsKLSAgICBpZiAoYkNoZWNrUmlnaHQgJiYgc3RhcnRwb3MgKyAoaW50MzJfdCl0YWdsZW4gPD0gbGltaXQgJiYgR2V0Q2hhckF0KHN0YXJ0cG9zICsgKGludDMyX3QpdGFnbGVuLCBjaCkpIHsKLSAgICAgICAgdWludDhfdCB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgaWYgKHR5cGUgPT0gJ04nIHx8IHR5cGUgPT0gJ1InKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGJDaGVja0xlZnQgJiYgc3RhcnRwb3MgPiAwICYmIEdldENoYXJBdChzdGFydHBvcyAtIDEsIGNoKSkgewotICAgICAgICB1aW50OF90IHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgICAgICBpZiAodHlwZSA9PSAnTicgfHwgdHlwZSA9PSAnUicpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OlNlYXJjaFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsIEZYX0JPT0wgYldob2xlV29yZCwgRlhfQk9PTCBiRm9yd2FyZCwgRlhfRklMRVNJWkUgbGltaXQpCi17Ci0gICAgaW50MzJfdCB0YWdsZW4gPSB0YWcuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKHRhZ2xlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3M7Ci0gICAgaW50MzJfdCBvZmZzZXQgPSAwOwotICAgIGlmICghYkZvcndhcmQpIHsKLSAgICAgICAgb2Zmc2V0ID0gdGFnbGVuIC0gMTsKLSAgICB9Ci0gICAgY29uc3QgdWludDhfdCogdGFnX2RhdGEgPSB0YWcuR2V0UHRyKCk7Ci0gICAgdWludDhfdCBieXRlOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChiRm9yd2FyZCkgewotICAgICAgICAgICAgaWYgKGxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBtX1BvcyArIGxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIUdldENoYXJBdChwb3MsIGJ5dGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQorICAgICAgICBGWF9GSUxFU0laRSBlbmRvYmpPZmZzZXQgPSBGaW5kVGFnKEZYX0JTVFJDKCJlbmRvYmoiKSwgMCk7CisgICAgICAgIGlmIChlbmRvYmpPZmZzZXQgPCBvZmZzZXQgJiYgZW5kb2JqT2Zmc2V0ID49IDApIHsKKyAgICAgICAgICBvZmZzZXQgPSBlbmRvYmpPZmZzZXQ7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobGltaXQpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zIDw9IG1fUG9zIC0gbGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghR2V0Q2hhckF0QmFja3dhcmQocG9zLCBieXRlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICBtX1BvcyA9IGN1clBvczsKICAgICAgICAgfQotICAgICAgICBpZiAoYnl0ZSA9PSB0YWdfZGF0YVtvZmZzZXRdKSB7Ci0gICAgICAgICAgICBpZiAoYkZvcndhcmQpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKys7Ci0gICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IHRhZ2xlbikgewotICAgICAgICAgICAgICAgICAgICBwb3MgKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0IC0tOwotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBwb3MgLS07Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHN0YXJ0cG9zID0gYkZvcndhcmQgPyBwb3MgLSB0YWdsZW4gKyAxIDogcG9zOwotICAgICAgICAgICAgaWYgKCFiV2hvbGVXb3JkIHx8IElzV2hvbGVXb3JkKHN0YXJ0cG9zLCBsaW1pdCwgdGFnLkdldFB0cigpLCB0YWdsZW4pKSB7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgPSBzdGFydHBvczsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBieXRlMSwgYnl0ZTI7CisgICAgICAgIEdldENoYXJBdChTdHJlYW1TdGFydFBvcyArIG9mZnNldCAtIDEsIGJ5dGUxKTsKKyAgICAgICAgR2V0Q2hhckF0KFN0cmVhbVN0YXJ0UG9zICsgb2Zmc2V0IC0gMiwgYnl0ZTIpOworICAgICAgICBpZiAoYnl0ZTEgPT0gMHgwYSAmJiBieXRlMiA9PSAweDBkKSB7CisgICAgICAgICAgbGVuIC09IDI7CisgICAgICAgIH0gZWxzZSBpZiAoYnl0ZTEgPT0gMHgwYSB8fCBieXRlMSA9PSAweDBkKSB7CisgICAgICAgICAgbGVuLS07CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJGb3J3YXJkKSB7Ci0gICAgICAgICAgICBvZmZzZXQgPSBieXRlID09IHRhZ19kYXRhWzBdID8gMSA6IDA7Ci0gICAgICAgICAgICBwb3MgKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvZmZzZXQgPSBieXRlID09IHRhZ19kYXRhW3RhZ2xlbiAtIDFdID8gdGFnbGVuIC0gMiA6IHRhZ2xlbiAtIDE7Ci0gICAgICAgICAgICBwb3MgLS07CisgICAgICAgIGxlbiA9IChGWF9EV09SRClvZmZzZXQ7CisgICAgICAgIHBEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBsZW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9Qb3MgPSBTdHJlYW1TdGFydFBvczsKKyAgICAgICAgaWYgKEZpbmRUYWcoRlhfQlNUUkMoImVuZG9iaiIpLCAwKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBpZiAocG9zIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CisgICAgICB9CiAgICAgfQorICAgIG1fUG9zID0gU3RyZWFtU3RhcnRQb3M7CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW07CisgIHVpbnQ4X3QqIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgbGVuKTsKKyAgUmVhZEJsb2NrKHBEYXRhLCBsZW4pOworICBpZiAocENyeXB0b0hhbmRsZXIpIHsKKyAgICBDRlhfQmluYXJ5QnVmIGRlc3RfYnVmOworICAgIGRlc3RfYnVmLkVzdGltYXRlU2l6ZShwQ3J5cHRvSGFuZGxlci0+RGVjcnlwdEdldFNpemUobGVuKSk7CisgICAgdm9pZCogY29udGV4dCA9IHBDcnlwdG9IYW5kbGVyLT5EZWNyeXB0U3RhcnQob2JqbnVtLCBnZW5udW0pOworICAgIHBDcnlwdG9IYW5kbGVyLT5EZWNyeXB0U3RyZWFtKGNvbnRleHQsIHBEYXRhLCBsZW4sIGRlc3RfYnVmKTsKKyAgICBwQ3J5cHRvSGFuZGxlci0+RGVjcnlwdEZpbmlzaChjb250ZXh0LCBkZXN0X2J1Zik7CisgICAgRlhfRnJlZShwRGF0YSk7CisgICAgcERhdGEgPSBkZXN0X2J1Zi5HZXRCdWZmZXIoKTsKKyAgICBsZW4gPSBkZXN0X2J1Zi5HZXRTaXplKCk7CisgICAgZGVzdF9idWYuRGV0YWNoQnVmZmVyKCk7CisgIH0KKyAgcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShwRGF0YSwgbGVuLCBwRGljdCk7CisgIGlmIChwQ29udGV4dCkgeworICAgIHBDb250ZXh0LT5tX0RhdGFFbmQgPSBwQ29udGV4dC0+bV9EYXRhU3RhcnQgKyBsZW47CisgIH0KKyAgU3RyZWFtU3RhcnRQb3MgPSBtX1BvczsKKyAgR2V0TmV4dFdvcmQoKTsKKyAgaWYgKG1fV29yZFNpemUgPT0gNiAmJiAwID09IEZYU1lTX21lbWNtcChtX1dvcmRCdWZmZXIsICJlbmRvYmoiLCA2KSkgeworICAgIG1fUG9zID0gU3RyZWFtU3RhcnRQb3M7CisgIH0KKyAgcmV0dXJuIHBTdHJlYW07Cit9Cit2b2lkIENQREZfU3ludGF4UGFyc2VyOjpJbml0UGFyc2VyKElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEhlYWRlck9mZnNldCkgeworICBpZiAobV9wRmlsZUJ1ZikgeworICAgIEZYX0ZyZWUobV9wRmlsZUJ1Zik7CisgICAgbV9wRmlsZUJ1ZiA9IE5VTEw7CisgIH0KKyAgbV9wRmlsZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fQnVmU2l6ZSk7CisgIG1fSGVhZGVyT2Zmc2V0ID0gSGVhZGVyT2Zmc2V0OworICBtX0ZpbGVMZW4gPSBwRmlsZUFjY2Vzcy0+R2V0U2l6ZSgpOworICBtX1BvcyA9IDA7CisgIG1fcEZpbGVBY2Nlc3MgPSBwRmlsZUFjY2VzczsKKyAgbV9CdWZPZmZzZXQgPSAwOworICBwRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKAorICAgICAgbV9wRmlsZUJ1ZiwgMCwKKyAgICAgIChzaXplX3QpKChGWF9GSUxFU0laRSltX0J1ZlNpemUgPiBtX0ZpbGVMZW4gPyBtX0ZpbGVMZW4gOiBtX0J1ZlNpemUpKTsKK30KK2ludDMyX3QgQ1BERl9TeW50YXhQYXJzZXI6OkdldERpcmVjdE51bSgpIHsKKyAgR2V0TmV4dFdvcmQoKTsKKyAgaWYgKCFtX2JJc051bWJlcikgeworICAgIHJldHVybiAwOworICB9CisgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplXSA9IDA7CisgIHJldHVybiBGWFNZU19hdG9pKChjb25zdCBGWF9DSEFSKiltX1dvcmRCdWZmZXIpOworfQorRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6SXNXaG9sZVdvcmQoRlhfRklMRVNJWkUgc3RhcnRwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRhZ2xlbikgeworICB1aW50OF90IHR5cGUgPSBQREZfQ2hhclR5cGVbdGFnWzBdXTsKKyAgRlhfQk9PTCBiQ2hlY2tMZWZ0ID0gdHlwZSAhPSAnRCcgJiYgdHlwZSAhPSAnVyc7CisgIHR5cGUgPSBQREZfQ2hhclR5cGVbdGFnW3RhZ2xlbiAtIDFdXTsKKyAgRlhfQk9PTCBiQ2hlY2tSaWdodCA9IHR5cGUgIT0gJ0QnICYmIHR5cGUgIT0gJ1cnOworICB1aW50OF90IGNoOworICBpZiAoYkNoZWNrUmlnaHQgJiYgc3RhcnRwb3MgKyAoaW50MzJfdCl0YWdsZW4gPD0gbGltaXQgJiYKKyAgICAgIEdldENoYXJBdChzdGFydHBvcyArIChpbnQzMl90KXRhZ2xlbiwgY2gpKSB7CisgICAgdWludDhfdCB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgICBpZiAodHlwZSA9PSAnTicgfHwgdHlwZSA9PSAnUicpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgaWYgKGJDaGVja0xlZnQgJiYgc3RhcnRwb3MgPiAwICYmIEdldENoYXJBdChzdGFydHBvcyAtIDEsIGNoKSkgeworICAgIHVpbnQ4X3QgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgICAgaWYgKHR5cGUgPT0gJ04nIHx8IHR5cGUgPT0gJ1InKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6U2VhcmNoV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2hvbGVXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb3J3YXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBsaW1pdCkgeworICBpbnQzMl90IHRhZ2xlbiA9IHRhZy5HZXRMZW5ndGgoKTsKKyAgaWYgKHRhZ2xlbiA9PSAwKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fUG9zOworICBpbnQzMl90IG9mZnNldCA9IDA7CisgIGlmICghYkZvcndhcmQpIHsKKyAgICBvZmZzZXQgPSB0YWdsZW4gLSAxOworICB9CisgIGNvbnN0IHVpbnQ4X3QqIHRhZ19kYXRhID0gdGFnLkdldFB0cigpOworICB1aW50OF90IGJ5dGU7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKGJGb3J3YXJkKSB7CisgICAgICBpZiAobGltaXQpIHsKKyAgICAgICAgaWYgKHBvcyA+PSBtX1BvcyArIGxpbWl0KSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIUdldENoYXJBdChwb3MsIGJ5dGUpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGxpbWl0KSB7CisgICAgICAgIGlmIChwb3MgPD0gbV9Qb3MgLSBsaW1pdCkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFHZXRDaGFyQXRCYWNrd2FyZChwb3MsIGJ5dGUpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ5dGUgPT0gdGFnX2RhdGFbb2Zmc2V0XSkgeworICAgICAgaWYgKGJGb3J3YXJkKSB7CisgICAgICAgIG9mZnNldCsrOworICAgICAgICBpZiAob2Zmc2V0IDwgdGFnbGVuKSB7CisgICAgICAgICAgcG9zKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9mZnNldC0tOworICAgICAgICBpZiAob2Zmc2V0ID49IDApIHsKKyAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgRlhfRklMRVNJWkUgc3RhcnRwb3MgPSBiRm9yd2FyZCA/IHBvcyAtIHRhZ2xlbiArIDEgOiBwb3M7CisgICAgICBpZiAoIWJXaG9sZVdvcmQgfHwgSXNXaG9sZVdvcmQoc3RhcnRwb3MsIGxpbWl0LCB0YWcuR2V0UHRyKCksIHRhZ2xlbikpIHsKKyAgICAgICAgbV9Qb3MgPSBzdGFydHBvczsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGlmIChiRm9yd2FyZCkgeworICAgICAgb2Zmc2V0ID0gYnl0ZSA9PSB0YWdfZGF0YVswXSA/IDEgOiAwOworICAgICAgcG9zKys7CisgICAgfSBlbHNlIHsKKyAgICAgIG9mZnNldCA9IGJ5dGUgPT0gdGFnX2RhdGFbdGFnbGVuIC0gMV0gPyB0YWdsZW4gLSAyIDogdGFnbGVuIC0gMTsKKyAgICAgIHBvcy0tOworICAgIH0KKyAgICBpZiAocG9zIDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiBzdHJ1Y3QgX1NlYXJjaFRhZ1JlY29yZCB7Ci0gICAgY29uc3QgdWludDhfdCoJbV9wVGFnOwotICAgIEZYX0RXT1JECW1fTGVuOwotICAgIEZYX0RXT1JECW1fT2Zmc2V0OworICBjb25zdCB1aW50OF90KiBtX3BUYWc7CisgIEZYX0RXT1JEIG1fTGVuOworICBGWF9EV09SRCBtX09mZnNldDsKIH07Ci1pbnQzMl90IENQREZfU3ludGF4UGFyc2VyOjpTZWFyY2hNdWx0aVdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWdzLCBGWF9CT09MIGJXaG9sZVdvcmQsIEZYX0ZJTEVTSVpFIGxpbWl0KQotewotICAgIGludDMyX3QgbnRhZ3MgPSAxLCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCB0YWdzLkdldExlbmd0aCgpOyBpICsrKQotICAgICAgICBpZiAodGFnc1tpXSA9PSAwKSB7Ci0gICAgICAgICAgICBudGFncyArKzsKLSAgICAgICAgfQotICAgIF9TZWFyY2hUYWdSZWNvcmQqIHBQYXR0ZXJucyA9IEZYX0FsbG9jKF9TZWFyY2hUYWdSZWNvcmQsIG50YWdzKTsKLSAgICBGWF9EV09SRCBzdGFydCA9IDAsIGl0YWcgPSAwLCBtYXhfbGVuID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IHRhZ3MuR2V0TGVuZ3RoKCk7IGkgKyspIHsKLSAgICAgICAgaWYgKHRhZ3NbaV0gPT0gMCkgewotICAgICAgICAgICAgRlhfRFdPUkQgbGVuID0gaSAtIHN0YXJ0OwotICAgICAgICAgICAgaWYgKGxlbiA+IG1heF9sZW4pIHsKLSAgICAgICAgICAgICAgICBtYXhfbGVuID0gbGVuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhdHRlcm5zW2l0YWddLm1fcFRhZyA9IHRhZ3MuR2V0UHRyKCkgKyBzdGFydDsKLSAgICAgICAgICAgIHBQYXR0ZXJuc1tpdGFnXS5tX0xlbiA9IGxlbjsKLSAgICAgICAgICAgIHBQYXR0ZXJuc1tpdGFnXS5tX09mZnNldCA9IDA7Ci0gICAgICAgICAgICBzdGFydCA9IGkgKyAxOwotICAgICAgICAgICAgaXRhZyArKzsKLSAgICAgICAgfQoraW50MzJfdCBDUERGX1N5bnRheFBhcnNlcjo6U2VhcmNoTXVsdGlXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaG9sZVdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgbGltaXQpIHsKKyAgaW50MzJfdCBudGFncyA9IDEsIGk7CisgIGZvciAoaSA9IDA7IGkgPCB0YWdzLkdldExlbmd0aCgpOyBpKyspCisgICAgaWYgKHRhZ3NbaV0gPT0gMCkgeworICAgICAgbnRhZ3MrKzsKICAgICB9Ci0gICAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3M7Ci0gICAgdWludDhfdCBieXRlOwotICAgIEdldENoYXJBdChwb3MrKywgYnl0ZSk7Ci0gICAgaW50MzJfdCBmb3VuZCA9IC0xOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudGFnczsgaSArKykgewotICAgICAgICAgICAgaWYgKHBQYXR0ZXJuc1tpXS5tX3BUYWdbcFBhdHRlcm5zW2ldLm1fT2Zmc2V0XSA9PSBieXRlKSB7Ci0gICAgICAgICAgICAgICAgcFBhdHRlcm5zW2ldLm1fT2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgIGlmIChwUGF0dGVybnNbaV0ubV9PZmZzZXQgPT0gcFBhdHRlcm5zW2ldLm1fTGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYldob2xlV29yZCB8fCBJc1dob2xlV29yZChwb3MgLSBwUGF0dGVybnNbaV0ubV9MZW4sIGxpbWl0LCBwUGF0dGVybnNbaV0ubV9wVGFnLCBwUGF0dGVybnNbaV0ubV9MZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUGF0dGVybnNbaV0ubV9wVGFnWzBdID09IGJ5dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybnNbaV0ubV9PZmZzZXQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybnNbaV0ubV9PZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICBfU2VhcmNoVGFnUmVjb3JkKiBwUGF0dGVybnMgPSBGWF9BbGxvYyhfU2VhcmNoVGFnUmVjb3JkLCBudGFncyk7CisgIEZYX0RXT1JEIHN0YXJ0ID0gMCwgaXRhZyA9IDAsIG1heF9sZW4gPSAwOworICBmb3IgKGkgPSAwOyBpIDw9IHRhZ3MuR2V0TGVuZ3RoKCk7IGkrKykgeworICAgIGlmICh0YWdzW2ldID09IDApIHsKKyAgICAgIEZYX0RXT1JEIGxlbiA9IGkgLSBzdGFydDsKKyAgICAgIGlmIChsZW4gPiBtYXhfbGVuKSB7CisgICAgICAgIG1heF9sZW4gPSBsZW47CisgICAgICB9CisgICAgICBwUGF0dGVybnNbaXRhZ10ubV9wVGFnID0gdGFncy5HZXRQdHIoKSArIHN0YXJ0OworICAgICAgcFBhdHRlcm5zW2l0YWddLm1fTGVuID0gbGVuOworICAgICAgcFBhdHRlcm5zW2l0YWddLm1fT2Zmc2V0ID0gMDsKKyAgICAgIHN0YXJ0ID0gaSArIDE7CisgICAgICBpdGFnKys7CisgICAgfQorICB9CisgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fUG9zOworICB1aW50OF90IGJ5dGU7CisgIEdldENoYXJBdChwb3MrKywgYnl0ZSk7CisgIGludDMyX3QgZm91bmQgPSAtMTsKKyAgd2hpbGUgKDEpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnRhZ3M7IGkrKykgeworICAgICAgaWYgKHBQYXR0ZXJuc1tpXS5tX3BUYWdbcFBhdHRlcm5zW2ldLm1fT2Zmc2V0XSA9PSBieXRlKSB7CisgICAgICAgIHBQYXR0ZXJuc1tpXS5tX09mZnNldCsrOworICAgICAgICBpZiAocFBhdHRlcm5zW2ldLm1fT2Zmc2V0ID09IHBQYXR0ZXJuc1tpXS5tX0xlbikgeworICAgICAgICAgIGlmICghYldob2xlV29yZCB8fAorICAgICAgICAgICAgICBJc1dob2xlV29yZChwb3MgLSBwUGF0dGVybnNbaV0ubV9MZW4sIGxpbWl0LCBwUGF0dGVybnNbaV0ubV9wVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybnNbaV0ubV9MZW4pKSB7CisgICAgICAgICAgICBmb3VuZCA9IGk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBQYXR0ZXJuc1tpXS5tX3BUYWdbMF0gPT0gYnl0ZSkgeworICAgICAgICAgICAgICBwUGF0dGVybnNbaV0ubV9PZmZzZXQgPSAxOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocFBhdHRlcm5zW2ldLm1fcFRhZ1swXSA9PSBieXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXR0ZXJuc1tpXS5tX09mZnNldCA9IDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm5zW2ldLm1fT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHBQYXR0ZXJuc1tpXS5tX09mZnNldCA9IDA7CiAgICAgICAgICAgICB9CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChsaW1pdCAmJiBwb3MgPj0gbV9Qb3MgKyBsaW1pdCkgewotICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFHZXRDaGFyQXQocG9zLCBieXRlKSkgewotICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgcG9zICsrOwotICAgIH0KLWVuZDoKLSAgICBGWF9GcmVlKHBQYXR0ZXJucyk7Ci0gICAgcmV0dXJuIGZvdW5kOwotfQotRlhfRklMRVNJWkUgQ1BERl9TeW50YXhQYXJzZXI6OkZpbmRUYWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsIEZYX0ZJTEVTSVpFIGxpbWl0KQotewotICAgIGludDMyX3QgdGFnbGVuID0gdGFnLkdldExlbmd0aCgpOwotICAgIGludDMyX3QgbWF0Y2ggPSAwOwotICAgIGxpbWl0ICs9IG1fUG9zOwotICAgIEZYX0ZJTEVTSVpFIHN0YXJ0cG9zID0gbV9Qb3M7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgdWludDhfdCBjaDsKLSAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2ggPT0gdGFnW21hdGNoXSkgewotICAgICAgICAgICAgbWF0Y2ggKys7Ci0gICAgICAgICAgICBpZiAobWF0Y2ggPT0gdGFnbGVuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fUG9zIC0gc3RhcnRwb3MgLSB0YWdsZW47Ci0gICAgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocFBhdHRlcm5zW2ldLm1fcFRhZ1swXSA9PSBieXRlKSB7CisgICAgICAgICAgcFBhdHRlcm5zW2ldLm1fT2Zmc2V0ID0gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1hdGNoID0gY2ggPT0gdGFnWzBdID8gMSA6IDA7CisgICAgICAgICAgcFBhdHRlcm5zW2ldLm1fT2Zmc2V0ID0gMDsKICAgICAgICAgfQotICAgICAgICBpZiAobGltaXQgJiYgbV9Qb3MgPT0gbGltaXQpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gLTE7CisgICAgaWYgKGxpbWl0ICYmIHBvcyA+PSBtX1BvcyArIGxpbWl0KSB7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKCFHZXRDaGFyQXQocG9zLCBieXRlKSkgeworICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIHBvcysrOworICB9CitlbmQ6CisgIEZYX0ZyZWUocFBhdHRlcm5zKTsKKyAgcmV0dXJuIGZvdW5kOwogfQotdm9pZCBDUERGX1N5bnRheFBhcnNlcjo6R2V0QmluYXJ5KHVpbnQ4X3QqIGJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSkKLXsKLSAgICBGWF9EV09SRCBvZmZzZXQgPSAwOworRlhfRklMRVNJWkUgQ1BERl9TeW50YXhQYXJzZXI6OkZpbmRUYWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBsaW1pdCkgeworICBpbnQzMl90IHRhZ2xlbiA9IHRhZy5HZXRMZW5ndGgoKTsKKyAgaW50MzJfdCBtYXRjaCA9IDA7CisgIGxpbWl0ICs9IG1fUG9zOworICBGWF9GSUxFU0laRSBzdGFydHBvcyA9IG1fUG9zOworICB3aGlsZSAoMSkgewogICAgIHVpbnQ4X3QgY2g7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gY2g7Ci0gICAgICAgIGlmIChvZmZzZXQgPT0gc2l6ZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgeworICAgICAgcmV0dXJuIC0xOwogICAgIH0KKyAgICBpZiAoY2ggPT0gdGFnW21hdGNoXSkgeworICAgICAgbWF0Y2grKzsKKyAgICAgIGlmIChtYXRjaCA9PSB0YWdsZW4pIHsKKyAgICAgICAgcmV0dXJuIG1fUG9zIC0gc3RhcnRwb3MgLSB0YWdsZW47CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1hdGNoID0gY2ggPT0gdGFnWzBdID8gMSA6IDA7CisgICAgfQorICAgIGlmIChsaW1pdCAmJiBtX1BvcyA9PSBsaW1pdCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9Cit2b2lkIENQREZfU3ludGF4UGFyc2VyOjpHZXRCaW5hcnkodWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBzaXplKSB7CisgIEZYX0RXT1JEIG9mZnNldCA9IDA7CisgIHVpbnQ4X3QgY2g7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnVmZmVyW29mZnNldCsrXSA9IGNoOworICAgIGlmIChvZmZzZXQgPT0gc2l6ZSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CiB9CiAKLWNsYXNzIENQREZfRGF0YUF2YWlsIGZpbmFsIDogcHVibGljIElQREZfRGF0YUF2YWlsCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9EYXRhQXZhaWwoSUZYX0ZpbGVBdmFpbCogcEZpbGVBdmFpbCwgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQpOwotICAgIH5DUERGX0RhdGFBdmFpbCgpOworY2xhc3MgQ1BERl9EYXRhQXZhaWwgZmluYWwgOiBwdWJsaWMgSVBERl9EYXRhQXZhaWwgeworIHB1YmxpYzoKKyAgQ1BERl9EYXRhQXZhaWwoSUZYX0ZpbGVBdmFpbCogcEZpbGVBdmFpbCwgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQpOworICB+Q1BERl9EYXRhQXZhaWwoKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgIElzRG9jQXZhaWwoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgIG92ZXJyaWRlOworICB2aXJ0dWFsIEZYX0JPT0wgSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFNldERvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MpICBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIFNldERvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgSXNQYWdlQXZhaWwoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSAgb3ZlcnJpZGU7CisgIHZpcnR1YWwgRlhfQk9PTCBJc1BhZ2VBdmFpbChpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgSXNGb3JtQXZhaWwoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykgIG92ZXJyaWRlOworICB2aXJ0dWFsIGludDMyX3QgSXNGb3JtQXZhaWwoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBJc0xpbmVhcml6ZWRQREYoKSAgb3ZlcnJpZGU7CisgIHZpcnR1YWwgaW50MzJfdCBJc0xpbmVhcml6ZWRQREYoKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgIElzTGluZWFyaXplZCgpICBvdmVycmlkZQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYkxpbmVhcml6ZWQ7Ci0gICAgfQorICB2aXJ0dWFsIEZYX0JPT0wgSXNMaW5lYXJpemVkKCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9iTGluZWFyaXplZDsgfQogCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGluZWFyaXplZE1haW5YUmVmSW5mbyhGWF9GSUxFU0laRSAqcFBvcywgRlhfRFdPUkQgKnBTaXplKSAgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBHZXRMaW5lYXJpemVkTWFpblhSZWZJbmZvKEZYX0ZJTEVTSVpFKiBwUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFNpemUpIG92ZXJyaWRlOwogCi1wcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGNvbnN0IGludCBrTWF4RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGggPSA2NDsKLSAgICBzdGF0aWMgaW50IHNfQ3VycmVudERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoOworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGludCBrTWF4RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGggPSA2NDsKKyAgc3RhdGljIGludCBzX0N1cnJlbnREYXRhQXZhaWxSZWN1cnNpb25EZXB0aDsKIAotICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdFNpemUoRlhfRFdPUkQgb2JqbnVtLCBGWF9GSUxFU0laRSYgb2Zmc2V0KTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc09iamVjdHNBdmFpbChDRlhfUHRyQXJyYXkmIG9ial9hcnJheSwgRlhfQk9PTCBiUGFyc2VQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBDRlhfUHRyQXJyYXkgJnJldF9hcnJheSk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tEb2NTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tIZWFkZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tGaXJzdFBhZ2UoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tFbmQoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDcm9zc1JlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Nyb3NzUmVmSXRlbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1RyYWlsZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tSb290KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrSW5mbyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1Jlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Fubm90cyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Fjcm9Gb3JtKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQWNyb0Zvcm1TdWJPYmplY3QoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tUcmFpbGVyQXBwZW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZVN0YXR1cyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0FsbENyb3NzUmVmU3RyZWFtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOworICBGWF9EV09SRCBHZXRPYmplY3RTaXplKEZYX0RXT1JEIG9iam51bSwgRlhfRklMRVNJWkUmIG9mZnNldCk7CisgIEZYX0JPT0wgSXNPYmplY3RzQXZhaWwoQ0ZYX1B0ckFycmF5JiBvYmpfYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFyc2VQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5JiByZXRfYXJyYXkpOworICBGWF9CT09MIENoZWNrRG9jU3RhdHVzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrSGVhZGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrRmlyc3RQYWdlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrRW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrQ3Jvc3NSZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tDcm9zc1JlZkl0ZW0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tUcmFpbGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrUm9vdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja0luZm8oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja1BhZ2UoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tSZXNvdXJjZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tBbm5vdHMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tBY3JvRm9ybShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja0Fjcm9Gb3JtU3ViT2JqZWN0KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrVHJhaWxlckFwcGVuZChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja1BhZ2VTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tBbGxDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKIAotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzLCBGWF9GSUxFU0laRSAmeHJlZl9vZmZzZXQpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTGluZWFyaXplZEZpbGUodWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3TGVuKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRTdGFydE9mZnNldChGWF9GSUxFU0laRSBkd09mZnNldCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmV4dFRva2VuKENGWF9CeXRlU3RyaW5nICZ0b2tlbik7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmV4dENoYXIodWludDhfdCAmY2gpOwotICAgIENQREZfT2JqZWN0CSogICAgICAgICAgICAgICAgICAgICAgIFBhcnNlSW5kaXJlY3RPYmplY3RBdChGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIG9iam51bSk7Ci0gICAgQ1BERl9PYmplY3QJKiAgICAgICAgICAgICAgICAgICAgICAgR2V0T2JqZWN0KEZYX0RXT1JEIG9iam51bSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywgRlhfQk9PTCAqcEV4aXN0SW5GaWxlKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYWdlS2lkcyhDUERGX1BhcnNlciAqcFBhcnNlciwgQ1BERl9PYmplY3QgKnBQYWdlcyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcGFyZVBhZ2VJdGVtKCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZFBhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRBbGxYcmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRBbGxGaWxlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrTGluZWFyaXplZERhdGEoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tGaWxlUmVzb3VyY2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZUFubm90cyhpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBpbnQzMl90IENoZWNrQ3Jvc3NSZWZTdHJlYW0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFJiB4cmVmX29mZnNldCk7CisgIEZYX0JPT0wgSXNMaW5lYXJpemVkRmlsZSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdMZW4pOworICB2b2lkIFNldFN0YXJ0T2Zmc2V0KEZYX0ZJTEVTSVpFIGR3T2Zmc2V0KTsKKyAgRlhfQk9PTCBHZXROZXh0VG9rZW4oQ0ZYX0J5dGVTdHJpbmcmIHRva2VuKTsKKyAgRlhfQk9PTCBHZXROZXh0Q2hhcih1aW50OF90JiBjaCk7CisgIENQREZfT2JqZWN0KiBQYXJzZUluZGlyZWN0T2JqZWN0QXQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBvYmpudW0pOworICBDUERGX09iamVjdCogR2V0T2JqZWN0KEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wqIHBFeGlzdEluRmlsZSk7CisgIEZYX0JPT0wgR2V0UGFnZUtpZHMoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfT2JqZWN0KiBwUGFnZXMpOworICBGWF9CT09MIFByZXBhcmVQYWdlSXRlbSgpOworICBGWF9CT09MIExvYWRQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBMb2FkQWxsWHJlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBMb2FkQWxsRmlsZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja0xpbmVhcml6ZWREYXRhKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrRmlsZVJlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja1BhZ2VBbm5vdHMoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrTGluZWFyaXplZEZpcnN0UGFnZShpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhdmVSZXNvdXJjZUFuY2VzdG9yKENQREZfRGljdGlvbmFyeSAqcERpY3QpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkRG9jUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZERvY1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlTm9kZShDUERGX1BhZ2VOb2RlICZwYWdlTm9kZXMsIGludDMyX3QgaVBhZ2UsIGludDMyX3QgJmlDb3VudCwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tVbmtvd25QYWdlTm9kZShGWF9EV09SRCBkd1BhZ2VObywgQ1BERl9QYWdlTm9kZSAqcFBhZ2VOb2RlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0FycmF5UGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlQ291bnQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNGaXJzdENoZWNrKGludCBpUGFnZSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXRGaXJzdENoZWNrKGludCBpUGFnZSk7CisgIEZYX0JPT0wgQ2hlY2tMaW5lYXJpemVkRmlyc3RQYWdlKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgSGF2ZVJlc291cmNlQW5jZXN0b3IoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisgIEZYX0JPT0wgQ2hlY2tQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIExvYWREb2NQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBMb2FkRG9jUGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja1BhZ2VOb2RlKENQREZfUGFnZU5vZGUmIHBhZ2VOb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja1Vua293blBhZ2VOb2RlKEZYX0RXT1JEIGR3UGFnZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlTm9kZSogcFBhZ2VOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tBcnJheVBhZ2VOb2RlKEZYX0RXT1JEIGR3UGFnZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VOb2RlKiBwUGFnZU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrUGFnZUNvdW50KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIElzRmlyc3RDaGVjayhpbnQgaVBhZ2UpOworICB2b2lkIFJlc2V0Rmlyc3RDaGVjayhpbnQgaVBhZ2UpOwogCi0gICAgQ1BERl9QYXJzZXIgICAgICAgICAgICAgICAgICAgICAgICAgbV9wYXJzZXI7CisgIENQREZfUGFyc2VyIG1fcGFyc2VyOwogCi0gICAgQ1BERl9TeW50YXhQYXJzZXIgICAgICAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXI7CisgIENQREZfU3ludGF4UGFyc2VyIG1fc3ludGF4UGFyc2VyOwogCi0gICAgQ1BERl9PYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgKm1fcFJvb3Q7CisgIENQREZfT2JqZWN0KiBtX3BSb290OwogCi0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1Jvb3RPYmpOdW07CisgIEZYX0RXT1JEIG1fZHdSb290T2JqTnVtOwogCi0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0luZm9PYmpOdW07CisgIEZYX0RXT1JEIG1fZHdJbmZvT2JqTnVtOwogCi0gICAgQ1BERl9PYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgKm1fcExpbmVhcml6ZWQ7CisgIENQREZfT2JqZWN0KiBtX3BMaW5lYXJpemVkOwogCi0gICAgQ1BERl9PYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgKm1fcFRyYWlsZXI7CisgIENQREZfT2JqZWN0KiBtX3BUcmFpbGVyOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iRG9jQXZhaWw7CisgIEZYX0JPT0wgbV9iRG9jQXZhaWw7CiAKLSAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3SGVhZGVyT2Zmc2V0OworICBGWF9GSUxFU0laRSBtX2R3SGVhZGVyT2Zmc2V0OwogCi0gICAgRlhfRklMRVNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0xhc3RYUmVmT2Zmc2V0OworICBGWF9GSUxFU0laRSBtX2R3TGFzdFhSZWZPZmZzZXQ7CiAKLSAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3WFJlZk9mZnNldDsKKyAgRlhfRklMRVNJWkUgbV9kd1hSZWZPZmZzZXQ7CiAKLSAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3VHJhaWxlck9mZnNldDsKKyAgRlhfRklMRVNJWkUgbV9kd1RyYWlsZXJPZmZzZXQ7CiAKLSAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3Q3VycmVudE9mZnNldDsKKyAgRlhfRklMRVNJWkUgbV9kd0N1cnJlbnRPZmZzZXQ7CiAKLSAgICBQREZfREFUQUFWQUlMX1NUQVRVUyAgICAgICAgICAgICAgICBtX2RvY1N0YXR1czsKKyAgUERGX0RBVEFBVkFJTF9TVEFUVVMgbV9kb2NTdGF0dXM7CiAKLSAgICBGWF9GSUxFU0laRQkgICAgICAgICAgICAgICAgICAgICAgICBtX2R3RmlsZUxlbjsKKyAgRlhfRklMRVNJWkUgbV9kd0ZpbGVMZW47CiAKLSAgICBDUERGX0RvY3VtZW50KiAgICAgICAgICAgICAgICAgICAgICBtX3BEb2N1bWVudDsKKyAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CiAKLSAgICBDUERGX1NvcnRPYmpOdW1BcnJheSAgICAgICAgICAgICAgICBtX29iam51bV9hcnJheTsKKyAgQ1BERl9Tb3J0T2JqTnVtQXJyYXkgbV9vYmpudW1fYXJyYXk7CiAKLSAgICBDRlhfUHRyQXJyYXkgICAgICAgICAgICAgICAgICAgICAgICBtX29ianNfYXJyYXk7CisgIENGWF9QdHJBcnJheSBtX29ianNfYXJyYXk7CiAKLSAgICBGWF9GSUxFU0laRQkgICAgICAgICAgICAgICAgICAgICAgICBtX1BvczsKKyAgRlhfRklMRVNJWkUgbV9Qb3M7CiAKLSAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlck9mZnNldDsKKyAgRlhfRklMRVNJWkUgbV9idWZmZXJPZmZzZXQ7CiAKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlclNpemU7CisgIEZYX0RXT1JEIG1fYnVmZmVyU2l6ZTsKIAotICAgIENGWF9CeXRlU3RyaW5nICAgICAgICAgICAgICAgICAgICAgIG1fV29yZEJ1ZjsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9Xb3JkQnVmOwogCi0gICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Xb3JkQnVmZmVyWzI1N107CisgIHVpbnQ4X3QgbV9Xb3JkQnVmZmVyWzI1N107CiAKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1dvcmRTaXplOworICBGWF9EV09SRCBtX1dvcmRTaXplOwogCi0gICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9idWZmZXJEYXRhWzUxMl07CisgIHVpbnQ4X3QgbV9idWZmZXJEYXRhWzUxMl07CiAKLSAgICBDRlhfRmlsZVNpemVBcnJheSAgICAgICAgICAgICAgICAgICBtX0Nyb3NzT2Zmc2V0OworICBDRlhfRmlsZVNpemVBcnJheSBtX0Nyb3NzT2Zmc2V0OwogCi0gICAgQ0ZYX0RXb3JkQXJyYXkgICAgICAgICAgICAgICAgICAgICAgbV9YUmVmU3RyZWFtTGlzdDsKKyAgQ0ZYX0RXb3JkQXJyYXkgbV9YUmVmU3RyZWFtTGlzdDsKIAotICAgIENGWF9EV29yZEFycmF5ICAgICAgICAgICAgICAgICAgICAgIG1fUGFnZU9iakxpc3Q7CisgIENGWF9EV29yZEFycmF5IG1fUGFnZU9iakxpc3Q7CiAKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1BhZ2VzT2JqTnVtOworICBGWF9EV09SRCBtX1BhZ2VzT2JqTnVtOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyaXplZDsKKyAgRlhfQk9PTCBtX2JMaW5lYXJpemVkOwogCi0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0ZpcnN0UGFnZU5vOworICBGWF9EV09SRCBtX2R3Rmlyc3RQYWdlTm87CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JMaW5lYXJlZERhdGFPSzsKKyAgRlhfQk9PTCBtX2JMaW5lYXJlZERhdGFPSzsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYk1haW5YUmVmTG9hZFRyaWVkOworICBGWF9CT09MIG1fYk1haW5YUmVmTG9hZFRyaWVkOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTWFpblhSZWZMb2FkZWRPSzsKKyAgRlhfQk9PTCBtX2JNYWluWFJlZkxvYWRlZE9LOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iUGFnZXNUcmVlTG9hZDsKKyAgRlhfQk9PTCBtX2JQYWdlc1RyZWVMb2FkOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iUGFnZXNMb2FkOworICBGWF9CT09MIG1fYlBhZ2VzTG9hZDsKIAotICAgIENQREZfUGFyc2VyICogICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRQYXJzZXI7CisgIENQREZfUGFyc2VyKiBtX3BDdXJyZW50UGFyc2VyOwogCi0gICAgRlhfRklMRVNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0N1cnJlbnRYUmVmU3RlYW07CisgIEZYX0ZJTEVTSVpFIG1fZHdDdXJyZW50WFJlZlN0ZWFtOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQW5ub3RzTG9hZDsKKyAgRlhfQk9PTCBtX2JBbm5vdHNMb2FkOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSGF2ZUFjcm9Gb3JtOworICBGWF9CT09MIG1fYkhhdmVBY3JvRm9ybTsKIAotICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdBY3JvRm9ybU9iak51bTsKKyAgRlhfRFdPUkQgbV9kd0Fjcm9Gb3JtT2JqTnVtOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQWNyb0Zvcm1Mb2FkOworICBGWF9CT09MIG1fYkFjcm9Gb3JtTG9hZDsKIAotICAgIENQREZfT2JqZWN0CSogICAgICAgICAgICAgICAgICAgICAgIG1fcEFjcm9Gb3JtOworICBDUERGX09iamVjdCogbV9wQWNyb0Zvcm07CiAKLSAgICBDRlhfUHRyQXJyYXkgICAgICAgICAgICAgICAgICAgICAgICBtX2FycmF5QWNyb2Zvcm1zOworICBDRlhfUHRyQXJyYXkgbV9hcnJheUFjcm9mb3JtczsKIAotICAgIENQREZfRGljdGlvbmFyeSAqICAgICAgICAgICAgICAgICAgIG1fcFBhZ2VEaWN0OworICBDUERGX0RpY3Rpb25hcnkqIG1fcFBhZ2VEaWN0OwogCi0gICAgQ1BERl9PYmplY3QgKiAgICAgICAgICAgICAgICAgICAgICAgbV9wUGFnZVJlc291cmNlOworICBDUERGX09iamVjdCogbV9wUGFnZVJlc291cmNlOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2U7CisgIEZYX0JPT0wgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2U7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JQYWdlTG9hZGVkT0s7CisgIEZYX0JPT0wgbV9iUGFnZUxvYWRlZE9LOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQ7CisgIEZYX0JPT0wgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQ7CiAKLSAgICBDRlhfUHRyQXJyYXkgICAgICAgICAgICAgICAgICAgICAgICBtX1BhZ2VzQXJyYXk7CisgIENGWF9QdHJBcnJheSBtX1BhZ2VzQXJyYXk7CiAKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3RW5jcnlwdE9iak51bTsKKyAgRlhfRFdPUkQgbV9kd0VuY3J5cHRPYmpOdW07CiAKLSAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3UHJldlhSZWZPZmZzZXQ7CisgIEZYX0ZJTEVTSVpFIG1fZHdQcmV2WFJlZk9mZnNldDsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlOworICBGWF9CT09MIG1fYlRvdGFsTG9hZFBhZ2VUcmVlOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0s7CisgIEZYX0JPT0wgbV9iQ3VyUGFnZURpY3RMb2FkT0s7CiAKLSAgICBDUERGX1BhZ2VOb2RlICAgICAgICAgICAgICAgICAgICAgICBtX3BhZ2VOb2RlczsKKyAgQ1BERl9QYWdlTm9kZSBtX3BhZ2VOb2RlczsKIAotICAgIENGWF9DTWFwRFdvcmRUb0RXb3JkICogICAgICAgICAgICAgIG1fcGFnZU1hcENoZWNrU3RhdGU7CisgIENGWF9DTWFwRFdvcmRUb0RXb3JkKiBtX3BhZ2VNYXBDaGVja1N0YXRlOwogCi0gICAgQ0ZYX0NNYXBEV29yZFRvRFdvcmQgKiAgICAgICAgICAgICAgbV9wYWdlc0xvYWRTdGF0ZTsKKyAgQ0ZYX0NNYXBEV29yZFRvRFdvcmQqIG1fcGFnZXNMb2FkU3RhdGU7CiB9OwogCi1JUERGX0RhdGFBdmFpbDo6SVBERl9EYXRhQXZhaWwoSUZYX0ZpbGVBdmFpbCogcEZpbGVBdmFpbCwgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQpIDoKLSAgICBtX3BGaWxlQXZhaWwocEZpbGVBdmFpbCksCi0gICAgbV9wRmlsZVJlYWQocEZpbGVSZWFkKSB7Ci19CitJUERGX0RhdGFBdmFpbDo6SVBERl9EYXRhQXZhaWwoSUZYX0ZpbGVBdmFpbCogcEZpbGVBdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCkKKyAgICA6IG1fcEZpbGVBdmFpbChwRmlsZUF2YWlsKSwgbV9wRmlsZVJlYWQocEZpbGVSZWFkKSB7fQogCiAvLyBzdGF0aWMKLUlQREZfRGF0YUF2YWlsKiBJUERGX0RhdGFBdmFpbDo6Q3JlYXRlKElGWF9GaWxlQXZhaWwqIHBGaWxlQXZhaWwsIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKQoteworSVBERl9EYXRhQXZhaWwqIElQREZfRGF0YUF2YWlsOjpDcmVhdGUoSUZYX0ZpbGVBdmFpbCogcEZpbGVBdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKSB7CiAgIHJldHVybiBuZXcgQ1BERl9EYXRhQXZhaWwocEZpbGVBdmFpbCwgcEZpbGVSZWFkKTsKIH0KIAogLy8gc3RhdGljCiBpbnQgQ1BERl9EYXRhQXZhaWw6OnNfQ3VycmVudERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoID0gMDsKIAotQ1BERl9EYXRhQXZhaWw6OkNQREZfRGF0YUF2YWlsKElGWF9GaWxlQXZhaWwqIHBGaWxlQXZhaWwsIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKQotICAgIDogSVBERl9EYXRhQXZhaWwocEZpbGVBdmFpbCwgcEZpbGVSZWFkKQotewotICAgIG1fUG9zID0gMDsKLSAgICBtX2R3RmlsZUxlbiA9IDA7Ci0gICAgaWYgKG1fcEZpbGVSZWFkKSB7Ci0gICAgICAgIG1fZHdGaWxlTGVuID0gKEZYX0RXT1JEKW1fcEZpbGVSZWFkLT5HZXRTaXplKCk7Ci0gICAgfQotICAgIG1fZHdDdXJyZW50T2Zmc2V0ID0gMDsKLSAgICBtX1dvcmRTaXplID0gMDsKLSAgICBtX2R3WFJlZk9mZnNldCA9IDA7Ci0gICAgbV9idWZmZXJPZmZzZXQgPSAwOwotICAgIG1fZHdGaXJzdFBhZ2VObyA9IDA7Ci0gICAgbV9idWZmZXJTaXplID0gMDsKLSAgICBtX1BhZ2VzT2JqTnVtID0gMDsKLSAgICBtX2R3Q3VycmVudFhSZWZTdGVhbSA9IDA7Ci0gICAgbV9kd0Fjcm9Gb3JtT2JqTnVtID0gMDsKLSAgICBtX2R3SW5mb09iak51bSA9IDA7Ci0gICAgbV9wRG9jdW1lbnQgPSAwOwotICAgIG1fZHdFbmNyeXB0T2JqTnVtID0gMDsKLSAgICBtX2R3UHJldlhSZWZPZmZzZXQgPSAwOwotICAgIG1fZHdMYXN0WFJlZk9mZnNldCA9IDA7Ci0gICAgbV9iRG9jQXZhaWwgPSBGQUxTRTsKLSAgICBtX2JNYWluWFJlZkxvYWRUcmllZCA9IEZBTFNFOwotICAgIG1fYkRvY0F2YWlsID0gRkFMU0U7Ci0gICAgbV9iTGluZWFyaXplZCA9IEZBTFNFOwotICAgIG1fYlBhZ2VzTG9hZCA9IEZBTFNFOwotICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBGQUxTRTsKLSAgICBtX2JNYWluWFJlZkxvYWRlZE9LID0gRkFMU0U7Ci0gICAgbV9iQW5ub3RzTG9hZCA9IEZBTFNFOwotICAgIG1fYkhhdmVBY3JvRm9ybSA9IEZBTFNFOwotICAgIG1fYkFjcm9Gb3JtTG9hZCA9IEZBTFNFOwotICAgIG1fYlBhZ2VMb2FkZWRPSyA9IEZBTFNFOwotICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gRkFMU0U7Ci0gICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQgPSBGQUxTRTsKLSAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKLSAgICBtX3BSb290ID0gTlVMTDsKLSAgICBtX3BUcmFpbGVyID0gTlVMTDsKLSAgICBtX3BDdXJyZW50UGFyc2VyID0gTlVMTDsKLSAgICBtX3BBY3JvRm9ybSA9IE5VTEw7Ci0gICAgbV9wUGFnZURpY3QgPSBOVUxMOwotICAgIG1fcFBhZ2VSZXNvdXJjZSA9IE5VTEw7Ci0gICAgbV9wYWdlTWFwQ2hlY2tTdGF0ZSA9IE5VTEw7Ci0gICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0hFQURFUjsKLSAgICBtX3BhcnNlci5tX2JPd25GaWxlUmVhZCA9IEZBTFNFOwotICAgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlID0gRkFMU0U7Ci0gICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKLSAgICBtX2JMaW5lYXJlZERhdGFPSyA9IEZBTFNFOwotICAgIG1fcGFnZXNMb2FkU3RhdGUgPSBOVUxMOworQ1BERl9EYXRhQXZhaWw6OkNQREZfRGF0YUF2YWlsKElGWF9GaWxlQXZhaWwqIHBGaWxlQXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQpCisgICAgOiBJUERGX0RhdGFBdmFpbChwRmlsZUF2YWlsLCBwRmlsZVJlYWQpIHsKKyAgbV9Qb3MgPSAwOworICBtX2R3RmlsZUxlbiA9IDA7CisgIGlmIChtX3BGaWxlUmVhZCkgeworICAgIG1fZHdGaWxlTGVuID0gKEZYX0RXT1JEKW1fcEZpbGVSZWFkLT5HZXRTaXplKCk7CisgIH0KKyAgbV9kd0N1cnJlbnRPZmZzZXQgPSAwOworICBtX1dvcmRTaXplID0gMDsKKyAgbV9kd1hSZWZPZmZzZXQgPSAwOworICBtX2J1ZmZlck9mZnNldCA9IDA7CisgIG1fZHdGaXJzdFBhZ2VObyA9IDA7CisgIG1fYnVmZmVyU2l6ZSA9IDA7CisgIG1fUGFnZXNPYmpOdW0gPSAwOworICBtX2R3Q3VycmVudFhSZWZTdGVhbSA9IDA7CisgIG1fZHdBY3JvRm9ybU9iak51bSA9IDA7CisgIG1fZHdJbmZvT2JqTnVtID0gMDsKKyAgbV9wRG9jdW1lbnQgPSAwOworICBtX2R3RW5jcnlwdE9iak51bSA9IDA7CisgIG1fZHdQcmV2WFJlZk9mZnNldCA9IDA7CisgIG1fZHdMYXN0WFJlZk9mZnNldCA9IDA7CisgIG1fYkRvY0F2YWlsID0gRkFMU0U7CisgIG1fYk1haW5YUmVmTG9hZFRyaWVkID0gRkFMU0U7CisgIG1fYkRvY0F2YWlsID0gRkFMU0U7CisgIG1fYkxpbmVhcml6ZWQgPSBGQUxTRTsKKyAgbV9iUGFnZXNMb2FkID0gRkFMU0U7CisgIG1fYlBhZ2VzVHJlZUxvYWQgPSBGQUxTRTsKKyAgbV9iTWFpblhSZWZMb2FkZWRPSyA9IEZBTFNFOworICBtX2JBbm5vdHNMb2FkID0gRkFMU0U7CisgIG1fYkhhdmVBY3JvRm9ybSA9IEZBTFNFOworICBtX2JBY3JvRm9ybUxvYWQgPSBGQUxTRTsKKyAgbV9iUGFnZUxvYWRlZE9LID0gRkFMU0U7CisgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gRkFMU0U7CisgIG1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkID0gRkFMU0U7CisgIG1fcExpbmVhcml6ZWQgPSBOVUxMOworICBtX3BSb290ID0gTlVMTDsKKyAgbV9wVHJhaWxlciA9IE5VTEw7CisgIG1fcEN1cnJlbnRQYXJzZXIgPSBOVUxMOworICBtX3BBY3JvRm9ybSA9IE5VTEw7CisgIG1fcFBhZ2VEaWN0ID0gTlVMTDsKKyAgbV9wUGFnZVJlc291cmNlID0gTlVMTDsKKyAgbV9wYWdlTWFwQ2hlY2tTdGF0ZSA9IE5VTEw7CisgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9IRUFERVI7CisgIG1fcGFyc2VyLm1fYk93bkZpbGVSZWFkID0gRkFMU0U7CisgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlID0gRkFMU0U7CisgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gRkFMU0U7CisgIG1fYkxpbmVhcmVkRGF0YU9LID0gRkFMU0U7CisgIG1fcGFnZXNMb2FkU3RhdGUgPSBOVUxMOwogfQotQ1BERl9EYXRhQXZhaWw6On5DUERGX0RhdGFBdmFpbCgpCi17Ci0gICAgaWYgKG1fcExpbmVhcml6ZWQpCXsKLSAgICAgICAgbV9wTGluZWFyaXplZC0+UmVsZWFzZSgpOwotICAgIH0KLSAgICBpZiAobV9wUm9vdCkgewotICAgICAgICBtX3BSb290LT5SZWxlYXNlKCk7Ci0gICAgfQotICAgIGlmIChtX3BUcmFpbGVyKSB7Ci0gICAgICAgIG1fcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgZGVsZXRlIG1fcGFnZU1hcENoZWNrU3RhdGU7Ci0gICAgZGVsZXRlIG1fcGFnZXNMb2FkU3RhdGU7Ci0gICAgaW50MzJfdCBpID0gMDsKLSAgICBpbnQzMl90IGlTaXplID0gbV9hcnJheUFjcm9mb3Jtcy5HZXRTaXplKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGlTaXplOyArK2kpIHsKLSAgICAgICAgKChDUERGX09iamVjdCAqKW1fYXJyYXlBY3JvZm9ybXMuR2V0QXQoaSkpLT5SZWxlYXNlKCk7Ci0gICAgfQorQ1BERl9EYXRhQXZhaWw6On5DUERGX0RhdGFBdmFpbCgpIHsKKyAgaWYgKG1fcExpbmVhcml6ZWQpIHsKKyAgICBtX3BMaW5lYXJpemVkLT5SZWxlYXNlKCk7CisgIH0KKyAgaWYgKG1fcFJvb3QpIHsKKyAgICBtX3BSb290LT5SZWxlYXNlKCk7CisgIH0KKyAgaWYgKG1fcFRyYWlsZXIpIHsKKyAgICBtX3BUcmFpbGVyLT5SZWxlYXNlKCk7CisgIH0KKyAgZGVsZXRlIG1fcGFnZU1hcENoZWNrU3RhdGU7CisgIGRlbGV0ZSBtX3BhZ2VzTG9hZFN0YXRlOworICBpbnQzMl90IGkgPSAwOworICBpbnQzMl90IGlTaXplID0gbV9hcnJheUFjcm9mb3Jtcy5HZXRTaXplKCk7CisgIGZvciAoaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7CisgICAgKChDUERGX09iamVjdCopbV9hcnJheUFjcm9mb3Jtcy5HZXRBdChpKSktPlJlbGVhc2UoKTsKKyAgfQogfQotdm9pZCBDUERGX0RhdGFBdmFpbDo6U2V0RG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBtX3BEb2N1bWVudCA9IHBEb2M7Cit2b2lkIENQREZfRGF0YUF2YWlsOjpTZXREb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jKSB7CisgIG1fcERvY3VtZW50ID0gcERvYzsKIH0KLUZYX0RXT1JEIENQREZfRGF0YUF2YWlsOjpHZXRPYmplY3RTaXplKEZYX0RXT1JEIG9iam51bSwgRlhfRklMRVNJWkUmIG9mZnNldCkKLXsKLSAgICBDUERGX1BhcnNlciAqcFBhcnNlciA9IChDUERGX1BhcnNlciAqKShtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCkpOwotICAgIGlmIChwUGFyc2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChvYmpudW0gPj0gKEZYX0RXT1JEKXBQYXJzZXItPm1fQ3Jvc3NSZWYuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAocFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyKSB7Ci0gICAgICAgIG9iam51bSA9IChGWF9EV09SRClwUGFyc2VyLT5tX0Nyb3NzUmVmW29iam51bV07Ci0gICAgfQotICAgIGlmIChwUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDEgfHwgcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyNTUpIHsKLSAgICAgICAgb2Zmc2V0ID0gcFBhcnNlci0+bV9Dcm9zc1JlZltvYmpudW1dOwotICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZvZmZzZXQsIHBQYXJzZXItPm1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgcFBhcnNlci0+bV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKLSAgICAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChGWF9GSUxFU0laRSopcFJlc3VsdCAtIChGWF9GSUxFU0laRSopcFBhcnNlci0+bV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpID09IHBQYXJzZXItPm1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRlhfRFdPUkQpKCgoRlhfRklMRVNJWkUqKXBSZXN1bHQpWzFdIC0gb2Zmc2V0KTsKLSAgICB9CitGWF9EV09SRCBDUERGX0RhdGFBdmFpbDo6R2V0T2JqZWN0U2l6ZShGWF9EV09SRCBvYmpudW0sIEZYX0ZJTEVTSVpFJiBvZmZzZXQpIHsKKyAgQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKShtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCkpOworICBpZiAocFBhcnNlciA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG9iam51bSA+PSAoRlhfRFdPUkQpcFBhcnNlci0+bV9Dcm9zc1JlZi5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAocFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyKSB7CisgICAgb2JqbnVtID0gKEZYX0RXT1JEKXBQYXJzZXItPm1fQ3Jvc3NSZWZbb2JqbnVtXTsKKyAgfQorICBpZiAocFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAxIHx8IHBQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMjU1KSB7CisgICAgb2Zmc2V0ID0gcFBhcnNlci0+bV9Dcm9zc1JlZltvYmpudW1dOworICAgIGlmIChvZmZzZXQgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZvZmZzZXQsIHBQYXJzZXItPm1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyc2VyLT5tX1NvcnRlZE9mZnNldC5HZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7CisgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoRlhfRklMRVNJWkUqKXBSZXN1bHQgLQorICAgICAgICAgICAgKEZYX0ZJTEVTSVpFKilwUGFyc2VyLT5tX1NvcnRlZE9mZnNldC5HZXREYXRhKCkgPT0KKyAgICAgICAgcFBhcnNlci0+bV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpIC0gMSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAoRlhfRFdPUkQpKCgoRlhfRklMRVNJWkUqKXBSZXN1bHQpWzFdIC0gb2Zmc2V0KTsKKyAgfQorICByZXR1cm4gMDsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzT2JqZWN0c0F2YWlsKENGWF9QdHJBcnJheSYgb2JqX2FycmF5LCBGWF9CT09MIGJQYXJzZVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIENGWF9QdHJBcnJheSAmcmV0X2FycmF5KQotewotICAgIGlmICghb2JqX2FycmF5LkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgY291bnQgPSAwOwotICAgIENGWF9QdHJBcnJheSBuZXdfb2JqX2FycmF5OwotICAgIGludDMyX3QgaSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG9ial9hcnJheS5HZXRTaXplKCk7IGkrKykgewotICAgICAgICBDUERGX09iamVjdCAqcE9iaiA9IChDUERGX09iamVjdCAqKW9ial9hcnJheVtpXTsKLSAgICAgICAgaWYgKCFwT2JqKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IHR5cGUgPSBwT2JqLT5HZXRUeXBlKCk7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBQREZPQkpfQVJSQVk6IHsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSAqcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBrID0gMDsgayA8IHBBcnJheS0+R2V0Q291bnQoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdfb2JqX2FycmF5LkFkZChwQXJyYXktPkdldEVsZW1lbnQoaykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQREZPQkpfU1RSRUFNOgotICAgICAgICAgICAgICAgIHBPYmogPSBwT2JqLT5HZXREaWN0KCk7Ci0gICAgICAgICAgICBjYXNlIFBERk9CSl9ESUNUSU9OQVJZOiB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSAqcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRGljdCAmJiBwRGljdC0+R2V0U3RyaW5nKCJUeXBlIikgPT0gIlBhZ2UiICYmICFiUGFyc2VQYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwRGljdC0+R2V0U3RhcnRQb3MoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBvcykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QgKnZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwRGljdC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSAiUGFyZW50IikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vYmpfYXJyYXkuQWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogewotICAgICAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSAqcFJlZiA9IChDUERGX1JlZmVyZW5jZSopcE9iajsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdOdW0gPSBwUmVmLT5HZXRSZWZPYmpOdW0oKTsKLSAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvcmlnaW5hbF9zaXplID0gR2V0T2JqZWN0U2l6ZShkd051bSwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9EV09SRD4gc2l6ZSA9IG9yaWdpbmFsX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzaXplLlZhbHVlT3JEZWZhdWx0KDApID09IDAgfHwgb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbV9kd0ZpbGVMZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgKz0gNTEyOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXNpemUuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZS5WYWx1ZU9yRGllKCkgPiBtX2R3RmlsZUxlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IG1fZHdGaWxlTGVuIC0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IG9yaWdpbmFsX3NpemUgKyA1MTI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzaXplLklzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG9mZnNldCwgc2l6ZS5WYWx1ZU9yRGllKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQob2Zmc2V0LCBzaXplLlZhbHVlT3JEaWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXRfYXJyYXkuQWRkKHBPYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbV9vYmpudW1fYXJyYXkuRmluZChkd051bSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fb2JqbnVtX2FycmF5LkFkZE9iak51bShkd051bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCAqcFJlZmVycmVkID0gbV9wRG9jdW1lbnQtPkdldEluZGlyZWN0T2JqZWN0KHBSZWYtPkdldFJlZk9iak51bSgpLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUmVmZXJyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfb2JqX2FycmF5LkFkZChwUmVmZXJyZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgaW50MzJfdCBpU2l6ZSA9IG5ld19vYmpfYXJyYXkuR2V0U2l6ZSgpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewotICAgICAgICAgICAgQ1BERl9PYmplY3QgKnBPYmogPSAoQ1BERl9PYmplY3QgKiluZXdfb2JqX2FycmF5W2ldOwotICAgICAgICAgICAgaW50MzJfdCB0eXBlID0gcE9iai0+R2V0VHlwZSgpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlICpwUmVmID0gKENQREZfUmVmZXJlbmNlICopcE9iajsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBkd051bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOwotICAgICAgICAgICAgICAgIGlmICghbV9vYmpudW1fYXJyYXkuRmluZChkd051bSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0X2FycmF5LkFkZChwT2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldF9hcnJheS5BZGQocE9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBvYmpfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgb2JqX2FycmF5LkFwcGVuZChuZXdfb2JqX2FycmF5KTsKLSAgICByZXR1cm4gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBGQUxTRSwgcEhpbnRzLCByZXRfYXJyYXkpOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIGlmICghbV9kd0ZpbGVMZW4gJiYgbV9wRmlsZVJlYWQpIHsKLSAgICAgICAgbV9kd0ZpbGVMZW4gPSAoRlhfRFdPUkQpbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKLSAgICAgICAgaWYgKCFtX2R3RmlsZUxlbikgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgd2hpbGUgKCFtX2JEb2NBdmFpbCkgewotICAgICAgICBpZiAoIUNoZWNrRG9jU3RhdHVzKHBIaW50cykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzT2JqZWN0c0F2YWlsKENGWF9QdHJBcnJheSYgb2JqX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFyc2VQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSYgcmV0X2FycmF5KSB7CisgIGlmICghb2JqX2FycmF5LkdldFNpemUoKSkgewogICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBY3JvRm9ybVN1Yk9iamVjdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgewotICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIG1fb2JqbnVtX2FycmF5LlJlbW92ZUFsbCgpOwotICAgICAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OwotICAgICAgICBvYmpfYXJyYXkuQXBwZW5kKG1fYXJyYXlBY3JvZm9ybXMpOwotICAgICAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIEZBTFNFLCBwSGludHMsIG1fb2Jqc19hcnJheSk7Ci0gICAgICAgIGlmIChiUmV0KSB7Ci0gICAgICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJSZXQ7CisgIH0KKyAgRlhfRFdPUkQgY291bnQgPSAwOworICBDRlhfUHRyQXJyYXkgbmV3X29ial9hcnJheTsKKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG9ial9hcnJheS5HZXRTaXplKCk7IGkrKykgeworICAgIENQREZfT2JqZWN0KiBwT2JqID0gKENQREZfT2JqZWN0KilvYmpfYXJyYXlbaV07CisgICAgaWYgKCFwT2JqKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOwotICAgIGlmIChiUmV0KSB7Ci0gICAgICAgIGludDMyX3QgaVNpemUgPSBtX2FycmF5QWNyb2Zvcm1zLkdldFNpemUoKTsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewotICAgICAgICAgICAgKChDUERGX09iamVjdCAqKW1fYXJyYXlBY3JvZm9ybXMuR2V0QXQoaSkpLT5SZWxlYXNlKCk7CisgICAgaW50MzJfdCB0eXBlID0gcE9iai0+R2V0VHlwZSgpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBQREZPQkpfQVJSQVk6IHsKKyAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKKyAgICAgICAgZm9yIChGWF9EV09SRCBrID0gMDsgayA8IHBBcnJheS0+R2V0Q291bnQoKTsgaysrKSB7CisgICAgICAgICAgbmV3X29ial9hcnJheS5BZGQocEFycmF5LT5HZXRFbGVtZW50KGspKTsKICAgICAgICAgfQotICAgICAgICBtX2FycmF5QWNyb2Zvcm1zLlJlbW92ZUFsbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBQREZPQkpfU1RSRUFNOgorICAgICAgICBwT2JqID0gcE9iai0+R2V0RGljdCgpOworICAgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWTogeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOworICAgICAgICBpZiAocERpY3QgJiYgcERpY3QtPkdldFN0cmluZygiVHlwZSIpID09ICJQYWdlIiAmJiAhYlBhcnNlUGFnZSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBEaWN0LT5HZXRTdGFydFBvcygpOworICAgICAgICB3aGlsZSAocG9zKSB7CisgICAgICAgICAgQ1BERl9PYmplY3QqIHZhbHVlOworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKKyAgICAgICAgICB2YWx1ZSA9IHBEaWN0LT5HZXROZXh0RWxlbWVudChwb3MsIGtleSk7CisgICAgICAgICAgaWYgKGtleSAhPSAiUGFyZW50IikgeworICAgICAgICAgICAgbmV3X29ial9hcnJheS5BZGQodmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogeworICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IChDUERGX1JlZmVyZW5jZSopcE9iajsKKyAgICAgICAgRlhfRFdPUkQgZHdOdW0gPSBwUmVmLT5HZXRSZWZPYmpOdW0oKTsKKyAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0OworICAgICAgICBGWF9EV09SRCBvcmlnaW5hbF9zaXplID0gR2V0T2JqZWN0U2l6ZShkd051bSwgb2Zmc2V0KTsKKyAgICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9EV09SRD4gc2l6ZSA9IG9yaWdpbmFsX3NpemU7CisgICAgICAgIGlmIChzaXplLlZhbHVlT3JEZWZhdWx0KDApID09IDAgfHwgb2Zmc2V0IDwgMCB8fAorICAgICAgICAgICAgb2Zmc2V0ID49IG1fZHdGaWxlTGVuKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzaXplICs9IG9mZnNldDsKKyAgICAgICAgc2l6ZSArPSA1MTI7CisgICAgICAgIGlmICghc2l6ZS5Jc1ZhbGlkKCkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZS5WYWx1ZU9yRGllKCkgPiBtX2R3RmlsZUxlbikgeworICAgICAgICAgIHNpemUgPSBtX2R3RmlsZUxlbiAtIG9mZnNldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzaXplID0gb3JpZ2luYWxfc2l6ZSArIDUxMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNpemUuSXNWYWxpZCgpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG9mZnNldCwgc2l6ZS5WYWx1ZU9yRGllKCkpKSB7CisgICAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KG9mZnNldCwgc2l6ZS5WYWx1ZU9yRGllKCkpOworICAgICAgICAgIHJldF9hcnJheS5BZGQocE9iaik7CisgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfSBlbHNlIGlmICghbV9vYmpudW1fYXJyYXkuRmluZChkd051bSkpIHsKKyAgICAgICAgICBtX29iam51bV9hcnJheS5BZGRPYmpOdW0oZHdOdW0pOworICAgICAgICAgIENQREZfT2JqZWN0KiBwUmVmZXJyZWQgPQorICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+R2V0UmVmT2JqTnVtKCksIE5VTEwpOworICAgICAgICAgIGlmIChwUmVmZXJyZWQpIHsKKyAgICAgICAgICAgIG5ld19vYmpfYXJyYXkuQWRkKHBSZWZlcnJlZCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoY291bnQgPiAwKSB7CisgICAgaW50MzJfdCBpU2l6ZSA9IG5ld19vYmpfYXJyYXkuR2V0U2l6ZSgpOworICAgIGZvciAoaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7CisgICAgICBDUERGX09iamVjdCogcE9iaiA9IChDUERGX09iamVjdCopbmV3X29ial9hcnJheVtpXTsKKyAgICAgIGludDMyX3QgdHlwZSA9IHBPYmotPkdldFR5cGUoKTsKKyAgICAgIGlmICh0eXBlID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKXBPYmo7CisgICAgICAgIEZYX0RXT1JEIGR3TnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CisgICAgICAgIGlmICghbV9vYmpudW1fYXJyYXkuRmluZChkd051bSkpIHsKKyAgICAgICAgICByZXRfYXJyYXkuQWRkKHBPYmopOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXRfYXJyYXkuQWRkKHBPYmopOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgb2JqX2FycmF5LlJlbW92ZUFsbCgpOworICBvYmpfYXJyYXkuQXBwZW5kKG5ld19vYmpfYXJyYXkpOworICByZXR1cm4gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBGQUxTRSwgcEhpbnRzLCByZXRfYXJyYXkpOworfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmICghbV9kd0ZpbGVMZW4gJiYgbV9wRmlsZVJlYWQpIHsKKyAgICBtX2R3RmlsZUxlbiA9IChGWF9EV09SRCltX3BGaWxlUmVhZC0+R2V0U2l6ZSgpOworICAgIGlmICghbV9kd0ZpbGVMZW4pIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICB3aGlsZSAoIW1fYkRvY0F2YWlsKSB7CisgICAgaWYgKCFDaGVja0RvY1N0YXR1cyhwSGludHMpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBY3JvRm9ybVN1Yk9iamVjdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgeworICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKKyAgICBtX29iam51bV9hcnJheS5SZW1vdmVBbGwoKTsKKyAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OworICAgIG9ial9hcnJheS5BcHBlbmQobV9hcnJheUFjcm9mb3Jtcyk7CisgICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBtX29ianNfYXJyYXkpOworICAgIGlmIChiUmV0KSB7CisgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgfQogICAgIHJldHVybiBiUmV0OworICB9CisgIENGWF9QdHJBcnJheSBuZXdfb2Jqc19hcnJheTsKKyAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CisgIGlmIChiUmV0KSB7CisgICAgaW50MzJfdCBpU2l6ZSA9IG1fYXJyYXlBY3JvZm9ybXMuR2V0U2l6ZSgpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsKKyAgICAgICgoQ1BERl9PYmplY3QqKW1fYXJyYXlBY3JvZm9ybXMuR2V0QXQoaSkpLT5SZWxlYXNlKCk7CisgICAgfQorICAgIG1fYXJyYXlBY3JvZm9ybXMuUmVtb3ZlQWxsKCk7CisgIH0gZWxzZSB7CisgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOworICAgIG1fb2Jqc19hcnJheS5BcHBlbmQobmV3X29ianNfYXJyYXkpOworICB9CisgIHJldHVybiBiUmV0OwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBY3JvRm9ybShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7Ci0gICAgbV9wQWNyb0Zvcm0gPSBHZXRPYmplY3QobV9kd0Fjcm9Gb3JtT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOwotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFVFJFRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmICghbV9wQWNyb0Zvcm0pIHsKLSAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9hcnJheUFjcm9mb3Jtcy5BZGQobV9wQWNyb0Zvcm0pOworRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBY3JvRm9ybShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CisgIG1fcEFjcm9Gb3JtID0gR2V0T2JqZWN0KG1fZHdBY3JvRm9ybU9iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKKyAgaWYgKCFiRXhpc3QpIHsKICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0RvY1N0YXR1cyhJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQotewotICAgIHN3aXRjaCAobV9kb2NTdGF0dXMpIHsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0hFQURFUjoKLSAgICAgICAgICAgIHJldHVybiBDaGVja0hlYWRlcihwSGludHMpOwotICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfRklSU1RQQUdFOgotICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkU6Ci0gICAgICAgICAgICByZXR1cm4gQ2hlY2tGaXJzdFBhZ2UocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0VORDoKLSAgICAgICAgICAgIHJldHVybiBDaGVja0VuZChwSGludHMpOwotICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUY6Ci0gICAgICAgICAgICByZXR1cm4gQ2hlY2tDcm9zc1JlZihwSGludHMpOwotICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUZfSVRFTToKLSAgICAgICAgICAgIHJldHVybiBDaGVja0Nyb3NzUmVmSXRlbShwSGludHMpOwotICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUZfU1RSRUFNOgotICAgICAgICAgICAgcmV0dXJuIENoZWNrQWxsQ3Jvc3NSZWZTdHJlYW0ocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX1RSQUlMRVI6Ci0gICAgICAgICAgICByZXR1cm4gQ2hlY2tUcmFpbGVyKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9UUkFJTEVSX0FQUEVORDoKLSAgICAgICAgICAgIHJldHVybiBDaGVja1RyYWlsZXJBcHBlbmQocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0xPQURBTExDUlNPU1NSRUY6Ci0gICAgICAgICAgICByZXR1cm4gTG9hZEFsbFhyZWYocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOgotICAgICAgICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9ST09UOgotICAgICAgICAgICAgcmV0dXJuIENoZWNrUm9vdChwSGludHMpOwotICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfSU5GTzoKLSAgICAgICAgICAgIHJldHVybiBDaGVja0luZm8ocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0FDUk9GT1JNOgotICAgICAgICAgICAgcmV0dXJuIENoZWNrQWNyb0Zvcm0ocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOgotICAgICAgICAgICAgaWYgKG1fYlRvdGFsTG9hZFBhZ2VUcmVlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENoZWNrUGFnZXMocEhpbnRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBMb2FkRG9jUGFnZXMocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0U6Ci0gICAgICAgICAgICBpZiAobV9iVG90YWxMb2FkUGFnZVRyZWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tQYWdlKHBIaW50cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRV9MQVRFUkxPQUQ7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgotICAgICAgICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFX0xBVEVSTE9BRDoKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbV9iRG9jQXZhaWwgPSBUUlVFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFtX3BBY3JvRm9ybSkgeworICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci19Ci1GWF9CT09MCUNQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFVFJFRToKLSAgICAgICAgICAgIHJldHVybiBDaGVja1BhZ2VzKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFOgotICAgICAgICAgICAgcmV0dXJuIENoZWNrUGFnZShwSGludHMpOwotICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfRVJST1I6Ci0gICAgICAgICAgICByZXR1cm4gTG9hZEFsbEZpbGUocEhpbnRzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBUUlVFOwotICAgICAgICAgICAgbV9iUGFnZXNMb2FkID0gVFJVRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxGaWxlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoMCwgKEZYX0RXT1JEKW1fZHdGaWxlTGVuKSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHBIaW50cy0+QWRkU2VnbWVudCgwLCAoRlhfRFdPUkQpbV9kd0ZpbGVMZW4pOwogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX2FycmF5QWNyb2Zvcm1zLkFkZChtX3BBY3JvRm9ybSk7CisgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFVFJFRTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpMb2FkQWxsWHJlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIG1fcGFyc2VyLm1fU3ludGF4LkluaXRQYXJzZXIobV9wRmlsZVJlYWQsIChGWF9EV09SRCltX2R3SGVhZGVyT2Zmc2V0KTsKLSAgICBtX3BhcnNlci5tX2JPd25GaWxlUmVhZCA9IEZBTFNFOwotICAgIGlmICghbV9wYXJzZXIuTG9hZEFsbENyb3NzUmVmVjQobV9kd0xhc3RYUmVmT2Zmc2V0KSAmJiAhbV9wYXJzZXIuTG9hZEFsbENyb3NzUmVmVjUobV9kd0xhc3RYUmVmT2Zmc2V0KSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhTWVNfcXNvcnQobV9wYXJzZXIubV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX3BhcnNlci5tX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgIG1fZHdSb290T2JqTnVtID0gbV9wYXJzZXIuR2V0Um9vdE9iak51bSgpOwotICAgIG1fZHdJbmZvT2JqTnVtID0gbV9wYXJzZXIuR2V0SW5mb09iak51bSgpOwotICAgIG1fcEN1cnJlbnRQYXJzZXIgPSAmbV9wYXJzZXI7Ci0gICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1JPT1Q7CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0RvY1N0YXR1cyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIHN3aXRjaCAobV9kb2NTdGF0dXMpIHsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfSEVBREVSOgorICAgICAgcmV0dXJuIENoZWNrSGVhZGVyKHBIaW50cyk7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRToKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkU6CisgICAgICByZXR1cm4gQ2hlY2tGaXJzdFBhZ2UocEhpbnRzKTsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfRU5EOgorICAgICAgcmV0dXJuIENoZWNrRW5kKHBIaW50cyk7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX0NST1NTUkVGOgorICAgICAgcmV0dXJuIENoZWNrQ3Jvc3NSZWYocEhpbnRzKTsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUZfSVRFTToKKyAgICAgIHJldHVybiBDaGVja0Nyb3NzUmVmSXRlbShwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9DUk9TU1JFRl9TVFJFQU06CisgICAgICByZXR1cm4gQ2hlY2tBbGxDcm9zc1JlZlN0cmVhbShwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9UUkFJTEVSOgorICAgICAgcmV0dXJuIENoZWNrVHJhaWxlcihwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9UUkFJTEVSX0FQUEVORDoKKyAgICAgIHJldHVybiBDaGVja1RyYWlsZXJBcHBlbmQocEhpbnRzKTsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfTE9BREFMTENSU09TU1JFRjoKKyAgICAgIHJldHVybiBMb2FkQWxsWHJlZihwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRToKKyAgICAgIHJldHVybiBMb2FkQWxsRmlsZShwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9ST09UOgorICAgICAgcmV0dXJuIENoZWNrUm9vdChwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9JTkZPOgorICAgICAgcmV0dXJuIENoZWNrSW5mbyhwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9BQ1JPRk9STToKKyAgICAgIHJldHVybiBDaGVja0Fjcm9Gb3JtKHBIaW50cyk7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOgorICAgICAgaWYgKG1fYlRvdGFsTG9hZFBhZ2VUcmVlKSB7CisgICAgICAgIHJldHVybiBDaGVja1BhZ2VzKHBIaW50cyk7CisgICAgICB9CisgICAgICByZXR1cm4gTG9hZERvY1BhZ2VzKHBIaW50cyk7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0U6CisgICAgICBpZiAobV9iVG90YWxMb2FkUGFnZVRyZWUpIHsKKyAgICAgICAgcmV0dXJuIENoZWNrUGFnZShwSGludHMpOworICAgICAgfQorICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VfTEFURVJMT0FEOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgorICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKHBIaW50cyk7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0VfTEFURVJMT0FEOgorICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7CisgICAgZGVmYXVsdDoKKyAgICAgIG1fYkRvY0F2YWlsID0gVFJVRTsKKyAgICAgIHJldHVybiBUUlVFOworICB9Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOgorICAgICAgcmV0dXJuIENoZWNrUGFnZXMocEhpbnRzKTsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRToKKyAgICAgIHJldHVybiBDaGVja1BhZ2UocEhpbnRzKTsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfRVJST1I6CisgICAgICByZXR1cm4gTG9hZEFsbEZpbGUocEhpbnRzKTsKKyAgICBkZWZhdWx0OgorICAgICAgbV9iUGFnZXNUcmVlTG9hZCA9IFRSVUU7CisgICAgICBtX2JQYWdlc0xvYWQgPSBUUlVFOworICAgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxGaWxlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoMCwgKEZYX0RXT1JEKW1fZHdGaWxlTGVuKSkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9ET05FOwogICAgIHJldHVybiBUUlVFOworICB9CisgIHBIaW50cy0+QWRkU2VnbWVudCgwLCAoRlhfRFdPUkQpbV9kd0ZpbGVMZW4pOworICByZXR1cm4gRkFMU0U7CiB9Ci1DUERGX09iamVjdCogQ1BERl9EYXRhQXZhaWw6OkdldE9iamVjdChGWF9EV09SRCBvYmpudW0sIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIEZYX0JPT0wgKnBFeGlzdEluRmlsZSkKLXsKLSAgICBDUERGX09iamVjdCAqcFJldCAgICAgICAgID0gTlVMTDsKLSAgICBGWF9EV09SRCAgICBvcmlnaW5hbF9zaXplID0gMDsKLSAgICBGWF9GSUxFU0laRSBvZmZzZXQgICAgICAgID0gMDsKLSAgICBDUERGX1BhcnNlciAqcFBhcnNlciAgICAgID0gTlVMTDsKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxYcmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgbV9wYXJzZXIubV9TeW50YXguSW5pdFBhcnNlcihtX3BGaWxlUmVhZCwgKEZYX0RXT1JEKW1fZHdIZWFkZXJPZmZzZXQpOworICBtX3BhcnNlci5tX2JPd25GaWxlUmVhZCA9IEZBTFNFOworICBpZiAoIW1fcGFyc2VyLkxvYWRBbGxDcm9zc1JlZlY0KG1fZHdMYXN0WFJlZk9mZnNldCkgJiYKKyAgICAgICFtX3BhcnNlci5Mb2FkQWxsQ3Jvc3NSZWZWNShtX2R3TGFzdFhSZWZPZmZzZXQpKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWFNZU19xc29ydChtX3BhcnNlci5tX1NvcnRlZE9mZnNldC5HZXREYXRhKCksCisgICAgICAgICAgICAgIG1fcGFyc2VyLm1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwKKyAgICAgICAgICAgICAgX0NvbXBhcmVGaWxlU2l6ZSk7CisgIG1fZHdSb290T2JqTnVtID0gbV9wYXJzZXIuR2V0Um9vdE9iak51bSgpOworICBtX2R3SW5mb09iak51bSA9IG1fcGFyc2VyLkdldEluZm9PYmpOdW0oKTsKKyAgbV9wQ3VycmVudFBhcnNlciA9ICZtX3BhcnNlcjsKKyAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1JPT1Q7CisgIHJldHVybiBUUlVFOworfQorQ1BERl9PYmplY3QqIENQREZfRGF0YUF2YWlsOjpHZXRPYmplY3QoRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wqIHBFeGlzdEluRmlsZSkgeworICBDUERGX09iamVjdCogcFJldCA9IE5VTEw7CisgIEZYX0RXT1JEIG9yaWdpbmFsX3NpemUgPSAwOworICBGWF9GSUxFU0laRSBvZmZzZXQgPSAwOworICBDUERGX1BhcnNlciogcFBhcnNlciA9IE5VTEw7CiAKLSAgICBpZiAocEV4aXN0SW5GaWxlKSB7Ci0gICAgICAgICpwRXhpc3RJbkZpbGUgPSBUUlVFOwotICAgIH0KKyAgaWYgKHBFeGlzdEluRmlsZSkgeworICAgICpwRXhpc3RJbkZpbGUgPSBUUlVFOworICB9CiAKLSAgICBpZiAobV9wRG9jdW1lbnQgPT0gTlVMTCkgewotICAgICAgICBvcmlnaW5hbF9zaXplID0gKEZYX0RXT1JEKW1fcGFyc2VyLkdldE9iamVjdFNpemUob2JqbnVtKTsKLSAgICAgICAgb2Zmc2V0ICAgICAgICA9IG1fcGFyc2VyLkdldE9iamVjdE9mZnNldChvYmpudW0pOwotICAgICAgICBwUGFyc2VyICAgICAgID0gJm1fcGFyc2VyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9yaWdpbmFsX3NpemUgPSBHZXRPYmplY3RTaXplKG9iam51bSwgb2Zmc2V0KTsKLSAgICAgICAgcFBhcnNlciAgICAgICA9IChDUERGX1BhcnNlciAqKShtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCkpOwotICAgIH0KKyAgaWYgKG1fcERvY3VtZW50ID09IE5VTEwpIHsKKyAgICBvcmlnaW5hbF9zaXplID0gKEZYX0RXT1JEKW1fcGFyc2VyLkdldE9iamVjdFNpemUob2JqbnVtKTsKKyAgICBvZmZzZXQgPSBtX3BhcnNlci5HZXRPYmplY3RPZmZzZXQob2JqbnVtKTsKKyAgICBwUGFyc2VyID0gJm1fcGFyc2VyOworICB9IGVsc2UgeworICAgIG9yaWdpbmFsX3NpemUgPSBHZXRPYmplY3RTaXplKG9iam51bSwgb2Zmc2V0KTsKKyAgICBwUGFyc2VyID0gKENQREZfUGFyc2VyKikobV9wRG9jdW1lbnQtPkdldFBhcnNlcigpKTsKKyAgfQogCi0gICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9EV09SRD4gc2l6ZSA9IG9yaWdpbmFsX3NpemU7Ci0gICAgaWYgKHNpemUuVmFsdWVPckRlZmF1bHQoMCkgPT0gMCB8fCBvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBtX2R3RmlsZUxlbikgewotICAgICAgICBpZiAocEV4aXN0SW5GaWxlKQotICAgICAgICAgICAqcEV4aXN0SW5GaWxlID0gRkFMU0U7CisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8RlhfRFdPUkQ+IHNpemUgPSBvcmlnaW5hbF9zaXplOworICBpZiAoc2l6ZS5WYWx1ZU9yRGVmYXVsdCgwKSA9PSAwIHx8IG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IG1fZHdGaWxlTGVuKSB7CisgICAgaWYgKHBFeGlzdEluRmlsZSkKKyAgICAgICpwRXhpc3RJbkZpbGUgPSBGQUxTRTsKIAotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KIAotICAgIHNpemUgKz0gb2Zmc2V0OwotICAgIHNpemUgKz0gNTEyOwotICAgIGlmICghc2l6ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICBzaXplICs9IG9mZnNldDsKKyAgc2l6ZSArPSA1MTI7CisgIGlmICghc2l6ZS5Jc1ZhbGlkKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogCi0gICAgaWYgKHNpemUuVmFsdWVPckRpZSgpID4gbV9kd0ZpbGVMZW4pIHsKLSAgICAgICAgc2l6ZSA9IG1fZHdGaWxlTGVuIC0gb2Zmc2V0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNpemUgPSBvcmlnaW5hbF9zaXplICsgNTEyOwotICAgIH0KKyAgaWYgKHNpemUuVmFsdWVPckRpZSgpID4gbV9kd0ZpbGVMZW4pIHsKKyAgICBzaXplID0gbV9kd0ZpbGVMZW4gLSBvZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgc2l6ZSA9IG9yaWdpbmFsX3NpemUgKyA1MTI7CisgIH0KIAotICAgIGlmICghc2l6ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICBpZiAoIXNpemUuSXNWYWxpZCgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KIAotICAgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChvZmZzZXQsIHNpemUuVmFsdWVPckRpZSgpKSkgewotICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQob2Zmc2V0LCBzaXplLlZhbHVlT3JEaWUoKSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG9mZnNldCwgc2l6ZS5WYWx1ZU9yRGllKCkpKSB7CisgICAgcEhpbnRzLT5BZGRTZWdtZW50KG9mZnNldCwgc2l6ZS5WYWx1ZU9yRGllKCkpOworICAgIHJldHVybiBOVUxMOworICB9CiAKLSAgICBpZiAocFBhcnNlcikgewotICAgICAgICBwUmV0ID0gcFBhcnNlci0+UGFyc2VJbmRpcmVjdE9iamVjdChOVUxMLCBvYmpudW0sIE5VTEwpOwotICAgIH0KKyAgaWYgKHBQYXJzZXIpIHsKKyAgICBwUmV0ID0gcFBhcnNlci0+UGFyc2VJbmRpcmVjdE9iamVjdChOVUxMLCBvYmpudW0sIE5VTEwpOworICB9CiAKLSAgICBpZiAoIXBSZXQgJiYgcEV4aXN0SW5GaWxlKSB7Ci0gICAgICAgICpwRXhpc3RJbkZpbGUgPSBGQUxTRTsKLSAgICB9CisgIGlmICghcFJldCAmJiBwRXhpc3RJbkZpbGUpIHsKKyAgICAqcEV4aXN0SW5GaWxlID0gRkFMU0U7CisgIH0KIAotICAgIHJldHVybiBwUmV0OworICByZXR1cm4gcFJldDsKIH0KIAotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tJbmZvKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKLSAgICBDUERGX09iamVjdCAqcEluZm8gPSBHZXRPYmplY3QobV9kd0luZm9PYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7Ci0gICAgaWYgKCFiRXhpc3QpIHsKLSAgICAgICAgaWYgKG1fYkhhdmVBY3JvRm9ybSkgewotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0FDUk9GT1JNOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoIXBJbmZvKSB7Ci0gICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9Qb3MgPT0gbV9kd0ZpbGVMZW4pIHsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChwSW5mbykgewotICAgICAgICBwSW5mby0+UmVsZWFzZSgpOwotICAgIH0KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrSW5mbyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CisgIENQREZfT2JqZWN0KiBwSW5mbyA9IEdldE9iamVjdChtX2R3SW5mb09iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKKyAgaWYgKCFiRXhpc3QpIHsKICAgICBpZiAobV9iSGF2ZUFjcm9Gb3JtKSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9BQ1JPRk9STTsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9BQ1JPRk9STTsKICAgICB9IGVsc2UgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CiAgICAgfQogICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tSb290KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKLSAgICBtX3BSb290ID0gR2V0T2JqZWN0KG1fZHdSb290T2JqTnVtLCBwSGludHMsICZiRXhpc3QpOwotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFwSW5mbykgeworICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgaWYgKCFtX3BSb290KSB7Ci0gICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKG1fUG9zID09IG1fZHdGaWxlTGVuKSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CiAgICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BSb290LT5HZXREaWN0KCk7Ci0gICAgaWYgKCFwRGljdCkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKXBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQYWdlcyIpKTsKLSAgICBpZiAocFJlZiA9PSBOVUxMIHx8IHBSZWYtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX1BhZ2VzT2JqTnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7Ci0gICAgQ1BERl9SZWZlcmVuY2UqIHBBY3JvRm9ybVJlZiA9IChDUERGX1JlZmVyZW5jZSopbV9wUm9vdC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJBY3JvRm9ybSIpKTsKLSAgICBpZiAocEFjcm9Gb3JtUmVmICYmIHBBY3JvRm9ybVJlZi0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgbV9iSGF2ZUFjcm9Gb3JtID0gVFJVRTsKLSAgICAgICAgbV9kd0Fjcm9Gb3JtT2JqTnVtID0gcEFjcm9Gb3JtUmVmLT5HZXRSZWZPYmpOdW0oKTsKLSAgICB9Ci0gICAgaWYgKG1fZHdJbmZvT2JqTnVtKSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9JTkZPOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtX2JIYXZlQWNyb0Zvcm0pIHsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9BQ1JPRk9STTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFVFJFRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OlByZXBhcmVQYWdlSXRlbSgpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7Ci0gICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBwUm9vdCA/IChDUERGX1JlZmVyZW5jZSopcFJvb3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIlBhZ2VzIikpIDogTlVMTDsKLSAgICBpZiAocFJlZiA9PSBOVUxMIHx8IHBSZWYtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX1BhZ2VzT2JqTnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7Ci0gICAgbV9wQ3VycmVudFBhcnNlciA9IChDUERGX1BhcnNlciAqKW1fcERvY3VtZW50LT5HZXRQYXJzZXIoKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBJbmZvKSB7CisgICAgcEluZm8tPlJlbGVhc2UoKTsKKyAgfQorICBpZiAobV9iSGF2ZUFjcm9Gb3JtKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0FDUk9GT1JNOworICB9IGVsc2UgewogICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFVFJFRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzRmlyc3RDaGVjayhpbnQgaVBhZ2UpCi17Ci0gICAgaWYgKE5VTEwgPT0gbV9wYWdlTWFwQ2hlY2tTdGF0ZSkgewotICAgICAgICBtX3BhZ2VNYXBDaGVja1N0YXRlID0gbmV3IENGWF9DTWFwRFdvcmRUb0RXb3JkKCk7CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1Jvb3QoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOworICBtX3BSb290ID0gR2V0T2JqZWN0KG1fZHdSb290T2JqTnVtLCBwSGludHMsICZiRXhpc3QpOworICBpZiAoIWJFeGlzdCkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIW1fcFJvb3QpIHsKKyAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgeworICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIEZYX0RXT1JEIGR3VmFsdWUgPSAwOwotICAgIGlmICghbV9wYWdlTWFwQ2hlY2tTdGF0ZS0+TG9va3VwKGlQYWdlLCBkd1ZhbHVlKSkgewotICAgICAgICBtX3BhZ2VNYXBDaGVja1N0YXRlLT5TZXRBdChpUGFnZSwgMSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wUm9vdC0+R2V0RGljdCgpOworICBpZiAoIXBEaWN0KSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IChDUERGX1JlZmVyZW5jZSopcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIlBhZ2VzIikpOworICBpZiAocFJlZiA9PSBOVUxMIHx8IHBSZWYtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX1BhZ2VzT2JqTnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CisgIENQREZfUmVmZXJlbmNlKiBwQWNyb0Zvcm1SZWYgPQorICAgICAgKENQREZfUmVmZXJlbmNlKiltX3BSb290LT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIkFjcm9Gb3JtIikpOworICBpZiAocEFjcm9Gb3JtUmVmICYmIHBBY3JvRm9ybVJlZi0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICBtX2JIYXZlQWNyb0Zvcm0gPSBUUlVFOworICAgIG1fZHdBY3JvRm9ybU9iak51bSA9IHBBY3JvRm9ybVJlZi0+R2V0UmVmT2JqTnVtKCk7CisgIH0KKyAgaWYgKG1fZHdJbmZvT2JqTnVtKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0lORk87CisgIH0gZWxzZSB7CisgICAgaWYgKG1fYkhhdmVBY3JvRm9ybSkgeworICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0FDUk9GT1JNOworICAgIH0gZWxzZSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CiAgICAgfQotICAgIGlmIChkd1ZhbHVlICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OlByZXBhcmVQYWdlSXRlbSgpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgIENQREZfUmVmZXJlbmNlKiBwUmVmID0KKyAgICAgIHBSb290ID8gKENQREZfUmVmZXJlbmNlKilwUm9vdC0+R2V0RWxlbWVudChGWF9CU1RSQygiUGFnZXMiKSkgOiBOVUxMOworICBpZiAocFJlZiA9PSBOVUxMIHx8IHBSZWYtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX1BhZ2VzT2JqTnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CisgIG1fcEN1cnJlbnRQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKW1fcERvY3VtZW50LT5HZXRQYXJzZXIoKTsKKyAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzRmlyc3RDaGVjayhpbnQgaVBhZ2UpIHsKKyAgaWYgKE5VTEwgPT0gbV9wYWdlTWFwQ2hlY2tTdGF0ZSkgeworICAgIG1fcGFnZU1hcENoZWNrU3RhdGUgPSBuZXcgQ0ZYX0NNYXBEV29yZFRvRFdvcmQoKTsKKyAgfQorICBGWF9EV09SRCBkd1ZhbHVlID0gMDsKKyAgaWYgKCFtX3BhZ2VNYXBDaGVja1N0YXRlLT5Mb29rdXAoaVBhZ2UsIGR3VmFsdWUpKSB7CiAgICAgbV9wYWdlTWFwQ2hlY2tTdGF0ZS0+U2V0QXQoaVBhZ2UsIDEpOwogICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChkd1ZhbHVlICE9IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wYWdlTWFwQ2hlY2tTdGF0ZS0+U2V0QXQoaVBhZ2UsIDEpOworICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1BERl9EYXRhQXZhaWw6OlJlc2V0Rmlyc3RDaGVjayhpbnQgaVBhZ2UpCi17Ci0gICAgaWYgKE5VTEwgPT0gbV9wYWdlTWFwQ2hlY2tTdGF0ZSkgewotICAgICAgICBtX3BhZ2VNYXBDaGVja1N0YXRlID0gbmV3IENGWF9DTWFwRFdvcmRUb0RXb3JkKCk7Ci0gICAgfQotICAgIEZYX0RXT1JEIGR3VmFsdWUgPSAxOwotICAgIGlmICghbV9wYWdlTWFwQ2hlY2tTdGF0ZS0+TG9va3VwKGlQYWdlLCBkd1ZhbHVlKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcGFnZU1hcENoZWNrU3RhdGUtPlNldEF0KGlQYWdlLCAwKTsKK3ZvaWQgQ1BERl9EYXRhQXZhaWw6OlJlc2V0Rmlyc3RDaGVjayhpbnQgaVBhZ2UpIHsKKyAgaWYgKE5VTEwgPT0gbV9wYWdlTWFwQ2hlY2tTdGF0ZSkgeworICAgIG1fcGFnZU1hcENoZWNrU3RhdGUgPSBuZXcgQ0ZYX0NNYXBEV29yZFRvRFdvcmQoKTsKKyAgfQorICBGWF9EV09SRCBkd1ZhbHVlID0gMTsKKyAgaWYgKCFtX3BhZ2VNYXBDaGVja1N0YXRlLT5Mb29rdXAoaVBhZ2UsIGR3VmFsdWUpKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcGFnZU1hcENoZWNrU3RhdGUtPlNldEF0KGlQYWdlLCAwKTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIEZYX0RXT1JEIGlQYWdlT2JqcyA9IG1fUGFnZU9iakxpc3QuR2V0U2l6ZSgpOwotICAgIENGWF9EV29yZEFycmF5IFVuYXZhaWxPYmpMaXN0OwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBpUGFnZU9ianM7ICsraSkgewotICAgICAgICBGWF9EV09SRCBkd1BhZ2VPYmpOdW0gPSBtX1BhZ2VPYmpMaXN0LkdldEF0KGkpOwotICAgICAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwotICAgICAgICBDUERGX09iamVjdCAqcE9iaiA9IEdldE9iamVjdChkd1BhZ2VPYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7Ci0gICAgICAgIGlmICghcE9iaikgewotICAgICAgICAgICAgaWYgKGJFeGlzdCkgewotICAgICAgICAgICAgICAgIFVuYXZhaWxPYmpMaXN0LkFkZChkd1BhZ2VPYmpOdW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIENQREZfQXJyYXkgKnBBcnJheSA9IHBPYmotPkdldEFycmF5KCk7Ci0gICAgICAgICAgICBpZiAocEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBpU2l6ZSA9IHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCAqcEl0ZW0gPSBOVUxMOwotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlTaXplOyArK2opIHsKLSAgICAgICAgICAgICAgICAgICAgcEl0ZW0gPSBwQXJyYXktPkdldEVsZW1lbnQoaik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwSXRlbSAmJiBwSXRlbS0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVuYXZhaWxPYmpMaXN0LkFkZCgoKENQREZfUmVmZXJlbmNlICopcEl0ZW0pLT5HZXRSZWZPYmpOdW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgcE9iai0+UmVsZWFzZSgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IHBPYmotPkdldERpY3QoKS0+R2V0U3RyaW5nKEZYX0JTVFJDKCJUeXBlIikpOwotICAgICAgICBpZiAodHlwZSA9PSBGWF9CU1RSQygiUGFnZXMiKSkgewotICAgICAgICAgICAgbV9QYWdlc0FycmF5LkFkZChwT2JqKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHBPYmotPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbV9QYWdlT2JqTGlzdC5SZW1vdmVBbGwoKTsKLSAgICBpZiAoVW5hdmFpbE9iakxpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIG1fUGFnZU9iakxpc3QuQXBwZW5kKFVuYXZhaWxPYmpMaXN0KTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9EV09SRCBpUGFnZXMgPSBtX1BhZ2VzQXJyYXkuR2V0U2l6ZSgpOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBpUGFnZXM7IGkrKykgewotICAgICAgICBDUERGX09iamVjdCAqcFBhZ2VzID0gKENQREZfT2JqZWN0ICopbV9QYWdlc0FycmF5LkdldEF0KGkpOwotICAgICAgICBpZiAoIXBQYWdlcykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFHZXRQYWdlS2lkcyhtX3BDdXJyZW50UGFyc2VyLCBwUGFnZXMpKSB7Ci0gICAgICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIHdoaWxlICgrK2kgPCBpUGFnZXMpIHsKLSAgICAgICAgICAgICAgICBwUGFnZXMgPSAoQ1BERl9PYmplY3QgKiltX1BhZ2VzQXJyYXkuR2V0QXQoaSk7Ci0gICAgICAgICAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX1BhZ2VzQXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgfQotICAgIG1fUGFnZXNBcnJheS5SZW1vdmVBbGwoKTsKLSAgICBpZiAoIW1fUGFnZU9iakxpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9ET05FOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkdldFBhZ2VLaWRzKENQREZfUGFyc2VyICpwUGFyc2VyLCBDUERGX09iamVjdCAqcFBhZ2VzKQotewotICAgIGlmICghcFBhcnNlcikgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYWdlcy0+R2V0RGljdCgpOwotICAgIENQREZfT2JqZWN0ICpwS2lkcyA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIktpZHMiKSkgOiBOVUxMOwotICAgIGlmICghcEtpZHMpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHN3aXRjaCAocEtpZHMtPkdldFR5cGUoKSkgewotICAgICAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKLSAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSAqcEtpZCA9IChDUERGX1JlZmVyZW5jZSAqKXBLaWRzOwotICAgICAgICAgICAgICAgIG1fUGFnZU9iakxpc3QuQWRkKHBLaWQtPkdldFJlZk9iak51bSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgIENQREZfQXJyYXkgKnBLaWRzQXJyYXkgPSAoQ1BERl9BcnJheSAqKXBLaWRzOwotICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkc0FycmF5LT5HZXRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QgKnBLaWQgPSAoQ1BERl9PYmplY3QgKilwS2lkc0FycmF5LT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEtpZCAmJiBwS2lkLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9QYWdlT2JqTGlzdC5BZGQoKChDUERGX1JlZmVyZW5jZSAqKXBLaWQpLT5HZXRSZWZPYmpOdW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2UoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBGWF9EV09SRCBpUGFnZU9ianMgPSBtX1BhZ2VPYmpMaXN0LkdldFNpemUoKTsKKyAgQ0ZYX0RXb3JkQXJyYXkgVW5hdmFpbE9iakxpc3Q7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBpUGFnZU9ianM7ICsraSkgeworICAgIEZYX0RXT1JEIGR3UGFnZU9iak51bSA9IG1fUGFnZU9iakxpc3QuR2V0QXQoaSk7CiAgICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKLSAgICBDUERGX09iamVjdCAqcFBhZ2VzID0gR2V0T2JqZWN0KG1fUGFnZXNPYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7Ci0gICAgaWYgKCFiRXhpc3QpIHsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IEdldE9iamVjdChkd1BhZ2VPYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7CisgICAgaWYgKCFwT2JqKSB7CisgICAgICBpZiAoYkV4aXN0KSB7CisgICAgICAgIFVuYXZhaWxPYmpMaXN0LkFkZChkd1BhZ2VPYmpOdW0pOworICAgICAgfQorICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmICghcFBhZ2VzKSB7Ci0gICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKKyAgICAgIGlmIChwQXJyYXkpIHsKKyAgICAgICAgaW50MzJfdCBpU2l6ZSA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBJdGVtID0gTlVMTDsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVNpemU7ICsraikgeworICAgICAgICAgIHBJdGVtID0gcEFycmF5LT5HZXRFbGVtZW50KGopOworICAgICAgICAgIGlmIChwSXRlbSAmJiBwSXRlbS0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICAgICAgICAgIFVuYXZhaWxPYmpMaXN0LkFkZCgoKENQREZfUmVmZXJlbmNlKilwSXRlbSktPkdldFJlZk9iak51bSgpKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgICBwT2JqLT5SZWxlYXNlKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IHBPYmotPkdldERpY3QoKS0+R2V0U3RyaW5nKEZYX0JTVFJDKCJUeXBlIikpOworICAgIGlmICh0eXBlID09IEZYX0JTVFJDKCJQYWdlcyIpKSB7CisgICAgICBtX1BhZ2VzQXJyYXkuQWRkKHBPYmopOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHBPYmotPlJlbGVhc2UoKTsKKyAgfQorICBtX1BhZ2VPYmpMaXN0LlJlbW92ZUFsbCgpOworICBpZiAoVW5hdmFpbE9iakxpc3QuR2V0U2l6ZSgpKSB7CisgICAgbV9QYWdlT2JqTGlzdC5BcHBlbmQoVW5hdmFpbE9iakxpc3QpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9EV09SRCBpUGFnZXMgPSBtX1BhZ2VzQXJyYXkuR2V0U2l6ZSgpOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgaVBhZ2VzOyBpKyspIHsKKyAgICBDUERGX09iamVjdCogcFBhZ2VzID0gKENQREZfT2JqZWN0KiltX1BhZ2VzQXJyYXkuR2V0QXQoaSk7CisgICAgaWYgKCFwUGFnZXMpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KICAgICBpZiAoIUdldFBhZ2VLaWRzKG1fcEN1cnJlbnRQYXJzZXIsIHBQYWdlcykpIHsKKyAgICAgIHBQYWdlcy0+UmVsZWFzZSgpOworICAgICAgd2hpbGUgKCsraSA8IGlQYWdlcykgeworICAgICAgICBwUGFnZXMgPSAoQ1BERl9PYmplY3QqKW1fUGFnZXNBcnJheS5HZXRBdChpKTsKICAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgbV9QYWdlc0FycmF5LlJlbW92ZUFsbCgpOworICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKKyAgfQorICBtX1BhZ2VzQXJyYXkuUmVtb3ZlQWxsKCk7CisgIGlmICghbV9QYWdlT2JqTGlzdC5HZXRTaXplKCkpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkdldFBhZ2VLaWRzKENQREZfUGFyc2VyKiBwUGFyc2VyLCBDUERGX09iamVjdCogcFBhZ2VzKSB7CisgIGlmICghcFBhcnNlcikgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYWdlcy0+R2V0RGljdCgpOworICBDUERGX09iamVjdCogcEtpZHMgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJLaWRzIikpIDogTlVMTDsKKyAgaWYgKCFwS2lkcykgewogICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tIZWFkZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBGWF9EV09SRCByZXFfc2l6ZSA9IDEwMjQ7Ci0gICAgaWYgKChGWF9GSUxFU0laRSlyZXFfc2l6ZSA+IG1fZHdGaWxlTGVuKSB7Ci0gICAgICAgIHJlcV9zaXplID0gKEZYX0RXT1JEKW1fZHdGaWxlTGVuOwotICAgIH0KLSAgICBpZiAobV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbCgwLCByZXFfc2l6ZSkpIHsKLSAgICAgICAgdWludDhfdCBidWZmZXJbMTAyNF07Ci0gICAgICAgIG1fcEZpbGVSZWFkLT5SZWFkQmxvY2soYnVmZmVyLCAwLCByZXFfc2l6ZSk7Ci0gICAgICAgIGlmIChJc0xpbmVhcml6ZWRGaWxlKGJ1ZmZlciwgcmVxX3NpemUpKSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRU5EOworICB9CisgIHN3aXRjaCAocEtpZHMtPkdldFR5cGUoKSkgeworICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogeworICAgICAgQ1BERl9SZWZlcmVuY2UqIHBLaWQgPSAoQ1BERl9SZWZlcmVuY2UqKXBLaWRzOworICAgICAgbV9QYWdlT2JqTGlzdC5BZGQocEtpZC0+R2V0UmVmT2JqTnVtKCkpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBQREZPQkpfQVJSQVk6IHsKKyAgICAgIENQREZfQXJyYXkqIHBLaWRzQXJyYXkgPSAoQ1BERl9BcnJheSopcEtpZHM7CisgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZHNBcnJheS0+R2V0Q291bnQoKTsgKytpKSB7CisgICAgICAgIENQREZfT2JqZWN0KiBwS2lkID0gKENQREZfT2JqZWN0KilwS2lkc0FycmF5LT5HZXRFbGVtZW50KGkpOworICAgICAgICBpZiAocEtpZCAmJiBwS2lkLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgeworICAgICAgICAgIG1fUGFnZU9iakxpc3QuQWRkKCgoQ1BERl9SZWZlcmVuY2UqKXBLaWQpLT5HZXRSZWZPYmpOdW0oKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CisgIENQREZfT2JqZWN0KiBwUGFnZXMgPSBHZXRPYmplY3QobV9QYWdlc09iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKKyAgaWYgKCFiRXhpc3QpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFwUGFnZXMpIHsKKyAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgeworICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHBIaW50cy0+QWRkU2VnbWVudCgwLCByZXFfc2l6ZSk7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tGaXJzdFBhZ2UoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wTGluZWFyaXplZC0+R2V0RGljdCgpOwotICAgIENQREZfT2JqZWN0ICpwRW5kT2ZmU2V0ID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiRSIpKSA6IE5VTEw7Ci0gICAgaWYgKCFwRW5kT2ZmU2V0KSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX09iamVjdCAqcFhSZWZPZmZzZXQgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJUIikpIDogTlVMTDsKLSAgICBpZiAoIXBYUmVmT2Zmc2V0KSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX09iamVjdCAqcEZpbGVMZW4gPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJMIikpIDogTlVMTDsKLSAgICBpZiAoIXBGaWxlTGVuKSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9CT09MIGJOZWVkRG93bkxvYWQgPSBGQUxTRTsKLSAgICBpZiAocEVuZE9mZlNldC0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgRlhfRFdPUkQgZHdFbmQgPSBwRW5kT2ZmU2V0LT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIGR3RW5kICs9IDUxMjsKLSAgICAgICAgaWYgKChGWF9GSUxFU0laRSlkd0VuZCA+IG1fZHdGaWxlTGVuKSB7Ci0gICAgICAgICAgICBkd0VuZCA9IChGWF9EV09SRCltX2R3RmlsZUxlbjsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IGlTdGFydFBvcyA9IChpbnQzMl90KShtX2R3RmlsZUxlbiA+IDEwMjQgPyAxMDI0IDogbV9kd0ZpbGVMZW4pOwotICAgICAgICBpbnQzMl90IGlTaXplID0gZHdFbmQgPiAxMDI0ID8gZHdFbmQgLSAxMDI0IDogMDsKLSAgICAgICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKGlTdGFydFBvcywgaVNpemUpKSB7Ci0gICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQoaVN0YXJ0UG9zLCBpU2l6ZSk7Ci0gICAgICAgICAgICBiTmVlZERvd25Mb2FkID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX2R3TGFzdFhSZWZPZmZzZXQgPSAwOwotICAgIEZYX0ZJTEVTSVpFIGR3RmlsZUxlbiA9IDA7Ci0gICAgaWYgKHBYUmVmT2Zmc2V0LT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICBtX2R3TGFzdFhSZWZPZmZzZXQgPSBwWFJlZk9mZnNldC0+R2V0SW50ZWdlcigpOwotICAgIH0KLSAgICBpZiAocEZpbGVMZW4tPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgIGR3RmlsZUxlbiA9IHBGaWxlTGVuLT5HZXRJbnRlZ2VyKCk7Ci0gICAgfQotICAgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChtX2R3TGFzdFhSZWZPZmZzZXQsIChGWF9EV09SRCkoZHdGaWxlTGVuIC0gbV9kd0xhc3RYUmVmT2Zmc2V0KSkpIHsKLSAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFKQl7Ci0gICAgICAgICAgICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpKGR3RmlsZUxlbiAtIG1fZHdMYXN0WFJlZk9mZnNldCk7Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSBtX2R3TGFzdFhSZWZPZmZzZXQ7Ci0gICAgICAgICAgICBpZiAoZHdTaXplIDwgNTEyICYmIGR3RmlsZUxlbiA+IDUxMikgewotICAgICAgICAgICAgICAgIGR3U2l6ZSA9IDUxMjsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBkd0ZpbGVMZW4gLSA1MTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQob2Zmc2V0LCBkd1NpemUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRV9QUkVQQVJFOwotICAgIH0KLSAgICBpZiAoIWJOZWVkRG93bkxvYWQgJiYgbV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9GSVJTVFBBR0VfUFJFUEFSRSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9GSVJTVFBBR0VfUFJFUEFSRTsKKyAgfQorICBpZiAoIUdldFBhZ2VLaWRzKG1fcEN1cnJlbnRQYXJzZXIsIHBQYWdlcykpIHsKKyAgICBwUGFnZXMtPlJlbGVhc2UoKTsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHBQYWdlcy0+UmVsZWFzZSgpOworICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1DUERGX09iamVjdAkqIENQREZfRGF0YUF2YWlsOjpQYXJzZUluZGlyZWN0T2JqZWN0QXQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBvYmpudW0pCi17Ci0gICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX3N5bnRheFBhcnNlci5TYXZlUG9zKCk7Ci0gICAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhwb3MpOwotICAgIEZYX0JPT0wgYklzTnVtYmVyOwotICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX3N5bnRheFBhcnNlci5HZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgIGlmICghYklzTnVtYmVyKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9EV09SRCBwYXJzZXJfb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKLSAgICBpZiAob2JqbnVtICYmIHBhcnNlcl9vYmpudW0gIT0gb2JqbnVtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB3b3JkID0gbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfRFdPUkQgZ2VubnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKLSAgICBpZiAobV9zeW50YXhQYXJzZXIuR2V0S2V5d29yZCgpICE9IEZYX0JTVFJDKCJvYmoiKSkgewotICAgICAgICBtX3N5bnRheFBhcnNlci5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwT2JqID0gbV9zeW50YXhQYXJzZXIuR2V0T2JqZWN0KE5VTEwsIG9iam51bSwgZ2VubnVtLCAwKTsKLSAgICBtX3N5bnRheFBhcnNlci5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICByZXR1cm4gcE9iajsKLX0KLWludDMyX3QgQ1BERl9EYXRhQXZhaWw6OklzTGluZWFyaXplZFBERigpCi17Ci0gICAgRlhfRFdPUkQgcmVxX3NpemUgPSAxMDI0OwotICAgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbCgwLCByZXFfc2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIFBERl9VTktOT1dfTElORUFSSVpFRDsKLSAgICB9Ci0gICAgaWYgKCFtX3BGaWxlUmVhZCkgewotICAgICAgICByZXR1cm4gUERGX05PVF9MSU5FQVJJWkVEOwotICAgIH0KLSAgICBGWF9GSUxFU0laRSBkd1NpemUgPSBtX3BGaWxlUmVhZC0+R2V0U2l6ZSgpOwotICAgIGlmIChkd1NpemUgPCAoRlhfRklMRVNJWkUpcmVxX3NpemUpIHsKLSAgICAgICAgcmV0dXJuIFBERl9VTktOT1dfTElORUFSSVpFRDsKLSAgICB9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0hlYWRlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIEZYX0RXT1JEIHJlcV9zaXplID0gMTAyNDsKKyAgaWYgKChGWF9GSUxFU0laRSlyZXFfc2l6ZSA+IG1fZHdGaWxlTGVuKSB7CisgICAgcmVxX3NpemUgPSAoRlhfRFdPUkQpbV9kd0ZpbGVMZW47CisgIH0KKyAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoMCwgcmVxX3NpemUpKSB7CiAgICAgdWludDhfdCBidWZmZXJbMTAyNF07CiAgICAgbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhidWZmZXIsIDAsIHJlcV9zaXplKTsKICAgICBpZiAoSXNMaW5lYXJpemVkRmlsZShidWZmZXIsIHJlcV9zaXplKSkgewotICAgICAgICByZXR1cm4gUERGX0lTX0xJTkVBUklaRUQ7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRU5EOwogICAgIH0KLSAgICByZXR1cm4gUERGX05PVF9MSU5FQVJJWkVEOworICAgIHJldHVybiBUUlVFOworICB9CisgIHBIaW50cy0+QWRkU2VnbWVudCgwLCByZXFfc2l6ZSk7CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzTGluZWFyaXplZEZpbGUodWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3TGVuKQotewotICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHBEYXRhLCAoc2l6ZV90KWR3TGVuLCBGQUxTRSkpOwotICAgIGludDMyX3Qgb2Zmc2V0ID0gR2V0SGVhZGVyT2Zmc2V0KGZpbGUuR2V0KCkpOwotICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRmlyc3RQYWdlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKTsKKyAgQ1BERl9PYmplY3QqIHBFbmRPZmZTZXQgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJFIikpIDogTlVMTDsKKyAgaWYgKCFwRW5kT2ZmU2V0KSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX09iamVjdCogcFhSZWZPZmZzZXQgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJUIikpIDogTlVMTDsKKyAgaWYgKCFwWFJlZk9mZnNldCkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBGaWxlTGVuID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiTCIpKSA6IE5VTEw7CisgIGlmICghcEZpbGVMZW4pIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0JPT0wgYk5lZWREb3duTG9hZCA9IEZBTFNFOworICBpZiAocEVuZE9mZlNldC0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKKyAgICBGWF9EV09SRCBkd0VuZCA9IHBFbmRPZmZTZXQtPkdldEludGVnZXIoKTsKKyAgICBkd0VuZCArPSA1MTI7CisgICAgaWYgKChGWF9GSUxFU0laRSlkd0VuZCA+IG1fZHdGaWxlTGVuKSB7CisgICAgICBkd0VuZCA9IChGWF9EV09SRCltX2R3RmlsZUxlbjsKKyAgICB9CisgICAgaW50MzJfdCBpU3RhcnRQb3MgPSAoaW50MzJfdCkobV9kd0ZpbGVMZW4gPiAxMDI0ID8gMTAyNCA6IG1fZHdGaWxlTGVuKTsKKyAgICBpbnQzMl90IGlTaXplID0gZHdFbmQgPiAxMDI0ID8gZHdFbmQgLSAxMDI0IDogMDsKKyAgICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoaVN0YXJ0UG9zLCBpU2l6ZSkpIHsKKyAgICAgIHBIaW50cy0+QWRkU2VnbWVudChpU3RhcnRQb3MsIGlTaXplKTsKKyAgICAgIGJOZWVkRG93bkxvYWQgPSBUUlVFOworICAgIH0KKyAgfQorICBtX2R3TGFzdFhSZWZPZmZzZXQgPSAwOworICBGWF9GSUxFU0laRSBkd0ZpbGVMZW4gPSAwOworICBpZiAocFhSZWZPZmZzZXQtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CisgICAgbV9kd0xhc3RYUmVmT2Zmc2V0ID0gcFhSZWZPZmZzZXQtPkdldEludGVnZXIoKTsKKyAgfQorICBpZiAocEZpbGVMZW4tPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CisgICAgZHdGaWxlTGVuID0gcEZpbGVMZW4tPkdldEludGVnZXIoKTsKKyAgfQorICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9kd0xhc3RYUmVmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0RXT1JEKShkd0ZpbGVMZW4gLSBtX2R3TGFzdFhSZWZPZmZzZXQpKSkgeworICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRSkgeworICAgICAgRlhfRFdPUkQgZHdTaXplID0gKEZYX0RXT1JEKShkd0ZpbGVMZW4gLSBtX2R3TGFzdFhSZWZPZmZzZXQpOworICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gbV9kd0xhc3RYUmVmT2Zmc2V0OworICAgICAgaWYgKGR3U2l6ZSA8IDUxMiAmJiBkd0ZpbGVMZW4gPiA1MTIpIHsKKyAgICAgICAgZHdTaXplID0gNTEyOworICAgICAgICBvZmZzZXQgPSBkd0ZpbGVMZW4gLSA1MTI7CisgICAgICB9CisgICAgICBwSGludHMtPkFkZFNlZ21lbnQob2Zmc2V0LCBkd1NpemUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkU7CisgIH0KKyAgaWYgKCFiTmVlZERvd25Mb2FkICYmIG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkUpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkU7CisgIHJldHVybiBGQUxTRTsKK30KK0NQREZfT2JqZWN0KiBDUERGX0RhdGFBdmFpbDo6UGFyc2VJbmRpcmVjdE9iamVjdEF0KEZYX0ZJTEVTSVpFIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSkgeworICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fc3ludGF4UGFyc2VyLlNhdmVQb3MoKTsKKyAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhwb3MpOworICBGWF9CT09MIGJJc051bWJlcjsKKyAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKGJJc051bWJlcik7CisgIGlmICghYklzTnVtYmVyKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfRFdPUkQgcGFyc2VyX29iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CisgIGlmIChvYmpudW0gJiYgcGFyc2VyX29iam51bSAhPSBvYmpudW0pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB3b3JkID0gbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKKyAgaWYgKCFiSXNOdW1iZXIpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWF9EV09SRCBnZW5udW0gPSBGWFNZU19hdG9pKHdvcmQpOworICBpZiAobV9zeW50YXhQYXJzZXIuR2V0S2V5d29yZCgpICE9IEZYX0JTVFJDKCJvYmoiKSkgeworICAgIG1fc3ludGF4UGFyc2VyLlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfT2JqZWN0KiBwT2JqID0gbV9zeW50YXhQYXJzZXIuR2V0T2JqZWN0KE5VTEwsIG9iam51bSwgZ2VubnVtLCAwKTsKKyAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgIHJldHVybiBwT2JqOworfQoraW50MzJfdCBDUERGX0RhdGFBdmFpbDo6SXNMaW5lYXJpemVkUERGKCkgeworICBGWF9EV09SRCByZXFfc2l6ZSA9IDEwMjQ7CisgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbCgwLCByZXFfc2l6ZSkpIHsKKyAgICByZXR1cm4gUERGX1VOS05PV19MSU5FQVJJWkVEOworICB9CisgIGlmICghbV9wRmlsZVJlYWQpIHsKKyAgICByZXR1cm4gUERGX05PVF9MSU5FQVJJWkVEOworICB9CisgIEZYX0ZJTEVTSVpFIGR3U2l6ZSA9IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7CisgIGlmIChkd1NpemUgPCAoRlhfRklMRVNJWkUpcmVxX3NpemUpIHsKKyAgICByZXR1cm4gUERGX1VOS05PV19MSU5FQVJJWkVEOworICB9CisgIHVpbnQ4X3QgYnVmZmVyWzEwMjRdOworICBtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKGJ1ZmZlciwgMCwgcmVxX3NpemUpOworICBpZiAoSXNMaW5lYXJpemVkRmlsZShidWZmZXIsIHJlcV9zaXplKSkgeworICAgIHJldHVybiBQREZfSVNfTElORUFSSVpFRDsKKyAgfQorICByZXR1cm4gUERGX05PVF9MSU5FQVJJWkVEOworfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNMaW5lYXJpemVkRmlsZSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdMZW4pIHsKKyAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZSgKKyAgICAgIEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwRGF0YSwgKHNpemVfdClkd0xlbiwgRkFMU0UpKTsKKyAgaW50MzJfdCBvZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQoZmlsZS5HZXQoKSk7CisgIGlmIChvZmZzZXQgPT0gLTEpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fZHdIZWFkZXJPZmZzZXQgPSBvZmZzZXQ7CisgIG1fc3ludGF4UGFyc2VyLkluaXRQYXJzZXIoZmlsZS5HZXQoKSwgb2Zmc2V0KTsKKyAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhtX3N5bnRheFBhcnNlci5tX0hlYWRlck9mZnNldCArIDkpOworICBGWF9CT09MIGJOdW1iZXIgPSBGQUxTRTsKKyAgQ0ZYX0J5dGVTdHJpbmcgd29yZE9iak51bSA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKGJOdW1iZXIpOworICBpZiAoIWJOdW1iZXIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkT2JqTnVtKTsKKyAgaWYgKG1fcExpbmVhcml6ZWQpIHsKKyAgICBtX3BMaW5lYXJpemVkLT5SZWxlYXNlKCk7CisgICAgbV9wTGluZWFyaXplZCA9IE5VTEw7CisgIH0KKyAgbV9wTGluZWFyaXplZCA9CisgICAgICBQYXJzZUluZGlyZWN0T2JqZWN0QXQobV9zeW50YXhQYXJzZXIubV9IZWFkZXJPZmZzZXQgKyA5LCBvYmpudW0pOworICBpZiAoIW1fcExpbmVhcml6ZWQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcExpbmVhcml6ZWQtPkdldERpY3QoKSAmJgorICAgICAgbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJMaW5lYXJpemVkIikpKSB7CisgICAgQ1BERl9PYmplY3QqIHBMZW4gPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIkwiKSk7CisgICAgaWYgKCFwTGVuKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICgoRlhfRklMRVNJWkUpcExlbi0+R2V0SW50ZWdlcigpICE9IG1fcEZpbGVSZWFkLT5HZXRTaXplKCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgbV9iTGluZWFyaXplZCA9IFRSVUU7CisgICAgQ1BERl9PYmplY3QqIHBObyA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiUCIpKTsKKyAgICBpZiAocE5vICYmIHBOby0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKKyAgICAgIG1fZHdGaXJzdFBhZ2VObyA9IHBOby0+R2V0SW50ZWdlcigpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0VuZChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIEZYX0RXT1JEIHJlcV9wb3MgPSAoRlhfRFdPUkQpKG1fZHdGaWxlTGVuID4gMTAyNCA/IG1fZHdGaWxlTGVuIC0gMTAyNCA6IDApOworICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpKG1fZHdGaWxlTGVuIC0gcmVxX3Bvcyk7CisgIGlmIChtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKHJlcV9wb3MsIGR3U2l6ZSkpIHsKKyAgICB1aW50OF90IGJ1ZmZlclsxMDI0XTsKKyAgICBtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKGJ1ZmZlciwgcmVxX3BvcywgZHdTaXplKTsKKyAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKAorICAgICAgICBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oYnVmZmVyLCAoc2l6ZV90KWR3U2l6ZSwgRkFMU0UpKTsKKyAgICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIDApOworICAgIG1fc3ludGF4UGFyc2VyLlJlc3RvcmVQb3MoZHdTaXplIC0gMSk7CisgICAgaWYgKG1fc3ludGF4UGFyc2VyLlNlYXJjaFdvcmQoRlhfQlNUUkMoInN0YXJ0eHJlZiIpLCBUUlVFLCBGQUxTRSwgZHdTaXplKSkgeworICAgICAgRlhfQk9PTCBiTnVtYmVyOworICAgICAgbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoYk51bWJlcik7CisgICAgICBDRlhfQnl0ZVN0cmluZyB4cmVmcG9zX3N0ciA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKGJOdW1iZXIpOworICAgICAgaWYgKCFiTnVtYmVyKSB7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX2R3SGVhZGVyT2Zmc2V0ID0gb2Zmc2V0OwotICAgIG1fc3ludGF4UGFyc2VyLkluaXRQYXJzZXIoZmlsZS5HZXQoKSwgb2Zmc2V0KTsKLSAgICBtX3N5bnRheFBhcnNlci5SZXN0b3JlUG9zKG1fc3ludGF4UGFyc2VyLm1fSGVhZGVyT2Zmc2V0ICsgOSk7Ci0gICAgRlhfQk9PTCBiTnVtYmVyID0gRkFMU0U7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgd29yZE9iak51bSA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKGJOdW1iZXIpOwotICAgIGlmICghYk51bWJlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZE9iak51bSk7Ci0gICAgaWYgKG1fcExpbmVhcml6ZWQpIHsKLSAgICAgICAgbV9wTGluZWFyaXplZC0+UmVsZWFzZSgpOwotICAgICAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKLSAgICB9Ci0gICAgbV9wTGluZWFyaXplZCA9IFBhcnNlSW5kaXJlY3RPYmplY3RBdChtX3N5bnRheFBhcnNlci5tX0hlYWRlck9mZnNldCArIDksIG9iam51bSk7Ci0gICAgaWYgKCFtX3BMaW5lYXJpemVkKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcExpbmVhcml6ZWQtPkdldERpY3QoKSAmJiBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIkxpbmVhcml6ZWQiKSkpIHsKLSAgICAgICAgQ1BERl9PYmplY3QgKnBMZW4gPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIkwiKSk7Ci0gICAgICAgIGlmICghcExlbikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoRlhfRklMRVNJWkUpcExlbi0+R2V0SW50ZWdlcigpICE9IG1fcEZpbGVSZWFkLT5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX2JMaW5lYXJpemVkID0gVFJVRTsKLSAgICAgICAgQ1BERl9PYmplY3QgKnBObyA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiUCIpKTsKLSAgICAgICAgaWYgKHBObyAmJiBwTm8tPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgICAgICBtX2R3Rmlyc3RQYWdlTm8gPSBwTm8tPkdldEludGVnZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tFbmQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBGWF9EV09SRCByZXFfcG9zID0gKEZYX0RXT1JEKShtX2R3RmlsZUxlbiA+IDEwMjQgPyBtX2R3RmlsZUxlbiAtIDEwMjQgOiAwKTsKLSAgICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpKG1fZHdGaWxlTGVuIC0gcmVxX3Bvcyk7Ci0gICAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwocmVxX3BvcywgZHdTaXplKSkgewotICAgICAgICB1aW50OF90IGJ1ZmZlclsxMDI0XTsKLSAgICAgICAgbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhidWZmZXIsIHJlcV9wb3MsIGR3U2l6ZSk7Ci0gICAgICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGJ1ZmZlciwgKHNpemVfdClkd1NpemUsIEZBTFNFKSk7Ci0gICAgICAgIG1fc3ludGF4UGFyc2VyLkluaXRQYXJzZXIoZmlsZS5HZXQoKSwgMCk7Ci0gICAgICAgIG1fc3ludGF4UGFyc2VyLlJlc3RvcmVQb3MoZHdTaXplIC0gMSk7Ci0gICAgICAgIGlmIChtX3N5bnRheFBhcnNlci5TZWFyY2hXb3JkKEZYX0JTVFJDKCJzdGFydHhyZWYiKSwgVFJVRSwgRkFMU0UsIGR3U2l6ZSkpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYk51bWJlcjsKLSAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKGJOdW1iZXIpOwotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgeHJlZnBvc19zdHIgPSBtX3N5bnRheFBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKLSAgICAgICAgICAgIGlmICghYk51bWJlcikgewotICAgICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2R3WFJlZk9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQoeHJlZnBvc19zdHIpOwotICAgICAgICAgICAgaWYgKCFtX2R3WFJlZk9mZnNldCB8fCBtX2R3WFJlZk9mZnNldCA+IG1fZHdGaWxlTGVuKSB7Ci0gICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9kd0xhc3RYUmVmT2Zmc2V0ID0gbV9kd1hSZWZPZmZzZXQ7Ci0gICAgICAgICAgICBTZXRTdGFydE9mZnNldChtX2R3WFJlZk9mZnNldCk7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfQ1JPU1NSRUY7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQorICAgICAgfQorICAgICAgbV9kd1hSZWZPZmZzZXQgPSAoRlhfRklMRVNJWkUpRlhTWVNfYXRvaTY0KHhyZWZwb3Nfc3RyKTsKKyAgICAgIGlmICghbV9kd1hSZWZPZmZzZXQgfHwgbV9kd1hSZWZPZmZzZXQgPiBtX2R3RmlsZUxlbikgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CiAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgbV9kd0xhc3RYUmVmT2Zmc2V0ID0gbV9kd1hSZWZPZmZzZXQ7CisgICAgICBTZXRTdGFydE9mZnNldChtX2R3WFJlZk9mZnNldCk7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfQ1JPU1NSRUY7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcEhpbnRzLT5BZGRTZWdtZW50KHJlcV9wb3MsIGR3U2l6ZSk7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBwSGludHMtPkFkZFNlZ21lbnQocmVxX3BvcywgZHdTaXplKTsKKyAgcmV0dXJuIEZBTFNFOwogfQotaW50MzJfdCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBGWF9GSUxFU0laRSAmeHJlZl9vZmZzZXQpCi17Ci0gICAgeHJlZl9vZmZzZXQgPSAwOwotICAgIEZYX0RXT1JEIHJlcV9zaXplID0gKEZYX0RXT1JEKShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7Ci0gICAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9Qb3MsIHJlcV9zaXplKSkgewotICAgICAgICBpbnQzMl90IGlTaXplID0gKGludDMyX3QpKG1fUG9zICsgcmVxX3NpemUgLSBtX2R3Q3VycmVudFhSZWZTdGVhbSk7Ci0gICAgICAgIENGWF9CaW5hcnlCdWYgYnVmKGlTaXplKTsKLSAgICAgICAgdWludDhfdCogcEJ1ZiA9IGJ1Zi5HZXRCdWZmZXIoKTsKLSAgICAgICAgbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhwQnVmLCBtX2R3Q3VycmVudFhSZWZTdGVhbSwgaVNpemUpOwotICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwQnVmLCAoc2l6ZV90KWlTaXplLCBGQUxTRSkpOwotICAgICAgICBtX3BhcnNlci5tX1N5bnRheC5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIDApOwotICAgICAgICBGWF9CT09MIGJOdW1iZXIgPSBGQUxTRTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgb2JqbnVtID0gbV9wYXJzZXIubV9TeW50YXguR2V0TmV4dFdvcmQoYk51bWJlcik7Ci0gICAgICAgIGlmICghYk51bWJlcikgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIG9iak51bSA9IEZYU1lTX2F0b2kob2JqbnVtKTsKLSAgICAgICAgQ1BERl9PYmplY3QgKnBPYmogPSBtX3BhcnNlci5QYXJzZUluZGlyZWN0T2JqZWN0QXQoTlVMTCwgMCwgb2JqTnVtLCBOVUxMKTsKLSAgICAgICAgaWYgKCFwT2JqKSB7Ci0gICAgICAgICAgICBtX1BvcyArPSBtX3BhcnNlci5tX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOwotICAgICAgICBDUERGX09iamVjdCAqcE5hbWUgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJUeXBlIikpIDogTlVMTDsKLSAgICAgICAgaWYgKHBOYW1lICYmIHBOYW1lLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgICAgIGlmIChwTmFtZS0+R2V0U3RyaW5nKCkgPT0gRlhfQlNUUkMoIlhSZWYiKSkgewotICAgICAgICAgICAgICAgIG1fUG9zICs9IG1fcGFyc2VyLm1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICAgICAgICAgICAgICB4cmVmX29mZnNldCA9IHBPYmotPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiUHJldiIpKTsKLSAgICAgICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK2ludDMyX3QgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQ3Jvc3NSZWZTdHJlYW0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUmIHhyZWZfb2Zmc2V0KSB7CisgIHhyZWZfb2Zmc2V0ID0gMDsKKyAgRlhfRFdPUkQgcmVxX3NpemUgPQorICAgICAgKEZYX0RXT1JEKShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7CisgIGlmIChtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG1fUG9zLCByZXFfc2l6ZSkpIHsKKyAgICBpbnQzMl90IGlTaXplID0gKGludDMyX3QpKG1fUG9zICsgcmVxX3NpemUgLSBtX2R3Q3VycmVudFhSZWZTdGVhbSk7CisgICAgQ0ZYX0JpbmFyeUJ1ZiBidWYoaVNpemUpOworICAgIHVpbnQ4X3QqIHBCdWYgPSBidWYuR2V0QnVmZmVyKCk7CisgICAgbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhwQnVmLCBtX2R3Q3VycmVudFhSZWZTdGVhbSwgaVNpemUpOworICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoCisgICAgICAgIEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwQnVmLCAoc2l6ZV90KWlTaXplLCBGQUxTRSkpOworICAgIG1fcGFyc2VyLm1fU3ludGF4LkluaXRQYXJzZXIoZmlsZS5HZXQoKSwgMCk7CisgICAgRlhfQk9PTCBiTnVtYmVyID0gRkFMU0U7CisgICAgQ0ZYX0J5dGVTdHJpbmcgb2JqbnVtID0gbV9wYXJzZXIubV9TeW50YXguR2V0TmV4dFdvcmQoYk51bWJlcik7CisgICAgaWYgKCFiTnVtYmVyKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIEZYX0RXT1JEIG9iak51bSA9IEZYU1lTX2F0b2kob2JqbnVtKTsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IG1fcGFyc2VyLlBhcnNlSW5kaXJlY3RPYmplY3RBdChOVUxMLCAwLCBvYmpOdW0sIE5VTEwpOworICAgIGlmICghcE9iaikgeworICAgICAgbV9Qb3MgKz0gbV9wYXJzZXIubV9TeW50YXguU2F2ZVBvcygpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7CisgICAgQ1BERl9PYmplY3QqIHBOYW1lID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiVHlwZSIpKSA6IE5VTEw7CisgICAgaWYgKHBOYW1lICYmIHBOYW1lLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKKyAgICAgIGlmIChwTmFtZS0+R2V0U3RyaW5nKCkgPT0gRlhfQlNUUkMoIlhSZWYiKSkgeworICAgICAgICBtX1BvcyArPSBtX3BhcnNlci5tX1N5bnRheC5TYXZlUG9zKCk7CisgICAgICAgIHhyZWZfb2Zmc2V0ID0gcE9iai0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQcmV2IikpOwogICAgICAgICBwT2JqLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CiAgICAgfQotICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgcmVxX3NpemUpOwotICAgIHJldHVybiAwOworICAgIHBPYmotPlJlbGVhc2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcEhpbnRzLT5BZGRTZWdtZW50KG1fUG9zLCByZXFfc2l6ZSk7CisgIHJldHVybiAwOwogfQotaW5saW5lIHZvaWQgQ1BERl9EYXRhQXZhaWw6OlNldFN0YXJ0T2Zmc2V0KEZYX0ZJTEVTSVpFIGR3T2Zmc2V0KQotewotICAgIG1fUG9zID0gZHdPZmZzZXQ7CitpbmxpbmUgdm9pZCBDUERGX0RhdGFBdmFpbDo6U2V0U3RhcnRPZmZzZXQoRlhfRklMRVNJWkUgZHdPZmZzZXQpIHsKKyAgbV9Qb3MgPSBkd09mZnNldDsKIH0KICNkZWZpbmUgTUFYX1dPUkRfQlVGRkVSIDI1NgotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6R2V0TmV4dFRva2VuKENGWF9CeXRlU3RyaW5nICZ0b2tlbikKLXsKLSAgICBtX1dvcmRTaXplID0gMDsKLSAgICB1aW50OF90IGNoOwotICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpHZXROZXh0VG9rZW4oQ0ZYX0J5dGVTdHJpbmcmIHRva2VuKSB7CisgIG1fV29yZFNpemUgPSAwOworICB1aW50OF90IGNoOworICBpZiAoIUdldE5leHRDaGFyKGNoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB1aW50OF90IHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICB3aGlsZSAoMSkgeworICAgIHdoaWxlICh0eXBlID09ICdXJykgeworICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CiAgICAgfQotICAgIHVpbnQ4X3QgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgd2hpbGUgKHR5cGUgPT0gJ1cnKSB7Ci0gICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaCAhPSAnJScpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gJ0QnKSB7Ci0gICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7Ci0gICAgICAgIGlmIChjaCA9PSAnLycpIHsKLSAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSAnUicgJiYgdHlwZSAhPSAnTicpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHJldChtX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpOwotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHJldDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX1dvcmRTaXplIDwgTUFYX1dPUkRfQlVGRkVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc8JykgewotICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJzwnKSB7Ci0gICAgICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7Ci0gICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnPicpIHsKLSAgICAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX1BvcyAtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDRlhfQnl0ZVN0cmluZyByZXQobV9Xb3JkQnVmZmVyLCBtX1dvcmRTaXplKTsKLSAgICAgICAgdG9rZW4gPSByZXQ7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgIGlmIChjaCAhPSAnJScpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KICAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAobV9Xb3JkU2l6ZSA8IE1BWF9XT1JEX0JVRkZFUikgewotICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgfQorICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgIH0KKyAgaWYgKHR5cGUgPT0gJ0QnKSB7CisgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKKyAgICBpZiAoY2ggPT0gJy8nKSB7CisgICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgaWYgKHR5cGUgPT0gJ0QnIHx8IHR5cGUgPT0gJ1cnKSB7Ci0gICAgICAgICAgICBtX1BvcyAtLTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAodHlwZSAhPSAnUicgJiYgdHlwZSAhPSAnTicpIHsKKyAgICAgICAgICBtX1Bvcy0tOworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHJldChtX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpOworICAgICAgICAgIHRva2VuID0gcmV0OworICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CisgICAgICAgIGlmIChtX1dvcmRTaXplIDwgTUFYX1dPUkRfQlVGRkVSKSB7CisgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2ggPT0gJzwnKSB7CisgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoY2ggPT0gJzwnKSB7CisgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX1Bvcy0tOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7CisgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoY2ggPT0gJz4nKSB7CisgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX1Bvcy0tOworICAgICAgfQogICAgIH0KICAgICBDRlhfQnl0ZVN0cmluZyByZXQobV9Xb3JkQnVmZmVyLCBtX1dvcmRTaXplKTsKICAgICB0b2tlbiA9IHJldDsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICB3aGlsZSAoMSkgeworICAgIGlmIChtX1dvcmRTaXplIDwgTUFYX1dPUkRfQlVGRkVSKSB7CisgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOworICAgIH0KKyAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgICBpZiAodHlwZSA9PSAnRCcgfHwgdHlwZSA9PSAnVycpIHsKKyAgICAgIG1fUG9zLS07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmV0KG1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSk7CisgIHRva2VuID0gcmV0OworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkdldE5leHRDaGFyKHVpbnQ4X3QgJmNoKQotewotICAgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fUG9zOwotICAgIGlmIChwb3MgPj0gbV9kd0ZpbGVMZW4pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9idWZmZXJPZmZzZXQgPj0gcG9zIHx8IChGWF9GSUxFU0laRSkobV9idWZmZXJPZmZzZXQgKyBtX2J1ZmZlclNpemUpIDw9IHBvcykgewotICAgICAgICBGWF9GSUxFU0laRSByZWFkX3BvcyA9IHBvczsKLSAgICAgICAgRlhfRFdPUkQgcmVhZF9zaXplID0gNTEyOwotICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKXJlYWRfc2l6ZSA+IG1fZHdGaWxlTGVuKSB7Ci0gICAgICAgICAgICByZWFkX3NpemUgPSAoRlhfRFdPUkQpbV9kd0ZpbGVMZW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChGWF9GSUxFU0laRSkocmVhZF9wb3MgKyByZWFkX3NpemUpID4gbV9kd0ZpbGVMZW4pIHsKLSAgICAgICAgICAgIHJlYWRfcG9zID0gbV9kd0ZpbGVMZW4gLSByZWFkX3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKG1fYnVmZmVyRGF0YSwgcmVhZF9wb3MsIHJlYWRfc2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX2J1ZmZlck9mZnNldCA9IHJlYWRfcG9zOwotICAgICAgICBtX2J1ZmZlclNpemUgPSByZWFkX3NpemU7Ci0gICAgfQotICAgIGNoID0gbV9idWZmZXJEYXRhW3BvcyAtIG1fYnVmZmVyT2Zmc2V0XTsKLSAgICBtX1BvcyArKzsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQ3Jvc3NSZWZJdGVtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpCi17Ci0gICAgaW50MzJfdCBpU2l6ZSA9IDA7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdG9rZW47Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKCFHZXROZXh0VG9rZW4odG9rZW4pKSB7Ci0gICAgICAgICAgICBpU2l6ZSA9IChpbnQzMl90KShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7Ci0gICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9rZW4gPT0gInRyYWlsZXIiKSB7Ci0gICAgICAgICAgICBtX2R3VHJhaWxlck9mZnNldCA9IG1fUG9zOwotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVI7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWxsQ3Jvc3NSZWZTdHJlYW0oSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykKLXsKLSAgICBGWF9GSUxFU0laRSB4cmVmX29mZnNldCA9IDA7Ci0gICAgaW50MzJfdCBuUmV0ID0gQ2hlY2tDcm9zc1JlZlN0cmVhbShwSGludHMsIHhyZWZfb2Zmc2V0KTsKLSAgICBpZiAoblJldCA9PSAxKSB7Ci0gICAgICAgIGlmICgheHJlZl9vZmZzZXQpIHsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMQ1JTT1NTUkVGOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9kd0N1cnJlbnRYUmVmU3RlYW0gPSB4cmVmX29mZnNldDsKLSAgICAgICAgICAgIG1fUG9zID0geHJlZl9vZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChuUmV0ID09IC0xKSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICB9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpHZXROZXh0Q2hhcih1aW50OF90JiBjaCkgeworICBGWF9GSUxFU0laRSBwb3MgPSBtX1BvczsKKyAgaWYgKHBvcyA+PSBtX2R3RmlsZUxlbikgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9idWZmZXJPZmZzZXQgPj0gcG9zIHx8CisgICAgICAoRlhfRklMRVNJWkUpKG1fYnVmZmVyT2Zmc2V0ICsgbV9idWZmZXJTaXplKSA8PSBwb3MpIHsKKyAgICBGWF9GSUxFU0laRSByZWFkX3BvcyA9IHBvczsKKyAgICBGWF9EV09SRCByZWFkX3NpemUgPSA1MTI7CisgICAgaWYgKChGWF9GSUxFU0laRSlyZWFkX3NpemUgPiBtX2R3RmlsZUxlbikgeworICAgICAgcmVhZF9zaXplID0gKEZYX0RXT1JEKW1fZHdGaWxlTGVuOworICAgIH0KKyAgICBpZiAoKEZYX0ZJTEVTSVpFKShyZWFkX3BvcyArIHJlYWRfc2l6ZSkgPiBtX2R3RmlsZUxlbikgeworICAgICAgcmVhZF9wb3MgPSBtX2R3RmlsZUxlbiAtIHJlYWRfc2l6ZTsKKyAgICB9CisgICAgaWYgKCFtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKG1fYnVmZmVyRGF0YSwgcmVhZF9wb3MsIHJlYWRfc2l6ZSkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgbV9idWZmZXJPZmZzZXQgPSByZWFkX3BvczsKKyAgICBtX2J1ZmZlclNpemUgPSByZWFkX3NpemU7CisgIH0KKyAgY2ggPSBtX2J1ZmZlckRhdGFbcG9zIC0gbV9idWZmZXJPZmZzZXRdOworICBtX1BvcysrOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQ3Jvc3NSZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBpbnQzMl90IGlTaXplID0gMDsKLSAgICBDRlhfQnl0ZVN0cmluZyB0b2tlbjsKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQ3Jvc3NSZWZJdGVtKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgaW50MzJfdCBpU2l6ZSA9IDA7CisgIENGWF9CeXRlU3RyaW5nIHRva2VuOworICB3aGlsZSAoMSkgewogICAgIGlmICghR2V0TmV4dFRva2VuKHRva2VuKSkgewotICAgICAgICBpU2l6ZSA9IChpbnQzMl90KShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7Ci0gICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVNpemUpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBpU2l6ZSA9IChpbnQzMl90KShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7CisgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlTaXplKTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKHRva2VuID09ICJ4cmVmIikgewotICAgICAgICBtX0Nyb3NzT2Zmc2V0Lkluc2VydEF0KDAsIG1fZHdYUmVmT2Zmc2V0KTsKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGlmICghR2V0TmV4dFRva2VuKHRva2VuKSkgewotICAgICAgICAgICAgICAgIGlTaXplID0gKGludDMyX3QpKG1fUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIG1fUG9zIDogNTEyKTsKLSAgICAgICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlTaXplKTsKLSAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfQ1JPU1NSRUZfSVRFTTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodG9rZW4gPT0gInRyYWlsZXIiKSB7Ci0gICAgICAgICAgICAgICAgbV9kd1RyYWlsZXJPZmZzZXQgPSBtX1BvczsKLSAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfVFJBSUxFUjsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKHRva2VuID09ICJ0cmFpbGVyIikgeworICAgICAgbV9kd1RyYWlsZXJPZmZzZXQgPSBtX1BvczsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9UUkFJTEVSOworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgfQogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tUcmFpbGVyQXBwZW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgaWYgKG1fUG9zIDwgbV9kd0ZpbGVMZW4pIHsKLSAgICAgICAgRlhfRklMRVNJWkUgZHdBcHBlbmRQb3MgPSBtX1BvcyArIG1fc3ludGF4UGFyc2VyLlNhdmVQb3MoKTsKLSAgICAgICAgaW50MzJfdCBpU2l6ZSA9IChpbnQzMl90KShkd0FwcGVuZFBvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBkd0FwcGVuZFBvcyA6IDUxMik7Ci0gICAgICAgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChkd0FwcGVuZFBvcywgaVNpemUpKSB7Ci0gICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQoZHdBcHBlbmRQb3MsIGlTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9kd1ByZXZYUmVmT2Zmc2V0KSB7Ci0gICAgICAgIFNldFN0YXJ0T2Zmc2V0KG1fZHdQcmV2WFJlZk9mZnNldCk7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9DUk9TU1JFRjsKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWxsQ3Jvc3NSZWZTdHJlYW0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBGWF9GSUxFU0laRSB4cmVmX29mZnNldCA9IDA7CisgIGludDMyX3QgblJldCA9IENoZWNrQ3Jvc3NSZWZTdHJlYW0ocEhpbnRzLCB4cmVmX29mZnNldCk7CisgIGlmIChuUmV0ID09IDEpIHsKKyAgICBpZiAoIXhyZWZfb2Zmc2V0KSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTENSU09TU1JFRjsKICAgICB9IGVsc2UgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTENSU09TU1JFRjsKKyAgICAgIG1fZHdDdXJyZW50WFJlZlN0ZWFtID0geHJlZl9vZmZzZXQ7CisgICAgICBtX1BvcyA9IHhyZWZfb2Zmc2V0OwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoblJldCA9PSAtMSkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1RyYWlsZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBpbnQzMl90IGlUcmFpbGVyU2l6ZSA9IChpbnQzMl90KShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7Ci0gICAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9Qb3MsIGlUcmFpbGVyU2l6ZSkpIHsKLSAgICAgICAgaW50MzJfdCBpU2l6ZSA9IChpbnQzMl90KShtX1BvcyArIGlUcmFpbGVyU2l6ZSAtIG1fZHdUcmFpbGVyT2Zmc2V0KTsKLSAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiBidWYoaVNpemUpOwotICAgICAgICB1aW50OF90KiBwQnVmID0gYnVmLkdldEJ1ZmZlcigpOwotICAgICAgICBpZiAoIXBCdWYpIHsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1fcEZpbGVSZWFkLT5SZWFkQmxvY2socEJ1ZiwgbV9kd1RyYWlsZXJPZmZzZXQsIGlTaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIENGWF9TbWFydFBvaW50ZXI8SUZYX0ZpbGVTdHJlYW0+IGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHBCdWYsIChzaXplX3QpaVNpemUsIEZBTFNFKSk7Ci0gICAgICAgIG1fc3ludGF4UGFyc2VyLkluaXRQYXJzZXIoZmlsZS5HZXQoKSwgMCk7Ci0gICAgICAgIENQREZfT2JqZWN0ICpwVHJhaWxlciA9IG1fc3ludGF4UGFyc2VyLkdldE9iamVjdChOVUxMLCAwLCAwLCAwKTsKLSAgICAgICAgaWYgKCFwVHJhaWxlcikgewotICAgICAgICAgICAgbV9Qb3MgKz0gbV9zeW50YXhQYXJzZXIuU2F2ZVBvcygpOwotICAgICAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KG1fUG9zLCBpVHJhaWxlclNpemUpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwVHJhaWxlci0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwVHJhaWxlckRpY3QgPSBwVHJhaWxlci0+R2V0RGljdCgpOwotICAgICAgICBpZiAocFRyYWlsZXJEaWN0KSB7Ci0gICAgICAgICAgICBDUERGX09iamVjdCAqcEVuY3J5cHQgPSBwVHJhaWxlckRpY3QtPkdldEVsZW1lbnQoIkVuY3J5cHQiKTsKLSAgICAgICAgICAgIGlmIChwRW5jcnlwdCAmJiBwRW5jcnlwdC0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICAgICAgcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCB4cmVmcG9zID0gR2V0RGlyZWN0SW50ZWdlcihwVHJhaWxlci0+R2V0RGljdCgpLCBGWF9CU1RSQygiUHJldiIpKTsKLSAgICAgICAgaWYgKHhyZWZwb3MpIHsKLSAgICAgICAgICAgIG1fZHdQcmV2WFJlZk9mZnNldCA9IEdldERpcmVjdEludGVnZXIocFRyYWlsZXItPkdldERpY3QoKSwgRlhfQlNUUkMoIlhSZWZTdG0iKSk7Ci0gICAgICAgICAgICBwVHJhaWxlci0+UmVsZWFzZSgpOwotICAgICAgICAgICAgaWYgKG1fZHdQcmV2WFJlZk9mZnNldCkgewotICAgICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0geHJlZnBvczsKLSAgICAgICAgICAgICAgICBpZiAobV9kd1ByZXZYUmVmT2Zmc2V0ID49IG1fZHdGaWxlTGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTZXRTdGFydE9mZnNldChtX2R3UHJldlhSZWZPZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfVFJBSUxFUl9BUFBFTkQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0gMDsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVJfQVBQRU5EOworRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tDcm9zc1JlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGludDMyX3QgaVNpemUgPSAwOworICBDRlhfQnl0ZVN0cmluZyB0b2tlbjsKKyAgaWYgKCFHZXROZXh0VG9rZW4odG9rZW4pKSB7CisgICAgaVNpemUgPSAoaW50MzJfdCkobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOworICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVNpemUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAodG9rZW4gPT0gInhyZWYiKSB7CisgICAgbV9Dcm9zc09mZnNldC5JbnNlcnRBdCgwLCBtX2R3WFJlZk9mZnNldCk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGlmICghR2V0TmV4dFRva2VuKHRva2VuKSkgeworICAgICAgICBpU2l6ZSA9CisgICAgICAgICAgICAoaW50MzJfdCkobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOworICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlTaXplKTsKKyAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0NST1NTUkVGX0lURU07CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmICh0b2tlbiA9PSAidHJhaWxlciIpIHsKKyAgICAgICAgbV9kd1RyYWlsZXJPZmZzZXQgPSBtX1BvczsKKyAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVI7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tUcmFpbGVyQXBwZW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgaWYgKG1fUG9zIDwgbV9kd0ZpbGVMZW4pIHsKKyAgICBGWF9GSUxFU0laRSBkd0FwcGVuZFBvcyA9IG1fUG9zICsgbV9zeW50YXhQYXJzZXIuU2F2ZVBvcygpOworICAgIGludDMyX3QgaVNpemUgPSAoaW50MzJfdCkoCisgICAgICAgIGR3QXBwZW5kUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIGR3QXBwZW5kUG9zIDogNTEyKTsKKyAgICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoZHdBcHBlbmRQb3MsIGlTaXplKSkgeworICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KGR3QXBwZW5kUG9zLCBpU2l6ZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIGlmIChtX2R3UHJldlhSZWZPZmZzZXQpIHsKKyAgICBTZXRTdGFydE9mZnNldChtX2R3UHJldlhSZWZPZmZzZXQpOworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9DUk9TU1JFRjsKKyAgfSBlbHNlIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTENSU09TU1JFRjsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVHJhaWxlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGludDMyX3QgaVRyYWlsZXJTaXplID0KKyAgICAgIChpbnQzMl90KShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7CisgIGlmIChtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG1fUG9zLCBpVHJhaWxlclNpemUpKSB7CisgICAgaW50MzJfdCBpU2l6ZSA9IChpbnQzMl90KShtX1BvcyArIGlUcmFpbGVyU2l6ZSAtIG1fZHdUcmFpbGVyT2Zmc2V0KTsKKyAgICBDRlhfQmluYXJ5QnVmIGJ1ZihpU2l6ZSk7CisgICAgdWludDhfdCogcEJ1ZiA9IGJ1Zi5HZXRCdWZmZXIoKTsKKyAgICBpZiAoIXBCdWYpIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKHBCdWYsIG1fZHdUcmFpbGVyT2Zmc2V0LCBpU2l6ZSkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZSgKKyAgICAgICAgRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHBCdWYsIChzaXplX3QpaVNpemUsIEZBTFNFKSk7CisgICAgbV9zeW50YXhQYXJzZXIuSW5pdFBhcnNlcihmaWxlLkdldCgpLCAwKTsKKyAgICBDUERGX09iamVjdCogcFRyYWlsZXIgPSBtX3N5bnRheFBhcnNlci5HZXRPYmplY3QoTlVMTCwgMCwgMCwgMCk7CisgICAgaWYgKCFwVHJhaWxlcikgeworICAgICAgbV9Qb3MgKz0gbV9zeW50YXhQYXJzZXIuU2F2ZVBvcygpOworICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KG1fUG9zLCBpVHJhaWxlclNpemUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAocFRyYWlsZXItPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBUcmFpbGVyRGljdCA9IHBUcmFpbGVyLT5HZXREaWN0KCk7CisgICAgaWYgKHBUcmFpbGVyRGljdCkgeworICAgICAgQ1BERl9PYmplY3QqIHBFbmNyeXB0ID0gcFRyYWlsZXJEaWN0LT5HZXRFbGVtZW50KCJFbmNyeXB0Iik7CisgICAgICBpZiAocEVuY3J5cHQgJiYgcEVuY3J5cHQtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKICAgICAgICAgcFRyYWlsZXItPlJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CiAgICAgfQotICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVRyYWlsZXJTaXplKTsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICB3aGlsZSAoVFJVRSkgewotICAgICAgICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7Ci0gICAgICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRVRSRUU6Ci0gICAgICAgICAgICAgICAgaWYgKCFMb2FkRG9jUGFnZXMocEhpbnRzKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0U6Ci0gICAgICAgICAgICAgICAgaWYgKCFMb2FkRG9jUGFnZShpUGFnZSwgcEhpbnRzKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiBMb2FkQWxsRmlsZShwSGludHMpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBtX2JQYWdlc1RyZWVMb2FkID0gVFJVRTsKLSAgICAgICAgICAgICAgICBtX2JQYWdlc0xvYWQgPSBUUlVFOwotICAgICAgICAgICAgICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gVFJVRTsKLSAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBGWF9EV09SRCB4cmVmcG9zID0gR2V0RGlyZWN0SW50ZWdlcihwVHJhaWxlci0+R2V0RGljdCgpLCBGWF9CU1RSQygiUHJldiIpKTsKKyAgICBpZiAoeHJlZnBvcykgeworICAgICAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0KKyAgICAgICAgICBHZXREaXJlY3RJbnRlZ2VyKHBUcmFpbGVyLT5HZXREaWN0KCksIEZYX0JTVFJDKCJYUmVmU3RtIikpOworICAgICAgcFRyYWlsZXItPlJlbGVhc2UoKTsKKyAgICAgIGlmIChtX2R3UHJldlhSZWZPZmZzZXQpIHsKKyAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0geHJlZnBvczsKKyAgICAgICAgaWYgKG1fZHdQcmV2WFJlZk9mZnNldCA+PSBtX2R3RmlsZUxlbikgeworICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTZXRTdGFydE9mZnNldChtX2R3UHJldlhSZWZPZmZzZXQpOworICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9UUkFJTEVSX0FQUEVORDsKICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotfQotRlhfQk9PTAlDUERGX0RhdGFBdmFpbDo6Q2hlY2tBcnJheVBhZ2VOb2RlKEZYX0RXT1JEIGR3UGFnZU5vLCBDUERGX1BhZ2VOb2RlICpwUGFnZU5vZGUsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKLSAgICBDUERGX09iamVjdCAqcFBhZ2VzID0gR2V0T2JqZWN0KGR3UGFnZU5vLCBwSGludHMsICZiRXhpc3QpOwotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIXBQYWdlcykgewotICAgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBQYWdlcy0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX1BBR0VTOwotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwUGFnZXM7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgKytpKSB7Ci0gICAgICAgIENQREZfT2JqZWN0ICpwS2lkID0gKENQREZfT2JqZWN0ICopcEFycmF5LT5HZXRFbGVtZW50KGkpOwotICAgICAgICBpZiAoIXBLaWQgfHwgcEtpZC0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfUGFnZU5vZGUgKnBOb2RlID0gbmV3IENQREZfUGFnZU5vZGUoKTsKLSAgICAgICAgcFBhZ2VOb2RlLT5tX2NoaWxkTm9kZS5BZGQocE5vZGUpOwotICAgICAgICBwTm9kZS0+bV9kd1BhZ2VObyA9ICgoQ1BERl9SZWZlcmVuY2UqKXBLaWQpLT5HZXRSZWZPYmpOdW0oKTsKLSAgICB9Ci0gICAgcFBhZ2VzLT5SZWxlYXNlKCk7CisgICAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0gMDsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfVFJBSUxFUl9BUFBFTkQ7CisgICAgcFRyYWlsZXItPlJlbGVhc2UoKTsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlUcmFpbGVyU2l6ZSk7CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVW5rb3duUGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwotICAgIENQREZfT2JqZWN0ICpwUGFnZSA9IEdldE9iamVjdChkd1BhZ2VObywgcEhpbnRzLCAmYkV4aXN0KTsKLSAgICBpZiAoIWJFeGlzdCkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCFwUGFnZSkgewotICAgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7CisgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRVRSRUU6CisgICAgICAgIGlmICghTG9hZERvY1BhZ2VzKHBIaW50cykpIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocFBhZ2UtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcFBhZ2VOb2RlLT5tX2R3UGFnZU5vID0gZHdQYWdlTm87Ci0gICAgICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX0FSUkFZOwotICAgICAgICBwUGFnZS0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKHBQYWdlLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcFBhZ2UtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBQYWdlTm9kZS0+bV9kd1BhZ2VObyA9IGR3UGFnZU5vOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFnZS0+R2V0RGljdCgpOwotICAgIENGWF9CeXRlU3RyaW5nIHR5cGUgPSBwRGljdCA/IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSkgOiBDRlhfQnl0ZVN0cmluZygpOwotICAgIGlmICh0eXBlID09IEZYX0JTVFJDKCJQYWdlcyIpKSB7Ci0gICAgICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX1BBR0VTOwotICAgICAgICBDUERGX09iamVjdCAqcEtpZHMgPSBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiS2lkcyIpKTsKLSAgICAgICAgaWYgKCFwS2lkcykgewotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRToKKyAgICAgICAgaWYgKCFMb2FkRG9jUGFnZShpUGFnZSwgcEhpbnRzKSkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHBLaWRzLT5HZXRUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogewotICAgICAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSAqcEtpZCA9IChDUERGX1JlZmVyZW5jZSAqKXBLaWRzOwotICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VOb2RlICpwTm9kZSA9IG5ldyBDUERGX1BhZ2VOb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHBQYWdlTm9kZS0+bV9jaGlsZE5vZGUuQWRkKHBOb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgcE5vZGUtPm1fZHdQYWdlTm8gPSBwS2lkLT5HZXRSZWZPYmpOdW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5ICpwS2lkc0FycmF5ID0gKENQREZfQXJyYXkgKilwS2lkczsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzQXJyYXktPkdldENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QgKnBLaWQgPSAoQ1BERl9PYmplY3QgKilwS2lkc0FycmF5LT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwS2lkIHx8IHBLaWQtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VOb2RlICpwTm9kZSA9IG5ldyBDUERGX1BhZ2VOb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFnZU5vZGUtPm1fY2hpbGROb2RlLkFkZChwTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS0+bV9kd1BhZ2VObyA9ICgoQ1BERl9SZWZlcmVuY2UqKXBLaWQpLT5HZXRSZWZPYmpOdW0oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRlhfQlNUUkMoIlBhZ2UiKSkgewotICAgICAgICBwUGFnZU5vZGUtPm1fdHlwZSA9IFBERl9QQUdFTk9ERV9QQUdFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBQYWdlLT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwUGFnZS0+UmVsZWFzZSgpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlTm9kZShDUERGX1BhZ2VOb2RlICZwYWdlTm9kZXMsIGludDMyX3QgaVBhZ2UsIGludDMyX3QgJmlDb3VudCwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBpbnQzMl90IGlTaXplID0gcGFnZU5vZGVzLm1fY2hpbGROb2RlLkdldFNpemUoKTsKLSAgICBpZiAoaVNpemUgPD0gMCB8fCBpUGFnZSA+PSBpU2l6ZSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewotICAgICAgICBDUERGX1BhZ2VOb2RlICpwTm9kZSA9IChDUERGX1BhZ2VOb2RlKilwYWdlTm9kZXMubV9jaGlsZE5vZGUuR2V0QXQoaSk7Ci0gICAgICAgIGlmICghcE5vZGUpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAocE5vZGUtPm1fdHlwZSkgewotICAgICAgICAgICAgY2FzZSBQREZfUEFHRU5PREVfVU5LT1dOOgotICAgICAgICAgICAgICAgIGlmICghQ2hlY2tVbmtvd25QYWdlTm9kZShwTm9kZS0+bV9kd1BhZ2VObywgcE5vZGUsIHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAtLWk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBERl9QQUdFTk9ERV9QQUdFOgotICAgICAgICAgICAgICAgIGlDb3VudCsrOwotICAgICAgICAgICAgICAgIGlmIChpUGFnZSA9PSBpQ291bnQgJiYgbV9wRG9jdW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPm1fUGFnZUxpc3QuU2V0QXQoaVBhZ2UsIHBOb2RlLT5tX2R3UGFnZU5vKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBERl9QQUdFTk9ERV9QQUdFUzoKLSAgICAgICAgICAgICAgICBpZiAoIUNoZWNrUGFnZU5vZGUoKnBOb2RlLCBpUGFnZSwgaUNvdW50LCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBERl9QQUdFTk9ERV9BUlJBWToKLSAgICAgICAgICAgICAgICBpZiAoIUNoZWNrQXJyYXlQYWdlTm9kZShwTm9kZS0+bV9kd1BhZ2VObywgcE5vZGUsIHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAtLWk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlQYWdlID09IGlDb3VudCkgewotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkxvYWREb2NQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgaWYgKG1fcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSA8PSBpUGFnZSB8fCBtX3BEb2N1bWVudC0+bV9QYWdlTGlzdC5HZXRBdChpUGFnZSkpIHsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAobV9wYWdlTm9kZXMubV90eXBlID09IFBERl9QQUdFTk9ERV9QQUdFKSB7Ci0gICAgICAgIGlmIChpUGFnZSA9PSAwKSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGludDMyX3QgaUNvdW50ID0gLTE7Ci0gICAgcmV0dXJuIENoZWNrUGFnZU5vZGUobV9wYWdlTm9kZXMsIGlQYWdlLCBpQ291bnQsIHBIaW50cyk7Ci19Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VDb3VudChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7Ci0gICAgQ1BERl9PYmplY3QgKnBQYWdlcyA9IEdldE9iamVjdChtX1BhZ2VzT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOwotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIXBQYWdlcykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzRGljdCA9IHBQYWdlcy0+R2V0RGljdCgpOwotICAgIGlmICghcFBhZ2VzRGljdCkgewotICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICghcFBhZ2VzRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKLSAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpbnQgY291bnQgPSBwUGFnZXNEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJDb3VudCIpKTsKLSAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgIHBQYWdlcy0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgaWYgKCFDaGVja1Vua293blBhZ2VOb2RlKG1fUGFnZXNPYmpOdW0sICZtX3BhZ2VOb2RlcywgcEhpbnRzKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChDaGVja1BhZ2VDb3VudChwSGludHMpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgorICAgICAgICByZXR1cm4gTG9hZEFsbEZpbGUocEhpbnRzKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBUUlVFOworICAgICAgICBtX2JQYWdlc0xvYWQgPSBUUlVFOworICAgICAgICBtX2JDdXJQYWdlRGljdExvYWRPSyA9IFRSVUU7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFOwogICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgbV9iVG90YWxMb2FkUGFnZVRyZWUgPSBUUlVFOworICB9Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0FycmF5UGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlTm9kZSogcFBhZ2VOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgQ1BERl9PYmplY3QqIHBQYWdlcyA9IEdldE9iamVjdChkd1BhZ2VObywgcEhpbnRzLCAmYkV4aXN0KTsKKyAgaWYgKCFiRXhpc3QpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZFBhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgd2hpbGUgKCFtX2JQYWdlc1RyZWVMb2FkKSB7Ci0gICAgICAgIGlmICghQ2hlY2tQYWdlU3RhdHVzKHBIaW50cykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQorICB9CisgIGlmICghcFBhZ2VzKSB7CisgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKG1fYlBhZ2VzTG9hZCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgbV9wRG9jdW1lbnQtPkxvYWRQYWdlcygpOwogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocFBhZ2VzLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CisgICAgcFBhZ2VzLT5SZWxlYXNlKCk7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBwUGFnZU5vZGUtPm1fdHlwZSA9IFBERl9QQUdFTk9ERV9QQUdFUzsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBQYWdlczsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgKytpKSB7CisgICAgQ1BERl9PYmplY3QqIHBLaWQgPSAoQ1BERl9PYmplY3QqKXBBcnJheS0+R2V0RWxlbWVudChpKTsKKyAgICBpZiAoIXBLaWQgfHwgcEtpZC0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDUERGX1BhZ2VOb2RlKiBwTm9kZSA9IG5ldyBDUERGX1BhZ2VOb2RlKCk7CisgICAgcFBhZ2VOb2RlLT5tX2NoaWxkTm9kZS5BZGQocE5vZGUpOworICAgIHBOb2RlLT5tX2R3UGFnZU5vID0gKChDUERGX1JlZmVyZW5jZSopcEtpZCktPkdldFJlZk9iak51bSgpOworICB9CisgIHBQYWdlcy0+UmVsZWFzZSgpOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrTGluZWFyaXplZERhdGEoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBpZiAobV9iTGluZWFyZWREYXRhT0spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1Vua293blBhZ2VOb2RlKEZYX0RXT1JEIGR3UGFnZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VOb2RlKiBwUGFnZU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgQ1BERl9PYmplY3QqIHBQYWdlID0gR2V0T2JqZWN0KGR3UGFnZU5vLCBwSGludHMsICZiRXhpc3QpOworICBpZiAoIWJFeGlzdCkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFwUGFnZSkgeworICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotCi0gICAgaWYgKCFtX2JNYWluWFJlZkxvYWRUcmllZCkgewotICAgICAgICBGWF9TQUZFX0RXT1JEIGRhdGFfc2l6ZSA9IG1fZHdGaWxlTGVuOwotICAgICAgICBkYXRhX3NpemUgLT0gbV9kd0xhc3RYUmVmT2Zmc2V0OwotICAgICAgICBpZiAoIWRhdGFfc2l6ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9kd0xhc3RYUmVmT2Zmc2V0LCBkYXRhX3NpemUuVmFsdWVPckRpZSgpKSkgewotICAgICAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KG1fZHdMYXN0WFJlZk9mZnNldCwgZGF0YV9zaXplLlZhbHVlT3JEaWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgZHdSZXQgPSAoKENQREZfUGFyc2VyICopbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpKS0+TG9hZExpbmVhcml6ZWRNYWluWFJlZlRhYmxlKCk7Ci0gICAgICAgIG1fYk1haW5YUmVmTG9hZFRyaWVkID0gVFJVRTsKLSAgICAgICAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVByZXBhcmVQYWdlSXRlbSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9iTWFpblhSZWZMb2FkZWRPSyA9IFRSVUU7Ci0gICAgICAgIG1fYkxpbmVhcmVkRGF0YU9LICAgPSBUUlVFOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocFBhZ2UtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICBwUGFnZU5vZGUtPm1fZHdQYWdlTm8gPSBkd1BhZ2VObzsKKyAgICBwUGFnZU5vZGUtPm1fdHlwZSA9IFBERl9QQUdFTk9ERV9BUlJBWTsKKyAgICBwUGFnZS0+UmVsZWFzZSgpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChwUGFnZS0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgcFBhZ2UtPlJlbGVhc2UoKTsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHBQYWdlTm9kZS0+bV9kd1BhZ2VObyA9IGR3UGFnZU5vOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhZ2UtPkdldERpY3QoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9CisgICAgICBwRGljdCA/IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSkgOiBDRlhfQnl0ZVN0cmluZygpOworICBpZiAodHlwZSA9PSBGWF9CU1RSQygiUGFnZXMiKSkgeworICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX1BBR0VTOworICAgIENQREZfT2JqZWN0KiBwS2lkcyA9IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJLaWRzIikpOworICAgIGlmICghcEtpZHMpIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFOworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotCi0gICAgcmV0dXJuIG1fYkxpbmVhcmVkRGF0YU9LOworICAgIHN3aXRjaCAocEtpZHMtPkdldFR5cGUoKSkgeworICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CisgICAgICAgIENQREZfUmVmZXJlbmNlKiBwS2lkID0gKENQREZfUmVmZXJlbmNlKilwS2lkczsKKyAgICAgICAgQ1BERl9QYWdlTm9kZSogcE5vZGUgPSBuZXcgQ1BERl9QYWdlTm9kZSgpOworICAgICAgICBwUGFnZU5vZGUtPm1fY2hpbGROb2RlLkFkZChwTm9kZSk7CisgICAgICAgIHBOb2RlLT5tX2R3UGFnZU5vID0gcEtpZC0+R2V0UmVmT2JqTnVtKCk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBQREZPQkpfQVJSQVk6IHsKKyAgICAgICAgQ1BERl9BcnJheSogcEtpZHNBcnJheSA9IChDUERGX0FycmF5KilwS2lkczsKKyAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzQXJyYXktPkdldENvdW50KCk7ICsraSkgeworICAgICAgICAgIENQREZfT2JqZWN0KiBwS2lkID0gKENQREZfT2JqZWN0KilwS2lkc0FycmF5LT5HZXRFbGVtZW50KGkpOworICAgICAgICAgIGlmICghcEtpZCB8fCBwS2lkLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIENQREZfUGFnZU5vZGUqIHBOb2RlID0gbmV3IENQREZfUGFnZU5vZGUoKTsKKyAgICAgICAgICBwUGFnZU5vZGUtPm1fY2hpbGROb2RlLkFkZChwTm9kZSk7CisgICAgICAgICAgcE5vZGUtPm1fZHdQYWdlTm8gPSAoKENQREZfUmVmZXJlbmNlKilwS2lkKS0+R2V0UmVmT2JqTnVtKCk7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZSA9PSBGWF9CU1RSQygiUGFnZSIpKSB7CisgICAgcFBhZ2VOb2RlLT5tX3R5cGUgPSBQREZfUEFHRU5PREVfUEFHRTsKKyAgfSBlbHNlIHsKKyAgICBwUGFnZS0+UmVsZWFzZSgpOworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcFBhZ2UtPlJlbGVhc2UoKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VBbm5vdHMoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBpZiAoIW1fb2Jqc19hcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwotICAgICAgICBtX29iam51bV9hcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwUGFnZURpY3QgPSBtX3BEb2N1bWVudC0+R2V0UGFnZShpUGFnZSk7Ci0gICAgICAgIGlmICghcFBhZ2VEaWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCAqcEFubm90cyA9IHBQYWdlRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiQW5ub3RzIikpOwotICAgICAgICBpZiAoIXBBbm5vdHMpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIENGWF9QdHJBcnJheSBvYmpfYXJyYXk7Ci0gICAgICAgIG9ial9hcnJheS5BZGQocEFubm90cyk7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgRkFMU0UsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKLSAgICAgICAgaWYgKGJSZXQpIHsKLSAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYlJldDsKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZU5vZGUoQ1BERl9QYWdlTm9kZSYgcGFnZU5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgaW50MzJfdCBpU2l6ZSA9IHBhZ2VOb2Rlcy5tX2NoaWxkTm9kZS5HZXRTaXplKCk7CisgIGlmIChpU2l6ZSA8PSAwIHx8IGlQYWdlID49IGlTaXplKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7CisgICAgQ1BERl9QYWdlTm9kZSogcE5vZGUgPSAoQ1BERl9QYWdlTm9kZSopcGFnZU5vZGVzLm1fY2hpbGROb2RlLkdldEF0KGkpOworICAgIGlmICghcE5vZGUpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBDRlhfUHRyQXJyYXkgbmV3X29ianNfYXJyYXk7Ci0gICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CisgICAgc3dpdGNoIChwTm9kZS0+bV90eXBlKSB7CisgICAgICBjYXNlIFBERl9QQUdFTk9ERV9VTktPV046CisgICAgICAgIGlmICghQ2hlY2tVbmtvd25QYWdlTm9kZShwTm9kZS0+bV9kd1BhZ2VObywgcE5vZGUsIHBIaW50cykpIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLS1pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUERGX1BBR0VOT0RFX1BBR0U6CisgICAgICAgIGlDb3VudCsrOworICAgICAgICBpZiAoaVBhZ2UgPT0gaUNvdW50ICYmIG1fcERvY3VtZW50KSB7CisgICAgICAgICAgbV9wRG9jdW1lbnQtPm1fUGFnZUxpc3QuU2V0QXQoaVBhZ2UsIHBOb2RlLT5tX2R3UGFnZU5vKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUERGX1BBR0VOT0RFX1BBR0VTOgorICAgICAgICBpZiAoIUNoZWNrUGFnZU5vZGUoKnBOb2RlLCBpUGFnZSwgaUNvdW50LCBwSGludHMpKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQREZfUEFHRU5PREVfQVJSQVk6CisgICAgICAgIGlmICghQ2hlY2tBcnJheVBhZ2VOb2RlKHBOb2RlLT5tX2R3UGFnZU5vLCBwTm9kZSwgcEhpbnRzKSkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAtLWk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaVBhZ2UgPT0gaUNvdW50KSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkxvYWREb2NQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgaWYgKG1fcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSA8PSBpUGFnZSB8fAorICAgICAgbV9wRG9jdW1lbnQtPm1fUGFnZUxpc3QuR2V0QXQoaVBhZ2UpKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKG1fcGFnZU5vZGVzLm1fdHlwZSA9PSBQREZfUEFHRU5PREVfUEFHRSkgeworICAgIGlmIChpUGFnZSA9PSAwKSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaW50MzJfdCBpQ291bnQgPSAtMTsKKyAgcmV0dXJuIENoZWNrUGFnZU5vZGUobV9wYWdlTm9kZXMsIGlQYWdlLCBpQ291bnQsIHBIaW50cyk7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VDb3VudChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CisgIENQREZfT2JqZWN0KiBwUGFnZXMgPSBHZXRPYmplY3QobV9QYWdlc09iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKKyAgaWYgKCFiRXhpc3QpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcFBhZ2VzKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzRGljdCA9IHBQYWdlcy0+R2V0RGljdCgpOworICBpZiAoIXBQYWdlc0RpY3QpIHsKKyAgICBwUGFnZXMtPlJlbGVhc2UoKTsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcFBhZ2VzRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKKyAgICBwUGFnZXMtPlJlbGVhc2UoKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpbnQgY291bnQgPSBwUGFnZXNEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJDb3VudCIpKTsKKyAgaWYgKGNvdW50ID4gMCkgeworICAgIHBQYWdlcy0+UmVsZWFzZSgpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHBQYWdlcy0+UmVsZWFzZSgpOworICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpMb2FkRG9jUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBpZiAoIUNoZWNrVW5rb3duUGFnZU5vZGUobV9QYWdlc09iak51bSwgJm1fcGFnZU5vZGVzLCBwSGludHMpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChDaGVja1BhZ2VDb3VudChwSGludHMpKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgbV9iVG90YWxMb2FkUGFnZVRyZWUgPSBUUlVFOworICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpMb2FkUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICB3aGlsZSAoIW1fYlBhZ2VzVHJlZUxvYWQpIHsKKyAgICBpZiAoIUNoZWNrUGFnZVN0YXR1cyhwSGludHMpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIGlmIChtX2JQYWdlc0xvYWQpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBtX3BEb2N1bWVudC0+TG9hZFBhZ2VzKCk7CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrTGluZWFyaXplZERhdGEoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBpZiAobV9iTGluZWFyZWREYXRhT0spIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmICghbV9iTWFpblhSZWZMb2FkVHJpZWQpIHsKKyAgICBGWF9TQUZFX0RXT1JEIGRhdGFfc2l6ZSA9IG1fZHdGaWxlTGVuOworICAgIGRhdGFfc2l6ZSAtPSBtX2R3TGFzdFhSZWZPZmZzZXQ7CisgICAgaWYgKCFkYXRhX3NpemUuSXNWYWxpZCgpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChtX2R3TGFzdFhSZWZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZS5WYWx1ZU9yRGllKCkpKSB7CisgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9kd0xhc3RYUmVmT2Zmc2V0LCBkYXRhX3NpemUuVmFsdWVPckRpZSgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgRlhfRFdPUkQgZHdSZXQgPQorICAgICAgICAoKENQREZfUGFyc2VyKiltX3BEb2N1bWVudC0+R2V0UGFyc2VyKCkpLT5Mb2FkTGluZWFyaXplZE1haW5YUmVmVGFibGUoKTsKKyAgICBtX2JNYWluWFJlZkxvYWRUcmllZCA9IFRSVUU7CisgICAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFQcmVwYXJlUGFnZUl0ZW0oKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBtX2JNYWluWFJlZkxvYWRlZE9LID0gVFJVRTsKKyAgICBtX2JMaW5lYXJlZERhdGFPSyA9IFRSVUU7CisgIH0KKworICByZXR1cm4gbV9iTGluZWFyZWREYXRhT0s7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VBbm5vdHMoaW50MzJfdCBpUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgewogICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKLSAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CisgICAgbV9vYmpudW1fYXJyYXkuUmVtb3ZlQWxsKCk7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBtX3BEb2N1bWVudC0+R2V0UGFnZShpUGFnZSk7CisgICAgaWYgKCFwUGFnZURpY3QpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBDUERGX09iamVjdCogcEFubm90cyA9IHBQYWdlRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiQW5ub3RzIikpOworICAgIGlmICghcEFubm90cykgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIENGWF9QdHJBcnJheSBvYmpfYXJyYXk7CisgICAgb2JqX2FycmF5LkFkZChwQW5ub3RzKTsKKyAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIEZBTFNFLCBwSGludHMsIG1fb2Jqc19hcnJheSk7CisgICAgaWYgKGJSZXQpIHsKKyAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKICAgICB9CiAgICAgcmV0dXJuIGJSZXQ7CisgIH0KKyAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OworICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChtX29ianNfYXJyYXksIEZBTFNFLCBwSGludHMsIG5ld19vYmpzX2FycmF5KTsKKyAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOworICBpZiAoIWJSZXQpIHsKKyAgICBtX29ianNfYXJyYXkuQXBwZW5kKG5ld19vYmpzX2FycmF5KTsKKyAgfQorICByZXR1cm4gYlJldDsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrTGluZWFyaXplZEZpcnN0UGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIGlmICghbV9iQW5ub3RzTG9hZCkgewotICAgICAgICBpZiAoIUNoZWNrUGFnZUFubm90cyhpUGFnZSwgcEhpbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1fYkFubm90c0xvYWQgPSBUUlVFOworRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tMaW5lYXJpemVkRmlyc3RQYWdlKGludDMyX3QgaVBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBpZiAoIW1fYkFubm90c0xvYWQpIHsKKyAgICBpZiAoIUNoZWNrUGFnZUFubm90cyhpUGFnZSwgcEhpbnRzKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZiAobV9iQW5ub3RzTG9hZCkgewotICAgICAgICBpZiAoIUNoZWNrTGluZWFyaXplZERhdGEocEhpbnRzKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9iUGFnZUxvYWRlZE9LID0gRkFMU0U7CisgICAgbV9iQW5ub3RzTG9hZCA9IFRSVUU7CisgIH0KKyAgaWYgKG1fYkFubm90c0xvYWQpIHsKKyAgICBpZiAoIUNoZWNrTGluZWFyaXplZERhdGEocEhpbnRzKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX2JQYWdlTG9hZGVkT0sgPSBGQUxTRTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpIYXZlUmVzb3VyY2VBbmNlc3RvcihDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7CisgIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGgpOworICBpZiAoKytzX0N1cnJlbnREYXRhQXZhaWxSZWN1cnNpb25EZXB0aCA+IGtNYXhEYXRhQXZhaWxSZWN1cnNpb25EZXB0aCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX09iamVjdCogcFBhcmVudCA9IHBEaWN0LT5HZXRFbGVtZW50KCJQYXJlbnQiKTsKKyAgaWYgKCFwUGFyZW50KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFBhcmVudERpY3QgPSBwUGFyZW50LT5HZXREaWN0KCk7CisgIGlmICghcFBhcmVudERpY3QpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBSZXQgPSBwUGFyZW50RGljdC0+R2V0RWxlbWVudCgiUmVzb3VyY2VzIik7CisgIGlmIChwUmV0KSB7CisgICAgbV9wUGFnZVJlc291cmNlID0gcFJldDsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gSGF2ZVJlc291cmNlQW5jZXN0b3IocFBhcmVudERpY3QpOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SGF2ZVJlc291cmNlQW5jZXN0b3IoQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCkKLXsKLSAgICBDRlhfQXV0b1Jlc3RvcmVyPGludD4gcmVzdG9yZXIoJnNfQ3VycmVudERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoKTsKLSAgICBpZiAoKytzX0N1cnJlbnREYXRhQXZhaWxSZWN1cnNpb25EZXB0aCA+IGtNYXhEYXRhQXZhaWxSZWN1cnNpb25EZXB0aCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfT2JqZWN0ICpwUGFyZW50ID0gcERpY3QtPkdldEVsZW1lbnQoIlBhcmVudCIpOwotICAgIGlmICghcFBhcmVudCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSAqcFBhcmVudERpY3QgPSBwUGFyZW50LT5HZXREaWN0KCk7Ci0gICAgaWYgKCFwUGFyZW50RGljdCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfT2JqZWN0ICpwUmV0ID0gcFBhcmVudERpY3QtPkdldEVsZW1lbnQoIlJlc291cmNlcyIpOwotICAgIGlmIChwUmV0KSB7Ci0gICAgICAgIG1fcFBhZ2VSZXNvdXJjZSA9IHBSZXQ7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gSGF2ZVJlc291cmNlQW5jZXN0b3IocFBhcmVudERpY3QpOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNQYWdlQXZhaWwoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBpZiAoIW1fcERvY3VtZW50KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKElzRmlyc3RDaGVjayhpUGFnZSkpIHsKLSAgICAgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKLSAgICAgICAgbV9iUGFnZUxvYWRlZE9LID0gRkFMU0U7Ci0gICAgICAgIG1fYkFubm90c0xvYWQgPSBGQUxTRTsKLSAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBGQUxTRTsKLSAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwotICAgICAgICBtX29iam51bV9hcnJheS5SZW1vdmVBbGwoKTsKLSAgICB9Ci0gICAgaWYgKG1fcGFnZXNMb2FkU3RhdGUgPT0gTlVMTCkgewotICAgICAgICBtX3BhZ2VzTG9hZFN0YXRlID0gbmV3IENGWF9DTWFwRFdvcmRUb0RXb3JkKCk7Ci0gICAgfQotICAgIEZYX0RXT1JEIGR3UGFnZUxvYWQgPSAwOwotICAgIGlmIChtX3BhZ2VzTG9hZFN0YXRlLT5Mb29rdXAoaVBhZ2UsIGR3UGFnZUxvYWQpICYmIGR3UGFnZUxvYWQgIT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKG1fYkxpbmVhcml6ZWQpIHsKLSAgICAgICAgaWYgKChGWF9EV09SRClpUGFnZSA9PSBtX2R3Rmlyc3RQYWdlTm8pIHsKLSAgICAgICAgICAgIG1fcGFnZXNMb2FkU3RhdGUtPlNldEF0KGlQYWdlLCBUUlVFKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghQ2hlY2tMaW5lYXJpemVkRGF0YShwSGludHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fYk1haW5YUmVmTG9hZGVkT0spIHsKLSAgICAgICAgICAgIGlmIChtX2JUb3RhbExvYWRQYWdlVHJlZSkgewotICAgICAgICAgICAgICAgIGlmICghTG9hZFBhZ2VzKHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX2JDdXJQYWdlRGljdExvYWRPSyAmJiAhQ2hlY2tQYWdlKGlQYWdlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIUxvYWRBbGxGaWxlKHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKENQREZfUGFyc2VyICopbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpKS0+UmVidWlsZENyb3NzUmVmKCk7Ci0gICAgICAgICAgICBSZXNldEZpcnN0Q2hlY2soaVBhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIW1fYlRvdGFsTG9hZFBhZ2VUcmVlKSB7Ci0gICAgICAgICAgICBpZiAoIW1fYkN1clBhZ2VEaWN0TG9hZE9LICYmICFDaGVja1BhZ2UoaVBhZ2UsIHBIaW50cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fYkhhdmVBY3JvRm9ybSAmJiAhbV9iQWNyb0Zvcm1Mb2FkKSB7Ci0gICAgICAgIGlmICghQ2hlY2tBY3JvRm9ybVN1Yk9iamVjdChwSGludHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9iQWNyb0Zvcm1Mb2FkID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCFtX2JQYWdlTG9hZGVkT0spIHsKLSAgICAgICAgaWYgKCFtX29ianNfYXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICBtX29iam51bV9hcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIG1fcFBhZ2VEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2UoaVBhZ2UpOwotICAgICAgICAgICAgaWYgKCFtX3BQYWdlRGljdCkgewotICAgICAgICAgICAgICAgIFJlc2V0Rmlyc3RDaGVjayhpUGFnZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OwotICAgICAgICAgICAgb2JqX2FycmF5LkFkZChtX3BQYWdlRGljdCk7Ci0gICAgICAgICAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIFRSVUUsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKLSAgICAgICAgICAgIGlmIChiUmV0KSB7Ci0gICAgICAgICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgIG1fYlBhZ2VMb2FkZWRPSyA9IFRSVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBiUmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgICAgICAgICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7Ci0gICAgICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICBpZiAoYlJldCkgewotICAgICAgICAgICAgICAgIG1fYlBhZ2VMb2FkZWRPSyA9IFRSVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fb2Jqc19hcnJheS5BcHBlbmQobmV3X29ianNfYXJyYXkpOwotICAgICAgICAgICAgICAgIHJldHVybiBiUmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX2JQYWdlTG9hZGVkT0spIHsKLSAgICAgICAgaWYgKCFtX2JBbm5vdHNMb2FkKSB7Ci0gICAgICAgICAgICBpZiAoIUNoZWNrUGFnZUFubm90cyhpUGFnZSwgcEhpbnRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fYkFubm90c0xvYWQgPSBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX3BQYWdlRGljdCAmJiAhbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UpIHsKLSAgICAgICAgbV9wUGFnZVJlc291cmNlID0gbV9wUGFnZURpY3QtPkdldEVsZW1lbnQoIlJlc291cmNlcyIpOwotICAgICAgICBpZiAoIW1fcFBhZ2VSZXNvdXJjZSkgewotICAgICAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBIYXZlUmVzb3VyY2VBbmNlc3RvcihtX3BQYWdlRGljdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fYk5lZWREb3duTG9hZFJlc291cmNlKSB7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IENoZWNrUmVzb3VyY2VzKHBIaW50cyk7Ci0gICAgICAgIGlmICghYlJldCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gRkFMU0U7Ci0gICAgfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNQYWdlQXZhaWwoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBpZiAoIW1fcERvY3VtZW50KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChJc0ZpcnN0Q2hlY2soaVBhZ2UpKSB7CisgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKICAgICBtX2JQYWdlTG9hZGVkT0sgPSBGQUxTRTsKICAgICBtX2JBbm5vdHNMb2FkID0gRkFMU0U7Ci0gICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKLSAgICBSZXNldEZpcnN0Q2hlY2soaVBhZ2UpOwotICAgIG1fcGFnZXNMb2FkU3RhdGUtPlNldEF0KGlQYWdlLCBUUlVFKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUmVzb3VyY2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgaWYgKCFtX29ianNfYXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IG9ial9hcnJheTsKLSAgICAgICAgb2JqX2FycmF5LkFkZChtX3BQYWdlUmVzb3VyY2UpOwotICAgICAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIFRSVUUsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKLSAgICAgICAgaWYgKGJSZXQpIHsKLSAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYlJldDsKLSAgICB9Ci0gICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gRkFMU0U7CiAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwotICAgIGlmICghYlJldCkgeworICAgIG1fb2JqbnVtX2FycmF5LlJlbW92ZUFsbCgpOworICB9CisgIGlmIChtX3BhZ2VzTG9hZFN0YXRlID09IE5VTEwpIHsKKyAgICBtX3BhZ2VzTG9hZFN0YXRlID0gbmV3IENGWF9DTWFwRFdvcmRUb0RXb3JkKCk7CisgIH0KKyAgRlhfRFdPUkQgZHdQYWdlTG9hZCA9IDA7CisgIGlmIChtX3BhZ2VzTG9hZFN0YXRlLT5Mb29rdXAoaVBhZ2UsIGR3UGFnZUxvYWQpICYmIGR3UGFnZUxvYWQgIT0gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChtX2JMaW5lYXJpemVkKSB7CisgICAgaWYgKChGWF9EV09SRClpUGFnZSA9PSBtX2R3Rmlyc3RQYWdlTm8pIHsKKyAgICAgIG1fcGFnZXNMb2FkU3RhdGUtPlNldEF0KGlQYWdlLCBUUlVFKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAoIUNoZWNrTGluZWFyaXplZERhdGEocEhpbnRzKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAobV9iTWFpblhSZWZMb2FkZWRPSykgeworICAgICAgaWYgKG1fYlRvdGFsTG9hZFBhZ2VUcmVlKSB7CisgICAgICAgIGlmICghTG9hZFBhZ2VzKHBIaW50cykpIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbV9iQ3VyUGFnZURpY3RMb2FkT0sgJiYgIUNoZWNrUGFnZShpUGFnZSwgcEhpbnRzKSkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUxvYWRBbGxGaWxlKHBIaW50cykpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgKChDUERGX1BhcnNlciopbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpKS0+UmVidWlsZENyb3NzUmVmKCk7CisgICAgICBSZXNldEZpcnN0Q2hlY2soaVBhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghbV9iVG90YWxMb2FkUGFnZVRyZWUpIHsKKyAgICAgIGlmICghbV9iQ3VyUGFnZURpY3RMb2FkT0sgJiYgIUNoZWNrUGFnZShpUGFnZSwgcEhpbnRzKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChtX2JIYXZlQWNyb0Zvcm0gJiYgIW1fYkFjcm9Gb3JtTG9hZCkgeworICAgIGlmICghQ2hlY2tBY3JvRm9ybVN1Yk9iamVjdChwSGludHMpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIG1fYkFjcm9Gb3JtTG9hZCA9IFRSVUU7CisgIH0KKyAgaWYgKCFtX2JQYWdlTG9hZGVkT0spIHsKKyAgICBpZiAoIW1fb2Jqc19hcnJheS5HZXRTaXplKCkpIHsKKyAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKKyAgICAgIG1fb2JqbnVtX2FycmF5LlJlbW92ZUFsbCgpOworICAgICAgbV9wUGFnZURpY3QgPSBtX3BEb2N1bWVudC0+R2V0UGFnZShpUGFnZSk7CisgICAgICBpZiAoIW1fcFBhZ2VEaWN0KSB7CisgICAgICAgIFJlc2V0Rmlyc3RDaGVjayhpUGFnZSk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgQ0ZYX1B0ckFycmF5IG9ial9hcnJheTsKKyAgICAgIG9ial9hcnJheS5BZGQobV9wUGFnZURpY3QpOworICAgICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBUUlVFLCBwSGludHMsIG1fb2Jqc19hcnJheSk7CisgICAgICBpZiAoYlJldCkgeworICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CisgICAgICAgIG1fYlBhZ2VMb2FkZWRPSyA9IFRSVUU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYlJldDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OworICAgICAgRlhfQk9PTCBiUmV0ID0KKyAgICAgICAgICBJc09iamVjdHNBdmFpbChtX29ianNfYXJyYXksIEZBTFNFLCBwSGludHMsIG5ld19vYmpzX2FycmF5KTsKKyAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKKyAgICAgIGlmIChiUmV0KSB7CisgICAgICAgIG1fYlBhZ2VMb2FkZWRPSyA9IFRSVUU7CisgICAgICB9IGVsc2UgewogICAgICAgICBtX29ianNfYXJyYXkuQXBwZW5kKG5ld19vYmpzX2FycmF5KTsKKyAgICAgICAgcmV0dXJuIGJSZXQ7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChtX2JQYWdlTG9hZGVkT0spIHsKKyAgICBpZiAoIW1fYkFubm90c0xvYWQpIHsKKyAgICAgIGlmICghQ2hlY2tQYWdlQW5ub3RzKGlQYWdlLCBwSGludHMpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIG1fYkFubm90c0xvYWQgPSBUUlVFOworICAgIH0KKyAgfQorICBpZiAobV9wUGFnZURpY3QgJiYgIW1fYk5lZWREb3duTG9hZFJlc291cmNlKSB7CisgICAgbV9wUGFnZVJlc291cmNlID0gbV9wUGFnZURpY3QtPkdldEVsZW1lbnQoIlJlc291cmNlcyIpOworICAgIGlmICghbV9wUGFnZVJlc291cmNlKSB7CisgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEhhdmVSZXNvdXJjZUFuY2VzdG9yKG1fcFBhZ2VEaWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBUUlVFOworICAgIH0KKyAgfQorICBpZiAobV9iTmVlZERvd25Mb2FkUmVzb3VyY2UpIHsKKyAgICBGWF9CT09MIGJSZXQgPSBDaGVja1Jlc291cmNlcyhwSGludHMpOworICAgIGlmICghYlJldCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEZBTFNFOworICB9CisgIG1fYlBhZ2VMb2FkZWRPSyA9IEZBTFNFOworICBtX2JBbm5vdHNMb2FkID0gRkFMU0U7CisgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gRkFMU0U7CisgIFJlc2V0Rmlyc3RDaGVjayhpUGFnZSk7CisgIG1fcGFnZXNMb2FkU3RhdGUtPlNldEF0KGlQYWdlLCBUUlVFKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1Jlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgeworICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKKyAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OworICAgIG9ial9hcnJheS5BZGQobV9wUGFnZVJlc291cmNlKTsKKyAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIFRSVUUsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKKyAgICBpZiAoYlJldCkgeworICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgIH0KICAgICByZXR1cm4gYlJldDsKKyAgfQorICBDRlhfUHRyQXJyYXkgbmV3X29ianNfYXJyYXk7CisgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CisgIGlmICghYlJldCkgeworICAgIG1fb2Jqc19hcnJheS5BcHBlbmQobmV3X29ianNfYXJyYXkpOworICB9CisgIHJldHVybiBiUmV0OwogfQotdm9pZCBDUERGX0RhdGFBdmFpbDo6R2V0TGluZWFyaXplZE1haW5YUmVmSW5mbyhGWF9GSUxFU0laRSAqcFBvcywgRlhfRFdPUkQgKnBTaXplKQotewotICAgIGlmIChwUG9zKSB7Ci0gICAgICAgICpwUG9zID0gbV9kd0xhc3RYUmVmT2Zmc2V0OwotICAgIH0KLSAgICBpZiAocFNpemUpIHsKLSAgICAgICAgKnBTaXplID0gKEZYX0RXT1JEKShtX2R3RmlsZUxlbiAtIG1fZHdMYXN0WFJlZk9mZnNldCk7Ci0gICAgfQordm9pZCBDUERGX0RhdGFBdmFpbDo6R2V0TGluZWFyaXplZE1haW5YUmVmSW5mbyhGWF9GSUxFU0laRSogcFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBTaXplKSB7CisgIGlmIChwUG9zKSB7CisgICAgKnBQb3MgPSBtX2R3TGFzdFhSZWZPZmZzZXQ7CisgIH0KKyAgaWYgKHBTaXplKSB7CisgICAgKnBTaXplID0gKEZYX0RXT1JEKShtX2R3RmlsZUxlbiAtIG1fZHdMYXN0WFJlZk9mZnNldCk7CisgIH0KIH0KLWludDMyX3QgQ1BERl9EYXRhQXZhaWw6OklzRm9ybUF2YWlsKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpCi17Ci0gICAgaWYgKCFtX3BEb2N1bWVudCkgewotICAgICAgICByZXR1cm4gUERGRk9STV9BVkFJTDsKLSAgICB9Ci0gICAgaWYgKCFtX2JMaW5lYXJpemVkRm9ybVBhcmFtTG9hZCkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKLSAgICAgICAgaWYgKCFwUm9vdCkgewotICAgICAgICAgICAgcmV0dXJuIFBERkZPUk1fQVZBSUw7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QgKnBBY3JvRm9ybSA9IHBSb290LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJBY3JvRm9ybSIpKTsKLSAgICAgICAgaWYgKCFwQWNyb0Zvcm0pIHsKLSAgICAgICAgICAgIHJldHVybiBQREZGT1JNX05PVEVYSVNUOwotICAgICAgICB9Ci0gICAgICAgIGlmICghQ2hlY2tMaW5lYXJpemVkRGF0YShwSGludHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGRk9STV9OT1RBVkFJTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1fb2Jqc19hcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgIG1fb2Jqc19hcnJheS5BZGQocEFjcm9Gb3JtLT5HZXREaWN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIG1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkID0gVFJVRTsKLSAgICB9Ci0gICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOwotICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKLSAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7Ci0gICAgICAgIHJldHVybiBQREZGT1JNX05PVEFWQUlMOwotICAgIH0KK2ludDMyX3QgQ1BERl9EYXRhQXZhaWw6OklzRm9ybUF2YWlsKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgaWYgKCFtX3BEb2N1bWVudCkgewogICAgIHJldHVybiBQREZGT1JNX0FWQUlMOwotfQotdm9pZCBDUERGX1NvcnRPYmpOdW1BcnJheTo6QWRkT2JqTnVtKEZYX0RXT1JEIGR3T2JqTnVtKQotewotICAgIGludDMyX3QgaU5leHQgPSAwOwotICAgIGlmIChCaW5hcnlTZWFyY2goZHdPYmpOdW0sIGlOZXh0KSkgewotICAgICAgICByZXR1cm47CisgIH0KKyAgaWYgKCFtX2JMaW5lYXJpemVkRm9ybVBhcmFtTG9hZCkgeworICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOworICAgIGlmICghcFJvb3QpIHsKKyAgICAgIHJldHVybiBQREZGT1JNX0FWQUlMOwogICAgIH0KLSAgICBtX251bWJlcl9hcnJheS5JbnNlcnRBdChpTmV4dCwgZHdPYmpOdW0pOwotfQotRlhfQk9PTCBDUERGX1NvcnRPYmpOdW1BcnJheTo6RmluZChGWF9EV09SRCBkd09iak51bSkKLXsKLSAgICBpbnQzMl90IGlOZXh0ID0gMDsKLSAgICByZXR1cm4gQmluYXJ5U2VhcmNoKGR3T2JqTnVtLCBpTmV4dCk7Ci19Ci1GWF9CT09MIENQREZfU29ydE9iak51bUFycmF5OjpCaW5hcnlTZWFyY2goRlhfRFdPUkQgdmFsdWUsIGludDMyX3QgJmlOZXh0KQotewotICAgIGludDMyX3QgaUxvdyA9IDA7Ci0gICAgaW50MzJfdCBpSGlnaCA9IG1fbnVtYmVyX2FycmF5LkdldFNpemUoKSAtIDE7Ci0gICAgd2hpbGUgKGlMb3cgPD0gaUhpZ2gpIHsKLSAgICAgICAgaW50MzJfdCBpTWlkID0gKGlMb3cgKyBpSGlnaCkgLyAyOwotICAgICAgICBpZiAobV9udW1iZXJfYXJyYXkuR2V0QXQoaU1pZCkgPT0gdmFsdWUpIHsKLSAgICAgICAgICAgIGlOZXh0ID0gaU1pZDsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX251bWJlcl9hcnJheS5HZXRBdChpTWlkKSA+IHZhbHVlKSB7Ci0gICAgICAgICAgICBpSGlnaCA9IGlNaWQgLSAxOwotICAgICAgICB9IGVsc2UgaWYgKG1fbnVtYmVyX2FycmF5LkdldEF0KGlNaWQpIDwgdmFsdWUpIHsKLSAgICAgICAgICAgIGlMb3cgPSBpTWlkICsgMTsKLSAgICAgICAgfQorICAgIENQREZfT2JqZWN0KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RWxlbWVudChGWF9CU1RSQygiQWNyb0Zvcm0iKSk7CisgICAgaWYgKCFwQWNyb0Zvcm0pIHsKKyAgICAgIHJldHVybiBQREZGT1JNX05PVEVYSVNUOwogICAgIH0KLSAgICBpTmV4dCA9IGlMb3c7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotQ1BERl9QYWdlTm9kZTo6fkNQREZfUGFnZU5vZGUoKQotewotICAgIGludDMyX3QgaVNpemUgPSBtX2NoaWxkTm9kZS5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewotICAgICAgICBDUERGX1BhZ2VOb2RlKiBwTm9kZSA9IChDUERGX1BhZ2VOb2RlKiltX2NoaWxkTm9kZVtpXTsKLSAgICAgICAgZGVsZXRlIHBOb2RlOworICAgIGlmICghQ2hlY2tMaW5lYXJpemVkRGF0YShwSGludHMpKSB7CisgICAgICByZXR1cm4gUERGRk9STV9OT1RBVkFJTDsKICAgICB9Ci0gICAgbV9jaGlsZE5vZGUuUmVtb3ZlQWxsKCk7CisgICAgaWYgKCFtX29ianNfYXJyYXkuR2V0U2l6ZSgpKSB7CisgICAgICBtX29ianNfYXJyYXkuQWRkKHBBY3JvRm9ybS0+R2V0RGljdCgpKTsKKyAgICB9CisgICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQgPSBUUlVFOworICB9CisgIENGWF9QdHJBcnJheSBuZXdfb2Jqc19hcnJheTsKKyAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CisgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKKyAgaWYgKCFiUmV0KSB7CisgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CisgICAgcmV0dXJuIFBERkZPUk1fTk9UQVZBSUw7CisgIH0KKyAgcmV0dXJuIFBERkZPUk1fQVZBSUw7Cit9Cit2b2lkIENQREZfU29ydE9iak51bUFycmF5OjpBZGRPYmpOdW0oRlhfRFdPUkQgZHdPYmpOdW0pIHsKKyAgaW50MzJfdCBpTmV4dCA9IDA7CisgIGlmIChCaW5hcnlTZWFyY2goZHdPYmpOdW0sIGlOZXh0KSkgeworICAgIHJldHVybjsKKyAgfQorICBtX251bWJlcl9hcnJheS5JbnNlcnRBdChpTmV4dCwgZHdPYmpOdW0pOworfQorRlhfQk9PTCBDUERGX1NvcnRPYmpOdW1BcnJheTo6RmluZChGWF9EV09SRCBkd09iak51bSkgeworICBpbnQzMl90IGlOZXh0ID0gMDsKKyAgcmV0dXJuIEJpbmFyeVNlYXJjaChkd09iak51bSwgaU5leHQpOworfQorRlhfQk9PTCBDUERGX1NvcnRPYmpOdW1BcnJheTo6QmluYXJ5U2VhcmNoKEZYX0RXT1JEIHZhbHVlLCBpbnQzMl90JiBpTmV4dCkgeworICBpbnQzMl90IGlMb3cgPSAwOworICBpbnQzMl90IGlIaWdoID0gbV9udW1iZXJfYXJyYXkuR2V0U2l6ZSgpIC0gMTsKKyAgd2hpbGUgKGlMb3cgPD0gaUhpZ2gpIHsKKyAgICBpbnQzMl90IGlNaWQgPSAoaUxvdyArIGlIaWdoKSAvIDI7CisgICAgaWYgKG1fbnVtYmVyX2FycmF5LkdldEF0KGlNaWQpID09IHZhbHVlKSB7CisgICAgICBpTmV4dCA9IGlNaWQ7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaWYgKG1fbnVtYmVyX2FycmF5LkdldEF0KGlNaWQpID4gdmFsdWUpIHsKKyAgICAgIGlIaWdoID0gaU1pZCAtIDE7CisgICAgfSBlbHNlIGlmIChtX251bWJlcl9hcnJheS5HZXRBdChpTWlkKSA8IHZhbHVlKSB7CisgICAgICBpTG93ID0gaU1pZCArIDE7CisgICAgfQorICB9CisgIGlOZXh0ID0gaUxvdzsKKyAgcmV0dXJuIEZBTFNFOworfQorQ1BERl9QYWdlTm9kZTo6fkNQREZfUGFnZU5vZGUoKSB7CisgIGludDMyX3QgaVNpemUgPSBtX2NoaWxkTm9kZS5HZXRTaXplKCk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsKKyAgICBDUERGX1BhZ2VOb2RlKiBwTm9kZSA9IChDUERGX1BhZ2VOb2RlKiltX2NoaWxkTm9kZVtpXTsKKyAgICBkZWxldGUgcE5vZGU7CisgIH0KKyAgbV9jaGlsZE5vZGUuUmVtb3ZlQWxsKCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlcl9lbWJlZGRlcnRlc3QuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXJfZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCA4ODJhOTE1Li45NmVhNzY2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlcl9lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyX2VtYmVkZGVydGVzdC5jcHAKQEAgLTUsOCArNSw3IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vdGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKLWNsYXNzIEZQREZQYXJzZXJFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHsKLX07CitjbGFzcyBGUERGUGFyc2VyRW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7fTsKIAogVEVTVF9GKEZQREZQYXJzZXJFbWJlZGRlcnRlc3QsIExvYWRFcnJvcl80NTQ2OTUpIHsKICAgLy8gVGVzdCB0cmFpbGVyIGRpY3Rpb25hcnkgd2l0aCAkJHplIGluc3RlYWQgb2YgU2l6ZS4KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3V0aWxpdHkuY3BwCmluZGV4IDQ5MDMzMTIuLjllMTQzNDEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmNwcApAQCAtNiw0NzUgKzYsNDc5IEBACiAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKIGNvbnN0IGNoYXIgUERGX0NoYXJUeXBlWzI1Nl0gPSB7Ci0gIC8vTlVMICBTT0ggIFNUWCAgRVRYICBFT1QgIEVOUSAgQUNLICBCRUwgIEJTICAgSFQgICBMRiAgIFZUICAgRkYgICBDUiAgIFNPICAgU0kKLSAgICAnVycsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnVycsICdXJywgJ1InLCAnVycsICdXJywgJ1InLCAnUicsCisgICAgLy8gTlVMICBTT0ggIFNUWCAgRVRYICBFT1QgIEVOUSAgQUNLICBCRUwgIEJTICAgSFQgICBMRiAgIFZUICAgRkYgICBDUiAgIFNPCisgICAgLy8gU0kKKyAgICAnVycsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnVycsICdXJywgJ1InLCAnVycsICdXJywgJ1InLAorICAgICdSJywKIAotICAvL0RMRSAgREMxICBEQzIgIERDMyAgREM0ICBOQUsgIFNZTiAgRVRCICBDQU4gIEVNICAgU1VCICBFU0MgIEZTICAgR1MgICBSUyAgIFVTCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgIC8vIERMRSAgREMxICBEQzIgIERDMyAgREM0ICBOQUsgIFNZTiAgRVRCICBDQU4gIEVNICAgU1VCICBFU0MgIEZTICAgR1MgICBSUworICAgIC8vIFVTCisgICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywKKyAgICAnUicsCiAKLSAgLy9TUCAgICAhICAgICIgICAgIyAgICAkICAgICUgICAgJiAgICDCtCAgICAoICAgICkgICAgKiAgICArICAgICwgICAgLSAgICAuICAgIC8KLSAgICAnVycsICdSJywgJ1InLCAnUicsICdSJywgJ0QnLCAnUicsICdSJywgJ0QnLCAnRCcsICdSJywgJ04nLCAnUicsICdOJywgJ04nLCAnRCcsCisgICAgLy8gU1AgICAgISAgICAiICAgICMgICAgJCAgICAlICAgICYgICAgwrQgICAgKCAgICApICAgICogICAgKyAgICAsICAgIC0gICAgLgorICAgIC8vIC8KKyAgICAnVycsICdSJywgJ1InLCAnUicsICdSJywgJ0QnLCAnUicsICdSJywgJ0QnLCAnRCcsICdSJywgJ04nLCAnUicsICdOJywgJ04nLAorICAgICdEJywKIAotICAvLyAwICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDogICAgOyAgICA8ICAgID0gICAgPiAgICA/Ci0gICAgJ04nLCAnTicsICdOJywgJ04nLCAnTicsICdOJywgJ04nLCAnTicsICdOJywgJ04nLCAnUicsICdSJywgJ0QnLCAnUicsICdEJywgJ1InLAorICAgIC8vIDAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgOiAgICA7ICAgIDwgICAgPSAgICA+ID8KKyAgICAnTicsICdOJywgJ04nLCAnTicsICdOJywgJ04nLCAnTicsICdOJywgJ04nLCAnTicsICdSJywgJ1InLCAnRCcsICdSJywgJ0QnLAorICAgICdSJywKIAotICAvLyBAICAgIEEgICAgQiAgICBDICAgIEQgICAgRSAgICBGICAgIEcgICAgSCAgICBJICAgIEogICAgSyAgICBMICAgIE0gICAgTiAgICBPCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgIC8vIEAgICAgQSAgICBCICAgIEMgICAgRCAgICBFICAgIEYgICAgRyAgICBIICAgIEkgICAgSiAgICBLICAgIEwgICAgTSAgICBOIE8KKyAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgICdSJywKIAotICAvLyBQICAgIFEgICAgUiAgICBTICAgIFQgICAgVSAgICBWICAgIFcgICAgWCAgICBZICAgIFogICAgWyAgICBcICAgIF0gICAgXiAgICBfCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdEJywgJ1InLCAnRCcsICdSJywgJ1InLAorICAgIC8vIFAgICAgUSAgICBSICAgIFMgICAgVCAgICBVICAgIFYgICAgVyAgICBYICAgIFkgICAgWiAgICBbICAgIFwgICAgXSAgICBeIF8KKyAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ0QnLCAnUicsICdEJywgJ1InLAorICAgICdSJywKIAotICAvLyBgICAgIGEgICAgYiAgICBjICAgIGQgICAgZSAgICBmICAgIGcgICAgaCAgICBpICAgIGogICAgayAgICBsICAgIG0gICAgbiAgICBvCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgIC8vIGAgICAgYSAgICBiICAgIGMgICAgZCAgICBlICAgIGYgICAgZyAgICBoICAgIGkgICAgaiAgICBrICAgIGwgICAgbSAgICBuIG8KKyAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgICdSJywKIAotICAvLyBwICAgIHEgICAgciAgICBzICAgIHQgICAgdSAgICB2ICAgIHcgICAgeCAgICB5ICAgIHogICAgeyAgICB8ICAgIH0gICAgfiAgIERFTAotICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnRCcsICdSJywgJ0QnLCAnUicsICdSJywKKyAgICAvLyBwICAgIHEgICAgciAgICBzICAgIHQgICAgdSAgICB2ICAgIHcgICAgeCAgICB5ICAgIHogICAgeyAgICB8ICAgIH0gICAgfgorICAgIC8vIERFTAorICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnRCcsICdSJywgJ0QnLCAnUicsCisgICAgJ1InLAogCi0gICAgJ1cnLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAotICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywKLSAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAotICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywKLSAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAotICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdXJwotfTsKKyAgICAnVycsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsCisgICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywKKyAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsCisgICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywKKyAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsCisgICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnVyd9OwogCiAjaWZuZGVmIE1BWF9QQVRICiAjZGVmaW5lIE1BWF9QQVRIIDQwOTYKICNlbmRpZgotQ1BERl9TaW1wbGVQYXJzZXI6OkNQREZfU2ltcGxlUGFyc2VyKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpCi17Ci0gICAgbV9wRGF0YSA9IHBEYXRhOwotICAgIG1fZHdTaXplID0gZHdTaXplOwotICAgIG1fZHdDdXJQb3MgPSAwOworQ1BERl9TaW1wbGVQYXJzZXI6OkNQREZfU2ltcGxlUGFyc2VyKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpIHsKKyAgbV9wRGF0YSA9IHBEYXRhOworICBtX2R3U2l6ZSA9IGR3U2l6ZTsKKyAgbV9kd0N1clBvcyA9IDA7CiB9Ci1DUERGX1NpbXBsZVBhcnNlcjo6Q1BERl9TaW1wbGVQYXJzZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpCi17Ci0gICAgbV9wRGF0YSA9IHN0ci5HZXRQdHIoKTsKLSAgICBtX2R3U2l6ZSA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgICBtX2R3Q3VyUG9zID0gMDsKK0NQREZfU2ltcGxlUGFyc2VyOjpDUERGX1NpbXBsZVBhcnNlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgeworICBtX3BEYXRhID0gc3RyLkdldFB0cigpOworICBtX2R3U2l6ZSA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgbV9kd0N1clBvcyA9IDA7CiB9Ci12b2lkIENQREZfU2ltcGxlUGFyc2VyOjpQYXJzZVdvcmQoY29uc3QgdWludDhfdComIHBTdGFydCwgRlhfRFdPUkQmIGR3U2l6ZSwgaW50JiB0eXBlKQotewotICAgIHBTdGFydCA9IE5VTEw7Ci0gICAgZHdTaXplID0gMDsKLSAgICB0eXBlID0gUERGV09SRF9FT0Y7Ci0gICAgdWludDhfdCBjaDsKLSAgICBjaGFyIGNoYXJ0eXBlOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2ggPSBtX3BEYXRhW21fZHdDdXJQb3MrK107Ci0gICAgICAgIGNoYXJ0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgd2hpbGUgKGNoYXJ0eXBlID09ICdXJykgewotICAgICAgICAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKLSAgICAgICAgICAgIGNoYXJ0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2ggIT0gJyUnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaGFydHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Cit2b2lkIENQREZfU2ltcGxlUGFyc2VyOjpQYXJzZVdvcmQoY29uc3QgdWludDhfdComIHBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgdHlwZSkgeworICBwU3RhcnQgPSBOVUxMOworICBkd1NpemUgPSAwOworICB0eXBlID0gUERGV09SRF9FT0Y7CisgIHVpbnQ4X3QgY2g7CisgIGNoYXIgY2hhcnR5cGU7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgRlhfRFdPUkQgc3RhcnRfcG9zID0gbV9kd0N1clBvcyAtIDE7Ci0gICAgcFN0YXJ0ID0gbV9wRGF0YSArIHN0YXJ0X3BvczsKLSAgICBpZiAoY2hhcnR5cGUgPT0gJ0QnKSB7Ci0gICAgICAgIGlmIChjaCA9PSAnLycpIHsKLSAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKLSAgICAgICAgICAgICAgICBjaGFydHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgICAgICAgICAgaWYgKGNoYXJ0eXBlICE9ICdSJyAmJiBjaGFydHlwZSAhPSAnTicpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9kd0N1clBvcyAtLTsKLSAgICAgICAgICAgICAgICAgICAgZHdTaXplID0gbV9kd0N1clBvcyAtIHN0YXJ0X3BvczsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFBERldPUkRfTkFNRTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR5cGUgPSBQREZXT1JEX0RFTElNSVRFUjsKLSAgICAgICAgICAgIGR3U2l6ZSA9IDE7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJzwnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzwnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR3U2l6ZSA9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9kd0N1clBvcyAtLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc+JykgewotICAgICAgICAgICAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2ggPSBtX3BEYXRhW21fZHdDdXJQb3MrK107Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09ICc+JykgewotICAgICAgICAgICAgICAgICAgICBkd1NpemUgPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fZHdDdXJQb3MgLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgY2ggPSBtX3BEYXRhW21fZHdDdXJQb3MrK107CisgICAgY2hhcnR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICAgIHdoaWxlIChjaGFydHlwZSA9PSAnVycpIHsKKyAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKSB7CiAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNoID0gbV9wRGF0YVttX2R3Q3VyUG9zKytdOworICAgICAgY2hhcnR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwogICAgIH0KLSAgICB0eXBlID0gUERGV09SRF9OVU1CRVI7Ci0gICAgZHdTaXplID0gMTsKKyAgICBpZiAoY2ggIT0gJyUnKSB7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKGNoYXJ0eXBlICE9ICdOJykgewotICAgICAgICAgICAgdHlwZSA9IFBERldPUkRfVEVYVDsKLSAgICAgICAgfQorICAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgY2ggPSBtX3BEYXRhW21fZHdDdXJQb3MrK107CisgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBjaGFydHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgIH0KKyAgRlhfRFdPUkQgc3RhcnRfcG9zID0gbV9kd0N1clBvcyAtIDE7CisgIHBTdGFydCA9IG1fcERhdGEgKyBzdGFydF9wb3M7CisgIGlmIChjaGFydHlwZSA9PSAnRCcpIHsKKyAgICBpZiAoY2ggPT0gJy8nKSB7CisgICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykgewotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKICAgICAgICAgY2hhcnR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgICAgICBpZiAoY2hhcnR5cGUgPT0gJ0QnIHx8IGNoYXJ0eXBlID09ICdXJykgewotICAgICAgICAgICAgbV9kd0N1clBvcyAtLTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoY2hhcnR5cGUgIT0gJ1InICYmIGNoYXJ0eXBlICE9ICdOJykgeworICAgICAgICAgIG1fZHdDdXJQb3MtLTsKKyAgICAgICAgICBkd1NpemUgPSBtX2R3Q3VyUG9zIC0gc3RhcnRfcG9zOworICAgICAgICAgIHR5cGUgPSBQREZXT1JEX05BTUU7CisgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGR3U2l6ZSArKzsKLSAgICB9Ci19Ci1DRlhfQnl0ZVN0cmluZ0MgQ1BERl9TaW1wbGVQYXJzZXI6OkdldFdvcmQoKQotewotICAgIGNvbnN0IHVpbnQ4X3QqIHBTdGFydDsKLSAgICBGWF9EV09SRCBkd1NpemU7Ci0gICAgaW50IHR5cGU7Ci0gICAgUGFyc2VXb3JkKHBTdGFydCwgZHdTaXplLCB0eXBlKTsKLSAgICBpZiAoZHdTaXplID09IDEgJiYgcFN0YXJ0WzBdID09ICc8JykgewotICAgICAgICB3aGlsZSAobV9kd0N1clBvcyA8IG1fZHdTaXplICYmIG1fcERhdGFbbV9kd0N1clBvc10gIT0gJz4nKSB7Ci0gICAgICAgICAgICBtX2R3Q3VyUG9zICsrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0eXBlID0gUERGV09SRF9ERUxJTUlURVI7CisgICAgICBkd1NpemUgPSAxOworICAgICAgaWYgKGNoID09ICc8JykgeworICAgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykgeworICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAobV9kd0N1clBvcyA8IG1fZHdTaXplKSB7Ci0gICAgICAgICAgICBtX2R3Q3VyUG9zICsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MocFN0YXJ0LCAoRlhfU1RSU0laRSkobV9kd0N1clBvcyAtIChwU3RhcnQgLSBtX3BEYXRhKSkpOwotICAgIH0KLSAgICBpZiAoZHdTaXplID09IDEgJiYgcFN0YXJ0WzBdID09ICcoJykgewotICAgICAgICBpbnQgbGV2ZWwgPSAxOwotICAgICAgICB3aGlsZSAobV9kd0N1clBvcyA8IG1fZHdTaXplKSB7Ci0gICAgICAgICAgICBpZiAobV9wRGF0YVttX2R3Q3VyUG9zXSA9PSAnKScpIHsKLSAgICAgICAgICAgICAgICBsZXZlbCAtLTsKLSAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wRGF0YVttX2R3Q3VyUG9zXSA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fZHdDdXJQb3MgKys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fcERhdGFbbV9kd0N1clBvc10gPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgbGV2ZWwgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9kd0N1clBvcyArKzsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9kd0N1clBvcyA8IG1fZHdTaXplKSB7Ci0gICAgICAgICAgICBtX2R3Q3VyUG9zICsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MocFN0YXJ0LCAoRlhfU1RSU0laRSkobV9kd0N1clBvcyAtIChwU3RhcnQgLSBtX3BEYXRhKSkpOwotICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKHBTdGFydCwgZHdTaXplKTsKLX0KLUZYX0JPT0wgQ1BERl9TaW1wbGVQYXJzZXI6OlNlYXJjaFRva2VuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pCi17Ci0gICAgaW50IHRva2VuX2xlbiA9IHRva2VuLkdldExlbmd0aCgpOwotICAgIHdoaWxlIChtX2R3Q3VyUG9zIDwgbV9kd1NpemUgLSB0b2tlbl9sZW4pIHsKLSAgICAgICAgaWYgKEZYU1lTX21lbWNtcChtX3BEYXRhICsgbV9kd0N1clBvcywgdG9rZW4uR2V0UHRyKCksIHRva2VuX2xlbikgPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbV9kd0N1clBvcyArKzsKLSAgICB9Ci0gICAgaWYgKG1fZHdDdXJQb3MgPT0gbV9kd1NpemUgLSB0b2tlbl9sZW4pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX2R3Q3VyUG9zICs9IHRva2VuX2xlbjsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9TaW1wbGVQYXJzZXI6OlNraXBXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pCi17Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBHZXRXb3JkKCk7Ci0gICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JkID09IHRva2VuKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9CT09MIENQREZfU2ltcGxlUGFyc2VyOjpGaW5kVGFnUGFpcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0YXJ0X3Rva2VuLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGVuZF90b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBzdGFydF9wb3MsIEZYX0RXT1JEJiBlbmRfcG9zKQotewotICAgIGlmICghc3RhcnRfdG9rZW4uSXNFbXB0eSgpKSB7Ci0gICAgICAgIGlmICghU2tpcFdvcmQoc3RhcnRfdG9rZW4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnRfcG9zID0gbV9kd0N1clBvczsKLSAgICB9Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgZW5kX3BvcyA9IG1fZHdDdXJQb3M7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gR2V0V29yZCgpOwotICAgICAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAod29yZCA9PSBlbmRfdG9rZW4pIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9TaW1wbGVQYXJzZXI6OkZpbmRUYWdQYXJhbShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuLCBpbnQgblBhcmFtcykKLXsKLSAgICBuUGFyYW1zICsrOwotICAgIEZYX0RXT1JEKiBwQnVmID0gRlhfQWxsb2MoRlhfRFdPUkQsIG5QYXJhbXMpOwotICAgIGludCBidWZfaW5kZXggPSAwOwotICAgIGludCBidWZfY291bnQgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHBCdWZbYnVmX2luZGV4KytdID0gbV9kd0N1clBvczsKLSAgICAgICAgaWYgKGJ1Zl9pbmRleCA9PSBuUGFyYW1zKSB7Ci0gICAgICAgICAgICBidWZfaW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGJ1Zl9jb3VudCArKzsKLSAgICAgICAgaWYgKGJ1Zl9jb3VudCA+IG5QYXJhbXMpIHsKLSAgICAgICAgICAgIGJ1Zl9jb3VudCA9IG5QYXJhbXM7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBHZXRXb3JkKCk7Ci0gICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAod29yZCA9PSB0b2tlbikgewotICAgICAgICAgICAgaWYgKGJ1Zl9jb3VudCA8IG5QYXJhbXMpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fZHdDdXJQb3MgPSBwQnVmW2J1Zl9pbmRleF07Ci0gICAgICAgICAgICBGWF9GcmVlKHBCdWYpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotc3RhdGljIGludCBfaGV4MmRlYyhjaGFyIGNoKQotewotICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgICAgIHJldHVybiBjaCAtICcwJzsKLSAgICB9Ci0gICAgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHsKLSAgICAgICAgcmV0dXJuIGNoIC0gJ2EnICsgMTA7Ci0gICAgfQotICAgIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSB7Ci0gICAgICAgIHJldHVybiBjaCAtICdBJyArIDEwOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLUNGWF9CeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnN0cikKLXsKLSAgICBpbnQgc2l6ZSA9IGJzdHIuR2V0TGVuZ3RoKCk7Ci0gICAgY29uc3QgRlhfQ0hBUiogcFNyYyA9IGJzdHIuR2V0Q1N0cigpOwotICAgIGlmIChGWFNZU19tZW1jaHIocFNyYywgJyMnLCBzaXplKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBic3RyOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7Ci0gICAgRlhfQ0hBUiogcERlc3RTdGFydCA9IHJlc3VsdC5HZXRCdWZmZXIoc2l6ZSk7Ci0gICAgRlhfQ0hBUiogcERlc3QgPSBwRGVzdFN0YXJ0OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICBpZiAocFNyY1tpXSA9PSAnIycgJiYgaSA8IHNpemUgLSAyKSB7Ci0gICAgICAgICAgICAqcERlc3QgKysgPSBfaGV4MmRlYyhwU3JjW2kgKyAxXSkgKiAxNiArIF9oZXgyZGVjKHBTcmNbaSArIDJdKTsKLSAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgY2ggPSBtX3BEYXRhW21fZHdDdXJQb3MrK107CisgICAgICAgIGlmIChjaCA9PSAnPCcpIHsKKyAgICAgICAgICBkd1NpemUgPSAyOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKnBEZXN0ICsrID0gcFNyY1tpXTsKKyAgICAgICAgICBtX2R3Q3VyUG9zLS07CiAgICAgICAgIH0KLSAgICB9Ci0gICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoKEZYX1NUUlNJWkUpKHBEZXN0IC0gcERlc3RTdGFydCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci1DRlhfQnl0ZVN0cmluZyBQREZfTmFtZURlY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3JpZykKLXsKLSAgICBpZiAoRlhTWVNfbWVtY2hyKG9yaWcuY19zdHIoKSwgJyMnLCBvcmlnLkdldExlbmd0aCgpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBvcmlnOwotICAgIH0KLSAgICByZXR1cm4gUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG9yaWcpKTsKLX0KLUNGWF9CeXRlU3RyaW5nIFBERl9OYW1lRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKQotewotICAgIHVpbnQ4X3QqIHNyY19idWYgPSAodWludDhfdCopb3JpZy5jX3N0cigpOwotICAgIGludCBzcmNfbGVuID0gb3JpZy5HZXRMZW5ndGgoKTsKLSAgICBpbnQgZGVzdF9sZW4gPSAwOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBzcmNfbGVuOyBpICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgY2ggPSBzcmNfYnVmW2ldOwotICAgICAgICBpZiAoY2ggPj0gMHg4MCB8fCBQREZfQ2hhclR5cGVbY2hdID09ICdXJyB8fCBjaCA9PSAnIycgfHwKLSAgICAgICAgICAgICAgICBQREZfQ2hhclR5cGVbY2hdID09ICdEJykgewotICAgICAgICAgICAgZGVzdF9sZW4gKz0gMzsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7CisgICAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNoID0gbV9wRGF0YVttX2R3Q3VyUG9zKytdOworICAgICAgICBpZiAoY2ggPT0gJz4nKSB7CisgICAgICAgICAgZHdTaXplID0gMjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RfbGVuICsrOworICAgICAgICAgIG1fZHdDdXJQb3MtLTsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBpZiAoZGVzdF9sZW4gPT0gc3JjX2xlbikgewotICAgICAgICByZXR1cm4gb3JpZzsKKyAgICByZXR1cm47CisgIH0KKyAgdHlwZSA9IFBERldPUkRfTlVNQkVSOworICBkd1NpemUgPSAxOworICB3aGlsZSAoMSkgeworICAgIGlmIChjaGFydHlwZSAhPSAnTicpIHsKKyAgICAgIHR5cGUgPSBQREZXT1JEX1RFWFQ7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIHJlczsKLSAgICBGWF9DSEFSKiBkZXN0X2J1ZiA9IHJlcy5HZXRCdWZmZXIoZGVzdF9sZW4pOwotICAgIGRlc3RfbGVuID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX2xlbjsgaSArKykgewotICAgICAgICB1aW50OF90IGNoID0gc3JjX2J1ZltpXTsKLSAgICAgICAgaWYgKGNoID49IDB4ODAgfHwgUERGX0NoYXJUeXBlW2NoXSA9PSAnVycgfHwgY2ggPT0gJyMnIHx8Ci0gICAgICAgICAgICAgICAgUERGX0NoYXJUeXBlW2NoXSA9PSAnRCcpIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfbGVuKytdID0gJyMnOwotICAgICAgICAgICAgZGVzdF9idWZbZGVzdF9sZW4rK10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiJbY2ggLyAxNl07Ci0gICAgICAgICAgICBkZXN0X2J1ZltkZXN0X2xlbisrXSA9ICIwMTIzNDU2Nzg5QUJDREVGIltjaCAlIDE2XTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfbGVuKytdID0gY2g7Ci0gICAgICAgIH0KKyAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykgeworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkZXN0X2J1ZltkZXN0X2xlbl0gPSAwOwotICAgIHJlcy5SZWxlYXNlQnVmZmVyKCk7Ci0gICAgcmV0dXJuIHJlczsKKyAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKKyAgICBjaGFydHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisgICAgaWYgKGNoYXJ0eXBlID09ICdEJyB8fCBjaGFydHlwZSA9PSAnVycpIHsKKyAgICAgIG1fZHdDdXJQb3MtLTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkd1NpemUrKzsKKyAgfQogfQotQ0ZYX0J5dGVUZXh0QnVmJiBvcGVyYXRvciA8PCAoQ0ZYX0J5dGVUZXh0QnVmJiBidWYsIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIgbnVsbCIpOwotICAgICAgICByZXR1cm4gYnVmOworQ0ZYX0J5dGVTdHJpbmdDIENQREZfU2ltcGxlUGFyc2VyOjpHZXRXb3JkKCkgeworICBjb25zdCB1aW50OF90KiBwU3RhcnQ7CisgIEZYX0RXT1JEIGR3U2l6ZTsKKyAgaW50IHR5cGU7CisgIFBhcnNlV29yZChwU3RhcnQsIGR3U2l6ZSwgdHlwZSk7CisgIGlmIChkd1NpemUgPT0gMSAmJiBwU3RhcnRbMF0gPT0gJzwnKSB7CisgICAgd2hpbGUgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSAmJiBtX3BEYXRhW21fZHdDdXJQb3NdICE9ICc+JykgeworICAgICAgbV9kd0N1clBvcysrOwogICAgIH0KLSAgICBzd2l0Y2ggKHBPYmotPkdldFR5cGUoKSkgewotICAgICAgICBjYXNlIFBERk9CSl9OVUxMOgotICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIgbnVsbCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGT0JKX0JPT0xFQU46Ci0gICAgICAgIGNhc2UgUERGT0JKX05VTUJFUjoKLSAgICAgICAgICAgIGJ1ZiA8PCAiICIgPDwgcE9iai0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZPQkpfU1RSSU5HOiB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCBiSGV4ID0gKChDUERGX1N0cmluZyopcE9iaiktPklzSGV4KCk7Ci0gICAgICAgICAgICAgICAgYnVmIDw8IFBERl9FbmNvZGVTdHJpbmcoc3RyLCBiSGV4KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQREZPQkpfTkFNRTogewotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiLyIpIDw8IFBERl9OYW1lRW5jb2RlKHN0cik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogewotICAgICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlKiBwID0gKENQREZfUmVmZXJlbmNlKilwT2JqOwotICAgICAgICAgICAgICAgIGJ1ZiA8PCAiICIgPDwgcC0+R2V0UmVmT2JqTnVtKCkgPDwgRlhfQlNUUkMoIiAwIFIgIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX0FSUkFZOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcCA9IChDUERGX0FycmF5KilwT2JqOwotICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiWyIpOwotICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHAtPkdldEVsZW1lbnQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRWxlbWVudC0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCAiICIgPDwgcEVsZW1lbnQtPkdldE9iak51bSgpIDw8IEZYX0JTVFJDKCIgMCBSIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYgPDwgcEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCJdIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKLSAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHAgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqOwotICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiPDwiKTsKLSAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwLT5HZXRTdGFydFBvcygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OwotICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gcC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOwotICAgICAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIi8iKSA8PCBQREZfTmFtZUVuY29kZShrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRPYmpOdW0oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmIDw8ICIgIiA8PCBwVmFsdWUtPkdldE9iak51bSgpIDw8IEZYX0JTVFJDKCIgMCBSICIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmIDw8IHBWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIj4+Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUkVBTTogewotICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwID0gKENQREZfU3RyZWFtKilwT2JqOwotICAgICAgICAgICAgICAgIGJ1ZiA8PCBwLT5HZXREaWN0KCkgPDwgRlhfQlNUUkMoInN0cmVhbVxyXG4iKTsKLSAgICAgICAgICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgICAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHAsIFRSVUUpOwotICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRCbG9jayhhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIlxyXG5lbmRzdHJlYW0iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFTU0VSVChGQUxTRSk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBpZiAobV9kd0N1clBvcyA8IG1fZHdTaXplKSB7CisgICAgICBtX2R3Q3VyUG9zKys7CiAgICAgfQorICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MocFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX1NUUlNJWkUpKG1fZHdDdXJQb3MgLSAocFN0YXJ0IC0gbV9wRGF0YSkpKTsKKyAgfQorICBpZiAoZHdTaXplID09IDEgJiYgcFN0YXJ0WzBdID09ICcoJykgeworICAgIGludCBsZXZlbCA9IDE7CisgICAgd2hpbGUgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSkgeworICAgICAgaWYgKG1fcERhdGFbbV9kd0N1clBvc10gPT0gJyknKSB7CisgICAgICAgIGxldmVsLS07CisgICAgICAgIGlmIChsZXZlbCA9PSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChtX3BEYXRhW21fZHdDdXJQb3NdID09ICdcXCcpIHsKKyAgICAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtX2R3Q3VyUG9zKys7CisgICAgICB9IGVsc2UgaWYgKG1fcERhdGFbbV9kd0N1clBvc10gPT0gJygnKSB7CisgICAgICAgIGxldmVsKys7CisgICAgICB9CisgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIG1fZHdDdXJQb3MrKzsKKyAgICB9CisgICAgaWYgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSkgeworICAgICAgbV9kd0N1clBvcysrOworICAgIH0KKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKHBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9TVFJTSVpFKShtX2R3Q3VyUG9zIC0gKHBTdGFydCAtIG1fcERhdGEpKSk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhwU3RhcnQsIGR3U2l6ZSk7Cit9CitGWF9CT09MIENQREZfU2ltcGxlUGFyc2VyOjpTZWFyY2hUb2tlbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuKSB7CisgIGludCB0b2tlbl9sZW4gPSB0b2tlbi5HZXRMZW5ndGgoKTsKKyAgd2hpbGUgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSAtIHRva2VuX2xlbikgeworICAgIGlmIChGWFNZU19tZW1jbXAobV9wRGF0YSArIG1fZHdDdXJQb3MsIHRva2VuLkdldFB0cigpLCB0b2tlbl9sZW4pID09IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX2R3Q3VyUG9zKys7CisgIH0KKyAgaWYgKG1fZHdDdXJQb3MgPT0gbV9kd1NpemUgLSB0b2tlbl9sZW4pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9kd0N1clBvcyArPSB0b2tlbl9sZW47CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX1NpbXBsZVBhcnNlcjo6U2tpcFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbikgeworICB3aGlsZSAoMSkgeworICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gR2V0V29yZCgpOworICAgIGlmICh3b3JkLklzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAod29yZCA9PSB0b2tlbikgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9TaW1wbGVQYXJzZXI6OkZpbmRUYWdQYWlyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RhcnRfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGVuZF90b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBzdGFydF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZW5kX3BvcykgeworICBpZiAoIXN0YXJ0X3Rva2VuLklzRW1wdHkoKSkgeworICAgIGlmICghU2tpcFdvcmQoc3RhcnRfdG9rZW4pKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHN0YXJ0X3BvcyA9IG1fZHdDdXJQb3M7CisgIH0KKyAgd2hpbGUgKDEpIHsKKyAgICBlbmRfcG9zID0gbV9kd0N1clBvczsKKyAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IEdldFdvcmQoKTsKKyAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKHdvcmQgPT0gZW5kX3Rva2VuKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX1NpbXBsZVBhcnNlcjo6RmluZFRhZ1BhcmFtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYXJhbXMpIHsKKyAgblBhcmFtcysrOworICBGWF9EV09SRCogcEJ1ZiA9IEZYX0FsbG9jKEZYX0RXT1JELCBuUGFyYW1zKTsKKyAgaW50IGJ1Zl9pbmRleCA9IDA7CisgIGludCBidWZfY291bnQgPSAwOworICB3aGlsZSAoMSkgeworICAgIHBCdWZbYnVmX2luZGV4KytdID0gbV9kd0N1clBvczsKKyAgICBpZiAoYnVmX2luZGV4ID09IG5QYXJhbXMpIHsKKyAgICAgIGJ1Zl9pbmRleCA9IDA7CisgICAgfQorICAgIGJ1Zl9jb3VudCsrOworICAgIGlmIChidWZfY291bnQgPiBuUGFyYW1zKSB7CisgICAgICBidWZfY291bnQgPSBuUGFyYW1zOworICAgIH0KKyAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IEdldFdvcmQoKTsKKyAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgIEZYX0ZyZWUocEJ1Zik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICh3b3JkID09IHRva2VuKSB7CisgICAgICBpZiAoYnVmX2NvdW50IDwgblBhcmFtcykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIG1fZHdDdXJQb3MgPSBwQnVmW2J1Zl9pbmRleF07CisgICAgICBGWF9GcmVlKHBCdWYpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KK3N0YXRpYyBpbnQgX2hleDJkZWMoY2hhciBjaCkgeworICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgIHJldHVybiBjaCAtICcwJzsKKyAgfQorICBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgeworICAgIHJldHVybiBjaCAtICdhJyArIDEwOworICB9CisgIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSB7CisgICAgcmV0dXJuIGNoIC0gJ0EnICsgMTA7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitDRlhfQnl0ZVN0cmluZyBQREZfTmFtZURlY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzdHIpIHsKKyAgaW50IHNpemUgPSBic3RyLkdldExlbmd0aCgpOworICBjb25zdCBGWF9DSEFSKiBwU3JjID0gYnN0ci5HZXRDU3RyKCk7CisgIGlmIChGWFNZU19tZW1jaHIocFNyYywgJyMnLCBzaXplKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGJzdHI7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OworICBGWF9DSEFSKiBwRGVzdFN0YXJ0ID0gcmVzdWx0LkdldEJ1ZmZlcihzaXplKTsKKyAgRlhfQ0hBUiogcERlc3QgPSBwRGVzdFN0YXJ0OworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGlmIChwU3JjW2ldID09ICcjJyAmJiBpIDwgc2l6ZSAtIDIpIHsKKyAgICAgICpwRGVzdCsrID0gX2hleDJkZWMocFNyY1tpICsgMV0pICogMTYgKyBfaGV4MmRlYyhwU3JjW2kgKyAyXSk7CisgICAgICBpICs9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgICpwRGVzdCsrID0gcFNyY1tpXTsKKyAgICB9CisgIH0KKyAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoKEZYX1NUUlNJWkUpKHBEZXN0IC0gcERlc3RTdGFydCkpOworICByZXR1cm4gcmVzdWx0OworfQorQ0ZYX0J5dGVTdHJpbmcgUERGX05hbWVEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9yaWcpIHsKKyAgaWYgKEZYU1lTX21lbWNocihvcmlnLmNfc3RyKCksICcjJywgb3JpZy5HZXRMZW5ndGgoKSkgPT0gTlVMTCkgeworICAgIHJldHVybiBvcmlnOworICB9CisgIHJldHVybiBQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0Mob3JpZykpOworfQorQ0ZYX0J5dGVTdHJpbmcgUERGX05hbWVFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9yaWcpIHsKKyAgdWludDhfdCogc3JjX2J1ZiA9ICh1aW50OF90KilvcmlnLmNfc3RyKCk7CisgIGludCBzcmNfbGVuID0gb3JpZy5HZXRMZW5ndGgoKTsKKyAgaW50IGRlc3RfbGVuID0gMDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBzcmNfbGVuOyBpKyspIHsKKyAgICB1aW50OF90IGNoID0gc3JjX2J1ZltpXTsKKyAgICBpZiAoY2ggPj0gMHg4MCB8fCBQREZfQ2hhclR5cGVbY2hdID09ICdXJyB8fCBjaCA9PSAnIycgfHwKKyAgICAgICAgUERGX0NoYXJUeXBlW2NoXSA9PSAnRCcpIHsKKyAgICAgIGRlc3RfbGVuICs9IDM7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3RfbGVuKys7CisgICAgfQorICB9CisgIGlmIChkZXN0X2xlbiA9PSBzcmNfbGVuKSB7CisgICAgcmV0dXJuIG9yaWc7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzOworICBGWF9DSEFSKiBkZXN0X2J1ZiA9IHJlcy5HZXRCdWZmZXIoZGVzdF9sZW4pOworICBkZXN0X2xlbiA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBzcmNfbGVuOyBpKyspIHsKKyAgICB1aW50OF90IGNoID0gc3JjX2J1ZltpXTsKKyAgICBpZiAoY2ggPj0gMHg4MCB8fCBQREZfQ2hhclR5cGVbY2hdID09ICdXJyB8fCBjaCA9PSAnIycgfHwKKyAgICAgICAgUERGX0NoYXJUeXBlW2NoXSA9PSAnRCcpIHsKKyAgICAgIGRlc3RfYnVmW2Rlc3RfbGVuKytdID0gJyMnOworICAgICAgZGVzdF9idWZbZGVzdF9sZW4rK10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiJbY2ggLyAxNl07CisgICAgICBkZXN0X2J1ZltkZXN0X2xlbisrXSA9ICIwMTIzNDU2Nzg5QUJDREVGIltjaCAlIDE2XTsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdF9idWZbZGVzdF9sZW4rK10gPSBjaDsKKyAgICB9CisgIH0KKyAgZGVzdF9idWZbZGVzdF9sZW5dID0gMDsKKyAgcmVzLlJlbGVhc2VCdWZmZXIoKTsKKyAgcmV0dXJuIHJlczsKK30KK0NGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChDRlhfQnl0ZVRleHRCdWYmIGJ1ZiwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgaWYgKHBPYmogPT0gTlVMTCkgeworICAgIGJ1ZiA8PCBGWF9CU1RSQygiIG51bGwiKTsKICAgICByZXR1cm4gYnVmOworICB9CisgIHN3aXRjaCAocE9iai0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSBQREZPQkpfTlVMTDoKKyAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIG51bGwiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGT0JKX0JPT0xFQU46CisgICAgY2FzZSBQREZPQkpfTlVNQkVSOgorICAgICAgYnVmIDw8ICIgIiA8PCBwT2JqLT5HZXRTdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGT0JKX1NUUklORzogeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7CisgICAgICBGWF9CT09MIGJIZXggPSAoKENQREZfU3RyaW5nKilwT2JqKS0+SXNIZXgoKTsKKyAgICAgIGJ1ZiA8PCBQREZfRW5jb2RlU3RyaW5nKHN0ciwgYkhleCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfTkFNRTogeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7CisgICAgICBidWYgPDwgRlhfQlNUUkMoIi8iKSA8PCBQREZfTmFtZUVuY29kZShzdHIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogeworICAgICAgQ1BERl9SZWZlcmVuY2UqIHAgPSAoQ1BERl9SZWZlcmVuY2UqKXBPYmo7CisgICAgICBidWYgPDwgIiAiIDw8IHAtPkdldFJlZk9iak51bSgpIDw8IEZYX0JTVFJDKCIgMCBSICIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX0FSUkFZOiB7CisgICAgICBDUERGX0FycmF5KiBwID0gKENQREZfQXJyYXkqKXBPYmo7CisgICAgICBidWYgPDwgRlhfQlNUUkMoIlsiKTsKKyAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwLT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcC0+R2V0RWxlbWVudChpKTsKKyAgICAgICAgaWYgKHBFbGVtZW50LT5HZXRPYmpOdW0oKSkgeworICAgICAgICAgIGJ1ZiA8PCAiICIgPDwgcEVsZW1lbnQtPkdldE9iak51bSgpIDw8IEZYX0JTVFJDKCIgMCBSIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmIDw8IHBFbGVtZW50OworICAgICAgICB9CisgICAgICB9CisgICAgICBidWYgPDwgRlhfQlNUUkMoIl0iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9ESUNUSU9OQVJZOiB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHAgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqOworICAgICAgYnVmIDw8IEZYX0JTVFJDKCI8PCIpOworICAgICAgRlhfUE9TSVRJT04gcG9zID0gcC0+R2V0U3RhcnRQb3MoKTsKKyAgICAgIHdoaWxlIChwb3MpIHsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OworICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gcC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOworICAgICAgICBidWYgPDwgRlhfQlNUUkMoIi8iKSA8PCBQREZfTmFtZUVuY29kZShrZXkpOworICAgICAgICBpZiAocFZhbHVlLT5HZXRPYmpOdW0oKSkgeworICAgICAgICAgIGJ1ZiA8PCAiICIgPDwgcFZhbHVlLT5HZXRPYmpOdW0oKSA8PCBGWF9CU1RSQygiIDAgUiAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWYgPDwgcFZhbHVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBidWYgPDwgRlhfQlNUUkMoIj4+Iik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfU1RSRUFNOiB7CisgICAgICBDUERGX1N0cmVhbSogcCA9IChDUERGX1N0cmVhbSopcE9iajsKKyAgICAgIGJ1ZiA8PCBwLT5HZXREaWN0KCkgPDwgRlhfQlNUUkMoInN0cmVhbVxyXG4iKTsKKyAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKKyAgICAgIGFjYy5Mb2FkQWxsRGF0YShwLCBUUlVFKTsKKyAgICAgIGJ1Zi5BcHBlbmRCbG9jayhhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKKyAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiXHJcbmVuZHN0cmVhbSIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGJ1ZjsKIH0KLUZYX0ZMT0FUIFBERl9DbGlwRmxvYXQoRlhfRkxPQVQgZikKLXsKLSAgICBpZiAoZiA8IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChmID4gMS4wZikgewotICAgICAgICByZXR1cm4gMS4wZjsKLSAgICB9Ci0gICAgcmV0dXJuIGY7CitGWF9GTE9BVCBQREZfQ2xpcEZsb2F0KEZYX0ZMT0FUIGYpIHsKKyAgaWYgKGYgPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGYgPiAxLjBmKSB7CisgICAgcmV0dXJuIDEuMGY7CisgIH0KKyAgcmV0dXJuIGY7CiB9Ci1zdGF0aWMgQ1BERl9PYmplY3QqIFNlYXJjaE51bWJlck5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwgaW50IG51bSkKLXsKLSAgICBDUERGX0FycmF5KiBwTGltaXRzID0gcE5vZGUtPkdldEFycmF5KCJMaW1pdHMiKTsKLSAgICBpZiAocExpbWl0cyAmJiAobnVtIDwgcExpbWl0cy0+R2V0SW50ZWdlcigwKSB8fCBudW0gPiBwTGltaXRzLT5HZXRJbnRlZ2VyKDEpKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcE51bWJlcnMgPSBwTm9kZS0+R2V0QXJyYXkoIk51bXMiKTsKLSAgICBpZiAocE51bWJlcnMpIHsKLSAgICAgICAgRlhfRFdPUkQgZHdDb3VudCA9IHBOdW1iZXJzLT5HZXRDb3VudCgpIC8gMjsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IHBOdW1iZXJzLT5HZXRJbnRlZ2VyKGkgKiAyKTsKLSAgICAgICAgICAgIGlmIChudW0gPT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcE51bWJlcnMtPkdldEVsZW1lbnRWYWx1ZShpICogMiArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluZGV4ID4gbnVtKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBLaWRzID0gcE5vZGUtPkdldEFycmF5KCJLaWRzIik7Ci0gICAgaWYgKHBLaWRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkcy0+R2V0RGljdChpKTsKLSAgICAgICAgaWYgKHBLaWQgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QqIHBGb3VuZCA9IFNlYXJjaE51bWJlck5vZGUocEtpZCwgbnVtKTsKLSAgICAgICAgaWYgKHBGb3VuZCkgewotICAgICAgICAgICAgcmV0dXJuIHBGb3VuZDsKLSAgICAgICAgfQorc3RhdGljIENQREZfT2JqZWN0KiBTZWFyY2hOdW1iZXJOb2RlKENQREZfRGljdGlvbmFyeSogcE5vZGUsIGludCBudW0pIHsKKyAgQ1BERl9BcnJheSogcExpbWl0cyA9IHBOb2RlLT5HZXRBcnJheSgiTGltaXRzIik7CisgIGlmIChwTGltaXRzICYmCisgICAgICAobnVtIDwgcExpbWl0cy0+R2V0SW50ZWdlcigwKSB8fCBudW0gPiBwTGltaXRzLT5HZXRJbnRlZ2VyKDEpKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfQXJyYXkqIHBOdW1iZXJzID0gcE5vZGUtPkdldEFycmF5KCJOdW1zIik7CisgIGlmIChwTnVtYmVycykgeworICAgIEZYX0RXT1JEIGR3Q291bnQgPSBwTnVtYmVycy0+R2V0Q291bnQoKSAvIDI7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgeworICAgICAgaW50IGluZGV4ID0gcE51bWJlcnMtPkdldEludGVnZXIoaSAqIDIpOworICAgICAgaWYgKG51bSA9PSBpbmRleCkgeworICAgICAgICByZXR1cm4gcE51bWJlcnMtPkdldEVsZW1lbnRWYWx1ZShpICogMiArIDEpOworICAgICAgfQorICAgICAgaWYgKGluZGV4ID4gbnVtKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0FycmF5KiBwS2lkcyA9IHBOb2RlLT5HZXRBcnJheSgiS2lkcyIpOworICBpZiAocEtpZHMgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZHMtPkdldERpY3QoaSk7CisgICAgaWYgKHBLaWQgPT0gTlVMTCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENQREZfT2JqZWN0KiBwRm91bmQgPSBTZWFyY2hOdW1iZXJOb2RlKHBLaWQsIG51bSk7CisgICAgaWYgKHBGb3VuZCkgeworICAgICAgcmV0dXJuIHBGb3VuZDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci1DUERGX09iamVjdCogQ1BERl9OdW1iZXJUcmVlOjpMb29rdXBWYWx1ZShpbnQgbnVtKQotewotICAgIHJldHVybiBTZWFyY2hOdW1iZXJOb2RlKG1fcFJvb3QsIG51bSk7CitDUERGX09iamVjdCogQ1BERl9OdW1iZXJUcmVlOjpMb29rdXBWYWx1ZShpbnQgbnVtKSB7CisgIHJldHVybiBTZWFyY2hOdW1iZXJOb2RlKG1fcFJvb3QsIG51bSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXIuY3BwCmluZGV4IDE5YzAxYTEuLjkwNWUzZDMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXIuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXIuY3BwCkBAIC0xMSwxMzkyICsxMSwxNDUyIEBACiAjaW5jbHVkZSAicmVuZGVyX2ludC5oIgogCiBDUERGX0RvY1JlbmRlckRhdGE6OkNQREZfRG9jUmVuZGVyRGF0YShDUERGX0RvY3VtZW50KiBwUERGRG9jKQotICAgIDogbV9wUERGRG9jKHBQREZEb2MpLAotICAgICAgbV9wRm9udENhY2hlKG5ldyBDRlhfRm9udENhY2hlKQoteworICAgIDogbV9wUERGRG9jKHBQREZEb2MpLCBtX3BGb250Q2FjaGUobmV3IENGWF9Gb250Q2FjaGUpIHt9CisKK0NQREZfRG9jUmVuZGVyRGF0YTo6fkNQREZfRG9jUmVuZGVyRGF0YSgpIHsKKyAgQ2xlYXIoVFJVRSk7CiB9CiAKLUNQREZfRG9jUmVuZGVyRGF0YTo6fkNQREZfRG9jUmVuZGVyRGF0YSgpCi17Ci0gICAgQ2xlYXIoVFJVRSk7Ci19Ci0KLXZvaWQgQ1BERl9Eb2NSZW5kZXJEYXRhOjpDbGVhcihGWF9CT09MIGJSZWxlYXNlKQotewotICAgIGZvciAoYXV0byBpdCA9IG1fVHlwZTNGYWNlTWFwLmJlZ2luKCk7IGl0ICE9IG1fVHlwZTNGYWNlTWFwLmVuZCgpOykgewotICAgICAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOwotICAgICAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UeXBlM0NhY2hlPiogY2FjaGUgPSBjdXJyX2l0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChiUmVsZWFzZSB8fCBjYWNoZS0+dXNlX2NvdW50KCkgPCAyKSB7Ci0gICAgICAgICAgICBkZWxldGUgY2FjaGUtPmdldCgpOwotICAgICAgICAgICAgZGVsZXRlIGNhY2hlOwotICAgICAgICAgICAgbV9UeXBlM0ZhY2VNYXAuZXJhc2UoY3Vycl9pdCk7Ci0gICAgICAgIH0KK3ZvaWQgQ1BERl9Eb2NSZW5kZXJEYXRhOjpDbGVhcihGWF9CT09MIGJSZWxlYXNlKSB7CisgIGZvciAoYXV0byBpdCA9IG1fVHlwZTNGYWNlTWFwLmJlZ2luKCk7IGl0ICE9IG1fVHlwZTNGYWNlTWFwLmVuZCgpOykgeworICAgIGF1dG8gY3Vycl9pdCA9IGl0Kys7CisgICAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHlwZTNDYWNoZT4qIGNhY2hlID0gY3Vycl9pdC0+c2Vjb25kOworICAgIGlmIChiUmVsZWFzZSB8fCBjYWNoZS0+dXNlX2NvdW50KCkgPCAyKSB7CisgICAgICBkZWxldGUgY2FjaGUtPmdldCgpOworICAgICAgZGVsZXRlIGNhY2hlOworICAgICAgbV9UeXBlM0ZhY2VNYXAuZXJhc2UoY3Vycl9pdCk7CiAgICAgfQorICB9CiAKLSAgICBmb3IgKGF1dG8gaXQgPSBtX1RyYW5zZmVyRnVuY01hcC5iZWdpbigpOyBpdCAhPSBtX1RyYW5zZmVyRnVuY01hcC5lbmQoKTspIHsKLSAgICAgICAgYXV0byBjdXJyX2l0ID0gaXQrKzsKLSAgICAgICAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jPiogdmFsdWUgPSBjdXJyX2l0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChiUmVsZWFzZSB8fCB2YWx1ZS0+dXNlX2NvdW50KCkgPCAyKSB7Ci0gICAgICAgICAgICBkZWxldGUgdmFsdWUtPmdldCgpOwotICAgICAgICAgICAgZGVsZXRlIHZhbHVlOwotICAgICAgICAgICAgbV9UcmFuc2ZlckZ1bmNNYXAuZXJhc2UoY3Vycl9pdCk7Ci0gICAgICAgIH0KKyAgZm9yIChhdXRvIGl0ID0gbV9UcmFuc2ZlckZ1bmNNYXAuYmVnaW4oKTsgaXQgIT0gbV9UcmFuc2ZlckZ1bmNNYXAuZW5kKCk7KSB7CisgICAgYXV0byBjdXJyX2l0ID0gaXQrKzsKKyAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UcmFuc2ZlckZ1bmM+KiB2YWx1ZSA9IGN1cnJfaXQtPnNlY29uZDsKKyAgICBpZiAoYlJlbGVhc2UgfHwgdmFsdWUtPnVzZV9jb3VudCgpIDwgMikgeworICAgICAgZGVsZXRlIHZhbHVlLT5nZXQoKTsKKyAgICAgIGRlbGV0ZSB2YWx1ZTsKKyAgICAgIG1fVHJhbnNmZXJGdW5jTWFwLmVyYXNlKGN1cnJfaXQpOwogICAgIH0KKyAgfQogCi0gICAgaWYgKG1fcEZvbnRDYWNoZSkgewotICAgICAgICBpZiAoYlJlbGVhc2UpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BGb250Q2FjaGU7Ci0gICAgICAgICAgICBtX3BGb250Q2FjaGUgPSBOVUxMOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wRm9udENhY2hlLT5GcmVlQ2FjaGUoRkFMU0UpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1DUERGX1R5cGUzQ2FjaGUqIENQREZfRG9jUmVuZGVyRGF0YTo6R2V0Q2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KQotewotICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX1R5cGUzQ2FjaGU+KiBwQ2FjaGU7Ci0gICAgYXV0byBpdCA9IG1fVHlwZTNGYWNlTWFwLmZpbmQocEZvbnQpOwotICAgIGlmIChpdCA9PSBtX1R5cGUzRmFjZU1hcC5lbmQoKSkgewotICAgICAgICBDUERGX1R5cGUzQ2FjaGUqIHBUeXBlMyA9IG5ldyBDUERGX1R5cGUzQ2FjaGUocEZvbnQpOwotICAgICAgICBwQ2FjaGUgPSBuZXcgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHlwZTNDYWNoZT4ocFR5cGUzKTsKLSAgICAgICAgbV9UeXBlM0ZhY2VNYXBbcEZvbnRdID0gcENhY2hlOworICBpZiAobV9wRm9udENhY2hlKSB7CisgICAgaWYgKGJSZWxlYXNlKSB7CisgICAgICBkZWxldGUgbV9wRm9udENhY2hlOworICAgICAgbV9wRm9udENhY2hlID0gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBwQ2FjaGUgPSBpdC0+c2Vjb25kOworICAgICAgbV9wRm9udENhY2hlLT5GcmVlQ2FjaGUoRkFMU0UpOwogICAgIH0KLSAgICByZXR1cm4gcENhY2hlLT5BZGRSZWYoKTsKKyAgfQogfQogCi12b2lkIENQREZfRG9jUmVuZGVyRGF0YTo6UmVsZWFzZUNhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkKLXsKLSAgICBhdXRvIGl0ID0gbV9UeXBlM0ZhY2VNYXAuZmluZChwRm9udCk7Ci0gICAgaWYgKGl0ICE9IG1fVHlwZTNGYWNlTWFwLmVuZCgpKQotICAgICAgICBpdC0+c2Vjb25kLT5SZW1vdmVSZWYoKTsKK0NQREZfVHlwZTNDYWNoZSogQ1BERl9Eb2NSZW5kZXJEYXRhOjpHZXRDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpIHsKKyAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHlwZTNDYWNoZT4qIHBDYWNoZTsKKyAgYXV0byBpdCA9IG1fVHlwZTNGYWNlTWFwLmZpbmQocEZvbnQpOworICBpZiAoaXQgPT0gbV9UeXBlM0ZhY2VNYXAuZW5kKCkpIHsKKyAgICBDUERGX1R5cGUzQ2FjaGUqIHBUeXBlMyA9IG5ldyBDUERGX1R5cGUzQ2FjaGUocEZvbnQpOworICAgIHBDYWNoZSA9IG5ldyBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UeXBlM0NhY2hlPihwVHlwZTMpOworICAgIG1fVHlwZTNGYWNlTWFwW3BGb250XSA9IHBDYWNoZTsKKyAgfSBlbHNlIHsKKyAgICBwQ2FjaGUgPSBpdC0+c2Vjb25kOworICB9CisgIHJldHVybiBwQ2FjaGUtPkFkZFJlZigpOwogfQogCi1jbGFzcyBDUERGX1JlbmRlck1vZHVsZSA6IHB1YmxpYyBJUERGX1JlbmRlck1vZHVsZQotewotcHVibGljOgotICAgQ1BERl9SZW5kZXJNb2R1bGUoKSB7fQordm9pZCBDUERGX0RvY1JlbmRlckRhdGE6OlJlbGVhc2VDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpIHsKKyAgYXV0byBpdCA9IG1fVHlwZTNGYWNlTWFwLmZpbmQocEZvbnQpOworICBpZiAoaXQgIT0gbV9UeXBlM0ZhY2VNYXAuZW5kKCkpCisgICAgaXQtPnNlY29uZC0+UmVtb3ZlUmVmKCk7Cit9CiAKLXByaXZhdGU6Ci0gICAgfkNQREZfUmVuZGVyTW9kdWxlKCkgb3ZlcnJpZGUge30KK2NsYXNzIENQREZfUmVuZGVyTW9kdWxlIDogcHVibGljIElQREZfUmVuZGVyTW9kdWxlIHsKKyBwdWJsaWM6CisgIENQREZfUmVuZGVyTW9kdWxlKCkge30KIAotICAgIENQREZfRG9jUmVuZGVyRGF0YSogQ3JlYXRlRG9jRGF0YShDUERGX0RvY3VtZW50KiBwRG9jKSBvdmVycmlkZTsKLSAgICB2b2lkIERlc3Ryb3lEb2NEYXRhKENQREZfRG9jUmVuZGVyRGF0YSogcCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBDbGVhckRvY0RhdGEoQ1BERl9Eb2NSZW5kZXJEYXRhKiBwKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICB+Q1BERl9SZW5kZXJNb2R1bGUoKSBvdmVycmlkZSB7fQogCi0gICAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBHZXRSZW5kZXJEYXRhKCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiAmbV9SZW5kZXJEYXRhOwotICAgIH0KKyAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBDcmVhdGVEb2NEYXRhKENQREZfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlOworICB2b2lkIERlc3Ryb3lEb2NEYXRhKENQREZfRG9jUmVuZGVyRGF0YSogcCkgb3ZlcnJpZGU7CisgIHZvaWQgQ2xlYXJEb2NEYXRhKENQREZfRG9jUmVuZGVyRGF0YSogcCkgb3ZlcnJpZGU7CiAKLSAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogQ3JlYXRlUGFnZUNhY2hlKENQREZfUGFnZSogcFBhZ2UpIG92ZXJyaWRlCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENQREZfUGFnZVJlbmRlckNhY2hlKHBQYWdlKTsKLSAgICB9CisgIENQREZfRG9jUmVuZGVyRGF0YSogR2V0UmVuZGVyRGF0YSgpIG92ZXJyaWRlIHsgcmV0dXJuICZtX1JlbmRlckRhdGE7IH0KIAotICAgIHZvaWQgRGVzdHJveVBhZ2VDYWNoZShDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlKSBvdmVycmlkZTsKKyAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIENyZWF0ZVBhZ2VDYWNoZShDUERGX1BhZ2UqIHBQYWdlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG5ldyBDUERGX1BhZ2VSZW5kZXJDYWNoZShwUGFnZSk7CisgIH0KIAotICAgIENQREZfUmVuZGVyQ29uZmlnKiBHZXRDb25maWcoKSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgcmV0dXJuICZtX1JlbmRlckNvbmZpZzsKLSAgICB9CisgIHZvaWQgRGVzdHJveVBhZ2VDYWNoZShDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlKSBvdmVycmlkZTsKIAotICAgIENQREZfRG9jUmVuZGVyRGF0YSBtX1JlbmRlckRhdGE7Ci0gICAgQ1BERl9SZW5kZXJDb25maWcgbV9SZW5kZXJDb25maWc7CisgIENQREZfUmVuZGVyQ29uZmlnKiBHZXRDb25maWcoKSBvdmVycmlkZSB7IHJldHVybiAmbV9SZW5kZXJDb25maWc7IH0KKworICBDUERGX0RvY1JlbmRlckRhdGEgbV9SZW5kZXJEYXRhOworICBDUERGX1JlbmRlckNvbmZpZyBtX1JlbmRlckNvbmZpZzsKIH07CiAKLUNQREZfRG9jUmVuZGVyRGF0YSoJQ1BERl9SZW5kZXJNb2R1bGU6OkNyZWF0ZURvY0RhdGEoQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICByZXR1cm4gbmV3IENQREZfRG9jUmVuZGVyRGF0YShwRG9jKTsKK0NQREZfRG9jUmVuZGVyRGF0YSogQ1BERl9SZW5kZXJNb2R1bGU6OkNyZWF0ZURvY0RhdGEoQ1BERl9Eb2N1bWVudCogcERvYykgeworICByZXR1cm4gbmV3IENQREZfRG9jUmVuZGVyRGF0YShwRG9jKTsKIH0KLXZvaWQgQ1BERl9SZW5kZXJNb2R1bGU6OkRlc3Ryb3lEb2NEYXRhKENQREZfRG9jUmVuZGVyRGF0YSogcERvY0RhdGEpCi17Ci0gICAgZGVsZXRlIHBEb2NEYXRhOwordm9pZCBDUERGX1JlbmRlck1vZHVsZTo6RGVzdHJveURvY0RhdGEoQ1BERl9Eb2NSZW5kZXJEYXRhKiBwRG9jRGF0YSkgeworICBkZWxldGUgcERvY0RhdGE7CiB9Ci12b2lkIENQREZfUmVuZGVyTW9kdWxlOjpDbGVhckRvY0RhdGEoQ1BERl9Eb2NSZW5kZXJEYXRhKiBwKQotewotICAgIGlmIChwKSB7Ci0gICAgICAgIHAtPkNsZWFyKEZBTFNFKTsKLSAgICB9Cit2b2lkIENQREZfUmVuZGVyTW9kdWxlOjpDbGVhckRvY0RhdGEoQ1BERl9Eb2NSZW5kZXJEYXRhKiBwKSB7CisgIGlmIChwKSB7CisgICAgcC0+Q2xlYXIoRkFMU0UpOworICB9CiB9Ci12b2lkIENQREZfUmVuZGVyTW9kdWxlOjpEZXN0cm95UGFnZUNhY2hlKENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUpCi17Ci0gICAgZGVsZXRlIHBDYWNoZTsKK3ZvaWQgQ1BERl9SZW5kZXJNb2R1bGU6OkRlc3Ryb3lQYWdlQ2FjaGUoQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSkgeworICBkZWxldGUgcENhY2hlOwogfQogCi12b2lkIENQREZfTW9kdWxlTWdyOjpJbml0UmVuZGVyTW9kdWxlKCkKLXsKLSAgICBtX3BSZW5kZXJNb2R1bGUucmVzZXQobmV3IENQREZfUmVuZGVyTW9kdWxlKTsKK3ZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkluaXRSZW5kZXJNb2R1bGUoKSB7CisgIG1fcFJlbmRlck1vZHVsZS5yZXNldChuZXcgQ1BERl9SZW5kZXJNb2R1bGUpOwogfQogCiBDUERGX1JlbmRlck9wdGlvbnM6OkNQREZfUmVuZGVyT3B0aW9ucygpCi0gICAgOiBtX0NvbG9yTW9kZShSRU5ERVJfQ09MT1JfTk9STUFMKQotICAgICwgbV9GbGFncyhSRU5ERVJfQ0xFQVJUWVBFKQotICAgICwgbV9JbnRlcnBvbGF0aW9uKDApCi0gICAgLCBtX0FkZEZsYWdzKDApCi0gICAgLCBtX3BPQ0NvbnRleHQoTlVMTCkKLSAgICAsIG1fZHdMaW1pdENhY2hlU2l6ZSgxMDI0ICogMTAyNCAqIDEwMCkKLSAgICAsIG1fSGFsZnRvbmVMaW1pdCgtMSkKLXsKLX0KLUZYX0FSR0IgQ1BERl9SZW5kZXJPcHRpb25zOjpUcmFuc2xhdGVDb2xvcihGWF9BUkdCIGFyZ2IpIGNvbnN0Ci17Ci0gICAgaWYgKG1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIGFyZ2I7CisgICAgOiBtX0NvbG9yTW9kZShSRU5ERVJfQ09MT1JfTk9STUFMKSwKKyAgICAgIG1fRmxhZ3MoUkVOREVSX0NMRUFSVFlQRSksCisgICAgICBtX0ludGVycG9sYXRpb24oMCksCisgICAgICBtX0FkZEZsYWdzKDApLAorICAgICAgbV9wT0NDb250ZXh0KE5VTEwpLAorICAgICAgbV9kd0xpbWl0Q2FjaGVTaXplKDEwMjQgKiAxMDI0ICogMTAwKSwKKyAgICAgIG1fSGFsZnRvbmVMaW1pdCgtMSkge30KK0ZYX0FSR0IgQ1BERl9SZW5kZXJPcHRpb25zOjpUcmFuc2xhdGVDb2xvcihGWF9BUkdCIGFyZ2IpIGNvbnN0IHsKKyAgaWYgKG1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9OT1JNQUwpIHsKKyAgICByZXR1cm4gYXJnYjsKKyAgfQorICBpZiAobV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0FMUEhBKSB7CisgICAgcmV0dXJuIGFyZ2I7CisgIH0KKyAgaW50IGEsIHIsIGcsIGI7CisgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7CisgIGludCBncmF5ID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgaWYgKG1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9UV09DT0xPUikgeworICAgIGludCBjb2xvciA9IChyIC0gZ3JheSkgKiAociAtIGdyYXkpICsgKGcgLSBncmF5KSAqIChnIC0gZ3JheSkgKworICAgICAgICAgICAgICAgIChiIC0gZ3JheSkgKiAoYiAtIGdyYXkpOworICAgIGlmIChncmF5IDwgMzUgJiYgY29sb3IgPCAyMCkgeworICAgICAgcmV0dXJuIEFyZ2JFbmNvZGUoYSwgbV9Gb3JlQ29sb3IpOwogICAgIH0KLSAgICBpZiAobV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0FMUEhBKSB7Ci0gICAgICAgIHJldHVybiBhcmdiOworICAgIGlmIChncmF5ID4gMjIxICYmIGNvbG9yIDwgMjApIHsKKyAgICAgIHJldHVybiBBcmdiRW5jb2RlKGEsIG1fQmFja0NvbG9yKTsKICAgICB9Ci0gICAgaW50IGEsIHIsIGcsIGI7Ci0gICAgQXJnYkRlY29kZShhcmdiLCBhLCByLCBnLCBiKTsKLSAgICBpbnQgZ3JheSA9IEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgaWYgKG1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9UV09DT0xPUikgewotICAgICAgICBpbnQgY29sb3IgPSAociAtIGdyYXkpICogKHIgLSBncmF5KSArIChnIC0gZ3JheSkgKiAoZyAtIGdyYXkpICsgKGIgLSBncmF5KSAqIChiIC0gZ3JheSk7Ci0gICAgICAgIGlmIChncmF5IDwgMzUgJiYgY29sb3IgPCAyMCkgewotICAgICAgICAgICAgcmV0dXJuIEFyZ2JFbmNvZGUoYSwgbV9Gb3JlQ29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChncmF5ID4gMjIxICYmIGNvbG9yIDwgMjApIHsKLSAgICAgICAgICAgIHJldHVybiBBcmdiRW5jb2RlKGEsIG1fQmFja0NvbG9yKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJnYjsKLSAgICB9Ci0gICAgaW50IGZyID0gRlhTWVNfR2V0UlZhbHVlKG1fRm9yZUNvbG9yKTsKLSAgICBpbnQgZmcgPSBGWFNZU19HZXRHVmFsdWUobV9Gb3JlQ29sb3IpOwotICAgIGludCBmYiA9IEZYU1lTX0dldEJWYWx1ZShtX0ZvcmVDb2xvcik7Ci0gICAgaW50IGJyID0gRlhTWVNfR2V0UlZhbHVlKG1fQmFja0NvbG9yKTsKLSAgICBpbnQgYmcgPSBGWFNZU19HZXRHVmFsdWUobV9CYWNrQ29sb3IpOwotICAgIGludCBiYiA9IEZYU1lTX0dldEJWYWx1ZShtX0JhY2tDb2xvcik7Ci0gICAgciA9IChiciAtIGZyKSAqIGdyYXkgLyAyNTUgKyBmcjsKLSAgICBnID0gKGJnIC0gZmcpICogZ3JheSAvIDI1NSArIGZnOwotICAgIGIgPSAoYmIgLSBmYikgKiBncmF5IC8gMjU1ICsgZmI7Ci0gICAgcmV0dXJuIEFyZ2JFbmNvZGUoYSwgciwgZywgYik7CisgICAgcmV0dXJuIGFyZ2I7CisgIH0KKyAgaW50IGZyID0gRlhTWVNfR2V0UlZhbHVlKG1fRm9yZUNvbG9yKTsKKyAgaW50IGZnID0gRlhTWVNfR2V0R1ZhbHVlKG1fRm9yZUNvbG9yKTsKKyAgaW50IGZiID0gRlhTWVNfR2V0QlZhbHVlKG1fRm9yZUNvbG9yKTsKKyAgaW50IGJyID0gRlhTWVNfR2V0UlZhbHVlKG1fQmFja0NvbG9yKTsKKyAgaW50IGJnID0gRlhTWVNfR2V0R1ZhbHVlKG1fQmFja0NvbG9yKTsKKyAgaW50IGJiID0gRlhTWVNfR2V0QlZhbHVlKG1fQmFja0NvbG9yKTsKKyAgciA9IChiciAtIGZyKSAqIGdyYXkgLyAyNTUgKyBmcjsKKyAgZyA9IChiZyAtIGZnKSAqIGdyYXkgLyAyNTUgKyBmZzsKKyAgYiA9IChiYiAtIGZiKSAqIGdyYXkgLyAyNTUgKyBmYjsKKyAgcmV0dXJuIEFyZ2JFbmNvZGUoYSwgciwgZywgYik7CiB9CiAKIC8vIHN0YXRpYwogaW50IENQREZfUmVuZGVyU3RhdHVzOjpzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA9IDA7CiAKLUNQREZfUmVuZGVyU3RhdHVzOjpDUERGX1JlbmRlclN0YXR1cygpCi17Ci0gICAgbV9wQ29udGV4dCA9IE5VTEw7Ci0gICAgbV9iU3RvcHBlZCA9IEZBTFNFOwotICAgIG1fcERldmljZSA9IE5VTEw7Ci0gICAgbV9wQ3VyT2JqID0gTlVMTDsKLSAgICBtX3BTdG9wT2JqID0gTlVMTDsKLSAgICBtX0hhbGZ0b25lTGltaXQgPSAwOwotICAgIG1fcE9iamVjdFJlbmRlcmVyID0gTlVMTDsKLSAgICBtX2JQcmludCA9IEZBTFNFOwotICAgIG1fVHJhbnNwYXJlbmN5ID0gMDsKLSAgICBtX0RpdGhlckJpdHMgPSAwOwotICAgIG1fYkRyb3BPYmplY3RzID0gRkFMU0U7Ci0gICAgbV9iU3RkQ1MgPSBGQUxTRTsKLSAgICBtX0dyb3VwRmFtaWx5ID0gMDsKLSAgICBtX2JMb2FkTWFzayA9IEZBTFNFOwotICAgIG1fcFR5cGUzQ2hhciA9IE5VTEw7Ci0gICAgbV9UM0ZpbGxDb2xvciA9IDA7Ci0gICAgbV9wRm9ybVJlc291cmNlID0gTlVMTDsKLSAgICBtX3BQYWdlUmVzb3VyY2UgPSBOVUxMOwotICAgIG1fY3VyQmxlbmQgPSBGWERJQl9CTEVORF9OT1JNQUw7CitDUERGX1JlbmRlclN0YXR1czo6Q1BERl9SZW5kZXJTdGF0dXMoKSB7CisgIG1fcENvbnRleHQgPSBOVUxMOworICBtX2JTdG9wcGVkID0gRkFMU0U7CisgIG1fcERldmljZSA9IE5VTEw7CisgIG1fcEN1ck9iaiA9IE5VTEw7CisgIG1fcFN0b3BPYmogPSBOVUxMOworICBtX0hhbGZ0b25lTGltaXQgPSAwOworICBtX3BPYmplY3RSZW5kZXJlciA9IE5VTEw7CisgIG1fYlByaW50ID0gRkFMU0U7CisgIG1fVHJhbnNwYXJlbmN5ID0gMDsKKyAgbV9EaXRoZXJCaXRzID0gMDsKKyAgbV9iRHJvcE9iamVjdHMgPSBGQUxTRTsKKyAgbV9iU3RkQ1MgPSBGQUxTRTsKKyAgbV9Hcm91cEZhbWlseSA9IDA7CisgIG1fYkxvYWRNYXNrID0gRkFMU0U7CisgIG1fcFR5cGUzQ2hhciA9IE5VTEw7CisgIG1fVDNGaWxsQ29sb3IgPSAwOworICBtX3BGb3JtUmVzb3VyY2UgPSBOVUxMOworICBtX3BQYWdlUmVzb3VyY2UgPSBOVUxMOworICBtX2N1ckJsZW5kID0gRlhESUJfQkxFTkRfTk9STUFMOwogfQogCi1DUERGX1JlbmRlclN0YXR1czo6fkNQREZfUmVuZGVyU3RhdHVzKCkKLXsKK0NQREZfUmVuZGVyU3RhdHVzOjp+Q1BERl9SZW5kZXJTdGF0dXMoKSB7CisgIGRlbGV0ZSBtX3BPYmplY3RSZW5kZXJlcjsKK30KKworRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6SW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRGV2aWNlTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTdG9wT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlclN0YXR1cyogcFBhcmVudFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBJbml0aWFsU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNwYXJlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEcm9wT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrKSB7CisgIG1fcENvbnRleHQgPSBwQ29udGV4dDsKKyAgbV9wRGV2aWNlID0gcERldmljZTsKKyAgbV9EaXRoZXJCaXRzID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX0RJVEhFUl9CSVRTKTsKKyAgbV9iUHJpbnQgPSBtX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCkgIT0gRlhEQ19ESVNQTEFZOworICBpZiAocERldmljZU1hdHJpeCkgeworICAgIG1fRGV2aWNlTWF0cml4ID0gKnBEZXZpY2VNYXRyaXg7CisgIH0KKyAgbV9wU3RvcE9iaiA9IHBTdG9wT2JqOworICBpZiAocE9wdGlvbnMpIHsKKyAgICBtX09wdGlvbnMgPSAqcE9wdGlvbnM7CisgIH0KKyAgbV9iRHJvcE9iamVjdHMgPSBiRHJvcE9iamVjdHM7CisgIG1fYlN0ZENTID0gYlN0ZENTOworICBtX1QzRmlsbENvbG9yID0gZmlsbF9jb2xvcjsKKyAgbV9wVHlwZTNDaGFyID0gcFR5cGUzQ2hhcjsKKyAgbV9Hcm91cEZhbWlseSA9IEdyb3VwRmFtaWx5OworICBtX2JMb2FkTWFzayA9IGJMb2FkTWFzazsKKyAgbV9wRm9ybVJlc291cmNlID0gcEZvcm1SZXNvdXJjZTsKKyAgbV9wUGFnZVJlc291cmNlID0gbV9wQ29udGV4dC0+bV9wUGFnZVJlc291cmNlczsKKyAgaWYgKHBJbml0aWFsU3RhdGVzICYmICFtX3BUeXBlM0NoYXIpIHsKKyAgICBtX0luaXRpYWxTdGF0ZXMuQ29weVN0YXRlcygqcEluaXRpYWxTdGF0ZXMpOworICAgIGlmIChwUGFyZW50U3RhdGUpIHsKKyAgICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBDb2xvckRhdGEgPQorICAgICAgICAgIChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopCisgICAgICAgICAgICAgIG1fSW5pdGlhbFN0YXRlcy5tX0NvbG9yU3RhdGU7CisgICAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwUGFyZW50RGF0YSA9CisgICAgICAgICAgKENQREZfQ29sb3JTdGF0ZURhdGEqKShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhKikKKyAgICAgICAgICAgICAgcFBhcmVudFN0YXRlLT5tX0luaXRpYWxTdGF0ZXMubV9Db2xvclN0YXRlOworICAgICAgaWYgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fRmlsbENvbG9yLklzTnVsbCgpKSB7CisgICAgICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gbV9Jbml0aWFsU3RhdGVzLm1fQ29sb3JTdGF0ZS5HZXRNb2RpZnkoKTsKKyAgICAgICAgcERhdGEtPm1fRmlsbFJHQiA9IHBQYXJlbnREYXRhLT5tX0ZpbGxSR0I7CisgICAgICAgIHBEYXRhLT5tX0ZpbGxDb2xvci5Db3B5KCZwUGFyZW50RGF0YS0+bV9GaWxsQ29sb3IpOworICAgICAgfQorICAgICAgaWYgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fU3Ryb2tlQ29sb3IuSXNOdWxsKCkpIHsKKyAgICAgICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcERhdGEgPSBtX0luaXRpYWxTdGF0ZXMubV9Db2xvclN0YXRlLkdldE1vZGlmeSgpOworICAgICAgICBwRGF0YS0+bV9TdHJva2VSR0IgPSBwUGFyZW50RGF0YS0+bV9GaWxsUkdCOworICAgICAgICBwRGF0YS0+bV9TdHJva2VDb2xvci5Db3B5KCZwUGFyZW50RGF0YS0+bV9TdHJva2VDb2xvcik7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIG1fSW5pdGlhbFN0YXRlcy5EZWZhdWx0U3RhdGVzKCk7CisgIH0KKyAgbV9wT2JqZWN0UmVuZGVyZXIgPSBOVUxMOworICBtX1RyYW5zcGFyZW5jeSA9IHRyYW5zcGFyZW5jeTsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpSZW5kZXJPYmplY3RMaXN0KGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBPYmpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkgeworICBDRlhfRmxvYXRSZWN0IGNsaXBfcmVjdCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOworICBDRlhfQWZmaW5lTWF0cml4IGRldmljZTJvYmplY3Q7CisgIGRldmljZTJvYmplY3QuU2V0UmV2ZXJzZSgqcE9iajJEZXZpY2UpOworICBkZXZpY2Uyb2JqZWN0LlRyYW5zZm9ybVJlY3QoY2xpcF9yZWN0KTsKKyAgaW50IGluZGV4ID0gMDsKKyAgRlhfUE9TSVRJT04gcG9zID0gcE9ianMtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIGluZGV4Kys7CisgICAgQ1BERl9QYWdlT2JqZWN0KiBwQ3VyT2JqID0gcE9ianMtPkdldE5leHRPYmplY3QocG9zKTsKKyAgICBpZiAocEN1ck9iaiA9PSBtX3BTdG9wT2JqKSB7CisgICAgICBtX2JTdG9wcGVkID0gVFJVRTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFwQ3VyT2JqKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHBDdXJPYmogPT0gTlVMTCB8fCBwQ3VyT2JqLT5tX0xlZnQgPiBjbGlwX3JlY3QucmlnaHQgfHwKKyAgICAgICAgcEN1ck9iai0+bV9SaWdodCA8IGNsaXBfcmVjdC5sZWZ0IHx8CisgICAgICAgIHBDdXJPYmotPm1fQm90dG9tID4gY2xpcF9yZWN0LnRvcCB8fAorICAgICAgICBwQ3VyT2JqLT5tX1RvcCA8IGNsaXBfcmVjdC5ib3R0b20pIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBSZW5kZXJTaW5nbGVPYmplY3QocEN1ck9iaiwgcE9iajJEZXZpY2UpOworICAgIGlmIChtX2JTdG9wcGVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9Cit2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpSZW5kZXJTaW5nbGVPYmplY3QoCisgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKSB7CisgIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50UmVjdXJzaW9uRGVwdGgpOworICBpZiAoKytzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA+IGtSZW5kZXJNYXhSZWN1cnNpb25EZXB0aCkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BDdXJPYmogPSBwT2JqOworICBpZiAobV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJiBwT2JqLT5tX0NvbnRlbnRNYXJrLk5vdE51bGwoKSkgeworICAgIGlmICghbV9PcHRpb25zLm1fcE9DQ29udGV4dC0+Q2hlY2tPYmplY3RWaXNpYmxlKHBPYmopKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIFByb2Nlc3NDbGlwUGF0aChwT2JqLT5tX0NsaXBQYXRoLCBwT2JqMkRldmljZSk7CisgIGlmIChQcm9jZXNzVHJhbnNwYXJlbmN5KHBPYmosIHBPYmoyRGV2aWNlKSkgeworICAgIHJldHVybjsKKyAgfQorICBQcm9jZXNzT2JqZWN0Tm9DbGlwKHBPYmosIHBPYmoyRGV2aWNlKTsKK30KK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OkNvbnRpbnVlU2luZ2xlT2JqZWN0KAorICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAobV9wT2JqZWN0UmVuZGVyZXIpIHsKKyAgICBpZiAobV9wT2JqZWN0UmVuZGVyZXItPkNvbnRpbnVlKHBQYXVzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAoIW1fcE9iamVjdFJlbmRlcmVyLT5tX1Jlc3VsdCkgeworICAgICAgRHJhd09ialdpdGhCYWNrZ3JvdW5kKHBPYmosIHBPYmoyRGV2aWNlKTsKKyAgICB9CiAgICAgZGVsZXRlIG1fcE9iamVjdFJlbmRlcmVyOwotfQotCi1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXZpY2VNYXRyaXgsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcFN0b3BPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyU3RhdHVzKiBwUGFyZW50U3RhdGUsIGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyogcEluaXRpYWxTdGF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIGludCB0cmFuc3BhcmVuY3ksIEZYX0JPT0wgYkRyb3BPYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UsIEZYX0JPT0wgYlN0ZENTLCBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2NvbG9yLCBGWF9EV09SRCBHcm91cEZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2spCi17Ci0gICAgbV9wQ29udGV4dCA9IHBDb250ZXh0OwotICAgIG1fcERldmljZSA9IHBEZXZpY2U7Ci0gICAgbV9EaXRoZXJCaXRzID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX0RJVEhFUl9CSVRTKTsKLSAgICBtX2JQcmludCA9IG1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSAhPSBGWERDX0RJU1BMQVk7Ci0gICAgaWYgKHBEZXZpY2VNYXRyaXgpIHsKLSAgICAgICAgbV9EZXZpY2VNYXRyaXggPSAqcERldmljZU1hdHJpeDsKLSAgICB9Ci0gICAgbV9wU3RvcE9iaiA9IHBTdG9wT2JqOwotICAgIGlmIChwT3B0aW9ucykgewotICAgICAgICBtX09wdGlvbnMgPSAqcE9wdGlvbnM7Ci0gICAgfQotICAgIG1fYkRyb3BPYmplY3RzID0gYkRyb3BPYmplY3RzOwotICAgIG1fYlN0ZENTID0gYlN0ZENTOwotICAgIG1fVDNGaWxsQ29sb3IgPSBmaWxsX2NvbG9yOwotICAgIG1fcFR5cGUzQ2hhciA9IHBUeXBlM0NoYXI7Ci0gICAgbV9Hcm91cEZhbWlseSA9IEdyb3VwRmFtaWx5OwotICAgIG1fYkxvYWRNYXNrID0gYkxvYWRNYXNrOwotICAgIG1fcEZvcm1SZXNvdXJjZSA9IHBGb3JtUmVzb3VyY2U7Ci0gICAgbV9wUGFnZVJlc291cmNlID0gbV9wQ29udGV4dC0+bV9wUGFnZVJlc291cmNlczsKLSAgICBpZiAocEluaXRpYWxTdGF0ZXMgJiYgIW1fcFR5cGUzQ2hhcikgewotICAgICAgICBtX0luaXRpYWxTdGF0ZXMuQ29weVN0YXRlcygqcEluaXRpYWxTdGF0ZXMpOwotICAgICAgICBpZiAocFBhcmVudFN0YXRlKSB7Ci0gICAgICAgICAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwQ29sb3JEYXRhID0gKENQREZfQ29sb3JTdGF0ZURhdGEqKShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhKiltX0luaXRpYWxTdGF0ZXMubV9Db2xvclN0YXRlOwotICAgICAgICAgICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcFBhcmVudERhdGEgPSAoQ1BERl9Db2xvclN0YXRlRGF0YSopKGNvbnN0IENQREZfQ29sb3JTdGF0ZURhdGEqKXBQYXJlbnRTdGF0ZS0+bV9Jbml0aWFsU3RhdGVzLm1fQ29sb3JTdGF0ZTsKLSAgICAgICAgICAgIGlmICghcENvbG9yRGF0YSB8fCBwQ29sb3JEYXRhLT5tX0ZpbGxDb2xvci5Jc051bGwoKSkgewotICAgICAgICAgICAgICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gbV9Jbml0aWFsU3RhdGVzLm1fQ29sb3JTdGF0ZS5HZXRNb2RpZnkoKTsKLSAgICAgICAgICAgICAgICBwRGF0YS0+bV9GaWxsUkdCID0gcFBhcmVudERhdGEtPm1fRmlsbFJHQjsKLSAgICAgICAgICAgICAgICBwRGF0YS0+bV9GaWxsQ29sb3IuQ29weSgmcFBhcmVudERhdGEtPm1fRmlsbENvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcENvbG9yRGF0YSB8fCBwQ29sb3JEYXRhLT5tX1N0cm9rZUNvbG9yLklzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcERhdGEgPSBtX0luaXRpYWxTdGF0ZXMubV9Db2xvclN0YXRlLkdldE1vZGlmeSgpOwotICAgICAgICAgICAgICAgIHBEYXRhLT5tX1N0cm9rZVJHQiA9IHBQYXJlbnREYXRhLT5tX0ZpbGxSR0I7Ci0gICAgICAgICAgICAgICAgcERhdGEtPm1fU3Ryb2tlQ29sb3IuQ29weSgmcFBhcmVudERhdGEtPm1fU3Ryb2tlQ29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9Jbml0aWFsU3RhdGVzLkRlZmF1bHRTdGF0ZXMoKTsKLSAgICB9CiAgICAgbV9wT2JqZWN0UmVuZGVyZXIgPSBOVUxMOwotICAgIG1fVHJhbnNwYXJlbmN5ID0gdHJhbnNwYXJlbmN5OwotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6UmVuZGVyT2JqZWN0TGlzdChjb25zdCBDUERGX1BhZ2VPYmplY3RzKiBwT2JqcywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCi17Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBjbGlwX3JlY3QgPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IGRldmljZTJvYmplY3Q7Ci0gICAgZGV2aWNlMm9iamVjdC5TZXRSZXZlcnNlKCpwT2JqMkRldmljZSk7Ci0gICAgZGV2aWNlMm9iamVjdC5UcmFuc2Zvcm1SZWN0KGNsaXBfcmVjdCk7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwT2Jqcy0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotICAgIHdoaWxlKHBvcykgewotICAgICAgICBpbmRleCArKzsKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwQ3VyT2JqID0gcE9ianMtPkdldE5leHRPYmplY3QocG9zKTsKLSAgICAgICAgaWYgKHBDdXJPYmogPT0gbV9wU3RvcE9iaikgewotICAgICAgICAgICAgbV9iU3RvcHBlZCA9IFRSVUU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwQ3VyT2JqKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZihwQ3VyT2JqID09IE5VTEwgfHwgcEN1ck9iai0+bV9MZWZ0ID4gY2xpcF9yZWN0LnJpZ2h0IHx8IHBDdXJPYmotPm1fUmlnaHQgPCBjbGlwX3JlY3QubGVmdCB8fAotICAgICAgICAgICAgICAgIHBDdXJPYmotPm1fQm90dG9tID4gY2xpcF9yZWN0LnRvcCB8fCBwQ3VyT2JqLT5tX1RvcCA8IGNsaXBfcmVjdC5ib3R0b20pIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIFJlbmRlclNpbmdsZU9iamVjdChwQ3VyT2JqLCBwT2JqMkRldmljZSk7Ci0gICAgICAgIGlmIChtX2JTdG9wcGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpSZW5kZXJTaW5nbGVPYmplY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBDRlhfQXV0b1Jlc3RvcmVyPGludD4gcmVzdG9yZXIoJnNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoKTsKLSAgICBpZiAoKytzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA+IGtSZW5kZXJNYXhSZWN1cnNpb25EZXB0aCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcEN1ck9iaiA9IHBPYmo7Ci0gICAgaWYgKG1fT3B0aW9ucy5tX3BPQ0NvbnRleHQgJiYgcE9iai0+bV9Db250ZW50TWFyay5Ob3ROdWxsKCkpIHsKLSAgICAgICAgaWYgKCFtX09wdGlvbnMubV9wT0NDb250ZXh0LT5DaGVja09iamVjdFZpc2libGUocE9iaikpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICBQcm9jZXNzQ2xpcFBhdGgocE9iai0+bV9DbGlwUGF0aCwgcE9iajJEZXZpY2UpOwotICAgIGlmIChQcm9jZXNzVHJhbnNwYXJlbmN5KHBPYmosIHBPYmoyRGV2aWNlKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFByb2Nlc3NPYmplY3ROb0NsaXAocE9iaiwgcE9iajJEZXZpY2UpOwotfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6Q29udGludWVTaW5nbGVPYmplY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKG1fcE9iamVjdFJlbmRlcmVyKSB7Ci0gICAgICAgIGlmIChtX3BPYmplY3RSZW5kZXJlci0+Q29udGludWUocFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX3BPYmplY3RSZW5kZXJlci0+bV9SZXN1bHQpIHsKLSAgICAgICAgICAgIERyYXdPYmpXaXRoQmFja2dyb3VuZChwT2JqLCBwT2JqMkRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIG1fcE9iamVjdFJlbmRlcmVyOwotICAgICAgICBtX3BPYmplY3RSZW5kZXJlciA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wQ3VyT2JqID0gcE9iajsKLSAgICBpZiAobV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJiBwT2JqLT5tX0NvbnRlbnRNYXJrLk5vdE51bGwoKSkKLSAgICAgICAgaWYgKCFtX09wdGlvbnMubV9wT0NDb250ZXh0LT5DaGVja09iamVjdFZpc2libGUocE9iaikpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIFByb2Nlc3NDbGlwUGF0aChwT2JqLT5tX0NsaXBQYXRoLCBwT2JqMkRldmljZSk7Ci0gICAgaWYgKFByb2Nlc3NUcmFuc3BhcmVuY3kocE9iaiwgcE9iajJEZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFKSB7Ci0gICAgICAgIG1fcE9iamVjdFJlbmRlcmVyID0gSVBERl9PYmplY3RSZW5kZXJlcjo6Q3JlYXRlKHBPYmotPm1fVHlwZSk7Ci0gICAgICAgIGlmICghbV9wT2JqZWN0UmVuZGVyZXItPlN0YXJ0KHRoaXMsIHBPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSkpIHsKLSAgICAgICAgICAgIGlmICghbV9wT2JqZWN0UmVuZGVyZXItPm1fUmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgRHJhd09ialdpdGhCYWNrZ3JvdW5kKHBPYmosIHBPYmoyRGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZSBtX3BPYmplY3RSZW5kZXJlcjsKLSAgICAgICAgICAgIG1fcE9iamVjdFJlbmRlcmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29udGludWVTaW5nbGVPYmplY3QocE9iaiwgcE9iajJEZXZpY2UsIHBQYXVzZSk7Ci0gICAgfQotICAgIFByb2Nlc3NPYmplY3ROb0NsaXAocE9iaiwgcE9iajJEZXZpY2UpOwogICAgIHJldHVybiBGQUxTRTsKLX0KLUlQREZfT2JqZWN0UmVuZGVyZXIqIElQREZfT2JqZWN0UmVuZGVyZXI6OkNyZWF0ZShpbnQgdHlwZSkKLXsKLSAgICBpZiAodHlwZSAhPSBQREZQQUdFX0lNQUdFKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICB9CisgIG1fcEN1ck9iaiA9IHBPYmo7CisgIGlmIChtX09wdGlvbnMubV9wT0NDb250ZXh0ICYmIHBPYmotPm1fQ29udGVudE1hcmsuTm90TnVsbCgpKQorICAgIGlmICghbV9PcHRpb25zLm1fcE9DQ29udGV4dC0+Q2hlY2tPYmplY3RWaXNpYmxlKHBPYmopKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiBuZXcgQ1BERl9JbWFnZVJlbmRlcmVyOwotfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6R2V0T2JqZWN0Q2xpcHBlZFJlY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiTG9naWNhbCwgRlhfUkVDVCAmcmVjdCkgY29uc3QKLXsKLSAgICByZWN0ID0gcE9iai0+R2V0QkJveChwT2JqMkRldmljZSk7Ci0gICAgRlhfUkVDVCBydENsaXAgPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsKLSAgICBpZiAoIWJMb2dpY2FsKSB7Ci0gICAgICAgIENGWF9NYXRyaXggZENUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7Ci0gICAgICAgIEZYX0ZMT0FUIGEgPSBGWFNZU19mYWJzKGRDVE0uYSk7Ci0gICAgICAgIEZYX0ZMT0FUIGQgPSBGWFNZU19mYWJzKGRDVE0uZCk7Ci0gICAgICAgIGlmIChhICE9IDEuMGYgfHwgZCAhPSAxLjBmKSB7Ci0gICAgICAgICAgICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgKGludDMyX3QpRlhTWVNfY2VpbCgoRlhfRkxPQVQpcmVjdC5XaWR0aCgpICogYSk7Ci0gICAgICAgICAgICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgKGludDMyX3QpRlhTWVNfY2VpbCgoRlhfRkxPQVQpcmVjdC5IZWlnaHQoKSAqIGQpOwotICAgICAgICAgICAgcnRDbGlwLnJpZ2h0ID0gcnRDbGlwLmxlZnQgKyAoaW50MzJfdClGWFNZU19jZWlsKChGWF9GTE9BVClydENsaXAuV2lkdGgoKSAqIGEpOwotICAgICAgICAgICAgcnRDbGlwLmJvdHRvbSA9IHJ0Q2xpcC50b3AgKyAoaW50MzJfdClGWFNZU19jZWlsKChGWF9GTE9BVClydENsaXAuSGVpZ2h0KCkgKiBkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZWN0LkludGVyc2VjdChydENsaXApOwotICAgIHJldHVybiByZWN0LklzRW1wdHkoKTsKLX0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRpdGhlck9iamVjdEFyZWEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBtX3BEZXZpY2UtPkdldEJpdG1hcCgpOwotICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9SRUNUIHJlY3Q7Ci0gICAgaWYgKEdldE9iamVjdENsaXBwZWRSZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSwgcmVjdCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9EaXRoZXJCaXRzID09IDIpIHsKLSAgICAgICAgc3RhdGljIEZYX0FSR0IgcGFsWzRdID0gezAsIDg1LCAxNzAsIDI1NX07Ci0gICAgICAgIHBCaXRtYXAtPkRpdGhlckZTKHBhbCwgNCwgJnJlY3QpOwotICAgIH0gZWxzZSBpZiAobV9EaXRoZXJCaXRzID09IDMpIHsKLSAgICAgICAgc3RhdGljIEZYX0FSR0IgcGFsWzhdID0gezAsIDM2LCA3MywgMTA5LCAxNDYsIDE4MiwgMjE5LCAyNTV9OwotICAgICAgICBwQml0bWFwLT5EaXRoZXJGUyhwYWwsIDgsICZyZWN0KTsKLSAgICB9IGVsc2UgaWYgKG1fRGl0aGVyQml0cyA9PSA0KSB7Ci0gICAgICAgIHN0YXRpYyBGWF9BUkdCIHBhbFsxNl0gPSB7MCwgMTcsIDM0LCA1MSwgNjgsIDg1LCAxMDIsIDExOSwgMTM2LCAxNTMsIDE3MCwgMTg3LCAyMDQsIDIyMSwgMjM4LCAyNTV9OwotICAgICAgICBwQml0bWFwLT5EaXRoZXJGUyhwYWwsIDE2LCAmcmVjdCk7Ci0gICAgfQotfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc09iamVjdE5vQ2xpcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQotewotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOwotICAgIHN3aXRjaCAocE9iai0+bV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgUERGUEFHRV9URVhUOgotICAgICAgICAgICAgYlJldCA9IFByb2Nlc3NUZXh0KChDUERGX1RleHRPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlLCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERlBBR0VfUEFUSDoKLSAgICAgICAgICAgIGJSZXQgPSBQcm9jZXNzUGF0aCgoQ1BERl9QYXRoT2JqZWN0KilwT2JqLCBwT2JqMkRldmljZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZQQUdFX0lNQUdFOgotICAgICAgICAgICAgYlJldCA9IFByb2Nlc3NJbWFnZSgoQ1BERl9JbWFnZU9iamVjdCopcE9iaiwgcE9iajJEZXZpY2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGUEFHRV9TSEFESU5HOgotICAgICAgICAgICAgYlJldCA9IFByb2Nlc3NTaGFkaW5nKChDUERGX1NoYWRpbmdPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERlBBR0VfRk9STToKLSAgICAgICAgICAgIGJSZXQgPSBQcm9jZXNzRm9ybSgoQ1BERl9Gb3JtT2JqZWN0KilwT2JqLCBwT2JqMkRldmljZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKCFiUmV0KSB7CisgIFByb2Nlc3NDbGlwUGF0aChwT2JqLT5tX0NsaXBQYXRoLCBwT2JqMkRldmljZSk7CisgIGlmIChQcm9jZXNzVHJhbnNwYXJlbmN5KHBPYmosIHBPYmoyRGV2aWNlKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocE9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UpIHsKKyAgICBtX3BPYmplY3RSZW5kZXJlciA9IElQREZfT2JqZWN0UmVuZGVyZXI6OkNyZWF0ZShwT2JqLT5tX1R5cGUpOworICAgIGlmICghbV9wT2JqZWN0UmVuZGVyZXItPlN0YXJ0KHRoaXMsIHBPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSkpIHsKKyAgICAgIGlmICghbV9wT2JqZWN0UmVuZGVyZXItPm1fUmVzdWx0KSB7CiAgICAgICAgIERyYXdPYmpXaXRoQmFja2dyb3VuZChwT2JqLCBwT2JqMkRldmljZSk7CisgICAgICB9CisgICAgICBkZWxldGUgbV9wT2JqZWN0UmVuZGVyZXI7CisgICAgICBtX3BPYmplY3RSZW5kZXJlciA9IE5VTEw7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQorICAgIHJldHVybiBDb250aW51ZVNpbmdsZU9iamVjdChwT2JqLCBwT2JqMkRldmljZSwgcFBhdXNlKTsKKyAgfQorICBQcm9jZXNzT2JqZWN0Tm9DbGlwKHBPYmosIHBPYmoyRGV2aWNlKTsKKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6RHJhd09ialdpdGhCbGVuZChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQotewotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOwotICAgIHN3aXRjaCAocE9iai0+bV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgUERGUEFHRV9QQVRIOgotICAgICAgICAgICAgYlJldCA9IFByb2Nlc3NQYXRoKChDUERGX1BhdGhPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERlBBR0VfSU1BR0U6Ci0gICAgICAgICAgICBiUmV0ID0gUHJvY2Vzc0ltYWdlKChDUERGX0ltYWdlT2JqZWN0ICopcE9iaiwgcE9iajJEZXZpY2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGUEFHRV9GT1JNOgotICAgICAgICAgICAgYlJldCA9IFByb2Nlc3NGb3JtKChDUERGX0Zvcm1PYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gYlJldDsKK0lQREZfT2JqZWN0UmVuZGVyZXIqIElQREZfT2JqZWN0UmVuZGVyZXI6OkNyZWF0ZShpbnQgdHlwZSkgeworICBpZiAodHlwZSAhPSBQREZQQUdFX0lNQUdFKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG5ldyBDUERGX0ltYWdlUmVuZGVyZXI7CiB9Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpHZXRTY2FsZWRNYXRyaXgoQ0ZYX01hdHJpeCAmbWF0cml4KSBjb25zdAoteworRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6R2V0T2JqZWN0Q2xpcHBlZFJlY3QoCisgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgIEZYX0JPT0wgYkxvZ2ljYWwsCisgICAgRlhfUkVDVCYgcmVjdCkgY29uc3QgeworICByZWN0ID0gcE9iai0+R2V0QkJveChwT2JqMkRldmljZSk7CisgIEZYX1JFQ1QgcnRDbGlwID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CisgIGlmICghYkxvZ2ljYWwpIHsKICAgICBDRlhfTWF0cml4IGRDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOwotICAgIG1hdHJpeC5hICo9IEZYU1lTX2ZhYnMoZENUTS5hKTsKLSAgICBtYXRyaXguZCAqPSBGWFNZU19mYWJzKGRDVE0uZCk7CisgICAgRlhfRkxPQVQgYSA9IEZYU1lTX2ZhYnMoZENUTS5hKTsKKyAgICBGWF9GTE9BVCBkID0gRlhTWVNfZmFicyhkQ1RNLmQpOworICAgIGlmIChhICE9IDEuMGYgfHwgZCAhPSAxLjBmKSB7CisgICAgICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgKGludDMyX3QpRlhTWVNfY2VpbCgoRlhfRkxPQVQpcmVjdC5XaWR0aCgpICogYSk7CisgICAgICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgKGludDMyX3QpRlhTWVNfY2VpbCgoRlhfRkxPQVQpcmVjdC5IZWlnaHQoKSAqIGQpOworICAgICAgcnRDbGlwLnJpZ2h0ID0KKyAgICAgICAgICBydENsaXAubGVmdCArIChpbnQzMl90KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXJ0Q2xpcC5XaWR0aCgpICogYSk7CisgICAgICBydENsaXAuYm90dG9tID0KKyAgICAgICAgICBydENsaXAudG9wICsgKGludDMyX3QpRlhTWVNfY2VpbCgoRlhfRkxPQVQpcnRDbGlwLkhlaWdodCgpICogZCk7CisgICAgfQorICB9CisgIHJlY3QuSW50ZXJzZWN0KHJ0Q2xpcCk7CisgIHJldHVybiByZWN0LklzRW1wdHkoKTsKIH0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdPYmpXaXRoQmFja2dyb3VuZChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQotewotICAgIEZYX1JFQ1QgcmVjdDsKLSAgICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocE9iaiwgcE9iajJEZXZpY2UsIEZBTFNFLCByZWN0KSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCByZXMgPSAzMDA7Ci0gICAgaWYgKHBPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFICYmIG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX0RFVklDRV9DTEFTUykgPT0gRlhEQ19QUklOVEVSKSB7Ci0gICAgICAgIHJlcyA9IDA7Ci0gICAgfQotICAgIENQREZfU2NhbGVkUmVuZGVyQnVmZmVyIGJ1ZmZlcjsKLSAgICBpZiAoIWJ1ZmZlci5Jbml0aWFsaXplKG1fcENvbnRleHQsIG1fcERldmljZSwgJnJlY3QsIHBPYmosICZtX09wdGlvbnMsIHJlcykpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCA9ICpwT2JqMkRldmljZTsKLSAgICBtYXRyaXguQ29uY2F0KCpidWZmZXIuR2V0TWF0cml4KCkpOwotICAgIEdldFNjYWxlZE1hdHJpeChtYXRyaXgpOwotICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7Ci0gICAgaWYgKHBPYmotPm1fVHlwZSA9PSBQREZQQUdFX0ZPUk0pIHsKLSAgICAgICAgQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiA9IChDUERGX0Zvcm1PYmplY3QqKXBPYmo7Ci0gICAgICAgIGlmIChwRm9ybU9iai0+bV9wRm9ybSAmJiBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QpIHsKLSAgICAgICAgICAgIHBGb3JtUmVzb3VyY2UgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7Ci0gICAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgYnVmZmVyLkdldERldmljZSgpLCBidWZmZXIuR2V0TWF0cml4KCksIE5VTEwsIE5VTEwsIE5VTEwsICZtX09wdGlvbnMsIG1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSk7Ci0gICAgc3RhdHVzLlJlbmRlclNpbmdsZU9iamVjdChwT2JqLCAmbWF0cml4KTsKLSAgICBidWZmZXIuT3V0cHV0VG9EZXZpY2UoKTsKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRpdGhlck9iamVjdEFyZWEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkgeworICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBtX3BEZXZpY2UtPkdldEJpdG1hcCgpOworICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX1JFQ1QgcmVjdDsKKyAgaWYgKEdldE9iamVjdENsaXBwZWRSZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSwgcmVjdCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fRGl0aGVyQml0cyA9PSAyKSB7CisgICAgc3RhdGljIEZYX0FSR0IgcGFsWzRdID0gezAsIDg1LCAxNzAsIDI1NX07CisgICAgcEJpdG1hcC0+RGl0aGVyRlMocGFsLCA0LCAmcmVjdCk7CisgIH0gZWxzZSBpZiAobV9EaXRoZXJCaXRzID09IDMpIHsKKyAgICBzdGF0aWMgRlhfQVJHQiBwYWxbOF0gPSB7MCwgMzYsIDczLCAxMDksIDE0NiwgMTgyLCAyMTksIDI1NX07CisgICAgcEJpdG1hcC0+RGl0aGVyRlMocGFsLCA4LCAmcmVjdCk7CisgIH0gZWxzZSBpZiAobV9EaXRoZXJCaXRzID09IDQpIHsKKyAgICBzdGF0aWMgRlhfQVJHQiBwYWxbMTZdID0gezAsICAgMTcsICAzNCwgIDUxLCAgNjgsICA4NSwgIDEwMiwgMTE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM2LCAxNTMsIDE3MCwgMTg3LCAyMDQsIDIyMSwgMjM4LCAyNTV9OworICAgIHBCaXRtYXAtPkRpdGhlckZTKHBhbCwgMTYsICZyZWN0KTsKKyAgfQogfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc0Zvcm0oQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwT0MgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoRlhfQlNUUkMoIk9DIikpOwotICAgIGlmIChwT0MgJiYgbV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJiAhbV9PcHRpb25zLm1fcE9DQ29udGV4dC0+Q2hlY2tPQ0dWaXNpYmxlKHBPQykpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4ID0gcEZvcm1PYmotPm1fRm9ybU1hdHJpeDsKLSAgICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzID0gTlVMTDsKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NPYmplY3ROb0NsaXAoCisgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKSB7CisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBzd2l0Y2ggKHBPYmotPm1fVHlwZSkgeworICAgIGNhc2UgUERGUEFHRV9URVhUOgorICAgICAgYlJldCA9IFByb2Nlc3NUZXh0KChDUERGX1RleHRPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGUEFHRV9QQVRIOgorICAgICAgYlJldCA9IFByb2Nlc3NQYXRoKChDUERGX1BhdGhPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGUEFHRV9JTUFHRToKKyAgICAgIGJSZXQgPSBQcm9jZXNzSW1hZ2UoKENQREZfSW1hZ2VPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGUEFHRV9TSEFESU5HOgorICAgICAgYlJldCA9IFByb2Nlc3NTaGFkaW5nKChDUERGX1NoYWRpbmdPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGUEFHRV9GT1JNOgorICAgICAgYlJldCA9IFByb2Nlc3NGb3JtKChDUERGX0Zvcm1PYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKKyAgICAgIGJyZWFrOworICB9CisgIGlmICghYlJldCkgeworICAgIERyYXdPYmpXaXRoQmFja2dyb3VuZChwT2JqLCBwT2JqMkRldmljZSk7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdPYmpXaXRoQmxlbmQoCisgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKSB7CisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBzd2l0Y2ggKHBPYmotPm1fVHlwZSkgeworICAgIGNhc2UgUERGUEFHRV9QQVRIOgorICAgICAgYlJldCA9IFByb2Nlc3NQYXRoKChDUERGX1BhdGhPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGUEFHRV9JTUFHRToKKyAgICAgIGJSZXQgPSBQcm9jZXNzSW1hZ2UoKENQREZfSW1hZ2VPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGUEFHRV9GT1JNOgorICAgICAgYlJldCA9IFByb2Nlc3NGb3JtKChDUERGX0Zvcm1PYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBiUmV0OworfQordm9pZCBDUERGX1JlbmRlclN0YXR1czo6R2V0U2NhbGVkTWF0cml4KENGWF9NYXRyaXgmIG1hdHJpeCkgY29uc3QgeworICBDRlhfTWF0cml4IGRDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOworICBtYXRyaXguYSAqPSBGWFNZU19mYWJzKGRDVE0uYSk7CisgIG1hdHJpeC5kICo9IEZYU1lTX2ZhYnMoZENUTS5kKTsKK30KK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdPYmpXaXRoQmFja2dyb3VuZCgKKyAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpIHsKKyAgRlhfUkVDVCByZWN0OworICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocE9iaiwgcE9iajJEZXZpY2UsIEZBTFNFLCByZWN0KSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgcmVzID0gMzAwOworICBpZiAocE9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UgJiYKKyAgICAgIG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX0RFVklDRV9DTEFTUykgPT0gRlhEQ19QUklOVEVSKSB7CisgICAgcmVzID0gMDsKKyAgfQorICBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlciBidWZmZXI7CisgIGlmICghYnVmZmVyLkluaXRpYWxpemUobV9wQ29udGV4dCwgbV9wRGV2aWNlLCAmcmVjdCwgcE9iaiwgJm1fT3B0aW9ucywgcmVzKSkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCA9ICpwT2JqMkRldmljZTsKKyAgbWF0cml4LkNvbmNhdCgqYnVmZmVyLkdldE1hdHJpeCgpKTsKKyAgR2V0U2NhbGVkTWF0cml4KG1hdHJpeCk7CisgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7CisgIGlmIChwT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNKSB7CisgICAgQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiA9IChDUERGX0Zvcm1PYmplY3QqKXBPYmo7CiAgICAgaWYgKHBGb3JtT2JqLT5tX3BGb3JtICYmIHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgewotICAgICAgICBwUmVzb3VyY2VzID0gcEZvcm1PYmotPm1fcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7CisgICAgICBwRm9ybVJlc291cmNlID0KKyAgICAgICAgICBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKICAgICB9Ci0gICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwotICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsIG1fcERldmljZSwgTlVMTCwgbV9wU3RvcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBwRm9ybU9iaiwgJm1fT3B0aW9ucywgbV9UcmFuc3BhcmVuY3ksIG1fYkRyb3BPYmplY3RzLCBwUmVzb3VyY2VzLCBGQUxTRSk7Ci0gICAgc3RhdHVzLm1fY3VyQmxlbmQgPSBtX2N1ckJsZW5kOwotICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0gICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocEZvcm1PYmotPm1fcEZvcm0sICZtYXRyaXgpOwotICAgIG1fYlN0b3BwZWQgPSBzdGF0dXMubV9iU3RvcHBlZDsKLSAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotICAgIHJldHVybiBUUlVFOworICB9CisgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKKyAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgYnVmZmVyLkdldERldmljZSgpLCBidWZmZXIuR2V0TWF0cml4KCksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsICZtX09wdGlvbnMsIG1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgcEZvcm1SZXNvdXJjZSk7CisgIHN0YXR1cy5SZW5kZXJTaW5nbGVPYmplY3QocE9iaiwgJm1hdHJpeCk7CisgIGJ1ZmZlci5PdXRwdXRUb0RldmljZSgpOwogfQotRlhfQk9PTCBJc0F2YWlsYWJsZU1hdHJpeChjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpCi17Ci0gICAgaWYgKG1hdHJpeC5hID09IDAgfHwgbWF0cml4LmQgPT0gMCkgewotICAgICAgICByZXR1cm4gbWF0cml4LmIgIT0gMCAmJiBtYXRyaXguYyAhPSAwOwotICAgIH0KLSAgICBpZiAobWF0cml4LmIgPT0gMCB8fCBtYXRyaXguYyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBtYXRyaXguYSAhPSAwICYmIG1hdHJpeC5kICE9IDA7Ci0gICAgfQorRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc0Zvcm0oQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKSB7CisgIENQREZfRGljdGlvbmFyeSogcE9DID0KKyAgICAgIHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiT0MiKSk7CisgIGlmIChwT0MgJiYgbV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJgorICAgICAgIW1fT3B0aW9ucy5tX3BPQ0NvbnRleHQtPkNoZWNrT0NHVmlzaWJsZShwT0MpKSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXggPSBwRm9ybU9iai0+bV9Gb3JtTWF0cml4OworICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CisgIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcyA9IE5VTEw7CisgIGlmIChwRm9ybU9iai0+bV9wRm9ybSAmJiBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QpIHsKKyAgICBwUmVzb3VyY2VzID0gcEZvcm1PYmotPm1fcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7CisgIH0KKyAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOworICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIG1fcFN0b3BPYmosIHRoaXMsIHBGb3JtT2JqLAorICAgICAgICAgICAgICAgICAgICAmbV9PcHRpb25zLCBtX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsIHBSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKyAgc3RhdHVzLm1fY3VyQmxlbmQgPSBtX2N1ckJsZW5kOworICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOworICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwRm9ybU9iai0+bV9wRm9ybSwgJm1hdHJpeCk7CisgIG1fYlN0b3BwZWQgPSBzdGF0dXMubV9iU3RvcHBlZDsKKyAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBpbnQgRmlsbFR5cGUgPSBwUGF0aE9iai0+bV9GaWxsVHlwZTsKLSAgICBGWF9CT09MIGJTdHJva2UgPSBwUGF0aE9iai0+bV9iU3Ryb2tlOwotICAgIFByb2Nlc3NQYXRoUGF0dGVybihwUGF0aE9iaiwgcE9iajJEZXZpY2UsIEZpbGxUeXBlLCBiU3Ryb2tlKTsKLSAgICBpZiAoRmlsbFR5cGUgPT0gMCAmJiAhYlN0cm9rZSkgewotICAgICAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgSXNBdmFpbGFibGVNYXRyaXgoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KSB7CisgIGlmIChtYXRyaXguYSA9PSAwIHx8IG1hdHJpeC5kID09IDApIHsKKyAgICByZXR1cm4gbWF0cml4LmIgIT0gMCAmJiBtYXRyaXguYyAhPSAwOworICB9CisgIGlmIChtYXRyaXguYiA9PSAwIHx8IG1hdHJpeC5jID09IDApIHsKKyAgICByZXR1cm4gbWF0cml4LmEgIT0gMCAmJiBtYXRyaXguZCAhPSAwOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1BhdGgoQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKSB7CisgIGludCBGaWxsVHlwZSA9IHBQYXRoT2JqLT5tX0ZpbGxUeXBlOworICBGWF9CT09MIGJTdHJva2UgPSBwUGF0aE9iai0+bV9iU3Ryb2tlOworICBQcm9jZXNzUGF0aFBhdHRlcm4ocFBhdGhPYmosIHBPYmoyRGV2aWNlLCBGaWxsVHlwZSwgYlN0cm9rZSk7CisgIGlmIChGaWxsVHlwZSA9PSAwICYmICFiU3Ryb2tlKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgRlhfRFdPUkQgZmlsbF9hcmdiID0gMDsKKyAgaWYgKEZpbGxUeXBlKSB7CisgICAgZmlsbF9hcmdiID0gR2V0RmlsbEFyZ2IocFBhdGhPYmopOworICB9CisgIEZYX0RXT1JEIHN0cm9rZV9hcmdiID0gMDsKKyAgaWYgKGJTdHJva2UpIHsKKyAgICBzdHJva2VfYXJnYiA9IEdldFN0cm9rZUFyZ2IocFBhdGhPYmopOworICB9CisgIENGWF9BZmZpbmVNYXRyaXggcGF0aF9tYXRyaXggPSBwUGF0aE9iai0+bV9NYXRyaXg7CisgIHBhdGhfbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOworICBpZiAoIUlzQXZhaWxhYmxlTWF0cml4KHBhdGhfbWF0cml4KSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChGaWxsVHlwZSAmJiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfUkVDVF9BQSkpIHsKKyAgICBGaWxsVHlwZSB8PSBGWEZJTExfUkVDVF9BQTsKKyAgfQorICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfRklMTF9GVUxMQ09WRVIpIHsKKyAgICBGaWxsVHlwZSB8PSBGWEZJTExfRlVMTENPVkVSOworICB9CisgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT1BBVEhTTU9PVEgpIHsKKyAgICBGaWxsVHlwZSB8PSBGWEZJTExfTk9QQVRIU01PT1RIOworICB9CisgIGlmIChiU3Ryb2tlKSB7CisgICAgRmlsbFR5cGUgfD0gRlhfRklMTF9TVFJPS0U7CisgIH0KKyAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbERhdGEgPQorICAgICAgKChDUERGX1BhZ2VPYmplY3QqKXBQYXRoT2JqKS0+bV9HZW5lcmFsU3RhdGU7CisgIGlmIChwR2VuZXJhbERhdGEgJiYgcEdlbmVyYWxEYXRhLT5tX1N0cm9rZUFkanVzdCkgeworICAgIEZpbGxUeXBlIHw9IEZYX1NUUk9LRV9BREpVU1Q7CisgIH0KKyAgaWYgKG1fcFR5cGUzQ2hhcikgeworICAgIEZpbGxUeXBlIHw9IEZYX0ZJTExfVEVYVF9NT0RFOworICB9CisgIENGWF9HcmFwaFN0YXRlRGF0YSBncmFwaFN0YXRlKCpwUGF0aE9iai0+bV9HcmFwaFN0YXRlKTsKKyAgaWYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX1RISU5MSU5FKSB7CisgICAgZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aCA9IDA7CisgIH0KKyAgcmV0dXJuIG1fcERldmljZS0+RHJhd1BhdGgocFBhdGhPYmotPm1fUGF0aCwgJnBhdGhfbWF0cml4LCAmZ3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9hcmdiLCBzdHJva2VfYXJnYiwgRmlsbFR5cGUsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY3VyQmxlbmQpOworfQorQ1BERl9UcmFuc2ZlckZ1bmMqIENQREZfUmVuZGVyU3RhdHVzOjpHZXRUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopIGNvbnN0IHsKKyAgQVNTRVJUKHBPYmogIT0gTlVMTCk7CisgIENQREZfRG9jUmVuZGVyRGF0YSogcERvY0NhY2hlID0gbV9wQ29udGV4dC0+bV9wRG9jdW1lbnQtPkdldFJlbmRlckRhdGEoKTsKKyAgaWYgKCFwRG9jQ2FjaGUpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcERvY0NhY2hlLT5HZXRUcmFuc2ZlckZ1bmMocE9iaik7Cit9CitGWF9BUkdCIENQREZfUmVuZGVyU3RhdHVzOjpHZXRGaWxsQXJnYihjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUeXBlMykgY29uc3QgeworICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwQ29sb3JEYXRhID0KKyAgICAgIChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopcE9iai0+bV9Db2xvclN0YXRlOworICBpZiAobV9wVHlwZTNDaGFyICYmICFiVHlwZTMgJiYKKyAgICAgICghbV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkIHx8CisgICAgICAgKG1fcFR5cGUzQ2hhci0+bV9iQ29sb3JlZCAmJgorICAgICAgICAoIXBDb2xvckRhdGEgfHwgcENvbG9yRGF0YS0+bV9GaWxsQ29sb3IuSXNOdWxsKCkpKSkpIHsKKyAgICByZXR1cm4gbV9UM0ZpbGxDb2xvcjsKKyAgfQorICBpZiAoIXBDb2xvckRhdGEgfHwgcENvbG9yRGF0YS0+bV9GaWxsQ29sb3IuSXNOdWxsKCkpIHsKKyAgICBwQ29sb3JEYXRhID0gKENQREZfQ29sb3JTdGF0ZURhdGEqKShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhKikKKyAgICAgICAgICAgICAgICAgICAgIG1fSW5pdGlhbFN0YXRlcy5tX0NvbG9yU3RhdGU7CisgIH0KKyAgRlhfQ09MT1JSRUYgcmdiID0gcENvbG9yRGF0YS0+bV9GaWxsUkdCOworICBpZiAocmdiID09IChGWF9EV09SRCktMSkgeworICAgIHJldHVybiAwOworICB9CisgIGNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxEYXRhID0gcE9iai0+bV9HZW5lcmFsU3RhdGU7CisgIGludCBhbHBoYTsKKyAgaWYgKHBHZW5lcmFsRGF0YSkgeworICAgIGFscGhhID0gKGludDMyX3QpKHBHZW5lcmFsRGF0YS0+bV9GaWxsQWxwaGEgKiAyNTUpOworICAgIGlmIChwR2VuZXJhbERhdGEtPm1fcFRSKSB7CisgICAgICBpZiAoIXBHZW5lcmFsRGF0YS0+bV9wVHJhbnNmZXJGdW5jKSB7CisgICAgICAgICgoQ1BERl9HZW5lcmFsU3RhdGVEYXRhKilwR2VuZXJhbERhdGEpLT5tX3BUcmFuc2ZlckZ1bmMgPQorICAgICAgICAgICAgR2V0VHJhbnNmZXJGdW5jKHBHZW5lcmFsRGF0YS0+bV9wVFIpOworICAgICAgfQorICAgICAgaWYgKHBHZW5lcmFsRGF0YS0+bV9wVHJhbnNmZXJGdW5jKSB7CisgICAgICAgIHJnYiA9IHBHZW5lcmFsRGF0YS0+bV9wVHJhbnNmZXJGdW5jLT5UcmFuc2xhdGVDb2xvcihyZ2IpOworICAgICAgfQogICAgIH0KLSAgICBGWF9EV09SRCBmaWxsX2FyZ2IgPSAwOwotICAgIGlmIChGaWxsVHlwZSkgewotICAgICAgICBmaWxsX2FyZ2IgPSBHZXRGaWxsQXJnYihwUGF0aE9iaik7CisgIH0gZWxzZSB7CisgICAgYWxwaGEgPSAyNTU7CisgIH0KKyAgcmV0dXJuIG1fT3B0aW9ucy5UcmFuc2xhdGVDb2xvcihBcmdiRW5jb2RlKGFscGhhLCByZ2IpKTsKK30KK0ZYX0FSR0IgQ1BERl9SZW5kZXJTdGF0dXM6OkdldFN0cm9rZUFyZ2IoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqKSBjb25zdCB7CisgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBDb2xvckRhdGEgPQorICAgICAgKENQREZfQ29sb3JTdGF0ZURhdGEqKShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhKilwT2JqLT5tX0NvbG9yU3RhdGU7CisgIGlmIChtX3BUeXBlM0NoYXIgJiYgKCFtX3BUeXBlM0NoYXItPm1fYkNvbG9yZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKG1fcFR5cGUzQ2hhci0+bV9iQ29sb3JlZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fU3Ryb2tlQ29sb3IuSXNOdWxsKCkpKSkpIHsKKyAgICByZXR1cm4gbV9UM0ZpbGxDb2xvcjsKKyAgfQorICBpZiAoIXBDb2xvckRhdGEgfHwgcENvbG9yRGF0YS0+bV9TdHJva2VDb2xvci5Jc051bGwoKSkgeworICAgIHBDb2xvckRhdGEgPSAoQ1BERl9Db2xvclN0YXRlRGF0YSopKGNvbnN0IENQREZfQ29sb3JTdGF0ZURhdGEqKQorICAgICAgICAgICAgICAgICAgICAgbV9Jbml0aWFsU3RhdGVzLm1fQ29sb3JTdGF0ZTsKKyAgfQorICBGWF9DT0xPUlJFRiByZ2IgPSBwQ29sb3JEYXRhLT5tX1N0cm9rZVJHQjsKKyAgaWYgKHJnYiA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsRGF0YSA9IHBPYmotPm1fR2VuZXJhbFN0YXRlOworICBpbnQgYWxwaGE7CisgIGlmIChwR2VuZXJhbERhdGEpIHsKKyAgICBhbHBoYSA9IChpbnQzMl90KShwR2VuZXJhbERhdGEtPm1fU3Ryb2tlQWxwaGEgKiAyNTUpOworICAgIGlmIChwR2VuZXJhbERhdGEtPm1fcFRSKSB7CisgICAgICBpZiAoIXBHZW5lcmFsRGF0YS0+bV9wVHJhbnNmZXJGdW5jKSB7CisgICAgICAgICgoQ1BERl9HZW5lcmFsU3RhdGVEYXRhKilwR2VuZXJhbERhdGEpLT5tX3BUcmFuc2ZlckZ1bmMgPQorICAgICAgICAgICAgR2V0VHJhbnNmZXJGdW5jKHBHZW5lcmFsRGF0YS0+bV9wVFIpOworICAgICAgfQorICAgICAgaWYgKHBHZW5lcmFsRGF0YS0+bV9wVHJhbnNmZXJGdW5jKSB7CisgICAgICAgIHJnYiA9IHBHZW5lcmFsRGF0YS0+bV9wVHJhbnNmZXJGdW5jLT5UcmFuc2xhdGVDb2xvcihyZ2IpOworICAgICAgfQogICAgIH0KLSAgICBGWF9EV09SRCBzdHJva2VfYXJnYiA9IDA7Ci0gICAgaWYgKGJTdHJva2UpIHsKLSAgICAgICAgc3Ryb2tlX2FyZ2IgPSBHZXRTdHJva2VBcmdiKHBQYXRoT2JqKTsKKyAgfSBlbHNlIHsKKyAgICBhbHBoYSA9IDI1NTsKKyAgfQorICByZXR1cm4gbV9PcHRpb25zLlRyYW5zbGF0ZUNvbG9yKEFyZ2JFbmNvZGUoYWxwaGEsIHJnYikpOworfQordm9pZCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc0NsaXBQYXRoKENQREZfQ2xpcFBhdGggQ2xpcFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpIHsKKyAgaWYgKENsaXBQYXRoLklzTnVsbCgpKSB7CisgICAgaWYgKG1fTGFzdENsaXBQYXRoLklzTnVsbCgpKSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggcGF0aF9tYXRyaXggPSBwUGF0aE9iai0+bV9NYXRyaXg7Ci0gICAgcGF0aF9tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7Ci0gICAgaWYgKCFJc0F2YWlsYWJsZU1hdHJpeChwYXRoX21hdHJpeCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoVFJVRSk7CisgICAgbV9MYXN0Q2xpcFBhdGguU2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9MYXN0Q2xpcFBhdGggPT0gQ2xpcFBhdGgpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9MYXN0Q2xpcFBhdGggPSBDbGlwUGF0aDsKKyAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoVFJVRSk7CisgIGludCBuQ2xpcFBhdGggPSBDbGlwUGF0aC5HZXRQYXRoQ291bnQoKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBuQ2xpcFBhdGg7IGkrKykgeworICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhID0gQ2xpcFBhdGguR2V0UGF0aChpKTsKKyAgICBpZiAocFBhdGhEYXRhID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAoRmlsbFR5cGUgJiYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX1JFQ1RfQUEpKSB7Ci0gICAgICAgIEZpbGxUeXBlIHw9IEZYRklMTF9SRUNUX0FBOworICAgIGlmIChwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSAwKSB7CisgICAgICBDRlhfUGF0aERhdGEgRW1wdHlQYXRoOworICAgICAgRW1wdHlQYXRoLkFwcGVuZFJlY3QoLTEsIC0xLCAwLCAwKTsKKyAgICAgIGludCBmaWxsX21vZGUgPSBGWEZJTExfV0lORElORzsKKyAgICAgIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbCgmRW1wdHlQYXRoLCBOVUxMLCBmaWxsX21vZGUpOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgQ2xpcFR5cGUgPSBDbGlwUGF0aC5HZXRDbGlwVHlwZShpKTsKKyAgICAgIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwUGF0aERhdGEsIHBPYmoyRGV2aWNlLCBDbGlwVHlwZSk7CiAgICAgfQotICAgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9GSUxMX0ZVTExDT1ZFUikgewotICAgICAgICBGaWxsVHlwZSB8PSBGWEZJTExfRlVMTENPVkVSOworICB9CisgIGludCB0ZXh0Y291bnQgPSBDbGlwUGF0aC5HZXRUZXh0Q291bnQoKTsKKyAgaWYgKHRleHRjb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCkgPT0gRlhEQ19ESVNQTEFZICYmCisgICAgICAhKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfU09GVF9DTElQKSkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfUGF0aERhdGEqIHBUZXh0Q2xpcHBpbmdQYXRoID0gTlVMTDsKKyAgZm9yIChpID0gMDsgaSA8IHRleHRjb3VudDsgaSsrKSB7CisgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dCA9IENsaXBQYXRoLkdldFRleHQoaSk7CisgICAgaWYgKHBUZXh0ID09IE5VTEwpIHsKKyAgICAgIGlmIChwVGV4dENsaXBwaW5nUGF0aCkgeworICAgICAgICBpbnQgZmlsbF9tb2RlID0gRlhGSUxMX1dJTkRJTkc7CisgICAgICAgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT1RFWFRTTU9PVEgpIHsKKyAgICAgICAgICBmaWxsX21vZGUgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKKyAgICAgICAgfQorICAgICAgICBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocFRleHRDbGlwcGluZ1BhdGgsIE5VTEwsIGZpbGxfbW9kZSk7CisgICAgICAgIGRlbGV0ZSBwVGV4dENsaXBwaW5nUGF0aDsKKyAgICAgICAgcFRleHRDbGlwcGluZ1BhdGggPSBOVUxMOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAocFRleHRDbGlwcGluZ1BhdGggPT0gTlVMTCkgeworICAgICAgICBwVGV4dENsaXBwaW5nUGF0aCA9IG5ldyBDRlhfUGF0aERhdGE7CisgICAgICB9CisgICAgICBQcm9jZXNzVGV4dChwVGV4dCwgcE9iajJEZXZpY2UsIHBUZXh0Q2xpcHBpbmdQYXRoKTsKICAgICB9Ci0gICAgaWYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX05PUEFUSFNNT09USCkgewotICAgICAgICBGaWxsVHlwZSB8PSBGWEZJTExfTk9QQVRIU01PT1RIOworICB9CisgIGRlbGV0ZSBwVGV4dENsaXBwaW5nUGF0aDsKK30KK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdDbGlwUGF0aChDUERGX0NsaXBQYXRoIENsaXBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKSB7CisgIGlmIChDbGlwUGF0aC5Jc051bGwoKSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgZmlsbF9tb2RlID0gMDsKKyAgaWYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX05PUEFUSFNNT09USCkgeworICAgIGZpbGxfbW9kZSB8PSBGWEZJTExfTk9QQVRIU01PT1RIOworICB9CisgIGludCBuQ2xpcFBhdGggPSBDbGlwUGF0aC5HZXRQYXRoQ291bnQoKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBuQ2xpcFBhdGg7IGkrKykgeworICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhID0gQ2xpcFBhdGguR2V0UGF0aChpKTsKKyAgICBpZiAocFBhdGhEYXRhID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAoYlN0cm9rZSkgewotICAgICAgICBGaWxsVHlwZSB8PSBGWF9GSUxMX1NUUk9LRTsKKyAgICBDRlhfR3JhcGhTdGF0ZURhdGEgc3Ryb2tlX3N0YXRlOworICAgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9USElOTElORSkgeworICAgICAgc3Ryb2tlX3N0YXRlLm1fTGluZVdpZHRoID0gMDsKICAgICB9Ci0gICAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbERhdGEgPSAoKENQREZfUGFnZU9iamVjdCopcFBhdGhPYmopLT5tX0dlbmVyYWxTdGF0ZTsKLSAgICBpZiAocEdlbmVyYWxEYXRhICYmIHBHZW5lcmFsRGF0YS0+bV9TdHJva2VBZGp1c3QpIHsKLSAgICAgICAgRmlsbFR5cGUgfD0gRlhfU1RST0tFX0FESlVTVDsKLSAgICB9Ci0gICAgaWYgKG1fcFR5cGUzQ2hhcikgewotICAgICAgICBGaWxsVHlwZSB8PSBGWF9GSUxMX1RFWFRfTU9ERTsKLSAgICB9CisgICAgbV9wRGV2aWNlLT5EcmF3UGF0aChwUGF0aERhdGEsIHBPYmoyRGV2aWNlLCAmc3Ryb2tlX3N0YXRlLCAwLCAweGZmZmYwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlKTsKKyAgfQorfQorRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6U2VsZWN0Q2xpcFBhdGgoQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tlKSB7CisgIENGWF9BZmZpbmVNYXRyaXggcGF0aF9tYXRyaXggPSBwUGF0aE9iai0+bV9NYXRyaXg7CisgIHBhdGhfbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOworICBpZiAoYlN0cm9rZSkgewogICAgIENGWF9HcmFwaFN0YXRlRGF0YSBncmFwaFN0YXRlKCpwUGF0aE9iai0+bV9HcmFwaFN0YXRlKTsKICAgICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfVEhJTkxJTkUpIHsKLSAgICAgICAgZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aCA9IDA7CisgICAgICBncmFwaFN0YXRlLm1fTGluZVdpZHRoID0gMDsKICAgICB9Ci0gICAgcmV0dXJuIG1fcERldmljZS0+RHJhd1BhdGgocFBhdGhPYmotPm1fUGF0aCwgJnBhdGhfbWF0cml4LCAmZ3JhcGhTdGF0ZSwgZmlsbF9hcmdiLCBzdHJva2VfYXJnYiwgRmlsbFR5cGUsIDAsIE5VTEwsIG1fY3VyQmxlbmQpOworICAgIHJldHVybiBtX3BEZXZpY2UtPlNldENsaXBfUGF0aFN0cm9rZShwUGF0aE9iai0+bV9QYXRoLCAmcGF0aF9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZncmFwaFN0YXRlKTsKKyAgfQorICBpbnQgZmlsbF9tb2RlID0gcFBhdGhPYmotPm1fRmlsbFR5cGU7CisgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT1BBVEhTTU9PVEgpIHsKKyAgICBmaWxsX21vZGUgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKKyAgfQorICByZXR1cm4gbV9wRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKHBQYXRoT2JqLT5tX1BhdGgsICZwYXRoX21hdHJpeCwgZmlsbF9tb2RlKTsKIH0KLUNQREZfVHJhbnNmZXJGdW5jKiBDUERGX1JlbmRlclN0YXR1czo6R2V0VHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqKSBjb25zdAotewotICAgIEFTU0VSVChwT2JqICE9IE5VTEwpOwotICAgIENQREZfRG9jUmVuZGVyRGF0YSogcERvY0NhY2hlID0gbV9wQ29udGV4dC0+bV9wRG9jdW1lbnQtPkdldFJlbmRlckRhdGEoKTsKLSAgICBpZiAoIXBEb2NDYWNoZSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHBEb2NDYWNoZS0+R2V0VHJhbnNmZXJGdW5jKHBPYmopOwotfQotRlhfQVJHQiBDUERGX1JlbmRlclN0YXR1czo6R2V0RmlsbEFyZ2IoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBGWF9CT09MIGJUeXBlMykgY29uc3QKLXsKLSAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwQ29sb3JEYXRhID0gKENQREZfQ29sb3JTdGF0ZURhdGEqKShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhKilwT2JqLT5tX0NvbG9yU3RhdGU7Ci0gICAgaWYgKG1fcFR5cGUzQ2hhciAmJiAhYlR5cGUzICYmICghbV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkIHx8IChtX3BUeXBlM0NoYXItPm1fYkNvbG9yZWQgJiYgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fRmlsbENvbG9yLklzTnVsbCgpKSkpKSB7Ci0gICAgICAgIHJldHVybiBtX1QzRmlsbENvbG9yOwotICAgIH0KLSAgICBpZiAoIXBDb2xvckRhdGEgfHwgcENvbG9yRGF0YS0+bV9GaWxsQ29sb3IuSXNOdWxsKCkpIHsKLSAgICAgICAgcENvbG9yRGF0YSA9IChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopbV9Jbml0aWFsU3RhdGVzLm1fQ29sb3JTdGF0ZTsKLSAgICB9Ci0gICAgRlhfQ09MT1JSRUYgcmdiID0gcENvbG9yRGF0YS0+bV9GaWxsUkdCOwotICAgIGlmIChyZ2IgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxEYXRhID0gcE9iai0+bV9HZW5lcmFsU3RhdGU7Ci0gICAgaW50IGFscGhhOwotICAgIGlmIChwR2VuZXJhbERhdGEpIHsKLSAgICAgICAgYWxwaGEgPSAoaW50MzJfdCkocEdlbmVyYWxEYXRhLT5tX0ZpbGxBbHBoYSAqIDI1NSk7Ci0gICAgICAgIGlmIChwR2VuZXJhbERhdGEtPm1fcFRSKSB7Ci0gICAgICAgICAgICBpZiAoIXBHZW5lcmFsRGF0YS0+bV9wVHJhbnNmZXJGdW5jKSB7Ci0gICAgICAgICAgICAgICAgKChDUERGX0dlbmVyYWxTdGF0ZURhdGEqKXBHZW5lcmFsRGF0YSktPm1fcFRyYW5zZmVyRnVuYyA9IEdldFRyYW5zZmVyRnVuYyhwR2VuZXJhbERhdGEtPm1fcFRSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYykgewotICAgICAgICAgICAgICAgIHJnYiA9IHBHZW5lcmFsRGF0YS0+bV9wVHJhbnNmZXJGdW5jLT5UcmFuc2xhdGVDb2xvcihyZ2IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWxwaGEgPSAyNTU7Ci0gICAgfQotICAgIHJldHVybiBtX09wdGlvbnMuVHJhbnNsYXRlQ29sb3IoQXJnYkVuY29kZShhbHBoYSwgcmdiKSk7Ci19Ci1GWF9BUkdCIENQREZfUmVuZGVyU3RhdHVzOjpHZXRTdHJva2VBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikgY29uc3QKLXsKLSAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwQ29sb3JEYXRhID0gKENQREZfQ29sb3JTdGF0ZURhdGEqKShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhKilwT2JqLT5tX0NvbG9yU3RhdGU7Ci0gICAgaWYgKG1fcFR5cGUzQ2hhciAmJiAoIW1fcFR5cGUzQ2hhci0+bV9iQ29sb3JlZCB8fCAobV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkICYmICghcENvbG9yRGF0YSB8fCBwQ29sb3JEYXRhLT5tX1N0cm9rZUNvbG9yLklzTnVsbCgpKSkpKSB7Ci0gICAgICAgIHJldHVybiBtX1QzRmlsbENvbG9yOwotICAgIH0KLSAgICBpZiAoIXBDb2xvckRhdGEgfHwgcENvbG9yRGF0YS0+bV9TdHJva2VDb2xvci5Jc051bGwoKSkgewotICAgICAgICBwQ29sb3JEYXRhID0gKENQREZfQ29sb3JTdGF0ZURhdGEqKShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhKiltX0luaXRpYWxTdGF0ZXMubV9Db2xvclN0YXRlOwotICAgIH0KLSAgICBGWF9DT0xPUlJFRiByZ2IgPSBwQ29sb3JEYXRhLT5tX1N0cm9rZVJHQjsKLSAgICBpZiAocmdiID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsRGF0YSA9IHBPYmotPm1fR2VuZXJhbFN0YXRlOwotICAgIGludCBhbHBoYTsKLSAgICBpZiAocEdlbmVyYWxEYXRhKSB7Ci0gICAgICAgIGFscGhhID0gKGludDMyX3QpKHBHZW5lcmFsRGF0YS0+bV9TdHJva2VBbHBoYSAqIDI1NSk7Ci0gICAgICAgIGlmIChwR2VuZXJhbERhdGEtPm1fcFRSKSB7Ci0gICAgICAgICAgICBpZiAoIXBHZW5lcmFsRGF0YS0+bV9wVHJhbnNmZXJGdW5jKSB7Ci0gICAgICAgICAgICAgICAgKChDUERGX0dlbmVyYWxTdGF0ZURhdGEqKXBHZW5lcmFsRGF0YSktPm1fcFRyYW5zZmVyRnVuYyA9IEdldFRyYW5zZmVyRnVuYyhwR2VuZXJhbERhdGEtPm1fcFRSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYykgewotICAgICAgICAgICAgICAgIHJnYiA9IHBHZW5lcmFsRGF0YS0+bV9wVHJhbnNmZXJGdW5jLT5UcmFuc2xhdGVDb2xvcihyZ2IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWxwaGEgPSAyNTU7Ci0gICAgfQotICAgIHJldHVybiBtX09wdGlvbnMuVHJhbnNsYXRlQ29sb3IoQXJnYkVuY29kZShhbHBoYSwgcmdiKSk7Ci19Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzQ2xpcFBhdGgoQ1BERl9DbGlwUGF0aCBDbGlwUGF0aCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCi17Ci0gICAgaWYgKENsaXBQYXRoLklzTnVsbCgpKSB7Ci0gICAgICAgIGlmIChtX0xhc3RDbGlwUGF0aC5Jc051bGwoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKFRSVUUpOwotICAgICAgICBtX0xhc3RDbGlwUGF0aC5TZXROdWxsKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fTGFzdENsaXBQYXRoID09IENsaXBQYXRoKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9MYXN0Q2xpcFBhdGggPSBDbGlwUGF0aDsKLSAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZShUUlVFKTsKLSAgICBpbnQgbkNsaXBQYXRoID0gQ2xpcFBhdGguR2V0UGF0aENvdW50KCk7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5DbGlwUGF0aDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhID0gQ2xpcFBhdGguR2V0UGF0aChpKTsKLSAgICAgICAgaWYgKHBQYXRoRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIEVtcHR5UGF0aDsKLSAgICAgICAgICAgIEVtcHR5UGF0aC5BcHBlbmRSZWN0KC0xLCAtMSwgMCwgMCk7Ci0gICAgICAgICAgICBpbnQgZmlsbF9tb2RlID0gRlhGSUxMX1dJTkRJTkc7Ci0gICAgICAgICAgICBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwoJkVtcHR5UGF0aCwgTlVMTCwgZmlsbF9tb2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBDbGlwVHlwZSA9IENsaXBQYXRoLkdldENsaXBUeXBlKGkpOwotICAgICAgICAgICAgbV9wRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKHBQYXRoRGF0YSwgcE9iajJEZXZpY2UsIENsaXBUeXBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgdGV4dGNvdW50ID0gQ2xpcFBhdGguR2V0VGV4dENvdW50KCk7Ci0gICAgaWYgKHRleHRjb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSA9PSBGWERDX0RJU1BMQVkgJiYgIShtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX1NPRlRfQ0xJUCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfUGF0aERhdGEqIHBUZXh0Q2xpcHBpbmdQYXRoID0gTlVMTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgdGV4dGNvdW50OyBpICsrKSB7Ci0gICAgICAgIENQREZfVGV4dE9iamVjdCogcFRleHQgPSBDbGlwUGF0aC5HZXRUZXh0KGkpOwotICAgICAgICBpZiAocFRleHQgPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHBUZXh0Q2xpcHBpbmdQYXRoKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSA9IEZYRklMTF9XSU5ESU5HOwotICAgICAgICAgICAgICAgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT1RFWFRTTU9PVEgpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwVGV4dENsaXBwaW5nUGF0aCwgTlVMTCwgZmlsbF9tb2RlKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcFRleHRDbGlwcGluZ1BhdGg7Ci0gICAgICAgICAgICAgICAgcFRleHRDbGlwcGluZ1BhdGggPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBUZXh0Q2xpcHBpbmdQYXRoID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwVGV4dENsaXBwaW5nUGF0aCA9IG5ldyBDRlhfUGF0aERhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQcm9jZXNzVGV4dChwVGV4dCwgcE9iajJEZXZpY2UsIHBUZXh0Q2xpcHBpbmdQYXRoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBkZWxldGUgcFRleHRDbGlwcGluZ1BhdGg7Ci19Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3Q2xpcFBhdGgoQ1BERl9DbGlwUGF0aCBDbGlwUGF0aCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCi17Ci0gICAgaWYgKENsaXBQYXRoLklzTnVsbCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGZpbGxfbW9kZSA9IDA7Ci0gICAgaWYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX05PUEFUSFNNT09USCkgewotICAgICAgICBmaWxsX21vZGUgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKLSAgICB9Ci0gICAgaW50IG5DbGlwUGF0aCA9IENsaXBQYXRoLkdldFBhdGhDb3VudCgpOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuQ2xpcFBhdGg7IGkrKykgewotICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSA9IENsaXBQYXRoLkdldFBhdGgoaSk7Ci0gICAgICAgIGlmIChwUGF0aERhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIHN0cm9rZV9zdGF0ZTsKLSAgICAgICAgaWYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX1RISU5MSU5FKSB7Ci0gICAgICAgICAgICBzdHJva2Vfc3RhdGUubV9MaW5lV2lkdGggPSAwOwotICAgICAgICB9Ci0gICAgICAgIG1fcERldmljZS0+RHJhd1BhdGgocFBhdGhEYXRhLCBwT2JqMkRldmljZSwgJnN0cm9rZV9zdGF0ZSwgMCwgMHhmZmZmMDAwMCwgZmlsbF9tb2RlKTsKLSAgICB9Ci19Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpTZWxlY3RDbGlwUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKQotewotICAgIENGWF9BZmZpbmVNYXRyaXggcGF0aF9tYXRyaXggPSBwUGF0aE9iai0+bV9NYXRyaXg7Ci0gICAgcGF0aF9tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7Ci0gICAgaWYgKGJTdHJva2UpIHsKLSAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdyYXBoU3RhdGUoKnBQYXRoT2JqLT5tX0dyYXBoU3RhdGUpOwotICAgICAgICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfVEhJTkxJTkUpIHsKLSAgICAgICAgICAgIGdyYXBoU3RhdGUubV9MaW5lV2lkdGggPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtX3BEZXZpY2UtPlNldENsaXBfUGF0aFN0cm9rZShwUGF0aE9iai0+bV9QYXRoLCAmcGF0aF9tYXRyaXgsICZncmFwaFN0YXRlKTsKLSAgICB9Ci0gICAgaW50IGZpbGxfbW9kZSA9IHBQYXRoT2JqLT5tX0ZpbGxUeXBlOwotICAgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT1BBVEhTTU9PVEgpIHsKLSAgICAgICAgZmlsbF9tb2RlIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7Ci0gICAgfQotICAgIHJldHVybiBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocFBhdGhPYmotPm1fUGF0aCwgJnBhdGhfbWF0cml4LCBmaWxsX21vZGUpOwotfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1RyYW5zcGFyZW5jeShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsU3RhdGUgPSBwUGFnZU9iai0+bV9HZW5lcmFsU3RhdGU7Ci0gICAgaW50IGJsZW5kX3R5cGUgPSBwR2VuZXJhbFN0YXRlID8gcEdlbmVyYWxTdGF0ZS0+bV9CbGVuZFR5cGUgOiBGWERJQl9CTEVORF9OT1JNQUw7Ci0gICAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfVU5TVVBQT1JURUQpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCA9IHBHZW5lcmFsU3RhdGUgPyAoQ1BERl9EaWN0aW9uYXJ5KilwR2VuZXJhbFN0YXRlLT5tX3BTb2Z0TWFzayA6IE5VTEw7Ci0gICAgaWYgKHBTTWFza0RpY3QpIHsKLSAgICAgICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSAmJgotICAgICAgICAgICAgICAgICgoQ1BERl9JbWFnZU9iamVjdCopcFBhZ2VPYmopLT5tX3BJbWFnZS0+R2V0RGljdCgpLT5LZXlFeGlzdChGWF9CU1RSQygiU01hc2siKSkpIHsKLSAgICAgICAgICAgIHBTTWFza0RpY3QgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7Ci0gICAgRlhfRkxPQVQgZ3JvdXBfYWxwaGEgPSAxLjBmOwotICAgIGludCBUcmFuc3BhcmVuY3kgPSBtX1RyYW5zcGFyZW5jeTsKLSAgICBGWF9CT09MIGJHcm91cFRyYW5zcGFyZW50ID0gRkFMU0U7Ci0gICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNKSB7Ci0gICAgICAgIENQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwUGFnZU9iajsKLSAgICAgICAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhICpwU3RhdGVEYXRhID0gcEZvcm1PYmotPm1fR2VuZXJhbFN0YXRlLkdldE9iamVjdCgpOwotICAgICAgICBpZiAocFN0YXRlRGF0YSkgewotICAgICAgICAgICAgZ3JvdXBfYWxwaGEgPSBwU3RhdGVEYXRhLT5tX0ZpbGxBbHBoYTsKLSAgICAgICAgfQotICAgICAgICBUcmFuc3BhcmVuY3kgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3k7Ci0gICAgICAgIGJHcm91cFRyYW5zcGFyZW50ID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQgPyBUUlVFIDogRkFMU0U7Ci0gICAgICAgIGlmIChwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QpIHsKLSAgICAgICAgICAgIHBGb3JtUmVzb3VyY2UgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYX0JPT0wgYlRleHRDbGlwID0gRkFMU0U7Ci0gICAgaWYgKHBQYWdlT2JqLT5tX0NsaXBQYXRoLk5vdE51bGwoKSAmJiBwUGFnZU9iai0+bV9DbGlwUGF0aC5HZXRUZXh0Q291bnQoKSAmJgotICAgICAgICAgICAgbV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpID09IEZYRENfRElTUExBWSAmJiAhKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfU09GVF9DTElQKSkgewotICAgICAgICBiVGV4dENsaXAgPSBUUlVFOwotICAgIH0KLSAgICBpZiAoKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX09WRVJQUklOVCkgJiYgcFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFICYmIHBHZW5lcmFsU3RhdGUgJiYgcEdlbmVyYWxTdGF0ZS0+bV9GaWxsT1AgJiYgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VPUCkgewotICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBOVUxMOwotICAgICAgICBDUERGX1BhZ2UqIHBQYWdlID0gTlVMTDsKLSAgICAgICAgaWYgKG1fcENvbnRleHQtPm1fcFBhZ2VDYWNoZSkgewotICAgICAgICAgICAgcFBhZ2UgPSBtX3BDb250ZXh0LT5tX3BQYWdlQ2FjaGUtPkdldFBhZ2UoKTsKLSAgICAgICAgICAgIHBEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBEb2N1bWVudCA9ICgoQ1BERl9JbWFnZU9iamVjdCopcFBhZ2VPYmopLT5tX3BJbWFnZS0+R2V0RG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzID0gcFBhZ2UgPyBwUGFnZS0+bV9wUGFnZVJlc291cmNlcyA6IE5VTEw7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPSAoKENQREZfSW1hZ2VPYmplY3QqKXBQYWdlT2JqKS0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpLT5HZXREaWN0KCktPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKLSAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ29sb3JTcGFjZSA9IHBEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocENTT2JqLCBwUGFnZVJlc291cmNlcyk7Ci0gICAgICAgIGlmIChwQ29sb3JTcGFjZSkgewotICAgICAgICAgICAgaW50IGZvcm1hdCA9IHBDb2xvclNwYWNlLT5HZXRGYW1pbHkoKTsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gUERGQ1NfREVWSUNFQ01ZSyB8fCBmb3JtYXQgPT0gUERGQ1NfU0VQQVJBVElPTiB8fCBmb3JtYXQgPT0gUERGQ1NfREVWSUNFTikgewotICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9EQVJLRU47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDU09iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBTTWFza0RpY3QgPT0gTlVMTCAmJiBncm91cF9hbHBoYSA9PSAxLjBmICYmIGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmICFiVGV4dENsaXAgJiYgIWJHcm91cFRyYW5zcGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfQk9PTCBpc29sYXRlZCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEOwotICAgIGlmIChtX2JQcmludCkgewotICAgICAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKLSAgICAgICAgaW50IHJlbmRDYXBzID0gbV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCk7Ci0gICAgICAgIGlmICghKChUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCkgfHwgcFNNYXNrRGljdCB8fCBiVGV4dENsaXApICYmIChyZW5kQ2FwcyAmIEZYUkNfQkxFTkRfTU9ERSkpIHsKLSAgICAgICAgICAgIGludCBvbGRCbGVuZCA9IG1fY3VyQmxlbmQ7Ci0gICAgICAgICAgICBtX2N1ckJsZW5kID0gYmxlbmRfdHlwZTsKLSAgICAgICAgICAgIGJSZXQgPSBEcmF3T2JqV2l0aEJsZW5kKHBQYWdlT2JqLCBwT2JqMkRldmljZSk7Ci0gICAgICAgICAgICBtX2N1ckJsZW5kID0gb2xkQmxlbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiUmV0KSB7Ci0gICAgICAgICAgICBEcmF3T2JqV2l0aEJhY2tncm91bmQocFBhZ2VPYmosIHBPYmoyRGV2aWNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfUkVDVCByZWN0ID0gcFBhZ2VPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOwotICAgIHJlY3QuSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKLSAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENGWF9NYXRyaXggZGV2aWNlQ1RNID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKLSAgICBGWF9GTE9BVCBzY2FsZVggPSBGWFNZU19mYWJzKGRldmljZUNUTS5hKTsKLSAgICBGWF9GTE9BVCBzY2FsZVkgPSBGWFNZU19mYWJzKGRldmljZUNUTS5kKTsKLSAgICBpbnQgd2lkdGggPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpcmVjdC5XaWR0aCgpICogc2NhbGVYKTsKLSAgICBpbnQgaGVpZ2h0ID0gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKXJlY3QuSGVpZ2h0KCkgKiBzY2FsZVkpOwotICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7Ci0gICAgQ0ZYX0RJQml0bWFwKiBvcmlEZXZpY2UgPSBOVUxMOwotICAgIGlmICghaXNvbGF0ZWQgJiYgKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19HRVRfQklUUykpIHsKLSAgICAgICAgb3JpRGV2aWNlID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgICAgaWYgKCFtX3BEZXZpY2UtPkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAob3JpRGV2aWNlLCB3aWR0aCwgaGVpZ2h0KSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGV2aWNlLT5HZXRESUJpdHMob3JpRGV2aWNlLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKLSAgICB9Ci0gICAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9BcmdiLCAwLCBvcmlEZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBDRlhfRElCaXRtYXAqIGJpdG1hcCA9IGJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCk7Ci0gICAgYml0bWFwLT5DbGVhcigwKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG5ld19tYXRyaXggPSAqcE9iajJEZXZpY2U7Ci0gICAgbmV3X21hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7Ci0gICAgbmV3X21hdHJpeC5TY2FsZShzY2FsZVgsIHNjYWxlWSk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwVGV4dE1hc2sgPSBOVUxMOwotICAgIGlmIChiVGV4dENsaXApIHsKLSAgICAgICAgcFRleHRNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgICAgaWYgKCFwVGV4dE1hc2stPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwVGV4dE1hc2s7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBwVGV4dE1hc2stPkNsZWFyKDApOwotICAgICAgICBDRlhfRnhnZURldmljZSB0ZXh0X2RldmljZTsKLSAgICAgICAgdGV4dF9kZXZpY2UuQXR0YWNoKHBUZXh0TWFzayk7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwUGFnZU9iai0+bV9DbGlwUGF0aC5HZXRUZXh0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqID0gcFBhZ2VPYmotPm1fQ2xpcFBhdGguR2V0VGV4dChpKTsKLSAgICAgICAgICAgIGlmICh0ZXh0b2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggdGV4dF9tYXRyaXg7Ci0gICAgICAgICAgICB0ZXh0b2JqLT5HZXRUZXh0TWF0cml4KCZ0ZXh0X21hdHJpeCk7Ci0gICAgICAgICAgICBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRQYXRoKCZ0ZXh0X2RldmljZSwgdGV4dG9iai0+bV9uQ2hhcnMsIHRleHRvYmotPm1fcENoYXJDb2RlcywgdGV4dG9iai0+bV9wQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udCgpLCB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9tYXRyaXgsICZuZXdfbWF0cml4LCB0ZXh0b2JqLT5tX0dyYXBoU3RhdGUsIChGWF9BUkdCKSAtIDEsIDAsIE5VTEwpOwotICAgICAgICB9Ci0gICAgfQotICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7Ci0gICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdG9wT2JqLCBOVUxMLCBOVUxMLCAmbV9PcHRpb25zLCAwLCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgVFJVRSk7Ci0gICAgYml0bWFwX3JlbmRlci5Qcm9jZXNzT2JqZWN0Tm9DbGlwKHBQYWdlT2JqLCAmbmV3X21hdHJpeCk7Ci0gICAgbV9iU3RvcHBlZCA9IGJpdG1hcF9yZW5kZXIubV9iU3RvcHBlZDsKLSAgICBpZiAocFNNYXNrRGljdCkgewotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IHNtYXNrX21hdHJpeDsKLSAgICAgICAgRlhTWVNfbWVtY3B5KCZzbWFza19tYXRyaXgsIHBHZW5lcmFsU3RhdGUtPm1fU01hc2tNYXRyaXgsIHNpemVvZiBzbWFza19tYXRyaXgpOwotICAgICAgICBzbWFza19tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7Ci0gICAgICAgIENGWF9ESUJTb3VyY2UqIHBTTWFza1NvdXJjZSA9IExvYWRTTWFzayhwU01hc2tEaWN0LCAmcmVjdCwgJnNtYXNrX21hdHJpeCk7Ci0gICAgICAgIGlmIChwU01hc2tTb3VyY2UpIHsKLSAgICAgICAgICAgIGJpdG1hcC0+TXVsdGlwbHlBbHBoYShwU01hc2tTb3VyY2UpOwotICAgICAgICAgICAgZGVsZXRlIHBTTWFza1NvdXJjZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocFRleHRNYXNrKSB7Ci0gICAgICAgIGJpdG1hcC0+TXVsdGlwbHlBbHBoYShwVGV4dE1hc2spOwotICAgICAgICBkZWxldGUgcFRleHRNYXNrOwotICAgICAgICBwVGV4dE1hc2sgPSBOVUxMOwotICAgIH0KLSAgICBpZiAoVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVAgJiYgZ3JvdXBfYWxwaGEgIT0gMS4wZikgewotICAgICAgICBiaXRtYXAtPk11bHRpcGx5QWxwaGEoKGludDMyX3QpKGdyb3VwX2FscGhhICogMjU1KSk7Ci0gICAgfQotICAgIFRyYW5zcGFyZW5jeSA9IG1fVHJhbnNwYXJlbmN5OwotICAgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgewotICAgICAgICBUcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfR1JPVVA7Ci0gICAgfQotICAgIENvbXBvc2l0ZURJQml0bWFwKGJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgMCwgMjU1LCBibGVuZF90eXBlLCBUcmFuc3BhcmVuY3kpOwotICAgIGRlbGV0ZSBvcmlEZXZpY2U7CitGWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzVHJhbnNwYXJlbmN5KAorICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpIHsKKyAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbFN0YXRlID0gcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlOworICBpbnQgYmxlbmRfdHlwZSA9CisgICAgICBwR2VuZXJhbFN0YXRlID8gcEdlbmVyYWxTdGF0ZS0+bV9CbGVuZFR5cGUgOiBGWERJQl9CTEVORF9OT1JNQUw7CisgIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX1VOU1VQUE9SVEVEKSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwU01hc2tEaWN0ID0KKyAgICAgIHBHZW5lcmFsU3RhdGUgPyAoQ1BERl9EaWN0aW9uYXJ5KilwR2VuZXJhbFN0YXRlLT5tX3BTb2Z0TWFzayA6IE5VTEw7CisgIGlmIChwU01hc2tEaWN0KSB7CisgICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSAmJgorICAgICAgICAoKENQREZfSW1hZ2VPYmplY3QqKXBQYWdlT2JqKQorICAgICAgICAgICAgLT5tX3BJbWFnZS0+R2V0RGljdCgpCisgICAgICAgICAgICAtPktleUV4aXN0KEZYX0JTVFJDKCJTTWFzayIpKSkgeworICAgICAgcFNNYXNrRGljdCA9IE5VTEw7CisgICAgfQorICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7CisgIEZYX0ZMT0FUIGdyb3VwX2FscGhhID0gMS4wZjsKKyAgaW50IFRyYW5zcGFyZW5jeSA9IG1fVHJhbnNwYXJlbmN5OworICBGWF9CT09MIGJHcm91cFRyYW5zcGFyZW50ID0gRkFMU0U7CisgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgeworICAgIENQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwUGFnZU9iajsKKyAgICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBTdGF0ZURhdGEgPQorICAgICAgICBwRm9ybU9iai0+bV9HZW5lcmFsU3RhdGUuR2V0T2JqZWN0KCk7CisgICAgaWYgKHBTdGF0ZURhdGEpIHsKKyAgICAgIGdyb3VwX2FscGhhID0gcFN0YXRlRGF0YS0+bV9GaWxsQWxwaGE7CisgICAgfQorICAgIFRyYW5zcGFyZW5jeSA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeTsKKyAgICBiR3JvdXBUcmFuc3BhcmVudCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEID8gVFJVRSA6IEZBTFNFOworICAgIGlmIChwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QpIHsKKyAgICAgIHBGb3JtUmVzb3VyY2UgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOworICAgIH0KKyAgfQorICBGWF9CT09MIGJUZXh0Q2xpcCA9IEZBTFNFOworICBpZiAocFBhZ2VPYmotPm1fQ2xpcFBhdGguTm90TnVsbCgpICYmIHBQYWdlT2JqLT5tX0NsaXBQYXRoLkdldFRleHRDb3VudCgpICYmCisgICAgICBtX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCkgPT0gRlhEQ19ESVNQTEFZICYmCisgICAgICAhKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfU09GVF9DTElQKSkgeworICAgIGJUZXh0Q2xpcCA9IFRSVUU7CisgIH0KKyAgaWYgKChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9PVkVSUFJJTlQpICYmCisgICAgICBwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UgJiYgcEdlbmVyYWxTdGF0ZSAmJgorICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9GaWxsT1AgJiYgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VPUCkgeworICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IE5VTEw7CisgICAgQ1BERl9QYWdlKiBwUGFnZSA9IE5VTEw7CisgICAgaWYgKG1fcENvbnRleHQtPm1fcFBhZ2VDYWNoZSkgeworICAgICAgcFBhZ2UgPSBtX3BDb250ZXh0LT5tX3BQYWdlQ2FjaGUtPkdldFBhZ2UoKTsKKyAgICAgIHBEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKKyAgICB9IGVsc2UgeworICAgICAgcERvY3VtZW50ID0gKChDUERGX0ltYWdlT2JqZWN0KilwUGFnZU9iaiktPm1fcEltYWdlLT5HZXREb2N1bWVudCgpOworICAgIH0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzID0gcFBhZ2UgPyBwUGFnZS0+bV9wUGFnZVJlc291cmNlcyA6IE5VTEw7CisgICAgQ1BERl9PYmplY3QqIHBDU09iaiA9ICgoQ1BERl9JbWFnZU9iamVjdCopcFBhZ2VPYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPm1fcEltYWdlLT5HZXRTdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXREaWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJDb2xvclNwYWNlIikpOworICAgIENQREZfQ29sb3JTcGFjZSogcENvbG9yU3BhY2UgPQorICAgICAgICBwRG9jdW1lbnQtPkxvYWRDb2xvclNwYWNlKHBDU09iaiwgcFBhZ2VSZXNvdXJjZXMpOworICAgIGlmIChwQ29sb3JTcGFjZSkgeworICAgICAgaW50IGZvcm1hdCA9IHBDb2xvclNwYWNlLT5HZXRGYW1pbHkoKTsKKyAgICAgIGlmIChmb3JtYXQgPT0gUERGQ1NfREVWSUNFQ01ZSyB8fCBmb3JtYXQgPT0gUERGQ1NfU0VQQVJBVElPTiB8fAorICAgICAgICAgIGZvcm1hdCA9PSBQREZDU19ERVZJQ0VOKSB7CisgICAgICAgIGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9EQVJLRU47CisgICAgICB9CisgICAgICBwRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDU09iaik7CisgICAgfQorICB9CisgIGlmIChwU01hc2tEaWN0ID09IE5VTEwgJiYgZ3JvdXBfYWxwaGEgPT0gMS4wZiAmJgorICAgICAgYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwgJiYgIWJUZXh0Q2xpcCAmJiAhYkdyb3VwVHJhbnNwYXJlbnQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfQk9PTCBpc29sYXRlZCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEOworICBpZiAobV9iUHJpbnQpIHsKKyAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgICBpbnQgcmVuZENhcHMgPSBtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKTsKKyAgICBpZiAoISgoVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpIHx8IHBTTWFza0RpY3QgfHwgYlRleHRDbGlwKSAmJgorICAgICAgICAocmVuZENhcHMgJiBGWFJDX0JMRU5EX01PREUpKSB7CisgICAgICBpbnQgb2xkQmxlbmQgPSBtX2N1ckJsZW5kOworICAgICAgbV9jdXJCbGVuZCA9IGJsZW5kX3R5cGU7CisgICAgICBiUmV0ID0gRHJhd09ialdpdGhCbGVuZChwUGFnZU9iaiwgcE9iajJEZXZpY2UpOworICAgICAgbV9jdXJCbGVuZCA9IG9sZEJsZW5kOworICAgIH0KKyAgICBpZiAoIWJSZXQpIHsKKyAgICAgIERyYXdPYmpXaXRoQmFja2dyb3VuZChwUGFnZU9iaiwgcE9iajJEZXZpY2UpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9SRUNUIHJlY3QgPSBwUGFnZU9iai0+R2V0QkJveChwT2JqMkRldmljZSk7CisgIHJlY3QuSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKKyAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQ0ZYX01hdHJpeCBkZXZpY2VDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOworICBGWF9GTE9BVCBzY2FsZVggPSBGWFNZU19mYWJzKGRldmljZUNUTS5hKTsKKyAgRlhfRkxPQVQgc2NhbGVZID0gRlhTWVNfZmFicyhkZXZpY2VDVE0uZCk7CisgIGludCB3aWR0aCA9IEZYU1lTX3JvdW5kKChGWF9GTE9BVClyZWN0LldpZHRoKCkgKiBzY2FsZVgpOworICBpbnQgaGVpZ2h0ID0gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKXJlY3QuSGVpZ2h0KCkgKiBzY2FsZVkpOworICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlOworICBDRlhfRElCaXRtYXAqIG9yaURldmljZSA9IE5VTEw7CisgIGlmICghaXNvbGF0ZWQgJiYgKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19HRVRfQklUUykpIHsKKyAgICBvcmlEZXZpY2UgPSBuZXcgQ0ZYX0RJQml0bWFwOworICAgIGlmICghbV9wRGV2aWNlLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKG9yaURldmljZSwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBtX3BEZXZpY2UtPkdldERJQml0cyhvcmlEZXZpY2UsIHJlY3QubGVmdCwgcmVjdC50b3ApOworICB9CisgIGlmICghYml0bWFwX2RldmljZS5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfQXJnYiwgMCwgb3JpRGV2aWNlKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIENGWF9ESUJpdG1hcCogYml0bWFwID0gYml0bWFwX2RldmljZS5HZXRCaXRtYXAoKTsKKyAgYml0bWFwLT5DbGVhcigwKTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBuZXdfbWF0cml4ID0gKnBPYmoyRGV2aWNlOworICBuZXdfbWF0cml4LlRyYW5zbGF0ZUkoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsKKyAgbmV3X21hdHJpeC5TY2FsZShzY2FsZVgsIHNjYWxlWSk7CisgIENGWF9ESUJpdG1hcCogcFRleHRNYXNrID0gTlVMTDsKKyAgaWYgKGJUZXh0Q2xpcCkgeworICAgIHBUZXh0TWFzayA9IG5ldyBDRlhfRElCaXRtYXA7CisgICAgaWYgKCFwVGV4dE1hc2stPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKKyAgICAgIGRlbGV0ZSBwVGV4dE1hc2s7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcFRleHRNYXNrLT5DbGVhcigwKTsKKyAgICBDRlhfRnhnZURldmljZSB0ZXh0X2RldmljZTsKKyAgICB0ZXh0X2RldmljZS5BdHRhY2gocFRleHRNYXNrKTsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcFBhZ2VPYmotPm1fQ2xpcFBhdGguR2V0VGV4dENvdW50KCk7IGkrKykgeworICAgICAgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqID0gcFBhZ2VPYmotPm1fQ2xpcFBhdGguR2V0VGV4dChpKTsKKyAgICAgIGlmICh0ZXh0b2JqID09IE5VTEwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBDRlhfQWZmaW5lTWF0cml4IHRleHRfbWF0cml4OworICAgICAgdGV4dG9iai0+R2V0VGV4dE1hdHJpeCgmdGV4dF9tYXRyaXgpOworICAgICAgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0UGF0aCgKKyAgICAgICAgICAmdGV4dF9kZXZpY2UsIHRleHRvYmotPm1fbkNoYXJzLCB0ZXh0b2JqLT5tX3BDaGFyQ29kZXMsCisgICAgICAgICAgdGV4dG9iai0+bV9wQ2hhclBvcywgdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udCgpLAorICAgICAgICAgIHRleHRvYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCksICZ0ZXh0X21hdHJpeCwgJm5ld19tYXRyaXgsCisgICAgICAgICAgdGV4dG9iai0+bV9HcmFwaFN0YXRlLCAoRlhfQVJHQiktMSwgMCwgTlVMTCk7CisgICAgfQorICB9CisgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CisgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCAmYml0bWFwX2RldmljZSwgTlVMTCwgbV9wU3RvcE9iaiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZtX09wdGlvbnMsIDAsIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisgIGJpdG1hcF9yZW5kZXIuUHJvY2Vzc09iamVjdE5vQ2xpcChwUGFnZU9iaiwgJm5ld19tYXRyaXgpOworICBtX2JTdG9wcGVkID0gYml0bWFwX3JlbmRlci5tX2JTdG9wcGVkOworICBpZiAocFNNYXNrRGljdCkgeworICAgIENGWF9BZmZpbmVNYXRyaXggc21hc2tfbWF0cml4OworICAgIEZYU1lTX21lbWNweSgmc21hc2tfbWF0cml4LCBwR2VuZXJhbFN0YXRlLT5tX1NNYXNrTWF0cml4LAorICAgICAgICAgICAgICAgICBzaXplb2Ygc21hc2tfbWF0cml4KTsKKyAgICBzbWFza19tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CisgICAgQ0ZYX0RJQlNvdXJjZSogcFNNYXNrU291cmNlID0gTG9hZFNNYXNrKHBTTWFza0RpY3QsICZyZWN0LCAmc21hc2tfbWF0cml4KTsKKyAgICBpZiAocFNNYXNrU291cmNlKSB7CisgICAgICBiaXRtYXAtPk11bHRpcGx5QWxwaGEocFNNYXNrU291cmNlKTsKKyAgICAgIGRlbGV0ZSBwU01hc2tTb3VyY2U7CisgICAgfQorICB9CisgIGlmIChwVGV4dE1hc2spIHsKKyAgICBiaXRtYXAtPk11bHRpcGx5QWxwaGEocFRleHRNYXNrKTsKKyAgICBkZWxldGUgcFRleHRNYXNrOworICAgIHBUZXh0TWFzayA9IE5VTEw7CisgIH0KKyAgaWYgKFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQICYmIGdyb3VwX2FscGhhICE9IDEuMGYpIHsKKyAgICBiaXRtYXAtPk11bHRpcGx5QWxwaGEoKGludDMyX3QpKGdyb3VwX2FscGhhICogMjU1KSk7CisgIH0KKyAgVHJhbnNwYXJlbmN5ID0gbV9UcmFuc3BhcmVuY3k7CisgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgeworICAgIFRyYW5zcGFyZW5jeSB8PSBQREZUUkFOU19HUk9VUDsKKyAgfQorICBDb21wb3NpdGVESUJpdG1hcChiaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIDAsIDI1NSwgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgVHJhbnNwYXJlbmN5KTsKKyAgZGVsZXRlIG9yaURldmljZTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1DRlhfRElCaXRtYXAqIENQREZfUmVuZGVyU3RhdHVzOjpHZXRCYWNrZHJvcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IEZYX1JFQ1QmIHJlY3QsIGludCYgbGVmdCwgaW50JiB0b3AsCi0gICAgICAgIEZYX0JPT0wgYkJhY2tBbHBoYVJlcXVpcmVkKQotewotICAgIEZYX1JFQ1QgYmJveCA9IHJlY3Q7Ci0gICAgYmJveC5JbnRlcnNlY3QobV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOwotICAgIGxlZnQgPSBiYm94LmxlZnQ7Ci0gICAgdG9wID0gYmJveC50b3A7Ci0gICAgQ0ZYX01hdHJpeCBkZXZpY2VDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOwotICAgIEZYX0ZMT0FUIHNjYWxlWCA9IEZYU1lTX2ZhYnMoZGV2aWNlQ1RNLmEpOwotICAgIEZYX0ZMT0FUIHNjYWxlWSA9IEZYU1lTX2ZhYnMoZGV2aWNlQ1RNLmQpOwotICAgIGludCB3aWR0aCA9IEZYU1lTX3JvdW5kKGJib3guV2lkdGgoKSAqIHNjYWxlWCk7Ci0gICAgaW50IGhlaWdodCA9IEZYU1lTX3JvdW5kKGJib3guSGVpZ2h0KCkgKiBzY2FsZVkpOwotICAgIENGWF9ESUJpdG1hcCogcEJhY2tkcm9wID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICBpZiAoYkJhY2tBbHBoYVJlcXVpcmVkICYmICFtX2JEcm9wT2JqZWN0cykgewotICAgICAgICBwQmFja2Ryb3AtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9BcmdiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BEZXZpY2UtPkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAocEJhY2tkcm9wLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0gICAgaWYgKHBCYWNrZHJvcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgcEJhY2tkcm9wOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfQk9PTCBiTmVlZERyYXc7Ci0gICAgaWYgKHBCYWNrZHJvcC0+SGFzQWxwaGEoKSkgewotICAgICAgICBiTmVlZERyYXcgPSAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJOZWVkRHJhdyA9ICEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0dFVF9CSVRTKTsKLSAgICB9Ci0gICAgaWYgKCFiTmVlZERyYXcpIHsKLSAgICAgICAgbV9wRGV2aWNlLT5HZXRESUJpdHMocEJhY2tkcm9wLCBsZWZ0LCB0b3ApOwotICAgICAgICByZXR1cm4gcEJhY2tkcm9wOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IEZpbmFsTWF0cml4ID0gbV9EZXZpY2VNYXRyaXg7Ci0gICAgRmluYWxNYXRyaXguVHJhbnNsYXRlSSgtbGVmdCwgLXRvcCk7Ci0gICAgRmluYWxNYXRyaXguU2NhbGUoc2NhbGVYLCBzY2FsZVkpOwotICAgIHBCYWNrZHJvcC0+Q2xlYXIocEJhY2tkcm9wLT5IYXNBbHBoYSgpID8gMCA6IDB4ZmZmZmZmZmYpOwotICAgIENGWF9GeGdlRGV2aWNlIGRldmljZTsKLSAgICBkZXZpY2UuQXR0YWNoKHBCYWNrZHJvcCk7Ci0gICAgbV9wQ29udGV4dC0+UmVuZGVyKCZkZXZpY2UsIHBPYmosICZtX09wdGlvbnMsICZGaW5hbE1hdHJpeCk7CitDRlhfRElCaXRtYXAqIENQREZfUmVuZGVyU3RhdHVzOjpHZXRCYWNrZHJvcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCYWNrQWxwaGFSZXF1aXJlZCkgeworICBGWF9SRUNUIGJib3ggPSByZWN0OworICBiYm94LkludGVyc2VjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSk7CisgIGxlZnQgPSBiYm94LmxlZnQ7CisgIHRvcCA9IGJib3gudG9wOworICBDRlhfTWF0cml4IGRldmljZUNUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7CisgIEZYX0ZMT0FUIHNjYWxlWCA9IEZYU1lTX2ZhYnMoZGV2aWNlQ1RNLmEpOworICBGWF9GTE9BVCBzY2FsZVkgPSBGWFNZU19mYWJzKGRldmljZUNUTS5kKTsKKyAgaW50IHdpZHRoID0gRlhTWVNfcm91bmQoYmJveC5XaWR0aCgpICogc2NhbGVYKTsKKyAgaW50IGhlaWdodCA9IEZYU1lTX3JvdW5kKGJib3guSGVpZ2h0KCkgKiBzY2FsZVkpOworICBDRlhfRElCaXRtYXAqIHBCYWNrZHJvcCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIGlmIChiQmFja0FscGhhUmVxdWlyZWQgJiYgIW1fYkRyb3BPYmplY3RzKSB7CisgICAgcEJhY2tkcm9wLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfQXJnYik7CisgIH0gZWxzZSB7CisgICAgbV9wRGV2aWNlLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKHBCYWNrZHJvcCwgd2lkdGgsIGhlaWdodCk7CisgIH0KKyAgaWYgKHBCYWNrZHJvcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgeworICAgIGRlbGV0ZSBwQmFja2Ryb3A7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfQk9PTCBiTmVlZERyYXc7CisgIGlmIChwQmFja2Ryb3AtPkhhc0FscGhhKCkpIHsKKyAgICBiTmVlZERyYXcgPSAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpOworICB9IGVsc2UgeworICAgIGJOZWVkRHJhdyA9ICEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0dFVF9CSVRTKTsKKyAgfQorICBpZiAoIWJOZWVkRHJhdykgeworICAgIG1fcERldmljZS0+R2V0RElCaXRzKHBCYWNrZHJvcCwgbGVmdCwgdG9wKTsKICAgICByZXR1cm4gcEJhY2tkcm9wOworICB9CisgIENGWF9BZmZpbmVNYXRyaXggRmluYWxNYXRyaXggPSBtX0RldmljZU1hdHJpeDsKKyAgRmluYWxNYXRyaXguVHJhbnNsYXRlSSgtbGVmdCwgLXRvcCk7CisgIEZpbmFsTWF0cml4LlNjYWxlKHNjYWxlWCwgc2NhbGVZKTsKKyAgcEJhY2tkcm9wLT5DbGVhcihwQmFja2Ryb3AtPkhhc0FscGhhKCkgPyAwIDogMHhmZmZmZmZmZik7CisgIENGWF9GeGdlRGV2aWNlIGRldmljZTsKKyAgZGV2aWNlLkF0dGFjaChwQmFja2Ryb3ApOworICBtX3BDb250ZXh0LT5SZW5kZXIoJmRldmljZSwgcE9iaiwgJm1fT3B0aW9ucywgJkZpbmFsTWF0cml4KTsKKyAgcmV0dXJuIHBCYWNrZHJvcDsKIH0KLXZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpHZXRCYWNrZ3JvdW5kKENGWF9ESUJpdG1hcCogcEJ1ZmZlciwgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgQ0ZYX0FmZmluZU1hdHJpeCogcEZpbmFsTWF0cml4KQotewotICAgIENGWF9GeGdlRGV2aWNlIGRldmljZTsKLSAgICBkZXZpY2UuQXR0YWNoKHBCdWZmZXIpOwordm9pZCBDUERGX1JlbmRlckNvbnRleHQ6OkdldEJhY2tncm91bmQoQ0ZYX0RJQml0bWFwKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBGaW5hbE1hdHJpeCkgeworICBDRlhfRnhnZURldmljZSBkZXZpY2U7CisgIGRldmljZS5BdHRhY2gocEJ1ZmZlcik7CiAKLSAgICBGWF9SRUNUIHJlY3QoMCwgMCwgZGV2aWNlLkdldFdpZHRoKCksIGRldmljZS5HZXRIZWlnaHQoKSk7Ci0gICAgZGV2aWNlLkZpbGxSZWN0KCZyZWN0LCAweGZmZmZmZmZmKTsKLSAgICBSZW5kZXIoJmRldmljZSwgcE9iaiwgcE9wdGlvbnMsIHBGaW5hbE1hdHJpeCk7CisgIEZYX1JFQ1QgcmVjdCgwLCAwLCBkZXZpY2UuR2V0V2lkdGgoKSwgZGV2aWNlLkdldEhlaWdodCgpKTsKKyAgZGV2aWNlLkZpbGxSZWN0KCZyZWN0LCAweGZmZmZmZmZmKTsKKyAgUmVuZGVyKCZkZXZpY2UsIHBPYmosIHBPcHRpb25zLCBwRmluYWxNYXRyaXgpOwogfQotQ1BERl9HcmFwaGljU3RhdGVzKiBDUERGX1JlbmRlclN0YXR1czo6Q2xvbmVPYmpTdGF0ZXMoY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzKiBwU3JjU3RhdGVzLCBGWF9CT09MIGJTdHJva2UpCi17Ci0gICAgaWYgKCFwU3JjU3RhdGVzKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0dyYXBoaWNTdGF0ZXMqIHBTdGF0ZXMgPSBuZXcgQ1BERl9HcmFwaGljU3RhdGVzOwotICAgIHBTdGF0ZXMtPkNvcHlTdGF0ZXMoKnBTcmNTdGF0ZXMpOwotICAgIENQREZfQ29sb3IqIHBPYmpDb2xvciA9IGJTdHJva2UgPyBwU3JjU3RhdGVzLT5tX0NvbG9yU3RhdGUuR2V0U3Ryb2tlQ29sb3IoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1N0YXRlcy0+bV9Db2xvclN0YXRlLkdldEZpbGxDb2xvcigpOwotICAgIGlmICghcE9iakNvbG9yLT5Jc051bGwoKSkgewotICAgICAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwQ29sb3JEYXRhID0gcFN0YXRlcy0+bV9Db2xvclN0YXRlLkdldE1vZGlmeSgpOwotICAgICAgICBwQ29sb3JEYXRhLT5tX0ZpbGxSR0IgPSBiU3Ryb2tlID8gcFNyY1N0YXRlcy0+bV9Db2xvclN0YXRlLkdldE9iamVjdCgpLT5tX1N0cm9rZVJHQiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5HZXRPYmplY3QoKS0+bV9GaWxsUkdCOwotICAgICAgICBwQ29sb3JEYXRhLT5tX1N0cm9rZVJHQiA9IHBDb2xvckRhdGEtPm1fRmlsbFJHQjsKLSAgICB9Ci0gICAgcmV0dXJuIHBTdGF0ZXM7CitDUERGX0dyYXBoaWNTdGF0ZXMqIENQREZfUmVuZGVyU3RhdHVzOjpDbG9uZU9ialN0YXRlcygKKyAgICBjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBTcmNTdGF0ZXMsCisgICAgRlhfQk9PTCBiU3Ryb2tlKSB7CisgIGlmICghcFNyY1N0YXRlcykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfR3JhcGhpY1N0YXRlcyogcFN0YXRlcyA9IG5ldyBDUERGX0dyYXBoaWNTdGF0ZXM7CisgIHBTdGF0ZXMtPkNvcHlTdGF0ZXMoKnBTcmNTdGF0ZXMpOworICBDUERGX0NvbG9yKiBwT2JqQ29sb3IgPSBiU3Ryb2tlID8gcFNyY1N0YXRlcy0+bV9Db2xvclN0YXRlLkdldFN0cm9rZUNvbG9yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBTcmNTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKTsKKyAgaWYgKCFwT2JqQ29sb3ItPklzTnVsbCgpKSB7CisgICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcENvbG9yRGF0YSA9IHBTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5HZXRNb2RpZnkoKTsKKyAgICBwQ29sb3JEYXRhLT5tX0ZpbGxSR0IgPQorICAgICAgICBiU3Ryb2tlID8gcFNyY1N0YXRlcy0+bV9Db2xvclN0YXRlLkdldE9iamVjdCgpLT5tX1N0cm9rZVJHQgorICAgICAgICAgICAgICAgIDogcFNyY1N0YXRlcy0+bV9Db2xvclN0YXRlLkdldE9iamVjdCgpLT5tX0ZpbGxSR0I7CisgICAgcENvbG9yRGF0YS0+bV9TdHJva2VSR0IgPSBwQ29sb3JEYXRhLT5tX0ZpbGxSR0I7CisgIH0KKyAgcmV0dXJuIHBTdGF0ZXM7CiB9Ci1DUERGX1JlbmRlckNvbnRleHQ6OkNQREZfUmVuZGVyQ29udGV4dCgpCi17CitDUERGX1JlbmRlckNvbnRleHQ6OkNQREZfUmVuZGVyQ29udGV4dCgpIHt9Cit2b2lkIENQREZfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZUNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGaXJzdExheWVyKSB7CisgIG1fcERvY3VtZW50ID0gcERvYzsKKyAgbV9wUGFnZVJlc291cmNlcyA9IHBQYWdlUmVzb3VyY2VzOworICBtX3BQYWdlQ2FjaGUgPSBwUGFnZUNhY2hlOworICBtX2JGaXJzdExheWVyID0gYkZpcnN0TGF5ZXI7CiB9Ci12b2lkIENQREZfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZUNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBGWF9CT09MIGJGaXJzdExheWVyKQotewotICAgIG1fcERvY3VtZW50ID0gcERvYzsKLSAgICBtX3BQYWdlUmVzb3VyY2VzID0gcFBhZ2VSZXNvdXJjZXM7Ci0gICAgbV9wUGFnZUNhY2hlID0gcFBhZ2VDYWNoZTsKLSAgICBtX2JGaXJzdExheWVyID0gYkZpcnN0TGF5ZXI7Cit2b2lkIENQREZfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKENQREZfUGFnZSogcFBhZ2UsIEZYX0JPT0wgYkZpcnN0TGF5ZXIpIHsKKyAgbV9wRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CisgIG1fcFBhZ2VSZXNvdXJjZXMgPSBwUGFnZS0+bV9wUGFnZVJlc291cmNlczsKKyAgbV9wUGFnZUNhY2hlID0gcFBhZ2UtPkdldFJlbmRlckNhY2hlKCk7CisgIG1fYkZpcnN0TGF5ZXIgPSBiRmlyc3RMYXllcjsKIH0KLXZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpDcmVhdGUoQ1BERl9QYWdlKiBwUGFnZSwgRlhfQk9PTCBiRmlyc3RMYXllcikKLXsKLSAgICBtX3BEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKLSAgICBtX3BQYWdlUmVzb3VyY2VzID0gcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXM7Ci0gICAgbV9wUGFnZUNhY2hlID0gcFBhZ2UtPkdldFJlbmRlckNhY2hlKCk7Ci0gICAgbV9iRmlyc3RMYXllciA9IGJGaXJzdExheWVyOworQ1BERl9SZW5kZXJDb250ZXh0Ojp+Q1BERl9SZW5kZXJDb250ZXh0KCkge30KK3ZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpDbGVhcigpIHsKKyAgbV9wRG9jdW1lbnQgPSBOVUxMOworICBtX3BQYWdlUmVzb3VyY2VzID0gTlVMTDsKKyAgbV9wUGFnZUNhY2hlID0gTlVMTDsKKyAgbV9iRmlyc3RMYXllciA9IFRSVUU7CisgIG1fQ29udGVudExpc3QuUmVtb3ZlQWxsKCk7CiB9Ci1DUERGX1JlbmRlckNvbnRleHQ6On5DUERGX1JlbmRlckNvbnRleHQoKQotewordm9pZCBDUERGX1JlbmRlckNvbnRleHQ6OkFwcGVuZE9iamVjdExpc3QoCisgICAgQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UpIHsKKyAgX1BERl9SZW5kZXJJdGVtKiBwSXRlbSA9IG1fQ29udGVudExpc3QuQWRkU3BhY2UoKTsKKyAgcEl0ZW0tPm1fcE9iamVjdExpc3QgPSBwT2JqczsKKyAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgcEl0ZW0tPm1fTWF0cml4ID0gKnBPYmplY3QyRGV2aWNlOworICB9IGVsc2UgeworICAgIHBJdGVtLT5tX01hdHJpeC5TZXRJZGVudGl0eSgpOworICB9CiB9Ci12b2lkIENQREZfUmVuZGVyQ29udGV4dDo6Q2xlYXIoKQotewotICAgIG1fcERvY3VtZW50ID0gTlVMTDsKLSAgICBtX3BQYWdlUmVzb3VyY2VzID0gTlVMTDsKLSAgICBtX3BQYWdlQ2FjaGUgPSBOVUxMOwotICAgIG1fYkZpcnN0TGF5ZXIgPSBUUlVFOwotICAgIG1fQ29udGVudExpc3QuUmVtb3ZlQWxsKCk7Cit2b2lkIENQREZfUmVuZGVyQ29udGV4dDo6UmVuZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBMYXN0TWF0cml4KSB7CisgIFJlbmRlcihwRGV2aWNlLCBOVUxMLCBwT3B0aW9ucywgcExhc3RNYXRyaXgpOwogfQotdm9pZCBDUERGX1JlbmRlckNvbnRleHQ6OkFwcGVuZE9iamVjdExpc3QoQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlKQotewotICAgIF9QREZfUmVuZGVySXRlbSogcEl0ZW0gPSBtX0NvbnRlbnRMaXN0LkFkZFNwYWNlKCk7Ci0gICAgcEl0ZW0tPm1fcE9iamVjdExpc3QgPSBwT2JqczsKLSAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKLSAgICAgICAgcEl0ZW0tPm1fTWF0cml4ID0gKnBPYmplY3QyRGV2aWNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBJdGVtLT5tX01hdHJpeC5TZXRJZGVudGl0eSgpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpSZW5kZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcExhc3RNYXRyaXgpCi17Ci0gICAgUmVuZGVyKHBEZXZpY2UsIE5VTEwsIHBPcHRpb25zLCBwTGFzdE1hdHJpeCk7Ci19Ci12b2lkIENQREZfUmVuZGVyQ29udGV4dDo6UmVuZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcFN0b3BPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBMYXN0TWF0cml4KQotewotICAgIGludCBjb3VudCA9IG1fQ29udGVudExpc3QuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGogKyspIHsKLSAgICAgICAgcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0gICAgICAgIF9QREZfUmVuZGVySXRlbSogcEl0ZW0gPSBtX0NvbnRlbnRMaXN0LkdldERhdGFQdHIoaik7Ci0gICAgICAgIGlmIChwTGFzdE1hdHJpeCkgewotICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBGaW5hbE1hdHJpeCA9IHBJdGVtLT5tX01hdHJpeDsKLSAgICAgICAgICAgIEZpbmFsTWF0cml4LkNvbmNhdCgqcExhc3RNYXRyaXgpOwotICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwotICAgICAgICAgICAgc3RhdHVzLkluaXRpYWxpemUodGhpcywgcERldmljZSwgcExhc3RNYXRyaXgsIHBTdG9wT2JqLCBOVUxMLCBOVUxMLCBwT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5tX1RyYW5zcGFyZW5jeSwgRkFMU0UsIE5VTEwpOwotICAgICAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocEl0ZW0tPm1fcE9iamVjdExpc3QsICZGaW5hbE1hdHJpeCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzLm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgbV9wUGFnZUNhY2hlLT5DYWNoZU9wdGltaXphdGlvbihzdGF0dXMubV9PcHRpb25zLm1fZHdMaW1pdENhY2hlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdHVzLm1fYlN0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKLSAgICAgICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKHRoaXMsIHBEZXZpY2UsIE5VTEwsIHBTdG9wT2JqLCBOVUxMLCBOVUxMLCBwT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5tX1RyYW5zcGFyZW5jeSwgRkFMU0UsIE5VTEwpOwotICAgICAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocEl0ZW0tPm1fcE9iamVjdExpc3QsICZwSXRlbS0+bV9NYXRyaXgpOwotICAgICAgICAgICAgaWYgKHN0YXR1cy5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSkgewotICAgICAgICAgICAgICAgIG1fcFBhZ2VDYWNoZS0+Q2FjaGVPcHRpbWl6YXRpb24oc3RhdHVzLm1fT3B0aW9ucy5tX2R3TGltaXRDYWNoZVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXR1cy5tX2JTdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+UmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK3ZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpSZW5kZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3RvcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcExhc3RNYXRyaXgpIHsKKyAgaW50IGNvdW50ID0gbV9Db250ZW50TGlzdC5HZXRTaXplKCk7CisgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgeworICAgIHBEZXZpY2UtPlNhdmVTdGF0ZSgpOworICAgIF9QREZfUmVuZGVySXRlbSogcEl0ZW0gPSBtX0NvbnRlbnRMaXN0LkdldERhdGFQdHIoaik7CisgICAgaWYgKHBMYXN0TWF0cml4KSB7CisgICAgICBDRlhfQWZmaW5lTWF0cml4IEZpbmFsTWF0cml4ID0gcEl0ZW0tPm1fTWF0cml4OworICAgICAgRmluYWxNYXRyaXguQ29uY2F0KCpwTGFzdE1hdHJpeCk7CisgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CisgICAgICBzdGF0dXMuSW5pdGlhbGl6ZSh0aGlzLCBwRGV2aWNlLCBwTGFzdE1hdHJpeCwgcFN0b3BPYmosIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBwT3B0aW9ucywgcEl0ZW0tPm1fcE9iamVjdExpc3QtPm1fVHJhbnNwYXJlbmN5LCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocEl0ZW0tPm1fcE9iamVjdExpc3QsICZGaW5hbE1hdHJpeCk7CisgICAgICBpZiAoc3RhdHVzLm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFKSB7CisgICAgICAgIG1fcFBhZ2VDYWNoZS0+Q2FjaGVPcHRpbWl6YXRpb24oc3RhdHVzLm1fT3B0aW9ucy5tX2R3TGltaXRDYWNoZVNpemUpOworICAgICAgfQorICAgICAgaWYgKHN0YXR1cy5tX2JTdG9wcGVkKSB7CiAgICAgICAgIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOworICAgICAgc3RhdHVzLkluaXRpYWxpemUodGhpcywgcERldmljZSwgTlVMTCwgcFN0b3BPYmosIE5VTEwsIE5VTEwsIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgcEl0ZW0tPm1fcE9iamVjdExpc3QtPm1fVHJhbnNwYXJlbmN5LCBGQUxTRSwgTlVMTCk7CisgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwSXRlbS0+bV9wT2JqZWN0TGlzdCwgJnBJdGVtLT5tX01hdHJpeCk7CisgICAgICBpZiAoc3RhdHVzLm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFKSB7CisgICAgICAgIG1fcFBhZ2VDYWNoZS0+Q2FjaGVPcHRpbWl6YXRpb24oc3RhdHVzLm1fT3B0aW9ucy5tX2R3TGltaXRDYWNoZVNpemUpOworICAgICAgfQorICAgICAgaWYgKHN0YXR1cy5tX2JTdG9wcGVkKSB7CisgICAgICAgIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9CisgICAgcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgIH0KIH0KLXZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpEcmF3T2JqZWN0TGlzdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX1BhZ2VPYmplY3RzKiBwT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKLXsKLSAgICBBcHBlbmRPYmplY3RMaXN0KHBPYmpzLCBwT2JqZWN0MkRldmljZSk7Ci0gICAgUmVuZGVyKHBEZXZpY2UsIHBPcHRpb25zKTsKK3ZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpEcmF3T2JqZWN0TGlzdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZU9iamVjdHMqIHBPYmpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHsKKyAgQXBwZW5kT2JqZWN0TGlzdChwT2JqcywgcE9iamVjdDJEZXZpY2UpOworICBSZW5kZXIocERldmljZSwgcE9wdGlvbnMpOwogfQotQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIoKQoteworQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIoKSB7CisgIG1fcFJlbmRlcmVyID0gTlVMTDsKKyAgbV9wQ29udGV4dCA9IE5VTEw7CisgIG1fcERldmljZSA9IE5VTEw7CisgIG1fU3RhdHVzID0gUmVhZHk7Cit9CitDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6On5DUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIoKSB7CisgIENsZWFyKCk7Cit9Cit2b2lkIENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6Q2xlYXIoKSB7CisgIGlmIChtX3BSZW5kZXJlcikgeworICAgIGRlbGV0ZSBtX3BSZW5kZXJlcjsKKyAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogICAgIG1fcFJlbmRlcmVyID0gTlVMTDsKLSAgICBtX3BDb250ZXh0ID0gTlVMTDsKLSAgICBtX3BEZXZpY2UgPSBOVUxMOwotICAgIG1fU3RhdHVzID0gUmVhZHk7CisgIH0KKyAgbV9TdGF0dXMgPSBSZWFkeTsKIH0KLUNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6fkNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcigpCi17Ci0gICAgQ2xlYXIoKTsKLX0KLXZvaWQgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpDbGVhcigpCi17Ci0gICAgaWYgKG1fcFJlbmRlcmVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BSZW5kZXJlcjsKLSAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgbV9wUmVuZGVyZXIgPSBOVUxMOwotICAgIH0KLSAgICBtX1N0YXR1cyA9IFJlYWR5OwotfQotdm9pZCBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OlN0YXJ0KENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgSUZYX1BhdXNlKiBwUGF1c2UsIEZYX0JPT0wgYkRyb3BPYmplY3RzKQotewotICAgIGlmIChtX1N0YXR1cyAhPSBSZWFkeSkgewotICAgICAgICBtX1N0YXR1cyA9IEZhaWxlZDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgbV9wRGV2aWNlID0gcERldmljZTsKLSAgICBtX3BPcHRpb25zID0gcE9wdGlvbnM7Ci0gICAgbV9iRHJvcE9iamVjdHMgPSBiRHJvcE9iamVjdHM7Ci0gICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcERldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fU3RhdHVzID0gRmFpbGVkOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fU3RhdHVzID0gVG9CZUNvbnRpbnVlZDsKLSAgICBtX09iamVjdFBvcyA9IE5VTEw7Ci0gICAgbV9MYXllckluZGV4ID0gMDsKLSAgICBtX09iamVjdEluZGV4ID0gMDsKLSAgICBtX1ByZXZMYXN0UG9zID0gTlVMTDsKLSAgICBDb250aW51ZShwUGF1c2UpOwordm9pZCBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OlN0YXJ0KENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRyb3BPYmplY3RzKSB7CisgIGlmIChtX1N0YXR1cyAhPSBSZWFkeSkgeworICAgIG1fU3RhdHVzID0gRmFpbGVkOworICAgIHJldHVybjsKKyAgfQorICBtX3BDb250ZXh0ID0gcENvbnRleHQ7CisgIG1fcERldmljZSA9IHBEZXZpY2U7CisgIG1fcE9wdGlvbnMgPSBwT3B0aW9uczsKKyAgbV9iRHJvcE9iamVjdHMgPSBiRHJvcE9iamVjdHM7CisgIGlmIChwQ29udGV4dCA9PSBOVUxMIHx8IHBEZXZpY2UgPT0gTlVMTCkgeworICAgIG1fU3RhdHVzID0gRmFpbGVkOworICAgIHJldHVybjsKKyAgfQorICBtX1N0YXR1cyA9IFRvQmVDb250aW51ZWQ7CisgIG1fT2JqZWN0UG9zID0gTlVMTDsKKyAgbV9MYXllckluZGV4ID0gMDsKKyAgbV9PYmplY3RJbmRleCA9IDA7CisgIG1fUHJldkxhc3RQb3MgPSBOVUxMOworICBDb250aW51ZShwUGF1c2UpOwogfQogI2RlZmluZSBSRU5ERVJfU1RFUF9MSU1JVCAxMDAKLXZvaWQgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZiAobV9TdGF0dXMgIT0gVG9CZUNvbnRpbnVlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0RXT1JEIG5MYXllcnMgPSBtX3BDb250ZXh0LT5tX0NvbnRlbnRMaXN0LkdldFNpemUoKTsKLSAgICBmb3IgKDsgbV9MYXllckluZGV4IDwgbkxheWVyczsgbV9MYXllckluZGV4ICsrKSB7Ci0gICAgICAgIF9QREZfUmVuZGVySXRlbSogcEl0ZW0gPSBtX3BDb250ZXh0LT5tX0NvbnRlbnRMaXN0LkdldERhdGFQdHIobV9MYXllckluZGV4KTsKLSAgICAgICAgRlhfUE9TSVRJT04gTGFzdFBvcyA9IHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKG1fT2JqZWN0UG9zID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChMYXN0UG9zID09IG1fUHJldkxhc3RQb3MpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBJdGVtLT5tX3BPYmplY3RMaXN0LT5Jc1BhcnNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5Db250aW51ZVBhcnNlKHBQYXVzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcEl0ZW0tPm1fcE9iamVjdExpc3QtPklzUGFyc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBMYXN0UG9zID0gcEl0ZW0tPm1fcE9iamVjdExpc3QtPkdldExhc3RPYmplY3RQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChMYXN0UG9zID09IG1fUHJldkxhc3RQb3MpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9wUmVuZGVyZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1fcFJlbmRlcmVyOwotICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1fT2JqZWN0UG9zID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgbV9QcmV2TGFzdFBvcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fUHJldkxhc3RQb3MpIHsKLSAgICAgICAgICAgICAgICBtX09iamVjdFBvcyA9IG1fUHJldkxhc3RQb3M7Ci0gICAgICAgICAgICAgICAgcEl0ZW0tPm1fcE9iamVjdExpc3QtPkdldE5leHRPYmplY3QobV9PYmplY3RQb3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX09iamVjdFBvcyA9IHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX1ByZXZMYXN0UG9zID0gTGFzdFBvczsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wUmVuZGVyZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgbV9PYmplY3RQb3MgPSBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotICAgICAgICAgICAgbV9PYmplY3RJbmRleCA9IDA7Ci0gICAgICAgICAgICBtX3BSZW5kZXJlciA9IG5ldyBDUERGX1JlbmRlclN0YXR1cygpOwotICAgICAgICAgICAgbV9wUmVuZGVyZXItPkluaXRpYWxpemUobV9wQ29udGV4dCwgbV9wRGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3B0aW9ucywgcEl0ZW0tPm1fcE9iamVjdExpc3QtPm1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgTlVMTCk7Ci0gICAgICAgICAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOwotICAgICAgICAgICAgbV9DbGlwUmVjdCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOwotICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBkZXZpY2Uyb2JqZWN0OwotICAgICAgICAgICAgZGV2aWNlMm9iamVjdC5TZXRSZXZlcnNlKHBJdGVtLT5tX01hdHJpeCk7Ci0gICAgICAgICAgICBkZXZpY2Uyb2JqZWN0LlRyYW5zZm9ybVJlY3QobV9DbGlwUmVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG9ianNfdG9fZ28gPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFJlbmRlck1vZHVsZSgpLT5HZXRDb25maWcoKS0+bV9SZW5kZXJTdGVwTGltaXQ7Ci0gICAgICAgIHdoaWxlIChtX09iamVjdFBvcykgewotICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwQ3VyT2JqID0gcEl0ZW0tPm1fcE9iamVjdExpc3QtPkdldE9iamVjdEF0KG1fT2JqZWN0UG9zKTsKLSAgICAgICAgICAgIGlmIChwQ3VyT2JqICYmIHBDdXJPYmotPm1fTGVmdCA8PSBtX0NsaXBSZWN0LnJpZ2h0ICYmIHBDdXJPYmotPm1fUmlnaHQgPj0gbV9DbGlwUmVjdC5sZWZ0ICYmCi0gICAgICAgICAgICAgICAgICAgIHBDdXJPYmotPm1fQm90dG9tIDw9IG1fQ2xpcFJlY3QudG9wICYmIHBDdXJPYmotPm1fVG9wID49IG1fQ2xpcFJlY3QuYm90dG9tKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcFJlbmRlcmVyLT5Db250aW51ZVNpbmdsZU9iamVjdChwQ3VyT2JqLCAmcEl0ZW0tPm1fTWF0cml4LCBwUGF1c2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBDdXJPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFICYmIG1fcFJlbmRlcmVyLT5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSkgewotICAgICAgICAgICAgICAgICAgICBtX3BDb250ZXh0LT5HZXRQYWdlQ2FjaGUoKS0+Q2FjaGVPcHRpbWl6YXRpb24obV9wUmVuZGVyZXItPm1fT3B0aW9ucy5tX2R3TGltaXRDYWNoZVNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocEN1ck9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSB8fCBwQ3VyT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9TSEFESU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9ianNfdG9fZ28gPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG9ianNfdG9fZ28gLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9PYmplY3RJbmRleCArKzsKLSAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXROZXh0T2JqZWN0KG1fT2JqZWN0UG9zKTsKLSAgICAgICAgICAgIGlmIChvYmpzX3RvX2dvID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9ianNfdG9fZ28gPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFJlbmRlck1vZHVsZSgpLT5HZXRDb25maWcoKS0+bV9SZW5kZXJTdGVwTGltaXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK3ZvaWQgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAobV9TdGF0dXMgIT0gVG9CZUNvbnRpbnVlZCkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9EV09SRCBuTGF5ZXJzID0gbV9wQ29udGV4dC0+bV9Db250ZW50TGlzdC5HZXRTaXplKCk7CisgIGZvciAoOyBtX0xheWVySW5kZXggPCBuTGF5ZXJzOyBtX0xheWVySW5kZXgrKykgeworICAgIF9QREZfUmVuZGVySXRlbSogcEl0ZW0gPSBtX3BDb250ZXh0LT5tX0NvbnRlbnRMaXN0LkdldERhdGFQdHIobV9MYXllckluZGV4KTsKKyAgICBGWF9QT1NJVElPTiBMYXN0UG9zID0gcEl0ZW0tPm1fcE9iamVjdExpc3QtPkdldExhc3RPYmplY3RQb3NpdGlvbigpOworICAgIGlmIChtX09iamVjdFBvcyA9PSBOVUxMKSB7CisgICAgICBpZiAoTGFzdFBvcyA9PSBtX1ByZXZMYXN0UG9zKSB7CiAgICAgICAgIGlmICghcEl0ZW0tPm1fcE9iamVjdExpc3QtPklzUGFyc2VkKCkpIHsKKyAgICAgICAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+Q29udGludWVQYXJzZShwUGF1c2UpOworICAgICAgICAgIGlmICghcEl0ZW0tPm1fcE9iamVjdExpc3QtPklzUGFyc2VkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgTGFzdFBvcyA9IHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKTsKICAgICAgICAgfQotICAgICAgICBkZWxldGUgbV9wUmVuZGVyZXI7Ci0gICAgICAgIG1fcFJlbmRlcmVyID0gTlVMTDsKLSAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgbV9PYmplY3RQb3MgPSBOVUxMOwotICAgICAgICBtX1ByZXZMYXN0UG9zID0gTlVMTDsKLSAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fTGF5ZXJJbmRleCsrOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKExhc3RQb3MgPT0gbV9QcmV2TGFzdFBvcykgeworICAgICAgICBpZiAobV9wUmVuZGVyZXIpIHsKKyAgICAgICAgICBkZWxldGUgbV9wUmVuZGVyZXI7CisgICAgICAgICAgbV9wUmVuZGVyZXIgPSBOVUxMOworICAgICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgICAgICAgbV9PYmplY3RQb3MgPSBOVUxMOworICAgICAgICAgIG1fUHJldkxhc3RQb3MgPSBOVUxMOwogICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKG1fUHJldkxhc3RQb3MpIHsKKyAgICAgICAgbV9PYmplY3RQb3MgPSBtX1ByZXZMYXN0UG9zOworICAgICAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+R2V0TmV4dE9iamVjdChtX09iamVjdFBvcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX09iamVjdFBvcyA9IHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CisgICAgICB9CisgICAgICBtX1ByZXZMYXN0UG9zID0gTGFzdFBvczsKICAgICB9Ci0gICAgbV9TdGF0dXMgPSBEb25lOwotfQotaW50IENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6RXN0aW1hdGVQcm9ncmVzcygpCi17Ci0gICAgaWYgKCFtX3BDb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChtX3BSZW5kZXJlciA9PSBOVUxMKSB7CisgICAgICBtX09iamVjdFBvcyA9IHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CisgICAgICBtX09iamVjdEluZGV4ID0gMDsKKyAgICAgIG1fcFJlbmRlcmVyID0gbmV3IENQREZfUmVuZGVyU3RhdHVzKCk7CisgICAgICBtX3BSZW5kZXJlci0+SW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPcHRpb25zLCBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+bV9UcmFuc3BhcmVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JEcm9wT2JqZWN0cywgTlVMTCk7CisgICAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOworICAgICAgbV9DbGlwUmVjdCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOworICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBkZXZpY2Uyb2JqZWN0OworICAgICAgZGV2aWNlMm9iamVjdC5TZXRSZXZlcnNlKHBJdGVtLT5tX01hdHJpeCk7CisgICAgICBkZXZpY2Uyb2JqZWN0LlRyYW5zZm9ybVJlY3QobV9DbGlwUmVjdCk7CiAgICAgfQotICAgIEZYX0RXT1JEIG5MYXllcnMgPSBtX3BDb250ZXh0LT5tX0NvbnRlbnRMaXN0LkdldFNpemUoKTsKLSAgICBpbnQgblRvdGFsID0gMCwgblJlbmRlcmVkID0gMDsKLSAgICBmb3IgKEZYX0RXT1JEIGxheWVyID0gMDsgbGF5ZXIgPCBuTGF5ZXJzOyBsYXllciArKykgewotICAgICAgICBfUERGX1JlbmRlckl0ZW0qIHBJdGVtID0gbV9wQ29udGV4dC0+bV9Db250ZW50TGlzdC5HZXREYXRhUHRyKGxheWVyKTsKLSAgICAgICAgaW50IG5PYmpzID0gcEl0ZW0tPm1fcE9iamVjdExpc3QtPkNvdW50T2JqZWN0cygpOwotICAgICAgICBpZiAobGF5ZXIgPT0gbV9MYXllckluZGV4KSB7Ci0gICAgICAgICAgICBuUmVuZGVyZWQgKz0gbV9PYmplY3RJbmRleDsKLSAgICAgICAgfSBlbHNlIGlmIChsYXllciA8IG1fTGF5ZXJJbmRleCkgewotICAgICAgICAgICAgblJlbmRlcmVkICs9IG5PYmpzOworICAgIGludCBvYmpzX3RvX2dvID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRSZW5kZXJNb2R1bGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0Q29uZmlnKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtPm1fUmVuZGVyU3RlcExpbWl0OworICAgIHdoaWxlIChtX09iamVjdFBvcykgeworICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwQ3VyT2JqID0gcEl0ZW0tPm1fcE9iamVjdExpc3QtPkdldE9iamVjdEF0KG1fT2JqZWN0UG9zKTsKKyAgICAgIGlmIChwQ3VyT2JqICYmIHBDdXJPYmotPm1fTGVmdCA8PSBtX0NsaXBSZWN0LnJpZ2h0ICYmCisgICAgICAgICAgcEN1ck9iai0+bV9SaWdodCA+PSBtX0NsaXBSZWN0LmxlZnQgJiYKKyAgICAgICAgICBwQ3VyT2JqLT5tX0JvdHRvbSA8PSBtX0NsaXBSZWN0LnRvcCAmJgorICAgICAgICAgIHBDdXJPYmotPm1fVG9wID49IG1fQ2xpcFJlY3QuYm90dG9tKSB7CisgICAgICAgIGlmIChtX3BSZW5kZXJlci0+Q29udGludWVTaW5nbGVPYmplY3QocEN1ck9iaiwgJnBJdGVtLT5tX01hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF1c2UpKSB7CisgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG5Ub3RhbCArPSBuT2JqczsKLSAgICB9Ci0gICAgaWYgKG5Ub3RhbCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTAwICogblJlbmRlcmVkIC8gblRvdGFsOwotfQotQ1BERl9UcmFuc2ZlckZ1bmMqIENQREZfRG9jUmVuZGVyRGF0YTo6R2V0VHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIGlmICghcE9iaikKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBhdXRvIGl0ID0gbV9UcmFuc2ZlckZ1bmNNYXAuZmluZChwT2JqKTsKLSAgICBpZiAoaXQgIT0gbV9UcmFuc2ZlckZ1bmNNYXAuZW5kKCkpIHsKLSAgICAgICAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jPiogcFRyYW5zZmVyQ291bnRlciA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIHJldHVybiBwVHJhbnNmZXJDb3VudGVyLT5BZGRSZWYoKTsKLSAgICB9Ci0KLSAgICBDUERGX0Z1bmN0aW9uKiBwRnVuY3NbM10gPSB7IG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIgfTsKLSAgICBGWF9CT09MIGJVbmlUcmFuc2ZlciA9IFRSVUU7Ci0gICAgRlhfQk9PTCBiSWRlbnRpdHkgPSBUUlVFOwotICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIGJVbmlUcmFuc2ZlciA9IEZBTFNFOwotICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcE9iajsKLSAgICAgICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA8IDMpCi0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgICAgICAgICBwRnVuY3NbMiAtIGldID0gQ1BERl9GdW5jdGlvbjo6TG9hZChwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKSk7Ci0gICAgICAgICAgICBpZiAoIXBGdW5jc1syIC0gaV0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHBDdXJPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFICYmCisgICAgICAgICAgICBtX3BSZW5kZXJlci0+bV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTElNSVRFRElNQUdFQ0FDSEUpIHsKKyAgICAgICAgICBtX3BDb250ZXh0LT5HZXRQYWdlQ2FjaGUoKS0+Q2FjaGVPcHRpbWl6YXRpb24oCisgICAgICAgICAgICAgIG1fcFJlbmRlcmVyLT5tX09wdGlvbnMubV9kd0xpbWl0Q2FjaGVTaXplKTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBGdW5jc1swXSA9IENQREZfRnVuY3Rpb246OkxvYWQocE9iaik7Ci0gICAgICAgIGlmICghcEZ1bmNzWzBdKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgIH0KLSAgICBDUERGX1RyYW5zZmVyRnVuYyogcFRyYW5zZmVyID0gbmV3IENQREZfVHJhbnNmZXJGdW5jOwotICAgIHBUcmFuc2Zlci0+bV9wUERGRG9jID0gbV9wUERGRG9jOwotICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX1RyYW5zZmVyRnVuYz4qIHBUcmFuc2ZlckNvdW50ZXIgPQotICAgICAgICBuZXcgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jPihwVHJhbnNmZXIpOwotICAgIG1fVHJhbnNmZXJGdW5jTWFwW3BPYmpdID0gcFRyYW5zZmVyQ291bnRlcjsKLSAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhPdXRwdXRzID0gMTY7Ci0gICAgRlhfRkxPQVQgb3V0cHV0W2tNYXhPdXRwdXRzXTsKLSAgICBGWFNZU19tZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7Ci0gICAgRlhfRkxPQVQgaW5wdXQ7Ci0gICAgaW50IG5vdXRwdXQ7Ci0gICAgZm9yIChpbnQgdiA9IDA7IHYgPCAyNTY7ICsrdikgewotICAgICAgICBpbnB1dCA9IChGWF9GTE9BVCl2IC8gMjU1LjBmOwotICAgICAgICBpZiAoYlVuaVRyYW5zZmVyKSB7Ci0gICAgICAgICAgICBpZiAocEZ1bmNzWzBdICYmIHBGdW5jc1swXS0+Q291bnRPdXRwdXRzKCkgPD0ga01heE91dHB1dHMpCi0gICAgICAgICAgICAgICAgcEZ1bmNzWzBdLT5DYWxsKCZpbnB1dCwgMSwgb3V0cHV0LCBub3V0cHV0KTsKLSAgICAgICAgICAgIGludCBvID0gRlhTWVNfcm91bmQob3V0cHV0WzBdICogMjU1KTsKLSAgICAgICAgICAgIGlmIChvICE9IHYpCi0gICAgICAgICAgICAgICAgYklkZW50aXR5ID0gRkFMU0U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgICAgICAgICAgICAgIHBUcmFuc2Zlci0+bV9TYW1wbGVzW2kgKiAyNTYgKyB2XSA9IG87Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChwQ3VyT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNIHx8CisgICAgICAgICAgICBwQ3VyT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9TSEFESU5HKSB7CisgICAgICAgICAgb2Jqc190b19nbyA9IDA7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgICAgICAgICAgICAgIGlmIChwRnVuY3NbaV0gJiYgcEZ1bmNzW2ldLT5Db3VudE91dHB1dHMoKSA8PSBrTWF4T3V0cHV0cykgewotICAgICAgICAgICAgICAgICAgICBwRnVuY3NbaV0tPkNhbGwoJmlucHV0LCAxLCBvdXRwdXQsIG5vdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbyA9IEZYU1lTX3JvdW5kKG91dHB1dFswXSAqIDI1NSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvICE9IHYpCi0gICAgICAgICAgICAgICAgICAgICAgICBiSWRlbnRpdHkgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcFRyYW5zZmVyLT5tX1NhbXBsZXNbaSAqIDI1NiArIHZdID0gbzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwVHJhbnNmZXItPm1fU2FtcGxlc1tpICogMjU2ICsgdl0gPSB2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICBvYmpzX3RvX2dvLS07CiAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1fT2JqZWN0SW5kZXgrKzsKKyAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXROZXh0T2JqZWN0KG1fT2JqZWN0UG9zKTsKKyAgICAgIGlmIChvYmpzX3RvX2dvID09IDApIHsKKyAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb2Jqc190b19nbyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0UmVuZGVyTW9kdWxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldENvbmZpZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgLT5tX1JlbmRlclN0ZXBMaW1pdDsKKyAgICAgIH0KICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpCi0gICAgICAgIGRlbGV0ZSBwRnVuY3NbaV07CisgICAgaWYgKCFwSXRlbS0+bV9wT2JqZWN0TGlzdC0+SXNQYXJzZWQoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkZWxldGUgbV9wUmVuZGVyZXI7CisgICAgbV9wUmVuZGVyZXIgPSBOVUxMOworICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgbV9PYmplY3RQb3MgPSBOVUxMOworICAgIG1fUHJldkxhc3RQb3MgPSBOVUxMOworICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX0xheWVySW5kZXgrKzsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgbV9TdGF0dXMgPSBEb25lOworfQoraW50IENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6RXN0aW1hdGVQcm9ncmVzcygpIHsKKyAgaWYgKCFtX3BDb250ZXh0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhfRFdPUkQgbkxheWVycyA9IG1fcENvbnRleHQtPm1fQ29udGVudExpc3QuR2V0U2l6ZSgpOworICBpbnQgblRvdGFsID0gMCwgblJlbmRlcmVkID0gMDsKKyAgZm9yIChGWF9EV09SRCBsYXllciA9IDA7IGxheWVyIDwgbkxheWVyczsgbGF5ZXIrKykgeworICAgIF9QREZfUmVuZGVySXRlbSogcEl0ZW0gPSBtX3BDb250ZXh0LT5tX0NvbnRlbnRMaXN0LkdldERhdGFQdHIobGF5ZXIpOworICAgIGludCBuT2JqcyA9IHBJdGVtLT5tX3BPYmplY3RMaXN0LT5Db3VudE9iamVjdHMoKTsKKyAgICBpZiAobGF5ZXIgPT0gbV9MYXllckluZGV4KSB7CisgICAgICBuUmVuZGVyZWQgKz0gbV9PYmplY3RJbmRleDsKKyAgICB9IGVsc2UgaWYgKGxheWVyIDwgbV9MYXllckluZGV4KSB7CisgICAgICBuUmVuZGVyZWQgKz0gbk9ianM7CisgICAgfQorICAgIG5Ub3RhbCArPSBuT2JqczsKKyAgfQorICBpZiAoblRvdGFsID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTAwICogblJlbmRlcmVkIC8gblRvdGFsOworfQorQ1BERl9UcmFuc2ZlckZ1bmMqIENQREZfRG9jUmVuZGVyRGF0YTo6R2V0VHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGlmICghcE9iaikKKyAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIHBUcmFuc2Zlci0+bV9iSWRlbnRpdHkgPSBiSWRlbnRpdHk7CisgIGF1dG8gaXQgPSBtX1RyYW5zZmVyRnVuY01hcC5maW5kKHBPYmopOworICBpZiAoaXQgIT0gbV9UcmFuc2ZlckZ1bmNNYXAuZW5kKCkpIHsKKyAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UcmFuc2ZlckZ1bmM+KiBwVHJhbnNmZXJDb3VudGVyID0gaXQtPnNlY29uZDsKICAgICByZXR1cm4gcFRyYW5zZmVyQ291bnRlci0+QWRkUmVmKCk7CisgIH0KKworICBDUERGX0Z1bmN0aW9uKiBwRnVuY3NbM10gPSB7bnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cn07CisgIEZYX0JPT0wgYlVuaVRyYW5zZmVyID0gVFJVRTsKKyAgRlhfQk9PTCBiSWRlbnRpdHkgPSBUUlVFOworICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgIGJVbmlUcmFuc2ZlciA9IEZBTFNFOworICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwT2JqOworICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPCAzKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICBwRnVuY3NbMiAtIGldID0gQ1BERl9GdW5jdGlvbjo6TG9hZChwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKSk7CisgICAgICBpZiAoIXBGdW5jc1syIC0gaV0pIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHBGdW5jc1swXSA9IENQREZfRnVuY3Rpb246OkxvYWQocE9iaik7CisgICAgaWYgKCFwRnVuY3NbMF0pIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfQorICBDUERGX1RyYW5zZmVyRnVuYyogcFRyYW5zZmVyID0gbmV3IENQREZfVHJhbnNmZXJGdW5jOworICBwVHJhbnNmZXItPm1fcFBERkRvYyA9IG1fcFBERkRvYzsKKyAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jPiogcFRyYW5zZmVyQ291bnRlciA9CisgICAgICBuZXcgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jPihwVHJhbnNmZXIpOworICBtX1RyYW5zZmVyRnVuY01hcFtwT2JqXSA9IHBUcmFuc2ZlckNvdW50ZXI7CisgIHN0YXRpYyBjb25zdCBpbnQga01heE91dHB1dHMgPSAxNjsKKyAgRlhfRkxPQVQgb3V0cHV0W2tNYXhPdXRwdXRzXTsKKyAgRlhTWVNfbWVtc2V0KG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpOworICBGWF9GTE9BVCBpbnB1dDsKKyAgaW50IG5vdXRwdXQ7CisgIGZvciAoaW50IHYgPSAwOyB2IDwgMjU2OyArK3YpIHsKKyAgICBpbnB1dCA9IChGWF9GTE9BVCl2IC8gMjU1LjBmOworICAgIGlmIChiVW5pVHJhbnNmZXIpIHsKKyAgICAgIGlmIChwRnVuY3NbMF0gJiYgcEZ1bmNzWzBdLT5Db3VudE91dHB1dHMoKSA8PSBrTWF4T3V0cHV0cykKKyAgICAgICAgcEZ1bmNzWzBdLT5DYWxsKCZpbnB1dCwgMSwgb3V0cHV0LCBub3V0cHV0KTsKKyAgICAgIGludCBvID0gRlhTWVNfcm91bmQob3V0cHV0WzBdICogMjU1KTsKKyAgICAgIGlmIChvICE9IHYpCisgICAgICAgIGJJZGVudGl0eSA9IEZBTFNFOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgcFRyYW5zZmVyLT5tX1NhbXBsZXNbaSAqIDI1NiArIHZdID0gbzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgaWYgKHBGdW5jc1tpXSAmJiBwRnVuY3NbaV0tPkNvdW50T3V0cHV0cygpIDw9IGtNYXhPdXRwdXRzKSB7CisgICAgICAgICAgcEZ1bmNzW2ldLT5DYWxsKCZpbnB1dCwgMSwgb3V0cHV0LCBub3V0cHV0KTsKKyAgICAgICAgICBpbnQgbyA9IEZYU1lTX3JvdW5kKG91dHB1dFswXSAqIDI1NSk7CisgICAgICAgICAgaWYgKG8gIT0gdikKKyAgICAgICAgICAgIGJJZGVudGl0eSA9IEZBTFNFOworICAgICAgICAgIHBUcmFuc2Zlci0+bV9TYW1wbGVzW2kgKiAyNTYgKyB2XSA9IG87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcFRyYW5zZmVyLT5tX1NhbXBsZXNbaSAqIDI1NiArIHZdID0gdjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkKKyAgICBkZWxldGUgcEZ1bmNzW2ldOworCisgIHBUcmFuc2Zlci0+bV9iSWRlbnRpdHkgPSBiSWRlbnRpdHk7CisgIHJldHVybiBwVHJhbnNmZXJDb3VudGVyLT5BZGRSZWYoKTsKIH0KIAotdm9pZCBDUERGX0RvY1JlbmRlckRhdGE6OlJlbGVhc2VUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopCi17Ci0gICAgYXV0byBpdCA9IG1fVHJhbnNmZXJGdW5jTWFwLmZpbmQocE9iaik7Ci0gICAgaWYgKGl0ICE9IG1fVHJhbnNmZXJGdW5jTWFwLmVuZCgpKQotICAgICAgICBpdC0+c2Vjb25kLT5SZW1vdmVSZWYoKTsKK3ZvaWQgQ1BERl9Eb2NSZW5kZXJEYXRhOjpSZWxlYXNlVHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGF1dG8gaXQgPSBtX1RyYW5zZmVyRnVuY01hcC5maW5kKHBPYmopOworICBpZiAoaXQgIT0gbV9UcmFuc2ZlckZ1bmNNYXAuZW5kKCkpCisgICAgaXQtPnNlY29uZC0+UmVtb3ZlUmVmKCk7CiB9Ci1DUERGX1JlbmRlckNvbmZpZzo6Q1BERl9SZW5kZXJDb25maWcoKQotewotICAgIG1fSGFsZnRvbmVMaW1pdCA9IDA7Ci0gICAgbV9SZW5kZXJTdGVwTGltaXQgPSAxMDA7CitDUERGX1JlbmRlckNvbmZpZzo6Q1BERl9SZW5kZXJDb25maWcoKSB7CisgIG1fSGFsZnRvbmVMaW1pdCA9IDA7CisgIG1fUmVuZGVyU3RlcExpbWl0ID0gMTAwOwogfQotQ1BERl9SZW5kZXJDb25maWc6On5DUERGX1JlbmRlckNvbmZpZygpCi17CitDUERGX1JlbmRlckNvbmZpZzo6fkNQREZfUmVuZGVyQ29uZmlnKCkge30KK0NQREZfRGV2aWNlQnVmZmVyOjpDUERGX0RldmljZUJ1ZmZlcigpIHsKKyAgbV9wQml0bWFwID0gTlVMTDsKKyAgbV9wRGV2aWNlID0gTlVMTDsKKyAgbV9wQ29udGV4dCA9IE5VTEw7CisgIG1fcE9iamVjdCA9IE5VTEw7CiB9Ci1DUERGX0RldmljZUJ1ZmZlcjo6Q1BERl9EZXZpY2VCdWZmZXIoKQotewotICAgIG1fcEJpdG1hcCA9IE5VTEw7Ci0gICAgbV9wRGV2aWNlID0gTlVMTDsKLSAgICBtX3BDb250ZXh0ID0gTlVMTDsKLSAgICBtX3BPYmplY3QgPSBOVUxMOworQ1BERl9EZXZpY2VCdWZmZXI6On5DUERGX0RldmljZUJ1ZmZlcigpIHsKKyAgZGVsZXRlIG1fcEJpdG1hcDsKIH0KLUNQREZfRGV2aWNlQnVmZmVyOjp+Q1BERl9EZXZpY2VCdWZmZXIoKQotewotICAgIGRlbGV0ZSBtX3BCaXRtYXA7Ci19Ci1GWF9CT09MIENQREZfRGV2aWNlQnVmZmVyOjpJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGludCBtYXhfZHBpKQotewotICAgIG1fcERldmljZSA9IHBEZXZpY2U7Ci0gICAgbV9wQ29udGV4dCA9IHBDb250ZXh0OwotICAgIG1fUmVjdCA9ICpwUmVjdDsKLSAgICBtX3BPYmplY3QgPSBwT2JqOwotICAgIG1fTWF0cml4LlRyYW5zbGF0ZUkoLXBSZWN0LT5sZWZ0LCAtcFJlY3QtPnRvcCk7CitGWF9CT09MIENQREZfRGV2aWNlQnVmZmVyOjpJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfZHBpKSB7CisgIG1fcERldmljZSA9IHBEZXZpY2U7CisgIG1fcENvbnRleHQgPSBwQ29udGV4dDsKKyAgbV9SZWN0ID0gKnBSZWN0OworICBtX3BPYmplY3QgPSBwT2JqOworICBtX01hdHJpeC5UcmFuc2xhdGVJKC1wUmVjdC0+bGVmdCwgLXBSZWN0LT50b3ApOwogI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgaW50IGhvcnpfc2l6ZSA9IHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19IT1JaX1NJWkUpOwotICAgIGludCB2ZXJ0X3NpemUgPSBwRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfVkVSVF9TSVpFKTsKLSAgICBpZiAoaG9yel9zaXplICYmIHZlcnRfc2l6ZSAmJiBtYXhfZHBpKSB7Ci0gICAgICAgIGludCBkcGloID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSAqIDI1NCAvIChob3J6X3NpemUgKiAxMCk7Ci0gICAgICAgIGludCBkcGl2ID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkgKiAyNTQgLyAodmVydF9zaXplICogMTApOwotICAgICAgICBpZiAoZHBpaCA+IG1heF9kcGkpIHsKLSAgICAgICAgICAgIG1fTWF0cml4LlNjYWxlKChGWF9GTE9BVCkobWF4X2RwaSkgLyBkcGloLCAxLjBmKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHBpdiA+IG1heF9kcGkpIHsKLSAgICAgICAgICAgIG1fTWF0cml4LlNjYWxlKDEuMGYsIChGWF9GTE9BVCkobWF4X2RwaSkgLyAoRlhfRkxPQVQpZHBpdik7Ci0gICAgICAgIH0KKyAgaW50IGhvcnpfc2l6ZSA9IHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19IT1JaX1NJWkUpOworICBpbnQgdmVydF9zaXplID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1ZFUlRfU0laRSk7CisgIGlmIChob3J6X3NpemUgJiYgdmVydF9zaXplICYmIG1heF9kcGkpIHsKKyAgICBpbnQgZHBpaCA9CisgICAgICAgIHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkgKiAyNTQgLyAoaG9yel9zaXplICogMTApOworICAgIGludCBkcGl2ID0KKyAgICAgICAgcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkgKiAyNTQgLyAodmVydF9zaXplICogMTApOworICAgIGlmIChkcGloID4gbWF4X2RwaSkgeworICAgICAgbV9NYXRyaXguU2NhbGUoKEZYX0ZMT0FUKShtYXhfZHBpKSAvIGRwaWgsIDEuMGYpOwogICAgIH0KKyAgICBpZiAoZHBpdiA+IG1heF9kcGkpIHsKKyAgICAgIG1fTWF0cml4LlNjYWxlKDEuMGYsIChGWF9GTE9BVCkobWF4X2RwaSkgLyAoRlhfRkxPQVQpZHBpdik7CisgICAgfQorICB9CiAjZW5kaWYKLSAgICBDRlhfTWF0cml4IGN0bSA9IG1fcERldmljZS0+R2V0Q1RNKCk7Ci0gICAgRlhfRkxPQVQgZlNjYWxlWCA9IEZYU1lTX2ZhYnMoY3RtLmEpOwotICAgIEZYX0ZMT0FUIGZTY2FsZVkgPSBGWFNZU19mYWJzKGN0bS5kKTsKLSAgICBtX01hdHJpeC5Db25jYXQoZlNjYWxlWCwgMCwgMCwgZlNjYWxlWSwgMCwgMCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0KCpwUmVjdCk7CisgIENGWF9NYXRyaXggY3RtID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKKyAgRlhfRkxPQVQgZlNjYWxlWCA9IEZYU1lTX2ZhYnMoY3RtLmEpOworICBGWF9GTE9BVCBmU2NhbGVZID0gRlhTWVNfZmFicyhjdG0uZCk7CisgIG1fTWF0cml4LkNvbmNhdChmU2NhbGVYLCAwLCAwLCBmU2NhbGVZLCAwLCAwKTsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0KCpwUmVjdCk7CisgIG1fTWF0cml4LlRyYW5zZm9ybVJlY3QocmVjdCk7CisgIEZYX1JFQ1QgYml0bWFwX3JlY3QgPSByZWN0LkdldE91dHRlclJlY3QoKTsKKyAgbV9wQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKKyAgbV9wQml0bWFwLT5DcmVhdGUoYml0bWFwX3JlY3QuV2lkdGgoKSwgYml0bWFwX3JlY3QuSGVpZ2h0KCksIEZYRElCX0FyZ2IpOworICByZXR1cm4gVFJVRTsKK30KK3ZvaWQgQ1BERl9EZXZpY2VCdWZmZXI6Ok91dHB1dFRvRGV2aWNlKCkgeworICBpZiAobV9wRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUkVOREVSX0NBUFMpICYgRlhSQ19HRVRfQklUUykgeworICAgIGlmIChtX01hdHJpeC5hID09IDEuMGYgJiYgbV9NYXRyaXguZCA9PSAxLjBmKSB7CisgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhtX3BCaXRtYXAsIG1fUmVjdC5sZWZ0LCBtX1JlY3QudG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKG1fcEJpdG1hcCwgbV9SZWN0LmxlZnQsIG1fUmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9SZWN0LldpZHRoKCksIG1fUmVjdC5IZWlnaHQoKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIENGWF9ESUJpdG1hcCBidWZmZXI7CisgICAgbV9wRGV2aWNlLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKCZidWZmZXIsIG1fcEJpdG1hcC0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQml0bWFwLT5HZXRIZWlnaHQoKSk7CisgICAgbV9wQ29udGV4dC0+R2V0QmFja2dyb3VuZCgmYnVmZmVyLCBtX3BPYmplY3QsIE5VTEwsICZtX01hdHJpeCk7CisgICAgYnVmZmVyLkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBidWZmZXIuR2V0V2lkdGgoKSwgYnVmZmVyLkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQml0bWFwLCAwLCAwKTsKKyAgICBtX3BEZXZpY2UtPlN0cmV0Y2hESUJpdHMoJmJ1ZmZlciwgbV9SZWN0LmxlZnQsIG1fUmVjdC50b3AsIG1fUmVjdC5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1JlY3QuSGVpZ2h0KCkpOworICB9Cit9CitDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6Q1BERl9TY2FsZWRSZW5kZXJCdWZmZXIoKSB7CisgIG1fcEJpdG1hcERldmljZSA9IE5VTEw7Cit9CitDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6fkNQREZfU2NhbGVkUmVuZGVyQnVmZmVyKCkgeworICBkZWxldGUgbV9wQml0bWFwRGV2aWNlOworfQorI2RlZmluZSBfRlBERkFQSV9JTUFHRVNJWkVfTElNSVRfICgzMCAqIDEwMjQgKiAxMDI0KQorRlhfQk9PTCBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6SW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2RwaSkgeworICBGWFNZU19hc3NlcnQocFJlY3QgIT0gTlVMTCk7CisgIG1fcERldmljZSA9IHBEZXZpY2U7CisgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX0dFVF9CSVRTKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgbV9wQ29udGV4dCA9IHBDb250ZXh0OworICBtX1JlY3QgPSAqcFJlY3Q7CisgIG1fcE9iamVjdCA9IHBPYmo7CisgIG1fTWF0cml4LlRyYW5zbGF0ZUkoLXBSZWN0LT5sZWZ0LCAtcFJlY3QtPnRvcCk7CisgIGludCBob3J6X3NpemUgPSBwRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfSE9SWl9TSVpFKTsKKyAgaW50IHZlcnRfc2l6ZSA9IHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19WRVJUX1NJWkUpOworICBpZiAoaG9yel9zaXplICYmIHZlcnRfc2l6ZSAmJiBtYXhfZHBpKSB7CisgICAgaW50IGRwaWggPQorICAgICAgICBwRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpICogMjU0IC8gKGhvcnpfc2l6ZSAqIDEwKTsKKyAgICBpbnQgZHBpdiA9CisgICAgICAgIHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpICogMjU0IC8gKHZlcnRfc2l6ZSAqIDEwKTsKKyAgICBpZiAoZHBpaCA+IG1heF9kcGkpIHsKKyAgICAgIG1fTWF0cml4LlNjYWxlKChGWF9GTE9BVCkobWF4X2RwaSkgLyBkcGloLCAxLjBmKTsKKyAgICB9CisgICAgaWYgKGRwaXYgPiBtYXhfZHBpKSB7CisgICAgICBtX01hdHJpeC5TY2FsZSgxLjBmLCAoRlhfRkxPQVQpKG1heF9kcGkpIC8gKEZYX0ZMT0FUKWRwaXYpOworICAgIH0KKyAgfQorICBtX3BCaXRtYXBEZXZpY2UgPSBuZXcgQ0ZYX0Z4Z2VEZXZpY2U7CisgIEZYRElCX0Zvcm1hdCBkaWJGb3JtYXQgPSBGWERJQl9SZ2I7CisgIGludDMyX3QgYnBwID0gMjQ7CisgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX0FMUEhBX09VVFBVVCkgeworICAgIGRpYkZvcm1hdCA9IEZYRElCX0FyZ2I7CisgICAgYnBwID0gMzI7CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICBpbnQzMl90IGlXaWR0aCwgaUhlaWdodCwgaVBpdGNoOworICB3aGlsZSAoMSkgeworICAgIHJlY3QgPSAqcFJlY3Q7CiAgICAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChyZWN0KTsKICAgICBGWF9SRUNUIGJpdG1hcF9yZWN0ID0gcmVjdC5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgbV9wQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICBtX3BCaXRtYXAtPkNyZWF0ZShiaXRtYXBfcmVjdC5XaWR0aCgpLCBiaXRtYXBfcmVjdC5IZWlnaHQoKSwgRlhESUJfQXJnYik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgaVdpZHRoID0gYml0bWFwX3JlY3QuV2lkdGgoKTsKKyAgICBpSGVpZ2h0ID0gYml0bWFwX3JlY3QuSGVpZ2h0KCk7CisgICAgaVBpdGNoID0gKGlXaWR0aCAqIGJwcCArIDMxKSAvIDMyICogNDsKKyAgICBpZiAoaVdpZHRoICogaUhlaWdodCA8IDEpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKGlQaXRjaCAqIGlIZWlnaHQgPD0gX0ZQREZBUElfSU1BR0VTSVpFX0xJTUlUXyAmJgorICAgICAgICBtX3BCaXRtYXBEZXZpY2UtPkNyZWF0ZShpV2lkdGgsIGlIZWlnaHQsIGRpYkZvcm1hdCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX01hdHJpeC5TY2FsZSgwLjVmLCAwLjVmKTsKKyAgfQorICBtX3BDb250ZXh0LT5HZXRCYWNrZ3JvdW5kKG1fcEJpdG1hcERldmljZS0+R2V0Qml0bWFwKCksIG1fcE9iamVjdCwgcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fTWF0cml4KTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENQREZfRGV2aWNlQnVmZmVyOjpPdXRwdXRUb0RldmljZSgpCi17Ci0gICAgaWYgKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfR0VUX0JJVFMpIHsKLSAgICAgICAgaWYgKG1fTWF0cml4LmEgPT0gMS4wZiAmJiBtX01hdHJpeC5kID09IDEuMGYpIHsKLSAgICAgICAgICAgIG1fcERldmljZS0+U2V0RElCaXRzKG1fcEJpdG1hcCwgbV9SZWN0LmxlZnQsIG1fUmVjdC50b3ApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKG1fcEJpdG1hcCwgbV9SZWN0LmxlZnQsIG1fUmVjdC50b3AsIG1fUmVjdC5XaWR0aCgpLCBtX1JlY3QuSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0ZYX0RJQml0bWFwIGJ1ZmZlcjsKLSAgICAgICAgbV9wRGV2aWNlLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKCZidWZmZXIsIG1fcEJpdG1hcC0+R2V0V2lkdGgoKSwgbV9wQml0bWFwLT5HZXRIZWlnaHQoKSk7Ci0gICAgICAgIG1fcENvbnRleHQtPkdldEJhY2tncm91bmQoJmJ1ZmZlciwgbV9wT2JqZWN0LCBOVUxMLCAmbV9NYXRyaXgpOwotICAgICAgICBidWZmZXIuQ29tcG9zaXRlQml0bWFwKDAsIDAsIGJ1ZmZlci5HZXRXaWR0aCgpLCBidWZmZXIuR2V0SGVpZ2h0KCksIG1fcEJpdG1hcCwgMCwgMCk7Ci0gICAgICAgIG1fcERldmljZS0+U3RyZXRjaERJQml0cygmYnVmZmVyLCBtX1JlY3QubGVmdCwgbV9SZWN0LnRvcCwgbV9SZWN0LldpZHRoKCksIG1fUmVjdC5IZWlnaHQoKSk7Ci0gICAgfQordm9pZCBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6T3V0cHV0VG9EZXZpY2UoKSB7CisgIGlmIChtX3BCaXRtYXBEZXZpY2UpIHsKKyAgICBtX3BEZXZpY2UtPlN0cmV0Y2hESUJpdHMobV9wQml0bWFwRGV2aWNlLT5HZXRCaXRtYXAoKSwgbV9SZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fUmVjdC50b3AsIG1fUmVjdC5XaWR0aCgpLCBtX1JlY3QuSGVpZ2h0KCkpOworICB9CiB9Ci1DUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6Q1BERl9TY2FsZWRSZW5kZXJCdWZmZXIoKQotewotICAgIG1fcEJpdG1hcERldmljZSA9IE5VTEw7Ci19Ci1DUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6fkNQREZfU2NhbGVkUmVuZGVyQnVmZmVyKCkKLXsKLSAgICBkZWxldGUgbV9wQml0bWFwRGV2aWNlOwotfQotI2RlZmluZSBfRlBERkFQSV9JTUFHRVNJWkVfTElNSVRfCSgzMCAqIDEwMjQgKiAxMDI0KQotRlhfQk9PTCBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6SW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKLSAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMgKnBPcHRpb25zLCBpbnQgbWF4X2RwaSkKLXsKLSAgICBGWFNZU19hc3NlcnQocFJlY3QgIT0gTlVMTCk7Ci0gICAgbV9wRGV2aWNlID0gcERldmljZTsKLSAgICBpZiAobV9wRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUkVOREVSX0NBUFMpICYgRlhSQ19HRVRfQklUUykgewotICAgICAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgSVBERl9PQ0NvbnRleHQ6OkNoZWNrT2JqZWN0VmlzaWJsZShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmopIHsKKyAgY29uc3QgQ1BERl9Db250ZW50TWFya0RhdGEqIHBEYXRhID0gcE9iai0+bV9Db250ZW50TWFyazsKKyAgaW50IG5JdGVtcyA9IHBEYXRhLT5Db3VudEl0ZW1zKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkl0ZW1zOyBpKyspIHsKKyAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IHBEYXRhLT5HZXRJdGVtKGkpOworICAgIGlmIChpdGVtLkdldE5hbWUoKSA9PSBGWF9CU1RSQygiT0MiKSAmJgorICAgICAgICBpdGVtLkdldFBhcmFtVHlwZSgpID09IENQREZfQ29udGVudE1hcmtJdGVtOjpQcm9wZXJ0aWVzRGljdCkgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHID0gKENQREZfRGljdGlvbmFyeSopaXRlbS5HZXRQYXJhbSgpOworICAgICAgaWYgKCFDaGVja09DR1Zpc2libGUocE9DRykpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQogICAgIH0KLSAgICBtX3BDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgbV9SZWN0ID0gKnBSZWN0OwotICAgIG1fcE9iamVjdCA9IHBPYmo7Ci0gICAgbV9NYXRyaXguVHJhbnNsYXRlSSgtcFJlY3QtPmxlZnQsIC1wUmVjdC0+dG9wKTsKLSAgICBpbnQgaG9yel9zaXplID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX0hPUlpfU0laRSk7Ci0gICAgaW50IHZlcnRfc2l6ZSA9IHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19WRVJUX1NJWkUpOwotICAgIGlmIChob3J6X3NpemUgJiYgdmVydF9zaXplICYmIG1heF9kcGkpIHsKLSAgICAgICAgaW50IGRwaWggPSBwRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpICogMjU0IC8gKGhvcnpfc2l6ZSAqIDEwKTsKLSAgICAgICAgaW50IGRwaXYgPSBwRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSAqIDI1NCAvICh2ZXJ0X3NpemUgKiAxMCk7Ci0gICAgICAgIGlmIChkcGloID4gbWF4X2RwaSkgewotICAgICAgICAgICAgbV9NYXRyaXguU2NhbGUoKEZYX0ZMT0FUKShtYXhfZHBpKSAvIGRwaWgsIDEuMGYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkcGl2ID4gbWF4X2RwaSkgewotICAgICAgICAgICAgbV9NYXRyaXguU2NhbGUoMS4wZiwgKEZYX0ZMT0FUKShtYXhfZHBpKSAvIChGWF9GTE9BVClkcGl2KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX3BCaXRtYXBEZXZpY2UgPSBuZXcgQ0ZYX0Z4Z2VEZXZpY2U7Ci0gICAgRlhESUJfRm9ybWF0IGRpYkZvcm1hdCA9IEZYRElCX1JnYjsKLSAgICBpbnQzMl90IGJwcCA9IDI0OwotICAgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX0FMUEhBX09VVFBVVCkgewotICAgICAgICBkaWJGb3JtYXQgPSBGWERJQl9BcmdiOwotICAgICAgICBicHAgPSAzMjsKLSAgICB9Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0OwotICAgIGludDMyX3QgaVdpZHRoLCBpSGVpZ2h0LCBpUGl0Y2g7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgcmVjdCA9ICpwUmVjdDsKLSAgICAgICAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChyZWN0KTsKLSAgICAgICAgRlhfUkVDVCBiaXRtYXBfcmVjdCA9IHJlY3QuR2V0T3V0dGVyUmVjdCgpOwotICAgICAgICBpV2lkdGggPSBiaXRtYXBfcmVjdC5XaWR0aCgpOwotICAgICAgICBpSGVpZ2h0ID0gYml0bWFwX3JlY3QuSGVpZ2h0KCk7Ci0gICAgICAgIGlQaXRjaCA9IChpV2lkdGggKiBicHAgKyAzMSkgLyAzMiAqIDQ7Ci0gICAgICAgIGlmIChpV2lkdGggKiBpSGVpZ2h0IDwgMSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpUGl0Y2ggKiBpSGVpZ2h0IDw9IF9GUERGQVBJX0lNQUdFU0laRV9MSU1JVF8gJiYKLSAgICAgICAgICAgICAgICBtX3BCaXRtYXBEZXZpY2UtPkNyZWF0ZShpV2lkdGgsIGlIZWlnaHQsIGRpYkZvcm1hdCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1fTWF0cml4LlNjYWxlKDAuNWYsIDAuNWYpOwotICAgIH0KLSAgICBtX3BDb250ZXh0LT5HZXRCYWNrZ3JvdW5kKG1fcEJpdG1hcERldmljZS0+R2V0Qml0bWFwKCksIG1fcE9iamVjdCwgcE9wdGlvbnMsICZtX01hdHJpeCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENQREZfU2NhbGVkUmVuZGVyQnVmZmVyOjpPdXRwdXRUb0RldmljZSgpCi17Ci0gICAgaWYgKG1fcEJpdG1hcERldmljZSkgewotICAgICAgICBtX3BEZXZpY2UtPlN0cmV0Y2hESUJpdHMobV9wQml0bWFwRGV2aWNlLT5HZXRCaXRtYXAoKSwgbV9SZWN0LmxlZnQsIG1fUmVjdC50b3AsIG1fUmVjdC5XaWR0aCgpLCBtX1JlY3QuSGVpZ2h0KCkpOwotICAgIH0KLX0KLUZYX0JPT0wgSVBERl9PQ0NvbnRleHQ6OkNoZWNrT2JqZWN0VmlzaWJsZShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmopCi17Ci0gICAgY29uc3QgQ1BERl9Db250ZW50TWFya0RhdGEqIHBEYXRhID0gcE9iai0+bV9Db250ZW50TWFyazsKLSAgICBpbnQgbkl0ZW1zID0gcERhdGEtPkNvdW50SXRlbXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5JdGVtczsgaSArKykgewotICAgICAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IHBEYXRhLT5HZXRJdGVtKGkpOwotICAgICAgICBpZiAoaXRlbS5HZXROYW1lKCkgPT0gRlhfQlNUUkMoIk9DIikgJiYgaXRlbS5HZXRQYXJhbVR5cGUoKSA9PSBDUERGX0NvbnRlbnRNYXJrSXRlbTo6UHJvcGVydGllc0RpY3QpIHsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcE9DRyA9IChDUERGX0RpY3Rpb25hcnkqKWl0ZW0uR2V0UGFyYW0oKTsKLSAgICAgICAgICAgIGlmICghQ2hlY2tPQ0dWaXNpYmxlKHBPQ0cpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9jYWNoZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2NhY2hlLmNwcAppbmRleCBjZGJlY2Q2NS4uOGRhMTc2ZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9jYWNoZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9jYWNoZS5jcHAKQEAgLTEwLDM0NCArMTAsMzYxIEBACiAjaW5jbHVkZSAiLi4vZnBkZl9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJyZW5kZXJfaW50LmgiCiBzdHJ1Y3QgQ0FDSEVJTkZPIHsKLSAgICBGWF9EV09SRCB0aW1lOwotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtOworICBGWF9EV09SRCB0aW1lOworICBDUERGX1N0cmVhbSogcFN0cmVhbTsKIH07CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IGNvbXBhcmUoY29uc3Qgdm9pZCogZGF0YTEsIGNvbnN0IHZvaWQqIGRhdGEyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoQ0FDSEVJTkZPKilkYXRhMSktPnRpbWUgLSAoKENBQ0hFSU5GTyopZGF0YTIpLT50aW1lOwotICAgIH0KK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCB2b2lkKiBkYXRhMSwgY29uc3Qgdm9pZCogZGF0YTIpIHsKKyAgcmV0dXJuICgoQ0FDSEVJTkZPKilkYXRhMSktPnRpbWUgLSAoKENBQ0hFSU5GTyopZGF0YTIpLT50aW1lOworfQogfTsKLXZvaWQgQ1BERl9QYWdlOjpDbGVhclJlbmRlckNhY2hlKCkKLXsKLSAgICBpZiAobV9wUGFnZVJlbmRlcikgewotICAgICAgICBtX3BQYWdlUmVuZGVyLT5DbGVhckFsbCgpOwotICAgIH0KK3ZvaWQgQ1BERl9QYWdlOjpDbGVhclJlbmRlckNhY2hlKCkgeworICBpZiAobV9wUGFnZVJlbmRlcikgeworICAgIG1fcFBhZ2VSZW5kZXItPkNsZWFyQWxsKCk7CisgIH0KIH0KLXZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkNsZWFyQWxsKCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0ltYWdlQ2FjaGVzLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIHZvaWQqIGtleTsKLSAgICAgICAgdm9pZCogdmFsdWU7Ci0gICAgICAgIG1fSW1hZ2VDYWNoZXMuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGRlbGV0ZSAoQ1BERl9JbWFnZUNhY2hlKil2YWx1ZTsKLSAgICB9Ci0gICAgbV9JbWFnZUNhY2hlcy5SZW1vdmVBbGwoKTsKLSAgICBtX25DYWNoZVNpemUgPSAwOwotICAgIG1fblRpbWVDb3VudCA9IDA7Ci19Ci12b2lkIENQREZfUGFnZVJlbmRlckNhY2hlOjpDYWNoZU9wdGltaXphdGlvbihpbnQzMl90IGR3TGltaXRDYWNoZVNpemUpCi17Ci0gICAgaWYgKG1fbkNhY2hlU2l6ZSA8PSAoRlhfRFdPUkQpZHdMaW1pdENhY2hlU2l6ZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBuQ291bnQgPSBtX0ltYWdlQ2FjaGVzLkdldENvdW50KCk7Ci0gICAgQ0FDSEVJTkZPKiBwQ0FDSEVJTkZPID0gKENBQ0hFSU5GTyopRlhfQWxsb2MyRCh1aW50OF90LCBzaXplb2YoQ0FDSEVJTkZPKSwgbkNvdW50KTsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0ltYWdlQ2FjaGVzLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICB2b2lkKiBrZXk7Ci0gICAgICAgIHZvaWQqIHZhbHVlOwotICAgICAgICBtX0ltYWdlQ2FjaGVzLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICBwQ0FDSEVJTkZPW2ldLnRpbWUgPSAoKENQREZfSW1hZ2VDYWNoZSopdmFsdWUpLT5HZXRUaW1lQ291bnQoKTsKLSAgICAgICAgcENBQ0hFSU5GT1tpKytdLnBTdHJlYW0gPSAoKENQREZfSW1hZ2VDYWNoZSopdmFsdWUpLT5HZXRTdHJlYW0oKTsKLSAgICB9Ci0gICAgRlhTWVNfcXNvcnQocENBQ0hFSU5GTywgbkNvdW50LCBzaXplb2YgKENBQ0hFSU5GTyksIGNvbXBhcmUpOwotICAgIEZYX0RXT1JEIG5UaW1lQ291bnQgPSBtX25UaW1lQ291bnQ7Ci0gICAgaWYgKG5UaW1lQ291bnQgKyAxIDwgblRpbWVDb3VudCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICAoKENQREZfSW1hZ2VDYWNoZSopKG1fSW1hZ2VDYWNoZXNbcENBQ0hFSU5GT1tpXS5wU3RyZWFtXSkpLT5tX2R3VGltZUNvdW50ID0gaTsKLSAgICAgICAgfQotICAgICAgICBtX25UaW1lQ291bnQgPSBuQ291bnQ7Ci0gICAgfQotICAgIGkgPSAwOwotICAgIHdoaWxlKG5Db3VudCA+IDE1KSB7Ci0gICAgICAgIENsZWFySW1hZ2VDYWNoZShwQ0FDSEVJTkZPW2krK10ucFN0cmVhbSk7Ci0gICAgICAgIG5Db3VudC0tOwotICAgIH0KLSAgICB3aGlsZSAobV9uQ2FjaGVTaXplID4gKEZYX0RXT1JEKWR3TGltaXRDYWNoZVNpemUpIHsKLSAgICAgICAgQ2xlYXJJbWFnZUNhY2hlKHBDQUNIRUlORk9baSsrXS5wU3RyZWFtKTsKLSAgICB9Ci0gICAgRlhfRnJlZShwQ0FDSEVJTkZPKTsKLX0KLXZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkNsZWFySW1hZ2VDYWNoZShDUERGX1N0cmVhbSogcFN0cmVhbSkKLXsKLSAgICB2b2lkKiB2YWx1ZSA9IG1fSW1hZ2VDYWNoZXMuR2V0VmFsdWVBdChwU3RyZWFtKTsKLSAgICBpZiAodmFsdWUgPT0gTlVMTCkJewotICAgICAgICBtX0ltYWdlQ2FjaGVzLlJlbW92ZUtleShwU3RyZWFtKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX25DYWNoZVNpemUgLT0gKChDUERGX0ltYWdlQ2FjaGUqKXZhbHVlKS0+RXN0aW1hdGVTaXplKCk7Cit2b2lkIENQREZfUGFnZVJlbmRlckNhY2hlOjpDbGVhckFsbCgpIHsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9JbWFnZUNhY2hlcy5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICB2b2lkKiBrZXk7CisgICAgdm9pZCogdmFsdWU7CisgICAgbV9JbWFnZUNhY2hlcy5HZXROZXh0QXNzb2MocG9zLCBrZXksIHZhbHVlKTsKICAgICBkZWxldGUgKENQREZfSW1hZ2VDYWNoZSopdmFsdWU7CisgIH0KKyAgbV9JbWFnZUNhY2hlcy5SZW1vdmVBbGwoKTsKKyAgbV9uQ2FjaGVTaXplID0gMDsKKyAgbV9uVGltZUNvdW50ID0gMDsKK30KK3ZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkNhY2hlT3B0aW1pemF0aW9uKGludDMyX3QgZHdMaW1pdENhY2hlU2l6ZSkgeworICBpZiAobV9uQ2FjaGVTaXplIDw9IChGWF9EV09SRClkd0xpbWl0Q2FjaGVTaXplKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBuQ291bnQgPSBtX0ltYWdlQ2FjaGVzLkdldENvdW50KCk7CisgIENBQ0hFSU5GTyogcENBQ0hFSU5GTyA9CisgICAgICAoQ0FDSEVJTkZPKilGWF9BbGxvYzJEKHVpbnQ4X3QsIHNpemVvZihDQUNIRUlORk8pLCBuQ291bnQpOworICBGWF9QT1NJVElPTiBwb3MgPSBtX0ltYWdlQ2FjaGVzLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgaW50IGkgPSAwOworICB3aGlsZSAocG9zKSB7CisgICAgdm9pZCoga2V5OworICAgIHZvaWQqIHZhbHVlOworICAgIG1fSW1hZ2VDYWNoZXMuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7CisgICAgcENBQ0hFSU5GT1tpXS50aW1lID0gKChDUERGX0ltYWdlQ2FjaGUqKXZhbHVlKS0+R2V0VGltZUNvdW50KCk7CisgICAgcENBQ0hFSU5GT1tpKytdLnBTdHJlYW0gPSAoKENQREZfSW1hZ2VDYWNoZSopdmFsdWUpLT5HZXRTdHJlYW0oKTsKKyAgfQorICBGWFNZU19xc29ydChwQ0FDSEVJTkZPLCBuQ291bnQsIHNpemVvZihDQUNIRUlORk8pLCBjb21wYXJlKTsKKyAgRlhfRFdPUkQgblRpbWVDb3VudCA9IG1fblRpbWVDb3VudDsKKyAgaWYgKG5UaW1lQ291bnQgKyAxIDwgblRpbWVDb3VudCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgICAgKChDUERGX0ltYWdlQ2FjaGUqKShtX0ltYWdlQ2FjaGVzW3BDQUNIRUlORk9baV0ucFN0cmVhbV0pKQorICAgICAgICAgIC0+bV9kd1RpbWVDb3VudCA9IGk7CisgICAgfQorICAgIG1fblRpbWVDb3VudCA9IG5Db3VudDsKKyAgfQorICBpID0gMDsKKyAgd2hpbGUgKG5Db3VudCA+IDE1KSB7CisgICAgQ2xlYXJJbWFnZUNhY2hlKHBDQUNIRUlORk9baSsrXS5wU3RyZWFtKTsKKyAgICBuQ291bnQtLTsKKyAgfQorICB3aGlsZSAobV9uQ2FjaGVTaXplID4gKEZYX0RXT1JEKWR3TGltaXRDYWNoZVNpemUpIHsKKyAgICBDbGVhckltYWdlQ2FjaGUocENBQ0hFSU5GT1tpKytdLnBTdHJlYW0pOworICB9CisgIEZYX0ZyZWUocENBQ0hFSU5GTyk7Cit9Cit2b2lkIENQREZfUGFnZVJlbmRlckNhY2hlOjpDbGVhckltYWdlQ2FjaGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pIHsKKyAgdm9pZCogdmFsdWUgPSBtX0ltYWdlQ2FjaGVzLkdldFZhbHVlQXQocFN0cmVhbSk7CisgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CiAgICAgbV9JbWFnZUNhY2hlcy5SZW1vdmVLZXkocFN0cmVhbSk7CisgICAgcmV0dXJuOworICB9CisgIG1fbkNhY2hlU2l6ZSAtPSAoKENQREZfSW1hZ2VDYWNoZSopdmFsdWUpLT5Fc3RpbWF0ZVNpemUoKTsKKyAgZGVsZXRlIChDUERGX0ltYWdlQ2FjaGUqKXZhbHVlOworICBtX0ltYWdlQ2FjaGVzLlJlbW92ZUtleShwU3RyZWFtKTsKIH0KLUZYX0RXT1JEIENQREZfUGFnZVJlbmRlckNhY2hlOjpFc3RpbWF0ZVNpemUoKQotewotICAgIEZYX0RXT1JEIGR3U2l6ZSA9IDA7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9JbWFnZUNhY2hlcy5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICB2b2lkKiBrZXk7Ci0gICAgICAgIHZvaWQqIHZhbHVlOwotICAgICAgICBtX0ltYWdlQ2FjaGVzLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICBkd1NpemUgKz0gKChDUERGX0ltYWdlQ2FjaGUqKXZhbHVlKS0+RXN0aW1hdGVTaXplKCk7Ci0gICAgfQotICAgIG1fbkNhY2hlU2l6ZSA9IGR3U2l6ZTsKLSAgICByZXR1cm4gZHdTaXplOworRlhfRFdPUkQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkVzdGltYXRlU2l6ZSgpIHsKKyAgRlhfRFdPUkQgZHdTaXplID0gMDsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9JbWFnZUNhY2hlcy5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICB2b2lkKiBrZXk7CisgICAgdm9pZCogdmFsdWU7CisgICAgbV9JbWFnZUNhY2hlcy5HZXROZXh0QXNzb2MocG9zLCBrZXksIHZhbHVlKTsKKyAgICBkd1NpemUgKz0gKChDUERGX0ltYWdlQ2FjaGUqKXZhbHVlKS0+RXN0aW1hdGVTaXplKCk7CisgIH0KKyAgbV9uQ2FjaGVTaXplID0gZHdTaXplOworICByZXR1cm4gZHdTaXplOwogfQotRlhfRFdPUkQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkdldENhY2hlZFNpemUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pIGNvbnN0Ci17Ci0gICAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gbV9uQ2FjaGVTaXplOwotICAgIH0KLSAgICBDUERGX0ltYWdlQ2FjaGUqIHBJbWFnZUNhY2hlOwotICAgIGlmICghbV9JbWFnZUNhY2hlcy5Mb29rdXAocFN0cmVhbSwgKHZvaWQqJilwSW1hZ2VDYWNoZSkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBwSW1hZ2VDYWNoZS0+RXN0aW1hdGVTaXplKCk7CitGWF9EV09SRCBDUERGX1BhZ2VSZW5kZXJDYWNoZTo6R2V0Q2FjaGVkU2l6ZShDUERGX1N0cmVhbSogcFN0cmVhbSkgY29uc3QgeworICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIG1fbkNhY2hlU2l6ZTsKKyAgfQorICBDUERGX0ltYWdlQ2FjaGUqIHBJbWFnZUNhY2hlOworICBpZiAoIW1fSW1hZ2VDYWNoZXMuTG9va3VwKHBTdHJlYW0sICh2b2lkKiYpcEltYWdlQ2FjaGUpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHBJbWFnZUNhY2hlLT5Fc3RpbWF0ZVNpemUoKTsKIH0KLXZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkdldENhY2hlZEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgQ0ZYX0RJQlNvdXJjZSomIHBCaXRtYXAsIENGWF9ESUJTb3VyY2UqJiBwTWFzaywgRlhfRFdPUkQmIE1hdHRlQ29sb3IsCi0gICAgICAgIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAotICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KQotewotICAgIENQREZfSW1hZ2VDYWNoZSogcEltYWdlQ2FjaGU7Ci0gICAgRlhfQk9PTCBiRmluZCA9IG1fSW1hZ2VDYWNoZXMuTG9va3VwKHBTdHJlYW0sICh2b2lkKiYpcEltYWdlQ2FjaGUpOwotICAgIGlmICghYkZpbmQpIHsKLSAgICAgICAgcEltYWdlQ2FjaGUgPSBuZXcgQ1BERl9JbWFnZUNhY2hlKG1fcFBhZ2UtPm1fcERvY3VtZW50LCBwU3RyZWFtKTsKLSAgICB9Ci0gICAgbV9uVGltZUNvdW50ICsrOwotICAgIEZYX0JPT0wgYkNhY2hlZCA9IHBJbWFnZUNhY2hlLT5HZXRDYWNoZWRCaXRtYXAocEJpdG1hcCwgcE1hc2ssIE1hdHRlQ29sb3IsIG1fcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgZG93bnNhbXBsZVdpZHRoLCBkb3duc2FtcGxlSGVpZ2h0KTsKLSAgICBpZiAoIWJGaW5kKSB7Ci0gICAgICAgIG1fSW1hZ2VDYWNoZXMuU2V0QXQocFN0cmVhbSwgcEltYWdlQ2FjaGUpOwotICAgIH0KLSAgICBpZiAoIWJDYWNoZWQpIHsKLSAgICAgICAgbV9uQ2FjaGVTaXplICs9IHBJbWFnZUNhY2hlLT5Fc3RpbWF0ZVNpemUoKTsKLSAgICB9Cit2b2lkIENQREZfUGFnZVJlbmRlckNhY2hlOjpHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSomIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCkgeworICBDUERGX0ltYWdlQ2FjaGUqIHBJbWFnZUNhY2hlOworICBGWF9CT09MIGJGaW5kID0gbV9JbWFnZUNhY2hlcy5Mb29rdXAocFN0cmVhbSwgKHZvaWQqJilwSW1hZ2VDYWNoZSk7CisgIGlmICghYkZpbmQpIHsKKyAgICBwSW1hZ2VDYWNoZSA9IG5ldyBDUERGX0ltYWdlQ2FjaGUobV9wUGFnZS0+bV9wRG9jdW1lbnQsIHBTdHJlYW0pOworICB9CisgIG1fblRpbWVDb3VudCsrOworICBGWF9CT09MIGJDYWNoZWQgPSBwSW1hZ2VDYWNoZS0+R2V0Q2FjaGVkQml0bWFwKAorICAgICAgcEJpdG1hcCwgcE1hc2ssIE1hdHRlQ29sb3IsIG1fcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMsIGJTdGRDUywKKyAgICAgIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIGRvd25zYW1wbGVXaWR0aCwgZG93bnNhbXBsZUhlaWdodCk7CisgIGlmICghYkZpbmQpIHsKKyAgICBtX0ltYWdlQ2FjaGVzLlNldEF0KHBTdHJlYW0sIHBJbWFnZUNhY2hlKTsKKyAgfQorICBpZiAoIWJDYWNoZWQpIHsKKyAgICBtX25DYWNoZVNpemUgKz0gcEltYWdlQ2FjaGUtPkVzdGltYXRlU2l6ZSgpOworICB9CiB9Ci1GWF9CT09MCUNQREZfUGFnZVJlbmRlckNhY2hlOjpTdGFydEdldENhY2hlZEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpCi17Ci0gICAgbV9iQ3VyRmluZENhY2hlID0gbV9JbWFnZUNhY2hlcy5Mb29rdXAocFN0cmVhbSwgKHZvaWQqJiltX3BDdXJJbWFnZUNhY2hlKTsKLSAgICBpZiAoIW1fYkN1ckZpbmRDYWNoZSkgewotICAgICAgICBtX3BDdXJJbWFnZUNhY2hlID0gbmV3IENQREZfSW1hZ2VDYWNoZShtX3BQYWdlLT5tX3BEb2N1bWVudCwgcFN0cmVhbSk7Ci0gICAgfQotICAgIGludCByZXQgPSBtX3BDdXJJbWFnZUNhY2hlLT5TdGFydEdldENhY2hlZEJpdG1hcChwUmVuZGVyU3RhdHVzLT5tX3BGb3JtUmVzb3VyY2UsIG1fcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgZG93bnNhbXBsZVdpZHRoLCBkb3duc2FtcGxlSGVpZ2h0KTsKLSAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIG1fblRpbWVDb3VudCArKzsKLSAgICBpZiAoIW1fYkN1ckZpbmRDYWNoZSkgewotICAgICAgICBtX0ltYWdlQ2FjaGVzLlNldEF0KHBTdHJlYW0sIG1fcEN1ckltYWdlQ2FjaGUpOwotICAgIH0KLSAgICBpZiAoIXJldCkgewotICAgICAgICBtX25DYWNoZVNpemUgKz0gbV9wQ3VySW1hZ2VDYWNoZS0+RXN0aW1hdGVTaXplKCk7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OlN0YXJ0R2V0Q2FjaGVkQml0bWFwKAorICAgIENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgIEZYX0JPT0wgYlN0ZENTLAorICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LAorICAgIEZYX0JPT0wgYkxvYWRNYXNrLAorICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAorICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLAorICAgIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCkgeworICBtX2JDdXJGaW5kQ2FjaGUgPSBtX0ltYWdlQ2FjaGVzLkxvb2t1cChwU3RyZWFtLCAodm9pZComKW1fcEN1ckltYWdlQ2FjaGUpOworICBpZiAoIW1fYkN1ckZpbmRDYWNoZSkgeworICAgIG1fcEN1ckltYWdlQ2FjaGUgPSBuZXcgQ1BERl9JbWFnZUNhY2hlKG1fcFBhZ2UtPm1fcERvY3VtZW50LCBwU3RyZWFtKTsKKyAgfQorICBpbnQgcmV0ID0gbV9wQ3VySW1hZ2VDYWNoZS0+U3RhcnRHZXRDYWNoZWRCaXRtYXAoCisgICAgICBwUmVuZGVyU3RhdHVzLT5tX3BGb3JtUmVzb3VyY2UsIG1fcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMsIGJTdGRDUywKKyAgICAgIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIGRvd25zYW1wbGVXaWR0aCwgZG93bnNhbXBsZUhlaWdodCk7CisgIGlmIChyZXQgPT0gMikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIG1fblRpbWVDb3VudCsrOworICBpZiAoIW1fYkN1ckZpbmRDYWNoZSkgeworICAgIG1fSW1hZ2VDYWNoZXMuU2V0QXQocFN0cmVhbSwgbV9wQ3VySW1hZ2VDYWNoZSk7CisgIH0KKyAgaWYgKCFyZXQpIHsKKyAgICBtX25DYWNoZVNpemUgKz0gbV9wQ3VySW1hZ2VDYWNoZS0+RXN0aW1hdGVTaXplKCk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTAlDUERGX1BhZ2VSZW5kZXJDYWNoZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaW50IHJldCA9IG1fcEN1ckltYWdlQ2FjaGUtPkNvbnRpbnVlKHBQYXVzZSk7Ci0gICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX25UaW1lQ291bnQgKys7Ci0gICAgaWYgKCFtX2JDdXJGaW5kQ2FjaGUpIHsKLSAgICAgICAgbV9JbWFnZUNhY2hlcy5TZXRBdChtX3BDdXJJbWFnZUNhY2hlLT5HZXRTdHJlYW0oKSwgbV9wQ3VySW1hZ2VDYWNoZSk7Ci0gICAgfQotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIG1fbkNhY2hlU2l6ZSArPSBtX3BDdXJJbWFnZUNhY2hlLT5Fc3RpbWF0ZVNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGX1BhZ2VSZW5kZXJDYWNoZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaW50IHJldCA9IG1fcEN1ckltYWdlQ2FjaGUtPkNvbnRpbnVlKHBQYXVzZSk7CisgIGlmIChyZXQgPT0gMikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIG1fblRpbWVDb3VudCsrOworICBpZiAoIW1fYkN1ckZpbmRDYWNoZSkgeworICAgIG1fSW1hZ2VDYWNoZXMuU2V0QXQobV9wQ3VySW1hZ2VDYWNoZS0+R2V0U3RyZWFtKCksIG1fcEN1ckltYWdlQ2FjaGUpOworICB9CisgIGlmICghcmV0KSB7CisgICAgbV9uQ2FjaGVTaXplICs9IG1fcEN1ckltYWdlQ2FjaGUtPkVzdGltYXRlU2l6ZSgpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLXZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OlJlc2V0Qml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApCi17Ci0gICAgQ1BERl9JbWFnZUNhY2hlKiBwSW1hZ2VDYWNoZTsKLSAgICBpZiAoIW1fSW1hZ2VDYWNoZXMuTG9va3VwKHBTdHJlYW0sICh2b2lkKiYpcEltYWdlQ2FjaGUpKSB7Ci0gICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwSW1hZ2VDYWNoZSA9IG5ldyBDUERGX0ltYWdlQ2FjaGUobV9wUGFnZS0+bV9wRG9jdW1lbnQsIHBTdHJlYW0pOwotICAgICAgICBtX0ltYWdlQ2FjaGVzLlNldEF0KHBTdHJlYW0sIHBJbWFnZUNhY2hlKTsKK3ZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OlJlc2V0Qml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSB7CisgIENQREZfSW1hZ2VDYWNoZSogcEltYWdlQ2FjaGU7CisgIGlmICghbV9JbWFnZUNhY2hlcy5Mb29rdXAocFN0cmVhbSwgKHZvaWQqJilwSW1hZ2VDYWNoZSkpIHsKKyAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIGludCBvbGRzaXplID0gcEltYWdlQ2FjaGUtPkVzdGltYXRlU2l6ZSgpOwotICAgIHBJbWFnZUNhY2hlLT5SZXNldChwQml0bWFwKTsKLSAgICBtX25DYWNoZVNpemUgPSBwSW1hZ2VDYWNoZS0+RXN0aW1hdGVTaXplKCkgLSBvbGRzaXplOworICAgIHBJbWFnZUNhY2hlID0gbmV3IENQREZfSW1hZ2VDYWNoZShtX3BQYWdlLT5tX3BEb2N1bWVudCwgcFN0cmVhbSk7CisgICAgbV9JbWFnZUNhY2hlcy5TZXRBdChwU3RyZWFtLCBwSW1hZ2VDYWNoZSk7CisgIH0KKyAgaW50IG9sZHNpemUgPSBwSW1hZ2VDYWNoZS0+RXN0aW1hdGVTaXplKCk7CisgIHBJbWFnZUNhY2hlLT5SZXNldChwQml0bWFwKTsKKyAgbV9uQ2FjaGVTaXplID0gcEltYWdlQ2FjaGUtPkVzdGltYXRlU2l6ZSgpIC0gb2xkc2l6ZTsKIH0KIENQREZfSW1hZ2VDYWNoZTo6Q1BERl9JbWFnZUNhY2hlKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfU3RyZWFtKiBwU3RyZWFtKQotICAgIDogbV9kd1RpbWVDb3VudCgwKQotICAgICwgbV9wQ3VyQml0bWFwKE5VTEwpCi0gICAgLCBtX3BDdXJNYXNrKE5VTEwpCi0gICAgLCBtX01hdHRlQ29sb3IoMCkKLSAgICAsIG1fcFJlbmRlclN0YXR1cyhOVUxMKQotICAgICwgbV9wRG9jdW1lbnQocERvYykKLSAgICAsIG1fcFN0cmVhbShwU3RyZWFtKQotICAgICwgbV9wQ2FjaGVkQml0bWFwKE5VTEwpCi0gICAgLCBtX3BDYWNoZWRNYXNrKE5VTEwpCi0gICAgLCBtX2R3Q2FjaGVTaXplKDApCi17CisgICAgOiBtX2R3VGltZUNvdW50KDApLAorICAgICAgbV9wQ3VyQml0bWFwKE5VTEwpLAorICAgICAgbV9wQ3VyTWFzayhOVUxMKSwKKyAgICAgIG1fTWF0dGVDb2xvcigwKSwKKyAgICAgIG1fcFJlbmRlclN0YXR1cyhOVUxMKSwKKyAgICAgIG1fcERvY3VtZW50KHBEb2MpLAorICAgICAgbV9wU3RyZWFtKHBTdHJlYW0pLAorICAgICAgbV9wQ2FjaGVkQml0bWFwKE5VTEwpLAorICAgICAgbV9wQ2FjaGVkTWFzayhOVUxMKSwKKyAgICAgIG1fZHdDYWNoZVNpemUoMCkge30KK0NQREZfSW1hZ2VDYWNoZTo6fkNQREZfSW1hZ2VDYWNoZSgpIHsKKyAgZGVsZXRlIG1fcENhY2hlZEJpdG1hcDsKKyAgbV9wQ2FjaGVkQml0bWFwID0gTlVMTDsKKyAgZGVsZXRlIG1fcENhY2hlZE1hc2s7CisgIG1fcENhY2hlZE1hc2sgPSBOVUxMOwogfQotQ1BERl9JbWFnZUNhY2hlOjp+Q1BERl9JbWFnZUNhY2hlKCkKLXsKLSAgICBkZWxldGUgbV9wQ2FjaGVkQml0bWFwOwotICAgIG1fcENhY2hlZEJpdG1hcCA9IE5VTEw7Ci0gICAgZGVsZXRlIG1fcENhY2hlZE1hc2s7Ci0gICAgbV9wQ2FjaGVkTWFzayA9IE5VTEw7Cit2b2lkIENQREZfSW1hZ2VDYWNoZTo6UmVzZXQoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSB7CisgIGRlbGV0ZSBtX3BDYWNoZWRCaXRtYXA7CisgIG1fcENhY2hlZEJpdG1hcCA9IE5VTEw7CisgIGlmIChwQml0bWFwKSB7CisgICAgbV9wQ2FjaGVkQml0bWFwID0gcEJpdG1hcC0+Q2xvbmUoKTsKKyAgfQorICBDYWxjU2l6ZSgpOwogfQotdm9pZCBDUERGX0ltYWdlQ2FjaGU6OlJlc2V0KGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCkKLXsKLSAgICBkZWxldGUgbV9wQ2FjaGVkQml0bWFwOwotICAgIG1fcENhY2hlZEJpdG1hcCA9IE5VTEw7Ci0gICAgaWYgKHBCaXRtYXApIHsKLSAgICAgICAgbV9wQ2FjaGVkQml0bWFwID0gcEJpdG1hcC0+Q2xvbmUoKTsKLSAgICB9Ci0gICAgQ2FsY1NpemUoKTsKK3ZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkNsZWFySW1hZ2VEYXRhKCkgeworICBGWF9QT1NJVElPTiBwb3MgPSBtX0ltYWdlQ2FjaGVzLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIHZvaWQqIGtleTsKKyAgICB2b2lkKiB2YWx1ZTsKKyAgICBtX0ltYWdlQ2FjaGVzLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOworICAgICgoQ1BERl9JbWFnZUNhY2hlKil2YWx1ZSktPkNsZWFySW1hZ2VEYXRhKCk7CisgIH0KIH0KLXZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkNsZWFySW1hZ2VEYXRhKCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0ltYWdlQ2FjaGVzLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIHZvaWQqIGtleTsKLSAgICAgICAgdm9pZCogdmFsdWU7Ci0gICAgICAgIG1fSW1hZ2VDYWNoZXMuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgICgoQ1BERl9JbWFnZUNhY2hlKil2YWx1ZSktPkNsZWFySW1hZ2VEYXRhKCk7Ci0gICAgfQordm9pZCBDUERGX0ltYWdlQ2FjaGU6OkNsZWFySW1hZ2VEYXRhKCkgeworICBpZiAobV9wQ2FjaGVkQml0bWFwICYmIG1fcENhY2hlZEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgeworICAgICgoQ1BERl9ESUJTb3VyY2UqKW1fcENhY2hlZEJpdG1hcCktPkNsZWFySW1hZ2VEYXRhKCk7CisgIH0KIH0KLXZvaWQgQ1BERl9JbWFnZUNhY2hlOjpDbGVhckltYWdlRGF0YSgpCi17Ci0gICAgaWYgKG1fcENhY2hlZEJpdG1hcCAmJiBtX3BDYWNoZWRCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgKChDUERGX0RJQlNvdXJjZSopbV9wQ2FjaGVkQml0bWFwKS0+Q2xlYXJJbWFnZURhdGEoKTsKLSAgICB9CitzdGF0aWMgRlhfRFdPUkQgRlBERl9JbWFnZUNhY2hlX0VzdGltYXRlSW1hZ2VTaXplKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBESUIpIHsKKyAgcmV0dXJuIHBESUIgJiYgcERJQi0+R2V0QnVmZmVyKCkKKyAgICAgICAgICAgICA/IChGWF9EV09SRClwRElCLT5HZXRIZWlnaHQoKSAqIHBESUItPkdldFBpdGNoKCkgKworICAgICAgICAgICAgICAgICAgIChGWF9EV09SRClwRElCLT5HZXRQYWxldHRlU2l6ZSgpICogNAorICAgICAgICAgICAgIDogMDsKIH0KLXN0YXRpYyBGWF9EV09SRCBGUERGX0ltYWdlQ2FjaGVfRXN0aW1hdGVJbWFnZVNpemUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcERJQikKLXsKLSAgICByZXR1cm4gcERJQiAmJiBwRElCLT5HZXRCdWZmZXIoKSA/IChGWF9EV09SRClwRElCLT5HZXRIZWlnaHQoKSAqIHBESUItPkdldFBpdGNoKCkgKyAoRlhfRFdPUkQpcERJQi0+R2V0UGFsZXR0ZVNpemUoKSAqIDQgOiAwOwotfQotRlhfQk9PTCBDUERGX0ltYWdlQ2FjaGU6OkdldENhY2hlZEJpdG1hcChDRlhfRElCU291cmNlKiYgcEJpdG1hcCwgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLCBGWF9EV09SRCYgTWF0dGVDb2xvciwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCi0gICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpCi17Ci0gICAgaWYgKG1fcENhY2hlZEJpdG1hcCkgewotICAgICAgICBwQml0bWFwID0gbV9wQ2FjaGVkQml0bWFwOwotICAgICAgICBwTWFzayA9IG1fcENhY2hlZE1hc2s7Ci0gICAgICAgIE1hdHRlQ29sb3IgPSBtX01hdHRlQ29sb3I7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoIXBSZW5kZXJTdGF0dXMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX1JlbmRlckNvbnRleHQqcENvbnRleHQgPSBwUmVuZGVyU3RhdHVzLT5HZXRDb250ZXh0KCk7Ci0gICAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBQYWdlUmVuZGVyQ2FjaGUgPSBwQ29udGV4dC0+bV9wUGFnZUNhY2hlOwotICAgIG1fZHdUaW1lQ291bnQgPSBwUGFnZVJlbmRlckNhY2hlLT5HZXRUaW1lQ291bnQoKTsKLSAgICBDUERGX0RJQlNvdXJjZSogcFNyYyA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBDUERGX0RJQlNvdXJjZSogcE1hc2tTcmMgPSBOVUxMOwotICAgIGlmICghcFNyYy0+TG9hZChtX3BEb2N1bWVudCwgbV9wU3RyZWFtLCAmcE1hc2tTcmMsICZNYXR0ZUNvbG9yLCBwUmVuZGVyU3RhdHVzLT5tX3BGb3JtUmVzb3VyY2UsIHBQYWdlUmVzb3VyY2VzLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spKSB7Ci0gICAgICAgIGRlbGV0ZSBwU3JjOwotICAgICAgICBwQml0bWFwID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX01hdHRlQ29sb3IgPSBNYXR0ZUNvbG9yOwotICAgIGlmIChwU3JjLT5HZXRQaXRjaCgpICogcFNyYy0+R2V0SGVpZ2h0KCkgPCBGUERGX0hVR0VfSU1BR0VfU0laRSkgewotICAgICAgICBtX3BDYWNoZWRCaXRtYXAgPSBwU3JjLT5DbG9uZSgpOwotICAgICAgICBkZWxldGUgcFNyYzsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BDYWNoZWRCaXRtYXAgPSBwU3JjOwotICAgIH0KLSAgICBpZiAocE1hc2tTcmMpIHsKLSAgICAgICAgbV9wQ2FjaGVkTWFzayA9IHBNYXNrU3JjLT5DbG9uZSgpOwotICAgICAgICBkZWxldGUgcE1hc2tTcmM7Ci0gICAgfQotCitGWF9CT09MIENQREZfSW1hZ2VDYWNoZTo6R2V0Q2FjaGVkQml0bWFwKENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCU291cmNlKiYgcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCkgeworICBpZiAobV9wQ2FjaGVkQml0bWFwKSB7CiAgICAgcEJpdG1hcCA9IG1fcENhY2hlZEJpdG1hcDsKICAgICBwTWFzayA9IG1fcENhY2hlZE1hc2s7Ci0gICAgQ2FsY1NpemUoKTsKKyAgICBNYXR0ZUNvbG9yID0gbV9NYXR0ZUNvbG9yOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghcFJlbmRlclN0YXR1cykgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gcFJlbmRlclN0YXR1cy0+R2V0Q29udGV4dCgpOworICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcFBhZ2VSZW5kZXJDYWNoZSA9IHBDb250ZXh0LT5tX3BQYWdlQ2FjaGU7CisgIG1fZHdUaW1lQ291bnQgPSBwUGFnZVJlbmRlckNhY2hlLT5HZXRUaW1lQ291bnQoKTsKKyAgQ1BERl9ESUJTb3VyY2UqIHBTcmMgPSBuZXcgQ1BERl9ESUJTb3VyY2U7CisgIENQREZfRElCU291cmNlKiBwTWFza1NyYyA9IE5VTEw7CisgIGlmICghcFNyYy0+TG9hZChtX3BEb2N1bWVudCwgbV9wU3RyZWFtLCAmcE1hc2tTcmMsICZNYXR0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgcFJlbmRlclN0YXR1cy0+bV9wRm9ybVJlc291cmNlLCBwUGFnZVJlc291cmNlcywgYlN0ZENTLAorICAgICAgICAgICAgICAgICAgR3JvdXBGYW1pbHksIGJMb2FkTWFzaykpIHsKKyAgICBkZWxldGUgcFNyYzsKKyAgICBwQml0bWFwID0gTlVMTDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9NYXR0ZUNvbG9yID0gTWF0dGVDb2xvcjsKKyAgaWYgKHBTcmMtPkdldFBpdGNoKCkgKiBwU3JjLT5HZXRIZWlnaHQoKSA8IEZQREZfSFVHRV9JTUFHRV9TSVpFKSB7CisgICAgbV9wQ2FjaGVkQml0bWFwID0gcFNyYy0+Q2xvbmUoKTsKKyAgICBkZWxldGUgcFNyYzsKKyAgfSBlbHNlIHsKKyAgICBtX3BDYWNoZWRCaXRtYXAgPSBwU3JjOworICB9CisgIGlmIChwTWFza1NyYykgeworICAgIG1fcENhY2hlZE1hc2sgPSBwTWFza1NyYy0+Q2xvbmUoKTsKKyAgICBkZWxldGUgcE1hc2tTcmM7CisgIH0KKworICBwQml0bWFwID0gbV9wQ2FjaGVkQml0bWFwOworICBwTWFzayA9IG1fcENhY2hlZE1hc2s7CisgIENhbGNTaXplKCk7CisgIHJldHVybiBGQUxTRTsKIH0KLUNGWF9ESUJTb3VyY2UqIENQREZfSW1hZ2VDYWNoZTo6RGV0YWNoQml0bWFwKCkKLXsKLSAgICBDRlhfRElCU291cmNlKiBwRElCU291cmNlID0gbV9wQ3VyQml0bWFwOwotICAgIG1fcEN1ckJpdG1hcCA9IE5VTEw7Ci0gICAgcmV0dXJuIHBESUJTb3VyY2U7CitDRlhfRElCU291cmNlKiBDUERGX0ltYWdlQ2FjaGU6OkRldGFjaEJpdG1hcCgpIHsKKyAgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSA9IG1fcEN1ckJpdG1hcDsKKyAgbV9wQ3VyQml0bWFwID0gTlVMTDsKKyAgcmV0dXJuIHBESUJTb3VyY2U7CiB9Ci1DRlhfRElCU291cmNlKiBDUERGX0ltYWdlQ2FjaGU6OkRldGFjaE1hc2soKQotewotICAgIENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UgPSBtX3BDdXJNYXNrOwotICAgIG1fcEN1ck1hc2sgPSBOVUxMOwotICAgIHJldHVybiBwRElCU291cmNlOworQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZUNhY2hlOjpEZXRhY2hNYXNrKCkgeworICBDRlhfRElCU291cmNlKiBwRElCU291cmNlID0gbV9wQ3VyTWFzazsKKyAgbV9wQ3VyTWFzayA9IE5VTEw7CisgIHJldHVybiBwRElCU291cmNlOwogfQotaW50CUNQREZfSW1hZ2VDYWNoZTo6U3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywgRlhfQk9PTCBiU3RkQ1MsCi0gICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCi0gICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpCi17Ci0gICAgaWYgKG1fcENhY2hlZEJpdG1hcCkgewotICAgICAgICBtX3BDdXJCaXRtYXAgPSBtX3BDYWNoZWRCaXRtYXA7Ci0gICAgICAgIG1fcEN1ck1hc2sgPSBtX3BDYWNoZWRNYXNrOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKCFwUmVuZGVyU3RhdHVzKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBtX3BSZW5kZXJTdGF0dXMgPSBwUmVuZGVyU3RhdHVzOwotICAgIG1fcEN1ckJpdG1hcCA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wQ3VyQml0bWFwKS0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIFRSVUUsIHBGb3JtUmVzb3VyY2VzLCBwUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKLSAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgZGVsZXRlIG1fcEN1ckJpdG1hcDsKLSAgICAgICAgbV9wQ3VyQml0bWFwID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENvbnRpbnVlR2V0Q2FjaGVkQml0bWFwKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci1pbnQgQ1BERl9JbWFnZUNhY2hlOjpDb250aW51ZUdldENhY2hlZEJpdG1hcCgpCi17Ci0gICAgbV9NYXR0ZUNvbG9yID0gKChDUERGX0RJQlNvdXJjZSopbV9wQ3VyQml0bWFwKS0+bV9NYXR0ZUNvbG9yOwotICAgIG1fcEN1ck1hc2sgPSAoKENQREZfRElCU291cmNlKiltX3BDdXJCaXRtYXApLT5EZXRhY2hNYXNrKCk7Ci0gICAgQ1BERl9SZW5kZXJDb250ZXh0KnBDb250ZXh0ID0gbV9wUmVuZGVyU3RhdHVzLT5HZXRDb250ZXh0KCk7Ci0gICAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBQYWdlUmVuZGVyQ2FjaGUgPSBwQ29udGV4dC0+bV9wUGFnZUNhY2hlOwotICAgIG1fZHdUaW1lQ291bnQgPSBwUGFnZVJlbmRlckNhY2hlLT5HZXRUaW1lQ291bnQoKTsKLSAgICBpZiAobV9wQ3VyQml0bWFwLT5HZXRQaXRjaCgpICogbV9wQ3VyQml0bWFwLT5HZXRIZWlnaHQoKSA8IEZQREZfSFVHRV9JTUFHRV9TSVpFKSB7Ci0gICAgICAgIG1fcENhY2hlZEJpdG1hcCA9IG1fcEN1ckJpdG1hcC0+Q2xvbmUoKTsKLSAgICAgICAgZGVsZXRlIG1fcEN1ckJpdG1hcDsKLSAgICAgICAgbV9wQ3VyQml0bWFwID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BDYWNoZWRCaXRtYXAgPSBtX3BDdXJCaXRtYXA7Ci0gICAgfQotICAgIGlmIChtX3BDdXJNYXNrKSB7Ci0gICAgICAgIG1fcENhY2hlZE1hc2sgPSBtX3BDdXJNYXNrLT5DbG9uZSgpOwotICAgICAgICBkZWxldGUgbV9wQ3VyTWFzazsKLSAgICAgICAgbV9wQ3VyTWFzayA9IE5VTEw7Ci0gICAgfQoraW50IENQREZfSW1hZ2VDYWNoZTo6U3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KSB7CisgIGlmIChtX3BDYWNoZWRCaXRtYXApIHsKICAgICBtX3BDdXJCaXRtYXAgPSBtX3BDYWNoZWRCaXRtYXA7CiAgICAgbV9wQ3VyTWFzayA9IG1fcENhY2hlZE1hc2s7Ci0gICAgQ2FsY1NpemUoKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIXBSZW5kZXJTdGF0dXMpIHsKICAgICByZXR1cm4gMDsKLX0KLWludAlDUERGX0ltYWdlQ2FjaGU6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGludCByZXQgPSAoKENQREZfRElCU291cmNlKiltX3BDdXJCaXRtYXApLT5Db250aW51ZUxvYWRESUJTb3VyY2UocFBhdXNlKTsKLSAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgZGVsZXRlIG1fcEN1ckJpdG1hcDsKLSAgICAgICAgbV9wQ3VyQml0bWFwID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENvbnRpbnVlR2V0Q2FjaGVkQml0bWFwKCk7CisgIH0KKyAgbV9wUmVuZGVyU3RhdHVzID0gcFJlbmRlclN0YXR1czsKKyAgbV9wQ3VyQml0bWFwID0gbmV3IENQREZfRElCU291cmNlOworICBpbnQgcmV0ID0KKyAgICAgICgoQ1BERl9ESUJTb3VyY2UqKW1fcEN1ckJpdG1hcCkKKyAgICAgICAgICAtPlN0YXJ0TG9hZERJQlNvdXJjZShtX3BEb2N1bWVudCwgbV9wU3RyZWFtLCBUUlVFLCBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKKyAgaWYgKHJldCA9PSAyKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZiAoIXJldCkgeworICAgIGRlbGV0ZSBtX3BDdXJCaXRtYXA7CisgICAgbV9wQ3VyQml0bWFwID0gTlVMTDsKICAgICByZXR1cm4gMDsKKyAgfQorICBDb250aW51ZUdldENhY2hlZEJpdG1hcCgpOworICByZXR1cm4gMDsKIH0KLXZvaWQgQ1BERl9JbWFnZUNhY2hlOjpDYWxjU2l6ZSgpCi17Ci0gICAgbV9kd0NhY2hlU2l6ZSA9IEZQREZfSW1hZ2VDYWNoZV9Fc3RpbWF0ZUltYWdlU2l6ZShtX3BDYWNoZWRCaXRtYXApICsgRlBERl9JbWFnZUNhY2hlX0VzdGltYXRlSW1hZ2VTaXplKG1fcENhY2hlZE1hc2spOworaW50IENQREZfSW1hZ2VDYWNoZTo6Q29udGludWVHZXRDYWNoZWRCaXRtYXAoKSB7CisgIG1fTWF0dGVDb2xvciA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcEN1ckJpdG1hcCktPm1fTWF0dGVDb2xvcjsKKyAgbV9wQ3VyTWFzayA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcEN1ckJpdG1hcCktPkRldGFjaE1hc2soKTsKKyAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IG1fcFJlbmRlclN0YXR1cy0+R2V0Q29udGV4dCgpOworICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcFBhZ2VSZW5kZXJDYWNoZSA9IHBDb250ZXh0LT5tX3BQYWdlQ2FjaGU7CisgIG1fZHdUaW1lQ291bnQgPSBwUGFnZVJlbmRlckNhY2hlLT5HZXRUaW1lQ291bnQoKTsKKyAgaWYgKG1fcEN1ckJpdG1hcC0+R2V0UGl0Y2goKSAqIG1fcEN1ckJpdG1hcC0+R2V0SGVpZ2h0KCkgPAorICAgICAgRlBERl9IVUdFX0lNQUdFX1NJWkUpIHsKKyAgICBtX3BDYWNoZWRCaXRtYXAgPSBtX3BDdXJCaXRtYXAtPkNsb25lKCk7CisgICAgZGVsZXRlIG1fcEN1ckJpdG1hcDsKKyAgICBtX3BDdXJCaXRtYXAgPSBOVUxMOworICB9IGVsc2UgeworICAgIG1fcENhY2hlZEJpdG1hcCA9IG1fcEN1ckJpdG1hcDsKKyAgfQorICBpZiAobV9wQ3VyTWFzaykgeworICAgIG1fcENhY2hlZE1hc2sgPSBtX3BDdXJNYXNrLT5DbG9uZSgpOworICAgIGRlbGV0ZSBtX3BDdXJNYXNrOworICAgIG1fcEN1ck1hc2sgPSBOVUxMOworICB9CisgIG1fcEN1ckJpdG1hcCA9IG1fcENhY2hlZEJpdG1hcDsKKyAgbV9wQ3VyTWFzayA9IG1fcENhY2hlZE1hc2s7CisgIENhbGNTaXplKCk7CisgIHJldHVybiAwOwogfQotdm9pZCBDUERGX0RvY3VtZW50OjpDbGVhclJlbmRlckZvbnQoKQotewotICAgIGlmIChtX3BEb2NSZW5kZXIpIHsKLSAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlID0gbV9wRG9jUmVuZGVyLT5HZXRGb250Q2FjaGUoKTsKLSAgICAgICAgaWYgKHBDYWNoZSkgewotICAgICAgICAgICAgcENhY2hlLT5GcmVlQ2FjaGUoRkFMU0UpOwotICAgICAgICB9CitpbnQgQ1BERl9JbWFnZUNhY2hlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wQ3VyQml0bWFwKS0+Q29udGludWVMb2FkRElCU291cmNlKHBQYXVzZSk7CisgIGlmIChyZXQgPT0gMikgeworICAgIHJldHVybiByZXQ7CisgIH0KKyAgaWYgKCFyZXQpIHsKKyAgICBkZWxldGUgbV9wQ3VyQml0bWFwOworICAgIG1fcEN1ckJpdG1hcCA9IE5VTEw7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ29udGludWVHZXRDYWNoZWRCaXRtYXAoKTsKKyAgcmV0dXJuIDA7Cit9Cit2b2lkIENQREZfSW1hZ2VDYWNoZTo6Q2FsY1NpemUoKSB7CisgIG1fZHdDYWNoZVNpemUgPSBGUERGX0ltYWdlQ2FjaGVfRXN0aW1hdGVJbWFnZVNpemUobV9wQ2FjaGVkQml0bWFwKSArCisgICAgICAgICAgICAgICAgICBGUERGX0ltYWdlQ2FjaGVfRXN0aW1hdGVJbWFnZVNpemUobV9wQ2FjaGVkTWFzayk7Cit9Cit2b2lkIENQREZfRG9jdW1lbnQ6OkNsZWFyUmVuZGVyRm9udCgpIHsKKyAgaWYgKG1fcERvY1JlbmRlcikgeworICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSA9IG1fcERvY1JlbmRlci0+R2V0Rm9udENhY2hlKCk7CisgICAgaWYgKHBDYWNoZSkgeworICAgICAgcENhY2hlLT5GcmVlQ2FjaGUoRkFMU0UpOwogICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9pbWFnZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2ltYWdlLmNwcAppbmRleCBmYTkzMjVhLi45ODdmZmQ4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2ltYWdlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2ltYWdlLmNwcApAQCAtMTMsMTA2OSArMTMsMTE2MCBAQAogI2luY2x1ZGUgIi4uL2ZwZGZfcGFnZS9wYWdlaW50LmgiCiAjaW5jbHVkZSAicmVuZGVyX2ludC5oIgogCi1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzSW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBDUERGX0ltYWdlUmVuZGVyZXIgcmVuZGVyOwotICAgIGlmIChyZW5kZXIuU3RhcnQodGhpcywgcEltYWdlT2JqLCBwT2JqMkRldmljZSwgbV9iU3RkQ1MsIG1fY3VyQmxlbmQpKSB7Ci0gICAgICAgIHJlbmRlci5Db250aW51ZShOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlbmRlci5tX1Jlc3VsdDsKK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NJbWFnZShDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpIHsKKyAgQ1BERl9JbWFnZVJlbmRlcmVyIHJlbmRlcjsKKyAgaWYgKHJlbmRlci5TdGFydCh0aGlzLCBwSW1hZ2VPYmosIHBPYmoyRGV2aWNlLCBtX2JTdGRDUywgbV9jdXJCbGVuZCkpIHsKKyAgICByZW5kZXIuQ29udGludWUoTlVMTCk7CisgIH0KKyAgcmV0dXJuIHJlbmRlci5tX1Jlc3VsdDsKIH0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkNvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfQVJHQiBtYXNrX2FyZ2IsCi0gICAgICAgIGludCBiaXRtYXBfYWxwaGEsIGludCBibGVuZF9tb2RlLCBpbnQgVHJhbnNwYXJlbmN5KQotewotICAgIGlmIChwRElCaXRtYXAgPT0gTlVMTCkgewordm9pZCBDUERGX1JlbmRlclN0YXR1czo6Q29tcG9zaXRlRElCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIG1hc2tfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBUcmFuc3BhcmVuY3kpIHsKKyAgaWYgKHBESUJpdG1hcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0JPT0wgYklzb2xhdGVkID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQ7CisgIEZYX0JPT0wgYkdyb3VwID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVA7CisgIGlmIChibGVuZF9tb2RlID09IEZYRElCX0JMRU5EX05PUk1BTCkgeworICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1KSB7CisgICAgICAgIHBESUJpdG1hcC0+TXVsdGlwbHlBbHBoYShiaXRtYXBfYWxwaGEpOworICAgICAgfQorICAgICAgaWYgKG1fcERldmljZS0+U2V0RElCaXRzKHBESUJpdG1hcCwgbGVmdCwgdG9wKSkgewogICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0JPT0wgYklzb2xhdGVkID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQ7Ci0gICAgRlhfQk9PTCBiR3JvdXAgPSBUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19HUk9VUDsKLSAgICBpZiAoYmxlbmRfbW9kZSA9PSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgaWYgKCFwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgICAgICAgICBwRElCaXRtYXAtPk11bHRpcGx5QWxwaGEoYml0bWFwX2FscGhhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPlNldERJQml0cyhwRElCaXRtYXAsIGxlZnQsIHRvcCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWF9EV09SRCBmaWxsX2FyZ2IgPSBtX09wdGlvbnMuVHJhbnNsYXRlQ29sb3IobWFza19hcmdiKTsKLSAgICAgICAgICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgICAgICAgICAoKHVpbnQ4X3QqKSZmaWxsX2FyZ2IpWzNdID0gKCh1aW50OF90KikmZmlsbF9hcmdiKVszXSAqIGJpdG1hcF9hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPlNldEJpdE1hc2socERJQml0bWFwLCBsZWZ0LCB0b3AsIGZpbGxfYXJnYikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfQk9PTCBiQmFja0FscGhhUmVxdWlyZWQgPSBibGVuZF9tb2RlICYmIGJJc29sYXRlZCAmJiAhbV9iRHJvcE9iamVjdHM7Ci0gICAgRlhfQk9PTCBiR2V0QmFja0dyb3VuZCA9ICgobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX09VVFBVVCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICghKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpICYmIChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgRlhSQ19HRVRfQklUUykgJiYgIWJCYWNrQWxwaGFSZXF1aXJlZCk7Ci0gICAgaWYgKGJHZXRCYWNrR3JvdW5kKSB7Ci0gICAgICAgIGlmIChiSXNvbGF0ZWQgfHwgIWJHcm91cCkgewotICAgICAgICAgICAgaWYgKHBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcERldmljZS0+U2V0RElCaXRzKHBESUJpdG1hcCwgbGVmdCwgdG9wLCBibGVuZF9tb2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwRElCaXRtYXAtPkdldFdpZHRoKCksIHRvcCArIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgcmVjdC5JbnRlcnNlY3QobV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOwotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmUgPSBOVUxMOwotICAgICAgICAgICAgRlhfQk9PTCBiQ2xvbmUgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCkgJiYgbV9wRGV2aWNlLT5HZXRCaXRtYXAoKSkgewotICAgICAgICAgICAgICAgIGJDbG9uZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgcENsb25lID0gbV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpLT5DbG9uZSgmcmVjdCk7Ci0gICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwICpwRm9yZUJpdG1hcCA9IG1fcERldmljZS0+R2V0Qml0bWFwKCk7Ci0gICAgICAgICAgICAgICAgcENsb25lLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLCBwRm9yZUJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgPj0gMCA/IDAgOiBsZWZ0OwotICAgICAgICAgICAgICAgIHRvcCA9IHRvcCA+PSAwID8gMCA6IHRvcDsKLSAgICAgICAgICAgICAgICBpZiAoIXBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkKLSAgICAgICAgICAgICAgICAgICAgcENsb25lLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLCBwRElCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsIHRvcCwgYmxlbmRfbW9kZSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwQ2xvbmUtPkNvbXBvc2l0ZU1hc2soMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLCBwRElCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX2FyZ2IsIGxlZnQsIHRvcCwgYmxlbmRfbW9kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBDbG9uZSA9IHBESUJpdG1hcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCkpIHsKLSAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwQ2xvbmUsIHJlY3QubGVmdCwgcmVjdC50b3ApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocERJQml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wLCBibGVuZF9tb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiQ2xvbmUpIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgcENsb25lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGJhY2tfbGVmdCwgYmFja190b3A7Ci0gICAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHBESUJpdG1hcC0+R2V0V2lkdGgoKSwgdG9wICsgcERJQml0bWFwLT5HZXRIZWlnaHQoKSk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwQmFja2Ryb3AgPSBHZXRCYWNrZHJvcChtX3BDdXJPYmosIHJlY3QsIGJhY2tfbGVmdCwgYmFja190b3AsIGJsZW5kX21vZGUgPiBGWERJQl9CTEVORF9OT1JNQUwgJiYgYklzb2xhdGVkKTsKLSAgICBpZiAoIXBCYWNrZHJvcCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKQotICAgICAgICBwQmFja2Ryb3AtPkNvbXBvc2l0ZUJpdG1hcChsZWZ0IC0gYmFja19sZWZ0LCB0b3AgLSBiYWNrX3RvcCwgcERJQml0bWFwLT5HZXRXaWR0aCgpLCBwRElCaXRtYXAtPkdldEhlaWdodCgpLCBwRElCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGJsZW5kX21vZGUpOwotICAgIGVsc2UKLSAgICAgICAgcEJhY2tkcm9wLT5Db21wb3NpdGVNYXNrKGxlZnQgLSBiYWNrX2xlZnQsIHRvcCAtIGJhY2tfdG9wLCBwRElCaXRtYXAtPkdldFdpZHRoKCksIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCksIHBESUJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfYXJnYiwgMCwgMCwgYmxlbmRfbW9kZSk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwQmFja2Ryb3AxID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICBwQmFja2Ryb3AxLT5DcmVhdGUocEJhY2tkcm9wLT5HZXRXaWR0aCgpLCBwQmFja2Ryb3AtPkdldEhlaWdodCgpLCBGWERJQl9SZ2IzMik7Ci0gICAgcEJhY2tkcm9wMS0+Q2xlYXIoKEZYX0RXT1JEKSAtIDEpOwotICAgIHBCYWNrZHJvcDEtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBwQmFja2Ryb3AtPkdldFdpZHRoKCksIHBCYWNrZHJvcC0+R2V0SGVpZ2h0KCksIHBCYWNrZHJvcCwgMCwgMCk7Ci0gICAgZGVsZXRlIHBCYWNrZHJvcDsKLSAgICBwQmFja2Ryb3AgPSBwQmFja2Ryb3AxOwotICAgIG1fcERldmljZS0+U2V0RElCaXRzKHBCYWNrZHJvcCwgYmFja19sZWZ0LCBiYWNrX3RvcCk7Ci0gICAgZGVsZXRlIHBCYWNrZHJvcDsKLX0KLUZYX0NPTE9SUkVGIENQREZfVHJhbnNmZXJGdW5jOjpUcmFuc2xhdGVDb2xvcihGWF9DT0xPUlJFRiByZ2IpCi17Ci0gICAgcmV0dXJuIEZYU1lTX1JHQihtX1NhbXBsZXNbRlhTWVNfR2V0UlZhbHVlKHJnYildLCBtX1NhbXBsZXNbMjU2ICsgRlhTWVNfR2V0R1ZhbHVlKHJnYildLAotICAgICAgICAgICAgICAgICAgICAgbV9TYW1wbGVzWzUxMiArIEZYU1lTX0dldEJWYWx1ZShyZ2IpXSk7Ci19Ci1DRlhfRElCU291cmNlKiBDUERGX1RyYW5zZmVyRnVuYzo6VHJhbnNsYXRlSW1hZ2UoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgRlhfQk9PTCBiQXV0b0Ryb3BTcmMpCi17Ci0gICAgQ1BERl9ESUJUcmFuc2ZlckZ1bmMqIHBEZXN0ID0gbmV3IENQREZfRElCVHJhbnNmZXJGdW5jKHRoaXMpOwotICAgIHBEZXN0LT5Mb2FkU3JjKHBTcmMsIGJBdXRvRHJvcFNyYyk7Ci0gICAgcmV0dXJuIHBEZXN0OwotfQotRlhESUJfRm9ybWF0IENQREZfRElCVHJhbnNmZXJGdW5jOjpHZXREZXN0Rm9ybWF0KCkKLXsKLSAgICBpZiAobV9wU3JjLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIHJldHVybiBGWERJQl84YnBwTWFzazsKLSAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgcmV0dXJuIChtX3BTcmMtPkhhc0FscGhhKCkpID8gRlhESUJfQXJnYiA6IEZYRElCX1JnYjMyOwotI2Vsc2UKLSAgICByZXR1cm4gKG1fcFNyYy0+SGFzQWxwaGEoKSkgPyBGWERJQl9BcmdiIDogRlhESUJfUmdiOwotI2VuZGlmCi19Ci1DUERGX0RJQlRyYW5zZmVyRnVuYzo6Q1BERl9ESUJUcmFuc2ZlckZ1bmMoY29uc3QgQ1BERl9UcmFuc2ZlckZ1bmMqIHBUcmFuc2ZlckZ1bmMpCi17Ci0gICAgbV9SYW1wUiA9IHBUcmFuc2ZlckZ1bmMtPm1fU2FtcGxlczsKLSAgICBtX1JhbXBHID0gJnBUcmFuc2ZlckZ1bmMtPm1fU2FtcGxlc1syNTZdOwotICAgIG1fUmFtcEIgPSAmcFRyYW5zZmVyRnVuYy0+bV9TYW1wbGVzWzUxMl07Ci19Ci12b2lkIENQREZfRElCVHJhbnNmZXJGdW5jOjpUcmFuc2xhdGVTY2FubGluZSh1aW50OF90KiBkZXN0X2J1ZiwgY29uc3QgdWludDhfdCogc3JjX2J1ZikgY29uc3QKLXsKLSAgICBpbnQgaTsKLSAgICBGWF9CT09MIGJTa2lwID0gRkFMU0U7Ci0gICAgc3dpdGNoIChtX3BTcmMtPkdldEZvcm1hdCgpKSB7Ci0gICAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjogewotICAgICAgICAgICAgICAgIGludCByMCA9IG1fUmFtcFJbMF0sIGcwID0gbV9SYW1wR1swXSwgYjAgPSBtX1JhbXBCWzBdOwotICAgICAgICAgICAgICAgIGludCByMSA9IG1fUmFtcFJbMjU1XSwgZzEgPSBtX1JhbXBHWzI1NV0sIGIxID0gbV9SYW1wQlsyNTVdOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX1dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYnVmW2kgLyA4XSAmICgxIDw8ICg3IC0gaSAlIDgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBiMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gZzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IHIxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBiMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gZzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IHIwOwotICAgICAgICAgICAgICAgICAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmKys7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6IHsKLSAgICAgICAgICAgICAgICBpbnQgbTAgPSBtX1JhbXBSWzBdLCBtMSA9IG1fUmFtcFJbMjU1XTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9XaWR0aDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2J1ZltpIC8gOF0gJiAoMSA8PCAoNyAtIGkgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbTE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG0wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKLSAgICAgICAgICAgICAgICBGWF9BUkdCKiBwUGFsID0gbV9wU3JjLT5HZXRQYWxldHRlKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fV2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBQYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0Igc3JjX2FyZ2IgPSBwUGFsWypzcmNfYnVmXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wQltGWEFSR0JfUihzcmNfYXJnYildOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBHW0ZYQVJHQl9HKHNyY19hcmdiKV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbRlhBUkdCX0Ioc3JjX2FyZ2IpXTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19ieXRlID0gKnNyY19idWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbc3JjX2J5dGVdOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBHW3NyY19ieXRlXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wUltzcmNfYnl0ZV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3JjX2J1ZiArKzsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgICAgICAgICAgICAgZGVzdF9idWYrKzsKLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX1dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9SZ2I6Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9XaWR0aDsgaSArKykgewotICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wQlsqKHNyY19idWYrKyldOwotICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wR1sqKHNyY19idWYrKyldOwotICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wUlsqKHNyY19idWYrKyldOwotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICAgICAgICAgIGRlc3RfYnVmKys7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX1JnYjMyOgotICAgICAgICAgICAgYlNraXAgPSBUUlVFOwotICAgICAgICBjYXNlIEZYRElCX0FyZ2I6Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9XaWR0aDsgaSArKykgewotICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wQlsqKHNyY19idWYrKyldOwotICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wR1sqKHNyY19idWYrKyldOwotICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wUlsqKHNyY19idWYrKyldOwotICAgICAgICAgICAgICAgIGlmICghYlNraXApIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSAqc3JjX2J1ZjsKLSAgICAgICAgICAgICAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmKys7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgc3JjX2J1ZiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotdm9pZCBDUERGX0RJQlRyYW5zZmVyRnVuYzo6VHJhbnNsYXRlRG93blNhbXBsZXModWludDhfdCogZGVzdF9idWYsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBwaXhlbHMsIGludCBCcHApIGNvbnN0Ci17Ci0gICAgaWYgKEJwcCA9PSA4KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpICsrKSB7Ci0gICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbKihzcmNfYnVmKyspXTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoQnBwID09IDI0KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpICsrKSB7Ci0gICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wR1sqKHNyY19idWYrKyldOwotICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07Ci0gICAgICAgIH0KKyAgICAgIH0KICAgICB9IGVsc2UgewotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICBpZiAoIW1fcFNyYy0+SGFzQWxwaGEoKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEdbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICAgICBkZXN0X2J1ZisrOwotICAgICAgICAgICAgICAgIHNyY19idWYrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCisgICAgICBGWF9EV09SRCBmaWxsX2FyZ2IgPSBtX09wdGlvbnMuVHJhbnNsYXRlQ29sb3IobWFza19hcmdiKTsKKyAgICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpIHsKKyAgICAgICAgKCh1aW50OF90KikmZmlsbF9hcmdiKVszXSA9CisgICAgICAgICAgICAoKHVpbnQ4X3QqKSZmaWxsX2FyZ2IpWzNdICogYml0bWFwX2FscGhhIC8gMjU1OworICAgICAgfQorICAgICAgaWYgKG1fcERldmljZS0+U2V0Qml0TWFzayhwRElCaXRtYXAsIGxlZnQsIHRvcCwgZmlsbF9hcmdiKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisgIEZYX0JPT0wgYkJhY2tBbHBoYVJlcXVpcmVkID0gYmxlbmRfbW9kZSAmJiBiSXNvbGF0ZWQgJiYgIW1fYkRyb3BPYmplY3RzOworICBGWF9CT09MIGJHZXRCYWNrR3JvdW5kID0KKyAgICAgICgobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX09VVFBVVCkpIHx8CisgICAgICAoIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKSAmJgorICAgICAgIChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfR0VUX0JJVFMpICYmICFiQmFja0FscGhhUmVxdWlyZWQpOworICBpZiAoYkdldEJhY2tHcm91bmQpIHsKKyAgICBpZiAoYklzb2xhdGVkIHx8ICFiR3JvdXApIHsKKyAgICAgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocERJQml0bWFwLCBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOworICAgIH0gZWxzZSB7CisgICAgICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgcERJQml0bWFwLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgIHRvcCArIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCkpOworICAgICAgcmVjdC5JbnRlcnNlY3QobV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOworICAgICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmUgPSBOVUxMOworICAgICAgRlhfQk9PTCBiQ2xvbmUgPSBGQUxTRTsKKyAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCkgJiYgbV9wRGV2aWNlLT5HZXRCaXRtYXAoKSkgeworICAgICAgICBiQ2xvbmUgPSBUUlVFOworICAgICAgICBwQ2xvbmUgPSBtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCktPkNsb25lKCZyZWN0KTsKKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRm9yZUJpdG1hcCA9IG1fcERldmljZS0+R2V0Qml0bWFwKCk7CisgICAgICAgIHBDbG9uZS0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHBDbG9uZS0+R2V0V2lkdGgoKSwgcENsb25lLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcmVCaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3ApOworICAgICAgICBsZWZ0ID0gbGVmdCA+PSAwID8gMCA6IGxlZnQ7CisgICAgICAgIHRvcCA9IHRvcCA+PSAwID8gMCA6IHRvcDsKKyAgICAgICAgaWYgKCFwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpCisgICAgICAgICAgcENsb25lLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBESUJpdG1hcCwgbGVmdCwgdG9wLCBibGVuZF9tb2RlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBDbG9uZS0+Q29tcG9zaXRlTWFzaygwLCAwLCBwQ2xvbmUtPkdldFdpZHRoKCksIHBDbG9uZS0+R2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBESUJpdG1hcCwgbWFza19hcmdiLCBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcENsb25lID0gcERJQml0bWFwOworICAgICAgfQorICAgICAgaWYgKG1fcERldmljZS0+R2V0QmFja0Ryb3AoKSkgeworICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwQ2xvbmUsIHJlY3QubGVmdCwgcmVjdC50b3ApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwRElCaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIGJsZW5kX21vZGUpOworICAgICAgfQorICAgICAgaWYgKGJDbG9uZSkgeworICAgICAgICBkZWxldGUgcENsb25lOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaW50IGJhY2tfbGVmdCwgYmFja190b3A7CisgIEZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwRElCaXRtYXAtPkdldFdpZHRoKCksCisgICAgICAgICAgICAgICB0b3AgKyBwRElCaXRtYXAtPkdldEhlaWdodCgpKTsKKyAgQ0ZYX0RJQml0bWFwKiBwQmFja2Ryb3AgPQorICAgICAgR2V0QmFja2Ryb3AobV9wQ3VyT2JqLCByZWN0LCBiYWNrX2xlZnQsIGJhY2tfdG9wLAorICAgICAgICAgICAgICAgICAgYmxlbmRfbW9kZSA+IEZYRElCX0JMRU5EX05PUk1BTCAmJiBiSXNvbGF0ZWQpOworICBpZiAoIXBCYWNrZHJvcCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkKKyAgICBwQmFja2Ryb3AtPkNvbXBvc2l0ZUJpdG1hcChsZWZ0IC0gYmFja19sZWZ0LCB0b3AgLSBiYWNrX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRElCaXRtYXAtPkdldFdpZHRoKCksIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERJQml0bWFwLCAwLCAwLCBibGVuZF9tb2RlKTsKKyAgZWxzZQorICAgIHBCYWNrZHJvcC0+Q29tcG9zaXRlTWFzayhsZWZ0IC0gYmFja19sZWZ0LCB0b3AgLSBiYWNrX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERJQml0bWFwLT5HZXRXaWR0aCgpLCBwRElCaXRtYXAtPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRElCaXRtYXAsIG1hc2tfYXJnYiwgMCwgMCwgYmxlbmRfbW9kZSk7CisgIENGWF9ESUJpdG1hcCogcEJhY2tkcm9wMSA9IG5ldyBDRlhfRElCaXRtYXA7CisgIHBCYWNrZHJvcDEtPkNyZWF0ZShwQmFja2Ryb3AtPkdldFdpZHRoKCksIHBCYWNrZHJvcC0+R2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICBGWERJQl9SZ2IzMik7CisgIHBCYWNrZHJvcDEtPkNsZWFyKChGWF9EV09SRCktMSk7CisgIHBCYWNrZHJvcDEtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBwQmFja2Ryb3AtPkdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmFja2Ryb3AtPkdldEhlaWdodCgpLCBwQmFja2Ryb3AsIDAsIDApOworICBkZWxldGUgcEJhY2tkcm9wOworICBwQmFja2Ryb3AgPSBwQmFja2Ryb3AxOworICBtX3BEZXZpY2UtPlNldERJQml0cyhwQmFja2Ryb3AsIGJhY2tfbGVmdCwgYmFja190b3ApOworICBkZWxldGUgcEJhY2tkcm9wOworfQorRlhfQ09MT1JSRUYgQ1BERl9UcmFuc2ZlckZ1bmM6OlRyYW5zbGF0ZUNvbG9yKEZYX0NPTE9SUkVGIHJnYikgeworICByZXR1cm4gRlhTWVNfUkdCKG1fU2FtcGxlc1tGWFNZU19HZXRSVmFsdWUocmdiKV0sCisgICAgICAgICAgICAgICAgICAgbV9TYW1wbGVzWzI1NiArIEZYU1lTX0dldEdWYWx1ZShyZ2IpXSwKKyAgICAgICAgICAgICAgICAgICBtX1NhbXBsZXNbNTEyICsgRlhTWVNfR2V0QlZhbHVlKHJnYildKTsKK30KK0NGWF9ESUJTb3VyY2UqIENQREZfVHJhbnNmZXJGdW5jOjpUcmFuc2xhdGVJbWFnZShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkF1dG9Ecm9wU3JjKSB7CisgIENQREZfRElCVHJhbnNmZXJGdW5jKiBwRGVzdCA9IG5ldyBDUERGX0RJQlRyYW5zZmVyRnVuYyh0aGlzKTsKKyAgcERlc3QtPkxvYWRTcmMocFNyYywgYkF1dG9Ecm9wU3JjKTsKKyAgcmV0dXJuIHBEZXN0OworfQorRlhESUJfRm9ybWF0IENQREZfRElCVHJhbnNmZXJGdW5jOjpHZXREZXN0Rm9ybWF0KCkgeworICBpZiAobV9wU3JjLT5Jc0FscGhhTWFzaygpKSB7CisgICAgcmV0dXJuIEZYRElCXzhicHBNYXNrOworICB9CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgcmV0dXJuIChtX3BTcmMtPkhhc0FscGhhKCkpID8gRlhESUJfQXJnYiA6IEZYRElCX1JnYjMyOworI2Vsc2UKKyAgcmV0dXJuIChtX3BTcmMtPkhhc0FscGhhKCkpID8gRlhESUJfQXJnYiA6IEZYRElCX1JnYjsKICNlbmRpZgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEdbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9ICooc3JjX2J1ZisrKTsKLSAgICAgICAgICAgIH0KLSAgICB9CiB9Ci1zdGF0aWMgRlhfQk9PTCBfSXNTdXBwb3J0ZWQoQ1BERl9Db2xvclNwYWNlKiBwQ1MpCi17Ci0gICAgaWYgKHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfREVWSUNFUkdCIHx8IHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfREVWSUNFR1JBWSB8fAotICAgICAgICAgICAgcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19ERVZJQ0VDTVlLIHx8IHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfQ0FMR1JBWSB8fAotICAgICAgICAgICAgcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19DQUxSR0IpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChwQ1MtPkdldEZhbWlseSgpID09IFBERkNTX0lOREVYRUQgJiYgX0lzU3VwcG9ydGVkKHBDUy0+R2V0QmFzZUNTKCkpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CitDUERGX0RJQlRyYW5zZmVyRnVuYzo6Q1BERl9ESUJUcmFuc2ZlckZ1bmMoCisgICAgY29uc3QgQ1BERl9UcmFuc2ZlckZ1bmMqIHBUcmFuc2ZlckZ1bmMpIHsKKyAgbV9SYW1wUiA9IHBUcmFuc2ZlckZ1bmMtPm1fU2FtcGxlczsKKyAgbV9SYW1wRyA9ICZwVHJhbnNmZXJGdW5jLT5tX1NhbXBsZXNbMjU2XTsKKyAgbV9SYW1wQiA9ICZwVHJhbnNmZXJGdW5jLT5tX1NhbXBsZXNbNTEyXTsKIH0KLUNQREZfSW1hZ2VSZW5kZXJlcjo6Q1BERl9JbWFnZVJlbmRlcmVyKCkKLXsKLSAgICBtX3BSZW5kZXJTdGF0dXMgPSBOVUxMOwotICAgIG1fcEltYWdlT2JqZWN0ID0gTlVMTDsKLSAgICBtX1Jlc3VsdCA9IFRSVUU7Ci0gICAgbV9TdGF0dXMgPSAwOwotICAgIG1fcFF1aWNrU3RyZXRjaGVyID0gTlVMTDsKLSAgICBtX3BUcmFuc2Zvcm1lciA9IE5VTEw7Ci0gICAgbV9EZXZpY2VIYW5kbGUgPSBOVUxMOwotICAgIG1fTG9hZEhhbmRsZSA9IE5VTEw7Ci0gICAgbV9wQ2xvbmUgPSBOVUxMOwotICAgIG1fYlN0ZENTID0gRkFMU0U7Ci0gICAgbV9iUGF0dGVybkNvbG9yID0gRkFMU0U7Ci0gICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7Ci0gICAgbV9wUGF0dGVybiA9IE5VTEw7Ci0gICAgbV9wT2JqMkRldmljZSA9IE5VTEw7Ci19Ci1DUERGX0ltYWdlUmVuZGVyZXI6On5DUERGX0ltYWdlUmVuZGVyZXIoKQotewotICAgIGRlbGV0ZSBtX3BRdWlja1N0cmV0Y2hlcjsKLSAgICBkZWxldGUgbV9wVHJhbnNmb3JtZXI7Ci0gICAgaWYgKG1fRGV2aWNlSGFuZGxlKSB7Ci0gICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5DYW5jZWxESUJpdHMobV9EZXZpY2VIYW5kbGUpOwotICAgIH0KLSAgICBkZWxldGUgKENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSopbV9Mb2FkSGFuZGxlOwotICAgIGRlbGV0ZSBtX3BDbG9uZTsKLX0KLUZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydExvYWRESUJTb3VyY2UoKQotewotICAgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOwotICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7Ci0gICAgaW50IGRlc3RfaGVpZ2h0ID0gaW1hZ2VfcmVjdC5IZWlnaHQoKTsKLSAgICBpZiAobV9JbWFnZU1hdHJpeC5hIDwgMCkgewotICAgICAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7Ci0gICAgfQotICAgIGlmIChtX0ltYWdlTWF0cml4LmQgPiAwKSB7Ci0gICAgICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0OwotICAgIH0KLSAgICBpZiAobV9Mb2FkZXIuU3RhcnRMb2FkSW1hZ2UobV9wSW1hZ2VPYmplY3QsIG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dC0+bV9wUGFnZUNhY2hlLCBtX0xvYWRIYW5kbGUsIG1fYlN0ZENTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fR3JvdXBGYW1pbHksIG1fcFJlbmRlclN0YXR1cy0+bV9iTG9hZE1hc2ssIG1fcFJlbmRlclN0YXR1cywgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpKSB7Ci0gICAgICAgIGlmIChtX0xvYWRIYW5kbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgbV9TdGF0dXMgPSA0OwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRSZW5kZXJESUJTb3VyY2UoKQotewotICAgIGlmIChtX0xvYWRlci5tX3BCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fQml0bWFwQWxwaGEgPSAyNTU7Ci0gICAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbFN0YXRlID0gbV9wSW1hZ2VPYmplY3QtPm1fR2VuZXJhbFN0YXRlOwotICAgIGlmIChwR2VuZXJhbFN0YXRlKSB7Ci0gICAgICAgIG1fQml0bWFwQWxwaGEgPSBGWFNZU19yb3VuZChwR2VuZXJhbFN0YXRlLT5tX0ZpbGxBbHBoYSAqIDI1NSk7Ci0gICAgfQotICAgIG1fcERJQlNvdXJjZSA9IG1fTG9hZGVyLm1fcEJpdG1hcDsKLSAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0FMUEhBICYmIG1fTG9hZGVyLm1fcE1hc2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gU3RhcnRCaXRtYXBBbHBoYSgpOwotICAgIH0KLSAgICBpZiAocEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX3BUUikgewotICAgICAgICBpZiAoIXBHZW5lcmFsU3RhdGUtPm1fcFRyYW5zZmVyRnVuYykgewotICAgICAgICAgICAgKChDUERGX0dlbmVyYWxTdGF0ZURhdGEqKXBHZW5lcmFsU3RhdGUpLT5tX3BUcmFuc2ZlckZ1bmMgPSBtX3BSZW5kZXJTdGF0dXMtPkdldFRyYW5zZmVyRnVuYyhwR2VuZXJhbFN0YXRlLT5tX3BUUik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBHZW5lcmFsU3RhdGUtPm1fcFRyYW5zZmVyRnVuYyAmJiAhcEdlbmVyYWxTdGF0ZS0+bV9wVHJhbnNmZXJGdW5jLT5tX2JJZGVudGl0eSkgewotICAgICAgICAgICAgbV9wRElCU291cmNlID0gbV9Mb2FkZXIubV9wQml0bWFwID0gcEdlbmVyYWxTdGF0ZS0+bV9wVHJhbnNmZXJGdW5jLT5UcmFuc2xhdGVJbWFnZShtX0xvYWRlci5tX3BCaXRtYXAsICFtX0xvYWRlci5tX2JDYWNoZWQpOwotICAgICAgICAgICAgaWYgKG1fTG9hZGVyLm1fYkNhY2hlZCAmJiBtX0xvYWRlci5tX3BNYXNrKSB7Ci0gICAgICAgICAgICAgICAgbV9Mb2FkZXIubV9wTWFzayA9IG1fTG9hZGVyLm1fcE1hc2stPkNsb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX0xvYWRlci5tX2JDYWNoZWQgPSBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX0ZpbGxBcmdiID0gMDsKLSAgICBtX2JQYXR0ZXJuQ29sb3IgPSBGQUxTRTsKLSAgICBtX3BQYXR0ZXJuID0gTlVMTDsKLSAgICBpZiAobV9wRElCU291cmNlLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIENQREZfQ29sb3IqIHBDb2xvciA9IG1fcEltYWdlT2JqZWN0LT5tX0NvbG9yU3RhdGUuR2V0RmlsbENvbG9yKCk7Ci0gICAgICAgIGlmIChwQ29sb3IgJiYgcENvbG9yLT5Jc1BhdHRlcm4oKSkgewotICAgICAgICAgICAgbV9wUGF0dGVybiA9IHBDb2xvci0+R2V0UGF0dGVybigpOwotICAgICAgICAgICAgaWYgKG1fcFBhdHRlcm4gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1fYlBhdHRlcm5Db2xvciA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9GaWxsQXJnYiA9IG1fcFJlbmRlclN0YXR1cy0+R2V0RmlsbEFyZ2IobV9wSW1hZ2VPYmplY3QpOwotICAgIH0gZWxzZSBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0dSQVkpIHsKLSAgICAgICAgbV9wQ2xvbmUgPSBtX3BESUJTb3VyY2UtPkNsb25lKCk7Ci0gICAgICAgIG1fcENsb25lLT5Db252ZXJ0Q29sb3JTY2FsZShtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0JhY2tDb2xvciwgbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9Gb3JlQ29sb3IpOwotICAgICAgICBtX3BESUJTb3VyY2UgPSBtX3BDbG9uZTsKLSAgICB9Ci0gICAgbV9GbGFncyA9IDA7Ci0gICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRSkgewotICAgICAgICBtX0ZsYWdzIHw9IFJFTkRFUl9GT1JDRV9ET1dOU0FNUExFOwotICAgIH0gZWxzZSBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9GT1JDRV9IQUxGVE9ORSkgewotICAgICAgICBtX0ZsYWdzIHw9IFJFTkRFUl9GT1JDRV9IQUxGVE9ORTsKLSAgICB9Ci0gICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpICE9IEZYRENfRElTUExBWSkgewotICAgICAgICBDUERGX09iamVjdCogcEZpbHRlcnMgPSBtX3BJbWFnZU9iamVjdC0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpLT5HZXREaWN0KCktPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRmlsdGVyIikpOwotICAgICAgICBpZiAocEZpbHRlcnMpIHsKLSAgICAgICAgICAgIGlmIChwRmlsdGVycy0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIGJzRGVjb2RlVHlwZSA9IHBGaWx0ZXJzLT5HZXRDb25zdFN0cmluZygpOwotICAgICAgICAgICAgICAgIGlmIChic0RlY29kZVR5cGUgPT0gRlhfQlNUUkMoIkRDVERlY29kZSIpIHx8IGJzRGVjb2RlVHlwZSA9PSBGWF9CU1RSQygiSlBYRGVjb2RlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9GbGFncyB8PSBGWFJFTkRFUl9JTUFHRV9MT1NTWTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBGaWx0ZXJzLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBGaWx0ZXJzOwotICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIGJzRGVjb2RlVHlwZSA9IHBBcnJheS0+R2V0Q29uc3RTdHJpbmcoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChic0RlY29kZVR5cGUgPT0gRlhfQlNUUkMoIkRDVERlY29kZSIpIHx8IGJzRGVjb2RlVHlwZSA9PSBGWF9CU1RSQygiSlBYRGVjb2RlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fRmxhZ3MgfD0gRlhSRU5ERVJfSU1BR0VfTE9TU1k7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT0lNQUdFU01PT1RIKSB7Ci0gICAgICAgIG1fRmxhZ3MgfD0gRlhESUJfTk9TTU9PVEg7Ci0gICAgfSBlbHNlIGlmIChtX3BJbWFnZU9iamVjdC0+bV9wSW1hZ2UtPklzSW50ZXJwb2woKSkgewotICAgICAgICBtX0ZsYWdzIHw9IEZYRElCX0lOVEVSUE9MOwotICAgIH0KLSAgICBpZiAobV9Mb2FkZXIubV9wTWFzaykgewotICAgICAgICByZXR1cm4gRHJhd01hc2tlZEltYWdlKCk7Ci0gICAgfQotICAgIGlmIChtX2JQYXR0ZXJuQ29sb3IpIHsKLSAgICAgICAgcmV0dXJuIERyYXdQYXR0ZXJuSW1hZ2UobV9wT2JqMkRldmljZSk7Ci0gICAgfQotICAgIGlmIChtX0JpdG1hcEFscGhhID09IDI1NSAmJiBwR2VuZXJhbFN0YXRlICYmIHBHZW5lcmFsU3RhdGUtPm1fRmlsbE9QICYmCi0gICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX09QTW9kZSA9PSAwICYmIHBHZW5lcmFsU3RhdGUtPm1fQmxlbmRUeXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJiBwR2VuZXJhbFN0YXRlLT5tX1N0cm9rZUFscGhhID09IDEgJiYgcEdlbmVyYWxTdGF0ZS0+bV9GaWxsQWxwaGEgPT0gMSkgewotICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBOVUxMOwotICAgICAgICBDUERGX1BhZ2UqIHBQYWdlID0gTlVMTDsKLSAgICAgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dC0+bV9wUGFnZUNhY2hlKSB7Ci0gICAgICAgICAgICBwUGFnZSA9IG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dC0+bV9wUGFnZUNhY2hlLT5HZXRQYWdlKCk7Ci0gICAgICAgICAgICBwRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7Cit2b2lkIENQREZfRElCVHJhbnNmZXJGdW5jOjpUcmFuc2xhdGVTY2FubGluZSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYpIGNvbnN0IHsKKyAgaW50IGk7CisgIEZYX0JPT0wgYlNraXAgPSBGQUxTRTsKKyAgc3dpdGNoIChtX3BTcmMtPkdldEZvcm1hdCgpKSB7CisgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7CisgICAgICBpbnQgcjAgPSBtX1JhbXBSWzBdLCBnMCA9IG1fUmFtcEdbMF0sIGIwID0gbV9SYW1wQlswXTsKKyAgICAgIGludCByMSA9IG1fUmFtcFJbMjU1XSwgZzEgPSBtX1JhbXBHWzI1NV0sIGIxID0gbV9SYW1wQlsyNTVdOworICAgICAgZm9yIChpID0gMDsgaSA8IG1fV2lkdGg7IGkrKykgeworICAgICAgICBpZiAoc3JjX2J1ZltpIC8gOF0gJiAoMSA8PCAoNyAtIGkgJSA4KSkpIHsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IGIxOworICAgICAgICAgICpkZXN0X2J1ZisrID0gZzE7CisgICAgICAgICAgKmRlc3RfYnVmKysgPSByMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBEb2N1bWVudCA9IG1fcEltYWdlT2JqZWN0LT5tX3BJbWFnZS0+R2V0RG9jdW1lbnQoKTsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IGIwOworICAgICAgICAgICpkZXN0X2J1ZisrID0gZzA7CisgICAgICAgICAgKmRlc3RfYnVmKysgPSByMDsKICAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzID0gcFBhZ2UgPyBwUGFnZS0+bV9wUGFnZVJlc291cmNlcyA6IE5VTEw7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBtX3BJbWFnZU9iamVjdC0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpLT5HZXREaWN0KCktPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKLSAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ29sb3JTcGFjZSA9IHBEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocENTT2JqLCBwUGFnZVJlc291cmNlcyk7Ci0gICAgICAgIGlmIChwQ29sb3JTcGFjZSkgewotICAgICAgICAgICAgaW50IGZvcm1hdCA9IHBDb2xvclNwYWNlLT5HZXRGYW1pbHkoKTsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gUERGQ1NfREVWSUNFQ01ZSyB8fCBmb3JtYXQgPT0gUERGQ1NfU0VQQVJBVElPTiB8fCBmb3JtYXQgPT0gUERGQ1NfREVWSUNFTikgewotICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfREFSS0VOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1NPYmopOwotICAgICAgICB9CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgICAgICAgZGVzdF9idWYrKzsKKyNlbmRpZgorICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBTdGFydERJQlNvdXJjZSgpOwotfQotRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdGRDUywgaW50IGJsZW5kVHlwZSkKLXsKLSAgICBtX3BSZW5kZXJTdGF0dXMgPSBwU3RhdHVzOwotICAgIG1fYlN0ZENTID0gYlN0ZENTOwotICAgIG1fcEltYWdlT2JqZWN0ID0gKENQREZfSW1hZ2VPYmplY3QqKXBPYmo7Ci0gICAgbV9CbGVuZFR5cGUgPSBibGVuZFR5cGU7Ci0gICAgbV9wT2JqMkRldmljZSA9IHBPYmoyRGV2aWNlOwotICAgIENQREZfRGljdGlvbmFyeSogcE9DID0gbV9wSW1hZ2VPYmplY3QtPm1fcEltYWdlLT5HZXRPQygpOwotICAgIGlmIChwT0MgJiYgbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9wT0NDb250ZXh0ICYmICFtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX3BPQ0NvbnRleHQtPkNoZWNrT0NHVmlzaWJsZShwT0MpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9JbWFnZU1hdHJpeCA9IG1fcEltYWdlT2JqZWN0LT5tX01hdHJpeDsKLSAgICBtX0ltYWdlTWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICAgIGlmIChTdGFydExvYWRESUJTb3VyY2UoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXJ0UmVuZGVyRElCU291cmNlKCk7Ci19Ci1GWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UsIEZYX0FSR0IgYml0bWFwX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgRlhfRFdPUkQgZmxhZ3MsIEZYX0JPT0wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlKQotewotICAgIG1fcFJlbmRlclN0YXR1cyA9IHBTdGF0dXM7Ci0gICAgbV9wRElCU291cmNlID0gcERJQlNvdXJjZTsKLSAgICBtX0ZpbGxBcmdiID0gYml0bWFwX2FyZ2I7Ci0gICAgbV9CaXRtYXBBbHBoYSA9IGJpdG1hcF9hbHBoYTsKLSAgICBtX0ltYWdlTWF0cml4ID0gKnBJbWFnZTJEZXZpY2U7Ci0gICAgbV9GbGFncyA9IGZsYWdzOwotICAgIG1fYlN0ZENTID0gYlN0ZENTOwotICAgIG1fQmxlbmRUeXBlID0gYmxlbmRUeXBlOwotICAgIHJldHVybiBTdGFydERJQlNvdXJjZSgpOwotfQotRlhfQk9PTAlDUERGX0ltYWdlUmVuZGVyZXI6OkRyYXdQYXR0ZXJuSW1hZ2UoY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpCi17Ci0gICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9iUHJpbnQgJiYgIShtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgewotICAgICAgICBtX1Jlc3VsdCA9IEZBTFNFOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX1JFQ1QgcmVjdCA9IG1fSW1hZ2VNYXRyaXguR2V0VW5pdFJlY3QoKS5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgcmVjdC5JbnRlcnNlY3QobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldENsaXBCb3goKSk7Ci0gICAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBuZXdfbWF0cml4ID0gbV9JbWFnZU1hdHJpeDsKLSAgICBuZXdfbWF0cml4LlRyYW5zbGF0ZUkoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsKLSAgICBpbnQgd2lkdGggPSByZWN0LldpZHRoKCk7Ci0gICAgaW50IGhlaWdodCA9IHJlY3QuSGVpZ2h0KCk7Ci0gICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTE7Ci0gICAgaWYgKCFiaXRtYXBfZGV2aWNlMS5DcmVhdGUocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBGWERJQl9SZ2IzMikpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5DbGVhcigweGZmZmZmZik7Ci0gICAgewotICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBiaXRtYXBfcmVuZGVyOwotICAgICAgICBiaXRtYXBfcmVuZGVyLkluaXRpYWxpemUobV9wUmVuZGVyU3RhdHVzLT5tX3BDb250ZXh0LCAmYml0bWFwX2RldmljZTEsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAmbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIFRSVUUpOwotICAgICAgICBDRlhfTWF0cml4IHBhdHRlcm5EZXZpY2UgPSAqcE9iajJEZXZpY2U7Ci0gICAgICAgIHBhdHRlcm5EZXZpY2UuVHJhbnNsYXRlKChGWF9GTE9BVCkgLSByZWN0LmxlZnQsIChGWF9GTE9BVCkgLSByZWN0LnRvcCk7Ci0gICAgICAgIGlmKG1fcFBhdHRlcm4tPm1fUGF0dGVyblR5cGUgPT0gUEFUVEVSTl9USUxJTkcpIHsKLSAgICAgICAgICAgIGJpdG1hcF9yZW5kZXIuRHJhd1RpbGluZ1BhdHRlcm4oKENQREZfVGlsaW5nUGF0dGVybiopbV9wUGF0dGVybiwgbV9wSW1hZ2VPYmplY3QsICZwYXR0ZXJuRGV2aWNlLCBGQUxTRSk7CisgICAgY2FzZSBGWERJQl8xYnBwTWFzazogeworICAgICAgaW50IG0wID0gbV9SYW1wUlswXSwgbTEgPSBtX1JhbXBSWzI1NV07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9XaWR0aDsgaSsrKSB7CisgICAgICAgIGlmIChzcmNfYnVmW2kgLyA4XSAmICgxIDw8ICg3IC0gaSAlIDgpKSkgeworICAgICAgICAgICpkZXN0X2J1ZisrID0gbTE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiaXRtYXBfcmVuZGVyLkRyYXdTaGFkaW5nUGF0dGVybigoQ1BERl9TaGFkaW5nUGF0dGVybiopbV9wUGF0dGVybiwgbV9wSW1hZ2VPYmplY3QsICZwYXR0ZXJuRGV2aWNlLCBGQUxTRSk7CisgICAgICAgICAgKmRlc3RfYnVmKysgPSBtMDsKICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgfQotICAgIHsKLSAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTI7Ci0gICAgICAgIGlmICghYml0bWFwX2RldmljZTIuQ3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgRlhESUJfOGJwcFJnYikpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRlhESUJfOGJwcFJnYjogeworICAgICAgRlhfQVJHQiogcFBhbCA9IG1fcFNyYy0+R2V0UGFsZXR0ZSgpOworICAgICAgZm9yIChpID0gMDsgaSA8IG1fV2lkdGg7IGkrKykgeworICAgICAgICBpZiAocFBhbCkgeworICAgICAgICAgIEZYX0FSR0Igc3JjX2FyZ2IgPSBwUGFsWypzcmNfYnVmXTsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbRlhBUkdCX1Ioc3JjX2FyZ2IpXTsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEdbRlhBUkdCX0coc3JjX2FyZ2IpXTsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbRlhBUkdCX0Ioc3JjX2FyZ2IpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGWF9EV09SRCBzcmNfYnl0ZSA9ICpzcmNfYnVmOworICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wQltzcmNfYnl0ZV07CisgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBHW3NyY19ieXRlXTsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbc3JjX2J5dGVdOwogICAgICAgICB9Ci0gICAgICAgIGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5DbGVhcigwKTsKLSAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgYml0bWFwX3JlbmRlcjsKLSAgICAgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UyLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgVFJVRSk7Ci0gICAgICAgIENQREZfSW1hZ2VSZW5kZXJlciBpbWFnZV9yZW5kZXI7Ci0gICAgICAgIGlmIChpbWFnZV9yZW5kZXIuU3RhcnQoJmJpdG1hcF9yZW5kZXIsIG1fcERJQlNvdXJjZSwgMHhmZmZmZmZmZiwgMjU1LCAmbmV3X21hdHJpeCwgbV9GbGFncywgVFJVRSkpIHsKLSAgICAgICAgICAgIGltYWdlX3JlbmRlci5Db250aW51ZShOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9Mb2FkZXIubV9NYXR0ZUNvbG9yICE9IDB4ZmZmZmZmZmYpIHsKLSAgICAgICAgICAgIGludCBtYXR0ZV9yID0gRlhBUkdCX1IobV9Mb2FkZXIubV9NYXR0ZUNvbG9yKTsKLSAgICAgICAgICAgIGludCBtYXR0ZV9nID0gRlhBUkdCX0cobV9Mb2FkZXIubV9NYXR0ZUNvbG9yKTsKLSAgICAgICAgICAgIGludCBtYXR0ZV9iID0gRlhBUkdCX0IobV9Mb2FkZXIubV9NYXR0ZUNvbG9yKTsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gKHVpbnQ4X3QqKWJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG1hc2tfc2NhbiA9IGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhID0gKm1hc2tfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JpZyA9ICgqZGVzdF9zY2FuIC0gbWF0dGVfYikgKiAyNTUgLyBhbHBoYSArIG1hdHRlX2I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZyA+IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBvcmlnOwotICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9ICgqZGVzdF9zY2FuIC0gbWF0dGVfZykgKiAyNTUgLyBhbHBoYSArIG1hdHRlX2c7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZyA+IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBvcmlnOwotICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9ICgqZGVzdF9zY2FuIC0gbWF0dGVfcikgKiAyNTUgLyBhbHBoYSArIG1hdHRlX3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZyA+IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBvcmlnOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCktPkNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spOwotICAgICAgICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+TXVsdGlwbHlBbHBoYShiaXRtYXBfZGV2aWNlMi5HZXRCaXRtYXAoKSk7Ci0gICAgICAgIGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5NdWx0aXBseUFscGhhKDI1NSk7CisgICAgICAgIHNyY19idWYrKzsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgICAgICBkZXN0X2J1ZisrOworI2VuZGlmCisgICAgICB9CisgICAgICBicmVhazsKICAgICB9Ci0gICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldERJQml0cyhiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKSwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgbV9CbGVuZFR5cGUpOwotICAgIHJldHVybiBGQUxTRTsKKyAgICBjYXNlIEZYRElCXzhicHBNYXNrOgorICAgICAgZm9yIChpID0gMDsgaSA8IG1fV2lkdGg7IGkrKykgeworICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbKihzcmNfYnVmKyspXTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfUmdiOgorICAgICAgZm9yIChpID0gMDsgaSA8IG1fV2lkdGg7IGkrKykgeworICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbKihzcmNfYnVmKyspXTsKKyAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBHWyooc3JjX2J1ZisrKV07CisgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wUlsqKHNyY19idWYrKyldOworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICAgIGRlc3RfYnVmKys7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfUmdiMzI6CisgICAgICBiU2tpcCA9IFRSVUU7CisgICAgY2FzZSBGWERJQl9BcmdiOgorICAgICAgZm9yIChpID0gMDsgaSA8IG1fV2lkdGg7IGkrKykgeworICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbKihzcmNfYnVmKyspXTsKKyAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBHWyooc3JjX2J1ZisrKV07CisgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wUlsqKHNyY19idWYrKyldOworICAgICAgICBpZiAoIWJTa2lwKSB7CisgICAgICAgICAgKmRlc3RfYnVmKysgPSAqc3JjX2J1ZjsKKyAgICAgICAgfQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICAgIGVsc2UgeworICAgICAgICAgIGRlc3RfYnVmKys7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBzcmNfYnVmKys7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpEcmF3TWFza2VkSW1hZ2UoKQotewotICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fYlByaW50ICYmICEobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQkxFTkRfTU9ERSkpIHsKLSAgICAgICAgbV9SZXN1bHQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwordm9pZCBDUERGX0RJQlRyYW5zZmVyRnVuYzo6VHJhbnNsYXRlRG93blNhbXBsZXModWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHApIGNvbnN0IHsKKyAgaWYgKEJwcCA9PSA4KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkrKykgeworICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07CiAgICAgfQotICAgIEZYX1JFQ1QgcmVjdCA9IG1fSW1hZ2VNYXRyaXguR2V0VW5pdFJlY3QoKS5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgcmVjdC5JbnRlcnNlY3QobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldENsaXBCb3goKSk7Ci0gICAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlIGlmIChCcHAgPT0gMjQpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbKihzcmNfYnVmKyspXTsKKyAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wR1sqKHNyY19idWYrKyldOworICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07CiAgICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbmV3X21hdHJpeCA9IG1fSW1hZ2VNYXRyaXg7Ci0gICAgbmV3X21hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7Ci0gICAgaW50IHdpZHRoID0gcmVjdC5XaWR0aCgpOwotICAgIGludCBoZWlnaHQgPSByZWN0LkhlaWdodCgpOwotICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2UxOwotICAgIGlmICghYml0bWFwX2RldmljZTEuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYjMyKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPkNsZWFyKDB4ZmZmZmZmKTsKLSAgICB7Ci0gICAgICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7Ci0gICAgICAgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMSwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIFRSVUUpOwotICAgICAgICBDUERGX0ltYWdlUmVuZGVyZXIgaW1hZ2VfcmVuZGVyOwotICAgICAgICBpZiAoaW1hZ2VfcmVuZGVyLlN0YXJ0KCZiaXRtYXBfcmVuZGVyLCBtX3BESUJTb3VyY2UsIDAsIDI1NSwgJm5ld19tYXRyaXgsIG1fRmxhZ3MsIFRSVUUpKSB7Ci0gICAgICAgICAgICBpbWFnZV9yZW5kZXIuQ29udGludWUoTlVMTCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgewotICAgICAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlMjsKLSAgICAgICAgaWYgKCFiaXRtYXBfZGV2aWNlMi5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfOGJwcFJnYikpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5DbGVhcigwKTsKLSAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgYml0bWFwX3JlbmRlcjsKLSAgICAgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UyLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgVFJVRSk7Ci0gICAgICAgIENQREZfSW1hZ2VSZW5kZXJlciBpbWFnZV9yZW5kZXI7Ci0gICAgICAgIGlmIChpbWFnZV9yZW5kZXIuU3RhcnQoJmJpdG1hcF9yZW5kZXIsIG1fTG9hZGVyLm1fcE1hc2ssIDB4ZmZmZmZmZmYsIDI1NSwgJm5ld19tYXRyaXgsIG1fRmxhZ3MsIFRSVUUpKSB7Ci0gICAgICAgICAgICBpbWFnZV9yZW5kZXIuQ29udGludWUoTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fTG9hZGVyLm1fTWF0dGVDb2xvciAhPSAweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgICBpbnQgbWF0dGVfciA9IEZYQVJHQl9SKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7Ci0gICAgICAgICAgICBpbnQgbWF0dGVfZyA9IEZYQVJHQl9HKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7Ci0gICAgICAgICAgICBpbnQgbWF0dGVfYiA9IEZYQVJHQl9CKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9ICh1aW50OF90KiliaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBtYXNrX3NjYW4gPSBiaXRtYXBfZGV2aWNlMi5HZXRCaXRtYXAoKS0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSA9ICptYXNrX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yaWcgPSAoKmRlc3Rfc2NhbiAtIG1hdHRlX2IpICogMjU1IC8gYWxwaGEgKyBtYXR0ZV9iOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWcgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWcgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gb3JpZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAoKmRlc3Rfc2NhbiAtIG1hdHRlX2cpICogMjU1IC8gYWxwaGEgKyBtYXR0ZV9nOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWcgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWcgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gb3JpZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAoKmRlc3Rfc2NhbiAtIG1hdHRlX3IpICogMjU1IC8gYWxwaGEgKyBtYXR0ZV9yOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWcgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWcgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gb3JpZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5Db252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKTsKLSAgICAgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPk11bHRpcGx5QWxwaGEoYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCkpOwotICAgICAgICBpZiAobV9CaXRtYXBBbHBoYSA8IDI1NSkgewotICAgICAgICAgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPk11bHRpcGx5QWxwaGEobV9CaXRtYXBBbHBoYSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldERJQml0cyhiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKSwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgbV9CbGVuZFR5cGUpOwotICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlIHsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgIGlmICghbV9wU3JjLT5IYXNBbHBoYSgpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wQlsqKHNyY19idWYrKyldOworICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEdbKihzcmNfYnVmKyspXTsKKyAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07CisgICAgICAgIGRlc3RfYnVmKys7CisgICAgICAgIHNyY19idWYrKzsKKyAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkrKykgeworICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbKihzcmNfYnVmKyspXTsKKyAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBHWyooc3JjX2J1ZisrKV07CisgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wUlsqKHNyY19idWYrKyldOworICAgICAgICAqZGVzdF9idWYrKyA9ICooc3JjX2J1ZisrKTsKKyAgICAgIH0KKyAgfQogfQotRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0RElCU291cmNlKCkKLXsKLSAgICBpZiAoIShtX0ZsYWdzICYgUkVOREVSX0ZPUkNFX0RPV05TQU1QTEUpICYmIG1fcERJQlNvdXJjZS0+R2V0QlBQKCkgPiAxKSB7Ci0gICAgICAgIGludCBpbWFnZV9zaXplID0gbV9wRElCU291cmNlLT5HZXRCUFAoKSAvIDggKiBtX3BESUJTb3VyY2UtPkdldFdpZHRoKCkgKiBtX3BESUJTb3VyY2UtPkdldEhlaWdodCgpOwotICAgICAgICBpZiAoaW1hZ2Vfc2l6ZSA+IEZQREZfSFVHRV9JTUFHRV9TSVpFICYmICEobV9GbGFncyAmIFJFTkRFUl9GT1JDRV9IQUxGVE9ORSkpIHsKLSAgICAgICAgICAgIG1fRmxhZ3MgfD0gUkVOREVSX0ZPUkNFX0RPV05TQU1QTEU7CitzdGF0aWMgRlhfQk9PTCBfSXNTdXBwb3J0ZWQoQ1BERl9Db2xvclNwYWNlKiBwQ1MpIHsKKyAgaWYgKHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfREVWSUNFUkdCIHx8CisgICAgICBwQ1MtPkdldEZhbWlseSgpID09IFBERkNTX0RFVklDRUdSQVkgfHwKKyAgICAgIHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfREVWSUNFQ01ZSyB8fAorICAgICAgcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19DQUxHUkFZIHx8IHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfQ0FMUkdCKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfSU5ERVhFRCAmJiBfSXNTdXBwb3J0ZWQocENTLT5HZXRCYXNlQ1MoKSkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitDUERGX0ltYWdlUmVuZGVyZXI6OkNQREZfSW1hZ2VSZW5kZXJlcigpIHsKKyAgbV9wUmVuZGVyU3RhdHVzID0gTlVMTDsKKyAgbV9wSW1hZ2VPYmplY3QgPSBOVUxMOworICBtX1Jlc3VsdCA9IFRSVUU7CisgIG1fU3RhdHVzID0gMDsKKyAgbV9wUXVpY2tTdHJldGNoZXIgPSBOVUxMOworICBtX3BUcmFuc2Zvcm1lciA9IE5VTEw7CisgIG1fRGV2aWNlSGFuZGxlID0gTlVMTDsKKyAgbV9Mb2FkSGFuZGxlID0gTlVMTDsKKyAgbV9wQ2xvbmUgPSBOVUxMOworICBtX2JTdGRDUyA9IEZBTFNFOworICBtX2JQYXR0ZXJuQ29sb3IgPSBGQUxTRTsKKyAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7CisgIG1fcFBhdHRlcm4gPSBOVUxMOworICBtX3BPYmoyRGV2aWNlID0gTlVMTDsKK30KK0NQREZfSW1hZ2VSZW5kZXJlcjo6fkNQREZfSW1hZ2VSZW5kZXJlcigpIHsKKyAgZGVsZXRlIG1fcFF1aWNrU3RyZXRjaGVyOworICBkZWxldGUgbV9wVHJhbnNmb3JtZXI7CisgIGlmIChtX0RldmljZUhhbmRsZSkgeworICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5DYW5jZWxESUJpdHMobV9EZXZpY2VIYW5kbGUpOworICB9CisgIGRlbGV0ZSAoQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlKiltX0xvYWRIYW5kbGU7CisgIGRlbGV0ZSBtX3BDbG9uZTsKK30KK0ZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydExvYWRESUJTb3VyY2UoKSB7CisgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOworICBGWF9SRUNUIGltYWdlX3JlY3QgPSBpbWFnZV9yZWN0X2YuR2V0T3V0dGVyUmVjdCgpOworICBpbnQgZGVzdF93aWR0aCA9IGltYWdlX3JlY3QuV2lkdGgoKTsKKyAgaW50IGRlc3RfaGVpZ2h0ID0gaW1hZ2VfcmVjdC5IZWlnaHQoKTsKKyAgaWYgKG1fSW1hZ2VNYXRyaXguYSA8IDApIHsKKyAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7CisgIH0KKyAgaWYgKG1fSW1hZ2VNYXRyaXguZCA+IDApIHsKKyAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKKyAgfQorICBpZiAobV9Mb2FkZXIuU3RhcnRMb2FkSW1hZ2UoCisgICAgICAgICAgbV9wSW1hZ2VPYmplY3QsIG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dC0+bV9wUGFnZUNhY2hlLAorICAgICAgICAgIG1fTG9hZEhhbmRsZSwgbV9iU3RkQ1MsIG1fcFJlbmRlclN0YXR1cy0+bV9Hcm91cEZhbWlseSwKKyAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fYkxvYWRNYXNrLCBtX3BSZW5kZXJTdGF0dXMsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgZGVzdF9oZWlnaHQpKSB7CisgICAgaWYgKG1fTG9hZEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICBtX1N0YXR1cyA9IDQ7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydFJlbmRlckRJQlNvdXJjZSgpIHsKKyAgaWYgKG1fTG9hZGVyLm1fcEJpdG1hcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fQml0bWFwQWxwaGEgPSAyNTU7CisgIGNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxTdGF0ZSA9IG1fcEltYWdlT2JqZWN0LT5tX0dlbmVyYWxTdGF0ZTsKKyAgaWYgKHBHZW5lcmFsU3RhdGUpIHsKKyAgICBtX0JpdG1hcEFscGhhID0gRlhTWVNfcm91bmQocEdlbmVyYWxTdGF0ZS0+bV9GaWxsQWxwaGEgKiAyNTUpOworICB9CisgIG1fcERJQlNvdXJjZSA9IG1fTG9hZGVyLm1fcEJpdG1hcDsKKyAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9BTFBIQSAmJgorICAgICAgbV9Mb2FkZXIubV9wTWFzayA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFN0YXJ0Qml0bWFwQWxwaGEoKTsKKyAgfQorICBpZiAocEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX3BUUikgeworICAgIGlmICghcEdlbmVyYWxTdGF0ZS0+bV9wVHJhbnNmZXJGdW5jKSB7CisgICAgICAoKENQREZfR2VuZXJhbFN0YXRlRGF0YSopcEdlbmVyYWxTdGF0ZSktPm1fcFRyYW5zZmVyRnVuYyA9CisgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5HZXRUcmFuc2ZlckZ1bmMocEdlbmVyYWxTdGF0ZS0+bV9wVFIpOworICAgIH0KKyAgICBpZiAocEdlbmVyYWxTdGF0ZS0+bV9wVHJhbnNmZXJGdW5jICYmCisgICAgICAgICFwR2VuZXJhbFN0YXRlLT5tX3BUcmFuc2ZlckZ1bmMtPm1fYklkZW50aXR5KSB7CisgICAgICBtX3BESUJTb3VyY2UgPSBtX0xvYWRlci5tX3BCaXRtYXAgPQorICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcFRyYW5zZmVyRnVuYy0+VHJhbnNsYXRlSW1hZ2UobV9Mb2FkZXIubV9wQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1fTG9hZGVyLm1fYkNhY2hlZCk7CisgICAgICBpZiAobV9Mb2FkZXIubV9iQ2FjaGVkICYmIG1fTG9hZGVyLm1fcE1hc2spIHsKKyAgICAgICAgbV9Mb2FkZXIubV9wTWFzayA9IG1fTG9hZGVyLm1fcE1hc2stPkNsb25lKCk7CisgICAgICB9CisgICAgICBtX0xvYWRlci5tX2JDYWNoZWQgPSBGQUxTRTsKKyAgICB9CisgIH0KKyAgbV9GaWxsQXJnYiA9IDA7CisgIG1fYlBhdHRlcm5Db2xvciA9IEZBTFNFOworICBtX3BQYXR0ZXJuID0gTlVMTDsKKyAgaWYgKG1fcERJQlNvdXJjZS0+SXNBbHBoYU1hc2soKSkgeworICAgIENQREZfQ29sb3IqIHBDb2xvciA9IG1fcEltYWdlT2JqZWN0LT5tX0NvbG9yU3RhdGUuR2V0RmlsbENvbG9yKCk7CisgICAgaWYgKHBDb2xvciAmJiBwQ29sb3ItPklzUGF0dGVybigpKSB7CisgICAgICBtX3BQYXR0ZXJuID0gcENvbG9yLT5HZXRQYXR0ZXJuKCk7CisgICAgICBpZiAobV9wUGF0dGVybiAhPSBOVUxMKSB7CisgICAgICAgIG1fYlBhdHRlcm5Db2xvciA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIG1fRmlsbEFyZ2IgPSBtX3BSZW5kZXJTdGF0dXMtPkdldEZpbGxBcmdiKG1fcEltYWdlT2JqZWN0KTsKKyAgfSBlbHNlIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfR1JBWSkgeworICAgIG1fcENsb25lID0gbV9wRElCU291cmNlLT5DbG9uZSgpOworICAgIG1fcENsb25lLT5Db252ZXJ0Q29sb3JTY2FsZShtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0JhY2tDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9Gb3JlQ29sb3IpOworICAgIG1fcERJQlNvdXJjZSA9IG1fcENsb25lOworICB9CisgIG1fRmxhZ3MgPSAwOworICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9GT1JDRV9ET1dOU0FNUExFKSB7CisgICAgbV9GbGFncyB8PSBSRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRTsKKyAgfSBlbHNlIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0ZPUkNFX0hBTEZUT05FKSB7CisgICAgbV9GbGFncyB8PSBSRU5ERVJfRk9SQ0VfSEFMRlRPTkU7CisgIH0KKyAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpICE9IEZYRENfRElTUExBWSkgeworICAgIENQREZfT2JqZWN0KiBwRmlsdGVycyA9CisgICAgICAgIG1fcEltYWdlT2JqZWN0LT5tX3BJbWFnZS0+R2V0U3RyZWFtKCktPkdldERpY3QoKS0+R2V0RWxlbWVudFZhbHVlKAorICAgICAgICAgICAgRlhfQlNUUkMoIkZpbHRlciIpKTsKKyAgICBpZiAocEZpbHRlcnMpIHsKKyAgICAgIGlmIChwRmlsdGVycy0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nQyBic0RlY29kZVR5cGUgPSBwRmlsdGVycy0+R2V0Q29uc3RTdHJpbmcoKTsKKyAgICAgICAgaWYgKGJzRGVjb2RlVHlwZSA9PSBGWF9CU1RSQygiRENURGVjb2RlIikgfHwKKyAgICAgICAgICAgIGJzRGVjb2RlVHlwZSA9PSBGWF9CU1RSQygiSlBYRGVjb2RlIikpIHsKKyAgICAgICAgICBtX0ZsYWdzIHw9IEZYUkVOREVSX0lNQUdFX0xPU1NZOwogICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U3RhcnRESUJpdHMobV9wRElCU291cmNlLCBtX0JpdG1hcEFscGhhLCBtX0ZpbGxBcmdiLAotICAgICAgICAgICAgJm1fSW1hZ2VNYXRyaXgsIG1fRmxhZ3MsIG1fRGV2aWNlSGFuZGxlLCAwLCBOVUxMLCBtX0JsZW5kVHlwZSkpIHsKLSAgICAgICAgaWYgKG1fRGV2aWNlSGFuZGxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1fU3RhdHVzID0gMzsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfSBlbHNlIGlmIChwRmlsdGVycy0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcEZpbHRlcnM7CisgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyBic0RlY29kZVR5cGUgPSBwQXJyYXktPkdldENvbnN0U3RyaW5nKGkpOworICAgICAgICAgIGlmIChic0RlY29kZVR5cGUgPT0gRlhfQlNUUkMoIkRDVERlY29kZSIpIHx8CisgICAgICAgICAgICAgIGJzRGVjb2RlVHlwZSA9PSBGWF9CU1RSQygiSlBYRGVjb2RlIikpIHsKKyAgICAgICAgICAgIG1fRmxhZ3MgfD0gRlhSRU5ERVJfSU1BR0VfTE9TU1k7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQogICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IGltYWdlX3JlY3RfZiA9IG1fSW1hZ2VNYXRyaXguR2V0VW5pdFJlY3QoKTsKLSAgICBGWF9SRUNUIGltYWdlX3JlY3QgPSBpbWFnZV9yZWN0X2YuR2V0T3V0dGVyUmVjdCgpOwotICAgIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOwotICAgIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7Ci0gICAgaWYgKChGWFNZU19mYWJzKG1fSW1hZ2VNYXRyaXguYikgPj0gMC41ZiB8fCBtX0ltYWdlTWF0cml4LmEgPT0gMCkgfHwKLSAgICAgICAgICAgIChGWFNZU19mYWJzKG1fSW1hZ2VNYXRyaXguYykgPj0gMC41ZiB8fCBtX0ltYWdlTWF0cml4LmQgPT0gMCkgKSB7Ci0gICAgICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fYlByaW50ICYmICEobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQkxFTkRfTU9ERSkpIHsKLSAgICAgICAgICAgIG1fUmVzdWx0ID0gRkFMU0U7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTk9JTUFHRVNNT09USCkgeworICAgIG1fRmxhZ3MgfD0gRlhESUJfTk9TTU9PVEg7CisgIH0gZWxzZSBpZiAobV9wSW1hZ2VPYmplY3QtPm1fcEltYWdlLT5Jc0ludGVycG9sKCkpIHsKKyAgICBtX0ZsYWdzIHw9IEZYRElCX0lOVEVSUE9MOworICB9CisgIGlmIChtX0xvYWRlci5tX3BNYXNrKSB7CisgICAgcmV0dXJuIERyYXdNYXNrZWRJbWFnZSgpOworICB9CisgIGlmIChtX2JQYXR0ZXJuQ29sb3IpIHsKKyAgICByZXR1cm4gRHJhd1BhdHRlcm5JbWFnZShtX3BPYmoyRGV2aWNlKTsKKyAgfQorICBpZiAobV9CaXRtYXBBbHBoYSA9PSAyNTUgJiYgcEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxPUCAmJgorICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9PUE1vZGUgPT0gMCAmJgorICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9CbGVuZFR5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmCisgICAgICBwR2VuZXJhbFN0YXRlLT5tX1N0cm9rZUFscGhhID09IDEgJiYgcEdlbmVyYWxTdGF0ZS0+bV9GaWxsQWxwaGEgPT0gMSkgeworICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IE5VTEw7CisgICAgQ1BERl9QYWdlKiBwUGFnZSA9IE5VTEw7CisgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dC0+bV9wUGFnZUNhY2hlKSB7CisgICAgICBwUGFnZSA9IG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dC0+bV9wUGFnZUNhY2hlLT5HZXRQYWdlKCk7CisgICAgICBwRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHBEb2N1bWVudCA9IG1fcEltYWdlT2JqZWN0LT5tX3BJbWFnZS0+R2V0RG9jdW1lbnQoKTsKKyAgICB9CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcyA9IHBQYWdlID8gcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMgOiBOVUxMOworICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPQorICAgICAgICBtX3BJbWFnZU9iamVjdC0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpLT5HZXREaWN0KCktPkdldEVsZW1lbnRWYWx1ZSgKKyAgICAgICAgICAgIEZYX0JTVFJDKCJDb2xvclNwYWNlIikpOworICAgIENQREZfQ29sb3JTcGFjZSogcENvbG9yU3BhY2UgPQorICAgICAgICBwRG9jdW1lbnQtPkxvYWRDb2xvclNwYWNlKHBDU09iaiwgcFBhZ2VSZXNvdXJjZXMpOworICAgIGlmIChwQ29sb3JTcGFjZSkgeworICAgICAgaW50IGZvcm1hdCA9IHBDb2xvclNwYWNlLT5HZXRGYW1pbHkoKTsKKyAgICAgIGlmIChmb3JtYXQgPT0gUERGQ1NfREVWSUNFQ01ZSyB8fCBmb3JtYXQgPT0gUERGQ1NfU0VQQVJBVElPTiB8fAorICAgICAgICAgIGZvcm1hdCA9PSBQREZDU19ERVZJQ0VOKSB7CisgICAgICAgIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfREFSS0VOOworICAgICAgfQorICAgICAgcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1NPYmopOworICAgIH0KKyAgfQorICByZXR1cm4gU3RhcnRESUJTb3VyY2UoKTsKK30KK0ZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kVHlwZSkgeworICBtX3BSZW5kZXJTdGF0dXMgPSBwU3RhdHVzOworICBtX2JTdGRDUyA9IGJTdGRDUzsKKyAgbV9wSW1hZ2VPYmplY3QgPSAoQ1BERl9JbWFnZU9iamVjdCopcE9iajsKKyAgbV9CbGVuZFR5cGUgPSBibGVuZFR5cGU7CisgIG1fcE9iajJEZXZpY2UgPSBwT2JqMkRldmljZTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwT0MgPSBtX3BJbWFnZU9iamVjdC0+bV9wSW1hZ2UtPkdldE9DKCk7CisgIGlmIChwT0MgJiYgbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9wT0NDb250ZXh0ICYmCisgICAgICAhbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9wT0NDb250ZXh0LT5DaGVja09DR1Zpc2libGUocE9DKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX0ltYWdlTWF0cml4ID0gbV9wSW1hZ2VPYmplY3QtPm1fTWF0cml4OworICBtX0ltYWdlTWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOworICBpZiAoU3RhcnRMb2FkRElCU291cmNlKCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gU3RhcnRSZW5kZXJESUJTb3VyY2UoKTsKK30KK0ZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYml0bWFwX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZFR5cGUpIHsKKyAgbV9wUmVuZGVyU3RhdHVzID0gcFN0YXR1czsKKyAgbV9wRElCU291cmNlID0gcERJQlNvdXJjZTsKKyAgbV9GaWxsQXJnYiA9IGJpdG1hcF9hcmdiOworICBtX0JpdG1hcEFscGhhID0gYml0bWFwX2FscGhhOworICBtX0ltYWdlTWF0cml4ID0gKnBJbWFnZTJEZXZpY2U7CisgIG1fRmxhZ3MgPSBmbGFnczsKKyAgbV9iU3RkQ1MgPSBiU3RkQ1M7CisgIG1fQmxlbmRUeXBlID0gYmxlbmRUeXBlOworICByZXR1cm4gU3RhcnRESUJTb3VyY2UoKTsKK30KK0ZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpEcmF3UGF0dGVybkltYWdlKGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKSB7CisgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fYlByaW50ICYmCisgICAgICAhKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7CisgICAgbV9SZXN1bHQgPSBGQUxTRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfUkVDVCByZWN0ID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpLkdldE91dHRlclJlY3QoKTsKKyAgcmVjdC5JbnRlcnNlY3QobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldENsaXBCb3goKSk7CisgIGlmIChyZWN0LklzRW1wdHkoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfQWZmaW5lTWF0cml4IG5ld19tYXRyaXggPSBtX0ltYWdlTWF0cml4OworICBuZXdfbWF0cml4LlRyYW5zbGF0ZUkoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsKKyAgaW50IHdpZHRoID0gcmVjdC5XaWR0aCgpOworICBpbnQgaGVpZ2h0ID0gcmVjdC5IZWlnaHQoKTsKKyAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTE7CisgIGlmICghYml0bWFwX2RldmljZTEuQ3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgRlhESUJfUmdiMzIpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPkNsZWFyKDB4ZmZmZmZmKTsKKyAgeworICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CisgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UxLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAmbV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIFRSVUUpOworICAgIENGWF9NYXRyaXggcGF0dGVybkRldmljZSA9ICpwT2JqMkRldmljZTsKKyAgICBwYXR0ZXJuRGV2aWNlLlRyYW5zbGF0ZSgoRlhfRkxPQVQpLXJlY3QubGVmdCwgKEZYX0ZMT0FUKS1yZWN0LnRvcCk7CisgICAgaWYgKG1fcFBhdHRlcm4tPm1fUGF0dGVyblR5cGUgPT0gUEFUVEVSTl9USUxJTkcpIHsKKyAgICAgIGJpdG1hcF9yZW5kZXIuRHJhd1RpbGluZ1BhdHRlcm4oKENQREZfVGlsaW5nUGF0dGVybiopbV9wUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSW1hZ2VPYmplY3QsICZwYXR0ZXJuRGV2aWNlLCBGQUxTRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJpdG1hcF9yZW5kZXIuRHJhd1NoYWRpbmdQYXR0ZXJuKChDUERGX1NoYWRpbmdQYXR0ZXJuKiltX3BQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSW1hZ2VPYmplY3QsICZwYXR0ZXJuRGV2aWNlLCBGQUxTRSk7CisgICAgfQorICB9CisgIHsKKyAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlMjsKKyAgICBpZiAoIWJpdG1hcF9kZXZpY2UyLkNyZWF0ZShyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIEZYRElCXzhicHBSZ2IpKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCktPkNsZWFyKDApOworICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CisgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fYkRyb3BPYmplY3RzLCBOVUxMLCBUUlVFKTsKKyAgICBDUERGX0ltYWdlUmVuZGVyZXIgaW1hZ2VfcmVuZGVyOworICAgIGlmIChpbWFnZV9yZW5kZXIuU3RhcnQoJmJpdG1hcF9yZW5kZXIsIG1fcERJQlNvdXJjZSwgMHhmZmZmZmZmZiwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19tYXRyaXgsIG1fRmxhZ3MsIFRSVUUpKSB7CisgICAgICBpbWFnZV9yZW5kZXIuQ29udGludWUoTlVMTCk7CisgICAgfQorICAgIGlmIChtX0xvYWRlci5tX01hdHRlQ29sb3IgIT0gMHhmZmZmZmZmZikgeworICAgICAgaW50IG1hdHRlX3IgPSBGWEFSR0JfUihtX0xvYWRlci5tX01hdHRlQ29sb3IpOworICAgICAgaW50IG1hdHRlX2cgPSBGWEFSR0JfRyhtX0xvYWRlci5tX01hdHRlQ29sb3IpOworICAgICAgaW50IG1hdHRlX2IgPSBGWEFSR0JfQihtX0xvYWRlci5tX01hdHRlQ29sb3IpOworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPQorICAgICAgICAgICAgKHVpbnQ4X3QqKWJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICBjb25zdCB1aW50OF90KiBtYXNrX3NjYW4gPSBiaXRtYXBfZGV2aWNlMi5HZXRCaXRtYXAoKS0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgaW50IGFscGhhID0gKm1hc2tfc2NhbisrOworICAgICAgICAgIGlmIChhbHBoYSkgeworICAgICAgICAgICAgaW50IG9yaWcgPSAoKmRlc3Rfc2NhbiAtIG1hdHRlX2IpICogMjU1IC8gYWxwaGEgKyBtYXR0ZV9iOworICAgICAgICAgICAgaWYgKG9yaWcgPCAwKSB7CisgICAgICAgICAgICAgIG9yaWcgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID4gMjU1KSB7CisgICAgICAgICAgICAgIG9yaWcgPSAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBvcmlnOworICAgICAgICAgICAgb3JpZyA9ICgqZGVzdF9zY2FuIC0gbWF0dGVfZykgKiAyNTUgLyBhbHBoYSArIG1hdHRlX2c7CisgICAgICAgICAgICBpZiAob3JpZyA8IDApIHsKKyAgICAgICAgICAgICAgb3JpZyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWcgPiAyNTUpIHsKKyAgICAgICAgICAgICAgb3JpZyA9IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG9yaWc7CisgICAgICAgICAgICBvcmlnID0gKCpkZXN0X3NjYW4gLSBtYXR0ZV9yKSAqIDI1NSAvIGFscGhhICsgbWF0dGVfcjsKKyAgICAgICAgICAgIGlmIChvcmlnIDwgMCkgeworICAgICAgICAgICAgICBvcmlnID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZyA+IDI1NSkgeworICAgICAgICAgICAgICBvcmlnID0gMjU1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gb3JpZzsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7Ci0gICAgICAgIGNsaXBfYm94LkludGVyc2VjdChpbWFnZV9yZWN0KTsKLSAgICAgICAgbV9TdGF0dXMgPSAyOwotICAgICAgICBtX3BUcmFuc2Zvcm1lciA9IG5ldyBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjsKLSAgICAgICAgbV9wVHJhbnNmb3JtZXItPlN0YXJ0KG1fcERJQlNvdXJjZSwgJm1fSW1hZ2VNYXRyaXgsIG1fRmxhZ3MsICZjbGlwX2JveCk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQogICAgIH0KLSAgICBpZiAobV9JbWFnZU1hdHJpeC5hIDwgMCkgewotICAgICAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7CisgICAgYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCktPkNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spOworICAgIGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5NdWx0aXBseUFscGhhKGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpKTsKKyAgICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+TXVsdGlwbHlBbHBoYSgyNTUpOworICB9CisgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHMoYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCksIHJlY3QubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCwgbV9CbGVuZFR5cGUpOworICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6RHJhd01hc2tlZEltYWdlKCkgeworICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX2JQcmludCAmJgorICAgICAgIShtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgeworICAgIG1fUmVzdWx0ID0gRkFMU0U7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX1JFQ1QgcmVjdCA9IG1fSW1hZ2VNYXRyaXguR2V0VW5pdFJlY3QoKS5HZXRPdXR0ZXJSZWN0KCk7CisgIHJlY3QuSW50ZXJzZWN0KG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOworICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0FmZmluZU1hdHJpeCBuZXdfbWF0cml4ID0gbV9JbWFnZU1hdHJpeDsKKyAgbmV3X21hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CisgIGludCB3aWR0aCA9IHJlY3QuV2lkdGgoKTsKKyAgaW50IGhlaWdodCA9IHJlY3QuSGVpZ2h0KCk7CisgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2UxOworICBpZiAoIWJpdG1hcF9kZXZpY2UxLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IzMikpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+Q2xlYXIoMHhmZmZmZmYpOworICB7CisgICAgQ1BERl9SZW5kZXJTdGF0dXMgYml0bWFwX3JlbmRlcjsKKyAgICBiaXRtYXBfcmVuZGVyLkluaXRpYWxpemUobV9wUmVuZGVyU3RhdHVzLT5tX3BDb250ZXh0LCAmYml0bWFwX2RldmljZTEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIFRSVUUpOworICAgIENQREZfSW1hZ2VSZW5kZXJlciBpbWFnZV9yZW5kZXI7CisgICAgaWYgKGltYWdlX3JlbmRlci5TdGFydCgmYml0bWFwX3JlbmRlciwgbV9wRElCU291cmNlLCAwLCAyNTUsICZuZXdfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9GbGFncywgVFJVRSkpIHsKKyAgICAgIGltYWdlX3JlbmRlci5Db250aW51ZShOVUxMKTsKICAgICB9Ci0gICAgaWYgKG1fSW1hZ2VNYXRyaXguZCA+IDApIHsKLSAgICAgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7CisgIH0KKyAgeworICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2UyOworICAgIGlmICghYml0bWFwX2RldmljZTIuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCXzhicHBSZ2IpKSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgaW50IGRlc3RfbGVmdCwgZGVzdF90b3A7Ci0gICAgZGVzdF9sZWZ0ID0gZGVzdF93aWR0aCA+IDAgPyBpbWFnZV9yZWN0LmxlZnQgOiBpbWFnZV9yZWN0LnJpZ2h0OwotICAgIGRlc3RfdG9wID0gZGVzdF9oZWlnaHQgPiAwID8gaW1hZ2VfcmVjdC50b3AgOiBpbWFnZV9yZWN0LmJvdHRvbTsKLSAgICBpZiAobV9wRElCU291cmNlLT5Jc09wYXF1ZUltYWdlKCkgJiYgbV9CaXRtYXBBbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GbGFncywgTlVMTCwgbV9CbGVuZFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCktPkNsZWFyKDApOworICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CisgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fYkRyb3BPYmplY3RzLCBOVUxMLCBUUlVFKTsKKyAgICBDUERGX0ltYWdlUmVuZGVyZXIgaW1hZ2VfcmVuZGVyOworICAgIGlmIChpbWFnZV9yZW5kZXIuU3RhcnQoJmJpdG1hcF9yZW5kZXIsIG1fTG9hZGVyLm1fcE1hc2ssIDB4ZmZmZmZmZmYsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfbWF0cml4LCBtX0ZsYWdzLCBUUlVFKSkgeworICAgICAgaW1hZ2VfcmVuZGVyLkNvbnRpbnVlKE5VTEwpOworICAgIH0KKyAgICBpZiAobV9Mb2FkZXIubV9NYXR0ZUNvbG9yICE9IDB4ZmZmZmZmZmYpIHsKKyAgICAgIGludCBtYXR0ZV9yID0gRlhBUkdCX1IobV9Mb2FkZXIubV9NYXR0ZUNvbG9yKTsKKyAgICAgIGludCBtYXR0ZV9nID0gRlhBUkdCX0cobV9Mb2FkZXIubV9NYXR0ZUNvbG9yKTsKKyAgICAgIGludCBtYXR0ZV9iID0gRlhBUkdCX0IobV9Mb2FkZXIubV9NYXR0ZUNvbG9yKTsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgICAgICh1aW50OF90KiliaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgICAgY29uc3QgdWludDhfdCogbWFza19zY2FuID0gYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCktPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgIGludCBhbHBoYSA9ICptYXNrX3NjYW4rKzsKKyAgICAgICAgICBpZiAoYWxwaGEpIHsKKyAgICAgICAgICAgIGludCBvcmlnID0gKCpkZXN0X3NjYW4gLSBtYXR0ZV9iKSAqIDI1NSAvIGFscGhhICsgbWF0dGVfYjsKKyAgICAgICAgICAgIGlmIChvcmlnIDwgMCkgeworICAgICAgICAgICAgICBvcmlnID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZyA+IDI1NSkgeworICAgICAgICAgICAgICBvcmlnID0gMjU1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gb3JpZzsKKyAgICAgICAgICAgIG9yaWcgPSAoKmRlc3Rfc2NhbiAtIG1hdHRlX2cpICogMjU1IC8gYWxwaGEgKyBtYXR0ZV9nOworICAgICAgICAgICAgaWYgKG9yaWcgPCAwKSB7CisgICAgICAgICAgICAgIG9yaWcgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID4gMjU1KSB7CisgICAgICAgICAgICAgIG9yaWcgPSAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBvcmlnOworICAgICAgICAgICAgb3JpZyA9ICgqZGVzdF9zY2FuIC0gbWF0dGVfcikgKiAyNTUgLyBhbHBoYSArIG1hdHRlX3I7CisgICAgICAgICAgICBpZiAob3JpZyA8IDApIHsKKyAgICAgICAgICAgICAgb3JpZyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWcgPiAyNTUpIHsKKyAgICAgICAgICAgICAgb3JpZyA9IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG9yaWc7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgfQogICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIGlmIChtX3BESUJTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7Ci0gICAgICAgICAgICBtX0ZpbGxBcmdiID0gRlhBUkdCX01VTF9BTFBIQShtX0ZpbGxBcmdiLCBtX0JpdG1hcEFscGhhKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlN0cmV0Y2hCaXRNYXNrKG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIG1fRmlsbEFyZ2IsIG1fRmxhZ3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KKyAgICBiaXRtYXBfZGV2aWNlMi5HZXRCaXRtYXAoKS0+Q29udmVydEZvcm1hdChGWERJQl84YnBwTWFzayk7CisgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPk11bHRpcGx5QWxwaGEoYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCkpOworICAgIGlmIChtX0JpdG1hcEFscGhhIDwgMjU1KSB7CisgICAgICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+TXVsdGlwbHlBbHBoYShtX0JpdG1hcEFscGhhKTsKICAgICB9Ci0gICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9iUHJpbnQgJiYgIShtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgewotICAgICAgICBtX1Jlc3VsdCA9IEZBTFNFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0RElCaXRzKGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLCByZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AsIG1fQmxlbmRUeXBlKTsKKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0RElCU291cmNlKCkgeworICBpZiAoIShtX0ZsYWdzICYgUkVOREVSX0ZPUkNFX0RPV05TQU1QTEUpICYmIG1fcERJQlNvdXJjZS0+R2V0QlBQKCkgPiAxKSB7CisgICAgaW50IGltYWdlX3NpemUgPSBtX3BESUJTb3VyY2UtPkdldEJQUCgpIC8gOCAqIG1fcERJQlNvdXJjZS0+R2V0V2lkdGgoKSAqCisgICAgICAgICAgICAgICAgICAgICBtX3BESUJTb3VyY2UtPkdldEhlaWdodCgpOworICAgIGlmIChpbWFnZV9zaXplID4gRlBERl9IVUdFX0lNQUdFX1NJWkUgJiYKKyAgICAgICAgIShtX0ZsYWdzICYgUkVOREVSX0ZPUkNFX0hBTEZUT05FKSkgeworICAgICAgbV9GbGFncyB8PSBSRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRTsKKyAgICB9CisgIH0KKyAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdGFydERJQml0cygKKyAgICAgICAgICBtX3BESUJTb3VyY2UsIG1fQml0bWFwQWxwaGEsIG1fRmlsbEFyZ2IsICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzLAorICAgICAgICAgIG1fRGV2aWNlSGFuZGxlLCAwLCBOVUxMLCBtX0JsZW5kVHlwZSkpIHsKKyAgICBpZiAobV9EZXZpY2VIYW5kbGUgIT0gTlVMTCkgeworICAgICAgbV9TdGF0dXMgPSAzOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfRmxvYXRSZWN0IGltYWdlX3JlY3RfZiA9IG1fSW1hZ2VNYXRyaXguR2V0VW5pdFJlY3QoKTsKKyAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKKyAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7CisgIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7CisgIGlmICgoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmIpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5hID09IDApIHx8CisgICAgICAoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmMpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5kID09IDApKSB7CisgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9iUHJpbnQgJiYKKyAgICAgICAgIShtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgeworICAgICAgbV9SZXN1bHQgPSBGQUxTRTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7Ci0gICAgRlhfUkVDVCBkZXN0X3JlY3QgPSBjbGlwX2JveDsKLSAgICBkZXN0X3JlY3QuSW50ZXJzZWN0KGltYWdlX3JlY3QpOwotICAgIEZYX1JFQ1QgZGVzdF9jbGlwKGRlc3RfcmVjdC5sZWZ0IC0gaW1hZ2VfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wIC0gaW1hZ2VfcmVjdC50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgZGVzdF9yZWN0LnJpZ2h0IC0gaW1hZ2VfcmVjdC5sZWZ0LCBkZXN0X3JlY3QuYm90dG9tIC0gaW1hZ2VfcmVjdC50b3ApOwotICAgIENGWF9ESUJpdG1hcCogcFN0cmV0Y2hlZCA9IG1fcERJQlNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX0ZsYWdzLCAmZGVzdF9jbGlwKTsKLSAgICBpZiAocFN0cmV0Y2hlZCkgewotICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPkNvbXBvc2l0ZURJQml0bWFwKHBTdHJldGNoZWQsIGRlc3RfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wLCBtX0ZpbGxBcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQml0bWFwQWxwaGEsIG1fQmxlbmRUeXBlLCBGQUxTRSk7Ci0gICAgICAgIGRlbGV0ZSBwU3RyZXRjaGVkOwotICAgICAgICBwU3RyZXRjaGVkID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0Qml0bWFwQWxwaGEoKQotewotICAgIGlmIChtX3BESUJTb3VyY2UtPklzT3BhcXVlSW1hZ2UoKSkgewotICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgICAgICAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIDEsIDEpOwotICAgICAgICBwYXRoLlRyYW5zZm9ybSgmbV9JbWFnZU1hdHJpeCk7Ci0gICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IgPSBBcmdiRW5jb2RlKDB4ZmYsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEpOwotICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIE5VTEwsIE5VTEwsIGZpbGxfY29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrID0gbV9wRElCU291cmNlLT5Jc0FscGhhTWFzaygpID8gbV9wRElCU291cmNlIDogbV9wRElCU291cmNlLT5HZXRBbHBoYU1hc2soKTsKLSAgICAgICAgaWYgKEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5iKSA+PSAwLjVmIHx8IEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5jKSA+PSAwLjVmKSB7Ci0gICAgICAgICAgICBpbnQgbGVmdCwgdG9wOwotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBwQWxwaGFNYXNrLT5UcmFuc2Zvcm1UbygmbV9JbWFnZU1hdHJpeCwgbGVmdCwgdG9wKTsKLSAgICAgICAgICAgIGlmIChwVHJhbnNmb3JtZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldEJpdE1hc2socFRyYW5zZm9ybWVkLCBsZWZ0LCB0b3AsIEFyZ2JFbmNvZGUoMHhmZiwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSkpOwotICAgICAgICAgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOwotICAgICAgICAgICAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKLSAgICAgICAgICAgIGludCBkZXN0X3dpZHRoID0gbV9JbWFnZU1hdHJpeC5hID4gMCA/IGltYWdlX3JlY3QuV2lkdGgoKSA6IC1pbWFnZV9yZWN0LldpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQgPSBtX0ltYWdlTWF0cml4LmQgPiAwID8gLWltYWdlX3JlY3QuSGVpZ2h0KCkgOiBpbWFnZV9yZWN0LkhlaWdodCgpOwotICAgICAgICAgICAgaW50IGxlZnQgPSBkZXN0X3dpZHRoID4gMCA/IGltYWdlX3JlY3QubGVmdCA6IGltYWdlX3JlY3QucmlnaHQ7Ci0gICAgICAgICAgICBpbnQgdG9wID0gZGVzdF9oZWlnaHQgPiAwID8gaW1hZ2VfcmVjdC50b3AgOiBpbWFnZV9yZWN0LmJvdHRvbTsKLSAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdHJldGNoQml0TWFzayhwQWxwaGFNYXNrLCBsZWZ0LCB0b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKDB4ZmYsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wRElCU291cmNlICE9IHBBbHBoYU1hc2spIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQWxwaGFNYXNrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZiAobV9TdGF0dXMgPT0gMSkgewotICAgICAgICBpZiAobV9wUXVpY2tTdHJldGNoZXItPkNvbnRpbnVlKHBQYXVzZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BRdWlja1N0cmV0Y2hlci0+bV9wQml0bWFwLT5Jc0FscGhhTWFzaygpKQotICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldEJpdE1hc2sobV9wUXVpY2tTdHJldGNoZXItPm1fcEJpdG1hcCwgbV9wUXVpY2tTdHJldGNoZXItPm1fUmVzdWx0TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFF1aWNrU3RyZXRjaGVyLT5tX1Jlc3VsdFRvcCwgbV9GaWxsQXJnYik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHMobV9wUXVpY2tTdHJldGNoZXItPm1fcEJpdG1hcCwgbV9wUXVpY2tTdHJldGNoZXItPm1fUmVzdWx0TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUXVpY2tTdHJldGNoZXItPm1fUmVzdWx0VG9wLCBtX0JsZW5kVHlwZSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fU3RhdHVzID09IDIpIHsKLSAgICAgICAgaWYgKG1fcFRyYW5zZm9ybWVyLT5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBtX3BUcmFuc2Zvcm1lci0+bV9TdG9yZXIuRGV0YWNoKCk7Ci0gICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgbV9GaWxsQXJnYiA9IEZYQVJHQl9NVUxfQUxQSEEobV9GaWxsQXJnYiwgbV9CaXRtYXBBbHBoYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX1Jlc3VsdCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRCaXRNYXNrKHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwgbV9GaWxsQXJnYik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpIHsKLSAgICAgICAgICAgICAgICBwQml0bWFwLT5NdWx0aXBseUFscGhhKG1fQml0bWFwQWxwaGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9SZXN1bHQgPSBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0RElCaXRzKHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwgbV9CbGVuZFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBwQml0bWFwOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX1N0YXR1cyA9PSAzKSB7Ci0gICAgICAgIHJldHVybiBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+Q29udGludWVESUJpdHMobV9EZXZpY2VIYW5kbGUsIHBQYXVzZSk7Ci0gICAgfQotICAgIGlmIChtX1N0YXR1cyA9PSA0KSB7Ci0gICAgICAgIGlmIChtX0xvYWRlci5Db250aW51ZShtX0xvYWRIYW5kbGUsIHBQYXVzZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChTdGFydFJlbmRlckRJQlNvdXJjZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29udGludWUocFBhdXNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1DUERGX1F1aWNrU3RyZXRjaGVyOjpDUERGX1F1aWNrU3RyZXRjaGVyKCkKLXsKLSAgICBtX3BCaXRtYXAgPSBOVUxMOwotICAgIG1fcERlY29kZXIgPSBOVUxMOwotICAgIG1fcENTID0gTlVMTDsKLX0KLUNQREZfUXVpY2tTdHJldGNoZXI6On5DUERGX1F1aWNrU3RyZXRjaGVyKCkKLXsKLSAgICBkZWxldGUgbV9wQml0bWFwOwotICAgIGlmIChtX3BDUykgewotICAgICAgICBtX3BDUy0+UmVsZWFzZUNTKCk7Ci0gICAgfQotICAgIGRlbGV0ZSBtX3BEZWNvZGVyOwotfQotSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGbGF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgaW50IG5Db21wcywgaW50IGJwYywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKTsKLUZYX0JPT0wgQ1BERl9RdWlja1N0cmV0Y2hlcjo6U3RhcnQoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBjb25zdCBGWF9SRUNUKiBwQ2xpcEJveCkKLXsKLSAgICBpZiAoRlhTWVNfZmFicyhwSW1hZ2UyRGV2aWNlLT5hKSA8IEZYU1lTX2ZhYnMocEltYWdlMkRldmljZS0+YikgKiAxMCAmJiBGWFNZU19mYWJzKHBJbWFnZTJEZXZpY2UtPmQpIDwgRlhTWVNfZmFicyhwSW1hZ2UyRGV2aWNlLT5jKSAqIDEwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBwSW1hZ2UyRGV2aWNlLT5HZXRVbml0UmVjdCgpOwotICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgbV9EZXN0V2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7Ci0gICAgbV9EZXN0SGVpZ2h0ID0gaW1hZ2VfcmVjdC5IZWlnaHQoKTsKLSAgICBtX2JGbGlwWCA9IHBJbWFnZTJEZXZpY2UtPmEgPCAwOwotICAgIG1fYkZsaXBZID0gcEltYWdlMkRldmljZS0+ZCA+IDA7Ci0gICAgRlhfUkVDVCByZXN1bHRfcmVjdCA9ICpwQ2xpcEJveDsKLSAgICByZXN1bHRfcmVjdC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7Ci0gICAgaWYgKHJlc3VsdF9yZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fUmVzdWx0V2lkdGggPSByZXN1bHRfcmVjdC5XaWR0aCgpOwotICAgIG1fUmVzdWx0SGVpZ2h0ID0gcmVzdWx0X3JlY3QuSGVpZ2h0KCk7Ci0gICAgbV9SZXN1bHRMZWZ0ID0gcmVzdWx0X3JlY3QubGVmdDsKLSAgICBtX1Jlc3VsdFRvcCA9IHJlc3VsdF9yZWN0LnRvcDsKLSAgICBtX0NsaXBMZWZ0ID0gcmVzdWx0X3JlY3QubGVmdCAtIGltYWdlX3JlY3QubGVmdDsKLSAgICBtX0NsaXBUb3AgPSByZXN1bHRfcmVjdC50b3AgLSBpbWFnZV9yZWN0LnRvcDsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEltYWdlT2JqLT5tX3BJbWFnZS0+R2V0RGljdCgpOwotICAgIGlmIChwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpKSAhPSA4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiU01hc2siKSkgfHwgcERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJNYXNrIikpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9TcmNXaWR0aCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJXaWR0aCIpKTsKLSAgICBtX1NyY0hlaWdodCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7Ci0gICAgbV9wQ1MgPSBOVUxMOwotICAgIG1fQnBwID0gMzsKLSAgICBDUERGX09iamVjdCogcENTT2JqID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKLSAgICBpZiAocENTT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BDUyA9IENQREZfQ29sb3JTcGFjZTo6TG9hZChwSW1hZ2VPYmotPm1fcEltYWdlLT5HZXREb2N1bWVudCgpLCBwQ1NPYmopOwotICAgIGlmIChtX3BDUyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCFfSXNTdXBwb3J0ZWQobV9wQ1MpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9CcHAgPSBtX3BDUy0+Q291bnRDb21wb25lbnRzKCk7Ci0gICAgaWYgKG1fcENTLT5zUkdCKCkpIHsKLSAgICAgICAgbV9wQ1MtPlJlbGVhc2VDUygpOwotICAgICAgICBtX3BDUyA9IE5VTEw7Ci0gICAgfQotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcEltYWdlT2JqLT5tX3BJbWFnZS0+R2V0U3RyZWFtKCk7Ci0gICAgbV9TdHJlYW1BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UsIG1fU3JjV2lkdGggKiBtX1NyY0hlaWdodCAqIG1fQnBwLCBUUlVFKTsKLSAgICBtX3BEZWNvZGVyID0gTlVMTDsKLSAgICBpZiAoIW1fU3RyZWFtQWNjLkdldEltYWdlRGVjb2RlcigpLklzRW1wdHkoKSkgewotICAgICAgICBpZiAobV9TdHJlYW1BY2MuR2V0SW1hZ2VEZWNvZGVyKCkgPT0gRlhfQlNUUkMoIkRDVERlY29kZSIpKSB7Ci0gICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbSA9IG1fU3RyZWFtQWNjLkdldEltYWdlUGFyYW0oKTsKLSAgICAgICAgICAgIG1fcERlY29kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TdHJlYW1BY2MuR2V0RGF0YSgpLCBtX1N0cmVhbUFjYy5HZXRTaXplKCksIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0LCBtX0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtID8gcFBhcmFtLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJDb2xvclRyYW5zZm9ybSIpLCAxKSA6IDEpOwotICAgICAgICB9IGVsc2UgaWYgKG1fU3RyZWFtQWNjLkdldEltYWdlRGVjb2RlcigpID09IEZYX0JTVFJDKCJGbGF0ZURlY29kZSIpKSB7Ci0gICAgICAgICAgICBtX3BEZWNvZGVyID0gRlBERkFQSV9DcmVhdGVGbGF0ZURlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3RyZWFtQWNjLkdldERhdGEoKSwgbV9TdHJlYW1BY2MuR2V0U2l6ZSgpLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCwgbV9CcHAsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3RyZWFtQWNjLkdldEltYWdlUGFyYW0oKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGVjb2Rlci0+RG93blNjYWxlKG1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQpOwotICAgIH0KLSAgICBtX3BCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgIG1fcEJpdG1hcC0+Q3JlYXRlKG1fUmVzdWx0V2lkdGgsIG1fUmVzdWx0SGVpZ2h0LCBGWERJQl9SZ2IzMik7Ci0jZWxzZQotICAgIG1fcEJpdG1hcC0+Q3JlYXRlKG1fUmVzdWx0V2lkdGgsIG1fUmVzdWx0SGVpZ2h0LCBGWERJQl9SZ2IpOwotI2VuZGlmCi0gICAgbV9MaW5lSW5kZXggPSAwOworICAgIGNsaXBfYm94LkludGVyc2VjdChpbWFnZV9yZWN0KTsKKyAgICBtX1N0YXR1cyA9IDI7CisgICAgbV9wVHJhbnNmb3JtZXIgPSBuZXcgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI7CisgICAgbV9wVHJhbnNmb3JtZXItPlN0YXJ0KG1fcERJQlNvdXJjZSwgJm1fSW1hZ2VNYXRyaXgsIG1fRmxhZ3MsICZjbGlwX2JveCk7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfUXVpY2tTdHJldGNoZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIHVpbnQ4X3QqIHJlc3VsdF9idWYgPSBtX3BCaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgIGludCBzcmNfd2lkdGggPSBtX3BEZWNvZGVyID8gbV9wRGVjb2Rlci0+R2V0V2lkdGgoKSA6IG1fU3JjV2lkdGg7Ci0gICAgaW50IHNyY19oZWlnaHQgPSBtX3BEZWNvZGVyID8gbV9wRGVjb2Rlci0+R2V0SGVpZ2h0KCkgOiBtX1NyY0hlaWdodDsKLSAgICBpbnQgc3JjX3BpdGNoID0gc3JjX3dpZHRoICogbV9CcHA7Ci0gICAgd2hpbGUgKG1fTGluZUluZGV4IDwgbV9SZXN1bHRIZWlnaHQpIHsKLSAgICAgICAgaW50IGRlc3RfeSwgc3JjX3k7Ci0gICAgICAgIGlmIChtX2JGbGlwWSkgewotICAgICAgICAgICAgZGVzdF95ID0gbV9SZXN1bHRIZWlnaHQgLSBtX0xpbmVJbmRleCAtIDE7Ci0gICAgICAgICAgICBzcmNfeSA9IChtX0Rlc3RIZWlnaHQgLSAoZGVzdF95ICsgbV9DbGlwVG9wKSAtIDEpICogc3JjX2hlaWdodCAvIG1fRGVzdEhlaWdodDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RfeSA9IG1fTGluZUluZGV4OwotICAgICAgICAgICAgc3JjX3kgPSAoZGVzdF95ICsgbV9DbGlwVG9wKSAqIHNyY19oZWlnaHQgLyBtX0Rlc3RIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW47Ci0gICAgICAgIGlmIChtX3BEZWNvZGVyKSB7Ci0gICAgICAgICAgICBzcmNfc2NhbiA9IG1fcERlY29kZXItPkdldFNjYW5saW5lKHNyY195KTsKLSAgICAgICAgICAgIGlmIChzcmNfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfc2NhbiA9IG1fU3RyZWFtQWNjLkdldERhdGEoKTsKLSAgICAgICAgICAgIGlmIChzcmNfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfeSAqIHNyY19waXRjaDsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90KiByZXN1bHRfc2NhbiA9IHJlc3VsdF9idWYgKyBkZXN0X3kgKiBtX3BCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbV9SZXN1bHRXaWR0aDsgeCArKykgewotICAgICAgICAgICAgaW50IGRlc3RfeCA9IG1fQ2xpcExlZnQgKyB4OwotICAgICAgICAgICAgaW50IHNyY194ID0gKG1fYkZsaXBYID8gKG1fRGVzdFdpZHRoIC0gZGVzdF94IC0gMSkgOiBkZXN0X3gpICogc3JjX3dpZHRoIC8gbV9EZXN0V2lkdGg7Ci0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWwgPSBzcmNfc2NhbiArIHNyY194ICogbV9CcHA7Ci0gICAgICAgICAgICBpZiAobV9wQ1MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpyZXN1bHRfc2NhbiA9IHNyY19waXhlbFsyXTsKLSAgICAgICAgICAgICAgICByZXN1bHRfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAqcmVzdWx0X3NjYW4gPSBzcmNfcGl4ZWxbMV07Ci0gICAgICAgICAgICAgICAgcmVzdWx0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKnJlc3VsdF9zY2FuID0gc3JjX3BpeGVsWzBdOwotICAgICAgICAgICAgICAgIHJlc3VsdF9zY2FuICsrOwotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICAgICAgICAgIHJlc3VsdF9zY2FuICsrOwotI2VuZGlmCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fcENTLT5UcmFuc2xhdGVJbWFnZUxpbmUocmVzdWx0X3NjYW4sIHNyY19waXhlbCwgMSwgMCwgMCk7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICAgICAgcmVzdWx0X3NjYW4gKz0gNDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgcmVzdWx0X3NjYW4gKz0gMzsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fTGluZUluZGV4ICsrOwotICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KKyAgfQorICBpZiAobV9JbWFnZU1hdHJpeC5hIDwgMCkgeworICAgIGRlc3Rfd2lkdGggPSAtZGVzdF93aWR0aDsKKyAgfQorICBpZiAobV9JbWFnZU1hdHJpeC5kID4gMCkgeworICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0OworICB9CisgIGludCBkZXN0X2xlZnQsIGRlc3RfdG9wOworICBkZXN0X2xlZnQgPSBkZXN0X3dpZHRoID4gMCA/IGltYWdlX3JlY3QubGVmdCA6IGltYWdlX3JlY3QucmlnaHQ7CisgIGRlc3RfdG9wID0gZGVzdF9oZWlnaHQgPiAwID8gaW1hZ2VfcmVjdC50b3AgOiBpbWFnZV9yZWN0LmJvdHRvbTsKKyAgaWYgKG1fcERJQlNvdXJjZS0+SXNPcGFxdWVJbWFnZSgpICYmIG1fQml0bWFwQWxwaGEgPT0gMjU1KSB7CisgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKAorICAgICAgICAgICAgbV9wRElCU291cmNlLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GbGFncywKKyAgICAgICAgICAgIE5VTEwsIG1fQmxlbmRUeXBlKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgfQorICBpZiAobV9wRElCU291cmNlLT5Jc0FscGhhTWFzaygpKSB7CisgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7CisgICAgICBtX0ZpbGxBcmdiID0gRlhBUkdCX01VTF9BTFBIQShtX0ZpbGxBcmdiLCBtX0JpdG1hcEFscGhhKTsKKyAgICB9CisgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdHJldGNoQml0TWFzaygKKyAgICAgICAgICAgIG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICBtX0ZpbGxBcmdiLCBtX0ZsYWdzKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX2JQcmludCAmJgorICAgICAgIShtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgeworICAgIG1fUmVzdWx0ID0gRkFMU0U7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CisgIEZYX1JFQ1QgZGVzdF9yZWN0ID0gY2xpcF9ib3g7CisgIGRlc3RfcmVjdC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7CisgIEZYX1JFQ1QgZGVzdF9jbGlwKAorICAgICAgZGVzdF9yZWN0LmxlZnQgLSBpbWFnZV9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3AgLSBpbWFnZV9yZWN0LnRvcCwKKyAgICAgIGRlc3RfcmVjdC5yaWdodCAtIGltYWdlX3JlY3QubGVmdCwgZGVzdF9yZWN0LmJvdHRvbSAtIGltYWdlX3JlY3QudG9wKTsKKyAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0KKyAgICAgIG1fcERJQlNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX0ZsYWdzLCAmZGVzdF9jbGlwKTsKKyAgaWYgKHBTdHJldGNoZWQpIHsKKyAgICBtX3BSZW5kZXJTdGF0dXMtPkNvbXBvc2l0ZURJQml0bWFwKHBTdHJldGNoZWQsIGRlc3RfcmVjdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yZWN0LnRvcCwgbV9GaWxsQXJnYiwgbV9CaXRtYXBBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBGQUxTRSk7CisgICAgZGVsZXRlIHBTdHJldGNoZWQ7CisgICAgcFN0cmV0Y2hlZCA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0Qml0bWFwQWxwaGEoKSB7CisgIGlmIChtX3BESUJTb3VyY2UtPklzT3BhcXVlSW1hZ2UoKSkgeworICAgIENGWF9QYXRoRGF0YSBwYXRoOworICAgIHBhdGguQXBwZW5kUmVjdCgwLCAwLCAxLCAxKTsKKyAgICBwYXRoLlRyYW5zZm9ybSgmbV9JbWFnZU1hdHJpeCk7CisgICAgRlhfRFdPUkQgZmlsbF9jb2xvciA9CisgICAgICAgIEFyZ2JFbmNvZGUoMHhmZiwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSk7CisgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBOVUxMLCBOVUxMLCBmaWxsX2NvbG9yLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORyk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzayA9IG1fcERJQlNvdXJjZS0+SXNBbHBoYU1hc2soKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX3BESUJTb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9wRElCU291cmNlLT5HZXRBbHBoYU1hc2soKTsKKyAgICBpZiAoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmIpID49IDAuNWYgfHwKKyAgICAgICAgRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmMpID49IDAuNWYpIHsKKyAgICAgIGludCBsZWZ0LCB0b3A7CisgICAgICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9CisgICAgICAgICAgcEFscGhhTWFzay0+VHJhbnNmb3JtVG8oJm1fSW1hZ2VNYXRyaXgsIGxlZnQsIHRvcCk7CisgICAgICBpZiAocFRyYW5zZm9ybWVkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0Qml0TWFzaygKKyAgICAgICAgICBwVHJhbnNmb3JtZWQsIGxlZnQsIHRvcCwKKyAgICAgICAgICBBcmdiRW5jb2RlKDB4ZmYsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEpKTsKKyAgICAgIGRlbGV0ZSBwVHJhbnNmb3JtZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOworICAgICAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKKyAgICAgIGludCBkZXN0X3dpZHRoID0KKyAgICAgICAgICBtX0ltYWdlTWF0cml4LmEgPiAwID8gaW1hZ2VfcmVjdC5XaWR0aCgpIDogLWltYWdlX3JlY3QuV2lkdGgoKTsKKyAgICAgIGludCBkZXN0X2hlaWdodCA9CisgICAgICAgICAgbV9JbWFnZU1hdHJpeC5kID4gMCA/IC1pbWFnZV9yZWN0LkhlaWdodCgpIDogaW1hZ2VfcmVjdC5IZWlnaHQoKTsKKyAgICAgIGludCBsZWZ0ID0gZGVzdF93aWR0aCA+IDAgPyBpbWFnZV9yZWN0LmxlZnQgOiBpbWFnZV9yZWN0LnJpZ2h0OworICAgICAgaW50IHRvcCA9IGRlc3RfaGVpZ2h0ID4gMCA/IGltYWdlX3JlY3QudG9wIDogaW1hZ2VfcmVjdC5ib3R0b207CisgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U3RyZXRjaEJpdE1hc2soCisgICAgICAgICAgcEFscGhhTWFzaywgbGVmdCwgdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKKyAgICAgICAgICBBcmdiRW5jb2RlKDB4ZmYsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEpKTsKKyAgICB9CisgICAgaWYgKG1fcERJQlNvdXJjZSAhPSBwQWxwaGFNYXNrKSB7CisgICAgICBkZWxldGUgcEFscGhhTWFzazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGlmIChtX1N0YXR1cyA9PSAxKSB7CisgICAgaWYgKG1fcFF1aWNrU3RyZXRjaGVyLT5Db250aW51ZShwUGF1c2UpKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaWYgKG1fcFF1aWNrU3RyZXRjaGVyLT5tX3BCaXRtYXAtPklzQWxwaGFNYXNrKCkpCisgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0Qml0TWFzaygKKyAgICAgICAgICBtX3BRdWlja1N0cmV0Y2hlci0+bV9wQml0bWFwLCBtX3BRdWlja1N0cmV0Y2hlci0+bV9SZXN1bHRMZWZ0LAorICAgICAgICAgIG1fcFF1aWNrU3RyZXRjaGVyLT5tX1Jlc3VsdFRvcCwgbV9GaWxsQXJnYik7CisgICAgZWxzZQorICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldERJQml0cygKKyAgICAgICAgICBtX3BRdWlja1N0cmV0Y2hlci0+bV9wQml0bWFwLCBtX3BRdWlja1N0cmV0Y2hlci0+bV9SZXN1bHRMZWZ0LAorICAgICAgICAgIG1fcFF1aWNrU3RyZXRjaGVyLT5tX1Jlc3VsdFRvcCwgbV9CbGVuZFR5cGUpOwogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9TdGF0dXMgPT0gMikgeworICAgIGlmIChtX3BUcmFuc2Zvcm1lci0+Q29udGludWUocFBhdXNlKSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG1fcFRyYW5zZm9ybWVyLT5tX1N0b3Jlci5EZXRhY2goKTsKKyAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpIHsKKyAgICAgICAgbV9GaWxsQXJnYiA9IEZYQVJHQl9NVUxfQUxQSEEobV9GaWxsQXJnYiwgbV9CaXRtYXBBbHBoYSk7CisgICAgICB9CisgICAgICBtX1Jlc3VsdCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRCaXRNYXNrKAorICAgICAgICAgIHBCaXRtYXAsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwKKyAgICAgICAgICBtX0ZpbGxBcmdiKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7CisgICAgICAgIHBCaXRtYXAtPk11bHRpcGx5QWxwaGEobV9CaXRtYXBBbHBoYSk7CisgICAgICB9CisgICAgICBtX1Jlc3VsdCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHMoCisgICAgICAgICAgcEJpdG1hcCwgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0TGVmdCwgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0VG9wLAorICAgICAgICAgIG1fQmxlbmRUeXBlKTsKKyAgICB9CisgICAgZGVsZXRlIHBCaXRtYXA7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX1N0YXR1cyA9PSAzKSB7CisgICAgcmV0dXJuIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5Db250aW51ZURJQml0cyhtX0RldmljZUhhbmRsZSwgcFBhdXNlKTsKKyAgfQorICBpZiAobV9TdGF0dXMgPT0gNCkgeworICAgIGlmIChtX0xvYWRlci5Db250aW51ZShtX0xvYWRIYW5kbGUsIHBQYXVzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAoU3RhcnRSZW5kZXJESUJTb3VyY2UoKSkgeworICAgICAgcmV0dXJuIENvbnRpbnVlKHBQYXVzZSk7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KK0NQREZfUXVpY2tTdHJldGNoZXI6OkNQREZfUXVpY2tTdHJldGNoZXIoKSB7CisgIG1fcEJpdG1hcCA9IE5VTEw7CisgIG1fcERlY29kZXIgPSBOVUxMOworICBtX3BDUyA9IE5VTEw7Cit9CitDUERGX1F1aWNrU3RyZXRjaGVyOjp+Q1BERl9RdWlja1N0cmV0Y2hlcigpIHsKKyAgZGVsZXRlIG1fcEJpdG1hcDsKKyAgaWYgKG1fcENTKSB7CisgICAgbV9wQ1MtPlJlbGVhc2VDUygpOworICB9CisgIGRlbGV0ZSBtX3BEZWNvZGVyOworfQorSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGbGF0ZURlY29kZXIoCisgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCwKKyAgICBpbnQgbkNvbXBzLAorICAgIGludCBicGMsCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKTsKK0ZYX0JPT0wgQ1BERl9RdWlja1N0cmV0Y2hlcjo6U3RhcnQoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcEJveCkgeworICBpZiAoRlhTWVNfZmFicyhwSW1hZ2UyRGV2aWNlLT5hKSA8IEZYU1lTX2ZhYnMocEltYWdlMkRldmljZS0+YikgKiAxMCAmJgorICAgICAgRlhTWVNfZmFicyhwSW1hZ2UyRGV2aWNlLT5kKSA8IEZYU1lTX2ZhYnMocEltYWdlMkRldmljZS0+YykgKiAxMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfRmxvYXRSZWN0IGltYWdlX3JlY3RfZiA9IHBJbWFnZTJEZXZpY2UtPkdldFVuaXRSZWN0KCk7CisgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CisgIG1fRGVzdFdpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOworICBtX0Rlc3RIZWlnaHQgPSBpbWFnZV9yZWN0LkhlaWdodCgpOworICBtX2JGbGlwWCA9IHBJbWFnZTJEZXZpY2UtPmEgPCAwOworICBtX2JGbGlwWSA9IHBJbWFnZTJEZXZpY2UtPmQgPiAwOworICBGWF9SRUNUIHJlc3VsdF9yZWN0ID0gKnBDbGlwQm94OworICByZXN1bHRfcmVjdC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7CisgIGlmIChyZXN1bHRfcmVjdC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9SZXN1bHRXaWR0aCA9IHJlc3VsdF9yZWN0LldpZHRoKCk7CisgIG1fUmVzdWx0SGVpZ2h0ID0gcmVzdWx0X3JlY3QuSGVpZ2h0KCk7CisgIG1fUmVzdWx0TGVmdCA9IHJlc3VsdF9yZWN0LmxlZnQ7CisgIG1fUmVzdWx0VG9wID0gcmVzdWx0X3JlY3QudG9wOworICBtX0NsaXBMZWZ0ID0gcmVzdWx0X3JlY3QubGVmdCAtIGltYWdlX3JlY3QubGVmdDsKKyAgbV9DbGlwVG9wID0gcmVzdWx0X3JlY3QudG9wIC0gaW1hZ2VfcmVjdC50b3A7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwSW1hZ2VPYmotPm1fcEltYWdlLT5HZXREaWN0KCk7CisgIGlmIChwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpKSAhPSA4KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlNNYXNrIikpIHx8IHBEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiTWFzayIpKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX1NyY1dpZHRoID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIldpZHRoIikpOworICBtX1NyY0hlaWdodCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7CisgIG1fcENTID0gTlVMTDsKKyAgbV9CcHAgPSAzOworICBDUERGX09iamVjdCogcENTT2JqID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKKyAgaWYgKHBDU09iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcENTID0gQ1BERl9Db2xvclNwYWNlOjpMb2FkKHBJbWFnZU9iai0+bV9wSW1hZ2UtPkdldERvY3VtZW50KCksIHBDU09iaik7CisgIGlmIChtX3BDUyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghX0lzU3VwcG9ydGVkKG1fcENTKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX0JwcCA9IG1fcENTLT5Db3VudENvbXBvbmVudHMoKTsKKyAgaWYgKG1fcENTLT5zUkdCKCkpIHsKKyAgICBtX3BDUy0+UmVsZWFzZUNTKCk7CisgICAgbV9wQ1MgPSBOVUxMOworICB9CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcEltYWdlT2JqLT5tX3BJbWFnZS0+R2V0U3RyZWFtKCk7CisgIG1fU3RyZWFtQWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFLCBtX1NyY1dpZHRoICogbV9TcmNIZWlnaHQgKiBtX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisgIG1fcERlY29kZXIgPSBOVUxMOworICBpZiAoIW1fU3RyZWFtQWNjLkdldEltYWdlRGVjb2RlcigpLklzRW1wdHkoKSkgeworICAgIGlmIChtX1N0cmVhbUFjYy5HZXRJbWFnZURlY29kZXIoKSA9PSBGWF9CU1RSQygiRENURGVjb2RlIikpIHsKKyAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtID0gbV9TdHJlYW1BY2MuR2V0SW1hZ2VQYXJhbSgpOworICAgICAgbV9wRGVjb2RlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKAorICAgICAgICAgIG1fU3RyZWFtQWNjLkdldERhdGEoKSwgbV9TdHJlYW1BY2MuR2V0U2l6ZSgpLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCwKKyAgICAgICAgICBtX0JwcCwKKyAgICAgICAgICBwUGFyYW0gPyBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbG9yVHJhbnNmb3JtIiksIDEpIDogMSk7CisgICAgfSBlbHNlIGlmIChtX1N0cmVhbUFjYy5HZXRJbWFnZURlY29kZXIoKSA9PSBGWF9CU1RSQygiRmxhdGVEZWNvZGUiKSkgeworICAgICAgbV9wRGVjb2RlciA9IEZQREZBUElfQ3JlYXRlRmxhdGVEZWNvZGVyKAorICAgICAgICAgIG1fU3RyZWFtQWNjLkdldERhdGEoKSwgbV9TdHJlYW1BY2MuR2V0U2l6ZSgpLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCwKKyAgICAgICAgICBtX0JwcCwgOCwgbV9TdHJlYW1BY2MuR2V0SW1hZ2VQYXJhbSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBtX3BEZWNvZGVyLT5Eb3duU2NhbGUobV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodCk7CisgIH0KKyAgbV9wQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICBtX3BCaXRtYXAtPkNyZWF0ZShtX1Jlc3VsdFdpZHRoLCBtX1Jlc3VsdEhlaWdodCwgRlhESUJfUmdiMzIpOworI2Vsc2UKKyAgbV9wQml0bWFwLT5DcmVhdGUobV9SZXN1bHRXaWR0aCwgbV9SZXN1bHRIZWlnaHQsIEZYRElCX1JnYik7CisjZW5kaWYKKyAgbV9MaW5lSW5kZXggPSAwOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9RdWlja1N0cmV0Y2hlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgdWludDhfdCogcmVzdWx0X2J1ZiA9IG1fcEJpdG1hcC0+R2V0QnVmZmVyKCk7CisgIGludCBzcmNfd2lkdGggPSBtX3BEZWNvZGVyID8gbV9wRGVjb2Rlci0+R2V0V2lkdGgoKSA6IG1fU3JjV2lkdGg7CisgIGludCBzcmNfaGVpZ2h0ID0gbV9wRGVjb2RlciA/IG1fcERlY29kZXItPkdldEhlaWdodCgpIDogbV9TcmNIZWlnaHQ7CisgIGludCBzcmNfcGl0Y2ggPSBzcmNfd2lkdGggKiBtX0JwcDsKKyAgd2hpbGUgKG1fTGluZUluZGV4IDwgbV9SZXN1bHRIZWlnaHQpIHsKKyAgICBpbnQgZGVzdF95LCBzcmNfeTsKKyAgICBpZiAobV9iRmxpcFkpIHsKKyAgICAgIGRlc3RfeSA9IG1fUmVzdWx0SGVpZ2h0IC0gbV9MaW5lSW5kZXggLSAxOworICAgICAgc3JjX3kgPQorICAgICAgICAgIChtX0Rlc3RIZWlnaHQgLSAoZGVzdF95ICsgbV9DbGlwVG9wKSAtIDEpICogc3JjX2hlaWdodCAvIG1fRGVzdEhlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdF95ID0gbV9MaW5lSW5kZXg7CisgICAgICBzcmNfeSA9IChkZXN0X3kgKyBtX0NsaXBUb3ApICogc3JjX2hlaWdodCAvIG1fRGVzdEhlaWdodDsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW47CisgICAgaWYgKG1fcERlY29kZXIpIHsKKyAgICAgIHNyY19zY2FuID0gbV9wRGVjb2Rlci0+R2V0U2NhbmxpbmUoc3JjX3kpOworICAgICAgaWYgKHNyY19zY2FuID09IE5VTEwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19zY2FuID0gbV9TdHJlYW1BY2MuR2V0RGF0YSgpOworICAgICAgaWYgKHNyY19zY2FuID09IE5VTEwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBzcmNfc2NhbiArPSBzcmNfeSAqIHNyY19waXRjaDsKKyAgICB9CisgICAgdWludDhfdCogcmVzdWx0X3NjYW4gPSByZXN1bHRfYnVmICsgZGVzdF95ICogbV9wQml0bWFwLT5HZXRQaXRjaCgpOworICAgIGZvciAoaW50IHggPSAwOyB4IDwgbV9SZXN1bHRXaWR0aDsgeCsrKSB7CisgICAgICBpbnQgZGVzdF94ID0gbV9DbGlwTGVmdCArIHg7CisgICAgICBpbnQgc3JjX3ggPSAobV9iRmxpcFggPyAobV9EZXN0V2lkdGggLSBkZXN0X3ggLSAxKSA6IGRlc3RfeCkgKiBzcmNfd2lkdGggLworICAgICAgICAgICAgICAgICAgbV9EZXN0V2lkdGg7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWwgPSBzcmNfc2NhbiArIHNyY194ICogbV9CcHA7CisgICAgICBpZiAobV9wQ1MgPT0gTlVMTCkgeworICAgICAgICAqcmVzdWx0X3NjYW4gPSBzcmNfcGl4ZWxbMl07CisgICAgICAgIHJlc3VsdF9zY2FuKys7CisgICAgICAgICpyZXN1bHRfc2NhbiA9IHNyY19waXhlbFsxXTsKKyAgICAgICAgcmVzdWx0X3NjYW4rKzsKKyAgICAgICAgKnJlc3VsdF9zY2FuID0gc3JjX3BpeGVsWzBdOworICAgICAgICByZXN1bHRfc2NhbisrOworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICAgIHJlc3VsdF9zY2FuKys7CisjZW5kaWYKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fcENTLT5UcmFuc2xhdGVJbWFnZUxpbmUocmVzdWx0X3NjYW4sIHNyY19waXhlbCwgMSwgMCwgMCk7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgICAgICAgcmVzdWx0X3NjYW4gKz0gNDsKKyNlbHNlCisgICAgICAgIHJlc3VsdF9zY2FuICs9IDM7CisjZW5kaWYKKyAgICAgIH0KKyAgICB9CisgICAgbV9MaW5lSW5kZXgrKzsKKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKIH0KIENGWF9ESUJpdG1hcCogQ1BERl9SZW5kZXJTdGF0dXM6OkxvYWRTTWFzayhDUERGX0RpY3Rpb25hcnkqIHBTTWFza0RpY3QsCi0gICAgICAgIEZYX1JFQ1QqIHBDbGlwUmVjdCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkKLXsKLSAgICBpZiAocFNNYXNrRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gTlVMTDsKLSAgICBpbnQgd2lkdGggPSBwQ2xpcFJlY3QtPnJpZ2h0IC0gcENsaXBSZWN0LT5sZWZ0OwotICAgIGludCBoZWlnaHQgPSBwQ2xpcFJlY3QtPmJvdHRvbSAtIHBDbGlwUmVjdC0+dG9wOwotICAgIEZYX0JPT0wgYkx1bWlub3NpdHkgPSBGQUxTRTsKLSAgICBiTHVtaW5vc2l0eSA9IHBTTWFza0RpY3QtPkdldENvbnN0U3RyaW5nKEZYX0JTVFJDKCJTIikpICE9IEZYX0JTVFJDKCJBbHBoYSIpOwotICAgIENQREZfU3RyZWFtKiBwR3JvdXAgPSBwU01hc2tEaWN0LT5HZXRTdHJlYW0oRlhfQlNUUkMoIkciKSk7Ci0gICAgaWYgKHBHcm91cCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0Z1bmN0aW9uKiBwRnVuYyA9IE5VTEw7Ci0gICAgQ1BERl9PYmplY3QqIHBGdW5jT2JqID0gcFNNYXNrRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJUUiIpKTsKLSAgICBpZiAocEZ1bmNPYmogJiYgKHBGdW5jT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkgfHwgcEZ1bmNPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSkgewotICAgICAgICBwRnVuYyA9IENQREZfRnVuY3Rpb246OkxvYWQocEZ1bmNPYmopOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCA9ICpwTWF0cml4OwotICAgIG1hdHJpeC5UcmFuc2xhdGVJKC1wQ2xpcFJlY3QtPmxlZnQsIC1wQ2xpcFJlY3QtPnRvcCk7Ci0gICAgQ1BERl9Gb3JtIGZvcm0obV9wQ29udGV4dC0+bV9wRG9jdW1lbnQsIG1fcENvbnRleHQtPm1fcFBhZ2VSZXNvdXJjZXMsIHBHcm91cCk7Ci0gICAgZm9ybS5QYXJzZUNvbnRlbnQoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBpZiAoIWJpdG1hcF9kZXZpY2UuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIGJMdW1pbm9zaXR5ID8gRlhESUJfUmdiMzIgOiBGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KSB7CisgIGlmIChwU01hc2tEaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfRElCaXRtYXAqIHBNYXNrID0gTlVMTDsKKyAgaW50IHdpZHRoID0gcENsaXBSZWN0LT5yaWdodCAtIHBDbGlwUmVjdC0+bGVmdDsKKyAgaW50IGhlaWdodCA9IHBDbGlwUmVjdC0+Ym90dG9tIC0gcENsaXBSZWN0LT50b3A7CisgIEZYX0JPT0wgYkx1bWlub3NpdHkgPSBGQUxTRTsKKyAgYkx1bWlub3NpdHkgPSBwU01hc2tEaWN0LT5HZXRDb25zdFN0cmluZyhGWF9CU1RSQygiUyIpKSAhPSBGWF9CU1RSQygiQWxwaGEiKTsKKyAgQ1BERl9TdHJlYW0qIHBHcm91cCA9IHBTTWFza0RpY3QtPkdldFN0cmVhbShGWF9CU1RSQygiRyIpKTsKKyAgaWYgKHBHcm91cCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9GdW5jdGlvbiogcEZ1bmMgPSBOVUxMOworICBDUERGX09iamVjdCogcEZ1bmNPYmogPSBwU01hc2tEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIlRSIikpOworICBpZiAocEZ1bmNPYmogJiYgKHBGdW5jT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkgfHwKKyAgICAgICAgICAgICAgICAgICBwRnVuY09iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pKSB7CisgICAgcEZ1bmMgPSBDUERGX0Z1bmN0aW9uOjpMb2FkKHBGdW5jT2JqKTsKKyAgfQorICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCA9ICpwTWF0cml4OworICBtYXRyaXguVHJhbnNsYXRlSSgtcENsaXBSZWN0LT5sZWZ0LCAtcENsaXBSZWN0LT50b3ApOworICBDUERGX0Zvcm0gZm9ybShtX3BDb250ZXh0LT5tX3BEb2N1bWVudCwgbV9wQ29udGV4dC0+bV9wUGFnZVJlc291cmNlcywgcEdyb3VwKTsKKyAgZm9ybS5QYXJzZUNvbnRlbnQoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMdW1pbm9zaXR5ID8gRlhESUJfUmdiMzIgOiBGWERJQl84YnBwTWFzaykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogI2Vsc2UKLSAgICBpZiAoIWJpdG1hcF9kZXZpY2UuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIGJMdW1pbm9zaXR5ID8gRlhESUJfUmdiIDogRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMdW1pbm9zaXR5ID8gRlhESUJfUmdiIDogRlhESUJfOGJwcE1hc2spKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KICNlbmRpZgotICAgIENGWF9ESUJpdG1hcCYgYml0bWFwID0gKmJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCk7Ci0gICAgQ1BERl9PYmplY3QqIHBDU09iaiA9IE5VTEw7Ci0gICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBOVUxMOwotICAgIGlmIChiTHVtaW5vc2l0eSkgewotICAgICAgICBDUERGX0FycmF5KiBwQkMgPSBwU01hc2tEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQkMiKSk7Ci0gICAgICAgIEZYX0FSR0IgYmFja19jb2xvciA9IDB4ZmYwMDAwMDA7Ci0gICAgICAgIGlmIChwQkMpIHsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwR3JvdXAtPkdldERpY3QoKTsKLSAgICAgICAgICAgIGlmIChwRGljdCAmJiBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiR3JvdXAiKSkpCi0gICAgICAgICAgICAgICAgcENTT2JqID0gcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkdyb3VwIikpLT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNTIikpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBDU09iaiA9IE5VTEw7Ci0gICAgICAgICAgICBwQ1MgPSBtX3BDb250ZXh0LT5tX3BEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocENTT2JqKTsKLSAgICAgICAgICAgIGlmIChwQ1MpIHsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLCBHLCBCOwotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbXBzID0gODsKLSAgICAgICAgICAgICAgICBpZiAocENTLT5Db3VudENvbXBvbmVudHMoKSA+IHN0YXRpY19jYXN0PGludDMyX3Q+KGNvbXBzKSkgewotICAgICAgICAgICAgICAgICAgICBjb21wcyA9IChGWF9EV09SRClwQ1MtPkNvdW50Q29tcG9uZW50cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCA4PiBmbG9hdF9hcnJheShjb21wcyk7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBGbG9hdHMgPSBmbG9hdF9hcnJheTsKLSAgICAgICAgICAgICAgICBGWF9TQUZFX0RXT1JEIG51bV9mbG9hdHMgPSBjb21wczsKLSAgICAgICAgICAgICAgICBudW1fZmxvYXRzICo9IHNpemVvZihGWF9GTE9BVCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFudW1fZmxvYXRzLklzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KHBGbG9hdHMsIDAsIG51bV9mbG9hdHMuVmFsdWVPckRpZSgpKTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBwQkMtPkdldENvdW50KCkgPiA4ID8gOCA6IHBCQy0+R2V0Q291bnQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBGbG9hdHNbaV0gPSBwQkMtPkdldE51bWJlcihpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcENTLT5HZXRSR0IocEZsb2F0cywgUiwgRywgQik7Ci0gICAgICAgICAgICAgICAgYmFja19jb2xvciA9IDB4ZmYwMDAwMDAgfCAoKGludDMyX3QpKFIgKiAyNTUpIDw8IDE2KSB8ICgoaW50MzJfdCkoRyAqIDI1NSkgPDwgOCkgfCAoaW50MzJfdCkoQiAqIDI1NSk7Ci0gICAgICAgICAgICAgICAgbV9wQ29udGV4dC0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDU09iaik7Ci0gICAgICAgICAgICB9CisgIENGWF9ESUJpdG1hcCYgYml0bWFwID0gKmJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCk7CisgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBOVUxMOworICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IE5VTEw7CisgIGlmIChiTHVtaW5vc2l0eSkgeworICAgIENQREZfQXJyYXkqIHBCQyA9IHBTTWFza0RpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJCQyIpKTsKKyAgICBGWF9BUkdCIGJhY2tfY29sb3IgPSAweGZmMDAwMDAwOworICAgIGlmIChwQkMpIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwR3JvdXAtPkdldERpY3QoKTsKKyAgICAgIGlmIChwRGljdCAmJiBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiR3JvdXAiKSkpCisgICAgICAgIHBDU09iaiA9CisgICAgICAgICAgICBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiR3JvdXAiKSktPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ1MiKSk7CisgICAgICBlbHNlCisgICAgICAgIHBDU09iaiA9IE5VTEw7CisgICAgICBwQ1MgPSBtX3BDb250ZXh0LT5tX3BEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocENTT2JqKTsKKyAgICAgIGlmIChwQ1MpIHsKKyAgICAgICAgRlhfRkxPQVQgUiwgRywgQjsKKyAgICAgICAgRlhfRFdPUkQgY29tcHMgPSA4OworICAgICAgICBpZiAocENTLT5Db3VudENvbXBvbmVudHMoKSA+IHN0YXRpY19jYXN0PGludDMyX3Q+KGNvbXBzKSkgeworICAgICAgICAgIGNvbXBzID0gKEZYX0RXT1JEKXBDUy0+Q291bnRDb21wb25lbnRzKCk7CiAgICAgICAgIH0KLSAgICAgICAgYml0bWFwLkNsZWFyKGJhY2tfY29sb3IpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJpdG1hcC5DbGVhcigwKTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlID0gTlVMTDsKLSAgICBpZiAoZm9ybS5tX3BGb3JtRGljdCkgewotICAgICAgICBwRm9ybVJlc291cmNlID0gZm9ybS5tX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiUmVzb3VyY2VzIikpOwotICAgIH0KLSAgICBDUERGX1JlbmRlck9wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLm1fQ29sb3JNb2RlID0gYkx1bWlub3NpdHkgPyBSRU5ERVJfQ09MT1JfTk9STUFMIDogUkVOREVSX0NPTE9SX0FMUEhBOwotICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKLSAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCAmYml0bWFwX2RldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucywgMCwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIFRSVUUsIE5VTEwsIDAsIHBDUyA/IHBDUy0+R2V0RmFtaWx5KCkgOiAwLCBiTHVtaW5vc2l0eSk7Ci0gICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QoJmZvcm0sICZtYXRyaXgpOwotICAgIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICBpZiAoIXBNYXNrLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHVpbnQ4X3QqIGRlc3RfYnVmID0gcE1hc2stPkdldEJ1ZmZlcigpOwotICAgIGludCBkZXN0X3BpdGNoID0gcE1hc2stPkdldFBpdGNoKCk7Ci0gICAgdWludDhfdCogc3JjX2J1ZiA9IGJpdG1hcC5HZXRCdWZmZXIoKTsKLSAgICBpbnQgc3JjX3BpdGNoID0gYml0bWFwLkdldFBpdGNoKCk7Ci0gICAgdWludDhfdCogcFRyYW5zZmVyID0gRlhfQWxsb2ModWludDhfdCwgMjU2KTsKLSAgICBpZiAocEZ1bmMpIHsKLSAgICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdHMocEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGlucHV0ID0gKEZYX0ZMT0FUKWkgLyAyNTUuMGY7Ci0gICAgICAgICAgICBpbnQgbnJlc3VsdDsKLSAgICAgICAgICAgIHBGdW5jLT5DYWxsKCZpbnB1dCwgMSwgcmVzdWx0cywgbnJlc3VsdCk7Ci0gICAgICAgICAgICBwVHJhbnNmZXJbaV0gPSBGWFNZU19yb3VuZChyZXN1bHRzWzBdICogMjU1KTsKKyAgICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgOD4gZmxvYXRfYXJyYXkoY29tcHMpOworICAgICAgICBGWF9GTE9BVCogcEZsb2F0cyA9IGZsb2F0X2FycmF5OworICAgICAgICBGWF9TQUZFX0RXT1JEIG51bV9mbG9hdHMgPSBjb21wczsKKyAgICAgICAgbnVtX2Zsb2F0cyAqPSBzaXplb2YoRlhfRkxPQVQpOworICAgICAgICBpZiAoIW51bV9mbG9hdHMuSXNWYWxpZCgpKSB7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgcFRyYW5zZmVyW2ldID0gaTsKKyAgICAgICAgRlhTWVNfbWVtc2V0KHBGbG9hdHMsIDAsIG51bV9mbG9hdHMuVmFsdWVPckRpZSgpKTsKKyAgICAgICAgaW50IGNvdW50ID0gcEJDLT5HZXRDb3VudCgpID4gOCA/IDggOiBwQkMtPkdldENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgIHBGbG9hdHNbaV0gPSBwQkMtPkdldE51bWJlcihpKTsKICAgICAgICAgfQorICAgICAgICBwQ1MtPkdldFJHQihwRmxvYXRzLCBSLCBHLCBCKTsKKyAgICAgICAgYmFja19jb2xvciA9IDB4ZmYwMDAwMDAgfCAoKGludDMyX3QpKFIgKiAyNTUpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAoKGludDMyX3QpKEcgKiAyNTUpIDw8IDgpIHwgKGludDMyX3QpKEIgKiAyNTUpOworICAgICAgICBtX3BDb250ZXh0LT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTT2JqKTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKGJMdW1pbm9zaXR5KSB7Ci0gICAgICAgIGludCBCcHAgPSBiaXRtYXAuR2V0QlBQKCkgLyA4OwotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgICAgICB1aW50OF90KiBzcmNfcG9zID0gc3JjX2J1ZiArIHJvdyAqIHNyY19waXRjaDsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9wb3MgKysgPSBwVHJhbnNmZXJbRlhSR0IyR1JBWShzcmNfcG9zWzJdLCBzcmNfcG9zWzFdLCAqc3JjX3BvcyldOwotICAgICAgICAgICAgICAgIHNyY19wb3MgKz0gQnBwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChwRnVuYykgewotICAgICAgICBpbnQgc2l6ZSA9IGRlc3RfcGl0Y2ggKiBoZWlnaHQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICAgICAgZGVzdF9idWZbaV0gPSBwVHJhbnNmZXJbc3JjX2J1ZltpXV07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9idWYsIHNyY19idWYsIGRlc3RfcGl0Y2ggKiBoZWlnaHQpOworICAgIGJpdG1hcC5DbGVhcihiYWNrX2NvbG9yKTsKKyAgfSBlbHNlIHsKKyAgICBiaXRtYXAuQ2xlYXIoMCk7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlID0gTlVMTDsKKyAgaWYgKGZvcm0ubV9wRm9ybURpY3QpIHsKKyAgICBwRm9ybVJlc291cmNlID0gZm9ybS5tX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiUmVzb3VyY2VzIikpOworICB9CisgIENQREZfUmVuZGVyT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLm1fQ29sb3JNb2RlID0gYkx1bWlub3NpdHkgPyBSRU5ERVJfQ09MT1JfTk9STUFMIDogUkVOREVSX0NPTE9SX0FMUEhBOworICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CisgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucywgMCwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIFRSVUUsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgIHBDUyA/IHBDUy0+R2V0RmFtaWx5KCkgOiAwLCBiTHVtaW5vc2l0eSk7CisgIHN0YXR1cy5SZW5kZXJPYmplY3RMaXN0KCZmb3JtLCAmbWF0cml4KTsKKyAgcE1hc2sgPSBuZXcgQ0ZYX0RJQml0bWFwOworICBpZiAoIXBNYXNrLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7CisgICAgZGVsZXRlIHBNYXNrOworICAgIHJldHVybiBOVUxMOworICB9CisgIHVpbnQ4X3QqIGRlc3RfYnVmID0gcE1hc2stPkdldEJ1ZmZlcigpOworICBpbnQgZGVzdF9waXRjaCA9IHBNYXNrLT5HZXRQaXRjaCgpOworICB1aW50OF90KiBzcmNfYnVmID0gYml0bWFwLkdldEJ1ZmZlcigpOworICBpbnQgc3JjX3BpdGNoID0gYml0bWFwLkdldFBpdGNoKCk7CisgIHVpbnQ4X3QqIHBUcmFuc2ZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIDI1Nik7CisgIGlmIChwRnVuYykgeworICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKHBGdW5jLT5Db3VudE91dHB1dHMoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgRlhfRkxPQVQgaW5wdXQgPSAoRlhfRkxPQVQpaSAvIDI1NS4wZjsKKyAgICAgIGludCBucmVzdWx0OworICAgICAgcEZ1bmMtPkNhbGwoJmlucHV0LCAxLCByZXN1bHRzLCBucmVzdWx0KTsKKyAgICAgIHBUcmFuc2ZlcltpXSA9IEZYU1lTX3JvdW5kKHJlc3VsdHNbMF0gKiAyNTUpOwogICAgIH0KLSAgICBkZWxldGUgcEZ1bmM7Ci0gICAgRlhfRnJlZShwVHJhbnNmZXIpOwotICAgIHJldHVybiBwTWFzazsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBwVHJhbnNmZXJbaV0gPSBpOworICAgIH0KKyAgfQorICBpZiAoYkx1bWlub3NpdHkpIHsKKyAgICBpbnQgQnBwID0gYml0bWFwLkdldEJQUCgpIC8gODsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3BvcyA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICAgIHVpbnQ4X3QqIHNyY19wb3MgPSBzcmNfYnVmICsgcm93ICogc3JjX3BpdGNoOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICpkZXN0X3BvcysrID0gcFRyYW5zZmVyW0ZYUkdCMkdSQVkoc3JjX3Bvc1syXSwgc3JjX3Bvc1sxXSwgKnNyY19wb3MpXTsKKyAgICAgICAgc3JjX3BvcyArPSBCcHA7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKHBGdW5jKSB7CisgICAgaW50IHNpemUgPSBkZXN0X3BpdGNoICogaGVpZ2h0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICBkZXN0X2J1ZltpXSA9IHBUcmFuc2ZlcltzcmNfYnVmW2ldXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRlhTWVNfbWVtY3B5KGRlc3RfYnVmLCBzcmNfYnVmLCBkZXN0X3BpdGNoICogaGVpZ2h0KTsKKyAgfQorICBkZWxldGUgcEZ1bmM7CisgIEZYX0ZyZWUocFRyYW5zZmVyKTsKKyAgcmV0dXJuIHBNYXNrOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9sb2FkaW1hZ2UuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9sb2FkaW1hZ2UuY3BwCmluZGV4IDdkMTdlNzguLmUwNjY5NTcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfbG9hZGltYWdlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2xvYWRpbWFnZS5jcHAKQEAgLTE2LDE1NTAgKzE2LDE2MzkgQEAKIAogbmFtZXNwYWNlIHsKIAotdW5zaWduZWQgaW50IF9HZXRCaXRzOChjb25zdCB1aW50OF90KiBwRGF0YSwgaW50IGJpdHBvcywgaW50IG5iaXRzKQotewotICAgIHVuc2lnbmVkIGludCBieXRlID0gcERhdGFbYml0cG9zIC8gOF07Ci0gICAgaWYgKG5iaXRzID09IDgpIHsKLSAgICAgICAgcmV0dXJuIGJ5dGU7Ci0gICAgfQotICAgIGlmIChuYml0cyA9PSA0KSB7Ci0gICAgICAgIHJldHVybiAoYml0cG9zICUgOCkgPyAoYnl0ZSAmIDB4MGYpIDogKGJ5dGUgPj4gNCk7Ci0gICAgfQotICAgIGlmIChuYml0cyA9PSAyKSB7Ci0gICAgICAgIHJldHVybiAoYnl0ZSA+PiAoNiAtIGJpdHBvcyAlIDgpKSAmIDB4MDM7Ci0gICAgfQotICAgIGlmIChuYml0cyA9PSAxKSB7Ci0gICAgICAgIHJldHVybiAoYnl0ZSA+PiAoNyAtIGJpdHBvcyAlIDgpKSAmIDB4MDE7Ci0gICAgfQotICAgIGlmIChuYml0cyA9PSAxNikgewotICAgICAgICByZXR1cm4gYnl0ZSAqIDI1NiArIHBEYXRhW2JpdHBvcyAvIDggKyAxXTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Cit1bnNpZ25lZCBpbnQgX0dldEJpdHM4KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBpbnQgYml0cG9zLCBpbnQgbmJpdHMpIHsKKyAgdW5zaWduZWQgaW50IGJ5dGUgPSBwRGF0YVtiaXRwb3MgLyA4XTsKKyAgaWYgKG5iaXRzID09IDgpIHsKKyAgICByZXR1cm4gYnl0ZTsKKyAgfQorICBpZiAobmJpdHMgPT0gNCkgeworICAgIHJldHVybiAoYml0cG9zICUgOCkgPyAoYnl0ZSAmIDB4MGYpIDogKGJ5dGUgPj4gNCk7CisgIH0KKyAgaWYgKG5iaXRzID09IDIpIHsKKyAgICByZXR1cm4gKGJ5dGUgPj4gKDYgLSBiaXRwb3MgJSA4KSkgJiAweDAzOworICB9CisgIGlmIChuYml0cyA9PSAxKSB7CisgICAgcmV0dXJuIChieXRlID4+ICg3IC0gYml0cG9zICUgOCkpICYgMHgwMTsKKyAgfQorICBpZiAobmJpdHMgPT0gMTYpIHsKKyAgICByZXR1cm4gYnl0ZSAqIDI1NiArIHBEYXRhW2JpdHBvcyAvIDggKyAxXTsKKyAgfQorICByZXR1cm4gMDsKIH0KIAogRlhfU0FGRV9EV09SRCBDYWxjdWxhdGVQaXRjaDgoRlhfRFdPUkQgYnBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29tcG9uZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpCi17Ci0gICAgRlhfU0FGRV9EV09SRCBwaXRjaCA9IGJwYzsKLSAgICBwaXRjaCAqPSBjb21wb25lbnRzOwotICAgIHBpdGNoICo9IHdpZHRoOwotICAgIHBpdGNoICs9IDc7Ci0gICAgcGl0Y2ggLz0gODsKLSAgICBwaXRjaCAqPSBoZWlnaHQ7Ci0gICAgcmV0dXJuIHBpdGNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgeworICBGWF9TQUZFX0RXT1JEIHBpdGNoID0gYnBjOworICBwaXRjaCAqPSBjb21wb25lbnRzOworICBwaXRjaCAqPSB3aWR0aDsKKyAgcGl0Y2ggKz0gNzsKKyAgcGl0Y2ggLz0gODsKKyAgcGl0Y2ggKj0gaGVpZ2h0OworICByZXR1cm4gcGl0Y2g7CiB9CiAKLUZYX1NBRkVfRFdPUkQgQ2FsY3VsYXRlUGl0Y2gzMihpbnQgYnBwLCBpbnQgd2lkdGgpCi17Ci0gICAgRlhfU0FGRV9EV09SRCBwaXRjaCA9IGJwcDsKLSAgICBwaXRjaCAqPSB3aWR0aDsKLSAgICBwaXRjaCArPSAzMTsKLSAgICBwaXRjaCAvPSA4OwotICAgIHJldHVybiBwaXRjaDsKK0ZYX1NBRkVfRFdPUkQgQ2FsY3VsYXRlUGl0Y2gzMihpbnQgYnBwLCBpbnQgd2lkdGgpIHsKKyAgRlhfU0FGRV9EV09SRCBwaXRjaCA9IGJwcDsKKyAgcGl0Y2ggKj0gd2lkdGg7CisgIHBpdGNoICs9IDMxOworICBwaXRjaCAvPSA4OworICByZXR1cm4gcGl0Y2g7CiB9CiAKIC8vIFdyYXBwZXIgY2xhc3MgdG8gaG9sZCBvYmplY3RzIGFsbG9jYXRlZCBpbiBDUERGX0RJQlNvdXJjZTo6TG9hZEpweEJpdG1hcCgpLAogLy8gYmVjYXVzZSBub25zdGQ6OnVuaXF1ZV9wdHIgZG9lcyBub3Qgc3VwcG9ydCBjdXN0b20gZGVsZXRlcnMgeWV0LgotY2xhc3MgSnB4Qml0TWFwQ29udGV4dAotewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSnB4Qml0TWFwQ29udGV4dChJQ29kZWNfSnB4TW9kdWxlKiBqcHhfbW9kdWxlKQotICAgICAgICA6IGpweF9tb2R1bGVfKGpweF9tb2R1bGUpLAotICAgICAgICAgIGN0eF8obnVsbHB0ciksCi0gICAgICAgICAgb3V0cHV0X29mZnNldHNfKG51bGxwdHIpIHt9CitjbGFzcyBKcHhCaXRNYXBDb250ZXh0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEpweEJpdE1hcENvbnRleHQoSUNvZGVjX0pweE1vZHVsZSoganB4X21vZHVsZSkKKyAgICAgIDoganB4X21vZHVsZV8oanB4X21vZHVsZSksIGN0eF8obnVsbHB0ciksIG91dHB1dF9vZmZzZXRzXyhudWxscHRyKSB7fQogCi0gICAgfkpweEJpdE1hcENvbnRleHQoKSB7Ci0gICAgICAgIEZYX0ZyZWUob3V0cHV0X29mZnNldHNfKTsKLSAgICAgICAganB4X21vZHVsZV8tPkRlc3Ryb3lEZWNvZGVyKGN0eF8pOwotICAgIH0KKyAgfkpweEJpdE1hcENvbnRleHQoKSB7CisgICAgRlhfRnJlZShvdXRwdXRfb2Zmc2V0c18pOworICAgIGpweF9tb2R1bGVfLT5EZXN0cm95RGVjb2RlcihjdHhfKTsKKyAgfQogCi0gICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHxjdHh8LgotICAgIHZvaWQgc2V0X2NvbnRleHQodm9pZCogY3R4KSB7Ci0gICAgICAgIGN0eF8gPSBjdHg7Ci0gICAgfQorICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgfGN0eHwuCisgIHZvaWQgc2V0X2NvbnRleHQodm9pZCogY3R4KSB7IGN0eF8gPSBjdHg7IH0KIAotICAgIHZvaWQqIGNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjdHhfOwotICAgIH0KKyAgdm9pZCogY29udGV4dCgpIHsgcmV0dXJuIGN0eF87IH0KIAotICAgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8b3V0cHV0X29mZnNldHN8LgotICAgIHZvaWQgc2V0X291dHB1dF9vZmZzZXRzKHVuc2lnbmVkIGNoYXIqIG91dHB1dF9vZmZzZXRzKSB7Ci0gICAgICBvdXRwdXRfb2Zmc2V0c18gPSBvdXRwdXRfb2Zmc2V0czsKLSAgICB9CisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8b3V0cHV0X29mZnNldHN8LgorICB2b2lkIHNldF9vdXRwdXRfb2Zmc2V0cyh1bnNpZ25lZCBjaGFyKiBvdXRwdXRfb2Zmc2V0cykgeworICAgIG91dHB1dF9vZmZzZXRzXyA9IG91dHB1dF9vZmZzZXRzOworICB9CiAKLSAgICB1bnNpZ25lZCBjaGFyKiBvdXRwdXRfb2Zmc2V0cygpIHsKLSAgICAgIHJldHVybiBvdXRwdXRfb2Zmc2V0c187Ci0gICAgfQorICB1bnNpZ25lZCBjaGFyKiBvdXRwdXRfb2Zmc2V0cygpIHsgcmV0dXJuIG91dHB1dF9vZmZzZXRzXzsgfQogCi0gIHByaXZhdGU6Ci0gICAgSUNvZGVjX0pweE1vZHVsZSoganB4X21vZHVsZV87ICAvLyBXZWFrIHBvaW50ZXIuCi0gICAgdm9pZCogY3R4XzsgIC8vIERlY29kZXIgY29udGV4dCwgb3duZWQuCi0gICAgdW5zaWduZWQgY2hhciogb3V0cHV0X29mZnNldHNfOyAgLy8gT3V0cHV0IG9mZnNldHMgZm9yIGRlY29kaW5nLCBvd25lZC4KKyBwcml2YXRlOgorICBJQ29kZWNfSnB4TW9kdWxlKiBqcHhfbW9kdWxlXzsgICAvLyBXZWFrIHBvaW50ZXIuCisgIHZvaWQqIGN0eF87ICAgICAgICAgICAgICAgICAgICAgIC8vIERlY29kZXIgY29udGV4dCwgb3duZWQuCisgIHVuc2lnbmVkIGNoYXIqIG91dHB1dF9vZmZzZXRzXzsgIC8vIE91dHB1dCBvZmZzZXRzIGZvciBkZWNvZGluZywgb3duZWQuCiAKLSAgICAvLyBEaXNhbGxvdyBldmlsIGNvbnN0cnVjdG9ycwotICAgIEpweEJpdE1hcENvbnRleHQoY29uc3QgSnB4Qml0TWFwQ29udGV4dCYpOwotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEpweEJpdE1hcENvbnRleHQmKTsKKyAgLy8gRGlzYWxsb3cgZXZpbCBjb25zdHJ1Y3RvcnMKKyAgSnB4Qml0TWFwQ29udGV4dChjb25zdCBKcHhCaXRNYXBDb250ZXh0Jik7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEpweEJpdE1hcENvbnRleHQmKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZQogCi1DRlhfRElCU291cmNlKiBDUERGX0ltYWdlOjpMb2FkRElCU291cmNlKENGWF9ESUJTb3VyY2UqKiBwcE1hc2ssIEZYX0RXT1JEKiBwTWF0dGVDb2xvciwgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaykgY29uc3QKLXsKLSAgICBDUERGX0RJQlNvdXJjZSogcFNvdXJjZSA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpZiAocFNvdXJjZS0+TG9hZChtX3BEb2N1bWVudCwgbV9wU3RyZWFtLCAoQ1BERl9ESUJTb3VyY2UqKilwcE1hc2ssIHBNYXR0ZUNvbG9yLCBOVUxMLCBOVUxMLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spKSB7Ci0gICAgICAgIHJldHVybiBwU291cmNlOwotICAgIH0KLSAgICBkZWxldGUgcFNvdXJjZTsKLSAgICByZXR1cm4gTlVMTDsKK0NGWF9ESUJTb3VyY2UqIENQREZfSW1hZ2U6OkxvYWRESUJTb3VyY2UoQ0ZYX0RJQlNvdXJjZSoqIHBwTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrKSBjb25zdCB7CisgIENQREZfRElCU291cmNlKiBwU291cmNlID0gbmV3IENQREZfRElCU291cmNlOworICBpZiAocFNvdXJjZS0+TG9hZChtX3BEb2N1bWVudCwgbV9wU3RyZWFtLCAoQ1BERl9ESUJTb3VyY2UqKilwcE1hc2ssCisgICAgICAgICAgICAgICAgICAgIHBNYXR0ZUNvbG9yLCBOVUxMLCBOVUxMLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spKSB7CisgICAgcmV0dXJuIHBTb3VyY2U7CisgIH0KKyAgZGVsZXRlIHBTb3VyY2U7CisgIHJldHVybiBOVUxMOwogfQotQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZTo6RGV0YWNoQml0bWFwKCkKLXsKLSAgICBDRlhfRElCU291cmNlKiBwQml0bWFwID0gbV9wRElCU291cmNlOwotICAgIG1fcERJQlNvdXJjZSA9IE5VTEw7Ci0gICAgcmV0dXJuIHBCaXRtYXA7CitDRlhfRElCU291cmNlKiBDUERGX0ltYWdlOjpEZXRhY2hCaXRtYXAoKSB7CisgIENGWF9ESUJTb3VyY2UqIHBCaXRtYXAgPSBtX3BESUJTb3VyY2U7CisgIG1fcERJQlNvdXJjZSA9IE5VTEw7CisgIHJldHVybiBwQml0bWFwOwogfQotQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZTo6RGV0YWNoTWFzaygpCi17Ci0gICAgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCA9IG1fcE1hc2s7Ci0gICAgbV9wTWFzayA9IE5VTEw7Ci0gICAgcmV0dXJuIHBCaXRtYXA7CitDRlhfRElCU291cmNlKiBDUERGX0ltYWdlOjpEZXRhY2hNYXNrKCkgeworICBDRlhfRElCU291cmNlKiBwQml0bWFwID0gbV9wTWFzazsKKyAgbV9wTWFzayA9IE5VTEw7CisgIHJldHVybiBwQml0bWFwOwogfQotRlhfQk9PTCBDUERGX0ltYWdlOjpTdGFydExvYWRESUJTb3VyY2UoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2UsIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2spCi17Ci0gICAgbV9wRElCU291cmNlID0gbmV3IENQREZfRElCU291cmNlOwotICAgIGludCByZXQgPSAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpLT5TdGFydExvYWRESUJTb3VyY2UobV9wRG9jdW1lbnQsIG1fcFN0cmVhbSwgVFJVRSwgcEZvcm1SZXNvdXJjZSwgcFBhZ2VSZXNvdXJjZSwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKLSAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BESUJTb3VyY2U7Ci0gICAgICAgIG1fcERJQlNvdXJjZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wTWFzayA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPkRldGFjaE1hc2soKTsKLSAgICBtX01hdHRlQ29sb3IgPSAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpLT5tX01hdHRlQ29sb3I7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0ltYWdlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+Q29udGludWVMb2FkRElCU291cmNlKHBQYXVzZSk7Ci0gICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoIXJldCkgewotICAgICAgICBkZWxldGUgbV9wRElCU291cmNlOwotICAgICAgICBtX3BESUJTb3VyY2UgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcE1hc2sgPSAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpLT5EZXRhY2hNYXNrKCk7Ci0gICAgbV9NYXR0ZUNvbG9yID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+bV9NYXR0ZUNvbG9yOwotICAgIHJldHVybiBGQUxTRTsKLX0KLUNQREZfRElCU291cmNlOjpDUERGX0RJQlNvdXJjZSgpCi17Ci0gICAgbV9wRG9jdW1lbnQgPSBOVUxMOwotICAgIG1fcFN0cmVhbUFjYyA9IE5VTEw7Ci0gICAgbV9wRGljdCA9IE5VTEw7Ci0gICAgbV9icHAgPSAwOwotICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IDA7Ci0gICAgbV9wQ29sb3JTcGFjZSA9IE5VTEw7Ci0gICAgbV9iRGVmYXVsdERlY29kZSA9IFRSVUU7Ci0gICAgbV9iSW1hZ2VNYXNrID0gRkFMU0U7Ci0gICAgbV9iRG9CcGNDaGVjayA9IFRSVUU7Ci0gICAgbV9wUGFsZXR0ZSA9IE5VTEw7Ci0gICAgbV9wQ29tcERhdGEgPSBOVUxMOwotICAgIG1fYkNvbG9yS2V5ID0gRkFMU0U7Ci0gICAgbV9wTWFza2VkTGluZSA9IG1fcExpbmVCdWYgPSBOVUxMOwotICAgIG1fcERlY29kZXIgPSBOVUxMOwotICAgIG1fbkNvbXBvbmVudHMgPSAwOwotICAgIG1fYnBjID0gMDsKLSAgICBtX2JMb2FkTWFzayA9IEZBTFNFOwotICAgIG1fRmFtaWx5ID0gMDsKLSAgICBtX3BNYXNrID0gTlVMTDsKLSAgICBtX01hdHRlQ29sb3IgPSAwOwotICAgIG1fcEpiaWcyQ29udGV4dCA9IE5VTEw7Ci0gICAgbV9wR2xvYmFsU3RyZWFtID0gTlVMTDsKLSAgICBtX2JTdGRDUyA9IEZBTFNFOwotICAgIG1fcE1hc2tTdHJlYW0gPSBOVUxMOwotICAgIG1fU3RhdHVzID0gMDsKLSAgICBtX2JIYXNNYXNrID0gRkFMU0U7Ci19Ci1DUERGX0RJQlNvdXJjZTo6fkNQREZfRElCU291cmNlKCkKLXsKLSAgICBkZWxldGUgbV9wU3RyZWFtQWNjOwotICAgIGlmIChtX3BNYXNrZWRMaW5lKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wTWFza2VkTGluZSk7Ci0gICAgfQotICAgIGlmIChtX3BMaW5lQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wTGluZUJ1Zik7Ci0gICAgfQotICAgIG1fcENhY2hlZEJpdG1hcC5yZXNldCgpOwotICAgIGRlbGV0ZSBtX3BEZWNvZGVyOwotICAgIGlmIChtX3BDb21wRGF0YSkgewotICAgICAgICBGWF9GcmVlKG1fcENvbXBEYXRhKTsKLSAgICB9Ci0gICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBtX3BDb2xvclNwYWNlOwotICAgIGlmIChwQ1MgJiYgbV9wRG9jdW1lbnQpIHsKLSAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7Ci0gICAgfQotICAgIGlmIChtX3BKYmlnMkNvbnRleHQpIHsKLSAgICAgICAgSUNvZGVjX0piaWcyTW9kdWxlKiBwSmJpZzJNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpiaWcyTW9kdWxlKCk7Ci0gICAgICAgIHBKYmlnMk1vZHVsZS0+RGVzdHJveUpiaWcyQ29udGV4dChtX3BKYmlnMkNvbnRleHQpOwotICAgIH0KLSAgICBkZWxldGUgbV9wR2xvYmFsU3RyZWFtOwotfQotQ0ZYX0RJQml0bWFwKiBDUERGX0RJQlNvdXJjZTo6R2V0Qml0bWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wQ2FjaGVkQml0bWFwID8gbV9wQ2FjaGVkQml0bWFwLmdldCgpIDogQ2xvbmUoKTsKLX0KLXZvaWQgQ1BERl9ESUJTb3VyY2U6OlJlbGVhc2VCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSBjb25zdAotewotICAgIGlmIChwQml0bWFwICYmIHBCaXRtYXAgIT0gbV9wQ2FjaGVkQml0bWFwKSB7Ci0gICAgICAgIGRlbGV0ZSBwQml0bWFwOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9ESUJTb3VyY2U6OkxvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENQREZfRElCU291cmNlKiogcHBNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcE1hdHRlQ29sb3IsIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2spCi17Ci0gICAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcERvY3VtZW50ID0gcERvYzsKLSAgICBtX3BEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOwotICAgIG1fV2lkdGggPSBtX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJXaWR0aCIpKTsKLSAgICBtX0hlaWdodCA9IG1fcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkhlaWdodCIpKTsKLSAgICBpZiAobV9XaWR0aCA8PSAwIHx8IG1fSGVpZ2h0IDw9IDAgfHwgbV9XaWR0aCA+IDB4MDFmZmZmIHx8IG1fSGVpZ2h0ID4gMHgwMWZmZmYpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX0dyb3VwRmFtaWx5ID0gR3JvdXBGYW1pbHk7Ci0gICAgbV9iTG9hZE1hc2sgPSBiTG9hZE1hc2s7Ci0gICAgaWYgKCFMb2FkQ29sb3JJbmZvKG1fcFN0cmVhbS0+R2V0T2JqTnVtKCkgIT0gMCA/IE5VTEwgOiBwRm9ybVJlc291cmNlcywgcFBhZ2VSZXNvdXJjZXMpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fYkRvQnBjQ2hlY2sgJiYgKG1fYnBjID09IDAgfHwgbV9uQ29tcG9uZW50cyA9PSAwKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX1NBRkVfRFdPUkQgc3JjX3BpdGNoID0KLSAgICAgICAgQ2FsY3VsYXRlUGl0Y2g4KG1fYnBjLCBtX25Db21wb25lbnRzLCBtX1dpZHRoLCBtX0hlaWdodCk7Ci0gICAgaWYgKCFzcmNfcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wU3RyZWFtQWNjID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgIG1fcFN0cmVhbUFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UsIHNyY19waXRjaC5WYWx1ZU9yRGllKCksIFRSVUUpOwotICAgIGlmIChtX3BTdHJlYW1BY2MtPkdldFNpemUoKSA9PSAwIHx8IG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIUNyZWF0ZURlY29kZXIoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX2JJbWFnZU1hc2spIHsKLSAgICAgICAgbV9icHAgPSAxOwotICAgICAgICBtX2JwYyA9IDE7Ci0gICAgICAgIG1fbkNvbXBvbmVudHMgPSAxOwotICAgICAgICBtX0FscGhhRmxhZyA9IDE7Ci0gICAgfSBlbHNlIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPT0gMSkgewotICAgICAgICBtX2JwcCA9IDE7Ci0gICAgfSBlbHNlIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPD0gOCkgewotICAgICAgICBtX2JwcCA9IDg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9icHAgPSAyNDsKLSAgICB9Ci0gICAgRlhfU0FGRV9EV09SRCBwaXRjaCA9IENhbGN1bGF0ZVBpdGNoMzIobV9icHAsIG1fV2lkdGgpOwotICAgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wTGluZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBpdGNoLlZhbHVlT3JEaWUoKSk7Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgYlN0ZENTKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oVFJVRSk7Ci0gICAgfQotICAgIExvYWRQYWxldHRlKCk7Ci0gICAgaWYgKG1fYkNvbG9yS2V5KSB7Ci0gICAgICAgIG1fYnBwID0gMzI7Ci0gICAgICAgIG1fQWxwaGFGbGFnID0gMjsKLSAgICAgICAgcGl0Y2ggPSBDYWxjdWxhdGVQaXRjaDMyKG1fYnBwLCBtX1dpZHRoKTsKLSAgICAgICAgaWYgKCFwaXRjaC5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX3BNYXNrZWRMaW5lID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKLSAgICB9Ci0gICAgbV9QaXRjaCA9IHBpdGNoLlZhbHVlT3JEaWUoKTsKLSAgICBpZiAocHBNYXNrKSB7Ci0gICAgICAgICpwcE1hc2sgPSBMb2FkTWFzaygqcE1hdHRlQ29sb3IpOwotICAgIH0KLSAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBiU3RkQ1MpIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihGQUxTRSk7Ci0gICAgfQorRlhfQk9PTCBDUERGX0ltYWdlOjpTdGFydExvYWRESUJTb3VyY2UoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrKSB7CisgIG1fcERJQlNvdXJjZSA9IG5ldyBDUERGX0RJQlNvdXJjZTsKKyAgaW50IHJldCA9CisgICAgICAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpCisgICAgICAgICAgLT5TdGFydExvYWRESUJTb3VyY2UobV9wRG9jdW1lbnQsIG1fcFN0cmVhbSwgVFJVRSwgcEZvcm1SZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFnZVJlc291cmNlLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOworICBpZiAocmV0ID09IDIpIHsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIXJldCkgeworICAgIGRlbGV0ZSBtX3BESUJTb3VyY2U7CisgICAgbV9wRElCU291cmNlID0gTlVMTDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wTWFzayA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPkRldGFjaE1hc2soKTsKKyAgbV9NYXR0ZUNvbG9yID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+bV9NYXR0ZUNvbG9yOworICByZXR1cm4gRkFMU0U7CiB9Ci1pbnQJQ1BERl9ESUJTb3VyY2U6OkNvbnRpbnVlVG9Mb2FkTWFzaygpCi17Ci0gICAgaWYgKG1fYkltYWdlTWFzaykgewotICAgICAgICBtX2JwcCA9IDE7Ci0gICAgICAgIG1fYnBjID0gMTsKLSAgICAgICAgbV9uQ29tcG9uZW50cyA9IDE7Ci0gICAgICAgIG1fQWxwaGFGbGFnID0gMTsKLSAgICB9IGVsc2UgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA9PSAxKSB7Ci0gICAgICAgIG1fYnBwID0gMTsKLSAgICB9IGVsc2UgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA8PSA4KSB7Ci0gICAgICAgIG1fYnBwID0gODsKLSAgICB9IGVsc2UgewotICAgICAgICBtX2JwcCA9IDI0OwotICAgIH0KLSAgICBpZiAoIW1fYnBjIHx8ICFtX25Db21wb25lbnRzKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9TQUZFX0RXT1JEIHBpdGNoID0gQ2FsY3VsYXRlUGl0Y2gzMihtX2JwcCwgbV9XaWR0aCk7CitGWF9CT09MIENQREZfSW1hZ2U6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGludCByZXQgPSAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpLT5Db250aW51ZUxvYWRESUJTb3VyY2UocFBhdXNlKTsKKyAgaWYgKHJldCA9PSAyKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFyZXQpIHsKKyAgICBkZWxldGUgbV9wRElCU291cmNlOworICAgIG1fcERJQlNvdXJjZSA9IE5VTEw7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcE1hc2sgPSAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpLT5EZXRhY2hNYXNrKCk7CisgIG1fTWF0dGVDb2xvciA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPm1fTWF0dGVDb2xvcjsKKyAgcmV0dXJuIEZBTFNFOworfQorQ1BERl9ESUJTb3VyY2U6OkNQREZfRElCU291cmNlKCkgeworICBtX3BEb2N1bWVudCA9IE5VTEw7CisgIG1fcFN0cmVhbUFjYyA9IE5VTEw7CisgIG1fcERpY3QgPSBOVUxMOworICBtX2JwcCA9IDA7CisgIG1fV2lkdGggPSBtX0hlaWdodCA9IDA7CisgIG1fcENvbG9yU3BhY2UgPSBOVUxMOworICBtX2JEZWZhdWx0RGVjb2RlID0gVFJVRTsKKyAgbV9iSW1hZ2VNYXNrID0gRkFMU0U7CisgIG1fYkRvQnBjQ2hlY2sgPSBUUlVFOworICBtX3BQYWxldHRlID0gTlVMTDsKKyAgbV9wQ29tcERhdGEgPSBOVUxMOworICBtX2JDb2xvcktleSA9IEZBTFNFOworICBtX3BNYXNrZWRMaW5lID0gbV9wTGluZUJ1ZiA9IE5VTEw7CisgIG1fcERlY29kZXIgPSBOVUxMOworICBtX25Db21wb25lbnRzID0gMDsKKyAgbV9icGMgPSAwOworICBtX2JMb2FkTWFzayA9IEZBTFNFOworICBtX0ZhbWlseSA9IDA7CisgIG1fcE1hc2sgPSBOVUxMOworICBtX01hdHRlQ29sb3IgPSAwOworICBtX3BKYmlnMkNvbnRleHQgPSBOVUxMOworICBtX3BHbG9iYWxTdHJlYW0gPSBOVUxMOworICBtX2JTdGRDUyA9IEZBTFNFOworICBtX3BNYXNrU3RyZWFtID0gTlVMTDsKKyAgbV9TdGF0dXMgPSAwOworICBtX2JIYXNNYXNrID0gRkFMU0U7Cit9CitDUERGX0RJQlNvdXJjZTo6fkNQREZfRElCU291cmNlKCkgeworICBkZWxldGUgbV9wU3RyZWFtQWNjOworICBpZiAobV9wTWFza2VkTGluZSkgeworICAgIEZYX0ZyZWUobV9wTWFza2VkTGluZSk7CisgIH0KKyAgaWYgKG1fcExpbmVCdWYpIHsKKyAgICBGWF9GcmVlKG1fcExpbmVCdWYpOworICB9CisgIG1fcENhY2hlZEJpdG1hcC5yZXNldCgpOworICBkZWxldGUgbV9wRGVjb2RlcjsKKyAgaWYgKG1fcENvbXBEYXRhKSB7CisgICAgRlhfRnJlZShtX3BDb21wRGF0YSk7CisgIH0KKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBtX3BDb2xvclNwYWNlOworICBpZiAocENTICYmIG1fcERvY3VtZW50KSB7CisgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7CisgIH0KKyAgaWYgKG1fcEpiaWcyQ29udGV4dCkgeworICAgIElDb2RlY19KYmlnMk1vZHVsZSogcEpiaWcyTW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKYmlnMk1vZHVsZSgpOworICAgIHBKYmlnMk1vZHVsZS0+RGVzdHJveUpiaWcyQ29udGV4dChtX3BKYmlnMkNvbnRleHQpOworICB9CisgIGRlbGV0ZSBtX3BHbG9iYWxTdHJlYW07Cit9CitDRlhfRElCaXRtYXAqIENQREZfRElCU291cmNlOjpHZXRCaXRtYXAoKSBjb25zdCB7CisgIHJldHVybiBtX3BDYWNoZWRCaXRtYXAgPyBtX3BDYWNoZWRCaXRtYXAuZ2V0KCkgOiBDbG9uZSgpOworfQordm9pZCBDUERGX0RJQlNvdXJjZTo6UmVsZWFzZUJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXApIGNvbnN0IHsKKyAgaWYgKHBCaXRtYXAgJiYgcEJpdG1hcCAhPSBtX3BDYWNoZWRCaXRtYXApIHsKKyAgICBkZWxldGUgcEJpdG1hcDsKKyAgfQorfQorRlhfQk9PTCBDUERGX0RJQlNvdXJjZTo6TG9hZChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9ESUJTb3VyY2UqKiBwcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwTWF0dGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzaykgeworICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcERvY3VtZW50ID0gcERvYzsKKyAgbV9wRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKKyAgaWYgKG1fcERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BTdHJlYW0gPSBwU3RyZWFtOworICBtX1dpZHRoID0gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSk7CisgIG1fSGVpZ2h0ID0gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiSGVpZ2h0IikpOworICBpZiAobV9XaWR0aCA8PSAwIHx8IG1fSGVpZ2h0IDw9IDAgfHwgbV9XaWR0aCA+IDB4MDFmZmZmIHx8CisgICAgICBtX0hlaWdodCA+IDB4MDFmZmZmKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fR3JvdXBGYW1pbHkgPSBHcm91cEZhbWlseTsKKyAgbV9iTG9hZE1hc2sgPSBiTG9hZE1hc2s7CisgIGlmICghTG9hZENvbG9ySW5mbyhtX3BTdHJlYW0tPkdldE9iak51bSgpICE9IDAgPyBOVUxMIDogcEZvcm1SZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICBwUGFnZVJlc291cmNlcykpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fYkRvQnBjQ2hlY2sgJiYgKG1fYnBjID09IDAgfHwgbV9uQ29tcG9uZW50cyA9PSAwKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9TQUZFX0RXT1JEIHNyY19waXRjaCA9CisgICAgICBDYWxjdWxhdGVQaXRjaDgobV9icGMsIG1fbkNvbXBvbmVudHMsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKKyAgaWYgKCFzcmNfcGl0Y2guSXNWYWxpZCgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcFN0cmVhbUFjYyA9IG5ldyBDUERGX1N0cmVhbUFjYzsKKyAgbV9wU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSwgc3JjX3BpdGNoLlZhbHVlT3JEaWUoKSwgVFJVRSk7CisgIGlmIChtX3BTdHJlYW1BY2MtPkdldFNpemUoKSA9PSAwIHx8IG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFDcmVhdGVEZWNvZGVyKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fYkltYWdlTWFzaykgeworICAgIG1fYnBwID0gMTsKKyAgICBtX2JwYyA9IDE7CisgICAgbV9uQ29tcG9uZW50cyA9IDE7CisgICAgbV9BbHBoYUZsYWcgPSAxOworICB9IGVsc2UgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA9PSAxKSB7CisgICAgbV9icHAgPSAxOworICB9IGVsc2UgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA8PSA4KSB7CisgICAgbV9icHAgPSA4OworICB9IGVsc2UgeworICAgIG1fYnBwID0gMjQ7CisgIH0KKyAgRlhfU0FGRV9EV09SRCBwaXRjaCA9IENhbGN1bGF0ZVBpdGNoMzIobV9icHAsIG1fV2lkdGgpOworICBpZiAoIXBpdGNoLklzVmFsaWQoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BMaW5lQnVmID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKKyAgaWYgKG1fcENvbG9yU3BhY2UgJiYgYlN0ZENTKSB7CisgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihUUlVFKTsKKyAgfQorICBMb2FkUGFsZXR0ZSgpOworICBpZiAobV9iQ29sb3JLZXkpIHsKKyAgICBtX2JwcCA9IDMyOworICAgIG1fQWxwaGFGbGFnID0gMjsKKyAgICBwaXRjaCA9IENhbGN1bGF0ZVBpdGNoMzIobV9icHAsIG1fV2lkdGgpOwogICAgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBtX3BMaW5lQnVmID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKLSAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgewotICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKFRSVUUpOwotICAgIH0KLSAgICBMb2FkUGFsZXR0ZSgpOwotICAgIGlmIChtX2JDb2xvcktleSkgewotICAgICAgICBtX2JwcCA9IDMyOwotICAgICAgICBtX0FscGhhRmxhZyA9IDI7Ci0gICAgICAgIHBpdGNoID0gQ2FsY3VsYXRlUGl0Y2gzMihtX2JwcCwgbV9XaWR0aCk7Ci0gICAgICAgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBtX3BNYXNrZWRMaW5lID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKLSAgICB9Ci0gICAgbV9QaXRjaCA9IHBpdGNoLlZhbHVlT3JEaWUoKTsKLSAgICByZXR1cm4gMTsKKyAgICBtX3BNYXNrZWRMaW5lID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKKyAgfQorICBtX1BpdGNoID0gcGl0Y2guVmFsdWVPckRpZSgpOworICBpZiAocHBNYXNrKSB7CisgICAgKnBwTWFzayA9IExvYWRNYXNrKCpwTWF0dGVDb2xvcik7CisgIH0KKyAgaWYgKG1fcENvbG9yU3BhY2UgJiYgYlN0ZENTKSB7CisgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihGQUxTRSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1pbnQJQ1BERl9ESUJTb3VyY2U6OlN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiSGFzTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrKQotewotICAgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7CitpbnQgQ1BERl9ESUJTb3VyY2U6OkNvbnRpbnVlVG9Mb2FkTWFzaygpIHsKKyAgaWYgKG1fYkltYWdlTWFzaykgeworICAgIG1fYnBwID0gMTsKKyAgICBtX2JwYyA9IDE7CisgICAgbV9uQ29tcG9uZW50cyA9IDE7CisgICAgbV9BbHBoYUZsYWcgPSAxOworICB9IGVsc2UgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA9PSAxKSB7CisgICAgbV9icHAgPSAxOworICB9IGVsc2UgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA8PSA4KSB7CisgICAgbV9icHAgPSA4OworICB9IGVsc2UgeworICAgIG1fYnBwID0gMjQ7CisgIH0KKyAgaWYgKCFtX2JwYyB8fCAhbV9uQ29tcG9uZW50cykgeworICAgIHJldHVybiAwOworICB9CisgIEZYX1NBRkVfRFdPUkQgcGl0Y2ggPSBDYWxjdWxhdGVQaXRjaDMyKG1fYnBwLCBtX1dpZHRoKTsKKyAgaWYgKCFwaXRjaC5Jc1ZhbGlkKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtX3BMaW5lQnVmID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKKyAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpIHsKKyAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKFRSVUUpOworICB9CisgIExvYWRQYWxldHRlKCk7CisgIGlmIChtX2JDb2xvcktleSkgeworICAgIG1fYnBwID0gMzI7CisgICAgbV9BbHBoYUZsYWcgPSAyOworICAgIHBpdGNoID0gQ2FsY3VsYXRlUGl0Y2gzMihtX2JwcCwgbV9XaWR0aCk7CisgICAgaWYgKCFwaXRjaC5Jc1ZhbGlkKCkpIHsKKyAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBtX3BEb2N1bWVudCA9IHBEb2M7Ci0gICAgbV9wRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKLSAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOwotICAgIG1fYlN0ZENTID0gYlN0ZENTOwotICAgIG1fYkhhc01hc2sgPSBiSGFzTWFzazsKLSAgICBtX1dpZHRoID0gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSk7Ci0gICAgbV9IZWlnaHQgPSBtX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7Ci0gICAgaWYgKG1fV2lkdGggPD0gMCB8fCBtX0hlaWdodCA8PSAwIHx8IG1fV2lkdGggPiAweDAxZmZmZiB8fCBtX0hlaWdodCA+IDB4MDFmZmZmKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBtX0dyb3VwRmFtaWx5ID0gR3JvdXBGYW1pbHk7Ci0gICAgbV9iTG9hZE1hc2sgPSBiTG9hZE1hc2s7Ci0gICAgaWYgKCFMb2FkQ29sb3JJbmZvKG1fcFN0cmVhbS0+R2V0T2JqTnVtKCkgIT0gMCA/IE5VTEwgOiBwRm9ybVJlc291cmNlcywgcFBhZ2VSZXNvdXJjZXMpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobV9iRG9CcGNDaGVjayAmJiAobV9icGMgPT0gMCB8fCBtX25Db21wb25lbnRzID09IDApKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9TQUZFX0RXT1JEIHNyY19waXRjaCA9Ci0gICAgICAgIENhbGN1bGF0ZVBpdGNoOChtX2JwYywgbV9uQ29tcG9uZW50cywgbV9XaWR0aCwgbV9IZWlnaHQpOwotICAgIGlmICghc3JjX3BpdGNoLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgbV9wU3RyZWFtQWNjID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgIG1fcFN0cmVhbUFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UsIHNyY19waXRjaC5WYWx1ZU9yRGllKCksIFRSVUUpOwotICAgIGlmIChtX3BTdHJlYW1BY2MtPkdldFNpemUoKSA9PSAwIHx8IG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludCByZXQgPSBDcmVhdGVEZWNvZGVyKCk7Ci0gICAgaWYgKHJldCAhPSAxKSB7Ci0gICAgICAgIGlmICghcmV0KSB7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIGlmICghQ29udGludWVUb0xvYWRNYXNrKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2JIYXNNYXNrKSB7Ci0gICAgICAgICAgICBTdHJhdExvYWRNYXNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICBtX3BNYXNrZWRMaW5lID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKKyAgfQorICBtX1BpdGNoID0gcGl0Y2guVmFsdWVPckRpZSgpOworICByZXR1cm4gMTsKK30KK2ludCBDUERGX0RJQlNvdXJjZTo6U3RhcnRMb2FkRElCU291cmNlKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhhc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzaykgeworICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbV9wRG9jdW1lbnQgPSBwRG9jOworICBtX3BEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworICBtX3BTdHJlYW0gPSBwU3RyZWFtOworICBtX2JTdGRDUyA9IGJTdGRDUzsKKyAgbV9iSGFzTWFzayA9IGJIYXNNYXNrOworICBtX1dpZHRoID0gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSk7CisgIG1fSGVpZ2h0ID0gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiSGVpZ2h0IikpOworICBpZiAobV9XaWR0aCA8PSAwIHx8IG1fSGVpZ2h0IDw9IDAgfHwgbV9XaWR0aCA+IDB4MDFmZmZmIHx8CisgICAgICBtX0hlaWdodCA+IDB4MDFmZmZmKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbV9Hcm91cEZhbWlseSA9IEdyb3VwRmFtaWx5OworICBtX2JMb2FkTWFzayA9IGJMb2FkTWFzazsKKyAgaWYgKCFMb2FkQ29sb3JJbmZvKG1fcFN0cmVhbS0+R2V0T2JqTnVtKCkgIT0gMCA/IE5VTEwgOiBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgIHBQYWdlUmVzb3VyY2VzKSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChtX2JEb0JwY0NoZWNrICYmIChtX2JwYyA9PSAwIHx8IG1fbkNvbXBvbmVudHMgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGWF9TQUZFX0RXT1JEIHNyY19waXRjaCA9CisgICAgICBDYWxjdWxhdGVQaXRjaDgobV9icGMsIG1fbkNvbXBvbmVudHMsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKKyAgaWYgKCFzcmNfcGl0Y2guSXNWYWxpZCgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbV9wU3RyZWFtQWNjID0gbmV3IENQREZfU3RyZWFtQWNjOworICBtX3BTdHJlYW1BY2MtPkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFLCBzcmNfcGl0Y2guVmFsdWVPckRpZSgpLCBUUlVFKTsKKyAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpID09IDAgfHwgbV9wU3RyZWFtQWNjLT5HZXREYXRhKCkgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGludCByZXQgPSBDcmVhdGVEZWNvZGVyKCk7CisgIGlmIChyZXQgIT0gMSkgeworICAgIGlmICghcmV0KSB7CisgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICBpZiAoIUNvbnRpbnVlVG9Mb2FkTWFzaygpKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChtX2JIYXNNYXNrKSB7Ci0gICAgICAgIHJldCA9IFN0cmF0TG9hZE1hc2soKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOworICAgICAgU3RyYXRMb2FkTWFzaygpOwogICAgIH0KICAgICByZXR1cm4gcmV0OwotfQotaW50CUNQREZfRElCU291cmNlOjpDb250aW51ZUxvYWRESUJTb3VyY2UoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhDT0RFQ19TVEFUVVMgcmV0OwotICAgIGlmIChtX1N0YXR1cyA9PSAxKSB7Ci0gICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBkZWNvZGVyID0gbV9wU3RyZWFtQWNjLT5HZXRJbWFnZURlY29kZXIoKTsKLSAgICAgICAgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkpQWERlY29kZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBJQ29kZWNfSmJpZzJNb2R1bGUqIHBKYmlnMk1vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SmJpZzJNb2R1bGUoKTsKLSAgICAgICAgaWYgKG1fcEpiaWcyQ29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtX3BKYmlnMkNvbnRleHQgPSBwSmJpZzJNb2R1bGUtPkNyZWF0ZUpiaWcyQ29udGV4dCgpOwotICAgICAgICAgICAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VQYXJhbSgpKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBHbG9iYWxzID0gbV9wU3RyZWFtQWNjLT5HZXRJbWFnZVBhcmFtKCktPkdldFN0cmVhbShGWF9CU1RSQygiSkJJRzJHbG9iYWxzIikpOwotICAgICAgICAgICAgICAgIGlmIChwR2xvYmFscykgewotICAgICAgICAgICAgICAgICAgICBtX3BHbG9iYWxTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgICAgICAgICAgICAgICAgIG1fcEdsb2JhbFN0cmVhbS0+TG9hZEFsbERhdGEocEdsb2JhbHMsIEZBTFNFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXQgPSBwSmJpZzJNb2R1bGUtPlN0YXJ0RGVjb2RlKG1fcEpiaWcyQ29udGV4dCwgbV9XaWR0aCwgbV9IZWlnaHQsIG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpLCBtX3BTdHJlYW1BY2MtPkdldFNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wR2xvYmFsU3RyZWFtID8gbV9wR2xvYmFsU3RyZWFtLT5HZXREYXRhKCkgOiBOVUxMLCBtX3BHbG9iYWxTdHJlYW0gPyBtX3BHbG9iYWxTdHJlYW0tPkdldFNpemUoKSA6IDAsIG1fcENhY2hlZEJpdG1hcC0+R2V0QnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENhY2hlZEJpdG1hcC0+R2V0UGl0Y2goKSwgcFBhdXNlKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbV9wQ2FjaGVkQml0bWFwLnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fcEdsb2JhbFN0cmVhbTsKLSAgICAgICAgICAgICAgICBtX3BHbG9iYWxTdHJlYW0gPSBOVUxMOwotICAgICAgICAgICAgICAgIHBKYmlnMk1vZHVsZS0+RGVzdHJveUpiaWcyQ29udGV4dChtX3BKYmlnMkNvbnRleHQpOwotICAgICAgICAgICAgICAgIG1fcEpiaWcyQ29udGV4dCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmV0ID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCByZXQxID0gMTsKLSAgICAgICAgICAgIGlmIChtX2JIYXNNYXNrKSB7Ci0gICAgICAgICAgICAgICAgcmV0MSA9IENvbnRpbnVlTG9hZE1hc2tESUIocFBhdXNlKTsKLSAgICAgICAgICAgICAgICBtX1N0YXR1cyA9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmV0MSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgewotICAgICAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDE7Ci0gICAgICAgIH0KLSAgICAgICAgRlhDT0RFQ19TVEFUVVMgcmV0ID0gcEpiaWcyTW9kdWxlLT5Db250aW51ZURlY29kZShtX3BKYmlnMkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBtX3BDYWNoZWRCaXRtYXAucmVzZXQoKTsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BHbG9iYWxTdHJlYW07Ci0gICAgICAgICAgICBtX3BHbG9iYWxTdHJlYW0gPSBOVUxMOwotICAgICAgICAgICAgcEpiaWcyTW9kdWxlLT5EZXN0cm95SmJpZzJDb250ZXh0KG1fcEpiaWcyQ29udGV4dCk7Ci0gICAgICAgICAgICBtX3BKYmlnMkNvbnRleHQgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBpbnQgcmV0MSA9IDE7Ci0gICAgICAgIGlmIChtX2JIYXNNYXNrKSB7Ci0gICAgICAgICAgICByZXQxID0gQ29udGludWVMb2FkTWFza0RJQihwUGF1c2UpOwotICAgICAgICAgICAgbV9TdGF0dXMgPSAyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXQxID09IDIpIHsKLSAgICAgICAgICAgIHJldHVybiByZXQxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKEZBTFNFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0MTsKLSAgICB9Ci0gICAgaWYgKG1fU3RhdHVzID09IDIpIHsKLSAgICAgICAgcmV0dXJuIENvbnRpbnVlTG9hZE1hc2tESUIocFBhdXNlKTsKLSAgICB9CisgIH0KKyAgaWYgKCFDb250aW51ZVRvTG9hZE1hc2soKSkgewogICAgIHJldHVybiAwOworICB9CisgIGlmIChtX2JIYXNNYXNrKSB7CisgICAgcmV0ID0gU3RyYXRMb2FkTWFzaygpOworICB9CisgIGlmIChyZXQgPT0gMikgeworICAgIHJldHVybiByZXQ7CisgIH0KKyAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpIHsKKyAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKEZBTFNFKTsKKyAgfQorICByZXR1cm4gcmV0OwogfQotRlhfQk9PTCBDUERGX0RJQlNvdXJjZTo6TG9hZENvbG9ySW5mbyhDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzKQotewotICAgIG1fYnBjX29yaWcgPSBtX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IikpOwotICAgIGlmIChtX3BEaWN0LT5HZXRJbnRlZ2VyKCJJbWFnZU1hc2siKSkgewotICAgICAgICBtX2JJbWFnZU1hc2sgPSBUUlVFOwotICAgIH0KLSAgICBpZiAobV9iSW1hZ2VNYXNrIHx8ICFtX3BEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiQ29sb3JTcGFjZSIpKSkgewotICAgICAgICBpZiAoIW1fYkltYWdlTWFzaykgewotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBGaWx0ZXIgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZpbHRlciIpKTsKLSAgICAgICAgICAgIGlmIChwRmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZmlsdGVyOwotICAgICAgICAgICAgICAgIGlmIChwRmlsdGVyLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gcEZpbHRlci0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gRlhfQlNUUkMoIkpQWERlY29kZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2JEb0JwY0NoZWNrID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocEZpbHRlci0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcEZpbHRlcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBcnJheS0+R2V0U3RyaW5nKHBBcnJheS0+R2V0Q291bnQoKSAtIDEpID09IEZYX0JTVFJDKCJKUFhEZWNvZGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9iRG9CcGNDaGVjayA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9iSW1hZ2VNYXNrID0gVFJVRTsKLSAgICAgICAgbV9icGMgPSBtX25Db21wb25lbnRzID0gMTsKLSAgICAgICAgQ1BERl9BcnJheSogcERlY29kZSA9IG1fcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEZWNvZGUiKSk7Ci0gICAgICAgIG1fYkRlZmF1bHREZWNvZGUgPSBwRGVjb2RlID09IE5VTEwgfHwgcERlY29kZS0+R2V0SW50ZWdlcigwKSA9PSAwOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBDU09iaiA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKLSAgICBpZiAocENTT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKLSAgICBpZiAocEZvcm1SZXNvdXJjZXMpIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZSA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIHBGb3JtUmVzb3VyY2VzKTsKLSAgICB9Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UgPT0gTlVMTCkgewotICAgICAgICBtX3BDb2xvclNwYWNlID0gcERvY1BhZ2VEYXRhLT5HZXRDb2xvclNwYWNlKHBDU09iaiwgcFBhZ2VSZXNvdXJjZXMpOwotICAgIH0KLSAgICBpZiAobV9wQ29sb3JTcGFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9GYW1pbHkgPSBtX3BDb2xvclNwYWNlLT5HZXRGYW1pbHkoKTsKLSAgICBtX25Db21wb25lbnRzID0gbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCk7Ci0gICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0lDQ0JBU0VEICYmIHBDU09iai0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNzID0gcENTT2JqLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgaWYgKGNzID09IEZYX0JTVFJDKCJEZXZpY2VHcmF5IikpIHsKLSAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPSAxOwotICAgICAgICB9IGVsc2UgaWYgKGNzID09IEZYX0JTVFJDKCJEZXZpY2VSR0IiKSkgewotICAgICAgICAgICAgbV9uQ29tcG9uZW50cyA9IDM7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3MgPT0gRlhfQlNUUkMoIkRldmljZUNNWUsiKSkgewotICAgICAgICAgICAgbV9uQ29tcG9uZW50cyA9IDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgVmFsaWRhdGVEaWN0UGFyYW0oKTsKLSAgICBtX3BDb21wRGF0YSA9IEdldERlY29kZUFuZE1hc2tBcnJheShtX2JEZWZhdWx0RGVjb2RlLCBtX2JDb2xvcktleSk7Ci0gICAgaWYgKG1fcENvbXBEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLURJQl9DT01QX0RBVEEqIENQREZfRElCU291cmNlOjpHZXREZWNvZGVBbmRNYXNrQXJyYXkoRlhfQk9PTCYgYkRlZmF1bHREZWNvZGUsIEZYX0JPT0wmIGJDb2xvcktleSkKLXsKLSAgICBpZiAobV9wQ29sb3JTcGFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBESUJfQ09NUF9EQVRBKiBwQ29tcERhdGEgPSBGWF9BbGxvYyhESUJfQ09NUF9EQVRBLCBtX25Db21wb25lbnRzKTsKLSAgICBpbnQgbWF4X2RhdGEgPSAoMSA8PCBtX2JwYykgLSAxOwotICAgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBtX3BEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVjb2RlIikpOwotICAgIGlmIChwRGVjb2RlKSB7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpICsrKSB7Ci0gICAgICAgICAgICBwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4gPSBwRGVjb2RlLT5HZXROdW1iZXIoaSAqIDIpOwotICAgICAgICAgICAgRlhfRkxPQVQgbWF4ID0gcERlY29kZS0+R2V0TnVtYmVyKGkgKiAyICsgMSk7Ci0gICAgICAgICAgICBwQ29tcERhdGFbaV0ubV9EZWNvZGVTdGVwID0gKG1heCAtIHBDb21wRGF0YVtpXS5tX0RlY29kZU1pbikgLyBtYXhfZGF0YTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGRlZl92YWx1ZSwgZGVmX21pbiwgZGVmX21heDsKLSAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkdldERlZmF1bHRWYWx1ZShpLCBkZWZfdmFsdWUsIGRlZl9taW4sIGRlZl9tYXgpOwotICAgICAgICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0lOREVYRUQpIHsKLSAgICAgICAgICAgICAgICBkZWZfbWF4ID0gKEZYX0ZMT0FUKW1heF9kYXRhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlZl9taW4gIT0gcENvbXBEYXRhW2ldLm1fRGVjb2RlTWluIHx8IGRlZl9tYXggIT0gbWF4KSB7Ci0gICAgICAgICAgICAgICAgYkRlZmF1bHREZWNvZGUgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpICsrKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCBkZWZfdmFsdWU7Ci0gICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5HZXREZWZhdWx0VmFsdWUoaSwgZGVmX3ZhbHVlLCBwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4sIHBDb21wRGF0YVtpXS5tX0RlY29kZVN0ZXApOwotICAgICAgICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0lOREVYRUQpIHsKLSAgICAgICAgICAgICAgICBwQ29tcERhdGFbaV0ubV9EZWNvZGVTdGVwID0gKEZYX0ZMT0FUKW1heF9kYXRhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCA9IChwQ29tcERhdGFbaV0ubV9EZWNvZGVTdGVwIC0gcENvbXBEYXRhW2ldLm1fRGVjb2RlTWluKSAvIG1heF9kYXRhOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghbV9wRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlNNYXNrIikpKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwTWFzayA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiTWFzayIpKTsKLSAgICAgICAgaWYgKHBNYXNrID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBwQ29tcERhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBNYXNrLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcE1hc2s7Ci0gICAgICAgICAgICBpZiAocEFycmF5LT5HZXRDb3VudCgpID49IG1fbkNvbXBvbmVudHMgKiAyKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgbWluX251bSA9IHBBcnJheS0+R2V0SW50ZWdlcihpICogMik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtYXhfbnVtID0gcEFycmF5LT5HZXRJbnRlZ2VyKGkgKiAyICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDb21wRGF0YVtpXS5tX0NvbG9yS2V5TWluID0gRlhfTUFYKG1pbl9udW0sIDApOwotICAgICAgICAgICAgICAgICAgICBwQ29tcERhdGFbaV0ubV9Db2xvcktleU1heCA9IEZYX01JTihtYXhfbnVtLCBtYXhfZGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkNvbG9yS2V5ID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcENvbXBEYXRhOwotfQotSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGYXhEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcyk7Ci1JQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBGUERGQVBJX0NyZWF0ZUZsYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpOwotaW50IENQREZfRElCU291cmNlOjpDcmVhdGVEZWNvZGVyKCkKLXsKK2ludCBDUERGX0RJQlNvdXJjZTo6Q29udGludWVMb2FkRElCU291cmNlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYQ09ERUNfU1RBVFVTIHJldDsKKyAgaWYgKG1fU3RhdHVzID09IDEpIHsKICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgZGVjb2RlciA9IG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VEZWNvZGVyKCk7Ci0gICAgaWYgKGRlY29kZXIuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiAxOworICAgIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJKUFhEZWNvZGUiKSkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChtX2JEb0JwY0NoZWNrICYmIG1fYnBjID09IDApIHsKKyAgICBJQ29kZWNfSmJpZzJNb2R1bGUqIHBKYmlnMk1vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SmJpZzJNb2R1bGUoKTsKKyAgICBpZiAobV9wSmJpZzJDb250ZXh0ID09IE5VTEwpIHsKKyAgICAgIG1fcEpiaWcyQ29udGV4dCA9IHBKYmlnMk1vZHVsZS0+Q3JlYXRlSmJpZzJDb250ZXh0KCk7CisgICAgICBpZiAobV9wU3RyZWFtQWNjLT5HZXRJbWFnZVBhcmFtKCkpIHsKKyAgICAgICAgQ1BERl9TdHJlYW0qIHBHbG9iYWxzID0KKyAgICAgICAgICAgIG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VQYXJhbSgpLT5HZXRTdHJlYW0oRlhfQlNUUkMoIkpCSUcyR2xvYmFscyIpKTsKKyAgICAgICAgaWYgKHBHbG9iYWxzKSB7CisgICAgICAgICAgbV9wR2xvYmFsU3RyZWFtID0gbmV3IENQREZfU3RyZWFtQWNjOworICAgICAgICAgIG1fcEdsb2JhbFN0cmVhbS0+TG9hZEFsbERhdGEocEdsb2JhbHMsIEZBTFNFKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0ID0gcEpiaWcyTW9kdWxlLT5TdGFydERlY29kZSgKKyAgICAgICAgICBtX3BKYmlnMkNvbnRleHQsIG1fV2lkdGgsIG1fSGVpZ2h0LCBtX3BTdHJlYW1BY2MtPkdldERhdGEoKSwKKyAgICAgICAgICBtX3BTdHJlYW1BY2MtPkdldFNpemUoKSwKKyAgICAgICAgICBtX3BHbG9iYWxTdHJlYW0gPyBtX3BHbG9iYWxTdHJlYW0tPkdldERhdGEoKSA6IE5VTEwsCisgICAgICAgICAgbV9wR2xvYmFsU3RyZWFtID8gbV9wR2xvYmFsU3RyZWFtLT5HZXRTaXplKCkgOiAwLAorICAgICAgICAgIG1fcENhY2hlZEJpdG1hcC0+R2V0QnVmZmVyKCksIG1fcENhY2hlZEJpdG1hcC0+R2V0UGl0Y2goKSwgcFBhdXNlKTsKKyAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIG1fcENhY2hlZEJpdG1hcC5yZXNldCgpOworICAgICAgICBkZWxldGUgbV9wR2xvYmFsU3RyZWFtOworICAgICAgICBtX3BHbG9iYWxTdHJlYW0gPSBOVUxMOworICAgICAgICBwSmJpZzJNb2R1bGUtPkRlc3Ryb3lKYmlnMkNvbnRleHQobV9wSmJpZzJDb250ZXh0KTsKKyAgICAgICAgbV9wSmJpZzJDb250ZXh0ID0gTlVMTDsKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19kYXRhID0gbV9wU3RyZWFtQWNjLT5HZXREYXRhKCk7Ci0gICAgRlhfRFdPUkQgc3JjX3NpemUgPSBtX3BTdHJlYW1BY2MtPkdldFNpemUoKTsKLSAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMgPSBtX3BTdHJlYW1BY2MtPkdldEltYWdlUGFyYW0oKTsKLSAgICBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiQ0NJVFRGYXhEZWNvZGUiKSkgewotICAgICAgICBtX3BEZWNvZGVyID0gRlBERkFQSV9DcmVhdGVGYXhEZWNvZGVyKHNyY19kYXRhLCBzcmNfc2l6ZSwgbV9XaWR0aCwgbV9IZWlnaHQsIHBQYXJhbXMpOwotICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiRENURGVjb2RlIikpIHsKLSAgICAgICAgbV9wRGVjb2RlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKAotICAgICAgICAgICAgc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwgbV9uQ29tcG9uZW50cywKLSAgICAgICAgICAgIHBQYXJhbXMgPyBwUGFyYW1zLT5HZXRJbnRlZ2VyKCJDb2xvclRyYW5zZm9ybSIsIDEpIDogMSk7Ci0gICAgICAgIGlmICghbV9wRGVjb2RlcikgewotICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNmb3JtID0gRkFMU0U7Ci0gICAgICAgICAgICBpbnQgY29tcHMsIGJwYzsKLSAgICAgICAgICAgIElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpOwotICAgICAgICAgICAgaWYgKHBKcGVnTW9kdWxlLT5Mb2FkSW5mbyhzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LCBjb21wcywgYnBjLCBiVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgICAgIGlmIChtX25Db21wb25lbnRzICE9IGNvbXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUobV9wQ29tcERhdGEpOwotICAgICAgICAgICAgICAgICAgICBtX25Db21wb25lbnRzID0gY29tcHM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19MQUIgJiYgbV9uQ29tcG9uZW50cyAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YSA9IEdldERlY29kZUFuZE1hc2tBcnJheShtX2JEZWZhdWx0RGVjb2RlLCBtX2JDb2xvcktleSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BDb21wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX2JwYyA9IGJwYzsKLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVyID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPkNyZWF0ZURlY29kZXIoc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uQ29tcG9uZW50cywgYlRyYW5zZm9ybSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkZsYXRlRGVjb2RlIikpIHsKLSAgICAgICAgbV9wRGVjb2RlciA9IEZQREZBUElfQ3JlYXRlRmxhdGVEZWNvZGVyKHNyY19kYXRhLCBzcmNfc2l6ZSwgbV9XaWR0aCwgbV9IZWlnaHQsIG1fbkNvbXBvbmVudHMsIG1fYnBjLCBwUGFyYW1zKTsKLSAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkpQWERlY29kZSIpKSB7Ci0gICAgICAgIExvYWRKcHhCaXRtYXAoKTsKLSAgICAgICAgcmV0dXJuIG1fcENhY2hlZEJpdG1hcCA/IDEgOiAwOwotICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiSkJJRzJEZWNvZGUiKSkgewotICAgICAgICBtX3BDYWNoZWRCaXRtYXAucmVzZXQobmV3IENGWF9ESUJpdG1hcCk7Ci0gICAgICAgIGlmICghbV9wQ2FjaGVkQml0bWFwLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIG1fYkltYWdlTWFzayA/IEZYRElCXzFicHBNYXNrIDogRlhESUJfMWJwcFJnYikpIHsKLSAgICAgICAgICAgIG1fcENhY2hlZEJpdG1hcC5yZXNldCgpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbV9TdGF0dXMgPSAxOworICAgICAgfQorICAgICAgaWYgKHJldCA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7CiAgICAgICAgIHJldHVybiAyOwotICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiUnVuTGVuZ3RoRGVjb2RlIikpIHsKLSAgICAgICAgbV9wRGVjb2RlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0QmFzaWNNb2R1bGUoKS0+Q3JlYXRlUnVuTGVuZ3RoRGVjb2RlcihzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LCBtX25Db21wb25lbnRzLCBtX2JwYyk7CisgICAgICB9CisgICAgICBpbnQgcmV0MSA9IDE7CisgICAgICBpZiAobV9iSGFzTWFzaykgeworICAgICAgICByZXQxID0gQ29udGludWVMb2FkTWFza0RJQihwUGF1c2UpOworICAgICAgICBtX1N0YXR1cyA9IDI7CisgICAgICB9CisgICAgICBpZiAocmV0MSA9PSAyKSB7CisgICAgICAgIHJldHVybiByZXQxOworICAgICAgfQorICAgICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpIHsKKyAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihGQUxTRSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmV0MTsKICAgICB9Ci0gICAgaWYgKCFtX3BEZWNvZGVyKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIEZYX1NBRkVfRFdPUkQgcmVxdWVzdGVkX3BpdGNoID0KLSAgICAgICAgQ2FsY3VsYXRlUGl0Y2g4KG1fYnBjLCBtX25Db21wb25lbnRzLCBtX1dpZHRoLCAxKTsKLSAgICBpZiAoIXJlcXVlc3RlZF9waXRjaC5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgRlhDT0RFQ19TVEFUVVMgcmV0ID0gcEpiaWcyTW9kdWxlLT5Db250aW51ZURlY29kZShtX3BKYmlnMkNvbnRleHQsIHBQYXVzZSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgIG1fcENhY2hlZEJpdG1hcC5yZXNldCgpOworICAgICAgZGVsZXRlIG1fcEdsb2JhbFN0cmVhbTsKKyAgICAgIG1fcEdsb2JhbFN0cmVhbSA9IE5VTEw7CisgICAgICBwSmJpZzJNb2R1bGUtPkRlc3Ryb3lKYmlnMkNvbnRleHQobV9wSmJpZzJDb250ZXh0KTsKKyAgICAgIG1fcEpiaWcyQ29udGV4dCA9IE5VTEw7CisgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgRlhfU0FGRV9EV09SRCBwcm92aWRlZF9waXRjaCA9IENhbGN1bGF0ZVBpdGNoOChtX3BEZWNvZGVyLT5HZXRCUEMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERlY29kZXItPkNvdW50Q29tcHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERlY29kZXItPkdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgICBpZiAoIXByb3ZpZGVkX3BpdGNoLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocmV0ID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKKyAgICAgIHJldHVybiAyOwogICAgIH0KLSAgICBpZiAocHJvdmlkZWRfcGl0Y2guVmFsdWVPckRpZSgpIDwgcmVxdWVzdGVkX3BpdGNoLlZhbHVlT3JEaWUoKSkgewotICAgICAgICByZXR1cm4gMDsKKyAgICBpbnQgcmV0MSA9IDE7CisgICAgaWYgKG1fYkhhc01hc2spIHsKKyAgICAgIHJldDEgPSBDb250aW51ZUxvYWRNYXNrRElCKHBQYXVzZSk7CisgICAgICBtX1N0YXR1cyA9IDI7CiAgICAgfQotICAgIHJldHVybiAxOworICAgIGlmIChyZXQxID09IDIpIHsKKyAgICAgIHJldHVybiByZXQxOworICAgIH0KKyAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgeworICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihGQUxTRSk7CisgICAgfQorICAgIHJldHVybiByZXQxOworICB9CisgIGlmIChtX1N0YXR1cyA9PSAyKSB7CisgICAgcmV0dXJuIENvbnRpbnVlTG9hZE1hc2tESUIocFBhdXNlKTsKKyAgfQorICByZXR1cm4gMDsKIH0KLXZvaWQgQ1BERl9ESUJTb3VyY2U6OkxvYWRKcHhCaXRtYXAoKQotewotICAgIElDb2RlY19KcHhNb2R1bGUqIHBKcHhNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpweE1vZHVsZSgpOwotICAgIGlmICghcEpweE1vZHVsZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPEpweEJpdE1hcENvbnRleHQ+IGNvbnRleHQoCi0gICAgICAgIG5ldyBKcHhCaXRNYXBDb250ZXh0KHBKcHhNb2R1bGUpKTsKLSAgICBjb250ZXh0LT5zZXRfY29udGV4dChwSnB4TW9kdWxlLT5DcmVhdGVEZWNvZGVyKG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RyZWFtQWNjLT5HZXRTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlICE9IG51bGxwdHIpKTsKLSAgICBpZiAoIWNvbnRleHQtPmNvbnRleHQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRlhfRFdPUkQgd2lkdGggPSAwOwotICAgIEZYX0RXT1JEIGhlaWdodCA9IDA7Ci0gICAgRlhfRFdPUkQgY29kZXN0cmVhbV9uQ29tcHMgPSAwOwotICAgIEZYX0RXT1JEIGltYWdlX25Db21wcyA9IDA7Ci0gICAgcEpweE1vZHVsZS0+R2V0SW1hZ2VJbmZvKGNvbnRleHQtPmNvbnRleHQoKSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXN0cmVhbV9uQ29tcHMsIGltYWdlX25Db21wcyk7Ci0gICAgaWYgKChpbnQpd2lkdGggPCBtX1dpZHRoIHx8IChpbnQpaGVpZ2h0IDwgbV9IZWlnaHQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGludCBvdXRwdXRfbkNvbXBzOwotICAgIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yOwotICAgIEZYX0JPT0wgYlN3YXBSR0IgPSBGQUxTRTsKLSAgICBpZiAobV9wQ29sb3JTcGFjZSkgewotICAgICAgICBpZiAoY29kZXN0cmVhbV9uQ29tcHMgIT0gKEZYX0RXT1JEKW1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBvdXRwdXRfbkNvbXBzID0gY29kZXN0cmVhbV9uQ29tcHM7Ci0gICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IEZBTFNFOwotICAgICAgICBpZiAobV9wQ29sb3JTcGFjZSA9PSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKSkgewotICAgICAgICAgICAgYlN3YXBSR0IgPSBUUlVFOwotICAgICAgICAgICAgbV9wQ29sb3JTcGFjZSA9IG51bGxwdHI7CitGWF9CT09MIENQREZfRElCU291cmNlOjpMb2FkQ29sb3JJbmZvKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMpIHsKKyAgbV9icGNfb3JpZyA9IG1fcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSk7CisgIGlmIChtX3BEaWN0LT5HZXRJbnRlZ2VyKCJJbWFnZU1hc2siKSkgeworICAgIG1fYkltYWdlTWFzayA9IFRSVUU7CisgIH0KKyAgaWYgKG1fYkltYWdlTWFzayB8fCAhbV9wRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSkpIHsKKyAgICBpZiAoIW1fYkltYWdlTWFzaykgeworICAgICAgQ1BERl9PYmplY3QqIHBGaWx0ZXIgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZpbHRlciIpKTsKKyAgICAgIGlmIChwRmlsdGVyKSB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpbHRlcjsKKyAgICAgICAgaWYgKHBGaWx0ZXItPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgeworICAgICAgICAgIGZpbHRlciA9IHBGaWx0ZXItPkdldFN0cmluZygpOworICAgICAgICAgIGlmIChmaWx0ZXIgPT0gRlhfQlNUUkMoIkpQWERlY29kZSIpKSB7CisgICAgICAgICAgICBtX2JEb0JwY0NoZWNrID0gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocEZpbHRlci0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwRmlsdGVyOworICAgICAgICAgIGlmIChwQXJyYXktPkdldFN0cmluZyhwQXJyYXktPkdldENvdW50KCkgLSAxKSA9PQorICAgICAgICAgICAgICBGWF9CU1RSQygiSlBYRGVjb2RlIikpIHsKKyAgICAgICAgICAgIG1fYkRvQnBjQ2hlY2sgPSBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IFRSVUU7Ci0gICAgICAgIGlmIChpbWFnZV9uQ29tcHMpIHsKLSAgICAgICAgICAgIG91dHB1dF9uQ29tcHMgPSBpbWFnZV9uQ29tcHM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXRwdXRfbkNvbXBzID0gY29kZXN0cmVhbV9uQ29tcHM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG91dHB1dF9uQ29tcHMgPT0gMykgewotICAgICAgICAgICAgYlN3YXBSR0IgPSBUUlVFOwotICAgICAgICB9IGVsc2UgaWYgKG91dHB1dF9uQ29tcHMgPT0gNCkgewotICAgICAgICAgICAgbV9wQ29sb3JTcGFjZSA9IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKLSAgICAgICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1fbkNvbXBvbmVudHMgPSBvdXRwdXRfbkNvbXBzOworICAgICAgfQogICAgIH0KLSAgICBGWERJQl9Gb3JtYXQgZm9ybWF0OwotICAgIGlmIChvdXRwdXRfbkNvbXBzID09IDEpIHsKLSAgICAgICAgZm9ybWF0ID0gRlhESUJfOGJwcFJnYjsKLSAgICB9IGVsc2UgaWYgKG91dHB1dF9uQ29tcHMgPD0gMykgewotICAgICAgICBmb3JtYXQgPSBGWERJQl9SZ2I7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXRfbkNvbXBzID09IDQpIHsKLSAgICAgICAgZm9ybWF0ID0gRlhESUJfUmdiMzI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2lkdGggPSAod2lkdGggKiBvdXRwdXRfbkNvbXBzICsgMikgLyAzOwotICAgICAgICBmb3JtYXQgPSBGWERJQl9SZ2I7CisgICAgbV9iSW1hZ2VNYXNrID0gVFJVRTsKKyAgICBtX2JwYyA9IG1fbkNvbXBvbmVudHMgPSAxOworICAgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBtX3BEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVjb2RlIikpOworICAgIG1fYkRlZmF1bHREZWNvZGUgPSBwRGVjb2RlID09IE5VTEwgfHwgcERlY29kZS0+R2V0SW50ZWdlcigwKSA9PSAwOworICAgIHJldHVybiBUUlVFOworICB9CisgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSk7CisgIGlmIChwQ1NPYmogPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKKyAgaWYgKHBGb3JtUmVzb3VyY2VzKSB7CisgICAgbV9wQ29sb3JTcGFjZSA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIHBGb3JtUmVzb3VyY2VzKTsKKyAgfQorICBpZiAobV9wQ29sb3JTcGFjZSA9PSBOVUxMKSB7CisgICAgbV9wQ29sb3JTcGFjZSA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIHBQYWdlUmVzb3VyY2VzKTsKKyAgfQorICBpZiAobV9wQ29sb3JTcGFjZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fRmFtaWx5ID0gbV9wQ29sb3JTcGFjZS0+R2V0RmFtaWx5KCk7CisgIG1fbkNvbXBvbmVudHMgPSBtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKTsKKyAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0lDQ0JBU0VEICYmIHBDU09iai0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgY3MgPSBwQ1NPYmotPkdldFN0cmluZygpOworICAgIGlmIChjcyA9PSBGWF9CU1RSQygiRGV2aWNlR3JheSIpKSB7CisgICAgICBtX25Db21wb25lbnRzID0gMTsKKyAgICB9IGVsc2UgaWYgKGNzID09IEZYX0JTVFJDKCJEZXZpY2VSR0IiKSkgeworICAgICAgbV9uQ29tcG9uZW50cyA9IDM7CisgICAgfSBlbHNlIGlmIChjcyA9PSBGWF9CU1RSQygiRGV2aWNlQ01ZSyIpKSB7CisgICAgICBtX25Db21wb25lbnRzID0gNDsKICAgICB9Ci0gICAgbV9wQ2FjaGVkQml0bWFwLnJlc2V0KG5ldyBDRlhfRElCaXRtYXApOwotICAgIGlmICghbV9wQ2FjaGVkQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KSkgewotICAgICAgICBtX3BDYWNoZWRCaXRtYXAucmVzZXQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BDYWNoZWRCaXRtYXAtPkNsZWFyKDB4RkZGRkZGRkYpOwotICAgIGNvbnRleHQtPnNldF9vdXRwdXRfb2Zmc2V0cyhGWF9BbGxvYyh1aW50OF90LCBvdXRwdXRfbkNvbXBzKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRfbkNvbXBzOyArK2kpCi0gICAgICAgIGNvbnRleHQtPm91dHB1dF9vZmZzZXRzKClbaV0gPSBpOwotICAgIGlmIChiU3dhcFJHQikgewotICAgICAgICBjb250ZXh0LT5vdXRwdXRfb2Zmc2V0cygpWzBdID0gMjsKLSAgICAgICAgY29udGV4dC0+b3V0cHV0X29mZnNldHMoKVsyXSA9IDA7Ci0gICAgfQotICAgIGlmICghcEpweE1vZHVsZS0+RGVjb2RlKGNvbnRleHQtPmNvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDYWNoZWRCaXRtYXAtPkdldEJ1ZmZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENhY2hlZEJpdG1hcC0+R2V0UGl0Y2goKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHJhbnNsYXRlQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+b3V0cHV0X29mZnNldHMoKSkpIHsKLSAgICAgICAgbV9wQ2FjaGVkQml0bWFwLnJlc2V0KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UgJiYKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfSU5ERVhFRCAmJgotICAgICAgICBtX2JwYyA8IDgpIHsKLSAgICAgICAgaW50IHNjYWxlID0gOCAtIG1fYnBjOwotICAgICAgICBmb3IgKEZYX0RXT1JEIHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgKytyb3cpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHNjYW5saW5lID0gKHVpbnQ4X3QqKW1fcENhY2hlZEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgY29sID0gMDsgY29sIDwgd2lkdGg7ICsrY29sKSB7Ci0gICAgICAgICAgICAgICAgKnNjYW5saW5lID0gKCpzY2FubGluZSkgPj4gc2NhbGU7Ci0gICAgICAgICAgICAgICAgKytzY2FubGluZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBtX2JwYyA9IDg7CisgIH0KKyAgVmFsaWRhdGVEaWN0UGFyYW0oKTsKKyAgbV9wQ29tcERhdGEgPSBHZXREZWNvZGVBbmRNYXNrQXJyYXkobV9iRGVmYXVsdERlY29kZSwgbV9iQ29sb3JLZXkpOworICBpZiAobV9wQ29tcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUNQREZfRElCU291cmNlKiBDUERGX0RJQlNvdXJjZTo6TG9hZE1hc2soRlhfRFdPUkQmIE1hdHRlQ29sb3IpCi17Ci0gICAgTWF0dGVDb2xvciA9IDB4ZmZmZmZmZmY7Ci0gICAgQ1BERl9TdHJlYW0qIHBTb2Z0TWFzayA9IG1fcERpY3QtPkdldFN0cmVhbShGWF9CU1RSQygiU01hc2siKSk7Ci0gICAgaWYgKHBTb2Z0TWFzaykgewotICAgICAgICBDUERGX0FycmF5KiBwTWF0dGUgPSBwU29mdE1hc2stPkdldERpY3QoKS0+R2V0QXJyYXkoRlhfQlNUUkMoIk1hdHRlIikpOwotICAgICAgICBpZiAocE1hdHRlICE9IE5VTEwgJiYgbV9wQ29sb3JTcGFjZSAmJiAoRlhfRFdPUkQpbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkgPD0gbV9uQ29tcG9uZW50cykgewotICAgICAgICAgICAgRlhfRkxPQVQqIHBDb2xvciA9IEZYX0FsbG9jKEZYX0ZMT0FULCBtX25Db21wb25lbnRzKTsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgcENvbG9yW2ldID0gcE1hdHRlLT5HZXRGbG9hdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0ZMT0FUIFIsIEcsIEI7Ci0gICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IocENvbG9yLCBSLCBHLCBCKTsKLSAgICAgICAgICAgIEZYX0ZyZWUocENvbG9yKTsKLSAgICAgICAgICAgIE1hdHRlQ29sb3IgPSBGWEFSR0JfTUFLRSgwLCBGWFNZU19yb3VuZChSICogMjU1KSwgRlhTWVNfcm91bmQoRyAqIDI1NSksIEZYU1lTX3JvdW5kKEIgKiAyNTUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTG9hZE1hc2tESUIocFNvZnRNYXNrKTsKK0RJQl9DT01QX0RBVEEqIENQREZfRElCU291cmNlOjpHZXREZWNvZGVBbmRNYXNrQXJyYXkoRlhfQk9PTCYgYkRlZmF1bHREZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJDb2xvcktleSkgeworICBpZiAobV9wQ29sb3JTcGFjZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRElCX0NPTVBfREFUQSogcENvbXBEYXRhID0gRlhfQWxsb2MoRElCX0NPTVBfREFUQSwgbV9uQ29tcG9uZW50cyk7CisgIGludCBtYXhfZGF0YSA9ICgxIDw8IG1fYnBjKSAtIDE7CisgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBtX3BEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVjb2RlIikpOworICBpZiAocERlY29kZSkgeworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpKyspIHsKKyAgICAgIHBDb21wRGF0YVtpXS5tX0RlY29kZU1pbiA9IHBEZWNvZGUtPkdldE51bWJlcihpICogMik7CisgICAgICBGWF9GTE9BVCBtYXggPSBwRGVjb2RlLT5HZXROdW1iZXIoaSAqIDIgKyAxKTsKKyAgICAgIHBDb21wRGF0YVtpXS5tX0RlY29kZVN0ZXAgPSAobWF4IC0gcENvbXBEYXRhW2ldLm1fRGVjb2RlTWluKSAvIG1heF9kYXRhOworICAgICAgRlhfRkxPQVQgZGVmX3ZhbHVlLCBkZWZfbWluLCBkZWZfbWF4OworICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0RGVmYXVsdFZhbHVlKGksIGRlZl92YWx1ZSwgZGVmX21pbiwgZGVmX21heCk7CisgICAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfSU5ERVhFRCkgeworICAgICAgICBkZWZfbWF4ID0gKEZYX0ZMT0FUKW1heF9kYXRhOworICAgICAgfQorICAgICAgaWYgKGRlZl9taW4gIT0gcENvbXBEYXRhW2ldLm1fRGVjb2RlTWluIHx8IGRlZl9tYXggIT0gbWF4KSB7CisgICAgICAgIGJEZWZhdWx0RGVjb2RlID0gRkFMU0U7CisgICAgICB9CiAgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpKyspIHsKKyAgICAgIEZYX0ZMT0FUIGRlZl92YWx1ZTsKKyAgICAgIG1fcENvbG9yU3BhY2UtPkdldERlZmF1bHRWYWx1ZShpLCBkZWZfdmFsdWUsIHBDb21wRGF0YVtpXS5tX0RlY29kZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tcERhdGFbaV0ubV9EZWNvZGVTdGVwKTsKKyAgICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19JTkRFWEVEKSB7CisgICAgICAgIHBDb21wRGF0YVtpXS5tX0RlY29kZVN0ZXAgPSAoRlhfRkxPQVQpbWF4X2RhdGE7CisgICAgICB9CisgICAgICBwQ29tcERhdGFbaV0ubV9EZWNvZGVTdGVwID0KKyAgICAgICAgICAocENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCAtIHBDb21wRGF0YVtpXS5tX0RlY29kZU1pbikgLyBtYXhfZGF0YTsKKyAgICB9CisgIH0KKyAgaWYgKCFtX3BEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiU01hc2siKSkpIHsKICAgICBDUERGX09iamVjdCogcE1hc2sgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIk1hc2siKSk7CiAgICAgaWYgKHBNYXNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICByZXR1cm4gcENvbXBEYXRhOwogICAgIH0KLSAgICBpZiAocE1hc2stPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBMb2FkTWFza0RJQigoQ1BERl9TdHJlYW0qKXBNYXNrKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1pbnQJQ1BERl9ESUJTb3VyY2U6OlN0cmF0TG9hZE1hc2soKQotewotICAgIG1fTWF0dGVDb2xvciA9IDB4ZmZmZmZmZmY7Ci0gICAgbV9wTWFza1N0cmVhbSA9IG1fcERpY3QtPkdldFN0cmVhbShGWF9CU1RSQygiU01hc2siKSk7Ci0gICAgaWYgKG1fcE1hc2tTdHJlYW0pIHsKLSAgICAgICAgQ1BERl9BcnJheSogcE1hdHRlID0gbV9wTWFza1N0cmVhbS0+R2V0RGljdCgpLT5HZXRBcnJheShGWF9CU1RSQygiTWF0dGUiKSk7Ci0gICAgICAgIGlmIChwTWF0dGUgIT0gTlVMTCAmJiBtX3BDb2xvclNwYWNlICYmIChGWF9EV09SRCltX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSA8PSBtX25Db21wb25lbnRzKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCBSLCBHLCBCOwotICAgICAgICAgICAgRlhfRkxPQVQqIHBDb2xvciA9IEZYX0FsbG9jKEZYX0ZMT0FULCBtX25Db21wb25lbnRzKTsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgcENvbG9yW2ldID0gcE1hdHRlLT5HZXRGbG9hdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihwQ29sb3IsIFIsIEcsIEIpOwotICAgICAgICAgICAgRlhfRnJlZShwQ29sb3IpOwotICAgICAgICAgICAgbV9NYXR0ZUNvbG9yID0gRlhBUkdCX01BS0UoMCwgRlhTWVNfcm91bmQoUiAqIDI1NSksIEZYU1lTX3JvdW5kKEcgKiAyNTUpLCBGWFNZU19yb3VuZChCICogMjU1KSk7CisgICAgaWYgKHBNYXNrLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcE1hc2s7CisgICAgICBpZiAocEFycmF5LT5HZXRDb3VudCgpID49IG1fbkNvbXBvbmVudHMgKiAyKSB7CisgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgICBpbnQgbWluX251bSA9IHBBcnJheS0+R2V0SW50ZWdlcihpICogMik7CisgICAgICAgICAgaW50IG1heF9udW0gPSBwQXJyYXktPkdldEludGVnZXIoaSAqIDIgKyAxKTsKKyAgICAgICAgICBwQ29tcERhdGFbaV0ubV9Db2xvcktleU1pbiA9IEZYX01BWChtaW5fbnVtLCAwKTsKKyAgICAgICAgICBwQ29tcERhdGFbaV0ubV9Db2xvcktleU1heCA9IEZYX01JTihtYXhfbnVtLCBtYXhfZGF0YSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFN0YXJ0TG9hZE1hc2tESUIoKTsKKyAgICAgIH0KKyAgICAgIGJDb2xvcktleSA9IFRSVUU7CiAgICAgfQotICAgIG1fcE1hc2tTdHJlYW0gPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIk1hc2siKSk7Ci0gICAgaWYgKG1fcE1hc2tTdHJlYW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKG1fcE1hc2tTdHJlYW0tPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBTdGFydExvYWRNYXNrRElCKCk7Ci0gICAgfQotICAgIHJldHVybiAxOworICB9CisgIHJldHVybiBwQ29tcERhdGE7CiB9Ci1pbnQJQ1BERl9ESUJTb3VyY2U6OkNvbnRpbnVlTG9hZE1hc2tESUIoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKG1fcE1hc2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaW50IHJldCA9IG1fcE1hc2stPkNvbnRpbnVlTG9hZERJQlNvdXJjZShwUGF1c2UpOwotICAgIGlmIChyZXQgPT0gMikgewotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgewotICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKEZBTFNFKTsKLSAgICB9Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgZGVsZXRlIG1fcE1hc2s7Ci0gICAgICAgIG1fcE1hc2sgPSBOVUxMOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KK0lDb2RlY19TY2FubGluZURlY29kZXIqIEZQREZBUElfQ3JlYXRlRmF4RGVjb2RlcigKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0LAorICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcyk7CitJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBGUERGQVBJX0NyZWF0ZUZsYXRlRGVjb2RlcigKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0LAorICAgIGludCBuQ29tcHMsCisgICAgaW50IGJwYywKKyAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpOworaW50IENQREZfRElCU291cmNlOjpDcmVhdGVEZWNvZGVyKCkgeworICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgZGVjb2RlciA9IG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VEZWNvZGVyKCk7CisgIGlmIChkZWNvZGVyLklzRW1wdHkoKSkgewogICAgIHJldHVybiAxOworICB9CisgIGlmIChtX2JEb0JwY0NoZWNrICYmIG1fYnBjID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjb25zdCB1aW50OF90KiBzcmNfZGF0YSA9IG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpOworICBGWF9EV09SRCBzcmNfc2l6ZSA9IG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMgPSBtX3BTdHJlYW1BY2MtPkdldEltYWdlUGFyYW0oKTsKKyAgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkNDSVRURmF4RGVjb2RlIikpIHsKKyAgICBtX3BEZWNvZGVyID0gRlBERkFQSV9DcmVhdGVGYXhEZWNvZGVyKHNyY19kYXRhLCBzcmNfc2l6ZSwgbV9XaWR0aCwgbV9IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKyAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJEQ1REZWNvZGUiKSkgeworICAgIG1fcERlY29kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcigKKyAgICAgICAgc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwgbV9uQ29tcG9uZW50cywKKyAgICAgICAgcFBhcmFtcyA/IHBQYXJhbXMtPkdldEludGVnZXIoIkNvbG9yVHJhbnNmb3JtIiwgMSkgOiAxKTsKKyAgICBpZiAoIW1fcERlY29kZXIpIHsKKyAgICAgIEZYX0JPT0wgYlRyYW5zZm9ybSA9IEZBTFNFOworICAgICAgaW50IGNvbXBzLCBicGM7CisgICAgICBJQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKTsKKyAgICAgIGlmIChwSnBlZ01vZHVsZS0+TG9hZEluZm8oc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwgY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwYywgYlRyYW5zZm9ybSkpIHsKKyAgICAgICAgaWYgKG1fbkNvbXBvbmVudHMgIT0gY29tcHMpIHsKKyAgICAgICAgICBGWF9GcmVlKG1fcENvbXBEYXRhKTsKKyAgICAgICAgICBtX25Db21wb25lbnRzID0gY29tcHM7CisgICAgICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0xBQiAmJiBtX25Db21wb25lbnRzICE9IDMpIHsKKyAgICAgICAgICAgIG1fcENvbXBEYXRhID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgICBtX3BDb21wRGF0YSA9IEdldERlY29kZUFuZE1hc2tBcnJheShtX2JEZWZhdWx0RGVjb2RlLCBtX2JDb2xvcktleSk7CisgICAgICAgICAgaWYgKG1fcENvbXBEYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtX2JwYyA9IGJwYzsKKyAgICAgICAgbV9wRGVjb2RlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKAorICAgICAgICAgICAgc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwgbV9uQ29tcG9uZW50cywgYlRyYW5zZm9ybSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkZsYXRlRGVjb2RlIikpIHsKKyAgICBtX3BEZWNvZGVyID0gRlBERkFQSV9DcmVhdGVGbGF0ZURlY29kZXIoCisgICAgICAgIHNyY19kYXRhLCBzcmNfc2l6ZSwgbV9XaWR0aCwgbV9IZWlnaHQsIG1fbkNvbXBvbmVudHMsIG1fYnBjLCBwUGFyYW1zKTsKKyAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJKUFhEZWNvZGUiKSkgeworICAgIExvYWRKcHhCaXRtYXAoKTsKKyAgICByZXR1cm4gbV9wQ2FjaGVkQml0bWFwID8gMSA6IDA7CisgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiSkJJRzJEZWNvZGUiKSkgeworICAgIG1fcENhY2hlZEJpdG1hcC5yZXNldChuZXcgQ0ZYX0RJQml0bWFwKTsKKyAgICBpZiAoIW1fcENhY2hlZEJpdG1hcC0+Q3JlYXRlKAorICAgICAgICAgICAgbV9XaWR0aCwgbV9IZWlnaHQsIG1fYkltYWdlTWFzayA/IEZYRElCXzFicHBNYXNrIDogRlhESUJfMWJwcFJnYikpIHsKKyAgICAgIG1fcENhY2hlZEJpdG1hcC5yZXNldCgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG1fU3RhdHVzID0gMTsKKyAgICByZXR1cm4gMjsKKyAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJSdW5MZW5ndGhEZWNvZGUiKSkgeworICAgIG1fcERlY29kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCkKKyAgICAgICAgICAgICAgICAgICAgIC0+R2V0Q29kZWNNb2R1bGUoKQorICAgICAgICAgICAgICAgICAgICAgLT5HZXRCYXNpY01vZHVsZSgpCisgICAgICAgICAgICAgICAgICAgICAtPkNyZWF0ZVJ1bkxlbmd0aERlY29kZXIoc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fSGVpZ2h0LCBtX25Db21wb25lbnRzLCBtX2JwYyk7CisgIH0KKyAgaWYgKCFtX3BEZWNvZGVyKQorICAgIHJldHVybiAwOworCisgIEZYX1NBRkVfRFdPUkQgcmVxdWVzdGVkX3BpdGNoID0KKyAgICAgIENhbGN1bGF0ZVBpdGNoOChtX2JwYywgbV9uQ29tcG9uZW50cywgbV9XaWR0aCwgMSk7CisgIGlmICghcmVxdWVzdGVkX3BpdGNoLklzVmFsaWQoKSkgeworICAgIHJldHVybiAwOworICB9CisgIEZYX1NBRkVfRFdPUkQgcHJvdmlkZWRfcGl0Y2ggPQorICAgICAgQ2FsY3VsYXRlUGl0Y2g4KG1fcERlY29kZXItPkdldEJQQygpLCBtX3BEZWNvZGVyLT5Db3VudENvbXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2Rlci0+R2V0V2lkdGgoKSwgMSk7CisgIGlmICghcHJvdmlkZWRfcGl0Y2guSXNWYWxpZCgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHByb3ZpZGVkX3BpdGNoLlZhbHVlT3JEaWUoKSA8IHJlcXVlc3RlZF9waXRjaC5WYWx1ZU9yRGllKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKIH0KLUNQREZfRElCU291cmNlKglDUERGX0RJQlNvdXJjZTo6RGV0YWNoTWFzaygpCi17Ci0gICAgQ1BERl9ESUJTb3VyY2UqIHBESUJTb3VyY2UgPSBtX3BNYXNrOwordm9pZCBDUERGX0RJQlNvdXJjZTo6TG9hZEpweEJpdG1hcCgpIHsKKyAgSUNvZGVjX0pweE1vZHVsZSogcEpweE1vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnB4TW9kdWxlKCk7CisgIGlmICghcEpweE1vZHVsZSkKKyAgICByZXR1cm47CisKKyAgbm9uc3RkOjp1bmlxdWVfcHRyPEpweEJpdE1hcENvbnRleHQ+IGNvbnRleHQoCisgICAgICBuZXcgSnB4Qml0TWFwQ29udGV4dChwSnB4TW9kdWxlKSk7CisgIGNvbnRleHQtPnNldF9jb250ZXh0KHBKcHhNb2R1bGUtPkNyZWF0ZURlY29kZXIobV9wU3RyZWFtQWNjLT5HZXREYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RyZWFtQWNjLT5HZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29sb3JTcGFjZSAhPSBudWxscHRyKSk7CisgIGlmICghY29udGV4dC0+Y29udGV4dCgpKQorICAgIHJldHVybjsKKworICBGWF9EV09SRCB3aWR0aCA9IDA7CisgIEZYX0RXT1JEIGhlaWdodCA9IDA7CisgIEZYX0RXT1JEIGNvZGVzdHJlYW1fbkNvbXBzID0gMDsKKyAgRlhfRFdPUkQgaW1hZ2VfbkNvbXBzID0gMDsKKyAgcEpweE1vZHVsZS0+R2V0SW1hZ2VJbmZvKGNvbnRleHQtPmNvbnRleHQoKSwgd2lkdGgsIGhlaWdodCwgY29kZXN0cmVhbV9uQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9uQ29tcHMpOworICBpZiAoKGludCl3aWR0aCA8IG1fV2lkdGggfHwgKGludCloZWlnaHQgPCBtX0hlaWdodCkKKyAgICByZXR1cm47CisKKyAgaW50IG91dHB1dF9uQ29tcHM7CisgIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yOworICBGWF9CT09MIGJTd2FwUkdCID0gRkFMU0U7CisgIGlmIChtX3BDb2xvclNwYWNlKSB7CisgICAgaWYgKGNvZGVzdHJlYW1fbkNvbXBzICE9IChGWF9EV09SRCltX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSkKKyAgICAgIHJldHVybjsKKyAgICBvdXRwdXRfbkNvbXBzID0gY29kZXN0cmVhbV9uQ29tcHM7CisgICAgYlRyYW5zbGF0ZUNvbG9yID0gRkFMU0U7CisgICAgaWYgKG1fcENvbG9yU3BhY2UgPT0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQikpIHsKKyAgICAgIGJTd2FwUkdCID0gVFJVRTsKKyAgICAgIG1fcENvbG9yU3BhY2UgPSBudWxscHRyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBiVHJhbnNsYXRlQ29sb3IgPSBUUlVFOworICAgIGlmIChpbWFnZV9uQ29tcHMpIHsKKyAgICAgIG91dHB1dF9uQ29tcHMgPSBpbWFnZV9uQ29tcHM7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHB1dF9uQ29tcHMgPSBjb2Rlc3RyZWFtX25Db21wczsKKyAgICB9CisgICAgaWYgKG91dHB1dF9uQ29tcHMgPT0gMykgeworICAgICAgYlN3YXBSR0IgPSBUUlVFOworICAgIH0gZWxzZSBpZiAob3V0cHV0X25Db21wcyA9PSA0KSB7CisgICAgICBtX3BDb2xvclNwYWNlID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUNNWUspOworICAgICAgYlRyYW5zbGF0ZUNvbG9yID0gRkFMU0U7CisgICAgfQorICAgIG1fbkNvbXBvbmVudHMgPSBvdXRwdXRfbkNvbXBzOworICB9CisgIEZYRElCX0Zvcm1hdCBmb3JtYXQ7CisgIGlmIChvdXRwdXRfbkNvbXBzID09IDEpIHsKKyAgICBmb3JtYXQgPSBGWERJQl84YnBwUmdiOworICB9IGVsc2UgaWYgKG91dHB1dF9uQ29tcHMgPD0gMykgeworICAgIGZvcm1hdCA9IEZYRElCX1JnYjsKKyAgfSBlbHNlIGlmIChvdXRwdXRfbkNvbXBzID09IDQpIHsKKyAgICBmb3JtYXQgPSBGWERJQl9SZ2IzMjsKKyAgfSBlbHNlIHsKKyAgICB3aWR0aCA9ICh3aWR0aCAqIG91dHB1dF9uQ29tcHMgKyAyKSAvIDM7CisgICAgZm9ybWF0ID0gRlhESUJfUmdiOworICB9CisgIG1fcENhY2hlZEJpdG1hcC5yZXNldChuZXcgQ0ZYX0RJQml0bWFwKTsKKyAgaWYgKCFtX3BDYWNoZWRCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKSB7CisgICAgbV9wQ2FjaGVkQml0bWFwLnJlc2V0KCk7CisgICAgcmV0dXJuOworICB9CisgIG1fcENhY2hlZEJpdG1hcC0+Q2xlYXIoMHhGRkZGRkZGRik7CisgIGNvbnRleHQtPnNldF9vdXRwdXRfb2Zmc2V0cyhGWF9BbGxvYyh1aW50OF90LCBvdXRwdXRfbkNvbXBzKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0X25Db21wczsgKytpKQorICAgIGNvbnRleHQtPm91dHB1dF9vZmZzZXRzKClbaV0gPSBpOworICBpZiAoYlN3YXBSR0IpIHsKKyAgICBjb250ZXh0LT5vdXRwdXRfb2Zmc2V0cygpWzBdID0gMjsKKyAgICBjb250ZXh0LT5vdXRwdXRfb2Zmc2V0cygpWzJdID0gMDsKKyAgfQorICBpZiAoIXBKcHhNb2R1bGUtPkRlY29kZShjb250ZXh0LT5jb250ZXh0KCksIG1fcENhY2hlZEJpdG1hcC0+R2V0QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENhY2hlZEJpdG1hcC0+R2V0UGl0Y2goKSwgYlRyYW5zbGF0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5vdXRwdXRfb2Zmc2V0cygpKSkgeworICAgIG1fcENhY2hlZEJpdG1hcC5yZXNldCgpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX3BDb2xvclNwYWNlLT5HZXRGYW1pbHkoKSA9PSBQREZDU19JTkRFWEVEICYmCisgICAgICBtX2JwYyA8IDgpIHsKKyAgICBpbnQgc2NhbGUgPSA4IC0gbV9icGM7CisgICAgZm9yIChGWF9EV09SRCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7ICsrcm93KSB7CisgICAgICB1aW50OF90KiBzY2FubGluZSA9ICh1aW50OF90KiltX3BDYWNoZWRCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICBmb3IgKEZYX0RXT1JEIGNvbCA9IDA7IGNvbCA8IHdpZHRoOyArK2NvbCkgeworICAgICAgICAqc2NhbmxpbmUgPSAoKnNjYW5saW5lKSA+PiBzY2FsZTsKKyAgICAgICAgKytzY2FubGluZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgbV9icGMgPSA4OworfQorQ1BERl9ESUJTb3VyY2UqIENQREZfRElCU291cmNlOjpMb2FkTWFzayhGWF9EV09SRCYgTWF0dGVDb2xvcikgeworICBNYXR0ZUNvbG9yID0gMHhmZmZmZmZmZjsKKyAgQ1BERl9TdHJlYW0qIHBTb2Z0TWFzayA9IG1fcERpY3QtPkdldFN0cmVhbShGWF9CU1RSQygiU01hc2siKSk7CisgIGlmIChwU29mdE1hc2spIHsKKyAgICBDUERGX0FycmF5KiBwTWF0dGUgPSBwU29mdE1hc2stPkdldERpY3QoKS0+R2V0QXJyYXkoRlhfQlNUUkMoIk1hdHRlIikpOworICAgIGlmIChwTWF0dGUgIT0gTlVMTCAmJiBtX3BDb2xvclNwYWNlICYmCisgICAgICAgIChGWF9EV09SRCltX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSA8PSBtX25Db21wb25lbnRzKSB7CisgICAgICBGWF9GTE9BVCogcENvbG9yID0gRlhfQWxsb2MoRlhfRkxPQVQsIG1fbkNvbXBvbmVudHMpOworICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkrKykgeworICAgICAgICBwQ29sb3JbaV0gPSBwTWF0dGUtPkdldEZsb2F0KGkpOworICAgICAgfQorICAgICAgRlhfRkxPQVQgUiwgRywgQjsKKyAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihwQ29sb3IsIFIsIEcsIEIpOworICAgICAgRlhfRnJlZShwQ29sb3IpOworICAgICAgTWF0dGVDb2xvciA9IEZYQVJHQl9NQUtFKDAsIEZYU1lTX3JvdW5kKFIgKiAyNTUpLCBGWFNZU19yb3VuZChHICogMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChCICogMjU1KSk7CisgICAgfQorICAgIHJldHVybiBMb2FkTWFza0RJQihwU29mdE1hc2spOworICB9CisgIENQREZfT2JqZWN0KiBwTWFzayA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiTWFzayIpKTsKKyAgaWYgKHBNYXNrID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAocE1hc2stPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CisgICAgcmV0dXJuIExvYWRNYXNrRElCKChDUERGX1N0cmVhbSopcE1hc2spOworICB9CisgIHJldHVybiBOVUxMOworfQoraW50IENQREZfRElCU291cmNlOjpTdHJhdExvYWRNYXNrKCkgeworICBtX01hdHRlQ29sb3IgPSAweGZmZmZmZmZmOworICBtX3BNYXNrU3RyZWFtID0gbV9wRGljdC0+R2V0U3RyZWFtKEZYX0JTVFJDKCJTTWFzayIpKTsKKyAgaWYgKG1fcE1hc2tTdHJlYW0pIHsKKyAgICBDUERGX0FycmF5KiBwTWF0dGUgPSBtX3BNYXNrU3RyZWFtLT5HZXREaWN0KCktPkdldEFycmF5KEZYX0JTVFJDKCJNYXR0ZSIpKTsKKyAgICBpZiAocE1hdHRlICE9IE5VTEwgJiYgbV9wQ29sb3JTcGFjZSAmJgorICAgICAgICAoRlhfRFdPUkQpbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkgPD0gbV9uQ29tcG9uZW50cykgeworICAgICAgRlhfRkxPQVQgUiwgRywgQjsKKyAgICAgIEZYX0ZMT0FUKiBwQ29sb3IgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbV9uQ29tcG9uZW50cyk7CisgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSsrKSB7CisgICAgICAgIHBDb2xvcltpXSA9IHBNYXR0ZS0+R2V0RmxvYXQoaSk7CisgICAgICB9CisgICAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IocENvbG9yLCBSLCBHLCBCKTsKKyAgICAgIEZYX0ZyZWUocENvbG9yKTsKKyAgICAgIG1fTWF0dGVDb2xvciA9IEZYQVJHQl9NQUtFKDAsIEZYU1lTX3JvdW5kKFIgKiAyNTUpLCBGWFNZU19yb3VuZChHICogMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKEIgKiAyNTUpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXJ0TG9hZE1hc2tESUIoKTsKKyAgfQorICBtX3BNYXNrU3RyZWFtID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJNYXNrIikpOworICBpZiAobV9wTWFza1N0cmVhbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKG1fcE1hc2tTdHJlYW0tPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CisgICAgcmV0dXJuIFN0YXJ0TG9hZE1hc2tESUIoKTsKKyAgfQorICByZXR1cm4gMTsKK30KK2ludCBDUERGX0RJQlNvdXJjZTo6Q29udGludWVMb2FkTWFza0RJQihJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAobV9wTWFzayA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaW50IHJldCA9IG1fcE1hc2stPkNvbnRpbnVlTG9hZERJQlNvdXJjZShwUGF1c2UpOworICBpZiAocmV0ID09IDIpIHsKKyAgICByZXR1cm4gcmV0OworICB9CisgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7CisgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihGQUxTRSk7CisgIH0KKyAgaWYgKCFyZXQpIHsKKyAgICBkZWxldGUgbV9wTWFzazsKICAgICBtX3BNYXNrID0gTlVMTDsKLSAgICByZXR1cm4gcERJQlNvdXJjZTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiAxOwogfQotQ1BERl9ESUJTb3VyY2UqIENQREZfRElCU291cmNlOjpMb2FkTWFza0RJQihDUERGX1N0cmVhbSogcE1hc2spCi17Ci0gICAgQ1BERl9ESUJTb3VyY2UqIHBNYXNrU291cmNlID0gbmV3IENQREZfRElCU291cmNlOwotICAgIGlmICghcE1hc2tTb3VyY2UtPkxvYWQobV9wRG9jdW1lbnQsIHBNYXNrLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFKSkgewotICAgICAgICBkZWxldGUgcE1hc2tTb3VyY2U7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gcE1hc2tTb3VyY2U7CitDUERGX0RJQlNvdXJjZSogQ1BERl9ESUJTb3VyY2U6OkRldGFjaE1hc2soKSB7CisgIENQREZfRElCU291cmNlKiBwRElCU291cmNlID0gbV9wTWFzazsKKyAgbV9wTWFzayA9IE5VTEw7CisgIHJldHVybiBwRElCU291cmNlOwogfQotaW50IENQREZfRElCU291cmNlOjpTdGFydExvYWRNYXNrRElCKCkKLXsKLSAgICBtX3BNYXNrID0gbmV3IENQREZfRElCU291cmNlOwotICAgIGludCByZXQgPSBtX3BNYXNrLT5TdGFydExvYWRESUJTb3VyY2UobV9wRG9jdW1lbnQsIChDUERGX1N0cmVhbSopbV9wTWFza1N0cmVhbSwgRkFMU0UsIE5VTEwsIE5VTEwsIFRSVUUpOwotICAgIGlmIChyZXQgPT0gMikgewotICAgICAgICBpZiAobV9TdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgbV9TdGF0dXMgPSAyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBpZiAoIXJldCkgewotICAgICAgICBkZWxldGUgbV9wTWFzazsKLSAgICAgICAgbV9wTWFzayA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLXZvaWQgQ1BERl9ESUJTb3VyY2U6OkxvYWRQYWxldHRlKCkKLXsKLSAgICBpZiAobV9icGMgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPiA4KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPT0gMSkgewotICAgICAgICBpZiAobV9iRGVmYXVsdERlY29kZSAmJiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSB8fCBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpID4gMykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIGNvbG9yX3ZhbHVlc1szXTsKLSAgICAgICAgY29sb3JfdmFsdWVzWzBdID0gbV9wQ29tcERhdGFbMF0ubV9EZWNvZGVNaW47Ci0gICAgICAgIGNvbG9yX3ZhbHVlc1sxXSA9IGNvbG9yX3ZhbHVlc1syXSA9IGNvbG9yX3ZhbHVlc1swXTsKLSAgICAgICAgRlhfRkxPQVQgUj0wLjBmLCBHPTAuMGYsIEI9MC4wZjsKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlcywgUiwgRywgQik7Ci0gICAgICAgIEZYX0FSR0IgYXJnYjAgPSBBcmdiRW5jb2RlKDI1NSwgRlhTWVNfcm91bmQoUiAqIDI1NSksIEZYU1lTX3JvdW5kKEcgKiAyNTUpLCBGWFNZU19yb3VuZChCICogMjU1KSk7Ci0gICAgICAgIGNvbG9yX3ZhbHVlc1swXSArPSBtX3BDb21wRGF0YVswXS5tX0RlY29kZVN0ZXA7Ci0gICAgICAgIGNvbG9yX3ZhbHVlc1sxXSArPSBtX3BDb21wRGF0YVswXS5tX0RlY29kZVN0ZXA7Ci0gICAgICAgIGNvbG9yX3ZhbHVlc1syXSArPSBtX3BDb21wRGF0YVswXS5tX0RlY29kZVN0ZXA7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihjb2xvcl92YWx1ZXMsIFIsIEcsIEIpOwotICAgICAgICBGWF9BUkdCIGFyZ2IxID0gQXJnYkVuY29kZSgyNTUsIEZYU1lTX3JvdW5kKFIgKiAyNTUpLCBGWFNZU19yb3VuZChHICogMjU1KSwgRlhTWVNfcm91bmQoQiAqIDI1NSkpOwotICAgICAgICBpZiAoYXJnYjAgIT0gMHhGRjAwMDAwMCB8fCBhcmdiMSAhPSAweEZGRkZGRkZGKSB7Ci0gICAgICAgICAgICBTZXRQYWxldHRlQXJnYigwLCBhcmdiMCk7Ci0gICAgICAgICAgICBTZXRQYWxldHRlQXJnYigxLCBhcmdiMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9wQ29sb3JTcGFjZSA9PSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSkgJiYgbV9icGMgPT0gOCAmJiBtX2JEZWZhdWx0RGVjb2RlKSB7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IHBhbGV0dGVfY291bnQgPSAxIDw8IChtX2JwYyAqIG1fbkNvbXBvbmVudHMpOwotICAgICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gY29sb3JfdmFsdWVzKG1fbkNvbXBvbmVudHMpOwotICAgICAgICBGWF9GTE9BVCogY29sb3JfdmFsdWUgPSBjb2xvcl92YWx1ZXM7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsZXR0ZV9jb3VudDsgaSArKykgewotICAgICAgICAgICAgaW50IGNvbG9yX2RhdGEgPSBpOwotICAgICAgICAgICAgZm9yIChGWF9EV09SRCBqID0gMDsgaiA8IG1fbkNvbXBvbmVudHM7IGogKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgZW5jb2RlZF9jb21wb25lbnQgPSBjb2xvcl9kYXRhICUgKDEgPDwgbV9icGMpOwotICAgICAgICAgICAgICAgIGNvbG9yX2RhdGEgLz0gMSA8PCBtX2JwYzsKLSAgICAgICAgICAgICAgICBjb2xvcl92YWx1ZVtqXSA9IG1fcENvbXBEYXRhW2pdLm1fRGVjb2RlTWluICsgbV9wQ29tcERhdGFbal0ubV9EZWNvZGVTdGVwICogZW5jb2RlZF9jb21wb25lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCBSID0gMCwgRyA9IDAsIEIgPSAwOwotICAgICAgICAgICAgaWYgKG1fbkNvbXBvbmVudHMgPT0gMSAmJiBtX0ZhbWlseSA9PSBQREZDU19JQ0NCQVNFRCAmJiBtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBpbnQgbkNvbXBvbmVudHMgPSBtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKTsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCogdGVtcF9idWYgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbkNvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvbXBvbmVudHM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wX2J1ZltpXSA9ICpjb2xvcl92YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKHRlbXBfYnVmLCBSLCBHLCBCKTsKLSAgICAgICAgICAgICAgICBGWF9GcmVlKHRlbXBfYnVmKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlLCBSLCBHLCBCKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNldFBhbGV0dGVBcmdiKGksIEFyZ2JFbmNvZGUoMjU1LCBGWFNZU19yb3VuZChSICogMjU1KSwgRlhTWVNfcm91bmQoRyAqIDI1NSksIEZYU1lTX3JvdW5kKEIgKiAyNTUpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENQREZfRElCU291cmNlOjpWYWxpZGF0ZURpY3RQYXJhbSgpCi17Ci0gICAgbV9icGMgPSBtX2JwY19vcmlnOwotICAgIENQREZfT2JqZWN0ICogcEZpbHRlciA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRmlsdGVyIikpOwotICAgIGlmIChwRmlsdGVyKSB7Ci0gICAgICAgIGlmIChwRmlsdGVyLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpbHRlciA9IHBGaWx0ZXItPkdldFN0cmluZygpOwotICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBGWF9CU1RSQygiQ0NJVFRGYXhEZWNvZGUiKSB8fCBmaWx0ZXIgPT0gRlhfQlNUUkMoIkpCSUcyRGVjb2RlIikpIHsKLSAgICAgICAgICAgICAgICBtX2JwYyA9IDE7Ci0gICAgICAgICAgICAgICAgbV9uQ29tcG9uZW50cyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmlsdGVyID09IEZYX0JTVFJDKCJSdW5MZW5ndGhEZWNvZGUiKSB8fCBmaWx0ZXIgPT0gRlhfQlNUUkMoIkRDVERlY29kZSIpKSB7Ci0gICAgICAgICAgICAgICAgbV9icGMgPSA4OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBGaWx0ZXItPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIENQREZfQXJyYXkgKnBBcnJheSA9IChDUERGX0FycmF5ICopcEZpbHRlcjsKLSAgICAgICAgICAgIGlmIChwQXJyYXktPkdldFN0cmluZyhwQXJyYXktPkdldENvdW50KCkgLSAxKSA9PSBGWF9CU1RSQygiQ0NJVFRGYXhEZWNvZGUiKSB8fAotICAgICAgICAgICAgICAgICAgICBwQXJyYXktPkdldFN0cmluZyhwQXJyYXktPkdldENvdW50KCkgLSAxKSA9PSBGWF9CU1RSQygiSkJJRzJEZWNvZGUiKSkgewotICAgICAgICAgICAgICAgIG1fYnBjID0gMTsKLSAgICAgICAgICAgICAgICBtX25Db21wb25lbnRzID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwQXJyYXktPkdldFN0cmluZyhwQXJyYXktPkdldENvdW50KCkgLSAxKSA9PSBGWF9CU1RSQygiRENURGVjb2RlIikpIHsKLSAgICAgICAgICAgICAgICAvLyBQcmV2aW91c2x5LCBwQXJyYXktPkdldFN0cmluZyhwQXJyYXktPkdldENvdW50KCkgLSAxKSA9PSBGWF9CU1RSQygiUnVuTGVuZ3RoRGVjb2RlIikgd2FzIGNoZWNrZWQgaW4gdGhlICJpZiIgc3RhdGVtZW50IGFzIHdlbGwsCi0gICAgICAgICAgICAgICAgLy8gYnV0IHRvbyBtYW55IGRvY3VtZW50cyBkb24ndCBjb25mb3JtIHRvIGl0LgotICAgICAgICAgICAgICAgIG1fYnBjID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9icGMgIT0gMSAmJiBtX2JwYyAhPSAyICYmIG1fYnBjICE9IDQgJiYgbV9icGMgIT0gOCAmJiBtX2JwYyAhPSAxNikgewotICAgICAgICBtX2JwYyA9IDA7Ci0gICAgfQotfQotI2RlZmluZSBOT1JNQUxDT0xPUl9NQVgoY29sb3IsIG1heCkgKGNvbG9yKSA+IChtYXgpID8gKG1heCkgOiAoY29sb3IpIDwgMCA/IDAgOiAoY29sb3IpOwotdm9pZCBDUERGX0RJQlNvdXJjZTo6VHJhbnNsYXRlU2NhbmxpbmUyNGJwcCh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuKSBjb25zdAotewotICAgIGlmIChtX2JwYyA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IG1heF9kYXRhID0gKDEgPDwgbV9icGMpIC0gMTsKLSAgICBpZiAobV9iRGVmYXVsdERlY29kZSkgewotICAgICAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCIHx8IG1fRmFtaWx5ID09IFBERkNTX0NBTFJHQikgewotICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BvcyA9IHNyY19zY2FuOwotICAgICAgICAgICAgc3dpdGNoIChtX2JwYykgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3Bvc1s0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19wb3NbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3BvczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19wb3MgKz0gNjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IG1fV2lkdGg7IGNvbHVtbiArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3Bvc1syXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19wb3NbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3BvczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19wb3MgKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2JpdF9wb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9ieXRlX3BvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IG1fV2lkdGg7IGNvbHVtbiArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IFIgPSBfR2V0Qml0czgoc3JjX3NjYW4sIHNyY19iaXRfcG9zLCBtX2JwYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYml0X3BvcyArPSBtX2JwYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBHID0gX0dldEJpdHM4KHNyY19zY2FuLCBzcmNfYml0X3BvcywgbV9icGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgQiA9IF9HZXRCaXRzOChzcmNfc2Nhbiwgc3JjX2JpdF9wb3MsIG1fYnBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19iaXRfcG9zICs9IG1fYnBjOwotICAgICAgICAgICAgICAgICAgICAgICAgUiA9IE5PUk1BTENPTE9SX01BWChSLCBtYXhfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHID0gTk9STUFMQ09MT1JfTUFYKEcsIG1heF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEIgPSBOT1JNQUxDT0xPUl9NQVgoQiwgbWF4X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfYnl0ZV9wb3NdID0gQiAqIDI1NSAvIG1heF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfYnl0ZV9wb3MgKyAxXSA9IEcgKiAyNTUgLyBtYXhfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zICsgMl0gPSBSICogMjU1IC8gbWF4X2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J5dGVfcG9zICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fYnBjID09IDgpIHsKLSAgICAgICAgICAgIGlmIChtX25Db21wb25lbnRzID09IG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpKQotICAgICAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPlRyYW5zbGF0ZUltYWdlTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX1dpZHRoLCBtX1dpZHRoLCBtX0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTG9hZE1hc2sgJiYgbV9Hcm91cEZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLICYmIG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBjb2xvcl92YWx1ZXMxKG1fbkNvbXBvbmVudHMpOwotICAgIEZYX0ZMT0FUKiBjb2xvcl92YWx1ZXMgPSBjb2xvcl92YWx1ZXMxOwotICAgIEZYX0ZMT0FUIFIgPSAwLjBmLCBHID0gMC4wZiwgQiA9IDAuMGY7Ci0gICAgaWYgKG1fYnBjID09IDgpIHsKLSAgICAgICAgaW50IHNyY19ieXRlX3BvcyA9IDA7Ci0gICAgICAgIGludCBkZXN0X2J5dGVfcG9zID0gMDsKLSAgICAgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgbV9XaWR0aDsgY29sdW1uICsrKSB7Ci0gICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGNvbG9yID0gMDsgY29sb3IgPCBtX25Db21wb25lbnRzOyBjb2xvciArKykgewotICAgICAgICAgICAgICAgIGludCBkYXRhID0gc3JjX3NjYW5bc3JjX2J5dGVfcG9zICsrXTsKLSAgICAgICAgICAgICAgICBjb2xvcl92YWx1ZXNbY29sb3JdID0gbV9wQ29tcERhdGFbY29sb3JdLm1fRGVjb2RlTWluICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29tcERhdGFbY29sb3JdLm1fRGVjb2RlU3RlcCAqIGRhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9iTG9hZE1hc2sgJiYgbV9Hcm91cEZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLICYmIG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBrID0gMS4wZiAtIGNvbG9yX3ZhbHVlc1szXTsKLSAgICAgICAgICAgICAgICBSID0gKDEuMGYgLSBjb2xvcl92YWx1ZXNbMF0pICogazsKLSAgICAgICAgICAgICAgICBHID0gKDEuMGYgLSBjb2xvcl92YWx1ZXNbMV0pICogazsKLSAgICAgICAgICAgICAgICBCID0gKDEuMGYgLSBjb2xvcl92YWx1ZXNbMl0pICogazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlcywgUiwgRywgQik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSID0gTk9STUFMQ09MT1JfTUFYKFIsIDEpOwotICAgICAgICAgICAgRyA9IE5PUk1BTENPTE9SX01BWChHLCAxKTsKLSAgICAgICAgICAgIEIgPSBOT1JNQUxDT0xPUl9NQVgoQiwgMSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9ieXRlX3Bvc10gPSAoaW50MzJfdCkoQiAqIDI1NSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9ieXRlX3BvcyArIDFdID0gKGludDMyX3QpKEcgKiAyNTUpOwotICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfYnl0ZV9wb3MgKyAyXSA9IChpbnQzMl90KShSICogMjU1KTsKLSAgICAgICAgICAgIGRlc3RfYnl0ZV9wb3MgKz0gMzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBzcmNfYml0X3BvcyA9IDA7Ci0gICAgICAgIGludCBkZXN0X2J5dGVfcG9zID0gMDsKLSAgICAgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgbV9XaWR0aDsgY29sdW1uICsrKSB7Ci0gICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGNvbG9yID0gMDsgY29sb3IgPCBtX25Db21wb25lbnRzOyBjb2xvciArKykgewotICAgICAgICAgICAgICAgIGludCBkYXRhID0gX0dldEJpdHM4KHNyY19zY2FuLCBzcmNfYml0X3BvcywgbV9icGMpOwotICAgICAgICAgICAgICAgIGNvbG9yX3ZhbHVlc1tjb2xvcl0gPSBtX3BDb21wRGF0YVtjb2xvcl0ubV9EZWNvZGVNaW4gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YVtjb2xvcl0ubV9EZWNvZGVTdGVwICogZGF0YTsKLSAgICAgICAgICAgICAgICBzcmNfYml0X3BvcyArPSBtX2JwYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX2JMb2FkTWFzayAmJiBtX0dyb3VwRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUsgJiYgbV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSykgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGsgPSAxLjBmIC0gY29sb3JfdmFsdWVzWzNdOwotICAgICAgICAgICAgICAgIFIgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1swXSkgKiBrOwotICAgICAgICAgICAgICAgIEcgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1sxXSkgKiBrOwotICAgICAgICAgICAgICAgIEIgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1syXSkgKiBrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IoY29sb3JfdmFsdWVzLCBSLCBHLCBCKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFIgPSBOT1JNQUxDT0xPUl9NQVgoUiwgMSk7Ci0gICAgICAgICAgICBHID0gTk9STUFMQ09MT1JfTUFYKEcsIDEpOwotICAgICAgICAgICAgQiA9IE5PUk1BTENPTE9SX01BWChCLCAxKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zXSA9IChpbnQzMl90KShCICogMjU1KTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zICsgMV0gPSAoaW50MzJfdCkoRyAqIDI1NSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9ieXRlX3BvcyArIDJdID0gKGludDMyX3QpKFIgKiAyNTUpOwotICAgICAgICAgICAgZGVzdF9ieXRlX3BvcyArPSAzOwotICAgICAgICB9Ci0gICAgfQotfQotdWludDhfdCogQ1BERl9ESUJTb3VyY2U6OkdldEJ1ZmZlcigpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcENhY2hlZEJpdG1hcCkgewotICAgICAgICByZXR1cm4gbV9wQ2FjaGVkQml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICB9CitDUERGX0RJQlNvdXJjZSogQ1BERl9ESUJTb3VyY2U6OkxvYWRNYXNrRElCKENQREZfU3RyZWFtKiBwTWFzaykgeworICBDUERGX0RJQlNvdXJjZSogcE1hc2tTb3VyY2UgPSBuZXcgQ1BERl9ESUJTb3VyY2U7CisgIGlmICghcE1hc2tTb3VyY2UtPkxvYWQobV9wRG9jdW1lbnQsIHBNYXNrLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFKSkgeworICAgIGRlbGV0ZSBwTWFza1NvdXJjZTsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcE1hc2tTb3VyY2U7CiB9Ci1jb25zdCB1aW50OF90KiBDUERGX0RJQlNvdXJjZTo6R2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fYnBjID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitpbnQgQ1BERl9ESUJTb3VyY2U6OlN0YXJ0TG9hZE1hc2tESUIoKSB7CisgIG1fcE1hc2sgPSBuZXcgQ1BERl9ESUJTb3VyY2U7CisgIGludCByZXQgPSBtX3BNYXNrLT5TdGFydExvYWRESUJTb3VyY2UoCisgICAgICBtX3BEb2N1bWVudCwgKENQREZfU3RyZWFtKiltX3BNYXNrU3RyZWFtLCBGQUxTRSwgTlVMTCwgTlVMTCwgVFJVRSk7CisgIGlmIChyZXQgPT0gMikgeworICAgIGlmIChtX1N0YXR1cyA9PSAwKSB7CisgICAgICBtX1N0YXR1cyA9IDI7CiAgICAgfQotICAgIEZYX1NBRkVfRFdPUkQgc3JjX3BpdGNoID0gQ2FsY3VsYXRlUGl0Y2g4KG1fYnBjLCBtX25Db21wb25lbnRzLCBtX1dpZHRoLCAxKTsKLSAgICBpZiAoIXNyY19waXRjaC5Jc1ZhbGlkKCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIEZYX0RXT1JEIHNyY19waXRjaF92YWx1ZSA9IHNyY19waXRjaC5WYWx1ZU9yRGllKCk7Ci0gICAgY29uc3QgdWludDhfdCogcFNyY0xpbmUgPSBOVUxMOwotICAgIGlmIChtX3BDYWNoZWRCaXRtYXApIHsKLSAgICAgICAgaWYgKGxpbmUgPj0gbV9wQ2FjaGVkQml0bWFwLT5HZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgbGluZSA9IG1fcENhY2hlZEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSAxOworICAgIHJldHVybiAyOworICB9CisgIGlmICghcmV0KSB7CisgICAgZGVsZXRlIG1fcE1hc2s7CisgICAgbV9wTWFzayA9IE5VTEw7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDE7Cit9Cit2b2lkIENQREZfRElCU291cmNlOjpMb2FkUGFsZXR0ZSgpIHsKKyAgaWYgKG1fYnBjID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA+IDgpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcENvbG9yU3BhY2UgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9icGMgKiBtX25Db21wb25lbnRzID09IDEpIHsKKyAgICBpZiAobV9iRGVmYXVsdERlY29kZSAmJgorICAgICAgICAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSB8fCBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSA+IDMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgRlhfRkxPQVQgY29sb3JfdmFsdWVzWzNdOworICAgIGNvbG9yX3ZhbHVlc1swXSA9IG1fcENvbXBEYXRhWzBdLm1fRGVjb2RlTWluOworICAgIGNvbG9yX3ZhbHVlc1sxXSA9IGNvbG9yX3ZhbHVlc1syXSA9IGNvbG9yX3ZhbHVlc1swXTsKKyAgICBGWF9GTE9BVCBSID0gMC4wZiwgRyA9IDAuMGYsIEIgPSAwLjBmOworICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihjb2xvcl92YWx1ZXMsIFIsIEcsIEIpOworICAgIEZYX0FSR0IgYXJnYjAgPSBBcmdiRW5jb2RlKDI1NSwgRlhTWVNfcm91bmQoUiAqIDI1NSksIEZYU1lTX3JvdW5kKEcgKiAyNTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKEIgKiAyNTUpKTsKKyAgICBjb2xvcl92YWx1ZXNbMF0gKz0gbV9wQ29tcERhdGFbMF0ubV9EZWNvZGVTdGVwOworICAgIGNvbG9yX3ZhbHVlc1sxXSArPSBtX3BDb21wRGF0YVswXS5tX0RlY29kZVN0ZXA7CisgICAgY29sb3JfdmFsdWVzWzJdICs9IG1fcENvbXBEYXRhWzBdLm1fRGVjb2RlU3RlcDsKKyAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IoY29sb3JfdmFsdWVzLCBSLCBHLCBCKTsKKyAgICBGWF9BUkdCIGFyZ2IxID0gQXJnYkVuY29kZSgyNTUsIEZYU1lTX3JvdW5kKFIgKiAyNTUpLCBGWFNZU19yb3VuZChHICogMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChCICogMjU1KSk7CisgICAgaWYgKGFyZ2IwICE9IDB4RkYwMDAwMDAgfHwgYXJnYjEgIT0gMHhGRkZGRkZGRikgeworICAgICAgU2V0UGFsZXR0ZUFyZ2IoMCwgYXJnYjApOworICAgICAgU2V0UGFsZXR0ZUFyZ2IoMSwgYXJnYjEpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcENvbG9yU3BhY2UgPT0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpICYmCisgICAgICBtX2JwYyA9PSA4ICYmIG1fYkRlZmF1bHREZWNvZGUpIHsKKyAgfSBlbHNlIHsKKyAgICBpbnQgcGFsZXR0ZV9jb3VudCA9IDEgPDwgKG1fYnBjICogbV9uQ29tcG9uZW50cyk7CisgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IGNvbG9yX3ZhbHVlcyhtX25Db21wb25lbnRzKTsKKyAgICBGWF9GTE9BVCogY29sb3JfdmFsdWUgPSBjb2xvcl92YWx1ZXM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxldHRlX2NvdW50OyBpKyspIHsKKyAgICAgIGludCBjb2xvcl9kYXRhID0gaTsKKyAgICAgIGZvciAoRlhfRFdPUkQgaiA9IDA7IGogPCBtX25Db21wb25lbnRzOyBqKyspIHsKKyAgICAgICAgaW50IGVuY29kZWRfY29tcG9uZW50ID0gY29sb3JfZGF0YSAlICgxIDw8IG1fYnBjKTsKKyAgICAgICAgY29sb3JfZGF0YSAvPSAxIDw8IG1fYnBjOworICAgICAgICBjb2xvcl92YWx1ZVtqXSA9IG1fcENvbXBEYXRhW2pdLm1fRGVjb2RlTWluICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YVtqXS5tX0RlY29kZVN0ZXAgKiBlbmNvZGVkX2NvbXBvbmVudDsKKyAgICAgIH0KKyAgICAgIEZYX0ZMT0FUIFIgPSAwLCBHID0gMCwgQiA9IDA7CisgICAgICBpZiAobV9uQ29tcG9uZW50cyA9PSAxICYmIG1fRmFtaWx5ID09IFBERkNTX0lDQ0JBU0VEICYmCisgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkgPiAxKSB7CisgICAgICAgIGludCBuQ29tcG9uZW50cyA9IG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpOworICAgICAgICBGWF9GTE9BVCogdGVtcF9idWYgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbkNvbXBvbmVudHMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgICB0ZW1wX2J1ZltpXSA9ICpjb2xvcl92YWx1ZTsKICAgICAgICAgfQotICAgICAgICBwU3JjTGluZSA9IG1fcENhY2hlZEJpdG1hcC0+R2V0U2NhbmxpbmUobGluZSk7Ci0gICAgfSBlbHNlIGlmIChtX3BEZWNvZGVyKSB7Ci0gICAgICAgIHBTcmNMaW5lID0gbV9wRGVjb2Rlci0+R2V0U2NhbmxpbmUobGluZSk7CisgICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQih0ZW1wX2J1ZiwgUiwgRywgQik7CisgICAgICAgIEZYX0ZyZWUodGVtcF9idWYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlLCBSLCBHLCBCKTsKKyAgICAgIH0KKyAgICAgIFNldFBhbGV0dGVBcmdiKGksIEFyZ2JFbmNvZGUoMjU1LCBGWFNZU19yb3VuZChSICogMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoRyAqIDI1NSksIEZYU1lTX3JvdW5kKEIgKiAyNTUpKSk7CisgICAgfQorICB9Cit9Cit2b2lkIENQREZfRElCU291cmNlOjpWYWxpZGF0ZURpY3RQYXJhbSgpIHsKKyAgbV9icGMgPSBtX2JwY19vcmlnOworICBDUERGX09iamVjdCogcEZpbHRlciA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRmlsdGVyIikpOworICBpZiAocEZpbHRlcikgeworICAgIGlmIChwRmlsdGVyLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGZpbHRlciA9IHBGaWx0ZXItPkdldFN0cmluZygpOworICAgICAgaWYgKGZpbHRlciA9PSBGWF9CU1RSQygiQ0NJVFRGYXhEZWNvZGUiKSB8fAorICAgICAgICAgIGZpbHRlciA9PSBGWF9CU1RSQygiSkJJRzJEZWNvZGUiKSkgeworICAgICAgICBtX2JwYyA9IDE7CisgICAgICAgIG1fbkNvbXBvbmVudHMgPSAxOworICAgICAgfQorICAgICAgaWYgKGZpbHRlciA9PSBGWF9CU1RSQygiUnVuTGVuZ3RoRGVjb2RlIikgfHwKKyAgICAgICAgICBmaWx0ZXIgPT0gRlhfQlNUUkMoIkRDVERlY29kZSIpKSB7CisgICAgICAgIG1fYnBjID0gODsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBGaWx0ZXItPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwRmlsdGVyOworICAgICAgaWYgKHBBcnJheS0+R2V0U3RyaW5nKHBBcnJheS0+R2V0Q291bnQoKSAtIDEpID09CisgICAgICAgICAgICAgIEZYX0JTVFJDKCJDQ0lUVEZheERlY29kZSIpIHx8CisgICAgICAgICAgcEFycmF5LT5HZXRTdHJpbmcocEFycmF5LT5HZXRDb3VudCgpIC0gMSkgPT0KKyAgICAgICAgICAgICAgRlhfQlNUUkMoIkpCSUcyRGVjb2RlIikpIHsKKyAgICAgICAgbV9icGMgPSAxOworICAgICAgICBtX25Db21wb25lbnRzID0gMTsKKyAgICAgIH0KKyAgICAgIGlmIChwQXJyYXktPkdldFN0cmluZyhwQXJyYXktPkdldENvdW50KCkgLSAxKSA9PSBGWF9CU1RSQygiRENURGVjb2RlIikpIHsKKyAgICAgICAgLy8gUHJldmlvdXNseSwgcEFycmF5LT5HZXRTdHJpbmcocEFycmF5LT5HZXRDb3VudCgpIC0gMSkgPT0KKyAgICAgICAgLy8gRlhfQlNUUkMoIlJ1bkxlbmd0aERlY29kZSIpIHdhcyBjaGVja2VkIGluIHRoZSAiaWYiIHN0YXRlbWVudCBhcworICAgICAgICAvLyB3ZWxsLAorICAgICAgICAvLyBidXQgdG9vIG1hbnkgZG9jdW1lbnRzIGRvbid0IGNvbmZvcm0gdG8gaXQuCisgICAgICAgIG1fYnBjID0gODsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKG1fYnBjICE9IDEgJiYgbV9icGMgIT0gMiAmJiBtX2JwYyAhPSA0ICYmIG1fYnBjICE9IDggJiYgbV9icGMgIT0gMTYpIHsKKyAgICBtX2JwYyA9IDA7CisgIH0KK30KKyNkZWZpbmUgTk9STUFMQ09MT1JfTUFYKGNvbG9yLCBtYXgpIFwKKyAgKGNvbG9yKSA+IChtYXgpID8gKG1heCkgOiAoY29sb3IpIDwgMCA/IDAgOiAoY29sb3IpOwordm9pZCBDUERGX0RJQlNvdXJjZTo6VHJhbnNsYXRlU2NhbmxpbmUyNGJwcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuKSBjb25zdCB7CisgIGlmIChtX2JwYyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBtYXhfZGF0YSA9ICgxIDw8IG1fYnBjKSAtIDE7CisgIGlmIChtX2JEZWZhdWx0RGVjb2RlKSB7CisgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQiB8fCBtX0ZhbWlseSA9PSBQREZDU19DQUxSR0IpIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MgPSBzcmNfc2NhbjsKKyAgICAgIHN3aXRjaCAobV9icGMpIHsKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3Bvc1s0XTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19wb3NbMl07CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3BvczsKKyAgICAgICAgICAgIHNyY19wb3MgKz0gNjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBtX1dpZHRoOyBjb2x1bW4rKykgeworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3Bvc1syXTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19wb3NbMV07CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3BvczsKKyAgICAgICAgICAgIHNyY19wb3MgKz0gMzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaW50IHNyY19iaXRfcG9zID0gMDsKKyAgICAgICAgICBpbnQgZGVzdF9ieXRlX3BvcyA9IDA7CisgICAgICAgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgbV9XaWR0aDsgY29sdW1uKyspIHsKKyAgICAgICAgICAgIGludCBSID0gX0dldEJpdHM4KHNyY19zY2FuLCBzcmNfYml0X3BvcywgbV9icGMpOworICAgICAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7CisgICAgICAgICAgICBpbnQgRyA9IF9HZXRCaXRzOChzcmNfc2Nhbiwgc3JjX2JpdF9wb3MsIG1fYnBjKTsKKyAgICAgICAgICAgIHNyY19iaXRfcG9zICs9IG1fYnBjOworICAgICAgICAgICAgaW50IEIgPSBfR2V0Qml0czgoc3JjX3NjYW4sIHNyY19iaXRfcG9zLCBtX2JwYyk7CisgICAgICAgICAgICBzcmNfYml0X3BvcyArPSBtX2JwYzsKKyAgICAgICAgICAgIFIgPSBOT1JNQUxDT0xPUl9NQVgoUiwgbWF4X2RhdGEpOworICAgICAgICAgICAgRyA9IE5PUk1BTENPTE9SX01BWChHLCBtYXhfZGF0YSk7CisgICAgICAgICAgICBCID0gTk9STUFMQ09MT1JfTUFYKEIsIG1heF9kYXRhKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zXSA9IEIgKiAyNTUgLyBtYXhfZGF0YTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zICsgMV0gPSBHICogMjU1IC8gbWF4X2RhdGE7CisgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9ieXRlX3BvcyArIDJdID0gUiAqIDI1NSAvIG1heF9kYXRhOworICAgICAgICAgICAgZGVzdF9ieXRlX3BvcyArPSAzOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1fYnBjID09IDgpIHsKKyAgICAgIGlmIChtX25Db21wb25lbnRzID09IG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpKQorICAgICAgICBtX3BDb2xvclNwYWNlLT5UcmFuc2xhdGVJbWFnZUxpbmUoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCBtX1dpZHRoLCBtX1dpZHRoLCBtX0hlaWdodCwKKyAgICAgICAgICAgIG1fYkxvYWRNYXNrICYmIG1fR3JvdXBGYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyAmJgorICAgICAgICAgICAgICAgIG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gY29sb3JfdmFsdWVzMShtX25Db21wb25lbnRzKTsKKyAgRlhfRkxPQVQqIGNvbG9yX3ZhbHVlcyA9IGNvbG9yX3ZhbHVlczE7CisgIEZYX0ZMT0FUIFIgPSAwLjBmLCBHID0gMC4wZiwgQiA9IDAuMGY7CisgIGlmIChtX2JwYyA9PSA4KSB7CisgICAgaW50IHNyY19ieXRlX3BvcyA9IDA7CisgICAgaW50IGRlc3RfYnl0ZV9wb3MgPSAwOworICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IG1fV2lkdGg7IGNvbHVtbisrKSB7CisgICAgICBmb3IgKEZYX0RXT1JEIGNvbG9yID0gMDsgY29sb3IgPCBtX25Db21wb25lbnRzOyBjb2xvcisrKSB7CisgICAgICAgIGludCBkYXRhID0gc3JjX3NjYW5bc3JjX2J5dGVfcG9zKytdOworICAgICAgICBjb2xvcl92YWx1ZXNbY29sb3JdID0gbV9wQ29tcERhdGFbY29sb3JdLm1fRGVjb2RlTWluICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbXBEYXRhW2NvbG9yXS5tX0RlY29kZVN0ZXAgKiBkYXRhOworICAgICAgfQorICAgICAgaWYgKG1fYkxvYWRNYXNrICYmIG1fR3JvdXBGYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyAmJgorICAgICAgICAgIG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKKyAgICAgICAgRlhfRkxPQVQgayA9IDEuMGYgLSBjb2xvcl92YWx1ZXNbM107CisgICAgICAgIFIgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1swXSkgKiBrOworICAgICAgICBHID0gKDEuMGYgLSBjb2xvcl92YWx1ZXNbMV0pICogazsKKyAgICAgICAgQiA9ICgxLjBmIC0gY29sb3JfdmFsdWVzWzJdKSAqIGs7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IoY29sb3JfdmFsdWVzLCBSLCBHLCBCKTsKKyAgICAgIH0KKyAgICAgIFIgPSBOT1JNQUxDT0xPUl9NQVgoUiwgMSk7CisgICAgICBHID0gTk9STUFMQ09MT1JfTUFYKEcsIDEpOworICAgICAgQiA9IE5PUk1BTENPTE9SX01BWChCLCAxKTsKKyAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zXSA9IChpbnQzMl90KShCICogMjU1KTsKKyAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zICsgMV0gPSAoaW50MzJfdCkoRyAqIDI1NSk7CisgICAgICBkZXN0X3NjYW5bZGVzdF9ieXRlX3BvcyArIDJdID0gKGludDMyX3QpKFIgKiAyNTUpOworICAgICAgZGVzdF9ieXRlX3BvcyArPSAzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgc3JjX2JpdF9wb3MgPSAwOworICAgIGludCBkZXN0X2J5dGVfcG9zID0gMDsKKyAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBtX1dpZHRoOyBjb2x1bW4rKykgeworICAgICAgZm9yIChGWF9EV09SRCBjb2xvciA9IDA7IGNvbG9yIDwgbV9uQ29tcG9uZW50czsgY29sb3IrKykgeworICAgICAgICBpbnQgZGF0YSA9IF9HZXRCaXRzOChzcmNfc2Nhbiwgc3JjX2JpdF9wb3MsIG1fYnBjKTsKKyAgICAgICAgY29sb3JfdmFsdWVzW2NvbG9yXSA9IG1fcENvbXBEYXRhW2NvbG9yXS5tX0RlY29kZU1pbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YVtjb2xvcl0ubV9EZWNvZGVTdGVwICogZGF0YTsKKyAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7CisgICAgICB9CisgICAgICBpZiAobV9iTG9hZE1hc2sgJiYgbV9Hcm91cEZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLICYmCisgICAgICAgICAgbV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSykgeworICAgICAgICBGWF9GTE9BVCBrID0gMS4wZiAtIGNvbG9yX3ZhbHVlc1szXTsKKyAgICAgICAgUiA9ICgxLjBmIC0gY29sb3JfdmFsdWVzWzBdKSAqIGs7CisgICAgICAgIEcgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1sxXSkgKiBrOworICAgICAgICBCID0gKDEuMGYgLSBjb2xvcl92YWx1ZXNbMl0pICogazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihjb2xvcl92YWx1ZXMsIFIsIEcsIEIpOworICAgICAgfQorICAgICAgUiA9IE5PUk1BTENPTE9SX01BWChSLCAxKTsKKyAgICAgIEcgPSBOT1JNQUxDT0xPUl9NQVgoRywgMSk7CisgICAgICBCID0gTk9STUFMQ09MT1JfTUFYKEIsIDEpOworICAgICAgZGVzdF9zY2FuW2Rlc3RfYnl0ZV9wb3NdID0gKGludDMyX3QpKEIgKiAyNTUpOworICAgICAgZGVzdF9zY2FuW2Rlc3RfYnl0ZV9wb3MgKyAxXSA9IChpbnQzMl90KShHICogMjU1KTsKKyAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zICsgMl0gPSAoaW50MzJfdCkoUiAqIDI1NSk7CisgICAgICBkZXN0X2J5dGVfcG9zICs9IDM7CisgICAgfQorICB9Cit9Cit1aW50OF90KiBDUERGX0RJQlNvdXJjZTo6R2V0QnVmZmVyKCkgY29uc3QgeworICBpZiAobV9wQ2FjaGVkQml0bWFwKSB7CisgICAgcmV0dXJuIG1fcENhY2hlZEJpdG1hcC0+R2V0QnVmZmVyKCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9Citjb25zdCB1aW50OF90KiBDUERGX0RJQlNvdXJjZTo6R2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0IHsKKyAgaWYgKG1fYnBjID09IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWF9TQUZFX0RXT1JEIHNyY19waXRjaCA9IENhbGN1bGF0ZVBpdGNoOChtX2JwYywgbV9uQ29tcG9uZW50cywgbV9XaWR0aCwgMSk7CisgIGlmICghc3JjX3BpdGNoLklzVmFsaWQoKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgRlhfRFdPUkQgc3JjX3BpdGNoX3ZhbHVlID0gc3JjX3BpdGNoLlZhbHVlT3JEaWUoKTsKKyAgY29uc3QgdWludDhfdCogcFNyY0xpbmUgPSBOVUxMOworICBpZiAobV9wQ2FjaGVkQml0bWFwKSB7CisgICAgaWYgKGxpbmUgPj0gbV9wQ2FjaGVkQml0bWFwLT5HZXRIZWlnaHQoKSkgeworICAgICAgbGluZSA9IG1fcENhY2hlZEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSAxOworICAgIH0KKyAgICBwU3JjTGluZSA9IG1fcENhY2hlZEJpdG1hcC0+R2V0U2NhbmxpbmUobGluZSk7CisgIH0gZWxzZSBpZiAobV9wRGVjb2RlcikgeworICAgIHBTcmNMaW5lID0gbV9wRGVjb2Rlci0+R2V0U2NhbmxpbmUobGluZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpID49IChsaW5lICsgMSkgKiBzcmNfcGl0Y2hfdmFsdWUpIHsKKyAgICAgIHBTcmNMaW5lID0gbV9wU3RyZWFtQWNjLT5HZXREYXRhKCkgKyBsaW5lICogc3JjX3BpdGNoX3ZhbHVlOworICAgIH0KKyAgfQorICBpZiAocFNyY0xpbmUgPT0gTlVMTCkgeworICAgIHVpbnQ4X3QqIHBMaW5lQnVmID0gbV9wTWFza2VkTGluZSA/IG1fcE1hc2tlZExpbmUgOiBtX3BMaW5lQnVmOworICAgIEZYU1lTX21lbXNldChwTGluZUJ1ZiwgMHhmZiwgbV9QaXRjaCk7CisgICAgcmV0dXJuIHBMaW5lQnVmOworICB9CisgIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPT0gMSkgeworICAgIGlmIChtX2JJbWFnZU1hc2sgJiYgbV9iRGVmYXVsdERlY29kZSkgeworICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHNyY19waXRjaF92YWx1ZTsgaSsrKSB7CisgICAgICAgIG1fcExpbmVCdWZbaV0gPSB+cFNyY0xpbmVbaV07CisgICAgICB9CisgICAgfSBlbHNlIGlmIChtX2JDb2xvcktleSkgeworICAgICAgRlhfRFdPUkQgcmVzZXRfYXJnYiwgc2V0X2FyZ2I7CisgICAgICByZXNldF9hcmdiID0gbV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbMF0gOiAweGZmMDAwMDAwOworICAgICAgc2V0X2FyZ2IgPSBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVsxXSA6IDB4ZmZmZmZmZmY7CisgICAgICBpZiAobV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1pbiA9PSAwKSB7CisgICAgICAgIHJlc2V0X2FyZ2IgPSAwOworICAgICAgfQorICAgICAgaWYgKG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNYXggPT0gMSkgeworICAgICAgICBzZXRfYXJnYiA9IDA7CisgICAgICB9CisgICAgICBzZXRfYXJnYiA9IEZYQVJHQl9UT0RJQihzZXRfYXJnYik7CisgICAgICByZXNldF9hcmdiID0gRlhBUkdCX1RPRElCKHJlc2V0X2FyZ2IpOworICAgICAgRlhfRFdPUkQqIGRlc3Rfc2NhbiA9IChGWF9EV09SRCopbV9wTWFza2VkTGluZTsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgIGlmIChwU3JjTGluZVtjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKSB7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IHNldF9hcmdiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpkZXN0X3NjYW4gPSByZXNldF9hcmdiOworICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgICAgcmV0dXJuIG1fcE1hc2tlZExpbmU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpID49IChsaW5lICsgMSkgKiBzcmNfcGl0Y2hfdmFsdWUpIHsKLSAgICAgICAgICAgIHBTcmNMaW5lID0gbV9wU3RyZWFtQWNjLT5HZXREYXRhKCkgKyBsaW5lICogc3JjX3BpdGNoX3ZhbHVlOwotICAgICAgICB9CisgICAgICBGWFNZU19tZW1jcHkobV9wTGluZUJ1ZiwgcFNyY0xpbmUsIHNyY19waXRjaF92YWx1ZSk7CiAgICAgfQotICAgIGlmIChwU3JjTGluZSA9PSBOVUxMKSB7Ci0gICAgICAgIHVpbnQ4X3QqIHBMaW5lQnVmID0gbV9wTWFza2VkTGluZSA/IG1fcE1hc2tlZExpbmUgOiBtX3BMaW5lQnVmOwotICAgICAgICBGWFNZU19tZW1zZXQocExpbmVCdWYsIDB4ZmYsIG1fUGl0Y2gpOwotICAgICAgICByZXR1cm4gcExpbmVCdWY7Ci0gICAgfQotICAgIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPT0gMSkgewotICAgICAgICBpZiAobV9iSW1hZ2VNYXNrICYmIG1fYkRlZmF1bHREZWNvZGUpIHsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzcmNfcGl0Y2hfdmFsdWU7IGkrKykgewotICAgICAgICAgICAgICAgIG1fcExpbmVCdWZbaV0gPSB+cFNyY0xpbmVbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobV9iQ29sb3JLZXkpIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIHJlc2V0X2FyZ2IsIHNldF9hcmdiOwotICAgICAgICAgICAgcmVzZXRfYXJnYiA9IG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlWzBdIDogMHhmZjAwMDAwMDsKLSAgICAgICAgICAgIHNldF9hcmdiID0gbV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbMV0gOiAweGZmZmZmZmZmOwotICAgICAgICAgICAgaWYgKG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNaW4gPT0gMCkgewotICAgICAgICAgICAgICAgIHJlc2V0X2FyZ2IgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNYXggPT0gMSkgewotICAgICAgICAgICAgICAgIHNldF9hcmdiID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldF9hcmdiID0gRlhBUkdCX1RPRElCKHNldF9hcmdiKTsKLSAgICAgICAgICAgIHJlc2V0X2FyZ2IgPSBGWEFSR0JfVE9ESUIocmVzZXRfYXJnYik7Ci0gICAgICAgICAgICBGWF9EV09SRCogZGVzdF9zY2FuID0gKEZYX0RXT1JEKiltX3BNYXNrZWRMaW5lOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBTcmNMaW5lW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IHNldF9hcmdiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSByZXNldF9hcmdiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbV9wTWFza2VkTGluZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShtX3BMaW5lQnVmLCBwU3JjTGluZSwgc3JjX3BpdGNoX3ZhbHVlKTsKKyAgICByZXR1cm4gbV9wTGluZUJ1ZjsKKyAgfQorICBpZiAobV9icGMgKiBtX25Db21wb25lbnRzIDw9IDgpIHsKKyAgICBpZiAobV9icGMgPT0gOCkgeworICAgICAgRlhTWVNfbWVtY3B5KG1fcExpbmVCdWYsIHBTcmNMaW5lLCBzcmNfcGl0Y2hfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgc3JjX2JpdF9wb3MgPSAwOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgaW50IGNvbG9yX2luZGV4ID0gMDsKKyAgICAgICAgZm9yIChGWF9EV09SRCBjb2xvciA9IDA7IGNvbG9yIDwgbV9uQ29tcG9uZW50czsgY29sb3IrKykgeworICAgICAgICAgIGludCBkYXRhID0gX0dldEJpdHM4KHBTcmNMaW5lLCBzcmNfYml0X3BvcywgbV9icGMpOworICAgICAgICAgIGNvbG9yX2luZGV4IHw9IGRhdGEgPDwgKGNvbG9yICogbV9icGMpOworICAgICAgICAgIHNyY19iaXRfcG9zICs9IG1fYnBjOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtX3BMaW5lQnVmOwotICAgIH0KLSAgICBpZiAobV9icGMgKiBtX25Db21wb25lbnRzIDw9IDgpIHsKLSAgICAgICAgaWYgKG1fYnBjID09IDgpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShtX3BMaW5lQnVmLCBwU3JjTGluZSwgc3JjX3BpdGNoX3ZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBzcmNfYml0X3BvcyA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgY29sb3JfaW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgY29sb3IgPSAwOyBjb2xvciA8IG1fbkNvbXBvbmVudHM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBkYXRhID0gX0dldEJpdHM4KHBTcmNMaW5lLCBzcmNfYml0X3BvcywgbV9icGMpOwotICAgICAgICAgICAgICAgICAgICBjb2xvcl9pbmRleCB8PSBkYXRhIDw8IChjb2xvciAqIG1fYnBjKTsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcExpbmVCdWZbY29sXSA9IGNvbG9yX2luZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2JDb2xvcktleSkgewotICAgICAgICAgICAgdWludDhfdCogcERlc3RQaXhlbCA9IG1fcE1hc2tlZExpbmU7Ci0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjUGl4ZWwgPSBtX3BMaW5lQnVmOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBpbmRleCA9ICpwU3JjUGl4ZWwrKzsKLSAgICAgICAgICAgICAgICBpZiAobV9wUGFsZXR0ZSkgewotICAgICAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX0IobV9wUGFsZXR0ZVtpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX0cobV9wUGFsZXR0ZVtpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX1IobV9wUGFsZXR0ZVtpbmRleF0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IGluZGV4OwotICAgICAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpwRGVzdFBpeGVsID0gKGluZGV4IDwgbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1pbiB8fCBpbmRleCA+IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNYXgpID8gMHhmZiA6IDA7Ci0gICAgICAgICAgICAgICAgcERlc3RQaXhlbCArKyA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbV9wTWFza2VkTGluZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wTGluZUJ1ZjsKKyAgICAgICAgbV9wTGluZUJ1Zltjb2xdID0gY29sb3JfaW5kZXg7CisgICAgICB9CiAgICAgfQogICAgIGlmIChtX2JDb2xvcktleSkgewotICAgICAgICBpZiAobV9uQ29tcG9uZW50cyA9PSAzICYmIG1fYnBjID09IDgpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGFscGhhX2NoYW5uZWwgPSBtX3BNYXNrZWRMaW5lICsgMzsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBQaXhlbCA9IHBTcmNMaW5lICsgY29sICogMzsKLSAgICAgICAgICAgICAgICBhbHBoYV9jaGFubmVsW2NvbCAqIDRdID0gKHBQaXhlbFswXSA8IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNaW4gfHwgcFBpeGVsWzBdID4gbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1heCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpeGVsWzFdIDwgbV9wQ29tcERhdGFbMV0ubV9Db2xvcktleU1pbiB8fCBwUGl4ZWxbMV0gPiBtX3BDb21wRGF0YVsxXS5tX0NvbG9yS2V5TWF4IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGl4ZWxbMl0gPCBtX3BDb21wRGF0YVsyXS5tX0NvbG9yS2V5TWluIHx8IHBQaXhlbFsyXSA+IG1fcENvbXBEYXRhWzJdLm1fQ29sb3JLZXlNYXgpID8gMHhmZiA6IDA7Ci0gICAgICAgICAgICB9CisgICAgICB1aW50OF90KiBwRGVzdFBpeGVsID0gbV9wTWFza2VkTGluZTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNQaXhlbCA9IG1fcExpbmVCdWY7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICB1aW50OF90IGluZGV4ID0gKnBTcmNQaXhlbCsrOworICAgICAgICBpZiAobV9wUGFsZXR0ZSkgeworICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBGWEFSR0JfQihtX3BQYWxldHRlW2luZGV4XSk7CisgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9HKG1fcFBhbGV0dGVbaW5kZXhdKTsKKyAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX1IobV9wUGFsZXR0ZVtpbmRleF0pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcE1hc2tlZExpbmUsIDB4ZmYsIG1fUGl0Y2gpOworICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBpbmRleDsKKyAgICAgICAgICAqcERlc3RQaXhlbCsrID0gaW5kZXg7CisgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IGluZGV4OwogICAgICAgICB9CisgICAgICAgICpwRGVzdFBpeGVsID0gKGluZGV4IDwgbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1pbiB8fAorICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA+IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNYXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gMHhmZgorICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgIHBEZXN0UGl4ZWwrKzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtX3BNYXNrZWRMaW5lOwogICAgIH0KLSAgICBpZiAobV9wQ29sb3JTcGFjZSkgewotICAgICAgICBUcmFuc2xhdGVTY2FubGluZTI0YnBwKG1fcExpbmVCdWYsIHBTcmNMaW5lKTsKLSAgICAgICAgcFNyY0xpbmUgPSBtX3BMaW5lQnVmOworICAgIHJldHVybiBtX3BMaW5lQnVmOworICB9CisgIGlmIChtX2JDb2xvcktleSkgeworICAgIGlmIChtX25Db21wb25lbnRzID09IDMgJiYgbV9icGMgPT0gOCkgeworICAgICAgdWludDhfdCogYWxwaGFfY2hhbm5lbCA9IG1fcE1hc2tlZExpbmUgKyAzOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCogcFBpeGVsID0gcFNyY0xpbmUgKyBjb2wgKiAzOworICAgICAgICBhbHBoYV9jaGFubmVsW2NvbCAqIDRdID0gKHBQaXhlbFswXSA8IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNaW4gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGl4ZWxbMF0gPiBtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWF4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpeGVsWzFdIDwgbV9wQ29tcERhdGFbMV0ubV9Db2xvcktleU1pbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXhlbFsxXSA+IG1fcENvbXBEYXRhWzFdLm1fQ29sb3JLZXlNYXggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGl4ZWxbMl0gPCBtX3BDb21wRGF0YVsyXS5tX0NvbG9yS2V5TWluIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpeGVsWzJdID4gbV9wQ29tcERhdGFbMl0ubV9Db2xvcktleU1heCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDB4ZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEZYU1lTX21lbXNldChtX3BNYXNrZWRMaW5lLCAweGZmLCBtX1BpdGNoKTsKICAgICB9Ci0gICAgaWYgKG1fYkNvbG9yS2V5KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNQaXhlbCA9IHBTcmNMaW5lOwotICAgICAgICB1aW50OF90KiBwRGVzdFBpeGVsID0gbV9wTWFza2VkTGluZTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gKnBTcmNQaXhlbCsrOwotICAgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9ICpwU3JjUGl4ZWwrKzsKLSAgICAgICAgICAgICpwRGVzdFBpeGVsKysgPSAqcFNyY1BpeGVsKys7Ci0gICAgICAgICAgICBwRGVzdFBpeGVsICsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtX3BNYXNrZWRMaW5lOworICB9CisgIGlmIChtX3BDb2xvclNwYWNlKSB7CisgICAgVHJhbnNsYXRlU2NhbmxpbmUyNGJwcChtX3BMaW5lQnVmLCBwU3JjTGluZSk7CisgICAgcFNyY0xpbmUgPSBtX3BMaW5lQnVmOworICB9CisgIGlmIChtX2JDb2xvcktleSkgeworICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNQaXhlbCA9IHBTcmNMaW5lOworICAgIHVpbnQ4X3QqIHBEZXN0UGl4ZWwgPSBtX3BNYXNrZWRMaW5lOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAqcERlc3RQaXhlbCsrID0gKnBTcmNQaXhlbCsrOworICAgICAgKnBEZXN0UGl4ZWwrKyA9ICpwU3JjUGl4ZWwrKzsKKyAgICAgICpwRGVzdFBpeGVsKysgPSAqcFNyY1BpeGVsKys7CisgICAgICBwRGVzdFBpeGVsKys7CiAgICAgfQotICAgIHJldHVybiBwU3JjTGluZTsKKyAgICByZXR1cm4gbV9wTWFza2VkTGluZTsKKyAgfQorICByZXR1cm4gcFNyY0xpbmU7CiB9Ci1GWF9CT09MIENQREZfRElCU291cmNlOjpTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERlY29kZXIpIHsKLSAgICAgICAgcmV0dXJuIG1fcERlY29kZXItPlNraXBUb1NjYW5saW5lKGxpbmUsIHBQYXVzZSk7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9ESUJTb3VyY2U6OlNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgY29uc3QgeworICBpZiAobV9wRGVjb2RlcikgeworICAgIHJldHVybiBtX3BEZWNvZGVyLT5Ta2lwVG9TY2FubGluZShsaW5lLCBwUGF1c2UpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLXZvaWQgQ1BERl9ESUJTb3VyY2U6OkRvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwgdWludDhfdCogZGVzdF9zY2FuLCBpbnQgZGVzdF9icHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIEZYX0JPT0wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QKLXsKLSAgICBpZiAobGluZSA8IDAgfHwgZGVzdF9zY2FuID09IE5VTEwgfHwgZGVzdF9icHAgPD0gMCB8fAotICAgICAgICBkZXN0X3dpZHRoIDw9IDAgfHwgY2xpcF9sZWZ0IDwgMCB8fCBjbGlwX3dpZHRoIDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KK3ZvaWQgQ1BERl9ESUJTb3VyY2U6OkRvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfYnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfd2lkdGgpIGNvbnN0IHsKKyAgaWYgKGxpbmUgPCAwIHx8IGRlc3Rfc2NhbiA9PSBOVUxMIHx8IGRlc3RfYnBwIDw9IDAgfHwgZGVzdF93aWR0aCA8PSAwIHx8CisgICAgICBjbGlwX2xlZnQgPCAwIHx8IGNsaXBfd2lkdGggPD0gMCkgeworICAgIHJldHVybjsKKyAgfQogCi0gICAgRlhfRFdPUkQgc3JjX3dpZHRoID0gbV9XaWR0aDsKLSAgICBGWF9TQUZFX0RXT1JEIHBpdGNoID0gQ2FsY3VsYXRlUGl0Y2g4KG1fYnBjLCBtX25Db21wb25lbnRzLCBtX1dpZHRoLCAxKTsKKyAgRlhfRFdPUkQgc3JjX3dpZHRoID0gbV9XaWR0aDsKKyAgRlhfU0FGRV9EV09SRCBwaXRjaCA9IENhbGN1bGF0ZVBpdGNoOChtX2JwYywgbV9uQ29tcG9uZW50cywgbV9XaWR0aCwgMSk7CisgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3QgdWludDhfdCogcFNyY0xpbmUgPSBOVUxMOworICBpZiAobV9wQ2FjaGVkQml0bWFwKSB7CisgICAgcFNyY0xpbmUgPSBtX3BDYWNoZWRCaXRtYXAtPkdldFNjYW5saW5lKGxpbmUpOworICB9IGVsc2UgaWYgKG1fcERlY29kZXIpIHsKKyAgICBwU3JjTGluZSA9IG1fcERlY29kZXItPkdldFNjYW5saW5lKGxpbmUpOworICB9IGVsc2UgeworICAgIEZYX0RXT1JEIHNyY19waXRjaCA9IHBpdGNoLlZhbHVlT3JEaWUoKTsKKyAgICBwaXRjaCAqPSAobGluZSArIDEpOwogICAgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBjb25zdCB1aW50OF90KiBwU3JjTGluZSA9IE5VTEw7Ci0gICAgaWYgKG1fcENhY2hlZEJpdG1hcCkgewotICAgICAgICBwU3JjTGluZSA9IG1fcENhY2hlZEJpdG1hcC0+R2V0U2NhbmxpbmUobGluZSk7Ci0gICAgfSBlbHNlIGlmIChtX3BEZWNvZGVyKSB7Ci0gICAgICAgIHBTcmNMaW5lID0gbV9wRGVjb2Rlci0+R2V0U2NhbmxpbmUobGluZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhfRFdPUkQgc3JjX3BpdGNoID0gcGl0Y2guVmFsdWVPckRpZSgpOwotICAgICAgICBwaXRjaCAqPSAobGluZSsxKTsKLSAgICAgICAgaWYgKCFwaXRjaC5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICBpZiAobV9wU3RyZWFtQWNjLT5HZXRTaXplKCkgPj0gcGl0Y2guVmFsdWVPckRpZSgpKSB7CisgICAgICBwU3JjTGluZSA9IG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpICsgbGluZSAqIHNyY19waXRjaDsKKyAgICB9CisgIH0KKyAgaW50IG9yaWdfQnBwID0gbV9icGMgKiBtX25Db21wb25lbnRzIC8gODsKKyAgaW50IGRlc3RfQnBwID0gZGVzdF9icHAgLyA4OworICBpZiAocFNyY0xpbmUgPT0gTlVMTCkgeworICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIDB4ZmYsIGRlc3RfQnBwICogY2xpcF93aWR0aCk7CisgICAgcmV0dXJuOworICB9CisKKyAgRlhfU0FGRV9JTlQzMiBtYXhfc3JjX3ggPSBjbGlwX2xlZnQ7CisgIG1heF9zcmNfeCArPSBjbGlwX3dpZHRoIC0gMTsKKyAgbWF4X3NyY194ICo9IHNyY193aWR0aDsKKyAgbWF4X3NyY194IC89IGRlc3Rfd2lkdGg7CisgIGlmICghbWF4X3NyY194LklzVmFsaWQoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIENGWF9GaXhlZEJ1Zkdyb3c8dWludDhfdCwgMTI4PiB0ZW1wKG9yaWdfQnBwKTsKKyAgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA9PSAxKSB7CisgICAgRlhfRFdPUkQgc2V0X2FyZ2IgPSAoRlhfRFdPUkQpLTEsIHJlc2V0X2FyZ2IgPSAwOworICAgIGlmIChtX2JJbWFnZU1hc2spIHsKKyAgICAgIGlmIChtX2JEZWZhdWx0RGVjb2RlKSB7CisgICAgICAgIHNldF9hcmdiID0gMDsKKyAgICAgICAgcmVzZXRfYXJnYiA9IChGWF9EV09SRCktMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1fYkNvbG9yS2V5KSB7CisgICAgICByZXNldF9hcmdiID0gbV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbMF0gOiAweGZmMDAwMDAwOworICAgICAgc2V0X2FyZ2IgPSBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVsxXSA6IDB4ZmZmZmZmZmY7CisgICAgICBpZiAobV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1pbiA9PSAwKSB7CisgICAgICAgIHJlc2V0X2FyZ2IgPSAwOworICAgICAgfQorICAgICAgaWYgKG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNYXggPT0gMSkgeworICAgICAgICBzZXRfYXJnYiA9IDA7CisgICAgICB9CisgICAgICBzZXRfYXJnYiA9IEZYQVJHQl9UT0RJQihzZXRfYXJnYik7CisgICAgICByZXNldF9hcmdiID0gRlhBUkdCX1RPRElCKHJlc2V0X2FyZ2IpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpKyspIHsKKyAgICAgICAgRlhfRFdPUkQgc3JjX3ggPSAoY2xpcF9sZWZ0ICsgaSkgKiBzcmNfd2lkdGggLyBkZXN0X3dpZHRoOworICAgICAgICBpZiAoYkZsaXBYKSB7CisgICAgICAgICAgc3JjX3ggPSBzcmNfd2lkdGggLSBzcmNfeCAtIDE7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAobV9wU3RyZWFtQWNjLT5HZXRTaXplKCkgPj0gcGl0Y2guVmFsdWVPckRpZSgpKSB7Ci0gICAgICAgICAgICBwU3JjTGluZSA9IG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpICsgbGluZSAqIHNyY19waXRjaDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgb3JpZ19CcHAgPSBtX2JwYyAqIG1fbkNvbXBvbmVudHMgLyA4OwotICAgIGludCBkZXN0X0JwcCA9IGRlc3RfYnBwIC8gODsKLSAgICBpZiAocFNyY0xpbmUgPT0gTlVMTCkgewotICAgICAgICBGWFNZU19tZW1zZXQoZGVzdF9zY2FuLCAweGZmLCBkZXN0X0JwcCAqIGNsaXBfd2lkdGgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRlhfU0FGRV9JTlQzMiBtYXhfc3JjX3ggPSBjbGlwX2xlZnQ7Ci0gICAgbWF4X3NyY194ICs9IGNsaXBfd2lkdGggLSAxOwotICAgIG1heF9zcmNfeCAqPSBzcmNfd2lkdGg7Ci0gICAgbWF4X3NyY194IC89IGRlc3Rfd2lkdGg7Ci0gICAgaWYgKCFtYXhfc3JjX3guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDRlhfRml4ZWRCdWZHcm93PHVpbnQ4X3QsIDEyOD4gdGVtcChvcmlnX0JwcCk7Ci0gICAgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA9PSAxKSB7Ci0gICAgICAgIEZYX0RXT1JEIHNldF9hcmdiID0gKEZYX0RXT1JEKSAtIDEsIHJlc2V0X2FyZ2IgPSAwOwotICAgICAgICBpZiAobV9iSW1hZ2VNYXNrKSB7Ci0gICAgICAgICAgICBpZiAobV9iRGVmYXVsdERlY29kZSkgewotICAgICAgICAgICAgICAgIHNldF9hcmdiID0gMDsKLSAgICAgICAgICAgICAgICByZXNldF9hcmdiID0gKEZYX0RXT1JEKSAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobV9iQ29sb3JLZXkpIHsKLSAgICAgICAgICAgIHJlc2V0X2FyZ2IgPSBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVswXSA6IDB4ZmYwMDAwMDA7Ci0gICAgICAgICAgICBzZXRfYXJnYiA9IG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlWzFdIDogMHhmZmZmZmZmZjsKLSAgICAgICAgICAgIGlmIChtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWluID09IDApIHsKLSAgICAgICAgICAgICAgICByZXNldF9hcmdiID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWF4ID09IDEpIHsKLSAgICAgICAgICAgICAgICBzZXRfYXJnYiA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRfYXJnYiA9IEZYQVJHQl9UT0RJQihzZXRfYXJnYik7Ci0gICAgICAgICAgICByZXNldF9hcmdiID0gRlhBUkdCX1RPRElCKHJlc2V0X2FyZ2IpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3ggPSAoY2xpcF9sZWZ0ICsgaSkgKiBzcmNfd2lkdGggLyBkZXN0X3dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChiRmxpcFgpIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3ggPSBzcmNfd2lkdGggLSBzcmNfeCAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNyY194ICU9IHNyY193aWR0aDsKLSAgICAgICAgICAgICAgICBpZiAocFNyY0xpbmVbc3JjX3ggLyA4XSAmICgxIDw8ICg3IC0gc3JjX3ggJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgKChGWF9EV09SRCopZGVzdF9zY2FuKVtpXSA9IHNldF9hcmdiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICgoRlhfRFdPUkQqKWRlc3Rfc2NhbilbaV0gPSByZXNldF9hcmdiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3JjX3ggJT0gc3JjX3dpZHRoOworICAgICAgICBpZiAocFNyY0xpbmVbc3JjX3ggLyA4XSAmICgxIDw8ICg3IC0gc3JjX3ggJSA4KSkpIHsKKyAgICAgICAgICAoKEZYX0RXT1JEKilkZXN0X3NjYW4pW2ldID0gc2V0X2FyZ2I7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZGVzdF9CcHAgPT0gMSkgewotICAgICAgICAgICAgfSBlbHNlIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgICAgICAgICAgcmVzZXRfYXJnYiA9IG1fcFBhbGV0dGVbMF07Ci0gICAgICAgICAgICAgICAgc2V0X2FyZ2IgPSBtX3BQYWxldHRlWzFdOwotICAgICAgICAgICAgfQorICAgICAgICAgICgoRlhfRFdPUkQqKWRlc3Rfc2NhbilbaV0gPSByZXNldF9hcmdiOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSArKykgewotICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3ggPSAoY2xpcF9sZWZ0ICsgaSkgKiBzcmNfd2lkdGggLyBkZXN0X3dpZHRoOwotICAgICAgICAgICAgaWYgKGJGbGlwWCkgewotICAgICAgICAgICAgICAgIHNyY194ID0gc3JjX3dpZHRoIC0gc3JjX3ggLSAxOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZGVzdF9CcHAgPT0gMSkgeworICAgICAgfSBlbHNlIGlmIChtX3BQYWxldHRlKSB7CisgICAgICAgIHJlc2V0X2FyZ2IgPSBtX3BQYWxldHRlWzBdOworICAgICAgICBzZXRfYXJnYiA9IG1fcFBhbGV0dGVbMV07CisgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSsrKSB7CisgICAgICBGWF9EV09SRCBzcmNfeCA9IChjbGlwX2xlZnQgKyBpKSAqIHNyY193aWR0aCAvIGRlc3Rfd2lkdGg7CisgICAgICBpZiAoYkZsaXBYKSB7CisgICAgICAgIHNyY194ID0gc3JjX3dpZHRoIC0gc3JjX3ggLSAxOworICAgICAgfQorICAgICAgc3JjX3ggJT0gc3JjX3dpZHRoOworICAgICAgaW50IGRlc3RfcG9zID0gaSAqIGRlc3RfQnBwOworICAgICAgaWYgKHBTcmNMaW5lW3NyY194IC8gOF0gJiAoMSA8PCAoNyAtIHNyY194ICUgOCkpKSB7CisgICAgICAgIGlmIChkZXN0X0JwcCA9PSAxKSB7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9ICh1aW50OF90KXNldF9hcmdiOworICAgICAgICB9IGVsc2UgaWYgKGRlc3RfQnBwID09IDMpIHsKKyAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3NdID0gRlhBUkdCX0Ioc2V0X2FyZ2IpOworICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDFdID0gRlhBUkdCX0coc2V0X2FyZ2IpOworICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDJdID0gRlhBUkdCX1Ioc2V0X2FyZ2IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICooRlhfRFdPUkQqKShkZXN0X3NjYW4gKyBkZXN0X3BvcykgPSBzZXRfYXJnYjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRlc3RfQnBwID09IDEpIHsKKyAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3NdID0gKHVpbnQ4X3QpcmVzZXRfYXJnYjsKKyAgICAgICAgfSBlbHNlIGlmIChkZXN0X0JwcCA9PSAzKSB7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9IEZYQVJHQl9CKHJlc2V0X2FyZ2IpOworICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDFdID0gRlhBUkdCX0cocmVzZXRfYXJnYik7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMl0gPSBGWEFSR0JfUihyZXNldF9hcmdiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqKEZYX0RXT1JEKikoZGVzdF9zY2FuICsgZGVzdF9wb3MpID0gcmVzZXRfYXJnYjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAobV9icGMgKiBtX25Db21wb25lbnRzIDw9IDgpIHsKKyAgICBpZiAobV9icGMgPCA4KSB7CisgICAgICBpbnQgc3JjX2JpdF9wb3MgPSAwOworICAgICAgZm9yIChGWF9EV09SRCBjb2wgPSAwOyBjb2wgPCBzcmNfd2lkdGg7IGNvbCsrKSB7CisgICAgICAgIGludCBjb2xvcl9pbmRleCA9IDA7CisgICAgICAgIGZvciAoRlhfRFdPUkQgY29sb3IgPSAwOyBjb2xvciA8IG1fbkNvbXBvbmVudHM7IGNvbG9yKyspIHsKKyAgICAgICAgICBpbnQgZGF0YSA9IF9HZXRCaXRzOChwU3JjTGluZSwgc3JjX2JpdF9wb3MsIG1fYnBjKTsKKyAgICAgICAgICBjb2xvcl9pbmRleCB8PSBkYXRhIDw8IChjb2xvciAqIG1fYnBjKTsKKyAgICAgICAgICBzcmNfYml0X3BvcyArPSBtX2JwYzsKKyAgICAgICAgfQorICAgICAgICBtX3BMaW5lQnVmW2NvbF0gPSBjb2xvcl9pbmRleDsKKyAgICAgIH0KKyAgICAgIHBTcmNMaW5lID0gbV9wTGluZUJ1ZjsKKyAgICB9CisgICAgaWYgKG1fYkNvbG9yS2V5KSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaXBfd2lkdGg7IGkrKykgeworICAgICAgICBGWF9EV09SRCBzcmNfeCA9IChjbGlwX2xlZnQgKyBpKSAqIHNyY193aWR0aCAvIGRlc3Rfd2lkdGg7CisgICAgICAgIGlmIChiRmxpcFgpIHsKKyAgICAgICAgICBzcmNfeCA9IHNyY193aWR0aCAtIHNyY194IC0gMTsKKyAgICAgICAgfQorICAgICAgICBzcmNfeCAlPSBzcmNfd2lkdGg7CisgICAgICAgIHVpbnQ4X3QqIHBEZXN0UGl4ZWwgPSBkZXN0X3NjYW4gKyBpICogNDsKKyAgICAgICAgdWludDhfdCBpbmRleCA9IHBTcmNMaW5lW3NyY194XTsKKyAgICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX0IobV9wUGFsZXR0ZVtpbmRleF0pOworICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBGWEFSR0JfRyhtX3BQYWxldHRlW2luZGV4XSk7CisgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9SKG1fcFBhbGV0dGVbaW5kZXhdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqcERlc3RQaXhlbCsrID0gaW5kZXg7CisgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IGluZGV4OworICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBpbmRleDsKKyAgICAgICAgfQorICAgICAgICAqcERlc3RQaXhlbCA9IChpbmRleCA8IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNaW4gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPiBtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgICA/IDB4ZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaXBfd2lkdGg7IGkrKykgeworICAgICAgRlhfRFdPUkQgc3JjX3ggPSAoY2xpcF9sZWZ0ICsgaSkgKiBzcmNfd2lkdGggLyBkZXN0X3dpZHRoOworICAgICAgaWYgKGJGbGlwWCkgeworICAgICAgICBzcmNfeCA9IHNyY193aWR0aCAtIHNyY194IC0gMTsKKyAgICAgIH0KKyAgICAgIHNyY194ICU9IHNyY193aWR0aDsKKyAgICAgIHVpbnQ4X3QgaW5kZXggPSBwU3JjTGluZVtzcmNfeF07CisgICAgICBpZiAoZGVzdF9CcHAgPT0gMSkgeworICAgICAgICBkZXN0X3NjYW5baV0gPSBpbmRleDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBkZXN0X3BvcyA9IGkgKiBkZXN0X0JwcDsKKyAgICAgICAgRlhfQVJHQiBhcmdiID0gbV9wUGFsZXR0ZVtpbmRleF07CisgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMV0gPSBGWEFSR0JfRyhhcmdiKTsKKyAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMl0gPSBGWEFSR0JfUihhcmdiKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9IGVsc2UgeworICAgIGludCBsYXN0X3NyY194ID0gLTE7CisgICAgRlhfQVJHQiBsYXN0X2FyZ2I7CisgICAgRlhfRkxPQVQgb3JpZ19Ob3Q4QnBwID0gKEZYX0ZMT0FUKW1fYnBjICogKEZYX0ZMT0FUKW1fbkNvbXBvbmVudHMgLyA4LjBmOworICAgIEZYX0ZMT0FUIHVuaXRfVG84QnBjID0gMjU1LjBmIC8gKCgxIDw8IG1fYnBjKSAtIDEpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSsrKSB7CisgICAgICBpbnQgZGVzdF94ID0gY2xpcF9sZWZ0ICsgaTsKKyAgICAgIEZYX0RXT1JEIHNyY194ID0gKGJGbGlwWCA/IChkZXN0X3dpZHRoIC0gZGVzdF94IC0gMSkgOiBkZXN0X3gpICoKKyAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3Qpc3JjX3dpZHRoIC8gZGVzdF93aWR0aDsKKyAgICAgIHNyY194ICU9IHNyY193aWR0aDsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNQaXhlbCA9IE5VTEw7CisgICAgICBpZiAobV9icGMgJSA4ID09IDApIHsKKyAgICAgICAgcFNyY1BpeGVsID0gcFNyY0xpbmUgKyBzcmNfeCAqIG9yaWdfQnBwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcFNyY1BpeGVsID0gcFNyY0xpbmUgKyAoaW50KShzcmNfeCAqIG9yaWdfTm90OEJwcCk7CisgICAgICB9CisgICAgICB1aW50OF90KiBwRGVzdFBpeGVsID0gZGVzdF9zY2FuICsgaSAqIGRlc3RfQnBwOworICAgICAgRlhfQVJHQiBhcmdiOworICAgICAgaWYgKHNyY194ID09IGxhc3Rfc3JjX3gpIHsKKyAgICAgICAgYXJnYiA9IGxhc3RfYXJnYjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtX3BDb2xvclNwYWNlKSB7CisgICAgICAgICAgdWludDhfdCBjb2xvcls0XTsKKyAgICAgICAgICBpZiAoIW1fYkRlZmF1bHREZWNvZGUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSsrKSB7CisgICAgICAgICAgICAgIGludCBjb2xvcl92YWx1ZSA9CisgICAgICAgICAgICAgICAgICAoaW50KSgobV9wQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4gKworICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCAqIChGWF9GTE9BVClwU3JjUGl4ZWxbaV0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgMC41Zik7CisgICAgICAgICAgICAgIHRlbXBbaV0gPQorICAgICAgICAgICAgICAgICAgY29sb3JfdmFsdWUgPiAyNTUgPyAyNTUgOiAoY29sb3JfdmFsdWUgPCAwID8gMCA6IGNvbG9yX3ZhbHVlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY194ICU9IHNyY193aWR0aDsKLSAgICAgICAgICAgIGludCBkZXN0X3BvcyA9IGkgKiBkZXN0X0JwcDsKLSAgICAgICAgICAgIGlmIChwU3JjTGluZVtzcmNfeCAvIDhdICYgKDEgPDwgKDcgLSBzcmNfeCAlIDgpKSkgewotICAgICAgICAgICAgICAgIGlmIChkZXN0X0JwcCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSAodWludDhfdClzZXRfYXJnYjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc3RfQnBwID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9IEZYQVJHQl9CKHNldF9hcmdiKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMV0gPSBGWEFSR0JfRyhzZXRfYXJnYik7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDJdID0gRlhBUkdCX1Ioc2V0X2FyZ2IpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKShkZXN0X3NjYW4gKyBkZXN0X3BvcykgPSBzZXRfYXJnYjsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5UcmFuc2xhdGVJbWFnZUxpbmUoCisgICAgICAgICAgICAgICAgY29sb3IsIHRlbXAsIDEsIDAsIDAsIG1fYkxvYWRNYXNrICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0dyb3VwRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUsgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobV9icGMgPCA4KSB7CisgICAgICAgICAgICAgIGludCBzcmNfYml0X3BvcyA9IDA7CisgICAgICAgICAgICAgIGlmIChzcmNfeCAlIDIpIHsKKyAgICAgICAgICAgICAgICBzcmNfYml0X3BvcyA9IDQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkrKykgeworICAgICAgICAgICAgICAgIHRlbXBbaV0gPSAodWludDhfdCkoX0dldEJpdHM4KHBTcmNQaXhlbCwgc3JjX2JpdF9wb3MsIG1fYnBjKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0X1RvOEJwYyk7CisgICAgICAgICAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+VHJhbnNsYXRlSW1hZ2VMaW5lKAorICAgICAgICAgICAgICAgICAgY29sb3IsIHRlbXAsIDEsIDAsIDAsIG1fYkxvYWRNYXNrICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fR3JvdXBGYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc3RfQnBwID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9ICh1aW50OF90KXJlc2V0X2FyZ2I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXN0X0JwcCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBGWEFSR0JfQihyZXNldF9hcmdiKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMV0gPSBGWEFSR0JfRyhyZXNldF9hcmdiKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMl0gPSBGWEFSR0JfUihyZXNldF9hcmdiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKikoZGVzdF9zY2FuICsgZGVzdF9wb3MpID0gcmVzZXRfYXJnYjsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPlRyYW5zbGF0ZUltYWdlTGluZSgKKyAgICAgICAgICAgICAgICAgIGNvbG9yLCBwU3JjUGl4ZWwsIDEsIDAsIDAsCisgICAgICAgICAgICAgICAgICBtX2JMb2FkTWFzayAmJiBtX0dyb3VwRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUsgJiYKKyAgICAgICAgICAgICAgICAgICAgICBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPD0gOCkgewotICAgICAgICBpZiAobV9icGMgPCA4KSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2JpdF9wb3MgPSAwOwotICAgICAgICAgICAgZm9yIChGWF9EV09SRCBjb2wgPSAwOyBjb2wgPCBzcmNfd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBjb2xvcl9pbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBjb2xvciA9IDA7IGNvbG9yIDwgbV9uQ29tcG9uZW50czsgY29sb3IgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGRhdGEgPSBfR2V0Qml0czgocFNyY0xpbmUsIHNyY19iaXRfcG9zLCBtX2JwYyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbG9yX2luZGV4IHw9IGRhdGEgPDwgKGNvbG9yICogbV9icGMpOwotICAgICAgICAgICAgICAgICAgICBzcmNfYml0X3BvcyArPSBtX2JwYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wTGluZUJ1Zltjb2xdID0gY29sb3JfaW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU3JjTGluZSA9IG1fcExpbmVCdWY7CisgICAgICAgICAgfQorICAgICAgICAgIGFyZ2IgPSBGWEFSR0JfTUFLRSgweGZmLCBjb2xvclsyXSwgY29sb3JbMV0sIGNvbG9yWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhcmdiID0gRlhBUkdCX01BS0UoMHhmZiwgcFNyY1BpeGVsWzJdLCBwU3JjUGl4ZWxbMV0sIHBTcmNQaXhlbFswXSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fYkNvbG9yS2V5KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaXBfd2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfeCA9IChjbGlwX2xlZnQgKyBpKSAqIHNyY193aWR0aCAvIGRlc3Rfd2lkdGg7Ci0gICAgICAgICAgICAgICAgaWYgKGJGbGlwWCkgewotICAgICAgICAgICAgICAgICAgICBzcmNfeCA9IHNyY193aWR0aCAtIHNyY194IC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3JjX3ggJT0gc3JjX3dpZHRoOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBEZXN0UGl4ZWwgPSBkZXN0X3NjYW4gKyBpICogNDsKLSAgICAgICAgICAgICAgICB1aW50OF90IGluZGV4ID0gcFNyY0xpbmVbc3JjX3hdOwotICAgICAgICAgICAgICAgIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBGWEFSR0JfQihtX3BQYWxldHRlW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBGWEFSR0JfRyhtX3BQYWxldHRlW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBGWEFSR0JfUihtX3BQYWxldHRlW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IGluZGV4OwotICAgICAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBpbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKnBEZXN0UGl4ZWwgPSAoaW5kZXggPCBtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWluIHx8IGluZGV4ID4gbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1heCkgPyAweGZmIDogMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICBpbnQgYWxwaGEgPSAweGZmOworICAgICAgICAgIGlmIChtX25Db21wb25lbnRzID09IDMgJiYgbV9icGMgPT0gOCkgeworICAgICAgICAgICAgYWxwaGEgPSAocFNyY1BpeGVsWzBdIDwgbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1pbiB8fAorICAgICAgICAgICAgICAgICAgICAgcFNyY1BpeGVsWzBdID4gbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1heCB8fAorICAgICAgICAgICAgICAgICAgICAgcFNyY1BpeGVsWzFdIDwgbV9wQ29tcERhdGFbMV0ubV9Db2xvcktleU1pbiB8fAorICAgICAgICAgICAgICAgICAgICAgcFNyY1BpeGVsWzFdID4gbV9wQ29tcERhdGFbMV0ubV9Db2xvcktleU1heCB8fAorICAgICAgICAgICAgICAgICAgICAgcFNyY1BpeGVsWzJdIDwgbV9wQ29tcERhdGFbMl0ubV9Db2xvcktleU1pbiB8fAorICAgICAgICAgICAgICAgICAgICAgcFNyY1BpeGVsWzJdID4gbV9wQ29tcERhdGFbMl0ubV9Db2xvcktleU1heCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gMHhmZgorICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgICAgIH0KKyAgICAgICAgICBhcmdiICY9IDB4ZmZmZmZmOworICAgICAgICAgIGFyZ2IgfD0gYWxwaGEgPDwgMjQ7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICBGWF9EV09SRCBzcmNfeCA9IChjbGlwX2xlZnQgKyBpKSAqIHNyY193aWR0aCAvIGRlc3Rfd2lkdGg7Ci0gICAgICAgICAgICBpZiAoYkZsaXBYKSB7Ci0gICAgICAgICAgICAgICAgc3JjX3ggPSBzcmNfd2lkdGggLSBzcmNfeCAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfeCAlPSBzcmNfd2lkdGg7Ci0gICAgICAgICAgICB1aW50OF90IGluZGV4ID0gcFNyY0xpbmVbc3JjX3hdOwotICAgICAgICAgICAgaWYgKGRlc3RfQnBwID09IDEpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5baV0gPSBpbmRleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGRlc3RfcG9zID0gaSAqIGRlc3RfQnBwOwotICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IG1fcFBhbGV0dGVbaW5kZXhdOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBGWEFSR0JfQihhcmdiKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAxXSA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDJdID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBsYXN0X3NyY194ID0gLTE7Ci0gICAgICAgIEZYX0FSR0IgbGFzdF9hcmdiOwotICAgICAgICBGWF9GTE9BVCBvcmlnX05vdDhCcHAgPSAoRlhfRkxPQVQpbV9icGMgKiAoRlhfRkxPQVQpbV9uQ29tcG9uZW50cyAvIDguMGY7Ci0gICAgICAgIEZYX0ZMT0FUIHVuaXRfVG84QnBjID0gMjU1LjBmIC8gKCgxIDw8IG1fYnBjKSAtIDEpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaXBfd2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgIGludCBkZXN0X3ggPSBjbGlwX2xlZnQgKyBpOwotICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3ggPSAoYkZsaXBYID8gKGRlc3Rfd2lkdGggLSBkZXN0X3ggLSAxKSA6IGRlc3RfeCkgKiAoaW50NjRfdClzcmNfd2lkdGggLyBkZXN0X3dpZHRoOwotICAgICAgICAgICAgc3JjX3ggJT0gc3JjX3dpZHRoOwotICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY1BpeGVsID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChtX2JwYyAlIDggPT0gMCkgewotICAgICAgICAgICAgICAgIHBTcmNQaXhlbCA9IHBTcmNMaW5lICsgc3JjX3ggKiBvcmlnX0JwcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFNyY1BpeGVsID0gcFNyY0xpbmUgKyAoaW50KShzcmNfeCAqIG9yaWdfTm90OEJwcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50OF90KiBwRGVzdFBpeGVsID0gZGVzdF9zY2FuICsgaSAqIGRlc3RfQnBwOwotICAgICAgICAgICAgRlhfQVJHQiBhcmdiOwotICAgICAgICAgICAgaWYgKHNyY194ID09IGxhc3Rfc3JjX3gpIHsKLSAgICAgICAgICAgICAgICBhcmdiID0gbGFzdF9hcmdiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobV9wQ29sb3JTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvbG9yWzRdOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1fYkRlZmF1bHREZWNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcl92YWx1ZSA9IChpbnQpKChtX3BDb21wRGF0YVtpXS5tX0RlY29kZU1pbiArIG1fcENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCAqIChGWF9GTE9BVClwU3JjUGl4ZWxbaV0pICogMjU1LjBmICsgMC41Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXSA9IGNvbG9yX3ZhbHVlID4gMjU1ID8gMjU1IDogKGNvbG9yX3ZhbHVlIDwgMCA/IDAgOiBjb2xvcl92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5UcmFuc2xhdGVJbWFnZUxpbmUoY29sb3IsIHRlbXAsIDEsIDAsIDAsIG1fYkxvYWRNYXNrICYmIG1fR3JvdXBGYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyAmJiBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2JwYyA8IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2JpdF9wb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfeCAlIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2JpdF9wb3MgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldID0gKHVpbnQ4X3QpKF9HZXRCaXRzOChwU3JjUGl4ZWwsIHNyY19iaXRfcG9zLCBtX2JwYykgKiB1bml0X1RvOEJwYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19iaXRfcG9zICs9IG1fYnBjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5UcmFuc2xhdGVJbWFnZUxpbmUoY29sb3IsIHRlbXAsIDEsIDAsIDAsIG1fYkxvYWRNYXNrICYmIG1fR3JvdXBGYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyAmJiBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+VHJhbnNsYXRlSW1hZ2VMaW5lKGNvbG9yLCBwU3JjUGl4ZWwsIDEsIDAsIDAsIG1fYkxvYWRNYXNrICYmIG1fR3JvdXBGYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyAmJiBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcmdiID0gRlhBUkdCX01BS0UoMHhmZiwgY29sb3JbMl0sIGNvbG9yWzFdLCBjb2xvclswXSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJnYiA9IEZYQVJHQl9NQUtFKDB4ZmYsIHBTcmNQaXhlbFsyXSwgcFNyY1BpeGVsWzFdLCBwU3JjUGl4ZWxbMF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9iQ29sb3JLZXkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhID0gMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fbkNvbXBvbmVudHMgPT0gMyAmJiBtX2JwYyA9PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IChwU3JjUGl4ZWxbMF0gPCBtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWluIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMF0gPiBtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWF4IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMV0gPCBtX3BDb21wRGF0YVsxXS5tX0NvbG9yS2V5TWluIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMV0gPiBtX3BDb21wRGF0YVsxXS5tX0NvbG9yS2V5TWF4IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMl0gPCBtX3BDb21wRGF0YVsyXS5tX0NvbG9yS2V5TWluIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMl0gPiBtX3BDb21wRGF0YVsyXS5tX0NvbG9yS2V5TWF4KSA/IDB4ZmYgOiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFyZ2IgJj0gMHhmZmZmZmY7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ2IgfD0gYWxwaGEgPDwgMjQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxhc3Rfc3JjX3ggPSBzcmNfeDsKLSAgICAgICAgICAgICAgICBsYXN0X2FyZ2IgPSBhcmdiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlc3RfQnBwID09IDQpIHsKLSAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilwRGVzdFBpeGVsID0gRlhBUkdCX1RPRElCKGFyZ2IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgICAgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgICAgICpwRGVzdFBpeGVsID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbGFzdF9zcmNfeCA9IHNyY194OworICAgICAgICBsYXN0X2FyZ2IgPSBhcmdiOworICAgICAgfQorICAgICAgaWYgKGRlc3RfQnBwID09IDQpIHsKKyAgICAgICAgKihGWF9EV09SRCopcERlc3RQaXhlbCA9IEZYQVJHQl9UT0RJQihhcmdiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpwRGVzdFBpeGVsKysgPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9HKGFyZ2IpOworICAgICAgICAqcERlc3RQaXhlbCA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgfQogICAgIH0KKyAgfQogfQotdm9pZCBDUERGX0RJQlNvdXJjZTo6U2V0RG93blNhbXBsZVNpemUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGVjb2RlcikgewotICAgICAgICBtX3BEZWNvZGVyLT5Eb3duU2NhbGUoZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOwotICAgICAgICAoKENQREZfRElCU291cmNlKil0aGlzKS0+bV9XaWR0aCA9IG1fcERlY29kZXItPkdldFdpZHRoKCk7Ci0gICAgICAgICgoQ1BERl9ESUJTb3VyY2UqKXRoaXMpLT5tX0hlaWdodCA9IG1fcERlY29kZXItPkdldEhlaWdodCgpOwordm9pZCBDUERGX0RJQlNvdXJjZTo6U2V0RG93blNhbXBsZVNpemUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgY29uc3QgeworICBpZiAobV9wRGVjb2RlcikgeworICAgIG1fcERlY29kZXItPkRvd25TY2FsZShkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7CisgICAgKChDUERGX0RJQlNvdXJjZSopdGhpcyktPm1fV2lkdGggPSBtX3BEZWNvZGVyLT5HZXRXaWR0aCgpOworICAgICgoQ1BERl9ESUJTb3VyY2UqKXRoaXMpLT5tX0hlaWdodCA9IG1fcERlY29kZXItPkdldEhlaWdodCgpOworICB9Cit9Cit2b2lkIENQREZfRElCU291cmNlOjpDbGVhckltYWdlRGF0YSgpIHsKKyAgaWYgKG1fcERlY29kZXIpIHsKKyAgICBtX3BEZWNvZGVyLT5DbGVhckltYWdlRGF0YSgpOworICB9Cit9CitDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGU6OkNQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSgpIHsKKyAgbV9wSW1hZ2VMb2FkZXIgPSBOVUxMOworICBtX3BDYWNoZSA9IE5VTEw7CisgIG1fcEltYWdlID0gTlVMTDsKK30KK0NQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTo6fkNQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSgpIHt9CitGWF9CT09MIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTo6U3RhcnQoCisgICAgQ1BERl9JbWFnZUxvYWRlciogcEltYWdlTG9hZGVyLAorICAgIGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwKKyAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLAorICAgIEZYX0JPT0wgYlN0ZENTLAorICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LAorICAgIEZYX0JPT0wgYkxvYWRNYXNrLAorICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAorICAgIGludDMyX3QgbkRvd25zYW1wbGVXaWR0aCwKKyAgICBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0KSB7CisgIG1fcEltYWdlTG9hZGVyID0gcEltYWdlTG9hZGVyOworICBtX3BDYWNoZSA9IHBDYWNoZTsKKyAgbV9wSW1hZ2UgPSAoQ1BERl9JbWFnZU9iamVjdCopcEltYWdlOworICBtX25Eb3duc2FtcGxlV2lkdGggPSBuRG93bnNhbXBsZVdpZHRoOworICBtX25Eb3duc2FtcGxlSGVpZ2h0ID0gbkRvd25zYW1wbGVIZWlnaHQ7CisgIEZYX0JPT0wgcmV0OworICBpZiAocENhY2hlKSB7CisgICAgcmV0ID0gcENhY2hlLT5TdGFydEdldENhY2hlZEJpdG1hcChwSW1hZ2UtPm1fcEltYWdlLT5HZXRTdHJlYW0oKSwgYlN0ZENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkRvd25zYW1wbGVXaWR0aCwgbV9uRG93bnNhbXBsZUhlaWdodCk7CisgICAgaWYgKHJldCA9PSBGQUxTRSkgeworICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IFRSVUU7CisgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wQml0bWFwID0gcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hCaXRtYXAoKTsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hNYXNrKCk7CisgICAgICBtX3BJbWFnZUxvYWRlci0+bV9NYXR0ZUNvbG9yID0gcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5tX01hdHRlQ29sb3I7CiAgICAgfQotfQotdm9pZCBDUERGX0RJQlNvdXJjZTo6Q2xlYXJJbWFnZURhdGEoKQotewotICAgIGlmIChtX3BEZWNvZGVyKSB7Ci0gICAgICAgIG1fcERlY29kZXItPkNsZWFySW1hZ2VEYXRhKCk7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gcEltYWdlLT5tX3BJbWFnZS0+U3RhcnRMb2FkRElCU291cmNlKHBSZW5kZXJTdGF0dXMtPm1fcEZvcm1SZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclN0YXR1cy0+bV9wUGFnZVJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOworICAgIGlmIChyZXQgPT0gRkFMU0UpIHsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBGQUxTRTsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BCaXRtYXAgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaEJpdG1hcCgpOworICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcE1hc2sgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaE1hc2soKTsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX01hdHRlQ29sb3IgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPm1fTWF0dGVDb2xvcjsKICAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKIH0KLUNQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTo6Q1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlKCkKLXsKLSAgICBtX3BJbWFnZUxvYWRlciA9IE5VTEw7Ci0gICAgbV9wQ2FjaGUgPSBOVUxMOwotICAgIG1fcEltYWdlID0gTlVMTDsKLX0KLUNQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTo6fkNQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSgpCi17Ci19Ci1GWF9CT09MIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTo6U3RhcnQoQ1BERl9JbWFnZUxvYWRlciogcEltYWdlTG9hZGVyLCBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2ssIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGgsIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQpCi17Ci0gICAgbV9wSW1hZ2VMb2FkZXIgPSBwSW1hZ2VMb2FkZXI7Ci0gICAgbV9wQ2FjaGUgPSBwQ2FjaGU7Ci0gICAgbV9wSW1hZ2UgPSAoQ1BERl9JbWFnZU9iamVjdCopcEltYWdlOwotICAgIG1fbkRvd25zYW1wbGVXaWR0aCA9IG5Eb3duc2FtcGxlV2lkdGg7Ci0gICAgbV9uRG93bnNhbXBsZUhlaWdodCA9IG5Eb3duc2FtcGxlSGVpZ2h0OwotICAgIEZYX0JPT0wgcmV0OwotICAgIGlmIChwQ2FjaGUpIHsKLSAgICAgICAgcmV0ID0gcENhY2hlLT5TdGFydEdldENhY2hlZEJpdG1hcChwSW1hZ2UtPm1fcEltYWdlLT5HZXRTdHJlYW0oKSwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBtX25Eb3duc2FtcGxlV2lkdGgsIG1fbkRvd25zYW1wbGVIZWlnaHQpOwotICAgICAgICBpZiAocmV0ID09IEZBTFNFKSB7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gVFJVRTsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BCaXRtYXAgPSBwQ2FjaGUtPm1fcEN1ckltYWdlQ2FjaGUtPkRldGFjaEJpdG1hcCgpOwotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcE1hc2sgPSBwQ2FjaGUtPm1fcEN1ckltYWdlQ2FjaGUtPkRldGFjaE1hc2soKTsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX01hdHRlQ29sb3IgPSBwQ2FjaGUtPm1fcEN1ckltYWdlQ2FjaGUtPm1fTWF0dGVDb2xvcjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IHBJbWFnZS0+bV9wSW1hZ2UtPlN0YXJ0TG9hZERJQlNvdXJjZShwUmVuZGVyU3RhdHVzLT5tX3BGb3JtUmVzb3VyY2UsIHBSZW5kZXJTdGF0dXMtPm1fcFBhZ2VSZXNvdXJjZSwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKLSAgICAgICAgaWYgKHJldCA9PSBGQUxTRSkgewotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IEZBTFNFOwotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcEJpdG1hcCA9IG1fcEltYWdlLT5tX3BJbWFnZS0+RGV0YWNoQml0bWFwKCk7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wTWFzayA9IG1fcEltYWdlLT5tX3BJbWFnZS0+RGV0YWNoTWFzaygpOwotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fTWF0dGVDb2xvciA9IG1fcEltYWdlLT5tX3BJbWFnZS0+bV9NYXR0ZUNvbG9yOwotICAgICAgICB9CitGWF9CT09MIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfQk9PTCByZXQ7CisgIGlmIChtX3BDYWNoZSkgeworICAgIHJldCA9IG1fcENhY2hlLT5Db250aW51ZShwUGF1c2UpOworICAgIGlmIChyZXQgPT0gRkFMU0UpIHsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBUUlVFOworICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcEJpdG1hcCA9IG1fcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hCaXRtYXAoKTsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gbV9wQ2FjaGUtPm1fcEN1ckltYWdlQ2FjaGUtPkRldGFjaE1hc2soKTsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX01hdHRlQ29sb3IgPSBtX3BDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+bV9NYXR0ZUNvbG9yOwogICAgIH0KLSAgICByZXR1cm4gcmV0OworICB9IGVsc2UgeworICAgIHJldCA9IG1fcEltYWdlLT5tX3BJbWFnZS0+Q29udGludWUocFBhdXNlKTsKKyAgICBpZiAocmV0ID09IEZBTFNFKSB7CisgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gRkFMU0U7CisgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wQml0bWFwID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5EZXRhY2hCaXRtYXAoKTsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5EZXRhY2hNYXNrKCk7CisgICAgICBtX3BJbWFnZUxvYWRlci0+bV9NYXR0ZUNvbG9yID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5tX01hdHRlQ29sb3I7CisgICAgfQorICB9CisgIHJldHVybiByZXQ7CiB9Ci1GWF9CT09MIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfQk9PTCByZXQ7Ci0gICAgaWYgKG1fcENhY2hlKSB7Ci0gICAgICAgIHJldCA9IG1fcENhY2hlLT5Db250aW51ZShwUGF1c2UpOwotICAgICAgICBpZiAocmV0ID09IEZBTFNFKSB7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gVFJVRTsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BCaXRtYXAgPSBtX3BDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+RGV0YWNoQml0bWFwKCk7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wTWFzayA9IG1fcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hNYXNrKCk7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9NYXR0ZUNvbG9yID0gbV9wQ2FjaGUtPm1fcEN1ckltYWdlQ2FjaGUtPm1fTWF0dGVDb2xvcjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IG1fcEltYWdlLT5tX3BJbWFnZS0+Q29udGludWUocFBhdXNlKTsKLSAgICAgICAgaWYgKHJldCA9PSBGQUxTRSkgewotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IEZBTFNFOwotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcEJpdG1hcCA9IG1fcEltYWdlLT5tX3BJbWFnZS0+RGV0YWNoQml0bWFwKCk7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wTWFzayA9IG1fcEltYWdlLT5tX3BJbWFnZS0+RGV0YWNoTWFzaygpOwotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fTWF0dGVDb2xvciA9IG1fcEltYWdlLT5tX3BJbWFnZS0+bV9NYXR0ZUNvbG9yOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci1GWF9CT09MIENQREZfSW1hZ2VMb2FkZXI6OkxvYWQoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cykKLXsKLSAgICBpZiAocEltYWdlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocENhY2hlKSB7Ci0gICAgICAgIHBDYWNoZS0+R2V0Q2FjaGVkQml0bWFwKHBJbWFnZS0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpLCBtX3BCaXRtYXAsIG1fcE1hc2ssIG1fTWF0dGVDb2xvciwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBtX25Eb3duc2FtcGxlV2lkdGgsIG1fbkRvd25zYW1wbGVIZWlnaHQpOwotICAgICAgICBtX2JDYWNoZWQgPSBUUlVFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcEJpdG1hcCA9IHBJbWFnZS0+bV9wSW1hZ2UtPkxvYWRESUJTb3VyY2UoJm1fcE1hc2ssICZtX01hdHRlQ29sb3IsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7Ci0gICAgICAgIG1fYkNhY2hlZCA9IEZBTFNFOwotICAgIH0KK0ZYX0JPT0wgQ1BERl9JbWFnZUxvYWRlcjo6TG9hZChjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cykgeworICBpZiAocEltYWdlID09IE5VTEwpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBDYWNoZSkgeworICAgIHBDYWNoZS0+R2V0Q2FjaGVkQml0bWFwKHBJbWFnZS0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpLCBtX3BCaXRtYXAsIG1fcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXR0ZUNvbG9yLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbmRlclN0YXR1cywgbV9uRG93bnNhbXBsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkRvd25zYW1wbGVIZWlnaHQpOworICAgIG1fYkNhY2hlZCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgbV9wQml0bWFwID0gcEltYWdlLT5tX3BJbWFnZS0+TG9hZERJQlNvdXJjZSgmbV9wTWFzaywgJm1fTWF0dGVDb2xvciwgYlN0ZENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7CisgICAgbV9iQ2FjaGVkID0gRkFMU0U7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDUERGX0ltYWdlTG9hZGVyOjpTdGFydExvYWRJbWFnZShjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIHZvaWQqJiBMb2FkSGFuZGxlLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0KQotewotICAgIG1fbkRvd25zYW1wbGVXaWR0aCA9IG5Eb3duc2FtcGxlV2lkdGg7Ci0gICAgbV9uRG93bnNhbXBsZUhlaWdodCA9IG5Eb3duc2FtcGxlSGVpZ2h0OwotICAgIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSogcExvYWRlckhhbmRsZSA9IG5ldyBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGU7Ci0gICAgRlhfQk9PTCByZXQgPSBwTG9hZGVySGFuZGxlLT5TdGFydCh0aGlzLCBwSW1hZ2UsIHBDYWNoZSwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBtX25Eb3duc2FtcGxlV2lkdGgsIG1fbkRvd25zYW1wbGVIZWlnaHQpOwotICAgIExvYWRIYW5kbGUgPSBwTG9hZGVySGFuZGxlOwotICAgIHJldHVybiByZXQ7CitGWF9CT09MIENQREZfSW1hZ2VMb2FkZXI6OlN0YXJ0TG9hZEltYWdlKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIExvYWRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQpIHsKKyAgbV9uRG93bnNhbXBsZVdpZHRoID0gbkRvd25zYW1wbGVXaWR0aDsKKyAgbV9uRG93bnNhbXBsZUhlaWdodCA9IG5Eb3duc2FtcGxlSGVpZ2h0OworICBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUqIHBMb2FkZXJIYW5kbGUgPQorICAgICAgbmV3IENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZTsKKyAgRlhfQk9PTCByZXQgPSBwTG9hZGVySGFuZGxlLT5TdGFydCh0aGlzLCBwSW1hZ2UsIHBDYWNoZSwgYlN0ZENTLCBHcm91cEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRG93bnNhbXBsZVdpZHRoLCBtX25Eb3duc2FtcGxlSGVpZ2h0KTsKKyAgTG9hZEhhbmRsZSA9IHBMb2FkZXJIYW5kbGU7CisgIHJldHVybiByZXQ7CiB9Ci1GWF9CT09MCUNQREZfSW1hZ2VMb2FkZXI6OkNvbnRpbnVlKHZvaWQqIExvYWRIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIHJldHVybiAoKENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSopTG9hZEhhbmRsZSktPkNvbnRpbnVlKHBQYXVzZSk7CitGWF9CT09MIENQREZfSW1hZ2VMb2FkZXI6OkNvbnRpbnVlKHZvaWQqIExvYWRIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIHJldHVybiAoKENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSopTG9hZEhhbmRsZSktPkNvbnRpbnVlKHBQYXVzZSk7CiB9Ci1DUERGX0ltYWdlTG9hZGVyOjp+Q1BERl9JbWFnZUxvYWRlcigpCi17Ci0gICAgaWYgKCFtX2JDYWNoZWQpIHsKLSAgICAgICAgZGVsZXRlIG1fcEJpdG1hcDsKLSAgICAgICAgZGVsZXRlIG1fcE1hc2s7Ci0gICAgfQorQ1BERl9JbWFnZUxvYWRlcjo6fkNQREZfSW1hZ2VMb2FkZXIoKSB7CisgIGlmICghbV9iQ2FjaGVkKSB7CisgICAgZGVsZXRlIG1fcEJpdG1hcDsKKyAgICBkZWxldGUgbV9wTWFzazsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9wYXR0ZXJuLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfcGF0dGVybi5jcHAKaW5kZXggM2VlMjIyMi4uYjY0MDAyYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9wYXR0ZXJuLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3BhdHRlcm4uY3BwCkBAIC0xMCwxMTAxICsxMCwxMjEyIEBACiAjaW5jbHVkZSAiLi4vZnBkZl9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJyZW5kZXJfaW50LmgiCiAjZGVmaW5lIFNIQURJTkdfU1RFUFMgMjU2Ci1zdGF0aWMgdm9pZCBfRHJhd0F4aWFsU2hhZGluZyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTLCBpbnQgYWxwaGEpCi17Ci0gICAgQVNTRVJUKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOwotICAgIENQREZfQXJyYXkqIHBDb29yZHMgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkNvb3JkcyIpKTsKLSAgICBpZiAocENvb3JkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK3N0YXRpYyB2b2lkIF9EcmF3QXhpYWxTaGFkaW5nKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEpIHsKKyAgQVNTRVJUKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOworICBDUERGX0FycmF5KiBwQ29vcmRzID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJDb29yZHMiKSk7CisgIGlmIChwQ29vcmRzID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRkxPQVQgc3RhcnRfeCA9IHBDb29yZHMtPkdldE51bWJlcigwKTsKKyAgRlhfRkxPQVQgc3RhcnRfeSA9IHBDb29yZHMtPkdldE51bWJlcigxKTsKKyAgRlhfRkxPQVQgZW5kX3ggPSBwQ29vcmRzLT5HZXROdW1iZXIoMik7CisgIEZYX0ZMT0FUIGVuZF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDMpOworICBGWF9GTE9BVCB0X21pbiA9IDAsIHRfbWF4ID0gMS4wZjsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEb21haW4iKSk7CisgIGlmIChwQXJyYXkpIHsKKyAgICB0X21pbiA9IHBBcnJheS0+R2V0TnVtYmVyKDApOworICAgIHRfbWF4ID0gcEFycmF5LT5HZXROdW1iZXIoMSk7CisgIH0KKyAgRlhfQk9PTCBiU3RhcnRFeHRlbmQgPSBGQUxTRSwgYkVuZEV4dGVuZCA9IEZBTFNFOworICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkV4dGVuZCIpKTsKKyAgaWYgKHBBcnJheSkgeworICAgIGJTdGFydEV4dGVuZCA9IHBBcnJheS0+R2V0SW50ZWdlcigwKTsKKyAgICBiRW5kRXh0ZW5kID0gcEFycmF5LT5HZXRJbnRlZ2VyKDEpOworICB9CisgIGludCB3aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CisgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgRlhfRkxPQVQgeF9zcGFuID0gZW5kX3ggLSBzdGFydF94OworICBGWF9GTE9BVCB5X3NwYW4gPSBlbmRfeSAtIHN0YXJ0X3k7CisgIEZYX0ZMT0FUIGF4aXNfbGVuX3NxdWFyZSA9CisgICAgICBGWFNZU19NdWwoeF9zcGFuLCB4X3NwYW4pICsgRlhTWVNfTXVsKHlfc3BhbiwgeV9zcGFuKTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7CisgIG1hdHJpeC5TZXRSZXZlcnNlKCpwT2JqZWN0MkJpdG1hcCk7CisgIGludCB0b3RhbF9yZXN1bHRzID0gMDsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBuRnVuY3M7IGorKykgeworICAgIGlmIChwRnVuY3Nbal0pIHsKKyAgICAgIHRvdGFsX3Jlc3VsdHMgKz0gcEZ1bmNzW2pdLT5Db3VudE91dHB1dHMoKTsKICAgICB9Ci0gICAgRlhfRkxPQVQgc3RhcnRfeCA9IHBDb29yZHMtPkdldE51bWJlcigwKTsKLSAgICBGWF9GTE9BVCBzdGFydF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDEpOwotICAgIEZYX0ZMT0FUIGVuZF94ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDIpOwotICAgIEZYX0ZMT0FUIGVuZF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDMpOwotICAgIEZYX0ZMT0FUIHRfbWluID0gMCwgdF9tYXggPSAxLjBmOwotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRG9tYWluIikpOwotICAgIGlmIChwQXJyYXkpIHsKLSAgICAgICAgdF9taW4gPSBwQXJyYXktPkdldE51bWJlcigwKTsKLSAgICAgICAgdF9tYXggPSBwQXJyYXktPkdldE51bWJlcigxKTsKLSAgICB9Ci0gICAgRlhfQk9PTCBiU3RhcnRFeHRlbmQgPSBGQUxTRSwgYkVuZEV4dGVuZCA9IEZBTFNFOwotICAgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRXh0ZW5kIikpOwotICAgIGlmIChwQXJyYXkpIHsKLSAgICAgICAgYlN0YXJ0RXh0ZW5kID0gcEFycmF5LT5HZXRJbnRlZ2VyKDApOwotICAgICAgICBiRW5kRXh0ZW5kID0gcEFycmF5LT5HZXRJbnRlZ2VyKDEpOwotICAgIH0KLSAgICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwotICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICBGWF9GTE9BVCB4X3NwYW4gPSBlbmRfeCAtIHN0YXJ0X3g7Ci0gICAgRlhfRkxPQVQgeV9zcGFuID0gZW5kX3kgLSBzdGFydF95OwotICAgIEZYX0ZMT0FUIGF4aXNfbGVuX3NxdWFyZSA9IEZYU1lTX011bCh4X3NwYW4sIHhfc3BhbikgKyBGWFNZU19NdWwoeV9zcGFuLCB5X3NwYW4pOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIG1hdHJpeC5TZXRSZXZlcnNlKCpwT2JqZWN0MkJpdG1hcCk7Ci0gICAgaW50IHRvdGFsX3Jlc3VsdHMgPSAwOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqICsrKSB7Ci0gICAgICAgIGlmIChwRnVuY3Nbal0pIHsKLSAgICAgICAgICAgIHRvdGFsX3Jlc3VsdHMgKz0gcEZ1bmNzW2pdLT5Db3VudE91dHB1dHMoKTsKKyAgfQorICBpZiAocENTLT5Db3VudENvbXBvbmVudHMoKSA+IHRvdGFsX3Jlc3VsdHMpIHsKKyAgICB0b3RhbF9yZXN1bHRzID0gcENTLT5Db3VudENvbXBvbmVudHMoKTsKKyAgfQorICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOworICBGWF9GTE9BVCogcFJlc3VsdHMgPSByZXN1bHRfYXJyYXk7CisgIEZYU1lTX21lbXNldChwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihGWF9GTE9BVCkpOworICBGWF9EV09SRCByZ2JfYXJyYXlbU0hBRElOR19TVEVQU107CisgIGZvciAoaW50IGkgPSAwOyBpIDwgU0hBRElOR19TVEVQUzsgaSsrKSB7CisgICAgRlhfRkxPQVQgaW5wdXQgPSAodF9tYXggLSB0X21pbikgKiBpIC8gU0hBRElOR19TVEVQUyArIHRfbWluOworICAgIGludCBvZmZzZXQgPSAwOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqKyspIHsKKyAgICAgIGlmIChwRnVuY3Nbal0pIHsKKyAgICAgICAgaW50IG5yZXN1bHRzID0gMDsKKyAgICAgICAgaWYgKHBGdW5jc1tqXS0+Q2FsbCgmaW5wdXQsIDEsIHBSZXN1bHRzICsgb2Zmc2V0LCBucmVzdWx0cykpIHsKKyAgICAgICAgICBvZmZzZXQgKz0gbnJlc3VsdHM7CiAgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKHBDUy0+Q291bnRDb21wb25lbnRzKCkgPiB0b3RhbF9yZXN1bHRzKSB7Ci0gICAgICAgIHRvdGFsX3Jlc3VsdHMgPSBwQ1MtPkNvdW50Q29tcG9uZW50cygpOwotICAgIH0KLSAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOwotICAgIEZYX0ZMT0FUKiBwUmVzdWx0cyA9IHJlc3VsdF9hcnJheTsKLSAgICBGWFNZU19tZW1zZXQocFJlc3VsdHMsIDAsIHRvdGFsX3Jlc3VsdHMgKiBzaXplb2YoRlhfRkxPQVQpKTsKLSAgICBGWF9EV09SRCByZ2JfYXJyYXlbU0hBRElOR19TVEVQU107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSEFESU5HX1NURVBTOyBpICsrKSB7Ci0gICAgICAgIEZYX0ZMT0FUIGlucHV0ID0gKHRfbWF4IC0gdF9taW4pICogaSAvIFNIQURJTkdfU1RFUFMgKyB0X21pbjsKLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqICsrKSB7Ci0gICAgICAgICAgICBpZiAocEZ1bmNzW2pdKSB7Ci0gICAgICAgICAgICAgICAgaW50IG5yZXN1bHRzID0gMDsKLSAgICAgICAgICAgICAgICBpZiAocEZ1bmNzW2pdLT5DYWxsKCZpbnB1dCwgMSwgcFJlc3VsdHMgKyBvZmZzZXQsIG5yZXN1bHRzKSkgewotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbnJlc3VsdHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIEZYX0ZMT0FUIFIgPSAwLjBmLCBHID0gMC4wZiwgQiA9IDAuMGY7CisgICAgcENTLT5HZXRSR0IocFJlc3VsdHMsIFIsIEcsIEIpOworICAgIHJnYl9hcnJheVtpXSA9CisgICAgICAgIEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRShhbHBoYSwgRlhTWVNfcm91bmQoUiAqIDI1NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChHICogMjU1KSwgRlhTWVNfcm91bmQoQiAqIDI1NSkpKTsKKyAgfQorICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgRlhfRFdPUkQqIGRpYl9idWYgPSAoRlhfRFdPUkQqKShwQml0bWFwLT5HZXRCdWZmZXIoKSArIHJvdyAqIHBpdGNoKTsKKyAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0aDsgY29sdW1uKyspIHsKKyAgICAgIEZYX0ZMT0FUIHggPSAoRlhfRkxPQVQpY29sdW1uLCB5ID0gKEZYX0ZMT0FUKXJvdzsKKyAgICAgIG1hdHJpeC5UcmFuc2Zvcm0oeCwgeSk7CisgICAgICBGWF9GTE9BVCBzY2FsZSA9IEZYU1lTX0RpdigKKyAgICAgICAgICBGWFNZU19NdWwoeCAtIHN0YXJ0X3gsIHhfc3BhbikgKyBGWFNZU19NdWwoeSAtIHN0YXJ0X3ksIHlfc3BhbiksCisgICAgICAgICAgYXhpc19sZW5fc3F1YXJlKTsKKyAgICAgIGludCBpbmRleCA9IChpbnQzMl90KShzY2FsZSAqIChTSEFESU5HX1NURVBTIC0gMSkpOworICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBpZiAoIWJTdGFydEV4dGVuZCkgeworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIFIgPSAwLjBmLCBHID0gMC4wZiwgQiA9IDAuMGY7Ci0gICAgICAgIHBDUy0+R2V0UkdCKHBSZXN1bHRzLCBSLCBHLCBCKTsKLSAgICAgICAgcmdiX2FycmF5W2ldID0gRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKGFscGhhLCBGWFNZU19yb3VuZChSICogMjU1KSwgRlhTWVNfcm91bmQoRyAqIDI1NSksIEZYU1lTX3JvdW5kKEIgKiAyNTUpKSk7Ci0gICAgfQotICAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgRlhfRFdPUkQqIGRpYl9idWYgPSAoRlhfRFdPUkQqKShwQml0bWFwLT5HZXRCdWZmZXIoKSArIHJvdyAqIHBpdGNoKTsKLSAgICAgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgd2lkdGg7IGNvbHVtbiArKykgewotICAgICAgICAgICAgRlhfRkxPQVQgeCA9IChGWF9GTE9BVCljb2x1bW4sIHkgPSAoRlhfRkxPQVQpcm93OwotICAgICAgICAgICAgbWF0cml4LlRyYW5zZm9ybSh4LCB5KTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHNjYWxlID0gRlhTWVNfRGl2KEZYU1lTX011bCh4IC0gc3RhcnRfeCwgeF9zcGFuKSArIEZYU1lTX011bCh5IC0gc3RhcnRfeSwgeV9zcGFuKSwgYXhpc19sZW5fc3F1YXJlKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IChpbnQzMl90KShzY2FsZSAqIChTSEFESU5HX1NURVBTIC0gMSkpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIGlmICghYlN0YXJ0RXh0ZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID49IFNIQURJTkdfU1RFUFMpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWJFbmRFeHRlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4ID0gU0hBRElOR19TVEVQUyAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaWJfYnVmW2NvbHVtbl0gPSByZ2JfYXJyYXlbaW5kZXhdOworICAgICAgICBpbmRleCA9IDA7CisgICAgICB9IGVsc2UgaWYgKGluZGV4ID49IFNIQURJTkdfU1RFUFMpIHsKKyAgICAgICAgaWYgKCFiRW5kRXh0ZW5kKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSBTSEFESU5HX1NURVBTIC0gMTsKKyAgICAgIH0KKyAgICAgIGRpYl9idWZbY29sdW1uXSA9IHJnYl9hcnJheVtpbmRleF07CiAgICAgfQorICB9CiB9Ci1zdGF0aWMgdm9pZCBfRHJhd1JhZGlhbFNoYWRpbmcoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTLCBpbnQgYWxwaGEpCi17Ci0gICAgQVNTRVJUKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOwotICAgIENQREZfQXJyYXkqIHBDb29yZHMgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkNvb3JkcyIpKTsKLSAgICBpZiAocENvb3JkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK3N0YXRpYyB2b2lkIF9EcmF3UmFkaWFsU2hhZGluZyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhKSB7CisgIEFTU0VSVChwQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKTsKKyAgQ1BERl9BcnJheSogcENvb3JkcyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQ29vcmRzIikpOworICBpZiAocENvb3JkcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0ZMT0FUIHN0YXJ0X3ggPSBwQ29vcmRzLT5HZXROdW1iZXIoMCk7CisgIEZYX0ZMT0FUIHN0YXJ0X3kgPSBwQ29vcmRzLT5HZXROdW1iZXIoMSk7CisgIEZYX0ZMT0FUIHN0YXJ0X3IgPSBwQ29vcmRzLT5HZXROdW1iZXIoMik7CisgIEZYX0ZMT0FUIGVuZF94ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDMpOworICBGWF9GTE9BVCBlbmRfeSA9IHBDb29yZHMtPkdldE51bWJlcig0KTsKKyAgRlhfRkxPQVQgZW5kX3IgPSBwQ29vcmRzLT5HZXROdW1iZXIoNSk7CisgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OworICBtYXRyaXguU2V0UmV2ZXJzZSgqcE9iamVjdDJCaXRtYXApOworICBGWF9GTE9BVCB0X21pbiA9IDAsIHRfbWF4ID0gMS4wZjsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEb21haW4iKSk7CisgIGlmIChwQXJyYXkpIHsKKyAgICB0X21pbiA9IHBBcnJheS0+R2V0TnVtYmVyKDApOworICAgIHRfbWF4ID0gcEFycmF5LT5HZXROdW1iZXIoMSk7CisgIH0KKyAgRlhfQk9PTCBiU3RhcnRFeHRlbmQgPSBGQUxTRSwgYkVuZEV4dGVuZCA9IEZBTFNFOworICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkV4dGVuZCIpKTsKKyAgaWYgKHBBcnJheSkgeworICAgIGJTdGFydEV4dGVuZCA9IHBBcnJheS0+R2V0SW50ZWdlcigwKTsKKyAgICBiRW5kRXh0ZW5kID0gcEFycmF5LT5HZXRJbnRlZ2VyKDEpOworICB9CisgIGludCB0b3RhbF9yZXN1bHRzID0gMDsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBuRnVuY3M7IGorKykgeworICAgIGlmIChwRnVuY3Nbal0pIHsKKyAgICAgIHRvdGFsX3Jlc3VsdHMgKz0gcEZ1bmNzW2pdLT5Db3VudE91dHB1dHMoKTsKICAgICB9Ci0gICAgRlhfRkxPQVQgc3RhcnRfeCA9IHBDb29yZHMtPkdldE51bWJlcigwKTsKLSAgICBGWF9GTE9BVCBzdGFydF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDEpOwotICAgIEZYX0ZMT0FUIHN0YXJ0X3IgPSBwQ29vcmRzLT5HZXROdW1iZXIoMik7Ci0gICAgRlhfRkxPQVQgZW5kX3ggPSBwQ29vcmRzLT5HZXROdW1iZXIoMyk7Ci0gICAgRlhfRkxPQVQgZW5kX3kgPSBwQ29vcmRzLT5HZXROdW1iZXIoNCk7Ci0gICAgRlhfRkxPQVQgZW5kX3IgPSBwQ29vcmRzLT5HZXROdW1iZXIoNSk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgbWF0cml4LlNldFJldmVyc2UoKnBPYmplY3QyQml0bWFwKTsKLSAgICBGWF9GTE9BVCB0X21pbiA9IDAsIHRfbWF4ID0gMS4wZjsKLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRvbWFpbiIpKTsKLSAgICBpZiAocEFycmF5KSB7Ci0gICAgICAgIHRfbWluID0gcEFycmF5LT5HZXROdW1iZXIoMCk7Ci0gICAgICAgIHRfbWF4ID0gcEFycmF5LT5HZXROdW1iZXIoMSk7Ci0gICAgfQotICAgIEZYX0JPT0wgYlN0YXJ0RXh0ZW5kID0gRkFMU0UsIGJFbmRFeHRlbmQgPSBGQUxTRTsKLSAgICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkV4dGVuZCIpKTsKLSAgICBpZiAocEFycmF5KSB7Ci0gICAgICAgIGJTdGFydEV4dGVuZCA9IHBBcnJheS0+R2V0SW50ZWdlcigwKTsKLSAgICAgICAgYkVuZEV4dGVuZCA9IHBBcnJheS0+R2V0SW50ZWdlcigxKTsKLSAgICB9Ci0gICAgaW50IHRvdGFsX3Jlc3VsdHMgPSAwOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqICsrKSB7Ci0gICAgICAgIGlmIChwRnVuY3Nbal0pIHsKLSAgICAgICAgICAgIHRvdGFsX3Jlc3VsdHMgKz0gcEZ1bmNzW2pdLT5Db3VudE91dHB1dHMoKTsKKyAgfQorICBpZiAocENTLT5Db3VudENvbXBvbmVudHMoKSA+IHRvdGFsX3Jlc3VsdHMpIHsKKyAgICB0b3RhbF9yZXN1bHRzID0gcENTLT5Db3VudENvbXBvbmVudHMoKTsKKyAgfQorICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOworICBGWF9GTE9BVCogcFJlc3VsdHMgPSByZXN1bHRfYXJyYXk7CisgIEZYU1lTX21lbXNldChwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihGWF9GTE9BVCkpOworICBGWF9EV09SRCByZ2JfYXJyYXlbU0hBRElOR19TVEVQU107CisgIGZvciAoaW50IGkgPSAwOyBpIDwgU0hBRElOR19TVEVQUzsgaSsrKSB7CisgICAgRlhfRkxPQVQgaW5wdXQgPSAodF9tYXggLSB0X21pbikgKiBpIC8gU0hBRElOR19TVEVQUyArIHRfbWluOworICAgIGludCBvZmZzZXQgPSAwOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqKyspIHsKKyAgICAgIGlmIChwRnVuY3Nbal0pIHsKKyAgICAgICAgaW50IG5yZXN1bHRzOworICAgICAgICBpZiAocEZ1bmNzW2pdLT5DYWxsKCZpbnB1dCwgMSwgcFJlc3VsdHMgKyBvZmZzZXQsIG5yZXN1bHRzKSkgeworICAgICAgICAgIG9mZnNldCArPSBucmVzdWx0czsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBpZiAocENTLT5Db3VudENvbXBvbmVudHMoKSA+IHRvdGFsX3Jlc3VsdHMpIHsKLSAgICAgICAgdG90YWxfcmVzdWx0cyA9IHBDUy0+Q291bnRDb21wb25lbnRzKCk7CisgICAgRlhfRkxPQVQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKKyAgICBwQ1MtPkdldFJHQihwUmVzdWx0cywgUiwgRywgQik7CisgICAgcmdiX2FycmF5W2ldID0KKyAgICAgICAgRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKGFscGhhLCBGWFNZU19yb3VuZChSICogMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKEcgKiAyNTUpLCBGWFNZU19yb3VuZChCICogMjU1KSkpOworICB9CisgIEZYX0ZMT0FUIGEgPSBGWFNZU19NdWwoc3RhcnRfeCAtIGVuZF94LCBzdGFydF94IC0gZW5kX3gpICsKKyAgICAgICAgICAgICAgIEZYU1lTX011bChzdGFydF95IC0gZW5kX3ksIHN0YXJ0X3kgLSBlbmRfeSkgLQorICAgICAgICAgICAgICAgRlhTWVNfTXVsKHN0YXJ0X3IgLSBlbmRfciwgc3RhcnRfciAtIGVuZF9yKTsKKyAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKKyAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOworICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOworICBGWF9CT09MIGJEZWNyZWFzaW5nID0gRkFMU0U7CisgIGlmIChzdGFydF9yID4gZW5kX3IpIHsKKyAgICBpbnQgbGVuZ3RoID0gKGludClGWFNZU19zcXJ0KChGWFNZU19NdWwoc3RhcnRfeCAtIGVuZF94LCBzdGFydF94IC0gZW5kX3gpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19NdWwoc3RhcnRfeSAtIGVuZF95LCBzdGFydF95IC0gZW5kX3kpKSk7CisgICAgaWYgKGxlbmd0aCA8IHN0YXJ0X3IgLSBlbmRfcikgeworICAgICAgYkRlY3JlYXNpbmcgPSBUUlVFOwogICAgIH0KLSAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOwotICAgIEZYX0ZMT0FUKiBwUmVzdWx0cyA9IHJlc3VsdF9hcnJheTsKLSAgICBGWFNZU19tZW1zZXQocFJlc3VsdHMsIDAsIHRvdGFsX3Jlc3VsdHMgKiBzaXplb2YoRlhfRkxPQVQpKTsKLSAgICBGWF9EV09SRCByZ2JfYXJyYXlbU0hBRElOR19TVEVQU107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSEFESU5HX1NURVBTOyBpICsrKSB7Ci0gICAgICAgIEZYX0ZMT0FUIGlucHV0ID0gKHRfbWF4IC0gdF9taW4pICogaSAvIFNIQURJTkdfU1RFUFMgKyB0X21pbjsKLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqICsrKSB7Ci0gICAgICAgICAgICBpZiAocEZ1bmNzW2pdKSB7Ci0gICAgICAgICAgICAgICAgaW50IG5yZXN1bHRzOwotICAgICAgICAgICAgICAgIGlmIChwRnVuY3Nbal0tPkNhbGwoJmlucHV0LCAxLCBwUmVzdWx0cyArIG9mZnNldCwgbnJlc3VsdHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBucmVzdWx0czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgIH0KKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgIEZYX0RXT1JEKiBkaWJfYnVmID0gKEZYX0RXT1JEKikocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyByb3cgKiBwaXRjaCk7CisgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgd2lkdGg7IGNvbHVtbisrKSB7CisgICAgICBGWF9GTE9BVCB4ID0gKEZYX0ZMT0FUKWNvbHVtbiwgeSA9IChGWF9GTE9BVClyb3c7CisgICAgICBtYXRyaXguVHJhbnNmb3JtKHgsIHkpOworICAgICAgRlhfRkxPQVQgYiA9IC0yICogKEZYU1lTX011bCh4IC0gc3RhcnRfeCwgZW5kX3ggLSBzdGFydF94KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKHkgLSBzdGFydF95LCBlbmRfeSAtIHN0YXJ0X3kpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19NdWwoc3RhcnRfciwgZW5kX3IgLSBzdGFydF9yKSk7CisgICAgICBGWF9GTE9BVCBjID0gRlhTWVNfTXVsKHggLSBzdGFydF94LCB4IC0gc3RhcnRfeCkgKworICAgICAgICAgICAgICAgICAgIEZYU1lTX011bCh5IC0gc3RhcnRfeSwgeSAtIHN0YXJ0X3kpIC0KKyAgICAgICAgICAgICAgICAgICBGWFNZU19NdWwoc3RhcnRfciwgc3RhcnRfcik7CisgICAgICBGWF9GTE9BVCBzOworICAgICAgaWYgKGEgPT0gMCkgeworICAgICAgICBzID0gRlhTWVNfRGl2KC1jLCBiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYX0ZMT0FUIGIyXzRhYyA9IEZYU1lTX011bChiLCBiKSAtIDQgKiBGWFNZU19NdWwoYSwgYyk7CisgICAgICAgIGlmIChiMl80YWMgPCAwKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgRlhfRkxPQVQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKLSAgICAgICAgcENTLT5HZXRSR0IocFJlc3VsdHMsIFIsIEcsIEIpOwotICAgICAgICByZ2JfYXJyYXlbaV0gPSBGWEFSR0JfVE9ESUIoRlhBUkdCX01BS0UoYWxwaGEsIEZYU1lTX3JvdW5kKFIgKiAyNTUpLCBGWFNZU19yb3VuZChHICogMjU1KSwgRlhTWVNfcm91bmQoQiAqIDI1NSkpKTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgYSA9IEZYU1lTX011bChzdGFydF94IC0gZW5kX3gsIHN0YXJ0X3ggLSBlbmRfeCkgKwotICAgICAgICAgICAgICAgICBGWFNZU19NdWwoc3RhcnRfeSAtIGVuZF95LCBzdGFydF95IC0gZW5kX3kpIC0gRlhTWVNfTXVsKHN0YXJ0X3IgLSBlbmRfciwgc3RhcnRfciAtIGVuZF9yKTsKLSAgICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwotICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwotICAgIEZYX0JPT0wgYkRlY3JlYXNpbmcgPSBGQUxTRTsKLSAgICBpZiAoc3RhcnRfciA+IGVuZF9yKSB7Ci0gICAgICAgIGludCBsZW5ndGggPSAoaW50KUZYU1lTX3NxcnQoKEZYU1lTX011bChzdGFydF94IC0gZW5kX3gsIHN0YXJ0X3ggLSBlbmRfeCkgKyBGWFNZU19NdWwoc3RhcnRfeSAtIGVuZF95LCBzdGFydF95IC0gZW5kX3kpKSk7Ci0gICAgICAgIGlmIChsZW5ndGggPCBzdGFydF9yIC0gZW5kX3IpIHsKLSAgICAgICAgICAgIGJEZWNyZWFzaW5nID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICBGWF9EV09SRCogZGliX2J1ZiA9IChGWF9EV09SRCopKHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgcm93ICogcGl0Y2gpOwotICAgICAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0aDsgY29sdW1uICsrKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCB4ID0gKEZYX0ZMT0FUKWNvbHVtbiwgeSA9IChGWF9GTE9BVClyb3c7Ci0gICAgICAgICAgICBtYXRyaXguVHJhbnNmb3JtKHgsIHkpOwotICAgICAgICAgICAgRlhfRkxPQVQgYiA9IC0yICogKEZYU1lTX011bCh4IC0gc3RhcnRfeCwgZW5kX3ggLSBzdGFydF94KSArIEZYU1lTX011bCh5IC0gc3RhcnRfeSwgZW5kX3kgLSBzdGFydF95KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKHN0YXJ0X3IsIGVuZF9yIC0gc3RhcnRfcikpOwotICAgICAgICAgICAgRlhfRkxPQVQgYyA9IEZYU1lTX011bCh4IC0gc3RhcnRfeCwgeCAtIHN0YXJ0X3gpICsgRlhTWVNfTXVsKHkgLSBzdGFydF95LCB5IC0gc3RhcnRfeSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX011bChzdGFydF9yLCBzdGFydF9yKTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHM7Ci0gICAgICAgICAgICBpZiAoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcyA9IEZYU1lTX0RpdigtYywgYik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGIyXzRhYyA9IEZYU1lTX011bChiLCBiKSAtIDQgKiBGWFNZU19NdWwoYSwgYyk7Ci0gICAgICAgICAgICAgICAgaWYgKGIyXzRhYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJvb3QgPSBGWFNZU19zcXJ0KGIyXzRhYyk7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgczEsIHMyOwotICAgICAgICAgICAgICAgIGlmIChhID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzMSA9IEZYU1lTX0RpdigtYiAtIHJvb3QsIDIgKiBhKTsKLSAgICAgICAgICAgICAgICAgICAgczIgPSBGWFNZU19EaXYoLWIgKyByb290LCAyICogYSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgczIgPSBGWFNZU19EaXYoLWIgLSByb290LCAyICogYSk7Ci0gICAgICAgICAgICAgICAgICAgIHMxID0gRlhTWVNfRGl2KC1iICsgcm9vdCwgMiAqIGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYkRlY3JlYXNpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMxID49IDAgfHwgYlN0YXJ0RXh0ZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gczE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gczI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoczIgPD0gMS4wZiB8fCBiRW5kRXh0ZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gczI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gczE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChzdGFydF9yICsgcyAqIChlbmRfciAtIHN0YXJ0X3IpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGluZGV4ID0gKGludDMyX3QpKHMgKiAoU0hBRElOR19TVEVQUyAtIDEpKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoIWJTdGFydEV4dGVuZCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluZGV4ID49IFNIQURJTkdfU1RFUFMpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWJFbmRFeHRlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4ID0gU0hBRElOR19TVEVQUyAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaWJfYnVmW2NvbHVtbl0gPSByZ2JfYXJyYXlbaW5kZXhdOwotICAgICAgICB9Ci0gICAgfQotfQotc3RhdGljIHZvaWQgX0RyYXdGdW5jU2hhZGluZyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUywgaW50IGFscGhhKQotewotICAgIEFTU0VSVChwQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKTsKLSAgICBDUERGX0FycmF5KiBwRG9tYWluID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEb21haW4iKSk7Ci0gICAgRlhfRkxPQVQgeG1pbiA9IDAsIHltaW4gPSAwLCB4bWF4ID0gMS4wZiwgeW1heCA9IDEuMGY7Ci0gICAgaWYgKHBEb21haW4pIHsKLSAgICAgICAgeG1pbiA9IHBEb21haW4tPkdldE51bWJlcigwKTsKLSAgICAgICAgeG1heCA9IHBEb21haW4tPkdldE51bWJlcigxKTsKLSAgICAgICAgeW1pbiA9IHBEb21haW4tPkdldE51bWJlcigyKTsKLSAgICAgICAgeW1heCA9IHBEb21haW4tPkdldE51bWJlcigzKTsKLSAgICB9Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtdERvbWFpbjJUYXJnZXQgPSBwRGljdC0+R2V0TWF0cml4KEZYX0JTVFJDKCJNYXRyaXgiKSk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgsIHJldmVyc2VfbWF0cml4OwotICAgIG1hdHJpeC5TZXRSZXZlcnNlKCpwT2JqZWN0MkJpdG1hcCk7Ci0gICAgcmV2ZXJzZV9tYXRyaXguU2V0UmV2ZXJzZShtdERvbWFpbjJUYXJnZXQpOwotICAgIG1hdHJpeC5Db25jYXQocmV2ZXJzZV9tYXRyaXgpOwotICAgIGludCB3aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7Ci0gICAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOwotICAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgaW50IHRvdGFsX3Jlc3VsdHMgPSAwOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqICsrKSB7Ci0gICAgICAgIGlmIChwRnVuY3Nbal0pIHsKLSAgICAgICAgICAgIHRvdGFsX3Jlc3VsdHMgKz0gcEZ1bmNzW2pdLT5Db3VudE91dHB1dHMoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocENTLT5Db3VudENvbXBvbmVudHMoKSA+IHRvdGFsX3Jlc3VsdHMpIHsKLSAgICAgICAgdG90YWxfcmVzdWx0cyA9IHBDUy0+Q291bnRDb21wb25lbnRzKCk7Ci0gICAgfQotICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRfYXJyYXkodG90YWxfcmVzdWx0cyk7Ci0gICAgRlhfRkxPQVQqIHBSZXN1bHRzID0gcmVzdWx0X2FycmF5OwotICAgIEZYU1lTX21lbXNldChwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihGWF9GTE9BVCkpOwotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIEZYX0RXT1JEKiBkaWJfYnVmID0gKEZYX0RXT1JEKikocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyByb3cgKiBwaXRjaCk7Ci0gICAgICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHdpZHRoOyBjb2x1bW4gKyspIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHggPSAoRlhfRkxPQVQpY29sdW1uLCB5ID0gKEZYX0ZMT0FUKXJvdzsKLSAgICAgICAgICAgIG1hdHJpeC5UcmFuc2Zvcm0oeCwgeSk7Ci0gICAgICAgICAgICBpZiAoeCA8IHhtaW4gfHwgeCA+IHhtYXggfHwgeSA8IHltaW4gfHwgeSA+IHltYXgpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGlucHV0WzJdOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgICAgICBpbnB1dFswXSA9IHg7Ci0gICAgICAgICAgICBpbnB1dFsxXSA9IHk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5GdW5jczsgaiArKykgewotICAgICAgICAgICAgICAgIGlmIChwRnVuY3Nbal0pIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5yZXN1bHRzOwotICAgICAgICAgICAgICAgICAgICBpZiAocEZ1bmNzW2pdLT5DYWxsKGlucHV0LCAyLCBwUmVzdWx0cyArIG9mZnNldCwgbnJlc3VsdHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbnJlc3VsdHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCBSID0gMC4wZiwgRyA9IDAuMGYsIEIgPSAwLjBmOwotICAgICAgICAgICAgcENTLT5HZXRSR0IocFJlc3VsdHMsIFIsIEcsIEIpOwotICAgICAgICAgICAgZGliX2J1Zltjb2x1bW5dID0gRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKGFscGhhLCAoaW50MzJfdCkoUiAqIDI1NSksIChpbnQzMl90KShHICogMjU1KSwgKGludDMyX3QpKEIgKiAyNTUpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1GWF9CT09MIF9HZXRTY2FubGluZUludGVyc2VjdChpbnQgeSwgRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0ZMT0FUJiB4KQotewotICAgIGlmICh5MSA9PSB5MikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICh5MSA8IHkyKSB7Ci0gICAgICAgIGlmICh5IDwgeTEgfHwgeSA+IHkyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoeSA8IHkyIHx8IHkgPiB5MSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIHggPSB4MSArIEZYU1lTX011bERpdih4MiAtIHgxLCB5IC0geTEsIHkyIC0geTEpOwotICAgIHJldHVybiBUUlVFOwotfQotc3RhdGljIHZvaWQgX0RyYXdHb3VyYXVkKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGFscGhhLCBDUERGX01lc2hWZXJ0ZXggdHJpYW5nbGVbM10pCi17Ci0gICAgRlhfRkxPQVQgbWluX3kgPSB0cmlhbmdsZVswXS55LCBtYXhfeSA9IHRyaWFuZ2xlWzBdLnk7Ci0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCAzOyBpICsrKSB7Ci0gICAgICAgIGlmIChtaW5feSA+IHRyaWFuZ2xlW2ldLnkpIHsKLSAgICAgICAgICAgIG1pbl95ID0gdHJpYW5nbGVbaV0ueTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4X3kgPCB0cmlhbmdsZVtpXS55KSB7Ci0gICAgICAgICAgICBtYXhfeSA9IHRyaWFuZ2xlW2ldLnk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1pbl95ID09IG1heF95KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IG1pbl95aSA9IChpbnQpRlhTWVNfZmxvb3IobWluX3kpLCBtYXhfeWkgPSAoaW50KUZYU1lTX2NlaWwobWF4X3kpOwotICAgIGlmIChtaW5feWkgPCAwKSB7Ci0gICAgICAgIG1pbl95aSA9IDA7Ci0gICAgfQotICAgIGlmIChtYXhfeWkgPj0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgbWF4X3lpID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSAxOwotICAgIH0KLSAgICBmb3IgKGludCB5ID0gbWluX3lpOyB5IDw9IG1heF95aTsgeSArKykgewotICAgICAgICBpbnQgbkludGVyc2VjdHMgPSAwOwotICAgICAgICBGWF9GTE9BVCBpbnRlcl94WzNdLCByWzNdLCBnWzNdLCBiWzNdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfTWVzaFZlcnRleCYgdmVydGV4MSA9IHRyaWFuZ2xlW2ldOwotICAgICAgICAgICAgQ1BERl9NZXNoVmVydGV4JiB2ZXJ0ZXgyID0gdHJpYW5nbGVbKGkgKyAxKSAlIDNdOwotICAgICAgICAgICAgRlhfQk9PTCBiSW50ZXJzZWN0ID0gX0dldFNjYW5saW5lSW50ZXJzZWN0KHksIHZlcnRleDEueCwgdmVydGV4MS55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4Mi54LCB2ZXJ0ZXgyLnksIGludGVyX3hbbkludGVyc2VjdHNdKTsKLSAgICAgICAgICAgIGlmICghYkludGVyc2VjdCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcltuSW50ZXJzZWN0c10gPSB2ZXJ0ZXgxLnIgKyBGWFNZU19NdWxEaXYodmVydGV4Mi5yIC0gdmVydGV4MS5yLCB5IC0gdmVydGV4MS55LCB2ZXJ0ZXgyLnkgLSB2ZXJ0ZXgxLnkpOwotICAgICAgICAgICAgZ1tuSW50ZXJzZWN0c10gPSB2ZXJ0ZXgxLmcgKyBGWFNZU19NdWxEaXYodmVydGV4Mi5nIC0gdmVydGV4MS5nLCB5IC0gdmVydGV4MS55LCB2ZXJ0ZXgyLnkgLSB2ZXJ0ZXgxLnkpOwotICAgICAgICAgICAgYltuSW50ZXJzZWN0c10gPSB2ZXJ0ZXgxLmIgKyBGWFNZU19NdWxEaXYodmVydGV4Mi5iIC0gdmVydGV4MS5iLCB5IC0gdmVydGV4MS55LCB2ZXJ0ZXgyLnkgLSB2ZXJ0ZXgxLnkpOwotICAgICAgICAgICAgbkludGVyc2VjdHMgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5JbnRlcnNlY3RzICE9IDIpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBtaW5feCwgbWF4X3gsIHN0YXJ0X2luZGV4LCBlbmRfaW5kZXg7Ci0gICAgICAgIGlmIChpbnRlcl94WzBdIDwgaW50ZXJfeFsxXSkgewotICAgICAgICAgICAgbWluX3ggPSAoaW50KUZYU1lTX2Zsb29yKGludGVyX3hbMF0pOwotICAgICAgICAgICAgbWF4X3ggPSAoaW50KUZYU1lTX2NlaWwoaW50ZXJfeFsxXSk7Ci0gICAgICAgICAgICBzdGFydF9pbmRleCA9IDA7Ci0gICAgICAgICAgICBlbmRfaW5kZXggPSAxOworICAgICAgICBGWF9GTE9BVCByb290ID0gRlhTWVNfc3FydChiMl80YWMpOworICAgICAgICBGWF9GTE9BVCBzMSwgczI7CisgICAgICAgIGlmIChhID4gMCkgeworICAgICAgICAgIHMxID0gRlhTWVNfRGl2KC1iIC0gcm9vdCwgMiAqIGEpOworICAgICAgICAgIHMyID0gRlhTWVNfRGl2KC1iICsgcm9vdCwgMiAqIGEpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWluX3ggPSAoaW50KUZYU1lTX2Zsb29yKGludGVyX3hbMV0pOwotICAgICAgICAgICAgbWF4X3ggPSAoaW50KUZYU1lTX2NlaWwoaW50ZXJfeFswXSk7Ci0gICAgICAgICAgICBzdGFydF9pbmRleCA9IDE7Ci0gICAgICAgICAgICBlbmRfaW5kZXggPSAwOworICAgICAgICAgIHMyID0gRlhTWVNfRGl2KC1iIC0gcm9vdCwgMiAqIGEpOworICAgICAgICAgIHMxID0gRlhTWVNfRGl2KC1iICsgcm9vdCwgMiAqIGEpOwogICAgICAgICB9Ci0gICAgICAgIGludCBzdGFydF94ID0gbWluX3gsIGVuZF94ID0gbWF4X3g7Ci0gICAgICAgIGlmIChzdGFydF94IDwgMCkgewotICAgICAgICAgICAgc3RhcnRfeCA9IDA7CisgICAgICAgIGlmIChiRGVjcmVhc2luZykgeworICAgICAgICAgIGlmIChzMSA+PSAwIHx8IGJTdGFydEV4dGVuZCkgeworICAgICAgICAgICAgcyA9IHMxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzID0gczI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChzMiA8PSAxLjBmIHx8IGJFbmRFeHRlbmQpIHsKKyAgICAgICAgICAgIHMgPSBzMjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcyA9IHMxOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoZW5kX3ggPiBwQml0bWFwLT5HZXRXaWR0aCgpKSB7Ci0gICAgICAgICAgICBlbmRfeCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CisgICAgICAgIGlmICgoc3RhcnRfciArIHMgKiAoZW5kX3IgLSBzdGFydF9yKSkgPCAwKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgdWludDhfdCogZGliX2J1ZiA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgeSAqIHBCaXRtYXAtPkdldFBpdGNoKCkgKyBzdGFydF94ICogNDsKLSAgICAgICAgRlhfRkxPQVQgcl91bml0ID0gKHJbZW5kX2luZGV4XSAtIHJbc3RhcnRfaW5kZXhdKSAvIChtYXhfeCAtIG1pbl94KTsKLSAgICAgICAgRlhfRkxPQVQgZ191bml0ID0gKGdbZW5kX2luZGV4XSAtIGdbc3RhcnRfaW5kZXhdKSAvIChtYXhfeCAtIG1pbl94KTsKLSAgICAgICAgRlhfRkxPQVQgYl91bml0ID0gKGJbZW5kX2luZGV4XSAtIGJbc3RhcnRfaW5kZXhdKSAvIChtYXhfeCAtIG1pbl94KTsKLSAgICAgICAgRlhfRkxPQVQgUiA9IHJbc3RhcnRfaW5kZXhdICsgKHN0YXJ0X3ggLSBtaW5feCkgKiByX3VuaXQ7Ci0gICAgICAgIEZYX0ZMT0FUIEcgPSBnW3N0YXJ0X2luZGV4XSArIChzdGFydF94IC0gbWluX3gpICogZ191bml0OwotICAgICAgICBGWF9GTE9BVCBCID0gYltzdGFydF9pbmRleF0gKyAoc3RhcnRfeCAtIG1pbl94KSAqIGJfdW5pdDsKLSAgICAgICAgZm9yIChpbnQgeCA9IHN0YXJ0X3g7IHggPCBlbmRfeDsgeCArKykgewotICAgICAgICAgICAgUiArPSByX3VuaXQ7Ci0gICAgICAgICAgICBHICs9IGdfdW5pdDsKLSAgICAgICAgICAgIEIgKz0gYl91bml0OwotICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkaWJfYnVmLCBGWEFSR0JfTUFLRShhbHBoYSwgKGludDMyX3QpKFIgKiAyNTUpLCAoaW50MzJfdCkoRyAqIDI1NSksIChpbnQzMl90KShCICogMjU1KSkpOwotICAgICAgICAgICAgZGliX2J1ZiArPSA0OworICAgICAgfQorICAgICAgaW50IGluZGV4ID0gKGludDMyX3QpKHMgKiAoU0hBRElOR19TVEVQUyAtIDEpKTsKKyAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgaWYgKCFiU3RhcnRFeHRlbmQpIHsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgICBpbmRleCA9IDA7CisgICAgICB9CisgICAgICBpZiAoaW5kZXggPj0gU0hBRElOR19TVEVQUykgeworICAgICAgICBpZiAoIWJFbmRFeHRlbmQpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IFNIQURJTkdfU1RFUFMgLSAxOworICAgICAgfQorICAgICAgZGliX2J1Zltjb2x1bW5dID0gcmdiX2FycmF5W2luZGV4XTsKICAgICB9CisgIH0KIH0KLXN0YXRpYyB2b2lkIF9EcmF3RnJlZUdvdXJhdWRTaGFkaW5nKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsIGludCBuRnVuY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUywgaW50IGFscGhhKQotewotICAgIEFTU0VSVChwQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKTsKLSAgICBpZiAocFNoYWRpbmdTdHJlYW0tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybjsKK3N0YXRpYyB2b2lkIF9EcmF3RnVuY1NoYWRpbmcoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSkgeworICBBU1NFUlQocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7CisgIENQREZfQXJyYXkqIHBEb21haW4gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRvbWFpbiIpKTsKKyAgRlhfRkxPQVQgeG1pbiA9IDAsIHltaW4gPSAwLCB4bWF4ID0gMS4wZiwgeW1heCA9IDEuMGY7CisgIGlmIChwRG9tYWluKSB7CisgICAgeG1pbiA9IHBEb21haW4tPkdldE51bWJlcigwKTsKKyAgICB4bWF4ID0gcERvbWFpbi0+R2V0TnVtYmVyKDEpOworICAgIHltaW4gPSBwRG9tYWluLT5HZXROdW1iZXIoMik7CisgICAgeW1heCA9IHBEb21haW4tPkdldE51bWJlcigzKTsKKyAgfQorICBDRlhfQWZmaW5lTWF0cml4IG10RG9tYWluMlRhcmdldCA9IHBEaWN0LT5HZXRNYXRyaXgoRlhfQlNUUkMoIk1hdHJpeCIpKTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgsIHJldmVyc2VfbWF0cml4OworICBtYXRyaXguU2V0UmV2ZXJzZSgqcE9iamVjdDJCaXRtYXApOworICByZXZlcnNlX21hdHJpeC5TZXRSZXZlcnNlKG10RG9tYWluMlRhcmdldCk7CisgIG1hdHJpeC5Db25jYXQocmV2ZXJzZV9tYXRyaXgpOworICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOworICBpbnQgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CisgIGludCB0b3RhbF9yZXN1bHRzID0gMDsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBuRnVuY3M7IGorKykgeworICAgIGlmIChwRnVuY3Nbal0pIHsKKyAgICAgIHRvdGFsX3Jlc3VsdHMgKz0gcEZ1bmNzW2pdLT5Db3VudE91dHB1dHMoKTsKICAgICB9Ci0gICAgQ1BERl9NZXNoU3RyZWFtIHN0cmVhbTsKLSAgICBpZiAoIXN0cmVhbS5Mb2FkKHBTaGFkaW5nU3RyZWFtLCBwRnVuY3MsIG5GdW5jcywgcENTKSkgewotICAgICAgICByZXR1cm47CisgIH0KKyAgaWYgKHBDUy0+Q291bnRDb21wb25lbnRzKCkgPiB0b3RhbF9yZXN1bHRzKSB7CisgICAgdG90YWxfcmVzdWx0cyA9IHBDUy0+Q291bnRDb21wb25lbnRzKCk7CisgIH0KKyAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdF9hcnJheSh0b3RhbF9yZXN1bHRzKTsKKyAgRlhfRkxPQVQqIHBSZXN1bHRzID0gcmVzdWx0X2FycmF5OworICBGWFNZU19tZW1zZXQocFJlc3VsdHMsIDAsIHRvdGFsX3Jlc3VsdHMgKiBzaXplb2YoRlhfRkxPQVQpKTsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgIEZYX0RXT1JEKiBkaWJfYnVmID0gKEZYX0RXT1JEKikocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyByb3cgKiBwaXRjaCk7CisgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgd2lkdGg7IGNvbHVtbisrKSB7CisgICAgICBGWF9GTE9BVCB4ID0gKEZYX0ZMT0FUKWNvbHVtbiwgeSA9IChGWF9GTE9BVClyb3c7CisgICAgICBtYXRyaXguVHJhbnNmb3JtKHgsIHkpOworICAgICAgaWYgKHggPCB4bWluIHx8IHggPiB4bWF4IHx8IHkgPCB5bWluIHx8IHkgPiB5bWF4KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgRlhfRkxPQVQgaW5wdXRbMl07CisgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgIGlucHV0WzBdID0geDsKKyAgICAgIGlucHV0WzFdID0geTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqKyspIHsKKyAgICAgICAgaWYgKHBGdW5jc1tqXSkgeworICAgICAgICAgIGludCBucmVzdWx0czsKKyAgICAgICAgICBpZiAocEZ1bmNzW2pdLT5DYWxsKGlucHV0LCAyLCBwUmVzdWx0cyArIG9mZnNldCwgbnJlc3VsdHMpKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gbnJlc3VsdHM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBGWF9GTE9BVCBSID0gMC4wZiwgRyA9IDAuMGYsIEIgPSAwLjBmOworICAgICAgcENTLT5HZXRSR0IocFJlc3VsdHMsIFIsIEcsIEIpOworICAgICAgZGliX2J1Zltjb2x1bW5dID0gRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKAorICAgICAgICAgIGFscGhhLCAoaW50MzJfdCkoUiAqIDI1NSksIChpbnQzMl90KShHICogMjU1KSwgKGludDMyX3QpKEIgKiAyNTUpKSk7CisgICAgfQorICB9Cit9CitGWF9CT09MIF9HZXRTY2FubGluZUludGVyc2VjdChpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHgpIHsKKyAgaWYgKHkxID09IHkyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICh5MSA8IHkyKSB7CisgICAgaWYgKHkgPCB5MSB8fCB5ID4geTIpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHkgPCB5MiB8fCB5ID4geTEpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgeCA9IHgxICsgRlhTWVNfTXVsRGl2KHgyIC0geDEsIHkgLSB5MSwgeTIgLSB5MSk7CisgIHJldHVybiBUUlVFOworfQorc3RhdGljIHZvaWQgX0RyYXdHb3VyYXVkKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NZXNoVmVydGV4IHRyaWFuZ2xlWzNdKSB7CisgIEZYX0ZMT0FUIG1pbl95ID0gdHJpYW5nbGVbMF0ueSwgbWF4X3kgPSB0cmlhbmdsZVswXS55OworICBmb3IgKGludCBpID0gMTsgaSA8IDM7IGkrKykgeworICAgIGlmIChtaW5feSA+IHRyaWFuZ2xlW2ldLnkpIHsKKyAgICAgIG1pbl95ID0gdHJpYW5nbGVbaV0ueTsKKyAgICB9CisgICAgaWYgKG1heF95IDwgdHJpYW5nbGVbaV0ueSkgeworICAgICAgbWF4X3kgPSB0cmlhbmdsZVtpXS55OworICAgIH0KKyAgfQorICBpZiAobWluX3kgPT0gbWF4X3kpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IG1pbl95aSA9IChpbnQpRlhTWVNfZmxvb3IobWluX3kpLCBtYXhfeWkgPSAoaW50KUZYU1lTX2NlaWwobWF4X3kpOworICBpZiAobWluX3lpIDwgMCkgeworICAgIG1pbl95aSA9IDA7CisgIH0KKyAgaWYgKG1heF95aSA+PSBwQml0bWFwLT5HZXRIZWlnaHQoKSkgeworICAgIG1heF95aSA9IHBCaXRtYXAtPkdldEhlaWdodCgpIC0gMTsKKyAgfQorICBmb3IgKGludCB5ID0gbWluX3lpOyB5IDw9IG1heF95aTsgeSsrKSB7CisgICAgaW50IG5JbnRlcnNlY3RzID0gMDsKKyAgICBGWF9GTE9BVCBpbnRlcl94WzNdLCByWzNdLCBnWzNdLCBiWzNdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICBDUERGX01lc2hWZXJ0ZXgmIHZlcnRleDEgPSB0cmlhbmdsZVtpXTsKKyAgICAgIENQREZfTWVzaFZlcnRleCYgdmVydGV4MiA9IHRyaWFuZ2xlWyhpICsgMSkgJSAzXTsKKyAgICAgIEZYX0JPT0wgYkludGVyc2VjdCA9IF9HZXRTY2FubGluZUludGVyc2VjdCgKKyAgICAgICAgICB5LCB2ZXJ0ZXgxLngsIHZlcnRleDEueSwgdmVydGV4Mi54LCB2ZXJ0ZXgyLnksIGludGVyX3hbbkludGVyc2VjdHNdKTsKKyAgICAgIGlmICghYkludGVyc2VjdCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHJbbkludGVyc2VjdHNdID0KKyAgICAgICAgICB2ZXJ0ZXgxLnIgKyBGWFNZU19NdWxEaXYodmVydGV4Mi5yIC0gdmVydGV4MS5yLCB5IC0gdmVydGV4MS55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXgyLnkgLSB2ZXJ0ZXgxLnkpOworICAgICAgZ1tuSW50ZXJzZWN0c10gPQorICAgICAgICAgIHZlcnRleDEuZyArIEZYU1lTX011bERpdih2ZXJ0ZXgyLmcgLSB2ZXJ0ZXgxLmcsIHkgLSB2ZXJ0ZXgxLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleDIueSAtIHZlcnRleDEueSk7CisgICAgICBiW25JbnRlcnNlY3RzXSA9CisgICAgICAgICAgdmVydGV4MS5iICsgRlhTWVNfTXVsRGl2KHZlcnRleDIuYiAtIHZlcnRleDEuYiwgeSAtIHZlcnRleDEueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4Mi55IC0gdmVydGV4MS55KTsKKyAgICAgIG5JbnRlcnNlY3RzKys7CisgICAgfQorICAgIGlmIChuSW50ZXJzZWN0cyAhPSAyKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IG1pbl94LCBtYXhfeCwgc3RhcnRfaW5kZXgsIGVuZF9pbmRleDsKKyAgICBpZiAoaW50ZXJfeFswXSA8IGludGVyX3hbMV0pIHsKKyAgICAgIG1pbl94ID0gKGludClGWFNZU19mbG9vcihpbnRlcl94WzBdKTsKKyAgICAgIG1heF94ID0gKGludClGWFNZU19jZWlsKGludGVyX3hbMV0pOworICAgICAgc3RhcnRfaW5kZXggPSAwOworICAgICAgZW5kX2luZGV4ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgbWluX3ggPSAoaW50KUZYU1lTX2Zsb29yKGludGVyX3hbMV0pOworICAgICAgbWF4X3ggPSAoaW50KUZYU1lTX2NlaWwoaW50ZXJfeFswXSk7CisgICAgICBzdGFydF9pbmRleCA9IDE7CisgICAgICBlbmRfaW5kZXggPSAwOworICAgIH0KKyAgICBpbnQgc3RhcnRfeCA9IG1pbl94LCBlbmRfeCA9IG1heF94OworICAgIGlmIChzdGFydF94IDwgMCkgeworICAgICAgc3RhcnRfeCA9IDA7CisgICAgfQorICAgIGlmIChlbmRfeCA+IHBCaXRtYXAtPkdldFdpZHRoKCkpIHsKKyAgICAgIGVuZF94ID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKKyAgICB9CisgICAgdWludDhfdCogZGliX2J1ZiA9CisgICAgICAgIHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgeSAqIHBCaXRtYXAtPkdldFBpdGNoKCkgKyBzdGFydF94ICogNDsKKyAgICBGWF9GTE9BVCByX3VuaXQgPSAocltlbmRfaW5kZXhdIC0gcltzdGFydF9pbmRleF0pIC8gKG1heF94IC0gbWluX3gpOworICAgIEZYX0ZMT0FUIGdfdW5pdCA9IChnW2VuZF9pbmRleF0gLSBnW3N0YXJ0X2luZGV4XSkgLyAobWF4X3ggLSBtaW5feCk7CisgICAgRlhfRkxPQVQgYl91bml0ID0gKGJbZW5kX2luZGV4XSAtIGJbc3RhcnRfaW5kZXhdKSAvIChtYXhfeCAtIG1pbl94KTsKKyAgICBGWF9GTE9BVCBSID0gcltzdGFydF9pbmRleF0gKyAoc3RhcnRfeCAtIG1pbl94KSAqIHJfdW5pdDsKKyAgICBGWF9GTE9BVCBHID0gZ1tzdGFydF9pbmRleF0gKyAoc3RhcnRfeCAtIG1pbl94KSAqIGdfdW5pdDsKKyAgICBGWF9GTE9BVCBCID0gYltzdGFydF9pbmRleF0gKyAoc3RhcnRfeCAtIG1pbl94KSAqIGJfdW5pdDsKKyAgICBmb3IgKGludCB4ID0gc3RhcnRfeDsgeCA8IGVuZF94OyB4KyspIHsKKyAgICAgIFIgKz0gcl91bml0OworICAgICAgRyArPSBnX3VuaXQ7CisgICAgICBCICs9IGJfdW5pdDsKKyAgICAgIEZYQVJHQl9TRVRESUIoZGliX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0UoYWxwaGEsIChpbnQzMl90KShSICogMjU1KSwgKGludDMyX3QpKEcgKiAyNTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkoQiAqIDI1NSkpKTsKKyAgICAgIGRpYl9idWYgKz0gNDsKKyAgICB9CisgIH0KK30KK3N0YXRpYyB2b2lkIF9EcmF3RnJlZUdvdXJhdWRTaGFkaW5nKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBTaGFkaW5nU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSkgeworICBBU1NFUlQocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7CisgIGlmIChwU2hhZGluZ1N0cmVhbS0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9NZXNoU3RyZWFtIHN0cmVhbTsKKyAgaWYgKCFzdHJlYW0uTG9hZChwU2hhZGluZ1N0cmVhbSwgcEZ1bmNzLCBuRnVuY3MsIHBDUykpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9NZXNoVmVydGV4IHRyaWFuZ2xlWzNdOworICBGWFNZU19tZW1zZXQodHJpYW5nbGUsIDAsIHNpemVvZih0cmlhbmdsZSkpOworCisgIHdoaWxlICghc3RyZWFtLm1fQml0U3RyZWFtLklzRU9GKCkpIHsKKyAgICBDUERGX01lc2hWZXJ0ZXggdmVydGV4OworICAgIEZYX0RXT1JEIGZsYWcgPSBzdHJlYW0uR2V0VmVydGV4KHZlcnRleCwgcE9iamVjdDJCaXRtYXApOworICAgIGlmIChmbGFnID09IDApIHsKKyAgICAgIHRyaWFuZ2xlWzBdID0gdmVydGV4OworICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCAzOyBqKyspIHsKKyAgICAgICAgc3RyZWFtLkdldFZlcnRleCh0cmlhbmdsZVtqXSwgcE9iamVjdDJCaXRtYXApOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoZmxhZyA9PSAxKSB7CisgICAgICAgIHRyaWFuZ2xlWzBdID0gdHJpYW5nbGVbMV07CisgICAgICB9CisgICAgICB0cmlhbmdsZVsxXSA9IHRyaWFuZ2xlWzJdOworICAgICAgdHJpYW5nbGVbMl0gPSB2ZXJ0ZXg7CisgICAgfQorICAgIF9EcmF3R291cmF1ZChwQml0bWFwLCBhbHBoYSwgdHJpYW5nbGUpOworICB9Cit9CitzdGF0aWMgdm9pZCBfRHJhd0xhdHRpY2VHb3VyYXVkU2hhZGluZyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEpIHsKKyAgQVNTRVJUKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOworICBpZiAocFNoYWRpbmdTdHJlYW0tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCByb3dfdmVydHMgPSBwU2hhZGluZ1N0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKCJWZXJ0aWNlc1BlclJvdyIpOworICBpZiAocm93X3ZlcnRzIDwgMikgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX01lc2hTdHJlYW0gc3RyZWFtOworICBpZiAoIXN0cmVhbS5Mb2FkKHBTaGFkaW5nU3RyZWFtLCBwRnVuY3MsIG5GdW5jcywgcENTKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX01lc2hWZXJ0ZXgqIHZlcnRleCA9IEZYX0FsbG9jMkQoQ1BERl9NZXNoVmVydGV4LCByb3dfdmVydHMsIDIpOworICBpZiAoIXN0cmVhbS5HZXRWZXJ0ZXhSb3codmVydGV4LCByb3dfdmVydHMsIHBPYmplY3QyQml0bWFwKSkgeworICAgIEZYX0ZyZWUodmVydGV4KTsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGxhc3RfaW5kZXggPSAwOworICB3aGlsZSAoMSkgeworICAgIENQREZfTWVzaFZlcnRleCogbGFzdF9yb3cgPSB2ZXJ0ZXggKyBsYXN0X2luZGV4ICogcm93X3ZlcnRzOworICAgIENQREZfTWVzaFZlcnRleCogdGhpc19yb3cgPSB2ZXJ0ZXggKyAoMSAtIGxhc3RfaW5kZXgpICogcm93X3ZlcnRzOworICAgIGlmICghc3RyZWFtLkdldFZlcnRleFJvdyh0aGlzX3Jvdywgcm93X3ZlcnRzLCBwT2JqZWN0MkJpdG1hcCkpIHsKKyAgICAgIEZYX0ZyZWUodmVydGV4KTsKKyAgICAgIHJldHVybjsKICAgICB9CiAgICAgQ1BERl9NZXNoVmVydGV4IHRyaWFuZ2xlWzNdOwotICAgIEZYU1lTX21lbXNldCh0cmlhbmdsZSwgMCwgc2l6ZW9mKHRyaWFuZ2xlKSk7Ci0KLSAgICB3aGlsZSAoIXN0cmVhbS5tX0JpdFN0cmVhbS5Jc0VPRigpKSB7Ci0gICAgICAgIENQREZfTWVzaFZlcnRleCB2ZXJ0ZXg7Ci0gICAgICAgIEZYX0RXT1JEIGZsYWcgPSBzdHJlYW0uR2V0VmVydGV4KHZlcnRleCwgcE9iamVjdDJCaXRtYXApOwotICAgICAgICBpZiAoZmxhZyA9PSAwKSB7Ci0gICAgICAgICAgICB0cmlhbmdsZVswXSA9IHZlcnRleDsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgMzsgaiArKykgewotICAgICAgICAgICAgICAgIHN0cmVhbS5HZXRWZXJ0ZXgodHJpYW5nbGVbal0sIHBPYmplY3QyQml0bWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmbGFnID09IDEpIHsKLSAgICAgICAgICAgICAgICB0cmlhbmdsZVswXSA9IHRyaWFuZ2xlWzFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJpYW5nbGVbMV0gPSB0cmlhbmdsZVsyXTsKLSAgICAgICAgICAgIHRyaWFuZ2xlWzJdID0gdmVydGV4OwotICAgICAgICB9Ci0gICAgICAgIF9EcmF3R291cmF1ZChwQml0bWFwLCBhbHBoYSwgdHJpYW5nbGUpOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcm93X3ZlcnRzOyBpKyspIHsKKyAgICAgIHRyaWFuZ2xlWzBdID0gbGFzdF9yb3dbaV07CisgICAgICB0cmlhbmdsZVsxXSA9IHRoaXNfcm93W2kgLSAxXTsKKyAgICAgIHRyaWFuZ2xlWzJdID0gbGFzdF9yb3dbaSAtIDFdOworICAgICAgX0RyYXdHb3VyYXVkKHBCaXRtYXAsIGFscGhhLCB0cmlhbmdsZSk7CisgICAgICB0cmlhbmdsZVsyXSA9IHRoaXNfcm93W2ldOworICAgICAgX0RyYXdHb3VyYXVkKHBCaXRtYXAsIGFscGhhLCB0cmlhbmdsZSk7CiAgICAgfQotfQotc3RhdGljIHZvaWQgX0RyYXdMYXR0aWNlR291cmF1ZFNoYWRpbmcoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTLCBpbnQgYWxwaGEpCi17Ci0gICAgQVNTRVJUKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOwotICAgIGlmIChwU2hhZGluZ1N0cmVhbS0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgcm93X3ZlcnRzID0gcFNoYWRpbmdTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcigiVmVydGljZXNQZXJSb3ciKTsKLSAgICBpZiAocm93X3ZlcnRzIDwgMikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfTWVzaFN0cmVhbSBzdHJlYW07Ci0gICAgaWYgKCFzdHJlYW0uTG9hZChwU2hhZGluZ1N0cmVhbSwgcEZ1bmNzLCBuRnVuY3MsIHBDUykpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX01lc2hWZXJ0ZXgqIHZlcnRleCA9IEZYX0FsbG9jMkQoQ1BERl9NZXNoVmVydGV4LCByb3dfdmVydHMsIDIpOwotICAgIGlmICghc3RyZWFtLkdldFZlcnRleFJvdyh2ZXJ0ZXgsIHJvd192ZXJ0cywgcE9iamVjdDJCaXRtYXApKSB7Ci0gICAgICAgIEZYX0ZyZWUodmVydGV4KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbGFzdF9pbmRleCA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQ1BERl9NZXNoVmVydGV4KiBsYXN0X3JvdyA9IHZlcnRleCArIGxhc3RfaW5kZXggKiByb3dfdmVydHM7Ci0gICAgICAgIENQREZfTWVzaFZlcnRleCogdGhpc19yb3cgPSB2ZXJ0ZXggKyAoMSAtIGxhc3RfaW5kZXgpICogcm93X3ZlcnRzOwotICAgICAgICBpZiAoIXN0cmVhbS5HZXRWZXJ0ZXhSb3codGhpc19yb3csIHJvd192ZXJ0cywgcE9iamVjdDJCaXRtYXApKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKHZlcnRleCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9NZXNoVmVydGV4IHRyaWFuZ2xlWzNdOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHJvd192ZXJ0czsgaSArKykgewotICAgICAgICAgICAgdHJpYW5nbGVbMF0gPSBsYXN0X3Jvd1tpXTsKLSAgICAgICAgICAgIHRyaWFuZ2xlWzFdID0gdGhpc19yb3dbaSAtIDFdOwotICAgICAgICAgICAgdHJpYW5nbGVbMl0gPSBsYXN0X3Jvd1tpIC0gMV07Ci0gICAgICAgICAgICBfRHJhd0dvdXJhdWQocEJpdG1hcCwgYWxwaGEsIHRyaWFuZ2xlKTsKLSAgICAgICAgICAgIHRyaWFuZ2xlWzJdID0gdGhpc19yb3dbaV07Ci0gICAgICAgICAgICBfRHJhd0dvdXJhdWQocEJpdG1hcCwgYWxwaGEsIHRyaWFuZ2xlKTsKLSAgICAgICAgfQotICAgICAgICBsYXN0X2luZGV4ID0gMSAtIGxhc3RfaW5kZXg7Ci0gICAgfQotICAgIEZYX0ZyZWUodmVydGV4KTsKKyAgICBsYXN0X2luZGV4ID0gMSAtIGxhc3RfaW5kZXg7CisgIH0KKyAgRlhfRnJlZSh2ZXJ0ZXgpOwogfQogc3RydWN0IENvb25fQmV6aWVyQ29lZmYgewotICAgIGZsb2F0IGEsIGIsIGMsIGQ7Ci0gICAgdm9pZCBGcm9tUG9pbnRzKGZsb2F0IHAwLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGZsb2F0IHAzKQotICAgIHsKLSAgICAgICAgYSA9IC1wMCArIDMgKiBwMSAtIDMgKiBwMiArIHAzOwotICAgICAgICBiID0gMyAqIHAwIC0gNiAqIHAxICsgMyAqIHAyOwotICAgICAgICBjID0gLTMgKiBwMCArIDMgKiBwMTsKLSAgICAgICAgZCA9IHAwOwotICAgIH0KLSAgICBDb29uX0JlemllckNvZWZmIGZpcnN0X2hhbGYoKQotICAgIHsKLSAgICAgICAgQ29vbl9CZXppZXJDb2VmZiByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdC5hID0gYSAvIDg7Ci0gICAgICAgIHJlc3VsdC5iID0gYiAvIDQ7Ci0gICAgICAgIHJlc3VsdC5jID0gYyAvIDI7Ci0gICAgICAgIHJlc3VsdC5kID0gZDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgQ29vbl9CZXppZXJDb2VmZiBzZWNvbmRfaGFsZigpCi0gICAgewotICAgICAgICBDb29uX0JlemllckNvZWZmIHJlc3VsdDsKLSAgICAgICAgcmVzdWx0LmEgPSBhIC8gODsKLSAgICAgICAgcmVzdWx0LmIgPSAzICogYSAvIDggKyBiIC8gNDsKLSAgICAgICAgcmVzdWx0LmMgPSAzICogYSAvIDggKyBiIC8gMiArIGMgLyAyOwotICAgICAgICByZXN1bHQuZCA9IGEgLyA4ICsgYiAvIDQgKyBjIC8gMiArIGQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHZvaWQgR2V0UG9pbnRzKGZsb2F0IHBbNF0pCi0gICAgewotICAgICAgICBwWzBdID0gZDsKLSAgICAgICAgcFsxXSA9IGMgLyAzICsgcFswXTsKLSAgICAgICAgcFsyXSA9IGIgLyAzIC0gcFswXSArIDIgKiBwWzFdOwotICAgICAgICBwWzNdID0gYSArIHBbMF0gLSAzICogcFsxXSArIDMgKiBwWzJdOwotICAgIH0KLSAgICB2b2lkIEdldFBvaW50c1JldmVyc2UoZmxvYXQgcFs0XSkKLSAgICB7Ci0gICAgICAgIHBbM10gPSBkOwotICAgICAgICBwWzJdID0gYyAvIDMgKyBwWzNdOwotICAgICAgICBwWzFdID0gYiAvIDMgLSBwWzNdICsgMiAqIHBbMl07Ci0gICAgICAgIHBbMF0gPSBhICsgcFszXSAtIDMgKiBwWzJdICsgMyAqIHBbMV07Ci0gICAgfQotICAgIHZvaWQgQmV6aWVySW50ZXJwb2woQ29vbl9CZXppZXJDb2VmZiYgQzEsIENvb25fQmV6aWVyQ29lZmYmIEMyLCBDb29uX0JlemllckNvZWZmJiBEMSwgQ29vbl9CZXppZXJDb2VmZiYgRDIpCi0gICAgewotICAgICAgICBhID0gKEQxLmEgKyBEMi5hKSAvIDI7Ci0gICAgICAgIGIgPSAoRDEuYiArIEQyLmIpIC8gMjsKLSAgICAgICAgYyA9IChEMS5jICsgRDIuYykgLyAyIC0gKEMxLmEgLyA4ICsgQzEuYiAvIDQgKyBDMS5jIC8gMikgKyAoQzIuYSAvIDggKyBDMi5iIC8gNCkgKyAoLUMxLmQgKyBEMi5kKSAvIDIgLSAoQzIuYSArIEMyLmIpIC8gMjsKLSAgICAgICAgZCA9IEMxLmEgLyA4ICsgQzEuYiAvIDQgKyBDMS5jIC8gMiArIEMxLmQ7Ci0gICAgfQotICAgIGZsb2F0IERpc3RhbmNlKCkKLSAgICB7Ci0gICAgICAgIGZsb2F0IGRpcyA9IGEgKyBiICsgYzsKLSAgICAgICAgcmV0dXJuIGRpcyA8IDAgPyAtZGlzIDogZGlzOwotICAgIH0KKyAgZmxvYXQgYSwgYiwgYywgZDsKKyAgdm9pZCBGcm9tUG9pbnRzKGZsb2F0IHAwLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGZsb2F0IHAzKSB7CisgICAgYSA9IC1wMCArIDMgKiBwMSAtIDMgKiBwMiArIHAzOworICAgIGIgPSAzICogcDAgLSA2ICogcDEgKyAzICogcDI7CisgICAgYyA9IC0zICogcDAgKyAzICogcDE7CisgICAgZCA9IHAwOworICB9CisgIENvb25fQmV6aWVyQ29lZmYgZmlyc3RfaGFsZigpIHsKKyAgICBDb29uX0JlemllckNvZWZmIHJlc3VsdDsKKyAgICByZXN1bHQuYSA9IGEgLyA4OworICAgIHJlc3VsdC5iID0gYiAvIDQ7CisgICAgcmVzdWx0LmMgPSBjIC8gMjsKKyAgICByZXN1bHQuZCA9IGQ7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBDb29uX0JlemllckNvZWZmIHNlY29uZF9oYWxmKCkgeworICAgIENvb25fQmV6aWVyQ29lZmYgcmVzdWx0OworICAgIHJlc3VsdC5hID0gYSAvIDg7CisgICAgcmVzdWx0LmIgPSAzICogYSAvIDggKyBiIC8gNDsKKyAgICByZXN1bHQuYyA9IDMgKiBhIC8gOCArIGIgLyAyICsgYyAvIDI7CisgICAgcmVzdWx0LmQgPSBhIC8gOCArIGIgLyA0ICsgYyAvIDIgKyBkOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgdm9pZCBHZXRQb2ludHMoZmxvYXQgcFs0XSkgeworICAgIHBbMF0gPSBkOworICAgIHBbMV0gPSBjIC8gMyArIHBbMF07CisgICAgcFsyXSA9IGIgLyAzIC0gcFswXSArIDIgKiBwWzFdOworICAgIHBbM10gPSBhICsgcFswXSAtIDMgKiBwWzFdICsgMyAqIHBbMl07CisgIH0KKyAgdm9pZCBHZXRQb2ludHNSZXZlcnNlKGZsb2F0IHBbNF0pIHsKKyAgICBwWzNdID0gZDsKKyAgICBwWzJdID0gYyAvIDMgKyBwWzNdOworICAgIHBbMV0gPSBiIC8gMyAtIHBbM10gKyAyICogcFsyXTsKKyAgICBwWzBdID0gYSArIHBbM10gLSAzICogcFsyXSArIDMgKiBwWzFdOworICB9CisgIHZvaWQgQmV6aWVySW50ZXJwb2woQ29vbl9CZXppZXJDb2VmZiYgQzEsCisgICAgICAgICAgICAgICAgICAgICAgQ29vbl9CZXppZXJDb2VmZiYgQzIsCisgICAgICAgICAgICAgICAgICAgICAgQ29vbl9CZXppZXJDb2VmZiYgRDEsCisgICAgICAgICAgICAgICAgICAgICAgQ29vbl9CZXppZXJDb2VmZiYgRDIpIHsKKyAgICBhID0gKEQxLmEgKyBEMi5hKSAvIDI7CisgICAgYiA9IChEMS5iICsgRDIuYikgLyAyOworICAgIGMgPSAoRDEuYyArIEQyLmMpIC8gMiAtIChDMS5hIC8gOCArIEMxLmIgLyA0ICsgQzEuYyAvIDIpICsKKyAgICAgICAgKEMyLmEgLyA4ICsgQzIuYiAvIDQpICsgKC1DMS5kICsgRDIuZCkgLyAyIC0gKEMyLmEgKyBDMi5iKSAvIDI7CisgICAgZCA9IEMxLmEgLyA4ICsgQzEuYiAvIDQgKyBDMS5jIC8gMiArIEMxLmQ7CisgIH0KKyAgZmxvYXQgRGlzdGFuY2UoKSB7CisgICAgZmxvYXQgZGlzID0gYSArIGIgKyBjOworICAgIHJldHVybiBkaXMgPCAwID8gLWRpcyA6IGRpczsKKyAgfQogfTsKIHN0cnVjdCBDb29uX0JlemllciB7Ci0gICAgQ29vbl9CZXppZXJDb2VmZiB4LCB5OwotICAgIHZvaWQgRnJvbVBvaW50cyhmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB4MywgZmxvYXQgeTMpCi0gICAgewotICAgICAgICB4LkZyb21Qb2ludHMoeDAsIHgxLCB4MiwgeDMpOwotICAgICAgICB5LkZyb21Qb2ludHMoeTAsIHkxLCB5MiwgeTMpOworICBDb29uX0JlemllckNvZWZmIHgsIHk7CisgIHZvaWQgRnJvbVBvaW50cyhmbG9hdCB4MCwKKyAgICAgICAgICAgICAgICAgIGZsb2F0IHkwLAorICAgICAgICAgICAgICAgICAgZmxvYXQgeDEsCisgICAgICAgICAgICAgICAgICBmbG9hdCB5MSwKKyAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLAorICAgICAgICAgICAgICAgICAgZmxvYXQgeTIsCisgICAgICAgICAgICAgICAgICBmbG9hdCB4MywKKyAgICAgICAgICAgICAgICAgIGZsb2F0IHkzKSB7CisgICAgeC5Gcm9tUG9pbnRzKHgwLCB4MSwgeDIsIHgzKTsKKyAgICB5LkZyb21Qb2ludHMoeTAsIHkxLCB5MiwgeTMpOworICB9CisgIENvb25fQmV6aWVyIGZpcnN0X2hhbGYoKSB7CisgICAgQ29vbl9CZXppZXIgcmVzdWx0OworICAgIHJlc3VsdC54ID0geC5maXJzdF9oYWxmKCk7CisgICAgcmVzdWx0LnkgPSB5LmZpcnN0X2hhbGYoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIENvb25fQmV6aWVyIHNlY29uZF9oYWxmKCkgeworICAgIENvb25fQmV6aWVyIHJlc3VsdDsKKyAgICByZXN1bHQueCA9IHguc2Vjb25kX2hhbGYoKTsKKyAgICByZXN1bHQueSA9IHkuc2Vjb25kX2hhbGYoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHZvaWQgQmV6aWVySW50ZXJwb2woQ29vbl9CZXppZXImIEMxLAorICAgICAgICAgICAgICAgICAgICAgIENvb25fQmV6aWVyJiBDMiwKKyAgICAgICAgICAgICAgICAgICAgICBDb29uX0JlemllciYgRDEsCisgICAgICAgICAgICAgICAgICAgICAgQ29vbl9CZXppZXImIEQyKSB7CisgICAgeC5CZXppZXJJbnRlcnBvbChDMS54LCBDMi54LCBEMS54LCBEMi54KTsKKyAgICB5LkJlemllckludGVycG9sKEMxLnksIEMyLnksIEQxLnksIEQyLnkpOworICB9CisgIHZvaWQgR2V0UG9pbnRzKEZYX1BBVEhQT0lOVCogcFBvaW50cykgeworICAgIGZsb2F0IHBbNF07CisgICAgaW50IGk7CisgICAgeC5HZXRQb2ludHMocCk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgcFBvaW50c1tpXS5tX1BvaW50WCA9IHBbaV07CiAgICAgfQotICAgIENvb25fQmV6aWVyIGZpcnN0X2hhbGYoKQotICAgIHsKLSAgICAgICAgQ29vbl9CZXppZXIgcmVzdWx0OwotICAgICAgICByZXN1bHQueCA9IHguZmlyc3RfaGFsZigpOwotICAgICAgICByZXN1bHQueSA9IHkuZmlyc3RfaGFsZigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIHkuR2V0UG9pbnRzKHApOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIHBQb2ludHNbaV0ubV9Qb2ludFkgPSBwW2ldOwogICAgIH0KLSAgICBDb29uX0JlemllciBzZWNvbmRfaGFsZigpCi0gICAgewotICAgICAgICBDb29uX0JlemllciByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdC54ID0geC5zZWNvbmRfaGFsZigpOwotICAgICAgICByZXN1bHQueSA9IHkuc2Vjb25kX2hhbGYoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICB2b2lkIEdldFBvaW50c1JldmVyc2UoRlhfUEFUSFBPSU5UKiBwUG9pbnRzKSB7CisgICAgZmxvYXQgcFs0XTsKKyAgICBpbnQgaTsKKyAgICB4LkdldFBvaW50c1JldmVyc2UocCk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgcFBvaW50c1tpXS5tX1BvaW50WCA9IHBbaV07CiAgICAgfQotICAgIHZvaWQgQmV6aWVySW50ZXJwb2woQ29vbl9CZXppZXImIEMxLCBDb29uX0JlemllciYgQzIsIENvb25fQmV6aWVyJiBEMSwgQ29vbl9CZXppZXImIEQyKQotICAgIHsKLSAgICAgICAgeC5CZXppZXJJbnRlcnBvbChDMS54LCBDMi54LCBEMS54LCBEMi54KTsKLSAgICAgICAgeS5CZXppZXJJbnRlcnBvbChDMS55LCBDMi55LCBEMS55LCBEMi55KTsKKyAgICB5LkdldFBvaW50c1JldmVyc2UocCk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgcFBvaW50c1tpXS5tX1BvaW50WSA9IHBbaV07CiAgICAgfQotICAgIHZvaWQgR2V0UG9pbnRzKEZYX1BBVEhQT0lOVCogcFBvaW50cykKLSAgICB7Ci0gICAgICAgIGZsb2F0IHBbNF07Ci0gICAgICAgIGludCBpOwotICAgICAgICB4LkdldFBvaW50cyhwKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgICAgIHBQb2ludHNbaV0ubV9Qb2ludFggPSBwW2ldOwotICAgICAgICB9Ci0gICAgICAgIHkuR2V0UG9pbnRzKHApOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICAgICAgcFBvaW50c1tpXS5tX1BvaW50WSA9IHBbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBHZXRQb2ludHNSZXZlcnNlKEZYX1BBVEhQT0lOVCogcFBvaW50cykKLSAgICB7Ci0gICAgICAgIGZsb2F0IHBbNF07Ci0gICAgICAgIGludCBpOwotICAgICAgICB4LkdldFBvaW50c1JldmVyc2UocCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgICAgICBwUG9pbnRzW2ldLm1fUG9pbnRYID0gcFtpXTsKLSAgICAgICAgfQotICAgICAgICB5LkdldFBvaW50c1JldmVyc2UocCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgICAgICBwUG9pbnRzW2ldLm1fUG9pbnRZID0gcFtpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmbG9hdCBEaXN0YW5jZSgpCi0gICAgewotICAgICAgICByZXR1cm4geC5EaXN0YW5jZSgpICsgeS5EaXN0YW5jZSgpOwotICAgIH0KKyAgfQorICBmbG9hdCBEaXN0YW5jZSgpIHsgcmV0dXJuIHguRGlzdGFuY2UoKSArIHkuRGlzdGFuY2UoKTsgfQogfTsKLXN0YXRpYyBpbnQgX0JpSW50ZXJwb2woaW50IGMwLCBpbnQgYzEsIGludCBjMiwgaW50IGMzLCBpbnQgeCwgaW50IHksIGludCB4X3NjYWxlLCBpbnQgeV9zY2FsZSkKLXsKLSAgICBpbnQgeDEgPSBjMCArIChjMyAtIGMwKSAqIHggLyB4X3NjYWxlOwotICAgIGludCB4MiA9IGMxICsgKGMyIC0gYzEpICogeCAvIHhfc2NhbGU7Ci0gICAgcmV0dXJuIHgxICsgKHgyIC0geDEpICogeSAvIHlfc2NhbGU7CitzdGF0aWMgaW50IF9CaUludGVycG9sKGludCBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGMxLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYzIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjMywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc2NhbGUpIHsKKyAgaW50IHgxID0gYzAgKyAoYzMgLSBjMCkgKiB4IC8geF9zY2FsZTsKKyAgaW50IHgyID0gYzEgKyAoYzIgLSBjMSkgKiB4IC8geF9zY2FsZTsKKyAgcmV0dXJuIHgxICsgKHgyIC0geDEpICogeSAvIHlfc2NhbGU7CiB9CiBzdHJ1Y3QgQ29vbl9Db2xvciB7Ci0gICAgQ29vbl9Db2xvcigpCi0gICAgewotICAgICAgICBGWFNZU19tZW1zZXQoY29tcCwgMCwgc2l6ZW9mKGludCkgKiAzKTsKKyAgQ29vbl9Db2xvcigpIHsgRlhTWVNfbWVtc2V0KGNvbXAsIDAsIHNpemVvZihpbnQpICogMyk7IH0KKyAgaW50IGNvbXBbM107CisgIHZvaWQgQmlJbnRlcnBvbChDb29uX0NvbG9yIGNvbG9yc1s0XSwKKyAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICBpbnQgeF9zY2FsZSwKKyAgICAgICAgICAgICAgICAgIGludCB5X3NjYWxlKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICBjb21wW2ldID0KKyAgICAgICAgICBfQmlJbnRlcnBvbChjb2xvcnNbMF0uY29tcFtpXSwgY29sb3JzWzFdLmNvbXBbaV0sIGNvbG9yc1syXS5jb21wW2ldLAorICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc1szXS5jb21wW2ldLCB4LCB5LCB4X3NjYWxlLCB5X3NjYWxlKTsKKyAgfQorICBpbnQgRGlzdGFuY2UoQ29vbl9Db2xvciYgbykgeworICAgIGludCBtYXgsIGRpZmY7CisgICAgbWF4ID0gRlhTWVNfYWJzKGNvbXBbMF0gLSBvLmNvbXBbMF0pOworICAgIGRpZmYgPSBGWFNZU19hYnMoY29tcFsxXSAtIG8uY29tcFsxXSk7CisgICAgaWYgKG1heCA8IGRpZmYpIHsKKyAgICAgIG1heCA9IGRpZmY7CiAgICAgfQotICAgIGludAkJY29tcFszXTsKLSAgICB2b2lkCUJpSW50ZXJwb2woQ29vbl9Db2xvciBjb2xvcnNbNF0sIGludCB4LCBpbnQgeSwgaW50IHhfc2NhbGUsIGludCB5X3NjYWxlKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpICsrKQotICAgICAgICAgICAgY29tcFtpXSA9IF9CaUludGVycG9sKGNvbG9yc1swXS5jb21wW2ldLCBjb2xvcnNbMV0uY29tcFtpXSwgY29sb3JzWzJdLmNvbXBbaV0sIGNvbG9yc1szXS5jb21wW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIHhfc2NhbGUsIHlfc2NhbGUpOworICAgIGRpZmYgPSBGWFNZU19hYnMoY29tcFsyXSAtIG8uY29tcFsyXSk7CisgICAgaWYgKG1heCA8IGRpZmYpIHsKKyAgICAgIG1heCA9IGRpZmY7CiAgICAgfQotICAgIGludAkJRGlzdGFuY2UoQ29vbl9Db2xvciYgbykKLSAgICB7Ci0gICAgICAgIGludCBtYXgsIGRpZmY7Ci0gICAgICAgIG1heCA9IEZYU1lTX2Ficyhjb21wWzBdIC0gby5jb21wWzBdKTsKLSAgICAgICAgZGlmZiA9IEZYU1lTX2Ficyhjb21wWzFdIC0gby5jb21wWzFdKTsKLSAgICAgICAgaWYgKG1heCA8IGRpZmYpIHsKLSAgICAgICAgICAgIG1heCA9IGRpZmY7Ci0gICAgICAgIH0KLSAgICAgICAgZGlmZiA9IEZYU1lTX2Ficyhjb21wWzJdIC0gby5jb21wWzJdKTsKLSAgICAgICAgaWYgKG1heCA8IGRpZmYpIHsKLSAgICAgICAgICAgIG1heCA9IGRpZmY7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1heDsKLSAgICB9CisgICAgcmV0dXJuIG1heDsKKyAgfQogfTsKIHN0cnVjdCBDUERGX1BhdGNoRHJhd2VyIHsKLSAgICBDb29uX0NvbG9yCQkJcGF0Y2hfY29sb3JzWzRdOwotICAgIGludAkJCQkJbWF4X2RlbHRhOwotICAgIENGWF9QYXRoRGF0YQkJcGF0aDsKLSAgICBDRlhfUmVuZGVyRGV2aWNlKglwRGV2aWNlOwotICAgIGludAkJCQkJZmlsbF9tb2RlOwotICAgIGludAkJCQkJYWxwaGE7Ci0gICAgdm9pZCBEcmF3KGludCB4X3NjYWxlLCBpbnQgeV9zY2FsZSwgaW50IGxlZnQsIGludCBib3R0b20sIENvb25fQmV6aWVyIEMxLCBDb29uX0JlemllciBDMiwgQ29vbl9CZXppZXIgRDEsIENvb25fQmV6aWVyIEQyKQotICAgIHsKLSAgICAgICAgRlhfQk9PTCBiU21hbGwgPSBDMS5EaXN0YW5jZSgpIDwgMiAmJiBDMi5EaXN0YW5jZSgpIDwgMiAmJiBEMS5EaXN0YW5jZSgpIDwgMiAmJiBEMi5EaXN0YW5jZSgpIDwgMjsKLSAgICAgICAgQ29vbl9Db2xvciBkaXZfY29sb3JzWzRdOwotICAgICAgICBpbnQgZF9ib3R0b20sIGRfbGVmdCwgZF90b3AsIGRfcmlnaHQ7Ci0gICAgICAgIGRpdl9jb2xvcnNbMF0uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQsIGJvdHRvbSwgeF9zY2FsZSwgeV9zY2FsZSk7Ci0gICAgICAgIGlmICghYlNtYWxsKSB7Ci0gICAgICAgICAgICBkaXZfY29sb3JzWzFdLkJpSW50ZXJwb2wocGF0Y2hfY29sb3JzLCBsZWZ0LCBib3R0b20gKyAxLCB4X3NjYWxlLCB5X3NjYWxlKTsKLSAgICAgICAgICAgIGRpdl9jb2xvcnNbMl0uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQgKyAxLCBib3R0b20gKyAxLCB4X3NjYWxlLCB5X3NjYWxlKTsKLSAgICAgICAgICAgIGRpdl9jb2xvcnNbM10uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQgKyAxLCBib3R0b20sIHhfc2NhbGUsIHlfc2NhbGUpOwotICAgICAgICAgICAgZF9ib3R0b20gPSBkaXZfY29sb3JzWzNdLkRpc3RhbmNlKGRpdl9jb2xvcnNbMF0pOwotICAgICAgICAgICAgZF9sZWZ0ID0gZGl2X2NvbG9yc1sxXS5EaXN0YW5jZShkaXZfY29sb3JzWzBdKTsKLSAgICAgICAgICAgIGRfdG9wID0gZGl2X2NvbG9yc1sxXS5EaXN0YW5jZShkaXZfY29sb3JzWzJdKTsKLSAgICAgICAgICAgIGRfcmlnaHQgPSBkaXZfY29sb3JzWzJdLkRpc3RhbmNlKGRpdl9jb2xvcnNbM10pOwotICAgICAgICB9Ci0jZGVmaW5lIENPT05DT0xPUl9USFJFU0hPTEQgNAotICAgICAgICBpZiAoYlNtYWxsIHx8IChkX2JvdHRvbSA8IENPT05DT0xPUl9USFJFU0hPTEQgJiYgZF9sZWZ0IDwgQ09PTkNPTE9SX1RIUkVTSE9MRCAmJgotICAgICAgICAgICAgICAgICAgICAgICBkX3RvcCA8IENPT05DT0xPUl9USFJFU0hPTEQgJiYgZF9yaWdodCA8IENPT05DT0xPUl9USFJFU0hPTEQpKSB7Ci0gICAgICAgICAgICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwYXRoLkdldFBvaW50cygpOwotICAgICAgICAgICAgQzEuR2V0UG9pbnRzKHBQb2ludHMpOwotICAgICAgICAgICAgRDIuR2V0UG9pbnRzKHBQb2ludHMgKyAzKTsKLSAgICAgICAgICAgIEMyLkdldFBvaW50c1JldmVyc2UocFBvaW50cyArIDYpOwotICAgICAgICAgICAgRDEuR2V0UG9pbnRzUmV2ZXJzZShwUG9pbnRzICsgOSk7Ci0gICAgICAgICAgICBpbnQgZmlsbEZsYWdzID0gRlhGSUxMX1dJTkRJTkcgfCBGWEZJTExfRlVMTENPVkVSOwotICAgICAgICAgICAgaWYgKGZpbGxfbW9kZSAmIFJFTkRFUl9OT1BBVEhTTU9PVEgpIHsKLSAgICAgICAgICAgICAgICBmaWxsRmxhZ3MgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBOVUxMLCBOVUxMLCBGWEFSR0JfTUFLRShhbHBoYSwgZGl2X2NvbG9yc1swXS5jb21wWzBdLCBkaXZfY29sb3JzWzBdLmNvbXBbMV0sIGRpdl9jb2xvcnNbMF0uY29tcFsyXSksIDAsIGZpbGxGbGFncyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZF9ib3R0b20gPCBDT09OQ09MT1JfVEhSRVNIT0xEICYmIGRfdG9wIDwgQ09PTkNPTE9SX1RIUkVTSE9MRCkgewotICAgICAgICAgICAgICAgIENvb25fQmV6aWVyIG0xOwotICAgICAgICAgICAgICAgIG0xLkJlemllckludGVycG9sKEQxLCBEMiwgQzEsIEMyKTsKLSAgICAgICAgICAgICAgICB5X3NjYWxlICo9IDI7Ci0gICAgICAgICAgICAgICAgYm90dG9tICo9IDI7Ci0gICAgICAgICAgICAgICAgRHJhdyh4X3NjYWxlLCB5X3NjYWxlLCBsZWZ0LCBib3R0b20sIEMxLCBtMSwgRDEuZmlyc3RfaGFsZigpLCBEMi5maXJzdF9oYWxmKCkpOwotICAgICAgICAgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tICsgMSwgbTEsIEMyLCBEMS5zZWNvbmRfaGFsZigpLCBEMi5zZWNvbmRfaGFsZigpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZF9sZWZ0IDwgQ09PTkNPTE9SX1RIUkVTSE9MRCAmJiBkX3JpZ2h0IDwgQ09PTkNPTE9SX1RIUkVTSE9MRCkgewotICAgICAgICAgICAgICAgIENvb25fQmV6aWVyIG0yOwotICAgICAgICAgICAgICAgIG0yLkJlemllckludGVycG9sKEMxLCBDMiwgRDEsIEQyKTsKLSAgICAgICAgICAgICAgICB4X3NjYWxlICo9IDI7Ci0gICAgICAgICAgICAgICAgbGVmdCAqPSAyOwotICAgICAgICAgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tLCBDMS5maXJzdF9oYWxmKCksIEMyLmZpcnN0X2hhbGYoKSwgRDEsIG0yKTsKLSAgICAgICAgICAgICAgICBEcmF3KHhfc2NhbGUsIHlfc2NhbGUsIGxlZnQgKyAxLCBib3R0b20sIEMxLnNlY29uZF9oYWxmKCksIEMyLnNlY29uZF9oYWxmKCksIG0yLCBEMik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENvb25fQmV6aWVyIG0xLCBtMjsKLSAgICAgICAgICAgICAgICBtMS5CZXppZXJJbnRlcnBvbChEMSwgRDIsIEMxLCBDMik7Ci0gICAgICAgICAgICAgICAgbTIuQmV6aWVySW50ZXJwb2woQzEsIEMyLCBEMSwgRDIpOwotICAgICAgICAgICAgICAgIENvb25fQmV6aWVyIG0xZiA9IG0xLmZpcnN0X2hhbGYoKTsKLSAgICAgICAgICAgICAgICBDb29uX0JlemllciBtMXMgPSBtMS5zZWNvbmRfaGFsZigpOwotICAgICAgICAgICAgICAgIENvb25fQmV6aWVyIG0yZiA9IG0yLmZpcnN0X2hhbGYoKTsKLSAgICAgICAgICAgICAgICBDb29uX0JlemllciBtMnMgPSBtMi5zZWNvbmRfaGFsZigpOwotICAgICAgICAgICAgICAgIHhfc2NhbGUgKj0gMjsKLSAgICAgICAgICAgICAgICB5X3NjYWxlICo9IDI7Ci0gICAgICAgICAgICAgICAgbGVmdCAqPSAyOwotICAgICAgICAgICAgICAgIGJvdHRvbSAqPSAyOwotICAgICAgICAgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tLCBDMS5maXJzdF9oYWxmKCksIG0xZiwgRDEuZmlyc3RfaGFsZigpLCBtMmYpOwotICAgICAgICAgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tICsgMSwgbTFmLCBDMi5maXJzdF9oYWxmKCksIEQxLnNlY29uZF9oYWxmKCksIG0ycyk7Ci0gICAgICAgICAgICAgICAgRHJhdyh4X3NjYWxlLCB5X3NjYWxlLCBsZWZ0ICsgMSwgYm90dG9tLCBDMS5zZWNvbmRfaGFsZigpLCBtMXMsIG0yZiwgRDIuZmlyc3RfaGFsZigpKTsKLSAgICAgICAgICAgICAgICBEcmF3KHhfc2NhbGUsIHlfc2NhbGUsIGxlZnQgKyAxLCBib3R0b20gKyAxLCBtMXMsIEMyLnNlY29uZF9oYWxmKCksIG0ycywgRDIuc2Vjb25kX2hhbGYoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgQ29vbl9Db2xvciBwYXRjaF9jb2xvcnNbNF07CisgIGludCBtYXhfZGVsdGE7CisgIENGWF9QYXRoRGF0YSBwYXRoOworICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlOworICBpbnQgZmlsbF9tb2RlOworICBpbnQgYWxwaGE7CisgIHZvaWQgRHJhdyhpbnQgeF9zY2FsZSwKKyAgICAgICAgICAgIGludCB5X3NjYWxlLAorICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICBpbnQgYm90dG9tLAorICAgICAgICAgICAgQ29vbl9CZXppZXIgQzEsCisgICAgICAgICAgICBDb29uX0JlemllciBDMiwKKyAgICAgICAgICAgIENvb25fQmV6aWVyIEQxLAorICAgICAgICAgICAgQ29vbl9CZXppZXIgRDIpIHsKKyAgICBGWF9CT09MIGJTbWFsbCA9IEMxLkRpc3RhbmNlKCkgPCAyICYmIEMyLkRpc3RhbmNlKCkgPCAyICYmCisgICAgICAgICAgICAgICAgICAgICBEMS5EaXN0YW5jZSgpIDwgMiAmJiBEMi5EaXN0YW5jZSgpIDwgMjsKKyAgICBDb29uX0NvbG9yIGRpdl9jb2xvcnNbNF07CisgICAgaW50IGRfYm90dG9tLCBkX2xlZnQsIGRfdG9wLCBkX3JpZ2h0OworICAgIGRpdl9jb2xvcnNbMF0uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQsIGJvdHRvbSwgeF9zY2FsZSwgeV9zY2FsZSk7CisgICAgaWYgKCFiU21hbGwpIHsKKyAgICAgIGRpdl9jb2xvcnNbMV0uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQsIGJvdHRvbSArIDEsIHhfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9zY2FsZSk7CisgICAgICBkaXZfY29sb3JzWzJdLkJpSW50ZXJwb2wocGF0Y2hfY29sb3JzLCBsZWZ0ICsgMSwgYm90dG9tICsgMSwgeF9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3NjYWxlKTsKKyAgICAgIGRpdl9jb2xvcnNbM10uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQgKyAxLCBib3R0b20sIHhfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9zY2FsZSk7CisgICAgICBkX2JvdHRvbSA9IGRpdl9jb2xvcnNbM10uRGlzdGFuY2UoZGl2X2NvbG9yc1swXSk7CisgICAgICBkX2xlZnQgPSBkaXZfY29sb3JzWzFdLkRpc3RhbmNlKGRpdl9jb2xvcnNbMF0pOworICAgICAgZF90b3AgPSBkaXZfY29sb3JzWzFdLkRpc3RhbmNlKGRpdl9jb2xvcnNbMl0pOworICAgICAgZF9yaWdodCA9IGRpdl9jb2xvcnNbMl0uRGlzdGFuY2UoZGl2X2NvbG9yc1szXSk7CiAgICAgfQorI2RlZmluZSBDT09OQ09MT1JfVEhSRVNIT0xEIDQKKyAgICBpZiAoYlNtYWxsIHx8CisgICAgICAgIChkX2JvdHRvbSA8IENPT05DT0xPUl9USFJFU0hPTEQgJiYgZF9sZWZ0IDwgQ09PTkNPTE9SX1RIUkVTSE9MRCAmJgorICAgICAgICAgZF90b3AgPCBDT09OQ09MT1JfVEhSRVNIT0xEICYmIGRfcmlnaHQgPCBDT09OQ09MT1JfVEhSRVNIT0xEKSkgeworICAgICAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gcGF0aC5HZXRQb2ludHMoKTsKKyAgICAgIEMxLkdldFBvaW50cyhwUG9pbnRzKTsKKyAgICAgIEQyLkdldFBvaW50cyhwUG9pbnRzICsgMyk7CisgICAgICBDMi5HZXRQb2ludHNSZXZlcnNlKHBQb2ludHMgKyA2KTsKKyAgICAgIEQxLkdldFBvaW50c1JldmVyc2UocFBvaW50cyArIDkpOworICAgICAgaW50IGZpbGxGbGFncyA9IEZYRklMTF9XSU5ESU5HIHwgRlhGSUxMX0ZVTExDT1ZFUjsKKyAgICAgIGlmIChmaWxsX21vZGUgJiBSRU5ERVJfTk9QQVRIU01PT1RIKSB7CisgICAgICAgIGZpbGxGbGFncyB8PSBGWEZJTExfTk9QQVRIU01PT1RIOworICAgICAgfQorICAgICAgcERldmljZS0+RHJhd1BhdGgoCisgICAgICAgICAgJnBhdGgsIE5VTEwsIE5VTEwsCisgICAgICAgICAgRlhBUkdCX01BS0UoYWxwaGEsIGRpdl9jb2xvcnNbMF0uY29tcFswXSwgZGl2X2NvbG9yc1swXS5jb21wWzFdLAorICAgICAgICAgICAgICAgICAgICAgIGRpdl9jb2xvcnNbMF0uY29tcFsyXSksCisgICAgICAgICAgMCwgZmlsbEZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGRfYm90dG9tIDwgQ09PTkNPTE9SX1RIUkVTSE9MRCAmJiBkX3RvcCA8IENPT05DT0xPUl9USFJFU0hPTEQpIHsKKyAgICAgICAgQ29vbl9CZXppZXIgbTE7CisgICAgICAgIG0xLkJlemllckludGVycG9sKEQxLCBEMiwgQzEsIEMyKTsKKyAgICAgICAgeV9zY2FsZSAqPSAyOworICAgICAgICBib3R0b20gKj0gMjsKKyAgICAgICAgRHJhdyh4X3NjYWxlLCB5X3NjYWxlLCBsZWZ0LCBib3R0b20sIEMxLCBtMSwgRDEuZmlyc3RfaGFsZigpLAorICAgICAgICAgICAgIEQyLmZpcnN0X2hhbGYoKSk7CisgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tICsgMSwgbTEsIEMyLCBEMS5zZWNvbmRfaGFsZigpLAorICAgICAgICAgICAgIEQyLnNlY29uZF9oYWxmKCkpOworICAgICAgfSBlbHNlIGlmIChkX2xlZnQgPCBDT09OQ09MT1JfVEhSRVNIT0xEICYmCisgICAgICAgICAgICAgICAgIGRfcmlnaHQgPCBDT09OQ09MT1JfVEhSRVNIT0xEKSB7CisgICAgICAgIENvb25fQmV6aWVyIG0yOworICAgICAgICBtMi5CZXppZXJJbnRlcnBvbChDMSwgQzIsIEQxLCBEMik7CisgICAgICAgIHhfc2NhbGUgKj0gMjsKKyAgICAgICAgbGVmdCAqPSAyOworICAgICAgICBEcmF3KHhfc2NhbGUsIHlfc2NhbGUsIGxlZnQsIGJvdHRvbSwgQzEuZmlyc3RfaGFsZigpLCBDMi5maXJzdF9oYWxmKCksCisgICAgICAgICAgICAgRDEsIG0yKTsKKyAgICAgICAgRHJhdyh4X3NjYWxlLCB5X3NjYWxlLCBsZWZ0ICsgMSwgYm90dG9tLCBDMS5zZWNvbmRfaGFsZigpLAorICAgICAgICAgICAgIEMyLnNlY29uZF9oYWxmKCksIG0yLCBEMik7CisgICAgICB9IGVsc2UgeworICAgICAgICBDb29uX0JlemllciBtMSwgbTI7CisgICAgICAgIG0xLkJlemllckludGVycG9sKEQxLCBEMiwgQzEsIEMyKTsKKyAgICAgICAgbTIuQmV6aWVySW50ZXJwb2woQzEsIEMyLCBEMSwgRDIpOworICAgICAgICBDb29uX0JlemllciBtMWYgPSBtMS5maXJzdF9oYWxmKCk7CisgICAgICAgIENvb25fQmV6aWVyIG0xcyA9IG0xLnNlY29uZF9oYWxmKCk7CisgICAgICAgIENvb25fQmV6aWVyIG0yZiA9IG0yLmZpcnN0X2hhbGYoKTsKKyAgICAgICAgQ29vbl9CZXppZXIgbTJzID0gbTIuc2Vjb25kX2hhbGYoKTsKKyAgICAgICAgeF9zY2FsZSAqPSAyOworICAgICAgICB5X3NjYWxlICo9IDI7CisgICAgICAgIGxlZnQgKj0gMjsKKyAgICAgICAgYm90dG9tICo9IDI7CisgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tLCBDMS5maXJzdF9oYWxmKCksIG0xZiwKKyAgICAgICAgICAgICBEMS5maXJzdF9oYWxmKCksIG0yZik7CisgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tICsgMSwgbTFmLCBDMi5maXJzdF9oYWxmKCksCisgICAgICAgICAgICAgRDEuc2Vjb25kX2hhbGYoKSwgbTJzKTsKKyAgICAgICAgRHJhdyh4X3NjYWxlLCB5X3NjYWxlLCBsZWZ0ICsgMSwgYm90dG9tLCBDMS5zZWNvbmRfaGFsZigpLCBtMXMsIG0yZiwKKyAgICAgICAgICAgICBEMi5maXJzdF9oYWxmKCkpOworICAgICAgICBEcmF3KHhfc2NhbGUsIHlfc2NhbGUsIGxlZnQgKyAxLCBib3R0b20gKyAxLCBtMXMsIEMyLnNlY29uZF9oYWxmKCksIG0ycywKKyAgICAgICAgICAgICBEMi5zZWNvbmRfaGFsZigpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH07CiAKLUZYX0JPT0wgX0NoZWNrQ29vblRlbnNvclBhcmEoY29uc3QgQ1BERl9NZXNoU3RyZWFtICZzdHJlYW0pCi17Ci0gICAgRlhfQk9PTCBiQ29vckJpdHMgPSAoIHN0cmVhbS5tX25Db29yZEJpdHM9PSAxICAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSAyICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDQgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db29yZEJpdHMgPT0gOCAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSAxMiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDE2IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db29yZEJpdHMgPT0gMjQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSAzMiAgICk7CitGWF9CT09MIF9DaGVja0Nvb25UZW5zb3JQYXJhKGNvbnN0IENQREZfTWVzaFN0cmVhbSYgc3RyZWFtKSB7CisgIEZYX0JPT0wgYkNvb3JCaXRzID0gKHN0cmVhbS5tX25Db29yZEJpdHMgPT0gMSB8fCBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSA0IHx8IHN0cmVhbS5tX25Db29yZEJpdHMgPT0gOCB8fAorICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDEyIHx8IHN0cmVhbS5tX25Db29yZEJpdHMgPT0gMTYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSAyNCB8fCBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDMyKTsKIAotICAgIEZYX0JPT0wgYkNvbXBCaXRzID0gKCBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMSAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvbXBCaXRzID09IDIgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSA0ICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gOCAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvbXBCaXRzID09IDEyIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSAxNiAgICk7CisgIEZYX0JPT0wgYkNvbXBCaXRzID0gKHN0cmVhbS5tX25Db21wQml0cyA9PSAxIHx8IHN0cmVhbS5tX25Db21wQml0cyA9PSAyIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSA0IHx8IHN0cmVhbS5tX25Db21wQml0cyA9PSA4IHx8CisgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSAxMiB8fCBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMTYpOwogCi0gICAgRlhfQk9PTCBiRmxhZ0JpdHMgPSAoIHN0cmVhbS5tX25GbGFnQml0cyA9PSAyICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uRmxhZ0JpdHMgPT0gNCAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkZsYWdCaXRzID09IDggICAgKTsKKyAgRlhfQk9PTCBiRmxhZ0JpdHMgPSAoc3RyZWFtLm1fbkZsYWdCaXRzID09IDIgfHwgc3RyZWFtLm1fbkZsYWdCaXRzID09IDQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkZsYWdCaXRzID09IDgpOwogCi0gICAgcmV0dXJuIGJDb29yQml0cyAmJiBiQ29tcEJpdHMgJiYgYkZsYWdCaXRzOworICByZXR1cm4gYkNvb3JCaXRzICYmIGJDb21wQml0cyAmJiBiRmxhZ0JpdHM7CiB9CiAKLXN0YXRpYyB2b2lkIF9EcmF3Q29vblBhdGNoTWVzaGVzKEZYX0JPT0wgYlRlbnNvciwgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTLCBpbnQgZmlsbF9tb2RlLCBpbnQgYWxwaGEpCi17Ci0gICAgQVNTRVJUKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOwotICAgIGlmIChwU2hhZGluZ1N0cmVhbS0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfRnhnZURldmljZSBkZXZpY2U7Ci0gICAgZGV2aWNlLkF0dGFjaChwQml0bWFwKTsKLSAgICBDUERGX01lc2hTdHJlYW0gc3RyZWFtOwotICAgIGlmICghc3RyZWFtLkxvYWQocFNoYWRpbmdTdHJlYW0sIHBGdW5jcywgbkZ1bmNzLCBwQ1MpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CitzdGF0aWMgdm9pZCBfRHJhd0Nvb25QYXRjaE1lc2hlcyhGWF9CT09MIGJUZW5zb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhKSB7CisgIEFTU0VSVChwQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKTsKKyAgaWYgKHBTaGFkaW5nU3RyZWFtLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfRnhnZURldmljZSBkZXZpY2U7CisgIGRldmljZS5BdHRhY2gocEJpdG1hcCk7CisgIENQREZfTWVzaFN0cmVhbSBzdHJlYW07CisgIGlmICghc3RyZWFtLkxvYWQocFNoYWRpbmdTdHJlYW0sIHBGdW5jcywgbkZ1bmNzLCBwQ1MpKSB7CisgICAgcmV0dXJuOworICB9CiAKLSAgICBpZiAoIV9DaGVja0Nvb25UZW5zb3JQYXJhKHN0cmVhbSkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKyAgaWYgKCFfQ2hlY2tDb29uVGVuc29yUGFyYShzdHJlYW0pKSB7CisgICAgcmV0dXJuOworICB9CiAKLSAgICBDUERGX1BhdGNoRHJhd2VyIHBhdGNoOwotICAgIHBhdGNoLmFscGhhID0gYWxwaGE7Ci0gICAgcGF0Y2gucERldmljZSA9ICZkZXZpY2U7Ci0gICAgcGF0Y2guZmlsbF9tb2RlID0gZmlsbF9tb2RlOwotICAgIHBhdGNoLnBhdGguU2V0UG9pbnRDb3VudCgxMyk7Ci0gICAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gcGF0Y2gucGF0aC5HZXRQb2ludHMoKTsKLSAgICBwUG9pbnRzWzBdLm1fRmxhZyA9IEZYUFRfTU9WRVRPOwotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMTM7IGkgKyspIHsKLSAgICAgICAgcFBvaW50c1tpXS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOwotICAgIH0KLSAgICBDRlhfRmxvYXRQb2ludCBjb29yZHNbMTZdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkgKyspIHsKLSAgICAgICAgY29vcmRzW2ldLlNldCgwLjBmLCAwLjBmKTsKLSAgICB9CisgIENQREZfUGF0Y2hEcmF3ZXIgcGF0Y2g7CisgIHBhdGNoLmFscGhhID0gYWxwaGE7CisgIHBhdGNoLnBEZXZpY2UgPSAmZGV2aWNlOworICBwYXRjaC5maWxsX21vZGUgPSBmaWxsX21vZGU7CisgIHBhdGNoLnBhdGguU2V0UG9pbnRDb3VudCgxMyk7CisgIEZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBhdGNoLnBhdGguR2V0UG9pbnRzKCk7CisgIHBQb2ludHNbMF0ubV9GbGFnID0gRlhQVF9NT1ZFVE87CisgIGZvciAoaW50IGkgPSAxOyBpIDwgMTM7IGkrKykgeworICAgIHBQb2ludHNbaV0ubV9GbGFnID0gRlhQVF9CRVpJRVJUTzsKKyAgfQorICBDRlhfRmxvYXRQb2ludCBjb29yZHNbMTZdOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBjb29yZHNbaV0uU2V0KDAuMGYsIDAuMGYpOworICB9CiAKLSAgICBpbnQgcG9pbnRfY291bnQgPSBiVGVuc29yID8gMTYgOiAxMjsKLSAgICB3aGlsZSAoIXN0cmVhbS5tX0JpdFN0cmVhbS5Jc0VPRigpKSB7Ci0gICAgICAgIEZYX0RXT1JEIGZsYWcgPSBzdHJlYW0uR2V0RmxhZygpOwotICAgICAgICBpbnQgaVN0YXJ0UG9pbnQgPSAwLCBpU3RhcnRDb2xvciA9IDAsIGkgPSAwOwotICAgICAgICBpZiAoZmxhZykgewotICAgICAgICAgICAgaVN0YXJ0UG9pbnQgPSA0OwotICAgICAgICAgICAgaVN0YXJ0Q29sb3IgPSAyOwotICAgICAgICAgICAgQ0ZYX0Zsb2F0UG9pbnQgdGVtcENvb3Jkc1s0XTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgdGVtcENvb3Jkc1tpXSA9IGNvb3Jkc1soZmxhZyAqIDMgKyBpKSAlIDEyXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYU1lTX21lbWNweShjb29yZHMsIHRlbXBDb29yZHMsIHNpemVvZihDRlhfRmxvYXRQb2ludCkgKiA0KTsKLSAgICAgICAgICAgIENvb25fQ29sb3IgdGVtcENvbG9yc1syXTsKLSAgICAgICAgICAgIHRlbXBDb2xvcnNbMF0gPSBwYXRjaC5wYXRjaF9jb2xvcnNbZmxhZ107Ci0gICAgICAgICAgICB0ZW1wQ29sb3JzWzFdID0gcGF0Y2gucGF0Y2hfY29sb3JzWyhmbGFnICsgMSkgJSA0XTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShwYXRjaC5wYXRjaF9jb2xvcnMsIHRlbXBDb2xvcnMsIHNpemVvZihDb29uX0NvbG9yKSAqIDIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IGlTdGFydFBvaW50OyBpIDwgcG9pbnRfY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIHN0cmVhbS5HZXRDb29yZHMoY29vcmRzW2ldLngsIGNvb3Jkc1tpXS55KTsKLSAgICAgICAgICAgIHBPYmplY3QyQml0bWFwLT5UcmFuc2Zvcm0oY29vcmRzW2ldLngsIGNvb3Jkc1tpXS55KTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSBpU3RhcnRDb2xvcjsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHI9MC4wZiwgZz0wLjBmLCBiPTAuMGY7Ci0gICAgICAgICAgICBzdHJlYW0uR2V0Q29sb3IociwgZywgYik7Ci0gICAgICAgICAgICBwYXRjaC5wYXRjaF9jb2xvcnNbaV0uY29tcFswXSA9IChpbnQzMl90KShyICogMjU1KTsKLSAgICAgICAgICAgIHBhdGNoLnBhdGNoX2NvbG9yc1tpXS5jb21wWzFdID0gKGludDMyX3QpKGcgKiAyNTUpOwotICAgICAgICAgICAgcGF0Y2gucGF0Y2hfY29sb3JzW2ldLmNvbXBbMl0gPSAoaW50MzJfdCkoYiAqIDI1NSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCBiYm94ID0gQ0ZYX0Zsb2F0UmVjdDo6R2V0QkJveChjb29yZHMsIHBvaW50X2NvdW50KTsKLSAgICAgICAgaWYgKGJib3gucmlnaHQgPD0gMCB8fCBiYm94LmxlZnQgPj0gKEZYX0ZMT0FUKXBCaXRtYXAtPkdldFdpZHRoKCkgfHwgYmJveC50b3AgPD0gMCB8fAotICAgICAgICAgICAgICAgIGJib3guYm90dG9tID49IChGWF9GTE9BVClwQml0bWFwLT5HZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ29vbl9CZXppZXIgQzEsIEMyLCBEMSwgRDI7Ci0gICAgICAgIEMxLkZyb21Qb2ludHMoY29vcmRzWzBdLngsIGNvb3Jkc1swXS55LCBjb29yZHNbMTFdLngsIGNvb3Jkc1sxMV0ueSwgY29vcmRzWzEwXS54LCBjb29yZHNbMTBdLnksCi0gICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzldLngsIGNvb3Jkc1s5XS55KTsKLSAgICAgICAgQzIuRnJvbVBvaW50cyhjb29yZHNbM10ueCwgY29vcmRzWzNdLnksIGNvb3Jkc1s0XS54LCBjb29yZHNbNF0ueSwgY29vcmRzWzVdLngsIGNvb3Jkc1s1XS55LAotICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1s2XS54LCBjb29yZHNbNl0ueSk7Ci0gICAgICAgIEQxLkZyb21Qb2ludHMoY29vcmRzWzBdLngsIGNvb3Jkc1swXS55LCBjb29yZHNbMV0ueCwgY29vcmRzWzFdLnksIGNvb3Jkc1syXS54LCBjb29yZHNbMl0ueSwKLSAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbM10ueCwgY29vcmRzWzNdLnkpOwotICAgICAgICBEMi5Gcm9tUG9pbnRzKGNvb3Jkc1s5XS54LCBjb29yZHNbOV0ueSwgY29vcmRzWzhdLngsIGNvb3Jkc1s4XS55LCBjb29yZHNbN10ueCwgY29vcmRzWzddLnksCi0gICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzZdLngsIGNvb3Jkc1s2XS55KTsKLSAgICAgICAgcGF0Y2guRHJhdygxLCAxLCAwLCAwLCBDMSwgQzIsIEQxLCBEMik7CisgIGludCBwb2ludF9jb3VudCA9IGJUZW5zb3IgPyAxNiA6IDEyOworICB3aGlsZSAoIXN0cmVhbS5tX0JpdFN0cmVhbS5Jc0VPRigpKSB7CisgICAgRlhfRFdPUkQgZmxhZyA9IHN0cmVhbS5HZXRGbGFnKCk7CisgICAgaW50IGlTdGFydFBvaW50ID0gMCwgaVN0YXJ0Q29sb3IgPSAwLCBpID0gMDsKKyAgICBpZiAoZmxhZykgeworICAgICAgaVN0YXJ0UG9pbnQgPSA0OworICAgICAgaVN0YXJ0Q29sb3IgPSAyOworICAgICAgQ0ZYX0Zsb2F0UG9pbnQgdGVtcENvb3Jkc1s0XTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgdGVtcENvb3Jkc1tpXSA9IGNvb3Jkc1soZmxhZyAqIDMgKyBpKSAlIDEyXTsKKyAgICAgIH0KKyAgICAgIEZYU1lTX21lbWNweShjb29yZHMsIHRlbXBDb29yZHMsIHNpemVvZihDRlhfRmxvYXRQb2ludCkgKiA0KTsKKyAgICAgIENvb25fQ29sb3IgdGVtcENvbG9yc1syXTsKKyAgICAgIHRlbXBDb2xvcnNbMF0gPSBwYXRjaC5wYXRjaF9jb2xvcnNbZmxhZ107CisgICAgICB0ZW1wQ29sb3JzWzFdID0gcGF0Y2gucGF0Y2hfY29sb3JzWyhmbGFnICsgMSkgJSA0XTsKKyAgICAgIEZYU1lTX21lbWNweShwYXRjaC5wYXRjaF9jb2xvcnMsIHRlbXBDb2xvcnMsIHNpemVvZihDb29uX0NvbG9yKSAqIDIpOwogICAgIH0KKyAgICBmb3IgKGkgPSBpU3RhcnRQb2ludDsgaSA8IHBvaW50X2NvdW50OyBpKyspIHsKKyAgICAgIHN0cmVhbS5HZXRDb29yZHMoY29vcmRzW2ldLngsIGNvb3Jkc1tpXS55KTsKKyAgICAgIHBPYmplY3QyQml0bWFwLT5UcmFuc2Zvcm0oY29vcmRzW2ldLngsIGNvb3Jkc1tpXS55KTsKKyAgICB9CisgICAgZm9yIChpID0gaVN0YXJ0Q29sb3I7IGkgPCA0OyBpKyspIHsKKyAgICAgIEZYX0ZMT0FUIHIgPSAwLjBmLCBnID0gMC4wZiwgYiA9IDAuMGY7CisgICAgICBzdHJlYW0uR2V0Q29sb3IociwgZywgYik7CisgICAgICBwYXRjaC5wYXRjaF9jb2xvcnNbaV0uY29tcFswXSA9IChpbnQzMl90KShyICogMjU1KTsKKyAgICAgIHBhdGNoLnBhdGNoX2NvbG9yc1tpXS5jb21wWzFdID0gKGludDMyX3QpKGcgKiAyNTUpOworICAgICAgcGF0Y2gucGF0Y2hfY29sb3JzW2ldLmNvbXBbMl0gPSAoaW50MzJfdCkoYiAqIDI1NSk7CisgICAgfQorICAgIENGWF9GbG9hdFJlY3QgYmJveCA9IENGWF9GbG9hdFJlY3Q6OkdldEJCb3goY29vcmRzLCBwb2ludF9jb3VudCk7CisgICAgaWYgKGJib3gucmlnaHQgPD0gMCB8fCBiYm94LmxlZnQgPj0gKEZYX0ZMT0FUKXBCaXRtYXAtPkdldFdpZHRoKCkgfHwKKyAgICAgICAgYmJveC50b3AgPD0gMCB8fCBiYm94LmJvdHRvbSA+PSAoRlhfRkxPQVQpcEJpdG1hcC0+R2V0SGVpZ2h0KCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDb29uX0JlemllciBDMSwgQzIsIEQxLCBEMjsKKyAgICBDMS5Gcm9tUG9pbnRzKGNvb3Jkc1swXS54LCBjb29yZHNbMF0ueSwgY29vcmRzWzExXS54LCBjb29yZHNbMTFdLnksCisgICAgICAgICAgICAgICAgICBjb29yZHNbMTBdLngsIGNvb3Jkc1sxMF0ueSwgY29vcmRzWzldLngsIGNvb3Jkc1s5XS55KTsKKyAgICBDMi5Gcm9tUG9pbnRzKGNvb3Jkc1szXS54LCBjb29yZHNbM10ueSwgY29vcmRzWzRdLngsIGNvb3Jkc1s0XS55LAorICAgICAgICAgICAgICAgICAgY29vcmRzWzVdLngsIGNvb3Jkc1s1XS55LCBjb29yZHNbNl0ueCwgY29vcmRzWzZdLnkpOworICAgIEQxLkZyb21Qb2ludHMoY29vcmRzWzBdLngsIGNvb3Jkc1swXS55LCBjb29yZHNbMV0ueCwgY29vcmRzWzFdLnksCisgICAgICAgICAgICAgICAgICBjb29yZHNbMl0ueCwgY29vcmRzWzJdLnksIGNvb3Jkc1szXS54LCBjb29yZHNbM10ueSk7CisgICAgRDIuRnJvbVBvaW50cyhjb29yZHNbOV0ueCwgY29vcmRzWzldLnksIGNvb3Jkc1s4XS54LCBjb29yZHNbOF0ueSwKKyAgICAgICAgICAgICAgICAgIGNvb3Jkc1s3XS54LCBjb29yZHNbN10ueSwgY29vcmRzWzZdLngsIGNvb3Jkc1s2XS55KTsKKyAgICBwYXRjaC5EcmF3KDEsIDEsIDAsIDAsIEMxLCBDMiwgRDEsIEQyKTsKKyAgfQogfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd1NoYWRpbmcoQ1BERl9TaGFkaW5nUGF0dGVybiogcFBhdHRlcm4sIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUJiBjbGlwX3JlY3QsIGludCBhbHBoYSwgRlhfQk9PTCBiQWxwaGFNb2RlKQotewotICAgIENQREZfRnVuY3Rpb24qKiBwRnVuY3MgPSBwUGF0dGVybi0+bV9wRnVuY3Rpb25zOwotICAgIGludCBuRnVuY3MgPSBwUGF0dGVybi0+bV9uRnVuY3M7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYXR0ZXJuLT5tX3BTaGFkaW5nT2JqLT5HZXREaWN0KCk7Ci0gICAgQ1BERl9Db2xvclNwYWNlKiBwQ29sb3JTcGFjZSA9IHBQYXR0ZXJuLT5tX3BDUzsKLSAgICBpZiAocENvbG9yU3BhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Cit2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3U2hhZGluZyhDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUJiBjbGlwX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbHBoYU1vZGUpIHsKKyAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcyA9IHBQYXR0ZXJuLT5tX3BGdW5jdGlvbnM7CisgIGludCBuRnVuY3MgPSBwUGF0dGVybi0+bV9uRnVuY3M7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGF0dGVybi0+bV9wU2hhZGluZ09iai0+R2V0RGljdCgpOworICBDUERGX0NvbG9yU3BhY2UqIHBDb2xvclNwYWNlID0gcFBhdHRlcm4tPm1fcENTOworICBpZiAocENvbG9yU3BhY2UgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9BUkdCIGJhY2tncm91bmQgPSAwOworICBpZiAoIXBQYXR0ZXJuLT5tX2JTaGFkaW5nT2JqICYmCisgICAgICBwUGF0dGVybi0+bV9wU2hhZGluZ09iai0+R2V0RGljdCgpLT5LZXlFeGlzdChGWF9CU1RSQygiQmFja2dyb3VuZCIpKSkgeworICAgIENQREZfQXJyYXkqIHBCYWNrQ29sb3IgPQorICAgICAgICBwUGF0dGVybi0+bV9wU2hhZGluZ09iai0+R2V0RGljdCgpLT5HZXRBcnJheShGWF9CU1RSQygiQmFja2dyb3VuZCIpKTsKKyAgICBpZiAocEJhY2tDb2xvciAmJgorICAgICAgICBwQmFja0NvbG9yLT5HZXRDb3VudCgpID49IChGWF9EV09SRClwQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkpIHsKKyAgICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBjb21wcyhwQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCk7IGkrKykgeworICAgICAgICBjb21wc1tpXSA9IHBCYWNrQ29sb3ItPkdldE51bWJlcihpKTsKKyAgICAgIH0KKyAgICAgIEZYX0ZMT0FUIFIgPSAwLjBmLCBHID0gMC4wZiwgQiA9IDAuMGY7CisgICAgICBwQ29sb3JTcGFjZS0+R2V0UkdCKGNvbXBzLCBSLCBHLCBCKTsKKyAgICAgIGJhY2tncm91bmQgPSBBcmdiRW5jb2RlKDI1NSwgKGludDMyX3QpKFIgKiAyNTUpLCAoaW50MzJfdCkoRyAqIDI1NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkoQiAqIDI1NSkpOwogICAgIH0KLSAgICBGWF9BUkdCIGJhY2tncm91bmQgPSAwOwotICAgIGlmICghcFBhdHRlcm4tPm1fYlNoYWRpbmdPYmogJiYgcFBhdHRlcm4tPm1fcFNoYWRpbmdPYmotPkdldERpY3QoKS0+S2V5RXhpc3QoRlhfQlNUUkMoIkJhY2tncm91bmQiKSkpIHsKLSAgICAgICAgQ1BERl9BcnJheSogcEJhY2tDb2xvciA9IHBQYXR0ZXJuLT5tX3BTaGFkaW5nT2JqLT5HZXREaWN0KCktPkdldEFycmF5KEZYX0JTVFJDKCJCYWNrZ3JvdW5kIikpOwotICAgICAgICBpZiAocEJhY2tDb2xvciAmJiBwQmFja0NvbG9yLT5HZXRDb3VudCgpID49IChGWF9EV09SRClwQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkpIHsKLSAgICAgICAgICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBjb21wcyhwQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCk7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBjb21wc1tpXSA9IHBCYWNrQ29sb3ItPkdldE51bWJlcihpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0ZMT0FUIFIgPSAwLjBmLCBHID0gMC4wZiwgQiA9IDAuMGY7Ci0gICAgICAgICAgICBwQ29sb3JTcGFjZS0+R2V0UkdCKGNvbXBzLCBSLCBHLCBCKTsKLSAgICAgICAgICAgIGJhY2tncm91bmQgPSBBcmdiRW5jb2RlKDI1NSwgKGludDMyX3QpKFIgKiAyNTUpLCAoaW50MzJfdCkoRyAqIDI1NSksIChpbnQzMl90KShCICogMjU1KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiQkJveCIpKSkgewotICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwRGljdC0+R2V0UmVjdChGWF9CU1RSQygiQkJveCIpKTsKLSAgICAgICAgcmVjdC5UcmFuc2Zvcm0ocE1hdHJpeCk7Ci0gICAgICAgIGNsaXBfcmVjdC5JbnRlcnNlY3QocmVjdC5HZXRPdXR0ZXJSZWN0KCkpOwotICAgIH0KLSAgICBDUERGX0RldmljZUJ1ZmZlciBidWZmZXI7Ci0gICAgYnVmZmVyLkluaXRpYWxpemUobV9wQ29udGV4dCwgbV9wRGV2aWNlLCAmY2xpcF9yZWN0LCBtX3BDdXJPYmosIDE1MCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBGaW5hbE1hdHJpeCA9ICpwTWF0cml4OwotICAgIEZpbmFsTWF0cml4LkNvbmNhdCgqYnVmZmVyLkdldE1hdHJpeCgpKTsKLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBidWZmZXIuR2V0Qml0bWFwKCk7Ci0gICAgaWYgKHBCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwQml0bWFwLT5DbGVhcihiYWNrZ3JvdW5kKTsKLSAgICBpbnQgZmlsbF9tb2RlID0gbV9PcHRpb25zLm1fRmxhZ3M7Ci0gICAgc3dpdGNoIChwUGF0dGVybi0+bV9TaGFkaW5nVHlwZSkgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBfRHJhd0Z1bmNTaGFkaW5nKHBCaXRtYXAsICZGaW5hbE1hdHJpeCwgcERpY3QsIHBGdW5jcywgbkZ1bmNzLCBwQ29sb3JTcGFjZSwgYWxwaGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIF9EcmF3QXhpYWxTaGFkaW5nKHBCaXRtYXAsICZGaW5hbE1hdHJpeCwgcERpY3QsIHBGdW5jcywgbkZ1bmNzLCBwQ29sb3JTcGFjZSwgYWxwaGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIF9EcmF3UmFkaWFsU2hhZGluZyhwQml0bWFwLCAmRmluYWxNYXRyaXgsIHBEaWN0LCBwRnVuY3MsIG5GdW5jcywgcENvbG9yU3BhY2UsIGFscGhhKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6IHsKLSAgICAgICAgICAgICAgICBfRHJhd0ZyZWVHb3VyYXVkU2hhZGluZyhwQml0bWFwLCAmRmluYWxNYXRyaXgsIChDUERGX1N0cmVhbSopcFBhdHRlcm4tPm1fcFNoYWRpbmdPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZ1bmNzLCBuRnVuY3MsIHBDb2xvclNwYWNlLCBhbHBoYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OiB7Ci0gICAgICAgICAgICAgICAgX0RyYXdMYXR0aWNlR291cmF1ZFNoYWRpbmcocEJpdG1hcCwgJkZpbmFsTWF0cml4LCAoQ1BERl9TdHJlYW0qKXBQYXR0ZXJuLT5tX3BTaGFkaW5nT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGdW5jcywgbkZ1bmNzLCBwQ29sb3JTcGFjZSwgYWxwaGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgY2FzZSA3OiB7Ci0gICAgICAgICAgICAgICAgX0RyYXdDb29uUGF0Y2hNZXNoZXMocFBhdHRlcm4tPm1fU2hhZGluZ1R5cGUgLSA2LCBwQml0bWFwLCAmRmluYWxNYXRyaXgsIChDUERGX1N0cmVhbSopcFBhdHRlcm4tPm1fcFNoYWRpbmdPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZ1bmNzLCBuRnVuY3MsIHBDb2xvclNwYWNlLCBmaWxsX21vZGUsIGFscGhhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoYkFscGhhTW9kZSkgewotICAgICAgICBwQml0bWFwLT5Mb2FkQ2hhbm5lbChGWERJQl9SZWQsIHBCaXRtYXAsIEZYRElCX0FscGhhKTsKLSAgICB9Ci0gICAgaWYgKG1fT3B0aW9ucy5tX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfR1JBWSkgewotICAgICAgICBwQml0bWFwLT5Db252ZXJ0Q29sb3JTY2FsZShtX09wdGlvbnMubV9Gb3JlQ29sb3IsIG1fT3B0aW9ucy5tX0JhY2tDb2xvcik7Ci0gICAgfQotICAgIGJ1ZmZlci5PdXRwdXRUb0RldmljZSgpOworICB9CisgIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIkJCb3giKSkpIHsKKyAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwRGljdC0+R2V0UmVjdChGWF9CU1RSQygiQkJveCIpKTsKKyAgICByZWN0LlRyYW5zZm9ybShwTWF0cml4KTsKKyAgICBjbGlwX3JlY3QuSW50ZXJzZWN0KHJlY3QuR2V0T3V0dGVyUmVjdCgpKTsKKyAgfQorICBDUERGX0RldmljZUJ1ZmZlciBidWZmZXI7CisgIGJ1ZmZlci5Jbml0aWFsaXplKG1fcENvbnRleHQsIG1fcERldmljZSwgJmNsaXBfcmVjdCwgbV9wQ3VyT2JqLCAxNTApOworICBDRlhfQWZmaW5lTWF0cml4IEZpbmFsTWF0cml4ID0gKnBNYXRyaXg7CisgIEZpbmFsTWF0cml4LkNvbmNhdCgqYnVmZmVyLkdldE1hdHJpeCgpKTsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gYnVmZmVyLkdldEJpdG1hcCgpOworICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBwQml0bWFwLT5DbGVhcihiYWNrZ3JvdW5kKTsKKyAgaW50IGZpbGxfbW9kZSA9IG1fT3B0aW9ucy5tX0ZsYWdzOworICBzd2l0Y2ggKHBQYXR0ZXJuLT5tX1NoYWRpbmdUeXBlKSB7CisgICAgY2FzZSAxOgorICAgICAgX0RyYXdGdW5jU2hhZGluZyhwQml0bWFwLCAmRmluYWxNYXRyaXgsIHBEaWN0LCBwRnVuY3MsIG5GdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgcENvbG9yU3BhY2UsIGFscGhhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9EcmF3QXhpYWxTaGFkaW5nKHBCaXRtYXAsICZGaW5hbE1hdHJpeCwgcERpY3QsIHBGdW5jcywgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgcENvbG9yU3BhY2UsIGFscGhhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIF9EcmF3UmFkaWFsU2hhZGluZyhwQml0bWFwLCAmRmluYWxNYXRyaXgsIHBEaWN0LCBwRnVuY3MsIG5GdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ29sb3JTcGFjZSwgYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OiB7CisgICAgICBfRHJhd0ZyZWVHb3VyYXVkU2hhZGluZyhwQml0bWFwLCAmRmluYWxNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ1BERl9TdHJlYW0qKXBQYXR0ZXJuLT5tX3BTaGFkaW5nT2JqLCBwRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRnVuY3MsIHBDb2xvclNwYWNlLCBhbHBoYSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIDU6IHsKKyAgICAgIF9EcmF3TGF0dGljZUdvdXJhdWRTaGFkaW5nKHBCaXRtYXAsICZGaW5hbE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDUERGX1N0cmVhbSopcFBhdHRlcm4tPm1fcFNoYWRpbmdPYmosIHBGdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5GdW5jcywgcENvbG9yU3BhY2UsIGFscGhhKTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgNjoKKyAgICBjYXNlIDc6IHsKKyAgICAgIF9EcmF3Q29vblBhdGNoTWVzaGVzKHBQYXR0ZXJuLT5tX1NoYWRpbmdUeXBlIC0gNiwgcEJpdG1hcCwgJkZpbmFsTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKENQREZfU3RyZWFtKilwUGF0dGVybi0+bV9wU2hhZGluZ09iaiwgcEZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbkZ1bmNzLCBwQ29sb3JTcGFjZSwgZmlsbF9tb2RlLCBhbHBoYSk7CisgICAgfSBicmVhazsKKyAgfQorICBpZiAoYkFscGhhTW9kZSkgeworICAgIHBCaXRtYXAtPkxvYWRDaGFubmVsKEZYRElCX1JlZCwgcEJpdG1hcCwgRlhESUJfQWxwaGEpOworICB9CisgIGlmIChtX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0dSQVkpIHsKKyAgICBwQml0bWFwLT5Db252ZXJ0Q29sb3JTY2FsZShtX09wdGlvbnMubV9Gb3JlQ29sb3IsIG1fT3B0aW9ucy5tX0JhY2tDb2xvcik7CisgIH0KKyAgYnVmZmVyLk91dHB1dFRvRGV2aWNlKCk7CiB9Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3U2hhZGluZ1BhdHRlcm4oQ1BERl9TaGFkaW5nUGF0dGVybiogcGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0cm9rZSkKLXsKLSAgICBpZiAoIXBhdHRlcm4tPkxvYWQoKSkgewotICAgICAgICByZXR1cm47Cit2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3U2hhZGluZ1BhdHRlcm4oQ1BERl9TaGFkaW5nUGF0dGVybiogcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cm9rZSkgeworICBpZiAoIXBhdHRlcm4tPkxvYWQoKSkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOworICBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX1BBVEgpIHsKKyAgICBpZiAoIVNlbGVjdENsaXBQYXRoKChDUERGX1BhdGhPYmplY3QqKXBQYWdlT2JqLCBwT2JqMkRldmljZSwgYlN0cm9rZSkpIHsKKyAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0gICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9QQVRIKSB7Ci0gICAgICAgIGlmICghU2VsZWN0Q2xpcFBhdGgoKENQREZfUGF0aE9iamVjdCopcFBhZ2VPYmosIHBPYmoyRGV2aWNlLCBiU3Ryb2tlKSkgewotICAgICAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFKSB7Ci0gICAgICAgIEZYX1JFQ1QgcmVjdCA9IHBQYWdlT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKLSAgICAgICAgbV9wRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJlY3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfUkVDVCByZWN0OwotICAgIGlmIChHZXRPYmplY3RDbGlwcGVkUmVjdChwUGFnZU9iaiwgcE9iajJEZXZpY2UsIEZBTFNFLCByZWN0KSkgewotICAgICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4ID0gcGF0dGVybi0+bV9QYXR0ZXJuMkZvcm07Ci0gICAgbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICAgIEdldFNjYWxlZE1hdHJpeChtYXRyaXgpOwotICAgIGludCBhbHBoYSA9IHBQYWdlT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRBbHBoYShiU3Ryb2tlKTsKLSAgICBEcmF3U2hhZGluZyhwYXR0ZXJuLCAmbWF0cml4LCByZWN0LCBhbHBoYSwgbV9PcHRpb25zLm1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9BTFBIQSk7CisgIH0gZWxzZSBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFKSB7CisgICAgRlhfUkVDVCByZWN0ID0gcFBhZ2VPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOworICAgIG1fcERldmljZS0+U2V0Q2xpcF9SZWN0KCZyZWN0KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfUkVDVCByZWN0OworICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocFBhZ2VPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSwgcmVjdCkpIHsKICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOworICAgIHJldHVybjsKKyAgfQorICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCA9IHBhdHRlcm4tPm1fUGF0dGVybjJGb3JtOworICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CisgIEdldFNjYWxlZE1hdHJpeChtYXRyaXgpOworICBpbnQgYWxwaGEgPSBwUGFnZU9iai0+bV9HZW5lcmFsU3RhdGUuR2V0QWxwaGEoYlN0cm9rZSk7CisgIERyYXdTaGFkaW5nKHBhdHRlcm4sICZtYXRyaXgsIHJlY3QsIGFscGhhLAorICAgICAgICAgICAgICBtX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0FMUEhBKTsKKyAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKIH0KLUZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NTaGFkaW5nKENQREZfU2hhZGluZ09iamVjdCogcFNoYWRpbmdPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQotewotICAgIEZYX1JFQ1QgcmVjdCA9IHBTaGFkaW5nT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKLSAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7Ci0gICAgcmVjdC5JbnRlcnNlY3QoY2xpcF9ib3gpOwotICAgIGlmIChyZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXggPSBwU2hhZGluZ09iai0+bV9NYXRyaXg7Ci0gICAgbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICAgIERyYXdTaGFkaW5nKHBTaGFkaW5nT2JqLT5tX3BTaGFkaW5nLCAmbWF0cml4LCByZWN0LCBwU2hhZGluZ09iai0+bV9HZW5lcmFsU3RhdGUuR2V0QWxwaGEoRkFMU0UpLAotICAgICAgICAgICAgICAgIG1fT3B0aW9ucy5tX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfQUxQSEEpOworRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1NoYWRpbmcoQ1BERl9TaGFkaW5nT2JqZWN0KiBwU2hhZGluZ09iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKSB7CisgIEZYX1JFQ1QgcmVjdCA9IHBTaGFkaW5nT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKKyAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOworICByZWN0LkludGVyc2VjdChjbGlwX2JveCk7CisgIGlmIChyZWN0LklzRW1wdHkoKSkgewogICAgIHJldHVybiBUUlVFOworICB9CisgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4ID0gcFNoYWRpbmdPYmotPm1fTWF0cml4OworICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CisgIERyYXdTaGFkaW5nKHBTaGFkaW5nT2JqLT5tX3BTaGFkaW5nLCAmbWF0cml4LCByZWN0LAorICAgICAgICAgICAgICBwU2hhZGluZ09iai0+bV9HZW5lcmFsU3RhdGUuR2V0QWxwaGEoRkFMU0UpLAorICAgICAgICAgICAgICBtX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0FMUEhBKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1zdGF0aWMgQ0ZYX0RJQml0bWFwKiBEcmF3UGF0dGVybkJpdG1hcChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UaWxpbmdQYXR0ZXJuKiBwUGF0dGVybiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmbGFncykKLXsKLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIHBQYXR0ZXJuLT5tX2JDb2xvcmVkID8gRlhESUJfQXJnYiA6IEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICBkZWxldGUgcEJpdG1hcDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7Ci0gICAgYml0bWFwX2RldmljZS5BdHRhY2gocEJpdG1hcCk7Ci0gICAgcEJpdG1hcC0+Q2xlYXIoMCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBjZWxsX2Jib3ggPSBwUGF0dGVybi0+bV9CQm94OwotICAgIHBQYXR0ZXJuLT5tX1BhdHRlcm4yRm9ybS5UcmFuc2Zvcm1SZWN0KGNlbGxfYmJveCk7Ci0gICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybVJlY3QoY2VsbF9iYm94KTsKLSAgICBDRlhfRmxvYXRSZWN0IGJpdG1hcF9yZWN0KDAuMGYsIDAuMGYsIChGWF9GTE9BVCl3aWR0aCwgKEZYX0ZMT0FUKWhlaWdodCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtdEFkanVzdDsKLSAgICBtdEFkanVzdC5NYXRjaFJlY3QoYml0bWFwX3JlY3QsIGNlbGxfYmJveCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtdFBhdHRlcm4yQml0bWFwID0gKnBPYmplY3QyRGV2aWNlOwotICAgIG10UGF0dGVybjJCaXRtYXAuQ29uY2F0KG10QWRqdXN0KTsKLSAgICBDUERGX1JlbmRlck9wdGlvbnMgb3B0aW9uczsKLSAgICBpZiAoIXBQYXR0ZXJuLT5tX2JDb2xvcmVkKSB7Ci0gICAgICAgIG9wdGlvbnMubV9Db2xvck1vZGUgPSBSRU5ERVJfQ09MT1JfQUxQSEE7Ci0gICAgfQotICAgIGZsYWdzIHw9IFJFTkRFUl9GT1JDRV9IQUxGVE9ORTsKLSAgICBvcHRpb25zLm1fRmxhZ3MgPSBmbGFnczsKLSAgICBDUERGX1JlbmRlckNvbnRleHQgY29udGV4dDsKLSAgICBjb250ZXh0LkNyZWF0ZShwRG9jLCBwQ2FjaGUsIE5VTEwpOwotICAgIGNvbnRleHQuRHJhd09iamVjdExpc3QoJmJpdG1hcF9kZXZpY2UsIHBQYXR0ZXJuLT5tX3BGb3JtLCAmbXRQYXR0ZXJuMkJpdG1hcCwgJm9wdGlvbnMpOwotICAgIHJldHVybiBwQml0bWFwOworc3RhdGljIENGWF9ESUJpdG1hcCogRHJhd1BhdHRlcm5CaXRtYXAoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1RpbGluZ1BhdHRlcm4qIHBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7CisgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBQYXR0ZXJuLT5tX2JDb2xvcmVkID8gRlhESUJfQXJnYiA6IEZYRElCXzhicHBNYXNrKSkgeworICAgIGRlbGV0ZSBwQml0bWFwOworICAgIHJldHVybiBOVUxMOworICB9CisgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7CisgIGJpdG1hcF9kZXZpY2UuQXR0YWNoKHBCaXRtYXApOworICBwQml0bWFwLT5DbGVhcigwKTsKKyAgQ0ZYX0Zsb2F0UmVjdCBjZWxsX2Jib3ggPSBwUGF0dGVybi0+bV9CQm94OworICBwUGF0dGVybi0+bV9QYXR0ZXJuMkZvcm0uVHJhbnNmb3JtUmVjdChjZWxsX2Jib3gpOworICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtUmVjdChjZWxsX2Jib3gpOworICBDRlhfRmxvYXRSZWN0IGJpdG1hcF9yZWN0KDAuMGYsIDAuMGYsIChGWF9GTE9BVCl3aWR0aCwgKEZYX0ZMT0FUKWhlaWdodCk7CisgIENGWF9BZmZpbmVNYXRyaXggbXRBZGp1c3Q7CisgIG10QWRqdXN0Lk1hdGNoUmVjdChiaXRtYXBfcmVjdCwgY2VsbF9iYm94KTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtdFBhdHRlcm4yQml0bWFwID0gKnBPYmplY3QyRGV2aWNlOworICBtdFBhdHRlcm4yQml0bWFwLkNvbmNhdChtdEFkanVzdCk7CisgIENQREZfUmVuZGVyT3B0aW9ucyBvcHRpb25zOworICBpZiAoIXBQYXR0ZXJuLT5tX2JDb2xvcmVkKSB7CisgICAgb3B0aW9ucy5tX0NvbG9yTW9kZSA9IFJFTkRFUl9DT0xPUl9BTFBIQTsKKyAgfQorICBmbGFncyB8PSBSRU5ERVJfRk9SQ0VfSEFMRlRPTkU7CisgIG9wdGlvbnMubV9GbGFncyA9IGZsYWdzOworICBDUERGX1JlbmRlckNvbnRleHQgY29udGV4dDsKKyAgY29udGV4dC5DcmVhdGUocERvYywgcENhY2hlLCBOVUxMKTsKKyAgY29udGV4dC5EcmF3T2JqZWN0TGlzdCgmYml0bWFwX2RldmljZSwgcFBhdHRlcm4tPm1fcEZvcm0sICZtdFBhdHRlcm4yQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25zKTsKKyAgcmV0dXJuIHBCaXRtYXA7CiB9Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3VGlsaW5nUGF0dGVybihDUERGX1RpbGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKQotewotICAgIGlmICghcFBhdHRlcm4tPkxvYWQoKSkgewotICAgICAgICByZXR1cm47Cit2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3VGlsaW5nUGF0dGVybihDUERGX1RpbGluZ1BhdHRlcm4qIHBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tlKSB7CisgIGlmICghcFBhdHRlcm4tPkxvYWQoKSkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOworICBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX1BBVEgpIHsKKyAgICBpZiAoIVNlbGVjdENsaXBQYXRoKChDUERGX1BhdGhPYmplY3QqKXBQYWdlT2JqLCBwT2JqMkRldmljZSwgYlN0cm9rZSkpIHsKKyAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0gICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9QQVRIKSB7Ci0gICAgICAgIGlmICghU2VsZWN0Q2xpcFBhdGgoKENQREZfUGF0aE9iamVjdCopcFBhZ2VPYmosIHBPYmoyRGV2aWNlLCBiU3Ryb2tlKSkgewotICAgICAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFKSB7Ci0gICAgICAgIEZYX1JFQ1QgcmVjdCA9IHBQYWdlT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKLSAgICAgICAgbV9wRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJlY3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOwotICAgIGlmIChjbGlwX2JveC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfTWF0cml4IGRDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOwotICAgIEZYX0ZMT0FUIHNhID0gRlhTWVNfZmFicyhkQ1RNLmEpOwotICAgIEZYX0ZMT0FUIHNkID0gRlhTWVNfZmFicyhkQ1RNLmQpOwotICAgIGNsaXBfYm94LnJpZ2h0ID0gY2xpcF9ib3gubGVmdCArIChpbnQzMl90KUZYU1lTX2NlaWwoY2xpcF9ib3guV2lkdGgoKSAqIHNhKTsKLSAgICBjbGlwX2JveC5ib3R0b20gPSBjbGlwX2JveC50b3AgKyAoaW50MzJfdClGWFNZU19jZWlsKGNsaXBfYm94LkhlaWdodCgpICogc2QpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbXRQYXR0ZXJuMkRldmljZSA9IHBQYXR0ZXJuLT5tX1BhdHRlcm4yRm9ybTsKLSAgICBtdFBhdHRlcm4yRGV2aWNlLkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICAgIEdldFNjYWxlZE1hdHJpeChtdFBhdHRlcm4yRGV2aWNlKTsKLSAgICBGWF9CT09MIGJBbGlnbmVkID0gRkFMU0U7Ci0gICAgaWYgKHBQYXR0ZXJuLT5tX0JCb3gubGVmdCA9PSAwICYmIHBQYXR0ZXJuLT5tX0JCb3guYm90dG9tID09IDAgJiYKLSAgICAgICAgICAgIHBQYXR0ZXJuLT5tX0JCb3gucmlnaHQgPT0gcFBhdHRlcm4tPm1fWFN0ZXAgJiYgcFBhdHRlcm4tPm1fQkJveC50b3AgPT0gcFBhdHRlcm4tPm1fWVN0ZXAgJiYKLSAgICAgICAgICAgIChtdFBhdHRlcm4yRGV2aWNlLklzU2NhbGVkKCkgfHwgbXRQYXR0ZXJuMkRldmljZS5JczkwUm90YXRlZCgpKSkgewotICAgICAgICBiQWxpZ25lZCA9IFRSVUU7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgY2VsbF9iYm94ID0gcFBhdHRlcm4tPm1fQkJveDsKLSAgICBtdFBhdHRlcm4yRGV2aWNlLlRyYW5zZm9ybVJlY3QoY2VsbF9iYm94KTsKLSAgICBpbnQgd2lkdGggPSAoaW50KUZYU1lTX2NlaWwoY2VsbF9iYm94LldpZHRoKCkpOwotICAgIGludCBoZWlnaHQgPSAoaW50KUZYU1lTX2NlaWwoY2VsbF9iYm94LkhlaWdodCgpKTsKLSAgICBpZiAod2lkdGggPT0gMCkgewotICAgICAgICB3aWR0aCA9IDE7Ci0gICAgfQotICAgIGlmIChoZWlnaHQgPT0gMCkgewotICAgICAgICBoZWlnaHQgPSAxOwotICAgIH0KLSAgICBpbnQgbWluX2NvbCwgbWF4X2NvbCwgbWluX3JvdywgbWF4X3JvdzsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG10RGV2aWNlMlBhdHRlcm47Ci0gICAgbXREZXZpY2UyUGF0dGVybi5TZXRSZXZlcnNlKG10UGF0dGVybjJEZXZpY2UpOwotICAgIENGWF9GbG9hdFJlY3QgY2xpcF9ib3hfcChjbGlwX2JveCk7Ci0gICAgY2xpcF9ib3hfcC5UcmFuc2Zvcm0oJm10RGV2aWNlMlBhdHRlcm4pOwotICAgIG1pbl9jb2wgPSAoaW50KUZYU1lTX2NlaWwoRlhTWVNfRGl2KGNsaXBfYm94X3AubGVmdCAtIHBQYXR0ZXJuLT5tX0JCb3gucmlnaHQsIHBQYXR0ZXJuLT5tX1hTdGVwKSk7Ci0gICAgbWF4X2NvbCA9IChpbnQpRlhTWVNfZmxvb3IoRlhTWVNfRGl2KGNsaXBfYm94X3AucmlnaHQgLSBwUGF0dGVybi0+bV9CQm94LmxlZnQsIHBQYXR0ZXJuLT5tX1hTdGVwKSk7Ci0gICAgbWluX3JvdyA9IChpbnQpRlhTWVNfY2VpbChGWFNZU19EaXYoY2xpcF9ib3hfcC5ib3R0b20gLSBwUGF0dGVybi0+bV9CQm94LnRvcCwgcFBhdHRlcm4tPm1fWVN0ZXApKTsKLSAgICBtYXhfcm93ID0gKGludClGWFNZU19mbG9vcihGWFNZU19EaXYoY2xpcF9ib3hfcC50b3AgLSBwUGF0dGVybi0+bV9CQm94LmJvdHRvbSwgcFBhdHRlcm4tPm1fWVN0ZXApKTsKLSAgICBpZiAod2lkdGggPiBjbGlwX2JveC5XaWR0aCgpIHx8IGhlaWdodCA+IGNsaXBfYm94LkhlaWdodCgpIHx8IHdpZHRoICogaGVpZ2h0ID4gY2xpcF9ib3guV2lkdGgoKSAqIGNsaXBfYm94LkhlaWdodCgpKSB7Ci0gICAgICAgIENQREZfR3JhcGhpY1N0YXRlcyogcFN0YXRlcyA9IE5VTEw7Ci0gICAgICAgIGlmICghcFBhdHRlcm4tPm1fYkNvbG9yZWQpIHsKLSAgICAgICAgICAgIHBTdGF0ZXMgPSBDbG9uZU9ialN0YXRlcyhwUGFnZU9iaiwgYlN0cm9rZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlID0gTlVMTDsKLSAgICAgICAgaWYgKHBQYXR0ZXJuLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgewotICAgICAgICAgICAgcEZvcm1SZXNvdXJjZSA9IHBQYXR0ZXJuLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiUmVzb3VyY2VzIikpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IG1pbl9jb2w7IGNvbCA8PSBtYXhfY29sOyBjb2wgKyspCi0gICAgICAgICAgICBmb3IgKGludCByb3cgPSBtaW5fcm93OyByb3cgPD0gbWF4X3Jvdzsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgb3JpZ194LCBvcmlnX3k7Ci0gICAgICAgICAgICAgICAgb3JpZ194ID0gY29sICogcFBhdHRlcm4tPm1fWFN0ZXA7Ci0gICAgICAgICAgICAgICAgb3JpZ195ID0gcm93ICogcFBhdHRlcm4tPm1fWVN0ZXA7Ci0gICAgICAgICAgICAgICAgbXRQYXR0ZXJuMkRldmljZS5UcmFuc2Zvcm0ob3JpZ194LCBvcmlnX3kpOwotICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4ID0gKnBPYmoyRGV2aWNlOwotICAgICAgICAgICAgICAgIG1hdHJpeC5UcmFuc2xhdGUob3JpZ194IC0gbXRQYXR0ZXJuMkRldmljZS5lLCBvcmlnX3kgLSBtdFBhdHRlcm4yRGV2aWNlLmYpOwotICAgICAgICAgICAgICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwotICAgICAgICAgICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsIG1fcERldmljZSwgTlVMTCwgTlVMTCwgdGhpcywgcFN0YXRlcywgJm1fT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybi0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3ksIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwUGF0dGVybi0+bV9wRm9ybSwgJm1hdHJpeCk7Ci0gICAgICAgICAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgZGVsZXRlIHBTdGF0ZXM7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGJBbGlnbmVkKSB7Ci0gICAgICAgIGludCBvcmlnX3ggPSBGWFNZU19yb3VuZChtdFBhdHRlcm4yRGV2aWNlLmUpOwotICAgICAgICBpbnQgb3JpZ195ID0gRlhTWVNfcm91bmQobXRQYXR0ZXJuMkRldmljZS5mKTsKLSAgICAgICAgbWluX2NvbCA9IChjbGlwX2JveC5sZWZ0IC0gb3JpZ194KSAvIHdpZHRoOwotICAgICAgICBpZiAoY2xpcF9ib3gubGVmdCA8IG9yaWdfeCkgewotICAgICAgICAgICAgbWluX2NvbCAtLTsKLSAgICAgICAgfQotICAgICAgICBtYXhfY29sID0gKGNsaXBfYm94LnJpZ2h0IC0gb3JpZ194KSAvIHdpZHRoOwotICAgICAgICBpZiAoY2xpcF9ib3gucmlnaHQgPD0gb3JpZ194KSB7Ci0gICAgICAgICAgICBtYXhfY29sIC0tOwotICAgICAgICB9Ci0gICAgICAgIG1pbl9yb3cgPSAoY2xpcF9ib3gudG9wIC0gb3JpZ195KSAvIGhlaWdodDsKLSAgICAgICAgaWYgKGNsaXBfYm94LnRvcCA8IG9yaWdfeSkgewotICAgICAgICAgICAgbWluX3JvdyAtLTsKLSAgICAgICAgfQotICAgICAgICBtYXhfcm93ID0gKGNsaXBfYm94LmJvdHRvbSAtIG9yaWdfeSkgLyBoZWlnaHQ7Ci0gICAgICAgIGlmIChjbGlwX2JveC5ib3R0b20gPD0gb3JpZ195KSB7Ci0gICAgICAgICAgICBtYXhfcm93IC0tOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYX0ZMT0FUIGxlZnRfb2Zmc2V0ID0gY2VsbF9iYm94LmxlZnQgLSBtdFBhdHRlcm4yRGV2aWNlLmU7Ci0gICAgRlhfRkxPQVQgdG9wX29mZnNldCA9IGNlbGxfYmJveC5ib3R0b20gLSBtdFBhdHRlcm4yRGV2aWNlLmY7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwUGF0dGVybkJpdG1hcCA9IE5VTEw7Ci0gICAgaWYgKHdpZHRoICogaGVpZ2h0IDwgMTYpIHsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRW5sYXJnZWRCaXRtYXAgPSBEcmF3UGF0dGVybkJpdG1hcChtX3BDb250ZXh0LT5tX3BEb2N1bWVudCwgbV9wQ29udGV4dC0+bV9wUGFnZUNhY2hlLCBwUGF0dGVybiwgcE9iajJEZXZpY2UsIDgsIDgsIG1fT3B0aW9ucy5tX0ZsYWdzKTsKLSAgICAgICAgcFBhdHRlcm5CaXRtYXAgPSBwRW5sYXJnZWRCaXRtYXAtPlN0cmV0Y2hUbyh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgZGVsZXRlIHBFbmxhcmdlZEJpdG1hcDsKLSAgICB9IGVsc2UgewotICAgICAgICBwUGF0dGVybkJpdG1hcCA9IERyYXdQYXR0ZXJuQml0bWFwKG1fcENvbnRleHQtPm1fcERvY3VtZW50LCBtX3BDb250ZXh0LT5tX3BQYWdlQ2FjaGUsIHBQYXR0ZXJuLCBwT2JqMkRldmljZSwgd2lkdGgsIGhlaWdodCwgbV9PcHRpb25zLm1fRmxhZ3MpOwotICAgIH0KLSAgICBpZiAocFBhdHRlcm5CaXRtYXAgPT0gTlVMTCkgewotICAgICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0dSQVkpIHsKLSAgICAgICAgcFBhdHRlcm5CaXRtYXAtPkNvbnZlcnRDb2xvclNjYWxlKG1fT3B0aW9ucy5tX0ZvcmVDb2xvciwgbV9PcHRpb25zLm1fQmFja0NvbG9yKTsKLSAgICB9Ci0gICAgRlhfQVJHQiBmaWxsX2FyZ2IgPSBHZXRGaWxsQXJnYihwUGFnZU9iaik7Ci0gICAgaW50IGNsaXBfd2lkdGggPSBjbGlwX2JveC5yaWdodCAtIGNsaXBfYm94LmxlZnQ7Ci0gICAgaW50IGNsaXBfaGVpZ2h0ID0gY2xpcF9ib3guYm90dG9tIC0gY2xpcF9ib3gudG9wOwotICAgIENGWF9ESUJpdG1hcCBzY3JlZW47Ci0gICAgaWYgKCFzY3JlZW4uQ3JlYXRlKGNsaXBfd2lkdGgsIGNsaXBfaGVpZ2h0LCBGWERJQl9BcmdiKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNjcmVlbi5DbGVhcigwKTsKLSAgICBGWF9EV09SRCogc3JjX2J1ZiA9IChGWF9EV09SRCopcFBhdHRlcm5CaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgIGZvciAoaW50IGNvbCA9IG1pbl9jb2w7IGNvbCA8PSBtYXhfY29sOyBjb2wgKyspIHsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gbWluX3Jvdzsgcm93IDw9IG1heF9yb3c7IHJvdyArKykgewotICAgICAgICAgICAgaW50IHN0YXJ0X3gsIHN0YXJ0X3k7Ci0gICAgICAgICAgICBpZiAoYkFsaWduZWQpIHsKLSAgICAgICAgICAgICAgICBzdGFydF94ID0gRlhTWVNfcm91bmQobXRQYXR0ZXJuMkRldmljZS5lKSArIGNvbCAqIHdpZHRoIC0gY2xpcF9ib3gubGVmdDsKLSAgICAgICAgICAgICAgICBzdGFydF95ID0gRlhTWVNfcm91bmQobXRQYXR0ZXJuMkRldmljZS5mKSArIHJvdyAqIGhlaWdodCAtIGNsaXBfYm94LnRvcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgb3JpZ194ID0gY29sICogcFBhdHRlcm4tPm1fWFN0ZXA7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgb3JpZ195ID0gcm93ICogcFBhdHRlcm4tPm1fWVN0ZXA7Ci0gICAgICAgICAgICAgICAgbXRQYXR0ZXJuMkRldmljZS5UcmFuc2Zvcm0ob3JpZ194LCBvcmlnX3kpOwotICAgICAgICAgICAgICAgIHN0YXJ0X3ggPSBGWFNZU19yb3VuZChvcmlnX3ggKyBsZWZ0X29mZnNldCkgLSBjbGlwX2JveC5sZWZ0OwotICAgICAgICAgICAgICAgIHN0YXJ0X3kgPSBGWFNZU19yb3VuZChvcmlnX3kgKyB0b3Bfb2Zmc2V0KSAtIGNsaXBfYm94LnRvcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3aWR0aCA9PSAxICYmIGhlaWdodCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0X3ggPCAwIHx8IHN0YXJ0X3ggPj0gY2xpcF9ib3guV2lkdGgoKSB8fCBzdGFydF95IDwgMCB8fCBzdGFydF95ID49IGNsaXBfYm94LkhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCogZGVzdF9idWYgPSAoRlhfRFdPUkQqKShzY3JlZW4uR2V0QnVmZmVyKCkgKyBzY3JlZW4uR2V0UGl0Y2goKSAqIHN0YXJ0X3kgKyBzdGFydF94ICogNCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXR0ZXJuLT5tX2JDb2xvcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZiA9ICpzcmNfYnVmOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZiA9ICgqKHVpbnQ4X3QqKXNyY19idWYgPDwgMjQpIHwgKGZpbGxfYXJnYiAmIDB4ZmZmZmZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwUGF0dGVybi0+bV9iQ29sb3JlZCkgewotICAgICAgICAgICAgICAgICAgICBzY3JlZW4uQ29tcG9zaXRlQml0bWFwKHN0YXJ0X3gsIHN0YXJ0X3ksIHdpZHRoLCBoZWlnaHQsIHBQYXR0ZXJuQml0bWFwLCAwLCAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzY3JlZW4uQ29tcG9zaXRlTWFzayhzdGFydF94LCBzdGFydF95LCB3aWR0aCwgaGVpZ2h0LCBwUGF0dGVybkJpdG1hcCwgZmlsbF9hcmdiLCAwLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ29tcG9zaXRlRElCaXRtYXAoJnNjcmVlbiwgY2xpcF9ib3gubGVmdCwgY2xpcF9ib3gudG9wLCAwLCAyNTUsIEZYRElCX0JMRU5EX05PUk1BTCwgRkFMU0UpOworICB9IGVsc2UgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSkgeworICAgIEZYX1JFQ1QgcmVjdCA9IHBQYWdlT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKKyAgICBtX3BEZXZpY2UtPlNldENsaXBfUmVjdCgmcmVjdCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsKKyAgaWYgKGNsaXBfYm94LklzRW1wdHkoKSkgewogICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7Ci0gICAgZGVsZXRlIHBQYXR0ZXJuQml0bWFwOwotfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd1BhdGhXaXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgQ1BERl9Db2xvciogcENvbG9yLCBGWF9CT09MIGJTdHJva2UpCi17Ci0gICAgQ1BERl9QYXR0ZXJuKiBwYXR0ZXJuID0gcENvbG9yLT5HZXRQYXR0ZXJuKCk7Ci0gICAgaWYgKHBhdHRlcm4gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CisgICAgcmV0dXJuOworICB9CisgIENGWF9NYXRyaXggZENUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7CisgIEZYX0ZMT0FUIHNhID0gRlhTWVNfZmFicyhkQ1RNLmEpOworICBGWF9GTE9BVCBzZCA9IEZYU1lTX2ZhYnMoZENUTS5kKTsKKyAgY2xpcF9ib3gucmlnaHQgPSBjbGlwX2JveC5sZWZ0ICsgKGludDMyX3QpRlhTWVNfY2VpbChjbGlwX2JveC5XaWR0aCgpICogc2EpOworICBjbGlwX2JveC5ib3R0b20gPSBjbGlwX2JveC50b3AgKyAoaW50MzJfdClGWFNZU19jZWlsKGNsaXBfYm94LkhlaWdodCgpICogc2QpOworICBDRlhfQWZmaW5lTWF0cml4IG10UGF0dGVybjJEZXZpY2UgPSBwUGF0dGVybi0+bV9QYXR0ZXJuMkZvcm07CisgIG10UGF0dGVybjJEZXZpY2UuQ29uY2F0KCpwT2JqMkRldmljZSk7CisgIEdldFNjYWxlZE1hdHJpeChtdFBhdHRlcm4yRGV2aWNlKTsKKyAgRlhfQk9PTCBiQWxpZ25lZCA9IEZBTFNFOworICBpZiAocFBhdHRlcm4tPm1fQkJveC5sZWZ0ID09IDAgJiYgcFBhdHRlcm4tPm1fQkJveC5ib3R0b20gPT0gMCAmJgorICAgICAgcFBhdHRlcm4tPm1fQkJveC5yaWdodCA9PSBwUGF0dGVybi0+bV9YU3RlcCAmJgorICAgICAgcFBhdHRlcm4tPm1fQkJveC50b3AgPT0gcFBhdHRlcm4tPm1fWVN0ZXAgJiYKKyAgICAgIChtdFBhdHRlcm4yRGV2aWNlLklzU2NhbGVkKCkgfHwgbXRQYXR0ZXJuMkRldmljZS5JczkwUm90YXRlZCgpKSkgeworICAgIGJBbGlnbmVkID0gVFJVRTsKKyAgfQorICBDRlhfRmxvYXRSZWN0IGNlbGxfYmJveCA9IHBQYXR0ZXJuLT5tX0JCb3g7CisgIG10UGF0dGVybjJEZXZpY2UuVHJhbnNmb3JtUmVjdChjZWxsX2Jib3gpOworICBpbnQgd2lkdGggPSAoaW50KUZYU1lTX2NlaWwoY2VsbF9iYm94LldpZHRoKCkpOworICBpbnQgaGVpZ2h0ID0gKGludClGWFNZU19jZWlsKGNlbGxfYmJveC5IZWlnaHQoKSk7CisgIGlmICh3aWR0aCA9PSAwKSB7CisgICAgd2lkdGggPSAxOworICB9CisgIGlmIChoZWlnaHQgPT0gMCkgeworICAgIGhlaWdodCA9IDE7CisgIH0KKyAgaW50IG1pbl9jb2wsIG1heF9jb2wsIG1pbl9yb3csIG1heF9yb3c7CisgIENGWF9BZmZpbmVNYXRyaXggbXREZXZpY2UyUGF0dGVybjsKKyAgbXREZXZpY2UyUGF0dGVybi5TZXRSZXZlcnNlKG10UGF0dGVybjJEZXZpY2UpOworICBDRlhfRmxvYXRSZWN0IGNsaXBfYm94X3AoY2xpcF9ib3gpOworICBjbGlwX2JveF9wLlRyYW5zZm9ybSgmbXREZXZpY2UyUGF0dGVybik7CisgIG1pbl9jb2wgPSAoaW50KUZYU1lTX2NlaWwoCisgICAgICBGWFNZU19EaXYoY2xpcF9ib3hfcC5sZWZ0IC0gcFBhdHRlcm4tPm1fQkJveC5yaWdodCwgcFBhdHRlcm4tPm1fWFN0ZXApKTsKKyAgbWF4X2NvbCA9IChpbnQpRlhTWVNfZmxvb3IoCisgICAgICBGWFNZU19EaXYoY2xpcF9ib3hfcC5yaWdodCAtIHBQYXR0ZXJuLT5tX0JCb3gubGVmdCwgcFBhdHRlcm4tPm1fWFN0ZXApKTsKKyAgbWluX3JvdyA9IChpbnQpRlhTWVNfY2VpbCgKKyAgICAgIEZYU1lTX0RpdihjbGlwX2JveF9wLmJvdHRvbSAtIHBQYXR0ZXJuLT5tX0JCb3gudG9wLCBwUGF0dGVybi0+bV9ZU3RlcCkpOworICBtYXhfcm93ID0gKGludClGWFNZU19mbG9vcigKKyAgICAgIEZYU1lTX0RpdihjbGlwX2JveF9wLnRvcCAtIHBQYXR0ZXJuLT5tX0JCb3guYm90dG9tLCBwUGF0dGVybi0+bV9ZU3RlcCkpOworICBpZiAod2lkdGggPiBjbGlwX2JveC5XaWR0aCgpIHx8IGhlaWdodCA+IGNsaXBfYm94LkhlaWdodCgpIHx8CisgICAgICB3aWR0aCAqIGhlaWdodCA+IGNsaXBfYm94LldpZHRoKCkgKiBjbGlwX2JveC5IZWlnaHQoKSkgeworICAgIENQREZfR3JhcGhpY1N0YXRlcyogcFN0YXRlcyA9IE5VTEw7CisgICAgaWYgKCFwUGF0dGVybi0+bV9iQ29sb3JlZCkgeworICAgICAgcFN0YXRlcyA9IENsb25lT2JqU3RhdGVzKHBQYWdlT2JqLCBiU3Ryb2tlKTsKICAgICB9Ci0gICAgaWYocGF0dGVybi0+bV9QYXR0ZXJuVHlwZSA9PSBQQVRURVJOX1RJTElORykgewotICAgICAgICBEcmF3VGlsaW5nUGF0dGVybigoQ1BERl9UaWxpbmdQYXR0ZXJuKilwYXR0ZXJuLCBwUGF0aE9iaiwgcE9iajJEZXZpY2UsIGJTdHJva2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERyYXdTaGFkaW5nUGF0dGVybigoQ1BERl9TaGFkaW5nUGF0dGVybiopcGF0dGVybiwgcFBhdGhPYmosIHBPYmoyRGV2aWNlLCBiU3Ryb2tlKTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPSBOVUxMOworICAgIGlmIChwUGF0dGVybi0+bV9wRm9ybS0+bV9wRm9ybURpY3QpIHsKKyAgICAgIHBGb3JtUmVzb3VyY2UgPQorICAgICAgICAgIHBQYXR0ZXJuLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiUmVzb3VyY2VzIikpOwogICAgIH0KLX0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NQYXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgaW50JiBmaWxsdHlwZSwgRlhfQk9PTCYgYlN0cm9rZSkKLXsKLSAgICBpZihmaWxsdHlwZSkgewotICAgICAgICBDUERGX0NvbG9yJiBGaWxsQ29sb3IgPSAqcFBhdGhPYmotPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKTsKLSAgICAgICAgaWYoRmlsbENvbG9yLm1fcENTICYmIEZpbGxDb2xvci5tX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikgewotICAgICAgICAgICAgRHJhd1BhdGhXaXRoUGF0dGVybihwUGF0aE9iaiwgcE9iajJEZXZpY2UsICZGaWxsQ29sb3IsIEZBTFNFKTsKLSAgICAgICAgICAgIGZpbGx0eXBlID0gMDsKKyAgICBmb3IgKGludCBjb2wgPSBtaW5fY29sOyBjb2wgPD0gbWF4X2NvbDsgY29sKyspCisgICAgICBmb3IgKGludCByb3cgPSBtaW5fcm93OyByb3cgPD0gbWF4X3Jvdzsgcm93KyspIHsKKyAgICAgICAgRlhfRkxPQVQgb3JpZ194LCBvcmlnX3k7CisgICAgICAgIG9yaWdfeCA9IGNvbCAqIHBQYXR0ZXJuLT5tX1hTdGVwOworICAgICAgICBvcmlnX3kgPSByb3cgKiBwUGF0dGVybi0+bV9ZU3RlcDsKKyAgICAgICAgbXRQYXR0ZXJuMkRldmljZS5UcmFuc2Zvcm0ob3JpZ194LCBvcmlnX3kpOworICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCA9ICpwT2JqMkRldmljZTsKKyAgICAgICAgbWF0cml4LlRyYW5zbGF0ZShvcmlnX3ggLSBtdFBhdHRlcm4yRGV2aWNlLmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ195IC0gbXRQYXR0ZXJuMkRldmljZS5mKTsKKyAgICAgICAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKKyAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOworICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIE5VTEwsIHRoaXMsIHBTdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtX09wdGlvbnMsIHBQYXR0ZXJuLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UpOworICAgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwUGF0dGVybi0+bV9wRm9ybSwgJm1hdHJpeCk7CisgICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgICB9CisgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyAgICBkZWxldGUgcFN0YXRlczsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGJBbGlnbmVkKSB7CisgICAgaW50IG9yaWdfeCA9IEZYU1lTX3JvdW5kKG10UGF0dGVybjJEZXZpY2UuZSk7CisgICAgaW50IG9yaWdfeSA9IEZYU1lTX3JvdW5kKG10UGF0dGVybjJEZXZpY2UuZik7CisgICAgbWluX2NvbCA9IChjbGlwX2JveC5sZWZ0IC0gb3JpZ194KSAvIHdpZHRoOworICAgIGlmIChjbGlwX2JveC5sZWZ0IDwgb3JpZ194KSB7CisgICAgICBtaW5fY29sLS07CisgICAgfQorICAgIG1heF9jb2wgPSAoY2xpcF9ib3gucmlnaHQgLSBvcmlnX3gpIC8gd2lkdGg7CisgICAgaWYgKGNsaXBfYm94LnJpZ2h0IDw9IG9yaWdfeCkgeworICAgICAgbWF4X2NvbC0tOworICAgIH0KKyAgICBtaW5fcm93ID0gKGNsaXBfYm94LnRvcCAtIG9yaWdfeSkgLyBoZWlnaHQ7CisgICAgaWYgKGNsaXBfYm94LnRvcCA8IG9yaWdfeSkgeworICAgICAgbWluX3Jvdy0tOworICAgIH0KKyAgICBtYXhfcm93ID0gKGNsaXBfYm94LmJvdHRvbSAtIG9yaWdfeSkgLyBoZWlnaHQ7CisgICAgaWYgKGNsaXBfYm94LmJvdHRvbSA8PSBvcmlnX3kpIHsKKyAgICAgIG1heF9yb3ctLTsKKyAgICB9CisgIH0KKyAgRlhfRkxPQVQgbGVmdF9vZmZzZXQgPSBjZWxsX2Jib3gubGVmdCAtIG10UGF0dGVybjJEZXZpY2UuZTsKKyAgRlhfRkxPQVQgdG9wX29mZnNldCA9IGNlbGxfYmJveC5ib3R0b20gLSBtdFBhdHRlcm4yRGV2aWNlLmY7CisgIENGWF9ESUJpdG1hcCogcFBhdHRlcm5CaXRtYXAgPSBOVUxMOworICBpZiAod2lkdGggKiBoZWlnaHQgPCAxNikgeworICAgIENGWF9ESUJpdG1hcCogcEVubGFyZ2VkQml0bWFwID0KKyAgICAgICAgRHJhd1BhdHRlcm5CaXRtYXAobV9wQ29udGV4dC0+bV9wRG9jdW1lbnQsIG1fcENvbnRleHQtPm1fcFBhZ2VDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm4sIHBPYmoyRGV2aWNlLCA4LCA4LCBtX09wdGlvbnMubV9GbGFncyk7CisgICAgcFBhdHRlcm5CaXRtYXAgPSBwRW5sYXJnZWRCaXRtYXAtPlN0cmV0Y2hUbyh3aWR0aCwgaGVpZ2h0KTsKKyAgICBkZWxldGUgcEVubGFyZ2VkQml0bWFwOworICB9IGVsc2UgeworICAgIHBQYXR0ZXJuQml0bWFwID0gRHJhd1BhdHRlcm5CaXRtYXAoCisgICAgICAgIG1fcENvbnRleHQtPm1fcERvY3VtZW50LCBtX3BDb250ZXh0LT5tX3BQYWdlQ2FjaGUsIHBQYXR0ZXJuLAorICAgICAgICBwT2JqMkRldmljZSwgd2lkdGgsIGhlaWdodCwgbV9PcHRpb25zLm1fRmxhZ3MpOworICB9CisgIGlmIChwUGF0dGVybkJpdG1hcCA9PSBOVUxMKSB7CisgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fT3B0aW9ucy5tX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfR1JBWSkgeworICAgIHBQYXR0ZXJuQml0bWFwLT5Db252ZXJ0Q29sb3JTY2FsZShtX09wdGlvbnMubV9Gb3JlQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fT3B0aW9ucy5tX0JhY2tDb2xvcik7CisgIH0KKyAgRlhfQVJHQiBmaWxsX2FyZ2IgPSBHZXRGaWxsQXJnYihwUGFnZU9iaik7CisgIGludCBjbGlwX3dpZHRoID0gY2xpcF9ib3gucmlnaHQgLSBjbGlwX2JveC5sZWZ0OworICBpbnQgY2xpcF9oZWlnaHQgPSBjbGlwX2JveC5ib3R0b20gLSBjbGlwX2JveC50b3A7CisgIENGWF9ESUJpdG1hcCBzY3JlZW47CisgIGlmICghc2NyZWVuLkNyZWF0ZShjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCwgRlhESUJfQXJnYikpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2NyZWVuLkNsZWFyKDApOworICBGWF9EV09SRCogc3JjX2J1ZiA9IChGWF9EV09SRCopcFBhdHRlcm5CaXRtYXAtPkdldEJ1ZmZlcigpOworICBmb3IgKGludCBjb2wgPSBtaW5fY29sOyBjb2wgPD0gbWF4X2NvbDsgY29sKyspIHsKKyAgICBmb3IgKGludCByb3cgPSBtaW5fcm93OyByb3cgPD0gbWF4X3Jvdzsgcm93KyspIHsKKyAgICAgIGludCBzdGFydF94LCBzdGFydF95OworICAgICAgaWYgKGJBbGlnbmVkKSB7CisgICAgICAgIHN0YXJ0X3ggPSBGWFNZU19yb3VuZChtdFBhdHRlcm4yRGV2aWNlLmUpICsgY29sICogd2lkdGggLSBjbGlwX2JveC5sZWZ0OworICAgICAgICBzdGFydF95ID0gRlhTWVNfcm91bmQobXRQYXR0ZXJuMkRldmljZS5mKSArIHJvdyAqIGhlaWdodCAtIGNsaXBfYm94LnRvcDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYX0ZMT0FUIG9yaWdfeCA9IGNvbCAqIHBQYXR0ZXJuLT5tX1hTdGVwOworICAgICAgICBGWF9GTE9BVCBvcmlnX3kgPSByb3cgKiBwUGF0dGVybi0+bV9ZU3RlcDsKKyAgICAgICAgbXRQYXR0ZXJuMkRldmljZS5UcmFuc2Zvcm0ob3JpZ194LCBvcmlnX3kpOworICAgICAgICBzdGFydF94ID0gRlhTWVNfcm91bmQob3JpZ194ICsgbGVmdF9vZmZzZXQpIC0gY2xpcF9ib3gubGVmdDsKKyAgICAgICAgc3RhcnRfeSA9IEZYU1lTX3JvdW5kKG9yaWdfeSArIHRvcF9vZmZzZXQpIC0gY2xpcF9ib3gudG9wOworICAgICAgfQorICAgICAgaWYgKHdpZHRoID09IDEgJiYgaGVpZ2h0ID09IDEpIHsKKyAgICAgICAgaWYgKHN0YXJ0X3ggPCAwIHx8IHN0YXJ0X3ggPj0gY2xpcF9ib3guV2lkdGgoKSB8fCBzdGFydF95IDwgMCB8fAorICAgICAgICAgICAgc3RhcnRfeSA+PSBjbGlwX2JveC5IZWlnaHQoKSkgeworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgfQotICAgIGlmKGJTdHJva2UpIHsKLSAgICAgICAgQ1BERl9Db2xvciYgU3Ryb2tlQ29sb3IgPSAqcFBhdGhPYmotPm1fQ29sb3JTdGF0ZS5HZXRTdHJva2VDb2xvcigpOwotICAgICAgICBpZihTdHJva2VDb2xvci5tX3BDUyAmJiBTdHJva2VDb2xvci5tX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikgewotICAgICAgICAgICAgRHJhd1BhdGhXaXRoUGF0dGVybihwUGF0aE9iaiwgcE9iajJEZXZpY2UsICZTdHJva2VDb2xvciwgVFJVRSk7Ci0gICAgICAgICAgICBiU3Ryb2tlID0gRkFMU0U7CisgICAgICAgIEZYX0RXT1JEKiBkZXN0X2J1ZiA9CisgICAgICAgICAgICAoRlhfRFdPUkQqKShzY3JlZW4uR2V0QnVmZmVyKCkgKyBzY3JlZW4uR2V0UGl0Y2goKSAqIHN0YXJ0X3kgKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfeCAqIDQpOworICAgICAgICBpZiAocFBhdHRlcm4tPm1fYkNvbG9yZWQpIHsKKyAgICAgICAgICAqZGVzdF9idWYgPSAqc3JjX2J1ZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqZGVzdF9idWYgPSAoKih1aW50OF90KilzcmNfYnVmIDw8IDI0KSB8IChmaWxsX2FyZ2IgJiAweGZmZmZmZik7CiAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwUGF0dGVybi0+bV9iQ29sb3JlZCkgeworICAgICAgICAgIHNjcmVlbi5Db21wb3NpdGVCaXRtYXAoc3RhcnRfeCwgc3RhcnRfeSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXR0ZXJuQml0bWFwLCAwLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzY3JlZW4uQ29tcG9zaXRlTWFzayhzdGFydF94LCBzdGFydF95LCB3aWR0aCwgaGVpZ2h0LCBwUGF0dGVybkJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2FyZ2IsIDAsIDApOworICAgICAgICB9CisgICAgICB9CiAgICAgfQorICB9CisgIENvbXBvc2l0ZURJQml0bWFwKCZzY3JlZW4sIGNsaXBfYm94LmxlZnQsIGNsaXBfYm94LnRvcCwgMCwgMjU1LAorICAgICAgICAgICAgICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwsIEZBTFNFKTsKKyAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyAgZGVsZXRlIHBQYXR0ZXJuQml0bWFwOworfQordm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd1BhdGhXaXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvciogcENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2UpIHsKKyAgQ1BERl9QYXR0ZXJuKiBwYXR0ZXJuID0gcENvbG9yLT5HZXRQYXR0ZXJuKCk7CisgIGlmIChwYXR0ZXJuID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBhdHRlcm4tPm1fUGF0dGVyblR5cGUgPT0gUEFUVEVSTl9USUxJTkcpIHsKKyAgICBEcmF3VGlsaW5nUGF0dGVybigoQ1BERl9UaWxpbmdQYXR0ZXJuKilwYXR0ZXJuLCBwUGF0aE9iaiwgcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgYlN0cm9rZSk7CisgIH0gZWxzZSB7CisgICAgRHJhd1NoYWRpbmdQYXR0ZXJuKChDUERGX1NoYWRpbmdQYXR0ZXJuKilwYXR0ZXJuLCBwUGF0aE9iaiwgcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJTdHJva2UpOworICB9Cit9Cit2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzUGF0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGZpbGx0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJTdHJva2UpIHsKKyAgaWYgKGZpbGx0eXBlKSB7CisgICAgQ1BERl9Db2xvciYgRmlsbENvbG9yID0gKnBQYXRoT2JqLT5tX0NvbG9yU3RhdGUuR2V0RmlsbENvbG9yKCk7CisgICAgaWYgKEZpbGxDb2xvci5tX3BDUyAmJiBGaWxsQ29sb3IubV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKKyAgICAgIERyYXdQYXRoV2l0aFBhdHRlcm4ocFBhdGhPYmosIHBPYmoyRGV2aWNlLCAmRmlsbENvbG9yLCBGQUxTRSk7CisgICAgICBmaWxsdHlwZSA9IDA7CisgICAgfQorICB9CisgIGlmIChiU3Ryb2tlKSB7CisgICAgQ1BERl9Db2xvciYgU3Ryb2tlQ29sb3IgPSAqcFBhdGhPYmotPm1fQ29sb3JTdGF0ZS5HZXRTdHJva2VDb2xvcigpOworICAgIGlmIChTdHJva2VDb2xvci5tX3BDUyAmJiBTdHJva2VDb2xvci5tX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikgeworICAgICAgRHJhd1BhdGhXaXRoUGF0dGVybihwUGF0aE9iaiwgcE9iajJEZXZpY2UsICZTdHJva2VDb2xvciwgVFJVRSk7CisgICAgICBiU3Ryb2tlID0gRkFMU0U7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3RleHQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl90ZXh0LmNwcAppbmRleCBhZDVkYzU4Li43ZDY5MjFmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3RleHQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfdGV4dC5jcHAKQEAgLTEwLDcyMyArMTAsNzkxIEBACiAjaW5jbHVkZSAiLi4vZnBkZl9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJyZW5kZXJfaW50LmgiCiBleHRlcm4gRlhfQk9PTCBJc0F2YWlsYWJsZU1hdHJpeChjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOwotQ1BERl9UeXBlM0NhY2hlOjp+Q1BERl9UeXBlM0NhY2hlKCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX1NpemVNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIENGWF9CeXRlU3RyaW5nIEtleTsKLSAgICBDUERGX1R5cGUzR2x5cGhzKiBwU2l6ZUNhY2hlID0gTlVMTDsKLSAgICB3aGlsZShwb3MpIHsKLSAgICAgICAgcFNpemVDYWNoZSA9IChDUERGX1R5cGUzR2x5cGhzKiltX1NpemVNYXAuR2V0TmV4dFZhbHVlKHBvcyk7Ci0gICAgICAgIGRlbGV0ZSBwU2l6ZUNhY2hlOwotICAgIH0KLSAgICBtX1NpemVNYXAuUmVtb3ZlQWxsKCk7CitDUERGX1R5cGUzQ2FjaGU6On5DUERGX1R5cGUzQ2FjaGUoKSB7CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fU2l6ZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7CisgIENGWF9CeXRlU3RyaW5nIEtleTsKKyAgQ1BERl9UeXBlM0dseXBocyogcFNpemVDYWNoZSA9IE5VTEw7CisgIHdoaWxlIChwb3MpIHsKKyAgICBwU2l6ZUNhY2hlID0gKENQREZfVHlwZTNHbHlwaHMqKW1fU2l6ZU1hcC5HZXROZXh0VmFsdWUocG9zKTsKKyAgICBkZWxldGUgcFNpemVDYWNoZTsKKyAgfQorICBtX1NpemVNYXAuUmVtb3ZlQWxsKCk7CiB9Ci1DRlhfR2x5cGhCaXRtYXAqIENQREZfVHlwZTNDYWNoZTo6TG9hZEdseXBoKEZYX0RXT1JEIGNoYXJjb2RlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9GTE9BVCByZXRpbmFTY2FsZVgsIEZYX0ZMT0FUIHJldGluYVNjYWxlWSkKLXsKLSAgICBfQ1BERl9VbmlxdWVLZXlHZW4ga2V5Z2VuOwotICAgIGtleWdlbi5HZW5lcmF0ZSg0LCBGWFNZU19yb3VuZChwTWF0cml4LT5hICogMTAwMDApLCBGWFNZU19yb3VuZChwTWF0cml4LT5iICogMTAwMDApLAotICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChwTWF0cml4LT5jICogMTAwMDApLCBGWFNZU19yb3VuZChwTWF0cml4LT5kICogMTAwMDApKTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgRmFjZUdseXBoc0tleShrZXlnZW4ubV9LZXksIGtleWdlbi5tX0tleUxlbik7Ci0gICAgQ1BERl9UeXBlM0dseXBocyogcFNpemVDYWNoZSA9IE5VTEw7Ci0gICAgaWYoIW1fU2l6ZU1hcC5Mb29rdXAoRmFjZUdseXBoc0tleSwgKHZvaWQqJilwU2l6ZUNhY2hlKSkgewotICAgICAgICBwU2l6ZUNhY2hlID0gbmV3IENQREZfVHlwZTNHbHlwaHM7Ci0gICAgICAgIG1fU2l6ZU1hcC5TZXRBdChGYWNlR2x5cGhzS2V5LCBwU2l6ZUNhY2hlKTsKLSAgICB9Ci0gICAgQ0ZYX0dseXBoQml0bWFwKiBwR2x5cGhCaXRtYXA7Ci0gICAgaWYocFNpemVDYWNoZS0+bV9HbHlwaE1hcC5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpY2hhcmNvZGUsICh2b2lkKiYpcEdseXBoQml0bWFwKSkgewotICAgICAgICByZXR1cm4gcEdseXBoQml0bWFwOwotICAgIH0KLSAgICBwR2x5cGhCaXRtYXAgPSBSZW5kZXJHbHlwaChwU2l6ZUNhY2hlLCBjaGFyY29kZSwgcE1hdHJpeCwgcmV0aW5hU2NhbGVYLCByZXRpbmFTY2FsZVkpOwotICAgIHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpY2hhcmNvZGUsIHBHbHlwaEJpdG1hcCk7CitDRlhfR2x5cGhCaXRtYXAqIENQREZfVHlwZTNDYWNoZTo6TG9hZEdseXBoKEZYX0RXT1JEIGNoYXJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWSkgeworICBfQ1BERl9VbmlxdWVLZXlHZW4ga2V5Z2VuOworICBrZXlnZW4uR2VuZXJhdGUoCisgICAgICA0LCBGWFNZU19yb3VuZChwTWF0cml4LT5hICogMTAwMDApLCBGWFNZU19yb3VuZChwTWF0cml4LT5iICogMTAwMDApLAorICAgICAgRlhTWVNfcm91bmQocE1hdHJpeC0+YyAqIDEwMDAwKSwgRlhTWVNfcm91bmQocE1hdHJpeC0+ZCAqIDEwMDAwKSk7CisgIENGWF9CeXRlU3RyaW5nQyBGYWNlR2x5cGhzS2V5KGtleWdlbi5tX0tleSwga2V5Z2VuLm1fS2V5TGVuKTsKKyAgQ1BERl9UeXBlM0dseXBocyogcFNpemVDYWNoZSA9IE5VTEw7CisgIGlmICghbV9TaXplTWFwLkxvb2t1cChGYWNlR2x5cGhzS2V5LCAodm9pZComKXBTaXplQ2FjaGUpKSB7CisgICAgcFNpemVDYWNoZSA9IG5ldyBDUERGX1R5cGUzR2x5cGhzOworICAgIG1fU2l6ZU1hcC5TZXRBdChGYWNlR2x5cGhzS2V5LCBwU2l6ZUNhY2hlKTsKKyAgfQorICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcDsKKyAgaWYgKHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuTG9va3VwKCh2b2lkKikodWludHB0cl90KWNoYXJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqJilwR2x5cGhCaXRtYXApKSB7CiAgICAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKKyAgfQorICBwR2x5cGhCaXRtYXAgPQorICAgICAgUmVuZGVyR2x5cGgocFNpemVDYWNoZSwgY2hhcmNvZGUsIHBNYXRyaXgsIHJldGluYVNjYWxlWCwgcmV0aW5hU2NhbGVZKTsKKyAgcFNpemVDYWNoZS0+bV9HbHlwaE1hcC5TZXRBdCgodm9pZCopKHVpbnRwdHJfdCljaGFyY29kZSwgcEdseXBoQml0bWFwKTsKKyAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKIH0KLUNQREZfVHlwZTNHbHlwaHM6On5DUERGX1R5cGUzR2x5cGhzKCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0dseXBoTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB2b2lkKiBLZXk7Ci0gICAgQ0ZYX0dseXBoQml0bWFwKiBwR2x5cGhCaXRtYXA7Ci0gICAgd2hpbGUocG9zKSB7Ci0gICAgICAgIG1fR2x5cGhNYXAuR2V0TmV4dEFzc29jKHBvcywgS2V5LCAodm9pZComKXBHbHlwaEJpdG1hcCk7Ci0gICAgICAgIGRlbGV0ZSBwR2x5cGhCaXRtYXA7Ci0gICAgfQorQ1BERl9UeXBlM0dseXBoczo6fkNQREZfVHlwZTNHbHlwaHMoKSB7CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fR2x5cGhNYXAuR2V0U3RhcnRQb3NpdGlvbigpOworICB2b2lkKiBLZXk7CisgIENGWF9HbHlwaEJpdG1hcCogcEdseXBoQml0bWFwOworICB3aGlsZSAocG9zKSB7CisgICAgbV9HbHlwaE1hcC5HZXROZXh0QXNzb2MocG9zLCBLZXksICh2b2lkKiYpcEdseXBoQml0bWFwKTsKKyAgICBkZWxldGUgcEdseXBoQml0bWFwOworICB9CiB9Ci1zdGF0aWMgaW50IF9BZGp1c3RCbHVlKEZYX0ZMT0FUIHBvcywgaW50JiBjb3VudCwgaW50IGJsdWVzW10pCi17Ci0gICAgRlhfRkxPQVQgbWluX2Rpc3RhbmNlID0gMTAwMDAwMC4wZiAqIDEuMGY7Ci0gICAgaW50IGNsb3Nlc3RfcG9zID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBGWF9GTE9BVCBkaXN0YW5jZSA9IChGWF9GTE9BVClGWFNZU19mYWJzKHBvcyAtIChGWF9GTE9BVClibHVlc1tpXSk7Ci0gICAgICAgIGlmIChkaXN0YW5jZSA8IDEuMGYgKiA4MC4wZiAvIDEwMC4wZiAmJiBkaXN0YW5jZSA8IG1pbl9kaXN0YW5jZSkgewotICAgICAgICAgICAgbWluX2Rpc3RhbmNlID0gZGlzdGFuY2U7Ci0gICAgICAgICAgICBjbG9zZXN0X3BvcyA9IGk7Ci0gICAgICAgIH0KK3N0YXRpYyBpbnQgX0FkanVzdEJsdWUoRlhfRkxPQVQgcG9zLCBpbnQmIGNvdW50LCBpbnQgYmx1ZXNbXSkgeworICBGWF9GTE9BVCBtaW5fZGlzdGFuY2UgPSAxMDAwMDAwLjBmICogMS4wZjsKKyAgaW50IGNsb3Nlc3RfcG9zID0gLTE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIEZYX0ZMT0FUIGRpc3RhbmNlID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMocG9zIC0gKEZYX0ZMT0FUKWJsdWVzW2ldKTsKKyAgICBpZiAoZGlzdGFuY2UgPCAxLjBmICogODAuMGYgLyAxMDAuMGYgJiYgZGlzdGFuY2UgPCBtaW5fZGlzdGFuY2UpIHsKKyAgICAgIG1pbl9kaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgY2xvc2VzdF9wb3MgPSBpOwogICAgIH0KLSAgICBpZiAoY2xvc2VzdF9wb3MgPj0gMCkgewotICAgICAgICByZXR1cm4gYmx1ZXNbY2xvc2VzdF9wb3NdOwotICAgIH0KLSAgICBpbnQgbmV3X3BvcyA9IEZYU1lTX3JvdW5kKHBvcyk7Ci0gICAgaWYgKGNvdW50ID09IFRZUEUzX01BWF9CTFVFUykgewotICAgICAgICByZXR1cm4gbmV3X3BvczsKLSAgICB9Ci0gICAgYmx1ZXNbY291bnQrK10gPSBuZXdfcG9zOworICB9CisgIGlmIChjbG9zZXN0X3BvcyA+PSAwKSB7CisgICAgcmV0dXJuIGJsdWVzW2Nsb3Nlc3RfcG9zXTsKKyAgfQorICBpbnQgbmV3X3BvcyA9IEZYU1lTX3JvdW5kKHBvcyk7CisgIGlmIChjb3VudCA9PSBUWVBFM19NQVhfQkxVRVMpIHsKICAgICByZXR1cm4gbmV3X3BvczsKKyAgfQorICBibHVlc1tjb3VudCsrXSA9IG5ld19wb3M7CisgIHJldHVybiBuZXdfcG9zOwogfQotdm9pZCBDUERGX1R5cGUzR2x5cGhzOjpBZGp1c3RCbHVlKEZYX0ZMT0FUIHRvcCwgRlhfRkxPQVQgYm90dG9tLCBpbnQmIHRvcF9saW5lLCBpbnQmIGJvdHRvbV9saW5lKQotewotICAgIHRvcF9saW5lID0gX0FkanVzdEJsdWUodG9wLCBtX1RvcEJsdWVDb3VudCwgbV9Ub3BCbHVlKTsKLSAgICBib3R0b21fbGluZSA9IF9BZGp1c3RCbHVlKGJvdHRvbSwgbV9Cb3R0b21CbHVlQ291bnQsIG1fQm90dG9tQmx1ZSk7Cit2b2lkIENQREZfVHlwZTNHbHlwaHM6OkFkanVzdEJsdWUoRlhfRkxPQVQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHRvcF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgYm90dG9tX2xpbmUpIHsKKyAgdG9wX2xpbmUgPSBfQWRqdXN0Qmx1ZSh0b3AsIG1fVG9wQmx1ZUNvdW50LCBtX1RvcEJsdWUpOworICBib3R0b21fbGluZSA9IF9BZGp1c3RCbHVlKGJvdHRvbSwgbV9Cb3R0b21CbHVlQ291bnQsIG1fQm90dG9tQmx1ZSk7CiB9Ci1zdGF0aWMgRlhfQk9PTCBfSXNTY2FuTGluZTFicHAodWludDhfdCogcEJ1ZiwgaW50IHdpZHRoKQotewotICAgIGludCBzaXplID0gd2lkdGggLyA4OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykKLSAgICAgICAgaWYgKHBCdWZbaV0pIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgaWYgKHdpZHRoICUgOCkKLSAgICAgICAgaWYgKHBCdWZbd2lkdGggLyA4XSAmICgweGZmIDw8ICg4IC0gd2lkdGggJSA4KSkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworc3RhdGljIEZYX0JPT0wgX0lzU2NhbkxpbmUxYnBwKHVpbnQ4X3QqIHBCdWYsIGludCB3aWR0aCkgeworICBpbnQgc2l6ZSA9IHdpZHRoIC8gODsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgaWYgKHBCdWZbaV0pIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgaWYgKHdpZHRoICUgOCkKKyAgICBpZiAocEJ1Zlt3aWR0aCAvIDhdICYgKDB4ZmYgPDwgKDggLSB3aWR0aCAlIDgpKSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1zdGF0aWMgRlhfQk9PTCBfSXNTY2FuTGluZThicHAodWludDhfdCogcEJ1ZiwgaW50IHdpZHRoKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkgKyspCi0gICAgICAgIGlmIChwQnVmW2ldID4gMHg0MCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CitzdGF0aWMgRlhfQk9PTCBfSXNTY2FuTGluZThicHAodWludDhfdCogcEJ1ZiwgaW50IHdpZHRoKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICBpZiAocEJ1ZltpXSA+IDB4NDApIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotc3RhdGljIGludCBfRGV0ZWN0Rmlyc3RMYXN0U2Nhbihjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEZYX0JPT0wgYkZpcnN0KQotewotICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKSwgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpLCB3aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7Ci0gICAgaW50IGJwcCA9IHBCaXRtYXAtPkdldEJQUCgpOwotICAgIGlmIChicHAgPiA4KSB7Ci0gICAgICAgIHdpZHRoICo9IGJwcCAvIDg7Ci0gICAgfQotICAgIHVpbnQ4X3QqIHBCdWYgPSBwQml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICBpbnQgbGluZSA9IGJGaXJzdCA/IDAgOiBoZWlnaHQgLSAxOwotICAgIGludCBsaW5lX3N0ZXAgPSBiRmlyc3QgPyAxIDogLTE7Ci0gICAgaW50IGxpbmVfZW5kID0gYkZpcnN0ID8gaGVpZ2h0IDogLTE7Ci0gICAgd2hpbGUgKGxpbmUgIT0gbGluZV9lbmQpIHsKLSAgICAgICAgaWYgKGJwcCA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAoX0lzU2NhbkxpbmUxYnBwKHBCdWYgKyBsaW5lICogcGl0Y2gsIHdpZHRoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKF9Jc1NjYW5MaW5lOGJwcChwQnVmICsgbGluZSAqIHBpdGNoLCB3aWR0aCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsaW5lICs9IGxpbmVfc3RlcDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotQ0ZYX0dseXBoQml0bWFwKiBDUERGX1R5cGUzQ2FjaGU6OlJlbmRlckdseXBoKENQREZfVHlwZTNHbHlwaHMqIHBTaXplLCBGWF9EV09SRCBjaGFyY29kZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRkxPQVQgcmV0aW5hU2NhbGVYLCBGWF9GTE9BVCByZXRpbmFTY2FsZVkpCi17Ci0gICAgQ1BERl9UeXBlM0NoYXIqIHBDaGFyID0gbV9wRm9udC0+TG9hZENoYXIoY2hhcmNvZGUpOwotICAgIGlmIChwQ2hhciA9PSBOVUxMIHx8IHBDaGFyLT5tX3BCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gcENoYXItPm1fcEJpdG1hcDsKLSAgICBDRlhfQWZmaW5lTWF0cml4IGltYWdlX21hdHJpeCwgdGV4dF9tYXRyaXg7Ci0gICAgaW1hZ2VfbWF0cml4ID0gcENoYXItPm1fSW1hZ2VNYXRyaXg7Ci0gICAgdGV4dF9tYXRyaXguU2V0KHBNYXRyaXgtPmEsIHBNYXRyaXgtPmIsIHBNYXRyaXgtPmMsIHBNYXRyaXgtPmQsIDAsIDApOwotICAgIGltYWdlX21hdHJpeC5Db25jYXQodGV4dF9tYXRyaXgpOwotICAgIENGWF9ESUJpdG1hcCogcFJlc0JpdG1hcCA9IE5VTEw7Ci0gICAgaW50IGxlZnQsIHRvcDsKLSAgICBpZiAoRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguYikgPCBGWFNZU19mYWJzKGltYWdlX21hdHJpeC5hKSAvIDEwMCAmJiBGWFNZU19mYWJzKGltYWdlX21hdHJpeC5jKSA8IEZYU1lTX2ZhYnMoaW1hZ2VfbWF0cml4LmQpIC8gMTAwKSB7Ci0gICAgICAgIGludCB0b3BfbGluZSwgYm90dG9tX2xpbmU7Ci0gICAgICAgIHRvcF9saW5lID0gX0RldGVjdEZpcnN0TGFzdFNjYW4ocEJpdG1hcCwgVFJVRSk7Ci0gICAgICAgIGJvdHRvbV9saW5lID0gX0RldGVjdEZpcnN0TGFzdFNjYW4ocEJpdG1hcCwgRkFMU0UpOwotICAgICAgICBpZiAodG9wX2xpbmUgPT0gMCAmJiBib3R0b21fbGluZSA9PSBwQml0bWFwLT5HZXRIZWlnaHQoKSAtIDEpIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHRvcF95ID0gaW1hZ2VfbWF0cml4LmQgKyBpbWFnZV9tYXRyaXguZjsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbV95ID0gaW1hZ2VfbWF0cml4LmY7Ci0gICAgICAgICAgICBGWF9CT09MIGJGbGlwcGVkID0gdG9wX3kgPiBib3R0b21feTsKLSAgICAgICAgICAgIGlmIChiRmxpcHBlZCkgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRlbXAgPSB0b3BfeTsKLSAgICAgICAgICAgICAgICB0b3BfeSA9IGJvdHRvbV95OwotICAgICAgICAgICAgICAgIGJvdHRvbV95ID0gdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTaXplLT5BZGp1c3RCbHVlKHRvcF95LCBib3R0b21feSwgdG9wX2xpbmUsIGJvdHRvbV9saW5lKTsKLSAgICAgICAgICAgIHBSZXNCaXRtYXAgPSBwQml0bWFwLT5TdHJldGNoVG8oKGludCkoRlhTWVNfcm91bmQoaW1hZ2VfbWF0cml4LmEpICogcmV0aW5hU2NhbGVYKSwgKGludCkoKGJGbGlwcGVkID8gdG9wX2xpbmUgLSBib3R0b21fbGluZSA6IGJvdHRvbV9saW5lIC0gdG9wX2xpbmUpICogcmV0aW5hU2NhbGVZKSk7Ci0gICAgICAgICAgICB0b3AgPSB0b3BfbGluZTsKLSAgICAgICAgICAgIGlmIChpbWFnZV9tYXRyaXguYSA8IDApIHsKLSAgICAgICAgICAgICAgICBpbWFnZV9tYXRyaXguU2NhbGUocmV0aW5hU2NhbGVYLCByZXRpbmFTY2FsZVkpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBGWFNZU19yb3VuZChpbWFnZV9tYXRyaXguZSArIGltYWdlX21hdHJpeC5hKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IEZYU1lTX3JvdW5kKGltYWdlX21hdHJpeC5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocFJlc0JpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIGltYWdlX21hdHJpeC5TY2FsZShyZXRpbmFTY2FsZVgsIHJldGluYVNjYWxlWSk7Ci0gICAgICAgIHBSZXNCaXRtYXAgPSBwQml0bWFwLT5UcmFuc2Zvcm1UbygmaW1hZ2VfbWF0cml4LCBsZWZ0LCB0b3ApOwotICAgIH0KLSAgICBpZiAocFJlc0JpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaCA9IG5ldyBDRlhfR2x5cGhCaXRtYXA7Ci0gICAgcEdseXBoLT5tX0xlZnQgPSBsZWZ0OwotICAgIHBHbHlwaC0+bV9Ub3AgPSAtdG9wOwotICAgIHBHbHlwaC0+bV9CaXRtYXAuVGFrZU92ZXIocFJlc0JpdG1hcCk7Ci0gICAgZGVsZXRlIHBSZXNCaXRtYXA7Ci0gICAgcmV0dXJuIHBHbHlwaDsKLX0KLXZvaWQgX0NQREZfVW5pcXVlS2V5R2VuOjpHZW5lcmF0ZShpbnQgY291bnQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ0xpc3Q7Ci0gICAgdmFfc3RhcnQoYXJnTGlzdCwgY291bnQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgaW50IHAgPSB2YV9hcmcoYXJnTGlzdCwgaW50KTsKLSAgICAgICAgKChGWF9EV09SRCopbV9LZXkpW2ldID0gcDsKLSAgICB9Ci0gICAgdmFfZW5kKGFyZ0xpc3QpOwotICAgIG1fS2V5TGVuID0gY291bnQgKiBzaXplb2YoRlhfRFdPUkQpOwotfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1RleHQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoKQotewotICAgIGlmKHRleHRvYmotPm1fbkNoYXJzID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGludCB0ZXh0X3JlbmRlcl9tb2RlID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fVGV4dE1vZGU7Ci0gICAgaWYgKHRleHRfcmVuZGVyX21vZGUgPT0gMykgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICBpZiAocEZvbnQtPkdldEZvbnRUeXBlKCkgPT0gUERGRk9OVF9UWVBFMykgewotICAgICAgICByZXR1cm4gUHJvY2Vzc1R5cGUzVGV4dCh0ZXh0b2JqLCBwT2JqMkRldmljZSk7Ci0gICAgfQotICAgIEZYX0JPT0wgYkZpbGwgPSBGQUxTRSwgYlN0cm9rZSA9IEZBTFNFLCBiQ2xpcCA9IEZBTFNFOwotICAgIGlmIChwQ2xpcHBpbmdQYXRoKSB7Ci0gICAgICAgIGJDbGlwID0gVFJVRTsKK3N0YXRpYyBpbnQgX0RldGVjdEZpcnN0TGFzdFNjYW4oY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBGWF9CT09MIGJGaXJzdCkgeworICBpbnQgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCksIHBpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKSwKKyAgICAgIHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKKyAgaW50IGJwcCA9IHBCaXRtYXAtPkdldEJQUCgpOworICBpZiAoYnBwID4gOCkgeworICAgIHdpZHRoICo9IGJwcCAvIDg7CisgIH0KKyAgdWludDhfdCogcEJ1ZiA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOworICBpbnQgbGluZSA9IGJGaXJzdCA/IDAgOiBoZWlnaHQgLSAxOworICBpbnQgbGluZV9zdGVwID0gYkZpcnN0ID8gMSA6IC0xOworICBpbnQgbGluZV9lbmQgPSBiRmlyc3QgPyBoZWlnaHQgOiAtMTsKKyAgd2hpbGUgKGxpbmUgIT0gbGluZV9lbmQpIHsKKyAgICBpZiAoYnBwID09IDEpIHsKKyAgICAgIGlmIChfSXNTY2FuTGluZTFicHAocEJ1ZiArIGxpbmUgKiBwaXRjaCwgd2lkdGgpKSB7CisgICAgICAgIHJldHVybiBsaW5lOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAodGV4dF9yZW5kZXJfbW9kZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIGJGaWxsID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICBpZiAocEZvbnQtPkdldEZhY2UoKSA9PSBOVUxMICYmICEocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfR0xZUEhQQVRIKSkgewotICAgICAgICAgICAgICAgICAgICBiRmlsbCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYlN0cm9rZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgIGlmIChwRm9udC0+R2V0RmFjZSgpID09IE5VTEwgJiYgIShwRm9udC0+R2V0U3Vic3RGb250KCktPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9HTFlQSFBBVEgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJGaWxsID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiRmlsbCA9IGJTdHJva2UgPSBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYkZpbGwgPSBUUlVFOwotICAgICAgICB9CisgICAgICBpZiAoX0lzU2NhbkxpbmU4YnBwKHBCdWYgKyBsaW5lICogcGl0Y2gsIHdpZHRoKSkgeworICAgICAgICByZXR1cm4gbGluZTsKKyAgICAgIH0KICAgICB9Ci0gICAgRlhfQVJHQiBzdHJva2VfYXJnYiA9IDAsIGZpbGxfYXJnYiA9IDA7Ci0gICAgRlhfQk9PTCBiUGF0dGVybiA9IEZBTFNFOwotICAgIGlmIChiU3Ryb2tlKSB7Ci0gICAgICAgIGlmICh0ZXh0b2JqLT5tX0NvbG9yU3RhdGUuR2V0U3Ryb2tlQ29sb3IoKS0+SXNQYXR0ZXJuKCkpIHsKLSAgICAgICAgICAgIGJQYXR0ZXJuID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0cm9rZV9hcmdiID0gR2V0U3Ryb2tlQXJnYih0ZXh0b2JqKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYkZpbGwpIHsKLSAgICAgICAgaWYgKHRleHRvYmotPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKS0+SXNQYXR0ZXJuKCkpIHsKLSAgICAgICAgICAgIGJQYXR0ZXJuID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHRleHRvYmopOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggdGV4dF9tYXRyaXg7Ci0gICAgdGV4dG9iai0+R2V0VGV4dE1hdHJpeCgmdGV4dF9tYXRyaXgpOwotICAgIGlmKElzQXZhaWxhYmxlTWF0cml4KHRleHRfbWF0cml4KSA9PSBGQUxTRSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgZm9udF9zaXplID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKLSAgICBpZiAoYlBhdHRlcm4pIHsKLSAgICAgICAgRHJhd1RleHRQYXRoV2l0aFBhdHRlcm4odGV4dG9iaiwgcE9iajJEZXZpY2UsIHBGb250LCBmb250X3NpemUsICZ0ZXh0X21hdHJpeCwgYkZpbGwsIGJTdHJva2UpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKGJDbGlwIHx8IGJTdHJva2UpIHsKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERldmljZU1hdHJpeCA9IHBPYmoyRGV2aWNlOwotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGRldmljZV9tYXRyaXg7Ci0gICAgICAgIGlmIChiU3Ryb2tlKSB7Ci0gICAgICAgICAgICBjb25zdCBGWF9GTE9BVCogcENUTSA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NUTTsKLSAgICAgICAgICAgIGlmIChwQ1RNWzBdICE9IDEuMGYgfHwgcENUTVszXSAhPSAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBjdG0ocENUTVswXSwgcENUTVsxXSwgcENUTVsyXSwgcENUTVszXSwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgdGV4dF9tYXRyaXguQ29uY2F0SW52ZXJzZShjdG0pOwotICAgICAgICAgICAgICAgIGRldmljZV9tYXRyaXguQ29weShjdG0pOwotICAgICAgICAgICAgICAgIGRldmljZV9tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7Ci0gICAgICAgICAgICAgICAgcERldmljZU1hdHJpeCA9ICZkZXZpY2VfbWF0cml4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBmbGFnID0gMDsKLSAgICAgICAgaWYgKGJTdHJva2UgJiYgYkZpbGwpIHsKLSAgICAgICAgICAgIGZsYWcgfD0gRlhfRklMTF9TVFJPS0U7Ci0gICAgICAgICAgICBmbGFnIHw9IEZYX1NUUk9LRV9URVhUX01PREU7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbERhdGEgPSAoKENQREZfUGFnZU9iamVjdCopdGV4dG9iaiktPm1fR2VuZXJhbFN0YXRlOwotICAgICAgICBpZiAocEdlbmVyYWxEYXRhICYmIHBHZW5lcmFsRGF0YS0+bV9TdHJva2VBZGp1c3QpIHsKLSAgICAgICAgICAgIGZsYWcgfD0gRlhfU1RST0tFX0FESlVTVDsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTk9URVhUU01PT1RIKSB7Ci0gICAgICAgICAgICBmbGFnIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFBhdGgobV9wRGV2aWNlLCB0ZXh0b2JqLT5tX25DaGFycywgdGV4dG9iai0+bV9wQ2hhckNvZGVzLCB0ZXh0b2JqLT5tX3BDaGFyUG9zLCBwRm9udCwgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9tYXRyaXgsIHBEZXZpY2VNYXRyaXgsIHRleHRvYmotPm1fR3JhcGhTdGF0ZSwgZmlsbF9hcmdiLCBzdHJva2VfYXJnYiwgcENsaXBwaW5nUGF0aCwgZmxhZyk7Ci0gICAgfQotICAgIHRleHRfbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICAgIHJldHVybiBDUERGX1RleHRSZW5kZXJlcjo6RHJhd05vcm1hbFRleHQobV9wRGV2aWNlLCB0ZXh0b2JqLT5tX25DaGFycywgdGV4dG9iai0+bV9wQ2hhckNvZGVzLCB0ZXh0b2JqLT5tX3BDaGFyUG9zLCBwRm9udCwgZm9udF9zaXplLAotICAgICAgICAgICAgJnRleHRfbWF0cml4LCBmaWxsX2FyZ2IsICZtX09wdGlvbnMpOworICAgIGxpbmUgKz0gbGluZV9zdGVwOworICB9CisgIHJldHVybiAtMTsKIH0KLUNQREZfVHlwZTNDYWNoZSogQ1BERl9SZW5kZXJTdGF0dXM6OkdldENhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkKLXsKLSAgICBpZiAocEZvbnQtPm1fcERvY3VtZW50ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitDRlhfR2x5cGhCaXRtYXAqIENQREZfVHlwZTNDYWNoZTo6UmVuZGVyR2x5cGgoQ1BERl9UeXBlM0dseXBocyogcFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmV0aW5hU2NhbGVZKSB7CisgIENQREZfVHlwZTNDaGFyKiBwQ2hhciA9IG1fcEZvbnQtPkxvYWRDaGFyKGNoYXJjb2RlKTsKKyAgaWYgKHBDaGFyID09IE5VTEwgfHwgcENoYXItPm1fcEJpdG1hcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gcENoYXItPm1fcEJpdG1hcDsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBpbWFnZV9tYXRyaXgsIHRleHRfbWF0cml4OworICBpbWFnZV9tYXRyaXggPSBwQ2hhci0+bV9JbWFnZU1hdHJpeDsKKyAgdGV4dF9tYXRyaXguU2V0KHBNYXRyaXgtPmEsIHBNYXRyaXgtPmIsIHBNYXRyaXgtPmMsIHBNYXRyaXgtPmQsIDAsIDApOworICBpbWFnZV9tYXRyaXguQ29uY2F0KHRleHRfbWF0cml4KTsKKyAgQ0ZYX0RJQml0bWFwKiBwUmVzQml0bWFwID0gTlVMTDsKKyAgaW50IGxlZnQsIHRvcDsKKyAgaWYgKEZYU1lTX2ZhYnMoaW1hZ2VfbWF0cml4LmIpIDwgRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguYSkgLyAxMDAgJiYKKyAgICAgIEZYU1lTX2ZhYnMoaW1hZ2VfbWF0cml4LmMpIDwgRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguZCkgLyAxMDApIHsKKyAgICBpbnQgdG9wX2xpbmUsIGJvdHRvbV9saW5lOworICAgIHRvcF9saW5lID0gX0RldGVjdEZpcnN0TGFzdFNjYW4ocEJpdG1hcCwgVFJVRSk7CisgICAgYm90dG9tX2xpbmUgPSBfRGV0ZWN0Rmlyc3RMYXN0U2NhbihwQml0bWFwLCBGQUxTRSk7CisgICAgaWYgKHRvcF9saW5lID09IDAgJiYgYm90dG9tX2xpbmUgPT0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSAxKSB7CisgICAgICBGWF9GTE9BVCB0b3BfeSA9IGltYWdlX21hdHJpeC5kICsgaW1hZ2VfbWF0cml4LmY7CisgICAgICBGWF9GTE9BVCBib3R0b21feSA9IGltYWdlX21hdHJpeC5mOworICAgICAgRlhfQk9PTCBiRmxpcHBlZCA9IHRvcF95ID4gYm90dG9tX3k7CisgICAgICBpZiAoYkZsaXBwZWQpIHsKKyAgICAgICAgRlhfRkxPQVQgdGVtcCA9IHRvcF95OworICAgICAgICB0b3BfeSA9IGJvdHRvbV95OworICAgICAgICBib3R0b21feSA9IHRlbXA7CisgICAgICB9CisgICAgICBwU2l6ZS0+QWRqdXN0Qmx1ZSh0b3BfeSwgYm90dG9tX3ksIHRvcF9saW5lLCBib3R0b21fbGluZSk7CisgICAgICBwUmVzQml0bWFwID0gcEJpdG1hcC0+U3RyZXRjaFRvKAorICAgICAgICAgIChpbnQpKEZYU1lTX3JvdW5kKGltYWdlX21hdHJpeC5hKSAqIHJldGluYVNjYWxlWCksCisgICAgICAgICAgKGludCkoKGJGbGlwcGVkID8gdG9wX2xpbmUgLSBib3R0b21fbGluZSA6IGJvdHRvbV9saW5lIC0gdG9wX2xpbmUpICoKKyAgICAgICAgICAgICAgICByZXRpbmFTY2FsZVkpKTsKKyAgICAgIHRvcCA9IHRvcF9saW5lOworICAgICAgaWYgKGltYWdlX21hdHJpeC5hIDwgMCkgeworICAgICAgICBpbWFnZV9tYXRyaXguU2NhbGUocmV0aW5hU2NhbGVYLCByZXRpbmFTY2FsZVkpOworICAgICAgICBsZWZ0ID0gRlhTWVNfcm91bmQoaW1hZ2VfbWF0cml4LmUgKyBpbWFnZV9tYXRyaXguYSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsZWZ0ID0gRlhTWVNfcm91bmQoaW1hZ2VfbWF0cml4LmUpOworICAgICAgfQorICAgIH0gZWxzZSB7CiAgICAgfQotICAgIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChwRm9udC0+R2V0Rm9udERpY3QoKSwgRkFMU0UpOwotICAgIHJldHVybiBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFJlbmRlckRhdGEoKS0+R2V0Q2FjaGVkVHlwZTMocEZvbnQpOworICB9CisgIGlmIChwUmVzQml0bWFwID09IE5VTEwpIHsKKyAgICBpbWFnZV9tYXRyaXguU2NhbGUocmV0aW5hU2NhbGVYLCByZXRpbmFTY2FsZVkpOworICAgIHBSZXNCaXRtYXAgPSBwQml0bWFwLT5UcmFuc2Zvcm1UbygmaW1hZ2VfbWF0cml4LCBsZWZ0LCB0b3ApOworICB9CisgIGlmIChwUmVzQml0bWFwID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaCA9IG5ldyBDRlhfR2x5cGhCaXRtYXA7CisgIHBHbHlwaC0+bV9MZWZ0ID0gbGVmdDsKKyAgcEdseXBoLT5tX1RvcCA9IC10b3A7CisgIHBHbHlwaC0+bV9CaXRtYXAuVGFrZU92ZXIocFJlc0JpdG1hcCk7CisgIGRlbGV0ZSBwUmVzQml0bWFwOworICByZXR1cm4gcEdseXBoOwogfQotc3RhdGljIHZvaWQgUmVsZWFzZUNhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkKLXsKLSAgICBpZiAocEZvbnQtPm1fcERvY3VtZW50ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFJlbmRlckRhdGEoKS0+UmVsZWFzZUNhY2hlZFR5cGUzKHBGb250KTsKLSAgICBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VGb250KHBGb250LT5HZXRGb250RGljdCgpKTsKK3ZvaWQgX0NQREZfVW5pcXVlS2V5R2VuOjpHZW5lcmF0ZShpbnQgY291bnQsIC4uLikgeworICB2YV9saXN0IGFyZ0xpc3Q7CisgIHZhX3N0YXJ0KGFyZ0xpc3QsIGNvdW50KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaW50IHAgPSB2YV9hcmcoYXJnTGlzdCwgaW50KTsKKyAgICAoKEZYX0RXT1JEKiltX0tleSlbaV0gPSBwOworICB9CisgIHZhX2VuZChhcmdMaXN0KTsKKyAgbV9LZXlMZW4gPSBjb3VudCAqIHNpemVvZihGWF9EV09SRCk7CiB9Ci1GWF9CT09MIENQREZfVHlwZTNDaGFyOjpMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpCi17Ci0gICAgaWYgKG1fcEJpdG1hcCAhPSBOVUxMIHx8IG1fcEZvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKG1fcEZvcm0tPkNvdW50T2JqZWN0cygpID09IDEgJiYgIW1fYkNvbG9yZWQpIHsKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0ICpwUGFnZU9iaiA9IG1fcEZvcm0tPkdldE9iamVjdEF0KG1fcEZvcm0tPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKSk7Ci0gICAgICAgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UpIHsKLSAgICAgICAgICAgIENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSA9IChDUERGX0ltYWdlT2JqZWN0KilwUGFnZU9iajsKLSAgICAgICAgICAgIG1fSW1hZ2VNYXRyaXggPSBwSW1hZ2UtPm1fTWF0cml4OwotICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSA9IHBJbWFnZS0+bV9wSW1hZ2UtPkxvYWRESUJTb3VyY2UoKTsKLSAgICAgICAgICAgIGlmIChwU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgbV9wQml0bWFwID0gcFNvdXJjZS0+Q2xvbmUoKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcFNvdXJjZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZSBtX3BGb3JtOwotICAgICAgICAgICAgbV9wRm9ybSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1jbGFzcyBDUERGX1JlZlR5cGUzQ2FjaGUKLXsKLXB1YmxpYzoKLSAgICBDUERGX1JlZlR5cGUzQ2FjaGUoQ1BERl9UeXBlM0ZvbnQqIHBUeXBlM0ZvbnQpCi0gICAgewotICAgICAgICBtX2R3Q291bnQgPSAwOwotICAgICAgICBtX3BUeXBlM0ZvbnQgPSBwVHlwZTNGb250OwotICAgIH0KLSAgICB+Q1BERl9SZWZUeXBlM0NhY2hlKCkKLSAgICB7Ci0gICAgICAgIHdoaWxlKG1fZHdDb3VudC0tKSB7Ci0gICAgICAgICAgICBSZWxlYXNlQ2FjaGVkVHlwZTMobV9wVHlwZTNGb250KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9EV09SRCBtX2R3Q291bnQ7Ci0gICAgQ1BERl9UeXBlM0ZvbnQqIG1fcFR5cGUzRm9udDsKLX07Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzVHlwZTNUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCi17Ci0gICAgQ1BERl9UeXBlM0ZvbnQqIHBUeXBlM0ZvbnQgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250KCktPkdldFR5cGUzRm9udCgpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgbV9UeXBlM0ZvbnRDYWNoZS5HZXRTaXplKCk7IGorKykKLSAgICAgICAgaWYgKChDUERGX1R5cGUzRm9udCopbV9UeXBlM0ZvbnRDYWNoZS5HZXRBdChqKSA9PSBwVHlwZTNGb250KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIENGWF9NYXRyaXggZENUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7Ci0gICAgRlhfRkxPQVQgc2EgPSBGWFNZU19mYWJzKGRDVE0uYSk7Ci0gICAgRlhfRkxPQVQgc2QgPSBGWFNZU19mYWJzKGRDVE0uZCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCB0ZXh0X21hdHJpeDsKLSAgICB0ZXh0b2JqLT5HZXRUZXh0TWF0cml4KCZ0ZXh0X21hdHJpeCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBjaGFyX21hdHJpeCA9IHBUeXBlM0ZvbnQtPkdldEZvbnRNYXRyaXgoKTsKLSAgICBGWF9GTE9BVCBmb250X3NpemUgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOwotICAgIGNoYXJfbWF0cml4LlNjYWxlKGZvbnRfc2l6ZSwgZm9udF9zaXplKTsKLSAgICBGWF9BUkdCIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHRleHRvYmosIFRSVUUpOwotICAgIGludCBmaWxsX2FscGhhID0gRlhBUkdCX0EoZmlsbF9hcmdiKTsKLSAgICBpbnQgZGV2aWNlX2NsYXNzID0gbV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpOwotICAgIEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zID0gTlVMTDsKLSAgICBpZiAoZGV2aWNlX2NsYXNzID09IEZYRENfRElTUExBWSkgewotICAgICAgICBwR2x5cGhBbmRQb3MgPSBGWF9BbGxvYyhGWFRFWFRfR0xZUEhQT1MsIHRleHRvYmotPm1fbkNoYXJzKTsKLSAgICB9IGVsc2UgaWYgKGZpbGxfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX1JlZlR5cGUzQ2FjaGUgcmVmVHlwZUNhY2hlKHBUeXBlM0ZvbnQpOwotICAgIEZYX0RXT1JEICpwQ2hhcnMgPSB0ZXh0b2JqLT5tX3BDaGFyQ29kZXM7Ci0gICAgaWYgKHRleHRvYmotPm1fbkNoYXJzID09IDEpIHsKLSAgICAgICAgcENoYXJzID0gKEZYX0RXT1JEKikoJnRleHRvYmotPm1fcENoYXJDb2Rlcyk7Ci0gICAgfQotICAgIGZvciAoaW50IGlDaGFyID0gMDsgaUNoYXIgPCB0ZXh0b2JqLT5tX25DaGFyczsgaUNoYXIgKyspIHsKLSAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBwQ2hhcnNbaUNoYXJdOwotICAgICAgICBpZiAoY2hhcmNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyID0gcFR5cGUzRm9udC0+TG9hZENoYXIoY2hhcmNvZGUpOwotICAgICAgICBpZiAocFR5cGUzQ2hhciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCA9IGNoYXJfbWF0cml4OwotICAgICAgICBtYXRyaXguZSArPSBpQ2hhciA/IHRleHRvYmotPm1fcENoYXJQb3NbaUNoYXIgLSAxXSA6IDA7Ci0gICAgICAgIG1hdHJpeC5Db25jYXQodGV4dF9tYXRyaXgpOwotICAgICAgICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7Ci0gICAgICAgIGlmICghcFR5cGUzQ2hhci0+TG9hZEJpdG1hcChtX3BDb250ZXh0KSkgewotICAgICAgICAgICAgaWYgKHBHbHlwaEFuZFBvcykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNoYXI7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA9IHBHbHlwaEFuZFBvc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdseXBoLm1fcEdseXBoID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcERldmljZS0+U2V0Qml0TWFzaygmZ2x5cGgubV9wR2x5cGgtPm1fQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgubV9PcmlnaW5YICsgZ2x5cGgubV9wR2x5cGgtPm1fTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLm1fT3JpZ2luWSAtIGdseXBoLm1fcEdseXBoLT5tX1RvcCwgZmlsbF9hcmdiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICAgICAgICAgIHBHbHlwaEFuZFBvcyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUERGX0dyYXBoaWNTdGF0ZXMqIHBTdGF0ZXMgPSBDbG9uZU9ialN0YXRlcyh0ZXh0b2JqLCBGQUxTRSk7Ci0gICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMgT3B0aW9ucyA9IG1fT3B0aW9uczsKLSAgICAgICAgICAgIE9wdGlvbnMubV9GbGFncyB8PSBSRU5ERVJfRk9SQ0VfSEFMRlRPTkUgfCBSRU5ERVJfUkVDVF9BQTsKLSAgICAgICAgICAgIE9wdGlvbnMubV9GbGFncyAmPSB+UkVOREVSX0ZPUkNFX0RPV05TQU1QTEU7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPSBOVUxMOwotICAgICAgICAgICAgaWYgKHBUeXBlM0NoYXItPm1fcEZvcm0gJiYgcFR5cGUzQ2hhci0+bV9wRm9ybS0+bV9wRm9ybURpY3QpIHsKLSAgICAgICAgICAgICAgICBwRm9ybVJlc291cmNlID0gcFR5cGUzQ2hhci0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWxsX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKLSAgICAgICAgICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIE5VTEwsIHRoaXMsIHBTdGF0ZXMsICZPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlM0NoYXItPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgRkFMU0UsIHBUeXBlM0NoYXIsIGZpbGxfYXJnYik7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQXBwZW5kKG1fVHlwZTNGb250Q2FjaGUpOwotICAgICAgICAgICAgICAgIHN0YXR1cy5tX1R5cGUzRm9udENhY2hlLkFkZChwVHlwZTNGb250KTsKLSAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOwotICAgICAgICAgICAgICAgIHN0YXR1cy5SZW5kZXJPYmplY3RMaXN0KHBUeXBlM0NoYXItPm1fcEZvcm0sICZtYXRyaXgpOwotICAgICAgICAgICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdF9mID0gcFR5cGUzQ2hhci0+bV9wRm9ybS0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0gICAgICAgICAgICAgICAgcmVjdF9mLlRyYW5zZm9ybSgmbWF0cml4KTsKLSAgICAgICAgICAgICAgICBGWF9SRUNUIHJlY3QgPSByZWN0X2YuR2V0T3V0dGVyUmVjdCgpOwotICAgICAgICAgICAgICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7Ci0gICAgICAgICAgICAgICAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSgoaW50KShyZWN0LldpZHRoKCkgKiBzYSksIChpbnQpKHJlY3QuSGVpZ2h0KCkgKiBzZCksIEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiaXRtYXBfZGV2aWNlLkdldEJpdG1hcCgpLT5DbGVhcigwKTsKLSAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UsIE5VTEwsIE5VTEwsIHRoaXMsIHBTdGF0ZXMsICZPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlM0NoYXItPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgRkFMU0UsIHBUeXBlM0NoYXIsIGZpbGxfYXJnYik7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQXBwZW5kKG1fVHlwZTNGb250Q2FjaGUpOwotICAgICAgICAgICAgICAgIHN0YXR1cy5tX1R5cGUzRm9udENhY2hlLkFkZChwVHlwZTNGb250KTsKLSAgICAgICAgICAgICAgICBtYXRyaXguVHJhbnNsYXRlSSgtcmVjdC5sZWZ0LCAtcmVjdC50b3ApOwotICAgICAgICAgICAgICAgIG1hdHJpeC5TY2FsZShzYSwgc2QpOwotICAgICAgICAgICAgICAgIHN0YXR1cy5SZW5kZXJPYmplY3RMaXN0KHBUeXBlM0NoYXItPm1fcEZvcm0sICZtYXRyaXgpOwotICAgICAgICAgICAgICAgIG1fcERldmljZS0+U2V0RElCaXRzKGJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCksIHJlY3QubGVmdCwgcmVjdC50b3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVsZXRlIHBTdGF0ZXM7Ci0gICAgICAgIH0gZWxzZSBpZiAocFR5cGUzQ2hhci0+bV9wQml0bWFwKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlX2NsYXNzID09IEZYRENfRElTUExBWSkgewotICAgICAgICAgICAgICAgIENQREZfVHlwZTNDYWNoZSogcENhY2hlID0gR2V0Q2FjaGVkVHlwZTMocFR5cGUzRm9udCk7Ci0gICAgICAgICAgICAgICAgcmVmVHlwZUNhY2hlLm1fZHdDb3VudCsrOwotICAgICAgICAgICAgICAgIENGWF9HbHlwaEJpdG1hcCogcEJpdG1hcCA9IHBDYWNoZS0+TG9hZEdseXBoKGNoYXJjb2RlLCAmbWF0cml4LCBzYSwgc2QpOwotICAgICAgICAgICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBvcmlnaW5feCA9IEZYU1lTX3JvdW5kKG1hdHJpeC5lKTsKLSAgICAgICAgICAgICAgICBpbnQgb3JpZ2luX3kgPSBGWFNZU19yb3VuZChtYXRyaXguZik7Ci0gICAgICAgICAgICAgICAgaWYgKHBHbHlwaEFuZFBvcykgewotICAgICAgICAgICAgICAgICAgICBwR2x5cGhBbmRQb3NbaUNoYXJdLm1fcEdseXBoID0gcEJpdG1hcDsKLSAgICAgICAgICAgICAgICAgICAgcEdseXBoQW5kUG9zW2lDaGFyXS5tX09yaWdpblggPSBvcmlnaW5feDsKLSAgICAgICAgICAgICAgICAgICAgcEdseXBoQW5kUG9zW2lDaGFyXS5tX09yaWdpblkgPSBvcmlnaW5feTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPlNldEJpdE1hc2soJnBCaXRtYXAtPm1fQml0bWFwLCBvcmlnaW5feCArIHBCaXRtYXAtPm1fTGVmdCwgb3JpZ2luX3kgLSBwQml0bWFwLT5tX1RvcCwgZmlsbF9hcmdiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggaW1hZ2VfbWF0cml4ID0gcFR5cGUzQ2hhci0+bV9JbWFnZU1hdHJpeDsKLSAgICAgICAgICAgICAgICBpbWFnZV9tYXRyaXguQ29uY2F0KG1hdHJpeCk7Ci0gICAgICAgICAgICAgICAgQ1BERl9JbWFnZVJlbmRlcmVyIHJlbmRlcmVyOwotICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci5TdGFydCh0aGlzLCBwVHlwZTNDaGFyLT5tX3BCaXRtYXAsIGZpbGxfYXJnYiwgMjU1LCAmaW1hZ2VfbWF0cml4LCAwLCBGQUxTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuQ29udGludWUoTlVMTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcmVuZGVyZXIubV9SZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocEdseXBoQW5kUG9zKSB7Ci0gICAgICAgIEZYX1JFQ1QgcmVjdCA9IEZYR0VfR2V0R2x5cGhzQkJveChwR2x5cGhBbmRQb3MsIHRleHRvYmotPm1fbkNoYXJzLCAwLCBzYSwgc2QpOwotICAgICAgICBDRlhfRElCaXRtYXAgYml0bWFwOwotICAgICAgICBpZiAoIWJpdG1hcC5DcmVhdGUoKGludCkocmVjdC5XaWR0aCgpICogc2EpLCAoaW50KShyZWN0LkhlaWdodCgpICogc2QpLCBGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGJpdG1hcC5DbGVhcigwKTsKLSAgICAgICAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IHRleHRvYmotPm1fbkNoYXJzOyBpQ2hhciArKykgewotICAgICAgICAgICAgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA9IHBHbHlwaEFuZFBvc1tpQ2hhcl07Ci0gICAgICAgICAgICBpZiAoZ2x5cGgubV9wR2x5cGggPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYml0bWFwLlRyYW5zZmVyQml0bWFwKChpbnQpKChnbHlwaC5tX09yaWdpblggKyBnbHlwaC5tX3BHbHlwaC0+bV9MZWZ0IC0gcmVjdC5sZWZ0KSAqIHNhKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoZ2x5cGgubV9PcmlnaW5ZIC0gZ2x5cGgubV9wR2x5cGgtPm1fVG9wIC0gcmVjdC50b3ApICogc2QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLm1fcEdseXBoLT5tX0JpdG1hcC5HZXRXaWR0aCgpLCBnbHlwaC5tX3BHbHlwaC0+bV9CaXRtYXAuR2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoLm1fcEdseXBoLT5tX0JpdG1hcCwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGV2aWNlLT5TZXRCaXRNYXNrKCZiaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIGZpbGxfYXJnYik7Ci0gICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICB9CitGWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCkgeworICBpZiAodGV4dG9iai0+bV9uQ2hhcnMgPT0gMCkgewogICAgIHJldHVybiBUUlVFOworICB9CisgIGludCB0ZXh0X3JlbmRlcl9tb2RlID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fVGV4dE1vZGU7CisgIGlmICh0ZXh0X3JlbmRlcl9tb2RlID09IDMpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBDUERGX0ZvbnQqIHBGb250ID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udCgpOworICBpZiAocEZvbnQtPkdldEZvbnRUeXBlKCkgPT0gUERGRk9OVF9UWVBFMykgeworICAgIHJldHVybiBQcm9jZXNzVHlwZTNUZXh0KHRleHRvYmosIHBPYmoyRGV2aWNlKTsKKyAgfQorICBGWF9CT09MIGJGaWxsID0gRkFMU0UsIGJTdHJva2UgPSBGQUxTRSwgYkNsaXAgPSBGQUxTRTsKKyAgaWYgKHBDbGlwcGluZ1BhdGgpIHsKKyAgICBiQ2xpcCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoICh0ZXh0X3JlbmRlcl9tb2RlKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDQ6CisgICAgICAgIGJGaWxsID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDU6CisgICAgICAgIGlmIChwRm9udC0+R2V0RmFjZSgpID09IE5VTEwgJiYKKyAgICAgICAgICAgICEocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfR0xZUEhQQVRIKSkgeworICAgICAgICAgIGJGaWxsID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBiU3Ryb2tlID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaWYgKHBGb250LT5HZXRGYWNlKCkgPT0gTlVMTCAmJgorICAgICAgICAgICAgIShwRm9udC0+R2V0U3Vic3RGb250KCktPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9HTFlQSFBBVEgpKSB7CisgICAgICAgICAgYkZpbGwgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJGaWxsID0gYlN0cm9rZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICBjYXNlIDc6CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYkZpbGwgPSBUUlVFOworICAgIH0KKyAgfQorICBGWF9BUkdCIHN0cm9rZV9hcmdiID0gMCwgZmlsbF9hcmdiID0gMDsKKyAgRlhfQk9PTCBiUGF0dGVybiA9IEZBTFNFOworICBpZiAoYlN0cm9rZSkgeworICAgIGlmICh0ZXh0b2JqLT5tX0NvbG9yU3RhdGUuR2V0U3Ryb2tlQ29sb3IoKS0+SXNQYXR0ZXJuKCkpIHsKKyAgICAgIGJQYXR0ZXJuID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgc3Ryb2tlX2FyZ2IgPSBHZXRTdHJva2VBcmdiKHRleHRvYmopOworICAgIH0KKyAgfQorICBpZiAoYkZpbGwpIHsKKyAgICBpZiAodGV4dG9iai0+bV9Db2xvclN0YXRlLkdldEZpbGxDb2xvcigpLT5Jc1BhdHRlcm4oKSkgeworICAgICAgYlBhdHRlcm4gPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBmaWxsX2FyZ2IgPSBHZXRGaWxsQXJnYih0ZXh0b2JqKTsKKyAgICB9CisgIH0KKyAgQ0ZYX0FmZmluZU1hdHJpeCB0ZXh0X21hdHJpeDsKKyAgdGV4dG9iai0+R2V0VGV4dE1hdHJpeCgmdGV4dF9tYXRyaXgpOworICBpZiAoSXNBdmFpbGFibGVNYXRyaXgodGV4dF9tYXRyaXgpID09IEZBTFNFKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgRlhfRkxPQVQgZm9udF9zaXplID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKKyAgaWYgKGJQYXR0ZXJuKSB7CisgICAgRHJhd1RleHRQYXRoV2l0aFBhdHRlcm4odGV4dG9iaiwgcE9iajJEZXZpY2UsIHBGb250LCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRfbWF0cml4LCBiRmlsbCwgYlN0cm9rZSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGJDbGlwIHx8IGJTdHJva2UpIHsKKyAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRGV2aWNlTWF0cml4ID0gcE9iajJEZXZpY2U7CisgICAgQ0ZYX0FmZmluZU1hdHJpeCBkZXZpY2VfbWF0cml4OworICAgIGlmIChiU3Ryb2tlKSB7CisgICAgICBjb25zdCBGWF9GTE9BVCogcENUTSA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NUTTsKKyAgICAgIGlmIChwQ1RNWzBdICE9IDEuMGYgfHwgcENUTVszXSAhPSAxLjBmKSB7CisgICAgICAgIENGWF9BZmZpbmVNYXRyaXggY3RtKHBDVE1bMF0sIHBDVE1bMV0sIHBDVE1bMl0sIHBDVE1bM10sIDAsIDApOworICAgICAgICB0ZXh0X21hdHJpeC5Db25jYXRJbnZlcnNlKGN0bSk7CisgICAgICAgIGRldmljZV9tYXRyaXguQ29weShjdG0pOworICAgICAgICBkZXZpY2VfbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOworICAgICAgICBwRGV2aWNlTWF0cml4ID0gJmRldmljZV9tYXRyaXg7CisgICAgICB9CisgICAgfQorICAgIGludCBmbGFnID0gMDsKKyAgICBpZiAoYlN0cm9rZSAmJiBiRmlsbCkgeworICAgICAgZmxhZyB8PSBGWF9GSUxMX1NUUk9LRTsKKyAgICAgIGZsYWcgfD0gRlhfU1RST0tFX1RFWFRfTU9ERTsKKyAgICB9CisgICAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbERhdGEgPQorICAgICAgICAoKENQREZfUGFnZU9iamVjdCopdGV4dG9iaiktPm1fR2VuZXJhbFN0YXRlOworICAgIGlmIChwR2VuZXJhbERhdGEgJiYgcEdlbmVyYWxEYXRhLT5tX1N0cm9rZUFkanVzdCkgeworICAgICAgZmxhZyB8PSBGWF9TVFJPS0VfQURKVVNUOworICAgIH0KKyAgICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTk9URVhUU01PT1RIKSB7CisgICAgICBmbGFnIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7CisgICAgfQorICAgIHJldHVybiBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRQYXRoKAorICAgICAgICBtX3BEZXZpY2UsIHRleHRvYmotPm1fbkNoYXJzLCB0ZXh0b2JqLT5tX3BDaGFyQ29kZXMsCisgICAgICAgIHRleHRvYmotPm1fcENoYXJQb3MsIHBGb250LCBmb250X3NpemUsICZ0ZXh0X21hdHJpeCwgcERldmljZU1hdHJpeCwKKyAgICAgICAgdGV4dG9iai0+bV9HcmFwaFN0YXRlLCBmaWxsX2FyZ2IsIHN0cm9rZV9hcmdiLCBwQ2xpcHBpbmdQYXRoLCBmbGFnKTsKKyAgfQorICB0ZXh0X21hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKKyAgcmV0dXJuIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3Tm9ybWFsVGV4dCgKKyAgICAgIG1fcERldmljZSwgdGV4dG9iai0+bV9uQ2hhcnMsIHRleHRvYmotPm1fcENoYXJDb2RlcywgdGV4dG9iai0+bV9wQ2hhclBvcywKKyAgICAgIHBGb250LCBmb250X3NpemUsICZ0ZXh0X21hdHJpeCwgZmlsbF9hcmdiLCAmbV9PcHRpb25zKTsKIH0KLWNsYXNzIENQREZfQ2hhclBvc0xpc3QKLXsKLXB1YmxpYzoKLSAgICBDUERGX0NoYXJQb3NMaXN0KCk7Ci0gICAgfkNQREZfQ2hhclBvc0xpc3QoKTsKLSAgICB2b2lkCQkJCUxvYWQoaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplKTsKLSAgICBGWFRFWFRfQ0hBUlBPUyoJCW1fcENoYXJQb3M7Ci0gICAgRlhfRFdPUkQJCQltX25DaGFyczsKK0NQREZfVHlwZTNDYWNoZSogQ1BERl9SZW5kZXJTdGF0dXM6OkdldENhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkgeworICBpZiAocEZvbnQtPm1fcERvY3VtZW50ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldEZvbnQocEZvbnQtPkdldEZvbnREaWN0KCksIEZBTFNFKTsKKyAgcmV0dXJuIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UmVuZGVyRGF0YSgpLT5HZXRDYWNoZWRUeXBlMyhwRm9udCk7Cit9CitzdGF0aWMgdm9pZCBSZWxlYXNlQ2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KSB7CisgIGlmIChwRm9udC0+bV9wRG9jdW1lbnQgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFJlbmRlckRhdGEoKS0+UmVsZWFzZUNhY2hlZFR5cGUzKHBGb250KTsKKyAgcEZvbnQtPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlRm9udChwRm9udC0+R2V0Rm9udERpY3QoKSk7Cit9CitGWF9CT09MIENQREZfVHlwZTNDaGFyOjpMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpIHsKKyAgaWYgKG1fcEJpdG1hcCAhPSBOVUxMIHx8IG1fcEZvcm0gPT0gTlVMTCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChtX3BGb3JtLT5Db3VudE9iamVjdHMoKSA9PSAxICYmICFtX2JDb2xvcmVkKSB7CisgICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9CisgICAgICAgIG1fcEZvcm0tPkdldE9iamVjdEF0KG1fcEZvcm0tPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKSk7CisgICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSkgeworICAgICAgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlID0gKENQREZfSW1hZ2VPYmplY3QqKXBQYWdlT2JqOworICAgICAgbV9JbWFnZU1hdHJpeCA9IHBJbWFnZS0+bV9NYXRyaXg7CisgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlID0gcEltYWdlLT5tX3BJbWFnZS0+TG9hZERJQlNvdXJjZSgpOworICAgICAgaWYgKHBTb3VyY2UpIHsKKyAgICAgICAgbV9wQml0bWFwID0gcFNvdXJjZS0+Q2xvbmUoKTsKKyAgICAgICAgZGVsZXRlIHBTb3VyY2U7CisgICAgICB9CisgICAgICBkZWxldGUgbV9wRm9ybTsKKyAgICAgIG1fcEZvcm0gPSBOVUxMOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KK2NsYXNzIENQREZfUmVmVHlwZTNDYWNoZSB7CisgcHVibGljOgorICBDUERGX1JlZlR5cGUzQ2FjaGUoQ1BERl9UeXBlM0ZvbnQqIHBUeXBlM0ZvbnQpIHsKKyAgICBtX2R3Q291bnQgPSAwOworICAgIG1fcFR5cGUzRm9udCA9IHBUeXBlM0ZvbnQ7CisgIH0KKyAgfkNQREZfUmVmVHlwZTNDYWNoZSgpIHsKKyAgICB3aGlsZSAobV9kd0NvdW50LS0pIHsKKyAgICAgIFJlbGVhc2VDYWNoZWRUeXBlMyhtX3BUeXBlM0ZvbnQpOworICAgIH0KKyAgfQorICBGWF9EV09SRCBtX2R3Q291bnQ7CisgIENQREZfVHlwZTNGb250KiBtX3BUeXBlM0ZvbnQ7Cit9OworRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1R5cGUzVGV4dCgKKyAgICBjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpIHsKKyAgQ1BERl9UeXBlM0ZvbnQqIHBUeXBlM0ZvbnQgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250KCktPkdldFR5cGUzRm9udCgpOworICBmb3IgKGludCBqID0gMDsgaiA8IG1fVHlwZTNGb250Q2FjaGUuR2V0U2l6ZSgpOyBqKyspCisgICAgaWYgKChDUERGX1R5cGUzRm9udCopbV9UeXBlM0ZvbnRDYWNoZS5HZXRBdChqKSA9PSBwVHlwZTNGb250KSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIENGWF9NYXRyaXggZENUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7CisgIEZYX0ZMT0FUIHNhID0gRlhTWVNfZmFicyhkQ1RNLmEpOworICBGWF9GTE9BVCBzZCA9IEZYU1lTX2ZhYnMoZENUTS5kKTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCB0ZXh0X21hdHJpeDsKKyAgdGV4dG9iai0+R2V0VGV4dE1hdHJpeCgmdGV4dF9tYXRyaXgpOworICBDRlhfQWZmaW5lTWF0cml4IGNoYXJfbWF0cml4ID0gcFR5cGUzRm9udC0+R2V0Rm9udE1hdHJpeCgpOworICBGWF9GTE9BVCBmb250X3NpemUgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOworICBjaGFyX21hdHJpeC5TY2FsZShmb250X3NpemUsIGZvbnRfc2l6ZSk7CisgIEZYX0FSR0IgZmlsbF9hcmdiID0gR2V0RmlsbEFyZ2IodGV4dG9iaiwgVFJVRSk7CisgIGludCBmaWxsX2FscGhhID0gRlhBUkdCX0EoZmlsbF9hcmdiKTsKKyAgaW50IGRldmljZV9jbGFzcyA9IG1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKTsKKyAgRlhURVhUX0dMWVBIUE9TKiBwR2x5cGhBbmRQb3MgPSBOVUxMOworICBpZiAoZGV2aWNlX2NsYXNzID09IEZYRENfRElTUExBWSkgeworICAgIHBHbHlwaEFuZFBvcyA9IEZYX0FsbG9jKEZYVEVYVF9HTFlQSFBPUywgdGV4dG9iai0+bV9uQ2hhcnMpOworICB9IGVsc2UgaWYgKGZpbGxfYWxwaGEgPCAyNTUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9SZWZUeXBlM0NhY2hlIHJlZlR5cGVDYWNoZShwVHlwZTNGb250KTsKKyAgRlhfRFdPUkQqIHBDaGFycyA9IHRleHRvYmotPm1fcENoYXJDb2RlczsKKyAgaWYgKHRleHRvYmotPm1fbkNoYXJzID09IDEpIHsKKyAgICBwQ2hhcnMgPSAoRlhfRFdPUkQqKSgmdGV4dG9iai0+bV9wQ2hhckNvZGVzKTsKKyAgfQorICBmb3IgKGludCBpQ2hhciA9IDA7IGlDaGFyIDwgdGV4dG9iai0+bV9uQ2hhcnM7IGlDaGFyKyspIHsKKyAgICBGWF9EV09SRCBjaGFyY29kZSA9IHBDaGFyc1tpQ2hhcl07CisgICAgaWYgKGNoYXJjb2RlID09IChGWF9EV09SRCktMSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyID0gcFR5cGUzRm9udC0+TG9hZENoYXIoY2hhcmNvZGUpOworICAgIGlmIChwVHlwZTNDaGFyID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCA9IGNoYXJfbWF0cml4OworICAgIG1hdHJpeC5lICs9IGlDaGFyID8gdGV4dG9iai0+bV9wQ2hhclBvc1tpQ2hhciAtIDFdIDogMDsKKyAgICBtYXRyaXguQ29uY2F0KHRleHRfbWF0cml4KTsKKyAgICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CisgICAgaWYgKCFwVHlwZTNDaGFyLT5Mb2FkQml0bWFwKG1fcENvbnRleHQpKSB7CisgICAgICBpZiAocEdseXBoQW5kUG9zKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNoYXI7IGkrKykgeworICAgICAgICAgIEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggPSBwR2x5cGhBbmRQb3NbaV07CisgICAgICAgICAgaWYgKGdseXBoLm1fcEdseXBoID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBtX3BEZXZpY2UtPlNldEJpdE1hc2soJmdseXBoLm1fcEdseXBoLT5tX0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgubV9PcmlnaW5YICsgZ2x5cGgubV9wR2x5cGgtPm1fTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgubV9PcmlnaW5ZIC0gZ2x5cGgubV9wR2x5cGgtPm1fVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2FyZ2IpOworICAgICAgICB9CisgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKKyAgICAgICAgcEdseXBoQW5kUG9zID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIENQREZfR3JhcGhpY1N0YXRlcyogcFN0YXRlcyA9IENsb25lT2JqU3RhdGVzKHRleHRvYmosIEZBTFNFKTsKKyAgICAgIENQREZfUmVuZGVyT3B0aW9ucyBPcHRpb25zID0gbV9PcHRpb25zOworICAgICAgT3B0aW9ucy5tX0ZsYWdzIHw9IFJFTkRFUl9GT1JDRV9IQUxGVE9ORSB8IFJFTkRFUl9SRUNUX0FBOworICAgICAgT3B0aW9ucy5tX0ZsYWdzICY9IH5SRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRTsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7CisgICAgICBpZiAocFR5cGUzQ2hhci0+bV9wRm9ybSAmJiBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgeworICAgICAgICBwRm9ybVJlc291cmNlID0KKyAgICAgICAgICAgIHBUeXBlM0NoYXItPm1fcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7CisgICAgICB9CisgICAgICBpZiAoZmlsbF9hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOworICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIE5VTEwsIHRoaXMsIHBTdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZPcHRpb25zLCBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIEZBTFNFLCBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2FyZ2IpOworICAgICAgICBzdGF0dXMubV9UeXBlM0ZvbnRDYWNoZS5BcHBlbmQobV9UeXBlM0ZvbnRDYWNoZSk7CisgICAgICAgIHN0YXR1cy5tX1R5cGUzRm9udENhY2hlLkFkZChwVHlwZTNGb250KTsKKyAgICAgICAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKKyAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocFR5cGUzQ2hhci0+bV9wRm9ybSwgJm1hdHJpeCk7CisgICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3RfZiA9IHBUeXBlM0NoYXItPm1fcEZvcm0tPkNhbGNCb3VuZGluZ0JveCgpOworICAgICAgICByZWN0X2YuVHJhbnNmb3JtKCZtYXRyaXgpOworICAgICAgICBGWF9SRUNUIHJlY3QgPSByZWN0X2YuR2V0T3V0dGVyUmVjdCgpOworICAgICAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlOworICAgICAgICBpZiAoIWJpdG1hcF9kZXZpY2UuQ3JlYXRlKChpbnQpKHJlY3QuV2lkdGgoKSAqIHNhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShyZWN0LkhlaWdodCgpICogc2QpLCBGWERJQl9BcmdiKSkgeworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIGJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCktPkNsZWFyKDApOworICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CisgICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLCBOVUxMLCB0aGlzLCBwU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmT3B0aW9ucywgcFR5cGUzQ2hhci0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlLCBGQUxTRSwgcFR5cGUzQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9hcmdiKTsKKyAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQXBwZW5kKG1fVHlwZTNGb250Q2FjaGUpOworICAgICAgICBzdGF0dXMubV9UeXBlM0ZvbnRDYWNoZS5BZGQocFR5cGUzRm9udCk7CisgICAgICAgIG1hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CisgICAgICAgIG1hdHJpeC5TY2FsZShzYSwgc2QpOworICAgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwVHlwZTNDaGFyLT5tX3BGb3JtLCAmbWF0cml4KTsKKyAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMoYml0bWFwX2RldmljZS5HZXRCaXRtYXAoKSwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7CisgICAgICB9CisgICAgICBkZWxldGUgcFN0YXRlczsKKyAgICB9IGVsc2UgaWYgKHBUeXBlM0NoYXItPm1fcEJpdG1hcCkgeworICAgICAgaWYgKGRldmljZV9jbGFzcyA9PSBGWERDX0RJU1BMQVkpIHsKKyAgICAgICAgQ1BERl9UeXBlM0NhY2hlKiBwQ2FjaGUgPSBHZXRDYWNoZWRUeXBlMyhwVHlwZTNGb250KTsKKyAgICAgICAgcmVmVHlwZUNhY2hlLm1fZHdDb3VudCsrOworICAgICAgICBDRlhfR2x5cGhCaXRtYXAqIHBCaXRtYXAgPSBwQ2FjaGUtPkxvYWRHbHlwaChjaGFyY29kZSwgJm1hdHJpeCwgc2EsIHNkKTsKKyAgICAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCBvcmlnaW5feCA9IEZYU1lTX3JvdW5kKG1hdHJpeC5lKTsKKyAgICAgICAgaW50IG9yaWdpbl95ID0gRlhTWVNfcm91bmQobWF0cml4LmYpOworICAgICAgICBpZiAocEdseXBoQW5kUG9zKSB7CisgICAgICAgICAgcEdseXBoQW5kUG9zW2lDaGFyXS5tX3BHbHlwaCA9IHBCaXRtYXA7CisgICAgICAgICAgcEdseXBoQW5kUG9zW2lDaGFyXS5tX09yaWdpblggPSBvcmlnaW5feDsKKyAgICAgICAgICBwR2x5cGhBbmRQb3NbaUNoYXJdLm1fT3JpZ2luWSA9IG9yaWdpbl95OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fcERldmljZS0+U2V0Qml0TWFzaygmcEJpdG1hcC0+bV9CaXRtYXAsIG9yaWdpbl94ICsgcEJpdG1hcC0+bV9MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5feSAtIHBCaXRtYXAtPm1fVG9wLCBmaWxsX2FyZ2IpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGltYWdlX21hdHJpeCA9IHBUeXBlM0NoYXItPm1fSW1hZ2VNYXRyaXg7CisgICAgICAgIGltYWdlX21hdHJpeC5Db25jYXQobWF0cml4KTsKKyAgICAgICAgQ1BERl9JbWFnZVJlbmRlcmVyIHJlbmRlcmVyOworICAgICAgICBpZiAocmVuZGVyZXIuU3RhcnQodGhpcywgcFR5cGUzQ2hhci0+bV9wQml0bWFwLCBmaWxsX2FyZ2IsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZV9tYXRyaXgsIDAsIEZBTFNFKSkgeworICAgICAgICAgIHJlbmRlcmVyLkNvbnRpbnVlKE5VTEwpOworICAgICAgICB9CisgICAgICAgIGlmICghcmVuZGVyZXIubV9SZXN1bHQpIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHBHbHlwaEFuZFBvcykgeworICAgIEZYX1JFQ1QgcmVjdCA9CisgICAgICAgIEZYR0VfR2V0R2x5cGhzQkJveChwR2x5cGhBbmRQb3MsIHRleHRvYmotPm1fbkNoYXJzLCAwLCBzYSwgc2QpOworICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7CisgICAgaWYgKCFiaXRtYXAuQ3JlYXRlKChpbnQpKHJlY3QuV2lkdGgoKSAqIHNhKSwgKGludCkocmVjdC5IZWlnaHQoKSAqIHNkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfOGJwcE1hc2spKSB7CisgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgYml0bWFwLkNsZWFyKDApOworICAgIGZvciAoaW50IGlDaGFyID0gMDsgaUNoYXIgPCB0ZXh0b2JqLT5tX25DaGFyczsgaUNoYXIrKykgeworICAgICAgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA9IHBHbHlwaEFuZFBvc1tpQ2hhcl07CisgICAgICBpZiAoZ2x5cGgubV9wR2x5cGggPT0gTlVMTCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGJpdG1hcC5UcmFuc2ZlckJpdG1hcCgKKyAgICAgICAgICAoaW50KSgoZ2x5cGgubV9PcmlnaW5YICsgZ2x5cGgubV9wR2x5cGgtPm1fTGVmdCAtIHJlY3QubGVmdCkgKiBzYSksCisgICAgICAgICAgKGludCkoKGdseXBoLm1fT3JpZ2luWSAtIGdseXBoLm1fcEdseXBoLT5tX1RvcCAtIHJlY3QudG9wKSAqIHNkKSwKKyAgICAgICAgICBnbHlwaC5tX3BHbHlwaC0+bV9CaXRtYXAuR2V0V2lkdGgoKSwKKyAgICAgICAgICBnbHlwaC5tX3BHbHlwaC0+bV9CaXRtYXAuR2V0SGVpZ2h0KCksICZnbHlwaC5tX3BHbHlwaC0+bV9CaXRtYXAsIDAsCisgICAgICAgICAgMCk7CisgICAgfQorICAgIG1fcERldmljZS0+U2V0Qml0TWFzaygmYml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wLCBmaWxsX2FyZ2IpOworICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK2NsYXNzIENQREZfQ2hhclBvc0xpc3QgeworIHB1YmxpYzoKKyAgQ1BERl9DaGFyUG9zTGlzdCgpOworICB+Q1BERl9DaGFyUG9zTGlzdCgpOworICB2b2lkIExvYWQoaW50IG5DaGFycywKKyAgICAgICAgICAgIEZYX0RXT1JEKiBwQ2hhckNvZGVzLAorICAgICAgICAgICAgRlhfRkxPQVQqIHBDaGFyUG9zLAorICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSk7CisgIEZYVEVYVF9DSEFSUE9TKiBtX3BDaGFyUG9zOworICBGWF9EV09SRCBtX25DaGFyczsKIH07CiBGWF9GTE9BVCBfQ0lEVHJhbnNmb3JtVG9GbG9hdCh1aW50OF90IGNoKTsKLUNQREZfQ2hhclBvc0xpc3Q6OkNQREZfQ2hhclBvc0xpc3QoKQotewotICAgIG1fcENoYXJQb3MgPSBOVUxMOworQ1BERl9DaGFyUG9zTGlzdDo6Q1BERl9DaGFyUG9zTGlzdCgpIHsKKyAgbV9wQ2hhclBvcyA9IE5VTEw7CiB9Ci1DUERGX0NoYXJQb3NMaXN0Ojp+Q1BERl9DaGFyUG9zTGlzdCgpCi17Ci0gICAgaWYgKG1fcENoYXJQb3MpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDaGFyUG9zKTsKK0NQREZfQ2hhclBvc0xpc3Q6On5DUERGX0NoYXJQb3NMaXN0KCkgeworICBpZiAobV9wQ2hhclBvcykgeworICAgIEZYX0ZyZWUobV9wQ2hhclBvcyk7CisgIH0KK30KK3ZvaWQgQ1BERl9DaGFyUG9zTGlzdDo6TG9hZChpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwQ2hhckNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEZvbnRTaXplKSB7CisgIG1fcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgbkNoYXJzKTsKKyAgbV9uQ2hhcnMgPSAwOworICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKKyAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBwQ0lERm9udCAmJiBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOworICBmb3IgKGludCBpQ2hhciA9IDA7IGlDaGFyIDwgbkNoYXJzOyBpQ2hhcisrKSB7CisgICAgRlhfRFdPUkQgQ2hhckNvZGUgPQorICAgICAgICBuQ2hhcnMgPT0gMSA/IChGWF9EV09SRCkodWludHB0cl90KXBDaGFyQ29kZXMgOiBwQ2hhckNvZGVzW2lDaGFyXTsKKyAgICBpZiAoQ2hhckNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci19Ci12b2lkIENQREZfQ2hhclBvc0xpc3Q6OkxvYWQoaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywgQ1BERl9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBGb250U2l6ZSkKLXsKLSAgICBtX3BDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIG5DaGFycyk7Ci0gICAgbV9uQ2hhcnMgPSAwOwotICAgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+R2V0Q0lERm9udCgpOwotICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gcENJREZvbnQgJiYgcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKLSAgICBmb3IgKGludCBpQ2hhciA9IDA7IGlDaGFyIDwgbkNoYXJzOyBpQ2hhciArKykgewotICAgICAgICBGWF9EV09SRCBDaGFyQ29kZSA9IG5DaGFycyA9PSAxID8gKEZYX0RXT1JEKSh1aW50cHRyX3QpcENoYXJDb2RlcyA6IHBDaGFyQ29kZXNbaUNoYXJdOwotICAgICAgICBpZiAoQ2hhckNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYlZlcnQgPSBGQUxTRTsKLSAgICAgICAgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MgPSBtX3BDaGFyUG9zW21fbkNoYXJzKytdOwotICAgICAgICBpZiAocENJREZvbnQpIHsKLSAgICAgICAgICAgIGNoYXJwb3MubV9iRm9udFN0eWxlID0gcENJREZvbnQtPklzRm9udFN0eWxlRnJvbUNoYXJDb2RlKENoYXJDb2RlKTsKLSAgICAgICAgfQotICAgICAgICBjaGFycG9zLm1fR2x5cGhJbmRleCA9IHBGb250LT5HbHlwaEZyb21DaGFyQ29kZShDaGFyQ29kZSwgJmJWZXJ0KTsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgY2hhcnBvcy5tX0V4dEdJRCA9IHBGb250LT5HbHlwaEZyb21DaGFyQ29kZUV4dChDaGFyQ29kZSk7CisgICAgRlhfQk9PTCBiVmVydCA9IEZBTFNFOworICAgIEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gbV9wQ2hhclBvc1ttX25DaGFycysrXTsKKyAgICBpZiAocENJREZvbnQpIHsKKyAgICAgIGNoYXJwb3MubV9iRm9udFN0eWxlID0gcENJREZvbnQtPklzRm9udFN0eWxlRnJvbUNoYXJDb2RlKENoYXJDb2RlKTsKKyAgICB9CisgICAgY2hhcnBvcy5tX0dseXBoSW5kZXggPSBwRm9udC0+R2x5cGhGcm9tQ2hhckNvZGUoQ2hhckNvZGUsICZiVmVydCk7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgICBjaGFycG9zLm1fRXh0R0lEID0gcEZvbnQtPkdseXBoRnJvbUNoYXJDb2RlRXh0KENoYXJDb2RlKTsKICNlbmRpZgotICAgICAgICBpZiAoIXBGb250LT5Jc0VtYmVkZGVkKCkgJiYgcEZvbnQtPkdldEZvbnRUeXBlKCkgIT0gUERGRk9OVF9DSURGT05UKSB7Ci0gICAgICAgICAgICBjaGFycG9zLm1fRm9udENoYXJXaWR0aCA9IHBGb250LT5HZXRDaGFyV2lkdGhGKENoYXJDb2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoID0gMDsKLSAgICAgICAgfQotICAgICAgICBjaGFycG9zLm1fT3JpZ2luWCA9IGlDaGFyID8gcENoYXJQb3NbaUNoYXIgLSAxXSA6IDA7Ci0gICAgICAgIGNoYXJwb3MubV9PcmlnaW5ZID0gMDsKLSAgICAgICAgY2hhcnBvcy5tX2JHbHlwaEFkanVzdCA9IEZBTFNFOwotICAgICAgICBpZiAocENJREZvbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfV09SRCBDSUQgPSBwQ0lERm9udC0+Q0lERnJvbUNoYXJDb2RlKENoYXJDb2RlKTsKLSAgICAgICAgaWYgKGJWZXJ0V3JpdGluZykgewotICAgICAgICAgICAgY2hhcnBvcy5tX09yaWdpblkgPSBjaGFycG9zLm1fT3JpZ2luWDsKLSAgICAgICAgICAgIGNoYXJwb3MubV9PcmlnaW5YID0gMDsKLSAgICAgICAgICAgIHNob3J0IHZ4LCB2eTsKLSAgICAgICAgICAgIHBDSURGb250LT5HZXRWZXJ0T3JpZ2luKENJRCwgdngsIHZ5KTsKLSAgICAgICAgICAgIGNoYXJwb3MubV9PcmlnaW5YIC09IEZvbnRTaXplICogdnggLyAxMDAwOwotICAgICAgICAgICAgY2hhcnBvcy5tX09yaWdpblkgLT0gRm9udFNpemUgKiB2eSAvIDEwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgdWludDhfdCogcFRyYW5zZm9ybSA9IHBDSURGb250LT5HZXRDSURUcmFuc2Zvcm0oQ0lEKTsKLSAgICAgICAgaWYgKHBUcmFuc2Zvcm0gJiYgIWJWZXJ0KSB7Ci0gICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdID0gX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVswXSk7Ci0gICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdID0gX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVsyXSk7Ci0gICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdID0gX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVsxXSk7Ci0gICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdID0gX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVszXSk7Ci0gICAgICAgICAgICBjaGFycG9zLm1fT3JpZ2luWCArPSBfQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzRdKSAqIEZvbnRTaXplOwotICAgICAgICAgICAgY2hhcnBvcy5tX09yaWdpblkgKz0gX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVs1XSkgKiBGb250U2l6ZTsKLSAgICAgICAgICAgIGNoYXJwb3MubV9iR2x5cGhBZGp1c3QgPSBUUlVFOwotICAgICAgICB9CisgICAgaWYgKCFwRm9udC0+SXNFbWJlZGRlZCgpICYmIHBGb250LT5HZXRGb250VHlwZSgpICE9IFBERkZPTlRfQ0lERk9OVCkgeworICAgICAgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGggPSBwRm9udC0+R2V0Q2hhcldpZHRoRihDaGFyQ29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoID0gMDsKICAgICB9CisgICAgY2hhcnBvcy5tX09yaWdpblggPSBpQ2hhciA/IHBDaGFyUG9zW2lDaGFyIC0gMV0gOiAwOworICAgIGNoYXJwb3MubV9PcmlnaW5ZID0gMDsKKyAgICBjaGFycG9zLm1fYkdseXBoQWRqdXN0ID0gRkFMU0U7CisgICAgaWYgKHBDSURGb250ID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBGWF9XT1JEIENJRCA9IHBDSURGb250LT5DSURGcm9tQ2hhckNvZGUoQ2hhckNvZGUpOworICAgIGlmIChiVmVydFdyaXRpbmcpIHsKKyAgICAgIGNoYXJwb3MubV9PcmlnaW5ZID0gY2hhcnBvcy5tX09yaWdpblg7CisgICAgICBjaGFycG9zLm1fT3JpZ2luWCA9IDA7CisgICAgICBzaG9ydCB2eCwgdnk7CisgICAgICBwQ0lERm9udC0+R2V0VmVydE9yaWdpbihDSUQsIHZ4LCB2eSk7CisgICAgICBjaGFycG9zLm1fT3JpZ2luWCAtPSBGb250U2l6ZSAqIHZ4IC8gMTAwMDsKKyAgICAgIGNoYXJwb3MubV9PcmlnaW5ZIC09IEZvbnRTaXplICogdnkgLyAxMDAwOworICAgIH0KKyAgICBjb25zdCB1aW50OF90KiBwVHJhbnNmb3JtID0gcENJREZvbnQtPkdldENJRFRyYW5zZm9ybShDSUQpOworICAgIGlmIChwVHJhbnNmb3JtICYmICFiVmVydCkgeworICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFswXSA9IF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bMF0pOworICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXSA9IF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bMl0pOworICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsxXSA9IF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bMV0pOworICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFszXSA9IF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bM10pOworICAgICAgY2hhcnBvcy5tX09yaWdpblggKz0gX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVs0XSkgKiBGb250U2l6ZTsKKyAgICAgIGNoYXJwb3MubV9PcmlnaW5ZICs9IF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bNV0pICogRm9udFNpemU7CisgICAgICBjaGFycG9zLm1fYkdseXBoQWRqdXN0ID0gVFJVRTsKKyAgICB9CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0UGF0aChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJVc2VyLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCitGWF9CT09MIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFBhdGgoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwQ2hhckNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJVc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiLCBGWF9BUkdCIHN0cm9rZV9hcmdiLCBDRlhfUGF0aERhdGEqIHBDbGlwcGluZ1BhdGgsIGludCBuRmxhZykKLXsKLSAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUgPSBwRm9udC0+bV9wRG9jdW1lbnQgPyBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFJlbmRlckRhdGEoKS0+R2V0Rm9udENhY2hlKCkgOiBOVUxMOwotICAgIENQREZfQ2hhclBvc0xpc3QgQ2hhclBvc0xpc3Q7Ci0gICAgQ2hhclBvc0xpc3QuTG9hZChuQ2hhcnMsIHBDaGFyQ29kZXMsIHBDaGFyUG9zLCBwRm9udCwgZm9udF9zaXplKTsKLSAgICByZXR1cm4gcERldmljZS0+RHJhd1RleHRQYXRoKENoYXJQb3NMaXN0Lm1fbkNoYXJzLCBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBGb250LT5tX0ZvbnQsIHBDYWNoZSwgZm9udF9zaXplLCBwVGV4dDJVc2VyLCBwVXNlcjJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhcGhTdGF0ZSwgZmlsbF9hcmdiLCBzdHJva2VfYXJnYiwgcENsaXBwaW5nUGF0aCwgbkZsYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0Igc3Ryb2tlX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRmxhZykgeworICBDRlhfRm9udENhY2hlKiBwQ2FjaGUgPQorICAgICAgcEZvbnQtPm1fcERvY3VtZW50ID8gcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPkdldEZvbnRDYWNoZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICBDUERGX0NoYXJQb3NMaXN0IENoYXJQb3NMaXN0OworICBDaGFyUG9zTGlzdC5Mb2FkKG5DaGFycywgcENoYXJDb2RlcywgcENoYXJQb3MsIHBGb250LCBmb250X3NpemUpOworICByZXR1cm4gcERldmljZS0+RHJhd1RleHRQYXRoKENoYXJQb3NMaXN0Lm1fbkNoYXJzLCBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRm9udC0+bV9Gb250LCBwQ2FjaGUsIGZvbnRfc2l6ZSwgcFRleHQyVXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlcjJEZXZpY2UsIHBHcmFwaFN0YXRlLCBmaWxsX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlX2FyZ2IsIHBDbGlwcGluZ1BhdGgsIG5GbGFnKTsKIH0KLXZvaWQgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0U3RyaW5nKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBsZWZ0LCBpbnQgdG9wLCBDUERGX0ZvbnQqIHBGb250LCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgRlhfQVJHQiBhcmdiKQotewotICAgIEZYX1JFQ1QgZm9udF9iYm94OwotICAgIHBGb250LT5HZXRGb250QkJveChmb250X2Jib3gpOwotICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSA9IChGWF9GTE9BVCloZWlnaHQgKiAxMDAwLjBmIC8gKEZYX0ZMT0FUKShmb250X2Jib3gudG9wIC0gZm9udF9iYm94LmJvdHRvbSk7Ci0gICAgRlhfRkxPQVQgb3JpZ2luX3ggPSAoRlhfRkxPQVQpbGVmdDsKLSAgICBGWF9GTE9BVCBvcmlnaW5feSA9IChGWF9GTE9BVCl0b3AgKyBmb250X3NpemUgKiAoRlhfRkxPQVQpZm9udF9iYm94LnRvcCAvIDEwMDAuMGY7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgoMS4wZiwgMCwgMCwgLTEuMGYsIDAsIDApOwotICAgIERyYXdUZXh0U3RyaW5nKHBEZXZpY2UsIG9yaWdpbl94LCBvcmlnaW5feSwgcEZvbnQsIGZvbnRfc2l6ZSwgJm1hdHJpeCwgc3RyLCBhcmdiKTsKK3ZvaWQgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0U3RyaW5nKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IpIHsKKyAgRlhfUkVDVCBmb250X2Jib3g7CisgIHBGb250LT5HZXRGb250QkJveChmb250X2Jib3gpOworICBGWF9GTE9BVCBmb250X3NpemUgPQorICAgICAgKEZYX0ZMT0FUKWhlaWdodCAqIDEwMDAuMGYgLyAoRlhfRkxPQVQpKGZvbnRfYmJveC50b3AgLSBmb250X2Jib3guYm90dG9tKTsKKyAgRlhfRkxPQVQgb3JpZ2luX3ggPSAoRlhfRkxPQVQpbGVmdDsKKyAgRlhfRkxPQVQgb3JpZ2luX3kgPQorICAgICAgKEZYX0ZMT0FUKXRvcCArIGZvbnRfc2l6ZSAqIChGWF9GTE9BVClmb250X2Jib3gudG9wIC8gMTAwMC4wZjsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgoMS4wZiwgMCwgMCwgLTEuMGYsIDAsIDApOworICBEcmF3VGV4dFN0cmluZyhwRGV2aWNlLCBvcmlnaW5feCwgb3JpZ2luX3ksIHBGb250LCBmb250X3NpemUsICZtYXRyaXgsIHN0ciwKKyAgICAgICAgICAgICAgICAgYXJnYik7CiB9Ci12b2lkIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFN0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9GTE9BVCBvcmlnaW5feCwgRlhfRkxPQVQgb3JpZ2luX3ksIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsIEZYX0FSR0IgZmlsbF9hcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBzdHJva2VfYXJnYiwgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKLXsKLSAgICBpbnQgbkNoYXJzID0gcEZvbnQtPkNvdW50Q2hhcihzdHIsIHN0ci5HZXRMZW5ndGgoKSk7Ci0gICAgaWYgKG5DaGFycyA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0U3RyaW5nKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBvcmlnaW5feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG9yaWdpbl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIHN0cm9rZV9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHsKKyAgaW50IG5DaGFycyA9IHBGb250LT5Db3VudENoYXIoc3RyLCBzdHIuR2V0TGVuZ3RoKCkpOworICBpZiAobkNoYXJzID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRFdPUkQgY2hhcmNvZGU7CisgIGludCBvZmZzZXQgPSAwOworICBGWF9EV09SRCogcENoYXJDb2RlczsKKyAgRlhfRkxPQVQqIHBDaGFyUG9zOworICBpZiAobkNoYXJzID09IDEpIHsKKyAgICBjaGFyY29kZSA9IHBGb250LT5HZXROZXh0Q2hhcihzdHIsIHN0ci5HZXRMZW5ndGgoKSwgb2Zmc2V0KTsKKyAgICBwQ2hhckNvZGVzID0gKEZYX0RXT1JEKikodWludHB0cl90KWNoYXJjb2RlOworICAgIHBDaGFyUG9zID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBwQ2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIG5DaGFycyk7CisgICAgcENoYXJQb3MgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbkNoYXJzIC0gMSk7CisgICAgRlhfRkxPQVQgY3VyX3BvcyA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkrKykgeworICAgICAgcENoYXJDb2Rlc1tpXSA9IHBGb250LT5HZXROZXh0Q2hhcihzdHIsIHN0ci5HZXRMZW5ndGgoKSwgb2Zmc2V0KTsKKyAgICAgIGlmIChpKSB7CisgICAgICAgIHBDaGFyUG9zW2kgLSAxXSA9IGN1cl9wb3M7CisgICAgICB9CisgICAgICBjdXJfcG9zICs9IHBGb250LT5HZXRDaGFyV2lkdGhGKHBDaGFyQ29kZXNbaV0pICogZm9udF9zaXplIC8gMTAwMDsKICAgICB9Ci0gICAgRlhfRFdPUkQgY2hhcmNvZGU7Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgRlhfRFdPUkQqIHBDaGFyQ29kZXM7Ci0gICAgRlhfRkxPQVQqIHBDaGFyUG9zOwotICAgIGlmIChuQ2hhcnMgPT0gMSkgewotICAgICAgICBjaGFyY29kZSA9IHBGb250LT5HZXROZXh0Q2hhcihzdHIsIHN0ci5HZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLSAgICAgICAgcENoYXJDb2RlcyA9IChGWF9EV09SRCopKHVpbnRwdHJfdCljaGFyY29kZTsKLSAgICAgICAgcENoYXJQb3MgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDaGFyQ29kZXMgPSBGWF9BbGxvYyhGWF9EV09SRCwgbkNoYXJzKTsKLSAgICAgICAgcENoYXJQb3MgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbkNoYXJzIC0gMSk7Ci0gICAgICAgIEZYX0ZMT0FUIGN1cl9wb3MgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGFyczsgaSArKykgewotICAgICAgICAgICAgcENoYXJDb2Rlc1tpXSA9IHBGb250LT5HZXROZXh0Q2hhcihzdHIsIHN0ci5HZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLSAgICAgICAgICAgIGlmIChpKSB7Ci0gICAgICAgICAgICAgICAgcENoYXJQb3NbaSAtIDFdID0gY3VyX3BvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cl9wb3MgKz0gcEZvbnQtPkdldENoYXJXaWR0aEYocENoYXJDb2Rlc1tpXSkgKiBmb250X3NpemUgLyAxMDAwOwotICAgICAgICB9CisgIH0KKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7CisgIGlmIChwTWF0cml4KSB7CisgICAgbWF0cml4ID0gKnBNYXRyaXg7CisgIH0KKyAgbWF0cml4LmUgPSBvcmlnaW5feDsKKyAgbWF0cml4LmYgPSBvcmlnaW5feTsKKyAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpID09IFBERkZPTlRfVFlQRTMpCisgICAgOworICBlbHNlIGlmIChzdHJva2VfYXJnYiA9PSAwKSB7CisgICAgRHJhd05vcm1hbFRleHQocERldmljZSwgbkNoYXJzLCBwQ2hhckNvZGVzLCBwQ2hhclBvcywgcEZvbnQsIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAmbWF0cml4LCBmaWxsX2FyZ2IsIHBPcHRpb25zKTsKKyAgfSBlbHNlCisgICAgRHJhd1RleHRQYXRoKHBEZXZpY2UsIG5DaGFycywgcENoYXJDb2RlcywgcENoYXJQb3MsIHBGb250LCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICZtYXRyaXgsIE5VTEwsIHBHcmFwaFN0YXRlLCBmaWxsX2FyZ2IsIHN0cm9rZV9hcmdiLCBOVUxMKTsKKyAgaWYgKG5DaGFycyA+IDEpIHsKKyAgICBGWF9GcmVlKHBDaGFyQ29kZXMpOworICAgIEZYX0ZyZWUocENoYXJQb3MpOworICB9Cit9CitGWF9CT09MIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3Tm9ybWFsVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwQ2hhckNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworICBDRlhfRm9udENhY2hlKiBwQ2FjaGUgPQorICAgICAgcEZvbnQtPm1fcERvY3VtZW50ID8gcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPkdldEZvbnRDYWNoZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICBDUERGX0NoYXJQb3NMaXN0IENoYXJQb3NMaXN0OworICBDaGFyUG9zTGlzdC5Mb2FkKG5DaGFycywgcENoYXJDb2RlcywgcENoYXJQb3MsIHBGb250LCBmb250X3NpemUpOworICBpbnQgRlhHRV9mbGFncyA9IDA7CisgIGlmIChwT3B0aW9ucykgeworICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwT3B0aW9ucy0+bV9GbGFnczsKKyAgICBpZiAoZHdGbGFncyAmIFJFTkRFUl9DTEVBUlRZUEUpIHsKKyAgICAgIEZYR0VfZmxhZ3MgfD0gRlhURVhUX0NMRUFSVFlQRTsKKyAgICAgIGlmIChkd0ZsYWdzICYgUkVOREVSX0JHUl9TVFJJUEUpIHsKKyAgICAgICAgRlhHRV9mbGFncyB8PSBGWFRFWFRfQkdSX1NUUklQRTsKKyAgICAgIH0KICAgICB9CisgICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfTk9URVhUU01PT1RIKSB7CisgICAgICBGWEdFX2ZsYWdzIHw9IEZYVEVYVF9OT1NNT09USDsKKyAgICB9CisgICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfUFJJTlRHUkFQSElDVEVYVCkgeworICAgICAgRlhHRV9mbGFncyB8PSBGWFRFWFRfUFJJTlRHUkFQSElDVEVYVDsKKyAgICB9CisgICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfTk9fTkFUSVZFVEVYVCkgeworICAgICAgRlhHRV9mbGFncyB8PSBGWFRFWFRfTk9fTkFUSVZFVEVYVDsKKyAgICB9CisgICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfUFJJTlRJTUFHRVRFWFQpIHsKKyAgICAgIEZYR0VfZmxhZ3MgfD0gRlhURVhUX1BSSU5USU1BR0VURVhUOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGWEdFX2ZsYWdzID0gRlhURVhUX0NMRUFSVFlQRTsKKyAgfQorICBpZiAocEZvbnQtPkdldEZvbnRUeXBlKCkgJiBQREZGT05UX0NJREZPTlQpIHsKKyAgICBGWEdFX2ZsYWdzIHw9IEZYRk9OVF9DSURGT05UOworICB9CisgIHJldHVybiBwRGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChDaGFyUG9zTGlzdC5tX25DaGFycywgQ2hhclBvc0xpc3QubV9wQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRm9udC0+bV9Gb250LCBwQ2FjaGUsIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZXh0MkRldmljZSwgZmlsbF9hcmdiLCBGWEdFX2ZsYWdzKTsKK30KK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdUZXh0UGF0aFdpdGhQYXR0ZXJuKAorICAgIGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwKKyAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICBDUERGX0ZvbnQqIHBGb250LAorICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dE1hdHJpeCwKKyAgICBGWF9CT09MIGJGaWxsLAorICAgIEZYX0JPT0wgYlN0cm9rZSkgeworICBpZiAoIWJTdHJva2UpIHsKKyAgICBDUERGX1BhdGhPYmplY3QgcGF0aDsKKyAgICBDUERGX1RleHRPYmplY3QqIHBDb3B5ID0gbmV3IENQREZfVGV4dE9iamVjdDsKKyAgICBwQ29weS0+Q29weSh0ZXh0b2JqKTsKKyAgICBwYXRoLm1fYlN0cm9rZSA9IEZBTFNFOworICAgIHBhdGgubV9GaWxsVHlwZSA9IEZYRklMTF9XSU5ESU5HOworICAgIHBhdGgubV9DbGlwUGF0aC5BcHBlbmRUZXh0cygmcENvcHksIDEpOworICAgIHBhdGgubV9Db2xvclN0YXRlID0gdGV4dG9iai0+bV9Db2xvclN0YXRlOworICAgIHBhdGgubV9QYXRoLk5ldygpLT5BcHBlbmRSZWN0KHRleHRvYmotPm1fTGVmdCwgdGV4dG9iai0+bV9Cb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dG9iai0+bV9SaWdodCwgdGV4dG9iai0+bV9Ub3ApOworICAgIHBhdGgubV9MZWZ0ID0gdGV4dG9iai0+bV9MZWZ0OworICAgIHBhdGgubV9Cb3R0b20gPSB0ZXh0b2JqLT5tX0JvdHRvbTsKKyAgICBwYXRoLm1fUmlnaHQgPSB0ZXh0b2JqLT5tX1JpZ2h0OworICAgIHBhdGgubV9Ub3AgPSB0ZXh0b2JqLT5tX1RvcDsKKyAgICBSZW5kZXJTaW5nbGVPYmplY3QoJnBhdGgsIHBPYmoyRGV2aWNlKTsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlOworICBpZiAocEZvbnQtPm1fcERvY3VtZW50KSB7CisgICAgcENhY2hlID0gcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPkdldEZvbnRDYWNoZSgpOworICB9IGVsc2UgeworICAgIHBDYWNoZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpOworICB9CisgIENGWF9GYWNlQ2FjaGUqIHBGYWNlQ2FjaGUgPSBwQ2FjaGUtPkdldENhY2hlZEZhY2UoJnBGb250LT5tX0ZvbnQpOworICBGWF9GT05UQ0FDSEVfREVGSU5FKHBDYWNoZSwgJnBGb250LT5tX0ZvbnQpOworICBDUERGX0NoYXJQb3NMaXN0IENoYXJQb3NMaXN0OworICBDaGFyUG9zTGlzdC5Mb2FkKHRleHRvYmotPm1fbkNoYXJzLCB0ZXh0b2JqLT5tX3BDaGFyQ29kZXMsCisgICAgICAgICAgICAgICAgICAgdGV4dG9iai0+bV9wQ2hhclBvcywgcEZvbnQsIGZvbnRfc2l6ZSk7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBDaGFyUG9zTGlzdC5tX25DaGFyczsgaSsrKSB7CisgICAgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MgPSBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zW2ldOworICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGggPSBwRmFjZUNhY2hlLT5Mb2FkR2x5cGhQYXRoKAorICAgICAgICAmcEZvbnQtPm1fRm9udCwgY2hhcnBvcy5tX0dseXBoSW5kZXgsIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoKTsKKyAgICBpZiAocFBhdGggPT0gTlVMTCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENQREZfUGF0aE9iamVjdCBwYXRoOworICAgIHBhdGgubV9HcmFwaFN0YXRlID0gdGV4dG9iai0+bV9HcmFwaFN0YXRlOworICAgIHBhdGgubV9Db2xvclN0YXRlID0gdGV4dG9iai0+bV9Db2xvclN0YXRlOwogICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgIG1hdHJpeCA9ICpwTWF0cml4OwotICAgIH0KLSAgICBtYXRyaXguZSA9IG9yaWdpbl94OwotICAgIG1hdHJpeC5mID0gb3JpZ2luX3k7Ci0gICAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpID09IFBERkZPTlRfVFlQRTMpCi0gICAgICAgIDsKLSAgICBlbHNlIGlmIChzdHJva2VfYXJnYiA9PSAwKSB7Ci0gICAgICAgIERyYXdOb3JtYWxUZXh0KHBEZXZpY2UsIG5DaGFycywgcENoYXJDb2RlcywgcENoYXJQb3MsIHBGb250LCBmb250X3NpemUsICZtYXRyaXgsIGZpbGxfYXJnYiwgcE9wdGlvbnMpOwotICAgIH0gZWxzZQotICAgICAgICBEcmF3VGV4dFBhdGgocERldmljZSwgbkNoYXJzLCBwQ2hhckNvZGVzLCBwQ2hhclBvcywgcEZvbnQsIGZvbnRfc2l6ZSwgJm1hdHJpeCwgTlVMTCwgcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICBmaWxsX2FyZ2IsIHN0cm9rZV9hcmdiLCBOVUxMKTsKLSAgICBpZiAobkNoYXJzID4gMSkgewotICAgICAgICBGWF9GcmVlKHBDaGFyQ29kZXMpOwotICAgICAgICBGWF9GcmVlKHBDaGFyUG9zKTsKLSAgICB9CisgICAgaWYgKGNoYXJwb3MubV9iR2x5cGhBZGp1c3QpCisgICAgICBtYXRyaXguU2V0KGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0sCisgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10sIDAsIDApOworICAgIG1hdHJpeC5Db25jYXQoZm9udF9zaXplLCAwLCAwLCBmb250X3NpemUsIGNoYXJwb3MubV9PcmlnaW5YLAorICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX09yaWdpblkpOworICAgIHBhdGgubV9QYXRoLk5ldygpLT5BcHBlbmQocFBhdGgsICZtYXRyaXgpOworICAgIHBhdGgubV9NYXRyaXggPSAqcFRleHRNYXRyaXg7CisgICAgcGF0aC5tX2JTdHJva2UgPSBiU3Ryb2tlOworICAgIHBhdGgubV9GaWxsVHlwZSA9IGJGaWxsID8gRlhGSUxMX1dJTkRJTkcgOiAwOworICAgIHBhdGguQ2FsY0JvdW5kaW5nQm94KCk7CisgICAgUHJvY2Vzc1BhdGgoJnBhdGgsIHBPYmoyRGV2aWNlKTsKKyAgfQogfQotRlhfQk9PTCBDUERGX1RleHRSZW5kZXJlcjo6RHJhd05vcm1hbFRleHQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywKLSAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCi0gICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQotewotICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSA9IHBGb250LT5tX3BEb2N1bWVudCA/IHBGb250LT5tX3BEb2N1bWVudC0+R2V0UmVuZGVyRGF0YSgpLT5HZXRGb250Q2FjaGUoKSA6IE5VTEw7Ci0gICAgQ1BERl9DaGFyUG9zTGlzdCBDaGFyUG9zTGlzdDsKLSAgICBDaGFyUG9zTGlzdC5Mb2FkKG5DaGFycywgcENoYXJDb2RlcywgcENoYXJQb3MsIHBGb250LCBmb250X3NpemUpOwotICAgIGludCBGWEdFX2ZsYWdzID0gMDsKLSAgICBpZiAocE9wdGlvbnMpIHsKLSAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBPcHRpb25zLT5tX0ZsYWdzOwotICAgICAgICBpZiAoZHdGbGFncyAmIFJFTkRFUl9DTEVBUlRZUEUpIHsKLSAgICAgICAgICAgIEZYR0VfZmxhZ3MgfD0gRlhURVhUX0NMRUFSVFlQRTsKLSAgICAgICAgICAgIGlmIChkd0ZsYWdzICYgUkVOREVSX0JHUl9TVFJJUEUpIHsKLSAgICAgICAgICAgICAgICBGWEdFX2ZsYWdzIHw9IEZYVEVYVF9CR1JfU1RSSVBFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkd0ZsYWdzICYgUkVOREVSX05PVEVYVFNNT09USCkgewotICAgICAgICAgICAgRlhHRV9mbGFncyB8PSBGWFRFWFRfTk9TTU9PVEg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfUFJJTlRHUkFQSElDVEVYVCkgewotICAgICAgICAgICAgRlhHRV9mbGFncyB8PSBGWFRFWFRfUFJJTlRHUkFQSElDVEVYVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHdGbGFncyAmIFJFTkRFUl9OT19OQVRJVkVURVhUKSB7Ci0gICAgICAgICAgICBGWEdFX2ZsYWdzIHw9IEZYVEVYVF9OT19OQVRJVkVURVhUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkd0ZsYWdzICYgUkVOREVSX1BSSU5USU1BR0VURVhUKSB7Ci0gICAgICAgICAgICBGWEdFX2ZsYWdzIHw9IEZYVEVYVF9QUklOVElNQUdFVEVYVDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYR0VfZmxhZ3MgPSBGWFRFWFRfQ0xFQVJUWVBFOwotICAgIH0KLSAgICBpZiAocEZvbnQtPkdldEZvbnRUeXBlKCkgJiBQREZGT05UX0NJREZPTlQpIHsKLSAgICAgICAgRlhHRV9mbGFncyB8PSBGWEZPTlRfQ0lERk9OVDsKLSAgICB9Ci0gICAgcmV0dXJuIHBEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KENoYXJQb3NMaXN0Lm1fbkNoYXJzLCBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zLCAmcEZvbnQtPm1fRm9udCwgcENhY2hlLCBmb250X3NpemUsIHBUZXh0MkRldmljZSwgZmlsbF9hcmdiLCBGWEdFX2ZsYWdzKTsKLX0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdUZXh0UGF0aFdpdGhQYXR0ZXJuKGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsCi0gICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRNYXRyaXgsIEZYX0JPT0wgYkZpbGwsIEZYX0JPT0wgYlN0cm9rZSkKLXsKLSAgICBpZiAoIWJTdHJva2UpIHsKLSAgICAgICAgQ1BERl9QYXRoT2JqZWN0IHBhdGg7Ci0gICAgICAgIENQREZfVGV4dE9iamVjdCogcENvcHkgPSBuZXcgQ1BERl9UZXh0T2JqZWN0OwotICAgICAgICBwQ29weS0+Q29weSh0ZXh0b2JqKTsKLSAgICAgICAgcGF0aC5tX2JTdHJva2UgPSBGQUxTRTsKLSAgICAgICAgcGF0aC5tX0ZpbGxUeXBlID0gRlhGSUxMX1dJTkRJTkc7Ci0gICAgICAgIHBhdGgubV9DbGlwUGF0aC5BcHBlbmRUZXh0cygmcENvcHksIDEpOwotICAgICAgICBwYXRoLm1fQ29sb3JTdGF0ZSA9IHRleHRvYmotPm1fQ29sb3JTdGF0ZTsKLSAgICAgICAgcGF0aC5tX1BhdGguTmV3KCktPkFwcGVuZFJlY3QodGV4dG9iai0+bV9MZWZ0LCB0ZXh0b2JqLT5tX0JvdHRvbSwgdGV4dG9iai0+bV9SaWdodCwgdGV4dG9iai0+bV9Ub3ApOwotICAgICAgICBwYXRoLm1fTGVmdCA9IHRleHRvYmotPm1fTGVmdDsKLSAgICAgICAgcGF0aC5tX0JvdHRvbSA9IHRleHRvYmotPm1fQm90dG9tOwotICAgICAgICBwYXRoLm1fUmlnaHQgPSB0ZXh0b2JqLT5tX1JpZ2h0OwotICAgICAgICBwYXRoLm1fVG9wID0gdGV4dG9iai0+bV9Ub3A7Ci0gICAgICAgIFJlbmRlclNpbmdsZU9iamVjdCgmcGF0aCwgcE9iajJEZXZpY2UpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZTsKLSAgICBpZiAocEZvbnQtPm1fcERvY3VtZW50KSB7Ci0gICAgICAgIHBDYWNoZSA9IHBGb250LT5tX3BEb2N1bWVudC0+R2V0UmVuZGVyRGF0YSgpLT5HZXRGb250Q2FjaGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwQ2FjaGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKTsKLSAgICB9Ci0gICAgQ0ZYX0ZhY2VDYWNoZSogcEZhY2VDYWNoZSA9IHBDYWNoZS0+R2V0Q2FjaGVkRmFjZSgmcEZvbnQtPm1fRm9udCk7Ci0gICAgRlhfRk9OVENBQ0hFX0RFRklORShwQ2FjaGUsICZwRm9udC0+bV9Gb250KTsKLSAgICBDUERGX0NoYXJQb3NMaXN0IENoYXJQb3NMaXN0OwotICAgIENoYXJQb3NMaXN0LkxvYWQodGV4dG9iai0+bV9uQ2hhcnMsIHRleHRvYmotPm1fcENoYXJDb2RlcywgdGV4dG9iai0+bV9wQ2hhclBvcywgcEZvbnQsIGZvbnRfc2l6ZSk7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IENoYXJQb3NMaXN0Lm1fbkNoYXJzOyBpICsrKSB7Ci0gICAgICAgIEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gQ2hhclBvc0xpc3QubV9wQ2hhclBvc1tpXTsKLSAgICAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aCA9IHBGYWNlQ2FjaGUtPkxvYWRHbHlwaFBhdGgoJnBGb250LT5tX0ZvbnQsIGNoYXJwb3MubV9HbHlwaEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGgpOwotICAgICAgICBpZiAocFBhdGggPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9QYXRoT2JqZWN0IHBhdGg7Ci0gICAgICAgIHBhdGgubV9HcmFwaFN0YXRlID0gdGV4dG9iai0+bV9HcmFwaFN0YXRlOwotICAgICAgICBwYXRoLm1fQ29sb3JTdGF0ZSA9IHRleHRvYmotPm1fQ29sb3JTdGF0ZTsKLSAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgICAgIGlmIChjaGFycG9zLm1fYkdseXBoQWRqdXN0KQotICAgICAgICAgICAgbWF0cml4LlNldChjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdLAotICAgICAgICAgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdLCAwLCAwKTsKLSAgICAgICAgbWF0cml4LkNvbmNhdChmb250X3NpemUsIDAsIDAsIGZvbnRfc2l6ZSwgY2hhcnBvcy5tX09yaWdpblgsIGNoYXJwb3MubV9PcmlnaW5ZKTsKLSAgICAgICAgcGF0aC5tX1BhdGguTmV3KCktPkFwcGVuZChwUGF0aCwgJm1hdHJpeCk7Ci0gICAgICAgIHBhdGgubV9NYXRyaXggPSAqcFRleHRNYXRyaXg7Ci0gICAgICAgIHBhdGgubV9iU3Ryb2tlID0gYlN0cm9rZTsKLSAgICAgICAgcGF0aC5tX0ZpbGxUeXBlID0gYkZpbGwgPyBGWEZJTExfV0lORElORyA6IDA7Ci0gICAgICAgIHBhdGguQ2FsY0JvdW5kaW5nQm94KCk7Ci0gICAgICAgIFByb2Nlc3NQYXRoKCZwYXRoLCBwT2JqMkRldmljZSk7Ci0gICAgfQotfQotQ0ZYX1BhdGhEYXRhKiBDUERGX0ZvbnQ6OkxvYWRHbHlwaFBhdGgoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBkZXN0X3dpZHRoKQotewotICAgIGludCBnbHlwaF9pbmRleCA9IEdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbV9Gb250LkxvYWRHbHlwaFBhdGgoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgpOworQ0ZYX1BhdGhEYXRhKiBDUERGX0ZvbnQ6OkxvYWRHbHlwaFBhdGgoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBkZXN0X3dpZHRoKSB7CisgIGludCBnbHlwaF9pbmRleCA9IEdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBtX0ZvbnQuTG9hZEdseXBoUGF0aChnbHlwaF9pbmRleCwgZGVzdF93aWR0aCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL3JlbmRlcl9pbnQuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvcmVuZGVyX2ludC5oCmluZGV4IGU1ZmI4MzEuLmQ2YjMxNGQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvcmVuZGVyX2ludC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvcmVuZGVyX2ludC5oCkBAIC0xMyw0NjMgKzEzLDU4MiBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKIAogY2xhc3MgQ1BERl9RdWlja1N0cmV0Y2hlcjsKLSNkZWZpbmUgVFlQRTNfTUFYX0JMVUVTCQkxNgotY2xhc3MgQ1BERl9UeXBlM0dseXBocwotewotcHVibGljOgotICAgIENQREZfVHlwZTNHbHlwaHMoKQotICAgIHsKLSAgICAgICAgbV9HbHlwaE1hcC5Jbml0SGFzaFRhYmxlKDI1Myk7Ci0gICAgICAgIG1fVG9wQmx1ZUNvdW50ID0gbV9Cb3R0b21CbHVlQ291bnQgPSAwOwotICAgIH0KLSAgICB+Q1BERl9UeXBlM0dseXBocygpOwotICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fR2x5cGhNYXA7Ci0gICAgdm9pZAkJCQkJQWRqdXN0Qmx1ZShGWF9GTE9BVCB0b3AsIEZYX0ZMT0FUIGJvdHRvbSwgaW50JiB0b3BfbGluZSwgaW50JiBib3R0b21fbGluZSk7CisjZGVmaW5lIFRZUEUzX01BWF9CTFVFUyAxNgorY2xhc3MgQ1BERl9UeXBlM0dseXBocyB7CisgcHVibGljOgorICBDUERGX1R5cGUzR2x5cGhzKCkgeworICAgIG1fR2x5cGhNYXAuSW5pdEhhc2hUYWJsZSgyNTMpOworICAgIG1fVG9wQmx1ZUNvdW50ID0gbV9Cb3R0b21CbHVlQ291bnQgPSAwOworICB9CisgIH5DUERGX1R5cGUzR2x5cGhzKCk7CisgIENGWF9NYXBQdHJUb1B0ciBtX0dseXBoTWFwOworICB2b2lkIEFkanVzdEJsdWUoRlhfRkxPQVQgdG9wLAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYm90dG9tLAorICAgICAgICAgICAgICAgICAgaW50JiB0b3BfbGluZSwKKyAgICAgICAgICAgICAgICAgIGludCYgYm90dG9tX2xpbmUpOwogCi0gICAgaW50CQkJCQkJbV9Ub3BCbHVlW1RZUEUzX01BWF9CTFVFU10sIG1fQm90dG9tQmx1ZVtUWVBFM19NQVhfQkxVRVNdOwotICAgIGludAkJCQkJCW1fVG9wQmx1ZUNvdW50LCBtX0JvdHRvbUJsdWVDb3VudDsKKyAgaW50IG1fVG9wQmx1ZVtUWVBFM19NQVhfQkxVRVNdLCBtX0JvdHRvbUJsdWVbVFlQRTNfTUFYX0JMVUVTXTsKKyAgaW50IG1fVG9wQmx1ZUNvdW50LCBtX0JvdHRvbUJsdWVDb3VudDsKIH07CiBjbGFzcyBDRlhfR2x5cGhCaXRtYXA7Ci1jbGFzcyBDUERGX1R5cGUzQ2FjaGUKLXsKLXB1YmxpYzoKLSAgICBDUERGX1R5cGUzQ2FjaGUoQ1BERl9UeXBlM0ZvbnQqIHBGb250KQotICAgIHsKLSAgICAgICAgbV9wRm9udCA9IHBGb250OwotICAgIH0KLSAgICB+Q1BERl9UeXBlM0NhY2hlKCk7Ci0gICAgQ0ZYX0dseXBoQml0bWFwKgkJTG9hZEdseXBoKEZYX0RXT1JEIGNoYXJjb2RlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9GTE9BVCByZXRpbmFTY2FsZVggPSAxLjBmLCBGWF9GTE9BVCByZXRpbmFTY2FsZVkgPSAxLjBmKTsKLXByb3RlY3RlZDoKLSAgICBDRlhfR2x5cGhCaXRtYXAqCQlSZW5kZXJHbHlwaChDUERGX1R5cGUzR2x5cGhzKiBwU2l6ZSwgRlhfRFdPUkQgY2hhcmNvZGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0ZMT0FUIHJldGluYVNjYWxlWCA9IDEuMGYsIEZYX0ZMT0FUIHJldGluYVNjYWxlWSA9IDEuMGYpOwotICAgIENQREZfVHlwZTNGb250KgkJCW1fcEZvbnQ7Ci0gICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX1NpemVNYXA7Ci19OwotY2xhc3MgQ1BERl9UcmFuc2ZlckZ1bmMKLXsKLXB1YmxpYzoKLSAgICBDUERGX0RvY3VtZW50KgltX3BQREZEb2M7Ci0gICAgdWludDhfdAkJCW1fU2FtcGxlc1syNTYgKiAzXTsKLSAgICBGWF9CT09MCQkJbV9iSWRlbnRpdHk7CitjbGFzcyBDUERGX1R5cGUzQ2FjaGUgeworIHB1YmxpYzoKKyAgQ1BERl9UeXBlM0NhY2hlKENQREZfVHlwZTNGb250KiBwRm9udCkgeyBtX3BGb250ID0gcEZvbnQ7IH0KKyAgfkNQREZfVHlwZTNDYWNoZSgpOworICBDRlhfR2x5cGhCaXRtYXAqIExvYWRHbHlwaChGWF9EV09SRCBjaGFyY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmV0aW5hU2NhbGVYID0gMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmV0aW5hU2NhbGVZID0gMS4wZik7CiAKLSAgICBDRlhfRElCU291cmNlKglUcmFuc2xhdGVJbWFnZShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBGWF9CT09MIGJBdXRvRHJvcFNyYyk7Ci0gICAgRlhfQ09MT1JSRUYJCVRyYW5zbGF0ZUNvbG9yKEZYX0NPTE9SUkVGIHNyYyk7CisgcHJvdGVjdGVkOgorICBDRlhfR2x5cGhCaXRtYXAqIFJlbmRlckdseXBoKENQREZfVHlwZTNHbHlwaHMqIHBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmV0aW5hU2NhbGVYID0gMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVkgPSAxLjBmKTsKKyAgQ1BERl9UeXBlM0ZvbnQqIG1fcEZvbnQ7CisgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIgbV9TaXplTWFwOworfTsKK2NsYXNzIENQREZfVHJhbnNmZXJGdW5jIHsKKyBwdWJsaWM6CisgIENQREZfRG9jdW1lbnQqIG1fcFBERkRvYzsKKyAgdWludDhfdCBtX1NhbXBsZXNbMjU2ICogM107CisgIEZYX0JPT0wgbV9iSWRlbnRpdHk7CisKKyAgQ0ZYX0RJQlNvdXJjZSogVHJhbnNsYXRlSW1hZ2UoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXV0b0Ryb3BTcmMpOworICBGWF9DT0xPUlJFRiBUcmFuc2xhdGVDb2xvcihGWF9DT0xPUlJFRiBzcmMpOwogfTsKIAotY2xhc3MgQ1BERl9Eb2NSZW5kZXJEYXRhCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9Eb2NSZW5kZXJEYXRhKENQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBOVUxMKTsKLSAgICB+Q1BERl9Eb2NSZW5kZXJEYXRhKCk7Ci0gICAgQ1BERl9UeXBlM0NhY2hlKglHZXRDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpOwotICAgIENQREZfVHJhbnNmZXJGdW5jKglHZXRUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopOwotICAgIENGWF9Gb250Q2FjaGUqCQlHZXRGb250Q2FjaGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEZvbnRDYWNoZTsKLSAgICB9Ci0gICAgdm9pZAkJCQlDbGVhcihGWF9CT09MIGJSZWxlYXNlID0gRkFMU0UpOwotICAgIHZvaWQJCQkJUmVsZWFzZUNhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCk7Ci0gICAgdm9pZAkJCQlSZWxlYXNlVHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqKTsKLXByaXZhdGU6Ci0gICAgdXNpbmcgQ1BERl9UeXBlM0NhY2hlTWFwID0KLSAgICAgICAgc3RkOjptYXA8Q1BERl9Gb250KiwgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHlwZTNDYWNoZT4qPjsKLSAgICB1c2luZyBDUERGX1RyYW5zZmVyRnVuY01hcCA9Ci0gICAgICAgIHN0ZDo6bWFwPENQREZfT2JqZWN0KiwgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jPio+IDsKK2NsYXNzIENQREZfRG9jUmVuZGVyRGF0YSB7CisgcHVibGljOgorICBDUERGX0RvY1JlbmRlckRhdGEoQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IE5VTEwpOworICB+Q1BERl9Eb2NSZW5kZXJEYXRhKCk7CisgIENQREZfVHlwZTNDYWNoZSogR2V0Q2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKKyAgQ1BERl9UcmFuc2ZlckZ1bmMqIEdldFRyYW5zZmVyRnVuYyhDUERGX09iamVjdCogcE9iaik7CisgIENGWF9Gb250Q2FjaGUqIEdldEZvbnRDYWNoZSgpIHsgcmV0dXJuIG1fcEZvbnRDYWNoZTsgfQorICB2b2lkIENsZWFyKEZYX0JPT0wgYlJlbGVhc2UgPSBGQUxTRSk7CisgIHZvaWQgUmVsZWFzZUNhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCk7CisgIHZvaWQgUmVsZWFzZVRyYW5zZmVyRnVuYyhDUERGX09iamVjdCogcE9iaik7CiAKLSAgICBDUERGX0RvY3VtZW50KiBtX3BQREZEb2M7Ci0gICAgQ0ZYX0ZvbnRDYWNoZSogbV9wRm9udENhY2hlOwotICAgIENQREZfVHlwZTNDYWNoZU1hcCBtX1R5cGUzRmFjZU1hcDsKLSAgICBDUERGX1RyYW5zZmVyRnVuY01hcCBtX1RyYW5zZmVyRnVuY01hcDsKKyBwcml2YXRlOgorICB1c2luZyBDUERGX1R5cGUzQ2FjaGVNYXAgPQorICAgICAgc3RkOjptYXA8Q1BERl9Gb250KiwgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHlwZTNDYWNoZT4qPjsKKyAgdXNpbmcgQ1BERl9UcmFuc2ZlckZ1bmNNYXAgPQorICAgICAgc3RkOjptYXA8Q1BERl9PYmplY3QqLCBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UcmFuc2ZlckZ1bmM+Kj47CisKKyAgQ1BERl9Eb2N1bWVudCogbV9wUERGRG9jOworICBDRlhfRm9udENhY2hlKiBtX3BGb250Q2FjaGU7CisgIENQREZfVHlwZTNDYWNoZU1hcCBtX1R5cGUzRmFjZU1hcDsKKyAgQ1BERl9UcmFuc2ZlckZ1bmNNYXAgbV9UcmFuc2ZlckZ1bmNNYXA7CiB9Owogc3RydWN0IF9QREZfUmVuZGVySXRlbSB7Ci1wdWJsaWM6Ci0gICAgQ1BERl9QYWdlT2JqZWN0cyoJCQltX3BPYmplY3RMaXN0OwotICAgIENGWF9BZmZpbmVNYXRyaXgJCQltX01hdHJpeDsKKyBwdWJsaWM6CisgIENQREZfUGFnZU9iamVjdHMqIG1fcE9iamVjdExpc3Q7CisgIENGWF9BZmZpbmVNYXRyaXggbV9NYXRyaXg7CiB9OwotdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxfUERGX1JlbmRlckl0ZW0+CUNQREZfUmVuZGVyTGF5ZXI7Ci1jbGFzcyBJUERGX09iamVjdFJlbmRlcmVyCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIElQREZfT2JqZWN0UmVuZGVyZXIqIENyZWF0ZShpbnQgdHlwZSk7Ci0gICAgdmlydHVhbCB+SVBERl9PYmplY3RSZW5kZXJlcigpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MIFN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdGRDUywgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOwotICAgIEZYX0JPT0wJCW1fUmVzdWx0OwordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxfUERGX1JlbmRlckl0ZW0+IENQREZfUmVuZGVyTGF5ZXI7CitjbGFzcyBJUERGX09iamVjdFJlbmRlcmVyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBJUERGX09iamVjdFJlbmRlcmVyKiBDcmVhdGUoaW50IHR5cGUpOworICB2aXJ0dWFsIH5JUERGX09iamVjdFJlbmRlcmVyKCkge30KKyAgdmlydHVhbCBGWF9CT09MIFN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSA9IDA7CisgIEZYX0JPT0wgbV9SZXN1bHQ7CiB9OwotY2xhc3MgQ1BERl9SZW5kZXJTdGF0dXMKLXsKLXB1YmxpYzoKLSAgICBDUERGX1JlbmRlclN0YXR1cygpOwotICAgIH5DUERGX1JlbmRlclN0YXR1cygpOwotICAgIEZYX0JPT0wJCQlJbml0aWFsaXplKGNsYXNzIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXZpY2VNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3RvcE9iaiwgY29uc3QgQ1BERl9SZW5kZXJTdGF0dXMqIHBQYXJlbnRTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzKiBwSW5pdGlhbFN0YXRlcywgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNwYXJlbmN5LCBGWF9CT09MIGJEcm9wT2JqZWN0cywgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLAlDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciA9IE5VTEwsIEZYX0FSR0IgZmlsbF9jb2xvciA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFKTsKLSAgICB2b2lkCQkJUmVuZGVyT2JqZWN0TGlzdChjb25zdCBDUERGX1BhZ2VPYmplY3RzKiBwT2JqcywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIHZvaWQJCQlSZW5kZXJTaW5nbGVPYmplY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgRlhfQk9PTAkJCUNvbnRpbnVlU2luZ2xlT2JqZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBDUERGX1JlbmRlck9wdGlvbnMJbV9PcHRpb25zOwotICAgIENQREZfRGljdGlvbmFyeSogICAgbV9wRm9ybVJlc291cmNlOwotICAgIENQREZfRGljdGlvbmFyeSogICAgbV9wUGFnZVJlc291cmNlOwotICAgIENGWF9QdHJBcnJheQkJbV9UeXBlM0ZvbnRDYWNoZTsKLSAgICBDUERGX1JlbmRlckNvbnRleHQqIEdldENvbnRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcENvbnRleHQ7Ci0gICAgfQotcHJvdGVjdGVkOgotICAgIGZyaWVuZCBjbGFzcwlDUERGX0ltYWdlUmVuZGVyZXI7Ci0gICAgZnJpZW5kIGNsYXNzCUNQREZfUmVuZGVyQ29udGV4dDsKLSAgICB2b2lkCQkJUHJvY2Vzc0NsaXBQYXRoKENQREZfQ2xpcFBhdGggQ2xpcFBhdGgsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICB2b2lkCQkJRHJhd0NsaXBQYXRoKENQREZfQ2xpcFBhdGggQ2xpcFBhdGgsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJUHJvY2Vzc1RyYW5zcGFyZW5jeShjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICB2b2lkCQkJUHJvY2Vzc09iamVjdE5vQ2xpcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICB2b2lkCQkJRHJhd09ialdpdGhCYWNrZ3JvdW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIEZYX0JPT0wgICAgICAgICBEcmF3T2JqV2l0aEJsZW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgdm9pZAkJCVByb2Nlc3NQYXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgaW50JiBmaWxsdHlwZSwgRlhfQk9PTCYgYlN0cm9rZSk7Ci0gICAgdm9pZAkJCURyYXdQYXRoV2l0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENQREZfQ29sb3IqIHBDb2xvciwgRlhfQk9PTCBiU3Ryb2tlKTsKLSAgICB2b2lkCQkJRHJhd1RpbGluZ1BhdHRlcm4oQ1BERl9UaWxpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0cm9rZSk7Ci0gICAgdm9pZAkJCURyYXdTaGFkaW5nUGF0dGVybihDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0cm9rZSk7Ci0gICAgRlhfQk9PTAkJCVNlbGVjdENsaXBQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdHJva2UpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzSW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgRlhfQk9PTAkJCU91dHB1dEJpdG1hcEFscGhhKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSk7Ci0gICAgRlhfQk9PTAkJCU91dHB1dEltYWdlKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSk7Ci0gICAgRlhfQk9PTAkJCU91dHB1dERJQlNvdXJjZShjb25zdCBDRlhfRElCU291cmNlKiBwT3V0cHV0Qml0bWFwLCBGWF9BUkdCIGZpbGxfYXJnYiwgaW50IGJpdG1hcF9hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UsIENQREZfSW1hZ2VDYWNoZSogcEltYWdlQ2FjaGUsIEZYX0RXT1JEIGZsYWdzKTsKLSAgICB2b2lkCQkJQ29tcG9zaXRlRElCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBGWF9BUkdCIG1hc2tfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgaW50IGJsZW5kX21vZGUsIGludCBiSXNvbGF0ZWQpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzU2hhZGluZyhDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgdm9pZAkJCURyYXdTaGFkaW5nKENQREZfU2hhZGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9SRUNUJiBjbGlwX3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgRlhfQk9PTCBiQWxwaGFNb2RlKTsKLSAgICBGWF9CT09MCQkJUHJvY2Vzc1R5cGUzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJUHJvY2Vzc1RleHQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoKTsKLSAgICB2b2lkCQkJRHJhd1RleHRQYXRoV2l0aFBhdHRlcm4oY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dE1hdHJpeCwgRlhfQk9PTCBiRmlsbCwgRlhfQk9PTCBiU3Ryb2tlKTsKLSAgICBGWF9CT09MCQkJUHJvY2Vzc0Zvcm0oQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIENGWF9ESUJpdG1hcCoJR2V0QmFja2Ryb3AoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBGWF9SRUNUJiByZWN0LCBpbnQmIGxlZnQsIGludCYgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCYWNrQWxwaGFSZXF1aXJlZCk7Ci0gICAgQ0ZYX0RJQml0bWFwKglMb2FkU01hc2soQ1BERl9EaWN0aW9uYXJ5KiBwU01hc2tEaWN0LCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpOwotICAgIHZvaWQJCQlJbml0KENQREZfUmVuZGVyQ29udGV4dCogcFBhcmVudCk7Ci0gICAgc3RhdGljIGNsYXNzIENQREZfVHlwZTNDYWNoZSoJR2V0Q2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKLSAgICBzdGF0aWMgQ1BERl9HcmFwaGljU3RhdGVzKiBDbG9uZU9ialN0YXRlcyhjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBQYXRoT2JqLCBGWF9CT09MIGJTdHJva2UpOwotICAgIENQREZfVHJhbnNmZXJGdW5jKglHZXRUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmplY3QpIGNvbnN0OwotICAgIEZYX0FSR0IJCQlHZXRGaWxsQXJnYihjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIEZYX0JPT0wgYlR5cGUzID0gRkFMU0UpIGNvbnN0OwotICAgIEZYX0FSR0IJCQlHZXRTdHJva2VBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikgY29uc3Q7Ci0gICAgQ1BERl9SZW5kZXJDb250ZXh0KgkJbV9wQ29udGV4dDsKLSAgICBGWF9CT09MCQkJCQltX2JTdG9wcGVkOwotICAgIHZvaWQJCQlEaXRoZXJPYmplY3RBcmVhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIEZYX0JPT0wJCQlHZXRPYmplY3RDbGlwcGVkUmVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJMb2dpY2FsLCBGWF9SRUNUICZyZWN0KSBjb25zdDsKLSAgICB2b2lkCQkJR2V0U2NhbGVkTWF0cml4KENGWF9NYXRyaXggJm1hdHJpeCkgY29uc3Q7CitjbGFzcyBDUERGX1JlbmRlclN0YXR1cyB7CisgcHVibGljOgorICBDUERGX1JlbmRlclN0YXR1cygpOworICB+Q1BERl9SZW5kZXJTdGF0dXMoKTsKKyAgRlhfQk9PTCBJbml0aWFsaXplKGNsYXNzIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERldmljZU1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcFN0b3BPYmosCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlclN0YXR1cyogcFBhcmVudFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyogcEluaXRpYWxTdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zcGFyZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRyb3BPYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfY29sb3IgPSAwLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7CisgIHZvaWQgUmVuZGVyT2JqZWN0TGlzdChjb25zdCBDUERGX1BhZ2VPYmplY3RzKiBwT2JqcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgdm9pZCBSZW5kZXJTaW5nbGVPYmplY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CisgIEZYX0JPT0wgQ29udGludWVTaW5nbGVPYmplY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgQ1BERl9SZW5kZXJPcHRpb25zIG1fT3B0aW9uczsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BGb3JtUmVzb3VyY2U7CisgIENQREZfRGljdGlvbmFyeSogbV9wUGFnZVJlc291cmNlOworICBDRlhfUHRyQXJyYXkgbV9UeXBlM0ZvbnRDYWNoZTsKKyAgQ1BERl9SZW5kZXJDb250ZXh0KiBHZXRDb250ZXh0KCkgeyByZXR1cm4gbV9wQ29udGV4dDsgfQogCi1wcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGNvbnN0IGludCBrUmVuZGVyTWF4UmVjdXJzaW9uRGVwdGggPSA2NDsKLSAgICBzdGF0aWMgaW50IHNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoOworIHByb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIENQREZfSW1hZ2VSZW5kZXJlcjsKKyAgZnJpZW5kIGNsYXNzIENQREZfUmVuZGVyQ29udGV4dDsKKyAgdm9pZCBQcm9jZXNzQ2xpcFBhdGgoQ1BERl9DbGlwUGF0aCBDbGlwUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICB2b2lkIERyYXdDbGlwUGF0aChDUERGX0NsaXBQYXRoIENsaXBQYXRoLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CisgIEZYX0JPT0wgUHJvY2Vzc1RyYW5zcGFyZW5jeShjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CisgIHZvaWQgUHJvY2Vzc09iamVjdE5vQ2xpcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7CisgIHZvaWQgRHJhd09ialdpdGhCYWNrZ3JvdW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICBGWF9CT09MIERyYXdPYmpXaXRoQmxlbmQoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICBGWF9CT09MIFByb2Nlc3NQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICB2b2lkIFByb2Nlc3NQYXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBmaWxsdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlN0cm9rZSk7CisgIHZvaWQgRHJhd1BhdGhXaXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yKiBwQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2UpOworICB2b2lkIERyYXdUaWxpbmdQYXR0ZXJuKENQREZfVGlsaW5nUGF0dGVybiogcFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2UpOworICB2b2lkIERyYXdTaGFkaW5nUGF0dGVybihDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cm9rZSk7CisgIEZYX0JPT0wgU2VsZWN0Q2xpcFBhdGgoQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2UpOworICBGWF9CT09MIFByb2Nlc3NJbWFnZShDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgRlhfQk9PTCBPdXRwdXRCaXRtYXBBbHBoYShDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSk7CisgIEZYX0JPT0wgT3V0cHV0SW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UpOworICBGWF9CT09MIE91dHB1dERJQlNvdXJjZShjb25zdCBDRlhfRElCU291cmNlKiBwT3V0cHV0Qml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9JbWFnZUNhY2hlKiBwSW1hZ2VDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MpOworICB2b2lkIENvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBtYXNrX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYklzb2xhdGVkKTsKKyAgRlhfQk9PTCBQcm9jZXNzU2hhZGluZyhDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgdm9pZCBEcmF3U2hhZGluZyhDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIGNsaXBfcmVjdCwKKyAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWxwaGFNb2RlKTsKKyAgRlhfQk9PTCBQcm9jZXNzVHlwZTNUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgRlhfQk9PTCBQcm9jZXNzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoKTsKKyAgdm9pZCBEcmF3VGV4dFBhdGhXaXRoUGF0dGVybihjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2UpOworICBGWF9CT09MIFByb2Nlc3NGb3JtKENQREZfRm9ybU9iamVjdCogcEZvcm1PYmosCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICBDRlhfRElCaXRtYXAqIEdldEJhY2tkcm9wKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCYWNrQWxwaGFSZXF1aXJlZCk7CisgIENGWF9ESUJpdG1hcCogTG9hZFNNYXNrKENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCogcENsaXBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KTsKKyAgdm9pZCBJbml0KENQREZfUmVuZGVyQ29udGV4dCogcFBhcmVudCk7CisgIHN0YXRpYyBjbGFzcyBDUERGX1R5cGUzQ2FjaGUqIEdldENhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCk7CisgIHN0YXRpYyBDUERGX0dyYXBoaWNTdGF0ZXMqIENsb25lT2JqU3RhdGVzKGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyogcFBhdGhPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cm9rZSk7CisgIENQREZfVHJhbnNmZXJGdW5jKiBHZXRUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmplY3QpIGNvbnN0OworICBGWF9BUkdCIEdldEZpbGxBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUeXBlMyA9IEZBTFNFKSBjb25zdDsKKyAgRlhfQVJHQiBHZXRTdHJva2VBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikgY29uc3Q7CisgIENQREZfUmVuZGVyQ29udGV4dCogbV9wQ29udGV4dDsKKyAgRlhfQk9PTCBtX2JTdG9wcGVkOworICB2b2lkIERpdGhlck9iamVjdEFyZWEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOworICBGWF9CT09MIEdldE9iamVjdENsaXBwZWRSZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2dpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIHJlY3QpIGNvbnN0OworICB2b2lkIEdldFNjYWxlZE1hdHJpeChDRlhfTWF0cml4JiBtYXRyaXgpIGNvbnN0OwogCi0gICAgQ0ZYX1JlbmRlckRldmljZSoJCW1fcERldmljZTsKLSAgICBDRlhfQWZmaW5lTWF0cml4CQltX0RldmljZU1hdHJpeDsKLSAgICBDUERGX0NsaXBQYXRoCQkJbV9MYXN0Q2xpcFBhdGg7Ci0gICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KgltX3BDdXJPYmo7Ci0gICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KgltX3BTdG9wT2JqOwotICAgIENQREZfR3JhcGhpY1N0YXRlcwkJbV9Jbml0aWFsU3RhdGVzOwotICAgIGludAkJCQkJCW1fSGFsZnRvbmVMaW1pdDsKLSAgICBJUERGX09iamVjdFJlbmRlcmVyKgltX3BPYmplY3RSZW5kZXJlcjsKLSAgICBGWF9CT09MCQkJCQltX2JQcmludDsKLSAgICBpbnQJCQkJCQltX1RyYW5zcGFyZW5jeTsKLSAgICBpbnQJCQkJCQltX0RpdGhlckJpdHM7Ci0gICAgRlhfQk9PTAkJCQkJbV9iRHJvcE9iamVjdHM7Ci0gICAgRlhfQk9PTAkJCQkJbV9iU3RkQ1M7Ci0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgbV9Hcm91cEZhbWlseTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBtX2JMb2FkTWFzazsKLSAgICBDUERGX1R5cGUzQ2hhciAqICAgICAgICBtX3BUeXBlM0NoYXI7Ci0gICAgRlhfQVJHQgkJCQkJbV9UM0ZpbGxDb2xvcjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtX2N1ckJsZW5kOworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGludCBrUmVuZGVyTWF4UmVjdXJzaW9uRGVwdGggPSA2NDsKKyAgc3RhdGljIGludCBzX0N1cnJlbnRSZWN1cnNpb25EZXB0aDsKKworICBDRlhfUmVuZGVyRGV2aWNlKiBtX3BEZXZpY2U7CisgIENGWF9BZmZpbmVNYXRyaXggbV9EZXZpY2VNYXRyaXg7CisgIENQREZfQ2xpcFBhdGggbV9MYXN0Q2xpcFBhdGg7CisgIGNvbnN0IENQREZfUGFnZU9iamVjdCogbV9wQ3VyT2JqOworICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIG1fcFN0b3BPYmo7CisgIENQREZfR3JhcGhpY1N0YXRlcyBtX0luaXRpYWxTdGF0ZXM7CisgIGludCBtX0hhbGZ0b25lTGltaXQ7CisgIElQREZfT2JqZWN0UmVuZGVyZXIqIG1fcE9iamVjdFJlbmRlcmVyOworICBGWF9CT09MIG1fYlByaW50OworICBpbnQgbV9UcmFuc3BhcmVuY3k7CisgIGludCBtX0RpdGhlckJpdHM7CisgIEZYX0JPT0wgbV9iRHJvcE9iamVjdHM7CisgIEZYX0JPT0wgbV9iU3RkQ1M7CisgIEZYX0RXT1JEIG1fR3JvdXBGYW1pbHk7CisgIEZYX0JPT0wgbV9iTG9hZE1hc2s7CisgIENQREZfVHlwZTNDaGFyKiBtX3BUeXBlM0NoYXI7CisgIEZYX0FSR0IgbV9UM0ZpbGxDb2xvcjsKKyAgaW50IG1fY3VyQmxlbmQ7CiB9OwotY2xhc3MgQ1BERl9JbWFnZUxvYWRlcgotewotcHVibGljOgotICAgIENQREZfSW1hZ2VMb2FkZXIoKQotICAgIHsKLSAgICAgICAgbV9wQml0bWFwID0gTlVMTDsKLSAgICAgICAgbV9wTWFzayA9IE5VTEw7Ci0gICAgICAgIG1fTWF0dGVDb2xvciA9IDA7Ci0gICAgICAgIG1fYkNhY2hlZCA9IEZBTFNFOwotICAgICAgICBtX25Eb3duc2FtcGxlV2lkdGggPSAwOwotICAgICAgICBtX25Eb3duc2FtcGxlSGVpZ2h0ID0gMDsKLSAgICB9CitjbGFzcyBDUERGX0ltYWdlTG9hZGVyIHsKKyBwdWJsaWM6CisgIENQREZfSW1hZ2VMb2FkZXIoKSB7CisgICAgbV9wQml0bWFwID0gTlVMTDsKKyAgICBtX3BNYXNrID0gTlVMTDsKKyAgICBtX01hdHRlQ29sb3IgPSAwOworICAgIG1fYkNhY2hlZCA9IEZBTFNFOworICAgIG1fbkRvd25zYW1wbGVXaWR0aCA9IDA7CisgICAgbV9uRG93bnNhbXBsZUhlaWdodCA9IDA7CisgIH0KIAotICAgIEZYX0JPT0wJCQkJCUxvYWQoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCk7CisgIEZYX0JPT0wgTG9hZChjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsCisgICAgICAgICAgICAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsCisgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCQkJU3RhcnRMb2FkSW1hZ2UoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCB2b2lkKiYgTG9hZEhhbmRsZSwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIGludDMyX3QgbkRvd25zYW1wbGVXaWR0aCA9IDAsIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQgPSAwKTsKLSAgICBGWF9CT09MCQkJCQlDb250aW51ZSh2b2lkKiBMb2FkSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgfkNQREZfSW1hZ2VMb2FkZXIoKTsKLSAgICBDRlhfRElCU291cmNlKgkJCW1fcEJpdG1hcDsKLSAgICBDRlhfRElCU291cmNlKgkJCW1fcE1hc2s7Ci0gICAgRlhfRFdPUkQJCQkJbV9NYXR0ZUNvbG9yOwotICAgIEZYX0JPT0wJCQkJCW1fYkNhY2hlZDsKLXByb3RlY3RlZDoKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1fbkRvd25zYW1wbGVXaWR0aDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1fbkRvd25zYW1wbGVIZWlnaHQ7CisgIEZYX0JPT0wgU3RhcnRMb2FkSW1hZ2UoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIExvYWRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7CisgIEZYX0JPT0wgQ29udGludWUodm9pZCogTG9hZEhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworICB+Q1BERl9JbWFnZUxvYWRlcigpOworICBDRlhfRElCU291cmNlKiBtX3BCaXRtYXA7CisgIENGWF9ESUJTb3VyY2UqIG1fcE1hc2s7CisgIEZYX0RXT1JEIG1fTWF0dGVDb2xvcjsKKyAgRlhfQk9PTCBtX2JDYWNoZWQ7CisKKyBwcm90ZWN0ZWQ6CisgIGludDMyX3QgbV9uRG93bnNhbXBsZVdpZHRoOworICBpbnQzMl90IG1fbkRvd25zYW1wbGVIZWlnaHQ7CiB9OwotY2xhc3MgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlKCk7Ci0gICAgfkNQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSgpOworY2xhc3MgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlIHsKKyBwdWJsaWM6CisgIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSgpOworICB+Q1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlKCk7CiAKLSAgICBGWF9CT09MCQkJU3RhcnQoQ1BERl9JbWFnZUxvYWRlciogcEltYWdlTG9hZGVyLCBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLCBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGggPSAwLCBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7Ci0gICAgRlhfQk9PTAkJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKLXByb3RlY3RlZDoKLSAgICBDUERGX0ltYWdlTG9hZGVyKgltX3BJbWFnZUxvYWRlcjsKLSAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogbV9wQ2FjaGU7Ci0gICAgQ1BERl9JbWFnZU9iamVjdCogbV9wSW1hZ2U7Ci0gICAgaW50MzJfdCAgICAgICAgICAgIG1fbkRvd25zYW1wbGVXaWR0aDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgbV9uRG93bnNhbXBsZUhlaWdodDsKKyAgRlhfQk9PTCBTdGFydChDUERGX0ltYWdlTG9hZGVyKiBwSW1hZ2VMb2FkZXIsCisgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLAorICAgICAgICAgICAgICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsCisgICAgICAgICAgICAgICAgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoID0gMCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7CisgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworCisgcHJvdGVjdGVkOgorICBDUERGX0ltYWdlTG9hZGVyKiBtX3BJbWFnZUxvYWRlcjsKKyAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIG1fcENhY2hlOworICBDUERGX0ltYWdlT2JqZWN0KiBtX3BJbWFnZTsKKyAgaW50MzJfdCBtX25Eb3duc2FtcGxlV2lkdGg7CisgIGludDMyX3QgbV9uRG93bnNhbXBsZUhlaWdodDsKIH07CiBjbGFzcyBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjsKLWNsYXNzIENQREZfSW1hZ2VSZW5kZXJlciA6IHB1YmxpYyBJUERGX09iamVjdFJlbmRlcmVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9JbWFnZVJlbmRlcmVyKCk7Ci0gICAgfkNQREZfSW1hZ2VSZW5kZXJlcigpOwotICAgIEZYX0JPT0wJCVN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdGRDUywgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7Ci0gICAgRlhfQk9PTAkJU3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UsIEZYX0FSR0IgYml0bWFwX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgRlhfRFdPUkQgZmxhZ3MsIEZYX0JPT0wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICBGWF9CT09MCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci1wcm90ZWN0ZWQ6Ci0gICAgQ1BERl9SZW5kZXJTdGF0dXMqCW1fcFJlbmRlclN0YXR1czsKLSAgICBDUERGX0ltYWdlT2JqZWN0KgltX3BJbWFnZU9iamVjdDsKLSAgICBpbnQJCQkJCW1fU3RhdHVzOwotICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1fcE9iajJEZXZpY2U7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX0ltYWdlTWF0cml4OwotICAgIENQREZfSW1hZ2VMb2FkZXIJbV9Mb2FkZXI7Ci0gICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSoJCW1fcERJQlNvdXJjZTsKLSAgICBDRlhfRElCaXRtYXAqCQltX3BDbG9uZTsKLSAgICBpbnQJCQkJCW1fQml0bWFwQWxwaGE7Ci0gICAgRlhfQk9PTAkJCQltX2JQYXR0ZXJuQ29sb3I7Ci0gICAgQ1BERl9QYXR0ZXJuKgkJbV9wUGF0dGVybjsKLSAgICBGWF9BUkdCCQkJCW1fRmlsbEFyZ2I7Ci0gICAgRlhfRFdPUkQJCQltX0ZsYWdzOwotICAgIENQREZfUXVpY2tTdHJldGNoZXIqCW1fcFF1aWNrU3RyZXRjaGVyOwotICAgIENGWF9JbWFnZVRyYW5zZm9ybWVyKgltX3BUcmFuc2Zvcm1lcjsKLSAgICB2b2lkKgkJCW1fRGV2aWNlSGFuZGxlOwotICAgIHZvaWQqICAgICAgICAgICBtX0xvYWRIYW5kbGU7Ci0gICAgRlhfQk9PTAkJCQltX2JTdGRDUzsKLSAgICBpbnQJCQkJCW1fQmxlbmRUeXBlOwotICAgIEZYX0JPT0wJCQkJU3RhcnRCaXRtYXBBbHBoYSgpOwotICAgIEZYX0JPT0wJCQkJU3RhcnRESUJTb3VyY2UoKTsKLSAgICBGWF9CT09MCQkJCVN0YXJ0UmVuZGVyRElCU291cmNlKCk7Ci0gICAgRlhfQk9PTAkJCQlTdGFydExvYWRESUJTb3VyY2UoKTsKLSAgICBGWF9CT09MCQkJCURyYXdNYXNrZWRJbWFnZSgpOwotICAgIEZYX0JPT0wJCQkJRHJhd1BhdHRlcm5JbWFnZShjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CitjbGFzcyBDUERGX0ltYWdlUmVuZGVyZXIgOiBwdWJsaWMgSVBERl9PYmplY3RSZW5kZXJlciB7CisgcHVibGljOgorICBDUERGX0ltYWdlUmVuZGVyZXIoKTsKKyAgfkNQREZfSW1hZ2VSZW5kZXJlcigpOworICBGWF9CT09MIFN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLAorICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICBpbnQgYmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgRlhfQk9PTCBTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLAorICAgICAgICAgICAgICAgIEZYX0FSR0IgYml0bWFwX2FyZ2IsCisgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLAorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTLAorICAgICAgICAgICAgICAgIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworICBGWF9CT09MIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKworIHByb3RlY3RlZDoKKyAgQ1BERl9SZW5kZXJTdGF0dXMqIG1fcFJlbmRlclN0YXR1czsKKyAgQ1BERl9JbWFnZU9iamVjdCogbV9wSW1hZ2VPYmplY3Q7CisgIGludCBtX1N0YXR1czsKKyAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbV9wT2JqMkRldmljZTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtX0ltYWdlTWF0cml4OworICBDUERGX0ltYWdlTG9hZGVyIG1fTG9hZGVyOworICBjb25zdCBDRlhfRElCU291cmNlKiBtX3BESUJTb3VyY2U7CisgIENGWF9ESUJpdG1hcCogbV9wQ2xvbmU7CisgIGludCBtX0JpdG1hcEFscGhhOworICBGWF9CT09MIG1fYlBhdHRlcm5Db2xvcjsKKyAgQ1BERl9QYXR0ZXJuKiBtX3BQYXR0ZXJuOworICBGWF9BUkdCIG1fRmlsbEFyZ2I7CisgIEZYX0RXT1JEIG1fRmxhZ3M7CisgIENQREZfUXVpY2tTdHJldGNoZXIqIG1fcFF1aWNrU3RyZXRjaGVyOworICBDRlhfSW1hZ2VUcmFuc2Zvcm1lciogbV9wVHJhbnNmb3JtZXI7CisgIHZvaWQqIG1fRGV2aWNlSGFuZGxlOworICB2b2lkKiBtX0xvYWRIYW5kbGU7CisgIEZYX0JPT0wgbV9iU3RkQ1M7CisgIGludCBtX0JsZW5kVHlwZTsKKyAgRlhfQk9PTCBTdGFydEJpdG1hcEFscGhhKCk7CisgIEZYX0JPT0wgU3RhcnRESUJTb3VyY2UoKTsKKyAgRlhfQk9PTCBTdGFydFJlbmRlckRJQlNvdXJjZSgpOworICBGWF9CT09MIFN0YXJ0TG9hZERJQlNvdXJjZSgpOworICBGWF9CT09MIERyYXdNYXNrZWRJbWFnZSgpOworICBGWF9CT09MIERyYXdQYXR0ZXJuSW1hZ2UoY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpOwogfTsKLWNsYXNzIENQREZfU2NhbGVkUmVuZGVyQnVmZmVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXIoKTsKLSAgICB+Q1BERl9TY2FsZWRSZW5kZXJCdWZmZXIoKTsKLSAgICBGWF9CT09MCQkJCUluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgRlhfUkVDVCogcFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zICpwT3B0aW9ucyA9IE5VTEwsIGludCBtYXhfZHBpID0gMCk7Ci0gICAgQ0ZYX1JlbmRlckRldmljZSoJR2V0RGV2aWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BCaXRtYXBEZXZpY2UgPyBtX3BCaXRtYXBEZXZpY2UgOiBtX3BEZXZpY2U7Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXgqCUdldE1hdHJpeCgpCi0gICAgewotICAgICAgICByZXR1cm4gJm1fTWF0cml4OwotICAgIH0KLSAgICB2b2lkCQkJCU91dHB1dFRvRGV2aWNlKCk7Ci1wcml2YXRlOgotICAgIENGWF9SZW5kZXJEZXZpY2UqCW1fcERldmljZTsKLSAgICBDUERGX1JlbmRlckNvbnRleHQqCW1fcENvbnRleHQ7Ci0gICAgRlhfUkVDVAkJCQltX1JlY3Q7Ci0gICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBtX3BPYmplY3Q7Ci0gICAgQ0ZYX0Z4Z2VEZXZpY2UqCW1fcEJpdG1hcERldmljZTsKLSAgICBDRlhfQWZmaW5lTWF0cml4CW1fTWF0cml4OworY2xhc3MgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXIgeworIHB1YmxpYzoKKyAgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXIoKTsKKyAgfkNQREZfU2NhbGVkUmVuZGVyQnVmZmVyKCk7CisgIEZYX0JPT0wgSW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2RwaSA9IDApOworICBDRlhfUmVuZGVyRGV2aWNlKiBHZXREZXZpY2UoKSB7CisgICAgcmV0dXJuIG1fcEJpdG1hcERldmljZSA/IG1fcEJpdG1hcERldmljZSA6IG1fcERldmljZTsKKyAgfQorICBDRlhfQWZmaW5lTWF0cml4KiBHZXRNYXRyaXgoKSB7IHJldHVybiAmbV9NYXRyaXg7IH0KKyAgdm9pZCBPdXRwdXRUb0RldmljZSgpOworCisgcHJpdmF0ZToKKyAgQ0ZYX1JlbmRlckRldmljZSogbV9wRGV2aWNlOworICBDUERGX1JlbmRlckNvbnRleHQqIG1fcENvbnRleHQ7CisgIEZYX1JFQ1QgbV9SZWN0OworICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIG1fcE9iamVjdDsKKyAgQ0ZYX0Z4Z2VEZXZpY2UqIG1fcEJpdG1hcERldmljZTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtX01hdHJpeDsKIH07CiBjbGFzcyBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyOwotY2xhc3MgQ1BERl9RdWlja1N0cmV0Y2hlcgotewotcHVibGljOgotICAgIENQREZfUXVpY2tTdHJldGNoZXIoKTsKLSAgICB+Q1BERl9RdWlja1N0cmV0Y2hlcigpOwotICAgIEZYX0JPT0wJCVN0YXJ0KENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgY29uc3QgRlhfUkVDVCogcENsaXBCb3gpOwotICAgIEZYX0JPT0wJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBDRlhfRElCaXRtYXAqCW1fcEJpdG1hcDsKLSAgICBpbnQJCQltX1Jlc3VsdExlZnQsIG1fUmVzdWx0VG9wLCBtX0NsaXBMZWZ0LCBtX0NsaXBUb3A7Ci0gICAgaW50CQkJbV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodCwgbV9SZXN1bHRXaWR0aCwgbV9SZXN1bHRIZWlnaHQ7Ci0gICAgaW50CQkJbV9CcHAsIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0OwotICAgIEZYX0JPT0wJCW1fYkZsaXBYLCBtX2JGbGlwWTsKLSAgICBDUERGX0NvbG9yU3BhY2UqCW1fcENTOwotICAgIElDb2RlY19TY2FubGluZURlY29kZXIqCW1fcERlY29kZXI7Ci0gICAgQ1BERl9TdHJlYW1BY2MgbV9TdHJlYW1BY2M7Ci0gICAgaW50CQkJbV9MaW5lSW5kZXg7CitjbGFzcyBDUERGX1F1aWNrU3RyZXRjaGVyIHsKKyBwdWJsaWM6CisgIENQREZfUXVpY2tTdHJldGNoZXIoKTsKKyAgfkNQREZfUXVpY2tTdHJldGNoZXIoKTsKKyAgRlhfQk9PTCBTdGFydChDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosCisgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwKKyAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcEJveCk7CisgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKKyAgaW50IG1fUmVzdWx0TGVmdCwgbV9SZXN1bHRUb3AsIG1fQ2xpcExlZnQsIG1fQ2xpcFRvcDsKKyAgaW50IG1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQsIG1fUmVzdWx0V2lkdGgsIG1fUmVzdWx0SGVpZ2h0OworICBpbnQgbV9CcHAsIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0OworICBGWF9CT09MIG1fYkZsaXBYLCBtX2JGbGlwWTsKKyAgQ1BERl9Db2xvclNwYWNlKiBtX3BDUzsKKyAgSUNvZGVjX1NjYW5saW5lRGVjb2RlciogbV9wRGVjb2RlcjsKKyAgQ1BERl9TdHJlYW1BY2MgbV9TdHJlYW1BY2M7CisgIGludCBtX0xpbmVJbmRleDsKIH07Ci1jbGFzcyBDUERGX0RldmljZUJ1ZmZlcgotewotcHVibGljOgotICAgIENQREZfRGV2aWNlQnVmZmVyKCk7Ci0gICAgfkNQREZfRGV2aWNlQnVmZmVyKCk7Ci0gICAgRlhfQk9PTAkJCQlJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGludCBtYXhfZHBpID0gMCk7Ci0gICAgdm9pZAkJCQlPdXRwdXRUb0RldmljZSgpOwotICAgIENGWF9ESUJpdG1hcCoJCUdldEJpdG1hcCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wQml0bWFwOwotICAgIH0KLSAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KglHZXRNYXRyaXgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuICZtX01hdHJpeDsKLSAgICB9Ci1wcml2YXRlOgotICAgIENGWF9SZW5kZXJEZXZpY2UqCW1fcERldmljZTsKLSAgICBDUERGX1JlbmRlckNvbnRleHQqCW1fcENvbnRleHQ7Ci0gICAgRlhfUkVDVAkJCQltX1JlY3Q7Ci0gICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBtX3BPYmplY3Q7Ci0gICAgQ0ZYX0RJQml0bWFwKgkJbV9wQml0bWFwOwotICAgIENGWF9BZmZpbmVNYXRyaXgJbV9NYXRyaXg7CitjbGFzcyBDUERGX0RldmljZUJ1ZmZlciB7CisgcHVibGljOgorICBDUERGX0RldmljZUJ1ZmZlcigpOworICB+Q1BERl9EZXZpY2VCdWZmZXIoKTsKKyAgRlhfQk9PTCBJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCogcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2RwaSA9IDApOworICB2b2lkIE91dHB1dFRvRGV2aWNlKCk7CisgIENGWF9ESUJpdG1hcCogR2V0Qml0bWFwKCkgY29uc3QgeyByZXR1cm4gbV9wQml0bWFwOyB9CisgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIEdldE1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuICZtX01hdHJpeDsgfQorCisgcHJpdmF0ZToKKyAgQ0ZYX1JlbmRlckRldmljZSogbV9wRGV2aWNlOworICBDUERGX1JlbmRlckNvbnRleHQqIG1fcENvbnRleHQ7CisgIEZYX1JFQ1QgbV9SZWN0OworICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIG1fcE9iamVjdDsKKyAgQ0ZYX0RJQml0bWFwKiBtX3BCaXRtYXA7CisgIENGWF9BZmZpbmVNYXRyaXggbV9NYXRyaXg7CiB9OwotY2xhc3MgQ1BERl9JbWFnZUNhY2hlCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9JbWFnZUNhY2hlKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfU3RyZWFtKiBwU3RyZWFtKTsKLSAgICB+Q1BERl9JbWFnZUNhY2hlKCk7Ci0gICAgdm9pZAkJCQlDbGVhckltYWdlRGF0YSgpOwotICAgIHZvaWQJCQkJUmVzZXQoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsKLSAgICBGWF9CT09MCQkJCUdldENhY2hlZEJpdG1hcChDRlhfRElCU291cmNlKiYgcEJpdG1hcCwgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLCBGWF9EV09SRCYgTWF0dGVDb2xvciwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLCBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCA9IDAsIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCA9IDApOwotICAgIEZYX0RXT1JECQkJRXN0aW1hdGVTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2R3Q2FjaGVTaXplOwotICAgIH0KLSAgICBGWF9EV09SRAkJCUdldFRpbWVDb3VudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9kd1RpbWVDb3VudDsKLSAgICB9Ci0gICAgQ1BERl9TdHJlYW0qCQlHZXRTdHJlYW0oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFN0cmVhbTsKLSAgICB9Ci0gICAgdm9pZAkJCQlTZXRUaW1lQ291bnQoRlhfRFdPUkQgZHdUaW1lQ291bnQpCi0gICAgewotICAgICAgICBtX2R3VGltZUNvdW50ID0gZHdUaW1lQ291bnQ7Ci0gICAgfQotICAgIGludAkJCQkJbV9kd1RpbWVDb3VudDsKLXB1YmxpYzoKLSAgICBpbnQJCQkJCVN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCi0gICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0ID0gMCk7Ci0gICAgaW50CQkJCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgaW50IAkJCQlDb250aW51ZUdldENhY2hlZEJpdG1hcCgpOwotICAgIENGWF9ESUJTb3VyY2UqCQlEZXRhY2hCaXRtYXAoKTsKLSAgICBDRlhfRElCU291cmNlKgkJRGV0YWNoTWFzaygpOwotICAgIENGWF9ESUJTb3VyY2UqCQltX3BDdXJCaXRtYXA7Ci0gICAgQ0ZYX0RJQlNvdXJjZSoJCW1fcEN1ck1hc2s7Ci0gICAgRlhfRFdPUkQJCQltX01hdHRlQ29sb3I7Ci0gICAgQ1BERl9SZW5kZXJTdGF0dXMqICBtX3BSZW5kZXJTdGF0dXM7Ci1wcm90ZWN0ZWQ6Ci0gICAgQ1BERl9Eb2N1bWVudCoJCW1fcERvY3VtZW50OwotICAgIENQREZfU3RyZWFtKgkJbV9wU3RyZWFtOwotICAgIENGWF9ESUJTb3VyY2UqCQltX3BDYWNoZWRCaXRtYXA7Ci0gICAgQ0ZYX0RJQlNvdXJjZSoJCW1fcENhY2hlZE1hc2s7Ci0gICAgRlhfRFdPUkQJCQltX2R3Q2FjaGVTaXplOwotICAgIHZvaWQJQ2FsY1NpemUoKTsKK2NsYXNzIENQREZfSW1hZ2VDYWNoZSB7CisgcHVibGljOgorICBDUERGX0ltYWdlQ2FjaGUoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9TdHJlYW0qIHBTdHJlYW0pOworICB+Q1BERl9JbWFnZUNhY2hlKCk7CisgIHZvaWQgQ2xlYXJJbWFnZURhdGEoKTsKKyAgdm9pZCBSZXNldChjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApOworICBGWF9CT09MIEdldENhY2hlZEJpdG1hcChDRlhfRElCU291cmNlKiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgTWF0dGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0ID0gMCk7CisgIEZYX0RXT1JEIEVzdGltYXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZHdDYWNoZVNpemU7IH0KKyAgRlhfRFdPUkQgR2V0VGltZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9kd1RpbWVDb3VudDsgfQorICBDUERGX1N0cmVhbSogR2V0U3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbV9wU3RyZWFtOyB9CisgIHZvaWQgU2V0VGltZUNvdW50KEZYX0RXT1JEIGR3VGltZUNvdW50KSB7IG1fZHdUaW1lQ291bnQgPSBkd1RpbWVDb3VudDsgfQorICBpbnQgbV9kd1RpbWVDb3VudDsKKworIHB1YmxpYzoKKyAgaW50IFN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKKyAgaW50IENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50IENvbnRpbnVlR2V0Q2FjaGVkQml0bWFwKCk7CisgIENGWF9ESUJTb3VyY2UqIERldGFjaEJpdG1hcCgpOworICBDRlhfRElCU291cmNlKiBEZXRhY2hNYXNrKCk7CisgIENGWF9ESUJTb3VyY2UqIG1fcEN1ckJpdG1hcDsKKyAgQ0ZYX0RJQlNvdXJjZSogbV9wQ3VyTWFzazsKKyAgRlhfRFdPUkQgbV9NYXR0ZUNvbG9yOworICBDUERGX1JlbmRlclN0YXR1cyogbV9wUmVuZGVyU3RhdHVzOworCisgcHJvdGVjdGVkOgorICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKKyAgQ1BERl9TdHJlYW0qIG1fcFN0cmVhbTsKKyAgQ0ZYX0RJQlNvdXJjZSogbV9wQ2FjaGVkQml0bWFwOworICBDRlhfRElCU291cmNlKiBtX3BDYWNoZWRNYXNrOworICBGWF9EV09SRCBtX2R3Q2FjaGVTaXplOworICB2b2lkIENhbGNTaXplKCk7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIEZYX0ZMT0FUCQkJbV9EZWNvZGVNaW47Ci0gICAgRlhfRkxPQVQJCQltX0RlY29kZVN0ZXA7Ci0gICAgaW50CQkJCQltX0NvbG9yS2V5TWluOwotICAgIGludAkJCQkJbV9Db2xvcktleU1heDsKKyAgRlhfRkxPQVQgbV9EZWNvZGVNaW47CisgIEZYX0ZMT0FUIG1fRGVjb2RlU3RlcDsKKyAgaW50IG1fQ29sb3JLZXlNaW47CisgIGludCBtX0NvbG9yS2V5TWF4OwogfSBESUJfQ09NUF9EQVRBOwotY2xhc3MgQ1BERl9ESUJTb3VyY2UgOiBwdWJsaWMgQ0ZYX0RJQlNvdXJjZQotewotcHVibGljOgotICAgIENQREZfRElCU291cmNlKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9ESUJTb3VyY2UoKTsKLSAgICBGWF9CT09MCQkJCUxvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRElCU291cmNlKiogcHBNYXNrLCBGWF9EV09SRCogcE1hdHRlQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0OwotICAgIHZpcnR1YWwJdWludDhfdCoJR2V0QnVmZmVyKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCB1aW50OF90KglHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkCQlEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIHVpbnQ4X3QqIGRlc3Rfc2NhbiwgaW50IGRlc3RfYnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZAkJU2V0RG93blNhbXBsZVNpemUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgY29uc3Q7Ci0gICAgQ0ZYX0RJQml0bWFwKgkJR2V0Qml0bWFwKCkgY29uc3Q7Ci0gICAgdm9pZAkJCQlSZWxlYXNlQml0bWFwKENGWF9ESUJpdG1hcCopIGNvbnN0OwotICAgIHZvaWQJCQkJQ2xlYXJJbWFnZURhdGEoKTsKLXB1YmxpYzoKLSAgICBpbnQJCQkJCVN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiSGFzTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7Ci0gICAgaW50CQkJCQlDb250aW51ZUxvYWRESUJTb3VyY2UoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIGludAkJCQkJU3RyYXRMb2FkTWFzaygpOwotICAgIGludAkJCQkJU3RhcnRMb2FkTWFza0RJQigpOwotICAgIGludAkJCQkJQ29udGludWVMb2FkTWFza0RJQihJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgaW50CQkJCQlDb250aW51ZVRvTG9hZE1hc2soKTsKLSAgICBDUERGX0RJQlNvdXJjZSoJCURldGFjaE1hc2soKTsKLSAgICBDUERGX0RJQlNvdXJjZSoJCW1fcE1hc2s7Ci0gICAgRlhfRFdPUkQJCQltX01hdHRlQ29sb3I7Ci0gICAgdm9pZCoJCQltX3BKYmlnMkNvbnRleHQ7Ci0gICAgQ1BERl9TdHJlYW1BY2MqCQltX3BHbG9iYWxTdHJlYW07Ci0gICAgRlhfQk9PTAkJCQltX2JTdGRDUzsKLSAgICBpbnQJCQkJCW1fU3RhdHVzOwotICAgIENQREZfT2JqZWN0KgkJbV9wTWFza1N0cmVhbTsKLSAgICBGWF9CT09MCQkJCW1fYkhhc01hc2s7Ci1wcm90ZWN0ZWQ6Ci0gICAgRlhfQk9PTAkJCQlMb2FkQ29sb3JJbmZvKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMpOwotICAgIERJQl9DT01QX0RBVEEqICAgICAgR2V0RGVjb2RlQW5kTWFza0FycmF5KEZYX0JPT0wmIGJEZWZhdWx0RGVjb2RlLCBGWF9CT09MJiBiQ29sb3JLZXkpOwotICAgIENQREZfRElCU291cmNlKgkJTG9hZE1hc2soRlhfRFdPUkQmIE1hdHRlQ29sb3IpOwotICAgIENQREZfRElCU291cmNlKgkJTG9hZE1hc2tESUIoQ1BERl9TdHJlYW0qIHBNYXNrKTsKLSAgICB2b2lkCQkJCUxvYWRKcHhCaXRtYXAoKTsKLSAgICB2b2lkCQkJCUxvYWRQYWxldHRlKCk7Ci0gICAgaW50CQkJCQlDcmVhdGVEZWNvZGVyKCk7Ci0gICAgdm9pZAkJCQlUcmFuc2xhdGVTY2FubGluZTI0YnBwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4pIGNvbnN0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgVmFsaWRhdGVEaWN0UGFyYW0oKTsKLSAgICBDUERGX0RvY3VtZW50KgkJbV9wRG9jdW1lbnQ7Ci0gICAgY29uc3QgQ1BERl9TdHJlYW0qCW1fcFN0cmVhbTsKLSAgICBDUERGX1N0cmVhbUFjYyoJCW1fcFN0cmVhbUFjYzsKLSAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqCW1fcERpY3Q7Ci0gICAgQ1BERl9Db2xvclNwYWNlKgltX3BDb2xvclNwYWNlOwotICAgIEZYX0RXT1JECQkJbV9GYW1pbHk7Ci0gICAgRlhfRFdPUkQJCQltX2JwYzsKLSAgICBGWF9EV09SRAkJCW1fYnBjX29yaWc7Ci0gICAgRlhfRFdPUkQJCQltX25Db21wb25lbnRzOwotICAgIEZYX0RXT1JECQkJbV9Hcm91cEZhbWlseTsKLSAgICBGWF9CT09MCQkJCW1fYkxvYWRNYXNrOwotICAgIEZYX0JPT0wJCQkJbV9iRGVmYXVsdERlY29kZTsKLSAgICBGWF9CT09MCQkJCW1fYkltYWdlTWFzazsKLSAgICBGWF9CT09MCQkJCW1fYkRvQnBjQ2hlY2s7Ci0gICAgRlhfQk9PTAkJCQltX2JDb2xvcktleTsKLSAgICBESUJfQ09NUF9EQVRBKgkJbV9wQ29tcERhdGE7Ci0gICAgdWludDhfdCoJCQltX3BMaW5lQnVmOwotICAgIHVpbnQ4X3QqCQkJbV9wTWFza2VkTGluZTsKLSAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBtX3BDYWNoZWRCaXRtYXA7Ci0gICAgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJbV9wRGVjb2RlcjsKK2NsYXNzIENQREZfRElCU291cmNlIDogcHVibGljIENGWF9ESUJTb3VyY2UgeworIHB1YmxpYzoKKyAgQ1BERl9ESUJTb3VyY2UoKTsKKyAgdmlydHVhbCB+Q1BERl9ESUJTb3VyY2UoKTsKKyAgRlhfQk9PTCBMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgIENQREZfRElCU291cmNlKiogcHBNYXNrLAorICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yLAorICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCisgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLAorICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7CisgIHZpcnR1YWwgRlhfQk9PTCBTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0OworICB2aXJ0dWFsIHVpbnQ4X3QqIEdldEJ1ZmZlcigpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIEdldFNjYW5saW5lKGludCBsaW5lKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIERvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfYnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfd2lkdGgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU2V0RG93blNhbXBsZVNpemUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgY29uc3Q7CisgIENGWF9ESUJpdG1hcCogR2V0Qml0bWFwKCkgY29uc3Q7CisgIHZvaWQgUmVsZWFzZUJpdG1hcChDRlhfRElCaXRtYXAqKSBjb25zdDsKKyAgdm9pZCBDbGVhckltYWdlRGF0YSgpOworCisgcHVibGljOgorICBpbnQgU3RhcnRMb2FkRElCU291cmNlKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSGFzTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7CisgIGludCBDb250aW51ZUxvYWRESUJTb3VyY2UoSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQgU3RyYXRMb2FkTWFzaygpOworICBpbnQgU3RhcnRMb2FkTWFza0RJQigpOworICBpbnQgQ29udGludWVMb2FkTWFza0RJQihJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludCBDb250aW51ZVRvTG9hZE1hc2soKTsKKyAgQ1BERl9ESUJTb3VyY2UqIERldGFjaE1hc2soKTsKKyAgQ1BERl9ESUJTb3VyY2UqIG1fcE1hc2s7CisgIEZYX0RXT1JEIG1fTWF0dGVDb2xvcjsKKyAgdm9pZCogbV9wSmJpZzJDb250ZXh0OworICBDUERGX1N0cmVhbUFjYyogbV9wR2xvYmFsU3RyZWFtOworICBGWF9CT09MIG1fYlN0ZENTOworICBpbnQgbV9TdGF0dXM7CisgIENQREZfT2JqZWN0KiBtX3BNYXNrU3RyZWFtOworICBGWF9CT09MIG1fYkhhc01hc2s7CisKKyBwcm90ZWN0ZWQ6CisgIEZYX0JPT0wgTG9hZENvbG9ySW5mbyhDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcyk7CisgIERJQl9DT01QX0RBVEEqIEdldERlY29kZUFuZE1hc2tBcnJheShGWF9CT09MJiBiRGVmYXVsdERlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJDb2xvcktleSk7CisgIENQREZfRElCU291cmNlKiBMb2FkTWFzayhGWF9EV09SRCYgTWF0dGVDb2xvcik7CisgIENQREZfRElCU291cmNlKiBMb2FkTWFza0RJQihDUERGX1N0cmVhbSogcE1hc2spOworICB2b2lkIExvYWRKcHhCaXRtYXAoKTsKKyAgdm9pZCBMb2FkUGFsZXR0ZSgpOworICBpbnQgQ3JlYXRlRGVjb2RlcigpOworICB2b2lkIFRyYW5zbGF0ZVNjYW5saW5lMjRicHAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4pIGNvbnN0OworICB2b2lkIFZhbGlkYXRlRGljdFBhcmFtKCk7CisgIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OworICBjb25zdCBDUERGX1N0cmVhbSogbV9wU3RyZWFtOworICBDUERGX1N0cmVhbUFjYyogbV9wU3RyZWFtQWNjOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIG1fcERpY3Q7CisgIENQREZfQ29sb3JTcGFjZSogbV9wQ29sb3JTcGFjZTsKKyAgRlhfRFdPUkQgbV9GYW1pbHk7CisgIEZYX0RXT1JEIG1fYnBjOworICBGWF9EV09SRCBtX2JwY19vcmlnOworICBGWF9EV09SRCBtX25Db21wb25lbnRzOworICBGWF9EV09SRCBtX0dyb3VwRmFtaWx5OworICBGWF9CT09MIG1fYkxvYWRNYXNrOworICBGWF9CT09MIG1fYkRlZmF1bHREZWNvZGU7CisgIEZYX0JPT0wgbV9iSW1hZ2VNYXNrOworICBGWF9CT09MIG1fYkRvQnBjQ2hlY2s7CisgIEZYX0JPT0wgbV9iQ29sb3JLZXk7CisgIERJQl9DT01QX0RBVEEqIG1fcENvbXBEYXRhOworICB1aW50OF90KiBtX3BMaW5lQnVmOworICB1aW50OF90KiBtX3BNYXNrZWRMaW5lOworICBub25zdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBtX3BDYWNoZWRCaXRtYXA7CisgIElDb2RlY19TY2FubGluZURlY29kZXIqIG1fcERlY29kZXI7CiB9OwotI2RlZmluZSBGUERGX0hVR0VfSU1BR0VfU0laRQk2MDAwMDAwMAotY2xhc3MgQ1BERl9ESUJUcmFuc2ZlckZ1bmMgOiBwdWJsaWMgQ0ZYX0ZpbHRlcmVkRElCCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9ESUJUcmFuc2ZlckZ1bmMoY29uc3QgQ1BERl9UcmFuc2ZlckZ1bmMqIHBUcmFuc2ZlckZ1bmMpOwotICAgIHZpcnR1YWwgRlhESUJfRm9ybWF0CUdldERlc3RGb3JtYXQoKTsKLSAgICB2aXJ0dWFsIEZYX0FSR0IqCQlHZXREZXN0UGFsZXR0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkCQkJVHJhbnNsYXRlU2NhbmxpbmUodWludDhfdCogZGVzdF9idWYsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZAkJCVRyYW5zbGF0ZURvd25TYW1wbGVzKHVpbnQ4X3QqIGRlc3RfYnVmLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgcGl4ZWxzLCBpbnQgQnBwKSBjb25zdDsKLSAgICBjb25zdCB1aW50OF90KgkJCQltX1JhbXBSOwotICAgIGNvbnN0IHVpbnQ4X3QqCQkJCW1fUmFtcEc7Ci0gICAgY29uc3QgdWludDhfdCoJCQkJbV9SYW1wQjsKKyNkZWZpbmUgRlBERl9IVUdFX0lNQUdFX1NJWkUgNjAwMDAwMDAKK2NsYXNzIENQREZfRElCVHJhbnNmZXJGdW5jIDogcHVibGljIENGWF9GaWx0ZXJlZERJQiB7CisgcHVibGljOgorICBDUERGX0RJQlRyYW5zZmVyRnVuYyhjb25zdCBDUERGX1RyYW5zZmVyRnVuYyogcFRyYW5zZmVyRnVuYyk7CisgIHZpcnR1YWwgRlhESUJfRm9ybWF0IEdldERlc3RGb3JtYXQoKTsKKyAgdmlydHVhbCBGWF9BUkdCKiBHZXREZXN0UGFsZXR0ZSgpIHsgcmV0dXJuIE5VTEw7IH0KKyAgdmlydHVhbCB2b2lkIFRyYW5zbGF0ZVNjYW5saW5lKHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZikgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVEb3duU2FtcGxlcyh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCkgY29uc3Q7CisgIGNvbnN0IHVpbnQ4X3QqIG1fUmFtcFI7CisgIGNvbnN0IHVpbnQ4X3QqIG1fUmFtcEc7CisgIGNvbnN0IHVpbnQ4X3QqIG1fUmFtcEI7CiB9Owogc3RydWN0IF9DUERGX1VuaXF1ZUtleUdlbiB7Ci0gICAgdm9pZAkJR2VuZXJhdGUoaW50IGNvdW50LCAuLi4pOwotICAgIEZYX0NIQVIJCW1fS2V5WzEyOF07Ci0gICAgaW50CQkJbV9LZXlMZW47CisgIHZvaWQgR2VuZXJhdGUoaW50IGNvdW50LCAuLi4pOworICBGWF9DSEFSIG1fS2V5WzEyOF07CisgIGludCBtX0tleUxlbjsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlBERkFQSV9GUERGX1JFTkRFUl9SRU5ERVJfSU5UX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hY3Rpb24uY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYWN0aW9uLmNwcAppbmRleCA4NTFiMmQ2Li5mOGExMWU1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hY3Rpb24uY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FjdGlvbi5jcHAKQEAgLTUsMzY4ICs1LDM0NiBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotQ1BERl9EZXN0IENQREZfQWN0aW9uOjpHZXREZXN0KENQREZfRG9jdW1lbnQqIHBEb2MpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BEaWN0KSB7Ci0gICAgICAgIHJldHVybiBDUERGX0Rlc3QoKTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IG1fcERpY3QtPkdldFN0cmluZygiUyIpOwotICAgIGlmICh0eXBlICE9ICJHb1RvIiAmJiB0eXBlICE9ICJHb1RvUiIpIHsKLSAgICAgICAgcmV0dXJuIENQREZfRGVzdCgpOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcERlc3QgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkQiKTsKLSAgICBpZiAoIXBEZXN0KSB7Ci0gICAgICAgIHJldHVybiBDUERGX0Rlc3QoKTsKLSAgICB9Ci0gICAgaWYgKHBEZXN0LT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORyB8fCBwRGVzdC0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKHBEb2MsIEZYX0JTVFJDKCJEZXN0cyIpKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIG5hbWUgPSBwRGVzdC0+R2V0U3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBDUERGX0Rlc3QobmFtZV90cmVlLkxvb2t1cE5hbWVkRGVzdChwRG9jLCBuYW1lKSk7Ci0gICAgfQotICAgIGlmIChwRGVzdC0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gQ1BERl9EZXN0KChDUERGX0FycmF5KilwRGVzdCk7Ci0gICAgfQorQ1BERl9EZXN0IENQREZfQWN0aW9uOjpHZXREZXN0KENQREZfRG9jdW1lbnQqIHBEb2MpIGNvbnN0IHsKKyAgaWYgKCFtX3BEaWN0KSB7CiAgICAgcmV0dXJuIENQREZfRGVzdCgpOworICB9CisgIENGWF9CeXRlU3RyaW5nIHR5cGUgPSBtX3BEaWN0LT5HZXRTdHJpbmcoIlMiKTsKKyAgaWYgKHR5cGUgIT0gIkdvVG8iICYmIHR5cGUgIT0gIkdvVG9SIikgeworICAgIHJldHVybiBDUERGX0Rlc3QoKTsKKyAgfQorICBDUERGX09iamVjdCogcERlc3QgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkQiKTsKKyAgaWYgKCFwRGVzdCkgeworICAgIHJldHVybiBDUERGX0Rlc3QoKTsKKyAgfQorICBpZiAocERlc3QtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSSU5HIHx8IHBEZXN0LT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKKyAgICBDUERGX05hbWVUcmVlIG5hbWVfdHJlZShwRG9jLCBGWF9CU1RSQygiRGVzdHMiKSk7CisgICAgQ0ZYX0J5dGVTdHJpbmdDIG5hbWUgPSBwRGVzdC0+R2V0U3RyaW5nKCk7CisgICAgcmV0dXJuIENQREZfRGVzdChuYW1lX3RyZWUuTG9va3VwTmFtZWREZXN0KHBEb2MsIG5hbWUpKTsKKyAgfQorICBpZiAocERlc3QtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICByZXR1cm4gQ1BERl9EZXN0KChDUERGX0FycmF5KilwRGVzdCk7CisgIH0KKyAgcmV0dXJuIENQREZfRGVzdCgpOwogfQotY29uc3QgRlhfQ0hBUiogZ19zQVR5cGVzW10gPSB7IlVua25vd24iLCAiR29UbyIsICJHb1RvUiIsICJHb1RvRSIsICJMYXVuY2giLCAiVGhyZWFkIiwgIlVSSSIsICJTb3VuZCIsICJNb3ZpZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGlkZSIsCSJOYW1lZCIsICJTdWJtaXRGb3JtIiwgIlJlc2V0Rm9ybSIsICJJbXBvcnREYXRhIiwgIkphdmFTY3JpcHQiLCAiU2V0T0NHU3RhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbmRpdGlvbiIsICJUcmFucyIsICJHb1RvM0RWaWV3IiwgIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLUNQREZfQWN0aW9uOjpBY3Rpb25UeXBlIENQREZfQWN0aW9uOjpHZXRUeXBlKCkgY29uc3QKLXsKLSAgICBBY3Rpb25UeXBlIGVUeXBlID0gVW5rbm93bjsKLSAgICBpZiAobV9wRGljdCAhPSBOVUxMKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IG1fcERpY3QtPkdldFN0cmluZygiUyIpOwotICAgICAgICBpZiAoIWNzVHlwZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChnX3NBVHlwZXNbaV1bMF0gIT0gJ1wwJykgewotICAgICAgICAgICAgICAgIGlmIChjc1R5cGUgPT0gZ19zQVR5cGVzW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoQWN0aW9uVHlwZSlpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlVHlwZTsKLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfQWN0aW9uOjpHZXRGaWxlUGF0aCgpIGNvbnN0Ci17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IG1fcERpY3QtPkdldFN0cmluZygiUyIpOwotICAgIGlmICh0eXBlICE9ICJHb1RvUiIgJiYgdHlwZSAhPSAiTGF1bmNoIiAmJgotICAgICAgICAgICAgdHlwZSAhPSAiU3VibWl0Rm9ybSIgJiYgdHlwZSAhPSAiSW1wb3J0RGF0YSIpIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwRmlsZSA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiRiIpOwotICAgIENGWF9XaWRlU3RyaW5nIHBhdGg7Ci0gICAgaWYgKHBGaWxlID09IE5VTEwpIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gIkxhdW5jaCIpIHsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFdpbkRpY3QgPSBtX3BEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJXaW4iKSk7Ci0gICAgICAgICAgICBpZiAocFdpbkRpY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwV2luRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGIikpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0gICAgQ1BERl9GaWxlU3BlYyBmaWxlc3BlYyhwRmlsZSk7Ci0gICAgZmlsZXNwZWMuR2V0RmlsZU5hbWUocGF0aCk7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0FjdGlvbjo6R2V0VVJJKENQREZfRG9jdW1lbnQqIHBEb2MpIGNvbnN0Ci17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NVUkk7Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY3NVUkk7Ci0gICAgfQotICAgIGlmIChtX3BEaWN0LT5HZXRTdHJpbmcoIlMiKSAhPSAiVVJJIikgewotICAgICAgICByZXR1cm4gY3NVUkk7Ci0gICAgfQotICAgIGNzVVJJID0gbV9wRGljdC0+R2V0U3RyaW5nKCJVUkkiKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOwotICAgIENQREZfRGljdGlvbmFyeSogcFVSSSA9IHBSb290LT5HZXREaWN0KCJVUkkiKTsKLSAgICBpZiAocFVSSSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChjc1VSSS5GaW5kKEZYX0JTVFJDKCI6IiksIDApIDwgMSkgewotICAgICAgICAgICAgY3NVUkkgPSBwVVJJLT5HZXRTdHJpbmcoIkJhc2UiKSArIGNzVVJJOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjc1VSSTsKLX0KLUZYX0RXT1JEIENQREZfQWN0aW9uRmllbGRzOjpHZXRGaWVsZHNDb3VudCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcEFjdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wQWN0aW9uLT5HZXREaWN0KCk7Ci0gICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IHBEaWN0LT5HZXRTdHJpbmcoIlMiKTsKLSAgICBDUERGX09iamVjdCogcEZpZWxkcyA9IE5VTEw7Ci0gICAgaWYgKGNzVHlwZSA9PSAiSGlkZSIpIHsKLSAgICAgICAgcEZpZWxkcyA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoIlQiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwRmllbGRzID0gcERpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKLSAgICB9Ci0gICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IGlUeXBlID0gcEZpZWxkcy0+R2V0VHlwZSgpOwotICAgIGlmIChpVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKGlUeXBlID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChpVHlwZSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuICgoQ1BERl9BcnJheSopcEZpZWxkcyktPkdldENvdW50KCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotdm9pZCBDUERGX0FjdGlvbkZpZWxkczo6R2V0QWxsRmllbGRzKENGWF9QdHJBcnJheSYgZmllbGRPYmplY3RzKSBjb25zdAotewotICAgIGZpZWxkT2JqZWN0cy5SZW1vdmVBbGwoKTsKLSAgICBpZiAobV9wQWN0aW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wQWN0aW9uLT5HZXREaWN0KCk7Ci0gICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1R5cGUgPSBwRGljdC0+R2V0U3RyaW5nKCJTIik7Ci0gICAgQ1BERl9PYmplY3QqIHBGaWVsZHMgPSBOVUxMOwotICAgIGlmIChjc1R5cGUgPT0gIkhpZGUiKSB7Ci0gICAgICAgIHBGaWVsZHMgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJUIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEZpZWxkcyA9IHBEaWN0LT5HZXRBcnJheSgiRmllbGRzIik7Ci0gICAgfQotICAgIGlmIChwRmllbGRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgaVR5cGUgPSBwRmllbGRzLT5HZXRUeXBlKCk7Ci0gICAgaWYgKGlUeXBlID09IFBERk9CSl9ESUNUSU9OQVJZIHx8IGlUeXBlID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgZmllbGRPYmplY3RzLkFkZChwRmllbGRzKTsKLSAgICB9IGVsc2UgaWYgKGlUeXBlID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcEZpZWxkczsKLSAgICAgICAgRlhfRFdPUkQgaUNvdW50ID0gcEFycmF5LT5HZXRDb3VudCgpOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOwotICAgICAgICAgICAgaWYgKHBPYmogIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZpZWxkT2JqZWN0cy5BZGQocE9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUERGX09iamVjdCogQ1BERl9BY3Rpb25GaWVsZHM6OkdldEZpZWxkKEZYX0RXT1JEIGlJbmRleCkgY29uc3QKLXsKLSAgICBpZiAobV9wQWN0aW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BBY3Rpb24tPkdldERpY3QoKTsKLSAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NUeXBlID0gcERpY3QtPkdldFN0cmluZygiUyIpOwotICAgIENQREZfT2JqZWN0KiBwRmllbGRzID0gTlVMTDsKLSAgICBpZiAoY3NUeXBlID09ICJIaWRlIikgewotICAgICAgICBwRmllbGRzID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiVCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBGaWVsZHMgPSBwRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOwotICAgIH0KLSAgICBpZiAocEZpZWxkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcEZpbmRPYmogPSBOVUxMOwotICAgIGludCBpVHlwZSA9IHBGaWVsZHMtPkdldFR5cGUoKTsKLSAgICBpZiAoaVR5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlkgfHwgaVR5cGUgPT0gUERGT0JKX1NUUklORykgewotICAgICAgICBpZiAoaUluZGV4ID09IDApIHsKLSAgICAgICAgICAgIHBGaW5kT2JqID0gcEZpZWxkczsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHBGaW5kT2JqID0gKChDUERGX0FycmF5KilwRmllbGRzKS0+R2V0RWxlbWVudFZhbHVlKGlJbmRleCk7Ci0gICAgfQotICAgIHJldHVybiBwRmluZE9iajsKLX0KLUNQREZfTFdpblBhcmFtIENQREZfQWN0aW9uOjpHZXRXaW5QYXJhbSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fcERpY3QtPkdldFN0cmluZygiUyIpICE9ICJMYXVuY2giKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGljdC0+R2V0RGljdCgiV2luIik7Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX0FjdGlvbjo6R2V0SmF2YVNjcmlwdCgpIGNvbnN0Ci17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NKUzsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBjc0pTOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcEpTID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJKUyIpOwotICAgIGlmIChwSlMgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gcEpTLT5HZXRVbmljb2RlVGV4dCgpOwotICAgIH0KLSAgICByZXR1cm4gY3NKUzsKLX0KLUNQREZfRGljdGlvbmFyeSogQ1BERl9BY3Rpb246OkdldEFubm90KCkgY29uc3QKLXsKLSAgICBpZiAoIW1fcERpY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQorY29uc3QgRlhfQ0hBUiogZ19zQVR5cGVzW10gPSB7CisgICAgIlVua25vd24iLCAgICAgIkdvVG8iLCAgICAgICAiR29Ub1IiLCAgICAgIkdvVG9FIiwgICAgICAiTGF1bmNoIiwKKyAgICAiVGhyZWFkIiwgICAgICAiVVJJIiwgICAgICAgICJTb3VuZCIsICAgICAiTW92aWUiLCAgICAgICJIaWRlIiwKKyAgICAiTmFtZWQiLCAgICAgICAiU3VibWl0Rm9ybSIsICJSZXNldEZvcm0iLCAiSW1wb3J0RGF0YSIsICJKYXZhU2NyaXB0IiwKKyAgICAiU2V0T0NHU3RhdGUiLCAiUmVuZGl0aW9uIiwgICJUcmFucyIsICAgICAiR29UbzNEVmlldyIsICIifTsKK0NQREZfQWN0aW9uOjpBY3Rpb25UeXBlIENQREZfQWN0aW9uOjpHZXRUeXBlKCkgY29uc3QgeworICBBY3Rpb25UeXBlIGVUeXBlID0gVW5rbm93bjsKKyAgaWYgKG1fcERpY3QgIT0gTlVMTCkgewogICAgIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IG1fcERpY3QtPkdldFN0cmluZygiUyIpOwotICAgIGlmIChjc1R5cGUgPT0gRlhfQlNUUkMoIlJlbmRpdGlvbiIpKSB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXREaWN0KCJBTiIpOwotICAgIH0KLSAgICBpZiAoY3NUeXBlID09IEZYX0JTVFJDKCJNb3ZpZSIpKSB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXREaWN0KCJBbm5vdGF0aW9uIik7Ci0gICAgfQotICAgIHJldHVybiBudWxscHRyOwotfQotaW50MzJfdCBDUERGX0FjdGlvbjo6R2V0T3BlcmF0aW9uVHlwZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NUeXBlID0gbV9wRGljdC0+R2V0U3RyaW5nKCJTIik7Ci0gICAgaWYgKGNzVHlwZSA9PSBGWF9CU1RSQygiUmVuZGl0aW9uIikpIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEludGVnZXIoIk9QIik7Ci0gICAgfQotICAgIGlmIChjc1R5cGUgPT0gRlhfQlNUUkMoIk1vdmllIikpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NPUCA9IG1fcERpY3QtPkdldFN0cmluZygiT3BlcmF0aW9uIik7Ci0gICAgICAgIGlmIChjc09QID09IEZYX0JTVFJDKCJQbGF5IikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjc09QID09IEZYX0JTVFJDKCJTdG9wIikpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjc09QID09IEZYX0JTVFJDKCJQYXVzZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3NPUCA9PSBGWF9CU1RSQygiUmVzdW1lIikpIHsKLSAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotRlhfRFdPUkQgQ1BERl9BY3Rpb246OkdldFN1YkFjdGlvbnNDb3VudCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCB8fCAhbV9wRGljdC0+S2V5RXhpc3QoIk5leHQiKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBOZXh0ID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJOZXh0Iik7Ci0gICAgaWYgKCFwTmV4dCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IGlPYmpUeXBlID0gcE5leHQtPkdldFR5cGUoKTsKLSAgICBpZiAoaU9ialR5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChpT2JqVHlwZSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuICgoQ1BERl9BcnJheSopcE5leHQpLT5HZXRDb3VudCgpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLUNQREZfQWN0aW9uIENQREZfQWN0aW9uOjpHZXRTdWJBY3Rpb24oRlhfRFdPUkQgaUluZGV4KSBjb25zdAotewotICAgIGlmIChtX3BEaWN0ID09IE5VTEwgfHwgIW1fcERpY3QtPktleUV4aXN0KCJOZXh0IikpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwTmV4dCA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiTmV4dCIpOwotICAgIGludCBpT2JqVHlwZSA9IHBOZXh0LT5HZXRUeXBlKCk7Ci0gICAgaWYgKGlPYmpUeXBlID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSAqcERpY3QgPSBzdGF0aWNfY2FzdDxDUERGX0RpY3Rpb25hcnkqPihwTmV4dCk7Ci0gICAgICAgIGlmIChpSW5kZXggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIENQREZfQWN0aW9uKHBEaWN0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaU9ialR5cGUgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHN0YXRpY19jYXN0PENQREZfQXJyYXkqPihwTmV4dCk7Ci0gICAgICAgIHJldHVybiBDUERGX0FjdGlvbihwQXJyYXktPkdldERpY3QoaUluZGV4KSk7Ci0gICAgfQotICAgIHJldHVybiBDUERGX0FjdGlvbigpOwotfQotY29uc3QgRlhfQ0hBUiogZ19zQUFUeXBlc1tdID0geyJFIiwgIlgiLCAiRCIsICJVIiwgIkZvIiwgIkJsIiwgIlBPIiwgIlBDIiwgIlBWIiwgIlBJIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTyIsICJDIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSyIsICJGIiwgIlYiLCAiQyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldDIiwgIldTIiwgIkRTIiwgIldQIiwgIkRQIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLUZYX0JPT0wgQ1BERl9BQWN0aW9uOjpBY3Rpb25FeGlzdChBQWN0aW9uVHlwZSBlVHlwZSkgY29uc3QKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcERpY3QtPktleUV4aXN0KGdfc0FBVHlwZXNbKGludCllVHlwZV0pOwotfQotQ1BERl9BY3Rpb24gQ1BERl9BQWN0aW9uOjpHZXRBY3Rpb24oQUFjdGlvblR5cGUgZVR5cGUpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BEaWN0KSB7Ci0gICAgICAgIHJldHVybiBDUERGX0FjdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4gQ1BERl9BY3Rpb24obV9wRGljdC0+R2V0RGljdChnX3NBQVR5cGVzWyhpbnQpZVR5cGVdKSk7Ci19Ci1GWF9QT1NJVElPTiBDUERGX0FBY3Rpb246OkdldFN0YXJ0UG9zKCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGljdC0+R2V0U3RhcnRQb3MoKTsKLX0KLUNQREZfQWN0aW9uIENQREZfQUFjdGlvbjo6R2V0TmV4dEFjdGlvbihGWF9QT1NJVElPTiYgcG9zLCBBQWN0aW9uVHlwZSYgZVR5cGUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NLZXk7Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BEaWN0LT5HZXROZXh0RWxlbWVudChwb3MsIGNzS2V5KTsKLSAgICBpZiAoIXBPYmopIHsKLSAgICAgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwRGlyZWN0ID0gcE9iai0+R2V0RGlyZWN0KCk7Ci0gICAgaWYgKCFwRGlyZWN0IHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKLSAgICB9Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChnX3NBQVR5cGVzW2ldWzBdICE9ICdcMCcpIHsKLSAgICAgICAgaWYgKGNzS2V5ID09IGdfc0FBVHlwZXNbaV0pIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGlmICghY3NUeXBlLklzRW1wdHkoKSkgeworICAgICAgaW50IGkgPSAwOworICAgICAgd2hpbGUgKGdfc0FUeXBlc1tpXVswXSAhPSAnXDAnKSB7CisgICAgICAgIGlmIChjc1R5cGUgPT0gZ19zQVR5cGVzW2ldKSB7CisgICAgICAgICAgcmV0dXJuIChBY3Rpb25UeXBlKWk7CiAgICAgICAgIH0KICAgICAgICAgaSsrOworICAgICAgfQogICAgIH0KLSAgICBlVHlwZSA9IChBQWN0aW9uVHlwZSlpOwotICAgIHJldHVybiBDUERGX0FjdGlvbihzdGF0aWNfY2FzdDxDUERGX0RpY3Rpb25hcnkqPihwRGlyZWN0KSk7CisgIH0KKyAgcmV0dXJuIGVUeXBlOwogfQotQ1BERl9Eb2NKU0FjdGlvbnM6OkNQREZfRG9jSlNBY3Rpb25zKENQREZfRG9jdW1lbnQqIHBEb2MpCi17Ci0gICAgbV9wRG9jdW1lbnQgPSBwRG9jOwotfQotaW50IENQREZfRG9jSlNBY3Rpb25zOjpDb3VudEpTQWN0aW9ucygpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotICAgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKG1fcERvY3VtZW50LCBGWF9CU1RSQygiSmF2YVNjcmlwdCIpKTsKLSAgICByZXR1cm4gbmFtZV90cmVlLkdldENvdW50KCk7Ci19Ci1DUERGX0FjdGlvbiBDUERGX0RvY0pTQWN0aW9uczo6R2V0SlNBY3Rpb24oaW50IGluZGV4LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdAotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLSAgICBDUERGX05hbWVUcmVlIG5hbWVfdHJlZShtX3BEb2N1bWVudCwgRlhfQlNUUkMoIkphdmFTY3JpcHQiKSk7Ci0gICAgQ1BERl9PYmplY3QgKnBBY3Rpb24gPSBuYW1lX3RyZWUuTG9va3VwVmFsdWUoaW5kZXgsIGNzTmFtZSk7Ci0gICAgaWYgKHBBY3Rpb24gPT0gTlVMTCB8fCBwQWN0aW9uLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7CitDRlhfV2lkZVN0cmluZyBDUERGX0FjdGlvbjo6R2V0RmlsZVBhdGgoKSBjb25zdCB7CisgIENGWF9CeXRlU3RyaW5nIHR5cGUgPSBtX3BEaWN0LT5HZXRTdHJpbmcoIlMiKTsKKyAgaWYgKHR5cGUgIT0gIkdvVG9SIiAmJiB0eXBlICE9ICJMYXVuY2giICYmIHR5cGUgIT0gIlN1Ym1pdEZvcm0iICYmCisgICAgICB0eXBlICE9ICJJbXBvcnREYXRhIikgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisgIENQREZfT2JqZWN0KiBwRmlsZSA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiRiIpOworICBDRlhfV2lkZVN0cmluZyBwYXRoOworICBpZiAocEZpbGUgPT0gTlVMTCkgeworICAgIGlmICh0eXBlID09ICJMYXVuY2giKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBXaW5EaWN0ID0gbV9wRGljdC0+R2V0RGljdChGWF9CU1RSQygiV2luIikpOworICAgICAgaWYgKHBXaW5EaWN0KSB7CisgICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBXaW5EaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkYiKSkpOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gQ1BERl9BY3Rpb24ocEFjdGlvbi0+R2V0RGljdCgpKTsKKyAgICByZXR1cm4gcGF0aDsKKyAgfQorICBDUERGX0ZpbGVTcGVjIGZpbGVzcGVjKHBGaWxlKTsKKyAgZmlsZXNwZWMuR2V0RmlsZU5hbWUocGF0aCk7CisgIHJldHVybiBwYXRoOwogfQotQ1BERl9BY3Rpb24gQ1BERl9Eb2NKU0FjdGlvbnM6OkdldEpTQWN0aW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotICAgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKG1fcERvY3VtZW50LCBGWF9CU1RSQygiSmF2YVNjcmlwdCIpKTsKLSAgICBDUERGX09iamVjdCAqcEFjdGlvbiA9IG5hbWVfdHJlZS5Mb29rdXBWYWx1ZShjc05hbWUpOwotICAgIGlmIChwQWN0aW9uID09IE5VTEwgfHwgcEFjdGlvbi0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHJldHVybiBDUERGX0FjdGlvbigpOworQ0ZYX0J5dGVTdHJpbmcgQ1BERl9BY3Rpb246OkdldFVSSShDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdCB7CisgIENGWF9CeXRlU3RyaW5nIGNzVVJJOworICBpZiAobV9wRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGNzVVJJOworICB9CisgIGlmIChtX3BEaWN0LT5HZXRTdHJpbmcoIlMiKSAhPSAiVVJJIikgeworICAgIHJldHVybiBjc1VSSTsKKyAgfQorICBjc1VSSSA9IG1fcERpY3QtPkdldFN0cmluZygiVVJJIik7CisgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CisgIENQREZfRGljdGlvbmFyeSogcFVSSSA9IHBSb290LT5HZXREaWN0KCJVUkkiKTsKKyAgaWYgKHBVUkkgIT0gTlVMTCkgeworICAgIGlmIChjc1VSSS5GaW5kKEZYX0JTVFJDKCI6IiksIDApIDwgMSkgeworICAgICAgY3NVUkkgPSBwVVJJLT5HZXRTdHJpbmcoIkJhc2UiKSArIGNzVVJJOwogICAgIH0KLSAgICByZXR1cm4gQ1BERl9BY3Rpb24ocEFjdGlvbi0+R2V0RGljdCgpKTsKKyAgfQorICByZXR1cm4gY3NVUkk7CiB9Ci1pbnQgQ1BERl9Eb2NKU0FjdGlvbnM6OkZpbmRKU0FjdGlvbihjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdAotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLSAgICBDUERGX05hbWVUcmVlIG5hbWVfdHJlZShtX3BEb2N1bWVudCwgRlhfQlNUUkMoIkphdmFTY3JpcHQiKSk7Ci0gICAgcmV0dXJuIG5hbWVfdHJlZS5HZXRJbmRleChjc05hbWUpOworRlhfRFdPUkQgQ1BERl9BY3Rpb25GaWVsZHM6OkdldEZpZWxkc0NvdW50KCkgY29uc3QgeworICBpZiAobV9wQWN0aW9uID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wQWN0aW9uLT5HZXREaWN0KCk7CisgIGlmIChwRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NUeXBlID0gcERpY3QtPkdldFN0cmluZygiUyIpOworICBDUERGX09iamVjdCogcEZpZWxkcyA9IE5VTEw7CisgIGlmIChjc1R5cGUgPT0gIkhpZGUiKSB7CisgICAgcEZpZWxkcyA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoIlQiKTsKKyAgfSBlbHNlIHsKKyAgICBwRmllbGRzID0gcERpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKKyAgfQorICBpZiAocEZpZWxkcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IGlUeXBlID0gcEZpZWxkcy0+R2V0VHlwZSgpOworICBpZiAoaVR5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoaVR5cGUgPT0gUERGT0JKX1NUUklORykgeworICAgIHJldHVybiAxOworICB9CisgIGlmIChpVHlwZSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICByZXR1cm4gKChDUERGX0FycmF5KilwRmllbGRzKS0+R2V0Q291bnQoKTsKKyAgfQorICByZXR1cm4gMDsKK30KK3ZvaWQgQ1BERl9BY3Rpb25GaWVsZHM6OkdldEFsbEZpZWxkcyhDRlhfUHRyQXJyYXkmIGZpZWxkT2JqZWN0cykgY29uc3QgeworICBmaWVsZE9iamVjdHMuUmVtb3ZlQWxsKCk7CisgIGlmIChtX3BBY3Rpb24gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wQWN0aW9uLT5HZXREaWN0KCk7CisgIGlmIChwRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IHBEaWN0LT5HZXRTdHJpbmcoIlMiKTsKKyAgQ1BERl9PYmplY3QqIHBGaWVsZHMgPSBOVUxMOworICBpZiAoY3NUeXBlID09ICJIaWRlIikgeworICAgIHBGaWVsZHMgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJUIik7CisgIH0gZWxzZSB7CisgICAgcEZpZWxkcyA9IHBEaWN0LT5HZXRBcnJheSgiRmllbGRzIik7CisgIH0KKyAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgaVR5cGUgPSBwRmllbGRzLT5HZXRUeXBlKCk7CisgIGlmIChpVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSB8fCBpVHlwZSA9PSBQREZPQkpfU1RSSU5HKSB7CisgICAgZmllbGRPYmplY3RzLkFkZChwRmllbGRzKTsKKyAgfSBlbHNlIGlmIChpVHlwZSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcEZpZWxkczsKKyAgICBGWF9EV09SRCBpQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOworICAgICAgaWYgKHBPYmogIT0gTlVMTCkgeworICAgICAgICBmaWVsZE9iamVjdHMuQWRkKHBPYmopOworICAgICAgfQorICAgIH0KKyAgfQorfQorQ1BERl9PYmplY3QqIENQREZfQWN0aW9uRmllbGRzOjpHZXRGaWVsZChGWF9EV09SRCBpSW5kZXgpIGNvbnN0IHsKKyAgaWYgKG1fcEFjdGlvbiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcEFjdGlvbi0+R2V0RGljdCgpOworICBpZiAocERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IHBEaWN0LT5HZXRTdHJpbmcoIlMiKTsKKyAgQ1BERl9PYmplY3QqIHBGaWVsZHMgPSBOVUxMOworICBpZiAoY3NUeXBlID09ICJIaWRlIikgeworICAgIHBGaWVsZHMgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJUIik7CisgIH0gZWxzZSB7CisgICAgcEZpZWxkcyA9IHBEaWN0LT5HZXRBcnJheSgiRmllbGRzIik7CisgIH0KKyAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfT2JqZWN0KiBwRmluZE9iaiA9IE5VTEw7CisgIGludCBpVHlwZSA9IHBGaWVsZHMtPkdldFR5cGUoKTsKKyAgaWYgKGlUeXBlID09IFBERk9CSl9ESUNUSU9OQVJZIHx8IGlUeXBlID09IFBERk9CSl9TVFJJTkcpIHsKKyAgICBpZiAoaUluZGV4ID09IDApIHsKKyAgICAgIHBGaW5kT2JqID0gcEZpZWxkczsKKyAgICB9CisgIH0gZWxzZSBpZiAoaVR5cGUgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgcEZpbmRPYmogPSAoKENQREZfQXJyYXkqKXBGaWVsZHMpLT5HZXRFbGVtZW50VmFsdWUoaUluZGV4KTsKKyAgfQorICByZXR1cm4gcEZpbmRPYmo7Cit9CitDUERGX0xXaW5QYXJhbSBDUERGX0FjdGlvbjo6R2V0V2luUGFyYW0oKSBjb25zdCB7CisgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAobV9wRGljdC0+R2V0U3RyaW5nKCJTIikgIT0gIkxhdW5jaCIpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gbV9wRGljdC0+R2V0RGljdCgiV2luIik7Cit9CitDRlhfV2lkZVN0cmluZyBDUERGX0FjdGlvbjo6R2V0SmF2YVNjcmlwdCgpIGNvbnN0IHsKKyAgQ0ZYX1dpZGVTdHJpbmcgY3NKUzsKKyAgaWYgKG1fcERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBjc0pTOworICB9CisgIENQREZfT2JqZWN0KiBwSlMgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkpTIik7CisgIGlmIChwSlMgIT0gTlVMTCkgeworICAgIHJldHVybiBwSlMtPkdldFVuaWNvZGVUZXh0KCk7CisgIH0KKyAgcmV0dXJuIGNzSlM7Cit9CitDUERGX0RpY3Rpb25hcnkqIENQREZfQWN0aW9uOjpHZXRBbm5vdCgpIGNvbnN0IHsKKyAgaWYgKCFtX3BEaWN0KSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NUeXBlID0gbV9wRGljdC0+R2V0U3RyaW5nKCJTIik7CisgIGlmIChjc1R5cGUgPT0gRlhfQlNUUkMoIlJlbmRpdGlvbiIpKSB7CisgICAgcmV0dXJuIG1fcERpY3QtPkdldERpY3QoIkFOIik7CisgIH0KKyAgaWYgKGNzVHlwZSA9PSBGWF9CU1RSQygiTW92aWUiKSkgeworICAgIHJldHVybiBtX3BEaWN0LT5HZXREaWN0KCJBbm5vdGF0aW9uIik7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CitpbnQzMl90IENQREZfQWN0aW9uOjpHZXRPcGVyYXRpb25UeXBlKCkgY29uc3QgeworICBpZiAobV9wRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NUeXBlID0gbV9wRGljdC0+R2V0U3RyaW5nKCJTIik7CisgIGlmIChjc1R5cGUgPT0gRlhfQlNUUkMoIlJlbmRpdGlvbiIpKSB7CisgICAgcmV0dXJuIG1fcERpY3QtPkdldEludGVnZXIoIk9QIik7CisgIH0KKyAgaWYgKGNzVHlwZSA9PSBGWF9CU1RSQygiTW92aWUiKSkgeworICAgIENGWF9CeXRlU3RyaW5nIGNzT1AgPSBtX3BEaWN0LT5HZXRTdHJpbmcoIk9wZXJhdGlvbiIpOworICAgIGlmIChjc09QID09IEZYX0JTVFJDKCJQbGF5IikpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoY3NPUCA9PSBGWF9CU1RSQygiU3RvcCIpKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGNzT1AgPT0gRlhfQlNUUkMoIlBhdXNlIikpIHsKKyAgICAgIHJldHVybiAyOworICAgIH0KKyAgICBpZiAoY3NPUCA9PSBGWF9CU1RSQygiUmVzdW1lIikpIHsKKyAgICAgIHJldHVybiAzOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KK0ZYX0RXT1JEIENQREZfQWN0aW9uOjpHZXRTdWJBY3Rpb25zQ291bnQoKSBjb25zdCB7CisgIGlmIChtX3BEaWN0ID09IE5VTEwgfHwgIW1fcERpY3QtPktleUV4aXN0KCJOZXh0IikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDUERGX09iamVjdCogcE5leHQgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIk5leHQiKTsKKyAgaWYgKCFwTmV4dCkgeworICAgIHJldHVybiAwOworICB9CisgIGludCBpT2JqVHlwZSA9IHBOZXh0LT5HZXRUeXBlKCk7CisgIGlmIChpT2JqVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIHJldHVybiAxOworICB9CisgIGlmIChpT2JqVHlwZSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICByZXR1cm4gKChDUERGX0FycmF5KilwTmV4dCktPkdldENvdW50KCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitDUERGX0FjdGlvbiBDUERGX0FjdGlvbjo6R2V0U3ViQWN0aW9uKEZYX0RXT1JEIGlJbmRleCkgY29uc3QgeworICBpZiAobV9wRGljdCA9PSBOVUxMIHx8ICFtX3BEaWN0LT5LZXlFeGlzdCgiTmV4dCIpKSB7CisgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBOZXh0ID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJOZXh0Iik7CisgIGludCBpT2JqVHlwZSA9IHBOZXh0LT5HZXRUeXBlKCk7CisgIGlmIChpT2JqVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBzdGF0aWNfY2FzdDxDUERGX0RpY3Rpb25hcnkqPihwTmV4dCk7CisgICAgaWYgKGlJbmRleCA9PSAwKSB7CisgICAgICByZXR1cm4gQ1BERl9BY3Rpb24ocERpY3QpOworICAgIH0KKyAgfSBlbHNlIGlmIChpT2JqVHlwZSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBzdGF0aWNfY2FzdDxDUERGX0FycmF5Kj4ocE5leHQpOworICAgIHJldHVybiBDUERGX0FjdGlvbihwQXJyYXktPkdldERpY3QoaUluZGV4KSk7CisgIH0KKyAgcmV0dXJuIENQREZfQWN0aW9uKCk7Cit9Citjb25zdCBGWF9DSEFSKiBnX3NBQVR5cGVzW10gPSB7IkUiLCAgIlgiLCAgIkQiLCAgIlUiLCAgIkZvIiwgIkJsIiwgIlBPIiwgIlBDIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFYiLCAiUEkiLCAiTyIsICAiQyIsICAiSyIsICAiRiIsICAiViIsICAiQyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldDIiwgIldTIiwgIkRTIiwgIldQIiwgIkRQIiwgIiJ9OworRlhfQk9PTCBDUERGX0FBY3Rpb246OkFjdGlvbkV4aXN0KEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdCB7CisgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIG1fcERpY3QtPktleUV4aXN0KGdfc0FBVHlwZXNbKGludCllVHlwZV0pOworfQorQ1BERl9BY3Rpb24gQ1BERl9BQWN0aW9uOjpHZXRBY3Rpb24oQUFjdGlvblR5cGUgZVR5cGUpIGNvbnN0IHsKKyAgaWYgKCFtX3BEaWN0KSB7CisgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7CisgIH0KKyAgcmV0dXJuIENQREZfQWN0aW9uKG1fcERpY3QtPkdldERpY3QoZ19zQUFUeXBlc1soaW50KWVUeXBlXSkpOworfQorRlhfUE9TSVRJT04gQ1BERl9BQWN0aW9uOjpHZXRTdGFydFBvcygpIGNvbnN0IHsKKyAgaWYgKG1fcERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBtX3BEaWN0LT5HZXRTdGFydFBvcygpOworfQorQ1BERl9BY3Rpb24gQ1BERl9BQWN0aW9uOjpHZXROZXh0QWN0aW9uKEZYX1BPU0lUSU9OJiBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFjdGlvblR5cGUmIGVUeXBlKSBjb25zdCB7CisgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc0tleTsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BEaWN0LT5HZXROZXh0RWxlbWVudChwb3MsIGNzS2V5KTsKKyAgaWYgKCFwT2JqKSB7CisgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsKKyAgaWYgKCFwRGlyZWN0IHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIHJldHVybiBDUERGX0FjdGlvbigpOworICB9CisgIGludCBpID0gMDsKKyAgd2hpbGUgKGdfc0FBVHlwZXNbaV1bMF0gIT0gJ1wwJykgeworICAgIGlmIChjc0tleSA9PSBnX3NBQVR5cGVzW2ldKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaSsrOworICB9CisgIGVUeXBlID0gKEFBY3Rpb25UeXBlKWk7CisgIHJldHVybiBDUERGX0FjdGlvbihzdGF0aWNfY2FzdDxDUERGX0RpY3Rpb25hcnkqPihwRGlyZWN0KSk7Cit9CitDUERGX0RvY0pTQWN0aW9uczo6Q1BERl9Eb2NKU0FjdGlvbnMoQ1BERl9Eb2N1bWVudCogcERvYykgeworICBtX3BEb2N1bWVudCA9IHBEb2M7Cit9CitpbnQgQ1BERl9Eb2NKU0FjdGlvbnM6OkNvdW50SlNBY3Rpb25zKCkgY29uc3QgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKG1fcERvY3VtZW50LCBGWF9CU1RSQygiSmF2YVNjcmlwdCIpKTsKKyAgcmV0dXJuIG5hbWVfdHJlZS5HZXRDb3VudCgpOworfQorQ1BERl9BY3Rpb24gQ1BERl9Eb2NKU0FjdGlvbnM6OkdldEpTQWN0aW9uKGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdCB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKyAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUobV9wRG9jdW1lbnQsIEZYX0JTVFJDKCJKYXZhU2NyaXB0IikpOworICBDUERGX09iamVjdCogcEFjdGlvbiA9IG5hbWVfdHJlZS5Mb29rdXBWYWx1ZShpbmRleCwgY3NOYW1lKTsKKyAgaWYgKHBBY3Rpb24gPT0gTlVMTCB8fCBwQWN0aW9uLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKKyAgfQorICByZXR1cm4gQ1BERl9BY3Rpb24ocEFjdGlvbi0+R2V0RGljdCgpKTsKK30KK0NQREZfQWN0aW9uIENQREZfRG9jSlNBY3Rpb25zOjpHZXRKU0FjdGlvbihjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdCB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKyAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUobV9wRG9jdW1lbnQsIEZYX0JTVFJDKCJKYXZhU2NyaXB0IikpOworICBDUERGX09iamVjdCogcEFjdGlvbiA9IG5hbWVfdHJlZS5Mb29rdXBWYWx1ZShjc05hbWUpOworICBpZiAocEFjdGlvbiA9PSBOVUxMIHx8IHBBY3Rpb24tPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIHJldHVybiBDUERGX0FjdGlvbigpOworICB9CisgIHJldHVybiBDUERGX0FjdGlvbihwQWN0aW9uLT5HZXREaWN0KCkpOworfQoraW50IENQREZfRG9jSlNBY3Rpb25zOjpGaW5kSlNBY3Rpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3QgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKG1fcERvY3VtZW50LCBGWF9CU1RSQygiSmF2YVNjcmlwdCIpKTsKKyAgcmV0dXJuIG5hbWVfdHJlZS5HZXRJbmRleChjc05hbWUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYW5ub3QuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYW5ub3QuY3BwCmluZGV4IGIyOWQwZjUuLmU5ZGY1ZTEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Fubm90LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19hbm5vdC5jcHAKQEAgLTgsMzY3ICs4LDM4MiBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKIAotQ1BERl9Bbm5vdExpc3Q6OkNQREZfQW5ub3RMaXN0KENQREZfUGFnZSogcFBhZ2UpCi17Ci0gICAgQVNTRVJUKHBQYWdlICE9IE5VTEwpOwotICAgIG1fcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwotICAgIGlmIChtX3BQYWdlRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK0NQREZfQW5ub3RMaXN0OjpDUERGX0Fubm90TGlzdChDUERGX1BhZ2UqIHBQYWdlKSB7CisgIEFTU0VSVChwUGFnZSAhPSBOVUxMKTsKKyAgbV9wUGFnZURpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7CisgIGlmIChtX3BQYWdlRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OworICBDUERGX0FycmF5KiBwQW5ub3RzID0gbV9wUGFnZURpY3QtPkdldEFycmF5KCJBbm5vdHMiKTsKKyAgaWYgKHBBbm5vdHMgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgRlhfQk9PTCBiUmVnZW5lcmF0ZUFQID0gcEFjcm9Gb3JtICYmIHBBY3JvRm9ybS0+R2V0Qm9vbGVhbigiTmVlZEFwcGVhcmFuY2VzIik7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQW5ub3RzLT5HZXRDb3VudCgpOyArK2kpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEFubm90cy0+R2V0RWxlbWVudFZhbHVlKGkpOworICAgIGlmIChwRGljdCA9PSBOVUxMIHx8IHBEaWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBtX3BEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKLSAgICBDUERGX0FycmF5KiBwQW5ub3RzID0gbV9wUGFnZURpY3QtPkdldEFycmF5KCJBbm5vdHMiKTsKLSAgICBpZiAocEFubm90cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBGWF9EV09SRCBkd09iak51bSA9IHBEaWN0LT5HZXRPYmpOdW0oKTsKKyAgICBpZiAoZHdPYmpOdW0gPT0gMCkgeworICAgICAgZHdPYmpOdW0gPSBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocERpY3QpOworICAgICAgQ1BERl9SZWZlcmVuY2UqIHBBY3Rpb24gPSBDUERGX1JlZmVyZW5jZTo6Q3JlYXRlKG1fcERvY3VtZW50LCBkd09iak51bSk7CisgICAgICBpZiAocEFjdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcEFubm90cy0+SW5zZXJ0QXQoaSwgcEFjdGlvbik7CisgICAgICBwQW5ub3RzLT5SZW1vdmVBdChpICsgMSk7CisgICAgICBwRGljdCA9IHBBbm5vdHMtPkdldERpY3QoaSk7CiAgICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwotICAgIENQREZfRGljdGlvbmFyeSogcEFjcm9Gb3JtID0gcFJvb3QtPkdldERpY3QoIkFjcm9Gb3JtIik7Ci0gICAgRlhfQk9PTCBiUmVnZW5lcmF0ZUFQID0gcEFjcm9Gb3JtICYmIHBBY3JvRm9ybS0+R2V0Qm9vbGVhbigiTmVlZEFwcGVhcmFuY2VzIik7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBbm5vdHMtPkdldENvdW50KCk7ICsraSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEFubm90cy0+R2V0RWxlbWVudFZhbHVlKGkpOwotICAgICAgICBpZiAocERpY3QgPT0gTlVMTCB8fCBwRGljdC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBkd09iak51bSA9IHBEaWN0LT5HZXRPYmpOdW0oKTsKLSAgICAgICAgaWYgKGR3T2JqTnVtID09IDApIHsKLSAgICAgICAgICAgIGR3T2JqTnVtID0gbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBEaWN0KTsKLSAgICAgICAgICAgIENQREZfUmVmZXJlbmNlKiBwQWN0aW9uID0gQ1BERl9SZWZlcmVuY2U6OkNyZWF0ZShtX3BEb2N1bWVudCwgZHdPYmpOdW0pOwotICAgICAgICAgICAgaWYgKHBBY3Rpb24gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFubm90cy0+SW5zZXJ0QXQoaSwgcEFjdGlvbik7Ci0gICAgICAgICAgICBwQW5ub3RzLT5SZW1vdmVBdChpICsgMSk7Ci0gICAgICAgICAgICBwRGljdCA9IHBBbm5vdHMtPkdldERpY3QoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9Bbm5vdCogcEFubm90ID0gbmV3IENQREZfQW5ub3QocERpY3QsIHRoaXMpOwotICAgICAgICBtX0Fubm90TGlzdC5BZGQocEFubm90KTsKLSAgICAgICAgaWYgKGJSZWdlbmVyYXRlQVAgJiYgcERpY3QtPkdldENvbnN0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpID09IEZYX0JTVFJDKCJXaWRnZXQiKSkKLSAgICAgICAgICAgIGlmIChDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIEZQREZfR2VuZXJhdGVBUChtX3BEb2N1bWVudCwgcERpY3QpOwotICAgICAgICAgICAgfQotICAgIH0KKyAgICBDUERGX0Fubm90KiBwQW5ub3QgPSBuZXcgQ1BERl9Bbm5vdChwRGljdCwgdGhpcyk7CisgICAgbV9Bbm5vdExpc3QuQWRkKHBBbm5vdCk7CisgICAgaWYgKGJSZWdlbmVyYXRlQVAgJiYKKyAgICAgICAgcERpY3QtPkdldENvbnN0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpID09IEZYX0JTVFJDKCJXaWRnZXQiKSkKKyAgICAgIGlmIChDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKSkgeworICAgICAgICBGUERGX0dlbmVyYXRlQVAobV9wRG9jdW1lbnQsIHBEaWN0KTsKKyAgICAgIH0KKyAgfQogfQotQ1BERl9Bbm5vdExpc3Q6On5DUERGX0Fubm90TGlzdCgpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX0Fubm90TGlzdC5HZXRTaXplKCk7ICsraSkgewotICAgICAgICBkZWxldGUgKENQREZfQW5ub3QqKW1fQW5ub3RMaXN0W2ldOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9Cb3JkZXJzLkdldFNpemUoKTsgKytpKSB7Ci0gICAgICAgIGRlbGV0ZSAoQ1BERl9QYWdlT2JqZWN0cyopbV9Cb3JkZXJzW2ldOwotICAgIH0KK0NQREZfQW5ub3RMaXN0Ojp+Q1BERl9Bbm5vdExpc3QoKSB7CisgIGludCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG1fQW5ub3RMaXN0LkdldFNpemUoKTsgKytpKSB7CisgICAgZGVsZXRlIChDUERGX0Fubm90KiltX0Fubm90TGlzdFtpXTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbV9Cb3JkZXJzLkdldFNpemUoKTsgKytpKSB7CisgICAgZGVsZXRlIChDUERGX1BhZ2VPYmplY3RzKiltX0JvcmRlcnNbaV07CisgIH0KIH0KLXZvaWQgQ1BERl9Bbm5vdExpc3Q6OkRpc3BsYXlQYXNzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBGWF9CT09MIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpZGdldFBhc3MsIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QqIGNsaXBfcmVjdCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fQW5ub3RMaXN0LkdldFNpemUoKTsgKytpKSB7Ci0gICAgICAgIENQREZfQW5ub3QqIHBBbm5vdCA9IChDUERGX0Fubm90KiltX0Fubm90TGlzdFtpXTsKLSAgICAgICAgRlhfQk9PTCBiV2lkZ2V0ID0gcEFubm90LT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCI7Ci0gICAgICAgIGlmICgoYldpZGdldFBhc3MgJiYgIWJXaWRnZXQpIHx8ICghYldpZGdldFBhc3MgJiYgYldpZGdldCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGFubm90X2ZsYWdzID0gcEFubm90LT5HZXRGbGFncygpOwotICAgICAgICBpZiAoYW5ub3RfZmxhZ3MgJiBBTk5PVEZMQUdfSElEREVOKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYlByaW50aW5nICYmIChhbm5vdF9mbGFncyAmIEFOTk9URkxBR19QUklOVCkgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiUHJpbnRpbmcgJiYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX05PVklFVykpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwT3B0aW9ucyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBJUERGX09DQ29udGV4dCogcE9DQ29udGV4dCA9IHBPcHRpb25zLT5tX3BPQ0NvbnRleHQ7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSBwQW5ub3QtPkdldEFubm90RGljdCgpOwotICAgICAgICAgICAgaWYgKHBPQ0NvbnRleHQgIT0gTlVMTCAmJiBwQW5ub3REaWN0ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgIXBPQ0NvbnRleHQtPkNoZWNrT0NHVmlzaWJsZShwQW5ub3REaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJPQyIpKSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDUERGX1JlY3QgYW5ub3RfcmVjdF9mOwotICAgICAgICBwQW5ub3QtPkdldFJlY3QoYW5ub3RfcmVjdF9mKTsKLSAgICAgICAgQ0ZYX01hdHJpeCBtYXRyaXg7Ci0gICAgICAgIG1hdHJpeCA9ICpwTWF0cml4OwotICAgICAgICBpZiAoY2xpcF9yZWN0KSB7Ci0gICAgICAgICAgICBhbm5vdF9yZWN0X2YuVHJhbnNmb3JtKCZtYXRyaXgpOwotICAgICAgICAgICAgRlhfUkVDVCBhbm5vdF9yZWN0ID0gYW5ub3RfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKLSAgICAgICAgICAgIGFubm90X3JlY3QuSW50ZXJzZWN0KCpjbGlwX3JlY3QpOwotICAgICAgICAgICAgaWYgKGFubm90X3JlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDb250ZXh0KSB7Ci0gICAgICAgICAgICBwQW5ub3QtPkRyYXdJbkNvbnRleHQocFBhZ2UsIHBDb250ZXh0LCAmbWF0cml4LCBDUERGX0Fubm90OjpOb3JtYWwpOwotICAgICAgICB9IGVsc2UgaWYgKCFwQW5ub3QtPkRyYXdBcHBlYXJhbmNlKHBQYWdlLCBwRGV2aWNlLCAmbWF0cml4LCBDUERGX0Fubm90OjpOb3JtYWwsIHBPcHRpb25zKSkgewotICAgICAgICAgICAgcEFubm90LT5EcmF3Qm9yZGVyKHBEZXZpY2UsICZtYXRyaXgsIHBPcHRpb25zKTsKLSAgICAgICAgfQordm9pZCBDUERGX0Fubm90TGlzdDo6RGlzcGxheVBhc3MoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lkZ2V0UGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUKiBjbGlwX3JlY3QpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0Fubm90TGlzdC5HZXRTaXplKCk7ICsraSkgeworICAgIENQREZfQW5ub3QqIHBBbm5vdCA9IChDUERGX0Fubm90KiltX0Fubm90TGlzdFtpXTsKKyAgICBGWF9CT09MIGJXaWRnZXQgPSBwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0IjsKKyAgICBpZiAoKGJXaWRnZXRQYXNzICYmICFiV2lkZ2V0KSB8fCAoIWJXaWRnZXRQYXNzICYmIGJXaWRnZXQpKSB7CisgICAgICBjb250aW51ZTsKICAgICB9CisgICAgRlhfRFdPUkQgYW5ub3RfZmxhZ3MgPSBwQW5ub3QtPkdldEZsYWdzKCk7CisgICAgaWYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX0hJRERFTikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChiUHJpbnRpbmcgJiYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX1BSSU5UKSA9PSAwKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFiUHJpbnRpbmcgJiYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX05PVklFVykpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAocE9wdGlvbnMgIT0gTlVMTCkgeworICAgICAgSVBERl9PQ0NvbnRleHQqIHBPQ0NvbnRleHQgPSBwT3B0aW9ucy0+bV9wT0NDb250ZXh0OworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0ID0gcEFubm90LT5HZXRBbm5vdERpY3QoKTsKKyAgICAgIGlmIChwT0NDb250ZXh0ICE9IE5VTEwgJiYgcEFubm90RGljdCAhPSBOVUxMICYmCisgICAgICAgICAgIXBPQ0NvbnRleHQtPkNoZWNrT0NHVmlzaWJsZShwQW5ub3REaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJPQyIpKSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIENQREZfUmVjdCBhbm5vdF9yZWN0X2Y7CisgICAgcEFubm90LT5HZXRSZWN0KGFubm90X3JlY3RfZik7CisgICAgQ0ZYX01hdHJpeCBtYXRyaXg7CisgICAgbWF0cml4ID0gKnBNYXRyaXg7CisgICAgaWYgKGNsaXBfcmVjdCkgeworICAgICAgYW5ub3RfcmVjdF9mLlRyYW5zZm9ybSgmbWF0cml4KTsKKyAgICAgIEZYX1JFQ1QgYW5ub3RfcmVjdCA9IGFubm90X3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CisgICAgICBhbm5vdF9yZWN0LkludGVyc2VjdCgqY2xpcF9yZWN0KTsKKyAgICAgIGlmIChhbm5vdF9yZWN0LklzRW1wdHkoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBDb250ZXh0KSB7CisgICAgICBwQW5ub3QtPkRyYXdJbkNvbnRleHQocFBhZ2UsIHBDb250ZXh0LCAmbWF0cml4LCBDUERGX0Fubm90OjpOb3JtYWwpOworICAgIH0gZWxzZSBpZiAoIXBBbm5vdC0+RHJhd0FwcGVhcmFuY2UocFBhZ2UsIHBEZXZpY2UsICZtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpOb3JtYWwsIHBPcHRpb25zKSkgeworICAgICAgcEFubm90LT5EcmF3Qm9yZGVyKHBEZXZpY2UsICZtYXRyaXgsIHBPcHRpb25zKTsKKyAgICB9CisgIH0KIH0KLXZvaWQgQ1BERl9Bbm5vdExpc3Q6OkRpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKK3ZvaWQgQ1BERl9Bbm5vdExpc3Q6OkRpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaG93V2lkZ2V0LCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQotewotICAgIEZYX1JFQ1QgY2xpcF9yZWN0OwotICAgIGlmIChwRGV2aWNlKSB7Ci0gICAgICAgIGNsaXBfcmVjdCA9IHBEZXZpY2UtPkdldENsaXBCb3goKTsKLSAgICB9Ci0gICAgRlhfQk9PTCBiUHJpbnRpbmcgPSBwRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpID09IEZYRENfUFJJTlRFUiB8fCAocE9wdGlvbnMgJiYgKHBPcHRpb25zLT5tX0ZsYWdzICYgUkVOREVSX1BSSU5UUFJFVklFVykpOwotICAgIERpc3BsYXlBbm5vdHMocFBhZ2UsIHBEZXZpY2UsIE5VTEwsIGJQcmludGluZywgcFVzZXIyRGV2aWNlLCBiU2hvd1dpZGdldCA/IDMgOiAxLCBwT3B0aW9ucywgJmNsaXBfcmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNob3dXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHsKKyAgRlhfUkVDVCBjbGlwX3JlY3Q7CisgIGlmIChwRGV2aWNlKSB7CisgICAgY2xpcF9yZWN0ID0gcERldmljZS0+R2V0Q2xpcEJveCgpOworICB9CisgIEZYX0JPT0wgYlByaW50aW5nID0gcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSA9PSBGWERDX1BSSU5URVIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAocE9wdGlvbnMgJiYgKHBPcHRpb25zLT5tX0ZsYWdzICYgUkVOREVSX1BSSU5UUFJFVklFVykpOworICBEaXNwbGF5QW5ub3RzKHBQYWdlLCBwRGV2aWNlLCBOVUxMLCBiUHJpbnRpbmcsIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICBiU2hvd1dpZGdldCA/IDMgOiAxLCBwT3B0aW9ucywgJmNsaXBfcmVjdCk7CiB9Ci12b2lkIENQREZfQW5ub3RMaXN0OjpEaXNwbGF5QW5ub3RzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByaW50aW5nLCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsIEZYX0RXT1JEIGR3QW5ub3RGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgRlhfUkVDVCogcENsaXBSZWN0KQotewotICAgIGlmIChkd0Fubm90RmxhZ3MgJiAweDAxKSB7Ci0gICAgICAgIERpc3BsYXlQYXNzKHBQYWdlLCBwRGV2aWNlLCBwQ29udGV4dCwgYlByaW50aW5nLCBwVXNlcjJEZXZpY2UsIEZBTFNFLCBwT3B0aW9ucywgcENsaXBSZWN0KTsKLSAgICB9Ci0gICAgaWYgKGR3QW5ub3RGbGFncyAmIDB4MDIpIHsKLSAgICAgICAgRGlzcGxheVBhc3MocFBhZ2UsIHBEZXZpY2UsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBVc2VyMkRldmljZSwgVFJVRSwgcE9wdGlvbnMsIHBDbGlwUmVjdCk7Ci0gICAgfQordm9pZCBDUERGX0Fubm90TGlzdDo6RGlzcGxheUFubm90cyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmludGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0Fubm90RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBDbGlwUmVjdCkgeworICBpZiAoZHdBbm5vdEZsYWdzICYgMHgwMSkgeworICAgIERpc3BsYXlQYXNzKHBQYWdlLCBwRGV2aWNlLCBwQ29udGV4dCwgYlByaW50aW5nLCBwVXNlcjJEZXZpY2UsIEZBTFNFLAorICAgICAgICAgICAgICAgIHBPcHRpb25zLCBwQ2xpcFJlY3QpOworICB9CisgIGlmIChkd0Fubm90RmxhZ3MgJiAweDAyKSB7CisgICAgRGlzcGxheVBhc3MocFBhZ2UsIHBEZXZpY2UsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBVc2VyMkRldmljZSwgVFJVRSwKKyAgICAgICAgICAgICAgICBwT3B0aW9ucywgcENsaXBSZWN0KTsKKyAgfQogfQotaW50IENQREZfQW5ub3RMaXN0OjpHZXRJbmRleChDUERGX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0Fubm90TGlzdC5HZXRTaXplKCk7ICsraSkKLSAgICAgICAgaWYgKG1fQW5ub3RMaXN0W2ldID09ICh2b2lkKilwQW5ub3QpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgcmV0dXJuIC0xOworaW50IENQREZfQW5ub3RMaXN0OjpHZXRJbmRleChDUERGX0Fubm90KiBwQW5ub3QpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0Fubm90TGlzdC5HZXRTaXplKCk7ICsraSkKKyAgICBpZiAobV9Bbm5vdExpc3RbaV0gPT0gKHZvaWQqKXBBbm5vdCkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICByZXR1cm4gLTE7CiB9CiBDUERGX0Fubm90OjpDUERGX0Fubm90KENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfQW5ub3RMaXN0KiBwTGlzdCkKICAgICA6IG1fcEFubm90RGljdChwRGljdCksCiAgICAgICBtX3BMaXN0KHBMaXN0KSwKLSAgICAgIG1fc1N1YnR5cGUobV9wQW5ub3REaWN0LT5HZXRDb25zdFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKSkKLXsKKyAgICAgIG1fc1N1YnR5cGUobV9wQW5ub3REaWN0LT5HZXRDb25zdFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKSkge30KK0NQREZfQW5ub3Q6On5DUERGX0Fubm90KCkgeworICBDbGVhckNhY2hlZEFQKCk7CiB9Ci1DUERGX0Fubm90Ojp+Q1BERl9Bbm5vdCgpCi17Ci0gICAgQ2xlYXJDYWNoZWRBUCgpOwordm9pZCBDUERGX0Fubm90OjpDbGVhckNhY2hlZEFQKCkgeworICBGWF9QT1NJVElPTiBwb3MgPSBtX0FQTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIHZvaWQqIHBGb3JtOworICAgIHZvaWQqIHBPYmplY3RzOworICAgIG1fQVBNYXAuR2V0TmV4dEFzc29jKHBvcywgcEZvcm0sIHBPYmplY3RzKTsKKyAgICBkZWxldGUgKENQREZfUGFnZU9iamVjdHMqKXBPYmplY3RzOworICB9CisgIG1fQVBNYXAuUmVtb3ZlQWxsKCk7CiB9Ci12b2lkIENQREZfQW5ub3Q6OkNsZWFyQ2FjaGVkQVAoKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fQVBNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgdm9pZCogcEZvcm07Ci0gICAgICAgIHZvaWQqIHBPYmplY3RzOwotICAgICAgICBtX0FQTWFwLkdldE5leHRBc3NvYyhwb3MsIHBGb3JtLCBwT2JqZWN0cyk7Ci0gICAgICAgIGRlbGV0ZSAoQ1BERl9QYWdlT2JqZWN0cyopcE9iamVjdHM7Ci0gICAgfQotICAgIG1fQVBNYXAuUmVtb3ZlQWxsKCk7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0Fubm90OjpHZXRTdWJUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zU3VidHlwZTsKK0NGWF9CeXRlU3RyaW5nIENQREZfQW5ub3Q6OkdldFN1YlR5cGUoKSBjb25zdCB7CisgIHJldHVybiBtX3NTdWJ0eXBlOwogfQogCi12b2lkIENQREZfQW5ub3Q6OkdldFJlY3QoQ1BERl9SZWN0JiByZWN0KSBjb25zdAotewotICAgIGlmIChtX3BBbm5vdERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlY3QgPSBtX3BBbm5vdERpY3QtPkdldFJlY3QoIlJlY3QiKTsKLSAgICByZWN0Lk5vcm1hbGl6ZSgpOwordm9pZCBDUERGX0Fubm90OjpHZXRSZWN0KENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICBpZiAobV9wQW5ub3REaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgcmVjdCA9IG1fcEFubm90RGljdC0+R2V0UmVjdCgiUmVjdCIpOworICByZWN0Lk5vcm1hbGl6ZSgpOwogfQogCi1GWF9EV09SRCBDUERGX0Fubm90OjpHZXRGbGFncygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcEFubm90RGljdC0+R2V0SW50ZWdlcigiRiIpOworRlhfRFdPUkQgQ1BERl9Bbm5vdDo6R2V0RmxhZ3MoKSBjb25zdCB7CisgIHJldHVybiBtX3BBbm5vdERpY3QtPkdldEludGVnZXIoIkYiKTsKIH0KIAotQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0Fubm90OjpHZXRBbm5vdERpY3QoKQotewotICAgIHJldHVybiBtX3BBbm5vdERpY3Q7CitDUERGX0RpY3Rpb25hcnkqIENQREZfQW5ub3Q6OkdldEFubm90RGljdCgpIHsKKyAgcmV0dXJuIG1fcEFubm90RGljdDsKIH0KIAotQ1BERl9TdHJlYW0qIEZQREZET0NfR2V0QW5ub3RBUChDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBwQW5ub3REaWN0LT5HZXREaWN0KCJBUCIpOwotICAgIGlmIChwQVAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKK0NQREZfU3RyZWFtKiBGUERGRE9DX0dldEFubm90QVAoQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKSB7CisgIENQREZfRGljdGlvbmFyeSogcEFQID0gcEFubm90RGljdC0+R2V0RGljdCgiQVAiKTsKKyAgaWYgKHBBUCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY29uc3QgRlhfQ0hBUiogYXBfZW50cnkgPSAiTiI7CisgIGlmIChtb2RlID09IENQREZfQW5ub3Q6OkRvd24pIHsKKyAgICBhcF9lbnRyeSA9ICJEIjsKKyAgfSBlbHNlIGlmIChtb2RlID09IENQREZfQW5ub3Q6OlJvbGxvdmVyKSB7CisgICAgYXBfZW50cnkgPSAiUiI7CisgIH0KKyAgaWYgKCFwQVAtPktleUV4aXN0KGFwX2VudHJ5KSkgeworICAgIGFwX2VudHJ5ID0gIk4iOworICB9CisgIENQREZfT2JqZWN0KiBwc3ViID0gcEFQLT5HZXRFbGVtZW50VmFsdWUoYXBfZW50cnkpOworICBpZiAocHN1YiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBOVUxMOworICBpZiAocHN1Yi0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKKyAgICBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwc3ViOworICB9IGVsc2UgaWYgKHBzdWItPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIENGWF9CeXRlU3RyaW5nIGFzID0gcEFubm90RGljdC0+R2V0U3RyaW5nKCJBUyIpOworICAgIGlmIChhcy5Jc0VtcHR5KCkpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHZhbHVlID0gcEFubm90RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJWIikpOworICAgICAgaWYgKHZhbHVlLklzRW1wdHkoKSkgeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEFubm90RGljdC0+R2V0RGljdChGWF9CU1RSQygiUGFyZW50IikpOworICAgICAgICB2YWx1ZSA9IHBEaWN0ID8gcERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiViIpKSA6IENGWF9CeXRlU3RyaW5nKCk7CisgICAgICB9CisgICAgICBpZiAodmFsdWUuSXNFbXB0eSgpIHx8ICEoKENQREZfRGljdGlvbmFyeSopcHN1YiktPktleUV4aXN0KHZhbHVlKSkgeworICAgICAgICBhcyA9IEZYX0JTVFJDKCJPZmYiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzID0gdmFsdWU7CisgICAgICB9CiAgICAgfQotICAgIGNvbnN0IEZYX0NIQVIqIGFwX2VudHJ5ID0gIk4iOwotICAgIGlmIChtb2RlID09IENQREZfQW5ub3Q6OkRvd24pIHsKLSAgICAgICAgYXBfZW50cnkgPSAiRCI7Ci0gICAgfSBlbHNlIGlmIChtb2RlID09IENQREZfQW5ub3Q6OlJvbGxvdmVyKSB7Ci0gICAgICAgIGFwX2VudHJ5ID0gIlIiOwotICAgIH0KLSAgICBpZiAoIXBBUC0+S2V5RXhpc3QoYXBfZW50cnkpKSB7Ci0gICAgICAgIGFwX2VudHJ5ID0gIk4iOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcHN1YiA9IHBBUC0+R2V0RWxlbWVudFZhbHVlKGFwX2VudHJ5KTsKLSAgICBpZiAocHN1YiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IE5VTEw7Ci0gICAgaWYgKHBzdWItPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHBTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBzdWI7Ci0gICAgfSBlbHNlIGlmIChwc3ViLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYXMgPSBwQW5ub3REaWN0LT5HZXRTdHJpbmcoIkFTIik7Ci0gICAgICAgIGlmIChhcy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHZhbHVlID0gcEFubm90RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJWIikpOwotICAgICAgICAgICAgaWYgKHZhbHVlLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJQYXJlbnQiKSk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBwRGljdCA/IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlYiKSkgOiBDRlhfQnl0ZVN0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlLklzRW1wdHkoKSB8fCAhKChDUERGX0RpY3Rpb25hcnkqKXBzdWIpLT5LZXlFeGlzdCh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBhcyA9IEZYX0JTVFJDKCJPZmYiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXMgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwU3RyZWFtID0gKChDUERGX0RpY3Rpb25hcnkqKXBzdWIpLT5HZXRTdHJlYW0oYXMpOwotICAgIH0KLSAgICByZXR1cm4gcFN0cmVhbTsKKyAgICBwU3RyZWFtID0gKChDUERGX0RpY3Rpb25hcnkqKXBzdWIpLT5HZXRTdHJlYW0oYXMpOworICB9CisgIHJldHVybiBwU3RyZWFtOwogfQotQ1BERl9Gb3JtKiBDUERGX0Fubm90OjpHZXRBUEZvcm0oY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQXBwZWFyYW5jZU1vZGUgbW9kZSkKLXsKLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IEZQREZET0NfR2V0QW5ub3RBUChtX3BBbm5vdERpY3QsIG1vZGUpOwotICAgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRm9ybSogcEZvcm07Ci0gICAgaWYgKG1fQVBNYXAuTG9va3VwKHBTdHJlYW0sICh2b2lkKiYpcEZvcm0pKSB7Ci0gICAgICAgIHJldHVybiBwRm9ybTsKLSAgICB9Ci0gICAgcEZvcm0gPSBGWF9ORVcgQ1BERl9Gb3JtKG1fcExpc3QtPm1fcERvY3VtZW50LCBwUGFnZS0+bV9wUmVzb3VyY2VzLCBwU3RyZWFtKTsKLSAgICBpZiAocEZvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcEZvcm0tPlBhcnNlQ29udGVudChOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICBtX0FQTWFwLlNldEF0KHBTdHJlYW0sIHBGb3JtKTsKK0NQREZfRm9ybSogQ1BERl9Bbm5vdDo6R2V0QVBGb3JtKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIEFwcGVhcmFuY2VNb2RlIG1vZGUpIHsKKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBGUERGRE9DX0dldEFubm90QVAobV9wQW5ub3REaWN0LCBtb2RlKTsKKyAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRm9ybSogcEZvcm07CisgIGlmIChtX0FQTWFwLkxvb2t1cChwU3RyZWFtLCAodm9pZComKXBGb3JtKSkgewogICAgIHJldHVybiBwRm9ybTsKKyAgfQorICBwRm9ybSA9IEZYX05FVyBDUERGX0Zvcm0obV9wTGlzdC0+bV9wRG9jdW1lbnQsIHBQYWdlLT5tX3BSZXNvdXJjZXMsIHBTdHJlYW0pOworICBpZiAocEZvcm0gPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHBGb3JtLT5QYXJzZUNvbnRlbnQoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIG1fQVBNYXAuU2V0QXQocFN0cmVhbSwgcEZvcm0pOworICByZXR1cm4gcEZvcm07CiB9Ci1zdGF0aWMgQ1BERl9Gb3JtKiBGUERGRE9DX0Fubm90X0dldE1hdHJpeChjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDUERGX0Fubm90KiBwQW5ub3QsIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgQ0ZYX01hdHJpeCAmbWF0cml4KQotewotICAgIENQREZfRm9ybSogcEZvcm0gPSBwQW5ub3QtPkdldEFQRm9ybShwUGFnZSwgbW9kZSk7Ci0gICAgaWYgKCFwRm9ybSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBmb3JtX2Jib3ggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldFJlY3QoRlhfQlNUUkMoIkJCb3giKSk7Ci0gICAgQ0ZYX01hdHJpeCBmb3JtX21hdHJpeCA9IHBGb3JtLT5tX3BGb3JtRGljdC0+R2V0TWF0cml4KEZYX0JTVFJDKCJNYXRyaXgiKSk7Ci0gICAgZm9ybV9tYXRyaXguVHJhbnNmb3JtUmVjdChmb3JtX2Jib3gpOwotICAgIENQREZfUmVjdCBhcmVjdDsKLSAgICBwQW5ub3QtPkdldFJlY3QoYXJlY3QpOwotICAgIG1hdHJpeC5NYXRjaFJlY3QoYXJlY3QsIGZvcm1fYmJveCk7Ci0gICAgbWF0cml4LkNvbmNhdCgqcFVzZXIyRGV2aWNlKTsKLSAgICByZXR1cm4gcEZvcm07CitzdGF0aWMgQ1BERl9Gb3JtKiBGUERGRE9DX0Fubm90X0dldE1hdHJpeChjb25zdCBDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBDUERGX0Zvcm0qIHBGb3JtID0gcEFubm90LT5HZXRBUEZvcm0ocFBhZ2UsIG1vZGUpOworICBpZiAoIXBGb3JtKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCBmb3JtX2Jib3ggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldFJlY3QoRlhfQlNUUkMoIkJCb3giKSk7CisgIENGWF9NYXRyaXggZm9ybV9tYXRyaXggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldE1hdHJpeChGWF9CU1RSQygiTWF0cml4IikpOworICBmb3JtX21hdHJpeC5UcmFuc2Zvcm1SZWN0KGZvcm1fYmJveCk7CisgIENQREZfUmVjdCBhcmVjdDsKKyAgcEFubm90LT5HZXRSZWN0KGFyZWN0KTsKKyAgbWF0cml4Lk1hdGNoUmVjdChhcmVjdCwgZm9ybV9iYm94KTsKKyAgbWF0cml4LkNvbmNhdCgqcFVzZXIyRGV2aWNlKTsKKyAgcmV0dXJuIHBGb3JtOwogfQotRlhfQk9PTCBDUERGX0Fubm90OjpEcmF3QXBwZWFyYW5jZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCi17Ci0gICAgQ0ZYX01hdHJpeCBtYXRyaXg7Ci0gICAgQ1BERl9Gb3JtKiBwRm9ybSA9IEZQREZET0NfQW5ub3RfR2V0TWF0cml4KHBQYWdlLCB0aGlzLCBtb2RlLCBwVXNlcjJEZXZpY2UsIG1hdHJpeCk7Ci0gICAgaWYgKCFwRm9ybSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfUmVuZGVyQ29udGV4dCBjb250ZXh0OwotICAgIGNvbnRleHQuQ3JlYXRlKChDUERGX1BhZ2UqKXBQYWdlKTsKLSAgICBjb250ZXh0LkRyYXdPYmplY3RMaXN0KHBEZXZpY2UsIHBGb3JtLCAmbWF0cml4LCBwT3B0aW9ucyk7Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQREZfQW5ub3Q6OkRyYXdBcHBlYXJhbmNlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZWFyYW5jZU1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworICBDRlhfTWF0cml4IG1hdHJpeDsKKyAgQ1BERl9Gb3JtKiBwRm9ybSA9CisgICAgICBGUERGRE9DX0Fubm90X0dldE1hdHJpeChwUGFnZSwgdGhpcywgbW9kZSwgcFVzZXIyRGV2aWNlLCBtYXRyaXgpOworICBpZiAoIXBGb3JtKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfUmVuZGVyQ29udGV4dCBjb250ZXh0OworICBjb250ZXh0LkNyZWF0ZSgoQ1BERl9QYWdlKilwUGFnZSk7CisgIGNvbnRleHQuRHJhd09iamVjdExpc3QocERldmljZSwgcEZvcm0sICZtYXRyaXgsIHBPcHRpb25zKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfQW5ub3Q6OkRyYXdJbkNvbnRleHQoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgY29uc3QgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBBcHBlYXJhbmNlTW9kZSBtb2RlKQotewotICAgIENGWF9NYXRyaXggbWF0cml4OwotICAgIENQREZfRm9ybSogcEZvcm0gPSBGUERGRE9DX0Fubm90X0dldE1hdHJpeChwUGFnZSwgdGhpcywgbW9kZSwgcFVzZXIyRGV2aWNlLCBtYXRyaXgpOwotICAgIGlmICghcEZvcm0pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICAoKENQREZfUmVuZGVyQ29udGV4dCopcENvbnRleHQpLT5BcHBlbmRPYmplY3RMaXN0KHBGb3JtLCAmbWF0cml4KTsKLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BERl9Bbm5vdDo6RHJhd0luQ29udGV4dChjb25zdCBDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVhcmFuY2VNb2RlIG1vZGUpIHsKKyAgQ0ZYX01hdHJpeCBtYXRyaXg7CisgIENQREZfRm9ybSogcEZvcm0gPQorICAgICAgRlBERkRPQ19Bbm5vdF9HZXRNYXRyaXgocFBhZ2UsIHRoaXMsIG1vZGUsIHBVc2VyMkRldmljZSwgbWF0cml4KTsKKyAgaWYgKCFwRm9ybSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAoKENQREZfUmVuZGVyQ29udGV4dCopcENvbnRleHQpLT5BcHBlbmRPYmplY3RMaXN0KHBGb3JtLCAmbWF0cml4KTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENQREZfQW5ub3Q6OkRyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQotewotICAgIGlmIChHZXRTdWJUeXBlKCkgPT0gIlBvcHVwIikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0RXT1JEIGFubm90X2ZsYWdzID0gR2V0RmxhZ3MoKTsKLSAgICBpZiAoYW5ub3RfZmxhZ3MgJiBBTk5PVEZMQUdfSElEREVOKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfQk9PTCBiUHJpbnRpbmcgPSBwRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpID09IEZYRENfUFJJTlRFUiB8fCAocE9wdGlvbnMgJiYgKHBPcHRpb25zLT5tX0ZsYWdzICYgUkVOREVSX1BSSU5UUFJFVklFVykpOwotICAgIGlmIChiUHJpbnRpbmcgJiYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX1BSSU5UKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFiUHJpbnRpbmcgJiYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX05PVklFVykpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBCUyA9IG1fcEFubm90RGljdC0+R2V0RGljdCgiQlMiKTsKLSAgICBjaGFyIHN0eWxlX2NoYXI7Ci0gICAgRlhfRkxPQVQgd2lkdGg7Ci0gICAgQ1BERl9BcnJheSogcERhc2hBcnJheSA9IE5VTEw7Ci0gICAgaWYgKHBCUyA9PSBOVUxMKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBCb3JkZXJBcnJheSA9IG1fcEFubm90RGljdC0+R2V0QXJyYXkoIkJvcmRlciIpOwotICAgICAgICBzdHlsZV9jaGFyID0gJ1MnOwotICAgICAgICBpZiAocEJvcmRlckFycmF5KSB7Ci0gICAgICAgICAgICB3aWR0aCA9IHBCb3JkZXJBcnJheS0+R2V0TnVtYmVyKDIpOwotICAgICAgICAgICAgaWYgKHBCb3JkZXJBcnJheS0+R2V0Q291bnQoKSA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgcERhc2hBcnJheSA9IHBCb3JkZXJBcnJheS0+R2V0QXJyYXkoMyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBEYXNoQXJyYXkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBuTGVuID0gcERhc2hBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yICg7IGkgPCBuTGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqcE9iaiA9IHBEYXNoQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBPYmogJiYgcE9iai0+R2V0SW50ZWdlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBuTGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3R5bGVfY2hhciA9ICdEJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdpZHRoID0gMTsKK3ZvaWQgQ1BERl9Bbm5vdDo6RHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKSB7CisgIGlmIChHZXRTdWJUeXBlKCkgPT0gIlBvcHVwIikgeworICAgIHJldHVybjsKKyAgfQorICBGWF9EV09SRCBhbm5vdF9mbGFncyA9IEdldEZsYWdzKCk7CisgIGlmIChhbm5vdF9mbGFncyAmIEFOTk9URkxBR19ISURERU4pIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfQk9PTCBiUHJpbnRpbmcgPSBwRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpID09IEZYRENfUFJJTlRFUiB8fAorICAgICAgICAgICAgICAgICAgICAgIChwT3B0aW9ucyAmJiAocE9wdGlvbnMtPm1fRmxhZ3MgJiBSRU5ERVJfUFJJTlRQUkVWSUVXKSk7CisgIGlmIChiUHJpbnRpbmcgJiYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX1BSSU5UKSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghYlByaW50aW5nICYmIChhbm5vdF9mbGFncyAmIEFOTk9URkxBR19OT1ZJRVcpKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEJTID0gbV9wQW5ub3REaWN0LT5HZXREaWN0KCJCUyIpOworICBjaGFyIHN0eWxlX2NoYXI7CisgIEZYX0ZMT0FUIHdpZHRoOworICBDUERGX0FycmF5KiBwRGFzaEFycmF5ID0gTlVMTDsKKyAgaWYgKHBCUyA9PSBOVUxMKSB7CisgICAgQ1BERl9BcnJheSogcEJvcmRlckFycmF5ID0gbV9wQW5ub3REaWN0LT5HZXRBcnJheSgiQm9yZGVyIik7CisgICAgc3R5bGVfY2hhciA9ICdTJzsKKyAgICBpZiAocEJvcmRlckFycmF5KSB7CisgICAgICB3aWR0aCA9IHBCb3JkZXJBcnJheS0+R2V0TnVtYmVyKDIpOworICAgICAgaWYgKHBCb3JkZXJBcnJheS0+R2V0Q291bnQoKSA9PSA0KSB7CisgICAgICAgIHBEYXNoQXJyYXkgPSBwQm9yZGVyQXJyYXktPkdldEFycmF5KDMpOworICAgICAgICBpZiAocERhc2hBcnJheSA9PSBOVUxMKSB7CisgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIGludCBuTGVuID0gcERhc2hBcnJheS0+R2V0Q291bnQoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKDsgaSA8IG5MZW47ICsraSkgeworICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcERhc2hBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOworICAgICAgICAgIGlmIChwT2JqICYmIHBPYmotPkdldEludGVnZXIoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID09IG5MZW4pIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3R5bGVfY2hhciA9ICdEJzsKKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHlsZSA9IHBCUy0+R2V0U3RyaW5nKCJTIik7Ci0gICAgICAgIHBEYXNoQXJyYXkgPSBwQlMtPkdldEFycmF5KCJEIik7Ci0gICAgICAgIHN0eWxlX2NoYXIgPSBzdHlsZVsxXTsKLSAgICAgICAgd2lkdGggPSBwQlMtPkdldE51bWJlcigiVyIpOworICAgICAgd2lkdGggPSAxOwogICAgIH0KLSAgICBpZiAod2lkdGggPD0gMCkgewotICAgICAgICByZXR1cm47CisgIH0gZWxzZSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3R5bGUgPSBwQlMtPkdldFN0cmluZygiUyIpOworICAgIHBEYXNoQXJyYXkgPSBwQlMtPkdldEFycmF5KCJEIik7CisgICAgc3R5bGVfY2hhciA9IHN0eWxlWzFdOworICAgIHdpZHRoID0gcEJTLT5HZXROdW1iZXIoIlciKTsKKyAgfQorICBpZiAod2lkdGggPD0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0FycmF5KiBwQ29sb3IgPSBtX3BBbm5vdERpY3QtPkdldEFycmF5KCJDIik7CisgIEZYX0RXT1JEIGFyZ2IgPSAweGZmMDAwMDAwOworICBpZiAocENvbG9yICE9IE5VTEwpIHsKKyAgICBpbnQgUiA9IChpbnQzMl90KShwQ29sb3ItPkdldE51bWJlcigwKSAqIDI1NSk7CisgICAgaW50IEcgPSAoaW50MzJfdCkocENvbG9yLT5HZXROdW1iZXIoMSkgKiAyNTUpOworICAgIGludCBCID0gKGludDMyX3QpKHBDb2xvci0+R2V0TnVtYmVyKDIpICogMjU1KTsKKyAgICBhcmdiID0gQXJnYkVuY29kZSgweGZmLCBSLCBHLCBCKTsKKyAgfQorICBDUERGX0dyYXBoU3RhdGVEYXRhIGdyYXBoX3N0YXRlOworICBncmFwaF9zdGF0ZS5tX0xpbmVXaWR0aCA9IHdpZHRoOworICBpZiAoc3R5bGVfY2hhciA9PSAnRCcpIHsKKyAgICBpZiAocERhc2hBcnJheSkgeworICAgICAgRlhfRFdPUkQgZGFzaF9jb3VudCA9IHBEYXNoQXJyYXktPkdldENvdW50KCk7CisgICAgICBpZiAoZGFzaF9jb3VudCAlIDIpIHsKKyAgICAgICAgZGFzaF9jb3VudCsrOworICAgICAgfQorICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQXJyYXkgPSBGWF9BbGxvYyhGWF9GTE9BVCwgZGFzaF9jb3VudCk7CisgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hDb3VudCA9IGRhc2hfY291bnQ7CisgICAgICBGWF9EV09SRCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IHBEYXNoQXJyYXktPkdldENvdW50KCk7ICsraSkgeworICAgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheVtpXSA9IHBEYXNoQXJyYXktPkdldE51bWJlcihpKTsKKyAgICAgIH0KKyAgICAgIGlmIChpIDwgZGFzaF9jb3VudCkgeworICAgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheVtpXSA9IGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5W2kgLSAxXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQXJyYXkgPSBGWF9BbGxvYyhGWF9GTE9BVCwgMik7CisgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hDb3VudCA9IDI7CisgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheVswXSA9IGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5WzFdID0gMyAqIDEuMGY7CiAgICAgfQotICAgIENQREZfQXJyYXkqIHBDb2xvciA9IG1fcEFubm90RGljdC0+R2V0QXJyYXkoIkMiKTsKLSAgICBGWF9EV09SRCBhcmdiID0gMHhmZjAwMDAwMDsKLSAgICBpZiAocENvbG9yICE9IE5VTEwpIHsKLSAgICAgICAgaW50IFIgPSAoaW50MzJfdCkocENvbG9yLT5HZXROdW1iZXIoMCkgKiAyNTUpOwotICAgICAgICBpbnQgRyA9IChpbnQzMl90KShwQ29sb3ItPkdldE51bWJlcigxKSAqIDI1NSk7Ci0gICAgICAgIGludCBCID0gKGludDMyX3QpKHBDb2xvci0+R2V0TnVtYmVyKDIpICogMjU1KTsKLSAgICAgICAgYXJnYiA9IEFyZ2JFbmNvZGUoMHhmZiwgUiwgRywgQik7Ci0gICAgfQotICAgIENQREZfR3JhcGhTdGF0ZURhdGEgZ3JhcGhfc3RhdGU7Ci0gICAgZ3JhcGhfc3RhdGUubV9MaW5lV2lkdGggPSB3aWR0aDsKLSAgICBpZiAoc3R5bGVfY2hhciA9PSAnRCcpIHsKLSAgICAgICAgaWYgKHBEYXNoQXJyYXkpIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGRhc2hfY291bnQgPSBwRGFzaEFycmF5LT5HZXRDb3VudCgpOwotICAgICAgICAgICAgaWYgKGRhc2hfY291bnQgJSAyKSB7Ci0gICAgICAgICAgICAgICAgZGFzaF9jb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQXJyYXkgPSBGWF9BbGxvYyhGWF9GTE9BVCwgZGFzaF9jb3VudCk7Ci0gICAgICAgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hDb3VudCA9IGRhc2hfY291bnQ7Ci0gICAgICAgICAgICBGWF9EV09SRCBpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBEYXNoQXJyYXktPkdldENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgICAgIGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5W2ldID0gcERhc2hBcnJheS0+R2V0TnVtYmVyKGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPCBkYXNoX2NvdW50KSB7Ci0gICAgICAgICAgICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQXJyYXlbaV0gPSBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheVtpIC0gMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheSA9IEZYX0FsbG9jKEZYX0ZMT0FULCAyKTsKLSAgICAgICAgICAgIGdyYXBoX3N0YXRlLm1fRGFzaENvdW50ID0gMjsKLSAgICAgICAgICAgIGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5WzBdID0gZ3JhcGhfc3RhdGUubV9EYXNoQXJyYXlbMV0gPSAzICogMS4wZjsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IHJlY3Q7Ci0gICAgR2V0UmVjdChyZWN0KTsKLSAgICBDUERGX1BhdGhEYXRhIHBhdGg7Ci0gICAgd2lkdGggLz0gMjsKLSAgICBwYXRoLkFwcGVuZFJlY3QocmVjdC5sZWZ0ICsgd2lkdGgsIHJlY3QuYm90dG9tICsgd2lkdGgsIHJlY3QucmlnaHQgLSB3aWR0aCwgcmVjdC50b3AgLSB3aWR0aCk7Ci0gICAgaW50IGZpbGxfdHlwZSA9IDA7Ci0gICAgaWYgKHBPcHRpb25zICYmIChwT3B0aW9ucy0+bV9GbGFncyAmIFJFTkRFUl9OT1BBVEhTTU9PVEgpKSB7Ci0gICAgICAgIGZpbGxfdHlwZSB8PSBGWEZJTExfTk9QQVRIU01PT1RIOwotICAgIH0KLSAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3JhcGhfc3RhdGUsIGFyZ2IsIGFyZ2IsIGZpbGxfdHlwZSk7CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICBHZXRSZWN0KHJlY3QpOworICBDUERGX1BhdGhEYXRhIHBhdGg7CisgIHdpZHRoIC89IDI7CisgIHBhdGguQXBwZW5kUmVjdChyZWN0LmxlZnQgKyB3aWR0aCwgcmVjdC5ib3R0b20gKyB3aWR0aCwgcmVjdC5yaWdodCAtIHdpZHRoLAorICAgICAgICAgICAgICAgICAgcmVjdC50b3AgLSB3aWR0aCk7CisgIGludCBmaWxsX3R5cGUgPSAwOworICBpZiAocE9wdGlvbnMgJiYgKHBPcHRpb25zLT5tX0ZsYWdzICYgUkVOREVSX05PUEFUSFNNT09USCkpIHsKKyAgICBmaWxsX3R5cGUgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKKyAgfQorICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3JhcGhfc3RhdGUsIGFyZ2IsIGFyZ2IsIGZpbGxfdHlwZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hcC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19hcC5jcHAKaW5kZXggZjk0YTRkNi4uZmVlZGIzMiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYXAuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FwLmNwcApAQCAtOCw4MDMgKzgsOTIzIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIKICNpbmNsdWRlICJwZGZfdnQuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9hcC5oIgotRlhfQk9PTCBGUERGX0dlbmVyYXRlQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQotewotICAgIGlmICghcEFubm90RGljdCB8fCBwQW5ub3REaWN0LT5HZXRDb25zdFN0cmluZygiU3VidHlwZSIpICE9IEZYX0JTVFJDKCJXaWRnZXQiKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGZpZWxkX3R5cGUgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRlQiKS0+R2V0U3RyaW5nKCk7Ci0gICAgRlhfRFdPUkQgZmxhZ3MgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRmYiKT8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZmIiktPkdldEludGVnZXIoKSA6IDA7Ci0gICAgaWYgKGZpZWxkX3R5cGUgPT0gIlR4IikgewotICAgICAgICByZXR1cm4gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVRleHRGaWVsZEFQKHBEb2MsIHBBbm5vdERpY3QpOwotICAgIH0KLSAgICBpZiAoZmllbGRfdHlwZSA9PSAiQ2giKSB7Ci0gICAgICAgIHJldHVybiAoZmxhZ3MgJiAoMSA8PCAxNykpID8KLSAgICAgICAgICAgICAgICBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29tYm9Cb3hBUChwRG9jLCBwQW5ub3REaWN0KSA6Ci0gICAgICAgICAgICAgICAgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUxpc3RCb3hBUChwRG9jLCBwQW5ub3REaWN0KTsKLSAgICB9Ci0gICAgaWYgKGZpZWxkX3R5cGUgPT0gIkJ0biIpIHsKLSAgICAgICAgaWYgKCEoZmxhZ3MgJiAoMSA8PCAxNikpKSB7Ci0gICAgICAgICAgICBpZiAoIXBBbm5vdERpY3QtPktleUV4aXN0KCJBUyIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcFBhcmVudERpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0KCJQYXJlbnQiKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocFBhcmVudERpY3QtPktleUV4aXN0KCJBUyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQW5ub3REaWN0LT5TZXRBdFN0cmluZygiQVMiLCBwUGFyZW50RGljdC0+R2V0U3RyaW5nKCJBUyIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KK0ZYX0JPT0wgRlBERl9HZW5lcmF0ZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgeworICBpZiAoIXBBbm5vdERpY3QgfHwKKyAgICAgIHBBbm5vdERpY3QtPkdldENvbnN0U3RyaW5nKCJTdWJ0eXBlIikgIT0gRlhfQlNUUkMoIldpZGdldCIpKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9CeXRlU3RyaW5nIGZpZWxkX3R5cGUgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRlQiKS0+R2V0U3RyaW5nKCk7CisgIEZYX0RXT1JEIGZsYWdzID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZmIikKKyAgICAgICAgICAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRmYiKS0+R2V0SW50ZWdlcigpCisgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgaWYgKGZpZWxkX3R5cGUgPT0gIlR4IikgeworICAgIHJldHVybiBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlVGV4dEZpZWxkQVAocERvYywgcEFubm90RGljdCk7CisgIH0KKyAgaWYgKGZpZWxkX3R5cGUgPT0gIkNoIikgeworICAgIHJldHVybiAoZmxhZ3MgJiAoMSA8PCAxNykpCisgICAgICAgICAgICAgICA/IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb21ib0JveEFQKHBEb2MsIHBBbm5vdERpY3QpCisgICAgICAgICAgICAgICA6IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVMaXN0Qm94QVAocERvYywgcEFubm90RGljdCk7CisgIH0KKyAgaWYgKGZpZWxkX3R5cGUgPT0gIkJ0biIpIHsKKyAgICBpZiAoIShmbGFncyAmICgxIDw8IDE2KSkpIHsKKyAgICAgIGlmICghcEFubm90RGljdC0+S2V5RXhpc3QoIkFTIikpIHsKKyAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcFBhcmVudERpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0KCJQYXJlbnQiKSkgeworICAgICAgICAgIGlmIChwUGFyZW50RGljdC0+S2V5RXhpc3QoIkFTIikpIHsKKyAgICAgICAgICAgIHBBbm5vdERpY3QtPlNldEF0U3RyaW5nKCJBUyIsIHBQYXJlbnREaWN0LT5HZXRTdHJpbmcoIkFTIikpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1jbGFzcyBDUFZUX0ZvbnRNYXAgOiBwdWJsaWMgSVBWVF9Gb250TWFwCi17Ci1wdWJsaWM6Ci0gICAgQ1BWVF9Gb250TWFwKENQREZfRG9jdW1lbnQgKiBwRG9jLCBDUERGX0RpY3Rpb25hcnkgKiBwUmVzRGljdCwgQ1BERl9Gb250ICogcERlZkZvbnQsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nICYgc0RlZkZvbnRBbGlhcyk7Ci0gICAgdmlydHVhbCB+Q1BWVF9Gb250TWFwKCk7Ci0gICAgQ1BERl9Gb250KgkJCQkJCUdldFBERkZvbnQoaW50MzJfdCBuRm9udEluZGV4KTsKLSAgICBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0UERGRm9udEFsaWFzKGludDMyX3QgbkZvbnRJbmRleCk7Ci0gICAgc3RhdGljIHZvaWQJCQkJCQlHZXRBbm5vdFN5c1BERkZvbnQoQ1BERl9Eb2N1bWVudCAqIHBEb2MsIENQREZfRGljdGlvbmFyeSAqIHBSZXNEaWN0LAotICAgICAgICAgICAgQ1BERl9Gb250ICogJiBwU3lzRm9udCwgQ0ZYX0J5dGVTdHJpbmcgJiBzU3lzRm9udEFsaWFzKTsKLXByaXZhdGU6Ci0gICAgQ1BERl9Eb2N1bWVudCoJCQkJCW1fcERvY3VtZW50OwotICAgIENQREZfRGljdGlvbmFyeSoJCQkJbV9wUmVzRGljdDsKLSAgICBDUERGX0ZvbnQqCQkJCQkJbV9wRGVmRm9udDsKLSAgICBDRlhfQnl0ZVN0cmluZwkJCQkJbV9zRGVmRm9udEFsaWFzOwotICAgIENQREZfRm9udCoJCQkJCQltX3BTeXNGb250OwotICAgIENGWF9CeXRlU3RyaW5nCQkJCQltX3NTeXNGb250QWxpYXM7CitjbGFzcyBDUFZUX0ZvbnRNYXAgOiBwdWJsaWMgSVBWVF9Gb250TWFwIHsKKyBwdWJsaWM6CisgIENQVlRfRm9udE1hcChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwKKyAgICAgICAgICAgICAgIENQREZfRm9udCogcERlZkZvbnQsCisgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0RlZkZvbnRBbGlhcyk7CisgIHZpcnR1YWwgfkNQVlRfRm9udE1hcCgpOworICBDUERGX0ZvbnQqIEdldFBERkZvbnQoaW50MzJfdCBuRm9udEluZGV4KTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0UERGRm9udEFsaWFzKGludDMyX3QgbkZvbnRJbmRleCk7CisgIHN0YXRpYyB2b2lkIEdldEFubm90U3lzUERGRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udComIHBTeXNGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHNTeXNGb250QWxpYXMpOworCisgcHJpdmF0ZToKKyAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CisgIENQREZfRGljdGlvbmFyeSogbV9wUmVzRGljdDsKKyAgQ1BERl9Gb250KiBtX3BEZWZGb250OworICBDRlhfQnl0ZVN0cmluZyBtX3NEZWZGb250QWxpYXM7CisgIENQREZfRm9udCogbV9wU3lzRm9udDsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9zU3lzRm9udEFsaWFzOwogfTsKLUNQVlRfRm9udE1hcDo6Q1BWVF9Gb250TWFwKENQREZfRG9jdW1lbnQgKiBwRG9jLCBDUERGX0RpY3Rpb25hcnkgKiBwUmVzRGljdCwgQ1BERl9Gb250ICogcERlZkZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyAmIHNEZWZGb250QWxpYXMpIDoKLSAgICBtX3BEb2N1bWVudChwRG9jKSwKLSAgICBtX3BSZXNEaWN0KHBSZXNEaWN0KSwKLSAgICBtX3BEZWZGb250KHBEZWZGb250KSwKLSAgICBtX3NEZWZGb250QWxpYXMoc0RlZkZvbnRBbGlhcyksCi0gICAgbV9wU3lzRm9udChOVUxMKSwKLSAgICBtX3NTeXNGb250QWxpYXMoKQotewotfQotQ1BWVF9Gb250TWFwOjp+Q1BWVF9Gb250TWFwKCkKLXsKLX0KLWV4dGVybiBDUERGX0ZvbnQqCQlBZGROYXRpdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKLXZvaWQgQ1BWVF9Gb250TWFwOjpHZXRBbm5vdFN5c1BERkZvbnQoQ1BERl9Eb2N1bWVudCAqIHBEb2MsIENQREZfRGljdGlvbmFyeSAqIHBSZXNEaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQgKiAmIHBTeXNGb250LCBDRlhfQnl0ZVN0cmluZyAmIHNTeXNGb250QWxpYXMpCi17Ci0gICAgaWYgKHBEb2MgJiYgcFJlc0RpY3QpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRBbGlhczsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QgPSBwRG9jLT5HZXRSb290KCktPkdldERpY3QoIkFjcm9Gb3JtIik7Ci0gICAgICAgIGlmIChDUERGX0ZvbnQgKiBwUERGRm9udCA9IEFkZE5hdGl2ZUludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jLCBzU3lzRm9udEFsaWFzKSkgewotICAgICAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSAqIHBGb250TGlzdCA9IHBSZXNEaWN0LT5HZXREaWN0KCJGb250IikpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBGb250TGlzdC0+S2V5RXhpc3Qoc1N5c0ZvbnRBbGlhcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcEZvbnRMaXN0LT5TZXRBdFJlZmVyZW5jZShzU3lzRm9udEFsaWFzLCBwRG9jLCBwUERGRm9udC0+R2V0Rm9udERpY3QoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFN5c0ZvbnQgPSBwUERGRm9udDsKK0NQVlRfRm9udE1hcDo6Q1BWVF9Gb250TWFwKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRGVmRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGVmRm9udEFsaWFzKQorICAgIDogbV9wRG9jdW1lbnQocERvYyksCisgICAgICBtX3BSZXNEaWN0KHBSZXNEaWN0KSwKKyAgICAgIG1fcERlZkZvbnQocERlZkZvbnQpLAorICAgICAgbV9zRGVmRm9udEFsaWFzKHNEZWZGb250QWxpYXMpLAorICAgICAgbV9wU3lzRm9udChOVUxMKSwKKyAgICAgIG1fc1N5c0ZvbnRBbGlhcygpIHt9CitDUFZUX0ZvbnRNYXA6On5DUFZUX0ZvbnRNYXAoKSB7fQorZXh0ZXJuIENQREZfRm9udCogQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Cit2b2lkIENQVlRfRm9udE1hcDo6R2V0QW5ub3RTeXNQREZGb250KENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udComIHBTeXNGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc1N5c0ZvbnRBbGlhcykgeworICBpZiAocERvYyAmJiBwUmVzRGljdCkgeworICAgIENGWF9CeXRlU3RyaW5nIHNGb250QWxpYXM7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QgPSBwRG9jLT5HZXRSb290KCktPkdldERpY3QoIkFjcm9Gb3JtIik7CisgICAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPQorICAgICAgICAgICAgQWRkTmF0aXZlSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2MsIHNTeXNGb250QWxpYXMpKSB7CisgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udExpc3QgPSBwUmVzRGljdC0+R2V0RGljdCgiRm9udCIpKSB7CisgICAgICAgIGlmICghcEZvbnRMaXN0LT5LZXlFeGlzdChzU3lzRm9udEFsaWFzKSkgeworICAgICAgICAgIHBGb250TGlzdC0+U2V0QXRSZWZlcmVuY2Uoc1N5c0ZvbnRBbGlhcywgcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQREZGb250LT5HZXRGb250RGljdCgpKTsKICAgICAgICAgfQorICAgICAgfQorICAgICAgcFN5c0ZvbnQgPSBwUERGRm9udDsKICAgICB9CisgIH0KIH0KLUNQREZfRm9udCogQ1BWVF9Gb250TWFwOjpHZXRQREZGb250KGludDMyX3QgbkZvbnRJbmRleCkKLXsKLSAgICBzd2l0Y2ggKG5Gb250SW5kZXgpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmV0dXJuIG1fcERlZkZvbnQ7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGlmICghbV9wU3lzRm9udCkgewotICAgICAgICAgICAgICAgIEdldEFubm90U3lzUERGRm9udChtX3BEb2N1bWVudCwgbV9wUmVzRGljdCwgbV9wU3lzRm9udCwgbV9zU3lzRm9udEFsaWFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtX3BTeXNGb250OwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKK0NQREZfRm9udCogQ1BWVF9Gb250TWFwOjpHZXRQREZGb250KGludDMyX3QgbkZvbnRJbmRleCkgeworICBzd2l0Y2ggKG5Gb250SW5kZXgpIHsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gbV9wRGVmRm9udDsKKyAgICBjYXNlIDE6CisgICAgICBpZiAoIW1fcFN5c0ZvbnQpIHsKKyAgICAgICAgR2V0QW5ub3RTeXNQREZGb250KG1fcERvY3VtZW50LCBtX3BSZXNEaWN0LCBtX3BTeXNGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zU3lzRm9udEFsaWFzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtX3BTeXNGb250OworICB9CisgIHJldHVybiBOVUxMOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9Gb250TWFwOjpHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KQotewotICAgIHN3aXRjaCAobkZvbnRJbmRleCkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gbV9zRGVmRm9udEFsaWFzOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZiAoIW1fcFN5c0ZvbnQpIHsKLSAgICAgICAgICAgICAgICBHZXRBbm5vdFN5c1BERkZvbnQobV9wRG9jdW1lbnQsIG1fcFJlc0RpY3QsIG1fcFN5c0ZvbnQsIG1fc1N5c0ZvbnRBbGlhcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbV9zU3lzRm9udEFsaWFzOwotICAgIH0KLSAgICByZXR1cm4gIiI7CitDRlhfQnl0ZVN0cmluZyBDUFZUX0ZvbnRNYXA6OkdldFBERkZvbnRBbGlhcyhpbnQzMl90IG5Gb250SW5kZXgpIHsKKyAgc3dpdGNoIChuRm9udEluZGV4KSB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIG1fc0RlZkZvbnRBbGlhczsKKyAgICBjYXNlIDE6CisgICAgICBpZiAoIW1fcFN5c0ZvbnQpIHsKKyAgICAgICAgR2V0QW5ub3RTeXNQREZGb250KG1fcERvY3VtZW50LCBtX3BSZXNEaWN0LCBtX3BTeXNGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zU3lzRm9udEFsaWFzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtX3NTeXNGb250QWxpYXM7CisgIH0KKyAgcmV0dXJuICIiOwogfQotQ1BWVF9Qcm92aWRlcjo6Q1BWVF9Qcm92aWRlcihJUFZUX0ZvbnRNYXAgKiBwRm9udE1hcCkgOiBtX3BGb250TWFwKHBGb250TWFwKQotewotICAgIEFTU0VSVCAobV9wRm9udE1hcCAhPSBOVUxMKTsKK0NQVlRfUHJvdmlkZXI6OkNQVlRfUHJvdmlkZXIoSVBWVF9Gb250TWFwKiBwRm9udE1hcCkgOiBtX3BGb250TWFwKHBGb250TWFwKSB7CisgIEFTU0VSVChtX3BGb250TWFwICE9IE5VTEwpOwogfQotQ1BWVF9Qcm92aWRlcjo6fkNQVlRfUHJvdmlkZXIoKQoteworQ1BWVF9Qcm92aWRlcjo6fkNQVlRfUHJvdmlkZXIoKSB7fQoraW50MzJfdCBDUFZUX1Byb3ZpZGVyOjpHZXRDaGFyV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuV29yZFN0eWxlKSB7CisgIGlmIChDUERGX0ZvbnQqIHBQREZGb250ID0gbV9wRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkgeworICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gcFBERkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUod29yZCk7CisgICAgaWYgKGNoYXJjb2RlICE9IC0xKSB7CisgICAgICByZXR1cm4gcFBERkZvbnQtPkdldENoYXJXaWR0aEYoY2hhcmNvZGUpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKIH0KLWludDMyX3QgQ1BWVF9Qcm92aWRlcjo6R2V0Q2hhcldpZHRoKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkLCBpbnQzMl90IG5Xb3JkU3R5bGUpCi17Ci0gICAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7Ci0gICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gcFBERkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUod29yZCk7Ci0gICAgICAgIGlmIChjaGFyY29kZSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIHBQREZGb250LT5HZXRDaGFyV2lkdGhGKGNoYXJjb2RlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKK2ludDMyX3QgQ1BWVF9Qcm92aWRlcjo6R2V0VHlwZUFzY2VudChpbnQzMl90IG5Gb250SW5kZXgpIHsKKyAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7CisgICAgcmV0dXJuIHBQREZGb250LT5HZXRUeXBlQXNjZW50KCk7CisgIH0KKyAgcmV0dXJuIDA7CiB9Ci1pbnQzMl90IENQVlRfUHJvdmlkZXI6OkdldFR5cGVBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KQotewotICAgIGlmIChDUERGX0ZvbnQqIHBQREZGb250ID0gbV9wRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkgewotICAgICAgICByZXR1cm4gcFBERkZvbnQtPkdldFR5cGVBc2NlbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CitpbnQzMl90IENQVlRfUHJvdmlkZXI6OkdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgeworICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCkpIHsKKyAgICByZXR1cm4gcFBERkZvbnQtPkdldFR5cGVEZXNjZW50KCk7CisgIH0KKyAgcmV0dXJuIDA7CiB9Ci1pbnQzMl90IENQVlRfUHJvdmlkZXI6OkdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkKLXsKLSAgICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCkpIHsKLSAgICAgICAgcmV0dXJuIHBQREZGb250LT5HZXRUeXBlRGVzY2VudCgpOworaW50MzJfdCBDUFZUX1Byb3ZpZGVyOjpHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4KSB7CisgIGlmIChDUERGX0ZvbnQqIHBEZWZGb250ID0gbV9wRm9udE1hcC0+R2V0UERGRm9udCgwKSkgeworICAgIGlmIChwRGVmRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3b3JkKSAhPSAtMSkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHJldHVybiAwOworICB9CisgIGlmIChDUERGX0ZvbnQqIHBTeXNGb250ID0gbV9wRm9udE1hcC0+R2V0UERGRm9udCgxKSkKKyAgICBpZiAocFN5c0ZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUod29yZCkgIT0gLTEpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgcmV0dXJuIC0xOwogfQotaW50MzJfdCBDUFZUX1Byb3ZpZGVyOjpHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBpbnQzMl90IG5Gb250SW5kZXgpCi17Ci0gICAgaWYgKENQREZfRm9udCogcERlZkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KDApKSB7Ci0gICAgICAgIGlmIChwRGVmRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3b3JkKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKENQREZfRm9udCogcFN5c0ZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KDEpKQotICAgICAgICBpZiAocFN5c0ZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUod29yZCkgIT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotRlhfQk9PTCBDUFZUX1Byb3ZpZGVyOjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpCi17Ci0gICAgaWYgKCh3b3JkID49IDB4NjEgJiYgd29yZCA8PSAweDdBKSB8fCAod29yZCA+PSAweDQxICYmIHdvcmQgPD0gMHg1QSkgfHwgd29yZCA9PSAweDJEIHx8IHdvcmQgPT0gMHgyNykgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotaW50MzJfdCBDUFZUX1Byb3ZpZGVyOjpHZXREZWZhdWx0Rm9udEluZGV4KCkKLXsKLSAgICByZXR1cm4gMDsKLX0KLXN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRQREZXb3JkU3RyaW5nKElQVlRfRm9udE1hcCAqIHBGb250TWFwLCBpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgV29yZCwgRlhfV09SRCBTdWJXb3JkKQotewotICAgIENGWF9CeXRlU3RyaW5nIHNXb3JkOwotICAgIGlmIChTdWJXb3JkID4gMCkgewotICAgICAgICBzV29yZC5Gb3JtYXQoIiVjIiwgU3ViV29yZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBGb250TWFwKSB7Ci0gICAgICAgICAgICBpZiAoQ1BERl9Gb250ICogcFBERkZvbnQgPSBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkgewotICAgICAgICAgICAgICAgIGlmIChwUERGRm9udC0+R2V0QmFzZUZvbnQoKS5Db21wYXJlKCJTeW1ib2wiKSA9PSAwIHx8IHBQREZGb250LT5HZXRCYXNlRm9udCgpLkNvbXBhcmUoIlphcGZEaW5nYmF0cyIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc1dvcmQuRm9ybWF0KCIlYyIsIFdvcmQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q2hhckNvZGUgPSBwUERGRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZShXb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGR3Q2hhckNvZGUgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQREZGb250LT5BcHBlbmRDaGFyKHNXb3JkLCBkd0NoYXJDb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc1dvcmQ7Ci19Ci1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0V29yZFJlbmRlclN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmIHN0cldvcmRzKQotewotICAgIGlmIChzdHJXb3Jkcy5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgcmV0dXJuIFBERl9FbmNvZGVTdHJpbmcoc3RyV29yZHMpICsgIiBUalxuIjsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotfQotc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEZvbnRTZXRTdHJpbmcoSVBWVF9Gb250TWFwICogcEZvbnRNYXAsIGludDMyX3QgbkZvbnRJbmRleCwgRlhfRkxPQVQgZkZvbnRTaXplKQotewotICAgIENGWF9CeXRlVGV4dEJ1ZiBzUmV0OwotICAgIGlmIChwRm9udE1hcCkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzRm9udEFsaWFzID0gcEZvbnRNYXAtPkdldFBERkZvbnRBbGlhcyhuRm9udEluZGV4KTsKLSAgICAgICAgaWYgKHNGb250QWxpYXMuR2V0TGVuZ3RoKCkgPiAwICYmIGZGb250U2l6ZSA+IDAgKSB7Ci0gICAgICAgICAgICBzUmV0IDw8ICIvIiA8PCBzRm9udEFsaWFzIDw8ICIgIiA8PCBmRm9udFNpemUgPDwgIiBUZlxuIjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7Ci19Ci1zdGF0aWMgQ1BWVF9Db2xvciBQYXJzZUNvbG9yKGNvbnN0IENGWF9CeXRlU3RyaW5nICYgc3RyKQotewotICAgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChzdHIpOwotICAgIHN5bnRheC5TZXRQb3MoMCk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oImciLCAxKSkgewotICAgICAgICByZXR1cm4gQ1BWVF9Db2xvcihDVF9HUkFZLCBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpKTsKLSAgICB9Ci0gICAgc3ludGF4LlNldFBvcygwKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgicmciLCAzKSkgewotICAgICAgICBGWF9GTE9BVCBmMSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIEZYX0ZMT0FUIGYyID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKLSAgICAgICAgRlhfRkxPQVQgZjMgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICByZXR1cm4gQ1BWVF9Db2xvcihDVF9SR0IsIGYxLCBmMiwgZjMpOwotICAgIH0KLSAgICBzeW50YXguU2V0UG9zKDApOwotICAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKCJrIiwgNCkpIHsKLSAgICAgICAgRlhfRkxPQVQgZjEgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICBGWF9GTE9BVCBmMiA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIEZYX0ZMT0FUIGYzID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKLSAgICAgICAgRlhfRkxPQVQgZjQgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICByZXR1cm4gQ1BWVF9Db2xvcihDVF9DTVlLLCBmMSwgZjIsIGYzLCBmNCk7Ci0gICAgfQotICAgIHJldHVybiBDUFZUX0NvbG9yKENUX1RSQU5TUEFSRU5UKTsKLX0KLXN0YXRpYyBDUFZUX0NvbG9yIFBhcnNlQ29sb3IoY29uc3QgQ1BERl9BcnJheSAmIGFycmF5KQotewotICAgIENQVlRfQ29sb3IgcnQ7Ci0gICAgc3dpdGNoIChhcnJheS5HZXRDb3VudCgpKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJ0ID0gQ1BWVF9Db2xvcihDVF9HUkFZLCBhcnJheS5HZXRGbG9hdCgwKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcnQgPSBDUFZUX0NvbG9yKENUX1JHQiwgYXJyYXkuR2V0RmxvYXQoMCksIGFycmF5LkdldEZsb2F0KDEpLCBhcnJheS5HZXRGbG9hdCgyKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgcnQgPSBDUFZUX0NvbG9yKENUX0NNWUssIGFycmF5LkdldEZsb2F0KDApLCBhcnJheS5HZXRGbG9hdCgxKSwgYXJyYXkuR2V0RmxvYXQoMiksIGFycmF5LkdldEZsb2F0KDMpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gcnQ7Ci19Ci1zdGF0aWMgRlhfQk9PTCBHZW5lcmF0ZVdpZGdldEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwgY29uc3QgaW50MzJfdCAmIG5XaWRnZXRUeXBlKQotewotICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0ID0gTlVMTDsKLSAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5ICogcFJvb3REaWN0ID0gcERvYy0+R2V0Um9vdCgpKSB7Ci0gICAgICAgIHBGb3JtRGljdCA9IHBSb290RGljdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKLSAgICB9Ci0gICAgaWYgKCFwRm9ybURpY3QpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBEQTsKLSAgICBpZiAoQ1BERl9PYmplY3QqIHBEQU9iaiA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJEQSIpKSB7Ci0gICAgICAgIERBID0gcERBT2JqLT5HZXRTdHJpbmcoKTsKLSAgICB9Ci0gICAgaWYgKERBLklzRW1wdHkoKSkgewotICAgICAgICBEQSA9IHBGb3JtRGljdC0+R2V0U3RyaW5nKCJEQSIpOwotICAgIH0KLSAgICBpZiAoREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KERBKTsKLSAgICBzeW50YXguRmluZFRhZ1BhcmFtKCJUZiIsIDIpOwotICAgIENGWF9CeXRlU3RyaW5nIHNGb250TmFtZSA9IHN5bnRheC5HZXRXb3JkKCk7Ci0gICAgc0ZvbnROYW1lID0gUERGX05hbWVEZWNvZGUoc0ZvbnROYW1lKTsKLSAgICBpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgQ1BWVF9Db2xvciBjclRleHQgPSBQYXJzZUNvbG9yKERBKTsKLSAgICBGWF9CT09MIGJVc2VGb3JtUmVzID0gRkFMU0U7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICogcEZvbnREaWN0ID0gTlVMTDsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEUkRpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJEUiIpKTsKLSAgICBpZiAocERSRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHBEUkRpY3QgPSBwRm9ybURpY3QtPkdldERpY3QoRlhfQlNUUkMoIkRSIikpOwotICAgICAgICBiVXNlRm9ybVJlcyA9IFRSVUU7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSAqIHBEUkZvbnREaWN0ID0gTlVMTDsKLSAgICBpZiAocERSRGljdCAmJiAocERSRm9udERpY3QgPSBwRFJEaWN0LT5HZXREaWN0KCJGb250IikpKSB7Ci0gICAgICAgIHBGb250RGljdCA9IHBEUkZvbnREaWN0LT5HZXREaWN0KHNGb250TmFtZS5NaWQoMSkpOwotICAgICAgICBpZiAoIXBGb250RGljdCAmJiAhYlVzZUZvcm1SZXMpIHsKLSAgICAgICAgICAgIHBEUkRpY3QgPSBwRm9ybURpY3QtPkdldERpY3QoRlhfQlNUUkMoIkRSIikpOwotICAgICAgICAgICAgcERSRm9udERpY3QgPSBwRFJEaWN0LT5HZXREaWN0KCJGb250Iik7Ci0gICAgICAgICAgICBpZiAocERSRm9udERpY3QpIHsKLSAgICAgICAgICAgICAgICBwRm9udERpY3QgPSBwRFJGb250RGljdC0+R2V0RGljdChzRm9udE5hbWUuTWlkKDEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIXBEUkZvbnREaWN0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCFwRm9udERpY3QpIHsKLSAgICAgICAgcEZvbnREaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKLSAgICAgICAgaWYgKHBGb250RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgIkZvbnQiKTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgIlR5cGUxIik7Ci0gICAgICAgIHBGb250RGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJCYXNlRm9udCIpLCAiSGVsdmV0aWNhIik7Ci0gICAgICAgIHBGb250RGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJFbmNvZGluZyIpLCAiV2luQW5zaUVuY29kaW5nIik7Ci0gICAgICAgIHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBGb250RGljdCk7Ci0gICAgICAgIHBEUkZvbnREaWN0LT5TZXRBdFJlZmVyZW5jZShzRm9udE5hbWUuTWlkKDEpLCBwRG9jLCBwRm9udERpY3QpOwotICAgIH0KLSAgICBDUERGX0ZvbnQqIHBEZWZGb250ID0gcERvYy0+TG9hZEZvbnQocEZvbnREaWN0KTsKLSAgICBpZiAoIXBEZWZGb250KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBwQW5ub3REaWN0LT5HZXRSZWN0KCJSZWN0Iik7Ci0gICAgaW50MzJfdCBuUm90YXRlID0gMDsKLSAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5ICogcE1LRGljdCA9IHBBbm5vdERpY3QtPkdldERpY3QoIk1LIikpIHsKLSAgICAgICAgblJvdGF0ZSA9IHBNS0RpY3QtPkdldEludGVnZXIoIlIiKTsKLSAgICB9Ci0gICAgQ1BERl9SZWN0IHJjQkJveDsKLSAgICBDUERGX01hdHJpeCBtYXRyaXg7Ci0gICAgc3dpdGNoIChuUm90YXRlICUgMzYwKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgbWF0cml4ID0gQ1BERl9NYXRyaXgoMCwgMSwgLTEsIDAsIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQsIDApOwotICAgICAgICAgICAgcmNCQm94ID0gQ1BERl9SZWN0KDAsIDAsIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20sIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgwOgotICAgICAgICAgICAgbWF0cml4ID0gQ1BERl9NYXRyaXgoLTEsIDAsIDAsIC0xLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKLSAgICAgICAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgIG1hdHJpeCA9IENQREZfTWF0cml4KDAsIC0xLCAxLCAwLCAwLCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKLSAgICAgICAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpbnQzMl90IG5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKLSAgICBGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAxOwotICAgIENQVlRfRGFzaCBkc0JvcmRlcigzLCAwLCAwKTsKLSAgICBDUFZUX0NvbG9yIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbTsKLSAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5ICogcEJTRGljdCA9IHBBbm5vdERpY3QtPkdldERpY3QoIkJTIikpIHsKLSAgICAgICAgaWYgKHBCU0RpY3QtPktleUV4aXN0KCJXIikpIHsKLSAgICAgICAgICAgIGZCb3JkZXJXaWR0aCA9IHBCU0RpY3QtPkdldE51bWJlcigiVyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDUERGX0FycmF5ICogcEFycmF5ID0gcEJTRGljdC0+R2V0QXJyYXkoIkQiKSkgewotICAgICAgICAgICAgZHNCb3JkZXIgPSBDUFZUX0Rhc2gocEFycmF5LT5HZXRJbnRlZ2VyKDApLCBwQXJyYXktPkdldEludGVnZXIoMSksIHBBcnJheS0+R2V0SW50ZWdlcigyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoIChwQlNEaWN0LT5HZXRTdHJpbmcoIlMiKS5HZXRBdCgwKSkgewotICAgICAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1NPTElEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgICAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0RBU0g7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgICAgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKLSAgICAgICAgICAgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKLSAgICAgICAgICAgICAgICBjckxlZnRUb3AgPSBDUFZUX0NvbG9yKENUX0dSQVksIDEpOwotICAgICAgICAgICAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFZUX0NvbG9yKENUX0dSQVksIDAuNSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfSU5TRVQ7Ci0gICAgICAgICAgICAgICAgZkJvcmRlcldpZHRoICo9IDI7Ci0gICAgICAgICAgICAgICAgY3JMZWZ0VG9wID0gQ1BWVF9Db2xvcihDVF9HUkFZLCAwLjUpOwotICAgICAgICAgICAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFZUX0NvbG9yKENUX0dSQVksIDAuNzUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnVSc6Ci0gICAgICAgICAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1VOREVSTElORUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BWVF9Db2xvciBjckJvcmRlciwgY3JCRzsKLSAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5ICogcE1LRGljdCA9IHBBbm5vdERpY3QtPkdldERpY3QoIk1LIikpIHsKLSAgICAgICAgaWYgKENQREZfQXJyYXkgKiBwQXJyYXkgPSBwTUtEaWN0LT5HZXRBcnJheSgiQkMiKSkgewotICAgICAgICAgICAgY3JCb3JkZXIgPSBQYXJzZUNvbG9yKCpwQXJyYXkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDUERGX0FycmF5ICogcEFycmF5ID0gcE1LRGljdC0+R2V0QXJyYXkoIkJHIikpIHsKLSAgICAgICAgICAgIGNyQkcgPSBQYXJzZUNvbG9yKCpwQXJyYXkpOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICAgIENGWF9CeXRlU3RyaW5nIHNCRyA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNyQkcsIFRSVUUpOwotICAgIGlmIChzQkcuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0JHIDw8IHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3guYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgICAgIDw8IHJjQkJveC5XaWR0aCgpIDw8ICIgIiA8PCByY0JCb3guSGVpZ2h0KCkgPDwgIiByZSBmXG4iIDw8ICJRXG4iOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBzQm9yZGVyU3RyZWFtID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUJvcmRlckFQKHJjQkJveCwgZkJvcmRlcldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJvcmRlciwgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsIGRzQm9yZGVyKTsKLSAgICBpZiAoc0JvcmRlclN0cmVhbS5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQm9yZGVyU3RyZWFtIDw8ICJRXG4iOwotICAgIH0KLSAgICBDUERGX1JlY3QgcmNCb2R5ID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0ICsgZkJvcmRlcldpZHRoLCByY0JCb3guYm90dG9tICsgZkJvcmRlcldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnJpZ2h0IC0gZkJvcmRlcldpZHRoLCByY0JCb3gudG9wIC0gZkJvcmRlcldpZHRoKTsKLSAgICByY0JvZHkuTm9ybWFsaXplKCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWN0ID0gcEFubm90RGljdC0+R2V0RGljdCgiQVAiKTsKLSAgICBpZiAocEFQRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHBBUERpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgICAgICBpZiAocEFQRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcEFubm90RGljdC0+U2V0QXQoIkFQIiwgcEFQRGljdCk7Ci0gICAgfQotICAgIENQREZfU3RyZWFtKiBwTm9ybWFsU3RyZWFtID0gcEFQRGljdC0+R2V0U3RyZWFtKCJOIik7Ci0gICAgaWYgKHBOb3JtYWxTdHJlYW0gPT0gTlVMTCkgewotICAgICAgICBwTm9ybWFsU3RyZWFtID0gQ1BERl9TdHJlYW06OkNyZWF0ZShOVUxMLCAwLCBOVUxMKTsKLSAgICAgICAgaWYgKHBOb3JtYWxTdHJlYW0gPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3Qgb2JqbnVtID0gcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocE5vcm1hbFN0cmVhbSk7Ci0gICAgICAgIHBBbm5vdERpY3QtPkdldERpY3QoIkFQIiktPlNldEF0UmVmZXJlbmNlKCJOIiwgcERvYywgb2JqbnVtKTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICogcFN0cmVhbURpY3QgPSBwTm9ybWFsU3RyZWFtLT5HZXREaWN0KCk7Ci0gICAgaWYgKHBTdHJlYW1EaWN0KSB7Ci0gICAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdE1hdHJpeCgiTWF0cml4IiwgbWF0cml4KTsKLSAgICAgICAgcFN0cmVhbURpY3QtPlNldEF0UmVjdCgiQkJveCIsIHJjQkJveCk7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFN0cmVhbVJlc0xpc3QgPSBwU3RyZWFtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7Ci0gICAgICAgIGlmIChwU3RyZWFtUmVzTGlzdCkgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzRm9udExpc3QgPSBwU3RyZWFtUmVzTGlzdC0+R2V0RGljdCgiRm9udCIpOwotICAgICAgICAgICAgaWYgKCFwU3RyZWFtUmVzRm9udExpc3QpIHsKLSAgICAgICAgICAgICAgICBwU3RyZWFtUmVzRm9udExpc3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtUmVzRm9udExpc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNMaXN0LT5TZXRBdCgiRm9udCIsIHBTdHJlYW1SZXNGb250TGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdC0+S2V5RXhpc3Qoc0ZvbnROYW1lKSkgewotICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdC0+U2V0QXRSZWZlcmVuY2Uoc0ZvbnROYW1lLCBwRG9jLCBwRm9udERpY3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFN0cmVhbURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwRm9ybURpY3QtPkdldERpY3QoIkRSIiktPkNsb25lKCkpOwotICAgICAgICAgICAgcFN0cmVhbVJlc0xpc3QgPSBwU3RyZWFtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3dpdGNoIChuV2lkZ2V0VHlwZSkgewotICAgICAgICBjYXNlIDA6IHsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlYiKT8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlYiKS0+R2V0VW5pY29kZVRleHQoKSA6IENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBuQWxpZ24gPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiUSIpPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiUSIpLT5HZXRJbnRlZ2VyKCkgOiAwOwotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRmYiKT8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZmIiktPkdldEludGVnZXIoKSA6IDA7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdNYXhMZW4gPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiTWF4TGVuIikgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiTWF4TGVuIiktPkdldEludGVnZXIoKSA6IDA7Ci0gICAgICAgICAgICAgICAgQ1BWVF9Gb250TWFwIG1hcChwRG9jLCBwU3RyZWFtRGljdCA/IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKSA6IE5VTEwgLCBwRGVmRm9udCwgc0ZvbnROYW1lLlJpZ2h0KHNGb250TmFtZS5HZXRMZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgICAgICAgICBDUFZUX1Byb3ZpZGVyIHByZCgmbWFwKTsKLSAgICAgICAgICAgICAgICBDUERGX1ZhcmlhYmxlVGV4dCB2dDsKLSAgICAgICAgICAgICAgICB2dC5TZXRQcm92aWRlcigmcHJkKTsKLSAgICAgICAgICAgICAgICB2dC5TZXRQbGF0ZVJlY3QocmNCb2R5KTsKLSAgICAgICAgICAgICAgICB2dC5TZXRBbGlnbm1lbnQobkFsaWduKTsKLSAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgICAgICAgICAgICB2dC5TZXRBdXRvRm9udFNpemUoVFJVRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdnQuU2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCBiTXVsdGlMaW5lID0gKGR3RmxhZ3MgPj4gMTIpICYgMTsKLSAgICAgICAgICAgICAgICBpZiAoYk11bHRpTGluZSkgewotICAgICAgICAgICAgICAgICAgICB2dC5TZXRNdWx0aUxpbmUoVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIHZ0LlNldEF1dG9SZXR1cm4oVFJVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX1dPUkQgc3ViV29yZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKChkd0ZsYWdzID4+IDEzKSAmIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3ViV29yZCA9ICcqJzsKLSAgICAgICAgICAgICAgICAgICAgdnQuU2V0UGFzc3dvcmRDaGFyKHN1YldvcmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQXJyYXkgPSAoZHdGbGFncyA+PiAyNCkgJiAxOwotICAgICAgICAgICAgICAgIGlmIChiQ2hhckFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHZ0LlNldENoYXJBcnJheShkd01heExlbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdnQuU2V0TGltaXRDaGFyKGR3TWF4TGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdnQuSW5pdGlhbGl6ZSgpOwotICAgICAgICAgICAgICAgIHZ0LlNldFRleHQoc3dWYWx1ZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICB2dC5SZWFycmFuZ2VBbGwoKTsKLSAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gdnQuR2V0Q29udGVudFJlY3QoKTsKLSAgICAgICAgICAgICAgICBDUERGX1BvaW50IHB0T2Zmc2V0KDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgIGlmICghYk11bHRpTGluZSkgewotICAgICAgICAgICAgICAgICAgICBwdE9mZnNldCA9IENQREZfUG9pbnQoMC4wZiwgKHJjQ29udGVudC5IZWlnaHQoKSAtIHJjQm9keS5IZWlnaHQoKSkgLyAyLjBmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0JvZHkgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksIHB0T2Zmc2V0LCAhYkNoYXJBcnJheSwgc3ViV29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNCb2R5LkdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iIDw8ICJxXG4iOwotICAgICAgICAgICAgICAgICAgICBpZiAocmNDb250ZW50LldpZHRoKCkgPiByY0JvZHkuV2lkdGgoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ29udGVudC5IZWlnaHQoKSA+IHJjQm9keS5IZWlnaHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCByY0JvZHkubGVmdCA8PCAiICIgPDwgcmNCb2R5LmJvdHRvbSA8PCAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmNCb2R5LldpZHRoKCkgPDwgIiAiIDw8IHJjQm9keS5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNyVGV4dCwgVFJVRSkgPDwgc0JvZHkgPDwgIkVUXG4iIDw8ICJRXG5FTUNcbiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogewotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiViIpID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlYiKS0+R2V0VW5pY29kZVRleHQoKSA6IENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgQ1BWVF9Gb250TWFwIG1hcChwRG9jLCBwU3RyZWFtRGljdCA/IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTpOVUxMLCBwRGVmRm9udCwgc0ZvbnROYW1lLlJpZ2h0KHNGb250TmFtZS5HZXRMZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgICAgICAgICBDUFZUX1Byb3ZpZGVyIHByZCgmbWFwKTsKLSAgICAgICAgICAgICAgICBDUERGX1ZhcmlhYmxlVGV4dCB2dDsKLSAgICAgICAgICAgICAgICB2dC5TZXRQcm92aWRlcigmcHJkKTsKLSAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNCdXR0b24gPSByY0JvZHk7Ci0gICAgICAgICAgICAgICAgcmNCdXR0b24ubGVmdCA9IHJjQnV0dG9uLnJpZ2h0IC0gMTM7Ci0gICAgICAgICAgICAgICAgcmNCdXR0b24uTm9ybWFsaXplKCk7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjRWRpdCA9IHJjQm9keTsKLSAgICAgICAgICAgICAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0OwotICAgICAgICAgICAgICAgIHJjRWRpdC5Ob3JtYWxpemUoKTsKLSAgICAgICAgICAgICAgICB2dC5TZXRQbGF0ZVJlY3QocmNFZGl0KTsKLSAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgICAgICAgICAgICB2dC5TZXRBdXRvRm9udFNpemUoVFJVRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdnQuU2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdnQuSW5pdGlhbGl6ZSgpOwotICAgICAgICAgICAgICAgIHZ0LlNldFRleHQoc3dWYWx1ZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICB2dC5SZWFycmFuZ2VBbGwoKTsKLSAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gdnQuR2V0Q29udGVudFJlY3QoKTsKLSAgICAgICAgICAgICAgICBDUERGX1BvaW50IHB0T2Zmc2V0ID0gQ1BERl9Qb2ludCgwLjBmLCAocmNDb250ZW50LkhlaWdodCgpIC0gcmNFZGl0LkhlaWdodCgpKSAvIDIuMGYpOwotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLCBwdE9mZnNldCwgVFJVRSwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iIDw8ICJxXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHJjRWRpdC5sZWZ0IDw8ICIgIiA8PCByY0VkaXQuYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJjRWRpdC5XaWR0aCgpIDw8ICIgIiA8PCByY0VkaXQuSGVpZ2h0KCkgPDwgIiByZVxuV1xublxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCBUUlVFKSA8PCBzRWRpdCA8PCAiRVRcbiIgPDwgIlFcbkVNQ1xuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0J1dHRvbiA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfUkdCLCAyMjAuMGYgLyAyNTUuMGYsIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmKSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNCdXR0b24uR2V0TGVuZ3RoKCkgPiAwICYmICFyY0J1dHRvbi5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHJjQnV0dG9uLmxlZnQgPDwgIiAiIDw8IHJjQnV0dG9uLmJvdHRvbSA8PCAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByY0J1dHRvbi5XaWR0aCgpIDw8ICIgIiA8PCByY0J1dHRvbi5IZWlnaHQoKSA8PCAiIHJlIGZcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgIlFcbiI7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNCdXR0b25Cb3JkZXIgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQm9yZGVyQVAocmNCdXR0b24sIDIsIENQVlRfQ29sb3IoQ1RfR1JBWSwgMCksIENQVlRfQ29sb3IoQ1RfR1JBWSwgMSksIENQVlRfQ29sb3IoQ1RfR1JBWSwgMC41KSwgUEJTX0JFVkVMRUQsIENQVlRfRGFzaCgzLCAwLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzQnV0dG9uQm9yZGVyLkdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uQm9yZGVyIDw8ICJRXG4iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQgcHRDZW50ZXIgPSBDUERGX1BvaW50KChyY0J1dHRvbi5sZWZ0ICsgcmNCdXR0b24ucmlnaHQpIC8gMiwgKHJjQnV0dG9uLnRvcCArIHJjQnV0dG9uLmJvdHRvbSkgLyAyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocmNCdXR0b24uV2lkdGgoKSwgNikgJiYgSXNGbG9hdEJpZ2dlcihyY0J1dHRvbi5IZWlnaHQoKSwgNikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgIiAwIGdcbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggLSAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIG1cbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggKyAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIGxcbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggPDwgIiAiIDw8IHB0Q2VudGVyLnkgLSAxLjVmIDw8ICIgbFxuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcHRDZW50ZXIueCAtIDMgPDwgIiAiIDw8IHB0Q2VudGVyLnkgKyAxLjVmIDw8ICIgbCBmXG4iOwotICAgICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQnV0dG9uIDw8ICJRXG4iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogewotICAgICAgICAgICAgICAgIENQVlRfRm9udE1hcCBtYXAocERvYywgcFN0cmVhbURpY3QgPyBwU3RyZWFtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik6TlVMTCwgcERlZkZvbnQsIHNGb250TmFtZS5SaWdodChzRm9udE5hbWUuR2V0TGVuZ3RoKCkgLSAxKSk7Ci0gICAgICAgICAgICAgICAgQ1BWVF9Qcm92aWRlciBwcmQoJm1hcCk7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSAqIHBPcHRzID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIk9wdCIpID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIk9wdCIpLT5HZXRBcnJheSgpIDogTlVMTDsKLSAgICAgICAgICAgICAgICBDUERGX0FycmF5ICogcFNlbHMgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiSSIpID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkkiKS0+R2V0QXJyYXkoKSA6IE5VTEw7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBuVG9wID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlRJIikgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiVEkiKS0+R2V0SW50ZWdlcigpIDogMDsKLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYgc0JvZHk7Ci0gICAgICAgICAgICAgICAgaWYgKHBPcHRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5ID0gcmNCb2R5LnRvcDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSBuVG9wLCBzeiA9IHBPcHRzLT5HZXRDb3VudCgpOyBpIDwgc3o7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKGZ5LCByY0JvZHkuYm90dG9tKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENQREZfT2JqZWN0KiBwT3B0ID0gcE9wdHMtPkdldEVsZW1lbnRWYWx1ZShpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3SXRlbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9wdC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dJdGVtID0gcE9wdC0+R2V0VW5pY29kZVRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBPcHQtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dJdGVtID0gKChDUERGX0FycmF5KilwT3B0KS0+R2V0RWxlbWVudFZhbHVlKDEpLT5HZXRVbmljb2RlVGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWxlY3RlZCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU2VscykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIHMgPSAwLCBzc3ogPSBwU2Vscy0+R2V0Q291bnQoKTsgcyA8IHNzejsgcysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBwU2Vscy0+R2V0SW50ZWdlcihzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZWxlY3RlZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9WYXJpYWJsZVRleHQgdnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdnQuU2V0UHJvdmlkZXIoJnByZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdnQuU2V0UGxhdGVSZWN0KENQREZfUmVjdChyY0JvZHkubGVmdCwgMC4wZiwgcmNCb2R5LnJpZ2h0LCAwLjBmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnQuU2V0Rm9udFNpemUoMTIuMGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0LlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0LkluaXRpYWxpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dC5TZXRUZXh0KHN3SXRlbS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dC5SZWFycmFuZ2VBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmSXRlbUhlaWdodCA9IHZ0LkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJTZWxlY3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNJdGVtID0gQ1BERl9SZWN0KHJjQm9keS5sZWZ0LCBmeSAtIGZJdGVtSGVpZ2h0LCByY0JvZHkucmlnaHQsIGZ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JvZHkgPDwgInFcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoQ1BWVF9Db2xvcihDVF9SR0IsIDAsIDUxLjBmIC8gMjU1LjBmLCAxMTMuMGYgLyAyNTUuMGYpLCBUUlVFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByY0l0ZW0ubGVmdCA8PCAiICIgPDwgcmNJdGVtLmJvdHRvbSA8PCAiICIgPDwgcmNJdGVtLldpZHRoKCkgPDwgIiAiIDw8IHJjSXRlbS5IZWlnaHQoKSA8PCAiIHJlIGZcbiIgPDwgIlFcbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCb2R5IDw8ICJCVFxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChDUFZUX0NvbG9yKENUX0dSQVksIDEpLCBUUlVFKSA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksIENQREZfUG9pbnQoMC4wZiwgZnkpLCBUUlVFLCAwKSA8PCAiRVRcbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JvZHkgPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNyVGV4dCwgVFJVRSkgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLCBDUERGX1BvaW50KDAuMGYsIGZ5KSwgVFJVRSwgMCkgPDwgIkVUXG4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeSAtPSBmSXRlbUhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc0JvZHkuR2V0U2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iIDw8ICJxXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHJjQm9keS5sZWZ0IDw8ICIgIiA8PCByY0JvZHkuYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJjQm9keS5XaWR0aCgpIDw8ICIgIiA8PCByY0JvZHkuSGVpZ2h0KCkgPDwgIiByZVxuV1xublxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQm9keS5HZXRCeXRlU3RyaW5nKCkgPDwgIlFcbkVNQ1xuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKHBOb3JtYWxTdHJlYW0pIHsKLSAgICAgICAgcE5vcm1hbFN0cmVhbS0+U2V0RGF0YSgodWludDhfdCopc0FwcFN0cmVhbS5HZXRCdWZmZXIoKSwgc0FwcFN0cmVhbS5HZXRTaXplKCksIEZBTFNFLCBGQUxTRSk7Ci0gICAgICAgIHBTdHJlYW1EaWN0ID0gcE5vcm1hbFN0cmVhbS0+R2V0RGljdCgpOwotICAgICAgICBpZiAocFN0cmVhbURpY3QpIHsKLSAgICAgICAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdE1hdHJpeCgiTWF0cml4IiwgbWF0cml4KTsKLSAgICAgICAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdFJlY3QoIkJCb3giLCByY0JCb3gpOwotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKLSAgICAgICAgICAgIGlmIChwU3RyZWFtUmVzTGlzdCkgewotICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFN0cmVhbVJlc0ZvbnRMaXN0ID0gcFN0cmVhbVJlc0xpc3QtPkdldERpY3QoIkZvbnQiKTsKLSAgICAgICAgICAgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdCkgewotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtUmVzRm9udExpc3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFN0cmVhbVJlc0ZvbnRMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtUmVzTGlzdC0+U2V0QXQoIkZvbnQiLCBwU3RyZWFtUmVzRm9udExpc3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdC0+S2V5RXhpc3Qoc0ZvbnROYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtUmVzRm9udExpc3QtPlNldEF0UmVmZXJlbmNlKHNGb250TmFtZSwgcERvYywgcEZvbnREaWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpLT5DbG9uZSgpKTsKLSAgICAgICAgICAgICAgICBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KK0ZYX0JPT0wgQ1BWVF9Qcm92aWRlcjo6SXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKSB7CisgIGlmICgod29yZCA+PSAweDYxICYmIHdvcmQgPD0gMHg3QSkgfHwgKHdvcmQgPj0gMHg0MSAmJiB3b3JkIDw9IDB4NUEpIHx8CisgICAgICB3b3JkID09IDB4MkQgfHwgd29yZCA9PSAweDI3KSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlVGV4dEZpZWxkQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQotewotICAgIHJldHVybiBHZW5lcmF0ZVdpZGdldEFQKHBEb2MsIHBBbm5vdERpY3QsIDApOworaW50MzJfdCBDUFZUX1Byb3ZpZGVyOjpHZXREZWZhdWx0Rm9udEluZGV4KCkgeworICByZXR1cm4gMDsKIH0KLUZYX0JPT0wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbWJvQm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQotewotICAgIHJldHVybiBHZW5lcmF0ZVdpZGdldEFQKHBEb2MsIHBBbm5vdERpY3QsIDEpOwotfQotRlhfQk9PTCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlTGlzdEJveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKLXsKLSAgICByZXR1cm4gR2VuZXJhdGVXaWRnZXRBUChwRG9jLCBwQW5ub3REaWN0LCAyKTsKLX0KLUNGWF9CeXRlU3RyaW5nIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoSVBWVF9Gb250TWFwICogcEZvbnRNYXAsIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwgRlhfQk9PTCBiQ29udGludW91cywgRlhfV09SRCBTdWJXb3JkLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBWaXNpYmxlKQotewotICAgIENGWF9CeXRlVGV4dEJ1ZiBzRWRpdFN0cmVhbSwgc0xpbmVTdHJlYW0sIHNXb3JkczsKLSAgICBDUERGX1BvaW50IHB0T2xkKDAuMGYsIDAuMGYpLCBwdE5ldygwLjBmLCAwLjBmKTsKLSAgICBpbnQzMl90IG5DdXJGb250SW5kZXggPSAtMTsKLSAgICBpZiAocEl0ZXJhdG9yKSB7Ci0gICAgICAgIGlmIChwVmlzaWJsZSkgewotICAgICAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwVmlzaWJsZS0+QmVnaW5Qb3MpOworc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldFBERldvcmRTdHJpbmcoSVBWVF9Gb250TWFwKiBwRm9udE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgU3ViV29yZCkgeworICBDRlhfQnl0ZVN0cmluZyBzV29yZDsKKyAgaWYgKFN1YldvcmQgPiAwKSB7CisgICAgc1dvcmQuRm9ybWF0KCIlYyIsIFN1YldvcmQpOworICB9IGVsc2UgeworICAgIGlmIChwRm9udE1hcCkgeworICAgICAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkgeworICAgICAgICBpZiAocFBERkZvbnQtPkdldEJhc2VGb250KCkuQ29tcGFyZSgiU3ltYm9sIikgPT0gMCB8fAorICAgICAgICAgICAgcFBERkZvbnQtPkdldEJhc2VGb250KCkuQ29tcGFyZSgiWmFwZkRpbmdiYXRzIikgPT0gMCkgeworICAgICAgICAgIHNXb3JkLkZvcm1hdCgiJWMiLCBXb3JkKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBJdGVyYXRvci0+U2V0QXQoMCk7CisgICAgICAgICAgRlhfRFdPUkQgZHdDaGFyQ29kZSA9IHBQREZGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKFdvcmQpOworICAgICAgICAgIGlmIChkd0NoYXJDb2RlICE9IC0xKSB7CisgICAgICAgICAgICBwUERGRm9udC0+QXBwZW5kQ2hhcihzV29yZCwgZHdDaGFyQ29kZSk7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIENQVlRfV29yZFBsYWNlIG9sZHBsYWNlOwotICAgICAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7Ci0gICAgICAgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLSAgICAgICAgICAgIGlmIChwVmlzaWJsZSAmJiBwbGFjZS5Xb3JkQ21wKHBWaXNpYmxlLT5FbmRQb3MpID4gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc1dvcmQ7Cit9CitzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0V29yZFJlbmRlclN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyV29yZHMpIHsKKyAgaWYgKHN0cldvcmRzLkdldExlbmd0aCgpID4gMCkgeworICAgIHJldHVybiBQREZfRW5jb2RlU3RyaW5nKHN0cldvcmRzKSArICIgVGpcbiI7CisgIH0KKyAgcmV0dXJuICIiOworfQorc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEZvbnRTZXRTdHJpbmcoSVBWVF9Gb250TWFwKiBwRm9udE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICBDRlhfQnl0ZVRleHRCdWYgc1JldDsKKyAgaWYgKHBGb250TWFwKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRBbGlhcyA9IHBGb250TWFwLT5HZXRQREZGb250QWxpYXMobkZvbnRJbmRleCk7CisgICAgaWYgKHNGb250QWxpYXMuR2V0TGVuZ3RoKCkgPiAwICYmIGZGb250U2l6ZSA+IDApIHsKKyAgICAgIHNSZXQgPDwgIi8iIDw8IHNGb250QWxpYXMgPDwgIiAiIDw8IGZGb250U2l6ZSA8PCAiIFRmXG4iOworICAgIH0KKyAgfQorICByZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7Cit9CitzdGF0aWMgQ1BWVF9Db2xvciBQYXJzZUNvbG9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIHsKKyAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KHN0cik7CisgIHN5bnRheC5TZXRQb3MoMCk7CisgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKCJnIiwgMSkpIHsKKyAgICByZXR1cm4gQ1BWVF9Db2xvcihDVF9HUkFZLCBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpKTsKKyAgfQorICBzeW50YXguU2V0UG9zKDApOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgicmciLCAzKSkgeworICAgIEZYX0ZMT0FUIGYxID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKKyAgICBGWF9GTE9BVCBmMiA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CisgICAgRlhfRkxPQVQgZjMgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICAgIHJldHVybiBDUFZUX0NvbG9yKENUX1JHQiwgZjEsIGYyLCBmMyk7CisgIH0KKyAgc3ludGF4LlNldFBvcygwKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oImsiLCA0KSkgeworICAgIEZYX0ZMT0FUIGYxID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKKyAgICBGWF9GTE9BVCBmMiA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CisgICAgRlhfRkxPQVQgZjMgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICAgIEZYX0ZMT0FUIGY0ID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKKyAgICByZXR1cm4gQ1BWVF9Db2xvcihDVF9DTVlLLCBmMSwgZjIsIGYzLCBmNCk7CisgIH0KKyAgcmV0dXJuIENQVlRfQ29sb3IoQ1RfVFJBTlNQQVJFTlQpOworfQorc3RhdGljIENQVlRfQ29sb3IgUGFyc2VDb2xvcihjb25zdCBDUERGX0FycmF5JiBhcnJheSkgeworICBDUFZUX0NvbG9yIHJ0OworICBzd2l0Y2ggKGFycmF5LkdldENvdW50KCkpIHsKKyAgICBjYXNlIDE6CisgICAgICBydCA9IENQVlRfQ29sb3IoQ1RfR1JBWSwgYXJyYXkuR2V0RmxvYXQoMCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgcnQgPSBDUFZUX0NvbG9yKENUX1JHQiwgYXJyYXkuR2V0RmxvYXQoMCksIGFycmF5LkdldEZsb2F0KDEpLAorICAgICAgICAgICAgICAgICAgICAgIGFycmF5LkdldEZsb2F0KDIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIHJ0ID0gQ1BWVF9Db2xvcihDVF9DTVlLLCBhcnJheS5HZXRGbG9hdCgwKSwgYXJyYXkuR2V0RmxvYXQoMSksCisgICAgICAgICAgICAgICAgICAgICAgYXJyYXkuR2V0RmxvYXQoMiksIGFycmF5LkdldEZsb2F0KDMpKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBydDsKK30KK3N0YXRpYyBGWF9CT09MIEdlbmVyYXRlV2lkZ2V0QVAoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90JiBuV2lkZ2V0VHlwZSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCA9IE5VTEw7CisgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBSb290RGljdCA9IHBEb2MtPkdldFJvb3QoKSkgeworICAgIHBGb3JtRGljdCA9IHBSb290RGljdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgfQorICBpZiAoIXBGb3JtRGljdCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBEQTsKKyAgaWYgKENQREZfT2JqZWN0KiBwREFPYmogPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiREEiKSkgeworICAgIERBID0gcERBT2JqLT5HZXRTdHJpbmcoKTsKKyAgfQorICBpZiAoREEuSXNFbXB0eSgpKSB7CisgICAgREEgPSBwRm9ybURpY3QtPkdldFN0cmluZygiREEiKTsKKyAgfQorICBpZiAoREEuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChEQSk7CisgIHN5bnRheC5GaW5kVGFnUGFyYW0oIlRmIiwgMik7CisgIENGWF9CeXRlU3RyaW5nIHNGb250TmFtZSA9IHN5bnRheC5HZXRXb3JkKCk7CisgIHNGb250TmFtZSA9IFBERl9OYW1lRGVjb2RlKHNGb250TmFtZSk7CisgIGlmIChzRm9udE5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CisgIENQVlRfQ29sb3IgY3JUZXh0ID0gUGFyc2VDb2xvcihEQSk7CisgIEZYX0JPT0wgYlVzZUZvcm1SZXMgPSBGQUxTRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBOVUxMOworICBDUERGX0RpY3Rpb25hcnkqIHBEUkRpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJEUiIpKTsKKyAgaWYgKHBEUkRpY3QgPT0gTlVMTCkgeworICAgIHBEUkRpY3QgPSBwRm9ybURpY3QtPkdldERpY3QoRlhfQlNUUkMoIkRSIikpOworICAgIGJVc2VGb3JtUmVzID0gVFJVRTsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEUkZvbnREaWN0ID0gTlVMTDsKKyAgaWYgKHBEUkRpY3QgJiYgKHBEUkZvbnREaWN0ID0gcERSRGljdC0+R2V0RGljdCgiRm9udCIpKSkgeworICAgIHBGb250RGljdCA9IHBEUkZvbnREaWN0LT5HZXREaWN0KHNGb250TmFtZS5NaWQoMSkpOworICAgIGlmICghcEZvbnREaWN0ICYmICFiVXNlRm9ybVJlcykgeworICAgICAgcERSRGljdCA9IHBGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiRFIiKSk7CisgICAgICBwRFJGb250RGljdCA9IHBEUkRpY3QtPkdldERpY3QoIkZvbnQiKTsKKyAgICAgIGlmIChwRFJGb250RGljdCkgeworICAgICAgICBwRm9udERpY3QgPSBwRFJGb250RGljdC0+R2V0RGljdChzRm9udE5hbWUuTWlkKDEpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFwRFJGb250RGljdCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIXBGb250RGljdCkgeworICAgIHBGb250RGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CisgICAgaWYgKHBGb250RGljdCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBGb250RGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJUeXBlIiksICJGb250Iik7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgIlR5cGUxIik7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkJhc2VGb250IiksICJIZWx2ZXRpY2EiKTsKKyAgICBwRm9udERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiRW5jb2RpbmciKSwgIldpbkFuc2lFbmNvZGluZyIpOworICAgIHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBGb250RGljdCk7CisgICAgcERSRm9udERpY3QtPlNldEF0UmVmZXJlbmNlKHNGb250TmFtZS5NaWQoMSksIHBEb2MsIHBGb250RGljdCk7CisgIH0KKyAgQ1BERl9Gb250KiBwRGVmRm9udCA9IHBEb2MtPkxvYWRGb250KHBGb250RGljdCk7CisgIGlmICghcERlZkZvbnQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9SZWN0IHJjQW5ub3QgPSBwQW5ub3REaWN0LT5HZXRSZWN0KCJSZWN0Iik7CisgIGludDMyX3QgblJvdGF0ZSA9IDA7CisgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBNS0RpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0KCJNSyIpKSB7CisgICAgblJvdGF0ZSA9IHBNS0RpY3QtPkdldEludGVnZXIoIlIiKTsKKyAgfQorICBDUERGX1JlY3QgcmNCQm94OworICBDUERGX01hdHJpeCBtYXRyaXg7CisgIHN3aXRjaCAoblJvdGF0ZSAlIDM2MCkgeworICAgIGNhc2UgMDoKKyAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20pOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5MDoKKyAgICAgIG1hdHJpeCA9IENQREZfTWF0cml4KDAsIDEsIC0xLCAwLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LCAwKTsKKyAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxODA6CisgICAgICBtYXRyaXggPSBDUERGX01hdHJpeCgtMSwgMCwgMCwgLTEsIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKKyAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNzA6CisgICAgICBtYXRyaXggPSBDUERGX01hdHJpeCgwLCAtMSwgMSwgMCwgMCwgcmNBbm5vdC50b3AgLSByY0Fubm90LmJvdHRvbSk7CisgICAgICByY0JCb3ggPSBDUERGX1JlY3QoMCwgMCwgcmNBbm5vdC50b3AgLSByY0Fubm90LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0KTsKKyAgICAgIGJyZWFrOworICB9CisgIGludDMyX3QgbkJvcmRlclN0eWxlID0gUEJTX1NPTElEOworICBGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAxOworICBDUFZUX0Rhc2ggZHNCb3JkZXIoMywgMCwgMCk7CisgIENQVlRfQ29sb3IgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwQlNEaWN0ID0gcEFubm90RGljdC0+R2V0RGljdCgiQlMiKSkgeworICAgIGlmIChwQlNEaWN0LT5LZXlFeGlzdCgiVyIpKSB7CisgICAgICBmQm9yZGVyV2lkdGggPSBwQlNEaWN0LT5HZXROdW1iZXIoIlciKTsKKyAgICB9CisgICAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBCU0RpY3QtPkdldEFycmF5KCJEIikpIHsKKyAgICAgIGRzQm9yZGVyID0gQ1BWVF9EYXNoKHBBcnJheS0+R2V0SW50ZWdlcigwKSwgcEFycmF5LT5HZXRJbnRlZ2VyKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5HZXRJbnRlZ2VyKDIpKTsKKyAgICB9CisgICAgc3dpdGNoIChwQlNEaWN0LT5HZXRTdHJpbmcoIlMiKS5HZXRBdCgwKSkgeworICAgICAgY2FzZSAnUyc6CisgICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdEJzoKKyAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0RBU0g7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnQic6CisgICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19CRVZFTEVEOworICAgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKKyAgICAgICAgY3JMZWZ0VG9wID0gQ1BWVF9Db2xvcihDVF9HUkFZLCAxKTsKKyAgICAgICAgY3JSaWdodEJvdHRvbSA9IENQVlRfQ29sb3IoQ1RfR1JBWSwgMC41KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdJJzoKKyAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0lOU0VUOworICAgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKKyAgICAgICAgY3JMZWZ0VG9wID0gQ1BWVF9Db2xvcihDVF9HUkFZLCAwLjUpOworICAgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BWVF9Db2xvcihDVF9HUkFZLCAwLjc1KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdVJzoKKyAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1VOREVSTElORUQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBDUFZUX0NvbG9yIGNyQm9yZGVyLCBjckJHOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwTUtEaWN0ID0gcEFubm90RGljdC0+R2V0RGljdCgiTUsiKSkgeworICAgIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwTUtEaWN0LT5HZXRBcnJheSgiQkMiKSkgeworICAgICAgY3JCb3JkZXIgPSBQYXJzZUNvbG9yKCpwQXJyYXkpOworICAgIH0KKyAgICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcE1LRGljdC0+R2V0QXJyYXkoIkJHIikpIHsKKyAgICAgIGNyQkcgPSBQYXJzZUNvbG9yKCpwQXJyYXkpOworICAgIH0KKyAgfQorICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc0JHID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JCRywgVFJVRSk7CisgIGlmIChzQkcuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQkcgPDwgcmNCQm94LmxlZnQgPDwgIiAiIDw8IHJjQkJveC5ib3R0b20gPDwgIiAiCisgICAgICAgICAgICAgICA8PCByY0JCb3guV2lkdGgoKSA8PCAiICIgPDwgcmNCQm94LkhlaWdodCgpIDw8ICIgcmUgZlxuIgorICAgICAgICAgICAgICAgPDwgIlFcbiI7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgc0JvcmRlclN0cmVhbSA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVCb3JkZXJBUCgKKyAgICAgIHJjQkJveCwgZkJvcmRlcldpZHRoLCBjckJvcmRlciwgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsCisgICAgICBkc0JvcmRlcik7CisgIGlmIChzQm9yZGVyU3RyZWFtLkdldExlbmd0aCgpID4gMCkgeworICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0JvcmRlclN0cmVhbSA8PCAiUVxuIjsKKyAgfQorICBDUERGX1JlY3QgcmNCb2R5ID0KKyAgICAgIENQREZfUmVjdChyY0JCb3gubGVmdCArIGZCb3JkZXJXaWR0aCwgcmNCQm94LmJvdHRvbSArIGZCb3JkZXJXaWR0aCwKKyAgICAgICAgICAgICAgICByY0JCb3gucmlnaHQgLSBmQm9yZGVyV2lkdGgsIHJjQkJveC50b3AgLSBmQm9yZGVyV2lkdGgpOworICByY0JvZHkuTm9ybWFsaXplKCk7CisgIENQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IHBBbm5vdERpY3QtPkdldERpY3QoIkFQIik7CisgIGlmIChwQVBEaWN0ID09IE5VTEwpIHsKKyAgICBwQVBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKKyAgICBpZiAocEFQRGljdCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBbm5vdERpY3QtPlNldEF0KCJBUCIsIHBBUERpY3QpOworICB9CisgIENQREZfU3RyZWFtKiBwTm9ybWFsU3RyZWFtID0gcEFQRGljdC0+R2V0U3RyZWFtKCJOIik7CisgIGlmIChwTm9ybWFsU3RyZWFtID09IE5VTEwpIHsKKyAgICBwTm9ybWFsU3RyZWFtID0gQ1BERl9TdHJlYW06OkNyZWF0ZShOVUxMLCAwLCBOVUxMKTsKKyAgICBpZiAocE5vcm1hbFN0cmVhbSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGludDMyX3Qgb2JqbnVtID0gcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocE5vcm1hbFN0cmVhbSk7CisgICAgcEFubm90RGljdC0+R2V0RGljdCgiQVAiKS0+U2V0QXRSZWZlcmVuY2UoIk4iLCBwRG9jLCBvYmpudW0pOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFN0cmVhbURpY3QgPSBwTm9ybWFsU3RyZWFtLT5HZXREaWN0KCk7CisgIGlmIChwU3RyZWFtRGljdCkgeworICAgIHBTdHJlYW1EaWN0LT5TZXRBdE1hdHJpeCgiTWF0cml4IiwgbWF0cml4KTsKKyAgICBwU3RyZWFtRGljdC0+U2V0QXRSZWN0KCJCQm94IiwgcmNCQm94KTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOworICAgIGlmIChwU3RyZWFtUmVzTGlzdCkgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzRm9udExpc3QgPSBwU3RyZWFtUmVzTGlzdC0+R2V0RGljdCgiRm9udCIpOworICAgICAgaWYgKCFwU3RyZWFtUmVzRm9udExpc3QpIHsKKyAgICAgICAgcFN0cmVhbVJlc0ZvbnRMaXN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKKyAgICAgICAgaWYgKHBTdHJlYW1SZXNGb250TGlzdCA9PSBOVUxMKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIHBTdHJlYW1SZXNMaXN0LT5TZXRBdCgiRm9udCIsIHBTdHJlYW1SZXNGb250TGlzdCk7CisgICAgICB9CisgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdC0+S2V5RXhpc3Qoc0ZvbnROYW1lKSkgeworICAgICAgICBwU3RyZWFtUmVzRm9udExpc3QtPlNldEF0UmVmZXJlbmNlKHNGb250TmFtZSwgcERvYywgcEZvbnREaWN0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcFN0cmVhbURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwRm9ybURpY3QtPkdldERpY3QoIkRSIiktPkNsb25lKCkpOworICAgICAgcFN0cmVhbVJlc0xpc3QgPSBwU3RyZWFtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7CisgICAgfQorICB9CisgIHN3aXRjaCAobldpZGdldFR5cGUpIHsKKyAgICBjYXNlIDA6IHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPQorICAgICAgICAgIEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJWIikKKyAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiViIpLT5HZXRVbmljb2RlVGV4dCgpCisgICAgICAgICAgICAgIDogQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgICAgIGludDMyX3QgbkFsaWduID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiUSIpLT5HZXRJbnRlZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRmYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJGZiIpLT5HZXRJbnRlZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgRlhfRFdPUkQgZHdNYXhMZW4gPQorICAgICAgICAgIEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJNYXhMZW4iKQorICAgICAgICAgICAgICA/IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJNYXhMZW4iKS0+R2V0SW50ZWdlcigpCisgICAgICAgICAgICAgIDogMDsKKyAgICAgIENQVlRfRm9udE1hcCBtYXAocERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURpY3QgPyBwU3RyZWFtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIikgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBwRGVmRm9udCwgc0ZvbnROYW1lLlJpZ2h0KHNGb250TmFtZS5HZXRMZW5ndGgoKSAtIDEpKTsKKyAgICAgIENQVlRfUHJvdmlkZXIgcHJkKCZtYXApOworICAgICAgQ1BERl9WYXJpYWJsZVRleHQgdnQ7CisgICAgICB2dC5TZXRQcm92aWRlcigmcHJkKTsKKyAgICAgIHZ0LlNldFBsYXRlUmVjdChyY0JvZHkpOworICAgICAgdnQuU2V0QWxpZ25tZW50KG5BbGlnbik7CisgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgeworICAgICAgICB2dC5TZXRBdXRvRm9udFNpemUoVFJVRSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2dC5TZXRGb250U2l6ZShmRm9udFNpemUpOworICAgICAgfQorICAgICAgRlhfQk9PTCBiTXVsdGlMaW5lID0gKGR3RmxhZ3MgPj4gMTIpICYgMTsKKyAgICAgIGlmIChiTXVsdGlMaW5lKSB7CisgICAgICAgIHZ0LlNldE11bHRpTGluZShUUlVFKTsKKyAgICAgICAgdnQuU2V0QXV0b1JldHVybihUUlVFKTsKKyAgICAgIH0KKyAgICAgIEZYX1dPUkQgc3ViV29yZCA9IDA7CisgICAgICBpZiAoKGR3RmxhZ3MgPj4gMTMpICYgMSkgeworICAgICAgICBzdWJXb3JkID0gJyonOworICAgICAgICB2dC5TZXRQYXNzd29yZENoYXIoc3ViV29yZCk7CisgICAgICB9CisgICAgICBGWF9CT09MIGJDaGFyQXJyYXkgPSAoZHdGbGFncyA+PiAyNCkgJiAxOworICAgICAgaWYgKGJDaGFyQXJyYXkpIHsKKyAgICAgICAgdnQuU2V0Q2hhckFycmF5KGR3TWF4TGVuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZ0LlNldExpbWl0Q2hhcihkd01heExlbik7CisgICAgICB9CisgICAgICB2dC5Jbml0aWFsaXplKCk7CisgICAgICB2dC5TZXRUZXh0KHN3VmFsdWUuY19zdHIoKSk7CisgICAgICB2dC5SZWFycmFuZ2VBbGwoKTsKKyAgICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSB2dC5HZXRDb250ZW50UmVjdCgpOworICAgICAgQ1BERl9Qb2ludCBwdE9mZnNldCgwLjBmLCAwLjBmKTsKKyAgICAgIGlmICghYk11bHRpTGluZSkgeworICAgICAgICBwdE9mZnNldCA9CisgICAgICAgICAgICBDUERGX1BvaW50KDAuMGYsIChyY0NvbnRlbnQuSGVpZ2h0KCkgLSByY0JvZHkuSGVpZ2h0KCkpIC8gMi4wZik7CisgICAgICB9CisgICAgICBDRlhfQnl0ZVN0cmluZyBzQm9keSA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoCisgICAgICAgICAgJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgcHRPZmZzZXQsICFiQ2hhckFycmF5LCBzdWJXb3JkKTsKKyAgICAgIGlmIChzQm9keS5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgc0FwcFN0cmVhbSA8PCAiL1R4IEJNQ1xuIgorICAgICAgICAgICAgICAgICAgIDw8ICJxXG4iOworICAgICAgICBpZiAocmNDb250ZW50LldpZHRoKCkgPiByY0JvZHkuV2lkdGgoKSB8fAorICAgICAgICAgICAgcmNDb250ZW50LkhlaWdodCgpID4gcmNCb2R5LkhlaWdodCgpKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCByY0JvZHkubGVmdCA8PCAiICIgPDwgcmNCb2R5LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJjQm9keS5XaWR0aCgpIDw8ICIgIiA8PCByY0JvZHkuSGVpZ2h0KCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgcmVcbldcbm5cbiI7CisgICAgICAgIH0KKyAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCBUUlVFKQorICAgICAgICAgICAgICAgICAgIDw8IHNCb2R5IDw8ICJFVFxuIgorICAgICAgICAgICAgICAgICAgIDw8ICJRXG5FTUNcbiI7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIDE6IHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPQorICAgICAgICAgIEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJWIikKKyAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiViIpLT5HZXRVbmljb2RlVGV4dCgpCisgICAgICAgICAgICAgIDogQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgICAgIENQVlRfRm9udE1hcCBtYXAocERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURpY3QgPyBwU3RyZWFtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIikgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBwRGVmRm9udCwgc0ZvbnROYW1lLlJpZ2h0KHNGb250TmFtZS5HZXRMZW5ndGgoKSAtIDEpKTsKKyAgICAgIENQVlRfUHJvdmlkZXIgcHJkKCZtYXApOworICAgICAgQ1BERl9WYXJpYWJsZVRleHQgdnQ7CisgICAgICB2dC5TZXRQcm92aWRlcigmcHJkKTsKKyAgICAgIENQREZfUmVjdCByY0J1dHRvbiA9IHJjQm9keTsKKyAgICAgIHJjQnV0dG9uLmxlZnQgPSByY0J1dHRvbi5yaWdodCAtIDEzOworICAgICAgcmNCdXR0b24uTm9ybWFsaXplKCk7CisgICAgICBDUERGX1JlY3QgcmNFZGl0ID0gcmNCb2R5OworICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNCdXR0b24ubGVmdDsKKyAgICAgIHJjRWRpdC5Ob3JtYWxpemUoKTsKKyAgICAgIHZ0LlNldFBsYXRlUmVjdChyY0VkaXQpOworICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpIHsKKyAgICAgICAgdnQuU2V0QXV0b0ZvbnRTaXplKFRSVUUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdnQuU2V0Rm9udFNpemUoZkZvbnRTaXplKTsKKyAgICAgIH0KKyAgICAgIHZ0LkluaXRpYWxpemUoKTsKKyAgICAgIHZ0LlNldFRleHQoc3dWYWx1ZS5jX3N0cigpKTsKKyAgICAgIHZ0LlJlYXJyYW5nZUFsbCgpOworICAgICAgQ1BERl9SZWN0IHJjQ29udGVudCA9IHZ0LkdldENvbnRlbnRSZWN0KCk7CisgICAgICBDUERGX1BvaW50IHB0T2Zmc2V0ID0KKyAgICAgICAgICBDUERGX1BvaW50KDAuMGYsIChyY0NvbnRlbnQuSGVpZ2h0KCkgLSByY0VkaXQuSGVpZ2h0KCkpIC8gMi4wZik7CisgICAgICBDRlhfQnl0ZVN0cmluZyBzRWRpdCA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoCisgICAgICAgICAgJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgcHRPZmZzZXQsIFRSVUUsIDApOworICAgICAgaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkgeworICAgICAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iCisgICAgICAgICAgICAgICAgICAgPDwgInFcbiI7CisgICAgICAgIHNBcHBTdHJlYW0gPDwgcmNFZGl0LmxlZnQgPDwgIiAiIDw8IHJjRWRpdC5ib3R0b20gPDwgIiAiCisgICAgICAgICAgICAgICAgICAgPDwgcmNFZGl0LldpZHRoKCkgPDwgIiAiIDw8IHJjRWRpdC5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOworICAgICAgICBzQXBwU3RyZWFtIDw8ICJCVFxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjclRleHQsIFRSVUUpCisgICAgICAgICAgICAgICAgICAgPDwgc0VkaXQgPDwgIkVUXG4iCisgICAgICAgICAgICAgICAgICAgPDwgIlFcbkVNQ1xuIjsKKyAgICAgIH0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHNCdXR0b24gPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUCgKKyAgICAgICAgICBDUFZUX0NvbG9yKENUX1JHQiwgMjIwLjBmIC8gMjU1LjBmLCAyMjAuMGYgLyAyNTUuMGYsIDIyMC4wZiAvIDI1NS4wZiksCisgICAgICAgICAgVFJVRSk7CisgICAgICBpZiAoc0J1dHRvbi5HZXRMZW5ndGgoKSA+IDAgJiYgIXJjQnV0dG9uLklzRW1wdHkoKSkgeworICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHNCdXR0b247CisgICAgICAgIHNBcHBTdHJlYW0gPDwgcmNCdXR0b24ubGVmdCA8PCAiICIgPDwgcmNCdXR0b24uYm90dG9tIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IHJjQnV0dG9uLldpZHRoKCkgPDwgIiAiIDw8IHJjQnV0dG9uLkhlaWdodCgpIDw8ICIgcmUgZlxuIjsKKyAgICAgICAgc0FwcFN0cmVhbSA8PCAiUVxuIjsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0J1dHRvbkJvcmRlciA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVCb3JkZXJBUCgKKyAgICAgICAgICAgIHJjQnV0dG9uLCAyLCBDUFZUX0NvbG9yKENUX0dSQVksIDApLCBDUFZUX0NvbG9yKENUX0dSQVksIDEpLAorICAgICAgICAgICAgQ1BWVF9Db2xvcihDVF9HUkFZLCAwLjUpLCBQQlNfQkVWRUxFRCwgQ1BWVF9EYXNoKDMsIDAsIDApKTsKKyAgICAgICAgaWYgKHNCdXR0b25Cb3JkZXIuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uQm9yZGVyIDw8ICJRXG4iOworICAgICAgICB9CisgICAgICAgIENQREZfUG9pbnQgcHRDZW50ZXIgPSBDUERGX1BvaW50KChyY0J1dHRvbi5sZWZ0ICsgcmNCdXR0b24ucmlnaHQpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJjQnV0dG9uLnRvcCArIHJjQnV0dG9uLmJvdHRvbSkgLyAyKTsKKyAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocmNCdXR0b24uV2lkdGgoKSwgNikgJiYKKyAgICAgICAgICAgIElzRmxvYXRCaWdnZXIocmNCdXR0b24uSGVpZ2h0KCksIDYpKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIgorICAgICAgICAgICAgICAgICAgICAgPDwgIiAwIGdcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54IC0gMyA8PCAiICIgPDwgcHRDZW50ZXIueSArIDEuNWYgPDwgIiBtXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcHRDZW50ZXIueCArIDMgPDwgIiAiIDw8IHB0Q2VudGVyLnkgKyAxLjVmIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggPDwgIiAiIDw8IHB0Q2VudGVyLnkgLSAxLjVmIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggLSAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIGwgZlxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNCdXR0b24gPDwgIlFcbiI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgMjogeworICAgICAgQ1BWVF9Gb250TWFwIG1hcChwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGljdCA/IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIHBEZWZGb250LCBzRm9udE5hbWUuUmlnaHQoc0ZvbnROYW1lLkdldExlbmd0aCgpIC0gMSkpOworICAgICAgQ1BWVF9Qcm92aWRlciBwcmQoJm1hcCk7CisgICAgICBDUERGX0FycmF5KiBwT3B0cyA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJPcHQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiT3B0IiktPkdldEFycmF5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgIENQREZfQXJyYXkqIHBTZWxzID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkkiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiSSIpLT5HZXRBcnJheSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICBpbnQzMl90IG5Ub3AgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiVEkiKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlRJIiktPkdldEludGVnZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgIENGWF9CeXRlVGV4dEJ1ZiBzQm9keTsKKyAgICAgIGlmIChwT3B0cykgeworICAgICAgICBGWF9GTE9BVCBmeSA9IHJjQm9keS50b3A7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gblRvcCwgc3ogPSBwT3B0cy0+R2V0Q291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIoZnksIHJjQm9keS5ib3R0b20pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKENQREZfT2JqZWN0KiBwT3B0ID0gcE9wdHMtPkdldEVsZW1lbnRWYWx1ZShpKSkgeworICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dJdGVtOworICAgICAgICAgICAgaWYgKHBPcHQtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSSU5HKSB7CisgICAgICAgICAgICAgIHN3SXRlbSA9IHBPcHQtPkdldFVuaWNvZGVUZXh0KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBPcHQtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICAgICAgICAgICAgc3dJdGVtID0KKyAgICAgICAgICAgICAgICAgICgoQ1BERl9BcnJheSopcE9wdCktPkdldEVsZW1lbnRWYWx1ZSgxKS0+R2V0VW5pY29kZVRleHQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiQ29udGludW91cykgewotICAgICAgICAgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKG9sZHBsYWNlKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzV29yZHMuR2V0U2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhzV29yZHMuR2V0Qnl0ZVN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IHNMaW5lU3RyZWFtOwotICAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVTdHJlYW0uQ2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNXb3Jkcy5DbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENQVlRfV29yZCB3b3JkOwotICAgICAgICAgICAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENQVlRfTGluZSBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHROZXcgPSBDUERGX1BvaW50KGxpbmUucHRMaW5lLnggKyBwdE9mZnNldC54LCBsaW5lLnB0TGluZS55ICsgcHRPZmZzZXQueSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHB0TmV3LnggIT0gcHRPbGQueCB8fCBwdE5ldy55ICE9IHB0T2xkLnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNMaW5lU3RyZWFtIDw8IHB0TmV3LnggLSBwdE9sZC54IDw8ICIgIiA8PCBwdE5ldy55IC0gcHRPbGQueSA8PCAiIFRkXG4iOwotICAgICAgICAgICAgICAgICAgICAgICAgcHRPbGQgPSBwdE5ldzsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwU2VscykgeworICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIHMgPSAwLCBzc3ogPSBwU2Vscy0+R2V0Q291bnQoKTsgcyA8IHNzejsgcysrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gcFNlbHMtPkdldEludGVnZXIocykpIHsKKyAgICAgICAgICAgICAgICAgIGJTZWxlY3RlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7Ci0gICAgICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAod29yZC5uRm9udEluZGV4ICE9IG5DdXJGb250SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzV29yZHMuR2V0U2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNMaW5lU3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoc1dvcmRzLkdldEJ5dGVTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1dvcmRzLkNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzTGluZVN0cmVhbSA8PCBHZXRGb250U2V0U3RyaW5nKHBGb250TWFwLCB3b3JkLm5Gb250SW5kZXgsIHdvcmQuZkZvbnRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5DdXJGb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc1dvcmRzIDw8IEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIG5DdXJGb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9sZHBsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENQREZfVmFyaWFibGVUZXh0IHZ0OworICAgICAgICAgICAgdnQuU2V0UHJvdmlkZXIoJnByZCk7CisgICAgICAgICAgICB2dC5TZXRQbGF0ZVJlY3QoQ1BERl9SZWN0KHJjQm9keS5sZWZ0LCAwLjBmLCByY0JvZHkucmlnaHQsIDAuMGYpKTsKKyAgICAgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKSB7CisgICAgICAgICAgICAgIHZ0LlNldEZvbnRTaXplKDEyLjBmKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7Ci0gICAgICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgewotICAgICAgICAgICAgICAgICAgICBwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHB0TmV3LnggIT0gcHRPbGQueCB8fCBwdE5ldy55ICE9IHB0T2xkLnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IHB0TmV3LnggLSBwdE9sZC54IDw8ICIgIiA8PCBwdE5ldy55IC0gcHRPbGQueSA8PCAiIFRkXG4iOwotICAgICAgICAgICAgICAgICAgICAgICAgcHRPbGQgPSBwdE5ldzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAod29yZC5uRm9udEluZGV4ICE9IG5DdXJGb250SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IEdldEZvbnRTZXRTdHJpbmcocEZvbnRNYXAsIHdvcmQubkZvbnRJbmRleCwgd29yZC5mRm9udFNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbkN1ckZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIG5DdXJGb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdnQuU2V0Rm9udFNpemUoZkZvbnRTaXplKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZ0LkluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIHZ0LlNldFRleHQoc3dJdGVtLmNfc3RyKCkpOworICAgICAgICAgICAgdnQuUmVhcnJhbmdlQWxsKCk7CisgICAgICAgICAgICBGWF9GTE9BVCBmSXRlbUhlaWdodCA9IHZ0LkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgICAgICAgICBpZiAoYlNlbGVjdGVkKSB7CisgICAgICAgICAgICAgIENQREZfUmVjdCByY0l0ZW0gPQorICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0KHJjQm9keS5sZWZ0LCBmeSAtIGZJdGVtSGVpZ2h0LCByY0JvZHkucmlnaHQsIGZ5KTsKKyAgICAgICAgICAgICAgc0JvZHkgPDwgInFcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX0NvbG9yKENUX1JHQiwgMCwgNTEuMGYgLyAyNTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMy4wZiAvIDI1NS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKQorICAgICAgICAgICAgICAgICAgICA8PCByY0l0ZW0ubGVmdCA8PCAiICIgPDwgcmNJdGVtLmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgPDwgcmNJdGVtLldpZHRoKCkgPDwgIiAiIDw8IHJjSXRlbS5IZWlnaHQoKSA8PCAiIHJlIGZcbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIlFcbiI7CisgICAgICAgICAgICAgIHNCb2R5IDw8ICJCVFxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX0NvbG9yKENUX0dSQVksIDEpLCBUUlVFKQorICAgICAgICAgICAgICAgICAgICA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludCgwLjBmLCBmeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgMCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkVUXG4iOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc0JvZHkgPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNyVGV4dCwgVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQoMC4wZiwgZnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIDApCisgICAgICAgICAgICAgICAgICAgIDw8ICJFVFxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ5IC09IGZJdGVtSGVpZ2h0OworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoc1dvcmRzLkdldFNpemUoKSA+IDApIHsKKyAgICAgIH0KKyAgICAgIGlmIChzQm9keS5HZXRTaXplKCkgPiAwKSB7CisgICAgICAgIHNBcHBTdHJlYW0gPDwgIi9UeCBCTUNcbiIKKyAgICAgICAgICAgICAgICAgICA8PCAicVxuIjsKKyAgICAgICAgc0FwcFN0cmVhbSA8PCByY0JvZHkubGVmdCA8PCAiICIgPDwgcmNCb2R5LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCByY0JvZHkuV2lkdGgoKSA8PCAiICIgPDwgcmNCb2R5LkhlaWdodCgpIDw8ICIgcmVcbldcbm5cbiI7CisgICAgICAgIHNBcHBTdHJlYW0gPDwgc0JvZHkuR2V0Qnl0ZVN0cmluZygpIDw8ICJRXG5FTUNcbiI7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgfQorICBpZiAocE5vcm1hbFN0cmVhbSkgeworICAgIHBOb3JtYWxTdHJlYW0tPlNldERhdGEoKHVpbnQ4X3QqKXNBcHBTdHJlYW0uR2V0QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKKyAgICBwU3RyZWFtRGljdCA9IHBOb3JtYWxTdHJlYW0tPkdldERpY3QoKTsKKyAgICBpZiAocFN0cmVhbURpY3QpIHsKKyAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdE1hdHJpeCgiTWF0cml4IiwgbWF0cml4KTsKKyAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdFJlY3QoIkJCb3giLCByY0JCb3gpOworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKKyAgICAgIGlmIChwU3RyZWFtUmVzTGlzdCkgeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNGb250TGlzdCA9IHBTdHJlYW1SZXNMaXN0LT5HZXREaWN0KCJGb250Iik7CisgICAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0KSB7CisgICAgICAgICAgcFN0cmVhbVJlc0ZvbnRMaXN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKKyAgICAgICAgICBpZiAocFN0cmVhbVJlc0ZvbnRMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgICAgcFN0cmVhbVJlc0xpc3QtPlNldEF0KCJGb250IiwgcFN0cmVhbVJlc0ZvbnRMaXN0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdC0+S2V5RXhpc3Qoc0ZvbnROYW1lKSkgeworICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdC0+U2V0QXRSZWZlcmVuY2Uoc0ZvbnROYW1lLCBwRG9jLCBwRm9udERpY3QpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwU3RyZWFtRGljdC0+U2V0QXQoIlJlc291cmNlcyIsIHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKS0+Q2xvbmUoKSk7CisgICAgICAgIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVRleHRGaWVsZEFQKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIHsKKyAgcmV0dXJuIEdlbmVyYXRlV2lkZ2V0QVAocERvYywgcEFubm90RGljdCwgMCk7Cit9CitGWF9CT09MIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb21ib0JveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgeworICByZXR1cm4gR2VuZXJhdGVXaWRnZXRBUChwRG9jLCBwQW5ub3REaWN0LCAxKTsKK30KK0ZYX0JPT0wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUxpc3RCb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgeworICByZXR1cm4gR2VuZXJhdGVXaWRnZXRBUChwRG9jLCBwQW5ub3REaWN0LCAyKTsKK30KK0NGWF9CeXRlU3RyaW5nIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoCisgICAgSVBWVF9Gb250TWFwKiBwRm9udE1hcCwKKyAgICBJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yLAorICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgIEZYX0JPT0wgYkNvbnRpbnVvdXMsCisgICAgRlhfV09SRCBTdWJXb3JkLAorICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwVmlzaWJsZSkgeworICBDRlhfQnl0ZVRleHRCdWYgc0VkaXRTdHJlYW0sIHNMaW5lU3RyZWFtLCBzV29yZHM7CisgIENQREZfUG9pbnQgcHRPbGQoMC4wZiwgMC4wZiksIHB0TmV3KDAuMGYsIDAuMGYpOworICBpbnQzMl90IG5DdXJGb250SW5kZXggPSAtMTsKKyAgaWYgKHBJdGVyYXRvcikgeworICAgIGlmIChwVmlzaWJsZSkgeworICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwVmlzaWJsZS0+QmVnaW5Qb3MpOworICAgIH0gZWxzZSB7CisgICAgICBwSXRlcmF0b3ItPlNldEF0KDApOworICAgIH0KKyAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKKyAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgIGlmIChwVmlzaWJsZSAmJiBwbGFjZS5Xb3JkQ21wKHBWaXNpYmxlLT5FbmRQb3MpID4gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChiQ29udGludW91cykgeworICAgICAgICBpZiAocGxhY2UuTGluZUNtcChvbGRwbGFjZSkgIT0gMCkgeworICAgICAgICAgIGlmIChzV29yZHMuR2V0U2l6ZSgpID4gMCkgewogICAgICAgICAgICAgc0xpbmVTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhzV29yZHMuR2V0Qnl0ZVN0cmluZygpKTsKICAgICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IHNMaW5lU3RyZWFtOworICAgICAgICAgICAgc0xpbmVTdHJlYW0uQ2xlYXIoKTsKICAgICAgICAgICAgIHNXb3Jkcy5DbGVhcigpOworICAgICAgICAgIH0KKyAgICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgICBwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5wdFdvcmQueSArIHB0T2Zmc2V0LnkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDUFZUX0xpbmUgbGluZTsKKyAgICAgICAgICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5lKTsKKyAgICAgICAgICAgIHB0TmV3ID0gQ1BERl9Qb2ludChsaW5lLnB0TGluZS54ICsgcHRPZmZzZXQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnB0TGluZS55ICsgcHRPZmZzZXQueSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChwdE5ldy54ICE9IHB0T2xkLnggfHwgcHROZXcueSAhPSBwdE9sZC55KSB7CisgICAgICAgICAgICBzTGluZVN0cmVhbSA8PCBwdE5ldy54IC0gcHRPbGQueCA8PCAiICIgPDwgcHROZXcueSAtIHB0T2xkLnkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgVGRcbiI7CisgICAgICAgICAgICBwdE9sZCA9IHB0TmV3OworICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc0VkaXRTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUJvcmRlckFQKGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0ZMT0FUIGZXaWR0aCwKLSAgICAgICAgY29uc3QgQ1BWVF9Db2xvciAmIGNvbG9yLCBjb25zdCBDUFZUX0NvbG9yICYgY3JMZWZ0VG9wLCBjb25zdCBDUFZUX0NvbG9yICYgY3JSaWdodEJvdHRvbSwKLSAgICAgICAgaW50MzJfdCBuU3R5bGUsIGNvbnN0IENQVlRfRGFzaCAmIGRhc2gpCi17Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc0NvbG9yOwotICAgIEZYX0ZMT0FUIGZMZWZ0ID0gcmVjdC5sZWZ0OwotICAgIEZYX0ZMT0FUIGZSaWdodCA9IHJlY3QucmlnaHQ7Ci0gICAgRlhfRkxPQVQgZlRvcCA9IHJlY3QudG9wOwotICAgIEZYX0ZMT0FUIGZCb3R0b20gPSByZWN0LmJvdHRvbTsKLSAgICBpZiAoZldpZHRoID4gMC4wZikgewotICAgICAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsKLSAgICAgICAgc3dpdGNoIChuU3R5bGUpIHsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBjYXNlIFBCU19TT0xJRDoKLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY29sb3IsIFRSVUUpOwotICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PCBmUmlnaHQgLSBmTGVmdCA8PCAiICIgPDwgZlRvcCAtIGZCb3R0b20gPDwgIiByZVxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCA8PCAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmUmlnaHQgLSBmTGVmdCAtIGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmQm90dG9tIC0gZldpZHRoICogMiA8PCAiIHJlXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJmKlxuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBCU19EQVNIOgotICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgRkFMU0UpOwotICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZXaWR0aCA8PCAiIHciIDw8ICIgWyIgPDwgZGFzaC5uRGFzaCA8PCAiICIgPDwgZGFzaC5uR2FwIDw8ICJdICIgPDwgZGFzaC5uUGhhc2UgPDwgIiBkXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIgPDwgIiBtXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZlRvcCAtIGZXaWR0aCAvIDIgPDwgIiBsXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZUb3AgLSBmV2lkdGggLyAyIDw8ICIgbFxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMiA8PCAiIGxcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMiA8PCAiIGwgU1xuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBCU19CRVZFTEVEOgotICAgICAgICAgICAgY2FzZSBQQlNfSU5TRVQ6Ci0gICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNyTGVmdFRvcCwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCA8PCAiIG1cbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCA8PCAiIGxcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggPDwgIiBsXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMiA8PCAiIGxcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY3JSaWdodEJvdHRvbSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwJZlRvcCAtIGZIYWxmV2lkdGggPDwgIiBtXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggPDwgIiAiIDw8CWZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgbFxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IAlmQm90dG9tICsgZkhhbGZXaWR0aCA8PCAiIGxcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbFxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbFxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY29sb3IsIFRSVUUpOwotICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PAlmUmlnaHQgLSBmTGVmdCA8PCAiICIgPDwgZlRvcCAtIGZCb3R0b20gPDwgIiByZVxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZSaWdodCAtIGZMZWZ0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmQm90dG9tIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiByZSBmKlxuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBCU19VTkRFUkxJTkVEOgotICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgRkFMU0UpOwotICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZXaWR0aCA8PCAiIHdcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbVxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbCBTXG4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBpZiAod29yZC5uRm9udEluZGV4ICE9IG5DdXJGb250SW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChzV29yZHMuR2V0U2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICBzTGluZVN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKHNXb3Jkcy5HZXRCeXRlU3RyaW5nKCkpOworICAgICAgICAgICAgICBzV29yZHMuQ2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNMaW5lU3RyZWFtIDw8IEdldEZvbnRTZXRTdHJpbmcocEZvbnRNYXAsIHdvcmQubkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5mRm9udFNpemUpOworICAgICAgICAgICAgbkN1ckZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKKyAgICAgICAgICB9CisgICAgICAgICAgc1dvcmRzIDw8IEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIG5DdXJGb250SW5kZXgsIHdvcmQuV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJXb3JkKTsKICAgICAgICAgfQorICAgICAgICBvbGRwbGFjZSA9IHBsYWNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KTsKKyAgICAgICAgICBpZiAocHROZXcueCAhPSBwdE9sZC54IHx8IHB0TmV3LnkgIT0gcHRPbGQueSkgeworICAgICAgICAgICAgc0VkaXRTdHJlYW0gPDwgcHROZXcueCAtIHB0T2xkLnggPDwgIiAiIDw8IHB0TmV3LnkgLSBwdE9sZC55CisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFRkXG4iOworICAgICAgICAgICAgcHRPbGQgPSBwdE5ldzsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHdvcmQubkZvbnRJbmRleCAhPSBuQ3VyRm9udEluZGV4KSB7CisgICAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRGb250U2V0U3RyaW5nKHBGb250TWFwLCB3b3JkLm5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQuZkZvbnRTaXplKTsKKyAgICAgICAgICAgIG5DdXJGb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7CisgICAgICAgICAgfQorICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoCisgICAgICAgICAgICAgIEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIG5DdXJGb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCkpOworICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKKyAgICBpZiAoc1dvcmRzLkdldFNpemUoKSA+IDApIHsKKyAgICAgIHNMaW5lU3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoc1dvcmRzLkdldEJ5dGVTdHJpbmcoKSk7CisgICAgICBzRWRpdFN0cmVhbSA8PCBzTGluZVN0cmVhbTsKKyAgICAgIHNXb3Jkcy5DbGVhcigpOworICAgIH0KKyAgfQorICByZXR1cm4gc0VkaXRTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY29uc3QgQ1BWVF9Db2xvciAmIGNvbG9yLCBjb25zdCBGWF9CT09MICYgYkZpbGxPclN0cm9rZSkKLXsKLSAgICBDRlhfQnl0ZVRleHRCdWYgc0NvbG9yU3RyZWFtOwotICAgIHN3aXRjaCAoY29sb3IubkNvbG9yVHlwZSkgewotICAgICAgICBjYXNlIENUX1JHQjoKLSAgICAgICAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChiRmlsbE9yU3Ryb2tlID8gInJnIiA6ICJSRyIpIDw8ICJcbiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDVF9HUkFZOgotICAgICAgICAgICAgc0NvbG9yU3RyZWFtIDw8IGNvbG9yLmZDb2xvcjEgPDwgIiAiIDw8IChiRmlsbE9yU3Ryb2tlID8gImciIDogIkciKSA8PCAiXG4iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1RfQ01ZSzoKLSAgICAgICAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIiA8PCBjb2xvci5mQ29sb3I0IDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChiRmlsbE9yU3Ryb2tlID8gImsiIDogIksiKSA8PCAiXG4iOwotICAgICAgICAgICAgYnJlYWs7CitDRlhfQnl0ZVN0cmluZyBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQm9yZGVyQVAoCisgICAgY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgIEZYX0ZMT0FUIGZXaWR0aCwKKyAgICBjb25zdCBDUFZUX0NvbG9yJiBjb2xvciwKKyAgICBjb25zdCBDUFZUX0NvbG9yJiBjckxlZnRUb3AsCisgICAgY29uc3QgQ1BWVF9Db2xvciYgY3JSaWdodEJvdHRvbSwKKyAgICBpbnQzMl90IG5TdHlsZSwKKyAgICBjb25zdCBDUFZUX0Rhc2gmIGRhc2gpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CisgIENGWF9CeXRlU3RyaW5nIHNDb2xvcjsKKyAgRlhfRkxPQVQgZkxlZnQgPSByZWN0LmxlZnQ7CisgIEZYX0ZMT0FUIGZSaWdodCA9IHJlY3QucmlnaHQ7CisgIEZYX0ZMT0FUIGZUb3AgPSByZWN0LnRvcDsKKyAgRlhfRkxPQVQgZkJvdHRvbSA9IHJlY3QuYm90dG9tOworICBpZiAoZldpZHRoID4gMC4wZikgeworICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOworICAgIHN3aXRjaCAoblN0eWxlKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgY2FzZSBQQlNfU09MSUQ6CisgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgVFJVRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCA8PCAiICIgPDwgZkJvdHRvbSA8PCAiICIgPDwgZlJpZ2h0IC0gZkxlZnQgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmVG9wIC0gZkJvdHRvbSA8PCAiIHJlXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmUmlnaHQgLSBmTGVmdCAtIGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmVG9wIC0gZkJvdHRvbSAtIGZXaWR0aCAqIDIgPDwgIiByZVxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJmKlxuIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEJTX0RBU0g6CisgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgRkFMU0UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZldpZHRoIDw8ICIgdyIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgWyIgPDwgZGFzaC5uRGFzaCA8PCAiICIgPDwgZGFzaC5uR2FwIDw8ICJdICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGRhc2gublBoYXNlIDw8ICIgZFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbVxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZlRvcCAtIGZXaWR0aCAvIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZUb3AgLSBmV2lkdGggLyAyCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGxcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsIFNcbiI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBCU19CRVZFTEVEOgorICAgICAgY2FzZSBQQlNfSU5TRVQ6CisgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjckxlZnRUb3AsIFRSVUUpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBtXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoICogMiA8PCAiIGwgZlxuIjsKKyAgICAgICAgfQorICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY3JSaWdodEJvdHRvbSwgVFJVRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBtXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsIGZcbiI7CisgICAgICAgIH0KKyAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCBUUlVFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PCBmUmlnaHQgLSBmTGVmdCA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZUb3AgLSBmQm90dG9tIDw8ICIgcmVcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZlJpZ2h0IC0gZkxlZnQgLSBmSGFsZldpZHRoICogMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZUb3AgLSBmQm90dG9tIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiByZSBmKlxuIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEJTX1VOREVSTElORUQ6CisgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgRkFMU0UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZldpZHRoIDw8ICIgd1xuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMiA8PCAiIG1cbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbCBTXG4iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gc0NvbG9yU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKKyAgfQorICByZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7Cit9CitDRlhfQnl0ZVN0cmluZyBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjb25zdCBDUFZUX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0JPT0wmIGJGaWxsT3JTdHJva2UpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNDb2xvclN0cmVhbTsKKyAgc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDVF9SR0I6CisgICAgICBzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgY29sb3IuZkNvbG9yMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIiA8PCAoYkZpbGxPclN0cm9rZSA/ICJyZyIgOiAiUkciKQorICAgICAgICAgICAgICAgICAgIDw8ICJcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIENUX0dSQVk6CisgICAgICBzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgKGJGaWxsT3JTdHJva2UgPyAiZyIgOiAiRyIpCisgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1RfQ01ZSzoKKyAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IGNvbG9yLmZDb2xvcjMgPDwgIiAiIDw8IGNvbG9yLmZDb2xvcjQgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgPDwgKGJGaWxsT3JTdHJva2UgPyAiayIgOiAiSyIpIDw8ICJcbiI7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gc0NvbG9yU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jhc2ljLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jhc2ljLmNwcAppbmRleCAzYmExMDliLi4zOWI1Nzg4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19iYXNpYy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYmFzaWMuY3BwCkBAIC02LDU2NiArNiw1NTggQEAKIAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgogY29uc3QgaW50IG5NYXhSZWN1cnNpb24gPSAzMjsKLWludCBDUERGX0Rlc3Q6OkdldFBhZ2VJbmRleChDUERGX0RvY3VtZW50KiBwRG9jKQotewotICAgIGlmIChtX3BPYmogPT0gTlVMTCB8fCBtX3BPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwUGFnZSA9ICgoQ1BERl9BcnJheSopbV9wT2JqKS0+R2V0RWxlbWVudFZhbHVlKDApOwotICAgIGlmIChwUGFnZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAocFBhZ2UtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgIHJldHVybiBwUGFnZS0+R2V0SW50ZWdlcigpOwotICAgIH0KLSAgICBpZiAocFBhZ2UtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHBEb2MtPkdldFBhZ2VJbmRleChwUGFnZS0+R2V0T2JqTnVtKCkpOwotfQotRlhfRFdPUkQgQ1BERl9EZXN0OjpHZXRQYWdlT2JqTnVtKCkKLXsKLSAgICBpZiAobV9wT2JqID09IE5VTEwgfHwgbV9wT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcFBhZ2UgPSAoKENQREZfQXJyYXkqKW1fcE9iaiktPkdldEVsZW1lbnRWYWx1ZSgwKTsKLSAgICBpZiAocFBhZ2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHBQYWdlLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICByZXR1cm4gcFBhZ2UtPkdldEludGVnZXIoKTsKLSAgICB9Ci0gICAgaWYgKHBQYWdlLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuIHBQYWdlLT5HZXRPYmpOdW0oKTsKLSAgICB9CitpbnQgQ1BERl9EZXN0OjpHZXRQYWdlSW5kZXgoQ1BERl9Eb2N1bWVudCogcERvYykgeworICBpZiAobV9wT2JqID09IE5VTEwgfHwgbV9wT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CiAgICAgcmV0dXJuIDA7Ci19Ci1jb25zdCBGWF9DSEFSKiBnX3Nab29tTW9kZXNbXSA9IHsiWFlaIiwgIkZpdCIsICJGaXRIIiwgIkZpdFYiLCAiRml0UiIsICJGaXRCIiwgIkZpdEJIIiwgIkZpdEJWIiwgIiJ9OwotaW50IENQREZfRGVzdDo6R2V0Wm9vbU1vZGUoKQotewotICAgIGlmIChtX3BPYmogPT0gTlVMTCB8fCBtX3BPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIG1vZGU7Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSAoKENQREZfQXJyYXkqKW1fcE9iaiktPkdldEVsZW1lbnRWYWx1ZSgxKTsKLSAgICBtb2RlID0gcE9iaiA/IHBPYmotPkdldFN0cmluZygpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgd2hpbGUgKGdfc1pvb21Nb2Rlc1tpXVswXSAhPSAnXDAnKSB7Ci0gICAgICAgIGlmIChtb2RlID09IGdfc1pvb21Nb2Rlc1tpXSkgewotICAgICAgICAgICAgcmV0dXJuIGkgKyAxOwotICAgICAgICB9Ci0gICAgICAgIGkgKys7Ci0gICAgfQorICB9CisgIENQREZfT2JqZWN0KiBwUGFnZSA9ICgoQ1BERl9BcnJheSopbV9wT2JqKS0+R2V0RWxlbWVudFZhbHVlKDApOworICBpZiAocFBhZ2UgPT0gTlVMTCkgewogICAgIHJldHVybiAwOworICB9CisgIGlmIChwUGFnZS0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKKyAgICByZXR1cm4gcFBhZ2UtPkdldEludGVnZXIoKTsKKyAgfQorICBpZiAocFBhZ2UtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBwRG9jLT5HZXRQYWdlSW5kZXgocFBhZ2UtPkdldE9iak51bSgpKTsKIH0KLUZYX0ZMT0FUIENQREZfRGVzdDo6R2V0UGFyYW0oaW50IGluZGV4KQotewotICAgIGlmIChtX3BPYmogPT0gTlVMTCB8fCBtX3BPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAoKENQREZfQXJyYXkqKW1fcE9iaiktPkdldE51bWJlcigyICsgaW5kZXgpOworRlhfRFdPUkQgQ1BERl9EZXN0OjpHZXRQYWdlT2JqTnVtKCkgeworICBpZiAobV9wT2JqID09IE5VTEwgfHwgbV9wT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBQYWdlID0gKChDUERGX0FycmF5KiltX3BPYmopLT5HZXRFbGVtZW50VmFsdWUoMCk7CisgIGlmIChwUGFnZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHBQYWdlLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgeworICAgIHJldHVybiBwUGFnZS0+R2V0SW50ZWdlcigpOworICB9CisgIGlmIChwUGFnZS0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgcmV0dXJuIHBQYWdlLT5HZXRPYmpOdW0oKTsKKyAgfQorICByZXR1cm4gMDsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfRGVzdDo6R2V0UmVtb3RlTmFtZSgpCi17Ci0gICAgaWYgKG1fcE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworY29uc3QgRlhfQ0hBUiogZ19zWm9vbU1vZGVzW10gPSB7IlhZWiIsICAiRml0IiwgICAiRml0SCIsICAiRml0ViIsICJGaXRSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaXRCIiwgIkZpdEJIIiwgIkZpdEJWIiwgIiJ9OworaW50IENQREZfRGVzdDo6R2V0Wm9vbU1vZGUoKSB7CisgIGlmIChtX3BPYmogPT0gTlVMTCB8fCBtX3BPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBtb2RlOworICBDUERGX09iamVjdCogcE9iaiA9ICgoQ1BERl9BcnJheSopbV9wT2JqKS0+R2V0RWxlbWVudFZhbHVlKDEpOworICBtb2RlID0gcE9iaiA/IHBPYmotPkdldFN0cmluZygpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgaW50IGkgPSAwOworICB3aGlsZSAoZ19zWm9vbU1vZGVzW2ldWzBdICE9ICdcMCcpIHsKKyAgICBpZiAobW9kZSA9PSBnX3Nab29tTW9kZXNbaV0pIHsKKyAgICAgIHJldHVybiBpICsgMTsKICAgICB9Ci0gICAgcmV0dXJuIG1fcE9iai0+R2V0U3RyaW5nKCk7CisgICAgaSsrOworICB9CisgIHJldHVybiAwOwogfQotQ1BERl9OYW1lVHJlZTo6Q1BERl9OYW1lVHJlZShDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNhdGVnb3J5KQotewotICAgIGlmIChwRG9jLT5HZXRSb290KCkgJiYgcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0KEZYX0JTVFJDKCJOYW1lcyIpKSkKLSAgICAgICAgbV9wUm9vdCA9IHBEb2MtPkdldFJvb3QoKS0+R2V0RGljdChGWF9CU1RSQygiTmFtZXMiKSktPkdldERpY3QoY2F0ZWdvcnkpOwotICAgIGVsc2UKLSAgICAgICAgbV9wUm9vdCA9IE5VTEw7CitGWF9GTE9BVCBDUERGX0Rlc3Q6OkdldFBhcmFtKGludCBpbmRleCkgeworICBpZiAobV9wT2JqID09IE5VTEwgfHwgbV9wT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuICgoQ1BERl9BcnJheSopbV9wT2JqKS0+R2V0TnVtYmVyKDIgKyBpbmRleCk7CiB9Ci1zdGF0aWMgQ1BERl9PYmplY3QqIFNlYXJjaE5hbWVOb2RlKENQREZfRGljdGlvbmFyeSogcE5vZGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbkluZGV4LCBDUERGX0FycmF5KiogcHBGaW5kLCBpbnQgbkxldmVsID0gMCkKLXsKLSAgICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcExpbWl0cyA9IHBOb2RlLT5HZXRBcnJheShGWF9CU1RSQygiTGltaXRzIikpOwotICAgIGlmIChwTGltaXRzICE9IE5VTEwpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NMZWZ0ID0gcExpbWl0cy0+R2V0U3RyaW5nKDApOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc1JpZ2h0ID0gcExpbWl0cy0+R2V0U3RyaW5nKDEpOwotICAgICAgICBpZiAoY3NMZWZ0LkNvbXBhcmUoY3NSaWdodCkgPiAwKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc1RtcCA9IGNzUmlnaHQ7Ci0gICAgICAgICAgICBjc1JpZ2h0ID0gY3NMZWZ0OwotICAgICAgICAgICAgY3NMZWZ0ID0gY3NUbXA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNzTmFtZS5Db21wYXJlKGNzTGVmdCkgPCAwIHx8IGNzTmFtZS5Db21wYXJlKGNzUmlnaHQpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcE5hbWVzID0gcE5vZGUtPkdldEFycmF5KEZYX0JTVFJDKCJOYW1lcyIpKTsKLSAgICBpZiAocE5hbWVzKSB7Ci0gICAgICAgIEZYX0RXT1JEIGR3Q291bnQgPSBwTmFtZXMtPkdldENvdW50KCkgLyAyOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgZHdDb3VudDsgaSArKykgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NWYWx1ZSA9IHBOYW1lcy0+R2V0U3RyaW5nKGkgKiAyKTsKLSAgICAgICAgICAgIGludDMyX3QgaUNvbXBhcmUgPSBjc1ZhbHVlLkNvbXBhcmUoY3NOYW1lKTsKLSAgICAgICAgICAgIGlmIChpQ29tcGFyZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBwRmluZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwcEZpbmQgPSBwTmFtZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpQ29tcGFyZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5JbmRleCArPSBpOwotICAgICAgICAgICAgcmV0dXJuIHBOYW1lcy0+R2V0RWxlbWVudFZhbHVlKGkgKiAyICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgbkluZGV4ICs9IGR3Q291bnQ7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwS2lkcyA9IHBOb2RlLT5HZXRBcnJheShGWF9CU1RSQygiS2lkcyIpKTsKLSAgICBpZiAocEtpZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEtpZCA9IHBLaWRzLT5HZXREaWN0KGkpOwotICAgICAgICBpZiAocEtpZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcEZvdW5kID0gU2VhcmNoTmFtZU5vZGUocEtpZCwgY3NOYW1lLCBuSW5kZXgsIHBwRmluZCwgbkxldmVsICsgMSk7Ci0gICAgICAgIGlmIChwRm91bmQpIHsKLSAgICAgICAgICAgIHJldHVybiBwRm91bmQ7Ci0gICAgICAgIH0KLSAgICB9CitDRlhfQnl0ZVN0cmluZyBDUERGX0Rlc3Q6OkdldFJlbW90ZU5hbWUoKSB7CisgIGlmIChtX3BPYmogPT0gTlVMTCkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICB9CisgIHJldHVybiBtX3BPYmotPkdldFN0cmluZygpOworfQorQ1BERl9OYW1lVHJlZTo6Q1BERl9OYW1lVHJlZShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNhdGVnb3J5KSB7CisgIGlmIChwRG9jLT5HZXRSb290KCkgJiYgcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0KEZYX0JTVFJDKCJOYW1lcyIpKSkKKyAgICBtX3BSb290ID0gcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0KEZYX0JTVFJDKCJOYW1lcyIpKS0+R2V0RGljdChjYXRlZ29yeSk7CisgIGVsc2UKKyAgICBtX3BSb290ID0gTlVMTDsKK30KK3N0YXRpYyBDUERGX09iamVjdCogU2VhcmNoTmFtZU5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqKiBwcEZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGV2ZWwgPSAwKSB7CisgIGlmIChuTGV2ZWwgPiBuTWF4UmVjdXJzaW9uKSB7CiAgICAgcmV0dXJuIE5VTEw7Ci19Ci1zdGF0aWMgQ1BERl9PYmplY3QqIFNlYXJjaE5hbWVOb2RlKENQREZfRGljdGlvbmFyeSogcE5vZGUsIGludCBuSW5kZXgsIGludCYgbkN1ckluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lLCBDUERGX0FycmF5KiogcHBGaW5kLCBpbnQgbkxldmVsID0gMCkKLXsKLSAgICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0FycmF5KiBwTGltaXRzID0gcE5vZGUtPkdldEFycmF5KEZYX0JTVFJDKCJMaW1pdHMiKSk7CisgIGlmIChwTGltaXRzICE9IE5VTEwpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBjc0xlZnQgPSBwTGltaXRzLT5HZXRTdHJpbmcoMCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgY3NSaWdodCA9IHBMaW1pdHMtPkdldFN0cmluZygxKTsKKyAgICBpZiAoY3NMZWZ0LkNvbXBhcmUoY3NSaWdodCkgPiAwKSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBjc1RtcCA9IGNzUmlnaHQ7CisgICAgICBjc1JpZ2h0ID0gY3NMZWZ0OworICAgICAgY3NMZWZ0ID0gY3NUbXA7CiAgICAgfQotICAgIENQREZfQXJyYXkqIHBOYW1lcyA9IHBOb2RlLT5HZXRBcnJheShGWF9CU1RSQygiTmFtZXMiKSk7Ci0gICAgaWYgKHBOYW1lcykgewotICAgICAgICBpbnQgbkNvdW50ID0gcE5hbWVzLT5HZXRDb3VudCgpIC8gMjsKLSAgICAgICAgaWYgKG5JbmRleCA+PSBuQ3VySW5kZXggKyBuQ291bnQpIHsKLSAgICAgICAgICAgIG5DdXJJbmRleCArPSBuQ291bnQ7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgIGlmIChjc05hbWUuQ29tcGFyZShjc0xlZnQpIDwgMCB8fCBjc05hbWUuQ29tcGFyZShjc1JpZ2h0KSA+IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBDUERGX0FycmF5KiBwTmFtZXMgPSBwTm9kZS0+R2V0QXJyYXkoRlhfQlNUUkMoIk5hbWVzIikpOworICBpZiAocE5hbWVzKSB7CisgICAgRlhfRFdPUkQgZHdDb3VudCA9IHBOYW1lcy0+R2V0Q291bnQoKSAvIDI7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NWYWx1ZSA9IHBOYW1lcy0+R2V0U3RyaW5nKGkgKiAyKTsKKyAgICAgIGludDMyX3QgaUNvbXBhcmUgPSBjc1ZhbHVlLkNvbXBhcmUoY3NOYW1lKTsKKyAgICAgIGlmIChpQ29tcGFyZSA8PSAwKSB7CiAgICAgICAgIGlmIChwcEZpbmQgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBwRmluZCA9IHBOYW1lczsKKyAgICAgICAgICAqcHBGaW5kID0gcE5hbWVzOwogICAgICAgICB9Ci0gICAgICAgIGNzTmFtZSA9IHBOYW1lcy0+R2V0U3RyaW5nKChuSW5kZXggLSBuQ3VySW5kZXgpICogMik7Ci0gICAgICAgIHJldHVybiBwTmFtZXMtPkdldEVsZW1lbnRWYWx1ZSgobkluZGV4IC0gbkN1ckluZGV4KSAqIDIgKyAxKTsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEtpZHMgPSBwTm9kZS0+R2V0QXJyYXkoRlhfQlNUUkMoIktpZHMiKSk7Ci0gICAgaWYgKHBLaWRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkcy0+R2V0RGljdChpKTsKLSAgICAgICAgaWYgKHBLaWQgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChpQ29tcGFyZSA8IDApIHsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcEZvdW5kID0gU2VhcmNoTmFtZU5vZGUocEtpZCwgbkluZGV4LCBuQ3VySW5kZXgsIGNzTmFtZSwgcHBGaW5kLCBuTGV2ZWwgKyAxKTsKLSAgICAgICAgaWYgKHBGb3VuZCkgewotICAgICAgICAgICAgcmV0dXJuIHBGb3VuZDsKLSAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBuSW5kZXggKz0gaTsKKyAgICAgIHJldHVybiBwTmFtZXMtPkdldEVsZW1lbnRWYWx1ZShpICogMiArIDEpOwogICAgIH0KKyAgICBuSW5kZXggKz0gZHdDb3VudDsKICAgICByZXR1cm4gTlVMTDsKLX0KLXN0YXRpYyBpbnQgQ291bnROYW1lcyhDUERGX0RpY3Rpb25hcnkqIHBOb2RlLCBpbnQgbkxldmVsID0gMCkKLXsKLSAgICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcE5hbWVzID0gcE5vZGUtPkdldEFycmF5KEZYX0JTVFJDKCJOYW1lcyIpKTsKLSAgICBpZiAocE5hbWVzKSB7Ci0gICAgICAgIHJldHVybiBwTmFtZXMtPkdldENvdW50KCkgLyAyOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwS2lkcyA9IHBOb2RlLT5HZXRBcnJheShGWF9CU1RSQygiS2lkcyIpKTsKLSAgICBpZiAocEtpZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IG5Db3VudCA9IDA7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEtpZCA9IHBLaWRzLT5HZXREaWN0KGkpOwotICAgICAgICBpZiAocEtpZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBuQ291bnQgKz0gQ291bnROYW1lcyhwS2lkLCBuTGV2ZWwgKyAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5Db3VudDsKLX0KLWludCBDUERGX05hbWVUcmVlOjpHZXRDb3VudCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcFJvb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIDo6Q291bnROYW1lcyhtX3BSb290KTsKLX0KLWludCBDUERGX05hbWVUcmVlOjpHZXRJbmRleChjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdAotewotICAgIGlmIChtX3BSb290ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgbkluZGV4ID0gMDsKLSAgICBpZiAoU2VhcmNoTmFtZU5vZGUobV9wUm9vdCwgY3NOYW1lLCBuSW5kZXgsIE5VTEwpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gbkluZGV4OwotfQotQ1BERl9PYmplY3QqIENQREZfTmFtZVRyZWU6Okxvb2t1cFZhbHVlKGludCBuSW5kZXgsIENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcFJvb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaW50IG5DdXJJbmRleCA9IDA7Ci0gICAgcmV0dXJuIFNlYXJjaE5hbWVOb2RlKG1fcFJvb3QsIG5JbmRleCwgbkN1ckluZGV4LCBjc05hbWUsIE5VTEwpOwotfQotQ1BERl9PYmplY3QqIENQREZfTmFtZVRyZWU6Okxvb2t1cFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcFJvb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaW50IG5JbmRleCA9IDA7Ci0gICAgcmV0dXJuIFNlYXJjaE5hbWVOb2RlKG1fcFJvb3QsIGNzTmFtZSwgbkluZGV4LCBOVUxMKTsKLX0KLUNQREZfQXJyYXkqCUNQREZfTmFtZVRyZWU6Okxvb2t1cE5hbWVkRGVzdChDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNOYW1lKQotewotICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBMb29rdXBWYWx1ZShzTmFtZSk7Ci0gICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERlc3RzID0gcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0KEZYX0JTVFJDKCJEZXN0cyIpKTsKLSAgICAgICAgaWYgKHBEZXN0cyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBwVmFsdWUgPSBwRGVzdHMtPkdldEVsZW1lbnRWYWx1ZShzTmFtZSk7Ci0gICAgfQotICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gKENQREZfQXJyYXkqKXBWYWx1ZTsKLSAgICB9Ci0gICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHJldHVybiAoKENQREZfRGljdGlvbmFyeSopcFZhbHVlKS0+R2V0QXJyYXkoRlhfQlNUUkMoIkQiKSk7Ci0gICAgfQorICB9CisgIENQREZfQXJyYXkqIHBLaWRzID0gcE5vZGUtPkdldEFycmF5KEZYX0JTVFJDKCJLaWRzIikpOworICBpZiAocEtpZHMgPT0gTlVMTCkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZHMtPkdldERpY3QoaSk7CisgICAgaWYgKHBLaWQgPT0gTlVMTCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENQREZfT2JqZWN0KiBwRm91bmQgPQorICAgICAgICBTZWFyY2hOYW1lTm9kZShwS2lkLCBjc05hbWUsIG5JbmRleCwgcHBGaW5kLCBuTGV2ZWwgKyAxKTsKKyAgICBpZiAocEZvdW5kKSB7CisgICAgICByZXR1cm4gcEZvdW5kOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8gfHwgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLXN0YXRpYyBDRlhfV2lkZVN0cmluZyBDaGFuZ2VTbGFzaFRvUGxhdGZvcm0oY29uc3QgRlhfV0NIQVIqIHN0cikKLXsKLSAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgd2hpbGUgKCpzdHIpIHsKLSAgICAgICAgaWYgKCpzdHIgPT0gJy8nKSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICByZXN1bHQgKz0gJzonOwotI2Vsc2UKLSAgICAgICAgICAgIHJlc3VsdCArPSAnXFwnOwotI2VuZGlmCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gKnN0cjsKLSAgICAgICAgfQotICAgICAgICBzdHIrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLXN0YXRpYyBDRlhfV2lkZVN0cmluZyBDaGFuZ2VTbGFzaFRvUERGKGNvbnN0IEZYX1dDSEFSKiBzdHIpCi17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OwotICAgIHdoaWxlICgqc3RyKSB7Ci0gICAgICAgIGlmICgqc3RyID09ICdcXCcgfHwgKnN0ciA9PSAnOicpIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSAnLyc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gKnN0cjsKLSAgICAgICAgfQotICAgICAgICBzdHIrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLSNlbmRpZgotc3RhdGljIENGWF9XaWRlU3RyaW5nIEZJTEVTUEVDX0RlY29kZUZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZXBhdGgpCi17Ci0gICAgaWYgKGZpbGVwYXRoLkdldExlbmd0aCgpIDw9IDEpIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgIGlmIChmaWxlcGF0aC5MZWZ0KHNpemVvZigiL01hYyIpIC0gMSkgPT0gQ0ZYX1dpZGVTdHJpbmdDKEwiL01hYyIpKSB7Ci0gICAgICAgIHJldHVybiBDaGFuZ2VTbGFzaFRvUGxhdGZvcm0oZmlsZXBhdGguR2V0UHRyKCkgKyAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSk7Ci0jZWxpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgIGlmIChmaWxlcGF0aC5HZXRBdCgwKSAhPSAnLycpIHsKLSAgICAgICAgcmV0dXJuIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSk7Ci0gICAgfQotICAgIGlmIChmaWxlcGF0aC5HZXRBdCgxKSA9PSAnLycpIHsKLSAgICAgICAgcmV0dXJuIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSArIDEpOwotICAgIH0KLSAgICBpZiAoZmlsZXBhdGguR2V0QXQoMikgPT0gJy8nKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICAgICAgcmVzdWx0ICs9IGZpbGVwYXRoLkdldEF0KDEpOwotICAgICAgICByZXN1bHQgKz0gJzonOwotICAgICAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLkdldFB0cigpICsgMik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICByZXN1bHQgKz0gJ1xcJzsKLSAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLkdldFB0cigpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgICByZXR1cm4gZmlsZXBhdGg7Ci0jZW5kaWYKLX0KLUZYX0JPT0wgQ1BERl9GaWxlU3BlYzo6R2V0RmlsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJmNzRmlsZU5hbWUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KiltX3BPYmo7Ci0gICAgICAgIGNzRmlsZU5hbWUgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoRlhfQlNUUkMoIlVGIikpOwotICAgICAgICBpZiAoY3NGaWxlTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGNzRmlsZU5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkYiKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGUyIpKSA9PSBGWF9CU1RSQygiVVJMIikpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjc0ZpbGVOYW1lLklzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKHBEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiRE9TIikpKSB7Ci0gICAgICAgICAgICAgICAgY3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRE9TIikpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJNYWMiKSkpIHsKLSAgICAgICAgICAgICAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJNYWMiKSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlVuaXgiKSkpIHsKLSAgICAgICAgICAgICAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJVbml4IikpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwobV9wT2JqLT5HZXRTdHJpbmcoKSk7Ci0gICAgfQotICAgIGNzRmlsZU5hbWUgPSBGSUxFU1BFQ19EZWNvZGVGaWxlTmFtZShjc0ZpbGVOYW1lKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUNQREZfRmlsZVNwZWM6OkNQREZfRmlsZVNwZWMoKQotewotICAgIG1fcE9iaiA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7Ci0gICAgaWYgKG1fcE9iaiAhPSBOVUxMKSB7Ci0gICAgICAgICgoQ1BERl9EaWN0aW9uYXJ5KiltX3BPYmopLT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIkZpbGVzcGVjIikpOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9GaWxlU3BlYzo6SXNVUkwoKSBjb25zdAotewotICAgIGlmIChtX3BPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3BPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiAoKENQREZfRGljdGlvbmFyeSopbV9wT2JqKS0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGUyIpKSA9PSBGWF9CU1RSQygiVVJMIik7Ci19Ci1DRlhfV2lkZVN0cmluZyBGSUxFU1BFQ19FbmNvZGVGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVwYXRoKQotewotICAgIGlmIChmaWxlcGF0aC5HZXRMZW5ndGgoKSA8PSAxKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgIGlmIChmaWxlcGF0aC5HZXRBdCgxKSA9PSAnOicpIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OwotICAgICAgICByZXN1bHQgPSAnLyc7Ci0gICAgICAgIHJlc3VsdCArPSBmaWxlcGF0aC5HZXRBdCgwKTsKLSAgICAgICAgaWYgKGZpbGVwYXRoLkdldEF0KDIpICE9ICdcXCcpIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSAnLyc7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QREYoZmlsZXBhdGguR2V0UHRyKCkgKyAyKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKGZpbGVwYXRoLkdldEF0KDApID09ICdcXCcgJiYgZmlsZXBhdGguR2V0QXQoMSkgPT0gJ1xcJykgewotICAgICAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSArIDEpOwotICAgIH0KLSAgICBpZiAoZmlsZXBhdGguR2V0QXQoMCkgPT0gJ1xcJykgewotICAgICAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9ICcvJzsKLSAgICAgICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QREYoZmlsZXBhdGguR2V0UHRyKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSk7Ci0jZWxpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBpZiAoZmlsZXBhdGguTGVmdChzaXplb2YoIk1hYyIpIC0gMSkgPT0gRlhfV1NUUkMoTCJNYWMiKSkgewotICAgICAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9ICcvJzsKLSAgICAgICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QREYoZmlsZXBhdGguR2V0UHRyKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSk7Ci0jZWxzZQotICAgIHJldHVybiBmaWxlcGF0aDsKLSNlbmRpZgotfQotQ1BERl9TdHJlYW0qIENQREZfRmlsZVNwZWM6OkdldEZpbGVTdHJlYW0oKSBjb25zdAotewotICAgIGlmIChtX3BPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaW50MzJfdCBpVHlwZSA9IG1fcE9iai0+R2V0VHlwZSgpOwotICAgIGlmIChpVHlwZSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiAoQ1BERl9TdHJlYW0qKW1fcE9iajsKLSAgICB9IGVsc2UgaWYgKGlUeXBlID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSAqcEVGID0gKChDUERGX0RpY3Rpb25hcnkqKW1fcE9iaiktPkdldERpY3QoRlhfQlNUUkMoIkVGIikpOwotICAgICAgICBpZiAocEVGID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwRUYtPkdldFN0cmVhbShGWF9CU1RSQygiRiIpKTsKLSAgICB9CitzdGF0aWMgQ1BERl9PYmplY3QqIFNlYXJjaE5hbWVOb2RlKENQREZfRGljdGlvbmFyeSogcE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbkN1ckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiogcHBGaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkxldmVsID0gMCkgeworICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgewogICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfQXJyYXkqIHBOYW1lcyA9IHBOb2RlLT5HZXRBcnJheShGWF9CU1RSQygiTmFtZXMiKSk7CisgIGlmIChwTmFtZXMpIHsKKyAgICBpbnQgbkNvdW50ID0gcE5hbWVzLT5HZXRDb3VudCgpIC8gMjsKKyAgICBpZiAobkluZGV4ID49IG5DdXJJbmRleCArIG5Db3VudCkgeworICAgICAgbkN1ckluZGV4ICs9IG5Db3VudDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocHBGaW5kICE9IE5VTEwpIHsKKyAgICAgICpwcEZpbmQgPSBwTmFtZXM7CisgICAgfQorICAgIGNzTmFtZSA9IHBOYW1lcy0+R2V0U3RyaW5nKChuSW5kZXggLSBuQ3VySW5kZXgpICogMik7CisgICAgcmV0dXJuIHBOYW1lcy0+R2V0RWxlbWVudFZhbHVlKChuSW5kZXggLSBuQ3VySW5kZXgpICogMiArIDEpOworICB9CisgIENQREZfQXJyYXkqIHBLaWRzID0gcE5vZGUtPkdldEFycmF5KEZYX0JTVFJDKCJLaWRzIikpOworICBpZiAocEtpZHMgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZHMtPkdldERpY3QoaSk7CisgICAgaWYgKHBLaWQgPT0gTlVMTCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENQREZfT2JqZWN0KiBwRm91bmQgPQorICAgICAgICBTZWFyY2hOYW1lTm9kZShwS2lkLCBuSW5kZXgsIG5DdXJJbmRleCwgY3NOYW1lLCBwcEZpbmQsIG5MZXZlbCArIDEpOworICAgIGlmIChwRm91bmQpIHsKKyAgICAgIHJldHVybiBwRm91bmQ7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOwogfQotc3RhdGljIHZvaWQgRlBERkRPQ19GSUxFU1BFQ19TZXRGaWxlTmFtZShDUERGX09iamVjdCAqcE9iaiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVOYW1lLCBGWF9CT09MIGJVUkwpCi17Ci0gICAgQVNTRVJUKHBPYmogIT0gTlVMTCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NTdHI7Ci0gICAgaWYgKGJVUkwpIHsKLSAgICAgICAgd3NTdHIgPSB3c0ZpbGVOYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdzU3RyID0gRklMRVNQRUNfRW5jb2RlRmlsZU5hbWUod3NGaWxlTmFtZSk7CitzdGF0aWMgaW50IENvdW50TmFtZXMoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwgaW50IG5MZXZlbCA9IDApIHsKKyAgaWYgKG5MZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDUERGX0FycmF5KiBwTmFtZXMgPSBwTm9kZS0+R2V0QXJyYXkoRlhfQlNUUkMoIk5hbWVzIikpOworICBpZiAocE5hbWVzKSB7CisgICAgcmV0dXJuIHBOYW1lcy0+R2V0Q291bnQoKSAvIDI7CisgIH0KKyAgQ1BERl9BcnJheSogcEtpZHMgPSBwTm9kZS0+R2V0QXJyYXkoRlhfQlNUUkMoIktpZHMiKSk7CisgIGlmIChwS2lkcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IG5Db3VudCA9IDA7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZHMtPkdldERpY3QoaSk7CisgICAgaWYgKHBLaWQgPT0gTlVMTCkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGludDMyX3QgaVR5cGUgPSBwT2JqLT5HZXRUeXBlKCk7Ci0gICAgaWYgKGlUeXBlID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgcE9iai0+U2V0U3RyaW5nKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cikpOwotICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7Ci0gICAgICAgIHBEaWN0LT5TZXRBdFN0cmluZyhGWF9CU1RSQygiRiIpLCBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUod3NTdHIpKTsKLSAgICAgICAgcERpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJVRiIpLCBQREZfRW5jb2RlVGV4dCh3c1N0cikpOwotICAgIH0KKyAgICBuQ291bnQgKz0gQ291bnROYW1lcyhwS2lkLCBuTGV2ZWwgKyAxKTsKKyAgfQorICByZXR1cm4gbkNvdW50OwogfQotdm9pZCBDUERGX0ZpbGVTcGVjOjpTZXRGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZU5hbWUsIEZYX0JPT0wgYlVSTCkKLXsKLSAgICBBU1NFUlQobV9wT2JqICE9IE5VTEwpOwotICAgIGlmIChtX3BPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSAmJiBiVVJMKSB7Ci0gICAgICAgICgoQ1BERl9EaWN0aW9uYXJ5KiltX3BPYmopLT5TZXRBdE5hbWUoRlhfQlNUUkMoIkZTIiksICJVUkwiKTsKLSAgICB9Ci0gICAgRlBERkRPQ19GSUxFU1BFQ19TZXRGaWxlTmFtZShtX3BPYmosIHdzRmlsZU5hbWUsIGJVUkwpOworaW50IENQREZfTmFtZVRyZWU6OkdldENvdW50KCkgY29uc3QgeworICBpZiAobV9wUm9vdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDo6Q291bnROYW1lcyhtX3BSb290KTsKIH0KLXN0YXRpYyBDRlhfV2lkZVN0cmluZyBfTWFrZVJvbWFuKGludCBudW0pCi17Ci0gICAgY29uc3QgaW50IGFyYWJpY1tdID0gewotICAgICAgICAxMDAwLCA5MDAsIDUwMCwgNDAwLCAxMDAsIDkwLCA1MCwgNDAsIDEwLCA5LCA1LCA0LCAxCi0gICAgfTsKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyByb21hbltdID0gewotICAgICAgICBMIm0iLCBMImNtIiwgTCJkIiwgTCJjZCIsIEwiYyIsIEwieGMiLCBMImwiLCBMInhsIiwgTCJ4IiwgTCJpeCIsIEwidiIsIEwiaXYiLCBMImkiCi0gICAgfTsKLSAgICBjb25zdCBpbnQgbk1heE51bSA9IDEwMDAwMDA7Ci0gICAgbnVtICU9IG5NYXhOdW07Ci0gICAgaW50IGkgPSAwOwotICAgIENGWF9XaWRlU3RyaW5nIHdzUm9tYW5OdW1iZXI7Ci0gICAgd2hpbGUgKG51bSA+IDApIHsKLSAgICAgICAgd2hpbGUgKG51bSA+PSBhcmFiaWNbaV0pIHsKLSAgICAgICAgICAgIG51bSA9IG51bSAtIGFyYWJpY1tpXTsKLSAgICAgICAgICAgIHdzUm9tYW5OdW1iZXIgKz0gcm9tYW5baV07Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IGkgKyAxOwotICAgIH0KLSAgICByZXR1cm4gd3NSb21hbk51bWJlcjsKLX0KLXN0YXRpYyBDRlhfV2lkZVN0cmluZyBfTWFrZUxldHRlcnMoaW50IG51bSkKLXsKLSAgICBpZiAobnVtID09IDApIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHdzTGV0dGVyczsKLSAgICBjb25zdCBpbnQgbk1heENvdW50ID0gMTAwMDsKLSAgICBjb25zdCBpbnQgbkxldHRlckNvdW50ID0gMjY7Ci0gICAgbnVtIC09IDE7Ci0gICAgaW50IGNvdW50ID0gbnVtIC8gbkxldHRlckNvdW50ICsgMTsKLSAgICBjb3VudCAlPSBuTWF4Q291bnQ7Ci0gICAgRlhfV0NIQVIgY2ggPSBMJ2EnICsgbnVtICUgbkxldHRlckNvdW50OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICB3c0xldHRlcnMgKz0gY2g7Ci0gICAgfQotICAgIHJldHVybiB3c0xldHRlcnM7Ci19Ci1zdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgX0dldExhYmVsTnVtUG9ydGlvbihpbnQgbnVtLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNTdHlsZSkKLXsKLSAgICBDRlhfV2lkZVN0cmluZyB3c051bVBvcnRpb247Ci0gICAgaWYJCShic1N0eWxlLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gd3NOdW1Qb3J0aW9uOwotICAgIH0KLSAgICBpZiAoYnNTdHlsZSA9PSAiRCIpIHsKLSAgICAgICAgd3NOdW1Qb3J0aW9uLkZvcm1hdChMIiVkIiwgbnVtKTsKLSAgICB9IGVsc2UgaWYgKGJzU3R5bGUgPT0gIlIiKSB7Ci0gICAgICAgIHdzTnVtUG9ydGlvbiA9IF9NYWtlUm9tYW4obnVtKTsKLSAgICAgICAgd3NOdW1Qb3J0aW9uLk1ha2VVcHBlcigpOwotICAgIH0gZWxzZSBpZiAoYnNTdHlsZSA9PSAiciIpIHsKLSAgICAgICAgd3NOdW1Qb3J0aW9uID0gX01ha2VSb21hbihudW0pOwotICAgIH0gZWxzZSBpZiAoYnNTdHlsZSA9PSAiQSIpIHsKLSAgICAgICAgd3NOdW1Qb3J0aW9uID0gX01ha2VMZXR0ZXJzKG51bSk7Ci0gICAgICAgIHdzTnVtUG9ydGlvbi5NYWtlVXBwZXIoKTsKLSAgICB9IGVsc2UgaWYgKGJzU3R5bGUgPT0gImEiKSB7Ci0gICAgICAgIHdzTnVtUG9ydGlvbiA9IF9NYWtlTGV0dGVycyhudW0pOwotICAgIH0KLSAgICByZXR1cm4gd3NOdW1Qb3J0aW9uOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9QYWdlTGFiZWw6OkdldExhYmVsKGludCBuUGFnZSkgY29uc3QKLXsKLSAgICBDRlhfV2lkZVN0cmluZyB3c0xhYmVsOwotICAgIGlmIChtX3BEb2N1bWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiB3c0xhYmVsOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQREZSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKLSAgICBpZiAocFBERlJvb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gd3NMYWJlbDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGFiZWxzID0gcFBERlJvb3QtPkdldERpY3QoRlhfQlNUUkMoIlBhZ2VMYWJlbHMiKSk7Ci0gICAgQ1BERl9OdW1iZXJUcmVlIG51bWJlclRyZWUocExhYmVscyk7Ci0gICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IE5VTEw7Ci0gICAgaW50IG4gPSBuUGFnZTsKLSAgICB3aGlsZSAobiA+PSAwKSB7Ci0gICAgICAgIHBWYWx1ZSA9IG51bWJlclRyZWUuTG9va3VwVmFsdWUobik7Ci0gICAgICAgIGlmIChwVmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbi0tOwotICAgIH0KLSAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgcFZhbHVlID0gcFZhbHVlLT5HZXREaXJlY3QoKTsKLSAgICAgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBMYWJlbCA9IChDUERGX0RpY3Rpb25hcnkqKXBWYWx1ZTsKLSAgICAgICAgICAgIGlmIChwTGFiZWwtPktleUV4aXN0KEZYX0JTVFJDKCJQIikpKSB7Ci0gICAgICAgICAgICAgICAgd3NMYWJlbCArPSBwTGFiZWwtPkdldFVuaWNvZGVUZXh0KEZYX0JTVFJDKCJQIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOdW1iZXJpbmdTdHlsZSA9IHBMYWJlbC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTIiksIE5VTEwpOwotICAgICAgICAgICAgaW50IG5MYWJlbE51bSA9IG5QYWdlIC0gbiArIHBMYWJlbC0+R2V0SW50ZWdlcihGWF9CU1RSQygiU3QiKSwgMSk7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c051bVBvcnRpb24gPSBfR2V0TGFiZWxOdW1Qb3J0aW9uKG5MYWJlbE51bSwgYnNOdW1iZXJpbmdTdHlsZSk7Ci0gICAgICAgICAgICB3c0xhYmVsICs9IHdzTnVtUG9ydGlvbjsKLSAgICAgICAgICAgIHJldHVybiB3c0xhYmVsOwotICAgICAgICB9Ci0gICAgfQotICAgIHdzTGFiZWwuRm9ybWF0KEwiJWQiLCBuUGFnZSArIDEpOwotICAgIHJldHVybiB3c0xhYmVsOwotfQotaW50MzJfdCBDUERGX1BhZ2VMYWJlbDo6R2V0UGFnZUJ5TGFiZWwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0xhYmVsKSBjb25zdAotewotICAgIGlmIChtX3BEb2N1bWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUERGUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7Ci0gICAgaWYgKHBQREZSb290ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgblBhZ2VzID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOwotICAgIENGWF9CeXRlU3RyaW5nIGJzTGJsOwotICAgIENGWF9CeXRlU3RyaW5nIGJzT3JpZyA9IGJzTGFiZWw7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUGFnZXM7IGkrKykgewotICAgICAgICBic0xibCA9IFBERl9FbmNvZGVUZXh0KEdldExhYmVsKGkpKTsKLSAgICAgICAgaWYgKCFic0xibC5Db21wYXJlKGJzT3JpZykpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIGJzTGJsID0gYnNPcmlnOwotICAgIGludCBuUGFnZSA9IEZYU1lTX2F0b2koYnNMYmwpOwotICAgIGlmIChuUGFnZSA+IDAgJiYgblBhZ2UgPD0gblBhZ2VzKSB7Ci0gICAgICAgIHJldHVybiBuUGFnZTsKLSAgICB9CitpbnQgQ1BERl9OYW1lVHJlZTo6R2V0SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3QgeworICBpZiAobV9wUm9vdCA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIC0xOworICB9CisgIGludCBuSW5kZXggPSAwOworICBpZiAoU2VhcmNoTmFtZU5vZGUobV9wUm9vdCwgY3NOYW1lLCBuSW5kZXgsIE5VTEwpID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIG5JbmRleDsKIH0KLWludDMyX3QgQ1BERl9QYWdlTGFiZWw6OkdldFBhZ2VCeUxhYmVsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCkgY29uc3QKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBic0xhYmVsID0gUERGX0VuY29kZVRleHQod3NMYWJlbC5HZXRQdHIoKSk7Ci0gICAgcmV0dXJuIEdldFBhZ2VCeUxhYmVsKGJzTGFiZWwpOworQ1BERl9PYmplY3QqIENQREZfTmFtZVRyZWU6Okxvb2t1cFZhbHVlKGludCBuSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3QgeworICBpZiAobV9wUm9vdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IG5DdXJJbmRleCA9IDA7CisgIHJldHVybiBTZWFyY2hOYW1lTm9kZShtX3BSb290LCBuSW5kZXgsIG5DdXJJbmRleCwgY3NOYW1lLCBOVUxMKTsKK30KK0NQREZfT2JqZWN0KiBDUERGX05hbWVUcmVlOjpMb29rdXBWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdCB7CisgIGlmIChtX3BSb290ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbnQgbkluZGV4ID0gMDsKKyAgcmV0dXJuIFNlYXJjaE5hbWVOb2RlKG1fcFJvb3QsIGNzTmFtZSwgbkluZGV4LCBOVUxMKTsKK30KK0NQREZfQXJyYXkqIENQREZfTmFtZVRyZWU6Okxvb2t1cE5hbWVkRGVzdChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc05hbWUpIHsKKyAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IExvb2t1cFZhbHVlKHNOYW1lKTsKKyAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGVzdHMgPSBwRG9jLT5HZXRSb290KCktPkdldERpY3QoRlhfQlNUUkMoIkRlc3RzIikpOworICAgIGlmIChwRGVzdHMgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBWYWx1ZSA9IHBEZXN0cy0+R2V0RWxlbWVudFZhbHVlKHNOYW1lKTsKKyAgfQorICBpZiAocFZhbHVlID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgcmV0dXJuIChDUERGX0FycmF5KilwVmFsdWU7CisgIH0KKyAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgcmV0dXJuICgoQ1BERl9EaWN0aW9uYXJ5KilwVmFsdWUpLT5HZXRBcnJheShGWF9CU1RSQygiRCIpKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCBcCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworc3RhdGljIENGWF9XaWRlU3RyaW5nIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShjb25zdCBGWF9XQ0hBUiogc3RyKSB7CisgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKKyAgd2hpbGUgKCpzdHIpIHsKKyAgICBpZiAoKnN0ciA9PSAnLycpIHsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgICAgcmVzdWx0ICs9ICc6JzsKKyNlbHNlCisgICAgICByZXN1bHQgKz0gJ1xcJzsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gKnN0cjsKKyAgICB9CisgICAgc3RyKys7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KK3N0YXRpYyBDRlhfV2lkZVN0cmluZyBDaGFuZ2VTbGFzaFRvUERGKGNvbnN0IEZYX1dDSEFSKiBzdHIpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICB3aGlsZSAoKnN0cikgeworICAgIGlmICgqc3RyID09ICdcXCcgfHwgKnN0ciA9PSAnOicpIHsKKyAgICAgIHJlc3VsdCArPSAnLyc7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAqc3RyOworICAgIH0KKyAgICBzdHIrKzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCitzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgRklMRVNQRUNfRGVjb2RlRmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlcGF0aCkgeworICBpZiAoZmlsZXBhdGguR2V0TGVuZ3RoKCkgPD0gMSkgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgaWYgKGZpbGVwYXRoLkxlZnQoc2l6ZW9mKCIvTWFjIikgLSAxKSA9PSBDRlhfV2lkZVN0cmluZ0MoTCIvTWFjIikpIHsKKyAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLkdldFB0cigpICsgMSk7CisgIH0KKyAgcmV0dXJuIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSk7CisjZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgIGlmIChmaWxlcGF0aC5HZXRBdCgwKSAhPSAnLycpIHsKKyAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLkdldFB0cigpKTsKKyAgfQorICBpZiAoZmlsZXBhdGguR2V0QXQoMSkgPT0gJy8nKSB7CisgICAgcmV0dXJuIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSArIDEpOworICB9CisgIGlmIChmaWxlcGF0aC5HZXRBdCgyKSA9PSAnLycpIHsKKyAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7CisgICAgcmVzdWx0ICs9IGZpbGVwYXRoLkdldEF0KDEpOworICAgIHJlc3VsdCArPSAnOic7CisgICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSArIDIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICByZXN1bHQgKz0gJ1xcJzsKKyAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSk7CisgIHJldHVybiByZXN1bHQ7CisjZWxzZQorICByZXR1cm4gZmlsZXBhdGg7CisjZW5kaWYKK30KK0ZYX0JPT0wgQ1BERl9GaWxlU3BlYzo6R2V0RmlsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzRmlsZU5hbWUpIGNvbnN0IHsKKyAgaWYgKG1fcE9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KiltX3BPYmo7CisgICAgY3NGaWxlTmFtZSA9IHBEaWN0LT5HZXRVbmljb2RlVGV4dChGWF9CU1RSQygiVUYiKSk7CisgICAgaWYgKGNzRmlsZU5hbWUuSXNFbXB0eSgpKSB7CisgICAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGIikpKTsKKyAgICB9CisgICAgaWYgKHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkZTIikpID09IEZYX0JTVFJDKCJVUkwiKSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGlmIChjc0ZpbGVOYW1lLklzRW1wdHkoKSkgeworICAgICAgaWYgKHBEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiRE9TIikpKSB7CisgICAgICAgIGNzRmlsZU5hbWUgPQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJET1MiKSkpOworICAgICAgfSBlbHNlIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIk1hYyIpKSkgeworICAgICAgICBjc0ZpbGVOYW1lID0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiTWFjIikpKTsKKyAgICAgIH0gZWxzZSBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJVbml4IikpKSB7CisgICAgICAgIGNzRmlsZU5hbWUgPQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJVbml4IikpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgY3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwobV9wT2JqLT5HZXRTdHJpbmcoKSk7CisgIH0KKyAgY3NGaWxlTmFtZSA9IEZJTEVTUEVDX0RlY29kZUZpbGVOYW1lKGNzRmlsZU5hbWUpOworICByZXR1cm4gVFJVRTsKK30KK0NQREZfRmlsZVNwZWM6OkNQREZfRmlsZVNwZWMoKSB7CisgIG1fcE9iaiA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7CisgIGlmIChtX3BPYmogIT0gTlVMTCkgeworICAgICgoQ1BERl9EaWN0aW9uYXJ5KiltX3BPYmopCisgICAgICAgIC0+U2V0QXROYW1lKEZYX0JTVFJDKCJUeXBlIiksIEZYX0JTVFJDKCJGaWxlc3BlYyIpKTsKKyAgfQorfQorRlhfQk9PTCBDUERGX0ZpbGVTcGVjOjpJc1VSTCgpIGNvbnN0IHsKKyAgaWYgKG1fcE9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gKChDUERGX0RpY3Rpb25hcnkqKW1fcE9iaiktPkdldFN0cmluZyhGWF9CU1RSQygiRlMiKSkgPT0KKyAgICAgICAgIEZYX0JTVFJDKCJVUkwiKTsKK30KK0NGWF9XaWRlU3RyaW5nIEZJTEVTUEVDX0VuY29kZUZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZXBhdGgpIHsKKyAgaWYgKGZpbGVwYXRoLkdldExlbmd0aCgpIDw9IDEpIHsKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyAgaWYgKGZpbGVwYXRoLkdldEF0KDEpID09ICc6JykgeworICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKKyAgICByZXN1bHQgPSAnLyc7CisgICAgcmVzdWx0ICs9IGZpbGVwYXRoLkdldEF0KDApOworICAgIGlmIChmaWxlcGF0aC5HZXRBdCgyKSAhPSAnXFwnKSB7CisgICAgICByZXN1bHQgKz0gJy8nOworICAgIH0KKyAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSArIDIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgaWYgKGZpbGVwYXRoLkdldEF0KDApID09ICdcXCcgJiYgZmlsZXBhdGguR2V0QXQoMSkgPT0gJ1xcJykgeworICAgIHJldHVybiBDaGFuZ2VTbGFzaFRvUERGKGZpbGVwYXRoLkdldFB0cigpICsgMSk7CisgIH0KKyAgaWYgKGZpbGVwYXRoLkdldEF0KDApID09ICdcXCcpIHsKKyAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7CisgICAgcmVzdWx0ID0gJy8nOworICAgIHJlc3VsdCArPSBDaGFuZ2VTbGFzaFRvUERGKGZpbGVwYXRoLkdldFB0cigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHJldHVybiBDaGFuZ2VTbGFzaFRvUERGKGZpbGVwYXRoLkdldFB0cigpKTsKKyNlbGlmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgIGlmIChmaWxlcGF0aC5MZWZ0KHNpemVvZigiTWFjIikgLSAxKSA9PSBGWF9XU1RSQyhMIk1hYyIpKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICAgIHJlc3VsdCA9ICcvJzsKKyAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSk7CisjZWxzZQorICByZXR1cm4gZmlsZXBhdGg7CisjZW5kaWYKK30KK0NQREZfU3RyZWFtKiBDUERGX0ZpbGVTcGVjOjpHZXRGaWxlU3RyZWFtKCkgY29uc3QgeworICBpZiAobV9wT2JqID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbnQzMl90IGlUeXBlID0gbV9wT2JqLT5HZXRUeXBlKCk7CisgIGlmIChpVHlwZSA9PSBQREZPQkpfU1RSRUFNKSB7CisgICAgcmV0dXJuIChDUERGX1N0cmVhbSopbV9wT2JqOworICB9IGVsc2UgaWYgKGlUeXBlID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRUYgPSAoKENQREZfRGljdGlvbmFyeSopbV9wT2JqKS0+R2V0RGljdChGWF9CU1RSQygiRUYiKSk7CisgICAgaWYgKHBFRiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHBFRi0+R2V0U3RyZWFtKEZYX0JTVFJDKCJGIikpOworICB9CisgIHJldHVybiBOVUxMOworfQorc3RhdGljIHZvaWQgRlBERkRPQ19GSUxFU1BFQ19TZXRGaWxlTmFtZShDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVUkwpIHsKKyAgQVNTRVJUKHBPYmogIT0gTlVMTCk7CisgIENGWF9XaWRlU3RyaW5nIHdzU3RyOworICBpZiAoYlVSTCkgeworICAgIHdzU3RyID0gd3NGaWxlTmFtZTsKKyAgfSBlbHNlIHsKKyAgICB3c1N0ciA9IEZJTEVTUEVDX0VuY29kZUZpbGVOYW1lKHdzRmlsZU5hbWUpOworICB9CisgIGludDMyX3QgaVR5cGUgPSBwT2JqLT5HZXRUeXBlKCk7CisgIGlmIChpVHlwZSA9PSBQREZPQkpfU1RSSU5HKSB7CisgICAgcE9iai0+U2V0U3RyaW5nKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cikpOworICB9IGVsc2UgaWYgKGlUeXBlID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7CisgICAgcERpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJGIiksIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cikpOworICAgIHBEaWN0LT5TZXRBdFN0cmluZyhGWF9CU1RSQygiVUYiKSwgUERGX0VuY29kZVRleHQod3NTdHIpKTsKKyAgfQorfQordm9pZCBDUERGX0ZpbGVTcGVjOjpTZXRGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVSTCkgeworICBBU1NFUlQobV9wT2JqICE9IE5VTEwpOworICBpZiAobV9wT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkgJiYgYlVSTCkgeworICAgICgoQ1BERl9EaWN0aW9uYXJ5KiltX3BPYmopLT5TZXRBdE5hbWUoRlhfQlNUUkMoIkZTIiksICJVUkwiKTsKKyAgfQorICBGUERGRE9DX0ZJTEVTUEVDX1NldEZpbGVOYW1lKG1fcE9iaiwgd3NGaWxlTmFtZSwgYlVSTCk7Cit9CitzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgX01ha2VSb21hbihpbnQgbnVtKSB7CisgIGNvbnN0IGludCBhcmFiaWNbXSA9IHsxMDAwLCA5MDAsIDUwMCwgNDAwLCAxMDAsIDkwLCA1MCwgNDAsIDEwLCA5LCA1LCA0LCAxfTsKKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgcm9tYW5bXSA9IHtMIm0iLCAgTCJjbSIsIEwiZCIsICBMImNkIiwgTCJjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInhjIiwgTCJsIiwgIEwieGwiLCBMIngiLCAgTCJpeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJ2IiwgIEwiaXYiLCBMImkifTsKKyAgY29uc3QgaW50IG5NYXhOdW0gPSAxMDAwMDAwOworICBudW0gJT0gbk1heE51bTsKKyAgaW50IGkgPSAwOworICBDRlhfV2lkZVN0cmluZyB3c1JvbWFuTnVtYmVyOworICB3aGlsZSAobnVtID4gMCkgeworICAgIHdoaWxlIChudW0gPj0gYXJhYmljW2ldKSB7CisgICAgICBudW0gPSBudW0gLSBhcmFiaWNbaV07CisgICAgICB3c1JvbWFuTnVtYmVyICs9IHJvbWFuW2ldOworICAgIH0KKyAgICBpID0gaSArIDE7CisgIH0KKyAgcmV0dXJuIHdzUm9tYW5OdW1iZXI7Cit9CitzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgX01ha2VMZXR0ZXJzKGludCBudW0pIHsKKyAgaWYgKG51bSA9PSAwKSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NMZXR0ZXJzOworICBjb25zdCBpbnQgbk1heENvdW50ID0gMTAwMDsKKyAgY29uc3QgaW50IG5MZXR0ZXJDb3VudCA9IDI2OworICBudW0gLT0gMTsKKyAgaW50IGNvdW50ID0gbnVtIC8gbkxldHRlckNvdW50ICsgMTsKKyAgY291bnQgJT0gbk1heENvdW50OworICBGWF9XQ0hBUiBjaCA9IEwnYScgKyBudW0gJSBuTGV0dGVyQ291bnQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIHdzTGV0dGVycyArPSBjaDsKKyAgfQorICByZXR1cm4gd3NMZXR0ZXJzOworfQorc3RhdGljIENGWF9XaWRlU3RyaW5nIF9HZXRMYWJlbE51bVBvcnRpb24oaW50IG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic1N0eWxlKSB7CisgIENGWF9XaWRlU3RyaW5nIHdzTnVtUG9ydGlvbjsKKyAgaWYgKGJzU3R5bGUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIHdzTnVtUG9ydGlvbjsKKyAgfQorICBpZiAoYnNTdHlsZSA9PSAiRCIpIHsKKyAgICB3c051bVBvcnRpb24uRm9ybWF0KEwiJWQiLCBudW0pOworICB9IGVsc2UgaWYgKGJzU3R5bGUgPT0gIlIiKSB7CisgICAgd3NOdW1Qb3J0aW9uID0gX01ha2VSb21hbihudW0pOworICAgIHdzTnVtUG9ydGlvbi5NYWtlVXBwZXIoKTsKKyAgfSBlbHNlIGlmIChic1N0eWxlID09ICJyIikgeworICAgIHdzTnVtUG9ydGlvbiA9IF9NYWtlUm9tYW4obnVtKTsKKyAgfSBlbHNlIGlmIChic1N0eWxlID09ICJBIikgeworICAgIHdzTnVtUG9ydGlvbiA9IF9NYWtlTGV0dGVycyhudW0pOworICAgIHdzTnVtUG9ydGlvbi5NYWtlVXBwZXIoKTsKKyAgfSBlbHNlIGlmIChic1N0eWxlID09ICJhIikgeworICAgIHdzTnVtUG9ydGlvbiA9IF9NYWtlTGV0dGVycyhudW0pOworICB9CisgIHJldHVybiB3c051bVBvcnRpb247Cit9CitDRlhfV2lkZVN0cmluZyBDUERGX1BhZ2VMYWJlbDo6R2V0TGFiZWwoaW50IG5QYWdlKSBjb25zdCB7CisgIENGWF9XaWRlU3RyaW5nIHdzTGFiZWw7CisgIGlmIChtX3BEb2N1bWVudCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIHdzTGFiZWw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUERGUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgIGlmIChwUERGUm9vdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIHdzTGFiZWw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwTGFiZWxzID0gcFBERlJvb3QtPkdldERpY3QoRlhfQlNUUkMoIlBhZ2VMYWJlbHMiKSk7CisgIENQREZfTnVtYmVyVHJlZSBudW1iZXJUcmVlKHBMYWJlbHMpOworICBDUERGX09iamVjdCogcFZhbHVlID0gTlVMTDsKKyAgaW50IG4gPSBuUGFnZTsKKyAgd2hpbGUgKG4gPj0gMCkgeworICAgIHBWYWx1ZSA9IG51bWJlclRyZWUuTG9va3VwVmFsdWUobik7CisgICAgaWYgKHBWYWx1ZSAhPSBOVUxMKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgbi0tOworICB9CisgIGlmIChwVmFsdWUgIT0gTlVMTCkgeworICAgIHBWYWx1ZSA9IHBWYWx1ZS0+R2V0RGlyZWN0KCk7CisgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBMYWJlbCA9IChDUERGX0RpY3Rpb25hcnkqKXBWYWx1ZTsKKyAgICAgIGlmIChwTGFiZWwtPktleUV4aXN0KEZYX0JTVFJDKCJQIikpKSB7CisgICAgICAgIHdzTGFiZWwgKz0gcExhYmVsLT5HZXRVbmljb2RlVGV4dChGWF9CU1RSQygiUCIpKTsKKyAgICAgIH0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzTnVtYmVyaW5nU3R5bGUgPSBwTGFiZWwtPkdldFN0cmluZyhGWF9CU1RSQygiUyIpLCBOVUxMKTsKKyAgICAgIGludCBuTGFiZWxOdW0gPSBuUGFnZSAtIG4gKyBwTGFiZWwtPkdldEludGVnZXIoRlhfQlNUUkMoIlN0IiksIDEpOworICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1Qb3J0aW9uID0KKyAgICAgICAgICBfR2V0TGFiZWxOdW1Qb3J0aW9uKG5MYWJlbE51bSwgYnNOdW1iZXJpbmdTdHlsZSk7CisgICAgICB3c0xhYmVsICs9IHdzTnVtUG9ydGlvbjsKKyAgICAgIHJldHVybiB3c0xhYmVsOworICAgIH0KKyAgfQorICB3c0xhYmVsLkZvcm1hdChMIiVkIiwgblBhZ2UgKyAxKTsKKyAgcmV0dXJuIHdzTGFiZWw7Cit9CitpbnQzMl90IENQREZfUGFnZUxhYmVsOjpHZXRQYWdlQnlMYWJlbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzTGFiZWwpIGNvbnN0IHsKKyAgaWYgKG1fcERvY3VtZW50ID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUERGUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgIGlmIChwUERGUm9vdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBuUGFnZXMgPSBtX3BEb2N1bWVudC0+R2V0UGFnZUNvdW50KCk7CisgIENGWF9CeXRlU3RyaW5nIGJzTGJsOworICBDRlhfQnl0ZVN0cmluZyBic09yaWcgPSBic0xhYmVsOworICBmb3IgKGludCBpID0gMDsgaSA8IG5QYWdlczsgaSsrKSB7CisgICAgYnNMYmwgPSBQREZfRW5jb2RlVGV4dChHZXRMYWJlbChpKSk7CisgICAgaWYgKCFic0xibC5Db21wYXJlKGJzT3JpZykpIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorICBic0xibCA9IGJzT3JpZzsKKyAgaW50IG5QYWdlID0gRlhTWVNfYXRvaShic0xibCk7CisgIGlmIChuUGFnZSA+IDAgJiYgblBhZ2UgPD0gblBhZ2VzKSB7CisgICAgcmV0dXJuIG5QYWdlOworICB9CisgIHJldHVybiAtMTsKK30KK2ludDMyX3QgQ1BERl9QYWdlTGFiZWw6OkdldFBhZ2VCeUxhYmVsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCkgY29uc3QgeworICBDRlhfQnl0ZVN0cmluZyBic0xhYmVsID0gUERGX0VuY29kZVRleHQod3NMYWJlbC5HZXRQdHIoKSk7CisgIHJldHVybiBHZXRQYWdlQnlMYWJlbChic0xhYmVsKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jvb2ttYXJrLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jvb2ttYXJrLmNwcAppbmRleCA5ZjBkNTg2Li4yZmVhODEwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19ib29rbWFyay5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYm9va21hcmsuY3BwCkBAIC05LDkwICs5LDg1IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vdGhpcmRfcGFydHkvYmFzZS9ub25zdGRfdW5pcXVlX3B0ci5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgogCi1DUERGX0Jvb2ttYXJrIENQREZfQm9va21hcmtUcmVlOjpHZXRGaXJzdENoaWxkKGNvbnN0IENQREZfQm9va21hcmsmIHBhcmVudCkgY29uc3QKLXsKLSAgICBpZiAoIXBhcmVudC5tX3BEaWN0KSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpLT5HZXREaWN0KCJPdXRsaW5lcyIpOwotICAgICAgICBpZiAoIXBSb290KSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9Cb29rbWFyaygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDUERGX0Jvb2ttYXJrKHBSb290LT5HZXREaWN0KCJGaXJzdCIpKTsKK0NQREZfQm9va21hcmsgQ1BERl9Cb29rbWFya1RyZWU6OkdldEZpcnN0Q2hpbGQoCisgICAgY29uc3QgQ1BERl9Cb29rbWFyayYgcGFyZW50KSBjb25zdCB7CisgIGlmICghcGFyZW50Lm1fcERpY3QpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKS0+R2V0RGljdCgiT3V0bGluZXMiKTsKKyAgICBpZiAoIXBSb290KSB7CisgICAgICByZXR1cm4gQ1BERl9Cb29rbWFyaygpOwogICAgIH0KLSAgICByZXR1cm4gQ1BERl9Cb29rbWFyayhwYXJlbnQubV9wRGljdC0+R2V0RGljdCgiRmlyc3QiKSk7CisgICAgcmV0dXJuIENQREZfQm9va21hcmsocFJvb3QtPkdldERpY3QoIkZpcnN0IikpOworICB9CisgIHJldHVybiBDUERGX0Jvb2ttYXJrKHBhcmVudC5tX3BEaWN0LT5HZXREaWN0KCJGaXJzdCIpKTsKIH0KLUNQREZfQm9va21hcmsgQ1BERl9Cb29rbWFya1RyZWU6OkdldE5leHRTaWJsaW5nKGNvbnN0IENQREZfQm9va21hcmsmIGJvb2ttYXJrKSBjb25zdAotewotICAgIGlmICghYm9va21hcmsubV9wRGljdCkgewotICAgICAgICByZXR1cm4gQ1BERl9Cb29rbWFyaygpOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkgKnBOZXh0ID0gYm9va21hcmsubV9wRGljdC0+R2V0RGljdCgiTmV4dCIpOwotICAgIHJldHVybiBwTmV4dCA9PSBib29rbWFyay5tX3BEaWN0ID8gQ1BERl9Cb29rbWFyaygpIDogQ1BERl9Cb29rbWFyayhwTmV4dCk7CitDUERGX0Jvb2ttYXJrIENQREZfQm9va21hcmtUcmVlOjpHZXROZXh0U2libGluZygKKyAgICBjb25zdCBDUERGX0Jvb2ttYXJrJiBib29rbWFyaykgY29uc3QgeworICBpZiAoIWJvb2ttYXJrLm1fcERpY3QpIHsKKyAgICByZXR1cm4gQ1BERl9Cb29rbWFyaygpOworICB9CisgIENQREZfRGljdGlvbmFyeSogcE5leHQgPSBib29rbWFyay5tX3BEaWN0LT5HZXREaWN0KCJOZXh0Iik7CisgIHJldHVybiBwTmV4dCA9PSBib29rbWFyay5tX3BEaWN0ID8gQ1BERl9Cb29rbWFyaygpIDogQ1BERl9Cb29rbWFyayhwTmV4dCk7CiB9Ci1GWF9EV09SRCBDUERGX0Jvb2ttYXJrOjpHZXRDb2xvclJlZigpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BEaWN0KSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwQ29sb3IgPSBtX3BEaWN0LT5HZXRBcnJheSgiQyIpOwotICAgIGlmICghcENvbG9yKSB7Ci0gICAgICAgIHJldHVybiBGWFNZU19SR0IoMCwgMCwgMCk7Ci0gICAgfQotICAgIGludCByID0gRlhTWVNfcm91bmQocENvbG9yLT5HZXROdW1iZXIoMCkgKiAyNTUpOwotICAgIGludCBnID0gRlhTWVNfcm91bmQocENvbG9yLT5HZXROdW1iZXIoMSkgKiAyNTUpOwotICAgIGludCBiID0gRlhTWVNfcm91bmQocENvbG9yLT5HZXROdW1iZXIoMikgKiAyNTUpOwotICAgIHJldHVybiBGWFNZU19SR0IociwgZywgYik7CitGWF9EV09SRCBDUERGX0Jvb2ttYXJrOjpHZXRDb2xvclJlZigpIGNvbnN0IHsKKyAgaWYgKCFtX3BEaWN0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ1BERl9BcnJheSogcENvbG9yID0gbV9wRGljdC0+R2V0QXJyYXkoIkMiKTsKKyAgaWYgKCFwQ29sb3IpIHsKKyAgICByZXR1cm4gRlhTWVNfUkdCKDAsIDAsIDApOworICB9CisgIGludCByID0gRlhTWVNfcm91bmQocENvbG9yLT5HZXROdW1iZXIoMCkgKiAyNTUpOworICBpbnQgZyA9IEZYU1lTX3JvdW5kKHBDb2xvci0+R2V0TnVtYmVyKDEpICogMjU1KTsKKyAgaW50IGIgPSBGWFNZU19yb3VuZChwQ29sb3ItPkdldE51bWJlcigyKSAqIDI1NSk7CisgIHJldHVybiBGWFNZU19SR0IociwgZywgYik7CiB9Ci1GWF9EV09SRCBDUERGX0Jvb2ttYXJrOjpHZXRGb250U3R5bGUoKSBjb25zdAotewotICAgIGlmICghbV9wRGljdCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcERpY3QtPkdldEludGVnZXIoIkYiKTsKK0ZYX0RXT1JEIENQREZfQm9va21hcms6OkdldEZvbnRTdHlsZSgpIGNvbnN0IHsKKyAgaWYgKCFtX3BEaWN0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIG1fcERpY3QtPkdldEludGVnZXIoIkYiKTsKIH0KLUNGWF9XaWRlU3RyaW5nIENQREZfQm9va21hcms6OkdldFRpdGxlKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fcERpY3QpIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENQREZfU3RyaW5nKiBwU3RyaW5nID0gKENQREZfU3RyaW5nKiltX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIlRpdGxlIik7Ci0gICAgaWYgKCFwU3RyaW5nIHx8IHBTdHJpbmctPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSSU5HKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyB0aXRsZSA9IHBTdHJpbmctPkdldFVuaWNvZGVUZXh0KCk7Ci0gICAgaW50IGxlbiA9IHRpdGxlLkdldExlbmd0aCgpOwotICAgIGlmICghbGVuKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSAgICBub25zdGQ6OnVuaXF1ZV9wdHI8RlhfV0NIQVJbXT4gYnVmKG5ldyBGWF9XQ0hBUltsZW5dKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIEZYX1dDSEFSIHcgPSB0aXRsZVtpXTsKLSAgICAgICAgYnVmW2ldID0gdyA+IDB4MjAgPyB3IDogMHgyMDsKLSAgICB9Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKGJ1Zi5nZXQoKSwgbGVuKTsKK0NGWF9XaWRlU3RyaW5nIENQREZfQm9va21hcms6OkdldFRpdGxlKCkgY29uc3QgeworICBpZiAoIW1fcERpY3QpIHsKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorICBDUERGX1N0cmluZyogcFN0cmluZyA9IChDUERGX1N0cmluZyopbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJUaXRsZSIpOworICBpZiAoIXBTdHJpbmcgfHwgcFN0cmluZy0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJJTkcpIHsKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorICBDRlhfV2lkZVN0cmluZyB0aXRsZSA9IHBTdHJpbmctPkdldFVuaWNvZGVUZXh0KCk7CisgIGludCBsZW4gPSB0aXRsZS5HZXRMZW5ndGgoKTsKKyAgaWYgKCFsZW4pIHsKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorICBub25zdGQ6OnVuaXF1ZV9wdHI8RlhfV0NIQVJbXT4gYnVmKG5ldyBGWF9XQ0hBUltsZW5dKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIEZYX1dDSEFSIHcgPSB0aXRsZVtpXTsKKyAgICBidWZbaV0gPSB3ID4gMHgyMCA/IHcgOiAweDIwOworICB9CisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhidWYuZ2V0KCksIGxlbik7CiB9Ci1DUERGX0Rlc3QgQ1BERl9Cb29rbWFyazo6R2V0RGVzdChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BEaWN0KSB7Ci0gICAgICAgIHJldHVybiBDUERGX0Rlc3QoKTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBEZXN0ID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJEZXN0Iik7Ci0gICAgaWYgKCFwRGVzdCkgewotICAgICAgICByZXR1cm4gQ1BERl9EZXN0KCk7Ci0gICAgfQotICAgIGlmIChwRGVzdC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcgfHwgcERlc3QtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICBDUERGX05hbWVUcmVlIG5hbWVfdHJlZShwRG9jdW1lbnQsIEZYX0JTVFJDKCJEZXN0cyIpKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIG5hbWUgPSBwRGVzdC0+R2V0U3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBDUERGX0Rlc3QobmFtZV90cmVlLkxvb2t1cE5hbWVkRGVzdChwRG9jdW1lbnQsIG5hbWUpKTsKLSAgICB9Ci0gICAgaWYgKHBEZXN0LT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybiBDUERGX0Rlc3QoKENQREZfQXJyYXkqKXBEZXN0KTsKLSAgICB9CitDUERGX0Rlc3QgQ1BERl9Cb29rbWFyazo6R2V0RGVzdChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIGNvbnN0IHsKKyAgaWYgKCFtX3BEaWN0KSB7CiAgICAgcmV0dXJuIENQREZfRGVzdCgpOworICB9CisgIENQREZfT2JqZWN0KiBwRGVzdCA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiRGVzdCIpOworICBpZiAoIXBEZXN0KSB7CisgICAgcmV0dXJuIENQREZfRGVzdCgpOworICB9CisgIGlmIChwRGVzdC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcgfHwgcERlc3QtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgeworICAgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKHBEb2N1bWVudCwgRlhfQlNUUkMoIkRlc3RzIikpOworICAgIENGWF9CeXRlU3RyaW5nQyBuYW1lID0gcERlc3QtPkdldFN0cmluZygpOworICAgIHJldHVybiBDUERGX0Rlc3QobmFtZV90cmVlLkxvb2t1cE5hbWVkRGVzdChwRG9jdW1lbnQsIG5hbWUpKTsKKyAgfQorICBpZiAocERlc3QtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICByZXR1cm4gQ1BERl9EZXN0KChDUERGX0FycmF5KilwRGVzdCk7CisgIH0KKyAgcmV0dXJuIENQREZfRGVzdCgpOwogfQotQ1BERl9BY3Rpb24gQ1BERl9Cb29rbWFyazo6R2V0QWN0aW9uKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fcERpY3QpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiBDUERGX0FjdGlvbihtX3BEaWN0LT5HZXREaWN0KCJBIikpOworQ1BERl9BY3Rpb24gQ1BERl9Cb29rbWFyazo6R2V0QWN0aW9uKCkgY29uc3QgeworICBpZiAoIW1fcERpY3QpIHsKKyAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKKyAgfQorICByZXR1cm4gQ1BERl9BY3Rpb24obV9wRGljdC0+R2V0RGljdCgiQSIpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm0uY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybS5jcHAKaW5kZXggNWEyYmQxNC4uYTkyMWQ0OSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybS5jcHAKQEAgLTksMTYyNSArOSwxNjIzIEBACiAKIGNvbnN0IGludCBuTWF4UmVjdXJzaW9uID0gMzI7CiAKLWNsYXNzIF9DRmllbGROYW1lRXh0cmFjdG9yCi17Ci1wdWJsaWM6Ci0gICAgX0NGaWVsZE5hbWVFeHRyYWN0b3IoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxfbmFtZSkKLSAgICB7Ci0gICAgICAgIG1fcFN0YXJ0ID0gZnVsbF9uYW1lLmNfc3RyKCk7Ci0gICAgICAgIG1fcEVuZCA9IG1fcFN0YXJ0ICsgZnVsbF9uYW1lLkdldExlbmd0aCgpOwotICAgICAgICBtX3BDdXIgPSBtX3BTdGFydDsKK2NsYXNzIF9DRmllbGROYW1lRXh0cmFjdG9yIHsKKyBwdWJsaWM6CisgIF9DRmllbGROYW1lRXh0cmFjdG9yKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmdWxsX25hbWUpIHsKKyAgICBtX3BTdGFydCA9IGZ1bGxfbmFtZS5jX3N0cigpOworICAgIG1fcEVuZCA9IG1fcFN0YXJ0ICsgZnVsbF9uYW1lLkdldExlbmd0aCgpOworICAgIG1fcEN1ciA9IG1fcFN0YXJ0OworICB9CisgIHZvaWQgR2V0TmV4dChjb25zdCBGWF9XQ0hBUiomIHBTdWJOYW1lLCBGWF9TVFJTSVpFJiBzaXplKSB7CisgICAgcFN1Yk5hbWUgPSBtX3BDdXI7CisgICAgd2hpbGUgKG1fcEN1ciA8IG1fcEVuZCAmJiBtX3BDdXJbMF0gIT0gTCcuJykgeworICAgICAgbV9wQ3VyKys7CiAgICAgfQotICAgIHZvaWQgR2V0TmV4dChjb25zdCBGWF9XQ0hBUiogJnBTdWJOYW1lLCBGWF9TVFJTSVpFJiBzaXplKQotICAgIHsKLSAgICAgICAgcFN1Yk5hbWUgPSBtX3BDdXI7Ci0gICAgICAgIHdoaWxlIChtX3BDdXIgPCBtX3BFbmQgJiYgbV9wQ3VyWzBdICE9IEwnLicpIHsKLSAgICAgICAgICAgIG1fcEN1cisrOwotICAgICAgICB9Ci0gICAgICAgIHNpemUgPSAoRlhfU1RSU0laRSkobV9wQ3VyIC0gcFN1Yk5hbWUpOwotICAgICAgICBpZiAobV9wQ3VyIDwgbV9wRW5kICYmIG1fcEN1clswXSA9PSBMJy4nKSB7Ci0gICAgICAgICAgICBtX3BDdXIrKzsKLSAgICAgICAgfQorICAgIHNpemUgPSAoRlhfU1RSU0laRSkobV9wQ3VyIC0gcFN1Yk5hbWUpOworICAgIGlmIChtX3BDdXIgPCBtX3BFbmQgJiYgbV9wQ3VyWzBdID09IEwnLicpIHsKKyAgICAgIG1fcEN1cisrOwogICAgIH0KLXByb3RlY3RlZDoKLSAgICBjb25zdCBGWF9XQ0hBUiogbV9wU3RhcnQ7Ci0gICAgY29uc3QgRlhfV0NIQVIqIG1fcEVuZDsKLSAgICBjb25zdCBGWF9XQ0hBUiogbV9wQ3VyOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IEZYX1dDSEFSKiBtX3BTdGFydDsKKyAgY29uc3QgRlhfV0NIQVIqIG1fcEVuZDsKKyAgY29uc3QgRlhfV0NIQVIqIG1fcEN1cjsKIH07Ci1jbGFzcyBDRmllbGRUcmVlCi17Ci1wdWJsaWM6Ci0gICAgc3RydWN0IF9Ob2RlICB7Ci0gICAgICAgIF9Ob2RlICpwYXJlbnQ7Ci0gICAgICAgIENGWF9QdHJBcnJheSBjaGlsZHJlbjsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc2hvcnRfbmFtZTsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQgKmZpZWxkX3B0cjsKLSAgICAgICAgaW50IENvdW50RmllbGRzKGludCBuTGV2ZWwgPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpZWxkX3B0cikgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgY291bnQgKz0gKChfTm9kZSAqKWNoaWxkcmVuLkdldEF0KGkpKS0+Q291bnRGaWVsZHMobkxldmVsICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY291bnQ7CitjbGFzcyBDRmllbGRUcmVlIHsKKyBwdWJsaWM6CisgIHN0cnVjdCBfTm9kZSB7CisgICAgX05vZGUqIHBhcmVudDsKKyAgICBDRlhfUHRyQXJyYXkgY2hpbGRyZW47CisgICAgQ0ZYX1dpZGVTdHJpbmcgc2hvcnRfbmFtZTsKKyAgICBDUERGX0Zvcm1GaWVsZCogZmllbGRfcHRyOworICAgIGludCBDb3VudEZpZWxkcyhpbnQgbkxldmVsID0gMCkgeworICAgICAgaWYgKG5MZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpZiAoZmllbGRfcHRyKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uR2V0U2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY291bnQgKz0gKChfTm9kZSopY2hpbGRyZW4uR2V0QXQoaSkpLT5Db3VudEZpZWxkcyhuTGV2ZWwgKyAxKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisgICAgQ1BERl9Gb3JtRmllbGQqIEdldEZpZWxkKGludCogZmllbGRzX3RvX2dvKSB7CisgICAgICBpZiAoZmllbGRfcHRyKSB7CisgICAgICAgIGlmICgqZmllbGRzX3RvX2dvID09IDApIHsKKyAgICAgICAgICByZXR1cm4gZmllbGRfcHRyOwogICAgICAgICB9Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBHZXRGaWVsZChpbnQqIGZpZWxkc190b19nbykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGZpZWxkX3B0cikgewotICAgICAgICAgICAgICAgIGlmICgqZmllbGRzX3RvX2dvID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkX3B0cjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLS0qZmllbGRzX3RvX2dvOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5HZXRTaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIF9Ob2RlICpwTm9kZSA9IChfTm9kZSAqKWNoaWxkcmVuLkdldEF0KGkpOwotICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwTm9kZS0+R2V0RmllbGQoZmllbGRzX3RvX2dvKTsKLSAgICAgICAgICAgICAgICBpZiAocEZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwRmllbGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIC0tKmZpZWxkc190b19nbzsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLkdldFNpemUoKTsgaSsrKSB7CisgICAgICAgIF9Ob2RlKiBwTm9kZSA9IChfTm9kZSopY2hpbGRyZW4uR2V0QXQoaSk7CisgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwTm9kZS0+R2V0RmllbGQoZmllbGRzX3RvX2dvKTsKKyAgICAgICAgaWYgKHBGaWVsZCkgeworICAgICAgICAgIHJldHVybiBwRmllbGQ7CiAgICAgICAgIH0KLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIEdldEZpZWxkKGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGZpZWxkc190b19nbyA9IGluZGV4OwotICAgICAgICAgICAgcmV0dXJuIEdldEZpZWxkKCZmaWVsZHNfdG9fZ28pOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBDRmllbGRUcmVlKCk7Ci0gICAgfkNGaWVsZFRyZWUoKTsKLSAgICB2b2lkIFNldEZpZWxkKGNvbnN0IENGWF9XaWRlU3RyaW5nICZmdWxsX25hbWUsIENQREZfRm9ybUZpZWxkICpmaWVsZF9wdHIpOwotICAgIENQREZfRm9ybUZpZWxkICpHZXRGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyAmZnVsbF9uYW1lKTsKLSAgICBDUERGX0Zvcm1GaWVsZCAqUmVtb3ZlRmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmZ1bGxfbmFtZSk7Ci0gICAgdm9pZCBSZW1vdmVBbGwoKTsKLSAgICBfTm9kZSAqRmluZE5vZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmZ1bGxfbmFtZSk7Ci0gICAgX05vZGUgKiBBZGRDaGlsZChfTm9kZSAqcFBhcmVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnNob3J0X25hbWUsIENQREZfRm9ybUZpZWxkICpmaWVsZF9wdHIpOwotICAgIHZvaWQgUmVtb3ZlTm9kZShfTm9kZSAqcE5vZGUsIGludCBuTGV2ZWwgPSAwKTsKLSAgICBfTm9kZSAqX0xvb2t1cChfTm9kZSAqcFBhcmVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnNob3J0X25hbWUpOwotICAgIF9Ob2RlIG1fUm9vdDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBDUERGX0Zvcm1GaWVsZCogR2V0RmllbGQoaW50IGluZGV4KSB7CisgICAgICBpbnQgZmllbGRzX3RvX2dvID0gaW5kZXg7CisgICAgICByZXR1cm4gR2V0RmllbGQoJmZpZWxkc190b19nbyk7CisgICAgfQorICB9OworICBDRmllbGRUcmVlKCk7CisgIH5DRmllbGRUcmVlKCk7CisgIHZvaWQgU2V0RmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxfbmFtZSwgQ1BERl9Gb3JtRmllbGQqIGZpZWxkX3B0cik7CisgIENQREZfRm9ybUZpZWxkKiBHZXRGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyYgZnVsbF9uYW1lKTsKKyAgQ1BERl9Gb3JtRmllbGQqIFJlbW92ZUZpZWxkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmdWxsX25hbWUpOworICB2b2lkIFJlbW92ZUFsbCgpOworICBfTm9kZSogRmluZE5vZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxfbmFtZSk7CisgIF9Ob2RlKiBBZGRDaGlsZChfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIGZpZWxkX3B0cik7CisgIHZvaWQgUmVtb3ZlTm9kZShfTm9kZSogcE5vZGUsIGludCBuTGV2ZWwgPSAwKTsKKyAgX05vZGUqIF9Mb29rdXAoX05vZGUqIHBQYXJlbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzaG9ydF9uYW1lKTsKKyAgX05vZGUgbV9Sb290OwogfTsKLUNGaWVsZFRyZWU6OkNGaWVsZFRyZWUoKQotewotICAgIG1fUm9vdC5wYXJlbnQgPSBOVUxMOwotICAgIG1fUm9vdC5maWVsZF9wdHIgPSBOVUxMOworQ0ZpZWxkVHJlZTo6Q0ZpZWxkVHJlZSgpIHsKKyAgbV9Sb290LnBhcmVudCA9IE5VTEw7CisgIG1fUm9vdC5maWVsZF9wdHIgPSBOVUxMOwogfQotQ0ZpZWxkVHJlZTo6fkNGaWVsZFRyZWUoKQotewotICAgIFJlbW92ZUFsbCgpOworQ0ZpZWxkVHJlZTo6fkNGaWVsZFRyZWUoKSB7CisgIFJlbW92ZUFsbCgpOwogfQotQ0ZpZWxkVHJlZTo6X05vZGUgKkNGaWVsZFRyZWU6OkFkZENoaWxkKF9Ob2RlICpwUGFyZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmc2hvcnRfbmFtZSwgQ1BERl9Gb3JtRmllbGQgKmZpZWxkX3B0cikKLXsKLSAgICBpZiAocFBhcmVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBfTm9kZSAqcE5vZGUgPSBGWF9ORVcgX05vZGU7Ci0gICAgaWYgKHBOb2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBOb2RlLT5wYXJlbnQgPSBwUGFyZW50OwotICAgIHBOb2RlLT5zaG9ydF9uYW1lID0gc2hvcnRfbmFtZTsKLSAgICBwTm9kZS0+ZmllbGRfcHRyID0gZmllbGRfcHRyOwotICAgIHBQYXJlbnQtPmNoaWxkcmVuLkFkZChwTm9kZSk7Ci0gICAgcmV0dXJuIHBOb2RlOworQ0ZpZWxkVHJlZTo6X05vZGUqIENGaWVsZFRyZWU6OkFkZENoaWxkKF9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBmaWVsZF9wdHIpIHsKKyAgaWYgKHBQYXJlbnQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIF9Ob2RlKiBwTm9kZSA9IEZYX05FVyBfTm9kZTsKKyAgaWYgKHBOb2RlID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwTm9kZS0+cGFyZW50ID0gcFBhcmVudDsKKyAgcE5vZGUtPnNob3J0X25hbWUgPSBzaG9ydF9uYW1lOworICBwTm9kZS0+ZmllbGRfcHRyID0gZmllbGRfcHRyOworICBwUGFyZW50LT5jaGlsZHJlbi5BZGQocE5vZGUpOworICByZXR1cm4gcE5vZGU7CiB9Ci12b2lkIENGaWVsZFRyZWU6OlJlbW92ZU5vZGUoX05vZGUgKnBOb2RlLCBpbnQgbkxldmVsKQotewotICAgIGlmIChwTm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotICAgIGlmIChuTGV2ZWwgPiBuTWF4UmVjdXJzaW9uKSB7Ci0gICAgICAgIGRlbGV0ZSBwTm9kZTsKLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0gICAgQ0ZYX1B0ckFycmF5JiBwdHJfYXJyYXkgPSBwTm9kZS0+Y2hpbGRyZW47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdHJfYXJyYXkuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIF9Ob2RlICpwQ2hpbGQgPSAoX05vZGUgKilwdHJfYXJyYXlbaV07Ci0gICAgICAgIFJlbW92ZU5vZGUocENoaWxkLCBuTGV2ZWwgKyAxKTsKLSAgICB9Cit2b2lkIENGaWVsZFRyZWU6OlJlbW92ZU5vZGUoX05vZGUqIHBOb2RlLCBpbnQgbkxldmVsKSB7CisgIGlmIChwTm9kZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChuTGV2ZWwgPiBuTWF4UmVjdXJzaW9uKSB7CiAgICAgZGVsZXRlIHBOb2RlOworICAgIHJldHVybjsKKyAgfQorICBDRlhfUHRyQXJyYXkmIHB0cl9hcnJheSA9IHBOb2RlLT5jaGlsZHJlbjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdHJfYXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBfTm9kZSogcENoaWxkID0gKF9Ob2RlKilwdHJfYXJyYXlbaV07CisgICAgUmVtb3ZlTm9kZShwQ2hpbGQsIG5MZXZlbCArIDEpOworICB9CisgIGRlbGV0ZSBwTm9kZTsKIH0KLUNGaWVsZFRyZWU6Ol9Ob2RlICpDRmllbGRUcmVlOjpfTG9va3VwKF9Ob2RlICpwUGFyZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmc2hvcnRfbmFtZSkKLXsKLSAgICBpZiAocFBhcmVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfUHRyQXJyYXkmIHB0cl9hcnJheSA9IHBQYXJlbnQtPmNoaWxkcmVuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHRyX2FycmF5LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBfTm9kZSAqcE5vZGUgPSAoX05vZGUgKilwdHJfYXJyYXlbaV07Ci0gICAgICAgIGlmIChwTm9kZS0+c2hvcnRfbmFtZS5HZXRMZW5ndGgoKSA9PSBzaG9ydF9uYW1lLkdldExlbmd0aCgpICYmCi0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY21wKHBOb2RlLT5zaG9ydF9uYW1lLmNfc3RyKCksIHNob3J0X25hbWUuY19zdHIoKSwgc2hvcnRfbmFtZS5HZXRMZW5ndGgoKSpzaXplb2YoRlhfV0NIQVIpKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gcE5vZGU7Ci0gICAgICAgIH0KLSAgICB9CitDRmllbGRUcmVlOjpfTm9kZSogQ0ZpZWxkVHJlZTo6X0xvb2t1cChfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzaG9ydF9uYW1lKSB7CisgIGlmIChwUGFyZW50ID09IE5VTEwpIHsKICAgICByZXR1cm4gTlVMTDsKLX0KLXZvaWQgQ0ZpZWxkVHJlZTo6UmVtb3ZlQWxsKCkKLXsKLSAgICBDRlhfUHRyQXJyYXkmIHB0cl9hcnJheSA9IG1fUm9vdC5jaGlsZHJlbjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHB0cl9hcnJheS5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgX05vZGUgKnBOb2RlID0gKF9Ob2RlICopcHRyX2FycmF5W2ldOwotICAgICAgICBSZW1vdmVOb2RlKHBOb2RlKTsKKyAgfQorICBDRlhfUHRyQXJyYXkmIHB0cl9hcnJheSA9IHBQYXJlbnQtPmNoaWxkcmVuOworICBmb3IgKGludCBpID0gMDsgaSA8IHB0cl9hcnJheS5HZXRTaXplKCk7IGkrKykgeworICAgIF9Ob2RlKiBwTm9kZSA9IChfTm9kZSopcHRyX2FycmF5W2ldOworICAgIGlmIChwTm9kZS0+c2hvcnRfbmFtZS5HZXRMZW5ndGgoKSA9PSBzaG9ydF9uYW1lLkdldExlbmd0aCgpICYmCisgICAgICAgIEZYU1lTX21lbWNtcChwTm9kZS0+c2hvcnRfbmFtZS5jX3N0cigpLCBzaG9ydF9uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICBzaG9ydF9uYW1lLkdldExlbmd0aCgpICogc2l6ZW9mKEZYX1dDSEFSKSkgPT0gMCkgeworICAgICAgcmV0dXJuIHBOb2RlOwogICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLXZvaWQgQ0ZpZWxkVHJlZTo6U2V0RmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmZ1bGxfbmFtZSwgQ1BERl9Gb3JtRmllbGQgKmZpZWxkX3B0cikKLXsKLSAgICBpZiAoZnVsbF9uYW1lID09IEwiIikgewotICAgICAgICByZXR1cm47Cit2b2lkIENGaWVsZFRyZWU6OlJlbW92ZUFsbCgpIHsKKyAgQ0ZYX1B0ckFycmF5JiBwdHJfYXJyYXkgPSBtX1Jvb3QuY2hpbGRyZW47CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHRyX2FycmF5LkdldFNpemUoKTsgaSsrKSB7CisgICAgX05vZGUqIHBOb2RlID0gKF9Ob2RlKilwdHJfYXJyYXlbaV07CisgICAgUmVtb3ZlTm9kZShwTm9kZSk7CisgIH0KK30KK3ZvaWQgQ0ZpZWxkVHJlZTo6U2V0RmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIGZpZWxkX3B0cikgeworICBpZiAoZnVsbF9uYW1lID09IEwiIikgeworICAgIHJldHVybjsKKyAgfQorICBfQ0ZpZWxkTmFtZUV4dHJhY3RvciBuYW1lX2V4dHJhY3RvcihmdWxsX25hbWUpOworICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7CisgIEZYX1NUUlNJWkUgbkxlbmd0aDsKKyAgbmFtZV9leHRyYWN0b3IuR2V0TmV4dChwTmFtZSwgbkxlbmd0aCk7CisgIF9Ob2RlICpwTm9kZSA9ICZtX1Jvb3QsICpwTGFzdCA9IE5VTEw7CisgIHdoaWxlIChuTGVuZ3RoID4gMCkgeworICAgIHBMYXN0ID0gcE5vZGU7CisgICAgQ0ZYX1dpZGVTdHJpbmcgbmFtZSA9IENGWF9XaWRlU3RyaW5nKHBOYW1lLCBuTGVuZ3RoKTsKKyAgICBwTm9kZSA9IF9Mb29rdXAocExhc3QsIG5hbWUpOworICAgIGlmIChwTm9kZSA9PSBOVUxMKSB7CisgICAgICBwTm9kZSA9IEFkZENoaWxkKHBMYXN0LCBuYW1lLCBOVUxMKTsKICAgICB9Ci0gICAgX0NGaWVsZE5hbWVFeHRyYWN0b3IgbmFtZV9leHRyYWN0b3IoZnVsbF9uYW1lKTsKLSAgICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7Ci0gICAgRlhfU1RSU0laRSBuTGVuZ3RoOwogICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOwotICAgIF9Ob2RlICpwTm9kZSA9ICZtX1Jvb3QsICpwTGFzdCA9IE5VTEw7Ci0gICAgd2hpbGUgKG5MZW5ndGggPiAwKSB7Ci0gICAgICAgIHBMYXN0ID0gcE5vZGU7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIG5hbWUgPSBDRlhfV2lkZVN0cmluZyhwTmFtZSwgbkxlbmd0aCk7Ci0gICAgICAgIHBOb2RlID0gX0xvb2t1cChwTGFzdCwgbmFtZSk7Ci0gICAgICAgIGlmIChwTm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBwTm9kZSA9IEFkZENoaWxkKHBMYXN0LCBuYW1lLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBuYW1lX2V4dHJhY3Rvci5HZXROZXh0KHBOYW1lLCBuTGVuZ3RoKTsKLSAgICB9Ci0gICAgaWYgKHBOb2RlICE9ICZtX1Jvb3QpIHsKLSAgICAgICAgcE5vZGUtPmZpZWxkX3B0ciA9IGZpZWxkX3B0cjsKLSAgICB9CisgIH0KKyAgaWYgKHBOb2RlICE9ICZtX1Jvb3QpIHsKKyAgICBwTm9kZS0+ZmllbGRfcHRyID0gZmllbGRfcHRyOworICB9CiB9Ci1DUERGX0Zvcm1GaWVsZCAqQ0ZpZWxkVHJlZTo6R2V0RmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmZ1bGxfbmFtZSkKLXsKLSAgICBpZiAoZnVsbF9uYW1lID09IEwiIikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgX0NGaWVsZE5hbWVFeHRyYWN0b3IgbmFtZV9leHRyYWN0b3IoZnVsbF9uYW1lKTsKLSAgICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7Ci0gICAgRlhfU1RSU0laRSBuTGVuZ3RoOwotICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOwotICAgIF9Ob2RlICpwTm9kZSA9ICZtX1Jvb3QsICpwTGFzdCA9IE5VTEw7Ci0gICAgd2hpbGUgKG5MZW5ndGggPiAwICYmIHBOb2RlKSB7Ci0gICAgICAgIHBMYXN0ID0gcE5vZGU7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIG5hbWUgPSBDRlhfV2lkZVN0cmluZyhwTmFtZSwgbkxlbmd0aCk7Ci0gICAgICAgIHBOb2RlID0gX0xvb2t1cChwTGFzdCwgbmFtZSk7Ci0gICAgICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOwotICAgIH0KLSAgICByZXR1cm4gcE5vZGUgPyBwTm9kZS0+ZmllbGRfcHRyIDogTlVMTDsKLX0KLUNQREZfRm9ybUZpZWxkICpDRmllbGRUcmVlOjpSZW1vdmVGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZ1bGxfbmFtZSkKLXsKLSAgICBpZiAoZnVsbF9uYW1lID09IEwiIikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgX0NGaWVsZE5hbWVFeHRyYWN0b3IgbmFtZV9leHRyYWN0b3IoZnVsbF9uYW1lKTsKLSAgICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7Ci0gICAgRlhfU1RSU0laRSBuTGVuZ3RoOwotICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOwotICAgIF9Ob2RlICpwTm9kZSA9ICZtX1Jvb3QsICpwTGFzdCA9IE5VTEw7Ci0gICAgd2hpbGUgKG5MZW5ndGggPiAwICYmIHBOb2RlKSB7Ci0gICAgICAgIHBMYXN0ID0gcE5vZGU7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIG5hbWUgPSBDRlhfV2lkZVN0cmluZyhwTmFtZSwgbkxlbmd0aCk7Ci0gICAgICAgIHBOb2RlID0gX0xvb2t1cChwTGFzdCwgbmFtZSk7Ci0gICAgICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOwotICAgIH0KLSAgICBpZiAocE5vZGUgJiYgcE5vZGUgIT0gJm1fUm9vdCkgewotICAgICAgICBDRlhfUHRyQXJyYXkmIHB0cl9hcnJheSA9IHBMYXN0LT5jaGlsZHJlbjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdHJfYXJyYXkuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAocE5vZGUgPT0gKF9Ob2RlICopcHRyX2FycmF5W2ldKSB7Ci0gICAgICAgICAgICAgICAgcHRyX2FycmF5LlJlbW92ZUF0KGkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENQREZfRm9ybUZpZWxkICpwRmllbGQgPSBwTm9kZS0+ZmllbGRfcHRyOwotICAgICAgICBSZW1vdmVOb2RlKHBOb2RlKTsKLSAgICAgICAgcmV0dXJuIHBGaWVsZDsKLSAgICB9CitDUERGX0Zvcm1GaWVsZCogQ0ZpZWxkVHJlZTo6R2V0RmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxfbmFtZSkgeworICBpZiAoZnVsbF9uYW1lID09IEwiIikgewogICAgIHJldHVybiBOVUxMOwotfQotQ0ZpZWxkVHJlZTo6X05vZGUgKkNGaWVsZFRyZWU6OkZpbmROb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmdWxsX25hbWUpCi17Ci0gICAgaWYgKGZ1bGxfbmFtZSA9PSBMIiIpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIF9DRmllbGROYW1lRXh0cmFjdG9yIG5hbWVfZXh0cmFjdG9yKGZ1bGxfbmFtZSk7Ci0gICAgY29uc3QgRlhfV0NIQVIqIHBOYW1lOwotICAgIEZYX1NUUlNJWkUgbkxlbmd0aDsKKyAgfQorICBfQ0ZpZWxkTmFtZUV4dHJhY3RvciBuYW1lX2V4dHJhY3RvcihmdWxsX25hbWUpOworICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7CisgIEZYX1NUUlNJWkUgbkxlbmd0aDsKKyAgbmFtZV9leHRyYWN0b3IuR2V0TmV4dChwTmFtZSwgbkxlbmd0aCk7CisgIF9Ob2RlICpwTm9kZSA9ICZtX1Jvb3QsICpwTGFzdCA9IE5VTEw7CisgIHdoaWxlIChuTGVuZ3RoID4gMCAmJiBwTm9kZSkgeworICAgIHBMYXN0ID0gcE5vZGU7CisgICAgQ0ZYX1dpZGVTdHJpbmcgbmFtZSA9IENGWF9XaWRlU3RyaW5nKHBOYW1lLCBuTGVuZ3RoKTsKKyAgICBwTm9kZSA9IF9Mb29rdXAocExhc3QsIG5hbWUpOwogICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOwotICAgIF9Ob2RlICpwTm9kZSA9ICZtX1Jvb3QsICpwTGFzdCA9IE5VTEw7Ci0gICAgd2hpbGUgKG5MZW5ndGggPiAwICYmIHBOb2RlKSB7Ci0gICAgICAgIHBMYXN0ID0gcE5vZGU7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIG5hbWUgPSBDRlhfV2lkZVN0cmluZyhwTmFtZSwgbkxlbmd0aCk7Ci0gICAgICAgIHBOb2RlID0gX0xvb2t1cChwTGFzdCwgbmFtZSk7Ci0gICAgICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOwotICAgIH0KLSAgICByZXR1cm4gcE5vZGU7CisgIH0KKyAgcmV0dXJuIHBOb2RlID8gcE5vZGUtPmZpZWxkX3B0ciA6IE5VTEw7CiB9Ci1DUERGX0ludGVyRm9ybTo6Q1BERl9JbnRlckZvcm0oQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9CT09MIGJHZW5lcmF0ZUFQKSA6IENGWF9Qcml2YXRlRGF0YSgpCi17Ci0gICAgbV9wRG9jdW1lbnQgPSBwRG9jdW1lbnQ7Ci0gICAgbV9iR2VuZXJhdGVBUCA9IGJHZW5lcmF0ZUFQOwotICAgIG1fcEZvcm1Ob3RpZnkgPSBOVUxMOwotICAgIG1fYlVwZGF0ZWQgPSBGQUxTRTsKLSAgICBtX3BGaWVsZFRyZWUgPSBGWF9ORVcgQ0ZpZWxkVHJlZTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKLSAgICBtX3BGb3JtRGljdCA9IHBSb290LT5HZXREaWN0KCJBY3JvRm9ybSIpOwotICAgIGlmIChtX3BGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK0NQREZfRm9ybUZpZWxkKiBDRmllbGRUcmVlOjpSZW1vdmVGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyYgZnVsbF9uYW1lKSB7CisgIGlmIChmdWxsX25hbWUgPT0gTCIiKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgX0NGaWVsZE5hbWVFeHRyYWN0b3IgbmFtZV9leHRyYWN0b3IoZnVsbF9uYW1lKTsKKyAgY29uc3QgRlhfV0NIQVIqIHBOYW1lOworICBGWF9TVFJTSVpFIG5MZW5ndGg7CisgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOworICBfTm9kZSAqcE5vZGUgPSAmbV9Sb290LCAqcExhc3QgPSBOVUxMOworICB3aGlsZSAobkxlbmd0aCA+IDAgJiYgcE5vZGUpIHsKKyAgICBwTGFzdCA9IHBOb2RlOworICAgIENGWF9XaWRlU3RyaW5nIG5hbWUgPSBDRlhfV2lkZVN0cmluZyhwTmFtZSwgbkxlbmd0aCk7CisgICAgcE5vZGUgPSBfTG9va3VwKHBMYXN0LCBuYW1lKTsKKyAgICBuYW1lX2V4dHJhY3Rvci5HZXROZXh0KHBOYW1lLCBuTGVuZ3RoKTsKKyAgfQorICBpZiAocE5vZGUgJiYgcE5vZGUgIT0gJm1fUm9vdCkgeworICAgIENGWF9QdHJBcnJheSYgcHRyX2FycmF5ID0gcExhc3QtPmNoaWxkcmVuOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHRyX2FycmF5LkdldFNpemUoKTsgaSsrKSB7CisgICAgICBpZiAocE5vZGUgPT0gKF9Ob2RlKilwdHJfYXJyYXlbaV0pIHsKKyAgICAgICAgcHRyX2FycmF5LlJlbW92ZUF0KGkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgQ1BERl9BcnJheSogcEZpZWxkcyA9IG1fcEZvcm1EaWN0LT5HZXRBcnJheSgiRmllbGRzIik7Ci0gICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBjb3VudCA9IHBGaWVsZHMtPkdldENvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBMb2FkRmllbGQocEZpZWxkcy0+R2V0RGljdChpKSk7Ci0gICAgfQorICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwTm9kZS0+ZmllbGRfcHRyOworICAgIFJlbW92ZU5vZGUocE5vZGUpOworICAgIHJldHVybiBwRmllbGQ7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci1DUERGX0ludGVyRm9ybTo6fkNQREZfSW50ZXJGb3JtKCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0NvbnRyb2xNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgdm9pZCoga2V5OwotICAgICAgICB2b2lkKiB2YWx1ZTsKLSAgICAgICAgbV9Db250cm9sTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICBkZWxldGUgKENQREZfRm9ybUNvbnRyb2wqKXZhbHVlOwotICAgIH0KLSAgICBpZiAobV9wRmllbGRUcmVlICE9IE5VTEwpIHsKLSAgICAgICAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENQREZfRm9ybUZpZWxkICpwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKTsKLSAgICAgICAgICAgIGRlbGV0ZSBwRmllbGQ7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIG1fcEZpZWxkVHJlZTsKLSAgICB9CitDRmllbGRUcmVlOjpfTm9kZSogQ0ZpZWxkVHJlZTo6RmluZE5vZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxfbmFtZSkgeworICBpZiAoZnVsbF9uYW1lID09IEwiIikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIF9DRmllbGROYW1lRXh0cmFjdG9yIG5hbWVfZXh0cmFjdG9yKGZ1bGxfbmFtZSk7CisgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsKKyAgRlhfU1RSU0laRSBuTGVuZ3RoOworICBuYW1lX2V4dHJhY3Rvci5HZXROZXh0KHBOYW1lLCBuTGVuZ3RoKTsKKyAgX05vZGUgKnBOb2RlID0gJm1fUm9vdCwgKnBMYXN0ID0gTlVMTDsKKyAgd2hpbGUgKG5MZW5ndGggPiAwICYmIHBOb2RlKSB7CisgICAgcExhc3QgPSBwTm9kZTsKKyAgICBDRlhfV2lkZVN0cmluZyBuYW1lID0gQ0ZYX1dpZGVTdHJpbmcocE5hbWUsIG5MZW5ndGgpOworICAgIHBOb2RlID0gX0xvb2t1cChwTGFzdCwgbmFtZSk7CisgICAgbmFtZV9leHRyYWN0b3IuR2V0TmV4dChwTmFtZSwgbkxlbmd0aCk7CisgIH0KKyAgcmV0dXJuIHBOb2RlOwogfQotRlhfQk9PTAlDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVAgPSBUUlVFOwotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKQotewotICAgIHJldHVybiBtX2JVcGRhdGVBUDsKK0NQREZfSW50ZXJGb3JtOjpDUERGX0ludGVyRm9ybShDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIEZYX0JPT0wgYkdlbmVyYXRlQVApCisgICAgOiBDRlhfUHJpdmF0ZURhdGEoKSB7CisgIG1fcERvY3VtZW50ID0gcERvY3VtZW50OworICBtX2JHZW5lcmF0ZUFQID0gYkdlbmVyYXRlQVA7CisgIG1fcEZvcm1Ob3RpZnkgPSBOVUxMOworICBtX2JVcGRhdGVkID0gRkFMU0U7CisgIG1fcEZpZWxkVHJlZSA9IEZYX05FVyBDRmllbGRUcmVlOworICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKKyAgbV9wRm9ybURpY3QgPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9BcnJheSogcEZpZWxkcyA9IG1fcEZvcm1EaWN0LT5HZXRBcnJheSgiRmllbGRzIik7CisgIGlmIChwRmllbGRzID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGNvdW50ID0gcEZpZWxkcy0+R2V0Q291bnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgTG9hZEZpZWxkKHBGaWVsZHMtPkdldERpY3QoaSkpOworICB9CiB9Ci12b2lkIENQREZfSW50ZXJGb3JtOjpFbmFibGVVcGRhdGVBUChGWF9CT09MIGJVcGRhdGVBUCkKLXsKLSAgICBtX2JVcGRhdGVBUCA9IGJVcGRhdGVBUDsKLX0KLUNGWF9CeXRlU3RyaW5nIENQREZfSW50ZXJGb3JtOjpHZW5lcmF0ZU5ld1Jlc291cmNlTmFtZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSZXNEaWN0LCBjb25zdCBGWF9DSEFSKiBjc1R5cGUsIGludCBpTWluTGVuLCBjb25zdCBGWF9DSEFSKiBjc1ByZWZpeCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc1N0ciA9IGNzUHJlZml4OwotICAgIENGWF9CeXRlU3RyaW5nIGNzQlR5cGUgPSBjc1R5cGU7Ci0gICAgaWYgKGNzU3RyLklzRW1wdHkoKSkgewotICAgICAgICBpZiAoY3NCVHlwZSA9PSAiRXh0R1N0YXRlIikgewotICAgICAgICAgICAgY3NTdHIgPSAiR1MiOwotICAgICAgICB9IGVsc2UgaWYgKGNzQlR5cGUgPT0gIkNvbG9yU3BhY2UiKSB7Ci0gICAgICAgICAgICBjc1N0ciA9ICJDUyI7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3NCVHlwZSA9PSAiRm9udCIpIHsKLSAgICAgICAgICAgIGNzU3RyID0gIlppVGkiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3NTdHIgPSAiUmVzIjsKLSAgICAgICAgfQorQ1BERl9JbnRlckZvcm06On5DUERGX0ludGVyRm9ybSgpIHsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9Db250cm9sTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIHZvaWQqIGtleTsKKyAgICB2b2lkKiB2YWx1ZTsKKyAgICBtX0NvbnRyb2xNYXAuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7CisgICAgZGVsZXRlIChDUERGX0Zvcm1Db250cm9sKil2YWx1ZTsKKyAgfQorICBpZiAobV9wRmllbGRUcmVlICE9IE5VTEwpIHsKKyAgICBpbnQgbkNvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CisgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGQoaSk7CisgICAgICBkZWxldGUgcEZpZWxkOwogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1RtcCA9IGNzU3RyOwotICAgIGludCBpQ291bnQgPSBjc1N0ci5HZXRMZW5ndGgoKTsKLSAgICBpbnQgbSA9IDA7Ci0gICAgaWYgKGlNaW5MZW4gPiAwKSB7Ci0gICAgICAgIGNzVG1wID0gIiI7Ci0gICAgICAgIHdoaWxlIChtIDwgaU1pbkxlbiAmJiBtIDwgaUNvdW50KSB7Ci0gICAgICAgICAgICBjc1RtcCArPSBjc1N0clttICsrXTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAobSA8IGlNaW5MZW4pIHsKLSAgICAgICAgICAgIGNzVG1wICs9ICcwJyArIG0gJSAxMDsKLSAgICAgICAgICAgIG0gKys7Ci0gICAgICAgIH0KKyAgICBkZWxldGUgbV9wRmllbGRUcmVlOworICB9Cit9CitGWF9CT09MIENQREZfSW50ZXJGb3JtOjptX2JVcGRhdGVBUCA9IFRSVUU7CitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpVcGRhdGluZ0FQRW5hYmxlZCgpIHsKKyAgcmV0dXJuIG1fYlVwZGF0ZUFQOworfQordm9pZCBDUERGX0ludGVyRm9ybTo6RW5hYmxlVXBkYXRlQVAoRlhfQk9PTCBiVXBkYXRlQVApIHsKKyAgbV9iVXBkYXRlQVAgPSBiVXBkYXRlQVA7Cit9CitDRlhfQnl0ZVN0cmluZyBDUERGX0ludGVyRm9ybTo6R2VuZXJhdGVOZXdSZXNvdXJjZU5hbWUoCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwKKyAgICBjb25zdCBGWF9DSEFSKiBjc1R5cGUsCisgICAgaW50IGlNaW5MZW4sCisgICAgY29uc3QgRlhfQ0hBUiogY3NQcmVmaXgpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NTdHIgPSBjc1ByZWZpeDsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NCVHlwZSA9IGNzVHlwZTsKKyAgaWYgKGNzU3RyLklzRW1wdHkoKSkgeworICAgIGlmIChjc0JUeXBlID09ICJFeHRHU3RhdGUiKSB7CisgICAgICBjc1N0ciA9ICJHUyI7CisgICAgfSBlbHNlIGlmIChjc0JUeXBlID09ICJDb2xvclNwYWNlIikgeworICAgICAgY3NTdHIgPSAiQ1MiOworICAgIH0gZWxzZSBpZiAoY3NCVHlwZSA9PSAiRm9udCIpIHsKKyAgICAgIGNzU3RyID0gIlppVGkiOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG0gPSBpQ291bnQ7CisgICAgICBjc1N0ciA9ICJSZXMiOwogICAgIH0KLSAgICBpZiAocFJlc0RpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY3NUbXA7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NUbXAgPSBjc1N0cjsKKyAgaW50IGlDb3VudCA9IGNzU3RyLkdldExlbmd0aCgpOworICBpbnQgbSA9IDA7CisgIGlmIChpTWluTGVuID4gMCkgeworICAgIGNzVG1wID0gIiI7CisgICAgd2hpbGUgKG0gPCBpTWluTGVuICYmIG0gPCBpQ291bnQpIHsKKyAgICAgIGNzVG1wICs9IGNzU3RyW20rK107CiAgICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUmVzRGljdC0+R2V0RGljdChjc1R5cGUpOwotICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBjc1RtcDsKKyAgICB3aGlsZSAobSA8IGlNaW5MZW4pIHsKKyAgICAgIGNzVG1wICs9ICcwJyArIG0gJSAxMDsKKyAgICAgIG0rKzsKICAgICB9Ci0gICAgaW50IG51bSA9IDA7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNOdW07Ci0gICAgd2hpbGUgKFRSVUUpIHsKLSAgICAgICAgaWYgKCFwRGljdC0+S2V5RXhpc3QoY3NUbXAgKyBic051bSkpIHsKLSAgICAgICAgICAgIHJldHVybiBjc1RtcCArIGJzTnVtOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtIDwgaUNvdW50KSB7Ci0gICAgICAgICAgICBjc1RtcCArPSBjc1N0clttICsrXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJzTnVtLkZvcm1hdCgiJWQiLCBudW0rKyk7Ci0gICAgICAgIH0KLSAgICAgICAgbSArKzsKLSAgICB9CisgIH0gZWxzZSB7CisgICAgbSA9IGlDb3VudDsKKyAgfQorICBpZiAocFJlc0RpY3QgPT0gTlVMTCkgewogICAgIHJldHVybiBjc1RtcDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFJlc0RpY3QtPkdldERpY3QoY3NUeXBlKTsKKyAgaWYgKHBEaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gY3NUbXA7CisgIH0KKyAgaW50IG51bSA9IDA7CisgIENGWF9CeXRlU3RyaW5nIGJzTnVtOworICB3aGlsZSAoVFJVRSkgeworICAgIGlmICghcERpY3QtPktleUV4aXN0KGNzVG1wICsgYnNOdW0pKSB7CisgICAgICByZXR1cm4gY3NUbXAgKyBic051bTsKKyAgICB9CisgICAgaWYgKG0gPCBpQ291bnQpIHsKKyAgICAgIGNzVG1wICs9IGNzU3RyW20rK107CisgICAgfSBlbHNlIHsKKyAgICAgIGJzTnVtLkZvcm1hdCgiJWQiLCBudW0rKyk7CisgICAgfQorICAgIG0rKzsKKyAgfQorICByZXR1cm4gY3NUbXA7CiB9CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogdHlwZWRlZiBzdHJ1Y3QgX1BERl9GT05UREFUQSB7Ci0gICAgRlhfQk9PTAkJYkZpbmQ7Ci0gICAgTE9HRk9OVEEJbGY7CisgIEZYX0JPT0wgYkZpbmQ7CisgIExPR0ZPTlRBIGxmOwogfSBQREZfRk9OVERBVEEsIEZBUiogTFBERl9GT05UREFUQTsKLXN0YXRpYyBpbnQgQ0FMTEJBQ0sgRW51bUZvbnRGYW1FeFByb2MoCUVOVU1MT0dGT05URVhBICpscGVsZmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVXVEVYVE1FVFJJQ0VYICpscG50bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRm9udFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBpZiAoRm9udFR5cGUgIT0gMHgwMDQgfHwgc3RyY2hyKGxwZWxmZS0+ZWxmTG9nRm9udC5sZkZhY2VOYW1lLCAnQCcpICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIExQREZfRk9OVERBVEEgcERhdGEgPSAoTFBERl9GT05UREFUQSlsUGFyYW07Ci0gICAgbWVtY3B5KCZwRGF0YS0+bGYsICZscGVsZmUtPmVsZkxvZ0ZvbnQsIHNpemVvZihMT0dGT05UQSkpOwotICAgIHBEYXRhLT5iRmluZCA9IFRSVUU7Ci0gICAgcmV0dXJuIDA7CitzdGF0aWMgaW50IENBTExCQUNLIEVudW1Gb250RmFtRXhQcm9jKEVOVU1MT0dGT05URVhBKiBscGVsZmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FV1RFWFRNRVRSSUNFWCogbHBudG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGb250VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSkgeworICBpZiAoRm9udFR5cGUgIT0gMHgwMDQgfHwgc3RyY2hyKGxwZWxmZS0+ZWxmTG9nRm9udC5sZkZhY2VOYW1lLCAnQCcpICE9IE5VTEwpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBMUERGX0ZPTlREQVRBIHBEYXRhID0gKExQREZfRk9OVERBVEEpbFBhcmFtOworICBtZW1jcHkoJnBEYXRhLT5sZiwgJmxwZWxmZS0+ZWxmTG9nRm9udCwgc2l6ZW9mKExPR0ZPTlRBKSk7CisgIHBEYXRhLT5iRmluZCA9IFRSVUU7CisgIHJldHVybiAwOwogfQotc3RhdGljIEZYX0JPT0wgUmV0cmlldmVTcGVjaWZpY0ZvbnQoTE9HRk9OVEEmIGxmKQotewotICAgIFBERl9GT05UREFUQSBmZDsKLSAgICBtZW1zZXQoJmZkLCAwLCBzaXplb2YoUERGX0ZPTlREQVRBKSk7Ci0gICAgSERDIGhEQyA9IDo6R2V0REMoTlVMTCk7Ci0gICAgRW51bUZvbnRGYW1pbGllc0V4QShoREMsICZsZiwgKEZPTlRFTlVNUFJPQ0EpRW51bUZvbnRGYW1FeFByb2MsIChMUEFSQU0pJmZkLCAwKTsKLSAgICA6OlJlbGVhc2VEQyhOVUxMLCBoREMpOwotICAgIGlmIChmZC5iRmluZCkgewotICAgICAgICBtZW1jcHkoJmxmLCAmZmQubGYsIHNpemVvZihMT0dGT05UQSkpOwotICAgIH0KLSAgICByZXR1cm4gZmQuYkZpbmQ7CitzdGF0aWMgRlhfQk9PTCBSZXRyaWV2ZVNwZWNpZmljRm9udChMT0dGT05UQSYgbGYpIHsKKyAgUERGX0ZPTlREQVRBIGZkOworICBtZW1zZXQoJmZkLCAwLCBzaXplb2YoUERGX0ZPTlREQVRBKSk7CisgIEhEQyBoREMgPSA6OkdldERDKE5VTEwpOworICBFbnVtRm9udEZhbWlsaWVzRXhBKGhEQywgJmxmLCAoRk9OVEVOVU1QUk9DQSlFbnVtRm9udEZhbUV4UHJvYywgKExQQVJBTSkmZmQsCisgICAgICAgICAgICAgICAgICAgICAgMCk7CisgIDo6UmVsZWFzZURDKE5VTEwsIGhEQyk7CisgIGlmIChmZC5iRmluZCkgeworICAgIG1lbWNweSgmbGYsICZmZC5sZiwgc2l6ZW9mKExPR0ZPTlRBKSk7CisgIH0KKyAgcmV0dXJuIGZkLmJGaW5kOwogfQotc3RhdGljIEZYX0JPT0wgUmV0cmlldmVTcGVjaWZpY0ZvbnQodWludDhfdCBjaGFyU2V0LCB1aW50OF90IHBpdGNoQW5kRmFtaWx5LCBMUENTVFIgcGNzRm9udE5hbWUsIExPR0ZPTlRBJiBsZikKLXsKK3N0YXRpYyBGWF9CT09MIFJldHJpZXZlU3BlY2lmaWNGb250KHVpbnQ4X3QgY2hhclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGl0Y2hBbmRGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgcGNzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dGT05UQSYgbGYpIHsKKyAgbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKExPR0ZPTlRBKSk7CisgIGxmLmxmQ2hhclNldCA9IGNoYXJTZXQ7CisgIGxmLmxmUGl0Y2hBbmRGYW1pbHkgPSBwaXRjaEFuZEZhbWlseTsKKyAgaWYgKHBjc0ZvbnROYW1lICE9IE5VTEwpIHsKKyAgICBzdHJjcHkobGYubGZGYWNlTmFtZSwgcGNzRm9udE5hbWUpOworICB9CisgIHJldHVybiBSZXRyaWV2ZVNwZWNpZmljRm9udChsZik7Cit9CitzdGF0aWMgRlhfQk9PTCBSZXRyaWV2ZVN0b2NrRm9udChpbnQgaUZvbnRPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYXJTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dGT05UQSYgbGYpIHsKKyAgSEZPTlQgaEZvbnQgPSAoSEZPTlQpOjpHZXRTdG9ja09iamVjdChpRm9udE9iamVjdCk7CisgIGlmIChoRm9udCAhPSBOVUxMKSB7CiAgICAgbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKExPR0ZPTlRBKSk7Ci0gICAgbGYubGZDaGFyU2V0ID0gY2hhclNldDsKLSAgICBsZi5sZlBpdGNoQW5kRmFtaWx5ID0gcGl0Y2hBbmRGYW1pbHk7Ci0gICAgaWYgKHBjc0ZvbnROYW1lICE9IE5VTEwpIHsKLSAgICAgICAgc3RyY3B5KGxmLmxmRmFjZU5hbWUsIHBjc0ZvbnROYW1lKTsKKyAgICBpbnQgaVJldCA9IDo6R2V0T2JqZWN0KGhGb250LCBzaXplb2YoTE9HRk9OVEEpLCAmbGYpOworICAgIGlmIChpUmV0ID4gMCAmJiAobGYubGZDaGFyU2V0ID09IGNoYXJTZXQgfHwgY2hhclNldCA9PSAyNTUpKSB7CisgICAgICByZXR1cm4gUmV0cmlldmVTcGVjaWZpY0ZvbnQobGYpOwogICAgIH0KLSAgICByZXR1cm4gUmV0cmlldmVTcGVjaWZpY0ZvbnQobGYpOwotfQotc3RhdGljIEZYX0JPT0wgUmV0cmlldmVTdG9ja0ZvbnQoaW50IGlGb250T2JqZWN0LCB1aW50OF90IGNoYXJTZXQsIExPR0ZPTlRBJiBsZikKLXsKLSAgICBIRk9OVCBoRm9udCA9IChIRk9OVCk6OkdldFN0b2NrT2JqZWN0KGlGb250T2JqZWN0KTsKLSAgICBpZiAoaEZvbnQgIT0gTlVMTCkgewotICAgICAgICBtZW1zZXQoJmxmLCAwLCBzaXplb2YoTE9HRk9OVEEpKTsKLSAgICAgICAgaW50IGlSZXQgPSA6OkdldE9iamVjdChoRm9udCwgc2l6ZW9mKExPR0ZPTlRBKSwgJmxmKTsKLSAgICAgICAgaWYgKGlSZXQgPiAwICYmIChsZi5sZkNoYXJTZXQgPT0gY2hhclNldCB8fCBjaGFyU2V0ID09IDI1NSkpIHsKLSAgICAgICAgICAgIHJldHVybiBSZXRyaWV2ZVNwZWNpZmljRm9udChsZik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgotQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkU3lzdGVtRGVmYXVsdEZvbnQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KQotewotICAgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IE5VTEw7Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgIExPR0ZPTlRBIGxmOwotICAgIEZYX0JPT0wgYlJldDsKLSAgICBiUmV0ID0gUmV0cmlldmVTdG9ja0ZvbnQoREVGQVVMVF9HVUlfRk9OVCwgMjU1LCBsZik7Ci0gICAgaWYgKCFiUmV0KSB7Ci0gICAgICAgIGJSZXQgPSBSZXRyaWV2ZVN0b2NrRm9udChTWVNURU1fRk9OVCwgMjU1LCBsZik7Ci0gICAgfQotICAgIGlmIChiUmV0KSB7Ci0gICAgICAgIHBGb250ID0gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRXaW5kb3dzRm9udCgmbGYsIEZBTFNFLCBUUlVFKTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gcEZvbnQ7Ci19Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGRTeXN0ZW1Gb250KGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgdWludDhfdCBpQ2hhclNldCkKLXsKLSAgICBpZiAocERvY3VtZW50ID09IE5VTEwgfHwgY3NGb250TmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBpZiAoaUNoYXJTZXQgPT0gMSkgewotICAgICAgICBpQ2hhclNldCA9IEdldE5hdGl2ZUNoYXJTZXQoKTsKLSAgICB9Ci0gICAgSEZPTlQgaEZvbnQgPSA6OkNyZWF0ZUZvbnRBKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGlDaGFyU2V0LCBPVVRfREVGQVVMVF9QUkVDSVMsIENMSVBfREVGQVVMVF9QUkVDSVMsIERFRkFVTFRfUVVBTElUWSwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCBjc0ZvbnROYW1lLmNfc3RyKCkpOwotICAgIGlmIChoRm9udCAhPSBOVUxMKSB7Ci0gICAgICAgIExPR0ZPTlRBIGxmOwotICAgICAgICBtZW1zZXQoJmxmLCAwLCBzaXplb2YoTE9HRk9OVEEpKTsKLSAgICAgICAgOjpHZXRPYmplY3RBKGhGb250LCBzaXplb2YoTE9HRk9OVEEpLCAmbGYpOwotICAgICAgICA6OkRlbGV0ZU9iamVjdChoRm9udCk7Ci0gICAgICAgIGlmIChzdHJsZW4obGYubGZGYWNlTmFtZSkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRXaW5kb3dzRm9udCgmbGYsIEZBTFNFLCBUUlVFKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgorQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkU3lzdGVtRGVmYXVsdEZvbnQoCisgICAgY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCkgewogICAgIHJldHVybiBOVUxMOwotfQotQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkU3lzdGVtRm9udChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9XaWRlU3RyaW5nIGNzRm9udE5hbWUsIHVpbnQ4X3QgaUNoYXJTZXQpCi17Ci0gICAgaWYgKHBEb2N1bWVudCA9PSBOVUxMIHx8IGNzRm9udE5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgfQorICBDUERGX0ZvbnQqIHBGb250ID0gTlVMTDsKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgaWYgKGlDaGFyU2V0ID09IDEpIHsKLSAgICAgICAgaUNoYXJTZXQgPSBHZXROYXRpdmVDaGFyU2V0KCk7Ci0gICAgfQotICAgIEhGT05UIGhGb250ID0gOjpDcmVhdGVGb250VygwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBpQ2hhclNldCwgT1VUX0RFRkFVTFRfUFJFQ0lTLCBDTElQX0RFRkFVTFRfUFJFQ0lTLCBERUZBVUxUX1FVQUxJVFksIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwgY3NGb250TmFtZS5jX3N0cigpKTsKLSAgICBpZiAoaEZvbnQgIT0gTlVMTCkgewotICAgICAgICBMT0dGT05UQSBsZjsKLSAgICAgICAgbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKExPR0ZPTlRBKSk7Ci0gICAgICAgIDo6R2V0T2JqZWN0KGhGb250LCBzaXplb2YoTE9HRk9OVEEpLCAmbGYpOwotICAgICAgICA6OkRlbGV0ZU9iamVjdChoRm9udCk7Ci0gICAgICAgIGlmIChzdHJsZW4obGYubGZGYWNlTmFtZSkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRXaW5kb3dzRm9udCgmbGYsIEZBTFNFLCBUUlVFKTsKLSAgICAgICAgfQotICAgIH0KKyAgTE9HRk9OVEEgbGY7CisgIEZYX0JPT0wgYlJldDsKKyAgYlJldCA9IFJldHJpZXZlU3RvY2tGb250KERFRkFVTFRfR1VJX0ZPTlQsIDI1NSwgbGYpOworICBpZiAoIWJSZXQpIHsKKyAgICBiUmV0ID0gUmV0cmlldmVTdG9ja0ZvbnQoU1lTVEVNX0ZPTlQsIDI1NSwgbGYpOworICB9CisgIGlmIChiUmV0KSB7CisgICAgcEZvbnQgPSAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgRkFMU0UsIFRSVUUpOworICB9CiAjZW5kaWYKKyAgcmV0dXJuIHBGb250OworfQorQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkU3lzdGVtRm9udChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaUNoYXJTZXQpIHsKKyAgaWYgKHBEb2N1bWVudCA9PSBOVUxMIHx8IGNzRm9udE5hbWUuSXNFbXB0eSgpKSB7CiAgICAgcmV0dXJuIE5VTEw7Ci19Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGRTdGFuZGFyZEZvbnQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lKQotewotICAgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCB8fCBjc0ZvbnROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IE5VTEw7Ci0gICAgaWYgKGNzRm9udE5hbWUgPT0gIlphcGZEaW5nYmF0cyIpIHsKLSAgICAgICAgcEZvbnQgPSAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFN0YW5kYXJkRm9udChjc0ZvbnROYW1lLCBOVUxMKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDUERGX0ZvbnRFbmNvZGluZyBlbmNvZGluZyhQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpOwotICAgICAgICBwRm9udCA9ICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkU3RhbmRhcmRGb250KGNzRm9udE5hbWUsICZlbmNvZGluZyk7Ci0gICAgfQotICAgIHJldHVybiBwRm9udDsKLX0KLUNGWF9CeXRlU3RyaW5nIENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVGb250KHVpbnQ4X3QgY2hhclNldCwgdm9pZCogcExvZ0ZvbnQpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZTsKKyAgfQogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyAgaWYgKGlDaGFyU2V0ID09IDEpIHsKKyAgICBpQ2hhclNldCA9IEdldE5hdGl2ZUNoYXJTZXQoKTsKKyAgfQorICBIRk9OVCBoRm9udCA9IDo6Q3JlYXRlRm9udEEoCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBpQ2hhclNldCwgT1VUX0RFRkFVTFRfUFJFQ0lTLCBDTElQX0RFRkFVTFRfUFJFQ0lTLAorICAgICAgREVGQVVMVF9RVUFMSVRZLCBERUZBVUxUX1BJVENIIHwgRkZfRE9OVENBUkUsIGNzRm9udE5hbWUuY19zdHIoKSk7CisgIGlmIChoRm9udCAhPSBOVUxMKSB7CiAgICAgTE9HRk9OVEEgbGY7Ci0gICAgRlhfQk9PTCBiUmV0OwotICAgIGlmIChjaGFyU2V0ID09IEFOU0lfQ0hBUlNFVCkgewotICAgICAgICBjc0ZvbnROYW1lID0gIkhlbHZldGljYSI7Ci0gICAgICAgIHJldHVybiBjc0ZvbnROYW1lOworICAgIG1lbXNldCgmbGYsIDAsIHNpemVvZihMT0dGT05UQSkpOworICAgIDo6R2V0T2JqZWN0QShoRm9udCwgc2l6ZW9mKExPR0ZPTlRBKSwgJmxmKTsKKyAgICA6OkRlbGV0ZU9iamVjdChoRm9udCk7CisgICAgaWYgKHN0cmxlbihsZi5sZkZhY2VOYW1lKSA+IDApIHsKKyAgICAgIHJldHVybiAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgRkFMU0UsIFRSVUUpOwogICAgIH0KLSAgICBiUmV0ID0gRkFMU0U7Ci0gICAgaWYgKGNoYXJTZXQgPT0gU0hJRlRKSVNfQ0hBUlNFVCkgewotICAgICAgICBiUmV0ID0gUmV0cmlldmVTcGVjaWZpY0ZvbnQoY2hhclNldCwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCAiTVMgTWluY2hvIiwgbGYpOwotICAgIH0gZWxzZSBpZiAoY2hhclNldCA9PSBHQjIzMTJfQ0hBUlNFVCkgewotICAgICAgICBiUmV0ID0gUmV0cmlldmVTcGVjaWZpY0ZvbnQoY2hhclNldCwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCAiU2ltU3VuIiwgbGYpOwotICAgIH0gZWxzZSBpZiAoY2hhclNldCA9PSBDSElORVNFQklHNV9DSEFSU0VUKSB7Ci0gICAgICAgIGJSZXQgPSBSZXRyaWV2ZVNwZWNpZmljRm9udChjaGFyU2V0LCBERUZBVUxUX1BJVENIIHwgRkZfRE9OVENBUkUsICJNaW5nTGlVIiwgbGYpOwotICAgIH0KLSAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwgIkFyaWFsIFVuaWNvZGUgTVMiLCBsZik7Ci0gICAgfQotICAgIGlmICghYlJldCkgewotICAgICAgICBiUmV0ID0gUmV0cmlldmVTcGVjaWZpY0ZvbnQoY2hhclNldCwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCAiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLCBsZik7Ci0gICAgfQotICAgIGlmICghYlJldCkgewotICAgICAgICBiUmV0ID0gUmV0cmlldmVTcGVjaWZpY0ZvbnQoY2hhclNldCwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCBOVUxMLCBsZik7Ci0gICAgfQotICAgIGlmIChiUmV0KSB7Ci0gICAgICAgIGlmIChwTG9nRm9udCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtZW1jcHkocExvZ0ZvbnQsICZsZiwgc2l6ZW9mKExPR0ZPTlRBKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY3NGb250TmFtZSA9IGxmLmxmRmFjZU5hbWU7Ci0gICAgICAgIHJldHVybiBjc0ZvbnROYW1lOwotICAgIH0KKyAgfQogI2VuZGlmCisgIHJldHVybiBOVUxMOworfQorQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkU3lzdGVtRm9udChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaUNoYXJTZXQpIHsKKyAgaWYgKHBEb2N1bWVudCA9PSBOVUxMIHx8IGNzRm9udE5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgIGlmIChpQ2hhclNldCA9PSAxKSB7CisgICAgaUNoYXJTZXQgPSBHZXROYXRpdmVDaGFyU2V0KCk7CisgIH0KKyAgSEZPTlQgaEZvbnQgPSA6OkNyZWF0ZUZvbnRXKAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgaUNoYXJTZXQsIE9VVF9ERUZBVUxUX1BSRUNJUywgQ0xJUF9ERUZBVUxUX1BSRUNJUywKKyAgICAgIERFRkFVTFRfUVVBTElUWSwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCBjc0ZvbnROYW1lLmNfc3RyKCkpOworICBpZiAoaEZvbnQgIT0gTlVMTCkgeworICAgIExPR0ZPTlRBIGxmOworICAgIG1lbXNldCgmbGYsIDAsIHNpemVvZihMT0dGT05UQSkpOworICAgIDo6R2V0T2JqZWN0KGhGb250LCBzaXplb2YoTE9HRk9OVEEpLCAmbGYpOworICAgIDo6RGVsZXRlT2JqZWN0KGhGb250KTsKKyAgICBpZiAoc3RybGVuKGxmLmxmRmFjZU5hbWUpID4gMCkgeworICAgICAgcmV0dXJuICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkV2luZG93c0ZvbnQoJmxmLCBGQUxTRSwgVFJVRSk7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIE5VTEw7Cit9CitDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGRTdGFuZGFyZEZvbnQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUpIHsKKyAgaWYgKHBEb2N1bWVudCA9PSBOVUxMIHx8IGNzRm9udE5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9Gb250KiBwRm9udCA9IE5VTEw7CisgIGlmIChjc0ZvbnROYW1lID09ICJaYXBmRGluZ2JhdHMiKSB7CisgICAgcEZvbnQgPSAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFN0YW5kYXJkRm9udChjc0ZvbnROYW1lLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBDUERGX0ZvbnRFbmNvZGluZyBlbmNvZGluZyhQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpOworICAgIHBGb250ID0gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRTdGFuZGFyZEZvbnQoY3NGb250TmFtZSwgJmVuY29kaW5nKTsKKyAgfQorICByZXR1cm4gcEZvbnQ7Cit9CitDRlhfQnl0ZVN0cmluZyBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlRm9udCh1aW50OF90IGNoYXJTZXQsIHZvaWQqIHBMb2dGb250KSB7CisgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWU7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworICBMT0dGT05UQSBsZjsKKyAgRlhfQk9PTCBiUmV0OworICBpZiAoY2hhclNldCA9PSBBTlNJX0NIQVJTRVQpIHsKKyAgICBjc0ZvbnROYW1lID0gIkhlbHZldGljYSI7CiAgICAgcmV0dXJuIGNzRm9udE5hbWU7CisgIH0KKyAgYlJldCA9IEZBTFNFOworICBpZiAoY2hhclNldCA9PSBTSElGVEpJU19DSEFSU0VUKSB7CisgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1TIE1pbmNobyIsIGxmKTsKKyAgfSBlbHNlIGlmIChjaGFyU2V0ID09IEdCMjMxMl9DSEFSU0VUKSB7CisgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwgIlNpbVN1biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxmKTsKKyAgfSBlbHNlIGlmIChjaGFyU2V0ID09IENISU5FU0VCSUc1X0NIQVJTRVQpIHsKKyAgICBiUmV0ID0gUmV0cmlldmVTcGVjaWZpY0ZvbnQoY2hhclNldCwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCAiTWluZ0xpVSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxmKTsKKyAgfQorICBpZiAoIWJSZXQpIHsKKyAgICBiUmV0ID0gUmV0cmlldmVTcGVjaWZpY0ZvbnQoY2hhclNldCwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJpYWwgVW5pY29kZSBNUyIsIGxmKTsKKyAgfQorICBpZiAoIWJSZXQpIHsKKyAgICBiUmV0ID0gUmV0cmlldmVTcGVjaWZpY0ZvbnQoY2hhclNldCwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLCBsZik7CisgIH0KKyAgaWYgKCFiUmV0KSB7CisgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwgTlVMTCwgbGYpOworICB9CisgIGlmIChiUmV0KSB7CisgICAgaWYgKHBMb2dGb250ICE9IE5VTEwpIHsKKyAgICAgIG1lbWNweShwTG9nRm9udCwgJmxmLCBzaXplb2YoTE9HRk9OVEEpKTsKKyAgICB9CisgICAgY3NGb250TmFtZSA9IGxmLmxmRmFjZU5hbWU7CisgICAgcmV0dXJuIGNzRm9udE5hbWU7CisgIH0KKyNlbmRpZgorICByZXR1cm4gY3NGb250TmFtZTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVGb250KHZvaWQqIHBMb2dGb250KQoteworQ0ZYX0J5dGVTdHJpbmcgQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUZvbnQodm9pZCogcExvZ0ZvbnQpIHsKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgdWludDhfdCBjaGFyU2V0ID0gR2V0TmF0aXZlQ2hhclNldCgpOwotICAgIHJldHVybiBHZXROYXRpdmVGb250KGNoYXJTZXQsIHBMb2dGb250KTsKKyAgdWludDhfdCBjaGFyU2V0ID0gR2V0TmF0aXZlQ2hhclNldCgpOworICByZXR1cm4gR2V0TmF0aXZlRm9udChjaGFyU2V0LCBwTG9nRm9udCk7CiAjZWxzZQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKICNlbmRpZgogfQotdWludDhfdCBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlQ2hhclNldCgpCi17Cit1aW50OF90IENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVDaGFyU2V0KCkgewogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICB1aW50OF90IGNoYXJTZXQgPSBBTlNJX0NIQVJTRVQ7Ci0gICAgVUlOVCBpQ29kZVBhZ2UgPSA6OkdldEFDUCgpOwotICAgIHN3aXRjaCAoaUNvZGVQYWdlKSB7Ci0gICAgICAgIGNhc2UgOTMyOgotICAgICAgICAgICAgY2hhclNldCA9IFNISUZUSklTX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5MzY6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gR0IyMzEyX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5NTA6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gQ0hJTkVTRUJJRzVfQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyNTI6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gQU5TSV9DSEFSU0VUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODc0OgotICAgICAgICAgICAgY2hhclNldCA9IFRIQUlfQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk0OToKLSAgICAgICAgICAgIGNoYXJTZXQgPSBIQU5HVUxfQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyMDA6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gQU5TSV9DSEFSU0VUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI1MDoKLSAgICAgICAgICAgIGNoYXJTZXQgPSBFQVNURVVST1BFX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjUxOgotICAgICAgICAgICAgY2hhclNldCA9IFJVU1NJQU5fQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyNTM6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gR1JFRUtfQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyNTQ6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gVFVSS0lTSF9DSEFSU0VUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI1NToKLSAgICAgICAgICAgIGNoYXJTZXQgPSBIRUJSRVdfQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyNTY6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gQVJBQklDX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjU3OgotICAgICAgICAgICAgY2hhclNldCA9IEJBTFRJQ19DSEFSU0VUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI1ODoKLSAgICAgICAgICAgIGNoYXJTZXQgPSBWSUVUTkFNRVNFX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzYxOgotICAgICAgICAgICAgY2hhclNldCA9IEpPSEFCX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGNoYXJTZXQ7CisgIHVpbnQ4X3QgY2hhclNldCA9IEFOU0lfQ0hBUlNFVDsKKyAgVUlOVCBpQ29kZVBhZ2UgPSA6OkdldEFDUCgpOworICBzd2l0Y2ggKGlDb2RlUGFnZSkgeworICAgIGNhc2UgOTMyOgorICAgICAgY2hhclNldCA9IFNISUZUSklTX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDkzNjoKKyAgICAgIGNoYXJTZXQgPSBHQjIzMTJfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTUwOgorICAgICAgY2hhclNldCA9IENISU5FU0VCSUc1X0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTI6CisgICAgICBjaGFyU2V0ID0gQU5TSV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4NzQ6CisgICAgICBjaGFyU2V0ID0gVEhBSV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5NDk6CisgICAgICBjaGFyU2V0ID0gSEFOR1VMX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDA6CisgICAgICBjaGFyU2V0ID0gQU5TSV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjUwOgorICAgICAgY2hhclNldCA9IEVBU1RFVVJPUEVfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1MToKKyAgICAgIGNoYXJTZXQgPSBSVVNTSUFOX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTM6CisgICAgICBjaGFyU2V0ID0gR1JFRUtfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1NDoKKyAgICAgIGNoYXJTZXQgPSBUVVJLSVNIX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTU6CisgICAgICBjaGFyU2V0ID0gSEVCUkVXX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTY6CisgICAgICBjaGFyU2V0ID0gQVJBQklDX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTc6CisgICAgICBjaGFyU2V0ID0gQkFMVElDX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTg6CisgICAgICBjaGFyU2V0ID0gVklFVE5BTUVTRV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzYxOgorICAgICAgY2hhclNldCA9IEpPSEFCX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gY2hhclNldDsKICNlbHNlCi0gICAgcmV0dXJuIDA7CisgIHJldHVybiAwOwogI2VuZGlmCiB9Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb250KHVpbnQ4X3QgY2hhclNldCwgY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KQotewotICAgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IE5VTEw7CitDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb250KHVpbnQ4X3QgY2hhclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRm9udCogcEZvbnQgPSBOVUxMOwogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBMT0dGT05UQSBsZjsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lID0gR2V0TmF0aXZlRm9udChjaGFyU2V0LCAmbGYpOwotICAgIGlmICghY3NGb250TmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgaWYgKGNzRm9udE5hbWUgPT0gIkhlbHZldGljYSIpIHsKLSAgICAgICAgICAgIHBGb250ID0gQWRkU3RhbmRhcmRGb250KHBEb2N1bWVudCwgY3NGb250TmFtZSk7CisgIExPR0ZPTlRBIGxmOworICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lID0gR2V0TmF0aXZlRm9udChjaGFyU2V0LCAmbGYpOworICBpZiAoIWNzRm9udE5hbWUuSXNFbXB0eSgpKSB7CisgICAgaWYgKGNzRm9udE5hbWUgPT0gIkhlbHZldGljYSIpIHsKKyAgICAgIHBGb250ID0gQWRkU3RhbmRhcmRGb250KHBEb2N1bWVudCwgY3NGb250TmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBGb250ID0gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRXaW5kb3dzRm9udCgmbGYsIEZBTFNFLCBUUlVFKTsKKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gcEZvbnQ7Cit9CitDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb250KGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICBpZiAocERvY3VtZW50ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0ZvbnQqIHBGb250ID0gTlVMTDsKKyAgdWludDhfdCBjaGFyU2V0ID0gR2V0TmF0aXZlQ2hhclNldCgpOworICBwRm9udCA9IEFkZE5hdGl2ZUZvbnQoY2hhclNldCwgcERvY3VtZW50KTsKKyAgcmV0dXJuIHBGb250OworfQorRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6VmFsaWRhdGVGaWVsZE5hbWUoCisgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLAorICAgIGludCBpVHlwZSwKKyAgICBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsCisgICAgY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcEV4Y2x1ZGVkQ29udHJvbCkgeworICBpZiAoY3NOZXdGaWVsZE5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBpUG9zID0gMDsKKyAgaW50IGlMZW5ndGggPSBjc05ld0ZpZWxkTmFtZS5HZXRMZW5ndGgoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgY3NTdWI7CisgIHdoaWxlIChUUlVFKSB7CisgICAgd2hpbGUgKGlQb3MgPCBpTGVuZ3RoICYmCisgICAgICAgICAgIChjc05ld0ZpZWxkTmFtZVtpUG9zXSA9PSBMJy4nIHx8IGNzTmV3RmllbGROYW1lW2lQb3NdID09IEwnICcpKSB7CisgICAgICBpUG9zKys7CisgICAgfQorICAgIGlmIChpUG9zIDwgaUxlbmd0aCAmJiAhY3NTdWIuSXNFbXB0eSgpKSB7CisgICAgICBjc1N1YiArPSBMJy4nOworICAgIH0KKyAgICB3aGlsZSAoaVBvcyA8IGlMZW5ndGggJiYgY3NOZXdGaWVsZE5hbWVbaVBvc10gIT0gTCcuJykgeworICAgICAgY3NTdWIgKz0gY3NOZXdGaWVsZE5hbWVbaVBvcysrXTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IGNzU3ViLkdldExlbmd0aCgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKKyAgICAgIGlmIChjc1N1YltpXSA9PSBMJyAnIHx8IGNzU3ViW2ldID09IEwnLicpIHsKKyAgICAgICAgY3NTdWIuU2V0QXQoaSwgTCdcMCcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIEZYX0RXT1JEIGR3Q291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOworICAgIGZvciAoRlhfRFdPUkQgbSA9IDA7IG0gPCBkd0NvdW50OyBtKyspIHsKKyAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChtKTsKKyAgICAgIGlmIChwRmllbGQgPT0gTlVMTCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwRmllbGQgPT0gcEV4Y2x1ZGVkRmllbGQpIHsKKyAgICAgICAgaWYgKHBFeGNsdWRlZENvbnRyb2wgIT0gTlVMTCkgeworICAgICAgICAgIGlmIChwRmllbGQtPkNvdW50Q29udHJvbHMoKSA8IDIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBGb250ID0gKChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQpLT5BZGRXaW5kb3dzRm9udCgmbGYsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgfQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NGdWxsTmFtZSA9IHBGaWVsZC0+R2V0RnVsbE5hbWUoKTsKKyAgICAgIGludCBpUmV0ID0gQ29tcGFyZUZpZWxkTmFtZShjc1N1YiwgY3NGdWxsTmFtZSk7CisgICAgICBpZiAoaVJldCA9PSAxKSB7CisgICAgICAgIGlmIChwRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IGlUeXBlKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGlSZXQgPT0gMiAmJiBjc1N1YiA9PSBjc05ld0ZpZWxkTmFtZSkgeworICAgICAgICBpZiAoY3NGdWxsTmFtZVtpUG9zXSA9PSBMJy4nKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGlSZXQgPT0gMyAmJiBjc1N1YiA9PSBjc05ld0ZpZWxkTmFtZSkgeworICAgICAgICBpZiAoY3NOZXdGaWVsZE5hbWVbY3NGdWxsTmFtZS5HZXRMZW5ndGgoKV0gPT0gTCcuJykgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KLSNlbmRpZgotICAgIHJldHVybiBwRm9udDsKKyAgICBpZiAoaVBvcyA+PSBpTGVuZ3RoKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGNzU3ViLklzRW1wdHkoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjc05ld0ZpZWxkTmFtZSA9IGNzU3ViOworICByZXR1cm4gVFJVRTsKIH0KLUNQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkFkZE5hdGl2ZUZvbnQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KQotewotICAgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IE5VTEw7Ci0gICAgdWludDhfdCBjaGFyU2V0ID0gR2V0TmF0aXZlQ2hhclNldCgpOwotICAgIHBGb250ID0gQWRkTmF0aXZlRm9udChjaGFyU2V0LCBwRG9jdW1lbnQpOwotICAgIHJldHVybiBwRm9udDsKK0ZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpVHlwZSkgeworICByZXR1cm4gVmFsaWRhdGVGaWVsZE5hbWUoY3NOZXdGaWVsZE5hbWUsIGlUeXBlLCBOVUxMLCBOVUxMKTsKIH0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlLCBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsIGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBFeGNsdWRlZENvbnRyb2wpCi17Ci0gICAgaWYgKGNzTmV3RmllbGROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lKSB7CisgIGlmIChwRmllbGQgPT0gTlVMTCB8fCBjc05ld0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFZhbGlkYXRlRmllbGROYW1lKAorICAgICAgY3NOZXdGaWVsZE5hbWUsICgoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZCktPkdldEZpZWxkVHlwZSgpLCBwRmllbGQsIE5VTEwpOworfQorRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6VmFsaWRhdGVGaWVsZE5hbWUoY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpIHsKKyAgaWYgKHBDb250cm9sID09IE5VTEwgfHwgY3NOZXdGaWVsZE5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSAoKENQREZfRm9ybUNvbnRyb2wqKXBDb250cm9sKS0+R2V0RmllbGQoKTsKKyAgcmV0dXJuIFZhbGlkYXRlRmllbGROYW1lKGNzTmV3RmllbGROYW1lLCBwRmllbGQtPkdldEZpZWxkVHlwZSgpLCBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udHJvbCk7Cit9CitpbnQgQ1BERl9JbnRlckZvcm06OkNvbXBhcmVGaWVsZE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lMikgeworICBjb25zdCBGWF9DSEFSKiBwdHIxID0gbmFtZTE7CisgIGNvbnN0IEZYX0NIQVIqIHB0cjIgPSBuYW1lMjsKKyAgaWYgKG5hbWUxLkdldExlbmd0aCgpID09IG5hbWUyLkdldExlbmd0aCgpKSB7CisgICAgcmV0dXJuIG5hbWUxID09IG5hbWUyID8gMSA6IDA7CisgIH0KKyAgaW50IGkgPSAwOworICB3aGlsZSAocHRyMVtpXSA9PSBwdHIyW2ldKSB7CisgICAgaSsrOworICB9CisgIGlmIChpID09IG5hbWUxLkdldExlbmd0aCgpKSB7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgaWYgKGkgPT0gbmFtZTIuR2V0TGVuZ3RoKCkpIHsKKyAgICByZXR1cm4gMzsKKyAgfQorICByZXR1cm4gMDsKK30KK2ludCBDUERGX0ludGVyRm9ybTo6Q29tcGFyZUZpZWxkTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgbmFtZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG5hbWUyKSB7CisgIGNvbnN0IEZYX1dDSEFSKiBwdHIxID0gbmFtZTEuY19zdHIoKTsKKyAgY29uc3QgRlhfV0NIQVIqIHB0cjIgPSBuYW1lMi5jX3N0cigpOworICBpZiAobmFtZTEuR2V0TGVuZ3RoKCkgPT0gbmFtZTIuR2V0TGVuZ3RoKCkpIHsKKyAgICByZXR1cm4gbmFtZTEgPT0gbmFtZTIgPyAxIDogMDsKKyAgfQorICBpbnQgaSA9IDA7CisgIHdoaWxlIChwdHIxW2ldID09IHB0cjJbaV0pIHsKKyAgICBpKys7CisgIH0KKyAgaWYgKGkgPT0gbmFtZTEuR2V0TGVuZ3RoKCkpIHsKKyAgICByZXR1cm4gMjsKKyAgfQorICBpZiAoaSA9PSBuYW1lMi5HZXRMZW5ndGgoKSkgeworICAgIHJldHVybiAzOworICB9CisgIHJldHVybiAwOworfQorRlhfRFdPUkQgQ1BERl9JbnRlckZvcm06OkNvdW50RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSkgeworICBpZiAoY3NGaWVsZE5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIChGWF9EV09SRCltX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOworICB9CisgIENGaWVsZFRyZWU6Ol9Ob2RlKiBwTm9kZSA9IG1fcEZpZWxkVHJlZS0+RmluZE5vZGUoY3NGaWVsZE5hbWUpOworICBpZiAocE5vZGUgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBwTm9kZS0+Q291bnRGaWVsZHMoKTsKK30KK0NQREZfRm9ybUZpZWxkKiBDUERGX0ludGVyRm9ybTo6R2V0RmllbGQoRlhfRFdPUkQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSkgeworICBpZiAoY3NGaWVsZE5hbWUgPT0gTCIiKSB7CisgICAgcmV0dXJuIG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGluZGV4KTsKKyAgfQorICBDRmllbGRUcmVlOjpfTm9kZSogcE5vZGUgPSBtX3BGaWVsZFRyZWUtPkZpbmROb2RlKGNzRmllbGROYW1lKTsKKyAgaWYgKHBOb2RlID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcE5vZGUtPkdldEZpZWxkKGluZGV4KTsKK30KK3ZvaWQgQ1BERl9JbnRlckZvcm06OkdldEFsbEZpZWxkTmFtZXMoQ0ZYX1dpZGVTdHJpbmdBcnJheSYgYWxsRmllbGROYW1lcykgeworICBhbGxGaWVsZE5hbWVzLlJlbW92ZUFsbCgpOworICBpbnQgbkNvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKTsKKyAgICBpZiAocEZpZWxkKSB7CisgICAgICBDRlhfV2lkZVN0cmluZyBmdWxsX25hbWUgPSBHZXRGdWxsTmFtZShwRmllbGQtPkdldEZpZWxkRGljdCgpKTsKKyAgICAgIGFsbEZpZWxkTmFtZXMuQWRkKGZ1bGxfbmFtZSk7CiAgICAgfQotICAgIGludCBpUG9zID0gMDsKLSAgICBpbnQgaUxlbmd0aCA9IGNzTmV3RmllbGROYW1lLkdldExlbmd0aCgpOworICB9Cit9CitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpJc1ZhbGlkRm9ybUZpZWxkKGNvbnN0IHZvaWQqIHBGaWVsZCkgeworICBpZiAocEZpZWxkID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOworICAgIGlmIChwRmllbGQgPT0gcEZvcm1GaWVsZCkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KK0NQREZfRm9ybUZpZWxkKiBDUERGX0ludGVyRm9ybTo6R2V0RmllbGRCeURpY3QoCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KSBjb25zdCB7CisgIGlmIChwRmllbGREaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfV2lkZVN0cmluZyBjc1dOYW1lID0gR2V0RnVsbE5hbWUocEZpZWxkRGljdCk7CisgIHJldHVybiBtX3BGaWVsZFRyZWUtPkdldEZpZWxkKGNzV05hbWUpOworfQorRlhfRFdPUkQgQ1BERl9JbnRlckZvcm06OkNvdW50Q29udHJvbHMoQ0ZYX1dpZGVTdHJpbmcgY3NGaWVsZE5hbWUpIHsKKyAgaWYgKGNzRmllbGROYW1lLklzRW1wdHkoKSkgeworICAgIHJldHVybiAoRlhfRFdPUkQpbV9Db250cm9sTWFwLkdldENvdW50KCk7CisgIH0KKyAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+R2V0RmllbGQoY3NGaWVsZE5hbWUpOworICBpZiAocEZpZWxkID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gcEZpZWxkLT5tX0NvbnRyb2xMaXN0LkdldFNpemUoKTsKK30KK0NQREZfRm9ybUNvbnRyb2wqIENQREZfSW50ZXJGb3JtOjpHZXRDb250cm9sKEZYX0RXT1JEIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NGaWVsZE5hbWUpIHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+R2V0RmllbGQoY3NGaWVsZE5hbWUpOworICBpZiAocEZpZWxkID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoaW5kZXggPCAoRlhfRFdPUkQpcEZpZWxkLT5tX0NvbnRyb2xMaXN0LkdldFNpemUoKSkgeworICAgIHJldHVybiAoQ1BERl9Gb3JtQ29udHJvbCopcEZpZWxkLT5tX0NvbnRyb2xMaXN0LkdldEF0KGluZGV4KTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KK0ZYX0JPT0wgQ1BERl9JbnRlckZvcm06OklzVmFsaWRGb3JtQ29udHJvbChjb25zdCB2b2lkKiBwQ29udHJvbCkgeworICBpZiAocENvbnRyb2wgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9QT1NJVElPTiBwb3MgPSBtX0NvbnRyb2xNYXAuR2V0U3RhcnRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCA9IE5VTEw7CisgICAgdm9pZCogcEZvcm1Db250cm9sID0gTlVMTDsKKyAgICBtX0NvbnRyb2xNYXAuR2V0TmV4dEFzc29jKHBvcywgKHZvaWQqJilwV2lkZ2V0RGljdCwgcEZvcm1Db250cm9sKTsKKyAgICBpZiAocENvbnRyb2wgPT0gcEZvcm1Db250cm9sKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQoraW50IENQREZfSW50ZXJGb3JtOjpDb3VudFBhZ2VDb250cm9scyhDUERGX1BhZ2UqIHBQYWdlKSBjb25zdCB7CisgIENQREZfQXJyYXkqIHBBbm5vdExpc3QgPSBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEFycmF5KCJBbm5vdHMiKTsKKyAgaWYgKHBBbm5vdExpc3QgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGludCBjb3VudCA9IDA7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQW5ub3RMaXN0LT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdCA9IHBBbm5vdExpc3QtPkdldERpY3QoaSk7CisgICAgaWYgKHBBbm5vdCA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2w7CisgICAgaWYgKCFtX0NvbnRyb2xNYXAuTG9va3VwKHBBbm5vdCwgKHZvaWQqJilwQ29udHJvbCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjb3VudCsrOworICB9CisgIHJldHVybiBjb3VudDsKK30KK0NQREZfRm9ybUNvbnRyb2wqIENQREZfSW50ZXJGb3JtOjpHZXRQYWdlQ29udHJvbChDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgeworICBDUERGX0FycmF5KiBwQW5ub3RMaXN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7CisgIGlmIChwQW5ub3RMaXN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbnQgY291bnQgPSAwOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFubm90TGlzdC0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3QgPSBwQW5ub3RMaXN0LT5HZXREaWN0KGkpOworICAgIGlmIChwQW5ub3QgPT0gTlVMTCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sOworICAgIGlmICghbV9Db250cm9sTWFwLkxvb2t1cChwQW5ub3QsICh2b2lkKiYpcENvbnRyb2wpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGluZGV4ID09IGNvdW50KSB7CisgICAgICByZXR1cm4gcENvbnRyb2w7CisgICAgfQorICAgIGNvdW50Kys7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitDUERGX0Zvcm1Db250cm9sKiBDUERGX0ludGVyRm9ybTo6R2V0Q29udHJvbEF0UG9pbnQoQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwZGZfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwZGZfeSkgY29uc3QgeworICBDUERGX0FycmF5KiBwQW5ub3RMaXN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7CisgIGlmIChwQW5ub3RMaXN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBmb3IgKEZYX0RXT1JEIGkgPSBwQW5ub3RMaXN0LT5HZXRDb3VudCgpOyBpID4gMDsgaS0tKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3QgPSBwQW5ub3RMaXN0LT5HZXREaWN0KGkgLSAxKTsKKyAgICBpZiAocEFubm90ID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbDsKKyAgICBpZiAoIW1fQ29udHJvbE1hcC5Mb29rdXAocEFubm90LCAodm9pZComKXBDb250cm9sKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBDb250cm9sLT5HZXRSZWN0KCk7CisgICAgaWYgKHJlY3QuQ29udGFpbnMocGRmX3gsIHBkZl95KSkgeworICAgICAgcmV0dXJuIHBDb250cm9sOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KK0NQREZfRm9ybUNvbnRyb2wqIENQREZfSW50ZXJGb3JtOjpHZXRDb250cm9sQnlEaWN0KAorICAgIENQREZfRGljdGlvbmFyeSogcFdpZGdldERpY3QpIGNvbnN0IHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBOVUxMOworICBtX0NvbnRyb2xNYXAuTG9va3VwKHBXaWRnZXREaWN0LCAodm9pZComKXBDb250cm9sKTsKKyAgcmV0dXJuIHBDb250cm9sOworfQorRlhfRFdPUkQgQ1BERl9JbnRlckZvcm06OkNvdW50SW50ZXJuYWxGaWVsZHMoCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSBjb25zdCB7CisgIGlmICghbV9wRm9ybURpY3QpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOworICBpZiAoIXBBcnJheSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjc0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gcEFycmF5LT5HZXRDb3VudCgpOworICB9CisgIGludCBpTGVuZ3RoID0gY3NGaWVsZE5hbWUuR2V0TGVuZ3RoKCk7CisgIGludCBpUG9zID0gMDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IE5VTEw7CisgIHdoaWxlIChwQXJyYXkgIT0gTlVMTCkgewogICAgIENGWF9XaWRlU3RyaW5nIGNzU3ViOwotICAgIHdoaWxlIChUUlVFKSB7Ci0gICAgICAgIHdoaWxlIChpUG9zIDwgaUxlbmd0aCAmJiAoY3NOZXdGaWVsZE5hbWVbaVBvc10gPT0gTCcuJyB8fCBjc05ld0ZpZWxkTmFtZVtpUG9zXSA9PSBMJyAnKSkgewotICAgICAgICAgICAgaVBvcyArKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoaVBvcyA8IGlMZW5ndGggJiYgIWNzU3ViLklzRW1wdHkoKSkgewotICAgICAgICAgICAgY3NTdWIgKz0gTCcuJzsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoaVBvcyA8IGlMZW5ndGggJiYgY3NOZXdGaWVsZE5hbWVbaVBvc10gIT0gTCcuJykgewotICAgICAgICAgICAgY3NTdWIgKz0gY3NOZXdGaWVsZE5hbWVbaVBvcyArK107Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IGNzU3ViLkdldExlbmd0aCgpIC0gMTsgaSA+IC0xOyBpIC0tKSB7Ci0gICAgICAgICAgICBpZiAoY3NTdWJbaV0gPT0gTCcgJyB8fCBjc1N1YltpXSA9PSBMJy4nKSB7Ci0gICAgICAgICAgICAgICAgY3NTdWIuU2V0QXQoaSwgTCdcMCcpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBkd0NvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKLSAgICAgICAgZm9yIChGWF9EV09SRCBtID0gMDsgbSA8IGR3Q291bnQ7IG0gKyspIHsKLSAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChtKTsKLSAgICAgICAgICAgIGlmIChwRmllbGQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBGaWVsZCA9PSBwRXhjbHVkZWRGaWVsZCkgewotICAgICAgICAgICAgICAgIGlmIChwRXhjbHVkZWRDb250cm9sICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGaWVsZC0+Q291bnRDb250cm9scygpIDwgMikgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0Z1bGxOYW1lID0gcEZpZWxkLT5HZXRGdWxsTmFtZSgpOwotICAgICAgICAgICAgaW50IGlSZXQgPSBDb21wYXJlRmllbGROYW1lKGNzU3ViLCBjc0Z1bGxOYW1lKTsKLSAgICAgICAgICAgIGlmIChpUmV0ID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAocEZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBpVHlwZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpUmV0ID09IDIgJiYgY3NTdWIgPT0gY3NOZXdGaWVsZE5hbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3NGdWxsTmFtZVtpUG9zXSA9PSBMJy4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlSZXQgPT0gMyAmJiBjc1N1YiA9PSBjc05ld0ZpZWxkTmFtZSkgewotICAgICAgICAgICAgICAgIGlmIChjc05ld0ZpZWxkTmFtZVtjc0Z1bGxOYW1lLkdldExlbmd0aCgpXSA9PSBMJy4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlQb3MgPj0gaUxlbmd0aCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICBpZiAoaVBvcyA8IGlMZW5ndGggJiYgY3NGaWVsZE5hbWVbaVBvc10gPT0gTCcuJykgeworICAgICAgaVBvcysrOwogICAgIH0KLSAgICBpZiAoY3NTdWIuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB3aGlsZSAoaVBvcyA8IGlMZW5ndGggJiYgY3NGaWVsZE5hbWVbaVBvc10gIT0gTCcuJykgeworICAgICAgY3NTdWIgKz0gY3NGaWVsZE5hbWVbaVBvcysrXTsKICAgICB9Ci0gICAgY3NOZXdGaWVsZE5hbWUgPSBjc1N1YjsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwgaW50IGlUeXBlKQotewotICAgIHJldHVybiBWYWxpZGF0ZUZpZWxkTmFtZShjc05ld0ZpZWxkTmFtZSwgaVR5cGUsIE5VTEwsIE5VTEwpOwotfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6VmFsaWRhdGVGaWVsZE5hbWUoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lKQotewotICAgIGlmIChwRmllbGQgPT0gTlVMTCB8fCBjc05ld0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGludCBpQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7CisgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICAgIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0KGkpOworICAgICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBDRlhfV2lkZVN0cmluZyBjc1QgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoIlQiKTsKKyAgICAgIGlmIChjc1QgPT0gY3NTdWIpIHsKKyAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFZhbGlkYXRlRmllbGROYW1lKGNzTmV3RmllbGROYW1lLCAoKENQREZfRm9ybUZpZWxkKilwRmllbGQpLT5HZXRGaWVsZFR5cGUoKSwgcEZpZWxkLCBOVUxMKTsKLX0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpCi17Ci0gICAgaWYgKHBDb250cm9sID09IE5VTEwgfHwgY3NOZXdGaWVsZE5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIWJGaW5kKSB7CisgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9ICgoQ1BERl9Gb3JtQ29udHJvbCopcENvbnRyb2wpLT5HZXRGaWVsZCgpOwotICAgIHJldHVybiBWYWxpZGF0ZUZpZWxkTmFtZShjc05ld0ZpZWxkTmFtZSwgcEZpZWxkLT5HZXRGaWVsZFR5cGUoKSwgcEZpZWxkLCBwQ29udHJvbCk7Ci19Ci1pbnQgQ1BERl9JbnRlckZvcm06OkNvbXBhcmVGaWVsZE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUxLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZTIpCi17Ci0gICAgY29uc3QgRlhfQ0hBUiogcHRyMSA9IG5hbWUxOwotICAgIGNvbnN0IEZYX0NIQVIqIHB0cjIgPSBuYW1lMjsKLSAgICBpZiAobmFtZTEuR2V0TGVuZ3RoKCkgPT0gbmFtZTIuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUxID09IG5hbWUyID8gMSA6IDA7Ci0gICAgfQotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAocHRyMVtpXSA9PSBwdHIyW2ldKSB7Ci0gICAgICAgIGkgKys7Ci0gICAgfQotICAgIGlmIChpID09IG5hbWUxLkdldExlbmd0aCgpKSB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBpZiAoaSA9PSBuYW1lMi5HZXRMZW5ndGgoKSkgewotICAgICAgICByZXR1cm4gMzsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1pbnQgQ1BERl9JbnRlckZvcm06OkNvbXBhcmVGaWVsZE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG5hbWUxLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgbmFtZTIpCi17Ci0gICAgY29uc3QgRlhfV0NIQVIqIHB0cjEgPSBuYW1lMS5jX3N0cigpOwotICAgIGNvbnN0IEZYX1dDSEFSKiBwdHIyID0gbmFtZTIuY19zdHIoKTsKLSAgICBpZiAobmFtZTEuR2V0TGVuZ3RoKCkgPT0gbmFtZTIuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUxID09IG5hbWUyID8gMSA6IDA7Ci0gICAgfQotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAocHRyMVtpXSA9PSBwdHIyW2ldKSB7Ci0gICAgICAgIGkgKys7Ci0gICAgfQotICAgIGlmIChpID09IG5hbWUxLkdldExlbmd0aCgpKSB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBpZiAoaSA9PSBuYW1lMi5HZXRMZW5ndGgoKSkgewotICAgICAgICByZXR1cm4gMzsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1GWF9EV09SRCBDUERGX0ludGVyRm9ybTo6Q291bnRGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmNzRmllbGROYW1lKQotewotICAgIGlmIChjc0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIChGWF9EV09SRCltX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwotICAgIH0KLSAgICBDRmllbGRUcmVlOjpfTm9kZSAqcE5vZGUgPSBtX3BGaWVsZFRyZWUtPkZpbmROb2RlKGNzRmllbGROYW1lKTsKLSAgICBpZiAocE5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHBOb2RlLT5Db3VudEZpZWxkcygpOwotfQotQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpHZXRGaWVsZChGWF9EV09SRCBpbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmNzRmllbGROYW1lKQotewotICAgIGlmIChjc0ZpZWxkTmFtZSA9PSBMIiIpIHsKLSAgICAgICAgcmV0dXJuIG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGluZGV4KTsKLSAgICB9Ci0gICAgQ0ZpZWxkVHJlZTo6X05vZGUgKnBOb2RlID0gbV9wRmllbGRUcmVlLT5GaW5kTm9kZShjc0ZpZWxkTmFtZSk7Ci0gICAgaWYgKHBOb2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwTm9kZS0+R2V0RmllbGQoaW5kZXgpOwotfQotdm9pZCBDUERGX0ludGVyRm9ybTo6R2V0QWxsRmllbGROYW1lcyhDRlhfV2lkZVN0cmluZ0FycmF5JiBhbGxGaWVsZE5hbWVzKQotewotICAgIGFsbEZpZWxkTmFtZXMuUmVtb3ZlQWxsKCk7Ci0gICAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQgKnBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOwotICAgICAgICBpZiAocEZpZWxkKSB7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBmdWxsX25hbWUgPSBHZXRGdWxsTmFtZShwRmllbGQtPkdldEZpZWxkRGljdCgpKTsKLSAgICAgICAgICAgIGFsbEZpZWxkTmFtZXMuQWRkKGZ1bGxfbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpJc1ZhbGlkRm9ybUZpZWxkKGNvbnN0IHZvaWQqIHBGaWVsZCkKLXsKLSAgICBpZiAocEZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgbkNvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkICpwRm9ybUZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGQoaSk7Ci0gICAgICAgIGlmIChwRmllbGQgPT0gcEZvcm1GaWVsZCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpHZXRGaWVsZEJ5RGljdChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpIGNvbnN0Ci17Ci0gICAgaWYgKHBGaWVsZERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NXTmFtZSA9IEdldEZ1bGxOYW1lKHBGaWVsZERpY3QpOwotICAgIHJldHVybiBtX3BGaWVsZFRyZWUtPkdldEZpZWxkKGNzV05hbWUpOwotfQotRlhfRFdPUkQgQ1BERl9JbnRlckZvcm06OkNvdW50Q29udHJvbHMoQ0ZYX1dpZGVTdHJpbmcgY3NGaWVsZE5hbWUpCi17Ci0gICAgaWYgKGNzRmllbGROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gKEZYX0RXT1JEKW1fQ29udHJvbE1hcC5HZXRDb3VudCgpOwotICAgIH0KLSAgICBDUERGX0Zvcm1GaWVsZCAqcEZpZWxkID0gbV9wRmllbGRUcmVlLT5HZXRGaWVsZChjc0ZpZWxkTmFtZSk7Ci0gICAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcEZpZWxkLT5tX0NvbnRyb2xMaXN0LkdldFNpemUoKTsKLX0KLUNQREZfRm9ybUNvbnRyb2wqIENQREZfSW50ZXJGb3JtOjpHZXRDb250cm9sKEZYX0RXT1JEIGluZGV4LCBDRlhfV2lkZVN0cmluZyBjc0ZpZWxkTmFtZSkKLXsKLSAgICBDUERGX0Zvcm1GaWVsZCAqcEZpZWxkID0gbV9wRmllbGRUcmVlLT5HZXRGaWVsZChjc0ZpZWxkTmFtZSk7Ci0gICAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoaW5kZXggPCAoRlhfRFdPUkQpcEZpZWxkLT5tX0NvbnRyb2xMaXN0LkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gKENQREZfRm9ybUNvbnRyb2wgKilwRmllbGQtPm1fQ29udHJvbExpc3QuR2V0QXQoaW5kZXgpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OklzVmFsaWRGb3JtQ29udHJvbChjb25zdCB2b2lkKiBwQ29udHJvbCkKLXsKLSAgICBpZiAocENvbnRyb2wgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fQ29udHJvbE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0ID0gTlVMTDsKLSAgICAgICAgdm9pZCogcEZvcm1Db250cm9sID0gTlVMTDsKLSAgICAgICAgbV9Db250cm9sTWFwLkdldE5leHRBc3NvYyhwb3MsICh2b2lkKiYpcFdpZGdldERpY3QsIHBGb3JtQ29udHJvbCk7Ci0gICAgICAgIGlmIChwQ29udHJvbCA9PSBwRm9ybUNvbnRyb2wpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLWludCBDUERGX0ludGVyRm9ybTo6Q291bnRQYWdlQ29udHJvbHMoQ1BERl9QYWdlKiBwUGFnZSkgY29uc3QKLXsKLSAgICBDUERGX0FycmF5KiBwQW5ub3RMaXN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7Ci0gICAgaWYgKHBBbm5vdExpc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFubm90TGlzdC0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdCA9IHBBbm5vdExpc3QtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwQW5ub3QgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2w7Ci0gICAgICAgIGlmICghbV9Db250cm9sTWFwLkxvb2t1cChwQW5ub3QsICh2b2lkKiYpcENvbnRyb2wpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjb3VudCArKzsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotQ1BERl9Gb3JtQ29udHJvbCogQ1BERl9JbnRlckZvcm06OkdldFBhZ2VDb250cm9sKENQREZfUGFnZSogcFBhZ2UsIGludCBpbmRleCkgY29uc3QKLXsKLSAgICBDUERGX0FycmF5KiBwQW5ub3RMaXN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7Ci0gICAgaWYgKHBBbm5vdExpc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFubm90TGlzdC0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdCA9IHBBbm5vdExpc3QtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwQW5ub3QgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2w7Ci0gICAgICAgIGlmICghbV9Db250cm9sTWFwLkxvb2t1cChwQW5ub3QsICh2b2lkKiYpcENvbnRyb2wpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5kZXggPT0gY291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiBwQ29udHJvbDsKLSAgICAgICAgfQotICAgICAgICBjb3VudCArKzsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DUERGX0Zvcm1Db250cm9sKiBDUERGX0ludGVyRm9ybTo6R2V0Q29udHJvbEF0UG9pbnQoQ1BERl9QYWdlKiBwUGFnZSwgRlhfRkxPQVQgcGRmX3gsIEZYX0ZMT0FUIHBkZl95KSBjb25zdAotewotICAgIENQREZfQXJyYXkqIHBBbm5vdExpc3QgPSBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEFycmF5KCJBbm5vdHMiKTsKLSAgICBpZiAocEFubm90TGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBmb3IgKEZYX0RXT1JEIGkgPSBwQW5ub3RMaXN0LT5HZXRDb3VudCgpOyBpID4gMDsgaSAtLSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdCA9IHBBbm5vdExpc3QtPkdldERpY3QoaSAtIDEpOwotICAgICAgICBpZiAocEFubm90ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sOwotICAgICAgICBpZiAoIW1fQ29udHJvbE1hcC5Mb29rdXAocEFubm90LCAodm9pZComKXBDb250cm9sKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gcENvbnRyb2wtPkdldFJlY3QoKTsKLSAgICAgICAgaWYgKHJlY3QuQ29udGFpbnMocGRmX3gsIHBkZl95KSkgewotICAgICAgICAgICAgcmV0dXJuIHBDb250cm9sOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotQ1BERl9Gb3JtQ29udHJvbCogQ1BERl9JbnRlckZvcm06OkdldENvbnRyb2xCeURpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCkgY29uc3QKLXsKLSAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IE5VTEw7Ci0gICAgbV9Db250cm9sTWFwLkxvb2t1cChwV2lkZ2V0RGljdCwgKHZvaWQqJilwQ29udHJvbCk7Ci0gICAgcmV0dXJuIHBDb250cm9sOwotfQotRlhfRFdPUkQgQ1BERl9JbnRlckZvcm06OkNvdW50SW50ZXJuYWxGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSBjb25zdAotewotICAgIGlmICghbV9wRm9ybURpY3QpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG1fcEZvcm1EaWN0LT5HZXRBcnJheSgiRmllbGRzIik7Ci0gICAgaWYgKCFwQXJyYXkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChjc0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICB9Ci0gICAgaW50IGlMZW5ndGggPSBjc0ZpZWxkTmFtZS5HZXRMZW5ndGgoKTsKLSAgICBpbnQgaVBvcyA9IDA7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IE5VTEw7Ci0gICAgd2hpbGUgKHBBcnJheSAhPSBOVUxMKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzU3ViOwotICAgICAgICBpZiAoaVBvcyA8IGlMZW5ndGggJiYgY3NGaWVsZE5hbWVbaVBvc10gPT0gTCcuJykgewotICAgICAgICAgICAgaVBvcyArKzsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoaVBvcyA8IGlMZW5ndGggJiYgY3NGaWVsZE5hbWVbaVBvc10gIT0gTCcuJykgewotICAgICAgICAgICAgY3NTdWIgKz0gY3NGaWVsZE5hbWVbaVBvcyArK107Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGlDb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgcERpY3QgPSBwQXJyYXktPkdldERpY3QoaSk7Ci0gICAgICAgICAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NUID0gcERpY3QtPkdldFVuaWNvZGVUZXh0KCJUIik7Ci0gICAgICAgICAgICBpZiAoY3NUID09IGNzU3ViKSB7Ci0gICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghYkZpbmQpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpUG9zID49IGlMZW5ndGgpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheSgiS2lkcyIpOwotICAgIH0KLSAgICBpZiAoIXBEaWN0KSB7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChpUG9zID49IGlMZW5ndGgpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KICAgICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoIktpZHMiKTsKLSAgICByZXR1cm4gcEFycmF5ID8gcEFycmF5LT5HZXRDb3VudCgpIDogMTsKKyAgfQorICBpZiAoIXBEaWN0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KCJLaWRzIik7CisgIHJldHVybiBwQXJyYXkgPyBwQXJyYXktPkdldENvdW50KCkgOiAxOwogfQogCi1DUERGX0RpY3Rpb25hcnkqIENQREZfSW50ZXJGb3JtOjpHZXRJbnRlcm5hbEZpZWxkKEZYX0RXT1JEIGluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BGb3JtRGljdCkgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKK0NQREZfRGljdGlvbmFyeSogQ1BERl9JbnRlckZvcm06OkdldEludGVybmFsRmllbGQoCisgICAgRlhfRFdPUkQgaW5kZXgsCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSBjb25zdCB7CisgIGlmICghbV9wRm9ybURpY3QpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOworICBpZiAoIXBBcnJheSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChjc0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gcEFycmF5LT5HZXREaWN0KGluZGV4KTsKKyAgfQorICBpbnQgaUxlbmd0aCA9IGNzRmllbGROYW1lLkdldExlbmd0aCgpOworICBpbnQgaVBvcyA9IDA7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMOworICB3aGlsZSAocEFycmF5ICE9IE5VTEwpIHsKKyAgICBDRlhfV2lkZVN0cmluZyBjc1N1YjsKKyAgICBpZiAoaVBvcyA8IGlMZW5ndGggJiYgY3NGaWVsZE5hbWVbaVBvc10gPT0gTCcuJykgeworICAgICAgaVBvcysrOwogICAgIH0KLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOwotICAgIGlmICghcEFycmF5KSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOworICAgIHdoaWxlIChpUG9zIDwgaUxlbmd0aCAmJiBjc0ZpZWxkTmFtZVtpUG9zXSAhPSBMJy4nKSB7CisgICAgICBjc1N1YiArPSBjc0ZpZWxkTmFtZVtpUG9zKytdOwogICAgIH0KLSAgICBpZiAoY3NGaWVsZE5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBwQXJyYXktPkdldERpY3QoaW5kZXgpOworICAgIGludCBpQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7CisgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICAgIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0KGkpOworICAgICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBDRlhfV2lkZVN0cmluZyBjc1QgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoIlQiKTsKKyAgICAgIGlmIChjc1QgPT0gY3NTdWIpIHsKKyAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgaW50IGlMZW5ndGggPSBjc0ZpZWxkTmFtZS5HZXRMZW5ndGgoKTsKLSAgICBpbnQgaVBvcyA9IDA7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IE5VTEw7Ci0gICAgd2hpbGUgKHBBcnJheSAhPSBOVUxMKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzU3ViOwotICAgICAgICBpZiAoaVBvcyA8IGlMZW5ndGggJiYgY3NGaWVsZE5hbWVbaVBvc10gPT0gTCcuJykgewotICAgICAgICAgICAgaVBvcyArKzsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoaVBvcyA8IGlMZW5ndGggJiYgY3NGaWVsZE5hbWVbaVBvc10gIT0gTCcuJykgewotICAgICAgICAgICAgY3NTdWIgKz0gY3NGaWVsZE5hbWVbaVBvcyArK107Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGlDb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgcERpY3QgPSBwQXJyYXktPkdldERpY3QoaSk7Ci0gICAgICAgICAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NUID0gcERpY3QtPkdldFVuaWNvZGVUZXh0KCJUIik7Ci0gICAgICAgICAgICBpZiAoY3NUID09IGNzU3ViKSB7Ci0gICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghYkZpbmQpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpUG9zID49IGlMZW5ndGgpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheSgiS2lkcyIpOworICAgIGlmICghYkZpbmQpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoIXBEaWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOworICAgIGlmIChpUG9zID49IGlMZW5ndGgpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KICAgICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoIktpZHMiKTsKLSAgICByZXR1cm4gcEFycmF5ID8gcEFycmF5LT5HZXREaWN0KGluZGV4KSA6IHBEaWN0OworICB9CisgIGlmICghcERpY3QpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoIktpZHMiKTsKKyAgcmV0dXJuIHBBcnJheSA/IHBBcnJheS0+R2V0RGljdChpbmRleCkgOiBwRGljdDsKIH0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06Ok5lZWRDb25zdHJ1Y3RBUCgpCi17Ci0gICAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gbV9wRm9ybURpY3QtPkdldEJvb2xlYW4oIk5lZWRBcHBlYXJhbmNlcyIpOworRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6TmVlZENvbnN0cnVjdEFQKCkgeworICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gbV9wRm9ybURpY3QtPkdldEJvb2xlYW4oIk5lZWRBcHBlYXJhbmNlcyIpOwogfQotdm9pZCBDUERGX0ludGVyRm9ybTo6TmVlZENvbnN0cnVjdEFQKEZYX0JPT0wgYk5lZWRBUCkKLXsKLSAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICBJbml0SW50ZXJGb3JtRGljdChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQpOwotICAgIH0KLSAgICBtX3BGb3JtRGljdC0+U2V0QXRCb29sZWFuKCJOZWVkQXBwZWFyYW5jZXMiLCBiTmVlZEFQKTsKLSAgICBtX2JHZW5lcmF0ZUFQID0gYk5lZWRBUDsKK3ZvaWQgQ1BERl9JbnRlckZvcm06Ok5lZWRDb25zdHJ1Y3RBUChGWF9CT09MIGJOZWVkQVApIHsKKyAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwpIHsKKyAgICBJbml0SW50ZXJGb3JtRGljdChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQpOworICB9CisgIG1fcEZvcm1EaWN0LT5TZXRBdEJvb2xlYW4oIk5lZWRBcHBlYXJhbmNlcyIsIGJOZWVkQVApOworICBtX2JHZW5lcmF0ZUFQID0gYk5lZWRBUDsKIH0KLWludCBDUERGX0ludGVyRm9ybTo6Q291bnRGaWVsZHNJbkNhbGN1bGF0aW9uT3JkZXIoKQotewotICAgIGlmIChtX3BGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkNPIik7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcEFycmF5LT5HZXRDb3VudCgpOworaW50IENQREZfSW50ZXJGb3JtOjpDb3VudEZpZWxkc0luQ2FsY3VsYXRpb25PcmRlcigpIHsKKyAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkNPIik7CisgIGlmIChwQXJyYXkgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBwQXJyYXktPkdldENvdW50KCk7CiB9Ci1DUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkdldEZpZWxkSW5DYWxjdWxhdGlvbk9yZGVyKGludCBpbmRleCkKLXsKLSAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCB8fCBpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQ08iKTsKLSAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGluZGV4KTsKLSAgICBpZiAocEVsZW1lbnQgIT0gTlVMTCAmJiBwRWxlbWVudC0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHJldHVybiBHZXRGaWVsZEJ5RGljdCgoQ1BERl9EaWN0aW9uYXJ5KilwRWxlbWVudCk7Ci0gICAgfQorQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpHZXRGaWVsZEluQ2FsY3VsYXRpb25PcmRlcihpbnQgaW5kZXgpIHsKKyAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwgfHwgaW5kZXggPCAwKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9BcnJheSogcEFycmF5ID0gbV9wRm9ybURpY3QtPkdldEFycmF5KCJDTyIpOworICBpZiAocEFycmF5ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpbmRleCk7CisgIGlmIChwRWxlbWVudCAhPSBOVUxMICYmIHBFbGVtZW50LT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICByZXR1cm4gR2V0RmllbGRCeURpY3QoKENQREZfRGljdGlvbmFyeSopcEVsZW1lbnQpOworICB9CisgIHJldHVybiBOVUxMOwogfQotaW50IENQREZfSW50ZXJGb3JtOjpGaW5kRmllbGRJbkNhbGN1bGF0aW9uT3JkZXIoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCkKLXsKLSAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCB8fCBwRmllbGQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQ08iKTsKLSAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOwotICAgICAgICBpZiAocEVsZW1lbnQgPT0gcEZpZWxkLT5tX3BEaWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KK2ludCBDUERGX0ludGVyRm9ybTo6RmluZEZpZWxkSW5DYWxjdWxhdGlvbk9yZGVyKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpIHsKKyAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwgfHwgcEZpZWxkID09IE5VTEwpIHsKICAgICByZXR1cm4gLTE7Ci19Ci1GWF9EV09SRCBDUERGX0ludGVyRm9ybTo6Q291bnRGb3JtRm9udHMoKQotewotICAgIHJldHVybiBDb3VudEludGVyRm9ybUZvbnRzKG1fcEZvcm1EaWN0KTsKLX0KLUNQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkdldEZvcm1Gb250KEZYX0RXT1JEIGluZGV4LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQotewotICAgIHJldHVybiBHZXRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgaW5kZXgsIGNzTmFtZVRhZyk7Ci19Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpHZXRGb3JtRm9udChDRlhfQnl0ZVN0cmluZyBjc05hbWVUYWcpCi17Ci0gICAgcmV0dXJuIEdldEludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBjc05hbWVUYWcpOwotfQotQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6R2V0Rm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICByZXR1cm4gR2V0SW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzRm9udE5hbWUsIGNzTmFtZVRhZyk7Ci19Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVGb3JtRm9udCh1aW50OF90IGNoYXJTZXQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17Ci0gICAgcmV0dXJuIEdldE5hdGl2ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBjaGFyU2V0LCBjc05hbWVUYWcpOwotfQotQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICByZXR1cm4gR2V0TmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzTmFtZVRhZyk7Ci19Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpGaW5kRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICByZXR1cm4gRmluZEludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIHBGb250LCBjc05hbWVUYWcpOwotfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6RmluZEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENQREZfRm9udComIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQotewotICAgIHJldHVybiBGaW5kSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzRm9udE5hbWUsIHBGb250LCBjc05hbWVUYWcpOwotfQotdm9pZCBDUERGX0ludGVyRm9ybTo6QWRkRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICBBZGRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgcEZvbnQsIGNzTmFtZVRhZyk7Ci0gICAgbV9iVXBkYXRlZCA9IFRSVUU7Ci19Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb3JtRm9udCh1aW50OF90IGNoYXJTZXQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17Ci0gICAgbV9iVXBkYXRlZCA9IFRSVUU7Ci0gICAgcmV0dXJuIEFkZE5hdGl2ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBjaGFyU2V0LCBjc05hbWVUYWcpOwotfQotQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkTmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICBtX2JVcGRhdGVkID0gVFJVRTsKLSAgICByZXR1cm4gQWRkTmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzTmFtZVRhZyk7Ci19Ci12b2lkIENQREZfSW50ZXJGb3JtOjpSZW1vdmVGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250KQotewotICAgIG1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIFJlbW92ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIHBGb250KTsKLX0KLXZvaWQgQ1BERl9JbnRlckZvcm06OlJlbW92ZUZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZykKLXsKLSAgICBtX2JVcGRhdGVkID0gVFJVRTsKLSAgICBSZW1vdmVJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBjc05hbWVUYWcpOwotfQotQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBDUERGX0ludGVyRm9ybTo6R2V0RGVmYXVsdEFwcGVhcmFuY2UoKQotewotICAgIENGWF9CeXRlU3RyaW5nIGNzREE7Ci0gICAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGNzREE7CisgIH0KKyAgQ1BERl9BcnJheSogcEFycmF5ID0gbV9wRm9ybURpY3QtPkdldEFycmF5KCJDTyIpOworICBpZiAocEFycmF5ID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7CisgICAgaWYgKHBFbGVtZW50ID09IHBGaWVsZC0+bV9wRGljdCkgeworICAgICAgcmV0dXJuIGk7CiAgICAgfQotICAgIGNzREEgPSBtX3BGb3JtRGljdC0+R2V0U3RyaW5nKCJEQSIpOworICB9CisgIHJldHVybiAtMTsKK30KK0ZYX0RXT1JEIENQREZfSW50ZXJGb3JtOjpDb3VudEZvcm1Gb250cygpIHsKKyAgcmV0dXJuIENvdW50SW50ZXJGb3JtRm9udHMobV9wRm9ybURpY3QpOworfQorQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6R2V0Rm9ybUZvbnQoRlhfRFdPUkQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIHJldHVybiBHZXRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgaW5kZXgsIGNzTmFtZVRhZyk7Cit9CitDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpHZXRGb3JtRm9udChDRlhfQnl0ZVN0cmluZyBjc05hbWVUYWcpIHsKKyAgcmV0dXJuIEdldEludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBjc05hbWVUYWcpOworfQorQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6R2V0Rm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgcmV0dXJuIEdldEludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBjc0ZvbnROYW1lLCBjc05hbWVUYWcpOworfQorQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlRm9ybUZvbnQodWludDhfdCBjaGFyU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICByZXR1cm4gR2V0TmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNoYXJTZXQsIGNzTmFtZVRhZyk7Cit9CitDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVGb3JtRm9udChDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIHJldHVybiBHZXROYXRpdmVJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NOYW1lVGFnKTsKK30KK0ZYX0JPT0wgQ1BERl9JbnRlckZvcm06OkZpbmRGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgcmV0dXJuIEZpbmRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBwRm9udCwgY3NOYW1lVGFnKTsKK30KK0ZYX0JPT0wgQ1BERl9JbnRlckZvcm06OkZpbmRGb3JtRm9udChDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udComIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgcmV0dXJuIEZpbmRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NGb250TmFtZSwgcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjc05hbWVUYWcpOworfQordm9pZCBDUERGX0ludGVyRm9ybTo6QWRkRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgQWRkSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIHBGb250LCBjc05hbWVUYWcpOworICBtX2JVcGRhdGVkID0gVFJVRTsKK30KK0NQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkFkZE5hdGl2ZUZvcm1Gb250KHVpbnQ4X3QgY2hhclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgbV9iVXBkYXRlZCA9IFRSVUU7CisgIHJldHVybiBBZGROYXRpdmVJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY2hhclNldCwgY3NOYW1lVGFnKTsKK30KK0NQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkFkZE5hdGl2ZUZvcm1Gb250KENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgbV9iVXBkYXRlZCA9IFRSVUU7CisgIHJldHVybiBBZGROYXRpdmVJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NOYW1lVGFnKTsKK30KK3ZvaWQgQ1BERl9JbnRlckZvcm06OlJlbW92ZUZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQpIHsKKyAgbV9iVXBkYXRlZCA9IFRSVUU7CisgIFJlbW92ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIHBGb250KTsKK30KK3ZvaWQgQ1BERl9JbnRlckZvcm06OlJlbW92ZUZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZykgeworICBtX2JVcGRhdGVkID0gVFJVRTsKKyAgUmVtb3ZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgY3NOYW1lVGFnKTsKK30KK0NQREZfRGVmYXVsdEFwcGVhcmFuY2UgQ1BERl9JbnRlckZvcm06OkdldERlZmF1bHRBcHBlYXJhbmNlKCkgeworICBDRlhfQnl0ZVN0cmluZyBjc0RBOworICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewogICAgIHJldHVybiBjc0RBOworICB9CisgIGNzREEgPSBtX3BGb3JtRGljdC0+R2V0U3RyaW5nKCJEQSIpOworICByZXR1cm4gY3NEQTsKIH0KLUNQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkdldERlZmF1bHRGb3JtRm9udCgpCi17Ci0gICAgcmV0dXJuIEdldERlZmF1bHRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCk7CitDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpHZXREZWZhdWx0Rm9ybUZvbnQoKSB7CisgIHJldHVybiBHZXREZWZhdWx0SW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQpOwogfQotaW50IENQREZfSW50ZXJGb3JtOjpHZXRGb3JtQWxpZ25tZW50KCkKLXsKLSAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcEZvcm1EaWN0LT5HZXRJbnRlZ2VyKCJRIiwgMCk7CitpbnQgQ1BERl9JbnRlckZvcm06OkdldEZvcm1BbGlnbm1lbnQoKSB7CisgIGlmIChtX3BGb3JtRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIG1fcEZvcm1EaWN0LT5HZXRJbnRlZ2VyKCJRIiwgMCk7CiB9Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpSZXNldEZvcm0oY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsIEZYX0JPT0wgYk5vdGlmeSkKLXsKLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtTm90aWZ5LT5CZWZvcmVGb3JtUmVzZXQodGhpcyk7Ci0gICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpSZXNldEZvcm0oY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsKKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgaW50IGlSZXQgPSBtX3BGb3JtTm90aWZ5LT5CZWZvcmVGb3JtUmVzZXQodGhpcyk7CisgICAgaWYgKGlSZXQgPCAwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOwotICAgICAgICBpZiAocEZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKLSAgICAgICAgaW50IGlDb3VudCA9IGZpZWxkcy5HZXRTaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAocEZpZWxkID09IChDUERGX0Zvcm1GaWVsZCopZmllbGRzW2ldKSB7Ci0gICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoYkluY2x1ZGVPckV4Y2x1ZGUgJiYgYkZpbmQpIHx8ICghYkluY2x1ZGVPckV4Y2x1ZGUgJiYgIWJGaW5kKSkgewotICAgICAgICAgICAgcEZpZWxkLT5SZXNldEZpZWxkKGJOb3RpZnkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICBtX3BGb3JtTm90aWZ5LT5BZnRlckZvcm1SZXNldCh0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpSZXNldEZvcm0oRlhfQk9PTCBiTm90aWZ5KQotewotICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm1Ob3RpZnktPkJlZm9yZUZvcm1SZXNldCh0aGlzKTsKLSAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGQoaSk7Ci0gICAgICAgIGlmIChwRmllbGQgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcEZpZWxkLT5SZXNldEZpZWxkKGJOb3RpZnkpOwotICAgIH0KLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJGb3JtUmVzZXQodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDUERGX0ludGVyRm9ybTo6UmVsb2FkRm9ybSgpCi17Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9Db250cm9sTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFdpZGdldERpY3Q7Ci0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sOwotICAgICAgICBtX0NvbnRyb2xNYXAuR2V0TmV4dEFzc29jKHBvcywgKHZvaWQqJilwV2lkZ2V0RGljdCwgKHZvaWQqJilwQ29udHJvbCk7Ci0gICAgICAgIGRlbGV0ZSBwQ29udHJvbDsKLSAgICB9Ci0gICAgbV9Db250cm9sTWFwLlJlbW92ZUFsbCgpOwotICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwotICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbkNvdW50OyBrICsrKSB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChrKTsKLSAgICAgICAgZGVsZXRlIHBGaWVsZDsKLSAgICB9Ci0gICAgbV9wRmllbGRUcmVlLT5SZW1vdmVBbGwoKTsKLSAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBGaWVsZHMgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOwotICAgIGlmIChwRmllbGRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgaUNvdW50ID0gcEZpZWxkcy0+R2V0Q291bnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICBMb2FkRmllbGQocEZpZWxkcy0+R2V0RGljdChpKSk7Ci0gICAgfQotfQotdm9pZCBDUERGX0ludGVyRm9ybTo6TG9hZEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgaW50IG5MZXZlbCkKLXsKLSAgICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwRmllbGREaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9EV09SRCBkd1BhcmVudE9iak51bSA9IHBGaWVsZERpY3QtPkdldE9iak51bSgpOwotICAgIENQREZfQXJyYXkqIHBLaWRzID0gcEZpZWxkRGljdC0+R2V0QXJyYXkoIktpZHMiKTsKLSAgICBpZiAoIXBLaWRzKSB7Ci0gICAgICAgIEFkZFRlcm1pbmFsRmllbGQocEZpZWxkRGljdCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRmlyc3RLaWQgPSBwS2lkcy0+R2V0RGljdCgwKTsKLSAgICBpZiAocEZpcnN0S2lkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocEZpcnN0S2lkLT5LZXlFeGlzdCgiVCIpIHx8IHBGaXJzdEtpZC0+S2V5RXhpc3QoIktpZHMiKSkgewotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZHMtPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSAqIHBDaGlsZERpY3QgPSBwS2lkcy0+R2V0RGljdChpKTsKLSAgICAgICAgICAgIGlmIChwQ2hpbGREaWN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDaGlsZERpY3QtPkdldE9iak51bSgpICE9IGR3UGFyZW50T2JqTnVtKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvYWRGaWVsZChwQ2hpbGREaWN0LCBuTGV2ZWwgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBZGRUZXJtaW5hbEZpZWxkKHBGaWVsZERpY3QpOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06Okhhc1hGQUZvcm0oKSBjb25zdAotewotICAgIHJldHVybiBtX3BGb3JtRGljdCAmJiBtX3BGb3JtRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlhGQSIpKSAhPSBOVUxMOwotfQotdm9pZCBDUERGX0ludGVyRm9ybTo6Rml4UGFnZUZpZWxkcyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlKQotewotICAgIEFTU0VSVChwUGFnZSAhPSBOVUxMKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKLSAgICBpZiAocFBhZ2VEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwQW5ub3RzID0gcFBhZ2VEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQW5ub3RzIikpOwotICAgIGlmIChwQW5ub3RzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgaUFubm90Q291bnQgPSBwQW5ub3RzLT5HZXRDb3VudCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUFubm90Q291bnQ7IGkrKykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdCA9IHBBbm5vdHMtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwQW5ub3QgIT0gTlVMTCAmJiBwQW5ub3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKSA9PSAiV2lkZ2V0IikgewotICAgICAgICAgICAgTG9hZEZpZWxkKHBBbm5vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkFkZFRlcm1pbmFsRmllbGQoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KQotewotICAgIGlmICghcEZpZWxkRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlQiKSkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRmllbGREaWN0OwotICAgIENGWF9XaWRlU3RyaW5nIGNzV05hbWUgPSBHZXRGdWxsTmFtZShwRGljdCk7Ci0gICAgaWYgKGNzV05hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gTlVMTDsKLSAgICBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPkdldEZpZWxkKGNzV05hbWUpOworICB9CisgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOwogICAgIGlmIChwRmllbGQgPT0gTlVMTCkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBQYXJlbnQgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRmllbGREaWN0OwotICAgICAgICBpZiAoIXBGaWVsZERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJUIikpICYmCi0gICAgICAgICAgICBwRmllbGREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkgPT0gRlhfQlNUUkMoIldpZGdldCIpKSB7Ci0gICAgICAgICAgICBwUGFyZW50ID0gcEZpZWxkRGljdC0+R2V0RGljdChGWF9CU1RSQygiUGFyZW50IikpOwotICAgICAgICAgICAgaWYgKCFwUGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgcFBhcmVudCA9IChDUERGX0RpY3Rpb25hcnkqKXBGaWVsZERpY3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBQYXJlbnQgJiYgcFBhcmVudCAhPSBwRmllbGREaWN0ICYmICFwUGFyZW50LT5LZXlFeGlzdChGWF9CU1RSQygiRlQiKSkpIHsKLSAgICAgICAgICAgIGlmIChwRmllbGREaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiRlQiKSkpIHsKLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCAqcEZUVmFsdWUgPSBwRmllbGREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZUIikpOwotICAgICAgICAgICAgICAgIGlmIChwRlRWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICBwUGFyZW50LT5TZXRBdChGWF9CU1RSQygiRlQiKSwgcEZUVmFsdWUtPkNsb25lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwRmllbGREaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiRmYiKSkpIHsKLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCAqcEZmVmFsdWUgPSBwRmllbGREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZmIikpOwotICAgICAgICAgICAgICAgIGlmIChwRmZWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICBwUGFyZW50LT5TZXRBdChGWF9CU1RSQygiRmYiKSwgcEZmVmFsdWUtPkNsb25lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwRmllbGQgPSBGWF9ORVcgQ1BERl9Gb3JtRmllbGQodGhpcywgcFBhcmVudCk7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwVE9iaiA9IHBEaWN0LT5HZXRFbGVtZW50KCJUIik7Ci0gICAgICAgIGlmIChwVE9iaiAmJiBwVE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQ2xvbmUgPSBwVE9iai0+Q2xvbmUoVFJVRSk7Ci0gICAgICAgICAgICBpZiAocENsb25lKSB7Ci0gICAgICAgICAgICAgICAgcERpY3QtPlNldEF0KCJUIiwgcENsb25lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcERpY3QtPlNldEF0TmFtZSgiVCIsICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX3BGaWVsZFRyZWUtPlNldEZpZWxkKGNzV05hbWUsIHBGaWVsZCk7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgQ1BERl9BcnJheSogcEtpZHMgPSBwRmllbGREaWN0LT5HZXRBcnJheSgiS2lkcyIpOwotICAgIGlmIChwS2lkcyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChwRmllbGREaWN0LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSA9PSAiV2lkZ2V0IikgewotICAgICAgICAgICAgQWRkQ29udHJvbChwRmllbGQsIHBGaWVsZERpY3QpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkcy0+R2V0RGljdChpKTsKLSAgICAgICAgICAgIGlmIChwS2lkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwS2lkLT5HZXRTdHJpbmcoIlN1YnR5cGUiKSAhPSAiV2lkZ2V0IikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWRkQ29udHJvbChwRmllbGQsIHBLaWQpOwotICAgICAgICB9CisgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOworICAgIGludCBpQ291bnQgPSBmaWVsZHMuR2V0U2l6ZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICAgIGlmIChwRmllbGQgPT0gKENQREZfRm9ybUZpZWxkKilmaWVsZHNbaV0pIHsKKyAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHBGaWVsZDsKKyAgICBpZiAoKGJJbmNsdWRlT3JFeGNsdWRlICYmIGJGaW5kKSB8fCAoIWJJbmNsdWRlT3JFeGNsdWRlICYmICFiRmluZCkpIHsKKyAgICAgIHBGaWVsZC0+UmVzZXRGaWVsZChiTm90aWZ5KTsKKyAgICB9CisgIH0KKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJGb3JtUmVzZXQodGhpcyk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1DUERGX0Zvcm1Db250cm9sKiBDUERGX0ludGVyRm9ybTo6QWRkQ29udHJvbChjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KQotewotICAgIHZvaWQgKnJWYWx1ZSA9IE5VTEw7Ci0gICAgaWYgKG1fQ29udHJvbE1hcC5Mb29rdXAoKENQREZfRGljdGlvbmFyeSopcFdpZGdldERpY3QsIHJWYWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuIChDUERGX0Zvcm1Db250cm9sKilyVmFsdWU7CitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpSZXNldEZvcm0oRlhfQk9PTCBiTm90aWZ5KSB7CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgeworICAgIGludCBpUmV0ID0gbV9wRm9ybU5vdGlmeS0+QmVmb3JlRm9ybVJlc2V0KHRoaXMpOworICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEZYX05FVyBDUERGX0Zvcm1Db250cm9sKChDUERGX0Zvcm1GaWVsZCopcEZpZWxkLCAoQ1BERl9EaWN0aW9uYXJ5KilwV2lkZ2V0RGljdCk7Ci0gICAgaWYgKHBDb250cm9sID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGQoaSk7CisgICAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgbV9Db250cm9sTWFwLlNldEF0KChDUERGX0RpY3Rpb25hcnkqKXBXaWRnZXREaWN0LCBwQ29udHJvbCk7Ci0gICAgKChDUERGX0Zvcm1GaWVsZCopcEZpZWxkKS0+bV9Db250cm9sTGlzdC5BZGQocENvbnRyb2wpOwotICAgIHJldHVybiBwQ29udHJvbDsKKyAgICBwRmllbGQtPlJlc2V0RmllbGQoYk5vdGlmeSk7CisgIH0KKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJGb3JtUmVzZXQodGhpcyk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1DUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkNoZWNrUmVxdWlyZWRGaWVsZHMoY29uc3QgQ0ZYX1B0ckFycmF5ICpmaWVsZHMsIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUpIGNvbnN0Ci17Ci0gICAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGQoaSk7Ci0gICAgICAgIGlmIChwRmllbGQgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Cit2b2lkIENQREZfSW50ZXJGb3JtOjpSZWxvYWRGb3JtKCkgeworICBGWF9QT1NJVElPTiBwb3MgPSBtX0NvbnRyb2xNYXAuR2V0U3RhcnRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdDsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbDsKKyAgICBtX0NvbnRyb2xNYXAuR2V0TmV4dEFzc29jKHBvcywgKHZvaWQqJilwV2lkZ2V0RGljdCwgKHZvaWQqJilwQ29udHJvbCk7CisgICAgZGVsZXRlIHBDb250cm9sOworICB9CisgIG1fQ29udHJvbE1hcC5SZW1vdmVBbGwoKTsKKyAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgbkNvdW50OyBrKyspIHsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGQoayk7CisgICAgZGVsZXRlIHBGaWVsZDsKKyAgfQorICBtX3BGaWVsZFRyZWUtPlJlbW92ZUFsbCgpOworICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0FycmF5KiBwRmllbGRzID0gbV9wRm9ybURpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKKyAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgaUNvdW50ID0gcEZpZWxkcy0+R2V0Q291bnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIExvYWRGaWVsZChwRmllbGRzLT5HZXREaWN0KGkpKTsKKyAgfQorfQordm9pZCBDUERGX0ludGVyRm9ybTo6TG9hZEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgaW50IG5MZXZlbCkgeworICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAocEZpZWxkRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0RXT1JEIGR3UGFyZW50T2JqTnVtID0gcEZpZWxkRGljdC0+R2V0T2JqTnVtKCk7CisgIENQREZfQXJyYXkqIHBLaWRzID0gcEZpZWxkRGljdC0+R2V0QXJyYXkoIktpZHMiKTsKKyAgaWYgKCFwS2lkcykgeworICAgIEFkZFRlcm1pbmFsRmllbGQocEZpZWxkRGljdCk7CisgICAgcmV0dXJuOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZpcnN0S2lkID0gcEtpZHMtPkdldERpY3QoMCk7CisgIGlmIChwRmlyc3RLaWQgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAocEZpcnN0S2lkLT5LZXlFeGlzdCgiVCIpIHx8IHBGaXJzdEtpZC0+S2V5RXhpc3QoIktpZHMiKSkgeworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBDaGlsZERpY3QgPSBwS2lkcy0+R2V0RGljdChpKTsKKyAgICAgIGlmIChwQ2hpbGREaWN0KSB7CisgICAgICAgIGlmIChwQ2hpbGREaWN0LT5HZXRPYmpOdW0oKSAhPSBkd1BhcmVudE9iak51bSkgeworICAgICAgICAgIExvYWRGaWVsZChwQ2hpbGREaWN0LCBuTGV2ZWwgKyAxKTsKICAgICAgICAgfQotICAgICAgICBpbnQzMl90IGlUeXBlID0gcEZpZWxkLT5HZXRUeXBlKCk7Ci0gICAgICAgIGlmIChpVHlwZSA9PSBDUERGX0Zvcm1GaWVsZDo6UHVzaEJ1dHRvbiB8fCBpVHlwZSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwgaVR5cGUgPT0gQ1BERl9Gb3JtRmllbGQ6Okxpc3RCb3gpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwRmllbGQtPkdldEZpZWxkRmxhZ3MoKTsKLSAgICAgICAgaWYgKGR3RmxhZ3MgJiAweDA0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJGaW5kID0gVFJVRTsKLSAgICAgICAgaWYgKGZpZWxkcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBiRmluZCA9IGZpZWxkcy0+RmluZChwRmllbGQsIDApID49IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChiSW5jbHVkZU9yRXhjbHVkZSAmJiBiRmluZCkgfHwgKCFiSW5jbHVkZU9yRXhjbHVkZSAmJiAhYkZpbmQpKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBGaWVsZERpY3QgPSBwRmllbGQtPm1fcERpY3Q7Ci0gICAgICAgICAgICBpZiAoKGR3RmxhZ3MgJiAweDAyKSAhPSAwICYmIHBGaWVsZERpY3QtPkdldFN0cmluZygiViIpLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwRmllbGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIH0KICAgICB9CisgIH0gZWxzZSB7CisgICAgQWRkVGVybWluYWxGaWVsZChwRmllbGREaWN0KTsKKyAgfQorfQorRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6SGFzWEZBRm9ybSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEZvcm1EaWN0ICYmIG1fcEZvcm1EaWN0LT5HZXRBcnJheShGWF9CU1RSQygiWEZBIikpICE9IE5VTEw7Cit9Cit2b2lkIENQREZfSW50ZXJGb3JtOjpGaXhQYWdlRmllbGRzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UpIHsKKyAgQVNTRVJUKHBQYWdlICE9IE5VTEwpOworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKKyAgaWYgKHBQYWdlRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfQXJyYXkqIHBBbm5vdHMgPSBwUGFnZURpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJBbm5vdHMiKSk7CisgIGlmIChwQW5ub3RzID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGlBbm5vdENvdW50ID0gcEFubm90cy0+R2V0Q291bnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQW5ub3RDb3VudDsgaSsrKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3QgPSBwQW5ub3RzLT5HZXREaWN0KGkpOworICAgIGlmIChwQW5ub3QgIT0gTlVMTCAmJiBwQW5ub3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKSA9PSAiV2lkZ2V0IikgeworICAgICAgTG9hZEZpZWxkKHBBbm5vdCk7CisgICAgfQorICB9Cit9CitDUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkFkZFRlcm1pbmFsRmllbGQoCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KSB7CisgIGlmICghcEZpZWxkRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlQiKSkpIHsKICAgICByZXR1cm4gTlVMTDsKLX0KLUNGREZfRG9jdW1lbnQqIENQREZfSW50ZXJGb3JtOjpFeHBvcnRUb0ZERihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLCBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYykgY29uc3QKLXsKLSAgICBDRlhfUHRyQXJyYXkgZmllbGRzOwotICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKTsKLSAgICAgICAgZmllbGRzLkFkZChwRmllbGQpOworICB9CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRmllbGREaWN0OworICBDRlhfV2lkZVN0cmluZyBjc1dOYW1lID0gR2V0RnVsbE5hbWUocERpY3QpOworICBpZiAoY3NXTmFtZS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gTlVMTDsKKyAgcEZpZWxkID0gbV9wRmllbGRUcmVlLT5HZXRGaWVsZChjc1dOYW1lKTsKKyAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50ID0gKENQREZfRGljdGlvbmFyeSopcEZpZWxkRGljdDsKKyAgICBpZiAoIXBGaWVsZERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJUIikpICYmCisgICAgICAgIHBGaWVsZERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKSA9PSBGWF9CU1RSQygiV2lkZ2V0IikpIHsKKyAgICAgIHBQYXJlbnQgPSBwRmllbGREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJQYXJlbnQiKSk7CisgICAgICBpZiAoIXBQYXJlbnQpIHsKKyAgICAgICAgcFBhcmVudCA9IChDUERGX0RpY3Rpb25hcnkqKXBGaWVsZERpY3Q7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBFeHBvcnRUb0ZERihwZGZfcGF0aCwgZmllbGRzLCBUUlVFLCBiU2ltcGxlRmlsZVNwZWMpOworICAgIGlmIChwUGFyZW50ICYmIHBQYXJlbnQgIT0gcEZpZWxkRGljdCAmJgorICAgICAgICAhcFBhcmVudC0+S2V5RXhpc3QoRlhfQlNUUkMoIkZUIikpKSB7CisgICAgICBpZiAocEZpZWxkRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIkZUIikpKSB7CisgICAgICAgIENQREZfT2JqZWN0KiBwRlRWYWx1ZSA9IHBGaWVsZERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRlQiKSk7CisgICAgICAgIGlmIChwRlRWYWx1ZSkgeworICAgICAgICAgIHBQYXJlbnQtPlNldEF0KEZYX0JTVFJDKCJGVCIpLCBwRlRWYWx1ZS0+Q2xvbmUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChwRmllbGREaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiRmYiKSkpIHsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBGZlZhbHVlID0gcEZpZWxkRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJGZiIpKTsKKyAgICAgICAgaWYgKHBGZlZhbHVlKSB7CisgICAgICAgICAgcFBhcmVudC0+U2V0QXQoRlhfQlNUUkMoIkZmIiksIHBGZlZhbHVlLT5DbG9uZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBwRmllbGQgPSBGWF9ORVcgQ1BERl9Gb3JtRmllbGQodGhpcywgcFBhcmVudCk7CisgICAgQ1BERl9PYmplY3QqIHBUT2JqID0gcERpY3QtPkdldEVsZW1lbnQoIlQiKTsKKyAgICBpZiAocFRPYmogJiYgcFRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgICBDUERGX09iamVjdCogcENsb25lID0gcFRPYmotPkNsb25lKFRSVUUpOworICAgICAgaWYgKHBDbG9uZSkgeworICAgICAgICBwRGljdC0+U2V0QXQoIlQiLCBwQ2xvbmUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcERpY3QtPlNldEF0TmFtZSgiVCIsICIiKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9wRmllbGRUcmVlLT5TZXRGaWVsZChjc1dOYW1lLCBwRmllbGQpOworICB9CisgIENQREZfQXJyYXkqIHBLaWRzID0gcEZpZWxkRGljdC0+R2V0QXJyYXkoIktpZHMiKTsKKyAgaWYgKHBLaWRzID09IE5VTEwpIHsKKyAgICBpZiAocEZpZWxkRGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIikgPT0gIldpZGdldCIpIHsKKyAgICAgIEFkZENvbnRyb2wocEZpZWxkLCBwRmllbGREaWN0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzLT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcEtpZCA9IHBLaWRzLT5HZXREaWN0KGkpOworICAgICAgaWYgKHBLaWQgPT0gTlVMTCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwS2lkLT5HZXRTdHJpbmcoIlN1YnR5cGUiKSAhPSAiV2lkZ2V0IikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEFkZENvbnRyb2wocEZpZWxkLCBwS2lkKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBGaWVsZDsKK30KK0NQREZfRm9ybUNvbnRyb2wqIENQREZfSW50ZXJGb3JtOjpBZGRDb250cm9sKAorICAgIGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCkgeworICB2b2lkKiByVmFsdWUgPSBOVUxMOworICBpZiAobV9Db250cm9sTWFwLkxvb2t1cCgoQ1BERl9EaWN0aW9uYXJ5KilwV2lkZ2V0RGljdCwgclZhbHVlKSkgeworICAgIHJldHVybiAoQ1BERl9Gb3JtQ29udHJvbCopclZhbHVlOworICB9CisgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gRlhfTkVXIENQREZfRm9ybUNvbnRyb2woCisgICAgICAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZCwgKENQREZfRGljdGlvbmFyeSopcFdpZGdldERpY3QpOworICBpZiAocENvbnRyb2wgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIG1fQ29udHJvbE1hcC5TZXRBdCgoQ1BERl9EaWN0aW9uYXJ5KilwV2lkZ2V0RGljdCwgcENvbnRyb2wpOworICAoKENQREZfRm9ybUZpZWxkKilwRmllbGQpLT5tX0NvbnRyb2xMaXN0LkFkZChwQ29udHJvbCk7CisgIHJldHVybiBwQ29udHJvbDsKK30KK0NQREZfRm9ybUZpZWxkKiBDUERGX0ludGVyRm9ybTo6Q2hlY2tSZXF1aXJlZEZpZWxkcygKKyAgICBjb25zdCBDRlhfUHRyQXJyYXkqIGZpZWxkcywKKyAgICBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlKSBjb25zdCB7CisgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOworICAgIGlmIChwRmllbGQgPT0gTlVMTCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludDMyX3QgaVR5cGUgPSBwRmllbGQtPkdldFR5cGUoKTsKKyAgICBpZiAoaVR5cGUgPT0gQ1BERl9Gb3JtRmllbGQ6OlB1c2hCdXR0b24gfHwKKyAgICAgICAgaVR5cGUgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8IGlUeXBlID09IENQREZfRm9ybUZpZWxkOjpMaXN0Qm94KSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBGaWVsZC0+R2V0RmllbGRGbGFncygpOworICAgIGlmIChkd0ZsYWdzICYgMHgwNCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIEZYX0JPT0wgYkZpbmQgPSBUUlVFOworICAgIGlmIChmaWVsZHMgIT0gTlVMTCkgeworICAgICAgYkZpbmQgPSBmaWVsZHMtPkZpbmQocEZpZWxkLCAwKSA+PSAwOworICAgIH0KKyAgICBpZiAoKGJJbmNsdWRlT3JFeGNsdWRlICYmIGJGaW5kKSB8fCAoIWJJbmNsdWRlT3JFeGNsdWRlICYmICFiRmluZCkpIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCA9IHBGaWVsZC0+bV9wRGljdDsKKyAgICAgIGlmICgoZHdGbGFncyAmIDB4MDIpICE9IDAgJiYgcEZpZWxkRGljdC0+R2V0U3RyaW5nKCJWIikuSXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBwRmllbGQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorQ0ZERl9Eb2N1bWVudCogQ1BERl9JbnRlckZvcm06OkV4cG9ydFRvRkRGKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2ltcGxlRmlsZVNwZWMpIGNvbnN0IHsKKyAgQ0ZYX1B0ckFycmF5IGZpZWxkczsKKyAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGQoaSk7CisgICAgZmllbGRzLkFkZChwRmllbGQpOworICB9CisgIHJldHVybiBFeHBvcnRUb0ZERihwZGZfcGF0aCwgZmllbGRzLCBUUlVFLCBiU2ltcGxlRmlsZVNwZWMpOwogfQogQ0ZYX1dpZGVTdHJpbmcgRklMRVNQRUNfRW5jb2RlRmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlcGF0aCk7Ci1DRkRGX0RvY3VtZW50KiBDUERGX0ludGVyRm9ybTo6RXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsIEZYX0JPT0wgYlNpbXBsZUZpbGVTcGVjKSBjb25zdAotewotICAgIENGREZfRG9jdW1lbnQqIHBEb2MgPSBDRkRGX0RvY3VtZW50OjpDcmVhdGVOZXdEb2MoKTsKLSAgICBpZiAocERvYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworQ0ZERl9Eb2N1bWVudCogQ1BERl9JbnRlckZvcm06OkV4cG9ydFRvRkRGKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYykgY29uc3QgeworICBDRkRGX0RvY3VtZW50KiBwRG9jID0gQ0ZERl9Eb2N1bWVudDo6Q3JlYXRlTmV3RG9jKCk7CisgIGlmIChwRG9jID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBNYWluRGljdCA9IHBEb2MtPkdldFJvb3QoKS0+R2V0RGljdCgiRkRGIik7CisgIGlmICghcGRmX3BhdGguSXNFbXB0eSgpKSB7CisgICAgaWYgKGJTaW1wbGVGaWxlU3BlYykgeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aCA9IEZJTEVTUEVDX0VuY29kZUZpbGVOYW1lKHBkZl9wYXRoKTsKKyAgICAgIHBNYWluRGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIkYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzRmlsZVBhdGgpKTsKKyAgICAgIHBNYWluRGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIlVGIiksIFBERl9FbmNvZGVUZXh0KHdzRmlsZVBhdGgpKTsKKyAgICB9IGVsc2UgeworICAgICAgQ1BERl9GaWxlU3BlYyBmaWxlc3BlYzsKKyAgICAgIGZpbGVzcGVjLlNldEZpbGVOYW1lKHBkZl9wYXRoKTsKKyAgICAgIHBNYWluRGljdC0+U2V0QXQoIkYiLCAoQ1BERl9PYmplY3QqKWZpbGVzcGVjKTsKICAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFpbkRpY3QgPSBwRG9jLT5HZXRSb290KCktPkdldERpY3QoIkZERiIpOwotICAgIGlmICghcGRmX3BhdGguSXNFbXB0eSgpKSB7Ci0gICAgICAgIGlmIChiU2ltcGxlRmlsZVNwZWMpIHsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRmlsZVBhdGggPSBGSUxFU1BFQ19FbmNvZGVGaWxlTmFtZShwZGZfcGF0aCk7Ci0gICAgICAgICAgICBwTWFpbkRpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJGIiksIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c0ZpbGVQYXRoKSk7Ci0gICAgICAgICAgICBwTWFpbkRpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJVRiIpLCBQREZfRW5jb2RlVGV4dCh3c0ZpbGVQYXRoKSk7CisgIH0KKyAgQ1BERl9BcnJheSogcEZpZWxkcyA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOworICBpZiAocEZpZWxkcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcE1haW5EaWN0LT5TZXRBdCgiRmllbGRzIiwgcEZpZWxkcyk7CisgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOworICAgIGlmIChwRmllbGQgPT0gTlVMTCB8fCBwRmllbGQtPkdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UHVzaEJ1dHRvbikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwRmllbGQtPkdldEZpZWxkRmxhZ3MoKTsKKyAgICBpZiAoZHdGbGFncyAmIDB4MDQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBGWF9CT09MIGJGaW5kID0gZmllbGRzLkZpbmQocEZpZWxkLCAwKSA+PSAwOworICAgIGlmICgoYkluY2x1ZGVPckV4Y2x1ZGUgJiYgYkZpbmQpIHx8ICghYkluY2x1ZGVPckV4Y2x1ZGUgJiYgIWJGaW5kKSkgeworICAgICAgaWYgKChkd0ZsYWdzICYgMHgwMikgIT0gMCAmJiBwRmllbGQtPm1fcERpY3QtPkdldFN0cmluZygiViIpLklzRW1wdHkoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIENGWF9XaWRlU3RyaW5nIGZ1bGxuYW1lID0gR2V0RnVsbE5hbWUocEZpZWxkLT5HZXRGaWVsZERpY3QoKSk7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOworICAgICAgaWYgKHBGaWVsZERpY3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIENQREZfU3RyaW5nKiBwU3RyaW5nID0gQ1BERl9TdHJpbmc6OkNyZWF0ZShmdWxsbmFtZSk7CisgICAgICBpZiAocFN0cmluZyA9PSBOVUxMKSB7CisgICAgICAgIHBGaWVsZERpY3QtPlJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBwRmllbGREaWN0LT5TZXRBdCgiVCIsIHBTdHJpbmcpOworICAgICAgaWYgKHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fAorICAgICAgICAgIHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbikgeworICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0V4cG9ydCA9IHBGaWVsZC0+R2V0Q2hlY2tWYWx1ZShGQUxTRSk7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzQkV4cG9ydCA9IFBERl9FbmNvZGVUZXh0KGNzRXhwb3J0KTsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBPcHQgPSBGUERGX0dldEZpZWxkQXR0cihwRmllbGQtPm1fcERpY3QsICJPcHQiKTsKKyAgICAgICAgaWYgKHBPcHQgPT0gTlVMTCkgeworICAgICAgICAgIHBGaWVsZERpY3QtPlNldEF0TmFtZSgiViIsIGNzQkV4cG9ydCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDUERGX0ZpbGVTcGVjIGZpbGVzcGVjOwotICAgICAgICAgICAgZmlsZXNwZWMuU2V0RmlsZU5hbWUocGRmX3BhdGgpOwotICAgICAgICAgICAgcE1haW5EaWN0LT5TZXRBdCgiRiIsIChDUERGX09iamVjdCopZmlsZXNwZWMpOworICAgICAgICAgIHBGaWVsZERpY3QtPlNldEF0U3RyaW5nKCJWIiwgY3NCRXhwb3J0KTsKICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBWID0gRlBERl9HZXRGaWVsZEF0dHIocEZpZWxkLT5tX3BEaWN0LCAiViIpOworICAgICAgICBpZiAocFYgIT0gTlVMTCkgeworICAgICAgICAgIHBGaWVsZERpY3QtPlNldEF0KCJWIiwgcFYtPkNsb25lKFRSVUUpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcEZpZWxkcy0+QWRkKHBGaWVsZERpY3QpOwogICAgIH0KLSAgICBDUERGX0FycmF5KiBwRmllbGRzID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7Ci0gICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcE1haW5EaWN0LT5TZXRBdCgiRmllbGRzIiwgcEZpZWxkcyk7Ci0gICAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOwotICAgICAgICBpZiAocEZpZWxkID09IE5VTEwgfHwgcEZpZWxkLT5HZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlB1c2hCdXR0b24pIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwRmllbGQtPkdldEZpZWxkRmxhZ3MoKTsKLSAgICAgICAgaWYgKGR3RmxhZ3MgJiAweDA0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJGaW5kID0gZmllbGRzLkZpbmQocEZpZWxkLCAwKSA+PSAwOwotICAgICAgICBpZiAoKGJJbmNsdWRlT3JFeGNsdWRlICYmIGJGaW5kKSB8fCAoIWJJbmNsdWRlT3JFeGNsdWRlICYmICFiRmluZCkpIHsKLSAgICAgICAgICAgIGlmICgoZHdGbGFncyAmIDB4MDIpICE9IDAgJiYgcEZpZWxkLT5tX3BEaWN0LT5HZXRTdHJpbmcoIlYiKS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGZ1bGxuYW1lID0gR2V0RnVsbE5hbWUocEZpZWxkLT5HZXRGaWVsZERpY3QoKSk7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgICAgICAgICAgaWYgKHBGaWVsZERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9TdHJpbmcqIHBTdHJpbmcgPSBDUERGX1N0cmluZzo6Q3JlYXRlKGZ1bGxuYW1lKTsKLSAgICAgICAgICAgIGlmIChwU3RyaW5nID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwRmllbGREaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRmllbGREaWN0LT5TZXRBdCgiVCIsIHBTdHJpbmcpOwotICAgICAgICAgICAgaWYgKHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBwRmllbGQtPkdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pIHsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0V4cG9ydCA9IHBGaWVsZC0+R2V0Q2hlY2tWYWx1ZShGQUxTRSk7Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCRXhwb3J0ID0gUERGX0VuY29kZVRleHQoY3NFeHBvcnQpOwotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT3B0ID0gRlBERl9HZXRGaWVsZEF0dHIocEZpZWxkLT5tX3BEaWN0LCAiT3B0Iik7Ci0gICAgICAgICAgICAgICAgaWYgKHBPcHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBwRmllbGREaWN0LT5TZXRBdE5hbWUoIlYiLCBjc0JFeHBvcnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBGaWVsZERpY3QtPlNldEF0U3RyaW5nKCJWIiwgY3NCRXhwb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwViA9IEZQREZfR2V0RmllbGRBdHRyKHBGaWVsZC0+bV9wRGljdCwgIlYiKTsKLSAgICAgICAgICAgICAgICBpZiAocFYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBwRmllbGREaWN0LT5TZXRBdCgiViIsIHBWLT5DbG9uZShUUlVFKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEZpZWxkcy0+QWRkKHBGaWVsZERpY3QpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwRG9jOworICB9CisgIHJldHVybiBwRG9jOwogfQogY29uc3Qgc3RydWN0IF9TdXBwb3J0RmllbGRFbmNvZGluZyB7Ci0gICAgY29uc3QgRlhfQ0hBUiogbV9uYW1lOwotICAgIGludDMyX3QgbV9jb2RlUGFnZTsKKyAgY29uc3QgRlhfQ0hBUiogbV9uYW1lOworICBpbnQzMl90IG1fY29kZVBhZ2U7CiB9IGdfZmllbGRFbmNvZGluZ1tdID0gewotICAgIHsgIkJpZ0ZpdmUiLCA5NTAgfSwKLSAgICB7ICJHQksiLCA5MzYgfSwKLSAgICB7ICJTaGlmdC1KSVMiLCA5MzIgfSwKLSAgICB7ICJVSEMiLCA5NDkgfSwKKyAgICB7IkJpZ0ZpdmUiLCA5NTB9LAorICAgIHsiR0JLIiwgOTM2fSwKKyAgICB7IlNoaWZ0LUpJUyIsIDkzMn0sCisgICAgeyJVSEMiLCA5NDl9LAogfTsKLXN0YXRpYyB2b2lkIEZQREZET0NfRkRGX0dldEZpZWxkVmFsdWUoQ1BERl9EaWN0aW9uYXJ5ICpwRmllbGREaWN0LCBDRlhfV2lkZVN0cmluZyAmY3NWYWx1ZSwgQ0ZYX0J5dGVTdHJpbmcgJmJzRW5jb2RpbmcpCi17Ci0gICAgQVNTRVJUKHBGaWVsZERpY3QgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NCVmFsdWUgPSBwRmllbGREaWN0LT5HZXRTdHJpbmcoIlYiKTsKLSAgICBpbnQzMl90IGlDb3VudCA9IHNpemVvZihnX2ZpZWxkRW5jb2RpbmcpIC8gc2l6ZW9mKGdfZmllbGRFbmNvZGluZ1swXSk7Ci0gICAgaW50MzJfdCBpID0gMDsKLSAgICBmb3IgKDsgaSA8IGlDb3VudDsgKytpKQotICAgICAgICBpZiAoYnNFbmNvZGluZyA9PSBnX2ZpZWxkRW5jb2RpbmdbaV0ubV9uYW1lKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGlmIChpIDwgaUNvdW50KSB7Ci0gICAgICAgIENGWF9DaGFyTWFwICpwQ2hhck1hcCA9IENGWF9DaGFyTWFwOjpHZXREZWZhdWx0TWFwcGVyKGdfZmllbGRFbmNvZGluZ1tpXS5tX2NvZGVQYWdlKTsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBDaGFyTWFwICE9IE5VTEwpOwotICAgICAgICBjc1ZhbHVlLkNvbnZlcnRGcm9tKGNzQlZhbHVlLCBwQ2hhck1hcCk7Ci0gICAgICAgIHJldHVybjsKK3N0YXRpYyB2b2lkIEZQREZET0NfRkRGX0dldEZpZWxkVmFsdWUoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGJzRW5jb2RpbmcpIHsKKyAgQVNTRVJUKHBGaWVsZERpY3QgIT0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIGNzQlZhbHVlID0gcEZpZWxkRGljdC0+R2V0U3RyaW5nKCJWIik7CisgIGludDMyX3QgaUNvdW50ID0gc2l6ZW9mKGdfZmllbGRFbmNvZGluZykgLyBzaXplb2YoZ19maWVsZEVuY29kaW5nWzBdKTsKKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yICg7IGkgPCBpQ291bnQ7ICsraSkKKyAgICBpZiAoYnNFbmNvZGluZyA9PSBnX2ZpZWxkRW5jb2RpbmdbaV0ubV9uYW1lKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NUZW1wID0gY3NCVmFsdWUuTGVmdCgyKTsKLSAgICBpZiAoY3NUZW1wID09ICJceEZGXHhGRSIgfHwgY3NUZW1wID09ICJceEZFXHhGRiIpIHsKLSAgICAgICAgY3NWYWx1ZSA9IFBERl9EZWNvZGVUZXh0KGNzQlZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjc1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChjc0JWYWx1ZSk7Ci0gICAgfQorICBpZiAoaSA8IGlDb3VudCkgeworICAgIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9CisgICAgICAgIENGWF9DaGFyTWFwOjpHZXREZWZhdWx0TWFwcGVyKGdfZmllbGRFbmNvZGluZ1tpXS5tX2NvZGVQYWdlKTsKKyAgICBGWFNZU19hc3NlcnQocENoYXJNYXAgIT0gTlVMTCk7CisgICAgY3NWYWx1ZS5Db252ZXJ0RnJvbShjc0JWYWx1ZSwgcENoYXJNYXApOworICAgIHJldHVybjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc1RlbXAgPSBjc0JWYWx1ZS5MZWZ0KDIpOworICBpZiAoY3NUZW1wID09ICJceEZGXHhGRSIgfHwgY3NUZW1wID09ICJceEZFXHhGRiIpIHsKKyAgICBjc1ZhbHVlID0gUERGX0RlY29kZVRleHQoY3NCVmFsdWUpOworICB9IGVsc2UgeworICAgIGNzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGNzQlZhbHVlKTsKKyAgfQogfQotdm9pZCBDUERGX0ludGVyRm9ybTo6RkRGX0ltcG9ydEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHBhcmVudF9uYW1lLCBGWF9CT09MIGJOb3RpZnksIGludCBuTGV2ZWwpCi17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgbmFtZTsKLSAgICBpZiAoIXBhcmVudF9uYW1lLklzRW1wdHkoKSkgewotICAgICAgICBuYW1lID0gcGFyZW50X25hbWUgKyBMIi4iOwordm9pZCBDUERGX0ludGVyRm9ybTo6RkRGX0ltcG9ydEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgcGFyZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGV2ZWwpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgbmFtZTsKKyAgaWYgKCFwYXJlbnRfbmFtZS5Jc0VtcHR5KCkpIHsKKyAgICBuYW1lID0gcGFyZW50X25hbWUgKyBMIi4iOworICB9CisgIG5hbWUgKz0gcEZpZWxkRGljdC0+R2V0VW5pY29kZVRleHQoIlQiKTsKKyAgQ1BERl9BcnJheSogcEtpZHMgPSBwRmllbGREaWN0LT5HZXRBcnJheSgiS2lkcyIpOworICBpZiAocEtpZHMpIHsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZHMtPkdldENvdW50KCk7IGkrKykgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZHMtPkdldERpY3QoaSk7CisgICAgICBpZiAocEtpZCA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKG5MZXZlbCA8PSBuTWF4UmVjdXJzaW9uKSB7CisgICAgICAgIEZERl9JbXBvcnRGaWVsZChwS2lkLCBuYW1lLCBiTm90aWZ5LCBuTGV2ZWwgKyAxKTsKKyAgICAgIH0KICAgICB9Ci0gICAgbmFtZSArPSBwRmllbGREaWN0LT5HZXRVbmljb2RlVGV4dCgiVCIpOwotICAgIENQREZfQXJyYXkqIHBLaWRzID0gcEZpZWxkRGljdC0+R2V0QXJyYXkoIktpZHMiKTsKLSAgICBpZiAocEtpZHMpIHsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkcy0+R2V0RGljdChpKTsKLSAgICAgICAgICAgIGlmIChwS2lkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuTGV2ZWwgPD0gbk1heFJlY3Vyc2lvbikgewotICAgICAgICAgICAgICAgIEZERl9JbXBvcnRGaWVsZChwS2lkLCBuYW1lLCBiTm90aWZ5LCBuTGV2ZWwgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm47CisgICAgcmV0dXJuOworICB9CisgIGlmICghcEZpZWxkRGljdC0+S2V5RXhpc3QoIlYiKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5HZXRGaWVsZChuYW1lKTsKKyAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9XaWRlU3RyaW5nIGNzV1ZhbHVlOworICBGUERGRE9DX0ZERl9HZXRGaWVsZFZhbHVlKHBGaWVsZERpY3QsIGNzV1ZhbHVlLCBtX2JzRW5jb2RpbmcpOworICBpbnQgaVR5cGUgPSBwRmllbGQtPkdldEZpZWxkVHlwZSgpOworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKKyAgICBpbnQgaVJldCA9IDA7CisgICAgaWYgKGlUeXBlID09IEZJRUxEVFlQRV9MSVNUQk9YKSB7CisgICAgICBpUmV0ID0gbV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHBGaWVsZCwgY3NXVmFsdWUpOworICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IGlUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpIHsKKyAgICAgIGlSZXQgPSBtX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZShwRmllbGQsIGNzV1ZhbHVlKTsKICAgICB9Ci0gICAgaWYgKCFwRmllbGREaWN0LT5LZXlFeGlzdCgiViIpKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoaVJldCA8IDApIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+R2V0RmllbGQobmFtZSk7Ci0gICAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NXVmFsdWU7Ci0gICAgRlBERkRPQ19GREZfR2V0RmllbGRWYWx1ZShwRmllbGREaWN0LCBjc1dWYWx1ZSwgbV9ic0VuY29kaW5nKTsKLSAgICBpbnQgaVR5cGUgPSBwRmllbGQtPkdldEZpZWxkVHlwZSgpOwotICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICBpbnQgaVJldCA9IDA7Ci0gICAgICAgIGlmIChpVHlwZSA9PSBGSUVMRFRZUEVfTElTVEJPWCkgewotICAgICAgICAgICAgaVJldCA9IG1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZShwRmllbGQsIGNzV1ZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChpVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgaVR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkgewotICAgICAgICAgICAgaVJldCA9IG1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHBGaWVsZCwgY3NXVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9CeXRlQXJyYXkgc3RhdHVzQXJyYXk7CisgIH0KKyAgQ0ZYX0J5dGVBcnJheSBzdGF0dXNBcnJheTsKKyAgaWYgKGlUeXBlID09IEZJRUxEVFlQRV9DSEVDS0JPWCB8fCBpVHlwZSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pIHsKKyAgICBTYXZlQ2hlY2tlZEZpZWxkU3RhdHVzKHBGaWVsZCwgc3RhdHVzQXJyYXkpOworICB9CisgIHBGaWVsZC0+U2V0VmFsdWUoY3NXVmFsdWUpOworICBDUERGX0Zvcm1GaWVsZDo6VHlwZSBlVHlwZSA9IHBGaWVsZC0+R2V0VHlwZSgpOworICBpZiAoKGVUeXBlID09IENQREZfRm9ybUZpZWxkOjpMaXN0Qm94IHx8IGVUeXBlID09IENQREZfRm9ybUZpZWxkOjpDb21ib0JveCkgJiYKKyAgICAgIHBGaWVsZERpY3QtPktleUV4aXN0KCJPcHQiKSkgeworICAgIHBGaWVsZC0+bV9wRGljdC0+U2V0QXQoIk9wdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmllbGREaWN0LT5HZXRFbGVtZW50VmFsdWUoIk9wdCIpLT5DbG9uZShUUlVFKSk7CisgIH0KKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgaWYgKGlUeXBlID09IEZJRUxEVFlQRV9DSEVDS0JPWCB8fCBpVHlwZSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pIHsKLSAgICAgICAgU2F2ZUNoZWNrZWRGaWVsZFN0YXR1cyhwRmllbGQsIHN0YXR1c0FycmF5KTsKKyAgICAgIG1fcEZvcm1Ob3RpZnktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZShwRmllbGQsIHN0YXR1c0FycmF5KTsKKyAgICB9IGVsc2UgaWYgKGlUeXBlID09IEZJRUxEVFlQRV9MSVNUQk9YKSB7CisgICAgICBtX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZShwRmllbGQpOworICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IGlUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpIHsKKyAgICAgIG1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UocEZpZWxkKTsKICAgICB9Ci0gICAgcEZpZWxkLT5TZXRWYWx1ZShjc1dWYWx1ZSk7Ci0gICAgQ1BERl9Gb3JtRmllbGQ6OlR5cGUgZVR5cGUgPSBwRmllbGQtPkdldFR5cGUoKTsKLSAgICBpZiAoKGVUeXBlID09IENQREZfRm9ybUZpZWxkOjpMaXN0Qm94IHx8IGVUeXBlID09IENQREZfRm9ybUZpZWxkOjpDb21ib0JveCkgJiYgcEZpZWxkRGljdC0+S2V5RXhpc3QoIk9wdCIpKSB7Ci0gICAgICAgIHBGaWVsZC0+bV9wRGljdC0+U2V0QXQoIk9wdCIsIHBGaWVsZERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiT3B0IiktPkNsb25lKFRSVUUpKTsKLSAgICB9Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChpVHlwZSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1ggfHwgaVR5cGUgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSB7Ci0gICAgICAgICAgICBtX3BGb3JtTm90aWZ5LT5BZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UocEZpZWxkLCBzdGF0dXNBcnJheSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0xJU1RCT1gpIHsKLSAgICAgICAgICAgIG1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHBGaWVsZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IGlUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpIHsKLSAgICAgICAgICAgIG1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UocEZpZWxkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoQ1BERl9JbnRlckZvcm06Om1fYlVwZGF0ZUFQKSB7Ci0gICAgICAgIHBGaWVsZC0+VXBkYXRlQVAoTlVMTCk7Ci0gICAgfQorICB9CisgIGlmIChDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVApIHsKKyAgICBwRmllbGQtPlVwZGF0ZUFQKE5VTEwpOworICB9CiB9Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpJbXBvcnRGcm9tRkRGKGNvbnN0IENGREZfRG9jdW1lbnQqIHBGREYsIEZYX0JPT0wgYk5vdGlmeSkKLXsKLSAgICBpZiAocEZERiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9JbnRlckZvcm06OkltcG9ydEZyb21GREYoY29uc3QgQ0ZERl9Eb2N1bWVudCogcEZERiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5KSB7CisgIGlmIChwRkRGID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFpbkRpY3QgPSBwRkRGLT5HZXRSb290KCktPkdldERpY3QoIkZERiIpOworICBpZiAocE1haW5EaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9BcnJheSogcEZpZWxkcyA9IHBNYWluRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOworICBpZiAocEZpZWxkcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fYnNFbmNvZGluZyA9IHBNYWluRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJFbmNvZGluZyIpKTsKKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgaW50IGlSZXQgPSBtX3BGb3JtTm90aWZ5LT5CZWZvcmVGb3JtSW1wb3J0RGF0YSh0aGlzKTsKKyAgICBpZiAoaVJldCA8IDApIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFpbkRpY3QgPSBwRkRGLT5HZXRSb290KCktPkdldERpY3QoIkZERiIpOwotICAgIGlmIChwTWFpbkRpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBGaWVsZHMtPkdldENvdW50KCk7IGkrKykgeworICAgIENQREZfRGljdGlvbmFyeSogcEZpZWxkID0gcEZpZWxkcy0+R2V0RGljdChpKTsKKyAgICBpZiAocEZpZWxkID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBDUERGX0FycmF5KiBwRmllbGRzID0gcE1haW5EaWN0LT5HZXRBcnJheSgiRmllbGRzIik7Ci0gICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fYnNFbmNvZGluZyA9IHBNYWluRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJFbmNvZGluZyIpKTsKLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtTm90aWZ5LT5CZWZvcmVGb3JtSW1wb3J0RGF0YSh0aGlzKTsKLSAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBGaWVsZHMtPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGQgPSBwRmllbGRzLT5HZXREaWN0KGkpOwotICAgICAgICBpZiAocEZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZERl9JbXBvcnRGaWVsZChwRmllbGQsIEwiIiwgYk5vdGlmeSk7Ci0gICAgfQotICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICBtX3BGb3JtTm90aWZ5LT5BZnRlckZvcm1JbXBvcnREYXRhKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICBGREZfSW1wb3J0RmllbGQocEZpZWxkLCBMIiIsIGJOb3RpZnkpOworICB9CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgeworICAgIG1fcEZvcm1Ob3RpZnktPkFmdGVyRm9ybUltcG9ydERhdGEodGhpcyk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENQREZfSW50ZXJGb3JtOjpTZXRGb3JtTm90aWZ5KGNvbnN0IENQREZfRm9ybU5vdGlmeSogcE5vdGlmeSkKLXsKLSAgICBtX3BGb3JtTm90aWZ5ID0gKENQREZfRm9ybU5vdGlmeSopcE5vdGlmeTsKK3ZvaWQgQ1BERl9JbnRlckZvcm06OlNldEZvcm1Ob3RpZnkoY29uc3QgQ1BERl9Gb3JtTm90aWZ5KiBwTm90aWZ5KSB7CisgIG1fcEZvcm1Ob3RpZnkgPSAoQ1BERl9Gb3JtTm90aWZ5KilwTm90aWZ5OwogfQotaW50IENQREZfSW50ZXJGb3JtOjpHZXRQYWdlV2l0aFdpZGdldChpbnQgaUN1clBhZ2UsIEZYX0JPT0wgYk5leHQpCi17Ci0gICAgaWYgKGlDdXJQYWdlIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBpUGFnZUNvdW50ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOwotICAgIGlmIChpQ3VyUGFnZSA+PSBpUGFnZUNvdW50KSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IGlOZXdQYWdlID0gaUN1clBhZ2U7Ci0gICAgZG8gewotICAgICAgICBpTmV3UGFnZSArPSBiTmV4dCA/IDEgOiAtMTsKLSAgICAgICAgaWYgKGlOZXdQYWdlID49IGlQYWdlQ291bnQpIHsKLSAgICAgICAgICAgIGlOZXdQYWdlID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaU5ld1BhZ2UgPCAwKSB7Ci0gICAgICAgICAgICBpTmV3UGFnZSA9IGlQYWdlQ291bnQgLSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpTmV3UGFnZSA9PSBpQ3VyUGFnZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBtX3BEb2N1bWVudC0+R2V0UGFnZShpTmV3UGFnZSk7Ci0gICAgICAgIGlmIChwUGFnZURpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlRGljdC0+R2V0QXJyYXkoIkFubm90cyIpOwotICAgICAgICBpZiAocEFubm90cyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBkd0NvdW50ID0gcEFubm90cy0+R2V0Q291bnQoKTsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQW5ub3REaWN0ID0gcEFubm90cy0+R2V0RWxlbWVudFZhbHVlKGkpOwotICAgICAgICAgICAgaWYgKHBBbm5vdERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBOVUxMOwotICAgICAgICAgICAgaWYgKG1fQ29udHJvbE1hcC5Mb29rdXAocEFubm90RGljdCwgKHZvaWQqJilwQ29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaU5ld1BhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChUUlVFKTsKK2ludCBDUERGX0ludGVyRm9ybTo6R2V0UGFnZVdpdGhXaWRnZXQoaW50IGlDdXJQYWdlLCBGWF9CT09MIGJOZXh0KSB7CisgIGlmIChpQ3VyUGFnZSA8IDApIHsKICAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IGlQYWdlQ291bnQgPSBtX3BEb2N1bWVudC0+R2V0UGFnZUNvdW50KCk7CisgIGlmIChpQ3VyUGFnZSA+PSBpUGFnZUNvdW50KSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBpTmV3UGFnZSA9IGlDdXJQYWdlOworICBkbyB7CisgICAgaU5ld1BhZ2UgKz0gYk5leHQgPyAxIDogLTE7CisgICAgaWYgKGlOZXdQYWdlID49IGlQYWdlQ291bnQpIHsKKyAgICAgIGlOZXdQYWdlID0gMDsKKyAgICB9CisgICAgaWYgKGlOZXdQYWdlIDwgMCkgeworICAgICAgaU5ld1BhZ2UgPSBpUGFnZUNvdW50IC0gMTsKKyAgICB9CisgICAgaWYgKGlOZXdQYWdlID09IGlDdXJQYWdlKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBtX3BEb2N1bWVudC0+R2V0UGFnZShpTmV3UGFnZSk7CisgICAgaWYgKHBQYWdlRGljdCA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlRGljdC0+R2V0QXJyYXkoIkFubm90cyIpOworICAgIGlmIChwQW5ub3RzID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBGWF9EV09SRCBkd0NvdW50ID0gcEFubm90cy0+R2V0Q291bnQoKTsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgZHdDb3VudDsgaSsrKSB7CisgICAgICBDUERGX09iamVjdCogcEFubm90RGljdCA9IHBBbm5vdHMtPkdldEVsZW1lbnRWYWx1ZShpKTsKKyAgICAgIGlmIChwQW5ub3REaWN0ID09IE5VTEwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IE5VTEw7CisgICAgICBpZiAobV9Db250cm9sTWFwLkxvb2t1cChwQW5ub3REaWN0LCAodm9pZComKXBDb250cm9sKSkgeworICAgICAgICByZXR1cm4gaU5ld1BhZ2U7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChUUlVFKTsKKyAgcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWNvbnRyb2wuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWNvbnRyb2wuY3BwCmluZGV4IDg3ZWVlOTIuLmRiN2NmMzcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1jb250cm9sLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtY29udHJvbC5jcHAKQEAgLTUsNDYwICs1LDQ0NCBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotQ1BERl9Gb3JtQ29udHJvbDo6Q1BERl9Gb3JtQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KQotewotICAgIG1fcEZpZWxkID0gcEZpZWxkOwotICAgIG1fcFdpZGdldERpY3QgPSBwV2lkZ2V0RGljdDsKLSAgICBtX3BGb3JtID0gbV9wRmllbGQtPm1fcEZvcm07CitDUERGX0Zvcm1Db250cm9sOjpDUERGX0Zvcm1Db250cm9sKENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFdpZGdldERpY3QpIHsKKyAgbV9wRmllbGQgPSBwRmllbGQ7CisgIG1fcFdpZGdldERpY3QgPSBwV2lkZ2V0RGljdDsKKyAgbV9wRm9ybSA9IG1fcEZpZWxkLT5tX3BGb3JtOwogfQotQ0ZYX0Zsb2F0UmVjdCBDUERGX0Zvcm1Db250cm9sOjpHZXRSZWN0KCkKLXsKLSAgICByZXR1cm4gbV9wV2lkZ2V0RGljdC0+R2V0UmVjdCgiUmVjdCIpOworQ0ZYX0Zsb2F0UmVjdCBDUERGX0Zvcm1Db250cm9sOjpHZXRSZWN0KCkgeworICByZXR1cm4gbV9wV2lkZ2V0RGljdC0+R2V0UmVjdCgiUmVjdCIpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9Gb3JtQ29udHJvbDo6R2V0T25TdGF0ZU5hbWUoKQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pOwotICAgIENGWF9CeXRlU3RyaW5nIGNzT247Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBtX3BXaWRnZXREaWN0LT5HZXREaWN0KCJBUCIpOwotICAgIGlmIChwQVAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY3NPbjsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwTiA9IHBBUC0+R2V0RGljdCgiTiIpOwotICAgIGlmIChwTiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBjc09uOwotICAgIH0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwTi0+R2V0U3RhcnRQb3MoKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIHBOLT5HZXROZXh0RWxlbWVudChwb3MsIGNzT24pOwotICAgICAgICBpZiAoY3NPbiAhPSAiT2ZmIikgewotICAgICAgICAgICAgcmV0dXJuIGNzT247Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci19Ci12b2lkIENQREZfRm9ybUNvbnRyb2w6OlNldE9uU3RhdGVOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc09uKQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pOwotICAgIENGWF9CeXRlU3RyaW5nIGNzVmFsdWUgPSBjc09uOwotICAgIGlmIChjc1ZhbHVlLklzRW1wdHkoKSkgewotICAgICAgICBjc1ZhbHVlID0gIlllcyI7Ci0gICAgfQotICAgIGlmIChjc1ZhbHVlID09ICJPZmYiKSB7Ci0gICAgICAgIGNzVmFsdWUgPSAiWWVzIjsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NBUyA9IG1fcFdpZGdldERpY3QtPkdldFN0cmluZygiQVMiLCAiT2ZmIik7Ci0gICAgaWYgKGNzQVMgIT0gIk9mZiIpIHsKLSAgICAgICAgbV9wV2lkZ2V0RGljdC0+U2V0QXROYW1lKCJBUyIsIGNzVmFsdWUpOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBBUCA9IG1fcFdpZGdldERpY3QtPkdldERpY3QoIkFQIik7Ci0gICAgaWYgKHBBUCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfUE9TSVRJT04gcG9zMSA9IHBBUC0+R2V0U3RhcnRQb3MoKTsKLSAgICB3aGlsZSAocG9zMSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc0tleTE7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqMSA9IHBBUC0+R2V0TmV4dEVsZW1lbnQocG9zMSwgY3NLZXkxKTsKLSAgICAgICAgaWYgKHBPYmoxID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqRGlyZWN0MSA9IHBPYmoxLT5HZXREaXJlY3QoKTsKLSAgICAgICAgaWYgKHBPYmpEaXJlY3QxLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFN1YkRpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqRGlyZWN0MTsKLSAgICAgICAgRlhfUE9TSVRJT04gcG9zMiA9IHBTdWJEaWN0LT5HZXRTdGFydFBvcygpOwotICAgICAgICB3aGlsZSAocG9zMikgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NLZXkyOwotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmoyID0gcFN1YkRpY3QtPkdldE5leHRFbGVtZW50KHBvczIsIGNzS2V5Mik7Ci0gICAgICAgICAgICBpZiAocE9iajIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNzS2V5MiAhPSAiT2ZmIikgewotICAgICAgICAgICAgICAgIHBTdWJEaWN0LT5SZXBsYWNlS2V5KGNzS2V5MiwgY3NWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0Zvcm1Db250cm9sOjpHZXRDaGVja2VkQVBTdGF0ZSgpCi17Ci0gICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7Ci0gICAgaWYgKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24gfHwgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCkgewotICAgICAgICBDUERGX09iamVjdCogcE9wdCA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiT3B0Iik7Ci0gICAgICAgIGlmIChwT3B0ICE9IE5VTEwgJiYgcE9wdC0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgaW50IGlJbmRleCA9IG1fcEZpZWxkLT5HZXRDb250cm9sSW5kZXgodGhpcyk7Ci0gICAgICAgICAgICBjc09uLkZvcm1hdCgiJWQiLCBpSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChjc09uLklzRW1wdHkoKSkgewotICAgICAgICBjc09uID0gIlllcyI7Ci0gICAgfQorQ0ZYX0J5dGVTdHJpbmcgQ1BERl9Gb3JtQ29udHJvbDo6R2V0T25TdGF0ZU5hbWUoKSB7CisgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CisgICAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NPbjsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBtX3BXaWRnZXREaWN0LT5HZXREaWN0KCJBUCIpOworICBpZiAocEFQID09IE5VTEwpIHsKICAgICByZXR1cm4gY3NPbjsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBOID0gcEFQLT5HZXREaWN0KCJOIik7CisgIGlmIChwTiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGNzT247CisgIH0KKyAgRlhfUE9TSVRJT04gcG9zID0gcE4tPkdldFN0YXJ0UG9zKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBwTi0+R2V0TmV4dEVsZW1lbnQocG9zLCBjc09uKTsKKyAgICBpZiAoY3NPbiAhPSAiT2ZmIikgeworICAgICAgcmV0dXJuIGNzT247CisgICAgfQorICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwogfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtQ29udHJvbDo6R2V0RXhwb3J0VmFsdWUoKQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pOwotICAgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOwotICAgIGlmIChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uIHx8IEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3gpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPcHQgPSBGUERGX0dldEZpZWxkQXR0cihtX3BGaWVsZC0+bV9wRGljdCwgIk9wdCIpOwotICAgICAgICBpZiAocE9wdCAhPSBOVUxMICYmIHBPcHQtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIGludCBpSW5kZXggPSBtX3BGaWVsZC0+R2V0Q29udHJvbEluZGV4KHRoaXMpOwotICAgICAgICAgICAgY3NPbiA9ICgoQ1BERl9BcnJheSopcE9wdCktPkdldFN0cmluZyhpSW5kZXgpOwotICAgICAgICB9Cit2b2lkIENQREZfRm9ybUNvbnRyb2w6OlNldE9uU3RhdGVOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc09uKSB7CisgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CisgICAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NWYWx1ZSA9IGNzT247CisgIGlmIChjc1ZhbHVlLklzRW1wdHkoKSkgeworICAgIGNzVmFsdWUgPSAiWWVzIjsKKyAgfQorICBpZiAoY3NWYWx1ZSA9PSAiT2ZmIikgeworICAgIGNzVmFsdWUgPSAiWWVzIjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc0FTID0gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJBUyIsICJPZmYiKTsKKyAgaWYgKGNzQVMgIT0gIk9mZiIpIHsKKyAgICBtX3BXaWRnZXREaWN0LT5TZXRBdE5hbWUoIkFTIiwgY3NWYWx1ZSk7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBtX3BXaWRnZXREaWN0LT5HZXREaWN0KCJBUCIpOworICBpZiAocEFQID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfUE9TSVRJT04gcG9zMSA9IHBBUC0+R2V0U3RhcnRQb3MoKTsKKyAgd2hpbGUgKHBvczEpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBjc0tleTE7CisgICAgQ1BERl9PYmplY3QqIHBPYmoxID0gcEFQLT5HZXROZXh0RWxlbWVudChwb3MxLCBjc0tleTEpOworICAgIGlmIChwT2JqMSA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKGNzT24uSXNFbXB0eSgpKSB7Ci0gICAgICAgIGNzT24gPSAiWWVzIjsKKyAgICBDUERGX09iamVjdCogcE9iakRpcmVjdDEgPSBwT2JqMS0+R2V0RGlyZWN0KCk7CisgICAgaWYgKHBPYmpEaXJlY3QxLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBjc1dPbiA9IFBERl9EZWNvZGVUZXh0KGNzT24pOwotICAgIHJldHVybiBjc1dPbjsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBTdWJEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcE9iakRpcmVjdDE7CisgICAgRlhfUE9TSVRJT04gcG9zMiA9IHBTdWJEaWN0LT5HZXRTdGFydFBvcygpOworICAgIHdoaWxlIChwb3MyKSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBjc0tleTI7CisgICAgICBDUERGX09iamVjdCogcE9iajIgPSBwU3ViRGljdC0+R2V0TmV4dEVsZW1lbnQocG9zMiwgY3NLZXkyKTsKKyAgICAgIGlmIChwT2JqMiA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGNzS2V5MiAhPSAiT2ZmIikgeworICAgICAgICBwU3ViRGljdC0+UmVwbGFjZUtleShjc0tleTIsIGNzVmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9Gb3JtQ29udHJvbDo6SXNDaGVja2VkKCkKLXsKLSAgICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc09uID0gR2V0T25TdGF0ZU5hbWUoKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0FTID0gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJBUyIpOwotICAgIHJldHVybiBjc0FTID09IGNzT247CitDRlhfQnl0ZVN0cmluZyBDUERGX0Zvcm1Db250cm9sOjpHZXRDaGVja2VkQVBTdGF0ZSgpIHsKKyAgQVNTRVJUKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwKKyAgICAgICAgIEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pOworICBDRlhfQnl0ZVN0cmluZyBjc09uID0gR2V0T25TdGF0ZU5hbWUoKTsKKyAgaWYgKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24gfHwKKyAgICAgIEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3gpIHsKKyAgICBDUERGX09iamVjdCogcE9wdCA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiT3B0Iik7CisgICAgaWYgKHBPcHQgIT0gTlVMTCAmJiBwT3B0LT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgICBpbnQgaUluZGV4ID0gbV9wRmllbGQtPkdldENvbnRyb2xJbmRleCh0aGlzKTsKKyAgICAgIGNzT24uRm9ybWF0KCIlZCIsIGlJbmRleCk7CisgICAgfQorICB9CisgIGlmIChjc09uLklzRW1wdHkoKSkgeworICAgIGNzT24gPSAiWWVzIjsKKyAgfQorICByZXR1cm4gY3NPbjsKIH0KLUZYX0JPT0wgQ1BERl9Gb3JtQ29udHJvbDo6SXNEZWZhdWx0Q2hlY2tlZCgpCi17Ci0gICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7Ci0gICAgQ1BERl9PYmplY3QqIHBEViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiRFYiKTsKLSAgICBpZiAocERWID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtQ29udHJvbDo6R2V0RXhwb3J0VmFsdWUoKSB7CisgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CisgICAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7CisgIGlmIChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uIHx8CisgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94KSB7CisgICAgQ1BERl9PYmplY3QqIHBPcHQgPSBGUERGX0dldEZpZWxkQXR0cihtX3BGaWVsZC0+bV9wRGljdCwgIk9wdCIpOworICAgIGlmIChwT3B0ICE9IE5VTEwgJiYgcE9wdC0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgICAgaW50IGlJbmRleCA9IG1fcEZpZWxkLT5HZXRDb250cm9sSW5kZXgodGhpcyk7CisgICAgICBjc09uID0gKChDUERGX0FycmF5KilwT3B0KS0+R2V0U3RyaW5nKGlJbmRleCk7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzRFYgPSBwRFYtPkdldFN0cmluZygpOwotICAgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOwotICAgIHJldHVybiAoY3NEViA9PSBjc09uKTsKKyAgfQorICBpZiAoY3NPbi5Jc0VtcHR5KCkpIHsKKyAgICBjc09uID0gIlllcyI7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgY3NXT24gPSBQREZfRGVjb2RlVGV4dChjc09uKTsKKyAgcmV0dXJuIGNzV09uOwogfQotdm9pZCBDUERGX0Zvcm1Db250cm9sOjpDaGVja0NvbnRyb2woRlhfQk9PTCBiQ2hlY2tlZCkKLXsKLSAgICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc09uID0gR2V0T25TdGF0ZU5hbWUoKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc09sZEFTID0gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJBUyIsICJPZmYiKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0FTID0gIk9mZiI7Ci0gICAgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgIGNzQVMgPSBjc09uOwotICAgIH0KLSAgICBpZiAoY3NPbGRBUyA9PSBjc0FTKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wV2lkZ2V0RGljdC0+U2V0QXROYW1lKCJBUyIsIGNzQVMpOwotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOworRlhfQk9PTCBDUERGX0Zvcm1Db250cm9sOjpJc0NoZWNrZWQoKSB7CisgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CisgICAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7CisgIENGWF9CeXRlU3RyaW5nIGNzQVMgPSBtX3BXaWRnZXREaWN0LT5HZXRTdHJpbmcoIkFTIik7CisgIHJldHVybiBjc0FTID09IGNzT247CiB9Ci1DUERGX1N0cmVhbSogRlBERkRPQ19HZXRBbm5vdEFQKENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7Ci12b2lkIENQREZfRm9ybUNvbnRyb2w6OkRyYXdDb250cm9sKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENQREZfUGFnZSogcFBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCi17Ci0gICAgaWYgKG1fcFdpZGdldERpY3QtPkdldEludGVnZXIoIkYiKSAmIEFOTk9URkxBR19ISURERU4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IEZQREZET0NfR2V0QW5ub3RBUChtX3BXaWRnZXREaWN0LCBtb2RlKTsKLSAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBmb3JtX2Jib3ggPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldFJlY3QoIkJCb3giKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IGZvcm1fbWF0cml4ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRNYXRyaXgoIk1hdHJpeCIpOwotICAgIGZvcm1fbWF0cml4LlRyYW5zZm9ybVJlY3QoZm9ybV9iYm94KTsKLSAgICBDRlhfRmxvYXRSZWN0IGFyZWN0ID0gbV9wV2lkZ2V0RGljdC0+R2V0UmVjdCgiUmVjdCIpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIG1hdHJpeC5NYXRjaFJlY3QoYXJlY3QsIGZvcm1fYmJveCk7Ci0gICAgbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7Ci0gICAgQ1BERl9Gb3JtIGZvcm0obV9wRmllbGQtPm1fcEZvcm0tPm1fcERvY3VtZW50LCBtX3BGaWVsZC0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIiksIHBTdHJlYW0pOwotICAgIGZvcm0uUGFyc2VDb250ZW50KE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIENQREZfUmVuZGVyQ29udGV4dCBjb250ZXh0OwotICAgIGNvbnRleHQuQ3JlYXRlKHBQYWdlKTsKLSAgICBjb250ZXh0LkRyYXdPYmplY3RMaXN0KHBEZXZpY2UsICZmb3JtLCAmbWF0cml4LCBwT3B0aW9ucyk7CitGWF9CT09MIENQREZfRm9ybUNvbnRyb2w6OklzRGVmYXVsdENoZWNrZWQoKSB7CisgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CisgICAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKKyAgQ1BERl9PYmplY3QqIHBEViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiRFYiKTsKKyAgaWYgKHBEViA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzRFYgPSBwRFYtPkdldFN0cmluZygpOworICBDRlhfQnl0ZVN0cmluZyBjc09uID0gR2V0T25TdGF0ZU5hbWUoKTsKKyAgcmV0dXJuIChjc0RWID09IGNzT24pOworfQordm9pZCBDUERGX0Zvcm1Db250cm9sOjpDaGVja0NvbnRyb2woRlhfQk9PTCBiQ2hlY2tlZCkgeworICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fAorICAgICAgICAgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7CisgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOworICBDRlhfQnl0ZVN0cmluZyBjc09sZEFTID0gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJBUyIsICJPZmYiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NBUyA9ICJPZmYiOworICBpZiAoYkNoZWNrZWQpIHsKKyAgICBjc0FTID0gY3NPbjsKKyAgfQorICBpZiAoY3NPbGRBUyA9PSBjc0FTKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcFdpZGdldERpY3QtPlNldEF0TmFtZSgiQVMiLCBjc0FTKTsKKyAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7Cit9CitDUERGX1N0cmVhbSogRlBERkRPQ19HZXRBbm5vdEFQKENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7Cit2b2lkIENQREZfRm9ybUNvbnRyb2w6OkRyYXdDb250cm9sKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHsKKyAgaWYgKG1fcFdpZGdldERpY3QtPkdldEludGVnZXIoIkYiKSAmIEFOTk9URkxBR19ISURERU4pIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBGUERGRE9DX0dldEFubm90QVAobV9wV2lkZ2V0RGljdCwgbW9kZSk7CisgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCBmb3JtX2Jib3ggPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldFJlY3QoIkJCb3giKTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBmb3JtX21hdHJpeCA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0TWF0cml4KCJNYXRyaXgiKTsKKyAgZm9ybV9tYXRyaXguVHJhbnNmb3JtUmVjdChmb3JtX2Jib3gpOworICBDRlhfRmxvYXRSZWN0IGFyZWN0ID0gbV9wV2lkZ2V0RGljdC0+R2V0UmVjdCgiUmVjdCIpOworICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKKyAgbWF0cml4Lk1hdGNoUmVjdChhcmVjdCwgZm9ybV9iYm94KTsKKyAgbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7CisgIENQREZfRm9ybSBmb3JtKG1fcEZpZWxkLT5tX3BGb3JtLT5tX3BEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgbV9wRmllbGQtPm1fcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpLCBwU3RyZWFtKTsKKyAgZm9ybS5QYXJzZUNvbnRlbnQoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIENQREZfUmVuZGVyQ29udGV4dCBjb250ZXh0OworICBjb250ZXh0LkNyZWF0ZShwUGFnZSk7CisgIGNvbnRleHQuRHJhd09iamVjdExpc3QocERldmljZSwgJmZvcm0sICZtYXRyaXgsIHBPcHRpb25zKTsKIH0KIGNvbnN0IEZYX0NIQVIqIGdfc0hpZ2hsaWdodGluZ01vZGVbXSA9IHsiTiIsICJJIiwgIk8iLCAiUCIsICJUIiwgIiJ9OwotQ1BERl9Gb3JtQ29udHJvbDo6SGlnaGxpZ2h0aW5nTW9kZSBDUERGX0Zvcm1Db250cm9sOjpHZXRIaWdobGlnaHRpbmdNb2RlKCkKLXsKLSAgICBpZiAobV9wV2lkZ2V0RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBJbnZlcnQ7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzSCA9IG1fcFdpZGdldERpY3QtPkdldFN0cmluZygiSCIsICJJIik7Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChnX3NIaWdobGlnaHRpbmdNb2RlW2ldWzBdICE9ICdcMCcpIHsKLSAgICAgICAgaWYgKGNzSC5FcXVhbChnX3NIaWdobGlnaHRpbmdNb2RlW2ldKSkgewotICAgICAgICAgICAgcmV0dXJuIChIaWdobGlnaHRpbmdNb2RlKWk7Ci0gICAgICAgIH0KLSAgICAgICAgaSArKzsKLSAgICB9CitDUERGX0Zvcm1Db250cm9sOjpIaWdobGlnaHRpbmdNb2RlIENQREZfRm9ybUNvbnRyb2w6OkdldEhpZ2hsaWdodGluZ01vZGUoKSB7CisgIGlmIChtX3BXaWRnZXREaWN0ID09IE5VTEwpIHsKICAgICByZXR1cm4gSW52ZXJ0OwotfQotQ1BERl9BcFNldHRpbmdzIENQREZfRm9ybUNvbnRyb2w6OkdldE1LKEZYX0JPT0wgYkNyZWF0ZSkKLXsKLSAgICBpZiAoIW1fcFdpZGdldERpY3QpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NIID0gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJIIiwgIkkiKTsKKyAgaW50IGkgPSAwOworICB3aGlsZSAoZ19zSGlnaGxpZ2h0aW5nTW9kZVtpXVswXSAhPSAnXDAnKSB7CisgICAgaWYgKGNzSC5FcXVhbChnX3NIaWdobGlnaHRpbmdNb2RlW2ldKSkgeworICAgICAgcmV0dXJuIChIaWdobGlnaHRpbmdNb2RlKWk7CiAgICAgfQotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IG1fcFdpZGdldERpY3QtPkdldERpY3QoRlhfQlNUUkMoIk1LIikpOwotICAgIGlmICghbWsgJiYgYkNyZWF0ZSkgewotICAgICAgICBtayA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7Ci0gICAgICAgIGlmIChtayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBtX3BXaWRnZXREaWN0LT5TZXRBdChGWF9CU1RSQygiTUsiKSwgbWspOworICAgIGkrKzsKKyAgfQorICByZXR1cm4gSW52ZXJ0OworfQorQ1BERl9BcFNldHRpbmdzIENQREZfRm9ybUNvbnRyb2w6OkdldE1LKEZYX0JPT0wgYkNyZWF0ZSkgeworICBpZiAoIW1fcFdpZGdldERpY3QpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0FwU2V0dGluZ3MgbWsgPSBtX3BXaWRnZXREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJNSyIpKTsKKyAgaWYgKCFtayAmJiBiQ3JlYXRlKSB7CisgICAgbWsgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOworICAgIGlmIChtayA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIG1rOworICAgIG1fcFdpZGdldERpY3QtPlNldEF0KEZYX0JTVFJDKCJNSyIpLCBtayk7CisgIH0KKyAgcmV0dXJuIG1rOwogfQotRlhfQk9PTCBDUERGX0Zvcm1Db250cm9sOjpIYXNNS0VudHJ5KENGWF9CeXRlU3RyaW5nIGNzRW50cnkpCi17Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwotICAgIHJldHVybiBtay5IYXNNS0VudHJ5KGNzRW50cnkpOworRlhfQk9PTCBDUERGX0Zvcm1Db250cm9sOjpIYXNNS0VudHJ5KENGWF9CeXRlU3RyaW5nIGNzRW50cnkpIHsKKyAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOworICByZXR1cm4gbWsuSGFzTUtFbnRyeShjc0VudHJ5KTsKIH0KLWludCBDUERGX0Zvcm1Db250cm9sOjpHZXRSb3RhdGlvbigpCi17Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwotICAgIHJldHVybiBtay5HZXRSb3RhdGlvbigpOworaW50IENQREZfRm9ybUNvbnRyb2w6OkdldFJvdGF0aW9uKCkgeworICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7CisgIHJldHVybiBtay5HZXRSb3RhdGlvbigpOwogfQotRlhfQVJHQiBDUERGX0Zvcm1Db250cm9sOjpHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpCi17Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwotICAgIHJldHVybiBtay5HZXRDb2xvcihpQ29sb3JUeXBlLCBjc0VudHJ5KTsKK0ZYX0FSR0IgQ1BERl9Gb3JtQ29udHJvbDo6R2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLCBDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KSB7CisgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgcmV0dXJuIG1rLkdldENvbG9yKGlDb2xvclR5cGUsIGNzRW50cnkpOwogfQotRlhfRkxPQVQgQ1BERl9Gb3JtQ29udHJvbDo6R2V0T3JpZ2luYWxDb2xvcihpbnQgaW5kZXgsIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpCi17Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwotICAgIHJldHVybiBtay5HZXRPcmlnaW5hbENvbG9yKGluZGV4LCBjc0VudHJ5KTsKK0ZYX0ZMT0FUIENQREZfRm9ybUNvbnRyb2w6OkdldE9yaWdpbmFsQ29sb3IoaW50IGluZGV4LCBDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KSB7CisgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgcmV0dXJuIG1rLkdldE9yaWdpbmFsQ29sb3IoaW5kZXgsIGNzRW50cnkpOwogfQotdm9pZCBDUERGX0Zvcm1Db250cm9sOjpHZXRPcmlnaW5hbENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpCi17Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwotICAgIG1rLkdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsIGNzRW50cnkpOwordm9pZCBDUERGX0Zvcm1Db250cm9sOjpHZXRPcmlnaW5hbENvbG9yKGludCYgaUNvbG9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KSB7CisgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgbWsuR2V0T3JpZ2luYWxDb2xvcihpQ29sb3JUeXBlLCBmYywgY3NFbnRyeSk7CiB9Ci1DRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1Db250cm9sOjpHZXRDYXB0aW9uKENGWF9CeXRlU3RyaW5nIGNzRW50cnkpCi17Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwotICAgIHJldHVybiBtay5HZXRDYXB0aW9uKGNzRW50cnkpOworQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtQ29udHJvbDo6R2V0Q2FwdGlvbihDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KSB7CisgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKKyAgcmV0dXJuIG1rLkdldENhcHRpb24oY3NFbnRyeSk7CiB9Ci1DUERGX1N0cmVhbSogQ1BERl9Gb3JtQ29udHJvbDo6R2V0SWNvbihDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KQotewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKLSAgICByZXR1cm4gbWsuR2V0SWNvbihjc0VudHJ5KTsKK0NQREZfU3RyZWFtKiBDUERGX0Zvcm1Db250cm9sOjpHZXRJY29uKENGWF9CeXRlU3RyaW5nIGNzRW50cnkpIHsKKyAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOworICByZXR1cm4gbWsuR2V0SWNvbihjc0VudHJ5KTsKIH0KLUNQREZfSWNvbkZpdCBDUERGX0Zvcm1Db250cm9sOjpHZXRJY29uRml0KCkKLXsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7Ci0gICAgcmV0dXJuIG1rLkdldEljb25GaXQoKTsKK0NQREZfSWNvbkZpdCBDUERGX0Zvcm1Db250cm9sOjpHZXRJY29uRml0KCkgeworICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7CisgIHJldHVybiBtay5HZXRJY29uRml0KCk7CiB9Ci1pbnQgQ1BERl9Gb3JtQ29udHJvbDo6R2V0VGV4dFBvc2l0aW9uKCkKLXsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7Ci0gICAgcmV0dXJuIG1rLkdldFRleHRQb3NpdGlvbigpOworaW50IENQREZfRm9ybUNvbnRyb2w6OkdldFRleHRQb3NpdGlvbigpIHsKKyAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOworICByZXR1cm4gbWsuR2V0VGV4dFBvc2l0aW9uKCk7CiB9Ci1DUERGX0FjdGlvbiBDUERGX0Zvcm1Db250cm9sOjpHZXRBY3Rpb24oKQotewotICAgIGlmICghbV9wV2lkZ2V0RGljdCkgewotICAgICAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKLSAgICB9Ci0gICAgaWYgKG1fcFdpZGdldERpY3QtPktleUV4aXN0KCJBIikpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQWN0aW9uKG1fcFdpZGdldERpY3QtPkdldERpY3QoIkEiKSk7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRmllbGQtPm1fcERpY3QsICJBIik7Ci0gICAgaWYgKCFwT2JqKSB7Ci0gICAgICAgIHJldHVybiBDUERGX0FjdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4gQ1BERl9BY3Rpb24ocE9iai0+R2V0RGljdCgpKTsKK0NQREZfQWN0aW9uIENQREZfRm9ybUNvbnRyb2w6OkdldEFjdGlvbigpIHsKKyAgaWYgKCFtX3BXaWRnZXREaWN0KSB7CisgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7CisgIH0KKyAgaWYgKG1fcFdpZGdldERpY3QtPktleUV4aXN0KCJBIikpIHsKKyAgICByZXR1cm4gQ1BERl9BY3Rpb24obV9wV2lkZ2V0RGljdC0+R2V0RGljdCgiQSIpKTsKKyAgfQorICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiQSIpOworICBpZiAoIXBPYmopIHsKKyAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKKyAgfQorICByZXR1cm4gQ1BERl9BY3Rpb24ocE9iai0+R2V0RGljdCgpKTsKIH0KLUNQREZfQUFjdGlvbiBDUERGX0Zvcm1Db250cm9sOjpHZXRBZGRpdGlvbmFsQWN0aW9uKCkKLXsKLSAgICBpZiAoIW1fcFdpZGdldERpY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIGlmIChtX3BXaWRnZXREaWN0LT5LZXlFeGlzdCgiQUEiKSkgewotICAgICAgICByZXR1cm4gbV9wV2lkZ2V0RGljdC0+R2V0RGljdCgiQUEiKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcEZpZWxkLT5HZXRBZGRpdGlvbmFsQWN0aW9uKCk7Ci19Ci1DUERGX0RlZmF1bHRBcHBlYXJhbmNlIENQREZfRm9ybUNvbnRyb2w6OkdldERlZmF1bHRBcHBlYXJhbmNlKCkKLXsKLSAgICBpZiAoIW1fcFdpZGdldERpY3QpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIGlmIChtX3BXaWRnZXREaWN0LT5LZXlFeGlzdCgiREEiKSkgewotICAgICAgICByZXR1cm4gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJEQSIpOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiREEiKTsKLSAgICBpZiAoIXBPYmopIHsKLSAgICAgICAgcmV0dXJuIG1fcEZpZWxkLT5tX3BGb3JtLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotICAgIH0KLSAgICByZXR1cm4gcE9iai0+R2V0U3RyaW5nKCk7Ci19Ci0KLUNQREZfRm9udCogQ1BERl9Gb3JtQ29udHJvbDo6R2V0RGVmYXVsdENvbnRyb2xGb250KCkKLXsKLSAgICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGNEQSA9IEdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZVRhZzsKLSAgICBGWF9GTE9BVCBmRm9udFNpemU7Ci0gICAgY0RBLkdldEZvbnQoY3NGb250TmFtZVRhZywgZkZvbnRTaXplKTsKLSAgICBpZiAoY3NGb250TmFtZVRhZy5Jc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BXaWRnZXREaWN0LCAiRFIiKTsKLSAgICBpZiAocE9iaiAmJiBwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSAoKENQREZfRGljdGlvbmFyeSopcE9iaiktPkdldERpY3QoIkZvbnQiKTsKLSAgICAgICAgaWYgKHBGb250cykgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IHBGb250cy0+R2V0RGljdChjc0ZvbnROYW1lVGFnKTsKLSAgICAgICAgICAgIGlmIChwRWxlbWVudCkgewotICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQgPQotICAgICAgICAgICAgICAgICAgICBtX3BGaWVsZC0+bV9wRm9ybS0+bV9wRG9jdW1lbnQtPkxvYWRGb250KHBFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocEZvbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBGb250OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoQ1BERl9Gb250KiBwRm9ybUZvbnQgPSBtX3BGaWVsZC0+bV9wRm9ybS0+R2V0Rm9ybUZvbnQoY3NGb250TmFtZVRhZykpCi0gICAgICByZXR1cm4gcEZvcm1Gb250OwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwUGFnZURpY3QgPSBtX3BXaWRnZXREaWN0LT5HZXREaWN0KCJQIik7Ci0gICAgcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKHBQYWdlRGljdCwgIlJlc291cmNlcyIpOwotICAgIGlmIChwT2JqICYmIHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9ICgoQ1BERl9EaWN0aW9uYXJ5KilwT2JqKS0+R2V0RGljdCgiRm9udCIpOwotICAgICAgICBpZiAocEZvbnRzKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBFbGVtZW50ID0gcEZvbnRzLT5HZXREaWN0KGNzRm9udE5hbWVUYWcpOwotICAgICAgICAgICAgaWYgKHBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCA9Ci0gICAgICAgICAgICAgICAgICAgIG1fcEZpZWxkLT5tX3BGb3JtLT5tX3BEb2N1bWVudC0+TG9hZEZvbnQocEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGlmIChwRm9udCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEZvbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorQ1BERl9BQWN0aW9uIENQREZfRm9ybUNvbnRyb2w6OkdldEFkZGl0aW9uYWxBY3Rpb24oKSB7CisgIGlmICghbV9wV2lkZ2V0RGljdCkgewogICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChtX3BXaWRnZXREaWN0LT5LZXlFeGlzdCgiQUEiKSkgeworICAgIHJldHVybiBtX3BXaWRnZXREaWN0LT5HZXREaWN0KCJBQSIpOworICB9CisgIHJldHVybiBtX3BGaWVsZC0+R2V0QWRkaXRpb25hbEFjdGlvbigpOworfQorQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBDUERGX0Zvcm1Db250cm9sOjpHZXREZWZhdWx0QXBwZWFyYW5jZSgpIHsKKyAgaWYgKCFtX3BXaWRnZXREaWN0KSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIH0KKyAgaWYgKG1fcFdpZGdldERpY3QtPktleUV4aXN0KCJEQSIpKSB7CisgICAgcmV0dXJuIG1fcFdpZGdldERpY3QtPkdldFN0cmluZygiREEiKTsKKyAgfQorICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiREEiKTsKKyAgaWYgKCFwT2JqKSB7CisgICAgcmV0dXJuIG1fcEZpZWxkLT5tX3BGb3JtLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOworICB9CisgIHJldHVybiBwT2JqLT5HZXRTdHJpbmcoKTsKIH0KIAotaW50IENQREZfRm9ybUNvbnRyb2w6OkdldENvbnRyb2xBbGlnbm1lbnQoKQotewotICAgIGlmICghbV9wV2lkZ2V0RGljdCkgewotICAgICAgICByZXR1cm4gMDsKK0NQREZfRm9udCogQ1BERl9Gb3JtQ29udHJvbDo6R2V0RGVmYXVsdENvbnRyb2xGb250KCkgeworICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGNEQSA9IEdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWVUYWc7CisgIEZYX0ZMT0FUIGZGb250U2l6ZTsKKyAgY0RBLkdldEZvbnQoY3NGb250TmFtZVRhZywgZkZvbnRTaXplKTsKKyAgaWYgKGNzRm9udE5hbWVUYWcuSXNFbXB0eSgpKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wV2lkZ2V0RGljdCwgIkRSIik7CisgIGlmIChwT2JqICYmIHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gKChDUERGX0RpY3Rpb25hcnkqKXBPYmopLT5HZXREaWN0KCJGb250Iik7CisgICAgaWYgKHBGb250cykgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IHBGb250cy0+R2V0RGljdChjc0ZvbnROYW1lVGFnKTsKKyAgICAgIGlmIChwRWxlbWVudCkgeworICAgICAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9wRmllbGQtPm1fcEZvcm0tPm1fcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7CisgICAgICAgIGlmIChwRm9udCkgeworICAgICAgICAgIHJldHVybiBwRm9udDsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBpZiAobV9wV2lkZ2V0RGljdC0+S2V5RXhpc3QoIlEiKSkgewotICAgICAgICByZXR1cm4gbV9wV2lkZ2V0RGljdC0+R2V0SW50ZWdlcigiUSIsIDApOworICB9CisgIGlmIChDUERGX0ZvbnQqIHBGb3JtRm9udCA9IG1fcEZpZWxkLT5tX3BGb3JtLT5HZXRGb3JtRm9udChjc0ZvbnROYW1lVGFnKSkKKyAgICByZXR1cm4gcEZvcm1Gb250OworCisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gbV9wV2lkZ2V0RGljdC0+R2V0RGljdCgiUCIpOworICBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIocFBhZ2VEaWN0LCAiUmVzb3VyY2VzIik7CisgIGlmIChwT2JqICYmIHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gKChDUERGX0RpY3Rpb25hcnkqKXBPYmopLT5HZXREaWN0KCJGb250Iik7CisgICAgaWYgKHBGb250cykgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IHBGb250cy0+R2V0RGljdChjc0ZvbnROYW1lVGFnKTsKKyAgICAgIGlmIChwRWxlbWVudCkgeworICAgICAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9wRmllbGQtPm1fcEZvcm0tPm1fcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7CisgICAgICAgIGlmIChwRm9udCkgeworICAgICAgICAgIHJldHVybiBwRm9udDsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiUSIpOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIG1fcEZpZWxkLT5tX3BGb3JtLT5HZXRGb3JtQWxpZ25tZW50KCk7Ci0gICAgfQotICAgIHJldHVybiBwT2JqLT5HZXRJbnRlZ2VyKCk7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7CiB9Ci1GWF9CT09MIENQREZfQXBTZXR0aW5nczo6SGFzTUtFbnRyeShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpCi17Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBtX3BEaWN0LT5LZXlFeGlzdChjc0VudHJ5KTsKLX0KLWludCBDUERGX0FwU2V0dGluZ3M6OkdldFJvdGF0aW9uKCkKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUiIpKTsKLX0KLUZYX0FSR0IgQ1BERl9BcFNldHRpbmdzOjpHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSkKLXsKLSAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEZYX0FSR0IgY29sb3IgPSAwOwotICAgIENQREZfQXJyYXkqIHBFbnRyeSA9IG1fcERpY3QtPkdldEFycmF5KGNzRW50cnkpOwotICAgIGlmIChwRW50cnkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY29sb3I7Ci0gICAgfQotICAgIEZYX0RXT1JEIGR3Q291bnQgPSBwRW50cnktPkdldENvdW50KCk7Ci0gICAgaWYgKGR3Q291bnQgPT0gMSkgewotICAgICAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0dSQVk7Ci0gICAgICAgIEZYX0ZMT0FUIGcgPSBwRW50cnktPkdldE51bWJlcigwKSAqIDI1NTsKLSAgICAgICAgY29sb3IgPSBBcmdiRW5jb2RlKDI1NSwgKGludClnLCAoaW50KWcsIChpbnQpZyk7Ci0gICAgfSBlbHNlIGlmIChkd0NvdW50ID09IDMpIHsKLSAgICAgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7Ci0gICAgICAgIEZYX0ZMT0FUIHIgPSBwRW50cnktPkdldE51bWJlcigwKSAqIDI1NTsKLSAgICAgICAgRlhfRkxPQVQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpICogMjU1OwotICAgICAgICBGWF9GTE9BVCBiID0gcEVudHJ5LT5HZXROdW1iZXIoMikgKiAyNTU7Ci0gICAgICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpciwgKGludClnLCAoaW50KWIpOwotICAgIH0gZWxzZSBpZiAoZHdDb3VudCA9PSA0KSB7Ci0gICAgICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfQ01ZSzsKLSAgICAgICAgRlhfRkxPQVQgYyA9IHBFbnRyeS0+R2V0TnVtYmVyKDApOwotICAgICAgICBGWF9GTE9BVCBtID0gcEVudHJ5LT5HZXROdW1iZXIoMSk7Ci0gICAgICAgIEZYX0ZMT0FUIHkgPSBwRW50cnktPkdldE51bWJlcigyKTsKLSAgICAgICAgRlhfRkxPQVQgayA9IHBFbnRyeS0+R2V0TnVtYmVyKDMpOwotICAgICAgICBGWF9GTE9BVCByID0gMS4wZiAtIEZYX01JTigxLjBmLCBjICsgayk7Ci0gICAgICAgIEZYX0ZMT0FUIGcgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIG0gKyBrKTsKLSAgICAgICAgRlhfRkxPQVQgYiA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgeSArIGspOwotICAgICAgICBjb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50KShyICogMjU1KSwgKGludCkoZyAqIDI1NSksIChpbnQpKGIgKiAyNTUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbG9yOwotfQotRlhfRkxPQVQgQ1BERl9BcFNldHRpbmdzOjpHZXRPcmlnaW5hbENvbG9yKGludCBpbmRleCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KQotewotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBFbnRyeSA9IG1fcERpY3QtPkdldEFycmF5KGNzRW50cnkpOwotICAgIGlmIChwRW50cnkgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gcEVudHJ5LT5HZXROdW1iZXIoaW5kZXgpOwotICAgIH0KKworaW50IENQREZfRm9ybUNvbnRyb2w6OkdldENvbnRyb2xBbGlnbm1lbnQoKSB7CisgIGlmICghbV9wV2lkZ2V0RGljdCkgewogICAgIHJldHVybiAwOworICB9CisgIGlmIChtX3BXaWRnZXREaWN0LT5LZXlFeGlzdCgiUSIpKSB7CisgICAgcmV0dXJuIG1fcFdpZGdldERpY3QtPkdldEludGVnZXIoIlEiLCAwKTsKKyAgfQorICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiUSIpOworICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIG1fcEZpZWxkLT5tX3BGb3JtLT5HZXRGb3JtQWxpZ25tZW50KCk7CisgIH0KKyAgcmV0dXJuIHBPYmotPkdldEludGVnZXIoKTsKIH0KLXZvaWQgQ1BERl9BcFNldHRpbmdzOjpHZXRPcmlnaW5hbENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSkKLXsKLSAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICBmY1tpXSA9IDA7Ci0gICAgfQotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwRW50cnkgPSBtX3BEaWN0LT5HZXRBcnJheShjc0VudHJ5KTsKLSAgICBpZiAocEVudHJ5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9EV09SRCBkd0NvdW50ID0gcEVudHJ5LT5HZXRDb3VudCgpOwotICAgIGlmIChkd0NvdW50ID09IDEpIHsKLSAgICAgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9HUkFZOwotICAgICAgICBmY1swXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDApOwotICAgIH0gZWxzZSBpZiAoZHdDb3VudCA9PSAzKSB7Ci0gICAgICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfUkdCOwotICAgICAgICBmY1swXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDApOwotICAgICAgICBmY1sxXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpOwotICAgICAgICBmY1syXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDIpOwotICAgIH0gZWxzZSBpZiAoZHdDb3VudCA9PSA0KSB7Ci0gICAgICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfQ01ZSzsKLSAgICAgICAgZmNbMF0gPSBwRW50cnktPkdldE51bWJlcigwKTsKLSAgICAgICAgZmNbMV0gPSBwRW50cnktPkdldE51bWJlcigxKTsKLSAgICAgICAgZmNbMl0gPSBwRW50cnktPkdldE51bWJlcigyKTsKLSAgICAgICAgZmNbM10gPSBwRW50cnktPkdldE51bWJlcigzKTsKLSAgICB9CitGWF9CT09MIENQREZfQXBTZXR0aW5nczo6SGFzTUtFbnRyeShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpIHsKKyAgaWYgKG1fcERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gbV9wRGljdC0+S2V5RXhpc3QoY3NFbnRyeSk7CiB9Ci1DRlhfV2lkZVN0cmluZyBDUERGX0FwU2V0dGluZ3M6OkdldENhcHRpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KQotewotICAgIENGWF9XaWRlU3RyaW5nIGNzQ2FwdGlvbjsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBjc0NhcHRpb247Ci0gICAgfQotICAgIHJldHVybiBtX3BEaWN0LT5HZXRVbmljb2RlVGV4dChjc0VudHJ5KTsKK2ludCBDUERGX0FwU2V0dGluZ3M6OkdldFJvdGF0aW9uKCkgeworICBpZiAobV9wRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIG1fcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlIiKSk7CiB9Ci1DUERGX1N0cmVhbSogQ1BERl9BcFNldHRpbmdzOjpHZXRJY29uKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSkKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGljdC0+R2V0U3RyZWFtKGNzRW50cnkpOworRlhfQVJHQiBDUERGX0FwU2V0dGluZ3M6OkdldENvbG9yKGludCYgaUNvbG9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpIHsKKyAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKKyAgaWYgKG1fcERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIEZYX0FSR0IgY29sb3IgPSAwOworICBDUERGX0FycmF5KiBwRW50cnkgPSBtX3BEaWN0LT5HZXRBcnJheShjc0VudHJ5KTsKKyAgaWYgKHBFbnRyeSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGNvbG9yOworICB9CisgIEZYX0RXT1JEIGR3Q291bnQgPSBwRW50cnktPkdldENvdW50KCk7CisgIGlmIChkd0NvdW50ID09IDEpIHsKKyAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0dSQVk7CisgICAgRlhfRkxPQVQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyKDApICogMjU1OworICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpZywgKGludClnLCAoaW50KWcpOworICB9IGVsc2UgaWYgKGR3Q291bnQgPT0gMykgeworICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfUkdCOworICAgIEZYX0ZMT0FUIHIgPSBwRW50cnktPkdldE51bWJlcigwKSAqIDI1NTsKKyAgICBGWF9GTE9BVCBnID0gcEVudHJ5LT5HZXROdW1iZXIoMSkgKiAyNTU7CisgICAgRlhfRkxPQVQgYiA9IHBFbnRyeS0+R2V0TnVtYmVyKDIpICogMjU1OworICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpciwgKGludClnLCAoaW50KWIpOworICB9IGVsc2UgaWYgKGR3Q291bnQgPT0gNCkgeworICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfQ01ZSzsKKyAgICBGWF9GTE9BVCBjID0gcEVudHJ5LT5HZXROdW1iZXIoMCk7CisgICAgRlhfRkxPQVQgbSA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpOworICAgIEZYX0ZMT0FUIHkgPSBwRW50cnktPkdldE51bWJlcigyKTsKKyAgICBGWF9GTE9BVCBrID0gcEVudHJ5LT5HZXROdW1iZXIoMyk7CisgICAgRlhfRkxPQVQgciA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgYyArIGspOworICAgIEZYX0ZMT0FUIGcgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIG0gKyBrKTsKKyAgICBGWF9GTE9BVCBiID0gMS4wZiAtIEZYX01JTigxLjBmLCB5ICsgayk7CisgICAgY29sb3IgPSBBcmdiRW5jb2RlKDI1NSwgKGludCkociAqIDI1NSksIChpbnQpKGcgKiAyNTUpLCAoaW50KShiICogMjU1KSk7CisgIH0KKyAgcmV0dXJuIGNvbG9yOwogfQotQ1BERl9JY29uRml0IENQREZfQXBTZXR0aW5nczo6R2V0SWNvbkZpdCgpCi17Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIklGIikpOworRlhfRkxPQVQgQ1BERl9BcFNldHRpbmdzOjpHZXRPcmlnaW5hbENvbG9yKGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpIHsKKyAgaWYgKG1fcERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIENQREZfQXJyYXkqIHBFbnRyeSA9IG1fcERpY3QtPkdldEFycmF5KGNzRW50cnkpOworICBpZiAocEVudHJ5ICE9IE5VTEwpIHsKKyAgICByZXR1cm4gcEVudHJ5LT5HZXROdW1iZXIoaW5kZXgpOworICB9CisgIHJldHVybiAwOwogfQotaW50IENQREZfQXBTZXR0aW5nczo6R2V0VGV4dFBvc2l0aW9uKCkKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBURVhUUE9TX0NBUFRJT047Ci0gICAgfQotICAgIHJldHVybiBtX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJUUCIpLCBURVhUUE9TX0NBUFRJT04pOwordm9pZCBDUERGX0FwU2V0dGluZ3M6OkdldE9yaWdpbmFsQ29sb3IoaW50JiBpQ29sb3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZmNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpIHsKKyAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBmY1tpXSA9IDA7CisgIH0KKyAgaWYgKG1fcERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0FycmF5KiBwRW50cnkgPSBtX3BEaWN0LT5HZXRBcnJheShjc0VudHJ5KTsKKyAgaWYgKHBFbnRyeSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0RXT1JEIGR3Q291bnQgPSBwRW50cnktPkdldENvdW50KCk7CisgIGlmIChkd0NvdW50ID09IDEpIHsKKyAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0dSQVk7CisgICAgZmNbMF0gPSBwRW50cnktPkdldE51bWJlcigwKTsKKyAgfSBlbHNlIGlmIChkd0NvdW50ID09IDMpIHsKKyAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1JHQjsKKyAgICBmY1swXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDApOworICAgIGZjWzFdID0gcEVudHJ5LT5HZXROdW1iZXIoMSk7CisgICAgZmNbMl0gPSBwRW50cnktPkdldE51bWJlcigyKTsKKyAgfSBlbHNlIGlmIChkd0NvdW50ID09IDQpIHsKKyAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0NNWUs7CisgICAgZmNbMF0gPSBwRW50cnktPkdldE51bWJlcigwKTsKKyAgICBmY1sxXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpOworICAgIGZjWzJdID0gcEVudHJ5LT5HZXROdW1iZXIoMik7CisgICAgZmNbM10gPSBwRW50cnktPkdldE51bWJlcigzKTsKKyAgfQorfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9BcFNldHRpbmdzOjpHZXRDYXB0aW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSkgeworICBDRlhfV2lkZVN0cmluZyBjc0NhcHRpb247CisgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gY3NDYXB0aW9uOworICB9CisgIHJldHVybiBtX3BEaWN0LT5HZXRVbmljb2RlVGV4dChjc0VudHJ5KTsKK30KK0NQREZfU3RyZWFtKiBDUERGX0FwU2V0dGluZ3M6OkdldEljb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KSB7CisgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gbV9wRGljdC0+R2V0U3RyZWFtKGNzRW50cnkpOworfQorQ1BERl9JY29uRml0IENQREZfQXBTZXR0aW5nczo6R2V0SWNvbkZpdCgpIHsKKyAgaWYgKG1fcERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBtX3BEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJJRiIpKTsKK30KK2ludCBDUERGX0FwU2V0dGluZ3M6OkdldFRleHRQb3NpdGlvbigpIHsKKyAgaWYgKG1fcERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBURVhUUE9TX0NBUFRJT047CisgIH0KKyAgcmV0dXJuIG1fcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlRQIiksIFRFWFRQT1NfQ0FQVElPTik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtZmllbGQuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWZpZWxkLmNwcAppbmRleCA4YjY0NGU0Li44Yzk5Y2Y0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtZmllbGQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1maWVsZC5jcHAKQEAgLTcsMTE3MSArNywxMTQ1IEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCiAjaW5jbHVkZSAiZG9jX3V0aWxzLmgiCiAKLUZYX0JPT0wgUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbihDUERGX0Zvcm1GaWVsZCAqcEZpZWxkKQotewotICAgIEZYX0JPT0wgYlVuaXNvbiA9IEZBTFNFOwotICAgIGlmIChwRmllbGQtPkdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3gpIHsKLSAgICAgICAgYlVuaXNvbiA9IFRSVUU7CitGWF9CT09MIFBERl9Gb3JtRmllbGRfSXNVbmlzb24oQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCkgeworICBGWF9CT09MIGJVbmlzb24gPSBGQUxTRTsKKyAgaWYgKHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCkgeworICAgIGJVbmlzb24gPSBUUlVFOworICB9IGVsc2UgeworICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwRmllbGQtPkdldEZpZWxkRmxhZ3MoKTsKKyAgICBiVW5pc29uID0gKChkd0ZsYWdzICYgMHgyMDAwMDAwKSAhPSAwKTsKKyAgfQorICByZXR1cm4gYlVuaXNvbjsKK30KK0NQREZfRm9ybUZpZWxkOjpDUERGX0Zvcm1GaWVsZChDUERGX0ludGVyRm9ybSogcEZvcm0sIENQREZfRGljdGlvbmFyeSogcERpY3QpIHsKKyAgbV9wRGljdCA9IHBEaWN0OworICBtX1R5cGUgPSBVbmtub3duOworICBtX3BGb3JtID0gcEZvcm07CisgIG1fcEZvbnQgPSBOVUxMOworICBtX0ZvbnRTaXplID0gMDsKKyAgU3luY0ZpZWxkRmxhZ3MoKTsKK30KK0NQREZfRm9ybUZpZWxkOjp+Q1BERl9Gb3JtRmllbGQoKSB7fQordm9pZCBDUERGX0Zvcm1GaWVsZDo6U3luY0ZpZWxkRmxhZ3MoKSB7CisgIENGWF9CeXRlU3RyaW5nIHR5cGVfbmFtZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJGVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJGVCIpLT5HZXRTdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDRlhfQnl0ZVN0cmluZygpOworICBGWF9EV09SRCBmbGFncyA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJGZiIpCisgICAgICAgICAgICAgICAgICAgICAgID8gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkZmIiktPkdldEludGVnZXIoKQorICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgIG1fRmxhZ3MgPSAwOworICBpZiAoZmxhZ3MgJiAxKSB7CisgICAgbV9GbGFncyB8PSBGT1JNRklFTERfUkVBRE9OTFk7CisgIH0KKyAgaWYgKGZsYWdzICYgMikgeworICAgIG1fRmxhZ3MgfD0gRk9STUZJRUxEX1JFUVVJUkVEOworICB9CisgIGlmIChmbGFncyAmIDQpIHsKKyAgICBtX0ZsYWdzIHw9IEZPUk1GSUVMRF9OT0VYUE9SVDsKKyAgfQorICBpZiAodHlwZV9uYW1lID09ICJCdG4iKSB7CisgICAgaWYgKGZsYWdzICYgMHg4MDAwKSB7CisgICAgICBtX1R5cGUgPSBSYWRpb0J1dHRvbjsKKyAgICAgIGlmIChmbGFncyAmIDB4NDAwMCkgeworICAgICAgICBtX0ZsYWdzIHw9IEZPUk1SQURJT19OT1RPR0dMRU9GRjsKKyAgICAgIH0KKyAgICAgIGlmIChmbGFncyAmIDB4MjAwMDAwMCkgeworICAgICAgICBtX0ZsYWdzIHw9IEZPUk1SQURJT19VTklTT047CisgICAgICB9CisgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4MTAwMDApIHsKKyAgICAgIG1fVHlwZSA9IFB1c2hCdXR0b247CiAgICAgfSBlbHNlIHsKLSAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBGaWVsZC0+R2V0RmllbGRGbGFncygpOwotICAgICAgICBiVW5pc29uID0gKChkd0ZsYWdzICYgMHgyMDAwMDAwKSAhPSAwKTsKKyAgICAgIG1fVHlwZSA9IENoZWNrQm94OwogICAgIH0KLSAgICByZXR1cm4gYlVuaXNvbjsKLX0KLUNQREZfRm9ybUZpZWxkOjpDUERGX0Zvcm1GaWVsZChDUERGX0ludGVyRm9ybSogcEZvcm0sIENQREZfRGljdGlvbmFyeSogcERpY3QpCi17Ci0gICAgbV9wRGljdCA9IHBEaWN0OwotICAgIG1fVHlwZSA9IFVua25vd247Ci0gICAgbV9wRm9ybSA9IHBGb3JtOwotICAgIG1fcEZvbnQgPSBOVUxMOwotICAgIG1fRm9udFNpemUgPSAwOwotICAgIFN5bmNGaWVsZEZsYWdzKCk7Ci19Ci1DUERGX0Zvcm1GaWVsZDo6fkNQREZfRm9ybUZpZWxkKCkKLXsKLX0KLXZvaWQgQ1BERl9Gb3JtRmllbGQ6OlN5bmNGaWVsZEZsYWdzKCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyB0eXBlX25hbWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRlQiKSA/IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJGVCIpLT5HZXRTdHJpbmcoKSA6IENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgRlhfRFdPUkQgZmxhZ3MgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRmYiKT8gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkZmIiktPkdldEludGVnZXIoKSA6IDA7Ci0gICAgbV9GbGFncyA9IDA7Ci0gICAgaWYgKGZsYWdzICYgMSkgewotICAgICAgICBtX0ZsYWdzIHw9IEZPUk1GSUVMRF9SRUFET05MWTsKLSAgICB9Ci0gICAgaWYgKGZsYWdzICYgMikgewotICAgICAgICBtX0ZsYWdzIHw9IEZPUk1GSUVMRF9SRVFVSVJFRDsKLSAgICB9Ci0gICAgaWYgKGZsYWdzICYgNCkgewotICAgICAgICBtX0ZsYWdzIHw9IEZPUk1GSUVMRF9OT0VYUE9SVDsKLSAgICB9Ci0gICAgaWYgKHR5cGVfbmFtZSA9PSAiQnRuIikgewotICAgICAgICBpZiAoZmxhZ3MgJiAweDgwMDApIHsKLSAgICAgICAgICAgIG1fVHlwZSA9IFJhZGlvQnV0dG9uOwotICAgICAgICAgICAgaWYgKGZsYWdzICYgMHg0MDAwKSB7Ci0gICAgICAgICAgICAgICAgbV9GbGFncyB8PSBGT1JNUkFESU9fTk9UT0dHTEVPRkY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDIwMDAwMDApIHsKLSAgICAgICAgICAgICAgICBtX0ZsYWdzIHw9IEZPUk1SQURJT19VTklTT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDEwMDAwKSB7Ci0gICAgICAgICAgICBtX1R5cGUgPSBQdXNoQnV0dG9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9UeXBlID0gQ2hlY2tCb3g7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGVfbmFtZSA9PSAiVHgiKSB7Ci0gICAgICAgIGlmIChmbGFncyAmIDB4MTAwMDAwKSB7Ci0gICAgICAgICAgICBtX1R5cGUgPSBGaWxlOwotICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgMHgyMDAwMDAwKSB7Ci0gICAgICAgICAgICBtX1R5cGUgPSBSaWNoVGV4dDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fVHlwZSA9IFRleHQ7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDEwMDApIHsKLSAgICAgICAgICAgICAgICBtX0ZsYWdzIHw9IEZPUk1URVhUX01VTFRJTElORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmbGFncyAmIDB4MjAwMCkgewotICAgICAgICAgICAgICAgIG1fRmxhZ3MgfD0gRk9STVRFWFRfUEFTU1dPUkQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDgwMDAwMCkgewotICAgICAgICAgICAgICAgIG1fRmxhZ3MgfD0gRk9STVRFWFRfTk9TQ1JPTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDEwMDAwMCkgewotICAgICAgICAgICAgICAgIG1fRmxhZ3MgfD0gRk9STVRFWFRfQ09NQjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBMb2FkREEoKTsKLSAgICB9IGVsc2UgaWYgKHR5cGVfbmFtZSA9PSAiQ2giKSB7Ci0gICAgICAgIGlmIChmbGFncyAmIDB4MjAwMDApIHsKLSAgICAgICAgICAgIG1fVHlwZSA9IENvbWJvQm94OwotICAgICAgICAgICAgaWYgKGZsYWdzICYgMHg0MDAwMCkgewotICAgICAgICAgICAgICAgIG1fRmxhZ3MgfD0gRk9STUNPTUJPX0VESVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1R5cGUgPSBMaXN0Qm94OwotICAgICAgICAgICAgaWYgKGZsYWdzICYgMHgyMDAwMDApIHsKLSAgICAgICAgICAgICAgICBtX0ZsYWdzIHw9IEZPUk1MSVNUX01VTFRJU0VMRUNUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExvYWREQSgpOwotICAgIH0gZWxzZSBpZiAodHlwZV9uYW1lID09ICJTaWciKSB7Ci0gICAgICAgIG1fVHlwZSA9IFNpZ247Ci0gICAgfQotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldEZ1bGxOYW1lKCkKLXsKLSAgICByZXR1cm4gOjpHZXRGdWxsTmFtZShtX3BEaWN0KTsKLX0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlJlc2V0RmllbGQoRlhfQk9PTCBiTm90aWZ5KQotewotICAgIHN3aXRjaCAobV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94OgotICAgICAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbjogewotICAgICAgICAgICAgICAgIENGWF9CeXRlQXJyYXkgc3RhdHVzQXJyYXk7Ci0gICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNhdmVDaGVja2VkRmllbGRTdGF0dXModGhpcywgc3RhdHVzQXJyYXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOwotICAgICAgICAgICAgICAgIGlmIChpQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFBERl9Gb3JtRmllbGRfSXNVbmlzb24odGhpcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChpLCBHZXRDb250cm9sKGkpLT5Jc0RlZmF1bHRDaGVja2VkKCksIEZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRDb250cm9sKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoZWNrZWQgPSBwQ29udHJvbC0+SXNEZWZhdWx0Q2hlY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChpLCBiQ2hlY2tlZCwgRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UodGhpcywgc3RhdHVzQXJyYXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpDb21ib0JveDogewotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWU7Ci0gICAgICAgICAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpbnQgaUluZGV4ID0gR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgICAgIGlmIChpSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaUluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCBUUlVFKTsKLSAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDUERGX0Zvcm1GaWVsZDo6TGlzdEJveDogewotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWU7Ci0gICAgICAgICAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpbnQgaUluZGV4ID0gR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgICAgIGlmIChpSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaUluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpUZXh0OgotICAgICAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpSaWNoVGV4dDoKLSAgICAgICAgY2FzZSBDUERGX0Zvcm1GaWVsZDo6RmlsZToKLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwRFYgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRFYiKTsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0RWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAocERWICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3NEVmFsdWUgPSBwRFYtPkdldFVuaWNvZGVUZXh0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAocFYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBjc1ZhbHVlID0gcFYtPkdldFVuaWNvZGVUZXh0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwUlYgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiUlYiKTsKLSAgICAgICAgICAgICAgICBpZiAoIXBSViAmJiAoY3NEVmFsdWUgPT0gY3NWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc0RWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwRFYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtX3BEaWN0LT5SZW1vdmVBdCgiViIpOwotICAgICAgICAgICAgICAgICAgICBtX3BEaWN0LT5SZW1vdmVBdCgiUlYiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcENsb25lID0gcERWLT5DbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocENsb25lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdCgiViIsIHBDbG9uZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBSVikgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBDbG9uZVIgPSBwRFYtPkNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdCgiUlYiLCBwQ2xvbmVSKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1pbnQgQ1BERl9Gb3JtRmllbGQ6OkdldENvbnRyb2xJbmRleChjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCkKLXsKLSAgICBpZiAocENvbnRyb2wgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBpQ291bnQgPSBtX0NvbnRyb2xMaXN0LkdldFNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRmluZCA9IChDUERGX0Zvcm1Db250cm9sKiltX0NvbnRyb2xMaXN0LkdldEF0KGkpOwotICAgICAgICBpZiAocEZpbmQgPT0gcENvbnRyb2wpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLWludCBDUERGX0Zvcm1GaWVsZDo6R2V0RmllbGRUeXBlKCkKLXsKLSAgICBzd2l0Y2ggKG1fVHlwZSkgewotICAgICAgICBjYXNlIFB1c2hCdXR0b246Ci0gICAgICAgICAgICByZXR1cm4gRklFTERUWVBFX1BVU0hCVVRUT047Ci0gICAgICAgIGNhc2UgQ2hlY2tCb3g6Ci0gICAgICAgICAgICByZXR1cm4gRklFTERUWVBFX0NIRUNLQk9YOwotICAgICAgICBjYXNlIFJhZGlvQnV0dG9uOgotICAgICAgICAgICAgcmV0dXJuIEZJRUxEVFlQRV9SQURJT0JVVFRPTjsKLSAgICAgICAgY2FzZSBDb21ib0JveDoKLSAgICAgICAgICAgIHJldHVybiBGSUVMRFRZUEVfQ09NQk9CT1g7Ci0gICAgICAgIGNhc2UgTGlzdEJveDoKLSAgICAgICAgICAgIHJldHVybiBGSUVMRFRZUEVfTElTVEJPWDsKLSAgICAgICAgY2FzZSBUZXh0OgotICAgICAgICBjYXNlIFJpY2hUZXh0OgotICAgICAgICBjYXNlIEZpbGU6Ci0gICAgICAgICAgICByZXR1cm4gRklFTERUWVBFX1RFWFRGSUVMRDsKLSAgICAgICAgY2FzZSBTaWduOgotICAgICAgICAgICAgcmV0dXJuIEZJRUxEVFlQRV9TSUdOQVRVUkU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIEZJRUxEVFlQRV9VTktOT1dOOwotfQotQ1BERl9BQWN0aW9uIENQREZfRm9ybUZpZWxkOjpHZXRBZGRpdGlvbmFsQWN0aW9uKCkKLXsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJBQSIpOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwT2JqLT5HZXREaWN0KCk7Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0QWx0ZXJuYXRlTmFtZSgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiVFUiKTsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBMIiI7Ci0gICAgfQotICAgIHJldHVybiBwT2JqLT5HZXRVbmljb2RlVGV4dCgpOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldE1hcHBpbmdOYW1lKCkKLXsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJUTSIpOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9Ci0gICAgcmV0dXJuIHBPYmotPkdldFVuaWNvZGVUZXh0KCk7Ci19Ci1GWF9EV09SRCBDUERGX0Zvcm1GaWVsZDo6R2V0RmllbGRGbGFncygpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRmYiKTsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcE9iai0+R2V0SW50ZWdlcigpOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldERlZmF1bHRTdHlsZSgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRFMiKTsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gICAgcmV0dXJuIHBPYmotPkdldFN0cmluZygpOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFJpY2hUZXh0U3RyaW5nKCkKLXsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJSViIpOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9Ci0gICAgcmV0dXJuIHBPYmotPkdldFVuaWNvZGVUZXh0KCk7Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0VmFsdWUoRlhfQk9PTCBiRGVmYXVsdCkKLXsKLSAgICBpZiAoR2V0VHlwZSgpID09IENoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBSYWRpb0J1dHRvbikgewotICAgICAgICByZXR1cm4gR2V0Q2hlY2tWYWx1ZShiRGVmYXVsdCk7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCBiRGVmYXVsdCA/ICJEViIgOiAiViIpOwotICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgewotICAgICAgICBpZiAoIWJEZWZhdWx0KSB7Ci0gICAgICAgICAgICBpZiAobV9UeXBlID09IFJpY2hUZXh0KSB7Ci0gICAgICAgICAgICAgICAgcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwVmFsdWUgPT0gTlVMTCAmJiBtX1R5cGUgIT0gVGV4dCkgewotICAgICAgICAgICAgICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEViIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3dpdGNoIChwVmFsdWUtPkdldFR5cGUoKSkgewotICAgICAgICBjYXNlIFBERk9CSl9TVFJJTkc6Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUkVBTToKLSAgICAgICAgICAgIHJldHVybiBwVmFsdWUtPkdldFVuaWNvZGVUZXh0KCk7Ci0gICAgICAgIGNhc2UgUERGT0JKX0FSUkFZOgotICAgICAgICAgICAgcFZhbHVlID0gKChDUERGX0FycmF5KilwVmFsdWUpLT5HZXRFbGVtZW50VmFsdWUoMCk7Ci0gICAgICAgICAgICBpZiAocFZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRWYWx1ZSgpCi17Ci0gICAgcmV0dXJuIEdldFZhbHVlKEZBTFNFKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXREZWZhdWx0VmFsdWUoKQotewotICAgIHJldHVybiBHZXRWYWx1ZShUUlVFKTsKLX0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgRlhfQk9PTCBiRGVmYXVsdCwgRlhfQk9PTCBiTm90aWZ5KQotewotICAgIHN3aXRjaCAobV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgQ2hlY2tCb3g6Ci0gICAgICAgIGNhc2UgUmFkaW9CdXR0b246IHsKLSAgICAgICAgICAgICAgICBTZXRDaGVja1ZhbHVlKHZhbHVlLCBiRGVmYXVsdCwgYk5vdGlmeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRmlsZToKLSAgICAgICAgY2FzZSBSaWNoVGV4dDoKLSAgICAgICAgY2FzZSBUZXh0OgotICAgICAgICBjYXNlIENvbWJvQm94OiB7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgaUluZGV4ID0gRmluZE9wdGlvblZhbHVlKGNzVmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChpSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRW5jb2RlVGV4dCA9IFBERl9FbmNvZGVUZXh0KGNzVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZyhiRGVmYXVsdCA/ICJEViIgOiAiViIsIGJzRW5jb2RlVGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX1R5cGUgPT0gUmljaFRleHQgJiYgIWJEZWZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZygiUlYiLCBic0VuY29kZVRleHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KCJJIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wRGljdC0+U2V0QXRTdHJpbmcoYkRlZmF1bHQgPyAiRFYiIDogIlYiLCBQREZfRW5jb2RlVGV4dChjc1ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiRGVmYXVsdCkgewotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCBUUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMaXN0Qm94OiB7Ci0gICAgICAgICAgICAgICAgaW50IGlJbmRleCA9IEZpbmRPcHRpb25WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYkRlZmF1bHQgJiYgaUluZGV4ID09IEdldERlZmF1bHRTZWxlY3RlZEl0ZW0oKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYkRlZmF1bHQpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBTZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKENQREZfSW50ZXJGb3JtOjptX2JVcGRhdGVBUCkgewotICAgICAgICBVcGRhdGVBUChOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIEZYX0JPT0wgYk5vdGlmeSkKLXsKLSAgICByZXR1cm4gU2V0VmFsdWUodmFsdWUsIEZBTFNFLCBiTm90aWZ5KTsKLX0KLWludCBDUERGX0Zvcm1GaWVsZDo6R2V0TWF4TGVuKCkKLXsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJNYXhMZW4iKTsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIGludCBpQ291bnQgPSBtX0NvbnRyb2xMaXN0LkdldFNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gKENQREZfRm9ybUNvbnRyb2wqKW1fQ29udHJvbExpc3QuR2V0QXQoaSk7Ci0gICAgICAgICAgICBpZiAocENvbnRyb2wgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCA9IHBDb250cm9sLT5tX3BXaWRnZXREaWN0OwotICAgICAgICAgICAgaWYgKHBXaWRnZXREaWN0LT5LZXlFeGlzdCgiTWF4TGVuIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcFdpZGdldERpY3QtPkdldEludGVnZXIoIk1heExlbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcE9iai0+R2V0SW50ZWdlcigpOwotfQotaW50IENQREZfRm9ybUZpZWxkOjpDb3VudFNlbGVjdGVkSXRlbXMoKQotewotICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOwotICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgewotICAgICAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiSSIpOwotICAgICAgICBpZiAocFZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSSU5HKSB7Ci0gICAgICAgIGlmIChwVmFsdWUtPkdldFN0cmluZygpLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgIGlmIChwVmFsdWUtPkdldFN0cmluZygpLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAoKENQREZfQXJyYXkqKXBWYWx1ZSktPkdldENvdW50KCk7Ci19Ci1pbnQgQ1BERl9Gb3JtRmllbGQ6OkdldFNlbGVjdGVkSW5kZXgoaW50IGluZGV4KQotewotICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOwotICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgewotICAgICAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiSSIpOwotICAgICAgICBpZiAocFZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICByZXR1cm4gcFZhbHVlLT5HZXRJbnRlZ2VyKCk7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHNlbF92YWx1ZTsKLSAgICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewotICAgICAgICBpZiAoaW5kZXggIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHNlbF92YWx1ZSA9IHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKTsKKyAgfSBlbHNlIGlmICh0eXBlX25hbWUgPT0gIlR4IikgeworICAgIGlmIChmbGFncyAmIDB4MTAwMDAwKSB7CisgICAgICBtX1R5cGUgPSBGaWxlOworICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDIwMDAwMDApIHsKKyAgICAgIG1fVHlwZSA9IFJpY2hUZXh0OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QqIGVsZW1lbnRWYWx1ZSA9ICgoQ1BERl9BcnJheSopcFZhbHVlKS0+R2V0RWxlbWVudFZhbHVlKGluZGV4KTsKLSAgICAgICAgc2VsX3ZhbHVlID0gZWxlbWVudFZhbHVlID8gZWxlbWVudFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpIDogQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgICAgIG1fVHlwZSA9IFRleHQ7CisgICAgICBpZiAoZmxhZ3MgJiAweDEwMDApIHsKKyAgICAgICAgbV9GbGFncyB8PSBGT1JNVEVYVF9NVUxUSUxJTkU7CisgICAgICB9CisgICAgICBpZiAoZmxhZ3MgJiAweDIwMDApIHsKKyAgICAgICAgbV9GbGFncyB8PSBGT1JNVEVYVF9QQVNTV09SRDsKKyAgICAgIH0KKyAgICAgIGlmIChmbGFncyAmIDB4ODAwMDAwKSB7CisgICAgICAgIG1fRmxhZ3MgfD0gRk9STVRFWFRfTk9TQ1JPTEw7CisgICAgICB9CisgICAgICBpZiAoZmxhZ3MgJiAweDEwMDAwMCkgeworICAgICAgICBtX0ZsYWdzIHw9IEZPUk1URVhUX0NPTUI7CisgICAgICB9CiAgICAgfQotICAgIGlmIChpbmRleCA8IENvdW50U2VsZWN0ZWRPcHRpb25zKCkpIHsKLSAgICAgICAgaW50IGlPcHRJbmRleCA9IEdldFNlbGVjdGVkT3B0aW9uSW5kZXgoaW5kZXgpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc09wdCA9IEdldE9wdGlvblZhbHVlKGlPcHRJbmRleCk7Ci0gICAgICAgIGlmIChjc09wdCA9PSBzZWxfdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBpT3B0SW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IG5PcHRzID0gQ291bnRPcHRpb25zKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuT3B0czsgaSArKykgewotICAgICAgICBpZiAoc2VsX3ZhbHVlID09IEdldE9wdGlvblZhbHVlKGkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpDbGVhclNlbGVjdGlvbihGWF9CT09MIGJOb3RpZnkpCi17Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIGludCBpUmV0ID0gMDsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKLSAgICAgICAgaW50IGlJbmRleCA9IEdldFNlbGVjdGVkSW5kZXgoMCk7Ci0gICAgICAgIGlmIChpSW5kZXggPj0gMCkgewotICAgICAgICAgICAgY3NWYWx1ZSA9IEdldE9wdGlvbkxhYmVsKGlJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7Ci0gICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIHsKLSAgICAgICAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX3BEaWN0LT5SZW1vdmVBdCgiViIpOwotICAgIG1fcERpY3QtPlJlbW92ZUF0KCJJIik7Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgewotICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgewotICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoQ1BERl9JbnRlckZvcm06Om1fYlVwZGF0ZUFQKSB7Ci0gICAgICAgIFVwZGF0ZUFQKE5VTEwpOwotICAgIH0KLSAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OklzSXRlbVNlbGVjdGVkKGludCBpbmRleCkKLXsKLSAgICBBU1NFUlQoR2V0VHlwZSgpID09IENvbWJvQm94IHx8IEdldFR5cGUoKSA9PSBMaXN0Qm94KTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IENvdW50T3B0aW9ucygpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKElzT3B0aW9uU2VsZWN0ZWQoaW5kZXgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBvcHRfdmFsdWUgPSBHZXRPcHRpb25WYWx1ZShpbmRleCk7Ci0gICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7Ci0gICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7Ci0gICAgICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSSU5HKSB7Ci0gICAgICAgIGlmIChwVmFsdWUtPkdldFVuaWNvZGVUZXh0KCkgPT0gb3B0X3ZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgIGlmIChwVmFsdWUtPkdldFN0cmluZygpLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwVmFsdWUtPkdldEludGVnZXIoKSA9PSBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBWYWx1ZTsKLSAgICBpbnQgaVBvcyA9IC0xOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgQ291bnRTZWxlY3RlZE9wdGlvbnMoKTsgaiArKykgewotICAgICAgICBpZiAoR2V0U2VsZWN0ZWRPcHRpb25JbmRleChqKSA9PSBpbmRleCkgewotICAgICAgICAgICAgaVBvcyA9IGo7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKQotICAgICAgICBpZiAocEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSktPkdldFVuaWNvZGVUZXh0KCkgPT0gb3B0X3ZhbHVlICYmIChpbnQpaSA9PSBpUG9zKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlNldEl0ZW1TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ29tYm9Cb3ggfHwgR2V0VHlwZSgpID09IExpc3RCb3gpOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBvcHRfdmFsdWUgPSBHZXRPcHRpb25WYWx1ZShpbmRleCk7Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIGludCBpUmV0ID0gMDsKLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7Ci0gICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIG9wdF92YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgewotICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIG9wdF92YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFiU2VsZWN0ZWQpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7Ci0gICAgICAgIGlmIChwVmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKG1fVHlwZSA9PSBMaXN0Qm94KSB7Ci0gICAgICAgICAgICAgICAgU2VsZWN0T3B0aW9uKGluZGV4LCBGQUxTRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKSA9PSBvcHRfdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KCJWIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IGlDb3VudCA9IENvdW50T3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNJdGVtU2VsZWN0ZWQoaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X3ZhbHVlID0gR2V0T3B0aW9uVmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkU3RyaW5nKFBERl9FbmNvZGVUZXh0KG9wdF92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocEFycmF5LT5HZXRDb3VudCgpIDwgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdCgiViIsIHBBcnJheSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fVHlwZSA9PSBDb21ib0JveCkgewotICAgICAgICAgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KCJWIik7Ci0gICAgICAgICAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIkkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIExvYWREQSgpOworICB9IGVsc2UgaWYgKHR5cGVfbmFtZSA9PSAiQ2giKSB7CisgICAgaWYgKGZsYWdzICYgMHgyMDAwMCkgeworICAgICAgbV9UeXBlID0gQ29tYm9Cb3g7CisgICAgICBpZiAoZmxhZ3MgJiAweDQwMDAwKSB7CisgICAgICAgIG1fRmxhZ3MgfD0gRk9STUNPTUJPX0VESVQ7CisgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1fVHlwZSA9PSBMaXN0Qm94KSB7Ci0gICAgICAgICAgICBTZWxlY3RPcHRpb24oaW5kZXgsIFRSVUUpOwotICAgICAgICAgICAgaWYgKCEobV9GbGFncyAmIEZPUk1MSVNUX01VTFRJU0VMRUNUKSkgewotICAgICAgICAgICAgICAgIG1fcERpY3QtPlNldEF0U3RyaW5nKCJWIiwgUERGX0VuY29kZVRleHQob3B0X3ZhbHVlKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwotICAgICAgICAgICAgICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkOwotICAgICAgICAgICAgICAgIGludCBpQ291bnQgPSBDb3VudE9wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlNlbGVjdGVkID0gSXNJdGVtU2VsZWN0ZWQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2VsZWN0ZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGRTdHJpbmcoUERGX0VuY29kZVRleHQob3B0X3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wRGljdC0+U2V0QXQoIlYiLCBwQXJyYXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1fVHlwZSA9PSBDb21ib0JveCkgewotICAgICAgICAgICAgbV9wRGljdC0+U2V0QXRTdHJpbmcoIlYiLCBQREZfRW5jb2RlVGV4dChvcHRfdmFsdWUpKTsKLSAgICAgICAgICAgIENQREZfQXJyYXkqIHBJID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7Ci0gICAgICAgICAgICBpZiAocEkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBJLT5BZGRJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgIG1fcERpY3QtPlNldEF0KCJJIiwgcEkpOwotICAgICAgICB9CisgICAgICBtX1R5cGUgPSBMaXN0Qm94OworICAgICAgaWYgKGZsYWdzICYgMHgyMDAwMDApIHsKKyAgICAgICAgbV9GbGFncyB8PSBGT1JNTElTVF9NVUxUSVNFTEVDVDsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgewotICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgewotICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoQ1BERl9JbnRlckZvcm06Om1fYlVwZGF0ZUFQKSB7Ci0gICAgICAgIFVwZGF0ZUFQKE5VTEwpOwotICAgIH0KLSAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBMb2FkREEoKTsKKyAgfSBlbHNlIGlmICh0eXBlX25hbWUgPT0gIlNpZyIpIHsKKyAgICBtX1R5cGUgPSBTaWduOworICB9CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ29tYm9Cb3ggfHwgR2V0VHlwZSgpID09IExpc3RCb3gpOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgaURWSW5kZXggPSBHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCk7Ci0gICAgaWYgKGlEVkluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiAoaURWSW5kZXggPT0gaW5kZXgpOworQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldEZ1bGxOYW1lKCkgeworICByZXR1cm4gOjpHZXRGdWxsTmFtZShtX3BEaWN0KTsKIH0KLWludCBDUERGX0Zvcm1GaWVsZDo6R2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpCi17Ci0gICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDb21ib0JveCB8fCBHZXRUeXBlKCkgPT0gTGlzdEJveCk7Ci0gICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEViIpOwotICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIGNzRFYgPSBwVmFsdWUtPkdldFVuaWNvZGVUZXh0KCk7Ci0gICAgaWYgKGNzRFYuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IGlDb3VudCA9IENvdW50T3B0aW9ucygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgIGlmIChjc0RWID09IEdldE9wdGlvblZhbHVlKGkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci12b2lkIENQREZfRm9ybUZpZWxkOjpVcGRhdGVBUChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCkKLXsKLSAgICBpZiAobV9UeXBlID09IFB1c2hCdXR0b24pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9UeXBlID09IFJhZGlvQnV0dG9uIHx8IG1fVHlwZSA9PSBDaGVja0JveCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghbV9wRm9ybS0+bV9iR2VuZXJhdGVBUCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ291bnRDb250cm9scygpOyBpICsrKSB7Ci0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Q29udHJvbChpKTsKLSAgICAgICAgRlBERl9HZW5lcmF0ZUFQKG1fcEZvcm0tPm1fcERvY3VtZW50LCBwQ29udHJvbC0+bV9wV2lkZ2V0RGljdCk7Ci0gICAgfQotfQotaW50IENQREZfRm9ybUZpZWxkOjpDb3VudE9wdGlvbnMoKQotewotICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiT3B0Iik7Ci0gICAgaWYgKHBWYWx1ZSA9PSBOVUxMIHx8IHBWYWx1ZS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuICgoQ1BERl9BcnJheSopcFZhbHVlKS0+R2V0Q291bnQoKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRPcHRpb25UZXh0KGludCBpbmRleCwgaW50IHN1Yl9pbmRleCkKLXsKLSAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIk9wdCIpOwotICAgIGlmIChwVmFsdWUgPT0gTlVMTCB8fCBwVmFsdWUtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwT3B0aW9uID0gKChDUERGX0FycmF5KilwVmFsdWUpLT5HZXRFbGVtZW50VmFsdWUoaW5kZXgpOwotICAgIGlmIChwT3B0aW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIGlmIChwT3B0aW9uLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHBPcHRpb24gPSAoKENQREZfQXJyYXkqKXBPcHRpb24pLT5HZXRFbGVtZW50VmFsdWUoc3ViX2luZGV4KTsKLSAgICB9Ci0gICAgaWYgKHBPcHRpb24gPT0gTlVMTCB8fCBwT3B0aW9uLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUklORykgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuICgoQ1BERl9TdHJpbmcqKXBPcHRpb24pLT5HZXRVbmljb2RlVGV4dCgpOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldE9wdGlvbkxhYmVsKGludCBpbmRleCkKLXsKLSAgICByZXR1cm4gR2V0T3B0aW9uVGV4dChpbmRleCwgMSk7Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0T3B0aW9uVmFsdWUoaW50IGluZGV4KQotewotICAgIHJldHVybiBHZXRPcHRpb25UZXh0KGluZGV4LCAwKTsKLX0KLWludCBDUERGX0Zvcm1GaWVsZDo6RmluZE9wdGlvbihDRlhfV2lkZVN0cmluZyBjc09wdExhYmVsKQotewotICAgIGludCBpQ291bnQgPSBDb3VudE9wdGlvbnMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlID0gR2V0T3B0aW9uVmFsdWUoaSk7Ci0gICAgICAgIGlmIChjc1ZhbHVlID09IGNzT3B0TGFiZWwpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLWludCBDUERGX0Zvcm1GaWVsZDo6RmluZE9wdGlvblZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc09wdFZhbHVlLCBpbnQgaVN0YXJ0SW5kZXgpCi17Ci0gICAgaWYgKGlTdGFydEluZGV4IDwgMCkgewotICAgICAgICBpU3RhcnRJbmRleCA9IDA7Ci0gICAgfQotICAgIGludCBpQ291bnQgPSBDb3VudE9wdGlvbnMoKTsKLSAgICBmb3IgKDsgaVN0YXJ0SW5kZXggPCBpQ291bnQ7IGlTdGFydEluZGV4ICsrKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWUgPSBHZXRPcHRpb25WYWx1ZShpU3RhcnRJbmRleCk7Ci0gICAgICAgIGlmIChjc1ZhbHVlID09IGNzT3B0VmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBpU3RhcnRJbmRleDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci1pbnQgQ1BERl9Gb3JtRmllbGQ6Okluc2VydE9wdGlvbihDRlhfV2lkZVN0cmluZyBjc09wdExhYmVsLCBpbnQgaW5kZXgsIEZYX0JPT0wgYk5vdGlmeSkNCi17DQotICAgIGlmIChjc09wdExhYmVsLklzRW1wdHkoKSkgcmV0dXJuIC0xOw0KLQ0KLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpDQotICAgIHsNCi0gICAgICAgIGludCBpUmV0ID0gMDsNCi0gICAgICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc09wdExhYmVsKTsNCi0gICAgICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc09wdExhYmVsKTsNCi0gICAgICAgIGlmIChpUmV0IDwgMCkgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIENGWF9CeXRlU3RyaW5nIGNzU3RyID0gUERGX0VuY29kZVRleHQoY3NPcHRMYWJlbCwgY3NPcHRMYWJlbC5HZXRMZW5ndGgoKSk7DQotICAgIENQREZfQXJyYXkqIHBPcHQgPSBOVUxMOw0KLSAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIk9wdCIpOw0KLSAgICBpZiAocFZhbHVlID09IE5VTEwgfHwgcFZhbHVlLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKQ0KLSAgICB7DQotICAgICAgICBwT3B0ID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7DQotICAgICAgICBpZiAocE9wdCA9PSBOVUxMKSByZXR1cm4gLTE7DQotICAgICAgICBtX3BEaWN0LT5TZXRBdCgiT3B0IiwgcE9wdCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICAgICAgcE9wdCA9IChDUERGX0FycmF5KilwVmFsdWU7DQotICAgIGludCBpQ291bnQgPSAoaW50KXBPcHQtPkdldENvdW50KCk7DQotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaUNvdW50KQ0KLSAgICB7DQotICAgICAgICBwT3B0LT5BZGRTdHJpbmcoY3NTdHIpOw0KLSAgICAgICAgaW5kZXggPSBpQ291bnQ7DQotICAgIH0NCi0gICAgZWxzZSB7DQotICAgICAgICBDUERGX1N0cmluZyogcFN0cmluZyA9IENQREZfU3RyaW5nOjpDcmVhdGUoY3NTdHIpOw0KLSAgICAgICAgaWYgKHBTdHJpbmcgPT0gTlVMTCkgcmV0dXJuIC0xOw0KLSAgICAgICAgcE9wdC0+SW5zZXJ0QXQoaW5kZXgsIHBTdHJpbmcpOw0KLSAgICB9DQotDQotICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkNCi0gICAgew0KLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsNCi0gICAgICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7DQotICAgIH0NCi0gICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7DQotICAgIHJldHVybiBpbmRleDsNCi19Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpDbGVhck9wdGlvbnMoRlhfQk9PTCBiTm90aWZ5KQ0KLXsNCi0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICBpbnQgaVJldCA9IDA7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlOw0KLSAgICAgICAgaW50IGlJbmRleCA9IEdldFNlbGVjdGVkSW5kZXgoMCk7DQotICAgICAgICBpZiAoaUluZGV4ID49IDApIGNzVmFsdWUgPSBHZXRPcHRpb25MYWJlbChpSW5kZXgpOw0KLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOw0KLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOw0KLSAgICAgICAgaWYgKGlSZXQgPCAwKSByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0NCi0gICAgbV9wRGljdC0+UmVtb3ZlQXQoIk9wdCIpOw0KLSAgICBtX3BEaWN0LT5SZW1vdmVBdCgiViIpOw0KLSAgICBtX3BEaWN0LT5SZW1vdmVBdCgiRFYiKTsNCi0gICAgbV9wRGljdC0+UmVtb3ZlQXQoIkkiKTsNCi0gICAgbV9wRGljdC0+UmVtb3ZlQXQoIlRJIik7DQotDQotICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkNCi0gICAgew0KLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsNCi0gICAgICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7DQotICAgIH0NCi0NCi0gICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7DQotICAgIHJldHVybiBUUlVFOw0KLX0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQ29udHJvbChpbnQgaUNvbnRyb2xJbmRleCwgRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5KQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKTsKLSAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaUNvbnRyb2xJbmRleCk7Ci0gICAgaWYgKHBDb250cm9sID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIWJDaGVja2VkICYmIHBDb250cm9sLT5Jc0NoZWNrZWQoKSA9PSBiQ2hlY2tlZCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9CeXRlQXJyYXkgc3RhdHVzQXJyYXk7Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpSZXNldEZpZWxkKEZYX0JPT0wgYk5vdGlmeSkgeworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94OgorICAgIGNhc2UgQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uOiB7CisgICAgICBDRlhfQnl0ZUFycmF5IHN0YXR1c0FycmF5OworICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CiAgICAgICAgIFNhdmVDaGVja2VkRmllbGRTdGF0dXModGhpcywgc3RhdHVzQXJyYXkpOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBjc1dFeHBvcnQgPSBwQ29udHJvbC0+R2V0RXhwb3J0VmFsdWUoKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0JFeHBvcnQgPSBQREZfRW5jb2RlVGV4dChjc1dFeHBvcnQpOwotICAgIGludCBpQ291bnQgPSBDb3VudENvbnRyb2xzKCk7Ci0gICAgRlhfQk9PTCBiVW5pc29uID0gUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbih0aGlzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IEdldENvbnRyb2woaSk7Ci0gICAgICAgIGlmIChiVW5pc29uKSB7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0VWYWx1ZSA9IHBDdHJsLT5HZXRFeHBvcnRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKGNzRVZhbHVlID09IGNzV0V4cG9ydCkgewotICAgICAgICAgICAgICAgIGlmIChwQ3RybC0+R2V0T25TdGF0ZU5hbWUoKSA9PSBwQ29udHJvbC0+R2V0T25TdGF0ZU5hbWUoKSkgewotICAgICAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKGJDaGVja2VkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDdHJsLT5DaGVja0NvbnRyb2woRkFMU0UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYkNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKEZBTFNFKTsKLSAgICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGludCBpQ291bnQgPSBDb3VudENvbnRyb2xzKCk7CisgICAgICBpZiAoaUNvdW50KSB7CisgICAgICAgIGlmIChQREZfRm9ybUZpZWxkX0lzVW5pc29uKHRoaXMpKSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQ2hlY2tDb250cm9sKGksIEdldENvbnRyb2woaSktPklzRGVmYXVsdENoZWNrZWQoKSwgRkFMU0UpOworICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpID09IGlDb250cm9sSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKGJDaGVja2VkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYkNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKEZBTFNFKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaSk7CisgICAgICAgICAgICBGWF9CT09MIGJDaGVja2VkID0gcENvbnRyb2wtPklzRGVmYXVsdENoZWNrZWQoKTsKKyAgICAgICAgICAgIENoZWNrQ29udHJvbChpLCBiQ2hlY2tlZCwgRkFMU0UpOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLSAgICBDUERGX09iamVjdCogcE9wdCA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJPcHQiKTsKLSAgICBpZiAocE9wdCA9PSBOVUxMIHx8IHBPcHQtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgICAgICBtX3BEaWN0LT5TZXRBdE5hbWUoIlYiLCBjc0JFeHBvcnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NWOwotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBWID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKLSAgICAgICAgICAgIGlmIChwViAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY3NWID0gcFYtPkdldFN0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNzViA9PSBjc0JFeHBvcnQpIHsKLSAgICAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdE5hbWUoIlYiLCAiT2ZmIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNzSW5kZXg7Ci0gICAgICAgIGNzSW5kZXguRm9ybWF0KCIlZCIsIGlDb250cm9sSW5kZXgpOwotICAgICAgICBtX3BEaWN0LT5TZXRBdE5hbWUoIlYiLCBjc0luZGV4KTsKLSAgICB9Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgICB9CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJDaGVja2VkU3RhdHVzQ2hhbmdlKHRoaXMsIHN0YXR1c0FycmF5KTsKLSAgICB9Ci0gICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpDb21ib0JveDogeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKKyAgICAgIENsZWFyU2VsZWN0aW9uKCk7CisgICAgICBpbnQgaUluZGV4ID0gR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpOworICAgICAgaWYgKGlJbmRleCA+PSAwKSB7CisgICAgICAgIGNzVmFsdWUgPSBHZXRPcHRpb25MYWJlbChpSW5kZXgpOworICAgICAgfQorICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CisgICAgICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIFRSVUUpOworICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpMaXN0Qm94OiB7CisgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlOworICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsKKyAgICAgIGludCBpSW5kZXggPSBHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCk7CisgICAgICBpZiAoaUluZGV4ID49IDApIHsKKyAgICAgICAgY3NWYWx1ZSA9IEdldE9wdGlvbkxhYmVsKGlJbmRleCk7CisgICAgICB9CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NWYWx1ZSk7CisgICAgICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIFRSVUUpOworICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHRoaXMpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBDUERGX0Zvcm1GaWVsZDo6VGV4dDoKKyAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpSaWNoVGV4dDoKKyAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpGaWxlOgorICAgIGRlZmF1bHQ6IHsKKyAgICAgIENQREZfT2JqZWN0KiBwRFYgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRFYiKTsKKyAgICAgIENGWF9XaWRlU3RyaW5nIGNzRFZhbHVlOworICAgICAgaWYgKHBEViAhPSBOVUxMKSB7CisgICAgICAgIGNzRFZhbHVlID0gcERWLT5HZXRVbmljb2RlVGV4dCgpOworICAgICAgfQorICAgICAgQ1BERl9PYmplY3QqIHBWID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKKyAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWU7CisgICAgICBpZiAocFYgIT0gTlVMTCkgeworICAgICAgICBjc1ZhbHVlID0gcFYtPkdldFVuaWNvZGVUZXh0KCk7CisgICAgICB9CisgICAgICBDUERGX09iamVjdCogcFJWID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlJWIik7CisgICAgICBpZiAoIXBSViAmJiAoY3NEVmFsdWUgPT0gY3NWYWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NEVmFsdWUpOworICAgICAgICBpZiAoaVJldCA8IDApIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChwRFYgPT0gTlVMTCkgeworICAgICAgICBtX3BEaWN0LT5SZW1vdmVBdCgiViIpOworICAgICAgICBtX3BEaWN0LT5SZW1vdmVBdCgiUlYiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENQREZfT2JqZWN0KiBwQ2xvbmUgPSBwRFYtPkNsb25lKCk7CisgICAgICAgIGlmIChwQ2xvbmUgPT0gTlVMTCkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBtX3BEaWN0LT5TZXRBdCgiViIsIHBDbG9uZSk7CisgICAgICAgIGlmIChwUlYpIHsKKyAgICAgICAgICBDUERGX09iamVjdCogcENsb25lUiA9IHBEVi0+Q2xvbmUoKTsKKyAgICAgICAgICBtX3BEaWN0LT5TZXRBdCgiUlYiLCBwQ2xvbmVSKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7CisgICAgICB9CisgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgICB9IGJyZWFrOworICB9CisgIHJldHVybiBUUlVFOwogfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldENoZWNrVmFsdWUoRlhfQk9PTCBiRGVmYXVsdCkKLXsKLSAgICBBU1NFUlQoR2V0VHlwZSgpID09IENoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBSYWRpb0J1dHRvbik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NFeHBvcnQgPSBMIk9mZiI7Ci0gICAgRlhfQk9PTCBiQ2hlY2tlZDsKLSAgICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Q29udHJvbChpKTsKK2ludCBDUERGX0Zvcm1GaWVsZDo6R2V0Q29udHJvbEluZGV4KGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKSB7CisgIGlmIChwQ29udHJvbCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBpQ291bnQgPSBtX0NvbnRyb2xMaXN0LkdldFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGaW5kID0gKENQREZfRm9ybUNvbnRyb2wqKW1fQ29udHJvbExpc3QuR2V0QXQoaSk7CisgICAgaWYgKHBGaW5kID09IHBDb250cm9sKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOworfQoraW50IENQREZfRm9ybUZpZWxkOjpHZXRGaWVsZFR5cGUoKSB7CisgIHN3aXRjaCAobV9UeXBlKSB7CisgICAgY2FzZSBQdXNoQnV0dG9uOgorICAgICAgcmV0dXJuIEZJRUxEVFlQRV9QVVNIQlVUVE9OOworICAgIGNhc2UgQ2hlY2tCb3g6CisgICAgICByZXR1cm4gRklFTERUWVBFX0NIRUNLQk9YOworICAgIGNhc2UgUmFkaW9CdXR0b246CisgICAgICByZXR1cm4gRklFTERUWVBFX1JBRElPQlVUVE9OOworICAgIGNhc2UgQ29tYm9Cb3g6CisgICAgICByZXR1cm4gRklFTERUWVBFX0NPTUJPQk9YOworICAgIGNhc2UgTGlzdEJveDoKKyAgICAgIHJldHVybiBGSUVMRFRZUEVfTElTVEJPWDsKKyAgICBjYXNlIFRleHQ6CisgICAgY2FzZSBSaWNoVGV4dDoKKyAgICBjYXNlIEZpbGU6CisgICAgICByZXR1cm4gRklFTERUWVBFX1RFWFRGSUVMRDsKKyAgICBjYXNlIFNpZ246CisgICAgICByZXR1cm4gRklFTERUWVBFX1NJR05BVFVSRTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEZJRUxEVFlQRV9VTktOT1dOOworfQorQ1BERl9BQWN0aW9uIENQREZfRm9ybUZpZWxkOjpHZXRBZGRpdGlvbmFsQWN0aW9uKCkgeworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJBQSIpOworICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHBPYmotPkdldERpY3QoKTsKK30KK0NGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRBbHRlcm5hdGVOYW1lKCkgeworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJUVSIpOworICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEwiIjsKKyAgfQorICByZXR1cm4gcE9iai0+R2V0VW5pY29kZVRleHQoKTsKK30KK0NGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRNYXBwaW5nTmFtZSgpIHsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiVE0iKTsKKyAgaWYgKHBPYmogPT0gTlVMTCkgeworICAgIHJldHVybiBMIiI7CisgIH0KKyAgcmV0dXJuIHBPYmotPkdldFVuaWNvZGVUZXh0KCk7Cit9CitGWF9EV09SRCBDUERGX0Zvcm1GaWVsZDo6R2V0RmllbGRGbGFncygpIHsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRmYiKTsKKyAgaWYgKHBPYmogPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBwT2JqLT5HZXRJbnRlZ2VyKCk7Cit9CitDRlhfQnl0ZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0RGVmYXVsdFN0eWxlKCkgeworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEUyIpOworICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuICIiOworICB9CisgIHJldHVybiBwT2JqLT5HZXRTdHJpbmcoKTsKK30KK0NGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRSaWNoVGV4dFN0cmluZygpIHsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiUlYiKTsKKyAgaWYgKHBPYmogPT0gTlVMTCkgeworICAgIHJldHVybiBMIiI7CisgIH0KKyAgcmV0dXJuIHBPYmotPkdldFVuaWNvZGVUZXh0KCk7Cit9CitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0VmFsdWUoRlhfQk9PTCBiRGVmYXVsdCkgeworICBpZiAoR2V0VHlwZSgpID09IENoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBSYWRpb0J1dHRvbikgeworICAgIHJldHVybiBHZXRDaGVja1ZhbHVlKGJEZWZhdWx0KTsKKyAgfQorICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgYkRlZmF1bHQgPyAiRFYiIDogIlYiKTsKKyAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7CisgICAgaWYgKCFiRGVmYXVsdCkgeworICAgICAgaWYgKG1fVHlwZSA9PSBSaWNoVGV4dCkgeworICAgICAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOworICAgICAgfQorICAgICAgaWYgKHBWYWx1ZSA9PSBOVUxMICYmIG1fVHlwZSAhPSBUZXh0KSB7CisgICAgICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEViIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocFZhbHVlID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIH0KKyAgfQorICBzd2l0Y2ggKHBWYWx1ZS0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSBQREZPQkpfU1RSSU5HOgorICAgIGNhc2UgUERGT0JKX1NUUkVBTToKKyAgICAgIHJldHVybiBwVmFsdWUtPkdldFVuaWNvZGVUZXh0KCk7CisgICAgY2FzZSBQREZPQkpfQVJSQVk6CisgICAgICBwVmFsdWUgPSAoKENQREZfQXJyYXkqKXBWYWx1ZSktPkdldEVsZW1lbnRWYWx1ZSgwKTsKKyAgICAgIGlmIChwVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFZhbHVlKCkgeworICByZXR1cm4gR2V0VmFsdWUoRkFMU0UpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldERlZmF1bHRWYWx1ZSgpIHsKKyAgcmV0dXJuIEdldFZhbHVlKFRSVUUpOworfQorRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSkgeworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgQ2hlY2tCb3g6CisgICAgY2FzZSBSYWRpb0J1dHRvbjogeworICAgICAgU2V0Q2hlY2tWYWx1ZSh2YWx1ZSwgYkRlZmF1bHQsIGJOb3RpZnkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGNhc2UgRmlsZToKKyAgICBjYXNlIFJpY2hUZXh0OgorICAgIGNhc2UgVGV4dDoKKyAgICBjYXNlIENvbWJvQm94OiB7CisgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlID0gdmFsdWU7CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKKyAgICAgICAgaWYgKGlSZXQgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbnQgaUluZGV4ID0gRmluZE9wdGlvblZhbHVlKGNzVmFsdWUpOworICAgICAgaWYgKGlJbmRleCA8IDApIHsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGVUZXh0ID0gUERGX0VuY29kZVRleHQoY3NWYWx1ZSk7CisgICAgICAgIG1fcERpY3QtPlNldEF0U3RyaW5nKGJEZWZhdWx0ID8gIkRWIiA6ICJWIiwgYnNFbmNvZGVUZXh0KTsKKyAgICAgICAgaWYgKG1fVHlwZSA9PSBSaWNoVGV4dCAmJiAhYkRlZmF1bHQpIHsKKyAgICAgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZygiUlYiLCBic0VuY29kZVRleHQpOworICAgICAgICB9CisgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KCJJIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZyhiRGVmYXVsdCA/ICJEViIgOiAiViIsIFBERl9FbmNvZGVUZXh0KGNzVmFsdWUpKTsKICAgICAgICAgaWYgKGJEZWZhdWx0KSB7Ci0gICAgICAgICAgICBiQ2hlY2tlZCA9IHBDb250cm9sLT5Jc0RlZmF1bHRDaGVja2VkKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiQ2hlY2tlZCA9IHBDb250cm9sLT5Jc0NoZWNrZWQoKTsKKyAgICAgICAgICBDbGVhclNlbGVjdGlvbigpOworICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCBUUlVFKTsKICAgICAgICAgfQotICAgICAgICBpZiAoYkNoZWNrZWQpIHsKLSAgICAgICAgICAgIGNzRXhwb3J0ID0gcENvbnRyb2wtPkdldEV4cG9ydFZhbHVlKCk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgeworICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOworICAgICAgfQorICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgICAgfSBicmVhazsKKyAgICBjYXNlIExpc3RCb3g6IHsKKyAgICAgIGludCBpSW5kZXggPSBGaW5kT3B0aW9uVmFsdWUodmFsdWUpOworICAgICAgaWYgKGlJbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaWYgKGJEZWZhdWx0ICYmIGlJbmRleCA9PSBHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCkpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NWYWx1ZSk7CisgICAgICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGJEZWZhdWx0KSB7CisgICAgICB9IGVsc2UgeworICAgICAgICBDbGVhclNlbGVjdGlvbigpOworICAgICAgICBTZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSk7CisgICAgICB9CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKKyAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7CisgICAgICB9CisgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gY3NFeHBvcnQ7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVApIHsKKyAgICBVcGRhdGVBUChOVUxMKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9CT09MIGJOb3RpZnkpCi17Ci0gICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gUmFkaW9CdXR0b24pOwotICAgIENGWF9CeXRlQXJyYXkgc3RhdHVzQXJyYXk7Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIFNhdmVDaGVja2VkRmllbGRTdGF0dXModGhpcywgc3RhdHVzQXJyYXkpOworRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJOb3RpZnkpIHsKKyAgcmV0dXJuIFNldFZhbHVlKHZhbHVlLCBGQUxTRSwgYk5vdGlmeSk7Cit9CitpbnQgQ1BERl9Gb3JtRmllbGQ6OkdldE1heExlbigpIHsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiTWF4TGVuIik7CisgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICBpbnQgaUNvdW50ID0gbV9Db250cm9sTGlzdC5HZXRTaXplKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSAoQ1BERl9Gb3JtQ29udHJvbCopbV9Db250cm9sTGlzdC5HZXRBdChpKTsKKyAgICAgIGlmIChwQ29udHJvbCA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCA9IHBDb250cm9sLT5tX3BXaWRnZXREaWN0OworICAgICAgaWYgKHBXaWRnZXREaWN0LT5LZXlFeGlzdCgiTWF4TGVuIikpIHsKKyAgICAgICAgcmV0dXJuIHBXaWRnZXREaWN0LT5HZXRJbnRlZ2VyKCJNYXhMZW4iKTsKKyAgICAgIH0KICAgICB9Ci0gICAgaW50IGlDb3VudCA9IENvdW50Q29udHJvbHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaSk7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzRXhwb3J0ID0gcENvbnRyb2wtPkdldEV4cG9ydFZhbHVlKCk7Ci0gICAgICAgIGlmIChjc0V4cG9ydCA9PSB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGJEZWZhdWx0KSB7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChHZXRDb250cm9sSW5kZXgocENvbnRyb2wpLCBUUlVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGJEZWZhdWx0KSB7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChHZXRDb250cm9sSW5kZXgocENvbnRyb2wpLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gcE9iai0+R2V0SW50ZWdlcigpOworfQoraW50IENQREZfRm9ybUZpZWxkOjpDb3VudFNlbGVjdGVkSXRlbXMoKSB7CisgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOworICBpZiAocFZhbHVlID09IE5VTEwpIHsKKyAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiSSIpOworICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UodGhpcywgc3RhdHVzQXJyYXkpOworICB9CisgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSSU5HKSB7CisgICAgaWYgKHBWYWx1ZS0+R2V0U3RyaW5nKCkuSXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKKyAgICBpZiAocFZhbHVlLT5HZXRTdHJpbmcoKS5Jc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuICgoQ1BERl9BcnJheSopcFZhbHVlKS0+R2V0Q291bnQoKTsKK30KK2ludCBDUERGX0Zvcm1GaWVsZDo6R2V0U2VsZWN0ZWRJbmRleChpbnQgaW5kZXgpIHsKKyAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7CisgIGlmIChwVmFsdWUgPT0gTlVMTCkgeworICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7CisgICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7CisgICAgcmV0dXJuIHBWYWx1ZS0+R2V0SW50ZWdlcigpOworICB9CisgIENGWF9XaWRlU3RyaW5nIHNlbF92YWx1ZTsKKyAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKKyAgICBpZiAoaW5kZXggIT0gMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzZWxfdmFsdWUgPSBwVmFsdWUtPkdldFVuaWNvZGVUZXh0KCk7CisgIH0gZWxzZSB7CisgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIENQREZfT2JqZWN0KiBlbGVtZW50VmFsdWUgPSAoKENQREZfQXJyYXkqKXBWYWx1ZSktPkdldEVsZW1lbnRWYWx1ZShpbmRleCk7CisgICAgc2VsX3ZhbHVlID0KKyAgICAgICAgZWxlbWVudFZhbHVlID8gZWxlbWVudFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpIDogQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorICBpZiAoaW5kZXggPCBDb3VudFNlbGVjdGVkT3B0aW9ucygpKSB7CisgICAgaW50IGlPcHRJbmRleCA9IEdldFNlbGVjdGVkT3B0aW9uSW5kZXgoaW5kZXgpOworICAgIENGWF9XaWRlU3RyaW5nIGNzT3B0ID0gR2V0T3B0aW9uVmFsdWUoaU9wdEluZGV4KTsKKyAgICBpZiAoY3NPcHQgPT0gc2VsX3ZhbHVlKSB7CisgICAgICByZXR1cm4gaU9wdEluZGV4OworICAgIH0KKyAgfQorICBpbnQgbk9wdHMgPSBDb3VudE9wdGlvbnMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuT3B0czsgaSsrKSB7CisgICAgaWYgKHNlbF92YWx1ZSA9PSBHZXRPcHRpb25WYWx1ZShpKSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KK0ZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OkNsZWFyU2VsZWN0aW9uKEZYX0JPT0wgYk5vdGlmeSkgeworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKKyAgICBpbnQgaVJldCA9IDA7CisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKKyAgICBpbnQgaUluZGV4ID0gR2V0U2VsZWN0ZWRJbmRleCgwKTsKKyAgICBpZiAoaUluZGV4ID49IDApIHsKKyAgICAgIGNzVmFsdWUgPSBHZXRPcHRpb25MYWJlbChpSW5kZXgpOworICAgIH0KKyAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpIHsKKyAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NWYWx1ZSk7CisgICAgfQorICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIHsKKyAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKKyAgICB9CisgICAgaWYgKGlSZXQgPCAwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIG1fcERpY3QtPlJlbW92ZUF0KCJWIik7CisgIG1fcERpY3QtPlJlbW92ZUF0KCJJIik7CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgeworICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgeworICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7CisgICAgfQorICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIHsKKyAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7CisgICAgfQorICB9CisgIGlmIChDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVApIHsKKyAgICBVcGRhdGVBUChOVUxMKTsKKyAgfQorICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpJc0l0ZW1TZWxlY3RlZChpbnQgaW5kZXgpIHsKKyAgQVNTRVJUKEdldFR5cGUoKSA9PSBDb21ib0JveCB8fCBHZXRUeXBlKCkgPT0gTGlzdEJveCk7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKElzT3B0aW9uU2VsZWN0ZWQoaW5kZXgpKSB7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci1pbnQgQ1BERl9Gb3JtRmllbGQ6OkdldFRvcFZpc2libGVJbmRleCgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiVEkiKTsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworICB9CisgIENGWF9XaWRlU3RyaW5nIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGluZGV4KTsKKyAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7CisgIGlmIChwVmFsdWUgPT0gTlVMTCkgeworICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7CisgICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiBwT2JqLT5HZXRJbnRlZ2VyKCk7Ci19Ci1pbnQgQ1BERl9Gb3JtRmllbGQ6OkNvdW50U2VsZWN0ZWRPcHRpb25zKCkKLXsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7Ci0gICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKLSAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAoaW50KXBBcnJheS0+R2V0Q291bnQoKTsKLX0KLWludCBDUERGX0Zvcm1GaWVsZDo6R2V0U2VsZWN0ZWRPcHRpb25JbmRleChpbnQgaW5kZXgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiSSIpOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwT2JqLT5HZXRBcnJheSgpOwotICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBpQ291bnQgPSAoaW50KXBBcnJheS0+R2V0Q291bnQoKTsKLSAgICBpZiAoaUNvdW50ID4gMCAmJiBpbmRleCA8IGlDb3VudCkgewotICAgICAgICByZXR1cm4gcEFycmF5LT5HZXRJbnRlZ2VyKGluZGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6SXNPcHRpb25TZWxlY3RlZChpbnQgaU9wdEluZGV4KQotewotICAgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKTsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKLSAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgaUNvdW50ID0gKGludClwQXJyYXktPkdldENvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgaWYgKHBBcnJheS0+R2V0SW50ZWdlcihpKSA9PSBpT3B0SW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9CisgIH0KKyAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKKyAgICBpZiAocFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpID09IG9wdF92YWx1ZSkgeworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgeworICAgIGlmIChwVmFsdWUtPkdldFN0cmluZygpLklzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAocFZhbHVlLT5HZXRJbnRlZ2VyKCkgPT0gaW5kZXgpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcFZhbHVlOworICBpbnQgaVBvcyA9IC0xOworICBmb3IgKGludCBqID0gMDsgaiA8IENvdW50U2VsZWN0ZWRPcHRpb25zKCk7IGorKykgeworICAgIGlmIChHZXRTZWxlY3RlZE9wdGlvbkluZGV4KGopID09IGluZGV4KSB7CisgICAgICBpUG9zID0gajsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspCisgICAgaWYgKHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpLT5HZXRVbmljb2RlVGV4dCgpID09IG9wdF92YWx1ZSAmJgorICAgICAgICAoaW50KWkgPT0gaVBvcykgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZWxlY3RPcHRpb24oaW50IGlPcHRJbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQsIEZYX0JPT0wgYk5vdGlmeSkKLXsKLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BEaWN0LT5HZXRBcnJheSgiSSIpOwotICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICBpZiAoIWJTZWxlY3RlZCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcEFycmF5ID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7Ci0gICAgICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgeworRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2V0SXRlbVNlbGVjdGlvbihpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsKKyAgQVNTRVJUKEdldFR5cGUoKSA9PSBDb21ib0JveCB8fCBHZXRUeXBlKCkgPT0gTGlzdEJveCk7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgb3B0X3ZhbHVlID0gR2V0T3B0aW9uVmFsdWUoaW5kZXgpOworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKKyAgICBpbnQgaVJldCA9IDA7CisgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7CisgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIG9wdF92YWx1ZSk7CisgICAgfQorICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIHsKKyAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBvcHRfdmFsdWUpOworICAgIH0KKyAgICBpZiAoaVJldCA8IDApIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgaWYgKCFiU2VsZWN0ZWQpIHsKKyAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKKyAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsKKyAgICAgIGlmIChtX1R5cGUgPT0gTGlzdEJveCkgeworICAgICAgICBTZWxlY3RPcHRpb24oaW5kZXgsIEZBTFNFKTsKKyAgICAgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKKyAgICAgICAgICBpZiAocFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpID09IG9wdF92YWx1ZSkgeworICAgICAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIlYiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7CisgICAgICAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICAgIGludCBpQ291bnQgPSBDb3VudE9wdGlvbnMoKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSAhPSBpbmRleCkgeworICAgICAgICAgICAgICBpZiAoSXNJdGVtU2VsZWN0ZWQoaSkpIHsKKyAgICAgICAgICAgICAgICBvcHRfdmFsdWUgPSBHZXRPcHRpb25WYWx1ZShpKTsKKyAgICAgICAgICAgICAgICBwQXJyYXktPkFkZFN0cmluZyhQREZfRW5jb2RlVGV4dChvcHRfdmFsdWUpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocEFycmF5LT5HZXRDb3VudCgpIDwgMSkgeworICAgICAgICAgICAgcEFycmF5LT5SZWxlYXNlKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fcERpY3QtPlNldEF0KCJWIiwgcEFycmF5KTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbV9wRGljdC0+U2V0QXQoIkkiLCBwQXJyYXkpOworICAgICAgfSBlbHNlIGlmIChtX1R5cGUgPT0gQ29tYm9Cb3gpIHsKKyAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIlYiKTsKKyAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIkkiKTsKKyAgICAgIH0KICAgICB9Ci0gICAgRlhfQk9PTCBiUmV0dXJuID0gRkFMU0U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXBBcnJheS0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICBpbnQgaUZpbmQgPSBwQXJyYXktPkdldEludGVnZXIoaSk7Ci0gICAgICAgIGlmIChpRmluZCA9PSBpT3B0SW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChiU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGludCBpUmV0ID0gMDsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaU9wdEluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpIHsKLSAgICAgICAgICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgewotICAgICAgICAgICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFycmF5LT5SZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGJSZXR1cm4gPSBUUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoaUZpbmQgPiBpT3B0SW5kZXgpIHsKLSAgICAgICAgICAgIGlmICghYlNlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaVJldCA9IDA7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZSA9IEdldE9wdGlvbkxhYmVsKGlPcHRJbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIHsKLSAgICAgICAgICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENQREZfTnVtYmVyKiBwTnVtID0gQ1BERl9OdW1iZXI6OkNyZWF0ZShpT3B0SW5kZXgpOwotICAgICAgICAgICAgaWYgKHBOdW0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaSwgcE51bSk7Ci0gICAgICAgICAgICBiUmV0dXJuID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOworICB9IGVsc2UgeworICAgIGlmIChtX1R5cGUgPT0gTGlzdEJveCkgeworICAgICAgU2VsZWN0T3B0aW9uKGluZGV4LCBUUlVFKTsKKyAgICAgIGlmICghKG1fRmxhZ3MgJiBGT1JNTElTVF9NVUxUSVNFTEVDVCkpIHsKKyAgICAgICAgbV9wRGljdC0+U2V0QXRTdHJpbmcoIlYiLCBQREZfRW5jb2RlVGV4dChvcHRfdmFsdWUpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOworICAgICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KKyAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQ7CisgICAgICAgIGludCBpQ291bnQgPSBDb3VudE9wdGlvbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgICAgIGlmIChpICE9IGluZGV4KSB7CisgICAgICAgICAgICBiU2VsZWN0ZWQgPSBJc0l0ZW1TZWxlY3RlZChpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYlNlbGVjdGVkID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGJTZWxlY3RlZCkgeworICAgICAgICAgICAgb3B0X3ZhbHVlID0gR2V0T3B0aW9uVmFsdWUoaSk7CisgICAgICAgICAgICBwQXJyYXktPkFkZFN0cmluZyhQREZfRW5jb2RlVGV4dChvcHRfdmFsdWUpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9wRGljdC0+U2V0QXQoIlYiLCBwQXJyYXkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAobV9UeXBlID09IENvbWJvQm94KSB7CisgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZygiViIsIFBERl9FbmNvZGVUZXh0KG9wdF92YWx1ZSkpOworICAgICAgQ1BERl9BcnJheSogcEkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKKyAgICAgIGlmIChwSSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIHBJLT5BZGRJbnRlZ2VyKGluZGV4KTsKKyAgICAgIG1fcERpY3QtPlNldEF0KCJJIiwgcEkpOwogICAgIH0KLSAgICBpZiAoIWJSZXR1cm4pIHsKLSAgICAgICAgaWYgKGJTZWxlY3RlZCkgewotICAgICAgICAgICAgcEFycmF5LT5BZGRJbnRlZ2VyKGlPcHRJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtX3BEaWN0LT5SZW1vdmVBdCgiSSIpOwotICAgICAgICB9CisgIH0KKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7CisgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKICAgICB9Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgewotICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgewotICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKLSAgICAgICAgfQorICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIHsKKyAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7CiAgICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVApIHsKKyAgICBVcGRhdGVBUChOVUxMKTsKKyAgfQorICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpDbGVhclNlbGVjdGVkT3B0aW9ucyhGWF9CT09MIGJOb3RpZnkpCi17Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIGludCBpUmV0ID0gMDsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKLSAgICAgICAgaW50IGlJbmRleCA9IEdldFNlbGVjdGVkSW5kZXgoMCk7Ci0gICAgICAgIGlmIChpSW5kZXggPj0gMCkgewotICAgICAgICAgICAgY3NWYWx1ZSA9IEdldE9wdGlvbkxhYmVsKGlJbmRleCk7CitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KSB7CisgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ29tYm9Cb3ggfHwgR2V0VHlwZSgpID09IExpc3RCb3gpOworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IENvdW50T3B0aW9ucygpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBpRFZJbmRleCA9IEdldERlZmF1bHRTZWxlY3RlZEl0ZW0oKTsKKyAgaWYgKGlEVkluZGV4IDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gKGlEVkluZGV4ID09IGluZGV4KTsKK30KK2ludCBDUERGX0Zvcm1GaWVsZDo6R2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpIHsKKyAgQVNTRVJUKEdldFR5cGUoKSA9PSBDb21ib0JveCB8fCBHZXRUeXBlKCkgPT0gTGlzdEJveCk7CisgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRFYiKTsKKyAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIENGWF9XaWRlU3RyaW5nIGNzRFYgPSBwVmFsdWUtPkdldFVuaWNvZGVUZXh0KCk7CisgIGlmIChjc0RWLklzRW1wdHkoKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpbnQgaUNvdW50ID0gQ291bnRPcHRpb25zKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICBpZiAoY3NEViA9PSBHZXRPcHRpb25WYWx1ZShpKSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KK3ZvaWQgQ1BERl9Gb3JtRmllbGQ6OlVwZGF0ZUFQKENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKSB7CisgIGlmIChtX1R5cGUgPT0gUHVzaEJ1dHRvbikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9UeXBlID09IFJhZGlvQnV0dG9uIHx8IG1fVHlwZSA9PSBDaGVja0JveCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIW1fcEZvcm0tPm1fYkdlbmVyYXRlQVApIHsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBDb3VudENvbnRyb2xzKCk7IGkrKykgeworICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Q29udHJvbChpKTsKKyAgICBGUERGX0dlbmVyYXRlQVAobV9wRm9ybS0+bV9wRG9jdW1lbnQsIHBDb250cm9sLT5tX3BXaWRnZXREaWN0KTsKKyAgfQorfQoraW50IENQREZfRm9ybUZpZWxkOjpDb3VudE9wdGlvbnMoKSB7CisgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiT3B0Iik7CisgIGlmIChwVmFsdWUgPT0gTlVMTCB8fCBwVmFsdWUtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gKChDUERGX0FycmF5KilwVmFsdWUpLT5HZXRDb3VudCgpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldE9wdGlvblRleHQoaW50IGluZGV4LCBpbnQgc3ViX2luZGV4KSB7CisgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiT3B0Iik7CisgIGlmIChwVmFsdWUgPT0gTlVMTCB8fCBwVmFsdWUtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorICBDUERGX09iamVjdCogcE9wdGlvbiA9ICgoQ1BERl9BcnJheSopcFZhbHVlKS0+R2V0RWxlbWVudFZhbHVlKGluZGV4KTsKKyAgaWYgKHBPcHRpb24gPT0gTlVMTCkgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisgIGlmIChwT3B0aW9uLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgcE9wdGlvbiA9ICgoQ1BERl9BcnJheSopcE9wdGlvbiktPkdldEVsZW1lbnRWYWx1ZShzdWJfaW5kZXgpOworICB9CisgIGlmIChwT3B0aW9uID09IE5VTEwgfHwgcE9wdGlvbi0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJJTkcpIHsKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorICByZXR1cm4gKChDUERGX1N0cmluZyopcE9wdGlvbiktPkdldFVuaWNvZGVUZXh0KCk7Cit9CitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0T3B0aW9uTGFiZWwoaW50IGluZGV4KSB7CisgIHJldHVybiBHZXRPcHRpb25UZXh0KGluZGV4LCAxKTsKK30KK0NGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRPcHRpb25WYWx1ZShpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIEdldE9wdGlvblRleHQoaW5kZXgsIDApOworfQoraW50IENQREZfRm9ybUZpZWxkOjpGaW5kT3B0aW9uKENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpIHsKKyAgaW50IGlDb3VudCA9IENvdW50T3B0aW9ucygpOworICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZSA9IEdldE9wdGlvblZhbHVlKGkpOworICAgIGlmIChjc1ZhbHVlID09IGNzT3B0TGFiZWwpIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9CitpbnQgQ1BERl9Gb3JtRmllbGQ6OkZpbmRPcHRpb25WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NPcHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpU3RhcnRJbmRleCkgeworICBpZiAoaVN0YXJ0SW5kZXggPCAwKSB7CisgICAgaVN0YXJ0SW5kZXggPSAwOworICB9CisgIGludCBpQ291bnQgPSBDb3VudE9wdGlvbnMoKTsKKyAgZm9yICg7IGlTdGFydEluZGV4IDwgaUNvdW50OyBpU3RhcnRJbmRleCsrKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZSA9IEdldE9wdGlvblZhbHVlKGlTdGFydEluZGV4KTsKKyAgICBpZiAoY3NWYWx1ZSA9PSBjc09wdFZhbHVlKSB7CisgICAgICByZXR1cm4gaVN0YXJ0SW5kZXg7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KK2ludCBDUERGX0Zvcm1GaWVsZDo6SW5zZXJ0T3B0aW9uKENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsKKyAgaWYgKGNzT3B0TGFiZWwuSXNFbXB0eSgpKQorICAgIHJldHVybiAtMTsKKworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKKyAgICBpbnQgaVJldCA9IDA7CisgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KQorICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc09wdExhYmVsKTsKKyAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KQorICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzT3B0TGFiZWwpOworICAgIGlmIChpUmV0IDwgMCkKKyAgICAgIHJldHVybiAtMTsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nIGNzU3RyID0gUERGX0VuY29kZVRleHQoY3NPcHRMYWJlbCwgY3NPcHRMYWJlbC5HZXRMZW5ndGgoKSk7CisgIENQREZfQXJyYXkqIHBPcHQgPSBOVUxMOworICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIk9wdCIpOworICBpZiAocFZhbHVlID09IE5VTEwgfHwgcFZhbHVlLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CisgICAgcE9wdCA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOworICAgIGlmIChwT3B0ID09IE5VTEwpCisgICAgICByZXR1cm4gLTE7CisgICAgbV9wRGljdC0+U2V0QXQoIk9wdCIsIHBPcHQpOworICB9IGVsc2UKKyAgICBwT3B0ID0gKENQREZfQXJyYXkqKXBWYWx1ZTsKKyAgaW50IGlDb3VudCA9IChpbnQpcE9wdC0+R2V0Q291bnQoKTsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpQ291bnQpIHsKKyAgICBwT3B0LT5BZGRTdHJpbmcoY3NTdHIpOworICAgIGluZGV4ID0gaUNvdW50OworICB9IGVsc2UgeworICAgIENQREZfU3RyaW5nKiBwU3RyaW5nID0gQ1BERl9TdHJpbmc6OkNyZWF0ZShjc1N0cik7CisgICAgaWYgKHBTdHJpbmcgPT0gTlVMTCkKKyAgICAgIHJldHVybiAtMTsKKyAgICBwT3B0LT5JbnNlcnRBdChpbmRleCwgcFN0cmluZyk7CisgIH0KKworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKKyAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpCisgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKKyAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KQorICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKKyAgfQorICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgcmV0dXJuIGluZGV4OworfQorRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6Q2xlYXJPcHRpb25zKEZYX0JPT0wgYk5vdGlmeSkgeworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKKyAgICBpbnQgaVJldCA9IDA7CisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKKyAgICBpbnQgaUluZGV4ID0gR2V0U2VsZWN0ZWRJbmRleCgwKTsKKyAgICBpZiAoaUluZGV4ID49IDApCisgICAgICBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaUluZGV4KTsKKyAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpCisgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOworICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpCisgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CisgICAgaWYgKGlSZXQgPCAwKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgbV9wRGljdC0+UmVtb3ZlQXQoIk9wdCIpOworICBtX3BEaWN0LT5SZW1vdmVBdCgiViIpOworICBtX3BEaWN0LT5SZW1vdmVBdCgiRFYiKTsKKyAgbV9wRGljdC0+UmVtb3ZlQXQoIkkiKTsKKyAgbV9wRGljdC0+UmVtb3ZlQXQoIlRJIik7CisKKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KQorICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7CisgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkKKyAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7CisgIH0KKworICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpDaGVja0NvbnRyb2woaW50IGlDb250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hlY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsKKyAgQVNTRVJUKEdldFR5cGUoKSA9PSBDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gUmFkaW9CdXR0b24pOworICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaUNvbnRyb2xJbmRleCk7CisgIGlmIChwQ29udHJvbCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghYkNoZWNrZWQgJiYgcENvbnRyb2wtPklzQ2hlY2tlZCgpID09IGJDaGVja2VkKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9CeXRlQXJyYXkgc3RhdHVzQXJyYXk7CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgeworICAgIFNhdmVDaGVja2VkRmllbGRTdGF0dXModGhpcywgc3RhdHVzQXJyYXkpOworICB9CisgIENGWF9XaWRlU3RyaW5nIGNzV0V4cG9ydCA9IHBDb250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpOworICBDRlhfQnl0ZVN0cmluZyBjc0JFeHBvcnQgPSBQREZfRW5jb2RlVGV4dChjc1dFeHBvcnQpOworICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOworICBGWF9CT09MIGJVbmlzb24gPSBQREZfRm9ybUZpZWxkX0lzVW5pc29uKHRoaXMpOworICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcEN0cmwgPSBHZXRDb250cm9sKGkpOworICAgIGlmIChiVW5pc29uKSB7CisgICAgICBDRlhfV2lkZVN0cmluZyBjc0VWYWx1ZSA9IHBDdHJsLT5HZXRFeHBvcnRWYWx1ZSgpOworICAgICAgaWYgKGNzRVZhbHVlID09IGNzV0V4cG9ydCkgeworICAgICAgICBpZiAocEN0cmwtPkdldE9uU3RhdGVOYW1lKCkgPT0gcENvbnRyb2wtPkdldE9uU3RhdGVOYW1lKCkpIHsKKyAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKGJDaGVja2VkKTsKKyAgICAgICAgfSBlbHNlIGlmIChiQ2hlY2tlZCkgeworICAgICAgICAgIHBDdHJsLT5DaGVja0NvbnRyb2woRkFMU0UpOwogICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7CisgICAgICAgIHBDdHJsLT5DaGVja0NvbnRyb2woRkFMU0UpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoaSA9PSBpQ29udHJvbEluZGV4KSB7CisgICAgICAgIHBDdHJsLT5DaGVja0NvbnRyb2woYkNoZWNrZWQpOworICAgICAgfSBlbHNlIGlmIChiQ2hlY2tlZCkgeworICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKEZBTFNFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgQ1BERl9PYmplY3QqIHBPcHQgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiT3B0Iik7CisgIGlmIChwT3B0ID09IE5VTEwgfHwgcE9wdC0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgeworICAgIGlmIChiQ2hlY2tlZCkgeworICAgICAgbV9wRGljdC0+U2V0QXROYW1lKCJWIiwgY3NCRXhwb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NWOworICAgICAgQ1BERl9PYmplY3QqIHBWID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKKyAgICAgIGlmIChwViAhPSBOVUxMKSB7CisgICAgICAgIGNzViA9IHBWLT5HZXRTdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGlmIChjc1YgPT0gY3NCRXhwb3J0KSB7CisgICAgICAgIG1fcERpY3QtPlNldEF0TmFtZSgiViIsICJPZmYiKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoYkNoZWNrZWQpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBjc0luZGV4OworICAgIGNzSW5kZXguRm9ybWF0KCIlZCIsIGlDb250cm9sSW5kZXgpOworICAgIG1fcERpY3QtPlNldEF0TmFtZSgiViIsIGNzSW5kZXgpOworICB9CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgeworICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZSh0aGlzLCBzdGF0dXNBcnJheSk7CisgIH0KKyAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgIHJldHVybiBUUlVFOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldENoZWNrVmFsdWUoRlhfQk9PTCBiRGVmYXVsdCkgeworICBBU1NFUlQoR2V0VHlwZSgpID09IENoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBSYWRpb0J1dHRvbik7CisgIENGWF9XaWRlU3RyaW5nIGNzRXhwb3J0ID0gTCJPZmYiOworICBGWF9CT09MIGJDaGVja2VkOworICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOworICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRDb250cm9sKGkpOworICAgIGlmIChiRGVmYXVsdCkgeworICAgICAgYkNoZWNrZWQgPSBwQ29udHJvbC0+SXNEZWZhdWx0Q2hlY2tlZCgpOworICAgIH0gZWxzZSB7CisgICAgICBiQ2hlY2tlZCA9IHBDb250cm9sLT5Jc0NoZWNrZWQoKTsKKyAgICB9CisgICAgaWYgKGJDaGVja2VkKSB7CisgICAgICBjc0V4cG9ydCA9IHBDb250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBjc0V4cG9ydDsKK30KK0ZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsKKyAgQVNTRVJUKEdldFR5cGUoKSA9PSBDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gUmFkaW9CdXR0b24pOworICBDRlhfQnl0ZUFycmF5IHN0YXR1c0FycmF5OworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKKyAgICBTYXZlQ2hlY2tlZEZpZWxkU3RhdHVzKHRoaXMsIHN0YXR1c0FycmF5KTsKKyAgfQorICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOworICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRDb250cm9sKGkpOworICAgIENGWF9XaWRlU3RyaW5nIGNzRXhwb3J0ID0gcENvbnRyb2wtPkdldEV4cG9ydFZhbHVlKCk7CisgICAgaWYgKGNzRXhwb3J0ID09IHZhbHVlKSB7CisgICAgICBpZiAoYkRlZmF1bHQpIHsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENoZWNrQ29udHJvbChHZXRDb250cm9sSW5kZXgocENvbnRyb2wpLCBUUlVFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoYkRlZmF1bHQpIHsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENoZWNrQ29udHJvbChHZXRDb250cm9sSW5kZXgocENvbnRyb2wpLCBGQUxTRSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgeworICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZSh0aGlzLCBzdGF0dXNBcnJheSk7CisgIH0KKyAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgIHJldHVybiBUUlVFOworfQoraW50IENQREZfRm9ybUZpZWxkOjpHZXRUb3BWaXNpYmxlSW5kZXgoKSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlRJIik7CisgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gcE9iai0+R2V0SW50ZWdlcigpOworfQoraW50IENQREZfRm9ybUZpZWxkOjpDb3VudFNlbGVjdGVkT3B0aW9ucygpIHsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiSSIpOworICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKKyAgaWYgKHBBcnJheSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIChpbnQpcEFycmF5LT5HZXRDb3VudCgpOworfQoraW50IENQREZfRm9ybUZpZWxkOjpHZXRTZWxlY3RlZE9wdGlvbkluZGV4KGludCBpbmRleCkgeworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7CisgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKKyAgaWYgKHBBcnJheSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBpQ291bnQgPSAoaW50KXBBcnJheS0+R2V0Q291bnQoKTsKKyAgaWYgKGlDb3VudCA+IDAgJiYgaW5kZXggPCBpQ291bnQpIHsKKyAgICByZXR1cm4gcEFycmF5LT5HZXRJbnRlZ2VyKGluZGV4KTsKKyAgfQorICByZXR1cm4gLTE7Cit9CitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpJc09wdGlvblNlbGVjdGVkKGludCBpT3B0SW5kZXgpIHsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiSSIpOworICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBPYmotPkdldEFycmF5KCk7CisgIGlmIChwQXJyYXkgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgaUNvdW50ID0gKGludClwQXJyYXktPkdldENvdW50KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICBpZiAocEFycmF5LT5HZXRJbnRlZ2VyKGkpID09IGlPcHRJbmRleCkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlNlbGVjdE9wdGlvbihpbnQgaU9wdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSkgeworICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BEaWN0LT5HZXRBcnJheSgiSSIpOworICBpZiAocEFycmF5ID09IE5VTEwpIHsKKyAgICBpZiAoIWJTZWxlY3RlZCkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOworICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBtX3BEaWN0LT5TZXRBdCgiSSIsIHBBcnJheSk7CisgIH0KKyAgRlhfQk9PTCBiUmV0dXJuID0gRkFMU0U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClwQXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgIGludCBpRmluZCA9IHBBcnJheS0+R2V0SW50ZWdlcihpKTsKKyAgICBpZiAoaUZpbmQgPT0gaU9wdEluZGV4KSB7CisgICAgICBpZiAoYlNlbGVjdGVkKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgICAgIGludCBpUmV0ID0gMDsKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZSA9IEdldE9wdGlvbkxhYmVsKGlPcHRJbmRleCk7CiAgICAgICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgewotICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKKyAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIHsKLSAgICAgICAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKKyAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9Ci0gICAgfQotICAgIG1fcERpY3QtPlJlbW92ZUF0KCJJIik7Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgICB9CisgICAgICBwQXJyYXktPlJlbW92ZUF0KGkpOworICAgICAgYlJldHVybiA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKGlGaW5kID4gaU9wdEluZGV4KSB7CisgICAgICBpZiAoIWJTZWxlY3RlZCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgeworICAgICAgICBpbnQgaVJldCA9IDA7CisgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWUgPSBHZXRPcHRpb25MYWJlbChpT3B0SW5kZXgpOwogICAgICAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpIHsKLSAgICAgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHRoaXMpOworICAgICAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgewotICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKKyAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGlSZXQgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgICBDUERGX051bWJlciogcE51bSA9IENQREZfTnVtYmVyOjpDcmVhdGUoaU9wdEluZGV4KTsKKyAgICAgIGlmIChwTnVtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgcEFycmF5LT5JbnNlcnRBdChpLCBwTnVtKTsKKyAgICAgIGJSZXR1cm4gPSBUUlVFOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghYlJldHVybikgeworICAgIGlmIChiU2VsZWN0ZWQpIHsKKyAgICAgIHBBcnJheS0+QWRkSW50ZWdlcihpT3B0SW5kZXgpOworICAgIH0KKyAgICBpZiAocEFycmF5LT5HZXRDb3VudCgpID09IDApIHsKKyAgICAgIG1fcERpY3QtPlJlbW92ZUF0KCJJIik7CisgICAgfQorICB9CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgeworICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgeworICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7CisgICAgfQorICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIHsKKyAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7CisgICAgfQorICB9CisgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1BERl9Gb3JtRmllbGQ6OkxvYWREQSgpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgREE7Ci0gICAgaWYgKENQREZfT2JqZWN0KiBwT2JqX3QgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiREEiKSkgewotICAgICAgICBEQSA9IHBPYmpfdC0+R2V0U3RyaW5nKCk7CitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpDbGVhclNlbGVjdGVkT3B0aW9ucyhGWF9CT09MIGJOb3RpZnkpIHsKKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgaW50IGlSZXQgPSAwOworICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWU7CisgICAgaW50IGlJbmRleCA9IEdldFNlbGVjdGVkSW5kZXgoMCk7CisgICAgaWYgKGlJbmRleCA+PSAwKSB7CisgICAgICBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaUluZGV4KTsKICAgICB9Ci0gICAgaWYgKERBLklzRW1wdHkoKSAmJiBtX3BGb3JtLT5tX3BGb3JtRGljdCkgewotICAgICAgICBEQSA9IG1fcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXRTdHJpbmcoIkRBIik7CisgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7CisgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgIH0KLSAgICBpZiAoREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSB7CisgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgfQotICAgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChEQSk7Ci0gICAgc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBmb250X25hbWUgPSBzeW50YXguR2V0V29yZCgpOwotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gTlVMTDsKLSAgICBpZiAobV9wRm9ybS0+bV9wRm9ybURpY3QgJiYgbV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIikgJiYKLSAgICAgICAgbV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIiktPkdldERpY3QoIkZvbnQiKSApCi0gICAgcEZvbnREaWN0ID0gbV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIiktPkdldERpY3QoIkZvbnQiKS0+R2V0RGljdChmb250X25hbWUpOworICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBtX3BEaWN0LT5SZW1vdmVBdCgiSSIpOworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKKyAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpIHsKKyAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHRoaXMpOworICAgIH0KKyAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSB7CisgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOworICAgIH0KKyAgfQorICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENQREZfRm9ybUZpZWxkOjpMb2FkREEoKSB7CisgIENGWF9CeXRlU3RyaW5nIERBOworICBpZiAoQ1BERl9PYmplY3QqIHBPYmpfdCA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEQSIpKSB7CisgICAgREEgPSBwT2JqX3QtPkdldFN0cmluZygpOworICB9CisgIGlmIChEQS5Jc0VtcHR5KCkgJiYgbV9wRm9ybS0+bV9wRm9ybURpY3QpIHsKKyAgICBEQSA9IG1fcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXRTdHJpbmcoIkRBIik7CisgIH0KKyAgaWYgKERBLklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgoREEpOworICBzeW50YXguRmluZFRhZ1BhcmFtKCJUZiIsIDIpOworICBDRlhfQnl0ZVN0cmluZyBmb250X25hbWUgPSBzeW50YXguR2V0V29yZCgpOworICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IE5VTEw7CisgIGlmIChtX3BGb3JtLT5tX3BGb3JtRGljdCAmJiBtX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdCgiRFIiKSAmJgorICAgICAgbV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIiktPkdldERpY3QoIkZvbnQiKSkKKyAgICBwRm9udERpY3QgPSBtX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdCgiRFIiKS0+R2V0RGljdCgiRm9udCIpLT5HZXREaWN0KAorICAgICAgICBmb250X25hbWUpOwogCi0gICAgaWYgKHBGb250RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wRm9udCA9IG1fcEZvcm0tPm1fcERvY3VtZW50LT5Mb2FkRm9udChwRm9udERpY3QpOwotICAgIG1fRm9udFNpemUgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICBpZiAocEZvbnREaWN0ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wRm9udCA9IG1fcEZvcm0tPm1fcERvY3VtZW50LT5Mb2FkRm9udChwRm9udERpY3QpOworICBtX0ZvbnRTaXplID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2xpbmsuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfbGluay5jcHAKaW5kZXggZmRhZTk2YS4uMTViZDE0YyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfbGluay5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfbGluay5jcHAKQEAgLTYsMTAwICs2LDkzIEBACiAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKIAotQ1BERl9MaW5rTGlzdDo6fkNQREZfTGlua0xpc3QoKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fUGFnZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICB2b2lkKiBrZXk7Ci0gICAgICAgIHZvaWQqIHZhbHVlOwotICAgICAgICBtX1BhZ2VNYXAuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGRlbGV0ZSAoQ0ZYX1B0ckFycmF5Kil2YWx1ZTsKLSAgICB9CitDUERGX0xpbmtMaXN0Ojp+Q1BERl9MaW5rTGlzdCgpIHsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9QYWdlTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIHZvaWQqIGtleTsKKyAgICB2b2lkKiB2YWx1ZTsKKyAgICBtX1BhZ2VNYXAuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7CisgICAgZGVsZXRlIChDRlhfUHRyQXJyYXkqKXZhbHVlOworICB9CiB9Ci1DRlhfUHRyQXJyYXkqIENQREZfTGlua0xpc3Q6OkdldFBhZ2VMaW5rcyhDUERGX1BhZ2UqIHBQYWdlKQotewotICAgIEZYX0RXT1JEIG9iam51bSA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0T2JqTnVtKCk7Ci0gICAgaWYgKG9iam51bSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfUHRyQXJyYXkqIHBQYWdlTGlua0xpc3QgPSBOVUxMOwotICAgIGlmICghbV9QYWdlTWFwLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sICh2b2lkKiYpcFBhZ2VMaW5rTGlzdCkpIHsKLSAgICAgICAgcFBhZ2VMaW5rTGlzdCA9IG5ldyBDRlhfUHRyQXJyYXk7Ci0gICAgICAgIG1fUGFnZU1hcC5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sIHBQYWdlTGlua0xpc3QpOwotICAgICAgICBMb2FkUGFnZUxpbmtzKHBQYWdlLCBwUGFnZUxpbmtMaXN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHBQYWdlTGlua0xpc3Q7CitDRlhfUHRyQXJyYXkqIENQREZfTGlua0xpc3Q6OkdldFBhZ2VMaW5rcyhDUERGX1BhZ2UqIHBQYWdlKSB7CisgIEZYX0RXT1JEIG9iam51bSA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0T2JqTnVtKCk7CisgIGlmIChvYmpudW0gPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENGWF9QdHJBcnJheSogcFBhZ2VMaW5rTGlzdCA9IE5VTEw7CisgIGlmICghbV9QYWdlTWFwLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClvYmpudW0sICh2b2lkKiYpcFBhZ2VMaW5rTGlzdCkpIHsKKyAgICBwUGFnZUxpbmtMaXN0ID0gbmV3IENGWF9QdHJBcnJheTsKKyAgICBtX1BhZ2VNYXAuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3Qpb2JqbnVtLCBwUGFnZUxpbmtMaXN0KTsKKyAgICBMb2FkUGFnZUxpbmtzKHBQYWdlLCBwUGFnZUxpbmtMaXN0KTsKKyAgfQorICByZXR1cm4gcFBhZ2VMaW5rTGlzdDsKIH0KLWludCBDUERGX0xpbmtMaXN0OjpDb3VudExpbmtzKENQREZfUGFnZSogcFBhZ2UpCi17Ci0gICAgQ0ZYX1B0ckFycmF5KiBwUGFnZUxpbmtMaXN0ID0gR2V0UGFnZUxpbmtzKHBQYWdlKTsKLSAgICBpZiAocFBhZ2VMaW5rTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcFBhZ2VMaW5rTGlzdC0+R2V0U2l6ZSgpOworaW50IENQREZfTGlua0xpc3Q6OkNvdW50TGlua3MoQ1BERl9QYWdlKiBwUGFnZSkgeworICBDRlhfUHRyQXJyYXkqIHBQYWdlTGlua0xpc3QgPSBHZXRQYWdlTGlua3MocFBhZ2UpOworICBpZiAocFBhZ2VMaW5rTGlzdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHBQYWdlTGlua0xpc3QtPkdldFNpemUoKTsKIH0KLUNQREZfTGluayBDUERGX0xpbmtMaXN0OjpHZXRMaW5rKENQREZfUGFnZSogcFBhZ2UsIGludCBpbmRleCkKLXsKLSAgICBDRlhfUHRyQXJyYXkqIHBQYWdlTGlua0xpc3QgPSBHZXRQYWdlTGlua3MocFBhZ2UpOwotICAgIGlmICghcFBhZ2VMaW5rTGlzdCkgewotICAgICAgICByZXR1cm4gQ1BERl9MaW5rKCk7Ci0gICAgfQotICAgIHJldHVybiBDUERGX0xpbmsoKENQREZfRGljdGlvbmFyeSopcFBhZ2VMaW5rTGlzdC0+R2V0QXQoaW5kZXgpKTsKLX0KLUNQREZfTGluayBDUERGX0xpbmtMaXN0OjpHZXRMaW5rQXRQb2ludChDUERGX1BhZ2UqIHBQYWdlLCBGWF9GTE9BVCBwZGZfeCwgRlhfRkxPQVQgcGRmX3kpCi17Ci0gICAgQ0ZYX1B0ckFycmF5KiBwUGFnZUxpbmtMaXN0ID0gR2V0UGFnZUxpbmtzKHBQYWdlKTsKLSAgICBpZiAoIXBQYWdlTGlua0xpc3QpIHsKLSAgICAgICAgcmV0dXJuIENQREZfTGluaygpOwotICAgIH0KLSAgICBpbnQgc2l6ZSA9IHBQYWdlTGlua0xpc3QtPkdldFNpemUoKTsKLSAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgIENQREZfTGluayBsaW5rKChDUERGX0RpY3Rpb25hcnkqKXBQYWdlTGlua0xpc3QtPkdldEF0KGkpKTsKLSAgICAgICAgQ1BERl9SZWN0IHJlY3QgPSBsaW5rLkdldFJlY3QoKTsKLSAgICAgICAgaWYgKHJlY3QuQ29udGFpbnMocGRmX3gsIHBkZl95KSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbms7Ci0gICAgICAgIH0KLSAgICB9CitDUERGX0xpbmsgQ1BERl9MaW5rTGlzdDo6R2V0TGluayhDUERGX1BhZ2UqIHBQYWdlLCBpbnQgaW5kZXgpIHsKKyAgQ0ZYX1B0ckFycmF5KiBwUGFnZUxpbmtMaXN0ID0gR2V0UGFnZUxpbmtzKHBQYWdlKTsKKyAgaWYgKCFwUGFnZUxpbmtMaXN0KSB7CiAgICAgcmV0dXJuIENQREZfTGluaygpOworICB9CisgIHJldHVybiBDUERGX0xpbmsoKENQREZfRGljdGlvbmFyeSopcFBhZ2VMaW5rTGlzdC0+R2V0QXQoaW5kZXgpKTsKIH0KLXZvaWQgQ1BERl9MaW5rTGlzdDo6TG9hZFBhZ2VMaW5rcyhDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUHRyQXJyYXkqIHBMaXN0KQotewotICAgIENQREZfQXJyYXkqIHBBbm5vdExpc3QgPSBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEFycmF5KCJBbm5vdHMiKTsKLSAgICBpZiAocEFubm90TGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK0NQREZfTGluayBDUERGX0xpbmtMaXN0OjpHZXRMaW5rQXRQb2ludChDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHBkZl94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHBkZl95KSB7CisgIENGWF9QdHJBcnJheSogcFBhZ2VMaW5rTGlzdCA9IEdldFBhZ2VMaW5rcyhwUGFnZSk7CisgIGlmICghcFBhZ2VMaW5rTGlzdCkgeworICAgIHJldHVybiBDUERGX0xpbmsoKTsKKyAgfQorICBpbnQgc2l6ZSA9IHBQYWdlTGlua0xpc3QtPkdldFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IHNpemUgLSAxOyBpID49IDA7IC0taSkgeworICAgIENQREZfTGluayBsaW5rKChDUERGX0RpY3Rpb25hcnkqKXBQYWdlTGlua0xpc3QtPkdldEF0KGkpKTsKKyAgICBDUERGX1JlY3QgcmVjdCA9IGxpbmsuR2V0UmVjdCgpOworICAgIGlmIChyZWN0LkNvbnRhaW5zKHBkZl94LCBwZGZfeSkpIHsKKyAgICAgIHJldHVybiBsaW5rOwogICAgIH0KLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFubm90TGlzdC0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdCA9IHBBbm5vdExpc3QtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwQW5ub3QgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBBbm5vdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIikgIT0gIkxpbmsiKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBwTGlzdC0+QWRkKHBBbm5vdCk7Ci0gICAgfQorICB9CisgIHJldHVybiBDUERGX0xpbmsoKTsKIH0KLUNQREZfUmVjdCBDUERGX0xpbms6OkdldFJlY3QoKQotewotICAgIHJldHVybiBtX3BEaWN0LT5HZXRSZWN0KCJSZWN0Iik7Cit2b2lkIENQREZfTGlua0xpc3Q6OkxvYWRQYWdlTGlua3MoQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1B0ckFycmF5KiBwTGlzdCkgeworICBDUERGX0FycmF5KiBwQW5ub3RMaXN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7CisgIGlmIChwQW5ub3RMaXN0ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBbm5vdExpc3QtPkdldENvdW50KCk7IGkrKykgeworICAgIENQREZfRGljdGlvbmFyeSogcEFubm90ID0gcEFubm90TGlzdC0+R2V0RGljdChpKTsKKyAgICBpZiAocEFubm90ID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAocEFubm90LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSAhPSAiTGluayIpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwTGlzdC0+QWRkKHBBbm5vdCk7CisgIH0KIH0KLUNQREZfRGVzdCBDUERGX0xpbms6OkdldERlc3QoQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBDUERGX09iamVjdCogcERlc3QgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkRlc3QiKTsKLSAgICBpZiAocERlc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ1BERl9EZXN0KCk7Ci0gICAgfQotICAgIGlmIChwRGVzdC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcgfHwgcERlc3QtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICBDUERGX05hbWVUcmVlIG5hbWVfdHJlZShwRG9jLCBGWF9CU1RSQygiRGVzdHMiKSk7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nQyBuYW1lID0gcERlc3QtPkdldFN0cmluZygpOwotICAgICAgICByZXR1cm4gQ1BERl9EZXN0KG5hbWVfdHJlZS5Mb29rdXBOYW1lZERlc3QocERvYywgbmFtZSkpOwotICAgIH0KLSAgICBpZiAocERlc3QtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIENQREZfRGVzdCgoQ1BERl9BcnJheSopcERlc3QpOwotICAgIH0KK0NQREZfUmVjdCBDUERGX0xpbms6OkdldFJlY3QoKSB7CisgIHJldHVybiBtX3BEaWN0LT5HZXRSZWN0KCJSZWN0Iik7Cit9CitDUERGX0Rlc3QgQ1BERl9MaW5rOjpHZXREZXN0KENQREZfRG9jdW1lbnQqIHBEb2MpIHsKKyAgQ1BERl9PYmplY3QqIHBEZXN0ID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJEZXN0Iik7CisgIGlmIChwRGVzdCA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIENQREZfRGVzdCgpOworICB9CisgIGlmIChwRGVzdC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcgfHwgcERlc3QtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgeworICAgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKHBEb2MsIEZYX0JTVFJDKCJEZXN0cyIpKTsKKyAgICBDRlhfQnl0ZVN0cmluZ0MgbmFtZSA9IHBEZXN0LT5HZXRTdHJpbmcoKTsKKyAgICByZXR1cm4gQ1BERl9EZXN0KG5hbWVfdHJlZS5Mb29rdXBOYW1lZERlc3QocERvYywgbmFtZSkpOworICB9CisgIGlmIChwRGVzdC0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgIHJldHVybiBDUERGX0Rlc3QoKENQREZfQXJyYXkqKXBEZXN0KTsKKyAgfQorICByZXR1cm4gQ1BERl9EZXN0KCk7CiB9Ci1DUERGX0FjdGlvbiBDUERGX0xpbms6OkdldEFjdGlvbigpCi17Ci0gICAgcmV0dXJuIENQREZfQWN0aW9uKG1fcERpY3QtPkdldERpY3QoIkEiKSk7CitDUERGX0FjdGlvbiBDUERGX0xpbms6OkdldEFjdGlvbigpIHsKKyAgcmV0dXJuIENQREZfQWN0aW9uKG1fcERpY3QtPkdldERpY3QoIkEiKSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19tZXRhZGF0YS5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19tZXRhZGF0YS5jcHAKaW5kZXggNzYyNGUwYS4uMmJjMTRkOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfbWV0YWRhdGEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX21ldGFkYXRhLmNwcApAQCAtNywxNDMgKzcsMTM1IEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF94bWwuaCIKIHR5cGVkZWYgc3RydWN0IF9QREZET0NfTUVUQURBVEEgewotICAgIENQREZfRG9jdW1lbnQgKm1fcERvYzsKLSAgICBDWE1MX0VsZW1lbnQgKm1fcFhtbEVsbW50OwotICAgIENYTUxfRWxlbWVudCAqbV9wRWxtbnRSZGY7Ci0gICAgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIgKm1fcFN0cmluZ01hcDsKLX0gUERGRE9DX01FVEFEQVRBLCAqIFBERkRPQ19MUE1FVEFEQVRBOwotdHlwZWRlZiBQREZET0NfTUVUQURBVEEgY29uc3QgKiBQREZET0NfTFBDTUVUQURBVEE7CisgIENQREZfRG9jdW1lbnQqIG1fcERvYzsKKyAgQ1hNTF9FbGVtZW50KiBtX3BYbWxFbG1udDsKKyAgQ1hNTF9FbGVtZW50KiBtX3BFbG1udFJkZjsKKyAgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIqIG1fcFN0cmluZ01hcDsKK30gUERGRE9DX01FVEFEQVRBLCAqUERGRE9DX0xQTUVUQURBVEE7Cit0eXBlZGVmIFBERkRPQ19NRVRBREFUQSBjb25zdCogUERGRE9DX0xQQ01FVEFEQVRBOwogY29uc3QgRlhfQ0hBUiogY29uc3QgZ3NfRlBERkRPQ19NZXRhZGF0YV9UaXRsZXNbXSA9IHsKLSAgICAiVGl0bGUiLCAidGl0bGUiLAotICAgICJTdWJqZWN0IiwgImRlc2NyaXB0aW9uIiwKLSAgICAiQXV0aG9yIiwgImNyZWF0b3IiLAotICAgICJLZXl3b3JkcyIsICJLZXl3b3JkcyIsCi0gICAgIlByb2R1Y2VyIiwgIlByb2R1Y2VyIiwKLSAgICAiQ3JlYXRvciIsICJDcmVhdG9yVG9vbCIsCi0gICAgIkNyZWF0aW9uRGF0ZSIsICJDcmVhdGVEYXRlIiwKLSAgICAiTW9kRGF0ZSIsICJNb2RpZnlEYXRlIiwKLSAgICAiTWV0YWRhdGFEYXRlIiwgIk1ldGFkYXRhRGF0ZSIKLX07Ci1DUERGX01ldGFkYXRhOjpDUERGX01ldGFkYXRhKCkKLXsKLSAgICBtX3BEYXRhID0gRlhfQWxsb2MoUERGRE9DX01FVEFEQVRBLCAxKTsKLSAgICBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0ciAqJnBTdHJpbmdNYXAgPSAoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BTdHJpbmdNYXA7Ci0gICAgcFN0cmluZ01hcCA9IEZYX05FVyBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjsKLSAgICBpZiAocFN0cmluZ01hcCAhPSBOVUxMKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzdHI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTg7IGkgKz0gMikgewotICAgICAgICAgICAgYnN0ciA9IGdzX0ZQREZET0NfTWV0YWRhdGFfVGl0bGVzW2ldOwotICAgICAgICAgICAgcFN0cmluZ01hcC0+QWRkVmFsdWUoYnN0ciwgKHZvaWQqKWdzX0ZQREZET0NfTWV0YWRhdGFfVGl0bGVzW2kgKyAxXSk7Ci0gICAgICAgIH0KKyAgICAiVGl0bGUiLCAgICAgICJ0aXRsZSIsICAgICAgICAiU3ViamVjdCIsICAgICAgImRlc2NyaXB0aW9uIiwgIkF1dGhvciIsCisgICAgImNyZWF0b3IiLCAgICAiS2V5d29yZHMiLCAgICAgIktleXdvcmRzIiwgICAgICJQcm9kdWNlciIsICAgICJQcm9kdWNlciIsCisgICAgIkNyZWF0b3IiLCAgICAiQ3JlYXRvclRvb2wiLCAgIkNyZWF0aW9uRGF0ZSIsICJDcmVhdGVEYXRlIiwgICJNb2REYXRlIiwKKyAgICAiTW9kaWZ5RGF0ZSIsICJNZXRhZGF0YURhdGUiLCAiTWV0YWRhdGFEYXRlIn07CitDUERGX01ldGFkYXRhOjpDUERGX01ldGFkYXRhKCkgeworICBtX3BEYXRhID0gRlhfQWxsb2MoUERGRE9DX01FVEFEQVRBLCAxKTsKKyAgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIqJiBwU3RyaW5nTWFwID0KKyAgICAgICgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcFN0cmluZ01hcDsKKyAgcFN0cmluZ01hcCA9IEZYX05FVyBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjsKKyAgaWYgKHBTdHJpbmdNYXAgIT0gTlVMTCkgeworICAgIENGWF9CeXRlU3RyaW5nIGJzdHI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxODsgaSArPSAyKSB7CisgICAgICBic3RyID0gZ3NfRlBERkRPQ19NZXRhZGF0YV9UaXRsZXNbaV07CisgICAgICBwU3RyaW5nTWFwLT5BZGRWYWx1ZShic3RyLCAodm9pZCopZ3NfRlBERkRPQ19NZXRhZGF0YV9UaXRsZXNbaSArIDFdKTsKICAgICB9CisgIH0KIH0KLUNQREZfTWV0YWRhdGE6On5DUERGX01ldGFkYXRhKCkKLXsKLSAgICBGWFNZU19hc3NlcnQobV9wRGF0YSAhPSBOVUxMKTsKLSAgICBDWE1MX0VsZW1lbnQgKiZwID0gKChQREZET0NfTFBNRVRBREFUQSltX3BEYXRhKS0+bV9wWG1sRWxtbnQ7Ci0gICAgZGVsZXRlIHA7Ci0gICAgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIgKnBTdHJpbmdNYXAgPSAoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BTdHJpbmdNYXA7Ci0gICAgaWYgKHBTdHJpbmdNYXApIHsKLSAgICAgICAgcFN0cmluZ01hcC0+UmVtb3ZlQWxsKCk7Ci0gICAgICAgIGRlbGV0ZSBwU3RyaW5nTWFwOwotICAgIH0KLSAgICBGWF9GcmVlKG1fcERhdGEpOworQ1BERl9NZXRhZGF0YTo6fkNQREZfTWV0YWRhdGEoKSB7CisgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOworICBDWE1MX0VsZW1lbnQqJiBwID0gKChQREZET0NfTFBNRVRBREFUQSltX3BEYXRhKS0+bV9wWG1sRWxtbnQ7CisgIGRlbGV0ZSBwOworICBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0ciogcFN0cmluZ01hcCA9CisgICAgICAoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BTdHJpbmdNYXA7CisgIGlmIChwU3RyaW5nTWFwKSB7CisgICAgcFN0cmluZ01hcC0+UmVtb3ZlQWxsKCk7CisgICAgZGVsZXRlIHBTdHJpbmdNYXA7CisgIH0KKyAgRlhfRnJlZShtX3BEYXRhKTsKIH0KLXZvaWQgQ1BERl9NZXRhZGF0YTo6TG9hZERvYyhDUERGX0RvY3VtZW50ICpwRG9jKQotewotICAgIEZYU1lTX2Fzc2VydChwRG9jICE9IE5VTEwpOwotICAgICgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcERvYyA9IHBEb2M7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwUm9vdCA9IHBEb2MtPkdldFJvb3QoKTsKLSAgICBDUERGX1N0cmVhbSAqcFN0cmVhbSA9IHBSb290LT5HZXRTdHJlYW0oRlhfQlNUUkMoIk1ldGFkYXRhIikpOwotICAgIGlmICghcFN0cmVhbSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOwotICAgIGludCBzaXplID0gYWNjLkdldFNpemUoKTsKLSAgICBjb25zdCB1aW50OF90KiBwQnVmID0gYWNjLkdldERhdGEoKTsKLSAgICBDWE1MX0VsZW1lbnQgKiZwWG1sRWxtbnQgPSAoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BYbWxFbG1udDsKLSAgICBwWG1sRWxtbnQgPSBDWE1MX0VsZW1lbnQ6OlBhcnNlKHBCdWYsIHNpemUpOwotICAgIGlmICghcFhtbEVsbW50KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1hNTF9FbGVtZW50IComcEVsbW50UmRmID0gKChQREZET0NfTFBNRVRBREFUQSltX3BEYXRhKS0+bV9wRWxtbnRSZGY7Ci0gICAgaWYgKHBYbWxFbG1udC0+R2V0VGFnTmFtZSgpID09IEZYX0JTVFJDKCJSREYiKSkgewotICAgICAgICBwRWxtbnRSZGYgPSBwWG1sRWxtbnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEVsbW50UmRmID0gcFhtbEVsbW50LT5HZXRFbGVtZW50KE5VTEwsIEZYX0JTVFJDKCJSREYiKSk7Ci0gICAgfQordm9pZCBDUERGX01ldGFkYXRhOjpMb2FkRG9jKENQREZfRG9jdW1lbnQqIHBEb2MpIHsKKyAgRlhTWVNfYXNzZXJ0KHBEb2MgIT0gTlVMTCk7CisgICgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcERvYyA9IHBEb2M7CisgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcFJvb3QtPkdldFN0cmVhbShGWF9CU1RSQygiTWV0YWRhdGEiKSk7CisgIGlmICghcFN0cmVhbSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1N0cmVhbUFjYyBhY2M7CisgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgIGludCBzaXplID0gYWNjLkdldFNpemUoKTsKKyAgY29uc3QgdWludDhfdCogcEJ1ZiA9IGFjYy5HZXREYXRhKCk7CisgIENYTUxfRWxlbWVudComIHBYbWxFbG1udCA9ICgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcFhtbEVsbW50OworICBwWG1sRWxtbnQgPSBDWE1MX0VsZW1lbnQ6OlBhcnNlKHBCdWYsIHNpemUpOworICBpZiAoIXBYbWxFbG1udCkgeworICAgIHJldHVybjsKKyAgfQorICBDWE1MX0VsZW1lbnQqJiBwRWxtbnRSZGYgPSAoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BFbG1udFJkZjsKKyAgaWYgKHBYbWxFbG1udC0+R2V0VGFnTmFtZSgpID09IEZYX0JTVFJDKCJSREYiKSkgeworICAgIHBFbG1udFJkZiA9IHBYbWxFbG1udDsKKyAgfSBlbHNlIHsKKyAgICBwRWxtbnRSZGYgPSBwWG1sRWxtbnQtPkdldEVsZW1lbnQoTlVMTCwgRlhfQlNUUkMoIlJERiIpKTsKKyAgfQogfQotaW50MzJfdCBDUERGX01ldGFkYXRhOjpHZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0l0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1N0cikKLXsKLSAgICBpZiAoISgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcFhtbEVsbW50KSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKCEoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BTdHJpbmdNYXApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICB2b2lkICpzelRhZzsKLSAgICBpZiAoISgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcFN0cmluZ01hcC0+TG9va3VwKGJzSXRlbSwgc3pUYWcpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNUYWcgPSAoY29uc3QgRlhfQ0hBUiopc3pUYWc7Ci0gICAgd3NTdHIgPSBMIiI7Ci0gICAgQ1hNTF9FbGVtZW50ICpwRWxtbnRSZGYgPSAoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BFbG1udFJkZjsKLSAgICBpZiAoIXBFbG1udFJkZikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBuQ2hpbGQgPSBwRWxtbnRSZGYtPkNvdW50Q2hpbGRyZW4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZDsgaSsrKSB7Ci0gICAgICAgIENYTUxfRWxlbWVudCAqcFRhZyA9IHBFbG1udFJkZi0+R2V0RWxlbWVudChOVUxMLCBGWF9CU1RSQygiRGVzY3JpcHRpb24iKSwgaSk7Ci0gICAgICAgIGlmICghcFRhZykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJzSXRlbSA9PSBGWF9CU1RSQygiVGl0bGUiKSB8fCBic0l0ZW0gPT0gRlhfQlNUUkMoIlN1YmplY3QiKSkgewotICAgICAgICAgICAgQ1hNTF9FbGVtZW50ICpwRWxtbnQgPSBwVGFnLT5HZXRFbGVtZW50KE5VTEwsIGJzVGFnKTsKLSAgICAgICAgICAgIGlmICghcEVsbW50KSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRWxtbnQgPSBwRWxtbnQtPkdldEVsZW1lbnQoTlVMTCwgRlhfQlNUUkMoIkFsdCIpKTsKLSAgICAgICAgICAgIGlmICghcEVsbW50KSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRWxtbnQgPSBwRWxtbnQtPkdldEVsZW1lbnQoTlVMTCwgRlhfQlNUUkMoImxpIikpOwotICAgICAgICAgICAgaWYgKCFwRWxtbnQpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdzU3RyID0gcEVsbW50LT5HZXRDb250ZW50KDApOwotICAgICAgICAgICAgcmV0dXJuIHdzU3RyLkdldExlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChic0l0ZW0gPT0gRlhfQlNUUkMoIkF1dGhvciIpKSB7Ci0gICAgICAgICAgICBDWE1MX0VsZW1lbnQgKnBFbG1udCA9IHBUYWctPkdldEVsZW1lbnQoTlVMTCwgYnNUYWcpOwotICAgICAgICAgICAgaWYgKCFwRWxtbnQpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBFbG1udCA9IHBFbG1udC0+R2V0RWxlbWVudChOVUxMLCBGWF9CU1RSQygiU2VxIikpOwotICAgICAgICAgICAgaWYgKCFwRWxtbnQpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBFbG1udCA9IHBFbG1udC0+R2V0RWxlbWVudChOVUxMLCBGWF9CU1RSQygibGkiKSk7Ci0gICAgICAgICAgICBpZiAoIXBFbG1udCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3NTdHIgPSBwRWxtbnQtPkdldENvbnRlbnQoMCk7Ci0gICAgICAgICAgICByZXR1cm4gd3NTdHIuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1hNTF9FbGVtZW50ICpwRWxtbnQgPSBwVGFnLT5HZXRFbGVtZW50KE5VTEwsIGJzVGFnKTsKLSAgICAgICAgaWYgKCFwRWxtbnQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHdzU3RyID0gcEVsbW50LT5HZXRDb250ZW50KDApOwotICAgICAgICByZXR1cm4gd3NTdHIuR2V0TGVuZ3RoKCk7Ci0gICAgfQoraW50MzJfdCBDUERGX01ldGFkYXRhOjpHZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0l0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NTdHIpIHsKKyAgaWYgKCEoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BYbWxFbG1udCkgewogICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoISgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcFN0cmluZ01hcCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB2b2lkKiBzelRhZzsKKyAgaWYgKCEoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BTdHJpbmdNYXAtPkxvb2t1cChic0l0ZW0sIHN6VGFnKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBic1RhZyA9IChjb25zdCBGWF9DSEFSKilzelRhZzsKKyAgd3NTdHIgPSBMIiI7CisgIENYTUxfRWxlbWVudCogcEVsbW50UmRmID0gKChQREZET0NfTFBNRVRBREFUQSltX3BEYXRhKS0+bV9wRWxtbnRSZGY7CisgIGlmICghcEVsbW50UmRmKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBuQ2hpbGQgPSBwRWxtbnRSZGYtPkNvdW50Q2hpbGRyZW4oKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hpbGQ7IGkrKykgeworICAgIENYTUxfRWxlbWVudCogcFRhZyA9CisgICAgICAgIHBFbG1udFJkZi0+R2V0RWxlbWVudChOVUxMLCBGWF9CU1RSQygiRGVzY3JpcHRpb24iKSwgaSk7CisgICAgaWYgKCFwVGFnKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGJzSXRlbSA9PSBGWF9CU1RSQygiVGl0bGUiKSB8fCBic0l0ZW0gPT0gRlhfQlNUUkMoIlN1YmplY3QiKSkgeworICAgICAgQ1hNTF9FbGVtZW50KiBwRWxtbnQgPSBwVGFnLT5HZXRFbGVtZW50KE5VTEwsIGJzVGFnKTsKKyAgICAgIGlmICghcEVsbW50KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcEVsbW50ID0gcEVsbW50LT5HZXRFbGVtZW50KE5VTEwsIEZYX0JTVFJDKCJBbHQiKSk7CisgICAgICBpZiAoIXBFbG1udCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHBFbG1udCA9IHBFbG1udC0+R2V0RWxlbWVudChOVUxMLCBGWF9CU1RSQygibGkiKSk7CisgICAgICBpZiAoIXBFbG1udCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHdzU3RyID0gcEVsbW50LT5HZXRDb250ZW50KDApOworICAgICAgcmV0dXJuIHdzU3RyLkdldExlbmd0aCgpOworICAgIH0KKyAgICBpZiAoYnNJdGVtID09IEZYX0JTVFJDKCJBdXRob3IiKSkgeworICAgICAgQ1hNTF9FbGVtZW50KiBwRWxtbnQgPSBwVGFnLT5HZXRFbGVtZW50KE5VTEwsIGJzVGFnKTsKKyAgICAgIGlmICghcEVsbW50KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcEVsbW50ID0gcEVsbW50LT5HZXRFbGVtZW50KE5VTEwsIEZYX0JTVFJDKCJTZXEiKSk7CisgICAgICBpZiAoIXBFbG1udCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHBFbG1udCA9IHBFbG1udC0+R2V0RWxlbWVudChOVUxMLCBGWF9CU1RSQygibGkiKSk7CisgICAgICBpZiAoIXBFbG1udCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHdzU3RyID0gcEVsbW50LT5HZXRDb250ZW50KDApOworICAgICAgcmV0dXJuIHdzU3RyLkdldExlbmd0aCgpOworICAgIH0KKyAgICBDWE1MX0VsZW1lbnQqIHBFbG1udCA9IHBUYWctPkdldEVsZW1lbnQoTlVMTCwgYnNUYWcpOworICAgIGlmICghcEVsbW50KSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgd3NTdHIgPSBwRWxtbnQtPkdldENvbnRlbnQoMCk7CisgICAgcmV0dXJuIHdzU3RyLkdldExlbmd0aCgpOworICB9CisgIHJldHVybiAtMTsKIH0KLUNYTUxfRWxlbWVudCogQ1BERl9NZXRhZGF0YTo6R2V0Um9vdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcFhtbEVsbW50OworQ1hNTF9FbGVtZW50KiBDUERGX01ldGFkYXRhOjpHZXRSb290KCkgY29uc3QgeworICByZXR1cm4gKChQREZET0NfTFBNRVRBREFUQSltX3BEYXRhKS0+bV9wWG1sRWxtbnQ7CiB9Ci1DWE1MX0VsZW1lbnQqIENQREZfTWV0YWRhdGE6OkdldFJERigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcEVsbW50UmRmOworQ1hNTF9FbGVtZW50KiBDUERGX01ldGFkYXRhOjpHZXRSREYoKSBjb25zdCB7CisgIHJldHVybiAoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BFbG1udFJkZjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX29jZy5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19vY2cuY3BwCmluZGV4IGQ1MjUyMjcuLjcwYWQ5YzcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX29jZy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2Nfb2NnLmNwcApAQCAtNSwyOTcgKzUsMzAzIEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCi1zdGF0aWMgaW50MzJfdCBGUERGRE9DX09DR19GaW5kR3JvdXAoY29uc3QgQ1BERl9PYmplY3QgKnBPYmplY3QsIGNvbnN0IENQREZfRGljdGlvbmFyeSAqcEdyb3VwRGljdCkKLXsKLSAgICBpZiAocE9iamVjdCA9PSBOVUxMIHx8IHBHcm91cERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludDMyX3QgaVR5cGUgPSBwT2JqZWN0LT5HZXRUeXBlKCk7Ci0gICAgaWYgKGlUeXBlID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICBGWF9EV09SRCBkd0NvdW50ID0gKChDUERGX0FycmF5KilwT2JqZWN0KS0+R2V0Q291bnQoKTsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKCgoQ1BERl9BcnJheSopcE9iamVjdCktPkdldERpY3QoaSkgPT0gcEdyb3VwRGljdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHBPYmplY3QtPkdldERpY3QoKSA9PSBwR3JvdXBEaWN0KSB7Ci0gICAgICAgIHJldHVybiAwOworc3RhdGljIGludDMyX3QgRlBERkRPQ19PQ0dfRmluZEdyb3VwKGNvbnN0IENQREZfT2JqZWN0KiBwT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcEdyb3VwRGljdCkgeworICBpZiAocE9iamVjdCA9PSBOVUxMIHx8IHBHcm91cERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpbnQzMl90IGlUeXBlID0gcE9iamVjdC0+R2V0VHlwZSgpOworICBpZiAoaVR5cGUgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgRlhfRFdPUkQgZHdDb3VudCA9ICgoQ1BERl9BcnJheSopcE9iamVjdCktPkdldENvdW50KCk7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgeworICAgICAgaWYgKCgoQ1BERl9BcnJheSopcE9iamVjdCktPkdldERpY3QoaSkgPT0gcEdyb3VwRGljdCkgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChwT2JqZWN0LT5HZXREaWN0KCkgPT0gcEdyb3VwRGljdCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAtMTsKIH0KLXN0YXRpYyBGWF9CT09MIEZQREZET0NfT0NHX0hhc0ludGVudChjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBEaWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRWxlbWVudCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0RlZiA9IEZYX0JTVFJDKCIiKSkKLXsKLSAgICBGWFNZU19hc3NlcnQocERpY3QgIT0gTlVMTCk7Ci0gICAgQ1BERl9PYmplY3QgKnBJbnRlbnQgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJJbnRlbnQiKSk7Ci0gICAgaWYgKHBJbnRlbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY3NFbGVtZW50ID09IGNzRGVmOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBic0ludGVudDsKLSAgICBpZiAocEludGVudC0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICBGWF9EV09SRCBkd0NvdW50ID0gKChDUERGX0FycmF5KilwSW50ZW50KS0+R2V0Q291bnQoKTsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgewotICAgICAgICAgICAgYnNJbnRlbnQgPSAoKENQREZfQXJyYXkqKXBJbnRlbnQpLT5HZXRTdHJpbmcoaSk7Ci0gICAgICAgICAgICBpZiAoYnNJbnRlbnQgPT0gRlhfQlNUUkMoIkFsbCIpIHx8IGJzSW50ZW50ID09IGNzRWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgYnNJbnRlbnQgPSBwSW50ZW50LT5HZXRTdHJpbmcoKTsKLSAgICByZXR1cm4gYnNJbnRlbnQgPT0gRlhfQlNUUkMoIkFsbCIpIHx8IGJzSW50ZW50ID09IGNzRWxlbWVudDsKLX0KLXN0YXRpYyBDUERGX0RpY3Rpb25hcnkqIEZQREZET0NfT0NHX0dldENvbmZpZyhDUERGX0RvY3VtZW50ICpwRG9jLCBjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzU3RhdGUpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KHBEb2MgJiYgcE9DR0RpY3QpOwotICAgIENQREZfRGljdGlvbmFyeSAqcE9DUHJvcGVydGllcyA9IHBEb2MtPkdldFJvb3QoKS0+R2V0RGljdChGWF9CU1RSQygiT0NQcm9wZXJ0aWVzIikpOwotICAgIGlmICghcE9DUHJvcGVydGllcykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSAqcE9DR3MgPSBwT0NQcm9wZXJ0aWVzLT5HZXRBcnJheShGWF9CU1RSQygiT0NHcyIpKTsKLSAgICBpZiAoIXBPQ0dzKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoRlBERkRPQ19PQ0dfRmluZEdyb3VwKHBPQ0dzLCBwT0NHRGljdCkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkgKnBDb25maWcgPSBwT0NQcm9wZXJ0aWVzLT5HZXREaWN0KEZYX0JTVFJDKCJEIikpOwotICAgIENQREZfQXJyYXkgKnBDb25maWdzID0gcE9DUHJvcGVydGllcy0+R2V0QXJyYXkoRlhfQlNUUkMoIkNvbmZpZ3MiKSk7Ci0gICAgaWYgKHBDb25maWdzKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSAqcEZpbmQ7Ci0gICAgICAgIGludDMyX3QgaUNvdW50ID0gcENvbmZpZ3MtPkdldENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgcEZpbmQgPSBwQ29uZmlncy0+R2V0RGljdChpKTsKLSAgICAgICAgICAgIGlmICghcEZpbmQpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghRlBERkRPQ19PQ0dfSGFzSW50ZW50KHBGaW5kLCBGWF9CU1RSQygiVmlldyIpLCBGWF9CU1RSQygiVmlldyIpKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENvbmZpZyA9IHBGaW5kOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBDb25maWc7Ci19Ci1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgRlBERkRPQ19PQ0dfR2V0VXNhZ2VUeXBlU3RyaW5nKENQREZfT0NDb250ZXh0OjpVc2FnZVR5cGUgZVR5cGUpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NTdGF0ZSA9IEZYX0JTVFJDKCJWaWV3Iik7Ci0gICAgaWYgKGVUeXBlID09IENQREZfT0NDb250ZXh0OjpEZXNpZ24pIHsKLSAgICAgICAgY3NTdGF0ZSA9IEZYX0JTVFJDKCJEZXNpZ24iKTsKLSAgICB9IGVsc2UgaWYgKGVUeXBlID09IENQREZfT0NDb250ZXh0OjpQcmludCkgewotICAgICAgICBjc1N0YXRlID0gRlhfQlNUUkMoIlByaW50Iik7Ci0gICAgfSBlbHNlIGlmIChlVHlwZSA9PSBDUERGX09DQ29udGV4dDo6RXhwb3J0KSB7Ci0gICAgICAgIGNzU3RhdGUgPSBGWF9CU1RSQygiRXhwb3J0Iik7Ci0gICAgfQotICAgIHJldHVybiBjc1N0YXRlOwotfQotQ1BERl9PQ0NvbnRleHQ6OkNQREZfT0NDb250ZXh0KENQREZfRG9jdW1lbnQgKnBEb2MsIFVzYWdlVHlwZSBlVXNhZ2VUeXBlKQotewotICAgIEZYU1lTX2Fzc2VydChwRG9jICE9IE5VTEwpOwotICAgIG1fcERvY3VtZW50ID0gcERvYzsKLSAgICBtX2VVc2FnZVR5cGUgPSBlVXNhZ2VUeXBlOwotfQotQ1BERl9PQ0NvbnRleHQ6On5DUERGX09DQ29udGV4dCgpCi17Ci0gICAgbV9PQ0dTdGF0ZXMuY2xlYXIoKTsKLX0KLUZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkxvYWRPQ0dTdGF0ZUZyb21Db25maWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0NvbmZpZywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCwgRlhfQk9PTCAmYlZhbGlkQ29uZmlnKSBjb25zdAotewotICAgIENQREZfRGljdGlvbmFyeSAqcENvbmZpZyA9IEZQREZET0NfT0NHX0dldENvbmZpZyhtX3BEb2N1bWVudCwgcE9DR0RpY3QsIGNzQ29uZmlnKTsKLSAgICBpZiAoIXBDb25maWcpIHsKK3N0YXRpYyBGWF9CT09MIEZQREZET0NfT0NHX0hhc0ludGVudCgKKyAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbGVtZW50LAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NEZWYgPSBGWF9CU1RSQygiIikpIHsKKyAgRlhTWVNfYXNzZXJ0KHBEaWN0ICE9IE5VTEwpOworICBDUERGX09iamVjdCogcEludGVudCA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkludGVudCIpKTsKKyAgaWYgKHBJbnRlbnQgPT0gTlVMTCkgeworICAgIHJldHVybiBjc0VsZW1lbnQgPT0gY3NEZWY7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNJbnRlbnQ7CisgIGlmIChwSW50ZW50LT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgRlhfRFdPUkQgZHdDb3VudCA9ICgoQ1BERl9BcnJheSopcEludGVudCktPkdldENvdW50KCk7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgeworICAgICAgYnNJbnRlbnQgPSAoKENQREZfQXJyYXkqKXBJbnRlbnQpLT5HZXRTdHJpbmcoaSk7CisgICAgICBpZiAoYnNJbnRlbnQgPT0gRlhfQlNUUkMoIkFsbCIpIHx8IGJzSW50ZW50ID09IGNzRWxlbWVudCkgewogICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgYlZhbGlkQ29uZmlnID0gVFJVRTsKLSAgICBGWF9CT09MIGJTdGF0ZSA9IHBDb25maWctPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZVN0YXRlIiksIEZYX0JTVFJDKCJPTiIpKSAhPSBGWF9CU1RSQygiT0ZGIik7Ci0gICAgQ1BERl9BcnJheSAqcEFycmF5ID0gcENvbmZpZy0+R2V0QXJyYXkoRlhfQlNUUkMoIk9OIikpOwotICAgIGlmIChwQXJyYXkpIHsKLSAgICAgICAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwQXJyYXksIHBPQ0dEaWN0KSA+PSAwKSB7Ci0gICAgICAgICAgICBiU3RhdGUgPSBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHBBcnJheSA9IHBDb25maWctPkdldEFycmF5KEZYX0JTVFJDKCJPRkYiKSk7Ci0gICAgaWYgKHBBcnJheSkgewotICAgICAgICBpZiAoRlBERkRPQ19PQ0dfRmluZEdyb3VwKHBBcnJheSwgcE9DR0RpY3QpID49IDApIHsKLSAgICAgICAgICAgIGJTdGF0ZSA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIHBBcnJheSA9IHBDb25maWctPkdldEFycmF5KEZYX0JTVFJDKCJBUyIpKTsKLSAgICBpZiAocEFycmF5KSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRmluZCA9IGNzQ29uZmlnICsgRlhfQlNUUkMoIlN0YXRlIik7Ci0gICAgICAgIGludDMyX3QgaUNvdW50ID0gcEFycmF5LT5HZXRDb3VudCgpOwotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSAqcFVzYWdlID0gcEFycmF5LT5HZXREaWN0KGkpOwotICAgICAgICAgICAgaWYgKCFwVXNhZ2UpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwVXNhZ2UtPkdldFN0cmluZyhGWF9CU1RSQygiRXZlbnQiKSwgRlhfQlNUUkMoIlZpZXciKSkgIT0gY3NDb25maWcpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENQREZfQXJyYXkgKnBPQ0dzID0gcFVzYWdlLT5HZXRBcnJheShGWF9CU1RSQygiT0NHcyIpKTsKLSAgICAgICAgICAgIGlmICghcE9DR3MpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChGUERGRE9DX09DR19GaW5kR3JvdXAocE9DR3MsIHBPQ0dEaWN0KSA8IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSAqcFN0YXRlID0gcFVzYWdlLT5HZXREaWN0KGNzQ29uZmlnKTsKLSAgICAgICAgICAgIGlmICghcFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiU3RhdGUgPSBwU3RhdGUtPkdldFN0cmluZyhjc0ZpbmQpICE9IEZYX0JTVFJDKCJPRkYiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYlN0YXRlOwotfQotRlhfQk9PTCBDUERGX09DQ29udGV4dDo6TG9hZE9DR1N0YXRlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpIGNvbnN0Ci17Ci0gICAgaWYgKCFGUERGRE9DX09DR19IYXNJbnRlbnQocE9DR0RpY3QsIEZYX0JTVFJDKCJWaWV3IiksIEZYX0JTVFJDKCJWaWV3IikpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1N0YXRlID0gRlBERkRPQ19PQ0dfR2V0VXNhZ2VUeXBlU3RyaW5nKG1fZVVzYWdlVHlwZSk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwVXNhZ2UgPSBwT0NHRGljdC0+R2V0RGljdChGWF9CU1RSQygiVXNhZ2UiKSk7Ci0gICAgaWYgKHBVc2FnZSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBTdGF0ZSA9IHBVc2FnZS0+R2V0RGljdChjc1N0YXRlKTsKLSAgICAgICAgaWYgKHBTdGF0ZSkgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGaW5kID0gY3NTdGF0ZSArIEZYX0JTVFJDKCJTdGF0ZSIpOwotICAgICAgICAgICAgaWYgKHBTdGF0ZS0+S2V5RXhpc3QoY3NGaW5kKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwU3RhdGUtPkdldFN0cmluZyhjc0ZpbmQpICE9IEZYX0JTVFJDKCJPRkYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY3NTdGF0ZSAhPSBGWF9CU1RSQygiVmlldyIpKSB7Ci0gICAgICAgICAgICBwU3RhdGUgPSBwVXNhZ2UtPkdldERpY3QoRlhfQlNUUkMoIlZpZXciKSk7Ci0gICAgICAgICAgICBpZiAocFN0YXRlICYmIHBTdGF0ZS0+S2V5RXhpc3QoRlhfQlNUUkMoIlZpZXdTdGF0ZSIpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwU3RhdGUtPkdldFN0cmluZyhGWF9CU1RSQygiVmlld1N0YXRlIikpICE9IEZYX0JTVFJDKCJPRkYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9CT09MIGJEZWZWYWxpZCA9IEZBTFNFOwotICAgIHJldHVybiBMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNzU3RhdGUsIHBPQ0dEaWN0LCBiRGVmVmFsaWQpOwotfQotCi1GWF9CT09MIENQREZfT0NDb250ZXh0OjpHZXRPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QpCi17Ci0gICAgaWYgKCFwT0NHRGljdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgY29uc3QgYXV0byBpdCA9IG1fT0NHU3RhdGVzLmZpbmQocE9DR0RpY3QpOwotICAgIGlmIChpdCAhPSBtX09DR1N0YXRlcy5lbmQoKSkKLSAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7Ci0KLSAgICBGWF9CT09MIGJTdGF0ZSA9IExvYWRPQ0dTdGF0ZShwT0NHRGljdCk7Ci0gICAgbV9PQ0dTdGF0ZXNbcE9DR0RpY3RdID0gYlN0YXRlOwotICAgIHJldHVybiBiU3RhdGU7Ci19Ci0KLUZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkdldE9DR1ZFKENQREZfQXJyYXkgKnBFeHByZXNzaW9uLCBGWF9CT09MIGJGcm9tQ29uZmlnLCBpbnQgbkxldmVsKQotewotICAgIGlmIChuTGV2ZWwgPiAzMikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChwRXhwcmVzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50MzJfdCBpQ291bnQgPSBwRXhwcmVzc2lvbi0+R2V0Q291bnQoKTsKLSAgICBDUERGX09iamVjdCAqcE9DR09iajsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc09wZXJhdG9yID0gcEV4cHJlc3Npb24tPkdldFN0cmluZygwKTsKLSAgICBpZiAoY3NPcGVyYXRvciA9PSBGWF9CU1RSQygiTm90IikpIHsKLSAgICAgICAgcE9DR09iaiA9IHBFeHByZXNzaW9uLT5HZXRFbGVtZW50VmFsdWUoMSk7Ci0gICAgICAgIGlmIChwT0NHT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocE9DR09iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICByZXR1cm4gIShiRnJvbUNvbmZpZyA/IExvYWRPQ0dTdGF0ZSgoQ1BERl9EaWN0aW9uYXJ5KilwT0NHT2JqKSA6IEdldE9DR1Zpc2libGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwT0NHT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICByZXR1cm4gIUdldE9DR1ZFKChDUERGX0FycmF5KilwT0NHT2JqLCBiRnJvbUNvbmZpZywgbkxldmVsICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoY3NPcGVyYXRvciA9PSBGWF9CU1RSQygiT3IiKSB8fCBjc09wZXJhdG9yID09IEZYX0JTVFJDKCJBbmQiKSkgewotICAgICAgICBGWF9CT09MIGJWYWx1ZSA9IEZBTFNFOwotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIHBPQ0dPYmogPSBwRXhwcmVzc2lvbi0+R2V0RWxlbWVudFZhbHVlKDEpOwotICAgICAgICAgICAgaWYgKHBPQ0dPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfQk9PTCBiSXRlbSA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgICAgIGJJdGVtID0gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaikgOiBHZXRPQ0dWaXNpYmxlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwT0NHT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICAgICAgYkl0ZW0gPSBHZXRPQ0dWRSgoQ1BERl9BcnJheSopcE9DR09iaiwgYkZyb21Db25maWcsIG5MZXZlbCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPT0gMSkgewotICAgICAgICAgICAgICAgIGJWYWx1ZSA9IGJJdGVtOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY3NPcGVyYXRvciA9PSBGWF9CU1RSQygiT3IiKSkgewotICAgICAgICAgICAgICAgICAgICBiVmFsdWUgPSBiVmFsdWUgfHwgYkl0ZW07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbHVlID0gYlZhbHVlICYmIGJJdGVtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYlZhbHVlOworICAgICAgfQogICAgIH0KICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgYnNJbnRlbnQgPSBwSW50ZW50LT5HZXRTdHJpbmcoKTsKKyAgcmV0dXJuIGJzSW50ZW50ID09IEZYX0JTVFJDKCJBbGwiKSB8fCBic0ludGVudCA9PSBjc0VsZW1lbnQ7CiB9Ci1GWF9CT09MIENQREZfT0NDb250ZXh0OjpMb2FkT0NNRFN0YXRlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DTUREaWN0LCBGWF9CT09MIGJGcm9tQ29uZmlnKQotewotICAgIEZYU1lTX2Fzc2VydChwT0NNRERpY3QgIT0gTlVMTCk7Ci0gICAgQ1BERl9BcnJheSAqcFZFID0gcE9DTUREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiVkUiKSk7Ci0gICAgaWYgKHBWRSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBHZXRPQ0dWRShwVkUsIGJGcm9tQ29uZmlnKTsKK3N0YXRpYyBDUERGX0RpY3Rpb25hcnkqIEZQREZET0NfT0NHX0dldENvbmZpZyhDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1N0YXRlKSB7CisgIEZYU1lTX2Fzc2VydChwRG9jICYmIHBPQ0dEaWN0KTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwT0NQcm9wZXJ0aWVzID0KKyAgICAgIHBEb2MtPkdldFJvb3QoKS0+R2V0RGljdChGWF9CU1RSQygiT0NQcm9wZXJ0aWVzIikpOworICBpZiAoIXBPQ1Byb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0FycmF5KiBwT0NHcyA9IHBPQ1Byb3BlcnRpZXMtPkdldEFycmF5KEZYX0JTVFJDKCJPQ0dzIikpOworICBpZiAoIXBPQ0dzKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwT0NHcywgcE9DR0RpY3QpIDwgMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRGljdGlvbmFyeSogcENvbmZpZyA9IHBPQ1Byb3BlcnRpZXMtPkdldERpY3QoRlhfQlNUUkMoIkQiKSk7CisgIENQREZfQXJyYXkqIHBDb25maWdzID0gcE9DUHJvcGVydGllcy0+R2V0QXJyYXkoRlhfQlNUUkMoIkNvbmZpZ3MiKSk7CisgIGlmIChwQ29uZmlncykgeworICAgIENQREZfRGljdGlvbmFyeSogcEZpbmQ7CisgICAgaW50MzJfdCBpQ291bnQgPSBwQ29uZmlncy0+R2V0Q291bnQoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgcEZpbmQgPSBwQ29uZmlncy0+R2V0RGljdChpKTsKKyAgICAgIGlmICghcEZpbmQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoIUZQREZET0NfT0NHX0hhc0ludGVudChwRmluZCwgRlhfQlNUUkMoIlZpZXciKSwgRlhfQlNUUkMoIlZpZXciKSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBwQ29uZmlnID0gcEZpbmQ7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NQID0gcE9DTUREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlAiKSwgRlhfQlNUUkMoIkFueU9uIikpOwotICAgIENQREZfT2JqZWN0ICpwT0NHT2JqID0gcE9DTUREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIk9DR3MiKSk7CisgIH0KKyAgcmV0dXJuIHBDb25maWc7Cit9CitzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgRlBERkRPQ19PQ0dfR2V0VXNhZ2VUeXBlU3RyaW5nKAorICAgIENQREZfT0NDb250ZXh0OjpVc2FnZVR5cGUgZVR5cGUpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NTdGF0ZSA9IEZYX0JTVFJDKCJWaWV3Iik7CisgIGlmIChlVHlwZSA9PSBDUERGX09DQ29udGV4dDo6RGVzaWduKSB7CisgICAgY3NTdGF0ZSA9IEZYX0JTVFJDKCJEZXNpZ24iKTsKKyAgfSBlbHNlIGlmIChlVHlwZSA9PSBDUERGX09DQ29udGV4dDo6UHJpbnQpIHsKKyAgICBjc1N0YXRlID0gRlhfQlNUUkMoIlByaW50Iik7CisgIH0gZWxzZSBpZiAoZVR5cGUgPT0gQ1BERl9PQ0NvbnRleHQ6OkV4cG9ydCkgeworICAgIGNzU3RhdGUgPSBGWF9CU1RSQygiRXhwb3J0Iik7CisgIH0KKyAgcmV0dXJuIGNzU3RhdGU7Cit9CitDUERGX09DQ29udGV4dDo6Q1BERl9PQ0NvbnRleHQoQ1BERl9Eb2N1bWVudCogcERvYywgVXNhZ2VUeXBlIGVVc2FnZVR5cGUpIHsKKyAgRlhTWVNfYXNzZXJ0KHBEb2MgIT0gTlVMTCk7CisgIG1fcERvY3VtZW50ID0gcERvYzsKKyAgbV9lVXNhZ2VUeXBlID0gZVVzYWdlVHlwZTsKK30KK0NQREZfT0NDb250ZXh0Ojp+Q1BERl9PQ0NvbnRleHQoKSB7CisgIG1fT0NHU3RhdGVzLmNsZWFyKCk7Cit9CitGWF9CT09MIENQREZfT0NDb250ZXh0OjpMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJWYWxpZENvbmZpZykgY29uc3QgeworICBDUERGX0RpY3Rpb25hcnkqIHBDb25maWcgPQorICAgICAgRlBERkRPQ19PQ0dfR2V0Q29uZmlnKG1fcERvY3VtZW50LCBwT0NHRGljdCwgY3NDb25maWcpOworICBpZiAoIXBDb25maWcpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBiVmFsaWRDb25maWcgPSBUUlVFOworICBGWF9CT09MIGJTdGF0ZSA9IHBDb25maWctPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZVN0YXRlIiksIEZYX0JTVFJDKCJPTiIpKSAhPQorICAgICAgICAgICAgICAgICAgIEZYX0JTVFJDKCJPRkYiKTsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcENvbmZpZy0+R2V0QXJyYXkoRlhfQlNUUkMoIk9OIikpOworICBpZiAocEFycmF5KSB7CisgICAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwQXJyYXksIHBPQ0dEaWN0KSA+PSAwKSB7CisgICAgICBiU3RhdGUgPSBUUlVFOworICAgIH0KKyAgfQorICBwQXJyYXkgPSBwQ29uZmlnLT5HZXRBcnJheShGWF9CU1RSQygiT0ZGIikpOworICBpZiAocEFycmF5KSB7CisgICAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwQXJyYXksIHBPQ0dEaWN0KSA+PSAwKSB7CisgICAgICBiU3RhdGUgPSBGQUxTRTsKKyAgICB9CisgIH0KKyAgcEFycmF5ID0gcENvbmZpZy0+R2V0QXJyYXkoRlhfQlNUUkMoIkFTIikpOworICBpZiAocEFycmF5KSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGaW5kID0gY3NDb25maWcgKyBGWF9CU1RSQygiU3RhdGUiKTsKKyAgICBpbnQzMl90IGlDb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwVXNhZ2UgPSBwQXJyYXktPkdldERpY3QoaSk7CisgICAgICBpZiAoIXBVc2FnZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwVXNhZ2UtPkdldFN0cmluZyhGWF9CU1RSQygiRXZlbnQiKSwgRlhfQlNUUkMoIlZpZXciKSkgIT0gY3NDb25maWcpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBDUERGX0FycmF5KiBwT0NHcyA9IHBVc2FnZS0+R2V0QXJyYXkoRlhfQlNUUkMoIk9DR3MiKSk7CisgICAgICBpZiAoIXBPQ0dzKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwT0NHcywgcE9DR0RpY3QpIDwgMCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIENQREZfRGljdGlvbmFyeSogcFN0YXRlID0gcFVzYWdlLT5HZXREaWN0KGNzQ29uZmlnKTsKKyAgICAgIGlmICghcFN0YXRlKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYlN0YXRlID0gcFN0YXRlLT5HZXRTdHJpbmcoY3NGaW5kKSAhPSBGWF9CU1RSQygiT0ZGIik7CisgICAgfQorICB9CisgIHJldHVybiBiU3RhdGU7Cit9CitGWF9CT09MIENQREZfT0NDb250ZXh0OjpMb2FkT0NHU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHRGljdCkgY29uc3QgeworICBpZiAoIUZQREZET0NfT0NHX0hhc0ludGVudChwT0NHRGljdCwgRlhfQlNUUkMoIlZpZXciKSwgRlhfQlNUUkMoIlZpZXciKSkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc1N0YXRlID0gRlBERkRPQ19PQ0dfR2V0VXNhZ2VUeXBlU3RyaW5nKG1fZVVzYWdlVHlwZSk7CisgIENQREZfRGljdGlvbmFyeSogcFVzYWdlID0gcE9DR0RpY3QtPkdldERpY3QoRlhfQlNUUkMoIlVzYWdlIikpOworICBpZiAocFVzYWdlKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RhdGUgPSBwVXNhZ2UtPkdldERpY3QoY3NTdGF0ZSk7CisgICAgaWYgKHBTdGF0ZSkgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGaW5kID0gY3NTdGF0ZSArIEZYX0JTVFJDKCJTdGF0ZSIpOworICAgICAgaWYgKHBTdGF0ZS0+S2V5RXhpc3QoY3NGaW5kKSkgeworICAgICAgICByZXR1cm4gcFN0YXRlLT5HZXRTdHJpbmcoY3NGaW5kKSAhPSBGWF9CU1RSQygiT0ZGIik7CisgICAgICB9CisgICAgfQorICAgIGlmIChjc1N0YXRlICE9IEZYX0JTVFJDKCJWaWV3IikpIHsKKyAgICAgIHBTdGF0ZSA9IHBVc2FnZS0+R2V0RGljdChGWF9CU1RSQygiVmlldyIpKTsKKyAgICAgIGlmIChwU3RhdGUgJiYgcFN0YXRlLT5LZXlFeGlzdChGWF9CU1RSQygiVmlld1N0YXRlIikpKSB7CisgICAgICAgIHJldHVybiBwU3RhdGUtPkdldFN0cmluZyhGWF9CU1RSQygiVmlld1N0YXRlIikpICE9IEZYX0JTVFJDKCJPRkYiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgRlhfQk9PTCBiRGVmVmFsaWQgPSBGQUxTRTsKKyAgcmV0dXJuIExvYWRPQ0dTdGF0ZUZyb21Db25maWcoY3NTdGF0ZSwgcE9DR0RpY3QsIGJEZWZWYWxpZCk7Cit9CisKK0ZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkdldE9DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHRGljdCkgeworICBpZiAoIXBPQ0dEaWN0KQorICAgIHJldHVybiBGQUxTRTsKKworICBjb25zdCBhdXRvIGl0ID0gbV9PQ0dTdGF0ZXMuZmluZChwT0NHRGljdCk7CisgIGlmIChpdCAhPSBtX09DR1N0YXRlcy5lbmQoKSkKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKworICBGWF9CT09MIGJTdGF0ZSA9IExvYWRPQ0dTdGF0ZShwT0NHRGljdCk7CisgIG1fT0NHU3RhdGVzW3BPQ0dEaWN0XSA9IGJTdGF0ZTsKKyAgcmV0dXJuIGJTdGF0ZTsKK30KKworRlhfQk9PTCBDUERGX09DQ29udGV4dDo6R2V0T0NHVkUoQ1BERl9BcnJheSogcEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGcm9tQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCkgeworICBpZiAobkxldmVsID4gMzIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBFeHByZXNzaW9uID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50MzJfdCBpQ291bnQgPSBwRXhwcmVzc2lvbi0+R2V0Q291bnQoKTsKKyAgQ1BERl9PYmplY3QqIHBPQ0dPYmo7CisgIENGWF9CeXRlU3RyaW5nIGNzT3BlcmF0b3IgPSBwRXhwcmVzc2lvbi0+R2V0U3RyaW5nKDApOworICBpZiAoY3NPcGVyYXRvciA9PSBGWF9CU1RSQygiTm90IikpIHsKKyAgICBwT0NHT2JqID0gcEV4cHJlc3Npb24tPkdldEVsZW1lbnRWYWx1ZSgxKTsKICAgICBpZiAocE9DR09iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAocE9DR09iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHJldHVybiBiRnJvbUNvbmZpZyA/IExvYWRPQ0dTdGF0ZSgoQ1BERl9EaWN0aW9uYXJ5KilwT0NHT2JqKSA6IEdldE9DR1Zpc2libGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaik7CisgICAgICByZXR1cm4gIShiRnJvbUNvbmZpZyA/IExvYWRPQ0dTdGF0ZSgoQ1BERl9EaWN0aW9uYXJ5KilwT0NHT2JqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRPQ0dWaXNpYmxlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopKTsKICAgICB9Ci0gICAgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICAgIHJldHVybiAhR2V0T0NHVkUoKENQREZfQXJyYXkqKXBPQ0dPYmosIGJGcm9tQ29uZmlnLCBuTGV2ZWwgKyAxKTsKICAgICB9Ci0gICAgRlhfQk9PTCBiU3RhdGUgPSBGQUxTRTsKLSAgICBpZiAoY3NQID09IEZYX0JTVFJDKCJBbGxPbiIpIHx8IGNzUCA9PSBGWF9CU1RSQygiQWxsT2ZmIikpIHsKLSAgICAgICAgYlN0YXRlID0gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKGNzT3BlcmF0b3IgPT0gRlhfQlNUUkMoIk9yIikgfHwgY3NPcGVyYXRvciA9PSBGWF9CU1RSQygiQW5kIikpIHsKKyAgICBGWF9CT09MIGJWYWx1ZSA9IEZBTFNFOworICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgICBwT0NHT2JqID0gcEV4cHJlc3Npb24tPkdldEVsZW1lbnRWYWx1ZSgxKTsKKyAgICAgIGlmIChwT0NHT2JqID09IE5VTEwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBGWF9CT09MIGJJdGVtID0gRkFMU0U7CisgICAgICBpZiAocE9DR09iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgICAgIGJJdGVtID0gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldE9DR1Zpc2libGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaik7CisgICAgICB9IGVsc2UgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICAgICAgYkl0ZW0gPSBHZXRPQ0dWRSgoQ1BERl9BcnJheSopcE9DR09iaiwgYkZyb21Db25maWcsIG5MZXZlbCArIDEpOworICAgICAgfQorICAgICAgaWYgKGkgPT0gMSkgeworICAgICAgICBiVmFsdWUgPSBiSXRlbTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjc09wZXJhdG9yID09IEZYX0JTVFJDKCJPciIpKSB7CisgICAgICAgICAgYlZhbHVlID0gYlZhbHVlIHx8IGJJdGVtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJWYWx1ZSA9IGJWYWx1ZSAmJiBiSXRlbTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBpbnQzMl90IGlDb3VudCA9ICgoQ1BERl9BcnJheSopcE9DR09iaiktPkdldENvdW50KCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgIEZYX0JPT0wgYkl0ZW0gPSBUUlVFOwotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBJdGVtRGljdCA9ICgoQ1BERl9BcnJheSopcE9DR09iaiktPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwSXRlbURpY3QpIHsKLSAgICAgICAgICAgIGJJdGVtID0gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUocEl0ZW1EaWN0KSA6IEdldE9DR1Zpc2libGUocEl0ZW1EaWN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3NQID09IEZYX0JTVFJDKCJBbnlPbiIpICYmIGJJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3NQID09IEZYX0JTVFJDKCJBbnlPZmYiKSAmJiAhYkl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjc1AgPT0gRlhfQlNUUkMoIkFsbE9uIikgJiYgIWJJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNzUCA9PSBGWF9CU1RSQygiQWxsT2ZmIikgJiYgYkl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYlN0YXRlOworICAgIHJldHVybiBiVmFsdWU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDUERGX09DQ29udGV4dDo6Q2hlY2tPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpCi17Ci0gICAgaWYgKCFwT0NHRGljdCkgewotICAgICAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkxvYWRPQ01EU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NNRERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZyb21Db25maWcpIHsKKyAgRlhTWVNfYXNzZXJ0KHBPQ01ERGljdCAhPSBOVUxMKTsKKyAgQ1BERl9BcnJheSogcFZFID0gcE9DTUREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiVkUiKSk7CisgIGlmIChwVkUgIT0gTlVMTCkgeworICAgIHJldHVybiBHZXRPQ0dWRShwVkUsIGJGcm9tQ29uZmlnKTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc1AgPSBwT0NNRERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiUCIpLCBGWF9CU1RSQygiQW55T24iKSk7CisgIENQREZfT2JqZWN0KiBwT0NHT2JqID0gcE9DTUREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIk9DR3MiKSk7CisgIGlmIChwT0NHT2JqID09IE5VTEwpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAocE9DR09iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgcmV0dXJuIGJGcm9tQ29uZmlnID8gTG9hZE9DR1N0YXRlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopCisgICAgICAgICAgICAgICAgICAgICAgIDogR2V0T0NHVmlzaWJsZSgoQ1BERl9EaWN0aW9uYXJ5KilwT0NHT2JqKTsKKyAgfQorICBpZiAocE9DR09iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIEZYX0JPT0wgYlN0YXRlID0gRkFMU0U7CisgIGlmIChjc1AgPT0gRlhfQlNUUkMoIkFsbE9uIikgfHwgY3NQID09IEZYX0JTVFJDKCJBbGxPZmYiKSkgeworICAgIGJTdGF0ZSA9IFRSVUU7CisgIH0KKyAgaW50MzJfdCBpQ291bnQgPSAoKENQREZfQXJyYXkqKXBPQ0dPYmopLT5HZXRDb3VudCgpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIEZYX0JPT0wgYkl0ZW0gPSBUUlVFOworICAgIENQREZfRGljdGlvbmFyeSogcEl0ZW1EaWN0ID0gKChDUERGX0FycmF5KilwT0NHT2JqKS0+R2V0RGljdChpKTsKKyAgICBpZiAocEl0ZW1EaWN0KSB7CisgICAgICBiSXRlbSA9IGJGcm9tQ29uZmlnID8gTG9hZE9DR1N0YXRlKHBJdGVtRGljdCkgOiBHZXRPQ0dWaXNpYmxlKHBJdGVtRGljdCk7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IHBPQ0dEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIk9DRyIpKTsKLSAgICBpZiAoY3NUeXBlID09IEZYX0JTVFJDKCJPQ0ciKSkgewotICAgICAgICByZXR1cm4gR2V0T0NHVmlzaWJsZShwT0NHRGljdCk7CisgICAgaWYgKGNzUCA9PSBGWF9CU1RSQygiQW55T24iKSAmJiBiSXRlbSkgeworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBMb2FkT0NNRFN0YXRlKHBPQ0dEaWN0LCBGQUxTRSk7CisgICAgaWYgKGNzUCA9PSBGWF9CU1RSQygiQW55T2ZmIikgJiYgIWJJdGVtKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaWYgKGNzUCA9PSBGWF9CU1RSQygiQWxsT24iKSAmJiAhYkl0ZW0pIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKGNzUCA9PSBGWF9CU1RSQygiQWxsT2ZmIikgJiYgYkl0ZW0pIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGJTdGF0ZTsKIH0KLXZvaWQgQ1BERl9PQ0NvbnRleHQ6OlJlc2V0T0NDb250ZXh0KCkKLXsKLSAgICBtX09DR1N0YXRlcy5jbGVhcigpOworRlhfQk9PTCBDUERGX09DQ29udGV4dDo6Q2hlY2tPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QpIHsKKyAgaWYgKCFwT0NHRGljdCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9CisgICAgICBwT0NHRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJUeXBlIiksIEZYX0JTVFJDKCJPQ0ciKSk7CisgIGlmIChjc1R5cGUgPT0gRlhfQlNUUkMoIk9DRyIpKSB7CisgICAgcmV0dXJuIEdldE9DR1Zpc2libGUocE9DR0RpY3QpOworICB9CisgIHJldHVybiBMb2FkT0NNRFN0YXRlKHBPQ0dEaWN0LCBGQUxTRSk7Cit9Cit2b2lkIENQREZfT0NDb250ZXh0OjpSZXNldE9DQ29udGV4dCgpIHsKKyAgbV9PQ0dTdGF0ZXMuY2xlYXIoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3RhZ2dlZC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY190YWdnZWQuY3BwCmluZGV4IGFjMjhiMWQuLmZlN2U1ZTEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3RhZ2dlZC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdGFnZ2VkLmNwcApAQCAtOSw0NDUgKzksNDY2IEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdGFnZ2VkLmgiCiAjaW5jbHVkZSAidGFnZ2VkX2ludC5oIgogY29uc3QgaW50IG5NYXhSZWN1cnNpb24gPSAzMjsKLXN0YXRpYyBGWF9CT09MIElzVGFnZ2VkKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ2F0YWxvZyA9IHBEb2MtPkdldFJvb3QoKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBNYXJrSW5mbyA9IHBDYXRhbG9nLT5HZXREaWN0KEZYX0JTVFJDKCJNYXJrSW5mbyIpKTsKLSAgICByZXR1cm4gcE1hcmtJbmZvICE9IE5VTEwgJiYgcE1hcmtJbmZvLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJNYXJrZWQiKSk7CitzdGF0aWMgRlhfQk9PTCBJc1RhZ2dlZChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKSB7CisgIENQREZfRGljdGlvbmFyeSogcENhdGFsb2cgPSBwRG9jLT5HZXRSb290KCk7CisgIENQREZfRGljdGlvbmFyeSogcE1hcmtJbmZvID0gcENhdGFsb2ctPkdldERpY3QoRlhfQlNUUkMoIk1hcmtJbmZvIikpOworICByZXR1cm4gcE1hcmtJbmZvICE9IE5VTEwgJiYgcE1hcmtJbmZvLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJNYXJrZWQiKSk7CiB9Ci1DUERGX1N0cnVjdFRyZWUqIENQREZfU3RydWN0VHJlZTo6TG9hZFBhZ2UoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpCi17Ci0gICAgaWYgKCFJc1RhZ2dlZChwRG9jKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9TdHJ1Y3RUcmVlSW1wbCogcFRyZWUgPSBGWF9ORVcgQ1BERl9TdHJ1Y3RUcmVlSW1wbChwRG9jKTsKLSAgICBpZiAocFRyZWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcFRyZWUtPkxvYWRQYWdlVHJlZShwUGFnZURpY3QpOwotICAgIHJldHVybiBwVHJlZTsKK0NQREZfU3RydWN0VHJlZSogQ1BERl9TdHJ1Y3RUcmVlOjpMb2FkUGFnZShjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KSB7CisgIGlmICghSXNUYWdnZWQocERvYykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX1N0cnVjdFRyZWVJbXBsKiBwVHJlZSA9IEZYX05FVyBDUERGX1N0cnVjdFRyZWVJbXBsKHBEb2MpOworICBpZiAocFRyZWUgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHBUcmVlLT5Mb2FkUGFnZVRyZWUocFBhZ2VEaWN0KTsKKyAgcmV0dXJuIHBUcmVlOwogfQotQ1BERl9TdHJ1Y3RUcmVlKiBDUERGX1N0cnVjdFRyZWU6OkxvYWREb2MoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBpZiAoIUlzVGFnZ2VkKHBEb2MpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX1N0cnVjdFRyZWVJbXBsKiBwVHJlZSA9IEZYX05FVyBDUERGX1N0cnVjdFRyZWVJbXBsKHBEb2MpOwotICAgIGlmIChwVHJlZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwVHJlZS0+TG9hZERvY1RyZWUoKTsKLSAgICByZXR1cm4gcFRyZWU7CitDUERGX1N0cnVjdFRyZWUqIENQREZfU3RydWN0VHJlZTo6TG9hZERvYyhjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKSB7CisgIGlmICghSXNUYWdnZWQocERvYykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX1N0cnVjdFRyZWVJbXBsKiBwVHJlZSA9IEZYX05FVyBDUERGX1N0cnVjdFRyZWVJbXBsKHBEb2MpOworICBpZiAocFRyZWUgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHBUcmVlLT5Mb2FkRG9jVHJlZSgpOworICByZXR1cm4gcFRyZWU7CiB9Ci1DUERGX1N0cnVjdFRyZWVJbXBsOjpDUERGX1N0cnVjdFRyZWVJbXBsKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ2F0YWxvZyA9IHBEb2MtPkdldFJvb3QoKTsKLSAgICBtX3BUcmVlUm9vdCA9IHBDYXRhbG9nLT5HZXREaWN0KEZYX0JTVFJDKCJTdHJ1Y3RUcmVlUm9vdCIpKTsKLSAgICBpZiAobV9wVHJlZVJvb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcFJvbGVNYXAgPSBtX3BUcmVlUm9vdC0+R2V0RGljdChGWF9CU1RSQygiUm9sZU1hcCIpKTsKK0NQREZfU3RydWN0VHJlZUltcGw6OkNQREZfU3RydWN0VHJlZUltcGwoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYykgeworICBDUERGX0RpY3Rpb25hcnkqIHBDYXRhbG9nID0gcERvYy0+R2V0Um9vdCgpOworICBtX3BUcmVlUm9vdCA9IHBDYXRhbG9nLT5HZXREaWN0KEZYX0JTVFJDKCJTdHJ1Y3RUcmVlUm9vdCIpKTsKKyAgaWYgKG1fcFRyZWVSb290ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wUm9sZU1hcCA9IG1fcFRyZWVSb290LT5HZXREaWN0KEZYX0JTVFJDKCJSb2xlTWFwIikpOwogfQotQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6fkNQREZfU3RydWN0VHJlZUltcGwoKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9LaWRzLkdldFNpemUoKTsgaSArKykKLSAgICAgICAgaWYgKG1fS2lkc1tpXSkgewotICAgICAgICAgICAgbV9LaWRzW2ldLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0KLX0KLXZvaWQgQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6TG9hZERvY1RyZWUoKQotewotICAgIG1fcFBhZ2UgPSBOVUxMOwotICAgIGlmIChtX3BUcmVlUm9vdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBLaWRzID0gbV9wVHJlZVJvb3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiSyIpKTsKLSAgICBpZiAocEtpZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwS2lkcy0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBTdHJ1Y3RFbGVtZW50SW1wbCA9IEZYX05FVyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKHRoaXMsIE5VTEwsIChDUERGX0RpY3Rpb25hcnkqKXBLaWRzKTsKLSAgICAgICAgaWYgKHBTdHJ1Y3RFbGVtZW50SW1wbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbV9LaWRzLkFkZChwU3RydWN0RWxlbWVudEltcGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwS2lkcy0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwS2lkczsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEtpZCA9IHBBcnJheS0+R2V0RGljdChpKTsKLSAgICAgICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFN0cnVjdEVsZW1lbnRJbXBsID0gRlhfTkVXIENQREZfU3RydWN0RWxlbWVudEltcGwodGhpcywgTlVMTCwgcEtpZCk7Ci0gICAgICAgIGlmIChwU3RydWN0RWxlbWVudEltcGwgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fS2lkcy5BZGQocFN0cnVjdEVsZW1lbnRJbXBsKTsKK0NQREZfU3RydWN0VHJlZUltcGw6On5DUERGX1N0cnVjdFRyZWVJbXBsKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1fS2lkcy5HZXRTaXplKCk7IGkrKykKKyAgICBpZiAobV9LaWRzW2ldKSB7CisgICAgICBtX0tpZHNbaV0tPlJlbGVhc2UoKTsKICAgICB9CiB9Ci12b2lkIENQREZfU3RydWN0VHJlZUltcGw6OkxvYWRQYWdlVHJlZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCkKLXsKLSAgICBtX3BQYWdlID0gcFBhZ2VEaWN0OwotICAgIGlmIChtX3BUcmVlUm9vdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6TG9hZERvY1RyZWUoKSB7CisgIG1fcFBhZ2UgPSBOVUxMOworICBpZiAobV9wVHJlZVJvb3QgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX09iamVjdCogcEtpZHMgPSBtX3BUcmVlUm9vdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJLIikpOworICBpZiAocEtpZHMgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAocEtpZHMtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBTdHJ1Y3RFbGVtZW50SW1wbCA9CisgICAgICAgIEZYX05FVyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKHRoaXMsIE5VTEwsIChDUERGX0RpY3Rpb25hcnkqKXBLaWRzKTsKKyAgICBpZiAocFN0cnVjdEVsZW1lbnRJbXBsID09IE5VTEwpIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBLaWRzID0gbV9wVHJlZVJvb3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiSyIpKTsKLSAgICBpZiAocEtpZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CisgICAgbV9LaWRzLkFkZChwU3RydWN0RWxlbWVudEltcGwpOworICAgIHJldHVybjsKKyAgfQorICBpZiAocEtpZHMtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBLaWRzOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwQXJyYXktPkdldERpY3QoaSk7CisgICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFN0cnVjdEVsZW1lbnRJbXBsID0KKyAgICAgICAgRlhfTkVXIENQREZfU3RydWN0RWxlbWVudEltcGwodGhpcywgTlVMTCwgcEtpZCk7CisgICAgaWYgKHBTdHJ1Y3RFbGVtZW50SW1wbCA9PSBOVUxMKSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIEZYX0RXT1JEIGR3S2lkcyA9IDA7Ci0gICAgaWYgKHBLaWRzLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgZHdLaWRzID0gMTsKLSAgICB9IGVsc2UgaWYgKHBLaWRzLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIGR3S2lkcyA9ICgoQ1BERl9BcnJheSopcEtpZHMpLT5HZXRDb3VudCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfRFdPUkQgaTsKLSAgICBtX0tpZHMuU2V0U2l6ZShkd0tpZHMpOwotICAgIGZvciAoaSA9IDA7IGkgPCBkd0tpZHM7IGkgKyspIHsKLSAgICAgICAgbV9LaWRzW2ldID0gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX01hcFB0clRvUHRyIGVsZW1lbnRfbWFwOwotICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudFRyZWUgPSBtX3BUcmVlUm9vdC0+R2V0RGljdChGWF9CU1RSQygiUGFyZW50VHJlZSIpKTsKLSAgICBpZiAocFBhcmVudFRyZWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfTnVtYmVyVHJlZSBwYXJlbnRfdHJlZShwUGFyZW50VHJlZSk7Ci0gICAgaW50IHBhcmVudHNfaWQgPSBwUGFnZURpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlN0cnVjdFBhcmVudHMiKSwgLTEpOwotICAgIGlmIChwYXJlbnRzX2lkID49IDApIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBQYXJlbnRzID0gcGFyZW50X3RyZWUuTG9va3VwVmFsdWUocGFyZW50c19pZCk7Ci0gICAgICAgIGlmIChwUGFyZW50cyA9PSBOVUxMIHx8IHBQYXJlbnRzLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9BcnJheSogcFBhcmVudEFycmF5ID0gKENQREZfQXJyYXkqKXBQYXJlbnRzOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBhcmVudEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnQgPSBwUGFyZW50QXJyYXktPkdldERpY3QoaSk7Ci0gICAgICAgICAgICBpZiAocFBhcmVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBZGRQYWdlTm9kZShwUGFyZW50LCBlbGVtZW50X21hcCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgbV9LaWRzLkFkZChwU3RydWN0RWxlbWVudEltcGwpOworICB9CiB9Ci1DUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBDUERGX1N0cnVjdFRyZWVJbXBsOjpBZGRQYWdlTm9kZShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDRlhfTWFwUHRyVG9QdHImIG1hcCwgaW50IG5MZXZlbCkKLXsKLSAgICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgewotICAgICAgICByZXR1cm4gTlVMTDsKK3ZvaWQgQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6TG9hZFBhZ2VUcmVlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KSB7CisgIG1fcFBhZ2UgPSBwUGFnZURpY3Q7CisgIGlmIChtX3BUcmVlUm9vdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfT2JqZWN0KiBwS2lkcyA9IG1fcFRyZWVSb290LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIksiKSk7CisgIGlmIChwS2lkcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0RXT1JEIGR3S2lkcyA9IDA7CisgIGlmIChwS2lkcy0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgZHdLaWRzID0gMTsKKyAgfSBlbHNlIGlmIChwS2lkcy0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgIGR3S2lkcyA9ICgoQ1BERl9BcnJheSopcEtpZHMpLT5HZXRDb3VudCgpOworICB9IGVsc2UgeworICAgIHJldHVybjsKKyAgfQorICBGWF9EV09SRCBpOworICBtX0tpZHMuU2V0U2l6ZShkd0tpZHMpOworICBmb3IgKGkgPSAwOyBpIDwgZHdLaWRzOyBpKyspIHsKKyAgICBtX0tpZHNbaV0gPSBOVUxMOworICB9CisgIENGWF9NYXBQdHJUb1B0ciBlbGVtZW50X21hcDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50VHJlZSA9IG1fcFRyZWVSb290LT5HZXREaWN0KEZYX0JTVFJDKCJQYXJlbnRUcmVlIikpOworICBpZiAocFBhcmVudFRyZWUgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX051bWJlclRyZWUgcGFyZW50X3RyZWUocFBhcmVudFRyZWUpOworICBpbnQgcGFyZW50c19pZCA9IHBQYWdlRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiU3RydWN0UGFyZW50cyIpLCAtMSk7CisgIGlmIChwYXJlbnRzX2lkID49IDApIHsKKyAgICBDUERGX09iamVjdCogcFBhcmVudHMgPSBwYXJlbnRfdHJlZS5Mb29rdXBWYWx1ZShwYXJlbnRzX2lkKTsKKyAgICBpZiAocFBhcmVudHMgPT0gTlVMTCB8fCBwUGFyZW50cy0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgeworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwRWxlbWVudCA9IE5VTEw7Ci0gICAgaWYgKG1hcC5Mb29rdXAocERpY3QsICh2b2lkKiYpcEVsZW1lbnQpKSB7Ci0gICAgICAgIHJldHVybiBwRWxlbWVudDsKKyAgICBDUERGX0FycmF5KiBwUGFyZW50QXJyYXkgPSAoQ1BERl9BcnJheSopcFBhcmVudHM7CisgICAgZm9yIChpID0gMDsgaSA8IHBQYXJlbnRBcnJheS0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnQgPSBwUGFyZW50QXJyYXktPkdldERpY3QoaSk7CisgICAgICBpZiAocFBhcmVudCA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgQWRkUGFnZU5vZGUocFBhcmVudCwgZWxlbWVudF9tYXApOwogICAgIH0KLSAgICBwRWxlbWVudCA9IEZYX05FVyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKHRoaXMsIE5VTEwsIHBEaWN0KTsKLSAgICBpZiAocEVsZW1lbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbWFwLlNldEF0KHBEaWN0LCBwRWxlbWVudCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50ID0gcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIlAiKSk7Ci0gICAgaWYgKHBQYXJlbnQgPT0gTlVMTCB8fCBwUGFyZW50LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSkgPT0gRlhfQlNUUkMoIlN0cnVjdFRyZWVSb290IikpIHsKLSAgICAgICAgaWYgKCFBZGRUb3BMZXZlbE5vZGUocERpY3QsIHBFbGVtZW50KSkgewotICAgICAgICAgICAgcEVsZW1lbnQtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1hcC5SZW1vdmVLZXkocERpY3QpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFBhcmVudEVsZW1lbnQgPSBBZGRQYWdlTm9kZShwUGFyZW50LCBtYXAsIG5MZXZlbCArIDEpOwotICAgICAgICBGWF9CT09MIGJTYXZlID0gRkFMU0U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcFBhcmVudEVsZW1lbnQtPm1fS2lkcy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgICAgIGlmIChwUGFyZW50RWxlbWVudC0+bV9LaWRzW2ldLm1fVHlwZSAhPSBDUERGX1N0cnVjdEtpZDo6RWxlbWVudCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBQYXJlbnRFbGVtZW50LT5tX0tpZHNbaV0ubV9FbGVtZW50Lm1fcERpY3QgIT0gcERpY3QpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQYXJlbnRFbGVtZW50LT5tX0tpZHNbaV0ubV9FbGVtZW50Lm1fcEVsZW1lbnQgPSBwRWxlbWVudC0+UmV0YWluKCk7Ci0gICAgICAgICAgICBiU2F2ZSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiU2F2ZSkgewotICAgICAgICAgICAgcEVsZW1lbnQtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1hcC5SZW1vdmVLZXkocERpY3QpOwotICAgICAgICB9Ci0gICAgfQorICB9Cit9CitDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBDUERGX1N0cnVjdFRyZWVJbXBsOjpBZGRQYWdlTm9kZShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hcFB0clRvUHRyJiBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkxldmVsKSB7CisgIGlmIChuTGV2ZWwgPiBuTWF4UmVjdXJzaW9uKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcEVsZW1lbnQgPSBOVUxMOworICBpZiAobWFwLkxvb2t1cChwRGljdCwgKHZvaWQqJilwRWxlbWVudCkpIHsKICAgICByZXR1cm4gcEVsZW1lbnQ7Ci19Ci1GWF9CT09MIENQREZfU3RydWN0VHJlZUltcGw6OkFkZFRvcExldmVsTm9kZShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwRWxlbWVudCkKLXsKLSAgICBDUERGX09iamVjdCAqcE9iaiA9IG1fcFRyZWVSb290LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIksiKSk7Ci0gICAgaWYgKCFwT2JqKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBwRWxlbWVudCA9IEZYX05FVyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKHRoaXMsIE5VTEwsIHBEaWN0KTsKKyAgaWYgKHBFbGVtZW50ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBtYXAuU2V0QXQocERpY3QsIHBFbGVtZW50KTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50ID0gcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIlAiKSk7CisgIGlmIChwUGFyZW50ID09IE5VTEwgfHwKKyAgICAgIHBQYXJlbnQtPkdldFN0cmluZyhGWF9CU1RSQygiVHlwZSIpKSA9PSBGWF9CU1RSQygiU3RydWN0VHJlZVJvb3QiKSkgeworICAgIGlmICghQWRkVG9wTGV2ZWxOb2RlKHBEaWN0LCBwRWxlbWVudCkpIHsKKyAgICAgIHBFbGVtZW50LT5SZWxlYXNlKCk7CisgICAgICBtYXAuUmVtb3ZlS2V5KHBEaWN0KTsKICAgICB9Ci0gICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICBpZiAocE9iai0+R2V0T2JqTnVtKCkgPT0gcERpY3QtPkdldE9iak51bSgpKSB7Ci0gICAgICAgICAgICBpZiAobV9LaWRzWzBdKSB7Ci0gICAgICAgICAgICAgICAgbV9LaWRzWzBdLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX0tpZHNbMF0gPSBwRWxlbWVudC0+UmV0YWluKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwUGFyZW50RWxlbWVudCA9CisgICAgICAgIEFkZFBhZ2VOb2RlKHBQYXJlbnQsIG1hcCwgbkxldmVsICsgMSk7CisgICAgRlhfQk9PTCBiU2F2ZSA9IEZBTFNFOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcFBhcmVudEVsZW1lbnQtPm1fS2lkcy5HZXRTaXplKCk7IGkrKykgeworICAgICAgaWYgKHBQYXJlbnRFbGVtZW50LT5tX0tpZHNbaV0ubV9UeXBlICE9IENQREZfU3RydWN0S2lkOjpFbGVtZW50KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHBQYXJlbnRFbGVtZW50LT5tX0tpZHNbaV0ubV9FbGVtZW50Lm1fcERpY3QgIT0gcERpY3QpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBwUGFyZW50RWxlbWVudC0+bV9LaWRzW2ldLm1fRWxlbWVudC5tX3BFbGVtZW50ID0gcEVsZW1lbnQtPlJldGFpbigpOworICAgICAgYlNhdmUgPSBUUlVFOwogICAgIH0KLSAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICBDUERGX0FycmF5KiBwVG9wS2lkcyA9IChDUERGX0FycmF5KilwT2JqOwotICAgICAgICBGWF9EV09SRCBpOwotICAgICAgICBGWF9CT09MIGJTYXZlID0gRkFMU0U7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwVG9wS2lkcy0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBLaWRSZWYgPSBwVG9wS2lkcy0+R2V0RWxlbWVudChpKTsKLSAgICAgICAgICAgIGlmIChwS2lkUmVmID09IE5VTEwgfHwgcEtpZFJlZi0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoKENQREZfUmVmZXJlbmNlKikgcEtpZFJlZiktPkdldFJlZk9iak51bSgpICE9IHBEaWN0LT5HZXRPYmpOdW0oKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fS2lkc1tpXSkgewotICAgICAgICAgICAgICAgIG1fS2lkc1tpXS0+UmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9LaWRzW2ldID0gcEVsZW1lbnQtPlJldGFpbigpOwotICAgICAgICAgICAgYlNhdmUgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYlNhdmUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQorICAgIGlmICghYlNhdmUpIHsKKyAgICAgIHBFbGVtZW50LT5SZWxlYXNlKCk7CisgICAgICBtYXAuUmVtb3ZlS2V5KHBEaWN0KTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIHBFbGVtZW50OwogfQotQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6Q1BERl9TdHJ1Y3RFbGVtZW50SW1wbChDUERGX1N0cnVjdFRyZWVJbXBsKiBwVHJlZSwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFBhcmVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLSAgICA6IG1fUmVmQ291bnQoMCkKLXsKLSAgICBtX3BUcmVlID0gcFRyZWU7Ci0gICAgbV9wRGljdCA9IHBEaWN0OwotICAgIG1fVHlwZSA9IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlMiKSk7Ci0gICAgaWYgKHBUcmVlLT5tX3BSb2xlTWFwKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIG1hcHBlZCA9IHBUcmVlLT5tX3BSb2xlTWFwLT5HZXRTdHJpbmcobV9UeXBlKTsKLSAgICAgICAgaWYgKCFtYXBwZWQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtX1R5cGUgPSBtYXBwZWQ7Ci0gICAgICAgIH0KK0ZYX0JPT0wgQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6QWRkVG9wTGV2ZWxOb2RlKENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwRWxlbWVudCkgeworICBDUERGX09iamVjdCogcE9iaiA9IG1fcFRyZWVSb290LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIksiKSk7CisgIGlmICghcE9iaikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgaWYgKHBPYmotPkdldE9iak51bSgpID09IHBEaWN0LT5HZXRPYmpOdW0oKSkgeworICAgICAgaWYgKG1fS2lkc1swXSkgeworICAgICAgICBtX0tpZHNbMF0tPlJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICAgIG1fS2lkc1swXSA9IHBFbGVtZW50LT5SZXRhaW4oKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBtX3BQYXJlbnQgPSBwUGFyZW50OwotICAgIExvYWRLaWRzKHBEaWN0KTsKLX0KLUNQREZfU3RydWN0RWxlbWVudEltcGw6On5DUERGX1N0cnVjdEVsZW1lbnRJbXBsKCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fS2lkcy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgaWYgKG1fS2lkc1tpXS5tX1R5cGUgPT0gQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQgJiYgbV9LaWRzW2ldLm1fRWxlbWVudC5tX3BFbGVtZW50KSB7Ci0gICAgICAgICAgICAoKENQREZfU3RydWN0RWxlbWVudEltcGwqKW1fS2lkc1tpXS5tX0VsZW1lbnQubV9wRWxlbWVudCktPlJlbGVhc2UoKTsKLSAgICAgICAgfQorICB9CisgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgQ1BERl9BcnJheSogcFRvcEtpZHMgPSAoQ1BERl9BcnJheSopcE9iajsKKyAgICBGWF9EV09SRCBpOworICAgIEZYX0JPT0wgYlNhdmUgPSBGQUxTRTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFRvcEtpZHMtPkdldENvdW50KCk7IGkrKykgeworICAgICAgQ1BERl9PYmplY3QqIHBLaWRSZWYgPSBwVG9wS2lkcy0+R2V0RWxlbWVudChpKTsKKyAgICAgIGlmIChwS2lkUmVmID09IE5VTEwgfHwgcEtpZFJlZi0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoKChDUERGX1JlZmVyZW5jZSopcEtpZFJlZiktPkdldFJlZk9iak51bSgpICE9IHBEaWN0LT5HZXRPYmpOdW0oKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChtX0tpZHNbaV0pIHsKKyAgICAgICAgbV9LaWRzW2ldLT5SZWxlYXNlKCk7CisgICAgICB9CisgICAgICBtX0tpZHNbaV0gPSBwRWxlbWVudC0+UmV0YWluKCk7CisgICAgICBiU2F2ZSA9IFRSVUU7CiAgICAgfQotfQotQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6UmV0YWluKCkKLXsKLSAgICBtX1JlZkNvdW50Kys7Ci0gICAgcmV0dXJuIHRoaXM7Ci19Ci12b2lkIENQREZfU3RydWN0RWxlbWVudEltcGw6OlJlbGVhc2UoKQotewotICAgIGlmKC0tbV9SZWZDb3VudCA8IDEpIHsKLSAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgaWYgKCFiU2F2ZSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6TG9hZEtpZHMoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLXsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQZyIpKTsKLSAgICBGWF9EV09SRCBQYWdlT2JqTnVtID0gMDsKK0NQREZfU3RydWN0RWxlbWVudEltcGw6OkNQREZfU3RydWN0RWxlbWVudEltcGwoQ1BERl9TdHJ1Y3RUcmVlSW1wbCogcFRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QpCisgICAgOiBtX1JlZkNvdW50KDApIHsKKyAgbV9wVHJlZSA9IHBUcmVlOworICBtX3BEaWN0ID0gcERpY3Q7CisgIG1fVHlwZSA9IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlMiKSk7CisgIGlmIChwVHJlZS0+bV9wUm9sZU1hcCkgeworICAgIENGWF9CeXRlU3RyaW5nIG1hcHBlZCA9IHBUcmVlLT5tX3BSb2xlTWFwLT5HZXRTdHJpbmcobV9UeXBlKTsKKyAgICBpZiAoIW1hcHBlZC5Jc0VtcHR5KCkpIHsKKyAgICAgIG1fVHlwZSA9IG1hcHBlZDsKKyAgICB9CisgIH0KKyAgbV9wUGFyZW50ID0gcFBhcmVudDsKKyAgTG9hZEtpZHMocERpY3QpOworfQorQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6fkNQREZfU3RydWN0RWxlbWVudEltcGwoKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9LaWRzLkdldFNpemUoKTsgaSsrKSB7CisgICAgaWYgKG1fS2lkc1tpXS5tX1R5cGUgPT0gQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQgJiYKKyAgICAgICAgbV9LaWRzW2ldLm1fRWxlbWVudC5tX3BFbGVtZW50KSB7CisgICAgICAoKENQREZfU3RydWN0RWxlbWVudEltcGwqKW1fS2lkc1tpXS5tX0VsZW1lbnQubV9wRWxlbWVudCktPlJlbGVhc2UoKTsKKyAgICB9CisgIH0KK30KK0NQREZfU3RydWN0RWxlbWVudEltcGwqIENQREZfU3RydWN0RWxlbWVudEltcGw6OlJldGFpbigpIHsKKyAgbV9SZWZDb3VudCsrOworICByZXR1cm4gdGhpczsKK30KK3ZvaWQgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6UmVsZWFzZSgpIHsKKyAgaWYgKC0tbV9SZWZDb3VudCA8IDEpIHsKKyAgICBkZWxldGUgdGhpczsKKyAgfQorfQordm9pZCBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpMb2FkS2lkcyhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIlBnIikpOworICBGWF9EV09SRCBQYWdlT2JqTnVtID0gMDsKKyAgaWYgKHBPYmogJiYgcE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICBQYWdlT2JqTnVtID0gKChDUERGX1JlZmVyZW5jZSopcE9iaiktPkdldFJlZk9iak51bSgpOworICB9CisgIENQREZfT2JqZWN0KiBwS2lkcyA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIksiKSk7CisgIGlmIChwS2lkcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChwS2lkcy0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwS2lkczsKKyAgICBtX0tpZHMuU2V0U2l6ZShwQXJyYXktPkdldENvdW50KCkpOworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgICAgQ1BERl9PYmplY3QqIHBLaWQgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKKyAgICAgIExvYWRLaWQoUGFnZU9iak51bSwgcEtpZCwgJm1fS2lkc1tpXSk7CisgICAgfQorICB9IGVsc2UgeworICAgIG1fS2lkcy5TZXRTaXplKDEpOworICAgIExvYWRLaWQoUGFnZU9iak51bSwgcEtpZHMsICZtX0tpZHNbMF0pOworICB9Cit9Cit2b2lkIENQREZfU3RydWN0RWxlbWVudEltcGw6OkxvYWRLaWQoRlhfRFdPUkQgUGFnZU9iak51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcEtpZE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cnVjdEtpZCogcEtpZCkgeworICBwS2lkLT5tX1R5cGUgPSBDUERGX1N0cnVjdEtpZDo6SW52YWxpZDsKKyAgaWYgKHBLaWRPYmogPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAocEtpZE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKKyAgICBpZiAobV9wVHJlZS0+bV9wUGFnZSAmJiBtX3BUcmVlLT5tX3BQYWdlLT5HZXRPYmpOdW0oKSAhPSBQYWdlT2JqTnVtKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHBLaWQtPm1fVHlwZSA9IENQREZfU3RydWN0S2lkOjpQYWdlQ29udGVudDsKKyAgICBwS2lkLT5tX1BhZ2VDb250ZW50Lm1fQ29udGVudElkID0gcEtpZE9iai0+R2V0SW50ZWdlcigpOworICAgIHBLaWQtPm1fUGFnZUNvbnRlbnQubV9QYWdlT2JqTnVtID0gUGFnZU9iak51bTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBLaWRPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBLaWREaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEtpZE9iajsKKyAgQ1BERl9PYmplY3QqIHBQYWdlT2JqID0gcEtpZERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIlBnIikpOworICBpZiAocFBhZ2VPYmogJiYgcFBhZ2VPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgUGFnZU9iak51bSA9ICgoQ1BERl9SZWZlcmVuY2UqKXBQYWdlT2JqKS0+R2V0UmVmT2JqTnVtKCk7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IHBLaWREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSk7CisgIGlmICh0eXBlID09IEZYX0JTVFJDKCJNQ1IiKSkgeworICAgIGlmIChtX3BUcmVlLT5tX3BQYWdlICYmIG1fcFRyZWUtPm1fcFBhZ2UtPkdldE9iak51bSgpICE9IFBhZ2VPYmpOdW0pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcEtpZC0+bV9UeXBlID0gQ1BERl9TdHJ1Y3RLaWQ6OlN0cmVhbUNvbnRlbnQ7CisgICAgQ1BERl9PYmplY3QqIHBTdHJlYW1PYmogPSBwS2lkRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiU3RtIikpOworICAgIGlmIChwU3RyZWFtT2JqICYmIHBTdHJlYW1PYmotPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7CisgICAgICBwS2lkLT5tX1N0cmVhbUNvbnRlbnQubV9SZWZPYmpOdW0gPQorICAgICAgICAgICgoQ1BERl9SZWZlcmVuY2UqKXBTdHJlYW1PYmopLT5HZXRSZWZPYmpOdW0oKTsKKyAgICB9IGVsc2UgeworICAgICAgcEtpZC0+bV9TdHJlYW1Db250ZW50Lm1fUmVmT2JqTnVtID0gMDsKKyAgICB9CisgICAgcEtpZC0+bV9TdHJlYW1Db250ZW50Lm1fUGFnZU9iak51bSA9IFBhZ2VPYmpOdW07CisgICAgcEtpZC0+bV9TdHJlYW1Db250ZW50Lm1fQ29udGVudElkID0gcEtpZERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIk1DSUQiKSk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBGWF9CU1RSQygiT0JKUiIpKSB7CisgICAgaWYgKG1fcFRyZWUtPm1fcFBhZ2UgJiYgbV9wVHJlZS0+bV9wUGFnZS0+R2V0T2JqTnVtKCkgIT0gUGFnZU9iak51bSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwS2lkLT5tX1R5cGUgPSBDUERGX1N0cnVjdEtpZDo6T2JqZWN0OworICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEtpZERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIk9iaiIpKTsKICAgICBpZiAocE9iaiAmJiBwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICBQYWdlT2JqTnVtID0gKChDUERGX1JlZmVyZW5jZSopcE9iaiktPkdldFJlZk9iak51bSgpOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcEtpZHMgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJLIikpOwotICAgIGlmIChwS2lkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBLaWRzLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwS2lkczsKLSAgICAgICAgbV9LaWRzLlNldFNpemUocEFycmF5LT5HZXRDb3VudCgpKTsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBLaWQgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKLSAgICAgICAgICAgIExvYWRLaWQoUGFnZU9iak51bSwgcEtpZCwgJm1fS2lkc1tpXSk7Ci0gICAgICAgIH0KKyAgICAgIHBLaWQtPm1fT2JqZWN0Lm1fUmVmT2JqTnVtID0gKChDUERGX1JlZmVyZW5jZSopcE9iaiktPkdldFJlZk9iak51bSgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fS2lkcy5TZXRTaXplKDEpOwotICAgICAgICBMb2FkS2lkKFBhZ2VPYmpOdW0sIHBLaWRzLCAmbV9LaWRzWzBdKTsKKyAgICAgIHBLaWQtPm1fT2JqZWN0Lm1fUmVmT2JqTnVtID0gMDsKICAgICB9Ci19Ci12b2lkIENQREZfU3RydWN0RWxlbWVudEltcGw6OkxvYWRLaWQoRlhfRFdPUkQgUGFnZU9iak51bSwgQ1BERl9PYmplY3QqIHBLaWRPYmosIENQREZfU3RydWN0S2lkKiBwS2lkKQotewotICAgIHBLaWQtPm1fVHlwZSA9IENQREZfU3RydWN0S2lkOjpJbnZhbGlkOwotICAgIGlmIChwS2lkT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocEtpZE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgaWYgKG1fcFRyZWUtPm1fcFBhZ2UgJiYgbV9wVHJlZS0+bV9wUGFnZS0+R2V0T2JqTnVtKCkgIT0gUGFnZU9iak51bSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBLaWQtPm1fVHlwZSA9IENQREZfU3RydWN0S2lkOjpQYWdlQ29udGVudDsKLSAgICAgICAgcEtpZC0+bV9QYWdlQ29udGVudC5tX0NvbnRlbnRJZCA9IHBLaWRPYmotPkdldEludGVnZXIoKTsKLSAgICAgICAgcEtpZC0+bV9QYWdlQ29udGVudC5tX1BhZ2VPYmpOdW0gPSBQYWdlT2JqTnVtOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwS2lkT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWREaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEtpZE9iajsKLSAgICBDUERGX09iamVjdCogcFBhZ2VPYmogPSBwS2lkRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiUGciKSk7Ci0gICAgaWYgKHBQYWdlT2JqICYmIHBQYWdlT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICBQYWdlT2JqTnVtID0gKChDUERGX1JlZmVyZW5jZSopcFBhZ2VPYmopLT5HZXRSZWZPYmpOdW0oKTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IHBLaWREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSk7Ci0gICAgaWYgKHR5cGUgPT0gRlhfQlNUUkMoIk1DUiIpKSB7Ci0gICAgICAgIGlmIChtX3BUcmVlLT5tX3BQYWdlICYmIG1fcFRyZWUtPm1fcFBhZ2UtPkdldE9iak51bSgpICE9IFBhZ2VPYmpOdW0pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwS2lkLT5tX1R5cGUgPSBDUERGX1N0cnVjdEtpZDo6U3RyZWFtQ29udGVudDsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBTdHJlYW1PYmogPSBwS2lkRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiU3RtIikpOwotICAgICAgICBpZiAocFN0cmVhbU9iaiAmJiBwU3RyZWFtT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgcEtpZC0+bV9TdHJlYW1Db250ZW50Lm1fUmVmT2JqTnVtID0gKChDUERGX1JlZmVyZW5jZSopcFN0cmVhbU9iaiktPkdldFJlZk9iak51bSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEtpZC0+bV9TdHJlYW1Db250ZW50Lm1fUmVmT2JqTnVtID0gMDsKLSAgICAgICAgfQotICAgICAgICBwS2lkLT5tX1N0cmVhbUNvbnRlbnQubV9QYWdlT2JqTnVtID0gUGFnZU9iak51bTsKLSAgICAgICAgcEtpZC0+bV9TdHJlYW1Db250ZW50Lm1fQ29udGVudElkID0gcEtpZERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIk1DSUQiKSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IEZYX0JTVFJDKCJPQkpSIikpIHsKLSAgICAgICAgaWYgKG1fcFRyZWUtPm1fcFBhZ2UgJiYgbV9wVHJlZS0+bV9wUGFnZS0+R2V0T2JqTnVtKCkgIT0gUGFnZU9iak51bSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBLaWQtPm1fVHlwZSA9IENQREZfU3RydWN0S2lkOjpPYmplY3Q7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEtpZERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIk9iaiIpKTsKLSAgICAgICAgaWYgKHBPYmogJiYgcE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIHBLaWQtPm1fT2JqZWN0Lm1fUmVmT2JqTnVtID0gKChDUERGX1JlZmVyZW5jZSopcE9iaiktPkdldFJlZk9iak51bSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEtpZC0+bV9PYmplY3QubV9SZWZPYmpOdW0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIHBLaWQtPm1fT2JqZWN0Lm1fUGFnZU9iak51bSA9IFBhZ2VPYmpOdW07CisgICAgcEtpZC0+bV9PYmplY3QubV9QYWdlT2JqTnVtID0gUGFnZU9iak51bTsKKyAgfSBlbHNlIHsKKyAgICBwS2lkLT5tX1R5cGUgPSBDUERGX1N0cnVjdEtpZDo6RWxlbWVudDsKKyAgICBwS2lkLT5tX0VsZW1lbnQubV9wRGljdCA9IHBLaWREaWN0OworICAgIGlmIChtX3BUcmVlLT5tX3BQYWdlID09IE5VTEwpIHsKKyAgICAgIHBLaWQtPm1fRWxlbWVudC5tX3BFbGVtZW50ID0KKyAgICAgICAgICBGWF9ORVcgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbChtX3BUcmVlLCB0aGlzLCBwS2lkRGljdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcEtpZC0+bV9UeXBlID0gQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQ7Ci0gICAgICAgIHBLaWQtPm1fRWxlbWVudC5tX3BEaWN0ID0gcEtpZERpY3Q7Ci0gICAgICAgIGlmIChtX3BUcmVlLT5tX3BQYWdlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHBLaWQtPm1fRWxlbWVudC5tX3BFbGVtZW50ID0gRlhfTkVXIENQREZfU3RydWN0RWxlbWVudEltcGwobV9wVHJlZSwgdGhpcywgcEtpZERpY3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEtpZC0+bV9FbGVtZW50Lm1fcEVsZW1lbnQgPSBOVUxMOwotICAgICAgICB9CisgICAgICBwS2lkLT5tX0VsZW1lbnQubV9wRWxlbWVudCA9IE5VTEw7CiAgICAgfQorICB9CiB9Ci1zdGF0aWMgQ1BERl9EaWN0aW9uYXJ5KiBGaW5kQXR0ckRpY3QoQ1BERl9PYmplY3QqIHBBdHRycywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgRlhfRkxPQVQgbkxldmVsID0gMC4wRikKLXsKLSAgICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBBdHRycyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gTlVMTDsKLSAgICBpZiAocEF0dHJzLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwQXR0cnM7Ci0gICAgfSBlbHNlIGlmIChwQXR0cnMtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHBEaWN0ID0gKChDUERGX1N0cmVhbSopcEF0dHJzKS0+R2V0RGljdCgpOwotICAgIH0gZWxzZSBpZiAocEF0dHJzLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQXR0cnM7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOwotICAgICAgICAgICAgcERpY3QgPSBGaW5kQXR0ckRpY3QocEVsZW1lbnQsIG93bmVyLCBuTGV2ZWwgKyAxKTsKLSAgICAgICAgICAgIGlmIChwRGljdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBwRGljdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocERpY3QgJiYgcERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiTyIpKSA9PSBvd25lcikgeworc3RhdGljIENQREZfRGljdGlvbmFyeSogRmluZEF0dHJEaWN0KENQREZfT2JqZWN0KiBwQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBuTGV2ZWwgPSAwLjBGKSB7CisgIGlmIChuTGV2ZWwgPiBuTWF4UmVjdXJzaW9uKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHBBdHRycyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IE5VTEw7CisgIGlmIChwQXR0cnMtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEF0dHJzOworICB9IGVsc2UgaWYgKHBBdHRycy0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKKyAgICBwRGljdCA9ICgoQ1BERl9TdHJlYW0qKXBBdHRycyktPkdldERpY3QoKTsKKyAgfSBlbHNlIGlmIChwQXR0cnMtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcEF0dHJzOworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7CisgICAgICBwRGljdCA9IEZpbmRBdHRyRGljdChwRWxlbWVudCwgb3duZXIsIG5MZXZlbCArIDEpOworICAgICAgaWYgKHBEaWN0KSB7CiAgICAgICAgIHJldHVybiBwRGljdDsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHBEaWN0ICYmIHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIk8iKSkgPT0gb3duZXIpIHsKKyAgICByZXR1cm4gcERpY3Q7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci1DUERGX09iamVjdCogQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBGWF9GTE9BVCBmTGV2ZWwpCi17Ci0gICAgaWYgKGZMZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitDUERGX09iamVjdCogQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5oZXJpdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGV2ZWwpIHsKKyAgaWYgKGZMZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoYkluaGVyaXRhYmxlKSB7CisgICAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgRkFMU0UpOworICAgIGlmIChwQXR0cikgeworICAgICAgcmV0dXJuIHBBdHRyOwogICAgIH0KLSAgICBpZiAoYkluaGVyaXRhYmxlKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIEZBTFNFKTsKLSAgICAgICAgaWYgKHBBdHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gcEF0dHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFBhcmVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wUGFyZW50LT5HZXRBdHRyKG93bmVyLCBuYW1lLCBUUlVFLCBmTGV2ZWwgKyAxKTsKKyAgICBpZiAobV9wUGFyZW50ID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBDUERGX09iamVjdCogcEEgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkEiKSk7Ci0gICAgaWYgKHBBKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEF0dHJEaWN0ID0gRmluZEF0dHJEaWN0KHBBLCBvd25lcik7Ci0gICAgICAgIGlmIChwQXR0ckRpY3QpIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IHBBdHRyRGljdC0+R2V0RWxlbWVudFZhbHVlKG5hbWUpOwotICAgICAgICAgICAgaWYgKHBBdHRyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBBdHRyOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgcmV0dXJuIG1fcFBhcmVudC0+R2V0QXR0cihvd25lciwgbmFtZSwgVFJVRSwgZkxldmVsICsgMSk7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBBID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJBIikpOworICBpZiAocEEpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBBdHRyRGljdCA9IEZpbmRBdHRyRGljdChwQSwgb3duZXIpOworICAgIGlmIChwQXR0ckRpY3QpIHsKKyAgICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IHBBdHRyRGljdC0+R2V0RWxlbWVudFZhbHVlKG5hbWUpOworICAgICAgaWYgKHBBdHRyKSB7CisgICAgICAgIHJldHVybiBwQXR0cjsKKyAgICAgIH0KICAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBDID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJDIikpOwotICAgIGlmIChwQyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBDbGFzc01hcCA9IG1fcFRyZWUtPm1fcFRyZWVSb290LT5HZXREaWN0KEZYX0JTVFJDKCJDbGFzc01hcCIpKTsKLSAgICBpZiAocENsYXNzTWFwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwQy0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcEM7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNsYXNzX25hbWUgPSBwQXJyYXktPkdldFN0cmluZyhpKTsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcENsYXNzRGljdCA9IHBDbGFzc01hcC0+R2V0RGljdChjbGFzc19uYW1lKTsKLSAgICAgICAgICAgIGlmIChwQ2xhc3NEaWN0ICYmIHBDbGFzc0RpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiTyIpKSA9PSBvd25lcikgewotICAgICAgICAgICAgICAgIHJldHVybiBwQ2xhc3NEaWN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNsYXNzX25hbWUgPSBwQy0+R2V0U3RyaW5nKCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ2xhc3NEaWN0ID0gcENsYXNzTWFwLT5HZXREaWN0KGNsYXNzX25hbWUpOwotICAgIGlmIChwQ2xhc3NEaWN0ICYmIHBDbGFzc0RpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiTyIpKSA9PSBvd25lcikgeworICB9CisgIENQREZfT2JqZWN0KiBwQyA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQyIpKTsKKyAgaWYgKHBDID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBDbGFzc01hcCA9CisgICAgICBtX3BUcmVlLT5tX3BUcmVlUm9vdC0+R2V0RGljdChGWF9CU1RSQygiQ2xhc3NNYXAiKSk7CisgIGlmIChwQ2xhc3NNYXAgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChwQy0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQzsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGNsYXNzX25hbWUgPSBwQXJyYXktPkdldFN0cmluZyhpKTsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcENsYXNzRGljdCA9IHBDbGFzc01hcC0+R2V0RGljdChjbGFzc19uYW1lKTsKKyAgICAgIGlmIChwQ2xhc3NEaWN0ICYmIHBDbGFzc0RpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiTyIpKSA9PSBvd25lcikgewogICAgICAgICByZXR1cm4gcENsYXNzRGljdC0+R2V0RWxlbWVudFZhbHVlKG5hbWUpOworICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjbGFzc19uYW1lID0gcEMtPkdldFN0cmluZygpOworICBDUERGX0RpY3Rpb25hcnkqIHBDbGFzc0RpY3QgPSBwQ2xhc3NNYXAtPkdldERpY3QoY2xhc3NfbmFtZSk7CisgIGlmIChwQ2xhc3NEaWN0ICYmIHBDbGFzc0RpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiTyIpKSA9PSBvd25lcikgeworICAgIHJldHVybiBwQ2xhc3NEaWN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci1DUERGX09iamVjdCogQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlKTsKLSAgICBpZiAocEF0dHIgPT0gTlVMTCB8fCBzdWJpbmRleCA9PSAtMSB8fCBwQXR0ci0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gcEF0dHI7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQXR0cjsKLSAgICBpZiAoc3ViaW5kZXggPj0gKGludClwQXJyYXktPkdldENvdW50KCkpIHsKLSAgICAgICAgcmV0dXJuIHBBdHRyOwotICAgIH0KLSAgICByZXR1cm4gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoc3ViaW5kZXgpOworQ1BERl9PYmplY3QqIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmluZGV4KSB7CisgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSk7CisgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHN1YmluZGV4ID09IC0xIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7CisgICAgcmV0dXJuIHBBdHRyOworICB9CisgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQXR0cjsKKyAgaWYgKHN1YmluZGV4ID49IChpbnQpcEFycmF5LT5HZXRDb3VudCgpKSB7CisgICAgcmV0dXJuIHBBdHRyOworICB9CisgIHJldHVybiBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShzdWJpbmRleCk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQotewotICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOwotICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7Ci0gICAgfQotICAgIHJldHVybiBwQXR0ci0+R2V0U3RyaW5nKCk7CitDRlhfQnl0ZVN0cmluZyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXROYW1lKAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF92YWx1ZSwKKyAgICBGWF9CT09MIGJJbmhlcml0YWJsZSwKKyAgICBpbnQgc3ViaW5kZXgpIHsKKyAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlLCBzdWJpbmRleCk7CisgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05BTUUpIHsKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorICByZXR1cm4gcEF0dHItPkdldFN0cmluZygpOwogfQotRlhfQVJHQglDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUsIGludCBzdWJpbmRleCkKLXsKLSAgICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUsIHN1YmluZGV4KTsKLSAgICBpZiAocEF0dHIgPT0gTlVMTCB8fCBwQXR0ci0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBBdHRyOwotICAgIHJldHVybiAweGZmMDAwMDAwIHwgKChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDApICogMjU1KSA8PCAxNikgfCAoKGludCkocEFycmF5LT5HZXROdW1iZXIoMSkgKiAyNTUpIDw8IDgpIHwgKGludCkocEFycmF5LT5HZXROdW1iZXIoMikgKiAyNTUpOworRlhfQVJHQiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5oZXJpdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCkgeworICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUsIHN1YmluZGV4KTsKKyAgaWYgKHBBdHRyID09IE5VTEwgfHwgcEF0dHItPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcEF0dHI7CisgIHJldHVybiAweGZmMDAwMDAwIHwgKChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDApICogMjU1KSA8PCAxNikgfAorICAgICAgICAgKChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDEpICogMjU1KSA8PCA4KSB8CisgICAgICAgICAoaW50KShwQXJyYXktPkdldE51bWJlcigyKSAqIDI1NSk7CiB9Ci1GWF9GTE9BVCBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQotewotICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOwotICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05VTUJFUikgewotICAgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHBBdHRyLT5HZXROdW1iZXIoKTsKK0ZYX0ZMT0FUIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCkgeworICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUsIHN1YmluZGV4KTsKKyAgaWYgKHBBdHRyID09IE5VTEwgfHwgcEF0dHItPkdldFR5cGUoKSAhPSBQREZPQkpfTlVNQkVSKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0KKyAgcmV0dXJuIHBBdHRyLT5HZXROdW1iZXIoKTsKIH0KLWludAlDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50IGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlLCBzdWJpbmRleCk7Ci0gICAgaWYgKHBBdHRyID09IE5VTEwgfHwgcEF0dHItPkdldFR5cGUoKSAhPSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICAgIH0KLSAgICByZXR1cm4gcEF0dHItPkdldEludGVnZXIoKTsKK2ludCBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmluZGV4KSB7CisgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOworICBpZiAocEF0dHIgPT0gTlVMTCB8fCBwQXR0ci0+R2V0VHlwZSgpICE9IFBERk9CSl9OVU1CRVIpIHsKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorICByZXR1cm4gcEF0dHItPkdldEludGVnZXIoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmNwcAppbmRleCA5NmQyY2NmLi4xZWQwMDE3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY191dGlscy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuY3BwCkBAIC05LDcyNCArOSw3MzIgQEAKIAogc3RhdGljIGNvbnN0IGludCBGUERGRE9DX1VUSUxTX01BWFJFQ1VSU0lPTiA9IDMyOwogCi1DRlhfV2lkZVN0cmluZyBHZXRGdWxsTmFtZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpCi17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgZnVsbF9uYW1lOwotICAgIENQREZfRGljdGlvbmFyeSogcExldmVsID0gcEZpZWxkRGljdDsKLSAgICB3aGlsZSAocExldmVsKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHNob3J0X25hbWUgPSBwTGV2ZWwtPkdldFVuaWNvZGVUZXh0KCJUIik7Ci0gICAgICAgIGlmIChzaG9ydF9uYW1lICE9IEwiIikgewotICAgICAgICAgICAgaWYgKGZ1bGxfbmFtZSA9PSBMIiIpIHsKLSAgICAgICAgICAgICAgICBmdWxsX25hbWUgPSBzaG9ydF9uYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmdWxsX25hbWUgPSBzaG9ydF9uYW1lICsgTCIuIiArIGZ1bGxfbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwTGV2ZWwgPSBwTGV2ZWwtPkdldERpY3QoIlBhcmVudCIpOworQ0ZYX1dpZGVTdHJpbmcgR2V0RnVsbE5hbWUoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KSB7CisgIENGWF9XaWRlU3RyaW5nIGZ1bGxfbmFtZTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwTGV2ZWwgPSBwRmllbGREaWN0OworICB3aGlsZSAocExldmVsKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc2hvcnRfbmFtZSA9IHBMZXZlbC0+R2V0VW5pY29kZVRleHQoIlQiKTsKKyAgICBpZiAoc2hvcnRfbmFtZSAhPSBMIiIpIHsKKyAgICAgIGlmIChmdWxsX25hbWUgPT0gTCIiKSB7CisgICAgICAgIGZ1bGxfbmFtZSA9IHNob3J0X25hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBmdWxsX25hbWUgPSBzaG9ydF9uYW1lICsgTCIuIiArIGZ1bGxfbmFtZTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZ1bGxfbmFtZTsKKyAgICBwTGV2ZWwgPSBwTGV2ZWwtPkdldERpY3QoIlBhcmVudCIpOworICB9CisgIHJldHVybiBmdWxsX25hbWU7CiB9Ci1GWF9CT09MIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc0ZvbnQoKQotewotICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7Ci0gICAgcmV0dXJuIHN5bnRheC5GaW5kVGFnUGFyYW0oIlRmIiwgMik7CitGWF9CT09MIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc0ZvbnQoKSB7CisgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEpOworICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldEZvbnRTdHJpbmcoKQotewotICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udDsKLSAgICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gY3NGb250OwotICAgIH0KLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKSkgewotICAgICAgICBjc0ZvbnQgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7Ci0gICAgICAgIGNzRm9udCArPSAiICI7Ci0gICAgICAgIGNzRm9udCArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICAgICAgY3NGb250ICs9ICIgIjsKLSAgICAgICAgY3NGb250ICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgIH0KK0NGWF9CeXRlU3RyaW5nIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldEZvbnRTdHJpbmcoKSB7CisgIENGWF9CeXRlU3RyaW5nIGNzRm9udDsKKyAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKICAgICByZXR1cm4gY3NGb250OworICB9CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEpOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKSkgeworICAgIGNzRm9udCArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgICBjc0ZvbnQgKz0gIiAiOworICAgIGNzRm9udCArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgICBjc0ZvbnQgKz0gIiAiOworICAgIGNzRm9udCArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgfQorICByZXR1cm4gY3NGb250OwogfQotdm9pZCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRGb250KENGWF9CeXRlU3RyaW5nJiBjc0ZvbnROYW1lVGFnLCBGWF9GTE9BVCYgZkZvbnRTaXplKQotewotICAgIGNzRm9udE5hbWVUYWcgPSAiIjsKLSAgICBmRm9udFNpemUgPSAwOwotICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oIlRmIiwgMikpIHsKLSAgICAgICAgY3NGb250TmFtZVRhZyA9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICBjc0ZvbnROYW1lVGFnLkRlbGV0ZSgwLCAxKTsKLSAgICAgICAgZkZvbnRTaXplID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgfQotICAgIGNzRm9udE5hbWVUYWcgPSBQREZfTmFtZURlY29kZShjc0ZvbnROYW1lVGFnKTsKK3ZvaWQgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Rm9udChDRlhfQnl0ZVN0cmluZyYgY3NGb250TmFtZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkZvbnRTaXplKSB7CisgIGNzRm9udE5hbWVUYWcgPSAiIjsKKyAgZkZvbnRTaXplID0gMDsKKyAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7CisgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKCJUZiIsIDIpKSB7CisgICAgY3NGb250TmFtZVRhZyA9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOworICAgIGNzRm9udE5hbWVUYWcuRGVsZXRlKDAsIDEpOworICAgIGZGb250U2l6ZSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICB9CisgIGNzRm9udE5hbWVUYWcgPSBQREZfTmFtZURlY29kZShjc0ZvbnROYW1lVGFnKTsKIH0KLUZYX0JPT0wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzQ29sb3IoRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24pCi17Ci0gICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiRyIgOiAiZyIsIDEpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBzeW50YXguU2V0UG9zKDApOwotICAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJSRyIgOiAicmciLCAzKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgc3ludGF4LlNldFBvcygwKTsKLSAgICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiSyIgOiAiayIsIDQpOworRlhfQk9PTCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpIYXNDb2xvcihGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikgeworICBpZiAobV9jc0RBLklzRW1wdHkoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIkciIDogImciLCAxKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHN5bnRheC5TZXRQb3MoMCk7CisgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJSRyIgOiAicmciLCAzKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHN5bnRheC5TZXRQb3MoMCk7CisgIHJldHVybiBzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJLIiA6ICJrIiwgNCk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvclN0cmluZyhGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0NvbG9yOwotICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBjc0NvbG9yOwotICAgIH0KLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiRyIgOiAiZyIsIDEpKSB7Ci0gICAgICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7Ci0gICAgICAgIGNzQ29sb3IgKz0gIiAiOwotICAgICAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICByZXR1cm4gY3NDb2xvcjsKLSAgICB9Ci0gICAgc3ludGF4LlNldFBvcygwKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiUkciIDogInJnIiwgMykpIHsKLSAgICAgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICAgICAgY3NDb2xvciArPSAiICI7Ci0gICAgICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7Ci0gICAgICAgIGNzQ29sb3IgKz0gIiAiOwotICAgICAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICBjc0NvbG9yICs9ICIgIjsKLSAgICAgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICAgICAgcmV0dXJuIGNzQ29sb3I7Ci0gICAgfQotICAgIHN5bnRheC5TZXRQb3MoMCk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIksiIDogImsiLCA0KSkgewotICAgICAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICBjc0NvbG9yICs9ICIgIjsKLSAgICAgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICAgICAgY3NDb2xvciArPSAiICI7Ci0gICAgICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7Ci0gICAgICAgIGNzQ29sb3IgKz0gIiAiOwotICAgICAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICBjc0NvbG9yICs9ICIgIjsKLSAgICAgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICB9CitDRlhfQnl0ZVN0cmluZyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvclN0cmluZygKKyAgICBGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikgeworICBDRlhfQnl0ZVN0cmluZyBjc0NvbG9yOworICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewogICAgIHJldHVybiBjc0NvbG9yOworICB9CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEpOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiRyIgOiAiZyIsIDEpKSB7CisgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgICBjc0NvbG9yICs9ICIgIjsKKyAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOworICAgIHJldHVybiBjc0NvbG9yOworICB9CisgIHN5bnRheC5TZXRQb3MoMCk7CisgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJSRyIgOiAicmciLCAzKSkgeworICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7CisgICAgY3NDb2xvciArPSAiICI7CisgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgICBjc0NvbG9yICs9ICIgIjsKKyAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOworICAgIGNzQ29sb3IgKz0gIiAiOworICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7CisgICAgcmV0dXJuIGNzQ29sb3I7CisgIH0KKyAgc3ludGF4LlNldFBvcygwKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIksiIDogImsiLCA0KSkgeworICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7CisgICAgY3NDb2xvciArPSAiICI7CisgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgICBjc0NvbG9yICs9ICIgIjsKKyAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOworICAgIGNzQ29sb3IgKz0gIiAiOworICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7CisgICAgY3NDb2xvciArPSAiICI7CisgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgfQorICByZXR1cm4gY3NDb2xvcjsKIH0KLXZvaWQgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSwgRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24pCi17Ci0gICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKLSAgICBmb3IgKGludCBjID0gMDsgYyA8IDQ7IGMgKyspIHsKLSAgICAgICAgZmNbY10gPSAwOwotICAgIH0KLSAgICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEpOwotICAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJHIiA6ICJnIiwgMSkpIHsKLSAgICAgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9HUkFZOwotICAgICAgICBmY1swXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN5bnRheC5TZXRQb3MoMCk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIlJHIiA6ICJyZyIsIDMpKSB7Ci0gICAgICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfUkdCOwotICAgICAgICBmY1swXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICBmY1sxXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICBmY1syXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN5bnRheC5TZXRQb3MoMCk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIksiIDogImsiLCA0KSkgewotICAgICAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0NNWUs7Ci0gICAgICAgIGZjWzBdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIGZjWzFdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIGZjWzJdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIGZjWzNdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgfQordm9pZCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikgeworICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworICBmb3IgKGludCBjID0gMDsgYyA8IDQ7IGMrKykgeworICAgIGZjW2NdID0gMDsKKyAgfQorICBpZiAobV9jc0RBLklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIkciIDogImciLCAxKSkgeworICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfR1JBWTsKKyAgICBmY1swXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICAgIHJldHVybjsKKyAgfQorICBzeW50YXguU2V0UG9zKDApOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiUkciIDogInJnIiwgMykpIHsKKyAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1JHQjsKKyAgICBmY1swXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICAgIGZjWzFdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CisgICAgZmNbMl0gPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3ludGF4LlNldFBvcygwKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIksiIDogImsiLCA0KSkgeworICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfQ01ZSzsKKyAgICBmY1swXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICAgIGZjWzFdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CisgICAgZmNbMl0gPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKTsKKyAgICBmY1szXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICB9CiB9Ci12b2lkIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldENvbG9yKEZYX0FSR0ImIGNvbG9yLCBpbnQmIGlDb2xvclR5cGUsIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uKQotewotICAgIGNvbG9yID0gMDsKLSAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIkciIDogImciLCAxKSkgewotICAgICAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0dSQVk7Ci0gICAgICAgIEZYX0ZMT0FUIGcgPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKSAqIDI1NSArIDAuNWY7Ci0gICAgICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpZywgKGludClnLCAoaW50KWcpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN5bnRheC5TZXRQb3MoMCk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIlJHIiA6ICJyZyIsIDMpKSB7Ci0gICAgICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfUkdCOwotICAgICAgICBGWF9GTE9BVCByID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOwotICAgICAgICBGWF9GTE9BVCBnID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOwotICAgICAgICBGWF9GTE9BVCBiID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOwotICAgICAgICBjb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50KXIsIChpbnQpZywgKGludCliKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzeW50YXguU2V0UG9zKDApOwotICAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJLIiA6ICJrIiwgNCkpIHsKLSAgICAgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9DTVlLOwotICAgICAgICBGWF9GTE9BVCBjID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIEZYX0ZMT0FUIG0gPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKTsKLSAgICAgICAgRlhfRkxPQVQgeSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICBGWF9GTE9BVCBrID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIEZYX0ZMT0FUIHIgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIGMgKyBrKTsKLSAgICAgICAgRlhfRkxPQVQgZyA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgbSArIGspOwotICAgICAgICBGWF9GTE9BVCBiID0gMS4wZiAtIEZYX01JTigxLjBmLCB5ICsgayk7Ci0gICAgICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpKHIgKiAyNTUgKyAwLjVmKSwgKGludCkoZyAqIDI1NSArIDAuNWYpLCAoaW50KShiICogMjU1ICsgMC41ZikpOwotICAgIH0KK3ZvaWQgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Q29sb3IoRlhfQVJHQiYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUNvbG9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24pIHsKKyAgY29sb3IgPSAwOworICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworICBpZiAobV9jc0RBLklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIkciIDogImciLCAxKSkgeworICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfR1JBWTsKKyAgICBGWF9GTE9BVCBnID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOworICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpZywgKGludClnLCAoaW50KWcpOworICAgIHJldHVybjsKKyAgfQorICBzeW50YXguU2V0UG9zKDApOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiUkciIDogInJnIiwgMykpIHsKKyAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1JHQjsKKyAgICBGWF9GTE9BVCByID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOworICAgIEZYX0ZMT0FUIGcgPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKSAqIDI1NSArIDAuNWY7CisgICAgRlhfRkxPQVQgYiA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpICogMjU1ICsgMC41ZjsKKyAgICBjb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50KXIsIChpbnQpZywgKGludCliKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3ludGF4LlNldFBvcygwKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIksiIDogImsiLCA0KSkgeworICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfQ01ZSzsKKyAgICBGWF9GTE9BVCBjID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CisgICAgRlhfRkxPQVQgbSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICAgIEZYX0ZMT0FUIHkgPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKTsKKyAgICBGWF9GTE9BVCBrID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CisgICAgRlhfRkxPQVQgciA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgYyArIGspOworICAgIEZYX0ZMT0FUIGcgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIG0gKyBrKTsKKyAgICBGWF9GTE9BVCBiID0gMS4wZiAtIEZYX01JTigxLjBmLCB5ICsgayk7CisgICAgY29sb3IgPSBBcmdiRW5jb2RlKDI1NSwgKGludCkociAqIDI1NSArIDAuNWYpLCAoaW50KShnICogMjU1ICsgMC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGIgKiAyNTUgKyAwLjVmKSk7CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzVGV4dE1hdHJpeCgpCi17Ci0gICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKLSAgICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbSgiVG0iLCA2KTsKK0ZYX0JPT0wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzVGV4dE1hdHJpeCgpIHsKKyAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7CisgIHJldHVybiBzeW50YXguRmluZFRhZ1BhcmFtKCJUbSIsIDYpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0VGV4dE1hdHJpeFN0cmluZygpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NUTTsKLSAgICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gY3NUTTsKLSAgICB9Ci0gICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oIlRtIiwgNikpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpICsrKSB7Ci0gICAgICAgICAgICBjc1RNICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICAgICAgY3NUTSArPSAiICI7Ci0gICAgICAgIH0KLSAgICAgICAgY3NUTSArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICB9CitDRlhfQnl0ZVN0cmluZyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRUZXh0TWF0cml4U3RyaW5nKCkgeworICBDRlhfQnl0ZVN0cmluZyBjc1RNOworICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewogICAgIHJldHVybiBjc1RNOworICB9CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEpOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgiVG0iLCA2KSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBjc1RNICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOworICAgICAgY3NUTSArPSAiICI7CisgICAgfQorICAgIGNzVE0gKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7CisgIH0KKyAgcmV0dXJuIGNzVE07CiB9Ci1DRlhfQWZmaW5lTWF0cml4IENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldFRleHRNYXRyaXgoKQotewotICAgIENGWF9BZmZpbmVNYXRyaXggdG07Ci0gICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIHRtOwotICAgIH0KLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgiVG0iLCA2KSkgewotICAgICAgICBGWF9GTE9BVCBmWzZdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkgKyspIHsKLSAgICAgICAgICAgIGZbaV0gPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKTsKLSAgICAgICAgfQotICAgICAgICB0bS5TZXQoZlswXSwgZlsxXSwgZlsyXSwgZlszXSwgZls0XSwgZls1XSk7Ci0gICAgfQorQ0ZYX0FmZmluZU1hdHJpeCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRUZXh0TWF0cml4KCkgeworICBDRlhfQWZmaW5lTWF0cml4IHRtOworICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewogICAgIHJldHVybiB0bTsKLX0KLXZvaWQgSW5pdEludGVyRm9ybURpY3QoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0gICAgaWYgKHBEb2N1bWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKKyAgfQorICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oIlRtIiwgNikpIHsKKyAgICBGWF9GTE9BVCBmWzZdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBmW2ldID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CiAgICAgfQorICAgIHRtLlNldChmWzBdLCBmWzFdLCBmWzJdLCBmWzNdLCBmWzRdLCBmWzVdKTsKKyAgfQorICByZXR1cm4gdG07Cit9Cit2b2lkIEluaXRJbnRlckZvcm1EaWN0KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKKyAgICBwRm9ybURpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwogICAgIGlmIChwRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICBwRm9ybURpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgICAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocEZvcm1EaWN0KTsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBEb2N1bWVudC0+R2V0Um9vdCgpOwotICAgICAgICBwUm9vdC0+U2V0QXRSZWZlcmVuY2UoIkFjcm9Gb3JtIiwgcERvY3VtZW50LCBkd09iak51bSk7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzREE7Ci0gICAgaWYgKCFwRm9ybURpY3QtPktleUV4aXN0KCJEUiIpKSB7Ci0gICAgICAgIENQREZfRm9udCogcEZvbnQgPSBOVUxMOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc0Jhc2VOYW1lLCBjc0RlZmF1bHQ7Ci0gICAgICAgIHVpbnQ4X3QgY2hhclNldCA9IENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVDaGFyU2V0KCk7Ci0gICAgICAgIHBGb250ID0gQ1BERl9JbnRlckZvcm06OkFkZFN0YW5kYXJkRm9udChwRG9jdW1lbnQsICJIZWx2ZXRpY2EiKTsKLSAgICAgICAgaWYgKHBGb250ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEFkZEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIHBGb250LCBjc0Jhc2VOYW1lKTsKLSAgICAgICAgICAgIGNzRGVmYXVsdCA9IGNzQmFzZU5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYXJTZXQgIT0gMCkgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSA9IENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVGb250KGNoYXJTZXQsIE5VTEwpOwotICAgICAgICAgICAgaWYgKHBGb250ID09IE5VTEwgfHwgY3NGb250TmFtZSAhPSAiSGVsdmV0aWNhIikgewotICAgICAgICAgICAgICAgIHBGb250ID0gQ1BERl9JbnRlckZvcm06OkFkZE5hdGl2ZUZvbnQocERvY3VtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBjc0Jhc2VOYW1lID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIEFkZEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIHBGb250LCBjc0Jhc2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgY3NEZWZhdWx0ID0gY3NCYXNlTmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBGb250ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNzREEgPSAiLyIgKyBQREZfTmFtZUVuY29kZShjc0RlZmF1bHQpICsgIiAwIFRmIjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWNzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIGNzREEgKz0gIiAiOwotICAgIH0KLSAgICBjc0RBICs9ICIwIGciOwotICAgIGlmICghcEZvcm1EaWN0LT5LZXlFeGlzdCgiREEiKSkgewotICAgICAgICBwRm9ybURpY3QtPlNldEF0U3RyaW5nKCJEQSIsIGNzREEpOwotICAgIH0KLX0KLUZYX0RXT1JEIENvdW50SW50ZXJGb3JtRm9udHMoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QpCi17Ci0gICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKLSAgICBpZiAocERSID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7Ci0gICAgaWYgKHBGb250cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9EV09SRCBkd0NvdW50ID0gMDsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwRm9udHMtPkdldFN0YXJ0UG9zKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IE5VTEw7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNzS2V5OwotICAgICAgICBwT2JqID0gcEZvbnRzLT5HZXROZXh0RWxlbWVudChwb3MsIGNzS2V5KTsKLSAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsKLSAgICAgICAgaWYgKHBEaXJlY3QgIT0gTlVMTCAmJiBwRGlyZWN0LT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgICAgIGlmICgoKENQREZfRGljdGlvbmFyeSopcERpcmVjdCktPkdldFN0cmluZygiVHlwZSIpID09ICJGb250IikgewotICAgICAgICAgICAgICAgIGR3Q291bnQgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGR3Q291bnQ7Ci19Ci1DUERGX0ZvbnQqIEdldEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgRlhfRFdPUkQgaW5kZXgsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17Ci0gICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKLSAgICBpZiAocERSID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7Ci0gICAgaWYgKHBGb250cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9EV09SRCBkd0NvdW50ID0gMDsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwRm9udHMtPkdldFN0YXJ0UG9zKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IE5VTEw7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNzS2V5OwotICAgICAgICBwT2JqID0gcEZvbnRzLT5HZXROZXh0RWxlbWVudChwb3MsIGNzS2V5KTsKLSAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsKLSAgICAgICAgaWYgKHBEaXJlY3QgPT0gTlVMTCB8fCBwRGlyZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRGlyZWN0OwotICAgICAgICBpZiAocEVsZW1lbnQtPkdldFN0cmluZygiVHlwZSIpICE9ICJGb250IikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGR3Q291bnQgPT0gaW5kZXgpIHsKLSAgICAgICAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OwotICAgICAgICAgICAgcmV0dXJuIHBEb2N1bWVudC0+TG9hZEZvbnQocEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGR3Q291bnQgKys7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotQ1BERl9Gb250KiBHZXRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZykKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0FsaWFzID0gUERGX05hbWVEZWNvZGUoY3NOYW1lVGFnKTsKLSAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwgfHwgY3NBbGlhcy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOwotICAgIGlmIChwRFIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSBwRm9udHMtPkdldERpY3QoY3NBbGlhcyk7Ci0gICAgaWYgKHBFbGVtZW50ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgPT0gIkZvbnQiKSB7Ci0gICAgICAgIHJldHVybiBwRG9jdW1lbnQtPkxvYWRGb250KHBFbGVtZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DUERGX0ZvbnQqIEdldEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwgfHwgY3NGb250TmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOwotICAgIGlmIChwRFIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBGb250cy0+R2V0U3RhcnRQb3MoKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gTlVMTDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NLZXk7Ci0gICAgICAgIHBPYmogPSBwRm9udHMtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOwotICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOwotICAgICAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IChDUERGX0RpY3Rpb25hcnkqKXBEaXJlY3Q7Ci0gICAgICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0ZvbnQqIHBGaW5kID0gcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7Ci0gICAgICAgIGlmIChwRmluZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc0Jhc2VGb250OwotICAgICAgICBjc0Jhc2VGb250ID0gcEZpbmQtPkdldEJhc2VGb250KCk7Ci0gICAgICAgIGNzQmFzZUZvbnQuUmVtb3ZlKCcgJyk7Ci0gICAgICAgIGlmIChjc0Jhc2VGb250ID09IGNzRm9udE5hbWUpIHsKLSAgICAgICAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OwotICAgICAgICAgICAgcmV0dXJuIHBGaW5kOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotQ1BERl9Gb250KiBHZXROYXRpdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIHVpbnQ4X3QgY2hhclNldCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOwotICAgIGlmIChwRFIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBGb250cy0+R2V0U3RhcnRQb3MoKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gTlVMTDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NLZXk7Ci0gICAgICAgIHBPYmogPSBwRm9udHMtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOwotICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOwotICAgICAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IChDUERGX0RpY3Rpb25hcnkqKXBEaXJlY3Q7Ci0gICAgICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0ZvbnQqIHBGaW5kID0gcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7Ci0gICAgICAgIGlmIChwRmluZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDRlhfU3Vic3RGb250KiBwU3Vic3QgPSAoQ0ZYX1N1YnN0Rm9udCopcEZpbmQtPkdldFN1YnN0Rm9udCgpOwotICAgICAgICBpZiAocFN1YnN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwU3Vic3QtPm1fQ2hhcnNldCA9PSAoaW50KWNoYXJTZXQpIHsKLSAgICAgICAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OwotICAgICAgICAgICAgcmV0dXJuIHBGaW5kOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotQ1BERl9Gb250KiBHZXROYXRpdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17Ci0gICAgY3NOYW1lVGFnID0gIiI7CisgICAgRlhfRFdPUkQgZHdPYmpOdW0gPSBwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBGb3JtRGljdCk7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBEb2N1bWVudC0+R2V0Um9vdCgpOworICAgIHBSb290LT5TZXRBdFJlZmVyZW5jZSgiQWNyb0Zvcm0iLCBwRG9jdW1lbnQsIGR3T2JqTnVtKTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc0RBOworICBpZiAoIXBGb3JtRGljdC0+S2V5RXhpc3QoIkRSIikpIHsKKyAgICBDUERGX0ZvbnQqIHBGb250ID0gTlVMTDsKKyAgICBDRlhfQnl0ZVN0cmluZyBjc0Jhc2VOYW1lLCBjc0RlZmF1bHQ7CiAgICAgdWludDhfdCBjaGFyU2V0ID0gQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUNoYXJTZXQoKTsKLSAgICBDRlhfU3Vic3RGb250KiBwU3Vic3Q7Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IEdldERlZmF1bHRJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvY3VtZW50KTsKKyAgICBwRm9udCA9IENQREZfSW50ZXJGb3JtOjpBZGRTdGFuZGFyZEZvbnQocERvY3VtZW50LCAiSGVsdmV0aWNhIik7CiAgICAgaWYgKHBGb250ICE9IE5VTEwpIHsKLSAgICAgICAgcFN1YnN0ID0gKENGWF9TdWJzdEZvbnQqKXBGb250LT5HZXRTdWJzdEZvbnQoKTsKLSAgICAgICAgaWYgKHBTdWJzdCAhPSBOVUxMICYmIHBTdWJzdC0+bV9DaGFyc2V0ID09IChpbnQpY2hhclNldCkgewotICAgICAgICAgICAgRmluZEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRm9udCwgY3NOYW1lVGFnKTsKLSAgICAgICAgICAgIHJldHVybiBwRm9udDsKLSAgICAgICAgfQorICAgICAgQWRkSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgcEZvbnQsIGNzQmFzZU5hbWUpOworICAgICAgY3NEZWZhdWx0ID0gY3NCYXNlTmFtZTsKICAgICB9Ci0gICAgcmV0dXJuIEdldE5hdGl2ZUludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNoYXJTZXQsIGNzTmFtZVRhZyk7CisgICAgaWYgKGNoYXJTZXQgIT0gMCkgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSA9IENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVGb250KGNoYXJTZXQsIE5VTEwpOworICAgICAgaWYgKHBGb250ID09IE5VTEwgfHwgY3NGb250TmFtZSAhPSAiSGVsdmV0aWNhIikgeworICAgICAgICBwRm9udCA9IENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb250KHBEb2N1bWVudCk7CisgICAgICAgIGlmIChwRm9udCAhPSBOVUxMKSB7CisgICAgICAgICAgY3NCYXNlTmFtZSA9ICIiOworICAgICAgICAgIEFkZEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIHBGb250LCBjc0Jhc2VOYW1lKTsKKyAgICAgICAgICBjc0RlZmF1bHQgPSBjc0Jhc2VOYW1lOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChwRm9udCAhPSBOVUxMKSB7CisgICAgICBjc0RBID0gIi8iICsgUERGX05hbWVFbmNvZGUoY3NEZWZhdWx0KSArICIgMCBUZiI7CisgICAgfQorICB9CisgIGlmICghY3NEQS5Jc0VtcHR5KCkpIHsKKyAgICBjc0RBICs9ICIgIjsKKyAgfQorICBjc0RBICs9ICIwIGciOworICBpZiAoIXBGb3JtRGljdC0+S2V5RXhpc3QoIkRBIikpIHsKKyAgICBwRm9ybURpY3QtPlNldEF0U3RyaW5nKCJEQSIsIGNzREEpOworICB9CiB9Ci1GWF9CT09MIEZpbmRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQotewotICAgIGlmIChwRm9ybURpY3QgPT0gTlVMTCB8fCBwRm9udCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0RXT1JEIENvdW50SW50ZXJGb3JtRm9udHMoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QpIHsKKyAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgIGlmIChwRFIgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CisgIGlmIChwRm9udHMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIEZYX0RXT1JEIGR3Q291bnQgPSAwOworICBGWF9QT1NJVElPTiBwb3MgPSBwRm9udHMtPkdldFN0YXJ0UG9zKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IE5VTEw7CisgICAgQ0ZYX0J5dGVTdHJpbmcgY3NLZXk7CisgICAgcE9iaiA9IHBGb250cy0+R2V0TmV4dEVsZW1lbnQocG9zLCBjc0tleSk7CisgICAgaWYgKHBPYmogPT0gTlVMTCkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOwotICAgIGlmIChwRFIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsKKyAgICBpZiAocERpcmVjdCAhPSBOVUxMICYmIHBEaXJlY3QtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgICAgaWYgKCgoQ1BERl9EaWN0aW9uYXJ5KilwRGlyZWN0KS0+R2V0U3RyaW5nKCJUeXBlIikgPT0gIkZvbnQiKSB7CisgICAgICAgIGR3Q291bnQrKzsKKyAgICAgIH0KICAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBkd0NvdW50OworfQorQ1BERl9Gb250KiBHZXRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIGlmIChwRm9ybURpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOworICBpZiAocERSID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9IHBEUi0+R2V0RGljdCgiRm9udCIpOworICBpZiAocEZvbnRzID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWF9EV09SRCBkd0NvdW50ID0gMDsKKyAgRlhfUE9TSVRJT04gcG9zID0gcEZvbnRzLT5HZXRTdGFydFBvcygpOworICB3aGlsZSAocG9zKSB7CisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBOVUxMOworICAgIENGWF9CeXRlU3RyaW5nIGNzS2V5OworICAgIHBPYmogPSBwRm9udHMtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOworICAgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwRm9udHMtPkdldFN0YXJ0UG9zKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IE5VTEw7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNzS2V5OwotICAgICAgICBwT2JqID0gcEZvbnRzLT5HZXROZXh0RWxlbWVudChwb3MsIGNzS2V5KTsKLSAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsKLSAgICAgICAgaWYgKHBEaXJlY3QgPT0gTlVMTCB8fCBwRGlyZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRGlyZWN0OwotICAgICAgICBpZiAocEVsZW1lbnQtPkdldFN0cmluZygiVHlwZSIpICE9ICJGb250IikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBGb250LT5HZXRGb250RGljdCgpID09IHBFbGVtZW50KSB7Ci0gICAgICAgICAgICBjc05hbWVUYWcgPSBjc0tleTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9CisgICAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsKKyAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgICAgY29udGludWU7CiAgICAgfQorICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRGlyZWN0OworICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGR3Q291bnQgPT0gaW5kZXgpIHsKKyAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OworICAgICAgcmV0dXJuIHBEb2N1bWVudC0+TG9hZEZvbnQocEVsZW1lbnQpOworICAgIH0KKyAgICBkd0NvdW50Kys7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitDUERGX0ZvbnQqIEdldEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZykgeworICBDRlhfQnl0ZVN0cmluZyBjc0FsaWFzID0gUERGX05hbWVEZWNvZGUoY3NOYW1lVGFnKTsKKyAgaWYgKHBGb3JtRGljdCA9PSBOVUxMIHx8IGNzQWxpYXMuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgIGlmIChwRFIgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CisgIGlmIChwRm9udHMgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSBwRm9udHMtPkdldERpY3QoY3NBbGlhcyk7CisgIGlmIChwRWxlbWVudCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHBFbGVtZW50LT5HZXRTdHJpbmcoIlR5cGUiKSA9PSAiRm9udCIpIHsKKyAgICByZXR1cm4gcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitDUERGX0ZvbnQqIEdldEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICBpZiAocEZvcm1EaWN0ID09IE5VTEwgfHwgY3NGb250TmFtZS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKKyAgaWYgKHBEUiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKKyAgaWYgKHBGb250cyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfUE9TSVRJT04gcG9zID0gcEZvbnRzLT5HZXRTdGFydFBvcygpOworICB3aGlsZSAocG9zKSB7CisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBOVUxMOworICAgIENGWF9CeXRlU3RyaW5nIGNzS2V5OworICAgIHBPYmogPSBwRm9udHMtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOworICAgIGlmIChwT2JqID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOworICAgIGlmIChwRGlyZWN0ID09IE5VTEwgfHwgcERpcmVjdC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IChDUERGX0RpY3Rpb25hcnkqKXBEaXJlY3Q7CisgICAgaWYgKHBFbGVtZW50LT5HZXRTdHJpbmcoIlR5cGUiKSAhPSAiRm9udCIpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDUERGX0ZvbnQqIHBGaW5kID0gcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7CisgICAgaWYgKHBGaW5kID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDRlhfQnl0ZVN0cmluZyBjc0Jhc2VGb250OworICAgIGNzQmFzZUZvbnQgPSBwRmluZC0+R2V0QmFzZUZvbnQoKTsKKyAgICBjc0Jhc2VGb250LlJlbW92ZSgnICcpOworICAgIGlmIChjc0Jhc2VGb250ID09IGNzRm9udE5hbWUpIHsKKyAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OworICAgICAgcmV0dXJuIHBGaW5kOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KK0NQREZfRm9udCogR2V0TmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFyU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgIGlmIChwRFIgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CisgIGlmIChwRm9udHMgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYX1BPU0lUSU9OIHBvcyA9IHBGb250cy0+R2V0U3RhcnRQb3MoKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENQREZfT2JqZWN0KiBwT2JqID0gTlVMTDsKKyAgICBDRlhfQnl0ZVN0cmluZyBjc0tleTsKKyAgICBwT2JqID0gcEZvbnRzLT5HZXROZXh0RWxlbWVudChwb3MsIGNzS2V5KTsKKyAgICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsKKyAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRGlyZWN0OworICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgQ1BERl9Gb250KiBwRmluZCA9IHBEb2N1bWVudC0+TG9hZEZvbnQocEVsZW1lbnQpOworICAgIGlmIChwRmluZCA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0ID0gKENGWF9TdWJzdEZvbnQqKXBGaW5kLT5HZXRTdWJzdEZvbnQoKTsKKyAgICBpZiAocFN1YnN0ID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAocFN1YnN0LT5tX0NoYXJzZXQgPT0gKGludCljaGFyU2V0KSB7CisgICAgICBjc05hbWVUYWcgPSBjc0tleTsKKyAgICAgIHJldHVybiBwRmluZDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitDUERGX0ZvbnQqIEdldE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgY3NOYW1lVGFnID0gIiI7CisgIHVpbnQ4X3QgY2hhclNldCA9IENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVDaGFyU2V0KCk7CisgIENGWF9TdWJzdEZvbnQqIHBTdWJzdDsKKyAgQ1BERl9Gb250KiBwRm9udCA9IEdldERlZmF1bHRJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvY3VtZW50KTsKKyAgaWYgKHBGb250ICE9IE5VTEwpIHsKKyAgICBwU3Vic3QgPSAoQ0ZYX1N1YnN0Rm9udCopcEZvbnQtPkdldFN1YnN0Rm9udCgpOworICAgIGlmIChwU3Vic3QgIT0gTlVMTCAmJiBwU3Vic3QtPm1fQ2hhcnNldCA9PSAoaW50KWNoYXJTZXQpIHsKKyAgICAgIEZpbmRJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcEZvbnQsIGNzTmFtZVRhZyk7CisgICAgICByZXR1cm4gcEZvbnQ7CisgICAgfQorICB9CisgIHJldHVybiBHZXROYXRpdmVJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvY3VtZW50LCBjaGFyU2V0LCBjc05hbWVUYWcpOworfQorRlhfQk9PTCBGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICBpZiAocEZvcm1EaWN0ID09IE5VTEwgfHwgcEZvbnQgPT0gTlVMTCkgewogICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17Ci0gICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7Ci0gICAgaWYgKHBEUiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoY3NGb250TmFtZS5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgY3NGb250TmFtZS5SZW1vdmUoJyAnKTsKLSAgICB9Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gcEZvbnRzLT5HZXRTdGFydFBvcygpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBOVUxMOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc0tleSwgY3NUbXA7Ci0gICAgICAgIHBPYmogPSBwRm9udHMtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOwotICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOwotICAgICAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IChDUERGX0RpY3Rpb25hcnkqKXBEaXJlY3Q7Ci0gICAgICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBwRm9udCA9IHBEb2N1bWVudC0+TG9hZEZvbnQocEVsZW1lbnQpOwotICAgICAgICBpZiAocEZvbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCYXNlRm9udDsKLSAgICAgICAgY3NCYXNlRm9udCA9IHBGb250LT5HZXRCYXNlRm9udCgpOwotICAgICAgICBjc0Jhc2VGb250LlJlbW92ZSgnICcpOwotICAgICAgICBpZiAoY3NCYXNlRm9udCA9PSBjc0ZvbnROYW1lKSB7Ci0gICAgICAgICAgICBjc05hbWVUYWcgPSBjc0tleTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQorICB9CisgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOworICBpZiAocERSID09IE5VTEwpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKKyAgaWYgKHBGb250cyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX1BPU0lUSU9OIHBvcyA9IHBGb250cy0+R2V0U3RhcnRQb3MoKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENQREZfT2JqZWN0KiBwT2JqID0gTlVMTDsKKyAgICBDRlhfQnl0ZVN0cmluZyBjc0tleTsKKyAgICBwT2JqID0gcEZvbnRzLT5HZXROZXh0RWxlbWVudChwb3MsIGNzS2V5KTsKKyAgICBpZiAocE9iaiA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsKKyAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRGlyZWN0OworICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHBGb250LT5HZXRGb250RGljdCgpID09IHBFbGVtZW50KSB7CisgICAgICBjc05hbWVUYWcgPSBjc0tleTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci12b2lkIEFkZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17CitGWF9CT09MIEZpbmRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udComIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIGlmIChwRm9ybURpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKKyAgaWYgKHBEUiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CisgIGlmIChwRm9udHMgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoY3NGb250TmFtZS5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBjc0ZvbnROYW1lLlJlbW92ZSgnICcpOworICB9CisgIEZYX1BPU0lUSU9OIHBvcyA9IHBGb250cy0+R2V0U3RhcnRQb3MoKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENQREZfT2JqZWN0KiBwT2JqID0gTlVMTDsKKyAgICBDRlhfQnl0ZVN0cmluZyBjc0tleSwgY3NUbXA7CisgICAgcE9iaiA9IHBGb250cy0+R2V0TmV4dEVsZW1lbnQocG9zLCBjc0tleSk7CisgICAgaWYgKHBPYmogPT0gTlVMTCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENQREZfT2JqZWN0KiBwRGlyZWN0ID0gcE9iai0+R2V0RGlyZWN0KCk7CisgICAgaWYgKHBEaXJlY3QgPT0gTlVMTCB8fCBwRGlyZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBFbGVtZW50ID0gKENQREZfRGljdGlvbmFyeSopcERpcmVjdDsKKyAgICBpZiAocEVsZW1lbnQtPkdldFN0cmluZygiVHlwZSIpICE9ICJGb250IikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHBGb250ID0gcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7CiAgICAgaWYgKHBGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChwRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICBJbml0SW50ZXJGb3JtRGljdChwRm9ybURpY3QsIHBEb2N1bWVudCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCYXNlRm9udDsKKyAgICBjc0Jhc2VGb250ID0gcEZvbnQtPkdldEJhc2VGb250KCk7CisgICAgY3NCYXNlRm9udC5SZW1vdmUoJyAnKTsKKyAgICBpZiAoY3NCYXNlRm9udCA9PSBjc0ZvbnROYW1lKSB7CisgICAgICBjc05hbWVUYWcgPSBjc0tleTsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1RhZzsKLSAgICBpZiAoRmluZEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRm9udCwgY3NUYWcpKSB7Ci0gICAgICAgIGNzTmFtZVRhZyA9IGNzVGFnOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICBJbml0SW50ZXJGb3JtRGljdChwRm9ybURpY3QsIHBEb2N1bWVudCk7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOwotICAgIGlmIChwRFIgPT0gTlVMTCkgewotICAgICAgICBwRFIgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgICAgICBpZiAocERSID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwRm9ybURpY3QtPlNldEF0KCJEUiIsIHBEUik7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7Ci0gICAgaWYgKHBGb250cyA9PSBOVUxMKSB7Ci0gICAgICAgIHBGb250cyA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7Ci0gICAgICAgIHBEUi0+U2V0QXQoIkZvbnQiLCBwRm9udHMpOwotICAgIH0KLSAgICBpZiAoY3NOYW1lVGFnLklzRW1wdHkoKSkgewotICAgICAgICBjc05hbWVUYWcgPSBwRm9udC0+R2V0QmFzZUZvbnQoKTsKLSAgICB9Ci0gICAgY3NOYW1lVGFnLlJlbW92ZSgnICcpOwotICAgIGNzTmFtZVRhZyA9IENQREZfSW50ZXJGb3JtOjpHZW5lcmF0ZU5ld1Jlc291cmNlTmFtZShwRFIsICJGb250IiwgNCwgY3NOYW1lVGFnKTsKLSAgICBwRm9udHMtPlNldEF0UmVmZXJlbmNlKGNzTmFtZVRhZywgcERvY3VtZW50LCBwRm9udC0+R2V0Rm9udERpY3QoKSk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotQ1BERl9Gb250KiBBZGROYXRpdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCB1aW50OF90IGNoYXJTZXQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17Ci0gICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIEluaXRJbnRlckZvcm1EaWN0KHBGb3JtRGljdCwgcERvY3VtZW50KTsKK3ZvaWQgQWRkSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICBpZiAocEZvbnQgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKKyAgICBJbml0SW50ZXJGb3JtRGljdChwRm9ybURpY3QsIHBEb2N1bWVudCk7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NUYWc7CisgIGlmIChGaW5kSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBGb250LCBjc1RhZykpIHsKKyAgICBjc05hbWVUYWcgPSBjc1RhZzsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7CisgICAgSW5pdEludGVyRm9ybURpY3QocEZvcm1EaWN0LCBwRG9jdW1lbnQpOworICB9CisgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOworICBpZiAocERSID09IE5VTEwpIHsKKyAgICBwRFIgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOworICAgIGlmIChwRFIgPT0gTlVMTCkgeworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1RlbXA7Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IEdldE5hdGl2ZUludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNoYXJTZXQsIGNzVGVtcCk7Ci0gICAgaWYgKHBGb250ICE9IE5VTEwpIHsKLSAgICAgICAgY3NOYW1lVGFnID0gY3NUZW1wOwotICAgICAgICByZXR1cm4gcEZvbnQ7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUgPSBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlRm9udChjaGFyU2V0KTsKLSAgICBpZiAoIWNzRm9udE5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIGlmIChGaW5kSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgY3NGb250TmFtZSwgcEZvbnQsIGNzTmFtZVRhZykpIHsKLSAgICAgICAgICAgIHJldHVybiBwRm9udDsKLSAgICAgICAgfQotICAgIH0KLSAgICBwRm9udCA9IENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb250KGNoYXJTZXQsIHBEb2N1bWVudCk7Ci0gICAgaWYgKHBGb250ICE9IE5VTEwpIHsKLSAgICAgICAgQWRkSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgcEZvbnQsIGNzTmFtZVRhZyk7Ci0gICAgfQorICAgIHBGb3JtRGljdC0+U2V0QXQoIkRSIiwgcERSKTsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9IHBEUi0+R2V0RGljdCgiRm9udCIpOworICBpZiAocEZvbnRzID09IE5VTEwpIHsKKyAgICBwRm9udHMgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOworICAgIHBEUi0+U2V0QXQoIkZvbnQiLCBwRm9udHMpOworICB9CisgIGlmIChjc05hbWVUYWcuSXNFbXB0eSgpKSB7CisgICAgY3NOYW1lVGFnID0gcEZvbnQtPkdldEJhc2VGb250KCk7CisgIH0KKyAgY3NOYW1lVGFnLlJlbW92ZSgnICcpOworICBjc05hbWVUYWcgPQorICAgICAgQ1BERl9JbnRlckZvcm06OkdlbmVyYXRlTmV3UmVzb3VyY2VOYW1lKHBEUiwgIkZvbnQiLCA0LCBjc05hbWVUYWcpOworICBwRm9udHMtPlNldEF0UmVmZXJlbmNlKGNzTmFtZVRhZywgcERvY3VtZW50LCBwRm9udC0+R2V0Rm9udERpY3QoKSk7Cit9CitDUERGX0ZvbnQqIEFkZE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYXJTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKKyAgICBJbml0SW50ZXJGb3JtRGljdChwRm9ybURpY3QsIHBEb2N1bWVudCk7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NUZW1wOworICBDUERGX0ZvbnQqIHBGb250ID0KKyAgICAgIEdldE5hdGl2ZUludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNoYXJTZXQsIGNzVGVtcCk7CisgIGlmIChwRm9udCAhPSBOVUxMKSB7CisgICAgY3NOYW1lVGFnID0gY3NUZW1wOwogICAgIHJldHVybiBwRm9udDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lID0gQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUZvbnQoY2hhclNldCk7CisgIGlmICghY3NGb250TmFtZS5Jc0VtcHR5KCkpIHsKKyAgICBpZiAoRmluZEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNzRm9udE5hbWUsIHBGb250LCBjc05hbWVUYWcpKSB7CisgICAgICByZXR1cm4gcEZvbnQ7CisgICAgfQorICB9CisgIHBGb250ID0gQ1BERl9JbnRlckZvcm06OkFkZE5hdGl2ZUZvbnQoY2hhclNldCwgcERvY3VtZW50KTsKKyAgaWYgKHBGb250ICE9IE5VTEwpIHsKKyAgICBBZGRJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvY3VtZW50LCBwRm9udCwgY3NOYW1lVGFnKTsKKyAgfQorICByZXR1cm4gcEZvbnQ7CiB9Ci1DUERGX0ZvbnQqIEFkZE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17Ci0gICAgdWludDhfdCBjaGFyU2V0ID0gQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUNoYXJTZXQoKTsKLSAgICByZXR1cm4gQWRkTmF0aXZlSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgY2hhclNldCwgY3NOYW1lVGFnKTsKK0NQREZfRm9udCogQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgdWludDhfdCBjaGFyU2V0ID0gQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUNoYXJTZXQoKTsKKyAgcmV0dXJuIEFkZE5hdGl2ZUludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNoYXJTZXQsIGNzTmFtZVRhZyk7CiB9Ci12b2lkIFJlbW92ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIGNvbnN0IENQREZfRm9udCogcEZvbnQpCi17Ci0gICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMIHx8IHBGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1RhZzsKLSAgICBpZiAoIUZpbmRJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcEZvbnQsIGNzVGFnKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOwotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7Ci0gICAgcEZvbnRzLT5SZW1vdmVBdChjc1RhZyk7Cit2b2lkIFJlbW92ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIGNvbnN0IENQREZfRm9udCogcEZvbnQpIHsKKyAgaWYgKHBGb3JtRGljdCA9PSBOVUxMIHx8IHBGb250ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NUYWc7CisgIGlmICghRmluZEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRm9udCwgY3NUYWcpKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOworICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9IHBEUi0+R2V0RGljdCgiRm9udCIpOworICBwRm9udHMtPlJlbW92ZUF0KGNzVGFnKTsKIH0KLXZvaWQgUmVtb3ZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ0ZYX0J5dGVTdHJpbmcgY3NOYW1lVGFnKQotewotICAgIGlmIChwRm9ybURpY3QgPT0gTlVMTCB8fCBjc05hbWVUYWcuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7Ci0gICAgaWYgKHBEUiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwRm9udHMtPlJlbW92ZUF0KGNzTmFtZVRhZyk7Cit2b2lkIFJlbW92ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZykgeworICBpZiAocEZvcm1EaWN0ID09IE5VTEwgfHwgY3NOYW1lVGFnLklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKKyAgaWYgKHBEUiA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CisgIGlmIChwRm9udHMgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBwRm9udHMtPlJlbW92ZUF0KGNzTmFtZVRhZyk7CiB9Ci1DUERGX0ZvbnQqIEdldERlZmF1bHRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0gICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGNEQSA9IHBGb3JtRGljdC0+R2V0U3RyaW5nKCJEQSIpOwotICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWVUYWc7Ci0gICAgRlhfRkxPQVQgZkZvbnRTaXplOwotICAgIGNEQS5HZXRGb250KGNzRm9udE5hbWVUYWcsIGZGb250U2l6ZSk7Ci0gICAgcmV0dXJuIEdldEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNzRm9udE5hbWVUYWcpOworQ1BERl9Gb250KiBHZXREZWZhdWx0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIGlmIChwRm9ybURpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgY0RBID0gcEZvcm1EaWN0LT5HZXRTdHJpbmcoIkRBIik7CisgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWVUYWc7CisgIEZYX0ZMT0FUIGZGb250U2l6ZTsKKyAgY0RBLkdldEZvbnQoY3NGb250TmFtZVRhZywgZkZvbnRTaXplKTsKKyAgcmV0dXJuIEdldEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNzRm9udE5hbWVUYWcpOwogfQotQ1BERl9JY29uRml0OjpTY2FsZU1ldGhvZCBDUERGX0ljb25GaXQ6OkdldFNjYWxlTWV0aG9kKCkKLXsKLSAgICBpZiAoIW1fcERpY3QpIHsKLSAgICAgICAgcmV0dXJuIEFsd2F5czsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NTVyA9IG1fcERpY3QtPkdldFN0cmluZygiU1ciLCAiQSIpOwotICAgIGlmIChjc1NXID09ICJCIikgewotICAgICAgICByZXR1cm4gQmlnZ2VyOwotICAgIH0KLSAgICBpZiAoY3NTVyA9PSAiUyIpIHsKLSAgICAgICAgcmV0dXJuIFNtYWxsZXI7Ci0gICAgfQotICAgIGlmIChjc1NXID09ICJOIikgewotICAgICAgICByZXR1cm4gTmV2ZXI7Ci0gICAgfQorQ1BERl9JY29uRml0OjpTY2FsZU1ldGhvZCBDUERGX0ljb25GaXQ6OkdldFNjYWxlTWV0aG9kKCkgeworICBpZiAoIW1fcERpY3QpIHsKICAgICByZXR1cm4gQWx3YXlzOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzU1cgPSBtX3BEaWN0LT5HZXRTdHJpbmcoIlNXIiwgIkEiKTsKKyAgaWYgKGNzU1cgPT0gIkIiKSB7CisgICAgcmV0dXJuIEJpZ2dlcjsKKyAgfQorICBpZiAoY3NTVyA9PSAiUyIpIHsKKyAgICByZXR1cm4gU21hbGxlcjsKKyAgfQorICBpZiAoY3NTVyA9PSAiTiIpIHsKKyAgICByZXR1cm4gTmV2ZXI7CisgIH0KKyAgcmV0dXJuIEFsd2F5czsKIH0KLUZYX0JPT0wgQ1BERl9JY29uRml0OjpJc1Byb3BvcnRpb25hbFNjYWxlKCkKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGljdC0+R2V0U3RyaW5nKCJTIiwgIlAiKSAhPSAiQSI7CitGWF9CT09MIENQREZfSWNvbkZpdDo6SXNQcm9wb3J0aW9uYWxTY2FsZSgpIHsKKyAgaWYgKG1fcERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBtX3BEaWN0LT5HZXRTdHJpbmcoIlMiLCAiUCIpICE9ICJBIjsKIH0KLXZvaWQgQ1BERl9JY29uRml0OjpHZXRJY29uUG9zaXRpb24oRlhfRkxPQVQmIGZMZWZ0LCBGWF9GTE9BVCYgZkJvdHRvbSkKLXsKLSAgICBmTGVmdCA9IGZCb3R0b20gPSAwLjU7Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Cit2b2lkIENQREZfSWNvbkZpdDo6R2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUJiBmTGVmdCwgRlhfRkxPQVQmIGZCb3R0b20pIHsKKyAgZkxlZnQgPSBmQm90dG9tID0gMC41OworICBpZiAobV9wRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfQXJyYXkqIHBBID0gbV9wRGljdC0+R2V0QXJyYXkoIkEiKTsKKyAgaWYgKHBBICE9IE5VTEwpIHsKKyAgICBGWF9EV09SRCBkd0NvdW50ID0gcEEtPkdldENvdW50KCk7CisgICAgaWYgKGR3Q291bnQgPiAwKSB7CisgICAgICBmTGVmdCA9IHBBLT5HZXROdW1iZXIoMCk7CiAgICAgfQotICAgIENQREZfQXJyYXkqIHBBID0gbV9wRGljdC0+R2V0QXJyYXkoIkEiKTsKLSAgICBpZiAocEEgIT0gTlVMTCkgewotICAgICAgICBGWF9EV09SRCBkd0NvdW50ID0gcEEtPkdldENvdW50KCk7Ci0gICAgICAgIGlmIChkd0NvdW50ID4gMCkgewotICAgICAgICAgICAgZkxlZnQgPSBwQS0+R2V0TnVtYmVyKDApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkd0NvdW50ID4gMSkgewotICAgICAgICAgICAgZkJvdHRvbSA9IHBBLT5HZXROdW1iZXIoMSk7Ci0gICAgICAgIH0KKyAgICBpZiAoZHdDb3VudCA+IDEpIHsKKyAgICAgIGZCb3R0b20gPSBwQS0+R2V0TnVtYmVyKDEpOwogICAgIH0KKyAgfQogfQotRlhfQk9PTCBDUERGX0ljb25GaXQ6OkdldEZpdHRpbmdCb3VuZHMoKQotewotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiRkIiKTsKK0ZYX0JPT0wgQ1BERl9JY29uRml0OjpHZXRGaXR0aW5nQm91bmRzKCkgeworICBpZiAobV9wRGljdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJGQiIpOwogfQotdm9pZCBTYXZlQ2hlY2tlZEZpZWxkU3RhdHVzKENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9CeXRlQXJyYXkmIHN0YXR1c0FycmF5KQotewotICAgIGludCBpQ291bnQgPSBwRmllbGQtPkNvdW50Q29udHJvbHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKTsKLSAgICAgICAgaWYgKHBDb250cm9sID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c0FycmF5LkFkZChwQ29udHJvbC0+SXNDaGVja2VkKCkgPyAxIDogMCk7Cit2b2lkIFNhdmVDaGVja2VkRmllbGRTdGF0dXMoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZUFycmF5JiBzdGF0dXNBcnJheSkgeworICBpbnQgaUNvdW50ID0gcEZpZWxkLT5Db3VudENvbnRyb2xzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKTsKKyAgICBpZiAocENvbnRyb2wgPT0gTlVMTCkgeworICAgICAgY29udGludWU7CiAgICAgfQorICAgIHN0YXR1c0FycmF5LkFkZChwQ29udHJvbC0+SXNDaGVja2VkKCkgPyAxIDogMCk7CisgIH0KIH0KLUNQREZfT2JqZWN0KiBGUERGX0dldEZpZWxkQXR0cihDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGNvbnN0IEZYX0NIQVIqIG5hbWUsIGludCBuTGV2ZWwpCi17Ci0gICAgaWYgKG5MZXZlbCA+IEZQREZET0NfVVRJTFNfTUFYUkVDVVJTSU9OKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAocEZpZWxkRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcEF0dHIgPSBwRmllbGREaWN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7Ci0gICAgaWYgKHBBdHRyKSB7Ci0gICAgICAgIHJldHVybiBwQXR0cjsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50ID0gcEZpZWxkRGljdC0+R2V0RGljdCgiUGFyZW50Iik7Ci0gICAgaWYgKHBQYXJlbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIEZQREZfR2V0RmllbGRBdHRyKHBQYXJlbnQsIG5hbWUsIG5MZXZlbCArIDEpOworQ1BERl9PYmplY3QqIEZQREZfR2V0RmllbGRBdHRyKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGV2ZWwpIHsKKyAgaWYgKG5MZXZlbCA+IEZQREZET0NfVVRJTFNfTUFYUkVDVVJTSU9OKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHBGaWVsZERpY3QgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfT2JqZWN0KiBwQXR0ciA9IHBGaWVsZERpY3QtPkdldEVsZW1lbnRWYWx1ZShuYW1lKTsKKyAgaWYgKHBBdHRyKSB7CisgICAgcmV0dXJuIHBBdHRyOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFBhcmVudCA9IHBGaWVsZERpY3QtPkdldERpY3QoIlBhcmVudCIpOworICBpZiAocFBhcmVudCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIEZQREZfR2V0RmllbGRBdHRyKHBQYXJlbnQsIG5hbWUsIG5MZXZlbCArIDEpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuaCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmgKaW5kZXggNmJiMWQzMC4uNGE2NjUyZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuaAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY191dGlscy5oCkBAIC03LDI3ICs3LDU3IEBACiAjaWZuZGVmIENPUkVfU1JDX0ZQREZET0NfRE9DX1VUSUxTX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZQREZET0NfRE9DX1VUSUxTX0hfCiAKLUNGWF9XaWRlU3RyaW5nCUdldEZ1bGxOYW1lKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCk7Ci12b2lkCQkJSW5pdEludGVyRm9ybURpY3QoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotRlhfRFdPUkQJCUNvdW50SW50ZXJGb3JtRm9udHMoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QpOwotQ1BERl9Gb250KgkJR2V0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9EV09SRCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci1DUERGX0ZvbnQqCQlHZXRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7Ci1DUERGX0ZvbnQqCQlHZXRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotQ1BERl9Gb250KgkJR2V0TmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCB1aW50OF90IGNoYXJTZXQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotQ1BERl9Gb250KgkJR2V0TmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKLUZYX0JPT0wJCQlGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci1GWF9CT09MCQkJRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotdm9pZAkJCUFkZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotQ1BERl9Gb250KgkJQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgdWludDhfdCBjaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKLUNQREZfRm9udCoJCUFkZE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotdm9pZAkJCVJlbW92ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIGNvbnN0IENQREZfRm9udCogcEZvbnQpOwotdm9pZAkJCVJlbW92ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7Ci1DUERGX0ZvbnQqCQlHZXREZWZhdWx0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KTsKLXZvaWQJCQlTZXREZWZhdWx0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9Gb250KiBwRm9udCk7Ci12b2lkCQkJU2F2ZUNoZWNrZWRGaWVsZFN0YXR1cyhDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfQnl0ZUFycmF5JiBzdGF0dXNBcnJheSk7Ci1GWF9CT09MCQkJTmVlZFBERkVuY29kZUZvckZpZWxkRnVsbE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKTsKLUZYX0JPT0wJCQlOZWVkUERGRW5jb2RlRm9yRmllbGRUcmVlKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgaW50IG5MZXZlbCA9IDApOwotdm9pZAkJCUVuY29kZUZpZWxkTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NOYW1lLCBDRlhfQnl0ZVN0cmluZyYgY3NUKTsKLXZvaWQJCQlVcGRhdGVFbmNvZGVGaWVsZE5hbWUoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBpbnQgbkxldmVsID0gMCk7CitDRlhfV2lkZVN0cmluZyBHZXRGdWxsTmFtZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOwordm9pZCBJbml0SW50ZXJGb3JtRGljdChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7CitGWF9EV09SRCBDb3VudEludGVyRm9ybUZvbnRzKENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0KTsKK0NQREZfRm9udCogR2V0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CitDUERGX0ZvbnQqIEdldEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7CitDUERGX0ZvbnQqIEdldEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CitDUERGX0ZvbnQqIEdldE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKK0NQREZfRm9udCogR2V0TmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CitGWF9CT09MIEZpbmRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKK0ZYX0JPT0wgRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiYgcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwordm9pZCBBZGRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKK0NQREZfRm9udCogQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKK0NQREZfRm9udCogQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwordm9pZCBSZW1vdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBjb25zdCBDUERGX0ZvbnQqIHBGb250KTsKK3ZvaWQgUmVtb3ZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ0ZYX0J5dGVTdHJpbmcgY3NOYW1lVGFnKTsKK0NQREZfRm9udCogR2V0RGVmYXVsdEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7Cit2b2lkIFNldERlZmF1bHRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0ZvbnQqIHBGb250KTsKK3ZvaWQgU2F2ZUNoZWNrZWRGaWVsZFN0YXR1cyhDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfQnl0ZUFycmF5JiBzdGF0dXNBcnJheSk7CitGWF9CT09MIE5lZWRQREZFbmNvZGVGb3JGaWVsZEZ1bGxOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7CitGWF9CT09MIE5lZWRQREZFbmNvZGVGb3JGaWVsZFRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBpbnQgbkxldmVsID0gMCk7Cit2b2lkIEVuY29kZUZpZWxkTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NOYW1lLCBDRlhfQnl0ZVN0cmluZyYgY3NUKTsKK3ZvaWQgVXBkYXRlRW5jb2RlRmllbGROYW1lKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgaW50IG5MZXZlbCA9IDApOwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZET0NfRE9DX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY192aWV3ZXJQcmVmZXJlbmNlcy5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY192aWV3ZXJQcmVmZXJlbmNlcy5jcHAKaW5kZXggZWI4MjRlYi4uNTA5NjJiNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2Nfdmlld2VyUHJlZmVyZW5jZXMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3ZpZXdlclByZWZlcmVuY2VzLmNwcApAQCAtNSw1NiArNSw0OCBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6Q1BERl9WaWV3ZXJQcmVmZXJlbmNlcyhDUERGX0RvY3VtZW50ICpwRG9jKTogbV9wRG9jKHBEb2MpCi17CitDUERGX1ZpZXdlclByZWZlcmVuY2VzOjpDUERGX1ZpZXdlclByZWZlcmVuY2VzKENQREZfRG9jdW1lbnQqIHBEb2MpCisgICAgOiBtX3BEb2MocERvYykge30KK0NQREZfVmlld2VyUHJlZmVyZW5jZXM6On5DUERGX1ZpZXdlclByZWZlcmVuY2VzKCkge30KK0ZYX0JPT0wgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6SXNEaXJlY3Rpb25SMkwoKSBjb25zdCB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BEb2MtPkdldFJvb3QoKTsKKyAgcERpY3QgPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSk7CisgIGlmICghcERpY3QpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIEZYX0JTVFJDKCJSMkwiKSA9PSBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJEaXJlY3Rpb24iKSk7CiB9Ci1DUERGX1ZpZXdlclByZWZlcmVuY2VzOjp+Q1BERl9WaWV3ZXJQcmVmZXJlbmNlcygpCi17CitGWF9CT09MIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OlByaW50U2NhbGluZygpIGNvbnN0IHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcERvYy0+R2V0Um9vdCgpOworICBwRGljdCA9IHBEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpKTsKKyAgaWYgKCFwRGljdCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGWF9CU1RSQygiTm9uZSIpICE9IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlByaW50U2NhbGluZyIpKTsKIH0KLUZYX0JPT0wgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6SXNEaXJlY3Rpb25SMkwoKSBjb25zdAotewotICAgIENQREZfRGljdGlvbmFyeSAqcERpY3QgPSBtX3BEb2MtPkdldFJvb3QoKTsKLSAgICBwRGljdCA9IHBEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpKTsKLSAgICBpZiAoIXBEaWN0KQl7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYX0JTVFJDKCJSMkwiKSA9PSBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJEaXJlY3Rpb24iKSk7CitpbnQzMl90IENQREZfVmlld2VyUHJlZmVyZW5jZXM6Ok51bUNvcGllcygpIGNvbnN0IHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcERvYy0+R2V0Um9vdCgpOworICBwRGljdCA9IHBEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpKTsKKyAgaWYgKCFwRGljdCkgeworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTnVtQ29waWVzIikpOwogfQotRlhfQk9PTCBDUERGX1ZpZXdlclByZWZlcmVuY2VzOjpQcmludFNjYWxpbmcoKSBjb25zdAotewotICAgIENQREZfRGljdGlvbmFyeSAqcERpY3QgPSBtX3BEb2MtPkdldFJvb3QoKTsKLSAgICBwRGljdCA9IHBEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpKTsKLSAgICBpZiAoIXBEaWN0KQl7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRlhfQlNUUkMoIk5vbmUiKSAhPSBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJQcmludFNjYWxpbmciKSk7Ci19Ci1pbnQzMl90IENQREZfVmlld2VyUHJlZmVyZW5jZXM6Ok51bUNvcGllcygpIGNvbnN0Ci17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCA9IG1fcERvYy0+R2V0Um9vdCgpOwotICAgIHBEaWN0ID0gcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIlZpZXdlclByZWZlcmVuY2VzIikpOwotICAgIGlmICghcERpY3QpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTnVtQ29waWVzIikpOwotfQotQ1BERl9BcnJheSogQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6UHJpbnRQYWdlUmFuZ2UoKSBjb25zdAotewotICAgIENQREZfRGljdGlvbmFyeSAqcERpY3QgPSBtX3BEb2MtPkdldFJvb3QoKTsKLSAgICBDUERGX0FycmF5ICpwUmFuZ2UgPSBOVUxMOwotICAgIHBEaWN0ID0gcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIlZpZXdlclByZWZlcmVuY2VzIikpOwotICAgIGlmICghcERpY3QpIHsKLSAgICAgICAgcmV0dXJuIHBSYW5nZTsKLSAgICB9Ci0gICAgcFJhbmdlID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJQcmludFBhZ2VSYW5nZSIpKTsKK0NQREZfQXJyYXkqIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OlByaW50UGFnZVJhbmdlKCkgY29uc3QgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wRG9jLT5HZXRSb290KCk7CisgIENQREZfQXJyYXkqIHBSYW5nZSA9IE5VTEw7CisgIHBEaWN0ID0gcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIlZpZXdlclByZWZlcmVuY2VzIikpOworICBpZiAoIXBEaWN0KSB7CiAgICAgcmV0dXJuIHBSYW5nZTsKKyAgfQorICBwUmFuZ2UgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlByaW50UGFnZVJhbmdlIikpOworICByZXR1cm4gcFJhbmdlOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6RHVwbGV4KCkgY29uc3QKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gbV9wRG9jLT5HZXRSb290KCk7Ci0gICAgcERpY3QgPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSk7Ci0gICAgaWYgKCFwRGljdCkgewotICAgICAgICByZXR1cm4gRlhfQlNUUkMoIk5vbmUiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkR1cGxleCIpKTsKK0NGWF9CeXRlU3RyaW5nIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OkR1cGxleCgpIGNvbnN0IHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcERvYy0+R2V0Um9vdCgpOworICBwRGljdCA9IHBEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpKTsKKyAgaWYgKCFwRGljdCkgeworICAgIHJldHVybiBGWF9CU1RSQygiTm9uZSIpOworICB9CisgIHJldHVybiBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJEdXBsZXgiKSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY192dC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY192dC5jcHAKaW5kZXggOWI4N2Q5Mi4uYjJlYWE4YSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdnQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3Z0LmNwcApAQCAtNywxODM0ICs3LDE4MjQgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MvZnBkZl92dC5oIgogI2luY2x1ZGUgInBkZl92dC5oIgotY29uc3QgdWludDhfdCBnRm9udFNpemVTdGVwc1tdID0gewk0LCA2LCA4LCA5LCAxMCwJMTIsIDE0LCAxOCwgMjAsIDI1LAkzMCwgMzUsIDQwLCA0NSwgNTAsCTU1LCA2MCwgNzAsIDgwLCA5MCwJMTAwLCAxMTAsIDEyMCwgMTMwLCAxNDR9OwotI2RlZmluZSBQVlRfUkVUVVJOX0xFTkdUSAkJCQkJMQotI2RlZmluZSBQVlRfREVGQVVMVF9GT05UU0laRQkJCQkxOC4wZgotI2RlZmluZSBQVlRXT1JEX1NDUklQVF9OT1JNQUwJCQkJMAotI2RlZmluZSBQVlRXT1JEX1NDUklQVF9TVVBFUgkJCQkxCi0jZGVmaW5lIFBWVFdPUkRfU0NSSVBUX1NVQgkJCQkJMgotI2RlZmluZQlQVlRfRk9OVFNDQUxFCQkJCQkJMC4wMDFmCi0jZGVmaW5lIFBWVF9QRVJDRU5UCQkJCQkJCTAuMDFmCi0jZGVmaW5lIFBWVF9IQUxGCQkJCQkJCTAuNWYKLUNMaW5lOjpDTGluZSgpCi17Citjb25zdCB1aW50OF90IGdGb250U2l6ZVN0ZXBzW10gPSB7NCwgIDYsICA4LCAgIDksICAgMTAsICAxMiwgIDE0LCAxOCwgMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUsIDMwLCAzNSwgIDQwLCAgNDUsICA1MCwgIDU1LCA2MCwgNzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAsIDkwLCAxMDAsIDExMCwgMTIwLCAxMzAsIDE0NH07CisjZGVmaW5lIFBWVF9SRVRVUk5fTEVOR1RIIDEKKyNkZWZpbmUgUFZUX0RFRkFVTFRfRk9OVFNJWkUgMTguMGYKKyNkZWZpbmUgUFZUV09SRF9TQ1JJUFRfTk9STUFMIDAKKyNkZWZpbmUgUFZUV09SRF9TQ1JJUFRfU1VQRVIgMQorI2RlZmluZSBQVlRXT1JEX1NDUklQVF9TVUIgMgorI2RlZmluZSBQVlRfRk9OVFNDQUxFIDAuMDAxZgorI2RlZmluZSBQVlRfUEVSQ0VOVCAwLjAxZgorI2RlZmluZSBQVlRfSEFMRiAwLjVmCitDTGluZTo6Q0xpbmUoKSB7fQorQ0xpbmU6On5DTGluZSgpIHt9CitDUFZUX1dvcmRQbGFjZSBDTGluZTo6R2V0QmVnaW5Xb3JkUGxhY2UoKSBjb25zdCB7CisgIHJldHVybiBDUFZUX1dvcmRQbGFjZShMaW5lUGxhY2UublNlY0luZGV4LCBMaW5lUGxhY2UubkxpbmVJbmRleCwgLTEpOwogfQotQ0xpbmU6On5DTGluZSgpCi17CitDUFZUX1dvcmRQbGFjZSBDTGluZTo6R2V0RW5kV29yZFBsYWNlKCkgY29uc3QgeworICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoTGluZVBsYWNlLm5TZWNJbmRleCwgTGluZVBsYWNlLm5MaW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBtX0xpbmVJbmZvLm5FbmRXb3JkSW5kZXgpOwogfQotQ1BWVF9Xb3JkUGxhY2UgQ0xpbmU6OkdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoTGluZVBsYWNlLm5TZWNJbmRleCwgTGluZVBsYWNlLm5MaW5lSW5kZXgsIC0xKTsKK0NQVlRfV29yZFBsYWNlIENMaW5lOjpHZXRQcmV2V29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICBpZiAocGxhY2UubldvcmRJbmRleCA+IG1fTGluZUluZm8ubkVuZFdvcmRJbmRleCkgeworICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTGluZUluZm8ubkVuZFdvcmRJbmRleCk7CisgIH0KKyAgcmV0dXJuIENQVlRfV29yZFBsYWNlKHBsYWNlLm5TZWNJbmRleCwgcGxhY2UubkxpbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlLm5Xb3JkSW5kZXggLSAxKTsKIH0KLUNQVlRfV29yZFBsYWNlIENMaW5lOjpHZXRFbmRXb3JkUGxhY2UoKSBjb25zdAotewotICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShMaW5lUGxhY2UublNlY0luZGV4LCBMaW5lUGxhY2UubkxpbmVJbmRleCwgbV9MaW5lSW5mby5uRW5kV29yZEluZGV4KTsKK0NQVlRfV29yZFBsYWNlIENMaW5lOjpHZXROZXh0V29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICBpZiAocGxhY2UubldvcmRJbmRleCA8IG1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4KSB7CisgICAgcmV0dXJuIENQVlRfV29yZFBsYWNlKHBsYWNlLm5TZWNJbmRleCwgcGxhY2UubkxpbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXgpOworICB9CisgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZS5uV29yZEluZGV4ICsgMSk7CiB9Ci1DUFZUX1dvcmRQbGFjZSBDTGluZTo6R2V0UHJldldvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIGlmIChwbGFjZS5uV29yZEluZGV4ID4gbV9MaW5lSW5mby5uRW5kV29yZEluZGV4KSB7Ci0gICAgICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsIG1fTGluZUluZm8ubkVuZFdvcmRJbmRleCk7CitDU2VjdGlvbjo6Q1NlY3Rpb24oQ1BERl9WYXJpYWJsZVRleHQqIHBWVCkgOiBtX3BWVChwVlQpIHt9CitDU2VjdGlvbjo6fkNTZWN0aW9uKCkgeworICBSZXNldEFsbCgpOworfQordm9pZCBDU2VjdGlvbjo6UmVzZXRBbGwoKSB7CisgIFJlc2V0V29yZEFycmF5KCk7CisgIFJlc2V0TGluZUFycmF5KCk7Cit9Cit2b2lkIENTZWN0aW9uOjpSZXNldExpbmVBcnJheSgpIHsKKyAgbV9MaW5lQXJyYXkuUmVtb3ZlQWxsKCk7Cit9Cit2b2lkIENTZWN0aW9uOjpSZXNldFdvcmRBcnJheSgpIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fV29yZEFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBkZWxldGUgbV9Xb3JkQXJyYXkuR2V0QXQoaSk7CisgIH0KKyAgbV9Xb3JkQXJyYXkuUmVtb3ZlQWxsKCk7Cit9Cit2b2lkIENTZWN0aW9uOjpSZXNldExpbmVQbGFjZSgpIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fTGluZUFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ0xpbmUqIHBMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQoaSkpIHsKKyAgICAgIHBMaW5lLT5MaW5lUGxhY2UgPSBDUFZUX1dvcmRQbGFjZShTZWNQbGFjZS5uU2VjSW5kZXgsIGksIC0xKTsKICAgICB9Ci0gICAgcmV0dXJuIENQVlRfV29yZFBsYWNlKHBsYWNlLm5TZWNJbmRleCwgcGxhY2UubkxpbmVJbmRleCwgcGxhY2UubldvcmRJbmRleCAtIDEpOworICB9CiB9Ci1DUFZUX1dvcmRQbGFjZSBDTGluZTo6R2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIGlmIChwbGFjZS5uV29yZEluZGV4IDwgbV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIENQVlRfV29yZFBsYWNlKHBsYWNlLm5TZWNJbmRleCwgcGxhY2UubkxpbmVJbmRleCwgbV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXgpOwotICAgIH0KLSAgICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UocGxhY2UublNlY0luZGV4LCBwbGFjZS5uTGluZUluZGV4LCBwbGFjZS5uV29yZEluZGV4ICsgMSk7Ci19Ci1DU2VjdGlvbjo6Q1NlY3Rpb24oQ1BERl9WYXJpYWJsZVRleHQgKiBwVlQpIDogbV9wVlQocFZUKQotewotfQotQ1NlY3Rpb246On5DU2VjdGlvbigpCi17Ci0gICAgUmVzZXRBbGwoKTsKLX0KLXZvaWQgQ1NlY3Rpb246OlJlc2V0QWxsKCkKLXsKLSAgICBSZXNldFdvcmRBcnJheSgpOwotICAgIFJlc2V0TGluZUFycmF5KCk7Ci19Ci12b2lkIENTZWN0aW9uOjpSZXNldExpbmVBcnJheSgpCi17Ci0gICAgbV9MaW5lQXJyYXkuUmVtb3ZlQWxsKCk7Ci19Ci12b2lkIENTZWN0aW9uOjpSZXNldFdvcmRBcnJheSgpCi17Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fV29yZEFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgZGVsZXRlIG1fV29yZEFycmF5LkdldEF0KGkpOwotICAgIH0KLSAgICBtX1dvcmRBcnJheS5SZW1vdmVBbGwoKTsKLX0KLXZvaWQgQ1NlY3Rpb246OlJlc2V0TGluZVBsYWNlKCkKLXsKLSAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgewotICAgICAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KGkpKSB7Ci0gICAgICAgICAgICBwTGluZS0+TGluZVBsYWNlID0gQ1BWVF9Xb3JkUGxhY2UoU2VjUGxhY2UublNlY0luZGV4LCBpLCAtMSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6QWRkV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pCi17Ci0gICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IEZYX05FVyBDUFZUX1dvcmRJbmZvKHdvcmRpbmZvKSkgewotICAgICAgICBpbnQzMl90IG5Xb3JkSW5kZXggPSBGUERGX01BWChGUERGX01JTihwbGFjZS5uV29yZEluZGV4LCBtX1dvcmRBcnJheS5HZXRTaXplKCkpLCAwKTsKLSAgICAgICAgaWYgKG5Xb3JkSW5kZXggPT0gbV9Xb3JkQXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBtX1dvcmRBcnJheS5BZGQocFdvcmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9Xb3JkQXJyYXkuSW5zZXJ0QXQobldvcmRJbmRleCwgcFdvcmQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpBZGRMaW5lKGNvbnN0IENQVlRfTGluZUluZm8gJiBsaW5laW5mbykKLXsKLSAgICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoU2VjUGxhY2UublNlY0luZGV4LCBtX0xpbmVBcnJheS5BZGQobGluZWluZm8pLCAtMSk7Ci19Ci1DUFZUX0Zsb2F0UmVjdCBDU2VjdGlvbjo6UmVhcnJhbmdlKCkKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgaWYgKG1fcFZULT5tX25DaGFyQXJyYXkgPiAwKSB7Ci0gICAgICAgIHJldHVybiBDVHlwZXNldCh0aGlzKS5DaGFyQXJyYXkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIENUeXBlc2V0KHRoaXMpLlR5cGVzZXQoKTsKLX0KLUNQVlRfU2l6ZSBDU2VjdGlvbjo6R2V0U2VjdGlvblNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQotewotICAgIHJldHVybiBDVHlwZXNldCh0aGlzKS5HZXRFZGl0U2l6ZShmRm9udFNpemUpOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OkdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QKLXsKLSAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KDApKSB7Ci0gICAgICAgIHJldHVybiBwTGluZS0+R2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIFNlY1BsYWNlOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OkdldEVuZFdvcmRQbGFjZSgpIGNvbnN0Ci17Ci0gICAgaWYgKENMaW5lICogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChtX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxKSkgewotICAgICAgICByZXR1cm4gcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gU2VjUGxhY2U7Ci19Ci1DUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6R2V0UHJldldvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIGlmIChwbGFjZS5uTGluZUluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgaWYgKHBsYWNlLm5MaW5lSW5kZXggPj0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBHZXRFbmRXb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgaWYgKENMaW5lICogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChwbGFjZS5uTGluZUluZGV4KSkgewotICAgICAgICBpZiAocGxhY2UubldvcmRJbmRleCA9PSBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsIC0xKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxhY2UubldvcmRJbmRleCA8IHBMaW5lLT5tX0xpbmVJbmZvLm5CZWdpbldvcmRJbmRleCkgewotICAgICAgICAgICAgaWYgKENMaW5lICogcFByZXZMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBQcmV2TGluZS0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcExpbmUtPkdldFByZXZXb3JkUGxhY2UocGxhY2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpHZXROZXh0V29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0Ci17Ci0gICAgaWYgKHBsYWNlLm5MaW5lSW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOwotICAgIH0KLSAgICBpZiAocGxhY2UubkxpbmVJbmRleCA+PSBtX0xpbmVBcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEdldEVuZFdvcmRQbGFjZSgpOwotICAgIH0KLSAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXgpKSB7Ci0gICAgICAgIGlmIChwbGFjZS5uV29yZEluZGV4ID49IHBMaW5lLT5tX0xpbmVJbmZvLm5FbmRXb3JkSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChDTGluZSAqIHBOZXh0TGluZSA9IG1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXggKyAxKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwTmV4dExpbmUtPkdldEJlZ2luV29yZFBsYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcExpbmUtPkdldE5leHRXb3JkUGxhY2UocGxhY2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLXZvaWQgQ1NlY3Rpb246OlVwZGF0ZVdvcmRQbGFjZShDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIGludDMyX3QgbkxlZnQgPSAwOwotICAgIGludDMyX3QgblJpZ2h0ID0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMTsKLSAgICBpbnQzMl90IG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKLSAgICB3aGlsZSAobkxlZnQgPD0gblJpZ2h0KSB7Ci0gICAgICAgIGlmIChDTGluZSAqIHBMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQobk1pZCkpIHsKLSAgICAgICAgICAgIGlmIChwbGFjZS5uV29yZEluZGV4IDwgcExpbmUtPm1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgblJpZ2h0ID0gbk1pZCAtIDE7Ci0gICAgICAgICAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwbGFjZS5uV29yZEluZGV4ID4gcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleCkgewotICAgICAgICAgICAgICAgIG5MZWZ0ID0gbk1pZCArIDE7Ci0gICAgICAgICAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwbGFjZS5uTGluZUluZGV4ID0gbk1pZDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLUNQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpTZWFyY2hXb3JkUGxhY2UoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdAotewotICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKLSAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IEdldEJlZ2luV29yZFBsYWNlKCk7Ci0gICAgRlhfQk9PTCBiVXAgPSBUUlVFOwotICAgIEZYX0JPT0wgYkRvd24gPSBUUlVFOwotICAgIGludDMyX3QgbkxlZnQgPSAwOwotICAgIGludDMyX3QgblJpZ2h0ID0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMTsKLSAgICBpbnQzMl90IG5NaWQgPSBtX0xpbmVBcnJheS5HZXRTaXplKCkgLyAyOwotICAgIEZYX0ZMT0FUIGZUb3AgPSAwOwotICAgIEZYX0ZMT0FUIGZCb3R0b20gPSAwOwotICAgIHdoaWxlIChuTGVmdCA8PSBuUmlnaHQpIHsKLSAgICAgICAgaWYgKENMaW5lICogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChuTWlkKSkgewotICAgICAgICAgICAgZlRvcCA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSAtIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lQXNjZW50IC0gbV9wVlQtPkdldExpbmVMZWFkaW5nKG1fU2VjSW5mbyk7Ci0gICAgICAgICAgICBmQm90dG9tID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVZIC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVEZXNjZW50OwotICAgICAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocG9pbnQueSwgZlRvcCkpIHsKLSAgICAgICAgICAgICAgICBiVXAgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihwb2ludC55LCBmQm90dG9tKSkgewotICAgICAgICAgICAgICAgIGJEb3duID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIocG9pbnQueSwgZlRvcCkpIHsKLSAgICAgICAgICAgICAgICBuUmlnaHQgPSBuTWlkIC0gMTsKLSAgICAgICAgICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKElzRmxvYXRCaWdnZXIocG9pbnQueSwgZkJvdHRvbSkpIHsKLSAgICAgICAgICAgICAgICBuTGVmdCA9IG5NaWQgKyAxOwotICAgICAgICAgICAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGxhY2UgPSBTZWFyY2hXb3JkUGxhY2UocG9pbnQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX1dvcmRSYW5nZShwTGluZS0+R2V0TmV4dFdvcmRQbGFjZShwTGluZS0+R2V0QmVnaW5Xb3JkUGxhY2UoKSksIHBMaW5lLT5HZXRFbmRXb3JkUGxhY2UoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgcGxhY2UubkxpbmVJbmRleCA9IG5NaWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChiVXApIHsKLSAgICAgICAgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOwotICAgIH0KLSAgICBpZiAoYkRvd24pIHsKLSAgICAgICAgcGxhY2UgPSBHZXRFbmRXb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBsYWNlOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OlNlYXJjaFdvcmRQbGFjZShGWF9GTE9BVCBmeCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBsaW5lcGxhY2UpIGNvbnN0Ci17Ci0gICAgaWYgKENMaW5lICogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChsaW5lcGxhY2UubkxpbmVJbmRleCkpIHsKLSAgICAgICAgcmV0dXJuIFNlYXJjaFdvcmRQbGFjZShmeCAtIG1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX1dvcmRSYW5nZShwTGluZS0+R2V0TmV4dFdvcmRQbGFjZShwTGluZS0+R2V0QmVnaW5Xb3JkUGxhY2UoKSksIHBMaW5lLT5HZXRFbmRXb3JkUGxhY2UoKSkpOwotICAgIH0KLSAgICByZXR1cm4gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLX0KLUNQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpTZWFyY2hXb3JkUGxhY2UoRlhfRkxPQVQgZngsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpIGNvbnN0Ci17Ci0gICAgQ1BWVF9Xb3JkUGxhY2Ugd29yZHBsYWNlID0gcmFuZ2UuQmVnaW5Qb3M7Ci0gICAgd29yZHBsYWNlLm5Xb3JkSW5kZXggPSAtMTsKLSAgICBpZiAoIW1fcFZUKQl7Ci0gICAgICAgIHJldHVybiB3b3JkcGxhY2U7Ci0gICAgfQotICAgIGludDMyX3QgbkxlZnQgPSByYW5nZS5CZWdpblBvcy5uV29yZEluZGV4OwotICAgIGludDMyX3QgblJpZ2h0ID0gcmFuZ2UuRW5kUG9zLm5Xb3JkSW5kZXggKyAxOwotICAgIGludDMyX3Qgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgIHdoaWxlIChuTGVmdCA8IG5SaWdodCkgewotICAgICAgICBpZiAobk1pZCA9PSBuTGVmdCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5NaWQgPT0gblJpZ2h0KSB7Ci0gICAgICAgICAgICBuTWlkLS07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyAqIHBXb3JkID0gbV9Xb3JkQXJyYXkuR2V0QXQobk1pZCkpIHsKLSAgICAgICAgICAgIGlmIChmeCA+IHBXb3JkLT5mV29yZFggKyBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCkgKiBQVlRfSEFMRikgewotICAgICAgICAgICAgICAgIG5MZWZ0ID0gbk1pZDsKLSAgICAgICAgICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5SaWdodCA9IG5NaWQ7Ci0gICAgICAgICAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IG1fV29yZEFycmF5LkdldEF0KG5NaWQpKSB7Ci0gICAgICAgIGlmIChmeCA+IHBXb3JkLT5mV29yZFggKyBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCkgKiBQVlRfSEFMRikgewotICAgICAgICAgICAgd29yZHBsYWNlLm5Xb3JkSW5kZXggPSBuTWlkOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB3b3JkcGxhY2U7Ci19Ci12b2lkIENTZWN0aW9uOjpDbGVhckxlZnRXb3JkcyhpbnQzMl90IG5Xb3JkSW5kZXgpCi17Ci0gICAgZm9yIChpbnQzMl90IGkgPSBuV29yZEluZGV4OyBpID49IDA7IGktLSkgewotICAgICAgICBkZWxldGUgbV9Xb3JkQXJyYXkuR2V0QXQoaSk7Ci0gICAgICAgIG1fV29yZEFycmF5LlJlbW92ZUF0KGkpOwotICAgIH0KLX0KLXZvaWQgQ1NlY3Rpb246OkNsZWFyUmlnaHRXb3JkcyhpbnQzMl90IG5Xb3JkSW5kZXgpCi17Ci0gICAgZm9yIChpbnQzMl90IGkgPSBtX1dvcmRBcnJheS5HZXRTaXplKCkgLSAxOyBpID4gbldvcmRJbmRleDsgaS0tKSB7Ci0gICAgICAgIGRlbGV0ZSBtX1dvcmRBcnJheS5HZXRBdChpKTsKLSAgICAgICAgbV9Xb3JkQXJyYXkuUmVtb3ZlQXQoaSk7Ci0gICAgfQotfQotdm9pZCBDU2VjdGlvbjo6Q2xlYXJNaWRXb3JkcyhpbnQzMl90IG5CZWdpbkluZGV4LCBpbnQzMl90IG5FbmRJbmRleCkKLXsKLSAgICBmb3IgKGludDMyX3QgaSA9IG5FbmRJbmRleDsgaSA+IG5CZWdpbkluZGV4OyBpLS0pIHsKLSAgICAgICAgZGVsZXRlIG1fV29yZEFycmF5LkdldEF0KGkpOwotICAgICAgICBtX1dvcmRBcnJheS5SZW1vdmVBdChpKTsKLSAgICB9Ci19Ci12b2lkIENTZWN0aW9uOjpDbGVhcldvcmRzKGNvbnN0IENQVlRfV29yZFJhbmdlICYgUGxhY2VSYW5nZSkKLXsKLSAgICBDUFZUX1dvcmRQbGFjZSBTZWNCZWdpblBvcyA9IEdldEJlZ2luV29yZFBsYWNlKCk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UgU2VjRW5kUG9zID0gR2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgaWYgKFBsYWNlUmFuZ2UuQmVnaW5Qb3MuV29yZENtcChTZWNCZWdpblBvcykgPj0gMCkgewotICAgICAgICBpZiAoUGxhY2VSYW5nZS5FbmRQb3MuV29yZENtcChTZWNFbmRQb3MpIDw9IDApIHsKLSAgICAgICAgICAgIENsZWFyTWlkV29yZHMoUGxhY2VSYW5nZS5CZWdpblBvcy5uV29yZEluZGV4LCBQbGFjZVJhbmdlLkVuZFBvcy5uV29yZEluZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENsZWFyUmlnaHRXb3JkcyhQbGFjZVJhbmdlLkJlZ2luUG9zLm5Xb3JkSW5kZXgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChQbGFjZVJhbmdlLkVuZFBvcy5Xb3JkQ21wKFNlY0VuZFBvcykgPD0gMCkgewotICAgICAgICBDbGVhckxlZnRXb3JkcyhQbGFjZVJhbmdlLkVuZFBvcy5uV29yZEluZGV4KTsKK0NQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpBZGRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZEluZm8mIHdvcmRpbmZvKSB7CisgIGlmIChDUFZUX1dvcmRJbmZvKiBwV29yZCA9IEZYX05FVyBDUFZUX1dvcmRJbmZvKHdvcmRpbmZvKSkgeworICAgIGludDMyX3QgbldvcmRJbmRleCA9CisgICAgICAgIEZQREZfTUFYKEZQREZfTUlOKHBsYWNlLm5Xb3JkSW5kZXgsIG1fV29yZEFycmF5LkdldFNpemUoKSksIDApOworICAgIGlmIChuV29yZEluZGV4ID09IG1fV29yZEFycmF5LkdldFNpemUoKSkgeworICAgICAgbV9Xb3JkQXJyYXkuQWRkKHBXb3JkKTsKICAgICB9IGVsc2UgewotICAgICAgICBSZXNldFdvcmRBcnJheSgpOworICAgICAgbV9Xb3JkQXJyYXkuSW5zZXJ0QXQobldvcmRJbmRleCwgcFdvcmQpOwogICAgIH0KKyAgfQorICByZXR1cm4gcGxhY2U7CiB9Ci12b2lkIENTZWN0aW9uOjpDbGVhcldvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKLXsKLSAgICBkZWxldGUgbV9Xb3JkQXJyYXkuR2V0QXQocGxhY2UubldvcmRJbmRleCk7Ci0gICAgbV9Xb3JkQXJyYXkuUmVtb3ZlQXQocGxhY2UubldvcmRJbmRleCk7CitDUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6QWRkTGluZShjb25zdCBDUFZUX0xpbmVJbmZvJiBsaW5laW5mbykgeworICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoU2VjUGxhY2UublNlY0luZGV4LCBtX0xpbmVBcnJheS5BZGQobGluZWluZm8pLCAtMSk7CiB9Ci1DVHlwZXNldDo6Q1R5cGVzZXQoQ1NlY3Rpb24gKiBwU2VjdGlvbikgOiBtX3JjUmV0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpLCBtX3BWVChwU2VjdGlvbi0+bV9wVlQpLCBtX3BTZWN0aW9uKHBTZWN0aW9uKQoteworQ1BWVF9GbG9hdFJlY3QgQ1NlY3Rpb246OlJlYXJyYW5nZSgpIHsKKyAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOworICBpZiAobV9wVlQtPm1fbkNoYXJBcnJheSA+IDApIHsKKyAgICByZXR1cm4gQ1R5cGVzZXQodGhpcykuQ2hhckFycmF5KCk7CisgIH0KKyAgcmV0dXJuIENUeXBlc2V0KHRoaXMpLlR5cGVzZXQoKTsKIH0KLUNUeXBlc2V0Ojp+Q1R5cGVzZXQoKQoteworQ1BWVF9TaXplIENTZWN0aW9uOjpHZXRTZWN0aW9uU2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsKKyAgcmV0dXJuIENUeXBlc2V0KHRoaXMpLkdldEVkaXRTaXplKGZGb250U2l6ZSk7CiB9Ci1DUFZUX0Zsb2F0UmVjdCBDVHlwZXNldDo6Q2hhckFycmF5KCkKLXsKLSAgICBBU1NFUlQobV9wU2VjdGlvbiAhPSBOVUxMKTsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgRlhfRkxPQVQgZkxpbmVBc2NlbnQgPSBtX3BWVC0+R2V0Rm9udEFzY2VudChtX3BWVC0+R2V0RGVmYXVsdEZvbnRJbmRleCgpLCBtX3BWVC0+R2V0Rm9udFNpemUoKSk7Ci0gICAgRlhfRkxPQVQgZkxpbmVEZXNjZW50ID0gbV9wVlQtPkdldEZvbnREZXNjZW50KG1fcFZULT5HZXREZWZhdWx0Rm9udEluZGV4KCksIG1fcFZULT5HZXRGb250U2l6ZSgpKTsKLSAgICBtX3JjUmV0LkRlZmF1bHQoKTsKLSAgICBGWF9GTE9BVCB4ID0gMC4wZiwgeSA9IDAuMGY7Ci0gICAgRlhfRkxPQVQgZk5leHRXaWR0aDsKLSAgICBpbnQzMl90IG5TdGFydCA9IDA7Ci0gICAgRlhfRkxPQVQgZk5vZGVXaWR0aCA9IG1fcFZULT5HZXRQbGF0ZVdpZHRoKCkgLyAobV9wVlQtPm1fbkNoYXJBcnJheSA8PSAwID8gMSA6IG1fcFZULT5tX25DaGFyQXJyYXkpOwotICAgIGlmIChDTGluZSAqIHBMaW5lID0gbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQoMCkpIHsKLSAgICAgICAgeCA9IDAuMGY7Ci0gICAgICAgIHkgKz0gIG1fcFZULT5HZXRMaW5lTGVhZGluZyhtX3BTZWN0aW9uLT5tX1NlY0luZm8pOwotICAgICAgICB5ICs9IGZMaW5lQXNjZW50OwotICAgICAgICBuU3RhcnQgPSAwOwotICAgICAgICBzd2l0Y2ggKG1fcFZULT5HZXRBbGlnbm1lbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCA9IGZOb2RlV2lkdGggKiBQVlRfSEFMRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBuU3RhcnQgPSAobV9wVlQtPm1fbkNoYXJBcnJheSAtIG1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSkgLyAyOwotICAgICAgICAgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCA9IGZOb2RlV2lkdGggKiBuU3RhcnQgLSBmTm9kZVdpZHRoICogUFZUX0hBTEY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgblN0YXJ0ID0gbV9wVlQtPm1fbkNoYXJBcnJheSAtIG1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggPSBmTm9kZVdpZHRoICogblN0YXJ0IC0gZk5vZGVXaWR0aCAqIFBWVF9IQUxGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50MzJfdCB3ID0gMCwgc3ogPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7IHcgPCBzejsgdysrKSB7Ci0gICAgICAgICAgICBpZiAodyA+PSBtX3BWVC0+bV9uQ2hhckFycmF5KSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmTmV4dFdpZHRoID0gMDsKLSAgICAgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvICogcE5leHRXb3JkID0gKENQVlRfV29yZEluZm8gKiltX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3ICsgMSkpIHsKLSAgICAgICAgICAgICAgICBwTmV4dFdvcmQtPmZXb3JkVGFpbCA9IDA7Ci0gICAgICAgICAgICAgICAgZk5leHRXaWR0aCA9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBOZXh0V29yZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyAqIHBXb3JkID0gKENQVlRfV29yZEluZm8gKiltX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KSkgewotICAgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFRhaWwgPSAwOwotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXb3JkV2lkdGggPSBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCk7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZldvcmRBc2NlbnQgPSBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQpOwotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXb3JkRGVzY2VudCA9IG1fcFZULT5HZXRXb3JkRGVzY2VudCgqcFdvcmQpOwotICAgICAgICAgICAgICAgIHggPSAoRlhfRkxPQVQpKGZOb2RlV2lkdGggKiAodyArIG5TdGFydCArIDAuNSkgLSBmV29yZFdpZHRoICogUFZUX0hBTEYpOwotICAgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFggPSB4OwotICAgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFkgPSB5OwotICAgICAgICAgICAgICAgIGlmICh3ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVYID0geDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHcgIT0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkVGFpbCA9IChmTm9kZVdpZHRoIC0gKGZXb3JkV2lkdGggKyBmTmV4dFdpZHRoKSAqIFBWVF9IQUxGID4gMCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk5vZGVXaWR0aCAtIChmV29yZFdpZHRoICsgZk5leHRXaWR0aCkgKiBQVlRfSEFMRiA6IDApOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRUYWlsID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeCArPSBmV29yZFdpZHRoOwotICAgICAgICAgICAgICAgIGZMaW5lQXNjZW50ID0gRlBERl9NQVgoZkxpbmVBc2NlbnQsIGZXb3JkQXNjZW50KTsKLSAgICAgICAgICAgICAgICBmTGluZURlc2NlbnQgPSBGUERGX01JTihmTGluZURlc2NlbnQsIGZXb3JkRGVzY2VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcExpbmUtPm1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4ID0gMDsKLSAgICAgICAgcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleCA9IG1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSAtIDE7Ci0gICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSA9IHk7Ci0gICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lV2lkdGggPSAJeCAtIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWDsKLSAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVBc2NlbnQgPSBmTGluZUFzY2VudDsKLSAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVEZXNjZW50ID0gZkxpbmVEZXNjZW50OwotICAgICAgICB5ICs9ICgtZkxpbmVEZXNjZW50KTsKK0NQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpHZXRCZWdpbldvcmRQbGFjZSgpIGNvbnN0IHsKKyAgaWYgKENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KDApKSB7CisgICAgcmV0dXJuIHBMaW5lLT5HZXRCZWdpbldvcmRQbGFjZSgpOworICB9CisgIHJldHVybiBTZWNQbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpHZXRFbmRXb3JkUGxhY2UoKSBjb25zdCB7CisgIGlmIChDTGluZSogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChtX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxKSkgeworICAgIHJldHVybiBwTGluZS0+R2V0RW5kV29yZFBsYWNlKCk7CisgIH0KKyAgcmV0dXJuIFNlY1BsYWNlOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OkdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIGlmIChwbGFjZS5uTGluZUluZGV4IDwgMCkgeworICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOworICB9CisgIGlmIChwbGFjZS5uTGluZUluZGV4ID49IG1fTGluZUFycmF5LkdldFNpemUoKSkgeworICAgIHJldHVybiBHZXRFbmRXb3JkUGxhY2UoKTsKKyAgfQorICBpZiAoQ0xpbmUqIHBMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCkpIHsKKyAgICBpZiAocGxhY2UubldvcmRJbmRleCA9PSBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXgpIHsKKyAgICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsIC0xKTsKICAgICB9Ci0gICAgcmV0dXJuIG1fcmNSZXQgPSBDUFZUX0Zsb2F0UmVjdCgwLCAwLCB4LCB5KTsKKyAgICBpZiAocGxhY2UubldvcmRJbmRleCA8IHBMaW5lLT5tX0xpbmVJbmZvLm5CZWdpbldvcmRJbmRleCkgeworICAgICAgaWYgKENMaW5lKiBwUHJldkxpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChwbGFjZS5uTGluZUluZGV4IC0gMSkpIHsKKyAgICAgICAgcmV0dXJuIHBQcmV2TGluZS0+R2V0RW5kV29yZFBsYWNlKCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBwTGluZS0+R2V0UHJldldvcmRQbGFjZShwbGFjZSk7CisgICAgfQorICB9CisgIHJldHVybiBwbGFjZTsKIH0KLUNQVlRfU2l6ZSBDVHlwZXNldDo6R2V0RWRpdFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQotewotICAgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOwotICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKLSAgICBTcGxpdExpbmVzKEZBTFNFLCBmRm9udFNpemUpOwotICAgIHJldHVybiBDUFZUX1NpemUobV9yY1JldC5XaWR0aCgpLCBtX3JjUmV0LkhlaWdodCgpKTsKK0NQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpHZXROZXh0V29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICBpZiAocGxhY2UubkxpbmVJbmRleCA8IDApIHsKKyAgICByZXR1cm4gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKKyAgfQorICBpZiAocGxhY2UubkxpbmVJbmRleCA+PSBtX0xpbmVBcnJheS5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gR2V0RW5kV29yZFBsYWNlKCk7CisgIH0KKyAgaWYgKENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXgpKSB7CisgICAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPj0gcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleCkgeworICAgICAgaWYgKENMaW5lKiBwTmV4dExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChwbGFjZS5uTGluZUluZGV4ICsgMSkpIHsKKyAgICAgICAgcmV0dXJuIHBOZXh0TGluZS0+R2V0QmVnaW5Xb3JkUGxhY2UoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHBMaW5lLT5HZXROZXh0V29yZFBsYWNlKHBsYWNlKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBsYWNlOwogfQotQ1BWVF9GbG9hdFJlY3QgQ1R5cGVzZXQ6OlR5cGVzZXQoKQotewotICAgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOwotICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKLSAgICBtX3BTZWN0aW9uLT5tX0xpbmVBcnJheS5FbXB0eSgpOwotICAgIFNwbGl0TGluZXMoVFJVRSwgMC4wZik7Ci0gICAgbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuQ2xlYXIoKTsKLSAgICBPdXRwdXRMaW5lcygpOwotICAgIHJldHVybiBtX3JjUmV0Owordm9pZCBDU2VjdGlvbjo6VXBkYXRlV29yZFBsYWNlKENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICBpbnQzMl90IG5MZWZ0ID0gMDsKKyAgaW50MzJfdCBuUmlnaHQgPSBtX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxOworICBpbnQzMl90IG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKKyAgd2hpbGUgKG5MZWZ0IDw9IG5SaWdodCkgeworICAgIGlmIChDTGluZSogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChuTWlkKSkgeworICAgICAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPCBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXgpIHsKKyAgICAgICAgblJpZ2h0ID0gbk1pZCAtIDE7CisgICAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKKyAgICAgIH0gZWxzZSBpZiAocGxhY2UubldvcmRJbmRleCA+IHBMaW5lLT5tX0xpbmVJbmZvLm5FbmRXb3JkSW5kZXgpIHsKKyAgICAgICAgbkxlZnQgPSBuTWlkICsgMTsKKyAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGxhY2UubkxpbmVJbmRleCA9IG5NaWQ7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CitDUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6U2VhcmNoV29yZFBsYWNlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOworICBGWF9CT09MIGJVcCA9IFRSVUU7CisgIEZYX0JPT0wgYkRvd24gPSBUUlVFOworICBpbnQzMl90IG5MZWZ0ID0gMDsKKyAgaW50MzJfdCBuUmlnaHQgPSBtX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxOworICBpbnQzMl90IG5NaWQgPSBtX0xpbmVBcnJheS5HZXRTaXplKCkgLyAyOworICBGWF9GTE9BVCBmVG9wID0gMDsKKyAgRlhfRkxPQVQgZkJvdHRvbSA9IDA7CisgIHdoaWxlIChuTGVmdCA8PSBuUmlnaHQpIHsKKyAgICBpZiAoQ0xpbmUqIHBMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQobk1pZCkpIHsKKyAgICAgIGZUb3AgPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVkgLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudCAtCisgICAgICAgICAgICAgbV9wVlQtPkdldExpbmVMZWFkaW5nKG1fU2VjSW5mbyk7CisgICAgICBmQm90dG9tID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVZIC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVEZXNjZW50OworICAgICAgaWYgKElzRmxvYXRCaWdnZXIocG9pbnQueSwgZlRvcCkpIHsKKyAgICAgICAgYlVwID0gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIocG9pbnQueSwgZkJvdHRvbSkpIHsKKyAgICAgICAgYkRvd24gPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihwb2ludC55LCBmVG9wKSkgeworICAgICAgICBuUmlnaHQgPSBuTWlkIC0gMTsKKyAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSBpZiAoSXNGbG9hdEJpZ2dlcihwb2ludC55LCBmQm90dG9tKSkgeworICAgICAgICBuTGVmdCA9IG5NaWQgKyAxOworICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGxhY2UgPSBTZWFyY2hXb3JkUGxhY2UoCisgICAgICAgICAgICBwb2ludC54LAorICAgICAgICAgICAgQ1BWVF9Xb3JkUmFuZ2UocExpbmUtPkdldE5leHRXb3JkUGxhY2UocExpbmUtPkdldEJlZ2luV29yZFBsYWNlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpKSk7CisgICAgICAgIHBsYWNlLm5MaW5lSW5kZXggPSBuTWlkOworICAgICAgICByZXR1cm4gcGxhY2U7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChiVXApIHsKKyAgICBwbGFjZSA9IEdldEJlZ2luV29yZFBsYWNlKCk7CisgIH0KKyAgaWYgKGJEb3duKSB7CisgICAgcGxhY2UgPSBHZXRFbmRXb3JkUGxhY2UoKTsKKyAgfQorICByZXR1cm4gcGxhY2U7Cit9CitDUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6U2VhcmNoV29yZFBsYWNlKAorICAgIEZYX0ZMT0FUIGZ4LAorICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBsaW5lcGxhY2UpIGNvbnN0IHsKKyAgaWYgKENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KGxpbmVwbGFjZS5uTGluZUluZGV4KSkgeworICAgIHJldHVybiBTZWFyY2hXb3JkUGxhY2UoCisgICAgICAgIGZ4IC0gbV9TZWNJbmZvLnJjU2VjdGlvbi5sZWZ0LAorICAgICAgICBDUFZUX1dvcmRSYW5nZShwTGluZS0+R2V0TmV4dFdvcmRQbGFjZShwTGluZS0+R2V0QmVnaW5Xb3JkUGxhY2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lLT5HZXRFbmRXb3JkUGxhY2UoKSkpOworICB9CisgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OlNlYXJjaFdvcmRQbGFjZShGWF9GTE9BVCBmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKSBjb25zdCB7CisgIENQVlRfV29yZFBsYWNlIHdvcmRwbGFjZSA9IHJhbmdlLkJlZ2luUG9zOworICB3b3JkcGxhY2UubldvcmRJbmRleCA9IC0xOworICBpZiAoIW1fcFZUKSB7CisgICAgcmV0dXJuIHdvcmRwbGFjZTsKKyAgfQorICBpbnQzMl90IG5MZWZ0ID0gcmFuZ2UuQmVnaW5Qb3MubldvcmRJbmRleDsKKyAgaW50MzJfdCBuUmlnaHQgPSByYW5nZS5FbmRQb3MubldvcmRJbmRleCArIDE7CisgIGludDMyX3Qgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOworICB3aGlsZSAobkxlZnQgPCBuUmlnaHQpIHsKKyAgICBpZiAobk1pZCA9PSBuTGVmdCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChuTWlkID09IG5SaWdodCkgeworICAgICAgbk1pZC0tOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChDUFZUX1dvcmRJbmZvKiBwV29yZCA9IG1fV29yZEFycmF5LkdldEF0KG5NaWQpKSB7CisgICAgICBpZiAoZnggPiBwV29yZC0+ZldvcmRYICsgbV9wVlQtPkdldFdvcmRXaWR0aCgqcFdvcmQpICogUFZUX0hBTEYpIHsKKyAgICAgICAgbkxlZnQgPSBuTWlkOworICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgblJpZ2h0ID0gbk1pZDsKKyAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChDUFZUX1dvcmRJbmZvKiBwV29yZCA9IG1fV29yZEFycmF5LkdldEF0KG5NaWQpKSB7CisgICAgaWYgKGZ4ID4gcFdvcmQtPmZXb3JkWCArIG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKSAqIFBWVF9IQUxGKSB7CisgICAgICB3b3JkcGxhY2UubldvcmRJbmRleCA9IG5NaWQ7CisgICAgfQorICB9CisgIHJldHVybiB3b3JkcGxhY2U7Cit9Cit2b2lkIENTZWN0aW9uOjpDbGVhckxlZnRXb3JkcyhpbnQzMl90IG5Xb3JkSW5kZXgpIHsKKyAgZm9yIChpbnQzMl90IGkgPSBuV29yZEluZGV4OyBpID49IDA7IGktLSkgeworICAgIGRlbGV0ZSBtX1dvcmRBcnJheS5HZXRBdChpKTsKKyAgICBtX1dvcmRBcnJheS5SZW1vdmVBdChpKTsKKyAgfQorfQordm9pZCBDU2VjdGlvbjo6Q2xlYXJSaWdodFdvcmRzKGludDMyX3QgbldvcmRJbmRleCkgeworICBmb3IgKGludDMyX3QgaSA9IG1fV29yZEFycmF5LkdldFNpemUoKSAtIDE7IGkgPiBuV29yZEluZGV4OyBpLS0pIHsKKyAgICBkZWxldGUgbV9Xb3JkQXJyYXkuR2V0QXQoaSk7CisgICAgbV9Xb3JkQXJyYXkuUmVtb3ZlQXQoaSk7CisgIH0KK30KK3ZvaWQgQ1NlY3Rpb246OkNsZWFyTWlkV29yZHMoaW50MzJfdCBuQmVnaW5JbmRleCwgaW50MzJfdCBuRW5kSW5kZXgpIHsKKyAgZm9yIChpbnQzMl90IGkgPSBuRW5kSW5kZXg7IGkgPiBuQmVnaW5JbmRleDsgaS0tKSB7CisgICAgZGVsZXRlIG1fV29yZEFycmF5LkdldEF0KGkpOworICAgIG1fV29yZEFycmF5LlJlbW92ZUF0KGkpOworICB9Cit9Cit2b2lkIENTZWN0aW9uOjpDbGVhcldvcmRzKGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKSB7CisgIENQVlRfV29yZFBsYWNlIFNlY0JlZ2luUG9zID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgU2VjRW5kUG9zID0gR2V0RW5kV29yZFBsYWNlKCk7CisgIGlmIChQbGFjZVJhbmdlLkJlZ2luUG9zLldvcmRDbXAoU2VjQmVnaW5Qb3MpID49IDApIHsKKyAgICBpZiAoUGxhY2VSYW5nZS5FbmRQb3MuV29yZENtcChTZWNFbmRQb3MpIDw9IDApIHsKKyAgICAgIENsZWFyTWlkV29yZHMoUGxhY2VSYW5nZS5CZWdpblBvcy5uV29yZEluZGV4LAorICAgICAgICAgICAgICAgICAgICBQbGFjZVJhbmdlLkVuZFBvcy5uV29yZEluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgQ2xlYXJSaWdodFdvcmRzKFBsYWNlUmFuZ2UuQmVnaW5Qb3MubldvcmRJbmRleCk7CisgICAgfQorICB9IGVsc2UgaWYgKFBsYWNlUmFuZ2UuRW5kUG9zLldvcmRDbXAoU2VjRW5kUG9zKSA8PSAwKSB7CisgICAgQ2xlYXJMZWZ0V29yZHMoUGxhY2VSYW5nZS5FbmRQb3MubldvcmRJbmRleCk7CisgIH0gZWxzZSB7CisgICAgUmVzZXRXb3JkQXJyYXkoKTsKKyAgfQorfQordm9pZCBDU2VjdGlvbjo6Q2xlYXJXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgeworICBkZWxldGUgbV9Xb3JkQXJyYXkuR2V0QXQocGxhY2UubldvcmRJbmRleCk7CisgIG1fV29yZEFycmF5LlJlbW92ZUF0KHBsYWNlLm5Xb3JkSW5kZXgpOworfQorQ1R5cGVzZXQ6OkNUeXBlc2V0KENTZWN0aW9uKiBwU2VjdGlvbikKKyAgICA6IG1fcmNSZXQoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiksCisgICAgICBtX3BWVChwU2VjdGlvbi0+bV9wVlQpLAorICAgICAgbV9wU2VjdGlvbihwU2VjdGlvbikge30KK0NUeXBlc2V0Ojp+Q1R5cGVzZXQoKSB7fQorQ1BWVF9GbG9hdFJlY3QgQ1R5cGVzZXQ6OkNoYXJBcnJheSgpIHsKKyAgQVNTRVJUKG1fcFNlY3Rpb24gIT0gTlVMTCk7CisgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKKyAgRlhfRkxPQVQgZkxpbmVBc2NlbnQgPQorICAgICAgbV9wVlQtPkdldEZvbnRBc2NlbnQobV9wVlQtPkdldERlZmF1bHRGb250SW5kZXgoKSwgbV9wVlQtPkdldEZvbnRTaXplKCkpOworICBGWF9GTE9BVCBmTGluZURlc2NlbnQgPQorICAgICAgbV9wVlQtPkdldEZvbnREZXNjZW50KG1fcFZULT5HZXREZWZhdWx0Rm9udEluZGV4KCksIG1fcFZULT5HZXRGb250U2l6ZSgpKTsKKyAgbV9yY1JldC5EZWZhdWx0KCk7CisgIEZYX0ZMT0FUIHggPSAwLjBmLCB5ID0gMC4wZjsKKyAgRlhfRkxPQVQgZk5leHRXaWR0aDsKKyAgaW50MzJfdCBuU3RhcnQgPSAwOworICBGWF9GTE9BVCBmTm9kZVdpZHRoID0gbV9wVlQtPkdldFBsYXRlV2lkdGgoKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAobV9wVlQtPm1fbkNoYXJBcnJheSA8PSAwID8gMSA6IG1fcFZULT5tX25DaGFyQXJyYXkpOworICBpZiAoQ0xpbmUqIHBMaW5lID0gbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQoMCkpIHsKKyAgICB4ID0gMC4wZjsKKyAgICB5ICs9IG1fcFZULT5HZXRMaW5lTGVhZGluZyhtX3BTZWN0aW9uLT5tX1NlY0luZm8pOworICAgIHkgKz0gZkxpbmVBc2NlbnQ7CisgICAgblN0YXJ0ID0gMDsKKyAgICBzd2l0Y2ggKG1fcFZULT5HZXRBbGlnbm1lbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSkgeworICAgICAgY2FzZSAwOgorICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggPSBmTm9kZVdpZHRoICogUFZUX0hBTEY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBuU3RhcnQgPSAobV9wVlQtPm1fbkNoYXJBcnJheSAtIG1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSkgLyAyOworICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggPSBmTm9kZVdpZHRoICogblN0YXJ0IC0gZk5vZGVXaWR0aCAqIFBWVF9IQUxGOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgblN0YXJ0ID0gbV9wVlQtPm1fbkNoYXJBcnJheSAtIG1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsKKyAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVYID0gZk5vZGVXaWR0aCAqIG5TdGFydCAtIGZOb2RlV2lkdGggKiBQVlRfSEFMRjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGZvciAoaW50MzJfdCB3ID0gMCwgc3ogPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7IHcgPCBzejsgdysrKSB7CisgICAgICBpZiAodyA+PSBtX3BWVC0+bV9uQ2hhckFycmF5KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZk5leHRXaWR0aCA9IDA7CisgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcE5leHRXb3JkID0KKyAgICAgICAgICAgICAgKENQVlRfV29yZEluZm8qKW1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHcgKyAxKSkgeworICAgICAgICBwTmV4dFdvcmQtPmZXb3JkVGFpbCA9IDA7CisgICAgICAgIGZOZXh0V2lkdGggPSBtX3BWVC0+R2V0V29yZFdpZHRoKCpwTmV4dFdvcmQpOworICAgICAgfQorICAgICAgaWYgKENQVlRfV29yZEluZm8qIHBXb3JkID0KKyAgICAgICAgICAgICAgKENQVlRfV29yZEluZm8qKW1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHcpKSB7CisgICAgICAgIHBXb3JkLT5mV29yZFRhaWwgPSAwOworICAgICAgICBGWF9GTE9BVCBmV29yZFdpZHRoID0gbV9wVlQtPkdldFdvcmRXaWR0aCgqcFdvcmQpOworICAgICAgICBGWF9GTE9BVCBmV29yZEFzY2VudCA9IG1fcFZULT5HZXRXb3JkQXNjZW50KCpwV29yZCk7CisgICAgICAgIEZYX0ZMT0FUIGZXb3JkRGVzY2VudCA9IG1fcFZULT5HZXRXb3JkRGVzY2VudCgqcFdvcmQpOworICAgICAgICB4ID0gKEZYX0ZMT0FUKShmTm9kZVdpZHRoICogKHcgKyBuU3RhcnQgKyAwLjUpIC0gZldvcmRXaWR0aCAqIFBWVF9IQUxGKTsKKyAgICAgICAgcFdvcmQtPmZXb3JkWCA9IHg7CisgICAgICAgIHBXb3JkLT5mV29yZFkgPSB5OworICAgICAgICBpZiAodyA9PSAwKSB7CisgICAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVYID0geDsKKyAgICAgICAgfQorICAgICAgICBpZiAodyAhPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCkgLSAxKQorICAgICAgICAgIHBXb3JkLT5mV29yZFRhaWwgPQorICAgICAgICAgICAgICAoZk5vZGVXaWR0aCAtIChmV29yZFdpZHRoICsgZk5leHRXaWR0aCkgKiBQVlRfSEFMRiA+IDAKKyAgICAgICAgICAgICAgICAgICA/IGZOb2RlV2lkdGggLSAoZldvcmRXaWR0aCArIGZOZXh0V2lkdGgpICogUFZUX0hBTEYKKyAgICAgICAgICAgICAgICAgICA6IDApOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBwV29yZC0+ZldvcmRUYWlsID0gMDsKKyAgICAgICAgfQorICAgICAgICB4ICs9IGZXb3JkV2lkdGg7CisgICAgICAgIGZMaW5lQXNjZW50ID0gRlBERl9NQVgoZkxpbmVBc2NlbnQsIGZXb3JkQXNjZW50KTsKKyAgICAgICAgZkxpbmVEZXNjZW50ID0gRlBERl9NSU4oZkxpbmVEZXNjZW50LCBmV29yZERlc2NlbnQpOworICAgICAgfQorICAgIH0KKyAgICBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXggPSAwOworICAgIHBMaW5lLT5tX0xpbmVJbmZvLm5FbmRXb3JkSW5kZXggPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCkgLSAxOworICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSA9IHk7CisgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVXaWR0aCA9IHggLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVg7CisgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVBc2NlbnQgPSBmTGluZUFzY2VudDsKKyAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZURlc2NlbnQgPSBmTGluZURlc2NlbnQ7CisgICAgeSArPSAoLWZMaW5lRGVzY2VudCk7CisgIH0KKyAgcmV0dXJuIG1fcmNSZXQgPSBDUFZUX0Zsb2F0UmVjdCgwLCAwLCB4LCB5KTsKK30KK0NQVlRfU2l6ZSBDVHlwZXNldDo6R2V0RWRpdFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOworICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CisgIFNwbGl0TGluZXMoRkFMU0UsIGZGb250U2l6ZSk7CisgIHJldHVybiBDUFZUX1NpemUobV9yY1JldC5XaWR0aCgpLCBtX3JjUmV0LkhlaWdodCgpKTsKK30KK0NQVlRfRmxvYXRSZWN0IENUeXBlc2V0OjpUeXBlc2V0KCkgeworICBBU1NFUlQobV9wU2VjdGlvbiAhPSBOVUxMKTsKKyAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOworICBtX3BTZWN0aW9uLT5tX0xpbmVBcnJheS5FbXB0eSgpOworICBTcGxpdExpbmVzKFRSVUUsIDAuMGYpOworICBtX3BTZWN0aW9uLT5tX0xpbmVBcnJheS5DbGVhcigpOworICBPdXRwdXRMaW5lcygpOworICByZXR1cm4gbV9yY1JldDsKIH0KIHN0YXRpYyBpbnQgc3BlY2lhbF9jaGFyc1sxMjhdID0gewotICAgIDB4MDAwMCwgMHgwMDBDLCAweDAwMDgsIDB4MDAwQywgMHgwMDA4LCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDA4LCAweDAwMDgsIDB4MDAwMCwgMHgwMDEwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDI4LAotICAgIDB4MDAwQywgMHgwMDA4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDI4LCAweDAwMjgsIDB4MDAyOCwgMHgwMDI4LAotICAgIDB4MDAwMiwgMHgwMDAyLCAweDAwMDIsIDB4MDAwMiwgMHgwMDAyLCAweDAwMDIsIDB4MDAwMiwgMHgwMDAyLAotICAgIDB4MDAwMiwgMHgwMDAyLCAweDAwMDgsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDA4LAotICAgIDB4MDAwMCwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLAotICAgIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLAotICAgIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLAotICAgIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwQywgMHgwMDAwLCAweDAwMDgsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLAotICAgIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLAotICAgIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLAotICAgIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwQywgMHgwMDAwLCAweDAwMDgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDBDLCAweDAwMDgsIDB4MDAwQywgMHgwMDA4LCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwOCwgMHgwMDA4LCAweDAwMDAsCisgICAgMHgwMDEwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDI4LCAweDAwMEMsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAyOCwKKyAgICAweDAwMjgsIDB4MDAyOCwgMHgwMDI4LCAweDAwMDIsIDB4MDAwMiwgMHgwMDAyLCAweDAwMDIsIDB4MDAwMiwgMHgwMDAyLAorICAgIDB4MDAwMiwgMHgwMDAyLCAweDAwMDIsIDB4MDAwMiwgMHgwMDA4LCAweDAwMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDA4LCAweDAwMDAsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwKKyAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLAorICAgIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsCisgICAgMHgwMDAxLCAweDAwMEMsIDB4MDAwMCwgMHgwMDA4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMSwKKyAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLAorICAgIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsCisgICAgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDBDLCAweDAwMDAsIDB4MDAwOCwKKyAgICAweDAwMDAsIDB4MDAwMCwKIH07Ci1zdGF0aWMgRlhfQk9PTCBJc0xhdGluKEZYX1dPUkQgd29yZCkKLXsKLSAgICBpZiAod29yZCA8PSAweDAwN0YpIHsKLSAgICAgICAgaWYgKHNwZWNpYWxfY2hhcnNbd29yZF0gJiAweDAwMDEpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9CitzdGF0aWMgRlhfQk9PTCBJc0xhdGluKEZYX1dPUkQgd29yZCkgeworICBpZiAod29yZCA8PSAweDAwN0YpIHsKKyAgICBpZiAoc3BlY2lhbF9jaGFyc1t3b3JkXSAmIDB4MDAwMSkgeworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIGlmICgod29yZCA+PSAweDAwQzAgJiYgd29yZCA8PSAweDAwRkYpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweDAxMDAgJiYgd29yZCA8PSAweDAyNEYpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweDFFMDAgJiYgd29yZCA8PSAweDFFRkYpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweDJDNjAgJiYgd29yZCA8PSAweDJDN0YpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweEE3MjAgJiYgd29yZCA8PSAweEE3RkYpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweEZGMjEgJiYgd29yZCA8PSAweEZGM0EpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweEZGNDEgJiYgd29yZCA8PSAweEZGNUEpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICgod29yZCA+PSAweDAwQzAgJiYgd29yZCA8PSAweDAwRkYpIHx8CisgICAgICAod29yZCA+PSAweDAxMDAgJiYgd29yZCA8PSAweDAyNEYpIHx8CisgICAgICAod29yZCA+PSAweDFFMDAgJiYgd29yZCA8PSAweDFFRkYpIHx8CisgICAgICAod29yZCA+PSAweDJDNjAgJiYgd29yZCA8PSAweDJDN0YpIHx8CisgICAgICAod29yZCA+PSAweEE3MjAgJiYgd29yZCA8PSAweEE3RkYpIHx8CisgICAgICAod29yZCA+PSAweEZGMjEgJiYgd29yZCA8PSAweEZGM0EpIHx8CisgICAgICAod29yZCA+PSAweEZGNDEgJiYgd29yZCA8PSAweEZGNUEpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorc3RhdGljIEZYX0JPT0wgSXNEaWdpdChGWF9EV09SRCB3b3JkKSB7CisgIHJldHVybiAod29yZCA+PSAweDAwMzAgJiYgd29yZCA8PSAweDAwMzkpID8gVFJVRSA6IEZBTFNFOworfQorc3RhdGljIEZYX0JPT0wgSXNDSksoRlhfRFdPUkQgd29yZCkgeworICBpZiAoKHdvcmQgPj0gMHgxMTAwICYmIHdvcmQgPD0gMHgxMUZGKSB8fAorICAgICAgKHdvcmQgPj0gMHgyRTgwICYmIHdvcmQgPD0gMHgyRkZGKSB8fAorICAgICAgKHdvcmQgPj0gMHgzMDQwICYmIHdvcmQgPD0gMHg5RkJGKSB8fAorICAgICAgKHdvcmQgPj0gMHhBQzAwICYmIHdvcmQgPD0gMHhEN0FGKSB8fAorICAgICAgKHdvcmQgPj0gMHhGOTAwICYmIHdvcmQgPD0gMHhGQUZGKSB8fAorICAgICAgKHdvcmQgPj0gMHhGRTMwICYmIHdvcmQgPD0gMHhGRTRGKSB8fAorICAgICAgKHdvcmQgPj0gMHgyMDAwMCAmJiB3b3JkIDw9IDB4MkE2REYpIHx8CisgICAgICAod29yZCA+PSAweDJGODAwICYmIHdvcmQgPD0gMHgyRkExRikpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAod29yZCA+PSAweDMwMDAgJiYgd29yZCA8PSAweDMwM0YpIHsKKyAgICBpZiAod29yZCA9PSAweDMwMDUgfHwgd29yZCA9PSAweDMwMDYgfHwgd29yZCA9PSAweDMwMjEgfHwgd29yZCA9PSAweDMwMjIgfHwKKyAgICAgICAgd29yZCA9PSAweDMwMjMgfHwgd29yZCA9PSAweDMwMjQgfHwgd29yZCA9PSAweDMwMjUgfHwgd29yZCA9PSAweDMwMjYgfHwKKyAgICAgICAgd29yZCA9PSAweDMwMjcgfHwgd29yZCA9PSAweDMwMjggfHwgd29yZCA9PSAweDMwMjkgfHwgd29yZCA9PSAweDMwMzEgfHwKKyAgICAgICAgd29yZCA9PSAweDMwMzIgfHwgd29yZCA9PSAweDMwMzMgfHwgd29yZCA9PSAweDMwMzQgfHwgd29yZCA9PSAweDMwMzUpIHsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHdvcmQgPj0gMHhGRjY2ICYmIHdvcmQgPD0gMHhGRjlEKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotc3RhdGljIEZYX0JPT0wgSXNEaWdpdChGWF9EV09SRCB3b3JkKQotewotICAgIHJldHVybiAod29yZCA+PSAweDAwMzAgJiYgd29yZCA8PSAweDAwMzkpID8gVFJVRSA6IEZBTFNFOworc3RhdGljIEZYX0JPT0wgSXNQdW5jdHVhdGlvbihGWF9EV09SRCB3b3JkKSB7CisgIGlmICh3b3JkIDw9IDB4MDA3RikgeworICAgIGlmICgoc3BlY2lhbF9jaGFyc1t3b3JkXSA+PiAzKSAmIDEpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfSBlbHNlIGlmICh3b3JkID49IDB4MDA4MCAmJiB3b3JkIDw9IDB4MDBGRikgeworICAgIGlmICh3b3JkID09IDB4MDA4MiB8fCB3b3JkID09IDB4MDA4NCB8fCB3b3JkID09IDB4MDA4NSB8fCB3b3JkID09IDB4MDA5MSB8fAorICAgICAgICB3b3JkID09IDB4MDA5MiB8fCB3b3JkID09IDB4MDA5MyB8fCB3b3JkIDw9IDB4MDA5NCB8fCB3b3JkID09IDB4MDA5NiB8fAorICAgICAgICB3b3JkID09IDB4MDBCNCB8fCB3b3JkID09IDB4MDBCOCkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9IGVsc2UgaWYgKHdvcmQgPj0gMHgyMDAwICYmIHdvcmQgPD0gMHgyMDZGKSB7CisgICAgaWYgKHdvcmQgPT0gMHgyMDEwIHx8IHdvcmQgPT0gMHgyMDExIHx8IHdvcmQgPT0gMHgyMDEyIHx8IHdvcmQgPT0gMHgyMDEzIHx8CisgICAgICAgIHdvcmQgPT0gMHgyMDE4IHx8IHdvcmQgPT0gMHgyMDE5IHx8IHdvcmQgPT0gMHgyMDFBIHx8IHdvcmQgPT0gMHgyMDFCIHx8CisgICAgICAgIHdvcmQgPT0gMHgyMDFDIHx8IHdvcmQgPT0gMHgyMDFEIHx8IHdvcmQgPT0gMHgyMDFFIHx8IHdvcmQgPT0gMHgyMDFGIHx8CisgICAgICAgIHdvcmQgPT0gMHgyMDMyIHx8IHdvcmQgPT0gMHgyMDMzIHx8IHdvcmQgPT0gMHgyMDM0IHx8IHdvcmQgPT0gMHgyMDM1IHx8CisgICAgICAgIHdvcmQgPT0gMHgyMDM2IHx8IHdvcmQgPT0gMHgyMDM3IHx8IHdvcmQgPT0gMHgyMDNDIHx8IHdvcmQgPT0gMHgyMDNEIHx8CisgICAgICAgIHdvcmQgPT0gMHgyMDNFIHx8IHdvcmQgPT0gMHgyMDQ0KSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0gZWxzZSBpZiAod29yZCA+PSAweDMwMDAgJiYgd29yZCA8PSAweDMwM0YpIHsKKyAgICBpZiAod29yZCA9PSAweDMwMDEgfHwgd29yZCA9PSAweDMwMDIgfHwgd29yZCA9PSAweDMwMDMgfHwgd29yZCA9PSAweDMwMDUgfHwKKyAgICAgICAgd29yZCA9PSAweDMwMDkgfHwgd29yZCA9PSAweDMwMEEgfHwgd29yZCA9PSAweDMwMEIgfHwgd29yZCA9PSAweDMwMEMgfHwKKyAgICAgICAgd29yZCA9PSAweDMwMEQgfHwgd29yZCA9PSAweDMwMEYgfHwgd29yZCA9PSAweDMwMEUgfHwgd29yZCA9PSAweDMwMTAgfHwKKyAgICAgICAgd29yZCA9PSAweDMwMTEgfHwgd29yZCA9PSAweDMwMTQgfHwgd29yZCA9PSAweDMwMTUgfHwgd29yZCA9PSAweDMwMTYgfHwKKyAgICAgICAgd29yZCA9PSAweDMwMTcgfHwgd29yZCA9PSAweDMwMTggfHwgd29yZCA9PSAweDMwMTkgfHwgd29yZCA9PSAweDMwMUEgfHwKKyAgICAgICAgd29yZCA9PSAweDMwMUIgfHwgd29yZCA9PSAweDMwMUQgfHwgd29yZCA9PSAweDMwMUUgfHwgd29yZCA9PSAweDMwMUYpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfSBlbHNlIGlmICh3b3JkID49IDB4RkU1MCAmJiB3b3JkIDw9IDB4RkU2RikgeworICAgIGlmICgod29yZCA+PSAweEZFNTAgJiYgd29yZCA8PSAweEZFNUUpIHx8IHdvcmQgPT0gMHhGRTYzKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0gZWxzZSBpZiAod29yZCA+PSAweEZGMDAgJiYgd29yZCA8PSAweEZGRUYpIHsKKyAgICBpZiAod29yZCA9PSAweEZGMDEgfHwgd29yZCA9PSAweEZGMDIgfHwgd29yZCA9PSAweEZGMDcgfHwgd29yZCA9PSAweEZGMDggfHwKKyAgICAgICAgd29yZCA9PSAweEZGMDkgfHwgd29yZCA9PSAweEZGMEMgfHwgd29yZCA9PSAweEZGMEUgfHwgd29yZCA9PSAweEZGMEYgfHwKKyAgICAgICAgd29yZCA9PSAweEZGMUEgfHwgd29yZCA9PSAweEZGMUIgfHwgd29yZCA9PSAweEZGMUYgfHwgd29yZCA9PSAweEZGM0IgfHwKKyAgICAgICAgd29yZCA9PSAweEZGM0QgfHwgd29yZCA9PSAweEZGNDAgfHwgd29yZCA9PSAweEZGNUIgfHwgd29yZCA9PSAweEZGNUMgfHwKKyAgICAgICAgd29yZCA9PSAweEZGNUQgfHwgd29yZCA9PSAweEZGNjEgfHwgd29yZCA9PSAweEZGNjIgfHwgd29yZCA9PSAweEZGNjMgfHwKKyAgICAgICAgd29yZCA9PSAweEZGNjQgfHwgd29yZCA9PSAweEZGNjUgfHwgd29yZCA9PSAweEZGOUUgfHwgd29yZCA9PSAweEZGOUYpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1zdGF0aWMgRlhfQk9PTCBJc0NKSyhGWF9EV09SRCB3b3JkKQotewotICAgIGlmICgod29yZCA+PSAweDExMDAgJiYgd29yZCA8PSAweDExRkYpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweDJFODAgJiYgd29yZCA8PSAweDJGRkYpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweDMwNDAgJiYgd29yZCA8PSAweDlGQkYpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweEFDMDAgJiYgd29yZCA8PSAweEQ3QUYpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweEY5MDAgJiYgd29yZCA8PSAweEZBRkYpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweEZFMzAgJiYgd29yZCA8PSAweEZFNEYpIHx8Ci0gICAgICAgICAgICAod29yZCA+PSAweDIwMDAwICYmIHdvcmQgPD0gMHgyQTZERikgfHwKLSAgICAgICAgICAgICh3b3JkID49IDB4MkY4MDAgJiYgd29yZCA8PSAweDJGQTFGKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKK3N0YXRpYyBGWF9CT09MIElzQ29ubmVjdGl2ZVN5bWJvbChGWF9EV09SRCB3b3JkKSB7CisgIGlmICh3b3JkIDw9IDB4MDA3RikgeworICAgIGlmICgoc3BlY2lhbF9jaGFyc1t3b3JkXSA+PiA1KSAmIDEpIHsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBpZiAod29yZCA+PSAweDMwMDAgJiYgd29yZCA8PSAweDMwM0YpIHsKLSAgICAgICAgaWYgKHdvcmQgPT0gMHgzMDA1IHx8IHdvcmQgPT0gMHgzMDA2IHx8IHdvcmQgPT0gMHgzMDIxIHx8IHdvcmQgPT0gMHgzMDIyIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweDMwMjMgfHwgd29yZCA9PSAweDMwMjQgfHwgd29yZCA9PSAweDMwMjUgfHwgd29yZCA9PSAweDMwMjYgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAyNyB8fCB3b3JkID09IDB4MzAyOCB8fCB3b3JkID09IDB4MzAyOSB8fCB3b3JkID09IDB4MzAzMSB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDMyIHx8IHdvcmQgPT0gMHgzMDMzIHx8IHdvcmQgPT0gMHgzMDM0IHx8IHdvcmQgPT0gMHgzMDM1KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorc3RhdGljIEZYX0JPT0wgSXNPcGVuU3R5bGVQdW5jdHVhdGlvbihGWF9EV09SRCB3b3JkKSB7CisgIGlmICh3b3JkIDw9IDB4MDA3RikgeworICAgIGlmICgoc3BlY2lhbF9jaGFyc1t3b3JkXSA+PiAyKSAmIDEpIHsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBpZiAod29yZCA+PSAweEZGNjYgJiYgd29yZCA8PSAweEZGOUQpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQorICB9IGVsc2UgaWYgKHdvcmQgPT0gMHgzMDBBIHx8IHdvcmQgPT0gMHgzMDBDIHx8IHdvcmQgPT0gMHgzMDBFIHx8CisgICAgICAgICAgICAgd29yZCA9PSAweDMwMTAgfHwgd29yZCA9PSAweDMwMTQgfHwgd29yZCA9PSAweDMwMTYgfHwKKyAgICAgICAgICAgICB3b3JkID09IDB4MzAxOCB8fCB3b3JkID09IDB4MzAxQSB8fCB3b3JkID09IDB4RkYwOCB8fAorICAgICAgICAgICAgIHdvcmQgPT0gMHhGRjNCIHx8IHdvcmQgPT0gMHhGRjVCIHx8IHdvcmQgPT0gMHhGRjYyKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorc3RhdGljIEZYX0JPT0wgSXNDdXJyZW5jeVN5bWJvbChGWF9XT1JEIHdvcmQpIHsKKyAgaWYgKHdvcmQgPT0gMHgwMDI0IHx8IHdvcmQgPT0gMHgwMDgwIHx8IHdvcmQgPT0gMHgwMEEyIHx8IHdvcmQgPT0gMHgwMEEzIHx8CisgICAgICB3b3JkID09IDB4MDBBNCB8fCB3b3JkID09IDB4MDBBNSB8fCAod29yZCA+PSAweDIwQTAgJiYgd29yZCA8PSAweDIwQ0YpIHx8CisgICAgICB3b3JkID09IDB4RkU2OSB8fCB3b3JkID09IDB4RkYwNCB8fCB3b3JkID09IDB4RkZFMCB8fCB3b3JkID09IDB4RkZFMSB8fAorICAgICAgd29yZCA9PSAweEZGRTUgfHwgd29yZCA9PSAweEZGRTYpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitzdGF0aWMgRlhfQk9PTCBJc1ByZWZpeFN5bWJvbChGWF9XT1JEIHdvcmQpIHsKKyAgaWYgKElzQ3VycmVuY3lTeW1ib2wod29yZCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAod29yZCA9PSAweDIxMTYpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitzdGF0aWMgRlhfQk9PTCBJc1NwYWNlKEZYX1dPUkQgd29yZCkgeworICByZXR1cm4gKHdvcmQgPT0gMHgwMDIwIHx8IHdvcmQgPT0gMHgzMDAwKSA/IFRSVUUgOiBGQUxTRTsKK30KK3N0YXRpYyBGWF9CT09MIE5lZWREaXZpc2lvbihGWF9XT1JEIHByZXZXb3JkLCBGWF9XT1JEIGN1cldvcmQpIHsKKyAgaWYgKChJc0xhdGluKHByZXZXb3JkKSB8fCBJc0RpZ2l0KHByZXZXb3JkKSkgJiYKKyAgICAgIChJc0xhdGluKGN1cldvcmQpIHx8IElzRGlnaXQoY3VyV29yZCkpKSB7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotc3RhdGljIEZYX0JPT0wgSXNQdW5jdHVhdGlvbihGWF9EV09SRCB3b3JkKQotewotICAgIGlmICh3b3JkIDw9IDB4MDA3RikgewotICAgICAgICBpZiAoKHNwZWNpYWxfY2hhcnNbd29yZF0gPj4gMykgJiAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA+PSAweDAwODAgJiYgd29yZCA8PSAweDAwRkYpIHsKLSAgICAgICAgaWYgKHdvcmQgPT0gMHgwMDgyIHx8IHdvcmQgPT0gMHgwMDg0IHx8IHdvcmQgPT0gMHgwMDg1IHx8IHdvcmQgPT0gMHgwMDkxIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweDAwOTIgfHwgd29yZCA9PSAweDAwOTMgfHwgd29yZCA8PSAweDAwOTQgfHwgd29yZCA9PSAweDAwOTYgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4MDBCNCB8fCB3b3JkID09IDB4MDBCOCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPj0gMHgyMDAwICYmIHdvcmQgPD0gMHgyMDZGKSB7Ci0gICAgICAgIGlmICh3b3JkID09IDB4MjAxMCB8fCB3b3JkID09IDB4MjAxMSB8fCB3b3JkID09IDB4MjAxMiB8fCB3b3JkID09IDB4MjAxMyB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgyMDE4IHx8IHdvcmQgPT0gMHgyMDE5IHx8IHdvcmQgPT0gMHgyMDFBIHx8IHdvcmQgPT0gMHgyMDFCIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweDIwMUMgfHwgd29yZCA9PSAweDIwMUQgfHwgd29yZCA9PSAweDIwMUUgfHwgd29yZCA9PSAweDIwMUYgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4MjAzMiB8fCB3b3JkID09IDB4MjAzMyB8fCB3b3JkID09IDB4MjAzNCB8fCB3b3JkID09IDB4MjAzNSB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgyMDM2IHx8IHdvcmQgPT0gMHgyMDM3IHx8IHdvcmQgPT0gMHgyMDNDIHx8IHdvcmQgPT0gMHgyMDNEIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweDIwM0UgfHwgd29yZCA9PSAweDIwNDQpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID49IDB4MzAwMCAmJiB3b3JkIDw9IDB4MzAzRikgewotICAgICAgICBpZiAod29yZCA9PSAweDMwMDEgfHwgd29yZCA9PSAweDMwMDIgfHwgd29yZCA9PSAweDMwMDMgfHwgd29yZCA9PSAweDMwMDUgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAwOSB8fCB3b3JkID09IDB4MzAwQSB8fCB3b3JkID09IDB4MzAwQiB8fCB3b3JkID09IDB4MzAwQyB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDBEIHx8IHdvcmQgPT0gMHgzMDBGIHx8IHdvcmQgPT0gMHgzMDBFIHx8IHdvcmQgPT0gMHgzMDEwIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweDMwMTEgfHwgd29yZCA9PSAweDMwMTQgfHwgd29yZCA9PSAweDMwMTUgfHwgd29yZCA9PSAweDMwMTYgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAxNyB8fCB3b3JkID09IDB4MzAxOCB8fCB3b3JkID09IDB4MzAxOSB8fCB3b3JkID09IDB4MzAxQSB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDFCIHx8IHdvcmQgPT0gMHgzMDFEIHx8IHdvcmQgPT0gMHgzMDFFIHx8IHdvcmQgPT0gMHgzMDFGKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA+PSAweEZFNTAgJiYgd29yZCA8PSAweEZFNkYpIHsKLSAgICAgICAgaWYgKCh3b3JkID49IDB4RkU1MCAmJiB3b3JkIDw9IDB4RkU1RSkgfHwgd29yZCA9PSAweEZFNjMpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID49IDB4RkYwMCAmJiB3b3JkIDw9IDB4RkZFRikgewotICAgICAgICBpZiAod29yZCA9PSAweEZGMDEgfHwgd29yZCA9PSAweEZGMDIgfHwgd29yZCA9PSAweEZGMDcgfHwgd29yZCA9PSAweEZGMDggfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4RkYwOSB8fCB3b3JkID09IDB4RkYwQyB8fCB3b3JkID09IDB4RkYwRSB8fCB3b3JkID09IDB4RkYwRiB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHhGRjFBIHx8IHdvcmQgPT0gMHhGRjFCIHx8IHdvcmQgPT0gMHhGRjFGIHx8IHdvcmQgPT0gMHhGRjNCIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweEZGM0QgfHwgd29yZCA9PSAweEZGNDAgfHwgd29yZCA9PSAweEZGNUIgfHwgd29yZCA9PSAweEZGNUMgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4RkY1RCB8fCB3b3JkID09IDB4RkY2MSB8fCB3b3JkID09IDB4RkY2MiB8fCB3b3JkID09IDB4RkY2MyB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHhGRjY0IHx8IHdvcmQgPT0gMHhGRjY1IHx8IHdvcmQgPT0gMHhGRjlFIHx8IHdvcmQgPT0gMHhGRjlGKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KKyAgfQorICBpZiAoSXNTcGFjZShjdXJXb3JkKSB8fCBJc1B1bmN0dWF0aW9uKGN1cldvcmQpKSB7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotc3RhdGljIEZYX0JPT0wgSXNDb25uZWN0aXZlU3ltYm9sKEZYX0RXT1JEIHdvcmQpCi17Ci0gICAgaWYgKHdvcmQgPD0gMHgwMDdGKSB7Ci0gICAgICAgIGlmICgoc3BlY2lhbF9jaGFyc1t3b3JkXSA+PiA1KSAmIDEpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQorICB9CisgIGlmIChJc0Nvbm5lY3RpdmVTeW1ib2wocHJldldvcmQpIHx8IElzQ29ubmVjdGl2ZVN5bWJvbChjdXJXb3JkKSkgewogICAgIHJldHVybiBGQUxTRTsKLX0KLXN0YXRpYyBGWF9CT09MIElzT3BlblN0eWxlUHVuY3R1YXRpb24oRlhfRFdPUkQgd29yZCkKLXsKLSAgICBpZiAod29yZCA8PSAweDAwN0YpIHsKLSAgICAgICAgaWYgKChzcGVjaWFsX2NoYXJzW3dvcmRdID4+IDIpICYgMSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gMHgzMDBBIHx8IHdvcmQgPT0gMHgzMDBDIHx8IHdvcmQgPT0gMHgzMDBFIHx8IHdvcmQgPT0gMHgzMDEwIHx8Ci0gICAgICAgICAgICAgICB3b3JkID09IDB4MzAxNCB8fCB3b3JkID09IDB4MzAxNiB8fCB3b3JkID09IDB4MzAxOCB8fCB3b3JkID09IDB4MzAxQSB8fAotICAgICAgICAgICAgICAgd29yZCA9PSAweEZGMDggfHwgd29yZCA9PSAweEZGM0IgfHwgd29yZCA9PSAweEZGNUIgfHwgd29yZCA9PSAweEZGNjIpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQorICB9CisgIGlmIChJc1NwYWNlKHByZXZXb3JkKSB8fCBJc1B1bmN0dWF0aW9uKHByZXZXb3JkKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChJc1ByZWZpeFN5bWJvbChwcmV2V29yZCkpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKElzUHJlZml4U3ltYm9sKGN1cldvcmQpIHx8IElzQ0pLKGN1cldvcmQpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKElzQ0pLKHByZXZXb3JkKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLXN0YXRpYyBGWF9CT09MIElzQ3VycmVuY3lTeW1ib2woRlhfV09SRCB3b3JkKQotewotICAgIGlmICh3b3JkID09IDB4MDAyNCB8fCB3b3JkID09IDB4MDA4MCB8fCB3b3JkID09IDB4MDBBMiB8fCB3b3JkID09IDB4MDBBMyB8fAotICAgICAgICAgICAgd29yZCA9PSAweDAwQTQgfHwgd29yZCA9PSAweDAwQTUgfHwgKHdvcmQgPj0gMHgyMEEwICYmIHdvcmQgPD0gMHgyMENGKSB8fAotICAgICAgICAgICAgd29yZCA9PSAweEZFNjkgfHwgd29yZCA9PSAweEZGMDQgfHwgd29yZCA9PSAweEZGRTAgfHwgd29yZCA9PSAweEZGRTEgfHwKLSAgICAgICAgICAgIHdvcmQgPT0gMHhGRkU1IHx8IHdvcmQgPT0gMHhGRkU2KSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1zdGF0aWMgRlhfQk9PTCBJc1ByZWZpeFN5bWJvbChGWF9XT1JEIHdvcmQpCi17Ci0gICAgaWYgKElzQ3VycmVuY3lTeW1ib2wod29yZCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmICh3b3JkID09IDB4MjExNikgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotc3RhdGljIEZYX0JPT0wgSXNTcGFjZShGWF9XT1JEIHdvcmQpCi17Ci0gICAgcmV0dXJuICh3b3JkID09IDB4MDAyMCB8fCB3b3JkID09IDB4MzAwMCkgPyBUUlVFIDogRkFMU0U7Ci19Ci1zdGF0aWMgRlhfQk9PTCBOZWVkRGl2aXNpb24oRlhfV09SRCBwcmV2V29yZCwgRlhfV09SRCBjdXJXb3JkKQotewotICAgIGlmICgoSXNMYXRpbihwcmV2V29yZCkgfHwgSXNEaWdpdChwcmV2V29yZCkpICYmIChJc0xhdGluKGN1cldvcmQpIHx8IElzRGlnaXQoY3VyV29yZCkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKElzU3BhY2UoY3VyV29yZCkgfHwgSXNQdW5jdHVhdGlvbihjdXJXb3JkKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChJc0Nvbm5lY3RpdmVTeW1ib2wocHJldldvcmQpIHx8IElzQ29ubmVjdGl2ZVN5bWJvbChjdXJXb3JkKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChJc1NwYWNlKHByZXZXb3JkKSB8fCBJc1B1bmN0dWF0aW9uKHByZXZXb3JkKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKElzUHJlZml4U3ltYm9sKHByZXZXb3JkKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChJc1ByZWZpeFN5bWJvbChjdXJXb3JkKSB8fCBJc0NKSyhjdXJXb3JkKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKElzQ0pLKHByZXZXb3JkKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotdm9pZCBDVHlwZXNldDo6U3BsaXRMaW5lcyhGWF9CT09MIGJUeXBlc2V0LCBGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0gICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwotICAgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOwotICAgIGludDMyX3QgbkxpbmVIZWFkID0gMDsKLSAgICBpbnQzMl90IG5MaW5lVGFpbCA9IDA7Ci0gICAgRlhfRkxPQVQgZk1heFggPSAwLjBmLCBmTWF4WSA9IDAuMGY7Ci0gICAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDAuMGYsIGZCYWNrdXBMaW5lV2lkdGggPSAwLjBmOwotICAgIEZYX0ZMT0FUIGZMaW5lQXNjZW50ID0gMC4wZiwgZkJhY2t1cExpbmVBc2NlbnQgPSAwLjBmOwotICAgIEZYX0ZMT0FUIGZMaW5lRGVzY2VudCA9IDAuMGYsIGZCYWNrdXBMaW5lRGVzY2VudCA9IDAuMGY7Ci0gICAgaW50MzJfdCBuV29yZFN0YXJ0UG9zID0gMDsKLSAgICBGWF9CT09MIGJGdWxsV29yZCA9IEZBTFNFOwotICAgIGludDMyX3QgbkxpbmVGdWxsV29yZEluZGV4ID0gMDsKLSAgICBpbnQzMl90IG5DaGFySW5kZXggPSAwOwotICAgIENQVlRfTGluZUluZm8gbGluZTsKLSAgICBGWF9GTE9BVCBmV29yZFdpZHRoID0gMDsKLSAgICBGWF9GTE9BVCBmVHlwZXNldFdpZHRoID0gRlBERl9NQVgobV9wVlQtPkdldFBsYXRlV2lkdGgoKSAtIG1fcFZULT5HZXRMaW5lSW5kZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbyksIDAuMGYpOwotICAgIGludDMyX3QgblRvdGFsV29yZHMgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7Ci0gICAgRlhfQk9PTCBiT3BlbmVkID0gRkFMU0U7Ci0gICAgaWYgKG5Ub3RhbFdvcmRzID4gMCkgewotICAgICAgICBpbnQzMl90IGkgPSAwOwotICAgICAgICB3aGlsZSAoaSA8IG5Ub3RhbFdvcmRzKSB7Ci0gICAgICAgICAgICBDUFZUX1dvcmRJbmZvICogcFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChpKTsKLSAgICAgICAgICAgIENQVlRfV29yZEluZm8qIHBPbGRXb3JkID0gcFdvcmQ7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBwT2xkV29yZCA9IG1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KGkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwV29yZCkgewotICAgICAgICAgICAgICAgIGlmIChiVHlwZXNldCkgewotICAgICAgICAgICAgICAgICAgICBmTGluZUFzY2VudCA9IEZQREZfTUFYKGZMaW5lQXNjZW50LCBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQsIFRSVUUpKTsKLSAgICAgICAgICAgICAgICAgICAgZkxpbmVEZXNjZW50ID0gRlBERl9NSU4oZkxpbmVEZXNjZW50LCBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkLCBUUlVFKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZXb3JkV2lkdGggPSBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZkxpbmVBc2NlbnQgPSBGUERGX01BWChmTGluZUFzY2VudCwgbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkLCBmRm9udFNpemUpKTsKLSAgICAgICAgICAgICAgICAgICAgZkxpbmVEZXNjZW50ID0gRlBERl9NSU4oZkxpbmVEZXNjZW50LCBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkLCBmRm9udFNpemUpKTsKLSAgICAgICAgICAgICAgICAgICAgZldvcmRXaWR0aCA9IG1fcFZULT5HZXRXb3JkV2lkdGgocFdvcmQtPm5Gb250SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JkLT5Xb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWVC0+bV93U3ViV29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVlQtPm1fZkNoYXJTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVlQtPm1fbkhvcnpTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkZvbnRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRUYWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFiT3BlbmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJc09wZW5TdHlsZVB1bmN0dWF0aW9uKHBXb3JkLT5Xb3JkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYk9wZW5lZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiRnVsbFdvcmQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBPbGRXb3JkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOZWVkRGl2aXNpb24ocE9sZFdvcmQtPldvcmQsIHBXb3JkLT5Xb3JkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGdWxsV29yZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoIUlzU3BhY2UocFdvcmQtPldvcmQpICYmICFJc09wZW5TdHlsZVB1bmN0dWF0aW9uKHBXb3JkLT5Xb3JkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYk9wZW5lZCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiRnVsbFdvcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuQ2hhckluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbkxpbmVGdWxsV29yZEluZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5Xb3JkU3RhcnRQb3MgPSBpOwotICAgICAgICAgICAgICAgICAgICBmQmFja3VwTGluZVdpZHRoID0gZkxpbmVXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgZkJhY2t1cExpbmVBc2NlbnQgPSBmTGluZUFzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgZkJhY2t1cExpbmVEZXNjZW50ID0gZkxpbmVEZXNjZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuQ2hhckluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wVlQtPm1fYkxpbWl0V2lkdGggJiYgZlR5cGVzZXRXaWR0aCA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgZkxpbmVXaWR0aCArIGZXb3JkV2lkdGggPiBmVHlwZXNldFdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5MaW5lRnVsbFdvcmRJbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaSA9IG5Xb3JkU3RhcnRQb3M7Ci0gICAgICAgICAgICAgICAgICAgIGZMaW5lV2lkdGggPSBmQmFja3VwTGluZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICBmTGluZUFzY2VudCA9IGZCYWNrdXBMaW5lQXNjZW50OwotICAgICAgICAgICAgICAgICAgICBmTGluZURlc2NlbnQgPSBmQmFja3VwTGluZURlc2NlbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuQ2hhckluZGV4ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZkxpbmVXaWR0aCA9ICBmV29yZFdpZHRoOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5MaW5lVGFpbCA9IGkgLSAxOwotICAgICAgICAgICAgICAgIGlmIChiVHlwZXNldCkgewotICAgICAgICAgICAgICAgICAgICBsaW5lLm5CZWdpbldvcmRJbmRleCA9IG5MaW5lSGVhZDsKLSAgICAgICAgICAgICAgICAgICAgbGluZS5uRW5kV29yZEluZGV4ID0gbkxpbmVUYWlsOwotICAgICAgICAgICAgICAgICAgICBsaW5lLm5Ub3RhbFdvcmQgPSBuTGluZVRhaWwgLSBuTGluZUhlYWQgKyAxOwotICAgICAgICAgICAgICAgICAgICBsaW5lLmZMaW5lV2lkdGggPSBmTGluZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICBsaW5lLmZMaW5lQXNjZW50ID0gZkxpbmVBc2NlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUuZkxpbmVEZXNjZW50ID0gZkxpbmVEZXNjZW50OwotICAgICAgICAgICAgICAgICAgICBtX3BTZWN0aW9uLT5BZGRMaW5lKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmTWF4WSArPSAoZkxpbmVBc2NlbnQgKyBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSk7Ci0gICAgICAgICAgICAgICAgZk1heFkgKz0gKC1mTGluZURlc2NlbnQpOwotICAgICAgICAgICAgICAgIGZNYXhYID0gRlBERl9NQVgoZkxpbmVXaWR0aCwgZk1heFgpOwotICAgICAgICAgICAgICAgIG5MaW5lSGVhZCA9IGk7Ci0gICAgICAgICAgICAgICAgZkxpbmVXaWR0aCA9IDAuMGY7Ci0gICAgICAgICAgICAgICAgZkxpbmVBc2NlbnQgPSAwLjBmOwotICAgICAgICAgICAgICAgIGZMaW5lRGVzY2VudCA9IDAuMGY7Ci0gICAgICAgICAgICAgICAgbkNoYXJJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgbkxpbmVGdWxsV29yZEluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBiRnVsbFdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZkxpbmVXaWR0aCArPSBmV29yZFdpZHRoOwotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobkxpbmVIZWFkIDw9IG5Ub3RhbFdvcmRzIC0gMSkgewotICAgICAgICAgICAgbkxpbmVUYWlsID0gblRvdGFsV29yZHMgLSAxOwotICAgICAgICAgICAgaWYgKGJUeXBlc2V0KSB7Ci0gICAgICAgICAgICAgICAgbGluZS5uQmVnaW5Xb3JkSW5kZXggPSBuTGluZUhlYWQ7Ci0gICAgICAgICAgICAgICAgbGluZS5uRW5kV29yZEluZGV4ID0gbkxpbmVUYWlsOwotICAgICAgICAgICAgICAgIGxpbmUublRvdGFsV29yZCA9IG5MaW5lVGFpbCAtIG5MaW5lSGVhZCArIDE7Ci0gICAgICAgICAgICAgICAgbGluZS5mTGluZVdpZHRoID0gZkxpbmVXaWR0aDsKLSAgICAgICAgICAgICAgICBsaW5lLmZMaW5lQXNjZW50ID0gZkxpbmVBc2NlbnQ7Ci0gICAgICAgICAgICAgICAgbGluZS5mTGluZURlc2NlbnQgPSBmTGluZURlc2NlbnQ7Ci0gICAgICAgICAgICAgICAgbV9wU2VjdGlvbi0+QWRkTGluZShsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZNYXhZICs9IChmTGluZUFzY2VudCArIG1fcFZULT5HZXRMaW5lTGVhZGluZyhtX3BTZWN0aW9uLT5tX1NlY0luZm8pKTsKLSAgICAgICAgICAgIGZNYXhZICs9ICgtZkxpbmVEZXNjZW50KTsKLSAgICAgICAgICAgIGZNYXhYID0gRlBERl9NQVgoZkxpbmVXaWR0aCwgZk1heFgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKK3ZvaWQgQ1R5cGVzZXQ6OlNwbGl0TGluZXMoRlhfQk9PTCBiVHlwZXNldCwgRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKKyAgQVNTRVJUKG1fcFNlY3Rpb24gIT0gTlVMTCk7CisgIGludDMyX3QgbkxpbmVIZWFkID0gMDsKKyAgaW50MzJfdCBuTGluZVRhaWwgPSAwOworICBGWF9GTE9BVCBmTWF4WCA9IDAuMGYsIGZNYXhZID0gMC4wZjsKKyAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDAuMGYsIGZCYWNrdXBMaW5lV2lkdGggPSAwLjBmOworICBGWF9GTE9BVCBmTGluZUFzY2VudCA9IDAuMGYsIGZCYWNrdXBMaW5lQXNjZW50ID0gMC4wZjsKKyAgRlhfRkxPQVQgZkxpbmVEZXNjZW50ID0gMC4wZiwgZkJhY2t1cExpbmVEZXNjZW50ID0gMC4wZjsKKyAgaW50MzJfdCBuV29yZFN0YXJ0UG9zID0gMDsKKyAgRlhfQk9PTCBiRnVsbFdvcmQgPSBGQUxTRTsKKyAgaW50MzJfdCBuTGluZUZ1bGxXb3JkSW5kZXggPSAwOworICBpbnQzMl90IG5DaGFySW5kZXggPSAwOworICBDUFZUX0xpbmVJbmZvIGxpbmU7CisgIEZYX0ZMT0FUIGZXb3JkV2lkdGggPSAwOworICBGWF9GTE9BVCBmVHlwZXNldFdpZHRoID0gRlBERl9NQVgoCisgICAgICBtX3BWVC0+R2V0UGxhdGVXaWR0aCgpIC0gbV9wVlQtPkdldExpbmVJbmRlbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSwKKyAgICAgIDAuMGYpOworICBpbnQzMl90IG5Ub3RhbFdvcmRzID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOworICBGWF9CT09MIGJPcGVuZWQgPSBGQUxTRTsKKyAgaWYgKG5Ub3RhbFdvcmRzID4gMCkgeworICAgIGludDMyX3QgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBuVG90YWxXb3JkcykgeworICAgICAgQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChpKTsKKyAgICAgIENQVlRfV29yZEluZm8qIHBPbGRXb3JkID0gcFdvcmQ7CisgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgcE9sZFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChpIC0gMSk7CisgICAgICB9CisgICAgICBpZiAocFdvcmQpIHsKICAgICAgICAgaWYgKGJUeXBlc2V0KSB7Ci0gICAgICAgICAgICBmTGluZUFzY2VudCA9IG1fcFZULT5HZXRMaW5lQXNjZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbyk7Ci0gICAgICAgICAgICBmTGluZURlc2NlbnQgPSBtX3BWVC0+R2V0TGluZURlc2NlbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKTsKKyAgICAgICAgICBmTGluZUFzY2VudCA9CisgICAgICAgICAgICAgIEZQREZfTUFYKGZMaW5lQXNjZW50LCBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQsIFRSVUUpKTsKKyAgICAgICAgICBmTGluZURlc2NlbnQgPQorICAgICAgICAgICAgICBGUERGX01JTihmTGluZURlc2NlbnQsIG1fcFZULT5HZXRXb3JkRGVzY2VudCgqcFdvcmQsIFRSVUUpKTsKKyAgICAgICAgICBmV29yZFdpZHRoID0gbV9wVlQtPkdldFdvcmRXaWR0aCgqcFdvcmQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZkxpbmVBc2NlbnQgPSBtX3BWVC0+R2V0Rm9udEFzY2VudChtX3BWVC0+R2V0RGVmYXVsdEZvbnRJbmRleCgpLCBmRm9udFNpemUpOwotICAgICAgICAgICAgZkxpbmVEZXNjZW50ID0gbV9wVlQtPkdldEZvbnREZXNjZW50KG1fcFZULT5HZXREZWZhdWx0Rm9udEluZGV4KCksIGZGb250U2l6ZSk7CisgICAgICAgICAgZkxpbmVBc2NlbnQgPQorICAgICAgICAgICAgICBGUERGX01BWChmTGluZUFzY2VudCwgbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkLCBmRm9udFNpemUpKTsKKyAgICAgICAgICBmTGluZURlc2NlbnQgPQorICAgICAgICAgICAgICBGUERGX01JTihmTGluZURlc2NlbnQsIG1fcFZULT5HZXRXb3JkRGVzY2VudCgqcFdvcmQsIGZGb250U2l6ZSkpOworICAgICAgICAgIGZXb3JkV2lkdGggPSBtX3BWVC0+R2V0V29yZFdpZHRoKAorICAgICAgICAgICAgICBwV29yZC0+bkZvbnRJbmRleCwgcFdvcmQtPldvcmQsIG1fcFZULT5tX3dTdWJXb3JkLAorICAgICAgICAgICAgICBtX3BWVC0+bV9mQ2hhclNwYWNlLCBtX3BWVC0+bV9uSG9yelNjYWxlLCBmRm9udFNpemUsCisgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFRhaWwsIDApOwogICAgICAgICB9CisgICAgICAgIGlmICghYk9wZW5lZCkgeworICAgICAgICAgIGlmIChJc09wZW5TdHlsZVB1bmN0dWF0aW9uKHBXb3JkLT5Xb3JkKSkgeworICAgICAgICAgICAgYk9wZW5lZCA9IFRSVUU7CisgICAgICAgICAgICBiRnVsbFdvcmQgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSBpZiAocE9sZFdvcmQgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKE5lZWREaXZpc2lvbihwT2xkV29yZC0+V29yZCwgcFdvcmQtPldvcmQpKSB7CisgICAgICAgICAgICAgIGJGdWxsV29yZCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICghSXNTcGFjZShwV29yZC0+V29yZCkgJiYgIUlzT3BlblN0eWxlUHVuY3R1YXRpb24ocFdvcmQtPldvcmQpKSB7CisgICAgICAgICAgICBiT3BlbmVkID0gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChiRnVsbFdvcmQpIHsKKyAgICAgICAgICBiRnVsbFdvcmQgPSBGQUxTRTsKKyAgICAgICAgICBpZiAobkNoYXJJbmRleCA+IDApIHsKKyAgICAgICAgICAgIG5MaW5lRnVsbFdvcmRJbmRleCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBuV29yZFN0YXJ0UG9zID0gaTsKKyAgICAgICAgICBmQmFja3VwTGluZVdpZHRoID0gZkxpbmVXaWR0aDsKKyAgICAgICAgICBmQmFja3VwTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OworICAgICAgICAgIGZCYWNrdXBMaW5lRGVzY2VudCA9IGZMaW5lRGVzY2VudDsKKyAgICAgICAgfQorICAgICAgICBuQ2hhckluZGV4Kys7CisgICAgICB9CisgICAgICBpZiAobV9wVlQtPm1fYkxpbWl0V2lkdGggJiYgZlR5cGVzZXRXaWR0aCA+IDAgJiYKKyAgICAgICAgICBmTGluZVdpZHRoICsgZldvcmRXaWR0aCA+IGZUeXBlc2V0V2lkdGgpIHsKKyAgICAgICAgaWYgKG5MaW5lRnVsbFdvcmRJbmRleCA+IDApIHsKKyAgICAgICAgICBpID0gbldvcmRTdGFydFBvczsKKyAgICAgICAgICBmTGluZVdpZHRoID0gZkJhY2t1cExpbmVXaWR0aDsKKyAgICAgICAgICBmTGluZUFzY2VudCA9IGZCYWNrdXBMaW5lQXNjZW50OworICAgICAgICAgIGZMaW5lRGVzY2VudCA9IGZCYWNrdXBMaW5lRGVzY2VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAobkNoYXJJbmRleCA9PSAxKSB7CisgICAgICAgICAgZkxpbmVXaWR0aCA9IGZXb3JkV2lkdGg7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIG5MaW5lVGFpbCA9IGkgLSAxOwogICAgICAgICBpZiAoYlR5cGVzZXQpIHsKLSAgICAgICAgICAgIGxpbmUubkJlZ2luV29yZEluZGV4ID0gLTE7Ci0gICAgICAgICAgICBsaW5lLm5FbmRXb3JkSW5kZXggPSAtMTsKLSAgICAgICAgICAgIGxpbmUublRvdGFsV29yZCA9IDA7Ci0gICAgICAgICAgICBsaW5lLmZMaW5lV2lkdGggPSAwOwotICAgICAgICAgICAgbGluZS5mTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OwotICAgICAgICAgICAgbGluZS5mTGluZURlc2NlbnQgPSBmTGluZURlc2NlbnQ7Ci0gICAgICAgICAgICBtX3BTZWN0aW9uLT5BZGRMaW5lKGxpbmUpOworICAgICAgICAgIGxpbmUubkJlZ2luV29yZEluZGV4ID0gbkxpbmVIZWFkOworICAgICAgICAgIGxpbmUubkVuZFdvcmRJbmRleCA9IG5MaW5lVGFpbDsKKyAgICAgICAgICBsaW5lLm5Ub3RhbFdvcmQgPSBuTGluZVRhaWwgLSBuTGluZUhlYWQgKyAxOworICAgICAgICAgIGxpbmUuZkxpbmVXaWR0aCA9IGZMaW5lV2lkdGg7CisgICAgICAgICAgbGluZS5mTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OworICAgICAgICAgIGxpbmUuZkxpbmVEZXNjZW50ID0gZkxpbmVEZXNjZW50OworICAgICAgICAgIG1fcFNlY3Rpb24tPkFkZExpbmUobGluZSk7CiAgICAgICAgIH0KLSAgICAgICAgZk1heFkgKz0gKG1fcFZULT5HZXRMaW5lTGVhZGluZyhtX3BTZWN0aW9uLT5tX1NlY0luZm8pICsgZkxpbmVBc2NlbnQgKyAoLWZMaW5lRGVzY2VudCkpOworICAgICAgICBmTWF4WSArPSAoZkxpbmVBc2NlbnQgKyBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSk7CisgICAgICAgIGZNYXhZICs9ICgtZkxpbmVEZXNjZW50KTsKKyAgICAgICAgZk1heFggPSBGUERGX01BWChmTGluZVdpZHRoLCBmTWF4WCk7CisgICAgICAgIG5MaW5lSGVhZCA9IGk7CisgICAgICAgIGZMaW5lV2lkdGggPSAwLjBmOworICAgICAgICBmTGluZUFzY2VudCA9IDAuMGY7CisgICAgICAgIGZMaW5lRGVzY2VudCA9IDAuMGY7CisgICAgICAgIG5DaGFySW5kZXggPSAwOworICAgICAgICBuTGluZUZ1bGxXb3JkSW5kZXggPSAwOworICAgICAgICBiRnVsbFdvcmQgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZMaW5lV2lkdGggKz0gZldvcmRXaWR0aDsKKyAgICAgICAgaSsrOworICAgICAgfQogICAgIH0KLSAgICBtX3JjUmV0ID0gQ1BWVF9GbG9hdFJlY3QoMCwgMCwgZk1heFgsIGZNYXhZKTsKKyAgICBpZiAobkxpbmVIZWFkIDw9IG5Ub3RhbFdvcmRzIC0gMSkgeworICAgICAgbkxpbmVUYWlsID0gblRvdGFsV29yZHMgLSAxOworICAgICAgaWYgKGJUeXBlc2V0KSB7CisgICAgICAgIGxpbmUubkJlZ2luV29yZEluZGV4ID0gbkxpbmVIZWFkOworICAgICAgICBsaW5lLm5FbmRXb3JkSW5kZXggPSBuTGluZVRhaWw7CisgICAgICAgIGxpbmUublRvdGFsV29yZCA9IG5MaW5lVGFpbCAtIG5MaW5lSGVhZCArIDE7CisgICAgICAgIGxpbmUuZkxpbmVXaWR0aCA9IGZMaW5lV2lkdGg7CisgICAgICAgIGxpbmUuZkxpbmVBc2NlbnQgPSBmTGluZUFzY2VudDsKKyAgICAgICAgbGluZS5mTGluZURlc2NlbnQgPSBmTGluZURlc2NlbnQ7CisgICAgICAgIG1fcFNlY3Rpb24tPkFkZExpbmUobGluZSk7CisgICAgICB9CisgICAgICBmTWF4WSArPSAoZkxpbmVBc2NlbnQgKyBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSk7CisgICAgICBmTWF4WSArPSAoLWZMaW5lRGVzY2VudCk7CisgICAgICBmTWF4WCA9IEZQREZfTUFYKGZMaW5lV2lkdGgsIGZNYXhYKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGJUeXBlc2V0KSB7CisgICAgICBmTGluZUFzY2VudCA9IG1fcFZULT5HZXRMaW5lQXNjZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbyk7CisgICAgICBmTGluZURlc2NlbnQgPSBtX3BWVC0+R2V0TGluZURlc2NlbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgZkxpbmVBc2NlbnQgPQorICAgICAgICAgIG1fcFZULT5HZXRGb250QXNjZW50KG1fcFZULT5HZXREZWZhdWx0Rm9udEluZGV4KCksIGZGb250U2l6ZSk7CisgICAgICBmTGluZURlc2NlbnQgPQorICAgICAgICAgIG1fcFZULT5HZXRGb250RGVzY2VudChtX3BWVC0+R2V0RGVmYXVsdEZvbnRJbmRleCgpLCBmRm9udFNpemUpOworICAgIH0KKyAgICBpZiAoYlR5cGVzZXQpIHsKKyAgICAgIGxpbmUubkJlZ2luV29yZEluZGV4ID0gLTE7CisgICAgICBsaW5lLm5FbmRXb3JkSW5kZXggPSAtMTsKKyAgICAgIGxpbmUublRvdGFsV29yZCA9IDA7CisgICAgICBsaW5lLmZMaW5lV2lkdGggPSAwOworICAgICAgbGluZS5mTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OworICAgICAgbGluZS5mTGluZURlc2NlbnQgPSBmTGluZURlc2NlbnQ7CisgICAgICBtX3BTZWN0aW9uLT5BZGRMaW5lKGxpbmUpOworICAgIH0KKyAgICBmTWF4WSArPSAobV9wVlQtPkdldExpbmVMZWFkaW5nKG1fcFNlY3Rpb24tPm1fU2VjSW5mbykgKyBmTGluZUFzY2VudCArCisgICAgICAgICAgICAgICgtZkxpbmVEZXNjZW50KSk7CisgIH0KKyAgbV9yY1JldCA9IENQVlRfRmxvYXRSZWN0KDAsIDAsIGZNYXhYLCBmTWF4WSk7CiB9Ci12b2lkIENUeXBlc2V0OjpPdXRwdXRMaW5lcygpCi17Ci0gICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwotICAgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOwotICAgIEZYX0ZMT0FUIGZNaW5YID0gMC4wZiwgZk1pblkgPSAwLjBmLCBmTWF4WCA9IDAuMGYsIGZNYXhZID0gMC4wZjsKLSAgICBGWF9GTE9BVCBmUG9zWCA9IDAuMGYsIGZQb3NZID0gMC4wZjsKLSAgICBGWF9GTE9BVCBmTGluZUluZGVudCA9IG1fcFZULT5HZXRMaW5lSW5kZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbyk7Ci0gICAgRlhfRkxPQVQgZlR5cGVzZXRXaWR0aCA9IEZQREZfTUFYKG1fcFZULT5HZXRQbGF0ZVdpZHRoKCkgLSBmTGluZUluZGVudCwgMC4wZik7Ci0gICAgc3dpdGNoIChtX3BWVC0+R2V0QWxpZ25tZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbykpIHsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZk1pblggPSAwLjBmOwordm9pZCBDVHlwZXNldDo6T3V0cHV0TGluZXMoKSB7CisgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKKyAgQVNTRVJUKG1fcFNlY3Rpb24gIT0gTlVMTCk7CisgIEZYX0ZMT0FUIGZNaW5YID0gMC4wZiwgZk1pblkgPSAwLjBmLCBmTWF4WCA9IDAuMGYsIGZNYXhZID0gMC4wZjsKKyAgRlhfRkxPQVQgZlBvc1ggPSAwLjBmLCBmUG9zWSA9IDAuMGY7CisgIEZYX0ZMT0FUIGZMaW5lSW5kZW50ID0gbV9wVlQtPkdldExpbmVJbmRlbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKTsKKyAgRlhfRkxPQVQgZlR5cGVzZXRXaWR0aCA9IEZQREZfTUFYKG1fcFZULT5HZXRQbGF0ZVdpZHRoKCkgLSBmTGluZUluZGVudCwgMC4wZik7CisgIHN3aXRjaCAobV9wVlQtPkdldEFsaWdubWVudChtX3BTZWN0aW9uLT5tX1NlY0luZm8pKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDA6CisgICAgICBmTWluWCA9IDAuMGY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBmTWluWCA9IChmVHlwZXNldFdpZHRoIC0gbV9yY1JldC5XaWR0aCgpKSAqIFBWVF9IQUxGOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgZk1pblggPSBmVHlwZXNldFdpZHRoIC0gbV9yY1JldC5XaWR0aCgpOworICAgICAgYnJlYWs7CisgIH0KKyAgZk1heFggPSBmTWluWCArIG1fcmNSZXQuV2lkdGgoKTsKKyAgZk1pblkgPSAwLjBmOworICBmTWF4WSA9IG1fcmNSZXQuSGVpZ2h0KCk7CisgIGludDMyX3QgblRvdGFsTGluZXMgPSBtX3BTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRTaXplKCk7CisgIGlmIChuVG90YWxMaW5lcyA+IDApIHsKKyAgICBtX3BTZWN0aW9uLT5tX1NlY0luZm8ublRvdGFsTGluZSA9IG5Ub3RhbExpbmVzOworICAgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IG5Ub3RhbExpbmVzOyBsKyspIHsKKyAgICAgIGlmIChDTGluZSogcExpbmUgPSBtX3BTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRBdChsKSkgeworICAgICAgICBzd2l0Y2ggKG1fcFZULT5HZXRBbGlnbm1lbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSkgeworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZlBvc1ggPSAwOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZNaW5YID0gKGZUeXBlc2V0V2lkdGggLSBtX3JjUmV0LldpZHRoKCkpICAqIFBWVF9IQUxGOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGZQb3NYID0gKGZUeXBlc2V0V2lkdGggLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVdpZHRoKSAqIFBWVF9IQUxGOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGZNaW5YID0gZlR5cGVzZXRXaWR0aCAtIG1fcmNSZXQuV2lkdGgoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBmTWF4WCA9IGZNaW5YICsgbV9yY1JldC5XaWR0aCgpOwotICAgIGZNaW5ZID0gMC4wZjsKLSAgICBmTWF4WSA9IG1fcmNSZXQuSGVpZ2h0KCk7Ci0gICAgaW50MzJfdCBuVG90YWxMaW5lcyA9IG1fcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldFNpemUoKTsKLSAgICBpZiAoblRvdGFsTGluZXMgPiAwKSB7Ci0gICAgICAgIG1fcFNlY3Rpb24tPm1fU2VjSW5mby5uVG90YWxMaW5lID0gblRvdGFsTGluZXM7Ci0gICAgICAgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IG5Ub3RhbExpbmVzOyBsKyspIHsKLSAgICAgICAgICAgIGlmIChDTGluZSAqIHBMaW5lID0gbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQobCkpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1fcFZULT5HZXRBbGlnbm1lbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmUG9zWCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgZlBvc1ggPSAoZlR5cGVzZXRXaWR0aCAtIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lV2lkdGgpICogUFZUX0hBTEY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgZlBvc1ggPSBmVHlwZXNldFdpZHRoIC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmUG9zWCArPSBmTGluZUluZGVudDsKLSAgICAgICAgICAgICAgICBmUG9zWSArPSBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9wU2VjdGlvbi0+bV9TZWNJbmZvKTsKLSAgICAgICAgICAgICAgICBmUG9zWSArPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudDsKLSAgICAgICAgICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggPSBmUG9zWCAtIGZNaW5YOwotICAgICAgICAgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSA9IGZQb3NZIC0gZk1pblk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IHcgPSBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXg7IHcgPD0gcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleDsgdysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvICogcFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkWCA9IGZQb3NYIC0gZk1pblg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdvcmQtPnBXb3JkUHJvcHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBXb3JkLT5wV29yZFByb3BzLT5uU2NyaXB0VHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBWVFdPUkRfU0NSSVBUX05PUk1BTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFkgPSBmUG9zWSAtIGZNaW5ZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUFZUV09SRF9TQ1JJUFRfU1VQRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQpIC0gZk1pblk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQVlRXT1JEX1NDUklQVF9TVUI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkKSAtIGZNaW5ZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBmTWluWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZQb3NYICs9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmUG9zWSArPSAoLXBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lRGVzY2VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9yY1JldCA9IENQVlRfRmxvYXRSZWN0KGZNaW5YLCBmTWluWSwgZk1heFgsIGZNYXhZKTsKLX0KLUNQREZfVmFyaWFibGVUZXh0OjpDUERGX1ZhcmlhYmxlVGV4dCgpIDoKLSAgICBtX25MaW1pdENoYXIoMCksCi0gICAgbV9uQ2hhckFycmF5KDApLAotICAgIG1fYk11bHRpTGluZShGQUxTRSksCi0gICAgbV9iTGltaXRXaWR0aChGQUxTRSksCi0gICAgbV9iQXV0b0ZvbnRTaXplKEZBTFNFKSwKLSAgICBtX25BbGlnbm1lbnQoMCksCi0gICAgbV9mTGluZUxlYWRpbmcoMC4wZiksCi0gICAgbV9mQ2hhclNwYWNlKDAuMGYpLAotICAgIG1fbkhvcnpTY2FsZSgxMDApLAotICAgIG1fd1N1YldvcmQoMCksCi0gICAgbV9mRm9udFNpemUoMC4wZiksCi0gICAgbV9iSW5pdGlhbChGQUxTRSksCi0gICAgbV9iUmljaFRleHQoRkFMU0UpLAotICAgIG1fcFZUUHJvdmlkZXIoTlVMTCksCi0gICAgbV9wVlRJdGVyYXRvcihOVUxMKQotewotfQotQ1BERl9WYXJpYWJsZVRleHQ6On5DUERGX1ZhcmlhYmxlVGV4dCgpCi17Ci0gICAgZGVsZXRlIG1fcFZUSXRlcmF0b3I7Ci0gICAgbV9wVlRJdGVyYXRvciA9IE5VTEw7Ci0gICAgUmVzZXRBbGwoKTsKLX0KLXZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkluaXRpYWxpemUoKQotewotICAgIGlmICghbV9iSW5pdGlhbCkgewotICAgICAgICBDUFZUX1NlY3Rpb25JbmZvIHNlY2luZm87Ci0gICAgICAgIGlmIChtX2JSaWNoVGV4dCkgewotICAgICAgICAgICAgc2VjaW5mby5wU2VjUHJvcHMgPSBGWF9ORVcgQ1BWVF9TZWNQcm9wcygwLjBmLCAwLjBmLCAwKTsKLSAgICAgICAgICAgIHNlY2luZm8ucFdvcmRQcm9wcyA9IEZYX05FVyBDUFZUX1dvcmRQcm9wcyhHZXREZWZhdWx0Rm9udEluZGV4KCksIFBWVF9ERUZBVUxUX0ZPTlRTSVpFLCAwLCAwLCAwKTsKLSAgICAgICAgfQotICAgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZTsKLSAgICAgICAgcGxhY2UublNlY0luZGV4ID0gMDsKLSAgICAgICAgQWRkU2VjdGlvbihwbGFjZSwgc2VjaW5mbyk7Ci0gICAgICAgIENQVlRfTGluZUluZm8gbGluZWluZm87Ci0gICAgICAgIGxpbmVpbmZvLmZMaW5lQXNjZW50ID0gR2V0Rm9udEFzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOwotICAgICAgICBsaW5laW5mby5mTGluZURlc2NlbnQgPSBHZXRGb250RGVzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOwotICAgICAgICBBZGRMaW5lKHBsYWNlLCBsaW5laW5mbyk7Ci0gICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoMCkpIHsKLSAgICAgICAgICAgIHBTZWN0aW9uLT5SZXNldExpbmVQbGFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIG1fYkluaXRpYWwgPSBUUlVFOwotICAgIH0KLX0KLXZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlJlc2V0QWxsKCkKLXsKLSAgICBtX2JJbml0aWFsID0gRkFMU0U7Ci0gICAgUmVzZXRTZWN0aW9uQXJyYXkoKTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpJbnNlcnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LAotICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpCi17Ci0gICAgaW50MzJfdCBuVG90bGFXb3JkcyA9IEdldFRvdGFsV29yZHMoKTsKLSAgICBpZiAobV9uTGltaXRDaGFyID4gMCAmJiBuVG90bGFXb3JkcyA+PSBtX25MaW1pdENoYXIpIHsKLSAgICAgICAgcmV0dXJuIHBsYWNlOwotICAgIH0KLSAgICBpZiAobV9uQ2hhckFycmF5ID4gMCAmJiBuVG90bGFXb3JkcyA+PSBtX25DaGFyQXJyYXkpIHsKLSAgICAgICAgcmV0dXJuIHBsYWNlOwotICAgIH0KLSAgICBDUFZUX1dvcmRQbGFjZSBuZXdwbGFjZSA9IHBsYWNlOwotICAgIG5ld3BsYWNlLm5Xb3JkSW5kZXggKys7Ci0gICAgaWYgKG1fYlJpY2hUZXh0KSB7Ci0gICAgICAgIENQVlRfV29yZFByb3BzKiBwTmV3UHJvcHMgPSBwV29yZFByb3BzID8gbmV3IENQVlRfV29yZFByb3BzKCpwV29yZFByb3BzKSA6IG5ldyBDUFZUX1dvcmRQcm9wcygpOwotICAgICAgICBwTmV3UHJvcHMtPm5Gb250SW5kZXggPSBHZXRXb3JkRm9udEluZGV4KHdvcmQsIGNoYXJzZXQsIHBXb3JkUHJvcHMtPm5Gb250SW5kZXgpOwotICAgICAgICByZXR1cm4gQWRkV29yZChuZXdwbGFjZSwgQ1BWVF9Xb3JkSW5mbyh3b3JkLCBjaGFyc2V0LCAtMSwgcE5ld1Byb3BzKSk7Ci0gICAgfQotICAgIGludDMyX3QgbkZvbnRJbmRleCA9IEdldFN1YldvcmQoKSA+IDAgPyBHZXREZWZhdWx0Rm9udEluZGV4KCkgOiBHZXRXb3JkRm9udEluZGV4KHdvcmQsIGNoYXJzZXQsIEdldERlZmF1bHRGb250SW5kZXgoKSk7Ci0gICAgcmV0dXJuIEFkZFdvcmQobmV3cGxhY2UsIENQVlRfV29yZEluZm8od29yZCwgY2hhcnNldCwgbkZvbnRJbmRleCwgTlVMTCkpOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6Okluc2VydFNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywKLSAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzKQotewotICAgIGludDMyX3QgblRvdGxhV29yZHMgPSBHZXRUb3RhbFdvcmRzKCk7Ci0gICAgaWYgKG1fbkxpbWl0Q2hhciA+IDAgJiYgblRvdGxhV29yZHMgPj0gbV9uTGltaXRDaGFyKSB7Ci0gICAgICAgIHJldHVybiBwbGFjZTsKLSAgICB9Ci0gICAgaWYgKG1fbkNoYXJBcnJheSA+IDAgJiYgblRvdGxhV29yZHMgPj0gbV9uQ2hhckFycmF5KSB7Ci0gICAgICAgIHJldHVybiBwbGFjZTsKLSAgICB9Ci0gICAgaWYgKCFtX2JNdWx0aUxpbmUpIHsKLSAgICAgICAgcmV0dXJuIHBsYWNlOwotICAgIH0KLSAgICBDUFZUX1dvcmRQbGFjZSB3b3JkcGxhY2UgPSBwbGFjZTsKLSAgICBVcGRhdGVXb3JkUGxhY2Uod29yZHBsYWNlKTsKLSAgICBDUFZUX1dvcmRQbGFjZSBuZXdwbGFjZSA9IHBsYWNlOwotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQod29yZHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgTmV3UGxhY2Uod29yZHBsYWNlLm5TZWNJbmRleCArIDEsIDAsIC0xKTsKLSAgICAgICAgQ1BWVF9TZWN0aW9uSW5mbyBzZWNpbmZvOwotICAgICAgICBpZiAobV9iUmljaFRleHQpIHsKLSAgICAgICAgICAgIGlmIChwU2VjUHJvcHMpIHsKLSAgICAgICAgICAgICAgICBzZWNpbmZvLnBTZWNQcm9wcyA9IEZYX05FVyBDUFZUX1NlY1Byb3BzKCpwU2VjUHJvcHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMpIHsKLSAgICAgICAgICAgICAgICBzZWNpbmZvLnBXb3JkUHJvcHMgPSBGWF9ORVcgQ1BWVF9Xb3JkUHJvcHMoKnBXb3JkUHJvcHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFkZFNlY3Rpb24oTmV3UGxhY2UsIHNlY2luZm8pOwotICAgICAgICBuZXdwbGFjZSA9IE5ld1BsYWNlOwotICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwTmV3U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KE5ld1BsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50MzJfdCB3ID0gd29yZHBsYWNlLm5Xb3JkSW5kZXggKyAxLCBzeiA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7IHcgPCBzejsgdysrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KSkgewotICAgICAgICAgICAgICAgICAgICBOZXdQbGFjZS5uV29yZEluZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgIHBOZXdTZWN0aW9uLT5BZGRXb3JkKE5ld1BsYWNlLCAqcFdvcmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDbGVhclNlY3Rpb25SaWdodFdvcmRzKHdvcmRwbGFjZSk7Ci0gICAgfQotICAgIHJldHVybiBuZXdwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpJbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQsCi0gICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFByb3BzKQotewotICAgIENGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IHRleHQ7Ci0gICAgQ1BWVF9Xb3JkUGxhY2Ugd3AgPSBwbGFjZTsKLSAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gc3dUZXh0LkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgewotICAgICAgICBDUFZUX1dvcmRQbGFjZSBvbGR3cCA9IHdwOwotICAgICAgICBGWF9XT1JEIHdvcmQgPSBzd1RleHQuR2V0QXQoaSk7Ci0gICAgICAgIHN3aXRjaCAod29yZCkgewotICAgICAgICAgICAgY2FzZSAweDBEOgotICAgICAgICAgICAgICAgIGlmIChtX2JNdWx0aUxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN3VGV4dC5HZXRBdChpICsgMSkgPT0gMHgwQSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdwID0gSW5zZXJ0U2VjdGlvbih3cCwgcFNlY1Byb3BzLCBwUHJvcHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMHgwQToKLSAgICAgICAgICAgICAgICBpZiAobV9iTXVsdGlMaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzd1RleHQuR2V0QXQoaSArIDEpID09IDB4MEQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3cCA9IEluc2VydFNlY3Rpb24od3AsIHBTZWNQcm9wcywgcFByb3BzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDB4MDk6Ci0gICAgICAgICAgICAgICAgd29yZCA9IDB4MjA7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHdwID0gSW5zZXJ0V29yZCh3cCwgd29yZCwgY2hhcnNldCwgcFByb3BzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAod3AgPT0gb2xkd3ApIHsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBmUG9zWCA9IGZUeXBlc2V0V2lkdGggLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVdpZHRoOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHdwOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkRlbGV0ZVdvcmRzKGNvbnN0IENQVlRfV29yZFJhbmdlICYgUGxhY2VSYW5nZSkKLXsKLSAgICBGWF9CT09MIGJMYXN0U2VjUG9zID0gRkFMU0U7Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChQbGFjZVJhbmdlLkVuZFBvcy5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIGJMYXN0U2VjUG9zID0gKFBsYWNlUmFuZ2UuRW5kUG9zID09IHBTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKSk7Ci0gICAgfQotICAgIENsZWFyV29yZHMoUGxhY2VSYW5nZSk7Ci0gICAgaWYgKFBsYWNlUmFuZ2UuQmVnaW5Qb3MublNlY0luZGV4ICE9IFBsYWNlUmFuZ2UuRW5kUG9zLm5TZWNJbmRleCkgewotICAgICAgICBDbGVhckVtcHR5U2VjdGlvbnMoUGxhY2VSYW5nZSk7Ci0gICAgICAgIGlmICghYkxhc3RTZWNQb3MpIHsKLSAgICAgICAgICAgIExpbmtMYXR0ZXJTZWN0aW9uKFBsYWNlUmFuZ2UuQmVnaW5Qb3MpOworICAgICAgICBmUG9zWCArPSBmTGluZUluZGVudDsKKyAgICAgICAgZlBvc1kgKz0gbV9wVlQtPkdldExpbmVMZWFkaW5nKG1fcFNlY3Rpb24tPm1fU2VjSW5mbyk7CisgICAgICAgIGZQb3NZICs9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lQXNjZW50OworICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggPSBmUG9zWCAtIGZNaW5YOworICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVkgPSBmUG9zWSAtIGZNaW5ZOworICAgICAgICBmb3IgKGludDMyX3QgdyA9IHBMaW5lLT5tX0xpbmVJbmZvLm5CZWdpbldvcmRJbmRleDsKKyAgICAgICAgICAgICB3IDw9IHBMaW5lLT5tX0xpbmVJbmZvLm5FbmRXb3JkSW5kZXg7IHcrKykgeworICAgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvKiBwV29yZCA9IG1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHcpKSB7CisgICAgICAgICAgICBwV29yZC0+ZldvcmRYID0gZlBvc1ggLSBmTWluWDsKKyAgICAgICAgICAgIGlmIChwV29yZC0+cFdvcmRQcm9wcykgeworICAgICAgICAgICAgICBzd2l0Y2ggKHBXb3JkLT5wV29yZFByb3BzLT5uU2NyaXB0VHlwZSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY2FzZSBQVlRXT1JEX1NDUklQVF9OT1JNQUw6CisgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBmTWluWTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUFZUV09SRF9TQ1JJUFRfU1VQRVI6CisgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQpIC0gZk1pblk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBWVFdPUkRfU0NSSVBUX1NVQjoKKyAgICAgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFkgPSBmUG9zWSAtIG1fcFZULT5HZXRXb3JkRGVzY2VudCgqcFdvcmQpIC0gZk1pblk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkWSA9IGZQb3NZIC0gZk1pblk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmUG9zWCArPSBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCk7CisgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGZQb3NZICs9ICgtcExpbmUtPm1fTGluZUluZm8uZkxpbmVEZXNjZW50KTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFBsYWNlUmFuZ2UuQmVnaW5Qb3M7CisgIH0KKyAgbV9yY1JldCA9IENQVlRfRmxvYXRSZWN0KGZNaW5YLCBmTWluWSwgZk1heFgsIGZNYXhZKTsKIH0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpEZWxldGVXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCi17Ci0gICAgcmV0dXJuIENsZWFyUmlnaHRXb3JkKEFqdXN0TGluZUhlYWRlcihwbGFjZSwgVFJVRSkpOworQ1BERl9WYXJpYWJsZVRleHQ6OkNQREZfVmFyaWFibGVUZXh0KCkKKyAgICA6IG1fbkxpbWl0Q2hhcigwKSwKKyAgICAgIG1fbkNoYXJBcnJheSgwKSwKKyAgICAgIG1fYk11bHRpTGluZShGQUxTRSksCisgICAgICBtX2JMaW1pdFdpZHRoKEZBTFNFKSwKKyAgICAgIG1fYkF1dG9Gb250U2l6ZShGQUxTRSksCisgICAgICBtX25BbGlnbm1lbnQoMCksCisgICAgICBtX2ZMaW5lTGVhZGluZygwLjBmKSwKKyAgICAgIG1fZkNoYXJTcGFjZSgwLjBmKSwKKyAgICAgIG1fbkhvcnpTY2FsZSgxMDApLAorICAgICAgbV93U3ViV29yZCgwKSwKKyAgICAgIG1fZkZvbnRTaXplKDAuMGYpLAorICAgICAgbV9iSW5pdGlhbChGQUxTRSksCisgICAgICBtX2JSaWNoVGV4dChGQUxTRSksCisgICAgICBtX3BWVFByb3ZpZGVyKE5VTEwpLAorICAgICAgbV9wVlRJdGVyYXRvcihOVUxMKSB7fQorQ1BERl9WYXJpYWJsZVRleHQ6On5DUERGX1ZhcmlhYmxlVGV4dCgpIHsKKyAgZGVsZXRlIG1fcFZUSXRlcmF0b3I7CisgIG1fcFZUSXRlcmF0b3IgPSBOVUxMOworICBSZXNldEFsbCgpOwogfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkJhY2tTcGFjZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKLXsKLSAgICByZXR1cm4gQ2xlYXJMZWZ0V29yZChBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpKTsKLX0KLXZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCwgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzKQotewotICAgIERlbGV0ZVdvcmRzKENQVlRfV29yZFJhbmdlKEdldEJlZ2luV29yZFBsYWNlKCksIEdldEVuZFdvcmRQbGFjZSgpKSk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gdGV4dDsKLSAgICBDUFZUX1dvcmRQbGFjZQl3cCgwLCAwLCAtMSk7Cit2b2lkIENQREZfVmFyaWFibGVUZXh0OjpJbml0aWFsaXplKCkgeworICBpZiAoIW1fYkluaXRpYWwpIHsKICAgICBDUFZUX1NlY3Rpb25JbmZvIHNlY2luZm87CiAgICAgaWYgKG1fYlJpY2hUZXh0KSB7Ci0gICAgICAgIGlmIChwU2VjUHJvcHMpIHsKLSAgICAgICAgICAgIHNlY2luZm8ucFNlY1Byb3BzID0gRlhfTkVXIENQVlRfU2VjUHJvcHMoKnBTZWNQcm9wcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBXb3JkUHJvcHMpIHsKLSAgICAgICAgICAgIHNlY2luZm8ucFdvcmRQcm9wcyA9IEZYX05FVyBDUFZUX1dvcmRQcm9wcygqcFdvcmRQcm9wcyk7Ci0gICAgICAgIH0KKyAgICAgIHNlY2luZm8ucFNlY1Byb3BzID0gRlhfTkVXIENQVlRfU2VjUHJvcHMoMC4wZiwgMC4wZiwgMCk7CisgICAgICBzZWNpbmZvLnBXb3JkUHJvcHMgPSBGWF9ORVcgQ1BWVF9Xb3JkUHJvcHMoR2V0RGVmYXVsdEZvbnRJbmRleCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBWVF9ERUZBVUxUX0ZPTlRTSVpFLCAwLCAwLCAwKTsKICAgICB9Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdCgwKSkgewotICAgICAgICBwU2VjdGlvbi0+bV9TZWNJbmZvID0gc2VjaW5mbzsKLSAgICB9Ci0gICAgaW50MzJfdCBuQ2hhckNvdW50ID0gMDsKLSAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gc3dUZXh0LkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgewotICAgICAgICBpZiAobV9uTGltaXRDaGFyID4gMCAmJiBuQ2hhckNvdW50ID49IG1fbkxpbWl0Q2hhcikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fbkNoYXJBcnJheSA+IDAgJiYgbkNoYXJDb3VudCA+PSBtX25DaGFyQXJyYXkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIEZYX1dPUkQgd29yZCA9IHN3VGV4dC5HZXRBdChpKTsKLSAgICAgICAgc3dpdGNoICh3b3JkKSB7Ci0gICAgICAgICAgICBjYXNlIDB4MEQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1fYk11bHRpTGluZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3dUZXh0LkdldEF0KGkgKyAxKSA9PSAweDBBKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3AublNlY0luZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICB3cC5uTGluZUluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgd3AubldvcmRJbmRleCA9IC0xOwotICAgICAgICAgICAgICAgICAgICBBZGRTZWN0aW9uKHdwLCBzZWNpbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDB4MEE6Ci0gICAgICAgICAgICAgICAgaWYgKG1fYk11bHRpTGluZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3dUZXh0LkdldEF0KGkgKyAxKSA9PSAweDBEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3AublNlY0luZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICB3cC5uTGluZUluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgd3AubldvcmRJbmRleCA9IC0xOwotICAgICAgICAgICAgICAgICAgICBBZGRTZWN0aW9uKHdwLCBzZWNpbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDB4MDk6Ci0gICAgICAgICAgICAgICAgd29yZCA9IDB4MjA7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHdwID0gSW5zZXJ0V29yZCh3cCwgd29yZCwgY2hhcnNldCwgcFdvcmRQcm9wcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbkNoYXJDb3VudCsrOwotICAgIH0KLX0KLXZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlVwZGF0ZVdvcmRQbGFjZShDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIGlmIChwbGFjZS5uU2VjSW5kZXggPCAwKSB7Ci0gICAgICAgIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgaWYgKHBsYWNlLm5TZWNJbmRleCA+PSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgcGxhY2UgPSBHZXRFbmRXb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpOwotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgICAgICBwU2VjdGlvbi0+VXBkYXRlV29yZFBsYWNlKHBsYWNlKTsKLSAgICB9Ci19Ci1pbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpXb3JkUGxhY2VUb1dvcmRJbmRleChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIENQVlRfV29yZFBsYWNlIG5ld3BsYWNlID0gcGxhY2U7Ci0gICAgVXBkYXRlV29yZFBsYWNlKG5ld3BsYWNlKTsKLSAgICBpbnQzMl90IG5JbmRleCA9IDA7Ci0gICAgaW50MzJfdCBpID0gMDsKLSAgICBpbnQzMl90IHN6ID0gMDsKLSAgICBmb3IgKGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6ICYmIGkgPCBuZXdwbGFjZS5uU2VjSW5kZXg7IGkrKykgewotICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KGkpKSB7Ci0gICAgICAgICAgICBuSW5kZXggKz0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsKLSAgICAgICAgICAgIGlmIChpICE9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBuSW5kZXggKz0gUFZUX1JFVFVSTl9MRU5HVEg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGkgPj0gMCAmJiBpIDwgbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIG5JbmRleCArPSBuZXdwbGFjZS5uV29yZEluZGV4ICsgUFZUX1JFVFVSTl9MRU5HVEg7Ci0gICAgfQotICAgIHJldHVybiBuSW5kZXg7Ci19Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6V29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3QKLXsKLSAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IEdldEJlZ2luV29yZFBsYWNlKCk7Ci0gICAgaW50MzJfdCBuT2xkSW5kZXggPSAwICwgbkluZGV4ID0gMDsKLSAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChpKSkgewotICAgICAgICAgICAgbkluZGV4ICs9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7Ci0gICAgICAgICAgICBpZiAobkluZGV4ID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcGxhY2UgPSBwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuSW5kZXggPiBpbmRleCkgewotICAgICAgICAgICAgICAgIHBsYWNlLm5TZWNJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgcGxhY2UubldvcmRJbmRleCA9IGluZGV4IC0gbk9sZEluZGV4IC0gMTsKLSAgICAgICAgICAgICAgICBwU2VjdGlvbi0+VXBkYXRlV29yZFBsYWNlKHBsYWNlKTsKLSAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSAhPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgbkluZGV4ICs9IFBWVF9SRVRVUk5fTEVOR1RIOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbk9sZEluZGV4ID0gbkluZGV4OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghYkZpbmQpIHsKLSAgICAgICAgcGxhY2UgPSBHZXRFbmRXb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBsYWNlOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9iSW5pdGlhbCA/IENQVlRfV29yZFBsYWNlKDAsIDAsIC0xKSA6IENQVlRfV29yZFBsYWNlKCk7Ci19Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0RW5kV29yZFBsYWNlKCkgY29uc3QKLXsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpKSB7Ci0gICAgICAgIHJldHVybiBwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZSgpOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLSAgICBpZiggcGxhY2UublNlY0luZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgaWYgKHBsYWNlLm5TZWNJbmRleCA+PSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEdldEVuZFdvcmRQbGFjZSgpOwotICAgIH0KLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgaWYgKHBsYWNlLldvcmRDbXAocFNlY3Rpb24tPkdldEJlZ2luV29yZFBsYWNlKCkpIDw9IDApIHsKLSAgICAgICAgICAgIGlmIChDU2VjdGlvbiAqIHBQcmV2U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBQcmV2U2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcFNlY3Rpb24tPkdldFByZXZXb3JkUGxhY2UocGxhY2UpOwotICAgIH0KLSAgICByZXR1cm4gcGxhY2U7Ci19Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIGlmIChwbGFjZS5uU2VjSW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOwotICAgIH0KLSAgICBpZiAocGxhY2UublNlY0luZGV4ID49IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gR2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgfQotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgICAgICBpZiAocGxhY2UuV29yZENtcChwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCkpID49IDApIHsKLSAgICAgICAgICAgIGlmIChDU2VjdGlvbiAqIHBOZXh0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCArIDEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBOZXh0U2VjdGlvbi0+R2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBHZXRFbmRXb3JkUGxhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcFNlY3Rpb24tPkdldE5leHRXb3JkUGxhY2UocGxhY2UpOwotICAgIH0KLSAgICByZXR1cm4gcGxhY2U7Ci19Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6U2VhcmNoV29yZFBsYWNlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLSAgICBDUERGX1BvaW50IHB0ID0gT3V0VG9Jbihwb2ludCk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOwotICAgIGludDMyX3QgbkxlZnQgPSAwOwotICAgIGludDMyX3QgblJpZ2h0ID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMTsKLSAgICBpbnQzMl90IG5NaWQgPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLyAyOwotICAgIEZYX0JPT0wgYlVwID0gVFJVRTsKLSAgICBGWF9CT09MIGJEb3duID0gVFJVRTsKLSAgICB3aGlsZSAobkxlZnQgPD0gblJpZ2h0KSB7Ci0gICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQobk1pZCkpIHsKLSAgICAgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHB0LnksIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcCkpIHsKLSAgICAgICAgICAgICAgICBiVXAgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmJvdHRvbSwgcHQueSkpIHsKLSAgICAgICAgICAgICAgICBiRG93biA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKHB0LnksIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcCkpIHsKLSAgICAgICAgICAgICAgICBuUmlnaHQgPSBuTWlkIC0gMTsKLSAgICAgICAgICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKElzRmxvYXRCaWdnZXIocHQueSwgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24uYm90dG9tKSkgewotICAgICAgICAgICAgICAgIG5MZWZ0ID0gbk1pZCArIDE7Ci0gICAgICAgICAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwbGFjZSA9IHBTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChwdC54IC0gcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwgcHQueSAtIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgcGxhY2UublNlY0luZGV4ID0gbk1pZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYlVwKSB7Ci0gICAgICAgIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgaWYgKGJEb3duKSB7Ci0gICAgICAgIHBsYWNlID0gR2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRVcFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci17Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIENQVlRfV29yZFBsYWNlIHRlbXAgPSAgcGxhY2U7Ci0gICAgICAgIENQREZfUG9pbnQgcHQgPSBPdXRUb0luKHBvaW50KTsKLSAgICAgICAgaWYgKHRlbXAubkxpbmVJbmRleC0tID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHBTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UocHQueCAtIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsIHRlbXApOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0ZW1wLm5TZWNJbmRleC0tID4gMCkgewotICAgICAgICAgICAgaWYgKENTZWN0aW9uICogcExhc3RTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQodGVtcC5uU2VjSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgdGVtcC5uTGluZUluZGV4ID0gcExhc3RTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxOwotICAgICAgICAgICAgICAgIHJldHVybiBwTGFzdFNlY3Rpb24tPlNlYXJjaFdvcmRQbGFjZShwdC54IC0gcExhc3RTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsIHRlbXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXREb3duV29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgdGVtcCA9ICBwbGFjZTsKLSAgICAgICAgQ1BERl9Qb2ludCBwdCA9IE91dFRvSW4ocG9pbnQpOwotICAgICAgICBpZiAodGVtcC5uTGluZUluZGV4KysgPCBwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHBTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UocHQueCAtIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsIHRlbXApOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0ZW1wLm5TZWNJbmRleCsrIDwgbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICAgICAgaWYgKENTZWN0aW9uICogcE5leHRTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQodGVtcC5uU2VjSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgdGVtcC5uTGluZUluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcE5leHRTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UocHQueCAtIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsIHRlbXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsIC0xKTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLSAgICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgICAgICBpZiAoQ0xpbmUqIHBMaW5lID0gcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXgpKQotICAgICAgICAgICAgcmV0dXJuIHBMaW5lLT5HZXRFbmRXb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBsYWNlOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFNlY3Rpb25CZWdpblBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENQVlRfV29yZFBsYWNlKHBsYWNlLm5TZWNJbmRleCwgMCwgLTEpOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFNlY3Rpb25FbmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgICAgICByZXR1cm4gcFNlY3Rpb24tPkdldEVuZFdvcmRQbGFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gcGxhY2U7Ci19Ci1pbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXRUb3RhbFdvcmRzKCkgY29uc3QKLXsKLSAgICBpbnQzMl90IG5Ub3RhbCA9IDA7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0gICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoaSkpIHsKLSAgICAgICAgICAgIG5Ub3RhbCArPSAocFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSArIFBWVF9SRVRVUk5fTEVOR1RIKTsKLSAgICAgICAgfQotICAgIHJldHVybiBuVG90YWwgLSBQVlRfUkVUVVJOX0xFTkdUSDsKLX0KLXZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlJlc2V0U2VjdGlvbkFycmF5KCkKLXsKLSAgICBmb3IgKGludDMyX3QgcyA9IDAsIHN6ID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpOyBzIDwgc3o7IHMrKykgewotICAgICAgICBkZWxldGUgbV9TZWN0aW9uQXJyYXkuR2V0QXQocyk7Ci0gICAgfQotICAgIG1fU2VjdGlvbkFycmF5LlJlbW92ZUFsbCgpOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkFkZFNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIHNlY2luZm8pCi17Ci0gICAgaWYgKElzVmFsaWQoKSAmJiAhbV9iTXVsdGlMaW5lKSB7Ci0gICAgICAgIHJldHVybiBwbGFjZTsKLSAgICB9Ci0gICAgaW50MzJfdCBuU2VjSW5kZXggPSBGUERGX01BWChGUERGX01JTihwbGFjZS5uU2VjSW5kZXgsIG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSksIDApOwotICAgIENTZWN0aW9uKiBwU2VjdGlvbiA9IG5ldyBDU2VjdGlvbih0aGlzKTsKLSAgICBwU2VjdGlvbi0+bV9TZWNJbmZvID0gc2VjaW5mbzsKLSAgICBwU2VjdGlvbi0+U2VjUGxhY2UublNlY0luZGV4ID0gblNlY0luZGV4OwotICAgIGlmIChuU2VjSW5kZXggPT0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIG1fU2VjdGlvbkFycmF5LkFkZChwU2VjdGlvbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9TZWN0aW9uQXJyYXkuSW5zZXJ0QXQoblNlY0luZGV4LCBwU2VjdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRMaW5lKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfTGluZUluZm8gJiBsaW5laW5mbykKLXsKLSAgICBpZiAobV9TZWN0aW9uQXJyYXkuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBwbGFjZTsKLSAgICB9Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIHJldHVybiBwU2VjdGlvbi0+QWRkTGluZShsaW5laW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkaW5mbykKLXsKLSAgICBpZiAobV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIHBsYWNlOwotICAgIH0KLSAgICBDUFZUX1dvcmRQbGFjZSBuZXdwbGFjZSA9IHBsYWNlOwotICAgIG5ld3BsYWNlLm5TZWNJbmRleCA9IEZQREZfTUFYKEZQREZfTUlOKG5ld3BsYWNlLm5TZWNJbmRleCwgbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMSksIDApOwotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQobmV3cGxhY2UublNlY0luZGV4KSkgewotICAgICAgICByZXR1cm4gcFNlY3Rpb24tPkFkZFdvcmQobmV3cGxhY2UsIHdvcmRpbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBsYWNlOwotfQotRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9Xb3JkSW5mbyAmIHdvcmRpbmZvKQotewotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyAqIHBXb3JkID0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHBsYWNlLm5Xb3JkSW5kZXgpKSB7Ci0gICAgICAgICAgICB3b3JkaW5mbyA9ICpwV29yZDsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OlNldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkaW5mbykKLXsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChwbGFjZS5uV29yZEluZGV4KSkgewotICAgICAgICAgICAgKnBXb3JkID0gd29yZGluZm87Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9CT09MIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX0xpbmVJbmZvICYgbGluZWluZm8pCi17Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIGlmIChDTGluZSAqIHBMaW5lID0gcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXgpKSB7Ci0gICAgICAgICAgICBsaW5laW5mbyA9IHBMaW5lLT5tX0xpbmVJbmZvOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0U2VjdGlvbkluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9TZWN0aW9uSW5mbyAmIHNlY2luZm8pCi17Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIHNlY2luZm8gPSBwU2VjdGlvbi0+bV9TZWNJbmZvOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotQ1BERl9SZWN0IENQREZfVmFyaWFibGVUZXh0OjpHZXRDb250ZW50UmVjdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEluVG9PdXQoQ1BERl9FZGl0Q29udGFpbmVyOjpHZXRDb250ZW50UmVjdCgpKTsKLX0KLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkRm9udFNpemUoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUpCi17Ci0gICAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFdvcmRJbmZvLnBXb3JkUHJvcHMgPyAoV29yZEluZm8ucFdvcmRQcm9wcy0+blNjcmlwdFR5cGUgPT0gUFZUV09SRF9TQ1JJUFRfTk9STUFMIHx8IGJGYWN0Rm9udFNpemUgPyBXb3JkSW5mby5wV29yZFByb3BzLT5mRm9udFNpemUgOiBXb3JkSW5mby5wV29yZFByb3BzLT5mRm9udFNpemUgKiBQVlRfSEFMRikgOiBHZXRGb250U2l6ZSgpOwotfQotaW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEZvbnRJbmRleChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8pCi17Ci0gICAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFdvcmRJbmZvLnBXb3JkUHJvcHMgPyBXb3JkSW5mby5wV29yZFByb3BzLT5uRm9udEluZGV4IDogV29yZEluZm8ubkZvbnRJbmRleDsKLX0KLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIFdvcmQsIEZYX1dPUkQgU3ViV29yZCwKLSAgICAgICAgRlhfRkxPQVQgZkNoYXJTcGFjZSwgaW50MzJfdCBuSG9yelNjYWxlLAotICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsIEZYX0ZMT0FUIGZXb3JkVGFpbCwgaW50MzJfdCBuV29yZFN0eWxlKQotewotICAgIHJldHVybiAoR2V0Q2hhcldpZHRoKG5Gb250SW5kZXgsIFdvcmQsIFN1YldvcmQsIG5Xb3JkU3R5bGUpICogZkZvbnRTaXplICogUFZUX0ZPTlRTQ0FMRSArIGZDaGFyU3BhY2UpICogbkhvcnpTY2FsZSAqIFBWVF9QRVJDRU5UICsgZldvcmRUYWlsOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRXaWR0aChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8pCi17Ci0gICAgcmV0dXJuIEdldFdvcmRXaWR0aChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwgV29yZEluZm8uV29yZCwgR2V0U3ViV29yZCgpLCBHZXRDaGFyU3BhY2UoV29yZEluZm8pLCBHZXRIb3J6U2NhbGUoV29yZEluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgR2V0V29yZEZvbnRTaXplKFdvcmRJbmZvKSwgV29yZEluZm8uZldvcmRUYWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZEluZm8ucFdvcmRQcm9wcyA/IFdvcmRJbmZvLnBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgOiAwKTsKLX0KLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lQXNjZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8gJiBTZWNJbmZvKQotewotICAgIHJldHVybiBtX2JSaWNoVGV4dCAmJiBTZWNJbmZvLnBXb3JkUHJvcHMgPyBHZXRGb250QXNjZW50KFNlY0luZm8ucFdvcmRQcm9wcy0+bkZvbnRJbmRleCwgU2VjSW5mby5wV29yZFByb3BzLT5mRm9udFNpemUpIDoKLSAgICAgICAgICAgR2V0Rm9udEFzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVEZXNjZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8gJiBTZWNJbmZvKQotewotICAgIHJldHVybiBtX2JSaWNoVGV4dCAmJiBTZWNJbmZvLnBXb3JkUHJvcHMgPyBHZXRGb250RGVzY2VudChTZWNJbmZvLnBXb3JkUHJvcHMtPm5Gb250SW5kZXgsIFNlY0luZm8ucFdvcmRQcm9wcy0+ZkZvbnRTaXplKSA6Ci0gICAgICAgICAgIEdldEZvbnREZXNjZW50KEdldERlZmF1bHRGb250SW5kZXgoKSwgR2V0Rm9udFNpemUoKSk7Ci19Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Rm9udEFzY2VudChpbnQzMl90IG5Gb250SW5kZXgsIEZYX0ZMT0FUIGZGb250U2l6ZSkKLXsKLSAgICByZXR1cm4gKEZYX0ZMT0FUKUdldFR5cGVBc2NlbnQobkZvbnRJbmRleCkgKiBmRm9udFNpemUgKiBQVlRfRk9OVFNDQUxFOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEZvbnREZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCwgRlhfRkxPQVQgZkZvbnRTaXplKQotewotICAgIHJldHVybiAoRlhfRkxPQVQpR2V0VHlwZURlc2NlbnQobkZvbnRJbmRleCkgKiBmRm9udFNpemUgKiBQVlRfRk9OVFNDQUxFOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0gICAgcmV0dXJuIEdldEZvbnRBc2NlbnQoR2V0V29yZEZvbnRJbmRleChXb3JkSW5mbyksIGZGb250U2l6ZSk7Ci19Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0gICAgcmV0dXJuIEdldEZvbnREZXNjZW50KEdldFdvcmRGb250SW5kZXgoV29yZEluZm8pLCBmRm9udFNpemUpOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUpCi17Ci0gICAgcmV0dXJuIEdldEZvbnRBc2NlbnQoR2V0V29yZEZvbnRJbmRleChXb3JkSW5mbyksIEdldFdvcmRGb250U2l6ZShXb3JkSW5mbywgYkZhY3RGb250U2l6ZSkpOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfQk9PTCBiRmFjdEZvbnRTaXplKQotewotICAgIHJldHVybiBHZXRGb250RGVzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwgR2V0V29yZEZvbnRTaXplKFdvcmRJbmZvLCBiRmFjdEZvbnRTaXplKSk7Ci19Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZUxlYWRpbmcoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIFNlY0luZm8pCi17Ci0gICAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFNlY1Byb3BzID8gU2VjSW5mby5wU2VjUHJvcHMtPmZMaW5lTGVhZGluZyA6IG1fZkxpbmVMZWFkaW5nOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVJbmRlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIFNlY0luZm8pCi17Ci0gICAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFNlY1Byb3BzID8gU2VjSW5mby5wU2VjUHJvcHMtPmZMaW5lSW5kZW50IDogMC4wZjsKLX0KLWludDMyX3QgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEFsaWdubWVudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBTZWNJbmZvKQotewotICAgIHJldHVybiBtX2JSaWNoVGV4dCAmJiBTZWNJbmZvLnBTZWNQcm9wcyA/IFNlY0luZm8ucFNlY1Byb3BzLT5uQWxpZ25tZW50IDogbV9uQWxpZ25tZW50OwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldENoYXJTcGFjZShjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8pCi17Ci0gICAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFdvcmRJbmZvLnBXb3JkUHJvcHMgPyBXb3JkSW5mby5wV29yZFByb3BzLT5mQ2hhclNwYWNlIDogbV9mQ2hhclNwYWNlOwotfQotaW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0SG9yelNjYWxlKGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbykKLXsKLSAgICByZXR1cm4gbV9iUmljaFRleHQgJiYgV29yZEluZm8ucFdvcmRQcm9wcyA/IFdvcmRJbmZvLnBXb3JkUHJvcHMtPm5Ib3J6U2NhbGUgOiBtX25Ib3J6U2NhbGU7Ci19Ci12b2lkIENQREZfVmFyaWFibGVUZXh0OjpDbGVhclNlY3Rpb25SaWdodFdvcmRzKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCi17Ci0gICAgQ1BWVF9Xb3JkUGxhY2Ugd29yZHBsYWNlID0gQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKTsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IHcgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpIC0gMTsgdyA+IHdvcmRwbGFjZS5uV29yZEluZGV4OyB3LS0pIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodyk7Ci0gICAgICAgICAgICBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuUmVtb3ZlQXQodyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6QWp1c3RMaW5lSGVhZGVyKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEZYX0JPT0wgYlByZXZPck5leHQpIGNvbnN0Ci17Ci0gICAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPCAwICYmIHBsYWNlLm5MaW5lSW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBiUHJldk9yTmV4dCA/IEdldFByZXZXb3JkUGxhY2UocGxhY2UpIDogR2V0TmV4dFdvcmRQbGFjZShwbGFjZSk7Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyRW1wdHlTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCi17Ci0gICAgaWYgKHBsYWNlLm5TZWNJbmRleCA9PSAwICYmIG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIGlmIChwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwU2VjdGlvbjsKLSAgICAgICAgICAgIG1fU2VjdGlvbkFycmF5LlJlbW92ZUF0KHBsYWNlLm5TZWNJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci12b2lkIENQREZfVmFyaWFibGVUZXh0OjpDbGVhckVtcHR5U2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKQotewotICAgIENQVlRfV29yZFBsYWNlIHdvcmRwbGFjZTsKLSAgICBmb3IgKGludDMyX3QgcyA9IFBsYWNlUmFuZ2UuRW5kUG9zLm5TZWNJbmRleDsgcyA+IFBsYWNlUmFuZ2UuQmVnaW5Qb3MublNlY0luZGV4OyBzLS0pIHsKLSAgICAgICAgd29yZHBsYWNlLm5TZWNJbmRleCA9IHM7Ci0gICAgICAgIENsZWFyRW1wdHlTZWN0aW9uKHdvcmRwbGFjZSk7Ci0gICAgfQotfQotdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6TGlua0xhdHRlclNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKLXsKLSAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IEFqdXN0TGluZUhlYWRlcihwbGFjZSwgVFJVRSk7Ci0gICAgaWYgKENTZWN0aW9uICogcE5leHRTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4ICsgMSkpIHsKLSAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChvbGRwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludDMyX3QgdyA9IDAsIHN6ID0gcE5leHRTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7IHcgPCBzejsgdysrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IHBOZXh0U2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodykpIHsKLSAgICAgICAgICAgICAgICAgICAgb2xkcGxhY2UubldvcmRJbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgcFNlY3Rpb24tPkFkZFdvcmQob2xkcGxhY2UsICpwV29yZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBwTmV4dFNlY3Rpb247Ci0gICAgICAgIG1fU2VjdGlvbkFycmF5LlJlbW92ZUF0KHBsYWNlLm5TZWNJbmRleCArIDEpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKQotewotICAgIENQVlRfV29yZFJhbmdlIE5ld1JhbmdlOwotICAgIE5ld1JhbmdlLkJlZ2luUG9zID0gQWp1c3RMaW5lSGVhZGVyKFBsYWNlUmFuZ2UuQmVnaW5Qb3MsIFRSVUUpOwotICAgIE5ld1JhbmdlLkVuZFBvcyA9IEFqdXN0TGluZUhlYWRlcihQbGFjZVJhbmdlLkVuZFBvcywgVFJVRSk7Ci0gICAgZm9yIChpbnQzMl90IHMgPSBOZXdSYW5nZS5FbmRQb3MublNlY0luZGV4OyBzID49IE5ld1JhbmdlLkJlZ2luUG9zLm5TZWNJbmRleDsgcy0tKSB7Ci0gICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocykpIHsKLSAgICAgICAgICAgIHBTZWN0aW9uLT5DbGVhcldvcmRzKE5ld1JhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpDbGVhckxlZnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCi17Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIENQVlRfV29yZFBsYWNlIGxlZnRwbGFjZSA9IEdldFByZXZXb3JkUGxhY2UocGxhY2UpOwotICAgICAgICBpZiAobGVmdHBsYWNlICE9IHBsYWNlKSB7Ci0gICAgICAgICAgICBpZiAobGVmdHBsYWNlLm5TZWNJbmRleCAhPSBwbGFjZS5uU2VjSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAocFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsZWFyRW1wdHlTZWN0aW9uKHBsYWNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMaW5rTGF0dGVyU2VjdGlvbihsZWZ0cGxhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFNlY3Rpb24tPkNsZWFyV29yZChwbGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxlZnRwbGFjZTsKLSAgICB9Ci0gICAgcmV0dXJuIHBsYWNlOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyUmlnaHRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCi17Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIENQVlRfV29yZFBsYWNlIHJpZ2h0cGxhY2UgPSBBanVzdExpbmVIZWFkZXIoR2V0TmV4dFdvcmRQbGFjZShwbGFjZSksIEZBTFNFKTsKLSAgICAgICAgaWYgKHJpZ2h0cGxhY2UgIT0gcGxhY2UpIHsKLSAgICAgICAgICAgIGlmKHJpZ2h0cGxhY2UublNlY0luZGV4ICE9IHBsYWNlLm5TZWNJbmRleCkgewotICAgICAgICAgICAgICAgIExpbmtMYXR0ZXJTZWN0aW9uKHBsYWNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFNlY3Rpb24tPkNsZWFyV29yZChyaWdodHBsYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGxhY2U7Ci19Ci12b2lkIENQREZfVmFyaWFibGVUZXh0OjpSZWFycmFuZ2VBbGwoKQotewotICAgIFJlYXJyYW5nZShDUFZUX1dvcmRSYW5nZShHZXRCZWdpbldvcmRQbGFjZSgpLCBHZXRFbmRXb3JkUGxhY2UoKSkpOwotfQotdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpCi17Ci0gICAgUmVhcnJhbmdlKFBsYWNlUmFuZ2UpOwotfQotQ1BWVF9GbG9hdFJlY3QgQ1BERl9WYXJpYWJsZVRleHQ6OlJlYXJyYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpCi17Ci0gICAgQ1BWVF9GbG9hdFJlY3QgcmNSZXQ7Ci0gICAgaWYgKElzVmFsaWQoKSkgewotICAgICAgICBpZiAobV9iQXV0b0ZvbnRTaXplKSB7Ci0gICAgICAgICAgICBTZXRGb250U2l6ZShHZXRBdXRvRm9udFNpemUoKSk7Ci0gICAgICAgICAgICByY1JldCA9IFJlYXJyYW5nZVNlY3Rpb25zKENQVlRfV29yZFJhbmdlKEdldEJlZ2luV29yZFBsYWNlKCksIEdldEVuZFdvcmRQbGFjZSgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByY1JldCA9IFJlYXJyYW5nZVNlY3Rpb25zKFBsYWNlUmFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIFNldENvbnRlbnRSZWN0KHJjUmV0KTsKLSAgICByZXR1cm4gcmNSZXQ7Ci19Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0QXV0b0ZvbnRTaXplKCkKLXsKLSAgICBpbnQzMl90IG5Ub3RhbCA9IHNpemVvZihnRm9udFNpemVTdGVwcykgLyBzaXplb2YodWludDhfdCk7Ci0gICAgaWYgKElzTXVsdGlMaW5lKCkpIHsKLSAgICAgICAgblRvdGFsIC89IDQ7Ci0gICAgfQotICAgIGlmIChuVG90YWwgPD0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKEdldFBsYXRlV2lkdGgoKSA8PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQzMl90IG5MZWZ0ID0gMDsKLSAgICBpbnQzMl90IG5SaWdodCA9IG5Ub3RhbCAtIDE7Ci0gICAgaW50MzJfdCBuTWlkID0gblRvdGFsIC8gMjsKLSAgICB3aGlsZSAobkxlZnQgPD0gblJpZ2h0KSB7Ci0gICAgICAgIGlmIChJc0JpZ2dlcihnRm9udFNpemVTdGVwc1tuTWlkXSkpIHsKLSAgICAgICAgICAgIG5SaWdodCA9IG5NaWQgLSAxOwotICAgICAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuTGVmdCA9IG5NaWQgKyAxOwotICAgICAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChGWF9GTE9BVClnRm9udFNpemVTdGVwc1tuTWlkXTsKLX0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHQ6OklzQmlnZ2VyKEZYX0ZMT0FUIGZGb250U2l6ZSkKLXsKLSAgICBGWF9CT09MIGJCaWdnZXIgPSAgRkFMU0U7Ci0gICAgQ1BWVF9TaXplIHN6VG90YWw7Ci0gICAgZm9yIChpbnQzMl90IHMgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgcyA8IHN6OyBzKyspIHsKLSAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChzKSkgewotICAgICAgICAgICAgQ1BWVF9TaXplIHNpemUgPSBwU2VjdGlvbi0+R2V0U2VjdGlvblNpemUoZkZvbnRTaXplKTsKLSAgICAgICAgICAgIHN6VG90YWwueCA9IEZQREZfTUFYKHNpemUueCwgc3pUb3RhbC54KTsKLSAgICAgICAgICAgIHN6VG90YWwueSArPSBzaXplLnk7Ci0gICAgICAgICAgICBpZiAoSXNGbG9hdEJpZ2dlcihzelRvdGFsLngsIEdldFBsYXRlV2lkdGgoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgSXNGbG9hdEJpZ2dlcihzelRvdGFsLnksIEdldFBsYXRlSGVpZ2h0KCkpCi0gICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICBiQmlnZ2VyID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYkJpZ2dlcjsKLX0KLUNQVlRfRmxvYXRSZWN0IENQREZfVmFyaWFibGVUZXh0OjpSZWFycmFuZ2VTZWN0aW9ucyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpCi17CiAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2U7Ci0gICAgRlhfRkxPQVQgZlBvc1kgPSAwOwotICAgIEZYX0ZMT0FUIGZPbGRIZWlnaHQ7Ci0gICAgaW50MzJfdCBuU1NlY0luZGV4ID0gUGxhY2VSYW5nZS5CZWdpblBvcy5uU2VjSW5kZXg7Ci0gICAgaW50MzJfdCBuRVNlY0luZGV4ID0gUGxhY2VSYW5nZS5FbmRQb3MublNlY0luZGV4OwotICAgIENQVlRfRmxvYXRSZWN0IHJjUmV0OwotICAgIGZvciAoaW50MzJfdCBzID0gMCwgc3ogPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCk7IHMgPCBzejsgcysrKSB7Ci0gICAgICAgIHBsYWNlLm5TZWNJbmRleCA9IHM7Ci0gICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocykpIHsKLSAgICAgICAgICAgIHBTZWN0aW9uLT5TZWNQbGFjZSA9IHBsYWNlOwotICAgICAgICAgICAgQ1BWVF9GbG9hdFJlY3QgcmNTZWMgPSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbjsKLSAgICAgICAgICAgIGlmIChzID49IG5TU2VjSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAocyA8PSBuRVNlY0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJjU2VjID0gcFNlY3Rpb24tPlJlYXJyYW5nZSgpOwotICAgICAgICAgICAgICAgICAgICByY1NlYy50b3AgKz0gZlBvc1k7Ci0gICAgICAgICAgICAgICAgICAgIHJjU2VjLmJvdHRvbSArPSBmUG9zWTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmT2xkSGVpZ2h0ID0gcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24uYm90dG9tIC0gcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24udG9wOwotICAgICAgICAgICAgICAgICAgICByY1NlYy50b3AgPSBmUG9zWTsKLSAgICAgICAgICAgICAgICAgICAgcmNTZWMuYm90dG9tID0gZlBvc1kgKyBmT2xkSGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbiA9IHJjU2VjOwotICAgICAgICAgICAgICAgIHBTZWN0aW9uLT5SZXNldExpbmVQbGFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHMgPT0gMCkgewotICAgICAgICAgICAgICAgIHJjUmV0ID0gcmNTZWM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJjUmV0LmxlZnQgPSBGUERGX01JTihyY1NlYy5sZWZ0LCByY1JldC5sZWZ0KTsKLSAgICAgICAgICAgICAgICByY1JldC50b3AgPSBGUERGX01JTihyY1NlYy50b3AsIHJjUmV0LnRvcCk7Ci0gICAgICAgICAgICAgICAgcmNSZXQucmlnaHQgPSBGUERGX01BWChyY1NlYy5yaWdodCwgcmNSZXQucmlnaHQpOwotICAgICAgICAgICAgICAgIHJjUmV0LmJvdHRvbSA9IEZQREZfTUFYKHJjU2VjLmJvdHRvbSwgcmNSZXQuYm90dG9tKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZQb3NZICs9IHJjU2VjLkhlaWdodCgpOworICAgIHBsYWNlLm5TZWNJbmRleCA9IDA7CisgICAgQWRkU2VjdGlvbihwbGFjZSwgc2VjaW5mbyk7CisgICAgQ1BWVF9MaW5lSW5mbyBsaW5laW5mbzsKKyAgICBsaW5laW5mby5mTGluZUFzY2VudCA9IEdldEZvbnRBc2NlbnQoR2V0RGVmYXVsdEZvbnRJbmRleCgpLCBHZXRGb250U2l6ZSgpKTsKKyAgICBsaW5laW5mby5mTGluZURlc2NlbnQgPQorICAgICAgICBHZXRGb250RGVzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOworICAgIEFkZExpbmUocGxhY2UsIGxpbmVpbmZvKTsKKyAgICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoMCkpIHsKKyAgICAgIHBTZWN0aW9uLT5SZXNldExpbmVQbGFjZSgpOworICAgIH0KKyAgICBtX2JJbml0aWFsID0gVFJVRTsKKyAgfQorfQordm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVzZXRBbGwoKSB7CisgIG1fYkluaXRpYWwgPSBGQUxTRTsKKyAgUmVzZXRTZWN0aW9uQXJyYXkoKTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpJbnNlcnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKSB7CisgIGludDMyX3QgblRvdGxhV29yZHMgPSBHZXRUb3RhbFdvcmRzKCk7CisgIGlmIChtX25MaW1pdENoYXIgPiAwICYmIG5Ub3RsYVdvcmRzID49IG1fbkxpbWl0Q2hhcikgeworICAgIHJldHVybiBwbGFjZTsKKyAgfQorICBpZiAobV9uQ2hhckFycmF5ID4gMCAmJiBuVG90bGFXb3JkcyA+PSBtX25DaGFyQXJyYXkpIHsKKyAgICByZXR1cm4gcGxhY2U7CisgIH0KKyAgQ1BWVF9Xb3JkUGxhY2UgbmV3cGxhY2UgPSBwbGFjZTsKKyAgbmV3cGxhY2UubldvcmRJbmRleCsrOworICBpZiAobV9iUmljaFRleHQpIHsKKyAgICBDUFZUX1dvcmRQcm9wcyogcE5ld1Byb3BzID0KKyAgICAgICAgcFdvcmRQcm9wcyA/IG5ldyBDUFZUX1dvcmRQcm9wcygqcFdvcmRQcm9wcykgOiBuZXcgQ1BWVF9Xb3JkUHJvcHMoKTsKKyAgICBwTmV3UHJvcHMtPm5Gb250SW5kZXggPQorICAgICAgICBHZXRXb3JkRm9udEluZGV4KHdvcmQsIGNoYXJzZXQsIHBXb3JkUHJvcHMtPm5Gb250SW5kZXgpOworICAgIHJldHVybiBBZGRXb3JkKG5ld3BsYWNlLCBDUFZUX1dvcmRJbmZvKHdvcmQsIGNoYXJzZXQsIC0xLCBwTmV3UHJvcHMpKTsKKyAgfQorICBpbnQzMl90IG5Gb250SW5kZXggPQorICAgICAgR2V0U3ViV29yZCgpID4gMCA/IEdldERlZmF1bHRGb250SW5kZXgoKQorICAgICAgICAgICAgICAgICAgICAgICA6IEdldFdvcmRGb250SW5kZXgod29yZCwgY2hhcnNldCwgR2V0RGVmYXVsdEZvbnRJbmRleCgpKTsKKyAgcmV0dXJuIEFkZFdvcmQobmV3cGxhY2UsIENQVlRfV29yZEluZm8od29yZCwgY2hhcnNldCwgbkZvbnRJbmRleCwgTlVMTCkpOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6Okluc2VydFNlY3Rpb24oCisgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcywKKyAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcykgeworICBpbnQzMl90IG5Ub3RsYVdvcmRzID0gR2V0VG90YWxXb3JkcygpOworICBpZiAobV9uTGltaXRDaGFyID4gMCAmJiBuVG90bGFXb3JkcyA+PSBtX25MaW1pdENoYXIpIHsKKyAgICByZXR1cm4gcGxhY2U7CisgIH0KKyAgaWYgKG1fbkNoYXJBcnJheSA+IDAgJiYgblRvdGxhV29yZHMgPj0gbV9uQ2hhckFycmF5KSB7CisgICAgcmV0dXJuIHBsYWNlOworICB9CisgIGlmICghbV9iTXVsdGlMaW5lKSB7CisgICAgcmV0dXJuIHBsYWNlOworICB9CisgIENQVlRfV29yZFBsYWNlIHdvcmRwbGFjZSA9IHBsYWNlOworICBVcGRhdGVXb3JkUGxhY2Uod29yZHBsYWNlKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgbmV3cGxhY2UgPSBwbGFjZTsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHdvcmRwbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgQ1BWVF9Xb3JkUGxhY2UgTmV3UGxhY2Uod29yZHBsYWNlLm5TZWNJbmRleCArIDEsIDAsIC0xKTsKKyAgICBDUFZUX1NlY3Rpb25JbmZvIHNlY2luZm87CisgICAgaWYgKG1fYlJpY2hUZXh0KSB7CisgICAgICBpZiAocFNlY1Byb3BzKSB7CisgICAgICAgIHNlY2luZm8ucFNlY1Byb3BzID0gRlhfTkVXIENQVlRfU2VjUHJvcHMoKnBTZWNQcm9wcyk7CisgICAgICB9CisgICAgICBpZiAocFdvcmRQcm9wcykgeworICAgICAgICBzZWNpbmZvLnBXb3JkUHJvcHMgPSBGWF9ORVcgQ1BWVF9Xb3JkUHJvcHMoKnBXb3JkUHJvcHMpOworICAgICAgfQorICAgIH0KKyAgICBBZGRTZWN0aW9uKE5ld1BsYWNlLCBzZWNpbmZvKTsKKyAgICBuZXdwbGFjZSA9IE5ld1BsYWNlOworICAgIGlmIChDU2VjdGlvbiogcE5ld1NlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChOZXdQbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgICBmb3IgKGludDMyX3QgdyA9IHdvcmRwbGFjZS5uV29yZEluZGV4ICsgMSwKKyAgICAgICAgICAgICAgICAgICBzeiA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7CisgICAgICAgICAgIHcgPCBzejsgdysrKSB7CisgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvKiBwV29yZCA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KSkgeworICAgICAgICAgIE5ld1BsYWNlLm5Xb3JkSW5kZXgrKzsKKyAgICAgICAgICBwTmV3U2VjdGlvbi0+QWRkV29yZChOZXdQbGFjZSwgKnBXb3JkKTsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gcmNSZXQ7CisgICAgQ2xlYXJTZWN0aW9uUmlnaHRXb3Jkcyh3b3JkcGxhY2UpOworICB9CisgIHJldHVybiBuZXdwbGFjZTsKIH0KLWludDMyX3QgQ1BERl9WYXJpYWJsZVRleHQ6OkdldENoYXJXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgV29yZCwgRlhfV09SRCBTdWJXb3JkLCBpbnQzMl90IG5Xb3JkU3R5bGUpCi17Ci0gICAgaWYgKCFtX3BWVFByb3ZpZGVyKSB7Ci0gICAgICAgIHJldHVybiAwOworQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6Okluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFByb3BzKSB7CisgIENGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IHRleHQ7CisgIENQVlRfV29yZFBsYWNlIHdwID0gcGxhY2U7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBzd1RleHQuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7CisgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkd3AgPSB3cDsKKyAgICBGWF9XT1JEIHdvcmQgPSBzd1RleHQuR2V0QXQoaSk7CisgICAgc3dpdGNoICh3b3JkKSB7CisgICAgICBjYXNlIDB4MEQ6CisgICAgICAgIGlmIChtX2JNdWx0aUxpbmUpIHsKKyAgICAgICAgICBpZiAoc3dUZXh0LkdldEF0KGkgKyAxKSA9PSAweDBBKSB7CisgICAgICAgICAgICBpICs9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIHdwID0gSW5zZXJ0U2VjdGlvbih3cCwgcFNlY1Byb3BzLCBwUHJvcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDBBOgorICAgICAgICBpZiAobV9iTXVsdGlMaW5lKSB7CisgICAgICAgICAgaWYgKHN3VGV4dC5HZXRBdChpICsgMSkgPT0gMHgwRCkgeworICAgICAgICAgICAgaSArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICB3cCA9IEluc2VydFNlY3Rpb24od3AsIHBTZWNQcm9wcywgcFByb3BzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHgwOToKKyAgICAgICAgd29yZCA9IDB4MjA7CisgICAgICBkZWZhdWx0OgorICAgICAgICB3cCA9IEluc2VydFdvcmQod3AsIHdvcmQsIGNoYXJzZXQsIHBQcm9wcyk7CisgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBpZiAoU3ViV29yZCA+IDApIHsKLSAgICAgICAgcmV0dXJuIG1fcFZUUHJvdmlkZXItPkdldENoYXJXaWR0aChuRm9udEluZGV4LCBTdWJXb3JkLCBuV29yZFN0eWxlKTsKKyAgICBpZiAod3AgPT0gb2xkd3ApIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gbV9wVlRQcm92aWRlci0+R2V0Q2hhcldpZHRoKG5Gb250SW5kZXgsIFdvcmQsIG5Xb3JkU3R5bGUpOworICB9CisgIHJldHVybiB3cDsKIH0KLWludDMyX3QgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFR5cGVBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KQotewotICAgIHJldHVybiBtX3BWVFByb3ZpZGVyID8gbV9wVlRQcm92aWRlci0+R2V0VHlwZUFzY2VudChuRm9udEluZGV4KSA6IDA7Ci19Ci1pbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXRUeXBlRGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgpCi17Ci0gICAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5HZXRUeXBlRGVzY2VudChuRm9udEluZGV4KSA6IDA7Ci19Ci1pbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBpbnQzMl90IG5Gb250SW5kZXgpCi17Ci0gICAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5HZXRXb3JkRm9udEluZGV4KHdvcmQsIGNoYXJzZXQsIG5Gb250SW5kZXgpIDogLTE7Ci19Ci1pbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXREZWZhdWx0Rm9udEluZGV4KCkKLXsKLSAgICByZXR1cm4gbV9wVlRQcm92aWRlciA/IG1fcFZUUHJvdmlkZXItPkdldERlZmF1bHRGb250SW5kZXgoKSA6IC0xOwotfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dDo6SXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKQotewotICAgIHJldHVybiBtX3BWVFByb3ZpZGVyID8gbV9wVlRQcm92aWRlci0+SXNMYXRpbldvcmQod29yZCkgOiBGQUxTRTsKLX0KLUlQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogQ1BERl9WYXJpYWJsZVRleHQ6OkdldEl0ZXJhdG9yKCkKLXsKLSAgICBpZiAoIW1fcFZUSXRlcmF0b3IpIHsKLSAgICAgICAgcmV0dXJuIG1fcFZUSXRlcmF0b3IgPSBGWF9ORVcgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IodGhpcyk7CitDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6RGVsZXRlV29yZHMoCisgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpIHsKKyAgRlhfQk9PTCBiTGFzdFNlY1BvcyA9IEZBTFNFOworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoUGxhY2VSYW5nZS5FbmRQb3MublNlY0luZGV4KSkgeworICAgIGJMYXN0U2VjUG9zID0gKFBsYWNlUmFuZ2UuRW5kUG9zID09IHBTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKSk7CisgIH0KKyAgQ2xlYXJXb3JkcyhQbGFjZVJhbmdlKTsKKyAgaWYgKFBsYWNlUmFuZ2UuQmVnaW5Qb3MublNlY0luZGV4ICE9IFBsYWNlUmFuZ2UuRW5kUG9zLm5TZWNJbmRleCkgeworICAgIENsZWFyRW1wdHlTZWN0aW9ucyhQbGFjZVJhbmdlKTsKKyAgICBpZiAoIWJMYXN0U2VjUG9zKSB7CisgICAgICBMaW5rTGF0dGVyU2VjdGlvbihQbGFjZVJhbmdlLkJlZ2luUG9zKTsKICAgICB9Ci0gICAgcmV0dXJuIG1fcFZUSXRlcmF0b3I7CisgIH0KKyAgcmV0dXJuIFBsYWNlUmFuZ2UuQmVnaW5Qb3M7CiB9Ci1JUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlcioJQ1BERl9WYXJpYWJsZVRleHQ6OlNldFByb3ZpZGVyKElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyICogcFByb3ZpZGVyKQotewotICAgIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBwT2xkID0gbV9wVlRQcm92aWRlcjsKLSAgICBtX3BWVFByb3ZpZGVyID0gcFByb3ZpZGVyOwotICAgIHJldHVybiBwT2xkOworQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkRlbGV0ZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7CisgIHJldHVybiBDbGVhclJpZ2h0V29yZChBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpKTsKIH0KLUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcihDUERGX1ZhcmlhYmxlVGV4dCAqIHBWVCk6Ci0gICAgbV9DdXJQb3MoLTEsIC0xLCAtMSksCi0gICAgbV9wVlQocFZUKQoteworQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkJhY2tTcGFjZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7CisgIHJldHVybiBDbGVhckxlZnRXb3JkKEFqdXN0TGluZUhlYWRlcihwbGFjZSwgVFJVRSkpOwogfQotQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6On5DUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcigpCi17Ci19Ci12b2lkIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpCi17Ci0gICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwotICAgIG1fQ3VyUG9zID0gbV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5Xb3JkSW5kZXgpOwotfQotdm9pZCBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6U2V0QXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgbV9DdXJQb3MgPSBwbGFjZTsKLX0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6Ok5leHRXb3JkKCkKLXsKLSAgICBpZiAobV9DdXJQb3MgPT0gbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK3ZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcykgeworICBEZWxldGVXb3JkcyhDUFZUX1dvcmRSYW5nZShHZXRCZWdpbldvcmRQbGFjZSgpLCBHZXRFbmRXb3JkUGxhY2UoKSkpOworICBDRlhfV2lkZVN0cmluZyBzd1RleHQgPSB0ZXh0OworICBDUFZUX1dvcmRQbGFjZSB3cCgwLCAwLCAtMSk7CisgIENQVlRfU2VjdGlvbkluZm8gc2VjaW5mbzsKKyAgaWYgKG1fYlJpY2hUZXh0KSB7CisgICAgaWYgKHBTZWNQcm9wcykgeworICAgICAgc2VjaW5mby5wU2VjUHJvcHMgPSBGWF9ORVcgQ1BWVF9TZWNQcm9wcygqcFNlY1Byb3BzKTsKICAgICB9Ci0gICAgbV9DdXJQb3MgPSBtX3BWVC0+R2V0TmV4dFdvcmRQbGFjZShtX0N1clBvcyk7CisgICAgaWYgKHBXb3JkUHJvcHMpIHsKKyAgICAgIHNlY2luZm8ucFdvcmRQcm9wcyA9IEZYX05FVyBDUFZUX1dvcmRQcm9wcygqcFdvcmRQcm9wcyk7CisgICAgfQorICB9CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdCgwKSkgeworICAgIHBTZWN0aW9uLT5tX1NlY0luZm8gPSBzZWNpbmZvOworICB9CisgIGludDMyX3QgbkNoYXJDb3VudCA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBzd1RleHQuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKG1fbkxpbWl0Q2hhciA+IDAgJiYgbkNoYXJDb3VudCA+PSBtX25MaW1pdENoYXIpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAobV9uQ2hhckFycmF5ID4gMCAmJiBuQ2hhckNvdW50ID49IG1fbkNoYXJBcnJheSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIEZYX1dPUkQgd29yZCA9IHN3VGV4dC5HZXRBdChpKTsKKyAgICBzd2l0Y2ggKHdvcmQpIHsKKyAgICAgIGNhc2UgMHgwRDoKKyAgICAgICAgaWYgKG1fYk11bHRpTGluZSkgeworICAgICAgICAgIGlmIChzd1RleHQuR2V0QXQoaSArIDEpID09IDB4MEEpIHsKKyAgICAgICAgICAgIGkgKz0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgd3AublNlY0luZGV4Kys7CisgICAgICAgICAgd3AubkxpbmVJbmRleCA9IDA7CisgICAgICAgICAgd3AubldvcmRJbmRleCA9IC0xOworICAgICAgICAgIEFkZFNlY3Rpb24od3AsIHNlY2luZm8pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDBBOgorICAgICAgICBpZiAobV9iTXVsdGlMaW5lKSB7CisgICAgICAgICAgaWYgKHN3VGV4dC5HZXRBdChpICsgMSkgPT0gMHgwRCkgeworICAgICAgICAgICAgaSArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICB3cC5uU2VjSW5kZXgrKzsKKyAgICAgICAgICB3cC5uTGluZUluZGV4ID0gMDsKKyAgICAgICAgICB3cC5uV29yZEluZGV4ID0gLTE7CisgICAgICAgICAgQWRkU2VjdGlvbih3cCwgc2VjaW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4MDk6CisgICAgICAgIHdvcmQgPSAweDIwOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgd3AgPSBJbnNlcnRXb3JkKHdwLCB3b3JkLCBjaGFyc2V0LCBwV29yZFByb3BzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG5DaGFyQ291bnQrKzsKKyAgfQorfQordm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6VXBkYXRlV29yZFBsYWNlKENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICBpZiAocGxhY2UublNlY0luZGV4IDwgMCkgeworICAgIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKKyAgfQorICBpZiAocGxhY2UublNlY0luZGV4ID49IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSkgeworICAgIHBsYWNlID0gR2V0RW5kV29yZFBsYWNlKCk7CisgIH0KKyAgcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpOworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIHBTZWN0aW9uLT5VcGRhdGVXb3JkUGxhY2UocGxhY2UpOworICB9Cit9CitpbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpXb3JkUGxhY2VUb1dvcmRJbmRleCgKKyAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgQ1BWVF9Xb3JkUGxhY2UgbmV3cGxhY2UgPSBwbGFjZTsKKyAgVXBkYXRlV29yZFBsYWNlKG5ld3BsYWNlKTsKKyAgaW50MzJfdCBuSW5kZXggPSAwOworICBpbnQzMl90IGkgPSAwOworICBpbnQzMl90IHN6ID0gMDsKKyAgZm9yIChpID0gMCwgc3ogPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCk7IGkgPCBzeiAmJiBpIDwgbmV3cGxhY2UublNlY0luZGV4OworICAgICAgIGkrKykgeworICAgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChpKSkgeworICAgICAgbkluZGV4ICs9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7CisgICAgICBpZiAoaSAhPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7CisgICAgICAgIG5JbmRleCArPSBQVlRfUkVUVVJOX0xFTkdUSDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGkgPj0gMCAmJiBpIDwgbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKSB7CisgICAgbkluZGV4ICs9IG5ld3BsYWNlLm5Xb3JkSW5kZXggKyBQVlRfUkVUVVJOX0xFTkdUSDsKKyAgfQorICByZXR1cm4gbkluZGV4OworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OldvcmRJbmRleFRvV29yZFBsYWNlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOworICBpbnQzMl90IG5PbGRJbmRleCA9IDAsIG5JbmRleCA9IDA7CisgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoaSkpIHsKKyAgICAgIG5JbmRleCArPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOworICAgICAgaWYgKG5JbmRleCA9PSBpbmRleCkgeworICAgICAgICBwbGFjZSA9IHBTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKTsKKyAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAobkluZGV4ID4gaW5kZXgpIHsKKyAgICAgICAgcGxhY2UublNlY0luZGV4ID0gaTsKKyAgICAgICAgcGxhY2UubldvcmRJbmRleCA9IGluZGV4IC0gbk9sZEluZGV4IC0gMTsKKyAgICAgICAgcFNlY3Rpb24tPlVwZGF0ZVdvcmRQbGFjZShwbGFjZSk7CisgICAgICAgIGJGaW5kID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoaSAhPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7CisgICAgICAgIG5JbmRleCArPSBQVlRfUkVUVVJOX0xFTkdUSDsKKyAgICAgIH0KKyAgICAgIG5PbGRJbmRleCA9IG5JbmRleDsKKyAgICB9CisgIH0KKyAgaWYgKCFiRmluZCkgeworICAgIHBsYWNlID0gR2V0RW5kV29yZFBsYWNlKCk7CisgIH0KKyAgcmV0dXJuIHBsYWNlOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QgeworICByZXR1cm4gbV9iSW5pdGlhbCA/IENQVlRfV29yZFBsYWNlKDAsIDAsIC0xKSA6IENQVlRfV29yZFBsYWNlKCk7Cit9CitDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0RW5kV29yZFBsYWNlKCkgY29uc3QgeworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQobV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMSkpIHsKKyAgICByZXR1cm4gcFNlY3Rpb24tPkdldEVuZFdvcmRQbGFjZSgpOworICB9CisgIHJldHVybiBDUFZUX1dvcmRQbGFjZSgpOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFByZXZXb3JkUGxhY2UoCisgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIGlmIChwbGFjZS5uU2VjSW5kZXggPCAwKSB7CisgICAgcmV0dXJuIEdldEJlZ2luV29yZFBsYWNlKCk7CisgIH0KKyAgaWYgKHBsYWNlLm5TZWNJbmRleCA+PSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gR2V0RW5kV29yZFBsYWNlKCk7CisgIH0KKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBpZiAocGxhY2UuV29yZENtcChwU2VjdGlvbi0+R2V0QmVnaW5Xb3JkUGxhY2UoKSkgPD0gMCkgeworICAgICAgaWYgKENTZWN0aW9uKiBwUHJldlNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXggLSAxKSkgeworICAgICAgICByZXR1cm4gcFByZXZTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOworICAgIH0KKyAgICByZXR1cm4gcFNlY3Rpb24tPkdldFByZXZXb3JkUGxhY2UocGxhY2UpOworICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXROZXh0V29yZFBsYWNlKAorICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICBpZiAocGxhY2UublNlY0luZGV4IDwgMCkgeworICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOworICB9CisgIGlmIChwbGFjZS5uU2VjSW5kZXggPj0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKSB7CisgICAgcmV0dXJuIEdldEVuZFdvcmRQbGFjZSgpOworICB9CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgaWYgKHBsYWNlLldvcmRDbXAocFNlY3Rpb24tPkdldEVuZFdvcmRQbGFjZSgpKSA+PSAwKSB7CisgICAgICBpZiAoQ1NlY3Rpb24qIHBOZXh0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCArIDEpKSB7CisgICAgICAgIHJldHVybiBwTmV4dFNlY3Rpb24tPkdldEJlZ2luV29yZFBsYWNlKCk7CisgICAgICB9CisgICAgICByZXR1cm4gR2V0RW5kV29yZFBsYWNlKCk7CisgICAgfQorICAgIHJldHVybiBwU2VjdGlvbi0+R2V0TmV4dFdvcmRQbGFjZShwbGFjZSk7CisgIH0KKyAgcmV0dXJuIHBsYWNlOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OlNlYXJjaFdvcmRQbGFjZSgKKyAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBDUERGX1BvaW50IHB0ID0gT3V0VG9Jbihwb2ludCk7CisgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKKyAgaW50MzJfdCBuTGVmdCA9IDA7CisgIGludDMyX3QgblJpZ2h0ID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMTsKKyAgaW50MzJfdCBuTWlkID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC8gMjsKKyAgRlhfQk9PTCBiVXAgPSBUUlVFOworICBGWF9CT09MIGJEb3duID0gVFJVRTsKKyAgd2hpbGUgKG5MZWZ0IDw9IG5SaWdodCkgeworICAgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChuTWlkKSkgeworICAgICAgaWYgKElzRmxvYXRCaWdnZXIocHQueSwgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24udG9wKSkgeworICAgICAgICBiVXAgPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmJvdHRvbSwgcHQueSkpIHsKKyAgICAgICAgYkRvd24gPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihwdC55LCBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApKSB7CisgICAgICAgIG5SaWdodCA9IG5NaWQgLSAxOworICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIGlmIChJc0Zsb2F0QmlnZ2VyKHB0LnksIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmJvdHRvbSkpIHsKKyAgICAgICAgbkxlZnQgPSBuTWlkICsgMTsKKyAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBsYWNlID0gcFNlY3Rpb24tPlNlYXJjaFdvcmRQbGFjZSgKKyAgICAgICAgICAgIENQREZfUG9pbnQocHQueCAtIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgIHB0LnkgLSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApKTsKKyAgICAgICAgcGxhY2UublNlY0luZGV4ID0gbk1pZDsKKyAgICAgICAgcmV0dXJuIHBsYWNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGJVcCkgeworICAgIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKKyAgfQorICBpZiAoYkRvd24pIHsKKyAgICBwbGFjZSA9IEdldEVuZFdvcmRQbGFjZSgpOworICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRVcFdvcmRQbGFjZSgKKyAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBDUFZUX1dvcmRQbGFjZSB0ZW1wID0gcGxhY2U7CisgICAgQ1BERl9Qb2ludCBwdCA9IE91dFRvSW4ocG9pbnQpOworICAgIGlmICh0ZW1wLm5MaW5lSW5kZXgtLSA+IDApIHsKKyAgICAgIHJldHVybiBwU2VjdGlvbi0+U2VhcmNoV29yZFBsYWNlKAorICAgICAgICAgIHB0LnggLSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi5sZWZ0LCB0ZW1wKTsKKyAgICB9CisgICAgaWYgKHRlbXAublNlY0luZGV4LS0gPiAwKSB7CisgICAgICBpZiAoQ1NlY3Rpb24qIHBMYXN0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHRlbXAublNlY0luZGV4KSkgeworICAgICAgICB0ZW1wLm5MaW5lSW5kZXggPSBwTGFzdFNlY3Rpb24tPm1fTGluZUFycmF5LkdldFNpemUoKSAtIDE7CisgICAgICAgIHJldHVybiBwTGFzdFNlY3Rpb24tPlNlYXJjaFdvcmRQbGFjZSgKKyAgICAgICAgICAgIHB0LnggLSBwTGFzdFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwgdGVtcCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXREb3duV29yZFBsYWNlKAorICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIENQVlRfV29yZFBsYWNlIHRlbXAgPSBwbGFjZTsKKyAgICBDUERGX1BvaW50IHB0ID0gT3V0VG9Jbihwb2ludCk7CisgICAgaWYgKHRlbXAubkxpbmVJbmRleCsrIDwgcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldFNpemUoKSAtIDEpIHsKKyAgICAgIHJldHVybiBwU2VjdGlvbi0+U2VhcmNoV29yZFBsYWNlKAorICAgICAgICAgIHB0LnggLSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi5sZWZ0LCB0ZW1wKTsKKyAgICB9CisgICAgaWYgKHRlbXAublNlY0luZGV4KysgPCBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7CisgICAgICBpZiAoQ1NlY3Rpb24qIHBOZXh0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHRlbXAublNlY0luZGV4KSkgeworICAgICAgICB0ZW1wLm5MaW5lSW5kZXggPSAwOworICAgICAgICByZXR1cm4gcE5leHRTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UoCisgICAgICAgICAgICBwdC54IC0gcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwgdGVtcCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lQmVnaW5QbGFjZSgKKyAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgcmV0dXJuIENQVlRfV29yZFBsYWNlKHBsYWNlLm5TZWNJbmRleCwgcGxhY2UubkxpbmVJbmRleCwgLTEpOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVFbmRQbGFjZSgKKyAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBpZiAoQ0xpbmUqIHBMaW5lID0gcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXgpKQorICAgICAgcmV0dXJuIHBMaW5lLT5HZXRFbmRXb3JkUGxhY2UoKTsKKyAgfQorICByZXR1cm4gcGxhY2U7Cit9CitDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0U2VjdGlvbkJlZ2luUGxhY2UoCisgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIDAsIC0xKTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRTZWN0aW9uRW5kUGxhY2UoCisgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgcmV0dXJuIHBTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKTsKKyAgfQorICByZXR1cm4gcGxhY2U7Cit9CitpbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXRUb3RhbFdvcmRzKCkgY29uc3QgeworICBpbnQzMl90IG5Ub3RhbCA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChpKSkgeworICAgICAgblRvdGFsICs9IChwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpICsgUFZUX1JFVFVSTl9MRU5HVEgpOworICAgIH0KKyAgcmV0dXJuIG5Ub3RhbCAtIFBWVF9SRVRVUk5fTEVOR1RIOworfQordm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVzZXRTZWN0aW9uQXJyYXkoKSB7CisgIGZvciAoaW50MzJfdCBzID0gMCwgc3ogPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCk7IHMgPCBzejsgcysrKSB7CisgICAgZGVsZXRlIG1fU2VjdGlvbkFycmF5LkdldEF0KHMpOworICB9CisgIG1fU2VjdGlvbkFycmF5LlJlbW92ZUFsbCgpOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkFkZFNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgc2VjaW5mbykgeworICBpZiAoSXNWYWxpZCgpICYmICFtX2JNdWx0aUxpbmUpIHsKKyAgICByZXR1cm4gcGxhY2U7CisgIH0KKyAgaW50MzJfdCBuU2VjSW5kZXggPQorICAgICAgRlBERl9NQVgoRlBERl9NSU4ocGxhY2UublNlY0luZGV4LCBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpLCAwKTsKKyAgQ1NlY3Rpb24qIHBTZWN0aW9uID0gbmV3IENTZWN0aW9uKHRoaXMpOworICBwU2VjdGlvbi0+bV9TZWNJbmZvID0gc2VjaW5mbzsKKyAgcFNlY3Rpb24tPlNlY1BsYWNlLm5TZWNJbmRleCA9IG5TZWNJbmRleDsKKyAgaWYgKG5TZWNJbmRleCA9PSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpIHsKKyAgICBtX1NlY3Rpb25BcnJheS5BZGQocFNlY3Rpb24pOworICB9IGVsc2UgeworICAgIG1fU2VjdGlvbkFycmF5Lkluc2VydEF0KG5TZWNJbmRleCwgcFNlY3Rpb24pOworICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRMaW5lKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfTGluZUluZm8mIGxpbmVpbmZvKSB7CisgIGlmIChtX1NlY3Rpb25BcnJheS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gcGxhY2U7CisgIH0KKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICByZXR1cm4gcFNlY3Rpb24tPkFkZExpbmUobGluZWluZm8pOworICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZEluZm8mIHdvcmRpbmZvKSB7CisgIGlmIChtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgPD0gMCkgeworICAgIHJldHVybiBwbGFjZTsKKyAgfQorICBDUFZUX1dvcmRQbGFjZSBuZXdwbGFjZSA9IHBsYWNlOworICBuZXdwbGFjZS5uU2VjSW5kZXggPQorICAgICAgRlBERl9NQVgoRlBERl9NSU4obmV3cGxhY2UublNlY0luZGV4LCBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSwgMCk7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChuZXdwbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgcmV0dXJuIHBTZWN0aW9uLT5BZGRXb3JkKG5ld3BsYWNlLCB3b3JkaW5mbyk7CisgIH0KKyAgcmV0dXJuIHBsYWNlOworfQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9Xb3JkSW5mbyYgd29yZGluZm8pIHsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQocGxhY2UubldvcmRJbmRleCkpIHsKKyAgICAgIHdvcmRpbmZvID0gKnBXb3JkOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OlNldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZEluZm8mIHdvcmRpbmZvKSB7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgaWYgKENQVlRfV29yZEluZm8qIHBXb3JkID0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHBsYWNlLm5Xb3JkSW5kZXgpKSB7CisgICAgICAqcFdvcmQgPSB3b3JkaW5mbzsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX0xpbmVJbmZvJiBsaW5laW5mbykgeworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIGlmIChDTGluZSogcExpbmUgPSBwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCkpIHsKKyAgICAgIGxpbmVpbmZvID0gcExpbmUtPm1fTGluZUluZm87CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0U2VjdGlvbkluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9TZWN0aW9uSW5mbyYgc2VjaW5mbykgeworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIHNlY2luZm8gPSBwU2VjdGlvbi0+bV9TZWNJbmZvOwogICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZXb3JkKCkKLXsKLSAgICBpZiAobV9DdXJQb3MgPT0gbV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX0N1clBvcyA9IG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fQ3VyUG9zKTsKLSAgICByZXR1cm4gVFJVRTsKK0NQREZfUmVjdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Q29udGVudFJlY3QoKSBjb25zdCB7CisgIHJldHVybiBJblRvT3V0KENQREZfRWRpdENvbnRhaW5lcjo6R2V0Q29udGVudFJlY3QoKSk7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpOZXh0TGluZSgpCi17Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgewotICAgICAgICBpZiAobV9DdXJQb3MubkxpbmVJbmRleCA8IHBTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICAgICAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgbV9DdXJQb3MubkxpbmVJbmRleCArIDEsIC0xKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0N1clBvcy5uU2VjSW5kZXggPCBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggKyAxLCAwLCAtMSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRGb250U2l6ZShjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmFjdEZvbnRTaXplKSB7CisgIHJldHVybiBtX2JSaWNoVGV4dCAmJiBXb3JkSW5mby5wV29yZFByb3BzCisgICAgICAgICAgICAgPyAoV29yZEluZm8ucFdvcmRQcm9wcy0+blNjcmlwdFR5cGUgPT0gUFZUV09SRF9TQ1JJUFRfTk9STUFMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBiRmFjdEZvbnRTaXplCisgICAgICAgICAgICAgICAgICAgID8gV29yZEluZm8ucFdvcmRQcm9wcy0+ZkZvbnRTaXplCisgICAgICAgICAgICAgICAgICAgIDogV29yZEluZm8ucFdvcmRQcm9wcy0+ZkZvbnRTaXplICogUFZUX0hBTEYpCisgICAgICAgICAgICAgOiBHZXRGb250U2l6ZSgpOworfQoraW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEZvbnRJbmRleChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbykgeworICByZXR1cm4gbV9iUmljaFRleHQgJiYgV29yZEluZm8ucFdvcmRQcm9wcyA/IFdvcmRJbmZvLnBXb3JkUHJvcHMtPm5Gb250SW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBXb3JkSW5mby5uRm9udEluZGV4OworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBTdWJXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ2hhclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Ib3J6U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldvcmRUYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Xb3JkU3R5bGUpIHsKKyAgcmV0dXJuIChHZXRDaGFyV2lkdGgobkZvbnRJbmRleCwgV29yZCwgU3ViV29yZCwgbldvcmRTdHlsZSkgKiBmRm9udFNpemUgKgorICAgICAgICAgICAgICBQVlRfRk9OVFNDQUxFICsKKyAgICAgICAgICBmQ2hhclNwYWNlKSAqCisgICAgICAgICAgICAgbkhvcnpTY2FsZSAqIFBWVF9QRVJDRU5UICsKKyAgICAgICAgIGZXb3JkVGFpbDsKK30KK0ZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkV2lkdGgoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8pIHsKKyAgcmV0dXJuIEdldFdvcmRXaWR0aCgKKyAgICAgIEdldFdvcmRGb250SW5kZXgoV29yZEluZm8pLCBXb3JkSW5mby5Xb3JkLCBHZXRTdWJXb3JkKCksCisgICAgICBHZXRDaGFyU3BhY2UoV29yZEluZm8pLCBHZXRIb3J6U2NhbGUoV29yZEluZm8pLCBHZXRXb3JkRm9udFNpemUoV29yZEluZm8pLAorICAgICAgV29yZEluZm8uZldvcmRUYWlsLAorICAgICAgV29yZEluZm8ucFdvcmRQcm9wcyA/IFdvcmRJbmZvLnBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgOiAwKTsKK30KK0ZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lQXNjZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pIHsKKyAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFdvcmRQcm9wcworICAgICAgICAgICAgID8gR2V0Rm9udEFzY2VudChTZWNJbmZvLnBXb3JkUHJvcHMtPm5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY0luZm8ucFdvcmRQcm9wcy0+ZkZvbnRTaXplKQorICAgICAgICAgICAgIDogR2V0Rm9udEFzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVEZXNjZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pIHsKKyAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFdvcmRQcm9wcworICAgICAgICAgICAgID8gR2V0Rm9udERlc2NlbnQoU2VjSW5mby5wV29yZFByb3BzLT5uRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjSW5mby5wV29yZFByb3BzLT5mRm9udFNpemUpCisgICAgICAgICAgICAgOiBHZXRGb250RGVzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEZvbnRBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIHJldHVybiAoRlhfRkxPQVQpR2V0VHlwZUFzY2VudChuRm9udEluZGV4KSAqIGZGb250U2l6ZSAqIFBWVF9GT05UU0NBTEU7Cit9CitGWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Rm9udERlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICByZXR1cm4gKEZYX0ZMT0FUKUdldFR5cGVEZXNjZW50KG5Gb250SW5kZXgpICogZkZvbnRTaXplICogUFZUX0ZPTlRTQ0FMRTsKK30KK0ZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIHJldHVybiBHZXRGb250QXNjZW50KEdldFdvcmRGb250SW5kZXgoV29yZEluZm8pLCBmRm9udFNpemUpOworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICByZXR1cm4gR2V0Rm9udERlc2NlbnQoR2V0V29yZEZvbnRJbmRleChXb3JkSW5mbyksIGZGb250U2l6ZSk7Cit9CitGWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEFzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZhY3RGb250U2l6ZSkgeworICByZXR1cm4gR2V0Rm9udEFzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgR2V0V29yZEZvbnRTaXplKFdvcmRJbmZvLCBiRmFjdEZvbnRTaXplKSk7Cit9CitGWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmFjdEZvbnRTaXplKSB7CisgIHJldHVybiBHZXRGb250RGVzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldFdvcmRGb250U2l6ZShXb3JkSW5mbywgYkZhY3RGb250U2l6ZSkpOworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVMZWFkaW5nKGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pIHsKKyAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFNlY1Byb3BzID8gU2VjSW5mby5wU2VjUHJvcHMtPmZMaW5lTGVhZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX2ZMaW5lTGVhZGluZzsKK30KK0ZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lSW5kZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pIHsKKyAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFNlY1Byb3BzID8gU2VjSW5mby5wU2VjUHJvcHMtPmZMaW5lSW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAuMGY7Cit9CitpbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXRBbGlnbm1lbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbykgeworICByZXR1cm4gbV9iUmljaFRleHQgJiYgU2VjSW5mby5wU2VjUHJvcHMgPyBTZWNJbmZvLnBTZWNQcm9wcy0+bkFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX25BbGlnbm1lbnQ7Cit9CitGWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Q2hhclNwYWNlKGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvKSB7CisgIHJldHVybiBtX2JSaWNoVGV4dCAmJiBXb3JkSW5mby5wV29yZFByb3BzID8gV29yZEluZm8ucFdvcmRQcm9wcy0+ZkNoYXJTcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fZkNoYXJTcGFjZTsKK30KK2ludDMyX3QgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEhvcnpTY2FsZShjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbykgeworICByZXR1cm4gbV9iUmljaFRleHQgJiYgV29yZEluZm8ucFdvcmRQcm9wcyA/IFdvcmRJbmZvLnBXb3JkUHJvcHMtPm5Ib3J6U2NhbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX25Ib3J6U2NhbGU7Cit9Cit2b2lkIENQREZfVmFyaWFibGVUZXh0OjpDbGVhclNlY3Rpb25SaWdodFdvcmRzKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgeworICBDUFZUX1dvcmRQbGFjZSB3b3JkcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpOworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIGZvciAoaW50MzJfdCB3ID0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSAtIDE7CisgICAgICAgICB3ID4gd29yZHBsYWNlLm5Xb3JkSW5kZXg7IHctLSkgeworICAgICAgZGVsZXRlIHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KTsKKyAgICAgIHBTZWN0aW9uLT5tX1dvcmRBcnJheS5SZW1vdmVBdCh3KTsKICAgICB9CisgIH0KK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmV2T3JOZXh0KSBjb25zdCB7CisgIGlmIChwbGFjZS5uV29yZEluZGV4IDwgMCAmJiBwbGFjZS5uTGluZUluZGV4ID4gMCkgeworICAgIHJldHVybiBiUHJldk9yTmV4dCA/IEdldFByZXZXb3JkUGxhY2UocGxhY2UpIDogR2V0TmV4dFdvcmRQbGFjZShwbGFjZSk7CisgIH0KKyAgcmV0dXJuIHBsYWNlOworfQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJFbXB0eVNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7CisgIGlmIChwbGFjZS5uU2VjSW5kZXggPT0gMCAmJiBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgPT0gMSkgewogICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZMaW5lKCkKLXsKLSAgICBpZiAobV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKLSAgICAgICAgaWYgKG1fQ3VyUG9zLm5MaW5lSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgbV9DdXJQb3MubkxpbmVJbmRleCAtIDEsIC0xKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0N1clBvcy5uU2VjSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwTGFzdFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4IC0gMSkpIHsKLSAgICAgICAgICAgICAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCAtIDEsIHBMYXN0U2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMSwgLTEpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIH0KKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBpZiAocFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSA9PSAwKSB7CisgICAgICBkZWxldGUgcFNlY3Rpb247CisgICAgICBtX1NlY3Rpb25BcnJheS5SZW1vdmVBdChwbGFjZS5uU2VjSW5kZXgpOworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpOZXh0U2VjdGlvbigpCi17Cit2b2lkIENQREZfVmFyaWFibGVUZXh0OjpDbGVhckVtcHR5U2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpIHsKKyAgQ1BWVF9Xb3JkUGxhY2Ugd29yZHBsYWNlOworICBmb3IgKGludDMyX3QgcyA9IFBsYWNlUmFuZ2UuRW5kUG9zLm5TZWNJbmRleDsKKyAgICAgICBzID4gUGxhY2VSYW5nZS5CZWdpblBvcy5uU2VjSW5kZXg7IHMtLSkgeworICAgIHdvcmRwbGFjZS5uU2VjSW5kZXggPSBzOworICAgIENsZWFyRW1wdHlTZWN0aW9uKHdvcmRwbGFjZSk7CisgIH0KK30KK3ZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkxpbmtMYXR0ZXJTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgeworICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IEFqdXN0TGluZUhlYWRlcihwbGFjZSwgVFJVRSk7CisgIGlmIChDU2VjdGlvbiogcE5leHRTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4ICsgMSkpIHsKKyAgICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQob2xkcGxhY2UublNlY0luZGV4KSkgeworICAgICAgZm9yIChpbnQzMl90IHcgPSAwLCBzeiA9IHBOZXh0U2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOyB3IDwgc3o7CisgICAgICAgICAgIHcrKykgeworICAgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBwTmV4dFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHcpKSB7CisgICAgICAgICAgb2xkcGxhY2UubldvcmRJbmRleCsrOworICAgICAgICAgIHBTZWN0aW9uLT5BZGRXb3JkKG9sZHBsYWNlLCAqcFdvcmQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGRlbGV0ZSBwTmV4dFNlY3Rpb247CisgICAgbV9TZWN0aW9uQXJyYXkuUmVtb3ZlQXQocGxhY2UublNlY0luZGV4ICsgMSk7CisgIH0KK30KK3ZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpIHsKKyAgQ1BWVF9Xb3JkUmFuZ2UgTmV3UmFuZ2U7CisgIE5ld1JhbmdlLkJlZ2luUG9zID0gQWp1c3RMaW5lSGVhZGVyKFBsYWNlUmFuZ2UuQmVnaW5Qb3MsIFRSVUUpOworICBOZXdSYW5nZS5FbmRQb3MgPSBBanVzdExpbmVIZWFkZXIoUGxhY2VSYW5nZS5FbmRQb3MsIFRSVUUpOworICBmb3IgKGludDMyX3QgcyA9IE5ld1JhbmdlLkVuZFBvcy5uU2VjSW5kZXg7IHMgPj0gTmV3UmFuZ2UuQmVnaW5Qb3MublNlY0luZGV4OworICAgICAgIHMtLSkgeworICAgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChzKSkgeworICAgICAgcFNlY3Rpb24tPkNsZWFyV29yZHMoTmV3UmFuZ2UpOworICAgIH0KKyAgfQorfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyTGVmdFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgQ1BWVF9Xb3JkUGxhY2UgbGVmdHBsYWNlID0gR2V0UHJldldvcmRQbGFjZShwbGFjZSk7CisgICAgaWYgKGxlZnRwbGFjZSAhPSBwbGFjZSkgeworICAgICAgaWYgKGxlZnRwbGFjZS5uU2VjSW5kZXggIT0gcGxhY2UublNlY0luZGV4KSB7CisgICAgICAgIGlmIChwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpID09IDApIHsKKyAgICAgICAgICBDbGVhckVtcHR5U2VjdGlvbihwbGFjZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTGlua0xhdHRlclNlY3Rpb24obGVmdHBsYWNlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcFNlY3Rpb24tPkNsZWFyV29yZChwbGFjZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZWZ0cGxhY2U7CisgIH0KKyAgcmV0dXJuIHBsYWNlOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyUmlnaHRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgeworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIENQVlRfV29yZFBsYWNlIHJpZ2h0cGxhY2UgPSBBanVzdExpbmVIZWFkZXIoR2V0TmV4dFdvcmRQbGFjZShwbGFjZSksIEZBTFNFKTsKKyAgICBpZiAocmlnaHRwbGFjZSAhPSBwbGFjZSkgeworICAgICAgaWYgKHJpZ2h0cGxhY2UublNlY0luZGV4ICE9IHBsYWNlLm5TZWNJbmRleCkgeworICAgICAgICBMaW5rTGF0dGVyU2VjdGlvbihwbGFjZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwU2VjdGlvbi0+Q2xlYXJXb3JkKHJpZ2h0cGxhY2UpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcGxhY2U7Cit9Cit2b2lkIENQREZfVmFyaWFibGVUZXh0OjpSZWFycmFuZ2VBbGwoKSB7CisgIFJlYXJyYW5nZShDUFZUX1dvcmRSYW5nZShHZXRCZWdpbldvcmRQbGFjZSgpLCBHZXRFbmRXb3JkUGxhY2UoKSkpOworfQordm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSYgUGxhY2VSYW5nZSkgeworICBSZWFycmFuZ2UoUGxhY2VSYW5nZSk7Cit9CitDUFZUX0Zsb2F0UmVjdCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVhcnJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKSB7CisgIENQVlRfRmxvYXRSZWN0IHJjUmV0OworICBpZiAoSXNWYWxpZCgpKSB7CisgICAgaWYgKG1fYkF1dG9Gb250U2l6ZSkgeworICAgICAgU2V0Rm9udFNpemUoR2V0QXV0b0ZvbnRTaXplKCkpOworICAgICAgcmNSZXQgPSBSZWFycmFuZ2VTZWN0aW9ucygKKyAgICAgICAgICBDUFZUX1dvcmRSYW5nZShHZXRCZWdpbldvcmRQbGFjZSgpLCBHZXRFbmRXb3JkUGxhY2UoKSkpOworICAgIH0gZWxzZSB7CisgICAgICByY1JldCA9IFJlYXJyYW5nZVNlY3Rpb25zKFBsYWNlUmFuZ2UpOworICAgIH0KKyAgfQorICBTZXRDb250ZW50UmVjdChyY1JldCk7CisgIHJldHVybiByY1JldDsKK30KK0ZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRBdXRvRm9udFNpemUoKSB7CisgIGludDMyX3QgblRvdGFsID0gc2l6ZW9mKGdGb250U2l6ZVN0ZXBzKSAvIHNpemVvZih1aW50OF90KTsKKyAgaWYgKElzTXVsdGlMaW5lKCkpIHsKKyAgICBuVG90YWwgLz0gNDsKKyAgfQorICBpZiAoblRvdGFsIDw9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoR2V0UGxhdGVXaWR0aCgpIDw9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQzMl90IG5MZWZ0ID0gMDsKKyAgaW50MzJfdCBuUmlnaHQgPSBuVG90YWwgLSAxOworICBpbnQzMl90IG5NaWQgPSBuVG90YWwgLyAyOworICB3aGlsZSAobkxlZnQgPD0gblJpZ2h0KSB7CisgICAgaWYgKElzQmlnZ2VyKGdGb250U2l6ZVN0ZXBzW25NaWRdKSkgeworICAgICAgblJpZ2h0ID0gbk1pZCAtIDE7CisgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgeworICAgICAgbkxlZnQgPSBuTWlkICsgMTsKKyAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgfQorICByZXR1cm4gKEZYX0ZMT0FUKWdGb250U2l6ZVN0ZXBzW25NaWRdOworfQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6SXNCaWdnZXIoRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIEZYX0JPT0wgYkJpZ2dlciA9IEZBTFNFOworICBDUFZUX1NpemUgc3pUb3RhbDsKKyAgZm9yIChpbnQzMl90IHMgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgcyA8IHN6OyBzKyspIHsKKyAgICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocykpIHsKKyAgICAgIENQVlRfU2l6ZSBzaXplID0gcFNlY3Rpb24tPkdldFNlY3Rpb25TaXplKGZGb250U2l6ZSk7CisgICAgICBzelRvdGFsLnggPSBGUERGX01BWChzaXplLngsIHN6VG90YWwueCk7CisgICAgICBzelRvdGFsLnkgKz0gc2l6ZS55OworICAgICAgaWYgKElzRmxvYXRCaWdnZXIoc3pUb3RhbC54LCBHZXRQbGF0ZVdpZHRoKCkpIHx8CisgICAgICAgICAgSXNGbG9hdEJpZ2dlcihzelRvdGFsLnksIEdldFBsYXRlSGVpZ2h0KCkpKSB7CisgICAgICAgIGJCaWdnZXIgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGJCaWdnZXI7Cit9CitDUFZUX0Zsb2F0UmVjdCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVhcnJhbmdlU2VjdGlvbnMoCisgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpIHsKKyAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2U7CisgIEZYX0ZMT0FUIGZQb3NZID0gMDsKKyAgRlhfRkxPQVQgZk9sZEhlaWdodDsKKyAgaW50MzJfdCBuU1NlY0luZGV4ID0gUGxhY2VSYW5nZS5CZWdpblBvcy5uU2VjSW5kZXg7CisgIGludDMyX3QgbkVTZWNJbmRleCA9IFBsYWNlUmFuZ2UuRW5kUG9zLm5TZWNJbmRleDsKKyAgQ1BWVF9GbG9hdFJlY3QgcmNSZXQ7CisgIGZvciAoaW50MzJfdCBzID0gMCwgc3ogPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCk7IHMgPCBzejsgcysrKSB7CisgICAgcGxhY2UublNlY0luZGV4ID0gczsKKyAgICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocykpIHsKKyAgICAgIHBTZWN0aW9uLT5TZWNQbGFjZSA9IHBsYWNlOworICAgICAgQ1BWVF9GbG9hdFJlY3QgcmNTZWMgPSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbjsKKyAgICAgIGlmIChzID49IG5TU2VjSW5kZXgpIHsKKyAgICAgICAgaWYgKHMgPD0gbkVTZWNJbmRleCkgeworICAgICAgICAgIHJjU2VjID0gcFNlY3Rpb24tPlJlYXJyYW5nZSgpOworICAgICAgICAgIHJjU2VjLnRvcCArPSBmUG9zWTsKKyAgICAgICAgICByY1NlYy5ib3R0b20gKz0gZlBvc1k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZk9sZEhlaWdodCA9IHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmJvdHRvbSAtCisgICAgICAgICAgICAgICAgICAgICAgIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcDsKKyAgICAgICAgICByY1NlYy50b3AgPSBmUG9zWTsKKyAgICAgICAgICByY1NlYy5ib3R0b20gPSBmUG9zWSArIGZPbGRIZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24gPSByY1NlYzsKKyAgICAgICAgcFNlY3Rpb24tPlJlc2V0TGluZVBsYWNlKCk7CisgICAgICB9CisgICAgICBpZiAocyA9PSAwKSB7CisgICAgICAgIHJjUmV0ID0gcmNTZWM7CisgICAgICB9IGVsc2UgeworICAgICAgICByY1JldC5sZWZ0ID0gRlBERl9NSU4ocmNTZWMubGVmdCwgcmNSZXQubGVmdCk7CisgICAgICAgIHJjUmV0LnRvcCA9IEZQREZfTUlOKHJjU2VjLnRvcCwgcmNSZXQudG9wKTsKKyAgICAgICAgcmNSZXQucmlnaHQgPSBGUERGX01BWChyY1NlYy5yaWdodCwgcmNSZXQucmlnaHQpOworICAgICAgICByY1JldC5ib3R0b20gPSBGUERGX01BWChyY1NlYy5ib3R0b20sIHJjUmV0LmJvdHRvbSk7CisgICAgICB9CisgICAgICBmUG9zWSArPSByY1NlYy5IZWlnaHQoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJjUmV0OworfQoraW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Q2hhcldpZHRoKGludDMyX3QgbkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIFdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBTdWJXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbldvcmRTdHlsZSkgeworICBpZiAoIW1fcFZUUHJvdmlkZXIpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoU3ViV29yZCA+IDApIHsKKyAgICByZXR1cm4gbV9wVlRQcm92aWRlci0+R2V0Q2hhcldpZHRoKG5Gb250SW5kZXgsIFN1YldvcmQsIG5Xb3JkU3R5bGUpOworICB9CisgIHJldHVybiBtX3BWVFByb3ZpZGVyLT5HZXRDaGFyV2lkdGgobkZvbnRJbmRleCwgV29yZCwgbldvcmRTdHlsZSk7Cit9CitpbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXRUeXBlQXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgeworICByZXR1cm4gbV9wVlRQcm92aWRlciA/IG1fcFZUUHJvdmlkZXItPkdldFR5cGVBc2NlbnQobkZvbnRJbmRleCkgOiAwOworfQoraW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0VHlwZURlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KSB7CisgIHJldHVybiBtX3BWVFByb3ZpZGVyID8gbV9wVlRQcm92aWRlci0+R2V0VHlwZURlc2NlbnQobkZvbnRJbmRleCkgOiAwOworfQoraW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4KSB7CisgIHJldHVybiBtX3BWVFByb3ZpZGVyCisgICAgICAgICAgICAgPyBtX3BWVFByb3ZpZGVyLT5HZXRXb3JkRm9udEluZGV4KHdvcmQsIGNoYXJzZXQsIG5Gb250SW5kZXgpCisgICAgICAgICAgICAgOiAtMTsKK30KK2ludDMyX3QgQ1BERl9WYXJpYWJsZVRleHQ6OkdldERlZmF1bHRGb250SW5kZXgoKSB7CisgIHJldHVybiBtX3BWVFByb3ZpZGVyID8gbV9wVlRQcm92aWRlci0+R2V0RGVmYXVsdEZvbnRJbmRleCgpIDogLTE7Cit9CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0OjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpIHsKKyAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5Jc0xhdGluV29yZCh3b3JkKSA6IEZBTFNFOworfQorSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIENQREZfVmFyaWFibGVUZXh0OjpHZXRJdGVyYXRvcigpIHsKKyAgaWYgKCFtX3BWVEl0ZXJhdG9yKSB7CisgICAgcmV0dXJuIG1fcFZUSXRlcmF0b3IgPSBGWF9ORVcgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IodGhpcyk7CisgIH0KKyAgcmV0dXJuIG1fcFZUSXRlcmF0b3I7Cit9CitJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciogQ1BERl9WYXJpYWJsZVRleHQ6OlNldFByb3ZpZGVyKAorICAgIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBwUHJvdmlkZXIpIHsKKyAgSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIqIHBPbGQgPSBtX3BWVFByb3ZpZGVyOworICBtX3BWVFByb3ZpZGVyID0gcFByb3ZpZGVyOworICByZXR1cm4gcE9sZDsKK30KK0NQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcihDUERGX1ZhcmlhYmxlVGV4dCogcFZUKQorICAgIDogbV9DdXJQb3MoLTEsIC0xLCAtMSksIG1fcFZUKHBWVCkge30KK0NQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjp+Q1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IoKSB7fQordm9pZCBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6U2V0QXQoaW50MzJfdCBuV29yZEluZGV4KSB7CisgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKKyAgbV9DdXJQb3MgPSBtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UobldvcmRJbmRleCk7Cit9Cit2b2lkIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKKyAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOworICBtX0N1clBvcyA9IHBsYWNlOworfQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6TmV4dFdvcmQoKSB7CisgIGlmIChtX0N1clBvcyA9PSBtX3BWVC0+R2V0RW5kV29yZFBsYWNlKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9DdXJQb3MgPSBtX3BWVC0+R2V0TmV4dFdvcmRQbGFjZShtX0N1clBvcyk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6UHJldldvcmQoKSB7CisgIGlmIChtX0N1clBvcyA9PSBtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX0N1clBvcyA9IG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fQ3VyUG9zKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpOZXh0TGluZSgpIHsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7CisgICAgaWYgKG1fQ3VyUG9zLm5MaW5lSW5kZXggPCBwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMSkgeworICAgICAgbV9DdXJQb3MgPQorICAgICAgICAgIENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgbV9DdXJQb3MubkxpbmVJbmRleCArIDEsIC0xKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KICAgICBpZiAobV9DdXJQb3MublNlY0luZGV4IDwgbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggKyAxLCAwLCAtMSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggKyAxLCAwLCAtMSk7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZTZWN0aW9uKCkKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2TGluZSgpIHsKKyAgaWYgKG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7CisgICAgaWYgKG1fQ3VyUG9zLm5MaW5lSW5kZXggPiAwKSB7CisgICAgICBtX0N1clBvcyA9CisgICAgICAgICAgQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4LCBtX0N1clBvcy5uTGluZUluZGV4IC0gMSwgLTEpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQogICAgIGlmIChtX0N1clBvcy5uU2VjSW5kZXggPiAwKSB7Ci0gICAgICAgIG1fQ3VyUG9zID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4IC0gMSwgMCwgLTEpOworICAgICAgaWYgKENTZWN0aW9uKiBwTGFzdFNlY3Rpb24gPQorICAgICAgICAgICAgICBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4IC0gMSkpIHsKKyAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXN0U2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMSwgLTEpOwogICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgd29yZC5Xb3JkUGxhY2UgPSBtX0N1clBvczsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIGlmIChwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQobV9DdXJQb3MubkxpbmVJbmRleCkpIHsKLSAgICAgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvICogcFdvcmQgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQobV9DdXJQb3MubldvcmRJbmRleCkpIHsKLSAgICAgICAgICAgICAgICB3b3JkLldvcmQgPSBwV29yZC0+V29yZDsKLSAgICAgICAgICAgICAgICB3b3JkLm5DaGFyc2V0ID0gcFdvcmQtPm5DaGFyc2V0OwotICAgICAgICAgICAgICAgIHdvcmQuZldpZHRoID0gbV9wVlQtPkdldFdvcmRXaWR0aCgqcFdvcmQpOwotICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkID0gbV9wVlQtPkluVG9PdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChwV29yZC0+ZldvcmRYICsgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFkgKyBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApICk7Ci0gICAgICAgICAgICAgICAgd29yZC5mQXNjZW50ID0gbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkKTsKLSAgICAgICAgICAgICAgICB3b3JkLmZEZXNjZW50ID0gbV9wVlQtPkdldFdvcmREZXNjZW50KCpwV29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBXb3JkLT5wV29yZFByb3BzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmQuV29yZFByb3BzID0gKnBXb3JkLT5wV29yZFByb3BzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3b3JkLm5Gb250SW5kZXggPSBtX3BWVC0+R2V0V29yZEZvbnRJbmRleCgqcFdvcmQpOwotICAgICAgICAgICAgICAgIHdvcmQuZkZvbnRTaXplID0gbV9wVlQtPkdldFdvcmRGb250U2l6ZSgqcFdvcmQpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6Ok5leHRTZWN0aW9uKCkgeworICBpZiAobV9DdXJQb3MublNlY0luZGV4IDwgbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpIHsKKyAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCArIDEsIDAsIC0xKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpCi17Ci0gICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKLSAgICAgICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChtX0N1clBvcy5uV29yZEluZGV4KSkgewotICAgICAgICAgICAgaWYgKHBXb3JkLT5wV29yZFByb3BzKSB7Ci0gICAgICAgICAgICAgICAgKnBXb3JkLT5wV29yZFByb3BzID0gd29yZC5Xb3JkUHJvcHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2U2VjdGlvbigpIHsKKyAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOworICBpZiAobV9DdXJQb3MublNlY0luZGV4ID4gMCkgeworICAgIG1fQ3VyUG9zID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4IC0gMSwgMCwgLTEpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgbGluZS5saW5lcGxhY2UgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIG1fQ3VyUG9zLm5MaW5lSW5kZXgsIC0xKTsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIGlmIChDTGluZSAqIHBMaW5lID0gcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KG1fQ3VyUG9zLm5MaW5lSW5kZXgpKSB7Ci0gICAgICAgICAgICBsaW5lLnB0TGluZSA9IG1fcFZULT5JblRvT3V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChwTGluZS0+bV9MaW5lSW5mby5mTGluZVggKyBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVkgKyBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApICk7Ci0gICAgICAgICAgICBsaW5lLmZMaW5lV2lkdGggPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVdpZHRoOwotICAgICAgICAgICAgbGluZS5mTGluZUFzY2VudCA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lQXNjZW50OwotICAgICAgICAgICAgbGluZS5mTGluZURlc2NlbnQgPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZURlc2NlbnQ7Ci0gICAgICAgICAgICBsaW5lLmxpbmVFbmQgPSBwTGluZS0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldFdvcmQoQ1BWVF9Xb3JkJiB3b3JkKSBjb25zdCB7CisgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKKyAgd29yZC5Xb3JkUGxhY2UgPSBtX0N1clBvczsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7CisgICAgaWYgKHBTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRBdChtX0N1clBvcy5uTGluZUluZGV4KSkgeworICAgICAgaWYgKENQVlRfV29yZEluZm8qIHBXb3JkID0KKyAgICAgICAgICAgICAgcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KG1fQ3VyUG9zLm5Xb3JkSW5kZXgpKSB7CisgICAgICAgIHdvcmQuV29yZCA9IHBXb3JkLT5Xb3JkOworICAgICAgICB3b3JkLm5DaGFyc2V0ID0gcFdvcmQtPm5DaGFyc2V0OworICAgICAgICB3b3JkLmZXaWR0aCA9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKTsKKyAgICAgICAgd29yZC5wdFdvcmQgPSBtX3BWVC0+SW5Ub091dCgKKyAgICAgICAgICAgIENQREZfUG9pbnQocFdvcmQtPmZXb3JkWCArIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFkgKyBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApKTsKKyAgICAgICAgd29yZC5mQXNjZW50ID0gbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkKTsKKyAgICAgICAgd29yZC5mRGVzY2VudCA9IG1fcFZULT5HZXRXb3JkRGVzY2VudCgqcFdvcmQpOworICAgICAgICBpZiAocFdvcmQtPnBXb3JkUHJvcHMpIHsKKyAgICAgICAgICB3b3JkLldvcmRQcm9wcyA9ICpwV29yZC0+cFdvcmRQcm9wczsKICAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwotICAgIHNlY3Rpb24uc2VjcGxhY2UgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIDAsIC0xKTsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIHNlY3Rpb24ucmNTZWN0aW9uID0gbV9wVlQtPkluVG9PdXQocFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24pOwotICAgICAgICBpZiAocFNlY3Rpb24tPm1fU2VjSW5mby5wU2VjUHJvcHMpIHsKLSAgICAgICAgICAgIHNlY3Rpb24uU2VjUHJvcHMgPSAqcFNlY3Rpb24tPm1fU2VjSW5mby5wU2VjUHJvcHM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBTZWN0aW9uLT5tX1NlY0luZm8ucFdvcmRQcm9wcykgewotICAgICAgICAgICAgc2VjdGlvbi5Xb3JkUHJvcHMgPSAqcFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzOwotICAgICAgICB9CisgICAgICAgIHdvcmQubkZvbnRJbmRleCA9IG1fcFZULT5HZXRXb3JkRm9udEluZGV4KCpwV29yZCk7CisgICAgICAgIHdvcmQuZkZvbnRTaXplID0gbV9wVlQtPkdldFdvcmRGb250U2l6ZSgqcFdvcmQpOwogICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlNldFNlY3Rpb24oY29uc3QgQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgewotICAgICAgICBpZiAocFNlY3Rpb24tPm1fU2VjSW5mby5wU2VjUHJvcHMpIHsKLSAgICAgICAgICAgICpwU2VjdGlvbi0+bV9TZWNJbmZvLnBTZWNQcm9wcyA9IHNlY3Rpb24uU2VjUHJvcHM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBTZWN0aW9uLT5tX1NlY0luZm8ucFdvcmRQcm9wcykgewotICAgICAgICAgICAgKnBTZWN0aW9uLT5tX1NlY0luZm8ucFdvcmRQcm9wcyA9IHNlY3Rpb24uV29yZFByb3BzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6U2V0V29yZChjb25zdCBDUFZUX1dvcmQmIHdvcmQpIHsKKyAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKKyAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPQorICAgICAgICAgICAgcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KG1fQ3VyUG9zLm5Xb3JkSW5kZXgpKSB7CisgICAgICBpZiAocFdvcmQtPnBXb3JkUHJvcHMpIHsKKyAgICAgICAgKnBXb3JkLT5wV29yZFByb3BzID0gd29yZC5Xb3JkUHJvcHM7CisgICAgICB9CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldExpbmUoQ1BWVF9MaW5lJiBsaW5lKSBjb25zdCB7CisgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKKyAgbGluZS5saW5lcGxhY2UgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIG1fQ3VyUG9zLm5MaW5lSW5kZXgsIC0xKTsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7CisgICAgaWYgKENMaW5lKiBwTGluZSA9IHBTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRBdChtX0N1clBvcy5uTGluZUluZGV4KSkgeworICAgICAgbGluZS5wdExpbmUgPSBtX3BWVC0+SW5Ub091dChDUERGX1BvaW50KAorICAgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCArIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsCisgICAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVZICsgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24udG9wKSk7CisgICAgICBsaW5lLmZMaW5lV2lkdGggPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVdpZHRoOworICAgICAgbGluZS5mTGluZUFzY2VudCA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lQXNjZW50OworICAgICAgbGluZS5mTGluZURlc2NlbnQgPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZURlc2NlbnQ7CisgICAgICBsaW5lLmxpbmVFbmQgPSBwTGluZS0+R2V0RW5kV29yZFBsYWNlKCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6R2V0U2VjdGlvbihDUFZUX1NlY3Rpb24mIHNlY3Rpb24pIGNvbnN0IHsKKyAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOworICBzZWN0aW9uLnNlY3BsYWNlID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4LCAwLCAtMSk7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgeworICAgIHNlY3Rpb24ucmNTZWN0aW9uID0gbV9wVlQtPkluVG9PdXQocFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24pOworICAgIGlmIChwU2VjdGlvbi0+bV9TZWNJbmZvLnBTZWNQcm9wcykgeworICAgICAgc2VjdGlvbi5TZWNQcm9wcyA9ICpwU2VjdGlvbi0+bV9TZWNJbmZvLnBTZWNQcm9wczsKKyAgICB9CisgICAgaWYgKHBTZWN0aW9uLT5tX1NlY0luZm8ucFdvcmRQcm9wcykgeworICAgICAgc2VjdGlvbi5Xb3JkUHJvcHMgPSAqcFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiYgc2VjdGlvbikgeworICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgeworICAgIGlmIChwU2VjdGlvbi0+bV9TZWNJbmZvLnBTZWNQcm9wcykgeworICAgICAgKnBTZWN0aW9uLT5tX1NlY0luZm8ucFNlY1Byb3BzID0gc2VjdGlvbi5TZWNQcm9wczsKKyAgICB9CisgICAgaWYgKHBTZWN0aW9uLT5tX1NlY0luZm8ucFdvcmRQcm9wcykgeworICAgICAgKnBTZWN0aW9uLT5tX1NlY0luZm8ucFdvcmRQcm9wcyA9IHNlY3Rpb24uV29yZFByb3BzOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY192dG1vZHVsZS5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY192dG1vZHVsZS5jcHAKaW5kZXggODBiZTNmMS4uZWZiOWQyMiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdnRtb2R1bGUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3Z0bW9kdWxlLmNwcApAQCAtNywxMSArNyw5IEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIKICNpbmNsdWRlICJwZGZfdnQuaCIKLUlQREZfVmFyaWFibGVUZXh0KiBJUERGX1ZhcmlhYmxlVGV4dDo6TmV3VmFyaWFibGVUZXh0KCkKLXsKLSAgICByZXR1cm4gRlhfTkVXIENQREZfVmFyaWFibGVUZXh0KCk7CitJUERGX1ZhcmlhYmxlVGV4dCogSVBERl9WYXJpYWJsZVRleHQ6Ok5ld1ZhcmlhYmxlVGV4dCgpIHsKKyAgcmV0dXJuIEZYX05FVyBDUERGX1ZhcmlhYmxlVGV4dCgpOwogfQotdm9pZCBJUERGX1ZhcmlhYmxlVGV4dDo6RGVsVmFyaWFibGVUZXh0KElQREZfVmFyaWFibGVUZXh0KiBwVlQpCi17Ci0gICAgZGVsZXRlIChDUERGX1ZhcmlhYmxlVGV4dCopcFZUOwordm9pZCBJUERGX1ZhcmlhYmxlVGV4dDo6RGVsVmFyaWFibGVUZXh0KElQREZfVmFyaWFibGVUZXh0KiBwVlQpIHsKKyAgZGVsZXRlIChDUERGX1ZhcmlhYmxlVGV4dCopcFZUOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9wZGZfdnQuaCBiL2NvcmUvc3JjL2ZwZGZkb2MvcGRmX3Z0LmgKaW5kZXggYmFmMzYyNS4uNzI4ZGJiZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9wZGZfdnQuaAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL3BkZl92dC5oCkBAIC0xOSw2MTkgKzE5LDUzMSBAQAogY2xhc3MgQ1BERl9FZGl0Q29udGFpbmVyOwogY2xhc3MgQ1BERl9WYXJpYWJsZVRleHQ7CiBjbGFzcyBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjsKLSNkZWZpbmUgSXNGbG9hdFplcm8oZikJCQkJCQkoKGYpIDwgMC4wMDAxICYmIChmKSA+IC0wLjAwMDEpCi0jZGVmaW5lIElzRmxvYXRCaWdnZXIoZmEsZmIpCQkJCSgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSxmYikJCQkJKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCi10ZW1wbGF0ZTxjbGFzcyBUPiBUIEZQREZfTUlOIChjb25zdCBUICYgaSwgY29uc3QgVCAmIGopCi17Ci0gICAgcmV0dXJuICgoaSA8IGopID8gaSA6IGopOworI2RlZmluZSBJc0Zsb2F0WmVybyhmKSAoKGYpIDwgMC4wMDAxICYmIChmKSA+IC0wLjAwMDEpCisjZGVmaW5lIElzRmxvYXRCaWdnZXIoZmEsIGZiKSAoKGZhKSA+IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKKyNkZWZpbmUgSXNGbG9hdFNtYWxsZXIoZmEsIGZiKSAoKGZhKSA8IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKK3RlbXBsYXRlIDxjbGFzcyBUPgorVCBGUERGX01JTihjb25zdCBUJiBpLCBjb25zdCBUJiBqKSB7CisgIHJldHVybiAoKGkgPCBqKSA/IGkgOiBqKTsKIH0KLXRlbXBsYXRlPGNsYXNzIFQ+IFQgRlBERl9NQVggKGNvbnN0IFQgJiBpLCBjb25zdCBUICYgaikKLXsKLSAgICByZXR1cm4gKChpID4gaikgPyBpIDogaik7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1QgRlBERl9NQVgoY29uc3QgVCYgaSwgY29uc3QgVCYgaikgeworICByZXR1cm4gKChpID4gaikgPyBpIDogaik7CiB9Ci1jbGFzcyBDUFZUX1NpemUKLXsKLXB1YmxpYzoKLSAgICBDUFZUX1NpemUoKSA6IHgoMC4wZiksIHkoMC4wZikKLSAgICB7Ci0gICAgfQotICAgIENQVlRfU2l6ZShGWF9GTE9BVCBvdGhlcl94LCBGWF9GTE9BVCBvdGhlcl95KQotICAgIHsKLSAgICAgICAgeCA9IG90aGVyX3g7Ci0gICAgICAgIHkgPSBvdGhlcl95OwotICAgIH0KLSAgICBGWF9GTE9BVCB4LCB5OworY2xhc3MgQ1BWVF9TaXplIHsKKyBwdWJsaWM6CisgIENQVlRfU2l6ZSgpIDogeCgwLjBmKSwgeSgwLjBmKSB7fQorICBDUFZUX1NpemUoRlhfRkxPQVQgb3RoZXJfeCwgRlhfRkxPQVQgb3RoZXJfeSkgeworICAgIHggPSBvdGhlcl94OworICAgIHkgPSBvdGhlcl95OworICB9CisgIEZYX0ZMT0FUIHgsIHk7CiB9OwotY2xhc3MgQ1BWVF9GbG9hdFJlY3QgOiBwdWJsaWMgQ0ZYX0Zsb2F0UmVjdAotewotcHVibGljOgotICAgIENQVlRfRmxvYXRSZWN0KCkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSB0b3AgPSByaWdodCA9IGJvdHRvbSA9IDAuMGY7Ci0gICAgfQotICAgIENQVlRfRmxvYXRSZWN0KEZYX0ZMT0FUIG90aGVyX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfdG9wLAotICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3JpZ2h0LAotICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2JvdHRvbSkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSBvdGhlcl9sZWZ0OwotICAgICAgICB0b3AgPSBvdGhlcl90b3A7Ci0gICAgICAgIHJpZ2h0ID0gb3RoZXJfcmlnaHQ7Ci0gICAgICAgIGJvdHRvbSA9IG90aGVyX2JvdHRvbTsKLSAgICB9Ci0gICAgQ1BWVF9GbG9hdFJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSByZWN0LmxlZnQ7Ci0gICAgICAgIHRvcCA9IHJlY3QudG9wOwotICAgICAgICByaWdodCA9IHJlY3QucmlnaHQ7Ci0gICAgICAgIGJvdHRvbSA9IHJlY3QuYm90dG9tOwotICAgIH0KLSAgICB2b2lkIERlZmF1bHQoKQotICAgIHsKLSAgICAgICAgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMC4wZjsKLSAgICB9Ci0gICAgRlhfRkxPQVQgSGVpZ2h0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmICh0b3AgPiBib3R0b20pCi0gICAgICAgICAgICByZXR1cm4gdG9wIC0gYm90dG9tOwotICAgICAgICByZXR1cm4gYm90dG9tIC0gdG9wOwotICAgIH0KK2NsYXNzIENQVlRfRmxvYXRSZWN0IDogcHVibGljIENGWF9GbG9hdFJlY3QgeworIHB1YmxpYzoKKyAgQ1BWVF9GbG9hdFJlY3QoKSB7IGxlZnQgPSB0b3AgPSByaWdodCA9IGJvdHRvbSA9IDAuMGY7IH0KKyAgQ1BWVF9GbG9hdFJlY3QoRlhfRkxPQVQgb3RoZXJfbGVmdCwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfdG9wLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl9yaWdodCwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfYm90dG9tKSB7CisgICAgbGVmdCA9IG90aGVyX2xlZnQ7CisgICAgdG9wID0gb3RoZXJfdG9wOworICAgIHJpZ2h0ID0gb3RoZXJfcmlnaHQ7CisgICAgYm90dG9tID0gb3RoZXJfYm90dG9tOworICB9CisgIENQVlRfRmxvYXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICAgIGxlZnQgPSByZWN0LmxlZnQ7CisgICAgdG9wID0gcmVjdC50b3A7CisgICAgcmlnaHQgPSByZWN0LnJpZ2h0OworICAgIGJvdHRvbSA9IHJlY3QuYm90dG9tOworICB9CisgIHZvaWQgRGVmYXVsdCgpIHsgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMC4wZjsgfQorICBGWF9GTE9BVCBIZWlnaHQoKSBjb25zdCB7CisgICAgaWYgKHRvcCA+IGJvdHRvbSkKKyAgICAgIHJldHVybiB0b3AgLSBib3R0b207CisgICAgcmV0dXJuIGJvdHRvbSAtIHRvcDsKKyAgfQogfTsKIHN0cnVjdCBDUFZUX1NlY3Rpb25JbmZvIHsKLSAgICBDUFZUX1NlY3Rpb25JbmZvKCkgOiByY1NlY3Rpb24oKSwgblRvdGFsTGluZSgwKSwgcFNlY1Byb3BzKE5VTEwpLCBwV29yZFByb3BzKE5VTEwpCi0gICAgeworICBDUFZUX1NlY3Rpb25JbmZvKCkKKyAgICAgIDogcmNTZWN0aW9uKCksIG5Ub3RhbExpbmUoMCksIHBTZWNQcm9wcyhOVUxMKSwgcFdvcmRQcm9wcyhOVUxMKSB7fQorICB2aXJ0dWFsIH5DUFZUX1NlY3Rpb25JbmZvKCkgeworICAgIGRlbGV0ZSBwU2VjUHJvcHM7CisgICAgZGVsZXRlIHBXb3JkUHJvcHM7CisgIH0KKyAgQ1BWVF9TZWN0aW9uSW5mbyhjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBvdGhlcikKKyAgICAgIDogcmNTZWN0aW9uKCksIG5Ub3RhbExpbmUoMCksIHBTZWNQcm9wcyhOVUxMKSwgcFdvcmRQcm9wcyhOVUxMKSB7CisgICAgb3BlcmF0b3I9KG90aGVyKTsKKyAgfQorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBvdGhlcikgeworICAgIGlmICh0aGlzID09ICZvdGhlcikgeworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICB2aXJ0dWFsIH5DUFZUX1NlY3Rpb25JbmZvKCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSBwU2VjUHJvcHM7Ci0gICAgICAgIGRlbGV0ZSBwV29yZFByb3BzOworICAgIHJjU2VjdGlvbiA9IG90aGVyLnJjU2VjdGlvbjsKKyAgICBuVG90YWxMaW5lID0gb3RoZXIublRvdGFsTGluZTsKKyAgICBpZiAob3RoZXIucFNlY1Byb3BzKSB7CisgICAgICBpZiAocFNlY1Byb3BzKSB7CisgICAgICAgICpwU2VjUHJvcHMgPSAqb3RoZXIucFNlY1Byb3BzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcFNlY1Byb3BzID0gRlhfTkVXIENQVlRfU2VjUHJvcHMoKm90aGVyLnBTZWNQcm9wcyk7CisgICAgICB9CiAgICAgfQotICAgIENQVlRfU2VjdGlvbkluZm8oY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIG90aGVyKTogcmNTZWN0aW9uKCksIG5Ub3RhbExpbmUoMCksIHBTZWNQcm9wcyhOVUxMKSwgcFdvcmRQcm9wcyhOVUxMKQotICAgIHsKLSAgICAgICAgb3BlcmF0b3IgPSAob3RoZXIpOworICAgIGlmIChvdGhlci5wV29yZFByb3BzKSB7CisgICAgICBpZiAocFdvcmRQcm9wcykgeworICAgICAgICAqcFdvcmRQcm9wcyA9ICpvdGhlci5wV29yZFByb3BzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcFdvcmRQcm9wcyA9IEZYX05FVyBDUFZUX1dvcmRQcm9wcygqb3RoZXIucFdvcmRQcm9wcyk7CisgICAgICB9CiAgICAgfQotICAgIHZvaWQgb3BlcmF0b3IgPSAoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIG90aGVyKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gJm90aGVyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcmNTZWN0aW9uID0gb3RoZXIucmNTZWN0aW9uOwotICAgICAgICBuVG90YWxMaW5lID0gb3RoZXIublRvdGFsTGluZTsKLSAgICAgICAgaWYgKG90aGVyLnBTZWNQcm9wcykgewotICAgICAgICAgICAgaWYgKHBTZWNQcm9wcykgewotICAgICAgICAgICAgICAgICpwU2VjUHJvcHMgPSAqb3RoZXIucFNlY1Byb3BzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwU2VjUHJvcHMgPSBGWF9ORVcgQ1BWVF9TZWNQcm9wcygqb3RoZXIucFNlY1Byb3BzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAob3RoZXIucFdvcmRQcm9wcykgewotICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMpIHsKLSAgICAgICAgICAgICAgICAqcFdvcmRQcm9wcyA9ICpvdGhlci5wV29yZFByb3BzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwV29yZFByb3BzID0gRlhfTkVXIENQVlRfV29yZFByb3BzKCpvdGhlci5wV29yZFByb3BzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBDUFZUX0Zsb2F0UmVjdAkJCQlyY1NlY3Rpb247Ci0gICAgaW50MzJfdAkJCQkJblRvdGFsTGluZTsKLSAgICBDUFZUX1NlY1Byb3BzKgkJCQlwU2VjUHJvcHM7Ci0gICAgQ1BWVF9Xb3JkUHJvcHMqCQkJCXBXb3JkUHJvcHM7CisgIH0KKyAgQ1BWVF9GbG9hdFJlY3QgcmNTZWN0aW9uOworICBpbnQzMl90IG5Ub3RhbExpbmU7CisgIENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wczsKKyAgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHM7CiB9Owogc3RydWN0IENQVlRfTGluZUluZm8gewotICAgIENQVlRfTGluZUluZm8oKSA6IG5Ub3RhbFdvcmQoMCksIG5CZWdpbldvcmRJbmRleCgtMSksIG5FbmRXb3JkSW5kZXgoLTEpLAotICAgICAgICBmTGluZVgoMC4wZiksIGZMaW5lWSgwLjBmKSwgZkxpbmVXaWR0aCgwLjBmKSwgZkxpbmVBc2NlbnQoMC4wZiksIGZMaW5lRGVzY2VudCgwLjBmKQotICAgIHsKLSAgICB9Ci0gICAgaW50MzJfdAkJCQkJblRvdGFsV29yZDsKLSAgICBpbnQzMl90CQkJCQluQmVnaW5Xb3JkSW5kZXg7Ci0gICAgaW50MzJfdAkJCQkJbkVuZFdvcmRJbmRleDsKLSAgICBGWF9GTE9BVAkJCQkJZkxpbmVYOwotICAgIEZYX0ZMT0FUCQkJCQlmTGluZVk7Ci0gICAgRlhfRkxPQVQJCQkJCWZMaW5lV2lkdGg7Ci0gICAgRlhfRkxPQVQJCQkJCWZMaW5lQXNjZW50OwotICAgIEZYX0ZMT0FUCQkJCQlmTGluZURlc2NlbnQ7CisgIENQVlRfTGluZUluZm8oKQorICAgICAgOiBuVG90YWxXb3JkKDApLAorICAgICAgICBuQmVnaW5Xb3JkSW5kZXgoLTEpLAorICAgICAgICBuRW5kV29yZEluZGV4KC0xKSwKKyAgICAgICAgZkxpbmVYKDAuMGYpLAorICAgICAgICBmTGluZVkoMC4wZiksCisgICAgICAgIGZMaW5lV2lkdGgoMC4wZiksCisgICAgICAgIGZMaW5lQXNjZW50KDAuMGYpLAorICAgICAgICBmTGluZURlc2NlbnQoMC4wZikge30KKyAgaW50MzJfdCBuVG90YWxXb3JkOworICBpbnQzMl90IG5CZWdpbldvcmRJbmRleDsKKyAgaW50MzJfdCBuRW5kV29yZEluZGV4OworICBGWF9GTE9BVCBmTGluZVg7CisgIEZYX0ZMT0FUIGZMaW5lWTsKKyAgRlhfRkxPQVQgZkxpbmVXaWR0aDsKKyAgRlhfRkxPQVQgZkxpbmVBc2NlbnQ7CisgIEZYX0ZMT0FUIGZMaW5lRGVzY2VudDsKIH07Ci1zdHJ1Y3QgQ1BWVF9Xb3JkSW5mbyAgewotICAgIENQVlRfV29yZEluZm8oKSA6IFdvcmQoMCksIG5DaGFyc2V0KDApLAotICAgICAgICBmV29yZFgoMC4wZiksIGZXb3JkWSgwLjBmKSwgZldvcmRUYWlsKDAuMGYpLCBuRm9udEluZGV4KC0xKSwgcFdvcmRQcm9wcyhOVUxMKQotICAgIHsKK3N0cnVjdCBDUFZUX1dvcmRJbmZvIHsKKyAgQ1BWVF9Xb3JkSW5mbygpCisgICAgICA6IFdvcmQoMCksCisgICAgICAgIG5DaGFyc2V0KDApLAorICAgICAgICBmV29yZFgoMC4wZiksCisgICAgICAgIGZXb3JkWSgwLjBmKSwKKyAgICAgICAgZldvcmRUYWlsKDAuMGYpLAorICAgICAgICBuRm9udEluZGV4KC0xKSwKKyAgICAgICAgcFdvcmRQcm9wcyhOVUxMKSB7fQorICBDUFZUX1dvcmRJbmZvKEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgaW50MzJfdCBmb250SW5kZXgsCisgICAgICAgICAgICAgICAgQ1BWVF9Xb3JkUHJvcHMqIHBQcm9wcykKKyAgICAgIDogV29yZCh3b3JkKSwKKyAgICAgICAgbkNoYXJzZXQoY2hhcnNldCksCisgICAgICAgIGZXb3JkWCgwLjBmKSwKKyAgICAgICAgZldvcmRZKDAuMGYpLAorICAgICAgICBmV29yZFRhaWwoMC4wZiksCisgICAgICAgIG5Gb250SW5kZXgoZm9udEluZGV4KSwKKyAgICAgICAgcFdvcmRQcm9wcyhwUHJvcHMpIHt9CisgIHZpcnR1YWwgfkNQVlRfV29yZEluZm8oKSB7IGRlbGV0ZSBwV29yZFByb3BzOyB9CisgIENQVlRfV29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkSW5mbyYgd29yZCkKKyAgICAgIDogV29yZCgwKSwKKyAgICAgICAgbkNoYXJzZXQoMCksCisgICAgICAgIGZXb3JkWCgwLjBmKSwKKyAgICAgICAgZldvcmRZKDAuMGYpLAorICAgICAgICBmV29yZFRhaWwoMC4wZiksCisgICAgICAgIG5Gb250SW5kZXgoLTEpLAorICAgICAgICBwV29yZFByb3BzKE5VTEwpIHsKKyAgICBvcGVyYXRvcj0od29yZCk7CisgIH0KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ1BWVF9Xb3JkSW5mbyYgd29yZCkgeworICAgIGlmICh0aGlzID09ICZ3b3JkKSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIENQVlRfV29yZEluZm8oRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGludDMyX3QgZm9udEluZGV4LCBDUFZUX1dvcmRQcm9wcyAqIHBQcm9wcyk6Ci0gICAgICAgIFdvcmQod29yZCksIG5DaGFyc2V0KGNoYXJzZXQpLCBmV29yZFgoMC4wZiksIGZXb3JkWSgwLjBmKSwgZldvcmRUYWlsKDAuMGYpLAotICAgICAgICBuRm9udEluZGV4KGZvbnRJbmRleCksIHBXb3JkUHJvcHMocFByb3BzKQotICAgIHsKKyAgICBXb3JkID0gd29yZC5Xb3JkOworICAgIG5DaGFyc2V0ID0gd29yZC5uQ2hhcnNldDsKKyAgICBuRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OworICAgIGlmICh3b3JkLnBXb3JkUHJvcHMpIHsKKyAgICAgIGlmIChwV29yZFByb3BzKSB7CisgICAgICAgICpwV29yZFByb3BzID0gKndvcmQucFdvcmRQcm9wczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBXb3JkUHJvcHMgPSBGWF9ORVcgQ1BWVF9Xb3JkUHJvcHMoKndvcmQucFdvcmRQcm9wcyk7CisgICAgICB9CiAgICAgfQotICAgIHZpcnR1YWwgfkNQVlRfV29yZEluZm8oKQotICAgIHsKLSAgICAgICAgZGVsZXRlIHBXb3JkUHJvcHM7Ci0gICAgfQotICAgIENQVlRfV29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIHdvcmQpOiBXb3JkKDApLCBuQ2hhcnNldCgwKSwKLSAgICAgICAgZldvcmRYKDAuMGYpLCBmV29yZFkoMC4wZiksIGZXb3JkVGFpbCgwLjBmKSwgbkZvbnRJbmRleCgtMSksIHBXb3JkUHJvcHMoTlVMTCkKLSAgICB7Ci0gICAgICAgIG9wZXJhdG9yID0gKHdvcmQpOwotICAgIH0KLSAgICB2b2lkIG9wZXJhdG9yID0gKGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gJndvcmQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBXb3JkID0gd29yZC5Xb3JkOwotICAgICAgICBuQ2hhcnNldCA9IHdvcmQubkNoYXJzZXQ7Ci0gICAgICAgIG5Gb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7Ci0gICAgICAgIGlmICh3b3JkLnBXb3JkUHJvcHMpIHsKLSAgICAgICAgICAgIGlmIChwV29yZFByb3BzKSB7Ci0gICAgICAgICAgICAgICAgKnBXb3JkUHJvcHMgPSAqd29yZC5wV29yZFByb3BzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwV29yZFByb3BzID0gRlhfTkVXIENQVlRfV29yZFByb3BzKCp3b3JkLnBXb3JkUHJvcHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEZYX1dPUkQJCQkJCQlXb3JkOwotICAgIGludDMyX3QJCQkJCW5DaGFyc2V0OwotICAgIEZYX0ZMT0FUCQkJCQlmV29yZFg7Ci0gICAgRlhfRkxPQVQJCQkJCWZXb3JkWTsKLSAgICBGWF9GTE9BVAkJCQkJZldvcmRUYWlsOwotICAgIGludDMyX3QJCQkJCW5Gb250SW5kZXg7Ci0gICAgQ1BWVF9Xb3JkUHJvcHMqCQkJCXBXb3JkUHJvcHM7CisgIH0KKyAgRlhfV09SRCBXb3JkOworICBpbnQzMl90IG5DaGFyc2V0OworICBGWF9GTE9BVCBmV29yZFg7CisgIEZYX0ZMT0FUIGZXb3JkWTsKKyAgRlhfRkxPQVQgZldvcmRUYWlsOworICBpbnQzMl90IG5Gb250SW5kZXg7CisgIENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzOwogfTsKIHN0cnVjdCBDUFZUX0Zsb2F0UmFuZ2UgewotICAgIENQVlRfRmxvYXRSYW5nZSgpIDogZk1pbigwLjBmKSwgZk1heCgwLjBmKQotICAgIHsKLSAgICB9Ci0gICAgQ1BWVF9GbG9hdFJhbmdlKEZYX0ZMT0FUIG1pbiwgRlhfRkxPQVQgbWF4KSA6IGZNaW4obWluKSwgZk1heChtYXgpCi0gICAgewotICAgIH0KLSAgICBGWF9GTE9BVCBSYW5nZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gZk1heCAtIGZNaW47Ci0gICAgfQotICAgIEZYX0ZMT0FUIGZNaW4sIGZNYXg7CisgIENQVlRfRmxvYXRSYW5nZSgpIDogZk1pbigwLjBmKSwgZk1heCgwLjBmKSB7fQorICBDUFZUX0Zsb2F0UmFuZ2UoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpIDogZk1pbihtaW4pLCBmTWF4KG1heCkge30KKyAgRlhfRkxPQVQgUmFuZ2UoKSBjb25zdCB7IHJldHVybiBmTWF4IC0gZk1pbjsgfQorICBGWF9GTE9BVCBmTWluLCBmTWF4OwogfTsKLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGNsYXNzIENQVlRfQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPgotewotcHVibGljOgotICAgIEZYX0JPT0wgSXNFbXB0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSA8PSAwOwordGVtcGxhdGUgPGNsYXNzIFRZUEU+CitjbGFzcyBDUFZUX0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT4geworIHB1YmxpYzoKKyAgRlhfQk9PTCBJc0VtcHR5KCkgeyByZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSA8PSAwOyB9CisgIFRZUEUgR2V0QXQoaW50IG5JbmRleCkgY29uc3QgeworICAgIGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpKSB7CisgICAgICByZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldEF0KG5JbmRleCk7CiAgICAgfQotICAgIFRZUEUgR2V0QXQoaW50IG5JbmRleCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldEF0KG5JbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgdm9pZCBSZW1vdmVBdChpbnQgbkluZGV4KSB7CisgICAgaWYgKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRTaXplKCkpIHsKKyAgICAgIENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpSZW1vdmVBdChuSW5kZXgpOwogICAgIH0KLSAgICB2b2lkIFJlbW92ZUF0KGludCBuSW5kZXgpCi0gICAgewotICAgICAgICBpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSkgewotICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OlJlbW92ZUF0KG5JbmRleCk7Ci0gICAgICAgIH0KLSAgICB9CisgIH0KIH07Ci1jbGFzcyBDTGluZQotewotcHVibGljOgotICAgIENMaW5lKCk7Ci0gICAgdmlydHVhbCB+Q0xpbmUoKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRCZWdpbldvcmRQbGFjZSgpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldEVuZFdvcmRQbGFjZSgpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlMaW5lUGxhY2U7Ci0gICAgQ1BWVF9MaW5lSW5mbwkJCQkJCQltX0xpbmVJbmZvOworY2xhc3MgQ0xpbmUgeworIHB1YmxpYzoKKyAgQ0xpbmUoKTsKKyAgdmlydHVhbCB+Q0xpbmUoKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0QmVnaW5Xb3JkUGxhY2UoKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0RW5kV29yZFBsYWNlKCkgY29uc3Q7CisgIENQVlRfV29yZFBsYWNlIEdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBMaW5lUGxhY2U7CisgIENQVlRfTGluZUluZm8gbV9MaW5lSW5mbzsKIH07Ci1jbGFzcyBDTGluZXMKLXsKLXB1YmxpYzoKLSAgICBDTGluZXMoKSA6IG1fblRvdGFsKDApIHt9Ci0gICAgdmlydHVhbCB+Q0xpbmVzKCkKLSAgICB7Ci0gICAgICAgIFJlbW92ZUFsbCgpOworY2xhc3MgQ0xpbmVzIHsKKyBwdWJsaWM6CisgIENMaW5lcygpIDogbV9uVG90YWwoMCkge30KKyAgdmlydHVhbCB+Q0xpbmVzKCkgeyBSZW1vdmVBbGwoKTsgfQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBtX0xpbmVzLkdldFNpemUoKTsgfQorICBDTGluZSogR2V0QXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fTGluZXMuR2V0QXQobkluZGV4KTsgfQorICB2b2lkIEVtcHR5KCkgeyBtX25Ub3RhbCA9IDA7IH0KKyAgdm9pZCBSZW1vdmVBbGwoKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IEdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIGRlbGV0ZSBHZXRBdChpKTsKICAgICB9Ci0gICAgaW50MzJfdAkJCQkJCQkJR2V0U2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9MaW5lcy5HZXRTaXplKCk7CisgICAgbV9MaW5lcy5SZW1vdmVBbGwoKTsKKyAgICBtX25Ub3RhbCA9IDA7CisgIH0KKyAgaW50MzJfdCBBZGQoY29uc3QgQ1BWVF9MaW5lSW5mbyYgbGluZWluZm8pIHsKKyAgICBpZiAobV9uVG90YWwgPj0gR2V0U2l6ZSgpKSB7CisgICAgICBpZiAoQ0xpbmUqIHBMaW5lID0gRlhfTkVXIENMaW5lKSB7CisgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvID0gbGluZWluZm87CisgICAgICAgIG1fTGluZXMuQWRkKHBMaW5lKTsKKyAgICAgICAgcmV0dXJuIG1fblRvdGFsKys7CisgICAgICB9CisgICAgICByZXR1cm4gbV9uVG90YWw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChDTGluZSogcExpbmUgPSBHZXRBdChtX25Ub3RhbCkpIHsKKyAgICAgICAgcExpbmUtPm1fTGluZUluZm8gPSBsaW5laW5mbzsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtX25Ub3RhbCsrOwogICAgIH0KLSAgICBDTGluZSAqCQkJCQkJCQkJR2V0QXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9MaW5lcy5HZXRBdChuSW5kZXgpOworICB9CisgIHZvaWQgQ2xlYXIoKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSBHZXRTaXplKCkgLSAxOyBpID49IG1fblRvdGFsOyBpLS0pIHsKKyAgICAgIGRlbGV0ZSBHZXRBdChpKTsKKyAgICAgIG1fTGluZXMuUmVtb3ZlQXQoaSk7CiAgICAgfQotICAgIHZvaWQJCQkJCQkJCQlFbXB0eSgpCi0gICAgewotICAgICAgICBtX25Ub3RhbCA9IDA7Ci0gICAgfQotICAgIHZvaWQJCQkJCQkJCQlSZW1vdmVBbGwoKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IEdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgICAgIGRlbGV0ZSBHZXRBdChpKTsKLSAgICAgICAgfQotICAgICAgICBtX0xpbmVzLlJlbW92ZUFsbCgpOwotICAgICAgICBtX25Ub3RhbCA9IDA7Ci0gICAgfQotICAgIGludDMyX3QJCQkJCQkJCUFkZChjb25zdCBDUFZUX0xpbmVJbmZvICYgbGluZWluZm8pCi0gICAgewotICAgICAgICBpZiAobV9uVG90YWwgPj0gR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IEZYX05FVyBDTGluZSkgewotICAgICAgICAgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvID0gbGluZWluZm87Ci0gICAgICAgICAgICAgICAgbV9MaW5lcy5BZGQocExpbmUpOwotICAgICAgICAgICAgICAgIHJldHVybiBtX25Ub3RhbCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1fblRvdGFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKENMaW5lICogcExpbmUgPSBHZXRBdChtX25Ub3RhbCkpIHsKLSAgICAgICAgICAgICAgICBwTGluZS0+bV9MaW5lSW5mbyA9IGxpbmVpbmZvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1fblRvdGFsKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCUNsZWFyKCkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBpID0gR2V0U2l6ZSgpIC0gMTsgaSA+PSBtX25Ub3RhbDsgaS0tKSB7Ci0gICAgICAgICAgICBkZWxldGUgR2V0QXQoaSk7Ci0gICAgICAgICAgICBtX0xpbmVzLlJlbW92ZUF0KGkpOwotICAgICAgICB9Ci0gICAgfQotcHJpdmF0ZToKLSAgICBDUFZUX0FycmF5VGVtcGxhdGU8Q0xpbmUqPgkJCQltX0xpbmVzOwotICAgIGludDMyX3QJCQkJCQkJCW1fblRvdGFsOwotfTsKLWNsYXNzIENTZWN0aW9uCi17Ci0gICAgZnJpZW5kIGNsYXNzIENUeXBlc2V0OwotcHVibGljOgotICAgIENTZWN0aW9uKENQREZfVmFyaWFibGVUZXh0ICogcFZUKTsKLSAgICB2aXJ0dWFsIH5DU2VjdGlvbigpOwotICAgIHZvaWQJCQkJCQkJCQlSZXNldEFsbCgpOwotICAgIHZvaWQJCQkJCQkJCQlSZXNldExpbmVBcnJheSgpOwotICAgIHZvaWQJCQkJCQkJCQlSZXNldFdvcmRBcnJheSgpOwotICAgIHZvaWQJCQkJCQkJCQlSZXNldExpbmVQbGFjZSgpOwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUFkZFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIHdvcmRpbmZvKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBZGRMaW5lKGNvbnN0IENQVlRfTGluZUluZm8gJiBsaW5laW5mbyk7Ci0gICAgdm9pZAkJCQkJCQkJCUNsZWFyV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKLSAgICB2b2lkCQkJCQkJCQkJQ2xlYXJXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwotICAgIENQVlRfRmxvYXRSZWN0CQkJCQkJCVJlYXJyYW5nZSgpOwotICAgIENQVlRfU2l6ZQkJCQkJCQkJR2V0U2VjdGlvblNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRCZWdpbldvcmRQbGFjZSgpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldEVuZFdvcmRQbGFjZSgpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLSAgICB2b2lkCQkJCQkJCQkJVXBkYXRlV29yZFBsYWNlKENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCVNlYXJjaFdvcmRQbGFjZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCVNlYXJjaFdvcmRQbGFjZShGWF9GTE9BVCBmeCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBsaW5lcGxhY2UpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCVNlYXJjaFdvcmRQbGFjZShGWF9GTE9BVCBmeCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSkgY29uc3Q7Ci1wdWJsaWM6Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJU2VjUGxhY2U7Ci0gICAgQ1BWVF9TZWN0aW9uSW5mbwkJCQkJCW1fU2VjSW5mbzsKLSAgICBDTGluZXMJCQkJCQkJCQltX0xpbmVBcnJheTsKLSAgICBDUFZUX0FycmF5VGVtcGxhdGU8Q1BWVF9Xb3JkSW5mbyo+CQltX1dvcmRBcnJheTsKLXByaXZhdGU6Ci0gICAgdm9pZAkJCQkJCQkJCUNsZWFyTGVmdFdvcmRzKGludDMyX3QgbldvcmRJbmRleCk7Ci0gICAgdm9pZAkJCQkJCQkJCUNsZWFyUmlnaHRXb3JkcyhpbnQzMl90IG5Xb3JkSW5kZXgpOwotICAgIHZvaWQJCQkJCQkJCQlDbGVhck1pZFdvcmRzKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KTsKKyAgfQogCi0gICAgQ1BERl9WYXJpYWJsZVRleHQJCQkJCQkqbV9wVlQ7CisgcHJpdmF0ZToKKyAgQ1BWVF9BcnJheVRlbXBsYXRlPENMaW5lKj4gbV9MaW5lczsKKyAgaW50MzJfdCBtX25Ub3RhbDsKIH07Ci1jbGFzcyBDVHlwZXNldAotewotcHVibGljOgotICAgIENUeXBlc2V0KENTZWN0aW9uICogcFNlY3Rpb24pOwotICAgIHZpcnR1YWwgfkNUeXBlc2V0KCk7Ci0gICAgQ1BWVF9TaXplCQkJCQkJCQlHZXRFZGl0U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOwotICAgIENQVlRfRmxvYXRSZWN0CQkJCQkJCVR5cGVzZXQoKTsKLSAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQlDaGFyQXJyYXkoKTsKLXByaXZhdGU6Ci0gICAgdm9pZAkJCQkJCQkJCVNwbGl0TGluZXMoRlhfQk9PTCBiVHlwZXNldCwgRlhfRkxPQVQgZkZvbnRTaXplKTsKLSAgICB2b2lkCQkJCQkJCQkJT3V0cHV0TGluZXMoKTsKK2NsYXNzIENTZWN0aW9uIHsKKyAgZnJpZW5kIGNsYXNzIENUeXBlc2V0OwogCi0gICAgQ1BWVF9GbG9hdFJlY3QJCQkJCQkJbV9yY1JldDsKLSAgICBDUERGX1ZhcmlhYmxlVGV4dAkJCQkJCSogbV9wVlQ7Ci0gICAgQ1NlY3Rpb24JCQkJCQkJCSogbV9wU2VjdGlvbjsKKyBwdWJsaWM6CisgIENTZWN0aW9uKENQREZfVmFyaWFibGVUZXh0KiBwVlQpOworICB2aXJ0dWFsIH5DU2VjdGlvbigpOworICB2b2lkIFJlc2V0QWxsKCk7CisgIHZvaWQgUmVzZXRMaW5lQXJyYXkoKTsKKyAgdm9pZCBSZXNldFdvcmRBcnJheSgpOworICB2b2lkIFJlc2V0TGluZVBsYWNlKCk7CisgIENQVlRfV29yZFBsYWNlIEFkZFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZEluZm8mIHdvcmRpbmZvKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgQWRkTGluZShjb25zdCBDUFZUX0xpbmVJbmZvJiBsaW5laW5mbyk7CisgIHZvaWQgQ2xlYXJXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgUGxhY2VSYW5nZSk7CisgIHZvaWQgQ2xlYXJXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisgIENQVlRfRmxvYXRSZWN0IFJlYXJyYW5nZSgpOworICBDUFZUX1NpemUgR2V0U2VjdGlvblNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0QmVnaW5Xb3JkUGxhY2UoKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0RW5kV29yZFBsYWNlKCkgY29uc3Q7CisgIENQVlRfV29yZFBsYWNlIEdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICB2b2lkIFVwZGF0ZVdvcmRQbGFjZShDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBTZWFyY2hXb3JkUGxhY2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBTZWFyY2hXb3JkUGxhY2UoRlhfRkxPQVQgZngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgbGluZXBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgU2VhcmNoV29yZFBsYWNlKEZYX0ZMT0FUIGZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKSBjb25zdDsKKworIHB1YmxpYzoKKyAgQ1BWVF9Xb3JkUGxhY2UgU2VjUGxhY2U7CisgIENQVlRfU2VjdGlvbkluZm8gbV9TZWNJbmZvOworICBDTGluZXMgbV9MaW5lQXJyYXk7CisgIENQVlRfQXJyYXlUZW1wbGF0ZTxDUFZUX1dvcmRJbmZvKj4gbV9Xb3JkQXJyYXk7CisKKyBwcml2YXRlOgorICB2b2lkIENsZWFyTGVmdFdvcmRzKGludDMyX3QgbldvcmRJbmRleCk7CisgIHZvaWQgQ2xlYXJSaWdodFdvcmRzKGludDMyX3QgbldvcmRJbmRleCk7CisgIHZvaWQgQ2xlYXJNaWRXb3JkcyhpbnQzMl90IG5CZWdpbkluZGV4LCBpbnQzMl90IG5FbmRJbmRleCk7CisKKyAgQ1BERl9WYXJpYWJsZVRleHQqIG1fcFZUOwogfTsKLWNsYXNzIENQREZfRWRpdENvbnRhaW5lcgotewotcHVibGljOgotICAgIENQREZfRWRpdENvbnRhaW5lcigpOiBtX3JjUGxhdGUoMCwgMCwgMCwgMCksIG1fcmNDb250ZW50KDAsIDAsIDAsIDApIHt9OwotICAgIHZpcnR1YWwgfkNQREZfRWRpdENvbnRhaW5lcigpIHt9OwotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLSAgICB7Ci0gICAgICAgIG1fcmNQbGF0ZSA9IHJlY3Q7Ci0gICAgfTsKLSAgICB2aXJ0dWFsIGNvbnN0IENQREZfUmVjdCAmCQkJCUdldFBsYXRlUmVjdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9yY1BsYXRlOwotICAgIH07Ci0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldENvbnRlbnRSZWN0KGNvbnN0IENQVlRfRmxvYXRSZWN0ICYgcmVjdCkKLSAgICB7Ci0gICAgICAgIG1fcmNDb250ZW50ID0gcmVjdDsKLSAgICB9OwotICAgIHZpcnR1YWwgQ1BERl9SZWN0IAkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3JjQ29udGVudDsKLSAgICB9OwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRQbGF0ZVdpZHRoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3JjUGxhdGUucmlnaHQgLSBtX3JjUGxhdGUubGVmdDsKLSAgICB9OwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRQbGF0ZUhlaWdodCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9yY1BsYXRlLnRvcCAtIG1fcmNQbGF0ZS5ib3R0b207Ci0gICAgfTsKLSAgICBDUFZUX1NpemUJCQkJCQkJCUdldFBsYXRlU2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gQ1BWVF9TaXplKEdldFBsYXRlV2lkdGgoKSwgR2V0UGxhdGVIZWlnaHQoKSk7Ci0gICAgfTsKLSAgICBDUERGX1BvaW50CQkJCQkJCQlHZXRCVFBvaW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBDUERGX1BvaW50KG1fcmNQbGF0ZS5sZWZ0LCBtX3JjUGxhdGUudG9wKTsKLSAgICB9OwotICAgIENQREZfUG9pbnQJCQkJCQkJCUdldEVUUG9pbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIENQREZfUG9pbnQobV9yY1BsYXRlLnJpZ2h0LCBtX3JjUGxhdGUuYm90dG9tKTsKLSAgICB9OwotICAgIGlubGluZSBDUERGX1BvaW50CQkJCQkJSW5Ub091dChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gQ1BERl9Qb2ludChwb2ludC54ICsgR2V0QlRQb2ludCgpLngsIEdldEJUUG9pbnQoKS55IC0gcG9pbnQueSk7Ci0gICAgfTsKLSAgICBpbmxpbmUgQ1BERl9Qb2ludAkJCQkJCU91dFRvSW4oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCAtIEdldEJUUG9pbnQoKS54LCBHZXRCVFBvaW50KCkueSAtIHBvaW50LnkpOwotICAgIH07Ci0gICAgaW5saW5lIENQREZfUmVjdAkJCQkJCUluVG9PdXQoY29uc3QgQ1BWVF9GbG9hdFJlY3QgJiByZWN0KSBjb25zdAotICAgIHsKLSAgICAgICAgQ1BERl9Qb2ludCBwdExlZnRUb3AgPSBJblRvT3V0KENQREZfUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkpOwotICAgICAgICBDUERGX1BvaW50IHB0UmlnaHRCb3R0b20gPSBJblRvT3V0KENQREZfUG9pbnQocmVjdC5yaWdodCwgcmVjdC5ib3R0b20pKTsKLSAgICAgICAgcmV0dXJuIENQREZfUmVjdChwdExlZnRUb3AueCwgcHRSaWdodEJvdHRvbS55LCBwdFJpZ2h0Qm90dG9tLngsIHB0TGVmdFRvcC55KTsKLSAgICB9OwotICAgIGlubGluZSBDUFZUX0Zsb2F0UmVjdAkJCQkJT3V0VG9Jbihjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdAotICAgIHsKLSAgICAgICAgQ1BERl9Qb2ludCBwdExlZnRUb3AgPSBPdXRUb0luKENQREZfUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkpOwotICAgICAgICBDUERGX1BvaW50IHB0UmlnaHRCb3R0b20gPSBPdXRUb0luKENQREZfUG9pbnQocmVjdC5yaWdodCwgcmVjdC5ib3R0b20pKTsKLSAgICAgICAgcmV0dXJuIENQVlRfRmxvYXRSZWN0KHB0TGVmdFRvcC54LCBwdExlZnRUb3AueSwgcHRSaWdodEJvdHRvbS54LCBwdFJpZ2h0Qm90dG9tLnkpOwotICAgIH07CitjbGFzcyBDVHlwZXNldCB7CisgcHVibGljOgorICBDVHlwZXNldChDU2VjdGlvbiogcFNlY3Rpb24pOworICB2aXJ0dWFsIH5DVHlwZXNldCgpOworICBDUFZUX1NpemUgR2V0RWRpdFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKKyAgQ1BWVF9GbG9hdFJlY3QgVHlwZXNldCgpOworICBDUFZUX0Zsb2F0UmVjdCBDaGFyQXJyYXkoKTsKIAotcHJpdmF0ZToKLSAgICBDUERGX1JlY3QJCQkJCQkJCW1fcmNQbGF0ZTsKLSAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQltX3JjQ29udGVudDsKKyBwcml2YXRlOgorICB2b2lkIFNwbGl0TGluZXMoRlhfQk9PTCBiVHlwZXNldCwgRlhfRkxPQVQgZkZvbnRTaXplKTsKKyAgdm9pZCBPdXRwdXRMaW5lcygpOworCisgIENQVlRfRmxvYXRSZWN0IG1fcmNSZXQ7CisgIENQREZfVmFyaWFibGVUZXh0KiBtX3BWVDsKKyAgQ1NlY3Rpb24qIG1fcFNlY3Rpb247CiB9OwotY2xhc3MgQ1BERl9WYXJpYWJsZVRleHQgOiBwdWJsaWMgSVBERl9WYXJpYWJsZVRleHQsIHByaXZhdGUgQ1BERl9FZGl0Q29udGFpbmVyCi17Ci0gICAgZnJpZW5kIGNsYXNzIENUeXBlc2V0OwotICAgIGZyaWVuZCBjbGFzcyBDU2VjdGlvbjsKLSAgICBmcmllbmQgY2xhc3MgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I7Ci1wdWJsaWM6Ci0gICAgQ1BERl9WYXJpYWJsZVRleHQoKTsKLSAgICB2aXJ0dWFsIH5DUERGX1ZhcmlhYmxlVGV4dCgpOwotICAgIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKgkJCQlTZXRQcm92aWRlcihJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciAqIHBQcm92aWRlcik7Ci0gICAgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqCQkJCUdldEl0ZXJhdG9yKCk7Ci0gICAgdm9pZAkJCQkJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0KQotICAgIHsKLSAgICAgICAgQ1BERl9FZGl0Q29udGFpbmVyOjpTZXRQbGF0ZVJlY3QocmVjdCk7Ci0gICAgfQotICAgIHZvaWQJCQkJCQkJCQlTZXRBbGlnbm1lbnQoaW50MzJfdCBuRm9ybWF0ID0gMCkKLSAgICB7Ci0gICAgICAgIG1fbkFsaWdubWVudCA9IG5Gb3JtYXQ7Ci0gICAgfQotICAgIHZvaWQJCQkJCQkJCQlTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJykKLSAgICB7Ci0gICAgICAgIG1fd1N1YldvcmQgPSB3U3ViV29yZDsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIgPSAwKQotICAgIHsKLSAgICAgICAgbV9uTGltaXRDaGFyID0gbkxpbWl0Q2hhcjsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZikKLSAgICB7Ci0gICAgICAgIG1fZkNoYXJTcGFjZSA9IGZDaGFyU3BhY2U7Ci0gICAgfQotICAgIHZvaWQJCQkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlID0gMTAwKQotICAgIHsKLSAgICAgICAgbV9uSG9yelNjYWxlID0gbkhvcnpTY2FsZTsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFKQotICAgIHsKLSAgICAgICAgbV9iTXVsdGlMaW5lID0gYk11bHRpTGluZTsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldEF1dG9SZXR1cm4oRlhfQk9PTCBiQXV0byA9IFRSVUUpCi0gICAgewotICAgICAgICBtX2JMaW1pdFdpZHRoID0gYkF1dG87Ci0gICAgfQotICAgIHZvaWQJCQkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpCi0gICAgewotICAgICAgICBtX2ZGb250U2l6ZSA9IGZGb250U2l6ZTsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkgPSAwKQotICAgIHsKLSAgICAgICAgbV9uQ2hhckFycmF5ID0gbkNoYXJBcnJheTsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvID0gVFJVRSkKLSAgICB7Ci0gICAgICAgIG1fYkF1dG9Gb250U2l6ZSA9IGJBdXRvOwotICAgIH0KLSAgICB2b2lkCQkJCQkJCQkJU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQpCi0gICAgewotICAgICAgICBtX2JSaWNoVGV4dCA9IGJSaWNoVGV4dDsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZykKLSAgICB7Ci0gICAgICAgIG1fZkxpbmVMZWFkaW5nID0gZkxpbmVMZWFkaW5nOwotICAgIH0KLSAgICB2b2lkCQkJCQkJCQkJSW5pdGlhbGl6ZSgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlJc1ZhbGlkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JJbml0aWFsOwotICAgIH0KLSAgICBGWF9CT09MCQkJCQkJCQkJSXNSaWNoVGV4dCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iUmljaFRleHQ7Ci0gICAgfQotICAgIHZvaWQJCQkJCQkJCQlSZWFycmFuZ2VBbGwoKTsKLSAgICB2b2lkCQkJCQkJCQkJUmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpOwotICAgIHZvaWQJCQkJCQkJCQlSZXNldEFsbCgpOwotICAgIHZvaWQJCQkJCQkJCQlTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQgPSAxLCBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCwKLSAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQgPSAxLAotICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJSW5zZXJ0U2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCwKLSAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCA9IDEsCi0gICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCwJY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJRGVsZXRlV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlEZWxldGVXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUJhY2tTcGFjZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7Ci0gICAgY29uc3QgQ1BERl9SZWN0ICYJCQkJCQlHZXRQbGF0ZVJlY3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIENQREZfRWRpdENvbnRhaW5lcjo6R2V0UGxhdGVSZWN0KCk7Ci0gICAgfQotICAgIENQREZfUmVjdAkJCQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdDsKLSAgICBpbnQzMl90CQkJCQkJCQlHZXRUb3RhbFdvcmRzKCkgY29uc3Q7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldEZvbnRTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2ZGb250U2l6ZTsKLSAgICB9Ci0gICAgaW50MzJfdAkJCQkJCQkJR2V0QWxpZ25tZW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25BbGlnbm1lbnQ7Ci0gICAgfQotICAgIGludDMyX3QJCQkJCQkJCUdldENoYXJBcnJheSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9uQ2hhckFycmF5OwotICAgIH0KLSAgICBpbnQzMl90CQkJCQkJCQlHZXRMaW1pdENoYXIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkxpbWl0Q2hhcjsKLSAgICB9Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUlzTXVsdGlMaW5lKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JNdWx0aUxpbmU7Ci0gICAgfQotICAgIGludDMyX3QJCQkJCQkJCUdldEhvcnpTY2FsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9uSG9yelNjYWxlOwotICAgIH0KLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0Q2hhclNwYWNlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2ZDaGFyU3BhY2U7Ci0gICAgfQorY2xhc3MgQ1BERl9FZGl0Q29udGFpbmVyIHsKKyBwdWJsaWM6CisgIENQREZfRWRpdENvbnRhaW5lcigpIDogbV9yY1BsYXRlKDAsIDAsIDAsIDApLCBtX3JjQ29udGVudCgwLCAwLCAwLCAwKXt9OworICB2aXJ0dWFsIH5DUERGX0VkaXRDb250YWluZXIoKXt9OworICB2aXJ0dWFsIHZvaWQgU2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeyBtX3JjUGxhdGUgPSByZWN0OyB9OworICB2aXJ0dWFsIGNvbnN0IENQREZfUmVjdCYgR2V0UGxhdGVSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9yY1BsYXRlOyB9OworICB2aXJ0dWFsIHZvaWQgU2V0Q29udGVudFJlY3QoY29uc3QgQ1BWVF9GbG9hdFJlY3QmIHJlY3QpIHsKKyAgICBtX3JjQ29udGVudCA9IHJlY3Q7CisgIH07CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9yY0NvbnRlbnQ7IH07CisgIEZYX0ZMT0FUIEdldFBsYXRlV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX3JjUGxhdGUucmlnaHQgLSBtX3JjUGxhdGUubGVmdDsgfTsKKyAgRlhfRkxPQVQgR2V0UGxhdGVIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX3JjUGxhdGUudG9wIC0gbV9yY1BsYXRlLmJvdHRvbTsgfTsKKyAgQ1BWVF9TaXplIEdldFBsYXRlU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ1BWVF9TaXplKEdldFBsYXRlV2lkdGgoKSwgR2V0UGxhdGVIZWlnaHQoKSk7CisgIH07CisgIENQREZfUG9pbnQgR2V0QlRQb2ludCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ1BERl9Qb2ludChtX3JjUGxhdGUubGVmdCwgbV9yY1BsYXRlLnRvcCk7CisgIH07CisgIENQREZfUG9pbnQgR2V0RVRQb2ludCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ1BERl9Qb2ludChtX3JjUGxhdGUucmlnaHQsIG1fcmNQbGF0ZS5ib3R0b20pOworICB9OworICBpbmxpbmUgQ1BERl9Qb2ludCBJblRvT3V0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgICAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIEdldEJUUG9pbnQoKS54LCBHZXRCVFBvaW50KCkueSAtIHBvaW50LnkpOworICB9OworICBpbmxpbmUgQ1BERl9Qb2ludCBPdXRUb0luKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgICAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCAtIEdldEJUUG9pbnQoKS54LCBHZXRCVFBvaW50KCkueSAtIHBvaW50LnkpOworICB9OworICBpbmxpbmUgQ1BERl9SZWN0IEluVG9PdXQoY29uc3QgQ1BWVF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0IHsKKyAgICBDUERGX1BvaW50IHB0TGVmdFRvcCA9IEluVG9PdXQoQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSk7CisgICAgQ1BERl9Qb2ludCBwdFJpZ2h0Qm90dG9tID0gSW5Ub091dChDUERGX1BvaW50KHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKSk7CisgICAgcmV0dXJuIENQREZfUmVjdChwdExlZnRUb3AueCwgcHRSaWdodEJvdHRvbS55LCBwdFJpZ2h0Qm90dG9tLngsCisgICAgICAgICAgICAgICAgICAgICBwdExlZnRUb3AueSk7CisgIH07CisgIGlubGluZSBDUFZUX0Zsb2F0UmVjdCBPdXRUb0luKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICAgIENQREZfUG9pbnQgcHRMZWZ0VG9wID0gT3V0VG9JbihDUERGX1BvaW50KHJlY3QubGVmdCwgcmVjdC50b3ApKTsKKyAgICBDUERGX1BvaW50IHB0UmlnaHRCb3R0b20gPSBPdXRUb0luKENQREZfUG9pbnQocmVjdC5yaWdodCwgcmVjdC5ib3R0b20pKTsKKyAgICByZXR1cm4gQ1BWVF9GbG9hdFJlY3QocHRMZWZ0VG9wLngsIHB0TGVmdFRvcC55LCBwdFJpZ2h0Qm90dG9tLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0UmlnaHRCb3R0b20ueSk7CisgIH07CiAKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRCZWdpbldvcmRQbGFjZSgpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldEVuZFdvcmRQbGFjZSgpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlTZWFyY2hXb3JkUGxhY2UoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRVcFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldERvd25Xb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0U2VjdGlvbkJlZ2luUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0U2VjdGlvbkVuZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotICAgIHZvaWQJCQkJCQkJCQlVcGRhdGVXb3JkUGxhY2UoQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgaW50MzJfdAkJCQkJCQkJV29yZFBsYWNlVG9Xb3JkSW5kZXgoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJV29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3Q7Ci0gICAgRlhfV09SRAkJCQkJCQkJCUdldFBhc3N3b3JkQ2hhcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gR2V0U3ViV29yZCgpOwotICAgIH0KLSAgICBGWF9XT1JECQkJCQkJCQkJR2V0U3ViV29yZCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV93U3ViV29yZDsKLSAgICB9Ci1wcml2YXRlOgotICAgIGludDMyX3QJCQkJCQkJCUdldENoYXJXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgV29yZCwgRlhfV09SRCBTdWJXb3JkLCBpbnQzMl90IG5Xb3JkU3R5bGUpOwotICAgIGludDMyX3QJCQkJCQkJCUdldFR5cGVBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KTsKLSAgICBpbnQzMl90CQkJCQkJCQlHZXRUeXBlRGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgpOwotICAgIGludDMyX3QJCQkJCQkJCUdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCk7Ci0gICAgaW50MzJfdAkJCQkJCQkJR2V0RGVmYXVsdEZvbnRJbmRleCgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpOwotcHJpdmF0ZToKLQotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUFkZFNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIHNlY2luZm8pOwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUFkZExpbmUoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BWVF9MaW5lSW5mbyAmIGxpbmVpbmZvKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBZGRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkaW5mbyk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfV29yZEluZm8gJiB3b3JkaW5mbyk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVNldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkaW5mbyk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldExpbmVJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfTGluZUluZm8gJiBsaW5laW5mbyk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldFNlY3Rpb25JbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIENQVlRfU2VjdGlvbkluZm8gJiBzZWNpbmZvKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZEZvbnRTaXplKGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfQk9PTCBiRmFjdEZvbnRTaXplID0gRkFMU0UpOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIFdvcmQsIEZYX1dPUkQgU3ViV29yZCwKLSAgICAgICAgICAgIEZYX0ZMT0FUIGZDaGFyU3BhY2UsIGludDMyX3QgbkhvcnpTY2FsZSwKLSAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfRkxPQVQgZldvcmRUYWlsLCBpbnQzMl90IG5Xb3JkU3R5bGUpOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkV2lkdGgoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZEFzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfRkxPQVQgZkZvbnRTaXplKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZEFzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIEZYX0JPT0wgYkZhY3RGb250U2l6ZSA9IEZBTFNFKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUgPSBGQUxTRSk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldExpbmVBc2NlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIFNlY0luZm8pOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRMaW5lRGVzY2VudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvICYgU2VjSW5mbyk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldEZvbnRBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9GTE9BVCBmRm9udFNpemUpOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRGb250RGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgsIEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gICAgaW50MzJfdAkJCQkJCQkJR2V0V29yZEZvbnRJbmRleChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8pOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRDaGFyU3BhY2UoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvKTsKLSAgICBpbnQzMl90CQkJCQkJCQlHZXRIb3J6U2NhbGUoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0TGluZUxlYWRpbmcoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIFNlY0luZm8pOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRMaW5lSW5kZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8gJiBTZWNJbmZvKTsKLSAgICBpbnQzMl90CQkJCQkJCQlHZXRBbGlnbm1lbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbyk7Ci0KLSAgICB2b2lkCQkJCQkJCQkJQ2xlYXJTZWN0aW9uUmlnaHRXb3Jkcyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiUHJldk9yTmV4dCkgY29uc3Q7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUNsZWFyRW1wdHlTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwotICAgIHZvaWQJCQkJCQkJCQlDbGVhckVtcHR5U2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKLSAgICB2b2lkCQkJCQkJCQkJTGlua0xhdHRlclNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7Ci0gICAgdm9pZAkJCQkJCQkJCUNsZWFyV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlDbGVhckxlZnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUNsZWFyUmlnaHRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwotcHJpdmF0ZToKLSAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQlSZWFycmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0QXV0b0ZvbnRTaXplKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUlzQmlnZ2VyKEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gICAgQ1BWVF9GbG9hdFJlY3QJCQkJCQkJUmVhcnJhbmdlU2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKLXByaXZhdGU6Ci0gICAgdm9pZAkJCQkJCQkJCVJlc2V0U2VjdGlvbkFycmF5KCk7Ci1wcml2YXRlOgotICAgIENQVlRfQXJyYXlUZW1wbGF0ZTxDU2VjdGlvbio+CQkJbV9TZWN0aW9uQXJyYXk7Ci0gICAgaW50MzJfdAkJCQkJCQkJbV9uTGltaXRDaGFyOwotICAgIGludDMyX3QJCQkJCQkJCW1fbkNoYXJBcnJheTsKLSAgICBGWF9CT09MCQkJCQkJCQkJbV9iTXVsdGlMaW5lOwotICAgIEZYX0JPT0wJCQkJCQkJCQltX2JMaW1pdFdpZHRoOwotICAgIEZYX0JPT0wJCQkJCQkJCQltX2JBdXRvRm9udFNpemU7Ci0gICAgaW50MzJfdAkJCQkJCQkJbV9uQWxpZ25tZW50OwotICAgIEZYX0ZMT0FUCQkJCQkJCQltX2ZMaW5lTGVhZGluZzsKLSAgICBGWF9GTE9BVAkJCQkJCQkJbV9mQ2hhclNwYWNlOwotICAgIGludDMyX3QJCQkJCQkJCW1fbkhvcnpTY2FsZTsKLSAgICBGWF9XT1JECQkJCQkJCQkJbV93U3ViV29yZDsKLSAgICBGWF9GTE9BVAkJCQkJCQkJbV9mRm9udFNpemU7Ci0KLXByaXZhdGU6Ci0gICAgRlhfQk9PTAkJCQkJCQkJCW1fYkluaXRpYWw7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCW1fYlJpY2hUZXh0OwotICAgIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyICoJCQltX3BWVFByb3ZpZGVyOwotICAgIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICoJCQltX3BWVEl0ZXJhdG9yOworIHByaXZhdGU6CisgIENQREZfUmVjdCBtX3JjUGxhdGU7CisgIENQVlRfRmxvYXRSZWN0IG1fcmNDb250ZW50OwogfTsKLWNsYXNzIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yIDogcHVibGljIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IoQ1BERl9WYXJpYWJsZVRleHQgKiBwVlQpOwotICAgIHZpcnR1YWwgfkNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCU5leHRXb3JkKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVByZXZXb3JkKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCU5leHRMaW5lKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVByZXZMaW5lKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCU5leHRTZWN0aW9uKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVByZXZTZWN0aW9uKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVNldFdvcmQoY29uc3QgQ1BWVF9Xb3JkICYgd29yZCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3Q7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3Q7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3Q7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCVNldFNlY3Rpb24oY29uc3QgQ1BWVF9TZWN0aW9uICYgc2VjdGlvbik7Ci0gICAgdm9pZAkJCQkJCQkJCVNldEF0KGludDMyX3QgbldvcmRJbmRleCk7Ci0gICAgdm9pZAkJCQkJCQkJCVNldEF0KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwotICAgIGNvbnN0IENQVlRfV29yZFBsYWNlICYJCQkJCUdldEF0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0N1clBvczsKLSAgICB9OwotcHJpdmF0ZToKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQltX0N1clBvczsKLSAgICBDUERGX1ZhcmlhYmxlVGV4dCAqCQkJCQkJbV9wVlQ7CitjbGFzcyBDUERGX1ZhcmlhYmxlVGV4dCA6IHB1YmxpYyBJUERGX1ZhcmlhYmxlVGV4dCwgcHJpdmF0ZSBDUERGX0VkaXRDb250YWluZXIgeworICBmcmllbmQgY2xhc3MgQ1R5cGVzZXQ7CisgIGZyaWVuZCBjbGFzcyBDU2VjdGlvbjsKKyAgZnJpZW5kIGNsYXNzIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOworCisgcHVibGljOgorICBDUERGX1ZhcmlhYmxlVGV4dCgpOworICB2aXJ0dWFsIH5DUERGX1ZhcmlhYmxlVGV4dCgpOworICBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciogU2V0UHJvdmlkZXIoCisgICAgICBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciogcFByb3ZpZGVyKTsKKyAgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIEdldEl0ZXJhdG9yKCk7CisgIHZvaWQgU2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICAgIENQREZfRWRpdENvbnRhaW5lcjo6U2V0UGxhdGVSZWN0KHJlY3QpOworICB9CisgIHZvaWQgU2V0QWxpZ25tZW50KGludDMyX3QgbkZvcm1hdCA9IDApIHsgbV9uQWxpZ25tZW50ID0gbkZvcm1hdDsgfQorICB2b2lkIFNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkID0gJyonKSB7IG1fd1N1YldvcmQgPSB3U3ViV29yZDsgfQorICB2b2lkIFNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIgPSAwKSB7IG1fbkxpbWl0Q2hhciA9IG5MaW1pdENoYXI7IH0KKyAgdm9pZCBTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSA9IDAuMGYpIHsgbV9mQ2hhclNwYWNlID0gZkNoYXJTcGFjZTsgfQorICB2b2lkIFNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApIHsgbV9uSG9yelNjYWxlID0gbkhvcnpTY2FsZTsgfQorICB2b2lkIFNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFKSB7IG1fYk11bHRpTGluZSA9IGJNdWx0aUxpbmU7IH0KKyAgdm9pZCBTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8gPSBUUlVFKSB7IG1fYkxpbWl0V2lkdGggPSBiQXV0bzsgfQorICB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgeyBtX2ZGb250U2l6ZSA9IGZGb250U2l6ZTsgfQorICB2b2lkIFNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkgPSAwKSB7IG1fbkNoYXJBcnJheSA9IG5DaGFyQXJyYXk7IH0KKyAgdm9pZCBTZXRBdXRvRm9udFNpemUoRlhfQk9PTCBiQXV0byA9IFRSVUUpIHsgbV9iQXV0b0ZvbnRTaXplID0gYkF1dG87IH0KKyAgdm9pZCBTZXRSaWNoVGV4dChGWF9CT09MIGJSaWNoVGV4dCkgeyBtX2JSaWNoVGV4dCA9IGJSaWNoVGV4dDsgfQorICB2b2lkIFNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZykgeyBtX2ZMaW5lTGVhZGluZyA9IGZMaW5lTGVhZGluZzsgfQorICB2b2lkIEluaXRpYWxpemUoKTsKKyAgRlhfQk9PTCBJc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9iSW5pdGlhbDsgfQorICBGWF9CT09MIElzUmljaFRleHQoKSBjb25zdCB7IHJldHVybiBtX2JSaWNoVGV4dDsgfQorICB2b2lkIFJlYXJyYW5nZUFsbCgpOworICB2b2lkIFJlYXJyYW5nZVBhcnQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpOworICB2b2lkIFJlc2V0QWxsKCk7CisgIHZvaWQgU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCA9IDEsCisgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMgPSBOVUxMLAorICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgPSBOVUxMKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgSW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgPSBOVUxMKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgSW5zZXJ0U2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpOworICBDUFZUX1dvcmRQbGFjZSBJbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgPSBOVUxMKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgRGVsZXRlV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpOworICBDUFZUX1dvcmRQbGFjZSBEZWxldGVXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisgIENQVlRfV29yZFBsYWNlIEJhY2tTcGFjZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKyAgY29uc3QgQ1BERl9SZWN0JiBHZXRQbGF0ZVJlY3QoKSBjb25zdCB7CisgICAgcmV0dXJuIENQREZfRWRpdENvbnRhaW5lcjo6R2V0UGxhdGVSZWN0KCk7CisgIH0KKyAgQ1BERl9SZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Q7CisgIGludDMyX3QgR2V0VG90YWxXb3JkcygpIGNvbnN0OworICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZkZvbnRTaXplOyB9CisgIGludDMyX3QgR2V0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gbV9uQWxpZ25tZW50OyB9CisgIGludDMyX3QgR2V0Q2hhckFycmF5KCkgY29uc3QgeyByZXR1cm4gbV9uQ2hhckFycmF5OyB9CisgIGludDMyX3QgR2V0TGltaXRDaGFyKCkgY29uc3QgeyByZXR1cm4gbV9uTGltaXRDaGFyOyB9CisgIEZYX0JPT0wgSXNNdWx0aUxpbmUoKSBjb25zdCB7IHJldHVybiBtX2JNdWx0aUxpbmU7IH0KKyAgaW50MzJfdCBHZXRIb3J6U2NhbGUoKSBjb25zdCB7IHJldHVybiBtX25Ib3J6U2NhbGU7IH0KKyAgRlhfRkxPQVQgR2V0Q2hhclNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV9mQ2hhclNwYWNlOyB9CisKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0QmVnaW5Xb3JkUGxhY2UoKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0RW5kV29yZFBsYWNlKCkgY29uc3Q7CisgIENQVlRfV29yZFBsYWNlIEdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBTZWFyY2hXb3JkUGxhY2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBHZXRVcFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0RG93bldvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0U2VjdGlvbkJlZ2luUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0U2VjdGlvbkVuZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3Q7CisgIHZvaWQgVXBkYXRlV29yZFBsYWNlKENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3Q7CisgIGludDMyX3QgV29yZFBsYWNlVG9Xb3JkSW5kZXgoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgV29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3Q7CisgIEZYX1dPUkQgR2V0UGFzc3dvcmRDaGFyKCkgY29uc3QgeyByZXR1cm4gR2V0U3ViV29yZCgpOyB9CisgIEZYX1dPUkQgR2V0U3ViV29yZCgpIGNvbnN0IHsgcmV0dXJuIG1fd1N1YldvcmQ7IH0KKworIHByaXZhdGU6CisgIGludDMyX3QgR2V0Q2hhcldpZHRoKGludDMyX3QgbkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIFN1YldvcmQsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbldvcmRTdHlsZSk7CisgIGludDMyX3QgR2V0VHlwZUFzY2VudChpbnQzMl90IG5Gb250SW5kZXgpOworICBpbnQzMl90IEdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCk7CisgIGludDMyX3QgR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgaW50MzJfdCBuRm9udEluZGV4KTsKKyAgaW50MzJfdCBHZXREZWZhdWx0Rm9udEluZGV4KCk7CisgIEZYX0JPT0wgSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKTsKKworIHByaXZhdGU6CisgIENQVlRfV29yZFBsYWNlIEFkZFNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIHNlY2luZm8pOworICBDUFZUX1dvcmRQbGFjZSBBZGRMaW5lKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX0xpbmVJbmZvJiBsaW5laW5mbyk7CisgIENQVlRfV29yZFBsYWNlIEFkZFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZEluZm8mIHdvcmRpbmZvKTsKKyAgRlhfQk9PTCBHZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIENQVlRfV29yZEluZm8mIHdvcmRpbmZvKTsKKyAgRlhfQk9PTCBTZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkSW5mbyYgd29yZGluZm8pOworICBGWF9CT09MIEdldExpbmVJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgQ1BWVF9MaW5lSW5mbyYgbGluZWluZm8pOworICBGWF9CT09MIEdldFNlY3Rpb25JbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX1NlY3Rpb25JbmZvJiBzZWNpbmZvKTsKKyAgRlhfRkxPQVQgR2V0V29yZEZvbnRTaXplKGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmFjdEZvbnRTaXplID0gRkFMU0UpOworICBGWF9GTE9BVCBHZXRXb3JkV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBTdWJXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNoYXJTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkhvcnpTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXb3JkVGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbldvcmRTdHlsZSk7CisgIEZYX0ZMT0FUIEdldFdvcmRXaWR0aChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbyk7CisgIEZYX0ZMT0FUIEdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8sIEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIEZYX0ZMT0FUIEdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLCBGWF9GTE9BVCBmRm9udFNpemUpOworICBGWF9GTE9BVCBHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZhY3RGb250U2l6ZSA9IEZBTFNFKTsKKyAgRlhfRkxPQVQgR2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZhY3RGb250U2l6ZSA9IEZBTFNFKTsKKyAgRlhfRkxPQVQgR2V0TGluZUFzY2VudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBTZWNJbmZvKTsKKyAgRlhfRkxPQVQgR2V0TGluZURlc2NlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbyk7CisgIEZYX0ZMT0FUIEdldEZvbnRBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9GTE9BVCBmRm9udFNpemUpOworICBGWF9GTE9BVCBHZXRGb250RGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgsIEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIGludDMyX3QgR2V0V29yZEZvbnRJbmRleChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbyk7CisgIEZYX0ZMT0FUIEdldENoYXJTcGFjZShjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbyk7CisgIGludDMyX3QgR2V0SG9yelNjYWxlKGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvKTsKKyAgRlhfRkxPQVQgR2V0TGluZUxlYWRpbmcoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbyk7CisgIEZYX0ZMT0FUIEdldExpbmVJbmRlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbyk7CisgIGludDMyX3QgR2V0QWxpZ25tZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pOworCisgIHZvaWQgQ2xlYXJTZWN0aW9uUmlnaHRXb3Jkcyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOworICBDUFZUX1dvcmRQbGFjZSBBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJldk9yTmV4dCkgY29uc3Q7CisgIEZYX0JPT0wgQ2xlYXJFbXB0eVNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKyAgdm9pZCBDbGVhckVtcHR5U2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpOworICB2b2lkIExpbmtMYXR0ZXJTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisgIHZvaWQgQ2xlYXJXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgUGxhY2VSYW5nZSk7CisgIENQVlRfV29yZFBsYWNlIENsZWFyTGVmdFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgQ2xlYXJSaWdodFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKworIHByaXZhdGU6CisgIENQVlRfRmxvYXRSZWN0IFJlYXJyYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgUGxhY2VSYW5nZSk7CisgIEZYX0ZMT0FUIEdldEF1dG9Gb250U2l6ZSgpOworICBGWF9CT09MIElzQmlnZ2VyKEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIENQVlRfRmxvYXRSZWN0IFJlYXJyYW5nZVNlY3Rpb25zKGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKTsKKworIHByaXZhdGU6CisgIHZvaWQgUmVzZXRTZWN0aW9uQXJyYXkoKTsKKworIHByaXZhdGU6CisgIENQVlRfQXJyYXlUZW1wbGF0ZTxDU2VjdGlvbio+IG1fU2VjdGlvbkFycmF5OworICBpbnQzMl90IG1fbkxpbWl0Q2hhcjsKKyAgaW50MzJfdCBtX25DaGFyQXJyYXk7CisgIEZYX0JPT0wgbV9iTXVsdGlMaW5lOworICBGWF9CT09MIG1fYkxpbWl0V2lkdGg7CisgIEZYX0JPT0wgbV9iQXV0b0ZvbnRTaXplOworICBpbnQzMl90IG1fbkFsaWdubWVudDsKKyAgRlhfRkxPQVQgbV9mTGluZUxlYWRpbmc7CisgIEZYX0ZMT0FUIG1fZkNoYXJTcGFjZTsKKyAgaW50MzJfdCBtX25Ib3J6U2NhbGU7CisgIEZYX1dPUkQgbV93U3ViV29yZDsKKyAgRlhfRkxPQVQgbV9mRm9udFNpemU7CisKKyBwcml2YXRlOgorICBGWF9CT09MIG1fYkluaXRpYWw7CisgIEZYX0JPT0wgbV9iUmljaFRleHQ7CisgIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBtX3BWVFByb3ZpZGVyOworICBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogbV9wVlRJdGVyYXRvcjsKK307CitjbGFzcyBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciA6IHB1YmxpYyBJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciB7CisgcHVibGljOgorICBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcihDUERGX1ZhcmlhYmxlVGV4dCogcFZUKTsKKyAgdmlydHVhbCB+Q1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IoKTsKKyAgRlhfQk9PTCBOZXh0V29yZCgpOworICBGWF9CT09MIFByZXZXb3JkKCk7CisgIEZYX0JPT0wgTmV4dExpbmUoKTsKKyAgRlhfQk9PTCBQcmV2TGluZSgpOworICBGWF9CT09MIE5leHRTZWN0aW9uKCk7CisgIEZYX0JPT0wgUHJldlNlY3Rpb24oKTsKKyAgRlhfQk9PTCBTZXRXb3JkKGNvbnN0IENQVlRfV29yZCYgd29yZCk7CisgIEZYX0JPT0wgR2V0V29yZChDUFZUX1dvcmQmIHdvcmQpIGNvbnN0OworICBGWF9CT09MIEdldExpbmUoQ1BWVF9MaW5lJiBsaW5lKSBjb25zdDsKKyAgRlhfQk9PTCBHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiYgc2VjdGlvbikgY29uc3Q7CisgIEZYX0JPT0wgU2V0U2VjdGlvbihjb25zdCBDUFZUX1NlY3Rpb24mIHNlY3Rpb24pOworICB2b2lkIFNldEF0KGludDMyX3QgbldvcmRJbmRleCk7CisgIHZvaWQgU2V0QXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKyAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIEdldEF0KCkgY29uc3QgeyByZXR1cm4gbV9DdXJQb3M7IH07CisKKyBwcml2YXRlOgorICBDUFZUX1dvcmRQbGFjZSBtX0N1clBvczsKKyAgQ1BERl9WYXJpYWJsZVRleHQqIG1fcFZUOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX1NSQ19GUERGRE9DX1BERl9WVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy90YWdnZWRfaW50LmggYi9jb3JlL3NyYy9mcGRmZG9jL3RhZ2dlZF9pbnQuaAppbmRleCA5YzY0M2E2Li43Y2YzNjgwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL3RhZ2dlZF9pbnQuaAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL3RhZ2dlZF9pbnQuaApAQCAtMTAsODYgKzEwLDkwIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdGFnZ2VkLmgiCiAKIGNsYXNzIENQREZfU3RydWN0RWxlbWVudEltcGw7Ci1jbGFzcyBDUERGX1N0cnVjdFRyZWVJbXBsIDogcHVibGljIENQREZfU3RydWN0VHJlZQotewotcHVibGljOgotICAgIENQREZfU3RydWN0VHJlZUltcGwoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYyk7Ci0gICAgfkNQREZfU3RydWN0VHJlZUltcGwoKTsKLSAgICBpbnQJCQlDb3VudFRvcEVsZW1lbnRzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0tpZHMuR2V0U2l6ZSgpOwotICAgIH0KLSAgICBDUERGX1N0cnVjdEVsZW1lbnQqCUdldFRvcEVsZW1lbnQoaW50IGkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKENQREZfU3RydWN0RWxlbWVudCopbV9LaWRzLkdldEF0KGkpOwotICAgIH0KLSAgICB2b2lkCQlMb2FkRG9jVHJlZSgpOwotICAgIHZvaWQJCUxvYWRQYWdlVHJlZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCk7Ci0gICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogQWRkUGFnZU5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCwgQ0ZYX01hcFB0clRvUHRyJiBtYXAsIGludCBuTGV2ZWwgPSAwKTsKLSAgICBGWF9CT09MCQlBZGRUb3BMZXZlbE5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcEVsZW1lbnQpOwotcHJvdGVjdGVkOgotICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSoJbV9wVHJlZVJvb3Q7Ci0gICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KgltX3BSb2xlTWFwOwotICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSoJbV9wUGFnZTsKLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1N0cnVjdEVsZW1lbnRJbXBsKj4JbV9LaWRzOwotICAgIGZyaWVuZCBjbGFzcyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOworY2xhc3MgQ1BERl9TdHJ1Y3RUcmVlSW1wbCA6IHB1YmxpYyBDUERGX1N0cnVjdFRyZWUgeworIHB1YmxpYzoKKyAgQ1BERl9TdHJ1Y3RUcmVlSW1wbChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKTsKKyAgfkNQREZfU3RydWN0VHJlZUltcGwoKTsKKyAgaW50IENvdW50VG9wRWxlbWVudHMoKSBjb25zdCB7IHJldHVybiBtX0tpZHMuR2V0U2l6ZSgpOyB9CisgIENQREZfU3RydWN0RWxlbWVudCogR2V0VG9wRWxlbWVudChpbnQgaSkgY29uc3QgeworICAgIHJldHVybiAoQ1BERl9TdHJ1Y3RFbGVtZW50KiltX0tpZHMuR2V0QXQoaSk7CisgIH0KKyAgdm9pZCBMb2FkRG9jVHJlZSgpOworICB2b2lkIExvYWRQYWdlVHJlZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCk7CisgIENQREZfU3RydWN0RWxlbWVudEltcGwqIEFkZFBhZ2VOb2RlKENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXBQdHJUb1B0ciYgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkxldmVsID0gMCk7CisgIEZYX0JPT0wgQWRkVG9wTGV2ZWxOb2RlKENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBFbGVtZW50KTsKKworIHByb3RlY3RlZDoKKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBtX3BUcmVlUm9vdDsKKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBtX3BSb2xlTWFwOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIG1fcFBhZ2U7CisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RydWN0RWxlbWVudEltcGwqPiBtX0tpZHM7CisgIGZyaWVuZCBjbGFzcyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOwogfTsKLWNsYXNzIENQREZfU3RydWN0RWxlbWVudEltcGwgZmluYWwgOiBwdWJsaWMgQ1BERl9TdHJ1Y3RFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbChDUERGX1N0cnVjdFRyZWVJbXBsKiBwVHJlZSwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFBhcmVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7Ci0gICAgQ1BERl9TdHJ1Y3RUcmVlKgkJR2V0VHJlZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wVHJlZTsKLSAgICB9Ci0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCUdldFR5cGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fVHlwZTsKLSAgICB9Ci0gICAgQ1BERl9TdHJ1Y3RFbGVtZW50KgkJR2V0UGFyZW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYXJlbnQ7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSAqCQlHZXREaWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0OwotICAgIH0KLSAgICBpbnQJCQkJCQlDb3VudEtpZHMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fS2lkcy5HZXRTaXplKCk7Ci0gICAgfQotICAgIGNvbnN0IENQREZfU3RydWN0S2lkJglHZXRLaWQoaW50IGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fS2lkcy5HZXREYXRhKClbaW5kZXhdOwotICAgIH0KLSAgICBDRlhfUHRyQXJyYXkqCQkJR2V0T2JqZWN0QXJyYXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICZtX09iamVjdEFycmF5OwotICAgIH0KK2NsYXNzIENQREZfU3RydWN0RWxlbWVudEltcGwgZmluYWwgOiBwdWJsaWMgQ1BERl9TdHJ1Y3RFbGVtZW50IHsKKyBwdWJsaWM6CisgIENQREZfU3RydWN0RWxlbWVudEltcGwoQ1BERl9TdHJ1Y3RUcmVlSW1wbCogcFRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgQ1BERl9TdHJ1Y3RUcmVlKiBHZXRUcmVlKCkgY29uc3QgeyByZXR1cm4gbV9wVHJlZTsgfQorICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fVHlwZTsgfQorICBDUERGX1N0cnVjdEVsZW1lbnQqIEdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhcmVudDsgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0OyB9CisgIGludCBDb3VudEtpZHMoKSBjb25zdCB7IHJldHVybiBtX0tpZHMuR2V0U2l6ZSgpOyB9CisgIGNvbnN0IENQREZfU3RydWN0S2lkJiBHZXRLaWQoaW50IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1fS2lkcy5HZXREYXRhKClbaW5kZXhdOworICB9CisgIENGWF9QdHJBcnJheSogR2V0T2JqZWN0QXJyYXkoKSB7IHJldHVybiAmbV9PYmplY3RBcnJheTsgfQogCi0gICAgQ1BERl9PYmplY3QqCQkJR2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIEZYX0ZMT0FUIGZMZXZlbCA9IDAuMEYpOworICBDUERGX09iamVjdCogR2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMZXZlbCA9IDAuMEYpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7Ci0gICAgRlhfQVJHQgkJCQkJR2V0Q29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKTsKLSAgICBGWF9GTE9BVAkJCQlHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7Ci0gICAgaW50CQkJCQkJR2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7Ci0gICAgQ0ZYX1B0ckFycmF5CQkJbV9PYmplY3RBcnJheTsKLSAgICB2b2lkCQkJCQlMb2FkS2lkcyhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKLSAgICB2b2lkCQkJCQlMb2FkS2lkKEZYX0RXT1JEIFBhZ2VPYmpOdW0sIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX1N0cnVjdEtpZCogcEtpZCk7Ci0gICAgQ1BERl9PYmplY3QqCQkJR2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpOwotICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqCVJldGFpbigpOwotICAgIHZvaWQJCQkJCVJlbGVhc2UoKTsKLXByb3RlY3RlZDoKLSAgICB+Q1BERl9TdHJ1Y3RFbGVtZW50SW1wbCgpOworICBDRlhfQnl0ZVN0cmluZyBHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCA9IC0xKTsKKyAgRlhfQVJHQiBHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXggPSAtMSk7CisgIEZYX0ZMT0FUIEdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXggPSAtMSk7CisgIGludCBHZXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsCisgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCA9IC0xKTsKKyAgQ0ZYX1B0ckFycmF5IG1fT2JqZWN0QXJyYXk7CisgIHZvaWQgTG9hZEtpZHMoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisgIHZvaWQgTG9hZEtpZChGWF9EV09SRCBQYWdlT2JqTnVtLCBDUERGX09iamVjdCogcE9iaiwgQ1BERl9TdHJ1Y3RLaWQqIHBLaWQpOworICBDUERGX09iamVjdCogR2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXgpOworICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBSZXRhaW4oKTsKKyAgdm9pZCBSZWxlYXNlKCk7CiAKLSAgICBDUERGX1N0cnVjdFRyZWVJbXBsKgltX3BUcmVlOwotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9UeXBlOwotICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqCW1fcFBhcmVudDsKLSAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BEaWN0OwotICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RydWN0S2lkPgltX0tpZHM7Ci0gICAgaW50CQkJbV9SZWZDb3VudDsKKyBwcm90ZWN0ZWQ6CisgIH5DUERGX1N0cnVjdEVsZW1lbnRJbXBsKCk7CiAKLSAgICBmcmllbmQgY2xhc3MgQ1BERl9TdHJ1Y3RUcmVlSW1wbDsKKyAgQ1BERl9TdHJ1Y3RUcmVlSW1wbCogbV9wVHJlZTsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9UeXBlOworICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBtX3BQYXJlbnQ7CisgIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9TdHJ1Y3RLaWQ+IG1fS2lkczsKKyAgaW50IG1fUmVmQ291bnQ7CisKKyAgZnJpZW5kIGNsYXNzIENQREZfU3RydWN0VHJlZUltcGw7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZET0NfVEFHR0VEX0lOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0LmNwcCBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5jcHAKaW5kZXggMDAzYWYzMC4uNDg0MDJkZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHQuY3BwCkBAIC0xNCw3NzMgKzE0LDc5OSBAQAogI2luY2x1ZGUgInRleHRfaW50LmgiCiAjaW5jbHVkZSAidHh0cHJvYy5oIgogCi1DRlhfQnl0ZVN0cmluZyBDaGFyRnJvbVVuaWNvZGVBbHQoRlhfV0NIQVIgdW5pY29kZSwgaW50IGRlc3RjcCwgY29uc3QgRlhfQ0hBUiogZGVmY2hhcikKLXsKLSAgICBpZiAoZGVzdGNwID09IDApIHsKLSAgICAgICAgaWYgKHVuaWNvZGUgPCAweDgwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKGNoYXIpdW5pY29kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgRlhfQ0hBUiogYWx0c3RyID0gRkNTX0dldEFsdFN0cih1bmljb2RlKTsKLSAgICAgICAgaWYgKGFsdHN0cikgewotICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGFsdHN0ciwgLTEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhkZWZjaGFyLCAtMSk7Ci0gICAgfQotICAgIGNoYXIgYnVmWzEwXTsKLSAgICBpbnQgaURlZiA9IDA7Ci0gICAgaW50IHJldCA9IEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoZGVzdGNwLCAwLCAod2NoYXJfdCopJnVuaWNvZGUsIDEsIGJ1ZiwgMTAsIE5VTEwsICZpRGVmKTsKLSAgICBpZiAocmV0ICYmICFpRGVmKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYsIHJldCk7CitDRlhfQnl0ZVN0cmluZyBDaGFyRnJvbVVuaWNvZGVBbHQoRlhfV0NIQVIgdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGRlZmNoYXIpIHsKKyAgaWYgKGRlc3RjcCA9PSAwKSB7CisgICAgaWYgKHVuaWNvZGUgPCAweDgwKSB7CisgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKGNoYXIpdW5pY29kZSk7CiAgICAgfQogICAgIGNvbnN0IEZYX0NIQVIqIGFsdHN0ciA9IEZDU19HZXRBbHRTdHIodW5pY29kZSk7CiAgICAgaWYgKGFsdHN0cikgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoYWx0c3RyLCAtMSk7CisgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoYWx0c3RyLCAtMSk7CiAgICAgfQogICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhkZWZjaGFyLCAtMSk7CisgIH0KKyAgY2hhciBidWZbMTBdOworICBpbnQgaURlZiA9IDA7CisgIGludCByZXQgPSBGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKGRlc3RjcCwgMCwgKHdjaGFyX3QqKSZ1bmljb2RlLCAxLCBidWYsIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmaURlZik7CisgIGlmIChyZXQgJiYgIWlEZWYpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoYnVmLCByZXQpOworICB9CisgIGNvbnN0IEZYX0NIQVIqIGFsdHN0ciA9IEZDU19HZXRBbHRTdHIodW5pY29kZSk7CisgIGlmIChhbHRzdHIpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoYWx0c3RyLCAtMSk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGRlZmNoYXIsIC0xKTsKIH0KLUNUZXh0UGFnZTo6Q1RleHRQYWdlKCkKLXsKK0NUZXh0UGFnZTo6Q1RleHRQYWdlKCkge30KK0NUZXh0UGFnZTo6fkNUZXh0UGFnZSgpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkrKykgeworICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKKyAgICBkZWxldGUgcEJhc2VMaW5lOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBtX1RleHRDb2x1bW5zLkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRDb2x1bW4qIHBUZXh0Q29sdW1uID0gKENUZXh0Q29sdW1uKiltX1RleHRDb2x1bW5zLkdldEF0KGkpOworICAgIGRlbGV0ZSBwVGV4dENvbHVtbjsKKyAgfQogfQotQ1RleHRQYWdlOjp+Q1RleHRQYWdlKCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKLSAgICAgICAgZGVsZXRlIHBCYXNlTGluZTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fVGV4dENvbHVtbnMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0Q29sdW1uKiBwVGV4dENvbHVtbiA9IChDVGV4dENvbHVtbiopbV9UZXh0Q29sdW1ucy5HZXRBdChpKTsKLSAgICAgICAgZGVsZXRlIHBUZXh0Q29sdW1uOwotICAgIH0KLX0KLXZvaWQgQ1RleHRQYWdlOjpQcm9jZXNzT2JqZWN0KENQREZfUGFnZU9iamVjdCogcE9iamVjdCkKLXsKLSAgICBpZiAocE9iamVjdC0+bV9UeXBlICE9IFBERlBBR0VfVEVYVCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfVGV4dE9iamVjdCogcFRleHQgPSAoQ1BERl9UZXh0T2JqZWN0KilwT2JqZWN0OwotICAgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0Rm9udCgpOwotICAgIGludCBjb3VudCA9IHBUZXh0LT5Db3VudEl0ZW1zKCk7Ci0gICAgRlhfRkxPQVQqIHBQb3NBcnJheSA9IEZYX0FsbG9jMkQoRlhfRkxPQVQsIGNvdW50LCAyKTsKLSAgICBwVGV4dC0+Q2FsY0NoYXJQb3MocFBvc0FycmF5KTsKK3ZvaWQgQ1RleHRQYWdlOjpQcm9jZXNzT2JqZWN0KENQREZfUGFnZU9iamVjdCogcE9iamVjdCkgeworICBpZiAocE9iamVjdC0+bV9UeXBlICE9IFBERlBBR0VfVEVYVCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1RleHRPYmplY3QqIHBUZXh0ID0gKENQREZfVGV4dE9iamVjdCopcE9iamVjdDsKKyAgQ1BERl9Gb250KiBwRm9udCA9IHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250KCk7CisgIGludCBjb3VudCA9IHBUZXh0LT5Db3VudEl0ZW1zKCk7CisgIEZYX0ZMT0FUKiBwUG9zQXJyYXkgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBjb3VudCwgMik7CisgIHBUZXh0LT5DYWxjQ2hhclBvcyhwUG9zQXJyYXkpOwogCi0gICAgRlhfRkxPQVQgZm9udHNpemVfaCA9IHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZUgoKTsKLSAgICBGWF9GTE9BVCBmb250c2l6ZV92ID0gcFRleHQtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplVigpOwotICAgIEZYX0RXT1JEIHNwYWNlX2NoYXJjb2RlID0gcEZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUoJyAnKTsKLSAgICBGWF9GTE9BVCBzcGFjZXcgPSAwOwotICAgIGlmIChzcGFjZV9jaGFyY29kZSAhPSAtMSkgewotICAgICAgICBzcGFjZXcgPSBmb250c2l6ZV9oICogcEZvbnQtPkdldENoYXJXaWR0aEYoc3BhY2VfY2hhcmNvZGUpIC8gMTAwMDsKLSAgICB9Ci0gICAgaWYgKHNwYWNldyA9PSAwKSB7Ci0gICAgICAgIHNwYWNldyA9IGZvbnRzaXplX2ggLyA0OwotICAgIH0KLSAgICBpZiAocFRleHQtPm1fVGV4dFN0YXRlLkdldEJhc2VsaW5lQW5nbGUoKSAhPSAwKSB7Ci0gICAgICAgIGludCBjYyA9IDA7Ci0gICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgICAgICBwVGV4dC0+R2V0VGV4dE1hdHJpeCgmbWF0cml4KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwVGV4dC0+bV9uQ2hhcnM7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gcFRleHQtPm1fbkNoYXJzID09IDEgPyAoRlhfRFdPUkQpKHVpbnRwdHJfdClwVGV4dC0+bV9wQ2hhckNvZGVzIDogcFRleHQtPm1fcENoYXJDb2Rlc1tpXTsKLSAgICAgICAgICAgIGlmIChjaGFyY29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfUkVDVCBjaGFyX2JveDsKLSAgICAgICAgICAgIHBGb250LT5HZXRDaGFyQkJveChjaGFyY29kZSwgY2hhcl9ib3gpOwotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl9sZWZ0ID0gcFBvc0FycmF5ID8gcFBvc0FycmF5W2NjICogMl0gOiBjaGFyX2JveC5sZWZ0ICogcFRleHQtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl9yaWdodCA9IHBQb3NBcnJheSA/IHBQb3NBcnJheVtjYyAqIDIgKyAxXSA6IGNoYXJfYm94LnJpZ2h0ICogcFRleHQtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl90b3AgPSBjaGFyX2JveC50b3AgKiBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgICAgICAgICBGWF9GTE9BVCBjaGFyX2JvdHRvbSA9IGNoYXJfYm94LmJvdHRvbSAqIHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgICAgICAgICAgIGNjICsrOwotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl9vcmlneCwgY2hhcl9vcmlneTsKLSAgICAgICAgICAgIG1hdHJpeC5UcmFuc2Zvcm0oY2hhcl9sZWZ0LCAwLCBjaGFyX29yaWd4LCBjaGFyX29yaWd5KTsKLSAgICAgICAgICAgIG1hdHJpeC5UcmFuc2Zvcm1SZWN0KGNoYXJfbGVmdCwgY2hhcl9yaWdodCwgY2hhcl90b3AsIGNoYXJfYm90dG9tKTsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICAgICAgICAgIHBGb250LT5BcHBlbmRDaGFyKHN0ciwgY2hhcmNvZGUpOwotICAgICAgICAgICAgSW5zZXJ0VGV4dEJveChOVUxMLCBjaGFyX29yaWd5LCBjaGFyX2xlZnQsIGNoYXJfcmlnaHQsIGNoYXJfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2JvdHRvbSwgc3BhY2V3LCBmb250c2l6ZV92LCBzdHIsIHBGb250KTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFBvc0FycmF5KSB7Ci0gICAgICAgICAgICBGWF9GcmVlKHBQb3NBcnJheSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9GTE9BVCByYXRpb19oID0gZm9udHNpemVfaCAvIHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBjb3VudCAqIDI7IGlpICsrKSB7Ci0gICAgICAgIHBQb3NBcnJheVtpaV0gKj0gcmF0aW9faDsKLSAgICB9Ci0gICAgRlhfRkxPQVQgYmFzZWxpbmUgPSBwVGV4dC0+bV9Qb3NZOwotICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IE5VTEw7Ci0gICAgRlhfRkxPQVQgdG9weSA9IHBUZXh0LT5tX1RvcDsKLSAgICBGWF9GTE9BVCBib3R0b215ID0gcFRleHQtPm1fQm90dG9tOwotICAgIEZYX0ZMT0FUIGxlZnR4ID0gcFRleHQtPm1fTGVmdDsKKyAgRlhfRkxPQVQgZm9udHNpemVfaCA9IHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZUgoKTsKKyAgRlhfRkxPQVQgZm9udHNpemVfdiA9IHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZVYoKTsKKyAgRlhfRFdPUkQgc3BhY2VfY2hhcmNvZGUgPSBwRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSgnICcpOworICBGWF9GTE9BVCBzcGFjZXcgPSAwOworICBpZiAoc3BhY2VfY2hhcmNvZGUgIT0gLTEpIHsKKyAgICBzcGFjZXcgPSBmb250c2l6ZV9oICogcEZvbnQtPkdldENoYXJXaWR0aEYoc3BhY2VfY2hhcmNvZGUpIC8gMTAwMDsKKyAgfQorICBpZiAoc3BhY2V3ID09IDApIHsKKyAgICBzcGFjZXcgPSBmb250c2l6ZV9oIC8gNDsKKyAgfQorICBpZiAocFRleHQtPm1fVGV4dFN0YXRlLkdldEJhc2VsaW5lQW5nbGUoKSAhPSAwKSB7CiAgICAgaW50IGNjID0gMDsKLSAgICBDRlhfQnl0ZVN0cmluZyBzZWdtZW50OwotICAgIGludCBzcGFjZV9jb3VudCA9IDA7Ci0gICAgRlhfRkxPQVQgbGFzdF9sZWZ0ID0gMCwgbGFzdF9yaWdodCA9IDAsIHNlZ21lbnRfbGVmdCA9IDAsIHNlZ21lbnRfcmlnaHQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcFRleHQtPm1fbkNoYXJzOyBpICsrKSB7Ci0gICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gcFRleHQtPm1fbkNoYXJzID09IDEgPyAoRlhfRFdPUkQpKHVpbnRwdHJfdClwVGV4dC0+bV9wQ2hhckNvZGVzIDogcFRleHQtPm1fcENoYXJDb2Rlc1tpXTsKLSAgICAgICAgaWYgKGNoYXJjb2RlID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBjaGFyX2xlZnQgPSBwUG9zQXJyYXlbY2MgKiAyXTsKLSAgICAgICAgRlhfRkxPQVQgY2hhcl9yaWdodCA9IHBQb3NBcnJheVtjYyAqIDIgKyAxXTsKLSAgICAgICAgY2MgKys7Ci0gICAgICAgIGlmIChjaGFyX2xlZnQgPCBsYXN0X2xlZnQgfHwgKGNoYXJfbGVmdCAtIGxhc3RfcmlnaHQpID4gc3BhY2V3IC8gMikgewotICAgICAgICAgICAgcEJhc2VMaW5lID0gSW5zZXJ0VGV4dEJveChwQmFzZUxpbmUsIGJhc2VsaW5lLCBsZWZ0eCArIHNlZ21lbnRfbGVmdCwgbGVmdHggKyBzZWdtZW50X3JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3B5LCBib3R0b215LCBzcGFjZXcsIGZvbnRzaXplX3YsIHNlZ21lbnQsIHBGb250KTsKLSAgICAgICAgICAgIHNlZ21lbnRfbGVmdCA9IGNoYXJfbGVmdDsKLSAgICAgICAgICAgIHNlZ21lbnQgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3BhY2VfY291bnQgPiAxKSB7Ci0gICAgICAgICAgICBwQmFzZUxpbmUgPSBJbnNlcnRUZXh0Qm94KHBCYXNlTGluZSwgYmFzZWxpbmUsIGxlZnR4ICsgc2VnbWVudF9sZWZ0LCBsZWZ0eCArIHNlZ21lbnRfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcHksIGJvdHRvbXksIHNwYWNldywgZm9udHNpemVfdiwgc2VnbWVudCwgcEZvbnQpOwotICAgICAgICAgICAgc2VnbWVudCA9ICIiOwotICAgICAgICB9IGVsc2UgaWYgKHNwYWNlX2NvdW50ID09IDEpIHsKLSAgICAgICAgICAgIHBGb250LT5BcHBlbmRDaGFyKHNlZ21lbnQsICcgJyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlZ21lbnQuR2V0TGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgc2VnbWVudF9sZWZ0ID0gY2hhcl9sZWZ0OwotICAgICAgICB9Ci0gICAgICAgIHNlZ21lbnRfcmlnaHQgPSBjaGFyX3JpZ2h0OwotICAgICAgICBwRm9udC0+QXBwZW5kQ2hhcihzZWdtZW50LCBjaGFyY29kZSk7Ci0gICAgICAgIHNwYWNlX2NvdW50ID0gMDsKLSAgICAgICAgbGFzdF9sZWZ0ID0gY2hhcl9sZWZ0OwotICAgICAgICBsYXN0X3JpZ2h0ID0gY2hhcl9yaWdodDsKKyAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKKyAgICBwVGV4dC0+R2V0VGV4dE1hdHJpeCgmbWF0cml4KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBUZXh0LT5tX25DaGFyczsgaSsrKSB7CisgICAgICBGWF9EV09SRCBjaGFyY29kZSA9IHBUZXh0LT5tX25DaGFycyA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChGWF9EV09SRCkodWludHB0cl90KXBUZXh0LT5tX3BDaGFyQ29kZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcFRleHQtPm1fcENoYXJDb2Rlc1tpXTsKKyAgICAgIGlmIChjaGFyY29kZSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBGWF9SRUNUIGNoYXJfYm94OworICAgICAgcEZvbnQtPkdldENoYXJCQm94KGNoYXJjb2RlLCBjaGFyX2JveCk7CisgICAgICBGWF9GTE9BVCBjaGFyX2xlZnQgPQorICAgICAgICAgIHBQb3NBcnJheSA/IHBQb3NBcnJheVtjYyAqIDJdCisgICAgICAgICAgICAgICAgICAgIDogY2hhcl9ib3gubGVmdCAqIHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpIC8gMTAwMDsKKyAgICAgIEZYX0ZMT0FUIGNoYXJfcmlnaHQgPQorICAgICAgICAgIHBQb3NBcnJheSA/IHBQb3NBcnJheVtjYyAqIDIgKyAxXQorICAgICAgICAgICAgICAgICAgICA6IGNoYXJfYm94LnJpZ2h0ICogcFRleHQtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOworICAgICAgRlhfRkxPQVQgY2hhcl90b3AgPQorICAgICAgICAgIGNoYXJfYm94LnRvcCAqIHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpIC8gMTAwMDsKKyAgICAgIEZYX0ZMT0FUIGNoYXJfYm90dG9tID0KKyAgICAgICAgICBjaGFyX2JveC5ib3R0b20gKiBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSAvIDEwMDA7CisgICAgICBjYysrOworICAgICAgRlhfRkxPQVQgY2hhcl9vcmlneCwgY2hhcl9vcmlneTsKKyAgICAgIG1hdHJpeC5UcmFuc2Zvcm0oY2hhcl9sZWZ0LCAwLCBjaGFyX29yaWd4LCBjaGFyX29yaWd5KTsKKyAgICAgIG1hdHJpeC5UcmFuc2Zvcm1SZWN0KGNoYXJfbGVmdCwgY2hhcl9yaWdodCwgY2hhcl90b3AsIGNoYXJfYm90dG9tKTsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKKyAgICAgIHBGb250LT5BcHBlbmRDaGFyKHN0ciwgY2hhcmNvZGUpOworICAgICAgSW5zZXJ0VGV4dEJveChOVUxMLCBjaGFyX29yaWd5LCBjaGFyX2xlZnQsIGNoYXJfcmlnaHQsIGNoYXJfdG9wLAorICAgICAgICAgICAgICAgICAgICBjaGFyX2JvdHRvbSwgc3BhY2V3LCBmb250c2l6ZV92LCBzdHIsIHBGb250KTsKICAgICB9Ci0gICAgaWYgKHNlZ21lbnQuR2V0TGVuZ3RoKCkpCi0gICAgICAgIHBCYXNlTGluZSA9IEluc2VydFRleHRCb3gocEJhc2VMaW5lLCBiYXNlbGluZSwgbGVmdHggKyBzZWdtZW50X2xlZnQsIGxlZnR4ICsgc2VnbWVudF9yaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3B5LCBib3R0b215LCBzcGFjZXcsIGZvbnRzaXplX3YsIHNlZ21lbnQsIHBGb250KTsKLSAgICBGWF9GcmVlKHBQb3NBcnJheSk7CisgICAgaWYgKHBQb3NBcnJheSkgeworICAgICAgRlhfRnJlZShwUG9zQXJyYXkpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgRlhfRkxPQVQgcmF0aW9faCA9IGZvbnRzaXplX2ggLyBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKKyAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGNvdW50ICogMjsgaWkrKykgeworICAgIHBQb3NBcnJheVtpaV0gKj0gcmF0aW9faDsKKyAgfQorICBGWF9GTE9BVCBiYXNlbGluZSA9IHBUZXh0LT5tX1Bvc1k7CisgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IE5VTEw7CisgIEZYX0ZMT0FUIHRvcHkgPSBwVGV4dC0+bV9Ub3A7CisgIEZYX0ZMT0FUIGJvdHRvbXkgPSBwVGV4dC0+bV9Cb3R0b207CisgIEZYX0ZMT0FUIGxlZnR4ID0gcFRleHQtPm1fTGVmdDsKKyAgaW50IGNjID0gMDsKKyAgQ0ZYX0J5dGVTdHJpbmcgc2VnbWVudDsKKyAgaW50IHNwYWNlX2NvdW50ID0gMDsKKyAgRlhfRkxPQVQgbGFzdF9sZWZ0ID0gMCwgbGFzdF9yaWdodCA9IDAsIHNlZ21lbnRfbGVmdCA9IDAsIHNlZ21lbnRfcmlnaHQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHBUZXh0LT5tX25DaGFyczsgaSsrKSB7CisgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBwVGV4dC0+bV9uQ2hhcnMgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKEZYX0RXT1JEKSh1aW50cHRyX3QpcFRleHQtPm1fcENoYXJDb2RlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcFRleHQtPm1fcENoYXJDb2Rlc1tpXTsKKyAgICBpZiAoY2hhcmNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgRlhfRkxPQVQgY2hhcl9sZWZ0ID0gcFBvc0FycmF5W2NjICogMl07CisgICAgRlhfRkxPQVQgY2hhcl9yaWdodCA9IHBQb3NBcnJheVtjYyAqIDIgKyAxXTsKKyAgICBjYysrOworICAgIGlmIChjaGFyX2xlZnQgPCBsYXN0X2xlZnQgfHwgKGNoYXJfbGVmdCAtIGxhc3RfcmlnaHQpID4gc3BhY2V3IC8gMikgeworICAgICAgcEJhc2VMaW5lID0gSW5zZXJ0VGV4dEJveChwQmFzZUxpbmUsIGJhc2VsaW5lLCBsZWZ0eCArIHNlZ21lbnRfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdHggKyBzZWdtZW50X3JpZ2h0LCB0b3B5LCBib3R0b215LCBzcGFjZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzaXplX3YsIHNlZ21lbnQsIHBGb250KTsKKyAgICAgIHNlZ21lbnRfbGVmdCA9IGNoYXJfbGVmdDsKKyAgICAgIHNlZ21lbnQgPSAiIjsKKyAgICB9CisgICAgaWYgKHNwYWNlX2NvdW50ID4gMSkgeworICAgICAgcEJhc2VMaW5lID0gSW5zZXJ0VGV4dEJveChwQmFzZUxpbmUsIGJhc2VsaW5lLCBsZWZ0eCArIHNlZ21lbnRfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdHggKyBzZWdtZW50X3JpZ2h0LCB0b3B5LCBib3R0b215LCBzcGFjZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzaXplX3YsIHNlZ21lbnQsIHBGb250KTsKKyAgICAgIHNlZ21lbnQgPSAiIjsKKyAgICB9IGVsc2UgaWYgKHNwYWNlX2NvdW50ID09IDEpIHsKKyAgICAgIHBGb250LT5BcHBlbmRDaGFyKHNlZ21lbnQsICcgJyk7CisgICAgfQorICAgIGlmIChzZWdtZW50LkdldExlbmd0aCgpID09IDApIHsKKyAgICAgIHNlZ21lbnRfbGVmdCA9IGNoYXJfbGVmdDsKKyAgICB9CisgICAgc2VnbWVudF9yaWdodCA9IGNoYXJfcmlnaHQ7CisgICAgcEZvbnQtPkFwcGVuZENoYXIoc2VnbWVudCwgY2hhcmNvZGUpOworICAgIHNwYWNlX2NvdW50ID0gMDsKKyAgICBsYXN0X2xlZnQgPSBjaGFyX2xlZnQ7CisgICAgbGFzdF9yaWdodCA9IGNoYXJfcmlnaHQ7CisgIH0KKyAgaWYgKHNlZ21lbnQuR2V0TGVuZ3RoKCkpCisgICAgcEJhc2VMaW5lID0gSW5zZXJ0VGV4dEJveChwQmFzZUxpbmUsIGJhc2VsaW5lLCBsZWZ0eCArIHNlZ21lbnRfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnR4ICsgc2VnbWVudF9yaWdodCwgdG9weSwgYm90dG9teSwgc3BhY2V3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHNpemVfdiwgc2VnbWVudCwgcEZvbnQpOworICBGWF9GcmVlKHBQb3NBcnJheSk7CiB9Ci1DVGV4dEJhc2VMaW5lKiBDVGV4dFBhZ2U6Okluc2VydFRleHRCb3goQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lLCBGWF9GTE9BVCBiYXNleSwgRlhfRkxPQVQgbGVmdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHR4LCBGWF9GTE9BVCB0b3B5LCBGWF9GTE9BVCBib3R0b215LCBGWF9GTE9BVCBzcGFjZXcsIEZYX0ZMT0FUIGZvbnRzaXplX3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgQ1BERl9Gb250KiBwRm9udCkKLXsKLSAgICBpZiAoc3RyLkdldExlbmd0aCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitDVGV4dEJhc2VMaW5lKiBDVGV4dFBhZ2U6Okluc2VydFRleHRCb3goQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJhc2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxlZnR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJpZ2h0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3BhY2V3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250KSB7CisgIGlmIChzdHIuR2V0TGVuZ3RoKCkgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChwQmFzZUxpbmUgPT0gTlVMTCkgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkrKykgeworICAgICAgQ1RleHRCYXNlTGluZSogcEV4aXN0TGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKKyAgICAgIGlmIChwRXhpc3RMaW5lLT5tX0Jhc2VMaW5lID09IGJhc2V5KSB7CisgICAgICAgIHBCYXNlTGluZSA9IHBFeGlzdExpbmU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHBFeGlzdExpbmUtPm1fQmFzZUxpbmUgPCBiYXNleSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9CiAgICAgaWYgKHBCYXNlTGluZSA9PSBOVUxMKSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICBDVGV4dEJhc2VMaW5lKiBwRXhpc3RMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkpOwotICAgICAgICAgICAgaWYgKHBFeGlzdExpbmUtPm1fQmFzZUxpbmUgPT0gYmFzZXkpIHsKLSAgICAgICAgICAgICAgICBwQmFzZUxpbmUgPSBwRXhpc3RMaW5lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBFeGlzdExpbmUtPm1fQmFzZUxpbmUgPCBiYXNleSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwQmFzZUxpbmUgPT0gTlVMTCkgewotICAgICAgICAgICAgcEJhc2VMaW5lID0gRlhfTkVXIENUZXh0QmFzZUxpbmU7Ci0gICAgICAgICAgICBpZiAoTlVMTCA9PSBwQmFzZUxpbmUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBCYXNlTGluZS0+bV9CYXNlTGluZSA9IGJhc2V5OwotICAgICAgICAgICAgbV9CYXNlTGluZXMuSW5zZXJ0QXQoaSwgcEJhc2VMaW5lKTsKLSAgICAgICAgfQorICAgICAgcEJhc2VMaW5lID0gRlhfTkVXIENUZXh0QmFzZUxpbmU7CisgICAgICBpZiAoTlVMTCA9PSBwQmFzZUxpbmUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBwQmFzZUxpbmUtPm1fQmFzZUxpbmUgPSBiYXNleTsKKyAgICAgIG1fQmFzZUxpbmVzLkluc2VydEF0KGksIHBCYXNlTGluZSk7CiAgICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHRleHQ7Ci0gICAgY29uc3QgRlhfQ0hBUiogcFN0ciA9IHN0cjsKLSAgICBpbnQgbGVuID0gc3RyLkdldExlbmd0aCgpLCBvZmZzZXQgPSAwOwotICAgIHdoaWxlIChvZmZzZXQgPCBsZW4pIHsKLSAgICAgICAgRlhfRFdPUkQgY2ggPSBwRm9udC0+R2V0TmV4dENoYXIocFN0ciwgbGVuLCBvZmZzZXQpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB1bmljb2RlX3N0ciA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGNoKTsKLSAgICAgICAgaWYgKHVuaWNvZGVfc3RyLklzRW1wdHkoKSkgewotICAgICAgICAgICAgdGV4dCArPSAoRlhfV0NIQVIpY2g7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0ZXh0ICs9IHVuaWNvZGVfc3RyOwotICAgICAgICB9Ci0gICAgfQotICAgIHBCYXNlTGluZS0+SW5zZXJ0VGV4dEJveChsZWZ0eCwgcmlnaHR4LCB0b3B5LCBib3R0b215LCBzcGFjZXcsIGZvbnRzaXplX3YsIHRleHQpOwotICAgIHJldHVybiBwQmFzZUxpbmU7Ci19Ci12b2lkIENUZXh0UGFnZTo6V3JpdGVPdXRwdXQoQ0ZYX1dpZGVTdHJpbmdBcnJheSYgbGluZXMsIGludCBpTWluV2lkdGgpCi17Ci0gICAgRlhfRkxPQVQgbGFzdGhlaWdodCA9IC0xOwotICAgIEZYX0ZMT0FUIGxhc3RiYXNlbGluZSA9IC0xOwotICAgIEZYX0ZMT0FUIE1pbkxlZnRYID0gMTAwMDAwMDsKLSAgICBGWF9GTE9BVCBNYXhSaWdodFggPSAwOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkpOwotICAgICAgICBGWF9GTE9BVCBsZWZ0eCwgcmlnaHR4OwotICAgICAgICBpZiAocEJhc2VMaW5lLT5HZXRXaWR0aChsZWZ0eCwgcmlnaHR4KSkgewotICAgICAgICAgICAgaWYgKGxlZnR4IDwgTWluTGVmdFgpIHsKLSAgICAgICAgICAgICAgICBNaW5MZWZ0WCA9IGxlZnR4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJpZ2h0eCA+IE1heFJpZ2h0WCkgewotICAgICAgICAgICAgICAgIE1heFJpZ2h0WCA9IHJpZ2h0eDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKLSAgICAgICAgcEJhc2VMaW5lLT5NZXJnZUJveGVzKCk7Ci0gICAgfQotICAgIGZvciAoaSA9IDE7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkpOwotICAgICAgICBDVGV4dEJhc2VMaW5lKiBwUHJldkxpbmUgPSAoQ1RleHRCYXNlTGluZSopbV9CYXNlTGluZXMuR2V0QXQoaSAtIDEpOwotICAgICAgICBpZiAocEJhc2VMaW5lLT5DYW5NZXJnZShwUHJldkxpbmUpKSB7Ci0gICAgICAgICAgICBwUHJldkxpbmUtPk1lcmdlKHBCYXNlTGluZSk7Ci0gICAgICAgICAgICBkZWxldGUgcEJhc2VMaW5lOwotICAgICAgICAgICAgbV9CYXNlTGluZXMuUmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBpIC0tOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX2JBdXRvV2lkdGgpIHsKLSAgICAgICAgaW50KiB3aWR0aHMgPSBGWF9BbGxvYyhpbnQsIG1fQmFzZUxpbmVzLkdldFNpemUoKSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgICAgIHdpZHRoc1tpXSA9IDA7Ci0gICAgICAgICAgICBDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUgPSAoQ1RleHRCYXNlTGluZSopbV9CYXNlTGluZXMuR2V0QXQoaSk7Ci0gICAgICAgICAgICBpbnQgVG90YWxDaGFycyA9IDA7Ci0gICAgICAgICAgICBGWF9GTE9BVCBUb3RhbFdpZHRoID0gMDsKLSAgICAgICAgICAgIGludCBtaW5jaGFyczsKLSAgICAgICAgICAgIHBCYXNlTGluZS0+Q291bnRDaGFycyhUb3RhbENoYXJzLCBUb3RhbFdpZHRoLCBtaW5jaGFycyk7Ci0gICAgICAgICAgICBpZiAoVG90YWxDaGFycykgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGNoYXJ3aWR0aCA9IFRvdGFsV2lkdGggLyBUb3RhbENoYXJzOwotICAgICAgICAgICAgICAgIHdpZHRoc1tpXSA9IChpbnQpKChNYXhSaWdodFggLSBNaW5MZWZ0WCkgLyBjaGFyd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHdpZHRoc1tpXSA+IDEwMDApIHsKLSAgICAgICAgICAgICAgICB3aWR0aHNbaV0gPSAxMDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHdpZHRoc1tpXSA8IG1pbmNoYXJzKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhzW2ldID0gbWluY2hhcnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50IEF2Z1dpZHRoID0gMCwgd2lkdGhjb3VudCA9IDA7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkgKyspCi0gICAgICAgICAgICBpZiAod2lkdGhzW2ldKSB7Ci0gICAgICAgICAgICAgICAgQXZnV2lkdGggKz0gd2lkdGhzW2ldOwotICAgICAgICAgICAgICAgIHdpZHRoY291bnQgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIEF2Z1dpZHRoID0gaW50KChGWF9GTE9BVClBdmdXaWR0aCAvIHdpZHRoY291bnQgKyAwLjUpOwotICAgICAgICBpbnQgTWF4V2lkdGggPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpICsrKQotICAgICAgICAgICAgaWYgKE1heFdpZHRoIDwgd2lkdGhzW2ldKSB7Ci0gICAgICAgICAgICAgICAgTWF4V2lkdGggPSB3aWR0aHNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGlmIChNYXhXaWR0aCA+IEF2Z1dpZHRoICogNiAvIDUpIHsKLSAgICAgICAgICAgIE1heFdpZHRoID0gQXZnV2lkdGggKiA2IC8gNTsKLSAgICAgICAgfQotICAgICAgICBGWF9GcmVlKHdpZHRocyk7Ci0gICAgICAgIGlmIChpTWluV2lkdGggPCBNYXhXaWR0aCkgewotICAgICAgICAgICAgaU1pbldpZHRoID0gTWF4V2lkdGg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUgPSAoQ1RleHRCYXNlTGluZSopbV9CYXNlTGluZXMuR2V0QXQoaSk7Ci0gICAgICAgIHBCYXNlTGluZS0+TWVyZ2VCb3hlcygpOwotICAgIH0KLSAgICBpZiAobV9iS2VlcENvbHVtbikgewotICAgICAgICBGaW5kQ29sdW1ucygpOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKLSAgICAgICAgaWYgKGxhc3RoZWlnaHQgPj0gMCkgewotICAgICAgICAgICAgRlhfRkxPQVQgZHkgPSBsYXN0YmFzZWxpbmUgLSBwQmFzZUxpbmUtPm1fQmFzZUxpbmU7Ci0gICAgICAgICAgICBpZiAoZHkgPj0gKHBCYXNlTGluZS0+bV9NYXhGb250U2l6ZVYpICogMS41IHx8IGR5ID49IGxhc3RoZWlnaHQgKiAxLjUpIHsKLSAgICAgICAgICAgICAgICBsaW5lcy5BZGQoTCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsYXN0aGVpZ2h0ID0gcEJhc2VMaW5lLT5tX01heEZvbnRTaXplVjsKLSAgICAgICAgbGFzdGJhc2VsaW5lID0gcEJhc2VMaW5lLT5tX0Jhc2VMaW5lOwotICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHI7Ci0gICAgICAgIHBCYXNlTGluZS0+V3JpdGVPdXRwdXQoc3RyLCBNaW5MZWZ0WCwgTWF4UmlnaHRYIC0gTWluTGVmdFgsIGlNaW5XaWR0aCk7Ci0gICAgICAgIGxpbmVzLkFkZChzdHIpOwotICAgIH0KLX0KLXZvaWQgTm9ybWFsaXplQ29tcG9zaXRlQ2hhcihGWF9XQ0hBUiB3Q2hhciwgQ0ZYX1dpZGVTdHJpbmcmIHNEZXN0KQotewotICAgIHdDaGFyID0gRlhfR2V0TWlycm9yQ2hhcih3Q2hhciwgVFJVRSwgRkFMU0UpOwotICAgIEZYX1dDSEFSKiBwRHN0ID0gTlVMTDsKLSAgICBGWF9TVFJTSVpFIG5Db3VudCA9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Q2hhciwgcERzdCk7Ci0gICAgaWYgKG5Db3VudCA8IDEgKSB7Ci0gICAgICAgIHNEZXN0ICs9IHdDaGFyOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBEc3QgPSBuZXcgRlhfV0NIQVJbbkNvdW50XTsKLSAgICBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOwotICAgIGZvciAoaW50IG5JbmRleCA9IDA7IG5JbmRleCA8IG5Db3VudDsgbkluZGV4KyspIHsKLSAgICAgICAgc0Rlc3QgKz0gcERzdFtuSW5kZXhdOwotICAgIH0KLSAgICBkZWxldGVbXSBwRHN0OwotfQotdm9pZCBOb3JtYWxpemVTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLXsKLSAgICBpZiAoc3RyLkdldExlbmd0aCgpIDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBzQnVmZmVyOwotICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJRlhfQmlkaUNoYXI+IHBCaWRpQ2hhcihJRlhfQmlkaUNoYXI6OkNyZWF0ZSgpKTsKLSAgICBDRlhfV29yZEFycmF5IG9yZGVyOwotICAgIEZYX0JPT0wgYlIyTCA9IEZBTFNFOwotICAgIGludDMyX3Qgc3RhcnQgPSAwLCBjb3VudCA9IDAsIGkgPSAwOwotICAgIGludCBuUjJMID0gMCwgbkwyUiA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IHN0ci5HZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIGlmKHBCaWRpQ2hhci0+QXBwZW5kQ2hhcihzdHIuR2V0QXQoaSkpKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHJldCA9IHBCaWRpQ2hhci0+R2V0QmlkaUluZm8oc3RhcnQsIGNvdW50KTsKLSAgICAgICAgICAgIG9yZGVyLkFkZChzdGFydCk7Ci0gICAgICAgICAgICBvcmRlci5BZGQoY291bnQpOwotICAgICAgICAgICAgb3JkZXIuQWRkKHJldCk7Ci0gICAgICAgICAgICBpZighYlIyTCkgewotICAgICAgICAgICAgICAgIGlmKHJldCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5SMkwrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5MMlIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYocEJpZGlDaGFyLT5FbmRDaGFyKCkpIHsKLSAgICAgICAgaW50MzJfdCByZXQgPSBwQmlkaUNoYXItPkdldEJpZGlJbmZvKHN0YXJ0LCBjb3VudCk7Ci0gICAgICAgIG9yZGVyLkFkZChzdGFydCk7Ci0gICAgICAgIG9yZGVyLkFkZChjb3VudCk7Ci0gICAgICAgIG9yZGVyLkFkZChyZXQpOwotICAgICAgICBpZighYlIyTCkgewotICAgICAgICAgICAgaWYocmV0ID09IDIpIHsKLSAgICAgICAgICAgICAgICBuUjJMKys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYocmV0ID09IDEpIHsKLSAgICAgICAgICAgICAgICBuTDJSKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoblIyTCA+IDAgJiYgblIyTCA+PSBuTDJSKSB7Ci0gICAgICAgIGJSMkwgPSBUUlVFOwotICAgIH0KLSAgICBpZihiUjJMKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG9yZGVyLkdldFNpemUoKTsKLSAgICAgICAgZm9yKGludCBqID0gY291bnQgLSAxOyBqID4gMDsgaiAtPSAzKSB7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gb3JkZXIuR2V0QXQoaik7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSBvcmRlci5HZXRBdChqIC0gMik7Ci0gICAgICAgICAgICBpbnQgY291bnQxID0gb3JkZXIuR2V0QXQoaiAtIDEpOwotICAgICAgICAgICAgaWYocmV0ID09IDIgfHwgcmV0ID09IDApIHsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSBzdGFydCArIGNvdW50MSAtIDE7IGkgPj0gc3RhcnQ7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVDb21wb3NpdGVDaGFyKHN0cltpXSwgc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpID0gajsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW1ib2wgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB3aGlsZShpID4gMCAmJiBvcmRlci5HZXRBdChpKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJTeW1ib2wgPSAhb3JkZXIuR2V0QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGkgLT0gMzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGVuZCA9IHN0YXJ0ICsgY291bnQxIDsKLSAgICAgICAgICAgICAgICBpbnQgbiA9IDA7Ci0gICAgICAgICAgICAgICAgaWYoYlN5bWJvbCkgewotICAgICAgICAgICAgICAgICAgICBuID0gaSArIDY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbiA9IGkgKyAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihuID49IGopIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGludCBtID0gc3RhcnQ7IG0gPCBlbmQ7IG0rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc0J1ZmZlciArPSBzdHJbbV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpID0gajsKLSAgICAgICAgICAgICAgICAgICAgaiA9IG47Ci0gICAgICAgICAgICAgICAgICAgIGZvcig7IG4gPD0gaTsgbiArPSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBvcmRlci5HZXRBdChuIC0gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQxID0gb3JkZXIuR2V0QXQobiAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZCA9IHN0YXJ0ICsgY291bnQxIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgbSA9IHN0YXJ0OyBtIDwgZW5kOyBtKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQnVmZmVyICs9IHN0clttXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICB9CisgIENGWF9XaWRlU3RyaW5nIHRleHQ7CisgIGNvbnN0IEZYX0NIQVIqIHBTdHIgPSBzdHI7CisgIGludCBsZW4gPSBzdHIuR2V0TGVuZ3RoKCksIG9mZnNldCA9IDA7CisgIHdoaWxlIChvZmZzZXQgPCBsZW4pIHsKKyAgICBGWF9EV09SRCBjaCA9IHBGb250LT5HZXROZXh0Q2hhcihwU3RyLCBsZW4sIG9mZnNldCk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZV9zdHIgPSBwRm9udC0+VW5pY29kZUZyb21DaGFyQ29kZShjaCk7CisgICAgaWYgKHVuaWNvZGVfc3RyLklzRW1wdHkoKSkgeworICAgICAgdGV4dCArPSAoRlhfV0NIQVIpY2g7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGNvdW50ID0gb3JkZXIuR2V0U2l6ZSgpOwotICAgICAgICBGWF9CT09MIGJMMlIgPSBGQUxTRTsKLSAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IGNvdW50OyBqICs9IDMpIHsKLSAgICAgICAgICAgIGludCByZXQgPSBvcmRlci5HZXRBdChqICsgMik7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSBvcmRlci5HZXRBdChqKTsKLSAgICAgICAgICAgIGludCBjb3VudDEgPSBvcmRlci5HZXRBdChqICsgMSk7Ci0gICAgICAgICAgICBpZihyZXQgPT0gMiB8fCAoaiA9PSAwICYmIHJldCA9PSAwICYmICFiTDJSKSkgewotICAgICAgICAgICAgICAgIGludCBpID0gaiArIDM7Ci0gICAgICAgICAgICAgICAgd2hpbGUoYlIyTCAmJiBpIDwgY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYob3JkZXIuR2V0QXQoaSArIDIpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGkgPT0gMykgewotICAgICAgICAgICAgICAgICAgICBqID0gLTM7Ci0gICAgICAgICAgICAgICAgICAgIGJMMlIgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGVuZCA9IHN0ci5HZXRMZW5ndGgoKSAtIDE7Ci0gICAgICAgICAgICAgICAgaWYoaSA8IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZCA9IG9yZGVyLkdldEF0KGkpIC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaiA9IGkgLSAzOwotICAgICAgICAgICAgICAgIGZvcihpbnQgbiA9IGVuZDsgbiA+PSBzdGFydDsgbi0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZUNvbXBvc2l0ZUNoYXIoc3RyW2ldLCBzQnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50MSA7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzQnVmZmVyICs9IHN0cltpXTsKLSAgICAgICAgICAgICAgICB9CisgICAgICB0ZXh0ICs9IHVuaWNvZGVfc3RyOworICAgIH0KKyAgfQorICBwQmFzZUxpbmUtPkluc2VydFRleHRCb3gobGVmdHgsIHJpZ2h0eCwgdG9weSwgYm90dG9teSwgc3BhY2V3LCBmb250c2l6ZV92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgIHJldHVybiBwQmFzZUxpbmU7Cit9Cit2b2lkIENUZXh0UGFnZTo6V3JpdGVPdXRwdXQoQ0ZYX1dpZGVTdHJpbmdBcnJheSYgbGluZXMsIGludCBpTWluV2lkdGgpIHsKKyAgRlhfRkxPQVQgbGFzdGhlaWdodCA9IC0xOworICBGWF9GTE9BVCBsYXN0YmFzZWxpbmUgPSAtMTsKKyAgRlhfRkxPQVQgTWluTGVmdFggPSAxMDAwMDAwOworICBGWF9GTE9BVCBNYXhSaWdodFggPSAwOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkpOworICAgIEZYX0ZMT0FUIGxlZnR4LCByaWdodHg7CisgICAgaWYgKHBCYXNlTGluZS0+R2V0V2lkdGgobGVmdHgsIHJpZ2h0eCkpIHsKKyAgICAgIGlmIChsZWZ0eCA8IE1pbkxlZnRYKSB7CisgICAgICAgIE1pbkxlZnRYID0gbGVmdHg7CisgICAgICB9CisgICAgICBpZiAocmlnaHR4ID4gTWF4UmlnaHRYKSB7CisgICAgICAgIE1heFJpZ2h0WCA9IHJpZ2h0eDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkpOworICAgIHBCYXNlTGluZS0+TWVyZ2VCb3hlcygpOworICB9CisgIGZvciAoaSA9IDE7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkrKykgeworICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKKyAgICBDVGV4dEJhc2VMaW5lKiBwUHJldkxpbmUgPSAoQ1RleHRCYXNlTGluZSopbV9CYXNlTGluZXMuR2V0QXQoaSAtIDEpOworICAgIGlmIChwQmFzZUxpbmUtPkNhbk1lcmdlKHBQcmV2TGluZSkpIHsKKyAgICAgIHBQcmV2TGluZS0+TWVyZ2UocEJhc2VMaW5lKTsKKyAgICAgIGRlbGV0ZSBwQmFzZUxpbmU7CisgICAgICBtX0Jhc2VMaW5lcy5SZW1vdmVBdChpKTsKKyAgICAgIGktLTsKKyAgICB9CisgIH0KKyAgaWYgKG1fYkF1dG9XaWR0aCkgeworICAgIGludCogd2lkdGhzID0gRlhfQWxsb2MoaW50LCBtX0Jhc2VMaW5lcy5HZXRTaXplKCkpOworICAgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkrKykgeworICAgICAgd2lkdGhzW2ldID0gMDsKKyAgICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKKyAgICAgIGludCBUb3RhbENoYXJzID0gMDsKKyAgICAgIEZYX0ZMT0FUIFRvdGFsV2lkdGggPSAwOworICAgICAgaW50IG1pbmNoYXJzOworICAgICAgcEJhc2VMaW5lLT5Db3VudENoYXJzKFRvdGFsQ2hhcnMsIFRvdGFsV2lkdGgsIG1pbmNoYXJzKTsKKyAgICAgIGlmIChUb3RhbENoYXJzKSB7CisgICAgICAgIEZYX0ZMT0FUIGNoYXJ3aWR0aCA9IFRvdGFsV2lkdGggLyBUb3RhbENoYXJzOworICAgICAgICB3aWR0aHNbaV0gPSAoaW50KSgoTWF4UmlnaHRYIC0gTWluTGVmdFgpIC8gY2hhcndpZHRoKTsKKyAgICAgIH0KKyAgICAgIGlmICh3aWR0aHNbaV0gPiAxMDAwKSB7CisgICAgICAgIHdpZHRoc1tpXSA9IDEwMDA7CisgICAgICB9CisgICAgICBpZiAod2lkdGhzW2ldIDwgbWluY2hhcnMpIHsKKyAgICAgICAgd2lkdGhzW2ldID0gbWluY2hhcnM7CisgICAgICB9CisgICAgfQorICAgIGludCBBdmdXaWR0aCA9IDAsIHdpZHRoY291bnQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkrKykKKyAgICAgIGlmICh3aWR0aHNbaV0pIHsKKyAgICAgICAgQXZnV2lkdGggKz0gd2lkdGhzW2ldOworICAgICAgICB3aWR0aGNvdW50Kys7CisgICAgICB9CisgICAgQXZnV2lkdGggPSBpbnQoKEZYX0ZMT0FUKUF2Z1dpZHRoIC8gd2lkdGhjb3VudCArIDAuNSk7CisgICAgaW50IE1heFdpZHRoID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpKyspCisgICAgICBpZiAoTWF4V2lkdGggPCB3aWR0aHNbaV0pIHsKKyAgICAgICAgTWF4V2lkdGggPSB3aWR0aHNbaV07CisgICAgICB9CisgICAgaWYgKE1heFdpZHRoID4gQXZnV2lkdGggKiA2IC8gNSkgeworICAgICAgTWF4V2lkdGggPSBBdmdXaWR0aCAqIDYgLyA1OworICAgIH0KKyAgICBGWF9GcmVlKHdpZHRocyk7CisgICAgaWYgKGlNaW5XaWR0aCA8IE1heFdpZHRoKSB7CisgICAgICBpTWluV2lkdGggPSBNYXhXaWR0aDsKKyAgICB9CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkpOworICAgIHBCYXNlTGluZS0+TWVyZ2VCb3hlcygpOworICB9CisgIGlmIChtX2JLZWVwQ29sdW1uKSB7CisgICAgRmluZENvbHVtbnMoKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUgPSAoQ1RleHRCYXNlTGluZSopbV9CYXNlTGluZXMuR2V0QXQoaSk7CisgICAgaWYgKGxhc3RoZWlnaHQgPj0gMCkgeworICAgICAgRlhfRkxPQVQgZHkgPSBsYXN0YmFzZWxpbmUgLSBwQmFzZUxpbmUtPm1fQmFzZUxpbmU7CisgICAgICBpZiAoZHkgPj0gKHBCYXNlTGluZS0+bV9NYXhGb250U2l6ZVYpICogMS41IHx8IGR5ID49IGxhc3RoZWlnaHQgKiAxLjUpIHsKKyAgICAgICAgbGluZXMuQWRkKEwiIik7CisgICAgICB9CisgICAgfQorICAgIGxhc3RoZWlnaHQgPSBwQmFzZUxpbmUtPm1fTWF4Rm9udFNpemVWOworICAgIGxhc3RiYXNlbGluZSA9IHBCYXNlTGluZS0+bV9CYXNlTGluZTsKKyAgICBDRlhfV2lkZVN0cmluZyBzdHI7CisgICAgcEJhc2VMaW5lLT5Xcml0ZU91dHB1dChzdHIsIE1pbkxlZnRYLCBNYXhSaWdodFggLSBNaW5MZWZ0WCwgaU1pbldpZHRoKTsKKyAgICBsaW5lcy5BZGQoc3RyKTsKKyAgfQorfQordm9pZCBOb3JtYWxpemVDb21wb3NpdGVDaGFyKEZYX1dDSEFSIHdDaGFyLCBDRlhfV2lkZVN0cmluZyYgc0Rlc3QpIHsKKyAgd0NoYXIgPSBGWF9HZXRNaXJyb3JDaGFyKHdDaGFyLCBUUlVFLCBGQUxTRSk7CisgIEZYX1dDSEFSKiBwRHN0ID0gTlVMTDsKKyAgRlhfU1RSU0laRSBuQ291bnQgPSBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOworICBpZiAobkNvdW50IDwgMSkgeworICAgIHNEZXN0ICs9IHdDaGFyOworICAgIHJldHVybjsKKyAgfQorICBwRHN0ID0gbmV3IEZYX1dDSEFSW25Db3VudF07CisgIEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Q2hhciwgcERzdCk7CisgIGZvciAoaW50IG5JbmRleCA9IDA7IG5JbmRleCA8IG5Db3VudDsgbkluZGV4KyspIHsKKyAgICBzRGVzdCArPSBwRHN0W25JbmRleF07CisgIH0KKyAgZGVsZXRlW10gcERzdDsKK30KK3ZvaWQgTm9ybWFsaXplU3RyaW5nKENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgaWYgKHN0ci5HZXRMZW5ndGgoKSA8PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9XaWRlU3RyaW5nIHNCdWZmZXI7CisgIG5vbnN0ZDo6dW5pcXVlX3B0cjxJRlhfQmlkaUNoYXI+IHBCaWRpQ2hhcihJRlhfQmlkaUNoYXI6OkNyZWF0ZSgpKTsKKyAgQ0ZYX1dvcmRBcnJheSBvcmRlcjsKKyAgRlhfQk9PTCBiUjJMID0gRkFMU0U7CisgIGludDMyX3Qgc3RhcnQgPSAwLCBjb3VudCA9IDAsIGkgPSAwOworICBpbnQgblIyTCA9IDAsIG5MMlIgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyBpKyspIHsKKyAgICBpZiAocEJpZGlDaGFyLT5BcHBlbmRDaGFyKHN0ci5HZXRBdChpKSkpIHsKKyAgICAgIGludDMyX3QgcmV0ID0gcEJpZGlDaGFyLT5HZXRCaWRpSW5mbyhzdGFydCwgY291bnQpOworICAgICAgb3JkZXIuQWRkKHN0YXJ0KTsKKyAgICAgIG9yZGVyLkFkZChjb3VudCk7CisgICAgICBvcmRlci5BZGQocmV0KTsKKyAgICAgIGlmICghYlIyTCkgeworICAgICAgICBpZiAocmV0ID09IDIpIHsKKyAgICAgICAgICBuUjJMKys7CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDEpIHsKKyAgICAgICAgICBuTDJSKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHBCaWRpQ2hhci0+RW5kQ2hhcigpKSB7CisgICAgaW50MzJfdCByZXQgPSBwQmlkaUNoYXItPkdldEJpZGlJbmZvKHN0YXJ0LCBjb3VudCk7CisgICAgb3JkZXIuQWRkKHN0YXJ0KTsKKyAgICBvcmRlci5BZGQoY291bnQpOworICAgIG9yZGVyLkFkZChyZXQpOworICAgIGlmICghYlIyTCkgeworICAgICAgaWYgKHJldCA9PSAyKSB7CisgICAgICAgIG5SMkwrKzsKKyAgICAgIH0gZWxzZSBpZiAocmV0ID09IDEpIHsKKyAgICAgICAgbkwyUisrOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoblIyTCA+IDAgJiYgblIyTCA+PSBuTDJSKSB7CisgICAgYlIyTCA9IFRSVUU7CisgIH0KKyAgaWYgKGJSMkwpIHsKKyAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7CisgICAgZm9yIChpbnQgaiA9IGNvdW50IC0gMTsgaiA+IDA7IGogLT0gMykgeworICAgICAgaW50IHJldCA9IG9yZGVyLkdldEF0KGopOworICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQoaiAtIDIpOworICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KGogLSAxKTsKKyAgICAgIGlmIChyZXQgPT0gMiB8fCByZXQgPT0gMCkgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyBjb3VudDEgLSAxOyBpID49IHN0YXJ0OyBpLS0pIHsKKyAgICAgICAgICBOb3JtYWxpemVDb21wb3NpdGVDaGFyKHN0cltpXSwgc0J1ZmZlcik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGkgPSBqOworICAgICAgICBGWF9CT09MIGJTeW1ib2wgPSBGQUxTRTsKKyAgICAgICAgd2hpbGUgKGkgPiAwICYmIG9yZGVyLkdldEF0KGkpICE9IDIpIHsKKyAgICAgICAgICBiU3ltYm9sID0gIW9yZGVyLkdldEF0KGkpOworICAgICAgICAgIGkgLT0gMzsKKyAgICAgICAgfQorICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyBjb3VudDE7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgaWYgKGJTeW1ib2wpIHsKKyAgICAgICAgICBuID0gaSArIDY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbiA9IGkgKyAzOworICAgICAgICB9CisgICAgICAgIGlmIChuID49IGopIHsKKyAgICAgICAgICBmb3IgKGludCBtID0gc3RhcnQ7IG0gPCBlbmQ7IG0rKykgeworICAgICAgICAgICAgc0J1ZmZlciArPSBzdHJbbV07CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGkgPSBqOworICAgICAgICAgIGogPSBuOworICAgICAgICAgIGZvciAoOyBuIDw9IGk7IG4gKz0gMykgeworICAgICAgICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQobiAtIDIpOworICAgICAgICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KG4gLSAxKTsKKyAgICAgICAgICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50MTsKKyAgICAgICAgICAgIGZvciAoaW50IG0gPSBzdGFydDsgbSA8IGVuZDsgbSsrKSB7CisgICAgICAgICAgICAgIHNCdWZmZXIgKz0gc3RyW21dOwogICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBzdHIuRW1wdHkoKTsKLSAgICBzdHIgKz0gc0J1ZmZlcjsKLX0KLXN0YXRpYyBGWF9CT09MIElzTnVtYmVyKENGWF9XaWRlU3RyaW5nJiBzdHIpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIuR2V0TGVuZ3RoKCk7IGkgKyspIHsKLSAgICAgICAgRlhfV0NIQVIgY2ggPSBzdHJbaV07Ci0gICAgICAgIGlmICgoY2ggPCAnMCcgfHwgY2ggPiAnOScpICYmIGNoICE9ICctJyAmJiBjaCAhPSAnKycgJiYgY2ggIT0gJy4nICYmIGNoICE9ICcgJykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDVGV4dFBhZ2U6OkZpbmRDb2x1bW5zKCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwQmFzZUxpbmUtPm1fVGV4dExpc3QuR2V0U2l6ZSgpOyBqICsrKSB7Ci0gICAgICAgICAgICBDVGV4dEJveCogcFRleHRCb3ggPSAoQ1RleHRCb3gqKXBCYXNlTGluZS0+bV9UZXh0TGlzdC5HZXRBdChqKTsKLSAgICAgICAgICAgIENUZXh0Q29sdW1uKiBwQ29sdW1uID0gRmluZENvbHVtbihwVGV4dEJveC0+bV9SaWdodCk7Ci0gICAgICAgICAgICBpZiAocENvbHVtbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcENvbHVtbiA9IEZYX05FVyBDVGV4dENvbHVtbjsKLSAgICAgICAgICAgICAgICBpZiAocENvbHVtbikgewotICAgICAgICAgICAgICAgICAgICBwQ29sdW1uLT5tX0NvdW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgcENvbHVtbi0+bV9BdmdQb3MgPSBwVGV4dEJveC0+bV9SaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcENvbHVtbi0+bV9UZXh0UG9zID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIG1fVGV4dENvbHVtbnMuQWRkKHBDb2x1bW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcENvbHVtbi0+bV9BdmdQb3MgPSAocENvbHVtbi0+bV9Db3VudCAqIHBDb2x1bW4tPm1fQXZnUG9zICsgcFRleHRCb3gtPm1fUmlnaHQpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ29sdW1uLT5tX0NvdW50ICsgMSk7Ci0gICAgICAgICAgICAgICAgcENvbHVtbi0+bV9Db3VudCArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgbWluY291bnQgPSBtX0Jhc2VMaW5lcy5HZXRTaXplKCkgLyA0OwotICAgIGZvciAoaSA9IDA7IGkgPCBtX1RleHRDb2x1bW5zLkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDVGV4dENvbHVtbiogcFRleHRDb2x1bW4gPSAoQ1RleHRDb2x1bW4qKW1fVGV4dENvbHVtbnMuR2V0QXQoaSk7Ci0gICAgICAgIGlmIChwVGV4dENvbHVtbi0+bV9Db3VudCA+PSBtaW5jb3VudCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIHBUZXh0Q29sdW1uOwotICAgICAgICBtX1RleHRDb2x1bW5zLlJlbW92ZUF0KGkpOwotICAgICAgICBpIC0tOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwQmFzZUxpbmUtPm1fVGV4dExpc3QuR2V0U2l6ZSgpOyBqICsrKSB7Ci0gICAgICAgICAgICBDVGV4dEJveCogcFRleHRCb3ggPSAoQ1RleHRCb3gqKXBCYXNlTGluZS0+bV9UZXh0TGlzdC5HZXRBdChqKTsKLSAgICAgICAgICAgIGlmIChJc051bWJlcihwVGV4dEJveC0+bV9UZXh0KSkgewotICAgICAgICAgICAgICAgIHBUZXh0Qm94LT5tX3BDb2x1bW4gPSBGaW5kQ29sdW1uKHBUZXh0Qm94LT5tX1JpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLUNUZXh0Q29sdW1uKiBDVGV4dFBhZ2U6OkZpbmRDb2x1bW4oRlhfRkxPQVQgeHBvcykKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fVGV4dENvbHVtbnMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0Q29sdW1uKiBwQ29sdW1uID0gKENUZXh0Q29sdW1uKiltX1RleHRDb2x1bW5zLkdldEF0KGkpOwotICAgICAgICBpZiAocENvbHVtbi0+bV9BdmdQb3MgPCB4cG9zICsgMSAmJiBwQ29sdW1uLT5tX0F2Z1BvcyA+IHhwb3MgLSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gcENvbHVtbjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLXZvaWQgQ1RleHRQYWdlOjpCcmVha1NwYWNlKENQREZfVGV4dE9iamVjdCogcFRleHRPYmopCi17Ci19Ci1DVGV4dEJhc2VMaW5lOjpDVGV4dEJhc2VMaW5lKCkKLXsKLSAgICBtX1RvcCA9IC0xMDAwMDA7Ci0gICAgbV9Cb3R0b20gPSAxMDAwMDA7Ci0gICAgbV9NYXhGb250U2l6ZVYgPSAwOwotfQotQ1RleHRCYXNlTGluZTo6fkNUZXh0QmFzZUxpbmUoKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9UZXh0TGlzdC5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRCb3gqIHBUZXh0ID0gKENUZXh0Qm94KiltX1RleHRMaXN0LkdldEF0KGkpOwotICAgICAgICBkZWxldGUgcFRleHQ7Ci0gICAgfQotfQotdm9pZCBDVGV4dEJhc2VMaW5lOjpJbnNlcnRUZXh0Qm94KEZYX0ZMT0FUIGxlZnR4LCBGWF9GTE9BVCByaWdodHgsIEZYX0ZMT0FUIHRvcHksIEZYX0ZMT0FUIGJvdHRvbXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3BhY2V3LCBGWF9GTE9BVCBmb250c2l6ZV92LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgdGV4dCkKLXsKLSAgICBpZiAobV9Ub3AgPCB0b3B5KSB7Ci0gICAgICAgIG1fVG9wID0gdG9weTsKLSAgICB9Ci0gICAgaWYgKG1fQm90dG9tID4gYm90dG9teSkgewotICAgICAgICBtX0JvdHRvbSA9IGJvdHRvbXk7Ci0gICAgfQotICAgIGlmIChtX01heEZvbnRTaXplViA8IGZvbnRzaXplX3YpIHsKLSAgICAgICAgbV9NYXhGb250U2l6ZVYgPSBmb250c2l6ZV92OwotICAgIH0KLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9UZXh0TGlzdC5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRCb3gqIHBUZXh0ID0gKENUZXh0Qm94KiltX1RleHRMaXN0LkdldEF0KGkpOwotICAgICAgICBpZiAocFRleHQtPm1fTGVmdCA+IGxlZnR4KSB7CisgIH0gZWxzZSB7CisgICAgaW50IGNvdW50ID0gb3JkZXIuR2V0U2l6ZSgpOworICAgIEZYX0JPT0wgYkwyUiA9IEZBTFNFOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGogKz0gMykgeworICAgICAgaW50IHJldCA9IG9yZGVyLkdldEF0KGogKyAyKTsKKyAgICAgIGludCBzdGFydCA9IG9yZGVyLkdldEF0KGopOworICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KGogKyAxKTsKKyAgICAgIGlmIChyZXQgPT0gMiB8fCAoaiA9PSAwICYmIHJldCA9PSAwICYmICFiTDJSKSkgeworICAgICAgICBpbnQgaSA9IGogKyAzOworICAgICAgICB3aGlsZSAoYlIyTCAmJiBpIDwgY291bnQpIHsKKyAgICAgICAgICBpZiAob3JkZXIuR2V0QXQoaSArIDIpID09IDEpIHsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIENUZXh0Qm94KiBwVGV4dCA9IEZYX05FVyBDVGV4dEJveDsKLSAgICBpZiAoTlVMTCA9PSBwVGV4dCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBUZXh0LT5tX1RleHQgPSB0ZXh0OwotICAgIHBUZXh0LT5tX0xlZnQgPSBsZWZ0eDsKLSAgICBwVGV4dC0+bV9SaWdodCA9IHJpZ2h0eDsKLSAgICBwVGV4dC0+bV9Ub3AgPSB0b3B5OwotICAgIHBUZXh0LT5tX0JvdHRvbSA9IGJvdHRvbXk7Ci0gICAgcFRleHQtPm1fU3BhY2VXaWR0aCA9IHNwYWNldzsKLSAgICBwVGV4dC0+bV9Gb250U2l6ZVYgPSBmb250c2l6ZV92OwotICAgIHBUZXh0LT5tX3BDb2x1bW4gPSBOVUxMOwotICAgIG1fVGV4dExpc3QuSW5zZXJ0QXQoaSwgcFRleHQpOwotfQotRlhfQk9PTCBHZXRJbnRlcnNlY3Rpb24oRlhfRkxPQVQgbG93MSwgRlhfRkxPQVQgaGlnaDEsIEZYX0ZMT0FUIGxvdzIsIEZYX0ZMT0FUIGhpZ2gyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGludGVybG93LCBGWF9GTE9BVCYgaW50ZXJoaWdoKTsKLUZYX0JPT0wgQ1RleHRCYXNlTGluZTo6Q2FuTWVyZ2UoQ1RleHRCYXNlTGluZSogcE90aGVyKQotewotICAgIEZYX0ZMT0FUIGludGVyX3RvcCwgaW50ZXJfYm90dG9tOwotICAgIGlmICghR2V0SW50ZXJzZWN0aW9uKG1fQm90dG9tLCBtX1RvcCwgcE90aGVyLT5tX0JvdHRvbSwgcE90aGVyLT5tX1RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcl9ib3R0b20sIGludGVyX3RvcCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9GTE9BVCBpbnRlcl9oID0gaW50ZXJfdG9wIC0gaW50ZXJfYm90dG9tOwotICAgIGlmIChpbnRlcl9oIDwgKG1fVG9wIC0gbV9Cb3R0b20pIC8gMiAmJiBpbnRlcl9oIDwgKHBPdGhlci0+bV9Ub3AgLSBwT3RoZXItPm1fQm90dG9tKSAvIDIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9GTE9BVCBkeSA9IChGWF9GTE9BVClGWFNZU19mYWJzKG1fQmFzZUxpbmUgLSBwT3RoZXItPm1fQmFzZUxpbmUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9UZXh0TGlzdC5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRCb3gqIHBUZXh0ID0gKENUZXh0Qm94KiltX1RleHRMaXN0LkdldEF0KGkpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBPdGhlci0+bV9UZXh0TGlzdC5HZXRTaXplKCk7IGogKyspIHsKLSAgICAgICAgICAgIENUZXh0Qm94KiBwT3RoZXJUZXh0ID0gKENUZXh0Qm94KilwT3RoZXItPm1fVGV4dExpc3QuR2V0QXQoaik7Ci0gICAgICAgICAgICBGWF9GTE9BVCBpbnRlcl9sZWZ0LCBpbnRlcl9yaWdodDsKLSAgICAgICAgICAgIGlmICghR2V0SW50ZXJzZWN0aW9uKHBUZXh0LT5tX0xlZnQsIHBUZXh0LT5tX1JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE90aGVyVGV4dC0+bV9MZWZ0LCBwT3RoZXJUZXh0LT5tX1JpZ2h0LCBpbnRlcl9sZWZ0LCBpbnRlcl9yaWdodCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGludGVyX3cgPSBpbnRlcl9yaWdodCAtIGludGVyX2xlZnQ7Ci0gICAgICAgICAgICBpZiAoaW50ZXJfdyA8IHBUZXh0LT5tX1NwYWNlV2lkdGggLyAyICYmIGludGVyX3cgPCBwT3RoZXJUZXh0LT5tX1NwYWNlV2lkdGggLyAyKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHkgPj0gKHBUZXh0LT5tX0JvdHRvbSAtIHBUZXh0LT5tX1RvcCkgLyAyIHx8Ci0gICAgICAgICAgICAgICAgICAgIGR5ID49IChwT3RoZXJUZXh0LT5tX0JvdHRvbSAtIHBPdGhlclRleHQtPm1fVG9wKSAvIDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChpID09IDMpIHsKKyAgICAgICAgICBqID0gLTM7CisgICAgICAgICAgYkwyUiA9IFRSVUU7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENUZXh0QmFzZUxpbmU6Ok1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcikKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBPdGhlci0+bV9UZXh0TGlzdC5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRCb3gqIHBUZXh0ID0gKENUZXh0Qm94KilwT3RoZXItPm1fVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgICAgIEluc2VydFRleHRCb3gocFRleHQtPm1fTGVmdCwgcFRleHQtPm1fUmlnaHQsIHBUZXh0LT5tX1RvcCwgcFRleHQtPm1fQm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgIHBUZXh0LT5tX1NwYWNlV2lkdGgsIHBUZXh0LT5tX0ZvbnRTaXplViwgcFRleHQtPm1fVGV4dCk7Ci0gICAgfQotfQotRlhfQk9PTCBDVGV4dEJhc2VMaW5lOjpHZXRXaWR0aChGWF9GTE9BVCYgbGVmdHgsIEZYX0ZMT0FUJiByaWdodHgpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fVGV4dExpc3QuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0Qm94KiBwVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKLSAgICAgICAgaWYgKHBUZXh0LT5tX1RleHQgIT0gTCIgIikgewotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGludCBlbmQgPSBzdHIuR2V0TGVuZ3RoKCkgLSAxOworICAgICAgICBpZiAoaSA8IGNvdW50KSB7CisgICAgICAgICAgZW5kID0gb3JkZXIuR2V0QXQoaSkgLSAxOwogICAgICAgICB9CisgICAgICAgIGogPSBpIC0gMzsKKyAgICAgICAgZm9yIChpbnQgbiA9IGVuZDsgbiA+PSBzdGFydDsgbi0tKSB7CisgICAgICAgICAgTm9ybWFsaXplQ29tcG9zaXRlQ2hhcihzdHJbaV0sIHNCdWZmZXIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyBjb3VudDE7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgc0J1ZmZlciArPSBzdHJbaV07CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKGkgPT0gbV9UZXh0TGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHN0ci5FbXB0eSgpOworICBzdHIgKz0gc0J1ZmZlcjsKK30KK3N0YXRpYyBGWF9CT09MIElzTnVtYmVyKENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIuR2V0TGVuZ3RoKCk7IGkrKykgeworICAgIEZYX1dDSEFSIGNoID0gc3RyW2ldOworICAgIGlmICgoY2ggPCAnMCcgfHwgY2ggPiAnOScpICYmIGNoICE9ICctJyAmJiBjaCAhPSAnKycgJiYgY2ggIT0gJy4nICYmCisgICAgICAgIGNoICE9ICcgJykgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK3ZvaWQgQ1RleHRQYWdlOjpGaW5kQ29sdW1ucygpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkrKykgeworICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHBCYXNlTGluZS0+bV9UZXh0TGlzdC5HZXRTaXplKCk7IGorKykgeworICAgICAgQ1RleHRCb3gqIHBUZXh0Qm94ID0gKENUZXh0Qm94KilwQmFzZUxpbmUtPm1fVGV4dExpc3QuR2V0QXQoaik7CisgICAgICBDVGV4dENvbHVtbiogcENvbHVtbiA9IEZpbmRDb2x1bW4ocFRleHRCb3gtPm1fUmlnaHQpOworICAgICAgaWYgKHBDb2x1bW4gPT0gTlVMTCkgeworICAgICAgICBwQ29sdW1uID0gRlhfTkVXIENUZXh0Q29sdW1uOworICAgICAgICBpZiAocENvbHVtbikgeworICAgICAgICAgIHBDb2x1bW4tPm1fQ291bnQgPSAxOworICAgICAgICAgIHBDb2x1bW4tPm1fQXZnUG9zID0gcFRleHRCb3gtPm1fUmlnaHQ7CisgICAgICAgICAgcENvbHVtbi0+bV9UZXh0UG9zID0gLTE7CisgICAgICAgICAgbV9UZXh0Q29sdW1ucy5BZGQocENvbHVtbik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBDb2x1bW4tPm1fQXZnUG9zID0KKyAgICAgICAgICAgIChwQ29sdW1uLT5tX0NvdW50ICogcENvbHVtbi0+bV9BdmdQb3MgKyBwVGV4dEJveC0+bV9SaWdodCkgLworICAgICAgICAgICAgKHBDb2x1bW4tPm1fQ291bnQgKyAxKTsKKyAgICAgICAgcENvbHVtbi0+bV9Db3VudCsrOworICAgICAgfQorICAgIH0KKyAgfQorICBpbnQgbWluY291bnQgPSBtX0Jhc2VMaW5lcy5HZXRTaXplKCkgLyA0OworICBmb3IgKGkgPSAwOyBpIDwgbV9UZXh0Q29sdW1ucy5HZXRTaXplKCk7IGkrKykgeworICAgIENUZXh0Q29sdW1uKiBwVGV4dENvbHVtbiA9IChDVGV4dENvbHVtbiopbV9UZXh0Q29sdW1ucy5HZXRBdChpKTsKKyAgICBpZiAocFRleHRDb2x1bW4tPm1fQ291bnQgPj0gbWluY291bnQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBkZWxldGUgcFRleHRDb2x1bW47CisgICAgbV9UZXh0Q29sdW1ucy5SZW1vdmVBdChpKTsKKyAgICBpLS07CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgcEJhc2VMaW5lLT5tX1RleHRMaXN0LkdldFNpemUoKTsgaisrKSB7CisgICAgICBDVGV4dEJveCogcFRleHRCb3ggPSAoQ1RleHRCb3gqKXBCYXNlTGluZS0+bV9UZXh0TGlzdC5HZXRBdChqKTsKKyAgICAgIGlmIChJc051bWJlcihwVGV4dEJveC0+bV9UZXh0KSkgeworICAgICAgICBwVGV4dEJveC0+bV9wQ29sdW1uID0gRmluZENvbHVtbihwVGV4dEJveC0+bV9SaWdodCk7CisgICAgICB9CisgICAgfQorICB9Cit9CitDVGV4dENvbHVtbiogQ1RleHRQYWdlOjpGaW5kQ29sdW1uKEZYX0ZMT0FUIHhwb3MpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRDb2x1bW5zLkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRDb2x1bW4qIHBDb2x1bW4gPSAoQ1RleHRDb2x1bW4qKW1fVGV4dENvbHVtbnMuR2V0QXQoaSk7CisgICAgaWYgKHBDb2x1bW4tPm1fQXZnUG9zIDwgeHBvcyArIDEgJiYgcENvbHVtbi0+bV9BdmdQb3MgPiB4cG9zIC0gMSkgeworICAgICAgcmV0dXJuIHBDb2x1bW47CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQordm9pZCBDVGV4dFBhZ2U6OkJyZWFrU3BhY2UoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaikge30KK0NUZXh0QmFzZUxpbmU6OkNUZXh0QmFzZUxpbmUoKSB7CisgIG1fVG9wID0gLTEwMDAwMDsKKyAgbV9Cb3R0b20gPSAxMDAwMDA7CisgIG1fTWF4Rm9udFNpemVWID0gMDsKK30KK0NUZXh0QmFzZUxpbmU6On5DVGV4dEJhc2VMaW5lKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1fVGV4dExpc3QuR2V0U2l6ZSgpOyBpKyspIHsKICAgICBDVGV4dEJveCogcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgbGVmdHggPSBwVGV4dC0+bV9MZWZ0OwotICAgIGZvciAoaSA9IG1fVGV4dExpc3QuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpIC0tKSB7Ci0gICAgICAgIENUZXh0Qm94KiBwVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKLSAgICAgICAgaWYgKHBUZXh0LT5tX1RleHQgIT0gTCIgIikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgcmlnaHR4ID0gcFRleHQtPm1fUmlnaHQ7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgZGVsZXRlIHBUZXh0OworICB9CiB9Ci12b2lkIENUZXh0QmFzZUxpbmU6Ok1lcmdlQm94ZXMoKQotewotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoaSA+PSBtX1RleHRMaXN0LkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIENUZXh0Qm94KiBwVGhpc1RleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgICAgIENUZXh0Qm94KiBwTmV4dFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSArIDEpOwotICAgICAgICBGWF9GTE9BVCBkeCA9IHBOZXh0VGV4dC0+bV9MZWZ0IC0gcFRoaXNUZXh0LT5tX1JpZ2h0OwotICAgICAgICBGWF9GTE9BVCBzcGFjZXcgPSAocFRoaXNUZXh0LT5tX1NwYWNlV2lkdGggPT0gMC4wKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0VGV4dC0+bV9TcGFjZVdpZHRoIDogcFRoaXNUZXh0LT5tX1NwYWNlV2lkdGg7Ci0gICAgICAgIGlmIChzcGFjZXcgPiAwLjAgJiYgZHggPCBzcGFjZXcgKiAyKSB7Ci0gICAgICAgICAgICBwVGhpc1RleHQtPm1fUmlnaHQgPSBwTmV4dFRleHQtPm1fUmlnaHQ7Ci0gICAgICAgICAgICBpZiAoZHggPiBzcGFjZXcgKiAxLjUpIHsKLSAgICAgICAgICAgICAgICBwVGhpc1RleHQtPm1fVGV4dCArPSBMIiAgIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZHggPiBzcGFjZXcgLyAzKSB7Ci0gICAgICAgICAgICAgICAgcFRoaXNUZXh0LT5tX1RleHQgKz0gTCcgJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUaGlzVGV4dC0+bV9UZXh0ICs9IHBOZXh0VGV4dC0+bV9UZXh0OwotICAgICAgICAgICAgcFRoaXNUZXh0LT5tX1NwYWNlV2lkdGggPSBwTmV4dFRleHQtPm1fU3BhY2VXaWR0aCA9PSAwLjAgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXcgOiBwTmV4dFRleHQtPm1fU3BhY2VXaWR0aDsKLSAgICAgICAgICAgIG1fVGV4dExpc3QuUmVtb3ZlQXQoaSArIDEpOwotICAgICAgICAgICAgZGVsZXRlIHBOZXh0VGV4dDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGkgKys7Ci0gICAgICAgIH0KK3ZvaWQgQ1RleHRCYXNlTGluZTo6SW5zZXJ0VGV4dEJveChGWF9GTE9BVCBsZWZ0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByaWdodHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9weSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBib3R0b215LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHNwYWNldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250c2l6ZV92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0KSB7CisgIGlmIChtX1RvcCA8IHRvcHkpIHsKKyAgICBtX1RvcCA9IHRvcHk7CisgIH0KKyAgaWYgKG1fQm90dG9tID4gYm90dG9teSkgeworICAgIG1fQm90dG9tID0gYm90dG9teTsKKyAgfQorICBpZiAobV9NYXhGb250U2l6ZVYgPCBmb250c2l6ZV92KSB7CisgICAgbV9NYXhGb250U2l6ZVYgPSBmb250c2l6ZV92OworICB9CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbV9UZXh0TGlzdC5HZXRTaXplKCk7IGkrKykgeworICAgIENUZXh0Qm94KiBwVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgICBpZiAocFRleHQtPm1fTGVmdCA+IGxlZnR4KSB7CisgICAgICBicmVhazsKICAgICB9CisgIH0KKyAgQ1RleHRCb3gqIHBUZXh0ID0gRlhfTkVXIENUZXh0Qm94OworICBpZiAoTlVMTCA9PSBwVGV4dCkgeworICAgIHJldHVybjsKKyAgfQorICBwVGV4dC0+bV9UZXh0ID0gdGV4dDsKKyAgcFRleHQtPm1fTGVmdCA9IGxlZnR4OworICBwVGV4dC0+bV9SaWdodCA9IHJpZ2h0eDsKKyAgcFRleHQtPm1fVG9wID0gdG9weTsKKyAgcFRleHQtPm1fQm90dG9tID0gYm90dG9teTsKKyAgcFRleHQtPm1fU3BhY2VXaWR0aCA9IHNwYWNldzsKKyAgcFRleHQtPm1fRm9udFNpemVWID0gZm9udHNpemVfdjsKKyAgcFRleHQtPm1fcENvbHVtbiA9IE5VTEw7CisgIG1fVGV4dExpc3QuSW5zZXJ0QXQoaSwgcFRleHQpOwogfQotdm9pZCBDVGV4dEJhc2VMaW5lOjpXcml0ZU91dHB1dChDRlhfV2lkZVN0cmluZyYgc3RyLCBGWF9GTE9BVCBsZWZ0eCwgRlhfRkxPQVQgcGFnZXdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVRleHRXaWR0aCkKLXsKLSAgICBpbnQgbGFzdHBvcyA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9UZXh0TGlzdC5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRCb3gqIHBUZXh0ID0gKENUZXh0Qm94KiltX1RleHRMaXN0LkdldEF0KGkpOwotICAgICAgICBpbnQgeHBvczsKLSAgICAgICAgaWYgKHBUZXh0LT5tX3BDb2x1bW4pIHsKLSAgICAgICAgICAgIHhwb3MgPSAoaW50KSgocFRleHQtPm1fcENvbHVtbi0+bV9BdmdQb3MgLSBsZWZ0eCkgKiBpVGV4dFdpZHRoIC8gcGFnZXdpZHRoICsgMC41KTsKLSAgICAgICAgICAgIHhwb3MgLT0gcFRleHQtPm1fVGV4dC5HZXRMZW5ndGgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhwb3MgPSAoaW50KSgocFRleHQtPm1fTGVmdCAtIGxlZnR4KSAqIGlUZXh0V2lkdGggLyBwYWdld2lkdGggKyAwLjUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh4cG9zIDw9IGxhc3Rwb3MpIHsKLSAgICAgICAgICAgIHhwb3MgPSBsYXN0cG9zICsgMTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBqID0gbGFzdHBvcyArIDE7IGogPCB4cG9zOyBqICsrKSB7Ci0gICAgICAgICAgICBzdHIgKz0gJyAnOwotICAgICAgICB9Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHNTcmMocFRleHQtPm1fVGV4dCk7Ci0gICAgICAgIE5vcm1hbGl6ZVN0cmluZyhzU3JjKTsKLSAgICAgICAgc3RyICs9IHNTcmM7Ci0gICAgICAgIHN0ciArPSAnICc7Ci0gICAgICAgIGxhc3Rwb3MgPSB4cG9zICsgcFRleHQtPm1fVGV4dC5HZXRMZW5ndGgoKTsKK0ZYX0JPT0wgR2V0SW50ZXJzZWN0aW9uKEZYX0ZMT0FUIGxvdzEsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoaWdoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxvdzIsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoaWdoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBpbnRlcmxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBpbnRlcmhpZ2gpOworRlhfQk9PTCBDVGV4dEJhc2VMaW5lOjpDYW5NZXJnZShDVGV4dEJhc2VMaW5lKiBwT3RoZXIpIHsKKyAgRlhfRkxPQVQgaW50ZXJfdG9wLCBpbnRlcl9ib3R0b207CisgIGlmICghR2V0SW50ZXJzZWN0aW9uKG1fQm90dG9tLCBtX1RvcCwgcE90aGVyLT5tX0JvdHRvbSwgcE90aGVyLT5tX1RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJfYm90dG9tLCBpbnRlcl90b3ApKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0ZMT0FUIGludGVyX2ggPSBpbnRlcl90b3AgLSBpbnRlcl9ib3R0b207CisgIGlmIChpbnRlcl9oIDwgKG1fVG9wIC0gbV9Cb3R0b20pIC8gMiAmJgorICAgICAgaW50ZXJfaCA8IChwT3RoZXItPm1fVG9wIC0gcE90aGVyLT5tX0JvdHRvbSkgLyAyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0ZMT0FUIGR5ID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMobV9CYXNlTGluZSAtIHBPdGhlci0+bV9CYXNlTGluZSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9UZXh0TGlzdC5HZXRTaXplKCk7IGkrKykgeworICAgIENUZXh0Qm94KiBwVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHBPdGhlci0+bV9UZXh0TGlzdC5HZXRTaXplKCk7IGorKykgeworICAgICAgQ1RleHRCb3gqIHBPdGhlclRleHQgPSAoQ1RleHRCb3gqKXBPdGhlci0+bV9UZXh0TGlzdC5HZXRBdChqKTsKKyAgICAgIEZYX0ZMT0FUIGludGVyX2xlZnQsIGludGVyX3JpZ2h0OworICAgICAgaWYgKCFHZXRJbnRlcnNlY3Rpb24ocFRleHQtPm1fTGVmdCwgcFRleHQtPm1fUmlnaHQsIHBPdGhlclRleHQtPm1fTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdGhlclRleHQtPm1fUmlnaHQsIGludGVyX2xlZnQsIGludGVyX3JpZ2h0KSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEZYX0ZMT0FUIGludGVyX3cgPSBpbnRlcl9yaWdodCAtIGludGVyX2xlZnQ7CisgICAgICBpZiAoaW50ZXJfdyA8IHBUZXh0LT5tX1NwYWNlV2lkdGggLyAyICYmCisgICAgICAgICAgaW50ZXJfdyA8IHBPdGhlclRleHQtPm1fU3BhY2VXaWR0aCAvIDIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoZHkgPj0gKHBUZXh0LT5tX0JvdHRvbSAtIHBUZXh0LT5tX1RvcCkgLyAyIHx8CisgICAgICAgICAgZHkgPj0gKHBPdGhlclRleHQtPm1fQm90dG9tIC0gcE90aGVyVGV4dC0+bV9Ub3ApIC8gMikgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CiAgICAgfQorICB9CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDVGV4dEJhc2VMaW5lOjpDb3VudENoYXJzKGludCYgY291bnQsIEZYX0ZMT0FUJiB3aWR0aCwgaW50JiBtaW5jaGFycykKLXsKLSAgICBtaW5jaGFycyA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDVGV4dEJveCogcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgICAgIGlmIChwVGV4dC0+bV9SaWdodCAtIHBUZXh0LT5tX0xlZnQgPCAwLjAwMikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQgKz0gcFRleHQtPm1fVGV4dC5HZXRMZW5ndGgoKTsKLSAgICAgICAgd2lkdGggKz0gcFRleHQtPm1fUmlnaHQgLSBwVGV4dC0+bV9MZWZ0OwotICAgICAgICBtaW5jaGFycyArPSBwVGV4dC0+bV9UZXh0LkdldExlbmd0aCgpICsgMTsKK3ZvaWQgQ1RleHRCYXNlTGluZTo6TWVyZ2UoQ1RleHRCYXNlTGluZSogcE90aGVyKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcE90aGVyLT5tX1RleHRMaXN0LkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRCb3gqIHBUZXh0ID0gKENUZXh0Qm94KilwT3RoZXItPm1fVGV4dExpc3QuR2V0QXQoaSk7CisgICAgSW5zZXJ0VGV4dEJveChwVGV4dC0+bV9MZWZ0LCBwVGV4dC0+bV9SaWdodCwgcFRleHQtPm1fVG9wLCBwVGV4dC0+bV9Cb3R0b20sCisgICAgICAgICAgICAgICAgICBwVGV4dC0+bV9TcGFjZVdpZHRoLCBwVGV4dC0+bV9Gb250U2l6ZVYsIHBUZXh0LT5tX1RleHQpOworICB9Cit9CitGWF9CT09MIENUZXh0QmFzZUxpbmU6OkdldFdpZHRoKEZYX0ZMT0FUJiBsZWZ0eCwgRlhfRkxPQVQmIHJpZ2h0eCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1fVGV4dExpc3QuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDVGV4dEJveCogcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7CisgICAgaWYgKHBUZXh0LT5tX1RleHQgIT0gTCIgIikgeworICAgICAgYnJlYWs7CiAgICAgfQorICB9CisgIGlmIChpID09IG1fVGV4dExpc3QuR2V0U2l6ZSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENUZXh0Qm94KiBwVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgbGVmdHggPSBwVGV4dC0+bV9MZWZ0OworICBmb3IgKGkgPSBtX1RleHRMaXN0LkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgQ1RleHRCb3gqIHBUZXh0ID0gKENUZXh0Qm94KiltX1RleHRMaXN0LkdldEF0KGkpOworICAgIGlmIChwVGV4dC0+bV9UZXh0ICE9IEwiICIpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBwVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgcmlnaHR4ID0gcFRleHQtPm1fUmlnaHQ7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDVGV4dEJhc2VMaW5lOjpNZXJnZUJveGVzKCkgeworICBpbnQgaSA9IDA7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKGkgPj0gbV9UZXh0TGlzdC5HZXRTaXplKCkgLSAxKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgQ1RleHRCb3gqIHBUaGlzVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgICBDVGV4dEJveCogcE5leHRUZXh0ID0gKENUZXh0Qm94KiltX1RleHRMaXN0LkdldEF0KGkgKyAxKTsKKyAgICBGWF9GTE9BVCBkeCA9IHBOZXh0VGV4dC0+bV9MZWZ0IC0gcFRoaXNUZXh0LT5tX1JpZ2h0OworICAgIEZYX0ZMT0FUIHNwYWNldyA9IChwVGhpc1RleHQtPm1fU3BhY2VXaWR0aCA9PSAwLjApCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gcE5leHRUZXh0LT5tX1NwYWNlV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwVGhpc1RleHQtPm1fU3BhY2VXaWR0aDsKKyAgICBpZiAoc3BhY2V3ID4gMC4wICYmIGR4IDwgc3BhY2V3ICogMikgeworICAgICAgcFRoaXNUZXh0LT5tX1JpZ2h0ID0gcE5leHRUZXh0LT5tX1JpZ2h0OworICAgICAgaWYgKGR4ID4gc3BhY2V3ICogMS41KSB7CisgICAgICAgIHBUaGlzVGV4dC0+bV9UZXh0ICs9IEwiICAiOworICAgICAgfSBlbHNlIGlmIChkeCA+IHNwYWNldyAvIDMpIHsKKyAgICAgICAgcFRoaXNUZXh0LT5tX1RleHQgKz0gTCcgJzsKKyAgICAgIH0KKyAgICAgIHBUaGlzVGV4dC0+bV9UZXh0ICs9IHBOZXh0VGV4dC0+bV9UZXh0OworICAgICAgcFRoaXNUZXh0LT5tX1NwYWNlV2lkdGggPQorICAgICAgICAgIHBOZXh0VGV4dC0+bV9TcGFjZVdpZHRoID09IDAuMCA/IHNwYWNldyA6IHBOZXh0VGV4dC0+bV9TcGFjZVdpZHRoOworICAgICAgbV9UZXh0TGlzdC5SZW1vdmVBdChpICsgMSk7CisgICAgICBkZWxldGUgcE5leHRUZXh0OworICAgIH0gZWxzZSB7CisgICAgICBpKys7CisgICAgfQorICB9Cit9Cit2b2lkIENUZXh0QmFzZUxpbmU6OldyaXRlT3V0cHV0KENGWF9XaWRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxlZnR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwYWdld2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpVGV4dFdpZHRoKSB7CisgIGludCBsYXN0cG9zID0gLTE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9UZXh0TGlzdC5HZXRTaXplKCk7IGkrKykgeworICAgIENUZXh0Qm94KiBwVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgICBpbnQgeHBvczsKKyAgICBpZiAocFRleHQtPm1fcENvbHVtbikgeworICAgICAgeHBvcyA9CisgICAgICAgICAgKGludCkoKHBUZXh0LT5tX3BDb2x1bW4tPm1fQXZnUG9zIC0gbGVmdHgpICogaVRleHRXaWR0aCAvIHBhZ2V3aWR0aCArCisgICAgICAgICAgICAgICAgMC41KTsKKyAgICAgIHhwb3MgLT0gcFRleHQtPm1fVGV4dC5HZXRMZW5ndGgoKTsKKyAgICB9IGVsc2UgeworICAgICAgeHBvcyA9IChpbnQpKChwVGV4dC0+bV9MZWZ0IC0gbGVmdHgpICogaVRleHRXaWR0aCAvIHBhZ2V3aWR0aCArIDAuNSk7CisgICAgfQorICAgIGlmICh4cG9zIDw9IGxhc3Rwb3MpIHsKKyAgICAgIHhwb3MgPSBsYXN0cG9zICsgMTsKKyAgICB9CisgICAgZm9yIChpbnQgaiA9IGxhc3Rwb3MgKyAxOyBqIDwgeHBvczsgaisrKSB7CisgICAgICBzdHIgKz0gJyAnOworICAgIH0KKyAgICBDRlhfV2lkZVN0cmluZyBzU3JjKHBUZXh0LT5tX1RleHQpOworICAgIE5vcm1hbGl6ZVN0cmluZyhzU3JjKTsKKyAgICBzdHIgKz0gc1NyYzsKKyAgICBzdHIgKz0gJyAnOworICAgIGxhc3Rwb3MgPSB4cG9zICsgcFRleHQtPm1fVGV4dC5HZXRMZW5ndGgoKTsKKyAgfQorfQordm9pZCBDVGV4dEJhc2VMaW5lOjpDb3VudENoYXJzKGludCYgY291bnQsIEZYX0ZMT0FUJiB3aWR0aCwgaW50JiBtaW5jaGFycykgeworICBtaW5jaGFycyA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9UZXh0TGlzdC5HZXRTaXplKCk7IGkrKykgeworICAgIENUZXh0Qm94KiBwVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgICBpZiAocFRleHQtPm1fUmlnaHQgLSBwVGV4dC0+bV9MZWZ0IDwgMC4wMDIpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjb3VudCArPSBwVGV4dC0+bV9UZXh0LkdldExlbmd0aCgpOworICAgIHdpZHRoICs9IHBUZXh0LT5tX1JpZ2h0IC0gcFRleHQtPm1fTGVmdDsKKyAgICBtaW5jaGFycyArPSBwVGV4dC0+bV9UZXh0LkdldExlbmd0aCgpICsgMTsKKyAgfQogfQogI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUKLXN0YXRpYyB2b2lkIENoZWNrUm90YXRlKENQREZfUGFnZSYgcGFnZSwgQ0ZYX0Zsb2F0UmVjdCYgcGFnZV9iYm94KQotewotICAgIGludCB0b3RhbF9jb3VudCA9IDAsIHJvdGF0ZWRfY291bnRbM10gPSB7MCwgMCwgMH07Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gcGFnZS5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPSBwYWdlLkdldE5leHRPYmplY3QocG9zKTsKLSAgICAgICAgaWYgKHBPYmotPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHRvdGFsX2NvdW50ICsrOwotICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0ID0gKENQREZfVGV4dE9iamVjdCopcE9iajsKLSAgICAgICAgRlhfRkxPQVQgYW5nbGUgPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0QmFzZWxpbmVBbmdsZSgpOwotICAgICAgICBpZiAoYW5nbGUgPT0gMC4wKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZGVncmVlID0gKGludCkoYW5nbGUgKiAxODAgLyBQSSArIDAuNSk7Ci0gICAgICAgIGlmIChkZWdyZWUgJSA5MCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlZ3JlZSA8IDApIHsKLSAgICAgICAgICAgIGRlZ3JlZSArPSAzNjA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGluZGV4ID0gZGVncmVlIC8gOTAgJSAzIC0gMTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcm90YXRlZF9jb3VudFtpbmRleF0gKys7CitzdGF0aWMgdm9pZCBDaGVja1JvdGF0ZShDUERGX1BhZ2UmIHBhZ2UsIENGWF9GbG9hdFJlY3QmIHBhZ2VfYmJveCkgeworICBpbnQgdG90YWxfY291bnQgPSAwLCByb3RhdGVkX2NvdW50WzNdID0gezAsIDAsIDB9OworICBGWF9QT1NJVElPTiBwb3MgPSBwYWdlLkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IHBhZ2UuR2V0TmV4dE9iamVjdChwb3MpOworICAgIGlmIChwT2JqLT5tX1R5cGUgIT0gUERGUEFHRV9URVhUKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKHRvdGFsX2NvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuOworICAgIHRvdGFsX2NvdW50Kys7CisgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dCA9IChDUERGX1RleHRPYmplY3QqKXBPYmo7CisgICAgRlhfRkxPQVQgYW5nbGUgPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0QmFzZWxpbmVBbmdsZSgpOworICAgIGlmIChhbmdsZSA9PSAwLjApIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICBpZiAocm90YXRlZF9jb3VudFswXSA+IHRvdGFsX2NvdW50ICogMiAvIDMpIHsKLSAgICAgICAgbWF0cml4LlNldCgwLCAtMSwgMSwgMCwgMCwgcGFnZS5HZXRQYWdlSGVpZ2h0KCkpOwotICAgIH0gZWxzZSBpZiAocm90YXRlZF9jb3VudFsxXSA+IHRvdGFsX2NvdW50ICogMiAvIDMpIHsKLSAgICAgICAgbWF0cml4LlNldCgtMSwgMCwgMCwgLTEsIHBhZ2UuR2V0UGFnZVdpZHRoKCksIHBhZ2UuR2V0UGFnZUhlaWdodCgpKTsKLSAgICB9IGVsc2UgaWYgKHJvdGF0ZWRfY291bnRbMl0gPiB0b3RhbF9jb3VudCAqIDIgLyAzKSB7Ci0gICAgICAgIG1hdHJpeC5TZXQoMCwgMSwgLTEsIDAsIHBhZ2UuR2V0UGFnZVdpZHRoKCksIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpbnQgZGVncmVlID0gKGludCkoYW5nbGUgKiAxODAgLyBQSSArIDAuNSk7CisgICAgaWYgKGRlZ3JlZSAlIDkwKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgcGFnZS5UcmFuc2Zvcm0obWF0cml4KTsKLSAgICBwYWdlX2Jib3guVHJhbnNmb3JtKCZtYXRyaXgpOworICAgIGlmIChkZWdyZWUgPCAwKSB7CisgICAgICBkZWdyZWUgKz0gMzYwOworICAgIH0KKyAgICBpbnQgaW5kZXggPSBkZWdyZWUgLyA5MCAlIDMgLSAxOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICByb3RhdGVkX2NvdW50W2luZGV4XSsrOworICB9CisgIGlmICh0b3RhbF9jb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OworICBpZiAocm90YXRlZF9jb3VudFswXSA+IHRvdGFsX2NvdW50ICogMiAvIDMpIHsKKyAgICBtYXRyaXguU2V0KDAsIC0xLCAxLCAwLCAwLCBwYWdlLkdldFBhZ2VIZWlnaHQoKSk7CisgIH0gZWxzZSBpZiAocm90YXRlZF9jb3VudFsxXSA+IHRvdGFsX2NvdW50ICogMiAvIDMpIHsKKyAgICBtYXRyaXguU2V0KC0xLCAwLCAwLCAtMSwgcGFnZS5HZXRQYWdlV2lkdGgoKSwgcGFnZS5HZXRQYWdlSGVpZ2h0KCkpOworICB9IGVsc2UgaWYgKHJvdGF0ZWRfY291bnRbMl0gPiB0b3RhbF9jb3VudCAqIDIgLyAzKSB7CisgICAgbWF0cml4LlNldCgwLCAxLCAtMSwgMCwgcGFnZS5HZXRQYWdlV2lkdGgoKSwgMCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuOworICB9CisgIHBhZ2UuVHJhbnNmb3JtKG1hdHJpeCk7CisgIHBhZ2VfYmJveC5UcmFuc2Zvcm0oJm1hdHJpeCk7CiB9Ci12b2lkIFBERl9HZXRQYWdlVGV4dF9Vbmljb2RlKENGWF9XaWRlU3RyaW5nQXJyYXkmIGxpbmVzLCBDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbldpZHRoLCBGWF9EV09SRCBmbGFncykKLXsKLSAgICBsaW5lcy5SZW1vdmVBbGwoKTsKLSAgICBpZiAocFBhZ2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Cit2b2lkIFBERl9HZXRQYWdlVGV4dF9Vbmljb2RlKENGWF9XaWRlU3RyaW5nQXJyYXkmIGxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncykgeworICBsaW5lcy5SZW1vdmVBbGwoKTsKKyAgaWYgKHBQYWdlID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9QYWdlIHBhZ2U7CisgIHBhZ2UuTG9hZChwRG9jLCBwUGFnZSk7CisgIENQREZfUGFyc2VPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMubV9iVGV4dE9ubHkgPSBUUlVFOworICBvcHRpb25zLm1fYlNlcGFyYXRlRm9ybSA9IEZBTFNFOworICBwYWdlLlBhcnNlQ29udGVudCgmb3B0aW9ucyk7CisgIENGWF9GbG9hdFJlY3QgcGFnZV9iYm94ID0gcGFnZS5HZXRQYWdlQkJveCgpOworICBpZiAoZmxhZ3MgJiBQREYyVFhUX0FVVE9fUk9UQVRFKSB7CisgICAgQ2hlY2tSb3RhdGUocGFnZSwgcGFnZV9iYm94KTsKKyAgfQorICBDVGV4dFBhZ2UgdGV4dHM7CisgIHRleHRzLm1fYkF1dG9XaWR0aCA9IGZsYWdzICYgUERGMlRYVF9BVVRPX1dJRFRIOworICB0ZXh0cy5tX2JLZWVwQ29sdW1uID0gZmxhZ3MgJiBQREYyVFhUX0tFRVBfQ09MVU1OOworICB0ZXh0cy5tX2JCcmVha1NwYWNlID0gVFJVRTsKKyAgRlhfUE9TSVRJT04gcG9zID0gcGFnZS5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmplY3QgPSBwYWdlLkdldE5leHRPYmplY3QocG9zKTsKKyAgICBpZiAoIShmbGFncyAmIFBERjJUWFRfSU5DTFVERV9JTlZJU0lCTEUpKSB7CisgICAgICBDRlhfRmxvYXRSZWN0IHJlY3QocE9iamVjdC0+bV9MZWZ0LCBwT2JqZWN0LT5tX0JvdHRvbSwgcE9iamVjdC0+bV9SaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0LT5tX1RvcCk7CisgICAgICBpZiAoIXBhZ2VfYmJveC5Db250YWlucyhyZWN0KSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KICAgICB9Ci0gICAgQ1BERl9QYWdlIHBhZ2U7Ci0gICAgcGFnZS5Mb2FkKHBEb2MsIHBQYWdlKTsKLSAgICBDUERGX1BhcnNlT3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMubV9iVGV4dE9ubHkgPSBUUlVFOwotICAgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gRkFMU0U7Ci0gICAgcGFnZS5QYXJzZUNvbnRlbnQoJm9wdGlvbnMpOwotICAgIENGWF9GbG9hdFJlY3QgcGFnZV9iYm94ID0gcGFnZS5HZXRQYWdlQkJveCgpOwotICAgIGlmIChmbGFncyAmIFBERjJUWFRfQVVUT19ST1RBVEUpIHsKLSAgICAgICAgQ2hlY2tSb3RhdGUocGFnZSwgcGFnZV9iYm94KTsKLSAgICB9Ci0gICAgQ1RleHRQYWdlIHRleHRzOwotICAgIHRleHRzLm1fYkF1dG9XaWR0aCA9IGZsYWdzICYgUERGMlRYVF9BVVRPX1dJRFRIOwotICAgIHRleHRzLm1fYktlZXBDb2x1bW4gPSBmbGFncyAmIFBERjJUWFRfS0VFUF9DT0xVTU47Ci0gICAgdGV4dHMubV9iQnJlYWtTcGFjZSA9IFRSVUU7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gcGFnZS5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmplY3QgPSBwYWdlLkdldE5leHRPYmplY3QocG9zKTsKLSAgICAgICAgaWYgKCEoZmxhZ3MgJiBQREYyVFhUX0lOQ0xVREVfSU5WSVNJQkxFKSkgewotICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0KHBPYmplY3QtPm1fTGVmdCwgcE9iamVjdC0+bV9Cb3R0b20sIHBPYmplY3QtPm1fUmlnaHQsIHBPYmplY3QtPm1fVG9wKTsKLSAgICAgICAgICAgIGlmICghcGFnZV9iYm94LkNvbnRhaW5zKHJlY3QpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGV4dHMuUHJvY2Vzc09iamVjdChwT2JqZWN0KTsKLSAgICB9Ci0gICAgdGV4dHMuV3JpdGVPdXRwdXQobGluZXMsIGlNaW5XaWR0aCk7CisgICAgdGV4dHMuUHJvY2Vzc09iamVjdChwT2JqZWN0KTsKKyAgfQorICB0ZXh0cy5Xcml0ZU91dHB1dChsaW5lcywgaU1pbldpZHRoKTsKIH0KLXZvaWQgUERGX0dldFBhZ2VUZXh0KENGWF9CeXRlU3RyaW5nQXJyYXkmIGxpbmVzLCBDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAotICAgICAgICAgICAgICAgICAgICAgaW50IGlNaW5XaWR0aCwgRlhfRFdPUkQgZmxhZ3MpCi17Ci0gICAgbGluZXMuUmVtb3ZlQWxsKCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3bGluZXM7Ci0gICAgUERGX0dldFBhZ2VUZXh0X1VuaWNvZGUod2xpbmVzLCBwRG9jLCBwUGFnZSwgaU1pbldpZHRoLCBmbGFncyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3bGluZXMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzdHIgPSB3bGluZXNbaV07Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCB3c3RyLkdldExlbmd0aCgpOyBjICsrKSB7Ci0gICAgICAgICAgICBzdHIgKz0gQ2hhckZyb21Vbmljb2RlQWx0KHdzdHJbY10sIEZYU1lTX0dldEFDUCgpLCAiPyIpOwotICAgICAgICB9Ci0gICAgICAgIGxpbmVzLkFkZChzdHIpOwordm9pZCBQREZfR2V0UGFnZVRleHQoQ0ZYX0J5dGVTdHJpbmdBcnJheSYgbGluZXMsCisgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBpTWluV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncykgeworICBsaW5lcy5SZW1vdmVBbGwoKTsKKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3bGluZXM7CisgIFBERl9HZXRQYWdlVGV4dF9Vbmljb2RlKHdsaW5lcywgcERvYywgcFBhZ2UsIGlNaW5XaWR0aCwgZmxhZ3MpOworICBmb3IgKGludCBpID0gMDsgaSA8IHdsaW5lcy5HZXRTaXplKCk7IGkrKykgeworICAgIENGWF9XaWRlU3RyaW5nIHdzdHIgPSB3bGluZXNbaV07CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOworICAgIGZvciAoaW50IGMgPSAwOyBjIDwgd3N0ci5HZXRMZW5ndGgoKTsgYysrKSB7CisgICAgICBzdHIgKz0gQ2hhckZyb21Vbmljb2RlQWx0KHdzdHJbY10sIEZYU1lTX0dldEFDUCgpLCAiPyIpOwogICAgIH0KKyAgICBsaW5lcy5BZGQoc3RyKTsKKyAgfQogfQotZXh0ZXJuIHZvaWQgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIENQREZfUGFnZU9iamVjdHMqIHBQYWdlLCBGWF9CT09MIGJVc2VMRiwKK2V4dGVybiB2b2lkIF9QREZfR2V0VGV4dFN0cmVhbV9Vbmljb2RlKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VMRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogcE9iakFycmF5KTsKLXZvaWQgUERGX0dldFRleHRTdHJlYW1fVW5pY29kZShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSwgRlhfRFdPUkQgZmxhZ3MpCi17Ci0gICAgYnVmZmVyLkVzdGltYXRlU2l6ZSgwLCAxMDI0MCk7Ci0gICAgQ1BERl9QYWdlIHBhZ2U7Ci0gICAgcGFnZS5Mb2FkKHBEb2MsIHBQYWdlKTsKLSAgICBDUERGX1BhcnNlT3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMubV9iVGV4dE9ubHkgPSBUUlVFOwotICAgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gRkFMU0U7Ci0gICAgcGFnZS5QYXJzZUNvbnRlbnQoJm9wdGlvbnMpOwotICAgIF9QREZfR2V0VGV4dFN0cmVhbV9Vbmljb2RlKGJ1ZmZlciwgJnBhZ2UsIFRSVUUsIE5VTEwpOwordm9pZCBQREZfR2V0VGV4dFN0cmVhbV9Vbmljb2RlKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncykgeworICBidWZmZXIuRXN0aW1hdGVTaXplKDAsIDEwMjQwKTsKKyAgQ1BERl9QYWdlIHBhZ2U7CisgIHBhZ2UuTG9hZChwRG9jLCBwUGFnZSk7CisgIENQREZfUGFyc2VPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMubV9iVGV4dE9ubHkgPSBUUlVFOworICBvcHRpb25zLm1fYlNlcGFyYXRlRm9ybSA9IEZBTFNFOworICBwYWdlLlBhcnNlQ29udGVudCgmb3B0aW9ucyk7CisgIF9QREZfR2V0VGV4dFN0cmVhbV9Vbmljb2RlKGJ1ZmZlciwgJnBhZ2UsIFRSVUUsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X2ludC5jcHAgYi9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfaW50LmNwcAppbmRleCA4YzMxMDE4Li4yZjZhOGRiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfaW50LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfaW50LmNwcApAQCAtMTksMTMyICsxOSwxMjkgQEAKIAogbmFtZXNwYWNlIHsKIAotRlhfQk9PTCBfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihGWF9XQ0hBUiBjdXJDaGFyKQotewotICAgIGlmKGN1ckNoYXIgPCAyNTUgKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCAoY3VyQ2hhciA+PSAweDA2MDAgJiYgY3VyQ2hhciA8PSAweDA2RkYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweEZFNzAgJiYgY3VyQ2hhciA8PSAweEZFRkYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweEZCNTAgJiYgY3VyQ2hhciA8PSAweEZERkYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweDA0MDAgJiYgY3VyQ2hhciA8PSAweDA0RkYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweDA1MDAgJiYgY3VyQ2hhciA8PSAweDA1MkYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweEE2NDAgJiYgY3VyQ2hhciA8PSAweEE2OUYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweDJERTAgJiYgY3VyQ2hhciA8PSAweDJERkYpCi0gICAgICAgICAgICB8fCBjdXJDaGFyID09IDg0NjcKLSAgICAgICAgICAgIHx8IChjdXJDaGFyID49IDB4MjAwMCAmJiBjdXJDaGFyIDw9IDB4MjA2RikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgX0lzSWdub3JlU3BhY2VDaGFyYWN0ZXIoRlhfV0NIQVIgY3VyQ2hhcikgeworICBpZiAoY3VyQ2hhciA8IDI1NSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoKGN1ckNoYXIgPj0gMHgwNjAwICYmIGN1ckNoYXIgPD0gMHgwNkZGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHhGRTcwICYmIGN1ckNoYXIgPD0gMHhGRUZGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHhGQjUwICYmIGN1ckNoYXIgPD0gMHhGREZGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHgwNDAwICYmIGN1ckNoYXIgPD0gMHgwNEZGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHgwNTAwICYmIGN1ckNoYXIgPD0gMHgwNTJGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHhBNjQwICYmIGN1ckNoYXIgPD0gMHhBNjlGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHgyREUwICYmIGN1ckNoYXIgPD0gMHgyREZGKSB8fCBjdXJDaGFyID09IDg0NjcgfHwKKyAgICAgIChjdXJDaGFyID49IDB4MjAwMCAmJiBjdXJDaGFyIDw9IDB4MjA2RikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0ZMT0FUIF9Ob3JtYWxpemVUaHJlc2hvbGQoRlhfRkxPQVQgdGhyZXNob2xkKQotewotICAgIGlmICh0aHJlc2hvbGQgPCAzMDApIHsKLSAgICAgICAgcmV0dXJuIHRocmVzaG9sZCAvIDIuMGY7Ci0gICAgfQotICAgIGlmICh0aHJlc2hvbGQgPCA1MDApIHsKLSAgICAgICAgcmV0dXJuIHRocmVzaG9sZCAvIDQuMGY7Ci0gICAgfQotICAgIGlmICh0aHJlc2hvbGQgPCA3MDApIHsKLSAgICAgICAgcmV0dXJuIHRocmVzaG9sZCAvIDUuMGY7Ci0gICAgfQotICAgIHJldHVybiB0aHJlc2hvbGQgLyA2LjBmOworRlhfRkxPQVQgX05vcm1hbGl6ZVRocmVzaG9sZChGWF9GTE9BVCB0aHJlc2hvbGQpIHsKKyAgaWYgKHRocmVzaG9sZCA8IDMwMCkgeworICAgIHJldHVybiB0aHJlc2hvbGQgLyAyLjBmOworICB9CisgIGlmICh0aHJlc2hvbGQgPCA1MDApIHsKKyAgICByZXR1cm4gdGhyZXNob2xkIC8gNC4wZjsKKyAgfQorICBpZiAodGhyZXNob2xkIDwgNzAwKSB7CisgICAgcmV0dXJuIHRocmVzaG9sZCAvIDUuMGY7CisgIH0KKyAgcmV0dXJuIHRocmVzaG9sZCAvIDYuMGY7CiB9CiAKIEZYX0ZMT0FUIF9DYWxjdWxhdGVCYXNlU3BhY2UoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIEZYX0ZMT0FUIGJhc2VTcGFjZSA9IDAuMDsKLSAgICBjb25zdCBpbnQgbkl0ZW1zID0gcFRleHRPYmotPkNvdW50SXRlbXMoKTsKLSAgICBpZiAocFRleHRPYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NoYXJTcGFjZSAmJiBuSXRlbXMgPj0gMykgewotICAgICAgICBGWF9CT09MIGJBbGxDaGFyID0gVFJVRTsKLSAgICAgICAgRlhfRkxPQVQgc3BhY2luZyA9IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZSgKLSAgICAgICAgICAgIHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2UpOwotICAgICAgICBiYXNlU3BhY2UgPSBzcGFjaW5nOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5JdGVtczsgaSsrKSB7Ci0gICAgICAgICAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gICAgICAgICAgICBwVGV4dE9iai0+R2V0SXRlbUluZm8oaSwgJml0ZW0pOwotICAgICAgICAgICAgaWYgKGl0ZW0ubV9DaGFyQ29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX2ggPSBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQga2VybmluZyA9IC1mb250c2l6ZV9oICogaXRlbS5tX09yaWdpblggLyAxMDAwOwotICAgICAgICAgICAgICAgIGJhc2VTcGFjZSA9IHN0ZDo6bWluKGJhc2VTcGFjZSwga2VybmluZyArIHNwYWNpbmcpOwotICAgICAgICAgICAgICAgIGJBbGxDaGFyID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJhc2VTcGFjZSA8IDAuMCB8fCAobkl0ZW1zID09IDMgJiYgIWJBbGxDaGFyKSkgewotICAgICAgICAgICAgYmFzZVNwYWNlID0gMC4wOwotICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkgeworICBGWF9GTE9BVCBiYXNlU3BhY2UgPSAwLjA7CisgIGNvbnN0IGludCBuSXRlbXMgPSBwVGV4dE9iai0+Q291bnRJdGVtcygpOworICBpZiAocFRleHRPYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NoYXJTcGFjZSAmJiBuSXRlbXMgPj0gMykgeworICAgIEZYX0JPT0wgYkFsbENoYXIgPSBUUlVFOworICAgIEZYX0ZMT0FUIHNwYWNpbmcgPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UoCisgICAgICAgIHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2UpOworICAgIGJhc2VTcGFjZSA9IHNwYWNpbmc7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgeworICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOworICAgICAgcFRleHRPYmotPkdldEl0ZW1JbmZvKGksICZpdGVtKTsKKyAgICAgIGlmIChpdGVtLm1fQ2hhckNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX2ggPSBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7CisgICAgICAgIEZYX0ZMT0FUIGtlcm5pbmcgPSAtZm9udHNpemVfaCAqIGl0ZW0ubV9PcmlnaW5YIC8gMTAwMDsKKyAgICAgICAgYmFzZVNwYWNlID0gc3RkOjptaW4oYmFzZVNwYWNlLCBrZXJuaW5nICsgc3BhY2luZyk7CisgICAgICAgIGJBbGxDaGFyID0gRkFMU0U7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBiYXNlU3BhY2U7CisgICAgaWYgKGJhc2VTcGFjZSA8IDAuMCB8fCAobkl0ZW1zID09IDMgJiYgIWJBbGxDaGFyKSkgeworICAgICAgYmFzZVNwYWNlID0gMC4wOworICAgIH0KKyAgfQorICByZXR1cm4gYmFzZVNwYWNlOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKIAogQ1BERlRleHRfUGFyc2VPcHRpb25zOjpDUERGVGV4dF9QYXJzZU9wdGlvbnMoKQotICAgIDogbV9iR2V0Q2hhckNvZGVPbmx5KEZBTFNFKSwgbV9iTm9ybWFsaXplT2JqcyhUUlVFKSwgbV9iT3V0cHV0SHlwaGVuKEZBTFNFKQoteworICAgIDogbV9iR2V0Q2hhckNvZGVPbmx5KEZBTFNFKSwKKyAgICAgIG1fYk5vcm1hbGl6ZU9ianMoVFJVRSksCisgICAgICBtX2JPdXRwdXRIeXBoZW4oRkFMU0UpIHt9CitJUERGX1RleHRQYWdlKiBJUERGX1RleHRQYWdlOjpDcmVhdGVUZXh0UGFnZSgKKyAgICBjb25zdCBDUERGX1BhZ2UqIHBQYWdlLAorICAgIENQREZUZXh0X1BhcnNlT3B0aW9ucyBQYXJzZXJPcHRpb25zKSB7CisgIENQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZUV4ID0gRlhfTkVXIENQREZfVGV4dFBhZ2UocFBhZ2UsIFBhcnNlck9wdGlvbnMpOworICByZXR1cm4gcFRleHRQYWdlRXg7CiB9Ci1JUERGX1RleHRQYWdlKiBJUERGX1RleHRQYWdlOjpDcmVhdGVUZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDUERGVGV4dF9QYXJzZU9wdGlvbnMgUGFyc2VyT3B0aW9ucykKLXsKLSAgICBDUERGX1RleHRQYWdlKiBwVGV4dFBhZ2VFeCA9IEZYX05FVyBDUERGX1RleHRQYWdlKHBQYWdlLCBQYXJzZXJPcHRpb25zKTsKLSAgICByZXR1cm4gcFRleHRQYWdlRXg7CitJUERGX1RleHRQYWdlKiBJUERGX1RleHRQYWdlOjpDcmVhdGVUZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7CisgIENQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSA9IEZYX05FVyBDUERGX1RleHRQYWdlKHBQYWdlLCBmbGFncyk7CisgIHJldHVybiBwVGV4dFBhZ2U7CiB9Ci1JUERGX1RleHRQYWdlKiBJUERGX1RleHRQYWdlOjpDcmVhdGVUZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBpbnQgZmxhZ3MpCi17Ci0gICAgQ1BERl9UZXh0UGFnZSogcFRleHRQYWdlID0gRlhfTkVXIENQREZfVGV4dFBhZ2UocFBhZ2UsIGZsYWdzKTsKLSAgICByZXR1cm4JcFRleHRQYWdlOworSVBERl9UZXh0UGFnZSogSVBERl9UZXh0UGFnZTo6Q3JlYXRlVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKKyAgQ1BERl9UZXh0UGFnZSogcFRleHRQYWdlID0gRlhfTkVXIENQREZfVGV4dFBhZ2UocE9ianMsIGZsYWdzKTsKKyAgcmV0dXJuIHBUZXh0UGFnZTsKIH0KLUlQREZfVGV4dFBhZ2UqCUlQREZfVGV4dFBhZ2U6OkNyZWF0ZVRleHRQYWdlKGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBPYmpzLCBpbnQgZmxhZ3MpCi17Ci0gICAgQ1BERl9UZXh0UGFnZSogcFRleHRQYWdlID0gRlhfTkVXIENQREZfVGV4dFBhZ2UocE9ianMsIGZsYWdzKTsKLSAgICByZXR1cm4JcFRleHRQYWdlOworSVBERl9UZXh0UGFnZUZpbmQqIElQREZfVGV4dFBhZ2VGaW5kOjpDcmVhdGVQYWdlRmluZCgKKyAgICBjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpIHsKKyAgaWYgKCFwVGV4dFBhZ2UpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gRlhfTkVXIENQREZfVGV4dFBhZ2VGaW5kKHBUZXh0UGFnZSk7CiB9Ci1JUERGX1RleHRQYWdlRmluZCoJSVBERl9UZXh0UGFnZUZpbmQ6OkNyZWF0ZVBhZ2VGaW5kKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkKLXsKLSAgICBpZiAoIXBUZXh0UGFnZSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIEZYX05FVyBDUERGX1RleHRQYWdlRmluZChwVGV4dFBhZ2UpOworSVBERl9MaW5rRXh0cmFjdCogSVBERl9MaW5rRXh0cmFjdDo6Q3JlYXRlTGlua0V4dHJhY3QoKSB7CisgIHJldHVybiBGWF9ORVcgQ1BERl9MaW5rRXh0cmFjdCgpOwogfQotSVBERl9MaW5rRXh0cmFjdCogSVBERl9MaW5rRXh0cmFjdDo6Q3JlYXRlTGlua0V4dHJhY3QoKQotewotICAgIHJldHVybiBGWF9ORVcgQ1BERl9MaW5rRXh0cmFjdCgpOwotfQotI2RlZmluZSAgVEVYVF9CTEFOS19DSEFSCQlMJyAnCi0jZGVmaW5lICBURVhUX0xJTkVGRUVEX0NIQVIJCUwnXG4nCi0jZGVmaW5lCSBURVhUX1JFVFVSTl9DSEFSCQlMJ1xyJwotI2RlZmluZSAgVEVYVF9FTVBUWQkJCQlMIiIKLSNkZWZpbmUgIFRFWFRfQkxBTksJCQkJTCIgIgotI2RlZmluZSAgVEVYVF9SRVRVUk5fTElORUZFRUQJTCJcclxuIgotI2RlZmluZSAgVEVYVF9MSU5FRkVFRAkJCUwiXG4iCi0jZGVmaW5lCSBURVhUX0NIQVJSQVRJT19HQVBERUxUQQkwLjA3MAorI2RlZmluZSBURVhUX0JMQU5LX0NIQVIgTCcgJworI2RlZmluZSBURVhUX0xJTkVGRUVEX0NIQVIgTCdcbicKKyNkZWZpbmUgVEVYVF9SRVRVUk5fQ0hBUiBMJ1xyJworI2RlZmluZSBURVhUX0VNUFRZIEwiIgorI2RlZmluZSBURVhUX0JMQU5LIEwiICIKKyNkZWZpbmUgVEVYVF9SRVRVUk5fTElORUZFRUQgTCJcclxuIgorI2RlZmluZSBURVhUX0xJTkVGRUVEIEwiXG4iCisjZGVmaW5lIFRFWFRfQ0hBUlJBVElPX0dBUERFTFRBIDAuMDcwCiBDUERGX1RleHRQYWdlOjpDUERGX1RleHRQYWdlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIGludCBmbGFncykKICAgICA6IG1fY2hhckxpc3QoNTEyKSwKICAgICAgIG1fVGVtcENoYXJMaXN0KDUwKSwKICAgICAgIG1fcFByZVRleHRPYmooTlVMTCksCiAgICAgICBtX0lzUGFyc2VyZWQoRkFMU0UpLAogICAgICAgbV9UZXh0bGluZURpcigtMSksCi0gICAgICBtX0N1cmxpbmVSZWN0KDAsIDAsIDAsIDApCi17Ci0gICAgbV9wUGFnZSA9IHBQYWdlOwotICAgIG1fcGFyc2VyZmxhZyA9IGZsYWdzOwotICAgIG1fVGV4dEJ1Zi5Fc3RpbWF0ZVNpemUoMCwgMTAyNDApOwotICAgIHBQYWdlLT5HZXREaXNwbGF5TWF0cml4KG1fRGlzcGxheU1hdHJpeCwgMCwgMCwgKGludCkgcFBhZ2UtPkdldFBhZ2VXaWR0aCgpLCAoaW50KXBQYWdlLT5HZXRQYWdlSGVpZ2h0KCksIDApOworICAgICAgbV9DdXJsaW5lUmVjdCgwLCAwLCAwLCAwKSB7CisgIG1fcFBhZ2UgPSBwUGFnZTsKKyAgbV9wYXJzZXJmbGFnID0gZmxhZ3M7CisgIG1fVGV4dEJ1Zi5Fc3RpbWF0ZVNpemUoMCwgMTAyNDApOworICBwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChtX0Rpc3BsYXlNYXRyaXgsIDAsIDAsIChpbnQpcFBhZ2UtPkdldFBhZ2VXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBQYWdlLT5HZXRQYWdlSGVpZ2h0KCksIDApOwogfQotQ1BERl9UZXh0UGFnZTo6Q1BERl9UZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDUERGVGV4dF9QYXJzZU9wdGlvbnMgUGFyc2VyT3B0aW9ucykKLSAgICA6IG1fUGFyc2VPcHRpb25zKFBhcnNlck9wdGlvbnMpCi0gICAgLCBtX2NoYXJMaXN0KDUxMikKLSAgICAsIG1fVGVtcENoYXJMaXN0KDUwKQotICAgICwgbV9wUHJlVGV4dE9iaihOVUxMKQotICAgICwgbV9Jc1BhcnNlcmVkKEZBTFNFKQotICAgICwgbV9UZXh0bGluZURpcigtMSkKLSAgICAsIG1fQ3VybGluZVJlY3QoMCwgMCwgMCwgMCkKLXsKLSAgICBtX3BQYWdlID0gcFBhZ2U7Ci0gICAgbV9wYXJzZXJmbGFnID0gMDsKLSAgICBtX1RleHRCdWYuRXN0aW1hdGVTaXplKDAsIDEwMjQwKTsKLSAgICBwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChtX0Rpc3BsYXlNYXRyaXgsIDAsIDAsIChpbnQpIHBQYWdlLT5HZXRQYWdlV2lkdGgoKSwgKGludClwUGFnZS0+R2V0UGFnZUhlaWdodCgpLCAwKTsKK0NQREZfVGV4dFBhZ2U6OkNQREZfVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlRleHRfUGFyc2VPcHRpb25zIFBhcnNlck9wdGlvbnMpCisgICAgOiBtX1BhcnNlT3B0aW9ucyhQYXJzZXJPcHRpb25zKSwKKyAgICAgIG1fY2hhckxpc3QoNTEyKSwKKyAgICAgIG1fVGVtcENoYXJMaXN0KDUwKSwKKyAgICAgIG1fcFByZVRleHRPYmooTlVMTCksCisgICAgICBtX0lzUGFyc2VyZWQoRkFMU0UpLAorICAgICAgbV9UZXh0bGluZURpcigtMSksCisgICAgICBtX0N1cmxpbmVSZWN0KDAsIDAsIDAsIDApIHsKKyAgbV9wUGFnZSA9IHBQYWdlOworICBtX3BhcnNlcmZsYWcgPSAwOworICBtX1RleHRCdWYuRXN0aW1hdGVTaXplKDAsIDEwMjQwKTsKKyAgcFBhZ2UtPkdldERpc3BsYXlNYXRyaXgobV9EaXNwbGF5TWF0cml4LCAwLCAwLCAoaW50KXBQYWdlLT5HZXRQYWdlV2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwUGFnZS0+R2V0UGFnZUhlaWdodCgpLCAwKTsKIH0KIENQREZfVGV4dFBhZ2U6OkNQREZfVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2UsIGludCBmbGFncykKICAgICA6IG1fY2hhckxpc3QoNTEyKSwKQEAgLTE1MiwxOTMwICsxNDksMjAxNCBAQAogICAgICAgbV9wUHJlVGV4dE9iaihOVUxMKSwKICAgICAgIG1fSXNQYXJzZXJlZChGQUxTRSksCiAgICAgICBtX1RleHRsaW5lRGlyKC0xKSwKLSAgICAgIG1fQ3VybGluZVJlY3QoMCwgMCwgMCwgMCkKLXsKLSAgICBtX3BQYWdlID0gcFBhZ2U7Ci0gICAgbV9wYXJzZXJmbGFnID0gZmxhZ3M7Ci0gICAgbV9UZXh0QnVmLkVzdGltYXRlU2l6ZSgwLCAxMDI0MCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBwYWdlUmVjdCA9IHBQYWdlLT5DYWxjQm91bmRpbmdCb3goKTsKLSAgICBtX0Rpc3BsYXlNYXRyaXggPSBDRlhfQWZmaW5lTWF0cml4KDEsIDAsIDAsIC0xLCBwYWdlUmVjdC5yaWdodCwgcGFnZVJlY3QudG9wKTsKKyAgICAgIG1fQ3VybGluZVJlY3QoMCwgMCwgMCwgMCkgeworICBtX3BQYWdlID0gcFBhZ2U7CisgIG1fcGFyc2VyZmxhZyA9IGZsYWdzOworICBtX1RleHRCdWYuRXN0aW1hdGVTaXplKDAsIDEwMjQwKTsKKyAgQ0ZYX0Zsb2F0UmVjdCBwYWdlUmVjdCA9IHBQYWdlLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgbV9EaXNwbGF5TWF0cml4ID0gQ0ZYX0FmZmluZU1hdHJpeCgxLCAwLCAwLCAtMSwgcGFnZVJlY3QucmlnaHQsIHBhZ2VSZWN0LnRvcCk7CiB9Ci12b2lkIENQREZfVGV4dFBhZ2U6Ok5vcm1hbGl6ZU9iamVjdHMoRlhfQk9PTCBiTm9ybWFsaXplKQotewotICAgIG1fUGFyc2VPcHRpb25zLm1fYk5vcm1hbGl6ZU9ianMgPSBiTm9ybWFsaXplOwordm9pZCBDUERGX1RleHRQYWdlOjpOb3JtYWxpemVPYmplY3RzKEZYX0JPT0wgYk5vcm1hbGl6ZSkgeworICBtX1BhcnNlT3B0aW9ucy5tX2JOb3JtYWxpemVPYmpzID0gYk5vcm1hbGl6ZTsKIH0KLWJvb2wgQ1BERl9UZXh0UGFnZTo6SXNDb250cm9sQ2hhcihjb25zdCBQQUdFQ0hBUl9JTkZPJiBjaGFySW5mbykKLXsKLSAgICBzd2l0Y2ggKGNoYXJJbmZvLm1fVW5pY29kZSkgewotICAgICAgICBjYXNlIDB4MjoKLSAgICAgICAgY2FzZSAweDM6Ci0gICAgICAgIGNhc2UgMHg5MzoKLSAgICAgICAgY2FzZSAweDk0OgotICAgICAgICBjYXNlIDB4OTY6Ci0gICAgICAgIGNhc2UgMHg5NzoKLSAgICAgICAgY2FzZSAweDk4OgotICAgICAgICBjYXNlIDB4ZmZmZToKLSAgICAgICAgICAgIHJldHVybiBjaGFySW5mby5tX0ZsYWcgIT0gRlBERlRFWFRfQ0hBUl9IWVBIRU47Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorYm9vbCBDUERGX1RleHRQYWdlOjpJc0NvbnRyb2xDaGFyKGNvbnN0IFBBR0VDSEFSX0lORk8mIGNoYXJJbmZvKSB7CisgIHN3aXRjaCAoY2hhckluZm8ubV9Vbmljb2RlKSB7CisgICAgY2FzZSAweDI6CisgICAgY2FzZSAweDM6CisgICAgY2FzZSAweDkzOgorICAgIGNhc2UgMHg5NDoKKyAgICBjYXNlIDB4OTY6CisgICAgY2FzZSAweDk3OgorICAgIGNhc2UgMHg5ODoKKyAgICBjYXNlIDB4ZmZmZToKKyAgICAgIHJldHVybiBjaGFySW5mby5tX0ZsYWcgIT0gRlBERlRFWFRfQ0hBUl9IWVBIRU47CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQogfQotRlhfQk9PTCBDUERGX1RleHRQYWdlOjpQYXJzZVRleHRQYWdlKCkKLXsKLSAgICBpZiAoIW1fcFBhZ2UpIHsKLSAgICAgICAgbV9Jc1BhcnNlcmVkID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CitGWF9CT09MIENQREZfVGV4dFBhZ2U6OlBhcnNlVGV4dFBhZ2UoKSB7CisgIGlmICghbV9wUGFnZSkgewogICAgIG1fSXNQYXJzZXJlZCA9IEZBTFNFOwotICAgIG1fVGV4dEJ1Zi5DbGVhcigpOwotICAgIG1fY2hhckxpc3QuUmVtb3ZlQWxsKCk7Ci0gICAgbV9wUHJlVGV4dE9iaiA9IE5VTEw7Ci0gICAgUHJvY2Vzc09iamVjdCgpOwotICAgIG1fSXNQYXJzZXJlZCA9IFRSVUU7Ci0gICAgaWYoIW1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICBtX0NoYXJJbmRleC5SZW1vdmVBbGwoKTsKLSAgICAgICAgaW50IG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOwotICAgICAgICBpZihuQ291bnQpIHsKLSAgICAgICAgICAgIG1fQ2hhckluZGV4LkFkZCgwKTsKLSAgICAgICAgfQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7Ci0gICAgICAgICAgICBGWF9CT09MIGJOb3JtYWwgPSBGQUxTRTsKLSAgICAgICAgICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoaSk7Ci0gICAgICAgICAgICBpZihjaGFyaW5mby5tX0ZsYWcgPT0gRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQpIHsKLSAgICAgICAgICAgICAgICBiTm9ybWFsID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoY2hhcmluZm8ubV9Vbmljb2RlID09IDAgfHwgSXNDb250cm9sQ2hhcihjaGFyaW5mbykpCi0gICAgICAgICAgICAgICAgYk5vcm1hbCA9IEZBTFNFOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYk5vcm1hbCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihiTm9ybWFsKSB7Ci0gICAgICAgICAgICAgICAgaWYoaW5kZXhTaXplICUgMikgewotICAgICAgICAgICAgICAgICAgICBtX0NoYXJJbmRleC5BZGQoMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXhTaXplIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fQ2hhckluZGV4LlNldEF0KGluZGV4U2l6ZSAtIDEsIG1fQ2hhckluZGV4LkdldEF0KGluZGV4U2l6ZSAtIDEpICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZihpbmRleFNpemUgJSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGluZGV4U2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX0NoYXJJbmRleC5TZXRBdChpbmRleFNpemUgLSAxLCBpICsgMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9DaGFySW5kZXguQWRkKGkgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGluZGV4U2l6ZSA9IG1fQ2hhckluZGV4LkdldFNpemUoKTsKLSAgICAgICAgaWYoaW5kZXhTaXplICUgMikgewotICAgICAgICAgICAgbV9DaGFySW5kZXguUmVtb3ZlQXQoaW5kZXhTaXplIC0gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1pbnQJQ1BERl9UZXh0UGFnZTo6Q291bnRDaGFycygpIGNvbnN0Ci17Ci0gICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiBtX1RleHRCdWYuR2V0U2l6ZSgpOwotICAgIH0KLSAgICByZXR1cm4gbV9jaGFyTGlzdC5HZXRTaXplKCk7Ci19Ci1pbnQgQ1BERl9UZXh0UGFnZTo6Q2hhckluZGV4RnJvbVRleHRJbmRleChpbnQgVGV4dEluZGV4KSBjb25zdAotewotICAgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgaW5kZXhTaXplOyBpICs9IDIpIHsKLSAgICAgICAgY291bnQgKz0gbV9DaGFySW5kZXguR2V0QXQoaSArIDEpOwotICAgICAgICBpZihjb3VudCA+IFRleHRJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIAlUZXh0SW5kZXggLSBjb3VudCArIG1fQ2hhckluZGV4LkdldEF0KGkgKyAxKSArIG1fQ2hhckluZGV4LkdldEF0KGkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLWludCBDUERGX1RleHRQYWdlOjpUZXh0SW5kZXhGcm9tQ2hhckluZGV4KGludCBDaGFySW5kZXgpIGNvbnN0Ci17Ci0gICAgaW50IGluZGV4U2l6ZSA9IG1fQ2hhckluZGV4LkdldFNpemUoKTsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpbmRleFNpemU7IGkgKz0gMikgewotICAgICAgICBjb3VudCArPSBtX0NoYXJJbmRleC5HZXRBdChpICsgMSk7Ci0gICAgICAgIGlmKG1fQ2hhckluZGV4LkdldEF0KGkgKyAxKSArIG1fQ2hhckluZGV4LkdldEF0KGkpID4gQ2hhckluZGV4KSB7Ci0gICAgICAgICAgICBpZihDaGFySW5kZXggLSBtX0NoYXJJbmRleC5HZXRBdChpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gCUNoYXJJbmRleCAtIG1fQ2hhckluZGV4LkdldEF0KGkpICsgY291bnQgLSBtX0NoYXJJbmRleC5HZXRBdChpICsgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotdm9pZCBDUERGX1RleHRQYWdlOjpHZXRSZWN0QXJyYXkoaW50IHN0YXJ0LCBpbnQgbkNvdW50LCBDRlhfUmVjdEFycmF5JiByZWN0QXJyYXkpIGNvbnN0Ci17Ci0gICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYoc3RhcnQgPCAwIHx8IG5Db3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFtX0lzUGFyc2VyZWQpCXsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBQQUdFQ0hBUl9JTkZPCQlpbmZvX2N1cmNoYXI7Ci0gICAgQ1BERl9UZXh0T2JqZWN0KglwQ3VyT2JqID0gTlVMTDsKLSAgICBDRlhfRmxvYXRSZWN0CQlyZWN0OwotICAgIGludAkJCQkJY3VyUG9zID0gc3RhcnQ7Ci0gICAgRlhfQk9PTAkJCQlmbGFnTmV3UmVjdCA9IFRSVUU7Ci0gICAgaWYgKG5Db3VudCArIHN0YXJ0ID4gbV9jaGFyTGlzdC5HZXRTaXplKCkgfHwgbkNvdW50ID09IC0xKSB7Ci0gICAgICAgIG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpIC0gc3RhcnQ7Ci0gICAgfQotICAgIHdoaWxlIChuQ291bnQtLSkgewotICAgICAgICBpbmZvX2N1cmNoYXIgPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoY3VyUG9zKyspOwotICAgICAgICBpZiAoaW5mb19jdXJjaGFyLm1fRmxhZyA9PSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaW5mb19jdXJjaGFyLm1fQ2hhckJveC5XaWR0aCgpIDwgMC4wMSB8fCBpbmZvX2N1cmNoYXIubV9DaGFyQm94LkhlaWdodCgpIDwgMC4wMSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIXBDdXJPYmopIHsKLSAgICAgICAgICAgIHBDdXJPYmogPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iajsKLSAgICAgICAgfQotICAgICAgICBpZiAocEN1ck9iaiAhPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iaikgewotICAgICAgICAgICAgcmVjdEFycmF5LkFkZChyZWN0KTsKLSAgICAgICAgICAgIHBDdXJPYmogPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iajsKLSAgICAgICAgICAgIGZsYWdOZXdSZWN0ID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmxhZ05ld1JlY3QpIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIG9yZ1ggPSBpbmZvX2N1cmNoYXIubV9PcmlnaW5YLCBvcmdZID0gaW5mb19jdXJjaGFyLm1fT3JpZ2luWTsKLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4LCBtYXRyaXhfcmV2ZXJzZTsKLSAgICAgICAgICAgIGluZm9fY3VyY2hhci5tX3BUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZtYXRyaXgpOwotICAgICAgICAgICAgbWF0cml4LkNvbmNhdChpbmZvX2N1cmNoYXIubV9NYXRyaXgpOwotICAgICAgICAgICAgbWF0cml4X3JldmVyc2UuU2V0UmV2ZXJzZShtYXRyaXgpOwotICAgICAgICAgICAgbWF0cml4X3JldmVyc2UuVHJhbnNmb3JtKG9yZ1gsIG9yZ1kpOwotICAgICAgICAgICAgcmVjdC5sZWZ0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5sZWZ0OwotICAgICAgICAgICAgcmVjdC5yaWdodCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gucmlnaHQ7Ci0gICAgICAgICAgICBpZiAocEN1ck9iai0+R2V0Rm9udCgpLT5HZXRUeXBlRGVzY2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBvcmdZICsgcEN1ck9iai0+R2V0Rm9udCgpLT5HZXRUeXBlRGVzY2VudCgpICogcEN1ck9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgeFBvc1RlbXAgPSBvcmdYOwotICAgICAgICAgICAgICAgIG1hdHJpeC5UcmFuc2Zvcm0oeFBvc1RlbXAsIHJlY3QuYm90dG9tKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwQ3VyT2JqLT5HZXRGb250KCktPkdldFR5cGVBc2NlbnQoKSkgewotICAgICAgICAgICAgICAgIHJlY3QudG9wID0gb3JnWSArIHBDdXJPYmotPkdldEZvbnQoKS0+R2V0VHlwZUFzY2VudCgpICogcEN1ck9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgeFBvc1RlbXAgPSBvcmdYICsgR2V0Q2hhcldpZHRoKGluZm9fY3VyY2hhci5tX0NoYXJDb2RlLCBwQ3VyT2JqLT5HZXRGb250KCkpICogcEN1ck9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgbWF0cml4LlRyYW5zZm9ybSh4UG9zVGVtcCwgcmVjdC50b3ApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWN0LnRvcCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gudG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxhZ05ld1JlY3QgPSBGQUxTRTsKLSAgICAgICAgICAgIHJlY3QgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94OwotICAgICAgICAgICAgcmVjdC5Ob3JtYWxpemUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluZm9fY3VyY2hhci5tX0NoYXJCb3guTm9ybWFsaXplKCk7Ci0gICAgICAgICAgICBpZiAocmVjdC5sZWZ0ID4gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5sZWZ0KSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5sZWZ0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5sZWZ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlY3QucmlnaHQgPCBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnJpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5yaWdodCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gucmlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIHJlY3QudG9wIDwgaW5mb19jdXJjaGFyLm1fQ2hhckJveC50b3ApIHsKLSAgICAgICAgICAgICAgICByZWN0LnRvcCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gudG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlY3QuYm90dG9tID4gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5ib3R0b20pIHsKLSAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3guYm90dG9tOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJlY3RBcnJheS5BZGQocmVjdCk7Ci0gICAgcmV0dXJuOwotfQotaW50IENQREZfVGV4dFBhZ2U6OkdldEluZGV4QXRQb3MoQ1BERl9Qb2ludCBwb2ludCAsIEZYX0ZMT0FUIHhUb3JlbGFuY2UsIEZYX0ZMT0FUIHlUb3JlbGFuY2UpIGNvbnN0Ci17Ci0gICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiAtMzsKLSAgICB9Ci0gICAgaWYgKCFtX0lzUGFyc2VyZWQpCXsKLSAgICAgICAgcmV0dXJuCS0zOwotICAgIH0KLSAgICBpbnQgcG9zID0gMDsKLSAgICBpbnQgTmVhclBvcyA9IC0xOwotICAgIGRvdWJsZSB4ZGlmID0gNTAwMCwgeWRpZiA9IDUwMDA7Ci0gICAgd2hpbGUocG9zIDwgbV9jaGFyTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopKG1fY2hhckxpc3QuR2V0QXQocG9zKSk7Ci0gICAgICAgIENGWF9GbG9hdFJlY3QgY2hhcnJlY3QgPSBjaGFyaW5mby5tX0NoYXJCb3g7Ci0gICAgICAgIGlmIChjaGFycmVjdC5Db250YWlucyhwb2ludC54LCBwb2ludC55KSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHhUb3JlbGFuY2UgPiAwIHx8IHlUb3JlbGFuY2UgPiAwKSB7Ci0gICAgICAgICAgICBDRlhfRmxvYXRSZWN0IGNoYXJSZWN0RXh0OwotICAgICAgICAgICAgY2hhcnJlY3QuTm9ybWFsaXplKCk7Ci0gICAgICAgICAgICBjaGFyUmVjdEV4dC5sZWZ0ID0gY2hhcnJlY3QubGVmdCAtIHhUb3JlbGFuY2UgLyAyOwotICAgICAgICAgICAgY2hhclJlY3RFeHQucmlnaHQgPSBjaGFycmVjdC5yaWdodCArIHhUb3JlbGFuY2UgLyAyOwotICAgICAgICAgICAgY2hhclJlY3RFeHQudG9wID0gY2hhcnJlY3QudG9wICsgeVRvcmVsYW5jZSAvIDI7Ci0gICAgICAgICAgICBjaGFyUmVjdEV4dC5ib3R0b20gPSBjaGFycmVjdC5ib3R0b20gLSB5VG9yZWxhbmNlIC8gMjsKLSAgICAgICAgICAgIGlmIChjaGFyUmVjdEV4dC5Db250YWlucyhwb2ludC54LCBwb2ludC55KSkgewotICAgICAgICAgICAgICAgIGRvdWJsZSBjdXJYZGlmLCBjdXJZZGlmOwotICAgICAgICAgICAgICAgIGN1clhkaWYgPSBGWFNZU19mYWJzKHBvaW50LnggLSBjaGFycmVjdC5sZWZ0KSA8IEZYU1lTX2ZhYnMocG9pbnQueCAtIGNoYXJyZWN0LnJpZ2h0KSA/IEZYU1lTX2ZhYnMocG9pbnQueCAtIGNoYXJyZWN0LmxlZnQpIDogRlhTWVNfZmFicyhwb2ludC54IC0gY2hhcnJlY3QucmlnaHQpOwotICAgICAgICAgICAgICAgIGN1cllkaWYgPSBGWFNZU19mYWJzKHBvaW50LnkgLSBjaGFycmVjdC5ib3R0b20pIDwgRlhTWVNfZmFicyhwb2ludC55IC0gY2hhcnJlY3QudG9wCSkgPyBGWFNZU19mYWJzKHBvaW50LnkgLSBjaGFycmVjdC5ib3R0b20pIDogRlhTWVNfZmFicyhwb2ludC55IC0gY2hhcnJlY3QudG9wKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VyWWRpZiArIGN1clhkaWYgPCB4ZGlmICsgeWRpZikgewotICAgICAgICAgICAgICAgICAgICB5ZGlmID0gY3VyWWRpZjsKLSAgICAgICAgICAgICAgICAgICAgeGRpZiA9IGN1clhkaWY7Ci0gICAgICAgICAgICAgICAgICAgIE5lYXJQb3MgPSBwb3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICsrcG9zOwotICAgIH0KLSAgICBpZiAocG9zID49IG1fY2hhckxpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHBvcyA9IE5lYXJQb3M7Ci0gICAgfQotICAgIHJldHVybiBwb3M7Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX1RleHRQYWdlOjpHZXRUZXh0QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0Ci17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyVGV4dDsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkgfHwgIW1fSXNQYXJzZXJlZCkgewotICAgICAgICByZXR1cm4gc3RyVGV4dDsKLSAgICB9CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fSXNQYXJzZXJlZCA9IEZBTFNFOworICBtX1RleHRCdWYuQ2xlYXIoKTsKKyAgbV9jaGFyTGlzdC5SZW1vdmVBbGwoKTsKKyAgbV9wUHJlVGV4dE9iaiA9IE5VTEw7CisgIFByb2Nlc3NPYmplY3QoKTsKKyAgbV9Jc1BhcnNlcmVkID0gVFJVRTsKKyAgaWYgKCFtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKKyAgICBtX0NoYXJJbmRleC5SZW1vdmVBbGwoKTsKICAgICBpbnQgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgaW50IHBvcyA9IDA7Ci0gICAgRlhfRkxPQVQgcG9zeSA9IDA7Ci0gICAgRlhfQk9PTCBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7Ci0gICAgRlhfQk9PTAlJU0FkZExpbmVGZWVkID0gRkFMU0U7Ci0gICAgd2hpbGUgKHBvcyA8IG5Db3VudCkgewotICAgICAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHBvcysrKTsKLSAgICAgICAgaWYgKElzUmVjdEludGVyc2VjdChyZWN0LCBjaGFyaW5mby5tX0NoYXJCb3gpKSB7Ci0gICAgICAgICAgICBpZiAoRlhTWVNfZmFicyhwb3N5IC0gY2hhcmluZm8ubV9PcmlnaW5ZKSA+IDAgJiYgIUlzQ29udGFpblByZUNoYXIgJiYgSVNBZGRMaW5lRmVlZCkgewotICAgICAgICAgICAgICAgIHBvc3kgPSBjaGFyaW5mby5tX09yaWdpblk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0clRleHQuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0clRleHQgKz0gTCJcclxuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gVFJVRTsKLSAgICAgICAgICAgIElTQWRkTGluZUZlZWQgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChjaGFyaW5mby5tX1VuaWNvZGUpIHsKLSAgICAgICAgICAgICAgICBzdHJUZXh0ICs9IGNoYXJpbmZvLm1fVW5pY29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjaGFyaW5mby5tX1VuaWNvZGUgPT0gMzIpIHsKLSAgICAgICAgICAgIGlmIChJc0NvbnRhaW5QcmVDaGFyICYmIGNoYXJpbmZvLm1fVW5pY29kZSkgewotICAgICAgICAgICAgICAgIHN0clRleHQgKz0gY2hhcmluZm8ubV9Vbmljb2RlOwotICAgICAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBJU0FkZExpbmVGZWVkID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7Ci0gICAgICAgICAgICBJU0FkZExpbmVGZWVkID0gVFJVRTsKLSAgICAgICAgfQorICAgIGlmIChuQ291bnQpIHsKKyAgICAgIG1fQ2hhckluZGV4LkFkZCgwKTsKICAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgICAgaW50IGluZGV4U2l6ZSA9IG1fQ2hhckluZGV4LkdldFNpemUoKTsKKyAgICAgIEZYX0JPT0wgYk5vcm1hbCA9IEZBTFNFOworICAgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChpKTsKKyAgICAgIGlmIChjaGFyaW5mby5tX0ZsYWcgPT0gRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQpIHsKKyAgICAgICAgYk5vcm1hbCA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKGNoYXJpbmZvLm1fVW5pY29kZSA9PSAwIHx8IElzQ29udHJvbENoYXIoY2hhcmluZm8pKQorICAgICAgICBiTm9ybWFsID0gRkFMU0U7CisgICAgICBlbHNlIHsKKyAgICAgICAgYk5vcm1hbCA9IFRSVUU7CisgICAgICB9CisgICAgICBpZiAoYk5vcm1hbCkgeworICAgICAgICBpZiAoaW5kZXhTaXplICUgMikgeworICAgICAgICAgIG1fQ2hhckluZGV4LkFkZCgxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoaW5kZXhTaXplIDw9IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBtX0NoYXJJbmRleC5TZXRBdChpbmRleFNpemUgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ2hhckluZGV4LkdldEF0KGluZGV4U2l6ZSAtIDEpICsgMSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbmRleFNpemUgJSAyKSB7CisgICAgICAgICAgaWYgKGluZGV4U2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9DaGFySW5kZXguU2V0QXQoaW5kZXhTaXplIC0gMSwgaSArIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fQ2hhckluZGV4LkFkZChpICsgMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaW50IGluZGV4U2l6ZSA9IG1fQ2hhckluZGV4LkdldFNpemUoKTsKKyAgICBpZiAoaW5kZXhTaXplICUgMikgeworICAgICAgbV9DaGFySW5kZXguUmVtb3ZlQXQoaW5kZXhTaXplIC0gMSk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQoraW50IENQREZfVGV4dFBhZ2U6OkNvdW50Q2hhcnMoKSBjb25zdCB7CisgIGlmIChtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKKyAgICByZXR1cm4gbV9UZXh0QnVmLkdldFNpemUoKTsKKyAgfQorICByZXR1cm4gbV9jaGFyTGlzdC5HZXRTaXplKCk7Cit9CitpbnQgQ1BERl9UZXh0UGFnZTo6Q2hhckluZGV4RnJvbVRleHRJbmRleChpbnQgVGV4dEluZGV4KSBjb25zdCB7CisgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7CisgIGludCBjb3VudCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhTaXplOyBpICs9IDIpIHsKKyAgICBjb3VudCArPSBtX0NoYXJJbmRleC5HZXRBdChpICsgMSk7CisgICAgaWYgKGNvdW50ID4gVGV4dEluZGV4KSB7CisgICAgICByZXR1cm4gVGV4dEluZGV4IC0gY291bnQgKyBtX0NoYXJJbmRleC5HZXRBdChpICsgMSkgKworICAgICAgICAgICAgIG1fQ2hhckluZGV4LkdldEF0KGkpOworICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9CitpbnQgQ1BERl9UZXh0UGFnZTo6VGV4dEluZGV4RnJvbUNoYXJJbmRleChpbnQgQ2hhckluZGV4KSBjb25zdCB7CisgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7CisgIGludCBjb3VudCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhTaXplOyBpICs9IDIpIHsKKyAgICBjb3VudCArPSBtX0NoYXJJbmRleC5HZXRBdChpICsgMSk7CisgICAgaWYgKG1fQ2hhckluZGV4LkdldEF0KGkgKyAxKSArIG1fQ2hhckluZGV4LkdldEF0KGkpID4gQ2hhckluZGV4KSB7CisgICAgICBpZiAoQ2hhckluZGV4IC0gbV9DaGFySW5kZXguR2V0QXQoaSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDaGFySW5kZXggLSBtX0NoYXJJbmRleC5HZXRBdChpKSArIGNvdW50IC0KKyAgICAgICAgICAgICBtX0NoYXJJbmRleC5HZXRBdChpICsgMSk7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KK3ZvaWQgQ1BERl9UZXh0UGFnZTo6R2V0UmVjdEFycmF5KGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEFycmF5JiByZWN0QXJyYXkpIGNvbnN0IHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoc3RhcnQgPCAwIHx8IG5Db3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghbV9Jc1BhcnNlcmVkKSB7CisgICAgcmV0dXJuOworICB9CisgIFBBR0VDSEFSX0lORk8gaW5mb19jdXJjaGFyOworICBDUERGX1RleHRPYmplY3QqIHBDdXJPYmogPSBOVUxMOworICBDRlhfRmxvYXRSZWN0IHJlY3Q7CisgIGludCBjdXJQb3MgPSBzdGFydDsKKyAgRlhfQk9PTCBmbGFnTmV3UmVjdCA9IFRSVUU7CisgIGlmIChuQ291bnQgKyBzdGFydCA+IG1fY2hhckxpc3QuR2V0U2l6ZSgpIHx8IG5Db3VudCA9PSAtMSkgeworICAgIG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpIC0gc3RhcnQ7CisgIH0KKyAgd2hpbGUgKG5Db3VudC0tKSB7CisgICAgaW5mb19jdXJjaGFyID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGN1clBvcysrKTsKKyAgICBpZiAoaW5mb19jdXJjaGFyLm1fRmxhZyA9PSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChpbmZvX2N1cmNoYXIubV9DaGFyQm94LldpZHRoKCkgPCAwLjAxIHx8CisgICAgICAgIGluZm9fY3VyY2hhci5tX0NoYXJCb3guSGVpZ2h0KCkgPCAwLjAxKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFwQ3VyT2JqKSB7CisgICAgICBwQ3VyT2JqID0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmo7CisgICAgfQorICAgIGlmIChwQ3VyT2JqICE9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqKSB7CisgICAgICByZWN0QXJyYXkuQWRkKHJlY3QpOworICAgICAgcEN1ck9iaiA9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqOworICAgICAgZmxhZ05ld1JlY3QgPSBUUlVFOworICAgIH0KKyAgICBpZiAoZmxhZ05ld1JlY3QpIHsKKyAgICAgIEZYX0ZMT0FUIG9yZ1ggPSBpbmZvX2N1cmNoYXIubV9PcmlnaW5YLCBvcmdZID0gaW5mb19jdXJjaGFyLm1fT3JpZ2luWTsKKyAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4LCBtYXRyaXhfcmV2ZXJzZTsKKyAgICAgIGluZm9fY3VyY2hhci5tX3BUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZtYXRyaXgpOworICAgICAgbWF0cml4LkNvbmNhdChpbmZvX2N1cmNoYXIubV9NYXRyaXgpOworICAgICAgbWF0cml4X3JldmVyc2UuU2V0UmV2ZXJzZShtYXRyaXgpOworICAgICAgbWF0cml4X3JldmVyc2UuVHJhbnNmb3JtKG9yZ1gsIG9yZ1kpOworICAgICAgcmVjdC5sZWZ0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5sZWZ0OworICAgICAgcmVjdC5yaWdodCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gucmlnaHQ7CisgICAgICBpZiAocEN1ck9iai0+R2V0Rm9udCgpLT5HZXRUeXBlRGVzY2VudCgpKSB7CisgICAgICAgIHJlY3QuYm90dG9tID0gb3JnWSArCisgICAgICAgICAgICAgICAgICAgICAgcEN1ck9iai0+R2V0Rm9udCgpLT5HZXRUeXBlRGVzY2VudCgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1ck9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7CisgICAgICAgIEZYX0ZMT0FUIHhQb3NUZW1wID0gb3JnWDsKKyAgICAgICAgbWF0cml4LlRyYW5zZm9ybSh4UG9zVGVtcCwgcmVjdC5ib3R0b20pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVjdC5ib3R0b20gPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmJvdHRvbTsKKyAgICAgIH0KKyAgICAgIGlmIChwQ3VyT2JqLT5HZXRGb250KCktPkdldFR5cGVBc2NlbnQoKSkgeworICAgICAgICByZWN0LnRvcCA9CisgICAgICAgICAgICBvcmdZICsKKyAgICAgICAgICAgIHBDdXJPYmotPkdldEZvbnQoKS0+R2V0VHlwZUFzY2VudCgpICogcEN1ck9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7CisgICAgICAgIEZYX0ZMT0FUIHhQb3NUZW1wID0KKyAgICAgICAgICAgIG9yZ1ggKworICAgICAgICAgICAgR2V0Q2hhcldpZHRoKGluZm9fY3VyY2hhci5tX0NoYXJDb2RlLCBwQ3VyT2JqLT5HZXRGb250KCkpICoKKyAgICAgICAgICAgICAgICBwQ3VyT2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKKyAgICAgICAgbWF0cml4LlRyYW5zZm9ybSh4UG9zVGVtcCwgcmVjdC50b3ApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVjdC50b3AgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnRvcDsKKyAgICAgIH0KKyAgICAgIGZsYWdOZXdSZWN0ID0gRkFMU0U7CisgICAgICByZWN0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveDsKKyAgICAgIHJlY3QuTm9ybWFsaXplKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZm9fY3VyY2hhci5tX0NoYXJCb3guTm9ybWFsaXplKCk7CisgICAgICBpZiAocmVjdC5sZWZ0ID4gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5sZWZ0KSB7CisgICAgICAgIHJlY3QubGVmdCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gubGVmdDsKKyAgICAgIH0KKyAgICAgIGlmIChyZWN0LnJpZ2h0IDwgaW5mb19jdXJjaGFyLm1fQ2hhckJveC5yaWdodCkgeworICAgICAgICByZWN0LnJpZ2h0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5yaWdodDsKKyAgICAgIH0KKyAgICAgIGlmIChyZWN0LnRvcCA8IGluZm9fY3VyY2hhci5tX0NoYXJCb3gudG9wKSB7CisgICAgICAgIHJlY3QudG9wID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC50b3A7CisgICAgICB9CisgICAgICBpZiAocmVjdC5ib3R0b20gPiBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmJvdHRvbSkgeworICAgICAgICByZWN0LmJvdHRvbSA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3guYm90dG9tOworICAgICAgfQorICAgIH0KKyAgfQorICByZWN0QXJyYXkuQWRkKHJlY3QpOworICByZXR1cm47Cit9CitpbnQgQ1BERl9UZXh0UGFnZTo6R2V0SW5kZXhBdFBvcyhDUERGX1BvaW50IHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeFRvcmVsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHlUb3JlbGFuY2UpIGNvbnN0IHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIHJldHVybiAtMzsKKyAgfQorICBpZiAoIW1fSXNQYXJzZXJlZCkgeworICAgIHJldHVybiAtMzsKKyAgfQorICBpbnQgcG9zID0gMDsKKyAgaW50IE5lYXJQb3MgPSAtMTsKKyAgZG91YmxlIHhkaWYgPSA1MDAwLCB5ZGlmID0gNTAwMDsKKyAgd2hpbGUgKHBvcyA8IG1fY2hhckxpc3QuR2V0U2l6ZSgpKSB7CisgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopKG1fY2hhckxpc3QuR2V0QXQocG9zKSk7CisgICAgQ0ZYX0Zsb2F0UmVjdCBjaGFycmVjdCA9IGNoYXJpbmZvLm1fQ2hhckJveDsKKyAgICBpZiAoY2hhcnJlY3QuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoeFRvcmVsYW5jZSA+IDAgfHwgeVRvcmVsYW5jZSA+IDApIHsKKyAgICAgIENGWF9GbG9hdFJlY3QgY2hhclJlY3RFeHQ7CisgICAgICBjaGFycmVjdC5Ob3JtYWxpemUoKTsKKyAgICAgIGNoYXJSZWN0RXh0LmxlZnQgPSBjaGFycmVjdC5sZWZ0IC0geFRvcmVsYW5jZSAvIDI7CisgICAgICBjaGFyUmVjdEV4dC5yaWdodCA9IGNoYXJyZWN0LnJpZ2h0ICsgeFRvcmVsYW5jZSAvIDI7CisgICAgICBjaGFyUmVjdEV4dC50b3AgPSBjaGFycmVjdC50b3AgKyB5VG9yZWxhbmNlIC8gMjsKKyAgICAgIGNoYXJSZWN0RXh0LmJvdHRvbSA9IGNoYXJyZWN0LmJvdHRvbSAtIHlUb3JlbGFuY2UgLyAyOworICAgICAgaWYgKGNoYXJSZWN0RXh0LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKSB7CisgICAgICAgIGRvdWJsZSBjdXJYZGlmLCBjdXJZZGlmOworICAgICAgICBjdXJYZGlmID0gRlhTWVNfZmFicyhwb2ludC54IC0gY2hhcnJlY3QubGVmdCkgPAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKHBvaW50LnggLSBjaGFycmVjdC5yaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICA/IEZYU1lTX2ZhYnMocG9pbnQueCAtIGNoYXJyZWN0LmxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgOiBGWFNZU19mYWJzKHBvaW50LnggLSBjaGFycmVjdC5yaWdodCk7CisgICAgICAgIGN1cllkaWYgPSBGWFNZU19mYWJzKHBvaW50LnkgLSBjaGFycmVjdC5ib3R0b20pIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyhwb2ludC55IC0gY2hhcnJlY3QudG9wKQorICAgICAgICAgICAgICAgICAgICAgID8gRlhTWVNfZmFicyhwb2ludC55IC0gY2hhcnJlY3QuYm90dG9tKQorICAgICAgICAgICAgICAgICAgICAgIDogRlhTWVNfZmFicyhwb2ludC55IC0gY2hhcnJlY3QudG9wKTsKKyAgICAgICAgaWYgKGN1cllkaWYgKyBjdXJYZGlmIDwgeGRpZiArIHlkaWYpIHsKKyAgICAgICAgICB5ZGlmID0gY3VyWWRpZjsKKyAgICAgICAgICB4ZGlmID0gY3VyWGRpZjsKKyAgICAgICAgICBOZWFyUG9zID0gcG9zOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgICsrcG9zOworICB9CisgIGlmIChwb3MgPj0gbV9jaGFyTGlzdC5HZXRTaXplKCkpIHsKKyAgICBwb3MgPSBOZWFyUG9zOworICB9CisgIHJldHVybiBwb3M7Cit9CitDRlhfV2lkZVN0cmluZyBDUERGX1RleHRQYWdlOjpHZXRUZXh0QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0IHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyVGV4dDsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSB8fCAhbV9Jc1BhcnNlcmVkKSB7CiAgICAgcmV0dXJuIHN0clRleHQ7CisgIH0KKyAgaW50IG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOworICBpbnQgcG9zID0gMDsKKyAgRlhfRkxPQVQgcG9zeSA9IDA7CisgIEZYX0JPT0wgSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOworICBGWF9CT09MIElTQWRkTGluZUZlZWQgPSBGQUxTRTsKKyAgd2hpbGUgKHBvcyA8IG5Db3VudCkgeworICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQocG9zKyspOworICAgIGlmIChJc1JlY3RJbnRlcnNlY3QocmVjdCwgY2hhcmluZm8ubV9DaGFyQm94KSkgeworICAgICAgaWYgKEZYU1lTX2ZhYnMocG9zeSAtIGNoYXJpbmZvLm1fT3JpZ2luWSkgPiAwICYmICFJc0NvbnRhaW5QcmVDaGFyICYmCisgICAgICAgICAgSVNBZGRMaW5lRmVlZCkgeworICAgICAgICBwb3N5ID0gY2hhcmluZm8ubV9PcmlnaW5ZOworICAgICAgICBpZiAoc3RyVGV4dC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzdHJUZXh0ICs9IEwiXHJcbiI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIElzQ29udGFpblByZUNoYXIgPSBUUlVFOworICAgICAgSVNBZGRMaW5lRmVlZCA9IEZBTFNFOworICAgICAgaWYgKGNoYXJpbmZvLm1fVW5pY29kZSkgeworICAgICAgICBzdHJUZXh0ICs9IGNoYXJpbmZvLm1fVW5pY29kZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNoYXJpbmZvLm1fVW5pY29kZSA9PSAzMikgeworICAgICAgaWYgKElzQ29udGFpblByZUNoYXIgJiYgY2hhcmluZm8ubV9Vbmljb2RlKSB7CisgICAgICAgIHN0clRleHQgKz0gY2hhcmluZm8ubV9Vbmljb2RlOworICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7CisgICAgICAgIElTQWRkTGluZUZlZWQgPSBGQUxTRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOworICAgICAgSVNBZGRMaW5lRmVlZCA9IFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBzdHJUZXh0OwogfQotdm9pZCBDUERGX1RleHRQYWdlOjpHZXRSZWN0c0FycmF5QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsIENGWF9SZWN0QXJyYXkmIHJlc1JlY3RBcnJheSkgY29uc3QKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIW1fSXNQYXJzZXJlZCkJewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QJCWN1clJlY3Q7Ci0gICAgRlhfQk9PTAkJCQlmbGFnTmV3UmVjdCA9IFRSVUU7Ci0gICAgQ1BERl9UZXh0T2JqZWN0KglwQ3VyT2JqID0gTlVMTDsKLSAgICBpbnQgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgaW50IHBvcyA9IDA7Ci0gICAgd2hpbGUgKHBvcyA8IG5Db3VudCkgewotICAgICAgICBQQUdFQ0hBUl9JTkZPIGluZm9fY3VyY2hhciA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChwb3MrKyk7Ci0gICAgICAgIGlmIChpbmZvX2N1cmNoYXIubV9GbGFnID09IEZQREZURVhUX0NIQVJfR0VORVJBVEVEKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoSXNSZWN0SW50ZXJzZWN0KHJlY3QsIGluZm9fY3VyY2hhci5tX0NoYXJCb3gpKSB7Ci0gICAgICAgICAgICBpZighcEN1ck9iaikgewotICAgICAgICAgICAgICAgIHBDdXJPYmogPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwQ3VyT2JqICE9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqKSB7Ci0gICAgICAgICAgICAgICAgcmVzUmVjdEFycmF5LkFkZChjdXJSZWN0KTsKLSAgICAgICAgICAgICAgICBwQ3VyT2JqID0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmo7Ci0gICAgICAgICAgICAgICAgZmxhZ05ld1JlY3QgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZsYWdOZXdSZWN0KSB7Ci0gICAgICAgICAgICAgICAgY3VyUmVjdCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3g7Ci0gICAgICAgICAgICAgICAgZmxhZ05ld1JlY3QgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBjdXJSZWN0Lk5vcm1hbGl6ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmZvX2N1cmNoYXIubV9DaGFyQm94Lk5vcm1hbGl6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChjdXJSZWN0LmxlZnQgPiBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmxlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyUmVjdC5sZWZ0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5sZWZ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY3VyUmVjdC5yaWdodCA8IGluZm9fY3VyY2hhci5tX0NoYXJCb3gucmlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyUmVjdC5yaWdodCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gucmlnaHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICggY3VyUmVjdC50b3AgPCBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnRvcCkgewotICAgICAgICAgICAgICAgICAgICBjdXJSZWN0LnRvcCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gudG9wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY3VyUmVjdC5ib3R0b20gPiBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICBjdXJSZWN0LmJvdHRvbSA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3guYm90dG9tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXNSZWN0QXJyYXkuQWRkKGN1clJlY3QpOwordm9pZCBDUERGX1RleHRQYWdlOjpHZXRSZWN0c0FycmF5QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RBcnJheSYgcmVzUmVjdEFycmF5KSBjb25zdCB7CisgIGlmIChtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKICAgICByZXR1cm47Ci19Ci1pbnQJQ1BERl9UZXh0UGFnZTo6R2V0SW5kZXhBdFBvcyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB4VG9yZWxhbmNlLCBGWF9GTE9BVCB5VG9yZWxhbmNlKSBjb25zdAotewotICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICByZXR1cm4gLTM7Ci0gICAgfQotICAgIENQREZfUG9pbnQgcG9pbnQoeCwgeSk7Ci0gICAgcmV0dXJuIEdldEluZGV4QXRQb3MocG9pbnQsIHhUb3JlbGFuY2UsIHlUb3JlbGFuY2UpOwotfQotdm9pZCBDUERGX1RleHRQYWdlOjpHZXRDaGFySW5mbyhpbnQgaW5kZXgsIEZQREZfQ0hBUl9JTkZPICYgaW5mbykgY29uc3QKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIW1fSXNQYXJzZXJlZCkJewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9jaGFyTGlzdC5HZXRTaXplKCkpCXsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvOwotICAgIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGluZGV4KTsKLSAgICBpbmZvLm1fQ2hhcmNvZGUgPSBjaGFyaW5mby5tX0NoYXJDb2RlOwotICAgIGluZm8ubV9PcmlnaW5YID0gY2hhcmluZm8ubV9PcmlnaW5YOwotICAgIGluZm8ubV9PcmlnaW5ZID0gY2hhcmluZm8ubV9PcmlnaW5ZOwotICAgIGluZm8ubV9Vbmljb2RlID0gY2hhcmluZm8ubV9Vbmljb2RlOwotICAgIGluZm8ubV9GbGFnID0gY2hhcmluZm8ubV9GbGFnOwotICAgIGluZm8ubV9DaGFyQm94ID0gY2hhcmluZm8ubV9DaGFyQm94OwotICAgIGluZm8ubV9wVGV4dE9iaiA9IGNoYXJpbmZvLm1fcFRleHRPYmo7Ci0gICAgaWYgKGNoYXJpbmZvLm1fcFRleHRPYmogJiYgY2hhcmluZm8ubV9wVGV4dE9iai0+R2V0Rm9udCgpKSB7Ci0gICAgICAgIGluZm8ubV9Gb250U2l6ZSA9IGNoYXJpbmZvLm1fcFRleHRPYmotPkdldEZvbnRTaXplKCk7Ci0gICAgfQotICAgIGluZm8ubV9NYXRyaXguQ29weShjaGFyaW5mby5tX01hdHJpeCk7CisgIH0KKyAgaWYgKCFtX0lzUGFyc2VyZWQpIHsKICAgICByZXR1cm47Ci19Ci12b2lkIENQREZfVGV4dFBhZ2U6OkNoZWNrTWFya2VkQ29udGVudE9iamVjdChpbnQzMl90JiBzdGFydCwgaW50MzJfdCYgbkNvdW50KSBjb25zdAotewotICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoc3RhcnQpOwotICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8yID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHN0YXJ0ICsgbkNvdW50IC0gMSk7Ci0gICAgaWYgKEZQREZURVhUX0NIQVJfUElFQ0UgIT0gY2hhcmluZm8ubV9GbGFnICYmIEZQREZURVhUX0NIQVJfUElFQ0UgIT0gY2hhcmluZm8yLm1fRmxhZykgewotICAgICAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCBjdXJSZWN0OworICBGWF9CT09MIGZsYWdOZXdSZWN0ID0gVFJVRTsKKyAgQ1BERl9UZXh0T2JqZWN0KiBwQ3VyT2JqID0gTlVMTDsKKyAgaW50IG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOworICBpbnQgcG9zID0gMDsKKyAgd2hpbGUgKHBvcyA8IG5Db3VudCkgeworICAgIFBBR0VDSEFSX0lORk8gaW5mb19jdXJjaGFyID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHBvcysrKTsKKyAgICBpZiAoaW5mb19jdXJjaGFyLm1fRmxhZyA9PSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRCkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChGUERGVEVYVF9DSEFSX1BJRUNFID09IGNoYXJpbmZvLm1fRmxhZykgewotICAgICAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvMSA9IGNoYXJpbmZvOwotICAgICAgICBpbnQgc3RhcnRJbmRleCA9IHN0YXJ0OwotICAgICAgICB3aGlsZShGUERGVEVYVF9DSEFSX1BJRUNFID09IGNoYXJpbmZvMS5tX0ZsYWcgJiYgY2hhcmluZm8xLm1fSW5kZXggPT0gY2hhcmluZm8ubV9JbmRleCkgewotICAgICAgICAgICAgc3RhcnRJbmRleC0tOwotICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPCAwKQl7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGFyaW5mbzEgPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoc3RhcnRJbmRleCk7CisgICAgaWYgKElzUmVjdEludGVyc2VjdChyZWN0LCBpbmZvX2N1cmNoYXIubV9DaGFyQm94KSkgeworICAgICAgaWYgKCFwQ3VyT2JqKSB7CisgICAgICAgIHBDdXJPYmogPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iajsKKyAgICAgIH0KKyAgICAgIGlmIChwQ3VyT2JqICE9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqKSB7CisgICAgICAgIHJlc1JlY3RBcnJheS5BZGQoY3VyUmVjdCk7CisgICAgICAgIHBDdXJPYmogPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iajsKKyAgICAgICAgZmxhZ05ld1JlY3QgPSBUUlVFOworICAgICAgfQorICAgICAgaWYgKGZsYWdOZXdSZWN0KSB7CisgICAgICAgIGN1clJlY3QgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94OworICAgICAgICBmbGFnTmV3UmVjdCA9IEZBTFNFOworICAgICAgICBjdXJSZWN0Lk5vcm1hbGl6ZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mb19jdXJjaGFyLm1fQ2hhckJveC5Ob3JtYWxpemUoKTsKKyAgICAgICAgaWYgKGN1clJlY3QubGVmdCA+IGluZm9fY3VyY2hhci5tX0NoYXJCb3gubGVmdCkgeworICAgICAgICAgIGN1clJlY3QubGVmdCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gubGVmdDsKICAgICAgICAgfQotICAgICAgICBzdGFydEluZGV4Kys7Ci0gICAgICAgIHN0YXJ0ID0gc3RhcnRJbmRleDsKLSAgICB9Ci0gICAgaWYgKEZQREZURVhUX0NIQVJfUElFQ0UgPT0gY2hhcmluZm8yLm1fRmxhZykgewotICAgICAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvMyA9IGNoYXJpbmZvMjsKLSAgICAgICAgaW50IGVuZEluZGV4ID0gc3RhcnQgKyBuQ291bnQgLSAxOwotICAgICAgICB3aGlsZShGUERGVEVYVF9DSEFSX1BJRUNFID09IGNoYXJpbmZvMy5tX0ZsYWcgJiYgY2hhcmluZm8zLm1fSW5kZXggPT0gY2hhcmluZm8yLm1fSW5kZXgpIHsKLSAgICAgICAgICAgIGVuZEluZGV4Kys7Ci0gICAgICAgICAgICBpZiAoZW5kSW5kZXggPj0gbV9jaGFyTGlzdC5HZXRTaXplKCkpCXsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoYXJpbmZvMyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChlbmRJbmRleCk7CisgICAgICAgIGlmIChjdXJSZWN0LnJpZ2h0IDwgaW5mb19jdXJjaGFyLm1fQ2hhckJveC5yaWdodCkgeworICAgICAgICAgIGN1clJlY3QucmlnaHQgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnJpZ2h0OwogICAgICAgICB9Ci0gICAgICAgIGVuZEluZGV4LS07Ci0gICAgICAgIG5Db3VudCA9IGVuZEluZGV4IC0gc3RhcnQgKyAxOwotICAgIH0KLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfVGV4dFBhZ2U6OkdldFBhZ2VUZXh0KGludCBzdGFydCAsIGludCBuQ291bnQpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX0lzUGFyc2VyZWQgfHwgbkNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9Ci0gICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICBzdGFydCA9IDA7Ci0gICAgfQotICAgIGlmCShuQ291bnQgPT0gLTEpIHsKLSAgICAgICAgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCkgLSBzdGFydDsKLSAgICAgICAgcmV0dXJuIG1fVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCkuTWlkKHN0YXJ0LCBtX1RleHRCdWYuR2V0V2lkZVN0cmluZygpLkdldExlbmd0aCgpKTsKLSAgICB9Ci0gICAgaWYobkNvdW50IDw9IDAgfHwgbV9jaGFyTGlzdC5HZXRTaXplKCkgPD0gMCkgewotICAgICAgICByZXR1cm4gTCIiOwotICAgIH0KLSAgICBpZihuQ291bnQgKyBzdGFydCA+IG1fY2hhckxpc3QuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKSAtIHN0YXJ0OwotICAgIH0KLSAgICBpZiAobkNvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9Ci0gICAgQ2hlY2tNYXJrZWRDb250ZW50T2JqZWN0KHN0YXJ0LCBuQ291bnQpOwotICAgIGludCBzdGFydGluZGV4ID0gMDsKLSAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHN0YXJ0KTsKLSAgICBpbnQgc3RhcnRPZmZzZXQgPSAwOwotICAgIHdoaWxlKGNoYXJpbmZvLm1fSW5kZXggPT0gLTEpIHsKLSAgICAgICAgc3RhcnRPZmZzZXQrKzsKLSAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gbkNvdW50IHx8IHN0YXJ0ICsgc3RhcnRPZmZzZXQgPj0gbV9jaGFyTGlzdC5HZXRTaXplKCkpCXsKLSAgICAgICAgICAgIHJldHVybiBMIiI7CisgICAgICAgIGlmIChjdXJSZWN0LnRvcCA8IGluZm9fY3VyY2hhci5tX0NoYXJCb3gudG9wKSB7CisgICAgICAgICAgY3VyUmVjdC50b3AgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnRvcDsKICAgICAgICAgfQotICAgICAgICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCArIHN0YXJ0T2Zmc2V0KTsKLSAgICB9Ci0gICAgc3RhcnRpbmRleCA9IGNoYXJpbmZvLm1fSW5kZXg7Ci0gICAgY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoc3RhcnQgKyBuQ291bnQgLSAxKTsKLSAgICBpbnQgbkNvdW50T2Zmc2V0ID0gMDsKLSAgICB3aGlsZSAoY2hhcmluZm8ubV9JbmRleCA9PSAtMSkgewotICAgICAgICBuQ291bnRPZmZzZXQrKzsKLSAgICAgICAgaWYgKG5Db3VudE9mZnNldCA+PSBuQ291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiBMIiI7CisgICAgICAgIGlmIChjdXJSZWN0LmJvdHRvbSA+IGluZm9fY3VyY2hhci5tX0NoYXJCb3guYm90dG9tKSB7CisgICAgICAgICAgY3VyUmVjdC5ib3R0b20gPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmJvdHRvbTsKICAgICAgICAgfQotICAgICAgICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCArIG5Db3VudCAtIG5Db3VudE9mZnNldCAtIDEpOworICAgICAgfQogICAgIH0KLSAgICBuQ291bnQgPSBzdGFydCArIG5Db3VudCAtIG5Db3VudE9mZnNldCAtIHN0YXJ0aW5kZXg7Ci0gICAgaWYobkNvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9Ci0gICAgcmV0dXJuIG1fVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCkuTWlkKHN0YXJ0aW5kZXgsIG5Db3VudCk7CisgIH0KKyAgcmVzUmVjdEFycmF5LkFkZChjdXJSZWN0KTsKKyAgcmV0dXJuOwogfQotaW50IENQREZfVGV4dFBhZ2U6OkNvdW50UmVjdHMoaW50IHN0YXJ0LCBpbnQgbkNvdW50KQotewotICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICghbV9Jc1BhcnNlcmVkKQl7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChuQ291bnQgPT0gLTEgfHwgbkNvdW50ICsgc3RhcnQgPiBtX2NoYXJMaXN0LkdldFNpemUoKSApIHsKLSAgICAgICAgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCkgLSBzdGFydDsKLSAgICB9Ci0gICAgbV9TZWxSZWN0cy5SZW1vdmVBbGwoKTsKLSAgICBHZXRSZWN0QXJyYXkoc3RhcnQsIG5Db3VudCwgbV9TZWxSZWN0cyk7Ci0gICAgcmV0dXJuIG1fU2VsUmVjdHMuR2V0U2l6ZSgpOworaW50IENQREZfVGV4dFBhZ2U6OkdldEluZGV4QXRQb3MoRlhfRkxPQVQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4VG9yZWxhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeVRvcmVsYW5jZSkgY29uc3QgeworICBpZiAobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7CisgICAgcmV0dXJuIC0zOworICB9CisgIENQREZfUG9pbnQgcG9pbnQoeCwgeSk7CisgIHJldHVybiBHZXRJbmRleEF0UG9zKHBvaW50LCB4VG9yZWxhbmNlLCB5VG9yZWxhbmNlKTsKIH0KLXZvaWQgQ1BERl9UZXh0UGFnZTo6R2V0UmVjdChpbnQgcmVjdEluZGV4LCBGWF9GTE9BVCYgbGVmdCwgRlhfRkxPQVQmIHRvcCwgRlhfRkxPQVQmIHJpZ2h0LCBGWF9GTE9BVCAmYm90dG9tKSBjb25zdAotewotICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICByZXR1cm4gOwotICAgIH0KLSAgICBpZiAoIW1fSXNQYXJzZXJlZCB8fCByZWN0SW5kZXggPCAwIHx8IHJlY3RJbmRleCA+PSBtX1NlbFJlY3RzLkdldFNpemUoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxlZnQgPSBtX1NlbFJlY3RzLkdldEF0KHJlY3RJbmRleCkubGVmdDsKLSAgICB0b3AgPSBtX1NlbFJlY3RzLkdldEF0KHJlY3RJbmRleCkudG9wOwotICAgIHJpZ2h0ID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpLnJpZ2h0OwotICAgIGJvdHRvbSA9IG1fU2VsUmVjdHMuR2V0QXQocmVjdEluZGV4KS5ib3R0b207Cit2b2lkIENQREZfVGV4dFBhZ2U6OkdldENoYXJJbmZvKGludCBpbmRleCwgRlBERl9DSEFSX0lORk8mIGluZm8pIGNvbnN0IHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIW1fSXNQYXJzZXJlZCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fY2hhckxpc3QuR2V0U2l6ZSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIFBBR0VDSEFSX0lORk8gY2hhcmluZm87CisgIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGluZGV4KTsKKyAgaW5mby5tX0NoYXJjb2RlID0gY2hhcmluZm8ubV9DaGFyQ29kZTsKKyAgaW5mby5tX09yaWdpblggPSBjaGFyaW5mby5tX09yaWdpblg7CisgIGluZm8ubV9PcmlnaW5ZID0gY2hhcmluZm8ubV9PcmlnaW5ZOworICBpbmZvLm1fVW5pY29kZSA9IGNoYXJpbmZvLm1fVW5pY29kZTsKKyAgaW5mby5tX0ZsYWcgPSBjaGFyaW5mby5tX0ZsYWc7CisgIGluZm8ubV9DaGFyQm94ID0gY2hhcmluZm8ubV9DaGFyQm94OworICBpbmZvLm1fcFRleHRPYmogPSBjaGFyaW5mby5tX3BUZXh0T2JqOworICBpZiAoY2hhcmluZm8ubV9wVGV4dE9iaiAmJiBjaGFyaW5mby5tX3BUZXh0T2JqLT5HZXRGb250KCkpIHsKKyAgICBpbmZvLm1fRm9udFNpemUgPSBjaGFyaW5mby5tX3BUZXh0T2JqLT5HZXRGb250U2l6ZSgpOworICB9CisgIGluZm8ubV9NYXRyaXguQ29weShjaGFyaW5mby5tX01hdHJpeCk7CisgIHJldHVybjsKIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQmIFJvdGF0ZSkKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwordm9pZCBDUERGX1RleHRQYWdlOjpDaGVja01hcmtlZENvbnRlbnRPYmplY3QoaW50MzJfdCYgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ291bnQpIGNvbnN0IHsKKyAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCk7CisgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8yID0KKyAgICAgICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCArIG5Db3VudCAtIDEpOworICBpZiAoRlBERlRFWFRfQ0hBUl9QSUVDRSAhPSBjaGFyaW5mby5tX0ZsYWcgJiYKKyAgICAgIEZQREZURVhUX0NIQVJfUElFQ0UgIT0gY2hhcmluZm8yLm1fRmxhZykgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoRlBERlRFWFRfQ0hBUl9QSUVDRSA9PSBjaGFyaW5mby5tX0ZsYWcpIHsKKyAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvMSA9IGNoYXJpbmZvOworICAgIGludCBzdGFydEluZGV4ID0gc3RhcnQ7CisgICAgd2hpbGUgKEZQREZURVhUX0NIQVJfUElFQ0UgPT0gY2hhcmluZm8xLm1fRmxhZyAmJgorICAgICAgICAgICBjaGFyaW5mbzEubV9JbmRleCA9PSBjaGFyaW5mby5tX0luZGV4KSB7CisgICAgICBzdGFydEluZGV4LS07CisgICAgICBpZiAoc3RhcnRJbmRleCA8IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjaGFyaW5mbzEgPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoc3RhcnRJbmRleCk7CiAgICAgfQotICAgIGlmKGVuZCA9PSBzdGFydCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgc3RhcnRJbmRleCsrOworICAgIHN0YXJ0ID0gc3RhcnRJbmRleDsKKyAgfQorICBpZiAoRlBERlRFWFRfQ0hBUl9QSUVDRSA9PSBjaGFyaW5mbzIubV9GbGFnKSB7CisgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbzMgPSBjaGFyaW5mbzI7CisgICAgaW50IGVuZEluZGV4ID0gc3RhcnQgKyBuQ291bnQgLSAxOworICAgIHdoaWxlIChGUERGVEVYVF9DSEFSX1BJRUNFID09IGNoYXJpbmZvMy5tX0ZsYWcgJiYKKyAgICAgICAgICAgY2hhcmluZm8zLm1fSW5kZXggPT0gY2hhcmluZm8yLm1fSW5kZXgpIHsKKyAgICAgIGVuZEluZGV4Kys7CisgICAgICBpZiAoZW5kSW5kZXggPj0gbV9jaGFyTGlzdC5HZXRTaXplKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjaGFyaW5mbzMgPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoZW5kSW5kZXgpOwogICAgIH0KLSAgICBGWF9GTE9BVCBkeCwgZHk7Ci0gICAgRlBERl9DSEFSX0lORk8gaW5mbzEsIGluZm8yOwotICAgIEdldENoYXJJbmZvKHN0YXJ0LCBpbmZvMSk7CisgICAgZW5kSW5kZXgtLTsKKyAgICBuQ291bnQgPSBlbmRJbmRleCAtIHN0YXJ0ICsgMTsKKyAgfQorfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9UZXh0UGFnZTo6R2V0UGFnZVRleHQoaW50IHN0YXJ0LCBpbnQgbkNvdW50KSBjb25zdCB7CisgIGlmICghbV9Jc1BhcnNlcmVkIHx8IG5Db3VudCA9PSAwKSB7CisgICAgcmV0dXJuIEwiIjsKKyAgfQorICBpZiAoc3RhcnQgPCAwKSB7CisgICAgc3RhcnQgPSAwOworICB9CisgIGlmIChuQ291bnQgPT0gLTEpIHsKKyAgICBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKSAtIHN0YXJ0OworICAgIHJldHVybiBtX1RleHRCdWYuR2V0V2lkZVN0cmluZygpLk1pZChzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0QnVmLkdldFdpZGVTdHJpbmcoKS5HZXRMZW5ndGgoKSk7CisgIH0KKyAgaWYgKG5Db3VudCA8PSAwIHx8IG1fY2hhckxpc3QuR2V0U2l6ZSgpIDw9IDApIHsKKyAgICByZXR1cm4gTCIiOworICB9CisgIGlmIChuQ291bnQgKyBzdGFydCA+IG1fY2hhckxpc3QuR2V0U2l6ZSgpIC0gMSkgeworICAgIG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpIC0gc3RhcnQ7CisgIH0KKyAgaWYgKG5Db3VudCA8PSAwKSB7CisgICAgcmV0dXJuIEwiIjsKKyAgfQorICBDaGVja01hcmtlZENvbnRlbnRPYmplY3Qoc3RhcnQsIG5Db3VudCk7CisgIGludCBzdGFydGluZGV4ID0gMDsKKyAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCk7CisgIGludCBzdGFydE9mZnNldCA9IDA7CisgIHdoaWxlIChjaGFyaW5mby5tX0luZGV4ID09IC0xKSB7CisgICAgc3RhcnRPZmZzZXQrKzsKKyAgICBpZiAoc3RhcnRPZmZzZXQgPiBuQ291bnQgfHwgc3RhcnQgKyBzdGFydE9mZnNldCA+PSBtX2NoYXJMaXN0LkdldFNpemUoKSkgeworICAgICAgcmV0dXJuIEwiIjsKKyAgICB9CisgICAgY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoc3RhcnQgKyBzdGFydE9mZnNldCk7CisgIH0KKyAgc3RhcnRpbmRleCA9IGNoYXJpbmZvLm1fSW5kZXg7CisgIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHN0YXJ0ICsgbkNvdW50IC0gMSk7CisgIGludCBuQ291bnRPZmZzZXQgPSAwOworICB3aGlsZSAoY2hhcmluZm8ubV9JbmRleCA9PSAtMSkgeworICAgIG5Db3VudE9mZnNldCsrOworICAgIGlmIChuQ291bnRPZmZzZXQgPj0gbkNvdW50KSB7CisgICAgICByZXR1cm4gTCIiOworICAgIH0KKyAgICBjaGFyaW5mbyA9CisgICAgICAgICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCArIG5Db3VudCAtIG5Db3VudE9mZnNldCAtIDEpOworICB9CisgIG5Db3VudCA9IHN0YXJ0ICsgbkNvdW50IC0gbkNvdW50T2Zmc2V0IC0gc3RhcnRpbmRleDsKKyAgaWYgKG5Db3VudCA8PSAwKSB7CisgICAgcmV0dXJuIEwiIjsKKyAgfQorICByZXR1cm4gbV9UZXh0QnVmLkdldFdpZGVTdHJpbmcoKS5NaWQoc3RhcnRpbmRleCwgbkNvdW50KTsKK30KK2ludCBDUERGX1RleHRQYWdlOjpDb3VudFJlY3RzKGludCBzdGFydCwgaW50IG5Db3VudCkgeworICBpZiAobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICghbV9Jc1BhcnNlcmVkKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChzdGFydCA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKG5Db3VudCA9PSAtMSB8fCBuQ291bnQgKyBzdGFydCA+IG1fY2hhckxpc3QuR2V0U2l6ZSgpKSB7CisgICAgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCkgLSBzdGFydDsKKyAgfQorICBtX1NlbFJlY3RzLlJlbW92ZUFsbCgpOworICBHZXRSZWN0QXJyYXkoc3RhcnQsIG5Db3VudCwgbV9TZWxSZWN0cyk7CisgIHJldHVybiBtX1NlbFJlY3RzLkdldFNpemUoKTsKK30KK3ZvaWQgQ1BERl9UZXh0UGFnZTo6R2V0UmVjdChpbnQgcmVjdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBib3R0b20pIGNvbnN0IHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIW1fSXNQYXJzZXJlZCB8fCByZWN0SW5kZXggPCAwIHx8IHJlY3RJbmRleCA+PSBtX1NlbFJlY3RzLkdldFNpemUoKSkgeworICAgIHJldHVybjsKKyAgfQorICBsZWZ0ID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpLmxlZnQ7CisgIHRvcCA9IG1fU2VsUmVjdHMuR2V0QXQocmVjdEluZGV4KS50b3A7CisgIHJpZ2h0ID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpLnJpZ2h0OworICBib3R0b20gPSBtX1NlbFJlY3RzLkdldEF0KHJlY3RJbmRleCkuYm90dG9tOworfQorRlhfQk9PTCBDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShpbnQgc3RhcnQsIGludCBlbmQsIGludCYgUm90YXRlKSB7CisgIGlmIChtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKGVuZCA9PSBzdGFydCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9GTE9BVCBkeCwgZHk7CisgIEZQREZfQ0hBUl9JTkZPIGluZm8xLCBpbmZvMjsKKyAgR2V0Q2hhckluZm8oc3RhcnQsIGluZm8xKTsKKyAgR2V0Q2hhckluZm8oZW5kLCBpbmZvMik7CisgIHdoaWxlIChpbmZvMi5tX0NoYXJCb3guV2lkdGgoKSA9PSAwIHx8IGluZm8yLm1fQ2hhckJveC5IZWlnaHQoKSA9PSAwKSB7CisgICAgZW5kLS07CisgICAgaWYgKGVuZCA8PSBzdGFydCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KICAgICBHZXRDaGFySW5mbyhlbmQsIGluZm8yKTsKLSAgICB3aGlsZShpbmZvMi5tX0NoYXJCb3guV2lkdGgoKSA9PSAwIHx8IGluZm8yLm1fQ2hhckJveC5IZWlnaHQoKSA9PSAwKSB7Ci0gICAgICAgIGVuZC0tOwotICAgICAgICBpZihlbmQgPD0gc3RhcnQpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBHZXRDaGFySW5mbyhlbmQsIGluZm8yKTsKLSAgICB9Ci0gICAgZHggPSAoaW5mbzIubV9PcmlnaW5YIC0gaW5mbzEubV9PcmlnaW5YKTsKLSAgICBkeSA9IChpbmZvMi5tX09yaWdpblkgLSBpbmZvMS5tX09yaWdpblkpOwotICAgIGlmKGR4ID09IDApIHsKLSAgICAgICAgaWYoZHkgPiAwKSB7Ci0gICAgICAgICAgICBSb3RhdGUgPSA5MDsKLSAgICAgICAgfSBlbHNlIGlmIChkeSA8IDApIHsKLSAgICAgICAgICAgIFJvdGF0ZSA9IDI3MDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFJvdGF0ZSA9IDA7Ci0gICAgICAgIH0KKyAgfQorICBkeCA9IChpbmZvMi5tX09yaWdpblggLSBpbmZvMS5tX09yaWdpblgpOworICBkeSA9IChpbmZvMi5tX09yaWdpblkgLSBpbmZvMS5tX09yaWdpblkpOworICBpZiAoZHggPT0gMCkgeworICAgIGlmIChkeSA+IDApIHsKKyAgICAgIFJvdGF0ZSA9IDkwOworICAgIH0gZWxzZSBpZiAoZHkgPCAwKSB7CisgICAgICBSb3RhdGUgPSAyNzA7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZmxvYXQgYSA9IEZYU1lTX2F0YW4yKGR5LCBkeCk7Ci0gICAgICAgIFJvdGF0ZSA9IChpbnQpKGEgKiAxODAgLyBGWF9QSSArIDAuNSk7CisgICAgICBSb3RhdGUgPSAwOwogICAgIH0KLSAgICBpZihSb3RhdGUgPCAwKSB7Ci0gICAgICAgIFJvdGF0ZSA9IC1Sb3RhdGU7Ci0gICAgfSBlbHNlIGlmKFJvdGF0ZSA+IDApIHsKLSAgICAgICAgUm90YXRlID0gMzYwIC0gUm90YXRlOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBmbG9hdCBhID0gRlhTWVNfYXRhbjIoZHksIGR4KTsKKyAgICBSb3RhdGUgPSAoaW50KShhICogMTgwIC8gRlhfUEkgKyAwLjUpOworICB9CisgIGlmIChSb3RhdGUgPCAwKSB7CisgICAgUm90YXRlID0gLVJvdGF0ZTsKKyAgfSBlbHNlIGlmIChSb3RhdGUgPiAwKSB7CisgICAgUm90YXRlID0gMzYwIC0gUm90YXRlOworICB9CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTAlDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0ICwgaW50JiBSb3RhdGUpCi17Ci0gICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50IHN0YXJ0LCBlbmQsIGNvdW50LCBuID0gQ291bnRCb3VuZGVkU2VnbWVudHMocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIFRSVUUpOwotICAgIGlmKG4gPCAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYobiA+IDEpIHsKLSAgICAgICAgR2V0Qm91bmRlZFNlZ21lbnQobiAtIDEsIHN0YXJ0LCBjb3VudCk7Ci0gICAgICAgIGVuZCA9IHN0YXJ0ICsgY291bnQgLSAxOwotICAgICAgICBHZXRCb3VuZGVkU2VnbWVudCgwLCBzdGFydCwgY291bnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEdldEJvdW5kZWRTZWdtZW50KDAsIHN0YXJ0LCBjb3VudCk7Ci0gICAgICAgIGVuZCA9IHN0YXJ0ICsgY291bnQgLSAxOwotICAgIH0KLSAgICByZXR1cm4gR2V0QmFzZWxpbmVSb3RhdGUoc3RhcnQsIGVuZCwgUm90YXRlKTsKK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBSb3RhdGUpIHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgc3RhcnQsIGVuZCwgY291bnQsCisgICAgICBuID0gQ291bnRCb3VuZGVkU2VnbWVudHMocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisgIGlmIChuIDwgMSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobiA+IDEpIHsKKyAgICBHZXRCb3VuZGVkU2VnbWVudChuIC0gMSwgc3RhcnQsIGNvdW50KTsKKyAgICBlbmQgPSBzdGFydCArIGNvdW50IC0gMTsKKyAgICBHZXRCb3VuZGVkU2VnbWVudCgwLCBzdGFydCwgY291bnQpOworICB9IGVsc2UgeworICAgIEdldEJvdW5kZWRTZWdtZW50KDAsIHN0YXJ0LCBjb3VudCk7CisgICAgZW5kID0gc3RhcnQgKyBjb3VudCAtIDE7CisgIH0KKyAgcmV0dXJuIEdldEJhc2VsaW5lUm90YXRlKHN0YXJ0LCBlbmQsIFJvdGF0ZSk7CiB9Ci1GWF9CT09MCUNQREZfVGV4dFBhZ2U6OkdldEJhc2VsaW5lUm90YXRlKGludCByZWN0SW5kZXgsIGludCYgUm90YXRlKQotewotICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICghbV9Jc1BhcnNlcmVkIHx8IHJlY3RJbmRleCA8IDAgfHwgcmVjdEluZGV4ID4gbV9TZWxSZWN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBtX1NlbFJlY3RzLkdldEF0KHJlY3RJbmRleCk7Ci0gICAgcmV0dXJuIEdldEJhc2VsaW5lUm90YXRlKHJlY3QgLCBSb3RhdGUpOworRlhfQk9PTCBDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSkgeworICBpZiAobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghbV9Jc1BhcnNlcmVkIHx8IHJlY3RJbmRleCA8IDAgfHwgcmVjdEluZGV4ID4gbV9TZWxSZWN0cy5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpOworICByZXR1cm4gR2V0QmFzZWxpbmVSb3RhdGUocmVjdCwgUm90YXRlKTsKIH0KLWludAlDUERGX1RleHRQYWdlOjpDb3VudEJvdW5kZWRTZWdtZW50cyhGWF9GTE9BVCBsZWZ0LCBGWF9GTE9BVCB0b3AsIEZYX0ZMT0FUIHJpZ2h0LCBGWF9GTE9BVCBib3R0b20sIEZYX0JPT0wgYkNvbnRhaW5zICkKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtX1NlZ21lbnQuUmVtb3ZlQWxsKCk7Ci0gICAgaWYgKCFtX0lzUGFyc2VyZWQpCXsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKLSAgICByZWN0Lk5vcm1hbGl6ZSgpOwotICAgIGludCBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKLSAgICBpbnQgcG9zID0gMDsKLSAgICBGUERGX1NFR01FTlQJc2VnbWVudDsKLSAgICBzZWdtZW50Lm1fU3RhcnQgPSAwOwotICAgIHNlZ21lbnQubV9uQ291bnQgPSAwOwotICAgIGludCAgCQlzZWdtZW50U3RhdHVzID0gMDsKLSAgICBGWF9CT09MCQlJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7Ci0gICAgd2hpbGUgKHBvcyA8IG5Db3VudCkgewotICAgICAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHBvcyk7Ci0gICAgICAgIGlmKGJDb250YWlucyAmJiByZWN0LkNvbnRhaW5zKGNoYXJpbmZvLm1fQ2hhckJveCkpIHsKLSAgICAgICAgICAgIGlmIChzZWdtZW50U3RhdHVzID09IDAgfHwgc2VnbWVudFN0YXR1cyA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgc2VnbWVudC5tX1N0YXJ0ID0gcG9zOwotICAgICAgICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAxOwotICAgICAgICAgICAgICAgIHNlZ21lbnRTdGF0dXMgPSAxOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKLSAgICAgICAgICAgICAgICBzZWdtZW50Lm1fbkNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIGlmICghYkNvbnRhaW5zICYmIChJc1JlY3RJbnRlcnNlY3QocmVjdCwgY2hhcmluZm8ubV9DaGFyQm94KSB8fCByZWN0LkNvbnRhaW5zKGNoYXJpbmZvLm1fT3JpZ2luWCwgY2hhcmluZm8ubV9PcmlnaW5ZKSkpIHsKLSAgICAgICAgICAgIGlmIChzZWdtZW50U3RhdHVzID09IDAgfHwgc2VnbWVudFN0YXR1cyA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgc2VnbWVudC5tX1N0YXJ0ID0gcG9zOwotICAgICAgICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAxOwotICAgICAgICAgICAgICAgIHNlZ21lbnRTdGF0dXMgPSAxOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKLSAgICAgICAgICAgICAgICBzZWdtZW50Lm1fbkNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIGlmIChjaGFyaW5mby5tX1VuaWNvZGUgPT0gMzIpIHsKLSAgICAgICAgICAgIGlmIChJc0NvbnRhaW5QcmVDaGFyID09IFRSVUUpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAwIHx8IHNlZ21lbnRTdGF0dXMgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSBwb3M7Ci0gICAgICAgICAgICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAxOwotICAgICAgICAgICAgICAgICAgICBzZWdtZW50U3RhdHVzID0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fbkNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBzZWdtZW50U3RhdHVzID0gMjsKLSAgICAgICAgICAgICAgICAgICAgbV9TZWdtZW50LkFkZChzZWdtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5tX1N0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5tX25Db3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMSkgewotICAgICAgICAgICAgICAgIHNlZ21lbnRTdGF0dXMgPSAyOwotICAgICAgICAgICAgICAgIG1fU2VnbWVudC5BZGQoc2VnbWVudCk7Ci0gICAgICAgICAgICAgICAgc2VnbWVudC5tX1N0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgICBzZWdtZW50Lm1fbkNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKK2ludCBDUERGX1RleHRQYWdlOjpDb3VudEJvdW5kZWRTZWdtZW50cyhGWF9GTE9BVCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29udGFpbnMpIHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBtX1NlZ21lbnQuUmVtb3ZlQWxsKCk7CisgIGlmICghbV9Jc1BhcnNlcmVkKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIENGWF9GbG9hdFJlY3QgcmVjdChsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOworICByZWN0Lk5vcm1hbGl6ZSgpOworICBpbnQgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7CisgIGludCBwb3MgPSAwOworICBGUERGX1NFR01FTlQgc2VnbWVudDsKKyAgc2VnbWVudC5tX1N0YXJ0ID0gMDsKKyAgc2VnbWVudC5tX25Db3VudCA9IDA7CisgIGludCBzZWdtZW50U3RhdHVzID0gMDsKKyAgRlhfQk9PTCBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7CisgIHdoaWxlIChwb3MgPCBuQ291bnQpIHsKKyAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHBvcyk7CisgICAgaWYgKGJDb250YWlucyAmJiByZWN0LkNvbnRhaW5zKGNoYXJpbmZvLm1fQ2hhckJveCkpIHsKKyAgICAgIGlmIChzZWdtZW50U3RhdHVzID09IDAgfHwgc2VnbWVudFN0YXR1cyA9PSAyKSB7CisgICAgICAgIHNlZ21lbnQubV9TdGFydCA9IHBvczsKKyAgICAgICAgc2VnbWVudC5tX25Db3VudCA9IDE7CisgICAgICAgIHNlZ21lbnRTdGF0dXMgPSAxOworICAgICAgfSBlbHNlIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKKyAgICAgICAgc2VnbWVudC5tX25Db3VudCsrOworICAgICAgfQorICAgICAgSXNDb250YWluUHJlQ2hhciA9IFRSVUU7CisgICAgfSBlbHNlIGlmICghYkNvbnRhaW5zICYmCisgICAgICAgICAgICAgICAoSXNSZWN0SW50ZXJzZWN0KHJlY3QsIGNoYXJpbmZvLm1fQ2hhckJveCkgfHwKKyAgICAgICAgICAgICAgICByZWN0LkNvbnRhaW5zKGNoYXJpbmZvLm1fT3JpZ2luWCwgY2hhcmluZm8ubV9PcmlnaW5ZKSkpIHsKKyAgICAgIGlmIChzZWdtZW50U3RhdHVzID09IDAgfHwgc2VnbWVudFN0YXR1cyA9PSAyKSB7CisgICAgICAgIHNlZ21lbnQubV9TdGFydCA9IHBvczsKKyAgICAgICAgc2VnbWVudC5tX25Db3VudCA9IDE7CisgICAgICAgIHNlZ21lbnRTdGF0dXMgPSAxOworICAgICAgfSBlbHNlIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKKyAgICAgICAgc2VnbWVudC5tX25Db3VudCsrOworICAgICAgfQorICAgICAgSXNDb250YWluUHJlQ2hhciA9IFRSVUU7CisgICAgfSBlbHNlIGlmIChjaGFyaW5mby5tX1VuaWNvZGUgPT0gMzIpIHsKKyAgICAgIGlmIChJc0NvbnRhaW5QcmVDaGFyID09IFRSVUUpIHsKKyAgICAgICAgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMCB8fCBzZWdtZW50U3RhdHVzID09IDIpIHsKKyAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSBwb3M7CisgICAgICAgICAgc2VnbWVudC5tX25Db3VudCA9IDE7CisgICAgICAgICAgc2VnbWVudFN0YXR1cyA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7CisgICAgICAgICAgc2VnbWVudC5tX25Db3VudCsrOwogICAgICAgICB9Ci0gICAgICAgIHBvcysrOwotICAgIH0KLSAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7CisgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKKyAgICAgICAgICBzZWdtZW50U3RhdHVzID0gMjsKKyAgICAgICAgICBtX1NlZ21lbnQuQWRkKHNlZ21lbnQpOworICAgICAgICAgIHNlZ21lbnQubV9TdGFydCA9IDA7CisgICAgICAgICAgc2VnbWVudC5tX25Db3VudCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMSkgewogICAgICAgICBzZWdtZW50U3RhdHVzID0gMjsKICAgICAgICAgbV9TZWdtZW50LkFkZChzZWdtZW50KTsKICAgICAgICAgc2VnbWVudC5tX1N0YXJ0ID0gMDsKICAgICAgICAgc2VnbWVudC5tX25Db3VudCA9IDA7CisgICAgICB9CisgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiBtX1NlZ21lbnQuR2V0U2l6ZSgpOworICAgIHBvcysrOworICB9CisgIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKKyAgICBzZWdtZW50U3RhdHVzID0gMjsKKyAgICBtX1NlZ21lbnQuQWRkKHNlZ21lbnQpOworICAgIHNlZ21lbnQubV9TdGFydCA9IDA7CisgICAgc2VnbWVudC5tX25Db3VudCA9IDA7CisgIH0KKyAgcmV0dXJuIG1fU2VnbWVudC5HZXRTaXplKCk7CiB9Ci12b2lkIENQREZfVGV4dFBhZ2U6OkdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3QKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX1NlZ21lbnQuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RhcnQgPSBtX1NlZ21lbnQuR2V0QXQoaW5kZXgpLm1fU3RhcnQ7Ci0gICAgY291bnQgPSBtX1NlZ21lbnQuR2V0QXQoaW5kZXgpLm1fbkNvdW50Owordm9pZCBDUERGX1RleHRQYWdlOjpHZXRCb3VuZGVkU2VnbWVudChpbnQgaW5kZXgsIGludCYgc3RhcnQsIGludCYgY291bnQpIGNvbnN0IHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fU2VnbWVudC5HZXRTaXplKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc3RhcnQgPSBtX1NlZ21lbnQuR2V0QXQoaW5kZXgpLm1fU3RhcnQ7CisgIGNvdW50ID0gbV9TZWdtZW50LkdldEF0KGluZGV4KS5tX25Db3VudDsKIH0KLWludCBDUERGX1RleHRQYWdlOjpHZXRXb3JkQnJlYWsoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdAotewotICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICghbV9Jc1BhcnNlcmVkKQl7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKGRpcmVjdGlvbiAhPSBGUERGVEVYVF9MRUZUICYmIGRpcmVjdGlvbiAhPSBGUERGVEVYVF9SSUdIVCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9jaGFyTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvOwotICAgIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGluZGV4KTsKLSAgICBpZiAoY2hhcmluZm8ubV9JbmRleCA9PSAtMSB8fCBjaGFyaW5mby5tX0ZsYWcgPT0gRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQpCXsKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICBpZiAoIUlzTGV0dGVyKGNoYXJpbmZvLm1fVW5pY29kZSkpIHsKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICBpbnQgYnJlYWtQb3MgPSBpbmRleDsKLSAgICBpZiAoZGlyZWN0aW9uID09IEZQREZURVhUX0xFRlQpIHsKLSAgICAgICAgd2hpbGUgKC0tYnJlYWtQb3MgPiAwKSB7Ci0gICAgICAgICAgICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChicmVha1Bvcyk7Ci0gICAgICAgICAgICBpZiAoIUlzTGV0dGVyKGNoYXJpbmZvLm1fVW5pY29kZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnJlYWtQb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBGUERGVEVYVF9SSUdIVCkgewotICAgICAgICB3aGlsZSAoKyticmVha1BvcyA8IG1fY2hhckxpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChicmVha1Bvcyk7Ci0gICAgICAgICAgICBpZiAoIUlzTGV0dGVyKGNoYXJpbmZvLm1fVW5pY29kZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnJlYWtQb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJyZWFrUG9zOwotfQotaW50MzJfdCBDUERGX1RleHRQYWdlOjpGaW5kVGV4dGxpbmVGbG93RGlyZWN0aW9uKCkKLXsKLSAgICBpZiAoIW1fcFBhZ2UpCXsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBjb25zdCBpbnQzMl90IG5QYWdlV2lkdGggPSAoaW50MzJfdCkoKENQREZfUGFnZSopbV9wUGFnZSktPkdldFBhZ2VXaWR0aCgpOwotICAgIGNvbnN0IGludDMyX3QgblBhZ2VIZWlnaHQgPSAoaW50MzJfdCkoKENQREZfUGFnZSopbV9wUGFnZSktPkdldFBhZ2VIZWlnaHQoKTsKLSAgICBDRlhfQnl0ZUFycmF5IG5Ib3Jpem9udGFsTWFzazsKLSAgICBpZiAoIW5Ib3Jpem9udGFsTWFzay5TZXRTaXplKG5QYWdlV2lkdGgpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgdWludDhfdCogcERhdGFIID0gbkhvcml6b250YWxNYXNrLkdldERhdGEoKTsKLSAgICBDRlhfQnl0ZUFycmF5IG5WZXJ0aWNhbE1hc2s7Ci0gICAgaWYgKCFuVmVydGljYWxNYXNrLlNldFNpemUoblBhZ2VIZWlnaHQpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgdWludDhfdCogcERhdGFWID0gblZlcnRpY2FsTWFzay5HZXREYXRhKCk7Ci0gICAgaW50MzJfdCBpbmRleCA9IDA7Ci0gICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSAwLjBmOwotICAgIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSBOVUxMOwotICAgIEZYX1BPU0lUSU9OCXBvcyA9IE5VTEw7Ci0gICAgcG9zID0gbV9wUGFnZS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotICAgIGlmKCFwb3MpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICB3aGlsZShwb3MpIHsKLSAgICAgICAgcFBhZ2VPYmogPSBtX3BQYWdlLT5HZXROZXh0T2JqZWN0KHBvcyk7Ci0gICAgICAgIGlmKE5VTEwgPT0gcFBhZ2VPYmopIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKFBERlBBR0VfVEVYVCAhPSBwUGFnZU9iai0+bV9UeXBlKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IG1pbkggPSAoaW50MzJfdClwUGFnZU9iai0+bV9MZWZ0IDwgMCA/IDAgOiAoaW50MzJfdClwUGFnZU9iai0+bV9MZWZ0OwotICAgICAgICBpbnQzMl90IG1heEggPSAoaW50MzJfdClwUGFnZU9iai0+bV9SaWdodCA+IG5QYWdlV2lkdGggPyBuUGFnZVdpZHRoIDogKGludDMyX3QpcFBhZ2VPYmotPm1fUmlnaHQ7Ci0gICAgICAgIGludDMyX3QgbWluViA9IChpbnQzMl90KXBQYWdlT2JqLT5tX0JvdHRvbSA8IDAgPyAwIDogKGludDMyX3QpcFBhZ2VPYmotPm1fQm90dG9tOwotICAgICAgICBpbnQzMl90IG1heFYgPSAoaW50MzJfdClwUGFnZU9iai0+bV9Ub3AgPiBuUGFnZUhlaWdodCA/IG5QYWdlSGVpZ2h0IDogKGludDMyX3QpcFBhZ2VPYmotPm1fVG9wOwotICAgICAgICBpZiAobWluSCA+PSBtYXhIIHx8IG1pblYgPj0gbWF4VikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtc2V0KHBEYXRhSCArIG1pbkgsIDEsIG1heEggLSBtaW5IKTsKLSAgICAgICAgRlhTWVNfbWVtc2V0KHBEYXRhViArIG1pblYsIDEsIG1heFYgLSBtaW5WKTsKLSAgICAgICAgaWYgKGZMaW5lSGVpZ2h0IDw9IDAuMGYpIHsKLSAgICAgICAgICAgIGZMaW5lSGVpZ2h0ID0gcFBhZ2VPYmotPm1fVG9wIC0gcFBhZ2VPYmotPm1fQm90dG9tOwotICAgICAgICB9Ci0gICAgICAgIHBQYWdlT2JqID0gTlVMTDsKLSAgICB9Ci0gICAgaW50MzJfdCBuU3RhcnRIID0gMDsKLSAgICBpbnQzMl90IG5FbmRIID0gMDsKLSAgICBGWF9GTE9BVCBuU3VtSCA9IDAuMGY7Ci0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgblBhZ2VXaWR0aDsgaW5kZXgrKykKLSAgICAgICAgaWYoMSA9PSBuSG9yaXpvbnRhbE1hc2tbaW5kZXhdKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIG5TdGFydEggPSBpbmRleDsKLSAgICBmb3IgKGluZGV4ID0gblBhZ2VXaWR0aDsgaW5kZXggPiAwOyBpbmRleC0tKQotICAgICAgICBpZigxID09IG5Ib3Jpem9udGFsTWFza1tpbmRleCAtIDFdKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIG5FbmRIID0gaW5kZXg7Ci0gICAgZm9yIChpbmRleCA9IG5TdGFydEg7IGluZGV4IDwgbkVuZEg7IGluZGV4KyspIHsKLSAgICAgICAgblN1bUggKz0gbkhvcml6b250YWxNYXNrW2luZGV4XTsKLSAgICB9Ci0gICAgblN1bUggLz0gbkVuZEggLSBuU3RhcnRIOwotICAgIGludDMyX3QgblN0YXJ0ViA9IDA7Ci0gICAgaW50MzJfdCBuRW5kViA9IDA7Ci0gICAgRlhfRkxPQVQgblN1bVYgPSAwLjBmOwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5QYWdlSGVpZ2h0OyBpbmRleCsrKQotICAgICAgICBpZigxID09IG5WZXJ0aWNhbE1hc2tbaW5kZXhdKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIG5TdGFydFYgPSBpbmRleDsKLSAgICBmb3IgKGluZGV4ID0gblBhZ2VIZWlnaHQ7IGluZGV4ID4gMDsgaW5kZXgtLSkKLSAgICAgICAgaWYoMSA9PSBuVmVydGljYWxNYXNrW2luZGV4IC0gMV0pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgbkVuZFYgPSBpbmRleDsKLSAgICBmb3IgKGluZGV4ID0gblN0YXJ0VjsgaW5kZXggPCBuRW5kVjsgaW5kZXgrKykgewotICAgICAgICBuU3VtViArPSBuVmVydGljYWxNYXNrW2luZGV4XTsKLSAgICB9Ci0gICAgblN1bVYgLz0gbkVuZFYgLSBuU3RhcnRWOwotICAgIGlmICgobkVuZFYgLSBuU3RhcnRWKSA8IChpbnQzMl90KSgyICogZkxpbmVIZWlnaHQpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoKG5FbmRIIC0gblN0YXJ0SCkgPCAoaW50MzJfdCkoMiAqIGZMaW5lSGVpZ2h0KSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKG5TdW1IID4gMC44ZikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG5TdW1IIC0gblN1bVYgPiAwLjBmKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoblN1bVYgLSBuU3VtSCA+IDAuMGYpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQoraW50IENQREZfVGV4dFBhZ2U6OkdldFdvcmRCcmVhayhpbnQgaW5kZXgsIGludCBkaXJlY3Rpb24pIGNvbnN0IHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewogICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoIW1fSXNQYXJzZXJlZCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoZGlyZWN0aW9uICE9IEZQREZURVhUX0xFRlQgJiYgZGlyZWN0aW9uICE9IEZQREZURVhUX1JJR0hUKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9jaGFyTGlzdC5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbzsKKyAgY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoaW5kZXgpOworICBpZiAoY2hhcmluZm8ubV9JbmRleCA9PSAtMSB8fCBjaGFyaW5mby5tX0ZsYWcgPT0gRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQpIHsKKyAgICByZXR1cm4gaW5kZXg7CisgIH0KKyAgaWYgKCFJc0xldHRlcihjaGFyaW5mby5tX1VuaWNvZGUpKSB7CisgICAgcmV0dXJuIGluZGV4OworICB9CisgIGludCBicmVha1BvcyA9IGluZGV4OworICBpZiAoZGlyZWN0aW9uID09IEZQREZURVhUX0xFRlQpIHsKKyAgICB3aGlsZSAoLS1icmVha1BvcyA+IDApIHsKKyAgICAgIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGJyZWFrUG9zKTsKKyAgICAgIGlmICghSXNMZXR0ZXIoY2hhcmluZm8ubV9Vbmljb2RlKSkgeworICAgICAgICByZXR1cm4gYnJlYWtQb3M7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBGUERGVEVYVF9SSUdIVCkgeworICAgIHdoaWxlICgrK2JyZWFrUG9zIDwgbV9jaGFyTGlzdC5HZXRTaXplKCkpIHsKKyAgICAgIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGJyZWFrUG9zKTsKKyAgICAgIGlmICghSXNMZXR0ZXIoY2hhcmluZm8ubV9Vbmljb2RlKSkgeworICAgICAgICByZXR1cm4gYnJlYWtQb3M7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBicmVha1BvczsKIH0KLXZvaWQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc09iamVjdCgpCi17Ci0gICAgQ1BERl9QYWdlT2JqZWN0KglwUGFnZU9iaiA9IE5VTEw7Ci0gICAgaWYgKCFtX3BQYWdlKQl7Ci0gICAgICAgIHJldHVybjsKK2ludDMyX3QgQ1BERl9UZXh0UGFnZTo6RmluZFRleHRsaW5lRmxvd0RpcmVjdGlvbigpIHsKKyAgaWYgKCFtX3BQYWdlKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNvbnN0IGludDMyX3QgblBhZ2VXaWR0aCA9IChpbnQzMl90KSgoQ1BERl9QYWdlKiltX3BQYWdlKS0+R2V0UGFnZVdpZHRoKCk7CisgIGNvbnN0IGludDMyX3QgblBhZ2VIZWlnaHQgPSAoaW50MzJfdCkoKENQREZfUGFnZSopbV9wUGFnZSktPkdldFBhZ2VIZWlnaHQoKTsKKyAgQ0ZYX0J5dGVBcnJheSBuSG9yaXpvbnRhbE1hc2s7CisgIGlmICghbkhvcml6b250YWxNYXNrLlNldFNpemUoblBhZ2VXaWR0aCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgdWludDhfdCogcERhdGFIID0gbkhvcml6b250YWxNYXNrLkdldERhdGEoKTsKKyAgQ0ZYX0J5dGVBcnJheSBuVmVydGljYWxNYXNrOworICBpZiAoIW5WZXJ0aWNhbE1hc2suU2V0U2l6ZShuUGFnZUhlaWdodCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgdWludDhfdCogcERhdGFWID0gblZlcnRpY2FsTWFzay5HZXREYXRhKCk7CisgIGludDMyX3QgaW5kZXggPSAwOworICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IDAuMGY7CisgIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSBOVUxMOworICBGWF9QT1NJVElPTiBwb3MgPSBOVUxMOworICBwb3MgPSBtX3BQYWdlLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CisgIGlmICghcG9zKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHdoaWxlIChwb3MpIHsKKyAgICBwUGFnZU9iaiA9IG1fcFBhZ2UtPkdldE5leHRPYmplY3QocG9zKTsKKyAgICBpZiAoTlVMTCA9PSBwUGFnZU9iaikgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIEZYX1BPU0lUSU9OCXBvczsKLSAgICBwb3MgPSBtX3BQYWdlLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgaWYgKCFwb3MpCXsKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChQREZQQUdFX1RFWFQgIT0gcFBhZ2VPYmotPm1fVHlwZSkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIG1fVGV4dGxpbmVEaXIgPSBGaW5kVGV4dGxpbmVGbG93RGlyZWN0aW9uKCk7Ci0gICAgaW50IG5Db3VudCA9IDA7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBwUGFnZU9iaiA9IG1fcFBhZ2UtPkdldE5leHRPYmplY3QocG9zKTsKLSAgICAgICAgaWYocFBhZ2VPYmopIHsKLSAgICAgICAgICAgIGlmKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9URVhUKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc1RleHRPYmplY3QoKENQREZfVGV4dE9iamVjdCopcFBhZ2VPYmosIG1hdHJpeCwgcG9zKTsKLSAgICAgICAgICAgICAgICBuQ291bnQrKzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0ZPUk0pIHsKLSAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGZvcm1NYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc0Zvcm1PYmplY3QoKENQREZfRm9ybU9iamVjdCopcFBhZ2VPYmosIGZvcm1NYXRyaXgpOwotICAgICAgICAgICAgfQorICAgIGludDMyX3QgbWluSCA9CisgICAgICAgIChpbnQzMl90KXBQYWdlT2JqLT5tX0xlZnQgPCAwID8gMCA6IChpbnQzMl90KXBQYWdlT2JqLT5tX0xlZnQ7CisgICAgaW50MzJfdCBtYXhIID0gKGludDMyX3QpcFBhZ2VPYmotPm1fUmlnaHQgPiBuUGFnZVdpZHRoCisgICAgICAgICAgICAgICAgICAgICAgID8gblBhZ2VXaWR0aAorICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQzMl90KXBQYWdlT2JqLT5tX1JpZ2h0OworICAgIGludDMyX3QgbWluViA9CisgICAgICAgIChpbnQzMl90KXBQYWdlT2JqLT5tX0JvdHRvbSA8IDAgPyAwIDogKGludDMyX3QpcFBhZ2VPYmotPm1fQm90dG9tOworICAgIGludDMyX3QgbWF4ViA9IChpbnQzMl90KXBQYWdlT2JqLT5tX1RvcCA+IG5QYWdlSGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgID8gblBhZ2VIZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgOiAoaW50MzJfdClwUGFnZU9iai0+bV9Ub3A7CisgICAgaWYgKG1pbkggPj0gbWF4SCB8fCBtaW5WID49IG1heFYpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBGWFNZU19tZW1zZXQocERhdGFIICsgbWluSCwgMSwgbWF4SCAtIG1pbkgpOworICAgIEZYU1lTX21lbXNldChwRGF0YVYgKyBtaW5WLCAxLCBtYXhWIC0gbWluVik7CisgICAgaWYgKGZMaW5lSGVpZ2h0IDw9IDAuMGYpIHsKKyAgICAgIGZMaW5lSGVpZ2h0ID0gcFBhZ2VPYmotPm1fVG9wIC0gcFBhZ2VPYmotPm1fQm90dG9tOworICAgIH0KKyAgICBwUGFnZU9iaiA9IE5VTEw7CisgIH0KKyAgaW50MzJfdCBuU3RhcnRIID0gMDsKKyAgaW50MzJfdCBuRW5kSCA9IDA7CisgIEZYX0ZMT0FUIG5TdW1IID0gMC4wZjsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgblBhZ2VXaWR0aDsgaW5kZXgrKykKKyAgICBpZiAoMSA9PSBuSG9yaXpvbnRhbE1hc2tbaW5kZXhdKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIG5TdGFydEggPSBpbmRleDsKKyAgZm9yIChpbmRleCA9IG5QYWdlV2lkdGg7IGluZGV4ID4gMDsgaW5kZXgtLSkKKyAgICBpZiAoMSA9PSBuSG9yaXpvbnRhbE1hc2tbaW5kZXggLSAxXSkgeworICAgICAgYnJlYWs7CisgICAgfQorICBuRW5kSCA9IGluZGV4OworICBmb3IgKGluZGV4ID0gblN0YXJ0SDsgaW5kZXggPCBuRW5kSDsgaW5kZXgrKykgeworICAgIG5TdW1IICs9IG5Ib3Jpem9udGFsTWFza1tpbmRleF07CisgIH0KKyAgblN1bUggLz0gbkVuZEggLSBuU3RhcnRIOworICBpbnQzMl90IG5TdGFydFYgPSAwOworICBpbnQzMl90IG5FbmRWID0gMDsKKyAgRlhfRkxPQVQgblN1bVYgPSAwLjBmOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuUGFnZUhlaWdodDsgaW5kZXgrKykKKyAgICBpZiAoMSA9PSBuVmVydGljYWxNYXNrW2luZGV4XSkgeworICAgICAgYnJlYWs7CisgICAgfQorICBuU3RhcnRWID0gaW5kZXg7CisgIGZvciAoaW5kZXggPSBuUGFnZUhlaWdodDsgaW5kZXggPiAwOyBpbmRleC0tKQorICAgIGlmICgxID09IG5WZXJ0aWNhbE1hc2tbaW5kZXggLSAxXSkgeworICAgICAgYnJlYWs7CisgICAgfQorICBuRW5kViA9IGluZGV4OworICBmb3IgKGluZGV4ID0gblN0YXJ0VjsgaW5kZXggPCBuRW5kVjsgaW5kZXgrKykgeworICAgIG5TdW1WICs9IG5WZXJ0aWNhbE1hc2tbaW5kZXhdOworICB9CisgIG5TdW1WIC89IG5FbmRWIC0gblN0YXJ0VjsKKyAgaWYgKChuRW5kViAtIG5TdGFydFYpIDwgKGludDMyX3QpKDIgKiBmTGluZUhlaWdodCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoKG5FbmRIIC0gblN0YXJ0SCkgPCAoaW50MzJfdCkoMiAqIGZMaW5lSGVpZ2h0KSkgeworICAgIHJldHVybiAxOworICB9CisgIGlmIChuU3VtSCA+IDAuOGYpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoblN1bUggLSBuU3VtViA+IDAuMGYpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoblN1bVYgLSBuU3VtSCA+IDAuMGYpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gLTE7Cit9Cit2b2lkIENQREZfVGV4dFBhZ2U6OlByb2Nlc3NPYmplY3QoKSB7CisgIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSBOVUxMOworICBpZiAoIW1fcFBhZ2UpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfUE9TSVRJT04gcG9zOworICBwb3MgPSBtX3BQYWdlLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CisgIGlmICghcG9zKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fVGV4dGxpbmVEaXIgPSBGaW5kVGV4dGxpbmVGbG93RGlyZWN0aW9uKCk7CisgIGludCBuQ291bnQgPSAwOworICB3aGlsZSAocG9zKSB7CisgICAgcFBhZ2VPYmogPSBtX3BQYWdlLT5HZXROZXh0T2JqZWN0KHBvcyk7CisgICAgaWYgKHBQYWdlT2JqKSB7CisgICAgICBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX1RFWFQpIHsKKyAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7CisgICAgICAgIFByb2Nlc3NUZXh0T2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBQYWdlT2JqLCBtYXRyaXgsIHBvcyk7CisgICAgICAgIG5Db3VudCsrOworICAgICAgfSBlbHNlIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgeworICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGZvcm1NYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCk7CisgICAgICAgIFByb2Nlc3NGb3JtT2JqZWN0KChDUERGX0Zvcm1PYmplY3QqKXBQYWdlT2JqLCBmb3JtTWF0cml4KTsKKyAgICAgIH0KKyAgICB9CisgICAgcFBhZ2VPYmogPSBOVUxMOworICB9CisgIGludCBjb3VudCA9IG1fTGluZU9iai5HZXRTaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIFByb2Nlc3NUZXh0T2JqZWN0KG1fTGluZU9iai5HZXRBdChpKSk7CisgIH0KKyAgbV9MaW5lT2JqLlJlbW92ZUFsbCgpOworICBDbG9zZVRlbXBMaW5lKCk7Cit9Cit2b2lkIENQREZfVGV4dFBhZ2U6OlByb2Nlc3NGb3JtT2JqZWN0KENQREZfRm9ybU9iamVjdCogcEZvcm1PYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgpIHsKKyAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IE5VTEw7CisgIEZYX1BPU0lUSU9OIHBvczsKKyAgaWYgKCFwRm9ybU9iaikgeworICAgIHJldHVybjsKKyAgfQorICBwb3MgPSBwRm9ybU9iai0+bV9wRm9ybS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOworICBpZiAoIXBvcykgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfQWZmaW5lTWF0cml4IGN1ckZvcm1NYXRyaXg7CisgIGN1ckZvcm1NYXRyaXguQ29weShwRm9ybU9iai0+bV9Gb3JtTWF0cml4KTsKKyAgY3VyRm9ybU1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBwUGFnZU9iaiA9IHBGb3JtT2JqLT5tX3BGb3JtLT5HZXROZXh0T2JqZWN0KHBvcyk7CisgICAgaWYgKHBQYWdlT2JqKSB7CisgICAgICBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX1RFWFQpIHsKKyAgICAgICAgUHJvY2Vzc1RleHRPYmplY3QoKENQREZfVGV4dE9iamVjdCopcFBhZ2VPYmosIGN1ckZvcm1NYXRyaXgsIHBvcyk7CisgICAgICB9IGVsc2UgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNKSB7CisgICAgICAgIFByb2Nlc3NGb3JtT2JqZWN0KChDUERGX0Zvcm1PYmplY3QqKXBQYWdlT2JqLCBjdXJGb3JtTWF0cml4KTsKKyAgICAgIH0KKyAgICB9CisgICAgcFBhZ2VPYmogPSBOVUxMOworICB9Cit9CitpbnQgQ1BERl9UZXh0UGFnZTo6R2V0Q2hhcldpZHRoKEZYX0RXT1JEIGNoYXJDb2RlLCBDUERGX0ZvbnQqIHBGb250KSBjb25zdCB7CisgIGlmIChjaGFyQ29kZSA9PSAtMSkgeworICAgIHJldHVybiAwOworICB9CisgIGludCB3ID0gcEZvbnQtPkdldENoYXJXaWR0aEYoY2hhckNvZGUpOworICBpZiAodyA9PSAwKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOworICAgIHBGb250LT5BcHBlbmRDaGFyKHN0ciwgY2hhckNvZGUpOworICAgIHcgPSBwRm9udC0+R2V0U3RyaW5nV2lkdGgoc3RyLCAxKTsKKyAgICBpZiAodyA9PSAwKSB7CisgICAgICBGWF9SRUNUIEJCb3g7CisgICAgICBwRm9udC0+R2V0Q2hhckJCb3goY2hhckNvZGUsIEJCb3gpOworICAgICAgdyA9IEJCb3gucmlnaHQgLSBCQm94LmxlZnQ7CisgICAgfQorICB9CisgIHJldHVybiB3OworfQordm9pZCBDUERGX1RleHRQYWdlOjpPblBpZWNlKElGWF9CaWRpQ2hhciogcEJpZGksIENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgaW50MzJfdCBzdGFydCwgY291bnQ7CisgIGludDMyX3QgcmV0ID0gcEJpZGktPkdldEJpZGlJbmZvKHN0YXJ0LCBjb3VudCk7CisgIGlmIChyZXQgPT0gMikgeworICAgIGZvciAoaW50IGkgPSBzdGFydCArIGNvdW50IC0gMTsgaSA+PSBzdGFydDsgaS0tKSB7CisgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihzdHIuR2V0QXQoaSkpOworICAgICAgbV9jaGFyTGlzdC5BZGQoKihQQUdFQ0hBUl9JTkZPKiltX1RlbXBDaGFyTGlzdC5HZXRBdChpKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50OworICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihzdHIuR2V0QXQoaSkpOworICAgICAgbV9jaGFyTGlzdC5BZGQoKihQQUdFQ0hBUl9JTkZPKiltX1RlbXBDaGFyTGlzdC5HZXRBdChpKSk7CisgICAgfQorICB9Cit9Cit2b2lkIENQREZfVGV4dFBhZ2U6OkFkZENoYXJJbmZvQnlMUkRpcmVjdGlvbihDRlhfV2lkZVN0cmluZyYgc3RyLCBpbnQgaSkgeworICBQQUdFQ0hBUl9JTkZPIEluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KGkpOworICBGWF9XQ0hBUiB3Q2hhciA9IHN0ci5HZXRBdChpKTsKKyAgaWYgKCFJc0NvbnRyb2xDaGFyKEluZm8pKSB7CisgICAgSW5mby5tX0luZGV4ID0gbV9UZXh0QnVmLkdldExlbmd0aCgpOworICAgIGlmICh3Q2hhciA+PSAweEZCMDAgJiYgd0NoYXIgPD0gMHhGQjA2KSB7CisgICAgICBGWF9XQ0hBUiogcERzdCA9IE5VTEw7CisgICAgICBGWF9TVFJTSVpFIG5Db3VudCA9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Q2hhciwgcERzdCk7CisgICAgICBpZiAobkNvdW50ID49IDEpIHsKKyAgICAgICAgcERzdCA9IEZYX0FsbG9jKEZYX1dDSEFSLCBuQ291bnQpOworICAgICAgICBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOworICAgICAgICBmb3IgKGludCBuSW5kZXggPSAwOyBuSW5kZXggPCBuQ291bnQ7IG5JbmRleCsrKSB7CisgICAgICAgICAgUEFHRUNIQVJfSU5GTyBJbmZvMiA9IEluZm87CisgICAgICAgICAgSW5mbzIubV9Vbmljb2RlID0gcERzdFtuSW5kZXhdOworICAgICAgICAgIEluZm8yLm1fRmxhZyA9IEZQREZURVhUX0NIQVJfUElFQ0U7CisgICAgICAgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIoSW5mbzIubV9Vbmljb2RlKTsKKyAgICAgICAgICBpZiAoIW1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgICAgICAgICAgbV9jaGFyTGlzdC5BZGQoSW5mbzIpOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBwUGFnZU9iaiA9IE5VTEw7CisgICAgICAgIEZYX0ZyZWUocERzdCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KICAgICB9Ci0gICAgaW50IGNvdW50ID0gbV9MaW5lT2JqLkdldFNpemUoKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBQcm9jZXNzVGV4dE9iamVjdChtX0xpbmVPYmouR2V0QXQoaSkpOworICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKHdDaGFyKTsKKyAgfSBlbHNlIHsKKyAgICBJbmZvLm1fSW5kZXggPSAtMTsKKyAgfQorICBpZiAoIW1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIG1fY2hhckxpc3QuQWRkKEluZm8pOworICB9Cit9Cit2b2lkIENQREZfVGV4dFBhZ2U6OkFkZENoYXJJbmZvQnlSTERpcmVjdGlvbihDRlhfV2lkZVN0cmluZyYgc3RyLCBpbnQgaSkgeworICBQQUdFQ0hBUl9JTkZPIEluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KGkpOworICBpZiAoIUlzQ29udHJvbENoYXIoSW5mbykpIHsKKyAgICBJbmZvLm1fSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7CisgICAgRlhfV0NIQVIgd0NoYXIgPSBGWF9HZXRNaXJyb3JDaGFyKHN0ci5HZXRBdChpKSwgVFJVRSwgRkFMU0UpOworICAgIEZYX1dDSEFSKiBwRHN0ID0gTlVMTDsKKyAgICBGWF9TVFJTSVpFIG5Db3VudCA9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Q2hhciwgcERzdCk7CisgICAgaWYgKG5Db3VudCA+PSAxKSB7CisgICAgICBwRHN0ID0gRlhfQWxsb2MoRlhfV0NIQVIsIG5Db3VudCk7CisgICAgICBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOworICAgICAgZm9yIChpbnQgbkluZGV4ID0gMDsgbkluZGV4IDwgbkNvdW50OyBuSW5kZXgrKykgeworICAgICAgICBQQUdFQ0hBUl9JTkZPIEluZm8yID0gSW5mbzsKKyAgICAgICAgSW5mbzIubV9Vbmljb2RlID0gcERzdFtuSW5kZXhdOworICAgICAgICBJbmZvMi5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX1BJRUNFOworICAgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihJbmZvMi5tX1VuaWNvZGUpOworICAgICAgICBpZiAoIW1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgICAgICAgIG1fY2hhckxpc3QuQWRkKEluZm8yKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgRlhfRnJlZShwRHN0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgSW5mby5tX1VuaWNvZGUgPSB3Q2hhcjsKKyAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihJbmZvLm1fVW5pY29kZSk7CisgIH0gZWxzZSB7CisgICAgSW5mby5tX0luZGV4ID0gLTE7CisgIH0KKyAgaWYgKCFtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKKyAgICBtX2NoYXJMaXN0LkFkZChJbmZvKTsKKyAgfQorfQordm9pZCBDUERGX1RleHRQYWdlOjpDbG9zZVRlbXBMaW5lKCkgeworICBpbnQgY291bnQxID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpOworICBpZiAoY291bnQxIDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgbm9uc3RkOjp1bmlxdWVfcHRyPElGWF9CaWRpQ2hhcj4gcEJpZGlDaGFyKElGWF9CaWRpQ2hhcjo6Q3JlYXRlKCkpOworICBDRlhfV2lkZVN0cmluZyBzdHIgPSBtX1RlbXBUZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsKKyAgQ0ZYX1dvcmRBcnJheSBvcmRlcjsKKyAgRlhfQk9PTCBiUjJMID0gRkFMU0U7CisgIGludDMyX3Qgc3RhcnQgPSAwLCBjb3VudCA9IDA7CisgIGludCBuUjJMID0gMCwgbkwyUiA9IDA7CisgIEZYX0JPT0wgYlByZXZTcGFjZSA9IEZBTFNFOworICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5HZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgaWYgKHN0ci5HZXRBdChpKSA9PSAzMikgeworICAgICAgaWYgKGJQcmV2U3BhY2UpIHsKKyAgICAgICAgbV9UZW1wVGV4dEJ1Zi5EZWxldGUoaSwgMSk7CisgICAgICAgIG1fVGVtcENoYXJMaXN0LkRlbGV0ZShpKTsKKyAgICAgICAgc3RyLkRlbGV0ZShpKTsKKyAgICAgICAgY291bnQxLS07CisgICAgICAgIGktLTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBiUHJldlNwYWNlID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgYlByZXZTcGFjZSA9IEZBTFNFOworICAgIH0KKyAgICBpZiAocEJpZGlDaGFyLT5BcHBlbmRDaGFyKHN0ci5HZXRBdChpKSkpIHsKKyAgICAgIGludDMyX3QgcmV0ID0gcEJpZGlDaGFyLT5HZXRCaWRpSW5mbyhzdGFydCwgY291bnQpOworICAgICAgb3JkZXIuQWRkKHN0YXJ0KTsKKyAgICAgIG9yZGVyLkFkZChjb3VudCk7CisgICAgICBvcmRlci5BZGQocmV0KTsKKyAgICAgIGlmICghYlIyTCkgeworICAgICAgICBpZiAocmV0ID09IDIpIHsKKyAgICAgICAgICBuUjJMKys7CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDEpIHsKKyAgICAgICAgICBuTDJSKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHBCaWRpQ2hhci0+RW5kQ2hhcigpKSB7CisgICAgaW50MzJfdCByZXQgPSBwQmlkaUNoYXItPkdldEJpZGlJbmZvKHN0YXJ0LCBjb3VudCk7CisgICAgb3JkZXIuQWRkKHN0YXJ0KTsKKyAgICBvcmRlci5BZGQoY291bnQpOworICAgIG9yZGVyLkFkZChyZXQpOworICAgIGlmICghYlIyTCkgeworICAgICAgaWYgKHJldCA9PSAyKSB7CisgICAgICAgIG5SMkwrKzsKKyAgICAgIH0gZWxzZSBpZiAocmV0ID09IDEpIHsKKyAgICAgICAgbkwyUisrOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoblIyTCA+IDAgJiYgblIyTCA+PSBuTDJSKSB7CisgICAgYlIyTCA9IFRSVUU7CisgIH0KKyAgaWYgKG1fcGFyc2VyZmxhZyA9PSBGUERGVEVYVF9STFRCIHx8IGJSMkwpIHsKKyAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7CisgICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+IDA7IGkgLT0gMykgeworICAgICAgaW50IHJldCA9IG9yZGVyLkdldEF0KGkpOworICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQoaSAtIDIpOworICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KGkgLSAxKTsKKyAgICAgIGlmIChyZXQgPT0gMiB8fCByZXQgPT0gMCkgeworICAgICAgICBmb3IgKGludCBqID0gc3RhcnQgKyBjb3VudDEgLSAxOyBqID49IHN0YXJ0OyBqLS0pIHsKKyAgICAgICAgICBBZGRDaGFySW5mb0J5UkxEaXJlY3Rpb24oc3RyLCBqKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGogPSBpOworICAgICAgICBGWF9CT09MIGJTeW1ib2wgPSBGQUxTRTsKKyAgICAgICAgd2hpbGUgKGogPiAwICYmIG9yZGVyLkdldEF0KGopICE9IDIpIHsKKyAgICAgICAgICBiU3ltYm9sID0gIW9yZGVyLkdldEF0KGopOworICAgICAgICAgIGogLT0gMzsKKyAgICAgICAgfQorICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyBjb3VudDE7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgaWYgKGJTeW1ib2wpIHsKKyAgICAgICAgICBuID0gaiArIDY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbiA9IGogKyAzOworICAgICAgICB9CisgICAgICAgIGlmIChuID49IGkpIHsKKyAgICAgICAgICBmb3IgKGludCBtID0gc3RhcnQ7IG0gPCBlbmQ7IG0rKykgeworICAgICAgICAgICAgQWRkQ2hhckluZm9CeUxSRGlyZWN0aW9uKHN0ciwgbSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGogPSBpOworICAgICAgICAgIGkgPSBuOworICAgICAgICAgIGZvciAoOyBuIDw9IGo7IG4gKz0gMykgeworICAgICAgICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQobiAtIDIpOworICAgICAgICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KG4gLSAxKTsKKyAgICAgICAgICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50MTsKKyAgICAgICAgICAgIGZvciAoaW50IG0gPSBzdGFydDsgbSA8IGVuZDsgbSsrKSB7CisgICAgICAgICAgICAgIEFkZENoYXJJbmZvQnlMUkRpcmVjdGlvbihzdHIsIG0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7CisgICAgRlhfQk9PTCBiTDJSID0gRkFMU0U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArPSAzKSB7CisgICAgICBpbnQgcmV0ID0gb3JkZXIuR2V0QXQoaSArIDIpOworICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQoaSk7CisgICAgICBpbnQgY291bnQxID0gb3JkZXIuR2V0QXQoaSArIDEpOworICAgICAgaWYgKHJldCA9PSAyIHx8IChpID09IDAgJiYgcmV0ID09IDAgJiYgIWJMMlIpKSB7CisgICAgICAgIGludCBqID0gaSArIDM7CisgICAgICAgIHdoaWxlIChiUjJMICYmIGogPCBjb3VudCkgeworICAgICAgICAgIGlmIChvcmRlci5HZXRBdChqICsgMikgPT0gMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGogKz0gMzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPT0gMykgeworICAgICAgICAgIGkgPSAtMzsKKyAgICAgICAgICBiTDJSID0gVFJVRTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZW5kID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIC0gMTsKKyAgICAgICAgaWYgKGogPCBjb3VudCkgeworICAgICAgICAgIGVuZCA9IG9yZGVyLkdldEF0KGopIC0gMTsKKyAgICAgICAgfQorICAgICAgICBpID0gaiAtIDM7CisgICAgICAgIGZvciAoaW50IG4gPSBlbmQ7IG4gPj0gc3RhcnQ7IG4tLSkgeworICAgICAgICAgIEFkZENoYXJJbmZvQnlSTERpcmVjdGlvbihzdHIsIG4pOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyBjb3VudDE7CisgICAgICAgIGZvciAoaW50IG4gPSBzdGFydDsgbiA8IGVuZDsgbisrKSB7CisgICAgICAgICAgQWRkQ2hhckluZm9CeUxSRGlyZWN0aW9uKHN0ciwgbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgb3JkZXIuUmVtb3ZlQWxsKCk7CisgIG1fVGVtcENoYXJMaXN0LlJlbW92ZUFsbCgpOworICBtX1RlbXBUZXh0QnVmLkRlbGV0ZSgwLCBtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpKTsKK30KK3ZvaWQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc1RleHRPYmplY3QoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgZm9ybU1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUE9TSVRJT04gT2JqUG9zKSB7CisgIENGWF9GbG9hdFJlY3QgcmUocFRleHRPYmotPm1fTGVmdCwgcFRleHRPYmotPm1fQm90dG9tLCBwVGV4dE9iai0+bV9SaWdodCwKKyAgICAgICAgICAgICAgICAgICBwVGV4dE9iai0+bV9Ub3ApOworICBpZiAoRlhTWVNfZmFicyhwVGV4dE9iai0+bV9SaWdodCAtIHBUZXh0T2JqLT5tX0xlZnQpIDwgMC4wMWYpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGNvdW50ID0gbV9MaW5lT2JqLkdldFNpemUoKTsKKyAgUERGVEVYVF9PYmogT2JqOworICBPYmoubV9wVGV4dE9iaiA9IHBUZXh0T2JqOworICBPYmoubV9mb3JtTWF0cml4ID0gZm9ybU1hdHJpeDsKKyAgaWYgKGNvdW50ID09IDApIHsKKyAgICBtX0xpbmVPYmouQWRkKE9iaik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChJc1NhbWVBc1ByZVRleHRPYmplY3QocFRleHRPYmosIE9ialBvcykpIHsKKyAgICByZXR1cm47CisgIH0KKyAgUERGVEVYVF9PYmogcHJldl9PYmogPSBtX0xpbmVPYmouR2V0QXQoY291bnQgLSAxKTsKKyAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOworICBpbnQgbkl0ZW0gPSBwcmV2X09iai5tX3BUZXh0T2JqLT5Db3VudEl0ZW1zKCk7CisgIHByZXZfT2JqLm1fcFRleHRPYmotPkdldEl0ZW1JbmZvKG5JdGVtIC0gMSwgJml0ZW0pOworICBGWF9GTE9BVCBwcmV2X3dpZHRoID0KKyAgICAgIEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHByZXZfT2JqLm1fcFRleHRPYmotPkdldEZvbnQoKSkgKgorICAgICAgcHJldl9PYmoubV9wVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7CisgIENGWF9BZmZpbmVNYXRyaXggcHJldl9tYXRyaXg7CisgIHByZXZfT2JqLm1fcFRleHRPYmotPkdldFRleHRNYXRyaXgoJnByZXZfbWF0cml4KTsKKyAgcHJldl93aWR0aCA9IEZYU1lTX2ZhYnMocHJldl93aWR0aCk7CisgIHByZXZfbWF0cml4LkNvbmNhdChwcmV2X09iai5tX2Zvcm1NYXRyaXgpOworICBwcmV2X3dpZHRoID0gcHJldl9tYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UocHJldl93aWR0aCk7CisgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbygwLCAmaXRlbSk7CisgIEZYX0ZMT0FUIHRoaXNfd2lkdGggPSBHZXRDaGFyV2lkdGgoaXRlbS5tX0NoYXJDb2RlLCBwVGV4dE9iai0+R2V0Rm9udCgpKSAqCisgICAgICAgICAgICAgICAgICAgICAgICBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7CisgIHRoaXNfd2lkdGggPSBGWFNZU19mYWJzKHRoaXNfd2lkdGgpOworICBDRlhfQWZmaW5lTWF0cml4IHRoaXNfbWF0cml4OworICBwVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgmdGhpc19tYXRyaXgpOworICB0aGlzX3dpZHRoID0gRlhTWVNfZmFicyh0aGlzX3dpZHRoKTsKKyAgdGhpc19tYXRyaXguQ29uY2F0KGZvcm1NYXRyaXgpOworICB0aGlzX3dpZHRoID0gdGhpc19tYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UodGhpc193aWR0aCk7CisgIEZYX0ZMT0FUIHRocmVzaG9sZCA9CisgICAgICBwcmV2X3dpZHRoID4gdGhpc193aWR0aCA/IHByZXZfd2lkdGggLyA0IDogdGhpc193aWR0aCAvIDQ7CisgIEZYX0ZMT0FUIHByZXZfeCA9IHByZXZfT2JqLm1fcFRleHRPYmotPkdldFBvc1goKSwKKyAgICAgICAgICAgcHJldl95ID0gcHJldl9PYmoubV9wVGV4dE9iai0+R2V0UG9zWSgpOworICBwcmV2X09iai5tX2Zvcm1NYXRyaXguVHJhbnNmb3JtKHByZXZfeCwgcHJldl95KTsKKyAgbV9EaXNwbGF5TWF0cml4LlRyYW5zZm9ybShwcmV2X3gsIHByZXZfeSk7CisgIEZYX0ZMT0FUIHRoaXNfeCA9IHBUZXh0T2JqLT5HZXRQb3NYKCksIHRoaXNfeSA9IHBUZXh0T2JqLT5HZXRQb3NZKCk7CisgIGZvcm1NYXRyaXguVHJhbnNmb3JtKHRoaXNfeCwgdGhpc195KTsKKyAgbV9EaXNwbGF5TWF0cml4LlRyYW5zZm9ybSh0aGlzX3gsIHRoaXNfeSk7CisgIGlmIChGWFNZU19mYWJzKHRoaXNfeSAtIHByZXZfeSkgPiB0aHJlc2hvbGQgKiAyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBQcm9jZXNzVGV4dE9iamVjdChtX0xpbmVPYmouR2V0QXQoaSkpOwogICAgIH0KICAgICBtX0xpbmVPYmouUmVtb3ZlQWxsKCk7Ci0gICAgQ2xvc2VUZW1wTGluZSgpOwotfQotdm9pZCBDUERGX1RleHRQYWdlOjpQcm9jZXNzRm9ybU9iamVjdChDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBmb3JtTWF0cml4KQotewotICAgIENQREZfUGFnZU9iamVjdCoJcFBhZ2VPYmogPSBOVUxMOwotICAgIEZYX1BPU0lUSU9OCXBvczsKLSAgICBpZiAoIXBGb3JtT2JqKQl7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcG9zID0gcEZvcm1PYmotPm1fcEZvcm0tPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICBpZiAoIXBvcykJewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggY3VyRm9ybU1hdHJpeDsKLSAgICBjdXJGb3JtTWF0cml4LkNvcHkocEZvcm1PYmotPm1fRm9ybU1hdHJpeCk7Ci0gICAgY3VyRm9ybU1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBwUGFnZU9iaiA9IHBGb3JtT2JqLT5tX3BGb3JtLT5HZXROZXh0T2JqZWN0KHBvcyk7Ci0gICAgICAgIGlmKHBQYWdlT2JqKSB7Ci0gICAgICAgICAgICBpZihwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgewotICAgICAgICAgICAgICAgIFByb2Nlc3NUZXh0T2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBQYWdlT2JqLCBjdXJGb3JtTWF0cml4LCBwb3MpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgewotICAgICAgICAgICAgICAgIFByb2Nlc3NGb3JtT2JqZWN0KChDUERGX0Zvcm1PYmplY3QqKXBQYWdlT2JqLCBjdXJGb3JtTWF0cml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwUGFnZU9iaiA9IE5VTEw7Ci0gICAgfQotfQotaW50IENQREZfVGV4dFBhZ2U6OkdldENoYXJXaWR0aChGWF9EV09SRCBjaGFyQ29kZSwgQ1BERl9Gb250KiBwRm9udCkgY29uc3QKLXsKLSAgICBpZihjaGFyQ29kZSA9PSAtMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IHcgPSBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyQ29kZSk7Ci0gICAgaWYodyA9PSAwKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICAgICAgcEZvbnQtPkFwcGVuZENoYXIoc3RyLCBjaGFyQ29kZSk7Ci0gICAgICAgIHcgPSBwRm9udC0+R2V0U3RyaW5nV2lkdGgoc3RyLCAxKTsKLSAgICAgICAgaWYodyA9PSAwKSB7Ci0gICAgICAgICAgICBGWF9SRUNUIEJCb3g7Ci0gICAgICAgICAgICBwRm9udC0+R2V0Q2hhckJCb3goY2hhckNvZGUsIEJCb3gpOwotICAgICAgICAgICAgdyA9IEJCb3gucmlnaHQgLSBCQm94LmxlZnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHc7Ci19Ci12b2lkIENQREZfVGV4dFBhZ2U6Ok9uUGllY2UoSUZYX0JpZGlDaGFyKiBwQmlkaSwgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLXsKLSAgICBpbnQzMl90IHN0YXJ0LCBjb3VudDsKLSAgICBpbnQzMl90IHJldCA9IHBCaWRpLT5HZXRCaWRpSW5mbyhzdGFydCwgY291bnQpOwotICAgIGlmKHJldCA9PSAyKSB7Ci0gICAgICAgIGZvcihpbnQgaSA9IHN0YXJ0ICsgY291bnQgLSAxOyBpID49IHN0YXJ0OyBpLS0pIHsKLSAgICAgICAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKHN0ci5HZXRBdChpKSk7Ci0gICAgICAgICAgICBtX2NoYXJMaXN0LkFkZCgqKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KGkpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50IDsKLSAgICAgICAgZm9yKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewotICAgICAgICAgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIoc3RyLkdldEF0KGkpKTsKLSAgICAgICAgICAgIG1fY2hhckxpc3QuQWRkKCooUEFHRUNIQVJfSU5GTyopbV9UZW1wQ2hhckxpc3QuR2V0QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBDUERGX1RleHRQYWdlOjpBZGRDaGFySW5mb0J5TFJEaXJlY3Rpb24oQ0ZYX1dpZGVTdHJpbmcmIHN0ciwgaW50IGkpCi17Ci0gICAgUEFHRUNIQVJfSU5GTyBJbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX1RlbXBDaGFyTGlzdC5HZXRBdChpKTsKLSAgICBGWF9XQ0hBUiB3Q2hhciA9IHN0ci5HZXRBdChpKTsKLSAgICBpZighSXNDb250cm9sQ2hhcihJbmZvKSkgewotICAgICAgICBJbmZvLm1fSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIGlmICh3Q2hhciA+PSAweEZCMDAgJiYgd0NoYXIgPD0gMHhGQjA2KSB7Ci0gICAgICAgICAgICBGWF9XQ0hBUiogcERzdCA9IE5VTEw7Ci0gICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3VudCA9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Q2hhciwgcERzdCk7Ci0gICAgICAgICAgICBpZiAobkNvdW50ID49IDEpIHsKLSAgICAgICAgICAgICAgICBwRHN0ID0gRlhfQWxsb2MoRlhfV0NIQVIsIG5Db3VudCk7Ci0gICAgICAgICAgICAgICAgRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBuSW5kZXggPSAwOyBuSW5kZXggPCBuQ291bnQ7IG5JbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBBR0VDSEFSX0lORk8gSW5mbzIgPSBJbmZvOwotICAgICAgICAgICAgICAgICAgICBJbmZvMi5tX1VuaWNvZGUgPSBwRHN0W25JbmRleF07Ci0gICAgICAgICAgICAgICAgICAgIEluZm8yLm1fRmxhZyA9IEZQREZURVhUX0NIQVJfUElFQ0U7Ci0gICAgICAgICAgICAgICAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKEluZm8yLm1fVW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhbV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2NoYXJMaXN0LkFkZChJbmZvMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfRnJlZShwRHN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIod0NoYXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEluZm8ubV9JbmRleCA9IC0xOwotICAgIH0KLSAgICBpZiggIW1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICBtX2NoYXJMaXN0LkFkZChJbmZvKTsKLSAgICB9Ci19Ci12b2lkIENQREZfVGV4dFBhZ2U6OkFkZENoYXJJbmZvQnlSTERpcmVjdGlvbihDRlhfV2lkZVN0cmluZyYgc3RyLCBpbnQgaSkKLXsKLSAgICBQQUdFQ0hBUl9JTkZPIEluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KGkpOwotICAgIGlmKCFJc0NvbnRyb2xDaGFyKEluZm8pKSB7Ci0gICAgICAgIEluZm8ubV9JbmRleCA9IG1fVGV4dEJ1Zi5HZXRMZW5ndGgoKTsKLSAgICAgICAgRlhfV0NIQVIgd0NoYXIgPSBGWF9HZXRNaXJyb3JDaGFyKHN0ci5HZXRBdChpKSwgVFJVRSwgRkFMU0UpOwotICAgICAgICBGWF9XQ0hBUiogcERzdCA9IE5VTEw7Ci0gICAgICAgIEZYX1NUUlNJWkUgbkNvdW50ID0gRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKLSAgICAgICAgaWYgKG5Db3VudCA+PSAxKSB7Ci0gICAgICAgICAgICBwRHN0ID0gRlhfQWxsb2MoRlhfV0NIQVIsIG5Db3VudCk7Ci0gICAgICAgICAgICBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOwotICAgICAgICAgICAgZm9yIChpbnQgbkluZGV4ID0gMDsgbkluZGV4IDwgbkNvdW50OyBuSW5kZXgrKykgewotICAgICAgICAgICAgICAgIFBBR0VDSEFSX0lORk8gSW5mbzIgPSBJbmZvOwotICAgICAgICAgICAgICAgIEluZm8yLm1fVW5pY29kZSA9IHBEc3RbbkluZGV4XTsKLSAgICAgICAgICAgICAgICBJbmZvMi5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX1BJRUNFOwotICAgICAgICAgICAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKEluZm8yLm1fVW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgaWYoICFtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9jaGFyTGlzdC5BZGQoSW5mbzIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0ZyZWUocERzdCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgSW5mby5tX1VuaWNvZGUgPSB3Q2hhcjsKLSAgICAgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIoSW5mby5tX1VuaWNvZGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEluZm8ubV9JbmRleCA9IC0xOwotICAgIH0KLSAgICBpZiggIW1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICBtX2NoYXJMaXN0LkFkZChJbmZvKTsKLSAgICB9Ci19Ci12b2lkIENQREZfVGV4dFBhZ2U6OkNsb3NlVGVtcExpbmUoKQotewotICAgIGludCBjb3VudDEgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgaWYgKGNvdW50MSA8PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPElGWF9CaWRpQ2hhcj4gcEJpZGlDaGFyKElGWF9CaWRpQ2hhcjo6Q3JlYXRlKCkpOwotICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IG1fVGVtcFRleHRCdWYuR2V0V2lkZVN0cmluZygpOwotICAgIENGWF9Xb3JkQXJyYXkgb3JkZXI7Ci0gICAgRlhfQk9PTCBiUjJMID0gRkFMU0U7Ci0gICAgaW50MzJfdCBzdGFydCA9IDAsIGNvdW50ID0gMDsKLSAgICBpbnQgblIyTCA9IDAsIG5MMlIgPSAwOwotICAgIEZYX0JPT0wgYlByZXZTcGFjZSA9IEZBTFNFOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgaWYoc3RyLkdldEF0KGkpID09IDMyKSB7Ci0gICAgICAgICAgICBpZihiUHJldlNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgbV9UZW1wVGV4dEJ1Zi5EZWxldGUoaSwgMSk7Ci0gICAgICAgICAgICAgICAgbV9UZW1wQ2hhckxpc3QuRGVsZXRlKGkpOwotICAgICAgICAgICAgICAgIHN0ci5EZWxldGUoaSk7Ci0gICAgICAgICAgICAgICAgY291bnQxLS07Ci0gICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYlByZXZTcGFjZSA9IFRSVUU7CisgICAgbV9MaW5lT2JqLkFkZChPYmopOworICAgIHJldHVybjsKKyAgfQorICBpbnQgaSA9IDA7CisgIGlmIChtX1BhcnNlT3B0aW9ucy5tX2JOb3JtYWxpemVPYmpzKSB7CisgICAgZm9yIChpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgUERGVEVYVF9PYmogcHJldl9PYmogPSBtX0xpbmVPYmouR2V0QXQoaSk7CisgICAgICBDRlhfQWZmaW5lTWF0cml4IHByZXZfbWF0cml4OworICAgICAgcHJldl9PYmoubV9wVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgmcHJldl9tYXRyaXgpOworICAgICAgRlhfRkxPQVQgUHJldl94ID0gcHJldl9PYmoubV9wVGV4dE9iai0+R2V0UG9zWCgpLAorICAgICAgICAgICAgICAgUHJldl95ID0gcHJldl9PYmoubV9wVGV4dE9iai0+R2V0UG9zWSgpOworICAgICAgcHJldl9PYmoubV9mb3JtTWF0cml4LlRyYW5zZm9ybShQcmV2X3gsIFByZXZfeSk7CisgICAgICBtX0Rpc3BsYXlNYXRyaXguVHJhbnNmb3JtKFByZXZfeCwgUHJldl95KTsKKyAgICAgIGlmICh0aGlzX3ggPj0gUHJldl94KSB7CisgICAgICAgIGlmIChpID09IGNvdW50IC0gMSkgeworICAgICAgICAgIG1fTGluZU9iai5BZGQoT2JqKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJQcmV2U3BhY2UgPSBGQUxTRTsKKyAgICAgICAgICBtX0xpbmVPYmouSW5zZXJ0QXQoaSArIDEsIE9iaik7CiAgICAgICAgIH0KLSAgICAgICAgaWYocEJpZGlDaGFyLT5BcHBlbmRDaGFyKHN0ci5HZXRBdChpKSkpIHsKLSAgICAgICAgICAgIGludDMyX3QgcmV0ID0gcEJpZGlDaGFyLT5HZXRCaWRpSW5mbyhzdGFydCwgY291bnQpOwotICAgICAgICAgICAgb3JkZXIuQWRkKHN0YXJ0KTsKLSAgICAgICAgICAgIG9yZGVyLkFkZChjb3VudCk7Ci0gICAgICAgICAgICBvcmRlci5BZGQocmV0KTsKLSAgICAgICAgICAgIGlmKCFiUjJMKSB7Ci0gICAgICAgICAgICAgICAgaWYocmV0ID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgblIyTCsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbkwyUisrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYocEJpZGlDaGFyLT5FbmRDaGFyKCkpIHsKLSAgICAgICAgaW50MzJfdCByZXQgPSBwQmlkaUNoYXItPkdldEJpZGlJbmZvKHN0YXJ0LCBjb3VudCk7Ci0gICAgICAgIG9yZGVyLkFkZChzdGFydCk7Ci0gICAgICAgIG9yZGVyLkFkZChjb3VudCk7Ci0gICAgICAgIG9yZGVyLkFkZChyZXQpOwotICAgICAgICBpZighYlIyTCkgewotICAgICAgICAgICAgaWYocmV0ID09IDIpIHsKLSAgICAgICAgICAgICAgICBuUjJMKys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYocmV0ID09IDEpIHsKLSAgICAgICAgICAgICAgICBuTDJSKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBpZiAoaSA8IDApIHsKKyAgICAgIG1fTGluZU9iai5JbnNlcnRBdCgwLCBPYmopOwogICAgIH0KLSAgICBpZihuUjJMID4gMCAmJiBuUjJMID49IG5MMlIpIHsKLSAgICAgICAgYlIyTCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgbV9MaW5lT2JqLkFkZChPYmopOworICB9Cit9CitpbnQzMl90IENQREZfVGV4dFBhZ2U6OlByZU1hcmtlZENvbnRlbnQoUERGVEVYVF9PYmogT2JqKSB7CisgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBPYmoubV9wVGV4dE9iajsKKyAgQ1BERl9Db250ZW50TWFya0RhdGEqIHBNYXJrRGF0YSA9CisgICAgICAoQ1BERl9Db250ZW50TWFya0RhdGEqKXBUZXh0T2JqLT5tX0NvbnRlbnRNYXJrLkdldE9iamVjdCgpOworICBpZiAoIXBNYXJrRGF0YSkgeworICAgIHJldHVybiBGUERGVEVYVF9NQ19QQVNTOworICB9CisgIGludCBuQ29udGVudE1hcmsgPSBwTWFya0RhdGEtPkNvdW50SXRlbXMoKTsKKyAgaWYgKG5Db250ZW50TWFyayA8IDEpIHsKKyAgICByZXR1cm4gRlBERlRFWFRfTUNfUEFTUzsKKyAgfQorICBDRlhfV2lkZVN0cmluZyBhY3RUZXh0OworICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gTlVMTDsKKyAgaW50IG4gPSAwOworICBmb3IgKG4gPSAwOyBuIDwgbkNvbnRlbnRNYXJrOyBuKyspIHsKKyAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IHBNYXJrRGF0YS0+R2V0SXRlbShuKTsKKyAgICBDRlhfQnl0ZVN0cmluZyB0YWdTdHIgPSAoQ0ZYX0J5dGVTdHJpbmcpaXRlbS5HZXROYW1lKCk7CisgICAgcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilpdGVtLkdldFBhcmFtKCk7CisgICAgQ1BERl9TdHJpbmcqIHRlbXAgPQorICAgICAgICAoQ1BERl9TdHJpbmcqKShwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJBY3R1YWxUZXh0IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCk7CisgICAgaWYgKHRlbXApIHsKKyAgICAgIGJFeGlzdCA9IFRSVUU7CisgICAgICBhY3RUZXh0ID0gdGVtcC0+R2V0VW5pY29kZVRleHQoKTsKICAgICB9Ci0gICAgaWYgKG1fcGFyc2VyZmxhZyA9PSBGUERGVEVYVF9STFRCIHx8IGJSMkwpIHsKLSAgICAgICAgaW50IGNvdW50ID0gb3JkZXIuR2V0U2l6ZSgpOwotICAgICAgICBmb3IoaW50IGkgPSBjb3VudCAtIDE7IGkgPiAwOyBpIC09IDMpIHsKLSAgICAgICAgICAgIGludCByZXQgPSBvcmRlci5HZXRBdChpKTsKLSAgICAgICAgICAgIGludCBzdGFydCA9IG9yZGVyLkdldEF0KGkgLSAyKTsKLSAgICAgICAgICAgIGludCBjb3VudDEgPSBvcmRlci5HZXRBdChpIC0gMSk7Ci0gICAgICAgICAgICBpZihyZXQgPT0gMiB8fCByZXQgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvcihpbnQgaiA9IHN0YXJ0ICsgY291bnQxIC0gMTsgaiA+PSBzdGFydDsgai0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkZENoYXJJbmZvQnlSTERpcmVjdGlvbihzdHIsIGopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGogPSBpOwotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bWJvbCA9IEZBTFNFOwotICAgICAgICAgICAgICAgIHdoaWxlKGogPiAwICYmIG9yZGVyLkdldEF0KGopICE9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgYlN5bWJvbCA9ICFvcmRlci5HZXRBdChqKTsKLSAgICAgICAgICAgICAgICAgICAgaiAtPSAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyBjb3VudDEgOwotICAgICAgICAgICAgICAgIGludCBuID0gMDsKLSAgICAgICAgICAgICAgICBpZihiU3ltYm9sKSB7Ci0gICAgICAgICAgICAgICAgICAgIG4gPSBqICsgNjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuID0gaiArIDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKG4gPj0gaSkgewotICAgICAgICAgICAgICAgICAgICBmb3IoaW50IG0gPSBzdGFydDsgbSA8IGVuZDsgbSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZGRDaGFySW5mb0J5TFJEaXJlY3Rpb24oc3RyLCBtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgICAgICAgICBpID0gbjsKLSAgICAgICAgICAgICAgICAgICAgZm9yKDsgbiA8PSBqOyBuICs9IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCA9IG9yZGVyLkdldEF0KG4gLSAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudDEgPSBvcmRlci5HZXRBdChuIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyBjb3VudDEgOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBtID0gc3RhcnQ7IG0gPCBlbmQ7IG0rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZENoYXJJbmZvQnlMUkRpcmVjdGlvbihzdHIsIG0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICB9CisgIGlmICghYkV4aXN0KSB7CisgICAgcmV0dXJuIEZQREZURVhUX01DX1BBU1M7CisgIH0KKyAgaWYgKG1fcFByZVRleHRPYmopIHsKKyAgICBpZiAoQ1BERl9Db250ZW50TWFya0RhdGEqIHBQcmVNYXJrRGF0YSA9CisgICAgICAgICAgICAoQ1BERl9Db250ZW50TWFya0RhdGEqKW1fcFByZVRleHRPYmotPm1fQ29udGVudE1hcmsuR2V0T2JqZWN0KCkpIHsKKyAgICAgIGlmIChwUHJlTWFya0RhdGEtPkNvdW50SXRlbXMoKSA9PSBuKSB7CisgICAgICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gcFByZU1hcmtEYXRhLT5HZXRJdGVtKG4gLSAxKTsKKyAgICAgICAgaWYgKHBEaWN0ID09IGl0ZW0uR2V0UGFyYW0oKSkgeworICAgICAgICAgIHJldHVybiBGUERGVEVYVF9NQ19ET05FOwogICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOworICBGWF9TVFJTSVpFIG5JdGVtcyA9IGFjdFRleHQuR2V0TGVuZ3RoKCk7CisgIGlmIChuSXRlbXMgPCAxKSB7CisgICAgcmV0dXJuIEZQREZURVhUX01DX1BBU1M7CisgIH0KKyAgYkV4aXN0ID0gRkFMU0U7CisgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IG5JdGVtczsgaSsrKSB7CisgICAgRlhfV0NIQVIgd0NoYXIgPSBhY3RUZXh0LkdldEF0KGkpOworICAgIGlmICgtMSA9PSBwRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3Q2hhcikpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBjb3VudCA9IG9yZGVyLkdldFNpemUoKTsKLSAgICAgICAgRlhfQk9PTCBiTDJSID0gRkFMU0U7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArPSAzKSB7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gb3JkZXIuR2V0QXQoaSArIDIpOwotICAgICAgICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQoaSk7Ci0gICAgICAgICAgICBpbnQgY291bnQxID0gb3JkZXIuR2V0QXQoaSArIDEpOwotICAgICAgICAgICAgaWYocmV0ID09IDIgfHwgKGkgPT0gMCAmJiByZXQgPT0gMCAmJiAhYkwyUikpIHsKLSAgICAgICAgICAgICAgICBpbnQgaiA9IGkgKyAzOwotICAgICAgICAgICAgICAgIHdoaWxlKGJSMkwgJiYgaiA8IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG9yZGVyLkdldEF0KGogKyAyKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihqID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgaSA9IC0zOwotICAgICAgICAgICAgICAgICAgICBiTDJSID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBlbmQgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSAxOwotICAgICAgICAgICAgICAgIGlmKGogPCBjb3VudCkgewotICAgICAgICAgICAgICAgICAgICBlbmQgPSBvcmRlci5HZXRBdChqKSAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkgPSBqIC0gMzsKLSAgICAgICAgICAgICAgICBmb3IoaW50IG4gPSBlbmQ7IG4gPj0gc3RhcnQ7IG4tLSkgewotICAgICAgICAgICAgICAgICAgICBBZGRDaGFySW5mb0J5UkxEaXJlY3Rpb24oc3RyLCBuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50MSA7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBuID0gc3RhcnQ7IG4gPCBlbmQ7IG4rKykgewotICAgICAgICAgICAgICAgICAgICBBZGRDaGFySW5mb0J5TFJEaXJlY3Rpb24oc3RyLCBuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIGJFeGlzdCA9IFRSVUU7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgb3JkZXIuUmVtb3ZlQWxsKCk7Ci0gICAgbV9UZW1wQ2hhckxpc3QuUmVtb3ZlQWxsKCk7Ci0gICAgbV9UZW1wVGV4dEJ1Zi5EZWxldGUoMCwgbV9UZW1wVGV4dEJ1Zi5HZXRMZW5ndGgoKSk7CisgIH0KKyAgaWYgKCFiRXhpc3QpIHsKKyAgICByZXR1cm4gRlBERlRFWFRfTUNfUEFTUzsKKyAgfQorICBiRXhpc3QgPSBGQUxTRTsKKyAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbkl0ZW1zOyBpKyspIHsKKyAgICBGWF9XQ0hBUiB3Q2hhciA9IGFjdFRleHQuR2V0QXQoaSk7CisgICAgaWYgKCh3Q2hhciA+IDB4ODAgJiYgd0NoYXIgPCAweEZGRkQpIHx8ICh3Q2hhciA8PSAweDgwICYmIGlzcHJpbnQod0NoYXIpKSkgeworICAgICAgYkV4aXN0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIWJFeGlzdCkgeworICAgIHJldHVybiBGUERGVEVYVF9NQ19ET05FOworICB9CisgIHJldHVybiBGUERGVEVYVF9NQ19ERUxBWTsKIH0KLXZvaWQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc1RleHRPYmplY3QoQ1BERl9UZXh0T2JqZWN0KglwVGV4dE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgZm9ybU1hdHJpeCwgRlhfUE9TSVRJT04gT2JqUG9zKQotewotICAgIENGWF9GbG9hdFJlY3QgcmUocFRleHRPYmotPm1fTGVmdCwgcFRleHRPYmotPm1fQm90dG9tLCBwVGV4dE9iai0+bV9SaWdodCwgcFRleHRPYmotPm1fVG9wKTsKLSAgICBpZihGWFNZU19mYWJzKHBUZXh0T2JqLT5tX1JpZ2h0IC0gcFRleHRPYmotPm1fTGVmdCkgPCAwLjAxZiApIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDUERGX1RleHRQYWdlOjpQcm9jZXNzTWFya2VkQ29udGVudChQREZURVhUX09iaiBPYmopIHsKKyAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IE9iai5tX3BUZXh0T2JqOworICBDUERGX0NvbnRlbnRNYXJrRGF0YSogcE1hcmtEYXRhID0KKyAgICAgIChDUERGX0NvbnRlbnRNYXJrRGF0YSopcFRleHRPYmotPm1fQ29udGVudE1hcmsuR2V0T2JqZWN0KCk7CisgIGlmICghcE1hcmtEYXRhKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBuQ29udGVudE1hcmsgPSBwTWFya0RhdGEtPkNvdW50SXRlbXMoKTsKKyAgaWYgKG5Db250ZW50TWFyayA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgYWN0VGV4dDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IE5VTEw7CisgIGludCBuID0gMDsKKyAgZm9yIChuID0gMDsgbiA8IG5Db250ZW50TWFyazsgbisrKSB7CisgICAgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBwTWFya0RhdGEtPkdldEl0ZW0obik7CisgICAgQ0ZYX0J5dGVTdHJpbmcgdGFnU3RyID0gKENGWF9CeXRlU3RyaW5nKWl0ZW0uR2V0TmFtZSgpOworICAgIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopaXRlbS5HZXRQYXJhbSgpOworICAgIENQREZfU3RyaW5nKiB0ZW1wID0gKENQREZfU3RyaW5nKilwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiQWN0dWFsVGV4dCIpKTsKKyAgICBpZiAodGVtcCkgeworICAgICAgYWN0VGV4dCA9IHRlbXAtPkdldFVuaWNvZGVUZXh0KCk7CiAgICAgfQotICAgIGludCBjb3VudCA9IG1fTGluZU9iai5HZXRTaXplKCk7Ci0gICAgUERGVEVYVF9PYmogT2JqOwotICAgIE9iai5tX3BUZXh0T2JqID0gcFRleHRPYmo7Ci0gICAgT2JqLm1fZm9ybU1hdHJpeCA9IGZvcm1NYXRyaXg7Ci0gICAgaWYoY291bnQgPT0gMCkgewotICAgICAgICBtX0xpbmVPYmouQWRkKE9iaik7Ci0gICAgICAgIHJldHVybjsKKyAgfQorICBGWF9TVFJTSVpFIG5JdGVtcyA9IGFjdFRleHQuR2V0TGVuZ3RoKCk7CisgIGlmIChuSXRlbXMgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOworICBDRlhfQWZmaW5lTWF0cml4IGZvcm1NYXRyaXggPSBPYmoubV9mb3JtTWF0cml4OworICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKKyAgcFRleHRPYmotPkdldFRleHRNYXRyaXgoJm1hdHJpeCk7CisgIG1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7CisgIEZYX0ZMT0FUIGZQb3NYID0gcFRleHRPYmotPkdldFBvc1goKTsKKyAgRlhfRkxPQVQgZlBvc1kgPSBwVGV4dE9iai0+R2V0UG9zWSgpOworICBpbnQgbkNoYXJJbmZvSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7CisgIENGWF9GbG9hdFJlY3QgY2hhckJveDsKKyAgY2hhckJveC50b3AgPSBwVGV4dE9iai0+bV9Ub3A7CisgIGNoYXJCb3gubGVmdCA9IHBUZXh0T2JqLT5tX0xlZnQ7CisgIGNoYXJCb3gucmlnaHQgPSBwVGV4dE9iai0+bV9SaWdodDsKKyAgY2hhckJveC5ib3R0b20gPSBwVGV4dE9iai0+bV9Cb3R0b207CisgIGZvciAoRlhfU1RSU0laRSBrID0gMDsgayA8IG5JdGVtczsgaysrKSB7CisgICAgRlhfV0NIQVIgd0NoYXIgPSBhY3RUZXh0LkdldEF0KGspOworICAgIGlmICh3Q2hhciA8PSAweDgwICYmICFpc3ByaW50KHdDaGFyKSkgeworICAgICAgd0NoYXIgPSAweDIwOwogICAgIH0KLSAgICBpZiAoSXNTYW1lQXNQcmVUZXh0T2JqZWN0KHBUZXh0T2JqLCBPYmpQb3MpKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAod0NoYXIgPj0gMHhGRkZEKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgUERGVEVYVF9PYmogcHJldl9PYmogPSBtX0xpbmVPYmouR2V0QXQoY291bnQgLSAxKTsKLSAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gICAgaW50IG5JdGVtID0gcHJldl9PYmoubV9wVGV4dE9iai0+Q291bnRJdGVtcygpOwotICAgIHByZXZfT2JqLm1fcFRleHRPYmotPkdldEl0ZW1JbmZvKG5JdGVtIC0gMSwgJml0ZW0pOwotICAgIEZYX0ZMT0FUIHByZXZfd2lkdGggPSBHZXRDaGFyV2lkdGgoaXRlbS5tX0NoYXJDb2RlLCBwcmV2X09iai5tX3BUZXh0T2JqLT5HZXRGb250KCkpICogcHJldl9PYmoubV9wVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBwcmV2X21hdHJpeDsKLSAgICBwcmV2X09iai5tX3BUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZwcmV2X21hdHJpeCk7Ci0gICAgcHJldl93aWR0aCA9IEZYU1lTX2ZhYnMocHJldl93aWR0aCk7Ci0gICAgcHJldl9tYXRyaXguQ29uY2F0KHByZXZfT2JqLm1fZm9ybU1hdHJpeCk7Ci0gICAgcHJldl93aWR0aCA9IHByZXZfbWF0cml4LlRyYW5zZm9ybURpc3RhbmNlKHByZXZfd2lkdGgpOwotICAgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbygwLCAmaXRlbSk7Ci0gICAgRlhfRkxPQVQgdGhpc193aWR0aCA9IEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHBUZXh0T2JqLT5HZXRGb250KCkpICogcFRleHRPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgIHRoaXNfd2lkdGggPSBGWFNZU19mYWJzKHRoaXNfd2lkdGgpOwotICAgIENGWF9BZmZpbmVNYXRyaXggdGhpc19tYXRyaXg7Ci0gICAgcFRleHRPYmotPkdldFRleHRNYXRyaXgoJnRoaXNfbWF0cml4KTsKLSAgICB0aGlzX3dpZHRoID0gRlhTWVNfZmFicyh0aGlzX3dpZHRoKTsKLSAgICB0aGlzX21hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7Ci0gICAgdGhpc193aWR0aCA9IHRoaXNfbWF0cml4LlRyYW5zZm9ybURpc3RhbmNlKHRoaXNfd2lkdGgpOwotICAgIEZYX0ZMT0FUIHRocmVzaG9sZCA9IHByZXZfd2lkdGggPiB0aGlzX3dpZHRoID8gcHJldl93aWR0aCAvIDQgOiB0aGlzX3dpZHRoIC8gNDsKLSAgICBGWF9GTE9BVCBwcmV2X3ggPSBwcmV2X09iai5tX3BUZXh0T2JqLT5HZXRQb3NYKCksIHByZXZfeSA9IHByZXZfT2JqLm1fcFRleHRPYmotPkdldFBvc1koKTsKLSAgICBwcmV2X09iai5tX2Zvcm1NYXRyaXguVHJhbnNmb3JtKHByZXZfeCwgcHJldl95KTsKLSAgICBtX0Rpc3BsYXlNYXRyaXguVHJhbnNmb3JtKHByZXZfeCwgcHJldl95KTsKLSAgICBGWF9GTE9BVCB0aGlzX3ggPSBwVGV4dE9iai0+R2V0UG9zWCgpLCB0aGlzX3kgPSBwVGV4dE9iai0+R2V0UG9zWSgpOwotICAgIGZvcm1NYXRyaXguVHJhbnNmb3JtKHRoaXNfeCwgdGhpc195KTsKLSAgICBtX0Rpc3BsYXlNYXRyaXguVHJhbnNmb3JtKHRoaXNfeCwgdGhpc195KTsKLSAgICBpZiAoRlhTWVNfZmFicyh0aGlzX3kgLSBwcmV2X3kpID4gdGhyZXNob2xkICogMikgewotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgUHJvY2Vzc1RleHRPYmplY3QobV9MaW5lT2JqLkdldEF0KGkpKTsKLSAgICAgICAgfQotICAgICAgICBtX0xpbmVPYmouUmVtb3ZlQWxsKCk7Ci0gICAgICAgIG1fTGluZU9iai5BZGQoT2JqKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgaSA9IDA7Ci0gICAgaWYobV9QYXJzZU9wdGlvbnMubV9iTm9ybWFsaXplT2JqcykgewotICAgICAgICBmb3IoaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIFBERlRFWFRfT2JqIHByZXZfT2JqID0gbV9MaW5lT2JqLkdldEF0KGkpOwotICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBwcmV2X21hdHJpeDsKLSAgICAgICAgICAgIHByZXZfT2JqLm1fcFRleHRPYmotPkdldFRleHRNYXRyaXgoJnByZXZfbWF0cml4KTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIFByZXZfeCA9IHByZXZfT2JqLm1fcFRleHRPYmotPkdldFBvc1goKSwgUHJldl95ID0gcHJldl9PYmoubV9wVGV4dE9iai0+R2V0UG9zWSgpOwotICAgICAgICAgICAgcHJldl9PYmoubV9mb3JtTWF0cml4LlRyYW5zZm9ybShQcmV2X3gsIFByZXZfeSk7Ci0gICAgICAgICAgICBtX0Rpc3BsYXlNYXRyaXguVHJhbnNmb3JtKFByZXZfeCwgUHJldl95KTsKLSAgICAgICAgICAgIGlmKHRoaXNfeCA+PSBQcmV2X3gpIHsKLSAgICAgICAgICAgICAgICBpZihpID09IGNvdW50IC0gMSkgewotICAgICAgICAgICAgICAgICAgICBtX0xpbmVPYmouQWRkKE9iaik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9MaW5lT2JqLkluc2VydEF0KGkgKyAxLCBPYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihpIDwgMCkgewotICAgICAgICAgICAgbV9MaW5lT2JqLkluc2VydEF0KDAsIE9iaik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX0xpbmVPYmouQWRkKE9iaik7Ci0gICAgfQorICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm87CisgICAgY2hhcmluZm8ubV9PcmlnaW5YID0gZlBvc1g7CisgICAgY2hhcmluZm8ubV9PcmlnaW5ZID0gZlBvc1k7CisgICAgY2hhcmluZm8ubV9JbmRleCA9IG5DaGFySW5mb0luZGV4OworICAgIGNoYXJpbmZvLm1fVW5pY29kZSA9IHdDaGFyOworICAgIGNoYXJpbmZvLm1fQ2hhckNvZGUgPSBwRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3Q2hhcik7CisgICAgY2hhcmluZm8ubV9GbGFnID0gRlBERlRFWFRfQ0hBUl9QSUVDRTsKKyAgICBjaGFyaW5mby5tX3BUZXh0T2JqID0gcFRleHRPYmo7CisgICAgY2hhcmluZm8ubV9DaGFyQm94LnRvcCA9IGNoYXJCb3gudG9wOworICAgIGNoYXJpbmZvLm1fQ2hhckJveC5sZWZ0ID0gY2hhckJveC5sZWZ0OworICAgIGNoYXJpbmZvLm1fQ2hhckJveC5yaWdodCA9IGNoYXJCb3gucmlnaHQ7CisgICAgY2hhcmluZm8ubV9DaGFyQm94LmJvdHRvbSA9IGNoYXJCb3guYm90dG9tOworICAgIGNoYXJpbmZvLm1fTWF0cml4LkNvcHkobWF0cml4KTsKKyAgICBtX1RlbXBUZXh0QnVmLkFwcGVuZENoYXIod0NoYXIpOworICAgIG1fVGVtcENoYXJMaXN0LkFkZChjaGFyaW5mbyk7CisgIH0KIH0KLWludDMyX3QgQ1BERl9UZXh0UGFnZTo6UHJlTWFya2VkQ29udGVudChQREZURVhUX09iaiBPYmopCi17Ci0gICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IE9iai5tX3BUZXh0T2JqOwotICAgIENQREZfQ29udGVudE1hcmtEYXRhKiBwTWFya0RhdGEgPSAoQ1BERl9Db250ZW50TWFya0RhdGEqKXBUZXh0T2JqLT5tX0NvbnRlbnRNYXJrLkdldE9iamVjdCgpOwotICAgIGlmKCFwTWFya0RhdGEpIHsKLSAgICAgICAgcmV0dXJuIEZQREZURVhUX01DX1BBU1M7Ci0gICAgfQotICAgIGludCBuQ29udGVudE1hcmsgPSBwTWFya0RhdGEtPkNvdW50SXRlbXMoKTsKLSAgICBpZiAobkNvbnRlbnRNYXJrIDwgMSkgewotICAgICAgICByZXR1cm4gRlBERlRFWFRfTUNfUEFTUzsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgYWN0VGV4dDsKLSAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMOwotICAgIGludCBuID0gMDsKLSAgICBmb3IgKG4gPSAwOyBuIDwgbkNvbnRlbnRNYXJrOyBuKyspIHsKLSAgICAgICAgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBwTWFya0RhdGEtPkdldEl0ZW0obik7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHRhZ1N0ciA9IChDRlhfQnl0ZVN0cmluZylpdGVtLkdldE5hbWUoKTsKLSAgICAgICAgcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilpdGVtLkdldFBhcmFtKCk7Ci0gICAgICAgIENQREZfU3RyaW5nKiB0ZW1wID0gKENQREZfU3RyaW5nKikocERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiQWN0dWFsVGV4dCIpKSA6IE5VTEwpOwotICAgICAgICBpZiAodGVtcCkgewotICAgICAgICAgICAgYkV4aXN0ID0gVFJVRTsKLSAgICAgICAgICAgIGFjdFRleHQgPSB0ZW1wLT5HZXRVbmljb2RlVGV4dCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIHJldHVybiBGUERGVEVYVF9NQ19QQVNTOwotICAgIH0KLSAgICBpZiAobV9wUHJlVGV4dE9iaikgewotICAgICAgICBpZiAoQ1BERl9Db250ZW50TWFya0RhdGEqIHBQcmVNYXJrRGF0YSA9IChDUERGX0NvbnRlbnRNYXJrRGF0YSopbV9wUHJlVGV4dE9iai0+bV9Db250ZW50TWFyay5HZXRPYmplY3QoKSkgewotICAgICAgICAgICAgaWYgKHBQcmVNYXJrRGF0YS0+Q291bnRJdGVtcygpID09IG4pIHsKLSAgICAgICAgICAgICAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IHBQcmVNYXJrRGF0YS0+R2V0SXRlbShuIC0gMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBEaWN0ID09IGl0ZW0uR2V0UGFyYW0oKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlBERlRFWFRfTUNfRE9ORTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9Gb250KglwRm9udCA9IHBUZXh0T2JqLT5HZXRGb250KCk7Ci0gICAgRlhfU1RSU0laRSBuSXRlbXMgPSBhY3RUZXh0LkdldExlbmd0aCgpOwotICAgIGlmIChuSXRlbXMgPCAxKSB7Ci0gICAgICAgIHJldHVybiBGUERGVEVYVF9NQ19QQVNTOwotICAgIH0KLSAgICBiRXhpc3QgPSBGQUxTRTsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgewotICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IGFjdFRleHQuR2V0QXQoaSk7Ci0gICAgICAgIGlmICgtMSA9PSBwRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3Q2hhcikpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYkV4aXN0ID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIHJldHVybiBGUERGVEVYVF9NQ19QQVNTOwotICAgIH0KLSAgICBiRXhpc3QgPSBGQUxTRTsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgewotICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IGFjdFRleHQuR2V0QXQoaSk7Ci0gICAgICAgIGlmICgod0NoYXIgPiAweDgwICYmIHdDaGFyIDwgMHhGRkZEKSB8fCAod0NoYXIgPD0gMHg4MCAmJiBpc3ByaW50KHdDaGFyKSkpIHsKLSAgICAgICAgICAgIGJFeGlzdCA9IFRSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWJFeGlzdCkgewotICAgICAgICByZXR1cm4gRlBERlRFWFRfTUNfRE9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIEZQREZURVhUX01DX0RFTEFZOwordm9pZCBDUERGX1RleHRQYWdlOjpGaW5kUHJldmlvdXNUZXh0T2JqZWN0KHZvaWQpIHsKKyAgaWYgKG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSA8IDEgJiYgbV9jaGFyTGlzdC5HZXRTaXplKCkgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIFBBR0VDSEFSX0lORk8gcHJlQ2hhcjsKKyAgaWYgKG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSA+PSAxKSB7CisgICAgcHJlQ2hhciA9CisgICAgICAgICooUEFHRUNIQVJfSU5GTyopbV9UZW1wQ2hhckxpc3QuR2V0QXQobV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIC0gMSk7CisgIH0gZWxzZSB7CisgICAgcHJlQ2hhciA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChtX2NoYXJMaXN0LkdldFNpemUoKSAtIDEpOworICB9CisgIGlmIChwcmVDaGFyLm1fcFRleHRPYmopIHsKKyAgICBtX3BQcmVUZXh0T2JqID0gcHJlQ2hhci5tX3BUZXh0T2JqOworICB9CiB9Ci12b2lkIENQREZfVGV4dFBhZ2U6OlByb2Nlc3NNYXJrZWRDb250ZW50KFBERlRFWFRfT2JqIE9iaikKLXsKLSAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gT2JqLm1fcFRleHRPYmo7Ci0gICAgQ1BERl9Db250ZW50TWFya0RhdGEqIHBNYXJrRGF0YSA9IChDUERGX0NvbnRlbnRNYXJrRGF0YSopcFRleHRPYmotPm1fQ29udGVudE1hcmsuR2V0T2JqZWN0KCk7Ci0gICAgaWYoIXBNYXJrRGF0YSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBuQ29udGVudE1hcmsgPSBwTWFya0RhdGEtPkNvdW50SXRlbXMoKTsKLSAgICBpZiAobkNvbnRlbnRNYXJrIDwgMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIGFjdFRleHQ7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IE5VTEw7Ci0gICAgaW50IG4gPSAwOwotICAgIGZvciAobiA9IDA7IG4gPCBuQ29udGVudE1hcms7IG4rKykgewotICAgICAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IHBNYXJrRGF0YS0+R2V0SXRlbShuKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdGFnU3RyID0gKENGWF9CeXRlU3RyaW5nKWl0ZW0uR2V0TmFtZSgpOwotICAgICAgICBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWl0ZW0uR2V0UGFyYW0oKTsKLSAgICAgICAgQ1BERl9TdHJpbmcqIHRlbXAgPSAoQ1BERl9TdHJpbmcqKXBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJBY3R1YWxUZXh0IikpOwotICAgICAgICBpZiAodGVtcCkgewotICAgICAgICAgICAgYWN0VGV4dCA9IHRlbXAtPkdldFVuaWNvZGVUZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfU1RSU0laRSBuSXRlbXMgPSBhY3RUZXh0LkdldExlbmd0aCgpOwotICAgIGlmIChuSXRlbXMgPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9Gb250KglwRm9udCA9IHBUZXh0T2JqLT5HZXRGb250KCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBmb3JtTWF0cml4ID0gT2JqLm1fZm9ybU1hdHJpeDsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICBwVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgmbWF0cml4KTsKLSAgICBtYXRyaXguQ29uY2F0KGZvcm1NYXRyaXgpOwotICAgIEZYX0ZMT0FUIGZQb3NYID0gcFRleHRPYmotPkdldFBvc1goKTsKLSAgICBGWF9GTE9BVCBmUG9zWSA9IHBUZXh0T2JqLT5HZXRQb3NZKCk7Ci0gICAgaW50IG5DaGFySW5mb0luZGV4ID0gbV9UZXh0QnVmLkdldExlbmd0aCgpOwotICAgIENGWF9GbG9hdFJlY3QgY2hhckJveDsKLSAgICBjaGFyQm94LnRvcCA9IHBUZXh0T2JqLT5tX1RvcDsKLSAgICBjaGFyQm94LmxlZnQgPSBwVGV4dE9iai0+bV9MZWZ0OwotICAgIGNoYXJCb3gucmlnaHQgPSBwVGV4dE9iai0+bV9SaWdodDsKLSAgICBjaGFyQm94LmJvdHRvbSA9IHBUZXh0T2JqLT5tX0JvdHRvbTsKLSAgICBmb3IgKEZYX1NUUlNJWkUgayA9IDA7IGsgPCBuSXRlbXM7IGsrKykgewotICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IGFjdFRleHQuR2V0QXQoayk7Ci0gICAgICAgIGlmICh3Q2hhciA8PSAweDgwICYmICFpc3ByaW50KHdDaGFyKSkgewotICAgICAgICAgICAgd0NoYXIgPSAweDIwOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3Q2hhciA+PSAweEZGRkQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm87Ci0gICAgICAgIGNoYXJpbmZvLm1fT3JpZ2luWCA9IGZQb3NYOwotICAgICAgICBjaGFyaW5mby5tX09yaWdpblkgPSBmUG9zWTsKLSAgICAgICAgY2hhcmluZm8ubV9JbmRleCA9IG5DaGFySW5mb0luZGV4OwotICAgICAgICBjaGFyaW5mby5tX1VuaWNvZGUgPSB3Q2hhcjsKLSAgICAgICAgY2hhcmluZm8ubV9DaGFyQ29kZSA9IHBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdDaGFyKTsKLSAgICAgICAgY2hhcmluZm8ubV9GbGFnID0gRlBERlRFWFRfQ0hBUl9QSUVDRTsKLSAgICAgICAgY2hhcmluZm8ubV9wVGV4dE9iaiA9IHBUZXh0T2JqOwotICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3gudG9wID0gY2hhckJveC50b3A7Ci0gICAgICAgIGNoYXJpbmZvLm1fQ2hhckJveC5sZWZ0ID0gY2hhckJveC5sZWZ0OwotICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3gucmlnaHQgPSBjaGFyQm94LnJpZ2h0OwotICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3guYm90dG9tID0gY2hhckJveC5ib3R0b207Ci0gICAgICAgIGNoYXJpbmZvLm1fTWF0cml4LkNvcHkobWF0cml4KTsKLSAgICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKHdDaGFyKTsKLSAgICAgICAgbV9UZW1wQ2hhckxpc3QuQWRkKGNoYXJpbmZvKTsKLSAgICB9Ci19Ci12b2lkIENQREZfVGV4dFBhZ2U6OkZpbmRQcmV2aW91c1RleHRPYmplY3Qodm9pZCkKLXsKLSAgICBpZiAobV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIDwgMSAmJiBtX2NoYXJMaXN0LkdldFNpemUoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBQQUdFQ0hBUl9JTkZPIHByZUNoYXI7Ci0gICAgaWYgKG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSA+PSAxKSB7Ci0gICAgICAgIHByZUNoYXIgPSAqKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSAtIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByZUNoYXIgPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQobV9jaGFyTGlzdC5HZXRTaXplKCkgLSAxKTsKLSAgICB9Ci0gICAgaWYgKHByZUNoYXIubV9wVGV4dE9iaikgewotICAgICAgICBtX3BQcmVUZXh0T2JqID0gcHJlQ2hhci5tX3BUZXh0T2JqOwotICAgIH0KLX0KLXZvaWQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc1RleHRPYmplY3QoUERGVEVYVF9PYmogT2JqKQotewotICAgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBPYmoubV9wVGV4dE9iajsKLSAgICBpZihGWFNZU19mYWJzKHBUZXh0T2JqLT5tX1JpZ2h0IC0gcFRleHRPYmotPm1fTGVmdCkgPCAwLjAxZiApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IGZvcm1NYXRyaXggPSBPYmoubV9mb3JtTWF0cml4OwotICAgIENQREZfRm9udCoJcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIHBUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZtYXRyaXgpOwotICAgIG1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7Ci0gICAgaW50MzJfdCBiUHJlTUtDID0gUHJlTWFya2VkQ29udGVudChPYmopOwotICAgIGlmIChGUERGVEVYVF9NQ19ET05FID09IGJQcmVNS0MpIHsKLSAgICAgICAgbV9wUHJlVGV4dE9iaiA9IHBUZXh0T2JqOwotICAgICAgICBtX3Blck1hdHJpeC5Db3B5KGZvcm1NYXRyaXgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCByZXN1bHQgPSAwOwotICAgIGlmIChtX3BQcmVUZXh0T2JqKSB7Ci0gICAgICAgIHJlc3VsdCA9IFByb2Nlc3NJbnNlcnRPYmplY3QocFRleHRPYmosIGZvcm1NYXRyaXgpOwotICAgICAgICBpZiAoMiA9PSByZXN1bHQpIHsKLSAgICAgICAgICAgIG1fQ3VybGluZVJlY3QgPSBDRlhfRmxvYXRSZWN0KE9iai5tX3BUZXh0T2JqLT5tX0xlZnQsIE9iai5tX3BUZXh0T2JqLT5tX0JvdHRvbSwgT2JqLm1fcFRleHRPYmotPm1fUmlnaHQsIE9iai5tX3BUZXh0T2JqLT5tX1RvcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0N1cmxpbmVSZWN0LlVuaW9uKENGWF9GbG9hdFJlY3QoT2JqLm1fcFRleHRPYmotPm1fTGVmdCwgT2JqLm1fcFRleHRPYmotPm1fQm90dG9tLCBPYmoubV9wVGV4dE9iai0+bV9SaWdodCwgT2JqLm1fcFRleHRPYmotPm1fVG9wKSk7Ci0gICAgICAgIH0KLSAgICAgICAgUEFHRUNIQVJfSU5GTyBnZW5lcmF0ZUNoYXI7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gMSkgewotICAgICAgICAgICAgaWYgKEdlbmVyYXRlQ2hhckluZm8oVEVYVF9CTEFOS19DSEFSLCBnZW5lcmF0ZUNoYXIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmb3JtTWF0cml4LklzSWRlbnRpdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUNoYXIubV9NYXRyaXguQ29weShmb3JtTWF0cml4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKFRFWFRfQkxBTktfQ0hBUik7Ci0gICAgICAgICAgICAgICAgbV9UZW1wQ2hhckxpc3QuQWRkKGdlbmVyYXRlQ2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZihyZXN1bHQgPT0gMikgewotICAgICAgICAgICAgQ2xvc2VUZW1wTGluZSgpOwotICAgICAgICAgICAgaWYobV9UZXh0QnVmLkdldFNpemUoKSkgewotICAgICAgICAgICAgICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICAgICAgICAgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihURVhUX1JFVFVSTl9DSEFSKTsKLSAgICAgICAgICAgICAgICAgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIoVEVYVF9MSU5FRkVFRF9DSEFSKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZihHZW5lcmF0ZUNoYXJJbmZvKFRFWFRfUkVUVVJOX0NIQVIsIGdlbmVyYXRlQ2hhcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKFRFWFRfUkVUVVJOX0NIQVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtTWF0cml4LklzSWRlbnRpdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQ2hhci5tX01hdHJpeC5Db3B5KGZvcm1NYXRyaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbV9jaGFyTGlzdC5BZGQoZ2VuZXJhdGVDaGFyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihHZW5lcmF0ZUNoYXJJbmZvKFRFWFRfTElORUZFRURfQ0hBUiwgZ2VuZXJhdGVDaGFyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIoVEVYVF9MSU5FRkVFRF9DSEFSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm9ybU1hdHJpeC5Jc0lkZW50aXR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUNoYXIubV9NYXRyaXguQ29weShmb3JtTWF0cml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fY2hhckxpc3QuQWRkKGdlbmVyYXRlQ2hhcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IDMgJiYgIW1fUGFyc2VPcHRpb25zLm1fYk91dHB1dEh5cGhlbikgewotICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnMgPSBwVGV4dE9iai0+Q291bnRDaGFycygpOwotICAgICAgICAgICAgaWYgKG5DaGFycyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOwotICAgICAgICAgICAgICAgIHBUZXh0T2JqLT5HZXRDaGFySW5mbygwLCAmaXRlbSk7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckl0ZW0gPSBwVGV4dE9iai0+R2V0Rm9udCgpLT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7Ci0gICAgICAgICAgICAgICAgaWYod3N0ckl0ZW0uSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdzdHJJdGVtICs9IChGWF9XQ0hBUilpdGVtLm1fQ2hhckNvZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX1dDSEFSIGN1ckNoYXIgPSB3c3RySXRlbS5HZXRBdCgwKTsKLSAgICAgICAgICAgICAgICBpZiAoMHgyRCA9PSBjdXJDaGFyIHx8IDB4QUQgPT0gY3VyQ2hhcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKG1fVGVtcFRleHRCdWYuR2V0U2l6ZSgpID4gMCAmJiBtX1RlbXBUZXh0QnVmLkdldFdpZGVTdHJpbmcoKS5HZXRBdChtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpIC0gMSkgPT0gMHgyMCkgewotICAgICAgICAgICAgICAgIG1fVGVtcFRleHRCdWYuRGVsZXRlKG1fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCkgLSAxLCAxKTsKLSAgICAgICAgICAgICAgICBtX1RlbXBDaGFyTGlzdC5EZWxldGUobV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQQUdFQ0hBUl9JTkZPKiBjaGEgPSAoUEFHRUNIQVJfSU5GTyopbV9UZW1wQ2hhckxpc3QuR2V0QXQobV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkRlbGV0ZShtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpIC0gMSwgMSk7Ci0gICAgICAgICAgICBjaGEtPm1fVW5pY29kZSA9IDB4MjsKLSAgICAgICAgICAgIGNoYS0+bV9GbGFnID0gRlBERlRFWFRfQ0hBUl9IWVBIRU47Ci0gICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkFwcGVuZENoYXIoMHhmZmZlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fQ3VybGluZVJlY3QgPSBDRlhfRmxvYXRSZWN0KE9iai5tX3BUZXh0T2JqLT5tX0xlZnQsIE9iai5tX3BUZXh0T2JqLT5tX0JvdHRvbSwgT2JqLm1fcFRleHRPYmotPm1fUmlnaHQsIE9iai5tX3BUZXh0T2JqLT5tX1RvcCk7Ci0gICAgfQotICAgIGlmIChGUERGVEVYVF9NQ19ERUxBWSA9PSBiUHJlTUtDKSB7Ci0gICAgICAgIFByb2Nlc3NNYXJrZWRDb250ZW50KE9iaik7Ci0gICAgICAgIG1fcFByZVRleHRPYmogPSBwVGV4dE9iajsKLSAgICAgICAgbV9wZXJNYXRyaXguQ29weShmb3JtTWF0cml4KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KK3ZvaWQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc1RleHRPYmplY3QoUERGVEVYVF9PYmogT2JqKSB7CisgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBPYmoubV9wVGV4dE9iajsKKyAgaWYgKEZYU1lTX2ZhYnMocFRleHRPYmotPm1fUmlnaHQgLSBwVGV4dE9iai0+bV9MZWZ0KSA8IDAuMDFmKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9BZmZpbmVNYXRyaXggZm9ybU1hdHJpeCA9IE9iai5tX2Zvcm1NYXRyaXg7CisgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOworICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKKyAgcFRleHRPYmotPkdldFRleHRNYXRyaXgoJm1hdHJpeCk7CisgIG1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7CisgIGludDMyX3QgYlByZU1LQyA9IFByZU1hcmtlZENvbnRlbnQoT2JqKTsKKyAgaWYgKEZQREZURVhUX01DX0RPTkUgPT0gYlByZU1LQykgewogICAgIG1fcFByZVRleHRPYmogPSBwVGV4dE9iajsKICAgICBtX3Blck1hdHJpeC5Db3B5KGZvcm1NYXRyaXgpOwotICAgIGludCBuSXRlbXMgPSBwVGV4dE9iai0+Q291bnRJdGVtcygpOwotICAgIEZYX0ZMT0FUIGJhc2VTcGFjZSA9IF9DYWxjdWxhdGVCYXNlU3BhY2UocFRleHRPYmosIG1hdHJpeCk7Ci0KLSAgICBGWF9CT09MIGJJc0JpZGlBbmRNaXJyb3NJbnZlcnNlID0gRkFMU0U7Ci0gICAgSUZYX0JpZGlDaGFyKiBCaWRpQ2hhciA9IElGWF9CaWRpQ2hhcjo6Q3JlYXRlKCk7Ci0gICAgaW50MzJfdCBuUjJMID0gMDsKLSAgICBpbnQzMl90IG5MMlIgPSAwOwotICAgIGludDMyX3Qgc3RhcnQgPSAwLCBjb3VudCA9IDA7Ci0gICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5JdGVtczsgaSsrKSB7Ci0gICAgICAgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbyhpLCAmaXRlbSk7Ci0gICAgICAgIGlmIChpdGVtLm1fQ2hhckNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c3RySXRlbSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7Ci0gICAgICAgIEZYX1dDSEFSIHdDaGFyID0gd3N0ckl0ZW0uR2V0QXQoMCk7Ci0gICAgICAgIGlmICgod3N0ckl0ZW0uSXNFbXB0eSgpIHx8IHdDaGFyID09IDApICYmIGl0ZW0ubV9DaGFyQ29kZSkgewotICAgICAgICAgICAgd0NoYXIgPSAoRlhfV0NIQVIpaXRlbS5tX0NoYXJDb2RlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghd0NoYXIpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCaWRpQ2hhciAmJiBCaWRpQ2hhci0+QXBwZW5kQ2hhcih3Q2hhcikpIHsKLSAgICAgICAgICAgIGludDMyX3QgcmV0ID0gQmlkaUNoYXItPkdldEJpZGlJbmZvKHN0YXJ0LCBjb3VudCk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgICAgICAgICBuUjJMKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXQgPT0gMSkgewotICAgICAgICAgICAgICAgIG5MMlIrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoQmlkaUNoYXIgJiYgQmlkaUNoYXItPkVuZENoYXIoKSkgewotICAgICAgICBpbnQzMl90IHJldCA9IEJpZGlDaGFyLT5HZXRCaWRpSW5mbyhzdGFydCwgY291bnQpOwotICAgICAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgICAgIG5SMkwrKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChyZXQgPT0gMSkgewotICAgICAgICAgICAgbkwyUisrOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYX0JPT0wgYlIyTCA9IEZBTFNFOwotICAgIGlmIChuUjJMID4gMCAmJiBuUjJMID49IG5MMlIpIHsKLSAgICAgICAgYlIyTCA9IFRSVUU7Ci0gICAgfQotICAgIGJJc0JpZGlBbmRNaXJyb3NJbnZlcnNlID0gYlIyTCAmJiAobWF0cml4LmEgKiBtYXRyaXguZCAtIG1hdHJpeC5iICogbWF0cml4LmMpIDwgMDsKLSAgICBpbnQzMl90IGlCdWZTdGFydEFwcGVuZCA9IG1fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCk7Ci0gICAgaW50MzJfdCBpQ2hhckxpc3RTdGFydEFwcGVuZCA9IG1fVGVtcENoYXJMaXN0LkdldFNpemUoKTsKLQotICAgIEZYX0ZMT0FUIHNwYWNpbmcgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkl0ZW1zOyBpKyspIHsKLSAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOwotICAgICAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvOwotICAgICAgICBjaGFyaW5mby5tX09yaWdpblggPSAwOwotICAgICAgICBjaGFyaW5mby5tX09yaWdpblkgPSAwOwotICAgICAgICBwVGV4dE9iai0+R2V0SXRlbUluZm8oaSwgJml0ZW0pOwotICAgICAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHIgPSBtX1RlbXBUZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmKHN0ci5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBzdHIgPSBtX1RleHRCdWYuR2V0V2lkZVN0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0ci5Jc0VtcHR5KCkgfHwgc3RyLkdldEF0KHN0ci5HZXRMZW5ndGgoKSAtIDEpID09IFRFWFRfQkxBTktfQ0hBUikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRkxPQVQgZm9udHNpemVfaCA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZUgoKTsKLSAgICAgICAgICAgIHNwYWNpbmcgPSAtZm9udHNpemVfaCAqIGl0ZW0ubV9PcmlnaW5YIC8gMTAwMDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIGNoYXJTcGFjZSA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2U7Ci0gICAgICAgIGlmIChjaGFyU3BhY2UgPiAwLjAwMSkgewotICAgICAgICAgICAgc3BhY2luZyArPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UoY2hhclNwYWNlKTsKLSAgICAgICAgfSBlbHNlIGlmKGNoYXJTcGFjZSA8IC0wLjAwMSkgewotICAgICAgICAgICAgc3BhY2luZyAtPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UoRlhTWVNfZmFicyhjaGFyU3BhY2UpKTsKLSAgICAgICAgfQotICAgICAgICBzcGFjaW5nIC09IGJhc2VTcGFjZTsKLSAgICAgICAgaWYgKHNwYWNpbmcgJiYgaSA+IDApIHsKLSAgICAgICAgICAgIGludCBsYXN0X3dpZHRoID0gMDsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX2ggPSBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7Ci0gICAgICAgICAgICBGWF9EV09SRCBzcGFjZV9jaGFyY29kZSA9IHBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKCcgJyk7Ci0gICAgICAgICAgICBGWF9GTE9BVCB0aHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgaWYgKHNwYWNlX2NoYXJjb2RlICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgdGhyZXNob2xkID0gZm9udHNpemVfaCAqIHBGb250LT5HZXRDaGFyV2lkdGhGKHNwYWNlX2NoYXJjb2RlKSAvIDEwMDAgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRocmVzaG9sZCA+IGZvbnRzaXplX2ggLyAzKSB7Ci0gICAgICAgICAgICAgICAgdGhyZXNob2xkID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyZXNob2xkIC89IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhyZXNob2xkID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSBmb250c2l6ZV9oOwotICAgICAgICAgICAgICAgIGludCB0aGlzX3dpZHRoID0gRlhTWVNfYWJzKEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHBGb250KSk7Ci0gICAgICAgICAgICAgICAgdGhyZXNob2xkID0gdGhpc193aWR0aCA+IGxhc3Rfd2lkdGggPyAoRlhfRkxPQVQpdGhpc193aWR0aCA6IChGWF9GTE9BVClsYXN0X3dpZHRoOwotICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IF9Ob3JtYWxpemVUaHJlc2hvbGQodGhyZXNob2xkKTsKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSBmb250c2l6ZV9oICogdGhyZXNob2xkIC8gMTAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aHJlc2hvbGQgJiYgKHNwYWNpbmcgJiYgc3BhY2luZyA+PSB0aHJlc2hvbGQpICkgewotICAgICAgICAgICAgICAgIGNoYXJpbmZvLm1fVW5pY29kZSA9IFRFWFRfQkxBTktfQ0hBUjsKLSAgICAgICAgICAgICAgICBjaGFyaW5mby5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRDsKLSAgICAgICAgICAgICAgICBjaGFyaW5mby5tX3BUZXh0T2JqID0gcFRleHRPYmo7Ci0gICAgICAgICAgICAgICAgY2hhcmluZm8ubV9JbmRleCA9IG1fVGV4dEJ1Zi5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkFwcGVuZENoYXIoVEVYVF9CTEFOS19DSEFSKTsKLSAgICAgICAgICAgICAgICBjaGFyaW5mby5tX0NoYXJDb2RlID0gLTE7Ci0gICAgICAgICAgICAgICAgY2hhcmluZm8ubV9NYXRyaXguQ29weShmb3JtTWF0cml4KTsKLSAgICAgICAgICAgICAgICBtYXRyaXguVHJhbnNmb3JtKGl0ZW0ubV9PcmlnaW5YLCBpdGVtLm1fT3JpZ2luWSwgY2hhcmluZm8ubV9PcmlnaW5YLCBjaGFyaW5mby5tX09yaWdpblkpOwotICAgICAgICAgICAgICAgIGNoYXJpbmZvLm1fQ2hhckJveCA9IENGWF9GbG9hdFJlY3QoY2hhcmluZm8ubV9PcmlnaW5YLCBjaGFyaW5mby5tX09yaWdpblksIGNoYXJpbmZvLm1fT3JpZ2luWCwgY2hhcmluZm8ubV9PcmlnaW5ZKTsKLSAgICAgICAgICAgICAgICBtX1RlbXBDaGFyTGlzdC5BZGQoY2hhcmluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGl0ZW0ubV9DaGFyQ29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNwYWNpbmcgPSAwOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c3RySXRlbSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7Ci0gICAgICAgIEZYX0JPT0wgYk5vVW5pY29kZSA9IEZBTFNFOwotICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IHdzdHJJdGVtLkdldEF0KDApOwotICAgICAgICBpZiAoKHdzdHJJdGVtLklzRW1wdHkoKSB8fCB3Q2hhciA9PSAwKSAmJiBpdGVtLm1fQ2hhckNvZGUpIHsKLSAgICAgICAgICAgIGlmKHdzdHJJdGVtLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHdzdHJJdGVtICs9IChGWF9XQ0hBUilpdGVtLm1fQ2hhckNvZGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdzdHJJdGVtLlNldEF0KDAsIChGWF9XQ0hBUilpdGVtLm1fQ2hhckNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYk5vVW5pY29kZSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhcmluZm8ubV9JbmRleCA9IC0xOwotICAgICAgICBjaGFyaW5mby5tX0NoYXJDb2RlID0gaXRlbS5tX0NoYXJDb2RlOwotICAgICAgICBpZihiTm9Vbmljb2RlKSB7Ci0gICAgICAgICAgICBjaGFyaW5mby5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX1VOVU5JQ09ERTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXJpbmZvLm1fRmxhZyA9IEZQREZURVhUX0NIQVJfTk9STUFMOwotICAgICAgICB9Ci0gICAgICAgIGNoYXJpbmZvLm1fcFRleHRPYmogPSBwVGV4dE9iajsKLSAgICAgICAgY2hhcmluZm8ubV9PcmlnaW5YID0gMCwgY2hhcmluZm8ubV9PcmlnaW5ZID0gMDsKLSAgICAgICAgbWF0cml4LlRyYW5zZm9ybShpdGVtLm1fT3JpZ2luWCwgaXRlbS5tX09yaWdpblksIGNoYXJpbmZvLm1fT3JpZ2luWCwgY2hhcmluZm8ubV9PcmlnaW5ZKTsKLSAgICAgICAgRlhfUkVDVCByZWN0KDAsIDAsIDAsIDApOwotICAgICAgICByZWN0LkludGVyc2VjdCgwLCAwLCAwLCAwKTsKLSAgICAgICAgY2hhcmluZm8ubV9wVGV4dE9iai0+R2V0Rm9udCgpLT5HZXRDaGFyQkJveChjaGFyaW5mby5tX0NoYXJDb2RlLCByZWN0KTsKLSAgICAgICAgY2hhcmluZm8ubV9DaGFyQm94LnRvcCA9IHJlY3QudG9wICogcFRleHRPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwICsgaXRlbS5tX09yaWdpblk7Ci0gICAgICAgIGNoYXJpbmZvLm1fQ2hhckJveC5sZWZ0ID0gcmVjdC5sZWZ0ICogcFRleHRPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwICsgaXRlbS5tX09yaWdpblg7Ci0gICAgICAgIGNoYXJpbmZvLm1fQ2hhckJveC5yaWdodCA9IHJlY3QucmlnaHQgKiBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKyBpdGVtLm1fT3JpZ2luWDsKLSAgICAgICAgY2hhcmluZm8ubV9DaGFyQm94LmJvdHRvbSA9IHJlY3QuYm90dG9tICogcFRleHRPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwICsgaXRlbS5tX09yaWdpblk7Ci0gICAgICAgIGlmIChmYWJzZihjaGFyaW5mby5tX0NoYXJCb3gudG9wIC0gY2hhcmluZm8ubV9DaGFyQm94LmJvdHRvbSkgPCAwLjAxZikgewotICAgICAgICAgICAgY2hhcmluZm8ubV9DaGFyQm94LnRvcCA9IGNoYXJpbmZvLm1fQ2hhckJveC5ib3R0b20gKyBwVGV4dE9iai0+R2V0Rm9udFNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmFic2YoY2hhcmluZm8ubV9DaGFyQm94LnJpZ2h0IC0gY2hhcmluZm8ubV9DaGFyQm94LmxlZnQpIDwgMC4wMWYpIHsKLSAgICAgICAgICAgIGNoYXJpbmZvLm1fQ2hhckJveC5yaWdodCA9IGNoYXJpbmZvLm1fQ2hhckJveC5sZWZ0ICsgcFRleHRPYmotPkdldENoYXJXaWR0aChjaGFyaW5mby5tX0NoYXJDb2RlKTsKLSAgICAgICAgfQotICAgICAgICBtYXRyaXguVHJhbnNmb3JtUmVjdChjaGFyaW5mby5tX0NoYXJCb3gpOwotICAgICAgICBjaGFyaW5mby5tX01hdHJpeC5Db3B5KG1hdHJpeCk7Ci0gICAgICAgIGlmICh3c3RySXRlbS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGNoYXJpbmZvLm1fVW5pY29kZSA9IDA7Ci0gICAgICAgICAgICBtX1RlbXBDaGFyTGlzdC5BZGQoY2hhcmluZm8pOwotICAgICAgICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKDB4ZmZmZSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBuVG90YWwgPSB3c3RySXRlbS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIEZYX0JPT0wgYkRlbCA9IEZBTFNFOwotICAgICAgICAgICAgY29uc3QgaW50IGNvdW50ID0gc3RkOjptaW4obV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpLCA3KTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHRocmVzaG9sZCA9IGNoYXJpbmZvLm1fTWF0cml4LlRyYW5zZm9ybVhEaXN0YW5jZSgoRlhfRkxPQVQpVEVYVF9DSEFSUkFUSU9fR0FQREVMVEEgKiBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBuID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICBuID4gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIC0gY291bnQ7Ci0gICAgICAgICAgICAgICAgIG4tLSkgewotICAgICAgICAgICAgICAgIFBBR0VDSEFSX0lORk8qIGNoYXJpbmZvMSA9IChQQUdFQ0hBUl9JTkZPKiltX1RlbXBDaGFyTGlzdC5HZXRBdChuIC0gMSk7Ci0gICAgICAgICAgICAgICAgaWYoY2hhcmluZm8xLT5tX0NoYXJDb2RlID09IGNoYXJpbmZvLm1fQ2hhckNvZGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJpbmZvMS0+bV9wVGV4dE9iai0+R2V0Rm9udCgpID09IGNoYXJpbmZvLm1fcFRleHRPYmotPkdldEZvbnQoKSAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2ZhYnMoY2hhcmluZm8xLT5tX09yaWdpblggLSBjaGFyaW5mby5tX09yaWdpblgpIDwgdGhyZXNob2xkICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyhjaGFyaW5mbzEtPm1fT3JpZ2luWSAtIGNoYXJpbmZvLm1fT3JpZ2luWSkgPCB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgYkRlbCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCFiRGVsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgbkluZGV4ID0gMDsgbkluZGV4IDwgblRvdGFsOyBuSW5kZXgrKykgewotICAgICAgICAgICAgICAgICAgICBjaGFyaW5mby5tX1VuaWNvZGUgPSB3c3RySXRlbS5HZXRBdChuSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcmluZm8ubV9Vbmljb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyaW5mby5tX0luZGV4ID0gbV9UZXh0QnVmLkdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKGNoYXJpbmZvLm1fVW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkFwcGVuZENoYXIoMHhmZmZlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX1RlbXBDaGFyTGlzdC5BZGQoY2hhcmluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZihpID09IDApIHsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHIgPSBtX1RlbXBUZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0ci5Jc0VtcHR5KCkgJiYgc3RyLkdldEF0KHN0ci5HZXRMZW5ndGgoKSAtIDEpID09IFRFWFRfQkxBTktfQ0hBUikgewotICAgICAgICAgICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkRlbGV0ZShtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpIC0gMSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fVGVtcENoYXJMaXN0LkRlbGV0ZShtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGJJc0JpZGlBbmRNaXJyb3NJbnZlcnNlKSB7Ci0gICAgICAgIGludDMyX3QgaSwgajsKLSAgICAgICAgaSA9IGlDaGFyTGlzdFN0YXJ0QXBwZW5kOwotICAgICAgICBqID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIC0gMTsKLSAgICAgICAgZm9yICg7IGkgPCBqOyBpKyssIGotLSkgewotICAgICAgICAgICAgc3RkOjpzd2FwKG1fVGVtcENoYXJMaXN0W2ldLCBtX1RlbXBDaGFyTGlzdFtqXSk7Ci0gICAgICAgICAgICBzdGQ6OnN3YXAobV9UZW1wQ2hhckxpc3RbaV0ubV9JbmRleCwgbV9UZW1wQ2hhckxpc3Rbal0ubV9JbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfV0NIQVIgKiBwVGVtcEJ1ZmZlciA9IG1fVGVtcFRleHRCdWYuR2V0QnVmZmVyKCk7Ci0gICAgICAgIGkgPSBpQnVmU3RhcnRBcHBlbmQ7Ci0gICAgICAgIGogPSBtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpIC0gMTsKLSAgICAgICAgZm9yICg7IGkgPCBqOyBpKyssIGotLSkgewotICAgICAgICAgICAgc3RkOjpzd2FwKHBUZW1wQnVmZmVyW2ldLCBwVGVtcEJ1ZmZlcltqXSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1pbnQzMl90IENQREZfVGV4dFBhZ2U6OkdldFRleHRPYmplY3RXcml0aW5nTW9kZShjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKQotewotICAgIGludDMyX3QgbkNoYXJzID0gcFRleHRPYmotPkNvdW50Q2hhcnMoKTsKLSAgICBpZiAobkNoYXJzID09IDEpIHsKLSAgICAgICAgcmV0dXJuIG1fVGV4dGxpbmVEaXI7Ci0gICAgfQotICAgIENQREZfVGV4dE9iamVjdEl0ZW0gZmlyc3QsIGxhc3Q7Ci0gICAgcFRleHRPYmotPkdldENoYXJJbmZvKDAsICZmaXJzdCk7Ci0gICAgcFRleHRPYmotPkdldENoYXJJbmZvKG5DaGFycyAtIDEsICZsYXN0KTsKLSAgICBDRlhfTWF0cml4IHRleHRNYXRyaXg7Ci0gICAgcFRleHRPYmotPkdldFRleHRNYXRyaXgoJnRleHRNYXRyaXgpOwotICAgIHRleHRNYXRyaXguVHJhbnNmb3JtUG9pbnQoZmlyc3QubV9PcmlnaW5YLCBmaXJzdC5tX09yaWdpblkpOwotICAgIHRleHRNYXRyaXguVHJhbnNmb3JtUG9pbnQobGFzdC5tX09yaWdpblgsIGxhc3QubV9PcmlnaW5ZKTsKLSAgICBGWF9GTE9BVCBkWCA9IEZYU1lTX2ZhYnMobGFzdC5tX09yaWdpblggLSBmaXJzdC5tX09yaWdpblgpOwotICAgIEZYX0ZMT0FUIGRZID0gRlhTWVNfZmFicyhsYXN0Lm1fT3JpZ2luWSAtIGZpcnN0Lm1fT3JpZ2luWSk7Ci0gICAgaWYgKGRYIDw9IDAuMDAwMWYgJiYgZFkgPD0gMC4wMDAxZikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIENGWF9WZWN0b3JGIHY7Ci0gICAgdi5TZXQoZFgsIGRZKTsKLSAgICB2Lk5vcm1hbGl6ZSgpOwotICAgIGlmICh2LnkgPD0gMC4wODcyZikgewotICAgICAgICByZXR1cm4gdi54IDw9IDAuMDg3MmYgPyBtX1RleHRsaW5lRGlyIDogMDsKLSAgICB9Ci0gICAgaWYgKHYueCA8PSAwLjA4NzJmKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gbV9UZXh0bGluZURpcjsKLX0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNIeXBoZW4oRlhfV0NIQVIgY3VyQ2hhcikKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHJDdXJUZXh0ID0gbV9UZW1wVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7Ci0gICAgaWYoc3RyQ3VyVGV4dC5HZXRMZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgIHN0ckN1clRleHQgPSBtX1RleHRCdWYuR2V0V2lkZVN0cmluZygpOwotICAgIH0KLSAgICBGWF9TVFJTSVpFIG5Db3VudCA9IHN0ckN1clRleHQuR2V0TGVuZ3RoKCk7Ci0gICAgaW50IG5JbmRleCA9IG5Db3VudCAtIDE7Ci0gICAgRlhfV0NIQVIgd2NUbXAgPSBzdHJDdXJUZXh0LkdldEF0KG5JbmRleCk7Ci0gICAgd2hpbGUod2NUbXAgPT0gMHgyMCAmJiBuSW5kZXggPD0gbkNvdW50IC0gMSAmJiBuSW5kZXggPj0gMCkgewotICAgICAgICB3Y1RtcCA9IHN0ckN1clRleHQuR2V0QXQoLS1uSW5kZXgpOwotICAgIH0KLSAgICBpZiAoMHgyRCA9PSB3Y1RtcCB8fCAweEFEID09IHdjVG1wKSB7Ci0gICAgICAgIGlmICgtLW5JbmRleCA+IDApIHsKLSAgICAgICAgICAgIEZYX1dDSEFSIHByZUNoYXIgPSBzdHJDdXJUZXh0LkdldEF0KChuSW5kZXgpKTsKLSAgICAgICAgICAgIGlmICgoKHByZUNoYXIgPj0gTCdBJyAmJiBwcmVDaGFyIDw9IEwnWicpIHx8IChwcmVDaGFyID49IEwnYScgJiYgcHJlQ2hhciA8PSBMJ3onKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKChjdXJDaGFyID49IEwnQScgJiYgY3VyQ2hhciA8PSBMJ1onKSB8fCAoY3VyQ2hhciA+PSBMJ2EnICYmIGN1ckNoYXIgPD0gTCd6JykpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNpemUgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgICAgIFBBR0VDSEFSX0lORk8gcHJlQ2hhcjsKLSAgICAgICAgaWYgKHNpemUpIHsKLSAgICAgICAgICAgIHByZUNoYXIgPSAoUEFHRUNIQVJfSU5GTyltX1RlbXBDaGFyTGlzdFtzaXplIC0gMV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgICAgICAgICBpZihzaXplID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmVDaGFyID0gKFBBR0VDSEFSX0lORk8pbV9jaGFyTGlzdFtzaXplIC0gMV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZQREZURVhUX0NIQVJfUElFQ0UgPT0gcHJlQ2hhci5tX0ZsYWcpCi0gICAgICAgICAgICBpZiAoMHhBRCA9PSBwcmVDaGFyLm1fVW5pY29kZSB8fCAweDJEID09IHByZUNoYXIubV9Vbmljb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLWludCBDUERGX1RleHRQYWdlOjpQcm9jZXNzSW5zZXJ0T2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgZm9ybU1hdHJpeCkKLXsKLSAgICBGaW5kUHJldmlvdXNUZXh0T2JqZWN0KCk7Ci0gICAgRlhfQk9PTCBiTmV3bGluZSA9IEZBTFNFOwotICAgIGludCBXcml0aW5nTW9kZSA9IEdldFRleHRPYmplY3RXcml0aW5nTW9kZShwT2JqKTsKLSAgICBpZihXcml0aW5nTW9kZSA9PSAtMSkgewotICAgICAgICBXcml0aW5nTW9kZSA9IEdldFRleHRPYmplY3RXcml0aW5nTW9kZShtX3BQcmVUZXh0T2JqKTsKLSAgICB9Ci0gICAgQ0ZYX0Zsb2F0UmVjdCB0aGlzX3JlY3QocE9iai0+bV9MZWZ0LCBwT2JqLT5tX0JvdHRvbSwgcE9iai0+bV9SaWdodCwgcE9iai0+bV9Ub3ApOwotICAgIENGWF9GbG9hdFJlY3QgcHJldl9yZWN0KG1fcFByZVRleHRPYmotPm1fTGVmdCwgbV9wUHJlVGV4dE9iai0+bV9Cb3R0b20sIG1fcFByZVRleHRPYmotPm1fUmlnaHQsIG1fcFByZVRleHRPYmotPm1fVG9wKTsKLSAgICBDUERGX1RleHRPYmplY3RJdGVtIFByZXZJdGVtLCBpdGVtOwotICAgIGludCBuSXRlbSA9IG1fcFByZVRleHRPYmotPkNvdW50SXRlbXMoKTsKLSAgICBtX3BQcmVUZXh0T2JqLT5HZXRJdGVtSW5mbyhuSXRlbSAtIDEsICZQcmV2SXRlbSk7Ci0gICAgcE9iai0+R2V0SXRlbUluZm8oMCwgJml0ZW0pOwotICAgIENGWF9XaWRlU3RyaW5nIHdzdHJJdGVtID0gcE9iai0+R2V0Rm9udCgpLT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7Ci0gICAgaWYod3N0ckl0ZW0uSXNFbXB0eSgpKSB7Ci0gICAgICAgIHdzdHJJdGVtICs9IChGWF9XQ0hBUilpdGVtLm1fQ2hhckNvZGU7Ci0gICAgfQotICAgIEZYX1dDSEFSIGN1ckNoYXIgPSB3c3RySXRlbS5HZXRBdCgwKTsKLSAgICBpZihXcml0aW5nTW9kZSA9PSAwKSB7Ci0gICAgICAgIGlmKHRoaXNfcmVjdC5IZWlnaHQoKSA+IDQuNSAmJiBwcmV2X3JlY3QuSGVpZ2h0KCkgPiA0LjUpIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCA9IHRoaXNfcmVjdC50b3AgPCBwcmV2X3JlY3QudG9wID8gdGhpc19yZWN0LnRvcCA6IHByZXZfcmVjdC50b3A7Ci0gICAgICAgICAgICBGWF9GTE9BVCBib3R0b20gPSB0aGlzX3JlY3QuYm90dG9tID4gcHJldl9yZWN0LmJvdHRvbSA/IHRoaXNfcmVjdC5ib3R0b20gOiBwcmV2X3JlY3QuYm90dG9tOwotICAgICAgICAgICAgaWYoYm90dG9tID49IHRvcCkgewotICAgICAgICAgICAgICAgIGlmKElzSHlwaGVuKGN1ckNoYXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoV3JpdGluZ01vZGUgPT0gMSkgewotICAgICAgICBpZih0aGlzX3JlY3QuV2lkdGgoKSA+IHBPYmotPkdldEZvbnRTaXplKCkgKiAwLjFmICYmIHByZXZfcmVjdC5XaWR0aCgpID4gbV9wUHJlVGV4dE9iai0+R2V0Rm9udFNpemUoKSAqIDAuMWYpIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGxlZnQgPSB0aGlzX3JlY3QubGVmdCA+IG1fQ3VybGluZVJlY3QubGVmdCA/IHRoaXNfcmVjdC5sZWZ0IDogbV9DdXJsaW5lUmVjdC5sZWZ0OwotICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHQgPSB0aGlzX3JlY3QucmlnaHQgPCBtX0N1cmxpbmVSZWN0LnJpZ2h0ID8gdGhpc19yZWN0LnJpZ2h0IDogbV9DdXJsaW5lUmVjdC5yaWdodDsKLSAgICAgICAgICAgIGlmKHJpZ2h0IDw9IGxlZnQpIHsKLSAgICAgICAgICAgICAgICBpZihJc0h5cGhlbihjdXJDaGFyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfRkxPQVQgbGFzdF9wb3MgPSBQcmV2SXRlbS5tX09yaWdpblg7Ci0gICAgaW50IG5MYXN0V2lkdGggPSBHZXRDaGFyV2lkdGgoUHJldkl0ZW0ubV9DaGFyQ29kZSwgbV9wUHJlVGV4dE9iai0+R2V0Rm9udCgpKTsKLSAgICBGWF9GTE9BVCBsYXN0X3dpZHRoID0gbkxhc3RXaWR0aCAqIG1fcFByZVRleHRPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgIGxhc3Rfd2lkdGggPSBGWFNZU19mYWJzKGxhc3Rfd2lkdGgpOwotICAgIGludCBuVGhpc1dpZHRoID0gR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcE9iai0+R2V0Rm9udCgpKTsKLSAgICBGWF9GTE9BVCB0aGlzX3dpZHRoID0gblRoaXNXaWR0aCAqIHBPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgIHRoaXNfd2lkdGggPSBGWFNZU19mYWJzKHRoaXNfd2lkdGgpOwotICAgIEZYX0ZMT0FUIHRocmVzaG9sZCA9IGxhc3Rfd2lkdGggPiB0aGlzX3dpZHRoID8gbGFzdF93aWR0aCAvIDQgOiB0aGlzX3dpZHRoIC8gNDsKLSAgICBDRlhfQWZmaW5lTWF0cml4IHByZXZfbWF0cml4LCBwcmV2X3JldmVyc2U7Ci0gICAgbV9wUHJlVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgmcHJldl9tYXRyaXgpOwotICAgIHByZXZfbWF0cml4LkNvbmNhdChtX3Blck1hdHJpeCk7Ci0gICAgcHJldl9yZXZlcnNlLlNldFJldmVyc2UocHJldl9tYXRyaXgpOwotICAgIEZYX0ZMT0FUIHggPSBwT2JqLT5HZXRQb3NYKCk7Ci0gICAgRlhfRkxPQVQgeSA9IHBPYmotPkdldFBvc1koKTsKLSAgICBmb3JtTWF0cml4LlRyYW5zZm9ybSh4LCB5KTsKLSAgICBwcmV2X3JldmVyc2UuVHJhbnNmb3JtKHgsIHkpOwotICAgIGlmKGxhc3Rfd2lkdGggPCB0aGlzX3dpZHRoKSB7Ci0gICAgICAgIHRocmVzaG9sZCA9IHByZXZfcmV2ZXJzZS5UcmFuc2Zvcm1EaXN0YW5jZSh0aHJlc2hvbGQpOwotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QxKG1fcFByZVRleHRPYmotPm1fTGVmdCwgcE9iai0+bV9Cb3R0b20sIG1fcFByZVRleHRPYmotPm1fUmlnaHQsIHBPYmotPm1fVG9wKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QyKG1fcFByZVRleHRPYmotPm1fTGVmdCwgbV9wUHJlVGV4dE9iai0+bV9Cb3R0b20sIG1fcFByZVRleHRPYmotPm1fUmlnaHQsIG1fcFByZVRleHRPYmotPm1fVG9wKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QzID0gcmVjdDE7Ci0gICAgcmVjdDEuSW50ZXJzZWN0KHJlY3QyKTsKLSAgICBpZiAoV3JpdGluZ01vZGUgPT0gMCkgewotICAgICAgICBpZiAoKHJlY3QxLklzRW1wdHkoKSAmJiByZWN0Mi5IZWlnaHQoKSA+IDUgJiYgcmVjdDMuSGVpZ2h0KCkgPiA1KQotICAgICAgICAgICAgICAgIHx8ICgoeSA+IHRocmVzaG9sZCAqIDIgfHwgeSA8IHRocmVzaG9sZCAqIC0zKSAmJiAoRlhTWVNfZmFicyh5KSA8IDEgPyBGWFNZU19mYWJzKHgpIDwgRlhTWVNfZmFicyh5KSA6IFRSVUUpKSkgewotICAgICAgICAgICAgYk5ld2xpbmUgPSBUUlVFOwotICAgICAgICAgICAgaWYobkl0ZW0gPiAxICkgewotICAgICAgICAgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gdGVtcEl0ZW07Ci0gICAgICAgICAgICAgICAgbV9wUHJlVGV4dE9iai0+R2V0SXRlbUluZm8oMCwgJnRlbXBJdGVtKTsKLSAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG07Ci0gICAgICAgICAgICAgICAgbV9wUHJlVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgmbSk7Ci0gICAgICAgICAgICAgICAgaWYoUHJldkl0ZW0ubV9PcmlnaW5YID4gdGVtcEl0ZW0ubV9PcmlnaW5YICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0Rpc3BsYXlNYXRyaXguYSA+IDAuOSAmJiBtX0Rpc3BsYXlNYXRyaXguYiA8IDAuMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbV9EaXNwbGF5TWF0cml4LmMgPCAwLjEgJiYgbV9EaXNwbGF5TWF0cml4LmQgPCAtMC45Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtLmIgPCAwLjEgJiYgbS5jIDwgMC4xICkgewotICAgICAgICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJlKDAsIG1fcFByZVRleHRPYmotPm1fQm90dG9tLCAxMDAwLCBtX3BQcmVUZXh0T2JqLT5tX1RvcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHJlLkNvbnRhaW5zKHBPYmotPkdldFBvc1goKSwgcE9iai0+R2V0UG9zWSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYk5ld2xpbmUgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmUoMCwgcE9iai0+bV9Cb3R0b20sIDEwMDAsIHBPYmotPm1fVG9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlLkNvbnRhaW5zKG1fcFByZVRleHRPYmotPkdldFBvc1goKSwgbV9wUHJlVGV4dE9iai0+R2V0UG9zWSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZXdsaW5lID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoYk5ld2xpbmUpIHsKLSAgICAgICAgaWYoSXNIeXBoZW4oY3VyQ2hhcikpIHsKLSAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBpbnQzMl90IG5DaGFycyA9IHBPYmotPkNvdW50Q2hhcnMoKTsKLSAgICBpZiAobkNoYXJzID09IDEgJiYgKCAweDJEID09IGN1ckNoYXIgfHwgMHhBRCA9PSBjdXJDaGFyKSkKLSAgICAgICAgaWYgKElzSHlwaGVuKGN1ckNoYXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgfQotICAgIENGWF9XaWRlU3RyaW5nIFByZXZTdHIgPSBtX3BQcmVUZXh0T2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoUHJldkl0ZW0ubV9DaGFyQ29kZSk7Ci0gICAgRlhfV0NIQVIgcHJlQ2hhciA9IFByZXZTdHIuR2V0QXQoUHJldlN0ci5HZXRMZW5ndGgoKSAtIDEpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIHBPYmotPkdldFRleHRNYXRyaXgoJm1hdHJpeCk7Ci0gICAgbWF0cml4LkNvbmNhdChmb3JtTWF0cml4KTsKLSAgICB0aHJlc2hvbGQgPSAoRlhfRkxPQVQpKG5MYXN0V2lkdGggPiBuVGhpc1dpZHRoID8gbkxhc3RXaWR0aCA6IG5UaGlzV2lkdGgpOwotICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCA+IDQwMCA/ICh0aHJlc2hvbGQgPCA3MDAgPyB0aHJlc2hvbGQgLyA0IDogICh0aHJlc2hvbGQgPiA4MDAgPyB0aHJlc2hvbGQgLyA2IDogdGhyZXNob2xkIC8gNSkpIDogKHRocmVzaG9sZCAvIDIpOwotICAgIGlmKG5MYXN0V2lkdGggPj0gblRoaXNXaWR0aCkgewotICAgICAgICB0aHJlc2hvbGQgKj0gRlhTWVNfZmFicyhtX3BQcmVUZXh0T2JqLT5HZXRGb250U2l6ZSgpKTsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IHJlc3VsdCA9IDA7CisgIGlmIChtX3BQcmVUZXh0T2JqKSB7CisgICAgcmVzdWx0ID0gUHJvY2Vzc0luc2VydE9iamVjdChwVGV4dE9iaiwgZm9ybU1hdHJpeCk7CisgICAgaWYgKDIgPT0gcmVzdWx0KSB7CisgICAgICBtX0N1cmxpbmVSZWN0ID0KKyAgICAgICAgICBDRlhfRmxvYXRSZWN0KE9iai5tX3BUZXh0T2JqLT5tX0xlZnQsIE9iai5tX3BUZXh0T2JqLT5tX0JvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iai5tX3BUZXh0T2JqLT5tX1JpZ2h0LCBPYmoubV9wVGV4dE9iai0+bV9Ub3ApOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocmVzaG9sZCAqPSBGWFNZU19mYWJzKHBPYmotPkdldEZvbnRTaXplKCkpOwotICAgICAgICB0aHJlc2hvbGQgPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UodGhyZXNob2xkKTsKLSAgICAgICAgdGhyZXNob2xkID0gcHJldl9yZXZlcnNlLlRyYW5zZm9ybURpc3RhbmNlKHRocmVzaG9sZCk7CisgICAgICBtX0N1cmxpbmVSZWN0LlVuaW9uKAorICAgICAgICAgIENGWF9GbG9hdFJlY3QoT2JqLm1fcFRleHRPYmotPm1fTGVmdCwgT2JqLm1fcFRleHRPYmotPm1fQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgT2JqLm1fcFRleHRPYmotPm1fUmlnaHQsIE9iai5tX3BUZXh0T2JqLT5tX1RvcCkpOwogICAgIH0KLSAgICB0aHJlc2hvbGQgLz0gMTAwMDsKLSAgICBpZigodGhyZXNob2xkIDwgMS40ODgxICYmIHRocmVzaG9sZCA+IDEuNDg3OSkKLSAgICAgICAgICAgIHx8ICh0aHJlc2hvbGQgPCAxLjM5MDAxICYmIHRocmVzaG9sZCA+IDEuMzg5OTkpKSB7Ci0gICAgICAgIHRocmVzaG9sZCAqPSAxLjU7Ci0gICAgfQotICAgIGlmIChGWFNZU19mYWJzKGxhc3RfcG9zICsgbGFzdF93aWR0aCAtIHgpID4gdGhyZXNob2xkICYmIGN1ckNoYXIgIT0gTCcgJyAmJiBwcmVDaGFyICE9IEwnICcpCi0gICAgICAgIGlmIChjdXJDaGFyICE9IEwnICcgJiYgcHJlQ2hhciAhPSBMJyAnKSB7Ci0gICAgICAgICAgICBpZigoeCAtIGxhc3RfcG9zIC0gbGFzdF93aWR0aCkgPiB0aHJlc2hvbGQgfHwgKGxhc3RfcG9zIC0geCAtIGxhc3Rfd2lkdGgpID4gdGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZih4IDwgMCAmJiAobGFzdF9wb3MgLSB4IC0gbGFzdF93aWR0aCkgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCh4IC0gbGFzdF9wb3MgLSBsYXN0X3dpZHRoKSA+IHRoaXNfd2lkdGggfHwgKHggLSBsYXN0X3BvcyAtIHRoaXNfd2lkdGgpID4gbGFzdF93aWR0aCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KKyAgICBQQUdFQ0hBUl9JTkZPIGdlbmVyYXRlQ2hhcjsKKyAgICBpZiAocmVzdWx0ID09IDEpIHsKKyAgICAgIGlmIChHZW5lcmF0ZUNoYXJJbmZvKFRFWFRfQkxBTktfQ0hBUiwgZ2VuZXJhdGVDaGFyKSkgeworICAgICAgICBpZiAoIWZvcm1NYXRyaXguSXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgZ2VuZXJhdGVDaGFyLm1fTWF0cml4LkNvcHkoZm9ybU1hdHJpeCk7CiAgICAgICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKFRFWFRfQkxBTktfQ0hBUik7CisgICAgICAgIG1fVGVtcENoYXJMaXN0LkFkZChnZW5lcmF0ZUNoYXIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IDIpIHsKKyAgICAgIENsb3NlVGVtcExpbmUoKTsKKyAgICAgIGlmIChtX1RleHRCdWYuR2V0U2l6ZSgpKSB7CisgICAgICAgIGlmIChtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKKyAgICAgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihURVhUX1JFVFVSTl9DSEFSKTsKKyAgICAgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihURVhUX0xJTkVGRUVEX0NIQVIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChHZW5lcmF0ZUNoYXJJbmZvKFRFWFRfUkVUVVJOX0NIQVIsIGdlbmVyYXRlQ2hhcikpIHsKKyAgICAgICAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKFRFWFRfUkVUVVJOX0NIQVIpOworICAgICAgICAgICAgaWYgKCFmb3JtTWF0cml4LklzSWRlbnRpdHkoKSkgeworICAgICAgICAgICAgICBnZW5lcmF0ZUNoYXIubV9NYXRyaXguQ29weShmb3JtTWF0cml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fY2hhckxpc3QuQWRkKGdlbmVyYXRlQ2hhcik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChHZW5lcmF0ZUNoYXJJbmZvKFRFWFRfTElORUZFRURfQ0hBUiwgZ2VuZXJhdGVDaGFyKSkgeworICAgICAgICAgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIoVEVYVF9MSU5FRkVFRF9DSEFSKTsKKyAgICAgICAgICAgIGlmICghZm9ybU1hdHJpeC5Jc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgZ2VuZXJhdGVDaGFyLm1fTWF0cml4LkNvcHkoZm9ybU1hdHJpeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2NoYXJMaXN0LkFkZChnZW5lcmF0ZUNoYXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IDMgJiYgIW1fUGFyc2VPcHRpb25zLm1fYk91dHB1dEh5cGhlbikgeworICAgICAgaW50MzJfdCBuQ2hhcnMgPSBwVGV4dE9iai0+Q291bnRDaGFycygpOworICAgICAgaWYgKG5DaGFycyA9PSAxKSB7CisgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKKyAgICAgICAgcFRleHRPYmotPkdldENoYXJJbmZvKDAsICZpdGVtKTsKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckl0ZW0gPQorICAgICAgICAgICAgcFRleHRPYmotPkdldEZvbnQoKS0+VW5pY29kZUZyb21DaGFyQ29kZShpdGVtLm1fQ2hhckNvZGUpOworICAgICAgICBpZiAod3N0ckl0ZW0uSXNFbXB0eSgpKSB7CisgICAgICAgICAgd3N0ckl0ZW0gKz0gKEZYX1dDSEFSKWl0ZW0ubV9DaGFyQ29kZTsKKyAgICAgICAgfQorICAgICAgICBGWF9XQ0hBUiBjdXJDaGFyID0gd3N0ckl0ZW0uR2V0QXQoMCk7CisgICAgICAgIGlmICgweDJEID09IGN1ckNoYXIgfHwgMHhBRCA9PSBjdXJDaGFyKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICB3aGlsZSAobV9UZW1wVGV4dEJ1Zi5HZXRTaXplKCkgPiAwICYmCisgICAgICAgICAgICAgbV9UZW1wVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCkuR2V0QXQobV9UZW1wVGV4dEJ1Zi5HZXRMZW5ndGgoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkgPT0gMHgyMCkgeworICAgICAgICBtX1RlbXBUZXh0QnVmLkRlbGV0ZShtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpIC0gMSwgMSk7CisgICAgICAgIG1fVGVtcENoYXJMaXN0LkRlbGV0ZShtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSAxKTsKKyAgICAgIH0KKyAgICAgIFBBR0VDSEFSX0lORk8qIGNoYSA9CisgICAgICAgICAgKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSAtIDEpOworICAgICAgbV9UZW1wVGV4dEJ1Zi5EZWxldGUobV9UZW1wVGV4dEJ1Zi5HZXRMZW5ndGgoKSAtIDEsIDEpOworICAgICAgY2hhLT5tX1VuaWNvZGUgPSAweDI7CisgICAgICBjaGEtPm1fRmxhZyA9IEZQREZURVhUX0NIQVJfSFlQSEVOOworICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKDB4ZmZmZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIG1fQ3VybGluZVJlY3QgPQorICAgICAgICBDRlhfRmxvYXRSZWN0KE9iai5tX3BUZXh0T2JqLT5tX0xlZnQsIE9iai5tX3BUZXh0T2JqLT5tX0JvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICBPYmoubV9wVGV4dE9iai0+bV9SaWdodCwgT2JqLm1fcFRleHRPYmotPm1fVG9wKTsKKyAgfQorICBpZiAoRlBERlRFWFRfTUNfREVMQVkgPT0gYlByZU1LQykgeworICAgIFByb2Nlc3NNYXJrZWRDb250ZW50KE9iaik7CisgICAgbV9wUHJlVGV4dE9iaiA9IHBUZXh0T2JqOworICAgIG1fcGVyTWF0cml4LkNvcHkoZm9ybU1hdHJpeCk7CisgICAgcmV0dXJuOworICB9CisgIG1fcFByZVRleHRPYmogPSBwVGV4dE9iajsKKyAgbV9wZXJNYXRyaXguQ29weShmb3JtTWF0cml4KTsKKyAgaW50IG5JdGVtcyA9IHBUZXh0T2JqLT5Db3VudEl0ZW1zKCk7CisgIEZYX0ZMT0FUIGJhc2VTcGFjZSA9IF9DYWxjdWxhdGVCYXNlU3BhY2UocFRleHRPYmosIG1hdHJpeCk7CisKKyAgRlhfQk9PTCBiSXNCaWRpQW5kTWlycm9zSW52ZXJzZSA9IEZBTFNFOworICBJRlhfQmlkaUNoYXIqIEJpZGlDaGFyID0gSUZYX0JpZGlDaGFyOjpDcmVhdGUoKTsKKyAgaW50MzJfdCBuUjJMID0gMDsKKyAgaW50MzJfdCBuTDJSID0gMDsKKyAgaW50MzJfdCBzdGFydCA9IDAsIGNvdW50ID0gMDsKKyAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgeworICAgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbyhpLCAmaXRlbSk7CisgICAgaWYgKGl0ZW0ubV9DaGFyQ29kZSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDRlhfV2lkZVN0cmluZyB3c3RySXRlbSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7CisgICAgRlhfV0NIQVIgd0NoYXIgPSB3c3RySXRlbS5HZXRBdCgwKTsKKyAgICBpZiAoKHdzdHJJdGVtLklzRW1wdHkoKSB8fCB3Q2hhciA9PSAwKSAmJiBpdGVtLm1fQ2hhckNvZGUpIHsKKyAgICAgIHdDaGFyID0gKEZYX1dDSEFSKWl0ZW0ubV9DaGFyQ29kZTsKKyAgICB9CisgICAgaWYgKCF3Q2hhcikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChCaWRpQ2hhciAmJiBCaWRpQ2hhci0+QXBwZW5kQ2hhcih3Q2hhcikpIHsKKyAgICAgIGludDMyX3QgcmV0ID0gQmlkaUNoYXItPkdldEJpZGlJbmZvKHN0YXJ0LCBjb3VudCk7CisgICAgICBpZiAocmV0ID09IDIpIHsKKyAgICAgICAgblIyTCsrOworICAgICAgfSBlbHNlIGlmIChyZXQgPT0gMSkgeworICAgICAgICBuTDJSKys7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChCaWRpQ2hhciAmJiBCaWRpQ2hhci0+RW5kQ2hhcigpKSB7CisgICAgaW50MzJfdCByZXQgPSBCaWRpQ2hhci0+R2V0QmlkaUluZm8oc3RhcnQsIGNvdW50KTsKKyAgICBpZiAocmV0ID09IDIpIHsKKyAgICAgIG5SMkwrKzsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSAxKSB7CisgICAgICBuTDJSKys7CisgICAgfQorICB9CisgIEZYX0JPT0wgYlIyTCA9IEZBTFNFOworICBpZiAoblIyTCA+IDAgJiYgblIyTCA+PSBuTDJSKSB7CisgICAgYlIyTCA9IFRSVUU7CisgIH0KKyAgYklzQmlkaUFuZE1pcnJvc0ludmVyc2UgPQorICAgICAgYlIyTCAmJiAobWF0cml4LmEgKiBtYXRyaXguZCAtIG1hdHJpeC5iICogbWF0cml4LmMpIDwgMDsKKyAgaW50MzJfdCBpQnVmU3RhcnRBcHBlbmQgPSBtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpOworICBpbnQzMl90IGlDaGFyTGlzdFN0YXJ0QXBwZW5kID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpOworCisgIEZYX0ZMT0FUIHNwYWNpbmcgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG5JdGVtczsgaSsrKSB7CisgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOworICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm87CisgICAgY2hhcmluZm8ubV9PcmlnaW5YID0gMDsKKyAgICBjaGFyaW5mby5tX09yaWdpblkgPSAwOworICAgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbyhpLCAmaXRlbSk7CisgICAgaWYgKGl0ZW0ubV9DaGFyQ29kZSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IG1fVGVtcFRleHRCdWYuR2V0V2lkZVN0cmluZygpOworICAgICAgaWYgKHN0ci5Jc0VtcHR5KCkpIHsKKyAgICAgICAgc3RyID0gbV9UZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHIuSXNFbXB0eSgpIHx8IHN0ci5HZXRBdChzdHIuR2V0TGVuZ3RoKCkgLSAxKSA9PSBURVhUX0JMQU5LX0NIQVIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBGWF9GTE9BVCBmb250c2l6ZV9oID0gcFRleHRPYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplSCgpOworICAgICAgc3BhY2luZyA9IC1mb250c2l6ZV9oICogaXRlbS5tX09yaWdpblggLyAxMDAwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIEZYX0ZMT0FUIGNoYXJTcGFjZSA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2U7CisgICAgaWYgKGNoYXJTcGFjZSA+IDAuMDAxKSB7CisgICAgICBzcGFjaW5nICs9IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZShjaGFyU3BhY2UpOworICAgIH0gZWxzZSBpZiAoY2hhclNwYWNlIDwgLTAuMDAxKSB7CisgICAgICBzcGFjaW5nIC09IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZShGWFNZU19mYWJzKGNoYXJTcGFjZSkpOworICAgIH0KKyAgICBzcGFjaW5nIC09IGJhc2VTcGFjZTsKKyAgICBpZiAoc3BhY2luZyAmJiBpID4gMCkgeworICAgICAgaW50IGxhc3Rfd2lkdGggPSAwOworICAgICAgRlhfRkxPQVQgZm9udHNpemVfaCA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZUgoKTsKKyAgICAgIEZYX0RXT1JEIHNwYWNlX2NoYXJjb2RlID0gcEZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUoJyAnKTsKKyAgICAgIEZYX0ZMT0FUIHRocmVzaG9sZCA9IDA7CisgICAgICBpZiAoc3BhY2VfY2hhcmNvZGUgIT0gLTEpIHsKKyAgICAgICAgdGhyZXNob2xkID0gZm9udHNpemVfaCAqIHBGb250LT5HZXRDaGFyV2lkdGhGKHNwYWNlX2NoYXJjb2RlKSAvIDEwMDA7CisgICAgICB9CisgICAgICBpZiAodGhyZXNob2xkID4gZm9udHNpemVfaCAvIDMpIHsKKyAgICAgICAgdGhyZXNob2xkID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocmVzaG9sZCAvPSAyOworICAgICAgfQorICAgICAgaWYgKHRocmVzaG9sZCA9PSAwKSB7CisgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2g7CisgICAgICAgIGludCB0aGlzX3dpZHRoID0gRlhTWVNfYWJzKEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHBGb250KSk7CisgICAgICAgIHRocmVzaG9sZCA9IHRoaXNfd2lkdGggPiBsYXN0X3dpZHRoID8gKEZYX0ZMT0FUKXRoaXNfd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoRlhfRkxPQVQpbGFzdF93aWR0aDsKKyAgICAgICAgdGhyZXNob2xkID0gX05vcm1hbGl6ZVRocmVzaG9sZCh0aHJlc2hvbGQpOworICAgICAgICB0aHJlc2hvbGQgPSBmb250c2l6ZV9oICogdGhyZXNob2xkIC8gMTAwMDsKKyAgICAgIH0KKyAgICAgIGlmICh0aHJlc2hvbGQgJiYgKHNwYWNpbmcgJiYgc3BhY2luZyA+PSB0aHJlc2hvbGQpKSB7CisgICAgICAgIGNoYXJpbmZvLm1fVW5pY29kZSA9IFRFWFRfQkxBTktfQ0hBUjsKKyAgICAgICAgY2hhcmluZm8ubV9GbGFnID0gRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQ7CisgICAgICAgIGNoYXJpbmZvLm1fcFRleHRPYmogPSBwVGV4dE9iajsKKyAgICAgICAgY2hhcmluZm8ubV9JbmRleCA9IG1fVGV4dEJ1Zi5HZXRMZW5ndGgoKTsKKyAgICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKFRFWFRfQkxBTktfQ0hBUik7CisgICAgICAgIGNoYXJpbmZvLm1fQ2hhckNvZGUgPSAtMTsKKyAgICAgICAgY2hhcmluZm8ubV9NYXRyaXguQ29weShmb3JtTWF0cml4KTsKKyAgICAgICAgbWF0cml4LlRyYW5zZm9ybShpdGVtLm1fT3JpZ2luWCwgaXRlbS5tX09yaWdpblksIGNoYXJpbmZvLm1fT3JpZ2luWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyaW5mby5tX09yaWdpblkpOworICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3ggPQorICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdChjaGFyaW5mby5tX09yaWdpblgsIGNoYXJpbmZvLm1fT3JpZ2luWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmluZm8ubV9PcmlnaW5YLCBjaGFyaW5mby5tX09yaWdpblkpOworICAgICAgICBtX1RlbXBDaGFyTGlzdC5BZGQoY2hhcmluZm8pOworICAgICAgfQorICAgICAgaWYgKGl0ZW0ubV9DaGFyQ29kZSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIHNwYWNpbmcgPSAwOworICAgIENGWF9XaWRlU3RyaW5nIHdzdHJJdGVtID0gcEZvbnQtPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKKyAgICBGWF9CT09MIGJOb1VuaWNvZGUgPSBGQUxTRTsKKyAgICBGWF9XQ0hBUiB3Q2hhciA9IHdzdHJJdGVtLkdldEF0KDApOworICAgIGlmICgod3N0ckl0ZW0uSXNFbXB0eSgpIHx8IHdDaGFyID09IDApICYmIGl0ZW0ubV9DaGFyQ29kZSkgeworICAgICAgaWYgKHdzdHJJdGVtLklzRW1wdHkoKSkgeworICAgICAgICB3c3RySXRlbSArPSAoRlhfV0NIQVIpaXRlbS5tX0NoYXJDb2RlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd3N0ckl0ZW0uU2V0QXQoMCwgKEZYX1dDSEFSKWl0ZW0ubV9DaGFyQ29kZSk7CisgICAgICB9CisgICAgICBiTm9Vbmljb2RlID0gVFJVRTsKKyAgICB9CisgICAgY2hhcmluZm8ubV9JbmRleCA9IC0xOworICAgIGNoYXJpbmZvLm1fQ2hhckNvZGUgPSBpdGVtLm1fQ2hhckNvZGU7CisgICAgaWYgKGJOb1VuaWNvZGUpIHsKKyAgICAgIGNoYXJpbmZvLm1fRmxhZyA9IEZQREZURVhUX0NIQVJfVU5VTklDT0RFOworICAgIH0gZWxzZSB7CisgICAgICBjaGFyaW5mby5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX05PUk1BTDsKKyAgICB9CisgICAgY2hhcmluZm8ubV9wVGV4dE9iaiA9IHBUZXh0T2JqOworICAgIGNoYXJpbmZvLm1fT3JpZ2luWCA9IDAsIGNoYXJpbmZvLm1fT3JpZ2luWSA9IDA7CisgICAgbWF0cml4LlRyYW5zZm9ybShpdGVtLm1fT3JpZ2luWCwgaXRlbS5tX09yaWdpblksIGNoYXJpbmZvLm1fT3JpZ2luWCwKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJpbmZvLm1fT3JpZ2luWSk7CisgICAgRlhfUkVDVCByZWN0KDAsIDAsIDAsIDApOworICAgIHJlY3QuSW50ZXJzZWN0KDAsIDAsIDAsIDApOworICAgIGNoYXJpbmZvLm1fcFRleHRPYmotPkdldEZvbnQoKS0+R2V0Q2hhckJCb3goY2hhcmluZm8ubV9DaGFyQ29kZSwgcmVjdCk7CisgICAgY2hhcmluZm8ubV9DaGFyQm94LnRvcCA9CisgICAgICAgIHJlY3QudG9wICogcFRleHRPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwICsgaXRlbS5tX09yaWdpblk7CisgICAgY2hhcmluZm8ubV9DaGFyQm94LmxlZnQgPQorICAgICAgICByZWN0LmxlZnQgKiBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKyBpdGVtLm1fT3JpZ2luWDsKKyAgICBjaGFyaW5mby5tX0NoYXJCb3gucmlnaHQgPQorICAgICAgICByZWN0LnJpZ2h0ICogcFRleHRPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwICsgaXRlbS5tX09yaWdpblg7CisgICAgY2hhcmluZm8ubV9DaGFyQm94LmJvdHRvbSA9CisgICAgICAgIHJlY3QuYm90dG9tICogcFRleHRPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwICsgaXRlbS5tX09yaWdpblk7CisgICAgaWYgKGZhYnNmKGNoYXJpbmZvLm1fQ2hhckJveC50b3AgLSBjaGFyaW5mby5tX0NoYXJCb3guYm90dG9tKSA8IDAuMDFmKSB7CisgICAgICBjaGFyaW5mby5tX0NoYXJCb3gudG9wID0KKyAgICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3guYm90dG9tICsgcFRleHRPYmotPkdldEZvbnRTaXplKCk7CisgICAgfQorICAgIGlmIChmYWJzZihjaGFyaW5mby5tX0NoYXJCb3gucmlnaHQgLSBjaGFyaW5mby5tX0NoYXJCb3gubGVmdCkgPCAwLjAxZikgeworICAgICAgY2hhcmluZm8ubV9DaGFyQm94LnJpZ2h0ID0KKyAgICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3gubGVmdCArIHBUZXh0T2JqLT5HZXRDaGFyV2lkdGgoY2hhcmluZm8ubV9DaGFyQ29kZSk7CisgICAgfQorICAgIG1hdHJpeC5UcmFuc2Zvcm1SZWN0KGNoYXJpbmZvLm1fQ2hhckJveCk7CisgICAgY2hhcmluZm8ubV9NYXRyaXguQ29weShtYXRyaXgpOworICAgIGlmICh3c3RySXRlbS5Jc0VtcHR5KCkpIHsKKyAgICAgIGNoYXJpbmZvLm1fVW5pY29kZSA9IDA7CisgICAgICBtX1RlbXBDaGFyTGlzdC5BZGQoY2hhcmluZm8pOworICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKDB4ZmZmZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IG5Ub3RhbCA9IHdzdHJJdGVtLkdldExlbmd0aCgpOworICAgICAgRlhfQk9PTCBiRGVsID0gRkFMU0U7CisgICAgICBjb25zdCBpbnQgY291bnQgPSBzdGQ6Om1pbihtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCksIDcpOworICAgICAgRlhfRkxPQVQgdGhyZXNob2xkID0gY2hhcmluZm8ubV9NYXRyaXguVHJhbnNmb3JtWERpc3RhbmNlKAorICAgICAgICAgIChGWF9GTE9BVClURVhUX0NIQVJSQVRJT19HQVBERUxUQSAqIHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpKTsKKyAgICAgIGZvciAoaW50IG4gPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7CisgICAgICAgICAgIG4gPiBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSBjb3VudDsgbi0tKSB7CisgICAgICAgIFBBR0VDSEFSX0lORk8qIGNoYXJpbmZvMSA9IChQQUdFQ0hBUl9JTkZPKiltX1RlbXBDaGFyTGlzdC5HZXRBdChuIC0gMSk7CisgICAgICAgIGlmIChjaGFyaW5mbzEtPm1fQ2hhckNvZGUgPT0gY2hhcmluZm8ubV9DaGFyQ29kZSAmJgorICAgICAgICAgICAgY2hhcmluZm8xLT5tX3BUZXh0T2JqLT5HZXRGb250KCkgPT0KKyAgICAgICAgICAgICAgICBjaGFyaW5mby5tX3BUZXh0T2JqLT5HZXRGb250KCkgJiYKKyAgICAgICAgICAgIEZYU1lTX2ZhYnMoY2hhcmluZm8xLT5tX09yaWdpblggLSBjaGFyaW5mby5tX09yaWdpblgpIDwgdGhyZXNob2xkICYmCisgICAgICAgICAgICBGWFNZU19mYWJzKGNoYXJpbmZvMS0+bV9PcmlnaW5ZIC0gY2hhcmluZm8ubV9PcmlnaW5ZKSA8IHRocmVzaG9sZCkgeworICAgICAgICAgIGJEZWwgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWJEZWwpIHsKKyAgICAgICAgZm9yIChpbnQgbkluZGV4ID0gMDsgbkluZGV4IDwgblRvdGFsOyBuSW5kZXgrKykgeworICAgICAgICAgIGNoYXJpbmZvLm1fVW5pY29kZSA9IHdzdHJJdGVtLkdldEF0KG5JbmRleCk7CisgICAgICAgICAgaWYgKGNoYXJpbmZvLm1fVW5pY29kZSkgeworICAgICAgICAgICAgY2hhcmluZm8ubV9JbmRleCA9IG1fVGV4dEJ1Zi5HZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIG1fVGVtcFRleHRCdWYuQXBwZW5kQ2hhcihjaGFyaW5mby5tX1VuaWNvZGUpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkFwcGVuZENoYXIoMHhmZmZlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9UZW1wQ2hhckxpc3QuQWRkKGNoYXJpbmZvKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpID09IDApIHsKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gbV9UZW1wVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7CisgICAgICAgIGlmICghc3RyLklzRW1wdHkoKSAmJgorICAgICAgICAgICAgc3RyLkdldEF0KHN0ci5HZXRMZW5ndGgoKSAtIDEpID09IFRFWFRfQkxBTktfQ0hBUikgeworICAgICAgICAgIG1fVGVtcFRleHRCdWYuRGVsZXRlKG1fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCkgLSAxLCAxKTsKKyAgICAgICAgICBtX1RlbXBDaGFyTGlzdC5EZWxldGUobV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIC0gMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGJJc0JpZGlBbmRNaXJyb3NJbnZlcnNlKSB7CisgICAgaW50MzJfdCBpLCBqOworICAgIGkgPSBpQ2hhckxpc3RTdGFydEFwcGVuZDsKKyAgICBqID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIC0gMTsKKyAgICBmb3IgKDsgaSA8IGo7IGkrKywgai0tKSB7CisgICAgICBzdGQ6OnN3YXAobV9UZW1wQ2hhckxpc3RbaV0sIG1fVGVtcENoYXJMaXN0W2pdKTsKKyAgICAgIHN0ZDo6c3dhcChtX1RlbXBDaGFyTGlzdFtpXS5tX0luZGV4LCBtX1RlbXBDaGFyTGlzdFtqXS5tX0luZGV4KTsKKyAgICB9CisgICAgRlhfV0NIQVIqIHBUZW1wQnVmZmVyID0gbV9UZW1wVGV4dEJ1Zi5HZXRCdWZmZXIoKTsKKyAgICBpID0gaUJ1ZlN0YXJ0QXBwZW5kOworICAgIGogPSBtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpIC0gMTsKKyAgICBmb3IgKDsgaSA8IGo7IGkrKywgai0tKSB7CisgICAgICBzdGQ6OnN3YXAocFRlbXBCdWZmZXJbaV0sIHBUZW1wQnVmZmVyW2pdKTsKKyAgICB9CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNTYW1lVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpCi17Ci0gICAgaWYgKCFwVGV4dE9iajEgfHwgIXBUZXh0T2JqMikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmNQcmVPYmoocFRleHRPYmoyLT5tX0xlZnQsIHBUZXh0T2JqMi0+bV9Cb3R0b20sIHBUZXh0T2JqMi0+bV9SaWdodCwgcFRleHRPYmoyLT5tX1RvcCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0N1ck9iaihwVGV4dE9iajEtPm1fTGVmdCwgcFRleHRPYmoxLT5tX0JvdHRvbSwgcFRleHRPYmoxLT5tX1JpZ2h0LCBwVGV4dE9iajEtPm1fVG9wKTsKLSAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpICYmIHJjQ3VyT2JqLklzRW1wdHkoKSAmJiAhbV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIEZYX0ZMT0FUIGRiWGRpZiA9IEZYU1lTX2ZhYnMocmNQcmVPYmoubGVmdCAtIHJjQ3VyT2JqLmxlZnQpOwotICAgICAgICBpbnQgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgICAgIGlmIChuQ291bnQgPj0gMikgewotICAgICAgICAgICAgUEFHRUNIQVJfSU5GTyBwZXJDaGFyVGVtcCA9IChQQUdFQ0hBUl9JTkZPKW1fY2hhckxpc3RbbkNvdW50IC0gMl07Ci0gICAgICAgICAgICBGWF9GTE9BVCBkYlNwYWNlID0gcGVyQ2hhclRlbXAubV9DaGFyQm94LldpZHRoKCk7Ci0gICAgICAgICAgICBpZiAoZGJYZGlmID4gZGJTcGFjZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIXJjUHJlT2JqLklzRW1wdHkoKSB8fCAhcmNDdXJPYmouSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJjUHJlT2JqLkludGVyc2VjdChyY0N1ck9iaik7Ci0gICAgICAgIGlmIChyY1ByZU9iai5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRlhTWVNfZmFicyhyY1ByZU9iai5XaWR0aCgpIC0gcmNDdXJPYmouV2lkdGgoKSkgPiByY0N1ck9iai5XaWR0aCgpIC8gMikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwVGV4dE9iajItPkdldEZvbnRTaXplKCkgIT0gcFRleHRPYmoxLT5HZXRGb250U2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IG5QcmVDb3VudCA9IHBUZXh0T2JqMi0+Q291bnRJdGVtcygpOwotICAgIGludCBuQ3VyQ291bnQgPSBwVGV4dE9iajEtPkNvdW50SXRlbXMoKTsKLSAgICBpZiAoblByZUNvdW50ICE9IG5DdXJDb3VudCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbVBlciwgaXRlbUN1cjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5QcmVDb3VudDsgaSsrKSB7Ci0gICAgICAgIHBUZXh0T2JqMi0+R2V0SXRlbUluZm8oaSwgJml0ZW1QZXIpOwotICAgICAgICBwVGV4dE9iajEtPkdldEl0ZW1JbmZvKGksICZpdGVtQ3VyKTsKLSAgICAgICAgaWYgKGl0ZW1DdXIubV9DaGFyQ29kZSAhPSBpdGVtUGVyLm1fQ2hhckNvZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihGWFNZU19mYWJzKHBUZXh0T2JqMS0+R2V0UG9zWCgpIC0gcFRleHRPYmoyLT5HZXRQb3NYKCkpID4gR2V0Q2hhcldpZHRoKGl0ZW1QZXIubV9DaGFyQ29kZSwgcFRleHRPYmoyLT5HZXRGb250KCkpKnBUZXh0T2JqMi0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKiAwLjkgfHwKLSAgICAgICAgICAgIEZYU1lTX2ZhYnMocFRleHRPYmoxLT5HZXRQb3NZKCkgLSBwVGV4dE9iajItPkdldFBvc1koKSkgPgotICAgICAgICAgICAgRlhfTUFYKEZYX01BWChyY1ByZU9iai5IZWlnaHQoKSAsIHJjUHJlT2JqLldpZHRoKCkpLCBwVGV4dE9iajItPkdldEZvbnRTaXplKCkpIC8gOCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworaW50MzJfdCBDUERGX1RleHRQYWdlOjpHZXRUZXh0T2JqZWN0V3JpdGluZ01vZGUoCisgICAgY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaikgeworICBpbnQzMl90IG5DaGFycyA9IHBUZXh0T2JqLT5Db3VudENoYXJzKCk7CisgIGlmIChuQ2hhcnMgPT0gMSkgeworICAgIHJldHVybiBtX1RleHRsaW5lRGlyOworICB9CisgIENQREZfVGV4dE9iamVjdEl0ZW0gZmlyc3QsIGxhc3Q7CisgIHBUZXh0T2JqLT5HZXRDaGFySW5mbygwLCAmZmlyc3QpOworICBwVGV4dE9iai0+R2V0Q2hhckluZm8obkNoYXJzIC0gMSwgJmxhc3QpOworICBDRlhfTWF0cml4IHRleHRNYXRyaXg7CisgIHBUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZ0ZXh0TWF0cml4KTsKKyAgdGV4dE1hdHJpeC5UcmFuc2Zvcm1Qb2ludChmaXJzdC5tX09yaWdpblgsIGZpcnN0Lm1fT3JpZ2luWSk7CisgIHRleHRNYXRyaXguVHJhbnNmb3JtUG9pbnQobGFzdC5tX09yaWdpblgsIGxhc3QubV9PcmlnaW5ZKTsKKyAgRlhfRkxPQVQgZFggPSBGWFNZU19mYWJzKGxhc3QubV9PcmlnaW5YIC0gZmlyc3QubV9PcmlnaW5YKTsKKyAgRlhfRkxPQVQgZFkgPSBGWFNZU19mYWJzKGxhc3QubV9PcmlnaW5ZIC0gZmlyc3QubV9PcmlnaW5ZKTsKKyAgaWYgKGRYIDw9IDAuMDAwMWYgJiYgZFkgPD0gMC4wMDAxZikgeworICAgIHJldHVybiAtMTsKKyAgfQorICBDRlhfVmVjdG9yRiB2OworICB2LlNldChkWCwgZFkpOworICB2Lk5vcm1hbGl6ZSgpOworICBpZiAodi55IDw9IDAuMDg3MmYpIHsKKyAgICByZXR1cm4gdi54IDw9IDAuMDg3MmYgPyBtX1RleHRsaW5lRGlyIDogMDsKKyAgfQorICBpZiAodi54IDw9IDAuMDg3MmYpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gbV9UZXh0bGluZURpcjsKIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNTYW1lQXNQcmVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmosIEZYX1BPU0lUSU9OIE9ialBvcykKLXsKLSAgICBpZiAoIXBUZXh0T2JqKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNIeXBoZW4oRlhfV0NIQVIgY3VyQ2hhcikgeworICBDRlhfV2lkZVN0cmluZyBzdHJDdXJUZXh0ID0gbV9UZW1wVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7CisgIGlmIChzdHJDdXJUZXh0LkdldExlbmd0aCgpID09IDApIHsKKyAgICBzdHJDdXJUZXh0ID0gbV9UZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsKKyAgfQorICBGWF9TVFJTSVpFIG5Db3VudCA9IHN0ckN1clRleHQuR2V0TGVuZ3RoKCk7CisgIGludCBuSW5kZXggPSBuQ291bnQgLSAxOworICBGWF9XQ0hBUiB3Y1RtcCA9IHN0ckN1clRleHQuR2V0QXQobkluZGV4KTsKKyAgd2hpbGUgKHdjVG1wID09IDB4MjAgJiYgbkluZGV4IDw9IG5Db3VudCAtIDEgJiYgbkluZGV4ID49IDApIHsKKyAgICB3Y1RtcCA9IHN0ckN1clRleHQuR2V0QXQoLS1uSW5kZXgpOworICB9CisgIGlmICgweDJEID09IHdjVG1wIHx8IDB4QUQgPT0gd2NUbXApIHsKKyAgICBpZiAoLS1uSW5kZXggPiAwKSB7CisgICAgICBGWF9XQ0hBUiBwcmVDaGFyID0gc3RyQ3VyVGV4dC5HZXRBdCgobkluZGV4KSk7CisgICAgICBpZiAoKChwcmVDaGFyID49IEwnQScgJiYgcHJlQ2hhciA8PSBMJ1onKSB8fAorICAgICAgICAgICAocHJlQ2hhciA+PSBMJ2EnICYmIHByZUNoYXIgPD0gTCd6JykpICYmCisgICAgICAgICAgKChjdXJDaGFyID49IEwnQScgJiYgY3VyQ2hhciA8PSBMJ1onKSB8fAorICAgICAgICAgICAoY3VyQ2hhciA+PSBMJ2EnICYmIGN1ckNoYXIgPD0gTCd6JykpKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQogICAgIH0KLSAgICBpbnQgaSA9IDA7Ci0gICAgaWYgKCFPYmpQb3MpIHsKLSAgICAgICAgT2JqUG9zID0gbV9wUGFnZS0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgfQotICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IG1fcFBhZ2UtPkdldFByZXZPYmplY3QoT2JqUG9zKTsKLSAgICB3aGlsZSAoaSA8IDUgJiYgT2JqUG9zKSB7Ci0gICAgICAgIHBPYmogPSBtX3BQYWdlLT5HZXRQcmV2T2JqZWN0KE9ialBvcyk7Ci0gICAgICAgIGlmKHBPYmogPT0gcFRleHRPYmopIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBPYmotPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKElzU2FtZVRleHRPYmplY3QoKENQREZfVGV4dE9iamVjdCopcE9iaiwgcFRleHRPYmopKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6R2VuZXJhdGVDaGFySW5mbyhGWF9XQ0hBUiB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKQotewogICAgIGludCBzaXplID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpOwogICAgIFBBR0VDSEFSX0lORk8gcHJlQ2hhcjsKICAgICBpZiAoc2l6ZSkgewotICAgICAgICBwcmVDaGFyID0gKFBBR0VDSEFSX0lORk8pbV9UZW1wQ2hhckxpc3Rbc2l6ZSAtIDFdOworICAgICAgcHJlQ2hhciA9IChQQUdFQ0hBUl9JTkZPKW1fVGVtcENoYXJMaXN0W3NpemUgLSAxXTsKICAgICB9IGVsc2UgewotICAgICAgICBzaXplID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgICAgIGlmKHNpemUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgc2l6ZSA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOworICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBwcmVDaGFyID0gKFBBR0VDSEFSX0lORk8pbV9jaGFyTGlzdFtzaXplIC0gMV07CisgICAgfQorICAgIGlmIChGUERGVEVYVF9DSEFSX1BJRUNFID09IHByZUNoYXIubV9GbGFnKQorICAgICAgaWYgKDB4QUQgPT0gcHJlQ2hhci5tX1VuaWNvZGUgfHwgMHgyRCA9PSBwcmVDaGFyLm1fVW5pY29kZSkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitpbnQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc0luc2VydE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBmb3JtTWF0cml4KSB7CisgIEZpbmRQcmV2aW91c1RleHRPYmplY3QoKTsKKyAgRlhfQk9PTCBiTmV3bGluZSA9IEZBTFNFOworICBpbnQgV3JpdGluZ01vZGUgPSBHZXRUZXh0T2JqZWN0V3JpdGluZ01vZGUocE9iaik7CisgIGlmIChXcml0aW5nTW9kZSA9PSAtMSkgeworICAgIFdyaXRpbmdNb2RlID0gR2V0VGV4dE9iamVjdFdyaXRpbmdNb2RlKG1fcFByZVRleHRPYmopOworICB9CisgIENGWF9GbG9hdFJlY3QgdGhpc19yZWN0KHBPYmotPm1fTGVmdCwgcE9iai0+bV9Cb3R0b20sIHBPYmotPm1fUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmotPm1fVG9wKTsKKyAgQ0ZYX0Zsb2F0UmVjdCBwcmV2X3JlY3QobV9wUHJlVGV4dE9iai0+bV9MZWZ0LCBtX3BQcmVUZXh0T2JqLT5tX0JvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUHJlVGV4dE9iai0+bV9SaWdodCwgbV9wUHJlVGV4dE9iai0+bV9Ub3ApOworICBDUERGX1RleHRPYmplY3RJdGVtIFByZXZJdGVtLCBpdGVtOworICBpbnQgbkl0ZW0gPSBtX3BQcmVUZXh0T2JqLT5Db3VudEl0ZW1zKCk7CisgIG1fcFByZVRleHRPYmotPkdldEl0ZW1JbmZvKG5JdGVtIC0gMSwgJlByZXZJdGVtKTsKKyAgcE9iai0+R2V0SXRlbUluZm8oMCwgJml0ZW0pOworICBDRlhfV2lkZVN0cmluZyB3c3RySXRlbSA9CisgICAgICBwT2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKKyAgaWYgKHdzdHJJdGVtLklzRW1wdHkoKSkgeworICAgIHdzdHJJdGVtICs9IChGWF9XQ0hBUilpdGVtLm1fQ2hhckNvZGU7CisgIH0KKyAgRlhfV0NIQVIgY3VyQ2hhciA9IHdzdHJJdGVtLkdldEF0KDApOworICBpZiAoV3JpdGluZ01vZGUgPT0gMCkgeworICAgIGlmICh0aGlzX3JlY3QuSGVpZ2h0KCkgPiA0LjUgJiYgcHJldl9yZWN0LkhlaWdodCgpID4gNC41KSB7CisgICAgICBGWF9GTE9BVCB0b3AgPQorICAgICAgICAgIHRoaXNfcmVjdC50b3AgPCBwcmV2X3JlY3QudG9wID8gdGhpc19yZWN0LnRvcCA6IHByZXZfcmVjdC50b3A7CisgICAgICBGWF9GTE9BVCBib3R0b20gPSB0aGlzX3JlY3QuYm90dG9tID4gcHJldl9yZWN0LmJvdHRvbSA/IHRoaXNfcmVjdC5ib3R0b20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcHJldl9yZWN0LmJvdHRvbTsKKyAgICAgIGlmIChib3R0b20gPj0gdG9wKSB7CisgICAgICAgIGlmIChJc0h5cGhlbihjdXJDaGFyKSkgeworICAgICAgICAgIHJldHVybiAzOwogICAgICAgICB9Ci0gICAgICAgIHByZUNoYXIgPSAoUEFHRUNIQVJfSU5GTyltX2NoYXJMaXN0W3NpemUgLSAxXTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgICB9CiAgICAgfQotICAgIGluZm8ubV9JbmRleCA9IG1fVGV4dEJ1Zi5HZXRMZW5ndGgoKTsKLSAgICBpbmZvLm1fVW5pY29kZSA9IHVuaWNvZGU7Ci0gICAgaW5mby5tX3BUZXh0T2JqID0gTlVMTDsKLSAgICBpbmZvLm1fQ2hhckNvZGUgPSAtMTsKLSAgICBpbmZvLm1fRmxhZyA9IEZQREZURVhUX0NIQVJfR0VORVJBVEVEOwotICAgIGludCBwcmVXaWR0aCA9IDA7Ci0gICAgaWYgKHByZUNoYXIubV9wVGV4dE9iaiAmJiBwcmVDaGFyLm1fQ2hhckNvZGUgIT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgcHJlV2lkdGggPSBHZXRDaGFyV2lkdGgocHJlQ2hhci5tX0NoYXJDb2RlLCBwcmVDaGFyLm1fcFRleHRPYmotPkdldEZvbnQoKSk7CisgIH0gZWxzZSBpZiAoV3JpdGluZ01vZGUgPT0gMSkgeworICAgIGlmICh0aGlzX3JlY3QuV2lkdGgoKSA+IHBPYmotPkdldEZvbnRTaXplKCkgKiAwLjFmICYmCisgICAgICAgIHByZXZfcmVjdC5XaWR0aCgpID4gbV9wUHJlVGV4dE9iai0+R2V0Rm9udFNpemUoKSAqIDAuMWYpIHsKKyAgICAgIEZYX0ZMT0FUIGxlZnQgPSB0aGlzX3JlY3QubGVmdCA+IG1fQ3VybGluZVJlY3QubGVmdCA/IHRoaXNfcmVjdC5sZWZ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX0N1cmxpbmVSZWN0LmxlZnQ7CisgICAgICBGWF9GTE9BVCByaWdodCA9IHRoaXNfcmVjdC5yaWdodCA8IG1fQ3VybGluZVJlY3QucmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpc19yZWN0LnJpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fQ3VybGluZVJlY3QucmlnaHQ7CisgICAgICBpZiAocmlnaHQgPD0gbGVmdCkgeworICAgICAgICBpZiAoSXNIeXBoZW4oY3VyQ2hhcikpIHsKKyAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMjsKKyAgICAgIH0KICAgICB9Ci0gICAgRlhfRkxPQVQgZnMgPSAwOwotICAgIGlmKHByZUNoYXIubV9wVGV4dE9iaikgewotICAgICAgICBmcyA9IHByZUNoYXIubV9wVGV4dE9iai0+R2V0Rm9udFNpemUoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcyA9IHByZUNoYXIubV9DaGFyQm94LkhlaWdodCgpOworICB9CisgIEZYX0ZMT0FUIGxhc3RfcG9zID0gUHJldkl0ZW0ubV9PcmlnaW5YOworICBpbnQgbkxhc3RXaWR0aCA9IEdldENoYXJXaWR0aChQcmV2SXRlbS5tX0NoYXJDb2RlLCBtX3BQcmVUZXh0T2JqLT5HZXRGb250KCkpOworICBGWF9GTE9BVCBsYXN0X3dpZHRoID0gbkxhc3RXaWR0aCAqIG1fcFByZVRleHRPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOworICBsYXN0X3dpZHRoID0gRlhTWVNfZmFicyhsYXN0X3dpZHRoKTsKKyAgaW50IG5UaGlzV2lkdGggPSBHZXRDaGFyV2lkdGgoaXRlbS5tX0NoYXJDb2RlLCBwT2JqLT5HZXRGb250KCkpOworICBGWF9GTE9BVCB0aGlzX3dpZHRoID0gblRoaXNXaWR0aCAqIHBPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOworICB0aGlzX3dpZHRoID0gRlhTWVNfZmFicyh0aGlzX3dpZHRoKTsKKyAgRlhfRkxPQVQgdGhyZXNob2xkID0KKyAgICAgIGxhc3Rfd2lkdGggPiB0aGlzX3dpZHRoID8gbGFzdF93aWR0aCAvIDQgOiB0aGlzX3dpZHRoIC8gNDsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBwcmV2X21hdHJpeCwgcHJldl9yZXZlcnNlOworICBtX3BQcmVUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZwcmV2X21hdHJpeCk7CisgIHByZXZfbWF0cml4LkNvbmNhdChtX3Blck1hdHJpeCk7CisgIHByZXZfcmV2ZXJzZS5TZXRSZXZlcnNlKHByZXZfbWF0cml4KTsKKyAgRlhfRkxPQVQgeCA9IHBPYmotPkdldFBvc1goKTsKKyAgRlhfRkxPQVQgeSA9IHBPYmotPkdldFBvc1koKTsKKyAgZm9ybU1hdHJpeC5UcmFuc2Zvcm0oeCwgeSk7CisgIHByZXZfcmV2ZXJzZS5UcmFuc2Zvcm0oeCwgeSk7CisgIGlmIChsYXN0X3dpZHRoIDwgdGhpc193aWR0aCkgeworICAgIHRocmVzaG9sZCA9IHByZXZfcmV2ZXJzZS5UcmFuc2Zvcm1EaXN0YW5jZSh0aHJlc2hvbGQpOworICB9CisgIENGWF9GbG9hdFJlY3QgcmVjdDEobV9wUHJlVGV4dE9iai0+bV9MZWZ0LCBwT2JqLT5tX0JvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICBtX3BQcmVUZXh0T2JqLT5tX1JpZ2h0LCBwT2JqLT5tX1RvcCk7CisgIENGWF9GbG9hdFJlY3QgcmVjdDIobV9wUHJlVGV4dE9iai0+bV9MZWZ0LCBtX3BQcmVUZXh0T2JqLT5tX0JvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICBtX3BQcmVUZXh0T2JqLT5tX1JpZ2h0LCBtX3BQcmVUZXh0T2JqLT5tX1RvcCk7CisgIENGWF9GbG9hdFJlY3QgcmVjdDMgPSByZWN0MTsKKyAgcmVjdDEuSW50ZXJzZWN0KHJlY3QyKTsKKyAgaWYgKFdyaXRpbmdNb2RlID09IDApIHsKKyAgICBpZiAoKHJlY3QxLklzRW1wdHkoKSAmJiByZWN0Mi5IZWlnaHQoKSA+IDUgJiYgcmVjdDMuSGVpZ2h0KCkgPiA1KSB8fAorICAgICAgICAoKHkgPiB0aHJlc2hvbGQgKiAyIHx8IHkgPCB0aHJlc2hvbGQgKiAtMykgJiYKKyAgICAgICAgIChGWFNZU19mYWJzKHkpIDwgMSA/IEZYU1lTX2ZhYnMoeCkgPCBGWFNZU19mYWJzKHkpIDogVFJVRSkpKSB7CisgICAgICBiTmV3bGluZSA9IFRSVUU7CisgICAgICBpZiAobkl0ZW0gPiAxKSB7CisgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gdGVtcEl0ZW07CisgICAgICAgIG1fcFByZVRleHRPYmotPkdldEl0ZW1JbmZvKDAsICZ0ZW1wSXRlbSk7CisgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbTsKKyAgICAgICAgbV9wUHJlVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgmbSk7CisgICAgICAgIGlmIChQcmV2SXRlbS5tX09yaWdpblggPiB0ZW1wSXRlbS5tX09yaWdpblggJiYKKyAgICAgICAgICAgIG1fRGlzcGxheU1hdHJpeC5hID4gMC45ICYmIG1fRGlzcGxheU1hdHJpeC5iIDwgMC4xICYmCisgICAgICAgICAgICBtX0Rpc3BsYXlNYXRyaXguYyA8IDAuMSAmJiBtX0Rpc3BsYXlNYXRyaXguZCA8IC0wLjkgJiYgbS5iIDwgMC4xICYmCisgICAgICAgICAgICBtLmMgPCAwLjEpIHsKKyAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJlKDAsIG1fcFByZVRleHRPYmotPm1fQm90dG9tLCAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUHJlVGV4dE9iai0+bV9Ub3ApOworICAgICAgICAgIGlmIChyZS5Db250YWlucyhwT2JqLT5HZXRQb3NYKCksIHBPYmotPkdldFBvc1koKSkpIHsKKyAgICAgICAgICAgIGJOZXdsaW5lID0gRkFMU0U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmUoMCwgcE9iai0+bV9Cb3R0b20sIDEwMDAsIHBPYmotPm1fVG9wKTsKKyAgICAgICAgICAgIGlmIChyZS5Db250YWlucyhtX3BQcmVUZXh0T2JqLT5HZXRQb3NYKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUHJlVGV4dE9iai0+R2V0UG9zWSgpKSkgeworICAgICAgICAgICAgICBiTmV3bGluZSA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBpZighZnMpIHsKLSAgICAgICAgZnMgPSAxOworICB9CisgIGlmIChiTmV3bGluZSkgeworICAgIGlmIChJc0h5cGhlbihjdXJDaGFyKSkgeworICAgICAgcmV0dXJuIDM7CiAgICAgfQotICAgIGluZm8ubV9PcmlnaW5YID0gcHJlQ2hhci5tX09yaWdpblggKyBwcmVXaWR0aCAqIChmcykgLyAxMDAwOwotICAgIGluZm8ubV9PcmlnaW5ZID0gcHJlQ2hhci5tX09yaWdpblk7Ci0gICAgaW5mby5tX0NoYXJCb3ggPSBDRlhfRmxvYXRSZWN0KGluZm8ubV9PcmlnaW5YLCBpbmZvLm1fT3JpZ2luWSwgaW5mby5tX09yaWdpblgsIGluZm8ubV9PcmlnaW5ZKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gMjsKKyAgfQorICBpbnQzMl90IG5DaGFycyA9IHBPYmotPkNvdW50Q2hhcnMoKTsKKyAgaWYgKG5DaGFycyA9PSAxICYmICgweDJEID09IGN1ckNoYXIgfHwgMHhBRCA9PSBjdXJDaGFyKSkKKyAgICBpZiAoSXNIeXBoZW4oY3VyQ2hhcikpIHsKKyAgICAgIHJldHVybiAzOworICAgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgUHJldlN0ciA9CisgICAgICBtX3BQcmVUZXh0T2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoUHJldkl0ZW0ubV9DaGFyQ29kZSk7CisgIEZYX1dDSEFSIHByZUNoYXIgPSBQcmV2U3RyLkdldEF0KFByZXZTdHIuR2V0TGVuZ3RoKCkgLSAxKTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7CisgIHBPYmotPkdldFRleHRNYXRyaXgoJm1hdHJpeCk7CisgIG1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7CisgIHRocmVzaG9sZCA9IChGWF9GTE9BVCkobkxhc3RXaWR0aCA+IG5UaGlzV2lkdGggPyBuTGFzdFdpZHRoIDogblRoaXNXaWR0aCk7CisgIHRocmVzaG9sZCA9IHRocmVzaG9sZCA+IDQwMAorICAgICAgICAgICAgICAgICAgPyAodGhyZXNob2xkIDwgNzAwCisgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aHJlc2hvbGQgLyA0CisgICAgICAgICAgICAgICAgICAgICAgICAgOiAodGhyZXNob2xkID4gODAwID8gdGhyZXNob2xkIC8gNiA6IHRocmVzaG9sZCAvIDUpKQorICAgICAgICAgICAgICAgICAgOiAodGhyZXNob2xkIC8gMik7CisgIGlmIChuTGFzdFdpZHRoID49IG5UaGlzV2lkdGgpIHsKKyAgICB0aHJlc2hvbGQgKj0gRlhTWVNfZmFicyhtX3BQcmVUZXh0T2JqLT5HZXRGb250U2l6ZSgpKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJlc2hvbGQgKj0gRlhTWVNfZmFicyhwT2JqLT5HZXRGb250U2l6ZSgpKTsKKyAgICB0aHJlc2hvbGQgPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UodGhyZXNob2xkKTsKKyAgICB0aHJlc2hvbGQgPSBwcmV2X3JldmVyc2UuVHJhbnNmb3JtRGlzdGFuY2UodGhyZXNob2xkKTsKKyAgfQorICB0aHJlc2hvbGQgLz0gMTAwMDsKKyAgaWYgKCh0aHJlc2hvbGQgPCAxLjQ4ODEgJiYgdGhyZXNob2xkID4gMS40ODc5KSB8fAorICAgICAgKHRocmVzaG9sZCA8IDEuMzkwMDEgJiYgdGhyZXNob2xkID4gMS4zODk5OSkpIHsKKyAgICB0aHJlc2hvbGQgKj0gMS41OworICB9CisgIGlmIChGWFNZU19mYWJzKGxhc3RfcG9zICsgbGFzdF93aWR0aCAtIHgpID4gdGhyZXNob2xkICYmIGN1ckNoYXIgIT0gTCcgJyAmJgorICAgICAgcHJlQ2hhciAhPSBMJyAnKQorICAgIGlmIChjdXJDaGFyICE9IEwnICcgJiYgcHJlQ2hhciAhPSBMJyAnKSB7CisgICAgICBpZiAoKHggLSBsYXN0X3BvcyAtIGxhc3Rfd2lkdGgpID4gdGhyZXNob2xkIHx8CisgICAgICAgICAgKGxhc3RfcG9zIC0geCAtIGxhc3Rfd2lkdGgpID4gdGhyZXNob2xkKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgaWYgKHggPCAwICYmIChsYXN0X3BvcyAtIHggLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGlmICgoeCAtIGxhc3RfcG9zIC0gbGFzdF93aWR0aCkgPiB0aGlzX3dpZHRoIHx8CisgICAgICAgICAgKHggLSBsYXN0X3BvcyAtIHRoaXNfd2lkdGgpID4gbGFzdF93aWR0aCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIHJldHVybiAwOwogfQotRlhfQk9PTCBDUERGX1RleHRQYWdlOjpJc1JlY3RJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDEsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QyKQotewotICAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHJlY3QxOwotICAgIHJlY3QuSW50ZXJzZWN0KHJlY3QyKTsKLSAgICByZXR1cm4gIXJlY3QuSXNFbXB0eSgpOworRlhfQk9PTCBDUERGX1RleHRQYWdlOjpJc1NhbWVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmoyKSB7CisgIGlmICghcFRleHRPYmoxIHx8ICFwVGV4dE9iajIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCByY1ByZU9iaihwVGV4dE9iajItPm1fTGVmdCwgcFRleHRPYmoyLT5tX0JvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwVGV4dE9iajItPm1fUmlnaHQsIHBUZXh0T2JqMi0+bV9Ub3ApOworICBDRlhfRmxvYXRSZWN0IHJjQ3VyT2JqKHBUZXh0T2JqMS0+bV9MZWZ0LCBwVGV4dE9iajEtPm1fQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBUZXh0T2JqMS0+bV9SaWdodCwgcFRleHRPYmoxLT5tX1RvcCk7CisgIGlmIChyY1ByZU9iai5Jc0VtcHR5KCkgJiYgcmNDdXJPYmouSXNFbXB0eSgpICYmCisgICAgICAhbV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7CisgICAgRlhfRkxPQVQgZGJYZGlmID0gRlhTWVNfZmFicyhyY1ByZU9iai5sZWZ0IC0gcmNDdXJPYmoubGVmdCk7CisgICAgaW50IG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOworICAgIGlmIChuQ291bnQgPj0gMikgeworICAgICAgUEFHRUNIQVJfSU5GTyBwZXJDaGFyVGVtcCA9IChQQUdFQ0hBUl9JTkZPKW1fY2hhckxpc3RbbkNvdW50IC0gMl07CisgICAgICBGWF9GTE9BVCBkYlNwYWNlID0gcGVyQ2hhclRlbXAubV9DaGFyQm94LldpZHRoKCk7CisgICAgICBpZiAoZGJYZGlmID4gZGJTcGFjZSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICghcmNQcmVPYmouSXNFbXB0eSgpIHx8ICFyY0N1ck9iai5Jc0VtcHR5KCkpIHsKKyAgICByY1ByZU9iai5JbnRlcnNlY3QocmNDdXJPYmopOworICAgIGlmIChyY1ByZU9iai5Jc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKEZYU1lTX2ZhYnMocmNQcmVPYmouV2lkdGgoKSAtIHJjQ3VyT2JqLldpZHRoKCkpID4KKyAgICAgICAgcmNDdXJPYmouV2lkdGgoKSAvIDIpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKHBUZXh0T2JqMi0+R2V0Rm9udFNpemUoKSAhPSBwVGV4dE9iajEtPkdldEZvbnRTaXplKCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgaW50IG5QcmVDb3VudCA9IHBUZXh0T2JqMi0+Q291bnRJdGVtcygpOworICBpbnQgbkN1ckNvdW50ID0gcFRleHRPYmoxLT5Db3VudEl0ZW1zKCk7CisgIGlmIChuUHJlQ291bnQgIT0gbkN1ckNvdW50KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbVBlciwgaXRlbUN1cjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUHJlQ291bnQ7IGkrKykgeworICAgIHBUZXh0T2JqMi0+R2V0SXRlbUluZm8oaSwgJml0ZW1QZXIpOworICAgIHBUZXh0T2JqMS0+R2V0SXRlbUluZm8oaSwgJml0ZW1DdXIpOworICAgIGlmIChpdGVtQ3VyLm1fQ2hhckNvZGUgIT0gaXRlbVBlci5tX0NoYXJDb2RlKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIGlmIChGWFNZU19mYWJzKHBUZXh0T2JqMS0+R2V0UG9zWCgpIC0gcFRleHRPYmoyLT5HZXRQb3NYKCkpID4KKyAgICAgICAgICBHZXRDaGFyV2lkdGgoaXRlbVBlci5tX0NoYXJDb2RlLCBwVGV4dE9iajItPkdldEZvbnQoKSkgKgorICAgICAgICAgICAgICBwVGV4dE9iajItPkdldEZvbnRTaXplKCkgLyAxMDAwICogMC45IHx8CisgICAgICBGWFNZU19mYWJzKHBUZXh0T2JqMS0+R2V0UG9zWSgpIC0gcFRleHRPYmoyLT5HZXRQb3NZKCkpID4KKyAgICAgICAgICBGWF9NQVgoRlhfTUFYKHJjUHJlT2JqLkhlaWdodCgpLCByY1ByZU9iai5XaWR0aCgpKSwKKyAgICAgICAgICAgICAgICAgcFRleHRPYmoyLT5HZXRGb250U2l6ZSgpKSAvCisgICAgICAgICAgICAgIDgpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MCUNQREZfVGV4dFBhZ2U6OklzTGV0dGVyKEZYX1dDSEFSIHVuaWNvZGUpCi17Ci0gICAgaWYgKHVuaWNvZGUgPCBMJ0EnKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNTYW1lQXNQcmVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBPYmpQb3MpIHsKKyAgaWYgKCFwVGV4dE9iaikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgaSA9IDA7CisgIGlmICghT2JqUG9zKSB7CisgICAgT2JqUG9zID0gbV9wUGFnZS0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCk7CisgIH0KKyAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gbV9wUGFnZS0+R2V0UHJldk9iamVjdChPYmpQb3MpOworICB3aGlsZSAoaSA8IDUgJiYgT2JqUG9zKSB7CisgICAgcE9iaiA9IG1fcFBhZ2UtPkdldFByZXZPYmplY3QoT2JqUG9zKTsKKyAgICBpZiAocE9iaiA9PSBwVGV4dE9iaikgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmICh1bmljb2RlID4gTCdaJyAmJiB1bmljb2RlIDwgTCdhJykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKHBPYmotPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAodW5pY29kZSA+IEwneicpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChJc1NhbWVUZXh0T2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmosIHBUZXh0T2JqKSkgeworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIGkrKzsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfVGV4dFBhZ2U6OkdlbmVyYXRlQ2hhckluZm8oRlhfV0NIQVIgdW5pY29kZSwgUEFHRUNIQVJfSU5GTyYgaW5mbykgeworICBpbnQgc2l6ZSA9IG1fVGVtcENoYXJMaXN0LkdldFNpemUoKTsKKyAgUEFHRUNIQVJfSU5GTyBwcmVDaGFyOworICBpZiAoc2l6ZSkgeworICAgIHByZUNoYXIgPSAoUEFHRUNIQVJfSU5GTyltX1RlbXBDaGFyTGlzdFtzaXplIC0gMV07CisgIH0gZWxzZSB7CisgICAgc2l6ZSA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcHJlQ2hhciA9IChQQUdFQ0hBUl9JTkZPKW1fY2hhckxpc3Rbc2l6ZSAtIDFdOworICB9CisgIGluZm8ubV9JbmRleCA9IG1fVGV4dEJ1Zi5HZXRMZW5ndGgoKTsKKyAgaW5mby5tX1VuaWNvZGUgPSB1bmljb2RlOworICBpbmZvLm1fcFRleHRPYmogPSBOVUxMOworICBpbmZvLm1fQ2hhckNvZGUgPSAtMTsKKyAgaW5mby5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRDsKKyAgaW50IHByZVdpZHRoID0gMDsKKyAgaWYgKHByZUNoYXIubV9wVGV4dE9iaiAmJiBwcmVDaGFyLm1fQ2hhckNvZGUgIT0gKEZYX0RXT1JEKS0xKSB7CisgICAgcHJlV2lkdGggPSBHZXRDaGFyV2lkdGgocHJlQ2hhci5tX0NoYXJDb2RlLCBwcmVDaGFyLm1fcFRleHRPYmotPkdldEZvbnQoKSk7CisgIH0KKyAgRlhfRkxPQVQgZnMgPSAwOworICBpZiAocHJlQ2hhci5tX3BUZXh0T2JqKSB7CisgICAgZnMgPSBwcmVDaGFyLm1fcFRleHRPYmotPkdldEZvbnRTaXplKCk7CisgIH0gZWxzZSB7CisgICAgZnMgPSBwcmVDaGFyLm1fQ2hhckJveC5IZWlnaHQoKTsKKyAgfQorICBpZiAoIWZzKSB7CisgICAgZnMgPSAxOworICB9CisgIGluZm8ubV9PcmlnaW5YID0gcHJlQ2hhci5tX09yaWdpblggKyBwcmVXaWR0aCAqIChmcykgLyAxMDAwOworICBpbmZvLm1fT3JpZ2luWSA9IHByZUNoYXIubV9PcmlnaW5ZOworICBpbmZvLm1fQ2hhckJveCA9IENGWF9GbG9hdFJlY3QoaW5mby5tX09yaWdpblgsIGluZm8ubV9PcmlnaW5ZLCBpbmZvLm1fT3JpZ2luWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubV9PcmlnaW5ZKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfVGV4dFBhZ2U6OklzUmVjdEludGVyc2VjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QyKSB7CisgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHJlY3QxOworICByZWN0LkludGVyc2VjdChyZWN0Mik7CisgIHJldHVybiAhcmVjdC5Jc0VtcHR5KCk7Cit9CitGWF9CT09MIENQREZfVGV4dFBhZ2U6OklzTGV0dGVyKEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgaWYgKHVuaWNvZGUgPCBMJ0EnKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICh1bmljb2RlID4gTCdaJyAmJiB1bmljb2RlIDwgTCdhJykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAodW5pY29kZSA+IEwneicpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiBDUERGX1RleHRQYWdlRmluZDo6Q1BERl9UZXh0UGFnZUZpbmQoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKQogICAgIDogbV9wVGV4dFBhZ2UocFRleHRQYWdlKSwKQEAgLTIwODYsNjEzICsyMTY3LDYxOSBAQAogICAgICAgbV9iTWF0Y2hXaG9sZVdvcmQoRkFMU0UpLAogICAgICAgbV9yZXNTdGFydCgwKSwKICAgICAgIG1fcmVzRW5kKC0xKSwKLSAgICAgIG1fSXNGaW5kKEZBTFNFKQotewotICAgIG1fc3RyVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dCgpOwotICAgIGludCBuQ291bnQgPSBwVGV4dFBhZ2UtPkNvdW50Q2hhcnMoKTsKLSAgICBpZihuQ291bnQpIHsKLSAgICAgICAgbV9DaGFySW5kZXguQWRkKDApOwotICAgIH0KLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKLSAgICAgICAgRlBERl9DSEFSX0lORk8gaW5mbzsKLSAgICAgICAgcFRleHRQYWdlLT5HZXRDaGFySW5mbyhpLCBpbmZvKTsKLSAgICAgICAgaW50IGluZGV4U2l6ZSA9IG1fQ2hhckluZGV4LkdldFNpemUoKTsKLSAgICAgICAgaWYoaW5mby5tX0ZsYWcgPT0gQ0hBUl9OT1JNQUwgfHwgaW5mby5tX0ZsYWcgPT0gQ0hBUl9HRU5FUkFURUQpIHsKLSAgICAgICAgICAgIGlmKGluZGV4U2l6ZSAlIDIpIHsKLSAgICAgICAgICAgICAgICBtX0NoYXJJbmRleC5BZGQoMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmKGluZGV4U2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX0NoYXJJbmRleC5TZXRBdChpbmRleFNpemUgLSAxLCBtX0NoYXJJbmRleC5HZXRBdChpbmRleFNpemUgLSAxKSArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoaW5kZXhTaXplICUgMikgewotICAgICAgICAgICAgICAgIGlmKGluZGV4U2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX0NoYXJJbmRleC5TZXRBdChpbmRleFNpemUgLSAxLCBpICsgMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fQ2hhckluZGV4LkFkZChpICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgICBtX0lzRmluZChGQUxTRSkgeworICBtX3N0clRleHQgPSBtX3BUZXh0UGFnZS0+R2V0UGFnZVRleHQoKTsKKyAgaW50IG5Db3VudCA9IHBUZXh0UGFnZS0+Q291bnRDaGFycygpOworICBpZiAobkNvdW50KSB7CisgICAgbV9DaGFySW5kZXguQWRkKDApOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICBGUERGX0NIQVJfSU5GTyBpbmZvOworICAgIHBUZXh0UGFnZS0+R2V0Q2hhckluZm8oaSwgaW5mbyk7CiAgICAgaW50IGluZGV4U2l6ZSA9IG1fQ2hhckluZGV4LkdldFNpemUoKTsKLSAgICBpZihpbmRleFNpemUgJSAyKSB7Ci0gICAgICAgIG1fQ2hhckluZGV4LlJlbW92ZUF0KGluZGV4U2l6ZSAtIDEpOwotICAgIH0KLX0KLWludCBDUERGX1RleHRQYWdlRmluZDo6R2V0Q2hhckluZGV4KGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wVGV4dFBhZ2UtPkNoYXJJbmRleEZyb21UZXh0SW5kZXgoaW5kZXgpOwotICAgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgaW5kZXhTaXplOyBpICs9IDIpIHsKLSAgICAgICAgY291bnQgKz0gbV9DaGFySW5kZXguR2V0QXQoaSArIDEpOwotICAgICAgICBpZihjb3VudCA+IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gCWluZGV4IC0gY291bnQgKyBtX0NoYXJJbmRleC5HZXRBdChpICsgMSkgKyBtX0NoYXJJbmRleC5HZXRBdChpKTsKKyAgICBpZiAoaW5mby5tX0ZsYWcgPT0gQ0hBUl9OT1JNQUwgfHwgaW5mby5tX0ZsYWcgPT0gQ0hBUl9HRU5FUkFURUQpIHsKKyAgICAgIGlmIChpbmRleFNpemUgJSAyKSB7CisgICAgICAgIG1fQ2hhckluZGV4LkFkZCgxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbmRleFNpemUgPD0gMCkgeworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLUZYX0JPT0wJQ1BERl9UZXh0UGFnZUZpbmQ6OkZpbmRGaXJzdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQsIGludCBmbGFncywgaW50IHN0YXJ0UG9zKQotewotICAgIGlmICghbV9wVGV4dFBhZ2UpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9zdHJUZXh0LklzRW1wdHkoKSB8fCBtX2JNYXRjaENhc2UgIT0gKGZsYWdzICYgRlBERlRFWFRfTUFUQ0hDQVNFKSkgewotICAgICAgICBtX3N0clRleHQgPSBtX3BUZXh0UGFnZS0+R2V0UGFnZVRleHQoKTsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgZmluZHdoYXRTdHIgPSBmaW5kd2hhdDsKLSAgICBtX2ZpbmRXaGF0ID0gZmluZHdoYXRTdHI7Ci0gICAgbV9mbGFncyA9IGZsYWdzOwotICAgIG1fYk1hdGNoQ2FzZSA9IGZsYWdzICYgRlBERlRFWFRfTUFUQ0hDQVNFOwotICAgIGlmIChtX3N0clRleHQuSXNFbXB0eSgpKSB7Ci0gICAgICAgIG1fSXNGaW5kID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBGWF9TVFJTSVpFIGxlbiA9IGZpbmR3aGF0U3RyLkdldExlbmd0aCgpOwotICAgIGlmICghbV9iTWF0Y2hDYXNlKSB7Ci0gICAgICAgIGZpbmR3aGF0U3RyLk1ha2VMb3dlcigpOwotICAgICAgICBtX3N0clRleHQuTWFrZUxvd2VyKCk7Ci0gICAgfQotICAgIG1fYk1hdGNoV2hvbGVXb3JkID0gZmxhZ3MgJiBGUERGVEVYVF9NQVRDSFdIT0xFV09SRDsKLSAgICBtX2ZpbmROZXh0U3RhcnQgPSBzdGFydFBvczsKLSAgICBpZiAoc3RhcnRQb3MgPT0gLTEpIHsKLSAgICAgICAgbV9maW5kUHJlU3RhcnQgPSBtX3N0clRleHQuR2V0TGVuZ3RoKCkgLSAxOworICAgICAgICBtX0NoYXJJbmRleC5TZXRBdChpbmRleFNpemUgLSAxLCBtX0NoYXJJbmRleC5HZXRBdChpbmRleFNpemUgLSAxKSArIDEpOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fZmluZFByZVN0YXJ0ID0gc3RhcnRQb3M7Ci0gICAgfQotICAgIG1fY3NGaW5kV2hhdEFycmF5LlJlbW92ZUFsbCgpOwotICAgIGludCBpID0gMDsKLSAgICB3aGlsZShpIDwgbGVuKSB7Ci0gICAgICAgIGlmKGZpbmR3aGF0U3RyLkdldEF0KGkpICE9ICcgJykgewotICAgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAoaW5kZXhTaXplICUgMikgeworICAgICAgICBpZiAoaW5kZXhTaXplIDw9IDApIHsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpKys7CisgICAgICAgIG1fQ2hhckluZGV4LlNldEF0KGluZGV4U2l6ZSAtIDEsIGkgKyAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fQ2hhckluZGV4LkFkZChpICsgMSk7CisgICAgICB9CiAgICAgfQotICAgIGlmKGkgPCBsZW4pIHsKLSAgICAgICAgRXh0cmFjdEZpbmRXaGF0KGZpbmR3aGF0U3RyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX2NzRmluZFdoYXRBcnJheS5BZGQoZmluZHdoYXRTdHIpOwotICAgIH0KLSAgICBpZihtX2NzRmluZFdoYXRBcnJheS5HZXRTaXplKCkgPD0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fSXNGaW5kID0gVFJVRTsKLSAgICBtX3Jlc1N0YXJ0ID0gMDsKLSAgICBtX3Jlc0VuZCA9IC0xOwotICAgIHJldHVybiBUUlVFOworICB9CisgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7CisgIGlmIChpbmRleFNpemUgJSAyKSB7CisgICAgbV9DaGFySW5kZXguUmVtb3ZlQXQoaW5kZXhTaXplIC0gMSk7CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZUZpbmQ6OkZpbmROZXh0KCkKLXsKLSAgICBpZiAoIW1fcFRleHRQYWdlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK2ludCBDUERGX1RleHRQYWdlRmluZDo6R2V0Q2hhckluZGV4KGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gbV9wVGV4dFBhZ2UtPkNoYXJJbmRleEZyb21UZXh0SW5kZXgoaW5kZXgpOworICBpbnQgaW5kZXhTaXplID0gbV9DaGFySW5kZXguR2V0U2l6ZSgpOworICBpbnQgY291bnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4U2l6ZTsgaSArPSAyKSB7CisgICAgY291bnQgKz0gbV9DaGFySW5kZXguR2V0QXQoaSArIDEpOworICAgIGlmIChjb3VudCA+IGluZGV4KSB7CisgICAgICByZXR1cm4gaW5kZXggLSBjb3VudCArIG1fQ2hhckluZGV4LkdldEF0KGkgKyAxKSArIG1fQ2hhckluZGV4LkdldEF0KGkpOwogICAgIH0KLSAgICBtX3Jlc0FycmF5LlJlbW92ZUFsbCgpOwotICAgIGlmKG1fZmluZE5leHRTdGFydCA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmKG1fc3RyVGV4dC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIG1fSXNGaW5kOwotICAgIH0KLSAgICBpbnQgc3RyTGVuID0gbV9zdHJUZXh0LkdldExlbmd0aCgpOwotICAgIGlmIChtX2ZpbmROZXh0U3RhcnQgPiBzdHJMZW4gLSAxKSB7Ci0gICAgICAgIG1fSXNGaW5kID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBtX0lzRmluZDsKLSAgICB9Ci0gICAgaW50IG5Db3VudCA9IG1fY3NGaW5kV2hhdEFycmF5LkdldFNpemUoKTsKLSAgICBpbnQgblJlc3VsdFBvcyA9IDA7Ci0gICAgaW50CW5TdGFydFBvcyA9IDA7Ci0gICAgblN0YXJ0UG9zID0gbV9maW5kTmV4dFN0YXJ0OwotICAgIEZYX0JPT0wgYlNwYWNlU3RhcnQgPSBGQUxTRTsKLSAgICBmb3IoaW50IGlXb3JkID0gMDsgaVdvcmQgPCBuQ291bnQ7IGlXb3JkKyspIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NXb3JkID0gbV9jc0ZpbmRXaGF0QXJyYXlbaVdvcmRdOwotICAgICAgICBpZihjc1dvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZihpV29yZCA9PSBuQ291bnQgLSAxKSB7Ci0gICAgICAgICAgICAgICAgRlhfV0NIQVIgc3RySW5zZXJ0ID0gbV9zdHJUZXh0LkdldEF0KG5TdGFydFBvcyk7Ci0gICAgICAgICAgICAgICAgaWYoc3RySW5zZXJ0ID09IFRFWFRfTElORUZFRURfQ0hBUiB8fCBzdHJJbnNlcnQgPT0gVEVYVF9CTEFOS19DSEFSIHx8IHN0ckluc2VydCA9PSBURVhUX1JFVFVSTl9DSEFSIHx8IHN0ckluc2VydCA9PSAxNjApIHsKLSAgICAgICAgICAgICAgICAgICAgblJlc3VsdFBvcyA9IG5TdGFydFBvcyArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpV29yZCA9IC0xOwotICAgICAgICAgICAgfSBlbHNlIGlmKGlXb3JkID09IDApIHsKLSAgICAgICAgICAgICAgICBiU3BhY2VTdGFydCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZW5kSW5kZXg7Ci0gICAgICAgIG5SZXN1bHRQb3MgPSBtX3N0clRleHQuRmluZChjc1dvcmQuY19zdHIoKSwgblN0YXJ0UG9zKTsKLSAgICAgICAgaWYgKG5SZXN1bHRQb3MgPT0gLTEpIHsKLSAgICAgICAgICAgIG1fSXNGaW5kID0gRkFMU0U7Ci0gICAgICAgICAgICByZXR1cm4gbV9Jc0ZpbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgZW5kSW5kZXggPSBuUmVzdWx0UG9zICsgY3NXb3JkLkdldExlbmd0aCgpIC0gMTsKLSAgICAgICAgaWYoaVdvcmQgPT0gMCkgewotICAgICAgICAgICAgbV9yZXNTdGFydCA9IG5SZXN1bHRQb3M7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiTWF0Y2ggPSBUUlVFOwotICAgICAgICBpZihpV29yZCAhPSAwICYmICFiU3BhY2VTdGFydCkgewotICAgICAgICAgICAgaW50IFByZVJlc0VuZFBvcyA9IG5TdGFydFBvczsKLSAgICAgICAgICAgIGludCBjdXJDaGFyID0gY3NXb3JkLkdldEF0KDApOwotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgbGFzdFdvcmQgPSBtX2NzRmluZFdoYXRBcnJheVtpV29yZCAtIDFdOwotICAgICAgICAgICAgaW50IGxhc3RDaGFyID0gbGFzdFdvcmQuR2V0QXQobGFzdFdvcmQuR2V0TGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgIGlmKG5TdGFydFBvcyA9PSBuUmVzdWx0UG9zICYmICEoX0lzSWdub3JlU3BhY2VDaGFyYWN0ZXIobGFzdENoYXIpIHx8IF9Jc0lnbm9yZVNwYWNlQ2hhcmFjdGVyKGN1ckNoYXIpKSkgewotICAgICAgICAgICAgICAgIGJNYXRjaCA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGludCBkID0gUHJlUmVzRW5kUG9zOyBkIDwgblJlc3VsdFBvczsgZCsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfV0NIQVIgc3RySW5zZXJ0ID0gbV9zdHJUZXh0LkdldEF0KGQpOwotICAgICAgICAgICAgICAgIGlmKHN0ckluc2VydCAhPSBURVhUX0xJTkVGRUVEX0NIQVIgJiYgc3RySW5zZXJ0ICE9IFRFWFRfQkxBTktfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9SRVRVUk5fQ0hBUiAmJiBzdHJJbnNlcnQgIT0gMTYwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJNYXRjaCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZihiU3BhY2VTdGFydCkgewotICAgICAgICAgICAgaWYoblJlc3VsdFBvcyA+IDApIHsKLSAgICAgICAgICAgICAgICBGWF9XQ0hBUiBzdHJJbnNlcnQgPSBtX3N0clRleHQuR2V0QXQoblJlc3VsdFBvcyAtIDEpOwotICAgICAgICAgICAgICAgIGlmKHN0ckluc2VydCAhPSBURVhUX0xJTkVGRUVEX0NIQVIgJiYgc3RySW5zZXJ0ICE9IFRFWFRfQkxBTktfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9SRVRVUk5fQ0hBUiAmJiBzdHJJbnNlcnQgIT0gMTYwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJNYXRjaCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICBtX3Jlc1N0YXJ0ID0gblJlc3VsdFBvczsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX3Jlc1N0YXJ0ID0gblJlc3VsdFBvcyAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKG1fYk1hdGNoV2hvbGVXb3JkICYmIGJNYXRjaCkgewotICAgICAgICAgICAgYk1hdGNoID0gSXNNYXRjaFdob2xlV29yZChtX3N0clRleHQsIG5SZXN1bHRQb3MsIGVuZEluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBuU3RhcnRQb3MgPSBlbmRJbmRleCArIDE7Ci0gICAgICAgIGlmKCFiTWF0Y2gpIHsKLSAgICAgICAgICAgIGlXb3JkID0gLTE7Ci0gICAgICAgICAgICBpZihiU3BhY2VTdGFydCkgewotICAgICAgICAgICAgICAgIG5TdGFydFBvcyA9IG1fcmVzU3RhcnQgKyBtX2NzRmluZFdoYXRBcnJheVsxXS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgblN0YXJ0UG9zID0gbV9yZXNTdGFydCArIG1fY3NGaW5kV2hhdEFycmF5WzBdLkdldExlbmd0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1fcmVzRW5kID0gblJlc3VsdFBvcyArIG1fY3NGaW5kV2hhdEFycmF5W21fY3NGaW5kV2hhdEFycmF5LkdldFNpemUoKSAtIDFdLkdldExlbmd0aCgpIC0gMTsKLSAgICBtX0lzRmluZCA9IFRSVUU7Ci0gICAgaW50IHJlc1N0YXJ0ID0gR2V0Q2hhckluZGV4KG1fcmVzU3RhcnQpOwotICAgIGludCByZXNFbmQgPSBHZXRDaGFySW5kZXgobV9yZXNFbmQpOwotICAgIG1fcFRleHRQYWdlLT5HZXRSZWN0QXJyYXkocmVzU3RhcnQsIHJlc0VuZCAtIHJlc1N0YXJ0ICsgMSwgbV9yZXNBcnJheSk7Ci0gICAgaWYobV9mbGFncyAmIEZQREZURVhUX0NPTlNFQ1VUSVZFKSB7Ci0gICAgICAgIG1fZmluZE5leHRTdGFydCA9IG1fcmVzU3RhcnQgKyAxOwotICAgICAgICBtX2ZpbmRQcmVTdGFydCA9IG1fcmVzRW5kIC0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX2ZpbmROZXh0U3RhcnQgPSBtX3Jlc0VuZCArIDE7Ci0gICAgICAgIG1fZmluZFByZVN0YXJ0ID0gbV9yZXNTdGFydCAtIDE7Ci0gICAgfQotICAgIHJldHVybiBtX0lzRmluZDsKKyAgfQorICByZXR1cm4gLTE7CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpGaW5kUHJldigpCi17Ci0gICAgaWYgKCFtX3BUZXh0UGFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcmVzQXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgaWYobV9zdHJUZXh0LklzRW1wdHkoKSB8fCBtX2ZpbmRQcmVTdGFydCA8IDApIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIG1fSXNGaW5kOwotICAgIH0KLSAgICBDUERGX1RleHRQYWdlRmluZCBmaW5kRW5naW5lKG1fcFRleHRQYWdlKTsKLSAgICBGWF9CT09MIHJldCA9IGZpbmRFbmdpbmUuRmluZEZpcnN0KG1fZmluZFdoYXQsIG1fZmxhZ3MpOwotICAgIGlmKCFyZXQpIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIG1fSXNGaW5kOwotICAgIH0KLSAgICBpbnQJb3JkZXIgPSAtMSwgTWF0Y2hlZENvdW50ID0gMDsKLSAgICB3aGlsZShyZXQpIHsKLSAgICAgICAgcmV0ID0gZmluZEVuZ2luZS5GaW5kTmV4dCgpOwotICAgICAgICBpZihyZXQpIHsKLSAgICAgICAgICAgIGludCBvcmRlcjEgPSBmaW5kRW5naW5lLkdldEN1ck9yZGVyKCkgOwotICAgICAgICAgICAgaW50CU1hdGNoZWRDb3VudDEgPSBmaW5kRW5naW5lLkdldE1hdGNoZWRDb3VudCgpOwotICAgICAgICAgICAgaWYoKChvcmRlcjEgKyBNYXRjaGVkQ291bnQxKSAtIDEpID4gbV9maW5kUHJlU3RhcnQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9yZGVyID0gb3JkZXIxOwotICAgICAgICAgICAgTWF0Y2hlZENvdW50ID0gTWF0Y2hlZENvdW50MTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihvcmRlciA9PSAtMSkgewotICAgICAgICBtX0lzRmluZCA9IEZBTFNFOwotICAgICAgICByZXR1cm4gbV9Jc0ZpbmQ7Ci0gICAgfQotICAgIG1fcmVzU3RhcnQgPSBtX3BUZXh0UGFnZS0+VGV4dEluZGV4RnJvbUNoYXJJbmRleChvcmRlcik7Ci0gICAgbV9yZXNFbmQgPSBtX3BUZXh0UGFnZS0+VGV4dEluZGV4RnJvbUNoYXJJbmRleChvcmRlciArIE1hdGNoZWRDb3VudCAtIDEpOwotICAgIG1fSXNGaW5kID0gVFJVRTsKLSAgICBtX3BUZXh0UGFnZS0+R2V0UmVjdEFycmF5KG9yZGVyLCBNYXRjaGVkQ291bnQsIG1fcmVzQXJyYXkpOwotICAgIGlmKG1fZmxhZ3MgJiBGUERGVEVYVF9DT05TRUNVVElWRSkgewotICAgICAgICBtX2ZpbmROZXh0U3RhcnQgPSBtX3Jlc1N0YXJ0ICsgMTsKLSAgICAgICAgbV9maW5kUHJlU3RhcnQgPSBtX3Jlc0VuZCAtIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9maW5kTmV4dFN0YXJ0ID0gbV9yZXNFbmQgKyAxOwotICAgICAgICBtX2ZpbmRQcmVTdGFydCA9IG1fcmVzU3RhcnQgLSAxOwotICAgIH0KLSAgICByZXR1cm4gbV9Jc0ZpbmQ7Ci19Ci12b2lkIENQREZfVGV4dFBhZ2VGaW5kOjpFeHRyYWN0RmluZFdoYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0KQotewotICAgIGlmKGZpbmR3aGF0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gOwotICAgIH0KLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHdoaWxlKDEpIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NXb3JkID0gVEVYVF9FTVBUWTsKLSAgICAgICAgaW50IHJldCA9IEV4dHJhY3RTdWJTdHJpbmcoY3NXb3JkLCBmaW5kd2hhdC5jX3N0cigpLCBpbmRleCwgVEVYVF9CTEFOS19DSEFSKTsKLSAgICAgICAgaWYoY3NXb3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYocmV0KSB7Ci0gICAgICAgICAgICAgICAgbV9jc0ZpbmRXaGF0QXJyYXkuQWRkKENGWF9XaWRlU3RyaW5nKEwiIikpOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICB3aGlsZShwb3MgPCBjc1dvcmQuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGN1clN0ciA9IGNzV29yZC5NaWQocG9zLCAxKTsKLSAgICAgICAgICAgIEZYX1dDSEFSIGN1ckNoYXIgPSBjc1dvcmQuR2V0QXQocG9zKTsKLSAgICAgICAgICAgIGlmIChfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihjdXJDaGFyKSkgewotICAgICAgICAgICAgICAgIGlmIChwb3MgPiAwICYmIGN1ckNoYXIgPT0gMHgyMDE5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHByZVN0ciA9IGNzV29yZC5NaWQoMCwgcG9zKTsKLSAgICAgICAgICAgICAgICAgICAgbV9jc0ZpbmRXaGF0QXJyYXkuQWRkKHByZVN0cik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fY3NGaW5kV2hhdEFycmF5LkFkZChjdXJTdHIpOwotICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gY3NXb3JkLkdldExlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgICAgICAgICBjc1dvcmQuRW1wdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNzV29yZCA9IGNzV29yZC5SaWdodChjc1dvcmQuR2V0TGVuZ3RoKCkgLSBwb3MgLSAxKTsKLSAgICAgICAgICAgICAgICBwb3MgPSAwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFjc1dvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtX2NzRmluZFdoYXRBcnJheS5BZGQoY3NXb3JkKTsKLSAgICAgICAgfQotICAgICAgICBpbmRleCsrOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZUZpbmQ6OklzTWF0Y2hXaG9sZVdvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsIGludCBzdGFydFBvcywgaW50IGVuZFBvcykKLXsKLSAgICBpbnQgY2hhcl9sZWZ0ID0gMDsKLSAgICBpbnQgY2hhcl9yaWdodCA9IDA7Ci0gICAgaW50IGNoYXJfY291bnQgPSBlbmRQb3MgLSBzdGFydFBvcyArIDE7Ci0gICAgaWYoY2hhcl9jb3VudCA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoY2hhcl9jb3VudCA9PSAxICYmIGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MpID4gMjU1KSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZihzdGFydFBvcyAtIDEgPj0gMCApIHsKLSAgICAgICAgY2hhcl9sZWZ0ID0gY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcyAtIDEpOwotICAgIH0KLSAgICBpZihzdGFydFBvcyArIGNoYXJfY291bnQgPCBjc1BhZ2VUZXh0LkdldExlbmd0aCgpKSB7Ci0gICAgICAgIGNoYXJfcmlnaHQgPSBjc1BhZ2VUZXh0LkdldEF0KHN0YXJ0UG9zICsgY2hhcl9jb3VudCk7Ci0gICAgfQotICAgIGlmICgoY2hhcl9sZWZ0ID4gJ0EnICYmIGNoYXJfbGVmdCA8ICdhJykgfHwgKGNoYXJfbGVmdCA+ICdhJyAmJiBjaGFyX2xlZnQgPCAneicpIHx8IChjaGFyX2xlZnQgPiAweGZiMDAgJiYgY2hhcl9sZWZ0IDwgMHhmYjA2KSB8fCAoY2hhcl9sZWZ0ID49ICcwJyAmJiBjaGFyX2xlZnQgPD0gJzknKSB8fAotICAgICAgICAgICAgKGNoYXJfcmlnaHQgPiAnQScgJiYgY2hhcl9yaWdodCA8ICdhJykgfHwgKGNoYXJfcmlnaHQgPiAnYScgJiYgY2hhcl9yaWdodCA8ICd6JykgfHwgKGNoYXJfcmlnaHQgPiAweGZiMDAgJiYgY2hhcl9yaWdodCA8IDB4ZmIwNikgfHwgKGNoYXJfcmlnaHQgPj0gJzAnICYmIGNoYXJfcmlnaHQgPD0gJzknKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmKCEoKCdBJyA+IGNoYXJfbGVmdCB8fCBjaGFyX2xlZnQgPiAnWicpICAmJiAoJ2EnID4gY2hhcl9sZWZ0IHx8IGNoYXJfbGVmdCA+ICd6JykKLSAgICAgICAgICAgICYmICgnQScgPiBjaGFyX3JpZ2h0IHx8IGNoYXJfcmlnaHQgPiAnWicpICAmJiAoJ2EnID4gY2hhcl9yaWdodCB8fCBjaGFyX3JpZ2h0ID4gJ3onKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoY2hhcl9jb3VudCA+IDApIHsKLSAgICAgICAgaWYgKGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MpID49IEwnMCcgJiYgY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcykgPD0gTCc5JyAmJiBjaGFyX2xlZnQgPj0gTCcwJyAmJiBjaGFyX2xlZnQgPD0gTCc5JykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPj0gTCcwJyAmJiBjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPD0gTCc5JyAmJiBjaGFyX3JpZ2h0ID49IEwnMCcgJiYgY2hhcl9yaWdodCA8PSBMJzknKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpFeHRyYWN0U3ViU3RyaW5nKENGWF9XaWRlU3RyaW5nJiByU3RyaW5nLCBjb25zdCBGWF9XQ0hBUiogbHBzekZ1bGxTdHJpbmcsCi0gICAgICAgIGludCBpU3ViU3RyaW5nLCBGWF9XQ0hBUiBjaFNlcCkKLXsKLSAgICBpZiAobHBzekZ1bGxTdHJpbmcgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHdoaWxlIChpU3ViU3RyaW5nLS0pIHsKLSAgICAgICAgbHBzekZ1bGxTdHJpbmcgPSBGWFNZU193Y3NjaHIobHBzekZ1bGxTdHJpbmcsIGNoU2VwKTsKLSAgICAgICAgaWYgKGxwc3pGdWxsU3RyaW5nID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJTdHJpbmcuRW1wdHkoKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBscHN6RnVsbFN0cmluZysrOwotICAgICAgICB3aGlsZSgqbHBzekZ1bGxTdHJpbmcgPT0gY2hTZXApIHsKLSAgICAgICAgICAgIGxwc3pGdWxsU3RyaW5nKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgY29uc3QgRlhfV0NIQVIqIGxwY2hFbmQgPSBGWFNZU193Y3NjaHIobHBzekZ1bGxTdHJpbmcsIGNoU2VwKTsKLSAgICBpbnQgbkxlbiA9IChscGNoRW5kID09IE5VTEwpID8KLSAgICAgICAgICAgICAgIChpbnQpRlhTWVNfd2NzbGVuKGxwc3pGdWxsU3RyaW5nKSA6IChpbnQpKGxwY2hFbmQgLSBscHN6RnVsbFN0cmluZyk7Ci0gICAgQVNTRVJUKG5MZW4gPj0gMCk7Ci0gICAgRlhTWVNfbWVtY3B5KHJTdHJpbmcuR2V0QnVmZmVyKG5MZW4pLCBscHN6RnVsbFN0cmluZywgbkxlbiAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgIHJTdHJpbmcuUmVsZWFzZUJ1ZmZlcigpOwotICAgIHJldHVybiBUUlVFOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9UZXh0UGFnZUZpbmQ6Ok1ha2VSZXZlcnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpCi17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyMjsKLSAgICBzdHIyLkVtcHR5KCk7Ci0gICAgaW50IG5sZW4gPSBzdHIuR2V0TGVuZ3RoKCk7Ci0gICAgZm9yKGludCBpID0gbmxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIHN0cjIgKz0gc3RyLkdldEF0KGkpOwotICAgIH0KLSAgICByZXR1cm4gc3RyMjsKLX0KLXZvaWQgQ1BERl9UZXh0UGFnZUZpbmQ6OkdldFJlY3RBcnJheShDRlhfUmVjdEFycmF5JiByZWN0cykgY29uc3QKLXsKLSAgICByZWN0cy5Db3B5KG1fcmVzQXJyYXkpOwotfQotaW50CUNQREZfVGV4dFBhZ2VGaW5kOjpHZXRDdXJPcmRlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEdldENoYXJJbmRleChtX3Jlc1N0YXJ0KTsKLX0KLWludAlDUERGX1RleHRQYWdlRmluZDo6R2V0TWF0Y2hlZENvdW50KCljb25zdAotewotICAgIGludCByZXNTdGFydCA9IEdldENoYXJJbmRleChtX3Jlc1N0YXJ0KTsKLSAgICBpbnQgcmVzRW5kID0gR2V0Q2hhckluZGV4KG1fcmVzRW5kKTsKLSAgICByZXR1cm4gcmVzRW5kIC0gcmVzU3RhcnQgKyAxOwotfQotQ1BERl9MaW5rRXh0cmFjdDo6Q1BERl9MaW5rRXh0cmFjdCgpCi0gICAgOiBtX3BUZXh0UGFnZShOVUxMKSwKLSAgICAgIG1fSXNQYXJzZXJkKEZBTFNFKQotewotfQotQ1BERl9MaW5rRXh0cmFjdDo6fkNQREZfTGlua0V4dHJhY3QoKQotewotICAgIERlbGV0ZUxpbmtMaXN0KCk7Ci19Ci1GWF9CT09MIENQREZfTGlua0V4dHJhY3Q6OkV4dHJhY3RMaW5rcyhjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpCi17Ci0gICAgaWYgKCFwVGV4dFBhZ2UgfHwgIXBUZXh0UGFnZS0+SXNQYXJzZXJlZCgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wVGV4dFBhZ2UgPSAoY29uc3QgQ1BERl9UZXh0UGFnZSopcFRleHRQYWdlOwotICAgIG1fc3RyUGFnZVRleHQgPSBtX3BUZXh0UGFnZS0+R2V0UGFnZVRleHQoMCwgLTEpOwotICAgIERlbGV0ZUxpbmtMaXN0KCk7Ci0gICAgaWYgKG1fc3RyUGFnZVRleHQuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcGFyc2VyTGluaygpOwotICAgIG1fSXNQYXJzZXJkID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ1BERl9MaW5rRXh0cmFjdDo6RGVsZXRlTGlua0xpc3QoKQotewotICAgIHdoaWxlIChtX0xpbmtMaXN0LkdldFNpemUoKSkgewotICAgICAgICBDUERGX0xpbmtFeHQqIGxpbmtpbmZvID0gTlVMTDsKLSAgICAgICAgbGlua2luZm8gPSBtX0xpbmtMaXN0LkdldEF0KDApOwotICAgICAgICBtX0xpbmtMaXN0LlJlbW92ZUF0KDApOwotICAgICAgICBkZWxldGUgbGlua2luZm87Ci0gICAgfQotICAgIG1fTGlua0xpc3QuUmVtb3ZlQWxsKCk7Ci19Ci1pbnQgQ1BERl9MaW5rRXh0cmFjdDo6Q291bnRMaW5rcygpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX0lzUGFyc2VyZCkJewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiBtX0xpbmtMaXN0LkdldFNpemUoKTsKLX0KLXZvaWQgQ1BERl9MaW5rRXh0cmFjdDo6cGFyc2VyTGluaygpCi17Ci0gICAgaW50IHN0YXJ0ID0gMCwgcG9zID0gMDsKLSAgICBpbnQgVG90YWxDaGFyID0gbV9wVGV4dFBhZ2UtPkNvdW50Q2hhcnMoKTsKLSAgICB3aGlsZSAocG9zIDwgVG90YWxDaGFyKSB7Ci0gICAgICAgIEZQREZfQ0hBUl9JTkZPIHBhZ2VDaGFyOwotICAgICAgICBtX3BUZXh0UGFnZS0+R2V0Q2hhckluZm8ocG9zLCBwYWdlQ2hhcik7Ci0gICAgICAgIGlmIChwYWdlQ2hhci5tX0ZsYWcgPT0gQ0hBUl9HRU5FUkFURUQgfHwgcGFnZUNoYXIubV9Vbmljb2RlID09IDB4MjAgfHwgcG9zID09IFRvdGFsQ2hhciAtIDEpIHsKLSAgICAgICAgICAgIGludCBuQ291bnQgPSBwb3MgLSBzdGFydDsKLSAgICAgICAgICAgIGlmKHBvcyA9PSBUb3RhbENoYXIgLSAxKSB7Ci0gICAgICAgICAgICAgICAgbkNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHJCZUNoZWNrOwotICAgICAgICAgICAgc3RyQmVDaGVjayA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dChzdGFydCwgbkNvdW50KTsKLSAgICAgICAgICAgIGlmIChzdHJCZUNoZWNrLkdldExlbmd0aCgpID4gNSkgewotICAgICAgICAgICAgICAgIHdoaWxlKHN0ckJlQ2hlY2suR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIGNoID0gc3RyQmVDaGVjay5HZXRBdChzdHJCZUNoZWNrLkdldExlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJyknIHx8IGNoID09IEwnLCcgfHwgY2ggPT0gTCc+JyB8fCBjaCA9PSBMJy4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJCZUNoZWNrID0gc3RyQmVDaGVjay5NaWQoMCwgc3RyQmVDaGVjay5HZXRMZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbkNvdW50LS07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobkNvdW50ID4gNSAmJiAoQ2hlY2tXZWJMaW5rKHN0ckJlQ2hlY2spIHx8IENoZWNrTWFpbExpbmsoc3RyQmVDaGVjaykpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghQXBwZW5kVG9MaW5rTGlzdChzdGFydCwgbkNvdW50LCBzdHJCZUNoZWNrKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCA9ICsrcG9zOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1GWF9CT09MIENQREZfTGlua0V4dHJhY3Q6OkNoZWNrV2ViTGluayhDRlhfV2lkZVN0cmluZyYgc3RyQmVDaGVjaykKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHIgPSBzdHJCZUNoZWNrOwotICAgIHN0ci5NYWtlTG93ZXIoKTsKLSAgICBpZiAoc3RyLkZpbmQoTCJodHRwOi8vd3d3LiIpICE9IC0xKSB7Ci0gICAgICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHN0ci5GaW5kKEwiaHR0cDovL3d3dy4iKSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoc3RyLkZpbmQoTCJodHRwOi8vIikgIT0gLTEpIHsKLSAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwOi8vIikpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKHN0ci5GaW5kKEwiaHR0cHM6Ly93d3cuIikgIT0gLTEpIHsKLSAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwczovL3d3dy4iKSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoc3RyLkZpbmQoTCJodHRwczovLyIpICE9IC0xKSB7Ci0gICAgICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHN0ci5GaW5kKEwiaHR0cHM6Ly8iKSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoc3RyLkZpbmQoTCJ3d3cuIikgIT0gLTEpIHsKLSAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJ3d3cuIikpOwotICAgICAgICBzdHJCZUNoZWNrID0gTCJodHRwOi8vIiArIHN0ckJlQ2hlY2s7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZUZpbmQ6OkZpbmRGaXJzdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydFBvcykgeworICBpZiAoIW1fcFRleHRQYWdlKSB7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0xpbmtFeHRyYWN0OjpDaGVja01haWxMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHIpCi17Ci0gICAgc3RyLk1ha2VMb3dlcigpOwotICAgIGludCBhUG9zID0gc3RyLkZpbmQoTCdAJyk7Ci0gICAgaWYgKGFQb3MgPCAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHN0ci5HZXRBdChhUG9zIC0gMSkgPT0gTCcuJyB8fCBzdHIuR2V0QXQoYVBvcyAtIDEpID09IEwnXycpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSBhUG9zIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgRlhfV0NIQVIgY2ggPSBzdHIuR2V0QXQoaSk7Ci0gICAgICAgIGlmIChjaCA9PSBMJ18nIHx8IGNoID09IEwnLicgfHwgKGNoID49IEwnYScgJiYgY2ggPD0gTCd6JykgfHwgKGNoID49IEwnMCcgJiYgY2ggPD0gTCc5JykpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGkgPT0gYVBvcyAtIDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHIgPSBzdHIuUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gaSAtIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYVBvcyA9IHN0ci5GaW5kKEwnQCcpOwotICAgIGlmIChhUG9zIDwgMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHN0cnRlbXAgPSBMIiI7Ci0gICAgZm9yIChpID0gMDsgaSA8IGFQb3M7IGkrKykgewotICAgICAgICBGWF9XQ0hBUiB3Y2ggPSBzdHIuR2V0QXQoaSk7Ci0gICAgICAgIGlmICh3Y2ggPj0gTCdhJyAmJiB3Y2ggPD0gTCd6JykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdHJ0ZW1wID0gc3RyLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIGkgKyAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoc3RydGVtcCAhPSBMIiIpIHsKLSAgICAgICAgc3RyID0gc3RydGVtcDsKLSAgICB9Ci0gICAgYVBvcyA9IHN0ci5GaW5kKEwnQCcpOwotICAgIGlmIChhUG9zIDwgMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHN0ci5UcmltUmlnaHQoTCcuJyk7Ci0gICAgc3RydGVtcCA9IHN0cjsKLSAgICBpbnQgZVBvcyA9IHN0ci5GaW5kKEwnLicpOwotICAgIGlmIChlUG9zID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgd2hpbGUgKGVQb3MgIT0gLTEpIHsKLSAgICAgICAgc3RydGVtcCA9IHN0cnRlbXAuUmlnaHQoc3RydGVtcC5HZXRMZW5ndGgoKSAtIGVQb3MgLSAxKTsKLSAgICAgICAgZVBvcyA9IHN0cnRlbXAuRmluZCgnLicpOwotICAgIH0KLSAgICBlUG9zID0gc3RydGVtcC5HZXRMZW5ndGgoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZVBvczsgaSsrKSB7Ci0gICAgICAgIEZYX1dDSEFSIHdjaCA9IHN0ci5HZXRBdChpKTsKLSAgICAgICAgaWYgKCh3Y2ggPj0gTCdhJyAmJiB3Y2ggPD0gTCd6JykgfHwgKHdjaCA+PSBMJzAnICYmIHdjaCA8PSBMJzknKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdHIgPSBzdHIuTGVmdChzdHIuR2V0TGVuZ3RoKCkgLSBlUG9zICsgaSArIDEpOwotICAgICAgICAgICAgZVBvcyA9IGVQb3MgLSBpIC0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBuTGVuID0gc3RyLkdldExlbmd0aCgpOwotICAgIGZvciAoaSA9IGFQb3MgKyAxOyBpIDwgbkxlbiAtIGVQb3M7IGkrKykgewotICAgICAgICBGWF9XQ0hBUiB3Y2ggPSBzdHIuR2V0QXQoaSk7Ci0gICAgICAgIGlmICh3Y2ggPT0gTCctJyB8fCB3Y2ggPT0gTCcuJyB8fCAod2NoID49IEwnYScgJiYgd2NoIDw9IEwneicpIHx8ICh3Y2ggPj0gTCcwJyAmJiB3Y2ggPD0gTCc5JykpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChzdHIuRmluZChMIm1haWx0bzoiKSA9PSAtMSkgewotICAgICAgICBzdHIgPSBMIm1haWx0bzoiICsgc3RyOwotICAgIH0KKyAgfQorICBpZiAobV9zdHJUZXh0LklzRW1wdHkoKSB8fCBtX2JNYXRjaENhc2UgIT0gKGZsYWdzICYgRlBERlRFWFRfTUFUQ0hDQVNFKSkgeworICAgIG1fc3RyVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dCgpOworICB9CisgIENGWF9XaWRlU3RyaW5nIGZpbmR3aGF0U3RyID0gZmluZHdoYXQ7CisgIG1fZmluZFdoYXQgPSBmaW5kd2hhdFN0cjsKKyAgbV9mbGFncyA9IGZsYWdzOworICBtX2JNYXRjaENhc2UgPSBmbGFncyAmIEZQREZURVhUX01BVENIQ0FTRTsKKyAgaWYgKG1fc3RyVGV4dC5Jc0VtcHR5KCkpIHsKKyAgICBtX0lzRmluZCA9IEZBTFNFOwogICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0xpbmtFeHRyYWN0OjpBcHBlbmRUb0xpbmtMaXN0KGludCBzdGFydCwgaW50IGNvdW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVXJsKQotewotICAgIENQREZfTGlua0V4dCogbGlua0luZm8gPSBOVUxMOwotICAgIGxpbmtJbmZvID0gRlhfTkVXIENQREZfTGlua0V4dDsKLSAgICBpZiAoIWxpbmtJbmZvKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9TVFJTSVpFIGxlbiA9IGZpbmR3aGF0U3RyLkdldExlbmd0aCgpOworICBpZiAoIW1fYk1hdGNoQ2FzZSkgeworICAgIGZpbmR3aGF0U3RyLk1ha2VMb3dlcigpOworICAgIG1fc3RyVGV4dC5NYWtlTG93ZXIoKTsKKyAgfQorICBtX2JNYXRjaFdob2xlV29yZCA9IGZsYWdzICYgRlBERlRFWFRfTUFUQ0hXSE9MRVdPUkQ7CisgIG1fZmluZE5leHRTdGFydCA9IHN0YXJ0UG9zOworICBpZiAoc3RhcnRQb3MgPT0gLTEpIHsKKyAgICBtX2ZpbmRQcmVTdGFydCA9IG1fc3RyVGV4dC5HZXRMZW5ndGgoKSAtIDE7CisgIH0gZWxzZSB7CisgICAgbV9maW5kUHJlU3RhcnQgPSBzdGFydFBvczsKKyAgfQorICBtX2NzRmluZFdoYXRBcnJheS5SZW1vdmVBbGwoKTsKKyAgaW50IGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikgeworICAgIGlmIChmaW5kd2hhdFN0ci5HZXRBdChpKSAhPSAnICcpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBsaW5rSW5mby0+bV9zdHJVcmwgPSBzdHJVcmw7Ci0gICAgbGlua0luZm8tPm1fU3RhcnQgPSBzdGFydDsKLSAgICBsaW5rSW5mby0+bV9Db3VudCA9IGNvdW50OwotICAgIG1fTGlua0xpc3QuQWRkKGxpbmtJbmZvKTsKKyAgICBpKys7CisgIH0KKyAgaWYgKGkgPCBsZW4pIHsKKyAgICBFeHRyYWN0RmluZFdoYXQoZmluZHdoYXRTdHIpOworICB9IGVsc2UgeworICAgIG1fY3NGaW5kV2hhdEFycmF5LkFkZChmaW5kd2hhdFN0cik7CisgIH0KKyAgaWYgKG1fY3NGaW5kV2hhdEFycmF5LkdldFNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fSXNGaW5kID0gVFJVRTsKKyAgbV9yZXNTdGFydCA9IDA7CisgIG1fcmVzRW5kID0gLTE7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX1RleHRQYWdlRmluZDo6RmluZE5leHQoKSB7CisgIGlmICghbV9wVGV4dFBhZ2UpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9yZXNBcnJheS5SZW1vdmVBbGwoKTsKKyAgaWYgKG1fZmluZE5leHRTdGFydCA9PSAtMSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9zdHJUZXh0LklzRW1wdHkoKSkgeworICAgIG1fSXNGaW5kID0gRkFMU0U7CisgICAgcmV0dXJuIG1fSXNGaW5kOworICB9CisgIGludCBzdHJMZW4gPSBtX3N0clRleHQuR2V0TGVuZ3RoKCk7CisgIGlmIChtX2ZpbmROZXh0U3RhcnQgPiBzdHJMZW4gLSAxKSB7CisgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKKyAgICByZXR1cm4gbV9Jc0ZpbmQ7CisgIH0KKyAgaW50IG5Db3VudCA9IG1fY3NGaW5kV2hhdEFycmF5LkdldFNpemUoKTsKKyAgaW50IG5SZXN1bHRQb3MgPSAwOworICBpbnQgblN0YXJ0UG9zID0gMDsKKyAgblN0YXJ0UG9zID0gbV9maW5kTmV4dFN0YXJ0OworICBGWF9CT09MIGJTcGFjZVN0YXJ0ID0gRkFMU0U7CisgIGZvciAoaW50IGlXb3JkID0gMDsgaVdvcmQgPCBuQ291bnQ7IGlXb3JkKyspIHsKKyAgICBDRlhfV2lkZVN0cmluZyBjc1dvcmQgPSBtX2NzRmluZFdoYXRBcnJheVtpV29yZF07CisgICAgaWYgKGNzV29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgIGlmIChpV29yZCA9PSBuQ291bnQgLSAxKSB7CisgICAgICAgIEZYX1dDSEFSIHN0ckluc2VydCA9IG1fc3RyVGV4dC5HZXRBdChuU3RhcnRQb3MpOworICAgICAgICBpZiAoc3RySW5zZXJ0ID09IFRFWFRfTElORUZFRURfQ0hBUiB8fCBzdHJJbnNlcnQgPT0gVEVYVF9CTEFOS19DSEFSIHx8CisgICAgICAgICAgICBzdHJJbnNlcnQgPT0gVEVYVF9SRVRVUk5fQ0hBUiB8fCBzdHJJbnNlcnQgPT0gMTYwKSB7CisgICAgICAgICAgblJlc3VsdFBvcyA9IG5TdGFydFBvcyArIDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaVdvcmQgPSAtMTsKKyAgICAgIH0gZWxzZSBpZiAoaVdvcmQgPT0gMCkgeworICAgICAgICBiU3BhY2VTdGFydCA9IFRSVUU7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IGVuZEluZGV4OworICAgIG5SZXN1bHRQb3MgPSBtX3N0clRleHQuRmluZChjc1dvcmQuY19zdHIoKSwgblN0YXJ0UG9zKTsKKyAgICBpZiAoblJlc3VsdFBvcyA9PSAtMSkgeworICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKKyAgICAgIHJldHVybiBtX0lzRmluZDsKKyAgICB9CisgICAgZW5kSW5kZXggPSBuUmVzdWx0UG9zICsgY3NXb3JkLkdldExlbmd0aCgpIC0gMTsKKyAgICBpZiAoaVdvcmQgPT0gMCkgeworICAgICAgbV9yZXNTdGFydCA9IG5SZXN1bHRQb3M7CisgICAgfQorICAgIEZYX0JPT0wgYk1hdGNoID0gVFJVRTsKKyAgICBpZiAoaVdvcmQgIT0gMCAmJiAhYlNwYWNlU3RhcnQpIHsKKyAgICAgIGludCBQcmVSZXNFbmRQb3MgPSBuU3RhcnRQb3M7CisgICAgICBpbnQgY3VyQ2hhciA9IGNzV29yZC5HZXRBdCgwKTsKKyAgICAgIENGWF9XaWRlU3RyaW5nIGxhc3RXb3JkID0gbV9jc0ZpbmRXaGF0QXJyYXlbaVdvcmQgLSAxXTsKKyAgICAgIGludCBsYXN0Q2hhciA9IGxhc3RXb3JkLkdldEF0KGxhc3RXb3JkLkdldExlbmd0aCgpIC0gMSk7CisgICAgICBpZiAoblN0YXJ0UG9zID09IG5SZXN1bHRQb3MgJiYKKyAgICAgICAgICAhKF9Jc0lnbm9yZVNwYWNlQ2hhcmFjdGVyKGxhc3RDaGFyKSB8fAorICAgICAgICAgICAgX0lzSWdub3JlU3BhY2VDaGFyYWN0ZXIoY3VyQ2hhcikpKSB7CisgICAgICAgIGJNYXRjaCA9IEZBTFNFOworICAgICAgfQorICAgICAgZm9yIChpbnQgZCA9IFByZVJlc0VuZFBvczsgZCA8IG5SZXN1bHRQb3M7IGQrKykgeworICAgICAgICBGWF9XQ0hBUiBzdHJJbnNlcnQgPSBtX3N0clRleHQuR2V0QXQoZCk7CisgICAgICAgIGlmIChzdHJJbnNlcnQgIT0gVEVYVF9MSU5FRkVFRF9DSEFSICYmIHN0ckluc2VydCAhPSBURVhUX0JMQU5LX0NIQVIgJiYKKyAgICAgICAgICAgIHN0ckluc2VydCAhPSBURVhUX1JFVFVSTl9DSEFSICYmIHN0ckluc2VydCAhPSAxNjApIHsKKyAgICAgICAgICBiTWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoYlNwYWNlU3RhcnQpIHsKKyAgICAgIGlmIChuUmVzdWx0UG9zID4gMCkgeworICAgICAgICBGWF9XQ0hBUiBzdHJJbnNlcnQgPSBtX3N0clRleHQuR2V0QXQoblJlc3VsdFBvcyAtIDEpOworICAgICAgICBpZiAoc3RySW5zZXJ0ICE9IFRFWFRfTElORUZFRURfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9CTEFOS19DSEFSICYmCisgICAgICAgICAgICBzdHJJbnNlcnQgIT0gVEVYVF9SRVRVUk5fQ0hBUiAmJiBzdHJJbnNlcnQgIT0gMTYwKSB7CisgICAgICAgICAgYk1hdGNoID0gRkFMU0U7CisgICAgICAgICAgbV9yZXNTdGFydCA9IG5SZXN1bHRQb3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9yZXNTdGFydCA9IG5SZXN1bHRQb3MgLSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChtX2JNYXRjaFdob2xlV29yZCAmJiBiTWF0Y2gpIHsKKyAgICAgIGJNYXRjaCA9IElzTWF0Y2hXaG9sZVdvcmQobV9zdHJUZXh0LCBuUmVzdWx0UG9zLCBlbmRJbmRleCk7CisgICAgfQorICAgIG5TdGFydFBvcyA9IGVuZEluZGV4ICsgMTsKKyAgICBpZiAoIWJNYXRjaCkgeworICAgICAgaVdvcmQgPSAtMTsKKyAgICAgIGlmIChiU3BhY2VTdGFydCkgeworICAgICAgICBuU3RhcnRQb3MgPSBtX3Jlc1N0YXJ0ICsgbV9jc0ZpbmRXaGF0QXJyYXlbMV0uR2V0TGVuZ3RoKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBuU3RhcnRQb3MgPSBtX3Jlc1N0YXJ0ICsgbV9jc0ZpbmRXaGF0QXJyYXlbMF0uR2V0TGVuZ3RoKCk7CisgICAgICB9CisgICAgfQorICB9CisgIG1fcmVzRW5kID0gblJlc3VsdFBvcyArCisgICAgICAgICAgICAgbV9jc0ZpbmRXaGF0QXJyYXlbbV9jc0ZpbmRXaGF0QXJyYXkuR2V0U2l6ZSgpIC0gMV0uR2V0TGVuZ3RoKCkgLSAxOworICBtX0lzRmluZCA9IFRSVUU7CisgIGludCByZXNTdGFydCA9IEdldENoYXJJbmRleChtX3Jlc1N0YXJ0KTsKKyAgaW50IHJlc0VuZCA9IEdldENoYXJJbmRleChtX3Jlc0VuZCk7CisgIG1fcFRleHRQYWdlLT5HZXRSZWN0QXJyYXkocmVzU3RhcnQsIHJlc0VuZCAtIHJlc1N0YXJ0ICsgMSwgbV9yZXNBcnJheSk7CisgIGlmIChtX2ZsYWdzICYgRlBERlRFWFRfQ09OU0VDVVRJVkUpIHsKKyAgICBtX2ZpbmROZXh0U3RhcnQgPSBtX3Jlc1N0YXJ0ICsgMTsKKyAgICBtX2ZpbmRQcmVTdGFydCA9IG1fcmVzRW5kIC0gMTsKKyAgfSBlbHNlIHsKKyAgICBtX2ZpbmROZXh0U3RhcnQgPSBtX3Jlc0VuZCArIDE7CisgICAgbV9maW5kUHJlU3RhcnQgPSBtX3Jlc1N0YXJ0IC0gMTsKKyAgfQorICByZXR1cm4gbV9Jc0ZpbmQ7Cit9CitGWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpGaW5kUHJldigpIHsKKyAgaWYgKCFtX3BUZXh0UGFnZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3Jlc0FycmF5LlJlbW92ZUFsbCgpOworICBpZiAobV9zdHJUZXh0LklzRW1wdHkoKSB8fCBtX2ZpbmRQcmVTdGFydCA8IDApIHsKKyAgICBtX0lzRmluZCA9IEZBTFNFOworICAgIHJldHVybiBtX0lzRmluZDsKKyAgfQorICBDUERGX1RleHRQYWdlRmluZCBmaW5kRW5naW5lKG1fcFRleHRQYWdlKTsKKyAgRlhfQk9PTCByZXQgPSBmaW5kRW5naW5lLkZpbmRGaXJzdChtX2ZpbmRXaGF0LCBtX2ZsYWdzKTsKKyAgaWYgKCFyZXQpIHsKKyAgICBtX0lzRmluZCA9IEZBTFNFOworICAgIHJldHVybiBtX0lzRmluZDsKKyAgfQorICBpbnQgb3JkZXIgPSAtMSwgTWF0Y2hlZENvdW50ID0gMDsKKyAgd2hpbGUgKHJldCkgeworICAgIHJldCA9IGZpbmRFbmdpbmUuRmluZE5leHQoKTsKKyAgICBpZiAocmV0KSB7CisgICAgICBpbnQgb3JkZXIxID0gZmluZEVuZ2luZS5HZXRDdXJPcmRlcigpOworICAgICAgaW50IE1hdGNoZWRDb3VudDEgPSBmaW5kRW5naW5lLkdldE1hdGNoZWRDb3VudCgpOworICAgICAgaWYgKCgob3JkZXIxICsgTWF0Y2hlZENvdW50MSkgLSAxKSA+IG1fZmluZFByZVN0YXJ0KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgb3JkZXIgPSBvcmRlcjE7CisgICAgICBNYXRjaGVkQ291bnQgPSBNYXRjaGVkQ291bnQxOworICAgIH0KKyAgfQorICBpZiAob3JkZXIgPT0gLTEpIHsKKyAgICBtX0lzRmluZCA9IEZBTFNFOworICAgIHJldHVybiBtX0lzRmluZDsKKyAgfQorICBtX3Jlc1N0YXJ0ID0gbV9wVGV4dFBhZ2UtPlRleHRJbmRleEZyb21DaGFySW5kZXgob3JkZXIpOworICBtX3Jlc0VuZCA9IG1fcFRleHRQYWdlLT5UZXh0SW5kZXhGcm9tQ2hhckluZGV4KG9yZGVyICsgTWF0Y2hlZENvdW50IC0gMSk7CisgIG1fSXNGaW5kID0gVFJVRTsKKyAgbV9wVGV4dFBhZ2UtPkdldFJlY3RBcnJheShvcmRlciwgTWF0Y2hlZENvdW50LCBtX3Jlc0FycmF5KTsKKyAgaWYgKG1fZmxhZ3MgJiBGUERGVEVYVF9DT05TRUNVVElWRSkgeworICAgIG1fZmluZE5leHRTdGFydCA9IG1fcmVzU3RhcnQgKyAxOworICAgIG1fZmluZFByZVN0YXJ0ID0gbV9yZXNFbmQgLSAxOworICB9IGVsc2UgeworICAgIG1fZmluZE5leHRTdGFydCA9IG1fcmVzRW5kICsgMTsKKyAgICBtX2ZpbmRQcmVTdGFydCA9IG1fcmVzU3RhcnQgLSAxOworICB9CisgIHJldHVybiBtX0lzRmluZDsKK30KK3ZvaWQgQ1BERl9UZXh0UGFnZUZpbmQ6OkV4dHJhY3RGaW5kV2hhdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQpIHsKKyAgaWYgKGZpbmR3aGF0LklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgaW5kZXggPSAwOworICB3aGlsZSAoMSkgeworICAgIENGWF9XaWRlU3RyaW5nIGNzV29yZCA9IFRFWFRfRU1QVFk7CisgICAgaW50IHJldCA9CisgICAgICAgIEV4dHJhY3RTdWJTdHJpbmcoY3NXb3JkLCBmaW5kd2hhdC5jX3N0cigpLCBpbmRleCwgVEVYVF9CTEFOS19DSEFSKTsKKyAgICBpZiAoY3NXb3JkLklzRW1wdHkoKSkgeworICAgICAgaWYgKHJldCkgeworICAgICAgICBtX2NzRmluZFdoYXRBcnJheS5BZGQoQ0ZYX1dpZGVTdHJpbmcoTCIiKSk7CisgICAgICAgIGluZGV4Kys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGludCBwb3MgPSAwOworICAgIHdoaWxlIChwb3MgPCBjc1dvcmQuR2V0TGVuZ3RoKCkpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIGN1clN0ciA9IGNzV29yZC5NaWQocG9zLCAxKTsKKyAgICAgIEZYX1dDSEFSIGN1ckNoYXIgPSBjc1dvcmQuR2V0QXQocG9zKTsKKyAgICAgIGlmIChfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihjdXJDaGFyKSkgeworICAgICAgICBpZiAocG9zID4gMCAmJiBjdXJDaGFyID09IDB4MjAxOSkgeworICAgICAgICAgIHBvcysrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwb3MgPiAwKSB7CisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgcHJlU3RyID0gY3NXb3JkLk1pZCgwLCBwb3MpOworICAgICAgICAgIG1fY3NGaW5kV2hhdEFycmF5LkFkZChwcmVTdHIpOworICAgICAgICB9CisgICAgICAgIG1fY3NGaW5kV2hhdEFycmF5LkFkZChjdXJTdHIpOworICAgICAgICBpZiAocG9zID09IGNzV29yZC5HZXRMZW5ndGgoKSAtIDEpIHsKKyAgICAgICAgICBjc1dvcmQuRW1wdHkoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjc1dvcmQgPSBjc1dvcmQuUmlnaHQoY3NXb3JkLkdldExlbmd0aCgpIC0gcG9zIC0gMSk7CisgICAgICAgIHBvcyA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcG9zKys7CisgICAgfQorICAgIGlmICghY3NXb3JkLklzRW1wdHkoKSkgeworICAgICAgbV9jc0ZpbmRXaGF0QXJyYXkuQWRkKGNzV29yZCk7CisgICAgfQorICAgIGluZGV4Kys7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZUZpbmQ6OklzTWF0Y2hXaG9sZVdvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZFBvcykgeworICBpbnQgY2hhcl9sZWZ0ID0gMDsKKyAgaW50IGNoYXJfcmlnaHQgPSAwOworICBpbnQgY2hhcl9jb3VudCA9IGVuZFBvcyAtIHN0YXJ0UG9zICsgMTsKKyAgaWYgKGNoYXJfY291bnQgPCAxKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChjaGFyX2NvdW50ID09IDEgJiYgY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcykgPiAyNTUpIHsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoc3RhcnRQb3MgLSAxID49IDApIHsKKyAgICBjaGFyX2xlZnQgPSBjc1BhZ2VUZXh0LkdldEF0KHN0YXJ0UG9zIC0gMSk7CisgIH0KKyAgaWYgKHN0YXJ0UG9zICsgY2hhcl9jb3VudCA8IGNzUGFnZVRleHQuR2V0TGVuZ3RoKCkpIHsKKyAgICBjaGFyX3JpZ2h0ID0gY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcyArIGNoYXJfY291bnQpOworICB9CisgIGlmICgoY2hhcl9sZWZ0ID4gJ0EnICYmIGNoYXJfbGVmdCA8ICdhJykgfHwKKyAgICAgIChjaGFyX2xlZnQgPiAnYScgJiYgY2hhcl9sZWZ0IDwgJ3onKSB8fAorICAgICAgKGNoYXJfbGVmdCA+IDB4ZmIwMCAmJiBjaGFyX2xlZnQgPCAweGZiMDYpIHx8CisgICAgICAoY2hhcl9sZWZ0ID49ICcwJyAmJiBjaGFyX2xlZnQgPD0gJzknKSB8fAorICAgICAgKGNoYXJfcmlnaHQgPiAnQScgJiYgY2hhcl9yaWdodCA8ICdhJykgfHwKKyAgICAgIChjaGFyX3JpZ2h0ID4gJ2EnICYmIGNoYXJfcmlnaHQgPCAneicpIHx8CisgICAgICAoY2hhcl9yaWdodCA+IDB4ZmIwMCAmJiBjaGFyX3JpZ2h0IDwgMHhmYjA2KSB8fAorICAgICAgKGNoYXJfcmlnaHQgPj0gJzAnICYmIGNoYXJfcmlnaHQgPD0gJzknKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoISgoJ0EnID4gY2hhcl9sZWZ0IHx8IGNoYXJfbGVmdCA+ICdaJykgJiYKKyAgICAgICAgKCdhJyA+IGNoYXJfbGVmdCB8fCBjaGFyX2xlZnQgPiAneicpICYmCisgICAgICAgICgnQScgPiBjaGFyX3JpZ2h0IHx8IGNoYXJfcmlnaHQgPiAnWicpICYmCisgICAgICAgICgnYScgPiBjaGFyX3JpZ2h0IHx8IGNoYXJfcmlnaHQgPiAneicpKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoY2hhcl9jb3VudCA+IDApIHsKKyAgICBpZiAoY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcykgPj0gTCcwJyAmJgorICAgICAgICBjc1BhZ2VUZXh0LkdldEF0KHN0YXJ0UG9zKSA8PSBMJzknICYmIGNoYXJfbGVmdCA+PSBMJzAnICYmCisgICAgICAgIGNoYXJfbGVmdCA8PSBMJzknKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmIChjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPj0gTCcwJyAmJiBjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPD0gTCc5JyAmJgorICAgICAgICBjaGFyX3JpZ2h0ID49IEwnMCcgJiYgY2hhcl9yaWdodCA8PSBMJzknKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOwogfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9MaW5rRXh0cmFjdDo6R2V0VVJMKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBpZiAoIW1fSXNQYXJzZXJkIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX0xpbmtMaXN0LkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gTCIiOworRlhfQk9PTCBDUERGX1RleHRQYWdlRmluZDo6RXh0cmFjdFN1YlN0cmluZyhDRlhfV2lkZVN0cmluZyYgclN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwc3pGdWxsU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN1YlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgY2hTZXApIHsKKyAgaWYgKGxwc3pGdWxsU3RyaW5nID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgd2hpbGUgKGlTdWJTdHJpbmctLSkgeworICAgIGxwc3pGdWxsU3RyaW5nID0gRlhTWVNfd2NzY2hyKGxwc3pGdWxsU3RyaW5nLCBjaFNlcCk7CisgICAgaWYgKGxwc3pGdWxsU3RyaW5nID09IE5VTEwpIHsKKyAgICAgIHJTdHJpbmcuRW1wdHkoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgQ1BERl9MaW5rRXh0KiBsaW5rID0gTlVMTDsKLSAgICBsaW5rID0gbV9MaW5rTGlzdC5HZXRBdChpbmRleCk7Ci0gICAgaWYgKCFsaW5rKSB7Ci0gICAgICAgIHJldHVybiBMIiI7CisgICAgbHBzekZ1bGxTdHJpbmcrKzsKKyAgICB3aGlsZSAoKmxwc3pGdWxsU3RyaW5nID09IGNoU2VwKSB7CisgICAgICBscHN6RnVsbFN0cmluZysrOwogICAgIH0KLSAgICByZXR1cm4gbGluay0+bV9zdHJVcmw7CisgIH0KKyAgY29uc3QgRlhfV0NIQVIqIGxwY2hFbmQgPSBGWFNZU193Y3NjaHIobHBzekZ1bGxTdHJpbmcsIGNoU2VwKTsKKyAgaW50IG5MZW4gPSAobHBjaEVuZCA9PSBOVUxMKSA/IChpbnQpRlhTWVNfd2NzbGVuKGxwc3pGdWxsU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGludCkobHBjaEVuZCAtIGxwc3pGdWxsU3RyaW5nKTsKKyAgQVNTRVJUKG5MZW4gPj0gMCk7CisgIEZYU1lTX21lbWNweShyU3RyaW5nLkdldEJ1ZmZlcihuTGVuKSwgbHBzekZ1bGxTdHJpbmcsCisgICAgICAgICAgICAgICBuTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgIHJTdHJpbmcuUmVsZWFzZUJ1ZmZlcigpOworICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1BERl9MaW5rRXh0cmFjdDo6R2V0Qm91bmRlZFNlZ21lbnQoaW50IGluZGV4LCBpbnQmIHN0YXJ0LCBpbnQmIGNvdW50KSBjb25zdAotewotICAgIGlmICghbV9Jc1BhcnNlcmQgfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IG1fTGlua0xpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotICAgIENQREZfTGlua0V4dCogbGluayA9IE5VTEw7Ci0gICAgbGluayA9IG1fTGlua0xpc3QuR2V0QXQoaW5kZXgpOwotICAgIGlmICghbGluaykgewotICAgICAgICByZXR1cm4gOwotICAgIH0KLSAgICBzdGFydCA9IGxpbmstPm1fU3RhcnQ7Ci0gICAgY291bnQgPSBsaW5rLT5tX0NvdW50OworQ0ZYX1dpZGVTdHJpbmcgQ1BERl9UZXh0UGFnZUZpbmQ6Ok1ha2VSZXZlcnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyMjsKKyAgc3RyMi5FbXB0eSgpOworICBpbnQgbmxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgZm9yIChpbnQgaSA9IG5sZW4gLSAxOyBpID49IDA7IGktLSkgeworICAgIHN0cjIgKz0gc3RyLkdldEF0KGkpOworICB9CisgIHJldHVybiBzdHIyOwogfQotdm9pZCBDUERGX0xpbmtFeHRyYWN0OjpHZXRSZWN0cyhpbnQgaW5kZXgsIENGWF9SZWN0QXJyYXkmIHJlY3RzKSBjb25zdAotewotICAgIGlmICghbV9Jc1BhcnNlcmQgfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IG1fTGlua0xpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9UZXh0UGFnZUZpbmQ6OkdldFJlY3RBcnJheShDRlhfUmVjdEFycmF5JiByZWN0cykgY29uc3QgeworICByZWN0cy5Db3B5KG1fcmVzQXJyYXkpOworfQoraW50IENQREZfVGV4dFBhZ2VGaW5kOjpHZXRDdXJPcmRlcigpIGNvbnN0IHsKKyAgcmV0dXJuIEdldENoYXJJbmRleChtX3Jlc1N0YXJ0KTsKK30KK2ludCBDUERGX1RleHRQYWdlRmluZDo6R2V0TWF0Y2hlZENvdW50KCkgY29uc3QgeworICBpbnQgcmVzU3RhcnQgPSBHZXRDaGFySW5kZXgobV9yZXNTdGFydCk7CisgIGludCByZXNFbmQgPSBHZXRDaGFySW5kZXgobV9yZXNFbmQpOworICByZXR1cm4gcmVzRW5kIC0gcmVzU3RhcnQgKyAxOworfQorQ1BERl9MaW5rRXh0cmFjdDo6Q1BERl9MaW5rRXh0cmFjdCgpIDogbV9wVGV4dFBhZ2UoTlVMTCksIG1fSXNQYXJzZXJkKEZBTFNFKSB7fQorQ1BERl9MaW5rRXh0cmFjdDo6fkNQREZfTGlua0V4dHJhY3QoKSB7CisgIERlbGV0ZUxpbmtMaXN0KCk7Cit9CitGWF9CT09MIENQREZfTGlua0V4dHJhY3Q6OkV4dHJhY3RMaW5rcyhjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpIHsKKyAgaWYgKCFwVGV4dFBhZ2UgfHwgIXBUZXh0UGFnZS0+SXNQYXJzZXJlZCgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcFRleHRQYWdlID0gKGNvbnN0IENQREZfVGV4dFBhZ2UqKXBUZXh0UGFnZTsKKyAgbV9zdHJQYWdlVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dCgwLCAtMSk7CisgIERlbGV0ZUxpbmtMaXN0KCk7CisgIGlmIChtX3N0clBhZ2VUZXh0LklzRW1wdHkoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBwYXJzZXJMaW5rKCk7CisgIG1fSXNQYXJzZXJkID0gVFJVRTsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENQREZfTGlua0V4dHJhY3Q6OkRlbGV0ZUxpbmtMaXN0KCkgeworICB3aGlsZSAobV9MaW5rTGlzdC5HZXRTaXplKCkpIHsKKyAgICBDUERGX0xpbmtFeHQqIGxpbmtpbmZvID0gTlVMTDsKKyAgICBsaW5raW5mbyA9IG1fTGlua0xpc3QuR2V0QXQoMCk7CisgICAgbV9MaW5rTGlzdC5SZW1vdmVBdCgwKTsKKyAgICBkZWxldGUgbGlua2luZm87CisgIH0KKyAgbV9MaW5rTGlzdC5SZW1vdmVBbGwoKTsKK30KK2ludCBDUERGX0xpbmtFeHRyYWN0OjpDb3VudExpbmtzKCkgY29uc3QgeworICBpZiAoIW1fSXNQYXJzZXJkKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBtX0xpbmtMaXN0LkdldFNpemUoKTsKK30KK3ZvaWQgQ1BERl9MaW5rRXh0cmFjdDo6cGFyc2VyTGluaygpIHsKKyAgaW50IHN0YXJ0ID0gMCwgcG9zID0gMDsKKyAgaW50IFRvdGFsQ2hhciA9IG1fcFRleHRQYWdlLT5Db3VudENoYXJzKCk7CisgIHdoaWxlIChwb3MgPCBUb3RhbENoYXIpIHsKKyAgICBGUERGX0NIQVJfSU5GTyBwYWdlQ2hhcjsKKyAgICBtX3BUZXh0UGFnZS0+R2V0Q2hhckluZm8ocG9zLCBwYWdlQ2hhcik7CisgICAgaWYgKHBhZ2VDaGFyLm1fRmxhZyA9PSBDSEFSX0dFTkVSQVRFRCB8fCBwYWdlQ2hhci5tX1VuaWNvZGUgPT0gMHgyMCB8fAorICAgICAgICBwb3MgPT0gVG90YWxDaGFyIC0gMSkgeworICAgICAgaW50IG5Db3VudCA9IHBvcyAtIHN0YXJ0OworICAgICAgaWYgKHBvcyA9PSBUb3RhbENoYXIgLSAxKSB7CisgICAgICAgIG5Db3VudCsrOworICAgICAgfQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyQmVDaGVjazsKKyAgICAgIHN0ckJlQ2hlY2sgPSBtX3BUZXh0UGFnZS0+R2V0UGFnZVRleHQoc3RhcnQsIG5Db3VudCk7CisgICAgICBpZiAoc3RyQmVDaGVjay5HZXRMZW5ndGgoKSA+IDUpIHsKKyAgICAgICAgd2hpbGUgKHN0ckJlQ2hlY2suR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgRlhfV0NIQVIgY2ggPSBzdHJCZUNoZWNrLkdldEF0KHN0ckJlQ2hlY2suR2V0TGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICBpZiAoY2ggPT0gTCcpJyB8fCBjaCA9PSBMJywnIHx8IGNoID09IEwnPicgfHwgY2ggPT0gTCcuJykgeworICAgICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suTWlkKDAsIHN0ckJlQ2hlY2suR2V0TGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIG5Db3VudC0tOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5Db3VudCA+IDUgJiYKKyAgICAgICAgICAgIChDaGVja1dlYkxpbmsoc3RyQmVDaGVjaykgfHwgQ2hlY2tNYWlsTGluayhzdHJCZUNoZWNrKSkpIHsKKyAgICAgICAgICBpZiAoIUFwcGVuZFRvTGlua0xpc3Qoc3RhcnQsIG5Db3VudCwgc3RyQmVDaGVjaykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3RhcnQgPSArK3BvczsKKyAgICB9IGVsc2UgeworICAgICAgcG9zKys7CiAgICAgfQotICAgIENQREZfTGlua0V4dCogbGluayA9IE5VTEw7Ci0gICAgbGluayA9IG1fTGlua0xpc3QuR2V0QXQoaW5kZXgpOwotICAgIGlmICghbGluaykgewotICAgICAgICByZXR1cm4gOworICB9Cit9CitGWF9CT09MIENQREZfTGlua0V4dHJhY3Q6OkNoZWNrV2ViTGluayhDRlhfV2lkZVN0cmluZyYgc3RyQmVDaGVjaykgeworICBDRlhfV2lkZVN0cmluZyBzdHIgPSBzdHJCZUNoZWNrOworICBzdHIuTWFrZUxvd2VyKCk7CisgIGlmIChzdHIuRmluZChMImh0dHA6Ly93d3cuIikgIT0gLTEpIHsKKyAgICBzdHJCZUNoZWNrID0gc3RyQmVDaGVjay5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBzdHIuRmluZChMImh0dHA6Ly93d3cuIikpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChzdHIuRmluZChMImh0dHA6Ly8iKSAhPSAtMSkgeworICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHN0ci5GaW5kKEwiaHR0cDovLyIpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoc3RyLkZpbmQoTCJodHRwczovL3d3dy4iKSAhPSAtMSkgeworICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHN0ci5GaW5kKEwiaHR0cHM6Ly93d3cuIikpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChzdHIuRmluZChMImh0dHBzOi8vIikgIT0gLTEpIHsKKyAgICBzdHJCZUNoZWNrID0gc3RyQmVDaGVjay5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBzdHIuRmluZChMImh0dHBzOi8vIikpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChzdHIuRmluZChMInd3dy4iKSAhPSAtMSkgeworICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHN0ci5GaW5kKEwid3d3LiIpKTsKKyAgICBzdHJCZUNoZWNrID0gTCJodHRwOi8vIiArIHN0ckJlQ2hlY2s7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX0xpbmtFeHRyYWN0OjpDaGVja01haWxMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgc3RyLk1ha2VMb3dlcigpOworICBpbnQgYVBvcyA9IHN0ci5GaW5kKEwnQCcpOworICBpZiAoYVBvcyA8IDEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHN0ci5HZXRBdChhUG9zIC0gMSkgPT0gTCcuJyB8fCBzdHIuR2V0QXQoYVBvcyAtIDEpID09IEwnXycpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IGk7CisgIGZvciAoaSA9IGFQb3MgLSAxOyBpID49IDA7IGktLSkgeworICAgIEZYX1dDSEFSIGNoID0gc3RyLkdldEF0KGkpOworICAgIGlmIChjaCA9PSBMJ18nIHx8IGNoID09IEwnLicgfHwgKGNoID49IEwnYScgJiYgY2ggPD0gTCd6JykgfHwKKyAgICAgICAgKGNoID49IEwnMCcgJiYgY2ggPD0gTCc5JykpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaSA9PSBhUG9zIC0gMSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBzdHIgPSBzdHIuUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gaSAtIDEpOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1fcFRleHRQYWdlLT5HZXRSZWN0QXJyYXkobGluay0+bV9TdGFydCwgbGluay0+bV9Db3VudCwgcmVjdHMpOworICB9CisgIGFQb3MgPSBzdHIuRmluZChMJ0AnKTsKKyAgaWYgKGFQb3MgPCAxKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9XaWRlU3RyaW5nIHN0cnRlbXAgPSBMIiI7CisgIGZvciAoaSA9IDA7IGkgPCBhUG9zOyBpKyspIHsKKyAgICBGWF9XQ0hBUiB3Y2ggPSBzdHIuR2V0QXQoaSk7CisgICAgaWYgKHdjaCA+PSBMJ2EnICYmIHdjaCA8PSBMJ3onKSB7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgc3RydGVtcCA9IHN0ci5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBpICsgMSk7CisgICAgfQorICB9CisgIGlmIChzdHJ0ZW1wICE9IEwiIikgeworICAgIHN0ciA9IHN0cnRlbXA7CisgIH0KKyAgYVBvcyA9IHN0ci5GaW5kKEwnQCcpOworICBpZiAoYVBvcyA8IDEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgc3RyLlRyaW1SaWdodChMJy4nKTsKKyAgc3RydGVtcCA9IHN0cjsKKyAgaW50IGVQb3MgPSBzdHIuRmluZChMJy4nKTsKKyAgaWYgKGVQb3MgPT0gLTEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgd2hpbGUgKGVQb3MgIT0gLTEpIHsKKyAgICBzdHJ0ZW1wID0gc3RydGVtcC5SaWdodChzdHJ0ZW1wLkdldExlbmd0aCgpIC0gZVBvcyAtIDEpOworICAgIGVQb3MgPSBzdHJ0ZW1wLkZpbmQoJy4nKTsKKyAgfQorICBlUG9zID0gc3RydGVtcC5HZXRMZW5ndGgoKTsKKyAgZm9yIChpID0gMDsgaSA8IGVQb3M7IGkrKykgeworICAgIEZYX1dDSEFSIHdjaCA9IHN0ci5HZXRBdChpKTsKKyAgICBpZiAoKHdjaCA+PSBMJ2EnICYmIHdjaCA8PSBMJ3onKSB8fCAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgeworICAgICAgc3RyID0gc3RyLkxlZnQoc3RyLkdldExlbmd0aCgpIC0gZVBvcyArIGkgKyAxKTsKKyAgICAgIGVQb3MgPSBlUG9zIC0gaSAtIDE7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaW50IG5MZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIGZvciAoaSA9IGFQb3MgKyAxOyBpIDwgbkxlbiAtIGVQb3M7IGkrKykgeworICAgIEZYX1dDSEFSIHdjaCA9IHN0ci5HZXRBdChpKTsKKyAgICBpZiAod2NoID09IEwnLScgfHwgd2NoID09IEwnLicgfHwgKHdjaCA+PSBMJ2EnICYmIHdjaCA8PSBMJ3onKSB8fAorICAgICAgICAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBpZiAoc3RyLkZpbmQoTCJtYWlsdG86IikgPT0gLTEpIHsKKyAgICBzdHIgPSBMIm1haWx0bzoiICsgc3RyOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX0xpbmtFeHRyYWN0OjpBcHBlbmRUb0xpbmtMaXN0KGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clVybCkgeworICBDUERGX0xpbmtFeHQqIGxpbmtJbmZvID0gTlVMTDsKKyAgbGlua0luZm8gPSBGWF9ORVcgQ1BERl9MaW5rRXh0OworICBpZiAoIWxpbmtJbmZvKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGxpbmtJbmZvLT5tX3N0clVybCA9IHN0clVybDsKKyAgbGlua0luZm8tPm1fU3RhcnQgPSBzdGFydDsKKyAgbGlua0luZm8tPm1fQ291bnQgPSBjb3VudDsKKyAgbV9MaW5rTGlzdC5BZGQobGlua0luZm8pOworICByZXR1cm4gVFJVRTsKK30KK0NGWF9XaWRlU3RyaW5nIENQREZfTGlua0V4dHJhY3Q6OkdldFVSTChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKCFtX0lzUGFyc2VyZCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9MaW5rTGlzdC5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gTCIiOworICB9CisgIENQREZfTGlua0V4dCogbGluayA9IE5VTEw7CisgIGxpbmsgPSBtX0xpbmtMaXN0LkdldEF0KGluZGV4KTsKKyAgaWYgKCFsaW5rKSB7CisgICAgcmV0dXJuIEwiIjsKKyAgfQorICByZXR1cm4gbGluay0+bV9zdHJVcmw7Cit9Cit2b2lkIENQREZfTGlua0V4dHJhY3Q6OkdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBjb3VudCkgY29uc3QgeworICBpZiAoIW1fSXNQYXJzZXJkIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX0xpbmtMaXN0LkdldFNpemUoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0xpbmtFeHQqIGxpbmsgPSBOVUxMOworICBsaW5rID0gbV9MaW5rTGlzdC5HZXRBdChpbmRleCk7CisgIGlmICghbGluaykgeworICAgIHJldHVybjsKKyAgfQorICBzdGFydCA9IGxpbmstPm1fU3RhcnQ7CisgIGNvdW50ID0gbGluay0+bV9Db3VudDsKK30KK3ZvaWQgQ1BERl9MaW5rRXh0cmFjdDo6R2V0UmVjdHMoaW50IGluZGV4LCBDRlhfUmVjdEFycmF5JiByZWN0cykgY29uc3QgeworICBpZiAoIW1fSXNQYXJzZXJkIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX0xpbmtMaXN0LkdldFNpemUoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0xpbmtFeHQqIGxpbmsgPSBOVUxMOworICBsaW5rID0gbV9MaW5rTGlzdC5HZXRBdChpbmRleCk7CisgIGlmICghbGluaykgeworICAgIHJldHVybjsKKyAgfQorICBtX3BUZXh0UGFnZS0+R2V0UmVjdEFycmF5KGxpbmstPm1fU3RhcnQsIGxpbmstPm1fQ291bnQsIHJlY3RzKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9zZWFyY2guY3BwIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X3NlYXJjaC5jcHAKaW5kZXggMjFhMjU2NC4uOTU4MzliNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X3NlYXJjaC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X3NlYXJjaC5jcHAKQEAgLTYsMzE1ICs2LDMzMCBAQAogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKLWNsYXNzIENQREZfVGV4dFN0cmVhbQotewotcHVibGljOgotICAgIENQREZfVGV4dFN0cmVhbShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgRlhfQk9PTCBiVXNlTEYsIENGWF9QdHJBcnJheSogcE9iakFycmF5KTsKLSAgICB+Q1BERl9UZXh0U3RyZWFtKCkge30KLSAgICBGWF9CT09MIFByb2Nlc3NPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLCBGWF9CT09MIGJGaXJzdExpbmUpOwotICAgIENGWF9XaWRlVGV4dEJ1ZiYJbV9CdWZmZXI7Ci0gICAgRlhfQk9PTAkJCQltX2JVc2VMRjsKLSAgICBDRlhfUHRyQXJyYXkqCQltX3BPYmpBcnJheTsKLSAgICBjb25zdCBDUERGX1RleHRPYmplY3QqCW1fcExhc3RPYmo7CitjbGFzcyBDUERGX1RleHRTdHJlYW0geworIHB1YmxpYzoKKyAgQ1BERl9UZXh0U3RyZWFtKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlTEYsCisgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSk7CisgIH5DUERGX1RleHRTdHJlYW0oKSB7fQorICBGWF9CT09MIFByb2Nlc3NPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLCBGWF9CT09MIGJGaXJzdExpbmUpOworICBDRlhfV2lkZVRleHRCdWYmIG1fQnVmZmVyOworICBGWF9CT09MIG1fYlVzZUxGOworICBDRlhfUHRyQXJyYXkqIG1fcE9iakFycmF5OworICBjb25zdCBDUERGX1RleHRPYmplY3QqIG1fcExhc3RPYmo7CiB9OwotQ1BERl9UZXh0U3RyZWFtOjpDUERGX1RleHRTdHJlYW0oQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIEZYX0JPT0wgYlVzZUxGLCBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSkgOiBtX0J1ZmZlcihidWZmZXIpCi17Ci0gICAgbV9wTGFzdE9iaiA9IE5VTEw7Ci0gICAgbV9iVXNlTEYgPSBiVXNlTEY7Ci0gICAgbV9wT2JqQXJyYXkgPSBwT2JqQXJyYXk7CitDUERGX1RleHRTdHJlYW06OkNQREZfVGV4dFN0cmVhbShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZUxGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBwT2JqQXJyYXkpCisgICAgOiBtX0J1ZmZlcihidWZmZXIpIHsKKyAgbV9wTGFzdE9iaiA9IE5VTEw7CisgIG1fYlVzZUxGID0gYlVzZUxGOworICBtX3BPYmpBcnJheSA9IHBPYmpBcnJheTsKIH0KLUZYX0JPT0wgRlBERlRleHRfSXNTYW1lVGV4dE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpCi17Ci0gICAgaWYgKCFwVGV4dE9iajEgfHwgIXBUZXh0T2JqMikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmNQcmVPYmoocFRleHRPYmoyLT5tX0xlZnQsIHBUZXh0T2JqMi0+bV9Cb3R0b20sIHBUZXh0T2JqMi0+bV9SaWdodCwgcFRleHRPYmoyLT5tX1RvcCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0N1ck9iaihwVGV4dE9iajEtPm1fTGVmdCwgcFRleHRPYmoxLT5tX0JvdHRvbSwgcFRleHRPYmoxLT5tX1JpZ2h0LCBwVGV4dE9iajEtPm1fVG9wKTsKLSAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpICYmIHJjQ3VyT2JqLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCFyY1ByZU9iai5Jc0VtcHR5KCkgfHwgIXJjQ3VyT2JqLklzRW1wdHkoKSkgewotICAgICAgICByY1ByZU9iai5JbnRlcnNlY3QocmNDdXJPYmopOwotICAgICAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZYU1lTX2ZhYnMocmNQcmVPYmouV2lkdGgoKSAtIHJjQ3VyT2JqLldpZHRoKCkpID4gcmNDdXJPYmouV2lkdGgoKSAvIDIpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFRleHRPYmoyLT5HZXRGb250U2l6ZSgpICE9IHBUZXh0T2JqMS0+R2V0Rm9udFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBuUHJlQ291bnQgPSBwVGV4dE9iajItPkNvdW50SXRlbXMoKTsKLSAgICBpbnQgbkN1ckNvdW50ID0gcFRleHRPYmoxLT5Db3VudEl0ZW1zKCk7Ci0gICAgaWYgKG5QcmVDb3VudCAhPSBuQ3VyQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5QcmVDb3VudDsgaSsrKSB7Ci0gICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbVBlciwgaXRlbUN1cjsKLSAgICAgICAgcFRleHRPYmoyLT5HZXRJdGVtSW5mbyhpLCAmaXRlbVBlcik7Ci0gICAgICAgIHBUZXh0T2JqMS0+R2V0SXRlbUluZm8oaSwgJml0ZW1DdXIpOwotICAgICAgICBpZiAoaXRlbUN1ci5tX0NoYXJDb2RlICE9IGl0ZW1QZXIubV9DaGFyQ29kZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotaW50IEdldENoYXJXaWR0aChGWF9EV09SRCBjaGFyQ29kZSwgQ1BERl9Gb250KiBwRm9udCkKLXsKLSAgICBpZihjaGFyQ29kZSA9PSAtMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IHcgPSBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyQ29kZSk7Ci0gICAgaWYodyA9PSAwKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICAgICAgcEZvbnQtPkFwcGVuZENoYXIoc3RyLCBjaGFyQ29kZSk7Ci0gICAgICAgIHcgPSBwRm9udC0+R2V0U3RyaW5nV2lkdGgoc3RyLCAxKTsKLSAgICAgICAgaWYodyA9PSAwKSB7Ci0gICAgICAgICAgICBGWF9SRUNUIEJCb3g7Ci0gICAgICAgICAgICBwRm9udC0+R2V0Q2hhckJCb3goY2hhckNvZGUsIEJCb3gpOwotICAgICAgICAgICAgdyA9IEJCb3gucmlnaHQgLSBCQm94LmxlZnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHc7Ci19Ci1pbnQgRlBERlRleHRfUHJvY2Vzc0ludGVyT2JqKGNvbnN0IENQREZfVGV4dE9iamVjdCogcFByZXZPYmosIGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaikKLXsKLSAgICBpZihGUERGVGV4dF9Jc1NhbWVUZXh0T2JqZWN0KHBQcmV2T2JqLCBwT2JqKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKLSAgICBpbnQgbkl0ZW0gPSBwUHJldk9iai0+Q291bnRJdGVtcygpOwotICAgIHBQcmV2T2JqLT5HZXRJdGVtSW5mbyhuSXRlbSAtIDEsICZpdGVtKTsKLSAgICBGWF9XQ0hBUiBwcmVDaGFyID0gMCwgY3VyQ2hhciA9IDA7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ciA9IHBQcmV2T2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICBpZih3c3RyLkdldExlbmd0aCgpKSB7Ci0gICAgICAgIHByZUNoYXIgPSB3c3RyLkdldEF0KDApOwotICAgIH0KLSAgICBGWF9GTE9BVCBsYXN0X3BvcyA9IGl0ZW0ubV9PcmlnaW5YOwotICAgIGludCBuTGFzdFdpZHRoID0gR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcFByZXZPYmotPkdldEZvbnQoKSk7Ci0gICAgRlhfRkxPQVQgbGFzdF93aWR0aCA9IG5MYXN0V2lkdGggKiBwUHJldk9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgbGFzdF93aWR0aCA9IEZYU1lTX2ZhYnMobGFzdF93aWR0aCk7Ci0gICAgcE9iai0+R2V0SXRlbUluZm8oMCwgJml0ZW0pOwotICAgIHdzdHIgPSBwT2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICBpZih3c3RyLkdldExlbmd0aCgpKSB7Ci0gICAgICAgIGN1ckNoYXIgPSB3c3RyLkdldEF0KDApOwotICAgIH0KLSAgICBpbnQgblRoaXNXaWR0aCA9IEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHBPYmotPkdldEZvbnQoKSk7Ci0gICAgRlhfRkxPQVQgdGhpc193aWR0aCA9IG5UaGlzV2lkdGggKiBwT2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgICB0aGlzX3dpZHRoID0gRlhTWVNfZmFicyh0aGlzX3dpZHRoKTsKLSAgICBGWF9GTE9BVCB0aHJlc2hvbGQgPSBsYXN0X3dpZHRoID4gdGhpc193aWR0aCA/IGxhc3Rfd2lkdGggLyA0IDogdGhpc193aWR0aCAvIDQ7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBwcmV2X21hdHJpeCwgcHJldl9yZXZlcnNlOwotICAgIHBQcmV2T2JqLT5HZXRUZXh0TWF0cml4KCZwcmV2X21hdHJpeCk7Ci0gICAgcHJldl9yZXZlcnNlLlNldFJldmVyc2UocHJldl9tYXRyaXgpOwotICAgIEZYX0ZMT0FUIHggPSBwT2JqLT5HZXRQb3NYKCksIHkgPSBwT2JqLT5HZXRQb3NZKCk7Ci0gICAgcHJldl9yZXZlcnNlLlRyYW5zZm9ybSh4LCB5KTsKLSAgICBpZiAoRlhTWVNfZmFicyh5KSA+IHRocmVzaG9sZCAqIDIpIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIHRocmVzaG9sZCA9IChGWF9GTE9BVCkobkxhc3RXaWR0aCA+IG5UaGlzV2lkdGggPyBuTGFzdFdpZHRoIDogblRoaXNXaWR0aCk7Ci0gICAgdGhyZXNob2xkID0gdGhyZXNob2xkID4gNDAwID8gKHRocmVzaG9sZCA8IDcwMCA/IHRocmVzaG9sZCAvIDQgOiAgdGhyZXNob2xkIC8gNSkgOiAodGhyZXNob2xkIC8gMik7Ci0gICAgdGhyZXNob2xkICo9IG5MYXN0V2lkdGggPiBuVGhpc1dpZHRoID8gRlhTWVNfZmFicyhwUHJldk9iai0+R2V0Rm9udFNpemUoKSkgOiBGWFNZU19mYWJzKHBPYmotPkdldEZvbnRTaXplKCkpOwotICAgIHRocmVzaG9sZCAvPSAxMDAwOwotICAgIGlmIChGWFNZU19mYWJzKGxhc3RfcG9zICsgbGFzdF93aWR0aCAtIHgpID4gdGhyZXNob2xkICYmIGN1ckNoYXIgIT0gTCcgJyAmJiBwcmVDaGFyICE9IEwnICcpCi0gICAgICAgIGlmKGN1ckNoYXIgIT0gTCcgJyAmJiBwcmVDaGFyICE9IEwnICcpIHsKLSAgICAgICAgICAgIGlmKCh4IC0gbGFzdF9wb3MgLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCB8fCAobGFzdF9wb3MgLSB4IC0gbGFzdF93aWR0aCkgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHggPCAwICYmIChsYXN0X3BvcyAtIHggLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKHggLSBsYXN0X3BvcyAtIGxhc3Rfd2lkdGgpID4gdGhpc193aWR0aCB8fCAoeCAtIGxhc3RfcG9zIC0gdGhpc193aWR0aCkgPiBsYXN0X3dpZHRoICkgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgaWYobGFzdF9wb3MgKyBsYXN0X3dpZHRoID4geCArIHRoaXNfd2lkdGggJiYgY3VyQ2hhciA9PSBMJyAnKSB7Ci0gICAgICAgIHJldHVybiAzOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLUZYX0JPT0wgQ1BERl9UZXh0U3RyZWFtOjpQcm9jZXNzT2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaiwgRlhfQk9PTCBiRmlyc3RMaW5lKQotewotICAgIENQREZfRm9udCogcEZvbnQgPSBwT2JqLT5HZXRGb250KCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgcE9iai0+R2V0VGV4dE1hdHJpeCgmbWF0cml4KTsKLSAgICBpbnQgaXRlbV9pbmRleCA9IDA7Ci0gICAgaWYgKG1fcExhc3RPYmopIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IEZQREZUZXh0X1Byb2Nlc3NJbnRlck9iaihtX3BMYXN0T2JqLCBwT2JqKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAyKSB7Ci0gICAgICAgICAgICBpbnQgbGVuID0gbV9CdWZmZXIuR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuICYmIG1fYlVzZUxGICYmIG1fQnVmZmVyLkdldEJ1ZmZlcigpW2xlbiAtIDFdID09IEwnLScpIHsKLSAgICAgICAgICAgICAgICBtX0J1ZmZlci5EZWxldGUobGVuIC0gMSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcE9iakFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5SZW1vdmVBdCgobGVuIC0gMSkgKiAyLCAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChiRmlyc3RMaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9iVXNlTEYpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcihMJ1xyJyk7Ci0gICAgICAgICAgICAgICAgICAgIG1fQnVmZmVyLkFwcGVuZENoYXIoTCdcbicpOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9wT2JqQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BPYmpBcnJheSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9wT2JqQXJyYXktPkFkZChOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKLSAgICAgICAgICAgIG1fQnVmZmVyLkFwcGVuZENoYXIoTCcgJyk7Ci0gICAgICAgICAgICBpZiAobV9wT2JqQXJyYXkpIHsKLSAgICAgICAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOwotICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgICAgICBtX3BMYXN0T2JqID0gcE9iajsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gMykgewotICAgICAgICAgICAgaXRlbV9pbmRleCA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9wTGFzdE9iaiA9IHBPYmo7Ci0gICAgaW50IG5JdGVtcyA9IHBPYmotPkNvdW50SXRlbXMoKTsKLSAgICBGWF9GTE9BVCBJZ25vcmVrZXJuaW5nID0gMDsKLSAgICBmb3IoaW50IGkgPSAxOyBpIDwgbkl0ZW1zIC0gMTsgaSArPSAyKSB7Ci0gICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKLSAgICAgICAgcE9iai0+R2V0SXRlbUluZm8oaSwgJml0ZW0pOwotICAgICAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICBpZihpID09IDEpIHsKLSAgICAgICAgICAgICAgICBJZ25vcmVrZXJuaW5nID0gaXRlbS5tX09yaWdpblg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoSWdub3Jla2VybmluZyA+IGl0ZW0ubV9PcmlnaW5YKSB7Ci0gICAgICAgICAgICAgICAgSWdub3Jla2VybmluZyA9IGl0ZW0ubV9PcmlnaW5YOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSWdub3Jla2VybmluZyA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9GTE9BVCBzcGFjaW5nID0gMDsKLSAgICBmb3IgKDsgaXRlbV9pbmRleCA8IG5JdGVtczsgaXRlbV9pbmRleCArKykgewotICAgICAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gICAgICAgIHBPYmotPkdldEl0ZW1JbmZvKGl0ZW1faW5kZXgsICZpdGVtKTsKLSAgICAgICAgaWYgKGl0ZW0ubV9DaGFyQ29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ciA9IG1fQnVmZmVyLkdldFdpZGVTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmICh3c3RyLklzRW1wdHkoKSB8fCB3c3RyLkdldEF0KHdzdHIuR2V0TGVuZ3RoKCkgLSAxKSA9PSBMJyAnKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCBmb250c2l6ZV9oID0gcE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7Ci0gICAgICAgICAgICBzcGFjaW5nID0gLWZvbnRzaXplX2ggKiAoaXRlbS5tX09yaWdpblggLSBJZ25vcmVrZXJuaW5nKSAvIDEwMDA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBjaGFyU3BhY2UgPSBwT2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2U7Ci0gICAgICAgIGlmKG5JdGVtcyA+IDMgJiYgIXNwYWNpbmcpIHsKLSAgICAgICAgICAgIGNoYXJTcGFjZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoKHNwYWNpbmcgfHwgY2hhclNwYWNlKSAmJiBpdGVtX2luZGV4ID4gMCkgewotICAgICAgICAgICAgaW50IGxhc3Rfd2lkdGggPSAwOwotICAgICAgICAgICAgRlhfRkxPQVQgZm9udHNpemVfaCA9IHBPYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplSCgpOwotICAgICAgICAgICAgRlhfRFdPUkQgc3BhY2VfY2hhcmNvZGUgPSBwRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSgnICcpOwotICAgICAgICAgICAgRlhfRkxPQVQgdGhyZXNob2xkID0gMDsKLSAgICAgICAgICAgIGlmIChzcGFjZV9jaGFyY29kZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2ggKiBwRm9udC0+R2V0Q2hhcldpZHRoRihzcGFjZV9jaGFyY29kZSkgLyAxMDAwIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHRocmVzaG9sZCA+IGZvbnRzaXplX2ggLyAzKSB7Ci0gICAgICAgICAgICAgICAgdGhyZXNob2xkID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyZXNob2xkIC89IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhyZXNob2xkID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSBmb250c2l6ZV9oOwotICAgICAgICAgICAgICAgIGludCB0aGlzX3dpZHRoID0gRlhTWVNfYWJzKEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHBGb250KSk7Ci0gICAgICAgICAgICAgICAgdGhyZXNob2xkID0gdGhpc193aWR0aCA+IGxhc3Rfd2lkdGggPyAoRlhfRkxPQVQpdGhpc193aWR0aCA6IChGWF9GTE9BVClsYXN0X3dpZHRoOwotICAgICAgICAgICAgICAgIGludCBuRGl2aWRlID0gNjsKLSAgICAgICAgICAgICAgICBpZiAodGhyZXNob2xkIDwgMzAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5EaXZpZGUgPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhyZXNob2xkIDwgNTAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5EaXZpZGUgPSA0OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhyZXNob2xkIDwgNzAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5EaXZpZGUgPSA1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgLyBuRGl2aWRlOwotICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2ggKiB0aHJlc2hvbGQgLyAxMDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoY2hhclNwYWNlID4gMC4wMDEpIHsKLSAgICAgICAgICAgICAgICBzcGFjaW5nICs9IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZShjaGFyU3BhY2UpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGNoYXJTcGFjZSA8IC0wLjAwMSkgewotICAgICAgICAgICAgICAgIHNwYWNpbmcgLT0gbWF0cml4LlRyYW5zZm9ybURpc3RhbmNlKEZYU1lTX2ZhYnMoY2hhclNwYWNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhyZXNob2xkICYmIChzcGFjaW5nICYmIHNwYWNpbmcgPj0gdGhyZXNob2xkKSApIHsKLSAgICAgICAgICAgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKEwnICcpOwotICAgICAgICAgICAgICAgIGlmIChtX3BPYmpBcnJheSkgewotICAgICAgICAgICAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpdGVtLm1fQ2hhckNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwYWNpbmcgPSAwOwotICAgICAgICB9Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHVuaWNvZGVfc3RyID0gcEZvbnQtPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICAgICAgaWYgKHVuaWNvZGVfc3RyLklzRW1wdHkoKSkgewotICAgICAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcigoRlhfV0NIQVIpaXRlbS5tX0NoYXJDb2RlKTsKLSAgICAgICAgICAgIGlmIChtX3BPYmpBcnJheSkgewotICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoKHZvaWQqKXBPYmopOwotICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoKHZvaWQqKShpbnRwdHJfdClpdGVtX2luZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fQnVmZmVyIDw8IHVuaWNvZGVfc3RyOwotICAgICAgICAgICAgaWYgKG1fcE9iakFycmF5KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmljb2RlX3N0ci5HZXRMZW5ndGgoKTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKCh2b2lkKilwT2JqKTsKLSAgICAgICAgICAgICAgICAgICAgbV9wT2JqQXJyYXktPkFkZCgodm9pZCopKGludHB0cl90KWl0ZW1faW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KK0ZYX0JPT0wgRlBERlRleHRfSXNTYW1lVGV4dE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMikgeworICBpZiAoIXBUZXh0T2JqMSB8fCAhcFRleHRPYmoyKSB7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotdm9pZCBfUERGX0dldFRleHRTdHJlYW1fVW5pY29kZShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2UsIEZYX0JPT0wgYlVzZUxGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSkKLXsKLSAgICBDUERGX1RleHRTdHJlYW0gdGV4dHN0cmVhbShidWZmZXIsIGJVc2VMRiwgcE9iakFycmF5KTsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwUGFnZS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqZWN0ID0gcFBhZ2UtPkdldE5leHRPYmplY3QocG9zKTsKLSAgICAgICAgaWYgKHBPYmplY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBPYmplY3QtPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHRleHRzdHJlYW0uUHJvY2Vzc09iamVjdCgoQ1BERl9UZXh0T2JqZWN0KilwT2JqZWN0LCBGQUxTRSk7CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCByY1ByZU9iaihwVGV4dE9iajItPm1fTGVmdCwgcFRleHRPYmoyLT5tX0JvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwVGV4dE9iajItPm1fUmlnaHQsIHBUZXh0T2JqMi0+bV9Ub3ApOworICBDRlhfRmxvYXRSZWN0IHJjQ3VyT2JqKHBUZXh0T2JqMS0+bV9MZWZ0LCBwVGV4dE9iajEtPm1fQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBUZXh0T2JqMS0+bV9SaWdodCwgcFRleHRPYmoxLT5tX1RvcCk7CisgIGlmIChyY1ByZU9iai5Jc0VtcHR5KCkgJiYgcmNDdXJPYmouSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFyY1ByZU9iai5Jc0VtcHR5KCkgfHwgIXJjQ3VyT2JqLklzRW1wdHkoKSkgeworICAgIHJjUHJlT2JqLkludGVyc2VjdChyY0N1ck9iaik7CisgICAgaWYgKHJjUHJlT2JqLklzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLX0KLUNGWF9XaWRlU3RyaW5nIFBERl9HZXRGaXJzdFRleHRMaW5lX1VuaWNvZGUoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSkKLXsKLSAgICBDRlhfV2lkZVRleHRCdWYgYnVmZmVyOwotICAgIGJ1ZmZlci5Fc3RpbWF0ZVNpemUoMCwgMTAyNCk7Ci0gICAgQ1BERl9QYWdlIHBhZ2U7Ci0gICAgcGFnZS5Mb2FkKHBEb2MsIHBQYWdlKTsKLSAgICBDUERGX1BhcnNlT3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMubV9iVGV4dE9ubHkgPSBUUlVFOwotICAgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gRkFMU0U7Ci0gICAgcGFnZS5QYXJzZUNvbnRlbnQoJm9wdGlvbnMpOwotICAgIENQREZfVGV4dFN0cmVhbSB0ZXh0c3RyZWFtKGJ1ZmZlciwgRkFMU0UsIE5VTEwpOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBhZ2UuR2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqZWN0ID0gcGFnZS5HZXROZXh0T2JqZWN0KHBvcyk7Ci0gICAgICAgIGlmIChwT2JqZWN0LT5tX1R5cGUgIT0gUERGUEFHRV9URVhUKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGV4dHN0cmVhbS5Qcm9jZXNzT2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmplY3QsIFRSVUUpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgIGlmIChGWFNZU19mYWJzKHJjUHJlT2JqLldpZHRoKCkgLSByY0N1ck9iai5XaWR0aCgpKSA+CisgICAgICAgIHJjQ3VyT2JqLldpZHRoKCkgLyAyKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiBidWZmZXIuR2V0V2lkZVN0cmluZygpOworICAgIGlmIChwVGV4dE9iajItPkdldEZvbnRTaXplKCkgIT0gcFRleHRPYmoxLT5HZXRGb250U2l6ZSgpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIGludCBuUHJlQ291bnQgPSBwVGV4dE9iajItPkNvdW50SXRlbXMoKTsKKyAgaW50IG5DdXJDb3VudCA9IHBUZXh0T2JqMS0+Q291bnRJdGVtcygpOworICBpZiAoblByZUNvdW50ICE9IG5DdXJDb3VudCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG5QcmVDb3VudDsgaSsrKSB7CisgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtUGVyLCBpdGVtQ3VyOworICAgIHBUZXh0T2JqMi0+R2V0SXRlbUluZm8oaSwgJml0ZW1QZXIpOworICAgIHBUZXh0T2JqMS0+R2V0SXRlbUluZm8oaSwgJml0ZW1DdXIpOworICAgIGlmIChpdGVtQ3VyLm1fQ2hhckNvZGUgIT0gaXRlbVBlci5tX0NoYXJDb2RlKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQoraW50IEdldENoYXJXaWR0aChGWF9EV09SRCBjaGFyQ29kZSwgQ1BERl9Gb250KiBwRm9udCkgeworICBpZiAoY2hhckNvZGUgPT0gLTEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgdyA9IHBGb250LT5HZXRDaGFyV2lkdGhGKGNoYXJDb2RlKTsKKyAgaWYgKHcgPT0gMCkgeworICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKKyAgICBwRm9udC0+QXBwZW5kQ2hhcihzdHIsIGNoYXJDb2RlKTsKKyAgICB3ID0gcEZvbnQtPkdldFN0cmluZ1dpZHRoKHN0ciwgMSk7CisgICAgaWYgKHcgPT0gMCkgeworICAgICAgRlhfUkVDVCBCQm94OworICAgICAgcEZvbnQtPkdldENoYXJCQm94KGNoYXJDb2RlLCBCQm94KTsKKyAgICAgIHcgPSBCQm94LnJpZ2h0IC0gQkJveC5sZWZ0OworICAgIH0KKyAgfQorICByZXR1cm4gdzsKK30KK2ludCBGUERGVGV4dF9Qcm9jZXNzSW50ZXJPYmooY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwUHJldk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqKSB7CisgIGlmIChGUERGVGV4dF9Jc1NhbWVUZXh0T2JqZWN0KHBQcmV2T2JqLCBwT2JqKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07CisgIGludCBuSXRlbSA9IHBQcmV2T2JqLT5Db3VudEl0ZW1zKCk7CisgIHBQcmV2T2JqLT5HZXRJdGVtSW5mbyhuSXRlbSAtIDEsICZpdGVtKTsKKyAgRlhfV0NIQVIgcHJlQ2hhciA9IDAsIGN1ckNoYXIgPSAwOworICBDRlhfV2lkZVN0cmluZyB3c3RyID0KKyAgICAgIHBQcmV2T2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKKyAgaWYgKHdzdHIuR2V0TGVuZ3RoKCkpIHsKKyAgICBwcmVDaGFyID0gd3N0ci5HZXRBdCgwKTsKKyAgfQorICBGWF9GTE9BVCBsYXN0X3BvcyA9IGl0ZW0ubV9PcmlnaW5YOworICBpbnQgbkxhc3RXaWR0aCA9IEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHBQcmV2T2JqLT5HZXRGb250KCkpOworICBGWF9GTE9BVCBsYXN0X3dpZHRoID0gbkxhc3RXaWR0aCAqIHBQcmV2T2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKKyAgbGFzdF93aWR0aCA9IEZYU1lTX2ZhYnMobGFzdF93aWR0aCk7CisgIHBPYmotPkdldEl0ZW1JbmZvKDAsICZpdGVtKTsKKyAgd3N0ciA9IHBPYmotPkdldEZvbnQoKS0+VW5pY29kZUZyb21DaGFyQ29kZShpdGVtLm1fQ2hhckNvZGUpOworICBpZiAod3N0ci5HZXRMZW5ndGgoKSkgeworICAgIGN1ckNoYXIgPSB3c3RyLkdldEF0KDApOworICB9CisgIGludCBuVGhpc1dpZHRoID0gR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcE9iai0+R2V0Rm9udCgpKTsKKyAgRlhfRkxPQVQgdGhpc193aWR0aCA9IG5UaGlzV2lkdGggKiBwT2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKKyAgdGhpc193aWR0aCA9IEZYU1lTX2ZhYnModGhpc193aWR0aCk7CisgIEZYX0ZMT0FUIHRocmVzaG9sZCA9CisgICAgICBsYXN0X3dpZHRoID4gdGhpc193aWR0aCA/IGxhc3Rfd2lkdGggLyA0IDogdGhpc193aWR0aCAvIDQ7CisgIENGWF9BZmZpbmVNYXRyaXggcHJldl9tYXRyaXgsIHByZXZfcmV2ZXJzZTsKKyAgcFByZXZPYmotPkdldFRleHRNYXRyaXgoJnByZXZfbWF0cml4KTsKKyAgcHJldl9yZXZlcnNlLlNldFJldmVyc2UocHJldl9tYXRyaXgpOworICBGWF9GTE9BVCB4ID0gcE9iai0+R2V0UG9zWCgpLCB5ID0gcE9iai0+R2V0UG9zWSgpOworICBwcmV2X3JldmVyc2UuVHJhbnNmb3JtKHgsIHkpOworICBpZiAoRlhTWVNfZmFicyh5KSA+IHRocmVzaG9sZCAqIDIpIHsKKyAgICByZXR1cm4gMjsKKyAgfQorICB0aHJlc2hvbGQgPSAoRlhfRkxPQVQpKG5MYXN0V2lkdGggPiBuVGhpc1dpZHRoID8gbkxhc3RXaWR0aCA6IG5UaGlzV2lkdGgpOworICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgPiA0MDAKKyAgICAgICAgICAgICAgICAgID8gKHRocmVzaG9sZCA8IDcwMCA/IHRocmVzaG9sZCAvIDQgOiB0aHJlc2hvbGQgLyA1KQorICAgICAgICAgICAgICAgICAgOiAodGhyZXNob2xkIC8gMik7CisgIHRocmVzaG9sZCAqPSBuTGFzdFdpZHRoID4gblRoaXNXaWR0aCA/IEZYU1lTX2ZhYnMocFByZXZPYmotPkdldEZvbnRTaXplKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYU1lTX2ZhYnMocE9iai0+R2V0Rm9udFNpemUoKSk7CisgIHRocmVzaG9sZCAvPSAxMDAwOworICBpZiAoRlhTWVNfZmFicyhsYXN0X3BvcyArIGxhc3Rfd2lkdGggLSB4KSA+IHRocmVzaG9sZCAmJiBjdXJDaGFyICE9IEwnICcgJiYKKyAgICAgIHByZUNoYXIgIT0gTCcgJykKKyAgICBpZiAoY3VyQ2hhciAhPSBMJyAnICYmIHByZUNoYXIgIT0gTCcgJykgeworICAgICAgaWYgKCh4IC0gbGFzdF9wb3MgLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCB8fAorICAgICAgICAgIChsYXN0X3BvcyAtIHggLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGlmICh4IDwgMCAmJiAobGFzdF9wb3MgLSB4IC0gbGFzdF93aWR0aCkgPiB0aHJlc2hvbGQpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBpZiAoKHggLSBsYXN0X3BvcyAtIGxhc3Rfd2lkdGgpID4gdGhpc193aWR0aCB8fAorICAgICAgICAgICh4IC0gbGFzdF9wb3MgLSB0aGlzX3dpZHRoKSA+IGxhc3Rfd2lkdGgpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICBpZiAobGFzdF9wb3MgKyBsYXN0X3dpZHRoID4geCArIHRoaXNfd2lkdGggJiYgY3VyQ2hhciA9PSBMJyAnKSB7CisgICAgcmV0dXJuIDM7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitGWF9CT09MIENQREZfVGV4dFN0cmVhbTo6UHJvY2Vzc09iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGaXJzdExpbmUpIHsKKyAgQ1BERl9Gb250KiBwRm9udCA9IHBPYmotPkdldEZvbnQoKTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7CisgIHBPYmotPkdldFRleHRNYXRyaXgoJm1hdHJpeCk7CisgIGludCBpdGVtX2luZGV4ID0gMDsKKyAgaWYgKG1fcExhc3RPYmopIHsKKyAgICBpbnQgcmVzdWx0ID0gRlBERlRleHRfUHJvY2Vzc0ludGVyT2JqKG1fcExhc3RPYmosIHBPYmopOworICAgIGlmIChyZXN1bHQgPT0gMikgeworICAgICAgaW50IGxlbiA9IG1fQnVmZmVyLkdldExlbmd0aCgpOworICAgICAgaWYgKGxlbiAmJiBtX2JVc2VMRiAmJiBtX0J1ZmZlci5HZXRCdWZmZXIoKVtsZW4gLSAxXSA9PSBMJy0nKSB7CisgICAgICAgIG1fQnVmZmVyLkRlbGV0ZShsZW4gLSAxLCAxKTsKKyAgICAgICAgaWYgKG1fcE9iakFycmF5KSB7CisgICAgICAgICAgbV9wT2JqQXJyYXktPlJlbW92ZUF0KChsZW4gLSAxKSAqIDIsIDIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYkZpcnN0TGluZSkgeworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIGlmIChtX2JVc2VMRikgeworICAgICAgICAgIG1fQnVmZmVyLkFwcGVuZENoYXIoTCdccicpOworICAgICAgICAgIG1fQnVmZmVyLkFwcGVuZENoYXIoTCdcbicpOworICAgICAgICAgIGlmIChtX3BPYmpBcnJheSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgbV9wT2JqQXJyYXktPkFkZChOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcignICcpOworICAgICAgICAgIGlmIChtX3BPYmpBcnJheSkgeworICAgICAgICAgICAgbV9wT2JqQXJyYXktPkFkZChOVUxMKTsKKyAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoTlVMTCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gMSkgeworICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcihMJyAnKTsKKyAgICAgIGlmIChtX3BPYmpBcnJheSkgeworICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOworICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICBtX3BMYXN0T2JqID0gcE9iajsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSAzKSB7CisgICAgICBpdGVtX2luZGV4ID0gMTsKKyAgICB9CisgIH0KKyAgbV9wTGFzdE9iaiA9IHBPYmo7CisgIGludCBuSXRlbXMgPSBwT2JqLT5Db3VudEl0ZW1zKCk7CisgIEZYX0ZMT0FUIElnbm9yZWtlcm5pbmcgPSAwOworICBmb3IgKGludCBpID0gMTsgaSA8IG5JdGVtcyAtIDE7IGkgKz0gMikgeworICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKKyAgICBwT2JqLT5HZXRJdGVtSW5mbyhpLCAmaXRlbSk7CisgICAgaWYgKGl0ZW0ubV9DaGFyQ29kZSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgIGlmIChpID09IDEpIHsKKyAgICAgICAgSWdub3Jla2VybmluZyA9IGl0ZW0ubV9PcmlnaW5YOworICAgICAgfSBlbHNlIGlmIChJZ25vcmVrZXJuaW5nID4gaXRlbS5tX09yaWdpblgpIHsKKyAgICAgICAgSWdub3Jla2VybmluZyA9IGl0ZW0ubV9PcmlnaW5YOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBJZ25vcmVrZXJuaW5nID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBGWF9GTE9BVCBzcGFjaW5nID0gMDsKKyAgZm9yICg7IGl0ZW1faW5kZXggPCBuSXRlbXM7IGl0ZW1faW5kZXgrKykgeworICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKKyAgICBwT2JqLT5HZXRJdGVtSW5mbyhpdGVtX2luZGV4LCAmaXRlbSk7CisgICAgaWYgKGl0ZW0ubV9DaGFyQ29kZSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzdHIgPSBtX0J1ZmZlci5HZXRXaWRlU3RyaW5nKCk7CisgICAgICBpZiAod3N0ci5Jc0VtcHR5KCkgfHwgd3N0ci5HZXRBdCh3c3RyLkdldExlbmd0aCgpIC0gMSkgPT0gTCcgJykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX2ggPSBwT2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZUgoKTsKKyAgICAgIHNwYWNpbmcgPSAtZm9udHNpemVfaCAqIChpdGVtLm1fT3JpZ2luWCAtIElnbm9yZWtlcm5pbmcpIC8gMTAwMDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBGWF9GTE9BVCBjaGFyU3BhY2UgPSBwT2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2U7CisgICAgaWYgKG5JdGVtcyA+IDMgJiYgIXNwYWNpbmcpIHsKKyAgICAgIGNoYXJTcGFjZSA9IDA7CisgICAgfQorICAgIGlmICgoc3BhY2luZyB8fCBjaGFyU3BhY2UpICYmIGl0ZW1faW5kZXggPiAwKSB7CisgICAgICBpbnQgbGFzdF93aWR0aCA9IDA7CisgICAgICBGWF9GTE9BVCBmb250c2l6ZV9oID0gcE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7CisgICAgICBGWF9EV09SRCBzcGFjZV9jaGFyY29kZSA9IHBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKCcgJyk7CisgICAgICBGWF9GTE9BVCB0aHJlc2hvbGQgPSAwOworICAgICAgaWYgKHNwYWNlX2NoYXJjb2RlICE9IC0xKSB7CisgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2ggKiBwRm9udC0+R2V0Q2hhcldpZHRoRihzcGFjZV9jaGFyY29kZSkgLyAxMDAwOworICAgICAgfQorICAgICAgaWYgKHRocmVzaG9sZCA+IGZvbnRzaXplX2ggLyAzKSB7CisgICAgICAgIHRocmVzaG9sZCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJlc2hvbGQgLz0gMjsKKyAgICAgIH0KKyAgICAgIGlmICh0aHJlc2hvbGQgPT0gMCkgeworICAgICAgICB0aHJlc2hvbGQgPSBmb250c2l6ZV9oOworICAgICAgICBpbnQgdGhpc193aWR0aCA9IEZYU1lTX2FicyhHZXRDaGFyV2lkdGgoaXRlbS5tX0NoYXJDb2RlLCBwRm9udCkpOworICAgICAgICB0aHJlc2hvbGQgPSB0aGlzX3dpZHRoID4gbGFzdF93aWR0aCA/IChGWF9GTE9BVCl0aGlzX3dpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWxhc3Rfd2lkdGg7CisgICAgICAgIGludCBuRGl2aWRlID0gNjsKKyAgICAgICAgaWYgKHRocmVzaG9sZCA8IDMwMCkgeworICAgICAgICAgIG5EaXZpZGUgPSAyOworICAgICAgICB9IGVsc2UgaWYgKHRocmVzaG9sZCA8IDUwMCkgeworICAgICAgICAgIG5EaXZpZGUgPSA0OworICAgICAgICB9IGVsc2UgaWYgKHRocmVzaG9sZCA8IDcwMCkgeworICAgICAgICAgIG5EaXZpZGUgPSA1OworICAgICAgICB9CisgICAgICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCAvIG5EaXZpZGU7CisgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2ggKiB0aHJlc2hvbGQgLyAxMDAwOworICAgICAgfQorICAgICAgaWYgKGNoYXJTcGFjZSA+IDAuMDAxKSB7CisgICAgICAgIHNwYWNpbmcgKz0gbWF0cml4LlRyYW5zZm9ybURpc3RhbmNlKGNoYXJTcGFjZSk7CisgICAgICB9IGVsc2UgaWYgKGNoYXJTcGFjZSA8IC0wLjAwMSkgeworICAgICAgICBzcGFjaW5nIC09IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZShGWFNZU19mYWJzKGNoYXJTcGFjZSkpOworICAgICAgfQorICAgICAgaWYgKHRocmVzaG9sZCAmJiAoc3BhY2luZyAmJiBzcGFjaW5nID49IHRocmVzaG9sZCkpIHsKKyAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcihMJyAnKTsKKyAgICAgICAgaWYgKG1fcE9iakFycmF5KSB7CisgICAgICAgICAgbV9wT2JqQXJyYXktPkFkZChOVUxMKTsKKyAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IChGWF9EV09SRCktMSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHNwYWNpbmcgPSAwOworICAgIH0KKyAgICBDRlhfV2lkZVN0cmluZyB1bmljb2RlX3N0ciA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7CisgICAgaWYgKHVuaWNvZGVfc3RyLklzRW1wdHkoKSkgeworICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcigoRlhfV0NIQVIpaXRlbS5tX0NoYXJDb2RlKTsKKyAgICAgIGlmIChtX3BPYmpBcnJheSkgeworICAgICAgICBtX3BPYmpBcnJheS0+QWRkKCh2b2lkKilwT2JqKTsKKyAgICAgICAgbV9wT2JqQXJyYXktPkFkZCgodm9pZCopKGludHB0cl90KWl0ZW1faW5kZXgpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBtX0J1ZmZlciA8PCB1bmljb2RlX3N0cjsKKyAgICAgIGlmIChtX3BPYmpBcnJheSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVuaWNvZGVfc3RyLkdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKCh2b2lkKilwT2JqKTsKKyAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKCh2b2lkKikoaW50cHRyX3QpaXRlbV9pbmRleCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQordm9pZCBfUERGX0dldFRleHRTdHJlYW1fVW5pY29kZShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZUxGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSkgeworICBDUERGX1RleHRTdHJlYW0gdGV4dHN0cmVhbShidWZmZXIsIGJVc2VMRiwgcE9iakFycmF5KTsKKyAgRlhfUE9TSVRJT04gcG9zID0gcFBhZ2UtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENQREZfUGFnZU9iamVjdCogcE9iamVjdCA9IHBQYWdlLT5HZXROZXh0T2JqZWN0KHBvcyk7CisgICAgaWYgKHBPYmplY3QgPT0gTlVMTCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChwT2JqZWN0LT5tX1R5cGUgIT0gUERGUEFHRV9URVhUKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdGV4dHN0cmVhbS5Qcm9jZXNzT2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmplY3QsIEZBTFNFKTsKKyAgfQorfQorQ0ZYX1dpZGVTdHJpbmcgUERGX0dldEZpcnN0VGV4dExpbmVfVW5pY29kZShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlKSB7CisgIENGWF9XaWRlVGV4dEJ1ZiBidWZmZXI7CisgIGJ1ZmZlci5Fc3RpbWF0ZVNpemUoMCwgMTAyNCk7CisgIENQREZfUGFnZSBwYWdlOworICBwYWdlLkxvYWQocERvYywgcFBhZ2UpOworICBDUERGX1BhcnNlT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLm1fYlRleHRPbmx5ID0gVFJVRTsKKyAgb3B0aW9ucy5tX2JTZXBhcmF0ZUZvcm0gPSBGQUxTRTsKKyAgcGFnZS5QYXJzZUNvbnRlbnQoJm9wdGlvbnMpOworICBDUERGX1RleHRTdHJlYW0gdGV4dHN0cmVhbShidWZmZXIsIEZBTFNFLCBOVUxMKTsKKyAgRlhfUE9TSVRJT04gcG9zID0gcGFnZS5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmplY3QgPSBwYWdlLkdldE5leHRPYmplY3QocG9zKTsKKyAgICBpZiAocE9iamVjdC0+bV9UeXBlICE9IFBERlBBR0VfVEVYVCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICh0ZXh0c3RyZWFtLlByb2Nlc3NPYmplY3QoKENQREZfVGV4dE9iamVjdCopcE9iamVjdCwgVFJVRSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gYnVmZmVyLkdldFdpZGVTdHJpbmcoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3RleHRfaW50LmggYi9jb3JlL3NyYy9mcGRmdGV4dC90ZXh0X2ludC5oCmluZGV4IGViNTBhMWIuLjUwYjlhYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3RleHRfaW50LmgKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvdGV4dF9pbnQuaApAQCAtMTEsMTk1ICsxMSwyMjAgQEAKIGNsYXNzIENQREZfTGlua0V4dHJhY3Q7CiBjbGFzcyBDUERGX1RleHRQYWdlRmluZDsKIGNsYXNzIENQREZfRG9jUHJvZ3Jlc3NpdmVTZWFyY2g7Ci0jZGVmaW5lIEZQREZURVhUX0NIQVJfRVJST1IJCQktMQotI2RlZmluZSBGUERGVEVYVF9DSEFSX05PUk1BTAkJMAotI2RlZmluZSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRAkJMQotI2RlZmluZSBGUERGVEVYVF9DSEFSX1VOVU5JQ09ERQkJMgotI2RlZmluZSBGUERGVEVYVF9DSEFSX0hZUEhFTgkJMwotI2RlZmluZSBGUERGVEVYVF9DSEFSX1BJRUNFCQkJNAotI2RlZmluZSBGUERGVEVYVF9NQ19QQVNTCQkJMAotI2RlZmluZSBGUERGVEVYVF9NQ19ET05FCQkJMQotI2RlZmluZSBGUERGVEVYVF9NQ19ERUxBWQkJCTIKKyNkZWZpbmUgRlBERlRFWFRfQ0hBUl9FUlJPUiAtMQorI2RlZmluZSBGUERGVEVYVF9DSEFSX05PUk1BTCAwCisjZGVmaW5lIEZQREZURVhUX0NIQVJfR0VORVJBVEVEIDEKKyNkZWZpbmUgRlBERlRFWFRfQ0hBUl9VTlVOSUNPREUgMgorI2RlZmluZSBGUERGVEVYVF9DSEFSX0hZUEhFTiAzCisjZGVmaW5lIEZQREZURVhUX0NIQVJfUElFQ0UgNAorI2RlZmluZSBGUERGVEVYVF9NQ19QQVNTIDAKKyNkZWZpbmUgRlBERlRFWFRfTUNfRE9ORSAxCisjZGVmaW5lIEZQREZURVhUX01DX0RFTEFZIDIKIHR5cGVkZWYgc3RydWN0IF9QQUdFQ0hBUl9JTkZPIHsKLSAgICBpbnQJCQkJCW1fQ2hhckNvZGU7Ci0gICAgRlhfV0NIQVIJCQltX1VuaWNvZGU7Ci0gICAgRlhfRkxPQVQJCQltX09yaWdpblg7Ci0gICAgRlhfRkxPQVQJCQltX09yaWdpblk7Ci0gICAgaW50MzJfdAkJCW1fRmxhZzsKLSAgICBDRlhfRmxvYXRSZWN0CQltX0NoYXJCb3g7Ci0gICAgQ1BERl9UZXh0T2JqZWN0KgltX3BUZXh0T2JqOwotICAgIENGWF9BZmZpbmVNYXRyaXgJbV9NYXRyaXg7Ci0gICAgaW50CQkJCQltX0luZGV4OworICBpbnQgbV9DaGFyQ29kZTsKKyAgRlhfV0NIQVIgbV9Vbmljb2RlOworICBGWF9GTE9BVCBtX09yaWdpblg7CisgIEZYX0ZMT0FUIG1fT3JpZ2luWTsKKyAgaW50MzJfdCBtX0ZsYWc7CisgIENGWF9GbG9hdFJlY3QgbV9DaGFyQm94OworICBDUERGX1RleHRPYmplY3QqIG1fcFRleHRPYmo7CisgIENGWF9BZmZpbmVNYXRyaXggbV9NYXRyaXg7CisgIGludCBtX0luZGV4OwogfSBQQUdFQ0hBUl9JTkZPOwotdHlwZWRlZglDRlhfU2VnbWVudGVkQXJyYXk8UEFHRUNIQVJfSU5GTz4gUEFHRUNIQVJfSW5mb0FycmF5OwordHlwZWRlZiBDRlhfU2VnbWVudGVkQXJyYXk8UEFHRUNIQVJfSU5GTz4gUEFHRUNIQVJfSW5mb0FycmF5OwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludAltX1N0YXJ0OwotICAgIGludCBtX25Db3VudDsKKyAgaW50IG1fU3RhcnQ7CisgIGludCBtX25Db3VudDsKIH0gRlBERl9TRUdNRU5UOwogdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxGUERGX1NFR01FTlQ+IFNFR01FTlRfQXJyYXk7CiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgQ1BERl9UZXh0T2JqZWN0KgltX3BUZXh0T2JqOwotICAgIENGWF9BZmZpbmVNYXRyaXgJbV9mb3JtTWF0cml4OworICBDUERGX1RleHRPYmplY3QqIG1fcFRleHRPYmo7CisgIENGWF9BZmZpbmVNYXRyaXggbV9mb3JtTWF0cml4OwogfSBQREZURVhUX09iajsKIHR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8UERGVEVYVF9PYmo+IExJTkVPQko7Ci1jbGFzcyBDUERGX1RleHRQYWdlOiBwdWJsaWMgSVBERl9UZXh0UGFnZQotewotcHVibGljOgotICAgIENQREZfVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgaW50IGZsYWdzID0gMCk7Ci0gICAgQ1BERl9UZXh0UGFnZShjb25zdCBDUERGX1BhZ2VPYmplY3RzKiBwUGFnZSwgaW50IGZsYWdzID0gMCk7Ci0gICAgQ1BERl9UZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDUERGVGV4dF9QYXJzZU9wdGlvbnMgUGFyc2VyT3B0aW9ucyk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlQYXJzZVRleHRQYWdlKCk7Ci0gICAgdmlydHVhbCB2b2lkCQkJCQlOb3JtYWxpemVPYmplY3RzKEZYX0JPT0wgYk5vcm1hbGl6ZSk7Ci0gICAgdmlydHVhbAlGWF9CT09MCQkJCQlJc1BhcnNlcmVkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0lzUGFyc2VyZWQ7Ci0gICAgfQotICAgIHZpcnR1YWwgfkNQREZfVGV4dFBhZ2UoKSB7fTsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIGludCBDaGFySW5kZXhGcm9tVGV4dEluZGV4KGludCBUZXh0SW5kZXgpY29uc3QgOwotICAgIHZpcnR1YWwgaW50IFRleHRJbmRleEZyb21DaGFySW5kZXgoaW50IENoYXJJbmRleCljb25zdDsKLSAgICB2aXJ0dWFsIGludAkJCQkJCUNvdW50Q2hhcnMoKSBjb25zdDsKLSAgICB2aXJ0dWFsCXZvaWQJCQkJCUdldENoYXJJbmZvKGludCBpbmRleCwgRlBERl9DSEFSX0lORk8gJiBpbmZvKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCUdldFJlY3RBcnJheShpbnQgc3RhcnQsIGludCBuQ291bnQsIENGWF9SZWN0QXJyYXkmIHJlY3RBcnJheSkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQJCQkJCQlHZXRJbmRleEF0UG9zKENQREZfUG9pbnQgcG9pbnQsIEZYX0ZMT0FUIHhUb3JlbGFuY2UsIEZYX0ZMT0FUIHlUb3JlbGFuY2UpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50CQkJCQkJR2V0SW5kZXhBdFBvcyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB4VG9yZWxhbmNlLAotICAgICAgICAgICAgRlhfRkxPQVQgeVRvcmVsYW5jZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCUdldFRleHRCeVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkCQkJCQlHZXRSZWN0c0FycmF5QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsIENGWF9SZWN0QXJyYXkmIHJlc1JlY3RBcnJheSkgY29uc3Q7Ci0gICAgdmlydHVhbAlDRlhfV2lkZVN0cmluZwkJCUdldFBhZ2VUZXh0KGludCBzdGFydCA9IDAsIGludCBuQ291bnQgPSAtMSkgY29uc3Q7CitjbGFzcyBDUERGX1RleHRQYWdlIDogcHVibGljIElQREZfVGV4dFBhZ2UgeworIHB1YmxpYzoKKyAgQ1BERl9UZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBpbnQgZmxhZ3MgPSAwKTsKKyAgQ1BERl9UZXh0UGFnZShjb25zdCBDUERGX1BhZ2VPYmplY3RzKiBwUGFnZSwgaW50IGZsYWdzID0gMCk7CisgIENQREZfVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERlRleHRfUGFyc2VPcHRpb25zIFBhcnNlck9wdGlvbnMpOworICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VUZXh0UGFnZSgpOworICB2aXJ0dWFsIHZvaWQgTm9ybWFsaXplT2JqZWN0cyhGWF9CT09MIGJOb3JtYWxpemUpOworICB2aXJ0dWFsIEZYX0JPT0wgSXNQYXJzZXJlZCgpIGNvbnN0IHsgcmV0dXJuIG1fSXNQYXJzZXJlZDsgfQorICB2aXJ0dWFsIH5DUERGX1RleHRQYWdlKCl7fTsKIAotICAgIHZpcnR1YWwgaW50CQkJCQkJQ291bnRSZWN0cyhpbnQgc3RhcnQsIGludCBuQ291bnQpOwotICAgIHZpcnR1YWwJdm9pZAkJCQkJR2V0UmVjdChpbnQgcmVjdEluZGV4LCBGWF9GTE9BVCYgbGVmdCwgRlhfRkxPQVQmIHRvcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEZYX0ZMT0FUJiByaWdodCwgRlhfRkxPQVQgJmJvdHRvbSkgY29uc3Q7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LCBpbnQmIFJvdGF0ZSk7Ci0gICAgdmlydHVhbAlpbnQJCQkJCQlDb3VudEJvdW5kZWRTZWdtZW50cyhGWF9GTE9BVCBsZWZ0LCBGWF9GTE9BVCB0b3AsCi0gICAgICAgICAgICBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBGWF9CT09MIGJDb250YWlucyA9IEZBTFNFKTsKLSAgICB2aXJ0dWFsCXZvaWQJCQkJCUdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQJCQkJCQlHZXRXb3JkQnJlYWsoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdDsKLXB1YmxpYzoKLSAgICBjb25zdAlQQUdFQ0hBUl9JbmZvQXJyYXkqCQlHZXRDaGFyTGlzdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gJm1fY2hhckxpc3Q7Ci0gICAgfQotICAgIHN0YXRpYwlGWF9CT09MCQkJCQlJc1JlY3RJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDEsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QyKTsKLSAgICBzdGF0aWMJRlhfQk9PTAkJCQkJSXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSk7Ci1wcml2YXRlOgotICAgIEZYX0JPT0wJCQkJCQkJSXNIeXBoZW4oRlhfV0NIQVIgY3VyQ2hhcik7Ci0gICAgYm9vbAkJCQkJCQlJc0NvbnRyb2xDaGFyKGNvbnN0IFBBR0VDSEFSX0lORk8mIGNoYXJJbmZvKTsKLSAgICBGWF9CT09MCQkJCQkJCUdldEJhc2VsaW5lUm90YXRlKGludCBzdGFydCwgaW50IGVuZCwgaW50JiBSb3RhdGUpOwotICAgIHZvaWQJCQkJCQkJUHJvY2Vzc09iamVjdCgpOwotICAgIHZvaWQJCQkJCQkJUHJvY2Vzc0Zvcm1PYmplY3QoQ1BERl9Gb3JtT2JqZWN0KglwRm9ybU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgZm9ybU1hdHJpeCk7Ci0gICAgdm9pZAkJCQkJCQlQcm9jZXNzVGV4dE9iamVjdChQREZURVhUX09iaiBwT2JqKTsKLSAgICB2b2lkCQkJCQkJCVByb2Nlc3NUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCoJcFRleHRPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgsIEZYX1BPU0lUSU9OIE9ialBvcyk7Ci0gICAgaW50CQkJCQkJCQlQcm9jZXNzSW5zZXJ0T2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgZm9ybU1hdHJpeCk7Ci0gICAgRlhfQk9PTAkJCQkJCQlHZW5lcmF0ZUNoYXJJbmZvKEZYX1dDSEFSIHVuaWNvZGUsIFBBR0VDSEFSX0lORk8mIGluZm8pOwotICAgIEZYX0JPT0wJCQkJCQkJSXNTYW1lQXNQcmVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmosIEZYX1BPU0lUSU9OIE9ialBvcyk7Ci0gICAgRlhfQk9PTAkJCQkJCQlJc1NhbWVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmoxLCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMik7Ci0gICAgaW50CQkJCQkJCQlHZXRDaGFyV2lkdGgoRlhfRFdPUkQgY2hhckNvZGUsIENQREZfRm9udCogcEZvbnQpIGNvbnN0OwotICAgIHZvaWQJCQkJCQkJQ2xvc2VUZW1wTGluZSgpOwotICAgIHZvaWQJCQkJCQkJT25QaWVjZShJRlhfQmlkaUNoYXIqIHBCaWRpLCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKLSAgICBpbnQzMl90CVByZU1hcmtlZENvbnRlbnQoUERGVEVYVF9PYmogcE9iaik7Ci0gICAgdm9pZAkJUHJvY2Vzc01hcmtlZENvbnRlbnQoUERGVEVYVF9PYmogcE9iaik7Ci0gICAgdm9pZAkJQ2hlY2tNYXJrZWRDb250ZW50T2JqZWN0KGludDMyX3QmIHN0YXJ0LCBpbnQzMl90JiBuQ291bnQpIGNvbnN0OwotICAgIHZvaWQJCUZpbmRQcmV2aW91c1RleHRPYmplY3Qodm9pZCk7Ci0gICAgdm9pZAkJQWRkQ2hhckluZm9CeUxSRGlyZWN0aW9uKENGWF9XaWRlU3RyaW5nJiBzdHIsIGludCBpKTsKLSAgICB2b2lkCQlBZGRDaGFySW5mb0J5UkxEaXJlY3Rpb24oQ0ZYX1dpZGVTdHJpbmcmIHN0ciwgaW50IGkpOwotICAgIGludDMyX3QJR2V0VGV4dE9iamVjdFdyaXRpbmdNb2RlKGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmopOwotICAgIGludDMyX3QJRmluZFRleHRsaW5lRmxvd0RpcmVjdGlvbigpOwotcHJvdGVjdGVkOgotICAgIENQREZUZXh0X1BhcnNlT3B0aW9ucwkJCW1fUGFyc2VPcHRpb25zOwotICAgIENGWF9Xb3JkQXJyYXkJCQkJCW1fQ2hhckluZGV4OwotICAgIGNvbnN0IENQREZfUGFnZU9iamVjdHMqCQkJbV9wUGFnZTsKLSAgICBQQUdFQ0hBUl9JbmZvQXJyYXkJCQkJbV9jaGFyTGlzdDsKLSAgICBDRlhfV2lkZVRleHRCdWYJCQkJCW1fVGV4dEJ1ZjsKLSAgICBQQUdFQ0hBUl9JbmZvQXJyYXkJCQkJbV9UZW1wQ2hhckxpc3Q7Ci0gICAgQ0ZYX1dpZGVUZXh0QnVmCQkJCQltX1RlbXBUZXh0QnVmOwotICAgIGludAkJCQkJCQkJbV9wYXJzZXJmbGFnOwotICAgIENQREZfVGV4dE9iamVjdCoJCQkJbV9wUHJlVGV4dE9iajsKLSAgICBDRlhfQWZmaW5lTWF0cml4CQkJCW1fcGVyTWF0cml4OwotICAgIEZYX0JPT0wJCQkJCQkJbV9Jc1BhcnNlcmVkOwotICAgIENGWF9BZmZpbmVNYXRyaXgJCQkJbV9EaXNwbGF5TWF0cml4OworIHB1YmxpYzoKKyAgdmlydHVhbCBpbnQgQ2hhckluZGV4RnJvbVRleHRJbmRleChpbnQgVGV4dEluZGV4KSBjb25zdDsKKyAgdmlydHVhbCBpbnQgVGV4dEluZGV4RnJvbUNoYXJJbmRleChpbnQgQ2hhckluZGV4KSBjb25zdDsKKyAgdmlydHVhbCBpbnQgQ291bnRDaGFycygpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgR2V0Q2hhckluZm8oaW50IGluZGV4LCBGUERGX0NIQVJfSU5GTyYgaW5mbykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBHZXRSZWN0QXJyYXkoaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RBcnJheSYgcmVjdEFycmF5KSBjb25zdDsKKyAgdmlydHVhbCBpbnQgR2V0SW5kZXhBdFBvcyhDUERGX1BvaW50IHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhUb3JlbGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeVRvcmVsYW5jZSkgY29uc3Q7CisgIHZpcnR1YWwgaW50IEdldEluZGV4QXRQb3MoRlhfRkxPQVQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhUb3JlbGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeVRvcmVsYW5jZSkgY29uc3Q7CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dEJ5UmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIEdldFJlY3RzQXJyYXlCeVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RBcnJheSYgcmVzUmVjdEFycmF5KSBjb25zdDsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRQYWdlVGV4dChpbnQgc3RhcnQgPSAwLCBpbnQgbkNvdW50ID0gLTEpIGNvbnN0OwogCi0gICAgU0VHTUVOVF9BcnJheQkJCQkJbV9TZWdtZW50OwotICAgIENGWF9SZWN0QXJyYXkJCQkJCW1fU2VsUmVjdHM7Ci0gICAgTElORU9CSgkJCQkJCQltX0xpbmVPYmo7Ci0gICAgaW50MzJfdAkJCQkJCQltX1RleHRsaW5lRGlyOwotICAgIENGWF9GbG9hdFJlY3QJCQkJCW1fQ3VybGluZVJlY3Q7CisgIHZpcnR1YWwgaW50IENvdW50UmVjdHMoaW50IHN0YXJ0LCBpbnQgbkNvdW50KTsKKyAgdmlydHVhbCB2b2lkIEdldFJlY3QoaW50IHJlY3RJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGJvdHRvbSkgY29uc3Q7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LCBpbnQmIFJvdGF0ZSk7CisgIHZpcnR1YWwgaW50IENvdW50Qm91bmRlZFNlZ21lbnRzKEZYX0ZMT0FUIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29udGFpbnMgPSBGQUxTRSk7CisgIHZpcnR1YWwgdm9pZCBHZXRCb3VuZGVkU2VnbWVudChpbnQgaW5kZXgsIGludCYgc3RhcnQsIGludCYgY291bnQpIGNvbnN0OworICB2aXJ0dWFsIGludCBHZXRXb3JkQnJlYWsoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdDsKKworIHB1YmxpYzoKKyAgY29uc3QgUEFHRUNIQVJfSW5mb0FycmF5KiBHZXRDaGFyTGlzdCgpIGNvbnN0IHsgcmV0dXJuICZtX2NoYXJMaXN0OyB9CisgIHN0YXRpYyBGWF9CT09MIElzUmVjdEludGVyc2VjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QyKTsKKyAgc3RhdGljIEZYX0JPT0wgSXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSk7CisKKyBwcml2YXRlOgorICBGWF9CT09MIElzSHlwaGVuKEZYX1dDSEFSIGN1ckNoYXIpOworICBib29sIElzQ29udHJvbENoYXIoY29uc3QgUEFHRUNIQVJfSU5GTyYgY2hhckluZm8pOworICBGWF9CT09MIEdldEJhc2VsaW5lUm90YXRlKGludCBzdGFydCwgaW50IGVuZCwgaW50JiBSb3RhdGUpOworICB2b2lkIFByb2Nlc3NPYmplY3QoKTsKKyAgdm9pZCBQcm9jZXNzRm9ybU9iamVjdChDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgpOworICB2b2lkIFByb2Nlc3NUZXh0T2JqZWN0KFBERlRFWFRfT2JqIHBPYmopOworICB2b2lkIFByb2Nlc3NUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgZm9ybU1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBPYmpQb3MpOworICBpbnQgUHJvY2Vzc0luc2VydE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgpOworICBGWF9CT09MIEdlbmVyYXRlQ2hhckluZm8oRlhfV0NIQVIgdW5pY29kZSwgUEFHRUNIQVJfSU5GTyYgaW5mbyk7CisgIEZYX0JPT0wgSXNTYW1lQXNQcmVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmosIEZYX1BPU0lUSU9OIE9ialBvcyk7CisgIEZYX0JPT0wgSXNTYW1lVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmoyKTsKKyAgaW50IEdldENoYXJXaWR0aChGWF9EV09SRCBjaGFyQ29kZSwgQ1BERl9Gb250KiBwRm9udCkgY29uc3Q7CisgIHZvaWQgQ2xvc2VUZW1wTGluZSgpOworICB2b2lkIE9uUGllY2UoSUZYX0JpZGlDaGFyKiBwQmlkaSwgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisgIGludDMyX3QgUHJlTWFya2VkQ29udGVudChQREZURVhUX09iaiBwT2JqKTsKKyAgdm9pZCBQcm9jZXNzTWFya2VkQ29udGVudChQREZURVhUX09iaiBwT2JqKTsKKyAgdm9pZCBDaGVja01hcmtlZENvbnRlbnRPYmplY3QoaW50MzJfdCYgc3RhcnQsIGludDMyX3QmIG5Db3VudCkgY29uc3Q7CisgIHZvaWQgRmluZFByZXZpb3VzVGV4dE9iamVjdCh2b2lkKTsKKyAgdm9pZCBBZGRDaGFySW5mb0J5TFJEaXJlY3Rpb24oQ0ZYX1dpZGVTdHJpbmcmIHN0ciwgaW50IGkpOworICB2b2lkIEFkZENoYXJJbmZvQnlSTERpcmVjdGlvbihDRlhfV2lkZVN0cmluZyYgc3RyLCBpbnQgaSk7CisgIGludDMyX3QgR2V0VGV4dE9iamVjdFdyaXRpbmdNb2RlKGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmopOworICBpbnQzMl90IEZpbmRUZXh0bGluZUZsb3dEaXJlY3Rpb24oKTsKKworIHByb3RlY3RlZDoKKyAgQ1BERlRleHRfUGFyc2VPcHRpb25zIG1fUGFyc2VPcHRpb25zOworICBDRlhfV29yZEFycmF5IG1fQ2hhckluZGV4OworICBjb25zdCBDUERGX1BhZ2VPYmplY3RzKiBtX3BQYWdlOworICBQQUdFQ0hBUl9JbmZvQXJyYXkgbV9jaGFyTGlzdDsKKyAgQ0ZYX1dpZGVUZXh0QnVmIG1fVGV4dEJ1ZjsKKyAgUEFHRUNIQVJfSW5mb0FycmF5IG1fVGVtcENoYXJMaXN0OworICBDRlhfV2lkZVRleHRCdWYgbV9UZW1wVGV4dEJ1ZjsKKyAgaW50IG1fcGFyc2VyZmxhZzsKKyAgQ1BERl9UZXh0T2JqZWN0KiBtX3BQcmVUZXh0T2JqOworICBDRlhfQWZmaW5lTWF0cml4IG1fcGVyTWF0cml4OworICBGWF9CT09MIG1fSXNQYXJzZXJlZDsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtX0Rpc3BsYXlNYXRyaXg7CisKKyAgU0VHTUVOVF9BcnJheSBtX1NlZ21lbnQ7CisgIENGWF9SZWN0QXJyYXkgbV9TZWxSZWN0czsKKyAgTElORU9CSiBtX0xpbmVPYmo7CisgIGludDMyX3QgbV9UZXh0bGluZURpcjsKKyAgQ0ZYX0Zsb2F0UmVjdCBtX0N1cmxpbmVSZWN0OwogfTsKLWNsYXNzIENQREZfVGV4dFBhZ2VGaW5kOiBwdWJsaWMgSVBERl9UZXh0UGFnZUZpbmQKLXsKLXB1YmxpYzoKLSAgICBDUERGX1RleHRQYWdlRmluZChjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpOwotICAgIHZpcnR1YWwJCQkJCQkJfkNQREZfVGV4dFBhZ2VGaW5kKCkge307Ci1wdWJsaWM6Ci0gICAgdmlydHVhbAlGWF9CT09MCQkJCQlGaW5kRmlyc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0LCBpbnQgZmxhZ3MsIGludCBzdGFydFBvcyA9IDApOwotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQkJRmluZE5leHQoKTsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUZpbmRQcmV2KCk7CitjbGFzcyBDUERGX1RleHRQYWdlRmluZCA6IHB1YmxpYyBJUERGX1RleHRQYWdlRmluZCB7CisgcHVibGljOgorICBDUERGX1RleHRQYWdlRmluZChjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpOworICB2aXJ0dWFsIH5DUERGX1RleHRQYWdlRmluZCgpe307CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCUdldFJlY3RBcnJheShDRlhfUmVjdEFycmF5JiByZWN0cykgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQJCQkJCQlHZXRDdXJPcmRlcigpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50CQkJCQkJR2V0TWF0Y2hlZENvdW50KCljb25zdDsKLXByb3RlY3RlZDoKLSAgICB2b2lkCQkJCQkJCUV4dHJhY3RGaW5kV2hhdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQpOwotICAgIEZYX0JPT0wJCQkJCQkJSXNNYXRjaFdob2xlV29yZChjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NQYWdlVGV4dCwgaW50IHN0YXJ0UG9zLCBpbnQgZW5kUG9zKTsKLSAgICBGWF9CT09MCQkJCQkJCUV4dHJhY3RTdWJTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHJTdHJpbmcsIGNvbnN0IEZYX1dDSEFSKiBscHN6RnVsbFN0cmluZywKLSAgICAgICAgICAgIGludCBpU3ViU3RyaW5nLCBGWF9XQ0hBUiBjaFNlcCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcJCQkJCU1ha2VSZXZlcnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwotICAgIGludAkJCQkJCQkJUmV2ZXJzZUZpbmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1dvcmQsIGludCBuU3RhcnRQb3MsIGludCYgV29yZExlbmd0aCk7Ci0gICAgaW50CQkJCQkJCQlHZXRDaGFySW5kZXgoaW50IGluZGV4KSBjb25zdDsKLXByaXZhdGU6Ci0gICAgQ0ZYX1dvcmRBcnJheQkJCQkJbV9DaGFySW5kZXg7Ci0gICAgY29uc3QgSVBERl9UZXh0UGFnZSoJCQltX3BUZXh0UGFnZTsKLSAgICBDRlhfV2lkZVN0cmluZwkJCQkJbV9zdHJUZXh0OwotICAgIENGWF9XaWRlU3RyaW5nCQkJCQltX2ZpbmRXaGF0OwotICAgIGludAkJCQkJCQkJbV9mbGFnczsKLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5CQkJCW1fY3NGaW5kV2hhdEFycmF5OwotICAgIGludAkJCQkJCQkJbV9maW5kTmV4dFN0YXJ0OwotICAgIGludAkJCQkJCQkJbV9maW5kUHJlU3RhcnQ7Ci0gICAgRlhfQk9PTAkJCQkJCQltX2JNYXRjaENhc2U7Ci0gICAgRlhfQk9PTAkJCQkJCQltX2JNYXRjaFdob2xlV29yZDsKLSAgICBpbnQJCQkJCQkJCW1fcmVzU3RhcnQ7Ci0gICAgaW50CQkJCQkJCQltX3Jlc0VuZDsKLSAgICBDRlhfUmVjdEFycmF5CQkJCQltX3Jlc0FycmF5OwotICAgIEZYX0JPT0wJCQkJCQkJbV9Jc0ZpbmQ7CisgcHVibGljOgorICB2aXJ0dWFsIEZYX0JPT0wgRmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0UG9zID0gMCk7CisgIHZpcnR1YWwgRlhfQk9PTCBGaW5kTmV4dCgpOworICB2aXJ0dWFsIEZYX0JPT0wgRmluZFByZXYoKTsKKworICB2aXJ0dWFsIHZvaWQgR2V0UmVjdEFycmF5KENGWF9SZWN0QXJyYXkmIHJlY3RzKSBjb25zdDsKKyAgdmlydHVhbCBpbnQgR2V0Q3VyT3JkZXIoKSBjb25zdDsKKyAgdmlydHVhbCBpbnQgR2V0TWF0Y2hlZENvdW50KCkgY29uc3Q7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgRXh0cmFjdEZpbmRXaGF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCk7CisgIEZYX0JPT0wgSXNNYXRjaFdob2xlV29yZChjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NQYWdlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRQb3MpOworICBGWF9CT09MIEV4dHJhY3RTdWJTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHJTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBzekZ1bGxTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN1YlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIGNoU2VwKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgTWFrZVJldmVyc2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisgIGludCBSZXZlcnNlRmluZChjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NQYWdlVGV4dCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1dvcmQsCisgICAgICAgICAgICAgICAgICBpbnQgblN0YXJ0UG9zLAorICAgICAgICAgICAgICAgICAgaW50JiBXb3JkTGVuZ3RoKTsKKyAgaW50IEdldENoYXJJbmRleChpbnQgaW5kZXgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgQ0ZYX1dvcmRBcnJheSBtX0NoYXJJbmRleDsKKyAgY29uc3QgSVBERl9UZXh0UGFnZSogbV9wVGV4dFBhZ2U7CisgIENGWF9XaWRlU3RyaW5nIG1fc3RyVGV4dDsKKyAgQ0ZYX1dpZGVTdHJpbmcgbV9maW5kV2hhdDsKKyAgaW50IG1fZmxhZ3M7CisgIENGWF9XaWRlU3RyaW5nQXJyYXkgbV9jc0ZpbmRXaGF0QXJyYXk7CisgIGludCBtX2ZpbmROZXh0U3RhcnQ7CisgIGludCBtX2ZpbmRQcmVTdGFydDsKKyAgRlhfQk9PTCBtX2JNYXRjaENhc2U7CisgIEZYX0JPT0wgbV9iTWF0Y2hXaG9sZVdvcmQ7CisgIGludCBtX3Jlc1N0YXJ0OworICBpbnQgbV9yZXNFbmQ7CisgIENGWF9SZWN0QXJyYXkgbV9yZXNBcnJheTsKKyAgRlhfQk9PTCBtX0lzRmluZDsKIH07Ci1jbGFzcyBDUERGX0xpbmtFeHQKLXsKLXB1YmxpYzoKLSAgICBDUERGX0xpbmtFeHQoKSB7fTsKLSAgICBpbnQJCQkJCQkJCW1fU3RhcnQ7Ci0gICAgaW50CQkJCQkJCQltX0NvdW50OwotICAgIENGWF9XaWRlU3RyaW5nCQkJCQltX3N0clVybDsKLSAgICB2aXJ0dWFsCQkJCQkJCX5DUERGX0xpbmtFeHQoKSB7fTsKK2NsYXNzIENQREZfTGlua0V4dCB7CisgcHVibGljOgorICBDUERGX0xpbmtFeHQoKXt9OworICBpbnQgbV9TdGFydDsKKyAgaW50IG1fQ291bnQ7CisgIENGWF9XaWRlU3RyaW5nIG1fc3RyVXJsOworICB2aXJ0dWFsIH5DUERGX0xpbmtFeHQoKXt9OwogfTsKIHR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9MaW5rRXh0Kj4gTElOS19JbmZvQXJyYXk7Ci1jbGFzcyBDUERGX0xpbmtFeHRyYWN0OiBwdWJsaWMgSVBERl9MaW5rRXh0cmFjdAotewotcHVibGljOgotICAgIENQREZfTGlua0V4dHJhY3QoKTsKLSAgICB2aXJ0dWFsCQkJCQkJCX5DUERGX0xpbmtFeHRyYWN0KCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKTsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUlzRXh0cmFjdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Jc1BhcnNlcmQ7Ci0gICAgfQotcHVibGljOgotICAgIHZpcnR1YWwgaW50CQkJCQkJQ291bnRMaW5rcygpIGNvbnN0OwotICAgIHZpcnR1YWwJQ0ZYX1dpZGVTdHJpbmcJCQlHZXRVUkwoaW50IGluZGV4KSBjb25zdDsKLSAgICB2aXJ0dWFsCXZvaWQJCQkJCUdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3Q7Ci0gICAgdmlydHVhbAl2b2lkCQkJCQlHZXRSZWN0cyhpbnQgaW5kZXgsIENGWF9SZWN0QXJyYXkmIHJlY3RzKWNvbnN0OwotcHJvdGVjdGVkOgotICAgIHZvaWQJCQkJCQkJcGFyc2VyTGluaygpOwotICAgIHZvaWQJCQkJCQkJRGVsZXRlTGlua0xpc3QoKTsKLSAgICBGWF9CT09MCQkJCQkJCUNoZWNrV2ViTGluayhDRlhfV2lkZVN0cmluZyYgc3RyQmVDaGVjayk7Ci0gICAgRlhfQk9PTAkJCQkJCQlDaGVja01haWxMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHIpOwotICAgIEZYX0JPT0wJCQkJCQkJQXBwZW5kVG9MaW5rTGlzdChpbnQgc3RhcnQsIGludCBjb3VudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clVybCk7Ci1wcml2YXRlOgotICAgIExJTktfSW5mb0FycmF5CQkJCQltX0xpbmtMaXN0OwotICAgIGNvbnN0IENQREZfVGV4dFBhZ2UqCQkJbV9wVGV4dFBhZ2U7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcJCQkJCW1fc3RyUGFnZVRleHQ7Ci0gICAgRlhfQk9PTAkJCQkJCQltX0lzUGFyc2VyZDsKK2NsYXNzIENQREZfTGlua0V4dHJhY3QgOiBwdWJsaWMgSVBERl9MaW5rRXh0cmFjdCB7CisgcHVibGljOgorICBDUERGX0xpbmtFeHRyYWN0KCk7CisgIHZpcnR1YWwgfkNQREZfTGlua0V4dHJhY3QoKTsKKyAgdmlydHVhbCBGWF9CT09MIEV4dHJhY3RMaW5rcyhjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpOworICB2aXJ0dWFsIEZYX0JPT0wgSXNFeHRyYWN0KCkgY29uc3QgeyByZXR1cm4gbV9Jc1BhcnNlcmQ7IH0KKworIHB1YmxpYzoKKyAgdmlydHVhbCBpbnQgQ291bnRMaW5rcygpIGNvbnN0OworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldFVSTChpbnQgaW5kZXgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgR2V0Qm91bmRlZFNlZ21lbnQoaW50IGluZGV4LCBpbnQmIHN0YXJ0LCBpbnQmIGNvdW50KSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIEdldFJlY3RzKGludCBpbmRleCwgQ0ZYX1JlY3RBcnJheSYgcmVjdHMpIGNvbnN0OworCisgcHJvdGVjdGVkOgorICB2b2lkIHBhcnNlckxpbmsoKTsKKyAgdm9pZCBEZWxldGVMaW5rTGlzdCgpOworICBGWF9CT09MIENoZWNrV2ViTGluayhDRlhfV2lkZVN0cmluZyYgc3RyQmVDaGVjayk7CisgIEZYX0JPT0wgQ2hlY2tNYWlsTGluayhDRlhfV2lkZVN0cmluZyYgc3RyKTsKKyAgRlhfQk9PTCBBcHBlbmRUb0xpbmtMaXN0KGludCBzdGFydCwgaW50IGNvdW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVXJsKTsKKworIHByaXZhdGU6CisgIExJTktfSW5mb0FycmF5IG1fTGlua0xpc3Q7CisgIGNvbnN0IENQREZfVGV4dFBhZ2UqIG1fcFRleHRQYWdlOworICBDRlhfV2lkZVN0cmluZyBtX3N0clBhZ2VUZXh0OworICBGWF9CT09MIG1fSXNQYXJzZXJkOwogfTsKIEZYX1NUUlNJWkUgRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKEZYX1dDSEFSIHdjaCwgRlhfV0NIQVIqIHBEc3QpOwogdm9pZCBOb3JtYWxpemVTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmdGV4dC90eHRwcm9jLmggYi9jb3JlL3NyYy9mcGRmdGV4dC90eHRwcm9jLmgKaW5kZXggMjc1YWFiZC4uMjIwODhmMiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZnRleHQvdHh0cHJvYy5oCisrKyBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L3R4dHByb2MuaApAQCAtNyw2NiArNyw3NyBAQAogI2lmbmRlZiBDT1JFX1NSQ19GUERGVEVYVF9UWFRQUk9DX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZQREZURVhUX1RYVFBST0NfSF8KIAotY2xhc3MgQ1RleHRDb2x1bW4KLXsKLXB1YmxpYzoKLSAgICBGWF9GTE9BVAltX0F2Z1BvczsKLSAgICBpbnQJCW1fQ291bnQ7Ci0gICAgaW50CQltX1RleHRQb3M7CitjbGFzcyBDVGV4dENvbHVtbiB7CisgcHVibGljOgorICBGWF9GTE9BVCBtX0F2Z1BvczsKKyAgaW50IG1fQ291bnQ7CisgIGludCBtX1RleHRQb3M7CiB9OwotY2xhc3MgQ1RleHRCb3gKLXsKLXB1YmxpYzoKLSAgICBDRlhfV2lkZVN0cmluZwltX1RleHQ7Ci0gICAgRlhfRkxPQVQJbV9MZWZ0OwotICAgIEZYX0ZMT0FUCW1fUmlnaHQ7Ci0gICAgRlhfRkxPQVQJbV9TcGFjZVdpZHRoOwotICAgIEZYX0ZMT0FUCW1fVG9wOwotICAgIEZYX0ZMT0FUCW1fQm90dG9tOwotICAgIEZYX0ZMT0FUCW1fRm9udFNpemVWOwotICAgIENUZXh0Q29sdW1uKiBtX3BDb2x1bW47CitjbGFzcyBDVGV4dEJveCB7CisgcHVibGljOgorICBDRlhfV2lkZVN0cmluZyBtX1RleHQ7CisgIEZYX0ZMT0FUIG1fTGVmdDsKKyAgRlhfRkxPQVQgbV9SaWdodDsKKyAgRlhfRkxPQVQgbV9TcGFjZVdpZHRoOworICBGWF9GTE9BVCBtX1RvcDsKKyAgRlhfRkxPQVQgbV9Cb3R0b207CisgIEZYX0ZMT0FUIG1fRm9udFNpemVWOworICBDVGV4dENvbHVtbiogbV9wQ29sdW1uOwogfTsKLWNsYXNzIENUZXh0QmFzZUxpbmUKLXsKLXB1YmxpYzoKLSAgICBDVGV4dEJhc2VMaW5lKCk7Ci0gICAgfkNUZXh0QmFzZUxpbmUoKTsKLSAgICB2b2lkCUluc2VydFRleHRCb3goRlhfRkxPQVQgbGVmdHgsIEZYX0ZMT0FUIHJpZ2h0eCwgRlhfRkxPQVQgdG9weSwgRlhfRkxPQVQgYm90dG9teSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3BhY2V3LCBGWF9GTE9BVCBmb250c2l6ZV92LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKLSAgICBGWF9CT09MCUdldFdpZHRoKEZYX0ZMT0FUJiBsZWZ0eCwgRlhfRkxPQVQmIHJpZ2h0eCk7Ci0gICAgRlhfQk9PTAlDYW5NZXJnZShDVGV4dEJhc2VMaW5lKiBwT3RoZXIpOwotICAgIHZvaWQJTWVyZ2UoQ1RleHRCYXNlTGluZSogcE90aGVyKTsKLSAgICB2b2lkCU1lcmdlQm94ZXMoKTsKLSAgICB2b2lkCUNvdW50Q2hhcnMoaW50JiBjb3VudCwgRlhfRkxPQVQmIHdpZHRoLCBpbnQmIG1pbmNoYXJzKTsKLSAgICB2b2lkCVdyaXRlT3V0cHV0KENGWF9XaWRlU3RyaW5nJiBzdHIsIEZYX0ZMT0FUIGxlZnR4LCBGWF9GTE9BVCB3aWR0aCwgaW50IGlXaWR0aCk7Ci0gICAgRlhfRkxPQVQJbV9CYXNlTGluZTsKLSAgICBGWF9GTE9BVAltX1RvcDsKLSAgICBGWF9GTE9BVAltX0JvdHRvbTsKLSAgICBGWF9GTE9BVAltX01heEZvbnRTaXplVjsKLSAgICBDRlhfUHRyQXJyYXkJCW1fVGV4dExpc3Q7CitjbGFzcyBDVGV4dEJhc2VMaW5lIHsKKyBwdWJsaWM6CisgIENUZXh0QmFzZUxpbmUoKTsKKyAgfkNUZXh0QmFzZUxpbmUoKTsKKyAgdm9pZCBJbnNlcnRUZXh0Qm94KEZYX0ZMT0FUIGxlZnR4LAorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHR4LAorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9weSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbXksCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzcGFjZXcsCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250c2l6ZV92LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisgIEZYX0JPT0wgR2V0V2lkdGgoRlhfRkxPQVQmIGxlZnR4LCBGWF9GTE9BVCYgcmlnaHR4KTsKKyAgRlhfQk9PTCBDYW5NZXJnZShDVGV4dEJhc2VMaW5lKiBwT3RoZXIpOworICB2b2lkIE1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcik7CisgIHZvaWQgTWVyZ2VCb3hlcygpOworICB2b2lkIENvdW50Q2hhcnMoaW50JiBjb3VudCwgRlhfRkxPQVQmIHdpZHRoLCBpbnQmIG1pbmNoYXJzKTsKKyAgdm9pZCBXcml0ZU91dHB1dChDRlhfV2lkZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxlZnR4LAorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLAorICAgICAgICAgICAgICAgICAgIGludCBpV2lkdGgpOworICBGWF9GTE9BVCBtX0Jhc2VMaW5lOworICBGWF9GTE9BVCBtX1RvcDsKKyAgRlhfRkxPQVQgbV9Cb3R0b207CisgIEZYX0ZMT0FUIG1fTWF4Rm9udFNpemVWOworICBDRlhfUHRyQXJyYXkgbV9UZXh0TGlzdDsKIH07CiBjbGFzcyBDUERGX1BhZ2VPYmplY3Q7CiBjbGFzcyBDUERGX1RleHRPYmplY3Q7Ci1jbGFzcyBDVGV4dFBhZ2UKLXsKLXB1YmxpYzoKLSAgICBDVGV4dFBhZ2UoKTsKLSAgICB+Q1RleHRQYWdlKCk7Ci0gICAgdm9pZAlQcm9jZXNzT2JqZWN0KENQREZfUGFnZU9iamVjdCogcE9iaik7Ci0gICAgQ1RleHRCYXNlTGluZSogSW5zZXJ0VGV4dEJveChDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUsIEZYX0ZMT0FUIGJhc2V5LCBGWF9GTE9BVCBsZWZ0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJpZ2h0eCwgRlhfRkxPQVQgdG9weSwgRlhfRkxPQVQgYm90dG9teSwgRlhfRkxPQVQgc3BhY2V3LCBGWF9GTE9BVCBmb250c2l6ZV92LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgQ1BERl9Gb250KiBwRm9udCk7Ci0gICAgdm9pZAlXcml0ZU91dHB1dChDRlhfV2lkZVN0cmluZ0FycmF5JiBsaW5lcywgaW50IGlNaW5XaWR0aCk7Ci0gICAgRlhfQk9PTAltX2JBdXRvV2lkdGg7Ci0gICAgRlhfQk9PTAltX2JLZWVwQ29sdW1uOwotICAgIEZYX0JPT0wJbV9iQnJlYWtTcGFjZTsKK2NsYXNzIENUZXh0UGFnZSB7CisgcHVibGljOgorICBDVGV4dFBhZ2UoKTsKKyAgfkNUZXh0UGFnZSgpOworICB2b2lkIFByb2Nlc3NPYmplY3QoQ1BERl9QYWdlT2JqZWN0KiBwT2JqKTsKKyAgQ1RleHRCYXNlTGluZSogSW5zZXJ0VGV4dEJveChDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYmFzZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbGVmdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYm90dG9teSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzcGFjZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udHNpemVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQpOworICB2b2lkIFdyaXRlT3V0cHV0KENGWF9XaWRlU3RyaW5nQXJyYXkmIGxpbmVzLCBpbnQgaU1pbldpZHRoKTsKKyAgRlhfQk9PTCBtX2JBdXRvV2lkdGg7CisgIEZYX0JPT0wgbV9iS2VlcENvbHVtbjsKKyAgRlhfQk9PTCBtX2JCcmVha1NwYWNlOwogCi1wcml2YXRlOgotICAgIENGWF9QdHJBcnJheQltX0Jhc2VMaW5lczsKLSAgICBDRlhfUHRyQXJyYXkJbV9UZXh0Q29sdW1uczsKLSAgICB2b2lkCUZpbmRDb2x1bW5zKCk7Ci0gICAgQ1RleHRDb2x1bW4qCUZpbmRDb2x1bW4oRlhfRkxPQVQgeHBvcyk7Ci0gICAgdm9pZAlCcmVha1NwYWNlKENQREZfVGV4dE9iamVjdCogcFRleHRPYmopOworIHByaXZhdGU6CisgIENGWF9QdHJBcnJheSBtX0Jhc2VMaW5lczsKKyAgQ0ZYX1B0ckFycmF5IG1fVGV4dENvbHVtbnM7CisgIHZvaWQgRmluZENvbHVtbnMoKTsKKyAgQ1RleHRDb2x1bW4qIEZpbmRDb2x1bW4oRlhfRkxPQVQgeHBvcyk7CisgIHZvaWQgQnJlYWtTcGFjZShDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlBERlRFWFRfVFhUUFJPQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb24uY3BwIGIvY29yZS9zcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb24uY3BwCmluZGV4IDQ2ODkwMGMuLjQ0NmM2OTQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3VuaWNvZGVub3JtYWxpemF0aW9uLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmdGV4dC91bmljb2Rlbm9ybWFsaXphdGlvbi5jcHAKQEAgLTEyLDY1ICsxMiw2MCBAQAogZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAzW107CiBleHRlcm4gY29uc3QgRlhfV0NIQVIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDRbXTsKIGNvbnN0IEZYX1dDSEFSKiBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwc1s1XSA9IHsKLSAgICBOVUxMLAotICAgIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAxLAotICAgIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAyLAotICAgIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAzLAotICAgIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXA0Ci19OwotRlhfU1RSU0laRSBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24oRlhfV0NIQVIgd2NoLCBGWF9XQ0hBUiogcERzdCkKLXsKLSAgICB3Y2ggPSB3Y2ggJiAweEZGRkY7Ci0gICAgRlhfV0NIQVIgd0ZpbmQgPSBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25bd2NoXTsKLSAgICBpZiAoIXdGaW5kKSB7Ci0gICAgICAgIGlmIChwRHN0KSB7Ci0gICAgICAgICAgICAqcERzdCA9IHdjaDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYod0ZpbmQgPj0gMHg4MDAwKSB7Ci0gICAgICAgIHdjaCA9IHdGaW5kIC0gMHg4MDAwOwotICAgICAgICB3RmluZCA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2NoID0gd0ZpbmQgJiAweDBGRkY7Ci0gICAgICAgIHdGaW5kID4+PSAxMjsKLSAgICB9Ci0gICAgY29uc3QgRlhfV0NIQVIqIHBNYXAgPSBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwc1t3RmluZF07Ci0gICAgaWYgKHBNYXAgPT0gZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDQpIHsKLSAgICAgICAgcE1hcCA9IGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXA0ICsgd2NoOwotICAgICAgICB3RmluZCA9IChGWF9XQ0hBUikoKnBNYXAgKyspOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBNYXAgKz0gd2NoOwotICAgIH0KKyAgICBOVUxMLCBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwMSwgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDIsCisgICAgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDMsIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXA0fTsKK0ZYX1NUUlNJWkUgRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKEZYX1dDSEFSIHdjaCwgRlhfV0NIQVIqIHBEc3QpIHsKKyAgd2NoID0gd2NoICYgMHhGRkZGOworICBGWF9XQ0hBUiB3RmluZCA9IGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvblt3Y2hdOworICBpZiAoIXdGaW5kKSB7CiAgICAgaWYgKHBEc3QpIHsKLSAgICAgICAgRlhfV0NIQVIgbiA9IHdGaW5kOwotICAgICAgICB3aGlsZSAobiAtLSkgewotICAgICAgICAgICAgKnBEc3QgKysgPSAqcE1hcCArKzsKLSAgICAgICAgfQorICAgICAgKnBEc3QgPSB3Y2g7CiAgICAgfQotICAgIHJldHVybiAoRlhfU1RSU0laRSl3RmluZDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAod0ZpbmQgPj0gMHg4MDAwKSB7CisgICAgd2NoID0gd0ZpbmQgLSAweDgwMDA7CisgICAgd0ZpbmQgPSAxOworICB9IGVsc2UgeworICAgIHdjaCA9IHdGaW5kICYgMHgwRkZGOworICAgIHdGaW5kID4+PSAxMjsKKyAgfQorICBjb25zdCBGWF9XQ0hBUiogcE1hcCA9IGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXBzW3dGaW5kXTsKKyAgaWYgKHBNYXAgPT0gZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDQpIHsKKyAgICBwTWFwID0gZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDQgKyB3Y2g7CisgICAgd0ZpbmQgPSAoRlhfV0NIQVIpKCpwTWFwKyspOworICB9IGVsc2UgeworICAgIHBNYXAgKz0gd2NoOworICB9CisgIGlmIChwRHN0KSB7CisgICAgRlhfV0NIQVIgbiA9IHdGaW5kOworICAgIHdoaWxlIChuLS0pIHsKKyAgICAgICpwRHN0KysgPSAqcE1hcCsrOworICAgIH0KKyAgfQorICByZXR1cm4gKEZYX1NUUlNJWkUpd0ZpbmQ7CiB9Ci1GWF9TVFJTSVpFIEZYX1dpZGVTdHJpbmdfR2V0Tm9ybWFsaXphdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU3JjLCBGWF9XQ0hBUiogcERzdCkKLXsKLSAgICBGWF9TVFJTSVpFIG5Db3VudCA9IDA7Ci0gICAgZm9yIChGWF9TVFJTSVpFIGxlbiA9IDA7IGxlbiA8IHdzU3JjLkdldExlbmd0aCgpOyBsZW4gKyspIHsKLSAgICAgICAgRlhfV0NIQVIgd2NoID0gd3NTcmMuR2V0QXQobGVuKTsKLSAgICAgICAgaWYocERzdCkgewotICAgICAgICAgICAgbkNvdW50ICs9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Y2gsIHBEc3QgKyBuQ291bnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbkNvdW50ICs9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Y2gsIHBEc3QpOwotICAgICAgICB9CitGWF9TVFJTSVpFIEZYX1dpZGVTdHJpbmdfR2V0Tm9ybWFsaXphdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIHBEc3QpIHsKKyAgRlhfU1RSU0laRSBuQ291bnQgPSAwOworICBmb3IgKEZYX1NUUlNJWkUgbGVuID0gMDsgbGVuIDwgd3NTcmMuR2V0TGVuZ3RoKCk7IGxlbisrKSB7CisgICAgRlhfV0NIQVIgd2NoID0gd3NTcmMuR2V0QXQobGVuKTsKKyAgICBpZiAocERzdCkgeworICAgICAgbkNvdW50ICs9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Y2gsIHBEc3QgKyBuQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICBuQ291bnQgKz0gRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdjaCwgcERzdCk7CiAgICAgfQotICAgIHJldHVybiBuQ291bnQ7CisgIH0KKyAgcmV0dXJuIG5Db3VudDsKIH0KLUZYX1NUUlNJWkUgRlhfV2lkZVN0cmluZ19HZXROb3JtYWxpemF0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTcmMsIENGWF9XaWRlU3RyaW5nICZ3c0RzdCkKLXsKLSAgICBGWF9TVFJTSVpFIG5MZW4gPSBGWF9XaWRlU3RyaW5nX0dldE5vcm1hbGl6YXRpb24od3NTcmMsIChGWF9XQ0hBUiopTlVMTCk7Ci0gICAgaWYgKCFuTGVuKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9XQ0hBUiogcEJ1ZiA9IHdzRHN0LkdldEJ1ZmZlcihuTGVuKTsKLSAgICBGWF9XaWRlU3RyaW5nX0dldE5vcm1hbGl6YXRpb24od3NTcmMsIHBCdWYpOwotICAgIHdzRHN0LlJlbGVhc2VCdWZmZXIobkxlbik7Ci0gICAgcmV0dXJuIG5MZW47CitGWF9TVFJTSVpFIEZYX1dpZGVTdHJpbmdfR2V0Tm9ybWFsaXphdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRHN0KSB7CisgIEZYX1NUUlNJWkUgbkxlbiA9IEZYX1dpZGVTdHJpbmdfR2V0Tm9ybWFsaXphdGlvbih3c1NyYywgKEZYX1dDSEFSKilOVUxMKTsKKyAgaWYgKCFuTGVuKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhfV0NIQVIqIHBCdWYgPSB3c0RzdC5HZXRCdWZmZXIobkxlbik7CisgIEZYX1dpZGVTdHJpbmdfR2V0Tm9ybWFsaXphdGlvbih3c1NyYywgcEJ1Zik7CisgIHdzRHN0LlJlbGVhc2VCdWZmZXIobkxlbik7CisgIHJldHVybiBuTGVuOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb25kYXRhLmNwcCBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L3VuaWNvZGVub3JtYWxpemF0aW9uZGF0YS5jcHAKaW5kZXggMWI5MDNlYy4uODE4NWE2NCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb25kYXRhLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmdGV4dC91bmljb2Rlbm9ybWFsaXphdGlvbmRhdGEuY3BwCkBAIC02LDQ2NTYgKzYsODI2NCBAQAogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKIGV4dGVybiBjb25zdCBGWF9XQ0hBUiBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25bNjU1MzZdID0gewotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgwMDEsIDB4MDAwMCwgMHgyMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAwMiwgMHg4MDAyLCAweDAwMDAsIDB4MjAwNCwgMHgwMDAwLCAweDAwMDAsIDB4ODAwMywKLSAgICAweDgwMDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MDA1LCAweDAwMDAsIDB4ODAwNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MDA3LCAweDgwMDgsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODAwOSwgMHg4MDBBLCAweDgwMEIsIDB4ODAwQywgMHgwMDAwLCAweDAwMDAsIDB4ODAwRCwgMHg4MDBFLCAweDgwMEYsIDB4MDAwMCwgMHgzMDAwLCAweDMwMDMsIDB4MzAwNiwgMHgwMDAwLAotICAgIDB4ODAxMCwgMHg4MDExLCAweDgwMTIsIDB4ODAxMywgMHg4MDE0LCAweDgwMTUsIDB4MDAwMCwgMHg4MDE2LCAweDgwMTcsIDB4ODAxOCwgMHg4MDE5LCAweDgwMUEsIDB4ODAxQiwgMHg4MDFDLCAweDgwMUQsIDB4ODAxRSwKLSAgICAweDgwMUYsIDB4ODAyMCwgMHg4MDIxLCAweDgwMjIsIDB4ODAyMywgMHg4MDI0LCAweDgwMjUsIDB4MDAwMCwgMHg4MDI2LCAweDgwMjcsIDB4ODAyOCwgMHg4MDI5LCAweDgwMkEsIDB4ODAyQiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4MDJDLCAweDgwMkQsIDB4ODAyRSwgMHg4MDJGLCAweDgwMzAsIDB4ODAzMSwgMHgwMDAwLCAweDgwMzIsIDB4ODAzMywgMHg4MDM0LCAweDgwMzUsIDB4ODAzNiwgMHg4MDM3LCAweDgwMzgsIDB4ODAzOSwgMHg4MDNBLAotICAgIDB4MDAwMCwgMHg4MDNCLCAweDgwM0MsIDB4ODAzRCwgMHg4MDNFLCAweDgwM0YsIDB4ODA0MCwgMHgwMDAwLCAweDgwNDEsIDB4ODA0MiwgMHg4MDQzLCAweDgwNDQsIDB4ODA0NSwgMHg4MDQ2LCAweDAwMDAsIDB4ODA0NywKLSAgICAweDgwNDgsIDB4ODA0OSwgMHg4MDRBLCAweDgwNEIsIDB4ODA0QywgMHg4MDRELCAweDgwNEUsIDB4ODA0RiwgMHg4MDUwLCAweDgwNTEsIDB4ODA1MiwgMHg4MDUzLCAweDgwNTQsIDB4ODA1NSwgMHg4MDU2LCAweDgwNTcsCi0gICAgMHg4MDU4LCAweDgwNTksIDB4ODA1QSwgMHg4MDVCLCAweDgwNUMsIDB4ODA1RCwgMHg4MDVFLCAweDgwNUYsIDB4ODA2MCwgMHg4MDYxLCAweDgwNjIsIDB4ODA2MywgMHg4MDY0LCAweDgwNjUsIDB4ODA2NiwgMHg4MDY3LAotICAgIDB4ODA2OCwgMHg4MDY5LCAweDgwNkEsIDB4ODA2QiwgMHg4MDZDLCAweDgwNkQsIDB4ODA2RSwgMHg4MDZGLCAweDgwNzAsIDB4ODA3MSwgMHg4MDcyLCAweDgwNzMsIDB4ODA3NCwgMHg4MDc1LCAweDgwNzYsIDB4ODA3NywKLSAgICAweDgwNzgsIDB4MDAwMCwgMHgyMDA2LCAweDIwMDgsIDB4ODA3OSwgMHg4MDdBLCAweDgwN0IsIDB4ODA3QywgMHg4MDdELCAweDgwN0UsIDB4ODA3RiwgMHg4MDgwLCAweDgwODEsIDB4ODA4MiwgMHg4MDgzLCAweDgwODQsCi0gICAgMHg4MDg1LCAweDgwODYsIDB4ODA4NywgMHg4MDg4LCAweDgwODksIDB4ODA4QSwgMHg4MDhCLCAweDgwOEMsIDB4ODA4RCwgMHg4MDhFLCAweDAwMDAsIDB4MDAwMCwgMHg4MDhGLCAweDgwOTAsIDB4ODA5MSwgMHg4MDkyLAotICAgIDB4ODA5MywgMHg4MDk0LCAweDIwMEEsIDB4MjAwQywgMHg4MDk1LCAweDgwOTYsIDB4ODA5NywgMHg4MDk4LCAweDgwOTksIDB4ODA5QSwgMHg4MDlCLCAweDgwOUMsIDB4ODA5RCwgMHg4MDlFLCAweDgwOUYsIDB4ODBBMCwKLSAgICAweDgwQTEsIDB4ODBBMiwgMHg4MEEzLCAweDgwQTQsIDB4ODBBNSwgMHg4MEE2LCAweDgwQTcsIDB4ODBBOCwgMHg4MEE5LCAweDgwQUEsIDB4ODBBQiwgMHg4MEFDLCAweDgwQUQsIDB4ODBBRSwgMHg4MEFGLCAweDgwQjAsCi0gICAgMHg4MEIxLCAweDgwQjIsIDB4ODBCMywgMHg4MEI0LCAweDgwQjUsIDB4ODBCNiwgMHg4MEI3LCAweDgwQjgsIDB4ODBCOSwgMHg4MEJBLCAweDgwQkIsIDB4ODBCQywgMHg4MEJELCAweDgwQkUsIDB4ODBCRiwgMHg4MEMwLAotICAgIDB4ODBDMSwgMHg4MEMyLCAweDgwQzMsIDB4ODBDNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MEM1LCAweDgwQzYsIDB4ODBDNywgMHg4MEM4LCAweDgwQzksIDB4ODBDQSwgMHgwMDAwLCAweDgwQ0IsIDB4MDAwMCwKLSAgICAweDgwQ0MsIDB4ODBDRCwgMHg4MENFLCAweDgwQ0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODBEMCwgMHg4MEQxLCAweDgwRDIsIDB4ODBEMywgMHgwMDAwLCAweDgwRDQsIDB4ODBENSwgMHg4MEQ2LCAweDgwRDcsCi0gICAgMHg4MEQ4LCAweDgwRDksIDB4MDAwMCwgMHgwMDAwLCAweDgwREEsIDB4ODBEQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgwREMsIDB4ODBERCwgMHg4MERFLCAweDgwREYsIDB4ODBFMCwgMHg4MEUxLAotICAgIDB4ODBFMiwgMHgwMDAwLCAweDgwRTMsIDB4ODBFNCwgMHg4MEU1LCAweDgwRTYsIDB4ODBFNywgMHgwMDAwLCAweDgwRTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAwRSwgMHgyMDEwLCAweDIwMTIsIDB4MjAxNCwgMHgyMDE2LCAweDIwMTgsIDB4MjAxQSwgMHgyMDFDLCAweDIwMUUsIDB4ODBFOSwgMHg4MEVBLCAweDgwRUIsCi0gICAgMHg4MEVDLCAweDgwRUQsIDB4ODBFRSwgMHg4MEVGLCAweDgwRjAsIDB4ODBGMSwgMHg4MEYyLCAweDgwRjMsIDB4ODBGNCwgMHg4MEY1LCAweDgwRjYsIDB4ODBGNywgMHg4MEY4LCAweDgwRjksIDB4ODBGQSwgMHg4MEZCLAotICAgIDB4ODBGQywgMHg4MEZELCAweDgwRkUsIDB4ODBGRiwgMHg4MTAwLCAweDgxMDEsIDB4ODEwMiwgMHg4MTAzLCAweDgxMDQsIDB4ODEwNSwgMHg4MTA2LCAweDgxMDcsIDB4ODEwOCwgMHg4MTA5LCAweDgxMEEsIDB4ODEwQiwKLSAgICAweDgxMEMsIDB4MjAyMCwgMHgyMDIyLCAweDIwMjQsIDB4ODEwRCwgMHg4MTBFLCAweDAwMDAsIDB4MDAwMCwgMHg4MTBGLCAweDgxMTAsIDB4ODExMSwgMHg4MTEyLCAweDgxMTMsIDB4ODExNCwgMHg4MTE1LCAweDgxMTYsCi0gICAgMHg4MTE3LCAweDgxMTgsIDB4ODExOSwgMHg4MTFBLCAweDgxMUIsIDB4ODExQywgMHg4MTFELCAweDgxMUUsIDB4ODExRiwgMHg4MTIwLCAweDgxMjEsIDB4ODEyMiwgMHg4MTIzLCAweDgxMjQsIDB4ODEyNSwgMHg4MTI2LAotICAgIDB4ODEyNywgMHg4MTI4LCAweDgxMjksIDB4ODEyQSwgMHg4MTJCLCAweDgxMkMsIDB4ODEyRCwgMHg4MTJFLCAweDgxMkYsIDB4ODEzMCwgMHg4MTMxLCAweDgxMzIsIDB4MDAwMCwgMHgwMDAwLCAweDgxMzMsIDB4ODEzNCwKLSAgICAweDgxMzUsIDB4ODEzNiwgMHgwMDAwLCAweDAwMDAsIDB4ODEzNywgMHg4MTM4LCAweDgxMzksIDB4ODEzQSwgMHg4MTNCLCAweDgxM0MsIDB4ODEzRCwgMHg4MTNFLCAweDgxM0YsIDB4ODE0MCwgMHg4MTQxLCAweDgxNDIsCi0gICAgMHg4MTQzLCAweDgxNDQsIDB4ODE0NSwgMHg4MTQ2LCAweDgxNDcsIDB4ODE0OCwgMHg4MTQ5LCAweDgxNEEsIDB4MjAyNiwgMHgyMDI4LCAweDgxNEIsIDB4ODE0QywgMHg4MTRELCAweDgxNEUsIDB4ODE0RiwgMHg4MTUwLAotICAgIDB4ODE1MSwgMHgwMDAwLCAweDAwMDAsIDB4ODE1MiwgMHg4MTUzLCAweDgxNTQsIDB4ODE1NSwgMHg4MTU2LCAweDgxNTcsIDB4ODE1OCwgMHg4MTU5LCAweDgxNUEsIDB4ODE1QiwgMHg4MTVDLCAweDgxNUQsIDB4ODE1RSwKLSAgICAweDgxNUYsIDB4MDAwMCwgMHg4MTYwLCAweDgxNjEsIDB4ODE2MiwgMHg4MTYzLCAweDgxNjQsIDB4ODE2NSwgMHg4MTY2LCAweDAwMDAsIDB4ODE2NywgMHg4MTY4LCAweDgxNjksIDB4ODE2QSwgMHg4MTZCLCAweDgxNkMsCi0gICAgMHg4MTZELCAweDgxNkUsIDB4ODE2RiwgMHgwMDAwLCAweDAwMDAsIDB4ODE3MCwgMHg4MTcxLCAweDAwMDAsIDB4ODE3MiwgMHgwMDAwLCAweDgxNzMsIDB4ODE3NCwgMHg4MTc1LCAweDgxNzYsIDB4MDAwMCwgMHg4MTc3LAotICAgIDB4ODE3OCwgMHg4MTc5LCAweDgxN0EsIDB4ODE3QiwgMHg4MTdDLCAweDgxN0QsIDB4MjAyQSwgMHgwMDAwLCAweDAwMDAsIDB4ODE3RSwgMHg4MTdGLCAweDgxODAsIDB4ODE4MSwgMHg4MTgyLCAweDgxODMsIDB4ODE4NCwKLSAgICAweDgxODUsIDB4ODE4NiwgMHg4MTg3LCAweDAwMDAsIDB4ODE4OCwgMHg4MTg5LCAweDgxOEEsIDB4ODE4QiwgMHg4MThDLCAweDgxOEQsIDB4MDAwMCwgMHg4MThFLCAweDgxOEYsIDB4ODE5MCwgMHg4MTkxLCAweDgxOTIsCi0gICAgMHg4MTkzLCAweDgxOTQsIDB4MDAwMCwgMHg4MTk1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxOTYsIDB4MDAwMCwgMHg4MTk3LCAweDgxOTgsIDB4ODE5OSwgMHg4MTlBLCAweDgxOUIsIDB4ODE5QywgMHg4MTlELAotICAgIDB4ODE5RSwgMHgwMDAwLCAweDAwMDAsIDB4MjAyQywgMHgyMDJFLCAweDIwMzAsIDB4MjAzMiwgMHgyMDM0LCAweDIwMzYsIDB4MjAzOCwgMHgyMDNBLCAweDIwM0MsIDB4MDAwMCwgMHgwMDAwLCAweDgxOUYsIDB4ODFBMCwKLSAgICAweDgxQTEsIDB4ODFBMiwgMHg4MUEzLCAweDgxQTQsIDB4ODFBNSwgMHg4MUE2LCAweDgxQTcsIDB4ODFBOCwgMHg4MUE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgxQUEsIDB4ODFBQiwgMHg4MUFDLCAweDgxQUQsIDB4ODFBRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgxQUYsIDB4ODFCMCwgMHgwMDAwLCAweDgxQjEsIDB4ODFCMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFCMywgMHg4MUI0LCAweDgxQjUsIDB4ODFCNiwgMHg4MUI3LCAweDgxQjgsIDB4ODFCOSwgMHg4MUJBLCAweDgxQkIsIDB4ODFCQywgMHg4MUJELCAweDgxQkUsIDB4ODFCRiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFDMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUMxLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxQzIsIDB4ODFDMywgMHg4MUM0LCAweDgxQzUsIDB4ODFDNiwgMHg4MUM3LCAweDgxQzgsIDB4MDAwMCwgMHg4MUM5LCAweDAwMDAsIDB4ODFDQSwgMHg4MUNCLAotICAgIDB4ODFDQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFDRCwgMHg4MUNFLCAweDgxQ0YsIDB4ODFEMCwgMHg4MUQxLCAweDgxRDIsCi0gICAgMHg4MUQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUQ0LCAweDgxRDUsIDB4ODFENiwgMHg4MUQ3LCAweDgxRDgsIDB4MDAwMCwKLSAgICAweDgxRDksIDB4ODFEQSwgMHg4MURCLCAweDgxREMsIDB4ODFERCwgMHg4MURFLCAweDgxREYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODFFMCwgMHg4MUUxLCAweDgxRTIsIDB4MDAwMCwgMHg4MUUzLCAweDgxRTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFFNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgxRTYsIDB4ODFFNywgMHgwMDAwLCAweDgxRTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFFOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxRUEsIDB4ODFFQiwgMHg4MUVDLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUVELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxRUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODFFRiwgMHg4MUYwLCAweDAwMDAsIDB4ODFGMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFGMywgMHg4MUY0LCAweDgxRjUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUY2LCAweDgxRjcsIDB4MDAwMCwgMHgwMDAwLCAweDgxRjgsIDB4ODFGOSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUZBLCAweDgxRkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUZDLCAweDgxRkQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUZFLCAweDgxRkYsIDB4MDAwMCwgMHgwMDAwLCAweDgyMDAsIDB4ODIwMSwKLSAgICAweDgyMDIsIDB4ODIwMywgMHg4MjA0LCAweDgyMDUsIDB4ODIwNiwgMHg4MjA3LCAweDgyMDgsIDB4ODIwOSwgMHg4MjBBLCAweDgyMEIsIDB4ODIwQywgMHg4MjBELCAweDgyMEUsIDB4ODIwRiwgMHg4MjEwLCAweDgyMTEsCi0gICAgMHg4MjEyLCAweDgyMTMsIDB4ODIxNCwgMHg4MjE1LCAweDIwM0UsIDB4MjA0MCwgMHg4MjE2LCAweDgyMTcsIDB4MDAwMCwgMHgwMDAwLCAweDgyMTgsIDB4ODIxOSwgMHg4MjFBLCAweDgyMUIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODIxQywgMHg4MjFELCAweDgyMUUsIDB4ODIxRiwgMHgyMDQyLCAweDIwNDQsIDB4ODIyMCwgMHg4MjIxLCAweDgyMjIsIDB4ODIyMywgMHgwMDAwLCAweDAwMDAsIDB4ODIyNCwgMHg4MjI1LCAweDgyMjYsIDB4ODIyNywKLSAgICAweDAwMDAsIDB4ODIyOCwgMHg4MjI5LCAweDgyMkEsIDB4ODIyQiwgMHg4MjJDLCAweDgyMkQsIDB4ODIyRSwgMHg4MjJGLCAweDgyMzAsIDB4ODIzMSwgMHgwMDAwLCAweDAwMDAsIDB4ODIzMiwgMHg4MjMzLCAweDAwMDAsCi0gICAgMHg4MjM0LCAweDgyMzUsIDB4ODIzNiwgMHg4MjM3LCAweDIwNDYsIDB4MjA0OCwgMHg4MjM4LCAweDgyMzksIDB4MDAwMCwgMHgwMDAwLCAweDgyM0EsIDB4ODIzQiwgMHg4MjNDLCAweDgyM0QsIDB4ODIzRSwgMHg4MjNGLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDgyNDAsIDB4ODI0MSwgMHg4MjQyLCAweDgyNDMsIDB4ODI0NCwgMHg4MjQ1LCAweDAwMDAsIDB4MDAwMCwgMHg4MjQ2LCAweDgyNDcsIDB4ODI0OCwgMHg4MjQ5LCAweDgyNEEsIDB4ODI0QiwKLSAgICAweDgyNEMsIDB4ODI0RCwgMHg4MjRFLCAweDgyNEYsIDB4ODI1MCwgMHg4MjUxLCAweDgyNTIsIDB4ODI1MywgMHg4MjU0LCAweDgyNTUsIDB4ODI1NiwgMHg4MjU3LCAweDgyNTgsIDB4ODI1OSwgMHg4MjVBLCAweDgyNUIsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODI1QywgMHg4MjVELCAweDgyNUUsIDB4ODI1RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA0QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDRDLCAweDIwNEUsIDB4MjA1MCwgMHgyMDUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjA1NCwgMHgwMDAwLCAweDIwNTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwNTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMDVDLCAweDAwMDAsIDB4MDAwMCwgMHgyMDVFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA2MCwgMHgyMDYyLCAweDIwNjQsIDB4MjA2NiwgMHgyMDY4LCAweDIwNkEsIDB4MjA2QywgMHgyMDZFLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwNzAsIDB4MjA3MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwNzQsIDB4MjA3NiwgMHgwMDAwLCAweDIwNzgsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwN0EsIDB4MDAwMCwgMHgwMDAwLCAweDIwN0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA3RSwgMHgyMDgwLCAweDIwODIsIDB4MDAwMCwgMHgwMDAwLCAweDIwODQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwODYsIDB4MDAwMCwgMHgwMDAwLCAweDIwODgsIDB4MjA4QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwOEMsIDB4MjA4RSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwOTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwOTIsIDB4MjA5NCwgMHgyMDk2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDk4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjA5QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDlDLCAweDIwOUUsIDB4MDAwMCwgMHgyMEEwLCAweDIwQTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQTQsIDB4MjBBNiwgMHgyMEE4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQUEsIDB4MDAwMCwgMHgyMEFDLCAweDIwQUUsIDB4MjBCMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEIyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBCNiwgMHgyMEI4LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODI2MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBCQywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MjBCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBDNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQzYsIDB4MDAwMCwgMHgyMEM4LCAweDIwQ0EsIDB4MjBDQywgMHgyMENFLCAweDIwRDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDIwRDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBENCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEQ2LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgyMEQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBEQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwREMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMERFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBFMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgyNjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBFMiwgMHgwMDAwLCAweDIwRTQsIDB4MDAwMCwgMHgyMEU2LCAweDAwMDAsIDB4MjBFOCwgMHgwMDAwLCAweDIwRUEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgyMEVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwRUUsIDB4MDAwMCwgMHgyMEYwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDIwRjIsIDB4MjBGNCwgMHgwMDAwLCAweDIwRjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgyNjIsIDB4ODI2MywgMHg4MjY0LCAweDgyNjUsCi0gICAgMHg4MjY2LCAweDgyNjcsIDB4ODI2OCwgMHg4MjY5LCAweDgyNkEsIDB4ODI2QiwgMHg4MjZDLCAweDgyNkQsIDB4ODI2RSwgMHg4MjZGLCAweDgyNzAsIDB4MDAwMCwgMHg4MjcxLCAweDgyNzIsIDB4ODI3MywgMHg4Mjc0LAotICAgIDB4ODI3NSwgMHg4Mjc2LCAweDgyNzcsIDB4ODI3OCwgMHg4Mjc5LCAweDgyN0EsIDB4ODI3QiwgMHg4MjdDLCAweDgyN0QsIDB4ODI3RSwgMHg4MjdGLCAweDgyODAsIDB4ODI4MSwgMHg4MjgyLCAweDAwMDAsIDB4ODI4MywKLSAgICAweDgyODQsIDB4ODI4NSwgMHg4Mjg2LCAweDgyODcsIDB4ODI4OCwgMHg4Mjg5LCAweDgyOEEsIDB4ODI4QiwgMHg4MjhDLCAweDgyOEQsIDB4ODI4RSwgMHg4MjhGLCAweDgyOTAsIDB4ODI5MSwgMHg4MjkyLCAweDgyOTMsCi0gICAgMHg4Mjk0LCAweDgyOTUsIDB4ODI5NiwgMHg4Mjk3LCAweDgyOTgsIDB4ODI5OSwgMHg4MjlBLCAweDgyOUIsIDB4ODI5QywgMHg4MjlELCAweDgyOUUsIDB4MDAwMCwgMHg4MjlGLCAweDgyQTAsIDB4ODJBMSwgMHg4MkEyLAotICAgIDB4ODJBMywgMHg4MkE0LCAweDgyQTUsIDB4ODJBNiwgMHg4MkE3LCAweDgyQTgsIDB4ODJBOSwgMHg4MkFBLCAweDgyQUIsIDB4MDAwMCwgMHgyMEY4LCAweDgyQUMsIDB4MDAwMCwgMHg4MkFELCAweDgyQUUsIDB4ODJBRiwKLSAgICAweDgyQjAsIDB4ODJCMSwgMHg4MkIyLCAweDgyQjMsIDB4ODJCNCwgMHg4MkI1LCAweDgyQjYsIDB4ODJCNywgMHg4MkI4LCAweDgyQjksIDB4ODJCQSwgMHg4MkJCLCAweDgyQkMsIDB4ODJCRCwgMHg4MkJFLCAweDgyQkYsCi0gICAgMHg4MkMwLCAweDgyQzEsIDB4ODJDMiwgMHg4MkMzLCAweDgyQzQsIDB4ODJDNSwgMHg4MkM2LCAweDAwMDAsIDB4ODJDNywgMHgwMDAwLCAweDAwMDAsIDB4ODJDOCwgMHg4MkM5LCAweDgyQ0EsIDB4ODJDQiwgMHg4MkNDLAotICAgIDB4ODJDRCwgMHg4MkNFLCAweDgyQ0YsIDB4ODJEMCwgMHg4MkQxLCAweDgyRDIsIDB4ODJEMywgMHg4MkQ0LCAweDgyRDUsIDB4ODJENiwgMHg4MkQ3LCAweDgyRDgsIDB4ODJEOSwgMHg4MkRBLCAweDgyREIsIDB4ODJEQywKLSAgICAweDgyREQsIDB4ODJERSwgMHg4MkRGLCAweDgyRTAsIDB4ODJFMSwgMHg4MkUyLCAweDgyRTMsIDB4ODJFNCwgMHg4MkU1LCAweDgyRTYsIDB4ODJFNywgMHg4MkU4LCAweDgyRTksIDB4ODJFQSwgMHg4MkVCLCAweDgyRUMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODJFRCwgMHg4MkVFLCAweDgyRUYsIDB4ODJGMCwgMHg4MkYxLCAweDgyRjIsIDB4ODJGMywgMHg4MkY0LCAweDgyRjUsIDB4ODJGNiwgMHg4MkY3LCAweDgyRjgsIDB4ODJGOSwgMHg4MkZBLCAweDgyRkIsIDB4ODJGQywKLSAgICAweDgyRkQsIDB4ODJGRSwgMHg4MkZGLCAweDgzMDAsIDB4ODMwMSwgMHg4MzAyLCAweDgzMDMsIDB4ODMwNCwgMHg4MzA1LCAweDgzMDYsIDB4ODMwNywgMHg4MzA4LCAweDgzMDksIDB4ODMwQSwgMHg4MzBCLCAweDgzMEMsCi0gICAgMHg4MzBELCAweDgzMEUsIDB4ODMwRiwgMHg4MzEwLCAweDgzMTEsIDB4ODMxMiwgMHg4MzEzLCAweDgzMTQsIDB4ODMxNSwgMHg4MzE2LCAweDgzMTcsIDB4ODMxOCwgMHg4MzE5LCAweDgzMUEsIDB4ODMxQiwgMHg4MzFDLAotICAgIDB4ODMxRCwgMHg4MzFFLCAweDgzMUYsIDB4ODMyMCwgMHg4MzIxLCAweDgzMjIsIDB4ODMyMywgMHg4MzI0LCAweDgzMjUsIDB4ODMyNiwgMHg4MzI3LCAweDgzMjgsIDB4ODMyOSwgMHg4MzJBLCAweDgzMkIsIDB4ODMyQywKLSAgICAweDgzMkQsIDB4ODMyRSwgMHg4MzJGLCAweDgzMzAsIDB4ODMzMSwgMHg4MzMyLCAweDgzMzMsIDB4ODMzNCwgMHg4MzM1LCAweDgzMzYsIDB4ODMzNywgMHg4MzM4LCAweDgzMzksIDB4ODMzQSwgMHg4MzNCLCAweDgzM0MsCi0gICAgMHg4MzNELCAweDgzM0UsIDB4ODMzRiwgMHg4MzQwLCAweDgzNDEsIDB4ODM0MiwgMHg4MzQzLCAweDgzNDQsIDB4ODM0NSwgMHg4MzQ2LCAweDgzNDcsIDB4ODM0OCwgMHg4MzQ5LCAweDgzNEEsIDB4ODM0QiwgMHg4MzRDLAotICAgIDB4ODM0RCwgMHg4MzRFLCAweDgzNEYsIDB4ODM1MCwgMHg4MzUxLCAweDgzNTIsIDB4ODM1MywgMHg4MzU0LCAweDgzNTUsIDB4ODM1NiwgMHg4MzU3LCAweDgzNTgsIDB4ODM1OSwgMHg4MzVBLCAweDgzNUIsIDB4ODM1QywKLSAgICAweDgzNUQsIDB4ODM1RSwgMHg4MzVGLCAweDgzNjAsIDB4ODM2MSwgMHg4MzYyLCAweDgzNjMsIDB4ODM2NCwgMHg4MzY1LCAweDgzNjYsIDB4ODM2NywgMHg4MzY4LCAweDgzNjksIDB4ODM2QSwgMHg4MzZCLCAweDgzNkMsCi0gICAgMHg4MzZELCAweDgzNkUsIDB4ODM2RiwgMHg4MzcwLCAweDgzNzEsIDB4ODM3MiwgMHg4MzczLCAweDgzNzQsIDB4ODM3NSwgMHg4Mzc2LCAweDgzNzcsIDB4ODM3OCwgMHg4Mzc5LCAweDgzN0EsIDB4ODM3QiwgMHg4MzdDLAotICAgIDB4ODM3RCwgMHg4MzdFLCAweDgzN0YsIDB4ODM4MCwgMHg4MzgxLCAweDgzODIsIDB4ODM4MywgMHg4Mzg0LCAweDgzODUsIDB4ODM4NiwgMHg4Mzg3LCAweDgzODgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgzODksIDB4ODM4QSwgMHg4MzhCLCAweDgzOEMsIDB4ODM4RCwgMHg4MzhFLCAweDgzOEYsIDB4ODM5MCwgMHg4MzkxLCAweDgzOTIsIDB4ODM5MywgMHg4Mzk0LCAweDgzOTUsIDB4ODM5NiwgMHg4Mzk3LCAweDgzOTgsCi0gICAgMHg4Mzk5LCAweDgzOUEsIDB4ODM5QiwgMHg4MzlDLCAweDgzOUQsIDB4ODM5RSwgMHg4MzlGLCAweDgzQTAsIDB4ODNBMSwgMHg4M0EyLCAweDgzQTMsIDB4ODNBNCwgMHg4M0E1LCAweDgzQTYsIDB4ODNBNywgMHg4M0E4LAotICAgIDB4ODNBOSwgMHg4M0FBLCAweDgzQUIsIDB4ODNBQywgMHg4M0FELCAweDgzQUUsIDB4ODNBRiwgMHg4M0IwLCAweDgzQjEsIDB4ODNCMiwgMHg4M0IzLCAweDgzQjQsIDB4ODNCNSwgMHg4M0I2LCAweDgzQjcsIDB4ODNCOCwKLSAgICAweDgzQjksIDB4ODNCQSwgMHg4M0JCLCAweDgzQkMsIDB4ODNCRCwgMHg4M0JFLCAweDgzQkYsIDB4ODNDMCwgMHg4M0MxLCAweDgzQzIsIDB4ODNDMywgMHg4M0M0LCAweDgzQzUsIDB4ODNDNiwgMHg4M0M3LCAweDgzQzgsCi0gICAgMHg4M0M5LCAweDgzQ0EsIDB4ODNDQiwgMHg4M0NDLCAweDgzQ0QsIDB4ODNDRSwgMHg4M0NGLCAweDgzRDAsIDB4ODNEMSwgMHg4M0QyLCAweDgzRDMsIDB4ODNENCwgMHg4M0Q1LCAweDgzRDYsIDB4ODNENywgMHg4M0Q4LAotICAgIDB4ODNEOSwgMHg4M0RBLCAweDgzREIsIDB4ODNEQywgMHg4M0RELCAweDgzREUsIDB4ODNERiwgMHg4M0UwLCAweDgzRTEsIDB4ODNFMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgzRTMsIDB4ODNFNCwgMHg4M0U1LCAweDgzRTYsIDB4ODNFNywgMHg4M0U4LCAweDgzRTksIDB4ODNFQSwgMHg4M0VCLCAweDgzRUMsIDB4ODNFRCwgMHg4M0VFLCAweDgzRUYsIDB4ODNGMCwgMHg4M0YxLCAweDgzRjIsCi0gICAgMHg4M0YzLCAweDgzRjQsIDB4ODNGNSwgMHg4M0Y2LCAweDgzRjcsIDB4ODNGOCwgMHgwMDAwLCAweDAwMDAsIDB4ODNGOSwgMHg4M0ZBLCAweDgzRkIsIDB4ODNGQywgMHg4M0ZELCAweDgzRkUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODNGRiwgMHg4NDAwLCAweDg0MDEsIDB4ODQwMiwgMHg4NDAzLCAweDg0MDQsIDB4ODQwNSwgMHg4NDA2LCAweDg0MDcsIDB4ODQwOCwgMHg4NDA5LCAweDg0MEEsIDB4ODQwQiwgMHg4NDBDLCAweDg0MEQsIDB4ODQwRSwKLSAgICAweDg0MEYsIDB4ODQxMCwgMHg4NDExLCAweDg0MTIsIDB4ODQxMywgMHg4NDE0LCAweDg0MTUsIDB4ODQxNiwgMHg4NDE3LCAweDg0MTgsIDB4ODQxOSwgMHg4NDFBLCAweDg0MUIsIDB4ODQxQywgMHg4NDFELCAweDg0MUUsCi0gICAgMHg4NDFGLCAweDg0MjAsIDB4ODQyMSwgMHg4NDIyLCAweDg0MjMsIDB4ODQyNCwgMHgwMDAwLCAweDAwMDAsIDB4ODQyNSwgMHg4NDI2LCAweDg0MjcsIDB4ODQyOCwgMHg4NDI5LCAweDg0MkEsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODQyQiwgMHg4NDJDLCAweDg0MkQsIDB4ODQyRSwgMHg4NDJGLCAweDg0MzAsIDB4ODQzMSwgMHg4NDMyLCAweDAwMDAsIDB4ODQzMywgMHgwMDAwLCAweDg0MzQsIDB4MDAwMCwgMHg4NDM1LCAweDAwMDAsIDB4ODQzNiwKLSAgICAweDg0MzcsIDB4ODQzOCwgMHg4NDM5LCAweDg0M0EsIDB4ODQzQiwgMHg4NDNDLCAweDg0M0QsIDB4ODQzRSwgMHg4NDNGLCAweDg0NDAsIDB4ODQ0MSwgMHg4NDQyLCAweDg0NDMsIDB4ODQ0NCwgMHg4NDQ1LCAweDg0NDYsCi0gICAgMHg4NDQ3LCAweDg0NDgsIDB4ODQ0OSwgMHg4NDRBLCAweDg0NEIsIDB4ODQ0QywgMHg4NDRELCAweDg0NEUsIDB4ODQ0RiwgMHg4NDUwLCAweDg0NTEsIDB4ODQ1MiwgMHg4NDUzLCAweDg0NTQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODQ1NSwgMHg4NDU2LCAweDg0NTcsIDB4ODQ1OCwgMHg4NDU5LCAweDg0NUEsIDB4ODQ1QiwgMHg4NDVDLCAweDg0NUQsIDB4ODQ1RSwgMHg4NDVGLCAweDg0NjAsIDB4ODQ2MSwgMHg4NDYyLCAweDg0NjMsIDB4ODQ2NCwKLSAgICAweDg0NjUsIDB4ODQ2NiwgMHg4NDY3LCAweDg0NjgsIDB4ODQ2OSwgMHg4NDZBLCAweDg0NkIsIDB4ODQ2QywgMHg4NDZELCAweDg0NkUsIDB4ODQ2RiwgMHg4NDcwLCAweDg0NzEsIDB4ODQ3MiwgMHg4NDczLCAweDg0NzQsCi0gICAgMHg4NDc1LCAweDg0NzYsIDB4ODQ3NywgMHg4NDc4LCAweDg0NzksIDB4ODQ3QSwgMHg4NDdCLCAweDg0N0MsIDB4ODQ3RCwgMHg4NDdFLCAweDg0N0YsIDB4ODQ4MCwgMHg4NDgxLCAweDg0ODIsIDB4ODQ4MywgMHg4NDg0LAotICAgIDB4ODQ4NSwgMHg4NDg2LCAweDg0ODcsIDB4ODQ4OCwgMHg4NDg5LCAweDAwMDAsIDB4ODQ4QSwgMHg4NDhCLCAweDg0OEMsIDB4ODQ4RCwgMHg4NDhFLCAweDg0OEYsIDB4ODQ5MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4NDkxLCAweDg0OTIsIDB4ODQ5MywgMHgwMDAwLCAweDg0OTQsIDB4ODQ5NSwgMHg4NDk2LCAweDg0OTcsIDB4ODQ5OCwgMHg4NDk5LCAweDg0OUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4NDlCLCAweDg0OUMsIDB4ODQ5RCwgMHg4NDlFLCAweDAwMDAsIDB4MDAwMCwgMHg4NDlGLCAweDg0QTAsIDB4ODRBMSwgMHg4NEEyLCAweDg0QTMsIDB4ODRBNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODRBNSwgMHg4NEE2LCAweDg0QTcsIDB4ODRBOCwgMHg4NEE5LCAweDg0QUEsIDB4ODRBQiwgMHg4NEFDLCAweDg0QUQsIDB4ODRBRSwgMHg4NEFGLCAweDg0QjAsIDB4ODRCMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4NEIyLCAweDg0QjMsIDB4ODRCNCwgMHgwMDAwLCAweDg0QjUsIDB4ODRCNiwgMHg4NEI3LCAweDg0QjgsIDB4ODRCOSwgMHg4NEJBLCAweDg0QkIsIDB4ODRCQywgMHg4NEJELCAweDAwMDAsCi0gICAgMHg4NEJFLCAweDg0QkYsIDB4ODRDMCwgMHg4NEMxLCAweDg0QzIsIDB4ODRDMywgMHg4NEM0LCAweDg0QzUsIDB4ODRDNiwgMHg4NEM3LCAweDg0QzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4NEM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NENBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODRDQiwgMHgyMEZBLCAweDMwMDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg0Q0MsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEZDLCAweDMwMEMsIDB4MDAwMCwgMHgyMEZFLCAweDMwMEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTAwLCAweDAwMDAsIDB4MjEwMiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTA0LCAweDIxMDYsIDB4MjEwOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg0Q0QsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODRDRSwgMHg4NENGLCAweDAwMDAsIDB4MDAwMCwgMHg4NEQwLCAweDg0RDEsIDB4ODREMiwgMHg4NEQzLCAweDg0RDQsIDB4ODRENSwgMHg4NEQ2LCAweDg0RDcsIDB4ODREOCwgMHg4NEQ5LCAweDg0REEsIDB4ODREQiwKLSAgICAweDg0REMsIDB4ODRERCwgMHg4NERFLCAweDg0REYsIDB4ODRFMCwgMHg4NEUxLCAweDg0RTIsIDB4ODRFMywgMHg4NEU0LCAweDg0RTUsIDB4ODRFNiwgMHg4NEU3LCAweDg0RTgsIDB4ODRFOSwgMHg4NEVBLCAweDAwMDAsCi0gICAgMHg4NEVCLCAweDg0RUMsIDB4ODRFRCwgMHg4NEVFLCAweDg0RUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxMEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MzAxMiwgMHgzMDE1LCAweDg0RjAsIDB4MjEwQywgMHgwMDAwLCAweDMwMTgsIDB4MzAxQiwgMHg4NEYxLCAweDAwMDAsIDB4MjEwRSwgMHg4NEYyLCAweDg0RjMsIDB4ODRGNCwgMHg4NEY1LCAweDg0RjYsIDB4ODRGNywKLSAgICAweDg0RjgsIDB4ODRGOSwgMHg4NEZBLCAweDg0RkIsIDB4MDAwMCwgMHg4NEZDLCAweDIxMTAsIDB4MDAwMCwgMHgwMDAwLCAweDg0RkQsIDB4ODRGRSwgMHg4NEZGLCAweDg1MDAsIDB4ODUwMSwgMHg4NTAyLCAweDg1MDMsCi0gICAgMHgyMTEyLCAweDMwMUUsIDB4MjExNCwgMHg4NTA0LCAweDg1MDUsIDB4MDAwMCwgMHg4NTA2LCAweDg1MDcsIDB4ODUwOCwgMHgwMDAwLCAweDg1MDksIDB4ODUwQSwgMHg4NTBCLCAweDg1MEMsIDB4ODUwRCwgMHg4NTBFLAotICAgIDB4ODUwRiwgMHg4NTEwLCAweDAwMDAsIDB4ODUxMSwgMHg4NTEyLCAweDg1MTMsIDB4ODUxNCwgMHg4NTE1LCAweDg1MTYsIDB4ODUxNywgMHgwMDAwLCAweDMwMjEsIDB4ODUxOCwgMHg4NTE5LCAweDg1MUEsIDB4ODUxQiwKLSAgICAweDg1MUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NTFELCAweDg1MUUsIDB4ODUxRiwgMHg4NTIwLCAweDg1MjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzMDI0LCAweDMwMjcsIDB4NDAwNSwgMHgzMDJBLCAweDMwMkQsIDB4MzAzMCwgMHgzMDMzLCAweDMwMzYsIDB4MzAzOSwgMHgzMDNDLCAweDMwM0YsIDB4MzA0MiwgMHgzMDQ1LCAweDMwNDgsIDB4MzA0QiwgMHgyMTE2LAotICAgIDB4ODUyMiwgMHgyMTE4LCAweDMwNEUsIDB4MjExQSwgMHg4NTIzLCAweDIxMUMsIDB4MzA1MSwgMHg0MDBBLCAweDIxMUUsIDB4ODUyNCwgMHgyMTIwLCAweDMwNTQsIDB4ODUyNSwgMHg4NTI2LCAweDg1MjcsIDB4ODUyOCwKLSAgICAweDg1MjksIDB4MjEyMiwgMHgzMDU3LCAweDIxMjQsIDB4ODUyQSwgMHgyMTI2LCAweDMwNUEsIDB4NDAwRiwgMHgyMTI4LCAweDg1MkIsIDB4MjEyQSwgMHgzMDVELCAweDg1MkMsIDB4ODUyRCwgMHg4NTJFLCAweDg1MkYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzMDYwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTJDLCAweDIxMkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTMwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTMyLCAweDIxMzQsIDB4MjEzNiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODUzMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1MzEsIDB4MDAwMCwgMHgwMDAwLCAweDg1MzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTM4LCAweDAwMDAsIDB4MjEzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjEzQywgMHgzMDYzLCAweDAwMDAsIDB4MjEzRSwKLSAgICAweDMwNjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDIxNDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxNDIsIDB4MDAwMCwgMHgwMDAwLCAweDIxNDQsIDB4MDAwMCwgMHgyMTQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDIxNDgsIDB4MDAwMCwgMHgyMTRBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjE0QywgMHgyMTRFLCAweDIxNTAsCi0gICAgMHgyMTUyLCAweDIxNTQsIDB4MDAwMCwgMHgwMDAwLCAweDIxNTYsIDB4MjE1OCwgMHgwMDAwLCAweDAwMDAsIDB4MjE1QSwgMHgyMTVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjE1RSwgMHgyMTYwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTYyLCAweDIxNjQsIDB4MDAwMCwgMHgwMDAwLCAweDIxNjYsIDB4MjE2OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTZBLCAweDIxNkMsIDB4MjE2RSwgMHgyMTcwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjE3MiwgMHgyMTc0LCAweDIxNzYsIDB4MjE3OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTdBLCAweDIxN0MsIDB4MjE3RSwgMHgyMTgwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1MzMsIDB4ODUzNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MzA2OSwgMHgzMDZDLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDIxODIsIDB4MjE4NCwgMHgyMTg2LCAweDIxODgsIDB4MjE4QSwgMHgyMThDLCAweDIxOEUsIDB4MjE5MCwKLSAgICAweDMwODEsIDB4MzA4NCwgMHgzMDg3LCAweDMwOEEsIDB4MzA4RCwgMHgzMDkwLCAweDMwOTMsIDB4MzA5NiwgMHgzMDk5LCAweDIxOTIsIDB4MzA5QywgMHgzMDlGLCAweDIxOTQsIDB4MjE5NiwgMHgyMTk4LCAweDIxOUEsCi0gICAgMHgyMTlDLCAweDMwQTIsIDB4ODUzNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODUzNiwgMHg4NTM3LCAweDg1MzgsIDB4ODUzOSwgMHg4NTNBLCAweDg1M0IsIDB4ODUzQywgMHg4NTNELCAweDg1M0UsIDB4MjE5RSwgMHgyMUEwLCAweDIxQTIsIDB4MjFBNCwgMHgyMUE2LCAweDIxQTgsIDB4MjFBQSwKLSAgICAweDIxQUMsIDB4MjFBRSwgMHgyMUIwLCAweDIxQjIsIDB4MzBBNSwgMHgzMEE4LCAweDMwQUIsIDB4MzBBRSwgMHgzMEIxLCAweDMwQjQsIDB4MzBCNywgMHgzMEJBLCAweDMwQkQsIDB4NDAxNCwgMHg0MDE5LCAweDQwMUUsCi0gICAgMHg0MDIzLCAweDQwMjgsIDB4NDAyRCwgMHg0MDMyLCAweDQwMzcsIDB4NDAzQywgMHg0MDQxLCAweDQwNDYsIDB4MjFCNCwgMHgyMUI2LCAweDIxQjgsIDB4MjFCQSwgMHgyMUJDLCAweDIxQkUsIDB4MjFDMCwgMHgyMUMyLAotICAgIDB4MjFDNCwgMHgzMEMwLCAweDMwQzMsIDB4MzBDNiwgMHgzMEM5LCAweDMwQ0MsIDB4MzBDRiwgMHgzMEQyLCAweDMwRDUsIDB4MzBEOCwgMHgzMERCLCAweDMwREUsIDB4MzBFMSwgMHgzMEU0LCAweDMwRTcsIDB4MzBFQSwKLSAgICAweDMwRUQsIDB4MzBGMCwgMHgzMEYzLCAweDMwRjYsIDB4MzBGOSwgMHgzMEZDLCAweDMwRkYsIDB4MzEwMiwgMHgzMTA1LCAweDMxMDgsIDB4MzEwQiwgMHgzMTBFLCAweDMxMTEsIDB4MzExNCwgMHgzMTE3LCAweDMxMUEsCi0gICAgMHgzMTFELCAweDMxMjAsIDB4MzEyMywgMHgzMTI2LCAweDMxMjksIDB4MzEyQywgMHg4NTNGLCAweDg1NDAsIDB4ODU0MSwgMHg4NTQyLCAweDg1NDMsIDB4ODU0NCwgMHg4NTQ1LCAweDg1NDYsIDB4ODU0NywgMHg4NTQ4LAotICAgIDB4ODU0OSwgMHg4NTRBLCAweDg1NEIsIDB4ODU0QywgMHg4NTRELCAweDg1NEUsIDB4ODU0RiwgMHg4NTUwLCAweDg1NTEsIDB4ODU1MiwgMHg4NTUzLCAweDg1NTQsIDB4ODU1NSwgMHg4NTU2LCAweDg1NTcsIDB4ODU1OCwKLSAgICAweDg1NTksIDB4ODU1QSwgMHg4NTVCLCAweDg1NUMsIDB4ODU1RCwgMHg4NTVFLCAweDg1NUYsIDB4ODU2MCwgMHg4NTYxLCAweDg1NjIsIDB4ODU2MywgMHg4NTY0LCAweDg1NjUsIDB4ODU2NiwgMHg4NTY3LCAweDg1NjgsCi0gICAgMHg4NTY5LCAweDg1NkEsIDB4ODU2QiwgMHg4NTZDLCAweDg1NkQsIDB4ODU2RSwgMHg4NTZGLCAweDg1NzAsIDB4ODU3MSwgMHg4NTcyLCAweDg1NzMsIDB4MjFDNiwgMHgyMUM4LCAweDIxQ0EsIDB4MjFDQywgMHgyMUNFLAotICAgIDB4MjFEMCwgMHgyMUQyLCAweDIxRDQsIDB4MjFENiwgMHgyMUQ4LCAweDg1NzQsIDB4ODU3NSwgMHg4NTc2LCAweDg1NzcsIDB4ODU3OCwgMHg4NTc5LCAweDg1N0EsIDB4ODU3QiwgMHg4NTdDLCAweDIxREEsIDB4ODU3RCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1N0UsIDB4ODU3RiwgMHg4NTgwLCAweDg1ODEsIDB4ODU4MiwgMHg4NTgzLCAweDg1ODQsIDB4ODU4NSwgMHg4NTg2LCAweDIxREMsCi0gICAgMHg4NTg3LCAweDg1ODgsIDB4ODU4OSwgMHg4NThBLCAweDg1OEIsIDB4ODU4QywgMHg4NThELCAweDg1OEUsIDB4ODU4RiwgMHgyMURFLCAweDg1OTAsIDB4ODU5MSwgMHg4NTkyLCAweDg1OTMsIDB4ODU5NCwgMHg4NTk1LAotICAgIDB4ODU5NiwgMHg4NTk3LCAweDg1OTgsIDB4MjFFMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDA0QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzEyRiwgMHgyMUUyLCAweDMxMzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxRTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4NTk5LCAweDg1OUEsIDB4ODU5QiwgMHg4NTlDLCAweDg1OUQsIDB4ODU5RSwgMHg4NTlGLCAweDg1QTAsIDB4ODVBMSwgMHg4NUEyLCAweDg1QTMsIDB4ODVBNCwgMHg4NUE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4NUE2LCAweDg1QTcsIDB4ODVBOCwgMHg4NUE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODVBQSwgMHg4NUFCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODVBQywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QUQsCi0gICAgMHg4NUFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODVBRiwgMHgwMDAwLCAweDAwMDAsIDB4ODVCMCwgMHgwMDAwLCAweDg1QjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg1QjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODVCMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QjQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODVCNSwgMHg4NUI2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QjcsIDB4ODVCOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4NUJBLCAweDg1QkIsIDB4ODVCQywgMHg4NUJELCAweDg1QkUsIDB4ODVCRiwgMHg4NUMwLCAweDg1QzEsIDB4ODVDMiwgMHg4NUMzLCAweDg1QzQsIDB4ODVDNSwgMHg4NUM2LCAweDg1QzcsIDB4ODVDOCwgMHg4NUM5LAotICAgIDB4ODVDQSwgMHg4NUNCLCAweDg1Q0MsIDB4ODVDRCwgMHg4NUNFLCAweDg1Q0YsIDB4ODVEMCwgMHg4NUQxLCAweDg1RDIsIDB4ODVEMywgMHg4NUQ0LCAweDg1RDUsIDB4ODVENiwgMHg4NUQ3LCAweDg1RDgsIDB4ODVEOSwKLSAgICAweDg1REEsIDB4ODVEQiwgMHg4NURDLCAweDg1REQsIDB4ODVERSwgMHg4NURGLCAweDg1RTAsIDB4ODVFMSwgMHg4NUUyLCAweDg1RTMsIDB4ODVFNCwgMHg4NUU1LCAweDg1RTYsIDB4ODVFNywgMHg4NUU4LCAweDg1RTksCi0gICAgMHg4NUVBLCAweDg1RUIsIDB4ODVFQywgMHg4NUVELCAweDg1RUUsIDB4ODVFRiwgMHg4NUYwLCAweDg1RjEsIDB4ODVGMiwgMHg4NUYzLCAweDg1RjQsIDB4ODVGNSwgMHg4NUY2LCAweDg1RjcsIDB4ODVGOCwgMHg4NUY5LAotICAgIDB4ODVGQSwgMHg4NUZCLCAweDg1RkMsIDB4ODVGRCwgMHg4NUZFLCAweDg1RkYsIDB4ODYwMCwgMHg4NjAxLCAweDg2MDIsIDB4ODYwMywgMHg4NjA0LCAweDg2MDUsIDB4ODYwNiwgMHg4NjA3LCAweDg2MDgsIDB4ODYwOSwKLSAgICAweDg2MEEsIDB4ODYwQiwgMHg4NjBDLCAweDg2MEQsIDB4ODYwRSwgMHg4NjBGLCAweDg2MTAsIDB4ODYxMSwgMHg4NjEyLCAweDg2MTMsIDB4ODYxNCwgMHg4NjE1LCAweDg2MTYsIDB4ODYxNywgMHg4NjE4LCAweDg2MTksCi0gICAgMHg4NjFBLCAweDg2MUIsIDB4ODYxQywgMHg4NjFELCAweDg2MUUsIDB4ODYxRiwgMHg4NjIwLCAweDg2MjEsIDB4ODYyMiwgMHg4NjIzLCAweDg2MjQsIDB4ODYyNSwgMHg4NjI2LCAweDg2MjcsIDB4ODYyOCwgMHg4NjI5LAotICAgIDB4ODYyQSwgMHg4NjJCLCAweDg2MkMsIDB4ODYyRCwgMHg4NjJFLCAweDg2MkYsIDB4ODYzMCwgMHg4NjMxLCAweDg2MzIsIDB4ODYzMywgMHg4NjM0LCAweDg2MzUsIDB4ODYzNiwgMHg4NjM3LCAweDg2MzgsIDB4ODYzOSwKLSAgICAweDg2M0EsIDB4ODYzQiwgMHg4NjNDLCAweDg2M0QsIDB4ODYzRSwgMHg4NjNGLCAweDg2NDAsIDB4ODY0MSwgMHg4NjQyLCAweDg2NDMsIDB4ODY0NCwgMHg4NjQ1LCAweDg2NDYsIDB4ODY0NywgMHg4NjQ4LCAweDg2NDksCi0gICAgMHg4NjRBLCAweDg2NEIsIDB4ODY0QywgMHg4NjRELCAweDg2NEUsIDB4ODY0RiwgMHg4NjUwLCAweDg2NTEsIDB4ODY1MiwgMHg4NjUzLCAweDg2NTQsIDB4ODY1NSwgMHg4NjU2LCAweDg2NTcsIDB4ODY1OCwgMHg4NjU5LAotICAgIDB4ODY1QSwgMHg4NjVCLCAweDg2NUMsIDB4ODY1RCwgMHg4NjVFLCAweDg2NUYsIDB4ODY2MCwgMHg4NjYxLCAweDg2NjIsIDB4ODY2MywgMHg4NjY0LCAweDg2NjUsIDB4ODY2NiwgMHg4NjY3LCAweDg2NjgsIDB4ODY2OSwKLSAgICAweDg2NkEsIDB4ODY2QiwgMHg4NjZDLCAweDg2NkQsIDB4ODY2RSwgMHg4NjZGLCAweDg2NzAsIDB4ODY3MSwgMHg4NjcyLCAweDg2NzMsIDB4ODY3NCwgMHg4Njc1LCAweDg2NzYsIDB4ODY3NywgMHg4Njc4LCAweDg2NzksCi0gICAgMHg4NjdBLCAweDg2N0IsIDB4ODY3QywgMHg4NjdELCAweDg2N0UsIDB4ODY3RiwgMHg4NjgwLCAweDg2ODEsIDB4ODY4MiwgMHg4NjgzLCAweDg2ODQsIDB4ODY4NSwgMHg4Njg2LCAweDg2ODcsIDB4ODY4OCwgMHg4Njg5LAotICAgIDB4ODY4QSwgMHg4NjhCLCAweDg2OEMsIDB4ODY4RCwgMHg4NjhFLCAweDg2OEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODY5MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODY5MSwgMHgwMDAwLCAweDg2OTIsIDB4ODY5MywgMHg4Njk0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxRTYsIDB4MDAwMCwgMHgyMUU4LCAweDAwMDAsCi0gICAgMHgyMUVBLCAweDAwMDAsIDB4MjFFQywgMHgwMDAwLCAweDIxRUUsIDB4MDAwMCwgMHgyMUYwLCAweDAwMDAsIDB4MjFGMiwgMHgwMDAwLCAweDIxRjQsIDB4MDAwMCwgMHgyMUY2LCAweDAwMDAsIDB4MjFGOCwgMHgwMDAwLAotICAgIDB4MjFGQSwgMHgwMDAwLCAweDIxRkMsIDB4MDAwMCwgMHgwMDAwLCAweDIxRkUsIDB4MDAwMCwgMHgyMjAwLCAweDAwMDAsIDB4MjIwMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDIyMDQsIDB4MjIwNiwgMHgwMDAwLCAweDIyMDgsIDB4MjIwQSwgMHgwMDAwLCAweDIyMEMsIDB4MjIwRSwgMHgwMDAwLCAweDIyMTAsIDB4MjIxMiwgMHgwMDAwLCAweDIyMTQsIDB4MjIxNiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMjE4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIyMUEsIDB4MjIxQywgMHgwMDAwLCAweDIyMUUsIDB4MjIyMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIyMjIsIDB4MDAwMCwgMHgyMjI0LCAweDAwMDAsCi0gICAgMHgyMjI2LCAweDAwMDAsIDB4MjIyOCwgMHgwMDAwLCAweDIyMkEsIDB4MDAwMCwgMHgyMjJDLCAweDAwMDAsIDB4MjIyRSwgMHgwMDAwLCAweDIyMzAsIDB4MDAwMCwgMHgyMjMyLCAweDAwMDAsIDB4MjIzNCwgMHgwMDAwLAotICAgIDB4MjIzNiwgMHgwMDAwLCAweDIyMzgsIDB4MDAwMCwgMHgwMDAwLCAweDIyM0EsIDB4MDAwMCwgMHgyMjNDLCAweDAwMDAsIDB4MjIzRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDIyNDAsIDB4MjI0MiwgMHgwMDAwLCAweDIyNDQsIDB4MjI0NiwgMHgwMDAwLCAweDIyNDgsIDB4MjI0QSwgMHgwMDAwLCAweDIyNEMsIDB4MjI0RSwgMHgwMDAwLCAweDIyNTAsIDB4MjI1MiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMjU0LCAweDAwMDAsIDB4MDAwMCwgMHgyMjU2LCAweDIyNTgsIDB4MjI1QSwgMHgyMjVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIyNUUsIDB4MjI2MCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODY5NSwgMHg4Njk2LCAweDg2OTcsIDB4ODY5OCwgMHg4Njk5LCAweDg2OUEsIDB4ODY5QiwgMHg4NjlDLCAweDg2OUQsIDB4ODY5RSwgMHg4NjlGLCAweDg2QTAsIDB4ODZBMSwgMHg4NkEyLCAweDg2QTMsCi0gICAgMHg4NkE0LCAweDg2QTUsIDB4ODZBNiwgMHg4NkE3LCAweDg2QTgsIDB4ODZBOSwgMHg4NkFBLCAweDg2QUIsIDB4ODZBQywgMHg4NkFELCAweDg2QUUsIDB4ODZBRiwgMHg4NkIwLCAweDg2QjEsIDB4ODZCMiwgMHg4NkIzLAotICAgIDB4ODZCNCwgMHg4NkI1LCAweDg2QjYsIDB4ODZCNywgMHg4NkI4LCAweDg2QjksIDB4ODZCQSwgMHg4NkJCLCAweDg2QkMsIDB4ODZCRCwgMHg4NkJFLCAweDg2QkYsIDB4ODZDMCwgMHg4NkMxLCAweDg2QzIsIDB4ODZDMywKLSAgICAweDg2QzQsIDB4ODZDNSwgMHg4NkM2LCAweDg2QzcsIDB4ODZDOCwgMHg4NkM5LCAweDg2Q0EsIDB4ODZDQiwgMHg4NkNDLCAweDg2Q0QsIDB4ODZDRSwgMHg4NkNGLCAweDg2RDAsIDB4ODZEMSwgMHg4NkQyLCAweDg2RDMsCi0gICAgMHg4NkQ0LCAweDg2RDUsIDB4ODZENiwgMHg4NkQ3LCAweDg2RDgsIDB4ODZEOSwgMHg4NkRBLCAweDg2REIsIDB4ODZEQywgMHg4NkRELCAweDg2REUsIDB4ODZERiwgMHg4NkUwLCAweDg2RTEsIDB4ODZFMiwgMHg4NkUzLAotICAgIDB4ODZFNCwgMHg4NkU1LCAweDg2RTYsIDB4ODZFNywgMHg4NkU4LCAweDg2RTksIDB4ODZFQSwgMHg4NkVCLCAweDg2RUMsIDB4ODZFRCwgMHg4NkVFLCAweDg2RUYsIDB4ODZGMCwgMHg4NkYxLCAweDg2RjIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4NkYzLCAweDg2RjQsIDB4ODZGNSwgMHg4NkY2LCAweDg2RjcsIDB4ODZGOCwgMHg4NkY5LCAweDg2RkEsIDB4ODZGQiwgMHg4NkZDLCAweDg2RkQsIDB4ODZGRSwgMHg4NkZGLCAweDg3MDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzMTM1LCAweDMxMzgsIDB4MzEzQiwgMHgzMTNFLCAweDMxNDEsIDB4MzE0NCwgMHgzMTQ3LCAweDMxNEEsIDB4MzE0RCwgMHgzMTUwLCAweDMxNTMsIDB4MzE1NiwgMHgzMTU5LCAweDMxNUMsIDB4NDA1MCwgMHg0MDU1LAotICAgIDB4NDA1QSwgMHg0MDVGLCAweDQwNjQsIDB4NDA2OSwgMHg0MDZFLCAweDQwNzMsIDB4NDA3OCwgMHg0MDdELCAweDQwODIsIDB4NDA4NywgMHg0MDhDLCAweDQwOTEsIDB4NDA5NiwgMHg0MDlCLCAweDQwQTMsIDB4MDAwMCwKLSAgICAweDMxNUYsIDB4MzE2MiwgMHgzMTY1LCAweDMxNjgsIDB4MzE2QiwgMHgzMTZFLCAweDMxNzEsIDB4MzE3NCwgMHgzMTc3LCAweDMxN0EsIDB4MzE3RCwgMHgzMTgwLCAweDMxODMsIDB4MzE4NiwgMHgzMTg5LCAweDMxOEMsCi0gICAgMHgzMThGLCAweDMxOTIsIDB4MzE5NSwgMHgzMTk4LCAweDMxOUIsIDB4MzE5RSwgMHgzMUExLCAweDMxQTQsIDB4MzFBNywgMHgzMUFBLCAweDMxQUQsIDB4MzFCMCwgMHgzMUIzLCAweDMxQjYsIDB4MzFCOSwgMHgzMUJDLAotICAgIDB4MzFCRiwgMHgzMUMyLCAweDMxQzUsIDB4MzFDOCwgMHg4NzAxLCAweDg3MDIsIDB4ODcwMywgMHg4NzA0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDMxQ0IsIDB4MjI2MiwgMHgyMjY0LCAweDIyNjYsIDB4MjI2OCwgMHgyMjZBLCAweDIyNkMsIDB4MjI2RSwgMHgyMjcwLCAweDIyNzIsIDB4MjI3NCwgMHgyMjc2LCAweDIyNzgsIDB4MjI3QSwgMHgyMjdDLCAweDIyN0UsCi0gICAgMHg4NzA1LCAweDg3MDYsIDB4ODcwNywgMHg4NzA4LCAweDg3MDksIDB4ODcwQSwgMHg4NzBCLCAweDg3MEMsIDB4ODcwRCwgMHg4NzBFLCAweDg3MEYsIDB4ODcxMCwgMHg4NzExLCAweDg3MTIsIDB4MjI4MCwgMHgyMjgyLAotICAgIDB4MjI4NCwgMHgyMjg2LCAweDIyODgsIDB4MjI4QSwgMHgyMjhDLCAweDIyOEUsIDB4MjI5MCwgMHgyMjkyLCAweDIyOTQsIDB4MjI5NiwgMHgyMjk4LCAweDIyOUEsIDB4NDBBQSwgMHg0MEIwLCAweDIyOUMsIDB4MDAwMCwKLSAgICAweDg3MTMsIDB4ODcxNCwgMHg4NzE1LCAweDg3MTYsIDB4ODcxNywgMHg4NzE4LCAweDg3MTksIDB4ODcxQSwgMHg4NzFCLCAweDg3MUMsIDB4ODcxRCwgMHg4NzFFLCAweDg3MUYsIDB4ODcyMCwgMHg4NzIxLCAweDg3MjIsCi0gICAgMHg4NzIzLCAweDg3MjQsIDB4ODcyNSwgMHg4NzI2LCAweDg3MjcsIDB4ODcyOCwgMHg4NzI5LCAweDg3MkEsIDB4ODcyQiwgMHg4NzJDLCAweDg3MkQsIDB4ODcyRSwgMHg4NzJGLCAweDg3MzAsIDB4ODczMSwgMHg4NzMyLAotICAgIDB4ODczMywgMHg4NzM0LCAweDg3MzUsIDB4ODczNiwgMHg4NzM3LCAweDg3MzgsIDB4ODczOSwgMHg4NzNBLCAweDg3M0IsIDB4ODczQywgMHg4NzNELCAweDg3M0UsIDB4ODczRiwgMHg4NzQwLCAweDg3NDEsIDB4ODc0MiwKLSAgICAweDg3NDMsIDB4MjI5RSwgMHgyMkEwLCAweDIyQTIsIDB4MjJBNCwgMHgyMkE2LCAweDIyQTgsIDB4MjJBQSwgMHgyMkFDLCAweDIyQUUsIDB4MjJCMCwgMHgyMkIyLCAweDIyQjQsIDB4MjJCNiwgMHgyMkI4LCAweDIyQkEsCi0gICAgMHgyMkJDLCAweDIyQkUsIDB4MjJDMCwgMHgyMkMyLCAweDIyQzQsIDB4MjJDNiwgMHgyMkM4LCAweDIyQ0EsIDB4MjJDQywgMHgzMUNFLCAweDMxRDEsIDB4MzFENCwgMHgyMkNFLCAweDMxRDcsIDB4MjJEMCwgMHgzMURBLAotICAgIDB4ODc0NCwgMHg4NzQ1LCAweDg3NDYsIDB4ODc0NywgMHg4NzQ4LCAweDg3NDksIDB4ODc0QSwgMHg4NzRCLCAweDg3NEMsIDB4ODc0RCwgMHg4NzRFLCAweDg3NEYsIDB4ODc1MCwgMHg4NzUxLCAweDg3NTIsIDB4ODc1MywKLSAgICAweDg3NTQsIDB4ODc1NSwgMHg4NzU2LCAweDg3NTcsIDB4ODc1OCwgMHg4NzU5LCAweDg3NUEsIDB4ODc1QiwgMHg4NzVDLCAweDg3NUQsIDB4ODc1RSwgMHg4NzVGLCAweDg3NjAsIDB4ODc2MSwgMHg4NzYyLCAweDg3NjMsCi0gICAgMHg4NzY0LCAweDg3NjUsIDB4ODc2NiwgMHg4NzY3LCAweDg3NjgsIDB4ODc2OSwgMHg4NzZBLCAweDg3NkIsIDB4ODc2QywgMHg4NzZELCAweDg3NkUsIDB4ODc2RiwgMHg4NzcwLCAweDg3NzEsIDB4ODc3MiwgMHgwMDAwLAotICAgIDB4NDBCNSwgMHg0MEJBLCAweDQwQkYsIDB4MzFERCwgMHg0MEM0LCAweDMxRTAsIDB4MzFFMywgMHg0MEM5LCAweDQwQ0YsIDB4MzFFNiwgMHgzMUU5LCAweDMxRUMsIDB4NDBENCwgMHg0MEQ5LCAweDMxRUYsIDB4MzFGMiwKLSAgICAweDIyRDIsIDB4MzFGNSwgMHg0MERFLCAweDQwRTMsIDB4MjJENCwgMHg0MEU4LCAweDQwRUUsIDB4NDBGNSwgMHgzMUY4LCAweDQwRkIsIDB4NDEwMSwgMHg0MTA3LCAweDMxRkIsIDB4MzFGRSwgMHgzMjAxLCAweDQxMEMsCi0gICAgMHg0MTExLCAweDQxMTcsIDB4MzIwNCwgMHgzMjA3LCAweDMyMEEsIDB4MjJENiwgMHgyMkQ4LCAweDIyREEsIDB4MjJEQywgMHgzMjBELCAweDMyMTAsIDB4NDExQywgMHgzMjEzLCAweDQxMjIsIDB4NDEyNywgMHgzMjE2LAotICAgIDB4MjJERSwgMHgyMkUwLCAweDQxMkQsIDB4NDEzMywgMHg0MTM4LCAweDMyMTksIDB4NDEzRSwgMHgyMkUyLCAweDMyMUMsIDB4MzIxRiwgMHgzMjIyLCAweDMyMjUsIDB4MzIyOCwgMHg0MTQ0LCAweDMyMkIsIDB4MjJFNCwKLSAgICAweDMyMkUsIDB4MzIzMSwgMHgzMjM0LCAweDQxNDksIDB4MzIzNywgMHgzMjNBLCAweDMyM0QsIDB4NDE0RSwgMHg0MTU0LCAweDIyRTYsIDB4NDE1OSwgMHgyMkU4LCAweDQxNUYsIDB4NDE2NCwgMHgzMjQwLCAweDMyNDMsCi0gICAgMHgzMjQ2LCAweDQxNjksIDB4MjJFQSwgMHgzMjQ5LCAweDQxNkUsIDB4MjJFQywgMHg0MTczLCAweDMyNEMsIDB4MjJFRSwgMHgyMkYwLCAweDIyRjIsIDB4MjJGNCwgMHgyMkY2LCAweDIyRjgsIDB4MjJGQSwgMHgyMkZDLAotICAgIDB4MjJGRSwgMHgyMzAwLCAweDMyNEYsIDB4MzI1MiwgMHgzMjU1LCAweDMyNTgsIDB4MzI1QiwgMHgzMjVFLCAweDMyNjEsIDB4MzI2NCwgMHgzMjY3LCAweDMyNkEsIDB4MzI2RCwgMHgzMjcwLCAweDMyNzMsIDB4MzI3NiwKLSAgICAweDMyNzksIDB4MzI3QywgMHgyMzAyLCAweDIzMDQsIDB4MzI3RiwgMHgyMzA2LCAweDIzMDgsIDB4MjMwQSwgMHgzMjgyLCAweDMyODUsIDB4MjMwQywgMHgyMzBFLCAweDIzMTAsIDB4MjMxMiwgMHgyMzE0LCAweDQxNzksCi0gICAgMHgyMzE2LCAweDIzMTgsIDB4MjMxQSwgMHgyMzFDLCAweDIzMUUsIDB4MjMyMCwgMHgyMzIyLCAweDIzMjQsIDB4MzI4OCwgMHg0MTdFLCAweDIzMjYsIDB4MjMyOCwgMHgyMzJBLCAweDIzMkMsIDB4MjMyRSwgMHgyMzMwLAotICAgIDB4MjMzMiwgMHgzMjhCLCAweDMyOEUsIDB4MzI5MSwgMHgzMjk0LCAweDIzMzQsIDB4MjMzNiwgMHgyMzM4LCAweDIzM0EsIDB4MjMzQywgMHgyMzNFLCAweDIzNDAsIDB4MjM0MiwgMHgyMzQ0LCAweDIzNDYsIDB4MzI5NywKLSAgICAweDMyOUEsIDB4MjM0OCwgMHgzMjlELCAweDMyQTAsIDB4MzJBMywgMHgyMzRBLCAweDMyQTYsIDB4MzJBOSwgMHg0MTgzLCAweDIzNEMsIDB4MzJBQywgMHgzMkFGLCAweDMyQjIsIDB4MzJCNSwgMHg0MTg4LCAweDQxOEUsCi0gICAgMHgyMzRFLCAweDIzNTAsIDB4MjM1MiwgMHgyMzU0LCAweDIzNTYsIDB4MjM1OCwgMHgyMzVBLCAweDIzNUMsIDB4MjM1RSwgMHgyMzYwLCAweDIzNjIsIDB4MjM2NCwgMHgyMzY2LCAweDIzNjgsIDB4MjM2QSwgMHgyMzZDLAotICAgIDB4MjM2RSwgMHgyMzcwLCAweDQxOTUsIDB4MjM3MiwgMHgyMzc0LCAweDIzNzYsIDB4NDE5QSwgMHgzMkI4LCAweDIzNzgsIDB4MjM3QSwgMHgyMzdDLCAweDIzN0UsIDB4MjM4MCwgMHgyMzgyLCAweDIzODQsIDB4MjM4NiwKLSAgICAweDIzODgsIDB4MjM4QSwgMHgzMkJCLCAweDIzOEMsIDB4MjM4RSwgMHgzMkJFLCAweDMyQzEsIDB4MjM5MCwgMHg0MTlGLCAweDMyQzQsIDB4MjM5MiwgMHgyMzk0LCAweDIzOTYsIDB4MjM5OCwgMHgzMkM3LCAweDMyQ0EsCi0gICAgMHgyMzlBLCAweDIzOUMsIDB4MjM5RSwgMHgyM0EwLCAweDIzQTIsIDB4MjNBNCwgMHgyM0E2LCAweDIzQTgsIDB4MjNBQSwgMHgzMkNELCAweDMyRDAsIDB4MzJEMywgMHgzMkQ2LCAweDMyRDksIDB4MzJEQywgMHgzMkRGLAotICAgIDB4MzJFMiwgMHgzMkU1LCAweDMyRTgsIDB4MzJFQiwgMHgzMkVFLCAweDMyRjEsIDB4MzJGNCwgMHgzMkY3LCAweDMyRkEsIDB4MzJGRCwgMHgzMzAwLCAweDMzMDMsIDB4MzMwNiwgMHgzMzA5LCAweDMzMEMsIDB4MzMwRiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3NzMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzc0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzc1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzc2LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODc3NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3NzksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3N0EsIDB4ODc3QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzdDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODc3RiwgMHg4NzgwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODc4MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4NzgyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzgzLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzg0LCAweDAwMDAsIDB4ODc4NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4Nzg2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzg3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc4OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzg5LCAweDg3OEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzhCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg3OEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzhELCAweDAwMDAsIDB4ODc4RSwgMHg4NzhGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3OTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzkxLCAweDAwMDAsIDB4ODc5MiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3OTMsIDB4ODc5NCwgMHg4Nzk1LCAweDAwMDAsIDB4ODc5NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzk3LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODc5OCwgMHgwMDAwLCAweDAwMDAsIDB4ODc5OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzlBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4NzlCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3OUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzlELCAweDAwMDAsIDB4MDAwMCwgMHg4NzlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg3OUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0EwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODdBMSwgMHgwMDAwLCAweDg3QTIsIDB4MDAwMCwgMHg4N0EzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdBNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg3QTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdBNiwgMHg4N0E3LCAweDAwMDAsIDB4MDAwMCwgMHg4N0E4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QTksCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3QUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0FDLCAweDAwMDAsIDB4MDAwMCwgMHg4N0FELCAweDg3QUUsIDB4ODdBRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdCMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODdCMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0I0LCAweDAwMDAsIDB4ODdCNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4N0I3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QjgsIDB4ODdCOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0JBLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4N0JDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0JFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QkYsIDB4MDAwMCwgMHgwMDAwLCAweDg3QzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdDMSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QzIsIDB4MDAwMCwgMHg4N0MzLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0M0LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QzUsIDB4ODdDNiwgMHgwMDAwLCAweDg3QzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdDOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0M5LCAweDAwMDAsIDB4ODdDQSwgMHg4N0NCLCAweDAwMDAsIDB4ODdDQywgMHg4N0NELCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODdDRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODdDRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdEMCwgMHgwMDAwLCAweDg3RDEsIDB4MDAwMCwgMHg4N0QyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RDMsIDB4ODdENCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3RDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODdENiwgMHgwMDAwLCAweDg3RDcsIDB4MDAwMCwgMHg4N0Q4LCAweDAwMDAsIDB4MDAwMCwgMHg4N0Q5LCAweDAwMDAsIDB4MDAwMCwgMHg4N0RBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdEQiwgMHgwMDAwLCAweDg3REMsCi0gICAgMHgwMDAwLCAweDg3REQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODdERSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdERiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFMCwgMHgwMDAwLCAweDg3RTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0UyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0UzLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0U0LCAweDAwMDAsIDB4ODdFNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0U2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0U3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0U4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFOSwgMHgwMDAwLCAweDAwMDAsIDB4ODdFQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0VCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg3RUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0VELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0VGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0YwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RjEsIDB4ODdGMiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdGMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RjQsIDB4MDAwMCwgMHg4N0Y1LCAweDAwMDAsIDB4ODdGNiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3RjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RjgsIDB4ODdGOSwgMHgwMDAwLCAweDAwMDAsIDB4ODdGQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0ZCLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0ZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODAxLCAweDAwMDAsIDB4ODgwMiwgMHg4ODAzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgwNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODA2LCAweDg4MDcsCi0gICAgMHg4ODA4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgwOSwgMHgwMDAwLCAweDAwMDAsIDB4ODgwQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MEIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4ODBDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgwRSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4ODBGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgxMCwgMHg4ODExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODEyLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4MTMsIDB4MDAwMCwgMHg4ODE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg4MTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgxNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4ODE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgxQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODFCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgxQywgMHgwMDAwLCAweDg4MUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODFFLCAweDg4MUYsIDB4ODgyMCwgMHgwMDAwLCAweDg4MjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4ODIyLCAweDg4MjMsIDB4ODgyNCwgMHgwMDAwLCAweDAwMDAsIDB4ODgyNSwgMHgwMDAwLCAweDAwMDAsIDB4ODgyNiwgMHg4ODI3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4ODI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgyOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MkIsIDB4MDAwMCwgMHg4ODJDLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODJELCAweDg4MkUsIDB4MDAwMCwgMHgwMDAwLCAweDg4MkYsIDB4MDAwMCwgMHg4ODMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg4MzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODMzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgzNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MzUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgzNiwKLSAgICAweDAwMDAsIDB4ODgzNywgMHgwMDAwLCAweDAwMDAsIDB4ODgzOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MzksIDB4ODgzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODNCLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4M0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODNELCAweDAwMDAsIDB4MDAwMCwgMHg4ODNFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODNGLCAweDAwMDAsIDB4ODg0MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0NSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NDcsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0QSwgMHg4ODRCLCAweDg4NEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0RCwgMHg4ODRFLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4NEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg1MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg1MSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg1MiwgMHgwMDAwLCAweDg4NTMsIDB4ODg1NCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg4NTUsIDB4MDAwMCwgMHg4ODU2LCAweDAwMDAsIDB4MDAwMCwgMHg4ODU3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg1OCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg4NTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NUEsIDB4MDAwMCwgMHg4ODVCLCAweDg4NUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg1RCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg1RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NUYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NjAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODg2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODY1LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NjcsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODY4LCAweDg4NjksIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2RCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODZFLCAweDAwMDAsIDB4MDAwMCwgMHg4ODZGLCAweDg4NzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODcxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4ODcyLCAweDAwMDAsIDB4MDAwMCwgMHg4ODczLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODc0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg4NzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODc2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODc3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODc4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODdBLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3QiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4N0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3RCwgMHg4ODdFLCAweDAwMDAsIDB4ODg3RiwgMHgwMDAwLCAweDg4ODAsIDB4ODg4MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODgyLCAweDg4ODMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4ODQsIDB4ODg4NSwgMHgwMDAwLCAweDAwMDAsIDB4ODg4NiwgMHgwMDAwLCAweDg4ODcsIDB4ODg4OCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4ODksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg4QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODhCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODg4RCwgMHgwMDAwLCAweDg4OEUsIDB4MDAwMCwgMHgwMDAwLCAweDg4OEYsIDB4ODg5MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODkxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4ODkyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OTMsIDB4MDAwMCwgMHg4ODk0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OTUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODk2LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg5NywgMHgwMDAwLCAweDg4OTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODg5OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4ODlBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg4OUIsIDB4MDAwMCwgMHgwMDAwLCAweDg4OUMsIDB4MDAwMCwgMHgwMDAwLCAweDg4OUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODlFLCAweDAwMDAsIDB4MDAwMCwgMHg4ODlGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg4QTAsIDB4MDAwMCwgMHg4OEExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhBMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEEzLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhBNSwgMHgwMDAwLCAweDg4QTYsIDB4MDAwMCwgMHg4OEE3LCAweDg4QTgsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OEFBLCAweDAwMDAsIDB4ODhBQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODhBQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QUYsIDB4MDAwMCwgMHgwMDAwLCAweDg4QjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4OEIxLCAweDAwMDAsIDB4MDAwMCwgMHg4OEIyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEIzLCAweDg4QjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhCNSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEI3LCAweDg4QjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhCQSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhCQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODhCQywgMHg4OEJELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QkYsIDB4MDAwMCwgMHgwMDAwLCAweDg4QzAsIDB4MDAwMCwgMHg4OEMxLAotICAgIDB4ODhDMiwgMHg4OEMzLCAweDg4QzQsIDB4ODhDNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhDNiwgMHgwMDAwLCAweDAwMDAsIDB4ODhDNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4QzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OENBLCAweDAwMDAsIDB4ODhDQiwgMHgwMDAwLCAweDg4Q0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4Q0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhDRSwgMHgwMDAwLCAweDg4Q0YsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhEMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg4RDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhEMywgMHgwMDAwLAotICAgIDB4ODhENCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhENSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhEQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhEQiwgMHg4OERDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg4REQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4OERFLCAweDg4REYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhFMSwgMHg4OEUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhFNCwgMHgwMDAwLCAweDAwMDAsIDB4ODhFNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEU2LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhFNywgMHgwMDAwLCAweDg4RTgsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RTksIDB4MDAwMCwgMHg4OEVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhFQiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhFRCwgMHg4OEVFLCAweDAwMDAsIDB4MDAwMCwgMHg4OEVGLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEYwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4RjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEYzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg4RjQsIDB4ODhGNSwgMHg4OEY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGQSwgMHgwMDAwLCAweDAwMDAsIDB4ODhGQiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4RkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGRSwgMHgwMDAwLCAweDg4RkYsIDB4MDAwMCwgMHgwMDAwLCAweDg5MDAsIDB4ODkwMSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTAyLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkwMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTA1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MDYsIDB4ODkwNywgMHg4OTA4LCAweDAwMDAsIDB4ODkwOSwgMHgwMDAwLCAweDg5MEEsIDB4MDAwMCwgMHg4OTBCLCAweDAwMDAsCi0gICAgMHg4OTBDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTBFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkwRiwgMHgwMDAwLCAweDg5MTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4OTExLCAweDAwMDAsIDB4ODkxMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTEzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkxNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MTUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MTYsIDB4MDAwMCwgMHgwMDAwLCAweDg5MTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTE4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTE5LCAweDg5MUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkxQiwgMHgwMDAwLCAweDg5MUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODkxRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODkxRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkxRiwgMHg4OTIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyMSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyMiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTIzLCAweDg5MjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4OTI2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyNywgMHgwMDAwLCAweDAwMDAsIDB4ODkyOCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjksCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTJBLCAweDAwMDAsIDB4MDAwMCwgMHg4OTJCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg5MkUsIDB4MDAwMCwgMHgwMDAwLCAweDg5MkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MzAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTMxLCAweDAwMDAsIDB4ODkzMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5MzQsIDB4ODkzNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MzYsIDB4MDAwMCwgMHgwMDAwLCAweDg5MzcsIDB4ODkzOCwKLSAgICAweDAwMDAsIDB4ODkzOSwgMHgwMDAwLCAweDAwMDAsIDB4ODkzQSwgMHgwMDAwLCAweDAwMDAsIDB4ODkzQiwgMHgwMDAwLCAweDAwMDAsIDB4ODkzQywgMHg4OTNELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5M0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5M0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODk0MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk0MSwgMHgwMDAwLCAweDAwMDAsIDB4ODk0MiwKLSAgICAweDg5NDMsIDB4ODk0NCwgMHg4OTQ1LCAweDAwMDAsIDB4ODk0NiwgMHgwMDAwLCAweDAwMDAsIDB4ODk0NywgMHgwMDAwLCAweDAwMDAsIDB4ODk0OCwgMHg4OTQ5LCAweDg5NEEsIDB4MDAwMCwgMHg4OTRCLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NEMsIDB4MDAwMCwgMHg4OTRELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTRFLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTRGLCAweDAwMDAsIDB4ODk1MCwgMHgwMDAwLCAweDAwMDAsIDB4ODk1MSwgMHgwMDAwLCAweDg5NTIsIDB4ODk1MywgMHg4OTU0LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTU1LCAweDg5NTYsIDB4ODk1NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk1OCwgMHgwMDAwLCAweDg5NTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk1QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk1QiwgMHg4OTVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NUQsIDB4MDAwMCwgMHgwMDAwLCAweDg5NUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTVGLCAweDg5NjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjgsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2OSwgMHg4OTZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg5NkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTZGLCAweDAwMDAsIDB4ODk3MCwgMHg4OTcxLCAweDAwMDAsIDB4ODk3MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4OTc0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTc2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTc5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg5N0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3QywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5N0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5N0YsIDB4MDAwMCwgMHg4OTgwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5ODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4MiwgMHg4OTgzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4NCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODk4NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4NywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTg5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OThCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OThDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OThFLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OThGLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OTAsIDB4MDAwMCwgMHg4OTkxLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OTMsIDB4MDAwMCwgMHgwMDAwLCAweDg5OTQsIDB4ODk5NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk5NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODk5NywgMHg4OTk4LCAweDAwMDAsIDB4MDAwMCwgMHg4OTk5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTlBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTlCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk5QywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk5RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTlFLCAweDg5OUYsIDB4ODlBMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlBMSwgMHgwMDAwLCAweDAwMDAsIDB4ODlBMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlBMywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OUE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4OUE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUE3LCAweDAwMDAsIDB4ODlBOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlBOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QUEsIDB4MDAwMCwgMHgwMDAwLCAweDg5QUIsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODlBQywgMHg4OUFELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlBRSwgMHg4OUFGLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlCMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QjEsIDB4MDAwMCwgMHgwMDAwLCAweDg5QjIsIDB4MDAwMCwgMHgwMDAwLCAweDg5QjMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QjYsIDB4ODlCNywgMHgwMDAwLCAweDg5QjgsIDB4ODlCOSwgMHg4OUJBLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QkIsIDB4MDAwMCwgMHg4OUJDLCAweDg5QkQsIDB4MDAwMCwgMHg4OUJFLCAweDg5QkYsIDB4ODlDMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUMyLCAweDAwMDAsIDB4ODlDMywgMHg4OUM0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUM3LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5QzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlDOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5Q0EsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg5Q0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5Q0MsCi0gICAgMHgwMDAwLCAweDg5Q0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5Q0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUNGLCAweDg5RDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlEMSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlEMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlEMywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RDUsIDB4MDAwMCwgMHgwMDAwLCAweDg5RDYsIDB4ODlENywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OUQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlEOSwgMHgwMDAwLCAweDg5REEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4OURCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OURDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OURELAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5REUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlERiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFMSwgMHg4OUUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RTYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5RTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4OUU4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUVCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODlFRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RjAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RjEsIDB4MDAwMCwgMHg4OUYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUYzLCAweDg5RjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGNiwgMHgwMDAwLCAweDg5RjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OUY4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGQiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUZELCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGRiwgMHg4QTAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTAyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMDMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMDcsIDB4OEEwOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTA5LCAweDAwMDAsIDB4OEEwQSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMEIsIDB4MDAwMCwgMHgwMDAwLCAweDhBMEMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEEwRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEwRSwgMHgwMDAwLCAweDAwMDAsIDB4OEEwRiwgMHgwMDAwLCAweDAwMDAsIDB4OEExMCwgMHg4QTExLAotICAgIDB4MDAwMCwgMHg4QTEyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTEzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEExNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEExNSwgMHg4QTE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBMTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEExQSwKLSAgICAweDAwMDAsIDB4OEExQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhBMUMsIDB4MDAwMCwgMHgwMDAwLCAweDhBMUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEExRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTFGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEyMCwKLSAgICAweDhBMjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMjIsCi0gICAgMHg4QTIzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTI0LCAweDhBMjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEEyNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTI3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhBMjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEyOSwgMHgwMDAwLCAweDhBMkEsIDB4MDAwMCwgMHgwMDAwLCAweDhBMkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTJDLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QTJELCAweDAwMDAsIDB4OEEyRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTJGLCAweDAwMDAsIDB4MDAwMCwgMHg4QTMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMzEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEEzNCwgMHg4QTM1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTM2LCAweDAwMDAsIDB4OEEzNywgMHgwMDAwLCAweDhBMzgsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTM5LCAweDhBM0EsIDB4MDAwMCwgMHgwMDAwLCAweDhBM0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBM0MsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEzRCwgMHgwMDAwLCAweDAwMDAsIDB4OEEzRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBM0YsIDB4MDAwMCwgMHg4QTQwLAotICAgIDB4OEE0MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE0MiwgMHg4QTQzLCAweDhBNDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTQ1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTQ2LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTQ3LCAweDhBNDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QTQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTRCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNEMsIDB4OEE0RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNEYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNTEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEE1MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE1NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTU1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEE1NywgMHgwMDAwLCAweDAwMDAsIDB4OEE1OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTU5LCAweDAwMDAsIDB4MDAwMCwgMHg4QTVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEE1QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEE1RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTVFLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhBNUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2MCwgMHg4QTYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBNjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2MywgMHgwMDAwLCAweDAwMDAsIDB4OEE2NCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2NSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2NywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTY5LCAweDAwMDAsIDB4OEE2QSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTZCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhBNkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNkUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBNkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTcwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNzEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3NCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTc3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEE3OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTdCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTdDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBN0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTdFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhBN0YsIDB4MDAwMCwgMHgwMDAwLCAweDhBODAsIDB4OEE4MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE4MiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTgzLCAweDAwMDAsIDB4OEE4NCwgMHg4QTg1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QTg2LCAweDAwMDAsIDB4OEE4NywgMHgwMDAwLCAweDAwMDAsIDB4OEE4OCwgMHgwMDAwLCAweDhBODksIDB4OEE4QSwgMHgwMDAwLCAweDhBOEIsIDB4OEE4QywgMHg4QThELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEE4RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QThGLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBOTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTkxLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBOTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTkzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTk0LCAweDhBOTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTk2LCAweDhBOTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTk4LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBOTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBOUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QTlCLCAweDAwMDAsIDB4OEE5QywgMHgwMDAwLCAweDAwMDAsIDB4OEE5RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBOUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhBOUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUEwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBMSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUEzLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEFBOCwgMHg4QUE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQUEsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBQUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQUMsIDB4OEFBRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhBQUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQjAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QUIzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUI0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QUI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUI2LCAweDAwMDAsIDB4OEFCNywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCOSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QUJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUJCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QUJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEFCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUJGLCAweDhBQzAsIDB4MDAwMCwgMHg4QUMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFDMywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QUM0LCAweDAwMDAsIDB4OEFDNSwgMHgwMDAwLCAweDAwMDAsIDB4OEFDNiwgMHgwMDAwLCAweDhBQzcsIDB4MDAwMCwgMHgwMDAwLCAweDhBQzgsIDB4OEFDOSwgMHg4QUNBLCAweDAwMDAsCi0gICAgMHg4QUNCLCAweDhBQ0MsIDB4OEFDRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUNFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFDRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEFEMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRDEsIDB4MDAwMCwgMHg4QUQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUQ0LCAweDAwMDAsIDB4OEFENSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QUQ2LCAweDAwMDAsIDB4OEFENywgMHg4QUQ4LCAweDAwMDAsIDB4MDAwMCwgMHg4QUQ5LCAweDAwMDAsIDB4MDAwMCwgMHg4QURBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QURCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFEQywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFERCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBREUsIDB4MDAwMCwgMHg4QURGLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFMSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUUyLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUU2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTcsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTgsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBRTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUVCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFRCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFRiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRjAsIDB4MDAwMCwgMHg4QUYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEFGMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUY2LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUY3LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUY5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUZDLCAweDhBRkQsIDB4OEFGRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEFGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjAxLCAweDhCMDIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjAzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjA0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwNiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QjA3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwOCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjA5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwQSwgMHgwMDAwLCAweDAwMDAsIDB4OEIwQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjBELCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhCMEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwRiwgMHg4QjEwLCAweDhCMTEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QjEyLCAweDhCMTMsIDB4OEIxNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIxNiwgMHg4QjE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMTgsIDB4OEIxOSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjFBLCAweDhCMUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIxQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMUQsIDB4OEIxRSwgMHgwMDAwLCAweDhCMUYsIDB4MDAwMCwgMHgwMDAwLCAweDhCMjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyMywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjI0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjI2LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEIyNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyOSwgMHgwMDAwLCAweDhCMkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjJELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhCMkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzMSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QjMyLCAweDAwMDAsIDB4OEIzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzNSwgMHgwMDAwLCAweDhCMzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzNywgMHg4QjM4LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjNBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzQiwgMHgwMDAwLCAweDhCM0MsIDB4OEIzRCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzRSwKLSAgICAweDhCM0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI0MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNDEsIDB4MDAwMCwgMHgwMDAwLCAweDhCNDIsIDB4MDAwMCwgMHg4QjQzLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEI0NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNDcsIDB4OEI0OCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEI0QSwgMHg4QjRCLCAweDAwMDAsIDB4OEI0QywgMHgwMDAwLCAweDhCNEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjRFLCAweDAwMDAsCi0gICAgMHg4QjRGLCAweDAwMDAsIDB4OEI1MCwgMHgwMDAwLCAweDhCNTEsIDB4OEI1MiwgMHg4QjUzLCAweDhCNTQsIDB4OEI1NSwgMHg4QjU2LCAweDAwMDAsIDB4OEI1NywgMHgwMDAwLCAweDhCNTgsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEI1OSwgMHgwMDAwLCAweDAwMDAsIDB4OEI1QSwgMHg4QjVCLCAweDhCNUMsIDB4MDAwMCwgMHg4QjVELCAweDAwMDAsIDB4OEI1RSwgMHg4QjVGLCAweDhCNjAsIDB4OEI2MSwgMHg4QjYyLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEI2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjY1LCAweDAwMDAsCi0gICAgMHg4QjY2LCAweDhCNjcsIDB4OEI2OCwgMHg4QjY5LCAweDAwMDAsIDB4OEI2QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjZCLCAweDhCNkMsIDB4MDAwMCwgMHg4QjZELCAweDAwMDAsIDB4MDAwMCwgMHg4QjZFLAotICAgIDB4OEI2RiwgMHgwMDAwLCAweDhCNzAsIDB4OEI3MSwgMHg4QjcyLCAweDAwMDAsIDB4OEI3MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNzQsIDB4MDAwMCwKLSAgICAweDhCNzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qjc2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qjc3LCAweDAwMDAsIDB4OEI3OCwgMHg4Qjc5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhCN0EsIDB4OEI3QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjdDLCAweDAwMDAsIDB4OEI3RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEI3RSwgMHg4QjdGLCAweDhCODAsIDB4OEI4MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI4MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEI4MywgMHgwMDAwLCAweDhCODQsIDB4MDAwMCwgMHgwMDAwLCAweDhCODUsIDB4MDAwMCwgMHg4Qjg2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCODcsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qjg4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qjg5LCAweDAwMDAsIDB4OEI4QSwgMHgwMDAwLAotICAgIDB4OEI4QiwgMHgwMDAwLCAweDhCOEMsIDB4OEI4RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI4RSwgMHg4QjhGLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhCOTAsIDB4OEI5MSwgMHg4QjkyLCAweDAwMDAsIDB4OEI5MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qjk0LCAweDhCOTUsIDB4OEI5NiwgMHg4Qjk3LCAweDAwMDAsIDB4OEI5OCwgMHg4Qjk5LCAweDhCOUEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCOUIsIDB4MDAwMCwgMHgwMDAwLCAweDhCOUMsIDB4MDAwMCwgMHgwMDAwLCAweDhCOUQsIDB4OEI5RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCOUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkEwLCAweDhCQTEsIDB4OEJBMiwgMHg4QkEzLCAweDAwMDAsIDB4MDAwMCwgMHg4QkE0LCAweDhCQTUsIDB4MDAwMCwKLSAgICAweDhCQTYsIDB4OEJBNywgMHgwMDAwLCAweDhCQTgsIDB4MDAwMCwgMHgwMDAwLCAweDhCQTksIDB4MDAwMCwgMHg4QkFBLCAweDhCQUIsIDB4MDAwMCwgMHgwMDAwLCAweDhCQUMsIDB4MDAwMCwgMHgwMDAwLCAweDhCQUQsCi0gICAgMHgwMDAwLCAweDhCQUUsIDB4OEJBRiwgMHgwMDAwLCAweDhCQjAsIDB4MDAwMCwgMHg4QkIxLCAweDAwMDAsIDB4MDAwMCwgMHg4QkIyLCAweDAwMDAsIDB4OEJCMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQjQsIDB4OEJCNSwgMHg4QkI2LCAweDhCQjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhCQjgsIDB4OEJCOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJCQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkJCLCAweDAwMDAsIDB4OEJCQywgMHg4QkJELCAweDhCQkUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJDMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJDMSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QkMyLCAweDhCQzMsIDB4MDAwMCwgMHgwMDAwLCAweDhCQzQsIDB4OEJDNSwgMHg4QkM2LCAweDAwMDAsIDB4OEJDNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkM4LCAweDhCQzksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQ0EsIDB4MDAwMCwgMHg4QkNCLCAweDhCQ0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEJDRCwgMHgwMDAwLCAweDhCQ0UsIDB4OEJDRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJEMSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QkQyLCAweDhCRDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJENCwgMHg4QkQ1LCAweDhCRDYsIDB4MDAwMCwgMHg4QkQ3LCAweDAwMDAsIDB4OEJEOCwKLSAgICAweDhCRDksIDB4MDAwMCwgMHgwMDAwLCAweDhCREEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCREIsIDB4MDAwMCwgMHgwMDAwLCAweDhCREMsIDB4OEJERCwgMHg4QkRFLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJERiwgMHgwMDAwLCAweDhCRTAsIDB4MDAwMCwgMHg4QkUxLCAweDAwMDAsIDB4MDAwMCwgMHg4QkUyLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJFMywgMHgwMDAwLCAweDAwMDAsIDB4OEJFNCwgMHgwMDAwLCAweDhCRTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJFNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJFNywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkU4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QkU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJFQSwgMHgwMDAwLCAweDhCRUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRUMsIDB4OEJFRCwgMHgwMDAwLCAweDhCRUUsIDB4MDAwMCwgMHgwMDAwLCAweDhCRUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGMSwgMHg4QkYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEJGNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEJGNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGOCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkZCLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkZDLAotICAgIDB4OEJGRCwgMHgwMDAwLCAweDhCRkUsIDB4OEJGRiwgMHgwMDAwLCAweDhDMDAsIDB4OEMwMSwgMHg4QzAyLCAweDAwMDAsIDB4OEMwMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzA0LCAweDhDMDUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzA2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMDcsIDB4MDAwMCwgMHgwMDAwLCAweDhDMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzA5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzBDLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzBELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QzBFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzEyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzEzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhDMTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMTgsIDB4OEMxOSwgMHg4QzFBLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMxQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzFDLCAweDAwMDAsIDB4OEMxRCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzFFLCAweDAwMDAsIDB4OEMxRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMjAsCi0gICAgMHg4QzIxLCAweDAwMDAsIDB4OEMyMiwgMHgwMDAwLCAweDAwMDAsIDB4OEMyMywgMHgwMDAwLCAweDAwMDAsIDB4OEMyNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMyNiwgMHg4QzI3LCAweDhDMjgsIDB4OEMyOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMyQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMyQiwgMHgwMDAwLCAweDhDMkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzJELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhDMkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhDMzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEMzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzM0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzM3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDMzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDM0EsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzNDLCAweDAwMDAsIDB4MDAwMCwgMHg4QzNELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzNFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDM0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEM0MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEM0NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNDcsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEM0OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0QiwgMHg4QzRDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzRELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzRFLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0RiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM1MCwgMHgwMDAwLCAweDhDNTEsIDB4OEM1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzUzLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhDNTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzU1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM1NiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDNTcsIDB4MDAwMCwgMHgwMDAwLCAweDhDNTgsIDB4MDAwMCwgMHgwMDAwLCAweDhDNTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM1QiwgMHgwMDAwLCAweDAwMDAsIDB4OEM1QywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNUUsIDB4MDAwMCwgMHg4QzVGLCAweDAwMDAsIDB4OEM2MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEM2MSwgMHgwMDAwLCAweDAwMDAsIDB4OEM2MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNjMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzY0LCAweDAwMDAsIDB4MDAwMCwgMHg4QzY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM2OCwgMHg4QzY5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNkEsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNkQsIDB4MDAwMCwgMHgwMDAwLCAweDhDNkUsIDB4OEM2RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QzcwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNzEsIDB4MDAwMCwgMHg4QzcyLCAweDhDNzMsIDB4MDAwMCwgMHgwMDAwLCAweDhDNzQsIDB4OEM3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzc2LCAweDAwMDAsIDB4MDAwMCwgMHg4Qzc3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNzgsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4Qzc5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM3QSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDN0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzdDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzdELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzdFLCAweDhDN0YsIDB4MDAwMCwgMHgwMDAwLCAweDhDODAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzgyLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDODMsIDB4OEM4NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzg3LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4OCwgMHgwMDAwLCAweDhDODksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzhBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOEIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOEMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzhELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzhGLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzkwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOTIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzkzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzk0LCAweDAwMDAsIDB4MDAwMCwgMHg4Qzk1LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDOTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM5NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEM5OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzlBLCAweDhDOUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM5QywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QzlELCAweDhDOUUsIDB4MDAwMCwgMHgwMDAwLCAweDhDOUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0EwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OENBMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0E1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0E2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQTgsIDB4MDAwMCwgMHg4Q0E5LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0FBLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0FDLCAweDhDQUQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4Q0FFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBRiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0IxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OENCMywgMHg4Q0I0LCAweDAwMDAsIDB4OENCNSwgMHgwMDAwLCAweDAwMDAsIDB4OENCNiwgMHgwMDAwLCAweDAwMDAsIDB4OENCNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENCOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENCQSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4Q0JCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0JFLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDQkYsIDB4MDAwMCwgMHg4Q0MwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0MxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQzIsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0MzLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0M0LCAweDAwMDAsIDB4OENDNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4Q0M2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQzcsIDB4OENDOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0M5LCAweDAwMDAsIDB4OENDQSwgMHgwMDAwLCAweDAwMDAsIDB4OENDQiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4Q0NDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENDRCwgMHgwMDAwLCAweDAwMDAsIDB4OENDRSwgMHgwMDAwLCAweDAwMDAsIDB4OENDRiwgMHgwMDAwLCAweDhDRDAsCi0gICAgMHg4Q0QxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDRDIsIDB4MDAwMCwgMHg4Q0QzLCAweDAwMDAsIDB4OENENCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDRDUsIDB4OENENiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDRDcsIDB4MDAwMCwgMHg4Q0Q4LCAweDAwMDAsIDB4OENEOSwgMHgwMDAwLCAweDhDREEsIDB4MDAwMCwKLSAgICAweDhDREIsIDB4MDAwMCwgMHgwMDAwLCAweDhDREMsIDB4MDAwMCwgMHg4Q0RELCAweDhDREUsIDB4OENERiwgMHg4Q0UwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0UxLCAweDAwMDAsIDB4OENFMiwgMHgwMDAwLCAweDhDRTMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0U0LCAweDAwMDAsIDB4OENFNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDRTYsIDB4MDAwMCwgMHgwMDAwLCAweDhDRTcsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4Q0U4LCAweDAwMDAsIDB4MDAwMCwgMHg4Q0U5LCAweDAwMDAsIDB4OENFQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0VCLCAweDAwMDAsIDB4OENFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OENFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDRUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0VGLCAweDAwMDAsCi0gICAgMHg4Q0YwLCAweDAwMDAsIDB4OENGMSwgMHgwMDAwLCAweDhDRjIsIDB4OENGMywgMHgwMDAwLCAweDAwMDAsIDB4OENGNCwgMHgwMDAwLCAweDAwMDAsIDB4OENGNSwgMHgwMDAwLCAweDAwMDAsIDB4OENGNiwgMHgwMDAwLAotICAgIDB4OENGNywgMHg4Q0Y4LCAweDhDRjksIDB4OENGQSwgMHgwMDAwLCAweDAwMDAsIDB4OENGQiwgMHgwMDAwLCAweDAwMDAsIDB4OENGQywgMHgwMDAwLCAweDhDRkQsIDB4OENGRSwgMHg4Q0ZGLCAweDhEMDAsIDB4MDAwMCwKLSAgICAweDhEMDEsIDB4OEQwMiwgMHg4RDAzLCAweDhEMDQsIDB4MDAwMCwgMHg4RDA1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMDYsIDB4MDAwMCwgMHgwMDAwLCAweDhEMDcsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMDgsIDB4OEQwOSwgMHg4RDBBLCAweDhEMEIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDBDLCAweDhEMEQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RDBFLCAweDhEMEYsIDB4MDAwMCwgMHgwMDAwLCAweDhEMTAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMTEsIDB4MDAwMCwgMHg4RDEyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMTMsIDB4MDAwMCwKLSAgICAweDhEMTQsIDB4OEQxNSwgMHgwMDAwLCAweDhEMTYsIDB4OEQxNywgMHg4RDE4LCAweDhEMTksIDB4MDAwMCwgMHg4RDFBLCAweDAwMDAsIDB4OEQxQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RDFDLCAweDAwMDAsIDB4OEQxRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDFFLCAweDAwMDAsIDB4MDAwMCwgMHg4RDFGLCAweDAwMDAsIDB4MDAwMCwgMHg4RDIwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDIxLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhEMjIsIDB4MDAwMCwgMHg4RDIzLCAweDAwMDAsIDB4MDAwMCwgMHg4RDI0LCAweDAwMDAsIDB4OEQyNSwgMHgwMDAwLCAweDhEMjYsIDB4MDAwMCwgMHg4RDI3LCAweDAwMDAsIDB4OEQyOCwKLSAgICAweDAwMDAsIDB4OEQyOSwgMHg4RDJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMkIsIDB4OEQyQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDJELCAweDhEMkUsIDB4OEQyRiwgMHg4RDMwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhEMzEsIDB4OEQzMiwgMHgwMDAwLCAweDhEMzMsIDB4MDAwMCwgMHg4RDM0LCAweDhEMzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQzNiwgMHgwMDAwLCAweDhEMzcsIDB4OEQzOCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RDM5LCAweDAwMDAsIDB4OEQzQSwgMHgwMDAwLCAweDAwMDAsIDB4OEQzQiwgMHg4RDNDLCAweDhEM0QsIDB4MDAwMCwgMHg4RDNFLCAweDAwMDAsIDB4OEQzRiwgMHgwMDAwLCAweDhENDAsIDB4MDAwMCwKLSAgICAweDhENDEsIDB4OEQ0MiwgMHg4RDQzLCAweDAwMDAsIDB4OEQ0NCwgMHg4RDQ1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ0NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDQ3LCAweDAwMDAsCi0gICAgMHg4RDQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENDksIDB4MDAwMCwgMHg4RDRBLCAweDhENEIsIDB4MDAwMCwgMHg4RDRDLCAweDAwMDAsIDB4OEQ0RCwgMHgwMDAwLCAweDhENEUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEQ0RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTEsIDB4OEQ1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDU1LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDU2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ1NywgMHg4RDU4LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ1OSwgMHgwMDAwLCAweDhENUEsIDB4OEQ1QiwgMHg4RDVDLCAweDAwMDAsIDB4OEQ1RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDVFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENUYsCi0gICAgMHg4RDYwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENjEsIDB4MDAwMCwgMHgwMDAwLCAweDhENjIsIDB4OEQ2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENjQsIDB4OEQ2NSwgMHgwMDAwLAotICAgIDB4OEQ2NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDY3LCAweDhENjgsIDB4MDAwMCwgMHgwMDAwLCAweDhENjksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4RDZBLCAweDhENkIsIDB4MDAwMCwgMHg4RDZDLCAweDhENkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ2RSwgMHgwMDAwLCAweDhENkYsIDB4MDAwMCwgMHg4RDcwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENzIsIDB4MDAwMCwKLSAgICAweDhENzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDc0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDc2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENzcsIDB4OEQ3OCwgMHgwMDAwLAotICAgIDB4OEQ3OSwgMHg4RDdBLCAweDhEN0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDdDLCAweDhEN0QsIDB4OEQ3RSwgMHg4RDdGLCAweDhEODAsIDB4OEQ4MSwgMHgwMDAwLCAweDAwMDAsIDB4OEQ4MiwKLSAgICAweDhEODMsIDB4MDAwMCwgMHg4RDg0LCAweDhEODUsIDB4OEQ4NiwgMHgwMDAwLCAweDhEODcsIDB4OEQ4OCwgMHg4RDg5LCAweDAwMDAsIDB4OEQ4QSwgMHg4RDhCLCAweDhEOEMsIDB4OEQ4RCwgMHgwMDAwLCAweDhEOEUsCi0gICAgMHg4RDhGLCAweDhEOTAsIDB4OEQ5MSwgMHg4RDkyLCAweDhEOTMsIDB4OEQ5NCwgMHgwMDAwLCAweDhEOTUsIDB4OEQ5NiwgMHgwMDAwLCAweDhEOTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RDk4LCAweDhEOTksIDB4OEQ5QSwgMHgwMDAwLCAweDhEOUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ5QywgMHg4RDlELCAweDAwMDAsIDB4OEQ5RSwgMHgwMDAwLCAweDhEOUYsIDB4MDAwMCwKLSAgICAweDhEQTAsIDB4OERBMSwgMHg4REEyLCAweDhEQTMsIDB4OERBNCwgMHgwMDAwLCAweDhEQTUsIDB4OERBNiwgMHgwMDAwLCAweDAwMDAsIDB4OERBNywgMHgwMDAwLCAweDhEQTgsIDB4OERBOSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQUEsIDB4OERBQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQUMsIDB4OERBRCwgMHg4REFFLCAweDhEQUYsIDB4OERCMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REIxLCAweDhEQjIsIDB4MDAwMCwgMHg4REIzLCAweDhEQjQsIDB4MDAwMCwgMHg4REI1LCAweDAwMDAsIDB4MDAwMCwgMHg4REI2LCAweDAwMDAsIDB4OERCNywKLSAgICAweDhEQjgsIDB4MDAwMCwgMHgwMDAwLCAweDhEQjksIDB4OERCQSwgMHgwMDAwLCAweDhEQkIsIDB4OERCQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REJELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OERDMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhEQzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4REM0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REM2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhEQzgsIDB4MDAwMCwgMHgwMDAwLCAweDhEQzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQ0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhEQ0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDQywgMHg4RENELCAweDhEQ0UsIDB4MDAwMCwgMHg4RENGLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEREMCwgMHg4REQxLCAweDhERDIsIDB4MDAwMCwgMHg4REQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERENCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhERDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERENiwgMHg4REQ3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhERDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEREQSwgMHg4RERCLCAweDhEREMsIDB4OERERCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OERERSwgMHgwMDAwLCAweDhEREYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERFMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REUxLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4REUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REU0LCAweDhERTUsIDB4OERFNiwgMHg4REU3LCAweDhERTgsIDB4MDAwMCwgMHg4REU5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REVBLCAweDAwMDAsIDB4OERFQiwgMHgwMDAwLCAweDhERUMsIDB4OERFRCwgMHg4REVFLCAweDhERUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhERjAsIDB4MDAwMCwgMHg4REYxLCAweDhERjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERjMsIDB4OERGNCwgMHg4REY1LCAweDhERjYsIDB4OERGNywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REY4LCAweDhERjksIDB4MDAwMCwgMHgwMDAwLCAweDhERkEsIDB4OERGQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERkMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERGRSwgMHgwMDAwLCAweDAwMDAsIDB4OERGRiwgMHgwMDAwLCAweDAwMDAsIDB4OEUwMCwgMHg4RTAxLAotICAgIDB4OEUwMiwgMHgwMDAwLCAweDhFMDMsIDB4MDAwMCwgMHg4RTA0LCAweDhFMDUsIDB4OEUwNiwgMHgwMDAwLCAweDAwMDAsIDB4OEUwNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTA4LCAweDhFMDksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUwQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMEIsCi0gICAgMHgwMDAwLCAweDhFMEMsIDB4OEUwRCwgMHgwMDAwLCAweDhFMEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUwRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTEwLCAweDhFMTEsIDB4OEUxMiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4RTEzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RTE2LCAweDhFMTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUxOCwgMHg4RTE5LCAweDAwMDAsIDB4MDAwMCwgMHg4RTFBLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMUIsIDB4OEUxQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTFELCAweDAwMDAsIDB4MDAwMCwgMHg4RTFFLCAweDAwMDAsIDB4OEUxRiwgMHgwMDAwLAotICAgIDB4OEUyMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUyMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4RTIyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUyMywgMHg4RTI0LCAweDAwMDAsIDB4OEUyNSwgMHgwMDAwLCAweDhFMjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhFMjcsIDB4MDAwMCwgMHgwMDAwLCAweDhFMjgsIDB4MDAwMCwgMHgwMDAwLCAweDhFMjksIDB4MDAwMCwgMHgwMDAwLCAweDhFMkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTJCLAotICAgIDB4OEUyQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMkQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMkYsIDB4MDAwMCwgMHgwMDAwLCAweDhFMzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEUzMSwgMHgwMDAwLCAweDhFMzIsIDB4MDAwMCwgMHg4RTMzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTM0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTM1LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhFMzYsIDB4MDAwMCwgMHg4RTM3LCAweDAwMDAsIDB4OEUzOCwgMHgwMDAwLCAweDhFMzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFM0IsIDB4OEUzQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUzRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFM0UsIDB4MDAwMCwgMHg4RTNGLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU0MCwgMHg4RTQxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RTQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhFNDMsIDB4OEU0NCwgMHgwMDAwLCAweDhFNDUsIDB4MDAwMCwgMHg4RTQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTQ3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNDgsIDB4OEU0OSwgMHgwMDAwLCAweDhFNEEsIDB4OEU0QiwgMHg4RTRDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNEQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU0RSwgMHg4RTRGLCAweDAwMDAsIDB4MDAwMCwgMHg4RTUwLCAweDAwMDAsIDB4OEU1MSwgMHgwMDAwLCAweDAwMDAsIDB4OEU1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTUzLCAweDAwMDAsIDB4OEU1NCwgMHgwMDAwLCAweDhFNTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RTU2LCAweDhFNTcsIDB4MDAwMCwgMHg4RTU4LCAweDhFNTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNUIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEU1QywgMHg4RTVELCAweDAwMDAsIDB4MDAwMCwgMHg4RTVFLCAweDhFNUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNjAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNjEsIDB4MDAwMCwgMHgwMDAwLCAweDhFNjIsIDB4OEU2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTY0LCAweDAwMDAsCi0gICAgMHg4RTY1LCAweDAwMDAsIDB4MDAwMCwgMHg4RTY2LCAweDhFNjcsIDB4MDAwMCwgMHgwMDAwLCAweDhFNjgsIDB4OEU2OSwgMHg4RTZBLCAweDhFNkIsIDB4MDAwMCwgMHgwMDAwLCAweDhFNkMsIDB4OEU2RCwgMHg4RTZFLAotICAgIDB4OEU2RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNzAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNzEsIDB4OEU3MiwgMHgwMDAwLCAweDhFNzMsIDB4MDAwMCwgMHg4RTc0LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEU3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU3NiwgMHgwMDAwLCAweDAwMDAsIDB4OEU3NywgMHg4RTc4LCAweDAwMDAsIDB4MDAwMCwgMHg4RTc5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFN0EsIDB4MDAwMCwgMHg4RTdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTdDLCAweDhFN0QsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU3RSwgMHgwMDAwLCAweDhFN0YsIDB4MDAwMCwgMHg4RTgwLCAweDhFODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU4MiwKLSAgICAweDhFODMsIDB4MDAwMCwgMHgwMDAwLCAweDhFODQsIDB4MDAwMCwgMHg4RTg1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU4NiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhFODcsIDB4MDAwMCwgMHg4RTg4LCAweDAwMDAsIDB4MDAwMCwgMHg4RTg5LCAweDAwMDAsIDB4OEU4QSwgMHgwMDAwLCAweDhFOEIsIDB4OEU4QywgMHg4RThELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEU4RSwgMHgwMDAwLCAweDAwMDAsIDB4OEU4RiwgMHgwMDAwLCAweDhFOTAsIDB4OEU5MSwgMHgwMDAwLCAweDhFOTIsIDB4MDAwMCwgMHg4RTkzLCAweDhFOTQsIDB4OEU5NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFOTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU5NywgMHgwMDAwLCAweDhFOTgsIDB4MDAwMCwgMHg4RTk5LCAweDhFOUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhFOUIsIDB4MDAwMCwgMHg4RTlDLCAweDAwMDAsIDB4OEU5RCwgMHgwMDAwLCAweDhFOUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTlGLCAweDAwMDAsIDB4MDAwMCwgMHg4RUEwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhFQTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUEyLCAweDAwMDAsIDB4OEVBMywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVBNCwgMHg4RUE1LCAweDhFQTYsIDB4MDAwMCwgMHg4RUE3LCAweDhFQTgsIDB4OEVBOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUFBLCAweDhFQUIsCi0gICAgMHg4RUFDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVBRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RUFGLCAweDAwMDAsIDB4MDAwMCwgMHg4RUIwLCAweDAwMDAsIDB4OEVCMSwgMHgwMDAwLCAweDhFQjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVCMywKLSAgICAweDhFQjQsIDB4MDAwMCwgMHg4RUI1LCAweDAwMDAsIDB4MDAwMCwgMHg4RUI2LCAweDAwMDAsIDB4MDAwMCwgMHg4RUI3LCAweDhFQjgsIDB4OEVCOSwgMHg4RUJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQkIsCi0gICAgMHg4RUJDLCAweDhFQkQsIDB4OEVCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUJGLCAweDAwMDAsIDB4OEVDMCwgMHg4RUMxLCAweDAwMDAsIDB4OEVDMiwgMHgwMDAwLCAweDAwMDAsIDB4OEVDMywgMHg4RUM0LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVDNSwgMHgwMDAwLCAweDAwMDAsIDB4OEVDNiwgMHgwMDAwLCAweDhFQzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEVDOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQzksIDB4OEVDQSwgMHgwMDAwLCAweDAwMDAsIDB4OEVDQiwgMHg4RUNDLCAweDAwMDAsIDB4OEVDRCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQ0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVDRiwgMHgwMDAwLCAweDhFRDAsIDB4OEVEMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEVEMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUQzLCAweDhFRDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVENSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhFRDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUQ3LCAweDhFRDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVEOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RURBLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEVEQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFREMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RURELCAweDAwMDAsIDB4OEVERSwgMHgwMDAwLCAweDhFREYsIDB4MDAwMCwgMHgwMDAwLCAweDhFRTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEVFMSwgMHg4RUUyLCAweDhFRTMsIDB4MDAwMCwgMHgwMDAwLCAweDhFRTQsIDB4OEVFNSwgMHgwMDAwLCAweDhFRTYsIDB4OEVFNywgMHgwMDAwLCAweDhFRTgsIDB4MDAwMCwgMHg4RUU5LCAweDAwMDAsCi0gICAgMHg4RUVBLCAweDAwMDAsIDB4MDAwMCwgMHg4RUVCLCAweDAwMDAsIDB4OEVFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUVFLCAweDhFRUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVGMCwgMHg4RUYxLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhFRjIsIDB4OEVGMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVGNCwgMHg4RUY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRjYsIDB4OEVGNywgMHg4RUY4LCAweDhFRjksCi0gICAgMHgwMDAwLCAweDhFRkEsIDB4OEVGQiwgMHgwMDAwLCAweDhFRkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEVGRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjAxLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RjAzLCAweDAwMDAsIDB4MDAwMCwgMHg4RjA0LCAweDhGMDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYwNiwgMHg4RjA3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjA4LCAweDhGMDksIDB4MDAwMCwgMHgwMDAwLCAweDhGMEEsIDB4MDAwMCwgMHgwMDAwLCAweDhGMEIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4RjBDLCAweDhGMEQsIDB4MDAwMCwgMHg4RjBFLCAweDhGMEYsIDB4MDAwMCwgMHg4RjEwLCAweDAwMDAsIDB4OEYxMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMTIsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMTQsIDB4MDAwMCwgMHg4RjE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RjE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMTgsIDB4MDAwMCwKLSAgICAweDhGMTksIDB4MDAwMCwgMHgwMDAwLCAweDhGMUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYxQiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RjFDLCAweDhGMUQsIDB4OEYxRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMUYsIDB4MDAwMCwgMHg4RjIwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjIxLCAweDhGMjIsIDB4OEYyMywgMHg4RjI0LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhGMjYsIDB4MDAwMCwgMHg4RjI3LCAweDhGMjgsIDB4MDAwMCwgMHgwMDAwLCAweDhGMjksIDB4MDAwMCwgMHg4RjJBLCAweDhGMkIsIDB4MDAwMCwgMHg4RjJDLCAweDhGMkQsIDB4MDAwMCwgMHg4RjJFLCAweDhGMkYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEYzMCwgMHg4RjMxLCAweDhGMzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RjM0LCAweDAwMDAsIDB4OEYzNSwgMHgwMDAwLCAweDhGMzYsIDB4MDAwMCwgMHgwMDAwLCAweDhGMzcsIDB4OEYzOCwgMHgwMDAwLCAweDhGMzksIDB4OEYzQSwgMHg4RjNCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEYzQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGM0QsIDB4MDAwMCwgMHgwMDAwLCAweDhGM0UsIDB4MDAwMCwgMHg4RjNGLCAweDhGNDAsIDB4OEY0MSwgMHg4RjQyLCAweDhGNDMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjQ0LCAweDAwMDAsIDB4MDAwMCwgMHg4RjQ1LCAweDhGNDYsIDB4OEY0NywgMHgwMDAwLCAweDhGNDgsIDB4OEY0OSwgMHg4RjRBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEY0QiwgMHgwMDAwLCAweDhGNEMsIDB4OEY0RCwgMHg4RjRFLCAweDhGNEYsIDB4OEY1MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY1MSwgMHgwMDAwLCAweDhGNTIsIDB4MDAwMCwKLSAgICAweDhGNTMsIDB4OEY1NCwgMHg4RjU1LCAweDAwMDAsIDB4OEY1NiwgMHg4RjU3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY1OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNTksIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY1QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhGNUIsIDB4MDAwMCwgMHgwMDAwLCAweDhGNUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjVELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY1RSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjVGLCAweDhGNjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY2MSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjY0LCAweDAwMDAsIDB4OEY2NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhGNjYsIDB4MDAwMCwgMHgwMDAwLCAweDhGNjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY2OCwgMHgwMDAwLCAweDAwMDAsIDB4OEY2OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNkIsIDB4MDAwMCwgMHgwMDAwLCAweDhGNkMsIDB4MDAwMCwgMHg4RjZELCAweDhGNkUsIDB4MDAwMCwgMHg4RjZGLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEY3MCwgMHg4RjcxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGNzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGNzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Rjc1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY3NiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEY3NywgMHgwMDAwLCAweDhGNzgsIDB4MDAwMCwgMHg4Rjc5LCAweDAwMDAsIDB4OEY3QSwgMHg4RjdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjdDLCAweDAwMDAsIDB4OEY3RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGN0UsIDB4MDAwMCwgMHg4RjdGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEY4MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY4MSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY4MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEY4MywgMHgwMDAwLCAweDhGODQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGODUsIDB4MDAwMCwgMHg4Rjg2LCAweDhGODcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Rjg4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Rjg5LCAweDAwMDAsIDB4MDAwMCwgMHg4RjhBLCAweDAwMDAsIDB4OEY4QiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjhDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGOEQsCi0gICAgMHgwMDAwLCAweDhGOEUsIDB4OEY4RiwgMHg4RjkwLCAweDAwMDAsIDB4OEY5MSwgMHg4RjkyLCAweDhGOTMsIDB4OEY5NCwgMHgwMDAwLCAweDhGOTUsIDB4MDAwMCwgMHg4Rjk2LCAweDAwMDAsIDB4OEY5NywgMHg4Rjk4LAotICAgIDB4OEY5OSwgMHg4RjlBLCAweDhGOUIsIDB4OEY5QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjlELCAweDhGOUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY5RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEZBMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZBMSwgMHgwMDAwLCAweDhGQTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZBMywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RkE0LCAweDAwMDAsIDB4OEZBNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQTYsIDB4OEZBNywgMHg4RkE4LCAweDAwMDAsIDB4OEZBOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZBQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZBQiwgMHg4RkFDLCAweDhGQUQsIDB4OEZBRSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4RkFGLCAweDhGQjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkIxLCAweDhGQjIsIDB4MDAwMCwgMHg4RkIzLCAweDAwMDAsIDB4MDAwMCwgMHg4RkI0LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEZCNSwgMHgwMDAwLCAweDAwMDAsIDB4OEZCNiwgMHgwMDAwLCAweDhGQjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZCOCwgMHg4RkI5LCAweDAwMDAsIDB4MDAwMCwgMHg4RkJBLAotICAgIDB4OEZCQiwgMHg4RkJDLCAweDAwMDAsIDB4OEZCRCwgMHg4RkJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkMwLCAweDhGQzEsIDB4OEZDMiwKLSAgICAweDAwMDAsIDB4OEZDMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQzQsIDB4MDAwMCwgMHg4RkM1LCAweDAwMDAsIDB4OEZDNiwgMHg4RkM3LCAweDhGQzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RkM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQ0EsIDB4MDAwMCwgMHg4RkNCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQ0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4RkNELCAweDhGQ0UsIDB4MDAwMCwgMHg4RkNGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGRDAsIDB4OEZEMSwgMHg4RkQyLCAweDAwMDAsIDB4OEZEMywgMHgwMDAwLCAweDhGRDQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEZENSwgMHgwMDAwLCAweDhGRDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkQ3LCAweDhGRDgsIDB4OEZEOSwgMHg4RkRBLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZEQiwgMHg4RkRDLCAweDhGREQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZERSwgMHg4RkRGLCAweDAwMDAsIDB4OEZFMCwgMHgwMDAwLCAweDhGRTEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEZFMiwgMHg4RkUzLCAweDhGRTQsIDB4MDAwMCwgMHgwMDAwLCAweDhGRTUsIDB4MDAwMCwgMHg4RkU2LCAweDAwMDAsIDB4OEZFNywgMHg4RkU4LCAweDhGRTksIDB4MDAwMCwgMHg4RkVBLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhGRUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RkVELCAweDAwMDAsIDB4OEZFRSwgMHgwMDAwLCAweDhGRUYsIDB4OEZGMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkYxLCAweDAwMDAsIDB4OEZGMiwgMHgwMDAwLCAweDhGRjMsIDB4OEZGNCwKLSAgICAweDAwMDAsIDB4OEZGNSwgMHgwMDAwLCAweDhGRjYsIDB4MDAwMCwgMHg4RkY3LCAweDAwMDAsIDB4MDAwMCwgMHg4RkY4LCAweDhGRjksIDB4MDAwMCwgMHg4RkZBLCAweDhGRkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEZGQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkZFLCAweDAwMDAsIDB4OEZGRiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMDAsIDB4OTAwMSwgMHg5MDAyLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDkwMDMsIDB4MDAwMCwgMHg5MDA0LCAweDkwMDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg5MDA2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkwMDcsIDB4OTAwOCwgMHg5MDA5LCAweDAwMDAsIDB4OTAwQSwgMHg5MDBCLCAweDAwMDAsIDB4MDAwMCwgMHg5MDBDLCAweDkwMEQsIDB4MDAwMCwgMHg5MDBFLCAweDAwMDAsIDB4OTAwRiwgMHgwMDAwLCAweDkwMTAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTAxMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMTIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OTAxMywgMHg5MDE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAxNiwKLSAgICAweDAwMDAsIDB4OTAxNywgMHg5MDE4LCAweDAwMDAsIDB4MDAwMCwgMHg5MDE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAxQSwgMHg5MDFCLCAweDkwMUMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDFELCAweDAwMDAsIDB4MDAwMCwgMHg5MDFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDFGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMjAsIDB4MDAwMCwgMHg5MDIxLCAweDkwMjIsIDB4MDAwMCwKLSAgICAweDkwMjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMjQsIDB4OTAyNSwgMHg5MDI2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDI3LCAweDAwMDAsCi0gICAgMHg5MDI4LCAweDkwMjksIDB4OTAyQSwgMHg5MDJCLCAweDkwMkMsIDB4OTAyRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMkUsIDB4MDAwMCwgMHg5MDJGLCAweDkwMzAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMzEsIDB4MDAwMCwgMHg5MDMyLCAweDAwMDAsIDB4MDAwMCwgMHg5MDMzLCAweDkwMzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAzNSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDM2LCAweDAwMDAsIDB4OTAzNywgMHg5MDM4LCAweDkwMzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDNCLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwM0MsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTAzRCwgMHgwMDAwLCAweDkwM0UsIDB4OTAzRiwgMHg5MDQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNDEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNDMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDQ0LCAweDAwMDAsIDB4MDAwMCwgMHg5MDQ1LCAweDAwMDAsIDB4OTA0NiwgMHgwMDAwLCAweDkwNDcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDQ4LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDkwNDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNEEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDRCLCAweDAwMDAsIDB4OTA0QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDRFLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDRGLCAweDAwMDAsIDB4MDAwMCwgMHg5MDUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OTA1MSwgMHgwMDAwLCAweDkwNTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA1MywgMHg5MDU0LCAweDAwMDAsCi0gICAgMHg5MDU1LCAweDkwNTYsIDB4OTA1NywgMHg5MDU4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA1QSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA1QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDVDLCAweDkwNUQsIDB4MDAwMCwgMHg5MDVFLCAweDkwNUYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5MDYwLCAweDkwNjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNjIsIDB4MDAwMCwgMHg5MDYzLCAweDkwNjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDY1LCAweDkwNjYsIDB4OTA2NywgMHg5MDY4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNjksIDB4MDAwMCwgMHg5MDZBLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OTA2QiwgMHg5MDZDLCAweDAwMDAsIDB4OTA2RCwgMHgwMDAwLCAweDAwMDAsIDB4OTA2RSwgMHg5MDZGLCAweDAwMDAsIDB4OTA3MCwgMHg5MDcxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5MDcyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNzMsIDB4MDAwMCwgMHg5MDc0LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwNzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNzYsIDB4OTA3NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDc4LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDc5LCAweDkwN0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwN0IsIDB4MDAwMCwgMHgwMDAwLCAweDkwN0MsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDdELCAweDAwMDAsIDB4OTA3RSwgMHgwMDAwLCAweDAwMDAsIDB4OTA3RiwgMHg5MDgwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwODEsIDB4OTA4MiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg5MDgzLCAweDkwODQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDg1LCAweDAwMDAsIDB4OTA4NiwgMHg5MDg3LCAweDkwODgsIDB4MDAwMCwgMHgwMDAwLCAweDkwODksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDhBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDhCLCAweDkwOEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTA4RCwgMHgwMDAwLCAweDkwOEUsIDB4MDAwMCwgMHg5MDhGLCAweDkwOTAsIDB4OTA5MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwOTIsIDB4MDAwMCwgMHg5MDkzLAotICAgIDB4OTA5NCwgMHgwMDAwLCAweDAwMDAsIDB4OTA5NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDk2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDk3LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA5OCwgMHg5MDk5LCAweDAwMDAsIDB4OTA5QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA5QiwgMHgwMDAwLCAweDkwOUMsIDB4MDAwMCwgMHg5MDlELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwOUUsIDB4OTA5RiwgMHg5MEEwLCAweDAwMDAsIDB4OTBBMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQTIsIDB4OTBBMywgMHgwMDAwLCAweDkwQTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTBBNSwgMHgwMDAwLCAweDAwMDAsIDB4OTBBNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBBNywgMHgwMDAwLCAweDkwQTgsIDB4OTBBOSwgMHg5MEFBLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBBQiwgMHgwMDAwLCAweDAwMDAsIDB4OTBBQywgMHgwMDAwLCAweDkwQUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBBRSwKLSAgICAweDkwQUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBCMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQjIsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTBCMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg5MEI0LCAweDkwQjUsIDB4OTBCNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBCNywgMHg5MEI4LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkwQjksIDB4OTBCQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBCQiwgMHgwMDAwLCAweDkwQkMsIDB4MDAwMCwgMHgwMDAwLCAweDkwQkQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTBCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEMwLCAweDAwMDAsIDB4OTBDMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQzIsIDB4MDAwMCwgMHgwMDAwLCAweDkwQzMsIDB4MDAwMCwgMHg5MEM0LCAweDAwMDAsIDB4OTBDNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDkwQzYsIDB4MDAwMCwgMHgwMDAwLCAweDkwQzcsIDB4OTBDOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MENBLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwQ0IsIDB4MDAwMCwgMHg5MENDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBDRCwgMHg5MENFLCAweDkwQ0YsIDB4OTBEMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBEMSwKLSAgICAweDAwMDAsIDB4OTBEMiwgMHg5MEQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEQ0LCAweDAwMDAsIDB4MDAwMCwgMHg5MEQ1LCAweDkwRDYsIDB4MDAwMCwgMHg5MEQ3LCAweDkwRDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRDksIDB4OTBEQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwREIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBEQywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5MERELCAweDAwMDAsIDB4OTBERSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MERGLCAweDkwRTAsIDB4OTBFMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRTMsIDB4MDAwMCwgMHgwMDAwLCAweDkwRTQsIDB4MDAwMCwgMHg5MEU1LCAweDkwRTYsIDB4MDAwMCwgMHg5MEU3LCAweDkwRTgsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEVBLCAweDAwMDAsIDB4OTBFQiwgMHg5MEVDLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBFRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGMCwgMHg5MEYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEYzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRjUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRjcsIDB4MDAwMCwgMHg5MEY4LCAweDkwRjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRkEsIDB4MDAwMCwgMHg5MEZCLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGRSwgMHg5MEZGLCAweDAwMDAsIDB4MDAwMCwgMHg5MTAwLCAweDkxMDEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTEwMiwgMHgwMDAwLCAweDkxMDMsIDB4OTEwNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MTA1LCAweDAwMDAsIDB4MDAwMCwgMHg5MTA2LCAweDAwMDAsIDB4MDAwMCwgMHg5MTA3LAotICAgIDB4OTEwOCwgMHg5MTA5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTEwQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MTBCLCAweDAwMDAsIDB4OTEwQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5MTBELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTEwRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkxMEYsIDB4OTExMCwgMHgwMDAwLAotICAgIDB4OTExMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MTEyLCAweDkxMTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTExNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OTExNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OTExNiwgMHg5MTE3LCAweDkxMTgsIDB4OTExOSwgMHg5MTFBLCAweDkxMUIsIDB4OTExQywgMHg5MTFELCAweDkxMUUsIDB4OTExRiwgMHg5MTIwLCAweDkxMjEsIDB4OTEyMiwgMHg5MTIzLCAweDkxMjQsIDB4OTEyNSwKLSAgICAweDkxMjYsIDB4OTEyNywgMHg5MTI4LCAweDkxMjksIDB4OTEyQSwgMHg5MTJCLCAweDkxMkMsIDB4OTEyRCwgMHg5MTJFLCAweDkxMkYsIDB4OTEzMCwgMHg5MTMxLCAweDkxMzIsIDB4OTEzMywgMHg5MTM0LCAweDkxMzUsCi0gICAgMHg5MTM2LCAweDkxMzcsIDB4OTEzOCwgMHg5MTM5LCAweDkxM0EsIDB4OTEzQiwgMHg5MTNDLCAweDkxM0QsIDB4OTEzRSwgMHg5MTNGLCAweDkxNDAsIDB4OTE0MSwgMHg5MTQyLCAweDkxNDMsIDB4OTE0NCwgMHg5MTQ1LAotICAgIDB4OTE0NiwgMHg5MTQ3LCAweDkxNDgsIDB4OTE0OSwgMHg5MTRBLCAweDkxNEIsIDB4OTE0QywgMHg5MTRELCAweDkxNEUsIDB4OTE0RiwgMHg5MTUwLCAweDkxNTEsIDB4OTE1MiwgMHg5MTUzLCAweDkxNTQsIDB4OTE1NSwKLSAgICAweDkxNTYsIDB4OTE1NywgMHg5MTU4LCAweDkxNTksIDB4OTE1QSwgMHg5MTVCLCAweDkxNUMsIDB4OTE1RCwgMHg5MTVFLCAweDkxNUYsIDB4OTE2MCwgMHg5MTYxLCAweDkxNjIsIDB4OTE2MywgMHg5MTY0LCAweDkxNjUsCi0gICAgMHg5MTY2LCAweDkxNjcsIDB4OTE2OCwgMHg5MTY5LCAweDkxNkEsIDB4OTE2QiwgMHg5MTZDLCAweDkxNkQsIDB4OTE2RSwgMHg5MTZGLCAweDkxNzAsIDB4OTE3MSwgMHg5MTcyLCAweDkxNzMsIDB4OTE3NCwgMHg5MTc1LAotICAgIDB4OTE3NiwgMHg5MTc3LCAweDkxNzgsIDB4OTE3OSwgMHg5MTdBLCAweDkxN0IsIDB4OTE3QywgMHg5MTdELCAweDkxN0UsIDB4OTE3RiwgMHg5MTgwLCAweDkxODEsIDB4OTE4MiwgMHg5MTgzLCAweDkxODQsIDB4OTE4NSwKLSAgICAweDkxODYsIDB4OTE4NywgMHg5MTg4LCAweDkxODksIDB4OTE4QSwgMHg5MThCLCAweDkxOEMsIDB4OTE4RCwgMHg5MThFLCAweDkxOEYsIDB4OTE5MCwgMHg5MTkxLCAweDkxOTIsIDB4OTE5MywgMHg5MTk0LCAweDkxOTUsCi0gICAgMHg5MTk2LCAweDkxOTcsIDB4OTE5OCwgMHg5MTk5LCAweDkxOUEsIDB4OTE5QiwgMHg5MTlDLCAweDkxOUQsIDB4OTE5RSwgMHg5MTlGLCAweDkxQTAsIDB4OTFBMSwgMHg5MUEyLCAweDkxQTMsIDB4OTFBNCwgMHg5MUE1LAotICAgIDB4OTFBNiwgMHg5MUE3LCAweDkxQTgsIDB4OTFBOSwgMHg5MUFBLCAweDkxQUIsIDB4OTFBQywgMHg5MUFELCAweDkxQUUsIDB4OTFBRiwgMHg5MUIwLCAweDkxQjEsIDB4OTFCMiwgMHg5MUIzLCAweDkxQjQsIDB4OTFCNSwKLSAgICAweDkxQjYsIDB4OTFCNywgMHg5MUI4LCAweDkxQjksIDB4OTFCQSwgMHg5MUJCLCAweDkxQkMsIDB4OTFCRCwgMHg5MUJFLCAweDkxQkYsIDB4OTFDMCwgMHg5MUMxLCAweDkxQzIsIDB4OTFDMywgMHg5MUM0LCAweDkxQzUsCi0gICAgMHg5MUM2LCAweDkxQzcsIDB4OTFDOCwgMHg5MUM5LCAweDkxQ0EsIDB4OTFDQiwgMHg5MUNDLCAweDkxQ0QsIDB4OTFDRSwgMHg5MUNGLCAweDkxRDAsIDB4OTFEMSwgMHg5MUQyLCAweDkxRDMsIDB4OTFENCwgMHg5MUQ1LAotICAgIDB4OTFENiwgMHg5MUQ3LCAweDkxRDgsIDB4OTFEOSwgMHg5MURBLCAweDkxREIsIDB4OTFEQywgMHg5MURELCAweDkxREUsIDB4OTFERiwgMHg5MUUwLCAweDkxRTEsIDB4OTFFMiwgMHg5MUUzLCAweDkxRTQsIDB4OTFFNSwKLSAgICAweDkxRTYsIDB4OTFFNywgMHg5MUU4LCAweDkxRTksIDB4OTFFQSwgMHg5MUVCLCAweDkxRUMsIDB4OTFFRCwgMHg5MUVFLCAweDkxRUYsIDB4OTFGMCwgMHg5MUYxLCAweDkxRjIsIDB4OTFGMywgMHg5MUY0LCAweDkxRjUsCi0gICAgMHg5MUY2LCAweDkxRjcsIDB4OTFGOCwgMHg5MUY5LCAweDkxRkEsIDB4OTFGQiwgMHg5MUZDLCAweDkxRkQsIDB4OTFGRSwgMHg5MUZGLCAweDkyMDAsIDB4OTIwMSwgMHg5MjAyLCAweDkyMDMsIDB4OTIwNCwgMHg5MjA1LAotICAgIDB4OTIwNiwgMHg5MjA3LCAweDkyMDgsIDB4OTIwOSwgMHg5MjBBLCAweDkyMEIsIDB4OTIwQywgMHg5MjBELCAweDkyMEUsIDB4OTIwRiwgMHg5MjEwLCAweDkyMTEsIDB4OTIxMiwgMHg5MjEzLCAweDkyMTQsIDB4OTIxNSwKLSAgICAweDkyMTYsIDB4OTIxNywgMHg5MjE4LCAweDkyMTksIDB4OTIxQSwgMHg5MjFCLCAweDkyMUMsIDB4OTIxRCwgMHg5MjFFLCAweDkyMUYsIDB4OTIyMCwgMHg5MjIxLCAweDkyMjIsIDB4OTIyMywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5MjI0LCAweDAwMDAsIDB4OTIyNSwgMHgwMDAwLCAweDAwMDAsIDB4OTIyNiwgMHg5MjI3LCAweDkyMjgsIDB4OTIyOSwgMHg5MjJBLCAweDkyMkIsIDB4OTIyQywgMHg5MjJELCAweDkyMkUsIDB4OTIyRiwgMHgwMDAwLAotICAgIDB4OTIzMCwgMHgwMDAwLCAweDkyMzEsIDB4MDAwMCwgMHgwMDAwLCAweDkyMzIsIDB4OTIzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MjM0LCAweDkyMzUsIDB4OTIzNiwgMHg5MjM3LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkyMzgsIDB4OTIzOSwgMHg5MjNBLCAweDkyM0IsIDB4OTIzQywgMHg5MjNELCAweDkyM0UsIDB4OTIzRiwgMHg5MjQwLCAweDkyNDEsIDB4OTI0MiwgMHg5MjQzLCAweDkyNDQsIDB4OTI0NSwgMHg5MjQ2LCAweDkyNDcsCi0gICAgMHg5MjQ4LCAweDkyNDksIDB4OTI0QSwgMHg5MjRCLCAweDkyNEMsIDB4OTI0RCwgMHg5MjRFLCAweDkyNEYsIDB4OTI1MCwgMHg5MjUxLCAweDkyNTIsIDB4OTI1MywgMHg5MjU0LCAweDkyNTUsIDB4OTI1NiwgMHg5MjU3LAotICAgIDB4OTI1OCwgMHg5MjU5LCAweDkyNUEsIDB4OTI1QiwgMHg5MjVDLCAweDkyNUQsIDB4OTI1RSwgMHg5MjVGLCAweDkyNjAsIDB4OTI2MSwgMHg5MjYyLCAweDkyNjMsIDB4OTI2NCwgMHg5MjY1LCAweDkyNjYsIDB4OTI2NywKLSAgICAweDkyNjgsIDB4OTI2OSwgMHg5MjZBLCAweDkyNkIsIDB4OTI2QywgMHg5MjZELCAweDkyNkUsIDB4OTI2RiwgMHg5MjcwLCAweDkyNzEsIDB4OTI3MiwgMHg5MjczLCAweDAwMDAsIDB4OTI3NCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5Mjc1LCAweDkyNzYsIDB4OTI3NywgMHg5Mjc4LCAweDkyNzksIDB4OTI3QSwgMHg5MjdCLCAweDkyN0MsIDB4OTI3RCwgMHg5MjdFLCAweDkyN0YsIDB4OTI4MCwgMHg5MjgxLCAweDkyODIsIDB4OTI4MywgMHg5Mjg0LAotICAgIDB4OTI4NSwgMHg5Mjg2LCAweDkyODcsIDB4OTI4OCwgMHg5Mjg5LCAweDkyOEEsIDB4OTI4QiwgMHg5MjhDLCAweDkyOEQsIDB4OTI4RSwgMHg5MjhGLCAweDkyOTAsIDB4OTI5MSwgMHg5MjkyLCAweDkyOTMsIDB4OTI5NCwKLSAgICAweDkyOTUsIDB4OTI5NiwgMHg5Mjk3LCAweDkyOTgsIDB4OTI5OSwgMHg5MjlBLCAweDkyOUIsIDB4OTI5QywgMHg5MjlELCAweDkyOUUsIDB4OTI5RiwgMHg5MkEwLCAweDkyQTEsIDB4OTJBMiwgMHg5MkEzLCAweDkyQTQsCi0gICAgMHg5MkE1LCAweDkyQTYsIDB4OTJBNywgMHg5MkE4LCAweDkyQTksIDB4OTJBQSwgMHg5MkFCLCAweDkyQUMsIDB4OTJBRCwgMHg5MkFFLCAweDkyQUYsIDB4OTJCMCwgMHg5MkIxLCAweDkyQjIsIDB4OTJCMywgMHg5MkI0LAotICAgIDB4OTJCNSwgMHg5MkI2LCAweDkyQjcsIDB4OTJCOCwgMHg5MkI5LCAweDkyQkEsIDB4OTJCQiwgMHg5MkJDLCAweDkyQkQsIDB4OTJCRSwgMHg5MkJGLCAweDkyQzAsIDB4OTJDMSwgMHg5MkMyLCAweDkyQzMsIDB4OTJDNCwKLSAgICAweDkyQzUsIDB4OTJDNiwgMHg5MkM3LCAweDkyQzgsIDB4OTJDOSwgMHg5MkNBLCAweDkyQ0IsIDB4OTJDQywgMHg5MkNELCAweDkyQ0UsIDB4OTJDRiwgMHg5MkQwLCAweDkyRDEsIDB4OTJEMiwgMHg5MkQzLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTJENCwgMHg5MkQ1LCAweDkyRDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTJENywgMHg5MkQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgyM0FDLCAweDIzQUUsIDB4MjNCMCwgMHgzMzEyLCAweDMzMTUsIDB4MjNCMiwgMHgyM0I0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjNCNiwgMHgyM0I4LCAweDIzQkEsIDB4MjNCQywgMHgyM0JFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyM0MwLCAweDAwMDAsIDB4MjNDMiwKLSAgICAweDkyRDksIDB4OTJEQSwgMHg5MkRCLCAweDkyREMsIDB4OTJERCwgMHg5MkRFLCAweDkyREYsIDB4OTJFMCwgMHg5MkUxLCAweDkyRTIsIDB4MjNDNCwgMHgyM0M2LCAweDIzQzgsIDB4MjNDQSwgMHgyM0NDLCAweDIzQ0UsCi0gICAgMHgyM0QwLCAweDIzRDIsIDB4MjNENCwgMHgyM0Q2LCAweDIzRDgsIDB4MjNEQSwgMHgyM0RDLCAweDAwMDAsIDB4MjNERSwgMHgyM0UwLCAweDIzRTIsIDB4MjNFNCwgMHgyM0U2LCAweDAwMDAsIDB4MjNFOCwgMHgwMDAwLAotICAgIDB4MjNFQSwgMHgyM0VDLCAweDAwMDAsIDB4MjNFRSwgMHgyM0YwLCAweDAwMDAsIDB4MjNGMiwgMHgyM0Y0LCAweDIzRjYsIDB4MjNGOCwgMHgyM0ZBLCAweDIzRkMsIDB4MjNGRSwgMHgyNDAwLCAweDI0MDIsIDB4MjQwNCwKLSAgICAweDkyRTMsIDB4OTJFNCwgMHg5MkU1LCAweDkyRTYsIDB4OTJFNywgMHg5MkU4LCAweDkyRTksIDB4OTJFQSwgMHg5MkVCLCAweDkyRUMsIDB4OTJFRCwgMHg5MkVFLCAweDkyRUYsIDB4OTJGMCwgMHg5MkYxLCAweDkyRjIsCi0gICAgMHg5MkYzLCAweDkyRjQsIDB4OTJGNSwgMHg5MkY2LCAweDkyRjcsIDB4OTJGOCwgMHg5MkY5LCAweDkyRkEsIDB4OTJGQiwgMHg5MkZDLCAweDkyRkQsIDB4OTJGRSwgMHg5MkZGLCAweDkzMDAsIDB4OTMwMSwgMHg5MzAyLAotICAgIDB4OTMwMywgMHg5MzA0LCAweDkzMDUsIDB4OTMwNiwgMHg5MzA3LCAweDkzMDgsIDB4OTMwOSwgMHg5MzBBLCAweDkzMEIsIDB4OTMwQywgMHg5MzBELCAweDkzMEUsIDB4OTMwRiwgMHg5MzEwLCAweDkzMTEsIDB4OTMxMiwKLSAgICAweDkzMTMsIDB4OTMxNCwgMHg5MzE1LCAweDkzMTYsIDB4OTMxNywgMHg5MzE4LCAweDkzMTksIDB4OTMxQSwgMHg5MzFCLCAweDkzMUMsIDB4OTMxRCwgMHg5MzFFLCAweDkzMUYsIDB4OTMyMCwgMHg5MzIxLCAweDkzMjIsCi0gICAgMHg5MzIzLCAweDkzMjQsIDB4OTMyNSwgMHg5MzI2LCAweDkzMjcsIDB4OTMyOCwgMHg5MzI5LCAweDkzMkEsIDB4OTMyQiwgMHg5MzJDLCAweDkzMkQsIDB4OTMyRSwgMHg5MzJGLCAweDkzMzAsIDB4OTMzMSwgMHg5MzMyLAotICAgIDB4OTMzMywgMHg5MzM0LCAweDkzMzUsIDB4OTMzNiwgMHg5MzM3LCAweDkzMzgsIDB4OTMzOSwgMHg5MzNBLCAweDkzM0IsIDB4OTMzQywgMHg5MzNELCAweDkzM0UsIDB4OTMzRiwgMHg5MzQwLCAweDkzNDEsIDB4OTM0MiwKLSAgICAweDkzNDMsIDB4OTM0NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTM0NSwgMHg5MzQ2LCAweDkzNDcsIDB4OTM0OCwgMHg5MzQ5LCAweDkzNEEsIDB4OTM0QiwgMHg5MzRDLCAweDkzNEQsIDB4OTM0RSwgMHg5MzRGLCAweDkzNTAsIDB4OTM1MSwKLSAgICAweDkzNTIsIDB4OTM1MywgMHg5MzU0LCAweDkzNTUsIDB4OTM1NiwgMHg5MzU3LCAweDkzNTgsIDB4OTM1OSwgMHg5MzVBLCAweDkzNUIsIDB4MjQwNiwgMHgyNDA4LCAweDI0MEEsIDB4MjQwQywgMHgyNDBFLCAweDI0MTAsCi0gICAgMHgyNDEyLCAweDI0MTQsIDB4MjQxNiwgMHgyNDE4LCAweDI0MUEsIDB4MjQxQywgMHgyNDFFLCAweDI0MjAsIDB4MjQyMiwgMHgyNDI0LCAweDI0MjYsIDB4MjQyOCwgMHg5MzVDLCAweDkzNUQsIDB4OTM1RSwgMHg5MzVGLAotICAgIDB4MjQyQSwgMHgyNDJDLCAweDI0MkUsIDB4MjQzMCwgMHgyNDMyLCAweDI0MzQsIDB4MjQzNiwgMHgyNDM4LCAweDI0M0EsIDB4MjQzQywgMHgyNDNFLCAweDI0NDAsIDB4MjQ0MiwgMHgyNDQ0LCAweDI0NDYsIDB4MjQ0OCwKLSAgICAweDI0NEEsIDB4MjQ0QywgMHgyNDRFLCAweDI0NTAsIDB4MjQ1MiwgMHgyNDU0LCAweDI0NTYsIDB4MjQ1OCwgMHgyNDVBLCAweDI0NUMsIDB4MjQ1RSwgMHgyNDYwLCAweDI0NjIsIDB4MjQ2NCwgMHgyNDY2LCAweDI0NjgsCi0gICAgMHgyNDZBLCAweDI0NkMsIDB4MjQ2RSwgMHgyNDcwLCAweDI0NzIsIDB4MjQ3NCwgMHgyNDc2LCAweDI0NzgsIDB4MjQ3QSwgMHgyNDdDLCAweDI0N0UsIDB4MjQ4MCwgMHgyNDgyLCAweDI0ODQsIDB4MjQ4NiwgMHgyNDg4LAotICAgIDB4MjQ4QSwgMHgyNDhDLCAweDI0OEUsIDB4MjQ5MCwgMHgyNDkyLCAweDI0OTQsIDB4MjQ5NiwgMHgyNDk4LCAweDI0OUEsIDB4MjQ5QywgMHgyNDlFLCAweDI0QTAsIDB4MjRBMiwgMHgyNEE0LCAweDI0QTYsIDB4MjRBOCwKLSAgICAweDI0QUEsIDB4MjRBQywgMHgyNEFFLCAweDI0QjAsIDB4MjRCMiwgMHgyNEI0LCAweDI0QjYsIDB4MjRCOCwgMHgyNEJBLCAweDI0QkMsIDB4MjRCRSwgMHgyNEMwLCAweDI0QzIsIDB4MjRDNCwgMHgyNEM2LCAweDI0QzgsCi0gICAgMHgyNENBLCAweDI0Q0MsIDB4MjRDRSwgMHgyNEQwLCAweDI0RDIsIDB4MjRENCwgMHgyNEQ2LCAweDI0RDgsIDB4MjREQSwgMHgyNERDLCAweDI0REUsIDB4MjRFMCwgMHgyNEUyLCAweDI0RTQsIDB4MjRFNiwgMHgyNEU4LAotICAgIDB4MjRFQSwgMHgyNEVDLCAweDI0RUUsIDB4MjRGMCwgMHgyNEYyLCAweDI0RjQsIDB4MjRGNiwgMHgyNEY4LCAweDI0RkEsIDB4MjRGQywgMHgyNEZFLCAweDI1MDAsIDB4MjUwMiwgMHgyNTA0LCAweDI1MDYsIDB4MjUwOCwKLSAgICAweDI1MEEsIDB4MjUwQywgMHgyNTBFLCAweDI1MTAsIDB4MjUxMiwgMHgyNTE0LCAweDI1MTYsIDB4MjUxOCwgMHgyNTFBLCAweDI1MUMsIDB4MjUxRSwgMHgyNTIwLCAweDI1MjIsIDB4MjUyNCwgMHgyNTI2LCAweDI1MjgsCi0gICAgMHgyNTJBLCAweDI1MkMsIDB4MjUyRSwgMHgyNTMwLCAweDI1MzIsIDB4MjUzNCwgMHgyNTM2LCAweDI1MzgsIDB4MjUzQSwgMHgyNTNDLCAweDI1M0UsIDB4MjU0MCwgMHgyNTQyLCAweDI1NDQsIDB4MjU0NiwgMHgyNTQ4LAotICAgIDB4MjU0QSwgMHgyNTRDLCAweDI1NEUsIDB4MjU1MCwgMHgyNTUyLCAweDI1NTQsIDB4MjU1NiwgMHgyNTU4LCAweDI1NUEsIDB4MjU1QywgMHgyNTVFLCAweDI1NjAsIDB4MjU2MiwgMHgyNTY0LCAweDI1NjYsIDB4MjU2OCwKLSAgICAweDI1NkEsIDB4MjU2QywgMHgyNTZFLCAweDI1NzAsIDB4MjU3MiwgMHgyNTc0LCAweDI1NzYsIDB4MjU3OCwgMHgyNTdBLCAweDI1N0MsIDB4MjU3RSwgMHgyNTgwLCAweDI1ODIsIDB4MjU4NCwgMHgyNTg2LCAweDI1ODgsCi0gICAgMHgyNThBLCAweDI1OEMsIDB4MjU4RSwgMHgyNTkwLCAweDI1OTIsIDB4MjU5NCwgMHgyNTk2LCAweDI1OTgsIDB4MjU5QSwgMHgyNTlDLCAweDI1OUUsIDB4MjVBMCwgMHgyNUEyLCAweDI1QTQsIDB4MjVBNiwgMHgyNUE4LAotICAgIDB4MjVBQSwgMHgyNUFDLCAweDI1QUUsIDB4MjVCMCwgMHgyNUIyLCAweDI1QjQsIDB4MjVCNiwgMHgyNUI4LCAweDI1QkEsIDB4MjVCQywgMHgyNUJFLCAweDI1QzAsIDB4MjVDMiwgMHgyNUM0LCAweDI1QzYsIDB4MjVDOCwKLSAgICAweDI1Q0EsIDB4MjVDQywgMHgyNUNFLCAweDI1RDAsIDB4MjVEMiwgMHgyNUQ0LCAweDI1RDYsIDB4MjVEOCwgMHgyNURBLCAweDI1REMsIDB4MjVERSwgMHgyNUUwLCAweDI1RTIsIDB4MjVFNCwgMHgyNUU2LCAweDI1RTgsCi0gICAgMHgyNUVBLCAweDI1RUMsIDB4MjVFRSwgMHgyNUYwLCAweDI1RjIsIDB4MjVGNCwgMHgyNUY2LCAweDI1RjgsIDB4MjVGQSwgMHgyNUZDLCAweDI1RkUsIDB4MjYwMCwgMHgyNjAyLCAweDI2MDQsIDB4MjYwNiwgMHgyNjA4LAotICAgIDB4MjYwQSwgMHgyNjBDLCAweDMzMTgsIDB4MzMxQiwgMHgzMzFFLCAweDI2MEUsIDB4MjYxMCwgMHgyNjEyLCAweDI2MTQsIDB4MjYxNiwgMHgyNjE4LCAweDI2MUEsIDB4MjYxQywgMHgyNjFFLCAweDI2MjAsIDB4MjYyMiwKLSAgICAweDI2MjQsIDB4MjYyNiwgMHgyNjI4LCAweDI2MkEsIDB4MjYyQywgMHgyNjJFLCAweDI2MzAsIDB4MjYzMiwgMHgyNjM0LCAweDI2MzYsIDB4MjYzOCwgMHgyNjNBLCAweDI2M0MsIDB4MjYzRSwgMHgyNjQwLCAweDI2NDIsCi0gICAgMHgyNjQ0LCAweDI2NDYsIDB4MjY0OCwgMHgyNjRBLCAweDI2NEMsIDB4MjY0RSwgMHgyNjUwLCAweDI2NTIsIDB4MjY1NCwgMHgyNjU2LCAweDI2NTgsIDB4MjY1QSwgMHgyNjVDLCAweDI2NUUsIDB4MjY2MCwgMHgyNjYyLAotICAgIDB4MjY2NCwgMHgyNjY2LCAweDI2NjgsIDB4MjY2QSwgMHgyNjZDLCAweDI2NkUsIDB4MjY3MCwgMHgyNjcyLCAweDI2NzQsIDB4MjY3NiwgMHgyNjc4LCAweDI2N0EsIDB4MjY3QywgMHgyNjdFLCAweDI2ODAsIDB4MjY4MiwKLSAgICAweDI2ODQsIDB4MjY4NiwgMHgyNjg4LCAweDI2OEEsIDB4MjY4QywgMHgyNjhFLCAweDI2OTAsIDB4MjY5MiwgMHgyNjk0LCAweDI2OTYsIDB4MjY5OCwgMHgyNjlBLCAweDI2OUMsIDB4MjY5RSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MzMyMSwgMHgzMzI0LCAweDMzMjcsIDB4MzMyQSwgMHgzMzJELCAweDMzMzAsIDB4MzMzMywgMHgzMzM2LCAweDMzMzksIDB4MzMzQywgMHgzMzNGLCAweDMzNDIsIDB4MzM0NSwgMHgzMzQ4LCAweDMzNEIsIDB4MzM0RSwKLSAgICAweDMzNTEsIDB4MzM1NCwgMHgzMzU3LCAweDMzNUEsIDB4MzM1RCwgMHgzMzYwLCAweDMzNjMsIDB4MzM2NiwgMHgzMzY5LCAweDMzNkMsIDB4MzM2RiwgMHgzMzcyLCAweDMzNzUsIDB4MzM3OCwgMHgzMzdCLCAweDMzN0UsCi0gICAgMHgzMzgxLCAweDMzODQsIDB4MzM4NywgMHgzMzhBLCAweDMzOEQsIDB4MzM5MCwgMHgzMzkzLCAweDMzOTYsIDB4MzM5OSwgMHgzMzlDLCAweDMzOUYsIDB4MzNBMiwgMHgzM0E1LCAweDMzQTgsIDB4MzNBQiwgMHgzM0FFLAotICAgIDB4MzNCMSwgMHgzM0I0LCAweDMzQjcsIDB4MzNCQSwgMHgzM0JELCAweDMzQzAsIDB4MzNDMywgMHgzM0M2LCAweDMzQzksIDB4MzNDQywgMHgzM0NGLCAweDMzRDIsIDB4MzNENSwgMHgzM0Q4LCAweDMzREIsIDB4MzNERSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgzM0UxLCAweDMzRTQsIDB4MzNFNywgMHgzM0VBLCAweDMzRUQsIDB4MzNGMCwgMHgzM0YzLCAweDMzRjYsIDB4MzNGOSwgMHgzM0ZDLCAweDMzRkYsIDB4MzQwMiwgMHgzNDA1LCAweDM0MDgsCi0gICAgMHgzNDBCLCAweDM0MEUsIDB4MzQxMSwgMHgzNDE0LCAweDM0MTcsIDB4MzQxQSwgMHgzNDFELCAweDM0MjAsIDB4MzQyMywgMHgzNDI2LCAweDM0MjksIDB4MzQyQywgMHgzNDJGLCAweDM0MzIsIDB4MzQzNSwgMHgzNDM4LAotICAgIDB4MzQzQiwgMHgzNDNFLCAweDM0NDEsIDB4MzQ0NCwgMHgzNDQ3LCAweDM0NEEsIDB4MzQ0RCwgMHgzNDUwLCAweDM0NTMsIDB4MzQ1NiwgMHgzNDU5LCAweDM0NUMsIDB4MzQ1RiwgMHgzNDYyLCAweDM0NjUsIDB4MzQ2OCwKLSAgICAweDM0NkIsIDB4MzQ2RSwgMHgzNDcxLCAweDM0NzQsIDB4MzQ3NywgMHgzNDdBLCAweDM0N0QsIDB4MzQ4MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDM0ODMsIDB4MzQ4NiwgMHg0MUE0LCAweDQxQTksIDB4NDFBRSwgMHg0MUIzLCAweDQxQjgsIDB4NDFCRCwgMHg0MUMyLCAweDM0ODksIDB4NDFDNywgMHg0MURBLCAweDQxRTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OTM2MCwgMHg5MzYxLCAweDkzNjIsIDB4OTM2MywgMHg5MzY0LCAweDkzNjUsIDB4OTM2NiwgMHg5MzY3LCAweDkzNjgsIDB4OTM2OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5MzZBLCAweDkzNkIsIDB4OTM2QywgMHg5MzZELCAweDkzNkUsIDB4OTM2RiwgMHg5MzcwLCAweDkzNzEsIDB4OTM3MiwgMHg5MzczLCAweDkzNzQsIDB4OTM3NSwgMHg5Mzc2LCAweDkzNzcsIDB4OTM3OCwgMHg5Mzc5LAotICAgIDB4OTM3QSwgMHg5MzdCLCAweDkzN0MsIDB4OTM3RCwgMHg5MzdFLCAweDAwMDAsIDB4MDAwMCwgMHg5MzdGLCAweDkzODAsIDB4OTM4MSwgMHg5MzgyLCAweDkzODMsIDB4OTM4NCwgMHg5Mzg1LCAweDkzODYsIDB4OTM4NywKLSAgICAweDkzODgsIDB4OTM4OSwgMHg5MzhBLCAweDAwMDAsIDB4OTM4QiwgMHg5MzhDLCAweDkzOEQsIDB4OTM4RSwgMHg5MzhGLCAweDkzOTAsIDB4OTM5MSwgMHg5MzkyLCAweDkzOTMsIDB4OTM5NCwgMHg5Mzk1LCAweDkzOTYsCi0gICAgMHg5Mzk3LCAweDkzOTgsIDB4OTM5OSwgMHg5MzlBLCAweDkzOUIsIDB4OTM5QywgMHg5MzlELCAweDAwMDAsIDB4OTM5RSwgMHg5MzlGLCAweDkzQTAsIDB4OTNBMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OTNBMiwgMHgyNkEwLCAweDkzQTMsIDB4MDAwMCwgMHg5M0E0LCAweDAwMDAsIDB4OTNBNSwgMHgyNkEyLCAweDkzQTYsIDB4MjZBNCwgMHg5M0E3LCAweDI2QTYsIDB4OTNBOCwgMHgyNkE4LCAweDkzQTksIDB4MjZBQSwKLSAgICAweDkzQUEsIDB4OTNBQiwgMHg5M0FDLCAweDkzQUQsIDB4OTNBRSwgMHg5M0FGLCAweDkzQjAsIDB4OTNCMSwgMHg5M0IyLCAweDkzQjMsIDB4OTNCNCwgMHg5M0I1LCAweDkzQjYsIDB4OTNCNywgMHg5M0I4LCAweDkzQjksCi0gICAgMHg5M0JBLCAweDkzQkIsIDB4OTNCQywgMHg5M0JELCAweDkzQkUsIDB4OTNCRiwgMHg5M0MwLCAweDkzQzEsIDB4OTNDMiwgMHg5M0MzLCAweDkzQzQsIDB4OTNDNSwgMHg5M0M2LCAweDkzQzcsIDB4OTNDOCwgMHg5M0M5LAotICAgIDB4OTNDQSwgMHg5M0NCLCAweDkzQ0MsIDB4OTNDRCwgMHg5M0NFLCAweDkzQ0YsIDB4OTNEMCwgMHg5M0QxLCAweDkzRDIsIDB4OTNEMywgMHg5M0Q0LCAweDkzRDUsIDB4OTNENiwgMHg5M0Q3LCAweDkzRDgsIDB4OTNEOSwKLSAgICAweDkzREEsIDB4OTNEQiwgMHg5M0RDLCAweDkzREQsIDB4OTNERSwgMHg5M0RGLCAweDkzRTAsIDB4OTNFMSwgMHg5M0UyLCAweDkzRTMsIDB4OTNFNCwgMHg5M0U1LCAweDkzRTYsIDB4OTNFNywgMHg5M0U4LCAweDkzRTksCi0gICAgMHg5M0VBLCAweDkzRUIsIDB4OTNFQywgMHg5M0VELCAweDkzRUUsIDB4OTNFRiwgMHg5M0YwLCAweDkzRjEsIDB4OTNGMiwgMHg5M0YzLCAweDkzRjQsIDB4OTNGNSwgMHg5M0Y2LCAweDkzRjcsIDB4OTNGOCwgMHg5M0Y5LAotICAgIDB4OTNGQSwgMHg5M0ZCLCAweDkzRkMsIDB4OTNGRCwgMHg5M0ZFLCAweDkzRkYsIDB4OTQwMCwgMHg5NDAxLCAweDk0MDIsIDB4OTQwMywgMHg5NDA0LCAweDk0MDUsIDB4OTQwNiwgMHg5NDA3LCAweDk0MDgsIDB4OTQwOSwKLSAgICAweDk0MEEsIDB4OTQwQiwgMHg5NDBDLCAweDk0MEQsIDB4OTQwRSwgMHg5NDBGLCAweDk0MTAsIDB4OTQxMSwgMHg5NDEyLCAweDk0MTMsIDB4OTQxNCwgMHg5NDE1LCAweDk0MTYsIDB4OTQxNywgMHg5NDE4LCAweDk0MTksCi0gICAgMHg5NDFBLCAweDk0MUIsIDB4OTQxQywgMHg5NDFELCAweDk0MUUsIDB4MjZBQywgMHgyNkFFLCAweDI2QjAsIDB4MjZCMiwgMHgyNkI0LCAweDI2QjYsIDB4MjZCOCwgMHgyNkJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg5NDFGLCAweDk0MjAsIDB4OTQyMSwgMHg5NDIyLCAweDk0MjMsIDB4OTQyNCwgMHg5NDI1LCAweDk0MjYsIDB4OTQyNywgMHg5NDI4LCAweDk0MjksIDB4OTQyQSwgMHg5NDJCLCAweDk0MkMsIDB4OTQyRCwKLSAgICAweDk0MkUsIDB4OTQyRiwgMHg5NDMwLCAweDk0MzEsIDB4OTQzMiwgMHg5NDMzLCAweDk0MzQsIDB4OTQzNSwgMHg5NDM2LCAweDk0MzcsIDB4OTQzOCwgMHg5NDM5LCAweDk0M0EsIDB4OTQzQiwgMHg5NDNDLCAweDk0M0QsCi0gICAgMHg5NDNFLCAweDk0M0YsIDB4OTQ0MCwgMHg5NDQxLCAweDk0NDIsIDB4OTQ0MywgMHg5NDQ0LCAweDk0NDUsIDB4OTQ0NiwgMHg5NDQ3LCAweDk0NDgsIDB4OTQ0OSwgMHg5NDRBLCAweDk0NEIsIDB4OTQ0QywgMHg5NDRELAotICAgIDB4OTQ0RSwgMHg5NDRGLCAweDk0NTAsIDB4OTQ1MSwgMHg5NDUyLCAweDk0NTMsIDB4OTQ1NCwgMHg5NDU1LCAweDk0NTYsIDB4OTQ1NywgMHg5NDU4LCAweDk0NTksIDB4OTQ1QSwgMHg5NDVCLCAweDk0NUMsIDB4OTQ1RCwKLSAgICAweDk0NUUsIDB4OTQ1RiwgMHg5NDYwLCAweDk0NjEsIDB4OTQ2MiwgMHg5NDYzLCAweDk0NjQsIDB4OTQ2NSwgMHg5NDY2LCAweDk0NjcsIDB4OTQ2OCwgMHg5NDY5LCAweDk0NkEsIDB4OTQ2QiwgMHg5NDZDLCAweDk0NkQsCi0gICAgMHg5NDZFLCAweDk0NkYsIDB4OTQ3MCwgMHg5NDcxLCAweDk0NzIsIDB4OTQ3MywgMHg5NDc0LCAweDk0NzUsIDB4OTQ3NiwgMHg5NDc3LCAweDk0NzgsIDB4OTQ3OSwgMHg5NDdBLCAweDk0N0IsIDB4OTQ3QywgMHg5NDdELAotICAgIDB4OTQ3RSwgMHg5NDdGLCAweDk0ODAsIDB4OTQ4MSwgMHg5NDgyLCAweDk0ODMsIDB4OTQ4NCwgMHg5NDg1LCAweDk0ODYsIDB4OTQ4NywgMHg5NDg4LCAweDk0ODksIDB4OTQ4QSwgMHg5NDhCLCAweDk0OEMsIDB4OTQ4RCwKLSAgICAweDk0OEUsIDB4OTQ4RiwgMHg5NDkwLCAweDk0OTEsIDB4OTQ5MiwgMHg5NDkzLCAweDk0OTQsIDB4OTQ5NSwgMHg5NDk2LCAweDk0OTcsIDB4OTQ5OCwgMHg5NDk5LCAweDk0OUEsIDB4OTQ5QiwgMHg5NDlDLCAweDk0OUQsCi0gICAgMHg5NDlFLCAweDk0OUYsIDB4OTRBMCwgMHg5NEExLCAweDk0QTIsIDB4OTRBMywgMHg5NEE0LCAweDk0QTUsIDB4OTRBNiwgMHg5NEE3LCAweDk0QTgsIDB4OTRBOSwgMHg5NEFBLCAweDk0QUIsIDB4OTRBQywgMHg5NEFELAotICAgIDB4OTRBRSwgMHg5NEFGLCAweDk0QjAsIDB4OTRCMSwgMHg5NEIyLCAweDk0QjMsIDB4OTRCNCwgMHg5NEI1LCAweDk0QjYsIDB4OTRCNywgMHg5NEI4LCAweDk0QjksIDB4OTRCQSwgMHg5NEJCLCAweDk0QkMsIDB4OTRCRCwKLSAgICAweDk0QkUsIDB4OTRCRiwgMHg5NEMwLCAweDk0QzEsIDB4OTRDMiwgMHg5NEMzLCAweDk0QzQsIDB4OTRDNSwgMHg5NEM2LCAweDk0QzcsIDB4OTRDOCwgMHg5NEM5LCAweDk0Q0EsIDB4OTRDQiwgMHg5NENDLCAweDk0Q0QsCi0gICAgMHg5NENFLCAweDk0Q0YsIDB4OTREMCwgMHg5NEQxLCAweDk0RDIsIDB4OTREMywgMHg5NEQ0LCAweDk0RDUsIDB4OTRENiwgMHg5NEQ3LCAweDk0RDgsIDB4OTREOSwgMHg5NERBLCAweDk0REIsIDB4OTREQywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDk0REQsIDB4OTRERSwgMHg5NERGLCAweDk0RTAsIDB4OTRFMSwgMHg5NEUyLCAweDAwMDAsIDB4MDAwMCwgMHg5NEUzLCAweDk0RTQsIDB4OTRFNSwgMHg5NEU2LCAweDk0RTcsIDB4OTRFOCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5NEU5LCAweDk0RUEsIDB4OTRFQiwgMHg5NEVDLCAweDk0RUQsIDB4OTRFRSwgMHgwMDAwLCAweDAwMDAsIDB4OTRFRiwgMHg5NEYwLCAweDk0RjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5NEYyLCAweDk0RjMsIDB4OTRGNCwgMHg5NEY1LCAweDk0RjYsIDB4OTRGNywgMHg5NEY4LCAweDAwMDAsIDB4OTRGOSwgMHg5NEZBLCAweDk0RkIsIDB4OTRGQywgMHg5NEZELCAweDk0RkUsIDB4OTRGRiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMAotfTsKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgwMDEsIDB4MDAwMCwgMHgyMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgyMDAyLCAweDgwMDIsIDB4MDAwMCwgMHgyMDA0LCAweDAwMDAsIDB4MDAwMCwgMHg4MDAzLCAweDgwMDQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgwMDUsIDB4MDAwMCwgMHg4MDA2LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODAwNywgMHg4MDA4LCAweDAwMDAsIDB4MDAwMCwgMHg4MDA5LCAweDgwMEEsCisgICAgMHg4MDBCLCAweDgwMEMsIDB4MDAwMCwgMHgwMDAwLCAweDgwMEQsIDB4ODAwRSwgMHg4MDBGLCAweDAwMDAsIDB4MzAwMCwKKyAgICAweDMwMDMsIDB4MzAwNiwgMHgwMDAwLCAweDgwMTAsIDB4ODAxMSwgMHg4MDEyLCAweDgwMTMsIDB4ODAxNCwgMHg4MDE1LAorICAgIDB4MDAwMCwgMHg4MDE2LCAweDgwMTcsIDB4ODAxOCwgMHg4MDE5LCAweDgwMUEsIDB4ODAxQiwgMHg4MDFDLCAweDgwMUQsCisgICAgMHg4MDFFLCAweDgwMUYsIDB4ODAyMCwgMHg4MDIxLCAweDgwMjIsIDB4ODAyMywgMHg4MDI0LCAweDgwMjUsIDB4MDAwMCwKKyAgICAweDgwMjYsIDB4ODAyNywgMHg4MDI4LCAweDgwMjksIDB4ODAyQSwgMHg4MDJCLCAweDAwMDAsIDB4MDAwMCwgMHg4MDJDLAorICAgIDB4ODAyRCwgMHg4MDJFLCAweDgwMkYsIDB4ODAzMCwgMHg4MDMxLCAweDAwMDAsIDB4ODAzMiwgMHg4MDMzLCAweDgwMzQsCisgICAgMHg4MDM1LCAweDgwMzYsIDB4ODAzNywgMHg4MDM4LCAweDgwMzksIDB4ODAzQSwgMHgwMDAwLCAweDgwM0IsIDB4ODAzQywKKyAgICAweDgwM0QsIDB4ODAzRSwgMHg4MDNGLCAweDgwNDAsIDB4MDAwMCwgMHg4MDQxLCAweDgwNDIsIDB4ODA0MywgMHg4MDQ0LAorICAgIDB4ODA0NSwgMHg4MDQ2LCAweDAwMDAsIDB4ODA0NywgMHg4MDQ4LCAweDgwNDksIDB4ODA0QSwgMHg4MDRCLCAweDgwNEMsCisgICAgMHg4MDRELCAweDgwNEUsIDB4ODA0RiwgMHg4MDUwLCAweDgwNTEsIDB4ODA1MiwgMHg4MDUzLCAweDgwNTQsIDB4ODA1NSwKKyAgICAweDgwNTYsIDB4ODA1NywgMHg4MDU4LCAweDgwNTksIDB4ODA1QSwgMHg4MDVCLCAweDgwNUMsIDB4ODA1RCwgMHg4MDVFLAorICAgIDB4ODA1RiwgMHg4MDYwLCAweDgwNjEsIDB4ODA2MiwgMHg4MDYzLCAweDgwNjQsIDB4ODA2NSwgMHg4MDY2LCAweDgwNjcsCisgICAgMHg4MDY4LCAweDgwNjksIDB4ODA2QSwgMHg4MDZCLCAweDgwNkMsIDB4ODA2RCwgMHg4MDZFLCAweDgwNkYsIDB4ODA3MCwKKyAgICAweDgwNzEsIDB4ODA3MiwgMHg4MDczLCAweDgwNzQsIDB4ODA3NSwgMHg4MDc2LCAweDgwNzcsIDB4ODA3OCwgMHgwMDAwLAorICAgIDB4MjAwNiwgMHgyMDA4LCAweDgwNzksIDB4ODA3QSwgMHg4MDdCLCAweDgwN0MsIDB4ODA3RCwgMHg4MDdFLCAweDgwN0YsCisgICAgMHg4MDgwLCAweDgwODEsIDB4ODA4MiwgMHg4MDgzLCAweDgwODQsIDB4ODA4NSwgMHg4MDg2LCAweDgwODcsIDB4ODA4OCwKKyAgICAweDgwODksIDB4ODA4QSwgMHg4MDhCLCAweDgwOEMsIDB4ODA4RCwgMHg4MDhFLCAweDAwMDAsIDB4MDAwMCwgMHg4MDhGLAorICAgIDB4ODA5MCwgMHg4MDkxLCAweDgwOTIsIDB4ODA5MywgMHg4MDk0LCAweDIwMEEsIDB4MjAwQywgMHg4MDk1LCAweDgwOTYsCisgICAgMHg4MDk3LCAweDgwOTgsIDB4ODA5OSwgMHg4MDlBLCAweDgwOUIsIDB4ODA5QywgMHg4MDlELCAweDgwOUUsIDB4ODA5RiwKKyAgICAweDgwQTAsIDB4ODBBMSwgMHg4MEEyLCAweDgwQTMsIDB4ODBBNCwgMHg4MEE1LCAweDgwQTYsIDB4ODBBNywgMHg4MEE4LAorICAgIDB4ODBBOSwgMHg4MEFBLCAweDgwQUIsIDB4ODBBQywgMHg4MEFELCAweDgwQUUsIDB4ODBBRiwgMHg4MEIwLCAweDgwQjEsCisgICAgMHg4MEIyLCAweDgwQjMsIDB4ODBCNCwgMHg4MEI1LCAweDgwQjYsIDB4ODBCNywgMHg4MEI4LCAweDgwQjksIDB4ODBCQSwKKyAgICAweDgwQkIsIDB4ODBCQywgMHg4MEJELCAweDgwQkUsIDB4ODBCRiwgMHg4MEMwLCAweDgwQzEsIDB4ODBDMiwgMHg4MEMzLAorICAgIDB4ODBDNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MEM1LCAweDgwQzYsIDB4ODBDNywgMHg4MEM4LCAweDgwQzksCisgICAgMHg4MENBLCAweDAwMDAsIDB4ODBDQiwgMHgwMDAwLCAweDgwQ0MsIDB4ODBDRCwgMHg4MENFLCAweDgwQ0YsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4MEQwLCAweDgwRDEsIDB4ODBEMiwgMHg4MEQzLCAweDAwMDAsIDB4ODBENCwgMHg4MEQ1LAorICAgIDB4ODBENiwgMHg4MEQ3LCAweDgwRDgsIDB4ODBEOSwgMHgwMDAwLCAweDAwMDAsIDB4ODBEQSwgMHg4MERCLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MERDLCAweDgwREQsIDB4ODBERSwgMHg4MERGLCAweDgwRTAsIDB4ODBFMSwKKyAgICAweDgwRTIsIDB4MDAwMCwgMHg4MEUzLCAweDgwRTQsIDB4ODBFNSwgMHg4MEU2LCAweDgwRTcsIDB4MDAwMCwgMHg4MEU4LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MjAwRSwgMHgyMDEwLCAweDIwMTIsIDB4MjAxNCwgMHgyMDE2LCAweDIwMTgsIDB4MjAxQSwKKyAgICAweDIwMUMsIDB4MjAxRSwgMHg4MEU5LCAweDgwRUEsIDB4ODBFQiwgMHg4MEVDLCAweDgwRUQsIDB4ODBFRSwgMHg4MEVGLAorICAgIDB4ODBGMCwgMHg4MEYxLCAweDgwRjIsIDB4ODBGMywgMHg4MEY0LCAweDgwRjUsIDB4ODBGNiwgMHg4MEY3LCAweDgwRjgsCisgICAgMHg4MEY5LCAweDgwRkEsIDB4ODBGQiwgMHg4MEZDLCAweDgwRkQsIDB4ODBGRSwgMHg4MEZGLCAweDgxMDAsIDB4ODEwMSwKKyAgICAweDgxMDIsIDB4ODEwMywgMHg4MTA0LCAweDgxMDUsIDB4ODEwNiwgMHg4MTA3LCAweDgxMDgsIDB4ODEwOSwgMHg4MTBBLAorICAgIDB4ODEwQiwgMHg4MTBDLCAweDIwMjAsIDB4MjAyMiwgMHgyMDI0LCAweDgxMEQsIDB4ODEwRSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4MTBGLCAweDgxMTAsIDB4ODExMSwgMHg4MTEyLCAweDgxMTMsIDB4ODExNCwgMHg4MTE1LCAweDgxMTYsIDB4ODExNywKKyAgICAweDgxMTgsIDB4ODExOSwgMHg4MTFBLCAweDgxMUIsIDB4ODExQywgMHg4MTFELCAweDgxMUUsIDB4ODExRiwgMHg4MTIwLAorICAgIDB4ODEyMSwgMHg4MTIyLCAweDgxMjMsIDB4ODEyNCwgMHg4MTI1LCAweDgxMjYsIDB4ODEyNywgMHg4MTI4LCAweDgxMjksCisgICAgMHg4MTJBLCAweDgxMkIsIDB4ODEyQywgMHg4MTJELCAweDgxMkUsIDB4ODEyRiwgMHg4MTMwLCAweDgxMzEsIDB4ODEzMiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4MTMzLCAweDgxMzQsIDB4ODEzNSwgMHg4MTM2LCAweDAwMDAsIDB4MDAwMCwgMHg4MTM3LAorICAgIDB4ODEzOCwgMHg4MTM5LCAweDgxM0EsIDB4ODEzQiwgMHg4MTNDLCAweDgxM0QsIDB4ODEzRSwgMHg4MTNGLCAweDgxNDAsCisgICAgMHg4MTQxLCAweDgxNDIsIDB4ODE0MywgMHg4MTQ0LCAweDgxNDUsIDB4ODE0NiwgMHg4MTQ3LCAweDgxNDgsIDB4ODE0OSwKKyAgICAweDgxNEEsIDB4MjAyNiwgMHgyMDI4LCAweDgxNEIsIDB4ODE0QywgMHg4MTRELCAweDgxNEUsIDB4ODE0RiwgMHg4MTUwLAorICAgIDB4ODE1MSwgMHgwMDAwLCAweDAwMDAsIDB4ODE1MiwgMHg4MTUzLCAweDgxNTQsIDB4ODE1NSwgMHg4MTU2LCAweDgxNTcsCisgICAgMHg4MTU4LCAweDgxNTksIDB4ODE1QSwgMHg4MTVCLCAweDgxNUMsIDB4ODE1RCwgMHg4MTVFLCAweDgxNUYsIDB4MDAwMCwKKyAgICAweDgxNjAsIDB4ODE2MSwgMHg4MTYyLCAweDgxNjMsIDB4ODE2NCwgMHg4MTY1LCAweDgxNjYsIDB4MDAwMCwgMHg4MTY3LAorICAgIDB4ODE2OCwgMHg4MTY5LCAweDgxNkEsIDB4ODE2QiwgMHg4MTZDLCAweDgxNkQsIDB4ODE2RSwgMHg4MTZGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDgxNzAsIDB4ODE3MSwgMHgwMDAwLCAweDgxNzIsIDB4MDAwMCwgMHg4MTczLCAweDgxNzQsIDB4ODE3NSwKKyAgICAweDgxNzYsIDB4MDAwMCwgMHg4MTc3LCAweDgxNzgsIDB4ODE3OSwgMHg4MTdBLCAweDgxN0IsIDB4ODE3QywgMHg4MTdELAorICAgIDB4MjAyQSwgMHgwMDAwLCAweDAwMDAsIDB4ODE3RSwgMHg4MTdGLCAweDgxODAsIDB4ODE4MSwgMHg4MTgyLCAweDgxODMsCisgICAgMHg4MTg0LCAweDgxODUsIDB4ODE4NiwgMHg4MTg3LCAweDAwMDAsIDB4ODE4OCwgMHg4MTg5LCAweDgxOEEsIDB4ODE4QiwKKyAgICAweDgxOEMsIDB4ODE4RCwgMHgwMDAwLCAweDgxOEUsIDB4ODE4RiwgMHg4MTkwLCAweDgxOTEsIDB4ODE5MiwgMHg4MTkzLAorICAgIDB4ODE5NCwgMHgwMDAwLCAweDgxOTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODE5NiwgMHgwMDAwLCAweDgxOTcsCisgICAgMHg4MTk4LCAweDgxOTksIDB4ODE5QSwgMHg4MTlCLCAweDgxOUMsIDB4ODE5RCwgMHg4MTlFLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDIwMkMsIDB4MjAyRSwgMHgyMDMwLCAweDIwMzIsIDB4MjAzNCwgMHgyMDM2LCAweDIwMzgsIDB4MjAzQSwgMHgyMDNDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDgxOUYsIDB4ODFBMCwgMHg4MUExLCAweDgxQTIsIDB4ODFBMywgMHg4MUE0LCAweDgxQTUsCisgICAgMHg4MUE2LCAweDgxQTcsIDB4ODFBOCwgMHg4MUE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFBQSwgMHg4MUFCLAorICAgIDB4ODFBQywgMHg4MUFELCAweDgxQUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxQUYsIDB4ODFCMCwgMHgwMDAwLCAweDgxQjEsIDB4ODFCMiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxQjMsIDB4ODFCNCwgMHg4MUI1LCAweDgxQjYsIDB4ODFCNywgMHg4MUI4LAorICAgIDB4ODFCOSwgMHg4MUJBLCAweDgxQkIsIDB4ODFCQywgMHg4MUJELCAweDgxQkUsIDB4ODFCRiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODFDMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxQzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODFDMiwgMHg4MUMzLCAweDgxQzQsIDB4ODFDNSwgMHg4MUM2LCAweDgxQzcsIDB4ODFDOCwgMHgwMDAwLCAweDgxQzksCisgICAgMHgwMDAwLCAweDgxQ0EsIDB4ODFDQiwgMHg4MUNDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODFDRCwgMHg4MUNFLCAweDgxQ0YsIDB4ODFEMCwgMHg4MUQxLCAweDgxRDIsIDB4ODFEMywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxRDQsIDB4ODFENSwKKyAgICAweDgxRDYsIDB4ODFENywgMHg4MUQ4LCAweDAwMDAsIDB4ODFEOSwgMHg4MURBLCAweDgxREIsIDB4ODFEQywgMHg4MURELAorICAgIDB4ODFERSwgMHg4MURGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODFFMCwgMHg4MUUxLCAweDgxRTIsIDB4MDAwMCwgMHg4MUUzLCAweDgxRTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4MUU1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxRTYsIDB4ODFFNywKKyAgICAweDAwMDAsIDB4ODFFOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4MUVBLCAweDgxRUIsIDB4ODFFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODFFRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUVGLCAweDgxRjAsIDB4MDAwMCwKKyAgICAweDgxRjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFGMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODFGMywgMHg4MUY0LCAweDgxRjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUY2LCAweDgxRjcsIDB4MDAwMCwgMHgwMDAwLCAweDgxRjgsIDB4ODFGOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUZBLAorICAgIDB4ODFGQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxRkMsIDB4ODFGRCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODFGRSwgMHg4MUZGLCAweDAwMDAsIDB4MDAwMCwgMHg4MjAwLCAweDgyMDEsIDB4ODIwMiwgMHg4MjAzLAorICAgIDB4ODIwNCwgMHg4MjA1LCAweDgyMDYsIDB4ODIwNywgMHg4MjA4LCAweDgyMDksIDB4ODIwQSwgMHg4MjBCLCAweDgyMEMsCisgICAgMHg4MjBELCAweDgyMEUsIDB4ODIwRiwgMHg4MjEwLCAweDgyMTEsIDB4ODIxMiwgMHg4MjEzLCAweDgyMTQsIDB4ODIxNSwKKyAgICAweDIwM0UsIDB4MjA0MCwgMHg4MjE2LCAweDgyMTcsIDB4MDAwMCwgMHgwMDAwLCAweDgyMTgsIDB4ODIxOSwgMHg4MjFBLAorICAgIDB4ODIxQiwgMHgwMDAwLCAweDAwMDAsIDB4ODIxQywgMHg4MjFELCAweDgyMUUsIDB4ODIxRiwgMHgyMDQyLCAweDIwNDQsCisgICAgMHg4MjIwLCAweDgyMjEsIDB4ODIyMiwgMHg4MjIzLCAweDAwMDAsIDB4MDAwMCwgMHg4MjI0LCAweDgyMjUsIDB4ODIyNiwKKyAgICAweDgyMjcsIDB4MDAwMCwgMHg4MjI4LCAweDgyMjksIDB4ODIyQSwgMHg4MjJCLCAweDgyMkMsIDB4ODIyRCwgMHg4MjJFLAorICAgIDB4ODIyRiwgMHg4MjMwLCAweDgyMzEsIDB4MDAwMCwgMHgwMDAwLCAweDgyMzIsIDB4ODIzMywgMHgwMDAwLCAweDgyMzQsCisgICAgMHg4MjM1LCAweDgyMzYsIDB4ODIzNywgMHgyMDQ2LCAweDIwNDgsIDB4ODIzOCwgMHg4MjM5LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDgyM0EsIDB4ODIzQiwgMHg4MjNDLCAweDgyM0QsIDB4ODIzRSwgMHg4MjNGLCAweDAwMDAsIDB4MDAwMCwgMHg4MjQwLAorICAgIDB4ODI0MSwgMHg4MjQyLCAweDgyNDMsIDB4ODI0NCwgMHg4MjQ1LCAweDAwMDAsIDB4MDAwMCwgMHg4MjQ2LCAweDgyNDcsCisgICAgMHg4MjQ4LCAweDgyNDksIDB4ODI0QSwgMHg4MjRCLCAweDgyNEMsIDB4ODI0RCwgMHg4MjRFLCAweDgyNEYsIDB4ODI1MCwKKyAgICAweDgyNTEsIDB4ODI1MiwgMHg4MjUzLCAweDgyNTQsIDB4ODI1NSwgMHg4MjU2LCAweDgyNTcsIDB4ODI1OCwgMHg4MjU5LAorICAgIDB4ODI1QSwgMHg4MjVCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDgyNUMsIDB4ODI1RCwgMHg4MjVFLCAweDgyNUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDIwNEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwNEMsIDB4MjA0RSwgMHgyMDUwLAorICAgIDB4MjA1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDIwNTQsIDB4MDAwMCwgMHgyMDU2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDIwNTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA1QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA1QywgMHgwMDAwLCAweDAwMDAsIDB4MjA1RSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDYwLCAweDIwNjIsCisgICAgMHgyMDY0LCAweDIwNjYsIDB4MjA2OCwgMHgyMDZBLCAweDIwNkMsIDB4MjA2RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA3MCwgMHgyMDcyLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDc0LCAweDIwNzYsIDB4MDAwMCwgMHgyMDc4LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDIwN0EsIDB4MDAwMCwgMHgwMDAwLCAweDIwN0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwN0UsIDB4MjA4MCwgMHgyMDgyLCAweDAwMDAsIDB4MDAwMCwgMHgyMDg0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA4NiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyMDg4LCAweDIwOEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDIwOEMsIDB4MjA4RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDkwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDkyLCAweDIwOTQsIDB4MjA5NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA5OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDlBLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA5QywgMHgyMDlFLCAweDAwMDAsIDB4MjBBMCwgMHgyMEEyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDIwQTQsIDB4MjBBNiwgMHgyMEE4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MjBBQSwgMHgwMDAwLCAweDIwQUMsIDB4MjBBRSwgMHgyMEIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQjIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgyMEI0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEI2LCAweDIwQjgsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4MjYwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDIwQkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyMEJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBCRSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBDMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQzIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEM2LCAweDAwMDAsIDB4MjBDOCwgMHgyMENBLCAweDIwQ0MsCisgICAgMHgyMENFLCAweDIwRDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDIwRDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgyMEQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MjBENiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwRDgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDIwREEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMERDLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyMERFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwRTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODI2MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwRTIsIDB4MDAwMCwgMHgyMEU0LAorICAgIDB4MDAwMCwgMHgyMEU2LCAweDAwMDAsIDB4MjBFOCwgMHgwMDAwLCAweDIwRUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgyMEVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEVFLCAweDAwMDAsIDB4MjBGMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgyMEYyLCAweDIwRjQsIDB4MDAwMCwgMHgyMEY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MjYyLCAweDgyNjMsCisgICAgMHg4MjY0LCAweDgyNjUsIDB4ODI2NiwgMHg4MjY3LCAweDgyNjgsIDB4ODI2OSwgMHg4MjZBLCAweDgyNkIsIDB4ODI2QywKKyAgICAweDgyNkQsIDB4ODI2RSwgMHg4MjZGLCAweDgyNzAsIDB4MDAwMCwgMHg4MjcxLCAweDgyNzIsIDB4ODI3MywgMHg4Mjc0LAorICAgIDB4ODI3NSwgMHg4Mjc2LCAweDgyNzcsIDB4ODI3OCwgMHg4Mjc5LCAweDgyN0EsIDB4ODI3QiwgMHg4MjdDLCAweDgyN0QsCisgICAgMHg4MjdFLCAweDgyN0YsIDB4ODI4MCwgMHg4MjgxLCAweDgyODIsIDB4MDAwMCwgMHg4MjgzLCAweDgyODQsIDB4ODI4NSwKKyAgICAweDgyODYsIDB4ODI4NywgMHg4Mjg4LCAweDgyODksIDB4ODI4QSwgMHg4MjhCLCAweDgyOEMsIDB4ODI4RCwgMHg4MjhFLAorICAgIDB4ODI4RiwgMHg4MjkwLCAweDgyOTEsIDB4ODI5MiwgMHg4MjkzLCAweDgyOTQsIDB4ODI5NSwgMHg4Mjk2LCAweDgyOTcsCisgICAgMHg4Mjk4LCAweDgyOTksIDB4ODI5QSwgMHg4MjlCLCAweDgyOUMsIDB4ODI5RCwgMHg4MjlFLCAweDAwMDAsIDB4ODI5RiwKKyAgICAweDgyQTAsIDB4ODJBMSwgMHg4MkEyLCAweDgyQTMsIDB4ODJBNCwgMHg4MkE1LCAweDgyQTYsIDB4ODJBNywgMHg4MkE4LAorICAgIDB4ODJBOSwgMHg4MkFBLCAweDgyQUIsIDB4MDAwMCwgMHgyMEY4LCAweDgyQUMsIDB4MDAwMCwgMHg4MkFELCAweDgyQUUsCisgICAgMHg4MkFGLCAweDgyQjAsIDB4ODJCMSwgMHg4MkIyLCAweDgyQjMsIDB4ODJCNCwgMHg4MkI1LCAweDgyQjYsIDB4ODJCNywKKyAgICAweDgyQjgsIDB4ODJCOSwgMHg4MkJBLCAweDgyQkIsIDB4ODJCQywgMHg4MkJELCAweDgyQkUsIDB4ODJCRiwgMHg4MkMwLAorICAgIDB4ODJDMSwgMHg4MkMyLCAweDgyQzMsIDB4ODJDNCwgMHg4MkM1LCAweDgyQzYsIDB4MDAwMCwgMHg4MkM3LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDgyQzgsIDB4ODJDOSwgMHg4MkNBLCAweDgyQ0IsIDB4ODJDQywgMHg4MkNELCAweDgyQ0UsIDB4ODJDRiwKKyAgICAweDgyRDAsIDB4ODJEMSwgMHg4MkQyLCAweDgyRDMsIDB4ODJENCwgMHg4MkQ1LCAweDgyRDYsIDB4ODJENywgMHg4MkQ4LAorICAgIDB4ODJEOSwgMHg4MkRBLCAweDgyREIsIDB4ODJEQywgMHg4MkRELCAweDgyREUsIDB4ODJERiwgMHg4MkUwLCAweDgyRTEsCisgICAgMHg4MkUyLCAweDgyRTMsIDB4ODJFNCwgMHg4MkU1LCAweDgyRTYsIDB4ODJFNywgMHg4MkU4LCAweDgyRTksIDB4ODJFQSwKKyAgICAweDgyRUIsIDB4ODJFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODJFRCwgMHg4MkVFLCAweDgyRUYsIDB4ODJGMCwgMHg4MkYxLCAweDgyRjIsCisgICAgMHg4MkYzLCAweDgyRjQsIDB4ODJGNSwgMHg4MkY2LCAweDgyRjcsIDB4ODJGOCwgMHg4MkY5LCAweDgyRkEsIDB4ODJGQiwKKyAgICAweDgyRkMsIDB4ODJGRCwgMHg4MkZFLCAweDgyRkYsIDB4ODMwMCwgMHg4MzAxLCAweDgzMDIsIDB4ODMwMywgMHg4MzA0LAorICAgIDB4ODMwNSwgMHg4MzA2LCAweDgzMDcsIDB4ODMwOCwgMHg4MzA5LCAweDgzMEEsIDB4ODMwQiwgMHg4MzBDLCAweDgzMEQsCisgICAgMHg4MzBFLCAweDgzMEYsIDB4ODMxMCwgMHg4MzExLCAweDgzMTIsIDB4ODMxMywgMHg4MzE0LCAweDgzMTUsIDB4ODMxNiwKKyAgICAweDgzMTcsIDB4ODMxOCwgMHg4MzE5LCAweDgzMUEsIDB4ODMxQiwgMHg4MzFDLCAweDgzMUQsIDB4ODMxRSwgMHg4MzFGLAorICAgIDB4ODMyMCwgMHg4MzIxLCAweDgzMjIsIDB4ODMyMywgMHg4MzI0LCAweDgzMjUsIDB4ODMyNiwgMHg4MzI3LCAweDgzMjgsCisgICAgMHg4MzI5LCAweDgzMkEsIDB4ODMyQiwgMHg4MzJDLCAweDgzMkQsIDB4ODMyRSwgMHg4MzJGLCAweDgzMzAsIDB4ODMzMSwKKyAgICAweDgzMzIsIDB4ODMzMywgMHg4MzM0LCAweDgzMzUsIDB4ODMzNiwgMHg4MzM3LCAweDgzMzgsIDB4ODMzOSwgMHg4MzNBLAorICAgIDB4ODMzQiwgMHg4MzNDLCAweDgzM0QsIDB4ODMzRSwgMHg4MzNGLCAweDgzNDAsIDB4ODM0MSwgMHg4MzQyLCAweDgzNDMsCisgICAgMHg4MzQ0LCAweDgzNDUsIDB4ODM0NiwgMHg4MzQ3LCAweDgzNDgsIDB4ODM0OSwgMHg4MzRBLCAweDgzNEIsIDB4ODM0QywKKyAgICAweDgzNEQsIDB4ODM0RSwgMHg4MzRGLCAweDgzNTAsIDB4ODM1MSwgMHg4MzUyLCAweDgzNTMsIDB4ODM1NCwgMHg4MzU1LAorICAgIDB4ODM1NiwgMHg4MzU3LCAweDgzNTgsIDB4ODM1OSwgMHg4MzVBLCAweDgzNUIsIDB4ODM1QywgMHg4MzVELCAweDgzNUUsCisgICAgMHg4MzVGLCAweDgzNjAsIDB4ODM2MSwgMHg4MzYyLCAweDgzNjMsIDB4ODM2NCwgMHg4MzY1LCAweDgzNjYsIDB4ODM2NywKKyAgICAweDgzNjgsIDB4ODM2OSwgMHg4MzZBLCAweDgzNkIsIDB4ODM2QywgMHg4MzZELCAweDgzNkUsIDB4ODM2RiwgMHg4MzcwLAorICAgIDB4ODM3MSwgMHg4MzcyLCAweDgzNzMsIDB4ODM3NCwgMHg4Mzc1LCAweDgzNzYsIDB4ODM3NywgMHg4Mzc4LCAweDgzNzksCisgICAgMHg4MzdBLCAweDgzN0IsIDB4ODM3QywgMHg4MzdELCAweDgzN0UsIDB4ODM3RiwgMHg4MzgwLCAweDgzODEsIDB4ODM4MiwKKyAgICAweDgzODMsIDB4ODM4NCwgMHg4Mzg1LCAweDgzODYsIDB4ODM4NywgMHg4Mzg4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4Mzg5LCAweDgzOEEsIDB4ODM4QiwgMHg4MzhDLCAweDgzOEQsIDB4ODM4RSwgMHg4MzhGLCAweDgzOTAsCisgICAgMHg4MzkxLCAweDgzOTIsIDB4ODM5MywgMHg4Mzk0LCAweDgzOTUsIDB4ODM5NiwgMHg4Mzk3LCAweDgzOTgsIDB4ODM5OSwKKyAgICAweDgzOUEsIDB4ODM5QiwgMHg4MzlDLCAweDgzOUQsIDB4ODM5RSwgMHg4MzlGLCAweDgzQTAsIDB4ODNBMSwgMHg4M0EyLAorICAgIDB4ODNBMywgMHg4M0E0LCAweDgzQTUsIDB4ODNBNiwgMHg4M0E3LCAweDgzQTgsIDB4ODNBOSwgMHg4M0FBLCAweDgzQUIsCisgICAgMHg4M0FDLCAweDgzQUQsIDB4ODNBRSwgMHg4M0FGLCAweDgzQjAsIDB4ODNCMSwgMHg4M0IyLCAweDgzQjMsIDB4ODNCNCwKKyAgICAweDgzQjUsIDB4ODNCNiwgMHg4M0I3LCAweDgzQjgsIDB4ODNCOSwgMHg4M0JBLCAweDgzQkIsIDB4ODNCQywgMHg4M0JELAorICAgIDB4ODNCRSwgMHg4M0JGLCAweDgzQzAsIDB4ODNDMSwgMHg4M0MyLCAweDgzQzMsIDB4ODNDNCwgMHg4M0M1LCAweDgzQzYsCisgICAgMHg4M0M3LCAweDgzQzgsIDB4ODNDOSwgMHg4M0NBLCAweDgzQ0IsIDB4ODNDQywgMHg4M0NELCAweDgzQ0UsIDB4ODNDRiwKKyAgICAweDgzRDAsIDB4ODNEMSwgMHg4M0QyLCAweDgzRDMsIDB4ODNENCwgMHg4M0Q1LCAweDgzRDYsIDB4ODNENywgMHg4M0Q4LAorICAgIDB4ODNEOSwgMHg4M0RBLCAweDgzREIsIDB4ODNEQywgMHg4M0RELCAweDgzREUsIDB4ODNERiwgMHg4M0UwLCAweDgzRTEsCisgICAgMHg4M0UyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgzRTMsIDB4ODNFNCwKKyAgICAweDgzRTUsIDB4ODNFNiwgMHg4M0U3LCAweDgzRTgsIDB4ODNFOSwgMHg4M0VBLCAweDgzRUIsIDB4ODNFQywgMHg4M0VELAorICAgIDB4ODNFRSwgMHg4M0VGLCAweDgzRjAsIDB4ODNGMSwgMHg4M0YyLCAweDgzRjMsIDB4ODNGNCwgMHg4M0Y1LCAweDgzRjYsCisgICAgMHg4M0Y3LCAweDgzRjgsIDB4MDAwMCwgMHgwMDAwLCAweDgzRjksIDB4ODNGQSwgMHg4M0ZCLCAweDgzRkMsIDB4ODNGRCwKKyAgICAweDgzRkUsIDB4MDAwMCwgMHgwMDAwLCAweDgzRkYsIDB4ODQwMCwgMHg4NDAxLCAweDg0MDIsIDB4ODQwMywgMHg4NDA0LAorICAgIDB4ODQwNSwgMHg4NDA2LCAweDg0MDcsIDB4ODQwOCwgMHg4NDA5LCAweDg0MEEsIDB4ODQwQiwgMHg4NDBDLCAweDg0MEQsCisgICAgMHg4NDBFLCAweDg0MEYsIDB4ODQxMCwgMHg4NDExLCAweDg0MTIsIDB4ODQxMywgMHg4NDE0LCAweDg0MTUsIDB4ODQxNiwKKyAgICAweDg0MTcsIDB4ODQxOCwgMHg4NDE5LCAweDg0MUEsIDB4ODQxQiwgMHg4NDFDLCAweDg0MUQsIDB4ODQxRSwgMHg4NDFGLAorICAgIDB4ODQyMCwgMHg4NDIxLCAweDg0MjIsIDB4ODQyMywgMHg4NDI0LCAweDAwMDAsIDB4MDAwMCwgMHg4NDI1LCAweDg0MjYsCisgICAgMHg4NDI3LCAweDg0MjgsIDB4ODQyOSwgMHg4NDJBLCAweDAwMDAsIDB4MDAwMCwgMHg4NDJCLCAweDg0MkMsIDB4ODQyRCwKKyAgICAweDg0MkUsIDB4ODQyRiwgMHg4NDMwLCAweDg0MzEsIDB4ODQzMiwgMHgwMDAwLCAweDg0MzMsIDB4MDAwMCwgMHg4NDM0LAorICAgIDB4MDAwMCwgMHg4NDM1LCAweDAwMDAsIDB4ODQzNiwgMHg4NDM3LCAweDg0MzgsIDB4ODQzOSwgMHg4NDNBLCAweDg0M0IsCisgICAgMHg4NDNDLCAweDg0M0QsIDB4ODQzRSwgMHg4NDNGLCAweDg0NDAsIDB4ODQ0MSwgMHg4NDQyLCAweDg0NDMsIDB4ODQ0NCwKKyAgICAweDg0NDUsIDB4ODQ0NiwgMHg4NDQ3LCAweDg0NDgsIDB4ODQ0OSwgMHg4NDRBLCAweDg0NEIsIDB4ODQ0QywgMHg4NDRELAorICAgIDB4ODQ0RSwgMHg4NDRGLCAweDg0NTAsIDB4ODQ1MSwgMHg4NDUyLCAweDg0NTMsIDB4ODQ1NCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4NDU1LCAweDg0NTYsIDB4ODQ1NywgMHg4NDU4LCAweDg0NTksIDB4ODQ1QSwgMHg4NDVCLCAweDg0NUMsIDB4ODQ1RCwKKyAgICAweDg0NUUsIDB4ODQ1RiwgMHg4NDYwLCAweDg0NjEsIDB4ODQ2MiwgMHg4NDYzLCAweDg0NjQsIDB4ODQ2NSwgMHg4NDY2LAorICAgIDB4ODQ2NywgMHg4NDY4LCAweDg0NjksIDB4ODQ2QSwgMHg4NDZCLCAweDg0NkMsIDB4ODQ2RCwgMHg4NDZFLCAweDg0NkYsCisgICAgMHg4NDcwLCAweDg0NzEsIDB4ODQ3MiwgMHg4NDczLCAweDg0NzQsIDB4ODQ3NSwgMHg4NDc2LCAweDg0NzcsIDB4ODQ3OCwKKyAgICAweDg0NzksIDB4ODQ3QSwgMHg4NDdCLCAweDg0N0MsIDB4ODQ3RCwgMHg4NDdFLCAweDg0N0YsIDB4ODQ4MCwgMHg4NDgxLAorICAgIDB4ODQ4MiwgMHg4NDgzLCAweDg0ODQsIDB4ODQ4NSwgMHg4NDg2LCAweDg0ODcsIDB4ODQ4OCwgMHg4NDg5LCAweDAwMDAsCisgICAgMHg4NDhBLCAweDg0OEIsIDB4ODQ4QywgMHg4NDhELCAweDg0OEUsIDB4ODQ4RiwgMHg4NDkwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg0OTEsIDB4ODQ5MiwgMHg4NDkzLCAweDAwMDAsIDB4ODQ5NCwgMHg4NDk1LAorICAgIDB4ODQ5NiwgMHg4NDk3LCAweDg0OTgsIDB4ODQ5OSwgMHg4NDlBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg0OUIsCisgICAgMHg4NDlDLCAweDg0OUQsIDB4ODQ5RSwgMHgwMDAwLCAweDAwMDAsIDB4ODQ5RiwgMHg4NEEwLCAweDg0QTEsIDB4ODRBMiwKKyAgICAweDg0QTMsIDB4ODRBNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg0QTUsIDB4ODRBNiwgMHg4NEE3LAorICAgIDB4ODRBOCwgMHg4NEE5LCAweDg0QUEsIDB4ODRBQiwgMHg4NEFDLCAweDg0QUQsIDB4ODRBRSwgMHg4NEFGLCAweDg0QjAsCisgICAgMHg4NEIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NEIyLCAweDg0QjMsIDB4ODRCNCwKKyAgICAweDAwMDAsIDB4ODRCNSwgMHg4NEI2LCAweDg0QjcsIDB4ODRCOCwgMHg4NEI5LCAweDg0QkEsIDB4ODRCQiwgMHg4NEJDLAorICAgIDB4ODRCRCwgMHgwMDAwLCAweDg0QkUsIDB4ODRCRiwgMHg4NEMwLCAweDg0QzEsIDB4ODRDMiwgMHg4NEMzLCAweDg0QzQsCisgICAgMHg4NEM1LCAweDg0QzYsIDB4ODRDNywgMHg4NEM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODRDOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODRDQSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODRDQiwgMHgyMEZBLCAweDMwMDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODRDQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEZDLAorICAgIDB4MzAwQywgMHgwMDAwLCAweDIwRkUsIDB4MzAwRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxMDAsCisgICAgMHgwMDAwLCAweDIxMDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MjEwNCwgMHgyMTA2LCAweDIxMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg0Q0QsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODRDRSwgMHg4NENGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg0RDAsIDB4ODREMSwgMHg4NEQyLCAweDg0RDMsIDB4ODRENCwgMHg4NEQ1LCAweDg0RDYsIDB4ODRENywKKyAgICAweDg0RDgsIDB4ODREOSwgMHg4NERBLCAweDg0REIsIDB4ODREQywgMHg4NERELCAweDg0REUsIDB4ODRERiwgMHg4NEUwLAorICAgIDB4ODRFMSwgMHg4NEUyLCAweDg0RTMsIDB4ODRFNCwgMHg4NEU1LCAweDg0RTYsIDB4ODRFNywgMHg4NEU4LCAweDg0RTksCisgICAgMHg4NEVBLCAweDAwMDAsIDB4ODRFQiwgMHg4NEVDLCAweDg0RUQsIDB4ODRFRSwgMHg4NEVGLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxMEEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzMDEyLCAweDMwMTUsIDB4ODRGMCwKKyAgICAweDIxMEMsIDB4MDAwMCwgMHgzMDE4LCAweDMwMUIsIDB4ODRGMSwgMHgwMDAwLCAweDIxMEUsIDB4ODRGMiwgMHg4NEYzLAorICAgIDB4ODRGNCwgMHg4NEY1LCAweDg0RjYsIDB4ODRGNywgMHg4NEY4LCAweDg0RjksIDB4ODRGQSwgMHg4NEZCLCAweDAwMDAsCisgICAgMHg4NEZDLCAweDIxMTAsIDB4MDAwMCwgMHgwMDAwLCAweDg0RkQsIDB4ODRGRSwgMHg4NEZGLCAweDg1MDAsIDB4ODUwMSwKKyAgICAweDg1MDIsIDB4ODUwMywgMHgyMTEyLCAweDMwMUUsIDB4MjExNCwgMHg4NTA0LCAweDg1MDUsIDB4MDAwMCwgMHg4NTA2LAorICAgIDB4ODUwNywgMHg4NTA4LCAweDAwMDAsIDB4ODUwOSwgMHg4NTBBLCAweDg1MEIsIDB4ODUwQywgMHg4NTBELCAweDg1MEUsCisgICAgMHg4NTBGLCAweDg1MTAsIDB4MDAwMCwgMHg4NTExLCAweDg1MTIsIDB4ODUxMywgMHg4NTE0LCAweDg1MTUsIDB4ODUxNiwKKyAgICAweDg1MTcsIDB4MDAwMCwgMHgzMDIxLCAweDg1MTgsIDB4ODUxOSwgMHg4NTFBLCAweDg1MUIsIDB4ODUxQywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODUxRCwgMHg4NTFFLCAweDg1MUYsIDB4ODUyMCwgMHg4NTIxLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzAyNCwgMHgzMDI3LCAweDQwMDUsIDB4MzAyQSwKKyAgICAweDMwMkQsIDB4MzAzMCwgMHgzMDMzLCAweDMwMzYsIDB4MzAzOSwgMHgzMDNDLCAweDMwM0YsIDB4MzA0MiwgMHgzMDQ1LAorICAgIDB4MzA0OCwgMHgzMDRCLCAweDIxMTYsIDB4ODUyMiwgMHgyMTE4LCAweDMwNEUsIDB4MjExQSwgMHg4NTIzLCAweDIxMUMsCisgICAgMHgzMDUxLCAweDQwMEEsIDB4MjExRSwgMHg4NTI0LCAweDIxMjAsIDB4MzA1NCwgMHg4NTI1LCAweDg1MjYsIDB4ODUyNywKKyAgICAweDg1MjgsIDB4ODUyOSwgMHgyMTIyLCAweDMwNTcsIDB4MjEyNCwgMHg4NTJBLCAweDIxMjYsIDB4MzA1QSwgMHg0MDBGLAorICAgIDB4MjEyOCwgMHg4NTJCLCAweDIxMkEsIDB4MzA1RCwgMHg4NTJDLCAweDg1MkQsIDB4ODUyRSwgMHg4NTJGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzA2MCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTJDLCAweDIxMkUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MjEzMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTMyLCAweDIxMzQsIDB4MjEzNiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1MzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg1MzEsIDB4MDAwMCwgMHgwMDAwLCAweDg1MzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDIxMzgsIDB4MDAwMCwgMHgyMTNBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDIxM0MsIDB4MzA2MywgMHgwMDAwLCAweDIxM0UsIDB4MzA2NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTQwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTQyLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDIxNDQsIDB4MDAwMCwgMHgyMTQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxNDgsIDB4MDAwMCwKKyAgICAweDIxNEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDIxNEMsIDB4MjE0RSwgMHgyMTUwLCAweDIxNTIsIDB4MjE1NCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgyMTU2LCAweDIxNTgsIDB4MDAwMCwgMHgwMDAwLCAweDIxNUEsIDB4MjE1QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxNUUsIDB4MjE2MCwgMHgwMDAwLCAweDAwMDAsIDB4MjE2MiwgMHgyMTY0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDIxNjYsIDB4MjE2OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MjE2QSwgMHgyMTZDLCAweDIxNkUsIDB4MjE3MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgyMTcyLCAweDIxNzQsIDB4MjE3NiwgMHgyMTc4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MjE3QSwgMHgyMTdDLCAweDIxN0UsIDB4MjE4MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4NTMzLCAweDg1MzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MzA2OSwgMHgzMDZDLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDIxODIsCisgICAgMHgyMTg0LCAweDIxODYsIDB4MjE4OCwgMHgyMThBLCAweDIxOEMsIDB4MjE4RSwgMHgyMTkwLCAweDMwODEsIDB4MzA4NCwKKyAgICAweDMwODcsIDB4MzA4QSwgMHgzMDhELCAweDMwOTAsIDB4MzA5MywgMHgzMDk2LCAweDMwOTksIDB4MjE5MiwgMHgzMDlDLAorICAgIDB4MzA5RiwgMHgyMTk0LCAweDIxOTYsIDB4MjE5OCwgMHgyMTlBLCAweDIxOUMsIDB4MzBBMiwgMHg4NTM1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NTM2LCAweDg1MzcsIDB4ODUzOCwKKyAgICAweDg1MzksIDB4ODUzQSwgMHg4NTNCLCAweDg1M0MsIDB4ODUzRCwgMHg4NTNFLCAweDIxOUUsIDB4MjFBMCwgMHgyMUEyLAorICAgIDB4MjFBNCwgMHgyMUE2LCAweDIxQTgsIDB4MjFBQSwgMHgyMUFDLCAweDIxQUUsIDB4MjFCMCwgMHgyMUIyLCAweDMwQTUsCisgICAgMHgzMEE4LCAweDMwQUIsIDB4MzBBRSwgMHgzMEIxLCAweDMwQjQsIDB4MzBCNywgMHgzMEJBLCAweDMwQkQsIDB4NDAxNCwKKyAgICAweDQwMTksIDB4NDAxRSwgMHg0MDIzLCAweDQwMjgsIDB4NDAyRCwgMHg0MDMyLCAweDQwMzcsIDB4NDAzQywgMHg0MDQxLAorICAgIDB4NDA0NiwgMHgyMUI0LCAweDIxQjYsIDB4MjFCOCwgMHgyMUJBLCAweDIxQkMsIDB4MjFCRSwgMHgyMUMwLCAweDIxQzIsCisgICAgMHgyMUM0LCAweDMwQzAsIDB4MzBDMywgMHgzMEM2LCAweDMwQzksIDB4MzBDQywgMHgzMENGLCAweDMwRDIsIDB4MzBENSwKKyAgICAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwRTEsIDB4MzBFNCwgMHgzMEU3LCAweDMwRUEsIDB4MzBFRCwgMHgzMEYwLAorICAgIDB4MzBGMywgMHgzMEY2LCAweDMwRjksIDB4MzBGQywgMHgzMEZGLCAweDMxMDIsIDB4MzEwNSwgMHgzMTA4LCAweDMxMEIsCisgICAgMHgzMTBFLCAweDMxMTEsIDB4MzExNCwgMHgzMTE3LCAweDMxMUEsIDB4MzExRCwgMHgzMTIwLCAweDMxMjMsIDB4MzEyNiwKKyAgICAweDMxMjksIDB4MzEyQywgMHg4NTNGLCAweDg1NDAsIDB4ODU0MSwgMHg4NTQyLCAweDg1NDMsIDB4ODU0NCwgMHg4NTQ1LAorICAgIDB4ODU0NiwgMHg4NTQ3LCAweDg1NDgsIDB4ODU0OSwgMHg4NTRBLCAweDg1NEIsIDB4ODU0QywgMHg4NTRELCAweDg1NEUsCisgICAgMHg4NTRGLCAweDg1NTAsIDB4ODU1MSwgMHg4NTUyLCAweDg1NTMsIDB4ODU1NCwgMHg4NTU1LCAweDg1NTYsIDB4ODU1NywKKyAgICAweDg1NTgsIDB4ODU1OSwgMHg4NTVBLCAweDg1NUIsIDB4ODU1QywgMHg4NTVELCAweDg1NUUsIDB4ODU1RiwgMHg4NTYwLAorICAgIDB4ODU2MSwgMHg4NTYyLCAweDg1NjMsIDB4ODU2NCwgMHg4NTY1LCAweDg1NjYsIDB4ODU2NywgMHg4NTY4LCAweDg1NjksCisgICAgMHg4NTZBLCAweDg1NkIsIDB4ODU2QywgMHg4NTZELCAweDg1NkUsIDB4ODU2RiwgMHg4NTcwLCAweDg1NzEsIDB4ODU3MiwKKyAgICAweDg1NzMsIDB4MjFDNiwgMHgyMUM4LCAweDIxQ0EsIDB4MjFDQywgMHgyMUNFLCAweDIxRDAsIDB4MjFEMiwgMHgyMUQ0LAorICAgIDB4MjFENiwgMHgyMUQ4LCAweDg1NzQsIDB4ODU3NSwgMHg4NTc2LCAweDg1NzcsIDB4ODU3OCwgMHg4NTc5LCAweDg1N0EsCisgICAgMHg4NTdCLCAweDg1N0MsIDB4MjFEQSwgMHg4NTdELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODU3RSwgMHg4NTdGLCAweDg1ODAsIDB4ODU4MSwgMHg4NTgyLAorICAgIDB4ODU4MywgMHg4NTg0LCAweDg1ODUsIDB4ODU4NiwgMHgyMURDLCAweDg1ODcsIDB4ODU4OCwgMHg4NTg5LCAweDg1OEEsCisgICAgMHg4NThCLCAweDg1OEMsIDB4ODU4RCwgMHg4NThFLCAweDg1OEYsIDB4MjFERSwgMHg4NTkwLCAweDg1OTEsIDB4ODU5MiwKKyAgICAweDg1OTMsIDB4ODU5NCwgMHg4NTk1LCAweDg1OTYsIDB4ODU5NywgMHg4NTk4LCAweDIxRTAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg0MDRCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDMxMkYsIDB4MjFFMiwgMHgzMTMyLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgyMUU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODU5OSwgMHg4NTlBLCAweDg1OUIsIDB4ODU5QywgMHg4NTlELCAweDg1OUUsIDB4ODU5RiwKKyAgICAweDg1QTAsIDB4ODVBMSwgMHg4NUEyLCAweDg1QTMsIDB4ODVBNCwgMHg4NUE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4NUE2LCAweDg1QTcsIDB4ODVBOCwgMHg4NUE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NUFBLCAweDg1QUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NUFDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODVBRCwgMHg4NUFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NUFGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg1QjAsIDB4MDAwMCwgMHg4NUIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NUIyLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODVCMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODVCNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODVCNSwgMHg4NUI2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODVCNywgMHg4NUI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODVCOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QkEsCisgICAgMHg4NUJCLCAweDg1QkMsIDB4ODVCRCwgMHg4NUJFLCAweDg1QkYsIDB4ODVDMCwgMHg4NUMxLCAweDg1QzIsIDB4ODVDMywKKyAgICAweDg1QzQsIDB4ODVDNSwgMHg4NUM2LCAweDg1QzcsIDB4ODVDOCwgMHg4NUM5LCAweDg1Q0EsIDB4ODVDQiwgMHg4NUNDLAorICAgIDB4ODVDRCwgMHg4NUNFLCAweDg1Q0YsIDB4ODVEMCwgMHg4NUQxLCAweDg1RDIsIDB4ODVEMywgMHg4NUQ0LCAweDg1RDUsCisgICAgMHg4NUQ2LCAweDg1RDcsIDB4ODVEOCwgMHg4NUQ5LCAweDg1REEsIDB4ODVEQiwgMHg4NURDLCAweDg1REQsIDB4ODVERSwKKyAgICAweDg1REYsIDB4ODVFMCwgMHg4NUUxLCAweDg1RTIsIDB4ODVFMywgMHg4NUU0LCAweDg1RTUsIDB4ODVFNiwgMHg4NUU3LAorICAgIDB4ODVFOCwgMHg4NUU5LCAweDg1RUEsIDB4ODVFQiwgMHg4NUVDLCAweDg1RUQsIDB4ODVFRSwgMHg4NUVGLCAweDg1RjAsCisgICAgMHg4NUYxLCAweDg1RjIsIDB4ODVGMywgMHg4NUY0LCAweDg1RjUsIDB4ODVGNiwgMHg4NUY3LCAweDg1RjgsIDB4ODVGOSwKKyAgICAweDg1RkEsIDB4ODVGQiwgMHg4NUZDLCAweDg1RkQsIDB4ODVGRSwgMHg4NUZGLCAweDg2MDAsIDB4ODYwMSwgMHg4NjAyLAorICAgIDB4ODYwMywgMHg4NjA0LCAweDg2MDUsIDB4ODYwNiwgMHg4NjA3LCAweDg2MDgsIDB4ODYwOSwgMHg4NjBBLCAweDg2MEIsCisgICAgMHg4NjBDLCAweDg2MEQsIDB4ODYwRSwgMHg4NjBGLCAweDg2MTAsIDB4ODYxMSwgMHg4NjEyLCAweDg2MTMsIDB4ODYxNCwKKyAgICAweDg2MTUsIDB4ODYxNiwgMHg4NjE3LCAweDg2MTgsIDB4ODYxOSwgMHg4NjFBLCAweDg2MUIsIDB4ODYxQywgMHg4NjFELAorICAgIDB4ODYxRSwgMHg4NjFGLCAweDg2MjAsIDB4ODYyMSwgMHg4NjIyLCAweDg2MjMsIDB4ODYyNCwgMHg4NjI1LCAweDg2MjYsCisgICAgMHg4NjI3LCAweDg2MjgsIDB4ODYyOSwgMHg4NjJBLCAweDg2MkIsIDB4ODYyQywgMHg4NjJELCAweDg2MkUsIDB4ODYyRiwKKyAgICAweDg2MzAsIDB4ODYzMSwgMHg4NjMyLCAweDg2MzMsIDB4ODYzNCwgMHg4NjM1LCAweDg2MzYsIDB4ODYzNywgMHg4NjM4LAorICAgIDB4ODYzOSwgMHg4NjNBLCAweDg2M0IsIDB4ODYzQywgMHg4NjNELCAweDg2M0UsIDB4ODYzRiwgMHg4NjQwLCAweDg2NDEsCisgICAgMHg4NjQyLCAweDg2NDMsIDB4ODY0NCwgMHg4NjQ1LCAweDg2NDYsIDB4ODY0NywgMHg4NjQ4LCAweDg2NDksIDB4ODY0QSwKKyAgICAweDg2NEIsIDB4ODY0QywgMHg4NjRELCAweDg2NEUsIDB4ODY0RiwgMHg4NjUwLCAweDg2NTEsIDB4ODY1MiwgMHg4NjUzLAorICAgIDB4ODY1NCwgMHg4NjU1LCAweDg2NTYsIDB4ODY1NywgMHg4NjU4LCAweDg2NTksIDB4ODY1QSwgMHg4NjVCLCAweDg2NUMsCisgICAgMHg4NjVELCAweDg2NUUsIDB4ODY1RiwgMHg4NjYwLCAweDg2NjEsIDB4ODY2MiwgMHg4NjYzLCAweDg2NjQsIDB4ODY2NSwKKyAgICAweDg2NjYsIDB4ODY2NywgMHg4NjY4LCAweDg2NjksIDB4ODY2QSwgMHg4NjZCLCAweDg2NkMsIDB4ODY2RCwgMHg4NjZFLAorICAgIDB4ODY2RiwgMHg4NjcwLCAweDg2NzEsIDB4ODY3MiwgMHg4NjczLCAweDg2NzQsIDB4ODY3NSwgMHg4Njc2LCAweDg2NzcsCisgICAgMHg4Njc4LCAweDg2NzksIDB4ODY3QSwgMHg4NjdCLCAweDg2N0MsIDB4ODY3RCwgMHg4NjdFLCAweDg2N0YsIDB4ODY4MCwKKyAgICAweDg2ODEsIDB4ODY4MiwgMHg4NjgzLCAweDg2ODQsIDB4ODY4NSwgMHg4Njg2LCAweDg2ODcsIDB4ODY4OCwgMHg4Njg5LAorICAgIDB4ODY4QSwgMHg4NjhCLCAweDg2OEMsIDB4ODY4RCwgMHg4NjhFLCAweDg2OEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg2OTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg2OTEsIDB4MDAwMCwgMHg4NjkyLCAweDg2OTMsIDB4ODY5NCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxRTYsIDB4MDAwMCwKKyAgICAweDIxRTgsIDB4MDAwMCwgMHgyMUVBLCAweDAwMDAsIDB4MjFFQywgMHgwMDAwLCAweDIxRUUsIDB4MDAwMCwgMHgyMUYwLAorICAgIDB4MDAwMCwgMHgyMUYyLCAweDAwMDAsIDB4MjFGNCwgMHgwMDAwLCAweDIxRjYsIDB4MDAwMCwgMHgyMUY4LCAweDAwMDAsCisgICAgMHgyMUZBLCAweDAwMDAsIDB4MjFGQywgMHgwMDAwLCAweDAwMDAsIDB4MjFGRSwgMHgwMDAwLCAweDIyMDAsIDB4MDAwMCwKKyAgICAweDIyMDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjIwNCwgMHgyMjA2LAorICAgIDB4MDAwMCwgMHgyMjA4LCAweDIyMEEsIDB4MDAwMCwgMHgyMjBDLCAweDIyMEUsIDB4MDAwMCwgMHgyMjEwLCAweDIyMTIsCisgICAgMHgwMDAwLCAweDIyMTQsIDB4MjIxNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMjE4LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjIxQSwgMHgyMjFDLCAweDAwMDAsIDB4MjIxRSwKKyAgICAweDIyMjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMjIyLCAweDAwMDAsIDB4MjIyNCwgMHgwMDAwLCAweDIyMjYsCisgICAgMHgwMDAwLCAweDIyMjgsIDB4MDAwMCwgMHgyMjJBLCAweDAwMDAsIDB4MjIyQywgMHgwMDAwLCAweDIyMkUsIDB4MDAwMCwKKyAgICAweDIyMzAsIDB4MDAwMCwgMHgyMjMyLCAweDAwMDAsIDB4MjIzNCwgMHgwMDAwLCAweDIyMzYsIDB4MDAwMCwgMHgyMjM4LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDIyM0EsIDB4MDAwMCwgMHgyMjNDLCAweDAwMDAsIDB4MjIzRSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIyNDAsIDB4MjI0MiwgMHgwMDAwLCAweDIyNDQsIDB4MjI0NiwKKyAgICAweDAwMDAsIDB4MjI0OCwgMHgyMjRBLCAweDAwMDAsIDB4MjI0QywgMHgyMjRFLCAweDAwMDAsIDB4MjI1MCwgMHgyMjUyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjI1NCwgMHgwMDAwLCAweDAwMDAsIDB4MjI1NiwgMHgyMjU4LAorICAgIDB4MjI1QSwgMHgyMjVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIyNUUsIDB4MjI2MCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg2OTUsIDB4ODY5NiwgMHg4Njk3LCAweDg2OTgsIDB4ODY5OSwgMHg4NjlBLCAweDg2OUIsCisgICAgMHg4NjlDLCAweDg2OUQsIDB4ODY5RSwgMHg4NjlGLCAweDg2QTAsIDB4ODZBMSwgMHg4NkEyLCAweDg2QTMsIDB4ODZBNCwKKyAgICAweDg2QTUsIDB4ODZBNiwgMHg4NkE3LCAweDg2QTgsIDB4ODZBOSwgMHg4NkFBLCAweDg2QUIsIDB4ODZBQywgMHg4NkFELAorICAgIDB4ODZBRSwgMHg4NkFGLCAweDg2QjAsIDB4ODZCMSwgMHg4NkIyLCAweDg2QjMsIDB4ODZCNCwgMHg4NkI1LCAweDg2QjYsCisgICAgMHg4NkI3LCAweDg2QjgsIDB4ODZCOSwgMHg4NkJBLCAweDg2QkIsIDB4ODZCQywgMHg4NkJELCAweDg2QkUsIDB4ODZCRiwKKyAgICAweDg2QzAsIDB4ODZDMSwgMHg4NkMyLCAweDg2QzMsIDB4ODZDNCwgMHg4NkM1LCAweDg2QzYsIDB4ODZDNywgMHg4NkM4LAorICAgIDB4ODZDOSwgMHg4NkNBLCAweDg2Q0IsIDB4ODZDQywgMHg4NkNELCAweDg2Q0UsIDB4ODZDRiwgMHg4NkQwLCAweDg2RDEsCisgICAgMHg4NkQyLCAweDg2RDMsIDB4ODZENCwgMHg4NkQ1LCAweDg2RDYsIDB4ODZENywgMHg4NkQ4LCAweDg2RDksIDB4ODZEQSwKKyAgICAweDg2REIsIDB4ODZEQywgMHg4NkRELCAweDg2REUsIDB4ODZERiwgMHg4NkUwLCAweDg2RTEsIDB4ODZFMiwgMHg4NkUzLAorICAgIDB4ODZFNCwgMHg4NkU1LCAweDg2RTYsIDB4ODZFNywgMHg4NkU4LCAweDg2RTksIDB4ODZFQSwgMHg4NkVCLCAweDg2RUMsCisgICAgMHg4NkVELCAweDg2RUUsIDB4ODZFRiwgMHg4NkYwLCAweDg2RjEsIDB4ODZGMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg2RjMsIDB4ODZGNCwgMHg4NkY1LCAweDg2RjYsIDB4ODZGNywgMHg4NkY4LCAweDg2RjksIDB4ODZGQSwgMHg4NkZCLAorICAgIDB4ODZGQywgMHg4NkZELCAweDg2RkUsIDB4ODZGRiwgMHg4NzAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgzMTM1LCAweDMxMzgsIDB4MzEzQiwgMHgzMTNFLCAweDMxNDEsIDB4MzE0NCwgMHgzMTQ3LAorICAgIDB4MzE0QSwgMHgzMTRELCAweDMxNTAsIDB4MzE1MywgMHgzMTU2LCAweDMxNTksIDB4MzE1QywgMHg0MDUwLCAweDQwNTUsCisgICAgMHg0MDVBLCAweDQwNUYsIDB4NDA2NCwgMHg0MDY5LCAweDQwNkUsIDB4NDA3MywgMHg0MDc4LCAweDQwN0QsIDB4NDA4MiwKKyAgICAweDQwODcsIDB4NDA4QywgMHg0MDkxLCAweDQwOTYsIDB4NDA5QiwgMHg0MEEzLCAweDAwMDAsIDB4MzE1RiwgMHgzMTYyLAorICAgIDB4MzE2NSwgMHgzMTY4LCAweDMxNkIsIDB4MzE2RSwgMHgzMTcxLCAweDMxNzQsIDB4MzE3NywgMHgzMTdBLCAweDMxN0QsCisgICAgMHgzMTgwLCAweDMxODMsIDB4MzE4NiwgMHgzMTg5LCAweDMxOEMsIDB4MzE4RiwgMHgzMTkyLCAweDMxOTUsIDB4MzE5OCwKKyAgICAweDMxOUIsIDB4MzE5RSwgMHgzMUExLCAweDMxQTQsIDB4MzFBNywgMHgzMUFBLCAweDMxQUQsIDB4MzFCMCwgMHgzMUIzLAorICAgIDB4MzFCNiwgMHgzMUI5LCAweDMxQkMsIDB4MzFCRiwgMHgzMUMyLCAweDMxQzUsIDB4MzFDOCwgMHg4NzAxLCAweDg3MDIsCisgICAgMHg4NzAzLCAweDg3MDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MzFDQiwgMHgyMjYyLCAweDIyNjQsIDB4MjI2NiwgMHgyMjY4LCAweDIyNkEsIDB4MjI2QywgMHgyMjZFLAorICAgIDB4MjI3MCwgMHgyMjcyLCAweDIyNzQsIDB4MjI3NiwgMHgyMjc4LCAweDIyN0EsIDB4MjI3QywgMHgyMjdFLCAweDg3MDUsCisgICAgMHg4NzA2LCAweDg3MDcsIDB4ODcwOCwgMHg4NzA5LCAweDg3MEEsIDB4ODcwQiwgMHg4NzBDLCAweDg3MEQsIDB4ODcwRSwKKyAgICAweDg3MEYsIDB4ODcxMCwgMHg4NzExLCAweDg3MTIsIDB4MjI4MCwgMHgyMjgyLCAweDIyODQsIDB4MjI4NiwgMHgyMjg4LAorICAgIDB4MjI4QSwgMHgyMjhDLCAweDIyOEUsIDB4MjI5MCwgMHgyMjkyLCAweDIyOTQsIDB4MjI5NiwgMHgyMjk4LCAweDIyOUEsCisgICAgMHg0MEFBLCAweDQwQjAsIDB4MjI5QywgMHgwMDAwLCAweDg3MTMsIDB4ODcxNCwgMHg4NzE1LCAweDg3MTYsIDB4ODcxNywKKyAgICAweDg3MTgsIDB4ODcxOSwgMHg4NzFBLCAweDg3MUIsIDB4ODcxQywgMHg4NzFELCAweDg3MUUsIDB4ODcxRiwgMHg4NzIwLAorICAgIDB4ODcyMSwgMHg4NzIyLCAweDg3MjMsIDB4ODcyNCwgMHg4NzI1LCAweDg3MjYsIDB4ODcyNywgMHg4NzI4LCAweDg3MjksCisgICAgMHg4NzJBLCAweDg3MkIsIDB4ODcyQywgMHg4NzJELCAweDg3MkUsIDB4ODcyRiwgMHg4NzMwLCAweDg3MzEsIDB4ODczMiwKKyAgICAweDg3MzMsIDB4ODczNCwgMHg4NzM1LCAweDg3MzYsIDB4ODczNywgMHg4NzM4LCAweDg3MzksIDB4ODczQSwgMHg4NzNCLAorICAgIDB4ODczQywgMHg4NzNELCAweDg3M0UsIDB4ODczRiwgMHg4NzQwLCAweDg3NDEsIDB4ODc0MiwgMHg4NzQzLCAweDIyOUUsCisgICAgMHgyMkEwLCAweDIyQTIsIDB4MjJBNCwgMHgyMkE2LCAweDIyQTgsIDB4MjJBQSwgMHgyMkFDLCAweDIyQUUsIDB4MjJCMCwKKyAgICAweDIyQjIsIDB4MjJCNCwgMHgyMkI2LCAweDIyQjgsIDB4MjJCQSwgMHgyMkJDLCAweDIyQkUsIDB4MjJDMCwgMHgyMkMyLAorICAgIDB4MjJDNCwgMHgyMkM2LCAweDIyQzgsIDB4MjJDQSwgMHgyMkNDLCAweDMxQ0UsIDB4MzFEMSwgMHgzMUQ0LCAweDIyQ0UsCisgICAgMHgzMUQ3LCAweDIyRDAsIDB4MzFEQSwgMHg4NzQ0LCAweDg3NDUsIDB4ODc0NiwgMHg4NzQ3LCAweDg3NDgsIDB4ODc0OSwKKyAgICAweDg3NEEsIDB4ODc0QiwgMHg4NzRDLCAweDg3NEQsIDB4ODc0RSwgMHg4NzRGLCAweDg3NTAsIDB4ODc1MSwgMHg4NzUyLAorICAgIDB4ODc1MywgMHg4NzU0LCAweDg3NTUsIDB4ODc1NiwgMHg4NzU3LCAweDg3NTgsIDB4ODc1OSwgMHg4NzVBLCAweDg3NUIsCisgICAgMHg4NzVDLCAweDg3NUQsIDB4ODc1RSwgMHg4NzVGLCAweDg3NjAsIDB4ODc2MSwgMHg4NzYyLCAweDg3NjMsIDB4ODc2NCwKKyAgICAweDg3NjUsIDB4ODc2NiwgMHg4NzY3LCAweDg3NjgsIDB4ODc2OSwgMHg4NzZBLCAweDg3NkIsIDB4ODc2QywgMHg4NzZELAorICAgIDB4ODc2RSwgMHg4NzZGLCAweDg3NzAsIDB4ODc3MSwgMHg4NzcyLCAweDAwMDAsIDB4NDBCNSwgMHg0MEJBLCAweDQwQkYsCisgICAgMHgzMURELCAweDQwQzQsIDB4MzFFMCwgMHgzMUUzLCAweDQwQzksIDB4NDBDRiwgMHgzMUU2LCAweDMxRTksIDB4MzFFQywKKyAgICAweDQwRDQsIDB4NDBEOSwgMHgzMUVGLCAweDMxRjIsIDB4MjJEMiwgMHgzMUY1LCAweDQwREUsIDB4NDBFMywgMHgyMkQ0LAorICAgIDB4NDBFOCwgMHg0MEVFLCAweDQwRjUsIDB4MzFGOCwgMHg0MEZCLCAweDQxMDEsIDB4NDEwNywgMHgzMUZCLCAweDMxRkUsCisgICAgMHgzMjAxLCAweDQxMEMsIDB4NDExMSwgMHg0MTE3LCAweDMyMDQsIDB4MzIwNywgMHgzMjBBLCAweDIyRDYsIDB4MjJEOCwKKyAgICAweDIyREEsIDB4MjJEQywgMHgzMjBELCAweDMyMTAsIDB4NDExQywgMHgzMjEzLCAweDQxMjIsIDB4NDEyNywgMHgzMjE2LAorICAgIDB4MjJERSwgMHgyMkUwLCAweDQxMkQsIDB4NDEzMywgMHg0MTM4LCAweDMyMTksIDB4NDEzRSwgMHgyMkUyLCAweDMyMUMsCisgICAgMHgzMjFGLCAweDMyMjIsIDB4MzIyNSwgMHgzMjI4LCAweDQxNDQsIDB4MzIyQiwgMHgyMkU0LCAweDMyMkUsIDB4MzIzMSwKKyAgICAweDMyMzQsIDB4NDE0OSwgMHgzMjM3LCAweDMyM0EsIDB4MzIzRCwgMHg0MTRFLCAweDQxNTQsIDB4MjJFNiwgMHg0MTU5LAorICAgIDB4MjJFOCwgMHg0MTVGLCAweDQxNjQsIDB4MzI0MCwgMHgzMjQzLCAweDMyNDYsIDB4NDE2OSwgMHgyMkVBLCAweDMyNDksCisgICAgMHg0MTZFLCAweDIyRUMsIDB4NDE3MywgMHgzMjRDLCAweDIyRUUsIDB4MjJGMCwgMHgyMkYyLCAweDIyRjQsIDB4MjJGNiwKKyAgICAweDIyRjgsIDB4MjJGQSwgMHgyMkZDLCAweDIyRkUsIDB4MjMwMCwgMHgzMjRGLCAweDMyNTIsIDB4MzI1NSwgMHgzMjU4LAorICAgIDB4MzI1QiwgMHgzMjVFLCAweDMyNjEsIDB4MzI2NCwgMHgzMjY3LCAweDMyNkEsIDB4MzI2RCwgMHgzMjcwLCAweDMyNzMsCisgICAgMHgzMjc2LCAweDMyNzksIDB4MzI3QywgMHgyMzAyLCAweDIzMDQsIDB4MzI3RiwgMHgyMzA2LCAweDIzMDgsIDB4MjMwQSwKKyAgICAweDMyODIsIDB4MzI4NSwgMHgyMzBDLCAweDIzMEUsIDB4MjMxMCwgMHgyMzEyLCAweDIzMTQsIDB4NDE3OSwgMHgyMzE2LAorICAgIDB4MjMxOCwgMHgyMzFBLCAweDIzMUMsIDB4MjMxRSwgMHgyMzIwLCAweDIzMjIsIDB4MjMyNCwgMHgzMjg4LCAweDQxN0UsCisgICAgMHgyMzI2LCAweDIzMjgsIDB4MjMyQSwgMHgyMzJDLCAweDIzMkUsIDB4MjMzMCwgMHgyMzMyLCAweDMyOEIsIDB4MzI4RSwKKyAgICAweDMyOTEsIDB4MzI5NCwgMHgyMzM0LCAweDIzMzYsIDB4MjMzOCwgMHgyMzNBLCAweDIzM0MsIDB4MjMzRSwgMHgyMzQwLAorICAgIDB4MjM0MiwgMHgyMzQ0LCAweDIzNDYsIDB4MzI5NywgMHgzMjlBLCAweDIzNDgsIDB4MzI5RCwgMHgzMkEwLCAweDMyQTMsCisgICAgMHgyMzRBLCAweDMyQTYsIDB4MzJBOSwgMHg0MTgzLCAweDIzNEMsIDB4MzJBQywgMHgzMkFGLCAweDMyQjIsIDB4MzJCNSwKKyAgICAweDQxODgsIDB4NDE4RSwgMHgyMzRFLCAweDIzNTAsIDB4MjM1MiwgMHgyMzU0LCAweDIzNTYsIDB4MjM1OCwgMHgyMzVBLAorICAgIDB4MjM1QywgMHgyMzVFLCAweDIzNjAsIDB4MjM2MiwgMHgyMzY0LCAweDIzNjYsIDB4MjM2OCwgMHgyMzZBLCAweDIzNkMsCisgICAgMHgyMzZFLCAweDIzNzAsIDB4NDE5NSwgMHgyMzcyLCAweDIzNzQsIDB4MjM3NiwgMHg0MTlBLCAweDMyQjgsIDB4MjM3OCwKKyAgICAweDIzN0EsIDB4MjM3QywgMHgyMzdFLCAweDIzODAsIDB4MjM4MiwgMHgyMzg0LCAweDIzODYsIDB4MjM4OCwgMHgyMzhBLAorICAgIDB4MzJCQiwgMHgyMzhDLCAweDIzOEUsIDB4MzJCRSwgMHgzMkMxLCAweDIzOTAsIDB4NDE5RiwgMHgzMkM0LCAweDIzOTIsCisgICAgMHgyMzk0LCAweDIzOTYsIDB4MjM5OCwgMHgzMkM3LCAweDMyQ0EsIDB4MjM5QSwgMHgyMzlDLCAweDIzOUUsIDB4MjNBMCwKKyAgICAweDIzQTIsIDB4MjNBNCwgMHgyM0E2LCAweDIzQTgsIDB4MjNBQSwgMHgzMkNELCAweDMyRDAsIDB4MzJEMywgMHgzMkQ2LAorICAgIDB4MzJEOSwgMHgzMkRDLCAweDMyREYsIDB4MzJFMiwgMHgzMkU1LCAweDMyRTgsIDB4MzJFQiwgMHgzMkVFLCAweDMyRjEsCisgICAgMHgzMkY0LCAweDMyRjcsIDB4MzJGQSwgMHgzMkZELCAweDMzMDAsIDB4MzMwMywgMHgzMzA2LCAweDMzMDksIDB4MzMwQywKKyAgICAweDMzMEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg3NzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3NCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3NzUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3NzYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4Nzc3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3NzgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3NzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4NzdBLCAweDg3N0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3N0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzdFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzdGLCAweDg3ODAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODc4MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3ODIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODc4MywgMHgwMDAwLCAweDAwMDAsIDB4ODc4NCwgMHgwMDAwLCAweDg3ODUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc4NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3ODcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3ODgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3ODksIDB4ODc4QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc4QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzhDLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4NzhELCAweDAwMDAsIDB4ODc4RSwgMHg4NzhGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3OTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3OTEsIDB4MDAwMCwKKyAgICAweDg3OTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc5MywgMHg4Nzk0LCAweDg3OTUsIDB4MDAwMCwgMHg4Nzk2LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc5NywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg3OTgsIDB4MDAwMCwgMHgwMDAwLCAweDg3OTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc5QSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc5QiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3OUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3OUQsIDB4MDAwMCwgMHgwMDAwLCAweDg3OUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc5RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODdBMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3QTEsIDB4MDAwMCwgMHg4N0EyLCAweDAwMDAsIDB4ODdBMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODdBNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0E1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODdBNiwgMHg4N0E3LCAweDAwMDAsIDB4MDAwMCwgMHg4N0E4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdBOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdBQSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdBQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODdBQywgMHgwMDAwLCAweDAwMDAsIDB4ODdBRCwgMHg4N0FFLCAweDg3QUYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QjAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODdCMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QjMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QjQsIDB4MDAwMCwgMHg4N0I1LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4N0I3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdCOCwgMHg4N0I5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0JBLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdCQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QkMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdCRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODdCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3QkYsIDB4MDAwMCwgMHgwMDAwLCAweDg3QzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4N0MxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdDMiwgMHgwMDAwLCAweDg3QzMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdDNCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0M1LCAweDg3QzYsIDB4MDAwMCwgMHg4N0M3LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODdDOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0M5LCAweDAwMDAsIDB4ODdDQSwgMHg4N0NCLCAweDAwMDAsCisgICAgMHg4N0NDLCAweDg3Q0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdDRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3Q0YsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4N0QwLCAweDAwMDAsIDB4ODdEMSwgMHgwMDAwLCAweDg3RDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4N0QzLCAweDg3RDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdENSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3RDYsIDB4MDAwMCwgMHg4N0Q3LCAweDAwMDAsIDB4ODdEOCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4N0Q5LCAweDAwMDAsIDB4MDAwMCwgMHg4N0RBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3REIsCisgICAgMHgwMDAwLCAweDg3REMsIDB4MDAwMCwgMHg4N0RELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODdERSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0RGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFMCwgMHgwMDAwLCAweDg3RTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RTIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4N0UzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFNCwgMHgwMDAwLCAweDg3RTUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0U2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODdFNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODdFOSwgMHgwMDAwLCAweDAwMDAsIDB4ODdFQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0VCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0VDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0VELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0VFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3RUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdGMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3RjEsIDB4ODdGMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RjMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RjQsIDB4MDAwMCwgMHg4N0Y1LAorICAgIDB4MDAwMCwgMHg4N0Y2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdGOCwgMHg4N0Y5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3RkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdGQiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3RkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdGRCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODdGRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RkYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgwMSwgMHgwMDAwLCAweDg4MDIsIDB4ODgwMywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgwNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MDUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MDYsIDB4ODgwNywgMHg4ODA4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODA5LCAweDAwMDAsIDB4MDAwMCwgMHg4ODBBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4ODBCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODBELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgwRSwgMHgwMDAwLCAweDAwMDAsIDB4ODgwRiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgxMCwgMHg4ODExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MTIsIDB4MDAwMCwgMHgwMDAwLCAweDg4MTMsCisgICAgMHgwMDAwLCAweDg4MTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgxNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgxNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4MTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODE4LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODgxOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MUEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODFCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgxQywgMHgwMDAwLCAweDg4MUQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4MUUsIDB4ODgxRiwgMHg4ODIwLCAweDAwMDAsIDB4ODgyMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MjIsIDB4ODgyMywgMHg4ODI0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4MjUsIDB4MDAwMCwgMHgwMDAwLCAweDg4MjYsIDB4ODgyNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgyOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgyQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODJCLAorICAgIDB4MDAwMCwgMHg4ODJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgyRCwgMHg4ODJFLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4MkYsIDB4MDAwMCwgMHg4ODMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MzEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODgzMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgzMywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODgzNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgzNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MzYsIDB4MDAwMCwgMHg4ODM3LCAweDAwMDAsIDB4MDAwMCwgMHg4ODM4LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MzksIDB4ODgzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODNCLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4M0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODNELCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4M0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4M0YsIDB4MDAwMCwgMHg4ODQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4NDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4NDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4NDcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODg0OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODRBLCAweDg4NEIsIDB4ODg0QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODRELCAweDg4NEUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODg0RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4NTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NTEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NTIsCisgICAgMHgwMDAwLCAweDg4NTMsIDB4ODg1NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODg1NSwgMHgwMDAwLCAweDg4NTYsIDB4MDAwMCwgMHgwMDAwLCAweDg4NTcsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg1OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4ODVBLCAweDAwMDAsIDB4ODg1QiwgMHg4ODVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NUQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg1RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4ODVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODg2MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODg2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODY4LAorICAgIDB4ODg2OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODZBLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4NkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NkMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NkUsIDB4MDAwMCwgMHgwMDAwLCAweDg4NkYsIDB4ODg3MCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODg3MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODg3MiwgMHgwMDAwLCAweDAwMDAsIDB4ODg3MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODc0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODc1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODc2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NzcsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODc4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3OSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4N0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3QiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODdDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODg3RCwgMHg4ODdFLCAweDAwMDAsIDB4ODg3RiwgMHgwMDAwLCAweDg4ODAsIDB4ODg4MSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODgyLCAweDg4ODMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg4NCwgMHg4ODg1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4ODYsIDB4MDAwMCwgMHg4ODg3LCAweDg4ODgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODg4OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODhBLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg4QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4OEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OEQsIDB4MDAwMCwKKyAgICAweDg4OEUsIDB4MDAwMCwgMHgwMDAwLCAweDg4OEYsIDB4ODg5MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODkxLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg5MiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODg5MywgMHgwMDAwLCAweDg4OTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4ODk1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg5NiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OTcsCisgICAgMHgwMDAwLCAweDg4OTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODg5OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODg5QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg5QiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4ODlDLCAweDAwMDAsIDB4MDAwMCwgMHg4ODlELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg5RSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODlGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4QTAsIDB4MDAwMCwgMHg4OEExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhBMiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QTMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhBNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEE1LCAweDAwMDAsCisgICAgMHg4OEE2LCAweDAwMDAsIDB4ODhBNywgMHg4OEE4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEE5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhBQSwgMHgwMDAwLCAweDg4QUIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OEFDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QUQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhBRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhBRiwgMHgwMDAwLCAweDAwMDAsIDB4ODhCMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QjEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODhCMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEIzLCAweDg4QjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QjYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QjcsIDB4ODhCOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODhCOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QkEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEJCLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4QkMsIDB4ODhCRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OEJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODhCRiwgMHgwMDAwLCAweDAwMDAsIDB4ODhDMCwgMHgwMDAwLCAweDg4QzEsIDB4ODhDMiwgMHg4OEMzLCAweDg4QzQsCisgICAgMHg4OEM1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEM2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4QzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhDOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4QzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4Q0EsCisgICAgMHgwMDAwLCAweDg4Q0IsIDB4MDAwMCwgMHg4OENDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4Q0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhDRSwgMHgwMDAwLCAweDg4Q0YsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEQzLCAweDAwMDAsCisgICAgMHg4OEQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4RDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhENiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEQ3LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhEOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhEQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4REIsIDB4ODhEQywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhERCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhERSwgMHg4OERGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4RTEsIDB4ODhFMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RTQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODhFNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4RTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEU3LCAweDAwMDAsIDB4ODhFOCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhFOSwKKyAgICAweDAwMDAsIDB4ODhFQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RUIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OEVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RUQsCisgICAgMHg4OEVFLCAweDAwMDAsIDB4MDAwMCwgMHg4OEVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OEYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODhGNCwgMHg4OEY1LCAweDg4RjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGNywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4RjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEY5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODhGQSwgMHgwMDAwLCAweDAwMDAsIDB4ODhGQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEZDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OEZFLCAweDAwMDAsIDB4ODhGRiwgMHgwMDAwLCAweDAwMDAsIDB4ODkwMCwgMHg4OTAxLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkwMiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTA0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OTA1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MDYsIDB4ODkwNywgMHg4OTA4LCAweDAwMDAsIDB4ODkwOSwKKyAgICAweDAwMDAsIDB4ODkwQSwgMHgwMDAwLCAweDg5MEIsIDB4MDAwMCwgMHg4OTBDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkwRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MEUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MEYsCisgICAgMHgwMDAwLCAweDg5MTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkxMSwKKyAgICAweDAwMDAsIDB4ODkxMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTEzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5MTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkxNSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MTYsIDB4MDAwMCwgMHgwMDAwLCAweDg5MTcsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTE4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MTksIDB4ODkxQSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODkxQiwgMHgwMDAwLCAweDg5MUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MUQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODkxRiwgMHg4OTIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyMywKKyAgICAweDg5MjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyNywgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OTI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyOSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5MkEsIDB4MDAwMCwgMHgwMDAwLCAweDg5MkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5MkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTJELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTJFLCAweDAwMDAsIDB4MDAwMCwgMHg4OTJGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODkzMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTMxLCAweDAwMDAsIDB4ODkzMiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTMzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODkzNCwgMHg4OTM1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTM2LCAweDAwMDAsIDB4MDAwMCwgMHg4OTM3LCAweDg5MzgsIDB4MDAwMCwgMHg4OTM5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5M0EsIDB4MDAwMCwgMHgwMDAwLCAweDg5M0IsIDB4MDAwMCwgMHgwMDAwLCAweDg5M0MsCisgICAgMHg4OTNELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5M0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5M0YsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk0MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTQxLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5NDIsIDB4ODk0MywgMHg4OTQ0LCAweDg5NDUsIDB4MDAwMCwgMHg4OTQ2LCAweDAwMDAsIDB4MDAwMCwgMHg4OTQ3LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5NDgsIDB4ODk0OSwgMHg4OTRBLCAweDAwMDAsIDB4ODk0QiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTRDLCAweDAwMDAsIDB4ODk0RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTRFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OTRGLCAweDAwMDAsIDB4ODk1MCwgMHgwMDAwLCAweDAwMDAsIDB4ODk1MSwgMHgwMDAwLCAweDg5NTIsCisgICAgMHg4OTUzLCAweDg5NTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTU1LCAweDg5NTYsIDB4ODk1NywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTU4LCAweDAwMDAsIDB4ODk1OSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk1QiwgMHg4OTVDLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk1RCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTVFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk1RiwgMHg4OTYwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5NjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5NjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTY0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OTY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2NiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2OCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2OSwgMHg4OTZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODk2QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OTZFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OTZGLCAweDAwMDAsIDB4ODk3MCwgMHg4OTcxLCAweDAwMDAsIDB4ODk3MiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODk3MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5NzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5NzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTc3LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5NzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODk3OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTdBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OTdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTdDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3RCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5N0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTdGLCAweDAwMDAsIDB4ODk4MCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODk4MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5ODIsIDB4ODk4MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODk4NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5ODUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODk4NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5ODcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTg4LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5ODksCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5OEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OThCLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OThDLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5OEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OEYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTkwLCAweDAwMDAsIDB4ODk5MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OTkyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5OTMsIDB4MDAwMCwgMHgwMDAwLCAweDg5OTQsIDB4ODk5NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk5NiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTk3LCAweDg5OTgsIDB4MDAwMCwgMHgwMDAwLCAweDg5OTksIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODk5QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk5QiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk5QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODk5RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OUUsIDB4ODk5RiwgMHg4OUEwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5QTEsIDB4MDAwMCwgMHgwMDAwLCAweDg5QTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlBMywgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OUE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5QTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODlBNywgMHgwMDAwLCAweDg5QTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QUEsIDB4MDAwMCwgMHgwMDAwLCAweDg5QUIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODlBQywgMHg4OUFELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUFFLCAweDg5QUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OUIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlCMSwgMHgwMDAwLCAweDAwMDAsIDB4ODlCMiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OUIzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlCNCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlCNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QjYsIDB4ODlCNywgMHgwMDAwLCAweDg5QjgsIDB4ODlCOSwgMHg4OUJBLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QkIsIDB4MDAwMCwgMHg4OUJDLCAweDg5QkQsCisgICAgMHgwMDAwLCAweDg5QkUsIDB4ODlCRiwgMHg4OUMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODlDMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QzIsIDB4MDAwMCwgMHg4OUMzLAorICAgIDB4ODlDNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OUM1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUM2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OUM3LCAweDAwMDAsIDB4MDAwMCwgMHg4OUM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODlDOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUNBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUNCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODlDQywgMHgwMDAwLCAweDg5Q0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODlDRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5Q0YsIDB4ODlEMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RDEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlEMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OUQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUQ0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlENSwgMHgwMDAwLCAweDAwMDAsIDB4ODlENiwKKyAgICAweDg5RDcsIDB4MDAwMCwgMHgwMDAwLCAweDg5RDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5RDksIDB4MDAwMCwgMHg4OURBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5REIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlEQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlERCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OURFLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlERiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUUwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUUxLCAweDg5RTIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUUzLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RTYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5RTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5RTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFQiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFRSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFRiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OUYxLCAweDAwMDAsIDB4ODlGMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGMywgMHg4OUY0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODlGNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUY2LCAweDAwMDAsIDB4ODlGNywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RjgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OUY5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUZBLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGQiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5RkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUZFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODlGRiwgMHg4QTAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTAzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTA0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTA1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMDYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMDcsIDB4OEEwOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMDksIDB4MDAwMCwgMHg4QTBBLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBMEIsIDB4MDAwMCwgMHgwMDAwLCAweDhBMEMsIDB4MDAwMCwgMHgwMDAwLCAweDhBMEQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEwRSwgMHgwMDAwLCAweDAwMDAsIDB4OEEwRiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTEwLCAweDhBMTEsIDB4MDAwMCwgMHg4QTEyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBMTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBMTUsIDB4OEExNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTE4LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTFBLCAweDAwMDAsIDB4OEExQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEExQywgMHgwMDAwLCAweDAwMDAsIDB4OEExRCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEExRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEyMCwgMHg4QTIxLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEyMiwgMHg4QTIzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBMjQsIDB4OEEyNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTI2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEEyNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMjksIDB4MDAwMCwgMHg4QTJBLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBMkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTJDLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTJELCAweDAwMDAsCisgICAgMHg4QTJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEEyRiwgMHgwMDAwLCAweDAwMDAsIDB4OEEzMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBMzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTMyLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEEzNCwgMHg4QTM1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBMzYsIDB4MDAwMCwgMHg4QTM3LCAweDAwMDAsIDB4OEEzOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMzksIDB4OEEzQSwgMHgwMDAwLCAweDAwMDAsIDB4OEEzQiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTNDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBM0QsIDB4MDAwMCwgMHgwMDAwLCAweDhBM0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBM0YsIDB4MDAwMCwgMHg4QTQwLCAweDhBNDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEE0MiwgMHg4QTQzLCAweDhBNDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTQ1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNDYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBNDcsIDB4OEE0OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNDksIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTRBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTRCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTRDLCAweDhBNEQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE0RiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTUxLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE1MiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNTMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE1NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBNTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEE1NywgMHgwMDAwLCAweDAwMDAsIDB4OEE1OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTU5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBNUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBNUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE1RCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE1RSwgMHgwMDAwLCAweDAwMDAsIDB4OEE1RiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjAsIDB4OEE2MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2MywgMHgwMDAwLCAweDAwMDAsIDB4OEE2NCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QTY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEE2OSwgMHgwMDAwLCAweDhBNkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTZCLCAweDAwMDAsIDB4MDAwMCwgMHg4QTZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTZELCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2RSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEE2RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEE3MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTcxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTcyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNzYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTc3LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTc4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBNzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBN0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3QiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTdDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTdELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3RSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTdGLCAweDAwMDAsIDB4MDAwMCwgMHg4QTgwLCAweDhBODEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE4MiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBODMsIDB4MDAwMCwgMHg4QTg0LAorICAgIDB4OEE4NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBODYsIDB4MDAwMCwgMHg4QTg3LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBODgsIDB4MDAwMCwgMHg4QTg5LCAweDhBOEEsIDB4MDAwMCwgMHg4QThCLCAweDhBOEMsIDB4OEE4RCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBOEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QThGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBOTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTkxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBOTIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTkzLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBOTQsIDB4OEE5NSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEE5NiwgMHg4QTk3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE5OCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTk5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBOUEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBOUIsIDB4MDAwMCwgMHg4QTlDLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBOUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTlGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEFBMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBQTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQTUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUE4LCAweDhBQTksCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUFBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBQiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUFDLAorICAgIDB4OEFBRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBQUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEFCMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QUIyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQjMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUI0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUI1LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQjYsIDB4MDAwMCwgMHg4QUI3LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQjksIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEFCQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCQiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QUJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCRCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCRSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBQkYsIDB4OEFDMCwgMHgwMDAwLCAweDhBQzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QUMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEFDMywgMHgwMDAwLCAweDAwMDAsIDB4OEFDNCwgMHgwMDAwLCAweDhBQzUsIDB4MDAwMCwgMHgwMDAwLCAweDhBQzYsCisgICAgMHgwMDAwLCAweDhBQzcsIDB4MDAwMCwgMHgwMDAwLCAweDhBQzgsIDB4OEFDOSwgMHg4QUNBLCAweDAwMDAsIDB4OEFDQiwKKyAgICAweDhBQ0MsIDB4OEFDRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBQ0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQ0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEFEMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRDEsCisgICAgMHgwMDAwLCAweDhBRDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEFEMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFENCwKKyAgICAweDAwMDAsIDB4OEFENSwgMHgwMDAwLCAweDAwMDAsIDB4OEFENiwgMHgwMDAwLCAweDhBRDcsIDB4OEFEOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QUQ5LCAweDAwMDAsIDB4MDAwMCwgMHg4QURBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QURCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QURDLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBREQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBREUsIDB4MDAwMCwgMHg4QURGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUUwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBRTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEFFMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFNCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QUU2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QUU4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTksCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUVCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRUMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUVELCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEFFRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QUYwLCAweDAwMDAsIDB4OEFGMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEFGNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRjYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBRjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUY5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QUZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRkMsIDB4OEFGRCwgMHg4QUZFLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QUZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjAxLCAweDhCMDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjAzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCMDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwNSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhCMDYsIDB4MDAwMCwgMHgwMDAwLCAweDhCMDcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEIwOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QjA5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMEEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEIwQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjBDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwRCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwRSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwRiwgMHg4QjEwLCAweDhCMTEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjEyLAorICAgIDB4OEIxMywgMHg4QjE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMTUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhCMTYsIDB4OEIxNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjE4LCAweDhCMTksIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIxQSwgMHg4QjFCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMUMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhCMUQsIDB4OEIxRSwgMHgwMDAwLCAweDhCMUYsIDB4MDAwMCwgMHgwMDAwLCAweDhCMjAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QjIzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEIyNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QjI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEIyNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QjI5LCAweDAwMDAsIDB4OEIyQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QjJCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QjJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMkUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhCMkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMzEsIDB4MDAwMCwgMHgwMDAwLCAweDhCMzIsIDB4MDAwMCwKKyAgICAweDhCMzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjM0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEIzNSwgMHgwMDAwLCAweDhCMzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzNywKKyAgICAweDhCMzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCM0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhCM0IsIDB4MDAwMCwgMHg4QjNDLCAweDhCM0QsIDB4MDAwMCwgMHgwMDAwLCAweDhCM0UsIDB4OEIzRiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCNDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjQxLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhCNDIsIDB4MDAwMCwgMHg4QjQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNDQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjQ1LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCNDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjQ3LCAweDhCNDgsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI0OSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNEEsCisgICAgMHg4QjRCLCAweDAwMDAsIDB4OEI0QywgMHgwMDAwLCAweDhCNEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNEUsIDB4MDAwMCwgMHg4QjRGLCAweDAwMDAsIDB4OEI1MCwgMHgwMDAwLAorICAgIDB4OEI1MSwgMHg4QjUyLCAweDhCNTMsIDB4OEI1NCwgMHg4QjU1LCAweDhCNTYsIDB4MDAwMCwgMHg4QjU3LCAweDAwMDAsCisgICAgMHg4QjU4LCAweDAwMDAsIDB4MDAwMCwgMHg4QjU5LCAweDAwMDAsIDB4MDAwMCwgMHg4QjVBLCAweDhCNUIsIDB4OEI1QywKKyAgICAweDAwMDAsIDB4OEI1RCwgMHgwMDAwLCAweDhCNUUsIDB4OEI1RiwgMHg4QjYwLCAweDhCNjEsIDB4OEI2MiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCNjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI2NCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjY1LCAweDAwMDAsIDB4OEI2NiwKKyAgICAweDhCNjcsIDB4OEI2OCwgMHg4QjY5LCAweDAwMDAsIDB4OEI2QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjZCLAorICAgIDB4OEI2QywgMHgwMDAwLCAweDhCNkQsIDB4MDAwMCwgMHgwMDAwLCAweDhCNkUsIDB4OEI2RiwgMHgwMDAwLCAweDhCNzAsCisgICAgMHg4QjcxLCAweDhCNzIsIDB4MDAwMCwgMHg4QjczLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4Qjc0LCAweDAwMDAsIDB4OEI3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEI3NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI3NywgMHgwMDAwLCAweDhCNzgsCisgICAgMHg4Qjc5LCAweDAwMDAsIDB4MDAwMCwgMHg4QjdBLCAweDhCN0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI3QywKKyAgICAweDAwMDAsIDB4OEI3RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEI3RSwgMHg4QjdGLCAweDhCODAsIDB4OEI4MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QjgyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI4MywKKyAgICAweDAwMDAsIDB4OEI4NCwgMHgwMDAwLCAweDAwMDAsIDB4OEI4NSwgMHgwMDAwLCAweDhCODYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qjg3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCODgsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI4OSwKKyAgICAweDAwMDAsIDB4OEI4QSwgMHgwMDAwLCAweDhCOEIsIDB4MDAwMCwgMHg4QjhDLCAweDhCOEQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI4RSwgMHg4QjhGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhCOTAsIDB4OEI5MSwgMHg4QjkyLCAweDAwMDAsIDB4OEI5MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhCOTQsIDB4OEI5NSwgMHg4Qjk2LCAweDhCOTcsIDB4MDAwMCwgMHg4Qjk4LCAweDhCOTksIDB4OEI5QSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI5QiwgMHgwMDAwLCAweDAwMDAsIDB4OEI5QywgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QjlELCAweDhCOUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI5RiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJBMCwgMHg4QkExLCAweDhCQTIsIDB4OEJBMywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QkE0LCAweDhCQTUsIDB4MDAwMCwgMHg4QkE2LCAweDhCQTcsIDB4MDAwMCwgMHg4QkE4LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhCQTksIDB4MDAwMCwgMHg4QkFBLCAweDhCQUIsIDB4MDAwMCwgMHgwMDAwLCAweDhCQUMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEJBRCwgMHgwMDAwLCAweDhCQUUsIDB4OEJBRiwgMHgwMDAwLCAweDhCQjAsIDB4MDAwMCwgMHg4QkIxLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCQjIsIDB4MDAwMCwgMHg4QkIzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJCNCwKKyAgICAweDhCQjUsIDB4OEJCNiwgMHg4QkI3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJCOCwgMHg4QkI5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QkJCLCAweDAwMDAsIDB4OEJCQywgMHg4QkJELCAweDhCQkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJCRiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJDMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QkMxLCAweDAwMDAsIDB4MDAwMCwgMHg4QkMyLCAweDhCQzMsIDB4MDAwMCwgMHgwMDAwLCAweDhCQzQsCisgICAgMHg4QkM1LCAweDhCQzYsIDB4MDAwMCwgMHg4QkM3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQzgsIDB4OEJDOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJDQSwgMHgwMDAwLCAweDhCQ0IsIDB4OEJDQywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhCQ0QsIDB4MDAwMCwgMHg4QkNFLCAweDhCQ0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhCRDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJEMSwgMHgwMDAwLCAweDAwMDAsIDB4OEJEMiwgMHg4QkQzLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJENCwgMHg4QkQ1LCAweDhCRDYsCisgICAgMHgwMDAwLCAweDhCRDcsIDB4MDAwMCwgMHg4QkQ4LCAweDhCRDksIDB4MDAwMCwgMHgwMDAwLCAweDhCREEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJEQiwgMHgwMDAwLCAweDAwMDAsIDB4OEJEQywgMHg4QkRELAorICAgIDB4OEJERSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhCREYsIDB4MDAwMCwgMHg4QkUwLCAweDAwMDAsIDB4OEJFMSwgMHgwMDAwLCAweDAwMDAsIDB4OEJFMiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRTMsIDB4MDAwMCwgMHgwMDAwLCAweDhCRTQsIDB4MDAwMCwgMHg4QkU1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJFNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCRTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJFOCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkU5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkVBLCAweDAwMDAsIDB4OEJFQiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QkVDLCAweDhCRUQsIDB4MDAwMCwgMHg4QkVFLCAweDAwMDAsIDB4MDAwMCwgMHg4QkVGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QkYxLCAweDhCRjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkYzLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkY2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QkY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGOSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEJGQywgMHg4QkZELCAweDAwMDAsIDB4OEJGRSwgMHg4QkZGLCAweDAwMDAsIDB4OEMwMCwKKyAgICAweDhDMDEsIDB4OEMwMiwgMHgwMDAwLCAweDhDMDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwNCwgMHg4QzA1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwNiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzA3LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDMEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMEIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDMEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzBELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDMEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzBGLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzEwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QzExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMxMiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMxMywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMTQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEMxNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QzE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMTgsIDB4OEMxOSwgMHg4QzFBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMxQiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDMUMsIDB4MDAwMCwgMHg4QzFELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMUUsIDB4MDAwMCwgMHg4QzFGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QzIwLCAweDhDMjEsIDB4MDAwMCwgMHg4QzIyLCAweDAwMDAsIDB4MDAwMCwgMHg4QzIzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDMjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QzI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMyNiwgMHg4QzI3LCAweDhDMjgsIDB4OEMyOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzJBLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzJCLAorICAgIDB4MDAwMCwgMHg4QzJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMyRCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDMkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMzAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMzMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEMzNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzM2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMzcsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzOSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDM0EsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzQiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDM0MsIDB4MDAwMCwgMHgwMDAwLCAweDhDM0QsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzNFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDM0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0MCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzQxLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEM0MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0NCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzQ1LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEM0NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDNDcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QzQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzRBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QzRCLCAweDhDNEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzRELCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNEUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEM1MCwgMHgwMDAwLCAweDhDNTEsIDB4OEM1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDNTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM1NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNTUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNTYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzU3LCAweDAwMDAsIDB4MDAwMCwgMHg4QzU4LCAweDAwMDAsIDB4MDAwMCwgMHg4QzU5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QzVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM1QiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM1RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzVFLCAweDAwMDAsIDB4OEM1RiwgMHgwMDAwLCAweDhDNjAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDNjEsIDB4MDAwMCwgMHgwMDAwLCAweDhDNjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNjMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzY0LCAweDAwMDAsIDB4MDAwMCwgMHg4QzY1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNjYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNjgsCisgICAgMHg4QzY5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNkEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDNkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM2RCwgMHgwMDAwLCAweDAwMDAsIDB4OEM2RSwgMHg4QzZGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QzcxLCAweDAwMDAsIDB4OEM3MiwgMHg4QzczLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzc0LCAweDhDNzUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4Qzc2LCAweDAwMDAsIDB4MDAwMCwgMHg4Qzc3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNzgsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzc5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzdBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QzdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM3QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QzdELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzdFLCAweDhDN0YsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEM4MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEM4MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDODIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzgzLCAweDhDODQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDODUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDODcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzg4LCAweDAwMDAsIDB4OEM4OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzhCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDOEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOEUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzhGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM5MCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDOTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOTIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDOTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEM5NCwgMHgwMDAwLCAweDAwMDAsIDB4OEM5NSwgMHgwMDAwLCAweDAwMDAsIDB4OEM5NiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzk4LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QzlBLCAweDhDOUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM5QywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzlELCAweDhDOUUsIDB4MDAwMCwgMHgwMDAwLCAweDhDOUYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQTAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0ExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBMiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0EzLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0E0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4Q0E1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4Q0E2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBNywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBOCwgMHgwMDAwLCAweDhDQTksIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OENBQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBQiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQUMsCisgICAgMHg4Q0FELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQjAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDQjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENCMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQjMsIDB4OENCNCwgMHgwMDAwLCAweDhDQjUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OENCNiwgMHgwMDAwLCAweDAwMDAsIDB4OENCNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4Q0I4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENCOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDQkEsIDB4MDAwMCwgMHgwMDAwLCAweDhDQkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4Q0JDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0JELCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4Q0JFLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0JGLCAweDAwMDAsIDB4OENDMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENDMiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDQzMsIDB4MDAwMCwgMHgwMDAwLCAweDhDQzQsIDB4MDAwMCwgMHg4Q0M1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQzYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4Q0M3LCAweDhDQzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENDOSwgMHgwMDAwLAorICAgIDB4OENDQSwgMHgwMDAwLCAweDAwMDAsIDB4OENDQiwgMHgwMDAwLCAweDAwMDAsIDB4OENDQywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OENDRCwgMHgwMDAwLCAweDAwMDAsIDB4OENDRSwgMHgwMDAwLCAweDAwMDAsIDB4OENDRiwKKyAgICAweDAwMDAsIDB4OENEMCwgMHg4Q0QxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDRDIsIDB4MDAwMCwgMHg4Q0QzLCAweDAwMDAsIDB4OENENCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDRDUsIDB4OENENiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OENENywgMHgwMDAwLCAweDhDRDgsIDB4MDAwMCwgMHg4Q0Q5LCAweDAwMDAsIDB4OENEQSwKKyAgICAweDAwMDAsIDB4OENEQiwgMHgwMDAwLCAweDAwMDAsIDB4OENEQywgMHgwMDAwLCAweDhDREQsIDB4OENERSwgMHg4Q0RGLAorICAgIDB4OENFMCwgMHgwMDAwLCAweDAwMDAsIDB4OENFMSwgMHgwMDAwLCAweDhDRTIsIDB4MDAwMCwgMHg4Q0UzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OENFNCwgMHgwMDAwLCAweDhDRTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDRTYsIDB4MDAwMCwgMHgwMDAwLCAweDhDRTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENFOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4Q0U5LCAweDAwMDAsIDB4OENFQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0VCLCAweDAwMDAsCisgICAgMHg4Q0VDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OENFRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OENFRiwgMHgwMDAwLCAweDhDRjAsIDB4MDAwMCwgMHg4Q0YxLCAweDAwMDAsIDB4OENGMiwgMHg4Q0YzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDRjQsIDB4MDAwMCwgMHgwMDAwLCAweDhDRjUsIDB4MDAwMCwgMHgwMDAwLCAweDhDRjYsIDB4MDAwMCwKKyAgICAweDhDRjcsIDB4OENGOCwgMHg4Q0Y5LCAweDhDRkEsIDB4MDAwMCwgMHgwMDAwLCAweDhDRkIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OENGQywgMHgwMDAwLCAweDhDRkQsIDB4OENGRSwgMHg4Q0ZGLCAweDhEMDAsIDB4MDAwMCwgMHg4RDAxLCAweDhEMDIsCisgICAgMHg4RDAzLCAweDhEMDQsIDB4MDAwMCwgMHg4RDA1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEQwNiwgMHgwMDAwLCAweDAwMDAsIDB4OEQwNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEQwOCwgMHg4RDA5LCAweDhEMEEsIDB4OEQwQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMEMsCisgICAgMHg4RDBELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMEUsIDB4OEQwRiwgMHgwMDAwLCAweDAwMDAsIDB4OEQxMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RDExLCAweDAwMDAsIDB4OEQxMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDEzLAorICAgIDB4MDAwMCwgMHg4RDE0LCAweDhEMTUsIDB4MDAwMCwgMHg4RDE2LCAweDhEMTcsIDB4OEQxOCwgMHg4RDE5LCAweDAwMDAsCisgICAgMHg4RDFBLCAweDAwMDAsIDB4OEQxQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQxQywKKyAgICAweDAwMDAsIDB4OEQxRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDFFLCAweDAwMDAsIDB4MDAwMCwgMHg4RDFGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhEMjAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMjEsIDB4MDAwMCwgMHgwMDAwLCAweDhEMjIsCisgICAgMHgwMDAwLCAweDhEMjMsIDB4MDAwMCwgMHgwMDAwLCAweDhEMjQsIDB4MDAwMCwgMHg4RDI1LCAweDAwMDAsIDB4OEQyNiwKKyAgICAweDAwMDAsIDB4OEQyNywgMHgwMDAwLCAweDhEMjgsIDB4MDAwMCwgMHg4RDI5LCAweDhEMkEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RDJCLCAweDhEMkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQyRCwgMHg4RDJFLCAweDhEMkYsCisgICAgMHg4RDMwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDMxLCAweDhEMzIsIDB4MDAwMCwgMHg4RDMzLCAweDAwMDAsIDB4OEQzNCwKKyAgICAweDhEMzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQzNiwgMHgwMDAwLCAweDhEMzcsIDB4OEQzOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RDM5LCAweDAwMDAsIDB4OEQzQSwgMHgwMDAwLCAweDAwMDAsIDB4OEQzQiwgMHg4RDNDLCAweDhEM0QsCisgICAgMHgwMDAwLCAweDhEM0UsIDB4MDAwMCwgMHg4RDNGLCAweDAwMDAsIDB4OEQ0MCwgMHgwMDAwLCAweDhENDEsIDB4OEQ0MiwKKyAgICAweDhENDMsIDB4MDAwMCwgMHg4RDQ0LCAweDhENDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDQ2LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ0NywgMHgwMDAwLCAweDhENDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RDQ5LCAweDAwMDAsIDB4OEQ0QSwgMHg4RDRCLCAweDAwMDAsIDB4OEQ0QywgMHgwMDAwLCAweDhENEQsIDB4MDAwMCwKKyAgICAweDhENEUsIDB4MDAwMCwgMHgwMDAwLCAweDhENEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhENTAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTEsIDB4OEQ1MiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEQ1NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTcsIDB4OEQ1OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTksIDB4MDAwMCwgMHg4RDVBLCAweDhENUIsIDB4OEQ1QywgMHgwMDAwLAorICAgIDB4OEQ1RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDVFLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEQ1RiwgMHg4RDYwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENjEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEQ2MiwgMHg4RDYzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ2NCwgMHg4RDY1LCAweDAwMDAsCisgICAgMHg4RDY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEQ2NywgMHg4RDY4LCAweDAwMDAsIDB4MDAwMCwgMHg4RDY5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEQ2QSwgMHg4RDZCLCAweDAwMDAsIDB4OEQ2QywgMHg4RDZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENkUsCisgICAgMHgwMDAwLCAweDhENkYsIDB4MDAwMCwgMHg4RDcwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RDcxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDcyLAorICAgIDB4MDAwMCwgMHg4RDczLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhENzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDc1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ3NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENzcsIDB4OEQ3OCwgMHgwMDAwLAorICAgIDB4OEQ3OSwgMHg4RDdBLCAweDhEN0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDdDLCAweDhEN0QsCisgICAgMHg4RDdFLCAweDhEN0YsIDB4OEQ4MCwgMHg4RDgxLCAweDAwMDAsIDB4MDAwMCwgMHg4RDgyLCAweDhEODMsIDB4MDAwMCwKKyAgICAweDhEODQsIDB4OEQ4NSwgMHg4RDg2LCAweDAwMDAsIDB4OEQ4NywgMHg4RDg4LCAweDhEODksIDB4MDAwMCwgMHg4RDhBLAorICAgIDB4OEQ4QiwgMHg4RDhDLCAweDhEOEQsIDB4MDAwMCwgMHg4RDhFLCAweDhEOEYsIDB4OEQ5MCwgMHg4RDkxLCAweDhEOTIsCisgICAgMHg4RDkzLCAweDhEOTQsIDB4MDAwMCwgMHg4RDk1LCAweDhEOTYsIDB4MDAwMCwgMHg4RDk3LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ5OCwgMHg4RDk5LCAweDhEOUEsIDB4MDAwMCwgMHg4RDlCLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ5QywgMHg4RDlELCAweDAwMDAsIDB4OEQ5RSwgMHgwMDAwLCAweDhEOUYsCisgICAgMHgwMDAwLCAweDhEQTAsIDB4OERBMSwgMHg4REEyLCAweDhEQTMsIDB4OERBNCwgMHgwMDAwLCAweDhEQTUsIDB4OERBNiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4REE3LCAweDAwMDAsIDB4OERBOCwgMHg4REE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERBQSwgMHg4REFCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4REFDLCAweDhEQUQsIDB4OERBRSwgMHg4REFGLCAweDhEQjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OERCMSwgMHg4REIyLCAweDAwMDAsIDB4OERCMywgMHg4REI0LCAweDAwMDAsIDB4OERCNSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4REI2LCAweDAwMDAsIDB4OERCNywgMHg4REI4LCAweDAwMDAsIDB4MDAwMCwgMHg4REI5LCAweDhEQkEsCisgICAgMHgwMDAwLCAweDhEQkIsIDB4OERCQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REJELCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REJFLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhEQkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQzMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDNCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REM1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REM2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQzgsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OERDOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RENBLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RENCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDQywgMHg4RENELCAweDhEQ0UsIDB4MDAwMCwgMHg4RENGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEREMCwgMHg4REQxLCAweDhERDIsIDB4MDAwMCwgMHg4REQzLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4REQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OERENSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REQ2LCAweDhERDcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4REQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEREQSwgMHg4RERCLCAweDhEREMsIDB4OERERCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERERSwgMHgwMDAwLCAweDhEREYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERTEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4REUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OERFMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERFNCwgMHg4REU1LCAweDhERTYsCisgICAgMHg4REU3LCAweDhERTgsIDB4MDAwMCwgMHg4REU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERFQSwKKyAgICAweDAwMDAsIDB4OERFQiwgMHgwMDAwLCAweDhERUMsIDB4OERFRCwgMHg4REVFLCAweDhERUYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERjAsIDB4MDAwMCwgMHg4REYxLCAweDhERjIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERGMywgMHg4REY0LCAweDhERjUsIDB4OERGNiwKKyAgICAweDhERjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERjgsIDB4OERGOSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4REZBLCAweDhERkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REZDLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OERGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERkUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OERGRiwgMHgwMDAwLCAweDAwMDAsIDB4OEUwMCwgMHg4RTAxLCAweDhFMDIsIDB4MDAwMCwgMHg4RTAzLAorICAgIDB4MDAwMCwgMHg4RTA0LCAweDhFMDUsIDB4OEUwNiwgMHgwMDAwLCAweDAwMDAsIDB4OEUwNywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhFMDgsIDB4OEUwOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUwQSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RTBCLCAweDAwMDAsIDB4OEUwQywgMHg4RTBELCAweDAwMDAsIDB4OEUwRSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFMEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUxMCwgMHg4RTExLAorICAgIDB4OEUxMiwgMHgwMDAwLCAweDAwMDAsIDB4OEUxMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUxNCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMTUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUxNiwgMHg4RTE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RTE4LCAweDhFMTksIDB4MDAwMCwgMHgwMDAwLCAweDhFMUEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUxQiwgMHg4RTFDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMUQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEUxRSwgMHgwMDAwLCAweDhFMUYsIDB4MDAwMCwgMHg4RTIwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMjEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUyMiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEUyMywgMHg4RTI0LCAweDAwMDAsIDB4OEUyNSwgMHgwMDAwLCAweDhFMjYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMjcsIDB4MDAwMCwgMHgwMDAwLCAweDhFMjgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEUyOSwgMHgwMDAwLCAweDAwMDAsIDB4OEUyQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMkIsCisgICAgMHg4RTJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTJELCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhFMkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEUyRiwgMHgwMDAwLCAweDAwMDAsIDB4OEUzMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTMxLCAweDAwMDAsIDB4OEUzMiwgMHgwMDAwLCAweDhFMzMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUzNCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTM1LCAweDAwMDAsIDB4MDAwMCwgMHg4RTM2LCAweDAwMDAsCisgICAgMHg4RTM3LCAweDAwMDAsIDB4OEUzOCwgMHgwMDAwLCAweDhFMzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUzQSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUzQiwgMHg4RTNDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RTNELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTNFLCAweDAwMDAsCisgICAgMHg4RTNGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU0MCwgMHg4RTQxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RTQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNDMsIDB4OEU0NCwKKyAgICAweDAwMDAsIDB4OEU0NSwgMHgwMDAwLCAweDhFNDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEU0NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RTQ4LCAweDhFNDksIDB4MDAwMCwgMHg4RTRBLCAweDhFNEIsIDB4OEU0QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFNEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNEUsIDB4OEU0RiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RTUwLCAweDAwMDAsIDB4OEU1MSwgMHgwMDAwLCAweDAwMDAsIDB4OEU1MiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTUzLCAweDAwMDAsIDB4OEU1NCwKKyAgICAweDAwMDAsIDB4OEU1NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTU2LAorICAgIDB4OEU1NywgMHgwMDAwLCAweDhFNTgsIDB4OEU1OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNUEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTVCLCAweDAwMDAsIDB4MDAwMCwgMHg4RTVDLCAweDhFNUQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEU1RSwgMHg4RTVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhFNjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTYxLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhFNjIsIDB4OEU2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFNjQsIDB4MDAwMCwgMHg4RTY1LCAweDAwMDAsIDB4MDAwMCwgMHg4RTY2LCAweDhFNjcsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEU2OCwgMHg4RTY5LCAweDhFNkEsIDB4OEU2QiwgMHgwMDAwLCAweDAwMDAsIDB4OEU2QywgMHg4RTZELCAweDhFNkUsCisgICAgMHg4RTZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU3MCwgMHgwMDAwLCAweDAwMDAsIDB4OEU3MSwKKyAgICAweDhFNzIsIDB4MDAwMCwgMHg4RTczLCAweDAwMDAsIDB4OEU3NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTc1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNzYsIDB4MDAwMCwgMHgwMDAwLCAweDhFNzcsCisgICAgMHg4RTc4LCAweDAwMDAsIDB4MDAwMCwgMHg4RTc5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFN0EsIDB4MDAwMCwgMHg4RTdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTdDLAorICAgIDB4OEU3RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RTdFLCAweDAwMDAsIDB4OEU3RiwgMHgwMDAwLCAweDhFODAsIDB4OEU4MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFODIsIDB4OEU4MywgMHgwMDAwLCAweDAwMDAsIDB4OEU4NCwgMHgwMDAwLCAweDhFODUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFODYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RTg3LCAweDAwMDAsIDB4OEU4OCwgMHgwMDAwLCAweDAwMDAsIDB4OEU4OSwgMHgwMDAwLCAweDhFOEEsIDB4MDAwMCwKKyAgICAweDhFOEIsIDB4OEU4QywgMHg4RThELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFOEUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEU4RiwgMHgwMDAwLCAweDhFOTAsIDB4OEU5MSwgMHgwMDAwLCAweDhFOTIsIDB4MDAwMCwgMHg4RTkzLCAweDhFOTQsCisgICAgMHg4RTk1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFOTYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RTk3LCAweDAwMDAsIDB4OEU5OCwgMHgwMDAwLCAweDhFOTksIDB4OEU5QSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU5QiwgMHgwMDAwLCAweDhFOUMsIDB4MDAwMCwgMHg4RTlELCAweDAwMDAsCisgICAgMHg4RTlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU5RiwgMHgwMDAwLCAweDAwMDAsIDB4OEVBMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RUExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUEyLCAweDAwMDAsIDB4OEVBMywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEVBNCwgMHg4RUE1LCAweDhFQTYsIDB4MDAwMCwgMHg4RUE3LCAweDhFQTgsIDB4OEVBOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQUEsIDB4OEVBQiwgMHg4RUFDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUFELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQUUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQUYsIDB4MDAwMCwgMHgwMDAwLCAweDhFQjAsIDB4MDAwMCwKKyAgICAweDhFQjEsIDB4MDAwMCwgMHg4RUIyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEVCMywgMHg4RUI0LCAweDAwMDAsIDB4OEVCNSwgMHgwMDAwLCAweDAwMDAsIDB4OEVCNiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RUI3LCAweDhFQjgsIDB4OEVCOSwgMHg4RUJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQkIsIDB4OEVCQywKKyAgICAweDhFQkQsIDB4OEVCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUJGLCAweDAwMDAsIDB4OEVDMCwgMHg4RUMxLAorICAgIDB4MDAwMCwgMHg4RUMyLCAweDAwMDAsIDB4MDAwMCwgMHg4RUMzLCAweDhFQzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RUM1LCAweDAwMDAsIDB4MDAwMCwgMHg4RUM2LCAweDAwMDAsIDB4OEVDNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RUM5LCAweDhFQ0EsIDB4MDAwMCwgMHgwMDAwLCAweDhFQ0IsIDB4OEVDQywgMHgwMDAwLCAweDhFQ0QsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUNFLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEVDRiwgMHgwMDAwLCAweDhFRDAsIDB4OEVEMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEVEMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUQzLCAweDhFRDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUQ1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRDYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRDcsIDB4OEVEOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUQ5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVEQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RURCLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RURDLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVERCwgMHgwMDAwLAorICAgIDB4OEVERSwgMHgwMDAwLCAweDhFREYsIDB4MDAwMCwgMHgwMDAwLCAweDhFRTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEVFMSwgMHg4RUUyLCAweDhFRTMsIDB4MDAwMCwgMHgwMDAwLCAweDhFRTQsIDB4OEVFNSwKKyAgICAweDAwMDAsIDB4OEVFNiwgMHg4RUU3LCAweDAwMDAsIDB4OEVFOCwgMHgwMDAwLCAweDhFRTksIDB4MDAwMCwgMHg4RUVBLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhFRUIsIDB4MDAwMCwgMHg4RUVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFRUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVFRSwgMHg4RUVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEVGMCwgMHg4RUYxLCAweDAwMDAsIDB4MDAwMCwgMHg4RUYyLCAweDhFRjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEVGNCwgMHg4RUY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRjYsIDB4OEVGNywKKyAgICAweDhFRjgsIDB4OEVGOSwgMHgwMDAwLCAweDhFRkEsIDB4OEVGQiwgMHgwMDAwLCAweDhFRkMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RUZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RUZFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhGMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RjAyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYwMywgMHgwMDAwLCAweDAwMDAsIDB4OEYwNCwKKyAgICAweDhGMDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYwNiwgMHg4RjA3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhGMDgsIDB4OEYwOSwgMHgwMDAwLCAweDAwMDAsIDB4OEYwQSwgMHgwMDAwLCAweDAwMDAsIDB4OEYwQiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMEMsIDB4OEYwRCwgMHgwMDAwLCAweDhGMEUsIDB4OEYwRiwgMHgwMDAwLAorICAgIDB4OEYxMCwgMHgwMDAwLCAweDhGMTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjEyLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjEzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhGMTQsIDB4MDAwMCwgMHg4RjE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYxNiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGMTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEYxOCwgMHgwMDAwLCAweDhGMTksIDB4MDAwMCwgMHgwMDAwLCAweDhGMUEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjFCLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGMUMsIDB4OEYxRCwgMHg4RjFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RjFGLCAweDAwMDAsIDB4OEYyMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYyMSwgMHg4RjIyLCAweDhGMjMsIDB4OEYyNCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYyNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjI2LCAweDAwMDAsIDB4OEYyNywgMHg4RjI4LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhGMjksIDB4MDAwMCwgMHg4RjJBLCAweDhGMkIsIDB4MDAwMCwgMHg4RjJDLCAweDhGMkQsIDB4MDAwMCwKKyAgICAweDhGMkUsIDB4OEYyRiwgMHgwMDAwLCAweDAwMDAsIDB4OEYzMCwgMHg4RjMxLCAweDhGMzIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RjMzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhGMzQsIDB4MDAwMCwgMHg4RjM1LCAweDAwMDAsIDB4OEYzNiwgMHgwMDAwLCAweDAwMDAsIDB4OEYzNywKKyAgICAweDhGMzgsIDB4MDAwMCwgMHg4RjM5LCAweDhGM0EsIDB4OEYzQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjNDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjNELCAweDAwMDAsIDB4MDAwMCwgMHg4RjNFLCAweDAwMDAsCisgICAgMHg4RjNGLCAweDhGNDAsIDB4OEY0MSwgMHg4RjQyLCAweDhGNDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY0NCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RjQ1LCAweDhGNDYsIDB4OEY0NywgMHgwMDAwLCAweDhGNDgsIDB4OEY0OSwgMHg4RjRBLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY0QiwgMHgwMDAwLCAweDhGNEMsIDB4OEY0RCwgMHg4RjRFLCAweDhGNEYsCisgICAgMHg4RjUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjUxLCAweDAwMDAsIDB4OEY1MiwKKyAgICAweDAwMDAsIDB4OEY1MywgMHg4RjU0LCAweDhGNTUsIDB4MDAwMCwgMHg4RjU2LCAweDhGNTcsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjU4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RjU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjVBLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RjVCLCAweDAwMDAsIDB4MDAwMCwgMHg4RjVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RjVELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY1RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjVGLAorICAgIDB4OEY2MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEY2MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY2MywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY2NCwgMHgwMDAwLCAweDhGNjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjY2LCAweDAwMDAsIDB4MDAwMCwgMHg4RjY3LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEY2OCwgMHgwMDAwLCAweDAwMDAsIDB4OEY2OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEY2QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY2QiwgMHgwMDAwLCAweDAwMDAsIDB4OEY2QywgMHgwMDAwLAorICAgIDB4OEY2RCwgMHg4RjZFLCAweDAwMDAsIDB4OEY2RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjcwLCAweDhGNzEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjcyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY3NCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY3NiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY3NywgMHgwMDAwLCAweDhGNzgsIDB4MDAwMCwgMHg4Rjc5LAorICAgIDB4MDAwMCwgMHg4RjdBLCAweDhGN0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEY3QywgMHgwMDAwLCAweDhGN0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjdFLCAweDAwMDAsIDB4OEY3RiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY4MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhGODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY4MiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY4MywgMHgwMDAwLCAweDhGODQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY4NSwgMHgwMDAwLCAweDhGODYsIDB4OEY4NywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGODgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEY4OSwgMHgwMDAwLCAweDAwMDAsIDB4OEY4QSwgMHgwMDAwLCAweDhGOEIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhGOEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY4RCwgMHgwMDAwLCAweDhGOEUsIDB4OEY4RiwgMHg4RjkwLAorICAgIDB4MDAwMCwgMHg4RjkxLCAweDhGOTIsIDB4OEY5MywgMHg4Rjk0LCAweDAwMDAsIDB4OEY5NSwgMHgwMDAwLCAweDhGOTYsCisgICAgMHgwMDAwLCAweDhGOTcsIDB4OEY5OCwgMHg4Rjk5LCAweDhGOUEsIDB4OEY5QiwgMHg4RjlDLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEY5RCwgMHg4RjlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGOUYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGQTAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQTEsIDB4MDAwMCwgMHg4RkEyLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZBMywgMHgwMDAwLCAweDAwMDAsIDB4OEZBNCwKKyAgICAweDAwMDAsIDB4OEZBNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQTYsIDB4OEZBNywgMHg4RkE4LAorICAgIDB4MDAwMCwgMHg4RkE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkFBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhGQUIsIDB4OEZBQywgMHg4RkFELCAweDhGQUUsIDB4MDAwMCwgMHgwMDAwLCAweDhGQUYsIDB4OEZCMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZCMSwgMHg4RkIyLCAweDAwMDAsIDB4OEZCMywgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RkI0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQjUsIDB4MDAwMCwgMHgwMDAwLCAweDhGQjYsIDB4MDAwMCwKKyAgICAweDhGQjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZCOCwgMHg4RkI5LCAweDAwMDAsIDB4MDAwMCwgMHg4RkJBLAorICAgIDB4OEZCQiwgMHg4RkJDLCAweDAwMDAsIDB4OEZCRCwgMHg4RkJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGQkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkMwLCAweDhGQzEsCisgICAgMHg4RkMyLCAweDAwMDAsIDB4OEZDMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQzQsIDB4MDAwMCwKKyAgICAweDhGQzUsIDB4MDAwMCwgMHg4RkM2LCAweDhGQzcsIDB4OEZDOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkM5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZDQSwgMHgwMDAwLCAweDhGQ0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkNDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZDRCwgMHg4RkNFLCAweDAwMDAsCisgICAgMHg4RkNGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGRDAsIDB4OEZEMSwgMHg4RkQyLCAweDAwMDAsIDB4OEZEMywKKyAgICAweDAwMDAsIDB4OEZENCwgMHgwMDAwLCAweDAwMDAsIDB4OEZENSwgMHgwMDAwLCAweDhGRDYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGRDcsIDB4OEZEOCwgMHg4RkQ5LCAweDhGREEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkRCLCAweDhGREMsIDB4OEZERCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhGREUsIDB4OEZERiwgMHgwMDAwLCAweDhGRTAsIDB4MDAwMCwgMHg4RkUxLCAweDAwMDAsIDB4MDAwMCwgMHg4RkUyLAorICAgIDB4OEZFMywgMHg4RkU0LCAweDAwMDAsIDB4MDAwMCwgMHg4RkU1LCAweDAwMDAsIDB4OEZFNiwgMHgwMDAwLCAweDhGRTcsCisgICAgMHg4RkU4LCAweDhGRTksIDB4MDAwMCwgMHg4RkVBLCAweDAwMDAsIDB4MDAwMCwgMHg4RkVCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkVELCAweDAwMDAsIDB4OEZFRSwgMHgwMDAwLCAweDhGRUYsCisgICAgMHg4RkYwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGRjEsIDB4MDAwMCwgMHg4RkYyLCAweDAwMDAsIDB4OEZGMywKKyAgICAweDhGRjQsIDB4MDAwMCwgMHg4RkY1LCAweDAwMDAsIDB4OEZGNiwgMHgwMDAwLCAweDhGRjcsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEZGOCwgMHg4RkY5LCAweDAwMDAsIDB4OEZGQSwgMHg4RkZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhGRkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkZELCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RkZFLCAweDAwMDAsIDB4OEZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OTAwMCwgMHg5MDAxLCAweDkwMDIsIDB4MDAwMCwgMHgwMDAwLCAweDkwMDMsIDB4MDAwMCwgMHg5MDA0LAorICAgIDB4OTAwNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg5MDA3LCAweDkwMDgsIDB4OTAwOSwgMHgwMDAwLCAweDkwMEEsIDB4OTAwQiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MDBDLCAweDkwMEQsIDB4MDAwMCwgMHg5MDBFLCAweDAwMDAsIDB4OTAwRiwgMHgwMDAwLCAweDkwMTAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OTAxMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAxMiwgMHgwMDAwLCAweDAwMDAsIDB4OTAxMywgMHg5MDE0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAxNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMTYsIDB4MDAwMCwgMHg5MDE3LCAweDkwMTgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTAxOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMUEsCisgICAgMHg5MDFCLCAweDkwMUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAxRCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDFGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTAyMCwgMHgwMDAwLCAweDkwMjEsIDB4OTAyMiwgMHgwMDAwLCAweDkwMjMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAyNCwgMHg5MDI1LCAweDkwMjYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAyNywgMHgwMDAwLCAweDkwMjgsIDB4OTAyOSwgMHg5MDJBLCAweDkwMkIsCisgICAgMHg5MDJDLCAweDkwMkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDJFLCAweDAwMDAsIDB4OTAyRiwKKyAgICAweDkwMzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDMxLAorICAgIDB4MDAwMCwgMHg5MDMyLCAweDAwMDAsIDB4MDAwMCwgMHg5MDMzLCAweDkwMzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MDM1LCAweDAwMDAsIDB4MDAwMCwgMHg5MDM2LCAweDAwMDAsIDB4OTAzNywgMHg5MDM4LCAweDkwMzksIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDNBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwM0IsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwM0MsIDB4MDAwMCwgMHgwMDAwLCAweDkwM0QsIDB4MDAwMCwKKyAgICAweDkwM0UsIDB4OTAzRiwgMHg5MDQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0MSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDQ0LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwNDUsIDB4MDAwMCwgMHg5MDQ2LCAweDAwMDAsIDB4OTA0NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTA0OCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDRCLCAweDAwMDAsIDB4OTA0QywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDRELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTA0RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNEYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OTA1MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwNTEsIDB4MDAwMCwgMHg5MDUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA1MywgMHg5MDU0LCAweDAwMDAsIDB4OTA1NSwKKyAgICAweDkwNTYsIDB4OTA1NywgMHg5MDU4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTA1OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDVCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNUMsIDB4OTA1RCwKKyAgICAweDAwMDAsIDB4OTA1RSwgMHg5MDVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTA2MCwgMHg5MDYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwNjIsIDB4MDAwMCwgMHg5MDYzLCAweDkwNjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDY1LCAweDkwNjYsIDB4OTA2NywgMHg5MDY4LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTA2OSwgMHgwMDAwLCAweDkwNkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA2QiwKKyAgICAweDkwNkMsIDB4MDAwMCwgMHg5MDZELCAweDAwMDAsIDB4MDAwMCwgMHg5MDZFLCAweDkwNkYsIDB4MDAwMCwgMHg5MDcwLAorICAgIDB4OTA3MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwNzMsIDB4MDAwMCwgMHg5MDc0LCAweDAwMDAsIDB4MDAwMCwgMHg5MDc1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwNzYsIDB4OTA3NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDc4LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDc5LCAweDkwN0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA3QiwgMHgwMDAwLCAweDAwMDAsIDB4OTA3QywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwN0QsIDB4MDAwMCwgMHg5MDdFLCAweDAwMDAsIDB4MDAwMCwgMHg5MDdGLCAweDkwODAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDgxLCAweDkwODIsIDB4MDAwMCwgMHgwMDAwLCAweDkwODMsIDB4OTA4NCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA4NSwgMHgwMDAwLCAweDkwODYsIDB4OTA4NywgMHg5MDg4LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwODksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA4QSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDhCLCAweDkwOEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA4RCwgMHgwMDAwLCAweDkwOEUsIDB4MDAwMCwgMHg5MDhGLAorICAgIDB4OTA5MCwgMHg5MDkxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA5MiwgMHgwMDAwLCAweDkwOTMsCisgICAgMHg5MDk0LCAweDAwMDAsIDB4MDAwMCwgMHg5MDk1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwOTYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA5NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwOTgsIDB4OTA5OSwgMHgwMDAwLCAweDkwOUEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDlCLCAweDAwMDAsCisgICAgMHg5MDlDLCAweDAwMDAsIDB4OTA5RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDlFLCAweDkwOUYsIDB4OTBBMCwgMHgwMDAwLCAweDkwQTEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQTIsIDB4OTBBMywgMHgwMDAwLCAweDkwQTQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBBNSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg5MEE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEE3LCAweDAwMDAsCisgICAgMHg5MEE4LCAweDkwQTksIDB4OTBBQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEFCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwQUMsIDB4MDAwMCwgMHg5MEFELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTBBRSwgMHg5MEFGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQjIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OTBCMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEI0LCAweDkwQjUsCisgICAgMHg5MEI2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwQjcsIDB4OTBCOCwgMHgwMDAwLCAweDAwMDAsIDB4OTBCOSwgMHg5MEJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQkIsIDB4MDAwMCwgMHg5MEJDLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDkwQkQsIDB4MDAwMCwgMHgwMDAwLCAweDkwQkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwQkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEMwLCAweDAwMDAsCisgICAgMHg5MEMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OTBDMiwgMHgwMDAwLCAweDAwMDAsIDB4OTBDMywgMHgwMDAwLCAweDkwQzQsIDB4MDAwMCwgMHg5MEM1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBDNiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MEM3LCAweDkwQzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBDOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MENBLCAweDAwMDAsIDB4MDAwMCwgMHg5MENCLCAweDAwMDAsIDB4OTBDQywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBDRCwgMHg5MENFLCAweDkwQ0YsIDB4OTBEMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MEQxLCAweDAwMDAsIDB4OTBEMiwgMHg5MEQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwRDQsIDB4MDAwMCwgMHgwMDAwLCAweDkwRDUsIDB4OTBENiwgMHgwMDAwLCAweDkwRDcsCisgICAgMHg5MEQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MEQ5LCAweDkwREEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MERCLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBEQywgMHgwMDAwLCAweDAwMDAsIDB4OTBERCwgMHgwMDAwLCAweDkwREUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MERGLCAweDkwRTAsIDB4OTBFMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTBFMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBFMywgMHgwMDAwLCAweDAwMDAsIDB4OTBFNCwKKyAgICAweDAwMDAsIDB4OTBFNSwgMHg5MEU2LCAweDAwMDAsIDB4OTBFNywgMHg5MEU4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwRTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEVBLCAweDAwMDAsCisgICAgMHg5MEVCLCAweDkwRUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MEVELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEVFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTBFRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTBGMCwgMHg5MEYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OTBGMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEYzLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRjQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEY1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MEY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRjcsIDB4MDAwMCwgMHg5MEY4LCAweDkwRjksIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGQSwgMHgwMDAwLCAweDkwRkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEZDLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEZFLAorICAgIDB4OTBGRiwgMHgwMDAwLCAweDAwMDAsIDB4OTEwMCwgMHg5MTAxLCAweDAwMDAsIDB4MDAwMCwgMHg5MTAyLCAweDAwMDAsCisgICAgMHg5MTAzLCAweDkxMDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTEwNSwgMHgwMDAwLCAweDAwMDAsIDB4OTEwNiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MTA3LCAweDkxMDgsIDB4OTEwOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTEwQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MTBCLCAweDAwMDAsIDB4OTEwQywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MTBELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTEwRSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MTBGLCAweDkxMTAsIDB4MDAwMCwgMHg5MTExLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OTExMiwgMHg5MTEzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTExNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTExNSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MTE2LCAweDkxMTcsIDB4OTExOCwKKyAgICAweDkxMTksIDB4OTExQSwgMHg5MTFCLCAweDkxMUMsIDB4OTExRCwgMHg5MTFFLCAweDkxMUYsIDB4OTEyMCwgMHg5MTIxLAorICAgIDB4OTEyMiwgMHg5MTIzLCAweDkxMjQsIDB4OTEyNSwgMHg5MTI2LCAweDkxMjcsIDB4OTEyOCwgMHg5MTI5LCAweDkxMkEsCisgICAgMHg5MTJCLCAweDkxMkMsIDB4OTEyRCwgMHg5MTJFLCAweDkxMkYsIDB4OTEzMCwgMHg5MTMxLCAweDkxMzIsIDB4OTEzMywKKyAgICAweDkxMzQsIDB4OTEzNSwgMHg5MTM2LCAweDkxMzcsIDB4OTEzOCwgMHg5MTM5LCAweDkxM0EsIDB4OTEzQiwgMHg5MTNDLAorICAgIDB4OTEzRCwgMHg5MTNFLCAweDkxM0YsIDB4OTE0MCwgMHg5MTQxLCAweDkxNDIsIDB4OTE0MywgMHg5MTQ0LCAweDkxNDUsCisgICAgMHg5MTQ2LCAweDkxNDcsIDB4OTE0OCwgMHg5MTQ5LCAweDkxNEEsIDB4OTE0QiwgMHg5MTRDLCAweDkxNEQsIDB4OTE0RSwKKyAgICAweDkxNEYsIDB4OTE1MCwgMHg5MTUxLCAweDkxNTIsIDB4OTE1MywgMHg5MTU0LCAweDkxNTUsIDB4OTE1NiwgMHg5MTU3LAorICAgIDB4OTE1OCwgMHg5MTU5LCAweDkxNUEsIDB4OTE1QiwgMHg5MTVDLCAweDkxNUQsIDB4OTE1RSwgMHg5MTVGLCAweDkxNjAsCisgICAgMHg5MTYxLCAweDkxNjIsIDB4OTE2MywgMHg5MTY0LCAweDkxNjUsIDB4OTE2NiwgMHg5MTY3LCAweDkxNjgsIDB4OTE2OSwKKyAgICAweDkxNkEsIDB4OTE2QiwgMHg5MTZDLCAweDkxNkQsIDB4OTE2RSwgMHg5MTZGLCAweDkxNzAsIDB4OTE3MSwgMHg5MTcyLAorICAgIDB4OTE3MywgMHg5MTc0LCAweDkxNzUsIDB4OTE3NiwgMHg5MTc3LCAweDkxNzgsIDB4OTE3OSwgMHg5MTdBLCAweDkxN0IsCisgICAgMHg5MTdDLCAweDkxN0QsIDB4OTE3RSwgMHg5MTdGLCAweDkxODAsIDB4OTE4MSwgMHg5MTgyLCAweDkxODMsIDB4OTE4NCwKKyAgICAweDkxODUsIDB4OTE4NiwgMHg5MTg3LCAweDkxODgsIDB4OTE4OSwgMHg5MThBLCAweDkxOEIsIDB4OTE4QywgMHg5MThELAorICAgIDB4OTE4RSwgMHg5MThGLCAweDkxOTAsIDB4OTE5MSwgMHg5MTkyLCAweDkxOTMsIDB4OTE5NCwgMHg5MTk1LCAweDkxOTYsCisgICAgMHg5MTk3LCAweDkxOTgsIDB4OTE5OSwgMHg5MTlBLCAweDkxOUIsIDB4OTE5QywgMHg5MTlELCAweDkxOUUsIDB4OTE5RiwKKyAgICAweDkxQTAsIDB4OTFBMSwgMHg5MUEyLCAweDkxQTMsIDB4OTFBNCwgMHg5MUE1LCAweDkxQTYsIDB4OTFBNywgMHg5MUE4LAorICAgIDB4OTFBOSwgMHg5MUFBLCAweDkxQUIsIDB4OTFBQywgMHg5MUFELCAweDkxQUUsIDB4OTFBRiwgMHg5MUIwLCAweDkxQjEsCisgICAgMHg5MUIyLCAweDkxQjMsIDB4OTFCNCwgMHg5MUI1LCAweDkxQjYsIDB4OTFCNywgMHg5MUI4LCAweDkxQjksIDB4OTFCQSwKKyAgICAweDkxQkIsIDB4OTFCQywgMHg5MUJELCAweDkxQkUsIDB4OTFCRiwgMHg5MUMwLCAweDkxQzEsIDB4OTFDMiwgMHg5MUMzLAorICAgIDB4OTFDNCwgMHg5MUM1LCAweDkxQzYsIDB4OTFDNywgMHg5MUM4LCAweDkxQzksIDB4OTFDQSwgMHg5MUNCLCAweDkxQ0MsCisgICAgMHg5MUNELCAweDkxQ0UsIDB4OTFDRiwgMHg5MUQwLCAweDkxRDEsIDB4OTFEMiwgMHg5MUQzLCAweDkxRDQsIDB4OTFENSwKKyAgICAweDkxRDYsIDB4OTFENywgMHg5MUQ4LCAweDkxRDksIDB4OTFEQSwgMHg5MURCLCAweDkxREMsIDB4OTFERCwgMHg5MURFLAorICAgIDB4OTFERiwgMHg5MUUwLCAweDkxRTEsIDB4OTFFMiwgMHg5MUUzLCAweDkxRTQsIDB4OTFFNSwgMHg5MUU2LCAweDkxRTcsCisgICAgMHg5MUU4LCAweDkxRTksIDB4OTFFQSwgMHg5MUVCLCAweDkxRUMsIDB4OTFFRCwgMHg5MUVFLCAweDkxRUYsIDB4OTFGMCwKKyAgICAweDkxRjEsIDB4OTFGMiwgMHg5MUYzLCAweDkxRjQsIDB4OTFGNSwgMHg5MUY2LCAweDkxRjcsIDB4OTFGOCwgMHg5MUY5LAorICAgIDB4OTFGQSwgMHg5MUZCLCAweDkxRkMsIDB4OTFGRCwgMHg5MUZFLCAweDkxRkYsIDB4OTIwMCwgMHg5MjAxLCAweDkyMDIsCisgICAgMHg5MjAzLCAweDkyMDQsIDB4OTIwNSwgMHg5MjA2LCAweDkyMDcsIDB4OTIwOCwgMHg5MjA5LCAweDkyMEEsIDB4OTIwQiwKKyAgICAweDkyMEMsIDB4OTIwRCwgMHg5MjBFLCAweDkyMEYsIDB4OTIxMCwgMHg5MjExLCAweDkyMTIsIDB4OTIxMywgMHg5MjE0LAorICAgIDB4OTIxNSwgMHg5MjE2LCAweDkyMTcsIDB4OTIxOCwgMHg5MjE5LCAweDkyMUEsIDB4OTIxQiwgMHg5MjFDLCAweDkyMUQsCisgICAgMHg5MjFFLCAweDkyMUYsIDB4OTIyMCwgMHg5MjIxLCAweDkyMjIsIDB4OTIyMywgMHgwMDAwLCAweDAwMDAsIDB4OTIyNCwKKyAgICAweDAwMDAsIDB4OTIyNSwgMHgwMDAwLCAweDAwMDAsIDB4OTIyNiwgMHg5MjI3LCAweDkyMjgsIDB4OTIyOSwgMHg5MjJBLAorICAgIDB4OTIyQiwgMHg5MjJDLCAweDkyMkQsIDB4OTIyRSwgMHg5MjJGLCAweDAwMDAsIDB4OTIzMCwgMHgwMDAwLCAweDkyMzEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTIzMiwgMHg5MjMzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkyMzQsIDB4OTIzNSwKKyAgICAweDkyMzYsIDB4OTIzNywgMHgwMDAwLCAweDAwMDAsIDB4OTIzOCwgMHg5MjM5LCAweDkyM0EsIDB4OTIzQiwgMHg5MjNDLAorICAgIDB4OTIzRCwgMHg5MjNFLCAweDkyM0YsIDB4OTI0MCwgMHg5MjQxLCAweDkyNDIsIDB4OTI0MywgMHg5MjQ0LCAweDkyNDUsCisgICAgMHg5MjQ2LCAweDkyNDcsIDB4OTI0OCwgMHg5MjQ5LCAweDkyNEEsIDB4OTI0QiwgMHg5MjRDLCAweDkyNEQsIDB4OTI0RSwKKyAgICAweDkyNEYsIDB4OTI1MCwgMHg5MjUxLCAweDkyNTIsIDB4OTI1MywgMHg5MjU0LCAweDkyNTUsIDB4OTI1NiwgMHg5MjU3LAorICAgIDB4OTI1OCwgMHg5MjU5LCAweDkyNUEsIDB4OTI1QiwgMHg5MjVDLCAweDkyNUQsIDB4OTI1RSwgMHg5MjVGLCAweDkyNjAsCisgICAgMHg5MjYxLCAweDkyNjIsIDB4OTI2MywgMHg5MjY0LCAweDkyNjUsIDB4OTI2NiwgMHg5MjY3LCAweDkyNjgsIDB4OTI2OSwKKyAgICAweDkyNkEsIDB4OTI2QiwgMHg5MjZDLCAweDkyNkQsIDB4OTI2RSwgMHg5MjZGLCAweDkyNzAsIDB4OTI3MSwgMHg5MjcyLAorICAgIDB4OTI3MywgMHgwMDAwLCAweDkyNzQsIDB4MDAwMCwgMHgwMDAwLCAweDkyNzUsIDB4OTI3NiwgMHg5Mjc3LCAweDkyNzgsCisgICAgMHg5Mjc5LCAweDkyN0EsIDB4OTI3QiwgMHg5MjdDLCAweDkyN0QsIDB4OTI3RSwgMHg5MjdGLCAweDkyODAsIDB4OTI4MSwKKyAgICAweDkyODIsIDB4OTI4MywgMHg5Mjg0LCAweDkyODUsIDB4OTI4NiwgMHg5Mjg3LCAweDkyODgsIDB4OTI4OSwgMHg5MjhBLAorICAgIDB4OTI4QiwgMHg5MjhDLCAweDkyOEQsIDB4OTI4RSwgMHg5MjhGLCAweDkyOTAsIDB4OTI5MSwgMHg5MjkyLCAweDkyOTMsCisgICAgMHg5Mjk0LCAweDkyOTUsIDB4OTI5NiwgMHg5Mjk3LCAweDkyOTgsIDB4OTI5OSwgMHg5MjlBLCAweDkyOUIsIDB4OTI5QywKKyAgICAweDkyOUQsIDB4OTI5RSwgMHg5MjlGLCAweDkyQTAsIDB4OTJBMSwgMHg5MkEyLCAweDkyQTMsIDB4OTJBNCwgMHg5MkE1LAorICAgIDB4OTJBNiwgMHg5MkE3LCAweDkyQTgsIDB4OTJBOSwgMHg5MkFBLCAweDkyQUIsIDB4OTJBQywgMHg5MkFELCAweDkyQUUsCisgICAgMHg5MkFGLCAweDkyQjAsIDB4OTJCMSwgMHg5MkIyLCAweDkyQjMsIDB4OTJCNCwgMHg5MkI1LCAweDkyQjYsIDB4OTJCNywKKyAgICAweDkyQjgsIDB4OTJCOSwgMHg5MkJBLCAweDkyQkIsIDB4OTJCQywgMHg5MkJELCAweDkyQkUsIDB4OTJCRiwgMHg5MkMwLAorICAgIDB4OTJDMSwgMHg5MkMyLCAweDkyQzMsIDB4OTJDNCwgMHg5MkM1LCAweDkyQzYsIDB4OTJDNywgMHg5MkM4LCAweDkyQzksCisgICAgMHg5MkNBLCAweDkyQ0IsIDB4OTJDQywgMHg5MkNELCAweDkyQ0UsIDB4OTJDRiwgMHg5MkQwLCAweDkyRDEsIDB4OTJEMiwKKyAgICAweDkyRDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTJENCwgMHg5MkQ1LCAweDkyRDYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg5MkQ3LCAweDkyRDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjNBQywgMHgyM0FFLCAweDIzQjAsIDB4MzMxMiwKKyAgICAweDMzMTUsIDB4MjNCMiwgMHgyM0I0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjNCNiwgMHgyM0I4LCAweDIzQkEsCisgICAgMHgyM0JDLCAweDIzQkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIzQzAsIDB4MDAwMCwKKyAgICAweDIzQzIsIDB4OTJEOSwgMHg5MkRBLCAweDkyREIsIDB4OTJEQywgMHg5MkRELCAweDkyREUsIDB4OTJERiwgMHg5MkUwLAorICAgIDB4OTJFMSwgMHg5MkUyLCAweDIzQzQsIDB4MjNDNiwgMHgyM0M4LCAweDIzQ0EsIDB4MjNDQywgMHgyM0NFLCAweDIzRDAsCisgICAgMHgyM0QyLCAweDIzRDQsIDB4MjNENiwgMHgyM0Q4LCAweDIzREEsIDB4MjNEQywgMHgwMDAwLCAweDIzREUsIDB4MjNFMCwKKyAgICAweDIzRTIsIDB4MjNFNCwgMHgyM0U2LCAweDAwMDAsIDB4MjNFOCwgMHgwMDAwLCAweDIzRUEsIDB4MjNFQywgMHgwMDAwLAorICAgIDB4MjNFRSwgMHgyM0YwLCAweDAwMDAsIDB4MjNGMiwgMHgyM0Y0LCAweDIzRjYsIDB4MjNGOCwgMHgyM0ZBLCAweDIzRkMsCisgICAgMHgyM0ZFLCAweDI0MDAsIDB4MjQwMiwgMHgyNDA0LCAweDkyRTMsIDB4OTJFNCwgMHg5MkU1LCAweDkyRTYsIDB4OTJFNywKKyAgICAweDkyRTgsIDB4OTJFOSwgMHg5MkVBLCAweDkyRUIsIDB4OTJFQywgMHg5MkVELCAweDkyRUUsIDB4OTJFRiwgMHg5MkYwLAorICAgIDB4OTJGMSwgMHg5MkYyLCAweDkyRjMsIDB4OTJGNCwgMHg5MkY1LCAweDkyRjYsIDB4OTJGNywgMHg5MkY4LCAweDkyRjksCisgICAgMHg5MkZBLCAweDkyRkIsIDB4OTJGQywgMHg5MkZELCAweDkyRkUsIDB4OTJGRiwgMHg5MzAwLCAweDkzMDEsIDB4OTMwMiwKKyAgICAweDkzMDMsIDB4OTMwNCwgMHg5MzA1LCAweDkzMDYsIDB4OTMwNywgMHg5MzA4LCAweDkzMDksIDB4OTMwQSwgMHg5MzBCLAorICAgIDB4OTMwQywgMHg5MzBELCAweDkzMEUsIDB4OTMwRiwgMHg5MzEwLCAweDkzMTEsIDB4OTMxMiwgMHg5MzEzLCAweDkzMTQsCisgICAgMHg5MzE1LCAweDkzMTYsIDB4OTMxNywgMHg5MzE4LCAweDkzMTksIDB4OTMxQSwgMHg5MzFCLCAweDkzMUMsIDB4OTMxRCwKKyAgICAweDkzMUUsIDB4OTMxRiwgMHg5MzIwLCAweDkzMjEsIDB4OTMyMiwgMHg5MzIzLCAweDkzMjQsIDB4OTMyNSwgMHg5MzI2LAorICAgIDB4OTMyNywgMHg5MzI4LCAweDkzMjksIDB4OTMyQSwgMHg5MzJCLCAweDkzMkMsIDB4OTMyRCwgMHg5MzJFLCAweDkzMkYsCisgICAgMHg5MzMwLCAweDkzMzEsIDB4OTMzMiwgMHg5MzMzLCAweDkzMzQsIDB4OTMzNSwgMHg5MzM2LCAweDkzMzcsIDB4OTMzOCwKKyAgICAweDkzMzksIDB4OTMzQSwgMHg5MzNCLCAweDkzM0MsIDB4OTMzRCwgMHg5MzNFLCAweDkzM0YsIDB4OTM0MCwgMHg5MzQxLAorICAgIDB4OTM0MiwgMHg5MzQzLCAweDkzNDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MzQ1LCAweDkzNDYsIDB4OTM0NywgMHg5MzQ4LCAweDkzNDksIDB4OTM0QSwgMHg5MzRCLCAweDkzNEMsIDB4OTM0RCwKKyAgICAweDkzNEUsIDB4OTM0RiwgMHg5MzUwLCAweDkzNTEsIDB4OTM1MiwgMHg5MzUzLCAweDkzNTQsIDB4OTM1NSwgMHg5MzU2LAorICAgIDB4OTM1NywgMHg5MzU4LCAweDkzNTksIDB4OTM1QSwgMHg5MzVCLCAweDI0MDYsIDB4MjQwOCwgMHgyNDBBLCAweDI0MEMsCisgICAgMHgyNDBFLCAweDI0MTAsIDB4MjQxMiwgMHgyNDE0LCAweDI0MTYsIDB4MjQxOCwgMHgyNDFBLCAweDI0MUMsIDB4MjQxRSwKKyAgICAweDI0MjAsIDB4MjQyMiwgMHgyNDI0LCAweDI0MjYsIDB4MjQyOCwgMHg5MzVDLCAweDkzNUQsIDB4OTM1RSwgMHg5MzVGLAorICAgIDB4MjQyQSwgMHgyNDJDLCAweDI0MkUsIDB4MjQzMCwgMHgyNDMyLCAweDI0MzQsIDB4MjQzNiwgMHgyNDM4LCAweDI0M0EsCisgICAgMHgyNDNDLCAweDI0M0UsIDB4MjQ0MCwgMHgyNDQyLCAweDI0NDQsIDB4MjQ0NiwgMHgyNDQ4LCAweDI0NEEsIDB4MjQ0QywKKyAgICAweDI0NEUsIDB4MjQ1MCwgMHgyNDUyLCAweDI0NTQsIDB4MjQ1NiwgMHgyNDU4LCAweDI0NUEsIDB4MjQ1QywgMHgyNDVFLAorICAgIDB4MjQ2MCwgMHgyNDYyLCAweDI0NjQsIDB4MjQ2NiwgMHgyNDY4LCAweDI0NkEsIDB4MjQ2QywgMHgyNDZFLCAweDI0NzAsCisgICAgMHgyNDcyLCAweDI0NzQsIDB4MjQ3NiwgMHgyNDc4LCAweDI0N0EsIDB4MjQ3QywgMHgyNDdFLCAweDI0ODAsIDB4MjQ4MiwKKyAgICAweDI0ODQsIDB4MjQ4NiwgMHgyNDg4LCAweDI0OEEsIDB4MjQ4QywgMHgyNDhFLCAweDI0OTAsIDB4MjQ5MiwgMHgyNDk0LAorICAgIDB4MjQ5NiwgMHgyNDk4LCAweDI0OUEsIDB4MjQ5QywgMHgyNDlFLCAweDI0QTAsIDB4MjRBMiwgMHgyNEE0LCAweDI0QTYsCisgICAgMHgyNEE4LCAweDI0QUEsIDB4MjRBQywgMHgyNEFFLCAweDI0QjAsIDB4MjRCMiwgMHgyNEI0LCAweDI0QjYsIDB4MjRCOCwKKyAgICAweDI0QkEsIDB4MjRCQywgMHgyNEJFLCAweDI0QzAsIDB4MjRDMiwgMHgyNEM0LCAweDI0QzYsIDB4MjRDOCwgMHgyNENBLAorICAgIDB4MjRDQywgMHgyNENFLCAweDI0RDAsIDB4MjREMiwgMHgyNEQ0LCAweDI0RDYsIDB4MjREOCwgMHgyNERBLCAweDI0REMsCisgICAgMHgyNERFLCAweDI0RTAsIDB4MjRFMiwgMHgyNEU0LCAweDI0RTYsIDB4MjRFOCwgMHgyNEVBLCAweDI0RUMsIDB4MjRFRSwKKyAgICAweDI0RjAsIDB4MjRGMiwgMHgyNEY0LCAweDI0RjYsIDB4MjRGOCwgMHgyNEZBLCAweDI0RkMsIDB4MjRGRSwgMHgyNTAwLAorICAgIDB4MjUwMiwgMHgyNTA0LCAweDI1MDYsIDB4MjUwOCwgMHgyNTBBLCAweDI1MEMsIDB4MjUwRSwgMHgyNTEwLCAweDI1MTIsCisgICAgMHgyNTE0LCAweDI1MTYsIDB4MjUxOCwgMHgyNTFBLCAweDI1MUMsIDB4MjUxRSwgMHgyNTIwLCAweDI1MjIsIDB4MjUyNCwKKyAgICAweDI1MjYsIDB4MjUyOCwgMHgyNTJBLCAweDI1MkMsIDB4MjUyRSwgMHgyNTMwLCAweDI1MzIsIDB4MjUzNCwgMHgyNTM2LAorICAgIDB4MjUzOCwgMHgyNTNBLCAweDI1M0MsIDB4MjUzRSwgMHgyNTQwLCAweDI1NDIsIDB4MjU0NCwgMHgyNTQ2LCAweDI1NDgsCisgICAgMHgyNTRBLCAweDI1NEMsIDB4MjU0RSwgMHgyNTUwLCAweDI1NTIsIDB4MjU1NCwgMHgyNTU2LCAweDI1NTgsIDB4MjU1QSwKKyAgICAweDI1NUMsIDB4MjU1RSwgMHgyNTYwLCAweDI1NjIsIDB4MjU2NCwgMHgyNTY2LCAweDI1NjgsIDB4MjU2QSwgMHgyNTZDLAorICAgIDB4MjU2RSwgMHgyNTcwLCAweDI1NzIsIDB4MjU3NCwgMHgyNTc2LCAweDI1NzgsIDB4MjU3QSwgMHgyNTdDLCAweDI1N0UsCisgICAgMHgyNTgwLCAweDI1ODIsIDB4MjU4NCwgMHgyNTg2LCAweDI1ODgsIDB4MjU4QSwgMHgyNThDLCAweDI1OEUsIDB4MjU5MCwKKyAgICAweDI1OTIsIDB4MjU5NCwgMHgyNTk2LCAweDI1OTgsIDB4MjU5QSwgMHgyNTlDLCAweDI1OUUsIDB4MjVBMCwgMHgyNUEyLAorICAgIDB4MjVBNCwgMHgyNUE2LCAweDI1QTgsIDB4MjVBQSwgMHgyNUFDLCAweDI1QUUsIDB4MjVCMCwgMHgyNUIyLCAweDI1QjQsCisgICAgMHgyNUI2LCAweDI1QjgsIDB4MjVCQSwgMHgyNUJDLCAweDI1QkUsIDB4MjVDMCwgMHgyNUMyLCAweDI1QzQsIDB4MjVDNiwKKyAgICAweDI1QzgsIDB4MjVDQSwgMHgyNUNDLCAweDI1Q0UsIDB4MjVEMCwgMHgyNUQyLCAweDI1RDQsIDB4MjVENiwgMHgyNUQ4LAorICAgIDB4MjVEQSwgMHgyNURDLCAweDI1REUsIDB4MjVFMCwgMHgyNUUyLCAweDI1RTQsIDB4MjVFNiwgMHgyNUU4LCAweDI1RUEsCisgICAgMHgyNUVDLCAweDI1RUUsIDB4MjVGMCwgMHgyNUYyLCAweDI1RjQsIDB4MjVGNiwgMHgyNUY4LCAweDI1RkEsIDB4MjVGQywKKyAgICAweDI1RkUsIDB4MjYwMCwgMHgyNjAyLCAweDI2MDQsIDB4MjYwNiwgMHgyNjA4LCAweDI2MEEsIDB4MjYwQywgMHgzMzE4LAorICAgIDB4MzMxQiwgMHgzMzFFLCAweDI2MEUsIDB4MjYxMCwgMHgyNjEyLCAweDI2MTQsIDB4MjYxNiwgMHgyNjE4LCAweDI2MUEsCisgICAgMHgyNjFDLCAweDI2MUUsIDB4MjYyMCwgMHgyNjIyLCAweDI2MjQsIDB4MjYyNiwgMHgyNjI4LCAweDI2MkEsIDB4MjYyQywKKyAgICAweDI2MkUsIDB4MjYzMCwgMHgyNjMyLCAweDI2MzQsIDB4MjYzNiwgMHgyNjM4LCAweDI2M0EsIDB4MjYzQywgMHgyNjNFLAorICAgIDB4MjY0MCwgMHgyNjQyLCAweDI2NDQsIDB4MjY0NiwgMHgyNjQ4LCAweDI2NEEsIDB4MjY0QywgMHgyNjRFLCAweDI2NTAsCisgICAgMHgyNjUyLCAweDI2NTQsIDB4MjY1NiwgMHgyNjU4LCAweDI2NUEsIDB4MjY1QywgMHgyNjVFLCAweDI2NjAsIDB4MjY2MiwKKyAgICAweDI2NjQsIDB4MjY2NiwgMHgyNjY4LCAweDI2NkEsIDB4MjY2QywgMHgyNjZFLCAweDI2NzAsIDB4MjY3MiwgMHgyNjc0LAorICAgIDB4MjY3NiwgMHgyNjc4LCAweDI2N0EsIDB4MjY3QywgMHgyNjdFLCAweDI2ODAsIDB4MjY4MiwgMHgyNjg0LCAweDI2ODYsCisgICAgMHgyNjg4LCAweDI2OEEsIDB4MjY4QywgMHgyNjhFLCAweDI2OTAsIDB4MjY5MiwgMHgyNjk0LCAweDI2OTYsIDB4MjY5OCwKKyAgICAweDI2OUEsIDB4MjY5QywgMHgyNjlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzMzIxLCAweDMzMjQsIDB4MzMyNywgMHgzMzJBLCAweDMzMkQsIDB4MzMzMCwKKyAgICAweDMzMzMsIDB4MzMzNiwgMHgzMzM5LCAweDMzM0MsIDB4MzMzRiwgMHgzMzQyLCAweDMzNDUsIDB4MzM0OCwgMHgzMzRCLAorICAgIDB4MzM0RSwgMHgzMzUxLCAweDMzNTQsIDB4MzM1NywgMHgzMzVBLCAweDMzNUQsIDB4MzM2MCwgMHgzMzYzLCAweDMzNjYsCisgICAgMHgzMzY5LCAweDMzNkMsIDB4MzM2RiwgMHgzMzcyLCAweDMzNzUsIDB4MzM3OCwgMHgzMzdCLCAweDMzN0UsIDB4MzM4MSwKKyAgICAweDMzODQsIDB4MzM4NywgMHgzMzhBLCAweDMzOEQsIDB4MzM5MCwgMHgzMzkzLCAweDMzOTYsIDB4MzM5OSwgMHgzMzlDLAorICAgIDB4MzM5RiwgMHgzM0EyLCAweDMzQTUsIDB4MzNBOCwgMHgzM0FCLCAweDMzQUUsIDB4MzNCMSwgMHgzM0I0LCAweDMzQjcsCisgICAgMHgzM0JBLCAweDMzQkQsIDB4MzNDMCwgMHgzM0MzLCAweDMzQzYsIDB4MzNDOSwgMHgzM0NDLCAweDMzQ0YsIDB4MzNEMiwKKyAgICAweDMzRDUsIDB4MzNEOCwgMHgzM0RCLCAweDMzREUsIDB4MDAwMCwgMHgwMDAwLCAweDMzRTEsIDB4MzNFNCwgMHgzM0U3LAorICAgIDB4MzNFQSwgMHgzM0VELCAweDMzRjAsIDB4MzNGMywgMHgzM0Y2LCAweDMzRjksIDB4MzNGQywgMHgzM0ZGLCAweDM0MDIsCisgICAgMHgzNDA1LCAweDM0MDgsIDB4MzQwQiwgMHgzNDBFLCAweDM0MTEsIDB4MzQxNCwgMHgzNDE3LCAweDM0MUEsIDB4MzQxRCwKKyAgICAweDM0MjAsIDB4MzQyMywgMHgzNDI2LCAweDM0MjksIDB4MzQyQywgMHgzNDJGLCAweDM0MzIsIDB4MzQzNSwgMHgzNDM4LAorICAgIDB4MzQzQiwgMHgzNDNFLCAweDM0NDEsIDB4MzQ0NCwgMHgzNDQ3LCAweDM0NEEsIDB4MzQ0RCwgMHgzNDUwLCAweDM0NTMsCisgICAgMHgzNDU2LCAweDM0NTksIDB4MzQ1QywgMHgzNDVGLCAweDM0NjIsIDB4MzQ2NSwgMHgzNDY4LCAweDM0NkIsIDB4MzQ2RSwKKyAgICAweDM0NzEsIDB4MzQ3NCwgMHgzNDc3LCAweDM0N0EsIDB4MzQ3RCwgMHgzNDgwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDM0ODMsIDB4MzQ4NiwgMHg0MUE0LCAweDQxQTksIDB4NDFBRSwgMHg0MUIzLCAweDQxQjgsIDB4NDFCRCwKKyAgICAweDQxQzIsIDB4MzQ4OSwgMHg0MUM3LCAweDQxREEsIDB4NDFFMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MzYwLCAweDkzNjEsIDB4OTM2MiwKKyAgICAweDkzNjMsIDB4OTM2NCwgMHg5MzY1LCAweDkzNjYsIDB4OTM2NywgMHg5MzY4LCAweDkzNjksIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MzZBLCAweDkzNkIsIDB4OTM2QywgMHg5MzZELCAweDkzNkUsIDB4OTM2RiwgMHg5MzcwLAorICAgIDB4OTM3MSwgMHg5MzcyLCAweDkzNzMsIDB4OTM3NCwgMHg5Mzc1LCAweDkzNzYsIDB4OTM3NywgMHg5Mzc4LCAweDkzNzksCisgICAgMHg5MzdBLCAweDkzN0IsIDB4OTM3QywgMHg5MzdELCAweDkzN0UsIDB4MDAwMCwgMHgwMDAwLCAweDkzN0YsIDB4OTM4MCwKKyAgICAweDkzODEsIDB4OTM4MiwgMHg5MzgzLCAweDkzODQsIDB4OTM4NSwgMHg5Mzg2LCAweDkzODcsIDB4OTM4OCwgMHg5Mzg5LAorICAgIDB4OTM4QSwgMHgwMDAwLCAweDkzOEIsIDB4OTM4QywgMHg5MzhELCAweDkzOEUsIDB4OTM4RiwgMHg5MzkwLCAweDkzOTEsCisgICAgMHg5MzkyLCAweDkzOTMsIDB4OTM5NCwgMHg5Mzk1LCAweDkzOTYsIDB4OTM5NywgMHg5Mzk4LCAweDkzOTksIDB4OTM5QSwKKyAgICAweDkzOUIsIDB4OTM5QywgMHg5MzlELCAweDAwMDAsIDB4OTM5RSwgMHg5MzlGLCAweDkzQTAsIDB4OTNBMSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTNBMiwgMHgyNkEwLCAweDkzQTMsIDB4MDAwMCwgMHg5M0E0LCAweDAwMDAsCisgICAgMHg5M0E1LCAweDI2QTIsIDB4OTNBNiwgMHgyNkE0LCAweDkzQTcsIDB4MjZBNiwgMHg5M0E4LCAweDI2QTgsIDB4OTNBOSwKKyAgICAweDI2QUEsIDB4OTNBQSwgMHg5M0FCLCAweDkzQUMsIDB4OTNBRCwgMHg5M0FFLCAweDkzQUYsIDB4OTNCMCwgMHg5M0IxLAorICAgIDB4OTNCMiwgMHg5M0IzLCAweDkzQjQsIDB4OTNCNSwgMHg5M0I2LCAweDkzQjcsIDB4OTNCOCwgMHg5M0I5LCAweDkzQkEsCisgICAgMHg5M0JCLCAweDkzQkMsIDB4OTNCRCwgMHg5M0JFLCAweDkzQkYsIDB4OTNDMCwgMHg5M0MxLCAweDkzQzIsIDB4OTNDMywKKyAgICAweDkzQzQsIDB4OTNDNSwgMHg5M0M2LCAweDkzQzcsIDB4OTNDOCwgMHg5M0M5LCAweDkzQ0EsIDB4OTNDQiwgMHg5M0NDLAorICAgIDB4OTNDRCwgMHg5M0NFLCAweDkzQ0YsIDB4OTNEMCwgMHg5M0QxLCAweDkzRDIsIDB4OTNEMywgMHg5M0Q0LCAweDkzRDUsCisgICAgMHg5M0Q2LCAweDkzRDcsIDB4OTNEOCwgMHg5M0Q5LCAweDkzREEsIDB4OTNEQiwgMHg5M0RDLCAweDkzREQsIDB4OTNERSwKKyAgICAweDkzREYsIDB4OTNFMCwgMHg5M0UxLCAweDkzRTIsIDB4OTNFMywgMHg5M0U0LCAweDkzRTUsIDB4OTNFNiwgMHg5M0U3LAorICAgIDB4OTNFOCwgMHg5M0U5LCAweDkzRUEsIDB4OTNFQiwgMHg5M0VDLCAweDkzRUQsIDB4OTNFRSwgMHg5M0VGLCAweDkzRjAsCisgICAgMHg5M0YxLCAweDkzRjIsIDB4OTNGMywgMHg5M0Y0LCAweDkzRjUsIDB4OTNGNiwgMHg5M0Y3LCAweDkzRjgsIDB4OTNGOSwKKyAgICAweDkzRkEsIDB4OTNGQiwgMHg5M0ZDLCAweDkzRkQsIDB4OTNGRSwgMHg5M0ZGLCAweDk0MDAsIDB4OTQwMSwgMHg5NDAyLAorICAgIDB4OTQwMywgMHg5NDA0LCAweDk0MDUsIDB4OTQwNiwgMHg5NDA3LCAweDk0MDgsIDB4OTQwOSwgMHg5NDBBLCAweDk0MEIsCisgICAgMHg5NDBDLCAweDk0MEQsIDB4OTQwRSwgMHg5NDBGLCAweDk0MTAsIDB4OTQxMSwgMHg5NDEyLCAweDk0MTMsIDB4OTQxNCwKKyAgICAweDk0MTUsIDB4OTQxNiwgMHg5NDE3LCAweDk0MTgsIDB4OTQxOSwgMHg5NDFBLCAweDk0MUIsIDB4OTQxQywgMHg5NDFELAorICAgIDB4OTQxRSwgMHgyNkFDLCAweDI2QUUsIDB4MjZCMCwgMHgyNkIyLCAweDI2QjQsIDB4MjZCNiwgMHgyNkI4LCAweDI2QkEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDk0MUYsIDB4OTQyMCwgMHg5NDIxLCAweDk0MjIsIDB4OTQyMywKKyAgICAweDk0MjQsIDB4OTQyNSwgMHg5NDI2LCAweDk0MjcsIDB4OTQyOCwgMHg5NDI5LCAweDk0MkEsIDB4OTQyQiwgMHg5NDJDLAorICAgIDB4OTQyRCwgMHg5NDJFLCAweDk0MkYsIDB4OTQzMCwgMHg5NDMxLCAweDk0MzIsIDB4OTQzMywgMHg5NDM0LCAweDk0MzUsCisgICAgMHg5NDM2LCAweDk0MzcsIDB4OTQzOCwgMHg5NDM5LCAweDk0M0EsIDB4OTQzQiwgMHg5NDNDLCAweDk0M0QsIDB4OTQzRSwKKyAgICAweDk0M0YsIDB4OTQ0MCwgMHg5NDQxLCAweDk0NDIsIDB4OTQ0MywgMHg5NDQ0LCAweDk0NDUsIDB4OTQ0NiwgMHg5NDQ3LAorICAgIDB4OTQ0OCwgMHg5NDQ5LCAweDk0NEEsIDB4OTQ0QiwgMHg5NDRDLCAweDk0NEQsIDB4OTQ0RSwgMHg5NDRGLCAweDk0NTAsCisgICAgMHg5NDUxLCAweDk0NTIsIDB4OTQ1MywgMHg5NDU0LCAweDk0NTUsIDB4OTQ1NiwgMHg5NDU3LCAweDk0NTgsIDB4OTQ1OSwKKyAgICAweDk0NUEsIDB4OTQ1QiwgMHg5NDVDLCAweDk0NUQsIDB4OTQ1RSwgMHg5NDVGLCAweDk0NjAsIDB4OTQ2MSwgMHg5NDYyLAorICAgIDB4OTQ2MywgMHg5NDY0LCAweDk0NjUsIDB4OTQ2NiwgMHg5NDY3LCAweDk0NjgsIDB4OTQ2OSwgMHg5NDZBLCAweDk0NkIsCisgICAgMHg5NDZDLCAweDk0NkQsIDB4OTQ2RSwgMHg5NDZGLCAweDk0NzAsIDB4OTQ3MSwgMHg5NDcyLCAweDk0NzMsIDB4OTQ3NCwKKyAgICAweDk0NzUsIDB4OTQ3NiwgMHg5NDc3LCAweDk0NzgsIDB4OTQ3OSwgMHg5NDdBLCAweDk0N0IsIDB4OTQ3QywgMHg5NDdELAorICAgIDB4OTQ3RSwgMHg5NDdGLCAweDk0ODAsIDB4OTQ4MSwgMHg5NDgyLCAweDk0ODMsIDB4OTQ4NCwgMHg5NDg1LCAweDk0ODYsCisgICAgMHg5NDg3LCAweDk0ODgsIDB4OTQ4OSwgMHg5NDhBLCAweDk0OEIsIDB4OTQ4QywgMHg5NDhELCAweDk0OEUsIDB4OTQ4RiwKKyAgICAweDk0OTAsIDB4OTQ5MSwgMHg5NDkyLCAweDk0OTMsIDB4OTQ5NCwgMHg5NDk1LCAweDk0OTYsIDB4OTQ5NywgMHg5NDk4LAorICAgIDB4OTQ5OSwgMHg5NDlBLCAweDk0OUIsIDB4OTQ5QywgMHg5NDlELCAweDk0OUUsIDB4OTQ5RiwgMHg5NEEwLCAweDk0QTEsCisgICAgMHg5NEEyLCAweDk0QTMsIDB4OTRBNCwgMHg5NEE1LCAweDk0QTYsIDB4OTRBNywgMHg5NEE4LCAweDk0QTksIDB4OTRBQSwKKyAgICAweDk0QUIsIDB4OTRBQywgMHg5NEFELCAweDk0QUUsIDB4OTRBRiwgMHg5NEIwLCAweDk0QjEsIDB4OTRCMiwgMHg5NEIzLAorICAgIDB4OTRCNCwgMHg5NEI1LCAweDk0QjYsIDB4OTRCNywgMHg5NEI4LCAweDk0QjksIDB4OTRCQSwgMHg5NEJCLCAweDk0QkMsCisgICAgMHg5NEJELCAweDk0QkUsIDB4OTRCRiwgMHg5NEMwLCAweDk0QzEsIDB4OTRDMiwgMHg5NEMzLCAweDk0QzQsIDB4OTRDNSwKKyAgICAweDk0QzYsIDB4OTRDNywgMHg5NEM4LCAweDk0QzksIDB4OTRDQSwgMHg5NENCLCAweDk0Q0MsIDB4OTRDRCwgMHg5NENFLAorICAgIDB4OTRDRiwgMHg5NEQwLCAweDk0RDEsIDB4OTREMiwgMHg5NEQzLCAweDk0RDQsIDB4OTRENSwgMHg5NEQ2LCAweDk0RDcsCisgICAgMHg5NEQ4LCAweDk0RDksIDB4OTREQSwgMHg5NERCLCAweDk0REMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTRERCwKKyAgICAweDk0REUsIDB4OTRERiwgMHg5NEUwLCAweDk0RTEsIDB4OTRFMiwgMHgwMDAwLCAweDAwMDAsIDB4OTRFMywgMHg5NEU0LAorICAgIDB4OTRFNSwgMHg5NEU2LCAweDk0RTcsIDB4OTRFOCwgMHgwMDAwLCAweDAwMDAsIDB4OTRFOSwgMHg5NEVBLCAweDk0RUIsCisgICAgMHg5NEVDLCAweDk0RUQsIDB4OTRFRSwgMHgwMDAwLCAweDAwMDAsIDB4OTRFRiwgMHg5NEYwLCAweDk0RjEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5NEYyLCAweDk0RjMsIDB4OTRGNCwgMHg5NEY1LCAweDk0RjYsIDB4OTRGNywgMHg5NEY4LAorICAgIDB4MDAwMCwgMHg5NEY5LCAweDk0RkEsIDB4OTRGQiwgMHg5NEZDLCAweDk0RkQsIDB4OTRGRSwgMHg5NEZGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDB9OwogZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAxWzUzNzZdID0gewotICAgIDB4MDA2NiwgMHgwMDUzLCAweDAwNTMsIDB4MDA1OSwgMHgwMDIwLCAweDAzMDgsIDB4MDA2MSwgMHgwMDUyLCAweDAzMDQsIDB4MDAzMiwgMHgwMDMzLCAweDAzMDEsIDB4MDNCQywgMHgwMzI3LCAweDAwMzEsIDB4MDA2RiwKLSAgICAweDAwNDEsIDB4MDA0MSwgMHgwMDQxLCAweDAwNDEsIDB4MDA0MSwgMHgwMDQxLCAweDAwNDMsIDB4MDA0NSwgMHgwMDQ1LCAweDAwNDUsIDB4MDA0NSwgMHgwMDQ5LCAweDAwNDksIDB4MDA0OSwgMHgwMDQ5LCAweDAwNDQsCi0gICAgMHgwMDRFLCAweDAwNEYsIDB4MDA0RiwgMHgwMDRGLCAweDAwNEYsIDB4MDA0RiwgMHgwMDRGLCAweDAwNTUsIDB4MDA1NSwgMHgwMDU1LCAweDAwNTUsIDB4MDA1OSwgMHgwMDYxLCAweDAwNjEsIDB4MDA2MSwgMHgwMDYxLAotICAgIDB4MDA2MSwgMHgwMDYxLCAweDAwNjMsIDB4MDA2NSwgMHgwMDY1LCAweDAwNjUsIDB4MDA2NSwgMHgwMDY5LCAweDAwNjksIDB4MDA2OSwgMHgwMDY5LCAweDAwNkUsIDB4MDA2RiwgMHgwMDZGLCAweDAwNkYsIDB4MDA2RiwKLSAgICAweDAwNkYsIDB4MDA2RiwgMHgwMDc1LCAweDAwNzUsIDB4MDA3NSwgMHgwMDc1LCAweDAwNzksIDB4MDA3OSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQzLCAweDAwNjMsCi0gICAgMHgwMDQzLCAweDAwNjMsIDB4MDA0MywgMHgwMDYzLCAweDAwNDMsIDB4MDA2MywgMHgwMDQ0LCAweDAwNjQsIDB4MDA0NCwgMHgwMDY0LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LAotICAgIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ3LCAweDAwNjcsIDB4MDA0NywgMHgwMDY3LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ3LCAweDAwNjcsIDB4MDA0OCwgMHgwMDY4LCAweDAwNDgsIDB4MDA2OCwKLSAgICAweDAwNDksIDB4MDA2OSwgMHgwMDQ5LCAweDAwNjksIDB4MDA0OSwgMHgwMDY5LCAweDAwNDksIDB4MDA2OSwgMHgwMDQ5LCAweDAwNEEsIDB4MDA2QSwgMHgwMDRCLCAweDAwNkIsIDB4MDA0QiwgMHgwMDRDLCAweDAwNkMsCi0gICAgMHgwMDRDLCAweDAwNkMsIDB4MDA0QywgMHgwMDZDLCAweDAwNEMsIDB4MDA2QywgMHgwMDRDLCAweDAwNkMsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEUsIDB4MDA2RSwgMHgwMDRFLCAweDAwNkUsIDB4MDA2RSwgMHgwMDRGLAotICAgIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNTIsIDB4MDA3MiwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTMsIDB4MDA3MywgMHgwMDUzLCAweDAwNzMsIDB4MDA1MywKLSAgICAweDAwNzMsIDB4MDA1MywgMHgwMDczLCAweDAwNTQsIDB4MDA3NCwgMHgwMDU0LCAweDAwNzQsIDB4MDA1NCwgMHgwMDc0LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsCi0gICAgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NywgMHgwMDc3LCAweDAwNTksIDB4MDA3OSwgMHgwMDU5LCAweDAwNUEsIDB4MDA3QSwgMHgwMDVBLCAweDAwN0EsIDB4MDA1QSwgMHgwMDdBLAotICAgIDB4MDA3MywgMHgwMDYyLCAweDAwNDIsIDB4MDA0MiwgMHgwMDYyLCAweDAwNDMsIDB4MDA2MywgMHgwMDQ0LCAweDAwNDQsIDB4MDA0NCwgMHgwMDY0LCAweDAwNDUsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNjYsIDB4MDA0NywKLSAgICAweDAwNDksIDB4MDA0QiwgMHgwMDZCLCAweDAwNkMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNkUsIDB4MDA0RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA1MCwgMHgwMDcwLCAweDAyODMsIDB4MDA3NCwgMHgwMDU0LCAweDAwNzQsCi0gICAgMHgwMDU0LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU2LCAweDAwNTksIDB4MDA3OSwgMHgwMDVBLCAweDAwN0EsIDB4MDFCNywgMHgwMDQxLCAweDAwNjEsIDB4MDA0OSwgMHgwMDY5LCAweDAwNEYsIDB4MDA2RiwgMHgwMDU1LAotICAgIDB4MDA3NSwgMHgwMERDLCAweDAwRkMsIDB4MDBEQywgMHgwMEZDLCAweDAwREMsIDB4MDBGQywgMHgwMERDLCAweDAwRkMsIDB4MDA2NSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwQzYsIDB4MDBFNiwKLSAgICAweDAwNDcsIDB4MDA2NywgMHgwMDQ3LCAweDAwNjcsIDB4MDA0QiwgMHgwMDZCLCAweDAwNEYsIDB4MDA2RiwgMHgwMUVBLCAweDAxRUIsIDB4MDFCNywgMHgwMjkyLCAweDAwNkEsIDB4MDA0NywgMHgwMDY3LCAweDAwNEUsCi0gICAgMHgwMDZFLCAweDAwNDEsIDB4MDA2MSwgMHgwMEM2LCAweDAwRTYsIDB4MDBEOCwgMHgwMEY4LCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ5LAotICAgIDB4MDA2OSwgMHgwMDQ5LCAweDAwNjksIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1MywKLSAgICAweDAwNzMsIDB4MDA1NCwgMHgwMDc0LCAweDAwNDgsIDB4MDA2OCwgMHgwMDRFLCAweDAwNjQsIDB4MDA1QSwgMHgwMDdBLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQ1LCAweDAwNjUsIDB4MDBENiwgMHgwMEY2LCAweDAwRDUsCi0gICAgMHgwMEY1LCAweDAwNEYsIDB4MDA2RiwgMHgwMjJFLCAweDAyMkYsIDB4MDA1OSwgMHgwMDc5LCAweDAwNkMsIDB4MDA2RSwgMHgwMDc0LCAweDAwNkEsIDB4MDA0MSwgMHgwMDQzLCAweDAwNjMsIDB4MDA0QywgMHgwMDU0LAotICAgIDB4MDA1MywgMHgwMDVBLCAweDAwNDIsIDB4MDA1NSwgMHgwMDU2LCAweDAwNDUsIDB4MDA2NSwgMHgwMDRBLCAweDAwNkEsIDB4MDA1MSwgMHgwMDcxLCAweDAwNTIsIDB4MDA3MiwgMHgwMDU5LCAweDAwNzksIDB4MDA2MSwKLSAgICAweDAyNTEsIDB4MDA2MiwgMHgwMDZGLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY0LCAweDAwNjUsIDB4MDI1OSwgMHgwMDY1LCAweDAwNjUsIDB4MDA2NSwgMHgwMDY1LCAweDAwNkEsIDB4MDA2NywgMHgwMDY3LCAweDAwNDcsCi0gICAgMHgwMDY4LCAweDAwNjgsIDB4MDA2OSwgMHgwMDQ5LCAweDAwNkMsIDB4MDA2QywgMHgwMDZDLCAweDAwNkQsIDB4MDA2RCwgMHgwMDZELCAweDAwNkUsIDB4MDA2RSwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MiwgMHgwMDcyLAotICAgIDB4MDA3MiwgMHgwMDcyLCAweDAwNzIsIDB4MDA3MiwgMHgwMDcyLCAweDAwNTIsIDB4MDA1MiwgMHgwMDczLCAweDAwNkEsIDB4MDI4MywgMHgwMjgzLCAweDAwNzQsIDB4MDA3NCwgMHgwMDU1LCAweDAwNzYsIDB4MDA3NiwKLSAgICAweDAwNzcsIDB4MDA3OSwgMHgwMDU5LCAweDAwN0EsIDB4MDA3QSwgMHgwMjkyLCAweDAwNDMsIDB4MDA0MiwgMHgwMDY1LCAweDAwNDcsIDB4MDA0OCwgMHgwMDZBLCAweDAwNkIsIDB4MDA0QywgMHgwMDcxLCAweDAwNjgsCi0gICAgMHgwMDY4LCAweDAwNjgsIDB4MDA2OCwgMHgwMDZBLCAweDAwNzIsIDB4MDI3OSwgMHgwMjdCLCAweDAyODEsIDB4MDA3NywgMHgwMDc5LCAweDAyNjMsIDB4MDA2QywgMHgwMDczLCAweDAwNzgsIDB4MDI5NSwgMHgwMzAwLAotICAgIDB4MDMwMSwgMHgwMzEzLCAweDAzMDgsIDB4MDA2MSwgMHgwMDY1LCAweDAwNjksIDB4MDA2RiwgMHgwMDc1LCAweDAwNjMsIDB4MDA2NCwgMHgwMDY4LCAweDAwNkQsIDB4MDA3MiwgMHgwMDc0LCAweDAwNzYsIDB4MDA3OCwKLSAgICAweDAyQjksIDB4MDAzQiwgMHgwMDIwLCAweDAwQTgsIDB4MDM5MSwgMHgwMEI3LCAweDAzOTUsIDB4MDM5NywgMHgwMzk5LCAweDAzOUYsIDB4MDNBNSwgMHgwM0E5LCAweDAzQ0EsIDB4MDM5OSwgMHgwM0E1LCAweDAzQjEsCi0gICAgMHgwM0I1LCAweDAzQjcsIDB4MDNCOSwgMHgwM0NCLCAweDAzQjksIDB4MDNDNSwgMHgwM0JGLCAweDAzQzUsIDB4MDNDOSwgMHgwM0IyLCAweDAzQjgsIDB4MDNBNSwgMHgwM0QyLCAweDAzRDIsIDB4MDNDNiwgMHgwM0MwLAotICAgIDB4MDNCQSwgMHgwM0MxLCAweDAzQzIsIDB4MDM5OCwgMHgwM0I1LCAweDAzQTMsIDB4MDQxNSwgMHgwNDE1LCAweDA0MTMsIDB4MDQwNiwgMHgwNDFBLCAweDA0MTgsIDB4MDQyMywgMHgwNDE4LCAweDA0MzgsIDB4MDQzNSwKLSAgICAweDA0MzUsIDB4MDQzMywgMHgwNDU2LCAweDA0M0EsIDB4MDQzOCwgMHgwNDQzLCAweDA0NjYsIDB4MDQ2NywgMHgwNDZBLCAweDA0NkIsIDB4MDQ3NCwgMHgwNDc1LCAweDA0NjAsIDB4MDQ2MSwgMHgwNDE5LCAweDA0MzksCi0gICAgMHgwNDIwLCAweDA0NDAsIDB4MDQxMywgMHgwNDMzLCAweDA0MTMsIDB4MDQzMywgMHgwNDEzLCAweDA0MzMsIDB4MDQxNiwgMHgwNDM2LCAweDA0MTcsIDB4MDQzNywgMHgwNDFBLCAweDA0M0EsIDB4MDQxQSwgMHgwNDNBLAotICAgIDB4MDQxQSwgMHgwNDNBLCAweDA0MUEsIDB4MDQzQSwgMHgwNDFELCAweDA0M0QsIDB4MDQxRiwgMHgwNDNGLCAweDA0MjEsIDB4MDQ0MSwgMHgwNDIyLCAweDA0NDIsIDB4MDRBRSwgMHgwNEFGLCAweDA0MjUsIDB4MDQ0NSwKLSAgICAweDA0MjcsIDB4MDQ0NywgMHgwNDI3LCAweDA0NDcsIDB4MDQxNiwgMHgwNDM2LCAweDA0QkMsIDB4MDRCRCwgMHgwNDE2LCAweDA0MzYsIDB4MDQxQSwgMHgwNDNBLCAweDA0MUIsIDB4MDQzQiwgMHgwNDFELCAweDA0M0QsCi0gICAgMHgwNDFELCAweDA0M0QsIDB4MDQxQywgMHgwNDNDLCAweDA0MTAsIDB4MDQzMCwgMHgwNDEwLCAweDA0MzAsIDB4MDQxNSwgMHgwNDM1LCAweDA0RDgsIDB4MDREOSwgMHgwNDE2LCAweDA0MzYsIDB4MDQxNywgMHgwNDM3LAotICAgIDB4MDQxOCwgMHgwNDM4LCAweDA0MTgsIDB4MDQzOCwgMHgwNDFFLCAweDA0M0UsIDB4MDRFOCwgMHgwNEU5LCAweDA0MkQsIDB4MDQ0RCwgMHgwNDIzLCAweDA0NDMsIDB4MDQyMywgMHgwNDQzLCAweDA0MjMsIDB4MDQ0MywKLSAgICAweDA0MjcsIDB4MDQ0NywgMHgwNDEzLCAweDA0MzMsIDB4MDQyQiwgMHgwNDRCLCAweDA0MTMsIDB4MDQzMywgMHgwNDI1LCAweDA0NDUsIDB4MDQyNSwgMHgwNDQ1LCAweDA0MTcsIDB4MDQzNywgMHgwNDFCLCAweDA0M0IsCi0gICAgMHgwRjBCLCAweDEwREMsIDB4MDA0MSwgMHgwMEM2LCAweDAwNDIsIDB4MDA0MiwgMHgwMDQ0LCAweDAwNDUsIDB4MDE4RSwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELAotICAgIDB4MDA0RSwgMHgwMDRGLCAweDAyMjIsIDB4MDA1MCwgMHgwMDUyLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU3LCAweDAwNjEsIDB4MDI1MCwgMHgwMjUxLCAweDFEMDIsIDB4MDA2MiwgMHgwMDY0LCAweDAwNjUsIDB4MDI1OSwKLSAgICAweDAyNUIsIDB4MDI1QywgMHgwMDY3LCAweDAwNkIsIDB4MDA2RCwgMHgwMTRCLCAweDAwNkYsIDB4MDI1NCwgMHgxRDE2LCAweDFEMTcsIDB4MDA3MCwgMHgwMDc0LCAweDAwNzUsIDB4MUQxRCwgMHgwMjZGLCAweDAwNzYsCi0gICAgMHgxRDI1LCAweDAzQjIsIDB4MDNCMywgMHgwM0I0LCAweDAzQzYsIDB4MDNDNywgMHgwMDY5LCAweDAwNzIsIDB4MDA3NSwgMHgwMDc2LCAweDAzQjIsIDB4MDNCMywgMHgwM0MxLCAweDAzQzYsIDB4MDNDNywgMHgwMDYyLAotICAgIDB4MDA2NCwgMHgwMDY2LCAweDAwNkQsIDB4MDA2RSwgMHgwMDcwLCAweDAwNzIsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3QSwgMHgwMDY3LCAweDA0M0QsIDB4MDA0QywgMHgwMDcwLCAweDAwNTUsIDB4MDI4QSwKLSAgICAweDAwNjIsIDB4MDA2NCwgMHgwMDY2LCAweDAwNjcsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDcwLCAweDAwNzIsIDB4MDA3MywgMHgwMjgzLCAweDAwNzYsIDB4MDA3OCwgMHgwMDdBLCAweDAwNjEsCi0gICAgMHgwMjUxLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY1LCAweDAwNjUsIDB4MDA2NSwgMHgwMDY5LCAweDAyODMsIDB4MDI1MiwgMHgwMDYzLCAweDAyNTUsIDB4MDBGMCwgMHgwMjVDLCAweDAwNjYsIDB4MDI1RiwgMHgwMjYxLAotICAgIDB4MDI2NSwgMHgwMjY4LCAweDAyNjksIDB4MDI2QSwgMHgxRDdCLCAweDAyOUQsIDB4MDI2RCwgMHgxRDg1LCAweDAyOUYsIDB4MDI3MSwgMHgwMjcwLCAweDAyNzIsIDB4MDI3MywgMHgwMjc0LCAweDAyNzUsIDB4MDI3OCwKLSAgICAweDAyODIsIDB4MDI4MywgMHgwMUFCLCAweDAyODksIDB4MDI4QSwgMHgxRDFDLCAweDAyOEIsIDB4MDI4QywgMHgwMDdBLCAweDAyOTAsIDB4MDI5MSwgMHgwMjkyLCAweDAzQjgsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDIsCi0gICAgMHgwMDYyLCAweDAwNDIsIDB4MDA2MiwgMHgwMDQyLCAweDAwNjIsIDB4MDA0MywgMHgwMDYzLCAweDAwNDQsIDB4MDA2NCwgMHgwMDQ0LCAweDAwNjQsIDB4MDA0NCwgMHgwMDY0LCAweDAwNDQsIDB4MDA2NCwgMHgwMDQ0LAotICAgIDB4MDA2NCwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDIyOCwgMHgwMjI5LCAweDAwNDYsIDB4MDA2NiwgMHgwMDQ3LCAweDAwNjcsIDB4MDA0OCwKLSAgICAweDAwNjgsIDB4MDA0OCwgMHgwMDY4LCAweDAwNDgsIDB4MDA2OCwgMHgwMDQ4LCAweDAwNjgsIDB4MDA0OCwgMHgwMDY4LCAweDAwNDksIDB4MDA2OSwgMHgwMENGLCAweDAwRUYsIDB4MDA0QiwgMHgwMDZCLCAweDAwNEIsCi0gICAgMHgwMDZCLCAweDAwNEIsIDB4MDA2QiwgMHgwMDRDLCAweDAwNkMsIDB4MDA0QywgMHgwMDZDLCAweDAwNEMsIDB4MDA2QywgMHgwMDRDLCAweDAwNkMsIDB4MDA0RCwgMHgwMDZELCAweDAwNEQsIDB4MDA2RCwgMHgwMDRELAotICAgIDB4MDA2RCwgMHgwMDRFLCAweDAwNkUsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEUsIDB4MDA2RSwgMHgwMDRFLCAweDAwNkUsIDB4MDBENSwgMHgwMEY1LCAweDAwRDUsIDB4MDBGNSwgMHgwMTRDLCAweDAxNEQsIDB4MDE0QywKLSAgICAweDAxNEQsIDB4MDA1MCwgMHgwMDcwLCAweDAwNTAsIDB4MDA3MCwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTIsIDB4MDA3MiwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MywgMHgwMDczLCAweDAwNTMsCi0gICAgMHgwMDczLCAweDAwNTMsIDB4MDA3MywgMHgwMDUzLCAweDAwNzMsIDB4MDA1MywgMHgwMDczLCAweDAwNTQsIDB4MDA3NCwgMHgwMDU0LCAweDAwNzQsIDB4MDA1NCwgMHgwMDc0LCAweDAwNTQsIDB4MDA3NCwgMHgwMDU1LAotICAgIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAxNjgsIDB4MDE2OSwgMHgwMTZBLCAweDAxNkIsIDB4MDA1NiwgMHgwMDc2LCAweDAwNTYsIDB4MDA3NiwgMHgwMDU3LCAweDAwNzcsIDB4MDA1NywKLSAgICAweDAwNzcsIDB4MDA1NywgMHgwMDc3LCAweDAwNTcsIDB4MDA3NywgMHgwMDU3LCAweDAwNzcsIDB4MDA1OCwgMHgwMDc4LCAweDAwNTgsIDB4MDA3OCwgMHgwMDU5LCAweDAwNzksIDB4MDA1QSwgMHgwMDdBLCAweDAwNUEsCi0gICAgMHgwMDdBLCAweDAwNUEsIDB4MDA3QSwgMHgwMDY4LCAweDAwNzQsIDB4MDA3NywgMHgwMDc5LCAweDAwNjEsIDB4MDE3RiwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLAotICAgIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwKLSAgICAweDAwNjEsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsCi0gICAgMHgwMDY1LCAweDAwNDksIDB4MDA2OSwgMHgwMDQ5LCAweDAwNjksIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLAotICAgIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwKLSAgICAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU5LCAweDAwNzksIDB4MDA1OSwgMHgwMDc5LCAweDAwNTksCi0gICAgMHgwMDc5LCAweDAwNTksIDB4MDA3OSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLAotICAgIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDNCNSwgMHgwM0I1LCAweDAzQjUsIDB4MDNCNSwgMHgwM0I1LCAweDAzQjUsIDB4MDM5NSwgMHgwMzk1LCAweDAzOTUsIDB4MDM5NSwgMHgwMzk1LCAweDAzOTUsIDB4MDNCNywKLSAgICAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzQjksCi0gICAgMHgwM0I5LCAweDAzQjksIDB4MDNCOSwgMHgwM0I5LCAweDAzQjksIDB4MDNCOSwgMHgwM0I5LCAweDAzOTksIDB4MDM5OSwgMHgwMzk5LCAweDAzOTksIDB4MDM5OSwgMHgwMzk5LCAweDAzOTksIDB4MDM5OSwgMHgwM0JGLAotICAgIDB4MDNCRiwgMHgwM0JGLCAweDAzQkYsIDB4MDNCRiwgMHgwM0JGLCAweDAzOUYsIDB4MDM5RiwgMHgwMzlGLCAweDAzOUYsIDB4MDM5RiwgMHgwMzlGLCAweDAzQzUsIDB4MDNDNSwgMHgwM0M1LCAweDAzQzUsIDB4MDNDNSwKLSAgICAweDAzQzUsIDB4MDNDNSwgMHgwM0M1LCAweDAzQTUsIDB4MDNBNSwgMHgwM0E1LCAweDAzQTUsIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQTksCi0gICAgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAzQjEsIDB4MDNCMSwgMHgwM0I1LCAweDAzQjUsIDB4MDNCNywgMHgwM0I3LCAweDAzQjksIDB4MDNCOSwgMHgwM0JGLAotICAgIDB4MDNCRiwgMHgwM0M1LCAweDAzQzUsIDB4MDNDOSwgMHgwM0M5LCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwKLSAgICAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsCi0gICAgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQTksIDB4MDNBOSwgMHgwM0E5LAotICAgIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwKLSAgICAweDAzOTEsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzOTUsIDB4MDM5NSwgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwM0I5LCAweDAzQjksIDB4MDNCOSwgMHgwM0I5LCAweDAzQjksCi0gICAgMHgwM0I5LCAweDAzOTksIDB4MDM5OSwgMHgwMzk5LCAweDAzOTksIDB4MDNDNSwgMHgwM0M1LCAweDAzQzUsIDB4MDNDNSwgMHgwM0MxLCAweDAzQzEsIDB4MDNDNSwgMHgwM0M1LCAweDAzQTUsIDB4MDNBNSwgMHgwM0E1LAotICAgIDB4MDNBNSwgMHgwM0ExLCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwMzlGLCAweDAzOUYsIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksIDB4MDBCNCwgMHgwMzE0LCAweDAwMjAsIDB4MDAyMCwKLSAgICAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDIwMTAsIDB4MDMzMywgMHgwMDJFLCAweDAwMjAsIDB4MDAyMCwgMHgwMDMwLCAweDAwNjksCi0gICAgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDJCLCAweDIyMTIsIDB4MDAzRCwgMHgwMDI4LCAweDAwMjksIDB4MDA2RSwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAotICAgIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAyQiwgMHgyMjEyLCAweDAwM0QsIDB4MDAyOCwgMHgwMDI5LCAweDAwNjEsIDB4MDA2NSwgMHgwMDZGLCAweDAwNzgsIDB4MDI1OSwKLSAgICAweDAwNDMsIDB4MDE5MCwgMHgwMDY3LCAweDAwNDgsIDB4MDA0OCwgMHgwMDQ4LCAweDAwNjgsIDB4MDA2OCwgMHgwMDQ5LCAweDAwNDksIDB4MDA0QywgMHgwMDZDLCAweDAwNEUsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsCi0gICAgMHgwMDUyLCAweDAwNTIsIDB4MDA1MiwgMHgwMDUyLCAweDAwNTYsIDB4MDA1QSwgMHgwM0E5LCAweDAxQjEsIDB4MDA1QSwgMHgwMDRCLCAweDAwQzUsIDB4MDA0MiwgMHgwMDQzLCAweDAwNjUsIDB4MDA2NSwgMHgwMDQ1LAotICAgIDB4MDA0NiwgMHgwMDRELCAweDAwNkYsIDB4MDVEMCwgMHgwNUQxLCAweDA1RDIsIDB4MDVEMywgMHgwMDY5LCAweDAzQzAsIDB4MDNCMywgMHgwMzkzLCAweDAzQTAsIDB4MjIxMSwgMHgwMDQ0LCAweDAwNjQsIDB4MDA2NSwKLSAgICAweDAwNjksIDB4MDA2QSwgMHgwMDQ5LCAweDAwNTYsIDB4MDA1OCwgMHgwMDRDLCAweDAwNDMsIDB4MDA0NCwgMHgwMDRELCAweDAwNjksIDB4MDA3NiwgMHgwMDc4LCAweDAwNkMsIDB4MDA2MywgMHgwMDY0LCAweDAwNkQsCi0gICAgMHgyMjAzLCAweDIyMDgsIDB4MjIwQiwgMHgzMDA4LCAweDMwMDksIDB4MDA2MiwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDQxLAotICAgIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwKLSAgICAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCi0gICAgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAotICAgIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwKLSAgICAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksCi0gICAgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDRDLCAweDAwNkMsIDB4MDA0QywgMHgwMDUwLCAweDAwNTIsIDB4MDA2MSwgMHgwMDc0LAotICAgIDB4MDA0OCwgMHgwMDY4LCAweDAwNEIsIDB4MDA2QiwgMHgwMDVBLCAweDAwN0EsIDB4MDA3NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA3NiwgMHgwMDZBLCAweDAwNTYsIDB4MkQ2MSwgMHg2QkNELCAweDZDMTEsIDB4ODY0RSwKLSAgICAweDg5N0YsIDB4ODlEMiwgMHg5NTdGLCAweDk3NTIsIDB4OThERiwgMHg5QUE4LCAweDlCM0MsIDB4OUVBNiwgMHg5RUM0LCAweDlGOUYsIDB4NEUwMCwgMHg0RTI4LCAweDRFMzYsIDB4NEUzRiwgMHg0RTU5LCAweDRFODUsCi0gICAgMHg0RThDLCAweDRFQTAsIDB4NEVCQSwgMHg1MTNGLCAweDUxNjUsIDB4NTE2QiwgMHg1MTgyLCAweDUxOTYsIDB4NTFBQiwgMHg1MUUwLCAweDUxRjUsIDB4NTIwMCwgMHg1MjlCLCAweDUyRjksIDB4NTMxNSwgMHg1MzFBLAotICAgIDB4NTMzOCwgMHg1MzQxLCAweDUzNUMsIDB4NTM2OSwgMHg1MzgyLCAweDUzQjYsIDB4NTNDOCwgMHg1M0UzLCAweDU2RDcsIDB4NTcxRiwgMHg1OEVCLCAweDU5MDIsIDB4NTkwQSwgMHg1OTE1LCAweDU5MjcsIDB4NTk3MywKLSAgICAweDVCNTAsIDB4NUI4MCwgMHg1QkY4LCAweDVDMEYsIDB4NUMyMiwgMHg1QzM4LCAweDVDNkUsIDB4NUM3MSwgMHg1RERCLCAweDVERTUsIDB4NURGMSwgMHg1REZFLCAweDVFNzIsIDB4NUU3QSwgMHg1RTdGLCAweDVFRjQsCi0gICAgMHg1RUZFLCAweDVGMEIsIDB4NUYxMywgMHg1RjUwLCAweDVGNjEsIDB4NUY3MywgMHg1RkMzLCAweDYyMDgsIDB4NjIzNiwgMHg2MjRCLCAweDY1MkYsIDB4NjUzNCwgMHg2NTg3LCAweDY1OTcsIDB4NjVBNCwgMHg2NUI5LAotICAgIDB4NjVFMCwgMHg2NUU1LCAweDY2RjAsIDB4NjcwOCwgMHg2NzI4LCAweDZCMjAsIDB4NkI2MiwgMHg2Qjc5LCAweDZCQjMsIDB4NkJDQiwgMHg2QkQ0LCAweDZCREIsIDB4NkMwRiwgMHg2QzE0LCAweDZDMzQsIDB4NzA2QiwKLSAgICAweDcyMkEsIDB4NzIzNiwgMHg3MjNCLCAweDcyM0YsIDB4NzI0NywgMHg3MjU5LCAweDcyNUIsIDB4NzJBQywgMHg3Mzg0LCAweDczODksIDB4NzREQywgMHg3NEU2LCAweDc1MTgsIDB4NzUxRiwgMHg3NTI4LCAweDc1MzAsCi0gICAgMHg3NThCLCAweDc1OTIsIDB4NzY3NiwgMHg3NjdELCAweDc2QUUsIDB4NzZCRiwgMHg3NkVFLCAweDc3REIsIDB4NzdFMiwgMHg3N0YzLCAweDc5M0EsIDB4NzlCOCwgMHg3OUJFLCAweDdBNzQsIDB4N0FDQiwgMHg3QUY5LAotICAgIDB4N0M3MywgMHg3Q0Y4LCAweDdGMzYsIDB4N0Y1MSwgMHg3RjhBLCAweDdGQkQsIDB4ODAwMSwgMHg4MDBDLCAweDgwMTIsIDB4ODAzMywgMHg4MDdGLCAweDgwODksIDB4ODFFMywgMHg4MUVBLCAweDgxRjMsIDB4ODFGQywKLSAgICAweDgyMEMsIDB4ODIxQiwgMHg4MjFGLCAweDgyNkUsIDB4ODI3MiwgMHg4Mjc4LCAweDg2NEQsIDB4ODY2QiwgMHg4ODQwLCAweDg4NEMsIDB4ODg2MywgMHg4OTdFLCAweDg5OEIsIDB4ODlEMiwgMHg4QTAwLCAweDhDMzcsCi0gICAgMHg4QzQ2LCAweDhDNTUsIDB4OEM3OCwgMHg4QzlELCAweDhENjQsIDB4OEQ3MCwgMHg4REIzLCAweDhFQUIsIDB4OEVDQSwgMHg4RjlCLCAweDhGQjAsIDB4OEZCNSwgMHg5MDkxLCAweDkxNDksIDB4OTFDNiwgMHg5MUNDLAotICAgIDB4OTFEMSwgMHg5NTc3LCAweDk1ODAsIDB4OTYxQywgMHg5NkI2LCAweDk2QjksIDB4OTZFOCwgMHg5NzUxLCAweDk3NUUsIDB4OTc2MiwgMHg5NzY5LCAweDk3Q0IsIDB4OTdFRCwgMHg5N0YzLCAweDk4MDEsIDB4OThBOCwKLSAgICAweDk4REIsIDB4OThERiwgMHg5OTk2LCAweDk5OTksIDB4OTlBQywgMHg5QUE4LCAweDlBRDgsIDB4OUFERiwgMHg5QjI1LCAweDlCMkYsIDB4OUIzMiwgMHg5QjNDLCAweDlCNUEsIDB4OUNFNSwgMHg5RTc1LCAweDlFN0YsCi0gICAgMHg5RUE1LCAweDlFQkIsIDB4OUVDMywgMHg5RUNELCAweDlFRDEsIDB4OUVGOSwgMHg5RUZELCAweDlGMEUsIDB4OUYxMywgMHg5RjIwLCAweDlGM0IsIDB4OUY0QSwgMHg5RjUyLCAweDlGOEQsIDB4OUY5QywgMHg5RkEwLAotICAgIDB4MDAyMCwgMHgzMDEyLCAweDUzNDEsIDB4NTM0NCwgMHg1MzQ1LCAweDExMDAsIDB4MTEwMSwgMHgxMUFBLCAweDExMDIsIDB4MTFBQywgMHgxMUFELCAweDExMDMsIDB4MTEwNCwgMHgxMTA1LCAweDExQjAsIDB4MTFCMSwKLSAgICAweDExQjIsIDB4MTFCMywgMHgxMUI0LCAweDExQjUsIDB4MTExQSwgMHgxMTA2LCAweDExMDcsIDB4MTEwOCwgMHgxMTIxLCAweDExMDksIDB4MTEwQSwgMHgxMTBCLCAweDExMEMsIDB4MTEwRCwgMHgxMTBFLCAweDExMEYsCi0gICAgMHgxMTEwLCAweDExMTEsIDB4MTExMiwgMHgxMTYxLCAweDExNjIsIDB4MTE2MywgMHgxMTY0LCAweDExNjUsIDB4MTE2NiwgMHgxMTY3LCAweDExNjgsIDB4MTE2OSwgMHgxMTZBLCAweDExNkIsIDB4MTE2QywgMHgxMTZELAotICAgIDB4MTE2RSwgMHgxMTZGLCAweDExNzAsIDB4MTE3MSwgMHgxMTcyLCAweDExNzMsIDB4MTE3NCwgMHgxMTc1LCAweDExNjAsIDB4MTExNCwgMHgxMTE1LCAweDExQzcsIDB4MTFDOCwgMHgxMUNDLCAweDExQ0UsIDB4MTFEMywKLSAgICAweDExRDcsIDB4MTFEOSwgMHgxMTFDLCAweDExREQsIDB4MTFERiwgMHgxMTFELCAweDExMUUsIDB4MTEyMCwgMHgxMTIyLCAweDExMjMsIDB4MTEyNywgMHgxMTI5LCAweDExMkIsIDB4MTEyQywgMHgxMTJELCAweDExMkUsCi0gICAgMHgxMTJGLCAweDExMzIsIDB4MTEzNiwgMHgxMTQwLCAweDExNDcsIDB4MTE0QywgMHgxMUYxLCAweDExRjIsIDB4MTE1NywgMHgxMTU4LCAweDExNTksIDB4MTE4NCwgMHgxMTg1LCAweDExODgsIDB4MTE5MSwgMHgxMTkyLAotICAgIDB4MTE5NCwgMHgxMTlFLCAweDExQTEsIDB4NEUwMCwgMHg0RThDLCAweDRFMDksIDB4NTZEQiwgMHg0RTBBLCAweDRFMkQsIDB4NEUwQiwgMHg3NTMyLCAweDRFNTksIDB4NEUxOSwgMHg0RTAxLCAweDU5MjksIDB4NTczMCwKLSAgICAweDRFQkEsIDB4NTU0RiwgMHg1RTdDLCAweDY1ODcsIDB4N0I4RiwgMHgxMTAwLCAweDExMDIsIDB4MTEwMywgMHgxMTA1LCAweDExMDYsIDB4MTEwNywgMHgxMTA5LCAweDExMEIsIDB4MTEwQywgMHgxMTBFLCAweDExMEYsCi0gICAgMHgxMTEwLCAweDExMTEsIDB4MTExMiwgMHg0RTAwLCAweDRFOEMsIDB4NEUwOSwgMHg1NkRCLCAweDRFOTQsIDB4NTE2RCwgMHg0RTAzLCAweDUxNkIsIDB4NEU1RCwgMHg1MzQxLCAweDY3MDgsIDB4NzA2QiwgMHg2QzM0LAotICAgIDB4NjcyOCwgMHg5MUQxLCAweDU3MUYsIDB4NjVFNSwgMHg2ODJBLCAweDY3MDksIDB4NzkzRSwgMHg1NDBELCAweDcyNzksIDB4OENBMSwgMHg3OTVELCAweDUyQjQsIDB4NzlEOCwgMHg3NTM3LCAweDU5NzMsIDB4OTA2OSwKLSAgICAweDUxMkEsIDB4NTM3MCwgMHg2Q0U4LCAweDk4MDUsIDB4NEYxMSwgMHg1MTk5LCAweDZCNjMsIDB4NEUwQSwgMHg0RTJELCAweDRFMEIsIDB4NURFNiwgMHg1M0YzLCAweDUzM0IsIDB4NUI5NywgMHg1QjY2LCAweDc2RTMsCi0gICAgMHg0RjAxLCAweDhDQzcsIDB4NTM1NCwgMHg1OTFDLCAweDMwQTIsIDB4MzBBNCwgMHgzMEE2LCAweDMwQTgsIDB4MzBBQSwgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwgMHgzMEI3LAotICAgIDB4MzBCOSwgMHgzMEJCLCAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDIsIDB4MzBENSwKLSAgICAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFNCwgMHgzMEU2LCAweDMwRTgsIDB4MzBFOSwgMHgzMEVBLCAweDMwRUIsIDB4MzBFQywgMHgzMEVELCAweDMwRUYsCi0gICAgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHg0RTIyLCAweDVFNzYsIDB4NUU3QSwgMHg1RTcyLCAweDRFNzEsIDB4NEU5OCwgMHg0RTlBLCAweDRGMkIsIDB4NUUwMywgMHg1MzYwLCAweDY3NjUsIDB4NEZBMywgMHg0RkUzLAotICAgIDB4N0NGQiwgMHg0RkEwLCAweDRGMjUsIDB4NEZFOSwgMHg0RUQzLCAweDRFMkEsIDB4NEVFQywgMHg0RjI2LCAweDRGMUYsIDB4NEZBNywgMHg0RkE2LCAweDRGMkEsIDB4Njc3MCwgMHg0RjI3LCAweDRGMUUsIDB4NTkwNywKLSAgICAweDVCQjYsIDB4NEY2MywgMHg1MDZDLCAweDRGMjAsIDB4NEYxQiwgMHg1MDNBLCAweDRGMjQsIDB4NTAzRSwgMHg1MDdCLCAweDRFQzUsIDB4NEY2NSwgMHg0RkE4LCAweDRFQzYsIDB4NEZBNSwgMHg1MDdFLCAweDk2QzcsCi0gICAgMHg0RUY3LCAweDRFRUEsIDB4NEZBQywgMHg0RUJGLCAweDRGRUQsIDB4NTBBNywgMHg0RkU2LCAweDRGQUEsIDB4NUMzRCwgMHg1MDdGLCAweDRGMTgsIDB4NTBBOCwgMHg0RkVBLCAweDUwQTksIDB4NTBBNSwgMHg0RkU4LAotICAgIDB4NTFGNiwgMHg1MTUxLCAweDUxM0YsIDB4NTE1NiwgMHg1MTg1LCAweDRFMjQsIDB4NTE4QywgMHg4MEM0LCAweDUxOTksIDB4NUU0MiwgMHg1MUJCLCAweDUxREIsIDB4NTFFRiwgMHg1MjJCLCAweDUyMjAsIDB4NTIyRCwKLSAgICAweDUyMTksIDB4NTIzOSwgMHg1MjFBLCAweDUyNjUsIDB4NTI1MCwgMHg1MjQwLCAweDUyMUIsIDB4NTIyQywgMHg1MjEyLCAweDUyNjcsIDB4NTIxOCwgMHg1MjNELCAweDUyM0YsIDB4NTI1MSwgMHg1MjQyLCAweDUyQjIsCi0gICAgMHg1MkE4LCAweDUyRDYsIDB4NTJBMSwgMHg4MERDLCAweDUyQjMsIDB4NTJCRiwgMHg1MkEyLCAweDUyQ0IsIDB4NTJCMSwgMHg1MjlELCAweDUzMDAsIDB4NTMyNiwgMHg2QzQ3LCAweDUzMkUsIDB4NTMzQSwgMHg1MzRGLAotICAgIDB4NjA2NCwgMHg1Mzc0LCAweDUzOEQsIDB4NTM4QywgMHg1Mzg5LCAweDUzQTMsIDB4NTNDMiwgMHg0RTFCLCAweDU0QTQsIDB4NTQzNCwgMHg1NDUwLCAweDU0MTUsIDB4NTQ1OCwgMHg1NUIxLCAweDU0NTcsIDB4NUZGNSwKLSAgICAweDk1RUUsIDB4NTREMSwgMHg1NDJGLCAweDU1MjQsIDB4NEUyNywgMHg0RTU0LCAweDUzNTUsIDB4NTRERiwgMHg1NDVCLCAweDU1NkMsIDB4NTUxRCwgMHg1NDE3LCAweDU0NUMsIDB4NTUyMiwgMHg1NEQ0LCAweDUzRjksCi0gICAgMHg1NUJELCAweDU0NTUsIDB4NTU2NywgMHg1QzFELCAweDU1MUIsIDB4NTRENywgMHg1NTIwLCAweDU1NzgsIDB4NTNGRCwgMHg1NEQzLCAweDU0NTIsIDB4NTU3NCwgMHg2MDc2LCAweDU2MTgsIDB4NTQ5RCwgMHg1NEQyLAotICAgIDB4NTRERCwgMHg1NEQ1LCAweDU1RjMsIDB4NTREOSwgMHg1NUI3LCAweDU0MjgsIDB4NTQ5QiwgMHg1NDEzLCAweDU0REMsIDB4NUMxRCwgMHg1NjVDLCAweDU1NkUsIDB4NTQ1NiwgMHg1NDk5LCAweDRFQjgsIDB4NTVCRSwKLSAgICAweDRFMjUsIDB4NTYyNCwgMHg1NTZELCAweDU1RUIsIDB4NTZBMywgMHg1MTgxLCAweDU0NTMsIDB4NTU3MCwgMHg1NjMxLCAweDU2RjEsIDB4NTZGNSwgMHg1NkZELCAweDU2RjQsIDB4NTZFRCwgMHg1NzA2LCAweDU2RkUsCi0gICAgMHg1NkUyLCAweDU3QUQsIDB4NjI2NywgMHg1NzVBLCAweDU3QTksIDB4NTdEQSwgMHg1QzI3LCAweDYyQTUsIDB4NTczQSwgMHg1NzU3LCAweDgzMTQsIDB4NTdCMiwgMHg1N0Q4LCAweDZEODIsIDB4NTFBMiwgMHg1NzVFLAotICAgIDB4NTdEOSwgMHg1QzE4LCAweDU4MTEsIDB4NTdBQiwgMHg1NzYwLCAweDU4MTUsIDB4NTc1RiwgMHg1N0E2LCAweDU3NUIsIDB4NTM4QiwgMHg1NzkyLCAweDU3MzksIDB4NTc4NiwgMHg1NzRGLCAweDU3ODUsIDB4NTc1QywKLSAgICAweDU3NUQsIDB4NThFRSwgMHg1OEY2LCAweDU4RjgsIDB4NUJGRiwgMHg1OTFGLCAweDY4QTYsIDB4NEYxOSwgMHg1OTM5LCAweDU5NDIsIDB4NTk2NSwgMHg1OTQxLCAweDU5M0EsIDB4NTk0QiwgMHg1OUY5LCAweDU5ODYsCi0gICAgMHg1OUQ3LCAweDU5NzgsIDB4NUEzMSwgMHg1QTA0LCAweDU5ODcsIDB4NUEwNSwgMHg1QTMyLCAweDU5QUIsIDB4NUFBQSwgMHg1OTg4LCAweDU5QUEsIDB4NTlBOSwgMHg1QTM0LCAweDVBNzMsIDB4NUEwNiwgMHg1QTc1LAotICAgIDB4NUEwNywgMHg1QUYxLCAweDVBRDIsIDB4NUIzNywgMHg1QUQ0LCAweDVBNzQsIDB4NUE3NiwgMHg1QTA4LCAweDVCNTksIDB4NUI2NiwgMHg1QjZBLCAweDVCQUIsIDB4NUJERCwgMHg1QjlFLCAweDVCODEsIDB4NUJBMSwKLSAgICAweDUxOTksIDB4NUJCRCwgMHg1QkEwLCAweDVCOUQsIDB4NUMwNiwgMHg0RTEzLCAweDVCRkIsIDB4NUJGOSwgMHg1QkZDLCAweDVDMzQsIDB4NUM0QSwgMHg1QzM4LCAweDVDNDksIDB4NUM2MSwgMHg1QzQyLCAweDVDNUYsCi0gICAgMHg1QzY2LCAweDVDNUUsIDB4NTE4OCwgMHg1Qzk4LCAweDVDOUIsIDB4NUNFMSwgMHg1RDAzLCAweDVDOTcsIDB4NEVEMSwgMHg1Q0U1LCAweDVDOUEsIDB4NUQ1RCwgMHg1RDJELCAweDVDOTYsIDB4NUQ1QSwgMHg1RDAyLAotICAgIDB4NUNFNCwgMHg1Q0UzLCAweDVDQzQsIDB4NUQwNCwgMHg1Qzk5LCAweDVENTgsIDB4NUNBRCwgMHg1QzdGLCAweDVDQjMsIDB4NUNCRiwgMHg1Q0U2LCAweDVEQzUsIDB4NURFRiwgMHg1RTA1LCAweDVFMDgsIDB4NUUxMCwKLSAgICAweDVFMjYsIDB4NUUyNywgMHg1RTBGLCAweDVFM0MsIDB4NUUzQiwgMHg1RTFDLCAweDVFMDEsIDB4NUUyRSwgMHg1RTMxLCAweDVFNzIsIDB4NTFFMCwgMHg1RTkzLCAweDUzOTUsIDB4NTNBMiwgMHg1M0E2LCAweDUzQTgsCi0gICAgMHg1M0FFLCAweDVFOTksIDB4NTM4MiwgMHg1RTkxLCAweDVFOUYsIDB4NUU3RiwgMHg1RUVBLCAweDVFOTAsIDB4NTM4NSwgMHg1RjExLCAweDVGMkEsIDB4NUYyMCwgMHg1RjNBLCAweDVGMzksIDB4NUYyNSwgMHg1RjJGLAotICAgIDB4NUY2NiwgMHg1NDBFLCAweDVGODQsIDB4NEVDRSwgMHg1Rjk1LCAweDU5MEQsIDB4NUY4MSwgMHg1RjdCLCAweDYwNTIsIDB4ODAzQiwgMHg2MEE2LCAweDYwMDUsIDB4OTVGNywgMHg2MDc2LCAweDYwN0MsIDB4NjA3RCwKLSAgICAweDYwN0IsIDB4NzIzMSwgMHg2MEVDLCAweDYwQUIsIDB4NjAwNiwgMHg2MDdBLCAweDVGRkUsIDB4NjAwMSwgMHg2MTIwLCAweDYwRTgsIDB4NjBFRCwgMHg2MDc4LCAweDYwRUYsIDB4NjAwNCwgMHg2MDAyLCAweDg2NTEsCi0gICAgMHg2MEFELCAweDVFODYsIDB4NUZFNywgMHg2MEVCLCAweDYwMUMsIDB4NTFFRCwgMHg2MTI2LCAweDYxNkQsIDB4NjBFRSwgMHg2MTI0LCAweDYwQUYsIDB4NjAwMywgMHg1QkFBLCAweDVGQzYsIDB4NjA3MywgMHg1RTk0LAotICAgIDB4NjAzRiwgMHg2MUQ0LCAweDYwM0MsIDB4NjFEMSwgMHg2MDc5LCAweDYwRTksIDB4NjFEMiwgMHg2MDAwLCAweDYwQUMsIDB4NUZDRiwgMHg2MEU3LCAweDYxNTEsIDB4NjA0QiwgMHg2MjA2LCAweDYyMEIsIDB4NjIxNywKLSAgICAweDYyMkMsIDB4NjIxOCwgMHg2MjBGLCAweDYyMzcsIDB4NjI5QiwgMHg2MzFGLCAweDgyMEQsIDB4NjI2QSwgMHg1Mzc3LCAweDYyNkIsIDB4NjJBMSwgMHg2MzIzLCAweDYzMDIsIDB4OTFDNywgMHg2MkUzLCAweDYyNkMsCi0gICAgMHg2MzYyLCAweDYzMjUsIDB4NjM1RiwgMHg2NDQ3LCAweDYzNjMsIDB4NjJBMiwgMHg2M0I0LCAweDYzQkMsIDB4NjQwMiwgMHg2MzFBLCAweDYyQTAsIDB4NjI5RiwgMHg2M0JBLCAweDYzNUUsIDB4NjQ5MSwgMHg2MzIwLAotICAgIDB4NjMyMiwgMHg2M0I4LCAweDYyRTgsIDB4NjI5QSwgMHg2MjUxLCAweDYzRkYsIDB4NjMxRSwgMHg2MzFELCAweDYzNjEsIDB4NjJFNSwgMHg2M0IzLCAweDYyRTksIDB4NTFGQiwgMHg2MzIxLCAweDYyQzUsIDB4NjM2RSwKLSAgICAweDYzMjQsIDB4NjJERiwgMHg2NDQ4LCAweDYyRTcsIDB4NjQwMSwgMHg2M0I3LCAweDYyNjksIDB4NjRCNywgMHg2NDQ2LCAweDY0REUsIDB4NjRCOCwgMHg2MjcwLCAweDY0NDUsIDB4NjRCNSwgMHg2MkUyLCAweDYyRTYsCi0gICAgMHg2NDg0LCAweDY0MDAsIDB4NjRCQSwgMHg2NDNBLCAweDY0NDQsIDB4NjUxMiwgMHg2MzFCLCAweDY0NEEsIDB4NjQwNSwgMHg2M0ZELCAweDY2OEIsIDB4OEQyNSwgMHg1M0Q5LCAweDY1NEMsIDB4NjU3MCwgMHg2NTVCLAotICAgIDB4NkJEOSwgMHg2NTkzLCAweDY1QTksIDB4NjVBRCwgMHg0RThFLCAweDUzNDcsIDB4NjVGNiwgMHg2NjRCLCAweDY2M0MsIDB4NjY1NSwgMHg2NjU2LCAweDY1RjgsIDB4NzU0NSwgMHg2NjgyLCAweDY2MzUsIDB4NjY1NCwKLSAgICAweDUzODYsIDB4NjYxOSwgMHg2NjUzLCAweDY2QTcsIDB4NjVGNywgMHg2NjNELCAweDY2NTIsIDB4NEU2NiwgMHg0RjFBLCAweDgwRTcsIDB4NEUxQywgMHg2ODA1LCAweDY3NDYsIDB4NjgwMCwgMHg2N0E3LCAweDY3NjEsCi0gICAgMHg2N0FELCAweDVGMDMsIDB4NjdBOCwgMHg2N0EzLCAweDY4MEIsIDB4NjgwOCwgMHg2ODE2LCAweDY4NjAsIDB4Njc2OCwgMHg2N0FCLCAweDY4NjIsIDB4NEUxQSwgMHg2NzgxLCAweDY3NjksIDB4ODM2MywgMHg2ODY0LAotICAgIDB4Njc4NCwgMHg2N0FBLCAweDY3NjAsIDB4NjhCRiwgMHg2OTIwLCAweDY5MDEsIDB4Njg2OCwgMHg2ODY5LCAweDRFNTAsIDB4Njc5RSwgMHg2OTdDLCAweDY4MDcsIDB4NjdBMiwgMHg2ODM3LCAweDY3MzQsIDB4NjgxMSwKLSAgICAweDY4NjYsIDB4Njg2MSwgMHg2ODY1LCAweDY3M0EsIDB4NjkyRCwgMHg2QTJBLCAweDZBQTksIDB4NjlEQywgMHg2N0ZELCAweDY4NjMsIDB4Njg2NywgMHg2OURBLCAweDY4QzAsIDB4NkEyRiwgMHg2OEJDLCAweDUzRjAsCi0gICAgMHg2OURGLCAweDY3RTAsIDB4NjlEQiwgMHg4MkQ4LCAweDY3REMsIDB4NkE3OSwgMHg2OTg4LCAweDY4MDksIDB4NjkxRiwgMHg2QTdDLCAweDY4MEUsIDB4NkE3MSwgMHg2OUUwLCAweDY4MEMsIDB4NjdBNSwgMHg2QTY1LAotICAgIDB4Njk4NywgMHg2ODBBLCAweDY5ODksIDB4NjhDMiwgMHg2QTMxLCAweDY4MEYsIDB4Njc0MywgMHg2OTI0LCAweDY4M0UsIDB4Njk4NCwgMHg5NEE2LCAweDZCMjcsIDB4NkIyNCwgMHg2QjIyLCAweDVDODEsIDB4NTM4NiwKLSAgICAweDVGNTIsIDB4NkI4MSwgMHg2QjhCLCAweDZCOTIsIDB4NkI4NywgMHg2QjlBLCAweDZCOTMsIDB4NkJBMSwgMHg2QjdDLCAweDY3NDAsIDB4NThGMywgMHg2QkMxLCAweDZCQjQsIDB4NkJGNSwgMHg2QkUxLCAweDZDMDcsCi0gICAgMHg2QzE0LCAweDZDMjIsIDB4NkMyOSwgMHg2QzMyLCAweDUxRkMsIDB4NTFCMywgMHg1MUIxLCAweDZDQTEsIDB4NTFCNSwgMHg2Q0M0LCAweDZDNzksIDB4NkQ0MywgMHg2Q0ZFLCAweDUxQzksIDB4NTFDNCwgMHg2Q0VBLAotICAgIDB4NkUwQywgMHg1MUMwLCAweDZDQTYsIDB4NkUwQSwgMHg2RDlFLCAweDZENDUsIDB4NkRBMywgMHg1MUNGLCAweDZDQTgsIDB4NkRBMSwgMHg2RDRCLCAweDZENTEsIDB4NTFEMSwgMHg2RDQ4LCAweDZEOEMsIDB4NkQwNywKLSAgICAweDZDNjQsIDB4NkNBOSwgMHg1MUM2LCAweDZDOUYsIDB4NkUyOSwgMHg2REEyLCAweDZFN0YsIDB4NkNBNywgMHg3MDZELCAweDZEQTQsIDB4ODM2NSwgMHg2Q0FBLCAweDZFREUsIDB4NkUxNywgMHg2RDUyLCAweDZENTAsCi0gICAgMHg2RURBLCAweDZFRTEsIDB4NkUxNCwgMHg2RTg3LCAweDZDQTQsIDB4NkM0OSwgMHg2RDlGLCAweDZFMEQsIDB4NkRBOCwgMHg2RTEwLCAweDZENDYsIDB4OTg4RCwgMHg2Q0ZDLCAweDZEMDEsIDB4NkY1QywgMHg2REE2LAotICAgIDB4NkQ1NCwgMHg2RTgzLCAweDZEQTAsIDB4NkRBOSwgMHg2RDQ3LCAweDZEOUQsIDB4NkM4NCwgMHg2REE3LCAweDZFMTEsIDB4NkNGRCwgMHg2RUVBLCAweDZDRjYsIDB4NkQ0RCwgMHg2RDRBLCAweDZENTMsIDB4NkU3RiwKLSAgICAweDZDREUsIDB4NkQ0RSwgMHg2RDlCLCAweDZFRTUsIDB4NkY0RCwgMHg2RUU4LCAweDZFODUsIDB4NkNGQSwgMHg2RUU0LCAweDZFRTIsIDB4NkUwRSwgMHg2Q0ZCLCAweDZENEYsIDB4NkZEMiwgMHg2Q0Y4LCAweDZDQTUsCi0gICAgMHg2RjQ3LCAweDZGNDYsIDB4NkY3NCwgMHg2Q0Y3LCAweDZGRDEsIDB4NkY0QiwgMHg2RjlDLCAweDZDQTMsIDB4NkVFMCwgMHg2RDEyLCAweDZFRTksIDB4NzA0RiwgMHg2RTdFLCAweDZFRTYsIDB4NkVERiwgMHg3MDdFLAotICAgIDB4NEUzQSwgMHg0RTRDLCAweDcwQzMsIDB4NjVFMCwgMHg3MEJDLCAweDcwOUMsIDB4NzBERiwgMHg4MzE1LCAweDcxMTUsIDB4NzBFNiwgMHg3MDgwLCAweDgzNjcsIDB4NzA5RCwgMHg3MEVELCAweDcwQkQsIDB4NzBFOCwKLSAgICAweDcwNkYsIDB4NzA5NiwgMHg3MEU3LCAweDcwRUIsIDB4NzExNiwgMHg4NDI1LCAweDcwN0YsIDB4NzBEQiwgMHg3MEU5LCAweDcwRUMsIDB4NzExOCwgMHg3MEMxLCAweDcwODksIDB4NzBDMiwgMHg0RTg5LCAweDRFM0EsCi0gICAgMHg3MjM3LCAweDVDMTQsIDB4NTg5OSwgMHg3MjRELCAweDcyNzUsIDB4ODM2NiwgMHg3MjY2LCAweDcyOEEsIDB4NzI3QSwgMHg3MkI2LCAweDcyRUQsIDB4NzJDOCwgMHg3MkYwLCAweDcyQjksIDB4NzJGMiwgMHg3MkI4LAotICAgIDB4NzJGMSwgMHg3MkVFLCAweDU5NTYsIDB4NzJFQywgMHg3MkVGLCAweDczMDMsIDB4NzJERSwgMHg4M0I3LCAweDczMEUsIDB4NzJCNywgMHg1MTdELCAweDczNkQsIDB4NzMyRSwgMHg3MzE1LCAweDczMjEsIDB4NzNCMCwKLSAgICAweDczRDAsIDB4NzNGMiwgMHg3M0FFLCAweDczOUEsIDB4NzQxMCwgMHg3NDc2LCAweDgzQjksIDB4NzM5QiwgMHg3NDA1LCAweDczQjEsIDB4NzQwRiwgMHg3NDBFLCAweDczOTEsIDB4NzQ3NywgMHg3M0YwLCAweDczQUYsCi0gICAgMHg3Mzk5LCAweDczQkEsIDB4NzQzQywgMHg3M0QxLCAweDc0OEUsIDB4NzREMiwgMHg3NEVGLCAweDc0RUUsIDB4NEVBNywgMHg0RUE3LCAweDRFQTksIDB4NkJENSwgMHg3NTNCLCAweDc1NzIsIDB4NUYwMiwgMHg1RjUzLAotICAgIDB4NzU3NCwgMHg1M0UwLCAweDc1QzksIDB4OTE3OCwgMHg3NUY5LCAweDc1RDYsIDB4NzVBRiwgMHg3NUExLCAweDc1RUEsIDB4NzYxNywgMHg3NUFFLCAweDc1OUYsIDB4NzVBRCwgMHg3NjE4LCAweDc1OTcsIDB4NzVFOCwKLSAgICAweDc1RUIsIDB4NzYwNSwgMHg3NUEwLCAweDc2MkEsIDB4NzVEMiwgMHg3NTk2LCAweDc1QUMsIDB4NzY1RSwgMHg3NjYzLCAweDc2M0YsIDB4NzYzRSwgMHg3NUM4LCAweDc2MkIsIDB4NzY2QiwgMHg1M0QxLCAweDc2OTEsCi0gICAgMHg3NUIxLCAweDc2QjIsIDB4NzZCMSwgMHg2NzZGLCAweDc2RDcsIDB4NzZDRiwgMHg1QzNELCAweDc2RDEsIDB4NzZEOCwgMHg1MzYyLCAweDgzNjEsIDB4NzcyNiwgMHg0RjE3LCAweDU2RjAsIDB4Nzc0MSwgMHg3NzUwLAotICAgIDB4NzcyRiwgMHg3NzkyLCAweDRFODYsIDB4Nzc4NiwgMHg3NzUxLCAweDc3MkMsIDB4NzdBOSwgMHg3N0VCLCAweDc4NDUsIDB4NzBBRSwgMHg3ODQxLCAweDc4NTYsIDB4NzgxNywgMHg3ODFBLCAweDc4NTUsIDB4NzgwMCwKLSAgICAweDc4NkUsIDB4NzgwMSwgMHg3ODU5LCAweDc4MTYsIDB4Nzg5QywgMHg3ODlCLCAweDc3RjYsIDB4Nzg1NywgMHg3ODVBLCAweDc4NDAsIDB4Nzg4RCwgMHg3N0ZGLCAweDc4M0EsIDB4NzgzRSwgMHg3N0ZFLCAweDc4M0IsCi0gICAgMHg3OTg0LCAweDc5NzgsIDB4Nzk2RiwgMHg3OTRFLCAweDVGQTEsIDB4Nzk4NSwgMHg3OTNDLCAweDc5NzcsIDB4NzlDMywgMHg3QzdDLCAweDdBMEUsIDB4NzlDNiwgMHg2OEYxLCAweDc5Q0QsIDB4NzlGMCwgMHg3QTIzLAotICAgIDB4NzlFRiwgMHg5ODk2LCAweDc5RkUsIDB4N0E1MSwgMHg3OUZELCAweDdBMzMsIDB4N0E5RCwgMHg2RDNDLCAweDdBNzcsIDB4N0E5MSwgMHg3QThFLCAweDdBQUQsIDB4N0FBNSwgMHg3QTlDLCAweDdBOEQsIDB4N0FBNiwKLSAgICAweDdBODMsIDB4N0FERSwgMHg3QjE0LCAweDdCMEIsIDB4N0IxNSwgMHg3QjNBLCAweDdCNUQsIDB4ODI4MiwgMHg4MzAzLCAweDdCNTEsIDB4N0JBNywgMHg3QjdDLCAweDdCMDMsIDB4N0I1QiwgMHg3QjVBLCAweDdCQTYsCi0gICAgMHg3QkQzLCAweDdCQUEsIDB4N0I4MCwgMHg3QkQxLCAweDdCQUIsIDB4NkE5MCwgMHg3QjVDLCAweDdCN0UsIDB4NUUxOCwgMHg3QkVFLCAweDdCNzksIDB4N0I5MywgMHg3QkVGLCAweDdCQTgsIDB4N0M0MSwgMHg3QjNDLAotICAgIDB4N0I3RSwgMHg3QjNFLCAweDdCRjEsIDB4N0JBOSwgMHg1NDAxLCAweDU5ODYsIDB4N0NBNCwgMHg3Q0MxLCAweDdDQUEsIDB4N0NBRSwgMHg3Q0Y1LCAweDdDOUQsIDB4N0M3NCwgMHg3QzlDLCAweDdFQTAsIDB4N0VBQSwKLSAgICAweDdFQTMsIDB4N0VBNiwgMHg3RUEyLCAweDdFQTEsIDB4N0VBNSwgMHg3RUE4LCAweDdFQUIsIDB4N0VCOSwgMHg3RUIzLCAweDdFQkQsIDB4N0VCRSwgMHg3RUFGLCAweDdFQjAsIDB4N0VCMSwgMHg3RUI4LCAweDdFQTcsCi0gICAgMHg3RUI3LCAweDdFQUQsIDB4N0VCNCwgMHg3RUJBLCAweDYyNEUsIDB4NjI0RSwgMHg3RUM2LCAweDdFQzIsIDB4N0VDMSwgMHg3RUM1LCAweDdFQkIsIDB4N0VDRCwgMHg3RUMwLCAweDdFQ0IsIDB4N0VEMCwgMHg3RUNDLAotICAgIDB4N0VDOCwgMHg1RjI2LCAweDdFQzQsIDB4N0VDQSwgMHg3RUQ3LCAweDdFRDMsIDB4N0VERCwgMHg3RUU2LCAweDdFRDQsIDB4N0VERSwgMHg3RURDLCAweDdFREEsIDB4N0VEOSwgMHg3RUQyLCAweDdFRDYsIDB4N0VERiwKLSAgICAweDRFMUQsIDB4N0VEQiwgMHg3RUUyLCAweDdFRDEsIDB4N0VFMSwgMHg3RUUwLCAweDdFRTgsIDB4N0VFNSwgMHg3RUNGLCAweDdFRkMsIDB4N0YwRCwgMHg3RUZGLCAweDdFRjgsIDB4N0VGQiwgMHg3RUY2LCAweDdFRjQsCi0gICAgMHg3RUZFLCAweDdFQjIsIDB4N0Y1MSwgMHg3RjAwLCAweDdFQjYsIDB4N0VGQSwgMHg3RUVFLCAweDdFRkQsIDB4N0VGMCwgMHg3RUVCLCAweDdFRjUsIDB4N0VGMiwgMHg3RjAxLCAweDdEMjcsIDB4N0VFRiwgMHg3RUVBLAotICAgIDB4N0YwMywgMHg3RjA0LCAweDdGMDIsIDB4N0VCRiwgMHg3RjA5LCAweDdGMEUsIDB4N0YxNCwgMHg3RjE3LCAweDdGMTgsIDB4N0YwQywgMHg3RjE2LCAweDdGMTMsIDB4N0YwNSwgMHg3RUFDLCAweDdGMTEsIDB4N0YwOCwKLSAgICAweDdFQzMsIDB4N0YwRiwgMHg3RjA3LCAweDgxRjQsIDB4ODQyNiwgMHg3RjE5LCAweDdGMjIsIDB4N0YxMiwgMHg3RUM5LCAweDdGMjMsIDB4N0YxRSwgMHg3RjFBLCAweDdGMUMsIDB4N0YxRiwgMHg3RjFCLCAweDUzQkYsCi0gICAgMHg3RjFELCAweDdGMjksIDB4N0VCNSwgMHg3RjI3LCAweDdGMjYsIDB4N0Q3NywgMHg3RjE1LCAweDdGMjUsIDB4NjAzQiwgMHg3RUU5LCAweDdFRjcsIDB4N0YyQiwgMHg3RjJBLCAweDdGMkYsIDB4N0VDNywgMHg3RjJFLAotICAgIDB4N0YyRCwgMHg3RUQ1LCAweDdFRTMsIDB4N0YwQiwgMHg3RUYzLCAweDdFRDgsIDB4N0NGQiwgMHg4MzI3LCAweDdGMzMsIDB4N0YzMiwgMHg3RjM0LCAweDdFQ0UsIDB4N0VFNywgMHg3RjI0LCAweDdGMzEsIDB4N0YyQywKLSAgICAweDdFQTksIDB4N0VFRCwgMHg3RjIwLCAweDdGMjgsIDB4N0VBNCwgMHg3RjM1LCAweDdGMDYsIDB4OTRCNSwgMHg3RjQyLCAweDdGNUEsIDB4OUE4MiwgMHg3RjYyLCAweDdGNTcsIDB4N0Y3NCwgMHg3RjgxLCAweDgyODgsCi0gICAgMHg3RjlGLCAweDdGQTEsIDB4NEU0OSwgMHg4MUJCLCAweDRFNjAsIDB4N0ZDNiwgMHg3RkRBLCAweDdGRDgsIDB4N0ZEOSwgMHg4MDI3LCAweDU3MjMsIDB4OTVGQiwgMHg4MDU0LCAweDgwNkEsIDB4NThGMCwgMHg4MDM4LAotICAgIDB4ODA2OSwgMHg4MDQyLCAweDgwNEMsIDB4ODA0RCwgMHg1NDJDLCAweDgwNEIsIDB4ODA4MywgMHg4MEMxLCAweDgxMDksIDB4ODBFQiwgMHg4MTMxLCAweDgwQzAsIDB4ODBCRSwgMHg4MEU4LCAweDgxMzYsIDB4ODExMSwKLSAgICAweDgwQkYsIDB4ODExQSwgMHg4MEEwLCAweDgxN0QsIDB4ODE1OCwgMHg4MEE0LCAweDgwRjYsIDB4ODE3QiwgMHg4MEM2LCAweDgxMEQsIDB4ODExMywgMHg4MTM4LCAweDgxMTAsIDB4ODE5MSwgMHg4MTRBLCAweDgwRUEsCi0gICAgMHg4MTBGLCAweDgxMTQsIDB4ODFEQywgMHg1MzY3LCAweDRFMzQsIDB4NTNGMCwgMHg0RTBFLCAweDUxNzQsIDB4NEUzRSwgMHg2NUU3LCAweDgyMzEsIDB4ODIyMywgMHg4MjMwLCAweDgyM0IsIDB4ODI3MCwgMHg4MjczLAotICAgIDB4ODJDNCwgMHg1MjBELCAweDgyQ0UsIDB4NTE3OSwgMHg4MzQ2LCAweDhDNDYsIDB4NUU4NCwgMHg4MzBFLCAweDgzNUEsIDB4ODJDQiwgMHg1MzRFLCAweDcwREYsIDB4ODJDQywgMHg4M0IxLCAweDRFMDcsIDB4ODNCNCwKLSAgICAweDUzRjYsIDB4ODM2RCwgMHg3NzQwLCAweDgyQzcsIDB4ODM2NCwgMHg2NDFDLCAweDgzQjMsIDB4ODM4NSwgMHg4MkNELCAweDgzNkEsIDB4NzZENiwgMHg4M0IyLCAweDgyQzEsIDB4ODNCQywgMHg4MzVDLCAweDg0OEMsCi0gICAgMHg4NDhCLCAweDg0NzEsIDB4ODMxMSwgMHg4MzZCLCAweDgzNjgsIDB4ODQ4NywgMHg4MzVFLCAweDgzNkMsIDB4ODNCOCwgMHg4MzVCLCAweDg0ODksIDB4ODI5QywgMHg4NDI3LCAweDg0RTMsIDB4ODM1RiwgMHg4NERGLAotICAgIDB4ODI5NywgMHg1OURDLCAweDg1MzcsIDB4ODNCNiwgMHg4MzUwLCAweDg0MjgsIDB4ODM2MCwgMHg1MDFGLCAweDg0REQsIDB4ODM2OSwgMHg4MjdBLCAweDgzNkYsIDB4ODVBRSwgMHg4MkM4LCAweDg1M0MsIDB4ODUzQSwKLSAgICAweDg0MUEsIDB4ODU3MiwgMHg4MkE2LCAweDgyQ0YsIDB4ODU3NCwgMHg4MkY5LCAweDg2MTYsIDB4ODVEMywgMHg4NTM5LCAweDgzMEYsIDB4NTE3MCwgMHg4NEUwLCAweDg0MUQsIDB4NTkwNCwgMHg4NjVBLCAweDg2NEYsCi0gICAgMHg1M0Y3LCAweDRFOEYsIDB4ODY2QywgMHg4NkYxLCAweDg3MTUsIDB4ODZBQywgMHg4NjgwLCAweDczMkMsIDB4ODY3RSwgMHg4NjcxLCAweDg3MTcsIDB4ODZGMywgMHg4NjgyLCAweDg0MjQsIDB4ODc3QywgMHg4NzgwLAotICAgIDB4ODZGMCwgMHg4NzQ4LCAweDg3QTgsIDB4ODY2RSwgMHg4NzQ5LCAweDg2RjIsIDB4ODY2QiwgMHg4NkNGLCAweDg2ODEsIDB4ODY4MywgMHg4NzQ3LCAweDg2N0YsIDB4ODc0RSwgMHg4NkY0LCAweDg3N0UsIDB4ODY5RCwKLSAgICAweDg3MjEsIDB4ODZDRSwgMHg4N0NGLCAweDg2Q0EsIDB4ODY5NSwgMHg4NkVFLCAweDRGMTcsIDB4NjcyRiwgMHg1MzZCLCAweDUxQjIsIDB4ODg2RSwgMHg4ODg1LCAweDg4NjUsIDB4ODhDNSwgMHg5MUNDLCAweDUyMzYsCi0gICAgMHg1OTBELCAweDg4QzgsIDB4ODg4NiwgMHg4OEU0LCAweDg4RTIsIDB4N0YyMSwgMHg4OTFCLCAweDRFQjUsIDB4ODhFNSwgMHg4ODg0LCAweDg4RTMsIDB4ODhDNiwgMHg4OTM0LCAweDg4OUMsIDB4ODg2QywgMHg4OEFELAotICAgIDB4ODk1NSwgMHg4OUMxLCAweDg5QzQsIDB4ODlDNSwgMHg4OUM2LCAweDg5QzcsIDB4ODlDQiwgMHg4OUNELCAweDg5Q0UsIDB4NEVCMiwgMHg4OUNBLCAweDg5Q0YsIDB4ODlEMCwgMHg4OUQxLCAweDg5QzksIDB4ODlDOCwKLSAgICAweDg5Q0MsIDB4ODlDMiwgMHg4OURFLCAweDg5RUYsIDB4ODlFNiwgMHg4QkEyLCAweDhCQTMsIDB4OEJBMSwgMHg4QkFGLCAweDhCQTcsIDB4OEJBOCwgMHg4QkE2LCAweDhCQUQsIDB4OEJBQSwgMHg4QkFCLCAweDhCQUMsCi0gICAgMHg4QkIwLCAweDhCQjksIDB4OEJCNiwgMHg4QkJDLCAweDhCQzAsIDB4OEJCNywgMHg4QkJGLCAweDhCQkUsIDB4OEJCOCwgMHg4QkM5LCAweDhCQzMsIDB4OEJDQSwgMHg4QkMxLCAweDhCQzIsIDB4OEJDQiwgMHg4QkI1LAotICAgIDB4OEJDOCwgMHg4QkQyLCAweDhCQ0YsIDB4OEJDNCwgMHg4QkNFLCAweDhCQzUsIDB4OEJDRCwgMHg1NDhGLCAweDhCRTksIDB4OEJFMiwgMHg4QkUzLCAweDhCRDUsIDB4OEJENywgMHg4QkU3LCAweDhCREYsIDB4OEJFMSwKLSAgICAweDhCRTAsIDB4OEJEOCwgMHg4QkRELCAweDhCRTUsIDB4OEJFNiwgMHg4QkRDLCAweDhCRDksIDB4OEJENiwgMHg4QkQ0LCAweDhCREIsIDB4OEJEMywgMHg1OTM4LCAweDVGRDcsIDB4OEJBNCwgMHg4QkYzLCAweDhCRjYsCi0gICAgMHg4QkRFLCAweDhCRjEsIDB4OEJFRSwgMHg4QkVELCAweDhCREEsIDB4OEJFQiwgMHg4QkVDLCAweDhCRUYsIDB4OEJGMCwgMHg4QkY1LCAweDhCRjIsIDB4OEJGNCwgMHg4QzAxLCAweDhCRkUsIDB4OEMwNywgMHg4QkZELAotICAgIDB4OEMwQSwgMHg4QzAzLCAweDhDMDQsIDB4OEMwNiwgMHg4QzA4LCAweDhCRkYsIDB4OEJGNywgMHg4QkU0LCAweDhCRjksIDB4OEJGQywgMHg4QzA1LCAweDhCQkEsIDB4OEMwMiwgMHg4QzAwLCAweDhDMEQsIDB4OEMxRSwKLSAgICAweDhDMUQsIDB4OEMyNSwgMHg4QkU4LCAweDhDMTQsIDB4OEMxQiwgMHg4QzEwLCAweDhDMEYsIDB4OEMxNSwgMHg4QzE4LCAweDhCQjMsIDB4OEMxOSwgMHg4QzBDLCAweDhCQkQsIDB4OEJGOCwgMHg4QzFBLCAweDhDMTYsCi0gICAgMHg4QkZBLCAweDhDMEIsIDB4OEMxMiwgMHg4QzEzLCAweDhBOEEsIDB4OEJDQywgMHg4QzBFLCAweDhDMUMsIDB4OEMyNywgMHg4QzExLCAweDhDMjEsIDB4OEMyNCwgMHg4QzI2LCAweDhCQjIsIDB4OEMyMiwgMHg4QzIzLAotICAgIDB4OEMxRiwgMHg4QzJBLCAweDhDMkMsIDB4OEJCNCwgMHg4QzI4LCAweDhDMjksIDB4OEJDMSwgMHg4QzMyLCAweDhCQTUsIDB4OEMyRSwgMHg4QkM2LCAweDhDMkYsIDB4OEMyRCwgMHg4QzMxLCAweDhDMzUsIDB4OEJEMSwKLSAgICAweDhCQUUsIDB4OEMzNCwgMHg2MkE0LCAweDhCRUEsIDB4OEE4OSwgMHg4QzJCLCAweDhCRkIsIDB4NTNEOCwgMHg4QTVGLCAweDk2RTAsIDB4OEMxNywgMHg4QkE5LCAweDhDMzAsIDB4OEMzNiwgMHg4RDVFLCAweDhDMjAsCi0gICAgMHg4QzMzLCAweDVDODIsIDB4N0FENiwgMHg0RTMwLCAweDczMkEsIDB4OEM2RSwgMHg3MzJCLCAweDhEMUQsIDB4OEQxRSwgMHg4RDFGLCAweDhEMjIsIDB4OEQyMSwgMHg4RDJCLCAweDhEMjcsIDB4OEQyOSwgMHg4RDJBLAotICAgIDB4OEQyRiwgMHg4RDIzLCAweDhEMkUsIDB4OEQzMywgMHg4RDQwLCAweDhEMzAsIDB4OEQzNSwgMHg4RDJDLCAweDRFNzAsIDB4OEQzNywgMHg4RDM2LCAweDhEMzksIDB4OEQzNCwgMHg4RDNCLCAweDhEMzgsIDB4OEQzQSwKLSAgICAweDhEMzIsIDB4OEQ0MiwgMHg4RDQxLCAweDhEM0YsIDB4OEQ0NSwgMHg4RDQ0LCAweDhEM0UsIDB4OEQzQywgMHg4RDQ4LCAweDhENEEsIDB4NUJCRSwgMHg4RDQ3LCAweDhENTIsIDB4OEQ0OSwgMHg4RDUwLCAweDhENEYsCi0gICAgMHg4RDU0LCAweDhENTMsIDB4OEQyNCwgMHg1MzU2LCAweDhEMzEsIDB4OEQ0QiwgMHg4RDU1LCAweDhEMjgsIDB4OEQyNiwgMHg4RDRDLCAweDhENTYsIDB4OEQ1NywgMHg4RDVBLCAweDhENTksIDB4OEQyRCwgMHg4RDVCLAotICAgIDB4OEQ1QywgMHg4RDNELCAweDhENTgsIDB4OEQ1RiwgMHg4RDYwLCAweDhENUUsIDB4OEQ2MSwgMHg4RDYyLCAweDhENDYsIDB4OEQ0MywgMHg4RDUxLCAweDhENEUsIDB4OEQ1RCwgMHg4RDYzLCAweDhENkEsIDB4OEQ3NiwKLSAgICAweDhENzUsIDB4OEQ4QiwgMHg4REIxLCAweDhGRjksIDB4OERGNSwgMHg4RTBBLCAweDhEQzQsIDB4OERGOCwgMHg4REQ2LCAweDhFNTIsIDB4OERGNywgMHg4REY2LCAweDhEQjgsIDB4OEUwQywgMHg4REZCLCAweDhEQzMsCi0gICAgMHg4RTJGLCAweDhEREUsIDB4OEUyQywgMHg4RTcwLCAweDhERjksIDB4OEU1MSwgMHg4RTdGLCAweDhFOUMsIDB4OEU4RiwgMHg4RUFGLCAweDhGNjYsIDB4OEY2NywgMHg4RjY4LCAweDUxOUIsIDB4OEY2OSwgMHg4RjZCLAotICAgIDB4OEY2RCwgMHg4RjZGLCAweDhGNzgsIDB4OEY3MSwgMHg4Rjc0LCAweDhGNzUsIDB4OEY3QSwgMHg4RjcyLCAweDhGNzYsIDB4OEY3QywgMHg4RjgzLCAweDhGODIsIDB4OEY4MSwgMHg4RjgwLCAweDhGN0QsIDB4OEY3RSwKLSAgICAweDhGODQsIDB4OEY4NSwgMHg4RjdCLCAweDhGODYsIDB4OEY4RSwgMHg4Rjg5LCAweDhGOEIsIDB4OEY4RCwgMHg4RjhBLCAweDhGODcsIDB4OEY4OCwgMHg4RjZFLCAweDhGOTEsIDB4OEY4RiwgMHg4RjkzLCAweDhGOTAsCi0gICAgMHg4Rjk3LCAweDgyMDYsIDB4OEY5MiwgMHg2QkMyLCAweDhGOTYsIDB4OEY5NSwgMHg4Rjk4LCAweDhGNkMsIDB4OEY5OSwgMHg4RjdGLCAweDhGOUEsIDB4OEY3MCwgMHg4Rjk0LCAweDhGNzksIDB4OEY3MywgMHg1MjlFLAotICAgIDB4OEY5RSwgMHg4RkFCLCAweDhGQTksIDB4NTE5QywgMHg4RkQ5LCAweDhGREUsIDB4NTQ2OCwgMHg4RkRCLCAweDZFMzgsIDB4OEZEMCwgMHg4RkM3LCAweDhGQkUsIDB4OEZERCwgMHg5MDY1LCAweDkwMEEsIDB4OTAxMiwKLSAgICAweDhGREMsIDB4OTAwMiwgMHg4RkRGLCAweDhGQzEsIDB4OTAwOSwgMHg5MDU3LCAweDhGQkQsIDB4OEZDOCwgMHg4RkQ4LCAweDhGRTksIDB4OEZCOSwgMHg5MDNCLCAweDkwMjYsIDB4OTBDRiwgMHg5MEFFLCAweDkwRDMsCi0gICAgMHg0RTYxLCAweDkwQjksIDB4OTBBQywgMHg5MEU3LCAweDkwOTMsIDB4OTBEMSwgMHg5MEJCLCAweDkwRjgsIDB4OTBCQSwgMHg5MEQwLCAweDkwOUQsIDB4OTE0MiwgMHg5MEU2LCAweDgxNEMsIDB4NEUxMSwgMHg5MTVELAotICAgIDB4NTMzQiwgMHg5MTcxLCAweDkxNjYsIDB4OTE3RiwgMHg4ODQ1LCAweDkxN0UsIDB4OTE3RCwgMHg5MUNBLCAweDk0ODcsIDB4OTQ4QywgMHg5NDhBLCAweDk0ODksIDB4OTQ4QiwgMHg5NDg4LCAweDk0OTMsIDB4OTQ5MCwKLSAgICAweDk0OEYsIDB4OTQ5MiwgMHg5NDhFLCAweDk0OTcsIDB4OTQ4RCwgMHg5NDk1LCAweDk0QUYsIDB4OTRBQiwgMHg5NDk4LCAweDk0QUQsIDB4OTRBMCwgMHg5NDlELCAweDk0QTQsIDB4OTRBMywgMHg5NDlFLCAweDk0QUUsCi0gICAgMHg5NEE3LCAweDk0OTksIDB4OTQ5QiwgMHg5NEFBLCAweDk0Q0MsIDB4OTRDOCwgMHg5NEI2LCAweDk0QzMsIDB4OTRCNCwgMHg5NEI5LCAweDk0Q0QsIDB4OTRCMCwgMHg5NEI4LCAweDk0QzAsIDB4OTRCRiwgMHg5NEJFLAotICAgIDB4OTQ5QywgMHg5NENBLCAweDk0QzksIDB4OTRDNywgMHg5NENCLCAweDk0QzIsIDB4OTRCMywgMHg5NEM2LCAweDk0QzUsIDB4OTRCQSwgMHg5NEE5LCAweDk0QjIsIDB4OTRCQywgMHg5NEJELCAweDk0Q0YsIDB4OTRGMCwKLSAgICAweDk0RDIsIDB4OTRFQywgMHg5NEVBLCAweDk0RjYsIDB4OTRGMywgMHg5NERDLCAweDk0REEsIDB4OTRFMywgMHg5NEU4LCAweDk0RTIsIDB4OTRFRCwgMHg5NEVCLCAweDk0RTYsIDB4ODg1NCwgMHg5NEQxLCAweDk0RjcsCi0gICAgMHg5NEYxLCAweDk0REYsIDB4OTRGNSwgMHg5NEQ1LCAweDk0RUYsIDB4OTREMCwgMHg5NTEwLCAweDk1MDAsIDB4OTUwOCwgMHg5NTExLCAweDk1MDksIDB4OTRERCwgMHg5NTEyLCAweDk1MEMsIDB4OTRBMSwgMHg5NEU0LAotICAgIDB4OTRENywgMHg5NTBCLCAweDk1MEEsIDB4OTUxMywgMHg5NTA0LCAweDk1MDMsIDB4OTUxNCwgMHg5NTA3LCAweDk0RDMsIDB4OTRGQSwgMHg5NEQ2LCAweDk1MDYsIDB4OTUwMiwgMHg5NTJGLCAweDk0QTIsIDB4OTUxRSwKLSAgICAweDVGNTUsIDB4OTUxNiwgMHg5NTI5LCAweDk0RDQsIDB4OTUyNSwgMHg5NTE1LCAweDk1MUYsIDB4OTUyNCwgMHg5NTMxLCAweDk0RUUsIDB4OTUxQiwgMHg5NTJDLCAweDk1MkQsIDB4OTUxQywgMHg5NEIxLCAweDk1MjYsCi0gICAgMHg5NTFBLCAweDk1MjAsIDB4OTUyMSwgMHg5NTIyLCAweDk1MTksIDB4OTUzMCwgMHg4ODY4LCAweDk0RkMsIDB4OTUyOCwgMHg5NDk0LCAweDk1MzQsIDB4OTRGRSwgMHg5NTA1LCAweDk1NDAsIDB4OTUzNywgMHg5NEUxLAotICAgIDB4OTQ5NiwgMHg5NTNCLCAweDk1M0QsIDB4OTUzOCwgMHg5NTMyLCAweDk1MzksIDB4OTUzRSwgMHg5NTJFLCAweDk1MzYsIDB4OTUxNywgMHg5NTNBLCAweDk1NDEsIDB4OTU1MSwgMHg5NTU1LCAweDk1MDEsIDB4OTU0OSwKLSAgICAweDk1NDgsIDB4OTU0MywgMHg5NEE4LCAweDg0RTUsIDB4OTU0RiwgMHg5NEUwLCAweDk0RTksIDB4OTUzQywgMHg5NTUwLCAweDk1NDcsIDB4OTU1MiwgMHg5NTRELCAweDk1NTMsIDB4OTU1RSwgMHg5NTVGLCAweDk0RkUsCi0gICAgMHg5NTQ2LCAweDk1NTksIDB4OTU2MCwgMHg5NTVELCAweDk0RkYsIDB4OTUzNSwgMHg5NTU3LCAweDk1NTgsIDB4OTU1QiwgMHg5NEYyLCAweDk1NUMsIDB4OTU1NiwgMHg5NTQyLCAweDkzM0UsIDB4OTU1QSwgMHg5NEU3LAotICAgIDB4OTU2QSwgMHg5NTA4LCAweDk0RDksIDB4OTU2MywgMHg5NTY2LCAweDk1NjEsIDB4OTQ5RiwgMHg5NTZCLCAweDk1MEYsIDB4OTU0NCwgMHg5NTRDLCAweDk1NzAsIDB4OTU2RiwgMHg5NTZELCAweDk0QzEsIDB4OTU2RSwKLSAgICAweDk0Q0UsIDB4OTREQiwgMHg5NTcxLCAweDk0RjgsIDB4OTU2QywgMHg5NTU0LCAweDkyNzQsIDB4OTUyNywgMHg5NTc0LCAweDk0QzQsIDB4OTU3MywgMHg5NTY3LCAweDk0QTUsIDB4OTU3NSwgMHg5NTc2LCAweDk1NEEsCi0gICAgMHg5NTY5LCAweDk1MjMsIDB4OTRCQiwgMHg5MkFFLCAweDUxRkYsIDB4OTU3RiwgMHg5NUU4LCAweDk1RTksIDB4OTVFQSwgMHg5NUVCLCAweDk1RUMsIDB4OTVFRCwgMHg1RjAwLCAweDk1RjYsIDB4OTVGMywgMHg5NUYwLAotICAgIDB4OTVGMiwgMHg5NUY0LCAweDk1RjUsIDB4OTVGOCwgMHg5NjAyLCAweDk2MDEsIDB4OTYwMCwgMHg5NUZBLCAweDk1RkQsIDB4OTYwMywgMHg5NjA2LCAweDk1RkUsIDB4OTYwNSwgMHg5NjBBLCAweDk2MDksIDB4OTYwRSwKLSAgICAweDk2MEYsIDB4OTYwRCwgMHg5NjA4LCAweDk2MEMsIDB4OTYxMiwgMHg2NzdGLCAweDY2OTcsIDB4OTVGMSwgMHg5NjE0LCAweDk2MTUsIDB4OTYxMSwgMHg5NjE3LCAweDk2MTgsIDB4OTVGRiwgMHg5NjE2LCAweDk2MTksCi0gICAgMHg5NUVGLCAweDUxNzMsIDB4OTYxQSwgMHg5NjEzLCAweDk2MTAsIDB4OEY5RiwgMHg5NjFCLCAweDk1RkMsIDB4OTY0OSwgMHg5NjU1LCAweDk2MzUsIDB4OTYzNCwgMHg5NjQ4LCAweDk2NDYsIDB4OTYzMywgMHg5NjY3LAotICAgIDB4OTYxRiwgMHg5NjM2LCAweDk2NjgsIDB4OTY0NSwgMHg5NjhGLCAweDk2NjksIDB4OTY5MCwgMHg5NjQ3LCAweDk2QjYsIDB4NTNFQSwgMHg5NkJELCAweDg2N0QsIDB4NTNDQywgMHg5NkNGLCAweDY3NDIsIDB4OUUyMSwKLSAgICAweDc5QkIsIDB4OTZCRSwgMHg0RTkxLCAweDc1MzUsIDB4OTcyMSwgMHg5NkZFLCAweDk3MDEsIDB4OTZGMywgMHg5NzJELCAweDUzQzcsIDB4NzA3NSwgMHg1M0M2LCAweDk3NTMsIDB4OTc1OSwgMHg4MTdDLCAweDk3NjUsCi0gICAgMHg5RjE3LCAweDVERTksIDB4OTc5RiwgMHg3RjMwLCAweDk3OTEsIDB4OTdBRiwgMHg5N0U2LCAweDk3RTcsIDB4OTdFOSwgMHg5N0VBLCAweDk3RUMsIDB4OTdFQiwgMHg5N0Y1LCAweDU0Q0QsIDB4OTg3NSwgMHg5ODc2LAotICAgIDB4OTg3NywgMHg5ODc5LCAweDk4N0EsIDB4OTg3OCwgMHg5ODdCLCAweDk4N0MsIDB4OTg4MiwgMHg5ODgwLCAweDk4ODMsIDB4OTg4NCwgMHg5ODdELCAweDk4ODEsIDB4OTg3RiwgMHg5ODg3LCAweDk4ODYsIDB4OTg4QywKLSAgICAweDk4ODksIDB4OTg5MCwgMHg5ODhGLCAweDU5MzQsIDB4OTg4QSwgMHg5ODhCLCAweDk4OTQsIDB4OTg4OCwgMHg5ODkzLCAweDk4OTEsIDB4OTg5NywgMHg5ODk4LCAweDk4OUQsIDB4OTg5QSwgMHg5ODlDLCAweDk4OTksCi0gICAgMHg5ODlCLCAweDYxM0YsIDB4OThBMSwgMHg5OEEwLCAweDdDN0IsIDB4OTg5RiwgMHg5OEEyLCAweDk4N0UsIDB4OThBNCwgMHg5OEE1LCAweDY2M0UsIDB4OThBNiwgMHg5ODg1LCAweDk4OUUsIDB4OThBNywgMHg5OENFLAotICAgIDB4OThEMCwgMHg5OEQxLCAweDk4RDIsIDB4NTNGMCwgMHg5OEQzLCAweDk4RDQsIDB4OThDRiwgMHg5OEQ2LCAweDk4RDUsIDB4OThENywgMHg5OEQ4LCAweDk4RDksIDB4OThERSwgMHg5OTY1LCAweDk5NjQsIDB4OTk2NiwKLSAgICAweDk5NjgsIDB4OTk2QSwgMHg5OTZCLCAweDk5NkMsIDB4OTk2RCwgMHg5OTZFLCAweDk5NzQsIDB4OTk3MiwgMHg5OTcxLCAweDk5NzAsIDB4OTk3MywgMHg5OTdBLCAweDk5NzgsIDB4OTk3QywgMHg5OTc3LCAweDUxN0IsCi0gICAgMHg5OTc1LCAweDk5NzksIDB4OTk3RCwgMHg5OTgxLCAweDk5N0YsIDB4OTk3RSwgMHg0RjU5LCAweDgwQjQsIDB4OTk4NCwgMHg5OTgzLCAweDk5NkYsIDB4OTk4NSwgMHg5OTg2LCAweDdDQzcsIDB4OTk2NywgMHg1NTgyLAotICAgIDB4OTk4OSwgMHg5OThFLCAweDk5NjksIDB4OTk4RiwgMHg5OThBLCAweDk5OEMsIDB4OTk4RCwgMHg5OTkyLCAweDk5OTAsIDB4OTk5MSwgMHg5OTg4LCAweDk5OTQsIDB4OTk3NiwgMHg5OEU4LCAweDk5MEQsIDB4OTk4QiwKLSAgICAweDlBNkMsIDB4OUE2RCwgMHg1MUFGLCAweDlBNkUsIDB4OUE3MCwgMHg5QTZGLCAweDlBNzMsIDB4OUE3QiwgMHg5QTdELCAweDlBNzksIDB4OUE3NSwgMHg5QTdFLCAweDlBODAsIDB4OUE3OCwgMHg5QTc2LCAweDlBN0MsCi0gICAgMHg5QTc3LCAweDlBODgsIDB4OUE4NywgMHg5QTgzLCAweDlBODYsIDB4OUE4RSwgMHg5QThGLCAweDlBOEIsIDB4OUE4RCwgMHg5QTkzLCAweDlBOTIsIDB4OUE5MSwgMHg5QTkwLCAweDlBOUIsIDB4OUE5NywgMHg5QTk5LAotICAgIDB4OUE5RSwgMHg5QTk4LCAweDlBOUQsIDB4ODE3RSwgMHg5QTdBLCAweDlBOUEsIDB4OUE5RiwgMHg5QUExLCAweDg0RTYsIDB4OUE5QywgMHg5QTk2LCAweDlBQTAsIDB4OUFBMiwgMHg5QTcxLCAweDlBODUsIDB4OUE5NSwKLSAgICAweDlBODEsIDB4OUE4NCwgMHg5QThDLCAweDYwQ0EsIDB4OUE3RiwgMHg5QUE0LCAweDlBNzQsIDB4OUFBNywgMHg5QUE1LCAweDlBQTYsIDB4OUE4QSwgMHg4MEFFLCAweDlBQzUsIDB4ODEwRiwgMHg0RjUzLCAweDlBQ0MsCi0gICAgMHg5QUNCLCAweDUzRDEsIDB4Njc3RSwgMHg4MEUxLCAweDlCMTMsIDB4NjU5NywgMHg5NUY5LCAweDk2MEIsIDB4OTYwNCwgMHg5MEMxLCAweDlCNDksIDB4OUI0NywgMHg5QzdDLCAweDlDODAsIDB4OUM4MSwgMHg5QzgyLAotICAgIDB4OUM3RiwgMHg5Qzg1LCAweDlDODYsIDB4OUM4RiwgMHg5Qzg3LCAweDlDOTAsIDB4OUM4RCwgMHg5QzhCLCAweDlDOEEsIDB4OUM5MiwgMHg5Qzk1LCAweDlDOTYsIDB4OUM5NCwgMHg5QzlCLCAweDlDOTEsIDB4OUM5QywKLSAgICAweDlDQTcsIDB4OUNBMCwgMHg5Q0E5LCAweDlDQTQsIDB4OUNBOCwgMHg5Q0JCLCAweDlDQUYsIDB4OUNBRCwgMHg5QzlFLCAweDlDQjcsIDB4OUNCNCwgMHg5Q0IxLCAweDlDQjUsIDB4OUNCMiwgMHg5Q0IzLCAweDlDQjgsCi0gICAgMHg5Q0FFLCAweDlDQjAsIDB4OUNCNiwgMHg5Q0FCLCAweDlDQ0EsIDB4OUM5NywgMHg5Q0JELCAweDlDQzcsIDB4OUNDNSwgMHg5Q0M2LCAweDlDQzMsIDB4OUNEMiwgMHg5Q0QxLCAweDlDQTUsIDB4OUNDRiwgMHg5Q0NFLAotICAgIDB4OUNEMCwgMHg5Q0NELCAweDlDQzEsIDB4OUNBMiwgMHg5Q0NDLCAweDlDQTYsIDB4OUNBMywgMHg5Q0I5LCAweDlDRDcsIDB4OUNENCwgMHg5Q0M5LCAweDlDRDUsIDB4OUNENiwgMHg5Q0RGLCAweDlDREQsIDB4OUNEQywKLSAgICAweDlDREUsIDB4OUM5RiwgMHg5Q0JDLCAweDlDOEUsIDB4OUM5OSwgMHg5Q0UzLCAweDlDRTIsIDB4OUM5QSwgMHg5Q0M0LCAweDlDODgsIDB4OUNBMSwgMHg5RTFGLCAweDUxRUIsIDB4OUUyMCwgMHg5RTI0LCAweDUxRTQsCi0gICAgMHg5RTIzLCAweDlFMjIsIDB4OUUyOSwgMHg5RTI4LCAweDlFMjYsIDB4OUUzMCwgMHg5RTM1LCAweDlFMzMsIDB4OUUzMiwgMHg5RTJFLCAweDlFMzEsIDB4OUUyQSwgMHg5RTJGLCAweDlFMkQsIDB4OUUzOCwgMHg5RTM5LAotICAgIDB4OUUzQiwgMHg5RTNGLCAweDlFM0QsIDB4OUUzQSwgMHg5RTQzLCAweDlFNDYsIDB4OUU0MSwgMHg5RTQ4LCAweDlFNDUsIDB4OUU0NCwgMHg5RTQ5LCAweDlFNEMsIDB4OUU0RiwgMHg5RTRFLCAweDlFNEEsIDB4OUU1MywKLSAgICAweDlFMkIsIDB4OUU1MSwgMHg5RTRCLCAweDlFNTksIDB4OUU1NSwgMHg5RTU3LCAweDlFNTYsIDB4OUU0RCwgMHg5RTVCLCAweDlFNUMsIDB4ODNCQSwgMHg5RTVGLCAweDlFNjQsIDB4OUU2MCwgMHg5RTYxLCAweDlFNTgsCi0gICAgMHg5RTYzLCAweDlFNUEsIDB4OUU2MiwgMHg5RTVFLCAweDlFNjcsIDB4OUU2NSwgMHg5RTI1LCAweDlFMzcsIDB4OUU2OCwgMHg5RTM2LCAweDlFNkEsIDB4OUU1NCwgMHg5RTY5LCAweDlFNkIsIDB4OUU0NywgMHg5RTZDLAotICAgIDB4OUU3MCwgMHg5RTZELCAweDlFNkYsIDB4OUUyQywgMHg5RTc0LCAweDlFNjYsIDB4OUU3MywgMHg5RTQyLCAweDlFM0UsIDB4NTM2NCwgMHg5RTdFLCAweDc4NzcsIDB4NzZEMCwgMHg0RTNELCAweDlFQTYsIDB4OUVCOCwKLSAgICAweDlFQjksIDB4OTc2MiwgMHg0RTQ4LCAweDlFQzQsIDB4OUVDOSwgMHg3MEI5LCAweDUxNUEsIDB4OTcwOSwgMHg5RUUxLCAweDlFRTksIDB4OUVGRSwgMHg5RjBCLCAweDlGMEQsIDB4OUYzOSwgMHg5RjUwLCAweDY1OEIsCi0gICAgMHg4RDRELCAweDlGNTEsIDB4OUY3RiwgMHg5RjgwLCAweDlGODEsIDB4OUY4NSwgMHg5Rjg3LCAweDlGODMsIDB4OUY4NiwgMHg5Rjg0LCAweDlGODgsIDB4OUY4QSwgMHg5Rjg5LCAweDlGOEIsIDB4OUY4QywgMHg5Rjk5LAotICAgIDB4NTM5MCwgMHg1RTlFLCAweDlGOUEsIDB4OUY5QiwgMHg5RjlGLCAweEE3NkYsIDB4OEM0OCwgMHg2NkY0LCAweDhFQ0EsIDB4OENDOCwgMHg2RUQxLCAweDRFMzIsIDB4NTNFNSwgMHg5RjlDLCAweDlGOUMsIDB4NTk1MSwKLSAgICAweDkxRDEsIDB4NTU4NywgMHg1OTQ4LCAweDYxRjYsIDB4NzY2OSwgMHg3Rjg1LCAweDg2M0YsIDB4ODdCQSwgMHg4OEY4LCAweDkwOEYsIDB4NkEwMiwgMHg2RDFCLCAweDcwRDksIDB4NzNERSwgMHg4NDNELCAweDkxNkEsCi0gICAgMHg5OUYxLCAweDRFODIsIDB4NTM3NSwgMHg2QjA0LCAweDcyMUIsIDB4ODYyRCwgMHg5RTFFLCAweDVENTAsIDB4NkZFQiwgMHg4NUNELCAweDg5NjQsIDB4NjJDOSwgMHg4MUQ4LCAweDg4MUYsIDB4NUVDQSwgMHg2NzE3LAotICAgIDB4NkQ2QSwgMHg3MkZDLCAweDkwQ0UsIDB4NEY4NiwgMHg1MUI3LCAweDUyREUsIDB4NjRDNCwgMHg2QUQzLCAweDcyMTAsIDB4NzZFNywgMHg4MDAxLCAweDg2MDYsIDB4ODY1QywgMHg4REVGLCAweDk3MzIsIDB4OUI2RiwKLSAgICAweDlERkEsIDB4Nzg4QywgMHg3OTdGLCAweDdEQTAsIDB4ODNDOSwgMHg5MzA0LCAweDlFN0YsIDB4OEFENiwgMHg1OERGLCAweDVGMDQsIDB4N0M2MCwgMHg4MDdFLCAweDcyNjIsIDB4NzhDQSwgMHg4Q0MyLCAweDk2RjcsCi0gICAgMHg1OEQ4LCAweDVDNjIsIDB4NkExMywgMHg2RERBLCAweDZGMEYsIDB4N0QyRiwgMHg3RTM3LCAweDk2NEIsIDB4NTJEMiwgMHg4MDhCLCAweDUxREMsIDB4NTFDQywgMHg3QTFDLCAweDdEQkUsIDB4ODNGMSwgMHg5Njc1LAotICAgIDB4OEI4MCwgMHg2MkNGLCAweDZBMDIsIDB4OEFGRSwgMHg0RTM5LCAweDVCRTcsIDB4NjAxMiwgMHg3Mzg3LCAweDc1NzAsIDB4NTMxNywgMHg3OEZCLCAweDRGQkYsIDB4NUZBOSwgMHg0RTBELCAweDZDQ0MsIDB4NjU3OCwKLSAgICAweDdEMjIsIDB4NTNDMywgMHg1ODVFLCAweDc3MDEsIDB4ODQ0OSwgMHg4QUFBLCAweDZCQkEsIDB4OEZCMCwgMHg2Qzg4LCAweDYyRkUsIDB4ODJFNSwgMHg2M0EwLCAweDc1NjUsIDB4NEVBRSwgMHg1MTY5LCAweDUxQzksCi0gICAgMHg2ODgxLCAweDdDRTcsIDB4ODI2RiwgMHg4QUQyLCAweDkxQ0YsIDB4NTJGNSwgMHg1NDQyLCAweDU5NzMsIDB4NUVFQywgMHg2NUM1LCAweDZGRkUsIDB4NzkyQSwgMHg5NUFELCAweDlBNkEsIDB4OUU5NywgMHg5RUNFLAotICAgIDB4NTI5QiwgMHg2NkM2LCAweDZCNzcsIDB4OEY2MiwgMHg1RTc0LCAweDYxOTAsIDB4NjIwMCwgMHg2NDlBLCAweDZGMjMsIDB4NzE0OSwgMHg3NDg5LCAweDc5Q0EsIDB4N0RGNCwgMHg4MDZGLCAweDhGMjYsIDB4ODRFRSwKLSAgICAweDkwMjMsIDB4OTM0QSwgMHg1MjE3LCAweDUyQTMsIDB4NTRCRCwgMHg3MEM4LCAweDg4QzIsIDB4OEFBQSwgMHg1RUM5LCAweDVGRjUsIDB4NjM3QiwgMHg2QkFFLCAweDdDM0UsIDB4NzM3NSwgMHg0RUU0LCAweDU2RjksCi0gICAgMHg1QkU3LCAweDVEQkEsIDB4NjAxQywgMHg3M0IyLCAweDc0NjksIDB4N0Y5QSwgMHg4MDQ2LCAweDkyMzQsIDB4OTZGNiwgMHg5NzQ4LCAweDk4MTgsIDB4NEY4QiwgMHg3OUFFLCAweDkxQjQsIDB4OTZCOCwgMHg2MEUxLAotICAgIDB4NEU4NiwgMHg1MERBLCAweDVCRUUsIDB4NUMzRiwgMHg2NTk5LCAweDZBMDIsIDB4NzFDRSwgMHg3NjQyLCAweDg0RkMsIDB4OTA3QywgMHg5RjhELCAweDY2ODgsIDB4OTYyRSwgMHg1Mjg5LCAweDY3N0IsIDB4NjdGMywKLSAgICAweDZENDEsIDB4NkU5QywgMHg3NDA5LCAweDc1NTksIDB4Nzg2QiwgMHg3RDEwLCAweDk4NUUsIDB4NTE2RCwgMHg2MjJFLCAweDk2NzgsIDB4NTAyQiwgMHg1RDE5LCAweDZERUEsIDB4OEYyQSwgMHg1RjhCLCAweDYxNDQsCi0gICAgMHg2ODE3LCAweDczODcsIDB4OTY4NiwgMHg1MjI5LCAweDU0MEYsIDB4NUM2NSwgMHg2NjEzLCAweDY3NEUsIDB4NjhBOCwgMHg2Q0U1LCAweDc0MDYsIDB4NzVFMiwgMHg3Rjc5LCAweDg4Q0YsIDB4ODhFMSwgMHg5MUNDLAotICAgIDB4OTZFMiwgMHg1MzNGLCAweDZFQkEsIDB4NTQxRCwgMHg3MUQwLCAweDc0OTgsIDB4ODVGQSwgMHg5NkEzLCAweDlDNTcsIDB4OUU5RiwgMHg2Nzk3LCAweDZEQ0IsIDB4ODFFOCwgMHg3QUNCLCAweDdCMjAsIDB4N0M5MiwKLSAgICAweDcyQzAsIDB4NzA5OSwgMHg4QjU4LCAweDRFQzAsIDB4ODMzNiwgMHg1MjNBLCAweDUyMDcsIDB4NUVBNiwgMHg2MkQzLCAweDdDRDYsIDB4NUI4NSwgMHg2RDFFLCAweDY2QjQsIDB4OEYzQiwgMHg4ODRDLCAweDk2NEQsCi0gICAgMHg4OThCLCAweDVFRDMsIDB4NTE0MCwgMHg1NUMwLCAweDU4NUEsIDB4NjY3NCwgMHg1MURFLCAweDczMkEsIDB4NzZDQSwgMHg3OTNDLCAweDc5NUUsIDB4Nzk2NSwgMHg3OThGLCAweDk3NTYsIDB4N0NCRSwgMHg3RkJELAotICAgIDB4ODYxMiwgMHg4QUY4LCAweDkwMzgsIDB4OTBGRCwgMHg5OEVGLCAweDk4RkMsIDB4OTkyOCwgMHg5REI0LCAweDRGQUUsIDB4NTBFNywgMHg1MTRELCAweDUyQzksIDB4NTJFNCwgMHg1MzUxLCAweDU1OUQsIDB4NTYwNiwKLSAgICAweDU2NjgsIDB4NTg0MCwgMHg1OEE4LCAweDVDNjQsIDB4NUM2RSwgMHg2MDk0LCAweDYxNjgsIDB4NjE4RSwgMHg2MUYyLCAweDY1NEYsIDB4NjVFMiwgMHg2NjkxLCAweDY4ODUsIDB4NkQ3NywgMHg2RTFBLCAweDZGMjIsCi0gICAgMHg3MTZFLCAweDcyMkIsIDB4NzQyMiwgMHg3ODkxLCAweDc5M0UsIDB4Nzk0OSwgMHg3OTQ4LCAweDc5NTAsIDB4Nzk1NiwgMHg3OTVELCAweDc5OEQsIDB4Nzk4RSwgMHg3QTQwLCAweDdBODEsIDB4N0JDMCwgMHg3REY0LAotICAgIDB4N0UwOSwgMHg3RTQxLCAweDdGNzIsIDB4ODAwNSwgMHg4MUVELCAweDgyNzksIDB4ODI3OSwgMHg4NDU3LCAweDg5MTAsIDB4ODk5NiwgMHg4QjAxLCAweDhCMzksIDB4OENEMywgMHg4RDA4LCAweDhGQjYsIDB4OTAzOCwKLSAgICAweDk2RTMsIDB4OTdGRiwgMHg5ODNCLCAweDYwNzUsIDB4ODIxOCwgMHg0RTI2LCAweDUxQjUsIDB4NTE2OCwgMHg0RjgwLCAweDUxNDUsIDB4NTE4MCwgMHg1MkM3LCAweDUyRkEsIDB4NTU5RCwgMHg1NTU1LCAweDU1OTksCi0gICAgMHg1NUUyLCAweDU4NUEsIDB4NThCMywgMHg1OTQ0LCAweDU5NTQsIDB4NUE2MiwgMHg1QjI4LCAweDVFRDIsIDB4NUVEOSwgMHg1RjY5LCAweDVGQUQsIDB4NjBEOCwgMHg2MTRFLCAweDYxMDgsIDB4NjE4RSwgMHg2MTYwLAotICAgIDB4NjFGMiwgMHg2MjM0LCAweDYzQzQsIDB4NjQxQywgMHg2NDUyLCAweDY1NTYsIDB4NjY3NCwgMHg2NzE3LCAweDY3MUIsIDB4Njc1NiwgMHg2Qjc5LCAweDZCQkEsIDB4NkQ0MSwgMHg2RURCLCAweDZFQ0IsIDB4NkYyMiwKLSAgICAweDcwMUUsIDB4NzE2RSwgMHg3N0E3LCAweDcyMzUsIDB4NzJBRiwgMHg3MzJBLCAweDc0NzEsIDB4NzUwNiwgMHg3NTNCLCAweDc2MUQsIDB4NzYxRiwgMHg3NkNBLCAweDc2REIsIDB4NzZGNCwgMHg3NzRBLCAweDc3NDAsCi0gICAgMHg3OENDLCAweDdBQjEsIDB4N0JDMCwgMHg3QzdCLCAweDdENUIsIDB4N0RGNCwgMHg3RjNFLCAweDgwMDUsIDB4ODM1MiwgMHg4M0VGLCAweDg3NzksIDB4ODk0MSwgMHg4OTg2LCAweDg5OTYsIDB4OEFCRiwgMHg4QUY4LAotICAgIDB4OEFDQiwgMHg4QjAxLCAweDhBRkUsIDB4OEFFRCwgMHg4QjM5LCAweDhCOEEsIDB4OEQwOCwgMHg4RjM4LCAweDkwNzIsIDB4OTE5OSwgMHg5Mjc2LCAweDk2N0MsIDB4OTZFMywgMHg5NzU2LCAweDk3REIsIDB4OTdGRiwKLSAgICAweDk4MEIsIDB4OTgzQiwgMHg5QjEyLCAweDlGOUMsIDB4M0I5RCwgMHg0MDE4LCAweDQwMzksIDB4OUY0MywgMHg5RjhFLCAweDA1RTIsIDB4MDVEMCwgMHgwNUQzLCAweDA1RDQsIDB4MDVEQiwgMHgwNURDLCAweDA1REQsCi0gICAgMHgwNUU4LCAweDA1RUEsIDB4MDAyQiwgMHgwNjcxLCAweDA2NzEsIDB4MDY3QiwgMHgwNjdCLCAweDA2N0IsIDB4MDY3QiwgMHgwNjdFLCAweDA2N0UsIDB4MDY3RSwgMHgwNjdFLCAweDA2ODAsIDB4MDY4MCwgMHgwNjgwLAotICAgIDB4MDY4MCwgMHgwNjdBLCAweDA2N0EsIDB4MDY3QSwgMHgwNjdBLCAweDA2N0YsIDB4MDY3RiwgMHgwNjdGLCAweDA2N0YsIDB4MDY3OSwgMHgwNjc5LCAweDA2NzksIDB4MDY3OSwgMHgwNkE0LCAweDA2QTQsIDB4MDZBNCwKLSAgICAweDA2QTQsIDB4MDZBNiwgMHgwNkE2LCAweDA2QTYsIDB4MDZBNiwgMHgwNjg0LCAweDA2ODQsIDB4MDY4NCwgMHgwNjg0LCAweDA2ODMsIDB4MDY4MywgMHgwNjgzLCAweDA2ODMsIDB4MDY4NiwgMHgwNjg2LCAweDA2ODYsCi0gICAgMHgwNjg2LCAweDA2ODcsIDB4MDY4NywgMHgwNjg3LCAweDA2ODcsIDB4MDY4RCwgMHgwNjhELCAweDA2OEMsIDB4MDY4QywgMHgwNjhFLCAweDA2OEUsIDB4MDY4OCwgMHgwNjg4LCAweDA2OTgsIDB4MDY5OCwgMHgwNjkxLAotICAgIDB4MDY5MSwgMHgwNkE5LCAweDA2QTksIDB4MDZBOSwgMHgwNkE5LCAweDA2QUYsIDB4MDZBRiwgMHgwNkFGLCAweDA2QUYsIDB4MDZCMywgMHgwNkIzLCAweDA2QjMsIDB4MDZCMywgMHgwNkIxLCAweDA2QjEsIDB4MDZCMSwKLSAgICAweDA2QjEsIDB4MDZCQSwgMHgwNkJBLCAweDA2QkIsIDB4MDZCQiwgMHgwNkJCLCAweDA2QkIsIDB4MDZDMCwgMHgwNkMwLCAweDA2QzEsIDB4MDZDMSwgMHgwNkMxLCAweDA2QzEsIDB4MDZCRSwgMHgwNkJFLCAweDA2QkUsCi0gICAgMHgwNkJFLCAweDA2RDIsIDB4MDZEMiwgMHgwNkQzLCAweDA2RDMsIDB4MDZBRCwgMHgwNkFELCAweDA2QUQsIDB4MDZBRCwgMHgwNkM3LCAweDA2QzcsIDB4MDZDNiwgMHgwNkM2LCAweDA2QzgsIDB4MDZDOCwgMHgwNjc3LAotICAgIDB4MDZDQiwgMHgwNkNCLCAweDA2QzUsIDB4MDZDNSwgMHgwNkM5LCAweDA2QzksIDB4MDZEMCwgMHgwNkQwLCAweDA2RDAsIDB4MDZEMCwgMHgwNjQ5LCAweDA2NDksIDB4MDZDQywgMHgwNkNDLCAweDA2Q0MsIDB4MDZDQywKLSAgICAweDAwMkMsIDB4MzAwMSwgMHgzMDAyLCAweDAwM0EsIDB4MDAzQiwgMHgwMDIxLCAweDAwM0YsIDB4MzAxNiwgMHgzMDE3LCAweDIwMjYsIDB4MjAyNSwgMHgyMDE0LCAweDIwMTMsIDB4MDA1RiwgMHgwMDVGLCAweDAwMjgsCi0gICAgMHgwMDI5LCAweDAwN0IsIDB4MDA3RCwgMHgzMDE0LCAweDMwMTUsIDB4MzAxMCwgMHgzMDExLCAweDMwMEEsIDB4MzAwQiwgMHgzMDA4LCAweDMwMDksIDB4MzAwQywgMHgzMDBELCAweDMwMEUsIDB4MzAwRiwgMHgwMDVCLAotICAgIDB4MDA1RCwgMHgyMDNFLCAweDIwM0UsIDB4MjAzRSwgMHgyMDNFLCAweDAwNUYsIDB4MDA1RiwgMHgwMDVGLCAweDAwMkMsIDB4MzAwMSwgMHgwMDJFLCAweDAwM0IsIDB4MDAzQSwgMHgwMDNGLCAweDAwMjEsIDB4MjAxNCwKLSAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDdCLCAweDAwN0QsIDB4MzAxNCwgMHgzMDE1LCAweDAwMjMsIDB4MDAyNiwgMHgwMDJBLCAweDAwMkIsIDB4MDAyRCwgMHgwMDNDLCAweDAwM0UsIDB4MDAzRCwgMHgwMDVDLCAweDAwMjQsCi0gICAgMHgwMDI1LCAweDAwNDAsIDB4MDY0QiwgMHgwNjRDLCAweDA2NEQsIDB4MDY0RSwgMHgwNjRGLCAweDA2NTAsIDB4MDY1MSwgMHgwNjUyLCAweDA2MjEsIDB4MDYyMiwgMHgwNjIyLCAweDA2MjMsIDB4MDYyMywgMHgwNjI0LAotICAgIDB4MDYyNCwgMHgwNjI1LCAweDA2MjUsIDB4MDYyNiwgMHgwNjI2LCAweDA2MjYsIDB4MDYyNiwgMHgwNjI3LCAweDA2MjcsIDB4MDYyOCwgMHgwNjI4LCAweDA2MjgsIDB4MDYyOCwgMHgwNjI5LCAweDA2MjksIDB4MDYyQSwKLSAgICAweDA2MkEsIDB4MDYyQSwgMHgwNjJBLCAweDA2MkIsIDB4MDYyQiwgMHgwNjJCLCAweDA2MkIsIDB4MDYyQywgMHgwNjJDLCAweDA2MkMsIDB4MDYyQywgMHgwNjJELCAweDA2MkQsIDB4MDYyRCwgMHgwNjJELCAweDA2MkUsCi0gICAgMHgwNjJFLCAweDA2MkUsIDB4MDYyRSwgMHgwNjJGLCAweDA2MkYsIDB4MDYzMCwgMHgwNjMwLCAweDA2MzEsIDB4MDYzMSwgMHgwNjMyLCAweDA2MzIsIDB4MDYzMywgMHgwNjMzLCAweDA2MzMsIDB4MDYzMywgMHgwNjM0LAotICAgIDB4MDYzNCwgMHgwNjM0LCAweDA2MzQsIDB4MDYzNSwgMHgwNjM1LCAweDA2MzUsIDB4MDYzNSwgMHgwNjM2LCAweDA2MzYsIDB4MDYzNiwgMHgwNjM2LCAweDA2MzcsIDB4MDYzNywgMHgwNjM3LCAweDA2MzcsIDB4MDYzOCwKLSAgICAweDA2MzgsIDB4MDYzOCwgMHgwNjM4LCAweDA2MzksIDB4MDYzOSwgMHgwNjM5LCAweDA2MzksIDB4MDYzQSwgMHgwNjNBLCAweDA2M0EsIDB4MDYzQSwgMHgwNjQxLCAweDA2NDEsIDB4MDY0MSwgMHgwNjQxLCAweDA2NDIsCi0gICAgMHgwNjQyLCAweDA2NDIsIDB4MDY0MiwgMHgwNjQzLCAweDA2NDMsIDB4MDY0MywgMHgwNjQzLCAweDA2NDQsIDB4MDY0NCwgMHgwNjQ0LCAweDA2NDQsIDB4MDY0NSwgMHgwNjQ1LCAweDA2NDUsIDB4MDY0NSwgMHgwNjQ2LAotICAgIDB4MDY0NiwgMHgwNjQ2LCAweDA2NDYsIDB4MDY0NywgMHgwNjQ3LCAweDA2NDcsIDB4MDY0NywgMHgwNjQ4LCAweDA2NDgsIDB4MDY0OSwgMHgwNjQ5LCAweDA2NEEsIDB4MDY0QSwgMHgwNjRBLCAweDA2NEEsIDB4MDAyMSwKLSAgICAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsCi0gICAgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLAotICAgIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwKLSAgICAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsCi0gICAgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLAotICAgIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwgMHgyOTg1LCAweDI5ODYsIDB4MzAwMiwKLSAgICAweDMwMEMsIDB4MzAwRCwgMHgzMDAxLCAweDMwRkIsIDB4MzBGMiwgMHgzMEExLCAweDMwQTMsIDB4MzBBNSwgMHgzMEE3LCAweDMwQTksIDB4MzBFMywgMHgzMEU1LCAweDMwRTcsIDB4MzBDMywgMHgzMEZDLCAweDMwQTIsCi0gICAgMHgzMEE0LCAweDMwQTYsIDB4MzBBOCwgMHgzMEFBLCAweDMwQUIsIDB4MzBBRCwgMHgzMEFGLCAweDMwQjEsIDB4MzBCMywgMHgzMEI1LCAweDMwQjcsIDB4MzBCOSwgMHgzMEJCLCAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLAotICAgIDB4MzBDNCwgMHgzMEM2LCAweDMwQzgsIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwKLSAgICAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwgMHgzMEYzLCAweDMwOTksIDB4MzA5QSwgMHgzMTY0LCAweDMxMzEsCi0gICAgMHgzMTMyLCAweDMxMzMsIDB4MzEzNCwgMHgzMTM1LCAweDMxMzYsIDB4MzEzNywgMHgzMTM4LCAweDMxMzksIDB4MzEzQSwgMHgzMTNCLCAweDMxM0MsIDB4MzEzRCwgMHgzMTNFLCAweDMxM0YsIDB4MzE0MCwgMHgzMTQxLAotICAgIDB4MzE0MiwgMHgzMTQzLCAweDMxNDQsIDB4MzE0NSwgMHgzMTQ2LCAweDMxNDcsIDB4MzE0OCwgMHgzMTQ5LCAweDMxNEEsIDB4MzE0QiwgMHgzMTRDLCAweDMxNEQsIDB4MzE0RSwgMHgzMTRGLCAweDMxNTAsIDB4MzE1MSwKLSAgICAweDMxNTIsIDB4MzE1MywgMHgzMTU0LCAweDMxNTUsIDB4MzE1NiwgMHgzMTU3LCAweDMxNTgsIDB4MzE1OSwgMHgzMTVBLCAweDMxNUIsIDB4MzE1QywgMHgzMTVELCAweDMxNUUsIDB4MzE1RiwgMHgzMTYwLCAweDMxNjEsCi0gICAgMHgzMTYyLCAweDMxNjMsIDB4MDBBMiwgMHgwMEEzLCAweDAwQUMsIDB4MDBBRiwgMHgwMEE2LCAweDAwQTUsIDB4MjBBOSwgMHgyNTAyLCAweDIxOTAsIDB4MjE5MSwgMHgyMTkyLCAweDIxOTMsIDB4MjVBMCwgMHgyNUNCCi19OworICAgIDB4MDA2NiwgMHgwMDUzLCAweDAwNTMsIDB4MDA1OSwgMHgwMDIwLCAweDAzMDgsIDB4MDA2MSwgMHgwMDUyLCAweDAzMDQsCisgICAgMHgwMDMyLCAweDAwMzMsIDB4MDMwMSwgMHgwM0JDLCAweDAzMjcsIDB4MDAzMSwgMHgwMDZGLCAweDAwNDEsIDB4MDA0MSwKKyAgICAweDAwNDEsIDB4MDA0MSwgMHgwMDQxLCAweDAwNDEsIDB4MDA0MywgMHgwMDQ1LCAweDAwNDUsIDB4MDA0NSwgMHgwMDQ1LAorICAgIDB4MDA0OSwgMHgwMDQ5LCAweDAwNDksIDB4MDA0OSwgMHgwMDQ0LCAweDAwNEUsIDB4MDA0RiwgMHgwMDRGLCAweDAwNEYsCisgICAgMHgwMDRGLCAweDAwNEYsIDB4MDA0RiwgMHgwMDU1LCAweDAwNTUsIDB4MDA1NSwgMHgwMDU1LCAweDAwNTksIDB4MDA2MSwKKyAgICAweDAwNjEsIDB4MDA2MSwgMHgwMDYxLCAweDAwNjEsIDB4MDA2MSwgMHgwMDYzLCAweDAwNjUsIDB4MDA2NSwgMHgwMDY1LAorICAgIDB4MDA2NSwgMHgwMDY5LCAweDAwNjksIDB4MDA2OSwgMHgwMDY5LCAweDAwNkUsIDB4MDA2RiwgMHgwMDZGLCAweDAwNkYsCisgICAgMHgwMDZGLCAweDAwNkYsIDB4MDA2RiwgMHgwMDc1LCAweDAwNzUsIDB4MDA3NSwgMHgwMDc1LCAweDAwNzksIDB4MDA3OSwKKyAgICAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDMsIDB4MDA2MywgMHgwMDQzLAorICAgIDB4MDA2MywgMHgwMDQzLCAweDAwNjMsIDB4MDA0MywgMHgwMDYzLCAweDAwNDQsIDB4MDA2NCwgMHgwMDQ0LCAweDAwNjQsCisgICAgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwKKyAgICAweDAwNjUsIDB4MDA0NywgMHgwMDY3LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ3LCAweDAwNjcsIDB4MDA0NywgMHgwMDY3LAorICAgIDB4MDA0OCwgMHgwMDY4LCAweDAwNDgsIDB4MDA2OCwgMHgwMDQ5LCAweDAwNjksIDB4MDA0OSwgMHgwMDY5LCAweDAwNDksCisgICAgMHgwMDY5LCAweDAwNDksIDB4MDA2OSwgMHgwMDQ5LCAweDAwNEEsIDB4MDA2QSwgMHgwMDRCLCAweDAwNkIsIDB4MDA0QiwKKyAgICAweDAwNEMsIDB4MDA2QywgMHgwMDRDLCAweDAwNkMsIDB4MDA0QywgMHgwMDZDLCAweDAwNEMsIDB4MDA2QywgMHgwMDRDLAorICAgIDB4MDA2QywgMHgwMDRFLCAweDAwNkUsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEUsIDB4MDA2RSwgMHgwMDZFLCAweDAwNEYsCisgICAgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTIsIDB4MDA3MiwKKyAgICAweDAwNTIsIDB4MDA3MiwgMHgwMDUzLCAweDAwNzMsIDB4MDA1MywgMHgwMDczLCAweDAwNTMsIDB4MDA3MywgMHgwMDUzLAorICAgIDB4MDA3MywgMHgwMDU0LCAweDAwNzQsIDB4MDA1NCwgMHgwMDc0LCAweDAwNTQsIDB4MDA3NCwgMHgwMDU1LCAweDAwNzUsCisgICAgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwKKyAgICAweDAwNzUsIDB4MDA1NywgMHgwMDc3LCAweDAwNTksIDB4MDA3OSwgMHgwMDU5LCAweDAwNUEsIDB4MDA3QSwgMHgwMDVBLAorICAgIDB4MDA3QSwgMHgwMDVBLCAweDAwN0EsIDB4MDA3MywgMHgwMDYyLCAweDAwNDIsIDB4MDA0MiwgMHgwMDYyLCAweDAwNDMsCisgICAgMHgwMDYzLCAweDAwNDQsIDB4MDA0NCwgMHgwMDQ0LCAweDAwNjQsIDB4MDA0NSwgMHgwMDQ1LCAweDAwNDYsIDB4MDA2NiwKKyAgICAweDAwNDcsIDB4MDA0OSwgMHgwMDRCLCAweDAwNkIsIDB4MDA2QywgMHgwMDRELCAweDAwNEUsIDB4MDA2RSwgMHgwMDRGLAorICAgIDB4MDA0RiwgMHgwMDZGLCAweDAwNTAsIDB4MDA3MCwgMHgwMjgzLCAweDAwNzQsIDB4MDA1NCwgMHgwMDc0LCAweDAwNTQsCisgICAgMHgwMDU1LCAweDAwNzUsIDB4MDA1NiwgMHgwMDU5LCAweDAwNzksIDB4MDA1QSwgMHgwMDdBLCAweDAxQjcsIDB4MDA0MSwKKyAgICAweDAwNjEsIDB4MDA0OSwgMHgwMDY5LCAweDAwNEYsIDB4MDA2RiwgMHgwMDU1LCAweDAwNzUsIDB4MDBEQywgMHgwMEZDLAorICAgIDB4MDBEQywgMHgwMEZDLCAweDAwREMsIDB4MDBGQywgMHgwMERDLCAweDAwRkMsIDB4MDA2NSwgMHgwMDQxLCAweDAwNjEsCisgICAgMHgwMDQxLCAweDAwNjEsIDB4MDBDNiwgMHgwMEU2LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ3LCAweDAwNjcsIDB4MDA0QiwKKyAgICAweDAwNkIsIDB4MDA0RiwgMHgwMDZGLCAweDAxRUEsIDB4MDFFQiwgMHgwMUI3LCAweDAyOTIsIDB4MDA2QSwgMHgwMDQ3LAorICAgIDB4MDA2NywgMHgwMDRFLCAweDAwNkUsIDB4MDA0MSwgMHgwMDYxLCAweDAwQzYsIDB4MDBFNiwgMHgwMEQ4LCAweDAwRjgsCisgICAgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0OSwKKyAgICAweDAwNjksIDB4MDA0OSwgMHgwMDY5LCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA1MiwgMHgwMDcyLAorICAgIDB4MDA1MiwgMHgwMDcyLCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1MywgMHgwMDczLCAweDAwNTQsCisgICAgMHgwMDc0LCAweDAwNDgsIDB4MDA2OCwgMHgwMDRFLCAweDAwNjQsIDB4MDA1QSwgMHgwMDdBLCAweDAwNDEsIDB4MDA2MSwKKyAgICAweDAwNDUsIDB4MDA2NSwgMHgwMEQ2LCAweDAwRjYsIDB4MDBENSwgMHgwMEY1LCAweDAwNEYsIDB4MDA2RiwgMHgwMjJFLAorICAgIDB4MDIyRiwgMHgwMDU5LCAweDAwNzksIDB4MDA2QywgMHgwMDZFLCAweDAwNzQsIDB4MDA2QSwgMHgwMDQxLCAweDAwNDMsCisgICAgMHgwMDYzLCAweDAwNEMsIDB4MDA1NCwgMHgwMDUzLCAweDAwNUEsIDB4MDA0MiwgMHgwMDU1LCAweDAwNTYsIDB4MDA0NSwKKyAgICAweDAwNjUsIDB4MDA0QSwgMHgwMDZBLCAweDAwNTEsIDB4MDA3MSwgMHgwMDUyLCAweDAwNzIsIDB4MDA1OSwgMHgwMDc5LAorICAgIDB4MDA2MSwgMHgwMjUxLCAweDAwNjIsIDB4MDA2RiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NCwgMHgwMDY1LCAweDAyNTksCisgICAgMHgwMDY1LCAweDAwNjUsIDB4MDA2NSwgMHgwMDY1LCAweDAwNkEsIDB4MDA2NywgMHgwMDY3LCAweDAwNDcsIDB4MDA2OCwKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDQ5LCAweDAwNkMsIDB4MDA2QywgMHgwMDZDLCAweDAwNkQsIDB4MDA2RCwgMHgwMDZELAorICAgIDB4MDA2RSwgMHgwMDZFLCAweDAwNkUsIDB4MDA2RiwgMHgwMDcyLCAweDAwNzIsIDB4MDA3MiwgMHgwMDcyLCAweDAwNzIsCisgICAgMHgwMDcyLCAweDAwNzIsIDB4MDA1MiwgMHgwMDUyLCAweDAwNzMsIDB4MDA2QSwgMHgwMjgzLCAweDAyODMsIDB4MDA3NCwKKyAgICAweDAwNzQsIDB4MDA1NSwgMHgwMDc2LCAweDAwNzYsIDB4MDA3NywgMHgwMDc5LCAweDAwNTksIDB4MDA3QSwgMHgwMDdBLAorICAgIDB4MDI5MiwgMHgwMDQzLCAweDAwNDIsIDB4MDA2NSwgMHgwMDQ3LCAweDAwNDgsIDB4MDA2QSwgMHgwMDZCLCAweDAwNEMsCisgICAgMHgwMDcxLCAweDAwNjgsIDB4MDA2OCwgMHgwMDY4LCAweDAwNjgsIDB4MDA2QSwgMHgwMDcyLCAweDAyNzksIDB4MDI3QiwKKyAgICAweDAyODEsIDB4MDA3NywgMHgwMDc5LCAweDAyNjMsIDB4MDA2QywgMHgwMDczLCAweDAwNzgsIDB4MDI5NSwgMHgwMzAwLAorICAgIDB4MDMwMSwgMHgwMzEzLCAweDAzMDgsIDB4MDA2MSwgMHgwMDY1LCAweDAwNjksIDB4MDA2RiwgMHgwMDc1LCAweDAwNjMsCisgICAgMHgwMDY0LCAweDAwNjgsIDB4MDA2RCwgMHgwMDcyLCAweDAwNzQsIDB4MDA3NiwgMHgwMDc4LCAweDAyQjksIDB4MDAzQiwKKyAgICAweDAwMjAsIDB4MDBBOCwgMHgwMzkxLCAweDAwQjcsIDB4MDM5NSwgMHgwMzk3LCAweDAzOTksIDB4MDM5RiwgMHgwM0E1LAorICAgIDB4MDNBOSwgMHgwM0NBLCAweDAzOTksIDB4MDNBNSwgMHgwM0IxLCAweDAzQjUsIDB4MDNCNywgMHgwM0I5LCAweDAzQ0IsCisgICAgMHgwM0I5LCAweDAzQzUsIDB4MDNCRiwgMHgwM0M1LCAweDAzQzksIDB4MDNCMiwgMHgwM0I4LCAweDAzQTUsIDB4MDNEMiwKKyAgICAweDAzRDIsIDB4MDNDNiwgMHgwM0MwLCAweDAzQkEsIDB4MDNDMSwgMHgwM0MyLCAweDAzOTgsIDB4MDNCNSwgMHgwM0EzLAorICAgIDB4MDQxNSwgMHgwNDE1LCAweDA0MTMsIDB4MDQwNiwgMHgwNDFBLCAweDA0MTgsIDB4MDQyMywgMHgwNDE4LCAweDA0MzgsCisgICAgMHgwNDM1LCAweDA0MzUsIDB4MDQzMywgMHgwNDU2LCAweDA0M0EsIDB4MDQzOCwgMHgwNDQzLCAweDA0NjYsIDB4MDQ2NywKKyAgICAweDA0NkEsIDB4MDQ2QiwgMHgwNDc0LCAweDA0NzUsIDB4MDQ2MCwgMHgwNDYxLCAweDA0MTksIDB4MDQzOSwgMHgwNDIwLAorICAgIDB4MDQ0MCwgMHgwNDEzLCAweDA0MzMsIDB4MDQxMywgMHgwNDMzLCAweDA0MTMsIDB4MDQzMywgMHgwNDE2LCAweDA0MzYsCisgICAgMHgwNDE3LCAweDA0MzcsIDB4MDQxQSwgMHgwNDNBLCAweDA0MUEsIDB4MDQzQSwgMHgwNDFBLCAweDA0M0EsIDB4MDQxQSwKKyAgICAweDA0M0EsIDB4MDQxRCwgMHgwNDNELCAweDA0MUYsIDB4MDQzRiwgMHgwNDIxLCAweDA0NDEsIDB4MDQyMiwgMHgwNDQyLAorICAgIDB4MDRBRSwgMHgwNEFGLCAweDA0MjUsIDB4MDQ0NSwgMHgwNDI3LCAweDA0NDcsIDB4MDQyNywgMHgwNDQ3LCAweDA0MTYsCisgICAgMHgwNDM2LCAweDA0QkMsIDB4MDRCRCwgMHgwNDE2LCAweDA0MzYsIDB4MDQxQSwgMHgwNDNBLCAweDA0MUIsIDB4MDQzQiwKKyAgICAweDA0MUQsIDB4MDQzRCwgMHgwNDFELCAweDA0M0QsIDB4MDQxQywgMHgwNDNDLCAweDA0MTAsIDB4MDQzMCwgMHgwNDEwLAorICAgIDB4MDQzMCwgMHgwNDE1LCAweDA0MzUsIDB4MDREOCwgMHgwNEQ5LCAweDA0MTYsIDB4MDQzNiwgMHgwNDE3LCAweDA0MzcsCisgICAgMHgwNDE4LCAweDA0MzgsIDB4MDQxOCwgMHgwNDM4LCAweDA0MUUsIDB4MDQzRSwgMHgwNEU4LCAweDA0RTksIDB4MDQyRCwKKyAgICAweDA0NEQsIDB4MDQyMywgMHgwNDQzLCAweDA0MjMsIDB4MDQ0MywgMHgwNDIzLCAweDA0NDMsIDB4MDQyNywgMHgwNDQ3LAorICAgIDB4MDQxMywgMHgwNDMzLCAweDA0MkIsIDB4MDQ0QiwgMHgwNDEzLCAweDA0MzMsIDB4MDQyNSwgMHgwNDQ1LCAweDA0MjUsCisgICAgMHgwNDQ1LCAweDA0MTcsIDB4MDQzNywgMHgwNDFCLCAweDA0M0IsIDB4MEYwQiwgMHgxMERDLCAweDAwNDEsIDB4MDBDNiwKKyAgICAweDAwNDIsIDB4MDA0MiwgMHgwMDQ0LCAweDAwNDUsIDB4MDE4RSwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLAorICAgIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAyMjIsIDB4MDA1MCwgMHgwMDUyLCAweDAwNTQsCisgICAgMHgwMDU1LCAweDAwNTcsIDB4MDA2MSwgMHgwMjUwLCAweDAyNTEsIDB4MUQwMiwgMHgwMDYyLCAweDAwNjQsIDB4MDA2NSwKKyAgICAweDAyNTksIDB4MDI1QiwgMHgwMjVDLCAweDAwNjcsIDB4MDA2QiwgMHgwMDZELCAweDAxNEIsIDB4MDA2RiwgMHgwMjU0LAorICAgIDB4MUQxNiwgMHgxRDE3LCAweDAwNzAsIDB4MDA3NCwgMHgwMDc1LCAweDFEMUQsIDB4MDI2RiwgMHgwMDc2LCAweDFEMjUsCisgICAgMHgwM0IyLCAweDAzQjMsIDB4MDNCNCwgMHgwM0M2LCAweDAzQzcsIDB4MDA2OSwgMHgwMDcyLCAweDAwNzUsIDB4MDA3NiwKKyAgICAweDAzQjIsIDB4MDNCMywgMHgwM0MxLCAweDAzQzYsIDB4MDNDNywgMHgwMDYyLCAweDAwNjQsIDB4MDA2NiwgMHgwMDZELAorICAgIDB4MDA2RSwgMHgwMDcwLCAweDAwNzIsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3QSwgMHgwMDY3LCAweDA0M0QsCisgICAgMHgwMDRDLCAweDAwNzAsIDB4MDA1NSwgMHgwMjhBLCAweDAwNjIsIDB4MDA2NCwgMHgwMDY2LCAweDAwNjcsIDB4MDA2QiwKKyAgICAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNzAsIDB4MDA3MiwgMHgwMDczLCAweDAyODMsIDB4MDA3NiwgMHgwMDc4LAorICAgIDB4MDA3QSwgMHgwMDYxLCAweDAyNTEsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjUsIDB4MDA2NSwgMHgwMDY1LCAweDAwNjksCisgICAgMHgwMjgzLCAweDAyNTIsIDB4MDA2MywgMHgwMjU1LCAweDAwRjAsIDB4MDI1QywgMHgwMDY2LCAweDAyNUYsIDB4MDI2MSwKKyAgICAweDAyNjUsIDB4MDI2OCwgMHgwMjY5LCAweDAyNkEsIDB4MUQ3QiwgMHgwMjlELCAweDAyNkQsIDB4MUQ4NSwgMHgwMjlGLAorICAgIDB4MDI3MSwgMHgwMjcwLCAweDAyNzIsIDB4MDI3MywgMHgwMjc0LCAweDAyNzUsIDB4MDI3OCwgMHgwMjgyLCAweDAyODMsCisgICAgMHgwMUFCLCAweDAyODksIDB4MDI4QSwgMHgxRDFDLCAweDAyOEIsIDB4MDI4QywgMHgwMDdBLCAweDAyOTAsIDB4MDI5MSwKKyAgICAweDAyOTIsIDB4MDNCOCwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MiwgMHgwMDYyLCAweDAwNDIsIDB4MDA2MiwgMHgwMDQyLAorICAgIDB4MDA2MiwgMHgwMDQzLCAweDAwNjMsIDB4MDA0NCwgMHgwMDY0LCAweDAwNDQsIDB4MDA2NCwgMHgwMDQ0LCAweDAwNjQsCisgICAgMHgwMDQ0LCAweDAwNjQsIDB4MDA0NCwgMHgwMDY0LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwKKyAgICAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAyMjgsIDB4MDIyOSwgMHgwMDQ2LCAweDAwNjYsIDB4MDA0NywgMHgwMDY3LAorICAgIDB4MDA0OCwgMHgwMDY4LCAweDAwNDgsIDB4MDA2OCwgMHgwMDQ4LCAweDAwNjgsIDB4MDA0OCwgMHgwMDY4LCAweDAwNDgsCisgICAgMHgwMDY4LCAweDAwNDksIDB4MDA2OSwgMHgwMENGLCAweDAwRUYsIDB4MDA0QiwgMHgwMDZCLCAweDAwNEIsIDB4MDA2QiwKKyAgICAweDAwNEIsIDB4MDA2QiwgMHgwMDRDLCAweDAwNkMsIDB4MDA0QywgMHgwMDZDLCAweDAwNEMsIDB4MDA2QywgMHgwMDRDLAorICAgIDB4MDA2QywgMHgwMDRELCAweDAwNkQsIDB4MDA0RCwgMHgwMDZELCAweDAwNEQsIDB4MDA2RCwgMHgwMDRFLCAweDAwNkUsCisgICAgMHgwMDRFLCAweDAwNkUsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEUsIDB4MDA2RSwgMHgwMEQ1LCAweDAwRjUsIDB4MDBENSwKKyAgICAweDAwRjUsIDB4MDE0QywgMHgwMTRELCAweDAxNEMsIDB4MDE0RCwgMHgwMDUwLCAweDAwNzAsIDB4MDA1MCwgMHgwMDcwLAorICAgIDB4MDA1MiwgMHgwMDcyLCAweDAwNTIsIDB4MDA3MiwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTMsCisgICAgMHgwMDczLCAweDAwNTMsIDB4MDA3MywgMHgwMDUzLCAweDAwNzMsIDB4MDA1MywgMHgwMDczLCAweDAwNTMsIDB4MDA3MywKKyAgICAweDAwNTQsIDB4MDA3NCwgMHgwMDU0LCAweDAwNzQsIDB4MDA1NCwgMHgwMDc0LCAweDAwNTQsIDB4MDA3NCwgMHgwMDU1LAorICAgIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAxNjgsIDB4MDE2OSwgMHgwMTZBLCAweDAxNkIsCisgICAgMHgwMDU2LCAweDAwNzYsIDB4MDA1NiwgMHgwMDc2LCAweDAwNTcsIDB4MDA3NywgMHgwMDU3LCAweDAwNzcsIDB4MDA1NywKKyAgICAweDAwNzcsIDB4MDA1NywgMHgwMDc3LCAweDAwNTcsIDB4MDA3NywgMHgwMDU4LCAweDAwNzgsIDB4MDA1OCwgMHgwMDc4LAorICAgIDB4MDA1OSwgMHgwMDc5LCAweDAwNUEsIDB4MDA3QSwgMHgwMDVBLCAweDAwN0EsIDB4MDA1QSwgMHgwMDdBLCAweDAwNjgsCisgICAgMHgwMDc0LCAweDAwNzcsIDB4MDA3OSwgMHgwMDYxLCAweDAxN0YsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwKKyAgICAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLAorICAgIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsCisgICAgMHgwMDQxLCAweDAwNjEsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwKKyAgICAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LAorICAgIDB4MDA0OSwgMHgwMDY5LCAweDAwNDksIDB4MDA2OSwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsCisgICAgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwKKyAgICAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLAorICAgIDB4MDA2RiwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsCisgICAgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU5LCAweDAwNzksIDB4MDA1OSwKKyAgICAweDAwNzksIDB4MDA1OSwgMHgwMDc5LCAweDAwNTksIDB4MDA3OSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLAorICAgIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsCisgICAgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwM0I1LCAweDAzQjUsIDB4MDNCNSwgMHgwM0I1LCAweDAzQjUsIDB4MDNCNSwKKyAgICAweDAzOTUsIDB4MDM5NSwgMHgwMzk1LCAweDAzOTUsIDB4MDM5NSwgMHgwMzk1LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LAorICAgIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsCisgICAgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzQjksIDB4MDNCOSwgMHgwM0I5LCAweDAzQjksIDB4MDNCOSwKKyAgICAweDAzQjksIDB4MDNCOSwgMHgwM0I5LCAweDAzOTksIDB4MDM5OSwgMHgwMzk5LCAweDAzOTksIDB4MDM5OSwgMHgwMzk5LAorICAgIDB4MDM5OSwgMHgwMzk5LCAweDAzQkYsIDB4MDNCRiwgMHgwM0JGLCAweDAzQkYsIDB4MDNCRiwgMHgwM0JGLCAweDAzOUYsCisgICAgMHgwMzlGLCAweDAzOUYsIDB4MDM5RiwgMHgwMzlGLCAweDAzOUYsIDB4MDNDNSwgMHgwM0M1LCAweDAzQzUsIDB4MDNDNSwKKyAgICAweDAzQzUsIDB4MDNDNSwgMHgwM0M1LCAweDAzQzUsIDB4MDNBNSwgMHgwM0E1LCAweDAzQTUsIDB4MDNBNSwgMHgwM0M5LAorICAgIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0E5LCAweDAzQTksCisgICAgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCNSwKKyAgICAweDAzQjUsIDB4MDNCNywgMHgwM0I3LCAweDAzQjksIDB4MDNCOSwgMHgwM0JGLCAweDAzQkYsIDB4MDNDNSwgMHgwM0M1LAorICAgIDB4MDNDOSwgMHgwM0M5LCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsCisgICAgMHgwM0IxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwKKyAgICAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwMzk3LAorICAgIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwM0M5LCAweDAzQzksCisgICAgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwKKyAgICAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLAorICAgIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLCAweDAzQjcsCisgICAgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzOTUsIDB4MDM5NSwgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywKKyAgICAweDAzQjksIDB4MDNCOSwgMHgwM0I5LCAweDAzQjksIDB4MDNCOSwgMHgwM0I5LCAweDAzOTksIDB4MDM5OSwgMHgwMzk5LAorICAgIDB4MDM5OSwgMHgwM0M1LCAweDAzQzUsIDB4MDNDNSwgMHgwM0M1LCAweDAzQzEsIDB4MDNDMSwgMHgwM0M1LCAweDAzQzUsCisgICAgMHgwM0E1LCAweDAzQTUsIDB4MDNBNSwgMHgwM0E1LCAweDAzQTEsIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwKKyAgICAweDAzQzksIDB4MDM5RiwgMHgwMzlGLCAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAwQjQsIDB4MDMxNCwgMHgwMDIwLAorICAgIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsCisgICAgMHgwMDIwLCAweDIwMTAsIDB4MDMzMywgMHgwMDJFLCAweDAwMjAsIDB4MDAyMCwgMHgwMDMwLCAweDAwNjksIDB4MDAzNCwKKyAgICAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDJCLCAweDIyMTIsIDB4MDAzRCwgMHgwMDI4LAorICAgIDB4MDAyOSwgMHgwMDZFLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsCisgICAgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDJCLCAweDIyMTIsIDB4MDAzRCwgMHgwMDI4LCAweDAwMjksIDB4MDA2MSwKKyAgICAweDAwNjUsIDB4MDA2RiwgMHgwMDc4LCAweDAyNTksIDB4MDA0MywgMHgwMTkwLCAweDAwNjcsIDB4MDA0OCwgMHgwMDQ4LAorICAgIDB4MDA0OCwgMHgwMDY4LCAweDAwNjgsIDB4MDA0OSwgMHgwMDQ5LCAweDAwNEMsIDB4MDA2QywgMHgwMDRFLCAweDAwNTAsCisgICAgMHgwMDUxLCAweDAwNTIsIDB4MDA1MiwgMHgwMDUyLCAweDAwNTIsIDB4MDA1MiwgMHgwMDU2LCAweDAwNUEsIDB4MDNBOSwKKyAgICAweDAxQjEsIDB4MDA1QSwgMHgwMDRCLCAweDAwQzUsIDB4MDA0MiwgMHgwMDQzLCAweDAwNjUsIDB4MDA2NSwgMHgwMDQ1LAorICAgIDB4MDA0NiwgMHgwMDRELCAweDAwNkYsIDB4MDVEMCwgMHgwNUQxLCAweDA1RDIsIDB4MDVEMywgMHgwMDY5LCAweDAzQzAsCisgICAgMHgwM0IzLCAweDAzOTMsIDB4MDNBMCwgMHgyMjExLCAweDAwNDQsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjksIDB4MDA2QSwKKyAgICAweDAwNDksIDB4MDA1NiwgMHgwMDU4LCAweDAwNEMsIDB4MDA0MywgMHgwMDQ0LCAweDAwNEQsIDB4MDA2OSwgMHgwMDc2LAorICAgIDB4MDA3OCwgMHgwMDZDLCAweDAwNjMsIDB4MDA2NCwgMHgwMDZELCAweDIyMDMsIDB4MjIwOCwgMHgyMjBCLCAweDMwMDgsCisgICAgMHgzMDA5LCAweDAwNjIsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsCisgICAgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwKKyAgICAweDAwNUEsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LAorICAgIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsCisgICAgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LAorICAgIDB4MDAzOSwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwNEMsIDB4MDA2QywgMHgwMDRDLCAweDAwNTAsIDB4MDA1MiwgMHgwMDYxLCAweDAwNzQsCisgICAgMHgwMDQ4LCAweDAwNjgsIDB4MDA0QiwgMHgwMDZCLCAweDAwNUEsIDB4MDA3QSwgMHgwMDc2LCAweDAwNTcsIDB4MDA1OCwKKyAgICAweDAwNzYsIDB4MDA2QSwgMHgwMDU2LCAweDJENjEsIDB4NkJDRCwgMHg2QzExLCAweDg2NEUsIDB4ODk3RiwgMHg4OUQyLAorICAgIDB4OTU3RiwgMHg5NzUyLCAweDk4REYsIDB4OUFBOCwgMHg5QjNDLCAweDlFQTYsIDB4OUVDNCwgMHg5RjlGLCAweDRFMDAsCisgICAgMHg0RTI4LCAweDRFMzYsIDB4NEUzRiwgMHg0RTU5LCAweDRFODUsIDB4NEU4QywgMHg0RUEwLCAweDRFQkEsIDB4NTEzRiwKKyAgICAweDUxNjUsIDB4NTE2QiwgMHg1MTgyLCAweDUxOTYsIDB4NTFBQiwgMHg1MUUwLCAweDUxRjUsIDB4NTIwMCwgMHg1MjlCLAorICAgIDB4NTJGOSwgMHg1MzE1LCAweDUzMUEsIDB4NTMzOCwgMHg1MzQxLCAweDUzNUMsIDB4NTM2OSwgMHg1MzgyLCAweDUzQjYsCisgICAgMHg1M0M4LCAweDUzRTMsIDB4NTZENywgMHg1NzFGLCAweDU4RUIsIDB4NTkwMiwgMHg1OTBBLCAweDU5MTUsIDB4NTkyNywKKyAgICAweDU5NzMsIDB4NUI1MCwgMHg1QjgwLCAweDVCRjgsIDB4NUMwRiwgMHg1QzIyLCAweDVDMzgsIDB4NUM2RSwgMHg1QzcxLAorICAgIDB4NUREQiwgMHg1REU1LCAweDVERjEsIDB4NURGRSwgMHg1RTcyLCAweDVFN0EsIDB4NUU3RiwgMHg1RUY0LCAweDVFRkUsCisgICAgMHg1RjBCLCAweDVGMTMsIDB4NUY1MCwgMHg1RjYxLCAweDVGNzMsIDB4NUZDMywgMHg2MjA4LCAweDYyMzYsIDB4NjI0QiwKKyAgICAweDY1MkYsIDB4NjUzNCwgMHg2NTg3LCAweDY1OTcsIDB4NjVBNCwgMHg2NUI5LCAweDY1RTAsIDB4NjVFNSwgMHg2NkYwLAorICAgIDB4NjcwOCwgMHg2NzI4LCAweDZCMjAsIDB4NkI2MiwgMHg2Qjc5LCAweDZCQjMsIDB4NkJDQiwgMHg2QkQ0LCAweDZCREIsCisgICAgMHg2QzBGLCAweDZDMTQsIDB4NkMzNCwgMHg3MDZCLCAweDcyMkEsIDB4NzIzNiwgMHg3MjNCLCAweDcyM0YsIDB4NzI0NywKKyAgICAweDcyNTksIDB4NzI1QiwgMHg3MkFDLCAweDczODQsIDB4NzM4OSwgMHg3NERDLCAweDc0RTYsIDB4NzUxOCwgMHg3NTFGLAorICAgIDB4NzUyOCwgMHg3NTMwLCAweDc1OEIsIDB4NzU5MiwgMHg3Njc2LCAweDc2N0QsIDB4NzZBRSwgMHg3NkJGLCAweDc2RUUsCisgICAgMHg3N0RCLCAweDc3RTIsIDB4NzdGMywgMHg3OTNBLCAweDc5QjgsIDB4NzlCRSwgMHg3QTc0LCAweDdBQ0IsIDB4N0FGOSwKKyAgICAweDdDNzMsIDB4N0NGOCwgMHg3RjM2LCAweDdGNTEsIDB4N0Y4QSwgMHg3RkJELCAweDgwMDEsIDB4ODAwQywgMHg4MDEyLAorICAgIDB4ODAzMywgMHg4MDdGLCAweDgwODksIDB4ODFFMywgMHg4MUVBLCAweDgxRjMsIDB4ODFGQywgMHg4MjBDLCAweDgyMUIsCisgICAgMHg4MjFGLCAweDgyNkUsIDB4ODI3MiwgMHg4Mjc4LCAweDg2NEQsIDB4ODY2QiwgMHg4ODQwLCAweDg4NEMsIDB4ODg2MywKKyAgICAweDg5N0UsIDB4ODk4QiwgMHg4OUQyLCAweDhBMDAsIDB4OEMzNywgMHg4QzQ2LCAweDhDNTUsIDB4OEM3OCwgMHg4QzlELAorICAgIDB4OEQ2NCwgMHg4RDcwLCAweDhEQjMsIDB4OEVBQiwgMHg4RUNBLCAweDhGOUIsIDB4OEZCMCwgMHg4RkI1LCAweDkwOTEsCisgICAgMHg5MTQ5LCAweDkxQzYsIDB4OTFDQywgMHg5MUQxLCAweDk1NzcsIDB4OTU4MCwgMHg5NjFDLCAweDk2QjYsIDB4OTZCOSwKKyAgICAweDk2RTgsIDB4OTc1MSwgMHg5NzVFLCAweDk3NjIsIDB4OTc2OSwgMHg5N0NCLCAweDk3RUQsIDB4OTdGMywgMHg5ODAxLAorICAgIDB4OThBOCwgMHg5OERCLCAweDk4REYsIDB4OTk5NiwgMHg5OTk5LCAweDk5QUMsIDB4OUFBOCwgMHg5QUQ4LCAweDlBREYsCisgICAgMHg5QjI1LCAweDlCMkYsIDB4OUIzMiwgMHg5QjNDLCAweDlCNUEsIDB4OUNFNSwgMHg5RTc1LCAweDlFN0YsIDB4OUVBNSwKKyAgICAweDlFQkIsIDB4OUVDMywgMHg5RUNELCAweDlFRDEsIDB4OUVGOSwgMHg5RUZELCAweDlGMEUsIDB4OUYxMywgMHg5RjIwLAorICAgIDB4OUYzQiwgMHg5RjRBLCAweDlGNTIsIDB4OUY4RCwgMHg5RjlDLCAweDlGQTAsIDB4MDAyMCwgMHgzMDEyLCAweDUzNDEsCisgICAgMHg1MzQ0LCAweDUzNDUsIDB4MTEwMCwgMHgxMTAxLCAweDExQUEsIDB4MTEwMiwgMHgxMUFDLCAweDExQUQsIDB4MTEwMywKKyAgICAweDExMDQsIDB4MTEwNSwgMHgxMUIwLCAweDExQjEsIDB4MTFCMiwgMHgxMUIzLCAweDExQjQsIDB4MTFCNSwgMHgxMTFBLAorICAgIDB4MTEwNiwgMHgxMTA3LCAweDExMDgsIDB4MTEyMSwgMHgxMTA5LCAweDExMEEsIDB4MTEwQiwgMHgxMTBDLCAweDExMEQsCisgICAgMHgxMTBFLCAweDExMEYsIDB4MTExMCwgMHgxMTExLCAweDExMTIsIDB4MTE2MSwgMHgxMTYyLCAweDExNjMsIDB4MTE2NCwKKyAgICAweDExNjUsIDB4MTE2NiwgMHgxMTY3LCAweDExNjgsIDB4MTE2OSwgMHgxMTZBLCAweDExNkIsIDB4MTE2QywgMHgxMTZELAorICAgIDB4MTE2RSwgMHgxMTZGLCAweDExNzAsIDB4MTE3MSwgMHgxMTcyLCAweDExNzMsIDB4MTE3NCwgMHgxMTc1LCAweDExNjAsCisgICAgMHgxMTE0LCAweDExMTUsIDB4MTFDNywgMHgxMUM4LCAweDExQ0MsIDB4MTFDRSwgMHgxMUQzLCAweDExRDcsIDB4MTFEOSwKKyAgICAweDExMUMsIDB4MTFERCwgMHgxMURGLCAweDExMUQsIDB4MTExRSwgMHgxMTIwLCAweDExMjIsIDB4MTEyMywgMHgxMTI3LAorICAgIDB4MTEyOSwgMHgxMTJCLCAweDExMkMsIDB4MTEyRCwgMHgxMTJFLCAweDExMkYsIDB4MTEzMiwgMHgxMTM2LCAweDExNDAsCisgICAgMHgxMTQ3LCAweDExNEMsIDB4MTFGMSwgMHgxMUYyLCAweDExNTcsIDB4MTE1OCwgMHgxMTU5LCAweDExODQsIDB4MTE4NSwKKyAgICAweDExODgsIDB4MTE5MSwgMHgxMTkyLCAweDExOTQsIDB4MTE5RSwgMHgxMUExLCAweDRFMDAsIDB4NEU4QywgMHg0RTA5LAorICAgIDB4NTZEQiwgMHg0RTBBLCAweDRFMkQsIDB4NEUwQiwgMHg3NTMyLCAweDRFNTksIDB4NEUxOSwgMHg0RTAxLCAweDU5MjksCisgICAgMHg1NzMwLCAweDRFQkEsIDB4NTU0RiwgMHg1RTdDLCAweDY1ODcsIDB4N0I4RiwgMHgxMTAwLCAweDExMDIsIDB4MTEwMywKKyAgICAweDExMDUsIDB4MTEwNiwgMHgxMTA3LCAweDExMDksIDB4MTEwQiwgMHgxMTBDLCAweDExMEUsIDB4MTEwRiwgMHgxMTEwLAorICAgIDB4MTExMSwgMHgxMTEyLCAweDRFMDAsIDB4NEU4QywgMHg0RTA5LCAweDU2REIsIDB4NEU5NCwgMHg1MTZELCAweDRFMDMsCisgICAgMHg1MTZCLCAweDRFNUQsIDB4NTM0MSwgMHg2NzA4LCAweDcwNkIsIDB4NkMzNCwgMHg2NzI4LCAweDkxRDEsIDB4NTcxRiwKKyAgICAweDY1RTUsIDB4NjgyQSwgMHg2NzA5LCAweDc5M0UsIDB4NTQwRCwgMHg3Mjc5LCAweDhDQTEsIDB4Nzk1RCwgMHg1MkI0LAorICAgIDB4NzlEOCwgMHg3NTM3LCAweDU5NzMsIDB4OTA2OSwgMHg1MTJBLCAweDUzNzAsIDB4NkNFOCwgMHg5ODA1LCAweDRGMTEsCisgICAgMHg1MTk5LCAweDZCNjMsIDB4NEUwQSwgMHg0RTJELCAweDRFMEIsIDB4NURFNiwgMHg1M0YzLCAweDUzM0IsIDB4NUI5NywKKyAgICAweDVCNjYsIDB4NzZFMywgMHg0RjAxLCAweDhDQzcsIDB4NTM1NCwgMHg1OTFDLCAweDMwQTIsIDB4MzBBNCwgMHgzMEE2LAorICAgIDB4MzBBOCwgMHgzMEFBLCAweDMwQUIsIDB4MzBBRCwgMHgzMEFGLCAweDMwQjEsIDB4MzBCMywgMHgzMEI1LCAweDMwQjcsCisgICAgMHgzMEI5LCAweDMwQkIsIDB4MzBCRCwgMHgzMEJGLCAweDMwQzEsIDB4MzBDNCwgMHgzMEM2LCAweDMwQzgsIDB4MzBDQSwKKyAgICAweDMwQ0IsIDB4MzBDQywgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwgMHgzMEQyLCAweDMwRDUsIDB4MzBEOCwgMHgzMERCLAorICAgIDB4MzBERSwgMHgzMERGLCAweDMwRTAsIDB4MzBFMSwgMHgzMEUyLCAweDMwRTQsIDB4MzBFNiwgMHgzMEU4LCAweDMwRTksCisgICAgMHgzMEVBLCAweDMwRUIsIDB4MzBFQywgMHgzMEVELCAweDMwRUYsIDB4MzBGMCwgMHgzMEYxLCAweDMwRjIsIDB4NEUyMiwKKyAgICAweDVFNzYsIDB4NUU3QSwgMHg1RTcyLCAweDRFNzEsIDB4NEU5OCwgMHg0RTlBLCAweDRGMkIsIDB4NUUwMywgMHg1MzYwLAorICAgIDB4Njc2NSwgMHg0RkEzLCAweDRGRTMsIDB4N0NGQiwgMHg0RkEwLCAweDRGMjUsIDB4NEZFOSwgMHg0RUQzLCAweDRFMkEsCisgICAgMHg0RUVDLCAweDRGMjYsIDB4NEYxRiwgMHg0RkE3LCAweDRGQTYsIDB4NEYyQSwgMHg2NzcwLCAweDRGMjcsIDB4NEYxRSwKKyAgICAweDU5MDcsIDB4NUJCNiwgMHg0RjYzLCAweDUwNkMsIDB4NEYyMCwgMHg0RjFCLCAweDUwM0EsIDB4NEYyNCwgMHg1MDNFLAorICAgIDB4NTA3QiwgMHg0RUM1LCAweDRGNjUsIDB4NEZBOCwgMHg0RUM2LCAweDRGQTUsIDB4NTA3RSwgMHg5NkM3LCAweDRFRjcsCisgICAgMHg0RUVBLCAweDRGQUMsIDB4NEVCRiwgMHg0RkVELCAweDUwQTcsIDB4NEZFNiwgMHg0RkFBLCAweDVDM0QsIDB4NTA3RiwKKyAgICAweDRGMTgsIDB4NTBBOCwgMHg0RkVBLCAweDUwQTksIDB4NTBBNSwgMHg0RkU4LCAweDUxRjYsIDB4NTE1MSwgMHg1MTNGLAorICAgIDB4NTE1NiwgMHg1MTg1LCAweDRFMjQsIDB4NTE4QywgMHg4MEM0LCAweDUxOTksIDB4NUU0MiwgMHg1MUJCLCAweDUxREIsCisgICAgMHg1MUVGLCAweDUyMkIsIDB4NTIyMCwgMHg1MjJELCAweDUyMTksIDB4NTIzOSwgMHg1MjFBLCAweDUyNjUsIDB4NTI1MCwKKyAgICAweDUyNDAsIDB4NTIxQiwgMHg1MjJDLCAweDUyMTIsIDB4NTI2NywgMHg1MjE4LCAweDUyM0QsIDB4NTIzRiwgMHg1MjUxLAorICAgIDB4NTI0MiwgMHg1MkIyLCAweDUyQTgsIDB4NTJENiwgMHg1MkExLCAweDgwREMsIDB4NTJCMywgMHg1MkJGLCAweDUyQTIsCisgICAgMHg1MkNCLCAweDUyQjEsIDB4NTI5RCwgMHg1MzAwLCAweDUzMjYsIDB4NkM0NywgMHg1MzJFLCAweDUzM0EsIDB4NTM0RiwKKyAgICAweDYwNjQsIDB4NTM3NCwgMHg1MzhELCAweDUzOEMsIDB4NTM4OSwgMHg1M0EzLCAweDUzQzIsIDB4NEUxQiwgMHg1NEE0LAorICAgIDB4NTQzNCwgMHg1NDUwLCAweDU0MTUsIDB4NTQ1OCwgMHg1NUIxLCAweDU0NTcsIDB4NUZGNSwgMHg5NUVFLCAweDU0RDEsCisgICAgMHg1NDJGLCAweDU1MjQsIDB4NEUyNywgMHg0RTU0LCAweDUzNTUsIDB4NTRERiwgMHg1NDVCLCAweDU1NkMsIDB4NTUxRCwKKyAgICAweDU0MTcsIDB4NTQ1QywgMHg1NTIyLCAweDU0RDQsIDB4NTNGOSwgMHg1NUJELCAweDU0NTUsIDB4NTU2NywgMHg1QzFELAorICAgIDB4NTUxQiwgMHg1NEQ3LCAweDU1MjAsIDB4NTU3OCwgMHg1M0ZELCAweDU0RDMsIDB4NTQ1MiwgMHg1NTc0LCAweDYwNzYsCisgICAgMHg1NjE4LCAweDU0OUQsIDB4NTREMiwgMHg1NERELCAweDU0RDUsIDB4NTVGMywgMHg1NEQ5LCAweDU1QjcsIDB4NTQyOCwKKyAgICAweDU0OUIsIDB4NTQxMywgMHg1NERDLCAweDVDMUQsIDB4NTY1QywgMHg1NTZFLCAweDU0NTYsIDB4NTQ5OSwgMHg0RUI4LAorICAgIDB4NTVCRSwgMHg0RTI1LCAweDU2MjQsIDB4NTU2RCwgMHg1NUVCLCAweDU2QTMsIDB4NTE4MSwgMHg1NDUzLCAweDU1NzAsCisgICAgMHg1NjMxLCAweDU2RjEsIDB4NTZGNSwgMHg1NkZELCAweDU2RjQsIDB4NTZFRCwgMHg1NzA2LCAweDU2RkUsIDB4NTZFMiwKKyAgICAweDU3QUQsIDB4NjI2NywgMHg1NzVBLCAweDU3QTksIDB4NTdEQSwgMHg1QzI3LCAweDYyQTUsIDB4NTczQSwgMHg1NzU3LAorICAgIDB4ODMxNCwgMHg1N0IyLCAweDU3RDgsIDB4NkQ4MiwgMHg1MUEyLCAweDU3NUUsIDB4NTdEOSwgMHg1QzE4LCAweDU4MTEsCisgICAgMHg1N0FCLCAweDU3NjAsIDB4NTgxNSwgMHg1NzVGLCAweDU3QTYsIDB4NTc1QiwgMHg1MzhCLCAweDU3OTIsIDB4NTczOSwKKyAgICAweDU3ODYsIDB4NTc0RiwgMHg1Nzg1LCAweDU3NUMsIDB4NTc1RCwgMHg1OEVFLCAweDU4RjYsIDB4NThGOCwgMHg1QkZGLAorICAgIDB4NTkxRiwgMHg2OEE2LCAweDRGMTksIDB4NTkzOSwgMHg1OTQyLCAweDU5NjUsIDB4NTk0MSwgMHg1OTNBLCAweDU5NEIsCisgICAgMHg1OUY5LCAweDU5ODYsIDB4NTlENywgMHg1OTc4LCAweDVBMzEsIDB4NUEwNCwgMHg1OTg3LCAweDVBMDUsIDB4NUEzMiwKKyAgICAweDU5QUIsIDB4NUFBQSwgMHg1OTg4LCAweDU5QUEsIDB4NTlBOSwgMHg1QTM0LCAweDVBNzMsIDB4NUEwNiwgMHg1QTc1LAorICAgIDB4NUEwNywgMHg1QUYxLCAweDVBRDIsIDB4NUIzNywgMHg1QUQ0LCAweDVBNzQsIDB4NUE3NiwgMHg1QTA4LCAweDVCNTksCisgICAgMHg1QjY2LCAweDVCNkEsIDB4NUJBQiwgMHg1QkRELCAweDVCOUUsIDB4NUI4MSwgMHg1QkExLCAweDUxOTksIDB4NUJCRCwKKyAgICAweDVCQTAsIDB4NUI5RCwgMHg1QzA2LCAweDRFMTMsIDB4NUJGQiwgMHg1QkY5LCAweDVCRkMsIDB4NUMzNCwgMHg1QzRBLAorICAgIDB4NUMzOCwgMHg1QzQ5LCAweDVDNjEsIDB4NUM0MiwgMHg1QzVGLCAweDVDNjYsIDB4NUM1RSwgMHg1MTg4LCAweDVDOTgsCisgICAgMHg1QzlCLCAweDVDRTEsIDB4NUQwMywgMHg1Qzk3LCAweDRFRDEsIDB4NUNFNSwgMHg1QzlBLCAweDVENUQsIDB4NUQyRCwKKyAgICAweDVDOTYsIDB4NUQ1QSwgMHg1RDAyLCAweDVDRTQsIDB4NUNFMywgMHg1Q0M0LCAweDVEMDQsIDB4NUM5OSwgMHg1RDU4LAorICAgIDB4NUNBRCwgMHg1QzdGLCAweDVDQjMsIDB4NUNCRiwgMHg1Q0U2LCAweDVEQzUsIDB4NURFRiwgMHg1RTA1LCAweDVFMDgsCisgICAgMHg1RTEwLCAweDVFMjYsIDB4NUUyNywgMHg1RTBGLCAweDVFM0MsIDB4NUUzQiwgMHg1RTFDLCAweDVFMDEsIDB4NUUyRSwKKyAgICAweDVFMzEsIDB4NUU3MiwgMHg1MUUwLCAweDVFOTMsIDB4NTM5NSwgMHg1M0EyLCAweDUzQTYsIDB4NTNBOCwgMHg1M0FFLAorICAgIDB4NUU5OSwgMHg1MzgyLCAweDVFOTEsIDB4NUU5RiwgMHg1RTdGLCAweDVFRUEsIDB4NUU5MCwgMHg1Mzg1LCAweDVGMTEsCisgICAgMHg1RjJBLCAweDVGMjAsIDB4NUYzQSwgMHg1RjM5LCAweDVGMjUsIDB4NUYyRiwgMHg1RjY2LCAweDU0MEUsIDB4NUY4NCwKKyAgICAweDRFQ0UsIDB4NUY5NSwgMHg1OTBELCAweDVGODEsIDB4NUY3QiwgMHg2MDUyLCAweDgwM0IsIDB4NjBBNiwgMHg2MDA1LAorICAgIDB4OTVGNywgMHg2MDc2LCAweDYwN0MsIDB4NjA3RCwgMHg2MDdCLCAweDcyMzEsIDB4NjBFQywgMHg2MEFCLCAweDYwMDYsCisgICAgMHg2MDdBLCAweDVGRkUsIDB4NjAwMSwgMHg2MTIwLCAweDYwRTgsIDB4NjBFRCwgMHg2MDc4LCAweDYwRUYsIDB4NjAwNCwKKyAgICAweDYwMDIsIDB4ODY1MSwgMHg2MEFELCAweDVFODYsIDB4NUZFNywgMHg2MEVCLCAweDYwMUMsIDB4NTFFRCwgMHg2MTI2LAorICAgIDB4NjE2RCwgMHg2MEVFLCAweDYxMjQsIDB4NjBBRiwgMHg2MDAzLCAweDVCQUEsIDB4NUZDNiwgMHg2MDczLCAweDVFOTQsCisgICAgMHg2MDNGLCAweDYxRDQsIDB4NjAzQywgMHg2MUQxLCAweDYwNzksIDB4NjBFOSwgMHg2MUQyLCAweDYwMDAsIDB4NjBBQywKKyAgICAweDVGQ0YsIDB4NjBFNywgMHg2MTUxLCAweDYwNEIsIDB4NjIwNiwgMHg2MjBCLCAweDYyMTcsIDB4NjIyQywgMHg2MjE4LAorICAgIDB4NjIwRiwgMHg2MjM3LCAweDYyOUIsIDB4NjMxRiwgMHg4MjBELCAweDYyNkEsIDB4NTM3NywgMHg2MjZCLCAweDYyQTEsCisgICAgMHg2MzIzLCAweDYzMDIsIDB4OTFDNywgMHg2MkUzLCAweDYyNkMsIDB4NjM2MiwgMHg2MzI1LCAweDYzNUYsIDB4NjQ0NywKKyAgICAweDYzNjMsIDB4NjJBMiwgMHg2M0I0LCAweDYzQkMsIDB4NjQwMiwgMHg2MzFBLCAweDYyQTAsIDB4NjI5RiwgMHg2M0JBLAorICAgIDB4NjM1RSwgMHg2NDkxLCAweDYzMjAsIDB4NjMyMiwgMHg2M0I4LCAweDYyRTgsIDB4NjI5QSwgMHg2MjUxLCAweDYzRkYsCisgICAgMHg2MzFFLCAweDYzMUQsIDB4NjM2MSwgMHg2MkU1LCAweDYzQjMsIDB4NjJFOSwgMHg1MUZCLCAweDYzMjEsIDB4NjJDNSwKKyAgICAweDYzNkUsIDB4NjMyNCwgMHg2MkRGLCAweDY0NDgsIDB4NjJFNywgMHg2NDAxLCAweDYzQjcsIDB4NjI2OSwgMHg2NEI3LAorICAgIDB4NjQ0NiwgMHg2NERFLCAweDY0QjgsIDB4NjI3MCwgMHg2NDQ1LCAweDY0QjUsIDB4NjJFMiwgMHg2MkU2LCAweDY0ODQsCisgICAgMHg2NDAwLCAweDY0QkEsIDB4NjQzQSwgMHg2NDQ0LCAweDY1MTIsIDB4NjMxQiwgMHg2NDRBLCAweDY0MDUsIDB4NjNGRCwKKyAgICAweDY2OEIsIDB4OEQyNSwgMHg1M0Q5LCAweDY1NEMsIDB4NjU3MCwgMHg2NTVCLCAweDZCRDksIDB4NjU5MywgMHg2NUE5LAorICAgIDB4NjVBRCwgMHg0RThFLCAweDUzNDcsIDB4NjVGNiwgMHg2NjRCLCAweDY2M0MsIDB4NjY1NSwgMHg2NjU2LCAweDY1RjgsCisgICAgMHg3NTQ1LCAweDY2ODIsIDB4NjYzNSwgMHg2NjU0LCAweDUzODYsIDB4NjYxOSwgMHg2NjUzLCAweDY2QTcsIDB4NjVGNywKKyAgICAweDY2M0QsIDB4NjY1MiwgMHg0RTY2LCAweDRGMUEsIDB4ODBFNywgMHg0RTFDLCAweDY4MDUsIDB4Njc0NiwgMHg2ODAwLAorICAgIDB4NjdBNywgMHg2NzYxLCAweDY3QUQsIDB4NUYwMywgMHg2N0E4LCAweDY3QTMsIDB4NjgwQiwgMHg2ODA4LCAweDY4MTYsCisgICAgMHg2ODYwLCAweDY3NjgsIDB4NjdBQiwgMHg2ODYyLCAweDRFMUEsIDB4Njc4MSwgMHg2NzY5LCAweDgzNjMsIDB4Njg2NCwKKyAgICAweDY3ODQsIDB4NjdBQSwgMHg2NzYwLCAweDY4QkYsIDB4NjkyMCwgMHg2OTAxLCAweDY4NjgsIDB4Njg2OSwgMHg0RTUwLAorICAgIDB4Njc5RSwgMHg2OTdDLCAweDY4MDcsIDB4NjdBMiwgMHg2ODM3LCAweDY3MzQsIDB4NjgxMSwgMHg2ODY2LCAweDY4NjEsCisgICAgMHg2ODY1LCAweDY3M0EsIDB4NjkyRCwgMHg2QTJBLCAweDZBQTksIDB4NjlEQywgMHg2N0ZELCAweDY4NjMsIDB4Njg2NywKKyAgICAweDY5REEsIDB4NjhDMCwgMHg2QTJGLCAweDY4QkMsIDB4NTNGMCwgMHg2OURGLCAweDY3RTAsIDB4NjlEQiwgMHg4MkQ4LAorICAgIDB4NjdEQywgMHg2QTc5LCAweDY5ODgsIDB4NjgwOSwgMHg2OTFGLCAweDZBN0MsIDB4NjgwRSwgMHg2QTcxLCAweDY5RTAsCisgICAgMHg2ODBDLCAweDY3QTUsIDB4NkE2NSwgMHg2OTg3LCAweDY4MEEsIDB4Njk4OSwgMHg2OEMyLCAweDZBMzEsIDB4NjgwRiwKKyAgICAweDY3NDMsIDB4NjkyNCwgMHg2ODNFLCAweDY5ODQsIDB4OTRBNiwgMHg2QjI3LCAweDZCMjQsIDB4NkIyMiwgMHg1QzgxLAorICAgIDB4NTM4NiwgMHg1RjUyLCAweDZCODEsIDB4NkI4QiwgMHg2QjkyLCAweDZCODcsIDB4NkI5QSwgMHg2QjkzLCAweDZCQTEsCisgICAgMHg2QjdDLCAweDY3NDAsIDB4NThGMywgMHg2QkMxLCAweDZCQjQsIDB4NkJGNSwgMHg2QkUxLCAweDZDMDcsIDB4NkMxNCwKKyAgICAweDZDMjIsIDB4NkMyOSwgMHg2QzMyLCAweDUxRkMsIDB4NTFCMywgMHg1MUIxLCAweDZDQTEsIDB4NTFCNSwgMHg2Q0M0LAorICAgIDB4NkM3OSwgMHg2RDQzLCAweDZDRkUsIDB4NTFDOSwgMHg1MUM0LCAweDZDRUEsIDB4NkUwQywgMHg1MUMwLCAweDZDQTYsCisgICAgMHg2RTBBLCAweDZEOUUsIDB4NkQ0NSwgMHg2REEzLCAweDUxQ0YsIDB4NkNBOCwgMHg2REExLCAweDZENEIsIDB4NkQ1MSwKKyAgICAweDUxRDEsIDB4NkQ0OCwgMHg2RDhDLCAweDZEMDcsIDB4NkM2NCwgMHg2Q0E5LCAweDUxQzYsIDB4NkM5RiwgMHg2RTI5LAorICAgIDB4NkRBMiwgMHg2RTdGLCAweDZDQTcsIDB4NzA2RCwgMHg2REE0LCAweDgzNjUsIDB4NkNBQSwgMHg2RURFLCAweDZFMTcsCisgICAgMHg2RDUyLCAweDZENTAsIDB4NkVEQSwgMHg2RUUxLCAweDZFMTQsIDB4NkU4NywgMHg2Q0E0LCAweDZDNDksIDB4NkQ5RiwKKyAgICAweDZFMEQsIDB4NkRBOCwgMHg2RTEwLCAweDZENDYsIDB4OTg4RCwgMHg2Q0ZDLCAweDZEMDEsIDB4NkY1QywgMHg2REE2LAorICAgIDB4NkQ1NCwgMHg2RTgzLCAweDZEQTAsIDB4NkRBOSwgMHg2RDQ3LCAweDZEOUQsIDB4NkM4NCwgMHg2REE3LCAweDZFMTEsCisgICAgMHg2Q0ZELCAweDZFRUEsIDB4NkNGNiwgMHg2RDRELCAweDZENEEsIDB4NkQ1MywgMHg2RTdGLCAweDZDREUsIDB4NkQ0RSwKKyAgICAweDZEOUIsIDB4NkVFNSwgMHg2RjRELCAweDZFRTgsIDB4NkU4NSwgMHg2Q0ZBLCAweDZFRTQsIDB4NkVFMiwgMHg2RTBFLAorICAgIDB4NkNGQiwgMHg2RDRGLCAweDZGRDIsIDB4NkNGOCwgMHg2Q0E1LCAweDZGNDcsIDB4NkY0NiwgMHg2Rjc0LCAweDZDRjcsCisgICAgMHg2RkQxLCAweDZGNEIsIDB4NkY5QywgMHg2Q0EzLCAweDZFRTAsIDB4NkQxMiwgMHg2RUU5LCAweDcwNEYsIDB4NkU3RSwKKyAgICAweDZFRTYsIDB4NkVERiwgMHg3MDdFLCAweDRFM0EsIDB4NEU0QywgMHg3MEMzLCAweDY1RTAsIDB4NzBCQywgMHg3MDlDLAorICAgIDB4NzBERiwgMHg4MzE1LCAweDcxMTUsIDB4NzBFNiwgMHg3MDgwLCAweDgzNjcsIDB4NzA5RCwgMHg3MEVELCAweDcwQkQsCisgICAgMHg3MEU4LCAweDcwNkYsIDB4NzA5NiwgMHg3MEU3LCAweDcwRUIsIDB4NzExNiwgMHg4NDI1LCAweDcwN0YsIDB4NzBEQiwKKyAgICAweDcwRTksIDB4NzBFQywgMHg3MTE4LCAweDcwQzEsIDB4NzA4OSwgMHg3MEMyLCAweDRFODksIDB4NEUzQSwgMHg3MjM3LAorICAgIDB4NUMxNCwgMHg1ODk5LCAweDcyNEQsIDB4NzI3NSwgMHg4MzY2LCAweDcyNjYsIDB4NzI4QSwgMHg3MjdBLCAweDcyQjYsCisgICAgMHg3MkVELCAweDcyQzgsIDB4NzJGMCwgMHg3MkI5LCAweDcyRjIsIDB4NzJCOCwgMHg3MkYxLCAweDcyRUUsIDB4NTk1NiwKKyAgICAweDcyRUMsIDB4NzJFRiwgMHg3MzAzLCAweDcyREUsIDB4ODNCNywgMHg3MzBFLCAweDcyQjcsIDB4NTE3RCwgMHg3MzZELAorICAgIDB4NzMyRSwgMHg3MzE1LCAweDczMjEsIDB4NzNCMCwgMHg3M0QwLCAweDczRjIsIDB4NzNBRSwgMHg3MzlBLCAweDc0MTAsCisgICAgMHg3NDc2LCAweDgzQjksIDB4NzM5QiwgMHg3NDA1LCAweDczQjEsIDB4NzQwRiwgMHg3NDBFLCAweDczOTEsIDB4NzQ3NywKKyAgICAweDczRjAsIDB4NzNBRiwgMHg3Mzk5LCAweDczQkEsIDB4NzQzQywgMHg3M0QxLCAweDc0OEUsIDB4NzREMiwgMHg3NEVGLAorICAgIDB4NzRFRSwgMHg0RUE3LCAweDRFQTcsIDB4NEVBOSwgMHg2QkQ1LCAweDc1M0IsIDB4NzU3MiwgMHg1RjAyLCAweDVGNTMsCisgICAgMHg3NTc0LCAweDUzRTAsIDB4NzVDOSwgMHg5MTc4LCAweDc1RjksIDB4NzVENiwgMHg3NUFGLCAweDc1QTEsIDB4NzVFQSwKKyAgICAweDc2MTcsIDB4NzVBRSwgMHg3NTlGLCAweDc1QUQsIDB4NzYxOCwgMHg3NTk3LCAweDc1RTgsIDB4NzVFQiwgMHg3NjA1LAorICAgIDB4NzVBMCwgMHg3NjJBLCAweDc1RDIsIDB4NzU5NiwgMHg3NUFDLCAweDc2NUUsIDB4NzY2MywgMHg3NjNGLCAweDc2M0UsCisgICAgMHg3NUM4LCAweDc2MkIsIDB4NzY2QiwgMHg1M0QxLCAweDc2OTEsIDB4NzVCMSwgMHg3NkIyLCAweDc2QjEsIDB4Njc2RiwKKyAgICAweDc2RDcsIDB4NzZDRiwgMHg1QzNELCAweDc2RDEsIDB4NzZEOCwgMHg1MzYyLCAweDgzNjEsIDB4NzcyNiwgMHg0RjE3LAorICAgIDB4NTZGMCwgMHg3NzQxLCAweDc3NTAsIDB4NzcyRiwgMHg3NzkyLCAweDRFODYsIDB4Nzc4NiwgMHg3NzUxLCAweDc3MkMsCisgICAgMHg3N0E5LCAweDc3RUIsIDB4Nzg0NSwgMHg3MEFFLCAweDc4NDEsIDB4Nzg1NiwgMHg3ODE3LCAweDc4MUEsIDB4Nzg1NSwKKyAgICAweDc4MDAsIDB4Nzg2RSwgMHg3ODAxLCAweDc4NTksIDB4NzgxNiwgMHg3ODlDLCAweDc4OUIsIDB4NzdGNiwgMHg3ODU3LAorICAgIDB4Nzg1QSwgMHg3ODQwLCAweDc4OEQsIDB4NzdGRiwgMHg3ODNBLCAweDc4M0UsIDB4NzdGRSwgMHg3ODNCLCAweDc5ODQsCisgICAgMHg3OTc4LCAweDc5NkYsIDB4Nzk0RSwgMHg1RkExLCAweDc5ODUsIDB4NzkzQywgMHg3OTc3LCAweDc5QzMsIDB4N0M3QywKKyAgICAweDdBMEUsIDB4NzlDNiwgMHg2OEYxLCAweDc5Q0QsIDB4NzlGMCwgMHg3QTIzLCAweDc5RUYsIDB4OTg5NiwgMHg3OUZFLAorICAgIDB4N0E1MSwgMHg3OUZELCAweDdBMzMsIDB4N0E5RCwgMHg2RDNDLCAweDdBNzcsIDB4N0E5MSwgMHg3QThFLCAweDdBQUQsCisgICAgMHg3QUE1LCAweDdBOUMsIDB4N0E4RCwgMHg3QUE2LCAweDdBODMsIDB4N0FERSwgMHg3QjE0LCAweDdCMEIsIDB4N0IxNSwKKyAgICAweDdCM0EsIDB4N0I1RCwgMHg4MjgyLCAweDgzMDMsIDB4N0I1MSwgMHg3QkE3LCAweDdCN0MsIDB4N0IwMywgMHg3QjVCLAorICAgIDB4N0I1QSwgMHg3QkE2LCAweDdCRDMsIDB4N0JBQSwgMHg3QjgwLCAweDdCRDEsIDB4N0JBQiwgMHg2QTkwLCAweDdCNUMsCisgICAgMHg3QjdFLCAweDVFMTgsIDB4N0JFRSwgMHg3Qjc5LCAweDdCOTMsIDB4N0JFRiwgMHg3QkE4LCAweDdDNDEsIDB4N0IzQywKKyAgICAweDdCN0UsIDB4N0IzRSwgMHg3QkYxLCAweDdCQTksIDB4NTQwMSwgMHg1OTg2LCAweDdDQTQsIDB4N0NDMSwgMHg3Q0FBLAorICAgIDB4N0NBRSwgMHg3Q0Y1LCAweDdDOUQsIDB4N0M3NCwgMHg3QzlDLCAweDdFQTAsIDB4N0VBQSwgMHg3RUEzLCAweDdFQTYsCisgICAgMHg3RUEyLCAweDdFQTEsIDB4N0VBNSwgMHg3RUE4LCAweDdFQUIsIDB4N0VCOSwgMHg3RUIzLCAweDdFQkQsIDB4N0VCRSwKKyAgICAweDdFQUYsIDB4N0VCMCwgMHg3RUIxLCAweDdFQjgsIDB4N0VBNywgMHg3RUI3LCAweDdFQUQsIDB4N0VCNCwgMHg3RUJBLAorICAgIDB4NjI0RSwgMHg2MjRFLCAweDdFQzYsIDB4N0VDMiwgMHg3RUMxLCAweDdFQzUsIDB4N0VCQiwgMHg3RUNELCAweDdFQzAsCisgICAgMHg3RUNCLCAweDdFRDAsIDB4N0VDQywgMHg3RUM4LCAweDVGMjYsIDB4N0VDNCwgMHg3RUNBLCAweDdFRDcsIDB4N0VEMywKKyAgICAweDdFREQsIDB4N0VFNiwgMHg3RUQ0LCAweDdFREUsIDB4N0VEQywgMHg3RURBLCAweDdFRDksIDB4N0VEMiwgMHg3RUQ2LAorICAgIDB4N0VERiwgMHg0RTFELCAweDdFREIsIDB4N0VFMiwgMHg3RUQxLCAweDdFRTEsIDB4N0VFMCwgMHg3RUU4LCAweDdFRTUsCisgICAgMHg3RUNGLCAweDdFRkMsIDB4N0YwRCwgMHg3RUZGLCAweDdFRjgsIDB4N0VGQiwgMHg3RUY2LCAweDdFRjQsIDB4N0VGRSwKKyAgICAweDdFQjIsIDB4N0Y1MSwgMHg3RjAwLCAweDdFQjYsIDB4N0VGQSwgMHg3RUVFLCAweDdFRkQsIDB4N0VGMCwgMHg3RUVCLAorICAgIDB4N0VGNSwgMHg3RUYyLCAweDdGMDEsIDB4N0QyNywgMHg3RUVGLCAweDdFRUEsIDB4N0YwMywgMHg3RjA0LCAweDdGMDIsCisgICAgMHg3RUJGLCAweDdGMDksIDB4N0YwRSwgMHg3RjE0LCAweDdGMTcsIDB4N0YxOCwgMHg3RjBDLCAweDdGMTYsIDB4N0YxMywKKyAgICAweDdGMDUsIDB4N0VBQywgMHg3RjExLCAweDdGMDgsIDB4N0VDMywgMHg3RjBGLCAweDdGMDcsIDB4ODFGNCwgMHg4NDI2LAorICAgIDB4N0YxOSwgMHg3RjIyLCAweDdGMTIsIDB4N0VDOSwgMHg3RjIzLCAweDdGMUUsIDB4N0YxQSwgMHg3RjFDLCAweDdGMUYsCisgICAgMHg3RjFCLCAweDUzQkYsIDB4N0YxRCwgMHg3RjI5LCAweDdFQjUsIDB4N0YyNywgMHg3RjI2LCAweDdENzcsIDB4N0YxNSwKKyAgICAweDdGMjUsIDB4NjAzQiwgMHg3RUU5LCAweDdFRjcsIDB4N0YyQiwgMHg3RjJBLCAweDdGMkYsIDB4N0VDNywgMHg3RjJFLAorICAgIDB4N0YyRCwgMHg3RUQ1LCAweDdFRTMsIDB4N0YwQiwgMHg3RUYzLCAweDdFRDgsIDB4N0NGQiwgMHg4MzI3LCAweDdGMzMsCisgICAgMHg3RjMyLCAweDdGMzQsIDB4N0VDRSwgMHg3RUU3LCAweDdGMjQsIDB4N0YzMSwgMHg3RjJDLCAweDdFQTksIDB4N0VFRCwKKyAgICAweDdGMjAsIDB4N0YyOCwgMHg3RUE0LCAweDdGMzUsIDB4N0YwNiwgMHg5NEI1LCAweDdGNDIsIDB4N0Y1QSwgMHg5QTgyLAorICAgIDB4N0Y2MiwgMHg3RjU3LCAweDdGNzQsIDB4N0Y4MSwgMHg4Mjg4LCAweDdGOUYsIDB4N0ZBMSwgMHg0RTQ5LCAweDgxQkIsCisgICAgMHg0RTYwLCAweDdGQzYsIDB4N0ZEQSwgMHg3RkQ4LCAweDdGRDksIDB4ODAyNywgMHg1NzIzLCAweDk1RkIsIDB4ODA1NCwKKyAgICAweDgwNkEsIDB4NThGMCwgMHg4MDM4LCAweDgwNjksIDB4ODA0MiwgMHg4MDRDLCAweDgwNEQsIDB4NTQyQywgMHg4MDRCLAorICAgIDB4ODA4MywgMHg4MEMxLCAweDgxMDksIDB4ODBFQiwgMHg4MTMxLCAweDgwQzAsIDB4ODBCRSwgMHg4MEU4LCAweDgxMzYsCisgICAgMHg4MTExLCAweDgwQkYsIDB4ODExQSwgMHg4MEEwLCAweDgxN0QsIDB4ODE1OCwgMHg4MEE0LCAweDgwRjYsIDB4ODE3QiwKKyAgICAweDgwQzYsIDB4ODEwRCwgMHg4MTEzLCAweDgxMzgsIDB4ODExMCwgMHg4MTkxLCAweDgxNEEsIDB4ODBFQSwgMHg4MTBGLAorICAgIDB4ODExNCwgMHg4MURDLCAweDUzNjcsIDB4NEUzNCwgMHg1M0YwLCAweDRFMEUsIDB4NTE3NCwgMHg0RTNFLCAweDY1RTcsCisgICAgMHg4MjMxLCAweDgyMjMsIDB4ODIzMCwgMHg4MjNCLCAweDgyNzAsIDB4ODI3MywgMHg4MkM0LCAweDUyMEQsIDB4ODJDRSwKKyAgICAweDUxNzksIDB4ODM0NiwgMHg4QzQ2LCAweDVFODQsIDB4ODMwRSwgMHg4MzVBLCAweDgyQ0IsIDB4NTM0RSwgMHg3MERGLAorICAgIDB4ODJDQywgMHg4M0IxLCAweDRFMDcsIDB4ODNCNCwgMHg1M0Y2LCAweDgzNkQsIDB4Nzc0MCwgMHg4MkM3LCAweDgzNjQsCisgICAgMHg2NDFDLCAweDgzQjMsIDB4ODM4NSwgMHg4MkNELCAweDgzNkEsIDB4NzZENiwgMHg4M0IyLCAweDgyQzEsIDB4ODNCQywKKyAgICAweDgzNUMsIDB4ODQ4QywgMHg4NDhCLCAweDg0NzEsIDB4ODMxMSwgMHg4MzZCLCAweDgzNjgsIDB4ODQ4NywgMHg4MzVFLAorICAgIDB4ODM2QywgMHg4M0I4LCAweDgzNUIsIDB4ODQ4OSwgMHg4MjlDLCAweDg0MjcsIDB4ODRFMywgMHg4MzVGLCAweDg0REYsCisgICAgMHg4Mjk3LCAweDU5REMsIDB4ODUzNywgMHg4M0I2LCAweDgzNTAsIDB4ODQyOCwgMHg4MzYwLCAweDUwMUYsIDB4ODRERCwKKyAgICAweDgzNjksIDB4ODI3QSwgMHg4MzZGLCAweDg1QUUsIDB4ODJDOCwgMHg4NTNDLCAweDg1M0EsIDB4ODQxQSwgMHg4NTcyLAorICAgIDB4ODJBNiwgMHg4MkNGLCAweDg1NzQsIDB4ODJGOSwgMHg4NjE2LCAweDg1RDMsIDB4ODUzOSwgMHg4MzBGLCAweDUxNzAsCisgICAgMHg4NEUwLCAweDg0MUQsIDB4NTkwNCwgMHg4NjVBLCAweDg2NEYsIDB4NTNGNywgMHg0RThGLCAweDg2NkMsIDB4ODZGMSwKKyAgICAweDg3MTUsIDB4ODZBQywgMHg4NjgwLCAweDczMkMsIDB4ODY3RSwgMHg4NjcxLCAweDg3MTcsIDB4ODZGMywgMHg4NjgyLAorICAgIDB4ODQyNCwgMHg4NzdDLCAweDg3ODAsIDB4ODZGMCwgMHg4NzQ4LCAweDg3QTgsIDB4ODY2RSwgMHg4NzQ5LCAweDg2RjIsCisgICAgMHg4NjZCLCAweDg2Q0YsIDB4ODY4MSwgMHg4NjgzLCAweDg3NDcsIDB4ODY3RiwgMHg4NzRFLCAweDg2RjQsIDB4ODc3RSwKKyAgICAweDg2OUQsIDB4ODcyMSwgMHg4NkNFLCAweDg3Q0YsIDB4ODZDQSwgMHg4Njk1LCAweDg2RUUsIDB4NEYxNywgMHg2NzJGLAorICAgIDB4NTM2QiwgMHg1MUIyLCAweDg4NkUsIDB4ODg4NSwgMHg4ODY1LCAweDg4QzUsIDB4OTFDQywgMHg1MjM2LCAweDU5MEQsCisgICAgMHg4OEM4LCAweDg4ODYsIDB4ODhFNCwgMHg4OEUyLCAweDdGMjEsIDB4ODkxQiwgMHg0RUI1LCAweDg4RTUsIDB4ODg4NCwKKyAgICAweDg4RTMsIDB4ODhDNiwgMHg4OTM0LCAweDg4OUMsIDB4ODg2QywgMHg4OEFELCAweDg5NTUsIDB4ODlDMSwgMHg4OUM0LAorICAgIDB4ODlDNSwgMHg4OUM2LCAweDg5QzcsIDB4ODlDQiwgMHg4OUNELCAweDg5Q0UsIDB4NEVCMiwgMHg4OUNBLCAweDg5Q0YsCisgICAgMHg4OUQwLCAweDg5RDEsIDB4ODlDOSwgMHg4OUM4LCAweDg5Q0MsIDB4ODlDMiwgMHg4OURFLCAweDg5RUYsIDB4ODlFNiwKKyAgICAweDhCQTIsIDB4OEJBMywgMHg4QkExLCAweDhCQUYsIDB4OEJBNywgMHg4QkE4LCAweDhCQTYsIDB4OEJBRCwgMHg4QkFBLAorICAgIDB4OEJBQiwgMHg4QkFDLCAweDhCQjAsIDB4OEJCOSwgMHg4QkI2LCAweDhCQkMsIDB4OEJDMCwgMHg4QkI3LCAweDhCQkYsCisgICAgMHg4QkJFLCAweDhCQjgsIDB4OEJDOSwgMHg4QkMzLCAweDhCQ0EsIDB4OEJDMSwgMHg4QkMyLCAweDhCQ0IsIDB4OEJCNSwKKyAgICAweDhCQzgsIDB4OEJEMiwgMHg4QkNGLCAweDhCQzQsIDB4OEJDRSwgMHg4QkM1LCAweDhCQ0QsIDB4NTQ4RiwgMHg4QkU5LAorICAgIDB4OEJFMiwgMHg4QkUzLCAweDhCRDUsIDB4OEJENywgMHg4QkU3LCAweDhCREYsIDB4OEJFMSwgMHg4QkUwLCAweDhCRDgsCisgICAgMHg4QkRELCAweDhCRTUsIDB4OEJFNiwgMHg4QkRDLCAweDhCRDksIDB4OEJENiwgMHg4QkQ0LCAweDhCREIsIDB4OEJEMywKKyAgICAweDU5MzgsIDB4NUZENywgMHg4QkE0LCAweDhCRjMsIDB4OEJGNiwgMHg4QkRFLCAweDhCRjEsIDB4OEJFRSwgMHg4QkVELAorICAgIDB4OEJEQSwgMHg4QkVCLCAweDhCRUMsIDB4OEJFRiwgMHg4QkYwLCAweDhCRjUsIDB4OEJGMiwgMHg4QkY0LCAweDhDMDEsCisgICAgMHg4QkZFLCAweDhDMDcsIDB4OEJGRCwgMHg4QzBBLCAweDhDMDMsIDB4OEMwNCwgMHg4QzA2LCAweDhDMDgsIDB4OEJGRiwKKyAgICAweDhCRjcsIDB4OEJFNCwgMHg4QkY5LCAweDhCRkMsIDB4OEMwNSwgMHg4QkJBLCAweDhDMDIsIDB4OEMwMCwgMHg4QzBELAorICAgIDB4OEMxRSwgMHg4QzFELCAweDhDMjUsIDB4OEJFOCwgMHg4QzE0LCAweDhDMUIsIDB4OEMxMCwgMHg4QzBGLCAweDhDMTUsCisgICAgMHg4QzE4LCAweDhCQjMsIDB4OEMxOSwgMHg4QzBDLCAweDhCQkQsIDB4OEJGOCwgMHg4QzFBLCAweDhDMTYsIDB4OEJGQSwKKyAgICAweDhDMEIsIDB4OEMxMiwgMHg4QzEzLCAweDhBOEEsIDB4OEJDQywgMHg4QzBFLCAweDhDMUMsIDB4OEMyNywgMHg4QzExLAorICAgIDB4OEMyMSwgMHg4QzI0LCAweDhDMjYsIDB4OEJCMiwgMHg4QzIyLCAweDhDMjMsIDB4OEMxRiwgMHg4QzJBLCAweDhDMkMsCisgICAgMHg4QkI0LCAweDhDMjgsIDB4OEMyOSwgMHg4QkMxLCAweDhDMzIsIDB4OEJBNSwgMHg4QzJFLCAweDhCQzYsIDB4OEMyRiwKKyAgICAweDhDMkQsIDB4OEMzMSwgMHg4QzM1LCAweDhCRDEsIDB4OEJBRSwgMHg4QzM0LCAweDYyQTQsIDB4OEJFQSwgMHg4QTg5LAorICAgIDB4OEMyQiwgMHg4QkZCLCAweDUzRDgsIDB4OEE1RiwgMHg5NkUwLCAweDhDMTcsIDB4OEJBOSwgMHg4QzMwLCAweDhDMzYsCisgICAgMHg4RDVFLCAweDhDMjAsIDB4OEMzMywgMHg1QzgyLCAweDdBRDYsIDB4NEUzMCwgMHg3MzJBLCAweDhDNkUsIDB4NzMyQiwKKyAgICAweDhEMUQsIDB4OEQxRSwgMHg4RDFGLCAweDhEMjIsIDB4OEQyMSwgMHg4RDJCLCAweDhEMjcsIDB4OEQyOSwgMHg4RDJBLAorICAgIDB4OEQyRiwgMHg4RDIzLCAweDhEMkUsIDB4OEQzMywgMHg4RDQwLCAweDhEMzAsIDB4OEQzNSwgMHg4RDJDLCAweDRFNzAsCisgICAgMHg4RDM3LCAweDhEMzYsIDB4OEQzOSwgMHg4RDM0LCAweDhEM0IsIDB4OEQzOCwgMHg4RDNBLCAweDhEMzIsIDB4OEQ0MiwKKyAgICAweDhENDEsIDB4OEQzRiwgMHg4RDQ1LCAweDhENDQsIDB4OEQzRSwgMHg4RDNDLCAweDhENDgsIDB4OEQ0QSwgMHg1QkJFLAorICAgIDB4OEQ0NywgMHg4RDUyLCAweDhENDksIDB4OEQ1MCwgMHg4RDRGLCAweDhENTQsIDB4OEQ1MywgMHg4RDI0LCAweDUzNTYsCisgICAgMHg4RDMxLCAweDhENEIsIDB4OEQ1NSwgMHg4RDI4LCAweDhEMjYsIDB4OEQ0QywgMHg4RDU2LCAweDhENTcsIDB4OEQ1QSwKKyAgICAweDhENTksIDB4OEQyRCwgMHg4RDVCLCAweDhENUMsIDB4OEQzRCwgMHg4RDU4LCAweDhENUYsIDB4OEQ2MCwgMHg4RDVFLAorICAgIDB4OEQ2MSwgMHg4RDYyLCAweDhENDYsIDB4OEQ0MywgMHg4RDUxLCAweDhENEUsIDB4OEQ1RCwgMHg4RDYzLCAweDhENkEsCisgICAgMHg4RDc2LCAweDhENzUsIDB4OEQ4QiwgMHg4REIxLCAweDhGRjksIDB4OERGNSwgMHg4RTBBLCAweDhEQzQsIDB4OERGOCwKKyAgICAweDhERDYsIDB4OEU1MiwgMHg4REY3LCAweDhERjYsIDB4OERCOCwgMHg4RTBDLCAweDhERkIsIDB4OERDMywgMHg4RTJGLAorICAgIDB4OERERSwgMHg4RTJDLCAweDhFNzAsIDB4OERGOSwgMHg4RTUxLCAweDhFN0YsIDB4OEU5QywgMHg4RThGLCAweDhFQUYsCisgICAgMHg4RjY2LCAweDhGNjcsIDB4OEY2OCwgMHg1MTlCLCAweDhGNjksIDB4OEY2QiwgMHg4RjZELCAweDhGNkYsIDB4OEY3OCwKKyAgICAweDhGNzEsIDB4OEY3NCwgMHg4Rjc1LCAweDhGN0EsIDB4OEY3MiwgMHg4Rjc2LCAweDhGN0MsIDB4OEY4MywgMHg4RjgyLAorICAgIDB4OEY4MSwgMHg4RjgwLCAweDhGN0QsIDB4OEY3RSwgMHg4Rjg0LCAweDhGODUsIDB4OEY3QiwgMHg4Rjg2LCAweDhGOEUsCisgICAgMHg4Rjg5LCAweDhGOEIsIDB4OEY4RCwgMHg4RjhBLCAweDhGODcsIDB4OEY4OCwgMHg4RjZFLCAweDhGOTEsIDB4OEY4RiwKKyAgICAweDhGOTMsIDB4OEY5MCwgMHg4Rjk3LCAweDgyMDYsIDB4OEY5MiwgMHg2QkMyLCAweDhGOTYsIDB4OEY5NSwgMHg4Rjk4LAorICAgIDB4OEY2QywgMHg4Rjk5LCAweDhGN0YsIDB4OEY5QSwgMHg4RjcwLCAweDhGOTQsIDB4OEY3OSwgMHg4RjczLCAweDUyOUUsCisgICAgMHg4RjlFLCAweDhGQUIsIDB4OEZBOSwgMHg1MTlDLCAweDhGRDksIDB4OEZERSwgMHg1NDY4LCAweDhGREIsIDB4NkUzOCwKKyAgICAweDhGRDAsIDB4OEZDNywgMHg4RkJFLCAweDhGREQsIDB4OTA2NSwgMHg5MDBBLCAweDkwMTIsIDB4OEZEQywgMHg5MDAyLAorICAgIDB4OEZERiwgMHg4RkMxLCAweDkwMDksIDB4OTA1NywgMHg4RkJELCAweDhGQzgsIDB4OEZEOCwgMHg4RkU5LCAweDhGQjksCisgICAgMHg5MDNCLCAweDkwMjYsIDB4OTBDRiwgMHg5MEFFLCAweDkwRDMsIDB4NEU2MSwgMHg5MEI5LCAweDkwQUMsIDB4OTBFNywKKyAgICAweDkwOTMsIDB4OTBEMSwgMHg5MEJCLCAweDkwRjgsIDB4OTBCQSwgMHg5MEQwLCAweDkwOUQsIDB4OTE0MiwgMHg5MEU2LAorICAgIDB4ODE0QywgMHg0RTExLCAweDkxNUQsIDB4NTMzQiwgMHg5MTcxLCAweDkxNjYsIDB4OTE3RiwgMHg4ODQ1LCAweDkxN0UsCisgICAgMHg5MTdELCAweDkxQ0EsIDB4OTQ4NywgMHg5NDhDLCAweDk0OEEsIDB4OTQ4OSwgMHg5NDhCLCAweDk0ODgsIDB4OTQ5MywKKyAgICAweDk0OTAsIDB4OTQ4RiwgMHg5NDkyLCAweDk0OEUsIDB4OTQ5NywgMHg5NDhELCAweDk0OTUsIDB4OTRBRiwgMHg5NEFCLAorICAgIDB4OTQ5OCwgMHg5NEFELCAweDk0QTAsIDB4OTQ5RCwgMHg5NEE0LCAweDk0QTMsIDB4OTQ5RSwgMHg5NEFFLCAweDk0QTcsCisgICAgMHg5NDk5LCAweDk0OUIsIDB4OTRBQSwgMHg5NENDLCAweDk0QzgsIDB4OTRCNiwgMHg5NEMzLCAweDk0QjQsIDB4OTRCOSwKKyAgICAweDk0Q0QsIDB4OTRCMCwgMHg5NEI4LCAweDk0QzAsIDB4OTRCRiwgMHg5NEJFLCAweDk0OUMsIDB4OTRDQSwgMHg5NEM5LAorICAgIDB4OTRDNywgMHg5NENCLCAweDk0QzIsIDB4OTRCMywgMHg5NEM2LCAweDk0QzUsIDB4OTRCQSwgMHg5NEE5LCAweDk0QjIsCisgICAgMHg5NEJDLCAweDk0QkQsIDB4OTRDRiwgMHg5NEYwLCAweDk0RDIsIDB4OTRFQywgMHg5NEVBLCAweDk0RjYsIDB4OTRGMywKKyAgICAweDk0REMsIDB4OTREQSwgMHg5NEUzLCAweDk0RTgsIDB4OTRFMiwgMHg5NEVELCAweDk0RUIsIDB4OTRFNiwgMHg4ODU0LAorICAgIDB4OTREMSwgMHg5NEY3LCAweDk0RjEsIDB4OTRERiwgMHg5NEY1LCAweDk0RDUsIDB4OTRFRiwgMHg5NEQwLCAweDk1MTAsCisgICAgMHg5NTAwLCAweDk1MDgsIDB4OTUxMSwgMHg5NTA5LCAweDk0REQsIDB4OTUxMiwgMHg5NTBDLCAweDk0QTEsIDB4OTRFNCwKKyAgICAweDk0RDcsIDB4OTUwQiwgMHg5NTBBLCAweDk1MTMsIDB4OTUwNCwgMHg5NTAzLCAweDk1MTQsIDB4OTUwNywgMHg5NEQzLAorICAgIDB4OTRGQSwgMHg5NEQ2LCAweDk1MDYsIDB4OTUwMiwgMHg5NTJGLCAweDk0QTIsIDB4OTUxRSwgMHg1RjU1LCAweDk1MTYsCisgICAgMHg5NTI5LCAweDk0RDQsIDB4OTUyNSwgMHg5NTE1LCAweDk1MUYsIDB4OTUyNCwgMHg5NTMxLCAweDk0RUUsIDB4OTUxQiwKKyAgICAweDk1MkMsIDB4OTUyRCwgMHg5NTFDLCAweDk0QjEsIDB4OTUyNiwgMHg5NTFBLCAweDk1MjAsIDB4OTUyMSwgMHg5NTIyLAorICAgIDB4OTUxOSwgMHg5NTMwLCAweDg4NjgsIDB4OTRGQywgMHg5NTI4LCAweDk0OTQsIDB4OTUzNCwgMHg5NEZFLCAweDk1MDUsCisgICAgMHg5NTQwLCAweDk1MzcsIDB4OTRFMSwgMHg5NDk2LCAweDk1M0IsIDB4OTUzRCwgMHg5NTM4LCAweDk1MzIsIDB4OTUzOSwKKyAgICAweDk1M0UsIDB4OTUyRSwgMHg5NTM2LCAweDk1MTcsIDB4OTUzQSwgMHg5NTQxLCAweDk1NTEsIDB4OTU1NSwgMHg5NTAxLAorICAgIDB4OTU0OSwgMHg5NTQ4LCAweDk1NDMsIDB4OTRBOCwgMHg4NEU1LCAweDk1NEYsIDB4OTRFMCwgMHg5NEU5LCAweDk1M0MsCisgICAgMHg5NTUwLCAweDk1NDcsIDB4OTU1MiwgMHg5NTRELCAweDk1NTMsIDB4OTU1RSwgMHg5NTVGLCAweDk0RkUsIDB4OTU0NiwKKyAgICAweDk1NTksIDB4OTU2MCwgMHg5NTVELCAweDk0RkYsIDB4OTUzNSwgMHg5NTU3LCAweDk1NTgsIDB4OTU1QiwgMHg5NEYyLAorICAgIDB4OTU1QywgMHg5NTU2LCAweDk1NDIsIDB4OTMzRSwgMHg5NTVBLCAweDk0RTcsIDB4OTU2QSwgMHg5NTA4LCAweDk0RDksCisgICAgMHg5NTYzLCAweDk1NjYsIDB4OTU2MSwgMHg5NDlGLCAweDk1NkIsIDB4OTUwRiwgMHg5NTQ0LCAweDk1NEMsIDB4OTU3MCwKKyAgICAweDk1NkYsIDB4OTU2RCwgMHg5NEMxLCAweDk1NkUsIDB4OTRDRSwgMHg5NERCLCAweDk1NzEsIDB4OTRGOCwgMHg5NTZDLAorICAgIDB4OTU1NCwgMHg5Mjc0LCAweDk1MjcsIDB4OTU3NCwgMHg5NEM0LCAweDk1NzMsIDB4OTU2NywgMHg5NEE1LCAweDk1NzUsCisgICAgMHg5NTc2LCAweDk1NEEsIDB4OTU2OSwgMHg5NTIzLCAweDk0QkIsIDB4OTJBRSwgMHg1MUZGLCAweDk1N0YsIDB4OTVFOCwKKyAgICAweDk1RTksIDB4OTVFQSwgMHg5NUVCLCAweDk1RUMsIDB4OTVFRCwgMHg1RjAwLCAweDk1RjYsIDB4OTVGMywgMHg5NUYwLAorICAgIDB4OTVGMiwgMHg5NUY0LCAweDk1RjUsIDB4OTVGOCwgMHg5NjAyLCAweDk2MDEsIDB4OTYwMCwgMHg5NUZBLCAweDk1RkQsCisgICAgMHg5NjAzLCAweDk2MDYsIDB4OTVGRSwgMHg5NjA1LCAweDk2MEEsIDB4OTYwOSwgMHg5NjBFLCAweDk2MEYsIDB4OTYwRCwKKyAgICAweDk2MDgsIDB4OTYwQywgMHg5NjEyLCAweDY3N0YsIDB4NjY5NywgMHg5NUYxLCAweDk2MTQsIDB4OTYxNSwgMHg5NjExLAorICAgIDB4OTYxNywgMHg5NjE4LCAweDk1RkYsIDB4OTYxNiwgMHg5NjE5LCAweDk1RUYsIDB4NTE3MywgMHg5NjFBLCAweDk2MTMsCisgICAgMHg5NjEwLCAweDhGOUYsIDB4OTYxQiwgMHg5NUZDLCAweDk2NDksIDB4OTY1NSwgMHg5NjM1LCAweDk2MzQsIDB4OTY0OCwKKyAgICAweDk2NDYsIDB4OTYzMywgMHg5NjY3LCAweDk2MUYsIDB4OTYzNiwgMHg5NjY4LCAweDk2NDUsIDB4OTY4RiwgMHg5NjY5LAorICAgIDB4OTY5MCwgMHg5NjQ3LCAweDk2QjYsIDB4NTNFQSwgMHg5NkJELCAweDg2N0QsIDB4NTNDQywgMHg5NkNGLCAweDY3NDIsCisgICAgMHg5RTIxLCAweDc5QkIsIDB4OTZCRSwgMHg0RTkxLCAweDc1MzUsIDB4OTcyMSwgMHg5NkZFLCAweDk3MDEsIDB4OTZGMywKKyAgICAweDk3MkQsIDB4NTNDNywgMHg3MDc1LCAweDUzQzYsIDB4OTc1MywgMHg5NzU5LCAweDgxN0MsIDB4OTc2NSwgMHg5RjE3LAorICAgIDB4NURFOSwgMHg5NzlGLCAweDdGMzAsIDB4OTc5MSwgMHg5N0FGLCAweDk3RTYsIDB4OTdFNywgMHg5N0U5LCAweDk3RUEsCisgICAgMHg5N0VDLCAweDk3RUIsIDB4OTdGNSwgMHg1NENELCAweDk4NzUsIDB4OTg3NiwgMHg5ODc3LCAweDk4NzksIDB4OTg3QSwKKyAgICAweDk4NzgsIDB4OTg3QiwgMHg5ODdDLCAweDk4ODIsIDB4OTg4MCwgMHg5ODgzLCAweDk4ODQsIDB4OTg3RCwgMHg5ODgxLAorICAgIDB4OTg3RiwgMHg5ODg3LCAweDk4ODYsIDB4OTg4QywgMHg5ODg5LCAweDk4OTAsIDB4OTg4RiwgMHg1OTM0LCAweDk4OEEsCisgICAgMHg5ODhCLCAweDk4OTQsIDB4OTg4OCwgMHg5ODkzLCAweDk4OTEsIDB4OTg5NywgMHg5ODk4LCAweDk4OUQsIDB4OTg5QSwKKyAgICAweDk4OUMsIDB4OTg5OSwgMHg5ODlCLCAweDYxM0YsIDB4OThBMSwgMHg5OEEwLCAweDdDN0IsIDB4OTg5RiwgMHg5OEEyLAorICAgIDB4OTg3RSwgMHg5OEE0LCAweDk4QTUsIDB4NjYzRSwgMHg5OEE2LCAweDk4ODUsIDB4OTg5RSwgMHg5OEE3LCAweDk4Q0UsCisgICAgMHg5OEQwLCAweDk4RDEsIDB4OThEMiwgMHg1M0YwLCAweDk4RDMsIDB4OThENCwgMHg5OENGLCAweDk4RDYsIDB4OThENSwKKyAgICAweDk4RDcsIDB4OThEOCwgMHg5OEQ5LCAweDk4REUsIDB4OTk2NSwgMHg5OTY0LCAweDk5NjYsIDB4OTk2OCwgMHg5OTZBLAorICAgIDB4OTk2QiwgMHg5OTZDLCAweDk5NkQsIDB4OTk2RSwgMHg5OTc0LCAweDk5NzIsIDB4OTk3MSwgMHg5OTcwLCAweDk5NzMsCisgICAgMHg5OTdBLCAweDk5NzgsIDB4OTk3QywgMHg5OTc3LCAweDUxN0IsIDB4OTk3NSwgMHg5OTc5LCAweDk5N0QsIDB4OTk4MSwKKyAgICAweDk5N0YsIDB4OTk3RSwgMHg0RjU5LCAweDgwQjQsIDB4OTk4NCwgMHg5OTgzLCAweDk5NkYsIDB4OTk4NSwgMHg5OTg2LAorICAgIDB4N0NDNywgMHg5OTY3LCAweDU1ODIsIDB4OTk4OSwgMHg5OThFLCAweDk5NjksIDB4OTk4RiwgMHg5OThBLCAweDk5OEMsCisgICAgMHg5OThELCAweDk5OTIsIDB4OTk5MCwgMHg5OTkxLCAweDk5ODgsIDB4OTk5NCwgMHg5OTc2LCAweDk4RTgsIDB4OTkwRCwKKyAgICAweDk5OEIsIDB4OUE2QywgMHg5QTZELCAweDUxQUYsIDB4OUE2RSwgMHg5QTcwLCAweDlBNkYsIDB4OUE3MywgMHg5QTdCLAorICAgIDB4OUE3RCwgMHg5QTc5LCAweDlBNzUsIDB4OUE3RSwgMHg5QTgwLCAweDlBNzgsIDB4OUE3NiwgMHg5QTdDLCAweDlBNzcsCisgICAgMHg5QTg4LCAweDlBODcsIDB4OUE4MywgMHg5QTg2LCAweDlBOEUsIDB4OUE4RiwgMHg5QThCLCAweDlBOEQsIDB4OUE5MywKKyAgICAweDlBOTIsIDB4OUE5MSwgMHg5QTkwLCAweDlBOUIsIDB4OUE5NywgMHg5QTk5LCAweDlBOUUsIDB4OUE5OCwgMHg5QTlELAorICAgIDB4ODE3RSwgMHg5QTdBLCAweDlBOUEsIDB4OUE5RiwgMHg5QUExLCAweDg0RTYsIDB4OUE5QywgMHg5QTk2LCAweDlBQTAsCisgICAgMHg5QUEyLCAweDlBNzEsIDB4OUE4NSwgMHg5QTk1LCAweDlBODEsIDB4OUE4NCwgMHg5QThDLCAweDYwQ0EsIDB4OUE3RiwKKyAgICAweDlBQTQsIDB4OUE3NCwgMHg5QUE3LCAweDlBQTUsIDB4OUFBNiwgMHg5QThBLCAweDgwQUUsIDB4OUFDNSwgMHg4MTBGLAorICAgIDB4NEY1MywgMHg5QUNDLCAweDlBQ0IsIDB4NTNEMSwgMHg2NzdFLCAweDgwRTEsIDB4OUIxMywgMHg2NTk3LCAweDk1RjksCisgICAgMHg5NjBCLCAweDk2MDQsIDB4OTBDMSwgMHg5QjQ5LCAweDlCNDcsIDB4OUM3QywgMHg5QzgwLCAweDlDODEsIDB4OUM4MiwKKyAgICAweDlDN0YsIDB4OUM4NSwgMHg5Qzg2LCAweDlDOEYsIDB4OUM4NywgMHg5QzkwLCAweDlDOEQsIDB4OUM4QiwgMHg5QzhBLAorICAgIDB4OUM5MiwgMHg5Qzk1LCAweDlDOTYsIDB4OUM5NCwgMHg5QzlCLCAweDlDOTEsIDB4OUM5QywgMHg5Q0E3LCAweDlDQTAsCisgICAgMHg5Q0E5LCAweDlDQTQsIDB4OUNBOCwgMHg5Q0JCLCAweDlDQUYsIDB4OUNBRCwgMHg5QzlFLCAweDlDQjcsIDB4OUNCNCwKKyAgICAweDlDQjEsIDB4OUNCNSwgMHg5Q0IyLCAweDlDQjMsIDB4OUNCOCwgMHg5Q0FFLCAweDlDQjAsIDB4OUNCNiwgMHg5Q0FCLAorICAgIDB4OUNDQSwgMHg5Qzk3LCAweDlDQkQsIDB4OUNDNywgMHg5Q0M1LCAweDlDQzYsIDB4OUNDMywgMHg5Q0QyLCAweDlDRDEsCisgICAgMHg5Q0E1LCAweDlDQ0YsIDB4OUNDRSwgMHg5Q0QwLCAweDlDQ0QsIDB4OUNDMSwgMHg5Q0EyLCAweDlDQ0MsIDB4OUNBNiwKKyAgICAweDlDQTMsIDB4OUNCOSwgMHg5Q0Q3LCAweDlDRDQsIDB4OUNDOSwgMHg5Q0Q1LCAweDlDRDYsIDB4OUNERiwgMHg5Q0RELAorICAgIDB4OUNEQywgMHg5Q0RFLCAweDlDOUYsIDB4OUNCQywgMHg5QzhFLCAweDlDOTksIDB4OUNFMywgMHg5Q0UyLCAweDlDOUEsCisgICAgMHg5Q0M0LCAweDlDODgsIDB4OUNBMSwgMHg5RTFGLCAweDUxRUIsIDB4OUUyMCwgMHg5RTI0LCAweDUxRTQsIDB4OUUyMywKKyAgICAweDlFMjIsIDB4OUUyOSwgMHg5RTI4LCAweDlFMjYsIDB4OUUzMCwgMHg5RTM1LCAweDlFMzMsIDB4OUUzMiwgMHg5RTJFLAorICAgIDB4OUUzMSwgMHg5RTJBLCAweDlFMkYsIDB4OUUyRCwgMHg5RTM4LCAweDlFMzksIDB4OUUzQiwgMHg5RTNGLCAweDlFM0QsCisgICAgMHg5RTNBLCAweDlFNDMsIDB4OUU0NiwgMHg5RTQxLCAweDlFNDgsIDB4OUU0NSwgMHg5RTQ0LCAweDlFNDksIDB4OUU0QywKKyAgICAweDlFNEYsIDB4OUU0RSwgMHg5RTRBLCAweDlFNTMsIDB4OUUyQiwgMHg5RTUxLCAweDlFNEIsIDB4OUU1OSwgMHg5RTU1LAorICAgIDB4OUU1NywgMHg5RTU2LCAweDlFNEQsIDB4OUU1QiwgMHg5RTVDLCAweDgzQkEsIDB4OUU1RiwgMHg5RTY0LCAweDlFNjAsCisgICAgMHg5RTYxLCAweDlFNTgsIDB4OUU2MywgMHg5RTVBLCAweDlFNjIsIDB4OUU1RSwgMHg5RTY3LCAweDlFNjUsIDB4OUUyNSwKKyAgICAweDlFMzcsIDB4OUU2OCwgMHg5RTM2LCAweDlFNkEsIDB4OUU1NCwgMHg5RTY5LCAweDlFNkIsIDB4OUU0NywgMHg5RTZDLAorICAgIDB4OUU3MCwgMHg5RTZELCAweDlFNkYsIDB4OUUyQywgMHg5RTc0LCAweDlFNjYsIDB4OUU3MywgMHg5RTQyLCAweDlFM0UsCisgICAgMHg1MzY0LCAweDlFN0UsIDB4Nzg3NywgMHg3NkQwLCAweDRFM0QsIDB4OUVBNiwgMHg5RUI4LCAweDlFQjksIDB4OTc2MiwKKyAgICAweDRFNDgsIDB4OUVDNCwgMHg5RUM5LCAweDcwQjksIDB4NTE1QSwgMHg5NzA5LCAweDlFRTEsIDB4OUVFOSwgMHg5RUZFLAorICAgIDB4OUYwQiwgMHg5RjBELCAweDlGMzksIDB4OUY1MCwgMHg2NThCLCAweDhENEQsIDB4OUY1MSwgMHg5RjdGLCAweDlGODAsCisgICAgMHg5RjgxLCAweDlGODUsIDB4OUY4NywgMHg5RjgzLCAweDlGODYsIDB4OUY4NCwgMHg5Rjg4LCAweDlGOEEsIDB4OUY4OSwKKyAgICAweDlGOEIsIDB4OUY4QywgMHg5Rjk5LCAweDUzOTAsIDB4NUU5RSwgMHg5RjlBLCAweDlGOUIsIDB4OUY5RiwgMHhBNzZGLAorICAgIDB4OEM0OCwgMHg2NkY0LCAweDhFQ0EsIDB4OENDOCwgMHg2RUQxLCAweDRFMzIsIDB4NTNFNSwgMHg5RjlDLCAweDlGOUMsCisgICAgMHg1OTUxLCAweDkxRDEsIDB4NTU4NywgMHg1OTQ4LCAweDYxRjYsIDB4NzY2OSwgMHg3Rjg1LCAweDg2M0YsIDB4ODdCQSwKKyAgICAweDg4RjgsIDB4OTA4RiwgMHg2QTAyLCAweDZEMUIsIDB4NzBEOSwgMHg3M0RFLCAweDg0M0QsIDB4OTE2QSwgMHg5OUYxLAorICAgIDB4NEU4MiwgMHg1Mzc1LCAweDZCMDQsIDB4NzIxQiwgMHg4NjJELCAweDlFMUUsIDB4NUQ1MCwgMHg2RkVCLCAweDg1Q0QsCisgICAgMHg4OTY0LCAweDYyQzksIDB4ODFEOCwgMHg4ODFGLCAweDVFQ0EsIDB4NjcxNywgMHg2RDZBLCAweDcyRkMsIDB4OTBDRSwKKyAgICAweDRGODYsIDB4NTFCNywgMHg1MkRFLCAweDY0QzQsIDB4NkFEMywgMHg3MjEwLCAweDc2RTcsIDB4ODAwMSwgMHg4NjA2LAorICAgIDB4ODY1QywgMHg4REVGLCAweDk3MzIsIDB4OUI2RiwgMHg5REZBLCAweDc4OEMsIDB4Nzk3RiwgMHg3REEwLCAweDgzQzksCisgICAgMHg5MzA0LCAweDlFN0YsIDB4OEFENiwgMHg1OERGLCAweDVGMDQsIDB4N0M2MCwgMHg4MDdFLCAweDcyNjIsIDB4NzhDQSwKKyAgICAweDhDQzIsIDB4OTZGNywgMHg1OEQ4LCAweDVDNjIsIDB4NkExMywgMHg2RERBLCAweDZGMEYsIDB4N0QyRiwgMHg3RTM3LAorICAgIDB4OTY0QiwgMHg1MkQyLCAweDgwOEIsIDB4NTFEQywgMHg1MUNDLCAweDdBMUMsIDB4N0RCRSwgMHg4M0YxLCAweDk2NzUsCisgICAgMHg4QjgwLCAweDYyQ0YsIDB4NkEwMiwgMHg4QUZFLCAweDRFMzksIDB4NUJFNywgMHg2MDEyLCAweDczODcsIDB4NzU3MCwKKyAgICAweDUzMTcsIDB4NzhGQiwgMHg0RkJGLCAweDVGQTksIDB4NEUwRCwgMHg2Q0NDLCAweDY1NzgsIDB4N0QyMiwgMHg1M0MzLAorICAgIDB4NTg1RSwgMHg3NzAxLCAweDg0NDksIDB4OEFBQSwgMHg2QkJBLCAweDhGQjAsIDB4NkM4OCwgMHg2MkZFLCAweDgyRTUsCisgICAgMHg2M0EwLCAweDc1NjUsIDB4NEVBRSwgMHg1MTY5LCAweDUxQzksIDB4Njg4MSwgMHg3Q0U3LCAweDgyNkYsIDB4OEFEMiwKKyAgICAweDkxQ0YsIDB4NTJGNSwgMHg1NDQyLCAweDU5NzMsIDB4NUVFQywgMHg2NUM1LCAweDZGRkUsIDB4NzkyQSwgMHg5NUFELAorICAgIDB4OUE2QSwgMHg5RTk3LCAweDlFQ0UsIDB4NTI5QiwgMHg2NkM2LCAweDZCNzcsIDB4OEY2MiwgMHg1RTc0LCAweDYxOTAsCisgICAgMHg2MjAwLCAweDY0OUEsIDB4NkYyMywgMHg3MTQ5LCAweDc0ODksIDB4NzlDQSwgMHg3REY0LCAweDgwNkYsIDB4OEYyNiwKKyAgICAweDg0RUUsIDB4OTAyMywgMHg5MzRBLCAweDUyMTcsIDB4NTJBMywgMHg1NEJELCAweDcwQzgsIDB4ODhDMiwgMHg4QUFBLAorICAgIDB4NUVDOSwgMHg1RkY1LCAweDYzN0IsIDB4NkJBRSwgMHg3QzNFLCAweDczNzUsIDB4NEVFNCwgMHg1NkY5LCAweDVCRTcsCisgICAgMHg1REJBLCAweDYwMUMsIDB4NzNCMiwgMHg3NDY5LCAweDdGOUEsIDB4ODA0NiwgMHg5MjM0LCAweDk2RjYsIDB4OTc0OCwKKyAgICAweDk4MTgsIDB4NEY4QiwgMHg3OUFFLCAweDkxQjQsIDB4OTZCOCwgMHg2MEUxLCAweDRFODYsIDB4NTBEQSwgMHg1QkVFLAorICAgIDB4NUMzRiwgMHg2NTk5LCAweDZBMDIsIDB4NzFDRSwgMHg3NjQyLCAweDg0RkMsIDB4OTA3QywgMHg5RjhELCAweDY2ODgsCisgICAgMHg5NjJFLCAweDUyODksIDB4Njc3QiwgMHg2N0YzLCAweDZENDEsIDB4NkU5QywgMHg3NDA5LCAweDc1NTksIDB4Nzg2QiwKKyAgICAweDdEMTAsIDB4OTg1RSwgMHg1MTZELCAweDYyMkUsIDB4OTY3OCwgMHg1MDJCLCAweDVEMTksIDB4NkRFQSwgMHg4RjJBLAorICAgIDB4NUY4QiwgMHg2MTQ0LCAweDY4MTcsIDB4NzM4NywgMHg5Njg2LCAweDUyMjksIDB4NTQwRiwgMHg1QzY1LCAweDY2MTMsCisgICAgMHg2NzRFLCAweDY4QTgsIDB4NkNFNSwgMHg3NDA2LCAweDc1RTIsIDB4N0Y3OSwgMHg4OENGLCAweDg4RTEsIDB4OTFDQywKKyAgICAweDk2RTIsIDB4NTMzRiwgMHg2RUJBLCAweDU0MUQsIDB4NzFEMCwgMHg3NDk4LCAweDg1RkEsIDB4OTZBMywgMHg5QzU3LAorICAgIDB4OUU5RiwgMHg2Nzk3LCAweDZEQ0IsIDB4ODFFOCwgMHg3QUNCLCAweDdCMjAsIDB4N0M5MiwgMHg3MkMwLCAweDcwOTksCisgICAgMHg4QjU4LCAweDRFQzAsIDB4ODMzNiwgMHg1MjNBLCAweDUyMDcsIDB4NUVBNiwgMHg2MkQzLCAweDdDRDYsIDB4NUI4NSwKKyAgICAweDZEMUUsIDB4NjZCNCwgMHg4RjNCLCAweDg4NEMsIDB4OTY0RCwgMHg4OThCLCAweDVFRDMsIDB4NTE0MCwgMHg1NUMwLAorICAgIDB4NTg1QSwgMHg2Njc0LCAweDUxREUsIDB4NzMyQSwgMHg3NkNBLCAweDc5M0MsIDB4Nzk1RSwgMHg3OTY1LCAweDc5OEYsCisgICAgMHg5NzU2LCAweDdDQkUsIDB4N0ZCRCwgMHg4NjEyLCAweDhBRjgsIDB4OTAzOCwgMHg5MEZELCAweDk4RUYsIDB4OThGQywKKyAgICAweDk5MjgsIDB4OURCNCwgMHg0RkFFLCAweDUwRTcsIDB4NTE0RCwgMHg1MkM5LCAweDUyRTQsIDB4NTM1MSwgMHg1NTlELAorICAgIDB4NTYwNiwgMHg1NjY4LCAweDU4NDAsIDB4NThBOCwgMHg1QzY0LCAweDVDNkUsIDB4NjA5NCwgMHg2MTY4LCAweDYxOEUsCisgICAgMHg2MUYyLCAweDY1NEYsIDB4NjVFMiwgMHg2NjkxLCAweDY4ODUsIDB4NkQ3NywgMHg2RTFBLCAweDZGMjIsIDB4NzE2RSwKKyAgICAweDcyMkIsIDB4NzQyMiwgMHg3ODkxLCAweDc5M0UsIDB4Nzk0OSwgMHg3OTQ4LCAweDc5NTAsIDB4Nzk1NiwgMHg3OTVELAorICAgIDB4Nzk4RCwgMHg3OThFLCAweDdBNDAsIDB4N0E4MSwgMHg3QkMwLCAweDdERjQsIDB4N0UwOSwgMHg3RTQxLCAweDdGNzIsCisgICAgMHg4MDA1LCAweDgxRUQsIDB4ODI3OSwgMHg4Mjc5LCAweDg0NTcsIDB4ODkxMCwgMHg4OTk2LCAweDhCMDEsIDB4OEIzOSwKKyAgICAweDhDRDMsIDB4OEQwOCwgMHg4RkI2LCAweDkwMzgsIDB4OTZFMywgMHg5N0ZGLCAweDk4M0IsIDB4NjA3NSwgMHg4MjE4LAorICAgIDB4NEUyNiwgMHg1MUI1LCAweDUxNjgsIDB4NEY4MCwgMHg1MTQ1LCAweDUxODAsIDB4NTJDNywgMHg1MkZBLCAweDU1OUQsCisgICAgMHg1NTU1LCAweDU1OTksIDB4NTVFMiwgMHg1ODVBLCAweDU4QjMsIDB4NTk0NCwgMHg1OTU0LCAweDVBNjIsIDB4NUIyOCwKKyAgICAweDVFRDIsIDB4NUVEOSwgMHg1RjY5LCAweDVGQUQsIDB4NjBEOCwgMHg2MTRFLCAweDYxMDgsIDB4NjE4RSwgMHg2MTYwLAorICAgIDB4NjFGMiwgMHg2MjM0LCAweDYzQzQsIDB4NjQxQywgMHg2NDUyLCAweDY1NTYsIDB4NjY3NCwgMHg2NzE3LCAweDY3MUIsCisgICAgMHg2NzU2LCAweDZCNzksIDB4NkJCQSwgMHg2RDQxLCAweDZFREIsIDB4NkVDQiwgMHg2RjIyLCAweDcwMUUsIDB4NzE2RSwKKyAgICAweDc3QTcsIDB4NzIzNSwgMHg3MkFGLCAweDczMkEsIDB4NzQ3MSwgMHg3NTA2LCAweDc1M0IsIDB4NzYxRCwgMHg3NjFGLAorICAgIDB4NzZDQSwgMHg3NkRCLCAweDc2RjQsIDB4Nzc0QSwgMHg3NzQwLCAweDc4Q0MsIDB4N0FCMSwgMHg3QkMwLCAweDdDN0IsCisgICAgMHg3RDVCLCAweDdERjQsIDB4N0YzRSwgMHg4MDA1LCAweDgzNTIsIDB4ODNFRiwgMHg4Nzc5LCAweDg5NDEsIDB4ODk4NiwKKyAgICAweDg5OTYsIDB4OEFCRiwgMHg4QUY4LCAweDhBQ0IsIDB4OEIwMSwgMHg4QUZFLCAweDhBRUQsIDB4OEIzOSwgMHg4QjhBLAorICAgIDB4OEQwOCwgMHg4RjM4LCAweDkwNzIsIDB4OTE5OSwgMHg5Mjc2LCAweDk2N0MsIDB4OTZFMywgMHg5NzU2LCAweDk3REIsCisgICAgMHg5N0ZGLCAweDk4MEIsIDB4OTgzQiwgMHg5QjEyLCAweDlGOUMsIDB4M0I5RCwgMHg0MDE4LCAweDQwMzksIDB4OUY0MywKKyAgICAweDlGOEUsIDB4MDVFMiwgMHgwNUQwLCAweDA1RDMsIDB4MDVENCwgMHgwNURCLCAweDA1REMsIDB4MDVERCwgMHgwNUU4LAorICAgIDB4MDVFQSwgMHgwMDJCLCAweDA2NzEsIDB4MDY3MSwgMHgwNjdCLCAweDA2N0IsIDB4MDY3QiwgMHgwNjdCLCAweDA2N0UsCisgICAgMHgwNjdFLCAweDA2N0UsIDB4MDY3RSwgMHgwNjgwLCAweDA2ODAsIDB4MDY4MCwgMHgwNjgwLCAweDA2N0EsIDB4MDY3QSwKKyAgICAweDA2N0EsIDB4MDY3QSwgMHgwNjdGLCAweDA2N0YsIDB4MDY3RiwgMHgwNjdGLCAweDA2NzksIDB4MDY3OSwgMHgwNjc5LAorICAgIDB4MDY3OSwgMHgwNkE0LCAweDA2QTQsIDB4MDZBNCwgMHgwNkE0LCAweDA2QTYsIDB4MDZBNiwgMHgwNkE2LCAweDA2QTYsCisgICAgMHgwNjg0LCAweDA2ODQsIDB4MDY4NCwgMHgwNjg0LCAweDA2ODMsIDB4MDY4MywgMHgwNjgzLCAweDA2ODMsIDB4MDY4NiwKKyAgICAweDA2ODYsIDB4MDY4NiwgMHgwNjg2LCAweDA2ODcsIDB4MDY4NywgMHgwNjg3LCAweDA2ODcsIDB4MDY4RCwgMHgwNjhELAorICAgIDB4MDY4QywgMHgwNjhDLCAweDA2OEUsIDB4MDY4RSwgMHgwNjg4LCAweDA2ODgsIDB4MDY5OCwgMHgwNjk4LCAweDA2OTEsCisgICAgMHgwNjkxLCAweDA2QTksIDB4MDZBOSwgMHgwNkE5LCAweDA2QTksIDB4MDZBRiwgMHgwNkFGLCAweDA2QUYsIDB4MDZBRiwKKyAgICAweDA2QjMsIDB4MDZCMywgMHgwNkIzLCAweDA2QjMsIDB4MDZCMSwgMHgwNkIxLCAweDA2QjEsIDB4MDZCMSwgMHgwNkJBLAorICAgIDB4MDZCQSwgMHgwNkJCLCAweDA2QkIsIDB4MDZCQiwgMHgwNkJCLCAweDA2QzAsIDB4MDZDMCwgMHgwNkMxLCAweDA2QzEsCisgICAgMHgwNkMxLCAweDA2QzEsIDB4MDZCRSwgMHgwNkJFLCAweDA2QkUsIDB4MDZCRSwgMHgwNkQyLCAweDA2RDIsIDB4MDZEMywKKyAgICAweDA2RDMsIDB4MDZBRCwgMHgwNkFELCAweDA2QUQsIDB4MDZBRCwgMHgwNkM3LCAweDA2QzcsIDB4MDZDNiwgMHgwNkM2LAorICAgIDB4MDZDOCwgMHgwNkM4LCAweDA2NzcsIDB4MDZDQiwgMHgwNkNCLCAweDA2QzUsIDB4MDZDNSwgMHgwNkM5LCAweDA2QzksCisgICAgMHgwNkQwLCAweDA2RDAsIDB4MDZEMCwgMHgwNkQwLCAweDA2NDksIDB4MDY0OSwgMHgwNkNDLCAweDA2Q0MsIDB4MDZDQywKKyAgICAweDA2Q0MsIDB4MDAyQywgMHgzMDAxLCAweDMwMDIsIDB4MDAzQSwgMHgwMDNCLCAweDAwMjEsIDB4MDAzRiwgMHgzMDE2LAorICAgIDB4MzAxNywgMHgyMDI2LCAweDIwMjUsIDB4MjAxNCwgMHgyMDEzLCAweDAwNUYsIDB4MDA1RiwgMHgwMDI4LCAweDAwMjksCisgICAgMHgwMDdCLCAweDAwN0QsIDB4MzAxNCwgMHgzMDE1LCAweDMwMTAsIDB4MzAxMSwgMHgzMDBBLCAweDMwMEIsIDB4MzAwOCwKKyAgICAweDMwMDksIDB4MzAwQywgMHgzMDBELCAweDMwMEUsIDB4MzAwRiwgMHgwMDVCLCAweDAwNUQsIDB4MjAzRSwgMHgyMDNFLAorICAgIDB4MjAzRSwgMHgyMDNFLCAweDAwNUYsIDB4MDA1RiwgMHgwMDVGLCAweDAwMkMsIDB4MzAwMSwgMHgwMDJFLCAweDAwM0IsCisgICAgMHgwMDNBLCAweDAwM0YsIDB4MDAyMSwgMHgyMDE0LCAweDAwMjgsIDB4MDAyOSwgMHgwMDdCLCAweDAwN0QsIDB4MzAxNCwKKyAgICAweDMwMTUsIDB4MDAyMywgMHgwMDI2LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJELCAweDAwM0MsIDB4MDAzRSwgMHgwMDNELAorICAgIDB4MDA1QywgMHgwMDI0LCAweDAwMjUsIDB4MDA0MCwgMHgwNjRCLCAweDA2NEMsIDB4MDY0RCwgMHgwNjRFLCAweDA2NEYsCisgICAgMHgwNjUwLCAweDA2NTEsIDB4MDY1MiwgMHgwNjIxLCAweDA2MjIsIDB4MDYyMiwgMHgwNjIzLCAweDA2MjMsIDB4MDYyNCwKKyAgICAweDA2MjQsIDB4MDYyNSwgMHgwNjI1LCAweDA2MjYsIDB4MDYyNiwgMHgwNjI2LCAweDA2MjYsIDB4MDYyNywgMHgwNjI3LAorICAgIDB4MDYyOCwgMHgwNjI4LCAweDA2MjgsIDB4MDYyOCwgMHgwNjI5LCAweDA2MjksIDB4MDYyQSwgMHgwNjJBLCAweDA2MkEsCisgICAgMHgwNjJBLCAweDA2MkIsIDB4MDYyQiwgMHgwNjJCLCAweDA2MkIsIDB4MDYyQywgMHgwNjJDLCAweDA2MkMsIDB4MDYyQywKKyAgICAweDA2MkQsIDB4MDYyRCwgMHgwNjJELCAweDA2MkQsIDB4MDYyRSwgMHgwNjJFLCAweDA2MkUsIDB4MDYyRSwgMHgwNjJGLAorICAgIDB4MDYyRiwgMHgwNjMwLCAweDA2MzAsIDB4MDYzMSwgMHgwNjMxLCAweDA2MzIsIDB4MDYzMiwgMHgwNjMzLCAweDA2MzMsCisgICAgMHgwNjMzLCAweDA2MzMsIDB4MDYzNCwgMHgwNjM0LCAweDA2MzQsIDB4MDYzNCwgMHgwNjM1LCAweDA2MzUsIDB4MDYzNSwKKyAgICAweDA2MzUsIDB4MDYzNiwgMHgwNjM2LCAweDA2MzYsIDB4MDYzNiwgMHgwNjM3LCAweDA2MzcsIDB4MDYzNywgMHgwNjM3LAorICAgIDB4MDYzOCwgMHgwNjM4LCAweDA2MzgsIDB4MDYzOCwgMHgwNjM5LCAweDA2MzksIDB4MDYzOSwgMHgwNjM5LCAweDA2M0EsCisgICAgMHgwNjNBLCAweDA2M0EsIDB4MDYzQSwgMHgwNjQxLCAweDA2NDEsIDB4MDY0MSwgMHgwNjQxLCAweDA2NDIsIDB4MDY0MiwKKyAgICAweDA2NDIsIDB4MDY0MiwgMHgwNjQzLCAweDA2NDMsIDB4MDY0MywgMHgwNjQzLCAweDA2NDQsIDB4MDY0NCwgMHgwNjQ0LAorICAgIDB4MDY0NCwgMHgwNjQ1LCAweDA2NDUsIDB4MDY0NSwgMHgwNjQ1LCAweDA2NDYsIDB4MDY0NiwgMHgwNjQ2LCAweDA2NDYsCisgICAgMHgwNjQ3LCAweDA2NDcsIDB4MDY0NywgMHgwNjQ3LCAweDA2NDgsIDB4MDY0OCwgMHgwNjQ5LCAweDA2NDksIDB4MDY0QSwKKyAgICAweDA2NEEsIDB4MDY0QSwgMHgwNjRBLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LAorICAgIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwKKyAgICAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLAorICAgIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsCisgICAgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKyAgICAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLAorICAgIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsCisgICAgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwKKyAgICAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorICAgIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwgMHgyOTg1LCAweDI5ODYsCisgICAgMHgzMDAyLCAweDMwMEMsIDB4MzAwRCwgMHgzMDAxLCAweDMwRkIsIDB4MzBGMiwgMHgzMEExLCAweDMwQTMsIDB4MzBBNSwKKyAgICAweDMwQTcsIDB4MzBBOSwgMHgzMEUzLCAweDMwRTUsIDB4MzBFNywgMHgzMEMzLCAweDMwRkMsIDB4MzBBMiwgMHgzMEE0LAorICAgIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLCAweDMwQjUsCisgICAgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LCAweDMwQzYsIDB4MzBDOCwKKyAgICAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDIsIDB4MzBENSwgMHgzMEQ4LAorICAgIDB4MzBEQiwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFNCwgMHgzMEU2LCAweDMwRTgsCisgICAgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwgMHgzMEYzLCAweDMwOTksIDB4MzA5QSwKKyAgICAweDMxNjQsIDB4MzEzMSwgMHgzMTMyLCAweDMxMzMsIDB4MzEzNCwgMHgzMTM1LCAweDMxMzYsIDB4MzEzNywgMHgzMTM4LAorICAgIDB4MzEzOSwgMHgzMTNBLCAweDMxM0IsIDB4MzEzQywgMHgzMTNELCAweDMxM0UsIDB4MzEzRiwgMHgzMTQwLCAweDMxNDEsCisgICAgMHgzMTQyLCAweDMxNDMsIDB4MzE0NCwgMHgzMTQ1LCAweDMxNDYsIDB4MzE0NywgMHgzMTQ4LCAweDMxNDksIDB4MzE0QSwKKyAgICAweDMxNEIsIDB4MzE0QywgMHgzMTRELCAweDMxNEUsIDB4MzE0RiwgMHgzMTUwLCAweDMxNTEsIDB4MzE1MiwgMHgzMTUzLAorICAgIDB4MzE1NCwgMHgzMTU1LCAweDMxNTYsIDB4MzE1NywgMHgzMTU4LCAweDMxNTksIDB4MzE1QSwgMHgzMTVCLCAweDMxNUMsCisgICAgMHgzMTVELCAweDMxNUUsIDB4MzE1RiwgMHgzMTYwLCAweDMxNjEsIDB4MzE2MiwgMHgzMTYzLCAweDAwQTIsIDB4MDBBMywKKyAgICAweDAwQUMsIDB4MDBBRiwgMHgwMEE2LCAweDAwQTUsIDB4MjBBOSwgMHgyNTAyLCAweDIxOTAsIDB4MjE5MSwgMHgyMTkyLAorICAgIDB4MjE5MywgMHgyNUEwLCAweDI1Q0J9OwogZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAyWzE3MjRdID0gewotICAgIDB4MDA0RiwgMHgwMDQ1LCAweDAwNTQsIDB4MDA0RCwgMHgwMDZGLCAweDAwNjUsIDB4MDA0OSwgMHgwMDRBLCAweDAwNjksIDB4MDA2QSwgMHgwMDRGLCAweDAwNDUsIDB4MDA2RiwgMHgwMDY1LCAweDAwNDQsIDB4MDE3RCwKLSAgICAweDAwNDQsIDB4MDE3RSwgMHgwMDY0LCAweDAxN0UsIDB4MDA0QywgMHgwMDRBLCAweDAwNEMsIDB4MDA2QSwgMHgwMDZDLCAweDAwNkEsIDB4MDA0RSwgMHgwMDRBLCAweDAwNEUsIDB4MDA2QSwgMHgwMDZFLCAweDAwNkEsCi0gICAgMHgwMDQ0LCAweDAwNUEsIDB4MDA0NCwgMHgwMDdBLCAweDAwNjQsIDB4MDA3QSwgMHgwMDY0LCAweDAwNjIsIDB4MDA3MSwgMHgwMDcwLCAweDAwNEYsIDB4MDA0NSwgMHgwMDY0LCAweDAwN0EsIDB4MDA2NCwgMHgwMjkyLAotICAgIDB4MDA2NCwgMHgwMDdBLCAweDAwNzQsIDB4MDA3MywgMHgwMDc0LCAweDAyODMsIDB4MDA3NCwgMHgwMDYzLCAweDAwNjYsIDB4MDE0QiwgMHgwMDZDLCAweDAwNzMsIDB4MDA2QywgMHgwMDdBLCAweDA0MUQsIDB4MDQxMywKLSAgICAweDA0M0QsIDB4MDQzMywgMHgwNDIyLCAweDA0MjYsIDB4MDQ0MiwgMHgwNDQ2LCAweDA0MTAsIDB4MDQxNSwgMHgwNDMwLCAweDA0MzUsIDB4MDU2NSwgMHgwNTgyLCAweDA2MjcsIDB4MDY3NCwgMHgwNjQ4LCAweDA2NzQsCi0gICAgMHgwNkM3LCAweDA2NzQsIDB4MDY0QSwgMHgwNjc0LCAweDA2RDUsIDB4MDY1NCwgMHgwNkMxLCAweDA2NTQsIDB4MDZEMiwgMHgwNjU0LCAweDA5MjgsIDB4MDkzQywgMHgwOTMwLCAweDA5M0MsIDB4MDkzMywgMHgwOTNDLAotICAgIDB4MDkxNSwgMHgwOTNDLCAweDA5MTYsIDB4MDkzQywgMHgwOTE3LCAweDA5M0MsIDB4MDkxQywgMHgwOTNDLCAweDA5MjEsIDB4MDkzQywgMHgwOTIyLCAweDA5M0MsIDB4MDkyQiwgMHgwOTNDLCAweDA5MkYsIDB4MDkzQywKLSAgICAweDA5QzcsIDB4MDlCRSwgMHgwOUM3LCAweDA5RDcsIDB4MDlBMSwgMHgwOUJDLCAweDA5QTIsIDB4MDlCQywgMHgwOUFGLCAweDA5QkMsIDB4MEEzMiwgMHgwQTNDLCAweDBBMzgsIDB4MEEzQywgMHgwQTE2LCAweDBBM0MsCi0gICAgMHgwQTE3LCAweDBBM0MsIDB4MEExQywgMHgwQTNDLCAweDBBMkIsIDB4MEEzQywgMHgwQjQ3LCAweDBCNTYsIDB4MEI0NywgMHgwQjNFLCAweDBCNDcsIDB4MEI1NywgMHgwQjIxLCAweDBCM0MsIDB4MEIyMiwgMHgwQjNDLAotICAgIDB4MEI5MiwgMHgwQkQ3LCAweDBCQzYsIDB4MEJCRSwgMHgwQkM3LCAweDBCQkUsIDB4MEJDNiwgMHgwQkQ3LCAweDBDNDYsIDB4MEM1NiwgMHgwQ0JGLCAweDBDRDUsIDB4MENDNiwgMHgwQ0Q1LCAweDBDQzYsIDB4MENENiwKLSAgICAweDBDQzYsIDB4MENDMiwgMHgwQ0NBLCAweDBDRDUsIDB4MEQ0NiwgMHgwRDNFLCAweDBENDcsIDB4MEQzRSwgMHgwRDQ2LCAweDBENTcsIDB4MEREOSwgMHgwRENBLCAweDBERDksIDB4MERDRiwgMHgwRERDLCAweDBEQ0EsCi0gICAgMHgwREQ5LCAweDBEREYsIDB4MEU0RCwgMHgwRTMyLCAweDBFQ0QsIDB4MEVCMiwgMHgwRUFCLCAweDBFOTksIDB4MEVBQiwgMHgwRUExLCAweDBGNDIsIDB4MEZCNywgMHgwRjRDLCAweDBGQjcsIDB4MEY1MSwgMHgwRkI3LAotICAgIDB4MEY1NiwgMHgwRkI3LCAweDBGNUIsIDB4MEZCNywgMHgwRjQwLCAweDBGQjUsIDB4MEY3MSwgMHgwRjcyLCAweDBGNzEsIDB4MEY3NCwgMHgwRkIyLCAweDBGODAsIDB4MEZCMiwgMHgwRjgxLCAweDBGQjMsIDB4MEY4MCwKLSAgICAweDBGQjMsIDB4MEY4MSwgMHgwRjcxLCAweDBGODAsIDB4MEY5MiwgMHgwRkI3LCAweDBGOUMsIDB4MEZCNywgMHgwRkExLCAweDBGQjcsIDB4MEZBNiwgMHgwRkI3LCAweDBGQUIsIDB4MEZCNywgMHgwRjkwLCAweDBGQjUsCi0gICAgMHgxMDI1LCAweDEwMkUsIDB4MUIwNSwgMHgxQjM1LCAweDFCMDcsIDB4MUIzNSwgMHgxQjA5LCAweDFCMzUsIDB4MUIwQiwgMHgxQjM1LCAweDFCMEQsIDB4MUIzNSwgMHgxQjExLCAweDFCMzUsIDB4MUIzQSwgMHgxQjM1LAotICAgIDB4MUIzQywgMHgxQjM1LCAweDFCM0UsIDB4MUIzNSwgMHgxQjNGLCAweDFCMzUsIDB4MUI0MiwgMHgxQjM1LCAweDAwNzQsIDB4MDA2OCwgMHgwMDJFLCAweDAwMkUsIDB4MjAzMiwgMHgyMDMyLCAweDIwMzUsIDB4MjAzNSwKLSAgICAweDAwMjEsIDB4MDAyMSwgMHgwMDIwLCAweDAzMDUsIDB4MDAzRiwgMHgwMDNGLCAweDAwM0YsIDB4MDAyMSwgMHgwMDIxLCAweDAwM0YsIDB4MDA1MiwgMHgwMDczLCAweDAwQjAsIDB4MDA0MywgMHgwMEIwLCAweDAwNDYsCi0gICAgMHgwMDRFLCAweDAwNkYsIDB4MDA1MywgMHgwMDRELCAweDAwNTQsIDB4MDA0RCwgMHgwMDMxLCAweDAwMkYsIDB4MDA0OSwgMHgwMDQ5LCAweDAwNDksIDB4MDA1NiwgMHgwMDU2LCAweDAwNDksIDB4MDA0OSwgMHgwMDU4LAotICAgIDB4MDA1OCwgMHgwMDQ5LCAweDAwNjksIDB4MDA2OSwgMHgwMDY5LCAweDAwNzYsIDB4MDA3NiwgMHgwMDY5LCAweDAwNjksIDB4MDA3OCwgMHgwMDc4LCAweDAwNjksIDB4MjE5MCwgMHgwMzM4LCAweDIxOTIsIDB4MDMzOCwKLSAgICAweDIxOTQsIDB4MDMzOCwgMHgyMUQwLCAweDAzMzgsIDB4MjFENCwgMHgwMzM4LCAweDIxRDIsIDB4MDMzOCwgMHgyMjIzLCAweDAzMzgsIDB4MjIyNSwgMHgwMzM4LCAweDIyMkIsIDB4MjIyQiwgMHgyMjJFLCAweDIyMkUsCi0gICAgMHgyMjNDLCAweDAzMzgsIDB4MjI0MywgMHgwMzM4LCAweDIyNDUsIDB4MDMzOCwgMHgyMjQ4LCAweDAzMzgsIDB4MDAzRCwgMHgwMDJGLCAweDIyNjEsIDB4MDAyRiwgMHgyMjRELCAweDAwMkYsIDB4MDAzQywgMHgwMDJGLAotICAgIDB4MDAzRSwgMHgwMDJGLCAweDIyNjQsIDB4MDAyRiwgMHgyMjY1LCAweDAwMkYsIDB4MjI3MiwgMHgwMDJGLCAweDIyNzMsIDB4MDAyRiwgMHgyMjc2LCAweDAwMkYsIDB4MjI3NywgMHgwMDJGLCAweDIyN0EsIDB4MDAyRiwKLSAgICAweDIyN0IsIDB4MDAyRiwgMHgyMjgyLCAweDAwMkYsIDB4MjI4MywgMHgwMDJGLCAweDIyODYsIDB4MDAyRiwgMHgyMjg3LCAweDAwMkYsIDB4MjJBMiwgMHgwMDJGLCAweDIyQTgsIDB4MDAyRiwgMHgyMkE5LCAweDAwMkYsCi0gICAgMHgyMkFCLCAweDAwMkYsIDB4MjI3QywgMHgwMDJGLCAweDIyN0QsIDB4MDAyRiwgMHgyMjkxLCAweDAwMkYsIDB4MjI5MiwgMHgwMDJGLCAweDIyQjIsIDB4MDAyRiwgMHgyMkIzLCAweDAwMkYsIDB4MjJCNCwgMHgwMDJGLAotICAgIDB4MjJCNSwgMHgwMDJGLCAweDAwNDIsIDB4MDA1MywgMHgwMDQ4LCAweDAwNTQsIDB4MDA0QywgMHgwMDQ2LCAweDAwNTYsIDB4MDA1NCwgMHgwMDQ2LCAweDAwNDYsIDB4MDA0MywgMHgwMDUyLCAweDAwNTMsIDB4MDA1MywKLSAgICAweDAwNTMsIDB4MDA0OSwgMHgwMDQ1LCAweDAwNEQsIDB4MDA0NiwgMHgwMDUzLCAweDAwNDcsIDB4MDA1MywgMHgwMDUyLCAweDAwNTMsIDB4MDA1NSwgMHgwMDUzLCAweDAwNTMsIDB4MDA1MCwgMHgwMDMxLCAweDAwMzAsCi0gICAgMHgwMDMxLCAweDAwMzEsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzEsIDB4MDAzMywgMHgwMDMxLCAweDAwMzQsIDB4MDAzMSwgMHgwMDM1LCAweDAwMzEsIDB4MDAzNiwgMHgwMDMxLCAweDAwMzcsIDB4MDAzMSwgMHgwMDM4LAotICAgIDB4MDAzMSwgMHgwMDM5LCAweDAwMzIsIDB4MDAzMCwgMHgwMDMxLCAweDAwMkUsIDB4MDAzMiwgMHgwMDJFLCAweDAwMzMsIDB4MDAyRSwgMHgwMDM0LCAweDAwMkUsIDB4MDAzNSwgMHgwMDJFLCAweDAwMzYsIDB4MDAyRSwKLSAgICAweDAwMzcsIDB4MDAyRSwgMHgwMDM4LCAweDAwMkUsIDB4MDAzOSwgMHgwMDJFLCAweDAwMzEsIDB4MDAzMSwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzEsIDB4MDAzNCwgMHgwMDMxLCAweDAwMzUsCi0gICAgMHgwMDMxLCAweDAwMzYsIDB4MDAzMSwgMHgwMDM3LCAweDAwMzEsIDB4MDAzOCwgMHgwMDMxLCAweDAwMzksIDB4MDAzMiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMwLAotICAgIDB4MDAzMSwgMHgwMDMwLCAweDAwM0QsIDB4MDAzRCwgMHgyQURELCAweDAwMkYsIDB4MzA0QiwgMHgzMDk5LCAweDMwNEQsIDB4MzA5OSwgMHgzMDRGLCAweDMwOTksIDB4MzA1MSwgMHgzMDk5LCAweDMwNTMsIDB4MzA5OSwKLSAgICAweDMwNTUsIDB4MzA5OSwgMHgzMDU3LCAweDMwOTksIDB4MzA1OSwgMHgzMDk5LCAweDMwNUIsIDB4MzA5OSwgMHgzMDVELCAweDMwOTksIDB4MzA1RiwgMHgzMDk5LCAweDMwNjEsIDB4MzA5OSwgMHgzMDY0LCAweDMwOTksCi0gICAgMHgzMDY2LCAweDMwOTksIDB4MzA2OCwgMHgzMDk5LCAweDMwNkYsIDB4MzA5OSwgMHgzMDZGLCAweDMwOUEsIDB4MzA3MiwgMHgzMDk5LCAweDMwNzIsIDB4MzA5QSwgMHgzMDc1LCAweDMwOTksIDB4MzA3NSwgMHgzMDlBLAotICAgIDB4MzA3OCwgMHgzMDk5LCAweDMwNzgsIDB4MzA5QSwgMHgzMDdCLCAweDMwOTksIDB4MzA3QiwgMHgzMDlBLCAweDMwNDYsIDB4MzA5OSwgMHgwMDIwLCAweDMwOTksIDB4MDAyMCwgMHgzMDlBLCAweDMwOUQsIDB4MzA5OSwKLSAgICAweDMwODgsIDB4MzA4QSwgMHgzMEFCLCAweDMwOTksIDB4MzBBRCwgMHgzMDk5LCAweDMwQUYsIDB4MzA5OSwgMHgzMEIxLCAweDMwOTksIDB4MzBCMywgMHgzMDk5LCAweDMwQjUsIDB4MzA5OSwgMHgzMEI3LCAweDMwOTksCi0gICAgMHgzMEI5LCAweDMwOTksIDB4MzBCQiwgMHgzMDk5LCAweDMwQkQsIDB4MzA5OSwgMHgzMEJGLCAweDMwOTksIDB4MzBDMSwgMHgzMDk5LCAweDMwQzQsIDB4MzA5OSwgMHgzMEM2LCAweDMwOTksIDB4MzBDOCwgMHgzMDk5LAotICAgIDB4MzBDRiwgMHgzMDk5LCAweDMwQ0YsIDB4MzA5QSwgMHgzMEQyLCAweDMwOTksIDB4MzBEMiwgMHgzMDlBLCAweDMwRDUsIDB4MzA5OSwgMHgzMEQ1LCAweDMwOUEsIDB4MzBEOCwgMHgzMDk5LCAweDMwRDgsIDB4MzA5QSwKLSAgICAweDMwREIsIDB4MzA5OSwgMHgzMERCLCAweDMwOUEsIDB4MzBBNiwgMHgzMDk5LCAweDMwRUYsIDB4MzA5OSwgMHgzMEYwLCAweDMwOTksIDB4MzBGMSwgMHgzMDk5LCAweDMwRjIsIDB4MzA5OSwgMHgzMEZELCAweDMwOTksCi0gICAgMHgzMEIzLCAweDMwQzgsIDB4MDAzMiwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMiwgMHgwMDMyLCAweDAwMzMsIDB4MDAzMiwgMHgwMDM0LCAweDAwMzIsIDB4MDAzNSwgMHgwMDMyLCAweDAwMzYsIDB4MDAzMiwgMHgwMDM3LAotICAgIDB4MDAzMiwgMHgwMDM4LCAweDAwMzIsIDB4MDAzOSwgMHgwMDMzLCAweDAwMzAsIDB4MDAzMywgMHgwMDMxLCAweDAwMzMsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzMsIDB4MDAzMywgMHgwMDM0LCAweDAwMzMsIDB4MDAzNSwKLSAgICAweDExMDAsIDB4MTE2MSwgMHgxMTAyLCAweDExNjEsIDB4MTEwMywgMHgxMTYxLCAweDExMDUsIDB4MTE2MSwgMHgxMTA2LCAweDExNjEsIDB4MTEwNywgMHgxMTYxLCAweDExMDksIDB4MTE2MSwgMHgxMTBCLCAweDExNjEsCi0gICAgMHgxMTBDLCAweDExNjEsIDB4MTEwRSwgMHgxMTYxLCAweDExMEYsIDB4MTE2MSwgMHgxMTEwLCAweDExNjEsIDB4MTExMSwgMHgxMTYxLCAweDExMTIsIDB4MTE2MSwgMHgxMTBCLCAweDExNkUsIDB4MDAzMywgMHgwMDM2LAotICAgIDB4MDAzMywgMHgwMDM3LCAweDAwMzMsIDB4MDAzOCwgMHgwMDMzLCAweDAwMzksIDB4MDAzNCwgMHgwMDMwLCAweDAwMzQsIDB4MDAzMSwgMHgwMDM0LCAweDAwMzIsIDB4MDAzNCwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNCwKLSAgICAweDAwMzQsIDB4MDAzNSwgMHgwMDM0LCAweDAwMzYsIDB4MDAzNCwgMHgwMDM3LCAweDAwMzQsIDB4MDAzOCwgMHgwMDM0LCAweDAwMzksIDB4MDAzNSwgMHgwMDMwLCAweDAwMzEsIDB4NjcwOCwgMHgwMDMyLCAweDY3MDgsCi0gICAgMHgwMDMzLCAweDY3MDgsIDB4MDAzNCwgMHg2NzA4LCAweDAwMzUsIDB4NjcwOCwgMHgwMDM2LCAweDY3MDgsIDB4MDAzNywgMHg2NzA4LCAweDAwMzgsIDB4NjcwOCwgMHgwMDM5LCAweDY3MDgsIDB4MDA0OCwgMHgwMDY3LAotICAgIDB4MDA2NSwgMHgwMDU2LCAweDMwQUUsIDB4MzBBQywgMHgzMEFELCAweDMwRUQsIDB4MzBDNywgMHgzMEI3LCAweDMwQzksIDB4MzBFQiwgMHgzMEM4LCAweDMwRjMsIDB4MzBDQSwgMHgzMENFLCAweDMwRDQsIDB4MzBCMywKLSAgICAweDMwRDMsIDB4MzBFQiwgMHgzMERBLCAweDMwQkQsIDB4MzBEQiwgMHgzMEYzLCAweDMwREYsIDB4MzBFQSwgMHgzMEUxLCAweDMwQUMsIDB4MzBFQSwgMHgzMEU5LCAweDMwRUMsIDB4MzBFMCwgMHgwMDMwLCAweDcwQjksCi0gICAgMHgwMDMxLCAweDcwQjksIDB4MDAzMiwgMHg3MEI5LCAweDAwMzMsIDB4NzBCOSwgMHgwMDM0LCAweDcwQjksIDB4MDAzNSwgMHg3MEI5LCAweDAwMzYsIDB4NzBCOSwgMHgwMDM3LCAweDcwQjksIDB4MDAzOCwgMHg3MEI5LAotICAgIDB4MDAzOSwgMHg3MEI5LCAweDAwNjQsIDB4MDA2MSwgMHgwMDQxLCAweDAwNTUsIDB4MDA2RiwgMHgwMDU2LCAweDAwNzAsIDB4MDA2MywgMHgwMDY0LCAweDAwNkQsIDB4MDA0OSwgMHgwMDU1LCAweDVFNzMsIDB4NjIxMCwKLSAgICAweDY2MkQsIDB4NTQ4QywgMHg1OTI3LCAweDZCNjMsIDB4NjYwRSwgMHg2Q0JCLCAweDAwNzAsIDB4MDA0MSwgMHgwMDZFLCAweDAwNDEsIDB4MDNCQywgMHgwMDQxLCAweDAwNkQsIDB4MDA0MSwgMHgwMDZCLCAweDAwNDEsCi0gICAgMHgwMDRCLCAweDAwNDIsIDB4MDA0RCwgMHgwMDQyLCAweDAwNDcsIDB4MDA0MiwgMHgwMDcwLCAweDAwNDYsIDB4MDA2RSwgMHgwMDQ2LCAweDAzQkMsIDB4MDA0NiwgMHgwM0JDLCAweDAwNjcsIDB4MDA2RCwgMHgwMDY3LAotICAgIDB4MDA2QiwgMHgwMDY3LCAweDAwNDgsIDB4MDA3QSwgMHgwM0JDLCAweDIxMTMsIDB4MDA2RCwgMHgyMTEzLCAweDAwNjQsIDB4MjExMywgMHgwMDZCLCAweDIxMTMsIDB4MDA2NiwgMHgwMDZELCAweDAwNkUsIDB4MDA2RCwKLSAgICAweDAzQkMsIDB4MDA2RCwgMHgwMDZELCAweDAwNkQsIDB4MDA2MywgMHgwMDZELCAweDAwNkIsIDB4MDA2RCwgMHgwMDZELCAweDAwQjIsIDB4MDA2RCwgMHgwMEIzLCAweDAwNTAsIDB4MDA2MSwgMHgwMDcwLCAweDAwNzMsCi0gICAgMHgwMDZFLCAweDAwNzMsIDB4MDNCQywgMHgwMDczLCAweDAwNkQsIDB4MDA3MywgMHgwMDcwLCAweDAwNTYsIDB4MDA2RSwgMHgwMDU2LCAweDAzQkMsIDB4MDA1NiwgMHgwMDZELCAweDAwNTYsIDB4MDA2QiwgMHgwMDU2LAotICAgIDB4MDA0RCwgMHgwMDU2LCAweDAwNzAsIDB4MDA1NywgMHgwMDZFLCAweDAwNTcsIDB4MDNCQywgMHgwMDU3LCAweDAwNkQsIDB4MDA1NywgMHgwMDZCLCAweDAwNTcsIDB4MDA0RCwgMHgwMDU3LCAweDAwNkIsIDB4MDNBOSwKLSAgICAweDAwNEQsIDB4MDNBOSwgMHgwMDQyLCAweDAwNzEsIDB4MDA2MywgMHgwMDYzLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY0LCAweDAwNDIsIDB4MDA0NywgMHgwMDc5LCAweDAwNjgsIDB4MDA2MSwgMHgwMDQ4LCAweDAwNTAsCi0gICAgMHgwMDY5LCAweDAwNkUsIDB4MDA0QiwgMHgwMDRCLCAweDAwNEIsIDB4MDA0RCwgMHgwMDZCLCAweDAwNzQsIDB4MDA2QywgMHgwMDZELCAweDAwNkMsIDB4MDA2RSwgMHgwMDZDLCAweDAwNzgsIDB4MDA2RCwgMHgwMDYyLAotICAgIDB4MDA1MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1MiwgMHgwMDczLCAweDAwNzIsIDB4MDA1MywgMHgwMDc2LCAweDAwNTcsIDB4MDA2MiwgMHgwMDMxLCAweDY1RTUsIDB4MDAzMiwgMHg2NUU1LCAweDAwMzMsIDB4NjVFNSwKLSAgICAweDAwMzQsIDB4NjVFNSwgMHgwMDM1LCAweDY1RTUsIDB4MDAzNiwgMHg2NUU1LCAweDAwMzcsIDB4NjVFNSwgMHgwMDM4LCAweDY1RTUsIDB4MDAzOSwgMHg2NUU1LCAweDAwNjYsIDB4MDA2NiwgMHgwMDY2LCAweDAwNjksCi0gICAgMHgwMDY2LCAweDAwNkMsIDB4MDE3RiwgMHgwMDc0LCAweDAwNzMsIDB4MDA3NCwgMHgwNTc0LCAweDA1NzYsIDB4MDU3NCwgMHgwNTY1LCAweDA1NzQsIDB4MDU2QiwgMHgwNTdFLCAweDA1NzYsIDB4MDU3NCwgMHgwNTZELAotICAgIDB4MDVEOSwgMHgwNUI0LCAweDA1RjIsIDB4MDVCNywgMHgwNUU5LCAweDA1QzEsIDB4MDVFOSwgMHgwNUMyLCAweEZCNDksIDB4MDVDMSwgMHhGQjQ5LCAweDA1QzIsIDB4MDVEMCwgMHgwNUI3LCAweDA1RDAsIDB4MDVCOCwKLSAgICAweDA1RDAsIDB4MDVCQywgMHgwNUQxLCAweDA1QkMsIDB4MDVEMiwgMHgwNUJDLCAweDA1RDMsIDB4MDVCQywgMHgwNUQ0LCAweDA1QkMsIDB4MDVENSwgMHgwNUJDLCAweDA1RDYsIDB4MDVCQywgMHgwNUQ4LCAweDA1QkMsCi0gICAgMHgwNUQ5LCAweDA1QkMsIDB4MDVEQSwgMHgwNUJDLCAweDA1REIsIDB4MDVCQywgMHgwNURDLCAweDA1QkMsIDB4MDVERSwgMHgwNUJDLCAweDA1RTAsIDB4MDVCQywgMHgwNUUxLCAweDA1QkMsIDB4MDVFMywgMHgwNUJDLAotICAgIDB4MDVFNCwgMHgwNUJDLCAweDA1RTYsIDB4MDVCQywgMHgwNUU3LCAweDA1QkMsIDB4MDVFOCwgMHgwNUJDLCAweDA1RTksIDB4MDVCQywgMHgwNUVBLCAweDA1QkMsIDB4MDVENSwgMHgwNUI5LCAweDA1RDEsIDB4MDVCRiwKLSAgICAweDA1REIsIDB4MDVCRiwgMHgwNUU0LCAweDA1QkYsIDB4MDVEMCwgMHgwNURDLCAweDA2MjYsIDB4MDYyNywgMHgwNjI2LCAweDA2MjcsIDB4MDYyNiwgMHgwNkQ1LCAweDA2MjYsIDB4MDZENSwgMHgwNjI2LCAweDA2NDgsCi0gICAgMHgwNjI2LCAweDA2NDgsIDB4MDYyNiwgMHgwNkM3LCAweDA2MjYsIDB4MDZDNywgMHgwNjI2LCAweDA2QzYsIDB4MDYyNiwgMHgwNkM2LCAweDA2MjYsIDB4MDZDOCwgMHgwNjI2LCAweDA2QzgsIDB4MDYyNiwgMHgwNkQwLAotICAgIDB4MDYyNiwgMHgwNkQwLCAweDA2MjYsIDB4MDZEMCwgMHgwNjI2LCAweDA2NDksIDB4MDYyNiwgMHgwNjQ5LCAweDA2MjYsIDB4MDY0OSwgMHgwNjI2LCAweDA2MkMsIDB4MDYyNiwgMHgwNjJELCAweDA2MjYsIDB4MDY0NSwKLSAgICAweDA2MjYsIDB4MDY0OSwgMHgwNjI2LCAweDA2NEEsIDB4MDYyOCwgMHgwNjJDLCAweDA2MjgsIDB4MDYyRCwgMHgwNjI4LCAweDA2MkUsIDB4MDYyOCwgMHgwNjQ1LCAweDA2MjgsIDB4MDY0OSwgMHgwNjI4LCAweDA2NEEsCi0gICAgMHgwNjJBLCAweDA2MkMsIDB4MDYyQSwgMHgwNjJELCAweDA2MkEsIDB4MDYyRSwgMHgwNjJBLCAweDA2NDUsIDB4MDYyQSwgMHgwNjQ5LCAweDA2MkEsIDB4MDY0QSwgMHgwNjJCLCAweDA2MkMsIDB4MDYyQiwgMHgwNjQ1LAotICAgIDB4MDYyQiwgMHgwNjQ5LCAweDA2MkIsIDB4MDY0QSwgMHgwNjJDLCAweDA2MkQsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkQsIDB4MDYyQywgMHgwNjJELCAweDA2NDUsIDB4MDYyRSwgMHgwNjJDLCAweDA2MkUsIDB4MDYyRCwKLSAgICAweDA2MkUsIDB4MDY0NSwgMHgwNjMzLCAweDA2MkMsIDB4MDYzMywgMHgwNjJELCAweDA2MzMsIDB4MDYyRSwgMHgwNjMzLCAweDA2NDUsIDB4MDYzNSwgMHgwNjJELCAweDA2MzUsIDB4MDY0NSwgMHgwNjM2LCAweDA2MkMsCi0gICAgMHgwNjM2LCAweDA2MkQsIDB4MDYzNiwgMHgwNjJFLCAweDA2MzYsIDB4MDY0NSwgMHgwNjM3LCAweDA2MkQsIDB4MDYzNywgMHgwNjQ1LCAweDA2MzgsIDB4MDY0NSwgMHgwNjM5LCAweDA2MkMsIDB4MDYzOSwgMHgwNjQ1LAotICAgIDB4MDYzQSwgMHgwNjJDLCAweDA2M0EsIDB4MDY0NSwgMHgwNjQxLCAweDA2MkMsIDB4MDY0MSwgMHgwNjJELCAweDA2NDEsIDB4MDYyRSwgMHgwNjQxLCAweDA2NDUsIDB4MDY0MSwgMHgwNjQ5LCAweDA2NDEsIDB4MDY0QSwKLSAgICAweDA2NDIsIDB4MDYyRCwgMHgwNjQyLCAweDA2NDUsIDB4MDY0MiwgMHgwNjQ5LCAweDA2NDIsIDB4MDY0QSwgMHgwNjQzLCAweDA2MjcsIDB4MDY0MywgMHgwNjJDLCAweDA2NDMsIDB4MDYyRCwgMHgwNjQzLCAweDA2MkUsCi0gICAgMHgwNjQzLCAweDA2NDQsIDB4MDY0MywgMHgwNjQ1LCAweDA2NDMsIDB4MDY0OSwgMHgwNjQzLCAweDA2NEEsIDB4MDY0NCwgMHgwNjJDLCAweDA2NDQsIDB4MDYyRCwgMHgwNjQ0LCAweDA2MkUsIDB4MDY0NCwgMHgwNjQ1LAotICAgIDB4MDY0NCwgMHgwNjQ5LCAweDA2NDQsIDB4MDY0QSwgMHgwNjQ1LCAweDA2MkMsIDB4MDY0NSwgMHgwNjJELCAweDA2NDUsIDB4MDYyRSwgMHgwNjQ1LCAweDA2NDUsIDB4MDY0NSwgMHgwNjQ5LCAweDA2NDUsIDB4MDY0QSwKLSAgICAweDA2NDYsIDB4MDYyQywgMHgwNjQ2LCAweDA2MkQsIDB4MDY0NiwgMHgwNjJFLCAweDA2NDYsIDB4MDY0NSwgMHgwNjQ2LCAweDA2NDksIDB4MDY0NiwgMHgwNjRBLCAweDA2NDcsIDB4MDYyQywgMHgwNjQ3LCAweDA2NDUsCi0gICAgMHgwNjQ3LCAweDA2NDksIDB4MDY0NywgMHgwNjRBLCAweDA2NEEsIDB4MDYyQywgMHgwNjRBLCAweDA2MkQsIDB4MDY0QSwgMHgwNjJFLCAweDA2NEEsIDB4MDY0NSwgMHgwNjRBLCAweDA2NDksIDB4MDY0QSwgMHgwNjRBLAotICAgIDB4MDYzMCwgMHgwNjcwLCAweDA2MzEsIDB4MDY3MCwgMHgwNjQ5LCAweDA2NzAsIDB4MDY0QywgMHgwNjUxLCAweDA2NEQsIDB4MDY1MSwgMHgwNjRFLCAweDA2NTEsIDB4MDY0RiwgMHgwNjUxLCAweDA2NTAsIDB4MDY1MSwKLSAgICAweDA2NTEsIDB4MDY3MCwgMHgwNjI2LCAweDA2MzEsIDB4MDYyNiwgMHgwNjMyLCAweDA2MjYsIDB4MDY0NSwgMHgwNjI2LCAweDA2NDYsIDB4MDYyNiwgMHgwNjQ5LCAweDA2MjYsIDB4MDY0QSwgMHgwNjI4LCAweDA2MzEsCi0gICAgMHgwNjI4LCAweDA2MzIsIDB4MDYyOCwgMHgwNjQ1LCAweDA2MjgsIDB4MDY0NiwgMHgwNjI4LCAweDA2NDksIDB4MDYyOCwgMHgwNjRBLCAweDA2MkEsIDB4MDYzMSwgMHgwNjJBLCAweDA2MzIsIDB4MDYyQSwgMHgwNjQ1LAotICAgIDB4MDYyQSwgMHgwNjQ2LCAweDA2MkEsIDB4MDY0OSwgMHgwNjJBLCAweDA2NEEsIDB4MDYyQiwgMHgwNjMxLCAweDA2MkIsIDB4MDYzMiwgMHgwNjJCLCAweDA2NDUsIDB4MDYyQiwgMHgwNjQ2LCAweDA2MkIsIDB4MDY0OSwKLSAgICAweDA2MkIsIDB4MDY0QSwgMHgwNjQxLCAweDA2NDksIDB4MDY0MSwgMHgwNjRBLCAweDA2NDIsIDB4MDY0OSwgMHgwNjQyLCAweDA2NEEsIDB4MDY0MywgMHgwNjI3LCAweDA2NDMsIDB4MDY0NCwgMHgwNjQzLCAweDA2NDUsCi0gICAgMHgwNjQzLCAweDA2NDksIDB4MDY0MywgMHgwNjRBLCAweDA2NDQsIDB4MDY0NSwgMHgwNjQ0LCAweDA2NDksIDB4MDY0NCwgMHgwNjRBLCAweDA2NDUsIDB4MDYyNywgMHgwNjQ1LCAweDA2NDUsIDB4MDY0NiwgMHgwNjMxLAotICAgIDB4MDY0NiwgMHgwNjMyLCAweDA2NDYsIDB4MDY0NSwgMHgwNjQ2LCAweDA2NDYsIDB4MDY0NiwgMHgwNjQ5LCAweDA2NDYsIDB4MDY0QSwgMHgwNjQ5LCAweDA2NzAsIDB4MDY0QSwgMHgwNjMxLCAweDA2NEEsIDB4MDYzMiwKLSAgICAweDA2NEEsIDB4MDY0NSwgMHgwNjRBLCAweDA2NDYsIDB4MDY0QSwgMHgwNjQ5LCAweDA2NEEsIDB4MDY0QSwgMHgwNjI2LCAweDA2MkMsIDB4MDYyNiwgMHgwNjJELCAweDA2MjYsIDB4MDYyRSwgMHgwNjI2LCAweDA2NDUsCi0gICAgMHgwNjI2LCAweDA2NDcsIDB4MDYyOCwgMHgwNjJDLCAweDA2MjgsIDB4MDYyRCwgMHgwNjI4LCAweDA2MkUsIDB4MDYyOCwgMHgwNjQ1LCAweDA2MjgsIDB4MDY0NywgMHgwNjJBLCAweDA2MkMsIDB4MDYyQSwgMHgwNjJELAotICAgIDB4MDYyQSwgMHgwNjJFLCAweDA2MkEsIDB4MDY0NSwgMHgwNjJBLCAweDA2NDcsIDB4MDYyQiwgMHgwNjQ1LCAweDA2MkMsIDB4MDYyRCwgMHgwNjJDLCAweDA2NDUsIDB4MDYyRCwgMHgwNjJDLCAweDA2MkQsIDB4MDY0NSwKLSAgICAweDA2MkUsIDB4MDYyQywgMHgwNjJFLCAweDA2NDUsIDB4MDYzMywgMHgwNjJDLCAweDA2MzMsIDB4MDYyRCwgMHgwNjMzLCAweDA2MkUsIDB4MDYzMywgMHgwNjQ1LCAweDA2MzUsIDB4MDYyRCwgMHgwNjM1LCAweDA2MkUsCi0gICAgMHgwNjM1LCAweDA2NDUsIDB4MDYzNiwgMHgwNjJDLCAweDA2MzYsIDB4MDYyRCwgMHgwNjM2LCAweDA2MkUsIDB4MDYzNiwgMHgwNjQ1LCAweDA2MzcsIDB4MDYyRCwgMHgwNjM4LCAweDA2NDUsIDB4MDYzOSwgMHgwNjJDLAotICAgIDB4MDYzOSwgMHgwNjQ1LCAweDA2M0EsIDB4MDYyQywgMHgwNjNBLCAweDA2NDUsIDB4MDY0MSwgMHgwNjJDLCAweDA2NDEsIDB4MDYyRCwgMHgwNjQxLCAweDA2MkUsIDB4MDY0MSwgMHgwNjQ1LCAweDA2NDIsIDB4MDYyRCwKLSAgICAweDA2NDIsIDB4MDY0NSwgMHgwNjQzLCAweDA2MkMsIDB4MDY0MywgMHgwNjJELCAweDA2NDMsIDB4MDYyRSwgMHgwNjQzLCAweDA2NDQsIDB4MDY0MywgMHgwNjQ1LCAweDA2NDQsIDB4MDYyQywgMHgwNjQ0LCAweDA2MkQsCi0gICAgMHgwNjQ0LCAweDA2MkUsIDB4MDY0NCwgMHgwNjQ1LCAweDA2NDQsIDB4MDY0NywgMHgwNjQ1LCAweDA2MkMsIDB4MDY0NSwgMHgwNjJELCAweDA2NDUsIDB4MDYyRSwgMHgwNjQ1LCAweDA2NDUsIDB4MDY0NiwgMHgwNjJDLAotICAgIDB4MDY0NiwgMHgwNjJELCAweDA2NDYsIDB4MDYyRSwgMHgwNjQ2LCAweDA2NDUsIDB4MDY0NiwgMHgwNjQ3LCAweDA2NDcsIDB4MDYyQywgMHgwNjQ3LCAweDA2NDUsIDB4MDY0NywgMHgwNjcwLCAweDA2NEEsIDB4MDYyQywKLSAgICAweDA2NEEsIDB4MDYyRCwgMHgwNjRBLCAweDA2MkUsIDB4MDY0QSwgMHgwNjQ1LCAweDA2NEEsIDB4MDY0NywgMHgwNjI2LCAweDA2NDUsIDB4MDYyNiwgMHgwNjQ3LCAweDA2MjgsIDB4MDY0NSwgMHgwNjI4LCAweDA2NDcsCi0gICAgMHgwNjJBLCAweDA2NDUsIDB4MDYyQSwgMHgwNjQ3LCAweDA2MkIsIDB4MDY0NSwgMHgwNjJCLCAweDA2NDcsIDB4MDYzMywgMHgwNjQ1LCAweDA2MzMsIDB4MDY0NywgMHgwNjM0LCAweDA2NDUsIDB4MDYzNCwgMHgwNjQ3LAotICAgIDB4MDY0MywgMHgwNjQ0LCAweDA2NDMsIDB4MDY0NSwgMHgwNjQ0LCAweDA2NDUsIDB4MDY0NiwgMHgwNjQ1LCAweDA2NDYsIDB4MDY0NywgMHgwNjRBLCAweDA2NDUsIDB4MDY0QSwgMHgwNjQ3LCAweDA2MzcsIDB4MDY0OSwKLSAgICAweDA2MzcsIDB4MDY0QSwgMHgwNjM5LCAweDA2NDksIDB4MDYzOSwgMHgwNjRBLCAweDA2M0EsIDB4MDY0OSwgMHgwNjNBLCAweDA2NEEsIDB4MDYzMywgMHgwNjQ5LCAweDA2MzMsIDB4MDY0QSwgMHgwNjM0LCAweDA2NDksCi0gICAgMHgwNjM0LCAweDA2NEEsIDB4MDYyRCwgMHgwNjQ5LCAweDA2MkQsIDB4MDY0QSwgMHgwNjJDLCAweDA2NDksIDB4MDYyQywgMHgwNjRBLCAweDA2MkUsIDB4MDY0OSwgMHgwNjJFLCAweDA2NEEsIDB4MDYzNSwgMHgwNjQ5LAotICAgIDB4MDYzNSwgMHgwNjRBLCAweDA2MzYsIDB4MDY0OSwgMHgwNjM2LCAweDA2NEEsIDB4MDYzNCwgMHgwNjJDLCAweDA2MzQsIDB4MDYyRCwgMHgwNjM0LCAweDA2MkUsIDB4MDYzNCwgMHgwNjQ1LCAweDA2MzQsIDB4MDYzMSwKLSAgICAweDA2MzMsIDB4MDYzMSwgMHgwNjM1LCAweDA2MzEsIDB4MDYzNiwgMHgwNjMxLCAweDA2MzcsIDB4MDY0OSwgMHgwNjM3LCAweDA2NEEsIDB4MDYzOSwgMHgwNjQ5LCAweDA2MzksIDB4MDY0QSwgMHgwNjNBLCAweDA2NDksCi0gICAgMHgwNjNBLCAweDA2NEEsIDB4MDYzMywgMHgwNjQ5LCAweDA2MzMsIDB4MDY0QSwgMHgwNjM0LCAweDA2NDksIDB4MDYzNCwgMHgwNjRBLCAweDA2MkQsIDB4MDY0OSwgMHgwNjJELCAweDA2NEEsIDB4MDYyQywgMHgwNjQ5LAotICAgIDB4MDYyQywgMHgwNjRBLCAweDA2MkUsIDB4MDY0OSwgMHgwNjJFLCAweDA2NEEsIDB4MDYzNSwgMHgwNjQ5LCAweDA2MzUsIDB4MDY0QSwgMHgwNjM2LCAweDA2NDksIDB4MDYzNiwgMHgwNjRBLCAweDA2MzQsIDB4MDYyQywKLSAgICAweDA2MzQsIDB4MDYyRCwgMHgwNjM0LCAweDA2MkUsIDB4MDYzNCwgMHgwNjQ1LCAweDA2MzQsIDB4MDYzMSwgMHgwNjMzLCAweDA2MzEsIDB4MDYzNSwgMHgwNjMxLCAweDA2MzYsIDB4MDYzMSwgMHgwNjM0LCAweDA2MkMsCi0gICAgMHgwNjM0LCAweDA2MkQsIDB4MDYzNCwgMHgwNjJFLCAweDA2MzQsIDB4MDY0NSwgMHgwNjMzLCAweDA2NDcsIDB4MDYzNCwgMHgwNjQ3LCAweDA2MzcsIDB4MDY0NSwgMHgwNjMzLCAweDA2MkMsIDB4MDYzMywgMHgwNjJELAotICAgIDB4MDYzMywgMHgwNjJFLCAweDA2MzQsIDB4MDYyQywgMHgwNjM0LCAweDA2MkQsIDB4MDYzNCwgMHgwNjJFLCAweDA2MzcsIDB4MDY0NSwgMHgwNjM4LCAweDA2NDUsIDB4MDYyNywgMHgwNjRCLCAweDA2MjcsIDB4MDY0QiwKLSAgICAweDA2NDAsIDB4MDY0QiwgMHgwNjQwLCAweDA2NEUsIDB4MDY0MCwgMHgwNjRGLCAweDA2NDAsIDB4MDY1MCwgMHgwNjQwLCAweDA2NTEsIDB4MDY0MCwgMHgwNjUyLCAweDA2NDQsIDB4MDYyMiwgMHgwNjQ0LCAweDA2MjIsCi0gICAgMHgwNjQ0LCAweDA2MjMsIDB4MDY0NCwgMHgwNjIzLCAweDA2NDQsIDB4MDYyNSwgMHgwNjQ0LCAweDA2MjUsIDB4MDY0NCwgMHgwNjI3LCAweDA2NDQsIDB4MDYyNwotfTsKKyAgICAweDAwNEYsIDB4MDA0NSwgMHgwMDU0LCAweDAwNEQsIDB4MDA2RiwgMHgwMDY1LCAweDAwNDksIDB4MDA0QSwgMHgwMDY5LAorICAgIDB4MDA2QSwgMHgwMDRGLCAweDAwNDUsIDB4MDA2RiwgMHgwMDY1LCAweDAwNDQsIDB4MDE3RCwgMHgwMDQ0LCAweDAxN0UsCisgICAgMHgwMDY0LCAweDAxN0UsIDB4MDA0QywgMHgwMDRBLCAweDAwNEMsIDB4MDA2QSwgMHgwMDZDLCAweDAwNkEsIDB4MDA0RSwKKyAgICAweDAwNEEsIDB4MDA0RSwgMHgwMDZBLCAweDAwNkUsIDB4MDA2QSwgMHgwMDQ0LCAweDAwNUEsIDB4MDA0NCwgMHgwMDdBLAorICAgIDB4MDA2NCwgMHgwMDdBLCAweDAwNjQsIDB4MDA2MiwgMHgwMDcxLCAweDAwNzAsIDB4MDA0RiwgMHgwMDQ1LCAweDAwNjQsCisgICAgMHgwMDdBLCAweDAwNjQsIDB4MDI5MiwgMHgwMDY0LCAweDAwN0EsIDB4MDA3NCwgMHgwMDczLCAweDAwNzQsIDB4MDI4MywKKyAgICAweDAwNzQsIDB4MDA2MywgMHgwMDY2LCAweDAxNEIsIDB4MDA2QywgMHgwMDczLCAweDAwNkMsIDB4MDA3QSwgMHgwNDFELAorICAgIDB4MDQxMywgMHgwNDNELCAweDA0MzMsIDB4MDQyMiwgMHgwNDI2LCAweDA0NDIsIDB4MDQ0NiwgMHgwNDEwLCAweDA0MTUsCisgICAgMHgwNDMwLCAweDA0MzUsIDB4MDU2NSwgMHgwNTgyLCAweDA2MjcsIDB4MDY3NCwgMHgwNjQ4LCAweDA2NzQsIDB4MDZDNywKKyAgICAweDA2NzQsIDB4MDY0QSwgMHgwNjc0LCAweDA2RDUsIDB4MDY1NCwgMHgwNkMxLCAweDA2NTQsIDB4MDZEMiwgMHgwNjU0LAorICAgIDB4MDkyOCwgMHgwOTNDLCAweDA5MzAsIDB4MDkzQywgMHgwOTMzLCAweDA5M0MsIDB4MDkxNSwgMHgwOTNDLCAweDA5MTYsCisgICAgMHgwOTNDLCAweDA5MTcsIDB4MDkzQywgMHgwOTFDLCAweDA5M0MsIDB4MDkyMSwgMHgwOTNDLCAweDA5MjIsIDB4MDkzQywKKyAgICAweDA5MkIsIDB4MDkzQywgMHgwOTJGLCAweDA5M0MsIDB4MDlDNywgMHgwOUJFLCAweDA5QzcsIDB4MDlENywgMHgwOUExLAorICAgIDB4MDlCQywgMHgwOUEyLCAweDA5QkMsIDB4MDlBRiwgMHgwOUJDLCAweDBBMzIsIDB4MEEzQywgMHgwQTM4LCAweDBBM0MsCisgICAgMHgwQTE2LCAweDBBM0MsIDB4MEExNywgMHgwQTNDLCAweDBBMUMsIDB4MEEzQywgMHgwQTJCLCAweDBBM0MsIDB4MEI0NywKKyAgICAweDBCNTYsIDB4MEI0NywgMHgwQjNFLCAweDBCNDcsIDB4MEI1NywgMHgwQjIxLCAweDBCM0MsIDB4MEIyMiwgMHgwQjNDLAorICAgIDB4MEI5MiwgMHgwQkQ3LCAweDBCQzYsIDB4MEJCRSwgMHgwQkM3LCAweDBCQkUsIDB4MEJDNiwgMHgwQkQ3LCAweDBDNDYsCisgICAgMHgwQzU2LCAweDBDQkYsIDB4MENENSwgMHgwQ0M2LCAweDBDRDUsIDB4MENDNiwgMHgwQ0Q2LCAweDBDQzYsIDB4MENDMiwKKyAgICAweDBDQ0EsIDB4MENENSwgMHgwRDQ2LCAweDBEM0UsIDB4MEQ0NywgMHgwRDNFLCAweDBENDYsIDB4MEQ1NywgMHgwREQ5LAorICAgIDB4MERDQSwgMHgwREQ5LCAweDBEQ0YsIDB4MEREQywgMHgwRENBLCAweDBERDksIDB4MERERiwgMHgwRTRELCAweDBFMzIsCisgICAgMHgwRUNELCAweDBFQjIsIDB4MEVBQiwgMHgwRTk5LCAweDBFQUIsIDB4MEVBMSwgMHgwRjQyLCAweDBGQjcsIDB4MEY0QywKKyAgICAweDBGQjcsIDB4MEY1MSwgMHgwRkI3LCAweDBGNTYsIDB4MEZCNywgMHgwRjVCLCAweDBGQjcsIDB4MEY0MCwgMHgwRkI1LAorICAgIDB4MEY3MSwgMHgwRjcyLCAweDBGNzEsIDB4MEY3NCwgMHgwRkIyLCAweDBGODAsIDB4MEZCMiwgMHgwRjgxLCAweDBGQjMsCisgICAgMHgwRjgwLCAweDBGQjMsIDB4MEY4MSwgMHgwRjcxLCAweDBGODAsIDB4MEY5MiwgMHgwRkI3LCAweDBGOUMsIDB4MEZCNywKKyAgICAweDBGQTEsIDB4MEZCNywgMHgwRkE2LCAweDBGQjcsIDB4MEZBQiwgMHgwRkI3LCAweDBGOTAsIDB4MEZCNSwgMHgxMDI1LAorICAgIDB4MTAyRSwgMHgxQjA1LCAweDFCMzUsIDB4MUIwNywgMHgxQjM1LCAweDFCMDksIDB4MUIzNSwgMHgxQjBCLCAweDFCMzUsCisgICAgMHgxQjBELCAweDFCMzUsIDB4MUIxMSwgMHgxQjM1LCAweDFCM0EsIDB4MUIzNSwgMHgxQjNDLCAweDFCMzUsIDB4MUIzRSwKKyAgICAweDFCMzUsIDB4MUIzRiwgMHgxQjM1LCAweDFCNDIsIDB4MUIzNSwgMHgwMDc0LCAweDAwNjgsIDB4MDAyRSwgMHgwMDJFLAorICAgIDB4MjAzMiwgMHgyMDMyLCAweDIwMzUsIDB4MjAzNSwgMHgwMDIxLCAweDAwMjEsIDB4MDAyMCwgMHgwMzA1LCAweDAwM0YsCisgICAgMHgwMDNGLCAweDAwM0YsIDB4MDAyMSwgMHgwMDIxLCAweDAwM0YsIDB4MDA1MiwgMHgwMDczLCAweDAwQjAsIDB4MDA0MywKKyAgICAweDAwQjAsIDB4MDA0NiwgMHgwMDRFLCAweDAwNkYsIDB4MDA1MywgMHgwMDRELCAweDAwNTQsIDB4MDA0RCwgMHgwMDMxLAorICAgIDB4MDAyRiwgMHgwMDQ5LCAweDAwNDksIDB4MDA0OSwgMHgwMDU2LCAweDAwNTYsIDB4MDA0OSwgMHgwMDQ5LCAweDAwNTgsCisgICAgMHgwMDU4LCAweDAwNDksIDB4MDA2OSwgMHgwMDY5LCAweDAwNjksIDB4MDA3NiwgMHgwMDc2LCAweDAwNjksIDB4MDA2OSwKKyAgICAweDAwNzgsIDB4MDA3OCwgMHgwMDY5LCAweDIxOTAsIDB4MDMzOCwgMHgyMTkyLCAweDAzMzgsIDB4MjE5NCwgMHgwMzM4LAorICAgIDB4MjFEMCwgMHgwMzM4LCAweDIxRDQsIDB4MDMzOCwgMHgyMUQyLCAweDAzMzgsIDB4MjIyMywgMHgwMzM4LCAweDIyMjUsCisgICAgMHgwMzM4LCAweDIyMkIsIDB4MjIyQiwgMHgyMjJFLCAweDIyMkUsIDB4MjIzQywgMHgwMzM4LCAweDIyNDMsIDB4MDMzOCwKKyAgICAweDIyNDUsIDB4MDMzOCwgMHgyMjQ4LCAweDAzMzgsIDB4MDAzRCwgMHgwMDJGLCAweDIyNjEsIDB4MDAyRiwgMHgyMjRELAorICAgIDB4MDAyRiwgMHgwMDNDLCAweDAwMkYsIDB4MDAzRSwgMHgwMDJGLCAweDIyNjQsIDB4MDAyRiwgMHgyMjY1LCAweDAwMkYsCisgICAgMHgyMjcyLCAweDAwMkYsIDB4MjI3MywgMHgwMDJGLCAweDIyNzYsIDB4MDAyRiwgMHgyMjc3LCAweDAwMkYsIDB4MjI3QSwKKyAgICAweDAwMkYsIDB4MjI3QiwgMHgwMDJGLCAweDIyODIsIDB4MDAyRiwgMHgyMjgzLCAweDAwMkYsIDB4MjI4NiwgMHgwMDJGLAorICAgIDB4MjI4NywgMHgwMDJGLCAweDIyQTIsIDB4MDAyRiwgMHgyMkE4LCAweDAwMkYsIDB4MjJBOSwgMHgwMDJGLCAweDIyQUIsCisgICAgMHgwMDJGLCAweDIyN0MsIDB4MDAyRiwgMHgyMjdELCAweDAwMkYsIDB4MjI5MSwgMHgwMDJGLCAweDIyOTIsIDB4MDAyRiwKKyAgICAweDIyQjIsIDB4MDAyRiwgMHgyMkIzLCAweDAwMkYsIDB4MjJCNCwgMHgwMDJGLCAweDIyQjUsIDB4MDAyRiwgMHgwMDQyLAorICAgIDB4MDA1MywgMHgwMDQ4LCAweDAwNTQsIDB4MDA0QywgMHgwMDQ2LCAweDAwNTYsIDB4MDA1NCwgMHgwMDQ2LCAweDAwNDYsCisgICAgMHgwMDQzLCAweDAwNTIsIDB4MDA1MywgMHgwMDUzLCAweDAwNTMsIDB4MDA0OSwgMHgwMDQ1LCAweDAwNEQsIDB4MDA0NiwKKyAgICAweDAwNTMsIDB4MDA0NywgMHgwMDUzLCAweDAwNTIsIDB4MDA1MywgMHgwMDU1LCAweDAwNTMsIDB4MDA1MywgMHgwMDUwLAorICAgIDB4MDAzMSwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMSwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzEsCisgICAgMHgwMDM0LCAweDAwMzEsIDB4MDAzNSwgMHgwMDMxLCAweDAwMzYsIDB4MDAzMSwgMHgwMDM3LCAweDAwMzEsIDB4MDAzOCwKKyAgICAweDAwMzEsIDB4MDAzOSwgMHgwMDMyLCAweDAwMzAsIDB4MDAzMSwgMHgwMDJFLCAweDAwMzIsIDB4MDAyRSwgMHgwMDMzLAorICAgIDB4MDAyRSwgMHgwMDM0LCAweDAwMkUsIDB4MDAzNSwgMHgwMDJFLCAweDAwMzYsIDB4MDAyRSwgMHgwMDM3LCAweDAwMkUsCisgICAgMHgwMDM4LCAweDAwMkUsIDB4MDAzOSwgMHgwMDJFLCAweDAwMzEsIDB4MDAzMSwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMSwKKyAgICAweDAwMzMsIDB4MDAzMSwgMHgwMDM0LCAweDAwMzEsIDB4MDAzNSwgMHgwMDMxLCAweDAwMzYsIDB4MDAzMSwgMHgwMDM3LAorICAgIDB4MDAzMSwgMHgwMDM4LCAweDAwMzEsIDB4MDAzOSwgMHgwMDMyLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMwLCAweDAwMzEsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzAsIDB4MDAzRCwgMHgwMDNELCAweDJBREQsIDB4MDAyRiwKKyAgICAweDMwNEIsIDB4MzA5OSwgMHgzMDRELCAweDMwOTksIDB4MzA0RiwgMHgzMDk5LCAweDMwNTEsIDB4MzA5OSwgMHgzMDUzLAorICAgIDB4MzA5OSwgMHgzMDU1LCAweDMwOTksIDB4MzA1NywgMHgzMDk5LCAweDMwNTksIDB4MzA5OSwgMHgzMDVCLCAweDMwOTksCisgICAgMHgzMDVELCAweDMwOTksIDB4MzA1RiwgMHgzMDk5LCAweDMwNjEsIDB4MzA5OSwgMHgzMDY0LCAweDMwOTksIDB4MzA2NiwKKyAgICAweDMwOTksIDB4MzA2OCwgMHgzMDk5LCAweDMwNkYsIDB4MzA5OSwgMHgzMDZGLCAweDMwOUEsIDB4MzA3MiwgMHgzMDk5LAorICAgIDB4MzA3MiwgMHgzMDlBLCAweDMwNzUsIDB4MzA5OSwgMHgzMDc1LCAweDMwOUEsIDB4MzA3OCwgMHgzMDk5LCAweDMwNzgsCisgICAgMHgzMDlBLCAweDMwN0IsIDB4MzA5OSwgMHgzMDdCLCAweDMwOUEsIDB4MzA0NiwgMHgzMDk5LCAweDAwMjAsIDB4MzA5OSwKKyAgICAweDAwMjAsIDB4MzA5QSwgMHgzMDlELCAweDMwOTksIDB4MzA4OCwgMHgzMDhBLCAweDMwQUIsIDB4MzA5OSwgMHgzMEFELAorICAgIDB4MzA5OSwgMHgzMEFGLCAweDMwOTksIDB4MzBCMSwgMHgzMDk5LCAweDMwQjMsIDB4MzA5OSwgMHgzMEI1LCAweDMwOTksCisgICAgMHgzMEI3LCAweDMwOTksIDB4MzBCOSwgMHgzMDk5LCAweDMwQkIsIDB4MzA5OSwgMHgzMEJELCAweDMwOTksIDB4MzBCRiwKKyAgICAweDMwOTksIDB4MzBDMSwgMHgzMDk5LCAweDMwQzQsIDB4MzA5OSwgMHgzMEM2LCAweDMwOTksIDB4MzBDOCwgMHgzMDk5LAorICAgIDB4MzBDRiwgMHgzMDk5LCAweDMwQ0YsIDB4MzA5QSwgMHgzMEQyLCAweDMwOTksIDB4MzBEMiwgMHgzMDlBLCAweDMwRDUsCisgICAgMHgzMDk5LCAweDMwRDUsIDB4MzA5QSwgMHgzMEQ4LCAweDMwOTksIDB4MzBEOCwgMHgzMDlBLCAweDMwREIsIDB4MzA5OSwKKyAgICAweDMwREIsIDB4MzA5QSwgMHgzMEE2LCAweDMwOTksIDB4MzBFRiwgMHgzMDk5LCAweDMwRjAsIDB4MzA5OSwgMHgzMEYxLAorICAgIDB4MzA5OSwgMHgzMEYyLCAweDMwOTksIDB4MzBGRCwgMHgzMDk5LCAweDMwQjMsIDB4MzBDOCwgMHgwMDMyLCAweDAwMzEsCisgICAgMHgwMDMyLCAweDAwMzIsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzIsIDB4MDAzNCwgMHgwMDMyLCAweDAwMzUsIDB4MDAzMiwKKyAgICAweDAwMzYsIDB4MDAzMiwgMHgwMDM3LCAweDAwMzIsIDB4MDAzOCwgMHgwMDMyLCAweDAwMzksIDB4MDAzMywgMHgwMDMwLAorICAgIDB4MDAzMywgMHgwMDMxLCAweDAwMzMsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzMsIDB4MDAzMywgMHgwMDM0LCAweDAwMzMsCisgICAgMHgwMDM1LCAweDExMDAsIDB4MTE2MSwgMHgxMTAyLCAweDExNjEsIDB4MTEwMywgMHgxMTYxLCAweDExMDUsIDB4MTE2MSwKKyAgICAweDExMDYsIDB4MTE2MSwgMHgxMTA3LCAweDExNjEsIDB4MTEwOSwgMHgxMTYxLCAweDExMEIsIDB4MTE2MSwgMHgxMTBDLAorICAgIDB4MTE2MSwgMHgxMTBFLCAweDExNjEsIDB4MTEwRiwgMHgxMTYxLCAweDExMTAsIDB4MTE2MSwgMHgxMTExLCAweDExNjEsCisgICAgMHgxMTEyLCAweDExNjEsIDB4MTEwQiwgMHgxMTZFLCAweDAwMzMsIDB4MDAzNiwgMHgwMDMzLCAweDAwMzcsIDB4MDAzMywKKyAgICAweDAwMzgsIDB4MDAzMywgMHgwMDM5LCAweDAwMzQsIDB4MDAzMCwgMHgwMDM0LCAweDAwMzEsIDB4MDAzNCwgMHgwMDMyLAorICAgIDB4MDAzNCwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNCwgMHgwMDM0LCAweDAwMzUsIDB4MDAzNCwgMHgwMDM2LCAweDAwMzQsCisgICAgMHgwMDM3LCAweDAwMzQsIDB4MDAzOCwgMHgwMDM0LCAweDAwMzksIDB4MDAzNSwgMHgwMDMwLCAweDAwMzEsIDB4NjcwOCwKKyAgICAweDAwMzIsIDB4NjcwOCwgMHgwMDMzLCAweDY3MDgsIDB4MDAzNCwgMHg2NzA4LCAweDAwMzUsIDB4NjcwOCwgMHgwMDM2LAorICAgIDB4NjcwOCwgMHgwMDM3LCAweDY3MDgsIDB4MDAzOCwgMHg2NzA4LCAweDAwMzksIDB4NjcwOCwgMHgwMDQ4LCAweDAwNjcsCisgICAgMHgwMDY1LCAweDAwNTYsIDB4MzBBRSwgMHgzMEFDLCAweDMwQUQsIDB4MzBFRCwgMHgzMEM3LCAweDMwQjcsIDB4MzBDOSwKKyAgICAweDMwRUIsIDB4MzBDOCwgMHgzMEYzLCAweDMwQ0EsIDB4MzBDRSwgMHgzMEQ0LCAweDMwQjMsIDB4MzBEMywgMHgzMEVCLAorICAgIDB4MzBEQSwgMHgzMEJELCAweDMwREIsIDB4MzBGMywgMHgzMERGLCAweDMwRUEsIDB4MzBFMSwgMHgzMEFDLCAweDMwRUEsCisgICAgMHgzMEU5LCAweDMwRUMsIDB4MzBFMCwgMHgwMDMwLCAweDcwQjksIDB4MDAzMSwgMHg3MEI5LCAweDAwMzIsIDB4NzBCOSwKKyAgICAweDAwMzMsIDB4NzBCOSwgMHgwMDM0LCAweDcwQjksIDB4MDAzNSwgMHg3MEI5LCAweDAwMzYsIDB4NzBCOSwgMHgwMDM3LAorICAgIDB4NzBCOSwgMHgwMDM4LCAweDcwQjksIDB4MDAzOSwgMHg3MEI5LCAweDAwNjQsIDB4MDA2MSwgMHgwMDQxLCAweDAwNTUsCisgICAgMHgwMDZGLCAweDAwNTYsIDB4MDA3MCwgMHgwMDYzLCAweDAwNjQsIDB4MDA2RCwgMHgwMDQ5LCAweDAwNTUsIDB4NUU3MywKKyAgICAweDYyMTAsIDB4NjYyRCwgMHg1NDhDLCAweDU5MjcsIDB4NkI2MywgMHg2NjBFLCAweDZDQkIsIDB4MDA3MCwgMHgwMDQxLAorICAgIDB4MDA2RSwgMHgwMDQxLCAweDAzQkMsIDB4MDA0MSwgMHgwMDZELCAweDAwNDEsIDB4MDA2QiwgMHgwMDQxLCAweDAwNEIsCisgICAgMHgwMDQyLCAweDAwNEQsIDB4MDA0MiwgMHgwMDQ3LCAweDAwNDIsIDB4MDA3MCwgMHgwMDQ2LCAweDAwNkUsIDB4MDA0NiwKKyAgICAweDAzQkMsIDB4MDA0NiwgMHgwM0JDLCAweDAwNjcsIDB4MDA2RCwgMHgwMDY3LCAweDAwNkIsIDB4MDA2NywgMHgwMDQ4LAorICAgIDB4MDA3QSwgMHgwM0JDLCAweDIxMTMsIDB4MDA2RCwgMHgyMTEzLCAweDAwNjQsIDB4MjExMywgMHgwMDZCLCAweDIxMTMsCisgICAgMHgwMDY2LCAweDAwNkQsIDB4MDA2RSwgMHgwMDZELCAweDAzQkMsIDB4MDA2RCwgMHgwMDZELCAweDAwNkQsIDB4MDA2MywKKyAgICAweDAwNkQsIDB4MDA2QiwgMHgwMDZELCAweDAwNkQsIDB4MDBCMiwgMHgwMDZELCAweDAwQjMsIDB4MDA1MCwgMHgwMDYxLAorICAgIDB4MDA3MCwgMHgwMDczLCAweDAwNkUsIDB4MDA3MywgMHgwM0JDLCAweDAwNzMsIDB4MDA2RCwgMHgwMDczLCAweDAwNzAsCisgICAgMHgwMDU2LCAweDAwNkUsIDB4MDA1NiwgMHgwM0JDLCAweDAwNTYsIDB4MDA2RCwgMHgwMDU2LCAweDAwNkIsIDB4MDA1NiwKKyAgICAweDAwNEQsIDB4MDA1NiwgMHgwMDcwLCAweDAwNTcsIDB4MDA2RSwgMHgwMDU3LCAweDAzQkMsIDB4MDA1NywgMHgwMDZELAorICAgIDB4MDA1NywgMHgwMDZCLCAweDAwNTcsIDB4MDA0RCwgMHgwMDU3LCAweDAwNkIsIDB4MDNBOSwgMHgwMDRELCAweDAzQTksCisgICAgMHgwMDQyLCAweDAwNzEsIDB4MDA2MywgMHgwMDYzLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY0LCAweDAwNDIsIDB4MDA0NywKKyAgICAweDAwNzksIDB4MDA2OCwgMHgwMDYxLCAweDAwNDgsIDB4MDA1MCwgMHgwMDY5LCAweDAwNkUsIDB4MDA0QiwgMHgwMDRCLAorICAgIDB4MDA0QiwgMHgwMDRELCAweDAwNkIsIDB4MDA3NCwgMHgwMDZDLCAweDAwNkQsIDB4MDA2QywgMHgwMDZFLCAweDAwNkMsCisgICAgMHgwMDc4LCAweDAwNkQsIDB4MDA2MiwgMHgwMDUwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDUyLCAweDAwNzMsIDB4MDA3MiwKKyAgICAweDAwNTMsIDB4MDA3NiwgMHgwMDU3LCAweDAwNjIsIDB4MDAzMSwgMHg2NUU1LCAweDAwMzIsIDB4NjVFNSwgMHgwMDMzLAorICAgIDB4NjVFNSwgMHgwMDM0LCAweDY1RTUsIDB4MDAzNSwgMHg2NUU1LCAweDAwMzYsIDB4NjVFNSwgMHgwMDM3LCAweDY1RTUsCisgICAgMHgwMDM4LCAweDY1RTUsIDB4MDAzOSwgMHg2NUU1LCAweDAwNjYsIDB4MDA2NiwgMHgwMDY2LCAweDAwNjksIDB4MDA2NiwKKyAgICAweDAwNkMsIDB4MDE3RiwgMHgwMDc0LCAweDAwNzMsIDB4MDA3NCwgMHgwNTc0LCAweDA1NzYsIDB4MDU3NCwgMHgwNTY1LAorICAgIDB4MDU3NCwgMHgwNTZCLCAweDA1N0UsIDB4MDU3NiwgMHgwNTc0LCAweDA1NkQsIDB4MDVEOSwgMHgwNUI0LCAweDA1RjIsCisgICAgMHgwNUI3LCAweDA1RTksIDB4MDVDMSwgMHgwNUU5LCAweDA1QzIsIDB4RkI0OSwgMHgwNUMxLCAweEZCNDksIDB4MDVDMiwKKyAgICAweDA1RDAsIDB4MDVCNywgMHgwNUQwLCAweDA1QjgsIDB4MDVEMCwgMHgwNUJDLCAweDA1RDEsIDB4MDVCQywgMHgwNUQyLAorICAgIDB4MDVCQywgMHgwNUQzLCAweDA1QkMsIDB4MDVENCwgMHgwNUJDLCAweDA1RDUsIDB4MDVCQywgMHgwNUQ2LCAweDA1QkMsCisgICAgMHgwNUQ4LCAweDA1QkMsIDB4MDVEOSwgMHgwNUJDLCAweDA1REEsIDB4MDVCQywgMHgwNURCLCAweDA1QkMsIDB4MDVEQywKKyAgICAweDA1QkMsIDB4MDVERSwgMHgwNUJDLCAweDA1RTAsIDB4MDVCQywgMHgwNUUxLCAweDA1QkMsIDB4MDVFMywgMHgwNUJDLAorICAgIDB4MDVFNCwgMHgwNUJDLCAweDA1RTYsIDB4MDVCQywgMHgwNUU3LCAweDA1QkMsIDB4MDVFOCwgMHgwNUJDLCAweDA1RTksCisgICAgMHgwNUJDLCAweDA1RUEsIDB4MDVCQywgMHgwNUQ1LCAweDA1QjksIDB4MDVEMSwgMHgwNUJGLCAweDA1REIsIDB4MDVCRiwKKyAgICAweDA1RTQsIDB4MDVCRiwgMHgwNUQwLCAweDA1REMsIDB4MDYyNiwgMHgwNjI3LCAweDA2MjYsIDB4MDYyNywgMHgwNjI2LAorICAgIDB4MDZENSwgMHgwNjI2LCAweDA2RDUsIDB4MDYyNiwgMHgwNjQ4LCAweDA2MjYsIDB4MDY0OCwgMHgwNjI2LCAweDA2QzcsCisgICAgMHgwNjI2LCAweDA2QzcsIDB4MDYyNiwgMHgwNkM2LCAweDA2MjYsIDB4MDZDNiwgMHgwNjI2LCAweDA2QzgsIDB4MDYyNiwKKyAgICAweDA2QzgsIDB4MDYyNiwgMHgwNkQwLCAweDA2MjYsIDB4MDZEMCwgMHgwNjI2LCAweDA2RDAsIDB4MDYyNiwgMHgwNjQ5LAorICAgIDB4MDYyNiwgMHgwNjQ5LCAweDA2MjYsIDB4MDY0OSwgMHgwNjI2LCAweDA2MkMsIDB4MDYyNiwgMHgwNjJELCAweDA2MjYsCisgICAgMHgwNjQ1LCAweDA2MjYsIDB4MDY0OSwgMHgwNjI2LCAweDA2NEEsIDB4MDYyOCwgMHgwNjJDLCAweDA2MjgsIDB4MDYyRCwKKyAgICAweDA2MjgsIDB4MDYyRSwgMHgwNjI4LCAweDA2NDUsIDB4MDYyOCwgMHgwNjQ5LCAweDA2MjgsIDB4MDY0QSwgMHgwNjJBLAorICAgIDB4MDYyQywgMHgwNjJBLCAweDA2MkQsIDB4MDYyQSwgMHgwNjJFLCAweDA2MkEsIDB4MDY0NSwgMHgwNjJBLCAweDA2NDksCisgICAgMHgwNjJBLCAweDA2NEEsIDB4MDYyQiwgMHgwNjJDLCAweDA2MkIsIDB4MDY0NSwgMHgwNjJCLCAweDA2NDksIDB4MDYyQiwKKyAgICAweDA2NEEsIDB4MDYyQywgMHgwNjJELCAweDA2MkMsIDB4MDY0NSwgMHgwNjJELCAweDA2MkMsIDB4MDYyRCwgMHgwNjQ1LAorICAgIDB4MDYyRSwgMHgwNjJDLCAweDA2MkUsIDB4MDYyRCwgMHgwNjJFLCAweDA2NDUsIDB4MDYzMywgMHgwNjJDLCAweDA2MzMsCisgICAgMHgwNjJELCAweDA2MzMsIDB4MDYyRSwgMHgwNjMzLCAweDA2NDUsIDB4MDYzNSwgMHgwNjJELCAweDA2MzUsIDB4MDY0NSwKKyAgICAweDA2MzYsIDB4MDYyQywgMHgwNjM2LCAweDA2MkQsIDB4MDYzNiwgMHgwNjJFLCAweDA2MzYsIDB4MDY0NSwgMHgwNjM3LAorICAgIDB4MDYyRCwgMHgwNjM3LCAweDA2NDUsIDB4MDYzOCwgMHgwNjQ1LCAweDA2MzksIDB4MDYyQywgMHgwNjM5LCAweDA2NDUsCisgICAgMHgwNjNBLCAweDA2MkMsIDB4MDYzQSwgMHgwNjQ1LCAweDA2NDEsIDB4MDYyQywgMHgwNjQxLCAweDA2MkQsIDB4MDY0MSwKKyAgICAweDA2MkUsIDB4MDY0MSwgMHgwNjQ1LCAweDA2NDEsIDB4MDY0OSwgMHgwNjQxLCAweDA2NEEsIDB4MDY0MiwgMHgwNjJELAorICAgIDB4MDY0MiwgMHgwNjQ1LCAweDA2NDIsIDB4MDY0OSwgMHgwNjQyLCAweDA2NEEsIDB4MDY0MywgMHgwNjI3LCAweDA2NDMsCisgICAgMHgwNjJDLCAweDA2NDMsIDB4MDYyRCwgMHgwNjQzLCAweDA2MkUsIDB4MDY0MywgMHgwNjQ0LCAweDA2NDMsIDB4MDY0NSwKKyAgICAweDA2NDMsIDB4MDY0OSwgMHgwNjQzLCAweDA2NEEsIDB4MDY0NCwgMHgwNjJDLCAweDA2NDQsIDB4MDYyRCwgMHgwNjQ0LAorICAgIDB4MDYyRSwgMHgwNjQ0LCAweDA2NDUsIDB4MDY0NCwgMHgwNjQ5LCAweDA2NDQsIDB4MDY0QSwgMHgwNjQ1LCAweDA2MkMsCisgICAgMHgwNjQ1LCAweDA2MkQsIDB4MDY0NSwgMHgwNjJFLCAweDA2NDUsIDB4MDY0NSwgMHgwNjQ1LCAweDA2NDksIDB4MDY0NSwKKyAgICAweDA2NEEsIDB4MDY0NiwgMHgwNjJDLCAweDA2NDYsIDB4MDYyRCwgMHgwNjQ2LCAweDA2MkUsIDB4MDY0NiwgMHgwNjQ1LAorICAgIDB4MDY0NiwgMHgwNjQ5LCAweDA2NDYsIDB4MDY0QSwgMHgwNjQ3LCAweDA2MkMsIDB4MDY0NywgMHgwNjQ1LCAweDA2NDcsCisgICAgMHgwNjQ5LCAweDA2NDcsIDB4MDY0QSwgMHgwNjRBLCAweDA2MkMsIDB4MDY0QSwgMHgwNjJELCAweDA2NEEsIDB4MDYyRSwKKyAgICAweDA2NEEsIDB4MDY0NSwgMHgwNjRBLCAweDA2NDksIDB4MDY0QSwgMHgwNjRBLCAweDA2MzAsIDB4MDY3MCwgMHgwNjMxLAorICAgIDB4MDY3MCwgMHgwNjQ5LCAweDA2NzAsIDB4MDY0QywgMHgwNjUxLCAweDA2NEQsIDB4MDY1MSwgMHgwNjRFLCAweDA2NTEsCisgICAgMHgwNjRGLCAweDA2NTEsIDB4MDY1MCwgMHgwNjUxLCAweDA2NTEsIDB4MDY3MCwgMHgwNjI2LCAweDA2MzEsIDB4MDYyNiwKKyAgICAweDA2MzIsIDB4MDYyNiwgMHgwNjQ1LCAweDA2MjYsIDB4MDY0NiwgMHgwNjI2LCAweDA2NDksIDB4MDYyNiwgMHgwNjRBLAorICAgIDB4MDYyOCwgMHgwNjMxLCAweDA2MjgsIDB4MDYzMiwgMHgwNjI4LCAweDA2NDUsIDB4MDYyOCwgMHgwNjQ2LCAweDA2MjgsCisgICAgMHgwNjQ5LCAweDA2MjgsIDB4MDY0QSwgMHgwNjJBLCAweDA2MzEsIDB4MDYyQSwgMHgwNjMyLCAweDA2MkEsIDB4MDY0NSwKKyAgICAweDA2MkEsIDB4MDY0NiwgMHgwNjJBLCAweDA2NDksIDB4MDYyQSwgMHgwNjRBLCAweDA2MkIsIDB4MDYzMSwgMHgwNjJCLAorICAgIDB4MDYzMiwgMHgwNjJCLCAweDA2NDUsIDB4MDYyQiwgMHgwNjQ2LCAweDA2MkIsIDB4MDY0OSwgMHgwNjJCLCAweDA2NEEsCisgICAgMHgwNjQxLCAweDA2NDksIDB4MDY0MSwgMHgwNjRBLCAweDA2NDIsIDB4MDY0OSwgMHgwNjQyLCAweDA2NEEsIDB4MDY0MywKKyAgICAweDA2MjcsIDB4MDY0MywgMHgwNjQ0LCAweDA2NDMsIDB4MDY0NSwgMHgwNjQzLCAweDA2NDksIDB4MDY0MywgMHgwNjRBLAorICAgIDB4MDY0NCwgMHgwNjQ1LCAweDA2NDQsIDB4MDY0OSwgMHgwNjQ0LCAweDA2NEEsIDB4MDY0NSwgMHgwNjI3LCAweDA2NDUsCisgICAgMHgwNjQ1LCAweDA2NDYsIDB4MDYzMSwgMHgwNjQ2LCAweDA2MzIsIDB4MDY0NiwgMHgwNjQ1LCAweDA2NDYsIDB4MDY0NiwKKyAgICAweDA2NDYsIDB4MDY0OSwgMHgwNjQ2LCAweDA2NEEsIDB4MDY0OSwgMHgwNjcwLCAweDA2NEEsIDB4MDYzMSwgMHgwNjRBLAorICAgIDB4MDYzMiwgMHgwNjRBLCAweDA2NDUsIDB4MDY0QSwgMHgwNjQ2LCAweDA2NEEsIDB4MDY0OSwgMHgwNjRBLCAweDA2NEEsCisgICAgMHgwNjI2LCAweDA2MkMsIDB4MDYyNiwgMHgwNjJELCAweDA2MjYsIDB4MDYyRSwgMHgwNjI2LCAweDA2NDUsIDB4MDYyNiwKKyAgICAweDA2NDcsIDB4MDYyOCwgMHgwNjJDLCAweDA2MjgsIDB4MDYyRCwgMHgwNjI4LCAweDA2MkUsIDB4MDYyOCwgMHgwNjQ1LAorICAgIDB4MDYyOCwgMHgwNjQ3LCAweDA2MkEsIDB4MDYyQywgMHgwNjJBLCAweDA2MkQsIDB4MDYyQSwgMHgwNjJFLCAweDA2MkEsCisgICAgMHgwNjQ1LCAweDA2MkEsIDB4MDY0NywgMHgwNjJCLCAweDA2NDUsIDB4MDYyQywgMHgwNjJELCAweDA2MkMsIDB4MDY0NSwKKyAgICAweDA2MkQsIDB4MDYyQywgMHgwNjJELCAweDA2NDUsIDB4MDYyRSwgMHgwNjJDLCAweDA2MkUsIDB4MDY0NSwgMHgwNjMzLAorICAgIDB4MDYyQywgMHgwNjMzLCAweDA2MkQsIDB4MDYzMywgMHgwNjJFLCAweDA2MzMsIDB4MDY0NSwgMHgwNjM1LCAweDA2MkQsCisgICAgMHgwNjM1LCAweDA2MkUsIDB4MDYzNSwgMHgwNjQ1LCAweDA2MzYsIDB4MDYyQywgMHgwNjM2LCAweDA2MkQsIDB4MDYzNiwKKyAgICAweDA2MkUsIDB4MDYzNiwgMHgwNjQ1LCAweDA2MzcsIDB4MDYyRCwgMHgwNjM4LCAweDA2NDUsIDB4MDYzOSwgMHgwNjJDLAorICAgIDB4MDYzOSwgMHgwNjQ1LCAweDA2M0EsIDB4MDYyQywgMHgwNjNBLCAweDA2NDUsIDB4MDY0MSwgMHgwNjJDLCAweDA2NDEsCisgICAgMHgwNjJELCAweDA2NDEsIDB4MDYyRSwgMHgwNjQxLCAweDA2NDUsIDB4MDY0MiwgMHgwNjJELCAweDA2NDIsIDB4MDY0NSwKKyAgICAweDA2NDMsIDB4MDYyQywgMHgwNjQzLCAweDA2MkQsIDB4MDY0MywgMHgwNjJFLCAweDA2NDMsIDB4MDY0NCwgMHgwNjQzLAorICAgIDB4MDY0NSwgMHgwNjQ0LCAweDA2MkMsIDB4MDY0NCwgMHgwNjJELCAweDA2NDQsIDB4MDYyRSwgMHgwNjQ0LCAweDA2NDUsCisgICAgMHgwNjQ0LCAweDA2NDcsIDB4MDY0NSwgMHgwNjJDLCAweDA2NDUsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MkUsIDB4MDY0NSwKKyAgICAweDA2NDUsIDB4MDY0NiwgMHgwNjJDLCAweDA2NDYsIDB4MDYyRCwgMHgwNjQ2LCAweDA2MkUsIDB4MDY0NiwgMHgwNjQ1LAorICAgIDB4MDY0NiwgMHgwNjQ3LCAweDA2NDcsIDB4MDYyQywgMHgwNjQ3LCAweDA2NDUsIDB4MDY0NywgMHgwNjcwLCAweDA2NEEsCisgICAgMHgwNjJDLCAweDA2NEEsIDB4MDYyRCwgMHgwNjRBLCAweDA2MkUsIDB4MDY0QSwgMHgwNjQ1LCAweDA2NEEsIDB4MDY0NywKKyAgICAweDA2MjYsIDB4MDY0NSwgMHgwNjI2LCAweDA2NDcsIDB4MDYyOCwgMHgwNjQ1LCAweDA2MjgsIDB4MDY0NywgMHgwNjJBLAorICAgIDB4MDY0NSwgMHgwNjJBLCAweDA2NDcsIDB4MDYyQiwgMHgwNjQ1LCAweDA2MkIsIDB4MDY0NywgMHgwNjMzLCAweDA2NDUsCisgICAgMHgwNjMzLCAweDA2NDcsIDB4MDYzNCwgMHgwNjQ1LCAweDA2MzQsIDB4MDY0NywgMHgwNjQzLCAweDA2NDQsIDB4MDY0MywKKyAgICAweDA2NDUsIDB4MDY0NCwgMHgwNjQ1LCAweDA2NDYsIDB4MDY0NSwgMHgwNjQ2LCAweDA2NDcsIDB4MDY0QSwgMHgwNjQ1LAorICAgIDB4MDY0QSwgMHgwNjQ3LCAweDA2MzcsIDB4MDY0OSwgMHgwNjM3LCAweDA2NEEsIDB4MDYzOSwgMHgwNjQ5LCAweDA2MzksCisgICAgMHgwNjRBLCAweDA2M0EsIDB4MDY0OSwgMHgwNjNBLCAweDA2NEEsIDB4MDYzMywgMHgwNjQ5LCAweDA2MzMsIDB4MDY0QSwKKyAgICAweDA2MzQsIDB4MDY0OSwgMHgwNjM0LCAweDA2NEEsIDB4MDYyRCwgMHgwNjQ5LCAweDA2MkQsIDB4MDY0QSwgMHgwNjJDLAorICAgIDB4MDY0OSwgMHgwNjJDLCAweDA2NEEsIDB4MDYyRSwgMHgwNjQ5LCAweDA2MkUsIDB4MDY0QSwgMHgwNjM1LCAweDA2NDksCisgICAgMHgwNjM1LCAweDA2NEEsIDB4MDYzNiwgMHgwNjQ5LCAweDA2MzYsIDB4MDY0QSwgMHgwNjM0LCAweDA2MkMsIDB4MDYzNCwKKyAgICAweDA2MkQsIDB4MDYzNCwgMHgwNjJFLCAweDA2MzQsIDB4MDY0NSwgMHgwNjM0LCAweDA2MzEsIDB4MDYzMywgMHgwNjMxLAorICAgIDB4MDYzNSwgMHgwNjMxLCAweDA2MzYsIDB4MDYzMSwgMHgwNjM3LCAweDA2NDksIDB4MDYzNywgMHgwNjRBLCAweDA2MzksCisgICAgMHgwNjQ5LCAweDA2MzksIDB4MDY0QSwgMHgwNjNBLCAweDA2NDksIDB4MDYzQSwgMHgwNjRBLCAweDA2MzMsIDB4MDY0OSwKKyAgICAweDA2MzMsIDB4MDY0QSwgMHgwNjM0LCAweDA2NDksIDB4MDYzNCwgMHgwNjRBLCAweDA2MkQsIDB4MDY0OSwgMHgwNjJELAorICAgIDB4MDY0QSwgMHgwNjJDLCAweDA2NDksIDB4MDYyQywgMHgwNjRBLCAweDA2MkUsIDB4MDY0OSwgMHgwNjJFLCAweDA2NEEsCisgICAgMHgwNjM1LCAweDA2NDksIDB4MDYzNSwgMHgwNjRBLCAweDA2MzYsIDB4MDY0OSwgMHgwNjM2LCAweDA2NEEsIDB4MDYzNCwKKyAgICAweDA2MkMsIDB4MDYzNCwgMHgwNjJELCAweDA2MzQsIDB4MDYyRSwgMHgwNjM0LCAweDA2NDUsIDB4MDYzNCwgMHgwNjMxLAorICAgIDB4MDYzMywgMHgwNjMxLCAweDA2MzUsIDB4MDYzMSwgMHgwNjM2LCAweDA2MzEsIDB4MDYzNCwgMHgwNjJDLCAweDA2MzQsCisgICAgMHgwNjJELCAweDA2MzQsIDB4MDYyRSwgMHgwNjM0LCAweDA2NDUsIDB4MDYzMywgMHgwNjQ3LCAweDA2MzQsIDB4MDY0NywKKyAgICAweDA2MzcsIDB4MDY0NSwgMHgwNjMzLCAweDA2MkMsIDB4MDYzMywgMHgwNjJELCAweDA2MzMsIDB4MDYyRSwgMHgwNjM0LAorICAgIDB4MDYyQywgMHgwNjM0LCAweDA2MkQsIDB4MDYzNCwgMHgwNjJFLCAweDA2MzcsIDB4MDY0NSwgMHgwNjM4LCAweDA2NDUsCisgICAgMHgwNjI3LCAweDA2NEIsIDB4MDYyNywgMHgwNjRCLCAweDA2NDAsIDB4MDY0QiwgMHgwNjQwLCAweDA2NEUsIDB4MDY0MCwKKyAgICAweDA2NEYsIDB4MDY0MCwgMHgwNjUwLCAweDA2NDAsIDB4MDY1MSwgMHgwNjQwLCAweDA2NTIsIDB4MDY0NCwgMHgwNjIyLAorICAgIDB4MDY0NCwgMHgwNjIyLCAweDA2NDQsIDB4MDYyMywgMHgwNjQ0LCAweDA2MjMsIDB4MDY0NCwgMHgwNjI1LCAweDA2NDQsCisgICAgMHgwNjI1LCAweDA2NDQsIDB4MDYyNywgMHgwNjQ0LCAweDA2Mjd9OwogZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAzWzExNjRdID0gewotICAgIDB4MDAzMSwgMHgwMDJGLCAweDAwMzQsIDB4MDAzMSwgMHgwMDJGLCAweDAwMzIsIDB4MDAzMywgMHgwMDJGLCAweDAwMzQsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MjAzMiwgMHgyMDMyLCAweDIwMzIsIDB4MjAzNSwKLSAgICAweDIwMzUsIDB4MjAzNSwgMHgwMDYxLCAweDAwMkYsIDB4MDA2MywgMHgwMDYxLCAweDAwMkYsIDB4MDA3MywgMHgwMDYzLCAweDAwMkYsIDB4MDA2RiwgMHgwMDYzLCAweDAwMkYsIDB4MDA3NSwgMHgwMDU0LCAweDAwNDUsCi0gICAgMHgwMDRDLCAweDAwNDYsIDB4MDA0MSwgMHgwMDU4LCAweDAwMzEsIDB4MDAyRiwgMHgwMDM3LCAweDAwMzEsIDB4MDAyRiwgMHgwMDM5LCAweDAwMzEsIDB4MDAyRiwgMHgwMDMzLCAweDAwMzIsIDB4MDAyRiwgMHgwMDMzLAotICAgIDB4MDAzMSwgMHgwMDJGLCAweDAwMzUsIDB4MDAzMiwgMHgwMDJGLCAweDAwMzUsIDB4MDAzMywgMHgwMDJGLCAweDAwMzUsIDB4MDAzNCwgMHgwMDJGLCAweDAwMzUsIDB4MDAzMSwgMHgwMDJGLCAweDAwMzYsIDB4MDAzNSwKLSAgICAweDAwMkYsIDB4MDAzNiwgMHgwMDMxLCAweDAwMkYsIDB4MDAzOCwgMHgwMDMzLCAweDAwMkYsIDB4MDAzOCwgMHgwMDM1LCAweDAwMkYsIDB4MDAzOCwgMHgwMDM3LCAweDAwMkYsIDB4MDAzOCwgMHgwMDQ5LCAweDAwNDksCi0gICAgMHgwMDQ5LCAweDAwNTYsIDB4MDA0OSwgMHgwMDQ5LCAweDAwNTgsIDB4MDA0OSwgMHgwMDQ5LCAweDAwNjksIDB4MDA2OSwgMHgwMDY5LCAweDAwNzYsIDB4MDA2OSwgMHgwMDY5LCAweDAwNzgsIDB4MDA2OSwgMHgwMDY5LAotICAgIDB4MDAzMCwgMHgyMDQ0LCAweDAwMzMsIDB4MjIyQiwgMHgyMjJCLCAweDIyMkIsIDB4MjIyRSwgMHgyMjJFLCAweDIyMkUsIDB4MDA0RSwgMHgwMDU1LCAweDAwNEMsIDB4MDA1MywgMHgwMDRGLCAweDAwNDgsIDB4MDA1MywKLSAgICAweDAwNTQsIDB4MDA1OCwgMHgwMDQ1LCAweDAwNTQsIDB4MDA1OCwgMHgwMDQ1LCAweDAwNEYsIDB4MDA1NCwgMHgwMDQ1LCAweDAwNEUsIDB4MDA1MSwgMHgwMDQxLCAweDAwNDMsIDB4MDA0QiwgMHgwMDQyLCAweDAwNDUsCi0gICAgMHgwMDRDLCAweDAwNDQsIDB4MDA0QywgMHgwMDQ1LCAweDAwNDQsIDB4MDA0MywgMHgwMDMxLCAweDAwNDQsIDB4MDA0MywgMHgwMDMyLCAweDAwNDQsIDB4MDA0MywgMHgwMDMzLCAweDAwNDQsIDB4MDA0MywgMHgwMDM0LAotICAgIDB4MDA0RSwgMHgwMDQxLCAweDAwNEIsIDB4MDA1MywgMHgwMDU5LCAweDAwNEUsIDB4MDA0NSwgMHgwMDU0LCAweDAwNDIsIDB4MDA0MywgMHgwMDQxLCAweDAwNEUsIDB4MDA1MywgMHgwMDU1LCAweDAwNDIsIDB4MDA0NSwKLSAgICAweDAwNTMsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0QywgMHgwMDI4LCAweDAwMzEsIDB4MDAyOSwgMHgwMDI4LCAweDAwMzIsIDB4MDAyOSwgMHgwMDI4LCAweDAwMzMsIDB4MDAyOSwgMHgwMDI4LCAweDAwMzQsCi0gICAgMHgwMDI5LCAweDAwMjgsIDB4MDAzNSwgMHgwMDI5LCAweDAwMjgsIDB4MDAzNiwgMHgwMDI5LCAweDAwMjgsIDB4MDAzNywgMHgwMDI5LCAweDAwMjgsIDB4MDAzOCwgMHgwMDI5LCAweDAwMjgsIDB4MDAzOSwgMHgwMDI5LAotICAgIDB4MDAzMSwgMHgwMDMwLCAweDAwMkUsIDB4MDAzMSwgMHgwMDMxLCAweDAwMkUsIDB4MDAzMSwgMHgwMDMyLCAweDAwMkUsIDB4MDAzMSwgMHgwMDMzLCAweDAwMkUsIDB4MDAzMSwgMHgwMDM0LCAweDAwMkUsIDB4MDAzMSwKLSAgICAweDAwMzUsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzYsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzcsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzgsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzksIDB4MDAyRSwgMHgwMDMyLCAweDAwMzAsCi0gICAgMHgwMDJFLCAweDAwMjgsIDB4MDA2MSwgMHgwMDI5LCAweDAwMjgsIDB4MDA2MiwgMHgwMDI5LCAweDAwMjgsIDB4MDA2MywgMHgwMDI5LCAweDAwMjgsIDB4MDA2NCwgMHgwMDI5LCAweDAwMjgsIDB4MDA2NSwgMHgwMDI5LAotICAgIDB4MDAyOCwgMHgwMDY2LCAweDAwMjksIDB4MDAyOCwgMHgwMDY3LCAweDAwMjksIDB4MDAyOCwgMHgwMDY4LCAweDAwMjksIDB4MDAyOCwgMHgwMDY5LCAweDAwMjksIDB4MDAyOCwgMHgwMDZBLCAweDAwMjksIDB4MDAyOCwKLSAgICAweDAwNkIsIDB4MDAyOSwgMHgwMDI4LCAweDAwNkMsIDB4MDAyOSwgMHgwMDI4LCAweDAwNkQsIDB4MDAyOSwgMHgwMDI4LCAweDAwNkUsIDB4MDAyOSwgMHgwMDI4LCAweDAwNkYsIDB4MDAyOSwgMHgwMDI4LCAweDAwNzAsCi0gICAgMHgwMDI5LCAweDAwMjgsIDB4MDA3MSwgMHgwMDI5LCAweDAwMjgsIDB4MDA3MiwgMHgwMDI5LCAweDAwMjgsIDB4MDA3MywgMHgwMDI5LCAweDAwMjgsIDB4MDA3NCwgMHgwMDI5LCAweDAwMjgsIDB4MDA3NSwgMHgwMDI5LAotICAgIDB4MDAyOCwgMHgwMDc2LCAweDAwMjksIDB4MDAyOCwgMHgwMDc3LCAweDAwMjksIDB4MDAyOCwgMHgwMDc4LCAweDAwMjksIDB4MDAyOCwgMHgwMDc5LCAweDAwMjksIDB4MDAyOCwgMHgwMDdBLCAweDAwMjksIDB4MDAzQSwKLSAgICAweDAwM0EsIDB4MDAzRCwgMHgwMDNELCAweDAwM0QsIDB4MDAzRCwgMHgwMDI4LCAweDExMDAsIDB4MDAyOSwgMHgwMDI4LCAweDExMDIsIDB4MDAyOSwgMHgwMDI4LCAweDExMDMsIDB4MDAyOSwgMHgwMDI4LCAweDExMDUsCi0gICAgMHgwMDI5LCAweDAwMjgsIDB4MTEwNiwgMHgwMDI5LCAweDAwMjgsIDB4MTEwNywgMHgwMDI5LCAweDAwMjgsIDB4MTEwOSwgMHgwMDI5LCAweDAwMjgsIDB4MTEwQiwgMHgwMDI5LCAweDAwMjgsIDB4MTEwQywgMHgwMDI5LAotICAgIDB4MDAyOCwgMHgxMTBFLCAweDAwMjksIDB4MDAyOCwgMHgxMTBGLCAweDAwMjksIDB4MDAyOCwgMHgxMTEwLCAweDAwMjksIDB4MDAyOCwgMHgxMTExLCAweDAwMjksIDB4MDAyOCwgMHgxMTEyLCAweDAwMjksIDB4MDAyOCwKLSAgICAweDRFMDAsIDB4MDAyOSwgMHgwMDI4LCAweDRFOEMsIDB4MDAyOSwgMHgwMDI4LCAweDRFMDksIDB4MDAyOSwgMHgwMDI4LCAweDU2REIsIDB4MDAyOSwgMHgwMDI4LCAweDRFOTQsIDB4MDAyOSwgMHgwMDI4LCAweDUxNkQsCi0gICAgMHgwMDI5LCAweDAwMjgsIDB4NEUwMywgMHgwMDI5LCAweDAwMjgsIDB4NTE2QiwgMHgwMDI5LCAweDAwMjgsIDB4NEU1RCwgMHgwMDI5LCAweDAwMjgsIDB4NTM0MSwgMHgwMDI5LCAweDAwMjgsIDB4NjcwOCwgMHgwMDI5LAotICAgIDB4MDAyOCwgMHg3MDZCLCAweDAwMjksIDB4MDAyOCwgMHg2QzM0LCAweDAwMjksIDB4MDAyOCwgMHg2NzI4LCAweDAwMjksIDB4MDAyOCwgMHg5MUQxLCAweDAwMjksIDB4MDAyOCwgMHg1NzFGLCAweDAwMjksIDB4MDAyOCwKLSAgICAweDY1RTUsIDB4MDAyOSwgMHgwMDI4LCAweDY4MkEsIDB4MDAyOSwgMHgwMDI4LCAweDY3MDksIDB4MDAyOSwgMHgwMDI4LCAweDc5M0UsIDB4MDAyOSwgMHgwMDI4LCAweDU0MEQsIDB4MDAyOSwgMHgwMDI4LCAweDcyNzksCi0gICAgMHgwMDI5LCAweDAwMjgsIDB4OENBMSwgMHgwMDI5LCAweDAwMjgsIDB4Nzk1RCwgMHgwMDI5LCAweDAwMjgsIDB4NTJCNCwgMHgwMDI5LCAweDAwMjgsIDB4NEVFMywgMHgwMDI5LCAweDAwMjgsIDB4NTQ3QywgMHgwMDI5LAotICAgIDB4MDAyOCwgMHg1QjY2LCAweDAwMjksIDB4MDAyOCwgMHg3NkUzLCAweDAwMjksIDB4MDAyOCwgMHg0RjAxLCAweDAwMjksIDB4MDAyOCwgMHg4Q0M3LCAweDAwMjksIDB4MDAyOCwgMHg1MzU0LCAweDAwMjksIDB4MDAyOCwKLSAgICAweDc5NkQsIDB4MDAyOSwgMHgwMDI4LCAweDRGMTEsIDB4MDAyOSwgMHgwMDI4LCAweDgxRUEsIDB4MDAyOSwgMHgwMDI4LCAweDgxRjMsIDB4MDAyOSwgMHgwMDUwLCAweDAwNTQsIDB4MDA0NSwgMHgwMDMxLCAweDAwMzAsCi0gICAgMHg2NzA4LCAweDAwMzEsIDB4MDAzMSwgMHg2NzA4LCAweDAwMzEsIDB4MDAzMiwgMHg2NzA4LCAweDAwNjUsIDB4MDA3MiwgMHgwMDY3LCAweDAwNEMsIDB4MDA1NCwgMHgwMDQ0LCAweDMwQTIsIDB4MzBGQywgMHgzMEVCLAotICAgIDB4MzBBNCwgMHgzMEYzLCAweDMwQzEsIDB4MzBBNiwgMHgzMEE5LCAweDMwRjMsIDB4MzBBQSwgMHgzMEYzLCAweDMwQjksIDB4MzBBQSwgMHgzMEZDLCAweDMwRTAsIDB4MzBBQiwgMHgzMEE0LCAweDMwRUEsIDB4MzBBQywKLSAgICAweDMwRUQsIDB4MzBGMywgMHgzMEFDLCAweDMwRjMsIDB4MzBERSwgMHgzMEFFLCAweDMwQ0IsIDB4MzBGQywgMHgzMEIwLCAweDMwRTksIDB4MzBFMCwgMHgzMEIxLCAweDMwRkMsIDB4MzBCOSwgMHgzMEIzLCAweDMwRUIsCi0gICAgMHgzMENBLCAweDMwQjMsIDB4MzBGQywgMHgzMERELCAweDMwQkIsIDB4MzBGMywgMHgzMEMxLCAweDMwQkIsIDB4MzBGMywgMHgzMEM4LCAweDMwQzAsIDB4MzBGQywgMHgzMEI5LCAweDMwQ0UsIDB4MzBDMywgMHgzMEM4LAotICAgIDB4MzBDRiwgMHgzMEE0LCAweDMwQzQsIDB4MzBEMSwgMHgzMEZDLCAweDMwQzQsIDB4MzBENCwgMHgzMEFGLCAweDMwRUIsIDB4MzBENSwgMHgzMEU5LCAweDMwRjMsIDB4MzBEQSwgMHgzMENCLCAweDMwRDIsIDB4MzBEOCwKLSAgICAweDMwRUIsIDB4MzBDNCwgMHgzMERBLCAweDMwRjMsIDB4MzBCOSwgMHgzMERBLCAweDMwRkMsIDB4MzBCOCwgMHgzMEQ5LCAweDMwRkMsIDB4MzBCRiwgMHgzMERDLCAweDMwRUIsIDB4MzBDOCwgMHgzMERELCAweDMwRjMsCi0gICAgMHgzMEM5LCAweDMwREIsIDB4MzBGQywgMHgzMEVCLCAweDMwREIsIDB4MzBGQywgMHgzMEYzLCAweDMwREUsIDB4MzBBNCwgMHgzMEVCLCAweDMwREUsIDB4MzBDMywgMHgzMENGLCAweDMwREUsIDB4MzBFQiwgMHgzMEFGLAotICAgIDB4MzBFNCwgMHgzMEZDLCAweDMwQzksIDB4MzBFNCwgMHgzMEZDLCAweDMwRUIsIDB4MzBFNiwgMHgzMEEyLCAweDMwRjMsIDB4MzBFQiwgMHgzMEQ0LCAweDMwRkMsIDB4MzBFRiwgMHgzMEMzLCAweDMwQzgsIDB4MDAzMSwKLSAgICAweDAwMzAsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzEsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzIsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzMsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzQsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzUsCi0gICAgMHg3MEI5LCAweDAwMzEsIDB4MDAzNiwgMHg3MEI5LCAweDAwMzEsIDB4MDAzNywgMHg3MEI5LCAweDAwMzEsIDB4MDAzOCwgMHg3MEI5LCAweDAwMzEsIDB4MDAzOSwgMHg3MEI5LCAweDAwMzIsIDB4MDAzMCwgMHg3MEI5LAotICAgIDB4MDAzMiwgMHgwMDMxLCAweDcwQjksIDB4MDAzMiwgMHgwMDMyLCAweDcwQjksIDB4MDAzMiwgMHgwMDMzLCAweDcwQjksIDB4MDAzMiwgMHgwMDM0LCAweDcwQjksIDB4MDA2OCwgMHgwMDUwLCAweDAwNjEsIDB4MDA2MiwKLSAgICAweDAwNjEsIDB4MDA3MiwgMHgwMDY0LCAweDAwNkQsIDB4MDBCMiwgMHgwMDY0LCAweDAwNkQsIDB4MDBCMywgMHgwMDYzLCAweDAwNjEsIDB4MDA2QywgMHgwMDZCLCAweDAwNDgsIDB4MDA3QSwgMHgwMDRELCAweDAwNDgsCi0gICAgMHgwMDdBLCAweDAwNDcsIDB4MDA0OCwgMHgwMDdBLCAweDAwNTQsIDB4MDA0OCwgMHgwMDdBLCAweDAwNkQsIDB4MDA2RCwgMHgwMEIyLCAweDAwNjMsIDB4MDA2RCwgMHgwMEIyLCAweDAwNkIsIDB4MDA2RCwgMHgwMEIyLAotICAgIDB4MDA2RCwgMHgwMDZELCAweDAwQjMsIDB4MDA2MywgMHgwMDZELCAweDAwQjMsIDB4MDA2QiwgMHgwMDZELCAweDAwQjMsIDB4MDA2RCwgMHgyMjE1LCAweDAwNzMsIDB4MDA2QiwgMHgwMDUwLCAweDAwNjEsIDB4MDA0RCwKLSAgICAweDAwNTAsIDB4MDA2MSwgMHgwMDQ3LCAweDAwNTAsIDB4MDA2MSwgMHgwMDcyLCAweDAwNjEsIDB4MDA2NCwgMHgwMDQzLCAweDAwNkYsIDB4MDAyRSwgMHgwMDZDLCAweDAwNkYsIDB4MDA2NywgMHgwMDZELCAweDAwNjksCi0gICAgMHgwMDZDLCAweDAwNkQsIDB4MDA2RiwgMHgwMDZDLCAweDAwNTAsIDB4MDA1MCwgMHgwMDRELCAweDAwNTYsIDB4MjIxNSwgMHgwMDZELCAweDAwNDEsIDB4MjIxNSwgMHgwMDZELCAweDAwMzEsIDB4MDAzMCwgMHg2NUU1LAotICAgIDB4MDAzMSwgMHgwMDMxLCAweDY1RTUsIDB4MDAzMSwgMHgwMDMyLCAweDY1RTUsIDB4MDAzMSwgMHgwMDMzLCAweDY1RTUsIDB4MDAzMSwgMHgwMDM0LCAweDY1RTUsIDB4MDAzMSwgMHgwMDM1LCAweDY1RTUsIDB4MDAzMSwKLSAgICAweDAwMzYsIDB4NjVFNSwgMHgwMDMxLCAweDAwMzcsIDB4NjVFNSwgMHgwMDMxLCAweDAwMzgsIDB4NjVFNSwgMHgwMDMxLCAweDAwMzksIDB4NjVFNSwgMHgwMDMyLCAweDAwMzAsIDB4NjVFNSwgMHgwMDMyLCAweDAwMzEsCi0gICAgMHg2NUU1LCAweDAwMzIsIDB4MDAzMiwgMHg2NUU1LCAweDAwMzIsIDB4MDAzMywgMHg2NUU1LCAweDAwMzIsIDB4MDAzNCwgMHg2NUU1LCAweDAwMzIsIDB4MDAzNSwgMHg2NUU1LCAweDAwMzIsIDB4MDAzNiwgMHg2NUU1LAotICAgIDB4MDAzMiwgMHgwMDM3LCAweDY1RTUsIDB4MDAzMiwgMHgwMDM4LCAweDY1RTUsIDB4MDAzMiwgMHgwMDM5LCAweDY1RTUsIDB4MDAzMywgMHgwMDMwLCAweDY1RTUsIDB4MDAzMywgMHgwMDMxLCAweDY1RTUsIDB4MDA2NywKLSAgICAweDAwNjEsIDB4MDA2QywgMHgwMDY2LCAweDAwNjYsIDB4MDA2OSwgMHgwMDY2LCAweDAwNjYsIDB4MDA2QywgMHgwNjQwLCAweDA2NEUsIDB4MDY1MSwgMHgwNjQwLCAweDA2NEYsIDB4MDY1MSwgMHgwNjQwLCAweDA2NTAsCi0gICAgMHgwNjUxLCAweDA2MkEsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkEsIDB4MDYyRCwgMHgwNjJDLCAweDA2MkEsIDB4MDYyRCwgMHgwNjJDLCAweDA2MkEsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MkEsIDB4MDYyRSwgMHgwNjQ1LAotICAgIDB4MDYyQSwgMHgwNjQ1LCAweDA2MkMsIDB4MDYyQSwgMHgwNjQ1LCAweDA2MkQsIDB4MDYyQSwgMHgwNjQ1LCAweDA2MkUsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkQsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkQsIDB4MDYyRCwKLSAgICAweDA2NDUsIDB4MDY0QSwgMHgwNjJELCAweDA2NDUsIDB4MDY0OSwgMHgwNjMzLCAweDA2MkQsIDB4MDYyQywgMHgwNjMzLCAweDA2MkMsIDB4MDYyRCwgMHgwNjMzLCAweDA2MkMsIDB4MDY0OSwgMHgwNjMzLCAweDA2NDUsCi0gICAgMHgwNjJELCAweDA2MzMsIDB4MDY0NSwgMHgwNjJELCAweDA2MzMsIDB4MDY0NSwgMHgwNjJDLCAweDA2MzMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzUsIDB4MDYyRCwgMHgwNjJELAotICAgIDB4MDYzNSwgMHgwNjJELCAweDA2MkQsIDB4MDYzNSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYzNCwgMHgwNjJELCAweDA2NDUsIDB4MDYzNCwgMHgwNjJELCAweDA2NDUsIDB4MDYzNCwgMHgwNjJDLCAweDA2NEEsIDB4MDYzNCwKLSAgICAweDA2NDUsIDB4MDYyRSwgMHgwNjM0LCAweDA2NDUsIDB4MDYyRSwgMHgwNjM0LCAweDA2NDUsIDB4MDY0NSwgMHgwNjM0LCAweDA2NDUsIDB4MDY0NSwgMHgwNjM2LCAweDA2MkQsIDB4MDY0OSwgMHgwNjM2LCAweDA2MkUsCi0gICAgMHgwNjQ1LCAweDA2MzYsIDB4MDYyRSwgMHgwNjQ1LCAweDA2MzcsIDB4MDY0NSwgMHgwNjJELCAweDA2MzcsIDB4MDY0NSwgMHgwNjJELCAweDA2MzcsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzcsIDB4MDY0NSwgMHgwNjRBLAotICAgIDB4MDYzOSwgMHgwNjJDLCAweDA2NDUsIDB4MDYzOSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYzOSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYzOSwgMHgwNjQ1LCAweDA2NDksIDB4MDYzQSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYzQSwKLSAgICAweDA2NDUsIDB4MDY0QSwgMHgwNjNBLCAweDA2NDUsIDB4MDY0OSwgMHgwNjQxLCAweDA2MkUsIDB4MDY0NSwgMHgwNjQxLCAweDA2MkUsIDB4MDY0NSwgMHgwNjQyLCAweDA2NDUsIDB4MDYyRCwgMHgwNjQyLCAweDA2NDUsCi0gICAgMHgwNjQ1LCAweDA2NDQsIDB4MDYyRCwgMHgwNjQ1LCAweDA2NDQsIDB4MDYyRCwgMHgwNjRBLCAweDA2NDQsIDB4MDYyRCwgMHgwNjQ5LCAweDA2NDQsIDB4MDYyQywgMHgwNjJDLCAweDA2NDQsIDB4MDYyQywgMHgwNjJDLAotICAgIDB4MDY0NCwgMHgwNjJFLCAweDA2NDUsIDB4MDY0NCwgMHgwNjJFLCAweDA2NDUsIDB4MDY0NCwgMHgwNjQ1LCAweDA2MkQsIDB4MDY0NCwgMHgwNjQ1LCAweDA2MkQsIDB4MDY0NSwgMHgwNjJELCAweDA2MkMsIDB4MDY0NSwKLSAgICAweDA2MkQsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MkQsIDB4MDY0QSwgMHgwNjQ1LCAweDA2MkMsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MkMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MkUsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkUsCi0gICAgMHgwNjQ1LCAweDA2NDUsIDB4MDYyQywgMHgwNjJFLCAweDA2NDcsIDB4MDY0NSwgMHgwNjJDLCAweDA2NDcsIDB4MDY0NSwgMHgwNjQ1LCAweDA2NDYsIDB4MDYyRCwgMHgwNjQ1LCAweDA2NDYsIDB4MDYyRCwgMHgwNjQ5LAotICAgIDB4MDY0NiwgMHgwNjJDLCAweDA2NDUsIDB4MDY0NiwgMHgwNjJDLCAweDA2NDUsIDB4MDY0NiwgMHgwNjJDLCAweDA2NDksIDB4MDY0NiwgMHgwNjQ1LCAweDA2NEEsIDB4MDY0NiwgMHgwNjQ1LCAweDA2NDksIDB4MDY0QSwKLSAgICAweDA2NDUsIDB4MDY0NSwgMHgwNjRBLCAweDA2NDUsIDB4MDY0NSwgMHgwNjI4LCAweDA2MkUsIDB4MDY0QSwgMHgwNjJBLCAweDA2MkMsIDB4MDY0QSwgMHgwNjJBLCAweDA2MkMsIDB4MDY0OSwgMHgwNjJBLCAweDA2MkUsCi0gICAgMHgwNjRBLCAweDA2MkEsIDB4MDYyRSwgMHgwNjQ5LCAweDA2MkEsIDB4MDY0NSwgMHgwNjRBLCAweDA2MkEsIDB4MDY0NSwgMHgwNjQ5LCAweDA2MkMsIDB4MDY0NSwgMHgwNjRBLCAweDA2MkMsIDB4MDYyRCwgMHgwNjQ5LAotICAgIDB4MDYyQywgMHgwNjQ1LCAweDA2NDksIDB4MDYzMywgMHgwNjJFLCAweDA2NDksIDB4MDYzNSwgMHgwNjJELCAweDA2NEEsIDB4MDYzNCwgMHgwNjJELCAweDA2NEEsIDB4MDYzNiwgMHgwNjJELCAweDA2NEEsIDB4MDY0NCwKLSAgICAweDA2MkMsIDB4MDY0QSwgMHgwNjQ0LCAweDA2NDUsIDB4MDY0QSwgMHgwNjRBLCAweDA2MkQsIDB4MDY0QSwgMHgwNjRBLCAweDA2MkMsIDB4MDY0QSwgMHgwNjRBLCAweDA2NDUsIDB4MDY0QSwgMHgwNjQ1LCAweDA2NDUsCi0gICAgMHgwNjRBLCAweDA2NDIsIDB4MDY0NSwgMHgwNjRBLCAweDA2NDYsIDB4MDYyRCwgMHgwNjRBLCAweDA2NDIsIDB4MDY0NSwgMHgwNjJELCAweDA2NDQsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MzksIDB4MDY0NSwgMHgwNjRBLAotICAgIDB4MDY0MywgMHgwNjQ1LCAweDA2NEEsIDB4MDY0NiwgMHgwNjJDLCAweDA2MkQsIDB4MDY0NSwgMHgwNjJFLCAweDA2NEEsIDB4MDY0NCwgMHgwNjJDLCAweDA2NDUsIDB4MDY0MywgMHgwNjQ1LCAweDA2NDUsIDB4MDY0NCwKLSAgICAweDA2MkMsIDB4MDY0NSwgMHgwNjQ2LCAweDA2MkMsIDB4MDYyRCwgMHgwNjJDLCAweDA2MkQsIDB4MDY0QSwgMHgwNjJELCAweDA2MkMsIDB4MDY0QSwgMHgwNjQ1LCAweDA2MkMsIDB4MDY0QSwgMHgwNjQxLCAweDA2NDUsCi0gICAgMHgwNjRBLCAweDA2MjgsIDB4MDYyRCwgMHgwNjRBLCAweDA2NDMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzksIDB4MDYyQywgMHgwNjQ1LCAweDA2MzUsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzMsIDB4MDYyRSwgMHgwNjRBLAotICAgIDB4MDY0NiwgMHgwNjJDLCAweDA2NEEsIDB4MDYzNSwgMHgwNjQ0LCAweDA2RDIsIDB4MDY0MiwgMHgwNjQ0LCAweDA2RDIsIDB4MDYzNSwgMHgwNjQ0LCAweDA2NDkKLX07CisgICAgMHgwMDMxLCAweDAwMkYsIDB4MDAzNCwgMHgwMDMxLCAweDAwMkYsIDB4MDAzMiwgMHgwMDMzLCAweDAwMkYsIDB4MDAzNCwKKyAgICAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDIwMzIsIDB4MjAzMiwgMHgyMDMyLCAweDIwMzUsIDB4MjAzNSwgMHgyMDM1LAorICAgIDB4MDA2MSwgMHgwMDJGLCAweDAwNjMsIDB4MDA2MSwgMHgwMDJGLCAweDAwNzMsIDB4MDA2MywgMHgwMDJGLCAweDAwNkYsCisgICAgMHgwMDYzLCAweDAwMkYsIDB4MDA3NSwgMHgwMDU0LCAweDAwNDUsIDB4MDA0QywgMHgwMDQ2LCAweDAwNDEsIDB4MDA1OCwKKyAgICAweDAwMzEsIDB4MDAyRiwgMHgwMDM3LCAweDAwMzEsIDB4MDAyRiwgMHgwMDM5LCAweDAwMzEsIDB4MDAyRiwgMHgwMDMzLAorICAgIDB4MDAzMiwgMHgwMDJGLCAweDAwMzMsIDB4MDAzMSwgMHgwMDJGLCAweDAwMzUsIDB4MDAzMiwgMHgwMDJGLCAweDAwMzUsCisgICAgMHgwMDMzLCAweDAwMkYsIDB4MDAzNSwgMHgwMDM0LCAweDAwMkYsIDB4MDAzNSwgMHgwMDMxLCAweDAwMkYsIDB4MDAzNiwKKyAgICAweDAwMzUsIDB4MDAyRiwgMHgwMDM2LCAweDAwMzEsIDB4MDAyRiwgMHgwMDM4LCAweDAwMzMsIDB4MDAyRiwgMHgwMDM4LAorICAgIDB4MDAzNSwgMHgwMDJGLCAweDAwMzgsIDB4MDAzNywgMHgwMDJGLCAweDAwMzgsIDB4MDA0OSwgMHgwMDQ5LCAweDAwNDksCisgICAgMHgwMDU2LCAweDAwNDksIDB4MDA0OSwgMHgwMDU4LCAweDAwNDksIDB4MDA0OSwgMHgwMDY5LCAweDAwNjksIDB4MDA2OSwKKyAgICAweDAwNzYsIDB4MDA2OSwgMHgwMDY5LCAweDAwNzgsIDB4MDA2OSwgMHgwMDY5LCAweDAwMzAsIDB4MjA0NCwgMHgwMDMzLAorICAgIDB4MjIyQiwgMHgyMjJCLCAweDIyMkIsIDB4MjIyRSwgMHgyMjJFLCAweDIyMkUsIDB4MDA0RSwgMHgwMDU1LCAweDAwNEMsCisgICAgMHgwMDUzLCAweDAwNEYsIDB4MDA0OCwgMHgwMDUzLCAweDAwNTQsIDB4MDA1OCwgMHgwMDQ1LCAweDAwNTQsIDB4MDA1OCwKKyAgICAweDAwNDUsIDB4MDA0RiwgMHgwMDU0LCAweDAwNDUsIDB4MDA0RSwgMHgwMDUxLCAweDAwNDEsIDB4MDA0MywgMHgwMDRCLAorICAgIDB4MDA0MiwgMHgwMDQ1LCAweDAwNEMsIDB4MDA0NCwgMHgwMDRDLCAweDAwNDUsIDB4MDA0NCwgMHgwMDQzLCAweDAwMzEsCisgICAgMHgwMDQ0LCAweDAwNDMsIDB4MDAzMiwgMHgwMDQ0LCAweDAwNDMsIDB4MDAzMywgMHgwMDQ0LCAweDAwNDMsIDB4MDAzNCwKKyAgICAweDAwNEUsIDB4MDA0MSwgMHgwMDRCLCAweDAwNTMsIDB4MDA1OSwgMHgwMDRFLCAweDAwNDUsIDB4MDA1NCwgMHgwMDQyLAorICAgIDB4MDA0MywgMHgwMDQxLCAweDAwNEUsIDB4MDA1MywgMHgwMDU1LCAweDAwNDIsIDB4MDA0NSwgMHgwMDUzLCAweDAwNDMsCisgICAgMHgwMDQ0LCAweDAwNDUsIDB4MDA0QywgMHgwMDI4LCAweDAwMzEsIDB4MDAyOSwgMHgwMDI4LCAweDAwMzIsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4MDAzMywgMHgwMDI5LCAweDAwMjgsIDB4MDAzNCwgMHgwMDI5LCAweDAwMjgsIDB4MDAzNSwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgwMDM2LCAweDAwMjksIDB4MDAyOCwgMHgwMDM3LCAweDAwMjksIDB4MDAyOCwgMHgwMDM4LCAweDAwMjksCisgICAgMHgwMDI4LCAweDAwMzksIDB4MDAyOSwgMHgwMDMxLCAweDAwMzAsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzEsIDB4MDAyRSwKKyAgICAweDAwMzEsIDB4MDAzMiwgMHgwMDJFLCAweDAwMzEsIDB4MDAzMywgMHgwMDJFLCAweDAwMzEsIDB4MDAzNCwgMHgwMDJFLAorICAgIDB4MDAzMSwgMHgwMDM1LCAweDAwMkUsIDB4MDAzMSwgMHgwMDM2LCAweDAwMkUsIDB4MDAzMSwgMHgwMDM3LCAweDAwMkUsCisgICAgMHgwMDMxLCAweDAwMzgsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzksIDB4MDAyRSwgMHgwMDMyLCAweDAwMzAsIDB4MDAyRSwKKyAgICAweDAwMjgsIDB4MDA2MSwgMHgwMDI5LCAweDAwMjgsIDB4MDA2MiwgMHgwMDI5LCAweDAwMjgsIDB4MDA2MywgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgwMDY0LCAweDAwMjksIDB4MDAyOCwgMHgwMDY1LCAweDAwMjksIDB4MDAyOCwgMHgwMDY2LCAweDAwMjksCisgICAgMHgwMDI4LCAweDAwNjcsIDB4MDAyOSwgMHgwMDI4LCAweDAwNjgsIDB4MDAyOSwgMHgwMDI4LCAweDAwNjksIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4MDA2QSwgMHgwMDI5LCAweDAwMjgsIDB4MDA2QiwgMHgwMDI5LCAweDAwMjgsIDB4MDA2QywgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgwMDZELCAweDAwMjksIDB4MDAyOCwgMHgwMDZFLCAweDAwMjksIDB4MDAyOCwgMHgwMDZGLCAweDAwMjksCisgICAgMHgwMDI4LCAweDAwNzAsIDB4MDAyOSwgMHgwMDI4LCAweDAwNzEsIDB4MDAyOSwgMHgwMDI4LCAweDAwNzIsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4MDA3MywgMHgwMDI5LCAweDAwMjgsIDB4MDA3NCwgMHgwMDI5LCAweDAwMjgsIDB4MDA3NSwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgwMDc2LCAweDAwMjksIDB4MDAyOCwgMHgwMDc3LCAweDAwMjksIDB4MDAyOCwgMHgwMDc4LCAweDAwMjksCisgICAgMHgwMDI4LCAweDAwNzksIDB4MDAyOSwgMHgwMDI4LCAweDAwN0EsIDB4MDAyOSwgMHgwMDNBLCAweDAwM0EsIDB4MDAzRCwKKyAgICAweDAwM0QsIDB4MDAzRCwgMHgwMDNELCAweDAwMjgsIDB4MTEwMCwgMHgwMDI5LCAweDAwMjgsIDB4MTEwMiwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgxMTAzLCAweDAwMjksIDB4MDAyOCwgMHgxMTA1LCAweDAwMjksIDB4MDAyOCwgMHgxMTA2LCAweDAwMjksCisgICAgMHgwMDI4LCAweDExMDcsIDB4MDAyOSwgMHgwMDI4LCAweDExMDksIDB4MDAyOSwgMHgwMDI4LCAweDExMEIsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4MTEwQywgMHgwMDI5LCAweDAwMjgsIDB4MTEwRSwgMHgwMDI5LCAweDAwMjgsIDB4MTEwRiwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgxMTEwLCAweDAwMjksIDB4MDAyOCwgMHgxMTExLCAweDAwMjksIDB4MDAyOCwgMHgxMTEyLCAweDAwMjksCisgICAgMHgwMDI4LCAweDRFMDAsIDB4MDAyOSwgMHgwMDI4LCAweDRFOEMsIDB4MDAyOSwgMHgwMDI4LCAweDRFMDksIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4NTZEQiwgMHgwMDI5LCAweDAwMjgsIDB4NEU5NCwgMHgwMDI5LCAweDAwMjgsIDB4NTE2RCwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHg0RTAzLCAweDAwMjksIDB4MDAyOCwgMHg1MTZCLCAweDAwMjksIDB4MDAyOCwgMHg0RTVELCAweDAwMjksCisgICAgMHgwMDI4LCAweDUzNDEsIDB4MDAyOSwgMHgwMDI4LCAweDY3MDgsIDB4MDAyOSwgMHgwMDI4LCAweDcwNkIsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4NkMzNCwgMHgwMDI5LCAweDAwMjgsIDB4NjcyOCwgMHgwMDI5LCAweDAwMjgsIDB4OTFEMSwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHg1NzFGLCAweDAwMjksIDB4MDAyOCwgMHg2NUU1LCAweDAwMjksIDB4MDAyOCwgMHg2ODJBLCAweDAwMjksCisgICAgMHgwMDI4LCAweDY3MDksIDB4MDAyOSwgMHgwMDI4LCAweDc5M0UsIDB4MDAyOSwgMHgwMDI4LCAweDU0MEQsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4NzI3OSwgMHgwMDI5LCAweDAwMjgsIDB4OENBMSwgMHgwMDI5LCAweDAwMjgsIDB4Nzk1RCwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHg1MkI0LCAweDAwMjksIDB4MDAyOCwgMHg0RUUzLCAweDAwMjksIDB4MDAyOCwgMHg1NDdDLCAweDAwMjksCisgICAgMHgwMDI4LCAweDVCNjYsIDB4MDAyOSwgMHgwMDI4LCAweDc2RTMsIDB4MDAyOSwgMHgwMDI4LCAweDRGMDEsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4OENDNywgMHgwMDI5LCAweDAwMjgsIDB4NTM1NCwgMHgwMDI5LCAweDAwMjgsIDB4Nzk2RCwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHg0RjExLCAweDAwMjksIDB4MDAyOCwgMHg4MUVBLCAweDAwMjksIDB4MDAyOCwgMHg4MUYzLCAweDAwMjksCisgICAgMHgwMDUwLCAweDAwNTQsIDB4MDA0NSwgMHgwMDMxLCAweDAwMzAsIDB4NjcwOCwgMHgwMDMxLCAweDAwMzEsIDB4NjcwOCwKKyAgICAweDAwMzEsIDB4MDAzMiwgMHg2NzA4LCAweDAwNjUsIDB4MDA3MiwgMHgwMDY3LCAweDAwNEMsIDB4MDA1NCwgMHgwMDQ0LAorICAgIDB4MzBBMiwgMHgzMEZDLCAweDMwRUIsIDB4MzBBNCwgMHgzMEYzLCAweDMwQzEsIDB4MzBBNiwgMHgzMEE5LCAweDMwRjMsCisgICAgMHgzMEFBLCAweDMwRjMsIDB4MzBCOSwgMHgzMEFBLCAweDMwRkMsIDB4MzBFMCwgMHgzMEFCLCAweDMwQTQsIDB4MzBFQSwKKyAgICAweDMwQUMsIDB4MzBFRCwgMHgzMEYzLCAweDMwQUMsIDB4MzBGMywgMHgzMERFLCAweDMwQUUsIDB4MzBDQiwgMHgzMEZDLAorICAgIDB4MzBCMCwgMHgzMEU5LCAweDMwRTAsIDB4MzBCMSwgMHgzMEZDLCAweDMwQjksIDB4MzBCMywgMHgzMEVCLCAweDMwQ0EsCisgICAgMHgzMEIzLCAweDMwRkMsIDB4MzBERCwgMHgzMEJCLCAweDMwRjMsIDB4MzBDMSwgMHgzMEJCLCAweDMwRjMsIDB4MzBDOCwKKyAgICAweDMwQzAsIDB4MzBGQywgMHgzMEI5LCAweDMwQ0UsIDB4MzBDMywgMHgzMEM4LCAweDMwQ0YsIDB4MzBBNCwgMHgzMEM0LAorICAgIDB4MzBEMSwgMHgzMEZDLCAweDMwQzQsIDB4MzBENCwgMHgzMEFGLCAweDMwRUIsIDB4MzBENSwgMHgzMEU5LCAweDMwRjMsCisgICAgMHgzMERBLCAweDMwQ0IsIDB4MzBEMiwgMHgzMEQ4LCAweDMwRUIsIDB4MzBDNCwgMHgzMERBLCAweDMwRjMsIDB4MzBCOSwKKyAgICAweDMwREEsIDB4MzBGQywgMHgzMEI4LCAweDMwRDksIDB4MzBGQywgMHgzMEJGLCAweDMwREMsIDB4MzBFQiwgMHgzMEM4LAorICAgIDB4MzBERCwgMHgzMEYzLCAweDMwQzksIDB4MzBEQiwgMHgzMEZDLCAweDMwRUIsIDB4MzBEQiwgMHgzMEZDLCAweDMwRjMsCisgICAgMHgzMERFLCAweDMwQTQsIDB4MzBFQiwgMHgzMERFLCAweDMwQzMsIDB4MzBDRiwgMHgzMERFLCAweDMwRUIsIDB4MzBBRiwKKyAgICAweDMwRTQsIDB4MzBGQywgMHgzMEM5LCAweDMwRTQsIDB4MzBGQywgMHgzMEVCLCAweDMwRTYsIDB4MzBBMiwgMHgzMEYzLAorICAgIDB4MzBFQiwgMHgzMEQ0LCAweDMwRkMsIDB4MzBFRiwgMHgzMEMzLCAweDMwQzgsIDB4MDAzMSwgMHgwMDMwLCAweDcwQjksCisgICAgMHgwMDMxLCAweDAwMzEsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzIsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzMsIDB4NzBCOSwKKyAgICAweDAwMzEsIDB4MDAzNCwgMHg3MEI5LCAweDAwMzEsIDB4MDAzNSwgMHg3MEI5LCAweDAwMzEsIDB4MDAzNiwgMHg3MEI5LAorICAgIDB4MDAzMSwgMHgwMDM3LCAweDcwQjksIDB4MDAzMSwgMHgwMDM4LCAweDcwQjksIDB4MDAzMSwgMHgwMDM5LCAweDcwQjksCisgICAgMHgwMDMyLCAweDAwMzAsIDB4NzBCOSwgMHgwMDMyLCAweDAwMzEsIDB4NzBCOSwgMHgwMDMyLCAweDAwMzIsIDB4NzBCOSwKKyAgICAweDAwMzIsIDB4MDAzMywgMHg3MEI5LCAweDAwMzIsIDB4MDAzNCwgMHg3MEI5LCAweDAwNjgsIDB4MDA1MCwgMHgwMDYxLAorICAgIDB4MDA2MiwgMHgwMDYxLCAweDAwNzIsIDB4MDA2NCwgMHgwMDZELCAweDAwQjIsIDB4MDA2NCwgMHgwMDZELCAweDAwQjMsCisgICAgMHgwMDYzLCAweDAwNjEsIDB4MDA2QywgMHgwMDZCLCAweDAwNDgsIDB4MDA3QSwgMHgwMDRELCAweDAwNDgsIDB4MDA3QSwKKyAgICAweDAwNDcsIDB4MDA0OCwgMHgwMDdBLCAweDAwNTQsIDB4MDA0OCwgMHgwMDdBLCAweDAwNkQsIDB4MDA2RCwgMHgwMEIyLAorICAgIDB4MDA2MywgMHgwMDZELCAweDAwQjIsIDB4MDA2QiwgMHgwMDZELCAweDAwQjIsIDB4MDA2RCwgMHgwMDZELCAweDAwQjMsCisgICAgMHgwMDYzLCAweDAwNkQsIDB4MDBCMywgMHgwMDZCLCAweDAwNkQsIDB4MDBCMywgMHgwMDZELCAweDIyMTUsIDB4MDA3MywKKyAgICAweDAwNkIsIDB4MDA1MCwgMHgwMDYxLCAweDAwNEQsIDB4MDA1MCwgMHgwMDYxLCAweDAwNDcsIDB4MDA1MCwgMHgwMDYxLAorICAgIDB4MDA3MiwgMHgwMDYxLCAweDAwNjQsIDB4MDA0MywgMHgwMDZGLCAweDAwMkUsIDB4MDA2QywgMHgwMDZGLCAweDAwNjcsCisgICAgMHgwMDZELCAweDAwNjksIDB4MDA2QywgMHgwMDZELCAweDAwNkYsIDB4MDA2QywgMHgwMDUwLCAweDAwNTAsIDB4MDA0RCwKKyAgICAweDAwNTYsIDB4MjIxNSwgMHgwMDZELCAweDAwNDEsIDB4MjIxNSwgMHgwMDZELCAweDAwMzEsIDB4MDAzMCwgMHg2NUU1LAorICAgIDB4MDAzMSwgMHgwMDMxLCAweDY1RTUsIDB4MDAzMSwgMHgwMDMyLCAweDY1RTUsIDB4MDAzMSwgMHgwMDMzLCAweDY1RTUsCisgICAgMHgwMDMxLCAweDAwMzQsIDB4NjVFNSwgMHgwMDMxLCAweDAwMzUsIDB4NjVFNSwgMHgwMDMxLCAweDAwMzYsIDB4NjVFNSwKKyAgICAweDAwMzEsIDB4MDAzNywgMHg2NUU1LCAweDAwMzEsIDB4MDAzOCwgMHg2NUU1LCAweDAwMzEsIDB4MDAzOSwgMHg2NUU1LAorICAgIDB4MDAzMiwgMHgwMDMwLCAweDY1RTUsIDB4MDAzMiwgMHgwMDMxLCAweDY1RTUsIDB4MDAzMiwgMHgwMDMyLCAweDY1RTUsCisgICAgMHgwMDMyLCAweDAwMzMsIDB4NjVFNSwgMHgwMDMyLCAweDAwMzQsIDB4NjVFNSwgMHgwMDMyLCAweDAwMzUsIDB4NjVFNSwKKyAgICAweDAwMzIsIDB4MDAzNiwgMHg2NUU1LCAweDAwMzIsIDB4MDAzNywgMHg2NUU1LCAweDAwMzIsIDB4MDAzOCwgMHg2NUU1LAorICAgIDB4MDAzMiwgMHgwMDM5LCAweDY1RTUsIDB4MDAzMywgMHgwMDMwLCAweDY1RTUsIDB4MDAzMywgMHgwMDMxLCAweDY1RTUsCisgICAgMHgwMDY3LCAweDAwNjEsIDB4MDA2QywgMHgwMDY2LCAweDAwNjYsIDB4MDA2OSwgMHgwMDY2LCAweDAwNjYsIDB4MDA2QywKKyAgICAweDA2NDAsIDB4MDY0RSwgMHgwNjUxLCAweDA2NDAsIDB4MDY0RiwgMHgwNjUxLCAweDA2NDAsIDB4MDY1MCwgMHgwNjUxLAorICAgIDB4MDYyQSwgMHgwNjJDLCAweDA2NDUsIDB4MDYyQSwgMHgwNjJELCAweDA2MkMsIDB4MDYyQSwgMHgwNjJELCAweDA2MkMsCisgICAgMHgwNjJBLCAweDA2MkQsIDB4MDY0NSwgMHgwNjJBLCAweDA2MkUsIDB4MDY0NSwgMHgwNjJBLCAweDA2NDUsIDB4MDYyQywKKyAgICAweDA2MkEsIDB4MDY0NSwgMHgwNjJELCAweDA2MkEsIDB4MDY0NSwgMHgwNjJFLCAweDA2MkMsIDB4MDY0NSwgMHgwNjJELAorICAgIDB4MDYyQywgMHgwNjQ1LCAweDA2MkQsIDB4MDYyRCwgMHgwNjQ1LCAweDA2NEEsIDB4MDYyRCwgMHgwNjQ1LCAweDA2NDksCisgICAgMHgwNjMzLCAweDA2MkQsIDB4MDYyQywgMHgwNjMzLCAweDA2MkMsIDB4MDYyRCwgMHgwNjMzLCAweDA2MkMsIDB4MDY0OSwKKyAgICAweDA2MzMsIDB4MDY0NSwgMHgwNjJELCAweDA2MzMsIDB4MDY0NSwgMHgwNjJELCAweDA2MzMsIDB4MDY0NSwgMHgwNjJDLAorICAgIDB4MDYzMywgMHgwNjQ1LCAweDA2NDUsIDB4MDYzMywgMHgwNjQ1LCAweDA2NDUsIDB4MDYzNSwgMHgwNjJELCAweDA2MkQsCisgICAgMHgwNjM1LCAweDA2MkQsIDB4MDYyRCwgMHgwNjM1LCAweDA2NDUsIDB4MDY0NSwgMHgwNjM0LCAweDA2MkQsIDB4MDY0NSwKKyAgICAweDA2MzQsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MzQsIDB4MDYyQywgMHgwNjRBLCAweDA2MzQsIDB4MDY0NSwgMHgwNjJFLAorICAgIDB4MDYzNCwgMHgwNjQ1LCAweDA2MkUsIDB4MDYzNCwgMHgwNjQ1LCAweDA2NDUsIDB4MDYzNCwgMHgwNjQ1LCAweDA2NDUsCisgICAgMHgwNjM2LCAweDA2MkQsIDB4MDY0OSwgMHgwNjM2LCAweDA2MkUsIDB4MDY0NSwgMHgwNjM2LCAweDA2MkUsIDB4MDY0NSwKKyAgICAweDA2MzcsIDB4MDY0NSwgMHgwNjJELCAweDA2MzcsIDB4MDY0NSwgMHgwNjJELCAweDA2MzcsIDB4MDY0NSwgMHgwNjQ1LAorICAgIDB4MDYzNywgMHgwNjQ1LCAweDA2NEEsIDB4MDYzOSwgMHgwNjJDLCAweDA2NDUsIDB4MDYzOSwgMHgwNjQ1LCAweDA2NDUsCisgICAgMHgwNjM5LCAweDA2NDUsIDB4MDY0NSwgMHgwNjM5LCAweDA2NDUsIDB4MDY0OSwgMHgwNjNBLCAweDA2NDUsIDB4MDY0NSwKKyAgICAweDA2M0EsIDB4MDY0NSwgMHgwNjRBLCAweDA2M0EsIDB4MDY0NSwgMHgwNjQ5LCAweDA2NDEsIDB4MDYyRSwgMHgwNjQ1LAorICAgIDB4MDY0MSwgMHgwNjJFLCAweDA2NDUsIDB4MDY0MiwgMHgwNjQ1LCAweDA2MkQsIDB4MDY0MiwgMHgwNjQ1LCAweDA2NDUsCisgICAgMHgwNjQ0LCAweDA2MkQsIDB4MDY0NSwgMHgwNjQ0LCAweDA2MkQsIDB4MDY0QSwgMHgwNjQ0LCAweDA2MkQsIDB4MDY0OSwKKyAgICAweDA2NDQsIDB4MDYyQywgMHgwNjJDLCAweDA2NDQsIDB4MDYyQywgMHgwNjJDLCAweDA2NDQsIDB4MDYyRSwgMHgwNjQ1LAorICAgIDB4MDY0NCwgMHgwNjJFLCAweDA2NDUsIDB4MDY0NCwgMHgwNjQ1LCAweDA2MkQsIDB4MDY0NCwgMHgwNjQ1LCAweDA2MkQsCisgICAgMHgwNjQ1LCAweDA2MkQsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkQsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MkQsIDB4MDY0QSwKKyAgICAweDA2NDUsIDB4MDYyQywgMHgwNjJELCAweDA2NDUsIDB4MDYyQywgMHgwNjQ1LCAweDA2NDUsIDB4MDYyRSwgMHgwNjJDLAorICAgIDB4MDY0NSwgMHgwNjJFLCAweDA2NDUsIDB4MDY0NSwgMHgwNjJDLCAweDA2MkUsIDB4MDY0NywgMHgwNjQ1LCAweDA2MkMsCisgICAgMHgwNjQ3LCAweDA2NDUsIDB4MDY0NSwgMHgwNjQ2LCAweDA2MkQsIDB4MDY0NSwgMHgwNjQ2LCAweDA2MkQsIDB4MDY0OSwKKyAgICAweDA2NDYsIDB4MDYyQywgMHgwNjQ1LCAweDA2NDYsIDB4MDYyQywgMHgwNjQ1LCAweDA2NDYsIDB4MDYyQywgMHgwNjQ5LAorICAgIDB4MDY0NiwgMHgwNjQ1LCAweDA2NEEsIDB4MDY0NiwgMHgwNjQ1LCAweDA2NDksIDB4MDY0QSwgMHgwNjQ1LCAweDA2NDUsCisgICAgMHgwNjRBLCAweDA2NDUsIDB4MDY0NSwgMHgwNjI4LCAweDA2MkUsIDB4MDY0QSwgMHgwNjJBLCAweDA2MkMsIDB4MDY0QSwKKyAgICAweDA2MkEsIDB4MDYyQywgMHgwNjQ5LCAweDA2MkEsIDB4MDYyRSwgMHgwNjRBLCAweDA2MkEsIDB4MDYyRSwgMHgwNjQ5LAorICAgIDB4MDYyQSwgMHgwNjQ1LCAweDA2NEEsIDB4MDYyQSwgMHgwNjQ1LCAweDA2NDksIDB4MDYyQywgMHgwNjQ1LCAweDA2NEEsCisgICAgMHgwNjJDLCAweDA2MkQsIDB4MDY0OSwgMHgwNjJDLCAweDA2NDUsIDB4MDY0OSwgMHgwNjMzLCAweDA2MkUsIDB4MDY0OSwKKyAgICAweDA2MzUsIDB4MDYyRCwgMHgwNjRBLCAweDA2MzQsIDB4MDYyRCwgMHgwNjRBLCAweDA2MzYsIDB4MDYyRCwgMHgwNjRBLAorICAgIDB4MDY0NCwgMHgwNjJDLCAweDA2NEEsIDB4MDY0NCwgMHgwNjQ1LCAweDA2NEEsIDB4MDY0QSwgMHgwNjJELCAweDA2NEEsCisgICAgMHgwNjRBLCAweDA2MkMsIDB4MDY0QSwgMHgwNjRBLCAweDA2NDUsIDB4MDY0QSwgMHgwNjQ1LCAweDA2NDUsIDB4MDY0QSwKKyAgICAweDA2NDIsIDB4MDY0NSwgMHgwNjRBLCAweDA2NDYsIDB4MDYyRCwgMHgwNjRBLCAweDA2NDIsIDB4MDY0NSwgMHgwNjJELAorICAgIDB4MDY0NCwgMHgwNjJELCAweDA2NDUsIDB4MDYzOSwgMHgwNjQ1LCAweDA2NEEsIDB4MDY0MywgMHgwNjQ1LCAweDA2NEEsCisgICAgMHgwNjQ2LCAweDA2MkMsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MkUsIDB4MDY0QSwgMHgwNjQ0LCAweDA2MkMsIDB4MDY0NSwKKyAgICAweDA2NDMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2NDQsIDB4MDYyQywgMHgwNjQ1LCAweDA2NDYsIDB4MDYyQywgMHgwNjJELAorICAgIDB4MDYyQywgMHgwNjJELCAweDA2NEEsIDB4MDYyRCwgMHgwNjJDLCAweDA2NEEsIDB4MDY0NSwgMHgwNjJDLCAweDA2NEEsCisgICAgMHgwNjQxLCAweDA2NDUsIDB4MDY0QSwgMHgwNjI4LCAweDA2MkQsIDB4MDY0QSwgMHgwNjQzLCAweDA2NDUsIDB4MDY0NSwKKyAgICAweDA2MzksIDB4MDYyQywgMHgwNjQ1LCAweDA2MzUsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzMsIDB4MDYyRSwgMHgwNjRBLAorICAgIDB4MDY0NiwgMHgwNjJDLCAweDA2NEEsIDB4MDYzNSwgMHgwNjQ0LCAweDA2RDIsIDB4MDY0MiwgMHgwNjQ0LCAweDA2RDIsCisgICAgMHgwNjM1LCAweDA2NDQsIDB4MDY0OX07CiBleHRlcm4gY29uc3QgRlhfV0NIQVIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDRbNDg4XSA9IHsKLSAgICAweDAwMDQsIDB4MjAzMiwgMHgyMDMyLCAweDIwMzIsIDB4MjAzMiwgMHgwMDA0LCAweDAwMzEsIDB4MDAyRiwgMHgwMDMxLCAweDAwMzAsIDB4MDAwNCwgMHgwMDU2LCAweDAwNDksIDB4MDA0OSwgMHgwMDQ5LCAweDAwMDQsCi0gICAgMHgwMDc2LCAweDAwNjksIDB4MDA2OSwgMHgwMDY5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzAsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMSwgMHgwMDMxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LAotICAgIDB4MDAzMSwgMHgwMDMyLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDAwMzEsIDB4MDAzMywgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzQsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMSwKLSAgICAweDAwMzUsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMSwgMHgwMDM2LCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDAwMzEsIDB4MDAzNywgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzgsCi0gICAgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzksIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMiwgMHgwMDMwLCAweDAwMjksIDB4MDAwNCwgMHgyMjJCLCAweDIyMkIsIDB4MjIyQiwgMHgyMjJCLAotICAgIDB4MDAwNCwgMHgwMDI4LCAweDExMDAsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTAyLCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTEwMywgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwKLSAgICAweDAwMjgsIDB4MTEwNSwgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMDYsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTA3LCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsCi0gICAgMHgxMTA5LCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTEwQiwgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMEMsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTBFLAotICAgIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTBGLCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTExMCwgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMTEsIDB4MTE2MSwKLSAgICAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMTIsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTBDLCAweDExNkUsIDB4MDAyOSwgMHgwMDA3LCAweDAwMjgsIDB4MTEwQiwgMHgxMTY5LCAweDExMEMsCi0gICAgMHgxMTY1LCAweDExQUIsIDB4MDAyOSwgMHgwMDA2LCAweDAwMjgsIDB4MTEwQiwgMHgxMTY5LCAweDExMTIsIDB4MTE2RSwgMHgwMDI5LCAweDAwMDUsIDB4MTEwRSwgMHgxMTYxLCAweDExQjcsIDB4MTEwMCwgMHgxMTY5LAotICAgIDB4MDAwNCwgMHgxMTBDLCAweDExNkUsIDB4MTEwQiwgMHgxMTc0LCAweDAwMDQsIDB4MzBBMiwgMHgzMEQxLCAweDMwRkMsIDB4MzBDOCwgMHgwMDA0LCAweDMwQTIsIDB4MzBFQiwgMHgzMEQ1LCAweDMwQTEsIDB4MDAwNCwKLSAgICAweDMwQTIsIDB4MzBGMywgMHgzMERBLCAweDMwQTIsIDB4MDAwNCwgMHgzMEE0LCAweDMwQ0IsIDB4MzBGMywgMHgzMEIwLCAweDAwMDUsIDB4MzBBOCwgMHgzMEI5LCAweDMwQUYsIDB4MzBGQywgMHgzMEM5LCAweDAwMDQsCi0gICAgMHgzMEE4LCAweDMwRkMsIDB4MzBBQiwgMHgzMEZDLCAweDAwMDQsIDB4MzBBQiwgMHgzMEU5LCAweDMwQzMsIDB4MzBDOCwgMHgwMDA0LCAweDMwQUIsIDB4MzBFRCwgMHgzMEVBLCAweDMwRkMsIDB4MDAwNCwgMHgzMEFELAotICAgIDB4MzBFNSwgMHgzMEVBLCAweDMwRkMsIDB4MDAwNCwgMHgzMEFFLCAweDMwRUIsIDB4MzBDMCwgMHgzMEZDLCAweDAwMDUsIDB4MzBBRCwgMHgzMEVELCAweDMwQjAsIDB4MzBFOSwgMHgzMEUwLCAweDAwMDYsIDB4MzBBRCwKLSAgICAweDMwRUQsIDB4MzBFMSwgMHgzMEZDLCAweDMwQzgsIDB4MzBFQiwgMHgwMDA1LCAweDMwQUQsIDB4MzBFRCwgMHgzMEVGLCAweDMwQzMsIDB4MzBDOCwgMHgwMDA1LCAweDMwQjAsIDB4MzBFOSwgMHgzMEUwLCAweDMwQzgsCi0gICAgMHgzMEYzLCAweDAwMDUsIDB4MzBBRiwgMHgzMEVCLCAweDMwQkMsIDB4MzBBNCwgMHgzMEVELCAweDAwMDQsIDB4MzBBRiwgMHgzMEVELCAweDMwRkMsIDB4MzBDRCwgMHgwMDA0LCAweDMwQjUsIDB4MzBBNCwgMHgzMEFGLAotICAgIDB4MzBFQiwgMHgwMDA1LCAweDMwQjUsIDB4MzBGMywgMHgzMEMxLCAweDMwRkMsIDB4MzBFMCwgMHgwMDA0LCAweDMwQjcsIDB4MzBFQSwgMHgzMEYzLCAweDMwQjAsIDB4MDAwNSwgMHgzMEQxLCAweDMwRkMsIDB4MzBCQiwKLSAgICAweDMwRjMsIDB4MzBDOCwgMHgwMDA0LCAweDMwRDAsIDB4MzBGQywgMHgzMEVDLCAweDMwRUIsIDB4MDAwNSwgMHgzMEQ0LCAweDMwQTIsIDB4MzBCOSwgMHgzMEM4LCAweDMwRUIsIDB4MDAwNSwgMHgzMEQ1LCAweDMwQTEsCi0gICAgMHgzMEU5LCAweDMwQzMsIDB4MzBDOSwgMHgwMDA0LCAweDMwRDUsIDB4MzBBMywgMHgzMEZDLCAweDMwQzgsIDB4MDAwNSwgMHgzMEQ2LCAweDMwQzMsIDB4MzBCNywgMHgzMEE3LCAweDMwRUIsIDB4MDAwNSwgMHgzMEQ4LAotICAgIDB4MzBBRiwgMHgzMEJGLCAweDMwRkMsIDB4MzBFQiwgMHgwMDA0LCAweDMwREQsIDB4MzBBNCwgMHgzMEYzLCAweDMwQzgsIDB4MDAwNCwgMHgzMERFLCAweDMwQTQsIDB4MzBBRiwgMHgzMEVELCAweDAwMDUsIDB4MzBERSwKLSAgICAweDMwRjMsIDB4MzBCNywgMHgzMEU3LCAweDMwRjMsIDB4MDAwNCwgMHgzMERGLCAweDMwQUYsIDB4MzBFRCwgMHgzMEYzLCAweDAwMDUsIDB4MzBERiwgMHgzMEVBLCAweDMwRDAsIDB4MzBGQywgMHgzMEVCLCAweDAwMDQsCi0gICAgMHgzMEUxLCAweDMwQUMsIDB4MzBDOCwgMHgzMEYzLCAweDAwMDQsIDB4MzBFMSwgMHgzMEZDLCAweDMwQzgsIDB4MzBFQiwgMHgwMDA0LCAweDMwRUEsIDB4MzBDMywgMHgzMEM4LCAweDMwRUIsIDB4MDAwNCwgMHgzMEVCLAotICAgIDB4MzBGQywgMHgzMEQ2LCAweDMwRUIsIDB4MDAwNSwgMHgzMEVDLCAweDMwRjMsIDB4MzBDOCwgMHgzMEIyLCAweDMwRjMsIDB4MDAwNCwgMHg2ODJBLCAweDVGMEYsIDB4NEYxQSwgMHg3OTNFLCAweDAwMDQsIDB4MDA2QiwKLSAgICAweDAwNjMsIDB4MDA2MSwgMHgwMDZDLCAweDAwMDQsIDB4MDA2RCwgMHgyMjE1LCAweDAwNzMsIDB4MDBCMiwgMHgwMDA1LCAweDAwNzIsIDB4MDA2MSwgMHgwMDY0LCAweDIyMTUsIDB4MDA3MywgMHgwMDA2LCAweDAwNzIsCi0gICAgMHgwMDYxLCAweDAwNjQsIDB4MjIxNSwgMHgwMDczLCAweDAwQjIsIDB4MDAwNCwgMHgwMDYxLCAweDAwMkUsIDB4MDA2RCwgMHgwMDJFLCAweDAwMDQsIDB4MDA0MywgMHgyMjE1LCAweDAwNkIsIDB4MDA2NywgMHgwMDA0LAotICAgIDB4MDA3MCwgMHgwMDJFLCAweDAwNkQsIDB4MDAyRSwgMHgwMDA0LCAweDA2MjcsIDB4MDY0NCwgMHgwNjQ0LCAweDA2NDcsIDB4MDAwNCwgMHgwNjI3LCAweDA2NDMsIDB4MDYyOCwgMHgwNjMxLCAweDAwMDQsIDB4MDY0NSwKLSAgICAweDA2MkQsIDB4MDY0NSwgMHgwNjJGLCAweDAwMDQsIDB4MDYzNSwgMHgwNjQ0LCAweDA2MzksIDB4MDY0NSwgMHgwMDA0LCAweDA2MzEsIDB4MDYzMywgMHgwNjQ4LCAweDA2NDQsIDB4MDAwNCwgMHgwNjM5LCAweDA2NDQsCi0gICAgMHgwNjRBLCAweDA2NDcsIDB4MDAwNCwgMHgwNjQ4LCAweDA2MzMsIDB4MDY0NCwgMHgwNjQ1LCAweDAwMTIsIDB4MDYzNSwgMHgwNjQ0LCAweDA2NDksIDB4MDAyMCwgMHgwNjI3LCAweDA2NDQsIDB4MDY0NCwgMHgwNjQ3LAotICAgIDB4MDAyMCwgMHgwNjM5LCAweDA2NDQsIDB4MDY0QSwgMHgwNjQ3LCAweDAwMjAsIDB4MDY0OCwgMHgwNjMzLCAweDA2NDQsIDB4MDY0NSwgMHgwMDA4LCAweDA2MkMsIDB4MDY0NCwgMHgwMDIwLCAweDA2MkMsIDB4MDY0NCwKLSAgICAweDA2MjcsIDB4MDY0NCwgMHgwNjQ3LCAweDAwMDQsIDB4MDYzMSwgMHgwNkNDLCAweDA2MjcsIDB4MDY0NAotfTsKKyAgICAweDAwMDQsIDB4MjAzMiwgMHgyMDMyLCAweDIwMzIsIDB4MjAzMiwgMHgwMDA0LCAweDAwMzEsIDB4MDAyRiwgMHgwMDMxLAorICAgIDB4MDAzMCwgMHgwMDA0LCAweDAwNTYsIDB4MDA0OSwgMHgwMDQ5LCAweDAwNDksIDB4MDAwNCwgMHgwMDc2LCAweDAwNjksCisgICAgMHgwMDY5LCAweDAwNjksIDB4MDAwNCwgMHgwMDI4LCAweDAwMzEsIDB4MDAzMCwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwKKyAgICAweDAwMzEsIDB4MDAzMSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzIsIDB4MDAyOSwgMHgwMDA0LAorICAgIDB4MDAyOCwgMHgwMDMxLCAweDAwMzMsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMSwgMHgwMDM0LCAweDAwMjksCisgICAgMHgwMDA0LCAweDAwMjgsIDB4MDAzMSwgMHgwMDM1LCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDAwMzEsIDB4MDAzNiwKKyAgICAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDAwMzEsIDB4MDAzNywgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLAorICAgIDB4MDAzOCwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzksIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsCisgICAgMHgwMDMyLCAweDAwMzAsIDB4MDAyOSwgMHgwMDA0LCAweDIyMkIsIDB4MjIyQiwgMHgyMjJCLCAweDIyMkIsIDB4MDAwNCwKKyAgICAweDAwMjgsIDB4MTEwMCwgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMDIsIDB4MTE2MSwgMHgwMDI5LAorICAgIDB4MDAwNCwgMHgwMDI4LCAweDExMDMsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTA1LCAweDExNjEsCisgICAgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTA2LCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTEwNywKKyAgICAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTEwOSwgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LAorICAgIDB4MTEwQiwgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMEMsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsCisgICAgMHgwMDI4LCAweDExMEUsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTBGLCAweDExNjEsIDB4MDAyOSwKKyAgICAweDAwMDQsIDB4MDAyOCwgMHgxMTEwLCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTExMSwgMHgxMTYxLAorICAgIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTExMiwgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMEMsCisgICAgMHgxMTZFLCAweDAwMjksIDB4MDAwNywgMHgwMDI4LCAweDExMEIsIDB4MTE2OSwgMHgxMTBDLCAweDExNjUsIDB4MTFBQiwKKyAgICAweDAwMjksIDB4MDAwNiwgMHgwMDI4LCAweDExMEIsIDB4MTE2OSwgMHgxMTEyLCAweDExNkUsIDB4MDAyOSwgMHgwMDA1LAorICAgIDB4MTEwRSwgMHgxMTYxLCAweDExQjcsIDB4MTEwMCwgMHgxMTY5LCAweDAwMDQsIDB4MTEwQywgMHgxMTZFLCAweDExMEIsCisgICAgMHgxMTc0LCAweDAwMDQsIDB4MzBBMiwgMHgzMEQxLCAweDMwRkMsIDB4MzBDOCwgMHgwMDA0LCAweDMwQTIsIDB4MzBFQiwKKyAgICAweDMwRDUsIDB4MzBBMSwgMHgwMDA0LCAweDMwQTIsIDB4MzBGMywgMHgzMERBLCAweDMwQTIsIDB4MDAwNCwgMHgzMEE0LAorICAgIDB4MzBDQiwgMHgzMEYzLCAweDMwQjAsIDB4MDAwNSwgMHgzMEE4LCAweDMwQjksIDB4MzBBRiwgMHgzMEZDLCAweDMwQzksCisgICAgMHgwMDA0LCAweDMwQTgsIDB4MzBGQywgMHgzMEFCLCAweDMwRkMsIDB4MDAwNCwgMHgzMEFCLCAweDMwRTksIDB4MzBDMywKKyAgICAweDMwQzgsIDB4MDAwNCwgMHgzMEFCLCAweDMwRUQsIDB4MzBFQSwgMHgzMEZDLCAweDAwMDQsIDB4MzBBRCwgMHgzMEU1LAorICAgIDB4MzBFQSwgMHgzMEZDLCAweDAwMDQsIDB4MzBBRSwgMHgzMEVCLCAweDMwQzAsIDB4MzBGQywgMHgwMDA1LCAweDMwQUQsCisgICAgMHgzMEVELCAweDMwQjAsIDB4MzBFOSwgMHgzMEUwLCAweDAwMDYsIDB4MzBBRCwgMHgzMEVELCAweDMwRTEsIDB4MzBGQywKKyAgICAweDMwQzgsIDB4MzBFQiwgMHgwMDA1LCAweDMwQUQsIDB4MzBFRCwgMHgzMEVGLCAweDMwQzMsIDB4MzBDOCwgMHgwMDA1LAorICAgIDB4MzBCMCwgMHgzMEU5LCAweDMwRTAsIDB4MzBDOCwgMHgzMEYzLCAweDAwMDUsIDB4MzBBRiwgMHgzMEVCLCAweDMwQkMsCisgICAgMHgzMEE0LCAweDMwRUQsIDB4MDAwNCwgMHgzMEFGLCAweDMwRUQsIDB4MzBGQywgMHgzMENELCAweDAwMDQsIDB4MzBCNSwKKyAgICAweDMwQTQsIDB4MzBBRiwgMHgzMEVCLCAweDAwMDUsIDB4MzBCNSwgMHgzMEYzLCAweDMwQzEsIDB4MzBGQywgMHgzMEUwLAorICAgIDB4MDAwNCwgMHgzMEI3LCAweDMwRUEsIDB4MzBGMywgMHgzMEIwLCAweDAwMDUsIDB4MzBEMSwgMHgzMEZDLCAweDMwQkIsCisgICAgMHgzMEYzLCAweDMwQzgsIDB4MDAwNCwgMHgzMEQwLCAweDMwRkMsIDB4MzBFQywgMHgzMEVCLCAweDAwMDUsIDB4MzBENCwKKyAgICAweDMwQTIsIDB4MzBCOSwgMHgzMEM4LCAweDMwRUIsIDB4MDAwNSwgMHgzMEQ1LCAweDMwQTEsIDB4MzBFOSwgMHgzMEMzLAorICAgIDB4MzBDOSwgMHgwMDA0LCAweDMwRDUsIDB4MzBBMywgMHgzMEZDLCAweDMwQzgsIDB4MDAwNSwgMHgzMEQ2LCAweDMwQzMsCisgICAgMHgzMEI3LCAweDMwQTcsIDB4MzBFQiwgMHgwMDA1LCAweDMwRDgsIDB4MzBBRiwgMHgzMEJGLCAweDMwRkMsIDB4MzBFQiwKKyAgICAweDAwMDQsIDB4MzBERCwgMHgzMEE0LCAweDMwRjMsIDB4MzBDOCwgMHgwMDA0LCAweDMwREUsIDB4MzBBNCwgMHgzMEFGLAorICAgIDB4MzBFRCwgMHgwMDA1LCAweDMwREUsIDB4MzBGMywgMHgzMEI3LCAweDMwRTcsIDB4MzBGMywgMHgwMDA0LCAweDMwREYsCisgICAgMHgzMEFGLCAweDMwRUQsIDB4MzBGMywgMHgwMDA1LCAweDMwREYsIDB4MzBFQSwgMHgzMEQwLCAweDMwRkMsIDB4MzBFQiwKKyAgICAweDAwMDQsIDB4MzBFMSwgMHgzMEFDLCAweDMwQzgsIDB4MzBGMywgMHgwMDA0LCAweDMwRTEsIDB4MzBGQywgMHgzMEM4LAorICAgIDB4MzBFQiwgMHgwMDA0LCAweDMwRUEsIDB4MzBDMywgMHgzMEM4LCAweDMwRUIsIDB4MDAwNCwgMHgzMEVCLCAweDMwRkMsCisgICAgMHgzMEQ2LCAweDMwRUIsIDB4MDAwNSwgMHgzMEVDLCAweDMwRjMsIDB4MzBDOCwgMHgzMEIyLCAweDMwRjMsIDB4MDAwNCwKKyAgICAweDY4MkEsIDB4NUYwRiwgMHg0RjFBLCAweDc5M0UsIDB4MDAwNCwgMHgwMDZCLCAweDAwNjMsIDB4MDA2MSwgMHgwMDZDLAorICAgIDB4MDAwNCwgMHgwMDZELCAweDIyMTUsIDB4MDA3MywgMHgwMEIyLCAweDAwMDUsIDB4MDA3MiwgMHgwMDYxLCAweDAwNjQsCisgICAgMHgyMjE1LCAweDAwNzMsIDB4MDAwNiwgMHgwMDcyLCAweDAwNjEsIDB4MDA2NCwgMHgyMjE1LCAweDAwNzMsIDB4MDBCMiwKKyAgICAweDAwMDQsIDB4MDA2MSwgMHgwMDJFLCAweDAwNkQsIDB4MDAyRSwgMHgwMDA0LCAweDAwNDMsIDB4MjIxNSwgMHgwMDZCLAorICAgIDB4MDA2NywgMHgwMDA0LCAweDAwNzAsIDB4MDAyRSwgMHgwMDZELCAweDAwMkUsIDB4MDAwNCwgMHgwNjI3LCAweDA2NDQsCisgICAgMHgwNjQ0LCAweDA2NDcsIDB4MDAwNCwgMHgwNjI3LCAweDA2NDMsIDB4MDYyOCwgMHgwNjMxLCAweDAwMDQsIDB4MDY0NSwKKyAgICAweDA2MkQsIDB4MDY0NSwgMHgwNjJGLCAweDAwMDQsIDB4MDYzNSwgMHgwNjQ0LCAweDA2MzksIDB4MDY0NSwgMHgwMDA0LAorICAgIDB4MDYzMSwgMHgwNjMzLCAweDA2NDgsIDB4MDY0NCwgMHgwMDA0LCAweDA2MzksIDB4MDY0NCwgMHgwNjRBLCAweDA2NDcsCisgICAgMHgwMDA0LCAweDA2NDgsIDB4MDYzMywgMHgwNjQ0LCAweDA2NDUsIDB4MDAxMiwgMHgwNjM1LCAweDA2NDQsIDB4MDY0OSwKKyAgICAweDAwMjAsIDB4MDYyNywgMHgwNjQ0LCAweDA2NDQsIDB4MDY0NywgMHgwMDIwLCAweDA2MzksIDB4MDY0NCwgMHgwNjRBLAorICAgIDB4MDY0NywgMHgwMDIwLCAweDA2NDgsIDB4MDYzMywgMHgwNjQ0LCAweDA2NDUsIDB4MDAwOCwgMHgwNjJDLCAweDA2NDQsCisgICAgMHgwMDIwLCAweDA2MkMsIDB4MDY0NCwgMHgwNjI3LCAweDA2NDQsIDB4MDY0NywgMHgwMDA0LCAweDA2MzEsIDB4MDZDQywKKyAgICAweDA2MjcsIDB4MDY0NH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaAppbmRleCBhMTQ0NWE1Li5hZWQyNGQ4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgKQEAgLTE0LDM3MyArMTQsNDY4IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCiAjaW5jbHVkZSAiLi4vamJpZzIvSkJpZzJfQ29udGV4dC5oIgogCi1jbGFzcyBDQ29kZWNfQmFzaWNNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0Jhc2ljTW9kdWxlCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBGWF9CT09MCVJ1bkxlbmd0aEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCUE4NUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgdWludDhfdComIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci0gICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVSdW5MZW5ndGhEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjKTsKK2NsYXNzIENDb2RlY19CYXNpY01vZHVsZSA6IHB1YmxpYyBJQ29kZWNfQmFzaWNNb2R1bGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCBGWF9CT09MIFJ1bkxlbmd0aEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKKyAgdmlydHVhbCBGWF9CT09MIEE4NUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKKyAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBDcmVhdGVSdW5MZW5ndGhEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwYyk7CiB9Owogc3RydWN0IENDb2RlY19JbWFnZURhdGFDYWNoZSB7Ci0gICAgaW50CQkJbV9XaWR0aCwgbV9IZWlnaHQ7Ci0gICAgaW50CQkJbV9uQ2FjaGVkTGluZXM7Ci0gICAgdWludDhfdAkJbV9EYXRhOworICBpbnQgbV9XaWR0aCwgbV9IZWlnaHQ7CisgIGludCBtX25DYWNoZWRMaW5lczsKKyAgdWludDhfdCBtX0RhdGE7CiB9OwotY2xhc3MgQ0NvZGVjX1NjYW5saW5lRGVjb2RlciA6IHB1YmxpYyBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyCi17Ci1wdWJsaWM6CitjbGFzcyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyIDogcHVibGljIElDb2RlY19TY2FubGluZURlY29kZXIgeworIHB1YmxpYzoKKyAgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcigpOwogCi0gICAgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcigpOworICB2aXJ0dWFsIH5DQ29kZWNfU2NhbmxpbmVEZWNvZGVyKCk7CiAKLSAgICB2aXJ0dWFsIH5DQ29kZWNfU2NhbmxpbmVEZWNvZGVyKCk7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0U3JjT2Zmc2V0KCkgeyByZXR1cm4gLTE7IH0KIAotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3JjT2Zmc2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgdmlydHVhbCB2b2lkIERvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KTsKKworICB1aW50OF90KiBHZXRTY2FubGluZShpbnQgbGluZSk7CisKKyAgRlhfQk9PTCBTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworCisgIGludCBHZXRXaWR0aCgpIHsgcmV0dXJuIG1fT3V0cHV0V2lkdGg7IH0KKworICBpbnQgR2V0SGVpZ2h0KCkgeyByZXR1cm4gbV9PdXRwdXRIZWlnaHQ7IH0KKworICBpbnQgQ291bnRDb21wcygpIHsgcmV0dXJuIG1fbkNvbXBzOyB9CisKKyAgaW50IEdldEJQQygpIHsgcmV0dXJuIG1fYnBjOyB9CisKKyAgRlhfQk9PTCBJc0NvbG9yVHJhbnNmb3JtZWQoKSB7IHJldHVybiBtX2JDb2xvclRyYW5zZm9ybWVkOyB9CisKKyAgdm9pZCBDbGVhckltYWdlRGF0YSgpIHsKKyAgICBpZiAobV9wRGF0YUNhY2hlKSB7CisgICAgICBGWF9GcmVlKG1fcERhdGFDYWNoZSk7CiAgICAgfQorICAgIG1fcERhdGFDYWNoZSA9IE5VTEw7CisgIH0KIAotICAgIHZpcnR1YWwgdm9pZAkJRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpOworIHByb3RlY3RlZDoKKyAgaW50IG1fT3JpZ1dpZHRoOwogCi0gICAgdWludDhfdCoJCQlHZXRTY2FubGluZShpbnQgbGluZSk7CisgIGludCBtX09yaWdIZWlnaHQ7CiAKLSAgICBGWF9CT09MCQkJCVNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludCBtX0Rvd25TY2FsZTsKIAotICAgIGludAkJCQkJR2V0V2lkdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fT3V0cHV0V2lkdGg7Ci0gICAgfQorICBpbnQgbV9PdXRwdXRXaWR0aDsKIAotICAgIGludAkJCQkJR2V0SGVpZ2h0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX091dHB1dEhlaWdodDsKLSAgICB9CisgIGludCBtX091dHB1dEhlaWdodDsKIAotICAgIGludAkJCQkJQ291bnRDb21wcygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9uQ29tcHM7Ci0gICAgfQorICBpbnQgbV9uQ29tcHM7CiAKLSAgICBpbnQJCQkJCUdldEJQQygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9icGM7Ci0gICAgfQorICBpbnQgbV9icGM7CiAKLSAgICBGWF9CT09MCQkJCUlzQ29sb3JUcmFuc2Zvcm1lZCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9iQ29sb3JUcmFuc2Zvcm1lZDsKLSAgICB9CisgIGludCBtX1BpdGNoOwogCi0gICAgdm9pZAkJCQlDbGVhckltYWdlRGF0YSgpCi0gICAgewotICAgICAgICBpZiAobV9wRGF0YUNhY2hlKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcERhdGFDYWNoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGF0YUNhY2hlID0gTlVMTDsKLSAgICB9Ci1wcm90ZWN0ZWQ6CisgIEZYX0JPT0wgbV9iQ29sb3JUcmFuc2Zvcm1lZDsKIAotICAgIGludAkJCQkJbV9PcmlnV2lkdGg7CisgIHVpbnQ4X3QqIFJlYWROZXh0TGluZSgpOwogCi0gICAgaW50CQkJCQltX09yaWdIZWlnaHQ7CisgIHZpcnR1YWwgRlhfQk9PTCB2X1Jld2luZCgpID0gMDsKIAotICAgIGludAkJCQkJbV9Eb3duU2NhbGU7CisgIHZpcnR1YWwgdWludDhfdCogdl9HZXROZXh0TGluZSgpID0gMDsKIAotICAgIGludAkJCQkJbV9PdXRwdXRXaWR0aDsKKyAgdmlydHVhbCB2b2lkIHZfRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpID0gMDsKIAotICAgIGludAkJCQkJbV9PdXRwdXRIZWlnaHQ7CisgIGludCBtX05leHRMaW5lOwogCi0gICAgaW50CQkJCQltX25Db21wczsKKyAgdWludDhfdCogbV9wTGFzdFNjYW5saW5lOwogCi0gICAgaW50CQkJCQltX2JwYzsKLQotICAgIGludAkJCQkJbV9QaXRjaDsKLQotICAgIEZYX0JPT0wJCQkJbV9iQ29sb3JUcmFuc2Zvcm1lZDsKLQotICAgIHVpbnQ4X3QqCQkJUmVhZE5leHRMaW5lKCk7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfUmV3aW5kKCkgPSAwOwotCi0gICAgdmlydHVhbCB1aW50OF90Kgl2X0dldE5leHRMaW5lKCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkCQl2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSA9IDA7Ci0KLSAgICBpbnQJCQkJCW1fTmV4dExpbmU7Ci0KLSAgICB1aW50OF90KgkJCW1fcExhc3RTY2FubGluZTsKLQotICAgIENDb2RlY19JbWFnZURhdGFDYWNoZSoJbV9wRGF0YUNhY2hlOworICBDQ29kZWNfSW1hZ2VEYXRhQ2FjaGUqIG1fcERhdGFDYWNoZTsKIH07Ci1jbGFzcyBDQ29kZWNfRmF4TW9kdWxlIDogcHVibGljIElDb2RlY19GYXhNb2R1bGUKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgIGludCBLLCBGWF9CT09MIEVuZE9mTGluZSwgRlhfQk9PTCBFbmNvZGVkQnl0ZUFsaWduLCBGWF9CT09MIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpOwotICAgIEZYX0JPT0wJCUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKK2NsYXNzIENDb2RlY19GYXhNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0ZheE1vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqIENyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBFbmRPZkxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEJsYWNrSXMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgUm93cyk7CisgIEZYX0JPT0wgRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgaW50IHBpdGNoLAorICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpOwogfTsKLWNsYXNzIENDb2RlY19GbGF0ZU1vZHVsZSA6IHB1YmxpYyBJQ29kZWNfRmxhdGVNb2R1bGUKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgIGludCBuQ29tcHMsIGludCBicGMsIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucyk7Ci0gICAgdmlydHVhbCBGWF9EV09SRCBGbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOworY2xhc3MgQ0NvZGVjX0ZsYXRlTW9kdWxlIDogcHVibGljIElDb2RlY19GbGF0ZU1vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqIENyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zKTsKKyAgdmlydHVhbCBGWF9EV09SRCBGbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVhcmx5Q2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKKyAgdmlydHVhbCBGWF9CT09MIEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CiB9OwotY2xhc3MgQ0NvZGVjX0pwZWdNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0pwZWdNb2R1bGUKLXsKLXB1YmxpYzoKLSAgICBDQ29kZWNfSnBlZ01vZHVsZSgpIDogbV9wRXh0UHJvdmlkZXIoTlVMTCkge30KLSAgICB2b2lkIFNldFBvdmlkZXIoSUZYX0pwZWdQcm92aWRlciogcEpQKQotICAgIHsKLSAgICAgICAgbV9wRXh0UHJvdmlkZXIgPSBwSlA7Ci0gICAgfQotICAgIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pOwotICAgIEZYX0JPT0wJCUxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEKiBpY2NfbGVuZ3RoKTsKLSAgICBGWF9CT09MCQlFbmNvZGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5LCBjb25zdCB1aW50OF90KiBpY2NfYnVmLCBGWF9EV09SRCBpY2NfbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCgpOwotICAgIHZpcnR1YWwgdm9pZAkJRmluaXNoKHZvaWQqIHBDb250ZXh0KTsKLSAgICB2aXJ0dWFsIHZvaWQJCUlucHV0KHZvaWQqIHBDb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7Ci0gICAgdmlydHVhbCBpbnQJCQlSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBuQ29tcHMsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIGludAkJCVN0YXJ0U2NhbmxpbmUodm9pZCogcENvbnRleHQsIGludCBkb3duX3NjYWxlKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgdWludDhfdCogZGVzdF9idWYpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIpOwotcHJvdGVjdGVkOgotICAgIElGWF9KcGVnUHJvdmlkZXIqIG1fcEV4dFByb3ZpZGVyOworY2xhc3MgQ0NvZGVjX0pwZWdNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0pwZWdNb2R1bGUgeworIHB1YmxpYzoKKyAgQ0NvZGVjX0pwZWdNb2R1bGUoKSA6IG1fcEV4dFByb3ZpZGVyKE5VTEwpIHt9CisgIHZvaWQgU2V0UG92aWRlcihJRlhfSnBlZ1Byb3ZpZGVyKiBwSlApIHsgbV9wRXh0UHJvdmlkZXIgPSBwSlA7IH0KKyAgSUNvZGVjX1NjYW5saW5lRGVjb2RlciogQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSk7CisgIEZYX0JPT0wgTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgIGludCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90KiogaWNjX2J1Zl9wdHIsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGljY19sZW5ndGgpOworICBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGljY19idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGljY19sZW5ndGgpOworICB2aXJ0dWFsIHZvaWQqIFN0YXJ0KCk7CisgIHZpcnR1YWwgdm9pZCBGaW5pc2godm9pZCogcENvbnRleHQpOworICB2aXJ0dWFsIHZvaWQgSW5wdXQodm9pZCogcENvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKTsKKyAgdmlydHVhbCBpbnQgUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKTsKKyAgdmlydHVhbCBpbnQgU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpOworICB2aXJ0dWFsIEZYX0JPT0wgUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1Zik7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIpOworCisgcHJvdGVjdGVkOgorICBJRlhfSnBlZ1Byb3ZpZGVyKiBtX3BFeHRQcm92aWRlcjsKIH07CiAjZGVmaW5lIFBOR19FUlJPUl9TSVpFIDI1NgotY2xhc3MgQ0NvZGVjX1BuZ01vZHVsZSA6IHB1YmxpYyBJQ29kZWNfUG5nTW9kdWxlCi17Ci1wdWJsaWM6Ci0gICAgQ0NvZGVjX1BuZ01vZHVsZSgpCi0gICAgewotICAgICAgICBGWFNZU19tZW1zZXQobV9zekxhc3RFcnJvciwgJ1wwJywgUE5HX0VSUk9SX1NJWkUpOworY2xhc3MgQ0NvZGVjX1BuZ01vZHVsZSA6IHB1YmxpYyBJQ29kZWNfUG5nTW9kdWxlIHsKKyBwdWJsaWM6CisgIENDb2RlY19QbmdNb2R1bGUoKSB7IEZYU1lTX21lbXNldChtX3N6TGFzdEVycm9yLCAnXDAnLCBQTkdfRVJST1JfU0laRSk7IH0KKworICB2aXJ0dWFsIHZvaWQqIFN0YXJ0KHZvaWQqIHBNb2R1bGUpOworICB2aXJ0dWFsIHZvaWQgRmluaXNoKHZvaWQqIHBDb250ZXh0KTsKKyAgdmlydHVhbCBGWF9CT09MIElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIEZYX0NIQVIgbV9zekxhc3RFcnJvcltQTkdfRVJST1JfU0laRV07Cit9OworY2xhc3MgQ0NvZGVjX0dpZk1vZHVsZSA6IHB1YmxpYyBJQ29kZWNfR2lmTW9kdWxlIHsKKyBwdWJsaWM6CisgIENDb2RlY19HaWZNb2R1bGUoKSB7IEZYU1lTX21lbXNldChtX3N6TGFzdEVycm9yLCAnXDAnLCAyNTYpOyB9CisgIHZpcnR1YWwgdm9pZCogU3RhcnQodm9pZCogcE1vZHVsZSk7CisgIHZpcnR1YWwgdm9pZCBGaW5pc2godm9pZCogcENvbnRleHQpOworICB2aXJ0dWFsIEZYX0RXT1JEIEdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyKTsKKyAgdmlydHVhbCB2b2lkIElucHV0KHZvaWQqIHBDb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7CisKKyAgdmlydHVhbCBpbnQzMl90IFJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhbF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwYWxfcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYmdfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOworCisgIHZpcnR1YWwgaW50MzJfdCBMb2FkRnJhbWVJbmZvKHZvaWQqIHBDb250ZXh0LCBpbnQqIGZyYW1lX251bSk7CisKKyAgdmlydHVhbCBpbnQzMl90IExvYWRGcmFtZSh2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOworCisgcHJvdGVjdGVkOgorICBGWF9DSEFSIG1fc3pMYXN0RXJyb3JbMjU2XTsKK307CitjbGFzcyBDQ29kZWNfQm1wTW9kdWxlIDogcHVibGljIElDb2RlY19CbXBNb2R1bGUgeworIHB1YmxpYzoKKyAgQ0NvZGVjX0JtcE1vZHVsZSgpIHsgRlhTWVNfbWVtc2V0KG1fc3pMYXN0RXJyb3IsICdcMCcsIDI1Nik7IH0KKyAgdmlydHVhbCB2b2lkKiBTdGFydCh2b2lkKiBwTW9kdWxlKTsKKyAgdmlydHVhbCB2b2lkIEZpbmlzaCh2b2lkKiBwQ29udGV4dCk7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIpOworICB2aXJ0dWFsIHZvaWQgSW5wdXQodm9pZCogcENvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKTsKKyAgdmlydHVhbCBpbnQzMl90IFJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wqIHRiX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGNvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBhbF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiogcGFsX3BwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKTsKKyAgdmlydHVhbCBpbnQzMl90IExvYWRJbWFnZSh2b2lkKiBwQ29udGV4dCk7CisKKyBwcm90ZWN0ZWQ6CisgIEZYX0NIQVIgbV9zekxhc3RFcnJvclsyNTZdOworfTsKK2NsYXNzIENDb2RlY19JY2NNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0ljY01vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIEljY0NTIEdldFByb2ZpbGVDUyhjb25zdCB1aW50OF90KiBwUHJvZmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkd1Byb2ZpbGVTaXplKTsKKyAgdmlydHVhbCBJY2NDUyBHZXRQcm9maWxlQ1MoSUZYX0ZpbGVSZWFkKiBwRmlsZSk7CisgIHZpcnR1YWwgdm9pZCogQ3JlYXRlVHJhbnNmb3JtKAorICAgICAgSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBJbnB1dFBhcmFtLAorICAgICAgSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBPdXRwdXRQYXJhbSwKKyAgICAgIElDb2RlY19JY2NNb2R1bGU6OkljY1BhcmFtKiBwUHJvb2ZQYXJhbSA9IE5VTEwsCisgICAgICBGWF9EV09SRCBkd0ludGVudCA9IEljY19JTlRFTlRfUEVSQ0VQVFVBTCwKKyAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IEljY19GTEFHU19ERUZBVUxULAorICAgICAgRlhfRFdPUkQgZHdQcmZJbnRlbnQgPSBJY2NfSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQywKKyAgICAgIEZYX0RXT1JEIGR3UHJmRmxhZyA9IEljY19GTEFHU19TT0ZUUFJPT0ZJTkcpOworICB2aXJ0dWFsIHZvaWQqIENyZWF0ZVRyYW5zZm9ybV9zUkdCKGNvbnN0IHVpbnQ4X3QqIHBQcm9maWxlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1Byb2ZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5Db21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW50ZW50ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCk7CisgIHZpcnR1YWwgdm9pZCogQ3JlYXRlVHJhbnNmb3JtX0NNWUsoY29uc3QgdWludDhfdCogcFNyY1Byb2ZpbGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3JjUHJvZmlsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblNyY0NvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcERzdFByb2ZpbGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RHN0UHJvZmlsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnRlbnQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3JjRm9ybWF0ID0gSWNjX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RHN0Rm9ybWF0ID0gSWNjX0ZPUk1BVF9ERUZBVUxUKTsKKyAgdmlydHVhbCB2b2lkIERlc3Ryb3lUcmFuc2Zvcm0odm9pZCogcFRyYW5zZm9ybSk7CisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFNyY1ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcERlc3RWYWx1ZXMpOworICB2aXJ0dWFsIHZvaWQgVHJhbnNsYXRlU2NhbmxpbmUodm9pZCogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMpOworICB2aXJ0dWFsIHZvaWQgU2V0Q29tcG9uZW50cyhGWF9EV09SRCBuQ29tcG9uZW50cykgeworICAgIG1fbkNvbXBvbmVudHMgPSBuQ29tcG9uZW50czsKKyAgfQorICB2aXJ0dWFsIH5DQ29kZWNfSWNjTW9kdWxlKCk7CisKKyBwcm90ZWN0ZWQ6CisgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIgbV9NYXBUcmFuZm9ybTsKKyAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX01hcFByb2ZpbGU7CisgIEZYX0RXT1JEIG1fbkNvbXBvbmVudHM7CisgIHR5cGVkZWYgZW51bSB7CisgICAgSWNjX0NMQVNTX0lOUFVUID0gMCwKKyAgICBJY2NfQ0xBU1NfT1VUUFVULAorICAgIEljY19DTEFTU19QUk9PRiwKKyAgICBJY2NfQ0xBU1NfTUFYCisgIH0gSWNjX0NMQVNTOworICB2b2lkKiBDcmVhdGVQcm9maWxlKElDb2RlY19JY2NNb2R1bGU6OkljY1BhcmFtKiBwSWNjUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgSWNjX0NMQVNTIGljLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYqIHBUcmFuc2Zvcm1LZXkpOworfTsKK2NsYXNzIENDb2RlY19KcHhNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0pweE1vZHVsZSB7CisgcHVibGljOgorICBDQ29kZWNfSnB4TW9kdWxlKCk7CisgIHZvaWQqIENyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIHVzZUNvbG9yU3BhY2UgPSBGQUxTRSk7CisgIHZvaWQgR2V0SW1hZ2VJbmZvKHZvaWQqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgY29kZXN0cmVhbV9uQ29tcHMsCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBvdXRwdXRfbkNvbXBzKTsKKyAgRlhfQk9PTCBEZWNvZGUodm9pZCogY3R4LAorICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2RhdGEsCisgICAgICAgICAgICAgICAgIGludCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3IsCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9mZnNldHMpOworICB2b2lkIERlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCk7Cit9OworY2xhc3MgQ0NvZGVjX1RpZmZNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX1RpZmZNb2R1bGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkKiBDcmVhdGVEZWNvZGVyKElGWF9GaWxlUmVhZCogZmlsZV9wdHIpOworICB2aXJ0dWFsIHZvaWQgR2V0RnJhbWVzKHZvaWQqIGN0eCwgaW50MzJfdCYgZnJhbWVzKTsKKyAgdmlydHVhbCBGWF9CT09MIExvYWRGcmFtZUluZm8odm9pZCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGJwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSA9IE5VTEwpOworICB2aXJ0dWFsIEZYX0JPT0wgRGVjb2RlKHZvaWQqIGN0eCwgY2xhc3MgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApOworICB2aXJ0dWFsIHZvaWQgRGVzdHJveURlY29kZXIodm9pZCogY3R4KTsKK307CitjbGFzcyBDUERGX0piaWcySW50ZXJmYWNlIDogcHVibGljIENKQmlnMl9Nb2R1bGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkKiBKQmlnMl9NYWxsb2MoRlhfRFdPUkQgZHdTaXplKSB7CisgICAgcmV0dXJuIEZYX0FsbG9jKHVpbnQ4X3QsIGR3U2l6ZSk7CisgIH0KKyAgdmlydHVhbCB2b2lkKiBKQmlnMl9NYWxsb2MyKEZYX0RXT1JEIG51bSwgRlhfRFdPUkQgZHdTaXplKSB7CisgICAgaWYgKGR3U2l6ZSAmJiBudW0gPj0gVUlOVF9NQVggLyBkd1NpemUpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCoJCVN0YXJ0KHZvaWQqIHBNb2R1bGUpOwotICAgIHZpcnR1YWwgdm9pZAkJRmluaXNoKHZvaWQqIHBDb250ZXh0KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlucHV0KHZvaWQqIHBDb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSk7Ci1wcm90ZWN0ZWQ6Ci0gICAgRlhfQ0hBUgkJCQltX3N6TGFzdEVycm9yW1BOR19FUlJPUl9TSVpFXTsKLX07Ci1jbGFzcyBDQ29kZWNfR2lmTW9kdWxlIDogcHVibGljIElDb2RlY19HaWZNb2R1bGUKLXsKLXB1YmxpYzoKLSAgICBDQ29kZWNfR2lmTW9kdWxlKCkKLSAgICB7Ci0gICAgICAgIEZYU1lTX21lbXNldChtX3N6TGFzdEVycm9yLCAnXDAnLCAyNTYpOworICAgIHJldHVybiBGWF9BbGxvYyh1aW50OF90LCBudW0gKiBkd1NpemUpOworICB9CisgIHZpcnR1YWwgdm9pZCogSkJpZzJfTWFsbG9jMyhGWF9EV09SRCBudW0sIEZYX0RXT1JEIGR3U2l6ZSwgRlhfRFdPUkQgZHdTaXplMikgeworICAgIGlmIChkd1NpemUyICYmIGR3U2l6ZSA+PSBVSU5UX01BWCAvIGR3U2l6ZTIpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCh2b2lkKiBwTW9kdWxlKTsKLSAgICB2aXJ0dWFsIHZvaWQJCUZpbmlzaCh2b2lkKiBwQ29udGV4dCk7Ci0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiogYXZhaWxfYnVmX3B0cik7Ci0gICAgdmlydHVhbCB2b2lkCQlJbnB1dCh2b2lkKiBwQ29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpOwotCi0gICAgdmlydHVhbCBpbnQzMl90CVJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsIGludCogd2lkdGgsIGludCogaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhbF9udW0sIHZvaWQqKiBwYWxfcHAsIGludCogYmdfaW5kZXgsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOwotCi0gICAgdmlydHVhbCBpbnQzMl90CUxvYWRGcmFtZUluZm8odm9pZCogcENvbnRleHQsIGludCogZnJhbWVfbnVtKTsKLQotICAgIHZpcnR1YWwgaW50MzJfdAlMb2FkRnJhbWUodm9pZCogcENvbnRleHQsIGludCBmcmFtZV9udW0sIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgRlhfQ0hBUgkJCQltX3N6TGFzdEVycm9yWzI1Nl07Ci19OwotY2xhc3MgQ0NvZGVjX0JtcE1vZHVsZSA6IHB1YmxpYyBJQ29kZWNfQm1wTW9kdWxlCi17Ci1wdWJsaWM6Ci0gICAgQ0NvZGVjX0JtcE1vZHVsZSgpCi0gICAgewotICAgICAgICBGWFNZU19tZW1zZXQobV9zekxhc3RFcnJvciwgJ1wwJywgMjU2KTsKKyAgICBGWF9EV09SRCBzaXplID0gZHdTaXplMiAqIGR3U2l6ZTsKKyAgICBpZiAoc2l6ZSAmJiBudW0gPj0gVUlOVF9NQVggLyBzaXplKSB7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkKgkJU3RhcnQodm9pZCogcE1vZHVsZSk7Ci0gICAgdmlydHVhbCB2b2lkCQlGaW5pc2godm9pZCogcENvbnRleHQpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIpOwotICAgIHZpcnR1YWwgdm9pZAkJSW5wdXQodm9pZCogcENvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKTsKLSAgICB2aXJ0dWFsIGludDMyX3QJUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwgaW50MzJfdCogd2lkdGgsIGludDMyX3QqIGhlaWdodCwgRlhfQk9PTCogdGJfZmxhZywgaW50MzJfdCogY29tcG9uZW50cywgaW50MzJfdCogcGFsX251bSwgRlhfRFdPUkQqKiBwYWxfcHAsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOwotICAgIHZpcnR1YWwgaW50MzJfdAlMb2FkSW1hZ2Uodm9pZCogcENvbnRleHQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgRlhfQ0hBUgkJCQltX3N6TGFzdEVycm9yWzI1Nl07CisgICAgcmV0dXJuIEZYX0FsbG9jKHVpbnQ4X3QsIG51bSAqIHNpemUpOworICB9CisgIHZpcnR1YWwgdm9pZCogSkJpZzJfUmVhbGxvYyh2b2lkKiBwTWVtLCBGWF9EV09SRCBkd1NpemUpIHsKKyAgICByZXR1cm4gRlhfUmVhbGxvYyh1aW50OF90LCBwTWVtLCBkd1NpemUpOworICB9CisgIHZpcnR1YWwgdm9pZCBKQmlnMl9GcmVlKHZvaWQqIHBNZW0pIHsgRlhfRnJlZShwTWVtKTsgfQogfTsKLWNsYXNzIENDb2RlY19JY2NNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0ljY01vZHVsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgSWNjQ1MJCQlHZXRQcm9maWxlQ1MoY29uc3QgdWludDhfdCogcFByb2ZpbGVEYXRhLCB1bnNpZ25lZCBpbnQgZHdQcm9maWxlU2l6ZSk7Ci0gICAgdmlydHVhbCBJY2NDUwkJCUdldFByb2ZpbGVDUyhJRlhfRmlsZVJlYWQqIHBGaWxlKTsKLSAgICB2aXJ0dWFsIHZvaWQqCQlDcmVhdGVUcmFuc2Zvcm0oSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBJbnB1dFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcE91dHB1dFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcFByb29mUGFyYW0gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ludGVudCA9IEljY19JTlRFTlRfUEVSQ0VQVFVBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnID0gSWNjX0ZMQUdTX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UHJmSW50ZW50ID0gSWNjX0lOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UHJmRmxhZyA9IEljY19GTEFHU19TT0ZUUFJPT0ZJTkcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIHZvaWQqCQlDcmVhdGVUcmFuc2Zvcm1fc1JHQihjb25zdCB1aW50OF90KiBwUHJvZmlsZURhdGEsIEZYX0RXT1JEIGR3UHJvZmlsZVNpemUsIGludDMyX3QmIG5Db21wb25lbnRzLCBpbnQzMl90IGludGVudCA9IDAsCi0gICAgICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCk7Ci0gICAgdmlydHVhbCB2b2lkKgkJQ3JlYXRlVHJhbnNmb3JtX0NNWUsoY29uc3QgdWludDhfdCogcFNyY1Byb2ZpbGVEYXRhLCBGWF9EV09SRCBkd1NyY1Byb2ZpbGVTaXplLCBpbnQzMl90JiBuU3JjQ29tcG9uZW50cywKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBEc3RQcm9maWxlRGF0YSwgRlhfRFdPUkQgZHdEc3RQcm9maWxlU2l6ZSwgaW50MzJfdCBpbnRlbnQgPSAwLAotICAgICAgICAgICAgRlhfRFdPUkQgZHdTcmNGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICBGWF9EV09SRCBkd0RzdEZvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCB2b2lkCQkJRGVzdHJveVRyYW5zZm9ybSh2b2lkKiBwVHJhbnNmb3JtKTsKLSAgICB2aXJ0dWFsIHZvaWQJCQlUcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwgRlhfRkxPQVQqIHBTcmNWYWx1ZXMsIEZYX0ZMT0FUKiBwRGVzdFZhbHVlcyk7Ci0gICAgdmlydHVhbCB2b2lkCQkJVHJhbnNsYXRlU2NhbmxpbmUodm9pZCogcFRyYW5zZm9ybSwgdWludDhfdCogcERlc3QsIGNvbnN0IHVpbnQ4X3QqIHBTcmMsIGludCBwaXhlbHMpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFNldENvbXBvbmVudHMoRlhfRFdPUkQgbkNvbXBvbmVudHMpIHttX25Db21wb25lbnRzID0gbkNvbXBvbmVudHM7fQotICAgIHZpcnR1YWwgfkNDb2RlY19JY2NNb2R1bGUoKTsKLXByb3RlY3RlZDoKLSAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCQltX01hcFRyYW5mb3JtOwotICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIJCW1fTWFwUHJvZmlsZTsKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25Db21wb25lbnRzOwotICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgIEljY19DTEFTU19JTlBVVCA9IDAsCi0gICAgICAgIEljY19DTEFTU19PVVRQVVQsCi0gICAgICAgIEljY19DTEFTU19QUk9PRiwKLSAgICAgICAgSWNjX0NMQVNTX01BWAotICAgIH0gSWNjX0NMQVNTOwotICAgIHZvaWQqCQlDcmVhdGVQcm9maWxlKElDb2RlY19JY2NNb2R1bGU6OkljY1BhcmFtKiBwSWNjUGFyYW0sIEljY19DTEFTUyBpYywgQ0ZYX0JpbmFyeUJ1ZiogcFRyYW5zZm9ybUtleSk7CitjbGFzcyBDQ29kZWNfSmJpZzJDb250ZXh0IHsKKyBwdWJsaWM6CisgIENDb2RlY19KYmlnMkNvbnRleHQoKTsKKyAgfkNDb2RlY19KYmlnMkNvbnRleHQoKXt9OworCisgIEZYX0RXT1JEIG1fd2lkdGg7CisgIEZYX0RXT1JEIG1faGVpZ2h0OworICB1aW50OF90KiBtX3NyY19idWY7CisgIEZYX0RXT1JEIG1fc3JjX3NpemU7CisgIGNvbnN0IHVpbnQ4X3QqIG1fZ2xvYmFsX2RhdGE7CisgIEZYX0RXT1JEIG1fZ2xvYmFsX3NpemU7CisgIHVpbnQ4X3QqIG1fZGVzdF9idWY7CisgIEZYX0RXT1JEIG1fZGVzdF9waXRjaDsKKyAgRlhfQk9PTCBtX2JGaWxlUmVhZGVyOworICBJRlhfUGF1c2UqIG1fcFBhdXNlOworICBDSkJpZzJfQ29udGV4dCogbV9wQ29udGV4dDsKKyAgQ0pCaWcyX0ltYWdlKiBtX2Rlc3RfaW1hZ2U7CiB9OwotY2xhc3MgQ0NvZGVjX0pweE1vZHVsZSA6IHB1YmxpYyBJQ29kZWNfSnB4TW9kdWxlCi17Ci1wdWJsaWM6Ci0gICAgQ0NvZGVjX0pweE1vZHVsZSgpOwotICAgIHZvaWQqCQlDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9CT09MIHVzZUNvbG9yU3BhY2UgPSBGQUxTRSk7Ci0gICAgdm9pZAkJR2V0SW1hZ2VJbmZvKHZvaWQqIGN0eCwgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgY29kZXN0cmVhbV9uQ29tcHMsIEZYX0RXT1JEJiBvdXRwdXRfbkNvbXBzKTsKLSAgICBGWF9CT09MCQlEZWNvZGUodm9pZCogY3R4LCB1aW50OF90KiBkZXN0X2RhdGEsIGludCBwaXRjaCwgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpOwotICAgIHZvaWQJCURlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCk7CitjbGFzcyBDQ29kZWNfSmJpZzJNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0piaWcyTW9kdWxlIHsKKyBwdWJsaWM6CisgIENDb2RlY19KYmlnMk1vZHVsZSgpe307CisgIH5DQ29kZWNfSmJpZzJNb2R1bGUoKTsKKyAgRlhfQk9PTCBEZWNvZGUoRlhfRFdPUkQgd2lkdGgsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGdsb2JhbF9kYXRhLAorICAgICAgICAgICAgICAgICBGWF9EV09SRCBnbG9iYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc3RfcGl0Y2gpOworICBGWF9CT09MIERlY29kZShJRlhfRmlsZVJlYWQqIGZpbGVfcHRyLAorICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBoZWlnaHQsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBwaXRjaCwKKyAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmKTsKKyAgdm9pZCogQ3JlYXRlSmJpZzJDb250ZXh0KCk7CisgIEZYQ09ERUNfU1RBVFVTIFN0YXJ0RGVjb2RlKHZvaWQqIHBKYmlnMkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnbG9iYWxfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2xvYmFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisKKyAgRlhDT0RFQ19TVEFUVVMgU3RhcnREZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICBGWENPREVDX1NUQVRVUyBDb250aW51ZURlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIHZvaWQgRGVzdHJveUpiaWcyQ29udGV4dCh2b2lkKiBwSmJpZzJDb250ZXh0KTsKKyAgQ1BERl9KYmlnMkludGVyZmFjZSBtX01vZHVsZTsKKyAgc3RkOjpsaXN0PENKQmlnMl9DYWNoZVBhaXI+IG1fU3ltYm9sRGljdENhY2hlOworCisgcHJpdmF0ZToKIH07Ci1jbGFzcyBDQ29kZWNfVGlmZk1vZHVsZSA6IHB1YmxpYyBJQ29kZWNfVGlmZk1vZHVsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCogCUNyZWF0ZURlY29kZXIoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0cik7Ci0gICAgdmlydHVhbCB2b2lkCQlHZXRGcmFtZXModm9pZCogY3R4LCBpbnQzMl90JiBmcmFtZXMpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJTG9hZEZyYW1lSW5mbyh2b2lkKiBjdHgsIGludDMyX3QgZnJhbWUsIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIGNvbXBzLCBGWF9EV09SRCYgYnBjLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlID0gTlVMTCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlEZWNvZGUodm9pZCogY3R4LCBjbGFzcyBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCk7Ci0gICAgdmlydHVhbCB2b2lkCQlEZXN0cm95RGVjb2Rlcih2b2lkKiBjdHgpOwotfTsKLWNsYXNzIENQREZfSmJpZzJJbnRlcmZhY2UgOiBwdWJsaWMgQ0pCaWcyX01vZHVsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCAqSkJpZzJfTWFsbG9jKEZYX0RXT1JEIGR3U2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGWF9BbGxvYyh1aW50OF90LCBkd1NpemUpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgKkpCaWcyX01hbGxvYzIoRlhfRFdPUkQgbnVtLCBGWF9EV09SRCBkd1NpemUpCi0gICAgewotICAgICAgICBpZiAoZHdTaXplICYmIG51bSA+PSBVSU5UX01BWCAvIGR3U2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZYX0FsbG9jKHVpbnQ4X3QsIG51bSAqIGR3U2l6ZSk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCAqSkJpZzJfTWFsbG9jMyhGWF9EV09SRCBudW0sIEZYX0RXT1JEIGR3U2l6ZSwgRlhfRFdPUkQgZHdTaXplMikKLSAgICB7Ci0gICAgICAgIGlmIChkd1NpemUyICYmIGR3U2l6ZSA+PSBVSU5UX01BWCAvIGR3U2l6ZTIpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIHNpemUgPSBkd1NpemUyICogZHdTaXplOwotICAgICAgICBpZiAoc2l6ZSAmJiBudW0gPj0gVUlOVF9NQVggLyBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRlhfQWxsb2ModWludDhfdCwgbnVtICogc2l6ZSk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCAqSkJpZzJfUmVhbGxvYyh2b2lkKiBwTWVtLCBGWF9EV09SRCBkd1NpemUpCi0gICAgewotICAgICAgICByZXR1cm4gRlhfUmVhbGxvYyh1aW50OF90LCBwTWVtLCBkd1NpemUpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgSkJpZzJfRnJlZSh2b2lkKiBwTWVtKQotICAgIHsKLSAgICAgICAgRlhfRnJlZShwTWVtKTsKLSAgICB9Ci19OwotY2xhc3MgQ0NvZGVjX0piaWcyQ29udGV4dAotewotcHVibGljOgotICAgIENDb2RlY19KYmlnMkNvbnRleHQoKTsKLSAgICB+Q0NvZGVjX0piaWcyQ29udGV4dCgpIHt9OworY2xhc3MgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWYgOiBwdWJsaWMgSUZYX0RJQkF0dHJpYnV0ZUV4aWYgeworIHB1YmxpYzoKKyAgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWYoKTsKKyAgfkNGWF9ESUJBdHRyaWJ1dGVFeGlmKCk7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRJbmZvKEZYX1dPUkQgdGFnLCB2b2lkKiB2YWwpOwogCi0gICAgRlhfRFdPUkQgbV93aWR0aDsKLSAgICBGWF9EV09SRCBtX2hlaWdodDsKLSAgICB1aW50OF90KiBtX3NyY19idWY7Ci0gICAgRlhfRFdPUkQgbV9zcmNfc2l6ZTsKLSAgICBjb25zdCB1aW50OF90KiBtX2dsb2JhbF9kYXRhOwotICAgIEZYX0RXT1JEIG1fZ2xvYmFsX3NpemU7Ci0gICAgdWludDhfdCogbV9kZXN0X2J1ZjsKLSAgICBGWF9EV09SRCBtX2Rlc3RfcGl0Y2g7Ci0gICAgRlhfQk9PTAltX2JGaWxlUmVhZGVyOwotICAgIElGWF9QYXVzZSogbV9wUGF1c2U7Ci0gICAgQ0pCaWcyX0NvbnRleHQqIG1fcENvbnRleHQ7Ci0gICAgQ0pCaWcyX0ltYWdlKiBtX2Rlc3RfaW1hZ2U7Ci19OwotY2xhc3MgQ0NvZGVjX0piaWcyTW9kdWxlIDogcHVibGljIElDb2RlY19KYmlnMk1vZHVsZQotewotcHVibGljOgotICAgIENDb2RlY19KYmlnMk1vZHVsZSgpIHt9OwotICAgIH5DQ29kZWNfSmJpZzJNb2R1bGUoKTsKLSAgICBGWF9CT09MCQlEZWNvZGUoRlhfRFdPUkQgd2lkdGgsIEZYX0RXT1JEIGhlaWdodCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGdsb2JhbF9kYXRhLCBGWF9EV09SRCBnbG9iYWxfc2l6ZSwgdWludDhfdCogZGVzdF9idWYsIEZYX0RXT1JEIGRlc3RfcGl0Y2gpOwotICAgIEZYX0JPT0wJCURlY29kZShJRlhfRmlsZVJlYWQqIGZpbGVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsIEZYX0RXT1JEJiBwaXRjaCwgdWludDhfdComIGRlc3RfYnVmKTsKLSAgICB2b2lkKgkJCQlDcmVhdGVKYmlnMkNvbnRleHQoKTsKLSAgICBGWENPREVDX1NUQVRVUwkJU3RhcnREZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwgRlhfRFdPUkQgd2lkdGgsIEZYX0RXT1JEIGhlaWdodCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnbG9iYWxfZGF0YSwgRlhfRFdPUkQgZ2xvYmFsX3NpemUsIHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCBkZXN0X3BpdGNoLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYX0JPT0wgUGFyc2VFeGlmKENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgdWludDhfdCo+KiBwSGVhZCwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbGVuLAorICAgICAgICAgICAgICAgICAgICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIHVpbnQ4X3QqPiogcFZhbCk7CiAKLSAgICBGWENPREVDX1NUQVRVUwkJU3RhcnREZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwgSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIHBpdGNoLCB1aW50OF90KiYgZGVzdF9idWYsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWENPREVDX1NUQVRVUwkJQ29udGludWVEZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIHZvaWQJCQkJRGVzdHJveUpiaWcyQ29udGV4dCh2b2lkKiBwSmJpZzJDb250ZXh0KTsKLSAgICBDUERGX0piaWcySW50ZXJmYWNlCW1fTW9kdWxlOwotICAgIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiBtX1N5bWJvbERpY3RDYWNoZTsKLXByaXZhdGU6Ci19OwotY2xhc3MgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWYgOiBwdWJsaWMgSUZYX0RJQkF0dHJpYnV0ZUV4aWYKLXsKLXB1YmxpYzoKLSAgICBDRlhfRElCQXR0cmlidXRlRXhpZigpOwotICAgIH5DRlhfRElCQXR0cmlidXRlRXhpZigpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0SW5mbyhGWF9XT1JEIHRhZywgdm9pZCogdmFsKTsKKyAgdHlwZWRlZiBGWF9XT1JEICgqX1JlYWQyQnl0ZXMpKHVpbnQ4X3QqIGRhdGEpOworICB0eXBlZGVmIEZYX0RXT1JEICgqX1JlYWQ0Qnl0ZXMpKHVpbnQ4X3QqIGRhdGEpOworICB1aW50OF90KiBQYXJzZUV4aWZJRkgodWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9SZWFkMkJ5dGVzKiBwUmVhZFdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICBfUmVhZDRCeXRlcyogcFJlYWREd29yZCk7CisgIEZYX0JPT0wgUGFyc2VFeGlmSUZEKENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgdWludDhfdCo+KiBwTWFwLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBsZW4pOwogCi0gICAgRlhfQk9PTCBQYXJzZUV4aWYoQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCB1aW50OF90Kj4qIHBIZWFkLCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBsZW4sIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgdWludDhfdCo+KiBwVmFsKTsKKyAgdWludDhfdCogbV9wRXhpZkRhdGE7CiAKLSAgICB0eXBlZGVmIEZYX1dPUkQgKCpfUmVhZDJCeXRlcykodWludDhfdCogZGF0YSk7Ci0gICAgdHlwZWRlZiBGWF9EV09SRCAoKl9SZWFkNEJ5dGVzKSh1aW50OF90KiBkYXRhKTsKLSAgICB1aW50OF90KiBQYXJzZUV4aWZJRkgodWludDhfdCogZGF0YSwgRlhfRFdPUkQgbGVuLCBfUmVhZDJCeXRlcyogcFJlYWRXb3JkLCBfUmVhZDRCeXRlcyogcFJlYWREd29yZCk7Ci0gICAgRlhfQk9PTCBQYXJzZUV4aWZJRkQoQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCB1aW50OF90Kj4qIHBNYXAsIHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIGxlbik7CisgIEZYX0RXT1JEIG1fZHdFeGlmRGF0YUxlbjsKIAotICAgIHVpbnQ4X3QqCQkJbV9wRXhpZkRhdGE7Ci0KLSAgICBGWF9EV09SRAkJCW1fZHdFeGlmRGF0YUxlbjsKLQotICAgIHZvaWQJCQkJY2xlYXIoKTsKLSAgICBfUmVhZDJCeXRlcyBtX3JlYWRXb3JkOwotICAgIF9SZWFkNEJ5dGVzIG1fcmVhZER3b3JkOwotICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgdWludDhfdCo+IG1fVGFnSGVhZDsKLSAgICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIHVpbnQ4X3QqPiBtX1RhZ1ZhbDsKKyAgdm9pZCBjbGVhcigpOworICBfUmVhZDJCeXRlcyBtX3JlYWRXb3JkOworICBfUmVhZDRCeXRlcyBtX3JlYWREd29yZDsKKyAgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCB1aW50OF90Kj4gbV9UYWdIZWFkOworICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIHVpbnQ4X3QqPiBtX1RhZ1ZhbDsKIH07CiAKIHN0cnVjdCBEZWNvZGVEYXRhIHsKLXB1YmxpYzoKLSAgICBEZWNvZGVEYXRhKHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhLCBPUEpfU0laRV9UIHNyY19zaXplKSA6Ci0gICAgICAgIHNyY19kYXRhKHNyY19kYXRhKSwgc3JjX3NpemUoc3JjX3NpemUpLCBvZmZzZXQoMCkgewotICAgIH0KLSAgICB1bnNpZ25lZCBjaGFyKiBzcmNfZGF0YTsKLSAgICBPUEpfU0laRV9UICAgICBzcmNfc2l6ZTsKLSAgICBPUEpfU0laRV9UICAgICBvZmZzZXQ7CisgcHVibGljOgorICBEZWNvZGVEYXRhKHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhLCBPUEpfU0laRV9UIHNyY19zaXplKQorICAgICAgOiBzcmNfZGF0YShzcmNfZGF0YSksIHNyY19zaXplKHNyY19zaXplKSwgb2Zmc2V0KDApIHt9CisgIHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhOworICBPUEpfU0laRV9UIHNyY19zaXplOworICBPUEpfU0laRV9UIG9mZnNldDsKIH07CiAKIC8qIFdyYXBwZXJzIGZvciBDLXN0eWxlIGNhbGxiYWNrcy4gKi8KLU9QSl9TSVpFX1Qgb3BqX3JlYWRfZnJvbV9tZW1vcnkgKHZvaWQqIHBfYnVmZmVyLCBPUEpfU0laRV9UIG5iX2J5dGVzLCAgdm9pZCogcF91c2VyX2RhdGEpOwotT1BKX1NJWkVfVCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkgKHZvaWQqIHBfYnVmZmVyLCBPUEpfU0laRV9UIG5iX2J5dGVzLCB2b2lkKiBwX3VzZXJfZGF0YSk7Ci1PUEpfT0ZGX1Qgb3BqX3NraXBfZnJvbV9tZW1vcnkgKE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpOwotT1BKX0JPT0wgb3BqX3NlZWtfZnJvbV9tZW1vcnkgKE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpOworT1BKX1NJWkVfVCBvcGpfcmVhZF9mcm9tX21lbW9yeSh2b2lkKiBwX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCBuYl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF91c2VyX2RhdGEpOworT1BKX1NJWkVfVCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkodm9pZCogcF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfU0laRV9UIG5iX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF91c2VyX2RhdGEpOworT1BKX09GRl9UIG9wal9za2lwX2Zyb21fbWVtb3J5KE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpOworT1BKX0JPT0wgb3BqX3NlZWtfZnJvbV9tZW1vcnkoT1BKX09GRl9UIG5iX2J5dGVzLCB2b2lkKiBwX3VzZXJfZGF0YSk7CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlhDT0RFQ19DT0RFQ19DT0RFQ19JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWMuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKaW5kZXggOTYzNjZmYS4uMWVmODVmOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKQEAgLTgsNzQ4ICs4LDc0NyBAQAogI2luY2x1ZGUgImNvZGVjX2ludC5oIgogCiBDQ29kZWNfTW9kdWxlTWdyOjpDQ29kZWNfTW9kdWxlTWdyKCkKLSAgOiBtX3BCYXNpY01vZHVsZShuZXcgQ0NvZGVjX0Jhc2ljTW9kdWxlKSwKLSAgICBtX3BGYXhNb2R1bGUobmV3IENDb2RlY19GYXhNb2R1bGUpLAotICAgIG1fcEpwZWdNb2R1bGUobmV3IENDb2RlY19KcGVnTW9kdWxlKSwKLSAgICBtX3BKcHhNb2R1bGUobmV3IENDb2RlY19KcHhNb2R1bGUpLAotICAgIG1fcEpiaWcyTW9kdWxlKG5ldyBDQ29kZWNfSmJpZzJNb2R1bGUpLAotICAgIG1fcEljY01vZHVsZShuZXcgQ0NvZGVjX0ljY01vZHVsZSksCi0gICAgbV9wRmxhdGVNb2R1bGUobmV3IENDb2RlY19GbGF0ZU1vZHVsZSksCi0gICAgbV9wUG5nTW9kdWxlKG5ldyBDQ29kZWNfUG5nTW9kdWxlKSwKLSAgICBtX3BHaWZNb2R1bGUobmV3IENDb2RlY19HaWZNb2R1bGUpLAotICAgIG1fcEJtcE1vZHVsZShuZXcgQ0NvZGVjX0JtcE1vZHVsZSksCi0gICAgbV9wVGlmZk1vZHVsZShuZXcgQ0NvZGVjX1RpZmZNb2R1bGUpIHsKKyAgICA6IG1fcEJhc2ljTW9kdWxlKG5ldyBDQ29kZWNfQmFzaWNNb2R1bGUpLAorICAgICAgbV9wRmF4TW9kdWxlKG5ldyBDQ29kZWNfRmF4TW9kdWxlKSwKKyAgICAgIG1fcEpwZWdNb2R1bGUobmV3IENDb2RlY19KcGVnTW9kdWxlKSwKKyAgICAgIG1fcEpweE1vZHVsZShuZXcgQ0NvZGVjX0pweE1vZHVsZSksCisgICAgICBtX3BKYmlnMk1vZHVsZShuZXcgQ0NvZGVjX0piaWcyTW9kdWxlKSwKKyAgICAgIG1fcEljY01vZHVsZShuZXcgQ0NvZGVjX0ljY01vZHVsZSksCisgICAgICBtX3BGbGF0ZU1vZHVsZShuZXcgQ0NvZGVjX0ZsYXRlTW9kdWxlKSwKKyAgICAgIG1fcFBuZ01vZHVsZShuZXcgQ0NvZGVjX1BuZ01vZHVsZSksCisgICAgICBtX3BHaWZNb2R1bGUobmV3IENDb2RlY19HaWZNb2R1bGUpLAorICAgICAgbV9wQm1wTW9kdWxlKG5ldyBDQ29kZWNfQm1wTW9kdWxlKSwKKyAgICAgIG1fcFRpZmZNb2R1bGUobmV3IENDb2RlY19UaWZmTW9kdWxlKSB7fQorQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6Q0NvZGVjX1NjYW5saW5lRGVjb2RlcigpIHsKKyAgbV9OZXh0TGluZSA9IC0xOworICBtX3BEYXRhQ2FjaGUgPSBOVUxMOworICBtX3BMYXN0U2NhbmxpbmUgPSBOVUxMOwogfQotQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6Q0NvZGVjX1NjYW5saW5lRGVjb2RlcigpCi17Ci0gICAgbV9OZXh0TGluZSA9IC0xOwotICAgIG1fcERhdGFDYWNoZSA9IE5VTEw7Ci0gICAgbV9wTGFzdFNjYW5saW5lID0gTlVMTDsKK0NDb2RlY19TY2FubGluZURlY29kZXI6On5DQ29kZWNfU2NhbmxpbmVEZWNvZGVyKCkgeworICBpZiAobV9wRGF0YUNhY2hlKSB7CisgICAgRlhfRnJlZShtX3BEYXRhQ2FjaGUpOworICB9CiB9Ci1DQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjp+Q0NvZGVjX1NjYW5saW5lRGVjb2RlcigpCi17Ci0gICAgaWYgKG1fcERhdGFDYWNoZSkgewotICAgICAgICBGWF9GcmVlKG1fcERhdGFDYWNoZSk7Ci0gICAgfQotfQotdWludDhfdCogQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6R2V0U2NhbmxpbmUoaW50IGxpbmUpCi17Ci0gICAgaWYgKG1fcERhdGFDYWNoZSAmJiBsaW5lIDwgbV9wRGF0YUNhY2hlLT5tX25DYWNoZWRMaW5lcykgewotICAgICAgICByZXR1cm4gJm1fcERhdGFDYWNoZS0+bV9EYXRhICsgbGluZSAqIG1fUGl0Y2g7Ci0gICAgfQotICAgIGlmIChtX05leHRMaW5lID09IGxpbmUgKyAxKSB7Ci0gICAgICAgIHJldHVybiBtX3BMYXN0U2NhbmxpbmU7Ci0gICAgfQotICAgIGlmIChtX05leHRMaW5lIDwgMCB8fCBtX05leHRMaW5lID4gbGluZSkgewotICAgICAgICBpZiAoIXZfUmV3aW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIG1fTmV4dExpbmUgPSAwOwotICAgIH0KLSAgICB3aGlsZSAobV9OZXh0TGluZSA8IGxpbmUpIHsKLSAgICAgICAgUmVhZE5leHRMaW5lKCk7Ci0gICAgICAgIG1fTmV4dExpbmUgKys7Ci0gICAgfQotICAgIG1fcExhc3RTY2FubGluZSA9IFJlYWROZXh0TGluZSgpOwotICAgIG1fTmV4dExpbmUgKys7Cit1aW50OF90KiBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpHZXRTY2FubGluZShpbnQgbGluZSkgeworICBpZiAobV9wRGF0YUNhY2hlICYmIGxpbmUgPCBtX3BEYXRhQ2FjaGUtPm1fbkNhY2hlZExpbmVzKSB7CisgICAgcmV0dXJuICZtX3BEYXRhQ2FjaGUtPm1fRGF0YSArIGxpbmUgKiBtX1BpdGNoOworICB9CisgIGlmIChtX05leHRMaW5lID09IGxpbmUgKyAxKSB7CiAgICAgcmV0dXJuIG1fcExhc3RTY2FubGluZTsKKyAgfQorICBpZiAobV9OZXh0TGluZSA8IDAgfHwgbV9OZXh0TGluZSA+IGxpbmUpIHsKKyAgICBpZiAoIXZfUmV3aW5kKCkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtX05leHRMaW5lID0gMDsKKyAgfQorICB3aGlsZSAobV9OZXh0TGluZSA8IGxpbmUpIHsKKyAgICBSZWFkTmV4dExpbmUoKTsKKyAgICBtX05leHRMaW5lKys7CisgIH0KKyAgbV9wTGFzdFNjYW5saW5lID0gUmVhZE5leHRMaW5lKCk7CisgIG1fTmV4dExpbmUrKzsKKyAgcmV0dXJuIG1fcExhc3RTY2FubGluZTsKIH0KLUZYX0JPT0wgQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmIChtX3BEYXRhQ2FjaGUgJiYgbGluZSA8IG1fcERhdGFDYWNoZS0+bV9uQ2FjaGVkTGluZXMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9OZXh0TGluZSA9PSBsaW5lIHx8IG1fTmV4dExpbmUgPT0gbGluZSArIDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9OZXh0TGluZSA8IDAgfHwgbV9OZXh0TGluZSA+IGxpbmUpIHsKLSAgICAgICAgdl9SZXdpbmQoKTsKLSAgICAgICAgbV9OZXh0TGluZSA9IDA7Ci0gICAgfQotICAgIG1fcExhc3RTY2FubGluZSA9IE5VTEw7Ci0gICAgd2hpbGUgKG1fTmV4dExpbmUgPCBsaW5lKSB7Ci0gICAgICAgIG1fcExhc3RTY2FubGluZSA9IFJlYWROZXh0TGluZSgpOwotICAgICAgICBtX05leHRMaW5lICsrOwotICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9CitGWF9CT09MIENDb2RlY19TY2FubGluZURlY29kZXI6OlNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAobV9wRGF0YUNhY2hlICYmIGxpbmUgPCBtX3BEYXRhQ2FjaGUtPm1fbkNhY2hlZExpbmVzKSB7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotdWludDhfdCogQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6UmVhZE5leHRMaW5lKCkKLXsKLSAgICB1aW50OF90KiBwTGluZSA9IHZfR2V0TmV4dExpbmUoKTsKLSAgICBpZiAocExpbmUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fcERhdGFDYWNoZSAmJiBtX05leHRMaW5lID09IG1fcERhdGFDYWNoZS0+bV9uQ2FjaGVkTGluZXMpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KCZtX3BEYXRhQ2FjaGUtPm1fRGF0YSArIG1fTmV4dExpbmUgKiBtX1BpdGNoLCBwTGluZSwgbV9QaXRjaCk7Ci0gICAgICAgIG1fcERhdGFDYWNoZS0+bV9uQ2FjaGVkTGluZXMgKys7Ci0gICAgfQotICAgIHJldHVybiBwTGluZTsKLX0KLXZvaWQgQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6RG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpCi17Ci0gICAgaWYgKGRlc3Rfd2lkdGggPCAwKSB7Ci0gICAgICAgIGRlc3Rfd2lkdGggPSAtZGVzdF93aWR0aDsKLSAgICB9Ci0gICAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkgewotICAgICAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKLSAgICB9Ci0gICAgdl9Eb3duU2NhbGUoZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOwotICAgIGlmIChtX3BEYXRhQ2FjaGUpIHsKLSAgICAgICAgaWYgKG1fcERhdGFDYWNoZS0+bV9IZWlnaHQgPT0gbV9PdXRwdXRIZWlnaHQgJiYgbV9wRGF0YUNhY2hlLT5tX1dpZHRoID09IG1fT3V0cHV0V2lkdGgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9GcmVlKG1fcERhdGFDYWNoZSk7Ci0gICAgICAgIG1fcERhdGFDYWNoZSA9IE5VTEw7Ci0gICAgfQotICAgIG1fcERhdGFDYWNoZSA9IChDQ29kZWNfSW1hZ2VEYXRhQ2FjaGUqKUZYX1RyeUFsbG9jKHVpbnQ4X3QsIHNpemVvZihDQ29kZWNfSW1hZ2VEYXRhQ2FjaGUpICsgbV9QaXRjaCAqIG1fT3V0cHV0SGVpZ2h0KTsKLSAgICBpZiAobV9wRGF0YUNhY2hlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BEYXRhQ2FjaGUtPm1fSGVpZ2h0ID0gbV9PdXRwdXRIZWlnaHQ7Ci0gICAgbV9wRGF0YUNhY2hlLT5tX1dpZHRoID0gbV9PdXRwdXRXaWR0aDsKLSAgICBtX3BEYXRhQ2FjaGUtPm1fbkNhY2hlZExpbmVzID0gMDsKLX0KLUZYX0JPT0wgQ0NvZGVjX0Jhc2ljTW9kdWxlOjpSdW5MZW5ndGhFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKLSAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKLXsKKyAgfQorICBpZiAobV9OZXh0TGluZSA9PSBsaW5lIHx8IG1fTmV4dExpbmUgPT0gbGluZSArIDEpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fTmV4dExpbmUgPCAwIHx8IG1fTmV4dExpbmUgPiBsaW5lKSB7CisgICAgdl9SZXdpbmQoKTsKKyAgICBtX05leHRMaW5lID0gMDsKKyAgfQorICBtX3BMYXN0U2NhbmxpbmUgPSBOVUxMOworICB3aGlsZSAobV9OZXh0TGluZSA8IGxpbmUpIHsKKyAgICBtX3BMYXN0U2NhbmxpbmUgPSBSZWFkTmV4dExpbmUoKTsKKyAgICBtX05leHRMaW5lKys7CisgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1leHRlcm4gIkMiIGRvdWJsZSBGWHN0cnRvZChjb25zdCBjaGFyKiBucHRyLCBjaGFyKiogZW5kcHRyKQotewotICAgIGRvdWJsZSByZXQgPSAwLjA7Ci0gICAgY29uc3QgY2hhciogcHRyID0gbnB0cjsKLSAgICBjb25zdCBjaGFyKiBleHBfcHRyID0gTlVMTDsKLSAgICBpbnQJZV9udW1iZXIgPSAwLAotICAgICAgICBlX3NpZ25hbCA9IDAsCi0gICAgICAgIGVfcG9pbnQgPSAwLAotICAgICAgICBpc19uZWdhdGl2ZSA9IDA7Ci0gICAgaW50IGV4cF9yZXQgPSAwLCBleHBfc2lnID0gMSwKLSAgICAgICAgZnJhX3JldCA9IDAsIGZyYV9jb3VudCA9IDAsIGZyYV9iYXNlID0gMTsKLSAgICBpZihucHRyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDAuMDsKK3VpbnQ4X3QqIENDb2RlY19TY2FubGluZURlY29kZXI6OlJlYWROZXh0TGluZSgpIHsKKyAgdWludDhfdCogcExpbmUgPSB2X0dldE5leHRMaW5lKCk7CisgIGlmIChwTGluZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKG1fcERhdGFDYWNoZSAmJiBtX05leHRMaW5lID09IG1fcERhdGFDYWNoZS0+bV9uQ2FjaGVkTGluZXMpIHsKKyAgICBGWFNZU19tZW1jcHkoJm1fcERhdGFDYWNoZS0+bV9EYXRhICsgbV9OZXh0TGluZSAqIG1fUGl0Y2gsIHBMaW5lLCBtX1BpdGNoKTsKKyAgICBtX3BEYXRhQ2FjaGUtPm1fbkNhY2hlZExpbmVzKys7CisgIH0KKyAgcmV0dXJuIHBMaW5lOworfQordm9pZCBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpEb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgeworICBpZiAoZGVzdF93aWR0aCA8IDApIHsKKyAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7CisgIH0KKyAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkgeworICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0OworICB9CisgIHZfRG93blNjYWxlKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKKyAgaWYgKG1fcERhdGFDYWNoZSkgeworICAgIGlmIChtX3BEYXRhQ2FjaGUtPm1fSGVpZ2h0ID09IG1fT3V0cHV0SGVpZ2h0ICYmCisgICAgICAgIG1fcERhdGFDYWNoZS0+bV9XaWR0aCA9PSBtX091dHB1dFdpZHRoKSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIGZvciAoOzsgcHRyKyspIHsKLSAgICAgICAgaWYoIWVfbnVtYmVyICYmICFlX3BvaW50ICYmICgqcHRyID09ICdcdCcgfHwgKnB0ciA9PSAnICcpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZigqcHRyID49ICcwJyAmJiAqcHRyIDw9ICc5JykgewotICAgICAgICAgICAgaWYoIWVfbnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgZV9udW1iZXIgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIWVfcG9pbnQpIHsKLSAgICAgICAgICAgICAgICByZXQgKj0gMTA7Ci0gICAgICAgICAgICAgICAgcmV0ICs9ICgqcHRyIC0gJzAnKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnJhX2NvdW50Kys7Ci0gICAgICAgICAgICAgICAgZnJhX3JldCAqPSAxMDsKLSAgICAgICAgICAgICAgICBmcmFfcmV0ICs9ICgqcHRyIC0gJzAnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKCFlX3BvaW50ICYmICpwdHIgPT0gJy4nKSB7Ci0gICAgICAgICAgICBlX3BvaW50ID0gMTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKCFlX251bWJlciAmJiAhZV9wb2ludCAmJiAhZV9zaWduYWwpIHsKLSAgICAgICAgICAgIHN3aXRjaCgqcHRyKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnLSc6Ci0gICAgICAgICAgICAgICAgICAgIGlzX25lZ2F0aXZlID0gMTsKLSAgICAgICAgICAgICAgICBjYXNlICcrJzoKLSAgICAgICAgICAgICAgICAgICAgZV9zaWduYWwgPSAxOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihlX251bWJlciAmJiAoKnB0ciA9PSAnZScgfHwgKnB0ciA9PSAnRScpKSB7Ci0jZGVmaW5lIEVYUE9ORU5UX0RFVEVDVChwdHIpCVwKLSAgICBmb3IoOztwdHIrKyl7CQlcCi0gICAgICAgIGlmKCpwdHIgPCAnMCcgfHwgKnB0ciA+ICc5Jyl7CVwKLSAgICAgICAgICAgIGlmKGVuZHB0cikJKmVuZHB0ciA9IChjaGFyKilwdHI7CVwKLSAgICAgICAgICAgIGJyZWFrOwlcCi0gICAgICAgIH1lbHNlewkJXAotICAgICAgICAgICAgZXhwX3JldCAqPSAxMDsJXAotICAgICAgICAgICAgZXhwX3JldCArPSAoKnB0ciAtICcwJyk7CVwKLSAgICAgICAgICAgIGNvbnRpbnVlOwkJXAotICAgICAgICB9CVwKKyAgICBGWF9GcmVlKG1fcERhdGFDYWNoZSk7CisgICAgbV9wRGF0YUNhY2hlID0gTlVMTDsKKyAgfQorICBtX3BEYXRhQ2FjaGUgPSAoQ0NvZGVjX0ltYWdlRGF0YUNhY2hlKilGWF9UcnlBbGxvYygKKyAgICAgIHVpbnQ4X3QsIHNpemVvZihDQ29kZWNfSW1hZ2VEYXRhQ2FjaGUpICsgbV9QaXRjaCAqIG1fT3V0cHV0SGVpZ2h0KTsKKyAgaWYgKG1fcERhdGFDYWNoZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcERhdGFDYWNoZS0+bV9IZWlnaHQgPSBtX091dHB1dEhlaWdodDsKKyAgbV9wRGF0YUNhY2hlLT5tX1dpZHRoID0gbV9PdXRwdXRXaWR0aDsKKyAgbV9wRGF0YUNhY2hlLT5tX25DYWNoZWRMaW5lcyA9IDA7Cit9CitGWF9CT09MIENDb2RlY19CYXNpY01vZHVsZTo6UnVuTGVuZ3RoRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIHsKKyAgcmV0dXJuIEZBTFNFOworfQorZXh0ZXJuICJDIiBkb3VibGUgRlhzdHJ0b2QoY29uc3QgY2hhciogbnB0ciwgY2hhcioqIGVuZHB0cikgeworICBkb3VibGUgcmV0ID0gMC4wOworICBjb25zdCBjaGFyKiBwdHIgPSBucHRyOworICBjb25zdCBjaGFyKiBleHBfcHRyID0gTlVMTDsKKyAgaW50IGVfbnVtYmVyID0gMCwgZV9zaWduYWwgPSAwLCBlX3BvaW50ID0gMCwgaXNfbmVnYXRpdmUgPSAwOworICBpbnQgZXhwX3JldCA9IDAsIGV4cF9zaWcgPSAxLCBmcmFfcmV0ID0gMCwgZnJhX2NvdW50ID0gMCwgZnJhX2Jhc2UgPSAxOworICBpZiAobnB0ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDAuMDsKKyAgfQorICBmb3IgKDs7IHB0cisrKSB7CisgICAgaWYgKCFlX251bWJlciAmJiAhZV9wb2ludCAmJiAoKnB0ciA9PSAnXHQnIHx8ICpwdHIgPT0gJyAnKSkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgICAgICAgICAgZXhwX3B0ciA9IHB0cisrOwotICAgICAgICAgICAgaWYoKnB0ciA9PSAnKycgfHwgKnB0ciA9PSAnLScpIHsKLSAgICAgICAgICAgICAgICBleHBfc2lnID0gKCpwdHIrKyA9PSAnKycpID8gMSA6IC0xOwotICAgICAgICAgICAgICAgIGlmKCpwdHIgPCAnMCcgfHwgKnB0ciA+ICc5JykgewotICAgICAgICAgICAgICAgICAgICBpZihlbmRwdHIpCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICplbmRwdHIgPSAoY2hhciopZXhwX3B0cjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRVhQT05FTlRfREVURUNUKHB0cik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoKnB0ciA+PSAnMCcgJiYgKnB0ciA8PSAnOScpIHsKLSAgICAgICAgICAgICAgICBFWFBPTkVOVF9ERVRFQ1QocHRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYoZW5kcHRyKQl7Ci0gICAgICAgICAgICAgICAgICAgICplbmRwdHIgPSAoY2hhciopZXhwX3B0cjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0jdW5kZWYgRVhQT05FTlRfREVURUNUCi0gICAgICAgICAgICBicmVhazsKKyAgICBpZiAoKnB0ciA+PSAnMCcgJiYgKnB0ciA8PSAnOScpIHsKKyAgICAgIGlmICghZV9udW1iZXIpIHsKKyAgICAgICAgZV9udW1iZXIgPSAxOworICAgICAgfQorICAgICAgaWYgKCFlX3BvaW50KSB7CisgICAgICAgIHJldCAqPSAxMDsKKyAgICAgICAgcmV0ICs9ICgqcHRyIC0gJzAnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZyYV9jb3VudCsrOworICAgICAgICBmcmFfcmV0ICo9IDEwOworICAgICAgICBmcmFfcmV0ICs9ICgqcHRyIC0gJzAnKTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIWVfcG9pbnQgJiYgKnB0ciA9PSAnLicpIHsKKyAgICAgIGVfcG9pbnQgPSAxOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghZV9udW1iZXIgJiYgIWVfcG9pbnQgJiYgIWVfc2lnbmFsKSB7CisgICAgICBzd2l0Y2ggKCpwdHIpIHsKKyAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgaXNfbmVnYXRpdmUgPSAxOworICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICBlX3NpZ25hbCA9IDE7CisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChlX251bWJlciAmJiAoKnB0ciA9PSAnZScgfHwgKnB0ciA9PSAnRScpKSB7CisjZGVmaW5lIEVYUE9ORU5UX0RFVEVDVChwdHIpICAgICAgICBcCisgIGZvciAoOzsgcHRyKyspIHsgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCpwdHIgPCAnMCcgfHwgKnB0ciA+ICc5JykgeyBcCisgICAgICBpZiAoZW5kcHRyKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICplbmRwdHIgPSAoY2hhciopcHRyOyAgICAgICBcCisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBleHBfcmV0ICo9IDEwOyAgICAgICAgICAgICAgICBcCisgICAgICBleHBfcmV0ICs9ICgqcHRyIC0gJzAnKTsgICAgICBcCisgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyAgICAgIGV4cF9wdHIgPSBwdHIrKzsKKyAgICAgIGlmICgqcHRyID09ICcrJyB8fCAqcHRyID09ICctJykgeworICAgICAgICBleHBfc2lnID0gKCpwdHIrKyA9PSAnKycpID8gMSA6IC0xOworICAgICAgICBpZiAoKnB0ciA8ICcwJyB8fCAqcHRyID4gJzknKSB7CisgICAgICAgICAgaWYgKGVuZHB0cikgeworICAgICAgICAgICAgKmVuZHB0ciA9IChjaGFyKilleHBfcHRyOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZihwdHIgIT0gbnB0ciAmJiAhZV9udW1iZXIpIHsKLSAgICAgICAgICAgIGlmKGVuZHB0cikJewotICAgICAgICAgICAgICAgICplbmRwdHIgPSAoY2hhciopbnB0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKGVuZHB0cikJewotICAgICAgICAgICAgKmVuZHB0ciA9IChjaGFyKilwdHI7CisgICAgICAgIEVYUE9ORU5UX0RFVEVDVChwdHIpOworICAgICAgfSBlbHNlIGlmICgqcHRyID49ICcwJyAmJiAqcHRyIDw9ICc5JykgeworICAgICAgICBFWFBPTkVOVF9ERVRFQ1QocHRyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlbmRwdHIpIHsKKyAgICAgICAgICAqZW5kcHRyID0gKGNoYXIqKWV4cF9wdHI7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgICB9CisjdW5kZWYgRVhQT05FTlRfREVURUNUCisgICAgICBicmVhazsKICAgICB9Ci0gICAgd2hpbGUoZnJhX2NvdW50LS0pIHsKLSAgICAgICAgZnJhX2Jhc2UgKj0gMTA7CisgICAgaWYgKHB0ciAhPSBucHRyICYmICFlX251bWJlcikgeworICAgICAgaWYgKGVuZHB0cikgeworICAgICAgICAqZW5kcHRyID0gKGNoYXIqKW5wdHI7CisgICAgICB9CisgICAgICBicmVhazsKICAgICB9Ci0gICAgcmV0ICs9IChkb3VibGUpZnJhX3JldCAvIChkb3VibGUpZnJhX2Jhc2U7Ci0gICAgaWYoZXhwX3NpZyA9PSAxKSB7Ci0gICAgICAgIHdoaWxlKGV4cF9yZXQtLSkgewotICAgICAgICAgICAgcmV0ICo9IDEwLjA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB3aGlsZShleHBfcmV0LS0pIHsKLSAgICAgICAgICAgIHJldCAvPSAxMC4wOwotICAgICAgICB9CisgICAgaWYgKGVuZHB0cikgeworICAgICAgKmVuZHB0ciA9IChjaGFyKilwdHI7CiAgICAgfQotICAgIHJldHVybiBpc19uZWdhdGl2ZSA/IC1yZXQgOiByZXQ7Ci19Ci1GWF9CT09MIENDb2RlY19CYXNpY01vZHVsZTo6QTg1RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCB1aW50OF90KiYgZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotQ0ZYX0RJQkF0dHJpYnV0ZTo6Q0ZYX0RJQkF0dHJpYnV0ZSgpCi17Ci0gICAgRlhTWVNfbWVtc2V0KHRoaXMsIDAsIHNpemVvZihDRlhfRElCQXR0cmlidXRlKSk7Ci0gICAgbV9uWERQSSA9IC0xOwotICAgIG1fbllEUEkgPSAtMTsKLSAgICBtX2ZBc3BlY3RSYXRpbyA9IC0xLjBmOwotICAgIG1fcEV4aWYgPSBuZXcgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWY7Ci19Ci1DRlhfRElCQXR0cmlidXRlOjp+Q0ZYX0RJQkF0dHJpYnV0ZSgpCi17Ci0gICAgaWYgKG1fcEV4aWYpIHsKLSAgICAgICAgZGVsZXRlIG1fcEV4aWY7CisgICAgYnJlYWs7CisgIH0KKyAgd2hpbGUgKGZyYV9jb3VudC0tKSB7CisgICAgZnJhX2Jhc2UgKj0gMTA7CisgIH0KKyAgcmV0ICs9IChkb3VibGUpZnJhX3JldCAvIChkb3VibGUpZnJhX2Jhc2U7CisgIGlmIChleHBfc2lnID09IDEpIHsKKyAgICB3aGlsZSAoZXhwX3JldC0tKSB7CisgICAgICByZXQgKj0gMTAuMDsKICAgICB9Ci19Ci1DRlhfRElCQXR0cmlidXRlRXhpZjo6Q0ZYX0RJQkF0dHJpYnV0ZUV4aWYoKQotewotICAgIG1fcEV4aWZEYXRhID0gTlVMTDsKLSAgICBtX2R3RXhpZkRhdGFMZW4gPSAwOwotfQotQ0ZYX0RJQkF0dHJpYnV0ZUV4aWY6On5DRlhfRElCQXR0cmlidXRlRXhpZigpCi17Ci0gICAgY2xlYXIoKTsKLX0KLXZvaWQgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWY6OmNsZWFyKCkKLXsKLSAgICBpZiAobV9wRXhpZkRhdGEpIHsKLSAgICAgICAgRlhfRnJlZShtX3BFeGlmRGF0YSk7CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKGV4cF9yZXQtLSkgeworICAgICAgcmV0IC89IDEwLjA7CiAgICAgfQotICAgIG1fcEV4aWZEYXRhID0gTlVMTDsKLSAgICBGWF9EV09SRCBrZXkgPSAwOwotICAgIHVpbnQ4X3QqIGJ1ZiA9IE5VTEw7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gTlVMTDsKLSAgICBwb3MgPSBtX1RhZ0hlYWQuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgbV9UYWdIZWFkLkdldE5leHRBc3NvYyhwb3MsIGtleSwgYnVmKTsKLSAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgRlhfRnJlZShidWYpOwotICAgICAgICB9CisgIH0KKyAgcmV0dXJuIGlzX25lZ2F0aXZlID8gLXJldCA6IHJldDsKK30KK0ZYX0JPT0wgQ0NvZGVjX0Jhc2ljTW9kdWxlOjpBODVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICByZXR1cm4gRkFMU0U7Cit9CitDRlhfRElCQXR0cmlidXRlOjpDRlhfRElCQXR0cmlidXRlKCkgeworICBGWFNZU19tZW1zZXQodGhpcywgMCwgc2l6ZW9mKENGWF9ESUJBdHRyaWJ1dGUpKTsKKyAgbV9uWERQSSA9IC0xOworICBtX25ZRFBJID0gLTE7CisgIG1fZkFzcGVjdFJhdGlvID0gLTEuMGY7CisgIG1fcEV4aWYgPSBuZXcgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWY7Cit9CitDRlhfRElCQXR0cmlidXRlOjp+Q0ZYX0RJQkF0dHJpYnV0ZSgpIHsKKyAgaWYgKG1fcEV4aWYpIHsKKyAgICBkZWxldGUgbV9wRXhpZjsKKyAgfQorfQorQ0ZYX0RJQkF0dHJpYnV0ZUV4aWY6OkNGWF9ESUJBdHRyaWJ1dGVFeGlmKCkgeworICBtX3BFeGlmRGF0YSA9IE5VTEw7CisgIG1fZHdFeGlmRGF0YUxlbiA9IDA7Cit9CitDRlhfRElCQXR0cmlidXRlRXhpZjo6fkNGWF9ESUJBdHRyaWJ1dGVFeGlmKCkgeworICBjbGVhcigpOworfQordm9pZCBDRlhfRElCQXR0cmlidXRlRXhpZjo6Y2xlYXIoKSB7CisgIGlmIChtX3BFeGlmRGF0YSkgeworICAgIEZYX0ZyZWUobV9wRXhpZkRhdGEpOworICB9CisgIG1fcEV4aWZEYXRhID0gTlVMTDsKKyAgRlhfRFdPUkQga2V5ID0gMDsKKyAgdWludDhfdCogYnVmID0gTlVMTDsKKyAgRlhfUE9TSVRJT04gcG9zID0gTlVMTDsKKyAgcG9zID0gbV9UYWdIZWFkLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIG1fVGFnSGVhZC5HZXROZXh0QXNzb2MocG9zLCBrZXksIGJ1Zik7CisgICAgaWYgKGJ1ZikgeworICAgICAgRlhfRnJlZShidWYpOwogICAgIH0KLSAgICBtX1RhZ0hlYWQuUmVtb3ZlQWxsKCk7Ci0gICAgcG9zID0gbV9UYWdWYWwuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgbV9UYWdWYWwuR2V0TmV4dEFzc29jKHBvcywga2V5LCBidWYpOwotICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKGJ1Zik7Ci0gICAgICAgIH0KKyAgfQorICBtX1RhZ0hlYWQuUmVtb3ZlQWxsKCk7CisgIHBvcyA9IG1fVGFnVmFsLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIG1fVGFnVmFsLkdldE5leHRBc3NvYyhwb3MsIGtleSwgYnVmKTsKKyAgICBpZiAoYnVmKSB7CisgICAgICBGWF9GcmVlKGJ1Zik7CiAgICAgfQotICAgIG1fVGFnVmFsLlJlbW92ZUFsbCgpOworICB9CisgIG1fVGFnVmFsLlJlbW92ZUFsbCgpOwogfQotc3RhdGljIEZYX1dPUkQgX1JlYWQyQnl0ZXNMKHVpbnQ4X3QqIGRhdGEpCi17Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIHJldHVybiBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCk7CitzdGF0aWMgRlhfV09SRCBfUmVhZDJCeXRlc0wodWludDhfdCogZGF0YSkgeworICBBU1NFUlQoZGF0YSk7CisgIHJldHVybiBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCk7CiB9Ci1zdGF0aWMgRlhfV09SRCBfUmVhZDJCeXRlc0IodWludDhfdCogZGF0YSkKLXsKLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgcmV0dXJuIGRhdGFbMV0gfCAoZGF0YVswXSA8PCA4KTsKK3N0YXRpYyBGWF9XT1JEIF9SZWFkMkJ5dGVzQih1aW50OF90KiBkYXRhKSB7CisgIEFTU0VSVChkYXRhKTsKKyAgcmV0dXJuIGRhdGFbMV0gfCAoZGF0YVswXSA8PCA4KTsKIH0KLXN0YXRpYyBGWF9EV09SRCBfUmVhZDRCeXRlc0wodWludDhfdCogZGF0YSkKLXsKLSAgICByZXR1cm4gX1JlYWQyQnl0ZXNMKGRhdGEpIHwgKF9SZWFkMkJ5dGVzTChkYXRhICsgMikgPDwgMTYpOworc3RhdGljIEZYX0RXT1JEIF9SZWFkNEJ5dGVzTCh1aW50OF90KiBkYXRhKSB7CisgIHJldHVybiBfUmVhZDJCeXRlc0woZGF0YSkgfCAoX1JlYWQyQnl0ZXNMKGRhdGEgKyAyKSA8PCAxNik7CiB9Ci1zdGF0aWMgRlhfRFdPUkQgX1JlYWQ0Qnl0ZXNCKHVpbnQ4X3QqIGRhdGEpCi17Ci0gICAgcmV0dXJuIF9SZWFkMkJ5dGVzQihkYXRhICsgMikgfCAoX1JlYWQyQnl0ZXNCKGRhdGEpIDw8IDE2KTsKK3N0YXRpYyBGWF9EV09SRCBfUmVhZDRCeXRlc0IodWludDhfdCogZGF0YSkgeworICByZXR1cm4gX1JlYWQyQnl0ZXNCKGRhdGEgKyAyKSB8IChfUmVhZDJCeXRlc0IoZGF0YSkgPDwgMTYpOwogfQotdHlwZWRlZiBGWF9XT1JEICgqX1JlYWQyQnl0ZXMpICh1aW50OF90KiBkYXRhKTsKLXR5cGVkZWYgRlhfRFdPUkQgKCpfUmVhZDRCeXRlcykgKHVpbnQ4X3QqIGRhdGEpOwotdHlwZWRlZiB2b2lkICgqX1dyaXRlMkJ5dGVzKSAodWludDhfdCogZGF0YSwgRlhfV09SRCB2YWwpOwotdHlwZWRlZiB2b2lkICgqX1dyaXRlNEJ5dGVzKSAodWludDhfdCogZGF0YSwgRlhfRFdPUkQgdmFsKTsKLXVpbnQ4X3QqIENGWF9ESUJBdHRyaWJ1dGVFeGlmOjpQYXJzZUV4aWZJRkgodWludDhfdCogZGF0YSwgRlhfRFdPUkQgbGVuLCBfUmVhZDJCeXRlcyogcFJlYWRXb3JkLCBfUmVhZDRCeXRlcyogcFJlYWREd29yZCkKLXsKK3R5cGVkZWYgRlhfV09SRCAoKl9SZWFkMkJ5dGVzKSh1aW50OF90KiBkYXRhKTsKK3R5cGVkZWYgRlhfRFdPUkQgKCpfUmVhZDRCeXRlcykodWludDhfdCogZGF0YSk7Cit0eXBlZGVmIHZvaWQgKCpfV3JpdGUyQnl0ZXMpKHVpbnQ4X3QqIGRhdGEsIEZYX1dPUkQgdmFsKTsKK3R5cGVkZWYgdm9pZCAoKl9Xcml0ZTRCeXRlcykodWludDhfdCogZGF0YSwgRlhfRFdPUkQgdmFsKTsKK3VpbnQ4X3QqIENGWF9ESUJBdHRyaWJ1dGVFeGlmOjpQYXJzZUV4aWZJRkgodWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmVhZDJCeXRlcyogcFJlYWRXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmVhZDRCeXRlcyogcFJlYWREd29yZCkgeworICBpZiAobGVuID4gOCkgeworICAgIEZYX0JPT0wgdGFnID0gRkFMU0U7CisgICAgaWYgKEZYU1lTX21lbWNtcChkYXRhLCAiXHg0OVx4NDlceDJhXHgwMCIsIDQpID09IDApIHsKKyAgICAgIGlmIChwUmVhZFdvcmQpIHsKKyAgICAgICAgKnBSZWFkV29yZCA9IF9SZWFkMkJ5dGVzTDsKKyAgICAgIH0KKyAgICAgIGlmIChwUmVhZER3b3JkKSB7CisgICAgICAgICpwUmVhZER3b3JkID0gX1JlYWQ0Qnl0ZXNMOworICAgICAgfQorICAgICAgdGFnID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKEZYU1lTX21lbWNtcChkYXRhLCAiXHg0ZFx4NGRceDAwXHgyYSIsIDQpID09IDApIHsKKyAgICAgIGlmIChwUmVhZFdvcmQpIHsKKyAgICAgICAgKnBSZWFkV29yZCA9IF9SZWFkMkJ5dGVzQjsKKyAgICAgIH0KKyAgICAgIGlmIChwUmVhZER3b3JkKSB7CisgICAgICAgICpwUmVhZER3b3JkID0gX1JlYWQ0Qnl0ZXNCOworICAgICAgfQorICAgICAgdGFnID0gVFJVRTsKKyAgICB9CisgICAgaWYgKHRhZykgeworICAgICAgZGF0YSArPSA0OworICAgICAgaWYgKHBSZWFkRHdvcmQpIHsKKyAgICAgICAgZGF0YSArPSAoKnBSZWFkRHdvcmQpKGRhdGEpLTQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBkYXRhICs9IDQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBkYXRhOworfQorRlhfQk9PTCBDRlhfRElCQXR0cmlidXRlRXhpZjo6UGFyc2VFeGlmSUZEKAorICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgdWludDhfdCo+KiBwTWFwLAorICAgIHVpbnQ4X3QqIGRhdGEsCisgICAgRlhfRFdPUkQgbGVuKSB7CisgIGlmIChwTWFwICYmIGRhdGEpIHsKICAgICBpZiAobGVuID4gOCkgewotICAgICAgICBGWF9CT09MIHRhZyA9IEZBTFNFOwotICAgICAgICBpZiAoRlhTWVNfbWVtY21wKGRhdGEsICJceDQ5XHg0OVx4MmFceDAwIiwgNCkgPT0gMCkgewotICAgICAgICAgICAgaWYgKHBSZWFkV29yZCkgewotICAgICAgICAgICAgICAgICpwUmVhZFdvcmQgPSBfUmVhZDJCeXRlc0w7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocFJlYWREd29yZCkgewotICAgICAgICAgICAgICAgICpwUmVhZER3b3JkID0gX1JlYWQ0Qnl0ZXNMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGFnID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIGlmIChGWFNZU19tZW1jbXAoZGF0YSwgIlx4NGRceDRkXHgwMFx4MmEiLCA0KSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocFJlYWRXb3JkKSB7Ci0gICAgICAgICAgICAgICAgKnBSZWFkV29yZCA9IF9SZWFkMkJ5dGVzQjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwUmVhZER3b3JkKSB7Ci0gICAgICAgICAgICAgICAgKnBSZWFkRHdvcmQgPSBfUmVhZDRCeXRlc0I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YWcgPSBUUlVFOworICAgICAgRlhfV09SRCB3VGFnTnVtID0gbV9yZWFkV29yZChkYXRhKTsKKyAgICAgIGRhdGEgKz0gMjsKKyAgICAgIEZYX0RXT1JEIHdUYWc7CisgICAgICB1aW50OF90KiBidWY7CisgICAgICB3aGlsZSAod1RhZ051bS0tKSB7CisgICAgICAgIHdUYWcgPSBtX3JlYWRXb3JkKGRhdGEpOworICAgICAgICBkYXRhICs9IDI7CisgICAgICAgIGlmICghcE1hcC0+TG9va3VwKHdUYWcsIGJ1ZikpIHsKKyAgICAgICAgICBidWYgPSBGWF9BbGxvYyh1aW50OF90LCAxMCk7CisgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICAgIEZYU1lTX21lbWNweShidWYsIGRhdGEsIDEwKTsKKyAgICAgICAgICBwTWFwLT5TZXRBdCh3VGFnLCBidWYpOwogICAgICAgICB9Ci0gICAgICAgIGlmICh0YWcpIHsKLSAgICAgICAgICAgIGRhdGEgKz0gNDsKLSAgICAgICAgICAgIGlmIChwUmVhZER3b3JkKSB7Ci0gICAgICAgICAgICAgICAgZGF0YSArPSAoKnBSZWFkRHdvcmQpKGRhdGEpIC0gNDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSArPSA0OworICAgICAgICBkYXRhICs9IDEwOworICAgICAgfQorICAgICAgRlhfRFdPUkQgZHdJRkRPZmZzZXQ7CisgICAgICBkd0lGRE9mZnNldCA9IG1fcmVhZER3b3JkKGRhdGEpOworICAgICAgd2hpbGUgKGR3SUZET2Zmc2V0ICYmIGR3SUZET2Zmc2V0IDwgbGVuKSB7CisgICAgICAgIGRhdGEgPSBtX3BFeGlmRGF0YSArIGR3SUZET2Zmc2V0OworICAgICAgICB3VGFnTnVtID0gbV9yZWFkV29yZChkYXRhKTsKKyAgICAgICAgZGF0YSArPSAyOworICAgICAgICB3aGlsZSAod1RhZ051bS0tKSB7CisgICAgICAgICAgd1RhZyA9IG1fcmVhZFdvcmQoZGF0YSk7CisgICAgICAgICAgZGF0YSArPSAyOworICAgICAgICAgIGlmICghcE1hcC0+TG9va3VwKHdUYWcsIGJ1ZikpIHsKKyAgICAgICAgICAgIGJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIDEwKTsKKyAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBGWFNZU19tZW1jcHkoYnVmLCBkYXRhLCAxMCk7CisgICAgICAgICAgICBwTWFwLT5TZXRBdCh3VGFnLCBidWYpOworICAgICAgICAgIH0KKyAgICAgICAgICBkYXRhICs9IDEwOwogICAgICAgICB9CisgICAgICAgIGR3SUZET2Zmc2V0ID0gbV9yZWFkRHdvcmQoZGF0YSk7CisgICAgICB9CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIGRhdGE7Ci19Ci1GWF9CT09MIENGWF9ESUJBdHRyaWJ1dGVFeGlmOjpQYXJzZUV4aWZJRkQoQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCB1aW50OF90Kj4qIHBNYXAsIHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIGxlbikKLXsKLSAgICBpZiAocE1hcCAmJiBkYXRhKSB7Ci0gICAgICAgIGlmIChsZW4gPiA4KSB7Ci0gICAgICAgICAgICBGWF9XT1JEIHdUYWdOdW0gPSBtX3JlYWRXb3JkKGRhdGEpOwotICAgICAgICAgICAgZGF0YSArPSAyOwotICAgICAgICAgICAgRlhfRFdPUkQgd1RhZzsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZjsKLSAgICAgICAgICAgIHdoaWxlICh3VGFnTnVtLS0pIHsKLSAgICAgICAgICAgICAgICB3VGFnID0gbV9yZWFkV29yZChkYXRhKTsKLSAgICAgICAgICAgICAgICBkYXRhICs9IDI7Ci0gICAgICAgICAgICAgICAgaWYgKCFwTWFwLT5Mb29rdXAod1RhZywgYnVmKSkgewotICAgICAgICAgICAgICAgICAgICBidWYgPSBGWF9BbGxvYyh1aW50OF90LCAxMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShidWYsIGRhdGEsIDEwKTsKLSAgICAgICAgICAgICAgICAgICAgcE1hcC0+U2V0QXQod1RhZywgYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGF0YSArPSAxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0RXT1JEIGR3SUZET2Zmc2V0OwotICAgICAgICAgICAgZHdJRkRPZmZzZXQgPSBtX3JlYWREd29yZChkYXRhKTsKLSAgICAgICAgICAgIHdoaWxlIChkd0lGRE9mZnNldCAmJiBkd0lGRE9mZnNldCA8IGxlbikgewotICAgICAgICAgICAgICAgIGRhdGEgPSBtX3BFeGlmRGF0YSArIGR3SUZET2Zmc2V0OwotICAgICAgICAgICAgICAgIHdUYWdOdW0gPSBtX3JlYWRXb3JkKGRhdGEpOwotICAgICAgICAgICAgICAgIGRhdGEgKz0gMjsKLSAgICAgICAgICAgICAgICB3aGlsZSAod1RhZ051bS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdUYWcgPSBtX3JlYWRXb3JkKGRhdGEpOwotICAgICAgICAgICAgICAgICAgICBkYXRhICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcE1hcC0+TG9va3VwKHdUYWcsIGJ1ZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIDEwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShidWYsIGRhdGEsIDEwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBNYXAtPlNldEF0KHdUYWcsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGF0YSArPSAxMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHdJRkRPZmZzZXQgPSBtX3JlYWREd29yZChkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiBlbnVtIEZYX0V4aWZEYXRhVHlwZSB7Ci0gICAgRlhfVW5zaWduZWRCeXRlID0gMSwKLSAgICBGWF9Bc2NTdHJpbmcsCi0gICAgRlhfVW5zaWduZWRTaG9ydCwKLSAgICBGWF9VbnNpZ25lZExvbmcsCi0gICAgRlhfVW5zaWduZWRSYXRpb24sCi0gICAgRlhfU2lnbmVkQnl0ZSwKLSAgICBGWF9VbmRlZmluZWQsCi0gICAgRlhfU2lnbmVkU2hvcnQsCi0gICAgRlhfU2lnbmVkTG9uZywKLSAgICBGWF9TaWduZWRSYXRpb24sCi0gICAgRlhfU2lnbmVkRmxvYXQsCi0gICAgRlhfRG91YmxlRmxvYXQKKyAgRlhfVW5zaWduZWRCeXRlID0gMSwKKyAgRlhfQXNjU3RyaW5nLAorICBGWF9VbnNpZ25lZFNob3J0LAorICBGWF9VbnNpZ25lZExvbmcsCisgIEZYX1Vuc2lnbmVkUmF0aW9uLAorICBGWF9TaWduZWRCeXRlLAorICBGWF9VbmRlZmluZWQsCisgIEZYX1NpZ25lZFNob3J0LAorICBGWF9TaWduZWRMb25nLAorICBGWF9TaWduZWRSYXRpb24sCisgIEZYX1NpZ25lZEZsb2F0LAorICBGWF9Eb3VibGVGbG9hdAogfTsKLUZYX0JPT0wgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWY6OlBhcnNlRXhpZihDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIHVpbnQ4X3QqPiogcEhlYWQsIHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIGxlbiwgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCB1aW50OF90Kj4qIHBWYWwpCi17Ci0gICAgaWYgKHBIZWFkICYmIGRhdGEgJiYgcFZhbCkgewotICAgICAgICBpZiAobGVuID4gOCkgewotICAgICAgICAgICAgdWludDhfdCogb2xkX2RhdGEgPSBkYXRhOwotICAgICAgICAgICAgZGF0YSA9IFBhcnNlRXhpZklGSChkYXRhLCBsZW4sICZtX3JlYWRXb3JkLCAmbV9yZWFkRHdvcmQpOwotICAgICAgICAgICAgaWYgKGRhdGEgPT0gb2xkX2RhdGEpIHsKK0ZYX0JPT0wgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWY6OlBhcnNlRXhpZigKKyAgICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIHVpbnQ4X3QqPiogcEhlYWQsCisgICAgdWludDhfdCogZGF0YSwKKyAgICBGWF9EV09SRCBsZW4sCisgICAgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCB1aW50OF90Kj4qIHBWYWwpIHsKKyAgaWYgKHBIZWFkICYmIGRhdGEgJiYgcFZhbCkgeworICAgIGlmIChsZW4gPiA4KSB7CisgICAgICB1aW50OF90KiBvbGRfZGF0YSA9IGRhdGE7CisgICAgICBkYXRhID0gUGFyc2VFeGlmSUZIKGRhdGEsIGxlbiwgJm1fcmVhZFdvcmQsICZtX3JlYWREd29yZCk7CisgICAgICBpZiAoZGF0YSA9PSBvbGRfZGF0YSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAocEhlYWQtPkdldENvdW50KCkgPT0gMCkgeworICAgICAgICBpZiAoIVBhcnNlRXhpZklGRChwSGVhZCwgZGF0YSwgbGVuKSkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgRlhfRFdPUkQgZHdNb2R1bGVOdW07CisgICAgICBGWF9XT1JEIHR5cGU7CisgICAgICBGWF9EV09SRCBkd1NpemU7CisgICAgICBGWF9EV09SRCB0YWc7CisgICAgICB1aW50OF90KiBoZWFkOworICAgICAgRlhfUE9TSVRJT04gcG9zID0gcEhlYWQtPkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgICAgIHdoaWxlIChwb3MpIHsKKyAgICAgICAgcEhlYWQtPkdldE5leHRBc3NvYyhwb3MsIHRhZywgaGVhZCk7CisgICAgICAgIHVpbnQ4X3QqIHZhbCA9IE5VTEw7CisgICAgICAgIHVpbnQ4X3QqIGJ1ZiA9IE5VTEw7CisgICAgICAgIHVpbnQ4X3QqIHRlbXAgPSBOVUxMOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaWYgKGhlYWQpIHsKKyAgICAgICAgICB0eXBlID0gbV9yZWFkV29yZChoZWFkKTsKKyAgICAgICAgICBoZWFkICs9IDI7CisgICAgICAgICAgZHdNb2R1bGVOdW0gPSBtX3JlYWREd29yZChoZWFkKTsKKyAgICAgICAgICBoZWFkICs9IDQ7CisgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIEZYX1Vuc2lnbmVkQnl0ZToKKyAgICAgICAgICAgIGNhc2UgRlhfQXNjU3RyaW5nOgorICAgICAgICAgICAgY2FzZSBGWF9TaWduZWRCeXRlOgorICAgICAgICAgICAgY2FzZSBGWF9VbmRlZmluZWQ6CisgICAgICAgICAgICAgIGR3U2l6ZSA9IGR3TW9kdWxlTnVtOworICAgICAgICAgICAgICB2YWwgPSBGWF9BbGxvYyh1aW50OF90LCBkd1NpemUpOworICAgICAgICAgICAgICBpZiAodmFsID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocEhlYWQtPkdldENvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmICghUGFyc2VFeGlmSUZEKHBIZWFkLCBkYXRhLCBsZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9EV09SRCBkd01vZHVsZU51bTsKLSAgICAgICAgICAgIEZYX1dPUkQgdHlwZTsKLSAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZTsKLSAgICAgICAgICAgIEZYX0RXT1JEIHRhZzsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGhlYWQ7Ci0gICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwSGVhZC0+R2V0U3RhcnRQb3NpdGlvbigpOwotICAgICAgICAgICAgd2hpbGUgKHBvcykgewotICAgICAgICAgICAgICAgIHBIZWFkLT5HZXROZXh0QXNzb2MocG9zLCB0YWcsIGhlYWQpOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZhbCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgdWludDhfdCogYnVmID0gTlVMTDsKLSAgICAgICAgICAgICAgICB1aW50OF90KiB0ZW1wID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgICAgICBpZiAoaGVhZCkgewotICAgICAgICAgICAgICAgICAgICB0eXBlID0gbV9yZWFkV29yZChoZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgaGVhZCArPSAyOwotICAgICAgICAgICAgICAgICAgICBkd01vZHVsZU51bSA9IG1fcmVhZER3b3JkKGhlYWQpOwotICAgICAgICAgICAgICAgICAgICBoZWFkICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9VbnNpZ25lZEJ5dGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYX0FzY1N0cmluZzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhfU2lnbmVkQnl0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhfVW5kZWZpbmVkOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U2l6ZSA9IGR3TW9kdWxlTnVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEZYX0FsbG9jKHVpbnQ4X3QsIGR3U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR3U2l6ZSA+IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHZhbCwgb2xkX2RhdGEgKyBtX3JlYWREd29yZChoZWFkKSwgZHdTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkodmFsLCBoZWFkLCBkd1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhfVW5zaWduZWRTaG9ydDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhfU2lnbmVkU2hvcnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTaXplID0gZHdNb2R1bGVOdW0gPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBGWF9BbGxvYyh1aW50OF90LCBkd1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkd1NpemUgPiA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweSh2YWwsIG9sZF9kYXRhICsgbV9yZWFkRHdvcmQoaGVhZCksIGR3U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHZhbCwgaGVhZCwgZHdTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gdmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IChpbnQpZHdNb2R1bGVOdW07IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9XT1JEKilidWYgPSBtX3JlYWRXb3JkKGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhfVW5zaWduZWRMb25nOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9TaWduZWRMb25nOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9TaWduZWRGbG9hdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1NpemUgPSBkd01vZHVsZU51bSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEZYX0FsbG9jKHVpbnQ4X3QsIGR3U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR3U2l6ZSA+IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHZhbCwgb2xkX2RhdGEgKyBtX3JlYWREd29yZChoZWFkKSwgZHdTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkodmFsLCBoZWFkLCBkd1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSB2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgKGludClkd01vZHVsZU51bTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilidWYgPSBtX3JlYWREd29yZChidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYX1Vuc2lnbmVkUmF0aW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9TaWduZWRSYXRpb246IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTaXplID0gZHdNb2R1bGVOdW0gPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gRlhfQWxsb2ModWludDhfdCwgZHdTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR3U2l6ZSA+IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShidWYsIG9sZF9kYXRhICsgbV9yZWFkRHdvcmQoaGVhZCksIGR3U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkoYnVmLCBoZWFkLCBkd1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBidWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEZYX0FsbG9jKHVpbnQ4X3QsIGR3U2l6ZSAvIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAoaW50KWR3TW9kdWxlTnVtOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKil0ZW1wID0gbV9yZWFkRHdvcmQodGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKikodGVtcCArIDQpID0gbV9yZWFkRHdvcmQodGVtcCArIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGxOdW1lcmF0b3IgPSAoRlhfRFdPUkQqKXRlbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogbE5lbm9taW5hdG9yID0gKEZYX0RXT1JEKikodGVtcCArIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9GTE9BVCopKHZhbCArIGkgKiA0KSA9IChGWF9GTE9BVCkoKmxOdW1lcmF0b3IpIC8gKEZYX0ZMT0FUKSgqbE5lbm9taW5hdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9Eb3VibGVGbG9hdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1NpemUgPSBkd01vZHVsZU51bSA8PCAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEZYX0FsbG9jKHVpbnQ4X3QsIGR3U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR3U2l6ZSA+IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHZhbCwgb2xkX2RhdGEgKyBtX3JlYWREd29yZChoZWFkKSwgZHdTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkodmFsLCBoZWFkLCBkd1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSB2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgKGludClkd01vZHVsZU51bTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilidWYgPSBtX3JlYWREd29yZChidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKikoYnVmICsgNCkgPSBtX3JlYWREd29yZChidWYgKyA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFZhbC0+U2V0QXQodGFnLCB2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKGR3U2l6ZSA+IDQpIHsKKyAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkodmFsLCBvbGRfZGF0YSArIG1fcmVhZER3b3JkKGhlYWQpLCBkd1NpemUpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweSh2YWwsIGhlYWQsIGR3U2l6ZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZYX1Vuc2lnbmVkU2hvcnQ6CisgICAgICAgICAgICBjYXNlIEZYX1NpZ25lZFNob3J0OgorICAgICAgICAgICAgICBkd1NpemUgPSBkd01vZHVsZU51bSA8PCAxOworICAgICAgICAgICAgICB2YWwgPSBGWF9BbGxvYyh1aW50OF90LCBkd1NpemUpOworICAgICAgICAgICAgICBpZiAodmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKGR3U2l6ZSA+IDQpIHsKKyAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkodmFsLCBvbGRfZGF0YSArIG1fcmVhZER3b3JkKGhlYWQpLCBkd1NpemUpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweSh2YWwsIGhlYWQsIGR3U2l6ZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnVmID0gdmFsOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClkd01vZHVsZU51bTsgaSsrKSB7CisgICAgICAgICAgICAgICAgKihGWF9XT1JEKilidWYgPSBtX3JlYWRXb3JkKGJ1Zik7CisgICAgICAgICAgICAgICAgYnVmICs9IDI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZYX1Vuc2lnbmVkTG9uZzoKKyAgICAgICAgICAgIGNhc2UgRlhfU2lnbmVkTG9uZzoKKyAgICAgICAgICAgIGNhc2UgRlhfU2lnbmVkRmxvYXQ6CisgICAgICAgICAgICAgIGR3U2l6ZSA9IGR3TW9kdWxlTnVtIDw8IDI7CisgICAgICAgICAgICAgIHZhbCA9IEZYX0FsbG9jKHVpbnQ4X3QsIGR3U2l6ZSk7CisgICAgICAgICAgICAgIGlmICh2YWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoZHdTaXplID4gNCkgeworICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweSh2YWwsIG9sZF9kYXRhICsgbV9yZWFkRHdvcmQoaGVhZCksIGR3U2l6ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHZhbCwgaGVhZCwgZHdTaXplKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBidWYgPSB2YWw7CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWR3TW9kdWxlTnVtOyBpKyspIHsKKyAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilidWYgPSBtX3JlYWREd29yZChidWYpOworICAgICAgICAgICAgICAgIGJ1ZiArPSA0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGWF9VbnNpZ25lZFJhdGlvbjoKKyAgICAgICAgICAgIGNhc2UgRlhfU2lnbmVkUmF0aW9uOiB7CisgICAgICAgICAgICAgIGR3U2l6ZSA9IGR3TW9kdWxlTnVtIDw8IDM7CisgICAgICAgICAgICAgIGJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGR3U2l6ZSk7CisgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoZHdTaXplID4gNCkgeworICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShidWYsIG9sZF9kYXRhICsgbV9yZWFkRHdvcmQoaGVhZCksIGR3U2l6ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGJ1ZiwgaGVhZCwgZHdTaXplKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB0ZW1wID0gYnVmOworICAgICAgICAgICAgICB2YWwgPSBGWF9BbGxvYyh1aW50OF90LCBkd1NpemUgLyAyKTsKKyAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgRlhfRnJlZShidWYpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClkd01vZHVsZU51bTsgaSsrKSB7CisgICAgICAgICAgICAgICAgKihGWF9EV09SRCopdGVtcCA9IG1fcmVhZER3b3JkKHRlbXApOworICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKSh0ZW1wICsgNCkgPSBtX3JlYWREd29yZCh0ZW1wICsgNCk7CisgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGxOdW1lcmF0b3IgPSAoRlhfRFdPUkQqKXRlbXA7CisgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGxOZW5vbWluYXRvciA9IChGWF9EV09SRCopKHRlbXAgKyA0KTsKKyAgICAgICAgICAgICAgICAqKEZYX0ZMT0FUKikodmFsICsgaSAqIDQpID0KKyAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKSgqbE51bWVyYXRvcikgLyAoRlhfRkxPQVQpKCpsTmVub21pbmF0b3IpOworICAgICAgICAgICAgICAgIHRlbXAgKz0gODsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBGWF9GcmVlKGJ1Zik7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBGWF9Eb3VibGVGbG9hdDoKKyAgICAgICAgICAgICAgZHdTaXplID0gZHdNb2R1bGVOdW0gPDwgMzsKKyAgICAgICAgICAgICAgdmFsID0gRlhfQWxsb2ModWludDhfdCwgZHdTaXplKTsKKyAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChkd1NpemUgPiA0KSB7CisgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHZhbCwgb2xkX2RhdGEgKyBtX3JlYWREd29yZChoZWFkKSwgZHdTaXplKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkodmFsLCBoZWFkLCBkd1NpemUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJ1ZiA9IHZhbDsKKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpZHdNb2R1bGVOdW07IGkrKykgeworICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWJ1ZiA9IG1fcmVhZER3b3JkKGJ1Zik7CisgICAgICAgICAgICAgICAgKihGWF9EV09SRCopKGJ1ZiArIDQpID0gbV9yZWFkRHdvcmQoYnVmICsgNCk7CisgICAgICAgICAgICAgICAgYnVmICs9IDg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHBWYWwtPlNldEF0KHRhZywgdmFsKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotI2RlZmluZSBGWEVYSUZfSU5GT0NPTlZFUlQoVCkge1QqIHNyYyA9IChUKilwdHI7CVQqIGRzdCA9IChUKil2YWw7CSpkc3QgPSAqc3JjO30KLUZYX0JPT0wgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWY6OkdldEluZm8oIEZYX1dPUkQgdGFnLCB2b2lkKiB2YWwgKQotewotICAgIGlmIChtX1RhZ1ZhbC5HZXRDb3VudCgpID09IDApIHsKLSAgICAgICAgaWYgKCFQYXJzZUV4aWYoJm1fVGFnSGVhZCwgbV9wRXhpZkRhdGEsIG1fZHdFeGlmRGF0YUxlbiwgJm1fVGFnVmFsKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CisjZGVmaW5lIEZYRVhJRl9JTkZPQ09OVkVSVChUKSBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVCogc3JjID0gKFQqKXB0cjsgICAgICAgICBcCisgICAgVCogZHN0ID0gKFQqKXZhbDsgICAgICAgICBcCisgICAgKmRzdCA9ICpzcmM7ICAgICAgICAgICAgICBcCisgIH0KK0ZYX0JPT0wgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWY6OkdldEluZm8oRlhfV09SRCB0YWcsIHZvaWQqIHZhbCkgeworICBpZiAobV9UYWdWYWwuR2V0Q291bnQoKSA9PSAwKSB7CisgICAgaWYgKCFQYXJzZUV4aWYoJm1fVGFnSGVhZCwgbV9wRXhpZkRhdGEsIG1fZHdFeGlmRGF0YUxlbiwgJm1fVGFnVmFsKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICB1aW50OF90KiBwdHIgPSBOVUxMOwotICAgIGlmIChtX1RhZ1ZhbC5Mb29rdXAodGFnLCBwdHIpKSB7Ci0gICAgICAgIHN3aXRjaCAodGFnKSB7Ci0gICAgICAgICAgICBjYXNlIEVYSUZUQUdfVVNIT1JUX1JFU1VOSVQ6Ci0gICAgICAgICAgICAgICAgRlhFWElGX0lORk9DT05WRVJUKEZYX1dPUkQpOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfV09SRCogcHRyID0gKEZYX1dPUkQqKXZhbDsKLSAgICAgICAgICAgICAgICAgICAgKnB0ciAtPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRVhJRlRBR19GTE9BVF9EUElYOgotICAgICAgICAgICAgY2FzZSBFWElGVEFHX0ZMT0FUX0RQSVk6Ci0gICAgICAgICAgICAgICAgRlhFWElGX0lORk9DT05WRVJUKEZYX0ZMT0FUKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRVhJRlRBR19VU0hPUlRfT1JJRU5UQVRJT046Ci0gICAgICAgICAgICAgICAgRlhFWElGX0lORk9DT05WRVJUKEZYX1dPUkQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZHN0ID0gKHVpbnQ4X3QqKil2YWw7Ci0gICAgICAgICAgICAgICAgICAgICpkc3QgPSBwdHI7Ci0gICAgICAgICAgICAgICAgfQorICB9CisgIHVpbnQ4X3QqIHB0ciA9IE5VTEw7CisgIGlmIChtX1RhZ1ZhbC5Mb29rdXAodGFnLCBwdHIpKSB7CisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgIGNhc2UgRVhJRlRBR19VU0hPUlRfUkVTVU5JVDoKKyAgICAgICAgRlhFWElGX0lORk9DT05WRVJUKEZYX1dPUkQpOworICAgICAgICB7CisgICAgICAgICAgRlhfV09SRCogcHRyID0gKEZYX1dPUkQqKXZhbDsKKyAgICAgICAgICAqcHRyIC09IDE7CiAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVYSUZUQUdfRkxPQVRfRFBJWDoKKyAgICAgIGNhc2UgRVhJRlRBR19GTE9BVF9EUElZOgorICAgICAgICBGWEVYSUZfSU5GT0NPTlZFUlQoRlhfRkxPQVQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRVhJRlRBR19VU0hPUlRfT1JJRU5UQVRJT046CisgICAgICAgIEZYRVhJRl9JTkZPQ09OVkVSVChGWF9XT1JEKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIHVpbnQ4X3QqKiBkc3QgPSAodWludDhfdCoqKXZhbDsKKyAgICAgICAgKmRzdCA9IHB0cjsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1jbGFzcyBDQ29kZWNfUkxTY2FubGluZURlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcgotewotcHVibGljOgotICAgIENDb2RlY19STFNjYW5saW5lRGVjb2RlcigpOwotICAgIHZpcnR1YWwgfkNDb2RlY19STFNjYW5saW5lRGVjb2RlcigpOwotICAgIEZYX0JPT0wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIGludCBicGMpOwotICAgIHZpcnR1YWwgdm9pZAkJdl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkge30KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfUmV3aW5kKCk7Ci0gICAgdmlydHVhbCB1aW50OF90Kgl2X0dldE5leHRMaW5lKCk7Ci0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRTcmNPZmZzZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU3JjT2Zmc2V0OwotICAgIH0KLXByb3RlY3RlZDoKLSAgICBGWF9CT09MCQkJCUNoZWNrRGVzdFNpemUoKTsKLSAgICB2b2lkCQkJCUdldE5leHRPcGVyYXRvcigpOwotICAgIHZvaWQJCQkJVXBkYXRlT3BlcmF0b3IodWludDhfdCB1c2VkX2J5dGVzKTsKK2NsYXNzIENDb2RlY19STFNjYW5saW5lRGVjb2RlciA6IHB1YmxpYyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyIHsKKyBwdWJsaWM6CisgIENDb2RlY19STFNjYW5saW5lRGVjb2RlcigpOworICB2aXJ0dWFsIH5DQ29kZWNfUkxTY2FubGluZURlY29kZXIoKTsKKyAgRlhfQk9PTCBDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgaW50IG5Db21wcywKKyAgICAgICAgICAgICAgICAgaW50IGJwYyk7CisgIHZpcnR1YWwgdm9pZCB2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgdl9SZXdpbmQoKTsKKyAgdmlydHVhbCB1aW50OF90KiB2X0dldE5leHRMaW5lKCk7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0U3JjT2Zmc2V0KCkgeyByZXR1cm4gbV9TcmNPZmZzZXQ7IH0KIAotICAgIHVpbnQ4X3QqCQkJbV9wU2NhbmxpbmU7Ci0gICAgY29uc3QgdWludDhfdCoJCQltX3BTcmNCdWY7Ci0gICAgRlhfRFdPUkQJCQltX1NyY1NpemU7Ci0gICAgRlhfRFdPUkQJCQltX2R3TGluZUJ5dGVzOwotICAgIEZYX0RXT1JECQkJbV9TcmNPZmZzZXQ7Ci0gICAgRlhfQk9PTAkJCQltX2JFT0Q7Ci0gICAgdWludDhfdAkJCQltX09wZXJhdG9yOworIHByb3RlY3RlZDoKKyAgRlhfQk9PTCBDaGVja0Rlc3RTaXplKCk7CisgIHZvaWQgR2V0TmV4dE9wZXJhdG9yKCk7CisgIHZvaWQgVXBkYXRlT3BlcmF0b3IodWludDhfdCB1c2VkX2J5dGVzKTsKKworICB1aW50OF90KiBtX3BTY2FubGluZTsKKyAgY29uc3QgdWludDhfdCogbV9wU3JjQnVmOworICBGWF9EV09SRCBtX1NyY1NpemU7CisgIEZYX0RXT1JEIG1fZHdMaW5lQnl0ZXM7CisgIEZYX0RXT1JEIG1fU3JjT2Zmc2V0OworICBGWF9CT09MIG1fYkVPRDsKKyAgdWludDhfdCBtX09wZXJhdG9yOwogfTsKIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6Q0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyKCkKLSAgICA6IG1fcFNjYW5saW5lKE5VTEwpCi0gICAgLCBtX3BTcmNCdWYoTlVMTCkKLSAgICAsIG1fU3JjU2l6ZSgwKQotICAgICwgbV9kd0xpbmVCeXRlcygwKQotICAgICwgbV9TcmNPZmZzZXQoMCkKLSAgICAsIG1fYkVPRChGQUxTRSkKLSAgICAsIG1fT3BlcmF0b3IoMCkKLXsKKyAgICA6IG1fcFNjYW5saW5lKE5VTEwpLAorICAgICAgbV9wU3JjQnVmKE5VTEwpLAorICAgICAgbV9TcmNTaXplKDApLAorICAgICAgbV9kd0xpbmVCeXRlcygwKSwKKyAgICAgIG1fU3JjT2Zmc2V0KDApLAorICAgICAgbV9iRU9EKEZBTFNFKSwKKyAgICAgIG1fT3BlcmF0b3IoMCkge30KK0NDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6fkNDb2RlY19STFNjYW5saW5lRGVjb2RlcigpIHsKKyAgaWYgKG1fcFNjYW5saW5lKSB7CisgICAgRlhfRnJlZShtX3BTY2FubGluZSk7CisgIH0KIH0KLUNDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6fkNDb2RlY19STFNjYW5saW5lRGVjb2RlcigpCi17Ci0gICAgaWYgKG1fcFNjYW5saW5lKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wU2NhbmxpbmUpOwotICAgIH0KLX0KLUZYX0JPT0wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjpDaGVja0Rlc3RTaXplKCkKLXsKLSAgICBGWF9EV09SRCBpID0gMDsKLSAgICBGWF9EV09SRCBvbGRfc2l6ZSA9IDA7Ci0gICAgRlhfRFdPUkQgZGVzdF9zaXplID0gMDsKLSAgICB3aGlsZSAoaSA8IG1fU3JjU2l6ZSkgewotICAgICAgICBpZiAobV9wU3JjQnVmW2ldIDwgMTI4KSB7Ci0gICAgICAgICAgICBvbGRfc2l6ZSA9IGRlc3Rfc2l6ZTsKLSAgICAgICAgICAgIGRlc3Rfc2l6ZSArPSBtX3BTcmNCdWZbaV0gKyAxOwotICAgICAgICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSArPSBtX3BTcmNCdWZbaV0gKyAyOwotICAgICAgICB9IGVsc2UgaWYgKG1fcFNyY0J1ZltpXSA+IDEyOCkgewotICAgICAgICAgICAgb2xkX3NpemUgPSBkZXN0X3NpemU7Ci0gICAgICAgICAgICBkZXN0X3NpemUgKz0gMjU3IC0gbV9wU3JjQnVmW2ldOwotICAgICAgICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSArPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCgoRlhfRFdPUkQpbV9PcmlnV2lkdGggKiBtX25Db21wcyAqIG1fYnBjICogbV9PcmlnSGVpZ2h0ICsgNykgLyA4ID4gZGVzdF9zaXplKSB7CitGWF9CT09MIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6Q2hlY2tEZXN0U2l6ZSgpIHsKKyAgRlhfRFdPUkQgaSA9IDA7CisgIEZYX0RXT1JEIG9sZF9zaXplID0gMDsKKyAgRlhfRFdPUkQgZGVzdF9zaXplID0gMDsKKyAgd2hpbGUgKGkgPCBtX1NyY1NpemUpIHsKKyAgICBpZiAobV9wU3JjQnVmW2ldIDwgMTI4KSB7CisgICAgICBvbGRfc2l6ZSA9IGRlc3Rfc2l6ZTsKKyAgICAgIGRlc3Rfc2l6ZSArPSBtX3BTcmNCdWZbaV0gKyAxOworICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZF9zaXplKSB7CiAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6Q3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIGludCBicGMpCi17Ci0gICAgbV9wU3JjQnVmID0gc3JjX2J1ZjsKLSAgICBtX1NyY1NpemUgPSBzcmNfc2l6ZTsKLSAgICBtX091dHB1dFdpZHRoID0gbV9PcmlnV2lkdGggPSB3aWR0aDsKLSAgICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodCA9IGhlaWdodDsKLSAgICBtX25Db21wcyA9IG5Db21wczsKLSAgICBtX2JwYyA9IGJwYzsKLSAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gRkFMU0U7Ci0gICAgbV9Eb3duU2NhbGUgPSAxOwotICAgIG1fUGl0Y2ggPSAod2lkdGggKiBuQ29tcHMgKiBicGMgKyAzMSkgLyAzMiAqIDQ7Ci0gICAgbV9kd0xpbmVCeXRlcyA9ICh3aWR0aCAqIG5Db21wcyAqIGJwYyArIDcpIC8gODsKLSAgICBtX3BTY2FubGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOwotICAgIHJldHVybiBDaGVja0Rlc3RTaXplKCk7Ci19Ci1GWF9CT09MIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6dl9SZXdpbmQoKQotewotICAgIEZYU1lTX21lbXNldChtX3BTY2FubGluZSwgMCwgbV9QaXRjaCk7Ci0gICAgbV9TcmNPZmZzZXQgPSAwOwotICAgIG1fYkVPRCA9IEZBTFNFOwotICAgIG1fT3BlcmF0b3IgPSAwOwotICAgIHJldHVybiBUUlVFOwotfQotdWludDhfdCogQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjp2X0dldE5leHRMaW5lKCkKLXsKLSAgICBpZiAobV9TcmNPZmZzZXQgPT0gMCkgewotICAgICAgICBHZXROZXh0T3BlcmF0b3IoKTsKKyAgICAgIH0KKyAgICAgIGkgKz0gbV9wU3JjQnVmW2ldICsgMjsKKyAgICB9IGVsc2UgaWYgKG1fcFNyY0J1ZltpXSA+IDEyOCkgeworICAgICAgb2xkX3NpemUgPSBkZXN0X3NpemU7CisgICAgICBkZXN0X3NpemUgKz0gMjU3IC0gbV9wU3JjQnVmW2ldOworICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZF9zaXplKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGkgKz0gMjsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAobV9iRU9EKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgfQotICAgIEZYU1lTX21lbXNldChtX3BTY2FubGluZSwgMCwgbV9QaXRjaCk7Ci0gICAgRlhfRFdPUkQgY29sX3BvcyA9IDA7Ci0gICAgRlhfQk9PTAllb2wgPSBGQUxTRTsKLSAgICB3aGlsZSAobV9TcmNPZmZzZXQgPCBtX1NyY1NpemUgJiYgIWVvbCkgewotICAgICAgICBpZiAobV9PcGVyYXRvciA8IDEyOCkgewotICAgICAgICAgICAgRlhfRFdPUkQgY29weV9sZW4gPSBtX09wZXJhdG9yICsgMTsKLSAgICAgICAgICAgIGlmIChjb2xfcG9zICsgY29weV9sZW4gPj0gbV9kd0xpbmVCeXRlcykgewotICAgICAgICAgICAgICAgIGNvcHlfbGVuID0gbV9kd0xpbmVCeXRlcyAtIGNvbF9wb3M7Ci0gICAgICAgICAgICAgICAgZW9sID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb3B5X2xlbiA+PSBtX1NyY1NpemUgLSBtX1NyY09mZnNldCkgewotICAgICAgICAgICAgICAgIGNvcHlfbGVuID0gbV9TcmNTaXplIC0gbV9TcmNPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbV9iRU9EID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYU1lTX21lbWNweShtX3BTY2FubGluZSArIGNvbF9wb3MsIG1fcFNyY0J1ZiArIG1fU3JjT2Zmc2V0LCBjb3B5X2xlbik7Ci0gICAgICAgICAgICBjb2xfcG9zICs9IGNvcHlfbGVuOwotICAgICAgICAgICAgVXBkYXRlT3BlcmF0b3IoKHVpbnQ4X3QpY29weV9sZW4pOwotICAgICAgICB9IGVsc2UgaWYgKG1fT3BlcmF0b3IgPiAxMjgpIHsKLSAgICAgICAgICAgIGludCBmaWxsID0gMDsKLSAgICAgICAgICAgIGlmIChtX1NyY09mZnNldCAtIDEgPCBtX1NyY1NpemUgLSAxKSB7Ci0gICAgICAgICAgICAgICAgZmlsbCA9IG1fcFNyY0J1ZlttX1NyY09mZnNldF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9EV09SRCBkdXBsaWNhdGVfbGVuID0gMjU3IC0gbV9PcGVyYXRvcjsKLSAgICAgICAgICAgIGlmIChjb2xfcG9zICsgZHVwbGljYXRlX2xlbiA+PSBtX2R3TGluZUJ5dGVzKSB7Ci0gICAgICAgICAgICAgICAgZHVwbGljYXRlX2xlbiA9IG1fZHdMaW5lQnl0ZXMgLSBjb2xfcG9zOwotICAgICAgICAgICAgICAgIGVvbCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQobV9wU2NhbmxpbmUgKyBjb2xfcG9zLCBmaWxsLCBkdXBsaWNhdGVfbGVuKTsKLSAgICAgICAgICAgIGNvbF9wb3MgKz0gZHVwbGljYXRlX2xlbjsKLSAgICAgICAgICAgIFVwZGF0ZU9wZXJhdG9yKCh1aW50OF90KWR1cGxpY2F0ZV9sZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9iRU9EID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX3BTY2FubGluZTsKKyAgfQorICBpZiAoKChGWF9EV09SRCltX09yaWdXaWR0aCAqIG1fbkNvbXBzICogbV9icGMgKiBtX09yaWdIZWlnaHQgKyA3KSAvIDggPgorICAgICAgZGVzdF9zaXplKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OkdldE5leHRPcGVyYXRvcigpCi17Ci0gICAgaWYgKG1fU3JjT2Zmc2V0ID49IG1fU3JjU2l6ZSkgewotICAgICAgICBtX09wZXJhdG9yID0gMTI4OwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fT3BlcmF0b3IgPSBtX3BTcmNCdWZbbV9TcmNPZmZzZXRdOwotICAgIG1fU3JjT2Zmc2V0ICsrOworRlhfQk9PTCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OkNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBjKSB7CisgIG1fcFNyY0J1ZiA9IHNyY19idWY7CisgIG1fU3JjU2l6ZSA9IHNyY19zaXplOworICBtX091dHB1dFdpZHRoID0gbV9PcmlnV2lkdGggPSB3aWR0aDsKKyAgbV9PdXRwdXRIZWlnaHQgPSBtX09yaWdIZWlnaHQgPSBoZWlnaHQ7CisgIG1fbkNvbXBzID0gbkNvbXBzOworICBtX2JwYyA9IGJwYzsKKyAgbV9iQ29sb3JUcmFuc2Zvcm1lZCA9IEZBTFNFOworICBtX0Rvd25TY2FsZSA9IDE7CisgIG1fUGl0Y2ggPSAod2lkdGggKiBuQ29tcHMgKiBicGMgKyAzMSkgLyAzMiAqIDQ7CisgIG1fZHdMaW5lQnl0ZXMgPSAod2lkdGggKiBuQ29tcHMgKiBicGMgKyA3KSAvIDg7CisgIG1fcFNjYW5saW5lID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7CisgIHJldHVybiBDaGVja0Rlc3RTaXplKCk7CiB9Ci12b2lkIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6VXBkYXRlT3BlcmF0b3IodWludDhfdCB1c2VkX2J5dGVzKQotewotICAgIGlmICh1c2VkX2J5dGVzID09IDApIHsKLSAgICAgICAgcmV0dXJuOworRlhfQk9PTCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OnZfUmV3aW5kKCkgeworICBGWFNZU19tZW1zZXQobV9wU2NhbmxpbmUsIDAsIG1fUGl0Y2gpOworICBtX1NyY09mZnNldCA9IDA7CisgIG1fYkVPRCA9IEZBTFNFOworICBtX09wZXJhdG9yID0gMDsKKyAgcmV0dXJuIFRSVUU7Cit9Cit1aW50OF90KiBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OnZfR2V0TmV4dExpbmUoKSB7CisgIGlmIChtX1NyY09mZnNldCA9PSAwKSB7CisgICAgR2V0TmV4dE9wZXJhdG9yKCk7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fYkVPRCkgeworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICB9CisgIEZYU1lTX21lbXNldChtX3BTY2FubGluZSwgMCwgbV9QaXRjaCk7CisgIEZYX0RXT1JEIGNvbF9wb3MgPSAwOworICBGWF9CT09MIGVvbCA9IEZBTFNFOworICB3aGlsZSAobV9TcmNPZmZzZXQgPCBtX1NyY1NpemUgJiYgIWVvbCkgewogICAgIGlmIChtX09wZXJhdG9yIDwgMTI4KSB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydCgoRlhfRFdPUkQpbV9PcGVyYXRvciArIDEgPj0gdXNlZF9ieXRlcyk7Ci0gICAgICAgIGlmICh1c2VkX2J5dGVzID09IG1fT3BlcmF0b3IgKyAxKSB7Ci0gICAgICAgICAgICBtX1NyY09mZnNldCArPSB1c2VkX2J5dGVzOwotICAgICAgICAgICAgR2V0TmV4dE9wZXJhdG9yKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbV9PcGVyYXRvciAtPSB1c2VkX2J5dGVzOwotICAgICAgICBtX1NyY09mZnNldCArPSB1c2VkX2J5dGVzOwotICAgICAgICBpZiAobV9TcmNPZmZzZXQgPj0gbV9TcmNTaXplKSB7Ci0gICAgICAgICAgICBtX09wZXJhdG9yID0gMTI4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKKyAgICAgIEZYX0RXT1JEIGNvcHlfbGVuID0gbV9PcGVyYXRvciArIDE7CisgICAgICBpZiAoY29sX3BvcyArIGNvcHlfbGVuID49IG1fZHdMaW5lQnl0ZXMpIHsKKyAgICAgICAgY29weV9sZW4gPSBtX2R3TGluZUJ5dGVzIC0gY29sX3BvczsKKyAgICAgICAgZW9sID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGlmIChjb3B5X2xlbiA+PSBtX1NyY1NpemUgLSBtX1NyY09mZnNldCkgeworICAgICAgICBjb3B5X2xlbiA9IG1fU3JjU2l6ZSAtIG1fU3JjT2Zmc2V0OworICAgICAgICBtX2JFT0QgPSBUUlVFOworICAgICAgfQorICAgICAgRlhTWVNfbWVtY3B5KG1fcFNjYW5saW5lICsgY29sX3BvcywgbV9wU3JjQnVmICsgbV9TcmNPZmZzZXQsIGNvcHlfbGVuKTsKKyAgICAgIGNvbF9wb3MgKz0gY29weV9sZW47CisgICAgICBVcGRhdGVPcGVyYXRvcigodWludDhfdCljb3B5X2xlbik7CisgICAgfSBlbHNlIGlmIChtX09wZXJhdG9yID4gMTI4KSB7CisgICAgICBpbnQgZmlsbCA9IDA7CisgICAgICBpZiAobV9TcmNPZmZzZXQgLSAxIDwgbV9TcmNTaXplIC0gMSkgeworICAgICAgICBmaWxsID0gbV9wU3JjQnVmW21fU3JjT2Zmc2V0XTsKKyAgICAgIH0KKyAgICAgIEZYX0RXT1JEIGR1cGxpY2F0ZV9sZW4gPSAyNTcgLSBtX09wZXJhdG9yOworICAgICAgaWYgKGNvbF9wb3MgKyBkdXBsaWNhdGVfbGVuID49IG1fZHdMaW5lQnl0ZXMpIHsKKyAgICAgICAgZHVwbGljYXRlX2xlbiA9IG1fZHdMaW5lQnl0ZXMgLSBjb2xfcG9zOworICAgICAgICBlb2wgPSBUUlVFOworICAgICAgfQorICAgICAgRlhTWVNfbWVtc2V0KG1fcFNjYW5saW5lICsgY29sX3BvcywgZmlsbCwgZHVwbGljYXRlX2xlbik7CisgICAgICBjb2xfcG9zICs9IGR1cGxpY2F0ZV9sZW47CisgICAgICBVcGRhdGVPcGVyYXRvcigodWludDhfdClkdXBsaWNhdGVfbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9iRU9EID0gVFJVRTsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICB1aW50OF90IGNvdW50ID0gMjU3IC0gbV9PcGVyYXRvcjsKLSAgICBGWFNZU19hc3NlcnQoKEZYX0RXT1JEKWNvdW50ID49IHVzZWRfYnl0ZXMpOwotICAgIGlmICh1c2VkX2J5dGVzID09IGNvdW50KSB7Ci0gICAgICAgIG1fU3JjT2Zmc2V0ICsrOwotICAgICAgICBHZXROZXh0T3BlcmF0b3IoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjb3VudCAtPSB1c2VkX2J5dGVzOwotICAgIG1fT3BlcmF0b3IgPSAyNTcgLSBjb3VudDsKKyAgfQorICByZXR1cm4gbV9wU2NhbmxpbmU7CiB9Ci1JQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBDQ29kZWNfQmFzaWNNb2R1bGU6OkNyZWF0ZVJ1bkxlbmd0aERlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgaW50IG5Db21wcywgaW50IGJwYykKLXsKLSAgICBDQ29kZWNfUkxTY2FubGluZURlY29kZXIqIHBSTFNjYW5saW5lRGVjb2RlciA9IG5ldyBDQ29kZWNfUkxTY2FubGluZURlY29kZXI7Ci0gICAgaWYgKCFwUkxTY2FubGluZURlY29kZXItPkNyZWF0ZShzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgbkNvbXBzLCBicGMpKSB7Ci0gICAgICAgIGRlbGV0ZSBwUkxTY2FubGluZURlY29kZXI7Ci0gICAgICAgIHJldHVybiBOVUxMOwordm9pZCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OkdldE5leHRPcGVyYXRvcigpIHsKKyAgaWYgKG1fU3JjT2Zmc2V0ID49IG1fU3JjU2l6ZSkgeworICAgIG1fT3BlcmF0b3IgPSAxMjg7CisgICAgcmV0dXJuOworICB9CisgIG1fT3BlcmF0b3IgPSBtX3BTcmNCdWZbbV9TcmNPZmZzZXRdOworICBtX1NyY09mZnNldCsrOworfQordm9pZCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OlVwZGF0ZU9wZXJhdG9yKHVpbnQ4X3QgdXNlZF9ieXRlcykgeworICBpZiAodXNlZF9ieXRlcyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX09wZXJhdG9yIDwgMTI4KSB7CisgICAgRlhTWVNfYXNzZXJ0KChGWF9EV09SRCltX09wZXJhdG9yICsgMSA+PSB1c2VkX2J5dGVzKTsKKyAgICBpZiAodXNlZF9ieXRlcyA9PSBtX09wZXJhdG9yICsgMSkgeworICAgICAgbV9TcmNPZmZzZXQgKz0gdXNlZF9ieXRlczsKKyAgICAgIEdldE5leHRPcGVyYXRvcigpOworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICByZXR1cm4gcFJMU2NhbmxpbmVEZWNvZGVyOworICAgIG1fT3BlcmF0b3IgLT0gdXNlZF9ieXRlczsKKyAgICBtX1NyY09mZnNldCArPSB1c2VkX2J5dGVzOworICAgIGlmIChtX1NyY09mZnNldCA+PSBtX1NyY1NpemUpIHsKKyAgICAgIG1fT3BlcmF0b3IgPSAxMjg7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICB1aW50OF90IGNvdW50ID0gMjU3IC0gbV9PcGVyYXRvcjsKKyAgRlhTWVNfYXNzZXJ0KChGWF9EV09SRCljb3VudCA+PSB1c2VkX2J5dGVzKTsKKyAgaWYgKHVzZWRfYnl0ZXMgPT0gY291bnQpIHsKKyAgICBtX1NyY09mZnNldCsrOworICAgIEdldE5leHRPcGVyYXRvcigpOworICAgIHJldHVybjsKKyAgfQorICBjb3VudCAtPSB1c2VkX2J5dGVzOworICBtX09wZXJhdG9yID0gMjU3IC0gY291bnQ7Cit9CitJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBDQ29kZWNfQmFzaWNNb2R1bGU6OkNyZWF0ZVJ1bkxlbmd0aERlY29kZXIoCisgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCwKKyAgICBpbnQgbkNvbXBzLAorICAgIGludCBicGMpIHsKKyAgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyKiBwUkxTY2FubGluZURlY29kZXIgPSBuZXcgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOworICBpZiAoIXBSTFNjYW5saW5lRGVjb2Rlci0+Q3JlYXRlKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBjKSkgeworICAgIGRlbGV0ZSBwUkxTY2FubGluZURlY29kZXI7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHBSTFNjYW5saW5lRGVjb2RlcjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfYm1wLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfYm1wLmNwcAppbmRleCBkYTdhOGJmLi5mZGRkMDc2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2JtcC5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19ibXAuY3BwCkBAIC05LDExNiArOSwxMTkgQEAKICNpbmNsdWRlICJjb2RlY19pbnQuaCINCiAjaW5jbHVkZSAiLi4vbGJtcC9meF9ibXAuaCINCiBzdHJ1Y3QgRlhCTVBfQ29udGV4dCB7DQotICAgIGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHI7DQotICAgIHZvaWQqCQlwYXJlbnRfcHRyOw0KLSAgICB2b2lkKgkJY2hpbGRfcHRyOw0KKyAgYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cjsNCisgIHZvaWQqIHBhcmVudF9wdHI7DQorICB2b2lkKiBjaGlsZF9wdHI7DQogDQotICAgIHZvaWQqCQkoKm1fQWxsb2NGdW5jKSh1bnNpZ25lZCBpbnQpOw0KLSAgICB2b2lkCQkoKm1fRnJlZUZ1bmMpKHZvaWQqKTsNCisgIHZvaWQqICgqbV9BbGxvY0Z1bmMpKHVuc2lnbmVkIGludCk7DQorICB2b2lkICgqbV9GcmVlRnVuYykodm9pZCopOw0KIH07DQogZXh0ZXJuICJDIiB7DQotICAgIHN0YXRpYyB2b2lkKiBfYm1wX2FsbG9jX2Z1bmModW5zaWduZWQgaW50IHNpemUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGWF9BbGxvYyhjaGFyLCBzaXplKTsNCi0gICAgfQ0KLSAgICBzdGF0aWMgdm9pZCAgX2JtcF9mcmVlX2Z1bmModm9pZCogcCkNCi0gICAgew0KLSAgICAgICAgaWYocCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgRlhfRnJlZShwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KK3N0YXRpYyB2b2lkKiBfYm1wX2FsbG9jX2Z1bmModW5zaWduZWQgaW50IHNpemUpIHsNCisgIHJldHVybiBGWF9BbGxvYyhjaGFyLCBzaXplKTsNCit9DQorc3RhdGljIHZvaWQgX2JtcF9mcmVlX2Z1bmModm9pZCogcCkgew0KKyAgaWYgKHAgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKHApOw0KKyAgfQ0KK30NCiB9Ow0KLXN0YXRpYyB2b2lkIF9ibXBfZXJyb3JfZGF0YShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKQ0KLXsNCi0gICAgRlhTWVNfc3RybmNweSgoY2hhciopYm1wX3B0ci0+ZXJyX3B0ciwgZXJyX21zZywgQk1QX01BWF9FUlJPUl9TSVpFIC0gMSk7DQotICAgIGxvbmdqbXAoYm1wX3B0ci0+am1wYnVmLCAxKTsNCitzdGF0aWMgdm9pZCBfYm1wX2Vycm9yX2RhdGEoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZXJyX21zZykgew0KKyAgRlhTWVNfc3RybmNweSgoY2hhciopYm1wX3B0ci0+ZXJyX3B0ciwgZXJyX21zZywgQk1QX01BWF9FUlJPUl9TSVpFIC0gMSk7DQorICBsb25nam1wKGJtcF9wdHItPmptcGJ1ZiwgMSk7DQogfQ0KLXN0YXRpYyB2b2lkIF9ibXBfcmVhZF9zY2FubGluZShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCBpbnQzMl90IHJvd19udW0sIHVpbnQ4X3QqIHJvd19idWYpDQotew0KLSAgICBGWEJNUF9Db250ZXh0KiBwID0gKEZYQk1QX0NvbnRleHQqKWJtcF9wdHItPmNvbnRleHRfcHRyOw0KLSAgICBDQ29kZWNfQm1wTW9kdWxlKiBwTW9kdWxlID0gKENDb2RlY19CbXBNb2R1bGUqKXAtPnBhcmVudF9wdHI7DQotICAgIHBNb2R1bGUtPlJlYWRTY2FubGluZUNhbGxiYWNrKHAtPmNoaWxkX3B0ciwgcm93X251bSwgcm93X2J1Zik7DQorc3RhdGljIHZvaWQgX2JtcF9yZWFkX3NjYW5saW5lKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93X251bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcm93X2J1Zikgew0KKyAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilibXBfcHRyLT5jb250ZXh0X3B0cjsNCisgIENDb2RlY19CbXBNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0JtcE1vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgIHBNb2R1bGUtPlJlYWRTY2FubGluZUNhbGxiYWNrKHAtPmNoaWxkX3B0ciwgcm93X251bSwgcm93X2J1Zik7DQogfQ0KLXN0YXRpYyBGWF9CT09MIF9ibXBfZ2V0X2RhdGFfcG9zaXRpb24oYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgRlhfRFdPUkQgcmNkX3BvcykNCi17DQotICAgIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopYm1wX3B0ci0+Y29udGV4dF9wdHI7DQotICAgIENDb2RlY19CbXBNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0JtcE1vZHVsZSopcC0+cGFyZW50X3B0cjsNCi0gICAgcmV0dXJuIHBNb2R1bGUtPklucHV0SW1hZ2VQb3NpdGlvbkJ1ZkNhbGxiYWNrKHAtPmNoaWxkX3B0ciwgcmNkX3Bvcyk7DQorc3RhdGljIEZYX0JPT0wgX2JtcF9nZXRfZGF0YV9wb3NpdGlvbihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcmNkX3Bvcykgew0KKyAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilibXBfcHRyLT5jb250ZXh0X3B0cjsNCisgIENDb2RlY19CbXBNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0JtcE1vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgIHJldHVybiBwTW9kdWxlLT5JbnB1dEltYWdlUG9zaXRpb25CdWZDYWxsYmFjayhwLT5jaGlsZF9wdHIsIHJjZF9wb3MpOw0KIH0NCi12b2lkKiBDQ29kZWNfQm1wTW9kdWxlOjpTdGFydCh2b2lkKiBwTW9kdWxlKQ0KLXsNCi0gICAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoRlhCTVBfQ29udGV4dCkpOw0KLSAgICBpZiAocCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBGWFNZU19tZW1zZXQocCwgMCwgc2l6ZW9mKEZYQk1QX0NvbnRleHQpKTsNCi0gICAgaWYocCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBwLT5tX0FsbG9jRnVuYyA9IF9ibXBfYWxsb2NfZnVuYzsNCi0gICAgcC0+bV9GcmVlRnVuYyA9IF9ibXBfZnJlZV9mdW5jOw0KLSAgICBwLT5ibXBfcHRyID0gTlVMTDsNCi0gICAgcC0+cGFyZW50X3B0ciA9ICh2b2lkKil0aGlzOw0KLSAgICBwLT5jaGlsZF9wdHIgPSBwTW9kdWxlOw0KLSAgICBwLT5ibXBfcHRyID0gX2JtcF9jcmVhdGVfZGVjb21wcmVzcygpOw0KLSAgICBpZiAocC0+Ym1wX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKHApOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcC0+Ym1wX3B0ci0+Y29udGV4dF9wdHIgPSAodm9pZCopcDsNCi0gICAgcC0+Ym1wX3B0ci0+ZXJyX3B0ciA9IG1fc3pMYXN0RXJyb3I7DQotICAgIHAtPmJtcF9wdHItPl9ibXBfZXJyb3JfZm4gPSBfYm1wX2Vycm9yX2RhdGE7DQotICAgIHAtPmJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbiA9IF9ibXBfcmVhZF9zY2FubGluZTsNCi0gICAgcC0+Ym1wX3B0ci0+X2JtcF9nZXRfZGF0YV9wb3NpdGlvbl9mbiA9IF9ibXBfZ2V0X2RhdGFfcG9zaXRpb247DQotICAgIHJldHVybiBwOw0KK3ZvaWQqIENDb2RlY19CbXBNb2R1bGU6OlN0YXJ0KHZvaWQqIHBNb2R1bGUpIHsNCisgIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEZYQk1QX0NvbnRleHQpKTsNCisgIGlmIChwID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBGWFNZU19tZW1zZXQocCwgMCwgc2l6ZW9mKEZYQk1QX0NvbnRleHQpKTsNCisgIGlmIChwID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwLT5tX0FsbG9jRnVuYyA9IF9ibXBfYWxsb2NfZnVuYzsNCisgIHAtPm1fRnJlZUZ1bmMgPSBfYm1wX2ZyZWVfZnVuYzsNCisgIHAtPmJtcF9wdHIgPSBOVUxMOw0KKyAgcC0+cGFyZW50X3B0ciA9ICh2b2lkKil0aGlzOw0KKyAgcC0+Y2hpbGRfcHRyID0gcE1vZHVsZTsNCisgIHAtPmJtcF9wdHIgPSBfYm1wX2NyZWF0ZV9kZWNvbXByZXNzKCk7DQorICBpZiAocC0+Ym1wX3B0ciA9PSBOVUxMKSB7DQorICAgIEZYX0ZyZWUocCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcC0+Ym1wX3B0ci0+Y29udGV4dF9wdHIgPSAodm9pZCopcDsNCisgIHAtPmJtcF9wdHItPmVycl9wdHIgPSBtX3N6TGFzdEVycm9yOw0KKyAgcC0+Ym1wX3B0ci0+X2JtcF9lcnJvcl9mbiA9IF9ibXBfZXJyb3JfZGF0YTsNCisgIHAtPmJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbiA9IF9ibXBfcmVhZF9zY2FubGluZTsNCisgIHAtPmJtcF9wdHItPl9ibXBfZ2V0X2RhdGFfcG9zaXRpb25fZm4gPSBfYm1wX2dldF9kYXRhX3Bvc2l0aW9uOw0KKyAgcmV0dXJuIHA7DQogfQ0KLXZvaWQgQ0NvZGVjX0JtcE1vZHVsZTo6RmluaXNoKHZvaWQqIHBDb250ZXh0KQ0KLXsNCi0gICAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilwQ29udGV4dDsNCi0gICAgaWYocCAhPSBOVUxMKSB7DQotICAgICAgICBfYm1wX2Rlc3Ryb3lfZGVjb21wcmVzcygmcC0+Ym1wX3B0cik7DQotICAgICAgICBwLT5tX0ZyZWVGdW5jKHApOw0KLSAgICB9DQordm9pZCBDQ29kZWNfQm1wTW9kdWxlOjpGaW5pc2godm9pZCogcENvbnRleHQpIHsNCisgIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopcENvbnRleHQ7DQorICBpZiAocCAhPSBOVUxMKSB7DQorICAgIF9ibXBfZGVzdHJveV9kZWNvbXByZXNzKCZwLT5ibXBfcHRyKTsNCisgICAgcC0+bV9GcmVlRnVuYyhwKTsNCisgIH0NCiB9DQotaW50MzJfdCBDQ29kZWNfQm1wTW9kdWxlOjpSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQzMl90KiB3aWR0aCwgaW50MzJfdCogaGVpZ2h0LCBGWF9CT09MKiB0Yl9mbGFnLCBpbnQzMl90KiBjb21wb25lbnRzLCBpbnQzMl90KiBwYWxfbnVtLCBGWF9EV09SRCoqIHBhbF9wcCwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkNCi17DQotICAgIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopcENvbnRleHQ7DQotICAgIGlmKHNldGptcChwLT5ibXBfcHRyLT5qbXBidWYpKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHJldCA9IF9ibXBfcmVhZF9oZWFkZXIocC0+Ym1wX3B0cik7DQotICAgIGlmIChyZXQgIT0gMSkgew0KLSAgICAgICAgcmV0dXJuIHJldDsNCi0gICAgfQ0KLSAgICAqd2lkdGggPSBwLT5ibXBfcHRyLT53aWR0aDsNCi0gICAgKmhlaWdodCA9IHAtPmJtcF9wdHItPmhlaWdodDsNCi0gICAgKnRiX2ZsYWcgPSBwLT5ibXBfcHRyLT5pbWdUQl9mbGFnOw0KLSAgICAqY29tcG9uZW50cyA9IHAtPmJtcF9wdHItPmNvbXBvbmVudHM7DQotICAgICpwYWxfbnVtID0gcC0+Ym1wX3B0ci0+cGFsX251bTsNCi0gICAgKnBhbF9wcCA9IHAtPmJtcF9wdHItPnBhbF9wdHI7DQotICAgIGlmIChwQXR0cmlidXRlKSB7DQotICAgICAgICBwQXR0cmlidXRlLT5tX3dEUElVbml0ID0gRlhDT0RFQ19SRVNVTklUX01FVEVSOw0KLSAgICAgICAgcEF0dHJpYnV0ZS0+bV9uWERQSSA9IHAtPmJtcF9wdHItPmRwaV94Ow0KLSAgICAgICAgcEF0dHJpYnV0ZS0+bV9uWURQSSA9IHAtPmJtcF9wdHItPmRwaV95Ow0KLSAgICAgICAgcEF0dHJpYnV0ZS0+bV9uQm1wQ29tcHJlc3NUeXBlID0gcC0+Ym1wX3B0ci0+Y29tcHJlc3NfZmxhZzsNCi0gICAgfQ0KLSAgICByZXR1cm4gMTsNCitpbnQzMl90IENDb2RlY19CbXBNb2R1bGU6OlJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wqIHRiX2ZsYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGNvbXBvbmVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBhbF9udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiogcGFsX3BwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSB7DQorICBGWEJNUF9Db250ZXh0KiBwID0gKEZYQk1QX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgaWYgKHNldGptcChwLT5ibXBfcHRyLT5qbXBidWYpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCByZXQgPSBfYm1wX3JlYWRfaGVhZGVyKHAtPmJtcF9wdHIpOw0KKyAgaWYgKHJldCAhPSAxKSB7DQorICAgIHJldHVybiByZXQ7DQorICB9DQorICAqd2lkdGggPSBwLT5ibXBfcHRyLT53aWR0aDsNCisgICpoZWlnaHQgPSBwLT5ibXBfcHRyLT5oZWlnaHQ7DQorICAqdGJfZmxhZyA9IHAtPmJtcF9wdHItPmltZ1RCX2ZsYWc7DQorICAqY29tcG9uZW50cyA9IHAtPmJtcF9wdHItPmNvbXBvbmVudHM7DQorICAqcGFsX251bSA9IHAtPmJtcF9wdHItPnBhbF9udW07DQorICAqcGFsX3BwID0gcC0+Ym1wX3B0ci0+cGFsX3B0cjsNCisgIGlmIChwQXR0cmlidXRlKSB7DQorICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQgPSBGWENPREVDX1JFU1VOSVRfTUVURVI7DQorICAgIHBBdHRyaWJ1dGUtPm1fblhEUEkgPSBwLT5ibXBfcHRyLT5kcGlfeDsNCisgICAgcEF0dHJpYnV0ZS0+bV9uWURQSSA9IHAtPmJtcF9wdHItPmRwaV95Ow0KKyAgICBwQXR0cmlidXRlLT5tX25CbXBDb21wcmVzc1R5cGUgPSBwLT5ibXBfcHRyLT5jb21wcmVzc19mbGFnOw0KKyAgfQ0KKyAgcmV0dXJuIDE7DQogfQ0KLWludDMyX3QgQ0NvZGVjX0JtcE1vZHVsZTo6TG9hZEltYWdlKHZvaWQqIHBDb250ZXh0KQ0KLXsNCi0gICAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilwQ29udGV4dDsNCi0gICAgaWYoc2V0am1wKHAtPmJtcF9wdHItPmptcGJ1ZikpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIHJldHVybiBfYm1wX2RlY29kZV9pbWFnZShwLT5ibXBfcHRyKTsNCitpbnQzMl90IENDb2RlY19CbXBNb2R1bGU6OkxvYWRJbWFnZSh2b2lkKiBwQ29udGV4dCkgew0KKyAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilwQ29udGV4dDsNCisgIGlmIChzZXRqbXAocC0+Ym1wX3B0ci0+am1wYnVmKSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiBfYm1wX2RlY29kZV9pbWFnZShwLT5ibXBfcHRyKTsNCiB9DQotRlhfRFdPUkQgQ0NvZGVjX0JtcE1vZHVsZTo6R2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgdWludDhfdCoqIGF2aWFsX2J1Zl9wdHIpDQotew0KLSAgICBGWEJNUF9Db250ZXh0KiBwID0gKEZYQk1QX0NvbnRleHQqKXBDb250ZXh0Ow0KLSAgICByZXR1cm4gX2JtcF9nZXRfYXZhaWxfaW5wdXQocC0+Ym1wX3B0ciwgYXZpYWxfYnVmX3B0cik7DQorRlhfRFdPUkQgQ0NvZGVjX0JtcE1vZHVsZTo6R2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmlhbF9idWZfcHRyKSB7DQorICBGWEJNUF9Db250ZXh0KiBwID0gKEZYQk1QX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgcmV0dXJuIF9ibXBfZ2V0X2F2YWlsX2lucHV0KHAtPmJtcF9wdHIsIGF2aWFsX2J1Zl9wdHIpOw0KIH0NCi12b2lkIENDb2RlY19CbXBNb2R1bGU6OklucHV0KHZvaWQqIHBDb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkNCi17DQotICAgIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopcENvbnRleHQ7DQotICAgIF9ibXBfaW5wdXRfYnVmZmVyKHAtPmJtcF9wdHIsICh1aW50OF90KilzcmNfYnVmLCBzcmNfc2l6ZSk7DQordm9pZCBDQ29kZWNfQm1wTW9kdWxlOjpJbnB1dCh2b2lkKiBwQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSkgew0KKyAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilwQ29udGV4dDsNCisgIF9ibXBfaW5wdXRfYnVmZmVyKHAtPmJtcF9wdHIsICh1aW50OF90KilzcmNfYnVmLCBzcmNfc2l6ZSk7DQogfQ0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmF4LmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmF4LmNwcAppbmRleCBkNDU2MDAzLi40MjYwMzA5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZheC5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mYXguY3BwCkBAIC03LDk4MSArNyw4MTMgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKICNpbmNsdWRlICJjb2RlY19pbnQuaCIKIGNvbnN0IHVpbnQ4X3QgT25lTGVhZFBvc1syNTZdID0gewotICAgIDgsIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCi0gICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAotICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDgsIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIH07CiBjb25zdCB1aW50OF90IFplcm9MZWFkUG9zWzI1Nl0gPSB7Ci0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKLSAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAotICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKICAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA2LCA2LCA3LCA4LAogfTsKIAotaW50IF9GaW5kQml0KGNvbnN0IHVpbnQ4X3QqIGRhdGFfYnVmLCBpbnQgbWF4X3BvcywgaW50IHN0YXJ0X3BvcywgaW50IGJpdCkKLXsKLSAgICBpZiAoc3RhcnRfcG9zID49IG1heF9wb3MpIHsKLSAgICAgICAgcmV0dXJuIG1heF9wb3M7CitpbnQgX0ZpbmRCaXQoY29uc3QgdWludDhfdCogZGF0YV9idWYsIGludCBtYXhfcG9zLCBpbnQgc3RhcnRfcG9zLCBpbnQgYml0KSB7CisgIGlmIChzdGFydF9wb3MgPj0gbWF4X3BvcykgeworICAgIHJldHVybiBtYXhfcG9zOworICB9CisgIGNvbnN0IHVpbnQ4X3QqIGxlYWRpbmdfcG9zID0gYml0ID8gT25lTGVhZFBvcyA6IFplcm9MZWFkUG9zOworICBpZiAoc3RhcnRfcG9zICUgOCkgeworICAgIHVpbnQ4X3QgZGF0YSA9IGRhdGFfYnVmW3N0YXJ0X3BvcyAvIDhdOworICAgIGlmIChiaXQpIHsKKyAgICAgIGRhdGEgJj0gMHhmZiA+PiAoc3RhcnRfcG9zICUgOCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRhdGEgfD0gMHhmZiA8PCAoOCAtIHN0YXJ0X3BvcyAlIDgpOwogICAgIH0KLSAgICBjb25zdCB1aW50OF90KiBsZWFkaW5nX3BvcyA9IGJpdCA/IE9uZUxlYWRQb3MgOiBaZXJvTGVhZFBvczsKLSAgICBpZiAoc3RhcnRfcG9zICUgOCkgewotICAgICAgICB1aW50OF90IGRhdGEgPSBkYXRhX2J1ZltzdGFydF9wb3MgLyA4XTsKLSAgICAgICAgaWYgKGJpdCkgewotICAgICAgICAgICAgZGF0YSAmPSAweGZmID4+IChzdGFydF9wb3MgJSA4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEgfD0gMHhmZiA8PCAoOCAtIHN0YXJ0X3BvcyAlIDgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZWFkaW5nX3Bvc1tkYXRhXSA8IDgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGFydF9wb3MgLyA4ICogOCArIGxlYWRpbmdfcG9zW2RhdGFdOwotICAgICAgICB9Ci0gICAgICAgIHN0YXJ0X3BvcyArPSA3OworICAgIGlmIChsZWFkaW5nX3Bvc1tkYXRhXSA8IDgpIHsKKyAgICAgIHJldHVybiBzdGFydF9wb3MgLyA4ICogOCArIGxlYWRpbmdfcG9zW2RhdGFdOwogICAgIH0KLSAgICB1aW50OF90IHNraXAgPSBiaXQgPyAweDAwIDogMHhmZjsKLSAgICBpbnQgYnl0ZV9wb3MgPSBzdGFydF9wb3MgLyA4OwotICAgIGludCBtYXhfYnl0ZSA9IChtYXhfcG9zICsgNykgLyA4OwotICAgIHdoaWxlIChieXRlX3BvcyA8IG1heF9ieXRlKSB7Ci0gICAgICAgIGlmIChkYXRhX2J1ZltieXRlX3Bvc10gIT0gc2tpcCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZV9wb3MgKys7CisgICAgc3RhcnRfcG9zICs9IDc7CisgIH0KKyAgdWludDhfdCBza2lwID0gYml0ID8gMHgwMCA6IDB4ZmY7CisgIGludCBieXRlX3BvcyA9IHN0YXJ0X3BvcyAvIDg7CisgIGludCBtYXhfYnl0ZSA9IChtYXhfcG9zICsgNykgLyA4OworICB3aGlsZSAoYnl0ZV9wb3MgPCBtYXhfYnl0ZSkgeworICAgIGlmIChkYXRhX2J1ZltieXRlX3Bvc10gIT0gc2tpcCkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmIChieXRlX3BvcyA9PSBtYXhfYnl0ZSkgewotICAgICAgICByZXR1cm4gbWF4X3BvczsKLSAgICB9Ci0gICAgaW50IHBvcyA9IGxlYWRpbmdfcG9zW2RhdGFfYnVmW2J5dGVfcG9zXV0gKyBieXRlX3BvcyAqIDg7Ci0gICAgaWYgKHBvcyA+IG1heF9wb3MpIHsKLSAgICAgICAgcG9zID0gbWF4X3BvczsKLSAgICB9Ci0gICAgcmV0dXJuIHBvczsKKyAgICBieXRlX3BvcysrOworICB9CisgIGlmIChieXRlX3BvcyA9PSBtYXhfYnl0ZSkgeworICAgIHJldHVybiBtYXhfcG9zOworICB9CisgIGludCBwb3MgPSBsZWFkaW5nX3Bvc1tkYXRhX2J1ZltieXRlX3Bvc11dICsgYnl0ZV9wb3MgKiA4OworICBpZiAocG9zID4gbWF4X3BvcykgeworICAgIHBvcyA9IG1heF9wb3M7CisgIH0KKyAgcmV0dXJuIHBvczsKIH0KLXZvaWQgX0ZheEc0RmluZEIxQjIoY29uc3QgdWludDhfdCogcmVmX2J1ZiwgaW50IGNvbHVtbnMsIGludCBhMCwgRlhfQk9PTCBhMGNvbG9yLCBpbnQmIGIxLCBpbnQmIGIyKQotewotICAgIGlmIChhMGNvbG9yKSB7Ci0gICAgICAgIGEwY29sb3IgPSAxOwotICAgIH0KLSAgICB1aW50OF90IGZpcnN0X2JpdCA9IChhMCA8IDApID8gMSA6ICgocmVmX2J1ZlthMCAvIDhdICYgKDEgPDwgKDcgLSBhMCAlIDgpKSkgIT0gMCk7Ci0gICAgYjEgPSBfRmluZEJpdChyZWZfYnVmLCBjb2x1bW5zLCBhMCArIDEsICFmaXJzdF9iaXQpOwotICAgIGlmIChiMSA+PSBjb2x1bW5zKSB7Ci0gICAgICAgIGIxID0gYjIgPSBjb2x1bW5zOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChmaXJzdF9iaXQgPT0gIWEwY29sb3IpIHsKLSAgICAgICAgYjEgPSBfRmluZEJpdChyZWZfYnVmLCBjb2x1bW5zLCBiMSArIDEsIGZpcnN0X2JpdCk7Ci0gICAgICAgIGZpcnN0X2JpdCA9ICFmaXJzdF9iaXQ7Ci0gICAgfQotICAgIGlmIChiMSA+PSBjb2x1bW5zKSB7Ci0gICAgICAgIGIxID0gYjIgPSBjb2x1bW5zOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGIyID0gX0ZpbmRCaXQocmVmX2J1ZiwgY29sdW1ucywgYjEgKyAxLCBmaXJzdF9iaXQpOwordm9pZCBfRmF4RzRGaW5kQjFCMihjb25zdCB1aW50OF90KiByZWZfYnVmLAorICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgaW50IGEwLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGEwY29sb3IsCisgICAgICAgICAgICAgICAgICAgIGludCYgYjEsCisgICAgICAgICAgICAgICAgICAgIGludCYgYjIpIHsKKyAgaWYgKGEwY29sb3IpIHsKKyAgICBhMGNvbG9yID0gMTsKKyAgfQorICB1aW50OF90IGZpcnN0X2JpdCA9CisgICAgICAoYTAgPCAwKSA/IDEgOiAoKHJlZl9idWZbYTAgLyA4XSAmICgxIDw8ICg3IC0gYTAgJSA4KSkpICE9IDApOworICBiMSA9IF9GaW5kQml0KHJlZl9idWYsIGNvbHVtbnMsIGEwICsgMSwgIWZpcnN0X2JpdCk7CisgIGlmIChiMSA+PSBjb2x1bW5zKSB7CisgICAgYjEgPSBiMiA9IGNvbHVtbnM7CisgICAgcmV0dXJuOworICB9CisgIGlmIChmaXJzdF9iaXQgPT0gIWEwY29sb3IpIHsKKyAgICBiMSA9IF9GaW5kQml0KHJlZl9idWYsIGNvbHVtbnMsIGIxICsgMSwgZmlyc3RfYml0KTsKKyAgICBmaXJzdF9iaXQgPSAhZmlyc3RfYml0OworICB9CisgIGlmIChiMSA+PSBjb2x1bW5zKSB7CisgICAgYjEgPSBiMiA9IGNvbHVtbnM7CisgICAgcmV0dXJuOworICB9CisgIGIyID0gX0ZpbmRCaXQocmVmX2J1ZiwgY29sdW1ucywgYjEgKyAxLCBmaXJzdF9iaXQpOwogfQotdm9pZCBfRmF4RmlsbEJpdHModWludDhfdCogZGVzdF9idWYsIGludCBjb2x1bW5zLCBpbnQgc3RhcnRwb3MsIGludCBlbmRwb3MpCi17Ci0gICAgaWYgKHN0YXJ0cG9zIDwgMCkgewotICAgICAgICBzdGFydHBvcyA9IDA7Cit2b2lkIF9GYXhGaWxsQml0cyh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGNvbHVtbnMsIGludCBzdGFydHBvcywgaW50IGVuZHBvcykgeworICBpZiAoc3RhcnRwb3MgPCAwKSB7CisgICAgc3RhcnRwb3MgPSAwOworICB9CisgIGlmIChlbmRwb3MgPCAwKSB7CisgICAgZW5kcG9zID0gMDsKKyAgfQorICBpZiAoZW5kcG9zID49IGNvbHVtbnMpIHsKKyAgICBlbmRwb3MgPSBjb2x1bW5zOworICB9CisgIGlmIChzdGFydHBvcyA+PSBlbmRwb3MpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGZpcnN0X2J5dGUgPSBzdGFydHBvcyAvIDg7CisgIGludCBsYXN0X2J5dGUgPSAoZW5kcG9zIC0gMSkgLyA4OworICBpZiAoZmlyc3RfYnl0ZSA9PSBsYXN0X2J5dGUpIHsKKyAgICBmb3IgKGludCBpID0gc3RhcnRwb3MgJSA4OyBpIDw9IChlbmRwb3MgLSAxKSAlIDg7IGkrKykgeworICAgICAgZGVzdF9idWZbZmlyc3RfYnl0ZV0gLT0gMSA8PCAoNyAtIGkpOwogICAgIH0KLSAgICBpZiAoZW5kcG9zIDwgMCkgewotICAgICAgICBlbmRwb3MgPSAwOwotICAgIH0KLSAgICBpZiAoZW5kcG9zID49IGNvbHVtbnMpIHsKLSAgICAgICAgZW5kcG9zID0gY29sdW1uczsKLSAgICB9Ci0gICAgaWYgKHN0YXJ0cG9zID49IGVuZHBvcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBmaXJzdF9ieXRlID0gc3RhcnRwb3MgLyA4OwotICAgIGludCBsYXN0X2J5dGUgPSAoZW5kcG9zIC0gMSkgLyA4OwotICAgIGlmIChmaXJzdF9ieXRlID09IGxhc3RfYnl0ZSkgewotICAgICAgICBmb3IgKGludCBpID0gc3RhcnRwb3MgJSA4OyBpIDw9IChlbmRwb3MgLSAxKSAlIDg7IGkgKyspIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2ZpcnN0X2J5dGVdIC09IDEgPDwgKDcgLSBpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBpOwotICAgIGZvciAoaSA9IHN0YXJ0cG9zICUgODsgaSA8IDg7IGkgKyspIHsKLSAgICAgICAgZGVzdF9idWZbZmlyc3RfYnl0ZV0gLT0gMSA8PCAoNyAtIGkpOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDw9IChlbmRwb3MgLSAxKSAlIDg7IGkgKyspIHsKLSAgICAgICAgZGVzdF9idWZbbGFzdF9ieXRlXSAtPSAxIDw8ICg3IC0gaSk7Ci0gICAgfQotICAgIGlmIChsYXN0X2J5dGUgPiBmaXJzdF9ieXRlICsgMSkgewotICAgICAgICBGWFNZU19tZW1zZXQoZGVzdF9idWYgKyBmaXJzdF9ieXRlICsgMSwgMCwgbGFzdF9ieXRlIC0gZmlyc3RfYnl0ZSAtIDEpOwotICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaW50IGk7CisgIGZvciAoaSA9IHN0YXJ0cG9zICUgODsgaSA8IDg7IGkrKykgeworICAgIGRlc3RfYnVmW2ZpcnN0X2J5dGVdIC09IDEgPDwgKDcgLSBpKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDw9IChlbmRwb3MgLSAxKSAlIDg7IGkrKykgeworICAgIGRlc3RfYnVmW2xhc3RfYnl0ZV0gLT0gMSA8PCAoNyAtIGkpOworICB9CisgIGlmIChsYXN0X2J5dGUgPiBmaXJzdF9ieXRlICsgMSkgeworICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiArIGZpcnN0X2J5dGUgKyAxLCAwLCBsYXN0X2J5dGUgLSBmaXJzdF9ieXRlIC0gMSk7CisgIH0KIH0KLSNkZWZpbmUgTkVYVEJJVCBzcmNfYnVmW2JpdHBvcy84XSAmICgxIDw8ICg3LWJpdHBvcyU4KSk7IGJpdHBvcyArKzsKLSNkZWZpbmUgQUREQklUKGNvZGUsIGJpdCkgY29kZSA9IGNvZGUgPDwgMTsgaWYgKGJpdCkgY29kZSArKzsKLSNkZWZpbmUgR0VUQklUKGJpdHBvcykgc3JjX2J1ZltiaXRwb3MvOF0gJiAoMSA8PCAoNy1iaXRwb3MlOCkpCisjZGVmaW5lIE5FWFRCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzcmNfYnVmW2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MgJSA4KSk7IFwKKyAgYml0cG9zKys7CisjZGVmaW5lIEFEREJJVChjb2RlLCBiaXQpIFwKKyAgY29kZSA9IGNvZGUgPDwgMTsgICAgICAgXAorICBpZiAoYml0KSAgICAgICAgICAgICAgICBcCisgICAgY29kZSsrOworI2RlZmluZSBHRVRCSVQoYml0cG9zKSBzcmNfYnVmW2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MgJSA4KSkKIHN0YXRpYyBjb25zdCB1aW50OF90IEZheEJsYWNrUnVuSW5zW10gPSB7Ci0gICAgMCwKLSAgICAyLAotICAgIDB4MDIsIDMsIDAsCi0gICAgMHgwMywgMiwgMCwKLSAgICAyLAotICAgIDB4MDIsIDEsIDAsCi0gICAgMHgwMywgNCwgMCwKLSAgICAyLAotICAgIDB4MDIsIDYsIDAsCi0gICAgMHgwMywgNSwgMCwKLSAgICAxLAotICAgIDB4MDMsIDcsIDAsCi0gICAgMiwKLSAgICAweDA0LCA5LCAwLAotICAgIDB4MDUsIDgsIDAsCi0gICAgMywKLSAgICAweDA0LCAxMCwgMCwKLSAgICAweDA1LCAxMSwgMCwKLSAgICAweDA3LCAxMiwgMCwKLSAgICAyLAotICAgIDB4MDQsIDEzLCAwLAotICAgIDB4MDcsIDE0LCAwLAotICAgIDEsCi0gICAgMHgxOCwgMTUsIDAsCi0gICAgNSwKLSAgICAweDA4LCAxOCwgMCwKLSAgICAweDBmLCA2NCwgMCwKLSAgICAweDE3LCAxNiwgMCwKLSAgICAweDE4LCAxNywgMCwKLSAgICAweDM3LCAwLCAwLAotICAgIDEwLAotICAgIDB4MDgsIDB4MDAsIDB4MDcsCi0gICAgMHgwYywgMHg0MCwgMHgwNywKLSAgICAweDBkLCAweDgwLCAweDA3LAotICAgIDB4MTcsIDI0LCAwLAotICAgIDB4MTgsIDI1LCAwLAotICAgIDB4MjgsIDIzLCAwLAotICAgIDB4MzcsIDIyLCAwLAotICAgIDB4NjcsIDE5LCAwLAotICAgIDB4NjgsIDIwLCAwLAotICAgIDB4NmMsIDIxLCAwLAotICAgIDU0LAotICAgIDB4MTIsIDE5ODQgJSAyNTYsIDE5ODQgLyAyNTYsCi0gICAgMHgxMywgMjA0OCAlIDI1NiwgMjA0OCAvIDI1NiwKLSAgICAweDE0LCAyMTEyICUgMjU2LCAyMTEyIC8gMjU2LAotICAgIDB4MTUsIDIxNzYgJSAyNTYsIDIxNzYgLyAyNTYsCi0gICAgMHgxNiwgMjI0MCAlIDI1NiwgMjI0MCAvIDI1NiwKLSAgICAweDE3LCAyMzA0ICUgMjU2LCAyMzA0IC8gMjU2LAotICAgIDB4MWMsIDIzNjggJSAyNTYsIDIzNjggLyAyNTYsCi0gICAgMHgxZCwgMjQzMiAlIDI1NiwgMjQzMiAvIDI1NiwKLSAgICAweDFlLCAyNDk2ICUgMjU2LCAyNDk2IC8gMjU2LAotICAgIDB4MWYsIDI1NjAgJSAyNTYsIDI1NjAgLyAyNTYsCi0gICAgMHgyNCwgNTIsIDAsCi0gICAgMHgyNywgNTUsIDAsCi0gICAgMHgyOCwgNTYsIDAsCi0gICAgMHgyYiwgNTksIDAsCi0gICAgMHgyYywgNjAsIDAsCi0gICAgMHgzMywgMzIwICUgMjU2LCAzMjAgLyAyNTYsCi0gICAgMHgzNCwgMzg0ICUgMjU2LCAzODQgLyAyNTYsCi0gICAgMHgzNSwgNDQ4ICUgMjU2LCA0NDggLyAyNTYsCi0gICAgMHgzNywgNTMsIDAsCi0gICAgMHgzOCwgNTQsIDAsCi0gICAgMHg1MiwgNTAsIDAsCi0gICAgMHg1MywgNTEsIDAsCi0gICAgMHg1NCwgNDQsIDAsCi0gICAgMHg1NSwgNDUsIDAsCi0gICAgMHg1NiwgNDYsIDAsCi0gICAgMHg1NywgNDcsIDAsCi0gICAgMHg1OCwgNTcsIDAsCi0gICAgMHg1OSwgNTgsIDAsCi0gICAgMHg1YSwgNjEsIDAsCi0gICAgMHg1YiwgMjU2ICUgMjU2LCAyNTYgLyAyNTYsCi0gICAgMHg2NCwgNDgsIDAsCi0gICAgMHg2NSwgNDksIDAsCi0gICAgMHg2NiwgNjIsIDAsCi0gICAgMHg2NywgNjMsIDAsCi0gICAgMHg2OCwgMzAsIDAsCi0gICAgMHg2OSwgMzEsIDAsCi0gICAgMHg2YSwgMzIsIDAsCi0gICAgMHg2YiwgMzMsIDAsCi0gICAgMHg2YywgNDAsIDAsCi0gICAgMHg2ZCwgNDEsIDAsCi0gICAgMHhjOCwgMTI4LCAwLAotICAgIDB4YzksIDE5MiwgMCwKLSAgICAweGNhLCAyNiwgMCwKLSAgICAweGNiLCAyNywgMCwKLSAgICAweGNjLCAyOCwgMCwKLSAgICAweGNkLCAyOSwgMCwKLSAgICAweGQyLCAzNCwgMCwKLSAgICAweGQzLCAzNSwgMCwKLSAgICAweGQ0LCAzNiwgMCwKLSAgICAweGQ1LCAzNywgMCwKLSAgICAweGQ2LCAzOCwgMCwKLSAgICAweGQ3LCAzOSwgMCwKLSAgICAweGRhLCA0MiwgMCwKLSAgICAweGRiLCA0MywgMCwKLSAgICAyMCwKLSAgICAweDRhLCA2NDAgJSAyNTYsIDY0MCAvIDI1NiwKLSAgICAweDRiLCA3MDQgJSAyNTYsIDcwNCAvIDI1NiwKLSAgICAweDRjLCA3NjggJSAyNTYsIDc2OCAvIDI1NiwKLSAgICAweDRkLCA4MzIgJSAyNTYsIDgzMiAvIDI1NiwKLSAgICAweDUyLCAxMjgwICUgMjU2LCAxMjgwIC8gMjU2LAotICAgIDB4NTMsIDEzNDQgJSAyNTYsIDEzNDQgLyAyNTYsCi0gICAgMHg1NCwgMTQwOCAlIDI1NiwgMTQwOCAvIDI1NiwKLSAgICAweDU1LCAxNDcyICUgMjU2LCAxNDcyIC8gMjU2LAotICAgIDB4NWEsIDE1MzYgJSAyNTYsIDE1MzYgLyAyNTYsCi0gICAgMHg1YiwgMTYwMCAlIDI1NiwgMTYwMCAvIDI1NiwKLSAgICAweDY0LCAxNjY0ICUgMjU2LCAxNjY0IC8gMjU2LAotICAgIDB4NjUsIDE3MjggJSAyNTYsIDE3MjggLyAyNTYsCi0gICAgMHg2YywgNTEyICUgMjU2LCA1MTIgLyAyNTYsCi0gICAgMHg2ZCwgNTc2ICUgMjU2LCA1NzYgLyAyNTYsCi0gICAgMHg3MiwgODk2ICUgMjU2LCA4OTYgLyAyNTYsCi0gICAgMHg3MywgOTYwICUgMjU2LCA5NjAgLyAyNTYsCi0gICAgMHg3NCwgMTAyNCAlIDI1NiwgMTAyNCAvIDI1NiwKLSAgICAweDc1LCAxMDg4ICUgMjU2LCAxMDg4IC8gMjU2LAotICAgIDB4NzYsIDExNTIgJSAyNTYsIDExNTIgLyAyNTYsCi0gICAgMHg3NywgMTIxNiAlIDI1NiwgMTIxNiAvIDI1NiwKLSAgICAweGZmCi19OworICAgIDAsICAgICAgICAgIDIsICAgICAgICAgIDB4MDIsICAgICAgIDMsICAgICAgICAgIDAsICAgICAgICAgIDB4MDMsCisgICAgMiwgICAgICAgICAgMCwgICAgICAgICAgMiwgICAgICAgICAgMHgwMiwgICAgICAgMSwgICAgICAgICAgMCwKKyAgICAweDAzLCAgICAgICA0LCAgICAgICAgICAwLCAgICAgICAgICAyLCAgICAgICAgICAweDAyLCAgICAgICA2LAorICAgIDAsICAgICAgICAgIDB4MDMsICAgICAgIDUsICAgICAgICAgIDAsICAgICAgICAgIDEsICAgICAgICAgIDB4MDMsCisgICAgNywgICAgICAgICAgMCwgICAgICAgICAgMiwgICAgICAgICAgMHgwNCwgICAgICAgOSwgICAgICAgICAgMCwKKyAgICAweDA1LCAgICAgICA4LCAgICAgICAgICAwLCAgICAgICAgICAzLCAgICAgICAgICAweDA0LCAgICAgICAxMCwKKyAgICAwLCAgICAgICAgICAweDA1LCAgICAgICAxMSwgICAgICAgICAwLCAgICAgICAgICAweDA3LCAgICAgICAxMiwKKyAgICAwLCAgICAgICAgICAyLCAgICAgICAgICAweDA0LCAgICAgICAxMywgICAgICAgICAwLCAgICAgICAgICAweDA3LAorICAgIDE0LCAgICAgICAgIDAsICAgICAgICAgIDEsICAgICAgICAgIDB4MTgsICAgICAgIDE1LCAgICAgICAgIDAsCisgICAgNSwgICAgICAgICAgMHgwOCwgICAgICAgMTgsICAgICAgICAgMCwgICAgICAgICAgMHgwZiwgICAgICAgNjQsCisgICAgMCwgICAgICAgICAgMHgxNywgICAgICAgMTYsICAgICAgICAgMCwgICAgICAgICAgMHgxOCwgICAgICAgMTcsCisgICAgMCwgICAgICAgICAgMHgzNywgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMTAsICAgICAgICAgMHgwOCwKKyAgICAweDAwLCAgICAgICAweDA3LCAgICAgICAweDBjLCAgICAgICAweDQwLCAgICAgICAweDA3LCAgICAgICAweDBkLAorICAgIDB4ODAsICAgICAgIDB4MDcsICAgICAgIDB4MTcsICAgICAgIDI0LCAgICAgICAgIDAsICAgICAgICAgIDB4MTgsCisgICAgMjUsICAgICAgICAgMCwgICAgICAgICAgMHgyOCwgICAgICAgMjMsICAgICAgICAgMCwgICAgICAgICAgMHgzNywKKyAgICAyMiwgICAgICAgICAwLCAgICAgICAgICAweDY3LCAgICAgICAxOSwgICAgICAgICAwLCAgICAgICAgICAweDY4LAorICAgIDIwLCAgICAgICAgIDAsICAgICAgICAgIDB4NmMsICAgICAgIDIxLCAgICAgICAgIDAsICAgICAgICAgIDU0LAorICAgIDB4MTIsICAgICAgIDE5ODQgJSAyNTYsIDE5ODQgLyAyNTYsIDB4MTMsICAgICAgIDIwNDggJSAyNTYsIDIwNDggLyAyNTYsCisgICAgMHgxNCwgICAgICAgMjExMiAlIDI1NiwgMjExMiAvIDI1NiwgMHgxNSwgICAgICAgMjE3NiAlIDI1NiwgMjE3NiAvIDI1NiwKKyAgICAweDE2LCAgICAgICAyMjQwICUgMjU2LCAyMjQwIC8gMjU2LCAweDE3LCAgICAgICAyMzA0ICUgMjU2LCAyMzA0IC8gMjU2LAorICAgIDB4MWMsICAgICAgIDIzNjggJSAyNTYsIDIzNjggLyAyNTYsIDB4MWQsICAgICAgIDI0MzIgJSAyNTYsIDI0MzIgLyAyNTYsCisgICAgMHgxZSwgICAgICAgMjQ5NiAlIDI1NiwgMjQ5NiAvIDI1NiwgMHgxZiwgICAgICAgMjU2MCAlIDI1NiwgMjU2MCAvIDI1NiwKKyAgICAweDI0LCAgICAgICA1MiwgICAgICAgICAwLCAgICAgICAgICAweDI3LCAgICAgICA1NSwgICAgICAgICAwLAorICAgIDB4MjgsICAgICAgIDU2LCAgICAgICAgIDAsICAgICAgICAgIDB4MmIsICAgICAgIDU5LCAgICAgICAgIDAsCisgICAgMHgyYywgICAgICAgNjAsICAgICAgICAgMCwgICAgICAgICAgMHgzMywgICAgICAgMzIwICUgMjU2LCAgMzIwIC8gMjU2LAorICAgIDB4MzQsICAgICAgIDM4NCAlIDI1NiwgIDM4NCAvIDI1NiwgIDB4MzUsICAgICAgIDQ0OCAlIDI1NiwgIDQ0OCAvIDI1NiwKKyAgICAweDM3LCAgICAgICA1MywgICAgICAgICAwLCAgICAgICAgICAweDM4LCAgICAgICA1NCwgICAgICAgICAwLAorICAgIDB4NTIsICAgICAgIDUwLCAgICAgICAgIDAsICAgICAgICAgIDB4NTMsICAgICAgIDUxLCAgICAgICAgIDAsCisgICAgMHg1NCwgICAgICAgNDQsICAgICAgICAgMCwgICAgICAgICAgMHg1NSwgICAgICAgNDUsICAgICAgICAgMCwKKyAgICAweDU2LCAgICAgICA0NiwgICAgICAgICAwLCAgICAgICAgICAweDU3LCAgICAgICA0NywgICAgICAgICAwLAorICAgIDB4NTgsICAgICAgIDU3LCAgICAgICAgIDAsICAgICAgICAgIDB4NTksICAgICAgIDU4LCAgICAgICAgIDAsCisgICAgMHg1YSwgICAgICAgNjEsICAgICAgICAgMCwgICAgICAgICAgMHg1YiwgICAgICAgMjU2ICUgMjU2LCAgMjU2IC8gMjU2LAorICAgIDB4NjQsICAgICAgIDQ4LCAgICAgICAgIDAsICAgICAgICAgIDB4NjUsICAgICAgIDQ5LCAgICAgICAgIDAsCisgICAgMHg2NiwgICAgICAgNjIsICAgICAgICAgMCwgICAgICAgICAgMHg2NywgICAgICAgNjMsICAgICAgICAgMCwKKyAgICAweDY4LCAgICAgICAzMCwgICAgICAgICAwLCAgICAgICAgICAweDY5LCAgICAgICAzMSwgICAgICAgICAwLAorICAgIDB4NmEsICAgICAgIDMyLCAgICAgICAgIDAsICAgICAgICAgIDB4NmIsICAgICAgIDMzLCAgICAgICAgIDAsCisgICAgMHg2YywgICAgICAgNDAsICAgICAgICAgMCwgICAgICAgICAgMHg2ZCwgICAgICAgNDEsICAgICAgICAgMCwKKyAgICAweGM4LCAgICAgICAxMjgsICAgICAgICAwLCAgICAgICAgICAweGM5LCAgICAgICAxOTIsICAgICAgICAwLAorICAgIDB4Y2EsICAgICAgIDI2LCAgICAgICAgIDAsICAgICAgICAgIDB4Y2IsICAgICAgIDI3LCAgICAgICAgIDAsCisgICAgMHhjYywgICAgICAgMjgsICAgICAgICAgMCwgICAgICAgICAgMHhjZCwgICAgICAgMjksICAgICAgICAgMCwKKyAgICAweGQyLCAgICAgICAzNCwgICAgICAgICAwLCAgICAgICAgICAweGQzLCAgICAgICAzNSwgICAgICAgICAwLAorICAgIDB4ZDQsICAgICAgIDM2LCAgICAgICAgIDAsICAgICAgICAgIDB4ZDUsICAgICAgIDM3LCAgICAgICAgIDAsCisgICAgMHhkNiwgICAgICAgMzgsICAgICAgICAgMCwgICAgICAgICAgMHhkNywgICAgICAgMzksICAgICAgICAgMCwKKyAgICAweGRhLCAgICAgICA0MiwgICAgICAgICAwLCAgICAgICAgICAweGRiLCAgICAgICA0MywgICAgICAgICAwLAorICAgIDIwLCAgICAgICAgIDB4NGEsICAgICAgIDY0MCAlIDI1NiwgIDY0MCAvIDI1NiwgIDB4NGIsICAgICAgIDcwNCAlIDI1NiwKKyAgICA3MDQgLyAyNTYsICAweDRjLCAgICAgICA3NjggJSAyNTYsICA3NjggLyAyNTYsICAweDRkLCAgICAgICA4MzIgJSAyNTYsCisgICAgODMyIC8gMjU2LCAgMHg1MiwgICAgICAgMTI4MCAlIDI1NiwgMTI4MCAvIDI1NiwgMHg1MywgICAgICAgMTM0NCAlIDI1NiwKKyAgICAxMzQ0IC8gMjU2LCAweDU0LCAgICAgICAxNDA4ICUgMjU2LCAxNDA4IC8gMjU2LCAweDU1LCAgICAgICAxNDcyICUgMjU2LAorICAgIDE0NzIgLyAyNTYsIDB4NWEsICAgICAgIDE1MzYgJSAyNTYsIDE1MzYgLyAyNTYsIDB4NWIsICAgICAgIDE2MDAgJSAyNTYsCisgICAgMTYwMCAvIDI1NiwgMHg2NCwgICAgICAgMTY2NCAlIDI1NiwgMTY2NCAvIDI1NiwgMHg2NSwgICAgICAgMTcyOCAlIDI1NiwKKyAgICAxNzI4IC8gMjU2LCAweDZjLCAgICAgICA1MTIgJSAyNTYsICA1MTIgLyAyNTYsICAweDZkLCAgICAgICA1NzYgJSAyNTYsCisgICAgNTc2IC8gMjU2LCAgMHg3MiwgICAgICAgODk2ICUgMjU2LCAgODk2IC8gMjU2LCAgMHg3MywgICAgICAgOTYwICUgMjU2LAorICAgIDk2MCAvIDI1NiwgIDB4NzQsICAgICAgIDEwMjQgJSAyNTYsIDEwMjQgLyAyNTYsIDB4NzUsICAgICAgIDEwODggJSAyNTYsCisgICAgMTA4OCAvIDI1NiwgMHg3NiwgICAgICAgMTE1MiAlIDI1NiwgMTE1MiAvIDI1NiwgMHg3NywgICAgICAgMTIxNiAlIDI1NiwKKyAgICAxMjE2IC8gMjU2LCAweGZmfTsKIHN0YXRpYyBjb25zdCB1aW50OF90IEZheFdoaXRlUnVuSW5zW10gPSB7Ci0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgNiwKLSAgICAweDA3LCAyLCAwLAotICAgIDB4MDgsIDMsIDAsCi0gICAgMHgwQiwgNCwgMCwKLSAgICAweDBDLCA1LCAwLAotICAgIDB4MEUsIDYsIDAsCi0gICAgMHgwRiwgNywgMCwKLSAgICA2LAotICAgIDB4MDcsIDEwLCAwLAotICAgIDB4MDgsIDExLCAwLAotICAgIDB4MTIsIDEyOCwgMCwKLSAgICAweDEzLCA4LCAwLAotICAgIDB4MTQsIDksIDAsCi0gICAgMHgxYiwgNjQsIDAsCi0gICAgOSwKLSAgICAweDAzLCAxMywgMCwKLSAgICAweDA3LCAxLCAwLAotICAgIDB4MDgsIDEyLCAwLAotICAgIDB4MTcsIDE5MiwgMCwKLSAgICAweDE4LCAxNjY0ICUgMjU2LCAxNjY0IC8gMjU2LAotICAgIDB4MmEsIDE2LCAwLAotICAgIDB4MkIsIDE3LCAwLAotICAgIDB4MzQsIDE0LCAwLAotICAgIDB4MzUsIDE1LCAwLAotICAgIDEyLAotICAgIDB4MDMsIDIyLCAwLAotICAgIDB4MDQsIDIzLCAwLAotICAgIDB4MDgsIDIwLCAwLAotICAgIDB4MGMsIDE5LCAwLAotICAgIDB4MTMsIDI2LCAwLAotICAgIDB4MTcsIDIxLCAwLAotICAgIDB4MTgsIDI4LCAwLAotICAgIDB4MjQsIDI3LCAwLAotICAgIDB4MjcsIDE4LCAwLAotICAgIDB4MjgsIDI0LCAwLAotICAgIDB4MkIsIDI1LCAwLAotICAgIDB4MzcsIDI1NiAlIDI1NiwgMjU2IC8gMjU2LAotICAgIDQyLAotICAgIDB4MDIsIDI5LCAwLAotICAgIDB4MDMsIDMwLCAwLAotICAgIDB4MDQsIDQ1LCAwLAotICAgIDB4MDUsIDQ2LCAwLAotICAgIDB4MGEsIDQ3LCAwLAotICAgIDB4MGIsIDQ4LCAwLAotICAgIDB4MTIsIDMzLCAwLAotICAgIDB4MTMsIDM0LCAwLAotICAgIDB4MTQsIDM1LCAwLAotICAgIDB4MTUsIDM2LCAwLAotICAgIDB4MTYsIDM3LCAwLAotICAgIDB4MTcsIDM4LCAwLAotICAgIDB4MWEsIDMxLCAwLAotICAgIDB4MWIsIDMyLCAwLAotICAgIDB4MjQsIDUzLCAwLAotICAgIDB4MjUsIDU0LCAwLAotICAgIDB4MjgsIDM5LCAwLAotICAgIDB4MjksIDQwLCAwLAotICAgIDB4MmEsIDQxLCAwLAotICAgIDB4MmIsIDQyLCAwLAotICAgIDB4MmMsIDQzLCAwLAotICAgIDB4MmQsIDQ0LCAwLAotICAgIDB4MzIsIDYxLCAwLAotICAgIDB4MzMsIDYyLCAwLAotICAgIDB4MzQsIDYzLCAwLAotICAgIDB4MzUsIDAsIDAsCi0gICAgMHgzNiwgMzIwICUgMjU2LCAzMjAgLyAyNTYsCi0gICAgMHgzNywgMzg0ICUgMjU2LCAzODQgLyAyNTYsCi0gICAgMHg0YSwgNTksIDAsCi0gICAgMHg0YiwgNjAsIDAsCi0gICAgMHg1MiwgNDksIDAsCi0gICAgMHg1MywgNTAsIDAsCi0gICAgMHg1NCwgNTEsIDAsCi0gICAgMHg1NSwgNTIsIDAsCi0gICAgMHg1OCwgNTUsIDAsCi0gICAgMHg1OSwgNTYsIDAsCi0gICAgMHg1YSwgNTcsIDAsCi0gICAgMHg1YiwgNTgsIDAsCi0gICAgMHg2NCwgNDQ4ICUgMjU2LCA0NDggLyAyNTYsCi0gICAgMHg2NSwgNTEyICUgMjU2LCA1MTIgLyAyNTYsCi0gICAgMHg2NywgNjQwICUgMjU2LCA2NDAgLyAyNTYsCi0gICAgMHg2OCwgNTc2ICUgMjU2LCA1NzYgLyAyNTYsCi0gICAgMTYsCi0gICAgMHg5OCwgMTQ3MiAlIDI1NiwgMTQ3MiAvIDI1NiwKLSAgICAweDk5LCAxNTM2ICUgMjU2LCAxNTM2IC8gMjU2LAotICAgIDB4OWEsIDE2MDAgJSAyNTYsIDE2MDAgLyAyNTYsCi0gICAgMHg5YiwgMTcyOCAlIDI1NiwgMTcyOCAvIDI1NiwKLSAgICAweGNjLCA3MDQgJSAyNTYsIDcwNCAvIDI1NiwKLSAgICAweGNkLCA3NjggJSAyNTYsIDc2OCAvIDI1NiwKLSAgICAweGQyLCA4MzIgJSAyNTYsIDgzMiAvIDI1NiwKLSAgICAweGQzLCA4OTYgJSAyNTYsIDg5NiAvIDI1NiwKLSAgICAweGQ0LCA5NjAgJSAyNTYsIDk2MCAvIDI1NiwKLSAgICAweGQ1LCAxMDI0ICUgMjU2LCAxMDI0IC8gMjU2LAotICAgIDB4ZDYsIDEwODggJSAyNTYsIDEwODggLyAyNTYsCi0gICAgMHhkNywgMTE1MiAlIDI1NiwgMTE1MiAvIDI1NiwKLSAgICAweGQ4LCAxMjE2ICUgMjU2LCAxMjE2IC8gMjU2LAotICAgIDB4ZDksIDEyODAgJSAyNTYsIDEyODAgLyAyNTYsCi0gICAgMHhkYSwgMTM0NCAlIDI1NiwgMTM0NCAvIDI1NiwKLSAgICAweGRiLCAxNDA4ICUgMjU2LCAxNDA4IC8gMjU2LAotICAgIDAsCi0gICAgMywKLSAgICAweDA4LCAxNzkyICUgMjU2LCAxNzkyIC8gMjU2LAotICAgIDB4MGMsIDE4NTYgJSAyNTYsIDE4NTYgLyAyNTYsCi0gICAgMHgwZCwgMTkyMCAlIDI1NiwgMTkyMCAvIDI1NiwKLSAgICAxMCwKLSAgICAweDEyLCAxOTg0ICUgMjU2LCAxOTg0IC8gMjU2LAotICAgIDB4MTMsIDIwNDggJSAyNTYsIDIwNDggLyAyNTYsCi0gICAgMHgxNCwgMjExMiAlIDI1NiwgMjExMiAvIDI1NiwKLSAgICAweDE1LCAyMTc2ICUgMjU2LCAyMTc2IC8gMjU2LAotICAgIDB4MTYsIDIyNDAgJSAyNTYsIDIyNDAgLyAyNTYsCi0gICAgMHgxNywgMjMwNCAlIDI1NiwgMjMwNCAvIDI1NiwKLSAgICAweDFjLCAyMzY4ICUgMjU2LCAyMzY4IC8gMjU2LAotICAgIDB4MWQsIDI0MzIgJSAyNTYsIDI0MzIgLyAyNTYsCi0gICAgMHgxZSwgMjQ5NiAlIDI1NiwgMjQ5NiAvIDI1NiwKLSAgICAweDFmLCAyNTYwICUgMjU2LCAyNTYwIC8gMjU2LAorICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDYsICAgICAgICAgIDB4MDcsICAgICAgIDIsCisgICAgMCwgICAgICAgICAgMHgwOCwgICAgICAgMywgICAgICAgICAgMCwgICAgICAgICAgMHgwQiwgICAgICAgNCwKKyAgICAwLCAgICAgICAgICAweDBDLCAgICAgICA1LCAgICAgICAgICAwLCAgICAgICAgICAweDBFLCAgICAgICA2LAorICAgIDAsICAgICAgICAgIDB4MEYsICAgICAgIDcsICAgICAgICAgIDAsICAgICAgICAgIDYsICAgICAgICAgIDB4MDcsCisgICAgMTAsICAgICAgICAgMCwgICAgICAgICAgMHgwOCwgICAgICAgMTEsICAgICAgICAgMCwgICAgICAgICAgMHgxMiwKKyAgICAxMjgsICAgICAgICAwLCAgICAgICAgICAweDEzLCAgICAgICA4LCAgICAgICAgICAwLCAgICAgICAgICAweDE0LAorICAgIDksICAgICAgICAgIDAsICAgICAgICAgIDB4MWIsICAgICAgIDY0LCAgICAgICAgIDAsICAgICAgICAgIDksCisgICAgMHgwMywgICAgICAgMTMsICAgICAgICAgMCwgICAgICAgICAgMHgwNywgICAgICAgMSwgICAgICAgICAgMCwKKyAgICAweDA4LCAgICAgICAxMiwgICAgICAgICAwLCAgICAgICAgICAweDE3LCAgICAgICAxOTIsICAgICAgICAwLAorICAgIDB4MTgsICAgICAgIDE2NjQgJSAyNTYsIDE2NjQgLyAyNTYsIDB4MmEsICAgICAgIDE2LCAgICAgICAgIDAsCisgICAgMHgyQiwgICAgICAgMTcsICAgICAgICAgMCwgICAgICAgICAgMHgzNCwgICAgICAgMTQsICAgICAgICAgMCwKKyAgICAweDM1LCAgICAgICAxNSwgICAgICAgICAwLCAgICAgICAgICAxMiwgICAgICAgICAweDAzLCAgICAgICAyMiwKKyAgICAwLCAgICAgICAgICAweDA0LCAgICAgICAyMywgICAgICAgICAwLCAgICAgICAgICAweDA4LCAgICAgICAyMCwKKyAgICAwLCAgICAgICAgICAweDBjLCAgICAgICAxOSwgICAgICAgICAwLCAgICAgICAgICAweDEzLCAgICAgICAyNiwKKyAgICAwLCAgICAgICAgICAweDE3LCAgICAgICAyMSwgICAgICAgICAwLCAgICAgICAgICAweDE4LCAgICAgICAyOCwKKyAgICAwLCAgICAgICAgICAweDI0LCAgICAgICAyNywgICAgICAgICAwLCAgICAgICAgICAweDI3LCAgICAgICAxOCwKKyAgICAwLCAgICAgICAgICAweDI4LCAgICAgICAyNCwgICAgICAgICAwLCAgICAgICAgICAweDJCLCAgICAgICAyNSwKKyAgICAwLCAgICAgICAgICAweDM3LCAgICAgICAyNTYgJSAyNTYsICAyNTYgLyAyNTYsICA0MiwgICAgICAgICAweDAyLAorICAgIDI5LCAgICAgICAgIDAsICAgICAgICAgIDB4MDMsICAgICAgIDMwLCAgICAgICAgIDAsICAgICAgICAgIDB4MDQsCisgICAgNDUsICAgICAgICAgMCwgICAgICAgICAgMHgwNSwgICAgICAgNDYsICAgICAgICAgMCwgICAgICAgICAgMHgwYSwKKyAgICA0NywgICAgICAgICAwLCAgICAgICAgICAweDBiLCAgICAgICA0OCwgICAgICAgICAwLCAgICAgICAgICAweDEyLAorICAgIDMzLCAgICAgICAgIDAsICAgICAgICAgIDB4MTMsICAgICAgIDM0LCAgICAgICAgIDAsICAgICAgICAgIDB4MTQsCisgICAgMzUsICAgICAgICAgMCwgICAgICAgICAgMHgxNSwgICAgICAgMzYsICAgICAgICAgMCwgICAgICAgICAgMHgxNiwKKyAgICAzNywgICAgICAgICAwLCAgICAgICAgICAweDE3LCAgICAgICAzOCwgICAgICAgICAwLCAgICAgICAgICAweDFhLAorICAgIDMxLCAgICAgICAgIDAsICAgICAgICAgIDB4MWIsICAgICAgIDMyLCAgICAgICAgIDAsICAgICAgICAgIDB4MjQsCisgICAgNTMsICAgICAgICAgMCwgICAgICAgICAgMHgyNSwgICAgICAgNTQsICAgICAgICAgMCwgICAgICAgICAgMHgyOCwKKyAgICAzOSwgICAgICAgICAwLCAgICAgICAgICAweDI5LCAgICAgICA0MCwgICAgICAgICAwLCAgICAgICAgICAweDJhLAorICAgIDQxLCAgICAgICAgIDAsICAgICAgICAgIDB4MmIsICAgICAgIDQyLCAgICAgICAgIDAsICAgICAgICAgIDB4MmMsCisgICAgNDMsICAgICAgICAgMCwgICAgICAgICAgMHgyZCwgICAgICAgNDQsICAgICAgICAgMCwgICAgICAgICAgMHgzMiwKKyAgICA2MSwgICAgICAgICAwLCAgICAgICAgICAweDMzLCAgICAgICA2MiwgICAgICAgICAwLCAgICAgICAgICAweDM0LAorICAgIDYzLCAgICAgICAgIDAsICAgICAgICAgIDB4MzUsICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDB4MzYsCisgICAgMzIwICUgMjU2LCAgMzIwIC8gMjU2LCAgMHgzNywgICAgICAgMzg0ICUgMjU2LCAgMzg0IC8gMjU2LCAgMHg0YSwKKyAgICA1OSwgICAgICAgICAwLCAgICAgICAgICAweDRiLCAgICAgICA2MCwgICAgICAgICAwLCAgICAgICAgICAweDUyLAorICAgIDQ5LCAgICAgICAgIDAsICAgICAgICAgIDB4NTMsICAgICAgIDUwLCAgICAgICAgIDAsICAgICAgICAgIDB4NTQsCisgICAgNTEsICAgICAgICAgMCwgICAgICAgICAgMHg1NSwgICAgICAgNTIsICAgICAgICAgMCwgICAgICAgICAgMHg1OCwKKyAgICA1NSwgICAgICAgICAwLCAgICAgICAgICAweDU5LCAgICAgICA1NiwgICAgICAgICAwLCAgICAgICAgICAweDVhLAorICAgIDU3LCAgICAgICAgIDAsICAgICAgICAgIDB4NWIsICAgICAgIDU4LCAgICAgICAgIDAsICAgICAgICAgIDB4NjQsCisgICAgNDQ4ICUgMjU2LCAgNDQ4IC8gMjU2LCAgMHg2NSwgICAgICAgNTEyICUgMjU2LCAgNTEyIC8gMjU2LCAgMHg2NywKKyAgICA2NDAgJSAyNTYsICA2NDAgLyAyNTYsICAweDY4LCAgICAgICA1NzYgJSAyNTYsICA1NzYgLyAyNTYsICAxNiwKKyAgICAweDk4LCAgICAgICAxNDcyICUgMjU2LCAxNDcyIC8gMjU2LCAweDk5LCAgICAgICAxNTM2ICUgMjU2LCAxNTM2IC8gMjU2LAorICAgIDB4OWEsICAgICAgIDE2MDAgJSAyNTYsIDE2MDAgLyAyNTYsIDB4OWIsICAgICAgIDE3MjggJSAyNTYsIDE3MjggLyAyNTYsCisgICAgMHhjYywgICAgICAgNzA0ICUgMjU2LCAgNzA0IC8gMjU2LCAgMHhjZCwgICAgICAgNzY4ICUgMjU2LCAgNzY4IC8gMjU2LAorICAgIDB4ZDIsICAgICAgIDgzMiAlIDI1NiwgIDgzMiAvIDI1NiwgIDB4ZDMsICAgICAgIDg5NiAlIDI1NiwgIDg5NiAvIDI1NiwKKyAgICAweGQ0LCAgICAgICA5NjAgJSAyNTYsICA5NjAgLyAyNTYsICAweGQ1LCAgICAgICAxMDI0ICUgMjU2LCAxMDI0IC8gMjU2LAorICAgIDB4ZDYsICAgICAgIDEwODggJSAyNTYsIDEwODggLyAyNTYsIDB4ZDcsICAgICAgIDExNTIgJSAyNTYsIDExNTIgLyAyNTYsCisgICAgMHhkOCwgICAgICAgMTIxNiAlIDI1NiwgMTIxNiAvIDI1NiwgMHhkOSwgICAgICAgMTI4MCAlIDI1NiwgMTI4MCAvIDI1NiwKKyAgICAweGRhLCAgICAgICAxMzQ0ICUgMjU2LCAxMzQ0IC8gMjU2LCAweGRiLCAgICAgICAxNDA4ICUgMjU2LCAxNDA4IC8gMjU2LAorICAgIDAsICAgICAgICAgIDMsICAgICAgICAgIDB4MDgsICAgICAgIDE3OTIgJSAyNTYsIDE3OTIgLyAyNTYsIDB4MGMsCisgICAgMTg1NiAlIDI1NiwgMTg1NiAvIDI1NiwgMHgwZCwgICAgICAgMTkyMCAlIDI1NiwgMTkyMCAvIDI1NiwgMTAsCisgICAgMHgxMiwgICAgICAgMTk4NCAlIDI1NiwgMTk4NCAvIDI1NiwgMHgxMywgICAgICAgMjA0OCAlIDI1NiwgMjA0OCAvIDI1NiwKKyAgICAweDE0LCAgICAgICAyMTEyICUgMjU2LCAyMTEyIC8gMjU2LCAweDE1LCAgICAgICAyMTc2ICUgMjU2LCAyMTc2IC8gMjU2LAorICAgIDB4MTYsICAgICAgIDIyNDAgJSAyNTYsIDIyNDAgLyAyNTYsIDB4MTcsICAgICAgIDIzMDQgJSAyNTYsIDIzMDQgLyAyNTYsCisgICAgMHgxYywgICAgICAgMjM2OCAlIDI1NiwgMjM2OCAvIDI1NiwgMHgxZCwgICAgICAgMjQzMiAlIDI1NiwgMjQzMiAvIDI1NiwKKyAgICAweDFlLCAgICAgICAyNDk2ICUgMjU2LCAyNDk2IC8gMjU2LCAweDFmLCAgICAgICAyNTYwICUgMjU2LCAyNTYwIC8gMjU2LAogICAgIDB4ZmYsCiB9OwotaW50IF9GYXhHZXRSdW4oY29uc3QgdWludDhfdCogaW5zX2FycmF5LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQmIGJpdHBvcywgaW50IGJpdHNpemUpCi17Ci0gICAgRlhfRFdPUkQgY29kZSA9IDA7Ci0gICAgaW50IGluc19vZmYgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHVpbnQ4X3QgaW5zID0gaW5zX2FycmF5W2luc19vZmYrK107Ci0gICAgICAgIGlmIChpbnMgPT0gMHhmZikgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGNvZGUgPDw9IDE7Ci0gICAgICAgIGlmIChzcmNfYnVmW2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MgJSA4KSkpIHsKLSAgICAgICAgICAgIGNvZGUgKys7Ci0gICAgICAgIH0KLSAgICAgICAgYml0cG9zICsrOwotICAgICAgICBpbnQgbmV4dF9vZmYgPSBpbnNfb2ZmICsgaW5zICogMzsKLSAgICAgICAgZm9yICg7IGluc19vZmYgPCBuZXh0X29mZjsgaW5zX29mZiArPSAzKSB7Ci0gICAgICAgICAgICBpZiAoaW5zX2FycmF5W2luc19vZmZdID09IGNvZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5zX2FycmF5W2luc19vZmYgKyAxXSArIGluc19hcnJheVtpbnNfb2ZmICsgMl0gKiAyNTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK2ludCBfRmF4R2V0UnVuKGNvbnN0IHVpbnQ4X3QqIGluc19hcnJheSwKKyAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICBpbnQmIGJpdHBvcywKKyAgICAgICAgICAgICAgIGludCBiaXRzaXplKSB7CisgIEZYX0RXT1JEIGNvZGUgPSAwOworICBpbnQgaW5zX29mZiA9IDA7CisgIHdoaWxlICgxKSB7CisgICAgdWludDhfdCBpbnMgPSBpbnNfYXJyYXlbaW5zX29mZisrXTsKKyAgICBpZiAoaW5zID09IDB4ZmYpIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9Ci19Ci1GWF9CT09MIF9GYXhHNEdldFJvdyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MsIHVpbnQ4X3QqIGRlc3RfYnVmLCBjb25zdCB1aW50OF90KiByZWZfYnVmLCBpbnQgY29sdW1ucykKLXsKLSAgICBpbnQgYTAgPSAtMSwgYTBjb2xvciA9IDE7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGExLCBhMiwgYjEsIGIyOwotICAgICAgICBfRmF4RzRGaW5kQjFCMihyZWZfYnVmLCBjb2x1bW5zLCBhMCwgYTBjb2xvciwgYjEsIGIyKTsKLSAgICAgICAgRlhfQk9PTCBiaXQgPSBORVhUQklUOwotICAgICAgICBpbnQgdl9kZWx0YSA9IDA7Ci0gICAgICAgIGlmIChiaXQpIHsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0JPT0wgYml0MSA9IE5FWFRCSVQ7Ci0gICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CT09MIGJpdDIgPSBORVhUQklUOwotICAgICAgICAgICAgaWYgKGJpdDEgJiYgYml0MikgewotICAgICAgICAgICAgICAgIHZfZGVsdGEgPSAxOwotICAgICAgICAgICAgfSBlbHNlIGlmIChiaXQxKSB7Ci0gICAgICAgICAgICAgICAgdl9kZWx0YSA9IC0xOwotICAgICAgICAgICAgfSBlbHNlIGlmIChiaXQyKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJ1bl9sZW4xID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgcnVuID0gX0ZheEdldFJ1bihhMGNvbG9yID8gRmF4V2hpdGVSdW5JbnMgOiBGYXhCbGFja1J1bklucywgc3JjX2J1ZiwgYml0cG9zLCBiaXRzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcnVuX2xlbjEgKz0gcnVuOwotICAgICAgICAgICAgICAgICAgICBpZiAocnVuIDwgNjQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhMCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcnVuX2xlbjEgKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGExID0gYTAgKyBydW5fbGVuMTsKLSAgICAgICAgICAgICAgICBpZiAoIWEwY29sb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgX0ZheEZpbGxCaXRzKGRlc3RfYnVmLCBjb2x1bW5zLCBhMCwgYTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgcnVuX2xlbjIgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBydW4gPSBfRmF4R2V0UnVuKGEwY29sb3IgPyBGYXhCbGFja1J1bklucyA6IEZheFdoaXRlUnVuSW5zLCBzcmNfYnVmLCBiaXRwb3MsIGJpdHNpemUpOwotICAgICAgICAgICAgICAgICAgICBydW5fbGVuMiArPSBydW47Ci0gICAgICAgICAgICAgICAgICAgIGlmIChydW4gPCA2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYTIgPSBhMSArIHJ1bl9sZW4yOwotICAgICAgICAgICAgICAgIGlmIChhMGNvbG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9GYXhGaWxsQml0cyhkZXN0X2J1ZiwgY29sdW1ucywgYTEsIGEyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYTAgPSBhMjsKLSAgICAgICAgICAgICAgICBpZiAoYTAgPCBjb2x1bW5zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYml0ID0gTkVYVEJJVDsKLSAgICAgICAgICAgICAgICBpZiAoYml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYTBjb2xvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgX0ZheEZpbGxCaXRzKGRlc3RfYnVmLCBjb2x1bW5zLCBhMCwgYjIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiMiA+PSBjb2x1bW5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhMCA9IGIyOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJpdDEgPSBORVhUQklUOwotICAgICAgICAgICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJpdDIgPSBORVhUQklUOwotICAgICAgICAgICAgICAgICAgICBpZiAoYml0MSAmJiBiaXQyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2X2RlbHRhID0gMjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaXQxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2X2RlbHRhID0gLTI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0MikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYml0ID0gTkVYVEJJVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2RlbHRhID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9kZWx0YSA9IC0zOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYml0ID0gTkVYVEJJVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRwb3MgKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cG9zICs9IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYTEgPSBiMSArIHZfZGVsdGE7Ci0gICAgICAgIGlmICghYTBjb2xvcikgewotICAgICAgICAgICAgX0ZheEZpbGxCaXRzKGRlc3RfYnVmLCBjb2x1bW5zLCBhMCwgYTEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhMSA+PSBjb2x1bW5zKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBhMCA9IGExOwotICAgICAgICBhMGNvbG9yID0gIWEwY29sb3I7Ci0gICAgfQotfQotRlhfQk9PTCBfRmF4U2tpcEVPTChjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpCi17Ci0gICAgaW50IHN0YXJ0Yml0ID0gYml0cG9zOwotICAgIHdoaWxlIChiaXRwb3MgPCBiaXRzaXplKSB7Ci0gICAgICAgIGludCBiaXQgPSBORVhUQklUOwotICAgICAgICBpZiAoYml0KSB7Ci0gICAgICAgICAgICBpZiAoYml0cG9zIC0gc3RhcnRiaXQgPD0gMTEpIHsKLSAgICAgICAgICAgICAgICBiaXRwb3MgPSBzdGFydGJpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgX0ZheEdldDFETGluZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgY29sdW1ucykKLXsKLSAgICBpbnQgY29sb3IgPSBUUlVFOwotICAgIGludCBzdGFydHBvcyA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHJ1bl9sZW4gPSAwOwotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaW50IHJ1biA9IF9GYXhHZXRSdW4oY29sb3IgPyBGYXhXaGl0ZVJ1bklucyA6IEZheEJsYWNrUnVuSW5zLCBzcmNfYnVmLCBiaXRwb3MsIGJpdHNpemUpOwotICAgICAgICAgICAgaWYgKHJ1biA8IDApIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYml0cG9zIDwgYml0c2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgYml0ID0gTkVYVEJJVDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVuX2xlbiArPSBydW47Ci0gICAgICAgICAgICBpZiAocnVuIDwgNjQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWNvbG9yKSB7Ci0gICAgICAgICAgICBfRmF4RmlsbEJpdHMoZGVzdF9idWYsIGNvbHVtbnMsIHN0YXJ0cG9zLCBzdGFydHBvcyArIHJ1bl9sZW4pOwotICAgICAgICB9Ci0gICAgICAgIHN0YXJ0cG9zICs9IHJ1bl9sZW47Ci0gICAgICAgIGlmIChzdGFydHBvcyA+PSBjb2x1bW5zKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjb2xvciA9ICFjb2xvcjsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1jbGFzcyBDQ29kZWNfRmF4RGVjb2RlciA6IHB1YmxpYyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyCi17Ci1wdWJsaWM6Ci0gICAgQ0NvZGVjX0ZheERlY29kZXIoKTsKLSAgICB2aXJ0dWFsIH5DQ29kZWNfRmF4RGVjb2RlcigpOwotICAgIEZYX0JPT0wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEssIEZYX0JPT0wgRW5kT2ZMaW5lLCBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sIEZYX0JPT0wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cyk7Ci0gICAgdmlydHVhbCB2b2lkCQl2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9SZXdpbmQoKTsKLSAgICB2aXJ0dWFsIHVpbnQ4X3QqCXZfR2V0TmV4dExpbmUoKTsKLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFNyY09mZnNldCgpOwotICAgIGludAkJCW1fRW5jb2RpbmcsIG1fYkVuZE9mTGluZSwgbV9iQnl0ZUFsaWduLCBtX2JCbGFjazsKLSAgICBpbnQJCQliaXRwb3M7Ci0gICAgY29uc3QgdWludDhfdCoJbV9wU3JjQnVmOwotICAgIEZYX0RXT1JECW1fU3JjU2l6ZTsKLSAgICB1aW50OF90KgltX3BTY2FubGluZUJ1ZjsKLSAgICB1aW50OF90KgltX3BSZWZCdWY7Ci19OwotQ0NvZGVjX0ZheERlY29kZXI6OkNDb2RlY19GYXhEZWNvZGVyKCkKLXsKLSAgICBtX3BTY2FubGluZUJ1ZiA9IE5VTEw7Ci0gICAgbV9wUmVmQnVmID0gTlVMTDsKLX0KLUNDb2RlY19GYXhEZWNvZGVyOjp+Q0NvZGVjX0ZheERlY29kZXIoKQotewotICAgIGlmIChtX3BTY2FubGluZUJ1ZikgewotICAgICAgICBGWF9GcmVlKG1fcFNjYW5saW5lQnVmKTsKLSAgICB9Ci0gICAgaWYgKG1fcFJlZkJ1ZikgewotICAgICAgICBGWF9GcmVlKG1fcFJlZkJ1Zik7Ci0gICAgfQotfQotRlhfQk9PTCBDQ29kZWNfRmF4RGVjb2Rlcjo6Q3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEssIEZYX0JPT0wgRW5kT2ZMaW5lLCBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sIEZYX0JPT0wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cykKLXsKLSAgICBtX0VuY29kaW5nID0gSzsKLSAgICBtX2JFbmRPZkxpbmUgPSBFbmRPZkxpbmU7Ci0gICAgbV9iQnl0ZUFsaWduID0gRW5jb2RlZEJ5dGVBbGlnbjsKLSAgICBtX2JCbGFjayA9IEJsYWNrSXMxOwotICAgIG1fT3JpZ1dpZHRoID0gQ29sdW1uczsKLSAgICBtX09yaWdIZWlnaHQgPSBSb3dzOwotICAgIGlmIChtX09yaWdXaWR0aCA9PSAwKSB7Ci0gICAgICAgIG1fT3JpZ1dpZHRoID0gd2lkdGg7Ci0gICAgfQotICAgIGlmIChtX09yaWdIZWlnaHQgPT0gMCkgewotICAgICAgICBtX09yaWdIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgfQotICAgIG1fUGl0Y2ggPSAobV9PcmlnV2lkdGggKyAzMSkgLyAzMiAqIDQ7Ci0gICAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoOwotICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0OwotICAgIG1fcFNjYW5saW5lQnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7Ci0gICAgbV9wUmVmQnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7Ci0gICAgbV9wU3JjQnVmID0gc3JjX2J1ZjsKLSAgICBtX1NyY1NpemUgPSBzcmNfc2l6ZTsKLSAgICBtX25Db21wcyA9IDE7Ci0gICAgbV9icGMgPSAxOwotICAgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0NvZGVjX0ZheERlY29kZXI6OnZfUmV3aW5kKCkKLXsKLSAgICBGWFNZU19tZW1zZXQobV9wUmVmQnVmLCAweGZmLCBtX1BpdGNoKTsKLSAgICBiaXRwb3MgPSAwOwotICAgIHJldHVybiBUUlVFOwotfQotdWludDhfdCogQ0NvZGVjX0ZheERlY29kZXI6OnZfR2V0TmV4dExpbmUoKQotewotICAgIGludCBiaXRzaXplID0gbV9TcmNTaXplICogODsKLSAgICBfRmF4U2tpcEVPTChtX3BTcmNCdWYsIGJpdHNpemUsIGJpdHBvcyk7CiAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBGWFNZU19tZW1zZXQobV9wU2NhbmxpbmVCdWYsIDB4ZmYsIG1fUGl0Y2gpOwotICAgIGlmIChtX0VuY29kaW5nIDwgMCkgewotICAgICAgICBfRmF4RzRHZXRSb3cobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX3BSZWZCdWYsIG1fT3JpZ1dpZHRoKTsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFJlZkJ1ZiwgbV9wU2NhbmxpbmVCdWYsIG1fUGl0Y2gpOwotICAgIH0gZWxzZSBpZiAobV9FbmNvZGluZyA9PSAwKSB7Ci0gICAgICAgIF9GYXhHZXQxRExpbmUobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX09yaWdXaWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhfQk9PTCBiTmV4dDFEID0gbV9wU3JjQnVmW2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MgJSA4KSk7Ci0gICAgICAgIGJpdHBvcyArKzsKLSAgICAgICAgaWYgKGJOZXh0MUQpIHsKLSAgICAgICAgICAgIF9GYXhHZXQxRExpbmUobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX09yaWdXaWR0aCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBfRmF4RzRHZXRSb3cobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX3BSZWZCdWYsIG1fT3JpZ1dpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBGWFNZU19tZW1jcHkobV9wUmVmQnVmLCBtX3BTY2FubGluZUJ1ZiwgbV9QaXRjaCk7CisgICAgY29kZSA8PD0gMTsKKyAgICBpZiAoc3JjX2J1ZltiaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zICUgOCkpKSB7CisgICAgICBjb2RlKys7CiAgICAgfQotICAgIGlmIChtX2JFbmRPZkxpbmUpIHsKLSAgICAgICAgX0ZheFNraXBFT0wobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MpOworICAgIGJpdHBvcysrOworICAgIGludCBuZXh0X29mZiA9IGluc19vZmYgKyBpbnMgKiAzOworICAgIGZvciAoOyBpbnNfb2ZmIDwgbmV4dF9vZmY7IGluc19vZmYgKz0gMykgeworICAgICAgaWYgKGluc19hcnJheVtpbnNfb2ZmXSA9PSBjb2RlKSB7CisgICAgICAgIHJldHVybiBpbnNfYXJyYXlbaW5zX29mZiArIDFdICsgaW5zX2FycmF5W2luc19vZmYgKyAyXSAqIDI1NjsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1fYkJ5dGVBbGlnbiAmJiBiaXRwb3MgPCBiaXRzaXplKSB7Ci0gICAgICAgIGludCBiaXRwb3MwID0gYml0cG9zOwotICAgICAgICBpbnQgYml0cG9zMSA9IChiaXRwb3MgKyA3KSAvIDggKiA4OwotICAgICAgICB3aGlsZSAobV9iQnl0ZUFsaWduICYmIGJpdHBvczAgPCBiaXRwb3MxKSB7Ci0gICAgICAgICAgICBpbnQgYml0ID0gbV9wU3JjQnVmW2JpdHBvczAgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zMCAlIDgpKTsKLSAgICAgICAgICAgIGlmIChiaXQgIT0gMCkgewotICAgICAgICAgICAgICAgIG1fYkJ5dGVBbGlnbiA9IEZBTFNFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiaXRwb3MwICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2JCeXRlQWxpZ24pIHsKLSAgICAgICAgICAgIGJpdHBvcyA9IGJpdHBvczE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fYkJsYWNrKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9QaXRjaDsgaSArKykgewotICAgICAgICAgICAgbV9wU2NhbmxpbmVCdWZbaV0gPSB+bV9wU2NhbmxpbmVCdWZbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1fcFNjYW5saW5lQnVmOworICB9CiB9Ci1GWF9EV09SRCBDQ29kZWNfRmF4RGVjb2Rlcjo6R2V0U3JjT2Zmc2V0KCkKLXsKLSAgICBGWF9EV09SRCByZXQgPSAoYml0cG9zICsgNykgLyA4OwotICAgIGlmIChyZXQgPiBtX1NyY1NpemUpIHsKLSAgICAgICAgcmV0ID0gbV9TcmNTaXplOworRlhfQk9PTCBfRmF4RzRHZXRSb3coY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzaXplLAorICAgICAgICAgICAgICAgICAgICAgaW50JiBiaXRwb3MsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZl9idWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1ucykgeworICBpbnQgYTAgPSAtMSwgYTBjb2xvciA9IDE7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiByZXQ7CisgICAgaW50IGExLCBhMiwgYjEsIGIyOworICAgIF9GYXhHNEZpbmRCMUIyKHJlZl9idWYsIGNvbHVtbnMsIGEwLCBhMGNvbG9yLCBiMSwgYjIpOworICAgIEZYX0JPT0wgYml0ID0gTkVYVEJJVDsKKyAgICBpbnQgdl9kZWx0YSA9IDA7CisgICAgaWYgKGJpdCkgeworICAgIH0gZWxzZSB7CisgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgRlhfQk9PTCBiaXQxID0gTkVYVEJJVDsKKyAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBGWF9CT09MIGJpdDIgPSBORVhUQklUOworICAgICAgaWYgKGJpdDEgJiYgYml0MikgeworICAgICAgICB2X2RlbHRhID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoYml0MSkgeworICAgICAgICB2X2RlbHRhID0gLTE7CisgICAgICB9IGVsc2UgaWYgKGJpdDIpIHsKKyAgICAgICAgaW50IHJ1bl9sZW4xID0gMDsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICBpbnQgcnVuID0gX0ZheEdldFJ1bihhMGNvbG9yID8gRmF4V2hpdGVSdW5JbnMgOiBGYXhCbGFja1J1bklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYnVmLCBiaXRwb3MsIGJpdHNpemUpOworICAgICAgICAgIHJ1bl9sZW4xICs9IHJ1bjsKKyAgICAgICAgICBpZiAocnVuIDwgNjQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYTAgPCAwKSB7CisgICAgICAgICAgcnVuX2xlbjErKzsKKyAgICAgICAgfQorICAgICAgICBhMSA9IGEwICsgcnVuX2xlbjE7CisgICAgICAgIGlmICghYTBjb2xvcikgeworICAgICAgICAgIF9GYXhGaWxsQml0cyhkZXN0X2J1ZiwgY29sdW1ucywgYTAsIGExKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgcnVuX2xlbjIgPSAwOworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgIGludCBydW4gPSBfRmF4R2V0UnVuKGEwY29sb3IgPyBGYXhCbGFja1J1bklucyA6IEZheFdoaXRlUnVuSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19idWYsIGJpdHBvcywgYml0c2l6ZSk7CisgICAgICAgICAgcnVuX2xlbjIgKz0gcnVuOworICAgICAgICAgIGlmIChydW4gPCA2NCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGEyID0gYTEgKyBydW5fbGVuMjsKKyAgICAgICAgaWYgKGEwY29sb3IpIHsKKyAgICAgICAgICBfRmF4RmlsbEJpdHMoZGVzdF9idWYsIGNvbHVtbnMsIGExLCBhMik7CisgICAgICAgIH0KKyAgICAgICAgYTAgPSBhMjsKKyAgICAgICAgaWYgKGEwIDwgY29sdW1ucykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGJpdCA9IE5FWFRCSVQ7CisgICAgICAgIGlmIChiaXQpIHsKKyAgICAgICAgICBpZiAoIWEwY29sb3IpIHsKKyAgICAgICAgICAgIF9GYXhGaWxsQml0cyhkZXN0X2J1ZiwgY29sdW1ucywgYTAsIGIyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGIyID49IGNvbHVtbnMpIHsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgICBhMCA9IGIyOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKyAgICAgICAgICBGWF9CT09MIGJpdDEgPSBORVhUQklUOworICAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKyAgICAgICAgICBGWF9CT09MIGJpdDIgPSBORVhUQklUOworICAgICAgICAgIGlmIChiaXQxICYmIGJpdDIpIHsKKyAgICAgICAgICAgIHZfZGVsdGEgPSAyOworICAgICAgICAgIH0gZWxzZSBpZiAoYml0MSkgeworICAgICAgICAgICAgdl9kZWx0YSA9IC0yOworICAgICAgICAgIH0gZWxzZSBpZiAoYml0MikgeworICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJpdCA9IE5FWFRCSVQ7CisgICAgICAgICAgICBpZiAoYml0KSB7CisgICAgICAgICAgICAgIHZfZGVsdGEgPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdl9kZWx0YSA9IC0zOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYml0ID0gTkVYVEJJVDsKKyAgICAgICAgICAgIGlmIChiaXQpIHsKKyAgICAgICAgICAgICAgYml0cG9zICs9IDM7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgYml0cG9zICs9IDU7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBhMSA9IGIxICsgdl9kZWx0YTsKKyAgICBpZiAoIWEwY29sb3IpIHsKKyAgICAgIF9GYXhGaWxsQml0cyhkZXN0X2J1ZiwgY29sdW1ucywgYTAsIGExKTsKKyAgICB9CisgICAgaWYgKGExID49IGNvbHVtbnMpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBhMCA9IGExOworICAgIGEwY29sb3IgPSAhYTBjb2xvcjsKKyAgfQorfQorRlhfQk9PTCBfRmF4U2tpcEVPTChjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpIHsKKyAgaW50IHN0YXJ0Yml0ID0gYml0cG9zOworICB3aGlsZSAoYml0cG9zIDwgYml0c2l6ZSkgeworICAgIGludCBiaXQgPSBORVhUQklUOworICAgIGlmIChiaXQpIHsKKyAgICAgIGlmIChiaXRwb3MgLSBzdGFydGJpdCA8PSAxMSkgeworICAgICAgICBiaXRwb3MgPSBzdGFydGJpdDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIF9GYXhHZXQxRExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQmIGJpdHBvcywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1ucykgeworICBpbnQgY29sb3IgPSBUUlVFOworICBpbnQgc3RhcnRwb3MgPSAwOworICB3aGlsZSAoMSkgeworICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpbnQgcnVuX2xlbiA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGludCBydW4gPSBfRmF4R2V0UnVuKGNvbG9yID8gRmF4V2hpdGVSdW5JbnMgOiBGYXhCbGFja1J1bklucywgc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHBvcywgYml0c2l6ZSk7CisgICAgICBpZiAocnVuIDwgMCkgeworICAgICAgICB3aGlsZSAoYml0cG9zIDwgYml0c2l6ZSkgeworICAgICAgICAgIGludCBiaXQgPSBORVhUQklUOworICAgICAgICAgIGlmIChiaXQpIHsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBydW5fbGVuICs9IHJ1bjsKKyAgICAgIGlmIChydW4gPCA2NCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFjb2xvcikgeworICAgICAgX0ZheEZpbGxCaXRzKGRlc3RfYnVmLCBjb2x1bW5zLCBzdGFydHBvcywgc3RhcnRwb3MgKyBydW5fbGVuKTsKKyAgICB9CisgICAgc3RhcnRwb3MgKz0gcnVuX2xlbjsKKyAgICBpZiAoc3RhcnRwb3MgPj0gY29sdW1ucykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNvbG9yID0gIWNvbG9yOworICB9CisgIHJldHVybiBUUlVFOworfQorY2xhc3MgQ0NvZGVjX0ZheERlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX1NjYW5saW5lRGVjb2RlciB7CisgcHVibGljOgorICBDQ29kZWNfRmF4RGVjb2RlcigpOworICB2aXJ0dWFsIH5DQ29kZWNfRmF4RGVjb2RlcigpOworICBGWF9CT09MIENyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICBpbnQgSywKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBFbmRPZkxpbmUsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgRW5jb2RlZEJ5dGVBbGlnbiwKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBCbGFja0lzMSwKKyAgICAgICAgICAgICAgICAgaW50IENvbHVtbnMsCisgICAgICAgICAgICAgICAgIGludCBSb3dzKTsKKyAgdmlydHVhbCB2b2lkIHZfRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIHt9CisgIHZpcnR1YWwgRlhfQk9PTCB2X1Jld2luZCgpOworICB2aXJ0dWFsIHVpbnQ4X3QqIHZfR2V0TmV4dExpbmUoKTsKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRTcmNPZmZzZXQoKTsKKyAgaW50IG1fRW5jb2RpbmcsIG1fYkVuZE9mTGluZSwgbV9iQnl0ZUFsaWduLCBtX2JCbGFjazsKKyAgaW50IGJpdHBvczsKKyAgY29uc3QgdWludDhfdCogbV9wU3JjQnVmOworICBGWF9EV09SRCBtX1NyY1NpemU7CisgIHVpbnQ4X3QqIG1fcFNjYW5saW5lQnVmOworICB1aW50OF90KiBtX3BSZWZCdWY7Cit9OworQ0NvZGVjX0ZheERlY29kZXI6OkNDb2RlY19GYXhEZWNvZGVyKCkgeworICBtX3BTY2FubGluZUJ1ZiA9IE5VTEw7CisgIG1fcFJlZkJ1ZiA9IE5VTEw7Cit9CitDQ29kZWNfRmF4RGVjb2Rlcjo6fkNDb2RlY19GYXhEZWNvZGVyKCkgeworICBpZiAobV9wU2NhbmxpbmVCdWYpIHsKKyAgICBGWF9GcmVlKG1fcFNjYW5saW5lQnVmKTsKKyAgfQorICBpZiAobV9wUmVmQnVmKSB7CisgICAgRlhfRnJlZShtX3BSZWZCdWYpOworICB9Cit9CitGWF9CT09MIENDb2RlY19GYXhEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEVuZE9mTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBCbGFja0lzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgUm93cykgeworICBtX0VuY29kaW5nID0gSzsKKyAgbV9iRW5kT2ZMaW5lID0gRW5kT2ZMaW5lOworICBtX2JCeXRlQWxpZ24gPSBFbmNvZGVkQnl0ZUFsaWduOworICBtX2JCbGFjayA9IEJsYWNrSXMxOworICBtX09yaWdXaWR0aCA9IENvbHVtbnM7CisgIG1fT3JpZ0hlaWdodCA9IFJvd3M7CisgIGlmIChtX09yaWdXaWR0aCA9PSAwKSB7CisgICAgbV9PcmlnV2lkdGggPSB3aWR0aDsKKyAgfQorICBpZiAobV9PcmlnSGVpZ2h0ID09IDApIHsKKyAgICBtX09yaWdIZWlnaHQgPSBoZWlnaHQ7CisgIH0KKyAgbV9QaXRjaCA9IChtX09yaWdXaWR0aCArIDMxKSAvIDMyICogNDsKKyAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoOworICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodDsKKyAgbV9wU2NhbmxpbmVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKKyAgbV9wUmVmQnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7CisgIG1fcFNyY0J1ZiA9IHNyY19idWY7CisgIG1fU3JjU2l6ZSA9IHNyY19zaXplOworICBtX25Db21wcyA9IDE7CisgIG1fYnBjID0gMTsKKyAgbV9iQ29sb3JUcmFuc2Zvcm1lZCA9IEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0NvZGVjX0ZheERlY29kZXI6OnZfUmV3aW5kKCkgeworICBGWFNZU19tZW1zZXQobV9wUmVmQnVmLCAweGZmLCBtX1BpdGNoKTsKKyAgYml0cG9zID0gMDsKKyAgcmV0dXJuIFRSVUU7Cit9Cit1aW50OF90KiBDQ29kZWNfRmF4RGVjb2Rlcjo6dl9HZXROZXh0TGluZSgpIHsKKyAgaW50IGJpdHNpemUgPSBtX1NyY1NpemUgKiA4OworICBfRmF4U2tpcEVPTChtX3BTcmNCdWYsIGJpdHNpemUsIGJpdHBvcyk7CisgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYU1lTX21lbXNldChtX3BTY2FubGluZUJ1ZiwgMHhmZiwgbV9QaXRjaCk7CisgIGlmIChtX0VuY29kaW5nIDwgMCkgeworICAgIF9GYXhHNEdldFJvdyhtX3BTcmNCdWYsIGJpdHNpemUsIGJpdHBvcywgbV9wU2NhbmxpbmVCdWYsIG1fcFJlZkJ1ZiwKKyAgICAgICAgICAgICAgICAgbV9PcmlnV2lkdGgpOworICAgIEZYU1lTX21lbWNweShtX3BSZWZCdWYsIG1fcFNjYW5saW5lQnVmLCBtX1BpdGNoKTsKKyAgfSBlbHNlIGlmIChtX0VuY29kaW5nID09IDApIHsKKyAgICBfRmF4R2V0MURMaW5lKG1fcFNyY0J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9PcmlnV2lkdGgpOworICB9IGVsc2UgeworICAgIEZYX0JPT0wgYk5leHQxRCA9IG1fcFNyY0J1ZltiaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zICUgOCkpOworICAgIGJpdHBvcysrOworICAgIGlmIChiTmV4dDFEKSB7CisgICAgICBfRmF4R2V0MURMaW5lKG1fcFNyY0J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9PcmlnV2lkdGgpOworICAgIH0gZWxzZSB7CisgICAgICBfRmF4RzRHZXRSb3cobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX3BSZWZCdWYsCisgICAgICAgICAgICAgICAgICAgbV9PcmlnV2lkdGgpOworICAgIH0KKyAgICBGWFNZU19tZW1jcHkobV9wUmVmQnVmLCBtX3BTY2FubGluZUJ1ZiwgbV9QaXRjaCk7CisgIH0KKyAgaWYgKG1fYkVuZE9mTGluZSkgeworICAgIF9GYXhTa2lwRU9MKG1fcFNyY0J1ZiwgYml0c2l6ZSwgYml0cG9zKTsKKyAgfQorICBpZiAobV9iQnl0ZUFsaWduICYmIGJpdHBvcyA8IGJpdHNpemUpIHsKKyAgICBpbnQgYml0cG9zMCA9IGJpdHBvczsKKyAgICBpbnQgYml0cG9zMSA9IChiaXRwb3MgKyA3KSAvIDggKiA4OworICAgIHdoaWxlIChtX2JCeXRlQWxpZ24gJiYgYml0cG9zMCA8IGJpdHBvczEpIHsKKyAgICAgIGludCBiaXQgPSBtX3BTcmNCdWZbYml0cG9zMCAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MwICUgOCkpOworICAgICAgaWYgKGJpdCAhPSAwKSB7CisgICAgICAgIG1fYkJ5dGVBbGlnbiA9IEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYml0cG9zMCsrOworICAgICAgfQorICAgIH0KKyAgICBpZiAobV9iQnl0ZUFsaWduKSB7CisgICAgICBiaXRwb3MgPSBiaXRwb3MxOworICAgIH0KKyAgfQorICBpZiAobV9iQmxhY2spIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fUGl0Y2g7IGkrKykgeworICAgICAgbV9wU2NhbmxpbmVCdWZbaV0gPSB+bV9wU2NhbmxpbmVCdWZbaV07CisgICAgfQorICB9CisgIHJldHVybiBtX3BTY2FubGluZUJ1ZjsKK30KK0ZYX0RXT1JEIENDb2RlY19GYXhEZWNvZGVyOjpHZXRTcmNPZmZzZXQoKSB7CisgIEZYX0RXT1JEIHJldCA9IChiaXRwb3MgKyA3KSAvIDg7CisgIGlmIChyZXQgPiBtX1NyY1NpemUpIHsKKyAgICByZXQgPSBtX1NyY1NpemU7CisgIH0KKyAgcmV0dXJuIHJldDsKIH0KIGV4dGVybiAiQyIgewotICAgIHZvaWQgX0ZheEc0RGVjb2RlKHZvaWQqLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50KiBwYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gpCi0gICAgewotICAgICAgICBpZiAocGl0Y2ggPT0gMCkgewotICAgICAgICAgICAgcGl0Y2ggPSAod2lkdGggKyA3KSAvIDg7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCogcmVmX2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBpdGNoKTsKLSAgICAgICAgRlhTWVNfbWVtc2V0KHJlZl9idWYsIDB4ZmYsIHBpdGNoKTsKLSAgICAgICAgaW50IGJpdHBvcyA9ICpwYml0cG9zOwotICAgICAgICBmb3IgKGludCBpUm93ID0gMDsgaVJvdyA8IGhlaWdodDsgaVJvdyArKykgewotICAgICAgICAgICAgdWludDhfdCogbGluZV9idWYgPSBkZXN0X2J1ZiArIGlSb3cgKiBwaXRjaDsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChsaW5lX2J1ZiwgMHhmZiwgcGl0Y2gpOwotICAgICAgICAgICAgX0ZheEc0R2V0Um93KHNyY19idWYsIHNyY19zaXplIDw8IDMsIGJpdHBvcywgbGluZV9idWYsIHJlZl9idWYsIHdpZHRoKTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShyZWZfYnVmLCBsaW5lX2J1ZiwgcGl0Y2gpOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZyZWUocmVmX2J1Zik7Ci0gICAgICAgICpwYml0cG9zID0gYml0cG9zOwotICAgIH0KK3ZvaWQgX0ZheEc0RGVjb2RlKHZvaWQqLAorICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgaW50KiBwYml0cG9zLAorICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgaW50IHBpdGNoKSB7CisgIGlmIChwaXRjaCA9PSAwKSB7CisgICAgcGl0Y2ggPSAod2lkdGggKyA3KSAvIDg7CisgIH0KKyAgdWludDhfdCogcmVmX2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBpdGNoKTsKKyAgRlhTWVNfbWVtc2V0KHJlZl9idWYsIDB4ZmYsIHBpdGNoKTsKKyAgaW50IGJpdHBvcyA9ICpwYml0cG9zOworICBmb3IgKGludCBpUm93ID0gMDsgaVJvdyA8IGhlaWdodDsgaVJvdysrKSB7CisgICAgdWludDhfdCogbGluZV9idWYgPSBkZXN0X2J1ZiArIGlSb3cgKiBwaXRjaDsKKyAgICBGWFNZU19tZW1zZXQobGluZV9idWYsIDB4ZmYsIHBpdGNoKTsKKyAgICBfRmF4RzRHZXRSb3coc3JjX2J1Ziwgc3JjX3NpemUgPDwgMywgYml0cG9zLCBsaW5lX2J1ZiwgcmVmX2J1Ziwgd2lkdGgpOworICAgIEZYU1lTX21lbWNweShyZWZfYnVmLCBsaW5lX2J1ZiwgcGl0Y2gpOworICB9CisgIEZYX0ZyZWUocmVmX2J1Zik7CisgICpwYml0cG9zID0gYml0cG9zOworfQogfTsKIHN0YXRpYyBjb25zdCB1aW50OF90IEJsYWNrUnVuVGVybWluYXRvclsxMjhdID0gewotICAgIDB4MzcsIDEwLCAweDAyLCAzLCAweDAzLCAyLCAweDAyLCAyLCAweDAzLCAzLCAweDAzLCA0LCAweDAyLCA0LCAweDAzLCA1LAotICAgIDB4MDUsIDYsIDB4MDQsIDYsIDB4MDQsIDcsIDB4MDUsIDcsIDB4MDcsIDcsIDB4MDQsIDgsIDB4MDcsIDgsIDB4MTgsIDksCi0gICAgMHgxNywgMTAsIDB4MTgsIDEwLCAweDA4LCAxMCwgMHg2NywgMTEsIDB4NjgsIDExLCAweDZjLCAxMSwgMHgzNywgMTEsIDB4MjgsIDExLAotICAgIDB4MTcsIDExLCAweDE4LCAxMSwgMHhjYSwgMTIsIDB4Y2IsIDEyLCAweGNjLCAxMiwgMHhjZCwgMTIsIDB4NjgsIDEyLCAweDY5LCAxMiwKLSAgICAweDZhLCAxMiwgMHg2YiwgMTIsIDB4ZDIsIDEyLCAweGQzLCAxMiwgMHhkNCwgMTIsIDB4ZDUsIDEyLCAweGQ2LCAxMiwgMHhkNywgMTIsCi0gICAgMHg2YywgMTIsIDB4NmQsIDEyLCAweGRhLCAxMiwgMHhkYiwgMTIsIDB4NTQsIDEyLCAweDU1LCAxMiwgMHg1NiwgMTIsIDB4NTcsIDEyLAotICAgIDB4NjQsIDEyLCAweDY1LCAxMiwgMHg1MiwgMTIsIDB4NTMsIDEyLCAweDI0LCAxMiwgMHgzNywgMTIsIDB4MzgsIDEyLCAweDI3LCAxMiwKLSAgICAweDI4LCAxMiwgMHg1OCwgMTIsIDB4NTksIDEyLCAweDJiLCAxMiwgMHgyYywgMTIsIDB4NWEsIDEyLCAweDY2LCAxMiwgMHg2NywgMTIsCisgICAgMHgzNywgMTAsIDB4MDIsIDMsICAweDAzLCAyLCAgMHgwMiwgMiwgIDB4MDMsIDMsICAweDAzLCA0LCAgMHgwMiwgNCwKKyAgICAweDAzLCA1LCAgMHgwNSwgNiwgIDB4MDQsIDYsICAweDA0LCA3LCAgMHgwNSwgNywgIDB4MDcsIDcsICAweDA0LCA4LAorICAgIDB4MDcsIDgsICAweDE4LCA5LCAgMHgxNywgMTAsIDB4MTgsIDEwLCAweDA4LCAxMCwgMHg2NywgMTEsIDB4NjgsIDExLAorICAgIDB4NmMsIDExLCAweDM3LCAxMSwgMHgyOCwgMTEsIDB4MTcsIDExLCAweDE4LCAxMSwgMHhjYSwgMTIsIDB4Y2IsIDEyLAorICAgIDB4Y2MsIDEyLCAweGNkLCAxMiwgMHg2OCwgMTIsIDB4NjksIDEyLCAweDZhLCAxMiwgMHg2YiwgMTIsIDB4ZDIsIDEyLAorICAgIDB4ZDMsIDEyLCAweGQ0LCAxMiwgMHhkNSwgMTIsIDB4ZDYsIDEyLCAweGQ3LCAxMiwgMHg2YywgMTIsIDB4NmQsIDEyLAorICAgIDB4ZGEsIDEyLCAweGRiLCAxMiwgMHg1NCwgMTIsIDB4NTUsIDEyLCAweDU2LCAxMiwgMHg1NywgMTIsIDB4NjQsIDEyLAorICAgIDB4NjUsIDEyLCAweDUyLCAxMiwgMHg1MywgMTIsIDB4MjQsIDEyLCAweDM3LCAxMiwgMHgzOCwgMTIsIDB4MjcsIDEyLAorICAgIDB4MjgsIDEyLCAweDU4LCAxMiwgMHg1OSwgMTIsIDB4MmIsIDEyLCAweDJjLCAxMiwgMHg1YSwgMTIsIDB4NjYsIDEyLAorICAgIDB4NjcsIDEyLAogfTsKIHN0YXRpYyBjb25zdCB1aW50OF90IEJsYWNrUnVuTWFya3VwWzgwXSA9IHsKLSAgICAweDBmLCAxMCwgMHhjOCwgMTIsIDB4YzksIDEyLCAweDViLCAxMiwgMHgzMywgMTIsIDB4MzQsIDEyLCAweDM1LCAxMiwgMHg2YywgMTMsCi0gICAgMHg2ZCwgMTMsIDB4NGEsIDEzLCAweDRiLCAxMywgMHg0YywgMTMsIDB4NGQsIDEzLCAweDcyLCAxMywgMHg3MywgMTMsIDB4NzQsIDEzLAotICAgIDB4NzUsIDEzLCAweDc2LCAxMywgMHg3NywgMTMsIDB4NTIsIDEzLCAweDUzLCAxMywgMHg1NCwgMTMsIDB4NTUsIDEzLCAweDVhLCAxMywKLSAgICAweDViLCAxMywgMHg2NCwgMTMsIDB4NjUsIDEzLCAweDA4LCAxMSwgMHgwYywgMTEsIDB4MGQsIDExLCAweDEyLCAxMiwgMHgxMywgMTIsCi0gICAgMHgxNCwgMTIsIDB4MTUsIDEyLCAweDE2LCAxMiwgMHgxNywgMTIsIDB4MWMsIDEyLCAweDFkLCAxMiwgMHgxZSwgMTIsIDB4MWYsIDEyLAorICAgIDB4MGYsIDEwLCAweGM4LCAxMiwgMHhjOSwgMTIsIDB4NWIsIDEyLCAweDMzLCAxMiwgMHgzNCwgMTIsIDB4MzUsIDEyLAorICAgIDB4NmMsIDEzLCAweDZkLCAxMywgMHg0YSwgMTMsIDB4NGIsIDEzLCAweDRjLCAxMywgMHg0ZCwgMTMsIDB4NzIsIDEzLAorICAgIDB4NzMsIDEzLCAweDc0LCAxMywgMHg3NSwgMTMsIDB4NzYsIDEzLCAweDc3LCAxMywgMHg1MiwgMTMsIDB4NTMsIDEzLAorICAgIDB4NTQsIDEzLCAweDU1LCAxMywgMHg1YSwgMTMsIDB4NWIsIDEzLCAweDY0LCAxMywgMHg2NSwgMTMsIDB4MDgsIDExLAorICAgIDB4MGMsIDExLCAweDBkLCAxMSwgMHgxMiwgMTIsIDB4MTMsIDEyLCAweDE0LCAxMiwgMHgxNSwgMTIsIDB4MTYsIDEyLAorICAgIDB4MTcsIDEyLCAweDFjLCAxMiwgMHgxZCwgMTIsIDB4MWUsIDEyLCAweDFmLCAxMiwKIH07CiBzdGF0aWMgY29uc3QgdWludDhfdCBXaGl0ZVJ1blRlcm1pbmF0b3JbMTI4XSA9IHsKLSAgICAweDM1LCA4LAotICAgIDB4MDcsIDYsCi0gICAgMHgwNywgNCwKLSAgICAweDA4LCA0LAotICAgIDB4MEIsIDQsCi0gICAgMHgwQywgNCwKLSAgICAweDBFLCA0LAotICAgIDB4MEYsIDQsCi0gICAgMHgxMywgNSwKLSAgICAweDE0LCA1LAotICAgIDB4MDcsIDUsCi0gICAgMHgwOCwgNSwKLSAgICAweDA4LCA2LAotICAgIDB4MDMsIDYsCi0gICAgMHgzNCwgNiwKLSAgICAweDM1LCA2LAotICAgIDB4MmEsIDYsCi0gICAgMHgyQiwgNiwKLSAgICAweDI3LCA3LAotICAgIDB4MGMsIDcsCi0gICAgMHgwOCwgNywKLSAgICAweDE3LCA3LAotICAgIDB4MDMsIDcsCi0gICAgMHgwNCwgNywKLSAgICAweDI4LCA3LAotICAgIDB4MkIsIDcsCi0gICAgMHgxMywgNywKLSAgICAweDI0LCA3LAotICAgIDB4MTgsIDcsCi0gICAgMHgwMiwgOCwKLSAgICAweDAzLCA4LAotICAgIDB4MWEsIDgsCi0gICAgMHgxYiwgOCwKLSAgICAweDEyLCA4LAotICAgIDB4MTMsIDgsCi0gICAgMHgxNCwgOCwKLSAgICAweDE1LCA4LAotICAgIDB4MTYsIDgsCi0gICAgMHgxNywgOCwKLSAgICAweDI4LCA4LAotICAgIDB4MjksIDgsCi0gICAgMHgyYSwgOCwKLSAgICAweDJiLCA4LAotICAgIDB4MmMsIDgsCi0gICAgMHgyZCwgOCwKLSAgICAweDA0LCA4LAotICAgIDB4MDUsIDgsCi0gICAgMHgwYSwgOCwKLSAgICAweDBiLCA4LAotICAgIDB4NTIsIDgsCi0gICAgMHg1MywgOCwKLSAgICAweDU0LCA4LAotICAgIDB4NTUsIDgsCi0gICAgMHgyNCwgOCwKLSAgICAweDI1LCA4LAotICAgIDB4NTgsIDgsCi0gICAgMHg1OSwgOCwKLSAgICAweDVhLCA4LAotICAgIDB4NWIsIDgsCi0gICAgMHg0YSwgOCwKLSAgICAweDRiLCA4LAotICAgIDB4MzIsIDgsCi0gICAgMHgzMywgOCwKLSAgICAweDM0LCA4LAorICAgIDB4MzUsIDgsIDB4MDcsIDYsIDB4MDcsIDQsIDB4MDgsIDQsIDB4MEIsIDQsIDB4MEMsIDQsIDB4MEUsIDQsIDB4MEYsIDQsCisgICAgMHgxMywgNSwgMHgxNCwgNSwgMHgwNywgNSwgMHgwOCwgNSwgMHgwOCwgNiwgMHgwMywgNiwgMHgzNCwgNiwgMHgzNSwgNiwKKyAgICAweDJhLCA2LCAweDJCLCA2LCAweDI3LCA3LCAweDBjLCA3LCAweDA4LCA3LCAweDE3LCA3LCAweDAzLCA3LCAweDA0LCA3LAorICAgIDB4MjgsIDcsIDB4MkIsIDcsIDB4MTMsIDcsIDB4MjQsIDcsIDB4MTgsIDcsIDB4MDIsIDgsIDB4MDMsIDgsIDB4MWEsIDgsCisgICAgMHgxYiwgOCwgMHgxMiwgOCwgMHgxMywgOCwgMHgxNCwgOCwgMHgxNSwgOCwgMHgxNiwgOCwgMHgxNywgOCwgMHgyOCwgOCwKKyAgICAweDI5LCA4LCAweDJhLCA4LCAweDJiLCA4LCAweDJjLCA4LCAweDJkLCA4LCAweDA0LCA4LCAweDA1LCA4LCAweDBhLCA4LAorICAgIDB4MGIsIDgsIDB4NTIsIDgsIDB4NTMsIDgsIDB4NTQsIDgsIDB4NTUsIDgsIDB4MjQsIDgsIDB4MjUsIDgsIDB4NTgsIDgsCisgICAgMHg1OSwgOCwgMHg1YSwgOCwgMHg1YiwgOCwgMHg0YSwgOCwgMHg0YiwgOCwgMHgzMiwgOCwgMHgzMywgOCwgMHgzNCwgOCwKIH07CiBzdGF0aWMgY29uc3QgdWludDhfdCBXaGl0ZVJ1bk1hcmt1cFs4MF0gPSB7Ci0gICAgMHgxYiwgNSwKLSAgICAweDEyLCA1LAotICAgIDB4MTcsIDYsCi0gICAgMHgzNywgNywKLSAgICAweDM2LCA4LAotICAgIDB4MzcsIDgsCi0gICAgMHg2NCwgOCwKLSAgICAweDY1LCA4LAotICAgIDB4NjgsIDgsCi0gICAgMHg2NywgOCwKLSAgICAweGNjLCA5LAotICAgIDB4Y2QsIDksCi0gICAgMHhkMiwgOSwKLSAgICAweGQzLCA5LAotICAgIDB4ZDQsIDksCi0gICAgMHhkNSwgOSwKLSAgICAweGQ2LCA5LAotICAgIDB4ZDcsIDksCi0gICAgMHhkOCwgOSwKLSAgICAweGQ5LCA5LAotICAgIDB4ZGEsIDksCi0gICAgMHhkYiwgOSwKLSAgICAweDk4LCA5LAotICAgIDB4OTksIDksCi0gICAgMHg5YSwgOSwKLSAgICAweDE4LCA2LAotICAgIDB4OWIsIDksCi0gICAgMHgwOCwgMTEsCi0gICAgMHgwYywgMTEsCi0gICAgMHgwZCwgMTEsCi0gICAgMHgxMiwgMTIsCi0gICAgMHgxMywgMTIsCi0gICAgMHgxNCwgMTIsCi0gICAgMHgxNSwgMTIsCi0gICAgMHgxNiwgMTIsCi0gICAgMHgxNywgMTIsCi0gICAgMHgxYywgMTIsCi0gICAgMHgxZCwgMTIsCi0gICAgMHgxZSwgMTIsCi0gICAgMHgxZiwgMTIsCisgICAgMHgxYiwgNSwgIDB4MTIsIDUsICAweDE3LCA2LCAgMHgzNywgNywgIDB4MzYsIDgsICAweDM3LCA4LCAgMHg2NCwgOCwKKyAgICAweDY1LCA4LCAgMHg2OCwgOCwgIDB4NjcsIDgsICAweGNjLCA5LCAgMHhjZCwgOSwgIDB4ZDIsIDksICAweGQzLCA5LAorICAgIDB4ZDQsIDksICAweGQ1LCA5LCAgMHhkNiwgOSwgIDB4ZDcsIDksICAweGQ4LCA5LCAgMHhkOSwgOSwgIDB4ZGEsIDksCisgICAgMHhkYiwgOSwgIDB4OTgsIDksICAweDk5LCA5LCAgMHg5YSwgOSwgIDB4MTgsIDYsICAweDliLCA5LCAgMHgwOCwgMTEsCisgICAgMHgwYywgMTEsIDB4MGQsIDExLCAweDEyLCAxMiwgMHgxMywgMTIsIDB4MTQsIDEyLCAweDE1LCAxMiwgMHgxNiwgMTIsCisgICAgMHgxNywgMTIsIDB4MWMsIDEyLCAweDFkLCAxMiwgMHgxZSwgMTIsIDB4MWYsIDEyLAogfTsKLXN0YXRpYyB2b2lkIF9BZGRCaXRTdHJlYW0odWludDhfdCogZGVzdF9idWYsIGludCYgZGVzdF9iaXRwb3MsIGludCBkYXRhLCBpbnQgYml0bGVuKQotewotICAgIGZvciAoaW50IGkgPSBiaXRsZW4gLSAxOyBpID49IDA7IGkgLS0pIHsKLSAgICAgICAgaWYgKGRhdGEgJiAoMSA8PCBpKSkgewotICAgICAgICAgICAgZGVzdF9idWZbZGVzdF9iaXRwb3MgLyA4XSB8PSAxIDw8ICg3IC0gZGVzdF9iaXRwb3MgJSA4KTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X2JpdHBvcyArKzsKK3N0YXRpYyB2b2lkIF9BZGRCaXRTdHJlYW0odWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgZGVzdF9iaXRwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bGVuKSB7CisgIGZvciAoaW50IGkgPSBiaXRsZW4gLSAxOyBpID49IDA7IGktLSkgeworICAgIGlmIChkYXRhICYgKDEgPDwgaSkpIHsKKyAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7CiAgICAgfQorICAgIGRlc3RfYml0cG9zKys7CisgIH0KIH0KLXN0YXRpYyB2b2lkIF9GYXhFbmNvZGVSdW4odWludDhfdCogZGVzdF9idWYsIGludCYgZGVzdF9iaXRwb3MsIGludCBydW4sIEZYX0JPT0wgYldoaXRlKQotewotICAgIHdoaWxlIChydW4gPj0gMjU2MCkgewotICAgICAgICBfQWRkQml0U3RyZWFtKGRlc3RfYnVmLCBkZXN0X2JpdHBvcywgMHgxZiwgMTIpOwotICAgICAgICBydW4gLT0gMjU2MDsKLSAgICB9Ci0gICAgaWYgKHJ1biA+PSA2NCkgewotICAgICAgICBpbnQgbWFya3VwID0gcnVuIC0gcnVuICUgNjQ7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBiV2hpdGUgPyBXaGl0ZVJ1bk1hcmt1cCA6IEJsYWNrUnVuTWFya3VwOwotICAgICAgICBwICs9IChtYXJrdXAgLyA2NCAtIDEpICogMjsKLSAgICAgICAgX0FkZEJpdFN0cmVhbShkZXN0X2J1ZiwgZGVzdF9iaXRwb3MsICpwLCBwWzFdKTsKLSAgICB9Ci0gICAgcnVuICU9IDY0OwotICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBiV2hpdGUgPyBXaGl0ZVJ1blRlcm1pbmF0b3IgOiBCbGFja1J1blRlcm1pbmF0b3I7Ci0gICAgcCArPSBydW4gKiAyOworc3RhdGljIHZvaWQgX0ZheEVuY29kZVJ1bih1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBkZXN0X2JpdHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2hpdGUpIHsKKyAgd2hpbGUgKHJ1biA+PSAyNTYwKSB7CisgICAgX0FkZEJpdFN0cmVhbShkZXN0X2J1ZiwgZGVzdF9iaXRwb3MsIDB4MWYsIDEyKTsKKyAgICBydW4gLT0gMjU2MDsKKyAgfQorICBpZiAocnVuID49IDY0KSB7CisgICAgaW50IG1hcmt1cCA9IHJ1biAtIHJ1biAlIDY0OworICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBiV2hpdGUgPyBXaGl0ZVJ1bk1hcmt1cCA6IEJsYWNrUnVuTWFya3VwOworICAgIHAgKz0gKG1hcmt1cCAvIDY0IC0gMSkgKiAyOwogICAgIF9BZGRCaXRTdHJlYW0oZGVzdF9idWYsIGRlc3RfYml0cG9zLCAqcCwgcFsxXSk7CisgIH0KKyAgcnVuICU9IDY0OworICBjb25zdCB1aW50OF90KiBwID0gYldoaXRlID8gV2hpdGVSdW5UZXJtaW5hdG9yIDogQmxhY2tSdW5UZXJtaW5hdG9yOworICBwICs9IHJ1biAqIDI7CisgIF9BZGRCaXRTdHJlYW0oZGVzdF9idWYsIGRlc3RfYml0cG9zLCAqcCwgcFsxXSk7CiB9Ci1zdGF0aWMgdm9pZCBfRmF4RW5jb2RlMkRMaW5lKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQmIGRlc3RfYml0cG9zLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBjb25zdCB1aW50OF90KiByZWZfYnVmLCBpbnQgY29scykKLXsKLSAgICBpbnQgYTAgPSAtMSwgYTBjb2xvciA9IDE7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaW50IGExID0gX0ZpbmRCaXQoc3JjX2J1ZiwgY29scywgYTAgKyAxLCAxIC0gYTBjb2xvcik7Ci0gICAgICAgIGludCBiMSwgYjI7Ci0gICAgICAgIF9GYXhHNEZpbmRCMUIyKHJlZl9idWYsIGNvbHMsIGEwLCBhMGNvbG9yLCBiMSwgYjIpOwotICAgICAgICBpZiAoYjIgPCBhMSkgewotICAgICAgICAgICAgZGVzdF9iaXRwb3MgKz0gMzsKLSAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7Ci0gICAgICAgICAgICBkZXN0X2JpdHBvcyArKzsKLSAgICAgICAgICAgIGEwID0gYjI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYTEgLSBiMSA8PSAzICYmIGIxIC0gYTEgPD0gMykgewotICAgICAgICAgICAgaW50IGRlbHRhID0gYTEgLSBiMTsKLSAgICAgICAgICAgIHN3aXRjaCAoZGVsdGEpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBkZXN0X2JpdHBvcyArPSBkZWx0YSA9PSAxID8gMSA6IGRlbHRhICsgMjsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9idWZbZGVzdF9iaXRwb3MgLyA4XSB8PSAxIDw8ICg3IC0gZGVzdF9iaXRwb3MgJSA4KTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9iaXRwb3MgKys7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICAgICAgY2FzZSAtMjoKLSAgICAgICAgICAgICAgICBjYXNlIC0zOgotICAgICAgICAgICAgICAgICAgICBkZXN0X2JpdHBvcyArPSBkZWx0YSA9PSAtMSA/IDEgOiAtZGVsdGEgKyAyOwotICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZltkZXN0X2JpdHBvcyAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X2JpdHBvcyAlIDgpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X2JpdHBvcyArKzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X2JpdHBvcyArKzsKLSAgICAgICAgICAgIGEwID0gYTE7Ci0gICAgICAgICAgICBhMGNvbG9yID0gMSAtIGEwY29sb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgYTIgPSBfRmluZEJpdChzcmNfYnVmLCBjb2xzLCBhMSArIDEsIGEwY29sb3IpOwotICAgICAgICAgICAgZGVzdF9iaXRwb3MgKys7Ci0gICAgICAgICAgICBkZXN0X2JpdHBvcyArKzsKLSAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7Ci0gICAgICAgICAgICBkZXN0X2JpdHBvcyArKzsKLSAgICAgICAgICAgIGlmIChhMCA8IDApIHsKLSAgICAgICAgICAgICAgICBhMCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfRmF4RW5jb2RlUnVuKGRlc3RfYnVmLCBkZXN0X2JpdHBvcywgYTEgLSBhMCwgYTBjb2xvcik7Ci0gICAgICAgICAgICBfRmF4RW5jb2RlUnVuKGRlc3RfYnVmLCBkZXN0X2JpdHBvcywgYTIgLSBhMSwgMSAtIGEwY29sb3IpOwotICAgICAgICAgICAgYTAgPSBhMjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYTAgPj0gY29scykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CitzdGF0aWMgdm9pZCBfRmF4RW5jb2RlMkRMaW5lKHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGRlc3RfYml0cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZWZfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29scykgeworICBpbnQgYTAgPSAtMSwgYTBjb2xvciA9IDE7CisgIHdoaWxlICgxKSB7CisgICAgaW50IGExID0gX0ZpbmRCaXQoc3JjX2J1ZiwgY29scywgYTAgKyAxLCAxIC0gYTBjb2xvcik7CisgICAgaW50IGIxLCBiMjsKKyAgICBfRmF4RzRGaW5kQjFCMihyZWZfYnVmLCBjb2xzLCBhMCwgYTBjb2xvciwgYjEsIGIyKTsKKyAgICBpZiAoYjIgPCBhMSkgeworICAgICAgZGVzdF9iaXRwb3MgKz0gMzsKKyAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7CisgICAgICBkZXN0X2JpdHBvcysrOworICAgICAgYTAgPSBiMjsKKyAgICB9IGVsc2UgaWYgKGExIC0gYjEgPD0gMyAmJiBiMSAtIGExIDw9IDMpIHsKKyAgICAgIGludCBkZWx0YSA9IGExIC0gYjE7CisgICAgICBzd2l0Y2ggKGRlbHRhKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBkZXN0X2J1ZltkZXN0X2JpdHBvcyAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X2JpdHBvcyAlIDgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIGRlc3RfYml0cG9zICs9IGRlbHRhID09IDEgPyAxIDogZGVsdGEgKyAyOworICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7CisgICAgICAgICAgZGVzdF9iaXRwb3MrKzsKKyAgICAgICAgICBkZXN0X2J1ZltkZXN0X2JpdHBvcyAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X2JpdHBvcyAlIDgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC0xOgorICAgICAgICBjYXNlIC0yOgorICAgICAgICBjYXNlIC0zOgorICAgICAgICAgIGRlc3RfYml0cG9zICs9IGRlbHRhID09IC0xID8gMSA6IC1kZWx0YSArIDI7CisgICAgICAgICAgZGVzdF9idWZbZGVzdF9iaXRwb3MgLyA4XSB8PSAxIDw8ICg3IC0gZGVzdF9iaXRwb3MgJSA4KTsKKyAgICAgICAgICBkZXN0X2JpdHBvcysrOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVzdF9iaXRwb3MrKzsKKyAgICAgIGEwID0gYTE7CisgICAgICBhMGNvbG9yID0gMSAtIGEwY29sb3I7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBhMiA9IF9GaW5kQml0KHNyY19idWYsIGNvbHMsIGExICsgMSwgYTBjb2xvcik7CisgICAgICBkZXN0X2JpdHBvcysrOworICAgICAgZGVzdF9iaXRwb3MrKzsKKyAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7CisgICAgICBkZXN0X2JpdHBvcysrOworICAgICAgaWYgKGEwIDwgMCkgeworICAgICAgICBhMCA9IDA7CisgICAgICB9CisgICAgICBfRmF4RW5jb2RlUnVuKGRlc3RfYnVmLCBkZXN0X2JpdHBvcywgYTEgLSBhMCwgYTBjb2xvcik7CisgICAgICBfRmF4RW5jb2RlUnVuKGRlc3RfYnVmLCBkZXN0X2JpdHBvcywgYTIgLSBhMSwgMSAtIGEwY29sb3IpOworICAgICAgYTAgPSBhMjsKICAgICB9CisgICAgaWYgKGEwID49IGNvbHMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KIH0KLWNsYXNzIENDb2RlY19GYXhFbmNvZGVyCi17Ci1wdWJsaWM6Ci0gICAgQ0NvZGVjX0ZheEVuY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gpOwotICAgIH5DQ29kZWNfRmF4RW5jb2RlcigpOwotICAgIHZvaWQJCQlFbmNvZGUodWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKLSAgICB2b2lkCQkJRW5jb2RlMkRMaW5lKGNvbnN0IHVpbnQ4X3QqIHNjYW5fbGluZSk7Ci0gICAgQ0ZYX0JpbmFyeUJ1ZgltX0Rlc3RCdWY7Ci0gICAgdWludDhfdCoJCW1fcFJlZkxpbmU7Ci0gICAgdWludDhfdCoJCW1fcExpbmVCdWY7Ci0gICAgaW50CQkJCW1fQ29scywgbV9Sb3dzLCBtX1BpdGNoOwotICAgIGNvbnN0IHVpbnQ4X3QqCQltX3BTcmNCdWY7CitjbGFzcyBDQ29kZWNfRmF4RW5jb2RlciB7CisgcHVibGljOgorICBDQ29kZWNfRmF4RW5jb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCk7CisgIH5DQ29kZWNfRmF4RW5jb2RlcigpOworICB2b2lkIEVuY29kZSh1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOworICB2b2lkIEVuY29kZTJETGluZShjb25zdCB1aW50OF90KiBzY2FuX2xpbmUpOworICBDRlhfQmluYXJ5QnVmIG1fRGVzdEJ1ZjsKKyAgdWludDhfdCogbV9wUmVmTGluZTsKKyAgdWludDhfdCogbV9wTGluZUJ1ZjsKKyAgaW50IG1fQ29scywgbV9Sb3dzLCBtX1BpdGNoOworICBjb25zdCB1aW50OF90KiBtX3BTcmNCdWY7CiB9OwotQ0NvZGVjX0ZheEVuY29kZXI6OkNDb2RlY19GYXhFbmNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHBpdGNoKQotewotICAgIG1fcFNyY0J1ZiA9IHNyY19idWY7Ci0gICAgbV9Db2xzID0gd2lkdGg7Ci0gICAgbV9Sb3dzID0gaGVpZ2h0OwotICAgIG1fUGl0Y2ggPSBwaXRjaDsKLSAgICBtX3BSZWZMaW5lID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7Ci0gICAgRlhTWVNfbWVtc2V0KG1fcFJlZkxpbmUsIDB4ZmYsIG1fUGl0Y2gpOwotICAgIG1fcExpbmVCdWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG1fUGl0Y2gsIDgpOwotICAgIG1fRGVzdEJ1Zi5Fc3RpbWF0ZVNpemUoMCwgMTAyNDApOworQ0NvZGVjX0ZheEVuY29kZXI6OkNDb2RlY19GYXhFbmNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoKSB7CisgIG1fcFNyY0J1ZiA9IHNyY19idWY7CisgIG1fQ29scyA9IHdpZHRoOworICBtX1Jvd3MgPSBoZWlnaHQ7CisgIG1fUGl0Y2ggPSBwaXRjaDsKKyAgbV9wUmVmTGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOworICBGWFNZU19tZW1zZXQobV9wUmVmTGluZSwgMHhmZiwgbV9QaXRjaCk7CisgIG1fcExpbmVCdWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG1fUGl0Y2gsIDgpOworICBtX0Rlc3RCdWYuRXN0aW1hdGVTaXplKDAsIDEwMjQwKTsKIH0KLUNDb2RlY19GYXhFbmNvZGVyOjp+Q0NvZGVjX0ZheEVuY29kZXIoKQotewotICAgIGlmIChtX3BSZWZMaW5lKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wUmVmTGluZSk7Ci0gICAgfQotICAgIGlmIChtX3BMaW5lQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wTGluZUJ1Zik7Ci0gICAgfQorQ0NvZGVjX0ZheEVuY29kZXI6On5DQ29kZWNfRmF4RW5jb2RlcigpIHsKKyAgaWYgKG1fcFJlZkxpbmUpIHsKKyAgICBGWF9GcmVlKG1fcFJlZkxpbmUpOworICB9CisgIGlmIChtX3BMaW5lQnVmKSB7CisgICAgRlhfRnJlZShtX3BMaW5lQnVmKTsKKyAgfQogfQotdm9pZCBDQ29kZWNfRmF4RW5jb2Rlcjo6RW5jb2RlKHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKLXsKLSAgICBpbnQgZGVzdF9iaXRwb3MgPSAwOwotICAgIHVpbnQ4X3QgbGFzdF9ieXRlID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fUm93czsgaSArKykgewotICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX2xpbmUgPSBtX3BTcmNCdWYgKyBpICogbV9QaXRjaDsKLSAgICAgICAgRlhTWVNfbWVtc2V0KG1fcExpbmVCdWYsIDAsIG1fUGl0Y2ggKiA4KTsKLSAgICAgICAgbV9wTGluZUJ1ZlswXSA9IGxhc3RfYnl0ZTsKLSAgICAgICAgX0ZheEVuY29kZTJETGluZShtX3BMaW5lQnVmLCBkZXN0X2JpdHBvcywgc2Nhbl9saW5lLCBtX3BSZWZMaW5lLCBtX0NvbHMpOwotICAgICAgICBtX0Rlc3RCdWYuQXBwZW5kQmxvY2sobV9wTGluZUJ1ZiwgZGVzdF9iaXRwb3MgLyA4KTsKLSAgICAgICAgbGFzdF9ieXRlID0gbV9wTGluZUJ1ZltkZXN0X2JpdHBvcyAvIDhdOwotICAgICAgICBkZXN0X2JpdHBvcyAlPSA4OwotICAgICAgICBGWFNZU19tZW1jcHkobV9wUmVmTGluZSwgc2Nhbl9saW5lLCBtX1BpdGNoKTsKLSAgICB9Ci0gICAgaWYgKGRlc3RfYml0cG9zKSB7Ci0gICAgICAgIG1fRGVzdEJ1Zi5BcHBlbmRCeXRlKGxhc3RfYnl0ZSk7Ci0gICAgfQotICAgIGRlc3RfYnVmID0gbV9EZXN0QnVmLkdldEJ1ZmZlcigpOwotICAgIGRlc3Rfc2l6ZSA9IG1fRGVzdEJ1Zi5HZXRTaXplKCk7Ci0gICAgbV9EZXN0QnVmLkRldGFjaEJ1ZmZlcigpOwordm9pZCBDQ29kZWNfRmF4RW5jb2Rlcjo6RW5jb2RlKHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICBpbnQgZGVzdF9iaXRwb3MgPSAwOworICB1aW50OF90IGxhc3RfYnl0ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9Sb3dzOyBpKyspIHsKKyAgICBjb25zdCB1aW50OF90KiBzY2FuX2xpbmUgPSBtX3BTcmNCdWYgKyBpICogbV9QaXRjaDsKKyAgICBGWFNZU19tZW1zZXQobV9wTGluZUJ1ZiwgMCwgbV9QaXRjaCAqIDgpOworICAgIG1fcExpbmVCdWZbMF0gPSBsYXN0X2J5dGU7CisgICAgX0ZheEVuY29kZTJETGluZShtX3BMaW5lQnVmLCBkZXN0X2JpdHBvcywgc2Nhbl9saW5lLCBtX3BSZWZMaW5lLCBtX0NvbHMpOworICAgIG1fRGVzdEJ1Zi5BcHBlbmRCbG9jayhtX3BMaW5lQnVmLCBkZXN0X2JpdHBvcyAvIDgpOworICAgIGxhc3RfYnl0ZSA9IG1fcExpbmVCdWZbZGVzdF9iaXRwb3MgLyA4XTsKKyAgICBkZXN0X2JpdHBvcyAlPSA4OworICAgIEZYU1lTX21lbWNweShtX3BSZWZMaW5lLCBzY2FuX2xpbmUsIG1fUGl0Y2gpOworICB9CisgIGlmIChkZXN0X2JpdHBvcykgeworICAgIG1fRGVzdEJ1Zi5BcHBlbmRCeXRlKGxhc3RfYnl0ZSk7CisgIH0KKyAgZGVzdF9idWYgPSBtX0Rlc3RCdWYuR2V0QnVmZmVyKCk7CisgIGRlc3Rfc2l6ZSA9IG1fRGVzdEJ1Zi5HZXRTaXplKCk7CisgIG1fRGVzdEJ1Zi5EZXRhY2hCdWZmZXIoKTsKIH0KLUZYX0JPT0wJQ0NvZGVjX0ZheE1vZHVsZTo6RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHBpdGNoLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgQ0NvZGVjX0ZheEVuY29kZXIgZW5jb2RlcihzcmNfYnVmLCB3aWR0aCwgaGVpZ2h0LCBwaXRjaCk7Ci0gICAgZW5jb2Rlci5FbmNvZGUoZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENDb2RlY19GYXhNb2R1bGU6OkVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIHsKKyAgQ0NvZGVjX0ZheEVuY29kZXIgZW5jb2RlcihzcmNfYnVmLCB3aWR0aCwgaGVpZ2h0LCBwaXRjaCk7CisgIGVuY29kZXIuRW5jb2RlKGRlc3RfYnVmLCBkZXN0X3NpemUpOworICByZXR1cm4gVFJVRTsKIH0KLUlDb2RlY19TY2FubGluZURlY29kZXIqCUNDb2RlY19GYXhNb2R1bGU6OkNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgaW50IEssIEZYX0JPT0wgRW5kT2ZMaW5lLCBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sIEZYX0JPT0wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cykKLXsKLSAgICBDQ29kZWNfRmF4RGVjb2RlciogcERlY29kZXIgPSBuZXcgQ0NvZGVjX0ZheERlY29kZXI7Ci0gICAgcERlY29kZXItPkNyZWF0ZShzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgSywgRW5kT2ZMaW5lLCBFbmNvZGVkQnl0ZUFsaWduLCBCbGFja0lzMSwgQ29sdW1ucywgUm93cyk7Ci0gICAgcmV0dXJuIHBEZWNvZGVyOworSUNvZGVjX1NjYW5saW5lRGVjb2RlciogQ0NvZGVjX0ZheE1vZHVsZTo6Q3JlYXRlRGVjb2RlcigKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0LAorICAgIGludCBLLAorICAgIEZYX0JPT0wgRW5kT2ZMaW5lLAorICAgIEZYX0JPT0wgRW5jb2RlZEJ5dGVBbGlnbiwKKyAgICBGWF9CT09MIEJsYWNrSXMxLAorICAgIGludCBDb2x1bW5zLAorICAgIGludCBSb3dzKSB7CisgIENDb2RlY19GYXhEZWNvZGVyKiBwRGVjb2RlciA9IG5ldyBDQ29kZWNfRmF4RGVjb2RlcjsKKyAgcERlY29kZXItPkNyZWF0ZShzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgSywgRW5kT2ZMaW5lLAorICAgICAgICAgICAgICAgICAgIEVuY29kZWRCeXRlQWxpZ24sIEJsYWNrSXMxLCBDb2x1bW5zLCBSb3dzKTsKKyAgcmV0dXJuIHBEZWNvZGVyOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mbGF0ZS5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcAppbmRleCBkMTI5ZTM2Li45MWQyOGIwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcApAQCAtMTAsOTExICsxMCw5NjggQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZmxhdGUuaCIKICNpbmNsdWRlICJjb2RlY19pbnQuaCIKIAotZXh0ZXJuICJDIgotewotICAgIHN0YXRpYyB2b2lkKiBteV9hbGxvY19mdW5jKHZvaWQqIG9wYXF1ZSwgdW5zaWduZWQgaW50IGl0ZW1zLCB1bnNpZ25lZCBpbnQgc2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGWF9BbGxvYzJEKHVpbnQ4X3QsIGl0ZW1zLCBzaXplKTsKLSAgICB9Ci0gICAgc3RhdGljIHZvaWQgbXlfZnJlZV9mdW5jKHZvaWQqIG9wYXF1ZSwgdm9pZCogYWRkcmVzcykKLSAgICB7Ci0gICAgICAgIEZYX0ZyZWUoYWRkcmVzcyk7Ci0gICAgfQotICAgIHN0YXRpYyBpbnQgRlBERkFQSV9GbGF0ZUdldFRvdGFsT3V0KHZvaWQqIGNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gKCh6X3N0cmVhbSopY29udGV4dCktPnRvdGFsX291dDsKLSAgICB9Ci0gICAgc3RhdGljIGludCBGUERGQVBJX0ZsYXRlR2V0VG90YWxJbih2b2lkKiBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoel9zdHJlYW0qKWNvbnRleHQpLT50b3RhbF9pbjsKLSAgICB9Ci0gICAgc3RhdGljIHZvaWQgRlBERkFQSV9GbGF0ZUNvbXByZXNzKHVuc2lnbmVkIGNoYXIqIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKiBkZXN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc3JjX3NpemUpCi0gICAgewotICAgICAgICBjb21wcmVzcyhkZXN0X2J1ZiwgZGVzdF9zaXplLCBzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgfQotICAgIHZvaWQqIEZQREZBUElfRmxhdGVJbml0KHZvaWQqICgqYWxsb2NfZnVuYykodm9pZCosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnJlZV9mdW5jKSh2b2lkKiwgdm9pZCopKQotICAgIHsKLSAgICAgICAgel9zdHJlYW0qIHAgPSAoel9zdHJlYW0qKWFsbG9jX2Z1bmMoMCwgMSwgc2l6ZW9mKHpfc3RyZWFtKSk7Ci0gICAgICAgIGlmIChwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIEZYU1lTX21lbXNldChwLCAwLCBzaXplb2Yoel9zdHJlYW0pKTsKLSAgICAgICAgcC0+emFsbG9jID0gYWxsb2NfZnVuYzsKLSAgICAgICAgcC0+emZyZWUgPSBmcmVlX2Z1bmM7Ci0gICAgICAgIGluZmxhdGVJbml0KHApOwotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0gICAgdm9pZCBGUERGQVBJX0ZsYXRlSW5wdXQodm9pZCogY29udGV4dCwgY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2J1ZiwgdW5zaWduZWQgaW50IHNyY19zaXplKQotICAgIHsKLSAgICAgICAgKCh6X3N0cmVhbSopY29udGV4dCktPm5leHRfaW4gPSAodW5zaWduZWQgY2hhciopc3JjX2J1ZjsKLSAgICAgICAgKCh6X3N0cmVhbSopY29udGV4dCktPmF2YWlsX2luID0gc3JjX3NpemU7Ci0gICAgfQotICAgIGludCBGUERGQVBJX0ZsYXRlT3V0cHV0KHZvaWQqIGNvbnRleHQsIHVuc2lnbmVkIGNoYXIqIGRlc3RfYnVmLCB1bnNpZ25lZCBpbnQgZGVzdF9zaXplKQotICAgIHsKLSAgICAgICAgKCh6X3N0cmVhbSopY29udGV4dCktPm5leHRfb3V0ID0gZGVzdF9idWY7Ci0gICAgICAgICgoel9zdHJlYW0qKWNvbnRleHQpLT5hdmFpbF9vdXQgPSBkZXN0X3NpemU7Ci0gICAgICAgIHVuc2lnbmVkIGludCBwcmVfcG9zID0gKHVuc2lnbmVkIGludClGUERGQVBJX0ZsYXRlR2V0VG90YWxPdXQoY29udGV4dCk7Ci0gICAgICAgIGludCByZXQgPSBpbmZsYXRlKCh6X3N0cmVhbSopY29udGV4dCwgWl9TWU5DX0ZMVVNIKTsKLSAgICAgICAgdW5zaWduZWQgaW50IHBvc3RfcG9zID0gKHVuc2lnbmVkIGludClGUERGQVBJX0ZsYXRlR2V0VG90YWxPdXQoY29udGV4dCk7Ci0gICAgICAgIHVuc2lnbmVkIGludCB3cml0dGVuID0gcG9zdF9wb3MgLSBwcmVfcG9zOwotICAgICAgICBpZiAod3JpdHRlbiA8IGRlc3Rfc2l6ZSkgewotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmICsgd3JpdHRlbiwgJ1wwJywgZGVzdF9zaXplIC0gd3JpdHRlbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaW50IEZQREZBUElfRmxhdGVHZXRBdmFpbEluKHZvaWQqIGNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gKCh6X3N0cmVhbSopY29udGV4dCktPmF2YWlsX2luOwotICAgIH0KLSAgICBpbnQgRlBERkFQSV9GbGF0ZUdldEF2YWlsT3V0KHZvaWQqIGNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gKCh6X3N0cmVhbSopY29udGV4dCktPmF2YWlsX291dDsKLSAgICB9Ci0gICAgdm9pZCBGUERGQVBJX0ZsYXRlRW5kKHZvaWQqIGNvbnRleHQpCi0gICAgewotICAgICAgICBpbmZsYXRlRW5kKCh6X3N0cmVhbSopY29udGV4dCk7Ci0gICAgICAgICgoel9zdHJlYW0qKWNvbnRleHQpLT56ZnJlZSgwLCBjb250ZXh0KTsKLSAgICB9CitleHRlcm4gIkMiIHsKK3N0YXRpYyB2b2lkKiBteV9hbGxvY19mdW5jKHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplKSB7CisgIHJldHVybiBGWF9BbGxvYzJEKHVpbnQ4X3QsIGl0ZW1zLCBzaXplKTsKK30KK3N0YXRpYyB2b2lkIG15X2ZyZWVfZnVuYyh2b2lkKiBvcGFxdWUsIHZvaWQqIGFkZHJlc3MpIHsKKyAgRlhfRnJlZShhZGRyZXNzKTsKK30KK3N0YXRpYyBpbnQgRlBERkFQSV9GbGF0ZUdldFRvdGFsT3V0KHZvaWQqIGNvbnRleHQpIHsKKyAgcmV0dXJuICgoel9zdHJlYW0qKWNvbnRleHQpLT50b3RhbF9vdXQ7Cit9CitzdGF0aWMgaW50IEZQREZBUElfRmxhdGVHZXRUb3RhbEluKHZvaWQqIGNvbnRleHQpIHsKKyAgcmV0dXJuICgoel9zdHJlYW0qKWNvbnRleHQpLT50b3RhbF9pbjsKK30KK3N0YXRpYyB2b2lkIEZQREZBUElfRmxhdGVDb21wcmVzcyh1bnNpZ25lZCBjaGFyKiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKiBkZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNyY19zaXplKSB7CisgIGNvbXByZXNzKGRlc3RfYnVmLCBkZXN0X3NpemUsIHNyY19idWYsIHNyY19zaXplKTsKK30KK3ZvaWQqIEZQREZBUElfRmxhdGVJbml0KHZvaWQqICgqYWxsb2NfZnVuYykodm9pZCosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQqLCB2b2lkKikpIHsKKyAgel9zdHJlYW0qIHAgPSAoel9zdHJlYW0qKWFsbG9jX2Z1bmMoMCwgMSwgc2l6ZW9mKHpfc3RyZWFtKSk7CisgIGlmIChwID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWFNZU19tZW1zZXQocCwgMCwgc2l6ZW9mKHpfc3RyZWFtKSk7CisgIHAtPnphbGxvYyA9IGFsbG9jX2Z1bmM7CisgIHAtPnpmcmVlID0gZnJlZV9mdW5jOworICBpbmZsYXRlSW5pdChwKTsKKyAgcmV0dXJuIHA7Cit9Cit2b2lkIEZQREZBUElfRmxhdGVJbnB1dCh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcmNfc2l6ZSkgeworICAoKHpfc3RyZWFtKiljb250ZXh0KS0+bmV4dF9pbiA9ICh1bnNpZ25lZCBjaGFyKilzcmNfYnVmOworICAoKHpfc3RyZWFtKiljb250ZXh0KS0+YXZhaWxfaW4gPSBzcmNfc2l6ZTsKK30KK2ludCBGUERGQVBJX0ZsYXRlT3V0cHV0KHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3NpemUpIHsKKyAgKCh6X3N0cmVhbSopY29udGV4dCktPm5leHRfb3V0ID0gZGVzdF9idWY7CisgICgoel9zdHJlYW0qKWNvbnRleHQpLT5hdmFpbF9vdXQgPSBkZXN0X3NpemU7CisgIHVuc2lnbmVkIGludCBwcmVfcG9zID0gKHVuc2lnbmVkIGludClGUERGQVBJX0ZsYXRlR2V0VG90YWxPdXQoY29udGV4dCk7CisgIGludCByZXQgPSBpbmZsYXRlKCh6X3N0cmVhbSopY29udGV4dCwgWl9TWU5DX0ZMVVNIKTsKKyAgdW5zaWduZWQgaW50IHBvc3RfcG9zID0gKHVuc2lnbmVkIGludClGUERGQVBJX0ZsYXRlR2V0VG90YWxPdXQoY29udGV4dCk7CisgIHVuc2lnbmVkIGludCB3cml0dGVuID0gcG9zdF9wb3MgLSBwcmVfcG9zOworICBpZiAod3JpdHRlbiA8IGRlc3Rfc2l6ZSkgeworICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiArIHdyaXR0ZW4sICdcMCcsIGRlc3Rfc2l6ZSAtIHdyaXR0ZW4pOworICB9CisgIHJldHVybiByZXQ7Cit9CitpbnQgRlBERkFQSV9GbGF0ZUdldEF2YWlsSW4odm9pZCogY29udGV4dCkgeworICByZXR1cm4gKCh6X3N0cmVhbSopY29udGV4dCktPmF2YWlsX2luOworfQoraW50IEZQREZBUElfRmxhdGVHZXRBdmFpbE91dCh2b2lkKiBjb250ZXh0KSB7CisgIHJldHVybiAoKHpfc3RyZWFtKiljb250ZXh0KS0+YXZhaWxfb3V0OworfQordm9pZCBGUERGQVBJX0ZsYXRlRW5kKHZvaWQqIGNvbnRleHQpIHsKKyAgaW5mbGF0ZUVuZCgoel9zdHJlYW0qKWNvbnRleHQpOworICAoKHpfc3RyZWFtKiljb250ZXh0KS0+emZyZWUoMCwgY29udGV4dCk7Cit9CiB9ICAvLyBleHRlcm4gIkMiCiAKLWNsYXNzIENMWldEZWNvZGVyCi17Ci1wdWJsaWM6Ci0gICAgaW50IERlY29kZSh1aW50OF90KiBvdXRwdXQsIEZYX0RXT1JEJiBvdXRsZW4sIGNvbnN0IHVpbnQ4X3QqIGlucHV0LCBGWF9EV09SRCYgc2l6ZSwgRlhfQk9PTCBiRWFybHlDaGFuZ2UpOworY2xhc3MgQ0xaV0RlY29kZXIgeworIHB1YmxpYzoKKyAgaW50IERlY29kZSh1aW50OF90KiBvdXRwdXQsCisgICAgICAgICAgICAgRlhfRFdPUkQmIG91dGxlbiwKKyAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCwKKyAgICAgICAgICAgICBGWF9EV09SRCYgc2l6ZSwKKyAgICAgICAgICAgICBGWF9CT09MIGJFYXJseUNoYW5nZSk7CiAKLXByaXZhdGU6Ci0gICAgdm9pZCBBZGRDb2RlKEZYX0RXT1JEIHByZWZpeF9jb2RlLCB1aW50OF90IGFwcGVuZF9jaGFyKTsKLSAgICB2b2lkIERlY29kZVN0cmluZyhGWF9EV09SRCBjb2RlKTsKKyBwcml2YXRlOgorICB2b2lkIEFkZENvZGUoRlhfRFdPUkQgcHJlZml4X2NvZGUsIHVpbnQ4X3QgYXBwZW5kX2NoYXIpOworICB2b2lkIERlY29kZVN0cmluZyhGWF9EV09SRCBjb2RlKTsKIAotICAgIEZYX0RXT1JECW1fSW5Qb3M7Ci0gICAgRlhfRFdPUkQJbV9PdXRQb3M7Ci0gICAgdWludDhfdCoJbV9wT3V0cHV0OwotICAgIGNvbnN0IHVpbnQ4X3QqCW1fcElucHV0OwotICAgIEZYX0JPT0wJCW1fRWFybHk7Ci0gICAgRlhfRFdPUkQJbV9Db2RlQXJyYXlbNTAyMV07Ci0gICAgRlhfRFdPUkQJbV9uQ29kZXM7Ci0gICAgdWludDhfdAkJbV9EZWNvZGVTdGFja1s0MDAwXTsKLSAgICBGWF9EV09SRAltX1N0YWNrTGVuOwotICAgIGludAkJCW1fQ29kZUxlbjsKKyAgRlhfRFdPUkQgbV9JblBvczsKKyAgRlhfRFdPUkQgbV9PdXRQb3M7CisgIHVpbnQ4X3QqIG1fcE91dHB1dDsKKyAgY29uc3QgdWludDhfdCogbV9wSW5wdXQ7CisgIEZYX0JPT0wgbV9FYXJseTsKKyAgRlhfRFdPUkQgbV9Db2RlQXJyYXlbNTAyMV07CisgIEZYX0RXT1JEIG1fbkNvZGVzOworICB1aW50OF90IG1fRGVjb2RlU3RhY2tbNDAwMF07CisgIEZYX0RXT1JEIG1fU3RhY2tMZW47CisgIGludCBtX0NvZGVMZW47CiB9Owotdm9pZCBDTFpXRGVjb2Rlcjo6QWRkQ29kZShGWF9EV09SRCBwcmVmaXhfY29kZSwgdWludDhfdCBhcHBlbmRfY2hhcikKLXsKLSAgICBpZiAobV9uQ29kZXMgKyBtX0Vhcmx5ID09IDQwOTQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX0NvZGVBcnJheVttX25Db2RlcyArK10gPSAocHJlZml4X2NvZGUgPDwgMTYpIHwgYXBwZW5kX2NoYXI7Ci0gICAgaWYgKG1fbkNvZGVzICsgbV9FYXJseSA9PSA1MTIgLSAyNTgpIHsKLSAgICAgICAgbV9Db2RlTGVuID0gMTA7Ci0gICAgfSBlbHNlIGlmIChtX25Db2RlcyArIG1fRWFybHkgPT0gMTAyNCAtIDI1OCkgewotICAgICAgICBtX0NvZGVMZW4gPSAxMTsKLSAgICB9IGVsc2UgaWYgKG1fbkNvZGVzICsgbV9FYXJseSA9PSAyMDQ4IC0gMjU4KSB7Ci0gICAgICAgIG1fQ29kZUxlbiA9IDEyOwotICAgIH0KLX0KLXZvaWQgQ0xaV0RlY29kZXI6OkRlY29kZVN0cmluZyhGWF9EV09SRCBjb2RlKQotewotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGNvZGUgLSAyNTg7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gKGludCltX25Db2RlcykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgZGF0YSA9IG1fQ29kZUFycmF5W2luZGV4XTsKLSAgICAgICAgaWYgKG1fU3RhY2tMZW4gPj0gc2l6ZW9mKG1fRGVjb2RlU3RhY2spKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuKytdID0gKHVpbnQ4X3QpZGF0YTsKLSAgICAgICAgY29kZSA9IGRhdGEgPj4gMTY7Ci0gICAgfQotICAgIGlmIChtX1N0YWNrTGVuID49IHNpemVvZihtX0RlY29kZVN0YWNrKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbisrXSA9ICh1aW50OF90KWNvZGU7Ci19Ci1pbnQgQ0xaV0RlY29kZXI6OkRlY29kZSh1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQmIHNyY19zaXplLCBGWF9CT09MIGJFYXJseUNoYW5nZSkKLXsKLSAgICBtX0NvZGVMZW4gPSA5OwotICAgIG1fSW5Qb3MgPSAwOwotICAgIG1fT3V0UG9zID0gMDsKLSAgICBtX3BJbnB1dCA9IHNyY19idWY7Ci0gICAgbV9wT3V0cHV0ID0gZGVzdF9idWY7Ci0gICAgbV9FYXJseSA9IGJFYXJseUNoYW5nZSA/IDEgOiAwOwotICAgIG1fbkNvZGVzID0gMDsKLSAgICBGWF9EV09SRCBvbGRfY29kZSA9IChGWF9EV09SRCkgLSAxOwotICAgIHVpbnQ4X3QgbGFzdF9jaGFyOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChtX0luUG9zICsgbV9Db2RlTGVuID4gc3JjX3NpemUgKiA4KSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbnQgYnl0ZV9wb3MgPSBtX0luUG9zIC8gODsKLSAgICAgICAgaW50IGJpdF9wb3MgPSBtX0luUG9zICUgOCwgYml0X2xlZnQgPSBtX0NvZGVMZW47Ci0gICAgICAgIEZYX0RXT1JEIGNvZGUgPSAwOwotICAgICAgICBpZiAoYml0X3BvcykgewotICAgICAgICAgICAgYml0X2xlZnQgLT0gOCAtIGJpdF9wb3M7Ci0gICAgICAgICAgICBjb2RlID0gKG1fcElucHV0W2J5dGVfcG9zKytdICYgKCgxIDw8ICg4IC0gYml0X3BvcykpIC0gMSkpIDw8IGJpdF9sZWZ0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaXRfbGVmdCA8IDgpIHsKLSAgICAgICAgICAgIGNvZGUgfD0gbV9wSW5wdXRbYnl0ZV9wb3NdID4+ICg4IC0gYml0X2xlZnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYml0X2xlZnQgLT0gODsKLSAgICAgICAgICAgIGNvZGUgfD0gbV9wSW5wdXRbYnl0ZV9wb3MrK10gPDwgYml0X2xlZnQ7Ci0gICAgICAgICAgICBpZiAoYml0X2xlZnQpIHsKLSAgICAgICAgICAgICAgICBjb2RlIHw9IG1fcElucHV0W2J5dGVfcG9zXSA+PiAoOCAtIGJpdF9sZWZ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX0luUG9zICs9IG1fQ29kZUxlbjsKLSAgICAgICAgaWYgKGNvZGUgPCAyNTYpIHsKLSAgICAgICAgICAgIGlmIChtX091dFBvcyA9PSBkZXN0X3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgbV9wT3V0cHV0W21fT3V0UG9zXSA9ICh1aW50OF90KWNvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX091dFBvcyArKzsKLSAgICAgICAgICAgIGxhc3RfY2hhciA9ICh1aW50OF90KWNvZGU7Ci0gICAgICAgICAgICBpZiAob2xkX2NvZGUgIT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBBZGRDb2RlKG9sZF9jb2RlLCBsYXN0X2NoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2xkX2NvZGUgPSBjb2RlOwotICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMjU2KSB7Ci0gICAgICAgICAgICBtX0NvZGVMZW4gPSA5OwotICAgICAgICAgICAgbV9uQ29kZXMgPSAwOwotICAgICAgICAgICAgb2xkX2NvZGUgPSAoRlhfRFdPUkQpIC0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChjb2RlID09IDI1NykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAob2xkX2NvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fU3RhY2tMZW4gPSAwOwotICAgICAgICAgICAgaWYgKGNvZGUgPj0gbV9uQ29kZXMgKyAyNTgpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9TdGFja0xlbiA8IHNpemVvZihtX0RlY29kZVN0YWNrKSkgewotICAgICAgICAgICAgICAgICAgICBtX0RlY29kZVN0YWNrW21fU3RhY2tMZW4rK10gPSBsYXN0X2NoYXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERlY29kZVN0cmluZyhvbGRfY29kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERlY29kZVN0cmluZyhjb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX091dFBvcyArIG1fU3RhY2tMZW4gPiBkZXN0X3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fU3RhY2tMZW47IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wT3V0cHV0W21fT3V0UG9zICsgaV0gPSBtX0RlY29kZVN0YWNrW21fU3RhY2tMZW4gLSBpIC0gMV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9PdXRQb3MgKz0gbV9TdGFja0xlbjsKLSAgICAgICAgICAgIGxhc3RfY2hhciA9IG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbiAtIDFdOwotICAgICAgICAgICAgaWYgKG9sZF9jb2RlIDwgMjU2KSB7Ci0gICAgICAgICAgICAgICAgQWRkQ29kZShvbGRfY29kZSwgbGFzdF9jaGFyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob2xkX2NvZGUgLSAyNTggPj0gbV9uQ29kZXMpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NpemUgPSBtX091dFBvczsKLSAgICAgICAgICAgICAgICBzcmNfc2l6ZSA9IChtX0luUG9zICsgNykgLyA4OwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBZGRDb2RlKG9sZF9jb2RlLCBsYXN0X2NoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2xkX2NvZGUgPSBjb2RlOwotICAgICAgICB9Ci0gICAgfQotICAgIGRlc3Rfc2l6ZSA9IG1fT3V0UG9zOwotICAgIHNyY19zaXplID0gKG1fSW5Qb3MgKyA3KSAvIDg7Ci0gICAgcmV0dXJuIDA7Ci19Ci1zdGF0aWMgdWludDhfdCBQYWV0aFByZWRpY3RvcihpbnQgYSwgaW50IGIsIGludCBjKQotewotICAgIGludCBwID0gYSArIGIgLSBjOwotICAgIGludCBwYSA9IEZYU1lTX2FicyhwIC0gYSk7Ci0gICAgaW50IHBiID0gRlhTWVNfYWJzKHAgLSBiKTsKLSAgICBpbnQgcGMgPSBGWFNZU19hYnMocCAtIGMpOwotICAgIGlmIChwYSA8PSBwYiAmJiBwYSA8PSBwYykgewotICAgICAgICByZXR1cm4gKHVpbnQ4X3QpYTsKLSAgICB9Ci0gICAgaWYgKHBiIDw9IHBjKSB7Ci0gICAgICAgIHJldHVybiAodWludDhfdCliOwotICAgIH0KLSAgICByZXR1cm4gKHVpbnQ4X3QpYzsKLX0KLXN0YXRpYyBGWF9CT09MIFBOR19QcmVkaWN0b3JFbmNvZGUodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCi17Ci0gICAgY29uc3QgaW50IEJ5dGVzUGVyUGl4ZWwgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCArIDcpIC8gODsKLSAgICBjb25zdCBpbnQgcm93X3NpemUgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCAqIENvbHVtbnMgKyA3KSAvIDg7Ci0gICAgaWYgKHJvd19zaXplIDw9IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBjb25zdCBpbnQgcm93X2NvdW50ID0gKGRhdGFfc2l6ZSArIHJvd19zaXplIC0gMSkgLyByb3dfc2l6ZTsKLSAgICBjb25zdCBpbnQgbGFzdF9yb3dfc2l6ZSA9IGRhdGFfc2l6ZSAlIHJvd19zaXplOwotICAgIHVpbnQ4X3QqIGRlc3RfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCByb3dfc2l6ZSArIDEsIHJvd19jb3VudCk7Ci0gICAgaW50IGJ5dGVfY250ID0gMDsKLSAgICB1aW50OF90KiBwU3JjRGF0YSA9IGRhdGFfYnVmOwotICAgIHVpbnQ4X3QqIHBEZXN0RGF0YSA9IGRlc3RfYnVmOwotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHJvd19jb3VudDsgcm93KyspIHsKLSAgICAgICAgaWYgKHByZWRpY3RvciA9PSAxMCkgewotICAgICAgICAgICAgcERlc3REYXRhWzBdID0gMDsKLSAgICAgICAgICAgIGludCBtb3ZlX3NpemUgPSByb3dfc2l6ZTsKLSAgICAgICAgICAgIGlmIChtb3ZlX3NpemUgKiAocm93ICsgMSkgPiAoaW50KWRhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIG1vdmVfc2l6ZSA9IGRhdGFfc2l6ZSAtIChtb3ZlX3NpemUgKiByb3cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhTWVNfbWVtbW92ZShwRGVzdERhdGEgKyAxLCBwU3JjRGF0YSwgbW92ZV9zaXplKTsKLSAgICAgICAgICAgIHBEZXN0RGF0YSArPSAobW92ZV9zaXplICsgMSk7Ci0gICAgICAgICAgICBwU3JjRGF0YSArPSBtb3ZlX3NpemU7Ci0gICAgICAgICAgICBieXRlX2NudCArPSBtb3ZlX3NpemU7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBieXRlID0gMDsgYnl0ZSA8IHJvd19zaXplICYmIGJ5dGVfY250IDwgKGludClkYXRhX3NpemU7IGJ5dGUrKykgewotICAgICAgICAgICAgc3dpdGNoIChwcmVkaWN0b3IpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbMF0gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcFNyY0RhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhW2J5dGUgKyAxXSA9IHBTcmNEYXRhW2J5dGVdIC0gbGVmdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbMF0gPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1cCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBwU3JjRGF0YVtieXRlIC0gcm93X3NpemVdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhW2J5dGUgKyAxXSA9IHBTcmNEYXRhW2J5dGVdIC0gdXA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogewotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhWzBdID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBTcmNEYXRhW2J5dGUgLSBCeXRlc1BlclBpeGVsXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gcFNyY0RhdGFbYnl0ZSAtIHJvd19zaXplXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0RGF0YVtieXRlICsgMV0gPSBwU3JjRGF0YVtieXRlXSAtIChsZWZ0ICsgdXApIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbMF0gPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcFNyY0RhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1cCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBwU3JjRGF0YVtieXRlIC0gcm93X3NpemVdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1cHBlcl9sZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwgJiYgcm93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfbGVmdCA9IHBTcmNEYXRhW2J5dGUgLSByb3dfc2l6ZSAtIEJ5dGVzUGVyUGl4ZWxdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhW2J5dGUgKyAxXSA9IHBTcmNEYXRhW2J5dGVdIC0gUGFldGhQcmVkaWN0b3IobGVmdCwgdXAsIHVwcGVyX2xlZnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0RGF0YVtieXRlICsgMV0gPSBwU3JjRGF0YVtieXRlXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGVfY250Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcERlc3REYXRhICs9IChyb3dfc2l6ZSArIDEpOwotICAgICAgICBwU3JjRGF0YSArPSByb3dfc2l6ZTsKLSAgICB9Ci0gICAgRlhfRnJlZShkYXRhX2J1Zik7Ci0gICAgZGF0YV9idWYgPSBkZXN0X2J1ZjsKLSAgICBkYXRhX3NpemUgPSAocm93X3NpemUgKyAxKSAqIHJvd19jb3VudCAtIChsYXN0X3Jvd19zaXplID4gMCA/IChyb3dfc2l6ZSAtIGxhc3Rfcm93X3NpemUpIDogMCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1zdGF0aWMgdm9pZCBQTkdfUHJlZGljdExpbmUodWludDhfdCogcERlc3REYXRhLCBjb25zdCB1aW50OF90KiBwU3JjRGF0YSwgY29uc3QgdWludDhfdCogcExhc3RMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicGMsIGludCBuQ29sb3JzLCBpbnQgblBpeGVscykKLXsKLSAgICBpbnQgcm93X3NpemUgPSAoblBpeGVscyAqIGJwYyAqIG5Db2xvcnMgKyA3KSAvIDg7Ci0gICAgaW50IEJ5dGVzUGVyUGl4ZWwgPSAoYnBjICogbkNvbG9ycyArIDcpIC8gODsKLSAgICB1aW50OF90IHRhZyA9IHBTcmNEYXRhWzBdOwotICAgIGlmICh0YWcgPT0gMCkgewotICAgICAgICBGWFNZU19tZW1tb3ZlKHBEZXN0RGF0YSwgcFNyY0RhdGEgKyAxLCByb3dfc2l6ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgYnl0ZSA9IDA7IGJ5dGUgPCByb3dfc2l6ZTsgYnl0ZSArKykgewotICAgICAgICB1aW50OF90IHJhd19ieXRlID0gcFNyY0RhdGFbYnl0ZSArIDFdOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgICAgY2FzZSAxOgl7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZXN0RGF0YVtieXRlXSA9IHJhd19ieXRlICsgbGVmdDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAyOiB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAocExhc3RMaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHBMYXN0TGluZVtieXRlXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIHVwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDM6IHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBEZXN0RGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1cCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwTGFzdExpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gcExhc3RMaW5lW2J5dGVdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZXN0RGF0YVtieXRlXSA9IHJhd19ieXRlICsgKHVwICsgbGVmdCkgLyAyOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDQ6IHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBEZXN0RGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1cCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwTGFzdExpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gcExhc3RMaW5lW2J5dGVdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBwZXJfbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwgJiYgcExhc3RMaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cHBlcl9sZWZ0ID0gcExhc3RMaW5lW2J5dGUgLSBCeXRlc1BlclBpeGVsXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIFBhZXRoUHJlZGljdG9yKGxlZnQsIHVwLCB1cHBlcl9sZWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLXN0YXRpYyBGWF9CT09MIFBOR19QcmVkaWN0b3IodWludDhfdComIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCi17Ci0gICAgY29uc3QgaW50IEJ5dGVzUGVyUGl4ZWwgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCArIDcpIC8gODsKLSAgICBjb25zdCBpbnQgcm93X3NpemUgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCAqIENvbHVtbnMgKyA3KSAvIDg7Ci0gICAgaWYgKHJvd19zaXplIDw9IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBjb25zdCBpbnQgcm93X2NvdW50ID0gKGRhdGFfc2l6ZSArIHJvd19zaXplKSAvIChyb3dfc2l6ZSArIDEpOwotICAgIGNvbnN0IGludCBsYXN0X3Jvd19zaXplID0gZGF0YV9zaXplICUgKHJvd19zaXplICsgMSk7Ci0gICAgdWludDhfdCogZGVzdF9idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIHJvd19zaXplLCByb3dfY291bnQpOwotICAgIGludCBieXRlX2NudCA9IDA7Ci0gICAgdWludDhfdCogcFNyY0RhdGEgPSBkYXRhX2J1ZjsKLSAgICB1aW50OF90KiBwRGVzdERhdGEgPSBkZXN0X2J1ZjsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCByb3dfY291bnQ7IHJvdyArKykgewotICAgICAgICB1aW50OF90IHRhZyA9IHBTcmNEYXRhWzBdOwotICAgICAgICBieXRlX2NudCsrOwotICAgICAgICBpZiAodGFnID09IDApIHsKLSAgICAgICAgICAgIGludCBtb3ZlX3NpemUgPSByb3dfc2l6ZTsKLSAgICAgICAgICAgIGlmICgocm93ICsgMSkgKiAobW92ZV9zaXplICsgMSkgPiAoaW50KWRhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIG1vdmVfc2l6ZSA9IGxhc3Rfcm93X3NpemUgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhTWVNfbWVtbW92ZShwRGVzdERhdGEsIHBTcmNEYXRhICsgMSwgbW92ZV9zaXplKTsKLSAgICAgICAgICAgIHBTcmNEYXRhICs9IG1vdmVfc2l6ZSArIDE7Ci0gICAgICAgICAgICBwRGVzdERhdGEgKz0gbW92ZV9zaXplOwotICAgICAgICAgICAgYnl0ZV9jbnQgKz0gbW92ZV9zaXplOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgYnl0ZSA9IDA7IGJ5dGUgPCByb3dfc2l6ZSAmJiBieXRlX2NudCA8IChpbnQpZGF0YV9zaXplOyBieXRlICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90IHJhd19ieXRlID0gcFNyY0RhdGFbYnl0ZSArIDFdOwotICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6CXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBEZXN0RGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIGxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgMjogewotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1cCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBwRGVzdERhdGFbYnl0ZSAtIHJvd19zaXplXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0RGF0YVtieXRlXSA9IHJhd19ieXRlICsgdXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgMzogewotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcERlc3REYXRhW2J5dGUgLSBCeXRlc1BlclBpeGVsXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gcERlc3REYXRhW2J5dGUgLSByb3dfc2l6ZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArICh1cCArIGxlZnQpIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1cCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBwRGVzdERhdGFbYnl0ZSAtIHJvd19zaXplXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBwZXJfbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsICYmIHJvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX2xlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIHJvd19zaXplIC0gQnl0ZXNQZXJQaXhlbF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIFBhZXRoUHJlZGljdG9yKGxlZnQsIHVwLCB1cHBlcl9sZWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZV9jbnQrKzsKLSAgICAgICAgfQotICAgICAgICBwU3JjRGF0YSArPSByb3dfc2l6ZSArIDE7Ci0gICAgICAgIHBEZXN0RGF0YSArPSByb3dfc2l6ZTsKLSAgICB9Ci0gICAgRlhfRnJlZShkYXRhX2J1Zik7Ci0gICAgZGF0YV9idWYgPSBkZXN0X2J1ZjsKLSAgICBkYXRhX3NpemUgPSByb3dfc2l6ZSAqIHJvd19jb3VudCAtIChsYXN0X3Jvd19zaXplID4gMCA/IChyb3dfc2l6ZSArIDEgLSBsYXN0X3Jvd19zaXplKSA6IDApOwotICAgIHJldHVybiBUUlVFOwotfQotc3RhdGljIHZvaWQgVElGRl9QcmVkaWN0b3JFbmNvZGVMaW5lKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgcm93X3NpemUsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sb3JzLCBpbnQgQ29sdW1ucykKLXsKLSAgICBpbnQgQnl0ZXNQZXJQaXhlbCA9IEJpdHNQZXJDb21wb25lbnQgKiBDb2xvcnMgLyA4OwotICAgIGlmIChCaXRzUGVyQ29tcG9uZW50IDwgOCkgewotICAgICAgICB1aW50OF90IG1hc2sgPSAweDAxOwotICAgICAgICBpZiAoQml0c1BlckNvbXBvbmVudCA9PSAyKSB7Ci0gICAgICAgICAgICBtYXNrID0gMHgwMzsKLSAgICAgICAgfSBlbHNlIGlmIChCaXRzUGVyQ29tcG9uZW50ID09IDQpIHsKLSAgICAgICAgICAgIG1hc2sgPSAweDBGOwotICAgICAgICB9Ci0gICAgICAgIGludCByb3dfYml0cyA9IENvbG9ycyAqIEJpdHNQZXJDb21wb25lbnQgKiBDb2x1bW5zOwotICAgICAgICBmb3IgKGludCBpID0gcm93X2JpdHMgLSBCaXRzUGVyQ29tcG9uZW50OyBpID49IEJpdHNQZXJDb21wb25lbnQ7IGkgLT0gQml0c1BlckNvbXBvbmVudCkgewotICAgICAgICAgICAgaW50IGNvbCA9IGkgJSA4OwotICAgICAgICAgICAgaW50IGluZGV4ID0gaSAvIDg7Ci0gICAgICAgICAgICBpbnQgY29sX3ByZSA9IChjb2wgPT0gMCkgPyAoOCAtIEJpdHNQZXJDb21wb25lbnQpIDogKGNvbCAtIEJpdHNQZXJDb21wb25lbnQpOwotICAgICAgICAgICAgaW50IGluZGV4X3ByZSA9IChjb2wgPT0gMCkgPyAoaW5kZXggLSAxKSA6IGluZGV4OwotICAgICAgICAgICAgdWludDhfdCBjdXIgPSAoZGVzdF9idWZbaW5kZXhdID4+ICg4IC0gY29sIC0gQml0c1BlckNvbXBvbmVudCkpICYgbWFzazsKLSAgICAgICAgICAgIHVpbnQ4X3QgbGVmdCA9IChkZXN0X2J1ZltpbmRleF9wcmVdID4+ICg4IC0gY29sX3ByZSAtIEJpdHNQZXJDb21wb25lbnQpKSAmIG1hc2s7Ci0gICAgICAgICAgICBjdXIgLT0gbGVmdDsKLSAgICAgICAgICAgIGN1ciAmPSBtYXNrOwotICAgICAgICAgICAgY3VyIDw8PSAoOCAtIGNvbCAtIEJpdHNQZXJDb21wb25lbnQpOwotICAgICAgICAgICAgZGVzdF9idWZbaW5kZXhdICY9IH4obWFzayA8PCAoKDggLSBjb2wgLSBCaXRzUGVyQ29tcG9uZW50KSkpOwotICAgICAgICAgICAgZGVzdF9idWZbaW5kZXhdIHw9IGN1cjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoQml0c1BlckNvbXBvbmVudCA9PSA4KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSByb3dfc2l6ZSAtIDE7IGkgPj0gQnl0ZXNQZXJQaXhlbDsgaS0tKSB7Ci0gICAgICAgICAgICBkZXN0X2J1ZltpXSAtPSBkZXN0X2J1ZltpIC0gQnl0ZXNQZXJQaXhlbF07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gcm93X3NpemUgLSBCeXRlc1BlclBpeGVsOyBpID49IEJ5dGVzUGVyUGl4ZWw7IGkgLT0gQnl0ZXNQZXJQaXhlbCkgewotICAgICAgICAgICAgRlhfV09SRCBwaXhlbCA9IChkZXN0X2J1ZltpXSA8PCA4KSB8IGRlc3RfYnVmW2kgKyAxXTsKLSAgICAgICAgICAgIHBpeGVsIC09IChkZXN0X2J1ZltpIC0gQnl0ZXNQZXJQaXhlbF0gPDwgOCkgfCBkZXN0X2J1ZltpIC0gQnl0ZXNQZXJQaXhlbCArIDFdOwotICAgICAgICAgICAgZGVzdF9idWZbaV0gPSBwaXhlbCA+PiA4OwotICAgICAgICAgICAgZGVzdF9idWZbaSArIDFdID0gKHVpbnQ4X3QpcGl4ZWw7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1zdGF0aWMgRlhfQk9PTCBUSUZGX1ByZWRpY3RvckVuY29kZSh1aW50OF90KiYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCi17Ci0gICAgaW50IHJvd19zaXplID0gKENvbG9ycyAqIEJpdHNQZXJDb21wb25lbnQgKiBDb2x1bW5zICsgNykgLyA4OwotICAgIGlmIChyb3dfc2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgY29uc3QgaW50IHJvd19jb3VudCA9IChkYXRhX3NpemUgKyByb3dfc2l6ZSAtIDEpIC8gcm93X3NpemU7Ci0gICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCByb3dfY291bnQ7IHJvdysrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IGRhdGFfYnVmICsgcm93ICogcm93X3NpemU7Ci0gICAgICAgIGlmICgocm93ICsgMSkgKiByb3dfc2l6ZSA+IChpbnQpZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICByb3dfc2l6ZSA9IGxhc3Rfcm93X3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgVElGRl9QcmVkaWN0b3JFbmNvZGVMaW5lKHNjYW5fbGluZSwgcm93X3NpemUsIEJpdHNQZXJDb21wb25lbnQsIENvbG9ycywgQ29sdW1ucyk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotc3RhdGljIHZvaWQgVElGRl9QcmVkaWN0TGluZSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IHJvd19zaXplLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbG9ycywgaW50IENvbHVtbnMpCi17Ci0gICAgaWYgKEJpdHNQZXJDb21wb25lbnQgPT0gMSkgewotICAgICAgICBpbnQgcm93X2JpdHMgPSBGWF9NSU4oQml0c1BlckNvbXBvbmVudCAqIENvbG9ycyAqIENvbHVtbnMsIHJvd19zaXplICogOCk7Ci0gICAgICAgIGludCBpbmRleF9wcmUgPSAwOwotICAgICAgICBpbnQgY29sX3ByZSA9IDA7Ci0gICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCByb3dfYml0czsgaSArKykgewotICAgICAgICAgICAgaW50IGNvbCA9IGkgJSA4OwotICAgICAgICAgICAgaW50IGluZGV4ID0gaSAvIDg7Ci0gICAgICAgICAgICBpZiggKChkZXN0X2J1ZltpbmRleF0gPj4gKDcgLSBjb2wpKSAmIDEpIF4gKChkZXN0X2J1ZltpbmRleF9wcmVdID4+ICg3IC0gY29sX3ByZSkpICYgMSkgKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9idWZbaW5kZXhdIHw9IDEgPDwgKDcgLSBjb2wpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXN0X2J1ZltpbmRleF0gJj0gfigxIDw8ICg3IC0gY29sKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmRleF9wcmUgPSBpbmRleDsKLSAgICAgICAgICAgIGNvbF9wcmUgPSBjb2w7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgQnl0ZXNQZXJQaXhlbCA9IEJpdHNQZXJDb21wb25lbnQgKiBDb2xvcnMgLyA4OwotICAgIGlmIChCaXRzUGVyQ29tcG9uZW50ID09IDE2KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBCeXRlc1BlclBpeGVsOyBpIDwgcm93X3NpemU7IGkgKz0gMikgewotICAgICAgICAgICAgRlhfV09SRCBwaXhlbCA9IChkZXN0X2J1ZltpIC0gQnl0ZXNQZXJQaXhlbF0gPDwgOCkgfCBkZXN0X2J1ZltpIC0gQnl0ZXNQZXJQaXhlbCArIDFdOwotICAgICAgICAgICAgcGl4ZWwgKz0gKGRlc3RfYnVmW2ldIDw8IDgpIHwgZGVzdF9idWZbaSArIDFdOwotICAgICAgICAgICAgZGVzdF9idWZbaV0gPSBwaXhlbCA+PiA4OwotICAgICAgICAgICAgZGVzdF9idWZbaSArIDFdID0gKHVpbnQ4X3QpcGl4ZWw7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gQnl0ZXNQZXJQaXhlbDsgaSA8IHJvd19zaXplOyBpICsrKSB7Ci0gICAgICAgICAgICBkZXN0X2J1ZltpXSArPSBkZXN0X2J1ZltpIC0gQnl0ZXNQZXJQaXhlbF07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1zdGF0aWMgRlhfQk9PTCBUSUZGX1ByZWRpY3Rvcih1aW50OF90KiYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCi17Ci0gICAgaW50IHJvd19zaXplID0gKENvbG9ycyAqIEJpdHNQZXJDb21wb25lbnQgKiBDb2x1bW5zICsgNykgLyA4OwotICAgIGlmIChyb3dfc2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgY29uc3QgaW50IHJvd19jb3VudCA9IChkYXRhX3NpemUgKyByb3dfc2l6ZSAtIDEpIC8gcm93X3NpemU7Ci0gICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCByb3dfY291bnQ7IHJvdyArKykgewotICAgICAgICB1aW50OF90KiBzY2FuX2xpbmUgPSBkYXRhX2J1ZiArIHJvdyAqIHJvd19zaXplOwotICAgICAgICBpZiAoKHJvdyArIDEpICogcm93X3NpemUgPiAoaW50KWRhdGFfc2l6ZSkgewotICAgICAgICAgICAgcm93X3NpemUgPSBsYXN0X3Jvd19zaXplOwotICAgICAgICB9Ci0gICAgICAgIFRJRkZfUHJlZGljdExpbmUoc2Nhbl9saW5lLCByb3dfc2l6ZSwgQml0c1BlckNvbXBvbmVudCwgQ29sb3JzLCBDb2x1bW5zKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1jbGFzcyBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcgotewotcHVibGljOgotICAgIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2RlcigpOwotICAgIH5DQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXIoKTsKLSAgICB2b2lkIENyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBpbnQgYnBjLAotICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucyk7Ci0gICAgdmlydHVhbCB2b2lkCQlEZXN0cm95KCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCXZfRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X1Jld2luZCgpOwotICAgIHZpcnR1YWwgdWludDhfdCoJdl9HZXROZXh0TGluZSgpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3JjT2Zmc2V0KCk7Ci0gICAgdm9pZCoJCQkJbV9wRmxhdGU7Ci0gICAgY29uc3QgdWludDhfdCoJCQltX1NyY0J1ZjsKLSAgICBGWF9EV09SRAkJCW1fU3JjU2l6ZTsKLSAgICB1aW50OF90KgkJCW1fcFNjYW5saW5lOwotICAgIHVpbnQ4X3QqCQkJbV9wTGFzdExpbmU7Ci0gICAgdWludDhfdCoJCQltX3BQcmVkaWN0QnVmZmVyOwotICAgIHVpbnQ4X3QqCQkJbV9wUHJlZGljdFJhdzsKLSAgICBpbnQJCQkJCW1fUHJlZGljdG9yOwotICAgIGludAkJCQkJbV9Db2xvcnMsIG1fQml0c1BlckNvbXBvbmVudCwgbV9Db2x1bW5zLCBtX1ByZWRpY3RQaXRjaCwgbV9MZWZ0T3ZlcjsKLX07Ci1DQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OkNDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2RlcigpCi17Ci0gICAgbV9wRmxhdGUgPSBOVUxMOwotICAgIG1fcFNjYW5saW5lID0gTlVMTDsKLSAgICBtX3BMYXN0TGluZSA9IE5VTEw7Ci0gICAgbV9wUHJlZGljdEJ1ZmZlciA9IE5VTEw7Ci0gICAgbV9wUHJlZGljdFJhdyA9IE5VTEw7Ci0gICAgbV9MZWZ0T3ZlciA9IDA7Ci19Ci1DQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6On5DQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXIoKQotewotICAgIGlmIChtX3BTY2FubGluZSkgewotICAgICAgICBGWF9GcmVlKG1fcFNjYW5saW5lKTsKLSAgICB9Ci0gICAgaWYgKG1fcExhc3RMaW5lKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wTGFzdExpbmUpOwotICAgIH0KLSAgICBpZiAobV9wUHJlZGljdEJ1ZmZlcikgewotICAgICAgICBGWF9GcmVlKG1fcFByZWRpY3RCdWZmZXIpOwotICAgIH0KLSAgICBpZiAobV9wUHJlZGljdFJhdykgewotICAgICAgICBGWF9GcmVlKG1fcFByZWRpY3RSYXcpOwotICAgIH0KLSAgICBpZiAobV9wRmxhdGUpIHsKLSAgICAgICAgRlBERkFQSV9GbGF0ZUVuZChtX3BGbGF0ZSk7Ci0gICAgfQotfQotdm9pZCBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OkNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjLCBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCi17Ci0gICAgbV9TcmNCdWYgPSBzcmNfYnVmOwotICAgIG1fU3JjU2l6ZSA9IHNyY19zaXplOwotICAgIG1fT3V0cHV0V2lkdGggPSBtX09yaWdXaWR0aCA9IHdpZHRoOwotICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0ID0gaGVpZ2h0OwotICAgIG1fbkNvbXBzID0gbkNvbXBzOwotICAgIG1fYnBjID0gYnBjOwotICAgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKLSAgICBtX1BpdGNoID0gKHdpZHRoICogbkNvbXBzICogYnBjICsgNykgLyA4OwotICAgIG1fcFNjYW5saW5lID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7Ci0gICAgbV9QcmVkaWN0b3IgPSAwOwotICAgIGlmIChwcmVkaWN0b3IpIHsKLSAgICAgICAgaWYgKHByZWRpY3RvciA+PSAxMCkgewotICAgICAgICAgICAgbV9QcmVkaWN0b3IgPSAyOwotICAgICAgICB9IGVsc2UgaWYgKHByZWRpY3RvciA9PSAyKSB7Ci0gICAgICAgICAgICBtX1ByZWRpY3RvciA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fUHJlZGljdG9yKSB7Ci0gICAgICAgICAgICBpZiAoQml0c1BlckNvbXBvbmVudCAqIENvbG9ycyAqIENvbHVtbnMgPT0gMCkgewotICAgICAgICAgICAgICAgIEJpdHNQZXJDb21wb25lbnQgPSBtX2JwYzsKLSAgICAgICAgICAgICAgICBDb2xvcnMgPSBtX25Db21wczsKLSAgICAgICAgICAgICAgICBDb2x1bW5zID0gbV9PcmlnV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX0NvbG9ycyA9IENvbG9yczsKLSAgICAgICAgICAgIG1fQml0c1BlckNvbXBvbmVudCA9IEJpdHNQZXJDb21wb25lbnQ7Ci0gICAgICAgICAgICBtX0NvbHVtbnMgPSBDb2x1bW5zOwotICAgICAgICAgICAgbV9QcmVkaWN0UGl0Y2ggPSAobV9CaXRzUGVyQ29tcG9uZW50ICogbV9Db2xvcnMgKiBtX0NvbHVtbnMgKyA3KSAvIDg7Ci0gICAgICAgICAgICBtX3BMYXN0TGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUHJlZGljdFBpdGNoKTsKLSAgICAgICAgICAgIG1fcFByZWRpY3RSYXcgPSBGWF9BbGxvYyh1aW50OF90LCBtX1ByZWRpY3RQaXRjaCArIDEpOwotICAgICAgICAgICAgbV9wUHJlZGljdEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUHJlZGljdFBpdGNoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjp2X1Jld2luZCgpCi17Ci0gICAgaWYgKG1fcEZsYXRlKSB7Ci0gICAgICAgIEZQREZBUElfRmxhdGVFbmQobV9wRmxhdGUpOwotICAgIH0KLSAgICBtX3BGbGF0ZSA9IEZQREZBUElfRmxhdGVJbml0KG15X2FsbG9jX2Z1bmMsIG15X2ZyZWVfZnVuYyk7Ci0gICAgaWYgKG1fcEZsYXRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGUERGQVBJX0ZsYXRlSW5wdXQobV9wRmxhdGUsIG1fU3JjQnVmLCBtX1NyY1NpemUpOwotICAgIG1fTGVmdE92ZXIgPSAwOwotICAgIHJldHVybiBUUlVFOwotfQotdWludDhfdCogQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjp2X0dldE5leHRMaW5lKCkKLXsKLSAgICBpZiAobV9QcmVkaWN0b3IpIHsKLSAgICAgICAgaWYgKG1fUGl0Y2ggPT0gbV9QcmVkaWN0UGl0Y2gpIHsKLSAgICAgICAgICAgIGlmIChtX1ByZWRpY3RvciA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wUHJlZGljdFJhdywgbV9QcmVkaWN0UGl0Y2ggKyAxKTsKLSAgICAgICAgICAgICAgICBQTkdfUHJlZGljdExpbmUobV9wU2NhbmxpbmUsIG1fcFByZWRpY3RSYXcsIG1fcExhc3RMaW5lLCBtX0JpdHNQZXJDb21wb25lbnQsIG1fQ29sb3JzLCBtX0NvbHVtbnMpOwotICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShtX3BMYXN0TGluZSwgbV9wU2NhbmxpbmUsIG1fUHJlZGljdFBpdGNoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wU2NhbmxpbmUsIG1fUGl0Y2gpOwotICAgICAgICAgICAgICAgIFRJRkZfUHJlZGljdExpbmUobV9wU2NhbmxpbmUsIG1fUHJlZGljdFBpdGNoLCBtX2JwYywgbV9uQ29tcHMsIG1fT3V0cHV0V2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGJ5dGVzX3RvX2dvID0gbV9QaXRjaDsKLSAgICAgICAgICAgIGludCByZWFkX2xlZnRvdmVyID0gbV9MZWZ0T3ZlciA+IGJ5dGVzX3RvX2dvID8gYnl0ZXNfdG9fZ28gOiBtX0xlZnRPdmVyOwotICAgICAgICAgICAgaWYgKHJlYWRfbGVmdG92ZXIpIHsKLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkobV9wU2NhbmxpbmUsIG1fcFByZWRpY3RCdWZmZXIgKyBtX1ByZWRpY3RQaXRjaCAtIG1fTGVmdE92ZXIsIHJlYWRfbGVmdG92ZXIpOwotICAgICAgICAgICAgICAgIG1fTGVmdE92ZXIgLT0gcmVhZF9sZWZ0b3ZlcjsKLSAgICAgICAgICAgICAgICBieXRlc190b19nbyAtPSByZWFkX2xlZnRvdmVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKGJ5dGVzX3RvX2dvKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fUHJlZGljdG9yID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wUHJlZGljdFJhdywgbV9QcmVkaWN0UGl0Y2ggKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgUE5HX1ByZWRpY3RMaW5lKG1fcFByZWRpY3RCdWZmZXIsIG1fcFByZWRpY3RSYXcsIG1fcExhc3RMaW5lLCBtX0JpdHNQZXJDb21wb25lbnQsIG1fQ29sb3JzLCBtX0NvbHVtbnMpOwotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkobV9wTGFzdExpbmUsIG1fcFByZWRpY3RCdWZmZXIsIG1fUHJlZGljdFBpdGNoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBGUERGQVBJX0ZsYXRlT3V0cHV0KG1fcEZsYXRlLCBtX3BQcmVkaWN0QnVmZmVyLCBtX1ByZWRpY3RQaXRjaCk7Ci0gICAgICAgICAgICAgICAgICAgIFRJRkZfUHJlZGljdExpbmUobV9wUHJlZGljdEJ1ZmZlciwgbV9QcmVkaWN0UGl0Y2gsIG1fQml0c1BlckNvbXBvbmVudCwgbV9Db2xvcnMsIG1fQ29sdW1ucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCByZWFkX2J5dGVzID0gbV9QcmVkaWN0UGl0Y2ggPiBieXRlc190b19nbyA/IGJ5dGVzX3RvX2dvIDogbV9QcmVkaWN0UGl0Y2g7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFNjYW5saW5lICsgbV9QaXRjaCAtIGJ5dGVzX3RvX2dvLCBtX3BQcmVkaWN0QnVmZmVyLCByZWFkX2J5dGVzKTsKLSAgICAgICAgICAgICAgICBtX0xlZnRPdmVyICs9IG1fUHJlZGljdFBpdGNoIC0gcmVhZF9ieXRlczsKLSAgICAgICAgICAgICAgICBieXRlc190b19nbyAtPSByZWFkX2J5dGVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wU2NhbmxpbmUsIG1fUGl0Y2gpOwotICAgIH0KLSAgICByZXR1cm4gbV9wU2NhbmxpbmU7Ci19Ci1GWF9EV09SRCBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OkdldFNyY09mZnNldCgpCi17Ci0gICAgcmV0dXJuIEZQREZBUElfRmxhdGVHZXRUb3RhbEluKG1fcEZsYXRlKTsKLX0KLXN0YXRpYyB2b2lkIEZsYXRlVW5jb21wcmVzcyhjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfRFdPUkQgb3JpZ19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwgRlhfRFdPUkQmIG9mZnNldCkKLXsKLSAgICBjb25zdCBGWF9CT09MIHVzZU9sZEltcGwgPSBzcmNfc2l6ZSA8IDEwMjQwOwotICAgIEZYX0RXT1JEIGd1ZXNzX3NpemUgPSBvcmlnX3NpemUgPyBvcmlnX3NpemUgOiBzcmNfc2l6ZSAqIDI7Ci0gICAgRlhfRFdPUkQgYWxsb2Nfc3RlcCA9IG9yaWdfc2l6ZSA/IDEwMjQwIDogKHNyY19zaXplIDwgMTAyNDAgPyAxMDI0MCA6IHNyY19zaXplKTsKLSAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQga01heEluaXRpYWxBbGxvY1NpemUgPSAxMDAwMDAwMDsKLSAgICBpZiAoZ3Vlc3Nfc2l6ZSA+IGtNYXhJbml0aWFsQWxsb2NTaXplKSB7Ci0gICAgICAgIGd1ZXNzX3NpemUgPSBrTWF4SW5pdGlhbEFsbG9jU2l6ZTsKLSAgICAgICAgYWxsb2Nfc3RlcCA9IGtNYXhJbml0aWFsQWxsb2NTaXplOwotICAgIH0KLSAgICBGWF9EV09SRCBidWZfc2l6ZSA9IGd1ZXNzX3NpemU7Ci0gICAgRlhfRFdPUkQgbGFzdF9idWZfc2l6ZSA9IGJ1Zl9zaXplOwotICAgIHZvaWQqIGNvbnRleHQgPSBudWxscHRyOwotCi0gICAgdWludDhfdCogZ3Vlc3NfYnVmID0gRlhfQWxsb2ModWludDhfdCwgZ3Vlc3Nfc2l6ZSArIDEpOwotICAgIHVpbnQ4X3QqIGN1cl9idWYgPSBndWVzc19idWY7Ci0gICAgZ3Vlc3NfYnVmW2d1ZXNzX3NpemVdID0gJ1wwJzsKLSAgICBjb250ZXh0ID0gRlBERkFQSV9GbGF0ZUluaXQobXlfYWxsb2NfZnVuYywgbXlfZnJlZV9mdW5jKTsKLSAgICBpZiAoIWNvbnRleHQpCi0gICAgICAgIGdvdG8gZmFpbDsKLSAgICBGUERGQVBJX0ZsYXRlSW5wdXQoY29udGV4dCwgc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgIGlmICh1c2VPbGRJbXBsKSB7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHJldCA9IEZQREZBUElfRmxhdGVPdXRwdXQoY29udGV4dCwgY3VyX2J1ZiwgYnVmX3NpemUpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBaX09LKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaW50MzJfdCBhdmFpbF9idWZfc2l6ZSA9IEZQREZBUElfRmxhdGVHZXRBdmFpbE91dChjb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChhdmFpbF9idWZfc2l6ZSAhPSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyB8YXZhaWxfYnVmX3NpemV8ID09IDAgY2FzZS4KLSAgICAgICAgICAgIEZYX0RXT1JEIG9sZF9zaXplID0gZ3Vlc3Nfc2l6ZTsKLSAgICAgICAgICAgIGd1ZXNzX3NpemUgKz0gYWxsb2Nfc3RlcDsKLSAgICAgICAgICAgIGlmIChndWVzc19zaXplIDwgb2xkX3NpemUgfHwgZ3Vlc3Nfc2l6ZSArIDEgPCBndWVzc19zaXplKQotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIGd1ZXNzX2J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgZ3Vlc3NfYnVmLCBndWVzc19zaXplICsgMSk7Ci0gICAgICAgICAgICBpZiAoIWd1ZXNzX2J1ZikKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICBndWVzc19idWZbZ3Vlc3Nfc2l6ZV0gPSAnXDAnOwotICAgICAgICAgICAgY3VyX2J1ZiA9IGd1ZXNzX2J1ZiArIG9sZF9zaXplOwotICAgICAgICAgICAgYnVmX3NpemUgPSBndWVzc19zaXplIC0gb2xkX3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zaXplID0gRlBERkFQSV9GbGF0ZUdldFRvdGFsT3V0KGNvbnRleHQpOwotICAgICAgICBvZmZzZXQgPSBGUERGQVBJX0ZsYXRlR2V0VG90YWxJbihjb250ZXh0KTsKLSAgICAgICAgaWYgKGd1ZXNzX3NpemUgLyAyID4gZGVzdF9zaXplKSB7Ci0gICAgICAgICAgICBndWVzc19idWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIGd1ZXNzX2J1ZiwgZGVzdF9zaXplICsgMSk7Ci0gICAgICAgICAgICBpZiAoIWd1ZXNzX2J1ZikKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICBndWVzc19zaXplID0gZGVzdF9zaXplOwotICAgICAgICAgICAgZ3Vlc3NfYnVmW2d1ZXNzX3NpemVdID0gJ1wwJzsKLSAgICAgICAgfQotICAgICAgICBkZXN0X2J1ZiA9IGd1ZXNzX2J1ZjsKLSAgICB9IGVsc2UgewotICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90Kj4gcmVzdWx0X3RtcF9idWZzOwotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaW50MzJfdCByZXQgPSBGUERGQVBJX0ZsYXRlT3V0cHV0KGNvbnRleHQsIGN1cl9idWYsIGJ1Zl9zaXplKTsKLSAgICAgICAgICAgIGludDMyX3QgYXZhaWxfYnVmX3NpemUgPSBGUERGQVBJX0ZsYXRlR2V0QXZhaWxPdXQoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAocmV0ICE9IFpfT0spIHsKLSAgICAgICAgICAgICAgICBsYXN0X2J1Zl9zaXplID0gYnVmX3NpemUgLSBhdmFpbF9idWZfc2l6ZTsKLSAgICAgICAgICAgICAgICByZXN1bHRfdG1wX2J1ZnMuQWRkKGN1cl9idWYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF2YWlsX2J1Zl9zaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBsYXN0X2J1Zl9zaXplID0gYnVmX3NpemUgLSBhdmFpbF9idWZfc2l6ZTsKLSAgICAgICAgICAgICAgICByZXN1bHRfdG1wX2J1ZnMuQWRkKGN1cl9idWYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB8YXZhaWxfYnVmX3NpemV8ID09IDAgY2FzZS4KLSAgICAgICAgICAgIHJlc3VsdF90bXBfYnVmcy5BZGQoY3VyX2J1Zik7Ci0gICAgICAgICAgICBjdXJfYnVmID0gRlhfQWxsb2ModWludDhfdCwgYnVmX3NpemUgKyAxKTsKLSAgICAgICAgICAgIGN1cl9idWZbYnVmX3NpemVdID0gJ1wwJzsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NpemUgPSBGUERGQVBJX0ZsYXRlR2V0VG90YWxPdXQoY29udGV4dCk7Ci0gICAgICAgIG9mZnNldCA9IEZQREZBUElfRmxhdGVHZXRUb3RhbEluKGNvbnRleHQpOwotICAgICAgICBpZiAocmVzdWx0X3RtcF9idWZzLkdldFNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICBkZXN0X2J1ZiA9IHJlc3VsdF90bXBfYnVmc1swXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHJlc3VsdF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBkZXN0X3NpemUpOwotICAgICAgICAgICAgRlhfRFdPUkQgcmVzdWx0X3BvcyA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCByZXN1bHRfdG1wX2J1ZnMuR2V0U2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90KiB0bXBfYnVmID0gcmVzdWx0X3RtcF9idWZzW2ldOwotICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRtcF9idWZfc2l6ZSA9IGJ1Zl9zaXplOwotICAgICAgICAgICAgICAgIGlmIChpID09IHJlc3VsdF90bXBfYnVmcy5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcF9idWZfc2l6ZSA9IGxhc3RfYnVmX3NpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShyZXN1bHRfYnVmICsgcmVzdWx0X3BvcywgdG1wX2J1ZiwgdG1wX2J1Zl9zaXplKTsKLSAgICAgICAgICAgICAgICByZXN1bHRfcG9zICs9IHRtcF9idWZfc2l6ZTsKLSAgICAgICAgICAgICAgICBGWF9GcmVlKHJlc3VsdF90bXBfYnVmc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X2J1ZiA9IHJlc3VsdF9idWY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlBERkFQSV9GbGF0ZUVuZChjb250ZXh0KTsKK3ZvaWQgQ0xaV0RlY29kZXI6OkFkZENvZGUoRlhfRFdPUkQgcHJlZml4X2NvZGUsIHVpbnQ4X3QgYXBwZW5kX2NoYXIpIHsKKyAgaWYgKG1fbkNvZGVzICsgbV9FYXJseSA9PSA0MDk0KSB7CiAgICAgcmV0dXJuOworICB9CisgIG1fQ29kZUFycmF5W21fbkNvZGVzKytdID0gKHByZWZpeF9jb2RlIDw8IDE2KSB8IGFwcGVuZF9jaGFyOworICBpZiAobV9uQ29kZXMgKyBtX0Vhcmx5ID09IDUxMiAtIDI1OCkgeworICAgIG1fQ29kZUxlbiA9IDEwOworICB9IGVsc2UgaWYgKG1fbkNvZGVzICsgbV9FYXJseSA9PSAxMDI0IC0gMjU4KSB7CisgICAgbV9Db2RlTGVuID0gMTE7CisgIH0gZWxzZSBpZiAobV9uQ29kZXMgKyBtX0Vhcmx5ID09IDIwNDggLSAyNTgpIHsKKyAgICBtX0NvZGVMZW4gPSAxMjsKKyAgfQorfQordm9pZCBDTFpXRGVjb2Rlcjo6RGVjb2RlU3RyaW5nKEZYX0RXT1JEIGNvZGUpIHsKKyAgd2hpbGUgKDEpIHsKKyAgICBpbnQgaW5kZXggPSBjb2RlIC0gMjU4OworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gKGludCltX25Db2RlcykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIEZYX0RXT1JEIGRhdGEgPSBtX0NvZGVBcnJheVtpbmRleF07CisgICAgaWYgKG1fU3RhY2tMZW4gPj0gc2l6ZW9mKG1fRGVjb2RlU3RhY2spKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbisrXSA9ICh1aW50OF90KWRhdGE7CisgICAgY29kZSA9IGRhdGEgPj4gMTY7CisgIH0KKyAgaWYgKG1fU3RhY2tMZW4gPj0gc2l6ZW9mKG1fRGVjb2RlU3RhY2spKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbisrXSA9ICh1aW50OF90KWNvZGU7Cit9CitpbnQgQ0xaV0RlY29kZXI6OkRlY29kZSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRWFybHlDaGFuZ2UpIHsKKyAgbV9Db2RlTGVuID0gOTsKKyAgbV9JblBvcyA9IDA7CisgIG1fT3V0UG9zID0gMDsKKyAgbV9wSW5wdXQgPSBzcmNfYnVmOworICBtX3BPdXRwdXQgPSBkZXN0X2J1ZjsKKyAgbV9FYXJseSA9IGJFYXJseUNoYW5nZSA/IDEgOiAwOworICBtX25Db2RlcyA9IDA7CisgIEZYX0RXT1JEIG9sZF9jb2RlID0gKEZYX0RXT1JEKS0xOworICB1aW50OF90IGxhc3RfY2hhcjsKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAobV9JblBvcyArIG1fQ29kZUxlbiA+IHNyY19zaXplICogOCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGludCBieXRlX3BvcyA9IG1fSW5Qb3MgLyA4OworICAgIGludCBiaXRfcG9zID0gbV9JblBvcyAlIDgsIGJpdF9sZWZ0ID0gbV9Db2RlTGVuOworICAgIEZYX0RXT1JEIGNvZGUgPSAwOworICAgIGlmIChiaXRfcG9zKSB7CisgICAgICBiaXRfbGVmdCAtPSA4IC0gYml0X3BvczsKKyAgICAgIGNvZGUgPSAobV9wSW5wdXRbYnl0ZV9wb3MrK10gJiAoKDEgPDwgKDggLSBiaXRfcG9zKSkgLSAxKSkgPDwgYml0X2xlZnQ7CisgICAgfQorICAgIGlmIChiaXRfbGVmdCA8IDgpIHsKKyAgICAgIGNvZGUgfD0gbV9wSW5wdXRbYnl0ZV9wb3NdID4+ICg4IC0gYml0X2xlZnQpOworICAgIH0gZWxzZSB7CisgICAgICBiaXRfbGVmdCAtPSA4OworICAgICAgY29kZSB8PSBtX3BJbnB1dFtieXRlX3BvcysrXSA8PCBiaXRfbGVmdDsKKyAgICAgIGlmIChiaXRfbGVmdCkgeworICAgICAgICBjb2RlIHw9IG1fcElucHV0W2J5dGVfcG9zXSA+PiAoOCAtIGJpdF9sZWZ0KTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9JblBvcyArPSBtX0NvZGVMZW47CisgICAgaWYgKGNvZGUgPCAyNTYpIHsKKyAgICAgIGlmIChtX091dFBvcyA9PSBkZXN0X3NpemUpIHsKKyAgICAgICAgcmV0dXJuIC01OworICAgICAgfQorICAgICAgaWYgKG1fcE91dHB1dCkgeworICAgICAgICBtX3BPdXRwdXRbbV9PdXRQb3NdID0gKHVpbnQ4X3QpY29kZTsKKyAgICAgIH0KKyAgICAgIG1fT3V0UG9zKys7CisgICAgICBsYXN0X2NoYXIgPSAodWludDhfdCljb2RlOworICAgICAgaWYgKG9sZF9jb2RlICE9IChGWF9EV09SRCktMSkgeworICAgICAgICBBZGRDb2RlKG9sZF9jb2RlLCBsYXN0X2NoYXIpOworICAgICAgfQorICAgICAgb2xkX2NvZGUgPSBjb2RlOworICAgIH0gZWxzZSBpZiAoY29kZSA9PSAyNTYpIHsKKyAgICAgIG1fQ29kZUxlbiA9IDk7CisgICAgICBtX25Db2RlcyA9IDA7CisgICAgICBvbGRfY29kZSA9IChGWF9EV09SRCktMTsKKyAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMjU3KSB7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG9sZF9jb2RlID09IChGWF9EV09SRCktMSkgeworICAgICAgICByZXR1cm4gMjsKKyAgICAgIH0KKyAgICAgIG1fU3RhY2tMZW4gPSAwOworICAgICAgaWYgKGNvZGUgPj0gbV9uQ29kZXMgKyAyNTgpIHsKKyAgICAgICAgaWYgKG1fU3RhY2tMZW4gPCBzaXplb2YobV9EZWNvZGVTdGFjaykpIHsKKyAgICAgICAgICBtX0RlY29kZVN0YWNrW21fU3RhY2tMZW4rK10gPSBsYXN0X2NoYXI7CisgICAgICAgIH0KKyAgICAgICAgRGVjb2RlU3RyaW5nKG9sZF9jb2RlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERlY29kZVN0cmluZyhjb2RlKTsKKyAgICAgIH0KKyAgICAgIGlmIChtX091dFBvcyArIG1fU3RhY2tMZW4gPiBkZXN0X3NpemUpIHsKKyAgICAgICAgcmV0dXJuIC01OworICAgICAgfQorICAgICAgaWYgKG1fcE91dHB1dCkgeworICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9TdGFja0xlbjsgaSsrKSB7CisgICAgICAgICAgbV9wT3V0cHV0W21fT3V0UG9zICsgaV0gPSBtX0RlY29kZVN0YWNrW21fU3RhY2tMZW4gLSBpIC0gMV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1fT3V0UG9zICs9IG1fU3RhY2tMZW47CisgICAgICBsYXN0X2NoYXIgPSBtX0RlY29kZVN0YWNrW21fU3RhY2tMZW4gLSAxXTsKKyAgICAgIGlmIChvbGRfY29kZSA8IDI1NikgeworICAgICAgICBBZGRDb2RlKG9sZF9jb2RlLCBsYXN0X2NoYXIpOworICAgICAgfSBlbHNlIGlmIChvbGRfY29kZSAtIDI1OCA+PSBtX25Db2RlcykgeworICAgICAgICBkZXN0X3NpemUgPSBtX091dFBvczsKKyAgICAgICAgc3JjX3NpemUgPSAobV9JblBvcyArIDcpIC8gODsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBBZGRDb2RlKG9sZF9jb2RlLCBsYXN0X2NoYXIpOworICAgICAgfQorICAgICAgb2xkX2NvZGUgPSBjb2RlOworICAgIH0KKyAgfQorICBkZXN0X3NpemUgPSBtX091dFBvczsKKyAgc3JjX3NpemUgPSAobV9JblBvcyArIDcpIC8gODsKKyAgcmV0dXJuIDA7Cit9CitzdGF0aWMgdWludDhfdCBQYWV0aFByZWRpY3RvcihpbnQgYSwgaW50IGIsIGludCBjKSB7CisgIGludCBwID0gYSArIGIgLSBjOworICBpbnQgcGEgPSBGWFNZU19hYnMocCAtIGEpOworICBpbnQgcGIgPSBGWFNZU19hYnMocCAtIGIpOworICBpbnQgcGMgPSBGWFNZU19hYnMocCAtIGMpOworICBpZiAocGEgPD0gcGIgJiYgcGEgPD0gcGMpIHsKKyAgICByZXR1cm4gKHVpbnQ4X3QpYTsKKyAgfQorICBpZiAocGIgPD0gcGMpIHsKKyAgICByZXR1cm4gKHVpbnQ4X3QpYjsKKyAgfQorICByZXR1cm4gKHVpbnQ4X3QpYzsKK30KK3N0YXRpYyBGWF9CT09MIFBOR19QcmVkaWN0b3JFbmNvZGUodWludDhfdComIGRhdGFfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbHVtbnMpIHsKKyAgY29uc3QgaW50IEJ5dGVzUGVyUGl4ZWwgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCArIDcpIC8gODsKKyAgY29uc3QgaW50IHJvd19zaXplID0gKENvbG9ycyAqIEJpdHNQZXJDb21wb25lbnQgKiBDb2x1bW5zICsgNykgLyA4OworICBpZiAocm93X3NpemUgPD0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGNvbnN0IGludCByb3dfY291bnQgPSAoZGF0YV9zaXplICsgcm93X3NpemUgLSAxKSAvIHJvd19zaXplOworICBjb25zdCBpbnQgbGFzdF9yb3dfc2l6ZSA9IGRhdGFfc2l6ZSAlIHJvd19zaXplOworICB1aW50OF90KiBkZXN0X2J1ZiA9IEZYX0FsbG9jMkQodWludDhfdCwgcm93X3NpemUgKyAxLCByb3dfY291bnQpOworICBpbnQgYnl0ZV9jbnQgPSAwOworICB1aW50OF90KiBwU3JjRGF0YSA9IGRhdGFfYnVmOworICB1aW50OF90KiBwRGVzdERhdGEgPSBkZXN0X2J1ZjsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93X2NvdW50OyByb3crKykgeworICAgIGlmIChwcmVkaWN0b3IgPT0gMTApIHsKKyAgICAgIHBEZXN0RGF0YVswXSA9IDA7CisgICAgICBpbnQgbW92ZV9zaXplID0gcm93X3NpemU7CisgICAgICBpZiAobW92ZV9zaXplICogKHJvdyArIDEpID4gKGludClkYXRhX3NpemUpIHsKKyAgICAgICAgbW92ZV9zaXplID0gZGF0YV9zaXplIC0gKG1vdmVfc2l6ZSAqIHJvdyk7CisgICAgICB9CisgICAgICBGWFNZU19tZW1tb3ZlKHBEZXN0RGF0YSArIDEsIHBTcmNEYXRhLCBtb3ZlX3NpemUpOworICAgICAgcERlc3REYXRhICs9IChtb3ZlX3NpemUgKyAxKTsKKyAgICAgIHBTcmNEYXRhICs9IG1vdmVfc2l6ZTsKKyAgICAgIGJ5dGVfY250ICs9IG1vdmVfc2l6ZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmb3IgKGludCBieXRlID0gMDsgYnl0ZSA8IHJvd19zaXplICYmIGJ5dGVfY250IDwgKGludClkYXRhX3NpemU7IGJ5dGUrKykgeworICAgICAgc3dpdGNoIChwcmVkaWN0b3IpIHsKKyAgICAgICAgY2FzZSAxMTogeworICAgICAgICAgIHBEZXN0RGF0YVswXSA9IDE7CisgICAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKKyAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsKSB7CisgICAgICAgICAgICBsZWZ0ID0gcFNyY0RhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgICAgICAgIH0KKyAgICAgICAgICBwRGVzdERhdGFbYnl0ZSArIDFdID0gcFNyY0RhdGFbYnl0ZV0gLSBsZWZ0OworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDEyOiB7CisgICAgICAgICAgcERlc3REYXRhWzBdID0gMjsKKyAgICAgICAgICB1aW50OF90IHVwID0gMDsKKyAgICAgICAgICBpZiAocm93KSB7CisgICAgICAgICAgICB1cCA9IHBTcmNEYXRhW2J5dGUgLSByb3dfc2l6ZV07CisgICAgICAgICAgfQorICAgICAgICAgIHBEZXN0RGF0YVtieXRlICsgMV0gPSBwU3JjRGF0YVtieXRlXSAtIHVwOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDEzOiB7CisgICAgICAgICAgcERlc3REYXRhWzBdID0gMzsKKyAgICAgICAgICB1aW50OF90IGxlZnQgPSAwOworICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKKyAgICAgICAgICAgIGxlZnQgPSBwU3JjRGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07CisgICAgICAgICAgfQorICAgICAgICAgIHVpbnQ4X3QgdXAgPSAwOworICAgICAgICAgIGlmIChyb3cpIHsKKyAgICAgICAgICAgIHVwID0gcFNyY0RhdGFbYnl0ZSAtIHJvd19zaXplXTsKKyAgICAgICAgICB9CisgICAgICAgICAgcERlc3REYXRhW2J5dGUgKyAxXSA9IHBTcmNEYXRhW2J5dGVdIC0gKGxlZnQgKyB1cCkgLyAyOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDE0OiB7CisgICAgICAgICAgcERlc3REYXRhWzBdID0gNDsKKyAgICAgICAgICB1aW50OF90IGxlZnQgPSAwOworICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKKyAgICAgICAgICAgIGxlZnQgPSBwU3JjRGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07CisgICAgICAgICAgfQorICAgICAgICAgIHVpbnQ4X3QgdXAgPSAwOworICAgICAgICAgIGlmIChyb3cpIHsKKyAgICAgICAgICAgIHVwID0gcFNyY0RhdGFbYnl0ZSAtIHJvd19zaXplXTsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCB1cHBlcl9sZWZ0ID0gMDsKKyAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsICYmIHJvdykgeworICAgICAgICAgICAgdXBwZXJfbGVmdCA9IHBTcmNEYXRhW2J5dGUgLSByb3dfc2l6ZSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgICAgICAgIH0KKyAgICAgICAgICBwRGVzdERhdGFbYnl0ZSArIDFdID0KKyAgICAgICAgICAgICAgcFNyY0RhdGFbYnl0ZV0gLSBQYWV0aFByZWRpY3RvcihsZWZ0LCB1cCwgdXBwZXJfbGVmdCk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsgcERlc3REYXRhW2J5dGUgKyAxXSA9IHBTcmNEYXRhW2J5dGVdOyB9IGJyZWFrOworICAgICAgfQorICAgICAgYnl0ZV9jbnQrKzsKKyAgICB9CisgICAgcERlc3REYXRhICs9IChyb3dfc2l6ZSArIDEpOworICAgIHBTcmNEYXRhICs9IHJvd19zaXplOworICB9CisgIEZYX0ZyZWUoZGF0YV9idWYpOworICBkYXRhX2J1ZiA9IGRlc3RfYnVmOworICBkYXRhX3NpemUgPSAocm93X3NpemUgKyAxKSAqIHJvd19jb3VudCAtCisgICAgICAgICAgICAgIChsYXN0X3Jvd19zaXplID4gMCA/IChyb3dfc2l6ZSAtIGxhc3Rfcm93X3NpemUpIDogMCk7CisgIHJldHVybiBUUlVFOworfQorc3RhdGljIHZvaWQgUE5HX1ByZWRpY3RMaW5lKHVpbnQ4X3QqIHBEZXN0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwTGFzdExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBpeGVscykgeworICBpbnQgcm93X3NpemUgPSAoblBpeGVscyAqIGJwYyAqIG5Db2xvcnMgKyA3KSAvIDg7CisgIGludCBCeXRlc1BlclBpeGVsID0gKGJwYyAqIG5Db2xvcnMgKyA3KSAvIDg7CisgIHVpbnQ4X3QgdGFnID0gcFNyY0RhdGFbMF07CisgIGlmICh0YWcgPT0gMCkgeworICAgIEZYU1lTX21lbW1vdmUocERlc3REYXRhLCBwU3JjRGF0YSArIDEsIHJvd19zaXplKTsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgYnl0ZSA9IDA7IGJ5dGUgPCByb3dfc2l6ZTsgYnl0ZSsrKSB7CisgICAgdWludDhfdCByYXdfYnl0ZSA9IHBTcmNEYXRhW2J5dGUgKyAxXTsKKyAgICBzd2l0Y2ggKHRhZykgeworICAgICAgY2FzZSAxOiB7CisgICAgICAgIHVpbnQ4X3QgbGVmdCA9IDA7CisgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKKyAgICAgICAgICBsZWZ0ID0gcERlc3REYXRhW2J5dGUgLSBCeXRlc1BlclBpeGVsXTsKKyAgICAgICAgfQorICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIGxlZnQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAyOiB7CisgICAgICAgIHVpbnQ4X3QgdXAgPSAwOworICAgICAgICBpZiAocExhc3RMaW5lKSB7CisgICAgICAgICAgdXAgPSBwTGFzdExpbmVbYnl0ZV07CisgICAgICAgIH0KKyAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGUgKyB1cDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDM6IHsKKyAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKKyAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCkgeworICAgICAgICAgIGxlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgdXAgPSAwOworICAgICAgICBpZiAocExhc3RMaW5lKSB7CisgICAgICAgICAgdXAgPSBwTGFzdExpbmVbYnl0ZV07CisgICAgICAgIH0KKyAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGUgKyAodXAgKyBsZWZ0KSAvIDI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA0OiB7CisgICAgICAgIHVpbnQ4X3QgbGVmdCA9IDA7CisgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKKyAgICAgICAgICBsZWZ0ID0gcERlc3REYXRhW2J5dGUgLSBCeXRlc1BlclBpeGVsXTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IHVwID0gMDsKKyAgICAgICAgaWYgKHBMYXN0TGluZSkgeworICAgICAgICAgIHVwID0gcExhc3RMaW5lW2J5dGVdOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgdXBwZXJfbGVmdCA9IDA7CisgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwgJiYgcExhc3RMaW5lKSB7CisgICAgICAgICAgdXBwZXJfbGVmdCA9IHBMYXN0TGluZVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07CisgICAgICAgIH0KKyAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGUgKyBQYWV0aFByZWRpY3RvcihsZWZ0LCB1cCwgdXBwZXJfbGVmdCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGU7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorc3RhdGljIEZYX0JPT0wgUE5HX1ByZWRpY3Rvcih1aW50OF90KiYgZGF0YV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucykgeworICBjb25zdCBpbnQgQnl0ZXNQZXJQaXhlbCA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICsgNykgLyA4OworICBjb25zdCBpbnQgcm93X3NpemUgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCAqIENvbHVtbnMgKyA3KSAvIDg7CisgIGlmIChyb3dfc2l6ZSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKyAgY29uc3QgaW50IHJvd19jb3VudCA9IChkYXRhX3NpemUgKyByb3dfc2l6ZSkgLyAocm93X3NpemUgKyAxKTsKKyAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSAocm93X3NpemUgKyAxKTsKKyAgdWludDhfdCogZGVzdF9idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIHJvd19zaXplLCByb3dfY291bnQpOworICBpbnQgYnl0ZV9jbnQgPSAwOworICB1aW50OF90KiBwU3JjRGF0YSA9IGRhdGFfYnVmOworICB1aW50OF90KiBwRGVzdERhdGEgPSBkZXN0X2J1ZjsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93X2NvdW50OyByb3crKykgeworICAgIHVpbnQ4X3QgdGFnID0gcFNyY0RhdGFbMF07CisgICAgYnl0ZV9jbnQrKzsKKyAgICBpZiAodGFnID09IDApIHsKKyAgICAgIGludCBtb3ZlX3NpemUgPSByb3dfc2l6ZTsKKyAgICAgIGlmICgocm93ICsgMSkgKiAobW92ZV9zaXplICsgMSkgPiAoaW50KWRhdGFfc2l6ZSkgeworICAgICAgICBtb3ZlX3NpemUgPSBsYXN0X3Jvd19zaXplIC0gMTsKKyAgICAgIH0KKyAgICAgIEZYU1lTX21lbW1vdmUocERlc3REYXRhLCBwU3JjRGF0YSArIDEsIG1vdmVfc2l6ZSk7CisgICAgICBwU3JjRGF0YSArPSBtb3ZlX3NpemUgKyAxOworICAgICAgcERlc3REYXRhICs9IG1vdmVfc2l6ZTsKKyAgICAgIGJ5dGVfY250ICs9IG1vdmVfc2l6ZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmb3IgKGludCBieXRlID0gMDsgYnl0ZSA8IHJvd19zaXplICYmIGJ5dGVfY250IDwgKGludClkYXRhX3NpemU7IGJ5dGUrKykgeworICAgICAgdWludDhfdCByYXdfYnl0ZSA9IHBTcmNEYXRhW2J5dGUgKyAxXTsKKyAgICAgIHN3aXRjaCAodGFnKSB7CisgICAgICAgIGNhc2UgMTogeworICAgICAgICAgIHVpbnQ4X3QgbGVmdCA9IDA7CisgICAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCkgeworICAgICAgICAgICAgbGVmdCA9IHBEZXN0RGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07CisgICAgICAgICAgfQorICAgICAgICAgIHBEZXN0RGF0YVtieXRlXSA9IHJhd19ieXRlICsgbGVmdDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICB1aW50OF90IHVwID0gMDsKKyAgICAgICAgICBpZiAocm93KSB7CisgICAgICAgICAgICB1cCA9IHBEZXN0RGF0YVtieXRlIC0gcm93X3NpemVdOworICAgICAgICAgIH0KKyAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIHVwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMzogeworICAgICAgICAgIHVpbnQ4X3QgbGVmdCA9IDA7CisgICAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCkgeworICAgICAgICAgICAgbGVmdCA9IHBEZXN0RGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07CisgICAgICAgICAgfQorICAgICAgICAgIHVpbnQ4X3QgdXAgPSAwOworICAgICAgICAgIGlmIChyb3cpIHsKKyAgICAgICAgICAgIHVwID0gcERlc3REYXRhW2J5dGUgLSByb3dfc2l6ZV07CisgICAgICAgICAgfQorICAgICAgICAgIHBEZXN0RGF0YVtieXRlXSA9IHJhd19ieXRlICsgKHVwICsgbGVmdCkgLyAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgNDogeworICAgICAgICAgIHVpbnQ4X3QgbGVmdCA9IDA7CisgICAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCkgeworICAgICAgICAgICAgbGVmdCA9IHBEZXN0RGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07CisgICAgICAgICAgfQorICAgICAgICAgIHVpbnQ4X3QgdXAgPSAwOworICAgICAgICAgIGlmIChyb3cpIHsKKyAgICAgICAgICAgIHVwID0gcERlc3REYXRhW2J5dGUgLSByb3dfc2l6ZV07CisgICAgICAgICAgfQorICAgICAgICAgIHVpbnQ4X3QgdXBwZXJfbGVmdCA9IDA7CisgICAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCAmJiByb3cpIHsKKyAgICAgICAgICAgIHVwcGVyX2xlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIHJvd19zaXplIC0gQnl0ZXNQZXJQaXhlbF07CisgICAgICAgICAgfQorICAgICAgICAgIHBEZXN0RGF0YVtieXRlXSA9IHJhd19ieXRlICsgUGFldGhQcmVkaWN0b3IobGVmdCwgdXAsIHVwcGVyX2xlZnQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGU7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBieXRlX2NudCsrOworICAgIH0KKyAgICBwU3JjRGF0YSArPSByb3dfc2l6ZSArIDE7CisgICAgcERlc3REYXRhICs9IHJvd19zaXplOworICB9CisgIEZYX0ZyZWUoZGF0YV9idWYpOworICBkYXRhX2J1ZiA9IGRlc3RfYnVmOworICBkYXRhX3NpemUgPSByb3dfc2l6ZSAqIHJvd19jb3VudCAtCisgICAgICAgICAgICAgIChsYXN0X3Jvd19zaXplID4gMCA/IChyb3dfc2l6ZSArIDEgLSBsYXN0X3Jvd19zaXplKSA6IDApOworICByZXR1cm4gVFJVRTsKK30KK3N0YXRpYyB2b2lkIFRJRkZfUHJlZGljdG9yRW5jb2RlTGluZSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucykgeworICBpbnQgQnl0ZXNQZXJQaXhlbCA9IEJpdHNQZXJDb21wb25lbnQgKiBDb2xvcnMgLyA4OworICBpZiAoQml0c1BlckNvbXBvbmVudCA8IDgpIHsKKyAgICB1aW50OF90IG1hc2sgPSAweDAxOworICAgIGlmIChCaXRzUGVyQ29tcG9uZW50ID09IDIpIHsKKyAgICAgIG1hc2sgPSAweDAzOworICAgIH0gZWxzZSBpZiAoQml0c1BlckNvbXBvbmVudCA9PSA0KSB7CisgICAgICBtYXNrID0gMHgwRjsKKyAgICB9CisgICAgaW50IHJvd19iaXRzID0gQ29sb3JzICogQml0c1BlckNvbXBvbmVudCAqIENvbHVtbnM7CisgICAgZm9yIChpbnQgaSA9IHJvd19iaXRzIC0gQml0c1BlckNvbXBvbmVudDsgaSA+PSBCaXRzUGVyQ29tcG9uZW50OworICAgICAgICAgaSAtPSBCaXRzUGVyQ29tcG9uZW50KSB7CisgICAgICBpbnQgY29sID0gaSAlIDg7CisgICAgICBpbnQgaW5kZXggPSBpIC8gODsKKyAgICAgIGludCBjb2xfcHJlID0KKyAgICAgICAgICAoY29sID09IDApID8gKDggLSBCaXRzUGVyQ29tcG9uZW50KSA6IChjb2wgLSBCaXRzUGVyQ29tcG9uZW50KTsKKyAgICAgIGludCBpbmRleF9wcmUgPSAoY29sID09IDApID8gKGluZGV4IC0gMSkgOiBpbmRleDsKKyAgICAgIHVpbnQ4X3QgY3VyID0gKGRlc3RfYnVmW2luZGV4XSA+PiAoOCAtIGNvbCAtIEJpdHNQZXJDb21wb25lbnQpKSAmIG1hc2s7CisgICAgICB1aW50OF90IGxlZnQgPQorICAgICAgICAgIChkZXN0X2J1ZltpbmRleF9wcmVdID4+ICg4IC0gY29sX3ByZSAtIEJpdHNQZXJDb21wb25lbnQpKSAmIG1hc2s7CisgICAgICBjdXIgLT0gbGVmdDsKKyAgICAgIGN1ciAmPSBtYXNrOworICAgICAgY3VyIDw8PSAoOCAtIGNvbCAtIEJpdHNQZXJDb21wb25lbnQpOworICAgICAgZGVzdF9idWZbaW5kZXhdICY9IH4obWFzayA8PCAoKDggLSBjb2wgLSBCaXRzUGVyQ29tcG9uZW50KSkpOworICAgICAgZGVzdF9idWZbaW5kZXhdIHw9IGN1cjsKKyAgICB9CisgIH0gZWxzZSBpZiAoQml0c1BlckNvbXBvbmVudCA9PSA4KSB7CisgICAgZm9yIChpbnQgaSA9IHJvd19zaXplIC0gMTsgaSA+PSBCeXRlc1BlclBpeGVsOyBpLS0pIHsKKyAgICAgIGRlc3RfYnVmW2ldIC09IGRlc3RfYnVmW2kgLSBCeXRlc1BlclBpeGVsXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IHJvd19zaXplIC0gQnl0ZXNQZXJQaXhlbDsgaSA+PSBCeXRlc1BlclBpeGVsOworICAgICAgICAgaSAtPSBCeXRlc1BlclBpeGVsKSB7CisgICAgICBGWF9XT1JEIHBpeGVsID0gKGRlc3RfYnVmW2ldIDw8IDgpIHwgZGVzdF9idWZbaSArIDFdOworICAgICAgcGl4ZWwgLT0KKyAgICAgICAgICAoZGVzdF9idWZbaSAtIEJ5dGVzUGVyUGl4ZWxdIDw8IDgpIHwgZGVzdF9idWZbaSAtIEJ5dGVzUGVyUGl4ZWwgKyAxXTsKKyAgICAgIGRlc3RfYnVmW2ldID0gcGl4ZWwgPj4gODsKKyAgICAgIGRlc3RfYnVmW2kgKyAxXSA9ICh1aW50OF90KXBpeGVsOworICAgIH0KKyAgfQorfQorc3RhdGljIEZYX0JPT0wgVElGRl9QcmVkaWN0b3JFbmNvZGUodWludDhfdComIGRhdGFfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zKSB7CisgIGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKKyAgaWYgKHJvd19zaXplID09IDApCisgICAgcmV0dXJuIEZBTFNFOworICBjb25zdCBpbnQgcm93X2NvdW50ID0gKGRhdGFfc2l6ZSArIHJvd19zaXplIC0gMSkgLyByb3dfc2l6ZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93X2NvdW50OyByb3crKykgeworICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IGRhdGFfYnVmICsgcm93ICogcm93X3NpemU7CisgICAgaWYgKChyb3cgKyAxKSAqIHJvd19zaXplID4gKGludClkYXRhX3NpemUpIHsKKyAgICAgIHJvd19zaXplID0gbGFzdF9yb3dfc2l6ZTsKKyAgICB9CisgICAgVElGRl9QcmVkaWN0b3JFbmNvZGVMaW5lKHNjYW5fbGluZSwgcm93X3NpemUsIEJpdHNQZXJDb21wb25lbnQsIENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitzdGF0aWMgdm9pZCBUSUZGX1ByZWRpY3RMaW5lKHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucykgeworICBpZiAoQml0c1BlckNvbXBvbmVudCA9PSAxKSB7CisgICAgaW50IHJvd19iaXRzID0gRlhfTUlOKEJpdHNQZXJDb21wb25lbnQgKiBDb2xvcnMgKiBDb2x1bW5zLCByb3dfc2l6ZSAqIDgpOworICAgIGludCBpbmRleF9wcmUgPSAwOworICAgIGludCBjb2xfcHJlID0gMDsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IHJvd19iaXRzOyBpKyspIHsKKyAgICAgIGludCBjb2wgPSBpICUgODsKKyAgICAgIGludCBpbmRleCA9IGkgLyA4OworICAgICAgaWYgKCgoZGVzdF9idWZbaW5kZXhdID4+ICg3IC0gY29sKSkgJiAxKSBeCisgICAgICAgICAgKChkZXN0X2J1ZltpbmRleF9wcmVdID4+ICg3IC0gY29sX3ByZSkpICYgMSkpIHsKKyAgICAgICAgZGVzdF9idWZbaW5kZXhdIHw9IDEgPDwgKDcgLSBjb2wpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzdF9idWZbaW5kZXhdICY9IH4oMSA8PCAoNyAtIGNvbCkpOworICAgICAgfQorICAgICAgaW5kZXhfcHJlID0gaW5kZXg7CisgICAgICBjb2xfcHJlID0gY29sOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaW50IEJ5dGVzUGVyUGl4ZWwgPSBCaXRzUGVyQ29tcG9uZW50ICogQ29sb3JzIC8gODsKKyAgaWYgKEJpdHNQZXJDb21wb25lbnQgPT0gMTYpIHsKKyAgICBmb3IgKGludCBpID0gQnl0ZXNQZXJQaXhlbDsgaSA8IHJvd19zaXplOyBpICs9IDIpIHsKKyAgICAgIEZYX1dPUkQgcGl4ZWwgPQorICAgICAgICAgIChkZXN0X2J1ZltpIC0gQnl0ZXNQZXJQaXhlbF0gPDwgOCkgfCBkZXN0X2J1ZltpIC0gQnl0ZXNQZXJQaXhlbCArIDFdOworICAgICAgcGl4ZWwgKz0gKGRlc3RfYnVmW2ldIDw8IDgpIHwgZGVzdF9idWZbaSArIDFdOworICAgICAgZGVzdF9idWZbaV0gPSBwaXhlbCA+PiA4OworICAgICAgZGVzdF9idWZbaSArIDFdID0gKHVpbnQ4X3QpcGl4ZWw7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSBCeXRlc1BlclBpeGVsOyBpIDwgcm93X3NpemU7IGkrKykgeworICAgICAgZGVzdF9idWZbaV0gKz0gZGVzdF9idWZbaSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgIH0KKyAgfQorfQorc3RhdGljIEZYX0JPT0wgVElGRl9QcmVkaWN0b3IodWludDhfdComIGRhdGFfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zKSB7CisgIGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKKyAgaWYgKHJvd19zaXplID09IDApCisgICAgcmV0dXJuIEZBTFNFOworICBjb25zdCBpbnQgcm93X2NvdW50ID0gKGRhdGFfc2l6ZSArIHJvd19zaXplIC0gMSkgLyByb3dfc2l6ZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93X2NvdW50OyByb3crKykgeworICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IGRhdGFfYnVmICsgcm93ICogcm93X3NpemU7CisgICAgaWYgKChyb3cgKyAxKSAqIHJvd19zaXplID4gKGludClkYXRhX3NpemUpIHsKKyAgICAgIHJvd19zaXplID0gbGFzdF9yb3dfc2l6ZTsKKyAgICB9CisgICAgVElGRl9QcmVkaWN0TGluZShzY2FuX2xpbmUsIHJvd19zaXplLCBCaXRzUGVyQ29tcG9uZW50LCBDb2xvcnMsIENvbHVtbnMpOworICB9CisgIHJldHVybiBUUlVFOworfQorY2xhc3MgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyIDogcHVibGljIENDb2RlY19TY2FubGluZURlY29kZXIgeworIHB1YmxpYzoKKyAgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyKCk7CisgIH5DQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXIoKTsKKyAgdm9pZCBDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgaW50IG5Db21wcywKKyAgICAgICAgICAgICAgaW50IGJwYywKKyAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgIGludCBDb2x1bW5zKTsKKyAgdmlydHVhbCB2b2lkIERlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzOyB9CisgIHZpcnR1YWwgdm9pZCB2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgdl9SZXdpbmQoKTsKKyAgdmlydHVhbCB1aW50OF90KiB2X0dldE5leHRMaW5lKCk7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0U3JjT2Zmc2V0KCk7CisgIHZvaWQqIG1fcEZsYXRlOworICBjb25zdCB1aW50OF90KiBtX1NyY0J1ZjsKKyAgRlhfRFdPUkQgbV9TcmNTaXplOworICB1aW50OF90KiBtX3BTY2FubGluZTsKKyAgdWludDhfdCogbV9wTGFzdExpbmU7CisgIHVpbnQ4X3QqIG1fcFByZWRpY3RCdWZmZXI7CisgIHVpbnQ4X3QqIG1fcFByZWRpY3RSYXc7CisgIGludCBtX1ByZWRpY3RvcjsKKyAgaW50IG1fQ29sb3JzLCBtX0JpdHNQZXJDb21wb25lbnQsIG1fQ29sdW1ucywgbV9QcmVkaWN0UGl0Y2gsIG1fTGVmdE92ZXI7Cit9OworQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjpDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXIoKSB7CisgIG1fcEZsYXRlID0gTlVMTDsKKyAgbV9wU2NhbmxpbmUgPSBOVUxMOworICBtX3BMYXN0TGluZSA9IE5VTEw7CisgIG1fcFByZWRpY3RCdWZmZXIgPSBOVUxMOworICBtX3BQcmVkaWN0UmF3ID0gTlVMTDsKKyAgbV9MZWZ0T3ZlciA9IDA7Cit9CitDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6On5DQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXIoKSB7CisgIGlmIChtX3BTY2FubGluZSkgeworICAgIEZYX0ZyZWUobV9wU2NhbmxpbmUpOworICB9CisgIGlmIChtX3BMYXN0TGluZSkgeworICAgIEZYX0ZyZWUobV9wTGFzdExpbmUpOworICB9CisgIGlmIChtX3BQcmVkaWN0QnVmZmVyKSB7CisgICAgRlhfRnJlZShtX3BQcmVkaWN0QnVmZmVyKTsKKyAgfQorICBpZiAobV9wUHJlZGljdFJhdykgeworICAgIEZYX0ZyZWUobV9wUHJlZGljdFJhdyk7CisgIH0KKyAgaWYgKG1fcEZsYXRlKSB7CisgICAgRlBERkFQSV9GbGF0ZUVuZChtX3BGbGF0ZSk7CisgIH0KK30KK3ZvaWQgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zKSB7CisgIG1fU3JjQnVmID0gc3JjX2J1ZjsKKyAgbV9TcmNTaXplID0gc3JjX3NpemU7CisgIG1fT3V0cHV0V2lkdGggPSBtX09yaWdXaWR0aCA9IHdpZHRoOworICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodCA9IGhlaWdodDsKKyAgbV9uQ29tcHMgPSBuQ29tcHM7CisgIG1fYnBjID0gYnBjOworICBtX2JDb2xvclRyYW5zZm9ybWVkID0gRkFMU0U7CisgIG1fUGl0Y2ggPSAod2lkdGggKiBuQ29tcHMgKiBicGMgKyA3KSAvIDg7CisgIG1fcFNjYW5saW5lID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7CisgIG1fUHJlZGljdG9yID0gMDsKKyAgaWYgKHByZWRpY3RvcikgeworICAgIGlmIChwcmVkaWN0b3IgPj0gMTApIHsKKyAgICAgIG1fUHJlZGljdG9yID0gMjsKKyAgICB9IGVsc2UgaWYgKHByZWRpY3RvciA9PSAyKSB7CisgICAgICBtX1ByZWRpY3RvciA9IDE7CisgICAgfQorICAgIGlmIChtX1ByZWRpY3RvcikgeworICAgICAgaWYgKEJpdHNQZXJDb21wb25lbnQgKiBDb2xvcnMgKiBDb2x1bW5zID09IDApIHsKKyAgICAgICAgQml0c1BlckNvbXBvbmVudCA9IG1fYnBjOworICAgICAgICBDb2xvcnMgPSBtX25Db21wczsKKyAgICAgICAgQ29sdW1ucyA9IG1fT3JpZ1dpZHRoOworICAgICAgfQorICAgICAgbV9Db2xvcnMgPSBDb2xvcnM7CisgICAgICBtX0JpdHNQZXJDb21wb25lbnQgPSBCaXRzUGVyQ29tcG9uZW50OworICAgICAgbV9Db2x1bW5zID0gQ29sdW1uczsKKyAgICAgIG1fUHJlZGljdFBpdGNoID0gKG1fQml0c1BlckNvbXBvbmVudCAqIG1fQ29sb3JzICogbV9Db2x1bW5zICsgNykgLyA4OworICAgICAgbV9wTGFzdExpbmUgPSBGWF9BbGxvYyh1aW50OF90LCBtX1ByZWRpY3RQaXRjaCk7CisgICAgICBtX3BQcmVkaWN0UmF3ID0gRlhfQWxsb2ModWludDhfdCwgbV9QcmVkaWN0UGl0Y2ggKyAxKTsKKyAgICAgIG1fcFByZWRpY3RCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBtX1ByZWRpY3RQaXRjaCk7CisgICAgfQorICB9Cit9CitGWF9CT09MIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2Rlcjo6dl9SZXdpbmQoKSB7CisgIGlmIChtX3BGbGF0ZSkgeworICAgIEZQREZBUElfRmxhdGVFbmQobV9wRmxhdGUpOworICB9CisgIG1fcEZsYXRlID0gRlBERkFQSV9GbGF0ZUluaXQobXlfYWxsb2NfZnVuYywgbXlfZnJlZV9mdW5jKTsKKyAgaWYgKG1fcEZsYXRlID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlBERkFQSV9GbGF0ZUlucHV0KG1fcEZsYXRlLCBtX1NyY0J1ZiwgbV9TcmNTaXplKTsKKyAgbV9MZWZ0T3ZlciA9IDA7CisgIHJldHVybiBUUlVFOworfQordWludDhfdCogQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjp2X0dldE5leHRMaW5lKCkgeworICBpZiAobV9QcmVkaWN0b3IpIHsKKyAgICBpZiAobV9QaXRjaCA9PSBtX1ByZWRpY3RQaXRjaCkgeworICAgICAgaWYgKG1fUHJlZGljdG9yID09IDIpIHsKKyAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wUHJlZGljdFJhdywgbV9QcmVkaWN0UGl0Y2ggKyAxKTsKKyAgICAgICAgUE5HX1ByZWRpY3RMaW5lKG1fcFNjYW5saW5lLCBtX3BQcmVkaWN0UmF3LCBtX3BMYXN0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQml0c1BlckNvbXBvbmVudCwgbV9Db2xvcnMsIG1fQ29sdW1ucyk7CisgICAgICAgIEZYU1lTX21lbWNweShtX3BMYXN0TGluZSwgbV9wU2NhbmxpbmUsIG1fUHJlZGljdFBpdGNoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZQREZBUElfRmxhdGVPdXRwdXQobV9wRmxhdGUsIG1fcFNjYW5saW5lLCBtX1BpdGNoKTsKKyAgICAgICAgVElGRl9QcmVkaWN0TGluZShtX3BTY2FubGluZSwgbV9QcmVkaWN0UGl0Y2gsIG1fYnBjLCBtX25Db21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX091dHB1dFdpZHRoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW50IGJ5dGVzX3RvX2dvID0gbV9QaXRjaDsKKyAgICAgIGludCByZWFkX2xlZnRvdmVyID0gbV9MZWZ0T3ZlciA+IGJ5dGVzX3RvX2dvID8gYnl0ZXNfdG9fZ28gOiBtX0xlZnRPdmVyOworICAgICAgaWYgKHJlYWRfbGVmdG92ZXIpIHsKKyAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFNjYW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgbV9wUHJlZGljdEJ1ZmZlciArIG1fUHJlZGljdFBpdGNoIC0gbV9MZWZ0T3ZlciwKKyAgICAgICAgICAgICAgICAgICAgIHJlYWRfbGVmdG92ZXIpOworICAgICAgICBtX0xlZnRPdmVyIC09IHJlYWRfbGVmdG92ZXI7CisgICAgICAgIGJ5dGVzX3RvX2dvIC09IHJlYWRfbGVmdG92ZXI7CisgICAgICB9CisgICAgICB3aGlsZSAoYnl0ZXNfdG9fZ28pIHsKKyAgICAgICAgaWYgKG1fUHJlZGljdG9yID09IDIpIHsKKyAgICAgICAgICBGUERGQVBJX0ZsYXRlT3V0cHV0KG1fcEZsYXRlLCBtX3BQcmVkaWN0UmF3LCBtX1ByZWRpY3RQaXRjaCArIDEpOworICAgICAgICAgIFBOR19QcmVkaWN0TGluZShtX3BQcmVkaWN0QnVmZmVyLCBtX3BQcmVkaWN0UmF3LCBtX3BMYXN0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CaXRzUGVyQ29tcG9uZW50LCBtX0NvbG9ycywgbV9Db2x1bW5zKTsKKyAgICAgICAgICBGWFNZU19tZW1jcHkobV9wTGFzdExpbmUsIG1fcFByZWRpY3RCdWZmZXIsIG1fUHJlZGljdFBpdGNoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGUERGQVBJX0ZsYXRlT3V0cHV0KG1fcEZsYXRlLCBtX3BQcmVkaWN0QnVmZmVyLCBtX1ByZWRpY3RQaXRjaCk7CisgICAgICAgICAgVElGRl9QcmVkaWN0TGluZShtX3BQcmVkaWN0QnVmZmVyLCBtX1ByZWRpY3RQaXRjaCwgbV9CaXRzUGVyQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Db2xvcnMsIG1fQ29sdW1ucyk7CisgICAgICAgIH0KKyAgICAgICAgaW50IHJlYWRfYnl0ZXMgPQorICAgICAgICAgICAgbV9QcmVkaWN0UGl0Y2ggPiBieXRlc190b19nbyA/IGJ5dGVzX3RvX2dvIDogbV9QcmVkaWN0UGl0Y2g7CisgICAgICAgIEZYU1lTX21lbWNweShtX3BTY2FubGluZSArIG1fUGl0Y2ggLSBieXRlc190b19nbywgbV9wUHJlZGljdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnl0ZXMpOworICAgICAgICBtX0xlZnRPdmVyICs9IG1fUHJlZGljdFBpdGNoIC0gcmVhZF9ieXRlczsKKyAgICAgICAgYnl0ZXNfdG9fZ28gLT0gcmVhZF9ieXRlczsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wU2NhbmxpbmUsIG1fUGl0Y2gpOworICB9CisgIHJldHVybiBtX3BTY2FubGluZTsKK30KK0ZYX0RXT1JEIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2Rlcjo6R2V0U3JjT2Zmc2V0KCkgeworICByZXR1cm4gRlBERkFQSV9GbGF0ZUdldFRvdGFsSW4obV9wRmxhdGUpOworfQorc3RhdGljIHZvaWQgRmxhdGVVbmNvbXByZXNzKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb3JpZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBvZmZzZXQpIHsKKyAgY29uc3QgRlhfQk9PTCB1c2VPbGRJbXBsID0gc3JjX3NpemUgPCAxMDI0MDsKKyAgRlhfRFdPUkQgZ3Vlc3Nfc2l6ZSA9IG9yaWdfc2l6ZSA/IG9yaWdfc2l6ZSA6IHNyY19zaXplICogMjsKKyAgRlhfRFdPUkQgYWxsb2Nfc3RlcCA9CisgICAgICBvcmlnX3NpemUgPyAxMDI0MCA6IChzcmNfc2l6ZSA8IDEwMjQwID8gMTAyNDAgOiBzcmNfc2l6ZSk7CisgIHN0YXRpYyBjb25zdCBGWF9EV09SRCBrTWF4SW5pdGlhbEFsbG9jU2l6ZSA9IDEwMDAwMDAwOworICBpZiAoZ3Vlc3Nfc2l6ZSA+IGtNYXhJbml0aWFsQWxsb2NTaXplKSB7CisgICAgZ3Vlc3Nfc2l6ZSA9IGtNYXhJbml0aWFsQWxsb2NTaXplOworICAgIGFsbG9jX3N0ZXAgPSBrTWF4SW5pdGlhbEFsbG9jU2l6ZTsKKyAgfQorICBGWF9EV09SRCBidWZfc2l6ZSA9IGd1ZXNzX3NpemU7CisgIEZYX0RXT1JEIGxhc3RfYnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgdm9pZCogY29udGV4dCA9IG51bGxwdHI7CisKKyAgdWludDhfdCogZ3Vlc3NfYnVmID0gRlhfQWxsb2ModWludDhfdCwgZ3Vlc3Nfc2l6ZSArIDEpOworICB1aW50OF90KiBjdXJfYnVmID0gZ3Vlc3NfYnVmOworICBndWVzc19idWZbZ3Vlc3Nfc2l6ZV0gPSAnXDAnOworICBjb250ZXh0ID0gRlBERkFQSV9GbGF0ZUluaXQobXlfYWxsb2NfZnVuYywgbXlfZnJlZV9mdW5jKTsKKyAgaWYgKCFjb250ZXh0KQorICAgIGdvdG8gZmFpbDsKKyAgRlBERkFQSV9GbGF0ZUlucHV0KGNvbnRleHQsIHNyY19idWYsIHNyY19zaXplKTsKKyAgaWYgKHVzZU9sZEltcGwpIHsKKyAgICB3aGlsZSAoMSkgeworICAgICAgaW50MzJfdCByZXQgPSBGUERGQVBJX0ZsYXRlT3V0cHV0KGNvbnRleHQsIGN1cl9idWYsIGJ1Zl9zaXplKTsKKyAgICAgIGlmIChyZXQgIT0gWl9PSykKKyAgICAgICAgYnJlYWs7CisgICAgICBpbnQzMl90IGF2YWlsX2J1Zl9zaXplID0gRlBERkFQSV9GbGF0ZUdldEF2YWlsT3V0KGNvbnRleHQpOworICAgICAgaWYgKGF2YWlsX2J1Zl9zaXplICE9IDApCisgICAgICAgIGJyZWFrOworCisgICAgICAvLyB8YXZhaWxfYnVmX3NpemV8ID09IDAgY2FzZS4KKyAgICAgIEZYX0RXT1JEIG9sZF9zaXplID0gZ3Vlc3Nfc2l6ZTsKKyAgICAgIGd1ZXNzX3NpemUgKz0gYWxsb2Nfc3RlcDsKKyAgICAgIGlmIChndWVzc19zaXplIDwgb2xkX3NpemUgfHwgZ3Vlc3Nfc2l6ZSArIDEgPCBndWVzc19zaXplKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgICBndWVzc19idWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIGd1ZXNzX2J1ZiwgZ3Vlc3Nfc2l6ZSArIDEpOworICAgICAgaWYgKCFndWVzc19idWYpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIGd1ZXNzX2J1ZltndWVzc19zaXplXSA9ICdcMCc7CisgICAgICBjdXJfYnVmID0gZ3Vlc3NfYnVmICsgb2xkX3NpemU7CisgICAgICBidWZfc2l6ZSA9IGd1ZXNzX3NpemUgLSBvbGRfc2l6ZTsKKyAgICB9CisgICAgZGVzdF9zaXplID0gRlBERkFQSV9GbGF0ZUdldFRvdGFsT3V0KGNvbnRleHQpOworICAgIG9mZnNldCA9IEZQREZBUElfRmxhdGVHZXRUb3RhbEluKGNvbnRleHQpOworICAgIGlmIChndWVzc19zaXplIC8gMiA+IGRlc3Rfc2l6ZSkgeworICAgICAgZ3Vlc3NfYnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBndWVzc19idWYsIGRlc3Rfc2l6ZSArIDEpOworICAgICAgaWYgKCFndWVzc19idWYpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIGd1ZXNzX3NpemUgPSBkZXN0X3NpemU7CisgICAgICBndWVzc19idWZbZ3Vlc3Nfc2l6ZV0gPSAnXDAnOworICAgIH0KKyAgICBkZXN0X2J1ZiA9IGd1ZXNzX2J1ZjsKKyAgfSBlbHNlIHsKKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90Kj4gcmVzdWx0X3RtcF9idWZzOworICAgIHdoaWxlICgxKSB7CisgICAgICBpbnQzMl90IHJldCA9IEZQREZBUElfRmxhdGVPdXRwdXQoY29udGV4dCwgY3VyX2J1ZiwgYnVmX3NpemUpOworICAgICAgaW50MzJfdCBhdmFpbF9idWZfc2l6ZSA9IEZQREZBUElfRmxhdGVHZXRBdmFpbE91dChjb250ZXh0KTsKKyAgICAgIGlmIChyZXQgIT0gWl9PSykgeworICAgICAgICBsYXN0X2J1Zl9zaXplID0gYnVmX3NpemUgLSBhdmFpbF9idWZfc2l6ZTsKKyAgICAgICAgcmVzdWx0X3RtcF9idWZzLkFkZChjdXJfYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoYXZhaWxfYnVmX3NpemUgIT0gMCkgeworICAgICAgICBsYXN0X2J1Zl9zaXplID0gYnVmX3NpemUgLSBhdmFpbF9idWZfc2l6ZTsKKyAgICAgICAgcmVzdWx0X3RtcF9idWZzLkFkZChjdXJfYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHxhdmFpbF9idWZfc2l6ZXwgPT0gMCBjYXNlLgorICAgICAgcmVzdWx0X3RtcF9idWZzLkFkZChjdXJfYnVmKTsKKyAgICAgIGN1cl9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBidWZfc2l6ZSArIDEpOworICAgICAgY3VyX2J1ZltidWZfc2l6ZV0gPSAnXDAnOworICAgIH0KKyAgICBkZXN0X3NpemUgPSBGUERGQVBJX0ZsYXRlR2V0VG90YWxPdXQoY29udGV4dCk7CisgICAgb2Zmc2V0ID0gRlBERkFQSV9GbGF0ZUdldFRvdGFsSW4oY29udGV4dCk7CisgICAgaWYgKHJlc3VsdF90bXBfYnVmcy5HZXRTaXplKCkgPT0gMSkgeworICAgICAgZGVzdF9idWYgPSByZXN1bHRfdG1wX2J1ZnNbMF07CisgICAgfSBlbHNlIHsKKyAgICAgIHVpbnQ4X3QqIHJlc3VsdF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBkZXN0X3NpemUpOworICAgICAgRlhfRFdPUkQgcmVzdWx0X3BvcyA9IDA7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCByZXN1bHRfdG1wX2J1ZnMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdWludDhfdCogdG1wX2J1ZiA9IHJlc3VsdF90bXBfYnVmc1tpXTsKKyAgICAgICAgRlhfRFdPUkQgdG1wX2J1Zl9zaXplID0gYnVmX3NpemU7CisgICAgICAgIGlmIChpID09IHJlc3VsdF90bXBfYnVmcy5HZXRTaXplKCkgLSAxKSB7CisgICAgICAgICAgdG1wX2J1Zl9zaXplID0gbGFzdF9idWZfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBGWFNZU19tZW1jcHkocmVzdWx0X2J1ZiArIHJlc3VsdF9wb3MsIHRtcF9idWYsIHRtcF9idWZfc2l6ZSk7CisgICAgICAgIHJlc3VsdF9wb3MgKz0gdG1wX2J1Zl9zaXplOworICAgICAgICBGWF9GcmVlKHJlc3VsdF90bXBfYnVmc1tpXSk7CisgICAgICB9CisgICAgICBkZXN0X2J1ZiA9IHJlc3VsdF9idWY7CisgICAgfQorICB9CisgIEZQREZBUElfRmxhdGVFbmQoY29udGV4dCk7CisgIHJldHVybjsKIAogZmFpbDoKLSAgICBGWF9GcmVlKGd1ZXNzX2J1Zik7Ci0gICAgZGVzdF9idWYgPSBudWxscHRyOwotICAgIGRlc3Rfc2l6ZSA9IDA7Ci0gICAgcmV0dXJuOworICBGWF9GcmVlKGd1ZXNzX2J1Zik7CisgIGRlc3RfYnVmID0gbnVsbHB0cjsKKyAgZGVzdF9zaXplID0gMDsKKyAgcmV0dXJuOwogfQotSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ0NvZGVjX0ZsYXRlTW9kdWxlOjpDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgIGludCBuQ29tcHMsIGludCBicGMsIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucykKLXsKLSAgICBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXIqIHBEZWNvZGVyID0gbmV3IENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2RlcjsKLSAgICBwRGVjb2Rlci0+Q3JlYXRlKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LCBuQ29tcHMsIGJwYywgcHJlZGljdG9yLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpOwotICAgIHJldHVybiBwRGVjb2RlcjsKK0lDb2RlY19TY2FubGluZURlY29kZXIqIENDb2RlY19GbGF0ZU1vZHVsZTo6Q3JlYXRlRGVjb2RlcigKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0LAorICAgIGludCBuQ29tcHMsCisgICAgaW50IGJwYywKKyAgICBpbnQgcHJlZGljdG9yLAorICAgIGludCBDb2xvcnMsCisgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgaW50IENvbHVtbnMpIHsKKyAgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyKiBwRGVjb2RlciA9IG5ldyBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI7CisgIHBEZWNvZGVyLT5DcmVhdGUoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG5Db21wcywgYnBjLCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKTsKKyAgcmV0dXJuIHBEZWNvZGVyOwogfQotRlhfRFdPUkQgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpGbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlLAotICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCi0gICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgZGVzdF9idWYgPSBOVUxMOwotICAgIEZYX0RXT1JEIG9mZnNldCA9IDA7Ci0gICAgaW50IHByZWRpY3Rvcl90eXBlID0gMDsKLSAgICBpZiAocHJlZGljdG9yKSB7Ci0gICAgICAgIGlmIChwcmVkaWN0b3IgPj0gMTApIHsKLSAgICAgICAgICAgIHByZWRpY3Rvcl90eXBlID0gMjsKLSAgICAgICAgfSBlbHNlIGlmIChwcmVkaWN0b3IgPT0gMikgewotICAgICAgICAgICAgcHJlZGljdG9yX3R5cGUgPSAxOwotICAgICAgICB9CitGWF9EV09SRCBDQ29kZWNfRmxhdGVNb2R1bGU6OkZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRWFybHlDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIGRlc3RfYnVmID0gTlVMTDsKKyAgRlhfRFdPUkQgb2Zmc2V0ID0gMDsKKyAgaW50IHByZWRpY3Rvcl90eXBlID0gMDsKKyAgaWYgKHByZWRpY3RvcikgeworICAgIGlmIChwcmVkaWN0b3IgPj0gMTApIHsKKyAgICAgIHByZWRpY3Rvcl90eXBlID0gMjsKKyAgICB9IGVsc2UgaWYgKHByZWRpY3RvciA9PSAyKSB7CisgICAgICBwcmVkaWN0b3JfdHlwZSA9IDE7CiAgICAgfQotICAgIGlmIChiTFpXKSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxDTFpXRGVjb2Rlcj4gZGVjb2RlcihuZXcgQ0xaV0RlY29kZXIpOwotICAgICAgICAgICAgZGVzdF9zaXplID0gKEZYX0RXT1JEKSAtIDE7Ci0gICAgICAgICAgICBvZmZzZXQgPSBzcmNfc2l6ZTsKLSAgICAgICAgICAgIGludCBlcnIgPSBkZWNvZGVyLT5EZWNvZGUoTlVMTCwgZGVzdF9zaXplLCBzcmNfYnVmLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFYXJseUNoYW5nZSk7Ci0gICAgICAgICAgICBpZiAoZXJyIHx8IGRlc3Rfc2l6ZSA9PSAwIHx8IGRlc3Rfc2l6ZSArIDEgPCBkZXN0X3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgbm9uc3RkOjp1bmlxdWVfcHRyPENMWldEZWNvZGVyPiBkZWNvZGVyKG5ldyBDTFpXRGVjb2Rlcik7Ci0gICAgICAgICAgICBkZXN0X2J1ZiA9IEZYX0FsbG9jKCB1aW50OF90LCBkZXN0X3NpemUgKyAxKTsKLSAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3Rfc2l6ZV0gPSAnXDAnOwotICAgICAgICAgICAgZGVjb2Rlci0+RGVjb2RlKGRlc3RfYnVmLCBkZXN0X3NpemUsIHNyY19idWYsIG9mZnNldCwgYkVhcmx5Q2hhbmdlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZsYXRlVW5jb21wcmVzcyhzcmNfYnVmLCBzcmNfc2l6ZSwgZXN0aW1hdGVkX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUsIG9mZnNldCk7CisgIH0KKyAgaWYgKGJMWlcpIHsKKyAgICB7CisgICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Q0xaV0RlY29kZXI+IGRlY29kZXIobmV3IENMWldEZWNvZGVyKTsKKyAgICAgIGRlc3Rfc2l6ZSA9IChGWF9EV09SRCktMTsKKyAgICAgIG9mZnNldCA9IHNyY19zaXplOworICAgICAgaW50IGVyciA9IGRlY29kZXItPkRlY29kZShOVUxMLCBkZXN0X3NpemUsIHNyY19idWYsIG9mZnNldCwgYkVhcmx5Q2hhbmdlKTsKKyAgICAgIGlmIChlcnIgfHwgZGVzdF9zaXplID09IDAgfHwgZGVzdF9zaXplICsgMSA8IGRlc3Rfc2l6ZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CiAgICAgfQotICAgIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgeworICAgICAgbm9uc3RkOjp1bmlxdWVfcHRyPENMWldEZWNvZGVyPiBkZWNvZGVyKG5ldyBDTFpXRGVjb2Rlcik7CisgICAgICBkZXN0X2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGRlc3Rfc2l6ZSArIDEpOworICAgICAgZGVzdF9idWZbZGVzdF9zaXplXSA9ICdcMCc7CisgICAgICBkZWNvZGVyLT5EZWNvZGUoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgc3JjX2J1Ziwgb2Zmc2V0LCBiRWFybHlDaGFuZ2UpOwogICAgIH0KLSAgICBGWF9CT09MIHJldCA9IFRSVUU7Ci0gICAgaWYgKHByZWRpY3Rvcl90eXBlID09IDIpIHsKLSAgICAgICAgcmV0ID0gUE5HX1ByZWRpY3RvcihkZXN0X2J1ZiwgZGVzdF9zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyk7Ci0gICAgfSBlbHNlIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAxKSB7Ci0gICAgICAgIHJldCA9IFRJRkZfUHJlZGljdG9yKGRlc3RfYnVmLCBkZXN0X3NpemUsIENvbG9ycywgQml0c1BlckNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyk7Ci0gICAgfQotICAgIHJldHVybiByZXQgPyBvZmZzZXQgOiAtMTsKKyAgfSBlbHNlIHsKKyAgICBGbGF0ZVVuY29tcHJlc3Moc3JjX2J1Ziwgc3JjX3NpemUsIGVzdGltYXRlZF9zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICB9CisgIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAwKSB7CisgICAgcmV0dXJuIG9mZnNldDsKKyAgfQorICBGWF9CT09MIHJldCA9IFRSVUU7CisgIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAyKSB7CisgICAgcmV0ID0gUE5HX1ByZWRpY3RvcihkZXN0X2J1ZiwgZGVzdF9zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpOworICB9IGVsc2UgaWYgKHByZWRpY3Rvcl90eXBlID09IDEpIHsKKyAgICByZXQgPQorICAgICAgICBUSUZGX1ByZWRpY3RvcihkZXN0X2J1ZiwgZGVzdF9zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpOworICB9CisgIHJldHVybiByZXQgPyBvZmZzZXQgOiAtMTsKIH0KLUZYX0JPT0wgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIGlmIChwcmVkaWN0b3IgIT0gMiAmJiBwcmVkaWN0b3IgPCAxMCkgewotICAgICAgICByZXR1cm4gRW5jb2RlKHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICB9Ci0gICAgdWludDhfdCogcFNyY0J1ZiA9IE5VTEw7Ci0gICAgcFNyY0J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNyY19zaXplKTsKLSAgICBGWFNZU19tZW1jcHkocFNyY0J1Ziwgc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKLSAgICBpZiAocHJlZGljdG9yID09IDIpIHsKLSAgICAgICAgcmV0ID0gVElGRl9QcmVkaWN0b3JFbmNvZGUocFNyY0J1Ziwgc3JjX3NpemUsIENvbG9ycywgQml0c1BlckNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyk7Ci0gICAgfSBlbHNlIGlmIChwcmVkaWN0b3IgPj0gMTApIHsKLSAgICAgICAgcmV0ID0gUE5HX1ByZWRpY3RvckVuY29kZShwU3JjQnVmLCBzcmNfc2l6ZSwgcHJlZGljdG9yLCBDb2xvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucyk7Ci0gICAgfQotICAgIGlmIChyZXQpCi0gICAgICAgIHJldCA9IEVuY29kZShwU3JjQnVmLCBzcmNfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgRlhfRnJlZShwU3JjQnVmKTsKLSAgICByZXR1cm4gcmV0OworRlhfQk9PTCBDQ29kZWNfRmxhdGVNb2R1bGU6OkVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIHsKKyAgaWYgKHByZWRpY3RvciAhPSAyICYmIHByZWRpY3RvciA8IDEwKSB7CisgICAgcmV0dXJuIEVuY29kZShzcmNfYnVmLCBzcmNfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisgIH0KKyAgdWludDhfdCogcFNyY0J1ZiA9IE5VTEw7CisgIHBTcmNCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzcmNfc2l6ZSk7CisgIEZYU1lTX21lbWNweShwU3JjQnVmLCBzcmNfYnVmLCBzcmNfc2l6ZSk7CisgIEZYX0JPT0wgcmV0ID0gVFJVRTsKKyAgaWYgKHByZWRpY3RvciA9PSAyKSB7CisgICAgcmV0ID0gVElGRl9QcmVkaWN0b3JFbmNvZGUocFNyY0J1Ziwgc3JjX3NpemUsIENvbG9ycywgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5zKTsKKyAgfSBlbHNlIGlmIChwcmVkaWN0b3IgPj0gMTApIHsKKyAgICByZXQgPSBQTkdfUHJlZGljdG9yRW5jb2RlKHBTcmNCdWYsIHNyY19zaXplLCBwcmVkaWN0b3IsIENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpOworICB9CisgIGlmIChyZXQpCisgICAgcmV0ID0gRW5jb2RlKHBTcmNCdWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgRlhfRnJlZShwU3JjQnVmKTsKKyAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKLXsKLSAgICBkZXN0X3NpemUgPSBzcmNfc2l6ZSArIHNyY19zaXplIC8gMTAwMCArIDEyOwotICAgIGRlc3RfYnVmID0gRlhfQWxsb2MoIHVpbnQ4X3QsIGRlc3Rfc2l6ZSk7Ci0gICAgdW5zaWduZWQgbG9uZyB0ZW1wX3NpemUgPSBkZXN0X3NpemU7Ci0gICAgRlBERkFQSV9GbGF0ZUNvbXByZXNzKGRlc3RfYnVmLCAmdGVtcF9zaXplLCBzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgZGVzdF9zaXplID0gKEZYX0RXT1JEKXRlbXBfc2l6ZTsKLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICBkZXN0X3NpemUgPSBzcmNfc2l6ZSArIHNyY19zaXplIC8gMTAwMCArIDEyOworICBkZXN0X2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGRlc3Rfc2l6ZSk7CisgIHVuc2lnbmVkIGxvbmcgdGVtcF9zaXplID0gZGVzdF9zaXplOworICBGUERGQVBJX0ZsYXRlQ29tcHJlc3MoZGVzdF9idWYsICZ0ZW1wX3NpemUsIHNyY19idWYsIHNyY19zaXplKTsKKyAgZGVzdF9zaXplID0gKEZYX0RXT1JEKXRlbXBfc2l6ZTsKKyAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2dpZi5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2dpZi5jcHAKaW5kZXggNDI4MWEwZC4uYTRmZTNkNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19naWYuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZ2lmLmNwcApAQCAtOSwxNjggKzksMTgxIEBACiAjaW5jbHVkZSAiY29kZWNfaW50LmgiDQogI2luY2x1ZGUgIi4uL2xnaWYvZnhfZ2lmLmgiDQogc3RydWN0IEZYR0lGX0NvbnRleHQgew0KLSAgICBnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyOw0KLSAgICB2b2lkKgkJcGFyZW50X3B0cjsNCi0gICAgdm9pZCoJCWNoaWxkX3B0cjsNCisgIGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHI7DQorICB2b2lkKiBwYXJlbnRfcHRyOw0KKyAgdm9pZCogY2hpbGRfcHRyOw0KIA0KLSAgICB2b2lkKgkJKCptX0FsbG9jRnVuYykodW5zaWduZWQgaW50KTsNCi0gICAgdm9pZAkJKCptX0ZyZWVGdW5jKSh2b2lkKik7DQorICB2b2lkKiAoKm1fQWxsb2NGdW5jKSh1bnNpZ25lZCBpbnQpOw0KKyAgdm9pZCAoKm1fRnJlZUZ1bmMpKHZvaWQqKTsNCiB9Ow0KIGV4dGVybiAiQyIgew0KLSAgICBzdGF0aWMgdm9pZCogX2dpZl9hbGxvY19mdW5jKHVuc2lnbmVkIGludCBzaXplKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRlhfQWxsb2MoY2hhciwgc2l6ZSk7DQotICAgIH0NCi0gICAgc3RhdGljIHZvaWQgIF9naWZfZnJlZV9mdW5jKHZvaWQqIHApDQotICAgIHsNCi0gICAgICAgIGlmKHAgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIEZYX0ZyZWUocCk7DQotICAgICAgICB9DQotICAgIH0NCitzdGF0aWMgdm9pZCogX2dpZl9hbGxvY19mdW5jKHVuc2lnbmVkIGludCBzaXplKSB7DQorICByZXR1cm4gRlhfQWxsb2MoY2hhciwgc2l6ZSk7DQorfQ0KK3N0YXRpYyB2b2lkIF9naWZfZnJlZV9mdW5jKHZvaWQqIHApIHsNCisgIGlmIChwICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShwKTsNCisgIH0NCit9DQogfTsNCi1zdGF0aWMgdm9pZCBfZ2lmX2Vycm9yX2RhdGEoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgY29uc3QgRlhfQ0hBUiogZXJyX21zZykNCi17DQotICAgIEZYU1lTX3N0cm5jcHkoKGNoYXIqKWdpZl9wdHItPmVycl9wdHIsIGVycl9tc2csIEdJRl9NQVhfRVJST1JfU0laRSAtIDEpOw0KLSAgICBsb25nam1wKGdpZl9wdHItPmptcGJ1ZiwgMSk7DQorc3RhdGljIHZvaWQgX2dpZl9lcnJvcl9kYXRhKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGVycl9tc2cpIHsNCisgIEZYU1lTX3N0cm5jcHkoKGNoYXIqKWdpZl9wdHItPmVycl9wdHIsIGVycl9tc2csIEdJRl9NQVhfRVJST1JfU0laRSAtIDEpOw0KKyAgbG9uZ2ptcChnaWZfcHRyLT5qbXBidWYsIDEpOw0KIH0NCi1zdGF0aWMgdWludDhfdCogX2dpZl9hc2tfYnVmX2Zvcl9wYWwoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgaW50MzJfdCBwYWxfc2l6ZSkNCi17DQotICAgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopZ2lmX3B0ci0+Y29udGV4dF9wdHI7DQotICAgIENDb2RlY19HaWZNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0dpZk1vZHVsZSopcC0+cGFyZW50X3B0cjsNCi0gICAgcmV0dXJuIHBNb2R1bGUtPkFza0xvY2FsUGFsZXR0ZUJ1ZkNhbGxiYWNrKHAtPmNoaWxkX3B0ciwNCi0gICAgICAgICAgICBfZ2lmX2dldF9mcmFtZV9udW0oZ2lmX3B0ciksDQotICAgICAgICAgICAgcGFsX3NpemUpOw0KK3N0YXRpYyB1aW50OF90KiBfZ2lmX2Fza19idWZfZm9yX3BhbChnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhbF9zaXplKSB7DQorICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKWdpZl9wdHItPmNvbnRleHRfcHRyOw0KKyAgQ0NvZGVjX0dpZk1vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfR2lmTW9kdWxlKilwLT5wYXJlbnRfcHRyOw0KKyAgcmV0dXJuIHBNb2R1bGUtPkFza0xvY2FsUGFsZXR0ZUJ1ZkNhbGxiYWNrKA0KKyAgICAgIHAtPmNoaWxkX3B0ciwgX2dpZl9nZXRfZnJhbWVfbnVtKGdpZl9wdHIpLCBwYWxfc2l6ZSk7DQogfQ0KLXN0YXRpYyB2b2lkIF9naWZfcmVjb3JkX2N1cnJlbnRfcG9zaXRpb24oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfRFdPUkQqIGN1cl9wb3NfcHRyKQ0KLXsNCi0gICAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilnaWZfcHRyLT5jb250ZXh0X3B0cjsNCi0gICAgQ0NvZGVjX0dpZk1vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfR2lmTW9kdWxlKilwLT5wYXJlbnRfcHRyOw0KLSAgICBwTW9kdWxlLT5SZWNvcmRDdXJyZW50UG9zaXRpb25DYWxsYmFjayhwLT5jaGlsZF9wdHIsICpjdXJfcG9zX3B0cik7DQorc3RhdGljIHZvaWQgX2dpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGN1cl9wb3NfcHRyKSB7DQorICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKWdpZl9wdHItPmNvbnRleHRfcHRyOw0KKyAgQ0NvZGVjX0dpZk1vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfR2lmTW9kdWxlKilwLT5wYXJlbnRfcHRyOw0KKyAgcE1vZHVsZS0+UmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2socC0+Y2hpbGRfcHRyLCAqY3VyX3Bvc19wdHIpOw0KIH0NCi1zdGF0aWMgdm9pZCBfZ2lmX3JlYWRfc2NhbmxpbmUoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgaW50MzJfdCByb3dfbnVtLCB1aW50OF90KiByb3dfYnVmKQ0KLXsNCi0gICAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilnaWZfcHRyLT5jb250ZXh0X3B0cjsNCi0gICAgQ0NvZGVjX0dpZk1vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfR2lmTW9kdWxlKilwLT5wYXJlbnRfcHRyOw0KLSAgICBwTW9kdWxlLT5SZWFkU2NhbmxpbmVDYWxsYmFjayhwLT5jaGlsZF9wdHIsIHJvd19udW0sIHJvd19idWYpOw0KK3N0YXRpYyB2b2lkIF9naWZfcmVhZF9zY2FubGluZShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd19udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJvd19idWYpIHsNCisgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopZ2lmX3B0ci0+Y29udGV4dF9wdHI7DQorICBDQ29kZWNfR2lmTW9kdWxlKiBwTW9kdWxlID0gKENDb2RlY19HaWZNb2R1bGUqKXAtPnBhcmVudF9wdHI7DQorICBwTW9kdWxlLT5SZWFkU2NhbmxpbmVDYWxsYmFjayhwLT5jaGlsZF9wdHIsIHJvd19udW0sIHJvd19idWYpOw0KIH0NCi1zdGF0aWMgRlhfQk9PTCBfZ2lmX2dldF9yZWNvcmRfcG9zaXRpb24oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfRFdPUkQgY3VyX3BvcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGFsX251bSwgdm9pZCogcGFsX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLCBGWF9CT09MIHVzZXJfaW5wdXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhbnNfaW5kZXgsIGludDMyX3QgZGlzcG9zYWxfbWV0aG9kLCBGWF9CT09MIGludGVybGFjZSkNCi17DQotICAgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopZ2lmX3B0ci0+Y29udGV4dF9wdHI7DQotICAgIENDb2RlY19HaWZNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0dpZk1vZHVsZSopcC0+cGFyZW50X3B0cjsNCi0gICAgcmV0dXJuIHBNb2R1bGUtPklucHV0UmVjb3JkUG9zaXRpb25CdWZDYWxsYmFjayhwLT5jaGlsZF9wdHIsIGN1cl9wb3MsIEZYX1JFQ1QobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCksDQotICAgICAgICAgICAgcGFsX251bSwgcGFsX3B0ciwgZGVsYXlfdGltZSwgdXNlcl9pbnB1dCwgdHJhbnNfaW5kZXgsIGRpc3Bvc2FsX21ldGhvZCwgaW50ZXJsYWNlKTsNCitzdGF0aWMgRlhfQk9PTCBfZ2lmX2dldF9yZWNvcmRfcG9zaXRpb24oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY3VyX3BvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGFsX251bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFsX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIHVzZXJfaW5wdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhbnNfaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcG9zYWxfbWV0aG9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGludGVybGFjZSkgew0KKyAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilnaWZfcHRyLT5jb250ZXh0X3B0cjsNCisgIENDb2RlY19HaWZNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0dpZk1vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgIHJldHVybiBwTW9kdWxlLT5JbnB1dFJlY29yZFBvc2l0aW9uQnVmQ2FsbGJhY2soDQorICAgICAgcC0+Y2hpbGRfcHRyLCBjdXJfcG9zLCBGWF9SRUNUKGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoLCB0b3AgKyBoZWlnaHQpLA0KKyAgICAgIHBhbF9udW0sIHBhbF9wdHIsIGRlbGF5X3RpbWUsIHVzZXJfaW5wdXQsIHRyYW5zX2luZGV4LCBkaXNwb3NhbF9tZXRob2QsDQorICAgICAgaW50ZXJsYWNlKTsNCiB9DQotdm9pZCogQ0NvZGVjX0dpZk1vZHVsZTo6U3RhcnQodm9pZCogcE1vZHVsZSkNCi17DQotICAgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEZYR0lGX0NvbnRleHQpKTsNCi0gICAgaWYgKHAgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgRlhTWVNfbWVtc2V0KHAsIDAsIHNpemVvZihGWEdJRl9Db250ZXh0KSk7DQotICAgIHAtPm1fQWxsb2NGdW5jID0gX2dpZl9hbGxvY19mdW5jOw0KLSAgICBwLT5tX0ZyZWVGdW5jID0gX2dpZl9mcmVlX2Z1bmM7DQotICAgIHAtPmdpZl9wdHIgPSBOVUxMOw0KLSAgICBwLT5wYXJlbnRfcHRyID0gKHZvaWQqKXRoaXM7DQotICAgIHAtPmNoaWxkX3B0ciA9IHBNb2R1bGU7DQotICAgIHAtPmdpZl9wdHIgPSBfZ2lmX2NyZWF0ZV9kZWNvbXByZXNzKCk7DQotICAgIGlmIChwLT5naWZfcHRyID09IE5VTEwpIHsNCi0gICAgICAgIEZYX0ZyZWUocCk7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBwLT5naWZfcHRyLT5jb250ZXh0X3B0ciA9ICh2b2lkKilwOw0KLSAgICBwLT5naWZfcHRyLT5lcnJfcHRyID0gbV9zekxhc3RFcnJvcjsNCi0gICAgcC0+Z2lmX3B0ci0+X2dpZl9lcnJvcl9mbiA9IF9naWZfZXJyb3JfZGF0YTsNCi0gICAgcC0+Z2lmX3B0ci0+X2dpZl9hc2tfYnVmX2Zvcl9wYWxfZm4gPSBfZ2lmX2Fza19idWZfZm9yX3BhbDsNCi0gICAgcC0+Z2lmX3B0ci0+X2dpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbl9mbiA9IF9naWZfcmVjb3JkX2N1cnJlbnRfcG9zaXRpb247DQotICAgIHAtPmdpZl9wdHItPl9naWZfZ2V0X3Jvd19mbiA9IF9naWZfcmVhZF9zY2FubGluZTsNCi0gICAgcC0+Z2lmX3B0ci0+X2dpZl9nZXRfcmVjb3JkX3Bvc2l0aW9uX2ZuID0gX2dpZl9nZXRfcmVjb3JkX3Bvc2l0aW9uOw0KLSAgICByZXR1cm4gcDsNCit2b2lkKiBDQ29kZWNfR2lmTW9kdWxlOjpTdGFydCh2b2lkKiBwTW9kdWxlKSB7DQorICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihGWEdJRl9Db250ZXh0KSk7DQorICBpZiAocCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KHAsIDAsIHNpemVvZihGWEdJRl9Db250ZXh0KSk7DQorICBwLT5tX0FsbG9jRnVuYyA9IF9naWZfYWxsb2NfZnVuYzsNCisgIHAtPm1fRnJlZUZ1bmMgPSBfZ2lmX2ZyZWVfZnVuYzsNCisgIHAtPmdpZl9wdHIgPSBOVUxMOw0KKyAgcC0+cGFyZW50X3B0ciA9ICh2b2lkKil0aGlzOw0KKyAgcC0+Y2hpbGRfcHRyID0gcE1vZHVsZTsNCisgIHAtPmdpZl9wdHIgPSBfZ2lmX2NyZWF0ZV9kZWNvbXByZXNzKCk7DQorICBpZiAocC0+Z2lmX3B0ciA9PSBOVUxMKSB7DQorICAgIEZYX0ZyZWUocCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcC0+Z2lmX3B0ci0+Y29udGV4dF9wdHIgPSAodm9pZCopcDsNCisgIHAtPmdpZl9wdHItPmVycl9wdHIgPSBtX3N6TGFzdEVycm9yOw0KKyAgcC0+Z2lmX3B0ci0+X2dpZl9lcnJvcl9mbiA9IF9naWZfZXJyb3JfZGF0YTsNCisgIHAtPmdpZl9wdHItPl9naWZfYXNrX2J1Zl9mb3JfcGFsX2ZuID0gX2dpZl9hc2tfYnVmX2Zvcl9wYWw7DQorICBwLT5naWZfcHRyLT5fZ2lmX3JlY29yZF9jdXJyZW50X3Bvc2l0aW9uX2ZuID0gX2dpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbjsNCisgIHAtPmdpZl9wdHItPl9naWZfZ2V0X3Jvd19mbiA9IF9naWZfcmVhZF9zY2FubGluZTsNCisgIHAtPmdpZl9wdHItPl9naWZfZ2V0X3JlY29yZF9wb3NpdGlvbl9mbiA9IF9naWZfZ2V0X3JlY29yZF9wb3NpdGlvbjsNCisgIHJldHVybiBwOw0KIH0NCi12b2lkIENDb2RlY19HaWZNb2R1bGU6OkZpbmlzaCh2b2lkKiBwQ29udGV4dCkNCi17DQotICAgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopcENvbnRleHQ7DQotICAgIGlmKHAgIT0gTlVMTCkgew0KLSAgICAgICAgX2dpZl9kZXN0cm95X2RlY29tcHJlc3MoJnAtPmdpZl9wdHIpOw0KLSAgICAgICAgcC0+bV9GcmVlRnVuYyhwKTsNCi0gICAgfQ0KK3ZvaWQgQ0NvZGVjX0dpZk1vZHVsZTo6RmluaXNoKHZvaWQqIHBDb250ZXh0KSB7DQorICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgaWYgKHAgIT0gTlVMTCkgew0KKyAgICBfZ2lmX2Rlc3Ryb3lfZGVjb21wcmVzcygmcC0+Z2lmX3B0cik7DQorICAgIHAtPm1fRnJlZUZ1bmMocCk7DQorICB9DQogfQ0KLWludDMyX3QgQ0NvZGVjX0dpZk1vZHVsZTo6UmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhbF9udW0sIHZvaWQqKiBwYWxfcHAsIGludCogYmdfaW5kZXgsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpDQotew0KLSAgICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKXBDb250ZXh0Ow0KLSAgICBpZihzZXRqbXAocC0+Z2lmX3B0ci0+am1wYnVmKSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaW50MzJfdCByZXQgPSBfZ2lmX3JlYWRfaGVhZGVyKHAtPmdpZl9wdHIpOw0KLSAgICBpZiAocmV0ICE9IDEpIHsNCi0gICAgICAgIHJldHVybiByZXQ7DQotICAgIH0NCi0gICAgaWYgKHBBdHRyaWJ1dGUpIHsNCi0gICAgfQ0KLSAgICAqd2lkdGggPSBwLT5naWZfcHRyLT53aWR0aDsNCi0gICAgKmhlaWdodCA9IHAtPmdpZl9wdHItPmhlaWdodDsNCi0gICAgKnBhbF9udW0gPSBwLT5naWZfcHRyLT5nbG9iYWxfcGFsX251bTsNCi0gICAgKnBhbF9wcCA9IHAtPmdpZl9wdHItPmdsb2JhbF9wYWxfcHRyOw0KLSAgICAqYmdfaW5kZXggPSBwLT5naWZfcHRyLT5iY19pbmRleDsNCi0gICAgcmV0dXJuIDE7DQotfQ0KLWludDMyX3QgQ0NvZGVjX0dpZk1vZHVsZTo6TG9hZEZyYW1lSW5mbyh2b2lkKiBwQ29udGV4dCwgaW50KiBmcmFtZV9udW0pDQotew0KLSAgICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKXBDb250ZXh0Ow0KLSAgICBpZihzZXRqbXAocC0+Z2lmX3B0ci0+am1wYnVmKSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaW50MzJfdCByZXQgPSBfZ2lmX2dldF9mcmFtZShwLT5naWZfcHRyKTsNCi0gICAgaWYgKHJldCAhPSAxKSB7DQotICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICB9DQotICAgICpmcmFtZV9udW0gPSBfZ2lmX2dldF9mcmFtZV9udW0ocC0+Z2lmX3B0cik7DQotICAgIHJldHVybiAxOw0KLX0NCi1pbnQzMl90IENDb2RlY19HaWZNb2R1bGU6OkxvYWRGcmFtZSh2b2lkKiBwQ29udGV4dCwgaW50IGZyYW1lX251bSwgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkNCi17DQotICAgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopcENvbnRleHQ7DQotICAgIGlmKHNldGptcChwLT5naWZfcHRyLT5qbXBidWYpKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHJldCA9IF9naWZfbG9hZF9mcmFtZShwLT5naWZfcHRyLCBmcmFtZV9udW0pOw0KLSAgICBpZiAocmV0ID09IDEpIHsNCi0gICAgICAgIGlmIChwQXR0cmlidXRlKSB7DQotICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV9uR2lmTGVmdCA9IHAtPmdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+R2V0QXQoZnJhbWVfbnVtKS0+aW1hZ2VfaW5mb19wdHItPmxlZnQ7DQotICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV9uR2lmVG9wID0gcC0+Z2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5HZXRBdChmcmFtZV9udW0pLT5pbWFnZV9pbmZvX3B0ci0+dG9wOw0KLSAgICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fZkFzcGVjdFJhdGlvID0gcC0+Z2lmX3B0ci0+cGl4ZWxfYXNwZWN0Ow0KLSAgICAgICAgICAgIGlmIChwLT5naWZfcHRyLT5jbXRfZGF0YV9wdHIpIHsNCi0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVmID0gKGNvbnN0IHVpbnQ4X3QqKXAtPmdpZl9wdHItPmNtdF9kYXRhX3B0ci0+R2V0QnVmZmVyKDApOw0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCBsZW4gPSBwLT5naWZfcHRyLT5jbXRfZGF0YV9wdHItPkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICBpZiAobGVuID4gMjEpIHsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2l6ZSA9ICpidWYrKzsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzaXplKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV9zdHJBdXRob3IgPSBDRlhfQnl0ZVN0cmluZyhidWYsIHNpemUpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQXR0cmlidXRlLT5tX3N0ckF1dGhvci5FbXB0eSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnVmICs9IHNpemU7DQotICAgICAgICAgICAgICAgICAgICBzaXplID0gKmJ1ZisrOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMjApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkocEF0dHJpYnV0ZS0+bV9zdHJUaW1lLCBidWYsIHNpemUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQoraW50MzJfdCBDQ29kZWNfR2lmTW9kdWxlOjpSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwYWxfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcGFsX3BwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJnX2luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSB7DQorICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgaWYgKHNldGptcChwLT5naWZfcHRyLT5qbXBidWYpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCByZXQgPSBfZ2lmX3JlYWRfaGVhZGVyKHAtPmdpZl9wdHIpOw0KKyAgaWYgKHJldCAhPSAxKSB7DQogICAgIHJldHVybiByZXQ7DQorICB9DQorICBpZiAocEF0dHJpYnV0ZSkgew0KKyAgfQ0KKyAgKndpZHRoID0gcC0+Z2lmX3B0ci0+d2lkdGg7DQorICAqaGVpZ2h0ID0gcC0+Z2lmX3B0ci0+aGVpZ2h0Ow0KKyAgKnBhbF9udW0gPSBwLT5naWZfcHRyLT5nbG9iYWxfcGFsX251bTsNCisgICpwYWxfcHAgPSBwLT5naWZfcHRyLT5nbG9iYWxfcGFsX3B0cjsNCisgICpiZ19pbmRleCA9IHAtPmdpZl9wdHItPmJjX2luZGV4Ow0KKyAgcmV0dXJuIDE7DQogfQ0KLUZYX0RXT1JEIENDb2RlY19HaWZNb2R1bGU6OkdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqKiBhdmlhbF9idWZfcHRyKQ0KLXsNCi0gICAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilwQ29udGV4dDsNCi0gICAgcmV0dXJuIF9naWZfZ2V0X2F2YWlsX2lucHV0KHAtPmdpZl9wdHIsIGF2aWFsX2J1Zl9wdHIpOw0KK2ludDMyX3QgQ0NvZGVjX0dpZk1vZHVsZTo6TG9hZEZyYW1lSW5mbyh2b2lkKiBwQ29udGV4dCwgaW50KiBmcmFtZV9udW0pIHsNCisgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopcENvbnRleHQ7DQorICBpZiAoc2V0am1wKHAtPmdpZl9wdHItPmptcGJ1ZikpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IHJldCA9IF9naWZfZ2V0X2ZyYW1lKHAtPmdpZl9wdHIpOw0KKyAgaWYgKHJldCAhPSAxKSB7DQorICAgIHJldHVybiByZXQ7DQorICB9DQorICAqZnJhbWVfbnVtID0gX2dpZl9nZXRfZnJhbWVfbnVtKHAtPmdpZl9wdHIpOw0KKyAgcmV0dXJuIDE7DQogfQ0KLXZvaWQgQ0NvZGVjX0dpZk1vZHVsZTo6SW5wdXQodm9pZCogcENvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKQ0KLXsNCi0gICAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilwQ29udGV4dDsNCi0gICAgX2dpZl9pbnB1dF9idWZmZXIocC0+Z2lmX3B0ciwgKHVpbnQ4X3QqKXNyY19idWYsIHNyY19zaXplKTsNCitpbnQzMl90IENDb2RlY19HaWZNb2R1bGU6OkxvYWRGcmFtZSh2b2lkKiBwQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIHsNCisgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopcENvbnRleHQ7DQorICBpZiAoc2V0am1wKHAtPmdpZl9wdHItPmptcGJ1ZikpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IHJldCA9IF9naWZfbG9hZF9mcmFtZShwLT5naWZfcHRyLCBmcmFtZV9udW0pOw0KKyAgaWYgKHJldCA9PSAxKSB7DQorICAgIGlmIChwQXR0cmlidXRlKSB7DQorICAgICAgcEF0dHJpYnV0ZS0+bV9uR2lmTGVmdCA9DQorICAgICAgICAgIHAtPmdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+R2V0QXQoZnJhbWVfbnVtKS0+aW1hZ2VfaW5mb19wdHItPmxlZnQ7DQorICAgICAgcEF0dHJpYnV0ZS0+bV9uR2lmVG9wID0NCisgICAgICAgICAgcC0+Z2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5HZXRBdChmcmFtZV9udW0pLT5pbWFnZV9pbmZvX3B0ci0+dG9wOw0KKyAgICAgIHBBdHRyaWJ1dGUtPm1fZkFzcGVjdFJhdGlvID0gcC0+Z2lmX3B0ci0+cGl4ZWxfYXNwZWN0Ow0KKyAgICAgIGlmIChwLT5naWZfcHRyLT5jbXRfZGF0YV9wdHIpIHsNCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZiA9DQorICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXAtPmdpZl9wdHItPmNtdF9kYXRhX3B0ci0+R2V0QnVmZmVyKDApOw0KKyAgICAgICAgRlhfRFdPUkQgbGVuID0gcC0+Z2lmX3B0ci0+Y210X2RhdGFfcHRyLT5HZXRMZW5ndGgoKTsNCisgICAgICAgIGlmIChsZW4gPiAyMSkgew0KKyAgICAgICAgICB1aW50OF90IHNpemUgPSAqYnVmKys7DQorICAgICAgICAgIGlmIChzaXplKSB7DQorICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV9zdHJBdXRob3IgPSBDRlhfQnl0ZVN0cmluZyhidWYsIHNpemUpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyQXV0aG9yLkVtcHR5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnVmICs9IHNpemU7DQorICAgICAgICAgIHNpemUgPSAqYnVmKys7DQorICAgICAgICAgIGlmIChzaXplID09IDIwKSB7DQorICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHBBdHRyaWJ1dGUtPm1fc3RyVGltZSwgYnVmLCBzaXplKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHJldDsNCit9DQorRlhfRFdPUkQgQ0NvZGVjX0dpZk1vZHVsZTo6R2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmlhbF9idWZfcHRyKSB7DQorICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgcmV0dXJuIF9naWZfZ2V0X2F2YWlsX2lucHV0KHAtPmdpZl9wdHIsIGF2aWFsX2J1Zl9wdHIpOw0KK30NCit2b2lkIENDb2RlY19HaWZNb2R1bGU6OklucHV0KHZvaWQqIHBDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKSB7DQorICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgX2dpZl9pbnB1dF9idWZmZXIocC0+Z2lmX3B0ciwgKHVpbnQ4X3QqKXNyY19idWYsIHNyY19zaXplKTsNCiB9DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19pY2MuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19pY2MuY3BwCmluZGV4IDc1MDdmZTUuLjg1Njc2NmUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfaWNjLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ljYy5jcHAKQEAgLTE0LDEzNTQgKzE0LDE5NzAgQEAKIGNvbnN0IEZYX0RXT1JEIE5fQ09NUE9ORU5UX0NNWUsgPSA0OwogY29uc3QgRlhfRFdPUkQgTl9DT01QT05FTlRfREVGQVVMVCA9IDM7CiAKLUZYX0JPT0wgTUQ1Q29tcHV0ZUlEKCBjb25zdCB2b2lkKiBidWYsIEZYX0RXT1JEIGR3U2l6ZSwgdWludDhfdCBJRFsxNl0gKQotewotICAgIHJldHVybiBjbXNNRDVjb21wdXRlSURFeHQoYnVmLCBkd1NpemUsIElEKTsKK0ZYX0JPT0wgTUQ1Q29tcHV0ZUlEKGNvbnN0IHZvaWQqIGJ1ZiwgRlhfRFdPUkQgZHdTaXplLCB1aW50OF90IElEWzE2XSkgeworICByZXR1cm4gY21zTUQ1Y29tcHV0ZUlERXh0KGJ1ZiwgZHdTaXplLCBJRCk7CiB9Ci1zdHJ1Y3QgQ0xjbXNDbW0gIHsKLSAgICBjbXNIVFJBTlNGT1JNIG1faFRyYW5zZm9ybTsKLSAgICBpbnQJCQltX25TcmNDb21wb25lbnRzOwotICAgIGludAkJCW1fbkRzdENvbXBvbmVudHM7Ci0gICAgRlhfQk9PTAkJbV9iTGFiOworc3RydWN0IENMY21zQ21tIHsKKyAgY21zSFRSQU5TRk9STSBtX2hUcmFuc2Zvcm07CisgIGludCBtX25TcmNDb21wb25lbnRzOworICBpbnQgbV9uRHN0Q29tcG9uZW50czsKKyAgRlhfQk9PTCBtX2JMYWI7CiB9OwogZXh0ZXJuICJDIiB7Ci0gICAgaW50IG91ckhhbmRsZXIoaW50IEVycm9yQ29kZSwgY29uc3QgY2hhciAqRXJyb3JUZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQoraW50IG91ckhhbmRsZXIoaW50IEVycm9yQ29kZSwgY29uc3QgY2hhciogRXJyb3JUZXh0KSB7CisgIHJldHVybiBUUlVFOworfQogfTsKLUZYX0JPT0wgQ2hlY2tDb21wb25lbnRzKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgY3MsIGludCBuQ29tcG9uZW50cywgRlhfQk9PTCBiRHN0KQotewotICAgIGlmIChuQ29tcG9uZW50cyA8PSAwIHx8IG5Db21wb25lbnRzID4gMTUpIHsKK0ZYX0JPT0wgQ2hlY2tDb21wb25lbnRzKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgY3MsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEc3QpIHsKKyAgaWYgKG5Db21wb25lbnRzIDw9IDAgfHwgbkNvbXBvbmVudHMgPiAxNSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzd2l0Y2ggKGNzKSB7CisgICAgY2FzZSBjbXNTaWdMYWJEYXRhOgorICAgICAgaWYgKG5Db21wb25lbnRzIDwgMykgewogICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHN3aXRjaChjcykgewotICAgICAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6Ci0gICAgICAgICAgICBpZiAobkNvbXBvbmVudHMgPCAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgY21zU2lnR3JheURhdGE6Ci0gICAgICAgICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFiRHN0ICYmIG5Db21wb25lbnRzID4gMikgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6Ci0gICAgICAgICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgY21zU2lnQ215a0RhdGE6Ci0gICAgICAgICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAobkNvbXBvbmVudHMgIT0gMykgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgY21zU2lnR3JheURhdGE6CisgICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSAxKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmICghYkRzdCAmJiBuQ29tcG9uZW50cyA+IDIpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBjbXNTaWdSZ2JEYXRhOgorICAgICAgaWYgKGJEc3QgJiYgbkNvbXBvbmVudHMgIT0gMykgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgorICAgICAgaWYgKGJEc3QgJiYgbkNvbXBvbmVudHMgIT0gNCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKG5Db21wb25lbnRzICE9IDMpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1pbnQzMl90IEdldENTQ29tcG9uZW50cyhjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGNzKQotewotICAgIEZYX0RXT1JEIGNvbXBvbmVudHM7Ci0gICAgc3dpdGNoIChjcykgewotICAgICAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6Ci0gICAgICAgICAgICBjb21wb25lbnRzID0gIE5fQ09NUE9ORU5UX0xBQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOgotICAgICAgICAgICAgY29tcG9uZW50cyA9ICBOX0NPTVBPTkVOVF9HUkFZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgY21zU2lnUmdiRGF0YToKLSAgICAgICAgICAgIGNvbXBvbmVudHMgPSAgTl9DT01QT05FTlRfUkdCOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgY21zU2lnQ215a0RhdGE6Ci0gICAgICAgICAgICBjb21wb25lbnRzID0gIE5fQ09NUE9ORU5UX0NNWUs7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNvbXBvbmVudHMgPSBOX0NPTVBPTkVOVF9ERUZBVUxUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBjb21wb25lbnRzOworaW50MzJfdCBHZXRDU0NvbXBvbmVudHMoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBjcykgeworICBGWF9EV09SRCBjb21wb25lbnRzOworICBzd2l0Y2ggKGNzKSB7CisgICAgY2FzZSBjbXNTaWdMYWJEYXRhOgorICAgICAgY29tcG9uZW50cyA9IE5fQ09NUE9ORU5UX0xBQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY21zU2lnR3JheURhdGE6CisgICAgICBjb21wb25lbnRzID0gTl9DT01QT05FTlRfR1JBWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY21zU2lnUmdiRGF0YToKKyAgICAgIGNvbXBvbmVudHMgPSBOX0NPTVBPTkVOVF9SR0I7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgorICAgICAgY29tcG9uZW50cyA9IE5fQ09NUE9ORU5UX0NNWUs7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY29tcG9uZW50cyA9IE5fQ09NUE9ORU5UX0RFRkFVTFQ7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gY29tcG9uZW50czsKIH0KLXZvaWQqIEljY0xpYl9DcmVhdGVUcmFuc2Zvcm0oY29uc3QgdW5zaWduZWQgY2hhciogcFNyY1Byb2ZpbGVEYXRhLCBGWF9EV09SRCBkd1NyY1Byb2ZpbGVTaXplLCBpbnQzMl90JiBuU3JjQ29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogcERzdFByb2ZpbGVEYXRhLCBGWF9EV09SRCBkd0RzdFByb2ZpbGVTaXplLCBpbnQzMl90IG5Ec3RDb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZW50LCBGWF9EV09SRCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCwgRlhfRFdPUkQgZHdEc3RGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQpCi17Ci0gICAgY21zSFBST0ZJTEUgc3JjUHJvZmlsZSA9IE5VTEw7Ci0gICAgY21zSFBST0ZJTEUgZHN0UHJvZmlsZSA9IE5VTEw7Ci0gICAgY21zSFRSQU5TRk9STSBoVHJhbnNmb3JtID0gTlVMTDsKLSAgICBDTGNtc0NtbSogcENtbSA9IE5VTEw7Ci0gICAgblNyY0NvbXBvbmVudHMgPSAwOwotICAgIHNyY1Byb2ZpbGUgPSBjbXNPcGVuUHJvZmlsZUZyb21NZW0oKHZvaWQqKXBTcmNQcm9maWxlRGF0YSwgZHdTcmNQcm9maWxlU2l6ZSk7Ci0gICAgaWYgKHNyY1Byb2ZpbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKK3ZvaWQqIEljY0xpYl9DcmVhdGVUcmFuc2Zvcm0oY29uc3QgdW5zaWduZWQgY2hhciogcFNyY1Byb2ZpbGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY1Byb2ZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuU3JjQ29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogcERzdFByb2ZpbGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0RzdFByb2ZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Ec3RDb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdEc3RGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQpIHsKKyAgY21zSFBST0ZJTEUgc3JjUHJvZmlsZSA9IE5VTEw7CisgIGNtc0hQUk9GSUxFIGRzdFByb2ZpbGUgPSBOVUxMOworICBjbXNIVFJBTlNGT1JNIGhUcmFuc2Zvcm0gPSBOVUxMOworICBDTGNtc0NtbSogcENtbSA9IE5VTEw7CisgIG5TcmNDb21wb25lbnRzID0gMDsKKyAgc3JjUHJvZmlsZSA9IGNtc09wZW5Qcm9maWxlRnJvbU1lbSgodm9pZCopcFNyY1Byb2ZpbGVEYXRhLCBkd1NyY1Byb2ZpbGVTaXplKTsKKyAgaWYgKHNyY1Byb2ZpbGUgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChwRHN0UHJvZmlsZURhdGEgPT0gTlVMTCAmJiBkd0RzdFByb2ZpbGVTaXplID09IDAgJiYgbkRzdENvbXBvbmVudHMgPT0gMykgeworICAgIGRzdFByb2ZpbGUgPSBjbXNDcmVhdGVfc1JHQlByb2ZpbGUoKTsKKyAgfSBlbHNlIHsKKyAgICBkc3RQcm9maWxlID0KKyAgICAgICAgY21zT3BlblByb2ZpbGVGcm9tTWVtKCh2b2lkKilwRHN0UHJvZmlsZURhdGEsIGR3RHN0UHJvZmlsZVNpemUpOworICB9CisgIGlmIChkc3RQcm9maWxlID09IE5VTEwpIHsKKyAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IHNyY0Zvcm1hdDsKKyAgRlhfQk9PTCBiTGFiID0gRkFMU0U7CisgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgc3JjQ1MgPSBjbXNHZXRDb2xvclNwYWNlKHNyY1Byb2ZpbGUpOworICBuU3JjQ29tcG9uZW50cyA9IEdldENTQ29tcG9uZW50cyhzcmNDUyk7CisgIGlmIChzcmNDUyA9PSBjbXNTaWdMYWJEYXRhKSB7CisgICAgc3JjRm9ybWF0ID0KKyAgICAgICAgQ09MT1JTUEFDRV9TSChQVF9MYWIpIHwgQ0hBTk5FTFNfU0goblNyY0NvbXBvbmVudHMpIHwgQllURVNfU0goMCk7CisgICAgYkxhYiA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgc3JjRm9ybWF0ID0KKyAgICAgICAgQ09MT1JTUEFDRV9TSChQVF9BTlkpIHwgQ0hBTk5FTFNfU0goblNyY0NvbXBvbmVudHMpIHwgQllURVNfU0goMSk7CisgICAgaWYgKHNyY0NTID09IGNtc1NpZ1JnYkRhdGEgJiYgVF9ET1NXQVAoZHdTcmNGb3JtYXQpKSB7CisgICAgICBzcmNGb3JtYXQgfD0gRE9TV0FQX1NIKDEpOwogICAgIH0KLSAgICBpZihwRHN0UHJvZmlsZURhdGEgPT0gTlVMTCAmJiBkd0RzdFByb2ZpbGVTaXplID09IDAgJiYgbkRzdENvbXBvbmVudHMgPT0gMykgewotICAgICAgICBkc3RQcm9maWxlID0gY21zQ3JlYXRlX3NSR0JQcm9maWxlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0UHJvZmlsZSA9IGNtc09wZW5Qcm9maWxlRnJvbU1lbSgodm9pZCopcERzdFByb2ZpbGVEYXRhLCBkd0RzdFByb2ZpbGVTaXplKTsKLSAgICB9Ci0gICAgaWYgKGRzdFByb2ZpbGUgPT0gTlVMTCkgewotICAgICAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpbnQgc3JjRm9ybWF0OwotICAgIEZYX0JPT0wgYkxhYiA9IEZBTFNFOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgc3JjQ1MgPSBjbXNHZXRDb2xvclNwYWNlKHNyY1Byb2ZpbGUpOwotICAgIG5TcmNDb21wb25lbnRzID0gR2V0Q1NDb21wb25lbnRzKHNyY0NTKTsKLSAgICBpZiAoc3JjQ1MgPT0gY21zU2lnTGFiRGF0YSkgewotICAgICAgICBzcmNGb3JtYXQgPSBDT0xPUlNQQUNFX1NIKFBUX0xhYikgfCBDSEFOTkVMU19TSChuU3JjQ29tcG9uZW50cykgfCBCWVRFU19TSCgwKTsKLSAgICAgICAgYkxhYiA9IFRSVUU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3JjRm9ybWF0ID0gQ09MT1JTUEFDRV9TSChQVF9BTlkpIHwgQ0hBTk5FTFNfU0goblNyY0NvbXBvbmVudHMpIHwgQllURVNfU0goMSk7Ci0gICAgICAgIGlmIChzcmNDUyA9PSBjbXNTaWdSZ2JEYXRhICYmIFRfRE9TV0FQKGR3U3JjRm9ybWF0KSkgewotICAgICAgICAgICAgc3JjRm9ybWF0IHw9IERPU1dBUF9TSCgxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGRzdENTID0gY21zR2V0Q29sb3JTcGFjZShkc3RQcm9maWxlKTsKLSAgICBpZiAoIUNoZWNrQ29tcG9uZW50cyhkc3RDUywgbkRzdENvbXBvbmVudHMsIFRSVUUpKSB7Ci0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShzcmNQcm9maWxlKTsKLSAgICAgICAgY21zQ2xvc2VQcm9maWxlKGRzdFByb2ZpbGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgc3dpdGNoKGRzdENTKSB7Ci0gICAgICAgIGNhc2UgY21zU2lnR3JheURhdGE6Ci0gICAgICAgICAgICBoVHJhbnNmb3JtID0gY21zQ3JlYXRlVHJhbnNmb3JtKHNyY1Byb2ZpbGUsIHNyY0Zvcm1hdCwgZHN0UHJvZmlsZSwgVFlQRV9HUkFZXzgsIGludGVudCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBjbXNTaWdSZ2JEYXRhOgotICAgICAgICAgICAgaFRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShzcmNQcm9maWxlLCBzcmNGb3JtYXQsIGRzdFByb2ZpbGUsIFRZUEVfQkdSXzgsIGludGVudCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBjbXNTaWdDbXlrRGF0YToKLSAgICAgICAgICAgIGhUcmFuc2Zvcm0gPSBjbXNDcmVhdGVUcmFuc2Zvcm0oc3JjUHJvZmlsZSwgc3JjRm9ybWF0LCBkc3RQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPU1dBUChkd0RzdEZvcm1hdCkgPyBUWVBFX0tZTUNfOCA6IFRZUEVfQ01ZS184LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGhUcmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7Ci0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShkc3RQcm9maWxlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBDbW0gPSBuZXcgQ0xjbXNDbW07Ci0gICAgcENtbS0+bV9uU3JjQ29tcG9uZW50cyA9IG5TcmNDb21wb25lbnRzOwotICAgIHBDbW0tPm1fbkRzdENvbXBvbmVudHMgPSBuRHN0Q29tcG9uZW50czsKLSAgICBwQ21tLT5tX2hUcmFuc2Zvcm0gPSBoVHJhbnNmb3JtOwotICAgIHBDbW0tPm1fYkxhYiA9IGJMYWI7CisgIH0KKyAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBkc3RDUyA9IGNtc0dldENvbG9yU3BhY2UoZHN0UHJvZmlsZSk7CisgIGlmICghQ2hlY2tDb21wb25lbnRzKGRzdENTLCBuRHN0Q29tcG9uZW50cywgVFJVRSkpIHsKICAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7CiAgICAgY21zQ2xvc2VQcm9maWxlKGRzdFByb2ZpbGUpOwotICAgIHJldHVybiBwQ21tOworICAgIHJldHVybiBOVUxMOworICB9CisgIHN3aXRjaCAoZHN0Q1MpIHsKKyAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOgorICAgICAgaFRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShzcmNQcm9maWxlLCBzcmNGb3JtYXQsIGRzdFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfR1JBWV84LCBpbnRlbnQsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjbXNTaWdSZ2JEYXRhOgorICAgICAgaFRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShzcmNQcm9maWxlLCBzcmNGb3JtYXQsIGRzdFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfQkdSXzgsIGludGVudCwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgorICAgICAgaFRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybSgKKyAgICAgICAgICBzcmNQcm9maWxlLCBzcmNGb3JtYXQsIGRzdFByb2ZpbGUsCisgICAgICAgICAgVF9ET1NXQVAoZHdEc3RGb3JtYXQpID8gVFlQRV9LWU1DXzggOiBUWVBFX0NNWUtfOCwgaW50ZW50LCAwKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBpZiAoaFRyYW5zZm9ybSA9PSBOVUxMKSB7CisgICAgY21zQ2xvc2VQcm9maWxlKHNyY1Byb2ZpbGUpOworICAgIGNtc0Nsb3NlUHJvZmlsZShkc3RQcm9maWxlKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwQ21tID0gbmV3IENMY21zQ21tOworICBwQ21tLT5tX25TcmNDb21wb25lbnRzID0gblNyY0NvbXBvbmVudHM7CisgIHBDbW0tPm1fbkRzdENvbXBvbmVudHMgPSBuRHN0Q29tcG9uZW50czsKKyAgcENtbS0+bV9oVHJhbnNmb3JtID0gaFRyYW5zZm9ybTsKKyAgcENtbS0+bV9iTGFiID0gYkxhYjsKKyAgY21zQ2xvc2VQcm9maWxlKHNyY1Byb2ZpbGUpOworICBjbXNDbG9zZVByb2ZpbGUoZHN0UHJvZmlsZSk7CisgIHJldHVybiBwQ21tOwogfQotdm9pZCogSWNjTGliX0NyZWF0ZVRyYW5zZm9ybV9zUkdCKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBQcm9maWxlRGF0YSwgRlhfRFdPUkQgZHdQcm9maWxlU2l6ZSwgaW50MzJfdCYgbkNvbXBvbmVudHMsIGludDMyX3QgaW50ZW50LCBGWF9EV09SRCBkd1NyY0Zvcm1hdCkKLXsKLSAgICByZXR1cm4gSWNjTGliX0NyZWF0ZVRyYW5zZm9ybShwUHJvZmlsZURhdGEsIGR3UHJvZmlsZVNpemUsIG5Db21wb25lbnRzLCBOVUxMLCAwLCAzLCBpbnRlbnQsIGR3U3JjRm9ybWF0KTsKK3ZvaWQqIEljY0xpYl9DcmVhdGVUcmFuc2Zvcm1fc1JHQihjb25zdCB1bnNpZ25lZCBjaGFyKiBwUHJvZmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQcm9maWxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCkgeworICByZXR1cm4gSWNjTGliX0NyZWF0ZVRyYW5zZm9ybShwUHJvZmlsZURhdGEsIGR3UHJvZmlsZVNpemUsIG5Db21wb25lbnRzLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAzLCBpbnRlbnQsIGR3U3JjRm9ybWF0KTsKIH0KLXZvaWQgSWNjTGliX0Rlc3Ryb3lUcmFuc2Zvcm0odm9pZCogcFRyYW5zZm9ybSkKLXsKLSAgICBpZiAocFRyYW5zZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY21zRGVsZXRlVHJhbnNmb3JtKCgoQ0xjbXNDbW0qKXBUcmFuc2Zvcm0pLT5tX2hUcmFuc2Zvcm0pOwotICAgIGRlbGV0ZSAoQ0xjbXNDbW0qKXBUcmFuc2Zvcm07Cit2b2lkIEljY0xpYl9EZXN0cm95VHJhbnNmb3JtKHZvaWQqIHBUcmFuc2Zvcm0pIHsKKyAgaWYgKHBUcmFuc2Zvcm0gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBjbXNEZWxldGVUcmFuc2Zvcm0oKChDTGNtc0NtbSopcFRyYW5zZm9ybSktPm1faFRyYW5zZm9ybSk7CisgIGRlbGV0ZSAoQ0xjbXNDbW0qKXBUcmFuc2Zvcm07CiB9Ci12b2lkIEljY0xpYl9UcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwgRlhfRFdPUkQgblNyY0NvbXBvbmVudHMsIEZYX0ZMT0FUKiBwU3JjVmFsdWVzLCBGWF9GTE9BVCogcERlc3RWYWx1ZXMpCi17Ci0gICAgaWYgKHBUcmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Cit2b2lkIEljY0xpYl9UcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuU3JjQ29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFNyY1ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcERlc3RWYWx1ZXMpIHsKKyAgaWYgKHBUcmFuc2Zvcm0gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBDTGNtc0NtbSogcCA9IChDTGNtc0NtbSopcFRyYW5zZm9ybTsKKyAgdWludDhfdCBvdXRwdXRbNF07CisgIGlmIChwLT5tX2JMYWIpIHsKKyAgICBDRlhfRml4ZWRCdWZHcm93PGRvdWJsZSwgMTY+IGlucHV0cyhuU3JjQ29tcG9uZW50cyk7CisgICAgZG91YmxlKiBpbnB1dCA9IGlucHV0czsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgblNyY0NvbXBvbmVudHM7IGkrKykgeworICAgICAgaW5wdXRbaV0gPSBwU3JjVmFsdWVzW2ldOwogICAgIH0KLSAgICBDTGNtc0NtbSogcCA9IChDTGNtc0NtbSopcFRyYW5zZm9ybTsKLSAgICB1aW50OF90IG91dHB1dFs0XTsKLSAgICBpZiAocC0+bV9iTGFiKSB7Ci0gICAgICAgIENGWF9GaXhlZEJ1Zkdyb3c8ZG91YmxlLCAxNj4gaW5wdXRzKG5TcmNDb21wb25lbnRzKTsKLSAgICAgICAgZG91YmxlKiBpbnB1dCA9IGlucHV0czsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5TcmNDb21wb25lbnRzOyBpICsrKSB7Ci0gICAgICAgICAgICBpbnB1dFtpXSA9IHBTcmNWYWx1ZXNbaV07Ci0gICAgICAgIH0KLSAgICAgICAgY21zRG9UcmFuc2Zvcm0ocC0+bV9oVHJhbnNmb3JtLCBpbnB1dCwgb3V0cHV0LCAxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDRlhfRml4ZWRCdWZHcm93PHVpbnQ4X3QsIDE2PiBpbnB1dHMoblNyY0NvbXBvbmVudHMpOwotICAgICAgICB1aW50OF90KiBpbnB1dCA9IGlucHV0czsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5TcmNDb21wb25lbnRzOyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAocFNyY1ZhbHVlc1tpXSA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBpbnB1dFtpXSA9IDI1NTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocFNyY1ZhbHVlc1tpXSA8IDApIHsKLSAgICAgICAgICAgICAgICBpbnB1dFtpXSA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlucHV0W2ldID0gKGludCkocFNyY1ZhbHVlc1tpXSAqIDI1NS4wZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY21zRG9UcmFuc2Zvcm0ocC0+bV9oVHJhbnNmb3JtLCBpbnB1dCwgb3V0cHV0LCAxKTsKKyAgICBjbXNEb1RyYW5zZm9ybShwLT5tX2hUcmFuc2Zvcm0sIGlucHV0LCBvdXRwdXQsIDEpOworICB9IGVsc2UgeworICAgIENGWF9GaXhlZEJ1Zkdyb3c8dWludDhfdCwgMTY+IGlucHV0cyhuU3JjQ29tcG9uZW50cyk7CisgICAgdWludDhfdCogaW5wdXQgPSBpbnB1dHM7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5TcmNDb21wb25lbnRzOyBpKyspIHsKKyAgICAgIGlmIChwU3JjVmFsdWVzW2ldID4gMS4wZikgeworICAgICAgICBpbnB1dFtpXSA9IDI1NTsKKyAgICAgIH0gZWxzZSBpZiAocFNyY1ZhbHVlc1tpXSA8IDApIHsKKyAgICAgICAgaW5wdXRbaV0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRbaV0gPSAoaW50KShwU3JjVmFsdWVzW2ldICogMjU1LjBmKTsKKyAgICAgIH0KICAgICB9Ci0gICAgc3dpdGNoKHAtPm1fbkRzdENvbXBvbmVudHMpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcERlc3RWYWx1ZXNbMF0gPSBvdXRwdXRbMF0gLyAyNTUuMGY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcERlc3RWYWx1ZXNbMF0gPSBvdXRwdXRbMl0gLyAyNTUuMGY7Ci0gICAgICAgICAgICBwRGVzdFZhbHVlc1sxXSA9IG91dHB1dFsxXSAvIDI1NS4wZjsKLSAgICAgICAgICAgIHBEZXN0VmFsdWVzWzJdID0gb3V0cHV0WzBdIC8gMjU1LjBmOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHBEZXN0VmFsdWVzWzBdID0gb3V0cHV0WzBdIC8gMjU1LjBmOwotICAgICAgICAgICAgcERlc3RWYWx1ZXNbMV0gPSBvdXRwdXRbMV0gLyAyNTUuMGY7Ci0gICAgICAgICAgICBwRGVzdFZhbHVlc1syXSA9IG91dHB1dFsyXSAvIDI1NS4wZjsKLSAgICAgICAgICAgIHBEZXN0VmFsdWVzWzNdID0gb3V0cHV0WzNdIC8gMjU1LjBmOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgIGNtc0RvVHJhbnNmb3JtKHAtPm1faFRyYW5zZm9ybSwgaW5wdXQsIG91dHB1dCwgMSk7CisgIH0KKyAgc3dpdGNoIChwLT5tX25Ec3RDb21wb25lbnRzKSB7CisgICAgY2FzZSAxOgorICAgICAgcERlc3RWYWx1ZXNbMF0gPSBvdXRwdXRbMF0gLyAyNTUuMGY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBwRGVzdFZhbHVlc1swXSA9IG91dHB1dFsyXSAvIDI1NS4wZjsKKyAgICAgIHBEZXN0VmFsdWVzWzFdID0gb3V0cHV0WzFdIC8gMjU1LjBmOworICAgICAgcERlc3RWYWx1ZXNbMl0gPSBvdXRwdXRbMF0gLyAyNTUuMGY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBwRGVzdFZhbHVlc1swXSA9IG91dHB1dFswXSAvIDI1NS4wZjsKKyAgICAgIHBEZXN0VmFsdWVzWzFdID0gb3V0cHV0WzFdIC8gMjU1LjBmOworICAgICAgcERlc3RWYWx1ZXNbMl0gPSBvdXRwdXRbMl0gLyAyNTUuMGY7CisgICAgICBwRGVzdFZhbHVlc1szXSA9IG91dHB1dFszXSAvIDI1NS4wZjsKKyAgICAgIGJyZWFrOworICB9CiB9Ci12b2lkIEljY0xpYl9UcmFuc2xhdGVJbWFnZSh2b2lkKiBwVHJhbnNmb3JtLCB1bnNpZ25lZCBjaGFyKiBwRGVzdCwgY29uc3QgdW5zaWduZWQgY2hhciogcFNyYywgaW50MzJfdCBwaXhlbHMpCi17Ci0gICAgY21zRG9UcmFuc2Zvcm0oKChDTGNtc0NtbSopcFRyYW5zZm9ybSktPm1faFRyYW5zZm9ybSwgKHZvaWQqKXBTcmMsIHBEZXN0LCBwaXhlbHMpOwordm9pZCBJY2NMaWJfVHJhbnNsYXRlSW1hZ2Uodm9pZCogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGl4ZWxzKSB7CisgIGNtc0RvVHJhbnNmb3JtKCgoQ0xjbXNDbW0qKXBUcmFuc2Zvcm0pLT5tX2hUcmFuc2Zvcm0sICh2b2lkKilwU3JjLCBwRGVzdCwKKyAgICAgICAgICAgICAgICAgcGl4ZWxzKTsKIH0KLXZvaWQqIENyZWF0ZVByb2ZpbGVfR3JheShkb3VibGUgZ2FtbWEpCi17Ci0gICAgY21zQ0lFeHlZKiBENTAgPSAoY21zQ0lFeHlZKiljbXNENTBfeHlZKCk7Ci0gICAgaWYgKCFjbXNXaGl0ZVBvaW50RnJvbVRlbXAoRDUwLCA2NTA0KSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY21zVG9uZUN1cnZlKiBjdXJ2ZSA9IGNtc0J1aWxkR2FtbWEoTlVMTCwgZ2FtbWEpOwotICAgIGlmIChjdXJ2ZSA9PSBOVUxMKQl7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2b2lkKiBwcm9maWxlID0gY21zQ3JlYXRlR3JheVByb2ZpbGUoRDUwLCBjdXJ2ZSk7Ci0gICAgY21zRnJlZVRvbmVDdXJ2ZShjdXJ2ZSk7Ci0gICAgcmV0dXJuIHByb2ZpbGU7Cit2b2lkKiBDcmVhdGVQcm9maWxlX0dyYXkoZG91YmxlIGdhbW1hKSB7CisgIGNtc0NJRXh5WSogRDUwID0gKGNtc0NJRXh5WSopY21zRDUwX3h5WSgpOworICBpZiAoIWNtc1doaXRlUG9pbnRGcm9tVGVtcChENTAsIDY1MDQpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY21zVG9uZUN1cnZlKiBjdXJ2ZSA9IGNtc0J1aWxkR2FtbWEoTlVMTCwgZ2FtbWEpOworICBpZiAoY3VydmUgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHZvaWQqIHByb2ZpbGUgPSBjbXNDcmVhdGVHcmF5UHJvZmlsZShENTAsIGN1cnZlKTsKKyAgY21zRnJlZVRvbmVDdXJ2ZShjdXJ2ZSk7CisgIHJldHVybiBwcm9maWxlOwogfQotSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1MgR2V0UHJvZmlsZUNTRnJvbUhhbmRsZSh2b2lkKiBwUHJvZmlsZSkKLXsKLSAgICBpZiAocFByb2ZpbGUgPT0gTlVMTCkJewotICAgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfVW5rbm93bjsKLSAgICB9Ci0gICAgc3dpdGNoIChjbXNHZXRDb2xvclNwYWNlKHBQcm9maWxlKSkgewotICAgICAgICBjYXNlIGNtc1NpZ1hZWkRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfWFlaOwotICAgICAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfTGFiOwotICAgICAgICBjYXNlIGNtc1NpZ0x1dkRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfTHV2OwotICAgICAgICBjYXNlIGNtc1NpZ1lDYkNyRGF0YToKLSAgICAgICAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19ZQ2JDcjsKLSAgICAgICAgY2FzZSBjbXNTaWdZeHlEYXRhOgotICAgICAgICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX1l4eTsKLSAgICAgICAgY2FzZSBjbXNTaWdSZ2JEYXRhOgotICAgICAgICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX1JnYjsKLSAgICAgICAgY2FzZSBjbXNTaWdHcmF5RGF0YToKLSAgICAgICAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19HcmF5OwotICAgICAgICBjYXNlIGNtc1NpZ0hzdkRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfSHN2OwotICAgICAgICBjYXNlIGNtc1NpZ0hsc0RhdGE6Ci0gICAgICAgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfSGxzOwotICAgICAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgotICAgICAgICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX0NteWs7Ci0gICAgICAgIGNhc2UgY21zU2lnQ215RGF0YToKLSAgICAgICAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19DbXk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfVW5rbm93bjsKLSAgICB9CitJQ29kZWNfSWNjTW9kdWxlOjpJY2NDUyBHZXRQcm9maWxlQ1NGcm9tSGFuZGxlKHZvaWQqIHBQcm9maWxlKSB7CisgIGlmIChwUHJvZmlsZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX1Vua25vd247CisgIH0KKyAgc3dpdGNoIChjbXNHZXRDb2xvclNwYWNlKHBQcm9maWxlKSkgeworICAgIGNhc2UgY21zU2lnWFlaRGF0YToKKyAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19YWVo7CisgICAgY2FzZSBjbXNTaWdMYWJEYXRhOgorICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX0xhYjsKKyAgICBjYXNlIGNtc1NpZ0x1dkRhdGE6CisgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfTHV2OworICAgIGNhc2UgY21zU2lnWUNiQ3JEYXRhOgorICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX1lDYkNyOworICAgIGNhc2UgY21zU2lnWXh5RGF0YToKKyAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19ZeHk7CisgICAgY2FzZSBjbXNTaWdSZ2JEYXRhOgorICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX1JnYjsKKyAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOgorICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX0dyYXk7CisgICAgY2FzZSBjbXNTaWdIc3ZEYXRhOgorICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX0hzdjsKKyAgICBjYXNlIGNtc1NpZ0hsc0RhdGE6CisgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfSGxzOworICAgIGNhc2UgY21zU2lnQ215a0RhdGE6CisgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfQ215azsKKyAgICBjYXNlIGNtc1NpZ0NteURhdGE6CisgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfQ215OworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfVW5rbm93bjsKKyAgfQogfQotSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1MgQ0NvZGVjX0ljY01vZHVsZTo6R2V0UHJvZmlsZUNTKGNvbnN0IHVpbnQ4X3QqIHBQcm9maWxlRGF0YSwgRlhfRFdPUkQgZHdQcm9maWxlU2l6ZSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDUyBjczsKLSAgICBjbXNIUFJPRklMRSBoUHJvZmlsZSA9IGNtc09wZW5Qcm9maWxlRnJvbU1lbSgodm9pZCopcFByb2ZpbGVEYXRhLCBkd1Byb2ZpbGVTaXplKTsKLSAgICBpZiAoaFByb2ZpbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gSWNjQ1NfVW5rbm93bjsKLSAgICB9Ci0gICAgY3MgPSBHZXRQcm9maWxlQ1NGcm9tSGFuZGxlKGhQcm9maWxlKTsKLSAgICBpZiAoaFByb2ZpbGUpCXsKLSAgICAgICAgY21zQ2xvc2VQcm9maWxlKGhQcm9maWxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNzOworSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1MgQ0NvZGVjX0ljY01vZHVsZTo6R2V0UHJvZmlsZUNTKAorICAgIGNvbnN0IHVpbnQ4X3QqIHBQcm9maWxlRGF0YSwKKyAgICBGWF9EV09SRCBkd1Byb2ZpbGVTaXplKSB7CisgIElDb2RlY19JY2NNb2R1bGU6OkljY0NTIGNzOworICBjbXNIUFJPRklMRSBoUHJvZmlsZSA9CisgICAgICBjbXNPcGVuUHJvZmlsZUZyb21NZW0oKHZvaWQqKXBQcm9maWxlRGF0YSwgZHdQcm9maWxlU2l6ZSk7CisgIGlmIChoUHJvZmlsZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEljY0NTX1Vua25vd247CisgIH0KKyAgY3MgPSBHZXRQcm9maWxlQ1NGcm9tSGFuZGxlKGhQcm9maWxlKTsKKyAgaWYgKGhQcm9maWxlKSB7CisgICAgY21zQ2xvc2VQcm9maWxlKGhQcm9maWxlKTsKKyAgfQorICByZXR1cm4gY3M7CiB9Ci1JQ29kZWNfSWNjTW9kdWxlOjpJY2NDUyBDQ29kZWNfSWNjTW9kdWxlOjpHZXRQcm9maWxlQ1MoSUZYX0ZpbGVSZWFkKiBwRmlsZSkKLXsKLSAgICBpZiAocEZpbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gSWNjQ1NfVW5rbm93bjsKLSAgICB9Ci0gICAgSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1MgY3M7Ci0gICAgRlhfRFdPUkQgZHdTaXplID0gKEZYX0RXT1JEKXBGaWxlLT5HZXRTaXplKCk7Ci0gICAgdWludDhfdCogcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGR3U2l6ZSk7Ci0gICAgcEZpbGUtPlJlYWRCbG9jayhwQnVmLCAwLCBkd1NpemUpOwotICAgIGNzID0gR2V0UHJvZmlsZUNTKHBCdWYsIGR3U2l6ZSk7Ci0gICAgRlhfRnJlZShwQnVmKTsKLSAgICByZXR1cm4gY3M7CitJQ29kZWNfSWNjTW9kdWxlOjpJY2NDUyBDQ29kZWNfSWNjTW9kdWxlOjpHZXRQcm9maWxlQ1MoSUZYX0ZpbGVSZWFkKiBwRmlsZSkgeworICBpZiAocEZpbGUgPT0gTlVMTCkgeworICAgIHJldHVybiBJY2NDU19Vbmtub3duOworICB9CisgIElDb2RlY19JY2NNb2R1bGU6OkljY0NTIGNzOworICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpcEZpbGUtPkdldFNpemUoKTsKKyAgdWludDhfdCogcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGR3U2l6ZSk7CisgIHBGaWxlLT5SZWFkQmxvY2socEJ1ZiwgMCwgZHdTaXplKTsKKyAgY3MgPSBHZXRQcm9maWxlQ1MocEJ1ZiwgZHdTaXplKTsKKyAgRlhfRnJlZShwQnVmKTsKKyAgcmV0dXJuIGNzOwogfQotRlhfRFdPUkQgVHJhbnNmZXJQcm9maWxlVHlwZSh2b2lkKiBwUHJvZmlsZSwgRlhfRFdPUkQgZHdGb3JtYXQpCi17Ci0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBjcyA9IGNtc0dldENvbG9yU3BhY2UocFByb2ZpbGUpOwotICAgIHN3aXRjaCAoY3MpIHsKLSAgICAgICAgY2FzZSBjbXNTaWdYWVpEYXRhOgotICAgICAgICAgICAgcmV0dXJuIFRZUEVfWFlaXzE2OwotICAgICAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVFlQRV9MYWJfREJMOwotICAgICAgICBjYXNlIGNtc1NpZ0x1dkRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVFlQRV9ZVVZfODsKLSAgICAgICAgY2FzZSBjbXNTaWdZQ2JDckRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVFlQRV9ZQ2JDcl84OwotICAgICAgICBjYXNlIGNtc1NpZ1l4eURhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVFlQRV9ZeHlfMTY7Ci0gICAgICAgIGNhc2UgY21zU2lnUmdiRGF0YToKLSAgICAgICAgICAgIHJldHVybiBUX0RPU1dBUChkd0Zvcm1hdCkgPyBUWVBFX1JHQl84IDogVFlQRV9CR1JfODsKLSAgICAgICAgY2FzZSBjbXNTaWdHcmF5RGF0YToKLSAgICAgICAgICAgIHJldHVybiBUWVBFX0dSQVlfODsKLSAgICAgICAgY2FzZSBjbXNTaWdIc3ZEYXRhOgotICAgICAgICAgICAgcmV0dXJuIFRZUEVfSFNWXzg7Ci0gICAgICAgIGNhc2UgY21zU2lnSGxzRGF0YToKLSAgICAgICAgICAgIHJldHVybiBUWVBFX0hMU184OwotICAgICAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgotICAgICAgICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQ184IDogVFlQRV9DTVlLXzg7Ci0gICAgICAgIGNhc2UgY21zU2lnQ215RGF0YToKLSAgICAgICAgICAgIHJldHVybiBUWVBFX0NNWV84OwotICAgICAgICBjYXNlIGNtc1NpZ01DSDVEYXRhOgotICAgICAgICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzVfOCA6IFRZUEVfQ01ZSzVfODsKLSAgICAgICAgY2FzZSBjbXNTaWdNQ0g2RGF0YToKLSAgICAgICAgICAgIHJldHVybiBUWVBFX0NNWUs2Xzg7Ci0gICAgICAgIGNhc2UgY21zU2lnTUNIN0RhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DN184IDogVFlQRV9DTVlLN184OwotICAgICAgICBjYXNlIGNtc1NpZ01DSDhEYXRhOgotICAgICAgICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzhfOCA6IFRZUEVfQ01ZSzhfODsKLSAgICAgICAgY2FzZSBjbXNTaWdNQ0g5RGF0YToKLSAgICAgICAgICAgIHJldHVybiBUX0RPU1dBUChkd0Zvcm1hdCkgPyBUWVBFX0tZTUM5XzggOiBUWVBFX0NNWUs5Xzg7Ci0gICAgICAgIGNhc2UgY21zU2lnTUNIQURhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DMTBfOCA6IFRZUEVfQ01ZSzEwXzg7Ci0gICAgICAgIGNhc2UgY21zU2lnTUNIQkRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DMTFfOCA6IFRZUEVfQ01ZSzExXzg7Ci0gICAgICAgIGNhc2UgY21zU2lnTUNIQ0RhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DMTJfOCA6IFRZUEVfQ01ZSzEyXzg7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9CitGWF9EV09SRCBUcmFuc2ZlclByb2ZpbGVUeXBlKHZvaWQqIHBQcm9maWxlLCBGWF9EV09SRCBkd0Zvcm1hdCkgeworICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGNzID0gY21zR2V0Q29sb3JTcGFjZShwUHJvZmlsZSk7CisgIHN3aXRjaCAoY3MpIHsKKyAgICBjYXNlIGNtc1NpZ1hZWkRhdGE6CisgICAgICByZXR1cm4gVFlQRV9YWVpfMTY7CisgICAgY2FzZSBjbXNTaWdMYWJEYXRhOgorICAgICAgcmV0dXJuIFRZUEVfTGFiX0RCTDsKKyAgICBjYXNlIGNtc1NpZ0x1dkRhdGE6CisgICAgICByZXR1cm4gVFlQRV9ZVVZfODsKKyAgICBjYXNlIGNtc1NpZ1lDYkNyRGF0YToKKyAgICAgIHJldHVybiBUWVBFX1lDYkNyXzg7CisgICAgY2FzZSBjbXNTaWdZeHlEYXRhOgorICAgICAgcmV0dXJuIFRZUEVfWXh5XzE2OworICAgIGNhc2UgY21zU2lnUmdiRGF0YToKKyAgICAgIHJldHVybiBUX0RPU1dBUChkd0Zvcm1hdCkgPyBUWVBFX1JHQl84IDogVFlQRV9CR1JfODsKKyAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOgorICAgICAgcmV0dXJuIFRZUEVfR1JBWV84OworICAgIGNhc2UgY21zU2lnSHN2RGF0YToKKyAgICAgIHJldHVybiBUWVBFX0hTVl84OworICAgIGNhc2UgY21zU2lnSGxzRGF0YToKKyAgICAgIHJldHVybiBUWVBFX0hMU184OworICAgIGNhc2UgY21zU2lnQ215a0RhdGE6CisgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DXzggOiBUWVBFX0NNWUtfODsKKyAgICBjYXNlIGNtc1NpZ0NteURhdGE6CisgICAgICByZXR1cm4gVFlQRV9DTVlfODsKKyAgICBjYXNlIGNtc1NpZ01DSDVEYXRhOgorICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzVfOCA6IFRZUEVfQ01ZSzVfODsKKyAgICBjYXNlIGNtc1NpZ01DSDZEYXRhOgorICAgICAgcmV0dXJuIFRZUEVfQ01ZSzZfODsKKyAgICBjYXNlIGNtc1NpZ01DSDdEYXRhOgorICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzdfOCA6IFRZUEVfQ01ZSzdfODsKKyAgICBjYXNlIGNtc1NpZ01DSDhEYXRhOgorICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzhfOCA6IFRZUEVfQ01ZSzhfODsKKyAgICBjYXNlIGNtc1NpZ01DSDlEYXRhOgorICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzlfOCA6IFRZUEVfQ01ZSzlfODsKKyAgICBjYXNlIGNtc1NpZ01DSEFEYXRhOgorICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzEwXzggOiBUWVBFX0NNWUsxMF84OworICAgIGNhc2UgY21zU2lnTUNIQkRhdGE6CisgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DMTFfOCA6IFRZUEVfQ01ZSzExXzg7CisgICAgY2FzZSBjbXNTaWdNQ0hDRGF0YToKKyAgICAgIHJldHVybiBUX0RPU1dBUChkd0Zvcm1hdCkgPyBUWVBFX0tZTUMxMl84IDogVFlQRV9DTVlLMTJfODsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KIH0KLWNsYXNzIENGWF9JY2NQcm9maWxlQ2FjaGUKLXsKLXB1YmxpYzoKLSAgICBDRlhfSWNjUHJvZmlsZUNhY2hlKCk7Ci0gICAgfkNGWF9JY2NQcm9maWxlQ2FjaGUoKTsKLSAgICB2b2lkKiBtX3BQcm9maWxlOwotICAgIEZYX0RXT1JECW1fZHdSYXRlOwotcHJvdGVjdGVkOgotICAgIHZvaWQJUHVyZ2UoKTsKK2NsYXNzIENGWF9JY2NQcm9maWxlQ2FjaGUgeworIHB1YmxpYzoKKyAgQ0ZYX0ljY1Byb2ZpbGVDYWNoZSgpOworICB+Q0ZYX0ljY1Byb2ZpbGVDYWNoZSgpOworICB2b2lkKiBtX3BQcm9maWxlOworICBGWF9EV09SRCBtX2R3UmF0ZTsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBQdXJnZSgpOwogfTsKLUNGWF9JY2NQcm9maWxlQ2FjaGU6OkNGWF9JY2NQcm9maWxlQ2FjaGUoKQotewotICAgIG1fcFByb2ZpbGUgPSBOVUxMOwotICAgIG1fZHdSYXRlID0gMTsKK0NGWF9JY2NQcm9maWxlQ2FjaGU6OkNGWF9JY2NQcm9maWxlQ2FjaGUoKSB7CisgIG1fcFByb2ZpbGUgPSBOVUxMOworICBtX2R3UmF0ZSA9IDE7CiB9Ci1DRlhfSWNjUHJvZmlsZUNhY2hlOjp+Q0ZYX0ljY1Byb2ZpbGVDYWNoZSgpCi17Ci0gICAgaWYgKG1fcFByb2ZpbGUpIHsKLSAgICAgICAgY21zQ2xvc2VQcm9maWxlKG1fcFByb2ZpbGUpOwotICAgIH0KK0NGWF9JY2NQcm9maWxlQ2FjaGU6On5DRlhfSWNjUHJvZmlsZUNhY2hlKCkgeworICBpZiAobV9wUHJvZmlsZSkgeworICAgIGNtc0Nsb3NlUHJvZmlsZShtX3BQcm9maWxlKTsKKyAgfQogfQotdm9pZCBDRlhfSWNjUHJvZmlsZUNhY2hlOjpQdXJnZSgpCi17Ci19Ci1jbGFzcyBDRlhfSWNjVHJhbnNmb3JtQ2FjaGUKLXsKLXB1YmxpYzoKLSAgICBDRlhfSWNjVHJhbnNmb3JtQ2FjaGUoQ0xjbXNDbW0qIHBDbW0gPSBOVUxMKTsKLSAgICB+Q0ZYX0ljY1RyYW5zZm9ybUNhY2hlKCk7Ci0gICAgdm9pZCoJbV9wSWNjVHJhbnNmb3JtOwotICAgIEZYX0RXT1JECQltX2R3UmF0ZTsKLSAgICBDTGNtc0NtbSoJCW1fcENtbTsKLXByb3RlY3RlZDoKLSAgICB2b2lkCQkJUHVyZ2UoKTsKK3ZvaWQgQ0ZYX0ljY1Byb2ZpbGVDYWNoZTo6UHVyZ2UoKSB7fQorY2xhc3MgQ0ZYX0ljY1RyYW5zZm9ybUNhY2hlIHsKKyBwdWJsaWM6CisgIENGWF9JY2NUcmFuc2Zvcm1DYWNoZShDTGNtc0NtbSogcENtbSA9IE5VTEwpOworICB+Q0ZYX0ljY1RyYW5zZm9ybUNhY2hlKCk7CisgIHZvaWQqIG1fcEljY1RyYW5zZm9ybTsKKyAgRlhfRFdPUkQgbV9kd1JhdGU7CisgIENMY21zQ21tKiBtX3BDbW07CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgUHVyZ2UoKTsKIH07Ci1DRlhfSWNjVHJhbnNmb3JtQ2FjaGU6OkNGWF9JY2NUcmFuc2Zvcm1DYWNoZShDTGNtc0NtbSogcENtbSkKLXsKLSAgICBtX3BJY2NUcmFuc2Zvcm0gPSBOVUxMOwotICAgIG1fZHdSYXRlID0gMTsKLSAgICBtX3BDbW0gPSBwQ21tOworQ0ZYX0ljY1RyYW5zZm9ybUNhY2hlOjpDRlhfSWNjVHJhbnNmb3JtQ2FjaGUoQ0xjbXNDbW0qIHBDbW0pIHsKKyAgbV9wSWNjVHJhbnNmb3JtID0gTlVMTDsKKyAgbV9kd1JhdGUgPSAxOworICBtX3BDbW0gPSBwQ21tOwogfQotQ0ZYX0ljY1RyYW5zZm9ybUNhY2hlOjp+Q0ZYX0ljY1RyYW5zZm9ybUNhY2hlKCkKLXsKLSAgICBpZiAobV9wSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIGNtc0RlbGV0ZVRyYW5zZm9ybShtX3BJY2NUcmFuc2Zvcm0pOwotICAgIH0KLSAgICBpZiAobV9wQ21tKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQ21tKTsKLSAgICB9CitDRlhfSWNjVHJhbnNmb3JtQ2FjaGU6On5DRlhfSWNjVHJhbnNmb3JtQ2FjaGUoKSB7CisgIGlmIChtX3BJY2NUcmFuc2Zvcm0pIHsKKyAgICBjbXNEZWxldGVUcmFuc2Zvcm0obV9wSWNjVHJhbnNmb3JtKTsKKyAgfQorICBpZiAobV9wQ21tKSB7CisgICAgRlhfRnJlZShtX3BDbW0pOworICB9CiB9Ci12b2lkIENGWF9JY2NUcmFuc2Zvcm1DYWNoZTo6UHVyZ2UoKQotewotfQotY2xhc3MgQ0ZYX0J5dGVTdHJpbmdLZXkgOiBwdWJsaWMgQ0ZYX0JpbmFyeUJ1ZgotewotcHVibGljOgotICAgIENGWF9CeXRlU3RyaW5nS2V5KCkgOiBDRlhfQmluYXJ5QnVmKCkge30KLSAgICBDRlhfQnl0ZVN0cmluZ0tleSYJCW9wZXJhdG9yIDw8IChGWF9EV09SRCBpKTsKK3ZvaWQgQ0ZYX0ljY1RyYW5zZm9ybUNhY2hlOjpQdXJnZSgpIHt9CitjbGFzcyBDRlhfQnl0ZVN0cmluZ0tleSA6IHB1YmxpYyBDRlhfQmluYXJ5QnVmIHsKKyBwdWJsaWM6CisgIENGWF9CeXRlU3RyaW5nS2V5KCkgOiBDRlhfQmluYXJ5QnVmKCkge30KKyAgQ0ZYX0J5dGVTdHJpbmdLZXkmIG9wZXJhdG9yPDwoRlhfRFdPUkQgaSk7CiB9OwotQ0ZYX0J5dGVTdHJpbmdLZXkmIENGWF9CeXRlU3RyaW5nS2V5OjpvcGVyYXRvciA8PCAoRlhfRFdPUkQgaSkKLXsKLSAgICBBcHBlbmRCbG9jaygmaSwgc2l6ZW9mKEZYX0RXT1JEKSk7Ci0gICAgcmV0dXJuICp0aGlzOworQ0ZYX0J5dGVTdHJpbmdLZXkmIENGWF9CeXRlU3RyaW5nS2V5OjpvcGVyYXRvcjw8KEZYX0RXT1JEIGkpIHsKKyAgQXBwZW5kQmxvY2soJmksIHNpemVvZihGWF9EV09SRCkpOworICByZXR1cm4gKnRoaXM7CiB9Ci12b2lkKiBDQ29kZWNfSWNjTW9kdWxlOjpDcmVhdGVQcm9maWxlKElDb2RlY19JY2NNb2R1bGU6OkljY1BhcmFtKiBwSWNjUGFyYW0sIEljY19DTEFTUyBpYywgQ0ZYX0JpbmFyeUJ1ZiogcFRyYW5zZm9ybUtleSkKLXsKLSAgICBDRlhfSWNjUHJvZmlsZUNhY2hlKiBwQ2FjaGUgPSBOVUxMOwotICAgIENGWF9CeXRlU3RyaW5nS2V5IGtleTsKLSAgICBDRlhfQnl0ZVN0cmluZyB0ZXh0OwotICAgIGtleSA8PCBwSWNjUGFyYW0tPkNvbG9yU3BhY2UgPDwgKHBJY2NQYXJhbS0+ZHdQcm9maWxlVHlwZSB8IGljIDw8IDgpOwotICAgIHVpbnQ4X3QgSURbMTZdOwordm9pZCogQ0NvZGVjX0ljY01vZHVsZTo6Q3JlYXRlUHJvZmlsZShJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcEljY1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJY2NfQ0xBU1MgaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYqIHBUcmFuc2Zvcm1LZXkpIHsKKyAgQ0ZYX0ljY1Byb2ZpbGVDYWNoZSogcENhY2hlID0gTlVMTDsKKyAgQ0ZYX0J5dGVTdHJpbmdLZXkga2V5OworICBDRlhfQnl0ZVN0cmluZyB0ZXh0OworICBrZXkgPDwgcEljY1BhcmFtLT5Db2xvclNwYWNlIDw8IChwSWNjUGFyYW0tPmR3UHJvZmlsZVR5cGUgfCBpYyA8PCA4KTsKKyAgdWludDhfdCBJRFsxNl07CisgIHN3aXRjaCAocEljY1BhcmFtLT5kd1Byb2ZpbGVUeXBlKSB7CisgICAgY2FzZSBJY2NfUEFSQU1UWVBFX05PTkU6CisgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYXNlIEljY19QQVJBTVRZUEVfQlVGRkVSOgorICAgICAgTUQ1Q29tcHV0ZUlEKHBJY2NQYXJhbS0+cFByb2ZpbGVEYXRhLCBwSWNjUGFyYW0tPmR3UHJvZmlsZVNpemUsIElEKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSWNjX1BBUkFNVFlQRV9QQVJBTToKKyAgICAgIEZYU1lTX21lbXNldChJRCwgMCwgMTYpOworICAgICAgc3dpdGNoIChwSWNjUGFyYW0tPkNvbG9yU3BhY2UpIHsKKyAgICAgICAgY2FzZSBJY2NDU19HcmF5OgorICAgICAgICAgIHRleHQuRm9ybWF0KCIlbGYiLCBwSWNjUGFyYW0tPkdhbW1hKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDo7CisgICAgICB9CisgICAgICBNRDVDb21wdXRlSUQodGV4dC5HZXRCdWZmZXIoMCksIHRleHQuR2V0TGVuZ3RoKCksIElEKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6OworICB9CisgIGtleS5BcHBlbmRCbG9jayhJRCwgMTYpOworICBDRlhfQnl0ZVN0cmluZyBQcm9maWxlS2V5KGtleS5HZXRCdWZmZXIoKSwga2V5LkdldFNpemUoKSk7CisgIEFTU0VSVChwVHJhbnNmb3JtS2V5KTsKKyAgcFRyYW5zZm9ybUtleS0+QXBwZW5kQmxvY2soUHJvZmlsZUtleS5HZXRCdWZmZXIoMCksIFByb2ZpbGVLZXkuR2V0TGVuZ3RoKCkpOworICBpZiAoIW1fTWFwUHJvZmlsZS5Mb29rdXAoUHJvZmlsZUtleSwgKHZvaWQqJilwQ2FjaGUpKSB7CisgICAgcENhY2hlID0gbmV3IENGWF9JY2NQcm9maWxlQ2FjaGU7CiAgICAgc3dpdGNoIChwSWNjUGFyYW0tPmR3UHJvZmlsZVR5cGUpIHsKLSAgICAgICAgY2FzZSBJY2NfUEFSQU1UWVBFX05PTkU6Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgY2FzZSBJY2NfUEFSQU1UWVBFX0JVRkZFUjoKLSAgICAgICAgICAgIE1ENUNvbXB1dGVJRChwSWNjUGFyYW0tPnBQcm9maWxlRGF0YSwgcEljY1BhcmFtLT5kd1Byb2ZpbGVTaXplLCBJRCk7CisgICAgICBjYXNlIEljY19QQVJBTVRZUEVfQlVGRkVSOgorICAgICAgICBwQ2FjaGUtPm1fcFByb2ZpbGUgPSBjbXNPcGVuUHJvZmlsZUZyb21NZW0ocEljY1BhcmFtLT5wUHJvZmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjUGFyYW0tPmR3UHJvZmlsZVNpemUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSWNjX1BBUkFNVFlQRV9QQVJBTToKKyAgICAgICAgc3dpdGNoIChwSWNjUGFyYW0tPkNvbG9yU3BhY2UpIHsKKyAgICAgICAgICBjYXNlIEljY0NTX1JnYjoKKyAgICAgICAgICAgIHBDYWNoZS0+bV9wUHJvZmlsZSA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSWNjX1BBUkFNVFlQRV9QQVJBTToKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChJRCwgMCwgMTYpOwotICAgICAgICAgICAgc3dpdGNoIChwSWNjUGFyYW0tPkNvbG9yU3BhY2UpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEljY0NTX0dyYXk6Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuRm9ybWF0KCIlbGYiLCBwSWNjUGFyYW0tPkdhbW1hKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTUQ1Q29tcHV0ZUlEKHRleHQuR2V0QnVmZmVyKDApLCB0ZXh0LkdldExlbmd0aCgpLCBJRCk7CisgICAgICAgICAgY2FzZSBJY2NDU19HcmF5OgorICAgICAgICAgICAgcENhY2hlLT5tX3BQcm9maWxlID0gQ3JlYXRlUHJvZmlsZV9HcmF5KHBJY2NQYXJhbS0+R2FtbWEpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICA7Ci0gICAgfQotICAgIGtleS5BcHBlbmRCbG9jayhJRCwgMTYpOwotICAgIENGWF9CeXRlU3RyaW5nIFByb2ZpbGVLZXkoa2V5LkdldEJ1ZmZlcigpLCBrZXkuR2V0U2l6ZSgpKTsKLSAgICBBU1NFUlQocFRyYW5zZm9ybUtleSk7Ci0gICAgcFRyYW5zZm9ybUtleS0+QXBwZW5kQmxvY2soUHJvZmlsZUtleS5HZXRCdWZmZXIoMCksIFByb2ZpbGVLZXkuR2V0TGVuZ3RoKCkpOwotICAgIGlmICghbV9NYXBQcm9maWxlLkxvb2t1cChQcm9maWxlS2V5LCAodm9pZComKXBDYWNoZSkpIHsKLSAgICAgICAgcENhY2hlID0gbmV3IENGWF9JY2NQcm9maWxlQ2FjaGU7Ci0gICAgICAgIHN3aXRjaCAocEljY1BhcmFtLT5kd1Byb2ZpbGVUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEljY19QQVJBTVRZUEVfQlVGRkVSOgotICAgICAgICAgICAgICAgIHBDYWNoZS0+bV9wUHJvZmlsZSA9IGNtc09wZW5Qcm9maWxlRnJvbU1lbShwSWNjUGFyYW0tPnBQcm9maWxlRGF0YSwgcEljY1BhcmFtLT5kd1Byb2ZpbGVTaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSWNjX1BBUkFNVFlQRV9QQVJBTToKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJY2NQYXJhbS0+Q29sb3JTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEljY0NTX1JnYjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDYWNoZS0+bV9wUHJvZmlsZSA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSWNjQ1NfR3JheToKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDYWNoZS0+bV9wUHJvZmlsZSA9IENyZWF0ZVByb2ZpbGVfR3JheShwSWNjUGFyYW0tPkdhbW1hKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgbV9NYXBQcm9maWxlLlNldEF0KFByb2ZpbGVLZXksIHBDYWNoZSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG1fTWFwUHJvZmlsZS5TZXRBdChQcm9maWxlS2V5LCBwQ2FjaGUpOworICB9IGVsc2UgeworICAgIHBDYWNoZS0+bV9kd1JhdGUrKzsKKyAgfQorICByZXR1cm4gcENhY2hlLT5tX3BQcm9maWxlOworfQordm9pZCogQ0NvZGVjX0ljY01vZHVsZTo6Q3JlYXRlVHJhbnNmb3JtKAorICAgIElDb2RlY19JY2NNb2R1bGU6OkljY1BhcmFtKiBwSW5wdXRQYXJhbSwKKyAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcE91dHB1dFBhcmFtLAorICAgIElDb2RlY19JY2NNb2R1bGU6OkljY1BhcmFtKiBwUHJvb2ZQYXJhbSwKKyAgICBGWF9EV09SRCBkd0ludGVudCwKKyAgICBGWF9EV09SRCBkd0ZsYWcsCisgICAgRlhfRFdPUkQgZHdQcmZJbnRlbnQsCisgICAgRlhfRFdPUkQgZHdQcmZGbGFnKSB7CisgIENMY21zQ21tKiBwQ21tID0gTlVMTDsKKyAgQVNTRVJUKHBJbnB1dFBhcmFtICYmIHBPdXRwdXRQYXJhbSk7CisgIENGWF9CeXRlU3RyaW5nS2V5IGtleTsKKyAgdm9pZCogcElucHV0UHJvZmlsZSA9IENyZWF0ZVByb2ZpbGUocElucHV0UGFyYW0sIEljY19DTEFTU19JTlBVVCwgJmtleSk7CisgIGlmIChwSW5wdXRQcm9maWxlID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB2b2lkKiBwT3V0cHV0UHJvZmlsZSA9IENyZWF0ZVByb2ZpbGUocE91dHB1dFBhcmFtLCBJY2NfQ0xBU1NfT1VUUFVULCAma2V5KTsKKyAgaWYgKHBPdXRwdXRQcm9maWxlID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWF9EV09SRCBkd0lucHV0UHJvZmlsZVR5cGUgPQorICAgICAgVHJhbnNmZXJQcm9maWxlVHlwZShwSW5wdXRQcm9maWxlLCBwSW5wdXRQYXJhbS0+ZHdGb3JtYXQpOworICBGWF9EV09SRCBkd091dHB1dFByb2ZpbGVUeXBlID0KKyAgICAgIFRyYW5zZmVyUHJvZmlsZVR5cGUocE91dHB1dFByb2ZpbGUsIHBPdXRwdXRQYXJhbS0+ZHdGb3JtYXQpOworICBpZiAoZHdJbnB1dFByb2ZpbGVUeXBlID09IDAgfHwgZHdPdXRwdXRQcm9maWxlVHlwZSA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgdm9pZCogcFByb29mUHJvZmlsZSA9IE5VTEw7CisgIGlmIChwUHJvb2ZQYXJhbSkgeworICAgIHBQcm9vZlByb2ZpbGUgPSBDcmVhdGVQcm9maWxlKHBQcm9vZlBhcmFtLCBJY2NfQ0xBU1NfUFJPT0YsICZrZXkpOworICB9CisgIGtleSA8PCBkd0lucHV0UHJvZmlsZVR5cGUgPDwgZHdPdXRwdXRQcm9maWxlVHlwZSA8PCBkd0ludGVudCA8PCBkd0ZsYWcKKyAgICAgIDw8IChwUHJvb2ZQcm9maWxlICE9IE5VTEwpIDw8IGR3UHJmSW50ZW50IDw8IGR3UHJmRmxhZzsKKyAgQ0ZYX0J5dGVTdHJpbmdDIFRyYW5zZm9ybUtleShrZXkuR2V0QnVmZmVyKCksIGtleS5HZXRTaXplKCkpOworICBDRlhfSWNjVHJhbnNmb3JtQ2FjaGUqIHBUcmFuc2Zvcm1DYWNoZTsKKyAgaWYgKCFtX01hcFRyYW5mb3JtLkxvb2t1cChUcmFuc2Zvcm1LZXksICh2b2lkKiYpcFRyYW5zZm9ybUNhY2hlKSkgeworICAgIHBDbW0gPSBGWF9BbGxvYyhDTGNtc0NtbSwgMSk7CisgICAgcENtbS0+bV9uU3JjQ29tcG9uZW50cyA9IFRfQ0hBTk5FTFMoZHdJbnB1dFByb2ZpbGVUeXBlKTsKKyAgICBwQ21tLT5tX25Ec3RDb21wb25lbnRzID0gVF9DSEFOTkVMUyhkd091dHB1dFByb2ZpbGVUeXBlKTsKKyAgICBwQ21tLT5tX2JMYWIgPSBUX0NPTE9SU1BBQ0UocElucHV0UGFyYW0tPmR3Rm9ybWF0KSA9PSBQVF9MYWI7CisgICAgcFRyYW5zZm9ybUNhY2hlID0gbmV3IENGWF9JY2NUcmFuc2Zvcm1DYWNoZShwQ21tKTsKKyAgICBpZiAocFByb29mUHJvZmlsZSkgeworICAgICAgcFRyYW5zZm9ybUNhY2hlLT5tX3BJY2NUcmFuc2Zvcm0gPSBjbXNDcmVhdGVQcm9vZmluZ1RyYW5zZm9ybSgKKyAgICAgICAgICBwSW5wdXRQcm9maWxlLCBkd0lucHV0UHJvZmlsZVR5cGUsIHBPdXRwdXRQcm9maWxlLAorICAgICAgICAgIGR3T3V0cHV0UHJvZmlsZVR5cGUsIHBQcm9vZlByb2ZpbGUsIGR3SW50ZW50LCBkd1ByZkludGVudCwgZHdQcmZGbGFnKTsKICAgICB9IGVsc2UgewotICAgICAgICBwQ2FjaGUtPm1fZHdSYXRlKys7CisgICAgICBwVHJhbnNmb3JtQ2FjaGUtPm1fcEljY1RyYW5zZm9ybSA9CisgICAgICAgICAgY21zQ3JlYXRlVHJhbnNmb3JtKHBJbnB1dFByb2ZpbGUsIGR3SW5wdXRQcm9maWxlVHlwZSwgcE91dHB1dFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3T3V0cHV0UHJvZmlsZVR5cGUsIGR3SW50ZW50LCBkd0ZsYWcpOwogICAgIH0KLSAgICByZXR1cm4gcENhY2hlLT5tX3BQcm9maWxlOworICAgIHBDbW0tPm1faFRyYW5zZm9ybSA9IHBUcmFuc2Zvcm1DYWNoZS0+bV9wSWNjVHJhbnNmb3JtOworICAgIG1fTWFwVHJhbmZvcm0uU2V0QXQoVHJhbnNmb3JtS2V5LCBwVHJhbnNmb3JtQ2FjaGUpOworICB9IGVsc2UgeworICAgIHBUcmFuc2Zvcm1DYWNoZS0+bV9kd1JhdGUrKzsKKyAgfQorICByZXR1cm4gcFRyYW5zZm9ybUNhY2hlLT5tX3BDbW07CiB9Ci12b2lkKiBDQ29kZWNfSWNjTW9kdWxlOjpDcmVhdGVUcmFuc2Zvcm0oSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBJbnB1dFBhcmFtLAotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcE91dHB1dFBhcmFtLAotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcFByb29mUGFyYW0sCi0gICAgICAgIEZYX0RXT1JEIGR3SW50ZW50LCBGWF9EV09SRCBkd0ZsYWcsIEZYX0RXT1JEIGR3UHJmSW50ZW50LCBGWF9EV09SRCBkd1ByZkZsYWcpCi17Ci0gICAgQ0xjbXNDbW0qIHBDbW0gPSBOVUxMOwotICAgIEFTU0VSVChwSW5wdXRQYXJhbSAmJiBwT3V0cHV0UGFyYW0pOwotICAgIENGWF9CeXRlU3RyaW5nS2V5IGtleTsKLSAgICB2b2lkKiBwSW5wdXRQcm9maWxlID0gQ3JlYXRlUHJvZmlsZShwSW5wdXRQYXJhbSwgSWNjX0NMQVNTX0lOUFVULCAma2V5KTsKLSAgICBpZiAocElucHV0UHJvZmlsZSA9PSBOVUxMKQl7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2b2lkKiBwT3V0cHV0UHJvZmlsZSA9IENyZWF0ZVByb2ZpbGUocE91dHB1dFBhcmFtLCBJY2NfQ0xBU1NfT1VUUFVULCAma2V5KTsKLSAgICBpZiAocE91dHB1dFByb2ZpbGUgPT0gTlVMTCkJewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfRFdPUkQgZHdJbnB1dFByb2ZpbGVUeXBlID0gVHJhbnNmZXJQcm9maWxlVHlwZShwSW5wdXRQcm9maWxlLCBwSW5wdXRQYXJhbS0+ZHdGb3JtYXQpOwotICAgIEZYX0RXT1JEIGR3T3V0cHV0UHJvZmlsZVR5cGUgPSBUcmFuc2ZlclByb2ZpbGVUeXBlKHBPdXRwdXRQcm9maWxlLCBwT3V0cHV0UGFyYW0tPmR3Rm9ybWF0KTsKLSAgICBpZiAoZHdJbnB1dFByb2ZpbGVUeXBlID09IDAgfHwgZHdPdXRwdXRQcm9maWxlVHlwZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2b2lkKiBwUHJvb2ZQcm9maWxlID0gTlVMTDsKLSAgICBpZiAocFByb29mUGFyYW0pIHsKLSAgICAgICAgcFByb29mUHJvZmlsZSA9IENyZWF0ZVByb2ZpbGUocFByb29mUGFyYW0sIEljY19DTEFTU19QUk9PRiwgJmtleSk7Ci0gICAgfQotICAgIGtleSA8PCBkd0lucHV0UHJvZmlsZVR5cGUgPDwgZHdPdXRwdXRQcm9maWxlVHlwZSA8PCBkd0ludGVudCA8PCBkd0ZsYWcgPDwgKHBQcm9vZlByb2ZpbGUgIT0gTlVMTCkgPDwgZHdQcmZJbnRlbnQgPDwgZHdQcmZGbGFnOwotICAgIENGWF9CeXRlU3RyaW5nQyBUcmFuc2Zvcm1LZXkoa2V5LkdldEJ1ZmZlcigpLCBrZXkuR2V0U2l6ZSgpKTsKLSAgICBDRlhfSWNjVHJhbnNmb3JtQ2FjaGUqIHBUcmFuc2Zvcm1DYWNoZTsKLSAgICBpZiAoIW1fTWFwVHJhbmZvcm0uTG9va3VwKFRyYW5zZm9ybUtleSwgKHZvaWQqJilwVHJhbnNmb3JtQ2FjaGUpKSB7Ci0gICAgICAgIHBDbW0gPSBGWF9BbGxvYyhDTGNtc0NtbSwgMSk7Ci0gICAgICAgIHBDbW0tPm1fblNyY0NvbXBvbmVudHMgPSBUX0NIQU5ORUxTKGR3SW5wdXRQcm9maWxlVHlwZSk7Ci0gICAgICAgIHBDbW0tPm1fbkRzdENvbXBvbmVudHMgPSBUX0NIQU5ORUxTKGR3T3V0cHV0UHJvZmlsZVR5cGUpOwotICAgICAgICBwQ21tLT5tX2JMYWIgPSBUX0NPTE9SU1BBQ0UocElucHV0UGFyYW0tPmR3Rm9ybWF0KSA9PSBQVF9MYWI7Ci0gICAgICAgIHBUcmFuc2Zvcm1DYWNoZSA9IG5ldyBDRlhfSWNjVHJhbnNmb3JtQ2FjaGUocENtbSk7Ci0gICAgICAgIGlmIChwUHJvb2ZQcm9maWxlKSB7Ci0gICAgICAgICAgICBwVHJhbnNmb3JtQ2FjaGUtPm1fcEljY1RyYW5zZm9ybSA9IGNtc0NyZWF0ZVByb29maW5nVHJhbnNmb3JtKHBJbnB1dFByb2ZpbGUsIGR3SW5wdXRQcm9maWxlVHlwZSwgcE91dHB1dFByb2ZpbGUsIGR3T3V0cHV0UHJvZmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9vZlByb2ZpbGUsIGR3SW50ZW50LCBkd1ByZkludGVudCwgZHdQcmZGbGFnKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBUcmFuc2Zvcm1DYWNoZS0+bV9wSWNjVHJhbnNmb3JtID0gY21zQ3JlYXRlVHJhbnNmb3JtKHBJbnB1dFByb2ZpbGUsIGR3SW5wdXRQcm9maWxlVHlwZSwgcE91dHB1dFByb2ZpbGUsIGR3T3V0cHV0UHJvZmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3SW50ZW50LCBkd0ZsYWcpOwotICAgICAgICB9Ci0gICAgICAgIHBDbW0tPm1faFRyYW5zZm9ybSA9IHBUcmFuc2Zvcm1DYWNoZS0+bV9wSWNjVHJhbnNmb3JtOwotICAgICAgICBtX01hcFRyYW5mb3JtLlNldEF0KFRyYW5zZm9ybUtleSwgcFRyYW5zZm9ybUNhY2hlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwVHJhbnNmb3JtQ2FjaGUtPm1fZHdSYXRlKys7Ci0gICAgfQotICAgIHJldHVybiBwVHJhbnNmb3JtQ2FjaGUtPm1fcENtbTsKK0NDb2RlY19JY2NNb2R1bGU6On5DQ29kZWNfSWNjTW9kdWxlKCkgeworICBGWF9QT1NJVElPTiBwb3MgPSBtX01hcFByb2ZpbGUuR2V0U3RhcnRQb3NpdGlvbigpOworICBDRlhfQnl0ZVN0cmluZyBrZXk7CisgIENGWF9JY2NQcm9maWxlQ2FjaGUqIHBQcm9maWxlQ2FjaGU7CisgIHdoaWxlIChwb3MpIHsKKyAgICBtX01hcFByb2ZpbGUuR2V0TmV4dEFzc29jKHBvcywga2V5LCAodm9pZComKXBQcm9maWxlQ2FjaGUpOworICAgIGRlbGV0ZSBwUHJvZmlsZUNhY2hlOworICB9CisgIHBvcyA9IG1fTWFwVHJhbmZvcm0uR2V0U3RhcnRQb3NpdGlvbigpOworICBDRlhfSWNjVHJhbnNmb3JtQ2FjaGUqIHBUcmFuc2Zvcm1DYWNoZTsKKyAgd2hpbGUgKHBvcykgeworICAgIG1fTWFwVHJhbmZvcm0uR2V0TmV4dEFzc29jKHBvcywga2V5LCAodm9pZComKXBUcmFuc2Zvcm1DYWNoZSk7CisgICAgZGVsZXRlIHBUcmFuc2Zvcm1DYWNoZTsKKyAgfQogfQotQ0NvZGVjX0ljY01vZHVsZTo6fkNDb2RlY19JY2NNb2R1bGUoKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fTWFwUHJvZmlsZS5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcga2V5OwotICAgIENGWF9JY2NQcm9maWxlQ2FjaGUqIHBQcm9maWxlQ2FjaGU7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBtX01hcFByb2ZpbGUuR2V0TmV4dEFzc29jKHBvcywga2V5LCAodm9pZComKXBQcm9maWxlQ2FjaGUpOwotICAgICAgICBkZWxldGUgcFByb2ZpbGVDYWNoZTsKLSAgICB9Ci0gICAgcG9zID0gbV9NYXBUcmFuZm9ybS5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgQ0ZYX0ljY1RyYW5zZm9ybUNhY2hlKiBwVHJhbnNmb3JtQ2FjaGU7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBtX01hcFRyYW5mb3JtLkdldE5leHRBc3NvYyhwb3MsIGtleSwgKHZvaWQqJilwVHJhbnNmb3JtQ2FjaGUpOwotICAgICAgICBkZWxldGUgcFRyYW5zZm9ybUNhY2hlOwotICAgIH0KK3ZvaWQqIENDb2RlY19JY2NNb2R1bGU6OkNyZWF0ZVRyYW5zZm9ybV9zUkdCKGNvbnN0IHVpbnQ4X3QqIHBQcm9maWxlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UHJvZmlsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTcmNGb3JtYXQpIHsKKyAgcmV0dXJuIEljY0xpYl9DcmVhdGVUcmFuc2Zvcm1fc1JHQihwUHJvZmlsZURhdGEsIGR3UHJvZmlsZVNpemUsIG5Db21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudCwgZHdTcmNGb3JtYXQpOwogfQotdm9pZCogQ0NvZGVjX0ljY01vZHVsZTo6Q3JlYXRlVHJhbnNmb3JtX3NSR0IoY29uc3QgdWludDhfdCogcFByb2ZpbGVEYXRhLCBGWF9EV09SRCBkd1Byb2ZpbGVTaXplLCBpbnQzMl90JiBuQ29tcG9uZW50cywgaW50MzJfdCBpbnRlbnQsIEZYX0RXT1JEIGR3U3JjRm9ybWF0KQotewotICAgIHJldHVybiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtX3NSR0IocFByb2ZpbGVEYXRhLCBkd1Byb2ZpbGVTaXplLCBuQ29tcG9uZW50cywgaW50ZW50LCBkd1NyY0Zvcm1hdCk7Cit2b2lkKiBDQ29kZWNfSWNjTW9kdWxlOjpDcmVhdGVUcmFuc2Zvcm1fQ01ZSyhjb25zdCB1aW50OF90KiBwU3JjUHJvZmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY1Byb2ZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblNyY0NvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwRHN0UHJvZmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0RzdFByb2ZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RHN0Rm9ybWF0KSB7CisgIHJldHVybiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtKAorICAgICAgcFNyY1Byb2ZpbGVEYXRhLCBkd1NyY1Byb2ZpbGVTaXplLCBuU3JjQ29tcG9uZW50cywgcERzdFByb2ZpbGVEYXRhLAorICAgICAgZHdEc3RQcm9maWxlU2l6ZSwgNCwgaW50ZW50LCBkd1NyY0Zvcm1hdCwgZHdEc3RGb3JtYXQpOwogfQotdm9pZCogQ0NvZGVjX0ljY01vZHVsZTo6Q3JlYXRlVHJhbnNmb3JtX0NNWUsoY29uc3QgdWludDhfdCogcFNyY1Byb2ZpbGVEYXRhLCBGWF9EV09SRCBkd1NyY1Byb2ZpbGVTaXplLCBpbnQzMl90JiBuU3JjQ29tcG9uZW50cywKLSAgICBjb25zdCB1aW50OF90KiBwRHN0UHJvZmlsZURhdGEsIEZYX0RXT1JEIGR3RHN0UHJvZmlsZVNpemUsIGludDMyX3QgaW50ZW50LAotICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCAsIEZYX0RXT1JEIGR3RHN0Rm9ybWF0KQotewotICAgIHJldHVybiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtKHBTcmNQcm9maWxlRGF0YSwgZHdTcmNQcm9maWxlU2l6ZSwgblNyY0NvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdFByb2ZpbGVEYXRhLCBkd0RzdFByb2ZpbGVTaXplLCA0LCBpbnRlbnQsIGR3U3JjRm9ybWF0LCBkd0RzdEZvcm1hdCk7Cit2b2lkIENDb2RlY19JY2NNb2R1bGU6OkRlc3Ryb3lUcmFuc2Zvcm0odm9pZCogcFRyYW5zZm9ybSkgeworICBJY2NMaWJfRGVzdHJveVRyYW5zZm9ybShwVHJhbnNmb3JtKTsKIH0KLXZvaWQgQ0NvZGVjX0ljY01vZHVsZTo6RGVzdHJveVRyYW5zZm9ybSh2b2lkKiBwVHJhbnNmb3JtKQotewotICAgIEljY0xpYl9EZXN0cm95VHJhbnNmb3JtKHBUcmFuc2Zvcm0pOwordm9pZCBDQ29kZWNfSWNjTW9kdWxlOjpUcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwU3JjVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBEZXN0VmFsdWVzKSB7CisgIEljY0xpYl9UcmFuc2xhdGUocFRyYW5zZm9ybSwgbV9uQ29tcG9uZW50cywgcFNyY1ZhbHVlcywgcERlc3RWYWx1ZXMpOwogfQotdm9pZCBDQ29kZWNfSWNjTW9kdWxlOjpUcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwgRlhfRkxPQVQqIHBTcmNWYWx1ZXMsIEZYX0ZMT0FUKiBwRGVzdFZhbHVlcykKLXsKLSAgICBJY2NMaWJfVHJhbnNsYXRlKHBUcmFuc2Zvcm0sIG1fbkNvbXBvbmVudHMsIHBTcmNWYWx1ZXMsIHBEZXN0VmFsdWVzKTsKLX0KLXZvaWQgQ0NvZGVjX0ljY01vZHVsZTo6VHJhbnNsYXRlU2NhbmxpbmUodm9pZCogcFRyYW5zZm9ybSwgdWludDhfdCogcERlc3QsIGNvbnN0IHVpbnQ4X3QqIHBTcmMsIGludDMyX3QgcGl4ZWxzKQotewotICAgIEljY0xpYl9UcmFuc2xhdGVJbWFnZShwVHJhbnNmb3JtLCBwRGVzdCwgcFNyYywgcGl4ZWxzKTsKK3ZvaWQgQ0NvZGVjX0ljY01vZHVsZTo6VHJhbnNsYXRlU2NhbmxpbmUodm9pZCogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGl4ZWxzKSB7CisgIEljY0xpYl9UcmFuc2xhdGVJbWFnZShwVHJhbnNmb3JtLCBwRGVzdCwgcFNyYywgcGl4ZWxzKTsKIH0KIGNvbnN0IHVpbnQ4X3QgZ19DTVlLU2FtcGxlc1s4MSAqIDgxICogM10gPSB7Ci0gICAgMjU1LCAyNTUsIDI1NSwgMjI1LCAyMjYsIDIyOCwgMTk5LCAyMDAsIDIwMiwgMTczLCAxNzQsIDE3OCwgMTQ3LCAxNDksIDE1MiwgMTIzLCAxMjUsIDEyOCwgIDk5LCA5OSwgMTAyLCAgNjksIDcwLCA3MSwgIDM0LCAzMCwgMzEsCi0gICAgMjU1LCAyNTMsIDIyOSwgMjI2LCAyMjQsIDIwMywgMjAwLCAxOTksIDE4MiwgMTczLCAxNzMsIDE1OCwgMTQ5LCAxNDgsIDEzNSwgMTI1LCAxMjQsIDExMywgIDk5LCA5OSwgOTAsICA3MCwgNjksIDYzLCAgMzMsIDI5LCAyNCwKLSAgICAyNTUsIDI1MSwgMjA0LCAyMjgsIDIyMywgMTgyLCAyMDEsIDE5OCwgMTYzLCAxNzQsIDE3MiwgMTQyLCAxNTAsIDE0NywgMTIyLCAxMjUsIDEyMywgMTAxLCAgOTksIDk4LCA4MCwgIDcwLCA2OCwgNTQsICAzMiwgMjgsIDE2LAotICAgIDI1NSwgMjQ5LCAxNzksIDIzMCwgMjIyLCAxNjAsIDIwMywgMTk3LCAxNDQsIDE3NCwgMTcwLCAxMjQsIDE1MCwgMTQ1LCAxMDUsIDEyNSwgMTIyLCA4OCwgIDk5LCA5NywgNjksICA3MCwgNjgsIDQ2LCAgMzEsIDI4LCAgNiwKLSAgICAyNTUsIDI0NywgMTU0LCAyMjksIDIyMCwgMTM4LCAyMDMsIDE5NSwgMTIyLCAxNzYsIDE2OSwgMTA3LCAxNTAsIDE0NSwgOTEsIDEyNSwgMTIxLCA3NCwgMTAwLCA5NiwgNTcsICA3MCwgNjcsIDM1LCAgMjksIDI2LCAgMCwKLSAgICAyNTUsIDI0NiwgMTI4LCAyMzEsIDIxNywgMTE0LCAyMDUsIDE5NCwgMTAxLCAxNzYsIDE2NywgODgsIDE1MCwgMTQ0LCA3NSwgMTI1LCAxMjAsIDYwLCAxMDAsIDk2LCA0NCwgIDcwLCA2NiwgMjQsICAyOCwgMjYsICAwLAotICAgIDI1NSwgMjQ0LCA5NiwgMjMxLCAyMTcsIDg3LCAyMDMsIDE5MiwgNzgsIDE3NSwgMTY3LCA2NiwgMTUwLCAxNDMsIDU2LCAxMjUsIDExOSwgNDMsIDEwMCwgOTUsIDI5LCAgNjksIDY2LCAgNywgIDI2LCAyNiwgIDAsCi0gICAgMjU1LCAyNDMsIDUxLCAyMzIsIDIxNSwgNTEsIDIwNCwgMTkxLCA0MywgMTc2LCAxNjUsIDM4LCAxNTAsIDE0MiwgMjgsIDEyNSwgMTE4LCAxNywgIDk5LCA5NCwgIDAsICA2OCwgNjUsICAwLCAgMjQsIDI1LCAgMCwKLSAgICAyNTUsIDI0MSwgIDAsIDIzMSwgMjE1LCAgMCwgMjAzLCAxOTAsICAwLCAxNzYsIDE2NCwgIDAsIDE1MCwgMTQxLCAgMCwgMTI2LCAxMTcsICAwLCAgOTksIDkzLCAgMCwgIDY4LCA2NSwgIDAsICAyNCwgMjUsICAwLAotICAgIDI1MiwgMjI4LCAyMzgsIDIyMiwgMjAxLCAyMTEsIDE5NywgMTgwLCAxOTAsIDE3MSwgMTU2LCAxNjYsIDE0NywgMTMzLCAxNDMsIDEyMywgMTExLCAxMTksICA5OSwgODgsIDk0LCAgNzEsIDYxLCA2NiwgIDM0LCAyMiwgMjYsCi0gICAgMjU0LCAyMjYsIDIxMywgMjI0LCAyMDEsIDE5MSwgMTk5LCAxNzksIDE3MSwgMTcyLCAxNTUsIDE0OCwgMTQ3LCAxMzMsIDEyOCwgMTIzLCAxMTAsIDEwNiwgIDk4LCA4NywgODMsICA3MCwgNTksIDU3LCAgMzMsIDIxLCAxOCwKLSAgICAyNTQsIDIyNCwgMTkxLCAyMjQsIDE5OSwgMTcyLCAyMDAsIDE3NywgMTUzLCAxNzMsIDE1NCwgMTMzLCAxNDcsIDEzMiwgMTE1LCAxMjMsIDEwOSwgOTQsICA5OCwgODYsIDc0LCAgNzAsIDU5LCA0OSwgIDMyLCAyMSwgIDksCi0gICAgMjU1LCAyMjIsIDE2OCwgMjI3LCAxOTgsIDE1MCwgMjAwLCAxNzUsIDEzNSwgMTczLCAxNTMsIDExOCwgMTQ4LCAxMzAsIDk5LCAxMjMsIDEwOSwgODIsICA5OCwgODYsIDY0LCAgNjksIDU4LCA0MCwgIDMxLCAxOSwgIDAsCi0gICAgMjU1LCAyMjEsIDE0NSwgMjI3LCAxOTYsIDEyOSwgMjAxLCAxNzQsIDExNSwgMTczLCAxNTEsIDk5LCAxNDgsIDEyOSwgODUsIDEyNCwgMTA4LCA2OSwgIDk4LCA4NSwgNTIsICA2OSwgNTgsIDMwLCAgMzAsIDE5LCAgMCwKLSAgICAyNTUsIDIxOSwgMTIxLCAyMjcsIDE5NSwgMTA5LCAyMDEsIDE3NCwgOTcsIDE3NCwgMTUwLCA4MywgMTQ4LCAxMjksIDcwLCAxMjQsIDEwNywgNTUsICA5OCwgODQsIDQwLCAgNjksIDU4LCAxOSwgIDI4LCAxOCwgIDAsCi0gICAgMjU1LCAyMTgsIDkyLCAyMjksIDE5NCwgODIsIDIwMiwgMTczLCA3NSwgMTc0LCAxNTAsIDYzLCAxNDksIDEyOCwgNTEsIDEyNCwgMTA2LCAzOSwgIDk4LCA4NCwgMjQsICA2OCwgNTcsICAzLCAgMjYsIDE4LCAgMCwKLSAgICAyNTUsIDIxNywgNTQsIDIyOCwgMTkzLCA1MiwgMjAxLCAxNzIsIDQ2LCAxNzQsIDE0OCwgMzYsIDE0OCwgMTI3LCAyNywgMTIzLCAxMDUsIDE0LCAgOTgsIDgzLCAgMCwgIDY4LCA1NiwgIDAsICAyNSwgMTgsICAwLAotICAgIDI1NSwgMjE2LCAgMCwgMjI5LCAxOTIsICAyLCAyMDIsIDE3MSwgIDQsIDE3MywgMTQ4LCAgMCwgMTQ4LCAxMjYsICAwLCAxMjQsIDEwNSwgIDAsICA5OCwgODMsICAwLCAgNjgsIDU2LCAgMCwgIDI0LCAxNywgIDAsCi0gICAgMjQ5LCAyMDQsIDIyMywgMjE5LCAxODEsIDE5OSwgMTk1LCAxNjAsIDE3OCwgMTcwLCAxNDAsIDE1NiwgMTQ2LCAxMTksIDEzNCwgMTIzLCA5OSwgMTEyLCAgOTgsIDc3LCA4OCwgIDcwLCA1MiwgNjEsICAzNCwgMTEsIDIwLAotICAgIDI1MCwgMjAxLCAyMDAsIDIyMSwgMTgwLCAxNzgsIDE5NywgMTU5LCAxNjEsIDE3MSwgMTM5LCAxMzksIDE0NywgMTE5LCAxMjAsIDEyMywgOTgsIDk5LCAgOTgsIDc3LCA3OCwgIDY5LCA1MSwgNTIsICAzNCwgMTEsIDEwLAotICAgIDI1MiwgMjAxLCAxODAsIDIyMywgMTc5LCAxNjIsIDE5NywgMTU5LCAxNDQsIDE3MCwgMTM4LCAxMjUsIDE0NiwgMTE3LCAxMDcsIDEyMiwgOTcsIDg5LCAgOTgsIDc2LCA2OSwgIDY5LCA1MCwgNDQsICAzMiwgMTEsICAyLAotICAgIDI1MiwgMTk5LCAxNTgsIDIyMiwgMTc3LCAxNDMsIDE5OSwgMTU4LCAxMjcsIDE3MSwgMTM3LCAxMTAsIDE0NywgMTE3LCA5MywgMTIyLCA5NiwgNzYsICA5NywgNzUsIDU4LCAgNjksIDUwLCAzNiwgIDMyLCAxMCwgIDAsCi0gICAgMjUzLCAxOTgsIDEzNywgMjIzLCAxNzcsIDEyMywgMTk4LCAxNTYsIDExMCwgMTcxLCAxMzYsIDk1LCAxNDYsIDExNiwgODAsIDEyMiwgOTYsIDY1LCAgOTcsIDc1LCA0NywgIDY5LCA1MCwgMjUsICAzMCwgMTAsICAwLAotICAgIDI1NCwgMTk3LCAxMTUsIDIyNSwgMTc1LCAxMDQsIDE5OCwgMTU2LCA5MiwgMTcyLCAxMzUsIDc5LCAxNDcsIDExNSwgNjYsIDEyMywgOTUsIDUyLCAgOTgsIDc0LCAzNywgIDY5LCA0OSwgMTUsICAyOSwgMTAsICAwLAotICAgIDI1NCwgMTk2LCA4OSwgMjI0LCAxNzUsIDgwLCAxOTksIDE1NCwgNzAsIDE3MiwgMTM0LCA1OSwgMTQ2LCAxMTQsIDQ4LCAxMjIsIDk1LCAzNiwgIDk3LCA3NCwgMjEsICA2OCwgNDksICAwLCAgMjcsICA5LCAgMCwKLSAgICAyNTUsIDE5NSwgNTcsIDIyNSwgMTczLCA1MiwgMTk4LCAxNTQsIDQ0LCAxNzIsIDEzMywgMzYsIDE0NywgMTEzLCAyNiwgMTIzLCA5NCwgMTQsICA5OCwgNzQsICAwLCAgNjgsIDQ5LCAgMCwgIDI2LCAxMCwgIDAsCi0gICAgMjU0LCAxOTQsIDE1LCAyMjUsIDE3MiwgMTIsIDE5OCwgMTUzLCAgNywgMTcyLCAxMzIsICAzLCAxNDYsIDExMywgIDAsIDEyMywgOTMsICAwLCAgOTgsIDczLCAgMCwgIDY4LCA0OSwgIDAsICAyNiwgIDksICAwLAotICAgIDI0NiwgMTc4LCAyMDksIDIxOCwgMTU5LCAxODYsIDE5NCwgMTQwLCAxNjYsIDE2OCwgMTIyLCAxNDUsIDE0NCwgMTA0LCAxMjUsIDEyMSwgODUsIDEwMywgIDk3LCA2NSwgODEsICA2OSwgNDEsIDU1LCAgMzQsICAwLCAxMiwKLSAgICAyNDgsIDE3NiwgMTg2LCAyMTksIDE1NywgMTY2LCAxOTUsIDEzOSwgMTQ5LCAxNjgsIDEyMSwgMTMwLCAxNDQsIDEwMywgMTExLCAxMjEsIDg1LCA5MSwgIDk3LCA2NSwgNzEsICA2OSwgNDEsIDQ2LCAgMzQsICAwLCAgNCwKLSAgICAyNDksIDE3NSwgMTY4LCAyMjAsIDE1NiwgMTUwLCAxOTYsIDEzOSwgMTM1LCAxNjksIDEyMSwgMTE2LCAxNDQsIDEwMywgMTAwLCAxMjIsIDg0LCA4MywgIDk4LCA2NSwgNjMsICA3MCwgNDEsIDM5LCAgMzMsICAwLCAgMCwKLSAgICAyNDksIDE3NSwgMTQ4LCAyMjAsIDE1NSwgMTMzLCAxOTYsIDEzOCwgMTE5LCAxNjksIDEyMCwgMTAzLCAxNDUsIDEwMSwgODcsIDEyMSwgODMsIDcxLCAgOTcsIDY1LCA1NCwgIDY5LCA0MSwgMzEsICAzMiwgIDAsICAwLAotICAgIDI0OSwgMTczLCAxMjgsIDIyMiwgMTU0LCAxMTUsIDE5NSwgMTM3LCAxMDIsIDE3MCwgMTE5LCA4OCwgMTQ1LCAxMDEsIDc0LCAxMjIsIDgzLCA1OSwgIDk3LCA2NCwgNDMsICA2OCwgNDAsIDIwLCAgMzAsICAwLCAgMCwKLSAgICAyNTAsIDE3MiwgMTA4LCAyMjEsIDE1NCwgOTgsIDE5NSwgMTM2LCA4NiwgMTcwLCAxMTgsIDczLCAxNDUsIDEwMCwgNjEsIDEyMiwgODIsIDQ4LCAgOTcsIDYzLCAzMiwgIDY5LCA0MCwgMTEsICAyOCwgIDAsICAwLAotICAgIDI1MCwgMTcxLCA4NSwgMjIxLCAxNTMsIDc2LCAxOTYsIDEzNiwgNjcsIDE3MCwgMTE3LCA1NiwgMTQ1LCA5OSwgNDQsIDEyMSwgODIsIDMzLCAgOTcsIDYzLCAxNywgIDY4LCA0MCwgIDAsICAyOCwgIDAsICAwLAotICAgIDI1MSwgMTcxLCA1OCwgMjIyLCAxNTIsIDUwLCAxOTcsIDEzNSwgNDMsIDE2OSwgMTE3LCAzNCwgMTQ2LCA5OSwgMjUsIDEyMSwgODEsIDEwLCAgOTYsIDYzLCAgMCwgIDY4LCA0MCwgIDAsICAyNywgIDAsICAwLAotICAgIDI1MCwgMTcwLCAyNiwgMjIyLCAxNTEsIDE5LCAxOTYsIDEzNCwgMTMsIDE2OSwgMTE2LCAgNCwgMTQ1LCA5OSwgIDAsIDEyMiwgODEsICAwLCAgOTcsIDYzLCAgMCwgIDY3LCA0MCwgIDAsICAyNiwgIDAsICAwLAotICAgIDI0NCwgMTUzLCAxOTQsIDIxNSwgMTM2LCAxNzMsIDE5MiwgMTIxLCAxNTUsIDE2NywgMTA0LCAxMzUsIDE0MywgODksIDExNSwgMTIxLCA3MiwgOTYsICA5NywgNTQsIDc1LCAgNzAsIDMxLCA0OSwgIDM0LCAgMCwgIDYsCi0gICAgMjQ1LCAxNTMsIDE3MywgMjE2LCAxMzYsIDE1NSwgMTkyLCAxMjAsIDEzOCwgMTY3LCAxMDQsIDEyMSwgMTQ0LCA4OCwgMTAzLCAxMjEsIDcxLCA4NSwgIDk3LCA1NCwgNjYsICA2OSwgMzEsIDQyLCAgMzQsICAwLCAgMCwKLSAgICAyNDYsIDE1MiwgMTU3LCAyMTcsIDEzNSwgMTQwLCAxOTMsIDEyMCwgMTI2LCAxNjcsIDEwMywgMTA5LCAxNDMsIDg4LCA5MiwgMTIxLCA3MiwgNzYsICA5NywgNTQsIDU4LCAgNjksIDMxLCAzNSwgIDMzLCAgMCwgIDAsCi0gICAgMjQ1LCAxNTAsIDEzOSwgMjE4LCAxMzQsIDEyNSwgMTkzLCAxMTksIDExMSwgMTY3LCAxMDMsIDk2LCAxNDQsIDg3LCA4MCwgMTIxLCA3MSwgNjYsICA5NiwgNTMsIDQ5LCAgNjgsIDMxLCAyNiwgIDMyLCAgMCwgIDAsCi0gICAgMjQ2LCAxNTEsIDEyMiwgMjE4LCAxMzMsIDEwOCwgMTk0LCAxMTgsIDk2LCAxNjgsIDEwMiwgODEsIDE0NCwgODYsIDY5LCAxMjAsIDcxLCA1NSwgIDk1LCA1MywgMzksICA2OCwgMzAsIDE3LCAgMzEsICAwLCAgMCwKLSAgICAyNDgsIDE1MCwgMTAzLCAyMTgsIDEzMywgOTEsIDE5MywgMTE4LCA4MSwgMTY4LCAxMDIsIDY5LCAxNDMsIDg2LCA1NiwgMTIwLCA3MCwgNDMsICA5NiwgNTMsIDI4LCAgNjgsIDMxLCAgNiwgIDI5LCAgMCwgIDAsCi0gICAgMjQ3LCAxNDksIDgxLCAyMTgsIDEzMiwgNzIsIDE5NCwgMTE3LCA2MiwgMTY4LCAxMDEsIDUyLCAxNDQsIDg2LCA0MiwgMTIxLCA3MCwgMjksICA5NiwgNTIsIDEzLCAgNjgsIDMwLCAgMCwgIDI4LCAgMCwgIDAsCi0gICAgMjQ3LCAxNDgsIDU1LCAyMTksIDEzMSwgNTAsIDE5NCwgMTE3LCA0MywgMTY3LCAxMDEsIDMyLCAxNDQsIDg1LCAyMiwgMTIwLCA2OSwgIDgsICA5NiwgNTIsICAwLCAgNjcsIDMwLCAgMCwgIDI3LCAgMCwgIDAsCi0gICAgMjQ3LCAxNDcsIDI5LCAyMTgsIDEzMSwgMjQsIDE5NCwgMTE2LCAyMCwgMTY4LCAxMDAsIDExLCAxNDQsIDg1LCAgMCwgMTIwLCA2OSwgIDAsICA5NiwgNTIsICAwLCAgNjcsIDMwLCAgMCwgIDI2LCAgMCwgIDAsCi0gICAgMjQyLCAxMzAsIDE3OSwgMjE0LCAxMTQsIDE2MCwgMTkwLCAxMDEsIDE0MywgMTY2LCA4NywgMTI1LCAxNDMsIDcyLCAxMDcsIDEyMCwgNTgsIDg4LCAgOTYsIDQyLCA2OCwgIDY5LCAxNywgNDQsICAzNSwgIDAsICAwLAotICAgIDI0MywgMTI5LCAxNjEsIDIxNSwgMTE0LCAxNDMsIDE5MSwgMTAxLCAxMjgsIDE2NiwgODcsIDExMywgMTQzLCA3MywgOTYsIDEyMCwgNTgsIDc5LCAgOTYsIDQxLCA2MCwgIDY5LCAxOCwgMzcsICAzMywgIDAsICAwLAotICAgIDI0MywgMTI5LCAxNDYsIDIxNiwgMTE0LCAxMzAsIDE5MiwgMTAxLCAxMTcsIDE2NiwgODcsIDEwMSwgMTQzLCA3MiwgODYsIDEyMSwgNTgsIDY5LCAgOTYsIDQyLCA1MiwgIDY5LCAxOCwgMjksICAzMSwgIDAsICAwLAotICAgIDI0MywgMTI4LCAxMzAsIDIxNiwgMTE0LCAxMTUsIDE5MSwgMTAxLCAxMDIsIDE2NSwgODYsIDg4LCAxNDIsIDcyLCA3NSwgMTIwLCA1OCwgNjAsICA5NSwgNDIsIDQzLCAgNjgsIDE5LCAyMSwgIDMwLCAgMCwgIDAsCi0gICAgMjQ0LCAxMjcsIDExMiwgMjE3LCAxMTMsIDEwMSwgMTkyLCA5OSwgODksIDE2NiwgODUsIDc1LCAxNDIsIDcyLCA2MywgMTE5LCA1NywgNTAsICA5NiwgNDEsIDM1LCAgNjgsIDE5LCAxMywgIDMwLCAgMCwgIDAsCi0gICAgMjQ0LCAxMjcsIDk2LCAyMTYsIDExMiwgODYsIDE5MSwgOTksIDc1LCAxNjYsIDg2LCA2NCwgMTQzLCA3MiwgNTIsIDEyMCwgNTcsIDQwLCAgOTUsIDQxLCAyNCwgIDY3LCAyMCwgIDEsICAyOSwgIDAsICAwLAotICAgIDI0NSwgMTI2LCA3NywgMjE2LCAxMTMsIDY4LCAxOTEsIDEwMCwgNTksIDE2NiwgODUsIDQ5LCAxNDIsIDcxLCAzOCwgMTE5LCA1NywgMjYsICA5NSwgNDEsIDEwLCAgNjcsIDIwLCAgMCwgIDI4LCAgMCwgIDAsCi0gICAgMjQ0LCAxMjYsIDU1LCAyMTYsIDExMiwgNDgsIDE5MSwgOTksIDQwLCAxNjYsIDg1LCAzMSwgMTQzLCA3MSwgMjAsIDExOSwgNTcsICA2LCAgOTUsIDQyLCAgMCwgIDY3LCAyMCwgIDAsICAyOCwgIDAsICAwLAotICAgIDI0NSwgMTI2LCAzMywgMjE3LCAxMTIsIDI2LCAxOTIsIDk5LCAyMiwgMTY2LCA4NCwgMTEsIDE0MiwgNzAsICAwLCAxMTksIDU3LCAgMCwgIDk1LCA0MSwgIDAsICA2NiwgMjAsICAwLCAgMjcsICAwLCAgMCwKLSAgICAyNDEsIDEwMiwgMTY3LCAyMTMsIDkwLCAxNDksIDE4OSwgNzksIDEzMywgMTY1LCA2NiwgMTE1LCAxNDEsIDU0LCA5OCwgMTE5LCA0MSwgODEsICA5NiwgMjUsIDYzLCAgNjksICAwLCAzOCwgIDMwLCAgMCwgIDAsCi0gICAgMjQxLCAxMDIsIDE0OSwgMjEzLCA5MCwgMTMzLCAxODksIDc5LCAxMTksIDE2NSwgNjYsIDEwMywgMTQyLCA1NSwgODgsIDExOSwgNDEsIDcxLCAgOTYsIDI1LCA1MywgIDY5LCAgMCwgMzEsICAyOCwgIDAsICAwLAotICAgIDI0MSwgMTAyLCAxMzUsIDIxNCwgOTAsIDEyMSwgMTkwLCA3OSwgMTA4LCAxNjUsIDY2LCA5MiwgMTQxLCA1NSwgNzgsIDExOSwgNDIsIDYzLCAgOTYsIDI2LCA0NiwgIDY5LCAgMCwgMjQsICAyOCwgIDAsICAwLAotICAgIDI0MSwgMTAxLCAxMjAsIDIxNCwgOTAsIDEwNywgMTg5LCA3OSwgOTUsIDE2NSwgNjcsIDgzLCAxNDEsIDU0LCA2OCwgMTE4LCA0MSwgNTQsICA5NSwgMjcsIDM5LCAgNjgsICAwLCAxNiwgIDI3LCAgMCwgIDAsCi0gICAgMjQxLCAxMDIsIDEwNiwgMjEzLCA5MCwgOTMsIDE4OSwgNzgsIDgyLCAxNjQsIDY3LCA3MCwgMTQxLCA1NSwgNTgsIDExOCwgNDIsIDQ1LCAgOTQsIDI3LCAyOSwgIDY3LCAgMiwgIDYsICAyNywgIDAsICAwLAotICAgIDI0MiwgMTAxLCA5MCwgMjE0LCA4OSwgNzksIDE5MCwgNzksIDY5LCAxNjYsIDY3LCA1OSwgMTQxLCA1NSwgNDcsIDExOCwgNDEsIDM1LCAgOTUsIDI3LCAxOSwgIDY3LCAgMywgIDAsICAyNiwgIDAsICAwLAotICAgIDI0MiwgMTAyLCA3MiwgMjEzLCA4OSwgNjMsIDE5MSwgNzksIDU2LCAxNjQsIDY3LCA0NSwgMTQxLCA1NSwgMzQsIDExOCwgNDIsIDIyLCAgOTQsIDI4LCAgNiwgIDY3LCAgMywgIDAsICAyNiwgIDAsICAwLAotICAgIDI0MiwgMTAwLCA1MSwgMjE0LCA4OSwgNDUsIDE5MCwgNzgsIDM4LCAxNjQsIDY3LCAzMCwgMTQxLCA1NSwgMTgsIDExOCwgNDIsICAzLCAgOTUsIDI4LCAgMCwgIDY2LCAgNCwgIDAsICAyNiwgIDAsICAwLAotICAgIDI0MywgMTAwLCAzMywgMjE0LCA5MCwgMjcsIDE5MCwgNzgsIDIyLCAxNjUsIDY3LCAxMywgMTQxLCA1NSwgIDAsIDExOCwgNDMsICAwLCAgOTQsIDI5LCAgMCwgIDY2LCAgNSwgIDAsICAyNiwgIDAsICAwLAotICAgIDIzNywgNjksIDE1MywgMjExLCA1OCwgMTM1LCAxODcsIDUxLCAxMjEsIDE2MywgNDEsIDEwNSwgMTQxLCAyOCwgOTAsIDExOCwgMTUsIDczLCAgOTYsICAwLCA1NiwgIDY4LCAgMCwgMzMsICAyNSwgIDAsICAwLAotICAgIDIzOSwgNjcsIDEzNywgMjEyLCA2MCwgMTIzLCAxODksIDUwLCAxMTAsIDE2MywgNDEsIDk0LCAxNDEsIDI5LCA3OSwgMTE4LCAxNywgNjUsICA5NSwgIDAsIDQ4LCAgNjksICAwLCAyNiwgIDI1LCAgMCwgIDAsCi0gICAgMjQwLCA2OSwgMTI0LCAyMTEsIDYwLCAxMTEsIDE4OCwgNTAsIDk4LCAxNjMsIDQyLCA4NSwgMTQxLCAzMSwgNzIsIDExOCwgMTgsIDU3LCAgOTQsICAwLCA0MSwgIDY4LCAgMCwgMTksICAyNSwgIDAsICAwLAotICAgIDI0MCwgNzAsIDExMiwgMjEyLCA2MSwgOTksIDE4OCwgNTIsIDg3LCAxNjMsIDQxLCA3NCwgMTQwLCAzMSwgNjIsIDExOCwgMjAsIDQ4LCAgOTQsICAyLCAzMiwgIDY4LCAgMCwgMTEsICAyNCwgIDAsICAwLAotICAgIDIzOSwgNzAsIDk4LCAyMTIsIDYyLCA4NiwgMTg4LCA1MywgNzcsIDE2NCwgNDIsIDY0LCAxNDAsIDMyLCA1MiwgMTE4LCAyMCwgNDAsICA5NCwgIDMsIDI0LCAgNjcsICAwLCAgMywgIDIzLCAgMCwgIDAsCi0gICAgMjM5LCA3MSwgODUsIDIxMiwgNjEsIDc0LCAxODcsIDUzLCA2NSwgMTYzLCA0NCwgNTQsIDE0MCwgMzQsIDQzLCAxMTgsIDIyLCAzMCwgIDk1LCAgMywgMTQsICA2NywgIDAsICAwLCAgMjMsICAwLCAgMCwKLSAgICAyMzksIDcwLCA2NywgMjEyLCA2MiwgNTksIDE4OCwgNTMsIDUxLCAxNjMsIDQ1LCA0MiwgMTQxLCAzNCwgMzEsIDExNywgMjIsIDE3LCAgOTQsICA1LCAgMiwgIDY2LCAgMCwgIDAsICAyMywgIDAsICAwLAotICAgIDIzOSwgNzEsIDUwLCAyMTMsIDYyLCA0MywgMTg4LCA1NCwgMzcsIDE2NCwgNDUsIDI4LCAxMzksIDM0LCAxNiwgMTE3LCAyMiwgIDIsICA5NCwgIDcsICAwLCAgNjUsICAwLCAgMCwgIDIzLCAgMCwgIDAsCi0gICAgMjQwLCA3MSwgMzQsIDIxMiwgNjMsIDI5LCAxODksIDU0LCAyNCwgMTYzLCA0NiwgMTUsIDEzOSwgMzYsICAyLCAxMTcsIDI1LCAgMCwgIDk0LCAgOCwgIDAsICA2NiwgIDAsICAwLCAgMjMsICAwLCAgMCwKLSAgICAyMzcsICAwLCAxNDAsIDIwOSwgIDAsIDEyNCwgMTg2LCAgMCwgMTEyLCAxNjIsICAwLCA5NywgMTQxLCAgMCwgODIsIDExOCwgIDAsIDY3LCAgOTUsICAwLCA0OSwgIDY4LCAgMCwgMjcsICAyMCwgIDAsICAwLAotICAgIDIzNywgIDAsIDEyNiwgMjEwLCAgMCwgMTEzLCAxODcsICAwLCA5OSwgMTYzLCAgMCwgODYsIDEzOSwgIDAsIDcyLCAxMTgsICAwLCA1OCwgIDk1LCAgMCwgNDIsICA2NywgIDAsIDIwLCAgMjAsICAwLCAgMCwKLSAgICAyMzcsICAxLCAxMTQsIDIwOSwgIDEsIDEwMiwgMTg3LCAgMCwgOTAsIDE2MywgIDAsIDc4LCAxMzksICAwLCA2NCwgMTE4LCAgMCwgNTAsICA5NSwgIDAsIDM1LCAgNjcsICAwLCAxMywgIDIwLCAgMCwgIDAsCi0gICAgMjM2LCAxNiwgMTAyLCAyMDksICA3LCA5MSwgMTg2LCAgMCwgODAsIDE2MiwgIDAsIDY4LCAxMzksICAwLCA1NiwgMTE3LCAgMCwgNDMsICA5NCwgIDAsIDI3LCAgNjcsICAwLCAgNiwgIDIwLCAgMCwgIDAsCi0gICAgMjM4LCAxNSwgODksIDIwOSwgMTMsIDc5LCAxODYsICA2LCA2OSwgMTYyLCAgMCwgNTgsIDEzOSwgIDAsIDQ3LCAxMTcsICAwLCAzNCwgIDkzLCAgMCwgMjAsICA2NiwgIDAsICAyLCAgMjAsICAwLCAgMCwKLSAgICAyMzcsIDIwLCA3OCwgMjEwLCAxMiwgNjgsIDE4NywgIDQsIDU5LCAxNjMsICAwLCA0OSwgMTM5LCAgMCwgMzgsIDExNiwgIDAsIDI2LCAgOTQsICAwLCAxMSwgIDY2LCAgMCwgIDAsICAyMCwgIDAsICAwLAotICAgIDIzNywgMjUsIDY0LCAyMTAsIDE4LCA1NiwgMTg2LCAxMSwgNDgsIDE2MiwgIDQsIDM5LCAxMzgsICAwLCAyNywgMTE3LCAgMCwgMTQsICA5MywgIDAsICAwLCAgNjYsICAwLCAgMCwgIDIwLCAgMCwgIDAsCi0gICAgMjM4LCAyNSwgNDgsIDIxMCwgMjIsIDQzLCAxODYsIDE1LCAzNSwgMTYyLCAgOCwgMjYsIDE0MCwgIDAsIDE0LCAxMTcsICAwLCAgMCwgIDkzLCAgMCwgIDAsICA2NSwgIDAsICAwLCAgMjAsICAwLCAgMCwKLSAgICAyMzgsIDI4LCAzNSwgMjEwLCAyMSwgMzAsIDE4NywgMTUsIDI0LCAxNjIsICA4LCAxNiwgMTM5LCAgMSwgIDIsIDExNywgIDAsICAwLCAgOTMsICAwLCAgMCwgIDY1LCAgMCwgIDAsICAyMiwgIDAsICAwLAotICAgIDIxOSwgMjQyLCAyNTIsIDE5NSwgMjE0LCAyMjUsIDE3MiwgMTkxLCAyMDEsIDE0OCwgMTY1LCAxNzUsIDEyNywgMTQyLCAxNTAsIDEwNiwgMTE5LCAxMjYsICA4NCwgOTUsIDEwMSwgIDU4LCA2NiwgNzIsICAyNCwgMjcsIDMyLAotICAgIDIyMiwgMjM5LCAyMjYsIDE5NiwgMjEzLCAyMDIsIDE3MywgMTg5LCAxODAsIDE1MCwgMTY1LCAxNTgsIDEyOSwgMTQxLCAxMzUsIDEwNywgMTE4LCAxMTMsICA4NSwgOTQsIDkwLCAgNTgsIDY2LCA2MywgIDIxLCAyNiwgMjQsCi0gICAgMjIzLCAyMzcsIDIwMywgMTk4LCAyMTEsIDE4MiwgMTc1LCAxODgsIDE2MywgMTUyLCAxNjQsIDE0MSwgMTI5LCAxNDAsIDEyMSwgMTA3LCAxMTcsIDEwMSwgIDg1LCA5MywgODAsICA1OCwgNjQsIDU0LCAgMjEsIDI2LCAxOCwKLSAgICAyMjYsIDIzNiwgMTc5LCAyMDEsIDIxMCwgMTYwLCAxNzcsIDE4NywgMTQzLCAxNTMsIDE2MiwgMTI1LCAxMzAsIDEzOSwgMTA2LCAxMDgsIDExNiwgODksICA4NSwgOTIsIDY5LCAgNTgsIDY0LCA0NSwgIDIwLCAyNSwgIDgsCi0gICAgMjI3LCAyMzQsIDE1MywgMjAxLCAyMDgsIDEzOSwgMTc4LCAxODUsIDEyNCwgMTU0LCAxNjEsIDEwNywgMTMxLCAxMzgsIDkxLCAxMDgsIDExNSwgNzUsICA4NSwgOTEsIDU4LCAgNTgsIDYzLCAzNSwgIDE3LCAyNSwgIDAsCi0gICAgMjI5LCAyMzMsIDEzMCwgMjAzLCAyMDcsIDExNiwgMTc4LCAxODQsIDEwNCwgMTU0LCAxNjAsIDkwLCAxMzEsIDEzNywgNzYsIDEwOSwgMTE0LCA2MiwgIDg1LCA5MCwgNDYsICA1OCwgNjMsIDI1LCAgMTYsIDI0LCAgMCwKLSAgICAyMzAsIDIzMSwgMTAwLCAyMDIsIDIwNSwgOTAsIDE3OSwgMTgzLCA4MCwgMTU0LCAxNTksIDY5LCAxMzEsIDEzNiwgNTcsIDEwOSwgMTEzLCA0NiwgIDg2LCA5MCwgMzIsICA1OCwgNjMsIDEwLCAgMTQsIDI0LCAgMCwKLSAgICAyMzAsIDIzMCwgNjUsIDIwNCwgMjA0LCA1OCwgMTgwLCAxODIsIDUyLCAxNTUsIDE1NywgNDQsIDEzMiwgMTM1LCAzNSwgMTEwLCAxMTMsIDI0LCAgODYsIDg5LCAgOSwgIDU3LCA2MiwgIDAsICAxMSwgMjQsICAwLAotICAgIDIzMiwgMjMwLCAxOSwgMjA0LCAyMDQsIDE5LCAxODAsIDE4MSwgMTcsIDE1NSwgMTU3LCAxMCwgMTMxLCAxMzQsICAyLCAxMDksIDExMiwgIDAsICA4NSwgODksICAwLCAgNTcsIDYyLCAgMCwgIDEwLCAyMywgIDAsCi0gICAgMjE4LCAyMTYsIDIzNiwgMTk0LCAxOTIsIDIxMSwgMTcyLCAxNzEsIDE4OCwgMTQ5LCAxNDksIDE2NCwgMTI4LCAxMjcsIDE0MSwgMTA2LCAxMDYsIDExOSwgIDg0LCA4NCwgOTQsICA1OSwgNTcsIDY2LCAgMjUsIDE4LCAyNiwKLSAgICAyMjEsIDIxNCwgMjExLCAxOTYsIDE5MSwgMTkwLCAxNzQsIDE3MCwgMTcwLCAxNTAsIDE0OCwgMTQ4LCAxMjgsIDEyNiwgMTI3LCAxMDcsIDEwNSwgMTA2LCAgODUsIDgzLCA4NCwgIDU5LCA1NiwgNTgsICAyMywgMTcsIDE4LAotICAgIDIyMiwgMjEzLCAxOTAsIDE5NywgMTg5LCAxNzAsIDE3NSwgMTY5LCAxNTMsIDE1MSwgMTQ3LCAxMzMsIDEyOSwgMTI2LCAxMTMsIDEwOCwgMTA1LCA5NCwgIDg1LCA4MiwgNzQsICA1OSwgNTYsIDQ5LCAgMjIsIDE3LCAxMSwKLSAgICAyMjQsIDIxMSwgMTY4LCAxOTksIDE4OCwgMTUxLCAxNzUsIDE2OCwgMTM1LCAxNTIsIDE0NiwgMTE3LCAxMjksIDEyNCwgOTksIDEwNywgMTAzLCA4MiwgIDg0LCA4MiwgNjQsICA1OSwgNTUsIDQxLCAgMjEsIDE3LCAgMSwKLSAgICAyMjQsIDIxMCwgMTQ1LCAxOTksIDE4NywgMTMwLCAxNzYsIDE2NiwgMTE3LCAxNTIsIDE0NSwgMTAxLCAxMjksIDEyMywgODYsIDEwNywgMTAzLCA3MCwgIDg1LCA4MSwgNTMsICA1OCwgNTUsIDMxLCAgMTksIDE3LCAgMCwKLSAgICAyMjcsIDIwOCwgMTIzLCAyMDAsIDE4NiwgMTEwLCAxNzcsIDE2NSwgOTgsIDE1MywgMTQzLCA4NCwgMTMwLCAxMjIsIDcwLCAxMDgsIDEwMiwgNTcsICA4NSwgODAsIDQxLCAgNTgsIDU0LCAyMCwgIDE4LCAxNiwgIDAsCi0gICAgMjI3LCAyMDgsIDk3LCAyMDIsIDE4NSwgODYsIDE3NywgMTY0LCA3NywgMTUzLCAxNDIsIDY1LCAxMzAsIDEyMiwgNTQsIDEwOCwgMTAxLCA0MiwgIDg1LCA4MCwgMjcsICA1OCwgNTQsICA3LCAgMTYsIDE2LCAgMCwKLSAgICAyMjgsIDIwNiwgNjYsIDIwMiwgMTg0LCA1OCwgMTc4LCAxNjMsIDUwLCAxNTQsIDE0MSwgNDIsIDEzMSwgMTIxLCAzMywgMTA5LCAxMDEsIDIxLCAgODYsIDc5LCAgNSwgIDU4LCA1NCwgIDAsICAxMywgMTYsICAwLAotICAgIDIyOCwgMjA2LCAyOSwgMjAyLCAxODMsIDI1LCAxNzgsIDE2MywgMjAsIDE1NCwgMTQxLCAxNSwgMTMxLCAxMjEsICA1LCAxMDgsIDEwMCwgIDAsICA4NSwgNzksICAwLCAgNTgsIDUzLCAgMCwgIDEzLCAxNiwgIDAsCi0gICAgMjE3LCAxOTMsIDIyMSwgMTkzLCAxNzIsIDE5OCwgMTcyLCAxNTMsIDE3OCwgMTQ5LCAxMzMsIDE1NCwgMTI4LCAxMTQsIDEzMiwgMTA3LCA5NCwgMTExLCAgODUsIDc0LCA4OSwgIDU5LCA0OSwgNjEsICAyNSwgIDgsIDIyLAotICAgIDIxOSwgMTkxLCAxOTgsIDE5NSwgMTcxLCAxNzgsIDE3MywgMTUzLCAxNTksIDE0OSwgMTMyLCAxMzksIDEyOCwgMTEzLCAxMTksIDEwNywgOTQsIDEwMCwgIDg1LCA3MywgNzksICA1OSwgNDgsIDUyLCAgMjUsICA3LCAxNCwKLSAgICAyMjEsIDE5MSwgMTgwLCAxOTYsIDE3MCwgMTYwLCAxNzQsIDE1MiwgMTQ0LCAxNTAsIDEzMiwgMTI1LCAxMjksIDExMywgMTA3LCAxMDcsIDkzLCA4OSwgIDg1LCA3MywgNjksICA1OSwgNDgsIDQ1LCAgMjMsICA3LCAgNCwKLSAgICAyMjIsIDE4OSwgMTU5LCAxOTcsIDE2OSwgMTQyLCAxNzQsIDE1MSwgMTI3LCAxNTEsIDEzMSwgMTEwLCAxMjksIDExMiwgOTQsIDEwOCwgOTMsIDc4LCAgODUsIDcyLCA2MCwgIDU4LCA0NywgMzcsICAyMiwgIDcsICAwLAotICAgIDIyMywgMTg4LCAxMzgsIDE5NywgMTY4LCAxMjMsIDE3NSwgMTUwLCAxMDksIDE1MSwgMTMwLCA5NSwgMTMwLCAxMTEsIDgxLCAxMDgsIDkyLCA2NSwgIDg1LCA3MiwgNDksICA1OSwgNDcsIDI3LCAgMjEsICA3LCAgMCwKLSAgICAyMjQsIDE4NywgMTE4LCAxOTgsIDE2NywgMTA1LCAxNzYsIDE0OSwgOTMsIDE1MiwgMTI5LCA3OSwgMTMwLCAxMTAsIDY4LCAxMDgsIDkxLCA1NCwgIDg1LCA3MSwgMzgsICA1OSwgNDcsIDE3LCAgMTgsICA3LCAgMCwKLSAgICAyMjQsIDE4NywgOTMsIDE5OSwgMTY2LCA4MywgMTc2LCAxNDgsIDczLCAxNTIsIDEyOCwgNjIsIDEyOSwgMTA5LCA1MSwgMTA4LCA5MCwgMzksICA4NSwgNzEsIDI1LCAgNTgsIDQ2LCAgMywgIDE2LCAgOCwgIDAsCi0gICAgMjI2LCAxODYsIDY0LCAyMDAsIDE2NSwgNTcsIDE3NywgMTQ3LCA1MCwgMTUzLCAxMjcsIDQwLCAxMzAsIDEwOCwgMzEsIDEwOCwgOTAsIDE5LCAgODUsIDcwLCAgMywgIDU4LCA0NiwgIDAsICAxNiwgIDgsICAwLAotICAgIDIyNywgMTg1LCAzNSwgMjAwLCAxNjUsIDMwLCAxNzYsIDE0NiwgMjUsIDE1MiwgMTI3LCAxOCwgMTMwLCAxMDgsICA3LCAxMDgsIDg5LCAgMCwgIDg1LCA3MCwgIDAsICA1NywgNDYsICAwLCAgMTQsICA4LCAgMCwKLSAgICAyMTYsIDE2OSwgMjA1LCAxOTIsIDE1MCwgMTg0LCAxNzEsIDEzNCwgMTY0LCAxNDksIDExNiwgMTQ0LCAxMjgsIDk5LCAxMjQsIDEwNywgODEsIDEwMywgIDg1LCA2MywgODEsICA2MCwgMzksIDU1LCAgMjYsICAwLCAxNSwKLSAgICAyMTcsIDE2OCwgMTg2LCAxOTMsIDE1MCwgMTY1LCAxNzIsIDEzNCwgMTQ5LCAxNTAsIDExNiwgMTMwLCAxMjgsIDk5LCAxMTEsIDEwNywgODEsIDkyLCAgODUsIDYyLCA3MiwgIDU5LCAzOSwgNDcsICAyNSwgIDAsICA2LAotICAgIDIxOSwgMTY4LCAxNjgsIDE5NCwgMTQ5LCAxNTAsIDE3MywgMTMzLCAxMzUsIDE1MCwgMTE2LCAxMTcsIDEyOCwgOTgsIDk5LCAxMDcsIDgwLCA4MiwgIDg2LCA2MiwgNjMsICA1OSwgMzgsIDM5LCAgMjQsICAwLCAgMCwKLSAgICAyMTksIDE2NiwgMTQ4LCAxOTUsIDE0OSwgMTMzLCAxNzMsIDEzMywgMTE5LCAxNTAsIDExNSwgMTAzLCAxMjgsIDk4LCA4OCwgMTA3LCA4MCwgNzIsICA4NSwgNjEsIDU0LCAgNTksIDM4LCAzMiwgIDIzLCAgMCwgIDAsCi0gICAgMjIwLCAxNjYsIDEyOSwgMTk2LCAxNDgsIDExNiwgMTc0LCAxMzIsIDEwMywgMTUxLCAxMTQsIDg5LCAxMjksIDk3LCA3NSwgMTA3LCA3OSwgNjAsICA4NSwgNjEsIDQ0LCAgNTksIDM4LCAyMiwgIDIxLCAgMCwgIDAsCi0gICAgMjIyLCAxNjQsIDExMCwgMTk3LCAxNDcsIDk5LCAxNzUsIDEzMSwgODcsIDE1MSwgMTEzLCA3NSwgMTI5LCA5NiwgNjMsIDEwNywgNzksIDQ5LCAgODUsIDYxLCAzMywgIDU4LCAzOCwgMTIsICAxOSwgIDAsICAwLAotICAgIDIyMiwgMTY0LCA4OCwgMTk3LCAxNDYsIDc5LCAxNzQsIDEzMCwgNjksIDE1MSwgMTEzLCA1OCwgMTI5LCA5NSwgNDcsIDEwNywgNzgsIDM1LCAgODUsIDYwLCAyMCwgIDU4LCAzOCwgIDAsICAxOCwgIDAsICAwLAotICAgIDIyMywgMTY0LCA2MywgMTk4LCAxNDUsIDU1LCAxNzUsIDEyOSwgNDgsIDE1MSwgMTEyLCAzOSwgMTI5LCA5NSwgMjksIDEwNywgNzgsIDE2LCAgODUsIDYwLCAgMSwgIDU4LCAzOCwgIDAsICAxNywgIDAsICAwLAotICAgIDIyMywgMTYzLCAzNiwgMTk4LCAxNDUsIDMyLCAxNzQsIDEyOSwgMjYsIDE1MSwgMTExLCAxNywgMTI5LCA5NSwgIDcsIDEwNywgNzgsICAwLCAgODQsIDYwLCAgMCwgIDU3LCAzNywgIDAsICAxNSwgIDAsICAwLAotICAgIDIxNSwgMTQ3LCAxOTIsIDE5MSwgMTMwLCAxNzIsIDE3MCwgMTE2LCAxNTMsIDE0OCwgMTAwLCAxMzMsIDEyNywgODUsIDExNSwgMTA3LCA2OSwgOTYsICA4NSwgNTEsIDc1LCAgNjAsIDI4LCA1MCwgIDI1LCAgMCwgIDgsCi0gICAgMjE3LCAxNDYsIDE3MywgMTkyLCAxMzAsIDE1NCwgMTcxLCAxMTUsIDEzOCwgMTQ5LCAxMDAsIDEyMSwgMTI4LCA4NCwgMTAzLCAxMDcsIDY4LCA4NSwgIDg1LCA1MSwgNjYsICA2MCwgMjgsIDQyLCAgMjUsICAwLCAgMCwKLSAgICAyMTcsIDE0NSwgMTU3LCAxOTMsIDEyOSwgMTQwLCAxNzMsIDExNSwgMTI1LCAxNDksIDEwMCwgMTA5LCAxMjgsIDg0LCA5MiwgMTA3LCA2OCwgNzYsICA4NSwgNTEsIDU4LCAgNTksIDI4LCAzNSwgIDIzLCAgMCwgIDAsCi0gICAgMjE4LCAxNDUsIDE0MCwgMTkzLCAxMjksIDEyNSwgMTcyLCAxMTQsIDExMCwgMTQ5LCA5OSwgOTYsIDEyOCwgODMsIDgxLCAxMDcsIDY3LCA2NSwgIDg0LCA1MSwgNDksICA1OSwgMjksIDI3LCAgMjIsICAwLCAgMCwKLSAgICAyMTksIDE0NCwgMTIxLCAxOTQsIDEyOCwgMTA4LCAxNzIsIDExMywgOTYsIDE0OSwgOTgsIDgzLCAxMjgsIDgzLCA2OSwgMTA3LCA2OCwgNTUsICA4NSwgNTAsIDQwLCAgNTksIDI4LCAxOCwgIDIwLCAgMCwgIDAsCi0gICAgMjIwLCAxNDMsIDEwNCwgMTk1LCAxMjgsIDkzLCAxNzMsIDExNCwgODIsIDE1MCwgOTgsIDY5LCAxMjcsIDgyLCA1OCwgMTA3LCA2NywgNDUsICA4NSwgNTAsIDMwLCAgNTksIDI4LCAgNywgIDE5LCAgMCwgIDAsCi0gICAgMjIwLCAxNDMsIDg0LCAxOTUsIDEyNywgNzQsIDE3MywgMTEzLCA2NSwgMTQ5LCA5NywgNTUsIDEyOCwgODIsIDQ0LCAxMDYsIDY3LCAzMiwgIDg0LCA1MCwgMTYsICA1OCwgMjgsICAwLCAgMTgsICAwLCAgMCwKLSAgICAyMjEsIDE0MiwgNjIsIDE5NiwgMTI2LCA1MywgMTczLCAxMTIsIDQ2LCAxNTAsIDk3LCAzNywgMTI4LCA4MiwgMjYsIDEwNywgNjYsIDE0LCAgODQsIDUwLCAgMCwgIDU4LCAyOCwgIDAsICAxNiwgIDAsICAwLAotICAgIDIyMiwgMTQyLCAzOCwgMTk2LCAxMjYsIDM0LCAxNzQsIDExMiwgMjcsIDE1MCwgOTYsIDE3LCAxMjgsIDgyLCAgNiwgMTA2LCA2NiwgIDAsICA4NCwgNTAsICAwLCAgNTcsIDI5LCAgMCwgIDE2LCAgMCwgIDAsCi0gICAgMjE0LCAxMjMsIDE3OSwgMTkxLCAxMTAsIDE1OSwgMTY5LCA5OCwgMTQzLCAxNDcsIDg0LCAxMjQsIDEyNiwgNzAsIDEwNiwgMTA3LCA1NSwgODgsICA4NSwgMzksIDY5LCAgNjAsIDE1LCA0NSwgIDIzLCAgMCwgIDIsCi0gICAgMjE2LCAxMjMsIDE2MSwgMTkyLCAxMTAsIDE0NCwgMTcwLCA5OCwgMTI5LCAxNDgsIDg0LCAxMTIsIDEyNywgNzAsIDk1LCAxMDcsIDU1LCA3OSwgIDg1LCAzOSwgNjEsICA2MCwgMTUsIDM3LCAgMjAsICAwLCAgMCwKLSAgICAyMTcsIDEyMiwgMTQ1LCAxOTIsIDExMCwgMTMwLCAxNzAsIDk3LCAxMTYsIDE0OSwgODQsIDEwMSwgMTI3LCA3MCwgODUsIDEwNiwgNTUsIDcwLCAgODUsIDM5LCA1MywgIDU5LCAxNiwgMzAsICAxOSwgIDAsICAwLAotICAgIDIxNywgMTIzLCAxMzEsIDE5MiwgMTA5LCAxMTYsIDE3MSwgOTYsIDEwMywgMTQ5LCA4MywgODksIDEyNywgNzAsIDc1LCAxMDYsIDU1LCA2MCwgIDg1LCA0MCwgNDUsICA1OSwgMTYsIDIzLCAgMTcsICAwLCAgMCwKLSAgICAyMTcsIDEyMiwgMTE0LCAxOTMsIDEwOSwgMTAxLCAxNzIsIDk2LCA5MSwgMTQ5LCA4MiwgNzcsIDEyOCwgNjksIDY0LCAxMDYsIDU1LCA1MCwgIDg0LCAzOSwgMzUsICA1OSwgMTcsIDE0LCAgMTcsICAwLCAgMCwKLSAgICAyMTgsIDEyMiwgOTgsIDE5NCwgMTA4LCA4NywgMTcxLCA5NiwgNzcsIDE0OSwgODIsIDY1LCAxMjcsIDY5LCA1MiwgMTA2LCA1NSwgNDAsICA4NCwgNDAsIDI1LCAgNTksIDE4LCAgMywgIDE1LCAgMCwgIDAsCi0gICAgMjE5LCAxMjIsIDgwLCAxOTMsIDEwOCwgNzAsIDE3MiwgOTUsIDYxLCAxNDksIDgyLCA1MSwgMTI3LCA2OSwgNDAsIDEwNiwgNTUsIDI4LCAgODQsIDM5LCAxMiwgIDU4LCAxNywgIDAsICAxMywgIDAsICAwLAotICAgIDIxOSwgMTIxLCA1OSwgMTk0LCAxMDgsIDUyLCAxNzIsIDk2LCA0NCwgMTQ5LCA4MiwgMzUsIDEyNywgNjgsIDI0LCAxMDYsIDU1LCAxMSwgIDg0LCA0MCwgIDAsICA1NywgMTgsICAwLCAgMTMsICAwLCAgMCwKLSAgICAyMTksIDEyMSwgNDAsIDE5MywgMTA4LCAzMywgMTcyLCA5NSwgMjYsIDE0OSwgODEsIDE5LCAxMjgsIDY4LCAgNiwgMTA2LCA1NCwgIDAsICA4NCwgMzksICAwLCAgNTcsIDE4LCAgMCwgIDEzLCAgMCwgIDAsCi0gICAgMjEzLCA5OSwgMTY1LCAxODksIDg3LCAxNDgsIDE2OSwgNzYsIDEzMiwgMTQ3LCA2NCwgMTE1LCAxMjYsIDUyLCA5OCwgMTA2LCAzOSwgODEsICA4NSwgMjMsIDYzLCAgNjAsICAwLCAzOSwgIDE2LCAgMCwgIDAsCi0gICAgMjE0LCA5OCwgMTQ5LCAxOTEsIDg3LCAxMzMsIDE3MCwgNzYsIDExOSwgMTQ4LCA2NSwgMTAzLCAxMjcsIDUzLCA4OCwgMTA2LCAzOSwgNzIsICA4NSwgMjQsIDU1LCAgNjAsICAwLCAzMiwgIDE1LCAgMCwgIDAsCi0gICAgMjE1LCA5OSwgMTM2LCAxOTEsIDg3LCAxMjEsIDE3MCwgNzcsIDEwOCwgMTQ4LCA2NSwgOTMsIDEyNiwgNTMsIDc5LCAxMDYsIDQwLCA2NCwgIDg1LCAyNCwgNDcsICA1OSwgIDAsIDI1LCAgMTQsICAwLCAgMCwKLSAgICAyMTUsIDk5LCAxMjEsIDE5MiwgODcsIDEwOCwgMTcwLCA3NywgOTYsIDE0OCwgNjUsIDgyLCAxMjYsIDUzLCA2OSwgMTA2LCA0MCwgNTUsICA4NSwgMjUsIDM5LCAgNTksICAwLCAxOCwgIDEzLCAgMCwgIDAsCi0gICAgMjE2LCA5OSwgMTA2LCAxOTEsIDg3LCA5NSwgMTcwLCA3NiwgODMsIDE0OCwgNjUsIDcxLCAxMjYsIDUzLCA1OCwgMTA2LCA0MSwgNDUsICA4NSwgMjYsIDMwLCAgNTksICAwLCAgOCwgIDExLCAgMCwgIDAsCi0gICAgMjE2LCA5OCwgOTEsIDE5MiwgODgsIDgyLCAxNzAsIDc3LCA3MSwgMTQ4LCA2NSwgNjAsIDEyNywgNTMsIDQ4LCAxMDUsIDQxLCAzNiwgIDgzLCAyNiwgMjEsICA1OCwgIDEsICAyLCAgMTEsICAwLCAgMCwKLSAgICAyMTcsIDk5LCA3NSwgMTkyLCA4NywgNjYsIDE3MCwgNzYsIDU3LCAxNDgsIDY1LCA0NywgMTI2LCA1MywgMzYsIDEwNSwgNDEsIDI0LCAgODMsIDI2LCAgOCwgIDU3LCAgMiwgIDAsICAgOSwgIDAsICAwLAotICAgIDIxNywgOTgsIDU3LCAxOTIsIDg3LCA0OSwgMTcxLCA3NywgNDEsIDE0NywgNjUsIDMyLCAxMjYsIDUzLCAyMSwgMTA1LCA0MSwgIDgsICA4NCwgMjcsICAwLCAgNTcsICAzLCAgMCwgICA5LCAgMCwgIDAsCi0gICAgMjE3LCA5OCwgNDAsIDE5MywgODcsIDM0LCAxNzEsIDc2LCAyNywgMTQ4LCA2NSwgMTksIDEyNiwgNTMsICA2LCAxMDUsIDQxLCAgMCwgIDgzLCAyNywgIDAsICA1NywgIDQsICAwLCAgIDksICAwLCAgMCwKLSAgICAyMTEsIDY3LCAxNTIsIDE4OSwgNTgsIDEzNiwgMTY4LCA1MCwgMTIyLCAxNDcsIDM5LCAxMDUsIDEyNywgMjgsIDg5LCAxMDYsIDE0LCA3NCwgIDg1LCAgMCwgNTYsICA1OSwgIDAsIDMzLCAgIDksICAwLCAgMCwKLSAgICAyMTMsIDY4LCAxMzgsIDE5MCwgNTksIDEyMywgMTY5LCA1MSwgMTA5LCAxNDgsIDQwLCA5NSwgMTI2LCAzMCwgODAsIDEwNiwgMTYsIDY1LCAgODUsICAwLCA0OCwgIDU5LCAgMCwgMjcsICAgOSwgIDAsICAwLAotICAgIDIxNCwgNjksIDEyNSwgMTkwLCA1OSwgMTExLCAxNjgsIDUxLCA5OSwgMTQ4LCA0MSwgODYsIDEyNiwgMzEsIDcyLCAxMDYsIDE4LCA1OCwgIDg1LCAgMCwgNDEsICA1OSwgIDAsIDIwLCAgIDcsICAwLCAgMCwKLSAgICAyMTUsIDcwLCAxMTIsIDE5MCwgNjEsIDEwMCwgMTY5LCA1MiwgODgsIDE0NywgNDIsIDc2LCAxMjYsIDMyLCA2MywgMTA2LCAxOSwgNDksICA4NCwgIDEsIDM0LCAgNTgsICAwLCAxMywgICA3LCAgMCwgIDAsCi0gICAgMjE0LCA3MCwgOTksIDE5MCwgNjIsIDg4LCAxNjksIDUzLCA3NywgMTQ3LCA0MywgNjUsIDEyNSwgMzIsIDUzLCAxMDYsIDIwLCA0MCwgIDg0LCAgMywgMjYsICA1OCwgIDAsICA0LCAgIDcsICAwLCAgMCwKLSAgICAyMTQsIDcxLCA4NiwgMTkwLCA2MSwgNzUsIDE2OSwgNTMsIDY1LCAxNDYsIDQzLCA1NCwgMTI2LCAzMywgNDQsIDEwNSwgMjEsIDMxLCAgODMsICA0LCAxNywgIDU3LCAgMCwgIDAsICAgNywgIDAsICAwLAotICAgIDIxNSwgNzEsIDcxLCAxOTEsIDYyLCA2MiwgMTY5LCA1MywgNTMsIDE0NywgNDQsIDQ0LCAxMjYsIDM0LCAzMywgMTA1LCAyMiwgMjAsICA4MywgIDUsICA0LCAgNTcsICAwLCAgMCwgICA3LCAgMCwgIDAsCi0gICAgMjE1LCA3MSwgNTQsIDE5MSwgNjIsIDQ3LCAxNjksIDU0LCAzOSwgMTQ3LCA0NCwgMzAsIDEyNiwgMzUsIDIwLCAxMDUsIDIzLCAgNiwgIDgzLCAgNiwgIDAsICA1NiwgIDAsICAwLCAgIDUsICAwLCAgMCwKLSAgICAyMTUsIDcxLCA0MSwgMTkxLCA2MywgMzQsIDE3MCwgNTQsIDI3LCAxNDcsIDQ1LCAxNywgMTI2LCAzNSwgIDYsIDEwNSwgMjMsICAwLCAgODMsICA4LCAgMCwgIDU2LCAgMCwgIDAsICAgNSwgIDAsICAwLAotICAgIDIxMCwgMTMsIDE0MCwgMTg5LCAgMSwgMTI1LCAxNjcsICAwLCAxMTAsIDE0NiwgIDAsIDk2LCAxMjYsICAwLCA4MSwgMTA2LCAgMCwgNjcsICA4NSwgIDAsIDUxLCAgNTksICAwLCAyOCwgICA0LCAgMCwgIDAsCi0gICAgMjEyLCAxOCwgMTI2LCAxOTAsICA3LCAxMTMsIDE2OCwgIDAsIDEwMCwgMTQ2LCAgMCwgODYsIDEyNiwgIDAsIDczLCAxMDYsICAwLCA1OSwgIDg0LCAgMCwgNDMsICA1OSwgIDAsIDIyLCAgIDQsICAwLCAgMCwKLSAgICAyMTIsIDIxLCAxMTUsIDE5MCwgMTMsIDEwMywgMTY4LCAgMywgOTEsIDE0NiwgIDAsIDc4LCAxMjUsICAwLCA2NSwgMTA1LCAgMCwgNTIsICA4NCwgIDAsIDM2LCAgNTgsICAwLCAxNiwgICA0LCAgMCwgIDAsCi0gICAgMjEzLCAyNCwgMTAzLCAxODksIDE5LCA5MSwgMTY4LCAgOSwgODIsIDE0NiwgIDAsIDY5LCAxMjUsICAwLCA1NywgMTA1LCAgMCwgNDQsICA4NCwgIDAsIDI5LCAgNTgsICAwLCAgNywgICA0LCAgMCwgIDAsCi0gICAgMjEzLCAyNywgOTIsIDE4OCwgMjEsIDgxLCAxNjgsIDE0LCA3MSwgMTQ2LCAgMSwgNTksIDEyNSwgIDAsIDQ4LCAxMDUsICAwLCAzNiwgIDg0LCAgMCwgMjEsICA1OCwgIDAsICA0LCAgIDQsICAwLCAgMCwKLSAgICAyMTMsIDMwLCA4MCwgMTg5LCAyMiwgNjksIDE2OCwgMTcsIDYxLCAxNDYsICA1LCA1MCwgMTI1LCAgMCwgMzksIDEwNCwgIDAsIDI3LCAgODMsICAwLCAxMiwgIDU3LCAgMCwgIDAsICAgNCwgIDAsICAwLAotICAgIDIxNCwgMzAsIDY3LCAxODksIDI1LCA1NywgMTY4LCAyMCwgNTAsIDE0NiwgIDksIDQwLCAxMjUsICAwLCAyOSwgMTA0LCAgMCwgMTcsICA4MywgIDAsICAyLCAgNTYsICAwLCAgMCwgICA0LCAgMCwgIDAsCi0gICAgMjE0LCAzMiwgNTMsIDE4OSwgMjcsIDQ0LCAxNjksIDIwLCAzOCwgMTQ2LCAxMywgMjgsIDEyNCwgIDIsIDE3LCAxMDQsICAwLCAgNCwgIDgzLCAgMCwgIDAsICA1NiwgIDAsICAwLCAgIDQsICAwLCAgMCwKLSAgICAyMTQsIDMzLCA0MSwgMTkwLCAyNywgMzMsIDE2OCwgMjMsIDI3LCAxNDYsIDEzLCAxOCwgMTI1LCAgMywgIDUsIDEwNSwgIDAsICAwLCAgODMsICAwLCAgMCwgIDU2LCAgMCwgIDAsICAgNCwgIDAsICAwLAotICAgIDE4NSwgMjI5LCAyNTAsIDE2NCwgMjA0LCAyMjMsIDE0NiwgMTgyLCAxOTksIDEyNywgMTU4LCAxNzQsIDEwOCwgMTM2LCAxNDksICA4OSwgMTEzLCAxMjUsICA3MCwgOTAsIDEwMCwgIDQ2LCA2MiwgNzEsICAxMCwgMjUsIDMzLAotICAgIDE4OSwgMjI3LCAyMjUsIDE2OCwgMjAyLCAyMDEsIDE0OCwgMTgxLCAxNzksIDEyOSwgMTU3LCAxNTYsIDEwOSwgMTM1LCAxMzQsICA5MCwgMTEzLCAxMTMsICA3MCwgODksIDkwLCAgNDYsIDYyLCA2MiwgICA4LCAyNCwgMjUsCi0gICAgMTkyLCAyMjYsIDIwMiwgMTcwLCAyMDIsIDE4MiwgMTUxLCAxNzksIDE2MiwgMTMwLCAxNTYsIDE0MSwgMTEwLCAxMzMsIDEyMSwgIDkxLCAxMTIsIDEwMSwgIDcxLCA4OSwgODAsICA0NiwgNjEsIDU0LCAgIDcsIDI0LCAxOSwKLSAgICAxOTQsIDIyNCwgMTc5LCAxNzMsIDIwMCwgMTYwLCAxNTMsIDE3OCwgMTQ0LCAxMzIsIDE1NSwgMTI1LCAxMTIsIDEzMywgMTA3LCAgOTIsIDExMSwgODksICA3MSwgODgsIDY5LCAgNDYsIDYxLCA0NSwgICA2LCAyMywgMTAsCi0gICAgMTk2LCAyMjMsIDE1NSwgMTc0LCAxOTgsIDEzOSwgMTU0LCAxNzYsIDEyNCwgMTMyLCAxNTMsIDEwNywgMTEzLCAxMzEsIDkxLCAgOTIsIDExMCwgNzUsICA3MiwgODcsIDU4LCAgNDcsIDYwLCAzNywgICA0LCAyMywgIDAsCi0gICAgMTk4LCAyMjEsIDEzMSwgMTc1LCAxOTcsIDExNywgMTU1LCAxNzUsIDEwNSwgMTMzLCAxNTIsIDkxLCAxMTMsIDEzMCwgNzYsICA5MiwgMTA5LCA2MywgIDcyLCA4NiwgNDcsICA0NiwgNjAsIDI2LCAgIDMsIDIzLCAgMCwKLSAgICAyMDAsIDIyMCwgMTA0LCAxNzYsIDE5NiwgOTQsIDE1NiwgMTc1LCA4NCwgMTM0LCAxNTEsIDcyLCAxMTMsIDEyOSwgNTksICA5MywgMTA4LCA0NywgIDcyLCA4NSwgMzMsICA0NiwgNTksIDEzLCAgIDAsIDIzLCAgMCwKLSAgICAyMDEsIDIxOSwgNzMsIDE3OSwgMTk1LCA2NSwgMTU3LCAxNzMsIDU3LCAxMzUsIDE1MCwgNDgsIDExNCwgMTI5LCAzOSwgIDk0LCAxMDgsIDI4LCAgNzIsIDg1LCAxNSwgIDQ3LCA1OSwgIDAsICAgMCwgMjIsICAwLAotICAgIDIwMywgMjE5LCA0MiwgMTc4LCAxOTUsIDM3LCAxNTcsIDE3MywgMzIsIDEzNSwgMTUwLCAyNiwgMTE0LCAxMjgsIDE2LCAgOTQsIDEwNywgIDYsICA3MywgODUsICAwLCAgNDYsIDU4LCAgMCwgICAwLCAyMiwgIDAsCi0gICAgMTg2LCAyMDUsIDIzMywgMTY1LCAxODMsIDIwOSwgMTQ4LCAxNjMsIDE4NywgMTI4LCAxNDIsIDE2MywgMTA5LCAxMjEsIDE0MCwgIDkxLCAxMDEsIDExOCwgIDcxLCA4MCwgOTQsICA0OCwgNTQsIDY2LCAgMTIsIDE1LCAyNywKLSAgICAxODksIDIwNCwgMjExLCAxNjksIDE4MiwgMTg5LCAxNTEsIDE2MywgMTY5LCAxMzEsIDE0MSwgMTQ3LCAxMTEsIDEyMSwgMTI2LCAgOTIsIDEwMSwgMTA1LCAgNzIsIDc5LCA4NCwgIDQ4LCA1NCwgNTgsICAxMSwgMTUsIDE5LAotICAgIDE5MiwgMjAyLCAxOTAsIDE3MSwgMTgxLCAxNzAsIDE1MiwgMTYxLCAxNTIsIDEzMSwgMTQxLCAxMzMsIDExMiwgMTIwLCAxMTMsICA5MywgMTAwLCA5NCwgIDcyLCA3OSwgNzQsICA0OCwgNTMsIDUwLCAgMTAsIDE1LCAxMSwKLSAgICAxOTUsIDIwMSwgMTY5LCAxNzIsIDE3OSwgMTUxLCAxNTMsIDE2MCwgMTM1LCAxMzIsIDEzOSwgMTE3LCAxMTMsIDExOSwgMTAwLCAgOTMsIDk5LCA4MiwgIDcyLCA3OCwgNjQsICA0OCwgNTMsIDQxLCAgIDksIDE0LCAgMywKLSAgICAxOTUsIDIwMCwgMTQ2LCAxNzQsIDE3OSwgMTMxLCAxNTQsIDE1OSwgMTE3LCAxMzMsIDEzOCwgMTAxLCAxMTMsIDExOCwgODYsICA5MywgOTgsIDcwLCAgNzMsIDc3LCA1MywgIDQ4LCA1MiwgMzIsICAgOCwgMTUsICAwLAotICAgIDE5OCwgMTk5LCAxMjUsIDE3NSwgMTc3LCAxMTEsIDE1NSwgMTU4LCAxMDAsIDEzMywgMTM3LCA4NSwgMTEzLCAxMTcsIDcxLCAgOTMsIDk3LCA1NywgIDcyLCA3NywgNDIsICA0NywgNTIsIDIyLCAgIDUsIDE0LCAgMCwKLSAgICAxOTksIDE5OCwgMTAxLCAxNzYsIDE3NywgODksIDE1NSwgMTU3LCA3OSwgMTM0LCAxMzYsIDY4LCAxMTMsIDExNiwgNTYsICA5NCwgOTcsIDQ0LCAgNzMsIDc2LCAzMCwgIDQ3LCA1MiwgMTAsICAgMiwgMTUsICAwLAotICAgIDIwMCwgMTk3LCA3MiwgMTc4LCAxNzYsIDYzLCAxNTcsIDE1NiwgNTYsIDEzNSwgMTM2LCA0NiwgMTE0LCAxMTYsIDM3LCAgOTQsIDk2LCAyNiwgIDczLCA3NiwgMTEsICA0NywgNTEsICAwLCAgIDAsIDE0LCAgMCwKLSAgICAyMDEsIDE5NywgNDUsIDE3NywgMTc1LCAzOCwgMTU2LCAxNTUsIDMxLCAxMzUsIDEzNSwgMjUsIDExNCwgMTE1LCAxNywgIDk0LCA5NiwgIDUsICA3MywgNzUsICAwLCAgNDYsIDUxLCAgMCwgICAwLCAxNCwgIDAsCi0gICAgMTg3LCAxODMsIDIxOCwgMTY3LCAxNjUsIDE5NywgMTQ5LCAxNDcsIDE3NiwgMTI5LCAxMjcsIDE1MywgMTExLCAxMDksIDEzMiwgIDkyLCA5MCwgMTExLCAgNzMsIDcwLCA4OSwgIDQ5LCA0NiwgNjIsICAxNSwgIDQsIDIyLAotICAgIDE5MCwgMTgzLCAxOTcsIDE3MCwgMTY0LCAxNzcsIDE1MSwgMTQ2LCAxNTksIDEzMCwgMTI3LCAxMzksIDExMiwgMTA5LCAxMTksICA5MywgOTAsIDk5LCAgNzIsIDcwLCA3OCwgIDQ5LCA0NSwgNTMsICAxNCwgIDQsIDE1LAotICAgIDE5MiwgMTgyLCAxNzksIDE3MSwgMTYzLCAxNjEsIDE1MywgMTQ1LCAxNDQsIDEzMiwgMTI2LCAxMjUsIDExMywgMTA4LCAxMDcsICA5MywgODksIDg4LCAgNzMsIDcwLCA2OSwgIDQ5LCA0NSwgNDUsICAxMywgIDUsICA2LAotICAgIDE5NSwgMTgxLCAxNTksIDE3MiwgMTYyLCAxNDIsIDE1MiwgMTQ1LCAxMjcsIDEzMiwgMTI1LCAxMTEsIDExMywgMTA3LCA5NCwgIDkzLCA4OCwgNzcsICA3MywgNjksIDU5LCAgNDgsIDQ1LCAzNywgIDExLCAgNSwgIDAsCi0gICAgMTk1LCAxODAsIDEzOSwgMTczLCAxNjEsIDEyNCwgMTUzLCAxNDMsIDExMCwgMTMzLCAxMjUsIDk2LCAxMTMsIDEwNiwgODEsICA5NCwgODgsIDY2LCAgNzMsIDY4LCA0OSwgIDQ5LCA0NCwgMjgsICAgOSwgIDYsICAwLAotICAgIDE5NiwgMTc5LCAxMTgsIDE3NCwgMTYwLCAxMDYsIDE1NCwgMTQyLCA5NCwgMTMzLCAxMjQsIDgxLCAxMTMsIDEwNSwgNjgsICA5NCwgODcsIDU0LCAgNzMsIDY4LCAzOSwgIDQ4LCA0NCwgMTgsICAgNSwgIDUsICAwLAotICAgIDE5NywgMTc4LCA5NiwgMTc2LCAxNTksIDg2LCAxNTUsIDE0MSwgNzUsIDEzNCwgMTIzLCA2NCwgMTE0LCAxMDUsIDUzLCAgOTQsIDg3LCA0MCwgIDczLCA2OCwgMjYsICA0OCwgNDQsICA1LCAgIDIsICA2LCAgMCwKLSAgICAxOTksIDE3OCwgNzAsIDE3NiwgMTU4LCA2MiwgMTU2LCAxNDEsIDU0LCAxMzQsIDEyMiwgNDQsIDExNCwgMTA0LCAzNSwgIDk0LCA4NiwgMjMsICA3MywgNjcsICA4LCAgNDcsIDQ0LCAgMCwgICAyLCAgNiwgIDAsCi0gICAgMTk5LCAxNzcsIDQ1LCAxNzgsIDE1OCwgNDAsIDE1NiwgMTQwLCAzMiwgMTM1LCAxMjIsIDI2LCAxMTQsIDEwNCwgMTYsICA5NCwgODYsICA0LCAgNzMsIDY3LCAgMCwgIDQ3LCA0NCwgIDAsICAgMCwgIDcsICAwLAotICAgIDE4OCwgMTYxLCAyMDQsIDE2OCwgMTQ0LCAxODMsIDE0OSwgMTI5LCAxNjQsIDEzMCwgMTEyLCAxNDQsIDExMiwgOTUsIDEyMywgIDkzLCA3OCwgMTAzLCAgNzQsIDYwLCA4MSwgIDUwLCAzNiwgNTYsICAxNiwgIDAsIDE2LAotICAgIDE5MCwgMTYwLCAxODUsIDE3MCwgMTQ0LCAxNjUsIDE1MSwgMTI4LCAxNDgsIDEzMiwgMTExLCAxMzAsIDExMiwgOTUsIDExMCwgIDkzLCA3OCwgOTIsICA3NCwgNTksIDcyLCAgNTAsIDM2LCA0OCwgIDE2LCAgMCwgIDgsCi0gICAgMTkyLCAxNjAsIDE2NywgMTcxLCAxNDMsIDE1MCwgMTUzLCAxMjgsIDEzNCwgMTMyLCAxMTEsIDExNywgMTEyLCA5NCwgMTAwLCAgOTQsIDc3LCA4MiwgIDc0LCA1OSwgNjMsICA1MCwgMzYsIDQwLCAgMTQsICAwLCAgMCwKLSAgICAxOTMsIDE1OSwgMTQ5LCAxNzIsIDE0MywgMTM0LCAxNTMsIDEyNywgMTE5LCAxMzMsIDExMCwgMTAzLCAxMTMsIDk0LCA4NywgIDkzLCA3NywgNzIsICA3MywgNTksIDU0LCAgNTAsIDM2LCAzMiwgIDEyLCAgMCwgIDAsCi0gICAgMTk1LCAxNTksIDEzMSwgMTczLCAxNDIsIDExNywgMTUzLCAxMjcsIDEwNCwgMTMyLCAxMTAsIDkwLCAxMTMsIDkzLCA3NiwgIDkzLCA3NiwgNjEsICA3NCwgNTksIDQ1LCAgNDksIDM2LCAyMywgICA5LCAgMCwgIDAsCi0gICAgMTk2LCAxNTgsIDExMywgMTc0LCAxNDEsIDEwMSwgMTU1LCAxMjYsIDg5LCAxMzMsIDEwOSwgNzYsIDExMywgOTMsIDY0LCAgOTQsIDc2LCA1MSwgIDc0LCA1OCwgMzUsICA0OSwgMzYsIDE0LCAgIDYsICAwLCAgMCwKLSAgICAxOTcsIDE1NywgOTIsIDE3NCwgMTQxLCA4MCwgMTU0LCAxMjUsIDcxLCAxMzQsIDEwOCwgNjAsIDExNCwgOTIsIDUwLCAgOTQsIDc1LCAzNywgIDczLCA1OCwgMjIsICA0OCwgMzYsICAxLCAgIDUsICAwLCAgMCwKLSAgICAxOTcsIDE1NywgNjgsIDE3NSwgMTQwLCA1OSwgMTU1LCAxMjQsIDUxLCAxMzQsIDEwOCwgNDEsIDExMywgOTEsIDMyLCAgOTQsIDc1LCAyMSwgIDczLCA1NywgIDUsICA0OCwgMzUsICAwLCAgIDUsICAwLCAgMCwKLSAgICAxOTgsIDE1NiwgNDYsIDE3NiwgMTQwLCA0MCwgMTU1LCAxMjQsIDMyLCAxMzQsIDEwNywgMjQsIDExNCwgOTEsIDE0LCAgOTQsIDc1LCAgMiwgIDczLCA1NywgIDAsICA0OCwgMzYsICAwLCAgIDMsICAwLCAgMCwKLSAgICAxODksIDE0MCwgMTkxLCAxNjgsIDEyNiwgMTcyLCAxNTAsIDExMiwgMTU0LCAxMzEsIDk3LCAxMzQsIDExMiwgODIsIDExNSwgIDk0LCA2NiwgOTYsICA3NCwgNDksIDc1LCAgNTEsIDI1LCA1MCwgIDEyLCAgMCwgMTAsCi0gICAgMTkxLCAxMzksIDE3MywgMTcwLCAxMjUsIDE1NCwgMTUyLCAxMTEsIDEzOCwgMTMyLCA5NiwgMTIxLCAxMTMsIDgxLCAxMDMsICA5NCwgNjYsIDg1LCAgNzQsIDQ4LCA2NiwgIDUwLCAyNiwgNDIsICAxMiwgIDAsICAxLAotICAgIDE5MiwgMTM5LCAxNTcsIDE3MSwgMTI1LCAxNDAsIDE1MiwgMTExLCAxMjUsIDEzMiwgOTYsIDEwOSwgMTEzLCA4MSwgOTIsICA5NCwgNjUsIDc2LCAgNzQsIDQ4LCA1OCwgIDUwLCAyNiwgMzUsICAgOSwgIDAsICAwLAotICAgIDE5MywgMTM5LCAxNDAsIDE3MiwgMTI0LCAxMjUsIDE1MywgMTEwLCAxMTIsIDEzMywgOTUsIDk2LCAxMTMsIDgwLCA4MiwgIDk0LCA2NSwgNjYsICA3NCwgNDksIDUwLCAgNTAsIDI2LCAyOCwgICA3LCAgMCwgIDAsCi0gICAgMTk0LCAxMzgsIDEyMywgMTcyLCAxMjMsIDEwOSwgMTUzLCAxMTAsIDk3LCAxMzMsIDk1LCA4NCwgMTEzLCA4MCwgNzAsICA5NCwgNjUsIDU2LCAgNzQsIDQ4LCA0MCwgIDUwLCAyNiwgMjAsICAgNiwgIDAsICAwLAotICAgIDE5NCwgMTM4LCAxMDUsIDE3MywgMTIzLCA5NCwgMTUzLCAxMDksIDgzLCAxMzMsIDk0LCA3MCwgMTEyLCA3OSwgNTksICA5NCwgNjQsIDQ2LCAgNzQsIDQ4LCAzMSwgIDUwLCAyNiwgIDksICAgNCwgIDAsICAwLAotICAgIDE5NiwgMTM4LCA4NywgMTc0LCAxMjIsIDc3LCAxNTMsIDEwOSwgNjcsIDEzMywgOTMsIDU2LCAxMTMsIDc5LCA0NiwgIDk0LCA2NCwgMzQsICA3MywgNDgsIDE4LCAgNDksIDI3LCAgMCwgICA0LCAgMCwgIDAsCi0gICAgMTk2LCAxMzcsIDY1LCAxNzQsIDEyMiwgNTcsIDE1NCwgMTA4LCA0OSwgMTMzLCA5MywgMzksIDExMywgNzksIDI5LCAgOTQsIDY0LCAxOCwgIDc0LCA0OCwgIDMsICA0OSwgMjcsICAwLCAgIDIsICAwLCAgMCwKLSAgICAxOTcsIDEzNywgNDcsIDE3NSwgMTIyLCA0MCwgMTU1LCAxMDgsIDMyLCAxMzMsIDkzLCAyMywgMTE0LCA3OSwgMTQsICA5NCwgNjQsICAxLCAgNzMsIDQ4LCAgMCwgIDQ4LCAyNywgIDAsICAgMiwgIDAsICAwLAotICAgIDE4OSwgMTE5LCAxNzcsIDE2OCwgMTA2LCAxNTksIDE1MCwgOTQsIDE0MiwgMTMxLCA4MSwgMTI0LCAxMTMsIDY3LCAxMDcsICA5NCwgNTMsIDg5LCAgNzQsIDM3LCA2OSwgIDUxLCAxMSwgNDUsICAgNiwgIDAsICAzLAotICAgIDE5MSwgMTE5LCAxNjEsIDE3MCwgMTA2LCAxNDQsIDE1MiwgOTQsIDEyOSwgMTMyLCA4MSwgMTEyLCAxMTMsIDY3LCA5NiwgIDk0LCA1MywgNzksICA3NCwgMzcsIDYxLCAgNTEsIDEzLCAzOCwgICA2LCAgMCwgIDAsCi0gICAgMTkyLCAxMTksIDE0NiwgMTcwLCAxMDYsIDEzMSwgMTUyLCA5NCwgMTE3LCAxMzIsIDgwLCAxMDEsIDExMiwgNjcsIDg1LCAgOTQsIDUzLCA3MCwgIDc0LCAzNywgNTMsICA1MCwgMTQsIDMxLCAgIDQsICAwLCAgMCwKLSAgICAxOTIsIDExOSwgMTMxLCAxNzEsIDEwNiwgMTE3LCAxNTMsIDk0LCAxMDUsIDEzMiwgODAsIDg5LCAxMTMsIDY3LCA3NSwgIDk0LCA1NCwgNjEsICA3NCwgMzgsIDQ1LCAgNTEsIDE0LCAyMywgICAzLCAgMCwgIDAsCi0gICAgMTkzLCAxMTgsIDExNCwgMTcxLCAxMDYsIDEwMiwgMTUzLCA5MywgOTAsIDEzMiwgODAsIDc4LCAxMTMsIDY3LCA2NSwgIDk0LCA1MywgNTIsICA3NCwgMzcsIDM2LCAgNTAsIDE1LCAxNiwgICAxLCAgMCwgIDAsCi0gICAgMTk0LCAxMTgsIDk5LCAxNzIsIDEwNSwgODksIDE1MywgOTMsIDc4LCAxMzIsIDgwLCA2NiwgMTEzLCA2NywgNTQsICA5NCwgNTMsIDQyLCAgNzQsIDM4LCAyNywgIDUwLCAxNiwgIDUsICAgMSwgIDAsICAwLAotICAgIDE5NCwgMTE4LCA4MiwgMTczLCAxMDUsIDcyLCAxNTMsIDkzLCA2MywgMTMyLCA3OSwgNTMsIDExMywgNjcsIDQyLCAgOTQsIDUzLCAzMCwgIDc0LCAzOCwgMTUsICA0OSwgMTYsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxOTUsIDExNywgNjMsIDE3MywgMTA1LCA1NSwgMTU0LCA5MywgNDcsIDEzMywgNzksIDM3LCAxMTMsIDY2LCAyNywgIDk0LCA1MywgMTUsICA3MywgMzgsICAwLCAgNDgsIDE2LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTk1LCAxMTcsIDQ2LCAxNzMsIDEwNCwgMzksIDE1NCwgOTIsIDMyLCAxMzMsIDc5LCAyMiwgMTEzLCA2NiwgMTMsICA5NCwgNTMsICAwLCAgNzMsIDM4LCAgMCwgIDQ4LCAxNywgIDAsICAgMCwgIDAsICAwLAotICAgIDE4OSwgOTYsIDE2NiwgMTY4LCA4NSwgMTQ3LCAxNTAsIDc0LCAxMzIsIDEzMSwgNjIsIDExNSwgMTEzLCA1MSwgOTksICA5NCwgMzgsIDgyLCAgNzQsIDIxLCA2MywgIDUxLCAgMCwgNDAsICAgMSwgIDAsICAwLAotICAgIDE5MCwgOTYsIDE1MCwgMTcwLCA4NSwgMTMzLCAxNTIsIDc1LCAxMTksIDEzMiwgNjMsIDEwNCwgMTEzLCA1MSwgODgsICA5NCwgMzgsIDcyLCAgNzUsIDIyLCA1NSwgIDUxLCAgMCwgMzMsICAgMSwgIDAsICAwLAotICAgIDE5MiwgOTYsIDEzNywgMTcwLCA4NSwgMTIxLCAxNTIsIDc0LCAxMDgsIDEzMiwgNjQsIDk0LCAxMTMsIDUyLCA3OSwgIDk0LCAzOSwgNjQsICA3NCwgMjMsIDQ4LCAgNTAsICAwLCAyNiwgICAwLCAgMCwgIDAsCi0gICAgMTkyLCA5NiwgMTIyLCAxNzEsIDg2LCAxMDksIDE1MiwgNzUsIDk2LCAxMzIsIDYzLCA4MywgMTEzLCA1MiwgNjksICA5NCwgMzksIDU2LCAgNzQsIDI0LCA0MSwgIDUwLCAgMCwgMTksICAgMCwgIDAsICAwLAotICAgIDE5MywgOTYsIDEwNywgMTcxLCA4NSwgOTYsIDE1MiwgNzUsIDg0LCAxMzIsIDY0LCA3MiwgMTEzLCA1MiwgNjAsICA5NCwgMzksIDQ3LCAgNzQsIDI0LCAzMiwgIDUwLCAgMSwgMTAsICAgMCwgIDAsICAwLAotICAgIDE5MywgOTYsIDkzLCAxNzIsIDg1LCA4MiwgMTUyLCA3NSwgNzIsIDEzMywgNjMsIDYxLCAxMTMsIDUxLCA0OSwgIDk0LCAzOSwgMzcsICA3MywgMjUsIDIzLCAgNDksICAyLCAgMiwgICAwLCAgMCwgIDAsCi0gICAgMTk0LCA5NiwgNzgsIDE3MiwgODUsIDY4LCAxNTIsIDc1LCA1OSwgMTMyLCA2MywgNDksIDExMywgNTIsIDM5LCAgOTQsIDQwLCAyNiwgIDczLCAyNSwgMTEsICA0OCwgIDMsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxOTQsIDk2LCA2MCwgMTczLCA4NSwgNTIsIDE1MywgNzUsIDQ0LCAxMzIsIDY0LCAzNSwgMTEyLCA1MiwgMjUsICA5NCwgNDAsIDEyLCAgNzMsIDI2LCAgMCwgIDQ4LCAgNCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE5NSwgOTYsIDQ2LCAxNzMsIDg1LCAzOCwgMTU0LCA3NCwgMzEsIDEzMywgNjMsIDIyLCAxMTMsIDUyLCAxMSwgIDkzLCA0MCwgIDAsICA3MywgMjYsICAwLCAgNDcsICA1LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTg4LCA2NywgMTUzLCAxNjgsIDU4LCAxMzcsIDE1MSwgNDksIDEyMiwgMTMxLCAzOSwgMTA2LCAxMTMsIDI4LCA5MCwgIDk0LCAxMywgNzUsICA3NSwgIDAsIDU3LCAgNTEsICAwLCAzNSwgICAwLCAgMCwgIDAsCi0gICAgMTkwLCA2OCwgMTM4LCAxNzAsIDU5LCAxMjMsIDE1MiwgNTAsIDExMCwgMTMyLCA0MSwgOTYsIDExMywgMjksIDgwLCAgOTQsIDE2LCA2NiwgIDc1LCAgMCwgNDksICA1MCwgIDAsIDI3LCAgIDAsICAwLCAgMCwKLSAgICAxOTEsIDY5LCAxMjYsIDE3MCwgNTksIDExMiwgMTUxLCA1MiwgMTAwLCAxMzIsIDQyLCA4NiwgMTEzLCAzMCwgNzMsICA5NSwgMTcsIDU4LCAgNzUsICAwLCA0MiwgIDUwLCAgMCwgMjEsICAgMCwgIDAsICAwLAotICAgIDE5MiwgNzAsIDExMywgMTcwLCA2MSwgMTAwLCAxNTEsIDUyLCA4OSwgMTMyLCA0MiwgNzcsIDExMywgMzEsIDY0LCAgOTQsIDE5LCA1MCwgIDc0LCAgMSwgMzUsICA1MCwgIDAsIDE0LCAgIDAsICAwLCAgMCwKLSAgICAxOTIsIDcwLCAxMDAsIDE3MCwgNjIsIDg5LCAxNTEsIDUzLCA3NywgMTMxLCA0MywgNjYsIDExMiwgMzIsIDU0LCAgOTQsIDIwLCA0MiwgIDc0LCAgMiwgMjcsICA0OSwgIDAsICA1LCAgIDAsICAwLCAgMCwKLSAgICAxOTIsIDcxLCA4NywgMTcxLCA2MSwgNzcsIDE1MiwgNTMsIDY3LCAxMzEsIDQ0LCA1NywgMTEyLCAzMywgNDUsICA5NCwgMjEsIDMzLCAgNzQsICA0LCAxOSwgIDQ5LCAgMCwgIDEsICAgMCwgIDAsICAwLAotICAgIDE5MywgNzEsIDc0LCAxNzEsIDYyLCA2NCwgMTUyLCA1MywgNTUsIDEzMiwgNDQsIDQ1LCAxMTMsIDM0LCAzNCwgIDk0LCAyMiwgMjMsICA3MywgIDUsICA3LCAgNDgsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTkzLCA3MCwgNTgsIDE3MiwgNjIsIDUwLCAxNTIsIDU0LCA0MiwgMTMyLCA0NCwgMzIsIDExMiwgMzUsIDIyLCAgOTMsIDIzLCAxMCwgIDczLCAgNiwgIDAsICA0NywgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxOTMsIDcwLCA0NSwgMTcyLCA2MiwgMzgsIDE1MywgNTQsIDMxLCAxMzIsIDQ0LCAyMSwgMTEyLCAzNSwgIDksICA5NCwgMjMsICAwLCAgNzMsICA3LCAgMCwgIDQ3LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE4OSwgMjYsIDE0MSwgMTY5LCAxNSwgMTI2LCAxNTAsICAyLCAxMTIsIDEzMSwgIDAsIDk3LCAxMTMsICAwLCA4MiwgIDk0LCAgMCwgNjcsICA3NSwgIDAsIDUxLCAgNTAsICAwLCAyOSwgICAwLCAgMCwgIDAsCi0gICAgMTkwLCAyOCwgMTI4LCAxNzAsIDE4LCAxMTQsIDE1MSwgIDgsIDEwMSwgMTMyLCAgMCwgODgsIDExMywgIDAsIDc0LCAgOTQsICAwLCA2MCwgIDc1LCAgMCwgNDQsICA1MCwgIDAsIDIzLCAgIDAsICAwLCAgMCwKLSAgICAxOTEsIDMwLCAxMTcsIDE3MCwgMjMsIDEwNCwgMTUyLCAxMSwgOTIsIDEzMiwgIDEsIDc5LCAxMTMsICAwLCA2NywgIDk1LCAgMCwgNTMsICA3NSwgIDAsIDM3LCAgNTAsICAwLCAxNywgICAwLCAgMCwgIDAsCi0gICAgMTkxLCAzMywgMTA1LCAxNzAsIDI2LCA5MywgMTUxLCAxOCwgODMsIDEzMiwgIDYsIDcwLCAxMTIsICAwLCA1OCwgIDk0LCAgMCwgNDUsICA3NSwgIDAsIDMwLCAgNDksICAwLCAgOCwgICAwLCAgMCwgIDAsCi0gICAgMTkxLCAzNCwgOTMsIDE3MCwgMjcsIDgyLCAxNTEsIDIwLCA3MiwgMTMxLCAgOCwgNjEsIDExMiwgIDAsIDQ5LCAgOTQsICAwLCAzOCwgIDc0LCAgMCwgMjMsICA0OSwgIDAsICA0LCAgIDAsICAwLCAgMCwKLSAgICAxOTEsIDM2LCA4MiwgMTcwLCAyOSwgNzEsIDE1MSwgMjIsIDYzLCAxMzEsIDExLCA1MiwgMTEyLCAgMCwgNDEsICA5MywgIDAsIDI5LCAgNzQsICAwLCAxNCwgIDQ4LCAgMCwgIDEsICAgMCwgIDAsICAwLAotICAgIDE5MSwgMzgsIDY5LCAxNzAsIDMxLCA2MCwgMTUxLCAyNCwgNTEsIDEzMSwgMTQsIDQxLCAxMTIsICAxLCAzMSwgIDkzLCAgMCwgMTksICA3MywgIDAsICAzLCAgNDgsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTkyLCAzNywgNTYsIDE3MSwgMzEsIDQ3LCAxNTIsIDI1LCA0MCwgMTMxLCAxNywgMzAsIDExMiwgIDQsIDE5LCAgOTMsICAwLCAgNywgIDczLCAgMCwgIDAsICA0NywgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxOTIsIDM4LCA0NSwgMTcxLCAzMywgMzYsIDE1MiwgMjYsIDMwLCAxMzEsIDE4LCAyMSwgMTExLCAgNywgIDksICA5MywgIDAsICAwLCAgNzMsICAwLCAgMCwgIDQ3LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE0OSwgMjE4LCAyNDgsIDEzMywgMTk0LCAyMjIsIDExOSwgMTczLCAxOTgsIDEwMiwgMTUxLCAxNzMsICA4NiwgMTMwLCAxNDgsICA3MCwgMTA4LCAxMjUsICA1MywgODUsIDEwMCwgIDMyLCA1OSwgNzEsICAgMCwgMjIsIDMzLAotICAgIDE1NCwgMjE2LCAyMjMsIDEzNywgMTkzLCAyMDAsIDEyMiwgMTcyLCAxNzgsIDEwNiwgMTUwLCAxNTYsICA4OSwgMTI4LCAxMzMsICA3MywgMTA3LCAxMTIsICA1NCwgODUsIDg5LCAgMzEsIDU5LCA2MywgICAwLCAyMiwgMjYsCi0gICAgMTU5LCAyMTUsIDIwMiwgMTQxLCAxOTIsIDE4MSwgMTI2LCAxNzEsIDE2MSwgMTA4LCAxNDksIDE0MSwgIDkwLCAxMjgsIDEyMSwgIDc0LCAxMDcsIDEwMCwgIDU1LCA4NSwgODAsICAzMiwgNTgsIDU1LCAgIDAsIDIyLCAxOSwKLSAgICAxNjEsIDIxMywgMTc5LCAxNDQsIDE5MCwgMTYwLCAxMjYsIDE3MCwgMTQzLCAxMDksIDE0OCwgMTI1LCAgOTIsIDEyNywgMTA3LCAgNzQsIDEwNiwgODksICA1NiwgODQsIDY5LCAgMzIsIDU4LCA0NiwgICAwLCAyMSwgMTEsCi0gICAgMTYzLCAyMTEsIDE1NiwgMTQ0LCAxODksIDEzOSwgMTI5LCAxNjgsIDEyNSwgMTEwLCAxNDcsIDEwOCwgIDkzLCAxMjYsIDkyLCAgNzUsIDEwNSwgNzYsICA1NywgODMsIDU4LCAgMzMsIDU4LCAzNywgICAwLCAyMSwgIDEsCi0gICAgMTY3LCAyMTEsIDEzMywgMTQ3LCAxODgsIDEyMCwgMTMwLCAxNjcsIDEwNSwgMTEwLCAxNDUsIDkyLCAgOTMsIDEyNSwgNzgsICA3NiwgMTA0LCA2NCwgIDU4LCA4MywgNDgsICAzMywgNTcsIDI3LCAgIDAsIDIxLCAgMCwKLSAgICAxNjksIDIxMCwgMTA4LCAxNDksIDE4NywgOTYsIDEzMSwgMTY2LCA4NiwgMTEyLCAxNDQsIDc0LCAgOTQsIDEyNCwgNjIsICA3NywgMTAzLCA0OSwgIDU4LCA4MiwgMzUsICAzMywgNTcsIDE1LCAgIDAsIDIxLCAgMCwKLSAgICAxNzAsIDIwOSwgODAsIDE1MSwgMTg2LCA3MSwgMTMzLCAxNjUsIDYyLCAxMTQsIDE0MywgNTIsICA5NSwgMTIzLCA0MiwgIDc3LCAxMDMsIDMyLCAgNTgsIDgxLCAxOCwgIDMzLCA1NiwgIDAsICAgMCwgMjEsICAwLAotICAgIDE3MywgMjA4LCA1NSwgMTUyLCAxODYsIDQ5LCAxMzQsIDE2NSwgNDEsIDExNCwgMTQzLCAzNCwgIDk1LCAxMjIsIDI1LCAgNzcsIDEwMiwgMTQsICA1OCwgODEsICAwLCAgMzMsIDU2LCAgMCwgICAwLCAyMSwgIDAsCi0gICAgMTU0LCAxOTUsIDIzMiwgMTM3LCAxNzQsIDIwNywgMTIyLCAxNTYsIDE4NSwgMTA1LCAxMzYsIDE2MywgIDg5LCAxMTYsIDE0MCwgIDczLCA5NywgMTE3LCAgNTYsIDc2LCA5NCwgIDM1LCA1MSwgNjYsICAgMCwgMTMsIDI4LAotICAgIDE1OCwgMTk0LCAyMDksIDE0MSwgMTc0LCAxODcsIDEyNSwgMTU1LCAxNjcsIDEwOSwgMTM1LCAxNDYsICA5MSwgMTE2LCAxMjUsICA3NSwgOTYsIDEwNSwgIDU3LCA3NSwgODMsICAzNSwgNTAsIDU3LCAgIDAsIDEyLCAyMSwKLSAgICAxNjEsIDE5MywgMTg5LCAxNDQsIDE3MywgMTY5LCAxMjgsIDE1NCwgMTUxLCAxMTAsIDEzNCwgMTMyLCAgOTMsIDExNSwgMTEzLCAgNzcsIDk1LCA5NCwgIDU4LCA3NSwgNzQsICAzNSwgNTAsIDUwLCAgIDAsIDEyLCAxMywKLSAgICAxNjQsIDE5MiwgMTY4LCAxNDUsIDE3MSwgMTUxLCAxMjksIDE1MywgMTM0LCAxMTEsIDEzMywgMTE3LCAgOTQsIDExNCwgMTAwLCAgNzYsIDk1LCA4MiwgIDU4LCA3NSwgNjQsICAzNiwgNTAsIDQyLCAgIDAsIDEyLCAgNSwKLSAgICAxNjUsIDE5MSwgMTQ3LCAxNDcsIDE3MCwgMTMxLCAxMzAsIDE1MiwgMTE3LCAxMTMsIDEzMiwgMTAyLCAgOTUsIDExMywgODYsICA3NywgOTQsIDcxLCAgNTgsIDc0LCA1NCwgIDM1LCA1MCwgMzMsICAgMCwgMTMsICAwLAotICAgIDE2NywgMTg5LCAxMjYsIDE0OCwgMTY5LCAxMTMsIDEzMiwgMTUxLCAxMDAsIDExMywgMTMxLCA4NiwgIDk2LCAxMTIsIDczLCAgNzcsIDkzLCA1OSwgIDU5LCA3MywgNDMsICAzNSwgNDksIDIzLCAgIDAsIDEyLCAgMCwKLSAgICAxNzAsIDE4OSwgMTA0LCAxNTAsIDE2OCwgOTEsIDEzMywgMTUwLCA4MSwgMTE0LCAxMzAsIDY5LCAgOTYsIDExMSwgNTcsICA3OCwgOTIsIDQ2LCAgNTksIDczLCAzMSwgIDM1LCA0OSwgMTEsICAgMCwgMTMsICAwLAotICAgIDE3MSwgMTg4LCA3OCwgMTUyLCAxNjgsIDY4LCAxMzQsIDE0OSwgNjAsIDExNSwgMTMwLCA1MCwgIDk2LCAxMTEsIDQxLCAgNzgsIDkyLCAyOSwgIDYwLCA3MywgMTUsICAzNSwgNDksICAwLCAgIDAsIDEyLCAgMCwKLSAgICAxNzMsIDE4NywgNTUsIDE1MywgMTY3LCA0NywgMTM0LCAxNDksIDM5LCAxMTUsIDEyOSwgMzMsICA5NywgMTEwLCAyNCwgIDc5LCA5MiwgMTMsICA2MCwgNzIsICAwLCAgMzUsIDQ4LCAgMCwgICAwLCAxMiwgIDAsCi0gICAgMTU3LCAxNzUsIDIxNywgMTM5LCAxNTcsIDE5NiwgMTI1LCAxNDEsIDE3NSwgMTA5LCAxMjIsIDE1MywgIDkyLCAxMDQsIDEzMiwgIDc2LCA4NiwgMTEwLCAgNTksIDY3LCA4OCwgIDM3LCA0MywgNjEsICAgMSwgIDEsIDIzLAotICAgIDE2MSwgMTc0LCAxOTYsIDE0NCwgMTU2LCAxNzYsIDEyNywgMTQwLCAxNTgsIDExMCwgMTIxLCAxMzcsICA5NCwgMTA0LCAxMTgsICA3NywgODUsIDk4LCAgNTksIDY3LCA3OCwgIDM3LCA0MywgNTMsICAgMCwgIDIsIDE2LAotICAgIDE2MywgMTc0LCAxNzgsIDE0NiwgMTU2LCAxNjAsIDEzMCwgMTM5LCAxNDMsIDExMiwgMTIxLCAxMjQsICA5NSwgMTAzLCAxMDYsICA3OCwgODUsIDg4LCAgNjAsIDY2LCA2OSwgIDM3LCA0MiwgNDYsICAgMCwgIDIsICA3LAotICAgIDE2NiwgMTczLCAxNTksIDE0NywgMTU0LCAxNDIsIDEzMCwgMTM4LCAxMjcsIDExMywgMTIwLCAxMTEsICA5NiwgMTAzLCA5NSwgIDc4LCA4NCwgNzcsICA2MCwgNjYsIDU5LCAgMzcsIDQzLCAzNywgICAwLCAgMiwgIDAsCi0gICAgMTY2LCAxNzIsIDEzOSwgMTQ4LCAxNTQsIDEyNSwgMTMxLCAxMzcsIDExMiwgMTEzLCAxMjAsIDk2LCAgOTYsIDEwMiwgODEsICA3OCwgODQsIDY2LCAgNjAsIDY1LCA1MCwgIDM3LCA0MiwgMjksICAgMCwgIDMsICAwLAotICAgIDE2NywgMTcxLCAxMjAsIDE0OSwgMTUzLCAxMDcsIDEzMywgMTM3LCA5NSwgMTE0LCAxMTgsIDgxLCAgOTcsIDEwMSwgNjksICA3OSwgODQsIDU2LCAgNjAsIDY1LCA0MCwgIDM3LCA0MiwgMTksICAgMCwgIDMsICAwLAotICAgIDE3MCwgMTcwLCA5OSwgMTUxLCAxNTIsIDg3LCAxMzQsIDEzNiwgNzcsIDExNSwgMTE4LCA2NiwgIDk3LCAxMDEsIDU1LCAgNzksIDgzLCA0MiwgIDYxLCA2NSwgMjgsICAzNywgNDIsICA3LCAgIDAsICAzLCAgMCwKLSAgICAxNzIsIDE3MCwgNzUsIDE1MiwgMTUxLCA2NSwgMTM0LCAxMzUsIDU3LCAxMTUsIDExNywgNDgsICA5NywgMTAwLCAzOCwgIDc5LCA4MywgMjcsICA2MSwgNjQsIDEyLCAgMzYsIDQyLCAgMCwgICAwLCAgMywgIDAsCi0gICAgMTcyLCAxNjksIDU1LCAxNTQsIDE1MSwgNDYsIDEzNSwgMTM0LCA0MCwgMTE2LCAxMTYsIDMyLCAgOTcsIDk5LCAyMSwgIDgwLCA4MiwgMTAsICA2MSwgNjQsICAwLCAgMzYsIDQxLCAgMCwgICAwLCAgMywgIDAsCi0gICAgMTYwLCAxNTQsIDIwMywgMTQzLCAxMzksIDE4MiwgMTI3LCAxMjQsIDE2NCwgMTExLCAxMDcsIDE0MywgIDk1LCA5MSwgMTIyLCAgNzgsIDc1LCAxMDMsICA2MCwgNTcsIDgxLCAgMzksIDMzLCA1NiwgICAxLCAgMCwgMTgsCi0gICAgMTYzLCAxNTQsIDE4NCwgMTQ2LCAxMzgsIDE2NSwgMTMwLCAxMjMsIDE0OCwgMTEzLCAxMDcsIDEyOSwgIDk2LCA5MCwgMTEwLCAgNzksIDc0LCA5MiwgIDYxLCA1NiwgNzIsICAzOSwgMzQsIDQ4LCAgIDIsICAwLCAgOSwKLSAgICAxNjUsIDE1NCwgMTY3LCAxNDcsIDEzNywgMTQ5LCAxMzEsIDEyMiwgMTM0LCAxMTQsIDEwNiwgMTE3LCAgOTYsIDkwLCAxMDAsICA3OSwgNzQsIDgyLCAgNjEsIDU2LCA2NCwgIDM5LCAzMywgNDAsICAgMiwgIDAsICAxLAotICAgIDE2NiwgMTUzLCAxNTAsIDE0OSwgMTM3LCAxMzMsIDEzMiwgMTIyLCAxMTksIDExNCwgMTA2LCAxMDQsICA5NywgOTAsIDg4LCAgNzksIDc0LCA3MiwgIDYxLCA1NiwgNTUsICAzOSwgMzQsIDMzLCAgIDAsICAwLCAgMCwKLSAgICAxNjgsIDE1MiwgMTMyLCAxNDksIDEzNiwgMTE3LCAxMzIsIDEyMSwgMTA0LCAxMTQsIDEwNSwgOTAsICA5NywgODksIDc2LCAgNzksIDczLCA2MiwgIDYxLCA1NiwgNDYsICAzOCwgMzQsIDI1LCAgIDAsICAwLCAgMCwKLSAgICAxNjksIDE1MSwgMTE0LCAxNTAsIDEzNSwgMTAxLCAxMzMsIDEyMSwgOTAsIDExNCwgMTA0LCA3NywgIDk3LCA4OSwgNjUsICA4MCwgNzMsIDUxLCAgNjEsIDU2LCAzNiwgIDM4LCAzNCwgMTYsICAgMCwgIDAsICAwLAotICAgIDE3MCwgMTUwLCA5NCwgMTUxLCAxMzUsIDgzLCAxMzQsIDEyMCwgNzMsIDExNSwgMTA0LCA2MiwgIDk4LCA4OCwgNTEsICA4MCwgNzIsIDM5LCAgNjEsIDU2LCAyNCwgIDM4LCAzNCwgIDMsICAgMCwgIDAsICAwLAotICAgIDE3MiwgMTUwLCA3MiwgMTUzLCAxMzQsIDYzLCAxMzUsIDExOSwgNTUsIDExNSwgMTAzLCA0NSwgIDk4LCA4OCwgMzYsICA4MCwgNzIsIDI0LCAgNjEsIDU1LCAgOSwgIDM4LCAzNCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE3MiwgMTUwLCA1NCwgMTUzLCAxMzQsIDQ3LCAxMzUsIDExOSwgMzgsIDExNiwgMTAzLCAzMCwgIDk4LCA4NywgMjEsICA4MCwgNzIsICA4LCAgNjIsIDU1LCAgMCwgIDM3LCAzNCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE2MiwgMTM0LCAxOTAsIDE0NSwgMTIwLCAxNzEsIDEyOSwgMTA4LCAxNTMsIDExMywgOTMsIDEzNCwgIDk3LCA3OCwgMTE1LCAgODAsIDYzLCA5NiwgIDYyLCA0NiwgNzUsICA0MSwgMjMsIDUxLCAgIDAsICAwLCAxMSwKLSAgICAxNjUsIDEzNCwgMTczLCAxNDcsIDEyMCwgMTU0LCAxMzEsIDEwNywgMTM4LCAxMTQsIDkyLCAxMjAsICA5NywgNzgsIDEwMywgIDgwLCA2MywgODUsICA2MiwgNDYsIDY2LCAgNDAsIDIzLCA0MywgICAwLCAgMCwgIDIsCi0gICAgMTY2LCAxMzQsIDE1NywgMTQ4LCAxMjAsIDE0MCwgMTMyLCAxMDYsIDEyNSwgMTE0LCA5MiwgMTA5LCAgOTcsIDc3LCA5MywgIDgxLCA2MywgNzcsICA2MiwgNDYsIDU4LCAgNDAsIDI0LCAzNiwgICAwLCAgMCwgIDAsCi0gICAgMTY4LCAxMzMsIDE0MCwgMTQ5LCAxMTksIDEyNSwgMTMyLCAxMDYsIDExMiwgMTE1LCA5MiwgOTcsICA5OCwgNzcsIDgyLCAgODEsIDYyLCA2NywgIDYyLCA0NiwgNTAsICA0MCwgMjQsIDI5LCAgIDAsICAwLCAgMCwKLSAgICAxNjgsIDEzMywgMTIzLCAxNTAsIDExOSwgMTEwLCAxMzMsIDEwNiwgOTcsIDExNSwgOTEsIDg0LCAgOTgsIDc3LCA3MCwgIDgxLCA2MiwgNTcsICA2MiwgNDYsIDQxLCAgNDAsIDI0LCAyMCwgICAwLCAgMCwgIDAsCi0gICAgMTY5LCAxMzIsIDEwNywgMTUwLCAxMTgsIDk0LCAxMzMsIDEwNSwgODQsIDExNSwgOTEsIDcyLCAgOTgsIDc2LCA2MCwgIDgwLCA2MiwgNDcsICA2MiwgNDYsIDMyLCAgMzksIDI1LCAxMSwgICAwLCAgMCwgIDAsCi0gICAgMTcxLCAxMzIsIDg5LCAxNTIsIDExOCwgNzksIDEzNSwgMTA1LCA2OSwgMTE1LCA5MCwgNTgsICA5OCwgNzYsIDQ3LCAgODAsIDYyLCAzNiwgIDYyLCA0NiwgMjEsICAzOSwgMjUsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNzEsIDEzMiwgNjksIDE1MywgMTE3LCA2MCwgMTM1LCAxMDQsIDUyLCAxMTYsIDkwLCA0MiwgIDk4LCA3NiwgMzMsICA4MSwgNjEsIDIxLCAgNjIsIDQ2LCAgNiwgIDM4LCAyNSwgIDAsICAgMCwgIDAsICAwLAotICAgIDE3MiwgMTMyLCA1NCwgMTUzLCAxMTgsIDQ1LCAxMzUsIDEwNCwgMzgsIDExNiwgOTAsIDI4LCAgOTgsIDc2LCAxOCwgIDgxLCA2MSwgIDYsICA2MiwgNDYsICAwLCAgMzgsIDI1LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTY0LCAxMTUsIDE3NywgMTQ2LCAxMDMsIDE1OSwgMTMwLCA5MSwgMTQzLCAxMTQsIDc4LCAxMjUsICA5NywgNjUsIDEwNywgIDgxLCA1MSwgODksICA2MywgMzQsIDY5LCAgNDEsICA5LCA0NiwgICAwLCAgMCwgIDQsCi0gICAgMTY2LCAxMTUsIDE2MSwgMTQ4LCAxMDMsIDE0NCwgMTMyLCA5MSwgMTI5LCAxMTUsIDc4LCAxMTIsICA5OCwgNjUsIDk2LCAgODEsIDUxLCA3OSwgIDYzLCAzNSwgNjEsICA0MSwgMTEsIDM4LCAgIDAsICAwLCAgMCwKLSAgICAxNjcsIDExNSwgMTQ2LCAxNTAsIDEwMiwgMTMxLCAxMzIsIDkxLCAxMTcsIDExNSwgNzgsIDEwMSwgIDk4LCA2NSwgODYsICA4MSwgNTEsIDcxLCAgNjMsIDM1LCA1NCwgIDQxLCAxMiwgMzIsICAgMCwgIDAsICAwLAotICAgIDE2OCwgMTE0LCAxMzIsIDE1MCwgMTAzLCAxMTgsIDEzMywgOTEsIDEwNSwgMTE2LCA3OCwgOTEsICA5OCwgNjQsIDc2LCAgODIsIDUxLCA2MSwgIDYzLCAzNiwgNDYsICA0MSwgMTMsIDI0LCAgIDAsICAwLCAgMCwKLSAgICAxNjksIDExNCwgMTE2LCAxNTAsIDEwMiwgMTAzLCAxMzQsIDkwLCA5MSwgMTE2LCA3OCwgNzksICA5OCwgNjUsIDY2LCAgODEsIDUxLCA1MywgIDYzLCAzNiwgMzcsICA0MCwgMTQsIDE3LCAgIDAsICAwLCAgMCwKLSAgICAxNjksIDExNCwgMTAxLCAxNTEsIDEwMSwgODksIDEzNCwgOTAsIDc5LCAxMTYsIDc3LCA2NywgIDk4LCA2NCwgNTYsICA4MSwgNTEsIDQ0LCAgNjMsIDM2LCAyOSwgIDQwLCAxNSwgIDcsICAgMCwgIDAsICAwLAotICAgIDE3MCwgMTE0LCA4NSwgMTUyLCAxMDEsIDc1LCAxMzUsIDkwLCA2NSwgMTE2LCA3NywgNTQsICA5OCwgNjQsIDQ0LCAgODEsIDUxLCAzMiwgIDYzLCAzNiwgMTcsICAzOSwgMTUsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNzIsIDExMywgNjYsIDE1MiwgMTAxLCA1OCwgMTM1LCA4OSwgNDksIDExNiwgNzcsIDQwLCAgOTksIDY0LCAzMCwgIDgxLCA1MSwgMTgsICA2MiwgMzYsICAzLCAgMzgsIDE2LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTcxLCAxMTMsIDUxLCAxNTMsIDEwMSwgNDQsIDEzNiwgODksIDM2LCAxMTYsIDc3LCAyOCwgIDk5LCA2NCwgMTgsICA4MSwgNTEsICA1LCAgNjIsIDM2LCAgMCwgIDM4LCAxNiwgIDAsICAgMCwgIDAsICAwLAotICAgIDE2NSwgOTQsIDE2NiwgMTQ3LCA4MiwgMTQ3LCAxMzIsIDcyLCAxMzIsIDExNSwgNjEsIDExNSwgIDk4LCA0OSwgOTksICA4MiwgMzYsIDgyLCAgNjQsIDE5LCA2NCwgIDQyLCAgMCwgNDEsICAgMCwgIDAsICAwLAotICAgIDE2NywgOTMsIDE1MCwgMTUwLCA4MywgMTM0LCAxMzMsIDczLCAxMjAsIDExNiwgNjIsIDEwNCwgIDk5LCA0OSwgODgsICA4MiwgMzYsIDcyLCAgNjQsIDIwLCA1NSwgIDQxLCAgMCwgMzMsICAgMCwgIDAsICAwLAotICAgIDE2OSwgOTMsIDEzNywgMTUwLCA4MywgMTIyLCAxMzQsIDczLCAxMDksIDExNiwgNjEsIDk0LCAgOTksIDUwLCA4MCwgIDgyLCAzNywgNjUsICA2NCwgMjEsIDQ5LCAgNDEsICAwLCAyNywgICAwLCAgMCwgIDAsCi0gICAgMTY5LCA5NCwgMTIzLCAxNTAsIDgzLCAxMTAsIDEzMywgNzMsIDk3LCAxMTYsIDYxLCA4MywgIDk5LCA1MCwgNzAsICA4MiwgMzgsIDU3LCAgNjMsIDIzLCA0MiwgIDQxLCAgMCwgMjAsICAgMCwgIDAsICAwLAotICAgIDE2OSwgOTQsIDEwOSwgMTUwLCA4NCwgOTcsIDEzNCwgNzMsIDg1LCAxMTYsIDYyLCA3MywgIDk5LCA1MSwgNjEsICA4MSwgMzgsIDQ4LCAgNjMsIDIzLCAzMywgIDQxLCAgMSwgMTEsICAgMCwgIDAsICAwLAotICAgIDE3MCwgOTQsIDk2LCAxNTAsIDgzLCA4NCwgMTM0LCA3MywgNzQsIDExNiwgNjEsIDYyLCAgOTksIDUwLCA1MSwgIDgyLCAzOCwgMzksICA2NCwgMjMsIDI0LCAgNDAsICAzLCAgNCwgICAwLCAgMCwgIDAsCi0gICAgMTcxLCA5MywgNzksIDE1MiwgODIsIDcwLCAxMzUsIDczLCA2MSwgMTE2LCA2MiwgNTEsICA5OCwgNTEsIDQwLCAgODEsIDM4LCAyOCwgIDYzLCAyNCwgMTQsICAzOSwgIDQsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNzEsIDk0LCA2NCwgMTUyLCA4MywgNTUsIDEzNSwgNzMsIDQ3LCAxMTYsIDYyLCAzNywgIDk4LCA1MCwgMjcsICA4MSwgMzgsIDE1LCAgNjMsIDI0LCAgMSwgIDM5LCAgNCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE3MiwgOTMsIDUxLCAxNTMsIDgyLCA0MiwgMTM1LCA3MywgMzUsIDExNywgNjIsIDI2LCAgOTksIDUxLCAxNiwgIDgxLCAzOSwgIDMsICA2MywgMjUsICAwLCAgMzgsICA1LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTY2LCA2OCwgMTUzLCAxNDgsIDU5LCAxMzcsIDEzMywgNDksIDEyMSwgMTE1LCAzOSwgMTA2LCAgOTksIDI4LCA5MSwgIDgyLCAxMywgNzUsICA2NSwgIDAsIDU4LCAgNDIsICAwLCAzNiwgICAwLCAgMCwgIDAsCi0gICAgMTY4LCA2OCwgMTM5LCAxNTAsIDU5LCAxMjQsIDEzNCwgNTAsIDExMCwgMTE2LCA0MCwgOTYsICA5OSwgMzAsIDgxLCAgODIsIDE2LCA2NiwgIDY0LCAgMCwgNTAsICA0MSwgIDAsIDI5LCAgIDAsICAwLCAgMCwKLSAgICAxNjksIDY5LCAxMjYsIDE1MCwgNTksIDExMywgMTM0LCA1MSwgMTAxLCAxMTcsIDQyLCA4NywgMTAwLCAzMCwgNzMsICA4MiwgMTcsIDU5LCAgNjUsICAwLCA0MywgIDQxLCAgMCwgMjMsICAgMCwgIDAsICAwLAotICAgIDE2OSwgNzAsIDExNSwgMTUwLCA2MSwgMTAyLCAxMzQsIDUyLCA4OSwgMTE2LCA0MiwgNzcsICA5OSwgMzIsIDY1LCAgODIsIDE5LCA1MiwgIDY0LCAgMCwgMzYsICA0MSwgIDAsIDE1LCAgIDAsICAwLCAgMCwKLSAgICAxNjksIDcwLCAxMDEsIDE1MCwgNjEsIDkwLCAxMzQsIDUyLCA3OSwgMTE2LCA0MywgNjgsICA5OSwgMzIsIDU1LCAgODIsIDIxLCA0MywgIDY0LCAgMiwgMjgsICA0MSwgIDAsICA2LCAgIDAsICAwLCAgMCwKLSAgICAxNzAsIDcwLCA4OSwgMTUxLCA2MiwgNzksIDEzNCwgNTMsIDY5LCAxMTYsIDQ0LCA1OCwgIDk5LCAzMywgNDYsICA4MSwgMjEsIDM0LCAgNjQsICAzLCAyMCwgIDQxLCAgMCwgIDIsICAgMCwgIDAsICAwLAotICAgIDE3MCwgNzEsIDc2LCAxNTIsIDYyLCA2NiwgMTM0LCA1MywgNTcsIDExNiwgNDMsIDQ2LCAgOTksIDMzLCAzNiwgIDgyLCAyMiwgMjQsICA2NCwgIDUsIDEwLCAgNDAsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTcxLCA3MCwgNjEsIDE1MiwgNjIsIDUyLCAxMzUsIDUzLCA0NCwgMTE2LCA0NCwgMzUsICA5OSwgMzQsIDI0LCAgODIsIDIyLCAxMiwgIDYzLCAgNiwgIDAsICAzOSwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNzEsIDcxLCA0OSwgMTUzLCA2MiwgNDEsIDEzNSwgNTQsIDMzLCAxMTcsIDQ1LCAyNSwgIDk4LCAzNCwgMTMsICA4MSwgMjMsICAwLCAgNjMsICA3LCAgMCwgIDM5LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE2NywgMzMsIDE0MiwgMTQ5LCAyNCwgMTI3LCAxMzQsIDEwLCAxMTMsIDExNiwgIDAsIDk3LCAxMDAsICAwLCA4MywgIDgzLCAgMCwgNjgsICA2NSwgIDAsIDUyLCAgNDAsICAwLCAzMCwgICAwLCAgMCwgIDAsCi0gICAgMTY5LCAzMywgMTI5LCAxNTAsIDI2LCAxMTUsIDEzNCwgMTcsIDEwMiwgMTE2LCAgMywgODksIDEwMCwgIDAsIDc1LCAgODMsICAwLCA2MCwgIDY1LCAgMCwgNDUsICA0MCwgIDAsIDI0LCAgIDAsICAwLCAgMCwKLSAgICAxNjksIDM2LCAxMTgsIDE1MSwgMjcsIDEwNCwgMTM0LCAxOSwgOTMsIDExNiwgIDcsIDgwLCAxMDAsICAwLCA2NywgIDgzLCAgMCwgNTQsICA2NSwgIDAsIDM4LCAgNDEsICAwLCAxNywgICAwLCAgMCwgIDAsCi0gICAgMTY5LCAzOSwgMTA3LCAxNTAsIDMwLCA5NCwgMTM0LCAyMiwgODQsIDExNiwgMTEsIDcxLCAgOTksICAwLCA1OSwgIDgzLCAgMCwgNDYsICA2NCwgIDAsIDMxLCAgNDAsICAwLCAgOSwgICAwLCAgMCwgIDAsCi0gICAgMTY5LCAzOSwgOTUsIDE1MSwgMzEsIDgzLCAxMzQsIDI0LCA3MywgMTE2LCAxNSwgNjIsIDEwMCwgIDEsIDUxLCAgODMsICAwLCAzOCwgIDY0LCAgMCwgMjQsICA0MCwgIDAsICA1LCAgIDAsICAwLCAgMCwKLSAgICAxNjksIDQxLCA4MywgMTUxLCAzMywgNzMsIDEzNCwgMjYsIDY0LCAxMTcsIDE3LCA1NCwgIDk5LCAgNCwgNDIsICA4MiwgIDAsIDMwLCAgNjQsICAwLCAxNiwgIDQwLCAgMCwgIDEsICAgMCwgIDAsICAwLAotICAgIDE3MCwgNDIsIDcxLCAxNTIsIDM0LCA2MiwgMTM0LCAyOCwgNTMsIDExNywgMTksIDQ0LCAgOTksICA2LCAzMywgIDgyLCAgMCwgMjEsICA2MywgIDAsICA0LCAgMzksICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTcxLCA0MiwgNTksIDE1MiwgMzUsIDUwLCAxMzQsIDI5LCA0MiwgMTE3LCAyMSwgMzIsICA5OSwgIDksIDIyLCAgODIsICAwLCAgOSwgIDYzLCAgMCwgIDAsICAzOCwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNzIsIDQyLCA0OCwgMTUyLCAzNiwgNDAsIDEzNSwgMjksIDMyLCAxMTcsIDIxLCAyMywgIDk5LCAxMCwgMTIsICA4MiwgIDAsICAwLCAgNjMsICAwLCAgMCwgIDM4LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDEwNywgMjA3LCAyNDYsICA5NiwgMTg1LCAyMjAsICA4NiwgMTY1LCAxOTYsICA3MywgMTQ0LCAxNzEsICA2MCwgMTIzLCAxNDcsICA0NiwgMTAzLCAxMjUsICAzMiwgODIsIDEwMCwgICA5LCA1NiwgNzEsICAgMCwgMjAsIDMzLAotICAgIDExNSwgMjA2LCAyMjEsIDEwNCwgMTg0LCAxOTgsICA5MiwgMTY0LCAxNzgsICA3OCwgMTQzLCAxNTQsICA2NCwgMTIzLCAxMzMsICA1MSwgMTAyLCAxMTEsICAzNCwgODEsIDg5LCAgMTAsIDU2LCA2MywgICAwLCAyMCwgMjcsCi0gICAgMTIyLCAyMDQsIDIwMCwgMTA4LCAxODMsIDE4MCwgIDk1LCAxNjMsIDE2MSwgIDgyLCAxNDIsIDE0MCwgIDY4LCAxMjIsIDEyMCwgIDU0LCAxMDIsIDEwMSwgIDM2LCA4MSwgNzksICAxMSwgNTYsIDU1LCAgIDAsIDIwLCAyMCwKLSAgICAxMjUsIDIwMywgMTc5LCAxMTEsIDE4MSwgMTYwLCAgOTcsIDE2MiwgMTQzLCAgODUsIDE0MSwgMTI0LCAgNzAsIDEyMSwgMTA3LCAgNTUsIDEwMSwgODksICAzOCwgODAsIDY5LCAgMTQsIDU1LCA0NiwgICAwLCAxOSwgMTAsCi0gICAgMTI4LCAyMDIsIDE1NiwgMTEzLCAxODAsIDE0MCwgMTAyLCAxNjEsIDEyNSwgIDg3LCAxNDAsIDEwOCwgIDcxLCAxMjAsIDkyLCAgNTYsIDEwMCwgNzYsICAzOSwgNzksIDU5LCAgMTQsIDU1LCAzOCwgICAwLCAyMCwgIDMsCi0gICAgMTMyLCAyMDAsIDEzNSwgMTE3LCAxNzksIDEyMSwgMTAzLCAxNTksIDEwNiwgIDg4LCAxMzksIDkzLCAgNzMsIDExOSwgNzksICA1NywgMTAwLCA2NSwgIDQxLCA3OSwgNDksICAxNSwgNTQsIDI4LCAgIDAsIDE5LCAgMCwKLSAgICAxMzQsIDIwMCwgMTExLCAxMTksIDE3OCwgOTgsIDEwNSwgMTU4LCA4NywgIDg5LCAxMzgsIDc2LCAgNzQsIDExOCwgNjQsICA1OCwgOTksIDUxLCAgNDEsIDc4LCAzNywgIDE2LCA1NCwgMTcsICAgMCwgMTksICAwLAotICAgIDEzNywgMTk5LCA4NSwgMTIyLCAxNzcsIDc1LCAxMDgsIDE1OCwgNjYsICA5MSwgMTM3LCA1NiwgIDc1LCAxMTgsIDQ2LCAgNTksIDk4LCAzNSwgIDQyLCA3OCwgMjIsICAxNiwgNTQsICAzLCAgIDAsIDE5LCAgMCwKLSAgICAxNDAsIDE5OCwgNjIsIDEyNSwgMTc3LCA1NSwgMTA5LCAxNTgsIDQ3LCAgOTIsIDEzNywgNDAsICA3NiwgMTE3LCAzMiwgIDU5LCA5OCwgMjEsICA0MiwgNzgsICA2LCAgMTYsIDU0LCAgMCwgICAwLCAxOCwgIDAsCi0gICAgMTE4LCAxODYsIDIzMSwgMTA2LCAxNjcsIDIwNiwgIDkzLCAxNDksIDE4NCwgIDgxLCAxMzAsIDE2MSwgIDY3LCAxMTEsIDEzOSwgIDU0LCA5MiwgMTE3LCAgMzksIDcyLCA5MywgIDE3LCA0OCwgNjYsICAgMCwgMTAsIDI5LAotICAgIDEyMywgMTg1LCAyMDcsIDExMCwgMTY2LCAxODYsICA5OCwgMTQ4LCAxNjcsICA4NSwgMTI5LCAxNDUsICA3MSwgMTExLCAxMjUsICA1NiwgOTIsIDEwNCwgIDQwLCA3MiwgODMsICAxOCwgNDgsIDU3LCAgIDAsIDEwLCAyMiwKLSAgICAxMjgsIDE4NCwgMTg4LCAxMTMsIDE2NSwgMTY4LCAxMDIsIDE0NywgMTUxLCAgODgsIDEyOCwgMTMxLCAgNzMsIDExMCwgMTEzLCAgNTgsIDkxLCA5NCwgIDQyLCA3MSwgNzQsICAxOSwgNDgsIDUwLCAgIDAsICA5LCAxNSwKLSAgICAxMzEsIDE4MywgMTY4LCAxMTYsIDE2NCwgMTUxLCAxMDQsIDE0NiwgMTM0LCAgODksIDEyNywgMTE3LCAgNzMsIDEwOSwgMTAwLCAgNTgsIDkwLCA4MywgIDQyLCA3MSwgNjUsICAyMCwgNDgsIDQyLCAgIDAsICA5LCAgNSwKLSAgICAxMzQsIDE4MiwgMTQ4LCAxMjAsIDE2MywgMTMxLCAxMDUsIDE0NSwgMTE4LCAgOTAsIDEyNiwgMTAyLCAgNzUsIDEwOCwgODYsICA1OSwgOTAsIDcyLCAgNDMsIDcxLCA1NSwgIDE5LCA0NywgMzQsICAgMCwgIDksICAwLAotICAgIDEzNiwgMTgxLCAxMjgsIDEyMiwgMTYyLCAxMTUsIDEwNywgMTQ0LCAxMDIsICA5MiwgMTI1LCA4NywgIDc2LCAxMDcsIDc0LCAgNjEsIDg5LCA2MCwgIDQ0LCA3MCwgNDUsICAyMCwgNDcsIDI0LCAgIDAsICA4LCAgMCwKLSAgICAxMzksIDE4MCwgMTA2LCAxMjQsIDE2MSwgOTUsIDEwOSwgMTQ0LCA4MywgIDkzLCAxMjQsIDcxLCAgNzcsIDEwNywgNjAsICA2MSwgODksIDQ3LCAgNDQsIDcwLCAzMywgIDIwLCA0NywgMTMsICAgMCwgIDgsICAwLAotICAgIDE0MiwgMTc5LCA4MiwgMTI1LCAxNjAsIDcyLCAxMTEsIDE0MywgNjMsICA5NCwgMTI0LCA1NCwgIDc3LCAxMDYsIDQ0LCAgNjEsIDg4LCAzMiwgIDQ0LCA2OSwgMTgsICAyMCwgNDYsICAwLCAgIDAsICA4LCAgMCwKLSAgICAxNDMsIDE3OSwgNjIsIDEyNywgMTYwLCA1NCwgMTExLCAxNDIsIDQ3LCAgOTQsIDEyNCwgMzksICA3OCwgMTA2LCAyOSwgIDYyLCA4OCwgMTgsICA0NSwgNjksICAzLCAgMjAsIDQ2LCAgMCwgICAwLCAgOCwgIDAsCi0gICAgMTI0LCAxNjcsIDIxNiwgMTEyLCAxNTAsIDE5NCwgIDk5LCAxMzQsIDE3NCwgIDg3LCAxMTcsIDE1MywgIDczLCAxMDAsIDEzMSwgIDU4LCA4MiwgMTEwLCAgNDMsIDY0LCA4OCwgIDIzLCA0MCwgNjEsICAgMCwgIDAsIDI0LAotICAgIDEyOSwgMTY2LCAxOTUsIDExNiwgMTUwLCAxNzUsIDEwMywgMTM0LCAxNTgsICA4OSwgMTE2LCAxMzcsICA3NSwgOTksIDExOCwgIDYwLCA4MiwgOTgsICA0NCwgNjMsIDc4LCAgMjMsIDQwLCA1MywgICAwLCAgMCwgMTcsCi0gICAgMTMyLCAxNjYsIDE3NywgMTE5LCAxNDksIDE2MCwgMTA2LCAxMzMsIDE0MywgIDkwLCAxMTUsIDEyNCwgIDc2LCA5OSwgMTA3LCAgNjEsIDgxLCA4OCwgIDQ1LCA2MywgNjksICAyNCwgNDAsIDQ2LCAgIDAsICAwLCAgOSwKLSAgICAxMzYsIDE2NiwgMTU5LCAxMjEsIDE0OCwgMTQzLCAxMDcsIDEzMiwgMTI2LCAgOTIsIDExNSwgMTExLCAgNzcsIDk4LCA5NCwgIDYyLCA4MSwgNzgsICA0NiwgNjMsIDYwLCAgMjMsIDQwLCAzOCwgICAwLCAgMCwgIDAsCi0gICAgMTM4LCAxNjQsIDE0MCwgMTIyLCAxNDcsIDEyNSwgMTA4LCAxMzEsIDExMSwgIDkzLCAxMTQsIDk3LCAgNzksIDk4LCA4MiwgIDYzLCA4MCwgNjcsICA0NiwgNjIsIDUwLCAgMjQsIDQwLCAyOSwgICAwLCAgMCwgIDAsCi0gICAgMTM5LCAxNjMsIDEyMiwgMTI0LCAxNDYsIDEwOSwgMTEwLCAxMzEsIDk2LCAgOTQsIDExNCwgODMsICA3OSwgOTcsIDcwLCAgNjMsIDgxLCA1NywgIDQ2LCA2MiwgNDEsICAyNCwgNDAsIDIxLCAgIDAsICAwLCAgMCwKLSAgICAxNDEsIDE2MywgMTAxLCAxMjYsIDE0NSwgOTAsIDExMSwgMTMwLCA3OSwgIDk1LCAxMTMsIDY4LCAgNzksIDk2LCA1NiwgIDYzLCA4MCwgNDQsICA0NywgNjIsIDMwLCAgMjMsIDQwLCAxMCwgICAwLCAgMCwgIDAsCi0gICAgMTQ0LCAxNjIsIDc5LCAxMjcsIDE0NSwgNzAsIDExMiwgMTI5LCA2MCwgIDk1LCAxMTIsIDUxLCAgNzksIDk2LCA0MSwgIDY0LCA3OSwgMzAsICA0NywgNjEsIDE1LCAgMjMsIDQwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTQ1LCAxNjIsIDYwLCAxMjksIDE0NSwgNTIsIDExMywgMTI5LCA0NiwgIDk2LCAxMTIsIDM3LCAgNzksIDk1LCAyNywgIDY0LCA3OSwgMTYsICA0NywgNjEsICAxLCAgMjMsIDM5LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTMxLCAxNDcsIDIwMiwgMTE3LCAxMzMsIDE4MSwgMTA1LCAxMTksIDE2MiwgIDkxLCAxMDMsIDE0MiwgIDc3LCA4NywgMTIyLCAgNjIsIDcxLCAxMDIsICA0NywgNTQsIDgxLCAgMjYsIDMxLCA1NiwgICAwLCAgMCwgMTgsCi0gICAgMTM1LCAxNDcsIDE4MywgMTIwLCAxMzIsIDE2NCwgMTA3LCAxMTgsIDE0NywgIDkzLCAxMDIsIDEyOCwgIDc4LCA4NywgMTEwLCAgNjMsIDcxLCA5MiwgIDQ3LCA1NCwgNzIsICAyNiwgMzEsIDQ4LCAgIDAsICAwLCAxMCwKLSAgICAxMzgsIDE0NywgMTY2LCAxMjMsIDEzMSwgMTQ5LCAxMDgsIDExOCwgMTMzLCAgOTQsIDEwMiwgMTE2LCAgNzksIDg2LCAxMDAsICA2NCwgNzEsIDgyLCAgNDgsIDU0LCA2NCwgIDI3LCAzMSwgNDEsICAgMCwgIDAsICAyLAotICAgIDEzOSwgMTQ2LCAxNDksIDEyNCwgMTMxLCAxMzQsIDExMSwgMTE3LCAxMTksICA5NCwgMTAxLCAxMDMsICA3OSwgODYsIDg4LCAgNjQsIDcwLCA3MiwgIDQ4LCA1MywgNTUsICAyNywgMzEsIDMzLCAgIDAsICAwLCAgMCwKLSAgICAxNDEsIDE0NiwgMTMyLCAxMjUsIDEzMSwgMTE3LCAxMTEsIDExNywgMTA0LCAgOTUsIDEwMSwgOTEsICA4MCwgODYsIDc3LCAgNjUsIDcwLCA2MiwgIDQ4LCA1MywgNDYsICAyNiwgMzEsIDI1LCAgIDAsICAwLCAgMCwKLSAgICAxNDMsIDE0NSwgMTE1LCAxMjYsIDEzMCwgMTAxLCAxMTIsIDExNiwgOTAsICA5NiwgMTAwLCA3OCwgIDgwLCA4NSwgNjUsICA2NSwgNzAsIDUyLCAgNDksIDUzLCAzNywgIDI3LCAzMiwgMTcsICAgMCwgIDAsICAwLAotICAgIDE0NCwgMTQ0LCA5NiwgMTI4LCAxMjksIDg1LCAxMTIsIDExNSwgNzUsICA5NywgMTAwLCA2NCwgIDgxLCA4NSwgNTIsICA2NSwgNjksIDQwLCAgNDksIDUzLCAyNiwgIDI2LCAzMSwgIDUsICAgMCwgIDAsICAwLAotICAgIDE0NiwgMTQ0LCA3NiwgMTI5LCAxMjksIDY3LCAxMTQsIDExNSwgNTgsICA5NywgOTksIDQ4LCAgODIsIDg0LCAzOCwgIDY2LCA2OSwgMjcsICA0OSwgNTMsIDEyLCAgMjYsIDMyLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTQ2LCAxNDQsIDU5LCAxMzAsIDEyOCwgNTEsIDExNCwgMTE0LCA0MywgIDk4LCA5OSwgMzUsICA4MiwgODQsIDI1LCAgNjYsIDY5LCAxMywgIDQ5LCA1MywgIDAsICAyNiwgMzIsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMzUsIDEyOSwgMTg5LCAxMjIsIDExNSwgMTcwLCAxMDcsIDEwMywgMTUyLCAgOTQsIDg5LCAxMzMsICA3OSwgNzQsIDExNCwgIDY0LCA2MCwgOTUsICA0OSwgNDMsIDc1LCAgMjksIDIwLCA1MSwgICAwLCAgMCwgMTIsCi0gICAgMTM4LCAxMjksIDE3MSwgMTI0LCAxMTUsIDE1MywgMTEwLCAxMDMsIDEzOCwgIDk1LCA4OSwgMTIwLCAgODEsIDc0LCAxMDMsICA2NiwgNjAsIDg2LCAgNTAsIDQ0LCA2NywgIDI4LCAyMSwgNDMsICAgMCwgIDAsICAzLAotICAgIDE0MCwgMTI5LCAxNTYsIDEyNSwgMTE1LCAxNDAsIDExMSwgMTAzLCAxMjUsICA5NiwgODksIDEwOSwgIDgxLCA3NCwgOTMsICA2NywgNjAsIDc2LCAgNTAsIDQ0LCA1OSwgIDI5LCAyMiwgMzYsICAgMCwgIDAsICAwLAotICAgIDE0MiwgMTI4LCAxNDAsIDEyNywgMTE1LCAxMjUsIDExMiwgMTAyLCAxMTIsICA5NywgODgsIDk3LCAgODIsIDc0LCA4MywgIDY3LCA2MCwgNjcsICA1MCwgNDQsIDUxLCAgMjksIDIyLCAyOSwgICAwLCAgMCwgIDAsCi0gICAgMTQyLCAxMjgsIDEyNCwgMTI3LCAxMTQsIDExMSwgMTEzLCAxMDIsIDk4LCAgOTgsIDg4LCA4NSwgIDgyLCA3NCwgNzEsICA2NiwgNjAsIDU4LCAgNTAsIDQ0LCA0MiwgIDI5LCAyMiwgMjEsICAgMCwgIDAsICAwLAotICAgIDE0NCwgMTI3LCAxMDgsIDEyOCwgMTE0LCA5NiwgMTEzLCAxMDEsIDg1LCAgOTgsIDg3LCA3MywgIDgyLCA3NCwgNjEsICA2NywgNjAsIDQ4LCAgNTAsIDQ0LCAzMywgIDI4LCAyMywgMTIsICAgMCwgIDAsICAwLAotICAgIDE0NSwgMTI3LCA5MSwgMTI5LCAxMTQsIDgxLCAxMTUsIDEwMSwgNzEsICA5OCwgODcsIDYwLCAgODIsIDczLCA0OCwgIDY3LCA1OSwgMzcsICA1MCwgNDQsIDIyLCAgMjksIDIzLCAgMSwgICAwLCAgMCwgIDAsCi0gICAgMTQ3LCAxMjcsIDczLCAxMzAsIDExMywgNjMsIDExNSwgMTAxLCA1NSwgIDk4LCA4NywgNDUsICA4MywgNzMsIDM1LCAgNjcsIDU5LCAyNCwgIDUwLCA0NCwgMTAsICAyOCwgMjQsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNDcsIDEyNywgNTgsIDEzMSwgMTEzLCA0OSwgMTE1LCAxMDAsIDQyLCAgOTksIDg2LCAzMywgIDgzLCA3MywgMjMsICA2NywgNTksIDEwLCAgNTAsIDQ0LCAgMCwgIDI3LCAyNCwgIDAsICAgMCwgIDAsICAwLAotICAgIDEzOCwgMTEwLCAxNzcsIDEyNCwgOTksIDE1OSwgMTEwLCA4OCwgMTQyLCAgOTYsIDc1LCAxMjUsICA4MiwgNjIsIDEwNywgIDY2LCA0OCwgODksICA1MSwgMzMsIDcwLCAgMzAsICA4LCA0NiwgICAwLCAgMCwgIDUsCi0gICAgMTQyLCAxMTEsIDE2MCwgMTI3LCA5OSwgMTQ0LCAxMTMsIDg4LCAxMzAsICA5OCwgNzUsIDExMiwgIDgyLCA2MiwgOTYsICA2OCwgNDksIDgwLCAgNTEsIDMzLCA2MSwgIDMwLCAxMCwgMzksICAgMCwgIDAsICAwLAotICAgIDE0MywgMTExLCAxNDYsIDEyOCwgOTksIDEzMSwgMTE0LCA4OCwgMTE4LCAgOTgsIDc1LCAxMDEsICA4MywgNjIsIDg2LCAgNjgsIDQ5LCA3MSwgIDUyLCAzMywgNTQsICAzMCwgMTEsIDMyLCAgIDAsICAwLCAgMCwKLSAgICAxNDQsIDExMSwgMTMyLCAxMjgsIDk5LCAxMTgsIDExMywgODgsIDEwNiwgIDk5LCA3NSwgOTEsICA4MywgNjIsIDc3LCAgNjgsIDQ5LCA2MiwgIDUyLCAzNCwgNDYsICAzMCwgMTIsIDI1LCAgIDAsICAwLCAgMCwKLSAgICAxNDQsIDExMSwgMTE3LCAxMjksIDk4LCAxMDQsIDExNCwgODcsIDkyLCAgOTksIDc1LCA4MCwgIDgzLCA2MiwgNjcsICA2OCwgNDksIDUzLCAgNTEsIDM0LCAzOCwgIDMwLCAxMywgMTgsICAgMCwgIDAsICAwLAotICAgIDE0NSwgMTExLCAxMDMsIDEzMCwgOTgsIDkxLCAxMTQsIDg3LCA4MCwgIDk5LCA3NSwgNjgsICA4MywgNjMsIDU3LCAgNjgsIDUwLCA0NSwgIDUxLCAzNCwgMzAsICAzMCwgMTQsICA4LCAgIDAsICAwLCAgMCwKLSAgICAxNDYsIDExMCwgODcsIDEzMSwgOTgsIDc2LCAxMTUsIDg3LCA2NywgIDk5LCA3NSwgNTYsICA4MywgNjIsIDQ1LCAgNjgsIDQ5LCAzMywgIDUyLCAzNSwgMTksICAzMCwgMTUsICAyLCAgIDAsICAwLCAgMCwKLSAgICAxNDgsIDExMCwgNzAsIDEzMSwgOTgsIDYwLCAxMTYsIDg2LCA1MiwgIDk5LCA3NCwgNDMsICA4NCwgNjIsIDMzLCAgNjksIDQ5LCAyMSwgIDUyLCAzNSwgIDYsICAyOSwgMTUsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNDgsIDExMCwgNTYsIDEzMiwgOTcsIDQ4LCAxMTcsIDg3LCA0MCwgMTAwLCA3NSwgMzEsICA4NCwgNjIsIDIyLCAgNjgsIDQ5LCAgOSwgIDUxLCAzNSwgIDAsICAyOCwgMTUsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNDIsIDkxLCAxNjYsIDEyNiwgODAsIDE0OCwgMTEzLCA3MSwgMTMyLCAgOTgsIDU5LCAxMTUsICA4MywgNDcsIDk5LCAgNjksIDM0LCA4MiwgIDUzLCAxNywgNjQsICAzMiwgIDAsIDQxLCAgIDAsICAwLCAgMCwKLSAgICAxNDMsIDkxLCAxNTAsIDEyOCwgODEsIDEzNSwgMTE0LCA3MSwgMTIwLCAgOTksIDYwLCAxMDQsICA4NSwgNDgsIDg5LCAgNjksIDM1LCA3MywgIDUzLCAxOSwgNTYsICAzMiwgIDAsIDM0LCAgIDAsICAwLCAgMCwKLSAgICAxNDUsIDkxLCAxMzcsIDEyOSwgODEsIDEyMiwgMTE1LCA3MSwgMTA5LCAxMDAsIDYwLCA5NCwgIDg1LCA0OCwgODEsICA2OSwgMzUsIDY1LCAgNTMsIDE5LCA0OSwgIDMyLCAgMCwgMjgsICAgMCwgIDAsICAwLAotICAgIDE0NiwgOTIsIDEyNCwgMTMwLCA4MSwgMTEwLCAxMTUsIDcxLCA5OCwgMTAwLCA2MCwgODQsICA4NSwgNDksIDcxLCAgNjksIDM2LCA1NywgIDUzLCAyMSwgNDIsICAzMiwgIDAsIDIxLCAgIDAsICAwLCAgMCwKLSAgICAxNDcsIDkxLCAxMTAsIDEzMCwgODEsIDk3LCAxMTUsIDcxLCA4NiwgMTAwLCA2MCwgNzQsICA4NCwgNDksIDYyLCAgNjksIDM2LCA0OCwgIDUzLCAyMiwgMzQsICAzMiwgIDAsIDEzLCAgIDAsICAwLCAgMCwKLSAgICAxNDcsIDkyLCA5NywgMTMwLCA4MSwgODUsIDExNiwgNzIsIDc2LCAxMDAsIDYwLCA2MywgIDg1LCA0OSwgNTIsICA2OSwgMzcsIDQwLCAgNTMsIDIyLCAyNiwgIDMxLCAgMSwgIDUsICAgMCwgIDAsICAwLAotICAgIDE0OCwgOTIsIDgyLCAxMzEsIDgxLCA3MSwgMTE2LCA3MSwgNjIsIDEwMCwgNjAsIDUzLCAgODQsIDQ5LCA0MiwgIDY5LCAzNywgMzAsICA1MiwgMjMsIDE2LCAgMzEsICAyLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTQ4LCA5MSwgNjcsIDEzMiwgODEsIDU3LCAxMTcsIDcxLCA0OSwgMTAwLCA2MCwgMzksICA4NCwgNDksIDMwLCAgNjksIDM3LCAxOCwgIDUyLCAyMywgIDIsICAzMCwgIDIsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNDksIDkxLCA1NCwgMTMyLCA4MSwgNDYsIDExOCwgNzEsIDM5LCAxMDEsIDYwLCAyOSwgIDg1LCA0OSwgMTksICA2OSwgMzcsICA2LCAgNTIsIDIzLCAgMCwgIDI5LCAgMywgIDAsICAgMCwgIDAsICAwLAotICAgIDE0MywgNjgsIDE1MywgMTI4LCA1OSwgMTM3LCAxMTUsIDQ5LCAxMjIsICA5OSwgMzksIDEwNywgIDg1LCAyOCwgOTEsICA3MCwgMTMsIDc1LCAgNTQsICAwLCA1OCwgIDMyLCAgMCwgMzYsICAgMCwgIDAsICAwLAotICAgIDE0NiwgNjgsIDE0MCwgMTMxLCA1OSwgMTI1LCAxMTYsIDUxLCAxMTEsIDEwMCwgNDAsIDk3LCAgODUsIDI5LCA4MiwgIDcwLCAxNSwgNjcsICA1NCwgIDAsIDUwLCAgMzIsICAwLCAyOSwgICAwLCAgMCwgIDAsCi0gICAgMTQ3LCA2OCwgMTI3LCAxMzEsIDU5LCAxMTQsIDExNywgNTEsIDEwMiwgMTAxLCA0MSwgODgsICA4NiwgMzAsIDc0LCAgNzAsIDE3LCA2MCwgIDU0LCAgMCwgNDQsICAzMiwgIDAsIDIzLCAgIDAsICAwLCAgMCwKLSAgICAxNDcsIDcwLCAxMTUsIDEzMSwgNjAsIDEwMywgMTE2LCA1MiwgOTEsIDEwMCwgNDIsIDc4LCAgODUsIDMyLCA2NSwgIDcwLCAxOSwgNTMsICA1NCwgIDEsIDM4LCAgMzIsICAwLCAxNywgICAwLCAgMCwgIDAsCi0gICAgMTQ3LCA3MCwgMTAzLCAxMzEsIDYxLCA5MSwgMTE3LCA1MywgODEsIDEwMSwgNDMsIDY5LCAgODYsIDMyLCA1NywgIDcwLCAyMCwgNDQsICA1NCwgIDIsIDMwLCAgMzIsICAwLCAgNywgICAwLCAgMCwgIDAsCi0gICAgMTQ4LCA3MCwgOTEsIDEzMiwgNjEsIDgwLCAxMTcsIDUyLCA3MCwgMTAxLCA0MywgNTksICA4NSwgMzMsIDQ4LCAgNzAsIDIxLCAzNiwgIDUzLCAgNCwgMjIsICAzMiwgIDAsICAzLCAgIDAsICAwLCAgMCwKLSAgICAxNDgsIDcwLCA3OCwgMTMyLCA2MiwgNjgsIDExNywgNTMsIDU4LCAxMDEsIDQzLCA0OCwgIDg1LCAzNCwgMzgsICA3MCwgMjIsIDI2LCAgNTMsICA2LCAxMiwgIDMxLCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE0OSwgNzEsIDY0LCAxMzIsIDYyLCA1NCwgMTE4LCA1NCwgNDYsIDEwMSwgNDQsIDM3LCAgODUsIDM0LCAyNywgIDY5LCAyMywgMTUsICA1MywgIDcsICAxLCAgMzAsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTUwLCA3MCwgNTMsIDEzNCwgNjEsIDQ0LCAxMTgsIDU0LCAzNiwgMTAxLCA0NCwgMjgsICA4NSwgMzUsIDE3LCAgNjksIDIzLCAgNCwgIDUyLCAgOCwgIDAsICAzMCwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNDUsIDM4LCAxNDMsIDEzMCwgMjksIDEyOCwgMTE3LCAxOCwgMTE0LCAxMDEsICAzLCA5OCwgIDg3LCAgMCwgODQsICA3MiwgIDAsIDY5LCAgNTQsICAwLCA1MywgIDMwLCAgMCwgMzEsICAgMCwgIDAsICAwLAotICAgIDE0NywgMzgsIDEzMCwgMTMyLCAzMCwgMTE2LCAxMTcsIDIyLCAxMDMsIDEwMSwgIDgsIDg5LCAgODcsICAwLCA3NiwgIDcyLCAgMCwgNjIsICA1NCwgIDAsIDQ2LCAgMzAsICAwLCAyNCwgICAwLCAgMCwgIDAsCi0gICAgMTQ4LCA0MCwgMTE5LCAxMzIsIDMxLCAxMDUsIDExNywgMjMsIDk0LCAxMDEsIDEzLCA4MSwgIDg3LCAgMCwgNjgsICA3MSwgIDAsIDU1LCAgNTQsICAwLCAzOSwgIDMwLCAgMCwgMTgsICAgMCwgIDAsICAwLAotICAgIDE0OCwgNDIsIDEwOCwgMTMyLCAzNCwgOTYsIDExNywgMjUsIDg1LCAxMDIsIDE1LCA3MywgIDg2LCAgMiwgNjAsICA3MSwgIDAsIDQ3LCAgNTQsICAwLCAzMywgIDMwLCAgMCwgMTEsICAgMCwgIDAsICAwLAotICAgIDE0OCwgNDMsIDk2LCAxMzMsIDM1LCA4NSwgMTE3LCAyOCwgNzUsIDEwMiwgMTgsIDY0LCAgODcsICA1LCA1MiwgIDcxLCAgMCwgNDAsICA1NCwgIDAsIDI1LCAgMzAsICAwLCAgNSwgICAwLCAgMCwgIDAsCi0gICAgMTQ5LCA0NCwgODUsIDEzMiwgMzYsIDc1LCAxMTgsIDI5LCA2NiwgMTAxLCAyMCwgNTUsICA4NiwgIDgsIDQ0LCAgNzAsICAwLCAzMiwgIDUzLCAgMCwgMTgsICAyOSwgIDAsICAyLCAgIDAsICAwLCAgMCwKLSAgICAxNDksIDQ1LCA3NCwgMTMzLCAzNywgNjQsIDExOCwgMzEsIDU1LCAxMDIsIDIxLCA0NSwgIDg1LCAxMCwgMzQsICA3MCwgIDAsIDIyLCAgNTMsICAwLCAgNiwgIDI4LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE1MCwgNDYsIDYxLCAxMzMsIDM5LCA1MiwgMTE4LCAzMSwgNDQsIDEwMiwgMjMsIDM0LCAgODUsIDEyLCAyNCwgIDcwLCAgMCwgMTIsICA1MiwgIDAsICAwLCAgMjgsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTUwLCA0NiwgNTEsIDEzMywgNDAsIDQyLCAxMTksIDMyLCAzNSwgMTAyLCAyNCwgMjUsICA4NSwgMTMsIDE0LCAgNzAsICAwLCAgMSwgIDUyLCAgMCwgIDAsICAyNywgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICA1MywgMTk4LCAyNDQsICA0OSwgMTc3LCAyMTgsICA0MSwgMTU4LCAxOTUsICAzMiwgMTM4LCAxNzEsICAyMiwgMTE4LCAxNDcsICAxMSwgOTgsIDEyNCwgICAwLCA3OCwgMTAwLCAgIDAsIDU0LCA3MSwgICAwLCAxOCwgMzQsCi0gICAgNjksIDE5NiwgMjIwLCAgNjQsIDE3NSwgMTk2LCAgNTQsIDE1NywgMTc2LCAgNDUsIDEzNywgMTU0LCAgMzIsIDExNywgMTMzLCAgMTksIDk4LCAxMTEsICAgMCwgNzgsIDg5LCAgIDAsIDUzLCA2MywgICAwLCAxNywgMjcsCi0gICAgODAsIDE5NSwgMTk4LCAgNjksIDE3NSwgMTc5LCAgNjAsIDE1NiwgMTU5LCAgNTAsIDEzNiwgMTM5LCAgMzgsIDExNiwgMTIwLCAgMjUsIDk4LCAxMDEsICAgNCwgNzcsIDgwLCAgIDAsIDUzLCA1NSwgICAwLCAxNywgMjEsCi0gICAgODQsIDE5MywgMTc3LCAgNzUsIDE3MywgMTU5LCAgNjQsIDE1NSwgMTQyLCAgNTUsIDEzNSwgMTI0LCAgNDEsIDExNiwgMTA3LCAgMjcsIDk3LCA4OSwgICA5LCA3NiwgNzAsICAgMCwgNTMsIDQ3LCAgIDAsIDE3LCAxMSwKLSAgICA4OSwgMTkzLCAxNTcsICA3OSwgMTcyLCAxNDAsICA3MCwgMTU0LCAxMjUsICA1NywgMTM0LCAxMDksICA0NCwgMTE1LCA5MiwgIDMyLCA5NiwgNzYsICAxMywgNzYsIDU5LCAgIDAsIDUyLCAzOSwgICAwLCAxNiwgIDQsCi0gICAgOTQsIDE5MSwgMTM1LCAgODUsIDE3MSwgMTIxLCAgNzIsIDE1MiwgMTA4LCAgNjAsIDEzMywgOTQsICA0NywgMTE0LCA4MCwgIDMyLCA5NSwgNjUsICAxNSwgNzYsIDQ5LCAgIDAsIDUyLCAyOSwgICAwLCAxNiwgIDAsCi0gICAgOTgsIDE5MCwgMTEzLCAgODcsIDE3MCwgMTAwLCAgNzYsIDE1MiwgODksICA2MiwgMTMyLCA3NywgIDQ5LCAxMTMsIDY1LCAgMzUsIDk1LCA1MiwgIDE4LCA3NSwgMzcsICAgMCwgNTIsIDE4LCAgIDAsIDE1LCAgMCwKLSAgICAxMDMsIDE5MCwgODksICA5MCwgMTY5LCA4MCwgIDc4LCAxNTEsIDcwLCAgNjQsIDEzMiwgNjAsICA1MSwgMTEzLCA0OSwgIDM3LCA5NCwgMzgsICAyMCwgNzUsIDI1LCAgIDAsIDUyLCAgNSwgICAwLCAxNSwgIDAsCi0gICAgMTA2LCAxODksIDY5LCAgOTMsIDE2OSwgNjEsICA4MCwgMTUxLCA1MywgIDY2LCAxMzEsIDQ1LCAgNTIsIDExMywgMzYsICAzNywgOTQsIDI1LCAgMTksIDc0LCAxMSwgICAwLCA1MSwgIDAsICAgMCwgMTUsICAwLAotICAgIDc2LCAxNzgsIDIyOSwgIDY4LCAxNTksIDIwNSwgIDYxLCAxNDIsIDE4MywgIDUwLCAxMjQsIDE2MCwgIDQwLCAxMDYsIDEzOCwgIDI4LCA4OCwgMTE2LCAgMTIsIDY5LCA5MywgICAwLCA0NSwgNjYsICAgMCwgIDUsIDI5LAotICAgIDg2LCAxNzcsIDIwNywgIDc4LCAxNTgsIDE4NCwgIDY3LCAxNDIsIDE2NiwgIDU2LCAxMjMsIDE0NSwgIDQ1LCAxMDYsIDEyNSwgIDMxLCA4OCwgMTA1LCAgMTYsIDY5LCA4MywgICAwLCA0NSwgNTgsICAgMCwgIDYsIDIyLAotICAgIDkzLCAxNzYsIDE4NywgIDgxLCAxNTgsIDE2OCwgIDcxLCAxNDEsIDE1MCwgIDYxLCAxMjMsIDEzMSwgIDQ3LCAxMDUsIDExMywgIDM1LCA4NywgOTQsICAyMCwgNjgsIDc0LCAgIDAsIDQ1LCA1MSwgICAwLCAgNSwgMTYsCi0gICAgOTgsIDE3NSwgMTY4LCAgODQsIDE1NywgMTUwLCAgNzUsIDE0MCwgMTM0LCAgNjMsIDEyMiwgMTE3LCAgNTAsIDEwNCwgMTAwLCAgMzcsIDg3LCA4MywgIDIxLCA2OCwgNjUsICAgMCwgNDUsIDQyLCAgIDAsICA0LCAgNywKLSAgICAxMDAsIDE3NCwgMTQ5LCAgODksIDE1NSwgMTMyLCAgNzYsIDEzOSwgMTE3LCAgNjUsIDEyMSwgMTAyLCAgNTMsIDEwNCwgODcsICAzOSwgODYsIDcyLCAgMjMsIDY3LCA1NSwgICAwLCA0NSwgMzQsICAgMCwgIDMsICAwLAotICAgIDEwMywgMTczLCAxMzAsICA5MiwgMTU1LCAxMTUsICA4MCwgMTM4LCAxMDIsICA2OCwgMTIwLCA4OCwgIDUzLCAxMDMsIDc1LCAgNDAsIDg2LCA2MSwgIDI0LCA2NywgNDUsICAgMCwgNDUsIDI1LCAgIDAsICAzLCAgMCwKLSAgICAxMDcsIDE3MiwgMTA4LCAgOTUsIDE1NCwgOTYsICA4MiwgMTM3LCA4NSwgIDcwLCAxMTksIDczLCAgNTUsIDEwMiwgNjEsICA0MiwgODUsIDQ5LCAgMjUsIDY3LCAzNCwgICAwLCA0NSwgMTQsICAgMCwgIDMsICAwLAotICAgIDExMCwgMTcyLCA4NiwgIDk3LCAxNTMsIDc2LCAgODUsIDEzNywgNjcsICA3MCwgMTE5LCA1NywgIDU2LCAxMDIsIDQ2LCAgNDIsIDg0LCAzNSwgIDI2LCA2NiwgMjEsICAgMCwgNDQsICAxLCAgIDAsICAzLCAgMCwKLSAgICAxMTIsIDE3MSwgNjcsICA5OCwgMTUzLCA1OSwgIDg2LCAxMzcsIDUyLCAgNzEsIDExOSwgNDQsICA1OCwgMTAyLCAzNCwgIDQ0LCA4NSwgMjIsICAyNywgNjYsICA3LCAgIDAsIDQ0LCAgMCwgICAwLCAgMywgIDAsCi0gICAgOTAsIDE2MCwgMjE1LCAgODEsIDE0NCwgMTkzLCAgNzAsIDEyOSwgMTczLCAgNjEsIDExMiwgMTUxLCAgNDksIDk1LCAxMzEsICAzNywgNzksIDEwOSwgIDIyLCA2MSwgODcsICAgMCwgMzgsIDYxLCAgIDAsICAwLCAyNSwKLSAgICA5NiwgMTYwLCAxOTQsICA4NiwgMTQzLCAxNzQsICA3NSwgMTI4LCAxNTcsICA2NSwgMTEyLCAxMzcsICA1MywgOTUsIDExNywgIDQwLCA3OCwgOTgsICAyNSwgNjAsIDc4LCAgIDAsIDM4LCA1MywgICAwLCAgMCwgMTcsCi0gICAgMTAwLCAxNTksIDE3NywgIDg5LCAxNDMsIDE1OSwgIDc5LCAxMjgsIDE0MywgIDY3LCAxMTEsIDEyNCwgIDU1LCA5NSwgMTA3LCAgNDIsIDc4LCA4OSwgIDI3LCA2MCwgNzAsICAgMiwgMzgsIDQ2LCAgIDAsICAwLCAgOSwKLSAgICAxMDQsIDE1OCwgMTU5LCAgOTIsIDE0MiwgMTQzLCAgODEsIDEyNywgMTI3LCAgNjksIDExMCwgMTEwLCAgNTYsIDk0LCA5NCwgIDQzLCA3OCwgNzgsICAyOCwgNjAsIDYwLCAgIDIsIDM4LCAzOCwgICAwLCAgMCwgIDEsCi0gICAgMTA3LCAxNTcsIDE0MCwgIDk0LCAxNDEsIDEyNSwgIDgyLCAxMjYsIDExMiwgIDcxLCAxMTAsIDk3LCAgNTksIDk0LCA4MiwgIDQ1LCA3NywgNjcsICAyOSwgNTksIDUxLCAgIDQsIDM3LCAzMCwgICAwLCAgMCwgIDAsCi0gICAgMTEwLCAxNTYsIDEyMiwgIDk3LCAxNDAsIDEwOSwgIDg1LCAxMjUsIDk3LCAgNzIsIDEwOSwgODMsICA1OCwgOTMsIDcxLCAgNDUsIDc3LCA1NywgIDI5LCA2MCwgNDIsICAgNSwgMzgsIDIyLCAgIDAsICAwLCAgMCwKLSAgICAxMTEsIDE1NiwgMTAzLCAgOTksIDEzOSwgOTEsICA4NywgMTI1LCA4MSwgIDczLCAxMDgsIDY5LCAgNjAsIDkyLCA1OCwgIDQ2LCA3NywgNDUsICAzMCwgNTksIDMxLCAgIDUsIDM4LCAxMiwgICAwLCAgMCwgIDAsCi0gICAgMTE1LCAxNTYsIDgyLCAxMDEsIDE0MCwgNzMsICA4OCwgMTI0LCA2MywgIDc0LCAxMDgsIDUzLCAgNjAsIDkyLCA0NCwgIDQ2LCA3NiwgMzIsICAzMSwgNTksIDE4LCAgIDYsIDM3LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTE2LCAxNTUsIDY1LCAxMDIsIDEzOSwgNTgsICA4OSwgMTI0LCA0OSwgIDc1LCAxMDgsIDQxLCAgNjEsIDkyLCAzMiwgIDQ4LCA3NiwgMjEsICAzMSwgNTksICA2LCAgIDUsIDM3LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTAwLCAxNDEsIDIwMSwgIDg4LCAxMjcsIDE4MSwgIDc5LCAxMTQsIDE2MiwgIDY5LCA5OSwgMTQyLCAgNTcsIDgzLCAxMjIsICA0NCwgNjgsIDEwMiwgIDMwLCA1MSwgODEsICAgNywgMjgsIDU2LCAgIDAsICAwLCAxOSwKLSAgICAxMDUsIDE0MSwgMTgyLCAgOTQsIDEyNywgMTYzLCAgODMsIDExNCwgMTQ2LCAgNzEsIDk4LCAxMjgsICA1OSwgODMsIDExMCwgIDQ2LCA2OCwgOTEsICAzMSwgNTEsIDcyLCAgMTAsIDI4LCA0OCwgICAwLCAgMCwgMTEsCi0gICAgMTA4LCAxNDEsIDE2NiwgIDk2LCAxMjcsIDE0OSwgIDg1LCAxMTMsIDEzMywgIDczLCA5OCwgMTE2LCAgNjAsIDgzLCA5OSwgIDQ2LCA2OCwgODIsICAzMiwgNTEsIDY0LCAgMTEsIDI5LCA0MSwgICAwLCAgMCwgIDIsCi0gICAgMTExLCAxNDEsIDE0OSwgIDk4LCAxMjYsIDEzNCwgIDg4LCAxMTIsIDExOSwgIDc0LCA5NywgMTAzLCAgNjEsIDgzLCA4OCwgIDQ4LCA2NywgNzIsICAzMywgNTEsIDU2LCAgMTEsIDI5LCAzNCwgICAwLCAgMCwgIDAsCi0gICAgMTEyLCAxNDAsIDEzMiwgMTAwLCAxMjUsIDExOCwgIDg5LCAxMTIsIDEwNSwgIDc1LCA5NywgOTEsICA2MiwgODIsIDc3LCAgNDksIDY4LCA2MiwgIDMzLCA1MSwgNDcsICAxMiwgMjksIDI2LCAgIDAsICAwLCAgMCwKLSAgICAxMTUsIDE0MCwgMTE2LCAxMDIsIDEyNSwgMTAzLCAgOTAsIDExMSwgOTEsICA3NiwgOTYsIDc4LCAgNjIsIDgyLCA2NSwgIDQ5LCA2NywgNTIsICAzNCwgNTEsIDM4LCAgMTMsIDI5LCAxOCwgICAwLCAgMCwgIDAsCi0gICAgMTE3LCAxMzksIDk3LCAxMDMsIDEyNCwgODcsICA5MSwgMTExLCA3NywgIDc4LCA5NiwgNjUsICA2MywgODEsIDU0LCAgNDksIDY3LCA0MSwgIDM0LCA1MSwgMjcsICAxMiwgMjksICA3LCAgIDAsICAwLCAgMCwKLSAgICAxMTksIDEzOCwgNzgsIDEwNSwgMTI0LCA2OSwgIDkyLCAxMTAsIDYwLCAgNzgsIDk1LCA1MCwgIDY1LCA4MSwgNDAsICA1MCwgNjcsIDI5LCAgMzQsIDUxLCAxNSwgIDEzLCAzMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDEyMCwgMTM4LCA2NCwgMTA2LCAxMjQsIDU0LCAgOTMsIDExMCwgNDcsICA3OCwgOTUsIDM4LCAgNjUsIDgxLCAyOSwgIDUwLCA2NiwgMTcsICAzNCwgNTAsICAyLCAgMTMsIDI5LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTA3LCAxMjQsIDE4OSwgIDk2LCAxMTEsIDE2OSwgIDg1LCA5OSwgMTUyLCAgNzMsIDg1LCAxMzIsICA2MSwgNzEsIDExNCwgIDQ4LCA1NywgOTUsICAzNCwgNDEsIDc1LCAgMTQsIDE4LCA1MSwgICAwLCAgMCwgMTMsCi0gICAgMTExLCAxMjQsIDE3MSwgMTAwLCAxMTEsIDE1MywgIDg4LCA5OSwgMTM3LCAgNzUsIDg1LCAxMjAsICA2MywgNzIsIDEwMywgIDUwLCA1OCwgODUsICAzNiwgNDEsIDY2LCAgMTUsIDE5LCA0MywgICAwLCAgMCwgIDQsCi0gICAgMTEzLCAxMjQsIDE1NiwgMTAxLCAxMTEsIDEzOSwgIDkwLCA5OSwgMTI1LCAgNzcsIDg1LCAxMDksICA2NCwgNzEsIDkzLCAgNTEsIDU3LCA3NywgIDM2LCA0MiwgNTksICAxNywgMjAsIDM3LCAgIDAsICAwLCAgMCwKLSAgICAxMTUsIDEyNCwgMTQwLCAxMDMsIDExMSwgMTI1LCAgOTAsIDk5LCAxMTIsICA3OCwgODUsIDk3LCAgNjQsIDcxLCA4MiwgIDUyLCA1NywgNjcsICAzNiwgNDIsIDUwLCAgMTYsIDIwLCAzMCwgICAwLCAgMCwgIDAsCi0gICAgMTE3LCAxMjMsIDEyNSwgMTA0LCAxMTAsIDExMSwgIDkyLCA5OCwgOTksICA3OSwgODUsIDg2LCAgNjUsIDcxLCA3MiwgIDUxLCA1OCwgNTksICAzNywgNDIsIDQzLCAgMTcsIDIxLCAyMiwgICAwLCAgMCwgIDAsCi0gICAgMTE4LCAxMjMsIDExMCwgMTA1LCAxMTAsIDk3LCAgOTMsIDk4LCA4NiwgIDc4LCA4NCwgNzQsICA2NiwgNzEsIDYyLCAgNTIsIDU3LCA0OSwgIDM3LCA0MiwgMzQsICAxNywgMjIsIDE0LCAgIDAsICAwLCAgMCwKLSAgICAxMjAsIDEyMywgOTMsIDEwNiwgMTA5LCA4MiwgIDk0LCA5NywgNzIsICA4MCwgODQsIDYxLCAgNjYsIDcxLCA1MCwgIDUyLCA1NywgMzgsICAzNywgNDIsIDI0LCAgMTcsIDIyLCAgMiwgICAwLCAgMCwgIDAsCi0gICAgMTIxLCAxMjIsIDc1LCAxMDgsIDEwOSwgNjYsICA5NSwgOTcsIDU4LCAgODAsIDg0LCA0OCwgIDY2LCA3MSwgMzcsICA1MiwgNTcsIDI2LCAgMzcsIDQyLCAxMiwgIDE2LCAyMiwgIDAsICAgMCwgIDAsICAwLAotICAgIDEyMiwgMTIzLCA2MiwgMTA4LCAxMDksIDUyLCAgOTUsIDk3LCA0NSwgIDgxLCA4NCwgMzYsICA2NywgNzAsIDI2LCAgNTIsIDU3LCAxNCwgIDM3LCA0MiwgIDAsICAxNSwgMjIsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMTMsIDEwNywgMTc3LCAxMDIsIDk2LCAxNTksICA4OSwgODUsIDE0MSwgIDc4LCA3MiwgMTI0LCAgNjUsIDYwLCAxMDcsICA1MiwgNDYsIDg5LCAgMzcsIDMwLCA3MCwgIDE4LCAgNSwgNDYsICAgMCwgIDAsICA2LAotICAgIDExNiwgMTA3LCAxNjAsIDEwNCwgOTYsIDE0NCwgIDkyLCA4NSwgMTI5LCAgODAsIDcyLCAxMTIsICA2NywgNjAsIDk2LCAgNTMsIDQ3LCA4MCwgIDM4LCAzMSwgNjIsICAxOSwgIDcsIDM5LCAgIDAsICAwLCAgMCwKLSAgICAxMTgsIDEwNywgMTQ3LCAxMDUsIDk2LCAxMzEsICA5MywgODUsIDExOCwgIDgwLCA3MiwgMTAxLCAgNjcsIDYwLCA4NywgIDU0LCA0NywgNzEsICAzOSwgMzEsIDU0LCAgMTksICA4LCAzMiwgICAwLCAgMCwgIDAsCi0gICAgMTE5LCAxMDcsIDEzMiwgMTA2LCA5NiwgMTE4LCAgOTQsIDg1LCAxMDYsICA4MSwgNzMsIDkxLCAgNjcsIDYwLCA3NywgIDU0LCA0NywgNjMsICAzOSwgMzIsIDQ3LCAgMjAsICA5LCAyNSwgICAwLCAgMCwgIDAsCi0gICAgMTE5LCAxMDcsIDExOCwgMTA2LCA5NSwgMTA1LCAgOTQsIDg1LCA5MywgIDgxLCA3MiwgODAsICA2OCwgNjAsIDY4LCAgNTQsIDQ3LCA1NCwgIDM5LCAzMiwgMzksICAyMCwgMTEsIDE4LCAgIDAsICAwLCAgMCwKLSAgICAxMjEsIDEwNywgMTA0LCAxMDcsIDk2LCA5MiwgIDk1LCA4NCwgODAsICA4MSwgNzIsIDY5LCAgNjgsIDYxLCA1OCwgIDU0LCA0OCwgNDYsICAzOSwgMzMsIDMxLCAgMjAsIDEyLCAgOSwgICAwLCAgMCwgIDAsCi0gICAgMTIzLCAxMDcsIDg4LCAxMDgsIDk1LCA3NywgIDk2LCA4NCwgNjgsICA4MiwgNzIsIDU3LCAgNjgsIDYwLCA0NiwgIDU0LCA0NywgMzUsICAzOSwgMzMsIDIwLCAgMTksIDEzLCAgMiwgICAwLCAgMCwgIDAsCi0gICAgMTIzLCAxMDYsIDcyLCAxMTAsIDk1LCA2MywgIDk2LCA4NCwgNTQsICA4MiwgNzIsIDQ1LCAgNjksIDYwLCAzNSwgIDU1LCA0OCwgMjMsICAzOSwgMzMsICA5LCAgMTgsIDE0LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTI1LCAxMDYsIDYwLCAxMTAsIDk0LCA1MCwgIDk4LCA4NCwgNDIsICA4MywgNzIsIDM0LCAgNjksIDYwLCAyNSwgIDU1LCA0OCwgMTIsICAzOSwgMzMsICAwLCAgMTcsIDEzLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTE4LCA4OSwgMTY1LCAxMDUsIDc5LCAxNDgsICA5MywgNjksIDEzMiwgIDgxLCA1NywgMTE1LCAgNjgsIDQ1LCA5OSwgIDU1LCAzMiwgODIsICA0MSwgMTUsIDY0LCAgMjEsICAwLCA0MSwgICAwLCAgMCwgIDAsCi0gICAgMTIwLCA4OSwgMTUwLCAxMDcsIDc5LCAxMzUsICA5NiwgNjksIDEyMSwgIDgyLCA1OCwgMTA1LCAgNzAsIDQ2LCA4OSwgIDU2LCAzNCwgNzMsICA0MSwgMTcsIDU2LCAgMjEsICAwLCAzNCwgICAwLCAgMCwgIDAsCi0gICAgMTIxLCA4OSwgMTM3LCAxMDgsIDc5LCAxMjMsICA5NiwgNjksIDEwOSwgIDgyLCA1OCwgOTUsICA3MCwgNDcsIDgxLCAgNTYsIDM0LCA2NiwgIDQxLCAxOCwgNDksICAyMSwgIDAsIDI4LCAgIDAsICAwLCAgMCwKLSAgICAxMjIsIDkwLCAxMjQsIDEwOSwgNzksIDExMCwgIDk2LCA2OSwgOTksICA4MywgNTgsIDg1LCAgNzAsIDQ3LCA3MiwgIDU2LCAzNSwgNTgsICA0MSwgMTksIDQyLCAgMjEsICAwLCAyMiwgICAwLCAgMCwgIDAsCi0gICAgMTIzLCA5MCwgMTExLCAxMTAsIDc5LCA5OCwgIDk3LCA2OSwgODcsICA4MywgNTksIDc1LCAgNzAsIDQ3LCA2MywgIDU2LCAzNSwgNTAsICA0MSwgMjAsIDM1LCAgMjEsICAwLCAxNCwgICAwLCAgMCwgIDAsCi0gICAgMTIzLCA5MCwgOTgsIDExMCwgNzksIDg3LCAgOTcsIDcwLCA3NiwgIDg0LCA1OCwgNjQsICA3MCwgNDgsIDUzLCAgNTYsIDM2LCA0MSwgIDQwLCAyMSwgMjYsICAyMSwgIDAsICA1LCAgIDAsICAwLCAgMCwKLSAgICAxMjUsIDg5LCA4NCwgMTExLCA3OSwgNzMsICA5NywgNjksIDY0LCAgODQsIDU5LCA1NCwgIDcwLCA0OCwgNDMsICA1NiwgMzYsIDMxLCAgNDAsIDIyLCAxNywgIDIwLCAgMSwgIDEsICAgMCwgIDAsICAwLAotICAgIDEyNSwgODksIDY5LCAxMTIsIDc5LCA2MCwgIDk4LCA3MCwgNTEsICA4NCwgNTksIDQyLCAgNzAsIDQ4LCAzMiwgIDU2LCAzNiwgMjAsICA0MSwgMjIsICA1LCAgMTksICAyLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTI2LCA4OSwgNTcsIDExMiwgNzksIDQ5LCAgOTksIDcwLCA0MSwgIDg0LCA1OSwgMzIsICA3MCwgNDgsIDIyLCAgNTYsIDM2LCAxMCwgIDQwLCAyMiwgIDAsICAxOCwgIDIsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMjEsIDY3LCAxNTQsIDEwOCwgNTgsIDEzOCwgIDk3LCA1MCwgMTI0LCAgODQsIDM5LCAxMDcsICA3MSwgMjgsIDkyLCAgNTgsIDEyLCA3NiwgIDQzLCAgMCwgNTksICAyMCwgIDAsIDM3LCAgIDAsICAwLCAgMCwKLSAgICAxMjQsIDY4LCAxNDAsIDExMSwgNTksIDEyNiwgIDk4LCA1MCwgMTEyLCAgODQsIDQwLCA5OCwgIDcxLCAyOSwgODMsICA1OCwgMTUsIDY3LCAgNDIsICAwLCA1MSwgIDIwLCAgMCwgMzAsICAgMCwgIDAsICAwLAotICAgIDEyNCwgNjgsIDEyOSwgMTExLCA1OSwgMTE0LCAgOTksIDUxLCAxMDIsICA4NiwgNDEsIDg4LCAgNzEsIDMwLCA3NSwgIDU4LCAxNywgNjAsICA0MiwgIDAsIDQ1LCAgMjAsICAwLCAyNCwgICAwLCAgMCwgIDAsCi0gICAgMTI1LCA3MCwgMTE2LCAxMTEsIDYwLCAxMDMsICA5OSwgNTEsIDkyLCAgODUsIDQxLCA3OSwgIDcxLCAzMSwgNjYsICA1OCwgMTksIDUzLCAgNDIsICAzLCAzOCwgIDIwLCAgMCwgMTcsICAgMCwgIDAsICAwLAotICAgIDEyNSwgNzAsIDEwNCwgMTExLCA2MSwgOTMsICA5OSwgNTIsIDgxLCAgODUsIDQzLCA2OSwgIDcyLCAzMiwgNTgsICA1OCwgMjAsIDQ1LCAgNDIsICA0LCAzMSwgIDIwLCAgMCwgIDgsICAgMCwgIDAsICAwLAotICAgIDEyNiwgNzAsIDkyLCAxMTEsIDYxLCA4MSwgIDk5LCA1MiwgNzEsICA4NSwgNDIsIDYwLCAgNzEsIDMzLCA0OSwgIDU3LCAyMSwgMzcsICA0MiwgIDYsIDIzLCAgMjAsICAwLCAgMywgICAwLCAgMCwgIDAsCi0gICAgMTI2LCA3MCwgNzksIDExMiwgNjEsIDcwLCAgOTksIDUzLCA2MCwgIDg1LCA0MywgNTAsICA3MSwgMzMsIDM5LCAgNTcsIDIyLCAyOCwgIDQxLCAgNywgMTMsICAxOSwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMjcsIDcxLCA2NiwgMTEzLCA2MiwgNTYsIDEwMCwgNTMsIDQ4LCAgODYsIDQ0LCAzOSwgIDcxLCAzNCwgMjksICA1NywgMjMsIDE4LCAgNDEsICA4LCAgMiwgIDE4LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDEyOCwgNzAsIDU1LCAxMTQsIDYyLCA0NiwgMTAwLCA1NCwgMzksICA4NiwgNDQsIDMwLCAgNzEsIDM0LCAyMCwgIDU3LCAyMywgIDcsICA0MSwgIDksICAwLCAgMTgsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTI0LCA0MSwgMTQ1LCAxMTEsIDMyLCAxMjgsICA5OSwgMjMsIDExNCwgIDg2LCAxMCwgMTAwLCAgNzMsICAwLCA4NSwgIDYwLCAgMCwgNzEsICA0MywgIDAsIDU0LCAgMTcsICAwLCAzMiwgICAwLCAgMCwgIDAsCi0gICAgMTI2LCA0MiwgMTMxLCAxMTMsIDMzLCAxMTcsIDEwMCwgMjUsIDEwNCwgIDg2LCAxNCwgOTAsICA3MywgIDAsIDc3LCAgNjAsICAwLCA2MywgIDQ0LCAgMCwgNDcsICAxOCwgIDAsIDI1LCAgIDAsICAwLCAgMCwKLSAgICAxMjcsIDQzLCAxMjAsIDExMywgMzQsIDEwNiwgMTAxLCAyNiwgOTUsICA4NiwgMTcsIDgyLCAgNzMsICAyLCA2OSwgIDU5LCAgMCwgNTYsICA0MywgIDAsIDQxLCAgMTgsICAwLCAxOSwgICAwLCAgMCwgIDAsCi0gICAgMTI3LCA0NSwgMTA5LCAxMTMsIDM3LCA5NywgMTAxLCAyOCwgODUsICA4NiwgMTksIDc0LCAgNzMsICA1LCA2MSwgIDU5LCAgMCwgNDgsICA0MywgIDAsIDM0LCAgMTksICAwLCAxMSwgICAwLCAgMCwgIDAsCi0gICAgMTI3LCA0NiwgOTgsIDExNCwgMzgsIDg2LCAxMDAsIDMwLCA3NiwgIDg3LCAyMSwgNjUsICA3MywgIDksIDU0LCAgNTksICAwLCA0MSwgIDQzLCAgMCwgMjYsICAxOCwgIDAsICA1LCAgIDAsICAwLCAgMCwKLSAgICAxMjcsIDQ3LCA4NywgMTEzLCAzOSwgNzYsIDEwMSwgMzEsIDY3LCAgODYsIDIyLCA1NiwgIDcyLCAxMSwgNDUsICA1OSwgIDAsIDMzLCAgNDMsICAwLCAxOSwgIDE4LCAgMCwgIDIsICAgMCwgIDAsICAwLAotICAgIDEyOCwgNDgsIDc1LCAxMTQsIDM5LCA2NSwgMTAxLCAzMywgNTYsICA4NiwgMjMsIDQ2LCAgNzIsIDEyLCAzNiwgIDU4LCAgMCwgMjQsICA0MiwgIDAsICA5LCAgMTcsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTI5LCA0OCwgNjMsIDExNCwgNDEsIDU0LCAxMDIsIDMzLCA0NiwgIDg3LCAyNCwgMzYsICA3MiwgMTQsIDI2LCAgNTgsICAxLCAxNCwgIDQyLCAgMCwgIDIsICAxNiwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMjgsIDQ4LCA1MywgMTE0LCA0MSwgNDQsIDEwMiwgMzQsIDM3LCAgODcsIDI1LCAyNywgIDcyLCAxNSwgMTcsICA1OCwgIDEsICAzLCAgNDEsICAwLCAgMCwgIDE1LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDAsIDE4OSwgMjQyLCAgIDAsIDE2OSwgMjE3LCAgIDAsIDE1MSwgMTk0LCAgIDAsIDEzMiwgMTcwLCAgIDAsIDExMywgMTQ3LCAgIDAsIDk0LCAxMjMsICAgMCwgNzQsIDk5LCAgIDAsIDUxLCA3MSwgICAwLCAxNSwgMzQsCi0gICAgMSwgMTg3LCAyMTksICAgMSwgMTY3LCAxOTUsICAgMCwgMTUwLCAxNzUsICAgMCwgMTMxLCAxNTMsICAgMCwgMTEzLCAxMzIsICAgMCwgOTQsIDExMSwgICAwLCA3NCwgODksICAgMCwgNTAsIDYzLCAgIDAsIDEzLCAyOCwKLSAgICAxLCAxODYsIDE5OCwgICAxLCAxNjcsIDE3OCwgICAwLCAxNDksIDE1OCwgICAwLCAxMzAsIDEzOSwgICAwLCAxMTEsIDExOSwgICAwLCA5MywgMTAwLCAgIDAsIDc0LCA4MCwgICAwLCA1MCwgNTUsICAgMCwgMTMsIDIyLAotICAgIDEsIDE4NSwgMTc2LCAgIDEsIDE2NSwgMTU5LCAgIDEsIDE0OCwgMTQyLCAgIDAsIDEyOSwgMTIzLCAgIDAsIDExMSwgMTA2LCAgIDAsIDkzLCA4OSwgICAwLCA3MywgNzAsICAgMCwgNTAsIDQ3LCAgIDAsIDEzLCAxMywKLSAgICAxLCAxODQsIDE1NywgICAxLCAxNjQsIDE0MSwgICAxLCAxNDcsIDEyNSwgICAwLCAxMjgsIDExMCwgICAwLCAxMTAsIDkzLCAgIDAsIDkyLCA3NywgICAwLCA3MywgNjAsICAgMCwgNTAsIDM5LCAgIDAsIDEyLCAgNSwKLSAgICAyNSwgMTgyLCAxMzcsICAyNSwgMTYzLCAxMjIsICAxNywgMTQ2LCAxMDksICAgMCwgMTI4LCA5NiwgICAwLCAxMTAsIDgxLCAgIDAsIDkyLCA2NiwgICAwLCA3MywgNTEsICAgMCwgNTAsIDMwLCAgIDAsIDEwLCAgMCwKLSAgICA0MiwgMTgxLCAxMTQsICAzNSwgMTYzLCAxMDIsICAzMCwgMTQ1LCA5MSwgIDE0LCAxMjcsIDgwLCAgIDAsIDEwOSwgNjcsICAgMCwgOTEsIDUzLCAgIDAsIDcyLCAzOSwgICAwLCA1MCwgMTksICAgMCwgMTAsICAwLAotICAgIDUyLCAxODEsIDkyLCAgNDMsIDE2MiwgODMsICAzMiwgMTQ1LCA3MywgIDE5LCAxMjYsIDYzLCAgIDAsIDEwOCwgNTIsICAgMCwgOTAsIDQwLCAgIDAsIDcyLCAyNywgICAwLCA1MCwgIDcsICAgMCwgMTAsICAwLAotICAgIDU3LCAxODEsIDc0LCAgNDgsIDE2MiwgNjYsICAzNywgMTQ0LCA1NywgIDI0LCAxMjYsIDQ5LCAgIDcsIDEwOCwgNDAsICAgMCwgOTAsIDI5LCAgIDAsIDcyLCAxNSwgICAwLCA0OSwgIDAsICAgMCwgMTAsICAwLAotICAgIDEsIDE3MCwgMjI3LCAgIDEsIDE1MiwgMjAzLCAgIDAsIDEzNiwgMTgyLCAgIDAsIDExOSwgMTU5LCAgIDAsIDEwMSwgMTM3LCAgIDAsIDg0LCAxMTUsICAgMCwgNjUsIDkyLCAgIDAsIDQzLCA2NiwgICAwLCAgMSwgMjksCi0gICAgMSwgMTY5LCAyMDYsICAgMSwgMTUxLCAxODQsICAgMSwgMTM2LCAxNjUsICAgMCwgMTE4LCAxNDQsICAgMCwgMTAyLCAxMjUsICAgMCwgODQsIDEwNSwgICAwLCA2NSwgODMsICAgMCwgNDMsIDU4LCAgIDAsICAwLCAyMiwKLSAgICAyOSwgMTY4LCAxODYsICAyMSwgMTUxLCAxNjcsICAxNCwgMTM1LCAxNTAsICAgNCwgMTE4LCAxMzEsICAgMCwgMTAxLCAxMTIsICAgMCwgODMsIDk0LCAgIDAsIDY1LCA3NSwgICAwLCA0MywgNTEsICAgMCwgIDAsIDE2LAotICAgIDQxLCAxNjcsIDE2NywgIDMzLCAxNTAsIDE1MCwgIDMxLCAxMzQsIDEzNCwgIDE5LCAxMTcsIDExNywgICA0LCAxMDAsIDEwMCwgICAwLCA4MywgODMsICAgMCwgNjUsIDY1LCAgIDAsIDQyLCA0MywgICAwLCAgMCwgIDgsCi0gICAgNDgsIDE2NywgMTQ5LCAgNDEsIDE0OSwgMTMzLCAgMzMsIDEzMywgMTE4LCAgMjUsIDExNiwgMTAzLCAgMTMsIDk5LCA4OCwgICAwLCA4MywgNzMsICAgMCwgNjUsIDU2LCAgIDAsIDQyLCAzNSwgICAwLCAgMCwgIDAsCi0gICAgNTgsIDE2NSwgMTMwLCAgNDksIDE0OCwgMTE1LCAgNDIsIDEzMiwgMTAzLCAgMzEsIDExNSwgODksICAxOCwgOTksIDc1LCAgIDAsIDgyLCA2MSwgICAwLCA2NCwgNDYsICAgMCwgNDIsIDI2LCAgIDAsICAwLCAgMCwKLSAgICA2MiwgMTY0LCAxMTAsICA1NSwgMTQ3LCA5NywgIDQ1LCAxMzIsIDg3LCAgMzUsIDExNSwgNzUsICAyMiwgOTgsIDYzLCAgIDUsIDgyLCA1MCwgICAwLCA2NCwgMzYsICAgMCwgNDIsIDE2LCAgIDAsICAwLCAgMCwKLSAgICA2OSwgMTY0LCA4OSwgIDYwLCAxNDcsIDc4LCAgNTAsIDEzMSwgNzAsICAzNywgMTE0LCA1OSwgIDI2LCA5OCwgNDksICAxMCwgODEsIDM3LCAgIDAsIDY0LCAyNCwgICAwLCA0MiwgIDQsICAgMCwgIDAsICAwLAotICAgIDcxLCAxNjQsIDcxLCAgNjMsIDE0NywgNjMsICA1MywgMTMxLCA1NSwgIDQwLCAxMTQsIDQ3LCAgMjgsIDk4LCAzOCwgIDEzLCA4MSwgMjYsICAgMCwgNjQsIDEyLCAgIDAsIDQyLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMjgsIDE1MywgMjE0LCAgMjQsIDEzOCwgMTkzLCAgMjMsIDEyMywgMTcxLCAgMTYsIDEwNywgMTUwLCAgIDAsIDkxLCAxMzAsICAgMCwgNzUsIDEwOSwgICAwLCA1OCwgODcsICAgMCwgMzUsIDYxLCAgIDAsICAwLCAyNSwKLSAgICA0OCwgMTUzLCAxOTQsICA0MSwgMTM4LCAxNzQsICAzNCwgMTIzLCAxNTYsICAyNywgMTA3LCAxMzYsICAxNiwgOTEsIDExNywgICAxLCA3NSwgOTgsICAgMCwgNTcsIDc4LCAgIDAsIDM1LCA1MywgICAwLCAgMCwgMTcsCi0gICAgNTUsIDE1MywgMTc3LCAgNDcsIDEzNywgMTU4LCAgNDIsIDEyMiwgMTQyLCAgMzMsIDEwNywgMTI0LCAgMjIsIDkxLCAxMDYsICAgNiwgNzUsIDg4LCAgIDAsIDU3LCA3MCwgICAwLCAzNSwgNDYsICAgMCwgIDAsICA5LAotICAgIDYxLCAxNTIsIDE1OCwgIDUzLCAxMzYsIDE0MywgIDQ1LCAxMjIsIDEyNywgIDM2LCAxMDYsIDExMSwgIDI0LCA5MCwgOTQsICAxMCwgNzQsIDc4LCAgIDAsIDU3LCA2MSwgICAwLCAzNSwgMzksICAgMCwgIDAsICAyLAotICAgIDY3LCAxNTEsIDE0MSwgIDU5LCAxMzUsIDEyNiwgIDQ5LCAxMjEsIDExMiwgIDM5LCAxMDUsIDk4LCAgMjksIDkwLCA4MywgIDE0LCA3NCwgNjgsICAgMCwgNTcsIDUyLCAgIDAsIDM1LCAzMSwgICAwLCAgMCwgIDAsCi0gICAgNzEsIDE1MCwgMTIzLCAgNjIsIDEzNSwgMTEwLCAgNTQsIDEyMCwgOTgsICA0MiwgMTA1LCA4NCwgIDMxLCA4OSwgNzEsICAxNiwgNzQsIDU4LCAgIDAsIDU3LCA0MywgICAwLCAzNSwgMjIsICAgMCwgIDAsICAwLAotICAgIDc0LCAxNTAsIDEwNSwgIDY0LCAxMzQsIDkyLCAgNTUsIDEyMCwgODMsICA0NSwgMTA0LCA3MSwgIDM0LCA4OSwgNTksICAyMCwgNzMsIDQ3LCAgIDAsIDU3LCAzMiwgICAwLCAzNSwgMTMsICAgMCwgIDAsICAwLAotICAgIDc4LCAxNDksIDg0LCAgNjksIDEzNCwgNzUsICA1OSwgMTIwLCA2NiwgIDQ3LCAxMDMsIDU2LCAgMzQsIDg4LCA0NiwgIDIyLCA3MywgMzQsICAgMSwgNTcsIDIwLCAgIDAsIDM1LCAgMSwgICAwLCAgMCwgIDAsCi0gICAgODAsIDE0OSwgNjksICA3MCwgMTMzLCA2MSwgIDYwLCAxMTksIDUzLCAgNDksIDEwMywgNDQsICAzNiwgODgsIDM1LCAgMjMsIDczLCAyNCwgICAyLCA1NiwgMTAsICAgMCwgMzUsICAwLCAgIDAsICAwLCAgMCwKLSAgICA1OCwgMTM2LCAyMDAsICA1MCwgMTIyLCAxODAsICA0NSwgMTA5LCAxNjIsICAzOCwgOTQsIDE0MSwgIDI3LCA4MCwgMTIxLCAgMTUsIDY1LCAxMDIsICAgMCwgNDgsIDgxLCAgIDAsIDI2LCA1NiwgICAwLCAgMCwgMTksCi0gICAgNjYsIDEzNiwgMTgyLCAgNTksIDEyMiwgMTYzLCAgNTIsIDEwOSwgMTQ2LCAgNDIsIDk0LCAxMjgsICAzMiwgODAsIDEwOSwgIDIwLCA2NSwgOTEsICAgMiwgNDgsIDcyLCAgIDAsIDI2LCA0OSwgICAwLCAgMCwgMTEsCi0gICAgNzAsIDEzNiwgMTY1LCAgNjIsIDEyMiwgMTQ5LCAgNTUsIDEwOCwgMTMzLCAgNDYsIDk0LCAxMTYsICAzNSwgODAsIDk5LCAgMjEsIDY1LCA4MiwgICA0LCA0OSwgNjQsICAgMCwgMjYsIDQxLCAgIDAsICAwLCAgMywKLSAgICA3NiwgMTM1LCAxNDksICA2NiwgMTIxLCAxMzMsICA1OCwgMTA4LCAxMTksICA0OCwgOTQsIDEwMywgIDM2LCA3OSwgODgsICAyMywgNjUsIDczLCAgIDcsIDQ5LCA1NiwgICAwLCAyNywgMzQsICAgMCwgIDAsICAwLAotICAgIDc4LCAxMzUsIDEzMywgIDY5LCAxMjAsIDExOCwgIDYwLCAxMDcsIDEwNiwgIDUwLCA5MywgOTIsICAzOSwgNzksIDc3LCAgMjYsIDY1LCA2MywgICA4LCA0OSwgNDcsICAgMCwgMjcsIDI2LCAgIDAsICAwLCAgMCwKLSAgICA4MiwgMTM0LCAxMTcsICA3MSwgMTIwLCAxMDQsICA2MiwgMTA3LCA5MiwgIDUxLCA5MywgNzksICAzOSwgNzgsIDY2LCAgMjcsIDY0LCA1MywgIDEwLCA0OCwgMzksICAgMCwgMjcsIDE4LCAgIDAsICAwLCAgMCwKLSAgICA4NCwgMTM0LCA5OSwgIDczLCAxMTksIDg3LCAgNjQsIDEwNiwgNzcsICA1MywgOTIsIDY2LCAgNDIsIDc4LCA1NSwgIDI4LCA2NCwgNDIsICAxMSwgNDgsIDI5LCAgIDAsIDI4LCAgOSwgICAwLCAgMCwgIDAsCi0gICAgODcsIDEzMywgODEsICA3NiwgMTE5LCA3MiwgIDY2LCAxMDYsIDYyLCAgNTUsIDkyLCA1MiwgIDQzLCA3OCwgNDIsICAyOSwgNjQsIDMxLCAgMTIsIDQ4LCAxNywgICAwLCAyOCwgIDAsICAgMCwgIDAsICAwLAotICAgIDg4LCAxMzQsIDY3LCAgNzcsIDExOSwgNTgsICA2OCwgMTA2LCA1MSwgIDU2LCA5MiwgNDIsICA0NCwgNzgsIDMyLCAgMzAsIDY0LCAyMCwgIDEyLCA0OCwgIDYsICAgMCwgMjgsICAwLCAgIDAsICAwLCAgMCwKLSAgICA3MywgMTIwLCAxODksICA2NCwgMTA3LCAxNjgsICA1NywgOTYsIDE1MSwgIDQ3LCA4MiwgMTMzLCAgMzgsIDY5LCAxMTQsICAyNiwgNTUsIDk1LCAgMTEsIDM5LCA3NSwgICAwLCAxNiwgNTEsICAgMCwgIDAsIDE0LAotICAgIDc4LCAxMjAsIDE3MSwgIDY5LCAxMDcsIDE1MywgIDYyLCA5NSwgMTM3LCAgNTEsIDgyLCAxMTksICA0MCwgNjksIDEwMiwgIDI5LCA1NSwgODUsICAxNSwgMzksIDY2LCAgIDAsIDE3LCA0NCwgICAwLCAgMCwgIDQsCi0gICAgODEsIDEyMCwgMTU2LCAgNzEsIDEwNywgMTQwLCAgNjQsIDk1LCAxMjUsICA1MywgODIsIDEwOSwgIDQyLCA2OSwgOTMsICAzMSwgNTUsIDc3LCAgMTYsIDM5LCA1OSwgICAwLCAxOCwgMzcsICAgMCwgIDAsICAwLAotICAgIDg1LCAxMjAsIDE0MSwgIDc0LCAxMDcsIDEyNiwgIDY1LCA5NSwgMTEyLCAgNTQsIDgyLCA5NywgIDQzLCA2OSwgODIsICAzMiwgNTUsIDY3LCAgMTcsIDM5LCA1MSwgICAwLCAxOSwgMzAsICAgMCwgIDAsICAwLAotICAgIDg2LCAxMTksIDEyNiwgIDc2LCAxMDYsIDExMiwgIDY2LCA5NSwgMTAwLCAgNTYsIDgxLCA4NSwgIDQ1LCA2OSwgNzIsICAzMywgNTUsIDU5LCAgMTgsIDQwLCA0MywgICAwLCAxOSwgMjIsICAgMCwgIDAsICAwLAotICAgIDg5LCAxMTksIDExMCwgIDc4LCAxMDYsIDk4LCAgNjksIDk0LCA4NywgIDU2LCA4MSwgNzUsICA0NiwgNjgsIDYyLCAgMzMsIDU1LCA0OSwgIDE4LCA0MCwgMzUsICAgMCwgMjAsIDE1LCAgIDAsICAwLCAgMCwKLSAgICA4OSwgMTE5LCA5NSwgIDgwLCAxMDYsIDgzLCAgNzAsIDk0LCA3MywgIDU4LCA4MSwgNjMsICA0NiwgNjgsIDUxLCAgMzQsIDU1LCAzOSwgIDE5LCA0MCwgMjUsICAgMCwgMjAsICA0LCAgIDAsICAwLCAgMCwKLSAgICA5MiwgMTE4LCA3OCwgIDgyLCAxMDYsIDY4LCAgNzAsIDkzLCA1OSwgIDU5LCA4MSwgNDksICA0NywgNjgsIDM5LCAgMzQsIDU1LCAyOCwgIDE5LCA0MCwgMTQsICAgMCwgMjAsICAwLCAgIDAsICAwLCAgMCwKLSAgICA5MywgMTE4LCA2NSwgIDgyLCAxMDUsIDU1LCAgNzIsIDkzLCA0OCwgIDYwLCA4MSwgMzksICA0NywgNjgsIDI5LCAgMzQsIDU1LCAxOCwgIDIwLCA0MCwgIDIsICAgMCwgMjAsICAwLCAgIDAsICAwLCAgMCwKLSAgICA4MywgMTA0LCAxNzcsICA3NCwgOTMsIDE1OSwgIDY1LCA4MiwgMTQyLCAgNTYsIDcwLCAxMjQsICA0NSwgNTcsIDEwNiwgIDMzLCA0NCwgODksICAyMCwgMjgsIDcwLCAgIDEsICA0LCA0NiwgICAwLCAgMCwgIDgsCi0gICAgODYsIDEwNCwgMTYxLCAgNzgsIDkzLCAxNDUsICA2OCwgODIsIDEyOCwgIDU4LCA3MCwgMTEyLCAgNDgsIDU4LCA5NiwgIDM1LCA0NSwgODAsICAyMSwgMjksIDYyLCAgIDEsICA2LCA0MCwgICAwLCAgMCwgIDAsCi0gICAgODksIDEwNCwgMTQ3LCAgNzksIDkzLCAxMzEsICA2OSwgODIsIDExOCwgIDU5LCA3MCwgMTAyLCAgNDcsIDU4LCA4NywgIDM2LCA0NSwgNzIsICAyMywgMjksIDU1LCAgIDMsICA3LCAzMywgICAwLCAgMCwgIDAsCi0gICAgOTAsIDEwNCwgMTMyLCAgODAsIDkzLCAxMTksICA3MSwgODIsIDEwNiwgIDYwLCA3MCwgOTEsICA0OCwgNTgsIDc3LCAgMzcsIDQ1LCA2MiwgIDIzLCAzMCwgNDcsICAgNCwgIDcsIDI2LCAgIDAsICAwLCAgMCwKLSAgICA5MiwgMTA0LCAxMTgsICA4MiwgOTMsIDEwNSwgIDcyLCA4MiwgOTMsICA2MSwgNjksIDgwLCAgNTAsIDU4LCA2OCwgIDM3LCA0NSwgNTUsICAyMywgMzAsIDM5LCAgIDQsICA4LCAxOCwgICAwLCAgMCwgIDAsCi0gICAgOTQsIDEwNCwgMTA1LCAgODIsIDkyLCA5MywgIDcyLCA4MiwgODIsICA2MSwgNzAsIDcwLCAgNTAsIDU4LCA1OCwgIDM4LCA0NiwgNDYsICAyMywgMzEsIDMxLCAgIDYsIDEwLCAxMSwgICAwLCAgMCwgIDAsCi0gICAgOTUsIDEwNCwgOTAsICA4NCwgOTIsIDc5LCAgNzQsIDgyLCA3MCwgIDYyLCA3MCwgNTgsICA1MCwgNTgsIDQ4LCAgMzcsIDQ2LCAzNiwgIDIzLCAzMSwgMjIsICAgNCwgMTEsICAzLCAgIDAsICAwLCAgMCwKLSAgICA5NiwgMTAzLCA3NCwgIDg1LCA5MiwgNjUsICA3NSwgODEsIDU2LCAgNjMsIDcwLCA0NywgIDUwLCA1OCwgMzcsICAzOCwgNDYsIDI1LCAgMjQsIDMxLCAxMSwgICAzLCAxMSwgIDAsICAgMCwgIDAsICAwLAotICAgIDk3LCAxMDMsIDYyLCAgODYsIDkyLCA1MywgIDc2LCA4MSwgNDUsICA2MywgNjksIDM2LCAgNTEsIDU4LCAyNywgIDM4LCA0NiwgMTUsICAyMywgMzEsICAwLCAgIDMsIDExLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgOTAsIDg3LCAxNjUsICA4MSwgNzcsIDE0OCwgIDcyLCA2NywgMTMyLCAgNjIsIDU1LCAxMTYsICA1MCwgNDQsIDk5LCAgMzksIDMxLCA4MiwgIDI1LCAxNCwgNjQsICAgMSwgIDAsIDQyLCAgIDAsICAwLCAgMSwKLSAgICA5MywgODcsIDE1MCwgIDgzLCA3NywgMTM1LCAgNzQsIDY3LCAxMjEsICA2MywgNTYsIDEwNSwgIDUyLCA0NSwgOTAsICA0MCwgMzIsIDc0LCAgMjUsIDE2LCA1NywgICAzLCAgMCwgMzUsICAgMCwgIDAsICAwLAotICAgIDk1LCA4NywgMTM4LCAgODUsIDc3LCAxMjMsICA3NSwgNjcsIDEwOSwgIDYzLCA1NywgOTUsICA1MywgNDUsIDgxLCAgNDEsIDMzLCA2NiwgIDI2LCAxNywgNTAsICAgNCwgIDAsIDI4LCAgIDAsICAwLCAgMCwKLSAgICA5NSwgODgsIDEyNCwgIDg1LCA3NywgMTExLCAgNzUsIDY3LCA5OSwgIDYzLCA1NywgODYsICA1MywgNDUsIDcyLCAgNDEsIDMzLCA1OCwgIDI2LCAxOCwgNDMsICAgNSwgIDEsIDIyLCAgIDAsICAwLCAgMCwKLSAgICA5NywgODgsIDExMiwgIDg3LCA3NywgMTAwLCAgNzYsIDY4LCA4OCwgIDY0LCA1NywgNzYsICA1MywgNDYsIDYzLCAgNDEsIDM0LCA1MCwgIDI2LCAxOSwgMzUsICAgNSwgIDIsIDE0LCAgIDAsICAwLCAgMCwKLSAgICA5OSwgODcsIDk5LCAgODcsIDc4LCA4OCwgIDc2LCA2OCwgNzcsICA2NSwgNTcsIDY1LCAgNTMsIDQ2LCA1NCwgIDQxLCAzNSwgNDIsICAyNywgMjAsIDI3LCAgIDYsICAyLCAgNSwgICAwLCAgMCwgIDAsCi0gICAgMTAwLCA4NywgODUsICA4OCwgNzcsIDc1LCAgNzcsIDY4LCA2NSwgIDY1LCA1NywgNTQsICA1MywgNDYsIDQ0LCAgNDEsIDM1LCAzMiwgIDI3LCAyMSwgMTksICAgNSwgIDMsICAyLCAgIDAsICAwLCAgMCwKLSAgICAxMDAsIDg4LCA3MSwgIDg5LCA3NywgNjEsICA3OCwgNjgsIDUzLCAgNjYsIDU3LCA0NCwgIDUzLCA0NywgMzMsICA0MSwgMzUsIDIyLCAgMjcsIDIxLCAgNywgICA1LCAgMywgIDAsICAgMCwgIDAsICAwLAotICAgIDEwMSwgODcsIDYwLCAgOTAsIDc3LCA1MiwgIDc5LCA2OCwgNDQsICA2NiwgNTgsIDM0LCAgNTMsIDQ3LCAyNSwgIDQxLCAzNSwgMTMsICAyNiwgMjIsICAwLCAgIDUsICAzLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgOTcsIDY3LCAxNTUsICA4NiwgNTgsIDEzOCwgIDc3LCA1MCwgMTI1LCAgNjYsIDM5LCAxMDgsICA1NSwgMjgsIDkyLCAgNDMsIDEyLCA3NiwgIDI5LCAgMCwgNTksICAgMiwgIDAsIDM3LCAgIDAsICAwLCAgMCwKLSAgICA5OSwgNjcsIDE0MSwgIDg4LCA1OSwgMTI3LCAgNzgsIDUwLCAxMTMsICA2OCwgNDAsIDk4LCAgNTYsIDI5LCA4MywgIDQ0LCAxNSwgNjgsICAyOSwgIDAsIDUyLCAgIDMsICAwLCAzMCwgICAwLCAgMCwgIDAsCi0gICAgMTAwLCA2OCwgMTI5LCAgODksIDU5LCAxMTUsICA4MCwgNTEsIDEwMywgIDY4LCA0MSwgODksICA1NiwgMzAsIDc1LCAgNDQsIDE2LCA2MSwgIDMwLCAgMCwgNDUsICAgNCwgIDAsIDI0LCAgIDAsICAwLCAgMCwKLSAgICAxMDAsIDY5LCAxMTgsICA5MCwgNjAsIDEwNCwgIDgwLCA1MSwgOTIsICA2NywgNDEsIDc5LCAgNTYsIDMxLCA2NiwgIDQ0LCAxOCwgNTMsICAyOSwgIDIsIDM4LCAgIDQsICAwLCAxOCwgICAwLCAgMCwgIDAsCi0gICAgMTAxLCA2OSwgMTA0LCAgOTAsIDYxLCA5MywgIDc5LCA1MSwgODIsICA2NywgNDIsIDcwLCAgNTYsIDMyLCA1OSwgIDQ0LCAyMCwgNDYsICAyOSwgIDQsIDMxLCAgIDYsICAwLCAgOSwgICAwLCAgMCwgIDAsCi0gICAgMTAyLCA2OSwgOTMsICA5MCwgNjEsIDgzLCAgODAsIDUyLCA3MiwgIDY4LCA0MiwgNjEsICA1NiwgMzMsIDUwLCAgNDMsIDIwLCAzOCwgIDI5LCAgNSwgMjMsICAgNywgIDAsICA0LCAgIDAsICAwLCAgMCwKLSAgICAxMDIsIDcwLCA4MCwgIDkxLCA2MSwgNzEsICA4MCwgNTIsIDYxLCAgNjgsIDQzLCA1MSwgIDU2LCAzMiwgNDAsICA0NCwgMjEsIDI5LCAgMzAsICA2LCAxNCwgICA3LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDEwMywgNzAsIDY4LCAgOTIsIDYxLCA1OCwgIDgxLCA1MywgNTAsICA2OSwgNDMsIDQxLCAgNTYsIDM0LCAzMSwgIDQzLCAyMiwgMTksICAyOSwgIDcsICAzLCAgIDcsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTA0LCA3MCwgNTcsICA5MiwgNjEsIDQ4LCAgODIsIDUzLCA0MCwgIDY5LCA0MywgMzIsICA1NiwgMzQsIDIyLCAgNDMsIDIzLCAxMCwgIDI5LCAgOCwgIDAsICAgNiwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMDEsIDQ1LCAxNDUsICA5MSwgMzUsIDEyOSwgIDgwLCAyNiwgMTE2LCAgNjksIDE1LCAxMDEsICA1OSwgIDAsIDg2LCAgNDYsICAwLCA3MSwgIDMxLCAgMCwgNTUsICAgMCwgIDAsIDMzLCAgIDAsICAwLCAgMCwKLSAgICAxMDQsIDQ0LCAxMzIsICA5MiwgMzYsIDExOCwgIDgyLCAyOCwgMTA1LCAgNzEsIDE3LCA5MSwgIDU4LCAgMywgNzcsICA0NiwgIDAsIDYzLCAgMzEsICAwLCA0OCwgICAyLCAgMCwgMjYsICAgMCwgIDAsICAwLAotICAgIDEwNCwgNDYsIDEyMSwgIDkzLCAzNywgMTA3LCAgODIsIDMwLCA5NiwgIDcwLCAyMCwgODMsICA1OCwgIDYsIDcwLCAgNDYsICAwLCA1NywgIDMyLCAgMCwgNDEsICAgNCwgIDAsIDIwLCAgIDAsICAwLCAgMCwKLSAgICAxMDQsIDQ4LCAxMTAsICA5MywgNDAsIDk4LCAgODIsIDMxLCA4NywgIDcwLCAyMiwgNzQsICA1OSwgIDksIDYyLCAgNDUsICAwLCA0OSwgIDMxLCAgMCwgMzUsICAgNiwgIDAsIDEzLCAgIDAsICAwLCAgMCwKLSAgICAxMDQsIDQ4LCA5OSwgIDkyLCA0MSwgODgsICA4MiwgMzIsIDc3LCAgNzAsIDIzLCA2NSwgIDU4LCAxMSwgNTQsICA0NiwgIDAsIDQyLCAgMzIsICAwLCAyNywgICA3LCAgMCwgIDUsICAgMCwgIDAsICAwLAotICAgIDEwNSwgNTAsIDg4LCAgOTMsIDQxLCA3NywgIDgyLCAzNCwgNjgsICA3MSwgMjQsIDU3LCAgNTgsIDEzLCA0NiwgIDQ1LCAgMSwgMzUsICAzMSwgIDAsIDIxLCAgIDcsICAwLCAgMiwgICAwLCAgMCwgIDAsCi0gICAgMTA1LCA1MCwgNzYsICA5NCwgNDEsIDY2LCAgODMsIDM0LCA1NywgIDcxLCAyNSwgNDcsICA1OCwgMTUsIDM3LCAgNDUsICAyLCAyNSwgIDMyLCAgMCwgMTEsICAgNywgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMDYsIDUwLCA2NCwgIDk0LCA0MiwgNTUsICA4MywgMzUsIDQ3LCAgNzEsIDI2LCAzOCwgIDU4LCAxNiwgMjcsICA0NSwgIDQsIDE3LCAgMzEsICAwLCAgNCwgICA3LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDEwNiwgNTEsIDU0LCAgOTUsIDQyLCA0NSwgIDgzLCAzNSwgMzgsICA3MSwgMjcsIDMwLCAgNTgsIDE2LCAxOSwgIDQ1LCAgNSwgIDcsICAzMCwgIDAsICAwLCAgIDYsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTgxLCAyNDAsICAgMCwgMTYyLCAyMTYsICAgMCwgMTQ0LCAxOTMsICAgMCwgMTI2LCAxNjgsICAgMCwgMTA5LCAxNDYsICAgMCwgOTEsIDEyMywgICAwLCA3MSwgOTgsICAgMCwgNDgsIDcxLCAgIDAsICA5LCAzNCwKLSAgICAwLCAxNzksIDIxOCwgICAwLCAxNjEsIDE5NSwgICAwLCAxNDQsIDE3NCwgICAwLCAxMjYsIDE1MywgICAwLCAxMDgsIDEzMiwgICAwLCA5MCwgMTEwLCAgIDAsIDcxLCA4OCwgICAwLCA0OCwgNjMsICAgMCwgIDgsIDI5LAotICAgIDAsIDE3OCwgMTk3LCAgIDAsIDE1OSwgMTc3LCAgIDAsIDE0MywgMTU5LCAgIDAsIDEyNSwgMTM5LCAgIDAsIDEwNywgMTE5LCAgIDAsIDkwLCA5OSwgICAwLCA3MSwgNzksICAgMCwgNDgsIDU1LCAgIDAsICA4LCAyMiwKLSAgICAwLCAxNzcsIDE3NywgICAwLCAxNTgsIDE1OCwgICAwLCAxNDIsIDE0MSwgICAwLCAxMjQsIDEyMywgICAwLCAxMDcsIDEwNiwgICAwLCA4OSwgODgsICAgMCwgNzEsIDcwLCAgIDAsIDQ4LCA0NywgICAwLCAgOCwgMTQsCi0gICAgMCwgMTc2LCAxNTcsICAgMCwgMTU4LCAxNDEsICAgMCwgMTQxLCAxMjYsICAgMCwgMTIzLCAxMDksICAgMCwgMTA2LCA5MywgICAwLCA4OSwgNzgsICAgMCwgNzAsIDYwLCAgIDAsIDQ3LCAzOSwgICAwLCAgNywgIDUsCi0gICAgMCwgMTc1LCAxMzgsICAgMCwgMTU3LCAxMjMsICAgMCwgMTQxLCAxMTAsICAgMCwgMTIzLCA5NiwgICAwLCAxMDUsIDgxLCAgIDAsIDg4LCA2NywgICAwLCA3MCwgNTEsICAgMCwgNDgsIDMwLCAgIDAsICA2LCAgMCwKLSAgICAwLCAxNzMsIDExNSwgICAwLCAxNTUsIDEwNCwgICAwLCAxNDAsIDkyLCAgIDAsIDEyMiwgODAsICAgMCwgMTA1LCA2NywgICAwLCA4OCwgNTUsICAgMCwgNjksIDQwLCAgIDAsIDQ3LCAyMCwgICAwLCAgNiwgIDAsCi0gICAgMCwgMTczLCA5NCwgICAwLCAxNTUsIDg1LCAgIDAsIDEzOSwgNzUsICAgMCwgMTIxLCA2NCwgICAwLCAxMDQsIDUzLCAgIDAsIDg4LCA0MiwgICAwLCA3MCwgMjgsICAgMCwgNDcsICA5LCAgIDAsICA2LCAgMCwKLSAgICAwLCAxNzMsIDc2LCAgIDAsIDE1NSwgNzAsICAgMCwgMTM4LCA2MSwgICAwLCAxMjIsIDUzLCAgIDAsIDEwNCwgNDQsICAgMCwgODcsIDMyLCAgIDAsIDY5LCAxOCwgICAwLCA0NywgIDAsICAgMCwgIDYsICAwLAotICAgIDAsIDE2NCwgMjI2LCAgIDAsIDE0NywgMjAzLCAgIDAsIDEzMSwgMTgxLCAgIDAsIDExNCwgMTU4LCAgIDAsIDk3LCAxMzYsICAgMCwgODAsIDExNSwgICAwLCA2MywgOTIsICAgMCwgNDAsIDY1LCAgIDAsICAwLCAzMCwKLSAgICAwLCAxNjIsIDIwNSwgICAwLCAxNDUsIDE4NCwgICAwLCAxMzAsIDE2NCwgICAwLCAxMTQsIDE0MywgICAwLCA5NywgMTI0LCAgIDAsIDgxLCAxMDQsICAgMCwgNjMsIDgzLCAgIDAsIDQwLCA1OCwgICAwLCAgMCwgMjMsCi0gICAgMCwgMTYyLCAxODcsICAgMCwgMTQ1LCAxNjcsICAgMCwgMTMwLCAxNTAsICAgMCwgMTEzLCAxMzEsICAgMCwgOTYsIDExMiwgICAwLCA4MCwgOTMsICAgMCwgNjIsIDc0LCAgIDAsIDQwLCA1MCwgICAwLCAgMCwgMTYsCi0gICAgMCwgMTYwLCAxNjcsICAgMCwgMTQ0LCAxNTAsICAgMCwgMTI5LCAxMzQsICAgMCwgMTEyLCAxMTYsICAgMCwgOTYsIDEwMCwgICAwLCA4MCwgODIsICAgMCwgNjIsIDY1LCAgIDAsIDQwLCA0MywgICAwLCAgMCwgIDcsCi0gICAgMCwgMTYwLCAxNDgsICAgMCwgMTQzLCAxMzMsICAgMCwgMTI4LCAxMTgsICAgMCwgMTExLCAxMDMsICAgMCwgOTYsIDg4LCAgIDAsIDgwLCA3MywgICAwLCA2MiwgNTYsICAgMCwgNDAsIDM1LCAgIDAsICAwLCAgMCwKLSAgICAwLCAxNTgsIDEzMCwgICAwLCAxNDIsIDExNywgICAwLCAxMjcsIDEwNCwgICAwLCAxMTEsIDg5LCAgIDAsIDk1LCA3NiwgICAwLCA3OSwgNjIsICAgMCwgNjIsIDQ2LCAgIDAsIDQwLCAyNiwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTU4LCAxMTEsICAgMCwgMTQxLCA5OSwgICAwLCAxMjcsIDg4LCAgIDAsIDExMSwgNzYsICAgMCwgOTUsIDYzLCAgIDAsIDc5LCA1MSwgICAwLCA2MiwgMzcsICAgMCwgNDAsIDE4LCAgIDAsICAwLCAgMCwKLSAgICAwLCAxNTgsIDkxLCAgIDAsIDE0MSwgODEsICAgMCwgMTI2LCA3MiwgICAwLCAxMTAsIDYyLCAgIDAsIDk0LCA1MCwgICAwLCA3OSwgMzksICAgMCwgNjIsIDI1LCAgIDAsIDQwLCAgNSwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTU3LCA3NCwgICAwLCAxNDEsIDY2LCAgIDAsIDEyNiwgNTksICAgMCwgMTEwLCA0OSwgICAwLCA5NCwgNDAsICAgMCwgNzgsIDI5LCAgIDAsIDYxLCAxNSwgICAwLCA0MCwgIDAsICAgMCwgIDAsICAwLAotICAgIDAsIDE0OCwgMjE0LCAgIDAsIDEzMywgMTkyLCAgIDAsIDExOSwgMTcxLCAgIDAsIDEwMywgMTUwLCAgIDAsIDg3LCAxMjksICAgMCwgNzIsIDEwOCwgICAwLCA1NSwgODYsICAgMCwgMzIsIDYxLCAgIDAsICAwLCAyNSwKLSAgICAwLCAxNDcsIDE5MywgICAwLCAxMzIsIDE3MywgICAwLCAxMTgsIDE1NSwgICAwLCAxMDMsIDEzNiwgICAwLCA4NywgMTE2LCAgIDAsIDcyLCA5OCwgICAwLCA1NSwgNzgsICAgMCwgMzIsIDUzLCAgIDAsICAwLCAxNywKLSAgICAwLCAxNDcsIDE3NiwgICAwLCAxMzIsIDE1OCwgICAwLCAxMTgsIDE0MiwgICAwLCAxMDIsIDEyNCwgICAwLCA4NywgMTA2LCAgIDAsIDcyLCA4OCwgICAwLCA1NSwgNjksICAgMCwgMzMsIDQ2LCAgIDAsICAwLCAgOSwKLSAgICAwLCAxNDYsIDE1OSwgICAwLCAxMzEsIDE0MiwgICAwLCAxMTcsIDEyNywgICAwLCAxMDIsIDExMSwgICAwLCA4NywgOTUsICAgMCwgNzEsIDc5LCAgIDAsIDU1LCA2MSwgICAwLCAzMywgMzksICAgMCwgIDAsICAyLAotICAgIDAsIDE0NSwgMTQwLCAgIDAsIDEzMCwgMTI2LCAgIDAsIDExNywgMTEyLCAgIDAsIDEwMSwgOTgsICAgMCwgODYsIDgzLCAgIDAsIDcxLCA2OCwgICAwLCA1NSwgNTIsICAgMCwgMzMsIDMxLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxNDQsIDEyNCwgICAwLCAxMzAsIDExMSwgICAwLCAxMTYsIDk5LCAgIDAsIDEwMSwgODQsICAgMCwgODYsIDcyLCAgIDAsIDcxLCA1OSwgICAwLCA1NSwgNDMsICAgMCwgMzMsIDIzLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxNDQsIDEwNiwgICAwLCAxMjksIDk0LCAgIDAsIDExNSwgODMsICAgMCwgMTAxLCA3MiwgICAwLCA4NSwgNjAsICAgMCwgNzEsIDQ4LCAgIDAsIDU1LCAzNCwgICAwLCAzMywgMTQsICAgMCwgIDAsICAwLAotICAgIDMsIDE0MywgODYsICAgMCwgMTI5LCA3NywgICAwLCAxMTUsIDY4LCAgIDAsIDEwMCwgNTgsICAgMCwgODUsIDQ4LCAgIDAsIDcwLCAzNiwgICAwLCA1NCwgMjIsICAgMCwgMzMsICAzLCAgIDAsICAwLCAgMCwKLSAgICAxOCwgMTQzLCA3MiwgIDEzLCAxMjgsIDYzLCAgIDAsIDExNSwgNTcsICAgMCwgMTAwLCA0NywgICAwLCA4NSwgMzcsICAgMCwgNzAsIDI2LCAgIDAsIDU0LCAxMywgICAwLCAzMywgIDAsICAgMCwgIDAsICAwLAotICAgIDAsIDEzMiwgMjAwLCAgIDAsIDExOCwgMTc5LCAgIDAsIDEwNSwgMTYxLCAgIDAsIDkxLCAxNDAsICAgMCwgNzYsIDEyMSwgICAwLCA2MiwgMTAxLCAgIDAsIDQ2LCA4MSwgICAwLCAyNCwgNTYsICAgMCwgIDAsIDE5LAotICAgIDAsIDEzMSwgMTgyLCAgIDAsIDExOCwgMTYzLCAgIDAsIDEwNSwgMTQ2LCAgIDAsIDkxLCAxMjgsICAgMCwgNzcsIDExMCwgICAwLCA2MiwgOTEsICAgMCwgNDYsIDcyLCAgIDAsIDI1LCA0OCwgICAwLCAgMCwgMTEsCi0gICAgMCwgMTMxLCAxNjUsICAgMCwgMTE3LCAxNDksICAgMCwgMTA0LCAxMzMsICAgMCwgOTEsIDExNiwgICAwLCA3NywgOTksICAgMCwgNjIsIDgyLCAgIDAsIDQ2LCA2NCwgICAwLCAyNSwgNDEsICAgMCwgIDAsICA0LAotICAgIDAsIDEzMSwgMTQ5LCAgIDAsIDExNiwgMTM0LCAgIDAsIDEwNCwgMTE5LCAgIDAsIDkxLCAxMDQsICAgMCwgNzcsIDg5LCAgIDAsIDYyLCA3MywgICAwLCA0NiwgNTYsICAgMCwgMjUsIDM0LCAgIDAsICAwLCAgMCwKLSAgICAxMCwgMTMwLCAxMzMsICAgMiwgMTE2LCAxMTksICAgMCwgMTA0LCAxMDYsICAgMCwgOTAsIDkxLCAgIDAsIDc2LCA3OCwgICAwLCA2MiwgNjQsICAgMCwgNDYsIDQ4LCAgIDAsIDI2LCAyNywgICAwLCAgMCwgIDAsCi0gICAgMjMsIDEzMCwgMTE4LCAgMjAsIDExNiwgMTA0LCAgMTMsIDEwMywgOTMsICAgMywgODksIDc5LCAgIDAsIDc2LCA2NywgICAwLCA2MiwgNTQsICAgMCwgNDYsIDM5LCAgIDAsIDI2LCAxOSwgICAwLCAgMCwgIDAsCi0gICAgMzMsIDEyOSwgMTAxLCAgMjcsIDExNSwgODksICAxOSwgMTAzLCA3OSwgICA5LCA4OSwgNjcsICAgMCwgNzUsIDU2LCAgIDAsIDYxLCA0MywgICAwLCA0NiwgMjksICAgMCwgMjYsIDEwLCAgIDAsICAwLCAgMCwKLSAgICA0MSwgMTI4LCA4MywgIDM1LCAxMTUsIDczLCAgMjcsIDEwMiwgNjQsICAxNSwgODksIDU1LCAgIDAsIDc2LCA0NSwgICAwLCA2MiwgMzMsICAgMCwgNDYsIDE4LCAgIDAsIDI2LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNDMsIDEyOSwgNjksICAzOCwgMTE1LCA2MSwgIDMwLCAxMDIsIDU0LCAgMTcsIDg5LCA0NSwgICAyLCA3NSwgMzQsICAgMCwgNjEsIDIzLCAgIDAsIDQ2LCAgOSwgICAwLCAyNiwgIDAsICAgMCwgIDAsICAwLAotICAgIDEsIDExNiwgMTg4LCAgIDEsIDEwNCwgMTY4LCAgIDAsIDkyLCAxNTEsICAgMCwgNzksIDEzMiwgICAwLCA2NiwgMTEzLCAgIDAsIDUyLCA5NCwgICAwLCAzNiwgNzUsICAgMCwgMTQsIDUyLCAgIDAsICAwLCAxNCwKLSAgICAxNywgMTE2LCAxNzEsICAxNiwgMTA0LCAxNTMsICAxNCwgOTIsIDEzNywgICA4LCA3OSwgMTE5LCAgIDAsIDY3LCAxMDIsICAgMCwgNTMsIDg1LCAgIDAsIDM3LCA2NywgICAwLCAxNiwgNDQsICAgMCwgIDAsICA0LAotICAgIDMxLCAxMTYsIDE1NSwgIDI3LCAxMDQsIDE0MCwgIDIxLCA5MiwgMTI1LCAgMTMsIDc5LCAxMDksICAgMywgNjYsIDkzLCAgIDAsIDUzLCA3NywgICAwLCAzNywgNTksICAgMCwgMTYsIDM4LCAgIDAsICAwLCAgMCwKLSAgICAzNywgMTE1LCAxNDEsICAzMCwgMTAzLCAxMjYsICAyNiwgOTIsIDExMiwgIDE2LCA3OSwgOTgsICAgNSwgNjYsIDgzLCAgIDAsIDUzLCA2NywgICAwLCAzOCwgNTEsICAgMCwgMTcsIDMxLCAgIDAsICAwLCAgMCwKLSAgICA0MSwgMTE1LCAxMjYsICAzNywgMTAzLCAxMTIsICAzMSwgOTIsIDEwMCwgIDIyLCA3OSwgODYsICAxMCwgNjYsIDcyLCAgIDAsIDUzLCA1OSwgICAwLCAzOCwgNDQsICAgMCwgMTcsIDIzLCAgIDAsICAwLCAgMCwKLSAgICA0OCwgMTE1LCAxMTEsICA0MSwgMTAyLCA5OSwgIDM0LCA5MSwgODgsICAyNCwgNzgsIDc2LCAgMTQsIDY2LCA2MywgICAwLCA1MywgNTAsICAgMCwgMzgsIDM2LCAgIDAsIDE4LCAxNSwgICAwLCAgMCwgIDAsCi0gICAgNTEsIDExNSwgOTUsICA0NiwgMTAyLCA4NSwgIDM3LCA5MSwgNzQsICAyNiwgNzgsIDYzLCAgMTYsIDY2LCA1MiwgICAwLCA1MywgNDAsICAgMCwgMzgsIDI2LCAgIDAsIDE4LCAgNSwgICAwLCAgMCwgIDAsCi0gICAgNTUsIDExNCwgODAsICA0NywgMTAyLCA2OSwgIDQwLCA5MCwgNjAsICAzMCwgNzgsIDUxLCAgMTksIDY2LCA0MSwgICAzLCA1MywgMjksICAgMCwgMzgsIDE1LCAgIDAsIDE3LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNTYsIDExNCwgNjYsICA1MCwgMTAyLCA1OCwgIDQwLCA5MSwgNTAsICAzMiwgNzgsIDQxLCAgMTgsIDY2LCAzMiwgICA0LCA1MywgMjEsICAgMCwgMzgsICA1LCAgIDAsIDE3LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMzksIDEwMiwgMTc4LCAgMzcsIDkwLCAxNTksICAzMCwgNzksIDE0MiwgIDIxLCA2OCwgMTI0LCAgMTQsIDU1LCAxMDYsICAgMCwgNDIsIDg5LCAgIDAsIDI2LCA3MCwgICAwLCAgNCwgNDYsICAgMCwgIDAsICA4LAotICAgIDQ4LCAxMDIsIDE2MSwgIDQyLCA5MCwgMTQ1LCAgMzUsIDc5LCAxMjgsICAyNiwgNjgsIDExMiwgIDE5LCA1NSwgOTYsICAgMywgNDMsIDc5LCAgIDAsIDI3LCA2MiwgICAwLCAgNiwgNDAsICAgMCwgIDAsICAwLAotICAgIDUwLCAxMDIsIDE0NywgIDQ0LCA5MCwgMTMyLCAgMzcsIDc5LCAxMTgsICAzMCwgNjgsIDEwMiwgIDIwLCA1NiwgODcsICAgNywgNDMsIDcyLCAgIDAsIDI4LCA1NSwgICAwLCAgNiwgMzQsICAgMCwgIDAsICAwLAotICAgIDUzLCAxMDEsIDEzMywgIDQ3LCA5MCwgMTE4LCAgNDEsIDc5LCAxMDYsICAzMiwgNjgsIDkxLCAgMjEsIDU2LCA3OCwgICA5LCA0MywgNjMsICAgMCwgMjgsIDQ3LCAgIDAsICA2LCAyNiwgICAwLCAgMCwgIDAsCi0gICAgNTcsIDEwMSwgMTE5LCAgNTAsIDg5LCAxMDYsICA0MiwgNzksIDk0LCAgMzQsIDY3LCA4MSwgIDI0LCA1NiwgNjgsICAgOSwgNDQsIDU1LCAgIDAsIDI5LCA0MCwgICAwLCAgNiwgMTksICAgMCwgIDAsICAwLAotICAgIDYwLCAxMDAsIDEwNSwgIDUwLCA5MCwgOTQsICA0NSwgODAsIDgzLCAgMzYsIDY4LCA3MSwgIDI0LCA1NiwgNTksICAxMSwgNDQsIDQ2LCAgIDAsIDI5LCAzMiwgICAwLCAgNywgMTIsICAgMCwgIDAsICAwLAotICAgIDYzLCAxMDEsIDkxLCAgNTUsIDkwLCA4MCwgIDQ2LCA3OSwgNzAsICAzNywgNjgsIDU5LCAgMjYsIDU2LCA0OSwgIDEyLCA0NCwgMzcsICAgMSwgMjksIDIzLCAgIDAsICA3LCAgMywgICAwLCAgMCwgIDAsCi0gICAgNjQsIDEwMSwgNzUsICA1NiwgODksIDY3LCAgNDgsIDc5LCA1NywgIDM3LCA2OCwgNDgsICAyNywgNTYsIDM3LCAgMTUsIDQ0LCAyNiwgICAwLCAyOSwgMTIsICAgMCwgIDcsICAwLCAgIDAsICAwLCAgMCwKLSAgICA2NiwgMTAxLCA2NCwgIDU4LCA4OSwgNTUsICA0OSwgNzksIDQ3LCAgMzksIDY4LCAzOCwgIDI3LCA1NiwgMjksICAxNCwgNDQsIDE4LCAgIDEsIDMwLCAgMiwgICAwLCAgNywgIDAsICAgMCwgIDAsICAwLAotICAgIDU3LCA4NiwgMTY1LCAgNTEsIDc1LCAxNDgsICA0NSwgNjUsIDEzMywgIDM4LCA1NCwgMTE2LCAgMjgsIDQzLCAxMDAsICAxNiwgMjksIDgzLCAgIDAsIDEzLCA2NCwgICAwLCAgMCwgNDIsICAgMCwgIDAsICAzLAotICAgIDYwLCA4NiwgMTUxLCAgNTUsIDc1LCAxMzUsICA0NywgNjYsIDEyMSwgIDM5LCA1NSwgMTA1LCAgMzAsIDQ0LCA5MCwgIDE4LCAzMSwgNzQsICAgMywgMTYsIDU3LCAgIDAsICAxLCAzNSwgICAwLCAgMCwgIDAsCi0gICAgNjIsIDg2LCAxMzksICA1NiwgNzUsIDEyMywgIDQ5LCA2NiwgMTEwLCAgNDAsIDU1LCA5NSwgIDMwLCA0NCwgODEsICAxOSwgMzEsIDY2LCAgIDQsIDE3LCA1MSwgICAwLCAgMSwgMjksICAgMCwgIDAsICAwLAotICAgIDY1LCA4NiwgMTI1LCAgNTYsIDc2LCAxMTIsICA0OSwgNjYsIDk5LCAgMzksIDU1LCA4NiwgIDMxLCA0NCwgNzIsICAxOSwgMzIsIDU5LCAgIDUsIDE4LCA0NCwgICAwLCAgMSwgMjMsICAgMCwgIDAsICAwLAotICAgIDY3LCA4NiwgMTEzLCAgNTgsIDc1LCAxMDAsICA1MSwgNjYsIDg4LCAgNDEsIDU2LCA3NywgIDMxLCA0NSwgNjQsICAyMCwgMzIsIDUxLCAgIDYsIDE4LCAzNSwgICAwLCAgMSwgMTQsICAgMCwgIDAsICAwLAotICAgIDY5LCA4NiwgOTksICA2MSwgNzYsIDg4LCAgNTIsIDY2LCA3OCwgIDQzLCA1NiwgNjYsICAzMiwgNDUsIDU1LCAgMjAsIDMzLCA0MiwgICA3LCAxOSwgMjcsICAgMCwgIDEsICA2LCAgIDAsICAwLCAgMCwKLSAgICA2OSwgODYsIDg2LCAgNjEsIDc2LCA3NSwgIDUzLCA2NywgNjYsICA0MywgNTYsIDU1LCAgMzMsIDQ1LCA0NSwgIDIxLCAzNCwgMzQsICAgOCwgMjAsIDIwLCAgIDAsICAyLCAgMiwgICAwLCAgMCwgIDAsCi0gICAgNzEsIDg2LCA3MiwgIDYzLCA3NSwgNjIsICA1NCwgNjYsIDU1LCAgNDUsIDU2LCA0NSwgIDMzLCA0NSwgMzUsICAyMiwgMzQsIDIzLCAgIDcsIDIwLCAgOCwgICAwLCAgMiwgIDAsICAgMCwgIDAsICAwLAotICAgIDcxLCA4NiwgNjIsICA2NCwgNzUsIDUzLCAgNTUsIDY2LCA0NiwgIDQ1LCA1NiwgMzYsICAzMywgNDYsIDI3LCAgMjIsIDM0LCAxNSwgICA4LCAyMCwgIDAsICAgMCwgIDIsICAwLCAgIDAsICAwLCAgMCwKLSAgICA2OSwgNjcsIDE1NiwgIDYxLCA1OCwgMTQwLCAgNTMsIDUwLCAxMjUsICA0NSwgMzksIDEwOCwgIDM1LCAyOCwgOTMsICAyNSwgMTIsIDc3LCAgMTIsICAwLCA1OSwgICAwLCAgMCwgMzcsICAgMCwgIDAsICAwLAotICAgIDcxLCA2OCwgMTQyLCAgNjMsIDU5LCAxMjYsICA1NiwgNTAsIDExNCwgIDQ3LCA0MCwgOTgsICAzNywgMjgsIDg0LCAgMjYsIDE1LCA2OCwgIDEyLCAgMCwgNTMsICAgMCwgIDAsIDMwLCAgIDAsICAwLCAgMCwKLSAgICA3MiwgNjgsIDEzMCwgIDYzLCA1OSwgMTE2LCAgNTYsIDUwLCAxMDQsICA0NywgNDAsIDkwLCAgMzgsIDMwLCA3NSwgIDI3LCAxNiwgNjEsICAxMywgIDAsIDQ2LCAgIDAsICAwLCAyNCwgICAwLCAgMCwgIDAsCi0gICAgNzMsIDY5LCAxMTgsICA2NSwgNTksIDEwNSwgIDU3LCA1MSwgOTIsICA0NywgNDEsIDgwLCAgMzcsIDMwLCA2NywgIDI2LCAxOCwgNTMsICAxNCwgIDEsIDM5LCAgIDAsICAwLCAxOCwgICAwLCAgMCwgIDAsCi0gICAgNzQsIDY5LCAxMDYsICA2NSwgNjAsIDkzLCAgNTcsIDUxLCA4MiwgIDQ4LCA0MSwgNzAsICAzOCwgMzEsIDU5LCAgMjYsIDE5LCA0NiwgIDEzLCAgMiwgMzIsICAgMCwgIDAsIDEwLCAgIDAsICAwLCAgMCwKLSAgICA3NiwgNjksIDk1LCAgNjYsIDYxLCA4NCwgIDU4LCA1MiwgNzMsICA0OCwgNDIsIDYxLCAgMzcsIDMyLCA1MCwgIDI2LCAyMCwgMzgsICAxNCwgIDQsIDI0LCAgIDAsICAwLCAgNCwgICAwLCAgMCwgIDAsCi0gICAgNzYsIDY5LCA4MSwgIDY4LCA2MCwgNzIsICA1OCwgNTIsIDYyLCAgNDgsIDQyLCA1MSwgIDM4LCAzMiwgNDEsICAyNywgMjEsIDMwLCAgMTQsICA0LCAxNiwgICAwLCAgMCwgIDEsICAgMCwgIDAsICAwLAotICAgIDc2LCA2OSwgNjgsICA2OCwgNjEsIDYwLCAgNjAsIDUyLCA1MSwgIDQ5LCA0MywgNDEsICAzOCwgMzMsIDMyLCAgMjcsIDIxLCAyMCwgIDE0LCAgNSwgIDUsICAgMCwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICA3OCwgNzAsIDU5LCAgNjksIDYxLCA1MCwgIDYwLCA1MiwgNDIsICA0OSwgNDMsIDM0LCAgMzksIDMzLCAyNCwgIDI3LCAyMiwgMTMsICAxNCwgIDcsICAxLCAgIDAsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNzUsIDQ2LCAxNDYsICA2OCwgMzgsIDEzMSwgIDYwLCAzMCwgMTE3LCAgNTAsIDE5LCAxMDIsICA0MSwgIDQsIDg3LCAgMjksICAwLCA3MiwgIDEzLCAgMCwgNTUsICAgMCwgIDAsIDMzLCAgIDAsICAwLCAgMCwKLSAgICA3OCwgNDcsIDEzMiwgIDcwLCAzOSwgMTE5LCAgNjEsIDMwLCAxMDUsICA1MywgMjAsIDkyLCAgNDIsICA1LCA3OCwgIDMwLCAgMCwgNjQsICAxMywgIDAsIDQ5LCAgIDAsICAwLCAyNywgICAwLCAgMCwgIDAsCi0gICAgNzksIDQ4LCAxMjIsICA3MCwgNDAsIDEwOCwgIDYyLCAzMiwgOTYsICA1MiwgMjIsIDg0LCAgNDIsICA5LCA3MSwgIDMwLCAgMCwgNTgsICAxNCwgIDAsIDQyLCAgIDAsICAwLCAyMCwgICAwLCAgMCwgIDAsCi0gICAgNzksIDUwLCAxMTEsICA3MCwgNDIsIDk5LCAgNjIsIDMzLCA4OCwgIDUyLCAyMywgNzQsICA0MSwgMTEsIDYzLCAgMjksICAwLCA1MCwgIDE0LCAgMCwgMzYsICAgMCwgIDAsIDE0LCAgIDAsICAwLCAgMCwKLSAgICA4MCwgNTAsIDk5LCAgNzAsIDQyLCA4OSwgIDYxLCAzNCwgNzgsICA1MiwgMjUsIDY3LCAgNDEsIDE0LCA1NSwgIDMwLCAgMCwgNDIsICAxNSwgIDAsIDI4LCAgIDAsICAwLCAgNiwgICAwLCAgMCwgIDAsCi0gICAgODEsIDUxLCA4OSwgIDcxLCA0MywgNzgsICA2MiwgMzUsIDY5LCAgNTIsIDI1LCA1OCwgIDQyLCAxNSwgNDcsICAzMCwgIDMsIDM2LCAgMTUsICAwLCAyMiwgICAwLCAgMCwgIDMsICAgMCwgIDAsICAwLAotICAgIDgxLCA1MSwgNzcsICA3MSwgNDQsIDY4LCAgNjMsIDM2LCA1OSwgIDUzLCAyNiwgNDksICA0MSwgMTYsIDM4LCAgMzEsICA0LCAyNywgIDE2LCAgMCwgMTIsICAgMCwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICA4MSwgNTIsIDY1LCAgNzIsIDQzLCA1NiwgIDYzLCAzNiwgNDgsICA1MywgMjcsIDM5LCAgNDEsIDE3LCAyOSwgIDMwLCAgNCwgMTgsICAxNCwgIDAsICAzLCAgIDAsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgODEsIDUyLCA1NSwgIDczLCA0NCwgNDcsICA2NCwgMzYsIDM5LCAgNTMsIDI4LCAzMiwgIDQyLCAxOCwgMjEsICAzMSwgIDYsICA5LCAgMTQsICAwLCAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDAsIDE3NCwgMjM5LCAgIDAsIDE1NiwgMjE0LCAgIDAsIDEzOSwgMTkyLCAgIDAsIDEyMSwgMTY4LCAgIDAsIDEwNSwgMTQ1LCAgIDAsIDg3LCAxMjMsICAgMCwgNjgsIDk4LCAgIDAsIDQ2LCA3MCwgICAwLCAgMywgMzUsCi0gICAgMCwgMTcyLCAyMTcsICAgMCwgMTU1LCAxOTQsICAgMCwgMTM5LCAxNzMsICAgMCwgMTIxLCAxNTIsICAgMCwgMTA0LCAxMzAsICAgMCwgODcsIDExMCwgICAwLCA2OSwgODgsICAgMCwgNDYsIDYzLCAgIDAsICA0LCAyOCwKLSAgICAwLCAxNzEsIDE5NywgICAwLCAxNTMsIDE3NSwgICAwLCAxMzgsIDE1OCwgICAwLCAxMjEsIDEzOSwgICAwLCAxMDMsIDExOCwgICAwLCA4NiwgMTAwLCAgIDAsIDY4LCA3OSwgICAwLCA0NiwgNTUsICAgMCwgIDQsIDIyLAotICAgIDAsIDE3MCwgMTc3LCAgIDAsIDE1MiwgMTU4LCAgIDAsIDEzNiwgMTQxLCAgIDAsIDExOSwgMTI0LCAgIDAsIDEwMywgMTA2LCAgIDAsIDg2LCA4OCwgICAwLCA2OCwgNzAsICAgMCwgNDUsIDQ3LCAgIDAsICAzLCAxNCwKLSAgICAwLCAxNjksIDE1NywgICAwLCAxNTIsIDE0MSwgICAwLCAxMzYsIDEyNiwgICAwLCAxMTksIDEwOSwgICAwLCAxMDIsIDk0LCAgIDAsIDg2LCA3OCwgICAwLCA2OCwgNjAsICAgMCwgNDYsIDM5LCAgIDAsICAzLCAgNSwKLSAgICAwLCAxNjcsIDEzOCwgICAwLCAxNTAsIDEyNCwgICAwLCAxMzUsIDExMSwgICAwLCAxMTgsIDk3LCAgIDAsIDEwMiwgODIsICAgMCwgODUsIDY4LCAgIDAsIDY4LCA1MiwgICAwLCA0NiwgMzEsICAgMCwgIDMsICAwLAotICAgIDAsIDE2NywgMTE4LCAgIDAsIDE1MCwgMTA0LCAgIDAsIDEzNSwgOTQsICAgMCwgMTE4LCA4MSwgICAwLCAxMDEsIDY5LCAgIDAsIDg0LCA1NiwgICAwLCA2NywgNDEsICAgMCwgNDUsIDIxLCAgIDAsICAzLCAgMCwKLSAgICAwLCAxNjYsIDk3LCAgIDAsIDE0OSwgODcsICAgMCwgMTM0LCA3NywgICAwLCAxMTcsIDY3LCAgIDAsIDEwMSwgNTYsICAgMCwgODUsIDQ0LCAgIDAsIDY3LCAzMCwgICAwLCA0NSwgMTAsICAgMCwgIDMsICAwLAotICAgIDAsIDE2NSwgNzksICAgMCwgMTQ5LCA3MywgICAwLCAxMzMsIDY0LCAgIDAsIDExNywgNTYsICAgMCwgMTAxLCA0NiwgICAwLCA4NSwgMzQsICAgMCwgNjgsIDIxLCAgIDAsIDQ2LCAgMSwgICAwLCAgMywgIDAsCi0gICAgMCwgMTU4LCAyMjUsICAgMCwgMTQxLCAyMDEsICAgMCwgMTI2LCAxODAsICAgMCwgMTA5LCAxNTgsICAgMCwgOTQsIDEzNiwgICAwLCA3OCwgMTE0LCAgIDAsIDYwLCA5MSwgICAwLCAzOCwgNjYsICAgMCwgIDAsIDMwLAotICAgIDAsIDE1NiwgMjAzLCAgIDAsIDE0MCwgMTgzLCAgIDAsIDEyNSwgMTY0LCAgIDAsIDEwOSwgMTQzLCAgIDAsIDk0LCAxMjQsICAgMCwgNzgsIDEwNCwgICAwLCA2MSwgODMsICAgMCwgMzgsIDU3LCAgIDAsICAwLCAyMywKLSAgICAwLCAxNTYsIDE4NiwgICAwLCAxNDAsIDE2NiwgICAwLCAxMjUsIDE1MCwgICAwLCAxMDksIDEzMCwgICAwLCA5MywgMTExLCAgIDAsIDc3LCA5MywgICAwLCA2MCwgNzQsICAgMCwgMzgsIDUwLCAgIDAsICAwLCAxNywKLSAgICAwLCAxNTUsIDE2NywgICAwLCAxMzgsIDE0OSwgICAwLCAxMjQsIDEzNCwgICAwLCAxMDksIDExNywgICAwLCA5MywgMTAwLCAgIDAsIDc2LCA4MywgICAwLCA2MCwgNjUsICAgMCwgMzgsIDQzLCAgIDAsICAwLCAgOSwKLSAgICAwLCAxNTMsIDE0NywgICAwLCAxMzgsIDEzNCwgICAwLCAxMjQsIDEyMCwgICAwLCAxMDcsIDEwMywgICAwLCA5MiwgODgsICAgMCwgNzcsIDczLCAgIDAsIDYwLCA1NiwgICAwLCAzOCwgMzUsICAgMCwgIDAsICAwLAotICAgIDAsIDE1MywgMTMxLCAgIDAsIDEzNywgMTE4LCAgIDAsIDEyMiwgMTA1LCAgIDAsIDEwNywgOTAsICAgMCwgOTEsIDc2LCAgIDAsIDc2LCA2MywgICAwLCA2MCwgNDcsICAgMCwgMzksIDI4LCAgIDAsICAwLCAgMCwKLSAgICAwLCAxNTMsIDExMSwgICAwLCAxMzYsIDEwMCwgICAwLCAxMjMsIDkwLCAgIDAsIDEwNywgNzcsICAgMCwgOTIsIDY1LCAgIDAsIDc2LCA1MiwgICAwLCA2MCwgMzcsICAgMCwgMzgsIDE4LCAgIDAsICAwLCAgMCwKLSAgICAwLCAxNTIsIDkzLCAgIDAsIDEzNiwgODIsICAgMCwgMTIyLCA3NCwgICAwLCAxMDYsIDYzLCAgIDAsIDkxLCA1MiwgICAwLCA3NiwgNDAsICAgMCwgNTksIDI2LCAgIDAsIDM4LCAgNiwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTUxLCA3OCwgICAwLCAxMzYsIDY5LCAgIDAsIDEyMSwgNjEsICAgMCwgMTA2LCA1MiwgICAwLCA5MSwgNDMsICAgMCwgNzYsIDMyLCAgIDAsIDU5LCAxNywgICAwLCAzOCwgIDAsICAgMCwgIDAsICAwLAotICAgIDAsIDE0MywgMjEzLCAgIDAsIDEyOCwgMTkxLCAgIDAsIDExNSwgMTcxLCAgIDAsIDEwMCwgMTQ5LCAgIDAsIDg0LCAxMjgsICAgMCwgNjksIDEwOCwgICAwLCA1MiwgODYsICAgMCwgMzAsIDYxLCAgIDAsICAwLCAyNSwKLSAgICAwLCAxNDIsIDE5MywgICAwLCAxMjcsIDE3MywgICAwLCAxMTQsIDE1NCwgICAwLCA5OSwgMTM0LCAgIDAsIDg0LCAxMTYsICAgMCwgNjksIDk4LCAgIDAsIDUyLCA3NywgICAwLCAzMSwgNTMsICAgMCwgIDAsIDE4LAotICAgIDAsIDE0MSwgMTc2LCAgIDAsIDEyNywgMTU4LCAgIDAsIDExNCwgMTQxLCAgIDAsIDk4LCAxMjIsICAgMCwgODQsIDEwNSwgICAwLCA2OSwgODgsICAgMCwgNTMsIDY5LCAgIDAsIDMxLCA0NiwgICAwLCAgMCwgIDksCi0gICAgMCwgMTQxLCAxNTksICAgMCwgMTI2LCAxNDIsICAgMCwgMTEzLCAxMjcsICAgMCwgOTgsIDExMCwgICAwLCA4MywgOTUsICAgMCwgNjksIDc4LCAgIDAsIDUzLCA2MCwgICAwLCAzMiwgMzksICAgMCwgIDAsICAyLAotICAgIDAsIDE0MCwgMTQwLCAgIDAsIDEyNiwgMTI2LCAgIDAsIDExMiwgMTEyLCAgIDAsIDk4LCA5OCwgICAwLCA4MywgODMsICAgMCwgNjgsIDY5LCAgIDAsIDUyLCA1MiwgICAwLCAzMSwgMzEsICAgMCwgIDAsICAwLAotICAgIDAsIDE0MCwgMTI0LCAgIDAsIDEyNSwgMTEyLCAgIDAsIDExMiwgMTAwLCAgIDAsIDk3LCA4NiwgICAwLCA4MywgNzIsICAgMCwgNjgsIDU5LCAgIDAsIDUyLCA0NCwgICAwLCAzMSwgMjMsICAgMCwgIDAsICAwLAotICAgIDAsIDEzOSwgMTA2LCAgIDAsIDEyNSwgOTYsICAgMCwgMTExLCA4NSwgICAwLCA5NywgNzIsICAgMCwgODMsIDYyLCAgIDAsIDY4LCA0OSwgICAwLCA1MiwgMzUsICAgMCwgMzEsIDE1LCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMzgsIDg4LCAgIDAsIDEyNCwgNzksICAgMCwgMTExLCA3MCwgICAwLCA5NiwgNTksICAgMCwgODIsIDQ4LCAgIDAsIDY4LCAzOCwgICAwLCA1MiwgMjQsICAgMCwgMzEsICA0LCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMzksIDc2LCAgIDAsIDEyNCwgNjYsICAgMCwgMTExLCA1OCwgICAwLCA5NiwgNTAsICAgMCwgODIsIDQwLCAgIDAsIDY4LCAyOSwgICAwLCA1MiwgMTUsICAgMCwgMzEsICAwLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMjksIDIwMCwgICAwLCAxMTQsIDE3OSwgICAwLCAxMDIsIDE2MCwgICAwLCA4NywgMTM5LCAgIDAsIDc0LCAxMjAsICAgMCwgNjAsIDEwMSwgICAwLCA0NCwgODEsICAgMCwgMjIsIDU2LCAgIDAsICAwLCAxOSwKLSAgICAwLCAxMjcsIDE4MSwgICAwLCAxMTQsIDE2MywgICAwLCAxMDIsIDE0NiwgICAwLCA4OCwgMTI3LCAgIDAsIDc0LCAxMDksICAgMCwgNjAsIDkxLCAgIDAsIDQ0LCA3MiwgICAwLCAyMywgNDgsICAgMCwgIDAsIDExLAotICAgIDAsIDEyNywgMTY2LCAgIDAsIDExMywgMTQ4LCAgIDAsIDEwMSwgMTMzLCAgIDAsIDg3LCAxMTUsICAgMCwgNzQsIDk5LCAgIDAsIDYwLCA4MiwgICAwLCA0NCwgNjQsICAgMCwgMjMsIDQyLCAgIDAsICAwLCAgNCwKLSAgICAwLCAxMjcsIDE1MCwgICAwLCAxMTMsIDEzNCwgICAwLCAxMDEsIDExOSwgICAwLCA4NywgMTA0LCAgIDAsIDc0LCA4OSwgICAwLCA2MCwgNzMsICAgMCwgNDQsIDU2LCAgIDAsIDIzLCAzNSwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTI1LCAxMzQsICAgMCwgMTEyLCAxMTgsICAgMCwgMTAwLCAxMDYsICAgMCwgODcsIDkyLCAgIDAsIDczLCA3OCwgICAwLCA2MCwgNjQsICAgMCwgNDQsIDQ4LCAgIDAsIDIzLCAyNywgICAwLCAgMCwgIDAsCi0gICAgMCwgMTI1LCAxMTgsICAgMCwgMTEyLCAxMDUsICAgMCwgMTAwLCA5NCwgICAwLCA4NiwgODAsICAgMCwgNzMsIDY4LCAgIDAsIDYwLCA1NCwgICAwLCA0NCwgMzksICAgMCwgMjMsIDIwLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMjUsIDEwMSwgICAwLCAxMTEsIDkwLCAgIDAsIDk5LCA4MCwgICAwLCA4NiwgNjksICAgMCwgNzMsIDU4LCAgIDAsIDU5LCA0NSwgICAwLCA0NCwgMzAsICAgMCwgMjMsIDExLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMjQsIDg1LCAgIDAsIDExMSwgNzUsICAgMCwgOTksIDY2LCAgIDAsIDg2LCA1NiwgICAwLCA3MywgNDUsICAgMCwgNTksIDM0LCAgIDAsIDQ0LCAyMCwgICAwLCAyMywgIDEsICAgMCwgIDAsICAwLAotICAgIDAsIDEyNSwgNzIsICAgMCwgMTExLCA2MiwgICAwLCA5OSwgNTYsICAgMCwgODYsIDQ2LCAgIDAsIDczLCAzNiwgICAwLCA2MCwgMjYsICAgMCwgNDQsIDEyLCAgIDAsIDIzLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTE0LCAxODgsICAgMCwgMTAxLCAxNjcsICAgMCwgODksIDE1MCwgICAwLCA3NywgMTMxLCAgIDAsIDY0LCAxMTMsICAgMCwgNTAsIDk1LCAgIDAsIDM0LCA3NSwgICAwLCAxMiwgNTIsICAgMCwgIDAsIDE0LAotICAgIDAsIDExMywgMTcwLCAgIDAsIDEwMSwgMTUzLCAgIDAsIDg5LCAxMzcsICAgMCwgNzcsIDEyMCwgICAwLCA2NCwgMTAyLCAgIDAsIDUwLCA4NSwgICAwLCAzNSwgNjcsICAgMCwgMTIsIDQ0LCAgIDAsICAwLCAgNCwKLSAgICAwLCAxMTMsIDE1NiwgICAwLCAxMDAsIDEzOSwgICAwLCA4OSwgMTI1LCAgIDAsIDc3LCAxMDksICAgMCwgNjQsIDkyLCAgIDAsIDUxLCA3NywgICAwLCAzNSwgNjAsICAgMCwgMTIsIDM4LCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMTIsIDE0MSwgICAwLCAxMDAsIDEyNiwgICAwLCA4OSwgMTEzLCAgIDAsIDc3LCA5OCwgICAwLCA2NCwgODMsICAgMCwgNTEsIDY4LCAgIDAsIDM1LCA1MSwgICAwLCAxMiwgMzAsICAgMCwgIDAsICAwLAotICAgIDAsIDExMiwgMTI3LCAgIDAsIDEwMCwgMTEyLCAgIDAsIDg5LCAxMDAsICAgMCwgNzYsIDg3LCAgIDAsIDY0LCA3NCwgICAwLCA1MSwgNTksICAgMCwgMzUsIDQ0LCAgIDAsIDEzLCAyNCwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTEyLCAxMTEsICAgMCwgMTAwLCAxMDAsICAgMCwgODgsIDg4LCAgIDAsIDc2LCA3NiwgICAwLCA2NCwgNjQsICAgMCwgNTEsIDUyLCAgIDAsIDM2LCAzNywgICAwLCAxMywgMTcsICAgMCwgIDAsICAwLAotICAgIDAsIDExMSwgOTYsICAgMCwgOTksIDg1LCAgIDAsIDg4LCA3NiwgICAwLCA3NiwgNjQsICAgMCwgNjQsIDUzLCAgIDAsIDUxLCA0MSwgICAwLCAzNiwgMjcsICAgMCwgMTMsICA2LCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMTEsIDgxLCAgIDAsIDk5LCA3MSwgICAwLCA4OCwgNjIsICAgMCwgNzYsIDUyLCAgIDAsIDY0LCA0MywgICAwLCA1MSwgMzEsICAgMCwgMzYsIDE3LCAgIDAsIDEzLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTExLCA2OSwgICAwLCA5OSwgNjAsICAgMCwgODgsIDUyLCAgIDAsIDc1LCA0MywgICAwLCA2MywgMzQsICAgMCwgNTEsIDIxLCAgIDAsIDM2LCAgNywgICAwLCAxMywgIDAsICAgMCwgIDAsICAwLAotICAgIDAsIDk5LCAxNzcsICAgMCwgODgsIDE1OCwgICAwLCA3NywgMTQxLCAgIDAsIDY2LCAxMjMsICAgMCwgNTMsIDEwNiwgICAwLCA0MCwgODksICAgMCwgMjUsIDcxLCAgIDAsICA1LCA0NywgICAwLCAgMCwgIDgsCi0gICAgMCwgOTksIDE2MCwgICAwLCA4OCwgMTQ0LCAgIDAsIDc3LCAxMjksICAgMCwgNjYsIDExMiwgICAwLCA1NCwgOTcsICAgMCwgNDEsIDgwLCAgIDAsIDI2LCA2MiwgICAwLCAgNSwgNDAsICAgMCwgIDAsICAwLAotICAgIDAsIDk5LCAxNDcsICAgMCwgODcsIDEzMiwgICAwLCA3OCwgMTE3LCAgIDAsIDY2LCAxMDIsICAgMCwgNTQsIDg3LCAgIDAsIDQyLCA3MiwgICAwLCAyNiwgNTUsICAgMCwgIDUsIDM0LCAgIDAsICAwLCAgMCwKLSAgICAwLCA5OSwgMTM0LCAgIDAsIDg4LCAxMTksICAgMCwgNzcsIDEwNywgICAwLCA2NiwgOTIsICAgMCwgNTQsIDc4LCAgIDAsIDQyLCA2NCwgICAwLCAyNywgNDgsICAgMCwgIDUsIDI3LCAgIDAsICAwLCAgMCwKLSAgICAwLCA5OSwgMTIwLCAgIDAsIDg3LCAxMDcsICAgMCwgNzgsIDk0LCAgIDAsIDY2LCA4MSwgICAwLCA1NCwgNjgsICAgMCwgNDIsIDU1LCAgIDAsIDI3LCA0MCwgICAwLCAgNiwgMjAsICAgMCwgIDAsICAwLAotICAgIDAsIDk4LCAxMDUsICAgMCwgODcsIDk0LCAgIDAsIDc3LCA4NCwgICAwLCA2NSwgNzEsICAgMCwgNTUsIDU5LCAgIDAsIDQyLCA0NywgICAwLCAyOCwgMzMsICAgMCwgIDYsIDEyLCAgIDAsICAwLCAgMCwKLSAgICAwLCA5OCwgOTMsICAgMCwgODcsIDgxLCAgIDAsIDc3LCA3MiwgICAwLCA2NiwgNjEsICAgMCwgNTQsIDQ5LCAgIDAsIDQyLCAzNywgICAwLCAyOCwgMjQsICAgMCwgIDYsICA0LCAgIDAsICAwLCAgMCwKLSAgICAwLCA5OCwgNzcsICAgMCwgODcsIDY4LCAgIDAsIDc3LCA1OSwgICAwLCA2NSwgNDksICAgMCwgNTQsIDM5LCAgIDAsIDQyLCAyNywgICAwLCAyOSwgMTQsICAgMCwgIDYsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxLCA5OCwgNjUsICAgNywgODcsIDU2LCAgIDAsIDc3LCA0OSwgICAwLCA2NiwgNDEsICAgMCwgNTQsIDMwLCAgIDAsIDQyLCAxOSwgICAwLCAyOSwgIDMsICAgMCwgIDYsICAwLCAgIDAsICAwLCAgMCwKLSAgICAwLCA4NCwgMTY2LCAgIDAsIDc0LCAxNDksICAgMCwgNjQsIDEzNCwgICAwLCA1MywgMTE3LCAgIDAsIDQxLCAxMDAsICAgMCwgMjgsIDgzLCAgIDAsIDExLCA2NCwgICAwLCAgMCwgNDIsICAgMCwgIDAsICAzLAotICAgIDAsIDg0LCAxNTEsICAgMCwgNzQsIDEzNSwgICAwLCA2NCwgMTIxLCAgIDAsIDUzLCAxMDUsICAgMCwgNDIsIDkwLCAgIDAsIDMwLCA3NSwgICAwLCAxNCwgNTgsICAgMCwgIDAsIDM2LCAgIDAsICAwLCAgMCwKLSAgICAwLCA4NCwgMTM4LCAgIDAsIDc0LCAxMjQsICAgMSwgNjQsIDExMCwgICAwLCA1NCwgOTUsICAgMCwgNDMsIDgxLCAgIDAsIDMwLCA2NywgICAwLCAxNSwgNTEsICAgMCwgIDEsIDI5LCAgIDAsICAwLCAgMCwKLSAgICAxNCwgODQsIDEyNiwgIDEyLCA3NCwgMTEyLCAgIDIsIDY1LCA5OSwgICAwLCA1NCwgODUsICAgMCwgNDQsIDczLCAgIDAsIDMxLCA1OSwgICAwLCAxNiwgNDQsICAgMCwgIDEsIDIzLCAgIDAsICAwLCAgMCwKLSAgICAxNiwgODQsIDExMywgIDEzLCA3NCwgMTAwLCAgIDYsIDY1LCA4OSwgICAwLCA1NCwgNzcsICAgMCwgNDQsIDY1LCAgIDAsIDMxLCA1MSwgICAwLCAxNywgMzYsICAgMCwgIDEsIDE2LCAgIDAsICAwLCAgMCwKLSAgICAyNCwgODQsIDEwMCwgIDE4LCA3NCwgODgsICAxMywgNjUsIDc4LCAgIDIsIDU1LCA2OCwgICAwLCA0NCwgNTUsICAgMCwgMzIsIDQzLCAgIDAsIDE4LCAyOCwgICAwLCAgMSwgIDYsICAgMCwgIDAsICAwLAotICAgIDI2LCA4NCwgODcsICAyNCwgNzQsIDc2LCAgMTcsIDY1LCA2NywgICA3LCA1NCwgNTcsICAgMCwgNDQsIDQ2LCAgIDAsIDMyLCAzNSwgICAwLCAxOSwgMjEsICAgMCwgIDIsICAzLCAgIDAsICAwLCAgMCwKLSAgICAzMCwgODQsIDc0LCAgMjgsIDc0LCA2NCwgIDIwLCA2NSwgNTUsICAxMiwgNTUsIDQ2LCAgIDAsIDQ0LCAzNSwgICAwLCAzMiwgMjQsICAgMCwgMTgsICA5LCAgIDAsICAxLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMzIsIDg0LCA2MywgIDI4LCA3NCwgNTQsICAyMSwgNjUsIDQ3LCAgMTMsIDU0LCAzOCwgICAwLCA0NCwgMjgsICAgMCwgMzIsIDE2LCAgIDAsIDE4LCAgMSwgICAwLCAgMSwgIDAsICAgMCwgIDAsICAwLAotICAgIDMwLCA2NywgMTU1LCAgMjAsIDU4LCAxMzksICAyMCwgNDksIDEyNiwgIDEyLCAzOSwgMTEwLCAgIDAsIDI3LCA5NCwgICAwLCAxMywgNzcsICAgMCwgIDAsIDYwLCAgIDAsICAwLCAzNywgICAwLCAgMCwgIDAsCi0gICAgMzUsIDY3LCAxNDIsICAzMCwgNTgsIDEyNiwgIDIzLCA1MCwgMTE0LCAgMTYsIDQwLCA5OSwgICA3LCAyOSwgODUsICAgMCwgMTUsIDY5LCAgIDAsICAwLCA1MiwgICAwLCAgMCwgMzAsICAgMCwgIDAsICAwLAotICAgIDM1LCA2OCwgMTMxLCAgMzAsIDU5LCAxMTYsICAyNywgNTAsIDEwNCwgIDE4LCA0MCwgOTAsICAgOSwgMjksIDc2LCAgIDAsIDE3LCA2MiwgICAwLCAgMiwgNDYsICAgMCwgIDAsIDI0LCAgIDAsICAwLCAgMCwKLSAgICAzNywgNjksIDExOSwgIDMzLCA1OSwgMTA2LCAgMjcsIDUxLCA5NCwgIDIxLCA0MSwgODAsICAgOSwgMzAsIDY3LCAgIDAsIDE4LCA1NCwgICAwLCAgMywgMzksICAgMCwgIDAsIDE4LCAgIDAsICAwLCAgMCwKLSAgICA0MCwgNjksIDEwNywgIDM2LCA1OSwgOTQsICAyOCwgNTEsIDg0LCAgMTgsIDQxLCA3MiwgIDEwLCAzMSwgNjAsICAgMCwgMTksIDQ3LCAgIDAsICA0LCAzMiwgICAwLCAgMCwgMTAsICAgMCwgIDAsICAwLAotICAgIDQyLCA2OSwgOTUsICAzNiwgNTksIDg0LCAgMjksIDUxLCA3NCwgIDE5LCA0MSwgNjMsICAxMCwgMzEsIDUyLCAgIDAsIDIwLCAzOSwgICAwLCAgNCwgMjUsICAgMCwgIDAsICA0LCAgIDAsICAwLCAgMCwKLSAgICA0MywgNjksIDgzLCAgMzgsIDYwLCA3MywgIDMyLCA1MSwgNjIsICAyMywgNDIsIDUzLCAgMTEsIDMxLCA0MiwgICAwLCAyMCwgMzEsICAgMCwgIDUsIDE3LCAgIDAsICAwLCAgMSwgICAwLCAgMCwgIDAsCi0gICAgNDUsIDY5LCA3MCwgIDM5LCA2MCwgNjAsICAzMywgNTEsIDUyLCAgMjQsIDQyLCA0MywgIDEzLCAzMiwgMzMsICAgMCwgMjEsIDIxLCAgIDAsICA1LCAgNiwgICAwLCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDQ3LCA2OSwgNTksICA0MSwgNjAsIDUxLCAgMzQsIDUxLCA0MywgIDI0LCA0MiwgMzUsICAxMiwgMzMsIDI2LCAgIDEsIDIyLCAxNCwgICAwLCAgNSwgIDEsICAgMCwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICA0NiwgNDgsIDE0NiwgIDQyLCA0MCwgMTMxLCAgMzYsIDMyLCAxMTgsICAyNywgMjIsIDEwMywgIDE3LCAgNiwgODgsICAgNSwgIDAsIDczLCAgIDAsICAwLCA1NSwgICAwLCAgMCwgMzMsICAgMCwgIDAsICAwLAotICAgIDQ4LCA0OCwgMTMzLCAgNDQsIDQwLCAxMTksICAzNywgMzIsIDEwNywgIDI4LCAyMiwgOTMsICAyMCwgIDgsIDc5LCAgIDcsICAwLCA2NSwgICAwLCAgMCwgNDksICAgMCwgIDAsIDI3LCAgIDAsICAwLCAgMCwKLSAgICA0OCwgNTAsIDEyMywgIDQ0LCA0MSwgMTA5LCAgMzcsIDMzLCA5NywgIDMwLCAyMywgODMsICAyMSwgMTEsIDcxLCAgIDgsICAwLCA1OCwgICAwLCAgMCwgNDIsICAgMCwgIDAsIDIxLCAgIDAsICAwLCAgMCwKLSAgICA0OSwgNTEsIDExMSwgIDQ1LCA0MiwgOTksICAzOCwgMzQsIDg3LCAgMjksIDI1LCA3NSwgIDIwLCAxMywgNjMsICAgOCwgIDAsIDUxLCAgIDAsICAwLCAzNiwgICAwLCAgMCwgMTQsICAgMCwgIDAsICAwLAotICAgIDUyLCA1MiwgMTAwLCAgNDQsIDQzLCA4OSwgIDM4LCAzNSwgNzksICAyOSwgMjYsIDY4LCAgMTksIDE1LCA1NiwgIDEwLCAgMSwgNDMsICAgMCwgIDAsIDI4LCAgIDAsICAwLCAgNiwgICAwLCAgMCwgIDAsCi0gICAgNTIsIDUyLCA5MCwgIDQ3LCA0NCwgNzksICAzOSwgMzYsIDcwLCAgMzAsIDI3LCA1OSwgIDIwLCAxNiwgNDcsICAgOSwgIDIsIDM2LCAgIDAsICAwLCAyMiwgICAwLCAgMCwgIDIsICAgMCwgIDAsICAwLAotICAgIDUyLCA1MywgNzgsICA0NiwgNDQsIDY4LCAgMzksIDM3LCA2MCwgIDMyLCAyNywgNDksICAyMiwgMTcsIDM5LCAgMTAsICAzLCAyOCwgICAwLCAgMCwgMTIsICAgMCwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICA1MywgNTMsIDY2LCAgNDcsIDQ0LCA1NywgIDQwLCAzNiwgNDgsICAzMiwgMjcsIDM5LCAgMjIsIDE4LCAzMCwgICA5LCAgNCwgMTgsICAgMCwgIDAsICAzLCAgIDAsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNTQsIDUzLCA1NywgIDQ4LCA0NSwgNDksICA0MSwgMzcsIDQxLCAgMzMsIDI4LCAzMiwgIDIyLCAxOSwgMjMsICAxMSwgIDYsIDEwLCAgIDEsICAwLCAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsICAwLAorICAgIDI1NSwgMjU1LCAyNTUsIDIyNSwgMjI2LCAyMjgsIDE5OSwgMjAwLCAyMDIsIDE3MywgMTc0LCAxNzgsIDE0NywgMTQ5LCAxNTIsCisgICAgMTIzLCAxMjUsIDEyOCwgOTksICA5OSwgIDEwMiwgNjksICA3MCwgIDcxLCAgMzQsICAzMCwgIDMxLCAgMjU1LCAyNTMsIDIyOSwKKyAgICAyMjYsIDIyNCwgMjAzLCAyMDAsIDE5OSwgMTgyLCAxNzMsIDE3MywgMTU4LCAxNDksIDE0OCwgMTM1LCAxMjUsIDEyNCwgMTEzLAorICAgIDk5LCAgOTksICA5MCwgIDcwLCAgNjksICA2MywgIDMzLCAgMjksICAyNCwgIDI1NSwgMjUxLCAyMDQsIDIyOCwgMjIzLCAxODIsCisgICAgMjAxLCAxOTgsIDE2MywgMTc0LCAxNzIsIDE0MiwgMTUwLCAxNDcsIDEyMiwgMTI1LCAxMjMsIDEwMSwgOTksICA5OCwgIDgwLAorICAgIDcwLCAgNjgsICA1NCwgIDMyLCAgMjgsICAxNiwgIDI1NSwgMjQ5LCAxNzksIDIzMCwgMjIyLCAxNjAsIDIwMywgMTk3LCAxNDQsCisgICAgMTc0LCAxNzAsIDEyNCwgMTUwLCAxNDUsIDEwNSwgMTI1LCAxMjIsIDg4LCAgOTksICA5NywgIDY5LCAgNzAsICA2OCwgIDQ2LAorICAgIDMxLCAgMjgsICA2LCAgIDI1NSwgMjQ3LCAxNTQsIDIyOSwgMjIwLCAxMzgsIDIwMywgMTk1LCAxMjIsIDE3NiwgMTY5LCAxMDcsCisgICAgMTUwLCAxNDUsIDkxLCAgMTI1LCAxMjEsIDc0LCAgMTAwLCA5NiwgIDU3LCAgNzAsICA2NywgIDM1LCAgMjksICAyNiwgIDAsCisgICAgMjU1LCAyNDYsIDEyOCwgMjMxLCAyMTcsIDExNCwgMjA1LCAxOTQsIDEwMSwgMTc2LCAxNjcsIDg4LCAgMTUwLCAxNDQsIDc1LAorICAgIDEyNSwgMTIwLCA2MCwgIDEwMCwgOTYsICA0NCwgIDcwLCAgNjYsICAyNCwgIDI4LCAgMjYsICAwLCAgIDI1NSwgMjQ0LCA5NiwKKyAgICAyMzEsIDIxNywgODcsICAyMDMsIDE5MiwgNzgsICAxNzUsIDE2NywgNjYsICAxNTAsIDE0MywgNTYsICAxMjUsIDExOSwgNDMsCisgICAgMTAwLCA5NSwgIDI5LCAgNjksICA2NiwgIDcsICAgMjYsICAyNiwgIDAsICAgMjU1LCAyNDMsIDUxLCAgMjMyLCAyMTUsIDUxLAorICAgIDIwNCwgMTkxLCA0MywgIDE3NiwgMTY1LCAzOCwgIDE1MCwgMTQyLCAyOCwgIDEyNSwgMTE4LCAxNywgIDk5LCAgOTQsICAwLAorICAgIDY4LCAgNjUsICAwLCAgIDI0LCAgMjUsICAwLCAgIDI1NSwgMjQxLCAwLCAgIDIzMSwgMjE1LCAwLCAgIDIwMywgMTkwLCAwLAorICAgIDE3NiwgMTY0LCAwLCAgIDE1MCwgMTQxLCAwLCAgIDEyNiwgMTE3LCAwLCAgIDk5LCAgOTMsICAwLCAgIDY4LCAgNjUsICAwLAorICAgIDI0LCAgMjUsICAwLCAgIDI1MiwgMjI4LCAyMzgsIDIyMiwgMjAxLCAyMTEsIDE5NywgMTgwLCAxOTAsIDE3MSwgMTU2LCAxNjYsCisgICAgMTQ3LCAxMzMsIDE0MywgMTIzLCAxMTEsIDExOSwgOTksICA4OCwgIDk0LCAgNzEsICA2MSwgIDY2LCAgMzQsICAyMiwgIDI2LAorICAgIDI1NCwgMjI2LCAyMTMsIDIyNCwgMjAxLCAxOTEsIDE5OSwgMTc5LCAxNzEsIDE3MiwgMTU1LCAxNDgsIDE0NywgMTMzLCAxMjgsCisgICAgMTIzLCAxMTAsIDEwNiwgOTgsICA4NywgIDgzLCAgNzAsICA1OSwgIDU3LCAgMzMsICAyMSwgIDE4LCAgMjU0LCAyMjQsIDE5MSwKKyAgICAyMjQsIDE5OSwgMTcyLCAyMDAsIDE3NywgMTUzLCAxNzMsIDE1NCwgMTMzLCAxNDcsIDEzMiwgMTE1LCAxMjMsIDEwOSwgOTQsCisgICAgOTgsICA4NiwgIDc0LCAgNzAsICA1OSwgIDQ5LCAgMzIsICAyMSwgIDksICAgMjU1LCAyMjIsIDE2OCwgMjI3LCAxOTgsIDE1MCwKKyAgICAyMDAsIDE3NSwgMTM1LCAxNzMsIDE1MywgMTE4LCAxNDgsIDEzMCwgOTksICAxMjMsIDEwOSwgODIsICA5OCwgIDg2LCAgNjQsCisgICAgNjksICA1OCwgIDQwLCAgMzEsICAxOSwgIDAsICAgMjU1LCAyMjEsIDE0NSwgMjI3LCAxOTYsIDEyOSwgMjAxLCAxNzQsIDExNSwKKyAgICAxNzMsIDE1MSwgOTksICAxNDgsIDEyOSwgODUsICAxMjQsIDEwOCwgNjksICA5OCwgIDg1LCAgNTIsICA2OSwgIDU4LCAgMzAsCisgICAgMzAsICAxOSwgIDAsICAgMjU1LCAyMTksIDEyMSwgMjI3LCAxOTUsIDEwOSwgMjAxLCAxNzQsIDk3LCAgMTc0LCAxNTAsIDgzLAorICAgIDE0OCwgMTI5LCA3MCwgIDEyNCwgMTA3LCA1NSwgIDk4LCAgODQsICA0MCwgIDY5LCAgNTgsICAxOSwgIDI4LCAgMTgsICAwLAorICAgIDI1NSwgMjE4LCA5MiwgIDIyOSwgMTk0LCA4MiwgIDIwMiwgMTczLCA3NSwgIDE3NCwgMTUwLCA2MywgIDE0OSwgMTI4LCA1MSwKKyAgICAxMjQsIDEwNiwgMzksICA5OCwgIDg0LCAgMjQsICA2OCwgIDU3LCAgMywgICAyNiwgIDE4LCAgMCwgICAyNTUsIDIxNywgNTQsCisgICAgMjI4LCAxOTMsIDUyLCAgMjAxLCAxNzIsIDQ2LCAgMTc0LCAxNDgsIDM2LCAgMTQ4LCAxMjcsIDI3LCAgMTIzLCAxMDUsIDE0LAorICAgIDk4LCAgODMsICAwLCAgIDY4LCAgNTYsICAwLCAgIDI1LCAgMTgsICAwLCAgIDI1NSwgMjE2LCAwLCAgIDIyOSwgMTkyLCAyLAorICAgIDIwMiwgMTcxLCA0LCAgIDE3MywgMTQ4LCAwLCAgIDE0OCwgMTI2LCAwLCAgIDEyNCwgMTA1LCAwLCAgIDk4LCAgODMsICAwLAorICAgIDY4LCAgNTYsICAwLCAgIDI0LCAgMTcsICAwLCAgIDI0OSwgMjA0LCAyMjMsIDIxOSwgMTgxLCAxOTksIDE5NSwgMTYwLCAxNzgsCisgICAgMTcwLCAxNDAsIDE1NiwgMTQ2LCAxMTksIDEzNCwgMTIzLCA5OSwgIDExMiwgOTgsICA3NywgIDg4LCAgNzAsICA1MiwgIDYxLAorICAgIDM0LCAgMTEsICAyMCwgIDI1MCwgMjAxLCAyMDAsIDIyMSwgMTgwLCAxNzgsIDE5NywgMTU5LCAxNjEsIDE3MSwgMTM5LCAxMzksCisgICAgMTQ3LCAxMTksIDEyMCwgMTIzLCA5OCwgIDk5LCAgOTgsICA3NywgIDc4LCAgNjksICA1MSwgIDUyLCAgMzQsICAxMSwgIDEwLAorICAgIDI1MiwgMjAxLCAxODAsIDIyMywgMTc5LCAxNjIsIDE5NywgMTU5LCAxNDQsIDE3MCwgMTM4LCAxMjUsIDE0NiwgMTE3LCAxMDcsCisgICAgMTIyLCA5NywgIDg5LCAgOTgsICA3NiwgIDY5LCAgNjksICA1MCwgIDQ0LCAgMzIsICAxMSwgIDIsICAgMjUyLCAxOTksIDE1OCwKKyAgICAyMjIsIDE3NywgMTQzLCAxOTksIDE1OCwgMTI3LCAxNzEsIDEzNywgMTEwLCAxNDcsIDExNywgOTMsICAxMjIsIDk2LCAgNzYsCisgICAgOTcsICA3NSwgIDU4LCAgNjksICA1MCwgIDM2LCAgMzIsICAxMCwgIDAsICAgMjUzLCAxOTgsIDEzNywgMjIzLCAxNzcsIDEyMywKKyAgICAxOTgsIDE1NiwgMTEwLCAxNzEsIDEzNiwgOTUsICAxNDYsIDExNiwgODAsICAxMjIsIDk2LCAgNjUsICA5NywgIDc1LCAgNDcsCisgICAgNjksICA1MCwgIDI1LCAgMzAsICAxMCwgIDAsICAgMjU0LCAxOTcsIDExNSwgMjI1LCAxNzUsIDEwNCwgMTk4LCAxNTYsIDkyLAorICAgIDE3MiwgMTM1LCA3OSwgIDE0NywgMTE1LCA2NiwgIDEyMywgOTUsICA1MiwgIDk4LCAgNzQsICAzNywgIDY5LCAgNDksICAxNSwKKyAgICAyOSwgIDEwLCAgMCwgICAyNTQsIDE5NiwgODksICAyMjQsIDE3NSwgODAsICAxOTksIDE1NCwgNzAsICAxNzIsIDEzNCwgNTksCisgICAgMTQ2LCAxMTQsIDQ4LCAgMTIyLCA5NSwgIDM2LCAgOTcsICA3NCwgIDIxLCAgNjgsICA0OSwgIDAsICAgMjcsICA5LCAgIDAsCisgICAgMjU1LCAxOTUsIDU3LCAgMjI1LCAxNzMsIDUyLCAgMTk4LCAxNTQsIDQ0LCAgMTcyLCAxMzMsIDM2LCAgMTQ3LCAxMTMsIDI2LAorICAgIDEyMywgOTQsICAxNCwgIDk4LCAgNzQsICAwLCAgIDY4LCAgNDksICAwLCAgIDI2LCAgMTAsICAwLCAgIDI1NCwgMTk0LCAxNSwKKyAgICAyMjUsIDE3MiwgMTIsICAxOTgsIDE1MywgNywgICAxNzIsIDEzMiwgMywgICAxNDYsIDExMywgMCwgICAxMjMsIDkzLCAgMCwKKyAgICA5OCwgIDczLCAgMCwgICA2OCwgIDQ5LCAgMCwgICAyNiwgIDksICAgMCwgICAyNDYsIDE3OCwgMjA5LCAyMTgsIDE1OSwgMTg2LAorICAgIDE5NCwgMTQwLCAxNjYsIDE2OCwgMTIyLCAxNDUsIDE0NCwgMTA0LCAxMjUsIDEyMSwgODUsICAxMDMsIDk3LCAgNjUsICA4MSwKKyAgICA2OSwgIDQxLCAgNTUsICAzNCwgIDAsICAgMTIsICAyNDgsIDE3NiwgMTg2LCAyMTksIDE1NywgMTY2LCAxOTUsIDEzOSwgMTQ5LAorICAgIDE2OCwgMTIxLCAxMzAsIDE0NCwgMTAzLCAxMTEsIDEyMSwgODUsICA5MSwgIDk3LCAgNjUsICA3MSwgIDY5LCAgNDEsICA0NiwKKyAgICAzNCwgIDAsICAgNCwgICAyNDksIDE3NSwgMTY4LCAyMjAsIDE1NiwgMTUwLCAxOTYsIDEzOSwgMTM1LCAxNjksIDEyMSwgMTE2LAorICAgIDE0NCwgMTAzLCAxMDAsIDEyMiwgODQsICA4MywgIDk4LCAgNjUsICA2MywgIDcwLCAgNDEsICAzOSwgIDMzLCAgMCwgICAwLAorICAgIDI0OSwgMTc1LCAxNDgsIDIyMCwgMTU1LCAxMzMsIDE5NiwgMTM4LCAxMTksIDE2OSwgMTIwLCAxMDMsIDE0NSwgMTAxLCA4NywKKyAgICAxMjEsIDgzLCAgNzEsICA5NywgIDY1LCAgNTQsICA2OSwgIDQxLCAgMzEsICAzMiwgIDAsICAgMCwgICAyNDksIDE3MywgMTI4LAorICAgIDIyMiwgMTU0LCAxMTUsIDE5NSwgMTM3LCAxMDIsIDE3MCwgMTE5LCA4OCwgIDE0NSwgMTAxLCA3NCwgIDEyMiwgODMsICA1OSwKKyAgICA5NywgIDY0LCAgNDMsICA2OCwgIDQwLCAgMjAsICAzMCwgIDAsICAgMCwgICAyNTAsIDE3MiwgMTA4LCAyMjEsIDE1NCwgOTgsCisgICAgMTk1LCAxMzYsIDg2LCAgMTcwLCAxMTgsIDczLCAgMTQ1LCAxMDAsIDYxLCAgMTIyLCA4MiwgIDQ4LCAgOTcsICA2MywgIDMyLAorICAgIDY5LCAgNDAsICAxMSwgIDI4LCAgMCwgICAwLCAgIDI1MCwgMTcxLCA4NSwgIDIyMSwgMTUzLCA3NiwgIDE5NiwgMTM2LCA2NywKKyAgICAxNzAsIDExNywgNTYsICAxNDUsIDk5LCAgNDQsICAxMjEsIDgyLCAgMzMsICA5NywgIDYzLCAgMTcsICA2OCwgIDQwLCAgMCwKKyAgICAyOCwgIDAsICAgMCwgICAyNTEsIDE3MSwgNTgsICAyMjIsIDE1MiwgNTAsICAxOTcsIDEzNSwgNDMsICAxNjksIDExNywgMzQsCisgICAgMTQ2LCA5OSwgIDI1LCAgMTIxLCA4MSwgIDEwLCAgOTYsICA2MywgIDAsICAgNjgsICA0MCwgIDAsICAgMjcsICAwLCAgIDAsCisgICAgMjUwLCAxNzAsIDI2LCAgMjIyLCAxNTEsIDE5LCAgMTk2LCAxMzQsIDEzLCAgMTY5LCAxMTYsIDQsICAgMTQ1LCA5OSwgIDAsCisgICAgMTIyLCA4MSwgIDAsICAgOTcsICA2MywgIDAsICAgNjcsICA0MCwgIDAsICAgMjYsICAwLCAgIDAsICAgMjQ0LCAxNTMsIDE5NCwKKyAgICAyMTUsIDEzNiwgMTczLCAxOTIsIDEyMSwgMTU1LCAxNjcsIDEwNCwgMTM1LCAxNDMsIDg5LCAgMTE1LCAxMjEsIDcyLCAgOTYsCisgICAgOTcsICA1NCwgIDc1LCAgNzAsICAzMSwgIDQ5LCAgMzQsICAwLCAgIDYsICAgMjQ1LCAxNTMsIDE3MywgMjE2LCAxMzYsIDE1NSwKKyAgICAxOTIsIDEyMCwgMTM4LCAxNjcsIDEwNCwgMTIxLCAxNDQsIDg4LCAgMTAzLCAxMjEsIDcxLCAgODUsICA5NywgIDU0LCAgNjYsCisgICAgNjksICAzMSwgIDQyLCAgMzQsICAwLCAgIDAsICAgMjQ2LCAxNTIsIDE1NywgMjE3LCAxMzUsIDE0MCwgMTkzLCAxMjAsIDEyNiwKKyAgICAxNjcsIDEwMywgMTA5LCAxNDMsIDg4LCAgOTIsICAxMjEsIDcyLCAgNzYsICA5NywgIDU0LCAgNTgsICA2OSwgIDMxLCAgMzUsCisgICAgMzMsICAwLCAgIDAsICAgMjQ1LCAxNTAsIDEzOSwgMjE4LCAxMzQsIDEyNSwgMTkzLCAxMTksIDExMSwgMTY3LCAxMDMsIDk2LAorICAgIDE0NCwgODcsICA4MCwgIDEyMSwgNzEsICA2NiwgIDk2LCAgNTMsICA0OSwgIDY4LCAgMzEsICAyNiwgIDMyLCAgMCwgICAwLAorICAgIDI0NiwgMTUxLCAxMjIsIDIxOCwgMTMzLCAxMDgsIDE5NCwgMTE4LCA5NiwgIDE2OCwgMTAyLCA4MSwgIDE0NCwgODYsICA2OSwKKyAgICAxMjAsIDcxLCAgNTUsICA5NSwgIDUzLCAgMzksICA2OCwgIDMwLCAgMTcsICAzMSwgIDAsICAgMCwgICAyNDgsIDE1MCwgMTAzLAorICAgIDIxOCwgMTMzLCA5MSwgIDE5MywgMTE4LCA4MSwgIDE2OCwgMTAyLCA2OSwgIDE0MywgODYsICA1NiwgIDEyMCwgNzAsICA0MywKKyAgICA5NiwgIDUzLCAgMjgsICA2OCwgIDMxLCAgNiwgICAyOSwgIDAsICAgMCwgICAyNDcsIDE0OSwgODEsICAyMTgsIDEzMiwgNzIsCisgICAgMTk0LCAxMTcsIDYyLCAgMTY4LCAxMDEsIDUyLCAgMTQ0LCA4NiwgIDQyLCAgMTIxLCA3MCwgIDI5LCAgOTYsICA1MiwgIDEzLAorICAgIDY4LCAgMzAsICAwLCAgIDI4LCAgMCwgICAwLCAgIDI0NywgMTQ4LCA1NSwgIDIxOSwgMTMxLCA1MCwgIDE5NCwgMTE3LCA0MywKKyAgICAxNjcsIDEwMSwgMzIsICAxNDQsIDg1LCAgMjIsICAxMjAsIDY5LCAgOCwgICA5NiwgIDUyLCAgMCwgICA2NywgIDMwLCAgMCwKKyAgICAyNywgIDAsICAgMCwgICAyNDcsIDE0NywgMjksICAyMTgsIDEzMSwgMjQsICAxOTQsIDExNiwgMjAsICAxNjgsIDEwMCwgMTEsCisgICAgMTQ0LCA4NSwgIDAsICAgMTIwLCA2OSwgIDAsICAgOTYsICA1MiwgIDAsICAgNjcsICAzMCwgIDAsICAgMjYsICAwLCAgIDAsCisgICAgMjQyLCAxMzAsIDE3OSwgMjE0LCAxMTQsIDE2MCwgMTkwLCAxMDEsIDE0MywgMTY2LCA4NywgIDEyNSwgMTQzLCA3MiwgIDEwNywKKyAgICAxMjAsIDU4LCAgODgsICA5NiwgIDQyLCAgNjgsICA2OSwgIDE3LCAgNDQsICAzNSwgIDAsICAgMCwgICAyNDMsIDEyOSwgMTYxLAorICAgIDIxNSwgMTE0LCAxNDMsIDE5MSwgMTAxLCAxMjgsIDE2NiwgODcsICAxMTMsIDE0MywgNzMsICA5NiwgIDEyMCwgNTgsICA3OSwKKyAgICA5NiwgIDQxLCAgNjAsICA2OSwgIDE4LCAgMzcsICAzMywgIDAsICAgMCwgICAyNDMsIDEyOSwgMTQ2LCAyMTYsIDExNCwgMTMwLAorICAgIDE5MiwgMTAxLCAxMTcsIDE2NiwgODcsICAxMDEsIDE0MywgNzIsICA4NiwgIDEyMSwgNTgsICA2OSwgIDk2LCAgNDIsICA1MiwKKyAgICA2OSwgIDE4LCAgMjksICAzMSwgIDAsICAgMCwgICAyNDMsIDEyOCwgMTMwLCAyMTYsIDExNCwgMTE1LCAxOTEsIDEwMSwgMTAyLAorICAgIDE2NSwgODYsICA4OCwgIDE0MiwgNzIsICA3NSwgIDEyMCwgNTgsICA2MCwgIDk1LCAgNDIsICA0MywgIDY4LCAgMTksICAyMSwKKyAgICAzMCwgIDAsICAgMCwgICAyNDQsIDEyNywgMTEyLCAyMTcsIDExMywgMTAxLCAxOTIsIDk5LCAgODksICAxNjYsIDg1LCAgNzUsCisgICAgMTQyLCA3MiwgIDYzLCAgMTE5LCA1NywgIDUwLCAgOTYsICA0MSwgIDM1LCAgNjgsICAxOSwgIDEzLCAgMzAsICAwLCAgIDAsCisgICAgMjQ0LCAxMjcsIDk2LCAgMjE2LCAxMTIsIDg2LCAgMTkxLCA5OSwgIDc1LCAgMTY2LCA4NiwgIDY0LCAgMTQzLCA3MiwgIDUyLAorICAgIDEyMCwgNTcsICA0MCwgIDk1LCAgNDEsICAyNCwgIDY3LCAgMjAsICAxLCAgIDI5LCAgMCwgICAwLCAgIDI0NSwgMTI2LCA3NywKKyAgICAyMTYsIDExMywgNjgsICAxOTEsIDEwMCwgNTksICAxNjYsIDg1LCAgNDksICAxNDIsIDcxLCAgMzgsICAxMTksIDU3LCAgMjYsCisgICAgOTUsICA0MSwgIDEwLCAgNjcsICAyMCwgIDAsICAgMjgsICAwLCAgIDAsICAgMjQ0LCAxMjYsIDU1LCAgMjE2LCAxMTIsIDQ4LAorICAgIDE5MSwgOTksICA0MCwgIDE2NiwgODUsICAzMSwgIDE0MywgNzEsICAyMCwgIDExOSwgNTcsICA2LCAgIDk1LCAgNDIsICAwLAorICAgIDY3LCAgMjAsICAwLCAgIDI4LCAgMCwgICAwLCAgIDI0NSwgMTI2LCAzMywgIDIxNywgMTEyLCAyNiwgIDE5MiwgOTksICAyMiwKKyAgICAxNjYsIDg0LCAgMTEsICAxNDIsIDcwLCAgMCwgICAxMTksIDU3LCAgMCwgICA5NSwgIDQxLCAgMCwgICA2NiwgIDIwLCAgMCwKKyAgICAyNywgIDAsICAgMCwgICAyNDEsIDEwMiwgMTY3LCAyMTMsIDkwLCAgMTQ5LCAxODksIDc5LCAgMTMzLCAxNjUsIDY2LCAgMTE1LAorICAgIDE0MSwgNTQsICA5OCwgIDExOSwgNDEsICA4MSwgIDk2LCAgMjUsICA2MywgIDY5LCAgMCwgICAzOCwgIDMwLCAgMCwgICAwLAorICAgIDI0MSwgMTAyLCAxNDksIDIxMywgOTAsICAxMzMsIDE4OSwgNzksICAxMTksIDE2NSwgNjYsICAxMDMsIDE0MiwgNTUsICA4OCwKKyAgICAxMTksIDQxLCAgNzEsICA5NiwgIDI1LCAgNTMsICA2OSwgIDAsICAgMzEsICAyOCwgIDAsICAgMCwgICAyNDEsIDEwMiwgMTM1LAorICAgIDIxNCwgOTAsICAxMjEsIDE5MCwgNzksICAxMDgsIDE2NSwgNjYsICA5MiwgIDE0MSwgNTUsICA3OCwgIDExOSwgNDIsICA2MywKKyAgICA5NiwgIDI2LCAgNDYsICA2OSwgIDAsICAgMjQsICAyOCwgIDAsICAgMCwgICAyNDEsIDEwMSwgMTIwLCAyMTQsIDkwLCAgMTA3LAorICAgIDE4OSwgNzksICA5NSwgIDE2NSwgNjcsICA4MywgIDE0MSwgNTQsICA2OCwgIDExOCwgNDEsICA1NCwgIDk1LCAgMjcsICAzOSwKKyAgICA2OCwgIDAsICAgMTYsICAyNywgIDAsICAgMCwgICAyNDEsIDEwMiwgMTA2LCAyMTMsIDkwLCAgOTMsICAxODksIDc4LCAgODIsCisgICAgMTY0LCA2NywgIDcwLCAgMTQxLCA1NSwgIDU4LCAgMTE4LCA0MiwgIDQ1LCAgOTQsICAyNywgIDI5LCAgNjcsICAyLCAgIDYsCisgICAgMjcsICAwLCAgIDAsICAgMjQyLCAxMDEsIDkwLCAgMjE0LCA4OSwgIDc5LCAgMTkwLCA3OSwgIDY5LCAgMTY2LCA2NywgIDU5LAorICAgIDE0MSwgNTUsICA0NywgIDExOCwgNDEsICAzNSwgIDk1LCAgMjcsICAxOSwgIDY3LCAgMywgICAwLCAgIDI2LCAgMCwgICAwLAorICAgIDI0MiwgMTAyLCA3MiwgIDIxMywgODksICA2MywgIDE5MSwgNzksICA1NiwgIDE2NCwgNjcsICA0NSwgIDE0MSwgNTUsICAzNCwKKyAgICAxMTgsIDQyLCAgMjIsICA5NCwgIDI4LCAgNiwgICA2NywgIDMsICAgMCwgICAyNiwgIDAsICAgMCwgICAyNDIsIDEwMCwgNTEsCisgICAgMjE0LCA4OSwgIDQ1LCAgMTkwLCA3OCwgIDM4LCAgMTY0LCA2NywgIDMwLCAgMTQxLCA1NSwgIDE4LCAgMTE4LCA0MiwgIDMsCisgICAgOTUsICAyOCwgIDAsICAgNjYsICA0LCAgIDAsICAgMjYsICAwLCAgIDAsICAgMjQzLCAxMDAsIDMzLCAgMjE0LCA5MCwgIDI3LAorICAgIDE5MCwgNzgsICAyMiwgIDE2NSwgNjcsICAxMywgIDE0MSwgNTUsICAwLCAgIDExOCwgNDMsICAwLCAgIDk0LCAgMjksICAwLAorICAgIDY2LCAgNSwgICAwLCAgIDI2LCAgMCwgICAwLCAgIDIzNywgNjksICAxNTMsIDIxMSwgNTgsICAxMzUsIDE4NywgNTEsICAxMjEsCisgICAgMTYzLCA0MSwgIDEwNSwgMTQxLCAyOCwgIDkwLCAgMTE4LCAxNSwgIDczLCAgOTYsICAwLCAgIDU2LCAgNjgsICAwLCAgIDMzLAorICAgIDI1LCAgMCwgICAwLCAgIDIzOSwgNjcsICAxMzcsIDIxMiwgNjAsICAxMjMsIDE4OSwgNTAsICAxMTAsIDE2MywgNDEsICA5NCwKKyAgICAxNDEsIDI5LCAgNzksICAxMTgsIDE3LCAgNjUsICA5NSwgIDAsICAgNDgsICA2OSwgIDAsICAgMjYsICAyNSwgIDAsICAgMCwKKyAgICAyNDAsIDY5LCAgMTI0LCAyMTEsIDYwLCAgMTExLCAxODgsIDUwLCAgOTgsICAxNjMsIDQyLCAgODUsICAxNDEsIDMxLCAgNzIsCisgICAgMTE4LCAxOCwgIDU3LCAgOTQsICAwLCAgIDQxLCAgNjgsICAwLCAgIDE5LCAgMjUsICAwLCAgIDAsICAgMjQwLCA3MCwgIDExMiwKKyAgICAyMTIsIDYxLCAgOTksICAxODgsIDUyLCAgODcsICAxNjMsIDQxLCAgNzQsICAxNDAsIDMxLCAgNjIsICAxMTgsIDIwLCAgNDgsCisgICAgOTQsICAyLCAgIDMyLCAgNjgsICAwLCAgIDExLCAgMjQsICAwLCAgIDAsICAgMjM5LCA3MCwgIDk4LCAgMjEyLCA2MiwgIDg2LAorICAgIDE4OCwgNTMsICA3NywgIDE2NCwgNDIsICA2NCwgIDE0MCwgMzIsICA1MiwgIDExOCwgMjAsICA0MCwgIDk0LCAgMywgICAyNCwKKyAgICA2NywgIDAsICAgMywgICAyMywgIDAsICAgMCwgICAyMzksIDcxLCAgODUsICAyMTIsIDYxLCAgNzQsICAxODcsIDUzLCAgNjUsCisgICAgMTYzLCA0NCwgIDU0LCAgMTQwLCAzNCwgIDQzLCAgMTE4LCAyMiwgIDMwLCAgOTUsICAzLCAgIDE0LCAgNjcsICAwLCAgIDAsCisgICAgMjMsICAwLCAgIDAsICAgMjM5LCA3MCwgIDY3LCAgMjEyLCA2MiwgIDU5LCAgMTg4LCA1MywgIDUxLCAgMTYzLCA0NSwgIDQyLAorICAgIDE0MSwgMzQsICAzMSwgIDExNywgMjIsICAxNywgIDk0LCAgNSwgICAyLCAgIDY2LCAgMCwgICAwLCAgIDIzLCAgMCwgICAwLAorICAgIDIzOSwgNzEsICA1MCwgIDIxMywgNjIsICA0MywgIDE4OCwgNTQsICAzNywgIDE2NCwgNDUsICAyOCwgIDEzOSwgMzQsICAxNiwKKyAgICAxMTcsIDIyLCAgMiwgICA5NCwgIDcsICAgMCwgICA2NSwgIDAsICAgMCwgICAyMywgIDAsICAgMCwgICAyNDAsIDcxLCAgMzQsCisgICAgMjEyLCA2MywgIDI5LCAgMTg5LCA1NCwgIDI0LCAgMTYzLCA0NiwgIDE1LCAgMTM5LCAzNiwgIDIsICAgMTE3LCAyNSwgIDAsCisgICAgOTQsICA4LCAgIDAsICAgNjYsICAwLCAgIDAsICAgMjMsICAwLCAgIDAsICAgMjM3LCAwLCAgIDE0MCwgMjA5LCAwLCAgIDEyNCwKKyAgICAxODYsIDAsICAgMTEyLCAxNjIsIDAsICAgOTcsICAxNDEsIDAsICAgODIsICAxMTgsIDAsICAgNjcsICA5NSwgIDAsICAgNDksCisgICAgNjgsICAwLCAgIDI3LCAgMjAsICAwLCAgIDAsICAgMjM3LCAwLCAgIDEyNiwgMjEwLCAwLCAgIDExMywgMTg3LCAwLCAgIDk5LAorICAgIDE2MywgMCwgICA4NiwgIDEzOSwgMCwgICA3MiwgIDExOCwgMCwgICA1OCwgIDk1LCAgMCwgICA0MiwgIDY3LCAgMCwgICAyMCwKKyAgICAyMCwgIDAsICAgMCwgICAyMzcsIDEsICAgMTE0LCAyMDksIDEsICAgMTAyLCAxODcsIDAsICAgOTAsICAxNjMsIDAsICAgNzgsCisgICAgMTM5LCAwLCAgIDY0LCAgMTE4LCAwLCAgIDUwLCAgOTUsICAwLCAgIDM1LCAgNjcsICAwLCAgIDEzLCAgMjAsICAwLCAgIDAsCisgICAgMjM2LCAxNiwgIDEwMiwgMjA5LCA3LCAgIDkxLCAgMTg2LCAwLCAgIDgwLCAgMTYyLCAwLCAgIDY4LCAgMTM5LCAwLCAgIDU2LAorICAgIDExNywgMCwgICA0MywgIDk0LCAgMCwgICAyNywgIDY3LCAgMCwgICA2LCAgIDIwLCAgMCwgICAwLCAgIDIzOCwgMTUsICA4OSwKKyAgICAyMDksIDEzLCAgNzksICAxODYsIDYsICAgNjksICAxNjIsIDAsICAgNTgsICAxMzksIDAsICAgNDcsICAxMTcsIDAsICAgMzQsCisgICAgOTMsICAwLCAgIDIwLCAgNjYsICAwLCAgIDIsICAgMjAsICAwLCAgIDAsICAgMjM3LCAyMCwgIDc4LCAgMjEwLCAxMiwgIDY4LAorICAgIDE4NywgNCwgICA1OSwgIDE2MywgMCwgICA0OSwgIDEzOSwgMCwgICAzOCwgIDExNiwgMCwgICAyNiwgIDk0LCAgMCwgICAxMSwKKyAgICA2NiwgIDAsICAgMCwgICAyMCwgIDAsICAgMCwgICAyMzcsIDI1LCAgNjQsICAyMTAsIDE4LCAgNTYsICAxODYsIDExLCAgNDgsCisgICAgMTYyLCA0LCAgIDM5LCAgMTM4LCAwLCAgIDI3LCAgMTE3LCAwLCAgIDE0LCAgOTMsICAwLCAgIDAsICAgNjYsICAwLCAgIDAsCisgICAgMjAsICAwLCAgIDAsICAgMjM4LCAyNSwgIDQ4LCAgMjEwLCAyMiwgIDQzLCAgMTg2LCAxNSwgIDM1LCAgMTYyLCA4LCAgIDI2LAorICAgIDE0MCwgMCwgICAxNCwgIDExNywgMCwgICAwLCAgIDkzLCAgMCwgICAwLCAgIDY1LCAgMCwgICAwLCAgIDIwLCAgMCwgICAwLAorICAgIDIzOCwgMjgsICAzNSwgIDIxMCwgMjEsICAzMCwgIDE4NywgMTUsICAyNCwgIDE2MiwgOCwgICAxNiwgIDEzOSwgMSwgICAyLAorICAgIDExNywgMCwgICAwLCAgIDkzLCAgMCwgICAwLCAgIDY1LCAgMCwgICAwLCAgIDIyLCAgMCwgICAwLCAgIDIxOSwgMjQyLCAyNTIsCisgICAgMTk1LCAyMTQsIDIyNSwgMTcyLCAxOTEsIDIwMSwgMTQ4LCAxNjUsIDE3NSwgMTI3LCAxNDIsIDE1MCwgMTA2LCAxMTksIDEyNiwKKyAgICA4NCwgIDk1LCAgMTAxLCA1OCwgIDY2LCAgNzIsICAyNCwgIDI3LCAgMzIsICAyMjIsIDIzOSwgMjI2LCAxOTYsIDIxMywgMjAyLAorICAgIDE3MywgMTg5LCAxODAsIDE1MCwgMTY1LCAxNTgsIDEyOSwgMTQxLCAxMzUsIDEwNywgMTE4LCAxMTMsIDg1LCAgOTQsICA5MCwKKyAgICA1OCwgIDY2LCAgNjMsICAyMSwgIDI2LCAgMjQsICAyMjMsIDIzNywgMjAzLCAxOTgsIDIxMSwgMTgyLCAxNzUsIDE4OCwgMTYzLAorICAgIDE1MiwgMTY0LCAxNDEsIDEyOSwgMTQwLCAxMjEsIDEwNywgMTE3LCAxMDEsIDg1LCAgOTMsICA4MCwgIDU4LCAgNjQsICA1NCwKKyAgICAyMSwgIDI2LCAgMTgsICAyMjYsIDIzNiwgMTc5LCAyMDEsIDIxMCwgMTYwLCAxNzcsIDE4NywgMTQzLCAxNTMsIDE2MiwgMTI1LAorICAgIDEzMCwgMTM5LCAxMDYsIDEwOCwgMTE2LCA4OSwgIDg1LCAgOTIsICA2OSwgIDU4LCAgNjQsICA0NSwgIDIwLCAgMjUsICA4LAorICAgIDIyNywgMjM0LCAxNTMsIDIwMSwgMjA4LCAxMzksIDE3OCwgMTg1LCAxMjQsIDE1NCwgMTYxLCAxMDcsIDEzMSwgMTM4LCA5MSwKKyAgICAxMDgsIDExNSwgNzUsICA4NSwgIDkxLCAgNTgsICA1OCwgIDYzLCAgMzUsICAxNywgIDI1LCAgMCwgICAyMjksIDIzMywgMTMwLAorICAgIDIwMywgMjA3LCAxMTYsIDE3OCwgMTg0LCAxMDQsIDE1NCwgMTYwLCA5MCwgIDEzMSwgMTM3LCA3NiwgIDEwOSwgMTE0LCA2MiwKKyAgICA4NSwgIDkwLCAgNDYsICA1OCwgIDYzLCAgMjUsICAxNiwgIDI0LCAgMCwgICAyMzAsIDIzMSwgMTAwLCAyMDIsIDIwNSwgOTAsCisgICAgMTc5LCAxODMsIDgwLCAgMTU0LCAxNTksIDY5LCAgMTMxLCAxMzYsIDU3LCAgMTA5LCAxMTMsIDQ2LCAgODYsICA5MCwgIDMyLAorICAgIDU4LCAgNjMsICAxMCwgIDE0LCAgMjQsICAwLCAgIDIzMCwgMjMwLCA2NSwgIDIwNCwgMjA0LCA1OCwgIDE4MCwgMTgyLCA1MiwKKyAgICAxNTUsIDE1NywgNDQsICAxMzIsIDEzNSwgMzUsICAxMTAsIDExMywgMjQsICA4NiwgIDg5LCAgOSwgICA1NywgIDYyLCAgMCwKKyAgICAxMSwgIDI0LCAgMCwgICAyMzIsIDIzMCwgMTksICAyMDQsIDIwNCwgMTksICAxODAsIDE4MSwgMTcsICAxNTUsIDE1NywgMTAsCisgICAgMTMxLCAxMzQsIDIsICAgMTA5LCAxMTIsIDAsICAgODUsICA4OSwgIDAsICAgNTcsICA2MiwgIDAsICAgMTAsICAyMywgIDAsCisgICAgMjE4LCAyMTYsIDIzNiwgMTk0LCAxOTIsIDIxMSwgMTcyLCAxNzEsIDE4OCwgMTQ5LCAxNDksIDE2NCwgMTI4LCAxMjcsIDE0MSwKKyAgICAxMDYsIDEwNiwgMTE5LCA4NCwgIDg0LCAgOTQsICA1OSwgIDU3LCAgNjYsICAyNSwgIDE4LCAgMjYsICAyMjEsIDIxNCwgMjExLAorICAgIDE5NiwgMTkxLCAxOTAsIDE3NCwgMTcwLCAxNzAsIDE1MCwgMTQ4LCAxNDgsIDEyOCwgMTI2LCAxMjcsIDEwNywgMTA1LCAxMDYsCisgICAgODUsICA4MywgIDg0LCAgNTksICA1NiwgIDU4LCAgMjMsICAxNywgIDE4LCAgMjIyLCAyMTMsIDE5MCwgMTk3LCAxODksIDE3MCwKKyAgICAxNzUsIDE2OSwgMTUzLCAxNTEsIDE0NywgMTMzLCAxMjksIDEyNiwgMTEzLCAxMDgsIDEwNSwgOTQsICA4NSwgIDgyLCAgNzQsCisgICAgNTksICA1NiwgIDQ5LCAgMjIsICAxNywgIDExLCAgMjI0LCAyMTEsIDE2OCwgMTk5LCAxODgsIDE1MSwgMTc1LCAxNjgsIDEzNSwKKyAgICAxNTIsIDE0NiwgMTE3LCAxMjksIDEyNCwgOTksICAxMDcsIDEwMywgODIsICA4NCwgIDgyLCAgNjQsICA1OSwgIDU1LCAgNDEsCisgICAgMjEsICAxNywgIDEsICAgMjI0LCAyMTAsIDE0NSwgMTk5LCAxODcsIDEzMCwgMTc2LCAxNjYsIDExNywgMTUyLCAxNDUsIDEwMSwKKyAgICAxMjksIDEyMywgODYsICAxMDcsIDEwMywgNzAsICA4NSwgIDgxLCAgNTMsICA1OCwgIDU1LCAgMzEsICAxOSwgIDE3LCAgMCwKKyAgICAyMjcsIDIwOCwgMTIzLCAyMDAsIDE4NiwgMTEwLCAxNzcsIDE2NSwgOTgsICAxNTMsIDE0MywgODQsICAxMzAsIDEyMiwgNzAsCisgICAgMTA4LCAxMDIsIDU3LCAgODUsICA4MCwgIDQxLCAgNTgsICA1NCwgIDIwLCAgMTgsICAxNiwgIDAsICAgMjI3LCAyMDgsIDk3LAorICAgIDIwMiwgMTg1LCA4NiwgIDE3NywgMTY0LCA3NywgIDE1MywgMTQyLCA2NSwgIDEzMCwgMTIyLCA1NCwgIDEwOCwgMTAxLCA0MiwKKyAgICA4NSwgIDgwLCAgMjcsICA1OCwgIDU0LCAgNywgICAxNiwgIDE2LCAgMCwgICAyMjgsIDIwNiwgNjYsICAyMDIsIDE4NCwgNTgsCisgICAgMTc4LCAxNjMsIDUwLCAgMTU0LCAxNDEsIDQyLCAgMTMxLCAxMjEsIDMzLCAgMTA5LCAxMDEsIDIxLCAgODYsICA3OSwgIDUsCisgICAgNTgsICA1NCwgIDAsICAgMTMsICAxNiwgIDAsICAgMjI4LCAyMDYsIDI5LCAgMjAyLCAxODMsIDI1LCAgMTc4LCAxNjMsIDIwLAorICAgIDE1NCwgMTQxLCAxNSwgIDEzMSwgMTIxLCA1LCAgIDEwOCwgMTAwLCAwLCAgIDg1LCAgNzksICAwLCAgIDU4LCAgNTMsICAwLAorICAgIDEzLCAgMTYsICAwLCAgIDIxNywgMTkzLCAyMjEsIDE5MywgMTcyLCAxOTgsIDE3MiwgMTUzLCAxNzgsIDE0OSwgMTMzLCAxNTQsCisgICAgMTI4LCAxMTQsIDEzMiwgMTA3LCA5NCwgIDExMSwgODUsICA3NCwgIDg5LCAgNTksICA0OSwgIDYxLCAgMjUsICA4LCAgIDIyLAorICAgIDIxOSwgMTkxLCAxOTgsIDE5NSwgMTcxLCAxNzgsIDE3MywgMTUzLCAxNTksIDE0OSwgMTMyLCAxMzksIDEyOCwgMTEzLCAxMTksCisgICAgMTA3LCA5NCwgIDEwMCwgODUsICA3MywgIDc5LCAgNTksICA0OCwgIDUyLCAgMjUsICA3LCAgIDE0LCAgMjIxLCAxOTEsIDE4MCwKKyAgICAxOTYsIDE3MCwgMTYwLCAxNzQsIDE1MiwgMTQ0LCAxNTAsIDEzMiwgMTI1LCAxMjksIDExMywgMTA3LCAxMDcsIDkzLCAgODksCisgICAgODUsICA3MywgIDY5LCAgNTksICA0OCwgIDQ1LCAgMjMsICA3LCAgIDQsICAgMjIyLCAxODksIDE1OSwgMTk3LCAxNjksIDE0MiwKKyAgICAxNzQsIDE1MSwgMTI3LCAxNTEsIDEzMSwgMTEwLCAxMjksIDExMiwgOTQsICAxMDgsIDkzLCAgNzgsICA4NSwgIDcyLCAgNjAsCisgICAgNTgsICA0NywgIDM3LCAgMjIsICA3LCAgIDAsICAgMjIzLCAxODgsIDEzOCwgMTk3LCAxNjgsIDEyMywgMTc1LCAxNTAsIDEwOSwKKyAgICAxNTEsIDEzMCwgOTUsICAxMzAsIDExMSwgODEsICAxMDgsIDkyLCAgNjUsICA4NSwgIDcyLCAgNDksICA1OSwgIDQ3LCAgMjcsCisgICAgMjEsICA3LCAgIDAsICAgMjI0LCAxODcsIDExOCwgMTk4LCAxNjcsIDEwNSwgMTc2LCAxNDksIDkzLCAgMTUyLCAxMjksIDc5LAorICAgIDEzMCwgMTEwLCA2OCwgIDEwOCwgOTEsICA1NCwgIDg1LCAgNzEsICAzOCwgIDU5LCAgNDcsICAxNywgIDE4LCAgNywgICAwLAorICAgIDIyNCwgMTg3LCA5MywgIDE5OSwgMTY2LCA4MywgIDE3NiwgMTQ4LCA3MywgIDE1MiwgMTI4LCA2MiwgIDEyOSwgMTA5LCA1MSwKKyAgICAxMDgsIDkwLCAgMzksICA4NSwgIDcxLCAgMjUsICA1OCwgIDQ2LCAgMywgICAxNiwgIDgsICAgMCwgICAyMjYsIDE4NiwgNjQsCisgICAgMjAwLCAxNjUsIDU3LCAgMTc3LCAxNDcsIDUwLCAgMTUzLCAxMjcsIDQwLCAgMTMwLCAxMDgsIDMxLCAgMTA4LCA5MCwgIDE5LAorICAgIDg1LCAgNzAsICAzLCAgIDU4LCAgNDYsICAwLCAgIDE2LCAgOCwgICAwLCAgIDIyNywgMTg1LCAzNSwgIDIwMCwgMTY1LCAzMCwKKyAgICAxNzYsIDE0NiwgMjUsICAxNTIsIDEyNywgMTgsICAxMzAsIDEwOCwgNywgICAxMDgsIDg5LCAgMCwgICA4NSwgIDcwLCAgMCwKKyAgICA1NywgIDQ2LCAgMCwgICAxNCwgIDgsICAgMCwgICAyMTYsIDE2OSwgMjA1LCAxOTIsIDE1MCwgMTg0LCAxNzEsIDEzNCwgMTY0LAorICAgIDE0OSwgMTE2LCAxNDQsIDEyOCwgOTksICAxMjQsIDEwNywgODEsICAxMDMsIDg1LCAgNjMsICA4MSwgIDYwLCAgMzksICA1NSwKKyAgICAyNiwgIDAsICAgMTUsICAyMTcsIDE2OCwgMTg2LCAxOTMsIDE1MCwgMTY1LCAxNzIsIDEzNCwgMTQ5LCAxNTAsIDExNiwgMTMwLAorICAgIDEyOCwgOTksICAxMTEsIDEwNywgODEsICA5MiwgIDg1LCAgNjIsICA3MiwgIDU5LCAgMzksICA0NywgIDI1LCAgMCwgICA2LAorICAgIDIxOSwgMTY4LCAxNjgsIDE5NCwgMTQ5LCAxNTAsIDE3MywgMTMzLCAxMzUsIDE1MCwgMTE2LCAxMTcsIDEyOCwgOTgsICA5OSwKKyAgICAxMDcsIDgwLCAgODIsICA4NiwgIDYyLCAgNjMsICA1OSwgIDM4LCAgMzksICAyNCwgIDAsICAgMCwgICAyMTksIDE2NiwgMTQ4LAorICAgIDE5NSwgMTQ5LCAxMzMsIDE3MywgMTMzLCAxMTksIDE1MCwgMTE1LCAxMDMsIDEyOCwgOTgsICA4OCwgIDEwNywgODAsICA3MiwKKyAgICA4NSwgIDYxLCAgNTQsICA1OSwgIDM4LCAgMzIsICAyMywgIDAsICAgMCwgICAyMjAsIDE2NiwgMTI5LCAxOTYsIDE0OCwgMTE2LAorICAgIDE3NCwgMTMyLCAxMDMsIDE1MSwgMTE0LCA4OSwgIDEyOSwgOTcsICA3NSwgIDEwNywgNzksICA2MCwgIDg1LCAgNjEsICA0NCwKKyAgICA1OSwgIDM4LCAgMjIsICAyMSwgIDAsICAgMCwgICAyMjIsIDE2NCwgMTEwLCAxOTcsIDE0NywgOTksICAxNzUsIDEzMSwgODcsCisgICAgMTUxLCAxMTMsIDc1LCAgMTI5LCA5NiwgIDYzLCAgMTA3LCA3OSwgIDQ5LCAgODUsICA2MSwgIDMzLCAgNTgsICAzOCwgIDEyLAorICAgIDE5LCAgMCwgICAwLCAgIDIyMiwgMTY0LCA4OCwgIDE5NywgMTQ2LCA3OSwgIDE3NCwgMTMwLCA2OSwgIDE1MSwgMTEzLCA1OCwKKyAgICAxMjksIDk1LCAgNDcsICAxMDcsIDc4LCAgMzUsICA4NSwgIDYwLCAgMjAsICA1OCwgIDM4LCAgMCwgICAxOCwgIDAsICAgMCwKKyAgICAyMjMsIDE2NCwgNjMsICAxOTgsIDE0NSwgNTUsICAxNzUsIDEyOSwgNDgsICAxNTEsIDExMiwgMzksICAxMjksIDk1LCAgMjksCisgICAgMTA3LCA3OCwgIDE2LCAgODUsICA2MCwgIDEsICAgNTgsICAzOCwgIDAsICAgMTcsICAwLCAgIDAsICAgMjIzLCAxNjMsIDM2LAorICAgIDE5OCwgMTQ1LCAzMiwgIDE3NCwgMTI5LCAyNiwgIDE1MSwgMTExLCAxNywgIDEyOSwgOTUsICA3LCAgIDEwNywgNzgsICAwLAorICAgIDg0LCAgNjAsICAwLCAgIDU3LCAgMzcsICAwLCAgIDE1LCAgMCwgICAwLCAgIDIxNSwgMTQ3LCAxOTIsIDE5MSwgMTMwLCAxNzIsCisgICAgMTcwLCAxMTYsIDE1MywgMTQ4LCAxMDAsIDEzMywgMTI3LCA4NSwgIDExNSwgMTA3LCA2OSwgIDk2LCAgODUsICA1MSwgIDc1LAorICAgIDYwLCAgMjgsICA1MCwgIDI1LCAgMCwgICA4LCAgIDIxNywgMTQ2LCAxNzMsIDE5MiwgMTMwLCAxNTQsIDE3MSwgMTE1LCAxMzgsCisgICAgMTQ5LCAxMDAsIDEyMSwgMTI4LCA4NCwgIDEwMywgMTA3LCA2OCwgIDg1LCAgODUsICA1MSwgIDY2LCAgNjAsICAyOCwgIDQyLAorICAgIDI1LCAgMCwgICAwLCAgIDIxNywgMTQ1LCAxNTcsIDE5MywgMTI5LCAxNDAsIDE3MywgMTE1LCAxMjUsIDE0OSwgMTAwLCAxMDksCisgICAgMTI4LCA4NCwgIDkyLCAgMTA3LCA2OCwgIDc2LCAgODUsICA1MSwgIDU4LCAgNTksICAyOCwgIDM1LCAgMjMsICAwLCAgIDAsCisgICAgMjE4LCAxNDUsIDE0MCwgMTkzLCAxMjksIDEyNSwgMTcyLCAxMTQsIDExMCwgMTQ5LCA5OSwgIDk2LCAgMTI4LCA4MywgIDgxLAorICAgIDEwNywgNjcsICA2NSwgIDg0LCAgNTEsICA0OSwgIDU5LCAgMjksICAyNywgIDIyLCAgMCwgICAwLCAgIDIxOSwgMTQ0LCAxMjEsCisgICAgMTk0LCAxMjgsIDEwOCwgMTcyLCAxMTMsIDk2LCAgMTQ5LCA5OCwgIDgzLCAgMTI4LCA4MywgIDY5LCAgMTA3LCA2OCwgIDU1LAorICAgIDg1LCAgNTAsICA0MCwgIDU5LCAgMjgsICAxOCwgIDIwLCAgMCwgICAwLCAgIDIyMCwgMTQzLCAxMDQsIDE5NSwgMTI4LCA5MywKKyAgICAxNzMsIDExNCwgODIsICAxNTAsIDk4LCAgNjksICAxMjcsIDgyLCAgNTgsICAxMDcsIDY3LCAgNDUsICA4NSwgIDUwLCAgMzAsCisgICAgNTksICAyOCwgIDcsICAgMTksICAwLCAgIDAsICAgMjIwLCAxNDMsIDg0LCAgMTk1LCAxMjcsIDc0LCAgMTczLCAxMTMsIDY1LAorICAgIDE0OSwgOTcsICA1NSwgIDEyOCwgODIsICA0NCwgIDEwNiwgNjcsICAzMiwgIDg0LCAgNTAsICAxNiwgIDU4LCAgMjgsICAwLAorICAgIDE4LCAgMCwgICAwLCAgIDIyMSwgMTQyLCA2MiwgIDE5NiwgMTI2LCA1MywgIDE3MywgMTEyLCA0NiwgIDE1MCwgOTcsICAzNywKKyAgICAxMjgsIDgyLCAgMjYsICAxMDcsIDY2LCAgMTQsICA4NCwgIDUwLCAgMCwgICA1OCwgIDI4LCAgMCwgICAxNiwgIDAsICAgMCwKKyAgICAyMjIsIDE0MiwgMzgsICAxOTYsIDEyNiwgMzQsICAxNzQsIDExMiwgMjcsICAxNTAsIDk2LCAgMTcsICAxMjgsIDgyLCAgNiwKKyAgICAxMDYsIDY2LCAgMCwgICA4NCwgIDUwLCAgMCwgICA1NywgIDI5LCAgMCwgICAxNiwgIDAsICAgMCwgICAyMTQsIDEyMywgMTc5LAorICAgIDE5MSwgMTEwLCAxNTksIDE2OSwgOTgsICAxNDMsIDE0NywgODQsICAxMjQsIDEyNiwgNzAsICAxMDYsIDEwNywgNTUsICA4OCwKKyAgICA4NSwgIDM5LCAgNjksICA2MCwgIDE1LCAgNDUsICAyMywgIDAsICAgMiwgICAyMTYsIDEyMywgMTYxLCAxOTIsIDExMCwgMTQ0LAorICAgIDE3MCwgOTgsICAxMjksIDE0OCwgODQsICAxMTIsIDEyNywgNzAsICA5NSwgIDEwNywgNTUsICA3OSwgIDg1LCAgMzksICA2MSwKKyAgICA2MCwgIDE1LCAgMzcsICAyMCwgIDAsICAgMCwgICAyMTcsIDEyMiwgMTQ1LCAxOTIsIDExMCwgMTMwLCAxNzAsIDk3LCAgMTE2LAorICAgIDE0OSwgODQsICAxMDEsIDEyNywgNzAsICA4NSwgIDEwNiwgNTUsICA3MCwgIDg1LCAgMzksICA1MywgIDU5LCAgMTYsICAzMCwKKyAgICAxOSwgIDAsICAgMCwgICAyMTcsIDEyMywgMTMxLCAxOTIsIDEwOSwgMTE2LCAxNzEsIDk2LCAgMTAzLCAxNDksIDgzLCAgODksCisgICAgMTI3LCA3MCwgIDc1LCAgMTA2LCA1NSwgIDYwLCAgODUsICA0MCwgIDQ1LCAgNTksICAxNiwgIDIzLCAgMTcsICAwLCAgIDAsCisgICAgMjE3LCAxMjIsIDExNCwgMTkzLCAxMDksIDEwMSwgMTcyLCA5NiwgIDkxLCAgMTQ5LCA4MiwgIDc3LCAgMTI4LCA2OSwgIDY0LAorICAgIDEwNiwgNTUsICA1MCwgIDg0LCAgMzksICAzNSwgIDU5LCAgMTcsICAxNCwgIDE3LCAgMCwgICAwLCAgIDIxOCwgMTIyLCA5OCwKKyAgICAxOTQsIDEwOCwgODcsICAxNzEsIDk2LCAgNzcsICAxNDksIDgyLCAgNjUsICAxMjcsIDY5LCAgNTIsICAxMDYsIDU1LCAgNDAsCisgICAgODQsICA0MCwgIDI1LCAgNTksICAxOCwgIDMsICAgMTUsICAwLCAgIDAsICAgMjE5LCAxMjIsIDgwLCAgMTkzLCAxMDgsIDcwLAorICAgIDE3MiwgOTUsICA2MSwgIDE0OSwgODIsICA1MSwgIDEyNywgNjksICA0MCwgIDEwNiwgNTUsICAyOCwgIDg0LCAgMzksICAxMiwKKyAgICA1OCwgIDE3LCAgMCwgICAxMywgIDAsICAgMCwgICAyMTksIDEyMSwgNTksICAxOTQsIDEwOCwgNTIsICAxNzIsIDk2LCAgNDQsCisgICAgMTQ5LCA4MiwgIDM1LCAgMTI3LCA2OCwgIDI0LCAgMTA2LCA1NSwgIDExLCAgODQsICA0MCwgIDAsICAgNTcsICAxOCwgIDAsCisgICAgMTMsICAwLCAgIDAsICAgMjE5LCAxMjEsIDQwLCAgMTkzLCAxMDgsIDMzLCAgMTcyLCA5NSwgIDI2LCAgMTQ5LCA4MSwgIDE5LAorICAgIDEyOCwgNjgsICA2LCAgIDEwNiwgNTQsICAwLCAgIDg0LCAgMzksICAwLCAgIDU3LCAgMTgsICAwLCAgIDEzLCAgMCwgICAwLAorICAgIDIxMywgOTksICAxNjUsIDE4OSwgODcsICAxNDgsIDE2OSwgNzYsICAxMzIsIDE0NywgNjQsICAxMTUsIDEyNiwgNTIsICA5OCwKKyAgICAxMDYsIDM5LCAgODEsICA4NSwgIDIzLCAgNjMsICA2MCwgIDAsICAgMzksICAxNiwgIDAsICAgMCwgICAyMTQsIDk4LCAgMTQ5LAorICAgIDE5MSwgODcsICAxMzMsIDE3MCwgNzYsICAxMTksIDE0OCwgNjUsICAxMDMsIDEyNywgNTMsICA4OCwgIDEwNiwgMzksICA3MiwKKyAgICA4NSwgIDI0LCAgNTUsICA2MCwgIDAsICAgMzIsICAxNSwgIDAsICAgMCwgICAyMTUsIDk5LCAgMTM2LCAxOTEsIDg3LCAgMTIxLAorICAgIDE3MCwgNzcsICAxMDgsIDE0OCwgNjUsICA5MywgIDEyNiwgNTMsICA3OSwgIDEwNiwgNDAsICA2NCwgIDg1LCAgMjQsICA0NywKKyAgICA1OSwgIDAsICAgMjUsICAxNCwgIDAsICAgMCwgICAyMTUsIDk5LCAgMTIxLCAxOTIsIDg3LCAgMTA4LCAxNzAsIDc3LCAgOTYsCisgICAgMTQ4LCA2NSwgIDgyLCAgMTI2LCA1MywgIDY5LCAgMTA2LCA0MCwgIDU1LCAgODUsICAyNSwgIDM5LCAgNTksICAwLCAgIDE4LAorICAgIDEzLCAgMCwgICAwLCAgIDIxNiwgOTksICAxMDYsIDE5MSwgODcsICA5NSwgIDE3MCwgNzYsICA4MywgIDE0OCwgNjUsICA3MSwKKyAgICAxMjYsIDUzLCAgNTgsICAxMDYsIDQxLCAgNDUsICA4NSwgIDI2LCAgMzAsICA1OSwgIDAsICAgOCwgICAxMSwgIDAsICAgMCwKKyAgICAyMTYsIDk4LCAgOTEsICAxOTIsIDg4LCAgODIsICAxNzAsIDc3LCAgNzEsICAxNDgsIDY1LCAgNjAsICAxMjcsIDUzLCAgNDgsCisgICAgMTA1LCA0MSwgIDM2LCAgODMsICAyNiwgIDIxLCAgNTgsICAxLCAgIDIsICAgMTEsICAwLCAgIDAsICAgMjE3LCA5OSwgIDc1LAorICAgIDE5MiwgODcsICA2NiwgIDE3MCwgNzYsICA1NywgIDE0OCwgNjUsICA0NywgIDEyNiwgNTMsICAzNiwgIDEwNSwgNDEsICAyNCwKKyAgICA4MywgIDI2LCAgOCwgICA1NywgIDIsICAgMCwgICA5LCAgIDAsICAgMCwgICAyMTcsIDk4LCAgNTcsICAxOTIsIDg3LCAgNDksCisgICAgMTcxLCA3NywgIDQxLCAgMTQ3LCA2NSwgIDMyLCAgMTI2LCA1MywgIDIxLCAgMTA1LCA0MSwgIDgsICAgODQsICAyNywgIDAsCisgICAgNTcsICAzLCAgIDAsICAgOSwgICAwLCAgIDAsICAgMjE3LCA5OCwgIDQwLCAgMTkzLCA4NywgIDM0LCAgMTcxLCA3NiwgIDI3LAorICAgIDE0OCwgNjUsICAxOSwgIDEyNiwgNTMsICA2LCAgIDEwNSwgNDEsICAwLCAgIDgzLCAgMjcsICAwLCAgIDU3LCAgNCwgICAwLAorICAgIDksICAgMCwgICAwLCAgIDIxMSwgNjcsICAxNTIsIDE4OSwgNTgsICAxMzYsIDE2OCwgNTAsICAxMjIsIDE0NywgMzksICAxMDUsCisgICAgMTI3LCAyOCwgIDg5LCAgMTA2LCAxNCwgIDc0LCAgODUsICAwLCAgIDU2LCAgNTksICAwLCAgIDMzLCAgOSwgICAwLCAgIDAsCisgICAgMjEzLCA2OCwgIDEzOCwgMTkwLCA1OSwgIDEyMywgMTY5LCA1MSwgIDEwOSwgMTQ4LCA0MCwgIDk1LCAgMTI2LCAzMCwgIDgwLAorICAgIDEwNiwgMTYsICA2NSwgIDg1LCAgMCwgICA0OCwgIDU5LCAgMCwgICAyNywgIDksICAgMCwgICAwLCAgIDIxNCwgNjksICAxMjUsCisgICAgMTkwLCA1OSwgIDExMSwgMTY4LCA1MSwgIDk5LCAgMTQ4LCA0MSwgIDg2LCAgMTI2LCAzMSwgIDcyLCAgMTA2LCAxOCwgIDU4LAorICAgIDg1LCAgMCwgICA0MSwgIDU5LCAgMCwgICAyMCwgIDcsICAgMCwgICAwLCAgIDIxNSwgNzAsICAxMTIsIDE5MCwgNjEsICAxMDAsCisgICAgMTY5LCA1MiwgIDg4LCAgMTQ3LCA0MiwgIDc2LCAgMTI2LCAzMiwgIDYzLCAgMTA2LCAxOSwgIDQ5LCAgODQsICAxLCAgIDM0LAorICAgIDU4LCAgMCwgICAxMywgIDcsICAgMCwgICAwLCAgIDIxNCwgNzAsICA5OSwgIDE5MCwgNjIsICA4OCwgIDE2OSwgNTMsICA3NywKKyAgICAxNDcsIDQzLCAgNjUsICAxMjUsIDMyLCAgNTMsICAxMDYsIDIwLCAgNDAsICA4NCwgIDMsICAgMjYsICA1OCwgIDAsICAgNCwKKyAgICA3LCAgIDAsICAgMCwgICAyMTQsIDcxLCAgODYsICAxOTAsIDYxLCAgNzUsICAxNjksIDUzLCAgNjUsICAxNDYsIDQzLCAgNTQsCisgICAgMTI2LCAzMywgIDQ0LCAgMTA1LCAyMSwgIDMxLCAgODMsICA0LCAgIDE3LCAgNTcsICAwLCAgIDAsICAgNywgICAwLCAgIDAsCisgICAgMjE1LCA3MSwgIDcxLCAgMTkxLCA2MiwgIDYyLCAgMTY5LCA1MywgIDUzLCAgMTQ3LCA0NCwgIDQ0LCAgMTI2LCAzNCwgIDMzLAorICAgIDEwNSwgMjIsICAyMCwgIDgzLCAgNSwgICA0LCAgIDU3LCAgMCwgICAwLCAgIDcsICAgMCwgICAwLCAgIDIxNSwgNzEsICA1NCwKKyAgICAxOTEsIDYyLCAgNDcsICAxNjksIDU0LCAgMzksICAxNDcsIDQ0LCAgMzAsICAxMjYsIDM1LCAgMjAsICAxMDUsIDIzLCAgNiwKKyAgICA4MywgIDYsICAgMCwgICA1NiwgIDAsICAgMCwgICA1LCAgIDAsICAgMCwgICAyMTUsIDcxLCAgNDEsICAxOTEsIDYzLCAgMzQsCisgICAgMTcwLCA1NCwgIDI3LCAgMTQ3LCA0NSwgIDE3LCAgMTI2LCAzNSwgIDYsICAgMTA1LCAyMywgIDAsICAgODMsICA4LCAgIDAsCisgICAgNTYsICAwLCAgIDAsICAgNSwgICAwLCAgIDAsICAgMjEwLCAxMywgIDE0MCwgMTg5LCAxLCAgIDEyNSwgMTY3LCAwLCAgIDExMCwKKyAgICAxNDYsIDAsICAgOTYsICAxMjYsIDAsICAgODEsICAxMDYsIDAsICAgNjcsICA4NSwgIDAsICAgNTEsICA1OSwgIDAsICAgMjgsCisgICAgNCwgICAwLCAgIDAsICAgMjEyLCAxOCwgIDEyNiwgMTkwLCA3LCAgIDExMywgMTY4LCAwLCAgIDEwMCwgMTQ2LCAwLCAgIDg2LAorICAgIDEyNiwgMCwgICA3MywgIDEwNiwgMCwgICA1OSwgIDg0LCAgMCwgICA0MywgIDU5LCAgMCwgICAyMiwgIDQsICAgMCwgICAwLAorICAgIDIxMiwgMjEsICAxMTUsIDE5MCwgMTMsICAxMDMsIDE2OCwgMywgICA5MSwgIDE0NiwgMCwgICA3OCwgIDEyNSwgMCwgICA2NSwKKyAgICAxMDUsIDAsICAgNTIsICA4NCwgIDAsICAgMzYsICA1OCwgIDAsICAgMTYsICA0LCAgIDAsICAgMCwgICAyMTMsIDI0LCAgMTAzLAorICAgIDE4OSwgMTksICA5MSwgIDE2OCwgOSwgICA4MiwgIDE0NiwgMCwgICA2OSwgIDEyNSwgMCwgICA1NywgIDEwNSwgMCwgICA0NCwKKyAgICA4NCwgIDAsICAgMjksICA1OCwgIDAsICAgNywgICA0LCAgIDAsICAgMCwgICAyMTMsIDI3LCAgOTIsICAxODgsIDIxLCAgODEsCisgICAgMTY4LCAxNCwgIDcxLCAgMTQ2LCAxLCAgIDU5LCAgMTI1LCAwLCAgIDQ4LCAgMTA1LCAwLCAgIDM2LCAgODQsICAwLCAgIDIxLAorICAgIDU4LCAgMCwgICA0LCAgIDQsICAgMCwgICAwLCAgIDIxMywgMzAsICA4MCwgIDE4OSwgMjIsICA2OSwgIDE2OCwgMTcsICA2MSwKKyAgICAxNDYsIDUsICAgNTAsICAxMjUsIDAsICAgMzksICAxMDQsIDAsICAgMjcsICA4MywgIDAsICAgMTIsICA1NywgIDAsICAgMCwKKyAgICA0LCAgIDAsICAgMCwgICAyMTQsIDMwLCAgNjcsICAxODksIDI1LCAgNTcsICAxNjgsIDIwLCAgNTAsICAxNDYsIDksICAgNDAsCisgICAgMTI1LCAwLCAgIDI5LCAgMTA0LCAwLCAgIDE3LCAgODMsICAwLCAgIDIsICAgNTYsICAwLCAgIDAsICAgNCwgICAwLCAgIDAsCisgICAgMjE0LCAzMiwgIDUzLCAgMTg5LCAyNywgIDQ0LCAgMTY5LCAyMCwgIDM4LCAgMTQ2LCAxMywgIDI4LCAgMTI0LCAyLCAgIDE3LAorICAgIDEwNCwgMCwgICA0LCAgIDgzLCAgMCwgICAwLCAgIDU2LCAgMCwgICAwLCAgIDQsICAgMCwgICAwLCAgIDIxNCwgMzMsICA0MSwKKyAgICAxOTAsIDI3LCAgMzMsICAxNjgsIDIzLCAgMjcsICAxNDYsIDEzLCAgMTgsICAxMjUsIDMsICAgNSwgICAxMDUsIDAsICAgMCwKKyAgICA4MywgIDAsICAgMCwgICA1NiwgIDAsICAgMCwgICA0LCAgIDAsICAgMCwgICAxODUsIDIyOSwgMjUwLCAxNjQsIDIwNCwgMjIzLAorICAgIDE0NiwgMTgyLCAxOTksIDEyNywgMTU4LCAxNzQsIDEwOCwgMTM2LCAxNDksIDg5LCAgMTEzLCAxMjUsIDcwLCAgOTAsICAxMDAsCisgICAgNDYsICA2MiwgIDcxLCAgMTAsICAyNSwgIDMzLCAgMTg5LCAyMjcsIDIyNSwgMTY4LCAyMDIsIDIwMSwgMTQ4LCAxODEsIDE3OSwKKyAgICAxMjksIDE1NywgMTU2LCAxMDksIDEzNSwgMTM0LCA5MCwgIDExMywgMTEzLCA3MCwgIDg5LCAgOTAsICA0NiwgIDYyLCAgNjIsCisgICAgOCwgICAyNCwgIDI1LCAgMTkyLCAyMjYsIDIwMiwgMTcwLCAyMDIsIDE4MiwgMTUxLCAxNzksIDE2MiwgMTMwLCAxNTYsIDE0MSwKKyAgICAxMTAsIDEzMywgMTIxLCA5MSwgIDExMiwgMTAxLCA3MSwgIDg5LCAgODAsICA0NiwgIDYxLCAgNTQsICA3LCAgIDI0LCAgMTksCisgICAgMTk0LCAyMjQsIDE3OSwgMTczLCAyMDAsIDE2MCwgMTUzLCAxNzgsIDE0NCwgMTMyLCAxNTUsIDEyNSwgMTEyLCAxMzMsIDEwNywKKyAgICA5MiwgIDExMSwgODksICA3MSwgIDg4LCAgNjksICA0NiwgIDYxLCAgNDUsICA2LCAgIDIzLCAgMTAsICAxOTYsIDIyMywgMTU1LAorICAgIDE3NCwgMTk4LCAxMzksIDE1NCwgMTc2LCAxMjQsIDEzMiwgMTUzLCAxMDcsIDExMywgMTMxLCA5MSwgIDkyLCAgMTEwLCA3NSwKKyAgICA3MiwgIDg3LCAgNTgsICA0NywgIDYwLCAgMzcsICA0LCAgIDIzLCAgMCwgICAxOTgsIDIyMSwgMTMxLCAxNzUsIDE5NywgMTE3LAorICAgIDE1NSwgMTc1LCAxMDUsIDEzMywgMTUyLCA5MSwgIDExMywgMTMwLCA3NiwgIDkyLCAgMTA5LCA2MywgIDcyLCAgODYsICA0NywKKyAgICA0NiwgIDYwLCAgMjYsICAzLCAgIDIzLCAgMCwgICAyMDAsIDIyMCwgMTA0LCAxNzYsIDE5NiwgOTQsICAxNTYsIDE3NSwgODQsCisgICAgMTM0LCAxNTEsIDcyLCAgMTEzLCAxMjksIDU5LCAgOTMsICAxMDgsIDQ3LCAgNzIsICA4NSwgIDMzLCAgNDYsICA1OSwgIDEzLAorICAgIDAsICAgMjMsICAwLCAgIDIwMSwgMjE5LCA3MywgIDE3OSwgMTk1LCA2NSwgIDE1NywgMTczLCA1NywgIDEzNSwgMTUwLCA0OCwKKyAgICAxMTQsIDEyOSwgMzksICA5NCwgIDEwOCwgMjgsICA3MiwgIDg1LCAgMTUsICA0NywgIDU5LCAgMCwgICAwLCAgIDIyLCAgMCwKKyAgICAyMDMsIDIxOSwgNDIsICAxNzgsIDE5NSwgMzcsICAxNTcsIDE3MywgMzIsICAxMzUsIDE1MCwgMjYsICAxMTQsIDEyOCwgMTYsCisgICAgOTQsICAxMDcsIDYsICAgNzMsICA4NSwgIDAsICAgNDYsICA1OCwgIDAsICAgMCwgICAyMiwgIDAsICAgMTg2LCAyMDUsIDIzMywKKyAgICAxNjUsIDE4MywgMjA5LCAxNDgsIDE2MywgMTg3LCAxMjgsIDE0MiwgMTYzLCAxMDksIDEyMSwgMTQwLCA5MSwgIDEwMSwgMTE4LAorICAgIDcxLCAgODAsICA5NCwgIDQ4LCAgNTQsICA2NiwgIDEyLCAgMTUsICAyNywgIDE4OSwgMjA0LCAyMTEsIDE2OSwgMTgyLCAxODksCisgICAgMTUxLCAxNjMsIDE2OSwgMTMxLCAxNDEsIDE0NywgMTExLCAxMjEsIDEyNiwgOTIsICAxMDEsIDEwNSwgNzIsICA3OSwgIDg0LAorICAgIDQ4LCAgNTQsICA1OCwgIDExLCAgMTUsICAxOSwgIDE5MiwgMjAyLCAxOTAsIDE3MSwgMTgxLCAxNzAsIDE1MiwgMTYxLCAxNTIsCisgICAgMTMxLCAxNDEsIDEzMywgMTEyLCAxMjAsIDExMywgOTMsICAxMDAsIDk0LCAgNzIsICA3OSwgIDc0LCAgNDgsICA1MywgIDUwLAorICAgIDEwLCAgMTUsICAxMSwgIDE5NSwgMjAxLCAxNjksIDE3MiwgMTc5LCAxNTEsIDE1MywgMTYwLCAxMzUsIDEzMiwgMTM5LCAxMTcsCisgICAgMTEzLCAxMTksIDEwMCwgOTMsICA5OSwgIDgyLCAgNzIsICA3OCwgIDY0LCAgNDgsICA1MywgIDQxLCAgOSwgICAxNCwgIDMsCisgICAgMTk1LCAyMDAsIDE0NiwgMTc0LCAxNzksIDEzMSwgMTU0LCAxNTksIDExNywgMTMzLCAxMzgsIDEwMSwgMTEzLCAxMTgsIDg2LAorICAgIDkzLCAgOTgsICA3MCwgIDczLCAgNzcsICA1MywgIDQ4LCAgNTIsICAzMiwgIDgsICAgMTUsICAwLCAgIDE5OCwgMTk5LCAxMjUsCisgICAgMTc1LCAxNzcsIDExMSwgMTU1LCAxNTgsIDEwMCwgMTMzLCAxMzcsIDg1LCAgMTEzLCAxMTcsIDcxLCAgOTMsICA5NywgIDU3LAorICAgIDcyLCAgNzcsICA0MiwgIDQ3LCAgNTIsICAyMiwgIDUsICAgMTQsICAwLCAgIDE5OSwgMTk4LCAxMDEsIDE3NiwgMTc3LCA4OSwKKyAgICAxNTUsIDE1NywgNzksICAxMzQsIDEzNiwgNjgsICAxMTMsIDExNiwgNTYsICA5NCwgIDk3LCAgNDQsICA3MywgIDc2LCAgMzAsCisgICAgNDcsICA1MiwgIDEwLCAgMiwgICAxNSwgIDAsICAgMjAwLCAxOTcsIDcyLCAgMTc4LCAxNzYsIDYzLCAgMTU3LCAxNTYsIDU2LAorICAgIDEzNSwgMTM2LCA0NiwgIDExNCwgMTE2LCAzNywgIDk0LCAgOTYsICAyNiwgIDczLCAgNzYsICAxMSwgIDQ3LCAgNTEsICAwLAorICAgIDAsICAgMTQsICAwLCAgIDIwMSwgMTk3LCA0NSwgIDE3NywgMTc1LCAzOCwgIDE1NiwgMTU1LCAzMSwgIDEzNSwgMTM1LCAyNSwKKyAgICAxMTQsIDExNSwgMTcsICA5NCwgIDk2LCAgNSwgICA3MywgIDc1LCAgMCwgICA0NiwgIDUxLCAgMCwgICAwLCAgIDE0LCAgMCwKKyAgICAxODcsIDE4MywgMjE4LCAxNjcsIDE2NSwgMTk3LCAxNDksIDE0NywgMTc2LCAxMjksIDEyNywgMTUzLCAxMTEsIDEwOSwgMTMyLAorICAgIDkyLCAgOTAsICAxMTEsIDczLCAgNzAsICA4OSwgIDQ5LCAgNDYsICA2MiwgIDE1LCAgNCwgICAyMiwgIDE5MCwgMTgzLCAxOTcsCisgICAgMTcwLCAxNjQsIDE3NywgMTUxLCAxNDYsIDE1OSwgMTMwLCAxMjcsIDEzOSwgMTEyLCAxMDksIDExOSwgOTMsICA5MCwgIDk5LAorICAgIDcyLCAgNzAsICA3OCwgIDQ5LCAgNDUsICA1MywgIDE0LCAgNCwgICAxNSwgIDE5MiwgMTgyLCAxNzksIDE3MSwgMTYzLCAxNjEsCisgICAgMTUzLCAxNDUsIDE0NCwgMTMyLCAxMjYsIDEyNSwgMTEzLCAxMDgsIDEwNywgOTMsICA4OSwgIDg4LCAgNzMsICA3MCwgIDY5LAorICAgIDQ5LCAgNDUsICA0NSwgIDEzLCAgNSwgICA2LCAgIDE5NSwgMTgxLCAxNTksIDE3MiwgMTYyLCAxNDIsIDE1MiwgMTQ1LCAxMjcsCisgICAgMTMyLCAxMjUsIDExMSwgMTEzLCAxMDcsIDk0LCAgOTMsICA4OCwgIDc3LCAgNzMsICA2OSwgIDU5LCAgNDgsICA0NSwgIDM3LAorICAgIDExLCAgNSwgICAwLCAgIDE5NSwgMTgwLCAxMzksIDE3MywgMTYxLCAxMjQsIDE1MywgMTQzLCAxMTAsIDEzMywgMTI1LCA5NiwKKyAgICAxMTMsIDEwNiwgODEsICA5NCwgIDg4LCAgNjYsICA3MywgIDY4LCAgNDksICA0OSwgIDQ0LCAgMjgsICA5LCAgIDYsICAgMCwKKyAgICAxOTYsIDE3OSwgMTE4LCAxNzQsIDE2MCwgMTA2LCAxNTQsIDE0MiwgOTQsICAxMzMsIDEyNCwgODEsICAxMTMsIDEwNSwgNjgsCisgICAgOTQsICA4NywgIDU0LCAgNzMsICA2OCwgIDM5LCAgNDgsICA0NCwgIDE4LCAgNSwgICA1LCAgIDAsICAgMTk3LCAxNzgsIDk2LAorICAgIDE3NiwgMTU5LCA4NiwgIDE1NSwgMTQxLCA3NSwgIDEzNCwgMTIzLCA2NCwgIDExNCwgMTA1LCA1MywgIDk0LCAgODcsICA0MCwKKyAgICA3MywgIDY4LCAgMjYsICA0OCwgIDQ0LCAgNSwgICAyLCAgIDYsICAgMCwgICAxOTksIDE3OCwgNzAsICAxNzYsIDE1OCwgNjIsCisgICAgMTU2LCAxNDEsIDU0LCAgMTM0LCAxMjIsIDQ0LCAgMTE0LCAxMDQsIDM1LCAgOTQsICA4NiwgIDIzLCAgNzMsICA2NywgIDgsCisgICAgNDcsICA0NCwgIDAsICAgMiwgICA2LCAgIDAsICAgMTk5LCAxNzcsIDQ1LCAgMTc4LCAxNTgsIDQwLCAgMTU2LCAxNDAsIDMyLAorICAgIDEzNSwgMTIyLCAyNiwgIDExNCwgMTA0LCAxNiwgIDk0LCAgODYsICA0LCAgIDczLCAgNjcsICAwLCAgIDQ3LCAgNDQsICAwLAorICAgIDAsICAgNywgICAwLCAgIDE4OCwgMTYxLCAyMDQsIDE2OCwgMTQ0LCAxODMsIDE0OSwgMTI5LCAxNjQsIDEzMCwgMTEyLCAxNDQsCisgICAgMTEyLCA5NSwgIDEyMywgOTMsICA3OCwgIDEwMywgNzQsICA2MCwgIDgxLCAgNTAsICAzNiwgIDU2LCAgMTYsICAwLCAgIDE2LAorICAgIDE5MCwgMTYwLCAxODUsIDE3MCwgMTQ0LCAxNjUsIDE1MSwgMTI4LCAxNDgsIDEzMiwgMTExLCAxMzAsIDExMiwgOTUsICAxMTAsCisgICAgOTMsICA3OCwgIDkyLCAgNzQsICA1OSwgIDcyLCAgNTAsICAzNiwgIDQ4LCAgMTYsICAwLCAgIDgsICAgMTkyLCAxNjAsIDE2NywKKyAgICAxNzEsIDE0MywgMTUwLCAxNTMsIDEyOCwgMTM0LCAxMzIsIDExMSwgMTE3LCAxMTIsIDk0LCAgMTAwLCA5NCwgIDc3LCAgODIsCisgICAgNzQsICA1OSwgIDYzLCAgNTAsICAzNiwgIDQwLCAgMTQsICAwLCAgIDAsICAgMTkzLCAxNTksIDE0OSwgMTcyLCAxNDMsIDEzNCwKKyAgICAxNTMsIDEyNywgMTE5LCAxMzMsIDExMCwgMTAzLCAxMTMsIDk0LCAgODcsICA5MywgIDc3LCAgNzIsICA3MywgIDU5LCAgNTQsCisgICAgNTAsICAzNiwgIDMyLCAgMTIsICAwLCAgIDAsICAgMTk1LCAxNTksIDEzMSwgMTczLCAxNDIsIDExNywgMTUzLCAxMjcsIDEwNCwKKyAgICAxMzIsIDExMCwgOTAsICAxMTMsIDkzLCAgNzYsICA5MywgIDc2LCAgNjEsICA3NCwgIDU5LCAgNDUsICA0OSwgIDM2LCAgMjMsCisgICAgOSwgICAwLCAgIDAsICAgMTk2LCAxNTgsIDExMywgMTc0LCAxNDEsIDEwMSwgMTU1LCAxMjYsIDg5LCAgMTMzLCAxMDksIDc2LAorICAgIDExMywgOTMsICA2NCwgIDk0LCAgNzYsICA1MSwgIDc0LCAgNTgsICAzNSwgIDQ5LCAgMzYsICAxNCwgIDYsICAgMCwgICAwLAorICAgIDE5NywgMTU3LCA5MiwgIDE3NCwgMTQxLCA4MCwgIDE1NCwgMTI1LCA3MSwgIDEzNCwgMTA4LCA2MCwgIDExNCwgOTIsICA1MCwKKyAgICA5NCwgIDc1LCAgMzcsICA3MywgIDU4LCAgMjIsICA0OCwgIDM2LCAgMSwgICA1LCAgIDAsICAgMCwgICAxOTcsIDE1NywgNjgsCisgICAgMTc1LCAxNDAsIDU5LCAgMTU1LCAxMjQsIDUxLCAgMTM0LCAxMDgsIDQxLCAgMTEzLCA5MSwgIDMyLCAgOTQsICA3NSwgIDIxLAorICAgIDczLCAgNTcsICA1LCAgIDQ4LCAgMzUsICAwLCAgIDUsICAgMCwgICAwLCAgIDE5OCwgMTU2LCA0NiwgIDE3NiwgMTQwLCA0MCwKKyAgICAxNTUsIDEyNCwgMzIsICAxMzQsIDEwNywgMjQsICAxMTQsIDkxLCAgMTQsICA5NCwgIDc1LCAgMiwgICA3MywgIDU3LCAgMCwKKyAgICA0OCwgIDM2LCAgMCwgICAzLCAgIDAsICAgMCwgICAxODksIDE0MCwgMTkxLCAxNjgsIDEyNiwgMTcyLCAxNTAsIDExMiwgMTU0LAorICAgIDEzMSwgOTcsICAxMzQsIDExMiwgODIsICAxMTUsIDk0LCAgNjYsICA5NiwgIDc0LCAgNDksICA3NSwgIDUxLCAgMjUsICA1MCwKKyAgICAxMiwgIDAsICAgMTAsICAxOTEsIDEzOSwgMTczLCAxNzAsIDEyNSwgMTU0LCAxNTIsIDExMSwgMTM4LCAxMzIsIDk2LCAgMTIxLAorICAgIDExMywgODEsICAxMDMsIDk0LCAgNjYsICA4NSwgIDc0LCAgNDgsICA2NiwgIDUwLCAgMjYsICA0MiwgIDEyLCAgMCwgICAxLAorICAgIDE5MiwgMTM5LCAxNTcsIDE3MSwgMTI1LCAxNDAsIDE1MiwgMTExLCAxMjUsIDEzMiwgOTYsICAxMDksIDExMywgODEsICA5MiwKKyAgICA5NCwgIDY1LCAgNzYsICA3NCwgIDQ4LCAgNTgsICA1MCwgIDI2LCAgMzUsICA5LCAgIDAsICAgMCwgICAxOTMsIDEzOSwgMTQwLAorICAgIDE3MiwgMTI0LCAxMjUsIDE1MywgMTEwLCAxMTIsIDEzMywgOTUsICA5NiwgIDExMywgODAsICA4MiwgIDk0LCAgNjUsICA2NiwKKyAgICA3NCwgIDQ5LCAgNTAsICA1MCwgIDI2LCAgMjgsICA3LCAgIDAsICAgMCwgICAxOTQsIDEzOCwgMTIzLCAxNzIsIDEyMywgMTA5LAorICAgIDE1MywgMTEwLCA5NywgIDEzMywgOTUsICA4NCwgIDExMywgODAsICA3MCwgIDk0LCAgNjUsICA1NiwgIDc0LCAgNDgsICA0MCwKKyAgICA1MCwgIDI2LCAgMjAsICA2LCAgIDAsICAgMCwgICAxOTQsIDEzOCwgMTA1LCAxNzMsIDEyMywgOTQsICAxNTMsIDEwOSwgODMsCisgICAgMTMzLCA5NCwgIDcwLCAgMTEyLCA3OSwgIDU5LCAgOTQsICA2NCwgIDQ2LCAgNzQsICA0OCwgIDMxLCAgNTAsICAyNiwgIDksCisgICAgNCwgICAwLCAgIDAsICAgMTk2LCAxMzgsIDg3LCAgMTc0LCAxMjIsIDc3LCAgMTUzLCAxMDksIDY3LCAgMTMzLCA5MywgIDU2LAorICAgIDExMywgNzksICA0NiwgIDk0LCAgNjQsICAzNCwgIDczLCAgNDgsICAxOCwgIDQ5LCAgMjcsICAwLCAgIDQsICAgMCwgICAwLAorICAgIDE5NiwgMTM3LCA2NSwgIDE3NCwgMTIyLCA1NywgIDE1NCwgMTA4LCA0OSwgIDEzMywgOTMsICAzOSwgIDExMywgNzksICAyOSwKKyAgICA5NCwgIDY0LCAgMTgsICA3NCwgIDQ4LCAgMywgICA0OSwgIDI3LCAgMCwgICAyLCAgIDAsICAgMCwgICAxOTcsIDEzNywgNDcsCisgICAgMTc1LCAxMjIsIDQwLCAgMTU1LCAxMDgsIDMyLCAgMTMzLCA5MywgIDIzLCAgMTE0LCA3OSwgIDE0LCAgOTQsICA2NCwgIDEsCisgICAgNzMsICA0OCwgIDAsICAgNDgsICAyNywgIDAsICAgMiwgICAwLCAgIDAsICAgMTg5LCAxMTksIDE3NywgMTY4LCAxMDYsIDE1OSwKKyAgICAxNTAsIDk0LCAgMTQyLCAxMzEsIDgxLCAgMTI0LCAxMTMsIDY3LCAgMTA3LCA5NCwgIDUzLCAgODksICA3NCwgIDM3LCAgNjksCisgICAgNTEsICAxMSwgIDQ1LCAgNiwgICAwLCAgIDMsICAgMTkxLCAxMTksIDE2MSwgMTcwLCAxMDYsIDE0NCwgMTUyLCA5NCwgIDEyOSwKKyAgICAxMzIsIDgxLCAgMTEyLCAxMTMsIDY3LCAgOTYsICA5NCwgIDUzLCAgNzksICA3NCwgIDM3LCAgNjEsICA1MSwgIDEzLCAgMzgsCisgICAgNiwgICAwLCAgIDAsICAgMTkyLCAxMTksIDE0NiwgMTcwLCAxMDYsIDEzMSwgMTUyLCA5NCwgIDExNywgMTMyLCA4MCwgIDEwMSwKKyAgICAxMTIsIDY3LCAgODUsICA5NCwgIDUzLCAgNzAsICA3NCwgIDM3LCAgNTMsICA1MCwgIDE0LCAgMzEsICA0LCAgIDAsICAgMCwKKyAgICAxOTIsIDExOSwgMTMxLCAxNzEsIDEwNiwgMTE3LCAxNTMsIDk0LCAgMTA1LCAxMzIsIDgwLCAgODksICAxMTMsIDY3LCAgNzUsCisgICAgOTQsICA1NCwgIDYxLCAgNzQsICAzOCwgIDQ1LCAgNTEsICAxNCwgIDIzLCAgMywgICAwLCAgIDAsICAgMTkzLCAxMTgsIDExNCwKKyAgICAxNzEsIDEwNiwgMTAyLCAxNTMsIDkzLCAgOTAsICAxMzIsIDgwLCAgNzgsICAxMTMsIDY3LCAgNjUsICA5NCwgIDUzLCAgNTIsCisgICAgNzQsICAzNywgIDM2LCAgNTAsICAxNSwgIDE2LCAgMSwgICAwLCAgIDAsICAgMTk0LCAxMTgsIDk5LCAgMTcyLCAxMDUsIDg5LAorICAgIDE1MywgOTMsICA3OCwgIDEzMiwgODAsICA2NiwgIDExMywgNjcsICA1NCwgIDk0LCAgNTMsICA0MiwgIDc0LCAgMzgsICAyNywKKyAgICA1MCwgIDE2LCAgNSwgICAxLCAgIDAsICAgMCwgICAxOTQsIDExOCwgODIsICAxNzMsIDEwNSwgNzIsICAxNTMsIDkzLCAgNjMsCisgICAgMTMyLCA3OSwgIDUzLCAgMTEzLCA2NywgIDQyLCAgOTQsICA1MywgIDMwLCAgNzQsICAzOCwgIDE1LCAgNDksICAxNiwgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTk1LCAxMTcsIDYzLCAgMTczLCAxMDUsIDU1LCAgMTU0LCA5MywgIDQ3LCAgMTMzLCA3OSwgIDM3LAorICAgIDExMywgNjYsICAyNywgIDk0LCAgNTMsICAxNSwgIDczLCAgMzgsICAwLCAgIDQ4LCAgMTYsICAwLCAgIDAsICAgMCwgICAwLAorICAgIDE5NSwgMTE3LCA0NiwgIDE3MywgMTA0LCAzOSwgIDE1NCwgOTIsICAzMiwgIDEzMywgNzksICAyMiwgIDExMywgNjYsICAxMywKKyAgICA5NCwgIDUzLCAgMCwgICA3MywgIDM4LCAgMCwgICA0OCwgIDE3LCAgMCwgICAwLCAgIDAsICAgMCwgICAxODksIDk2LCAgMTY2LAorICAgIDE2OCwgODUsICAxNDcsIDE1MCwgNzQsICAxMzIsIDEzMSwgNjIsICAxMTUsIDExMywgNTEsICA5OSwgIDk0LCAgMzgsICA4MiwKKyAgICA3NCwgIDIxLCAgNjMsICA1MSwgIDAsICAgNDAsICAxLCAgIDAsICAgMCwgICAxOTAsIDk2LCAgMTUwLCAxNzAsIDg1LCAgMTMzLAorICAgIDE1MiwgNzUsICAxMTksIDEzMiwgNjMsICAxMDQsIDExMywgNTEsICA4OCwgIDk0LCAgMzgsICA3MiwgIDc1LCAgMjIsICA1NSwKKyAgICA1MSwgIDAsICAgMzMsICAxLCAgIDAsICAgMCwgICAxOTIsIDk2LCAgMTM3LCAxNzAsIDg1LCAgMTIxLCAxNTIsIDc0LCAgMTA4LAorICAgIDEzMiwgNjQsICA5NCwgIDExMywgNTIsICA3OSwgIDk0LCAgMzksICA2NCwgIDc0LCAgMjMsICA0OCwgIDUwLCAgMCwgICAyNiwKKyAgICAwLCAgIDAsICAgMCwgICAxOTIsIDk2LCAgMTIyLCAxNzEsIDg2LCAgMTA5LCAxNTIsIDc1LCAgOTYsICAxMzIsIDYzLCAgODMsCisgICAgMTEzLCA1MiwgIDY5LCAgOTQsICAzOSwgIDU2LCAgNzQsICAyNCwgIDQxLCAgNTAsICAwLCAgIDE5LCAgMCwgICAwLCAgIDAsCisgICAgMTkzLCA5NiwgIDEwNywgMTcxLCA4NSwgIDk2LCAgMTUyLCA3NSwgIDg0LCAgMTMyLCA2NCwgIDcyLCAgMTEzLCA1MiwgIDYwLAorICAgIDk0LCAgMzksICA0NywgIDc0LCAgMjQsICAzMiwgIDUwLCAgMSwgICAxMCwgIDAsICAgMCwgICAwLCAgIDE5MywgOTYsICA5MywKKyAgICAxNzIsIDg1LCAgODIsICAxNTIsIDc1LCAgNzIsICAxMzMsIDYzLCAgNjEsICAxMTMsIDUxLCAgNDksICA5NCwgIDM5LCAgMzcsCisgICAgNzMsICAyNSwgIDIzLCAgNDksICAyLCAgIDIsICAgMCwgICAwLCAgIDAsICAgMTk0LCA5NiwgIDc4LCAgMTcyLCA4NSwgIDY4LAorICAgIDE1MiwgNzUsICA1OSwgIDEzMiwgNjMsICA0OSwgIDExMywgNTIsICAzOSwgIDk0LCAgNDAsICAyNiwgIDczLCAgMjUsICAxMSwKKyAgICA0OCwgIDMsICAgMCwgICAwLCAgIDAsICAgMCwgICAxOTQsIDk2LCAgNjAsICAxNzMsIDg1LCAgNTIsICAxNTMsIDc1LCAgNDQsCisgICAgMTMyLCA2NCwgIDM1LCAgMTEyLCA1MiwgIDI1LCAgOTQsICA0MCwgIDEyLCAgNzMsICAyNiwgIDAsICAgNDgsICA0LCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTk1LCA5NiwgIDQ2LCAgMTczLCA4NSwgIDM4LCAgMTU0LCA3NCwgIDMxLCAgMTMzLCA2MywgIDIyLAorICAgIDExMywgNTIsICAxMSwgIDkzLCAgNDAsICAwLCAgIDczLCAgMjYsICAwLCAgIDQ3LCAgNSwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDE4OCwgNjcsICAxNTMsIDE2OCwgNTgsICAxMzcsIDE1MSwgNDksICAxMjIsIDEzMSwgMzksICAxMDYsIDExMywgMjgsICA5MCwKKyAgICA5NCwgIDEzLCAgNzUsICA3NSwgIDAsICAgNTcsICA1MSwgIDAsICAgMzUsICAwLCAgIDAsICAgMCwgICAxOTAsIDY4LCAgMTM4LAorICAgIDE3MCwgNTksICAxMjMsIDE1MiwgNTAsICAxMTAsIDEzMiwgNDEsICA5NiwgIDExMywgMjksICA4MCwgIDk0LCAgMTYsICA2NiwKKyAgICA3NSwgIDAsICAgNDksICA1MCwgIDAsICAgMjcsICAwLCAgIDAsICAgMCwgICAxOTEsIDY5LCAgMTI2LCAxNzAsIDU5LCAgMTEyLAorICAgIDE1MSwgNTIsICAxMDAsIDEzMiwgNDIsICA4NiwgIDExMywgMzAsICA3MywgIDk1LCAgMTcsICA1OCwgIDc1LCAgMCwgICA0MiwKKyAgICA1MCwgIDAsICAgMjEsICAwLCAgIDAsICAgMCwgICAxOTIsIDcwLCAgMTEzLCAxNzAsIDYxLCAgMTAwLCAxNTEsIDUyLCAgODksCisgICAgMTMyLCA0MiwgIDc3LCAgMTEzLCAzMSwgIDY0LCAgOTQsICAxOSwgIDUwLCAgNzQsICAxLCAgIDM1LCAgNTAsICAwLCAgIDE0LAorICAgIDAsICAgMCwgICAwLCAgIDE5MiwgNzAsICAxMDAsIDE3MCwgNjIsICA4OSwgIDE1MSwgNTMsICA3NywgIDEzMSwgNDMsICA2NiwKKyAgICAxMTIsIDMyLCAgNTQsICA5NCwgIDIwLCAgNDIsICA3NCwgIDIsICAgMjcsICA0OSwgIDAsICAgNSwgICAwLCAgIDAsICAgMCwKKyAgICAxOTIsIDcxLCAgODcsICAxNzEsIDYxLCAgNzcsICAxNTIsIDUzLCAgNjcsICAxMzEsIDQ0LCAgNTcsICAxMTIsIDMzLCAgNDUsCisgICAgOTQsICAyMSwgIDMzLCAgNzQsICA0LCAgIDE5LCAgNDksICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMTkzLCA3MSwgIDc0LAorICAgIDE3MSwgNjIsICA2NCwgIDE1MiwgNTMsICA1NSwgIDEzMiwgNDQsICA0NSwgIDExMywgMzQsICAzNCwgIDk0LCAgMjIsICAyMywKKyAgICA3MywgIDUsICAgNywgICA0OCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxOTMsIDcwLCAgNTgsICAxNzIsIDYyLCAgNTAsCisgICAgMTUyLCA1NCwgIDQyLCAgMTMyLCA0NCwgIDMyLCAgMTEyLCAzNSwgIDIyLCAgOTMsICAyMywgIDEwLCAgNzMsICA2LCAgIDAsCisgICAgNDcsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTkzLCA3MCwgIDQ1LCAgMTcyLCA2MiwgIDM4LCAgMTUzLCA1NCwgIDMxLAorICAgIDEzMiwgNDQsICAyMSwgIDExMiwgMzUsICA5LCAgIDk0LCAgMjMsICAwLCAgIDczLCAgNywgICAwLCAgIDQ3LCAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDE4OSwgMjYsICAxNDEsIDE2OSwgMTUsICAxMjYsIDE1MCwgMiwgICAxMTIsIDEzMSwgMCwgICA5NywKKyAgICAxMTMsIDAsICAgODIsICA5NCwgIDAsICAgNjcsICA3NSwgIDAsICAgNTEsICA1MCwgIDAsICAgMjksICAwLCAgIDAsICAgMCwKKyAgICAxOTAsIDI4LCAgMTI4LCAxNzAsIDE4LCAgMTE0LCAxNTEsIDgsICAgMTAxLCAxMzIsIDAsICAgODgsICAxMTMsIDAsICAgNzQsCisgICAgOTQsICAwLCAgIDYwLCAgNzUsICAwLCAgIDQ0LCAgNTAsICAwLCAgIDIzLCAgMCwgICAwLCAgIDAsICAgMTkxLCAzMCwgIDExNywKKyAgICAxNzAsIDIzLCAgMTA0LCAxNTIsIDExLCAgOTIsICAxMzIsIDEsICAgNzksICAxMTMsIDAsICAgNjcsICA5NSwgIDAsICAgNTMsCisgICAgNzUsICAwLCAgIDM3LCAgNTAsICAwLCAgIDE3LCAgMCwgICAwLCAgIDAsICAgMTkxLCAzMywgIDEwNSwgMTcwLCAyNiwgIDkzLAorICAgIDE1MSwgMTgsICA4MywgIDEzMiwgNiwgICA3MCwgIDExMiwgMCwgICA1OCwgIDk0LCAgMCwgICA0NSwgIDc1LCAgMCwgICAzMCwKKyAgICA0OSwgIDAsICAgOCwgICAwLCAgIDAsICAgMCwgICAxOTEsIDM0LCAgOTMsICAxNzAsIDI3LCAgODIsICAxNTEsIDIwLCAgNzIsCisgICAgMTMxLCA4LCAgIDYxLCAgMTEyLCAwLCAgIDQ5LCAgOTQsICAwLCAgIDM4LCAgNzQsICAwLCAgIDIzLCAgNDksICAwLCAgIDQsCisgICAgMCwgICAwLCAgIDAsICAgMTkxLCAzNiwgIDgyLCAgMTcwLCAyOSwgIDcxLCAgMTUxLCAyMiwgIDYzLCAgMTMxLCAxMSwgIDUyLAorICAgIDExMiwgMCwgICA0MSwgIDkzLCAgMCwgICAyOSwgIDc0LCAgMCwgICAxNCwgIDQ4LCAgMCwgICAxLCAgIDAsICAgMCwgICAwLAorICAgIDE5MSwgMzgsICA2OSwgIDE3MCwgMzEsICA2MCwgIDE1MSwgMjQsICA1MSwgIDEzMSwgMTQsICA0MSwgIDExMiwgMSwgICAzMSwKKyAgICA5MywgIDAsICAgMTksICA3MywgIDAsICAgMywgICA0OCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxOTIsIDM3LCAgNTYsCisgICAgMTcxLCAzMSwgIDQ3LCAgMTUyLCAyNSwgIDQwLCAgMTMxLCAxNywgIDMwLCAgMTEyLCA0LCAgIDE5LCAgOTMsICAwLCAgIDcsCisgICAgNzMsICAwLCAgIDAsICAgNDcsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTkyLCAzOCwgIDQ1LCAgMTcxLCAzMywgIDM2LAorICAgIDE1MiwgMjYsICAzMCwgIDEzMSwgMTgsICAyMSwgIDExMSwgNywgICA5LCAgIDkzLCAgMCwgICAwLCAgIDczLCAgMCwgICAwLAorICAgIDQ3LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE0OSwgMjE4LCAyNDgsIDEzMywgMTk0LCAyMjIsIDExOSwgMTczLCAxOTgsCisgICAgMTAyLCAxNTEsIDE3MywgODYsICAxMzAsIDE0OCwgNzAsICAxMDgsIDEyNSwgNTMsICA4NSwgIDEwMCwgMzIsICA1OSwgIDcxLAorICAgIDAsICAgMjIsICAzMywgIDE1NCwgMjE2LCAyMjMsIDEzNywgMTkzLCAyMDAsIDEyMiwgMTcyLCAxNzgsIDEwNiwgMTUwLCAxNTYsCisgICAgODksICAxMjgsIDEzMywgNzMsICAxMDcsIDExMiwgNTQsICA4NSwgIDg5LCAgMzEsICA1OSwgIDYzLCAgMCwgICAyMiwgIDI2LAorICAgIDE1OSwgMjE1LCAyMDIsIDE0MSwgMTkyLCAxODEsIDEyNiwgMTcxLCAxNjEsIDEwOCwgMTQ5LCAxNDEsIDkwLCAgMTI4LCAxMjEsCisgICAgNzQsICAxMDcsIDEwMCwgNTUsICA4NSwgIDgwLCAgMzIsICA1OCwgIDU1LCAgMCwgICAyMiwgIDE5LCAgMTYxLCAyMTMsIDE3OSwKKyAgICAxNDQsIDE5MCwgMTYwLCAxMjYsIDE3MCwgMTQzLCAxMDksIDE0OCwgMTI1LCA5MiwgIDEyNywgMTA3LCA3NCwgIDEwNiwgODksCisgICAgNTYsICA4NCwgIDY5LCAgMzIsICA1OCwgIDQ2LCAgMCwgICAyMSwgIDExLCAgMTYzLCAyMTEsIDE1NiwgMTQ0LCAxODksIDEzOSwKKyAgICAxMjksIDE2OCwgMTI1LCAxMTAsIDE0NywgMTA4LCA5MywgIDEyNiwgOTIsICA3NSwgIDEwNSwgNzYsICA1NywgIDgzLCAgNTgsCisgICAgMzMsICA1OCwgIDM3LCAgMCwgICAyMSwgIDEsICAgMTY3LCAyMTEsIDEzMywgMTQ3LCAxODgsIDEyMCwgMTMwLCAxNjcsIDEwNSwKKyAgICAxMTAsIDE0NSwgOTIsICA5MywgIDEyNSwgNzgsICA3NiwgIDEwNCwgNjQsICA1OCwgIDgzLCAgNDgsICAzMywgIDU3LCAgMjcsCisgICAgMCwgICAyMSwgIDAsICAgMTY5LCAyMTAsIDEwOCwgMTQ5LCAxODcsIDk2LCAgMTMxLCAxNjYsIDg2LCAgMTEyLCAxNDQsIDc0LAorICAgIDk0LCAgMTI0LCA2MiwgIDc3LCAgMTAzLCA0OSwgIDU4LCAgODIsICAzNSwgIDMzLCAgNTcsICAxNSwgIDAsICAgMjEsICAwLAorICAgIDE3MCwgMjA5LCA4MCwgIDE1MSwgMTg2LCA3MSwgIDEzMywgMTY1LCA2MiwgIDExNCwgMTQzLCA1MiwgIDk1LCAgMTIzLCA0MiwKKyAgICA3NywgIDEwMywgMzIsICA1OCwgIDgxLCAgMTgsICAzMywgIDU2LCAgMCwgICAwLCAgIDIxLCAgMCwgICAxNzMsIDIwOCwgNTUsCisgICAgMTUyLCAxODYsIDQ5LCAgMTM0LCAxNjUsIDQxLCAgMTE0LCAxNDMsIDM0LCAgOTUsICAxMjIsIDI1LCAgNzcsICAxMDIsIDE0LAorICAgIDU4LCAgODEsICAwLCAgIDMzLCAgNTYsICAwLCAgIDAsICAgMjEsICAwLCAgIDE1NCwgMTk1LCAyMzIsIDEzNywgMTc0LCAyMDcsCisgICAgMTIyLCAxNTYsIDE4NSwgMTA1LCAxMzYsIDE2MywgODksICAxMTYsIDE0MCwgNzMsICA5NywgIDExNywgNTYsICA3NiwgIDk0LAorICAgIDM1LCAgNTEsICA2NiwgIDAsICAgMTMsICAyOCwgIDE1OCwgMTk0LCAyMDksIDE0MSwgMTc0LCAxODcsIDEyNSwgMTU1LCAxNjcsCisgICAgMTA5LCAxMzUsIDE0NiwgOTEsICAxMTYsIDEyNSwgNzUsICA5NiwgIDEwNSwgNTcsICA3NSwgIDgzLCAgMzUsICA1MCwgIDU3LAorICAgIDAsICAgMTIsICAyMSwgIDE2MSwgMTkzLCAxODksIDE0NCwgMTczLCAxNjksIDEyOCwgMTU0LCAxNTEsIDExMCwgMTM0LCAxMzIsCisgICAgOTMsICAxMTUsIDExMywgNzcsICA5NSwgIDk0LCAgNTgsICA3NSwgIDc0LCAgMzUsICA1MCwgIDUwLCAgMCwgICAxMiwgIDEzLAorICAgIDE2NCwgMTkyLCAxNjgsIDE0NSwgMTcxLCAxNTEsIDEyOSwgMTUzLCAxMzQsIDExMSwgMTMzLCAxMTcsIDk0LCAgMTE0LCAxMDAsCisgICAgNzYsICA5NSwgIDgyLCAgNTgsICA3NSwgIDY0LCAgMzYsICA1MCwgIDQyLCAgMCwgICAxMiwgIDUsICAgMTY1LCAxOTEsIDE0NywKKyAgICAxNDcsIDE3MCwgMTMxLCAxMzAsIDE1MiwgMTE3LCAxMTMsIDEzMiwgMTAyLCA5NSwgIDExMywgODYsICA3NywgIDk0LCAgNzEsCisgICAgNTgsICA3NCwgIDU0LCAgMzUsICA1MCwgIDMzLCAgMCwgICAxMywgIDAsICAgMTY3LCAxODksIDEyNiwgMTQ4LCAxNjksIDExMywKKyAgICAxMzIsIDE1MSwgMTAwLCAxMTMsIDEzMSwgODYsICA5NiwgIDExMiwgNzMsICA3NywgIDkzLCAgNTksICA1OSwgIDczLCAgNDMsCisgICAgMzUsICA0OSwgIDIzLCAgMCwgICAxMiwgIDAsICAgMTcwLCAxODksIDEwNCwgMTUwLCAxNjgsIDkxLCAgMTMzLCAxNTAsIDgxLAorICAgIDExNCwgMTMwLCA2OSwgIDk2LCAgMTExLCA1NywgIDc4LCAgOTIsICA0NiwgIDU5LCAgNzMsICAzMSwgIDM1LCAgNDksICAxMSwKKyAgICAwLCAgIDEzLCAgMCwgICAxNzEsIDE4OCwgNzgsICAxNTIsIDE2OCwgNjgsICAxMzQsIDE0OSwgNjAsICAxMTUsIDEzMCwgNTAsCisgICAgOTYsICAxMTEsIDQxLCAgNzgsICA5MiwgIDI5LCAgNjAsICA3MywgIDE1LCAgMzUsICA0OSwgIDAsICAgMCwgICAxMiwgIDAsCisgICAgMTczLCAxODcsIDU1LCAgMTUzLCAxNjcsIDQ3LCAgMTM0LCAxNDksIDM5LCAgMTE1LCAxMjksIDMzLCAgOTcsICAxMTAsIDI0LAorICAgIDc5LCAgOTIsICAxMywgIDYwLCAgNzIsICAwLCAgIDM1LCAgNDgsICAwLCAgIDAsICAgMTIsICAwLCAgIDE1NywgMTc1LCAyMTcsCisgICAgMTM5LCAxNTcsIDE5NiwgMTI1LCAxNDEsIDE3NSwgMTA5LCAxMjIsIDE1MywgOTIsICAxMDQsIDEzMiwgNzYsICA4NiwgIDExMCwKKyAgICA1OSwgIDY3LCAgODgsICAzNywgIDQzLCAgNjEsICAxLCAgIDEsICAgMjMsICAxNjEsIDE3NCwgMTk2LCAxNDQsIDE1NiwgMTc2LAorICAgIDEyNywgMTQwLCAxNTgsIDExMCwgMTIxLCAxMzcsIDk0LCAgMTA0LCAxMTgsIDc3LCAgODUsICA5OCwgIDU5LCAgNjcsICA3OCwKKyAgICAzNywgIDQzLCAgNTMsICAwLCAgIDIsICAgMTYsICAxNjMsIDE3NCwgMTc4LCAxNDYsIDE1NiwgMTYwLCAxMzAsIDEzOSwgMTQzLAorICAgIDExMiwgMTIxLCAxMjQsIDk1LCAgMTAzLCAxMDYsIDc4LCAgODUsICA4OCwgIDYwLCAgNjYsICA2OSwgIDM3LCAgNDIsICA0NiwKKyAgICAwLCAgIDIsICAgNywgICAxNjYsIDE3MywgMTU5LCAxNDcsIDE1NCwgMTQyLCAxMzAsIDEzOCwgMTI3LCAxMTMsIDEyMCwgMTExLAorICAgIDk2LCAgMTAzLCA5NSwgIDc4LCAgODQsICA3NywgIDYwLCAgNjYsICA1OSwgIDM3LCAgNDMsICAzNywgIDAsICAgMiwgICAwLAorICAgIDE2NiwgMTcyLCAxMzksIDE0OCwgMTU0LCAxMjUsIDEzMSwgMTM3LCAxMTIsIDExMywgMTIwLCA5NiwgIDk2LCAgMTAyLCA4MSwKKyAgICA3OCwgIDg0LCAgNjYsICA2MCwgIDY1LCAgNTAsICAzNywgIDQyLCAgMjksICAwLCAgIDMsICAgMCwgICAxNjcsIDE3MSwgMTIwLAorICAgIDE0OSwgMTUzLCAxMDcsIDEzMywgMTM3LCA5NSwgIDExNCwgMTE4LCA4MSwgIDk3LCAgMTAxLCA2OSwgIDc5LCAgODQsICA1NiwKKyAgICA2MCwgIDY1LCAgNDAsICAzNywgIDQyLCAgMTksICAwLCAgIDMsICAgMCwgICAxNzAsIDE3MCwgOTksICAxNTEsIDE1MiwgODcsCisgICAgMTM0LCAxMzYsIDc3LCAgMTE1LCAxMTgsIDY2LCAgOTcsICAxMDEsIDU1LCAgNzksICA4MywgIDQyLCAgNjEsICA2NSwgIDI4LAorICAgIDM3LCAgNDIsICA3LCAgIDAsICAgMywgICAwLCAgIDE3MiwgMTcwLCA3NSwgIDE1MiwgMTUxLCA2NSwgIDEzNCwgMTM1LCA1NywKKyAgICAxMTUsIDExNywgNDgsICA5NywgIDEwMCwgMzgsICA3OSwgIDgzLCAgMjcsICA2MSwgIDY0LCAgMTIsICAzNiwgIDQyLCAgMCwKKyAgICAwLCAgIDMsICAgMCwgICAxNzIsIDE2OSwgNTUsICAxNTQsIDE1MSwgNDYsICAxMzUsIDEzNCwgNDAsICAxMTYsIDExNiwgMzIsCisgICAgOTcsICA5OSwgIDIxLCAgODAsICA4MiwgIDEwLCAgNjEsICA2NCwgIDAsICAgMzYsICA0MSwgIDAsICAgMCwgICAzLCAgIDAsCisgICAgMTYwLCAxNTQsIDIwMywgMTQzLCAxMzksIDE4MiwgMTI3LCAxMjQsIDE2NCwgMTExLCAxMDcsIDE0MywgOTUsICA5MSwgIDEyMiwKKyAgICA3OCwgIDc1LCAgMTAzLCA2MCwgIDU3LCAgODEsICAzOSwgIDMzLCAgNTYsICAxLCAgIDAsICAgMTgsICAxNjMsIDE1NCwgMTg0LAorICAgIDE0NiwgMTM4LCAxNjUsIDEzMCwgMTIzLCAxNDgsIDExMywgMTA3LCAxMjksIDk2LCAgOTAsICAxMTAsIDc5LCAgNzQsICA5MiwKKyAgICA2MSwgIDU2LCAgNzIsICAzOSwgIDM0LCAgNDgsICAyLCAgIDAsICAgOSwgICAxNjUsIDE1NCwgMTY3LCAxNDcsIDEzNywgMTQ5LAorICAgIDEzMSwgMTIyLCAxMzQsIDExNCwgMTA2LCAxMTcsIDk2LCAgOTAsICAxMDAsIDc5LCAgNzQsICA4MiwgIDYxLCAgNTYsICA2NCwKKyAgICAzOSwgIDMzLCAgNDAsICAyLCAgIDAsICAgMSwgICAxNjYsIDE1MywgMTUwLCAxNDksIDEzNywgMTMzLCAxMzIsIDEyMiwgMTE5LAorICAgIDExNCwgMTA2LCAxMDQsIDk3LCAgOTAsICA4OCwgIDc5LCAgNzQsICA3MiwgIDYxLCAgNTYsICA1NSwgIDM5LCAgMzQsICAzMywKKyAgICAwLCAgIDAsICAgMCwgICAxNjgsIDE1MiwgMTMyLCAxNDksIDEzNiwgMTE3LCAxMzIsIDEyMSwgMTA0LCAxMTQsIDEwNSwgOTAsCisgICAgOTcsICA4OSwgIDc2LCAgNzksICA3MywgIDYyLCAgNjEsICA1NiwgIDQ2LCAgMzgsICAzNCwgIDI1LCAgMCwgICAwLCAgIDAsCisgICAgMTY5LCAxNTEsIDExNCwgMTUwLCAxMzUsIDEwMSwgMTMzLCAxMjEsIDkwLCAgMTE0LCAxMDQsIDc3LCAgOTcsICA4OSwgIDY1LAorICAgIDgwLCAgNzMsICA1MSwgIDYxLCAgNTYsICAzNiwgIDM4LCAgMzQsICAxNiwgIDAsICAgMCwgICAwLCAgIDE3MCwgMTUwLCA5NCwKKyAgICAxNTEsIDEzNSwgODMsICAxMzQsIDEyMCwgNzMsICAxMTUsIDEwNCwgNjIsICA5OCwgIDg4LCAgNTEsICA4MCwgIDcyLCAgMzksCisgICAgNjEsICA1NiwgIDI0LCAgMzgsICAzNCwgIDMsICAgMCwgICAwLCAgIDAsICAgMTcyLCAxNTAsIDcyLCAgMTUzLCAxMzQsIDYzLAorICAgIDEzNSwgMTE5LCA1NSwgIDExNSwgMTAzLCA0NSwgIDk4LCAgODgsICAzNiwgIDgwLCAgNzIsICAyNCwgIDYxLCAgNTUsICA5LAorICAgIDM4LCAgMzQsICAwLCAgIDAsICAgMCwgICAwLCAgIDE3MiwgMTUwLCA1NCwgIDE1MywgMTM0LCA0NywgIDEzNSwgMTE5LCAzOCwKKyAgICAxMTYsIDEwMywgMzAsICA5OCwgIDg3LCAgMjEsICA4MCwgIDcyLCAgOCwgICA2MiwgIDU1LCAgMCwgICAzNywgIDM0LCAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxNjIsIDEzNCwgMTkwLCAxNDUsIDEyMCwgMTcxLCAxMjksIDEwOCwgMTUzLCAxMTMsIDkzLCAgMTM0LAorICAgIDk3LCAgNzgsICAxMTUsIDgwLCAgNjMsICA5NiwgIDYyLCAgNDYsICA3NSwgIDQxLCAgMjMsICA1MSwgIDAsICAgMCwgICAxMSwKKyAgICAxNjUsIDEzNCwgMTczLCAxNDcsIDEyMCwgMTU0LCAxMzEsIDEwNywgMTM4LCAxMTQsIDkyLCAgMTIwLCA5NywgIDc4LCAgMTAzLAorICAgIDgwLCAgNjMsICA4NSwgIDYyLCAgNDYsICA2NiwgIDQwLCAgMjMsICA0MywgIDAsICAgMCwgICAyLCAgIDE2NiwgMTM0LCAxNTcsCisgICAgMTQ4LCAxMjAsIDE0MCwgMTMyLCAxMDYsIDEyNSwgMTE0LCA5MiwgIDEwOSwgOTcsICA3NywgIDkzLCAgODEsICA2MywgIDc3LAorICAgIDYyLCAgNDYsICA1OCwgIDQwLCAgMjQsICAzNiwgIDAsICAgMCwgICAwLCAgIDE2OCwgMTMzLCAxNDAsIDE0OSwgMTE5LCAxMjUsCisgICAgMTMyLCAxMDYsIDExMiwgMTE1LCA5MiwgIDk3LCAgOTgsICA3NywgIDgyLCAgODEsICA2MiwgIDY3LCAgNjIsICA0NiwgIDUwLAorICAgIDQwLCAgMjQsICAyOSwgIDAsICAgMCwgICAwLCAgIDE2OCwgMTMzLCAxMjMsIDE1MCwgMTE5LCAxMTAsIDEzMywgMTA2LCA5NywKKyAgICAxMTUsIDkxLCAgODQsICA5OCwgIDc3LCAgNzAsICA4MSwgIDYyLCAgNTcsICA2MiwgIDQ2LCAgNDEsICA0MCwgIDI0LCAgMjAsCisgICAgMCwgICAwLCAgIDAsICAgMTY5LCAxMzIsIDEwNywgMTUwLCAxMTgsIDk0LCAgMTMzLCAxMDUsIDg0LCAgMTE1LCA5MSwgIDcyLAorICAgIDk4LCAgNzYsICA2MCwgIDgwLCAgNjIsICA0NywgIDYyLCAgNDYsICAzMiwgIDM5LCAgMjUsICAxMSwgIDAsICAgMCwgICAwLAorICAgIDE3MSwgMTMyLCA4OSwgIDE1MiwgMTE4LCA3OSwgIDEzNSwgMTA1LCA2OSwgIDExNSwgOTAsICA1OCwgIDk4LCAgNzYsICA0NywKKyAgICA4MCwgIDYyLCAgMzYsICA2MiwgIDQ2LCAgMjEsICAzOSwgIDI1LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNzEsIDEzMiwgNjksCisgICAgMTUzLCAxMTcsIDYwLCAgMTM1LCAxMDQsIDUyLCAgMTE2LCA5MCwgIDQyLCAgOTgsICA3NiwgIDMzLCAgODEsICA2MSwgIDIxLAorICAgIDYyLCAgNDYsICA2LCAgIDM4LCAgMjUsICAwLCAgIDAsICAgMCwgICAwLCAgIDE3MiwgMTMyLCA1NCwgIDE1MywgMTE4LCA0NSwKKyAgICAxMzUsIDEwNCwgMzgsICAxMTYsIDkwLCAgMjgsICA5OCwgIDc2LCAgMTgsICA4MSwgIDYxLCAgNiwgICA2MiwgIDQ2LCAgMCwKKyAgICAzOCwgIDI1LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNjQsIDExNSwgMTc3LCAxNDYsIDEwMywgMTU5LCAxMzAsIDkxLCAgMTQzLAorICAgIDExNCwgNzgsICAxMjUsIDk3LCAgNjUsICAxMDcsIDgxLCAgNTEsICA4OSwgIDYzLCAgMzQsICA2OSwgIDQxLCAgOSwgICA0NiwKKyAgICAwLCAgIDAsICAgNCwgICAxNjYsIDExNSwgMTYxLCAxNDgsIDEwMywgMTQ0LCAxMzIsIDkxLCAgMTI5LCAxMTUsIDc4LCAgMTEyLAorICAgIDk4LCAgNjUsICA5NiwgIDgxLCAgNTEsICA3OSwgIDYzLCAgMzUsICA2MSwgIDQxLCAgMTEsICAzOCwgIDAsICAgMCwgICAwLAorICAgIDE2NywgMTE1LCAxNDYsIDE1MCwgMTAyLCAxMzEsIDEzMiwgOTEsICAxMTcsIDExNSwgNzgsICAxMDEsIDk4LCAgNjUsICA4NiwKKyAgICA4MSwgIDUxLCAgNzEsICA2MywgIDM1LCAgNTQsICA0MSwgIDEyLCAgMzIsICAwLCAgIDAsICAgMCwgICAxNjgsIDExNCwgMTMyLAorICAgIDE1MCwgMTAzLCAxMTgsIDEzMywgOTEsICAxMDUsIDExNiwgNzgsICA5MSwgIDk4LCAgNjQsICA3NiwgIDgyLCAgNTEsICA2MSwKKyAgICA2MywgIDM2LCAgNDYsICA0MSwgIDEzLCAgMjQsICAwLCAgIDAsICAgMCwgICAxNjksIDExNCwgMTE2LCAxNTAsIDEwMiwgMTAzLAorICAgIDEzNCwgOTAsICA5MSwgIDExNiwgNzgsICA3OSwgIDk4LCAgNjUsICA2NiwgIDgxLCAgNTEsICA1MywgIDYzLCAgMzYsICAzNywKKyAgICA0MCwgIDE0LCAgMTcsICAwLCAgIDAsICAgMCwgICAxNjksIDExNCwgMTAxLCAxNTEsIDEwMSwgODksICAxMzQsIDkwLCAgNzksCisgICAgMTE2LCA3NywgIDY3LCAgOTgsICA2NCwgIDU2LCAgODEsICA1MSwgIDQ0LCAgNjMsICAzNiwgIDI5LCAgNDAsICAxNSwgIDcsCisgICAgMCwgICAwLCAgIDAsICAgMTcwLCAxMTQsIDg1LCAgMTUyLCAxMDEsIDc1LCAgMTM1LCA5MCwgIDY1LCAgMTE2LCA3NywgIDU0LAorICAgIDk4LCAgNjQsICA0NCwgIDgxLCAgNTEsICAzMiwgIDYzLCAgMzYsICAxNywgIDM5LCAgMTUsICAwLCAgIDAsICAgMCwgICAwLAorICAgIDE3MiwgMTEzLCA2NiwgIDE1MiwgMTAxLCA1OCwgIDEzNSwgODksICA0OSwgIDExNiwgNzcsICA0MCwgIDk5LCAgNjQsICAzMCwKKyAgICA4MSwgIDUxLCAgMTgsICA2MiwgIDM2LCAgMywgICAzOCwgIDE2LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNzEsIDExMywgNTEsCisgICAgMTUzLCAxMDEsIDQ0LCAgMTM2LCA4OSwgIDM2LCAgMTE2LCA3NywgIDI4LCAgOTksICA2NCwgIDE4LCAgODEsICA1MSwgIDUsCisgICAgNjIsICAzNiwgIDAsICAgMzgsICAxNiwgIDAsICAgMCwgICAwLCAgIDAsICAgMTY1LCA5NCwgIDE2NiwgMTQ3LCA4MiwgIDE0NywKKyAgICAxMzIsIDcyLCAgMTMyLCAxMTUsIDYxLCAgMTE1LCA5OCwgIDQ5LCAgOTksICA4MiwgIDM2LCAgODIsICA2NCwgIDE5LCAgNjQsCisgICAgNDIsICAwLCAgIDQxLCAgMCwgICAwLCAgIDAsICAgMTY3LCA5MywgIDE1MCwgMTUwLCA4MywgIDEzNCwgMTMzLCA3MywgIDEyMCwKKyAgICAxMTYsIDYyLCAgMTA0LCA5OSwgIDQ5LCAgODgsICA4MiwgIDM2LCAgNzIsICA2NCwgIDIwLCAgNTUsICA0MSwgIDAsICAgMzMsCisgICAgMCwgICAwLCAgIDAsICAgMTY5LCA5MywgIDEzNywgMTUwLCA4MywgIDEyMiwgMTM0LCA3MywgIDEwOSwgMTE2LCA2MSwgIDk0LAorICAgIDk5LCAgNTAsICA4MCwgIDgyLCAgMzcsICA2NSwgIDY0LCAgMjEsICA0OSwgIDQxLCAgMCwgICAyNywgIDAsICAgMCwgICAwLAorICAgIDE2OSwgOTQsICAxMjMsIDE1MCwgODMsICAxMTAsIDEzMywgNzMsICA5NywgIDExNiwgNjEsICA4MywgIDk5LCAgNTAsICA3MCwKKyAgICA4MiwgIDM4LCAgNTcsICA2MywgIDIzLCAgNDIsICA0MSwgIDAsICAgMjAsICAwLCAgIDAsICAgMCwgICAxNjksIDk0LCAgMTA5LAorICAgIDE1MCwgODQsICA5NywgIDEzNCwgNzMsICA4NSwgIDExNiwgNjIsICA3MywgIDk5LCAgNTEsICA2MSwgIDgxLCAgMzgsICA0OCwKKyAgICA2MywgIDIzLCAgMzMsICA0MSwgIDEsICAgMTEsICAwLCAgIDAsICAgMCwgICAxNzAsIDk0LCAgOTYsICAxNTAsIDgzLCAgODQsCisgICAgMTM0LCA3MywgIDc0LCAgMTE2LCA2MSwgIDYyLCAgOTksICA1MCwgIDUxLCAgODIsICAzOCwgIDM5LCAgNjQsICAyMywgIDI0LAorICAgIDQwLCAgMywgICA0LCAgIDAsICAgMCwgICAwLCAgIDE3MSwgOTMsICA3OSwgIDE1MiwgODIsICA3MCwgIDEzNSwgNzMsICA2MSwKKyAgICAxMTYsIDYyLCAgNTEsICA5OCwgIDUxLCAgNDAsICA4MSwgIDM4LCAgMjgsICA2MywgIDI0LCAgMTQsICAzOSwgIDQsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxNzEsIDk0LCAgNjQsICAxNTIsIDgzLCAgNTUsICAxMzUsIDczLCAgNDcsICAxMTYsIDYyLCAgMzcsCisgICAgOTgsICA1MCwgIDI3LCAgODEsICAzOCwgIDE1LCAgNjMsICAyNCwgIDEsICAgMzksICA0LCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTcyLCA5MywgIDUxLCAgMTUzLCA4MiwgIDQyLCAgMTM1LCA3MywgIDM1LCAgMTE3LCA2MiwgIDI2LCAgOTksICA1MSwgIDE2LAorICAgIDgxLCAgMzksICAzLCAgIDYzLCAgMjUsICAwLCAgIDM4LCAgNSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE2NiwgNjgsICAxNTMsCisgICAgMTQ4LCA1OSwgIDEzNywgMTMzLCA0OSwgIDEyMSwgMTE1LCAzOSwgIDEwNiwgOTksICAyOCwgIDkxLCAgODIsICAxMywgIDc1LAorICAgIDY1LCAgMCwgICA1OCwgIDQyLCAgMCwgICAzNiwgIDAsICAgMCwgICAwLCAgIDE2OCwgNjgsICAxMzksIDE1MCwgNTksICAxMjQsCisgICAgMTM0LCA1MCwgIDExMCwgMTE2LCA0MCwgIDk2LCAgOTksICAzMCwgIDgxLCAgODIsICAxNiwgIDY2LCAgNjQsICAwLCAgIDUwLAorICAgIDQxLCAgMCwgICAyOSwgIDAsICAgMCwgICAwLCAgIDE2OSwgNjksICAxMjYsIDE1MCwgNTksICAxMTMsIDEzNCwgNTEsICAxMDEsCisgICAgMTE3LCA0MiwgIDg3LCAgMTAwLCAzMCwgIDczLCAgODIsICAxNywgIDU5LCAgNjUsICAwLCAgIDQzLCAgNDEsICAwLCAgIDIzLAorICAgIDAsICAgMCwgICAwLCAgIDE2OSwgNzAsICAxMTUsIDE1MCwgNjEsICAxMDIsIDEzNCwgNTIsICA4OSwgIDExNiwgNDIsICA3NywKKyAgICA5OSwgIDMyLCAgNjUsICA4MiwgIDE5LCAgNTIsICA2NCwgIDAsICAgMzYsICA0MSwgIDAsICAgMTUsICAwLCAgIDAsICAgMCwKKyAgICAxNjksIDcwLCAgMTAxLCAxNTAsIDYxLCAgOTAsICAxMzQsIDUyLCAgNzksICAxMTYsIDQzLCAgNjgsICA5OSwgIDMyLCAgNTUsCisgICAgODIsICAyMSwgIDQzLCAgNjQsICAyLCAgIDI4LCAgNDEsICAwLCAgIDYsICAgMCwgICAwLCAgIDAsICAgMTcwLCA3MCwgIDg5LAorICAgIDE1MSwgNjIsICA3OSwgIDEzNCwgNTMsICA2OSwgIDExNiwgNDQsICA1OCwgIDk5LCAgMzMsICA0NiwgIDgxLCAgMjEsICAzNCwKKyAgICA2NCwgIDMsICAgMjAsICA0MSwgIDAsICAgMiwgICAwLCAgIDAsICAgMCwgICAxNzAsIDcxLCAgNzYsICAxNTIsIDYyLCAgNjYsCisgICAgMTM0LCA1MywgIDU3LCAgMTE2LCA0MywgIDQ2LCAgOTksICAzMywgIDM2LCAgODIsICAyMiwgIDI0LCAgNjQsICA1LCAgIDEwLAorICAgIDQwLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE3MSwgNzAsICA2MSwgIDE1MiwgNjIsICA1MiwgIDEzNSwgNTMsICA0NCwKKyAgICAxMTYsIDQ0LCAgMzUsICA5OSwgIDM0LCAgMjQsICA4MiwgIDIyLCAgMTIsICA2MywgIDYsICAgMCwgICAzOSwgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxNzEsIDcxLCAgNDksICAxNTMsIDYyLCAgNDEsICAxMzUsIDU0LCAgMzMsICAxMTcsIDQ1LCAgMjUsCisgICAgOTgsICAzNCwgIDEzLCAgODEsICAyMywgIDAsICAgNjMsICA3LCAgIDAsICAgMzksICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTY3LCAzMywgIDE0MiwgMTQ5LCAyNCwgIDEyNywgMTM0LCAxMCwgIDExMywgMTE2LCAwLCAgIDk3LCAgMTAwLCAwLCAgIDgzLAorICAgIDgzLCAgMCwgICA2OCwgIDY1LCAgMCwgICA1MiwgIDQwLCAgMCwgICAzMCwgIDAsICAgMCwgICAwLCAgIDE2OSwgMzMsICAxMjksCisgICAgMTUwLCAyNiwgIDExNSwgMTM0LCAxNywgIDEwMiwgMTE2LCAzLCAgIDg5LCAgMTAwLCAwLCAgIDc1LCAgODMsICAwLCAgIDYwLAorICAgIDY1LCAgMCwgICA0NSwgIDQwLCAgMCwgICAyNCwgIDAsICAgMCwgICAwLCAgIDE2OSwgMzYsICAxMTgsIDE1MSwgMjcsICAxMDQsCisgICAgMTM0LCAxOSwgIDkzLCAgMTE2LCA3LCAgIDgwLCAgMTAwLCAwLCAgIDY3LCAgODMsICAwLCAgIDU0LCAgNjUsICAwLCAgIDM4LAorICAgIDQxLCAgMCwgICAxNywgIDAsICAgMCwgICAwLCAgIDE2OSwgMzksICAxMDcsIDE1MCwgMzAsICA5NCwgIDEzNCwgMjIsICA4NCwKKyAgICAxMTYsIDExLCAgNzEsICA5OSwgIDAsICAgNTksICA4MywgIDAsICAgNDYsICA2NCwgIDAsICAgMzEsICA0MCwgIDAsICAgOSwKKyAgICAwLCAgIDAsICAgMCwgICAxNjksIDM5LCAgOTUsICAxNTEsIDMxLCAgODMsICAxMzQsIDI0LCAgNzMsICAxMTYsIDE1LCAgNjIsCisgICAgMTAwLCAxLCAgIDUxLCAgODMsICAwLCAgIDM4LCAgNjQsICAwLCAgIDI0LCAgNDAsICAwLCAgIDUsICAgMCwgICAwLCAgIDAsCisgICAgMTY5LCA0MSwgIDgzLCAgMTUxLCAzMywgIDczLCAgMTM0LCAyNiwgIDY0LCAgMTE3LCAxNywgIDU0LCAgOTksICA0LCAgIDQyLAorICAgIDgyLCAgMCwgICAzMCwgIDY0LCAgMCwgICAxNiwgIDQwLCAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDE3MCwgNDIsICA3MSwKKyAgICAxNTIsIDM0LCAgNjIsICAxMzQsIDI4LCAgNTMsICAxMTcsIDE5LCAgNDQsICA5OSwgIDYsICAgMzMsICA4MiwgIDAsICAgMjEsCisgICAgNjMsICAwLCAgIDQsICAgMzksICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTcxLCA0MiwgIDU5LCAgMTUyLCAzNSwgIDUwLAorICAgIDEzNCwgMjksICA0MiwgIDExNywgMjEsICAzMiwgIDk5LCAgOSwgICAyMiwgIDgyLCAgMCwgICA5LCAgIDYzLCAgMCwgICAwLAorICAgIDM4LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE3MiwgNDIsICA0OCwgIDE1MiwgMzYsICA0MCwgIDEzNSwgMjksICAzMiwKKyAgICAxMTcsIDIxLCAgMjMsICA5OSwgIDEwLCAgMTIsICA4MiwgIDAsICAgMCwgICA2MywgIDAsICAgMCwgICAzOCwgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxMDcsIDIwNywgMjQ2LCA5NiwgIDE4NSwgMjIwLCA4NiwgIDE2NSwgMTk2LCA3MywgIDE0NCwgMTcxLAorICAgIDYwLCAgMTIzLCAxNDcsIDQ2LCAgMTAzLCAxMjUsIDMyLCAgODIsICAxMDAsIDksICAgNTYsICA3MSwgIDAsICAgMjAsICAzMywKKyAgICAxMTUsIDIwNiwgMjIxLCAxMDQsIDE4NCwgMTk4LCA5MiwgIDE2NCwgMTc4LCA3OCwgIDE0MywgMTU0LCA2NCwgIDEyMywgMTMzLAorICAgIDUxLCAgMTAyLCAxMTEsIDM0LCAgODEsICA4OSwgIDEwLCAgNTYsICA2MywgIDAsICAgMjAsICAyNywgIDEyMiwgMjA0LCAyMDAsCisgICAgMTA4LCAxODMsIDE4MCwgOTUsICAxNjMsIDE2MSwgODIsICAxNDIsIDE0MCwgNjgsICAxMjIsIDEyMCwgNTQsICAxMDIsIDEwMSwKKyAgICAzNiwgIDgxLCAgNzksICAxMSwgIDU2LCAgNTUsICAwLCAgIDIwLCAgMjAsICAxMjUsIDIwMywgMTc5LCAxMTEsIDE4MSwgMTYwLAorICAgIDk3LCAgMTYyLCAxNDMsIDg1LCAgMTQxLCAxMjQsIDcwLCAgMTIxLCAxMDcsIDU1LCAgMTAxLCA4OSwgIDM4LCAgODAsICA2OSwKKyAgICAxNCwgIDU1LCAgNDYsICAwLCAgIDE5LCAgMTAsICAxMjgsIDIwMiwgMTU2LCAxMTMsIDE4MCwgMTQwLCAxMDIsIDE2MSwgMTI1LAorICAgIDg3LCAgMTQwLCAxMDgsIDcxLCAgMTIwLCA5MiwgIDU2LCAgMTAwLCA3NiwgIDM5LCAgNzksICA1OSwgIDE0LCAgNTUsICAzOCwKKyAgICAwLCAgIDIwLCAgMywgICAxMzIsIDIwMCwgMTM1LCAxMTcsIDE3OSwgMTIxLCAxMDMsIDE1OSwgMTA2LCA4OCwgIDEzOSwgOTMsCisgICAgNzMsICAxMTksIDc5LCAgNTcsICAxMDAsIDY1LCAgNDEsICA3OSwgIDQ5LCAgMTUsICA1NCwgIDI4LCAgMCwgICAxOSwgIDAsCisgICAgMTM0LCAyMDAsIDExMSwgMTE5LCAxNzgsIDk4LCAgMTA1LCAxNTgsIDg3LCAgODksICAxMzgsIDc2LCAgNzQsICAxMTgsIDY0LAorICAgIDU4LCAgOTksICA1MSwgIDQxLCAgNzgsICAzNywgIDE2LCAgNTQsICAxNywgIDAsICAgMTksICAwLCAgIDEzNywgMTk5LCA4NSwKKyAgICAxMjIsIDE3NywgNzUsICAxMDgsIDE1OCwgNjYsICA5MSwgIDEzNywgNTYsICA3NSwgIDExOCwgNDYsICA1OSwgIDk4LCAgMzUsCisgICAgNDIsICA3OCwgIDIyLCAgMTYsICA1NCwgIDMsICAgMCwgICAxOSwgIDAsICAgMTQwLCAxOTgsIDYyLCAgMTI1LCAxNzcsIDU1LAorICAgIDEwOSwgMTU4LCA0NywgIDkyLCAgMTM3LCA0MCwgIDc2LCAgMTE3LCAzMiwgIDU5LCAgOTgsICAyMSwgIDQyLCAgNzgsICA2LAorICAgIDE2LCAgNTQsICAwLCAgIDAsICAgMTgsICAwLCAgIDExOCwgMTg2LCAyMzEsIDEwNiwgMTY3LCAyMDYsIDkzLCAgMTQ5LCAxODQsCisgICAgODEsICAxMzAsIDE2MSwgNjcsICAxMTEsIDEzOSwgNTQsICA5MiwgIDExNywgMzksICA3MiwgIDkzLCAgMTcsICA0OCwgIDY2LAorICAgIDAsICAgMTAsICAyOSwgIDEyMywgMTg1LCAyMDcsIDExMCwgMTY2LCAxODYsIDk4LCAgMTQ4LCAxNjcsIDg1LCAgMTI5LCAxNDUsCisgICAgNzEsICAxMTEsIDEyNSwgNTYsICA5MiwgIDEwNCwgNDAsICA3MiwgIDgzLCAgMTgsICA0OCwgIDU3LCAgMCwgICAxMCwgIDIyLAorICAgIDEyOCwgMTg0LCAxODgsIDExMywgMTY1LCAxNjgsIDEwMiwgMTQ3LCAxNTEsIDg4LCAgMTI4LCAxMzEsIDczLCAgMTEwLCAxMTMsCisgICAgNTgsICA5MSwgIDk0LCAgNDIsICA3MSwgIDc0LCAgMTksICA0OCwgIDUwLCAgMCwgICA5LCAgIDE1LCAgMTMxLCAxODMsIDE2OCwKKyAgICAxMTYsIDE2NCwgMTUxLCAxMDQsIDE0NiwgMTM0LCA4OSwgIDEyNywgMTE3LCA3MywgIDEwOSwgMTAwLCA1OCwgIDkwLCAgODMsCisgICAgNDIsICA3MSwgIDY1LCAgMjAsICA0OCwgIDQyLCAgMCwgICA5LCAgIDUsICAgMTM0LCAxODIsIDE0OCwgMTIwLCAxNjMsIDEzMSwKKyAgICAxMDUsIDE0NSwgMTE4LCA5MCwgIDEyNiwgMTAyLCA3NSwgIDEwOCwgODYsICA1OSwgIDkwLCAgNzIsICA0MywgIDcxLCAgNTUsCisgICAgMTksICA0NywgIDM0LCAgMCwgICA5LCAgIDAsICAgMTM2LCAxODEsIDEyOCwgMTIyLCAxNjIsIDExNSwgMTA3LCAxNDQsIDEwMiwKKyAgICA5MiwgIDEyNSwgODcsICA3NiwgIDEwNywgNzQsICA2MSwgIDg5LCAgNjAsICA0NCwgIDcwLCAgNDUsICAyMCwgIDQ3LCAgMjQsCisgICAgMCwgICA4LCAgIDAsICAgMTM5LCAxODAsIDEwNiwgMTI0LCAxNjEsIDk1LCAgMTA5LCAxNDQsIDgzLCAgOTMsICAxMjQsIDcxLAorICAgIDc3LCAgMTA3LCA2MCwgIDYxLCAgODksICA0NywgIDQ0LCAgNzAsICAzMywgIDIwLCAgNDcsICAxMywgIDAsICAgOCwgICAwLAorICAgIDE0MiwgMTc5LCA4MiwgIDEyNSwgMTYwLCA3MiwgIDExMSwgMTQzLCA2MywgIDk0LCAgMTI0LCA1NCwgIDc3LCAgMTA2LCA0NCwKKyAgICA2MSwgIDg4LCAgMzIsICA0NCwgIDY5LCAgMTgsICAyMCwgIDQ2LCAgMCwgICAwLCAgIDgsICAgMCwgICAxNDMsIDE3OSwgNjIsCisgICAgMTI3LCAxNjAsIDU0LCAgMTExLCAxNDIsIDQ3LCAgOTQsICAxMjQsIDM5LCAgNzgsICAxMDYsIDI5LCAgNjIsICA4OCwgIDE4LAorICAgIDQ1LCAgNjksICAzLCAgIDIwLCAgNDYsICAwLCAgIDAsICAgOCwgICAwLCAgIDEyNCwgMTY3LCAyMTYsIDExMiwgMTUwLCAxOTQsCisgICAgOTksICAxMzQsIDE3NCwgODcsICAxMTcsIDE1MywgNzMsICAxMDAsIDEzMSwgNTgsICA4MiwgIDExMCwgNDMsICA2NCwgIDg4LAorICAgIDIzLCAgNDAsICA2MSwgIDAsICAgMCwgICAyNCwgIDEyOSwgMTY2LCAxOTUsIDExNiwgMTUwLCAxNzUsIDEwMywgMTM0LCAxNTgsCisgICAgODksICAxMTYsIDEzNywgNzUsICA5OSwgIDExOCwgNjAsICA4MiwgIDk4LCAgNDQsICA2MywgIDc4LCAgMjMsICA0MCwgIDUzLAorICAgIDAsICAgMCwgICAxNywgIDEzMiwgMTY2LCAxNzcsIDExOSwgMTQ5LCAxNjAsIDEwNiwgMTMzLCAxNDMsIDkwLCAgMTE1LCAxMjQsCisgICAgNzYsICA5OSwgIDEwNywgNjEsICA4MSwgIDg4LCAgNDUsICA2MywgIDY5LCAgMjQsICA0MCwgIDQ2LCAgMCwgICAwLCAgIDksCisgICAgMTM2LCAxNjYsIDE1OSwgMTIxLCAxNDgsIDE0MywgMTA3LCAxMzIsIDEyNiwgOTIsICAxMTUsIDExMSwgNzcsICA5OCwgIDk0LAorICAgIDYyLCAgODEsICA3OCwgIDQ2LCAgNjMsICA2MCwgIDIzLCAgNDAsICAzOCwgIDAsICAgMCwgICAwLCAgIDEzOCwgMTY0LCAxNDAsCisgICAgMTIyLCAxNDcsIDEyNSwgMTA4LCAxMzEsIDExMSwgOTMsICAxMTQsIDk3LCAgNzksICA5OCwgIDgyLCAgNjMsICA4MCwgIDY3LAorICAgIDQ2LCAgNjIsICA1MCwgIDI0LCAgNDAsICAyOSwgIDAsICAgMCwgICAwLCAgIDEzOSwgMTYzLCAxMjIsIDEyNCwgMTQ2LCAxMDksCisgICAgMTEwLCAxMzEsIDk2LCAgOTQsICAxMTQsIDgzLCAgNzksICA5NywgIDcwLCAgNjMsICA4MSwgIDU3LCAgNDYsICA2MiwgIDQxLAorICAgIDI0LCAgNDAsICAyMSwgIDAsICAgMCwgICAwLCAgIDE0MSwgMTYzLCAxMDEsIDEyNiwgMTQ1LCA5MCwgIDExMSwgMTMwLCA3OSwKKyAgICA5NSwgIDExMywgNjgsICA3OSwgIDk2LCAgNTYsICA2MywgIDgwLCAgNDQsICA0NywgIDYyLCAgMzAsICAyMywgIDQwLCAgMTAsCisgICAgMCwgICAwLCAgIDAsICAgMTQ0LCAxNjIsIDc5LCAgMTI3LCAxNDUsIDcwLCAgMTEyLCAxMjksIDYwLCAgOTUsICAxMTIsIDUxLAorICAgIDc5LCAgOTYsICA0MSwgIDY0LCAgNzksICAzMCwgIDQ3LCAgNjEsICAxNSwgIDIzLCAgNDAsICAwLCAgIDAsICAgMCwgICAwLAorICAgIDE0NSwgMTYyLCA2MCwgIDEyOSwgMTQ1LCA1MiwgIDExMywgMTI5LCA0NiwgIDk2LCAgMTEyLCAzNywgIDc5LCAgOTUsICAyNywKKyAgICA2NCwgIDc5LCAgMTYsICA0NywgIDYxLCAgMSwgICAyMywgIDM5LCAgMCwgICAwLCAgIDAsICAgMCwgICAxMzEsIDE0NywgMjAyLAorICAgIDExNywgMTMzLCAxODEsIDEwNSwgMTE5LCAxNjIsIDkxLCAgMTAzLCAxNDIsIDc3LCAgODcsICAxMjIsIDYyLCAgNzEsICAxMDIsCisgICAgNDcsICA1NCwgIDgxLCAgMjYsICAzMSwgIDU2LCAgMCwgICAwLCAgIDE4LCAgMTM1LCAxNDcsIDE4MywgMTIwLCAxMzIsIDE2NCwKKyAgICAxMDcsIDExOCwgMTQ3LCA5MywgIDEwMiwgMTI4LCA3OCwgIDg3LCAgMTEwLCA2MywgIDcxLCAgOTIsICA0NywgIDU0LCAgNzIsCisgICAgMjYsICAzMSwgIDQ4LCAgMCwgICAwLCAgIDEwLCAgMTM4LCAxNDcsIDE2NiwgMTIzLCAxMzEsIDE0OSwgMTA4LCAxMTgsIDEzMywKKyAgICA5NCwgIDEwMiwgMTE2LCA3OSwgIDg2LCAgMTAwLCA2NCwgIDcxLCAgODIsICA0OCwgIDU0LCAgNjQsICAyNywgIDMxLCAgNDEsCisgICAgMCwgICAwLCAgIDIsICAgMTM5LCAxNDYsIDE0OSwgMTI0LCAxMzEsIDEzNCwgMTExLCAxMTcsIDExOSwgOTQsICAxMDEsIDEwMywKKyAgICA3OSwgIDg2LCAgODgsICA2NCwgIDcwLCAgNzIsICA0OCwgIDUzLCAgNTUsICAyNywgIDMxLCAgMzMsICAwLCAgIDAsICAgMCwKKyAgICAxNDEsIDE0NiwgMTMyLCAxMjUsIDEzMSwgMTE3LCAxMTEsIDExNywgMTA0LCA5NSwgIDEwMSwgOTEsICA4MCwgIDg2LCAgNzcsCisgICAgNjUsICA3MCwgIDYyLCAgNDgsICA1MywgIDQ2LCAgMjYsICAzMSwgIDI1LCAgMCwgICAwLCAgIDAsICAgMTQzLCAxNDUsIDExNSwKKyAgICAxMjYsIDEzMCwgMTAxLCAxMTIsIDExNiwgOTAsICA5NiwgIDEwMCwgNzgsICA4MCwgIDg1LCAgNjUsICA2NSwgIDcwLCAgNTIsCisgICAgNDksICA1MywgIDM3LCAgMjcsICAzMiwgIDE3LCAgMCwgICAwLCAgIDAsICAgMTQ0LCAxNDQsIDk2LCAgMTI4LCAxMjksIDg1LAorICAgIDExMiwgMTE1LCA3NSwgIDk3LCAgMTAwLCA2NCwgIDgxLCAgODUsICA1MiwgIDY1LCAgNjksICA0MCwgIDQ5LCAgNTMsICAyNiwKKyAgICAyNiwgIDMxLCAgNSwgICAwLCAgIDAsICAgMCwgICAxNDYsIDE0NCwgNzYsICAxMjksIDEyOSwgNjcsICAxMTQsIDExNSwgNTgsCisgICAgOTcsICA5OSwgIDQ4LCAgODIsICA4NCwgIDM4LCAgNjYsICA2OSwgIDI3LCAgNDksICA1MywgIDEyLCAgMjYsICAzMiwgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTQ2LCAxNDQsIDU5LCAgMTMwLCAxMjgsIDUxLCAgMTE0LCAxMTQsIDQzLCAgOTgsICA5OSwgIDM1LAorICAgIDgyLCAgODQsICAyNSwgIDY2LCAgNjksICAxMywgIDQ5LCAgNTMsICAwLCAgIDI2LCAgMzIsICAwLCAgIDAsICAgMCwgICAwLAorICAgIDEzNSwgMTI5LCAxODksIDEyMiwgMTE1LCAxNzAsIDEwNywgMTAzLCAxNTIsIDk0LCAgODksICAxMzMsIDc5LCAgNzQsICAxMTQsCisgICAgNjQsICA2MCwgIDk1LCAgNDksICA0MywgIDc1LCAgMjksICAyMCwgIDUxLCAgMCwgICAwLCAgIDEyLCAgMTM4LCAxMjksIDE3MSwKKyAgICAxMjQsIDExNSwgMTUzLCAxMTAsIDEwMywgMTM4LCA5NSwgIDg5LCAgMTIwLCA4MSwgIDc0LCAgMTAzLCA2NiwgIDYwLCAgODYsCisgICAgNTAsICA0NCwgIDY3LCAgMjgsICAyMSwgIDQzLCAgMCwgICAwLCAgIDMsICAgMTQwLCAxMjksIDE1NiwgMTI1LCAxMTUsIDE0MCwKKyAgICAxMTEsIDEwMywgMTI1LCA5NiwgIDg5LCAgMTA5LCA4MSwgIDc0LCAgOTMsICA2NywgIDYwLCAgNzYsICA1MCwgIDQ0LCAgNTksCisgICAgMjksICAyMiwgIDM2LCAgMCwgICAwLCAgIDAsICAgMTQyLCAxMjgsIDE0MCwgMTI3LCAxMTUsIDEyNSwgMTEyLCAxMDIsIDExMiwKKyAgICA5NywgIDg4LCAgOTcsICA4MiwgIDc0LCAgODMsICA2NywgIDYwLCAgNjcsICA1MCwgIDQ0LCAgNTEsICAyOSwgIDIyLCAgMjksCisgICAgMCwgICAwLCAgIDAsICAgMTQyLCAxMjgsIDEyNCwgMTI3LCAxMTQsIDExMSwgMTEzLCAxMDIsIDk4LCAgOTgsICA4OCwgIDg1LAorICAgIDgyLCAgNzQsICA3MSwgIDY2LCAgNjAsICA1OCwgIDUwLCAgNDQsICA0MiwgIDI5LCAgMjIsICAyMSwgIDAsICAgMCwgICAwLAorICAgIDE0NCwgMTI3LCAxMDgsIDEyOCwgMTE0LCA5NiwgIDExMywgMTAxLCA4NSwgIDk4LCAgODcsICA3MywgIDgyLCAgNzQsICA2MSwKKyAgICA2NywgIDYwLCAgNDgsICA1MCwgIDQ0LCAgMzMsICAyOCwgIDIzLCAgMTIsICAwLCAgIDAsICAgMCwgICAxNDUsIDEyNywgOTEsCisgICAgMTI5LCAxMTQsIDgxLCAgMTE1LCAxMDEsIDcxLCAgOTgsICA4NywgIDYwLCAgODIsICA3MywgIDQ4LCAgNjcsICA1OSwgIDM3LAorICAgIDUwLCAgNDQsICAyMiwgIDI5LCAgMjMsICAxLCAgIDAsICAgMCwgICAwLCAgIDE0NywgMTI3LCA3MywgIDEzMCwgMTEzLCA2MywKKyAgICAxMTUsIDEwMSwgNTUsICA5OCwgIDg3LCAgNDUsICA4MywgIDczLCAgMzUsICA2NywgIDU5LCAgMjQsICA1MCwgIDQ0LCAgMTAsCisgICAgMjgsICAyNCwgIDAsICAgMCwgICAwLCAgIDAsICAgMTQ3LCAxMjcsIDU4LCAgMTMxLCAxMTMsIDQ5LCAgMTE1LCAxMDAsIDQyLAorICAgIDk5LCAgODYsICAzMywgIDgzLCAgNzMsICAyMywgIDY3LCAgNTksICAxMCwgIDUwLCAgNDQsICAwLCAgIDI3LCAgMjQsICAwLAorICAgIDAsICAgMCwgICAwLCAgIDEzOCwgMTEwLCAxNzcsIDEyNCwgOTksICAxNTksIDExMCwgODgsICAxNDIsIDk2LCAgNzUsICAxMjUsCisgICAgODIsICA2MiwgIDEwNywgNjYsICA0OCwgIDg5LCAgNTEsICAzMywgIDcwLCAgMzAsICA4LCAgIDQ2LCAgMCwgICAwLCAgIDUsCisgICAgMTQyLCAxMTEsIDE2MCwgMTI3LCA5OSwgIDE0NCwgMTEzLCA4OCwgIDEzMCwgOTgsICA3NSwgIDExMiwgODIsICA2MiwgIDk2LAorICAgIDY4LCAgNDksICA4MCwgIDUxLCAgMzMsICA2MSwgIDMwLCAgMTAsICAzOSwgIDAsICAgMCwgICAwLCAgIDE0MywgMTExLCAxNDYsCisgICAgMTI4LCA5OSwgIDEzMSwgMTE0LCA4OCwgIDExOCwgOTgsICA3NSwgIDEwMSwgODMsICA2MiwgIDg2LCAgNjgsICA0OSwgIDcxLAorICAgIDUyLCAgMzMsICA1NCwgIDMwLCAgMTEsICAzMiwgIDAsICAgMCwgICAwLCAgIDE0NCwgMTExLCAxMzIsIDEyOCwgOTksICAxMTgsCisgICAgMTEzLCA4OCwgIDEwNiwgOTksICA3NSwgIDkxLCAgODMsICA2MiwgIDc3LCAgNjgsICA0OSwgIDYyLCAgNTIsICAzNCwgIDQ2LAorICAgIDMwLCAgMTIsICAyNSwgIDAsICAgMCwgICAwLCAgIDE0NCwgMTExLCAxMTcsIDEyOSwgOTgsICAxMDQsIDExNCwgODcsICA5MiwKKyAgICA5OSwgIDc1LCAgODAsICA4MywgIDYyLCAgNjcsICA2OCwgIDQ5LCAgNTMsICA1MSwgIDM0LCAgMzgsICAzMCwgIDEzLCAgMTgsCisgICAgMCwgICAwLCAgIDAsICAgMTQ1LCAxMTEsIDEwMywgMTMwLCA5OCwgIDkxLCAgMTE0LCA4NywgIDgwLCAgOTksICA3NSwgIDY4LAorICAgIDgzLCAgNjMsICA1NywgIDY4LCAgNTAsICA0NSwgIDUxLCAgMzQsICAzMCwgIDMwLCAgMTQsICA4LCAgIDAsICAgMCwgICAwLAorICAgIDE0NiwgMTEwLCA4NywgIDEzMSwgOTgsICA3NiwgIDExNSwgODcsICA2NywgIDk5LCAgNzUsICA1NiwgIDgzLCAgNjIsICA0NSwKKyAgICA2OCwgIDQ5LCAgMzMsICA1MiwgIDM1LCAgMTksICAzMCwgIDE1LCAgMiwgICAwLCAgIDAsICAgMCwgICAxNDgsIDExMCwgNzAsCisgICAgMTMxLCA5OCwgIDYwLCAgMTE2LCA4NiwgIDUyLCAgOTksICA3NCwgIDQzLCAgODQsICA2MiwgIDMzLCAgNjksICA0OSwgIDIxLAorICAgIDUyLCAgMzUsICA2LCAgIDI5LCAgMTUsICAwLCAgIDAsICAgMCwgICAwLCAgIDE0OCwgMTEwLCA1NiwgIDEzMiwgOTcsICA0OCwKKyAgICAxMTcsIDg3LCAgNDAsICAxMDAsIDc1LCAgMzEsICA4NCwgIDYyLCAgMjIsICA2OCwgIDQ5LCAgOSwgICA1MSwgIDM1LCAgMCwKKyAgICAyOCwgIDE1LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNDIsIDkxLCAgMTY2LCAxMjYsIDgwLCAgMTQ4LCAxMTMsIDcxLCAgMTMyLAorICAgIDk4LCAgNTksICAxMTUsIDgzLCAgNDcsICA5OSwgIDY5LCAgMzQsICA4MiwgIDUzLCAgMTcsICA2NCwgIDMyLCAgMCwgICA0MSwKKyAgICAwLCAgIDAsICAgMCwgICAxNDMsIDkxLCAgMTUwLCAxMjgsIDgxLCAgMTM1LCAxMTQsIDcxLCAgMTIwLCA5OSwgIDYwLCAgMTA0LAorICAgIDg1LCAgNDgsICA4OSwgIDY5LCAgMzUsICA3MywgIDUzLCAgMTksICA1NiwgIDMyLCAgMCwgICAzNCwgIDAsICAgMCwgICAwLAorICAgIDE0NSwgOTEsICAxMzcsIDEyOSwgODEsICAxMjIsIDExNSwgNzEsICAxMDksIDEwMCwgNjAsICA5NCwgIDg1LCAgNDgsICA4MSwKKyAgICA2OSwgIDM1LCAgNjUsICA1MywgIDE5LCAgNDksICAzMiwgIDAsICAgMjgsICAwLCAgIDAsICAgMCwgICAxNDYsIDkyLCAgMTI0LAorICAgIDEzMCwgODEsICAxMTAsIDExNSwgNzEsICA5OCwgIDEwMCwgNjAsICA4NCwgIDg1LCAgNDksICA3MSwgIDY5LCAgMzYsICA1NywKKyAgICA1MywgIDIxLCAgNDIsICAzMiwgIDAsICAgMjEsICAwLCAgIDAsICAgMCwgICAxNDcsIDkxLCAgMTEwLCAxMzAsIDgxLCAgOTcsCisgICAgMTE1LCA3MSwgIDg2LCAgMTAwLCA2MCwgIDc0LCAgODQsICA0OSwgIDYyLCAgNjksICAzNiwgIDQ4LCAgNTMsICAyMiwgIDM0LAorICAgIDMyLCAgMCwgICAxMywgIDAsICAgMCwgICAwLCAgIDE0NywgOTIsICA5NywgIDEzMCwgODEsICA4NSwgIDExNiwgNzIsICA3NiwKKyAgICAxMDAsIDYwLCAgNjMsICA4NSwgIDQ5LCAgNTIsICA2OSwgIDM3LCAgNDAsICA1MywgIDIyLCAgMjYsICAzMSwgIDEsICAgNSwKKyAgICAwLCAgIDAsICAgMCwgICAxNDgsIDkyLCAgODIsICAxMzEsIDgxLCAgNzEsICAxMTYsIDcxLCAgNjIsICAxMDAsIDYwLCAgNTMsCisgICAgODQsICA0OSwgIDQyLCAgNjksICAzNywgIDMwLCAgNTIsICAyMywgIDE2LCAgMzEsICAyLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTQ4LCA5MSwgIDY3LCAgMTMyLCA4MSwgIDU3LCAgMTE3LCA3MSwgIDQ5LCAgMTAwLCA2MCwgIDM5LCAgODQsICA0OSwgIDMwLAorICAgIDY5LCAgMzcsICAxOCwgIDUyLCAgMjMsICAyLCAgIDMwLCAgMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE0OSwgOTEsICA1NCwKKyAgICAxMzIsIDgxLCAgNDYsICAxMTgsIDcxLCAgMzksICAxMDEsIDYwLCAgMjksICA4NSwgIDQ5LCAgMTksICA2OSwgIDM3LCAgNiwKKyAgICA1MiwgIDIzLCAgMCwgICAyOSwgIDMsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNDMsIDY4LCAgMTUzLCAxMjgsIDU5LCAgMTM3LAorICAgIDExNSwgNDksICAxMjIsIDk5LCAgMzksICAxMDcsIDg1LCAgMjgsICA5MSwgIDcwLCAgMTMsICA3NSwgIDU0LCAgMCwgICA1OCwKKyAgICAzMiwgIDAsICAgMzYsICAwLCAgIDAsICAgMCwgICAxNDYsIDY4LCAgMTQwLCAxMzEsIDU5LCAgMTI1LCAxMTYsIDUxLCAgMTExLAorICAgIDEwMCwgNDAsICA5NywgIDg1LCAgMjksICA4MiwgIDcwLCAgMTUsICA2NywgIDU0LCAgMCwgICA1MCwgIDMyLCAgMCwgICAyOSwKKyAgICAwLCAgIDAsICAgMCwgICAxNDcsIDY4LCAgMTI3LCAxMzEsIDU5LCAgMTE0LCAxMTcsIDUxLCAgMTAyLCAxMDEsIDQxLCAgODgsCisgICAgODYsICAzMCwgIDc0LCAgNzAsICAxNywgIDYwLCAgNTQsICAwLCAgIDQ0LCAgMzIsICAwLCAgIDIzLCAgMCwgICAwLCAgIDAsCisgICAgMTQ3LCA3MCwgIDExNSwgMTMxLCA2MCwgIDEwMywgMTE2LCA1MiwgIDkxLCAgMTAwLCA0MiwgIDc4LCAgODUsICAzMiwgIDY1LAorICAgIDcwLCAgMTksICA1MywgIDU0LCAgMSwgICAzOCwgIDMyLCAgMCwgICAxNywgIDAsICAgMCwgICAwLCAgIDE0NywgNzAsICAxMDMsCisgICAgMTMxLCA2MSwgIDkxLCAgMTE3LCA1MywgIDgxLCAgMTAxLCA0MywgIDY5LCAgODYsICAzMiwgIDU3LCAgNzAsICAyMCwgIDQ0LAorICAgIDU0LCAgMiwgICAzMCwgIDMyLCAgMCwgICA3LCAgIDAsICAgMCwgICAwLCAgIDE0OCwgNzAsICA5MSwgIDEzMiwgNjEsICA4MCwKKyAgICAxMTcsIDUyLCAgNzAsICAxMDEsIDQzLCAgNTksICA4NSwgIDMzLCAgNDgsICA3MCwgIDIxLCAgMzYsICA1MywgIDQsICAgMjIsCisgICAgMzIsICAwLCAgIDMsICAgMCwgICAwLCAgIDAsICAgMTQ4LCA3MCwgIDc4LCAgMTMyLCA2MiwgIDY4LCAgMTE3LCA1MywgIDU4LAorICAgIDEwMSwgNDMsICA0OCwgIDg1LCAgMzQsICAzOCwgIDcwLCAgMjIsICAyNiwgIDUzLCAgNiwgICAxMiwgIDMxLCAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDE0OSwgNzEsICA2NCwgIDEzMiwgNjIsICA1NCwgIDExOCwgNTQsICA0NiwgIDEwMSwgNDQsICAzNywKKyAgICA4NSwgIDM0LCAgMjcsICA2OSwgIDIzLCAgMTUsICA1MywgIDcsICAgMSwgICAzMCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxNTAsIDcwLCAgNTMsICAxMzQsIDYxLCAgNDQsICAxMTgsIDU0LCAgMzYsICAxMDEsIDQ0LCAgMjgsICA4NSwgIDM1LCAgMTcsCisgICAgNjksICAyMywgIDQsICAgNTIsICA4LCAgIDAsICAgMzAsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTQ1LCAzOCwgIDE0MywKKyAgICAxMzAsIDI5LCAgMTI4LCAxMTcsIDE4LCAgMTE0LCAxMDEsIDMsICAgOTgsICA4NywgIDAsICAgODQsICA3MiwgIDAsICAgNjksCisgICAgNTQsICAwLCAgIDUzLCAgMzAsICAwLCAgIDMxLCAgMCwgICAwLCAgIDAsICAgMTQ3LCAzOCwgIDEzMCwgMTMyLCAzMCwgIDExNiwKKyAgICAxMTcsIDIyLCAgMTAzLCAxMDEsIDgsICAgODksICA4NywgIDAsICAgNzYsICA3MiwgIDAsICAgNjIsICA1NCwgIDAsICAgNDYsCisgICAgMzAsICAwLCAgIDI0LCAgMCwgICAwLCAgIDAsICAgMTQ4LCA0MCwgIDExOSwgMTMyLCAzMSwgIDEwNSwgMTE3LCAyMywgIDk0LAorICAgIDEwMSwgMTMsICA4MSwgIDg3LCAgMCwgICA2OCwgIDcxLCAgMCwgICA1NSwgIDU0LCAgMCwgICAzOSwgIDMwLCAgMCwgICAxOCwKKyAgICAwLCAgIDAsICAgMCwgICAxNDgsIDQyLCAgMTA4LCAxMzIsIDM0LCAgOTYsICAxMTcsIDI1LCAgODUsICAxMDIsIDE1LCAgNzMsCisgICAgODYsICAyLCAgIDYwLCAgNzEsICAwLCAgIDQ3LCAgNTQsICAwLCAgIDMzLCAgMzAsICAwLCAgIDExLCAgMCwgICAwLCAgIDAsCisgICAgMTQ4LCA0MywgIDk2LCAgMTMzLCAzNSwgIDg1LCAgMTE3LCAyOCwgIDc1LCAgMTAyLCAxOCwgIDY0LCAgODcsICA1LCAgIDUyLAorICAgIDcxLCAgMCwgICA0MCwgIDU0LCAgMCwgICAyNSwgIDMwLCAgMCwgICA1LCAgIDAsICAgMCwgICAwLCAgIDE0OSwgNDQsICA4NSwKKyAgICAxMzIsIDM2LCAgNzUsICAxMTgsIDI5LCAgNjYsICAxMDEsIDIwLCAgNTUsICA4NiwgIDgsICAgNDQsICA3MCwgIDAsICAgMzIsCisgICAgNTMsICAwLCAgIDE4LCAgMjksICAwLCAgIDIsICAgMCwgICAwLCAgIDAsICAgMTQ5LCA0NSwgIDc0LCAgMTMzLCAzNywgIDY0LAorICAgIDExOCwgMzEsICA1NSwgIDEwMiwgMjEsICA0NSwgIDg1LCAgMTAsICAzNCwgIDcwLCAgMCwgICAyMiwgIDUzLCAgMCwgICA2LAorICAgIDI4LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE1MCwgNDYsICA2MSwgIDEzMywgMzksICA1MiwgIDExOCwgMzEsICA0NCwKKyAgICAxMDIsIDIzLCAgMzQsICA4NSwgIDEyLCAgMjQsICA3MCwgIDAsICAgMTIsICA1MiwgIDAsICAgMCwgICAyOCwgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxNTAsIDQ2LCAgNTEsICAxMzMsIDQwLCAgNDIsICAxMTksIDMyLCAgMzUsICAxMDIsIDI0LCAgMjUsCisgICAgODUsICAxMywgIDE0LCAgNzAsICAwLCAgIDEsICAgNTIsICAwLCAgIDAsICAgMjcsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgNTMsICAxOTgsIDI0NCwgNDksICAxNzcsIDIxOCwgNDEsICAxNTgsIDE5NSwgMzIsICAxMzgsIDE3MSwgMjIsICAxMTgsIDE0NywKKyAgICAxMSwgIDk4LCAgMTI0LCAwLCAgIDc4LCAgMTAwLCAwLCAgIDU0LCAgNzEsICAwLCAgIDE4LCAgMzQsICA2OSwgIDE5NiwgMjIwLAorICAgIDY0LCAgMTc1LCAxOTYsIDU0LCAgMTU3LCAxNzYsIDQ1LCAgMTM3LCAxNTQsIDMyLCAgMTE3LCAxMzMsIDE5LCAgOTgsICAxMTEsCisgICAgMCwgICA3OCwgIDg5LCAgMCwgICA1MywgIDYzLCAgMCwgICAxNywgIDI3LCAgODAsICAxOTUsIDE5OCwgNjksICAxNzUsIDE3OSwKKyAgICA2MCwgIDE1NiwgMTU5LCA1MCwgIDEzNiwgMTM5LCAzOCwgIDExNiwgMTIwLCAyNSwgIDk4LCAgMTAxLCA0LCAgIDc3LCAgODAsCisgICAgMCwgICA1MywgIDU1LCAgMCwgICAxNywgIDIxLCAgODQsICAxOTMsIDE3NywgNzUsICAxNzMsIDE1OSwgNjQsICAxNTUsIDE0MiwKKyAgICA1NSwgIDEzNSwgMTI0LCA0MSwgIDExNiwgMTA3LCAyNywgIDk3LCAgODksICA5LCAgIDc2LCAgNzAsICAwLCAgIDUzLCAgNDcsCisgICAgMCwgICAxNywgIDExLCAgODksICAxOTMsIDE1NywgNzksICAxNzIsIDE0MCwgNzAsICAxNTQsIDEyNSwgNTcsICAxMzQsIDEwOSwKKyAgICA0NCwgIDExNSwgOTIsICAzMiwgIDk2LCAgNzYsICAxMywgIDc2LCAgNTksICAwLCAgIDUyLCAgMzksICAwLCAgIDE2LCAgNCwKKyAgICA5NCwgIDE5MSwgMTM1LCA4NSwgIDE3MSwgMTIxLCA3MiwgIDE1MiwgMTA4LCA2MCwgIDEzMywgOTQsICA0NywgIDExNCwgODAsCisgICAgMzIsICA5NSwgIDY1LCAgMTUsICA3NiwgIDQ5LCAgMCwgICA1MiwgIDI5LCAgMCwgICAxNiwgIDAsICAgOTgsICAxOTAsIDExMywKKyAgICA4NywgIDE3MCwgMTAwLCA3NiwgIDE1MiwgODksICA2MiwgIDEzMiwgNzcsICA0OSwgIDExMywgNjUsICAzNSwgIDk1LCAgNTIsCisgICAgMTgsICA3NSwgIDM3LCAgMCwgICA1MiwgIDE4LCAgMCwgICAxNSwgIDAsICAgMTAzLCAxOTAsIDg5LCAgOTAsICAxNjksIDgwLAorICAgIDc4LCAgMTUxLCA3MCwgIDY0LCAgMTMyLCA2MCwgIDUxLCAgMTEzLCA0OSwgIDM3LCAgOTQsICAzOCwgIDIwLCAgNzUsICAyNSwKKyAgICAwLCAgIDUyLCAgNSwgICAwLCAgIDE1LCAgMCwgICAxMDYsIDE4OSwgNjksICA5MywgIDE2OSwgNjEsICA4MCwgIDE1MSwgNTMsCisgICAgNjYsICAxMzEsIDQ1LCAgNTIsICAxMTMsIDM2LCAgMzcsICA5NCwgIDI1LCAgMTksICA3NCwgIDExLCAgMCwgICA1MSwgIDAsCisgICAgMCwgICAxNSwgIDAsICAgNzYsICAxNzgsIDIyOSwgNjgsICAxNTksIDIwNSwgNjEsICAxNDIsIDE4MywgNTAsICAxMjQsIDE2MCwKKyAgICA0MCwgIDEwNiwgMTM4LCAyOCwgIDg4LCAgMTE2LCAxMiwgIDY5LCAgOTMsICAwLCAgIDQ1LCAgNjYsICAwLCAgIDUsICAgMjksCisgICAgODYsICAxNzcsIDIwNywgNzgsICAxNTgsIDE4NCwgNjcsICAxNDIsIDE2NiwgNTYsICAxMjMsIDE0NSwgNDUsICAxMDYsIDEyNSwKKyAgICAzMSwgIDg4LCAgMTA1LCAxNiwgIDY5LCAgODMsICAwLCAgIDQ1LCAgNTgsICAwLCAgIDYsICAgMjIsICA5MywgIDE3NiwgMTg3LAorICAgIDgxLCAgMTU4LCAxNjgsIDcxLCAgMTQxLCAxNTAsIDYxLCAgMTIzLCAxMzEsIDQ3LCAgMTA1LCAxMTMsIDM1LCAgODcsICA5NCwKKyAgICAyMCwgIDY4LCAgNzQsICAwLCAgIDQ1LCAgNTEsICAwLCAgIDUsICAgMTYsICA5OCwgIDE3NSwgMTY4LCA4NCwgIDE1NywgMTUwLAorICAgIDc1LCAgMTQwLCAxMzQsIDYzLCAgMTIyLCAxMTcsIDUwLCAgMTA0LCAxMDAsIDM3LCAgODcsICA4MywgIDIxLCAgNjgsICA2NSwKKyAgICAwLCAgIDQ1LCAgNDIsICAwLCAgIDQsICAgNywgICAxMDAsIDE3NCwgMTQ5LCA4OSwgIDE1NSwgMTMyLCA3NiwgIDEzOSwgMTE3LAorICAgIDY1LCAgMTIxLCAxMDIsIDUzLCAgMTA0LCA4NywgIDM5LCAgODYsICA3MiwgIDIzLCAgNjcsICA1NSwgIDAsICAgNDUsICAzNCwKKyAgICAwLCAgIDMsICAgMCwgICAxMDMsIDE3MywgMTMwLCA5MiwgIDE1NSwgMTE1LCA4MCwgIDEzOCwgMTAyLCA2OCwgIDEyMCwgODgsCisgICAgNTMsICAxMDMsIDc1LCAgNDAsICA4NiwgIDYxLCAgMjQsICA2NywgIDQ1LCAgMCwgICA0NSwgIDI1LCAgMCwgICAzLCAgIDAsCisgICAgMTA3LCAxNzIsIDEwOCwgOTUsICAxNTQsIDk2LCAgODIsICAxMzcsIDg1LCAgNzAsICAxMTksIDczLCAgNTUsICAxMDIsIDYxLAorICAgIDQyLCAgODUsICA0OSwgIDI1LCAgNjcsICAzNCwgIDAsICAgNDUsICAxNCwgIDAsICAgMywgICAwLCAgIDExMCwgMTcyLCA4NiwKKyAgICA5NywgIDE1MywgNzYsICA4NSwgIDEzNywgNjcsICA3MCwgIDExOSwgNTcsICA1NiwgIDEwMiwgNDYsICA0MiwgIDg0LCAgMzUsCisgICAgMjYsICA2NiwgIDIxLCAgMCwgICA0NCwgIDEsICAgMCwgICAzLCAgIDAsICAgMTEyLCAxNzEsIDY3LCAgOTgsICAxNTMsIDU5LAorICAgIDg2LCAgMTM3LCA1MiwgIDcxLCAgMTE5LCA0NCwgIDU4LCAgMTAyLCAzNCwgIDQ0LCAgODUsICAyMiwgIDI3LCAgNjYsICA3LAorICAgIDAsICAgNDQsICAwLCAgIDAsICAgMywgICAwLCAgIDkwLCAgMTYwLCAyMTUsIDgxLCAgMTQ0LCAxOTMsIDcwLCAgMTI5LCAxNzMsCisgICAgNjEsICAxMTIsIDE1MSwgNDksICA5NSwgIDEzMSwgMzcsICA3OSwgIDEwOSwgMjIsICA2MSwgIDg3LCAgMCwgICAzOCwgIDYxLAorICAgIDAsICAgMCwgICAyNSwgIDk2LCAgMTYwLCAxOTQsIDg2LCAgMTQzLCAxNzQsIDc1LCAgMTI4LCAxNTcsIDY1LCAgMTEyLCAxMzcsCisgICAgNTMsICA5NSwgIDExNywgNDAsICA3OCwgIDk4LCAgMjUsICA2MCwgIDc4LCAgMCwgICAzOCwgIDUzLCAgMCwgICAwLCAgIDE3LAorICAgIDEwMCwgMTU5LCAxNzcsIDg5LCAgMTQzLCAxNTksIDc5LCAgMTI4LCAxNDMsIDY3LCAgMTExLCAxMjQsIDU1LCAgOTUsICAxMDcsCisgICAgNDIsICA3OCwgIDg5LCAgMjcsICA2MCwgIDcwLCAgMiwgICAzOCwgIDQ2LCAgMCwgICAwLCAgIDksICAgMTA0LCAxNTgsIDE1OSwKKyAgICA5MiwgIDE0MiwgMTQzLCA4MSwgIDEyNywgMTI3LCA2OSwgIDExMCwgMTEwLCA1NiwgIDk0LCAgOTQsICA0MywgIDc4LCAgNzgsCisgICAgMjgsICA2MCwgIDYwLCAgMiwgICAzOCwgIDM4LCAgMCwgICAwLCAgIDEsICAgMTA3LCAxNTcsIDE0MCwgOTQsICAxNDEsIDEyNSwKKyAgICA4MiwgIDEyNiwgMTEyLCA3MSwgIDExMCwgOTcsICA1OSwgIDk0LCAgODIsICA0NSwgIDc3LCAgNjcsICAyOSwgIDU5LCAgNTEsCisgICAgNCwgICAzNywgIDMwLCAgMCwgICAwLCAgIDAsICAgMTEwLCAxNTYsIDEyMiwgOTcsICAxNDAsIDEwOSwgODUsICAxMjUsIDk3LAorICAgIDcyLCAgMTA5LCA4MywgIDU4LCAgOTMsICA3MSwgIDQ1LCAgNzcsICA1NywgIDI5LCAgNjAsICA0MiwgIDUsICAgMzgsICAyMiwKKyAgICAwLCAgIDAsICAgMCwgICAxMTEsIDE1NiwgMTAzLCA5OSwgIDEzOSwgOTEsICA4NywgIDEyNSwgODEsICA3MywgIDEwOCwgNjksCisgICAgNjAsICA5MiwgIDU4LCAgNDYsICA3NywgIDQ1LCAgMzAsICA1OSwgIDMxLCAgNSwgICAzOCwgIDEyLCAgMCwgICAwLCAgIDAsCisgICAgMTE1LCAxNTYsIDgyLCAgMTAxLCAxNDAsIDczLCAgODgsICAxMjQsIDYzLCAgNzQsICAxMDgsIDUzLCAgNjAsICA5MiwgIDQ0LAorICAgIDQ2LCAgNzYsICAzMiwgIDMxLCAgNTksICAxOCwgIDYsICAgMzcsICAwLCAgIDAsICAgMCwgICAwLCAgIDExNiwgMTU1LCA2NSwKKyAgICAxMDIsIDEzOSwgNTgsICA4OSwgIDEyNCwgNDksICA3NSwgIDEwOCwgNDEsICA2MSwgIDkyLCAgMzIsICA0OCwgIDc2LCAgMjEsCisgICAgMzEsICA1OSwgIDYsICAgNSwgICAzNywgIDAsICAgMCwgICAwLCAgIDAsICAgMTAwLCAxNDEsIDIwMSwgODgsICAxMjcsIDE4MSwKKyAgICA3OSwgIDExNCwgMTYyLCA2OSwgIDk5LCAgMTQyLCA1NywgIDgzLCAgMTIyLCA0NCwgIDY4LCAgMTAyLCAzMCwgIDUxLCAgODEsCisgICAgNywgICAyOCwgIDU2LCAgMCwgICAwLCAgIDE5LCAgMTA1LCAxNDEsIDE4MiwgOTQsICAxMjcsIDE2MywgODMsICAxMTQsIDE0NiwKKyAgICA3MSwgIDk4LCAgMTI4LCA1OSwgIDgzLCAgMTEwLCA0NiwgIDY4LCAgOTEsICAzMSwgIDUxLCAgNzIsICAxMCwgIDI4LCAgNDgsCisgICAgMCwgICAwLCAgIDExLCAgMTA4LCAxNDEsIDE2NiwgOTYsICAxMjcsIDE0OSwgODUsICAxMTMsIDEzMywgNzMsICA5OCwgIDExNiwKKyAgICA2MCwgIDgzLCAgOTksICA0NiwgIDY4LCAgODIsICAzMiwgIDUxLCAgNjQsICAxMSwgIDI5LCAgNDEsICAwLCAgIDAsICAgMiwKKyAgICAxMTEsIDE0MSwgMTQ5LCA5OCwgIDEyNiwgMTM0LCA4OCwgIDExMiwgMTE5LCA3NCwgIDk3LCAgMTAzLCA2MSwgIDgzLCAgODgsCisgICAgNDgsICA2NywgIDcyLCAgMzMsICA1MSwgIDU2LCAgMTEsICAyOSwgIDM0LCAgMCwgICAwLCAgIDAsICAgMTEyLCAxNDAsIDEzMiwKKyAgICAxMDAsIDEyNSwgMTE4LCA4OSwgIDExMiwgMTA1LCA3NSwgIDk3LCAgOTEsICA2MiwgIDgyLCAgNzcsICA0OSwgIDY4LCAgNjIsCisgICAgMzMsICA1MSwgIDQ3LCAgMTIsICAyOSwgIDI2LCAgMCwgICAwLCAgIDAsICAgMTE1LCAxNDAsIDExNiwgMTAyLCAxMjUsIDEwMywKKyAgICA5MCwgIDExMSwgOTEsICA3NiwgIDk2LCAgNzgsICA2MiwgIDgyLCAgNjUsICA0OSwgIDY3LCAgNTIsICAzNCwgIDUxLCAgMzgsCisgICAgMTMsICAyOSwgIDE4LCAgMCwgICAwLCAgIDAsICAgMTE3LCAxMzksIDk3LCAgMTAzLCAxMjQsIDg3LCAgOTEsICAxMTEsIDc3LAorICAgIDc4LCAgOTYsICA2NSwgIDYzLCAgODEsICA1NCwgIDQ5LCAgNjcsICA0MSwgIDM0LCAgNTEsICAyNywgIDEyLCAgMjksICA3LAorICAgIDAsICAgMCwgICAwLCAgIDExOSwgMTM4LCA3OCwgIDEwNSwgMTI0LCA2OSwgIDkyLCAgMTEwLCA2MCwgIDc4LCAgOTUsICA1MCwKKyAgICA2NSwgIDgxLCAgNDAsICA1MCwgIDY3LCAgMjksICAzNCwgIDUxLCAgMTUsICAxMywgIDMwLCAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxMjAsIDEzOCwgNjQsICAxMDYsIDEyNCwgNTQsICA5MywgIDExMCwgNDcsICA3OCwgIDk1LCAgMzgsICA2NSwgIDgxLCAgMjksCisgICAgNTAsICA2NiwgIDE3LCAgMzQsICA1MCwgIDIsICAgMTMsICAyOSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTA3LCAxMjQsIDE4OSwKKyAgICA5NiwgIDExMSwgMTY5LCA4NSwgIDk5LCAgMTUyLCA3MywgIDg1LCAgMTMyLCA2MSwgIDcxLCAgMTE0LCA0OCwgIDU3LCAgOTUsCisgICAgMzQsICA0MSwgIDc1LCAgMTQsICAxOCwgIDUxLCAgMCwgICAwLCAgIDEzLCAgMTExLCAxMjQsIDE3MSwgMTAwLCAxMTEsIDE1MywKKyAgICA4OCwgIDk5LCAgMTM3LCA3NSwgIDg1LCAgMTIwLCA2MywgIDcyLCAgMTAzLCA1MCwgIDU4LCAgODUsICAzNiwgIDQxLCAgNjYsCisgICAgMTUsICAxOSwgIDQzLCAgMCwgICAwLCAgIDQsICAgMTEzLCAxMjQsIDE1NiwgMTAxLCAxMTEsIDEzOSwgOTAsICA5OSwgIDEyNSwKKyAgICA3NywgIDg1LCAgMTA5LCA2NCwgIDcxLCAgOTMsICA1MSwgIDU3LCAgNzcsICAzNiwgIDQyLCAgNTksICAxNywgIDIwLCAgMzcsCisgICAgMCwgICAwLCAgIDAsICAgMTE1LCAxMjQsIDE0MCwgMTAzLCAxMTEsIDEyNSwgOTAsICA5OSwgIDExMiwgNzgsICA4NSwgIDk3LAorICAgIDY0LCAgNzEsICA4MiwgIDUyLCAgNTcsICA2NywgIDM2LCAgNDIsICA1MCwgIDE2LCAgMjAsICAzMCwgIDAsICAgMCwgICAwLAorICAgIDExNywgMTIzLCAxMjUsIDEwNCwgMTEwLCAxMTEsIDkyLCAgOTgsICA5OSwgIDc5LCAgODUsICA4NiwgIDY1LCAgNzEsICA3MiwKKyAgICA1MSwgIDU4LCAgNTksICAzNywgIDQyLCAgNDMsICAxNywgIDIxLCAgMjIsICAwLCAgIDAsICAgMCwgICAxMTgsIDEyMywgMTEwLAorICAgIDEwNSwgMTEwLCA5NywgIDkzLCAgOTgsICA4NiwgIDc4LCAgODQsICA3NCwgIDY2LCAgNzEsICA2MiwgIDUyLCAgNTcsICA0OSwKKyAgICAzNywgIDQyLCAgMzQsICAxNywgIDIyLCAgMTQsICAwLCAgIDAsICAgMCwgICAxMjAsIDEyMywgOTMsICAxMDYsIDEwOSwgODIsCisgICAgOTQsICA5NywgIDcyLCAgODAsICA4NCwgIDYxLCAgNjYsICA3MSwgIDUwLCAgNTIsICA1NywgIDM4LCAgMzcsICA0MiwgIDI0LAorICAgIDE3LCAgMjIsICAyLCAgIDAsICAgMCwgICAwLCAgIDEyMSwgMTIyLCA3NSwgIDEwOCwgMTA5LCA2NiwgIDk1LCAgOTcsICA1OCwKKyAgICA4MCwgIDg0LCAgNDgsICA2NiwgIDcxLCAgMzcsICA1MiwgIDU3LCAgMjYsICAzNywgIDQyLCAgMTIsICAxNiwgIDIyLCAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxMjIsIDEyMywgNjIsICAxMDgsIDEwOSwgNTIsICA5NSwgIDk3LCAgNDUsICA4MSwgIDg0LCAgMzYsCisgICAgNjcsICA3MCwgIDI2LCAgNTIsICA1NywgIDE0LCAgMzcsICA0MiwgIDAsICAgMTUsICAyMiwgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTEzLCAxMDcsIDE3NywgMTAyLCA5NiwgIDE1OSwgODksICA4NSwgIDE0MSwgNzgsICA3MiwgIDEyNCwgNjUsICA2MCwgIDEwNywKKyAgICA1MiwgIDQ2LCAgODksICAzNywgIDMwLCAgNzAsICAxOCwgIDUsICAgNDYsICAwLCAgIDAsICAgNiwgICAxMTYsIDEwNywgMTYwLAorICAgIDEwNCwgOTYsICAxNDQsIDkyLCAgODUsICAxMjksIDgwLCAgNzIsICAxMTIsIDY3LCAgNjAsICA5NiwgIDUzLCAgNDcsICA4MCwKKyAgICAzOCwgIDMxLCAgNjIsICAxOSwgIDcsICAgMzksICAwLCAgIDAsICAgMCwgICAxMTgsIDEwNywgMTQ3LCAxMDUsIDk2LCAgMTMxLAorICAgIDkzLCAgODUsICAxMTgsIDgwLCAgNzIsICAxMDEsIDY3LCAgNjAsICA4NywgIDU0LCAgNDcsICA3MSwgIDM5LCAgMzEsICA1NCwKKyAgICAxOSwgIDgsICAgMzIsICAwLCAgIDAsICAgMCwgICAxMTksIDEwNywgMTMyLCAxMDYsIDk2LCAgMTE4LCA5NCwgIDg1LCAgMTA2LAorICAgIDgxLCAgNzMsICA5MSwgIDY3LCAgNjAsICA3NywgIDU0LCAgNDcsICA2MywgIDM5LCAgMzIsICA0NywgIDIwLCAgOSwgICAyNSwKKyAgICAwLCAgIDAsICAgMCwgICAxMTksIDEwNywgMTE4LCAxMDYsIDk1LCAgMTA1LCA5NCwgIDg1LCAgOTMsICA4MSwgIDcyLCAgODAsCisgICAgNjgsICA2MCwgIDY4LCAgNTQsICA0NywgIDU0LCAgMzksICAzMiwgIDM5LCAgMjAsICAxMSwgIDE4LCAgMCwgICAwLCAgIDAsCisgICAgMTIxLCAxMDcsIDEwNCwgMTA3LCA5NiwgIDkyLCAgOTUsICA4NCwgIDgwLCAgODEsICA3MiwgIDY5LCAgNjgsICA2MSwgIDU4LAorICAgIDU0LCAgNDgsICA0NiwgIDM5LCAgMzMsICAzMSwgIDIwLCAgMTIsICA5LCAgIDAsICAgMCwgICAwLCAgIDEyMywgMTA3LCA4OCwKKyAgICAxMDgsIDk1LCAgNzcsICA5NiwgIDg0LCAgNjgsICA4MiwgIDcyLCAgNTcsICA2OCwgIDYwLCAgNDYsICA1NCwgIDQ3LCAgMzUsCisgICAgMzksICAzMywgIDIwLCAgMTksICAxMywgIDIsICAgMCwgICAwLCAgIDAsICAgMTIzLCAxMDYsIDcyLCAgMTEwLCA5NSwgIDYzLAorICAgIDk2LCAgODQsICA1NCwgIDgyLCAgNzIsICA0NSwgIDY5LCAgNjAsICAzNSwgIDU1LCAgNDgsICAyMywgIDM5LCAgMzMsICA5LAorICAgIDE4LCAgMTQsICAwLCAgIDAsICAgMCwgICAwLCAgIDEyNSwgMTA2LCA2MCwgIDExMCwgOTQsICA1MCwgIDk4LCAgODQsICA0MiwKKyAgICA4MywgIDcyLCAgMzQsICA2OSwgIDYwLCAgMjUsICA1NSwgIDQ4LCAgMTIsICAzOSwgIDMzLCAgMCwgICAxNywgIDEzLCAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxMTgsIDg5LCAgMTY1LCAxMDUsIDc5LCAgMTQ4LCA5MywgIDY5LCAgMTMyLCA4MSwgIDU3LCAgMTE1LAorICAgIDY4LCAgNDUsICA5OSwgIDU1LCAgMzIsICA4MiwgIDQxLCAgMTUsICA2NCwgIDIxLCAgMCwgICA0MSwgIDAsICAgMCwgICAwLAorICAgIDEyMCwgODksICAxNTAsIDEwNywgNzksICAxMzUsIDk2LCAgNjksICAxMjEsIDgyLCAgNTgsICAxMDUsIDcwLCAgNDYsICA4OSwKKyAgICA1NiwgIDM0LCAgNzMsICA0MSwgIDE3LCAgNTYsICAyMSwgIDAsICAgMzQsICAwLCAgIDAsICAgMCwgICAxMjEsIDg5LCAgMTM3LAorICAgIDEwOCwgNzksICAxMjMsIDk2LCAgNjksICAxMDksIDgyLCAgNTgsICA5NSwgIDcwLCAgNDcsICA4MSwgIDU2LCAgMzQsICA2NiwKKyAgICA0MSwgIDE4LCAgNDksICAyMSwgIDAsICAgMjgsICAwLCAgIDAsICAgMCwgICAxMjIsIDkwLCAgMTI0LCAxMDksIDc5LCAgMTEwLAorICAgIDk2LCAgNjksICA5OSwgIDgzLCAgNTgsICA4NSwgIDcwLCAgNDcsICA3MiwgIDU2LCAgMzUsICA1OCwgIDQxLCAgMTksICA0MiwKKyAgICAyMSwgIDAsICAgMjIsICAwLCAgIDAsICAgMCwgICAxMjMsIDkwLCAgMTExLCAxMTAsIDc5LCAgOTgsICA5NywgIDY5LCAgODcsCisgICAgODMsICA1OSwgIDc1LCAgNzAsICA0NywgIDYzLCAgNTYsICAzNSwgIDUwLCAgNDEsICAyMCwgIDM1LCAgMjEsICAwLCAgIDE0LAorICAgIDAsICAgMCwgICAwLCAgIDEyMywgOTAsICA5OCwgIDExMCwgNzksICA4NywgIDk3LCAgNzAsICA3NiwgIDg0LCAgNTgsICA2NCwKKyAgICA3MCwgIDQ4LCAgNTMsICA1NiwgIDM2LCAgNDEsICA0MCwgIDIxLCAgMjYsICAyMSwgIDAsICAgNSwgICAwLCAgIDAsICAgMCwKKyAgICAxMjUsIDg5LCAgODQsICAxMTEsIDc5LCAgNzMsICA5NywgIDY5LCAgNjQsICA4NCwgIDU5LCAgNTQsICA3MCwgIDQ4LCAgNDMsCisgICAgNTYsICAzNiwgIDMxLCAgNDAsICAyMiwgIDE3LCAgMjAsICAxLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMTI1LCA4OSwgIDY5LAorICAgIDExMiwgNzksICA2MCwgIDk4LCAgNzAsICA1MSwgIDg0LCAgNTksICA0MiwgIDcwLCAgNDgsICAzMiwgIDU2LCAgMzYsICAyMCwKKyAgICA0MSwgIDIyLCAgNSwgICAxOSwgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMjYsIDg5LCAgNTcsICAxMTIsIDc5LCAgNDksCisgICAgOTksICA3MCwgIDQxLCAgODQsICA1OSwgIDMyLCAgNzAsICA0OCwgIDIyLCAgNTYsICAzNiwgIDEwLCAgNDAsICAyMiwgIDAsCisgICAgMTgsICAyLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTIxLCA2NywgIDE1NCwgMTA4LCA1OCwgIDEzOCwgOTcsICA1MCwgIDEyNCwKKyAgICA4NCwgIDM5LCAgMTA3LCA3MSwgIDI4LCAgOTIsICA1OCwgIDEyLCAgNzYsICA0MywgIDAsICAgNTksICAyMCwgIDAsICAgMzcsCisgICAgMCwgICAwLCAgIDAsICAgMTI0LCA2OCwgIDE0MCwgMTExLCA1OSwgIDEyNiwgOTgsICA1MCwgIDExMiwgODQsICA0MCwgIDk4LAorICAgIDcxLCAgMjksICA4MywgIDU4LCAgMTUsICA2NywgIDQyLCAgMCwgICA1MSwgIDIwLCAgMCwgICAzMCwgIDAsICAgMCwgICAwLAorICAgIDEyNCwgNjgsICAxMjksIDExMSwgNTksICAxMTQsIDk5LCAgNTEsICAxMDIsIDg2LCAgNDEsICA4OCwgIDcxLCAgMzAsICA3NSwKKyAgICA1OCwgIDE3LCAgNjAsICA0MiwgIDAsICAgNDUsICAyMCwgIDAsICAgMjQsICAwLCAgIDAsICAgMCwgICAxMjUsIDcwLCAgMTE2LAorICAgIDExMSwgNjAsICAxMDMsIDk5LCAgNTEsICA5MiwgIDg1LCAgNDEsICA3OSwgIDcxLCAgMzEsICA2NiwgIDU4LCAgMTksICA1MywKKyAgICA0MiwgIDMsICAgMzgsICAyMCwgIDAsICAgMTcsICAwLCAgIDAsICAgMCwgICAxMjUsIDcwLCAgMTA0LCAxMTEsIDYxLCAgOTMsCisgICAgOTksICA1MiwgIDgxLCAgODUsICA0MywgIDY5LCAgNzIsICAzMiwgIDU4LCAgNTgsICAyMCwgIDQ1LCAgNDIsICA0LCAgIDMxLAorICAgIDIwLCAgMCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDEyNiwgNzAsICA5MiwgIDExMSwgNjEsICA4MSwgIDk5LCAgNTIsICA3MSwKKyAgICA4NSwgIDQyLCAgNjAsICA3MSwgIDMzLCAgNDksICA1NywgIDIxLCAgMzcsICA0MiwgIDYsICAgMjMsICAyMCwgIDAsICAgMywKKyAgICAwLCAgIDAsICAgMCwgICAxMjYsIDcwLCAgNzksICAxMTIsIDYxLCAgNzAsICA5OSwgIDUzLCAgNjAsICA4NSwgIDQzLCAgNTAsCisgICAgNzEsICAzMywgIDM5LCAgNTcsICAyMiwgIDI4LCAgNDEsICA3LCAgIDEzLCAgMTksICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTI3LCA3MSwgIDY2LCAgMTEzLCA2MiwgIDU2LCAgMTAwLCA1MywgIDQ4LCAgODYsICA0NCwgIDM5LCAgNzEsICAzNCwgIDI5LAorICAgIDU3LCAgMjMsICAxOCwgIDQxLCAgOCwgICAyLCAgIDE4LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEyOCwgNzAsICA1NSwKKyAgICAxMTQsIDYyLCAgNDYsICAxMDAsIDU0LCAgMzksICA4NiwgIDQ0LCAgMzAsICA3MSwgIDM0LCAgMjAsICA1NywgIDIzLCAgNywKKyAgICA0MSwgIDksICAgMCwgICAxOCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMjQsIDQxLCAgMTQ1LCAxMTEsIDMyLCAgMTI4LAorICAgIDk5LCAgMjMsICAxMTQsIDg2LCAgMTAsICAxMDAsIDczLCAgMCwgICA4NSwgIDYwLCAgMCwgICA3MSwgIDQzLCAgMCwgICA1NCwKKyAgICAxNywgIDAsICAgMzIsICAwLCAgIDAsICAgMCwgICAxMjYsIDQyLCAgMTMxLCAxMTMsIDMzLCAgMTE3LCAxMDAsIDI1LCAgMTA0LAorICAgIDg2LCAgMTQsICA5MCwgIDczLCAgMCwgICA3NywgIDYwLCAgMCwgICA2MywgIDQ0LCAgMCwgICA0NywgIDE4LCAgMCwgICAyNSwKKyAgICAwLCAgIDAsICAgMCwgICAxMjcsIDQzLCAgMTIwLCAxMTMsIDM0LCAgMTA2LCAxMDEsIDI2LCAgOTUsICA4NiwgIDE3LCAgODIsCisgICAgNzMsICAyLCAgIDY5LCAgNTksICAwLCAgIDU2LCAgNDMsICAwLCAgIDQxLCAgMTgsICAwLCAgIDE5LCAgMCwgICAwLCAgIDAsCisgICAgMTI3LCA0NSwgIDEwOSwgMTEzLCAzNywgIDk3LCAgMTAxLCAyOCwgIDg1LCAgODYsICAxOSwgIDc0LCAgNzMsICA1LCAgIDYxLAorICAgIDU5LCAgMCwgICA0OCwgIDQzLCAgMCwgICAzNCwgIDE5LCAgMCwgICAxMSwgIDAsICAgMCwgICAwLCAgIDEyNywgNDYsICA5OCwKKyAgICAxMTQsIDM4LCAgODYsICAxMDAsIDMwLCAgNzYsICA4NywgIDIxLCAgNjUsICA3MywgIDksICAgNTQsICA1OSwgIDAsICAgNDEsCisgICAgNDMsICAwLCAgIDI2LCAgMTgsICAwLCAgIDUsICAgMCwgICAwLCAgIDAsICAgMTI3LCA0NywgIDg3LCAgMTEzLCAzOSwgIDc2LAorICAgIDEwMSwgMzEsICA2NywgIDg2LCAgMjIsICA1NiwgIDcyLCAgMTEsICA0NSwgIDU5LCAgMCwgICAzMywgIDQzLCAgMCwgICAxOSwKKyAgICAxOCwgIDAsICAgMiwgICAwLCAgIDAsICAgMCwgICAxMjgsIDQ4LCAgNzUsICAxMTQsIDM5LCAgNjUsICAxMDEsIDMzLCAgNTYsCisgICAgODYsICAyMywgIDQ2LCAgNzIsICAxMiwgIDM2LCAgNTgsICAwLCAgIDI0LCAgNDIsICAwLCAgIDksICAgMTcsICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTI5LCA0OCwgIDYzLCAgMTE0LCA0MSwgIDU0LCAgMTAyLCAzMywgIDQ2LCAgODcsICAyNCwgIDM2LAorICAgIDcyLCAgMTQsICAyNiwgIDU4LCAgMSwgICAxNCwgIDQyLCAgMCwgICAyLCAgIDE2LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDEyOCwgNDgsICA1MywgIDExNCwgNDEsICA0NCwgIDEwMiwgMzQsICAzNywgIDg3LCAgMjUsICAyNywgIDcyLCAgMTUsICAxNywKKyAgICA1OCwgIDEsICAgMywgICA0MSwgIDAsICAgMCwgICAxNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE4OSwgMjQyLAorICAgIDAsICAgMTY5LCAyMTcsIDAsICAgMTUxLCAxOTQsIDAsICAgMTMyLCAxNzAsIDAsICAgMTEzLCAxNDcsIDAsICAgOTQsICAxMjMsCisgICAgMCwgICA3NCwgIDk5LCAgMCwgICA1MSwgIDcxLCAgMCwgICAxNSwgIDM0LCAgMSwgICAxODcsIDIxOSwgMSwgICAxNjcsIDE5NSwKKyAgICAwLCAgIDE1MCwgMTc1LCAwLCAgIDEzMSwgMTUzLCAwLCAgIDExMywgMTMyLCAwLCAgIDk0LCAgMTExLCAwLCAgIDc0LCAgODksCisgICAgMCwgICA1MCwgIDYzLCAgMCwgICAxMywgIDI4LCAgMSwgICAxODYsIDE5OCwgMSwgICAxNjcsIDE3OCwgMCwgICAxNDksIDE1OCwKKyAgICAwLCAgIDEzMCwgMTM5LCAwLCAgIDExMSwgMTE5LCAwLCAgIDkzLCAgMTAwLCAwLCAgIDc0LCAgODAsICAwLCAgIDUwLCAgNTUsCisgICAgMCwgICAxMywgIDIyLCAgMSwgICAxODUsIDE3NiwgMSwgICAxNjUsIDE1OSwgMSwgICAxNDgsIDE0MiwgMCwgICAxMjksIDEyMywKKyAgICAwLCAgIDExMSwgMTA2LCAwLCAgIDkzLCAgODksICAwLCAgIDczLCAgNzAsICAwLCAgIDUwLCAgNDcsICAwLCAgIDEzLCAgMTMsCisgICAgMSwgICAxODQsIDE1NywgMSwgICAxNjQsIDE0MSwgMSwgICAxNDcsIDEyNSwgMCwgICAxMjgsIDExMCwgMCwgICAxMTAsIDkzLAorICAgIDAsICAgOTIsICA3NywgIDAsICAgNzMsICA2MCwgIDAsICAgNTAsICAzOSwgIDAsICAgMTIsICA1LCAgIDI1LCAgMTgyLCAxMzcsCisgICAgMjUsICAxNjMsIDEyMiwgMTcsICAxNDYsIDEwOSwgMCwgICAxMjgsIDk2LCAgMCwgICAxMTAsIDgxLCAgMCwgICA5MiwgIDY2LAorICAgIDAsICAgNzMsICA1MSwgIDAsICAgNTAsICAzMCwgIDAsICAgMTAsICAwLCAgIDQyLCAgMTgxLCAxMTQsIDM1LCAgMTYzLCAxMDIsCisgICAgMzAsICAxNDUsIDkxLCAgMTQsICAxMjcsIDgwLCAgMCwgICAxMDksIDY3LCAgMCwgICA5MSwgIDUzLCAgMCwgICA3MiwgIDM5LAorICAgIDAsICAgNTAsICAxOSwgIDAsICAgMTAsICAwLCAgIDUyLCAgMTgxLCA5MiwgIDQzLCAgMTYyLCA4MywgIDMyLCAgMTQ1LCA3MywKKyAgICAxOSwgIDEyNiwgNjMsICAwLCAgIDEwOCwgNTIsICAwLCAgIDkwLCAgNDAsICAwLCAgIDcyLCAgMjcsICAwLCAgIDUwLCAgNywKKyAgICAwLCAgIDEwLCAgMCwgICA1NywgIDE4MSwgNzQsICA0OCwgIDE2MiwgNjYsICAzNywgIDE0NCwgNTcsICAyNCwgIDEyNiwgNDksCisgICAgNywgICAxMDgsIDQwLCAgMCwgICA5MCwgIDI5LCAgMCwgICA3MiwgIDE1LCAgMCwgICA0OSwgIDAsICAgMCwgICAxMCwgIDAsCisgICAgMSwgICAxNzAsIDIyNywgMSwgICAxNTIsIDIwMywgMCwgICAxMzYsIDE4MiwgMCwgICAxMTksIDE1OSwgMCwgICAxMDEsIDEzNywKKyAgICAwLCAgIDg0LCAgMTE1LCAwLCAgIDY1LCAgOTIsICAwLCAgIDQzLCAgNjYsICAwLCAgIDEsICAgMjksICAxLCAgIDE2OSwgMjA2LAorICAgIDEsICAgMTUxLCAxODQsIDEsICAgMTM2LCAxNjUsIDAsICAgMTE4LCAxNDQsIDAsICAgMTAyLCAxMjUsIDAsICAgODQsICAxMDUsCisgICAgMCwgICA2NSwgIDgzLCAgMCwgICA0MywgIDU4LCAgMCwgICAwLCAgIDIyLCAgMjksICAxNjgsIDE4NiwgMjEsICAxNTEsIDE2NywKKyAgICAxNCwgIDEzNSwgMTUwLCA0LCAgIDExOCwgMTMxLCAwLCAgIDEwMSwgMTEyLCAwLCAgIDgzLCAgOTQsICAwLCAgIDY1LCAgNzUsCisgICAgMCwgICA0MywgIDUxLCAgMCwgICAwLCAgIDE2LCAgNDEsICAxNjcsIDE2NywgMzMsICAxNTAsIDE1MCwgMzEsICAxMzQsIDEzNCwKKyAgICAxOSwgIDExNywgMTE3LCA0LCAgIDEwMCwgMTAwLCAwLCAgIDgzLCAgODMsICAwLCAgIDY1LCAgNjUsICAwLCAgIDQyLCAgNDMsCisgICAgMCwgICAwLCAgIDgsICAgNDgsICAxNjcsIDE0OSwgNDEsICAxNDksIDEzMywgMzMsICAxMzMsIDExOCwgMjUsICAxMTYsIDEwMywKKyAgICAxMywgIDk5LCAgODgsICAwLCAgIDgzLCAgNzMsICAwLCAgIDY1LCAgNTYsICAwLCAgIDQyLCAgMzUsICAwLCAgIDAsICAgMCwKKyAgICA1OCwgIDE2NSwgMTMwLCA0OSwgIDE0OCwgMTE1LCA0MiwgIDEzMiwgMTAzLCAzMSwgIDExNSwgODksICAxOCwgIDk5LCAgNzUsCisgICAgMCwgICA4MiwgIDYxLCAgMCwgICA2NCwgIDQ2LCAgMCwgICA0MiwgIDI2LCAgMCwgICAwLCAgIDAsICAgNjIsICAxNjQsIDExMCwKKyAgICA1NSwgIDE0NywgOTcsICA0NSwgIDEzMiwgODcsICAzNSwgIDExNSwgNzUsICAyMiwgIDk4LCAgNjMsICA1LCAgIDgyLCAgNTAsCisgICAgMCwgICA2NCwgIDM2LCAgMCwgICA0MiwgIDE2LCAgMCwgICAwLCAgIDAsICAgNjksICAxNjQsIDg5LCAgNjAsICAxNDcsIDc4LAorICAgIDUwLCAgMTMxLCA3MCwgIDM3LCAgMTE0LCA1OSwgIDI2LCAgOTgsICA0OSwgIDEwLCAgODEsICAzNywgIDAsICAgNjQsICAyNCwKKyAgICAwLCAgIDQyLCAgNCwgICAwLCAgIDAsICAgMCwgICA3MSwgIDE2NCwgNzEsICA2MywgIDE0NywgNjMsICA1MywgIDEzMSwgNTUsCisgICAgNDAsICAxMTQsIDQ3LCAgMjgsICA5OCwgIDM4LCAgMTMsICA4MSwgIDI2LCAgMCwgICA2NCwgIDEyLCAgMCwgICA0MiwgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMjgsICAxNTMsIDIxNCwgMjQsICAxMzgsIDE5MywgMjMsICAxMjMsIDE3MSwgMTYsICAxMDcsIDE1MCwKKyAgICAwLCAgIDkxLCAgMTMwLCAwLCAgIDc1LCAgMTA5LCAwLCAgIDU4LCAgODcsICAwLCAgIDM1LCAgNjEsICAwLCAgIDAsICAgMjUsCisgICAgNDgsICAxNTMsIDE5NCwgNDEsICAxMzgsIDE3NCwgMzQsICAxMjMsIDE1NiwgMjcsICAxMDcsIDEzNiwgMTYsICA5MSwgIDExNywKKyAgICAxLCAgIDc1LCAgOTgsICAwLCAgIDU3LCAgNzgsICAwLCAgIDM1LCAgNTMsICAwLCAgIDAsICAgMTcsICA1NSwgIDE1MywgMTc3LAorICAgIDQ3LCAgMTM3LCAxNTgsIDQyLCAgMTIyLCAxNDIsIDMzLCAgMTA3LCAxMjQsIDIyLCAgOTEsICAxMDYsIDYsICAgNzUsICA4OCwKKyAgICAwLCAgIDU3LCAgNzAsICAwLCAgIDM1LCAgNDYsICAwLCAgIDAsICAgOSwgICA2MSwgIDE1MiwgMTU4LCA1MywgIDEzNiwgMTQzLAorICAgIDQ1LCAgMTIyLCAxMjcsIDM2LCAgMTA2LCAxMTEsIDI0LCAgOTAsICA5NCwgIDEwLCAgNzQsICA3OCwgIDAsICAgNTcsICA2MSwKKyAgICAwLCAgIDM1LCAgMzksICAwLCAgIDAsICAgMiwgICA2NywgIDE1MSwgMTQxLCA1OSwgIDEzNSwgMTI2LCA0OSwgIDEyMSwgMTEyLAorICAgIDM5LCAgMTA1LCA5OCwgIDI5LCAgOTAsICA4MywgIDE0LCAgNzQsICA2OCwgIDAsICAgNTcsICA1MiwgIDAsICAgMzUsICAzMSwKKyAgICAwLCAgIDAsICAgMCwgICA3MSwgIDE1MCwgMTIzLCA2MiwgIDEzNSwgMTEwLCA1NCwgIDEyMCwgOTgsICA0MiwgIDEwNSwgODQsCisgICAgMzEsICA4OSwgIDcxLCAgMTYsICA3NCwgIDU4LCAgMCwgICA1NywgIDQzLCAgMCwgICAzNSwgIDIyLCAgMCwgICAwLCAgIDAsCisgICAgNzQsICAxNTAsIDEwNSwgNjQsICAxMzQsIDkyLCAgNTUsICAxMjAsIDgzLCAgNDUsICAxMDQsIDcxLCAgMzQsICA4OSwgIDU5LAorICAgIDIwLCAgNzMsICA0NywgIDAsICAgNTcsICAzMiwgIDAsICAgMzUsICAxMywgIDAsICAgMCwgICAwLCAgIDc4LCAgMTQ5LCA4NCwKKyAgICA2OSwgIDEzNCwgNzUsICA1OSwgIDEyMCwgNjYsICA0NywgIDEwMywgNTYsICAzNCwgIDg4LCAgNDYsICAyMiwgIDczLCAgMzQsCisgICAgMSwgICA1NywgIDIwLCAgMCwgICAzNSwgIDEsICAgMCwgICAwLCAgIDAsICAgODAsICAxNDksIDY5LCAgNzAsICAxMzMsIDYxLAorICAgIDYwLCAgMTE5LCA1MywgIDQ5LCAgMTAzLCA0NCwgIDM2LCAgODgsICAzNSwgIDIzLCAgNzMsICAyNCwgIDIsICAgNTYsICAxMCwKKyAgICAwLCAgIDM1LCAgMCwgICAwLCAgIDAsICAgMCwgICA1OCwgIDEzNiwgMjAwLCA1MCwgIDEyMiwgMTgwLCA0NSwgIDEwOSwgMTYyLAorICAgIDM4LCAgOTQsICAxNDEsIDI3LCAgODAsICAxMjEsIDE1LCAgNjUsICAxMDIsIDAsICAgNDgsICA4MSwgIDAsICAgMjYsICA1NiwKKyAgICAwLCAgIDAsICAgMTksICA2NiwgIDEzNiwgMTgyLCA1OSwgIDEyMiwgMTYzLCA1MiwgIDEwOSwgMTQ2LCA0MiwgIDk0LCAgMTI4LAorICAgIDMyLCAgODAsICAxMDksIDIwLCAgNjUsICA5MSwgIDIsICAgNDgsICA3MiwgIDAsICAgMjYsICA0OSwgIDAsICAgMCwgICAxMSwKKyAgICA3MCwgIDEzNiwgMTY1LCA2MiwgIDEyMiwgMTQ5LCA1NSwgIDEwOCwgMTMzLCA0NiwgIDk0LCAgMTE2LCAzNSwgIDgwLCAgOTksCisgICAgMjEsICA2NSwgIDgyLCAgNCwgICA0OSwgIDY0LCAgMCwgICAyNiwgIDQxLCAgMCwgICAwLCAgIDMsICAgNzYsICAxMzUsIDE0OSwKKyAgICA2NiwgIDEyMSwgMTMzLCA1OCwgIDEwOCwgMTE5LCA0OCwgIDk0LCAgMTAzLCAzNiwgIDc5LCAgODgsICAyMywgIDY1LCAgNzMsCisgICAgNywgICA0OSwgIDU2LCAgMCwgICAyNywgIDM0LCAgMCwgICAwLCAgIDAsICAgNzgsICAxMzUsIDEzMywgNjksICAxMjAsIDExOCwKKyAgICA2MCwgIDEwNywgMTA2LCA1MCwgIDkzLCAgOTIsICAzOSwgIDc5LCAgNzcsICAyNiwgIDY1LCAgNjMsICA4LCAgIDQ5LCAgNDcsCisgICAgMCwgICAyNywgIDI2LCAgMCwgICAwLCAgIDAsICAgODIsICAxMzQsIDExNywgNzEsICAxMjAsIDEwNCwgNjIsICAxMDcsIDkyLAorICAgIDUxLCAgOTMsICA3OSwgIDM5LCAgNzgsICA2NiwgIDI3LCAgNjQsICA1MywgIDEwLCAgNDgsICAzOSwgIDAsICAgMjcsICAxOCwKKyAgICAwLCAgIDAsICAgMCwgICA4NCwgIDEzNCwgOTksICA3MywgIDExOSwgODcsICA2NCwgIDEwNiwgNzcsICA1MywgIDkyLCAgNjYsCisgICAgNDIsICA3OCwgIDU1LCAgMjgsICA2NCwgIDQyLCAgMTEsICA0OCwgIDI5LCAgMCwgICAyOCwgIDksICAgMCwgICAwLCAgIDAsCisgICAgODcsICAxMzMsIDgxLCAgNzYsICAxMTksIDcyLCAgNjYsICAxMDYsIDYyLCAgNTUsICA5MiwgIDUyLCAgNDMsICA3OCwgIDQyLAorICAgIDI5LCAgNjQsICAzMSwgIDEyLCAgNDgsICAxNywgIDAsICAgMjgsICAwLCAgIDAsICAgMCwgICAwLCAgIDg4LCAgMTM0LCA2NywKKyAgICA3NywgIDExOSwgNTgsICA2OCwgIDEwNiwgNTEsICA1NiwgIDkyLCAgNDIsICA0NCwgIDc4LCAgMzIsICAzMCwgIDY0LCAgMjAsCisgICAgMTIsICA0OCwgIDYsICAgMCwgICAyOCwgIDAsICAgMCwgICAwLCAgIDAsICAgNzMsICAxMjAsIDE4OSwgNjQsICAxMDcsIDE2OCwKKyAgICA1NywgIDk2LCAgMTUxLCA0NywgIDgyLCAgMTMzLCAzOCwgIDY5LCAgMTE0LCAyNiwgIDU1LCAgOTUsICAxMSwgIDM5LCAgNzUsCisgICAgMCwgICAxNiwgIDUxLCAgMCwgICAwLCAgIDE0LCAgNzgsICAxMjAsIDE3MSwgNjksICAxMDcsIDE1MywgNjIsICA5NSwgIDEzNywKKyAgICA1MSwgIDgyLCAgMTE5LCA0MCwgIDY5LCAgMTAyLCAyOSwgIDU1LCAgODUsICAxNSwgIDM5LCAgNjYsICAwLCAgIDE3LCAgNDQsCisgICAgMCwgICAwLCAgIDQsICAgODEsICAxMjAsIDE1NiwgNzEsICAxMDcsIDE0MCwgNjQsICA5NSwgIDEyNSwgNTMsICA4MiwgIDEwOSwKKyAgICA0MiwgIDY5LCAgOTMsICAzMSwgIDU1LCAgNzcsICAxNiwgIDM5LCAgNTksICAwLCAgIDE4LCAgMzcsICAwLCAgIDAsICAgMCwKKyAgICA4NSwgIDEyMCwgMTQxLCA3NCwgIDEwNywgMTI2LCA2NSwgIDk1LCAgMTEyLCA1NCwgIDgyLCAgOTcsICA0MywgIDY5LCAgODIsCisgICAgMzIsICA1NSwgIDY3LCAgMTcsICAzOSwgIDUxLCAgMCwgICAxOSwgIDMwLCAgMCwgICAwLCAgIDAsICAgODYsICAxMTksIDEyNiwKKyAgICA3NiwgIDEwNiwgMTEyLCA2NiwgIDk1LCAgMTAwLCA1NiwgIDgxLCAgODUsICA0NSwgIDY5LCAgNzIsICAzMywgIDU1LCAgNTksCisgICAgMTgsICA0MCwgIDQzLCAgMCwgICAxOSwgIDIyLCAgMCwgICAwLCAgIDAsICAgODksICAxMTksIDExMCwgNzgsICAxMDYsIDk4LAorICAgIDY5LCAgOTQsICA4NywgIDU2LCAgODEsICA3NSwgIDQ2LCAgNjgsICA2MiwgIDMzLCAgNTUsICA0OSwgIDE4LCAgNDAsICAzNSwKKyAgICAwLCAgIDIwLCAgMTUsICAwLCAgIDAsICAgMCwgICA4OSwgIDExOSwgOTUsICA4MCwgIDEwNiwgODMsICA3MCwgIDk0LCAgNzMsCisgICAgNTgsICA4MSwgIDYzLCAgNDYsICA2OCwgIDUxLCAgMzQsICA1NSwgIDM5LCAgMTksICA0MCwgIDI1LCAgMCwgICAyMCwgIDQsCisgICAgMCwgICAwLCAgIDAsICAgOTIsICAxMTgsIDc4LCAgODIsICAxMDYsIDY4LCAgNzAsICA5MywgIDU5LCAgNTksICA4MSwgIDQ5LAorICAgIDQ3LCAgNjgsICAzOSwgIDM0LCAgNTUsICAyOCwgIDE5LCAgNDAsICAxNCwgIDAsICAgMjAsICAwLCAgIDAsICAgMCwgICAwLAorICAgIDkzLCAgMTE4LCA2NSwgIDgyLCAgMTA1LCA1NSwgIDcyLCAgOTMsICA0OCwgIDYwLCAgODEsICAzOSwgIDQ3LCAgNjgsICAyOSwKKyAgICAzNCwgIDU1LCAgMTgsICAyMCwgIDQwLCAgMiwgICAwLCAgIDIwLCAgMCwgICAwLCAgIDAsICAgMCwgICA4MywgIDEwNCwgMTc3LAorICAgIDc0LCAgOTMsICAxNTksIDY1LCAgODIsICAxNDIsIDU2LCAgNzAsICAxMjQsIDQ1LCAgNTcsICAxMDYsIDMzLCAgNDQsICA4OSwKKyAgICAyMCwgIDI4LCAgNzAsICAxLCAgIDQsICAgNDYsICAwLCAgIDAsICAgOCwgICA4NiwgIDEwNCwgMTYxLCA3OCwgIDkzLCAgMTQ1LAorICAgIDY4LCAgODIsICAxMjgsIDU4LCAgNzAsICAxMTIsIDQ4LCAgNTgsICA5NiwgIDM1LCAgNDUsICA4MCwgIDIxLCAgMjksICA2MiwKKyAgICAxLCAgIDYsICAgNDAsICAwLCAgIDAsICAgMCwgICA4OSwgIDEwNCwgMTQ3LCA3OSwgIDkzLCAgMTMxLCA2OSwgIDgyLCAgMTE4LAorICAgIDU5LCAgNzAsICAxMDIsIDQ3LCAgNTgsICA4NywgIDM2LCAgNDUsICA3MiwgIDIzLCAgMjksICA1NSwgIDMsICAgNywgICAzMywKKyAgICAwLCAgIDAsICAgMCwgICA5MCwgIDEwNCwgMTMyLCA4MCwgIDkzLCAgMTE5LCA3MSwgIDgyLCAgMTA2LCA2MCwgIDcwLCAgOTEsCisgICAgNDgsICA1OCwgIDc3LCAgMzcsICA0NSwgIDYyLCAgMjMsICAzMCwgIDQ3LCAgNCwgICA3LCAgIDI2LCAgMCwgICAwLCAgIDAsCisgICAgOTIsICAxMDQsIDExOCwgODIsICA5MywgIDEwNSwgNzIsICA4MiwgIDkzLCAgNjEsICA2OSwgIDgwLCAgNTAsICA1OCwgIDY4LAorICAgIDM3LCAgNDUsICA1NSwgIDIzLCAgMzAsICAzOSwgIDQsICAgOCwgICAxOCwgIDAsICAgMCwgICAwLCAgIDk0LCAgMTA0LCAxMDUsCisgICAgODIsICA5MiwgIDkzLCAgNzIsICA4MiwgIDgyLCAgNjEsICA3MCwgIDcwLCAgNTAsICA1OCwgIDU4LCAgMzgsICA0NiwgIDQ2LAorICAgIDIzLCAgMzEsICAzMSwgIDYsICAgMTAsICAxMSwgIDAsICAgMCwgICAwLCAgIDk1LCAgMTA0LCA5MCwgIDg0LCAgOTIsICA3OSwKKyAgICA3NCwgIDgyLCAgNzAsICA2MiwgIDcwLCAgNTgsICA1MCwgIDU4LCAgNDgsICAzNywgIDQ2LCAgMzYsICAyMywgIDMxLCAgMjIsCisgICAgNCwgICAxMSwgIDMsICAgMCwgICAwLCAgIDAsICAgOTYsICAxMDMsIDc0LCAgODUsICA5MiwgIDY1LCAgNzUsICA4MSwgIDU2LAorICAgIDYzLCAgNzAsICA0NywgIDUwLCAgNTgsICAzNywgIDM4LCAgNDYsICAyNSwgIDI0LCAgMzEsICAxMSwgIDMsICAgMTEsICAwLAorICAgIDAsICAgMCwgICAwLCAgIDk3LCAgMTAzLCA2MiwgIDg2LCAgOTIsICA1MywgIDc2LCAgODEsICA0NSwgIDYzLCAgNjksICAzNiwKKyAgICA1MSwgIDU4LCAgMjcsICAzOCwgIDQ2LCAgMTUsICAyMywgIDMxLCAgMCwgICAzLCAgIDExLCAgMCwgICAwLCAgIDAsICAgMCwKKyAgICA5MCwgIDg3LCAgMTY1LCA4MSwgIDc3LCAgMTQ4LCA3MiwgIDY3LCAgMTMyLCA2MiwgIDU1LCAgMTE2LCA1MCwgIDQ0LCAgOTksCisgICAgMzksICAzMSwgIDgyLCAgMjUsICAxNCwgIDY0LCAgMSwgICAwLCAgIDQyLCAgMCwgICAwLCAgIDEsICAgOTMsICA4NywgIDE1MCwKKyAgICA4MywgIDc3LCAgMTM1LCA3NCwgIDY3LCAgMTIxLCA2MywgIDU2LCAgMTA1LCA1MiwgIDQ1LCAgOTAsICA0MCwgIDMyLCAgNzQsCisgICAgMjUsICAxNiwgIDU3LCAgMywgICAwLCAgIDM1LCAgMCwgICAwLCAgIDAsICAgOTUsICA4NywgIDEzOCwgODUsICA3NywgIDEyMywKKyAgICA3NSwgIDY3LCAgMTA5LCA2MywgIDU3LCAgOTUsICA1MywgIDQ1LCAgODEsICA0MSwgIDMzLCAgNjYsICAyNiwgIDE3LCAgNTAsCisgICAgNCwgICAwLCAgIDI4LCAgMCwgICAwLCAgIDAsICAgOTUsICA4OCwgIDEyNCwgODUsICA3NywgIDExMSwgNzUsICA2NywgIDk5LAorICAgIDYzLCAgNTcsICA4NiwgIDUzLCAgNDUsICA3MiwgIDQxLCAgMzMsICA1OCwgIDI2LCAgMTgsICA0MywgIDUsICAgMSwgICAyMiwKKyAgICAwLCAgIDAsICAgMCwgICA5NywgIDg4LCAgMTEyLCA4NywgIDc3LCAgMTAwLCA3NiwgIDY4LCAgODgsICA2NCwgIDU3LCAgNzYsCisgICAgNTMsICA0NiwgIDYzLCAgNDEsICAzNCwgIDUwLCAgMjYsICAxOSwgIDM1LCAgNSwgICAyLCAgIDE0LCAgMCwgICAwLCAgIDAsCisgICAgOTksICA4NywgIDk5LCAgODcsICA3OCwgIDg4LCAgNzYsICA2OCwgIDc3LCAgNjUsICA1NywgIDY1LCAgNTMsICA0NiwgIDU0LAorICAgIDQxLCAgMzUsICA0MiwgIDI3LCAgMjAsICAyNywgIDYsICAgMiwgICA1LCAgIDAsICAgMCwgICAwLCAgIDEwMCwgODcsICA4NSwKKyAgICA4OCwgIDc3LCAgNzUsICA3NywgIDY4LCAgNjUsICA2NSwgIDU3LCAgNTQsICA1MywgIDQ2LCAgNDQsICA0MSwgIDM1LCAgMzIsCisgICAgMjcsICAyMSwgIDE5LCAgNSwgICAzLCAgIDIsICAgMCwgICAwLCAgIDAsICAgMTAwLCA4OCwgIDcxLCAgODksICA3NywgIDYxLAorICAgIDc4LCAgNjgsICA1MywgIDY2LCAgNTcsICA0NCwgIDUzLCAgNDcsICAzMywgIDQxLCAgMzUsICAyMiwgIDI3LCAgMjEsICA3LAorICAgIDUsICAgMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDEwMSwgODcsICA2MCwgIDkwLCAgNzcsICA1MiwgIDc5LCAgNjgsICA0NCwKKyAgICA2NiwgIDU4LCAgMzQsICA1MywgIDQ3LCAgMjUsICA0MSwgIDM1LCAgMTMsICAyNiwgIDIyLCAgMCwgICA1LCAgIDMsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICA5NywgIDY3LCAgMTU1LCA4NiwgIDU4LCAgMTM4LCA3NywgIDUwLCAgMTI1LCA2NiwgIDM5LCAgMTA4LAorICAgIDU1LCAgMjgsICA5MiwgIDQzLCAgMTIsICA3NiwgIDI5LCAgMCwgICA1OSwgIDIsICAgMCwgICAzNywgIDAsICAgMCwgICAwLAorICAgIDk5LCAgNjcsICAxNDEsIDg4LCAgNTksICAxMjcsIDc4LCAgNTAsICAxMTMsIDY4LCAgNDAsICA5OCwgIDU2LCAgMjksICA4MywKKyAgICA0NCwgIDE1LCAgNjgsICAyOSwgIDAsICAgNTIsICAzLCAgIDAsICAgMzAsICAwLCAgIDAsICAgMCwgICAxMDAsIDY4LCAgMTI5LAorICAgIDg5LCAgNTksICAxMTUsIDgwLCAgNTEsICAxMDMsIDY4LCAgNDEsICA4OSwgIDU2LCAgMzAsICA3NSwgIDQ0LCAgMTYsICA2MSwKKyAgICAzMCwgIDAsICAgNDUsICA0LCAgIDAsICAgMjQsICAwLCAgIDAsICAgMCwgICAxMDAsIDY5LCAgMTE4LCA5MCwgIDYwLCAgMTA0LAorICAgIDgwLCAgNTEsICA5MiwgIDY3LCAgNDEsICA3OSwgIDU2LCAgMzEsICA2NiwgIDQ0LCAgMTgsICA1MywgIDI5LCAgMiwgICAzOCwKKyAgICA0LCAgIDAsICAgMTgsICAwLCAgIDAsICAgMCwgICAxMDEsIDY5LCAgMTA0LCA5MCwgIDYxLCAgOTMsICA3OSwgIDUxLCAgODIsCisgICAgNjcsICA0MiwgIDcwLCAgNTYsICAzMiwgIDU5LCAgNDQsICAyMCwgIDQ2LCAgMjksICA0LCAgIDMxLCAgNiwgICAwLCAgIDksCisgICAgMCwgICAwLCAgIDAsICAgMTAyLCA2OSwgIDkzLCAgOTAsICA2MSwgIDgzLCAgODAsICA1MiwgIDcyLCAgNjgsICA0MiwgIDYxLAorICAgIDU2LCAgMzMsICA1MCwgIDQzLCAgMjAsICAzOCwgIDI5LCAgNSwgICAyMywgIDcsICAgMCwgICA0LCAgIDAsICAgMCwgICAwLAorICAgIDEwMiwgNzAsICA4MCwgIDkxLCAgNjEsICA3MSwgIDgwLCAgNTIsICA2MSwgIDY4LCAgNDMsICA1MSwgIDU2LCAgMzIsICA0MCwKKyAgICA0NCwgIDIxLCAgMjksICAzMCwgIDYsICAgMTQsICA3LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMDMsIDcwLCAgNjgsCisgICAgOTIsICA2MSwgIDU4LCAgODEsICA1MywgIDUwLCAgNjksICA0MywgIDQxLCAgNTYsICAzNCwgIDMxLCAgNDMsICAyMiwgIDE5LAorICAgIDI5LCAgNywgICAzLCAgIDcsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEwNCwgNzAsICA1NywgIDkyLCAgNjEsICA0OCwKKyAgICA4MiwgIDUzLCAgNDAsICA2OSwgIDQzLCAgMzIsICA1NiwgIDM0LCAgMjIsICA0MywgIDIzLCAgMTAsICAyOSwgIDgsICAgMCwKKyAgICA2LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMDEsIDQ1LCAgMTQ1LCA5MSwgIDM1LCAgMTI5LCA4MCwgIDI2LCAgMTE2LAorICAgIDY5LCAgMTUsICAxMDEsIDU5LCAgMCwgICA4NiwgIDQ2LCAgMCwgICA3MSwgIDMxLCAgMCwgICA1NSwgIDAsICAgMCwgICAzMywKKyAgICAwLCAgIDAsICAgMCwgICAxMDQsIDQ0LCAgMTMyLCA5MiwgIDM2LCAgMTE4LCA4MiwgIDI4LCAgMTA1LCA3MSwgIDE3LCAgOTEsCisgICAgNTgsICAzLCAgIDc3LCAgNDYsICAwLCAgIDYzLCAgMzEsICAwLCAgIDQ4LCAgMiwgICAwLCAgIDI2LCAgMCwgICAwLCAgIDAsCisgICAgMTA0LCA0NiwgIDEyMSwgOTMsICAzNywgIDEwNywgODIsICAzMCwgIDk2LCAgNzAsICAyMCwgIDgzLCAgNTgsICA2LCAgIDcwLAorICAgIDQ2LCAgMCwgICA1NywgIDMyLCAgMCwgICA0MSwgIDQsICAgMCwgICAyMCwgIDAsICAgMCwgICAwLCAgIDEwNCwgNDgsICAxMTAsCisgICAgOTMsICA0MCwgIDk4LCAgODIsICAzMSwgIDg3LCAgNzAsICAyMiwgIDc0LCAgNTksICA5LCAgIDYyLCAgNDUsICAwLCAgIDQ5LAorICAgIDMxLCAgMCwgICAzNSwgIDYsICAgMCwgICAxMywgIDAsICAgMCwgICAwLCAgIDEwNCwgNDgsICA5OSwgIDkyLCAgNDEsICA4OCwKKyAgICA4MiwgIDMyLCAgNzcsICA3MCwgIDIzLCAgNjUsICA1OCwgIDExLCAgNTQsICA0NiwgIDAsICAgNDIsICAzMiwgIDAsICAgMjcsCisgICAgNywgICAwLCAgIDUsICAgMCwgICAwLCAgIDAsICAgMTA1LCA1MCwgIDg4LCAgOTMsICA0MSwgIDc3LCAgODIsICAzNCwgIDY4LAorICAgIDcxLCAgMjQsICA1NywgIDU4LCAgMTMsICA0NiwgIDQ1LCAgMSwgICAzNSwgIDMxLCAgMCwgICAyMSwgIDcsICAgMCwgICAyLAorICAgIDAsICAgMCwgICAwLCAgIDEwNSwgNTAsICA3NiwgIDk0LCAgNDEsICA2NiwgIDgzLCAgMzQsICA1NywgIDcxLCAgMjUsICA0NywKKyAgICA1OCwgIDE1LCAgMzcsICA0NSwgIDIsICAgMjUsICAzMiwgIDAsICAgMTEsICA3LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxMDYsIDUwLCAgNjQsICA5NCwgIDQyLCAgNTUsICA4MywgIDM1LCAgNDcsICA3MSwgIDI2LCAgMzgsICA1OCwgIDE2LCAgMjcsCisgICAgNDUsICA0LCAgIDE3LCAgMzEsICAwLCAgIDQsICAgNywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTA2LCA1MSwgIDU0LAorICAgIDk1LCAgNDIsICA0NSwgIDgzLCAgMzUsICAzOCwgIDcxLCAgMjcsICAzMCwgIDU4LCAgMTYsICAxOSwgIDQ1LCAgNSwgICA3LAorICAgIDMwLCAgMCwgICAwLCAgIDYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTgxLCAyNDAsIDAsICAgMTYyLCAyMTYsCisgICAgMCwgICAxNDQsIDE5MywgMCwgICAxMjYsIDE2OCwgMCwgICAxMDksIDE0NiwgMCwgICA5MSwgIDEyMywgMCwgICA3MSwgIDk4LAorICAgIDAsICAgNDgsICA3MSwgIDAsICAgOSwgICAzNCwgIDAsICAgMTc5LCAyMTgsIDAsICAgMTYxLCAxOTUsIDAsICAgMTQ0LCAxNzQsCisgICAgMCwgICAxMjYsIDE1MywgMCwgICAxMDgsIDEzMiwgMCwgICA5MCwgIDExMCwgMCwgICA3MSwgIDg4LCAgMCwgICA0OCwgIDYzLAorICAgIDAsICAgOCwgICAyOSwgIDAsICAgMTc4LCAxOTcsIDAsICAgMTU5LCAxNzcsIDAsICAgMTQzLCAxNTksIDAsICAgMTI1LCAxMzksCisgICAgMCwgICAxMDcsIDExOSwgMCwgICA5MCwgIDk5LCAgMCwgICA3MSwgIDc5LCAgMCwgICA0OCwgIDU1LCAgMCwgICA4LCAgIDIyLAorICAgIDAsICAgMTc3LCAxNzcsIDAsICAgMTU4LCAxNTgsIDAsICAgMTQyLCAxNDEsIDAsICAgMTI0LCAxMjMsIDAsICAgMTA3LCAxMDYsCisgICAgMCwgICA4OSwgIDg4LCAgMCwgICA3MSwgIDcwLCAgMCwgICA0OCwgIDQ3LCAgMCwgICA4LCAgIDE0LCAgMCwgICAxNzYsIDE1NywKKyAgICAwLCAgIDE1OCwgMTQxLCAwLCAgIDE0MSwgMTI2LCAwLCAgIDEyMywgMTA5LCAwLCAgIDEwNiwgOTMsICAwLCAgIDg5LCAgNzgsCisgICAgMCwgICA3MCwgIDYwLCAgMCwgICA0NywgIDM5LCAgMCwgICA3LCAgIDUsICAgMCwgICAxNzUsIDEzOCwgMCwgICAxNTcsIDEyMywKKyAgICAwLCAgIDE0MSwgMTEwLCAwLCAgIDEyMywgOTYsICAwLCAgIDEwNSwgODEsICAwLCAgIDg4LCAgNjcsICAwLCAgIDcwLCAgNTEsCisgICAgMCwgICA0OCwgIDMwLCAgMCwgICA2LCAgIDAsICAgMCwgICAxNzMsIDExNSwgMCwgICAxNTUsIDEwNCwgMCwgICAxNDAsIDkyLAorICAgIDAsICAgMTIyLCA4MCwgIDAsICAgMTA1LCA2NywgIDAsICAgODgsICA1NSwgIDAsICAgNjksICA0MCwgIDAsICAgNDcsICAyMCwKKyAgICAwLCAgIDYsICAgMCwgICAwLCAgIDE3MywgOTQsICAwLCAgIDE1NSwgODUsICAwLCAgIDEzOSwgNzUsICAwLCAgIDEyMSwgNjQsCisgICAgMCwgICAxMDQsIDUzLCAgMCwgICA4OCwgIDQyLCAgMCwgICA3MCwgIDI4LCAgMCwgICA0NywgIDksICAgMCwgICA2LCAgIDAsCisgICAgMCwgICAxNzMsIDc2LCAgMCwgICAxNTUsIDcwLCAgMCwgICAxMzgsIDYxLCAgMCwgICAxMjIsIDUzLCAgMCwgICAxMDQsIDQ0LAorICAgIDAsICAgODcsICAzMiwgIDAsICAgNjksICAxOCwgIDAsICAgNDcsICAwLCAgIDAsICAgNiwgICAwLCAgIDAsICAgMTY0LCAyMjYsCisgICAgMCwgICAxNDcsIDIwMywgMCwgICAxMzEsIDE4MSwgMCwgICAxMTQsIDE1OCwgMCwgICA5NywgIDEzNiwgMCwgICA4MCwgIDExNSwKKyAgICAwLCAgIDYzLCAgOTIsICAwLCAgIDQwLCAgNjUsICAwLCAgIDAsICAgMzAsICAwLCAgIDE2MiwgMjA1LCAwLCAgIDE0NSwgMTg0LAorICAgIDAsICAgMTMwLCAxNjQsIDAsICAgMTE0LCAxNDMsIDAsICAgOTcsICAxMjQsIDAsICAgODEsICAxMDQsIDAsICAgNjMsICA4MywKKyAgICAwLCAgIDQwLCAgNTgsICAwLCAgIDAsICAgMjMsICAwLCAgIDE2MiwgMTg3LCAwLCAgIDE0NSwgMTY3LCAwLCAgIDEzMCwgMTUwLAorICAgIDAsICAgMTEzLCAxMzEsIDAsICAgOTYsICAxMTIsIDAsICAgODAsICA5MywgIDAsICAgNjIsICA3NCwgIDAsICAgNDAsICA1MCwKKyAgICAwLCAgIDAsICAgMTYsICAwLCAgIDE2MCwgMTY3LCAwLCAgIDE0NCwgMTUwLCAwLCAgIDEyOSwgMTM0LCAwLCAgIDExMiwgMTE2LAorICAgIDAsICAgOTYsICAxMDAsIDAsICAgODAsICA4MiwgIDAsICAgNjIsICA2NSwgIDAsICAgNDAsICA0MywgIDAsICAgMCwgICA3LAorICAgIDAsICAgMTYwLCAxNDgsIDAsICAgMTQzLCAxMzMsIDAsICAgMTI4LCAxMTgsIDAsICAgMTExLCAxMDMsIDAsICAgOTYsICA4OCwKKyAgICAwLCAgIDgwLCAgNzMsICAwLCAgIDYyLCAgNTYsICAwLCAgIDQwLCAgMzUsICAwLCAgIDAsICAgMCwgICAwLCAgIDE1OCwgMTMwLAorICAgIDAsICAgMTQyLCAxMTcsIDAsICAgMTI3LCAxMDQsIDAsICAgMTExLCA4OSwgIDAsICAgOTUsICA3NiwgIDAsICAgNzksICA2MiwKKyAgICAwLCAgIDYyLCAgNDYsICAwLCAgIDQwLCAgMjYsICAwLCAgIDAsICAgMCwgICAwLCAgIDE1OCwgMTExLCAwLCAgIDE0MSwgOTksCisgICAgMCwgICAxMjcsIDg4LCAgMCwgICAxMTEsIDc2LCAgMCwgICA5NSwgIDYzLCAgMCwgICA3OSwgIDUxLCAgMCwgICA2MiwgIDM3LAorICAgIDAsICAgNDAsICAxOCwgIDAsICAgMCwgICAwLCAgIDAsICAgMTU4LCA5MSwgIDAsICAgMTQxLCA4MSwgIDAsICAgMTI2LCA3MiwKKyAgICAwLCAgIDExMCwgNjIsICAwLCAgIDk0LCAgNTAsICAwLCAgIDc5LCAgMzksICAwLCAgIDYyLCAgMjUsICAwLCAgIDQwLCAgNSwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDE1NywgNzQsICAwLCAgIDE0MSwgNjYsICAwLCAgIDEyNiwgNTksICAwLCAgIDExMCwgNDksCisgICAgMCwgICA5NCwgIDQwLCAgMCwgICA3OCwgIDI5LCAgMCwgICA2MSwgIDE1LCAgMCwgICA0MCwgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAxNDgsIDIxNCwgMCwgICAxMzMsIDE5MiwgMCwgICAxMTksIDE3MSwgMCwgICAxMDMsIDE1MCwgMCwgICA4NywgIDEyOSwKKyAgICAwLCAgIDcyLCAgMTA4LCAwLCAgIDU1LCAgODYsICAwLCAgIDMyLCAgNjEsICAwLCAgIDAsICAgMjUsICAwLCAgIDE0NywgMTkzLAorICAgIDAsICAgMTMyLCAxNzMsIDAsICAgMTE4LCAxNTUsIDAsICAgMTAzLCAxMzYsIDAsICAgODcsICAxMTYsIDAsICAgNzIsICA5OCwKKyAgICAwLCAgIDU1LCAgNzgsICAwLCAgIDMyLCAgNTMsICAwLCAgIDAsICAgMTcsICAwLCAgIDE0NywgMTc2LCAwLCAgIDEzMiwgMTU4LAorICAgIDAsICAgMTE4LCAxNDIsIDAsICAgMTAyLCAxMjQsIDAsICAgODcsICAxMDYsIDAsICAgNzIsICA4OCwgIDAsICAgNTUsICA2OSwKKyAgICAwLCAgIDMzLCAgNDYsICAwLCAgIDAsICAgOSwgICAwLCAgIDE0NiwgMTU5LCAwLCAgIDEzMSwgMTQyLCAwLCAgIDExNywgMTI3LAorICAgIDAsICAgMTAyLCAxMTEsIDAsICAgODcsICA5NSwgIDAsICAgNzEsICA3OSwgIDAsICAgNTUsICA2MSwgIDAsICAgMzMsICAzOSwKKyAgICAwLCAgIDAsICAgMiwgICAwLCAgIDE0NSwgMTQwLCAwLCAgIDEzMCwgMTI2LCAwLCAgIDExNywgMTEyLCAwLCAgIDEwMSwgOTgsCisgICAgMCwgICA4NiwgIDgzLCAgMCwgICA3MSwgIDY4LCAgMCwgICA1NSwgIDUyLCAgMCwgICAzMywgIDMxLCAgMCwgICAwLCAgIDAsCisgICAgMCwgICAxNDQsIDEyNCwgMCwgICAxMzAsIDExMSwgMCwgICAxMTYsIDk5LCAgMCwgICAxMDEsIDg0LCAgMCwgICA4NiwgIDcyLAorICAgIDAsICAgNzEsICA1OSwgIDAsICAgNTUsICA0MywgIDAsICAgMzMsICAyMywgIDAsICAgMCwgICAwLCAgIDAsICAgMTQ0LCAxMDYsCisgICAgMCwgICAxMjksIDk0LCAgMCwgICAxMTUsIDgzLCAgMCwgICAxMDEsIDcyLCAgMCwgICA4NSwgIDYwLCAgMCwgICA3MSwgIDQ4LAorICAgIDAsICAgNTUsICAzNCwgIDAsICAgMzMsICAxNCwgIDAsICAgMCwgICAwLCAgIDMsICAgMTQzLCA4NiwgIDAsICAgMTI5LCA3NywKKyAgICAwLCAgIDExNSwgNjgsICAwLCAgIDEwMCwgNTgsICAwLCAgIDg1LCAgNDgsICAwLCAgIDcwLCAgMzYsICAwLCAgIDU0LCAgMjIsCisgICAgMCwgICAzMywgIDMsICAgMCwgICAwLCAgIDAsICAgMTgsICAxNDMsIDcyLCAgMTMsICAxMjgsIDYzLCAgMCwgICAxMTUsIDU3LAorICAgIDAsICAgMTAwLCA0NywgIDAsICAgODUsICAzNywgIDAsICAgNzAsICAyNiwgIDAsICAgNTQsICAxMywgIDAsICAgMzMsICAwLAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMTMyLCAyMDAsIDAsICAgMTE4LCAxNzksIDAsICAgMTA1LCAxNjEsIDAsICAgOTEsICAxNDAsCisgICAgMCwgICA3NiwgIDEyMSwgMCwgICA2MiwgIDEwMSwgMCwgICA0NiwgIDgxLCAgMCwgICAyNCwgIDU2LCAgMCwgICAwLCAgIDE5LAorICAgIDAsICAgMTMxLCAxODIsIDAsICAgMTE4LCAxNjMsIDAsICAgMTA1LCAxNDYsIDAsICAgOTEsICAxMjgsIDAsICAgNzcsICAxMTAsCisgICAgMCwgICA2MiwgIDkxLCAgMCwgICA0NiwgIDcyLCAgMCwgICAyNSwgIDQ4LCAgMCwgICAwLCAgIDExLCAgMCwgICAxMzEsIDE2NSwKKyAgICAwLCAgIDExNywgMTQ5LCAwLCAgIDEwNCwgMTMzLCAwLCAgIDkxLCAgMTE2LCAwLCAgIDc3LCAgOTksICAwLCAgIDYyLCAgODIsCisgICAgMCwgICA0NiwgIDY0LCAgMCwgICAyNSwgIDQxLCAgMCwgICAwLCAgIDQsICAgMCwgICAxMzEsIDE0OSwgMCwgICAxMTYsIDEzNCwKKyAgICAwLCAgIDEwNCwgMTE5LCAwLCAgIDkxLCAgMTA0LCAwLCAgIDc3LCAgODksICAwLCAgIDYyLCAgNzMsICAwLCAgIDQ2LCAgNTYsCisgICAgMCwgICAyNSwgIDM0LCAgMCwgICAwLCAgIDAsICAgMTAsICAxMzAsIDEzMywgMiwgICAxMTYsIDExOSwgMCwgICAxMDQsIDEwNiwKKyAgICAwLCAgIDkwLCAgOTEsICAwLCAgIDc2LCAgNzgsICAwLCAgIDYyLCAgNjQsICAwLCAgIDQ2LCAgNDgsICAwLCAgIDI2LCAgMjcsCisgICAgMCwgICAwLCAgIDAsICAgMjMsICAxMzAsIDExOCwgMjAsICAxMTYsIDEwNCwgMTMsICAxMDMsIDkzLCAgMywgICA4OSwgIDc5LAorICAgIDAsICAgNzYsICA2NywgIDAsICAgNjIsICA1NCwgIDAsICAgNDYsICAzOSwgIDAsICAgMjYsICAxOSwgIDAsICAgMCwgICAwLAorICAgIDMzLCAgMTI5LCAxMDEsIDI3LCAgMTE1LCA4OSwgIDE5LCAgMTAzLCA3OSwgIDksICAgODksICA2NywgIDAsICAgNzUsICA1NiwKKyAgICAwLCAgIDYxLCAgNDMsICAwLCAgIDQ2LCAgMjksICAwLCAgIDI2LCAgMTAsICAwLCAgIDAsICAgMCwgICA0MSwgIDEyOCwgODMsCisgICAgMzUsICAxMTUsIDczLCAgMjcsICAxMDIsIDY0LCAgMTUsICA4OSwgIDU1LCAgMCwgICA3NiwgIDQ1LCAgMCwgICA2MiwgIDMzLAorICAgIDAsICAgNDYsICAxOCwgIDAsICAgMjYsICAwLCAgIDAsICAgMCwgICAwLCAgIDQzLCAgMTI5LCA2OSwgIDM4LCAgMTE1LCA2MSwKKyAgICAzMCwgIDEwMiwgNTQsICAxNywgIDg5LCAgNDUsICAyLCAgIDc1LCAgMzQsICAwLCAgIDYxLCAgMjMsICAwLCAgIDQ2LCAgOSwKKyAgICAwLCAgIDI2LCAgMCwgICAwLCAgIDAsICAgMCwgICAxLCAgIDExNiwgMTg4LCAxLCAgIDEwNCwgMTY4LCAwLCAgIDkyLCAgMTUxLAorICAgIDAsICAgNzksICAxMzIsIDAsICAgNjYsICAxMTMsIDAsICAgNTIsICA5NCwgIDAsICAgMzYsICA3NSwgIDAsICAgMTQsICA1MiwKKyAgICAwLCAgIDAsICAgMTQsICAxNywgIDExNiwgMTcxLCAxNiwgIDEwNCwgMTUzLCAxNCwgIDkyLCAgMTM3LCA4LCAgIDc5LCAgMTE5LAorICAgIDAsICAgNjcsICAxMDIsIDAsICAgNTMsICA4NSwgIDAsICAgMzcsICA2NywgIDAsICAgMTYsICA0NCwgIDAsICAgMCwgICA0LAorICAgIDMxLCAgMTE2LCAxNTUsIDI3LCAgMTA0LCAxNDAsIDIxLCAgOTIsICAxMjUsIDEzLCAgNzksICAxMDksIDMsICAgNjYsICA5MywKKyAgICAwLCAgIDUzLCAgNzcsICAwLCAgIDM3LCAgNTksICAwLCAgIDE2LCAgMzgsICAwLCAgIDAsICAgMCwgICAzNywgIDExNSwgMTQxLAorICAgIDMwLCAgMTAzLCAxMjYsIDI2LCAgOTIsICAxMTIsIDE2LCAgNzksICA5OCwgIDUsICAgNjYsICA4MywgIDAsICAgNTMsICA2NywKKyAgICAwLCAgIDM4LCAgNTEsICAwLCAgIDE3LCAgMzEsICAwLCAgIDAsICAgMCwgICA0MSwgIDExNSwgMTI2LCAzNywgIDEwMywgMTEyLAorICAgIDMxLCAgOTIsICAxMDAsIDIyLCAgNzksICA4NiwgIDEwLCAgNjYsICA3MiwgIDAsICAgNTMsICA1OSwgIDAsICAgMzgsICA0NCwKKyAgICAwLCAgIDE3LCAgMjMsICAwLCAgIDAsICAgMCwgICA0OCwgIDExNSwgMTExLCA0MSwgIDEwMiwgOTksICAzNCwgIDkxLCAgODgsCisgICAgMjQsICA3OCwgIDc2LCAgMTQsICA2NiwgIDYzLCAgMCwgICA1MywgIDUwLCAgMCwgICAzOCwgIDM2LCAgMCwgICAxOCwgIDE1LAorICAgIDAsICAgMCwgICAwLCAgIDUxLCAgMTE1LCA5NSwgIDQ2LCAgMTAyLCA4NSwgIDM3LCAgOTEsICA3NCwgIDI2LCAgNzgsICA2MywKKyAgICAxNiwgIDY2LCAgNTIsICAwLCAgIDUzLCAgNDAsICAwLCAgIDM4LCAgMjYsICAwLCAgIDE4LCAgNSwgICAwLCAgIDAsICAgMCwKKyAgICA1NSwgIDExNCwgODAsICA0NywgIDEwMiwgNjksICA0MCwgIDkwLCAgNjAsICAzMCwgIDc4LCAgNTEsICAxOSwgIDY2LCAgNDEsCisgICAgMywgICA1MywgIDI5LCAgMCwgICAzOCwgIDE1LCAgMCwgICAxNywgIDAsICAgMCwgICAwLCAgIDAsICAgNTYsICAxMTQsIDY2LAorICAgIDUwLCAgMTAyLCA1OCwgIDQwLCAgOTEsICA1MCwgIDMyLCAgNzgsICA0MSwgIDE4LCAgNjYsICAzMiwgIDQsICAgNTMsICAyMSwKKyAgICAwLCAgIDM4LCAgNSwgICAwLCAgIDE3LCAgMCwgICAwLCAgIDAsICAgMCwgICAzOSwgIDEwMiwgMTc4LCAzNywgIDkwLCAgMTU5LAorICAgIDMwLCAgNzksICAxNDIsIDIxLCAgNjgsICAxMjQsIDE0LCAgNTUsICAxMDYsIDAsICAgNDIsICA4OSwgIDAsICAgMjYsICA3MCwKKyAgICAwLCAgIDQsICAgNDYsICAwLCAgIDAsICAgOCwgICA0OCwgIDEwMiwgMTYxLCA0MiwgIDkwLCAgMTQ1LCAzNSwgIDc5LCAgMTI4LAorICAgIDI2LCAgNjgsICAxMTIsIDE5LCAgNTUsICA5NiwgIDMsICAgNDMsICA3OSwgIDAsICAgMjcsICA2MiwgIDAsICAgNiwgICA0MCwKKyAgICAwLCAgIDAsICAgMCwgICA1MCwgIDEwMiwgMTQ3LCA0NCwgIDkwLCAgMTMyLCAzNywgIDc5LCAgMTE4LCAzMCwgIDY4LCAgMTAyLAorICAgIDIwLCAgNTYsICA4NywgIDcsICAgNDMsICA3MiwgIDAsICAgMjgsICA1NSwgIDAsICAgNiwgICAzNCwgIDAsICAgMCwgICAwLAorICAgIDUzLCAgMTAxLCAxMzMsIDQ3LCAgOTAsICAxMTgsIDQxLCAgNzksICAxMDYsIDMyLCAgNjgsICA5MSwgIDIxLCAgNTYsICA3OCwKKyAgICA5LCAgIDQzLCAgNjMsICAwLCAgIDI4LCAgNDcsICAwLCAgIDYsICAgMjYsICAwLCAgIDAsICAgMCwgICA1NywgIDEwMSwgMTE5LAorICAgIDUwLCAgODksICAxMDYsIDQyLCAgNzksICA5NCwgIDM0LCAgNjcsICA4MSwgIDI0LCAgNTYsICA2OCwgIDksICAgNDQsICA1NSwKKyAgICAwLCAgIDI5LCAgNDAsICAwLCAgIDYsICAgMTksICAwLCAgIDAsICAgMCwgICA2MCwgIDEwMCwgMTA1LCA1MCwgIDkwLCAgOTQsCisgICAgNDUsICA4MCwgIDgzLCAgMzYsICA2OCwgIDcxLCAgMjQsICA1NiwgIDU5LCAgMTEsICA0NCwgIDQ2LCAgMCwgICAyOSwgIDMyLAorICAgIDAsICAgNywgICAxMiwgIDAsICAgMCwgICAwLCAgIDYzLCAgMTAxLCA5MSwgIDU1LCAgOTAsICA4MCwgIDQ2LCAgNzksICA3MCwKKyAgICAzNywgIDY4LCAgNTksICAyNiwgIDU2LCAgNDksICAxMiwgIDQ0LCAgMzcsICAxLCAgIDI5LCAgMjMsICAwLCAgIDcsICAgMywKKyAgICAwLCAgIDAsICAgMCwgICA2NCwgIDEwMSwgNzUsICA1NiwgIDg5LCAgNjcsICA0OCwgIDc5LCAgNTcsICAzNywgIDY4LCAgNDgsCisgICAgMjcsICA1NiwgIDM3LCAgMTUsICA0NCwgIDI2LCAgMCwgICAyOSwgIDEyLCAgMCwgICA3LCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgNjYsICAxMDEsIDY0LCAgNTgsICA4OSwgIDU1LCAgNDksICA3OSwgIDQ3LCAgMzksICA2OCwgIDM4LCAgMjcsICA1NiwgIDI5LAorICAgIDE0LCAgNDQsICAxOCwgIDEsICAgMzAsICAyLCAgIDAsICAgNywgICAwLCAgIDAsICAgMCwgICAwLCAgIDU3LCAgODYsICAxNjUsCisgICAgNTEsICA3NSwgIDE0OCwgNDUsICA2NSwgIDEzMywgMzgsICA1NCwgIDExNiwgMjgsICA0MywgIDEwMCwgMTYsICAyOSwgIDgzLAorICAgIDAsICAgMTMsICA2NCwgIDAsICAgMCwgICA0MiwgIDAsICAgMCwgICAzLCAgIDYwLCAgODYsICAxNTEsIDU1LCAgNzUsICAxMzUsCisgICAgNDcsICA2NiwgIDEyMSwgMzksICA1NSwgIDEwNSwgMzAsICA0NCwgIDkwLCAgMTgsICAzMSwgIDc0LCAgMywgICAxNiwgIDU3LAorICAgIDAsICAgMSwgICAzNSwgIDAsICAgMCwgICAwLCAgIDYyLCAgODYsICAxMzksIDU2LCAgNzUsICAxMjMsIDQ5LCAgNjYsICAxMTAsCisgICAgNDAsICA1NSwgIDk1LCAgMzAsICA0NCwgIDgxLCAgMTksICAzMSwgIDY2LCAgNCwgICAxNywgIDUxLCAgMCwgICAxLCAgIDI5LAorICAgIDAsICAgMCwgICAwLCAgIDY1LCAgODYsICAxMjUsIDU2LCAgNzYsICAxMTIsIDQ5LCAgNjYsICA5OSwgIDM5LCAgNTUsICA4NiwKKyAgICAzMSwgIDQ0LCAgNzIsICAxOSwgIDMyLCAgNTksICA1LCAgIDE4LCAgNDQsICAwLCAgIDEsICAgMjMsICAwLCAgIDAsICAgMCwKKyAgICA2NywgIDg2LCAgMTEzLCA1OCwgIDc1LCAgMTAwLCA1MSwgIDY2LCAgODgsICA0MSwgIDU2LCAgNzcsICAzMSwgIDQ1LCAgNjQsCisgICAgMjAsICAzMiwgIDUxLCAgNiwgICAxOCwgIDM1LCAgMCwgICAxLCAgIDE0LCAgMCwgICAwLCAgIDAsICAgNjksICA4NiwgIDk5LAorICAgIDYxLCAgNzYsICA4OCwgIDUyLCAgNjYsICA3OCwgIDQzLCAgNTYsICA2NiwgIDMyLCAgNDUsICA1NSwgIDIwLCAgMzMsICA0MiwKKyAgICA3LCAgIDE5LCAgMjcsICAwLCAgIDEsICAgNiwgICAwLCAgIDAsICAgMCwgICA2OSwgIDg2LCAgODYsICA2MSwgIDc2LCAgNzUsCisgICAgNTMsICA2NywgIDY2LCAgNDMsICA1NiwgIDU1LCAgMzMsICA0NSwgIDQ1LCAgMjEsICAzNCwgIDM0LCAgOCwgICAyMCwgIDIwLAorICAgIDAsICAgMiwgICAyLCAgIDAsICAgMCwgICAwLCAgIDcxLCAgODYsICA3MiwgIDYzLCAgNzUsICA2MiwgIDU0LCAgNjYsICA1NSwKKyAgICA0NSwgIDU2LCAgNDUsICAzMywgIDQ1LCAgMzUsICAyMiwgIDM0LCAgMjMsICA3LCAgIDIwLCAgOCwgICAwLCAgIDIsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICA3MSwgIDg2LCAgNjIsICA2NCwgIDc1LCAgNTMsICA1NSwgIDY2LCAgNDYsICA0NSwgIDU2LCAgMzYsCisgICAgMzMsICA0NiwgIDI3LCAgMjIsICAzNCwgIDE1LCAgOCwgICAyMCwgIDAsICAgMCwgICAyLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgNjksICA2NywgIDE1NiwgNjEsICA1OCwgIDE0MCwgNTMsICA1MCwgIDEyNSwgNDUsICAzOSwgIDEwOCwgMzUsICAyOCwgIDkzLAorICAgIDI1LCAgMTIsICA3NywgIDEyLCAgMCwgICA1OSwgIDAsICAgMCwgICAzNywgIDAsICAgMCwgICAwLCAgIDcxLCAgNjgsICAxNDIsCisgICAgNjMsICA1OSwgIDEyNiwgNTYsICA1MCwgIDExNCwgNDcsICA0MCwgIDk4LCAgMzcsICAyOCwgIDg0LCAgMjYsICAxNSwgIDY4LAorICAgIDEyLCAgMCwgICA1MywgIDAsICAgMCwgICAzMCwgIDAsICAgMCwgICAwLCAgIDcyLCAgNjgsICAxMzAsIDYzLCAgNTksICAxMTYsCisgICAgNTYsICA1MCwgIDEwNCwgNDcsICA0MCwgIDkwLCAgMzgsICAzMCwgIDc1LCAgMjcsICAxNiwgIDYxLCAgMTMsICAwLCAgIDQ2LAorICAgIDAsICAgMCwgICAyNCwgIDAsICAgMCwgICAwLCAgIDczLCAgNjksICAxMTgsIDY1LCAgNTksICAxMDUsIDU3LCAgNTEsICA5MiwKKyAgICA0NywgIDQxLCAgODAsICAzNywgIDMwLCAgNjcsICAyNiwgIDE4LCAgNTMsICAxNCwgIDEsICAgMzksICAwLCAgIDAsICAgMTgsCisgICAgMCwgICAwLCAgIDAsICAgNzQsICA2OSwgIDEwNiwgNjUsICA2MCwgIDkzLCAgNTcsICA1MSwgIDgyLCAgNDgsICA0MSwgIDcwLAorICAgIDM4LCAgMzEsICA1OSwgIDI2LCAgMTksICA0NiwgIDEzLCAgMiwgICAzMiwgIDAsICAgMCwgICAxMCwgIDAsICAgMCwgICAwLAorICAgIDc2LCAgNjksICA5NSwgIDY2LCAgNjEsICA4NCwgIDU4LCAgNTIsICA3MywgIDQ4LCAgNDIsICA2MSwgIDM3LCAgMzIsICA1MCwKKyAgICAyNiwgIDIwLCAgMzgsICAxNCwgIDQsICAgMjQsICAwLCAgIDAsICAgNCwgICAwLCAgIDAsICAgMCwgICA3NiwgIDY5LCAgODEsCisgICAgNjgsICA2MCwgIDcyLCAgNTgsICA1MiwgIDYyLCAgNDgsICA0MiwgIDUxLCAgMzgsICAzMiwgIDQxLCAgMjcsICAyMSwgIDMwLAorICAgIDE0LCAgNCwgICAxNiwgIDAsICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDc2LCAgNjksICA2OCwgIDY4LCAgNjEsICA2MCwKKyAgICA2MCwgIDUyLCAgNTEsICA0OSwgIDQzLCAgNDEsICAzOCwgIDMzLCAgMzIsICAyNywgIDIxLCAgMjAsICAxNCwgIDUsICAgNSwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICA3OCwgIDcwLCAgNTksICA2OSwgIDYxLCAgNTAsICA2MCwgIDUyLCAgNDIsCisgICAgNDksICA0MywgIDM0LCAgMzksICAzMywgIDI0LCAgMjcsICAyMiwgIDEzLCAgMTQsICA3LCAgIDEsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgNzUsICA0NiwgIDE0NiwgNjgsICAzOCwgIDEzMSwgNjAsICAzMCwgIDExNywgNTAsICAxOSwgIDEwMiwKKyAgICA0MSwgIDQsICAgODcsICAyOSwgIDAsICAgNzIsICAxMywgIDAsICAgNTUsICAwLCAgIDAsICAgMzMsICAwLCAgIDAsICAgMCwKKyAgICA3OCwgIDQ3LCAgMTMyLCA3MCwgIDM5LCAgMTE5LCA2MSwgIDMwLCAgMTA1LCA1MywgIDIwLCAgOTIsICA0MiwgIDUsICAgNzgsCisgICAgMzAsICAwLCAgIDY0LCAgMTMsICAwLCAgIDQ5LCAgMCwgICAwLCAgIDI3LCAgMCwgICAwLCAgIDAsICAgNzksICA0OCwgIDEyMiwKKyAgICA3MCwgIDQwLCAgMTA4LCA2MiwgIDMyLCAgOTYsICA1MiwgIDIyLCAgODQsICA0MiwgIDksICAgNzEsICAzMCwgIDAsICAgNTgsCisgICAgMTQsICAwLCAgIDQyLCAgMCwgICAwLCAgIDIwLCAgMCwgICAwLCAgIDAsICAgNzksICA1MCwgIDExMSwgNzAsICA0MiwgIDk5LAorICAgIDYyLCAgMzMsICA4OCwgIDUyLCAgMjMsICA3NCwgIDQxLCAgMTEsICA2MywgIDI5LCAgMCwgICA1MCwgIDE0LCAgMCwgICAzNiwKKyAgICAwLCAgIDAsICAgMTQsICAwLCAgIDAsICAgMCwgICA4MCwgIDUwLCAgOTksICA3MCwgIDQyLCAgODksICA2MSwgIDM0LCAgNzgsCisgICAgNTIsICAyNSwgIDY3LCAgNDEsICAxNCwgIDU1LCAgMzAsICAwLCAgIDQyLCAgMTUsICAwLCAgIDI4LCAgMCwgICAwLCAgIDYsCisgICAgMCwgICAwLCAgIDAsICAgODEsICA1MSwgIDg5LCAgNzEsICA0MywgIDc4LCAgNjIsICAzNSwgIDY5LCAgNTIsICAyNSwgIDU4LAorICAgIDQyLCAgMTUsICA0NywgIDMwLCAgMywgICAzNiwgIDE1LCAgMCwgICAyMiwgIDAsICAgMCwgICAzLCAgIDAsICAgMCwgICAwLAorICAgIDgxLCAgNTEsICA3NywgIDcxLCAgNDQsICA2OCwgIDYzLCAgMzYsICA1OSwgIDUzLCAgMjYsICA0OSwgIDQxLCAgMTYsICAzOCwKKyAgICAzMSwgIDQsICAgMjcsICAxNiwgIDAsICAgMTIsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICA4MSwgIDUyLCAgNjUsCisgICAgNzIsICA0MywgIDU2LCAgNjMsICAzNiwgIDQ4LCAgNTMsICAyNywgIDM5LCAgNDEsICAxNywgIDI5LCAgMzAsICA0LCAgIDE4LAorICAgIDE0LCAgMCwgICAzLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDgxLCAgNTIsICA1NSwgIDczLCAgNDQsICA0NywKKyAgICA2NCwgIDM2LCAgMzksICA1MywgIDI4LCAgMzIsICA0MiwgIDE4LCAgMjEsICAzMSwgIDYsICAgOSwgICAxNCwgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE3NCwgMjM5LCAwLCAgIDE1NiwgMjE0LCAwLCAgIDEzOSwgMTkyLAorICAgIDAsICAgMTIxLCAxNjgsIDAsICAgMTA1LCAxNDUsIDAsICAgODcsICAxMjMsIDAsICAgNjgsICA5OCwgIDAsICAgNDYsICA3MCwKKyAgICAwLCAgIDMsICAgMzUsICAwLCAgIDE3MiwgMjE3LCAwLCAgIDE1NSwgMTk0LCAwLCAgIDEzOSwgMTczLCAwLCAgIDEyMSwgMTUyLAorICAgIDAsICAgMTA0LCAxMzAsIDAsICAgODcsICAxMTAsIDAsICAgNjksICA4OCwgIDAsICAgNDYsICA2MywgIDAsICAgNCwgICAyOCwKKyAgICAwLCAgIDE3MSwgMTk3LCAwLCAgIDE1MywgMTc1LCAwLCAgIDEzOCwgMTU4LCAwLCAgIDEyMSwgMTM5LCAwLCAgIDEwMywgMTE4LAorICAgIDAsICAgODYsICAxMDAsIDAsICAgNjgsICA3OSwgIDAsICAgNDYsICA1NSwgIDAsICAgNCwgICAyMiwgIDAsICAgMTcwLCAxNzcsCisgICAgMCwgICAxNTIsIDE1OCwgMCwgICAxMzYsIDE0MSwgMCwgICAxMTksIDEyNCwgMCwgICAxMDMsIDEwNiwgMCwgICA4NiwgIDg4LAorICAgIDAsICAgNjgsICA3MCwgIDAsICAgNDUsICA0NywgIDAsICAgMywgICAxNCwgIDAsICAgMTY5LCAxNTcsIDAsICAgMTUyLCAxNDEsCisgICAgMCwgICAxMzYsIDEyNiwgMCwgICAxMTksIDEwOSwgMCwgICAxMDIsIDk0LCAgMCwgICA4NiwgIDc4LCAgMCwgICA2OCwgIDYwLAorICAgIDAsICAgNDYsICAzOSwgIDAsICAgMywgICA1LCAgIDAsICAgMTY3LCAxMzgsIDAsICAgMTUwLCAxMjQsIDAsICAgMTM1LCAxMTEsCisgICAgMCwgICAxMTgsIDk3LCAgMCwgICAxMDIsIDgyLCAgMCwgICA4NSwgIDY4LCAgMCwgICA2OCwgIDUyLCAgMCwgICA0NiwgIDMxLAorICAgIDAsICAgMywgICAwLCAgIDAsICAgMTY3LCAxMTgsIDAsICAgMTUwLCAxMDQsIDAsICAgMTM1LCA5NCwgIDAsICAgMTE4LCA4MSwKKyAgICAwLCAgIDEwMSwgNjksICAwLCAgIDg0LCAgNTYsICAwLCAgIDY3LCAgNDEsICAwLCAgIDQ1LCAgMjEsICAwLCAgIDMsICAgMCwKKyAgICAwLCAgIDE2NiwgOTcsICAwLCAgIDE0OSwgODcsICAwLCAgIDEzNCwgNzcsICAwLCAgIDExNywgNjcsICAwLCAgIDEwMSwgNTYsCisgICAgMCwgICA4NSwgIDQ0LCAgMCwgICA2NywgIDMwLCAgMCwgICA0NSwgIDEwLCAgMCwgICAzLCAgIDAsICAgMCwgICAxNjUsIDc5LAorICAgIDAsICAgMTQ5LCA3MywgIDAsICAgMTMzLCA2NCwgIDAsICAgMTE3LCA1NiwgIDAsICAgMTAxLCA0NiwgIDAsICAgODUsICAzNCwKKyAgICAwLCAgIDY4LCAgMjEsICAwLCAgIDQ2LCAgMSwgICAwLCAgIDMsICAgMCwgICAwLCAgIDE1OCwgMjI1LCAwLCAgIDE0MSwgMjAxLAorICAgIDAsICAgMTI2LCAxODAsIDAsICAgMTA5LCAxNTgsIDAsICAgOTQsICAxMzYsIDAsICAgNzgsICAxMTQsIDAsICAgNjAsICA5MSwKKyAgICAwLCAgIDM4LCAgNjYsICAwLCAgIDAsICAgMzAsICAwLCAgIDE1NiwgMjAzLCAwLCAgIDE0MCwgMTgzLCAwLCAgIDEyNSwgMTY0LAorICAgIDAsICAgMTA5LCAxNDMsIDAsICAgOTQsICAxMjQsIDAsICAgNzgsICAxMDQsIDAsICAgNjEsICA4MywgIDAsICAgMzgsICA1NywKKyAgICAwLCAgIDAsICAgMjMsICAwLCAgIDE1NiwgMTg2LCAwLCAgIDE0MCwgMTY2LCAwLCAgIDEyNSwgMTUwLCAwLCAgIDEwOSwgMTMwLAorICAgIDAsICAgOTMsICAxMTEsIDAsICAgNzcsICA5MywgIDAsICAgNjAsICA3NCwgIDAsICAgMzgsICA1MCwgIDAsICAgMCwgICAxNywKKyAgICAwLCAgIDE1NSwgMTY3LCAwLCAgIDEzOCwgMTQ5LCAwLCAgIDEyNCwgMTM0LCAwLCAgIDEwOSwgMTE3LCAwLCAgIDkzLCAgMTAwLAorICAgIDAsICAgNzYsICA4MywgIDAsICAgNjAsICA2NSwgIDAsICAgMzgsICA0MywgIDAsICAgMCwgICA5LCAgIDAsICAgMTUzLCAxNDcsCisgICAgMCwgICAxMzgsIDEzNCwgMCwgICAxMjQsIDEyMCwgMCwgICAxMDcsIDEwMywgMCwgICA5MiwgIDg4LCAgMCwgICA3NywgIDczLAorICAgIDAsICAgNjAsICA1NiwgIDAsICAgMzgsICAzNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTUzLCAxMzEsIDAsICAgMTM3LCAxMTgsCisgICAgMCwgICAxMjIsIDEwNSwgMCwgICAxMDcsIDkwLCAgMCwgICA5MSwgIDc2LCAgMCwgICA3NiwgIDYzLCAgMCwgICA2MCwgIDQ3LAorICAgIDAsICAgMzksICAyOCwgIDAsICAgMCwgICAwLCAgIDAsICAgMTUzLCAxMTEsIDAsICAgMTM2LCAxMDAsIDAsICAgMTIzLCA5MCwKKyAgICAwLCAgIDEwNywgNzcsICAwLCAgIDkyLCAgNjUsICAwLCAgIDc2LCAgNTIsICAwLCAgIDYwLCAgMzcsICAwLCAgIDM4LCAgMTgsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAxNTIsIDkzLCAgMCwgICAxMzYsIDgyLCAgMCwgICAxMjIsIDc0LCAgMCwgICAxMDYsIDYzLAorICAgIDAsICAgOTEsICA1MiwgIDAsICAgNzYsICA0MCwgIDAsICAgNTksICAyNiwgIDAsICAgMzgsICA2LCAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMTUxLCA3OCwgIDAsICAgMTM2LCA2OSwgIDAsICAgMTIxLCA2MSwgIDAsICAgMTA2LCA1MiwgIDAsICAgOTEsICA0MywKKyAgICAwLCAgIDc2LCAgMzIsICAwLCAgIDU5LCAgMTcsICAwLCAgIDM4LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE0MywgMjEzLAorICAgIDAsICAgMTI4LCAxOTEsIDAsICAgMTE1LCAxNzEsIDAsICAgMTAwLCAxNDksIDAsICAgODQsICAxMjgsIDAsICAgNjksICAxMDgsCisgICAgMCwgICA1MiwgIDg2LCAgMCwgICAzMCwgIDYxLCAgMCwgICAwLCAgIDI1LCAgMCwgICAxNDIsIDE5MywgMCwgICAxMjcsIDE3MywKKyAgICAwLCAgIDExNCwgMTU0LCAwLCAgIDk5LCAgMTM0LCAwLCAgIDg0LCAgMTE2LCAwLCAgIDY5LCAgOTgsICAwLCAgIDUyLCAgNzcsCisgICAgMCwgICAzMSwgIDUzLCAgMCwgICAwLCAgIDE4LCAgMCwgICAxNDEsIDE3NiwgMCwgICAxMjcsIDE1OCwgMCwgICAxMTQsIDE0MSwKKyAgICAwLCAgIDk4LCAgMTIyLCAwLCAgIDg0LCAgMTA1LCAwLCAgIDY5LCAgODgsICAwLCAgIDUzLCAgNjksICAwLCAgIDMxLCAgNDYsCisgICAgMCwgICAwLCAgIDksICAgMCwgICAxNDEsIDE1OSwgMCwgICAxMjYsIDE0MiwgMCwgICAxMTMsIDEyNywgMCwgICA5OCwgIDExMCwKKyAgICAwLCAgIDgzLCAgOTUsICAwLCAgIDY5LCAgNzgsICAwLCAgIDUzLCAgNjAsICAwLCAgIDMyLCAgMzksICAwLCAgIDAsICAgMiwKKyAgICAwLCAgIDE0MCwgMTQwLCAwLCAgIDEyNiwgMTI2LCAwLCAgIDExMiwgMTEyLCAwLCAgIDk4LCAgOTgsICAwLCAgIDgzLCAgODMsCisgICAgMCwgICA2OCwgIDY5LCAgMCwgICA1MiwgIDUyLCAgMCwgICAzMSwgIDMxLCAgMCwgICAwLCAgIDAsICAgMCwgICAxNDAsIDEyNCwKKyAgICAwLCAgIDEyNSwgMTEyLCAwLCAgIDExMiwgMTAwLCAwLCAgIDk3LCAgODYsICAwLCAgIDgzLCAgNzIsICAwLCAgIDY4LCAgNTksCisgICAgMCwgICA1MiwgIDQ0LCAgMCwgICAzMSwgIDIzLCAgMCwgICAwLCAgIDAsICAgMCwgICAxMzksIDEwNiwgMCwgICAxMjUsIDk2LAorICAgIDAsICAgMTExLCA4NSwgIDAsICAgOTcsICA3MiwgIDAsICAgODMsICA2MiwgIDAsICAgNjgsICA0OSwgIDAsICAgNTIsICAzNSwKKyAgICAwLCAgIDMxLCAgMTUsICAwLCAgIDAsICAgMCwgICAwLCAgIDEzOCwgODgsICAwLCAgIDEyNCwgNzksICAwLCAgIDExMSwgNzAsCisgICAgMCwgICA5NiwgIDU5LCAgMCwgICA4MiwgIDQ4LCAgMCwgICA2OCwgIDM4LCAgMCwgICA1MiwgIDI0LCAgMCwgICAzMSwgIDQsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAxMzksIDc2LCAgMCwgICAxMjQsIDY2LCAgMCwgICAxMTEsIDU4LCAgMCwgICA5NiwgIDUwLAorICAgIDAsICAgODIsICA0MCwgIDAsICAgNjgsICAyOSwgIDAsICAgNTIsICAxNSwgIDAsICAgMzEsICAwLCAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMTI5LCAyMDAsIDAsICAgMTE0LCAxNzksIDAsICAgMTAyLCAxNjAsIDAsICAgODcsICAxMzksIDAsICAgNzQsICAxMjAsCisgICAgMCwgICA2MCwgIDEwMSwgMCwgICA0NCwgIDgxLCAgMCwgICAyMiwgIDU2LCAgMCwgICAwLCAgIDE5LCAgMCwgICAxMjcsIDE4MSwKKyAgICAwLCAgIDExNCwgMTYzLCAwLCAgIDEwMiwgMTQ2LCAwLCAgIDg4LCAgMTI3LCAwLCAgIDc0LCAgMTA5LCAwLCAgIDYwLCAgOTEsCisgICAgMCwgICA0NCwgIDcyLCAgMCwgICAyMywgIDQ4LCAgMCwgICAwLCAgIDExLCAgMCwgICAxMjcsIDE2NiwgMCwgICAxMTMsIDE0OCwKKyAgICAwLCAgIDEwMSwgMTMzLCAwLCAgIDg3LCAgMTE1LCAwLCAgIDc0LCAgOTksICAwLCAgIDYwLCAgODIsICAwLCAgIDQ0LCAgNjQsCisgICAgMCwgICAyMywgIDQyLCAgMCwgICAwLCAgIDQsICAgMCwgICAxMjcsIDE1MCwgMCwgICAxMTMsIDEzNCwgMCwgICAxMDEsIDExOSwKKyAgICAwLCAgIDg3LCAgMTA0LCAwLCAgIDc0LCAgODksICAwLCAgIDYwLCAgNzMsICAwLCAgIDQ0LCAgNTYsICAwLCAgIDIzLCAgMzUsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAxMjUsIDEzNCwgMCwgICAxMTIsIDExOCwgMCwgICAxMDAsIDEwNiwgMCwgICA4NywgIDkyLAorICAgIDAsICAgNzMsICA3OCwgIDAsICAgNjAsICA2NCwgIDAsICAgNDQsICA0OCwgIDAsICAgMjMsICAyNywgIDAsICAgMCwgICAwLAorICAgIDAsICAgMTI1LCAxMTgsIDAsICAgMTEyLCAxMDUsIDAsICAgMTAwLCA5NCwgIDAsICAgODYsICA4MCwgIDAsICAgNzMsICA2OCwKKyAgICAwLCAgIDYwLCAgNTQsICAwLCAgIDQ0LCAgMzksICAwLCAgIDIzLCAgMjAsICAwLCAgIDAsICAgMCwgICAwLCAgIDEyNSwgMTAxLAorICAgIDAsICAgMTExLCA5MCwgIDAsICAgOTksICA4MCwgIDAsICAgODYsICA2OSwgIDAsICAgNzMsICA1OCwgIDAsICAgNTksICA0NSwKKyAgICAwLCAgIDQ0LCAgMzAsICAwLCAgIDIzLCAgMTEsICAwLCAgIDAsICAgMCwgICAwLCAgIDEyNCwgODUsICAwLCAgIDExMSwgNzUsCisgICAgMCwgICA5OSwgIDY2LCAgMCwgICA4NiwgIDU2LCAgMCwgICA3MywgIDQ1LCAgMCwgICA1OSwgIDM0LCAgMCwgICA0NCwgIDIwLAorICAgIDAsICAgMjMsICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTI1LCA3MiwgIDAsICAgMTExLCA2MiwgIDAsICAgOTksICA1NiwKKyAgICAwLCAgIDg2LCAgNDYsICAwLCAgIDczLCAgMzYsICAwLCAgIDYwLCAgMjYsICAwLCAgIDQ0LCAgMTIsICAwLCAgIDIzLCAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDExNCwgMTg4LCAwLCAgIDEwMSwgMTY3LCAwLCAgIDg5LCAgMTUwLCAwLCAgIDc3LCAgMTMxLAorICAgIDAsICAgNjQsICAxMTMsIDAsICAgNTAsICA5NSwgIDAsICAgMzQsICA3NSwgIDAsICAgMTIsICA1MiwgIDAsICAgMCwgICAxNCwKKyAgICAwLCAgIDExMywgMTcwLCAwLCAgIDEwMSwgMTUzLCAwLCAgIDg5LCAgMTM3LCAwLCAgIDc3LCAgMTIwLCAwLCAgIDY0LCAgMTAyLAorICAgIDAsICAgNTAsICA4NSwgIDAsICAgMzUsICA2NywgIDAsICAgMTIsICA0NCwgIDAsICAgMCwgICA0LCAgIDAsICAgMTEzLCAxNTYsCisgICAgMCwgICAxMDAsIDEzOSwgMCwgICA4OSwgIDEyNSwgMCwgICA3NywgIDEwOSwgMCwgICA2NCwgIDkyLCAgMCwgICA1MSwgIDc3LAorICAgIDAsICAgMzUsICA2MCwgIDAsICAgMTIsICAzOCwgIDAsICAgMCwgICAwLCAgIDAsICAgMTEyLCAxNDEsIDAsICAgMTAwLCAxMjYsCisgICAgMCwgICA4OSwgIDExMywgMCwgICA3NywgIDk4LCAgMCwgICA2NCwgIDgzLCAgMCwgICA1MSwgIDY4LCAgMCwgICAzNSwgIDUxLAorICAgIDAsICAgMTIsICAzMCwgIDAsICAgMCwgICAwLCAgIDAsICAgMTEyLCAxMjcsIDAsICAgMTAwLCAxMTIsIDAsICAgODksICAxMDAsCisgICAgMCwgICA3NiwgIDg3LCAgMCwgICA2NCwgIDc0LCAgMCwgICA1MSwgIDU5LCAgMCwgICAzNSwgIDQ0LCAgMCwgICAxMywgIDI0LAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMTEyLCAxMTEsIDAsICAgMTAwLCAxMDAsIDAsICAgODgsICA4OCwgIDAsICAgNzYsICA3NiwKKyAgICAwLCAgIDY0LCAgNjQsICAwLCAgIDUxLCAgNTIsICAwLCAgIDM2LCAgMzcsICAwLCAgIDEzLCAgMTcsICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDExMSwgOTYsICAwLCAgIDk5LCAgODUsICAwLCAgIDg4LCAgNzYsICAwLCAgIDc2LCAgNjQsICAwLCAgIDY0LCAgNTMsCisgICAgMCwgICA1MSwgIDQxLCAgMCwgICAzNiwgIDI3LCAgMCwgICAxMywgIDYsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMTEsIDgxLAorICAgIDAsICAgOTksICA3MSwgIDAsICAgODgsICA2MiwgIDAsICAgNzYsICA1MiwgIDAsICAgNjQsICA0MywgIDAsICAgNTEsICAzMSwKKyAgICAwLCAgIDM2LCAgMTcsICAwLCAgIDEzLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDExMSwgNjksICAwLCAgIDk5LCAgNjAsCisgICAgMCwgICA4OCwgIDUyLCAgMCwgICA3NSwgIDQzLCAgMCwgICA2MywgIDM0LCAgMCwgICA1MSwgIDIxLCAgMCwgICAzNiwgIDcsCisgICAgMCwgICAxMywgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICA5OSwgIDE3NywgMCwgICA4OCwgIDE1OCwgMCwgICA3NywgIDE0MSwKKyAgICAwLCAgIDY2LCAgMTIzLCAwLCAgIDUzLCAgMTA2LCAwLCAgIDQwLCAgODksICAwLCAgIDI1LCAgNzEsICAwLCAgIDUsICAgNDcsCisgICAgMCwgICAwLCAgIDgsICAgMCwgICA5OSwgIDE2MCwgMCwgICA4OCwgIDE0NCwgMCwgICA3NywgIDEyOSwgMCwgICA2NiwgIDExMiwKKyAgICAwLCAgIDU0LCAgOTcsICAwLCAgIDQxLCAgODAsICAwLCAgIDI2LCAgNjIsICAwLCAgIDUsICAgNDAsICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDk5LCAgMTQ3LCAwLCAgIDg3LCAgMTMyLCAwLCAgIDc4LCAgMTE3LCAwLCAgIDY2LCAgMTAyLCAwLCAgIDU0LCAgODcsCisgICAgMCwgICA0MiwgIDcyLCAgMCwgICAyNiwgIDU1LCAgMCwgICA1LCAgIDM0LCAgMCwgICAwLCAgIDAsICAgMCwgICA5OSwgIDEzNCwKKyAgICAwLCAgIDg4LCAgMTE5LCAwLCAgIDc3LCAgMTA3LCAwLCAgIDY2LCAgOTIsICAwLCAgIDU0LCAgNzgsICAwLCAgIDQyLCAgNjQsCisgICAgMCwgICAyNywgIDQ4LCAgMCwgICA1LCAgIDI3LCAgMCwgICAwLCAgIDAsICAgMCwgICA5OSwgIDEyMCwgMCwgICA4NywgIDEwNywKKyAgICAwLCAgIDc4LCAgOTQsICAwLCAgIDY2LCAgODEsICAwLCAgIDU0LCAgNjgsICAwLCAgIDQyLCAgNTUsICAwLCAgIDI3LCAgNDAsCisgICAgMCwgICA2LCAgIDIwLCAgMCwgICAwLCAgIDAsICAgMCwgICA5OCwgIDEwNSwgMCwgICA4NywgIDk0LCAgMCwgICA3NywgIDg0LAorICAgIDAsICAgNjUsICA3MSwgIDAsICAgNTUsICA1OSwgIDAsICAgNDIsICA0NywgIDAsICAgMjgsICAzMywgIDAsICAgNiwgICAxMiwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDk4LCAgOTMsICAwLCAgIDg3LCAgODEsICAwLCAgIDc3LCAgNzIsICAwLCAgIDY2LCAgNjEsCisgICAgMCwgICA1NCwgIDQ5LCAgMCwgICA0MiwgIDM3LCAgMCwgICAyOCwgIDI0LCAgMCwgICA2LCAgIDQsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICA5OCwgIDc3LCAgMCwgICA4NywgIDY4LCAgMCwgICA3NywgIDU5LCAgMCwgICA2NSwgIDQ5LCAgMCwgICA1NCwgIDM5LAorICAgIDAsICAgNDIsICAyNywgIDAsICAgMjksICAxNCwgIDAsICAgNiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEsICAgOTgsICA2NSwKKyAgICA3LCAgIDg3LCAgNTYsICAwLCAgIDc3LCAgNDksICAwLCAgIDY2LCAgNDEsICAwLCAgIDU0LCAgMzAsICAwLCAgIDQyLCAgMTksCisgICAgMCwgICAyOSwgIDMsICAgMCwgICA2LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICA4NCwgIDE2NiwgMCwgICA3NCwgIDE0OSwKKyAgICAwLCAgIDY0LCAgMTM0LCAwLCAgIDUzLCAgMTE3LCAwLCAgIDQxLCAgMTAwLCAwLCAgIDI4LCAgODMsICAwLCAgIDExLCAgNjQsCisgICAgMCwgICAwLCAgIDQyLCAgMCwgICAwLCAgIDMsICAgMCwgICA4NCwgIDE1MSwgMCwgICA3NCwgIDEzNSwgMCwgICA2NCwgIDEyMSwKKyAgICAwLCAgIDUzLCAgMTA1LCAwLCAgIDQyLCAgOTAsICAwLCAgIDMwLCAgNzUsICAwLCAgIDE0LCAgNTgsICAwLCAgIDAsICAgMzYsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICA4NCwgIDEzOCwgMCwgICA3NCwgIDEyNCwgMSwgICA2NCwgIDExMCwgMCwgICA1NCwgIDk1LAorICAgIDAsICAgNDMsICA4MSwgIDAsICAgMzAsICA2NywgIDAsICAgMTUsICA1MSwgIDAsICAgMSwgICAyOSwgIDAsICAgMCwgICAwLAorICAgIDE0LCAgODQsICAxMjYsIDEyLCAgNzQsICAxMTIsIDIsICAgNjUsICA5OSwgIDAsICAgNTQsICA4NSwgIDAsICAgNDQsICA3MywKKyAgICAwLCAgIDMxLCAgNTksICAwLCAgIDE2LCAgNDQsICAwLCAgIDEsICAgMjMsICAwLCAgIDAsICAgMCwgICAxNiwgIDg0LCAgMTEzLAorICAgIDEzLCAgNzQsICAxMDAsIDYsICAgNjUsICA4OSwgIDAsICAgNTQsICA3NywgIDAsICAgNDQsICA2NSwgIDAsICAgMzEsICA1MSwKKyAgICAwLCAgIDE3LCAgMzYsICAwLCAgIDEsICAgMTYsICAwLCAgIDAsICAgMCwgICAyNCwgIDg0LCAgMTAwLCAxOCwgIDc0LCAgODgsCisgICAgMTMsICA2NSwgIDc4LCAgMiwgICA1NSwgIDY4LCAgMCwgICA0NCwgIDU1LCAgMCwgICAzMiwgIDQzLCAgMCwgICAxOCwgIDI4LAorICAgIDAsICAgMSwgICA2LCAgIDAsICAgMCwgICAwLCAgIDI2LCAgODQsICA4NywgIDI0LCAgNzQsICA3NiwgIDE3LCAgNjUsICA2NywKKyAgICA3LCAgIDU0LCAgNTcsICAwLCAgIDQ0LCAgNDYsICAwLCAgIDMyLCAgMzUsICAwLCAgIDE5LCAgMjEsICAwLCAgIDIsICAgMywKKyAgICAwLCAgIDAsICAgMCwgICAzMCwgIDg0LCAgNzQsICAyOCwgIDc0LCAgNjQsICAyMCwgIDY1LCAgNTUsICAxMiwgIDU1LCAgNDYsCisgICAgMCwgICA0NCwgIDM1LCAgMCwgICAzMiwgIDI0LCAgMCwgICAxOCwgIDksICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMzIsICA4NCwgIDYzLCAgMjgsICA3NCwgIDU0LCAgMjEsICA2NSwgIDQ3LCAgMTMsICA1NCwgIDM4LCAgMCwgICA0NCwgIDI4LAorICAgIDAsICAgMzIsICAxNiwgIDAsICAgMTgsICAxLCAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDMwLCAgNjcsICAxNTUsCisgICAgMjAsICA1OCwgIDEzOSwgMjAsICA0OSwgIDEyNiwgMTIsICAzOSwgIDExMCwgMCwgICAyNywgIDk0LCAgMCwgICAxMywgIDc3LAorICAgIDAsICAgMCwgICA2MCwgIDAsICAgMCwgICAzNywgIDAsICAgMCwgICAwLCAgIDM1LCAgNjcsICAxNDIsIDMwLCAgNTgsICAxMjYsCisgICAgMjMsICA1MCwgIDExNCwgMTYsICA0MCwgIDk5LCAgNywgICAyOSwgIDg1LCAgMCwgICAxNSwgIDY5LCAgMCwgICAwLCAgIDUyLAorICAgIDAsICAgMCwgICAzMCwgIDAsICAgMCwgICAwLCAgIDM1LCAgNjgsICAxMzEsIDMwLCAgNTksICAxMTYsIDI3LCAgNTAsICAxMDQsCisgICAgMTgsICA0MCwgIDkwLCAgOSwgICAyOSwgIDc2LCAgMCwgICAxNywgIDYyLCAgMCwgICAyLCAgIDQ2LCAgMCwgICAwLCAgIDI0LAorICAgIDAsICAgMCwgICAwLCAgIDM3LCAgNjksICAxMTksIDMzLCAgNTksICAxMDYsIDI3LCAgNTEsICA5NCwgIDIxLCAgNDEsICA4MCwKKyAgICA5LCAgIDMwLCAgNjcsICAwLCAgIDE4LCAgNTQsICAwLCAgIDMsICAgMzksICAwLCAgIDAsICAgMTgsICAwLCAgIDAsICAgMCwKKyAgICA0MCwgIDY5LCAgMTA3LCAzNiwgIDU5LCAgOTQsICAyOCwgIDUxLCAgODQsICAxOCwgIDQxLCAgNzIsICAxMCwgIDMxLCAgNjAsCisgICAgMCwgICAxOSwgIDQ3LCAgMCwgICA0LCAgIDMyLCAgMCwgICAwLCAgIDEwLCAgMCwgICAwLCAgIDAsICAgNDIsICA2OSwgIDk1LAorICAgIDM2LCAgNTksICA4NCwgIDI5LCAgNTEsICA3NCwgIDE5LCAgNDEsICA2MywgIDEwLCAgMzEsICA1MiwgIDAsICAgMjAsICAzOSwKKyAgICAwLCAgIDQsICAgMjUsICAwLCAgIDAsICAgNCwgICAwLCAgIDAsICAgMCwgICA0MywgIDY5LCAgODMsICAzOCwgIDYwLCAgNzMsCisgICAgMzIsICA1MSwgIDYyLCAgMjMsICA0MiwgIDUzLCAgMTEsICAzMSwgIDQyLCAgMCwgICAyMCwgIDMxLCAgMCwgICA1LCAgIDE3LAorICAgIDAsICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDQ1LCAgNjksICA3MCwgIDM5LCAgNjAsICA2MCwgIDMzLCAgNTEsICA1MiwKKyAgICAyNCwgIDQyLCAgNDMsICAxMywgIDMyLCAgMzMsICAwLCAgIDIxLCAgMjEsICAwLCAgIDUsICAgNiwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICA0NywgIDY5LCAgNTksICA0MSwgIDYwLCAgNTEsICAzNCwgIDUxLCAgNDMsICAyNCwgIDQyLCAgMzUsCisgICAgMTIsICAzMywgIDI2LCAgMSwgICAyMiwgIDE0LCAgMCwgICA1LCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgNDYsICA0OCwgIDE0NiwgNDIsICA0MCwgIDEzMSwgMzYsICAzMiwgIDExOCwgMjcsICAyMiwgIDEwMywgMTcsICA2LCAgIDg4LAorICAgIDUsICAgMCwgICA3MywgIDAsICAgMCwgICA1NSwgIDAsICAgMCwgICAzMywgIDAsICAgMCwgICAwLCAgIDQ4LCAgNDgsICAxMzMsCisgICAgNDQsICA0MCwgIDExOSwgMzcsICAzMiwgIDEwNywgMjgsICAyMiwgIDkzLCAgMjAsICA4LCAgIDc5LCAgNywgICAwLCAgIDY1LAorICAgIDAsICAgMCwgICA0OSwgIDAsICAgMCwgICAyNywgIDAsICAgMCwgICAwLCAgIDQ4LCAgNTAsICAxMjMsIDQ0LCAgNDEsICAxMDksCisgICAgMzcsICAzMywgIDk3LCAgMzAsICAyMywgIDgzLCAgMjEsICAxMSwgIDcxLCAgOCwgICAwLCAgIDU4LCAgMCwgICAwLCAgIDQyLAorICAgIDAsICAgMCwgICAyMSwgIDAsICAgMCwgICAwLCAgIDQ5LCAgNTEsICAxMTEsIDQ1LCAgNDIsICA5OSwgIDM4LCAgMzQsICA4NywKKyAgICAyOSwgIDI1LCAgNzUsICAyMCwgIDEzLCAgNjMsICA4LCAgIDAsICAgNTEsICAwLCAgIDAsICAgMzYsICAwLCAgIDAsICAgMTQsCisgICAgMCwgICAwLCAgIDAsICAgNTIsICA1MiwgIDEwMCwgNDQsICA0MywgIDg5LCAgMzgsICAzNSwgIDc5LCAgMjksICAyNiwgIDY4LAorICAgIDE5LCAgMTUsICA1NiwgIDEwLCAgMSwgICA0MywgIDAsICAgMCwgICAyOCwgIDAsICAgMCwgICA2LCAgIDAsICAgMCwgICAwLAorICAgIDUyLCAgNTIsICA5MCwgIDQ3LCAgNDQsICA3OSwgIDM5LCAgMzYsICA3MCwgIDMwLCAgMjcsICA1OSwgIDIwLCAgMTYsICA0NywKKyAgICA5LCAgIDIsICAgMzYsICAwLCAgIDAsICAgMjIsICAwLCAgIDAsICAgMiwgICAwLCAgIDAsICAgMCwgICA1MiwgIDUzLCAgNzgsCisgICAgNDYsICA0NCwgIDY4LCAgMzksICAzNywgIDYwLCAgMzIsICAyNywgIDQ5LCAgMjIsICAxNywgIDM5LCAgMTAsICAzLCAgIDI4LAorICAgIDAsICAgMCwgICAxMiwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDUzLCAgNTMsICA2NiwgIDQ3LCAgNDQsICA1NywKKyAgICA0MCwgIDM2LCAgNDgsICAzMiwgIDI3LCAgMzksICAyMiwgIDE4LCAgMzAsICA5LCAgIDQsICAgMTgsICAwLCAgIDAsICAgMywKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICA1NCwgIDUzLCAgNTcsICA0OCwgIDQ1LCAgNDksICA0MSwgIDM3LCAgNDEsCisgICAgMzMsICAyOCwgIDMyLCAgMjIsICAxOSwgIDIzLCAgMTEsICA2LCAgIDEwLCAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsCiB9Owotdm9pZCBBZG9iZUNNWUtfdG9fc1JHQjEodWludDhfdCBjLCB1aW50OF90IG0sIHVpbnQ4X3QgeSwgdWludDhfdCBrLCB1aW50OF90JiBSLCB1aW50OF90JiBHLCB1aW50OF90JiBCKQotewotICAgIGludCBmaXhfYyA9IGMgPDwgODsKLSAgICBpbnQgZml4X20gPSBtIDw8IDg7Ci0gICAgaW50IGZpeF95ID0geSA8PCA4OwotICAgIGludCBmaXhfayA9IGsgPDwgODsKLSAgICBpbnQgY19pbmRleCA9IChmaXhfYyArIDQwOTYpID4+IDEzOwotICAgIGludCBtX2luZGV4ID0gKGZpeF9tICsgNDA5NikgPj4gMTM7Ci0gICAgaW50IHlfaW5kZXggPSAoZml4X3kgKyA0MDk2KSA+PiAxMzsKLSAgICBpbnQga19pbmRleCA9IChmaXhfayArIDQwOTYpID4+IDEzOwotICAgIGludCBwb3MgPSAoY19pbmRleCAqIDkgKiA5ICogOSArIG1faW5kZXggKiA5ICogOSArIHlfaW5kZXggKiA5ICsga19pbmRleCkgKiAzOwotICAgIGludCBmaXhfciA9IGdfQ01ZS1NhbXBsZXNbcG9zXSA8PCA4OwotICAgIGludCBmaXhfZyA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMV0gPDwgODsKLSAgICBpbnQgZml4X2IgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDJdIDw8IDg7Ci0gICAgaW50IGMxX2luZGV4ID0gZml4X2MgPj4gMTM7Ci0gICAgaWYgKGMxX2luZGV4ID09IGNfaW5kZXgpIHsKLSAgICAgICAgYzFfaW5kZXggPSBjMV9pbmRleCA9PSA4ID8gYzFfaW5kZXggLSAxIDogYzFfaW5kZXggKyAxOwotICAgIH0KLSAgICBpbnQgbTFfaW5kZXggPSBmaXhfbSA+PiAxMzsKLSAgICBpZiAobTFfaW5kZXggPT0gbV9pbmRleCkgewotICAgICAgICBtMV9pbmRleCA9IG0xX2luZGV4ID09IDggPyBtMV9pbmRleCAtIDEgOiBtMV9pbmRleCArIDE7Ci0gICAgfQotICAgIGludCB5MV9pbmRleCA9IGZpeF95ID4+IDEzOwotICAgIGlmICh5MV9pbmRleCA9PSB5X2luZGV4KSB7Ci0gICAgICAgIHkxX2luZGV4ID0geTFfaW5kZXggPT0gOCA/IHkxX2luZGV4IC0gMSA6IHkxX2luZGV4ICsgMTsKLSAgICB9Ci0gICAgaW50IGsxX2luZGV4ID0gZml4X2sgPj4gMTM7Ci0gICAgaWYgKGsxX2luZGV4ID09IGtfaW5kZXgpIHsKLSAgICAgICAgazFfaW5kZXggPSBrMV9pbmRleCA9PSA4ID8gazFfaW5kZXggLSAxIDogazFfaW5kZXggKyAxOwotICAgIH0KLSAgICBpbnQgYzFfcG9zID0gcG9zICsgKGMxX2luZGV4IC0gY19pbmRleCkgKiA5ICogOSAqIDkgKiAzOwotICAgIGludCBtMV9wb3MgPSBwb3MgKyAobTFfaW5kZXggLSBtX2luZGV4KSAqIDkgKiA5ICogMzsKLSAgICBpbnQgeTFfcG9zID0gcG9zICsgKHkxX2luZGV4IC0geV9pbmRleCkgKiA5ICogMzsKLSAgICBpbnQgazFfcG9zID0gcG9zICsgKGsxX2luZGV4IC0ga19pbmRleCkgKiAzOwotICAgIGludCBjX3JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3Bvc10gLSBnX0NNWUtTYW1wbGVzW2MxX3Bvc107Ci0gICAgaW50IGNfZ19kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMV0gLSBnX0NNWUtTYW1wbGVzW2MxX3BvcyArIDFdOwotICAgIGludCBjX2JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDJdIC0gZ19DTVlLU2FtcGxlc1tjMV9wb3MgKyAyXTsKLSAgICBpbnQgbV9yX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3NdIC0gZ19DTVlLU2FtcGxlc1ttMV9wb3NdOwotICAgIGludCBtX2dfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDFdIC0gZ19DTVlLU2FtcGxlc1ttMV9wb3MgKyAxXTsKLSAgICBpbnQgbV9iX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAyXSAtIGdfQ01ZS1NhbXBsZXNbbTFfcG9zICsgMl07Ci0gICAgaW50IHlfcl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zXSAtIGdfQ01ZS1NhbXBsZXNbeTFfcG9zXTsKLSAgICBpbnQgeV9nX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAxXSAtIGdfQ01ZS1NhbXBsZXNbeTFfcG9zICsgMV07Ci0gICAgaW50IHlfYl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMl0gLSBnX0NNWUtTYW1wbGVzW3kxX3BvcyArIDJdOwotICAgIGludCBrX3JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3Bvc10gLSBnX0NNWUtTYW1wbGVzW2sxX3Bvc107Ci0gICAgaW50IGtfZ19kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMV0gLSBnX0NNWUtTYW1wbGVzW2sxX3BvcyArIDFdOwotICAgIGludCBrX2JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDJdIC0gZ19DTVlLU2FtcGxlc1trMV9wb3MgKyAyXTsKLSAgICBpbnQgY19yYXRlID0gKGZpeF9jIC0gKGNfaW5kZXggPDwgMTMpKSAqIChjX2luZGV4IC0gYzFfaW5kZXgpOwotICAgIGZpeF9yICs9IGNfcl9kZWx0YSAqIGNfcmF0ZSAvIDMyOwotICAgIGZpeF9nICs9IGNfZ19kZWx0YSAqIGNfcmF0ZSAvIDMyOwotICAgIGZpeF9iICs9IGNfYl9kZWx0YSAqIGNfcmF0ZSAvIDMyOwotICAgIGludCBtX3JhdGUgPSAoZml4X20gLSAobV9pbmRleCA8PCAxMykpICogKG1faW5kZXggLSBtMV9pbmRleCk7Ci0gICAgZml4X3IgKz0gbV9yX2RlbHRhICogbV9yYXRlIC8gMzI7Ci0gICAgZml4X2cgKz0gbV9nX2RlbHRhICogbV9yYXRlIC8gMzI7Ci0gICAgZml4X2IgKz0gbV9iX2RlbHRhICogbV9yYXRlIC8gMzI7Ci0gICAgaW50IHlfcmF0ZSA9IChmaXhfeSAtICh5X2luZGV4IDw8IDEzKSkgKiAoeV9pbmRleCAtIHkxX2luZGV4KTsKLSAgICBmaXhfciArPSB5X3JfZGVsdGEgKiB5X3JhdGUgLyAzMjsKLSAgICBmaXhfZyArPSB5X2dfZGVsdGEgKiB5X3JhdGUgLyAzMjsKLSAgICBmaXhfYiArPSB5X2JfZGVsdGEgKiB5X3JhdGUgLyAzMjsKLSAgICBpbnQga19yYXRlID0gKGZpeF9rIC0gKGtfaW5kZXggPDwgMTMpKSAqIChrX2luZGV4IC0gazFfaW5kZXgpOwotICAgIGZpeF9yICs9IGtfcl9kZWx0YSAqIGtfcmF0ZSAvIDMyOwotICAgIGZpeF9nICs9IGtfZ19kZWx0YSAqIGtfcmF0ZSAvIDMyOwotICAgIGZpeF9iICs9IGtfYl9kZWx0YSAqIGtfcmF0ZSAvIDMyOwotICAgIGlmIChmaXhfciA8IDApIHsKLSAgICAgICAgZml4X3IgPSAwOwotICAgIH0KLSAgICBpZiAoZml4X2cgPCAwKSB7Ci0gICAgICAgIGZpeF9nID0gMDsKLSAgICB9Ci0gICAgaWYgKGZpeF9iIDwgMCkgewotICAgICAgICBmaXhfYiA9IDA7Ci0gICAgfQotICAgIFIgPSBmaXhfciA+PiA4OwotICAgIEcgPSBmaXhfZyA+PiA4OwotICAgIEIgPSBmaXhfYiA+PiA4Owordm9pZCBBZG9iZUNNWUtfdG9fc1JHQjEodWludDhfdCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBCKSB7CisgIGludCBmaXhfYyA9IGMgPDwgODsKKyAgaW50IGZpeF9tID0gbSA8PCA4OworICBpbnQgZml4X3kgPSB5IDw8IDg7CisgIGludCBmaXhfayA9IGsgPDwgODsKKyAgaW50IGNfaW5kZXggPSAoZml4X2MgKyA0MDk2KSA+PiAxMzsKKyAgaW50IG1faW5kZXggPSAoZml4X20gKyA0MDk2KSA+PiAxMzsKKyAgaW50IHlfaW5kZXggPSAoZml4X3kgKyA0MDk2KSA+PiAxMzsKKyAgaW50IGtfaW5kZXggPSAoZml4X2sgKyA0MDk2KSA+PiAxMzsKKyAgaW50IHBvcyA9IChjX2luZGV4ICogOSAqIDkgKiA5ICsgbV9pbmRleCAqIDkgKiA5ICsgeV9pbmRleCAqIDkgKyBrX2luZGV4KSAqIDM7CisgIGludCBmaXhfciA9IGdfQ01ZS1NhbXBsZXNbcG9zXSA8PCA4OworICBpbnQgZml4X2cgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDFdIDw8IDg7CisgIGludCBmaXhfYiA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMl0gPDwgODsKKyAgaW50IGMxX2luZGV4ID0gZml4X2MgPj4gMTM7CisgIGlmIChjMV9pbmRleCA9PSBjX2luZGV4KSB7CisgICAgYzFfaW5kZXggPSBjMV9pbmRleCA9PSA4ID8gYzFfaW5kZXggLSAxIDogYzFfaW5kZXggKyAxOworICB9CisgIGludCBtMV9pbmRleCA9IGZpeF9tID4+IDEzOworICBpZiAobTFfaW5kZXggPT0gbV9pbmRleCkgeworICAgIG0xX2luZGV4ID0gbTFfaW5kZXggPT0gOCA/IG0xX2luZGV4IC0gMSA6IG0xX2luZGV4ICsgMTsKKyAgfQorICBpbnQgeTFfaW5kZXggPSBmaXhfeSA+PiAxMzsKKyAgaWYgKHkxX2luZGV4ID09IHlfaW5kZXgpIHsKKyAgICB5MV9pbmRleCA9IHkxX2luZGV4ID09IDggPyB5MV9pbmRleCAtIDEgOiB5MV9pbmRleCArIDE7CisgIH0KKyAgaW50IGsxX2luZGV4ID0gZml4X2sgPj4gMTM7CisgIGlmIChrMV9pbmRleCA9PSBrX2luZGV4KSB7CisgICAgazFfaW5kZXggPSBrMV9pbmRleCA9PSA4ID8gazFfaW5kZXggLSAxIDogazFfaW5kZXggKyAxOworICB9CisgIGludCBjMV9wb3MgPSBwb3MgKyAoYzFfaW5kZXggLSBjX2luZGV4KSAqIDkgKiA5ICogOSAqIDM7CisgIGludCBtMV9wb3MgPSBwb3MgKyAobTFfaW5kZXggLSBtX2luZGV4KSAqIDkgKiA5ICogMzsKKyAgaW50IHkxX3BvcyA9IHBvcyArICh5MV9pbmRleCAtIHlfaW5kZXgpICogOSAqIDM7CisgIGludCBrMV9wb3MgPSBwb3MgKyAoazFfaW5kZXggLSBrX2luZGV4KSAqIDM7CisgIGludCBjX3JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3Bvc10gLSBnX0NNWUtTYW1wbGVzW2MxX3Bvc107CisgIGludCBjX2dfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDFdIC0gZ19DTVlLU2FtcGxlc1tjMV9wb3MgKyAxXTsKKyAgaW50IGNfYl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMl0gLSBnX0NNWUtTYW1wbGVzW2MxX3BvcyArIDJdOworICBpbnQgbV9yX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3NdIC0gZ19DTVlLU2FtcGxlc1ttMV9wb3NdOworICBpbnQgbV9nX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAxXSAtIGdfQ01ZS1NhbXBsZXNbbTFfcG9zICsgMV07CisgIGludCBtX2JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDJdIC0gZ19DTVlLU2FtcGxlc1ttMV9wb3MgKyAyXTsKKyAgaW50IHlfcl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zXSAtIGdfQ01ZS1NhbXBsZXNbeTFfcG9zXTsKKyAgaW50IHlfZ19kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMV0gLSBnX0NNWUtTYW1wbGVzW3kxX3BvcyArIDFdOworICBpbnQgeV9iX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAyXSAtIGdfQ01ZS1NhbXBsZXNbeTFfcG9zICsgMl07CisgIGludCBrX3JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3Bvc10gLSBnX0NNWUtTYW1wbGVzW2sxX3Bvc107CisgIGludCBrX2dfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDFdIC0gZ19DTVlLU2FtcGxlc1trMV9wb3MgKyAxXTsKKyAgaW50IGtfYl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMl0gLSBnX0NNWUtTYW1wbGVzW2sxX3BvcyArIDJdOworICBpbnQgY19yYXRlID0gKGZpeF9jIC0gKGNfaW5kZXggPDwgMTMpKSAqIChjX2luZGV4IC0gYzFfaW5kZXgpOworICBmaXhfciArPSBjX3JfZGVsdGEgKiBjX3JhdGUgLyAzMjsKKyAgZml4X2cgKz0gY19nX2RlbHRhICogY19yYXRlIC8gMzI7CisgIGZpeF9iICs9IGNfYl9kZWx0YSAqIGNfcmF0ZSAvIDMyOworICBpbnQgbV9yYXRlID0gKGZpeF9tIC0gKG1faW5kZXggPDwgMTMpKSAqIChtX2luZGV4IC0gbTFfaW5kZXgpOworICBmaXhfciArPSBtX3JfZGVsdGEgKiBtX3JhdGUgLyAzMjsKKyAgZml4X2cgKz0gbV9nX2RlbHRhICogbV9yYXRlIC8gMzI7CisgIGZpeF9iICs9IG1fYl9kZWx0YSAqIG1fcmF0ZSAvIDMyOworICBpbnQgeV9yYXRlID0gKGZpeF95IC0gKHlfaW5kZXggPDwgMTMpKSAqICh5X2luZGV4IC0geTFfaW5kZXgpOworICBmaXhfciArPSB5X3JfZGVsdGEgKiB5X3JhdGUgLyAzMjsKKyAgZml4X2cgKz0geV9nX2RlbHRhICogeV9yYXRlIC8gMzI7CisgIGZpeF9iICs9IHlfYl9kZWx0YSAqIHlfcmF0ZSAvIDMyOworICBpbnQga19yYXRlID0gKGZpeF9rIC0gKGtfaW5kZXggPDwgMTMpKSAqIChrX2luZGV4IC0gazFfaW5kZXgpOworICBmaXhfciArPSBrX3JfZGVsdGEgKiBrX3JhdGUgLyAzMjsKKyAgZml4X2cgKz0ga19nX2RlbHRhICoga19yYXRlIC8gMzI7CisgIGZpeF9iICs9IGtfYl9kZWx0YSAqIGtfcmF0ZSAvIDMyOworICBpZiAoZml4X3IgPCAwKSB7CisgICAgZml4X3IgPSAwOworICB9CisgIGlmIChmaXhfZyA8IDApIHsKKyAgICBmaXhfZyA9IDA7CisgIH0KKyAgaWYgKGZpeF9iIDwgMCkgeworICAgIGZpeF9iID0gMDsKKyAgfQorICBSID0gZml4X3IgPj4gODsKKyAgRyA9IGZpeF9nID4+IDg7CisgIEIgPSBmaXhfYiA+PiA4OwogfQotdm9pZCBBZG9iZUNNWUtfdG9fc1JHQihGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKQotewotICAgIHVpbnQ4X3QgYzEgPSBGWFNZU19yb3VuZChjICogMjU1KTsKLSAgICB1aW50OF90IG0xID0gRlhTWVNfcm91bmQobSAqIDI1NSk7Ci0gICAgdWludDhfdCB5MSA9IEZYU1lTX3JvdW5kKHkgKiAyNTUpOwotICAgIHVpbnQ4X3QgazEgPSBGWFNZU19yb3VuZChrICogMjU1KTsKLSAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgQWRvYmVDTVlLX3RvX3NSR0IxKGMxLCBtMSwgeTEsIGsxLCByLCBnLCBiKTsKLSAgICBSID0gMS4wZiAqIHIgLyAyNTU7Ci0gICAgRyA9IDEuMGYgKiBnIC8gMjU1OwotICAgIEIgPSAxLjBmICogYiAvIDI1NTsKK3ZvaWQgQWRvYmVDTVlLX3RvX3NSR0IoRlhfRkxPQVQgYywKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgeworICB1aW50OF90IGMxID0gRlhTWVNfcm91bmQoYyAqIDI1NSk7CisgIHVpbnQ4X3QgbTEgPSBGWFNZU19yb3VuZChtICogMjU1KTsKKyAgdWludDhfdCB5MSA9IEZYU1lTX3JvdW5kKHkgKiAyNTUpOworICB1aW50OF90IGsxID0gRlhTWVNfcm91bmQoayAqIDI1NSk7CisgIHVpbnQ4X3QgciwgZywgYjsKKyAgQWRvYmVDTVlLX3RvX3NSR0IxKGMxLCBtMSwgeTEsIGsxLCByLCBnLCBiKTsKKyAgUiA9IDEuMGYgKiByIC8gMjU1OworICBHID0gMS4wZiAqIGcgLyAyNTU7CisgIEIgPSAxLjBmICogYiAvIDI1NTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWcuY3BwCmluZGV4IDUxMTg0MzAuLjlkNzhiYmEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnLmNwcApAQCAtNywyMDAgKzcsMjI1IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCiAjaW5jbHVkZSAiY29kZWNfaW50LmgiCiAKLUNDb2RlY19KYmlnMkNvbnRleHQ6OkNDb2RlY19KYmlnMkNvbnRleHQoKQotewotICAgIEZYU1lTX21lbXNldCh0aGlzLCAwLCBzaXplb2YoQ0NvZGVjX0piaWcyQ29udGV4dCkpOworQ0NvZGVjX0piaWcyQ29udGV4dDo6Q0NvZGVjX0piaWcyQ29udGV4dCgpIHsKKyAgRlhTWVNfbWVtc2V0KHRoaXMsIDAsIHNpemVvZihDQ29kZWNfSmJpZzJDb250ZXh0KSk7CiB9Ci1DQ29kZWNfSmJpZzJNb2R1bGU6On5DQ29kZWNfSmJpZzJNb2R1bGUoKQoteworQ0NvZGVjX0piaWcyTW9kdWxlOjp+Q0NvZGVjX0piaWcyTW9kdWxlKCkge30KK3ZvaWQqIENDb2RlY19KYmlnMk1vZHVsZTo6Q3JlYXRlSmJpZzJDb250ZXh0KCkgeworICByZXR1cm4gbmV3IENDb2RlY19KYmlnMkNvbnRleHQoKTsKIH0KLXZvaWQqIENDb2RlY19KYmlnMk1vZHVsZTo6Q3JlYXRlSmJpZzJDb250ZXh0KCkKLXsKLSAgICByZXR1cm4gbmV3IENDb2RlY19KYmlnMkNvbnRleHQoKTsKK3ZvaWQgQ0NvZGVjX0piaWcyTW9kdWxlOjpEZXN0cm95SmJpZzJDb250ZXh0KHZvaWQqIHBKYmlnMkNvbnRlbnQpIHsKKyAgaWYgKHBKYmlnMkNvbnRlbnQpIHsKKyAgICBDSkJpZzJfQ29udGV4dDo6RGVzdHJveUNvbnRleHQoCisgICAgICAgICgoQ0NvZGVjX0piaWcyQ29udGV4dCopcEpiaWcyQ29udGVudCktPm1fcENvbnRleHQpOworICAgIGRlbGV0ZSAoQ0NvZGVjX0piaWcyQ29udGV4dCopcEpiaWcyQ29udGVudDsKKyAgfQorICBwSmJpZzJDb250ZW50ID0gTlVMTDsKIH0KLXZvaWQgQ0NvZGVjX0piaWcyTW9kdWxlOjpEZXN0cm95SmJpZzJDb250ZXh0KHZvaWQqIHBKYmlnMkNvbnRlbnQpCi17Ci0gICAgaWYocEpiaWcyQ29udGVudCkgewotICAgICAgICBDSkJpZzJfQ29udGV4dDo6RGVzdHJveUNvbnRleHQoKChDQ29kZWNfSmJpZzJDb250ZXh0KilwSmJpZzJDb250ZW50KS0+bV9wQ29udGV4dCk7Ci0gICAgICAgIGRlbGV0ZSAoQ0NvZGVjX0piaWcyQ29udGV4dCopcEpiaWcyQ29udGVudDsKLSAgICB9Ci0gICAgcEpiaWcyQ29udGVudCA9IE5VTEw7Ci19Ci1GWF9CT09MIENDb2RlY19KYmlnMk1vZHVsZTo6RGVjb2RlKEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnbG9iYWxfZGF0YSwgRlhfRFdPUkQgZ2xvYmFsX3NpemUsIHVpbnQ4X3QqIGRlc3RfYnVmLCBGWF9EV09SRCBkZXN0X3BpdGNoKQotewotICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgMCwgaGVpZ2h0ICogZGVzdF9waXRjaCk7Ci0gICAgQ0pCaWcyX0NvbnRleHQqIHBDb250ZXh0ID0gQ0pCaWcyX0NvbnRleHQ6OkNyZWF0ZUNvbnRleHQoJm1fTW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KilnbG9iYWxfZGF0YSwgZ2xvYmFsX3NpemUsICh1aW50OF90KilzcmNfYnVmLCBzcmNfc2l6ZSwgSkJJRzJfRU1CRURfU1RSRUFNLCAmbV9TeW1ib2xEaWN0Q2FjaGUpOwotICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50IHJldCA9IHBDb250ZXh0LT5nZXRGaXJzdFBhZ2UoZGVzdF9idWYsIHdpZHRoLCBoZWlnaHQsIGRlc3RfcGl0Y2gsIE5VTEwpOwotICAgIENKQmlnMl9Db250ZXh0OjpEZXN0cm95Q29udGV4dChwQ29udGV4dCk7Ci0gICAgaWYgKHJldCAhPSBKQklHMl9TVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50IGR3b3JkX3NpemUgPSBoZWlnaHQgKiBkZXN0X3BpdGNoIC8gNDsKLSAgICBGWF9EV09SRCogZHdvcmRfYnVmID0gKEZYX0RXT1JEKilkZXN0X2J1ZjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGR3b3JkX3NpemU7IGkgKyspIHsKLSAgICAgICAgZHdvcmRfYnVmW2ldID0gfmR3b3JkX2J1ZltpXTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENDb2RlY19KYmlnMk1vZHVsZTo6RGVjb2RlKEZYX0RXT1JEIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnbG9iYWxfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2xvYmFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXN0X3BpdGNoKSB7CisgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgMCwgaGVpZ2h0ICogZGVzdF9waXRjaCk7CisgIENKQmlnMl9Db250ZXh0KiBwQ29udGV4dCA9IENKQmlnMl9Db250ZXh0OjpDcmVhdGVDb250ZXh0KAorICAgICAgJm1fTW9kdWxlLCAodWludDhfdCopZ2xvYmFsX2RhdGEsIGdsb2JhbF9zaXplLCAodWludDhfdCopc3JjX2J1ZiwKKyAgICAgIHNyY19zaXplLCBKQklHMl9FTUJFRF9TVFJFQU0sICZtX1N5bWJvbERpY3RDYWNoZSk7CisgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCByZXQgPSBwQ29udGV4dC0+Z2V0Rmlyc3RQYWdlKGRlc3RfYnVmLCB3aWR0aCwgaGVpZ2h0LCBkZXN0X3BpdGNoLCBOVUxMKTsKKyAgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KHBDb250ZXh0KTsKKyAgaWYgKHJldCAhPSBKQklHMl9TVUNDRVNTKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBkd29yZF9zaXplID0gaGVpZ2h0ICogZGVzdF9waXRjaCAvIDQ7CisgIEZYX0RXT1JEKiBkd29yZF9idWYgPSAoRlhfRFdPUkQqKWRlc3RfYnVmOworICBmb3IgKGludCBpID0gMDsgaSA8IGR3b3JkX3NpemU7IGkrKykgeworICAgIGR3b3JkX2J1ZltpXSA9IH5kd29yZF9idWZbaV07CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiBGWF9CT09MIENDb2RlY19KYmlnMk1vZHVsZTo6RGVjb2RlKElGWF9GaWxlUmVhZCogZmlsZV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIHBpdGNoLCB1aW50OF90KiYgZGVzdF9idWYpCi17Ci0gICAgQ0pCaWcyX0NvbnRleHQqIHBDb250ZXh0ID0gTlVMTDsKLSAgICBDSkJpZzJfSW1hZ2UqIGRlc3RfaW1hZ2UgPSBOVUxMOwotICAgIEZYX0RXT1JEIHNyY19zaXplID0gKEZYX0RXT1JEKWZpbGVfcHRyLT5HZXRTaXplKCk7Ci0gICAgdWludDhfdCogc3JjX2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNyY19zaXplKTsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZighZmlsZV9wdHItPlJlYWRCbG9jayhzcmNfYnVmLCAwLCBzcmNfc2l6ZSkpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIHBDb250ZXh0ID0gQ0pCaWcyX0NvbnRleHQ6OkNyZWF0ZUNvbnRleHQoJm1fTW9kdWxlLCBOVUxMLCAwLCBzcmNfYnVmLCBzcmNfc2l6ZSwgSkJJRzJfRklMRV9TVFJFQU0sICZtX1N5bWJvbERpY3RDYWNoZSk7Ci0gICAgaWYocENvbnRleHQgPT0gTlVMTCkgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgcmV0ID0gcENvbnRleHQtPmdldEZpcnN0UGFnZSgmZGVzdF9pbWFnZSwgTlVMTCk7Ci0gICAgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KHBDb250ZXh0KTsKLSAgICBpZiAocmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIHdpZHRoID0gKEZYX0RXT1JEKWRlc3RfaW1hZ2UtPm1fbldpZHRoOwotICAgIGhlaWdodCA9IChGWF9EV09SRClkZXN0X2ltYWdlLT5tX25IZWlnaHQ7Ci0gICAgcGl0Y2ggPSAoRlhfRFdPUkQpZGVzdF9pbWFnZS0+bV9uU3RyaWRlOwotICAgIGRlc3RfYnVmID0gZGVzdF9pbWFnZS0+bV9wRGF0YTsKLSAgICBkZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IEZBTFNFOwotICAgIGRlbGV0ZSBkZXN0X2ltYWdlOwotICAgIEZYX0ZyZWUoc3JjX2J1Zik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYpIHsKKyAgQ0pCaWcyX0NvbnRleHQqIHBDb250ZXh0ID0gTlVMTDsKKyAgQ0pCaWcyX0ltYWdlKiBkZXN0X2ltYWdlID0gTlVMTDsKKyAgRlhfRFdPUkQgc3JjX3NpemUgPSAoRlhfRFdPUkQpZmlsZV9wdHItPkdldFNpemUoKTsKKyAgdWludDhfdCogc3JjX2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNyY19zaXplKTsKKyAgaW50IHJldCA9IDA7CisgIGlmICghZmlsZV9wdHItPlJlYWRCbG9jayhzcmNfYnVmLCAwLCBzcmNfc2l6ZSkpIHsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBwQ29udGV4dCA9CisgICAgICBDSkJpZzJfQ29udGV4dDo6Q3JlYXRlQ29udGV4dCgmbV9Nb2R1bGUsIE5VTEwsIDAsIHNyY19idWYsIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJJRzJfRklMRV9TVFJFQU0sICZtX1N5bWJvbERpY3RDYWNoZSk7CisgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgcmV0ID0gcENvbnRleHQtPmdldEZpcnN0UGFnZSgmZGVzdF9pbWFnZSwgTlVMTCk7CisgIENKQmlnMl9Db250ZXh0OjpEZXN0cm95Q29udGV4dChwQ29udGV4dCk7CisgIGlmIChyZXQgIT0gSkJJRzJfU1VDQ0VTUykgeworICAgIGdvdG8gZmFpbGVkOworICB9CisgIHdpZHRoID0gKEZYX0RXT1JEKWRlc3RfaW1hZ2UtPm1fbldpZHRoOworICBoZWlnaHQgPSAoRlhfRFdPUkQpZGVzdF9pbWFnZS0+bV9uSGVpZ2h0OworICBwaXRjaCA9IChGWF9EV09SRClkZXN0X2ltYWdlLT5tX25TdHJpZGU7CisgIGRlc3RfYnVmID0gZGVzdF9pbWFnZS0+bV9wRGF0YTsKKyAgZGVzdF9pbWFnZS0+bV9iTmVlZEZyZWUgPSBGQUxTRTsKKyAgZGVsZXRlIGRlc3RfaW1hZ2U7CisgIEZYX0ZyZWUoc3JjX2J1Zik7CisgIHJldHVybiBUUlVFOwogZmFpbGVkOgotICAgIGlmKHNyY19idWYpIHsKLSAgICAgICAgRlhfRnJlZShzcmNfYnVmKTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICBpZiAoc3JjX2J1ZikgeworICAgIEZYX0ZyZWUoc3JjX2J1Zik7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX0piaWcyTW9kdWxlOjpTdGFydERlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LCBGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgY29uc3QgdWludDhfdCogZ2xvYmFsX2RhdGEsIEZYX0RXT1JEIGdsb2JhbF9zaXplLCB1aW50OF90KiBkZXN0X2J1ZiwgRlhfRFdPUkQgZGVzdF9waXRjaCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYoIXBKYmlnMkNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7Ci0gICAgfQotICAgIENDb2RlY19KYmlnMkNvbnRleHQqIG1fcEpiaWcyQ29udGV4dCA9IChDQ29kZWNfSmJpZzJDb250ZXh0KilwSmJpZzJDb250ZXh0OwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV93aWR0aCA9IHdpZHRoOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYgPSAodW5zaWduZWQgY2hhciAqKXNyY19idWY7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19zaXplID0gc3JjX3NpemU7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2dsb2JhbF9kYXRhID0gZ2xvYmFsX2RhdGE7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2dsb2JhbF9zaXplID0gZ2xvYmFsX3NpemU7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfYnVmID0gZGVzdF9idWY7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfcGl0Y2ggPSBkZXN0X3BpdGNoOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9wUGF1c2UgPSBwUGF1c2U7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2JGaWxlUmVhZGVyID0gRkFMU0U7Ci0gICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAwLCBoZWlnaHQgKiBkZXN0X3BpdGNoKTsKLSAgICBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQgPSBDSkJpZzJfQ29udGV4dDo6Q3JlYXRlQ29udGV4dCgmbV9Nb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWdsb2JhbF9kYXRhLCBnbG9iYWxfc2l6ZSwgKHVpbnQ4X3QqKXNyY19idWYsIHNyY19zaXplLCBKQklHMl9FTUJFRF9TVFJFQU0sICZtX1N5bWJvbERpY3RDYWNoZSwgcFBhdXNlKTsKLSAgICBpZighbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKLSAgICB9Ci0gICAgaW50IHJldCA9IG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+Z2V0Rmlyc3RQYWdlKGRlc3RfYnVmLCB3aWR0aCwgaGVpZ2h0LCBkZXN0X3BpdGNoLCBwUGF1c2UpOwotICAgIGlmKG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2l2ZVN0YXR1cygpID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0gpIHsKLSAgICAgICAgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCk7Ci0gICAgICAgIG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCA9IE5VTEw7Ci0gICAgICAgIGlmIChyZXQgIT0gSkJJRzJfU1VDQ0VTUykgewotICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGludCBkd29yZF9zaXplID0gaGVpZ2h0ICogZGVzdF9waXRjaCAvIDQ7Ci0gICAgICAgIEZYX0RXT1JEKiBkd29yZF9idWYgPSAoRlhfRFdPUkQqKWRlc3RfYnVmOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGR3b3JkX3NpemU7IGkgKyspIHsKLSAgICAgICAgICAgIGR3b3JkX2J1ZltpXSA9IH5kd29yZF9idWZbaV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgfQotICAgIHJldHVybiBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQtPkdldFByb2Nlc3NpdmVTdGF0dXMoKTsKLX0KLUZYQ09ERUNfU1RBVFVTIENDb2RlY19KYmlnMk1vZHVsZTo6U3RhcnREZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwgSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwKLSAgICAgICAgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LCBGWF9EV09SRCYgcGl0Y2gsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYoIXBKYmlnMkNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7Ci0gICAgfQotICAgIENDb2RlY19KYmlnMkNvbnRleHQqIG1fcEpiaWcyQ29udGV4dCA9IChDQ29kZWNfSmJpZzJDb250ZXh0KilwSmJpZzJDb250ZXh0OwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9iRmlsZVJlYWRlciA9IFRSVUU7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UgPSBOVUxMOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfc2l6ZSA9IChGWF9EV09SRClmaWxlX3B0ci0+R2V0U2l6ZSgpOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19zaXplKTsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZighZmlsZV9wdHItPlJlYWRCbG9jaygodm9pZCopbV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYsIDAsIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfc2l6ZSkpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCA9IENKQmlnMl9Db250ZXh0OjpDcmVhdGVDb250ZXh0KCZtX01vZHVsZSwgTlVMTCwgMCwgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYsIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfc2l6ZSwgSkJJRzJfRklMRV9TVFJFQU0sICZtX1N5bWJvbERpY3RDYWNoZSwgcFBhdXNlKTsKLSAgICBpZihtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQgPT0gTlVMTCkgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgcmV0ID0gbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0LT5nZXRGaXJzdFBhZ2UoJm1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLCBwUGF1c2UpOwotICAgIGlmKG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2l2ZVN0YXR1cygpID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgd2lkdGggPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fbldpZHRoOwotICAgICAgICBoZWlnaHQgPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fbkhlaWdodDsKLSAgICAgICAgcGl0Y2ggPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fblN0cmlkZTsKLSAgICAgICAgZGVzdF9idWYgPSBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9wRGF0YTsKLSAgICAgICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fYk5lZWRGcmVlID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgIH0KK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19KYmlnMk1vZHVsZTo6U3RhcnREZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGdsb2JhbF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnbG9iYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGlmICghcEpiaWcyQ29udGV4dCkgeworICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOworICB9CisgIENDb2RlY19KYmlnMkNvbnRleHQqIG1fcEpiaWcyQ29udGV4dCA9IChDQ29kZWNfSmJpZzJDb250ZXh0KilwSmJpZzJDb250ZXh0OworICBtX3BKYmlnMkNvbnRleHQtPm1fd2lkdGggPSB3aWR0aDsKKyAgbV9wSmJpZzJDb250ZXh0LT5tX2hlaWdodCA9IGhlaWdodDsKKyAgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYgPSAodW5zaWduZWQgY2hhciopc3JjX2J1ZjsKKyAgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19zaXplID0gc3JjX3NpemU7CisgIG1fcEpiaWcyQ29udGV4dC0+bV9nbG9iYWxfZGF0YSA9IGdsb2JhbF9kYXRhOworICBtX3BKYmlnMkNvbnRleHQtPm1fZ2xvYmFsX3NpemUgPSBnbG9iYWxfc2l6ZTsKKyAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfYnVmID0gZGVzdF9idWY7CisgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X3BpdGNoID0gZGVzdF9waXRjaDsKKyAgbV9wSmJpZzJDb250ZXh0LT5tX3BQYXVzZSA9IHBQYXVzZTsKKyAgbV9wSmJpZzJDb250ZXh0LT5tX2JGaWxlUmVhZGVyID0gRkFMU0U7CisgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgMCwgaGVpZ2h0ICogZGVzdF9waXRjaCk7CisgIG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCA9IENKQmlnMl9Db250ZXh0OjpDcmVhdGVDb250ZXh0KAorICAgICAgJm1fTW9kdWxlLCAodWludDhfdCopZ2xvYmFsX2RhdGEsIGdsb2JhbF9zaXplLCAodWludDhfdCopc3JjX2J1ZiwKKyAgICAgIHNyY19zaXplLCBKQklHMl9FTUJFRF9TVFJFQU0sICZtX1N5bWJvbERpY3RDYWNoZSwgcFBhdXNlKTsKKyAgaWYgKCFtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQpIHsKKyAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgIH0KKyAgaW50IHJldCA9IG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+Z2V0Rmlyc3RQYWdlKGRlc3RfYnVmLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9waXRjaCwgcFBhdXNlKTsKKyAgaWYgKG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2l2ZVN0YXR1cygpID09CisgICAgICBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIKSB7CiAgICAgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCk7CiAgICAgbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0ID0gTlVMTDsKICAgICBpZiAocmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CiAgICAgfQorICAgIGludCBkd29yZF9zaXplID0gaGVpZ2h0ICogZGVzdF9waXRjaCAvIDQ7CisgICAgRlhfRFdPUkQqIGR3b3JkX2J1ZiA9IChGWF9EV09SRCopZGVzdF9idWY7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkd29yZF9zaXplOyBpKyspIHsKKyAgICAgIGR3b3JkX2J1ZltpXSA9IH5kd29yZF9idWZbaV07CisgICAgfQorICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICB9CisgIHJldHVybiBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQtPkdldFByb2Nlc3NpdmVTdGF0dXMoKTsKK30KK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19KYmlnMk1vZHVsZTo6U3RhcnREZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaWYgKCFwSmJpZzJDb250ZXh0KSB7CisgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7CisgIH0KKyAgQ0NvZGVjX0piaWcyQ29udGV4dCogbV9wSmJpZzJDb250ZXh0ID0gKENDb2RlY19KYmlnMkNvbnRleHQqKXBKYmlnMkNvbnRleHQ7CisgIG1fcEpiaWcyQ29udGV4dC0+bV9iRmlsZVJlYWRlciA9IFRSVUU7CisgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlID0gTlVMTDsKKyAgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19zaXplID0gKEZYX0RXT1JEKWZpbGVfcHRyLT5HZXRTaXplKCk7CisgIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19zaXplKTsKKyAgaW50IHJldCA9IDA7CisgIGlmICghZmlsZV9wdHItPlJlYWRCbG9jaygodm9pZCopbV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BKYmlnMkNvbnRleHQtPm1fc3JjX3NpemUpKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0ID0gQ0pCaWcyX0NvbnRleHQ6OkNyZWF0ZUNvbnRleHQoCisgICAgICAmbV9Nb2R1bGUsIE5VTEwsIDAsIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmLAorICAgICAgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19zaXplLCBKQklHMl9GSUxFX1NUUkVBTSwgJm1fU3ltYm9sRGljdENhY2hlLAorICAgICAgcFBhdXNlKTsKKyAgaWYgKG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCA9PSBOVUxMKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgcmV0ID0gbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0LT5nZXRGaXJzdFBhZ2UoCisgICAgICAmbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UsIHBQYXVzZSk7CisgIGlmIChtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQtPkdldFByb2Nlc3NpdmVTdGF0dXMoKSA9PQorICAgICAgRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgewogICAgIHdpZHRoID0gKEZYX0RXT1JEKW1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX25XaWR0aDsKICAgICBoZWlnaHQgPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fbkhlaWdodDsKICAgICBwaXRjaCA9IChGWF9EV09SRCltX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9uU3RyaWRlOwogICAgIGRlc3RfYnVmID0gbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fcERhdGE7CiAgICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fYk5lZWRGcmVlID0gRkFMU0U7Ci0gICAgZGVsZXRlIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlOwotICAgIEZYX0ZyZWUobV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYpOwotICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICB9CisgIENKQmlnMl9Db250ZXh0OjpEZXN0cm95Q29udGV4dChtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQpOworICBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQgPSBOVUxMOworICBpZiAocmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICB3aWR0aCA9IChGWF9EV09SRCltX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9uV2lkdGg7CisgIGhlaWdodCA9IChGWF9EV09SRCltX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9uSGVpZ2h0OworICBwaXRjaCA9IChGWF9EV09SRCltX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9uU3RyaWRlOworICBkZXN0X2J1ZiA9IG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX3BEYXRhOworICBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9iTmVlZEZyZWUgPSBGQUxTRTsKKyAgZGVsZXRlIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlOworICBGWF9GcmVlKG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmKTsKKyAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CiBmYWlsZWQ6Ci0gICAgaWYobV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYpIHsKLSAgICAgICAgRlhfRnJlZShtX3BKYmlnMkNvbnRleHQtPm1fc3JjX2J1Zik7Ci0gICAgfQotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmID0gTlVMTDsKLSAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgIGlmIChtX3BKYmlnMkNvbnRleHQtPm1fc3JjX2J1ZikgeworICAgIEZYX0ZyZWUobV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYpOworICB9CisgIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmID0gTlVMTDsKKyAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOwogfQotRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX0piaWcyTW9kdWxlOjpDb250aW51ZURlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBDQ29kZWNfSmJpZzJDb250ZXh0KiBtX3BKYmlnMkNvbnRleHQgPSAoQ0NvZGVjX0piaWcyQ29udGV4dCopcEpiaWcyQ29udGV4dDsKLSAgICBpbnQgcmV0ID0gbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0LT5Db250aW51ZShwUGF1c2UpOwotICAgIGlmIChtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQtPkdldFByb2Nlc3NpdmVTdGF0dXMoKSAhPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIKSB7Ci0gICAgICAgIHJldHVybiBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQtPkdldFByb2Nlc3NpdmVTdGF0dXMoKTsKLSAgICB9Ci0gICAgaWYgKG1fcEpiaWcyQ29udGV4dC0+bV9iRmlsZVJlYWRlcikgewotICAgICAgICBDSkJpZzJfQ29udGV4dDo6RGVzdHJveUNvbnRleHQobV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0KTsKLSAgICAgICAgbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgaWYgKHJldCAhPSBKQklHMl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBpZihtX3BKYmlnMkNvbnRleHQtPm1fc3JjX2J1ZikgewotICAgICAgICAgICAgICAgIEZYX0ZyZWUobV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZTsKLSAgICAgICAgRlhfRnJlZShtX3BKYmlnMkNvbnRleHQtPm1fc3JjX2J1Zik7Ci0gICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgIH0KK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19KYmlnMk1vZHVsZTo6Q29udGludWVEZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgQ0NvZGVjX0piaWcyQ29udGV4dCogbV9wSmJpZzJDb250ZXh0ID0gKENDb2RlY19KYmlnMkNvbnRleHQqKXBKYmlnMkNvbnRleHQ7CisgIGludCByZXQgPSBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQtPkNvbnRpbnVlKHBQYXVzZSk7CisgIGlmIChtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQtPkdldFByb2Nlc3NpdmVTdGF0dXMoKSAhPQorICAgICAgRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSCkgeworICAgIHJldHVybiBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQtPkdldFByb2Nlc3NpdmVTdGF0dXMoKTsKKyAgfQorICBpZiAobV9wSmJpZzJDb250ZXh0LT5tX2JGaWxlUmVhZGVyKSB7CiAgICAgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCk7CiAgICAgbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0ID0gTlVMTDsKICAgICBpZiAocmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICAgICAgaWYgKG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmKSB7CisgICAgICAgIEZYX0ZyZWUobV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYpOworICAgICAgfQorICAgICAgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYgPSBOVUxMOworICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOwogICAgIH0KLSAgICBpbnQgZHdvcmRfc2l6ZSA9IG1fcEpiaWcyQ29udGV4dC0+bV9oZWlnaHQgKiBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9waXRjaCAvIDQ7Ci0gICAgRlhfRFdPUkQqIGR3b3JkX2J1ZiA9IChGWF9EV09SRCopbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfYnVmOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZHdvcmRfc2l6ZTsgaSArKykgewotICAgICAgICBkd29yZF9idWZbaV0gPSB+ZHdvcmRfYnVmW2ldOwotICAgIH0KKyAgICBkZWxldGUgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2U7CisgICAgRlhfRnJlZShtX3BKYmlnMkNvbnRleHQtPm1fc3JjX2J1Zik7CiAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgIH0KKyAgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCk7CisgIG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCA9IE5VTEw7CisgIGlmIChyZXQgIT0gSkJJRzJfU1VDQ0VTUykgeworICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKyAgfQorICBpbnQgZHdvcmRfc2l6ZSA9CisgICAgICBtX3BKYmlnMkNvbnRleHQtPm1faGVpZ2h0ICogbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfcGl0Y2ggLyA0OworICBGWF9EV09SRCogZHdvcmRfYnVmID0gKEZYX0RXT1JEKiltX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9idWY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZHdvcmRfc2l6ZTsgaSsrKSB7CisgICAgZHdvcmRfYnVmW2ldID0gfmR3b3JkX2J1ZltpXTsKKyAgfQorICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKIH0KLQotCi0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZ19lbmMuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnX2VuYy5jcHAKaW5kZXggYWIzMjJkZC4uMzhjODJmZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnX2VuYy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnX2VuYy5jcHAKQEAgLTUsNyArNSw2IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi1JQ29kZWNfSmJpZzJFbmNvZGVyKiBDQ29kZWNfTW9kdWxlTWdyOjpDcmVhdGVKYmlnMkVuY29kZXIoKQotewotICAgIHJldHVybiBOVUxMOworSUNvZGVjX0piaWcyRW5jb2RlciogQ0NvZGVjX01vZHVsZU1ncjo6Q3JlYXRlSmJpZzJFbmNvZGVyKCkgeworICByZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pwZWcuY3BwCmluZGV4IDYyOTYzNjQuLjRmYTk5ZjMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcGVnLmNwcApAQCAtMTcsNzM4ICsxNyw3NzMgQEAKIH0KIAogZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIHZvaWQgX0pwZWdTY2FuU09JKGNvbnN0IHVpbnQ4X3QqJiBzcmNfYnVmLCBGWF9EV09SRCYgc3JjX3NpemUpCi0gICAgewotICAgICAgICBpZiAoc3JjX3NpemUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIG9mZnNldCA9IDA7Ci0gICAgICAgIHdoaWxlIChvZmZzZXQgPCBzcmNfc2l6ZSAtIDEpIHsKLSAgICAgICAgICAgIGlmIChzcmNfYnVmW29mZnNldF0gPT0gMHhmZiAmJiBzcmNfYnVmW29mZnNldCArIDFdID09IDB4ZDgpIHsKLSAgICAgICAgICAgICAgICBzcmNfYnVmICs9IG9mZnNldDsKLSAgICAgICAgICAgICAgICBzcmNfc2l6ZSAtPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICB9CitzdGF0aWMgdm9pZCBfSnBlZ1NjYW5TT0koY29uc3QgdWludDhfdComIHNyY19idWYsIEZYX0RXT1JEJiBzcmNfc2l6ZSkgeworICBpZiAoc3JjX3NpemUgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9EV09SRCBvZmZzZXQgPSAwOworICB3aGlsZSAob2Zmc2V0IDwgc3JjX3NpemUgLSAxKSB7CisgICAgaWYgKHNyY19idWZbb2Zmc2V0XSA9PSAweGZmICYmIHNyY19idWZbb2Zmc2V0ICsgMV0gPT0gMHhkOCkgeworICAgICAgc3JjX2J1ZiArPSBvZmZzZXQ7CisgICAgICBzcmNfc2l6ZSAtPSBvZmZzZXQ7CisgICAgICByZXR1cm47CiAgICAgfQorICAgIG9mZnNldCsrOworICB9Cit9CiB9OwogZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIHZvaWQgX3NyY19kb19ub3RoaW5nKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbykge30KK3N0YXRpYyB2b2lkIF9zcmNfZG9fbm90aGluZyhzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8pIHt9CiB9OwogZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIHZvaWQgX2Vycm9yX2ZhdGFsKGpfY29tbW9uX3B0ciBjaW5mbykKLSAgICB7Ci0gICAgICAgIGxvbmdqbXAoKihqbXBfYnVmKiljaW5mby0+Y2xpZW50X2RhdGEsIC0xKTsKLSAgICB9CitzdGF0aWMgdm9pZCBfZXJyb3JfZmF0YWwoal9jb21tb25fcHRyIGNpbmZvKSB7CisgIGxvbmdqbXAoKihqbXBfYnVmKiljaW5mby0+Y2xpZW50X2RhdGEsIC0xKTsKK30KIH07CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgdm9pZCBfc3JjX3NraXBfZGF0YShzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIGxvbmcgbnVtKQotICAgIHsKLSAgICAgICAgaWYgKG51bSA+IChsb25nKWNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcikgewotICAgICAgICAgICAgX2Vycm9yX2ZhdGFsKChqX2NvbW1vbl9wdHIpY2luZm8pOwotICAgICAgICB9Ci0gICAgICAgIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSArPSBudW07Ci0gICAgICAgIGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciAtPSBudW07Ci0gICAgfQorc3RhdGljIHZvaWQgX3NyY19za2lwX2RhdGEoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCBsb25nIG51bSkgeworICBpZiAobnVtID4gKGxvbmcpY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyKSB7CisgICAgX2Vycm9yX2ZhdGFsKChqX2NvbW1vbl9wdHIpY2luZm8pOworICB9CisgIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSArPSBudW07CisgIGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciAtPSBudW07Cit9CiB9OwogZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIGJvb2xlYW4gX3NyY19maWxsX2J1ZmZlcihqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorc3RhdGljIGJvb2xlYW4gX3NyY19maWxsX2J1ZmZlcihqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgIHJldHVybiAwOworfQogfTsKIGV4dGVybiAiQyIgewotICAgIHN0YXRpYyBib29sZWFuIF9zcmNfcmVzeW5jKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBkZXNpcmVkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorc3RhdGljIGJvb2xlYW4gX3NyY19yZXN5bmMoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWQpIHsKKyAgcmV0dXJuIDA7Cit9CiB9OwogZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIHZvaWQgX2Vycm9yX2RvX25vdGhpbmcoal9jb21tb25fcHRyIGNpbmZvKSB7fQorc3RhdGljIHZvaWQgX2Vycm9yX2RvX25vdGhpbmcoal9jb21tb25fcHRyIGNpbmZvKSB7fQogfTsKIGV4dGVybiAiQyIgewotICAgIHN0YXRpYyB2b2lkIF9lcnJvcl9kb19ub3RoaW5nMShqX2NvbW1vbl9wdHIgY2luZm8sIGludCkge30KK3N0YXRpYyB2b2lkIF9lcnJvcl9kb19ub3RoaW5nMShqX2NvbW1vbl9wdHIgY2luZm8sIGludCkge30KIH07CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgdm9pZCBfZXJyb3JfZG9fbm90aGluZzIoal9jb21tb25fcHRyIGNpbmZvLCBjaGFyKikge30KK3N0YXRpYyB2b2lkIF9lcnJvcl9kb19ub3RoaW5nMihqX2NvbW1vbl9wdHIgY2luZm8sIGNoYXIqKSB7fQogfTsKLSNkZWZpbmUgSlBFR19NQVJLRVJfRVhJRgkJKEpQRUdfQVBQMCArIDEpCi0jZGVmaW5lCUpQRUdfTUFSS0VSX0lDQwkJCShKUEVHX0FQUDAgKyAyKQotI2RlZmluZQlKUEVHX01BUktFUl9BVVRIT1JUSU1FCShKUEVHX0FQUDAgKyAzKQotI2RlZmluZQlKUEVHX01BUktFUl9NQVhTSVpFCTB4RkZGRgotI2RlZmluZQlKUEVHX09WRVJIRUFEX0xFTgkxNAotc3RhdGljIEZYX0JPT0wgX0pwZWdJc0ljY01hcmtlcihqcGVnX3NhdmVkX21hcmtlcl9wdHIgbWFya2VyKQotewotICAgIGlmIChtYXJrZXItPm1hcmtlciA9PSBKUEVHX01BUktFUl9JQ0MgJiYKLSAgICAgICAgICAgIG1hcmtlci0+ZGF0YV9sZW5ndGggPj0gSlBFR19PVkVSSEVBRF9MRU4gJiYKLSAgICAgICAgICAgIChGWFNZU19tZW1jbXAobWFya2VyLT5kYXRhLCAiXHg0OVx4NDNceDQzXHg1Zlx4NTBceDUyXHg0Zlx4NDZceDQ5XHg0Y1x4NDVceDAwIiwgMTIpID09IDApKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KKyNkZWZpbmUgSlBFR19NQVJLRVJfRVhJRiAoSlBFR19BUFAwICsgMSkKKyNkZWZpbmUgSlBFR19NQVJLRVJfSUNDIChKUEVHX0FQUDAgKyAyKQorI2RlZmluZSBKUEVHX01BUktFUl9BVVRIT1JUSU1FIChKUEVHX0FQUDAgKyAzKQorI2RlZmluZSBKUEVHX01BUktFUl9NQVhTSVpFIDB4RkZGRgorI2RlZmluZSBKUEVHX09WRVJIRUFEX0xFTiAxNAorc3RhdGljIEZYX0JPT0wgX0pwZWdJc0ljY01hcmtlcihqcGVnX3NhdmVkX21hcmtlcl9wdHIgbWFya2VyKSB7CisgIGlmIChtYXJrZXItPm1hcmtlciA9PSBKUEVHX01BUktFUl9JQ0MgJiYKKyAgICAgIG1hcmtlci0+ZGF0YV9sZW5ndGggPj0gSlBFR19PVkVSSEVBRF9MRU4gJiYKKyAgICAgIChGWFNZU19tZW1jbXAobWFya2VyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAiXHg0OVx4NDNceDQzXHg1Zlx4NTBceDUyXHg0Zlx4NDZceDQ5XHg0Y1x4NDVceDAwIiwKKyAgICAgICAgICAgICAgICAgICAgMTIpID09IDApKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorc3RhdGljIEZYX0JPT0wgX0pwZWdMb2FkSWNjUHJvZmlsZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogaWNjX2J1Zl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBpY2NfbGVuZ3RoKSB7CisgIGlmIChpY2NfYnVmX3B0ciA9PSBOVUxMIHx8IGljY19sZW5ndGggPT0gTlVMTCkgewogICAgIHJldHVybiBGQUxTRTsKLX0KLXN0YXRpYwlGWF9CT09MIF9KcGVnTG9hZEljY1Byb2ZpbGUoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgdWludDhfdCoqIGljY19idWZfcHRyLCBGWF9EV09SRCogaWNjX2xlbmd0aCkKLXsKLSAgICBpZihpY2NfYnVmX3B0ciA9PSBOVUxMIHx8IGljY19sZW5ndGggPT0gTlVMTCkgeworICB9CisgICppY2NfYnVmX3B0ciA9IE5VTEw7CisgICppY2NfbGVuZ3RoID0gMDsKKyAgdWludDhfdCogaWNjX2RhdGFfcHRyID0gTlVMTDsKKyAgRlhfRFdPUkQgaWNjX2RhdGFfbGVuID0gMDsKKyAgdWludDhfdCBjb3VudF9pY2NfbWFya2VyID0gMDsKKyAgdWludDhfdCBudW1faWNjX21hcmtlciA9IDA7CisgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBtYXJrZXJfbGlzdFsyNTZdID0ge05VTEx9OworICBmb3IgKGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBjdXJfbWFya2VyID0gY2luZm8tPm1hcmtlcl9saXN0OworICAgICAgIGN1cl9tYXJrZXIgIT0gTlVMTDsgY3VyX21hcmtlciA9IGN1cl9tYXJrZXItPm5leHQpIHsKKyAgICBpZiAoX0pwZWdJc0ljY01hcmtlcihjdXJfbWFya2VyKSkgeworICAgICAgaWYgKGNvdW50X2ljY19tYXJrZXIgPT0gMCkgeworICAgICAgICBudW1faWNjX21hcmtlciA9IGN1cl9tYXJrZXItPmRhdGFbMTNdOworICAgICAgfSBlbHNlIGlmIChudW1faWNjX21hcmtlciAhPSBjdXJfbWFya2VyLT5kYXRhWzEzXSkgewogICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgICppY2NfYnVmX3B0ciA9IE5VTEw7Ci0gICAgKmljY19sZW5ndGggPSAwOwotICAgIHVpbnQ4X3QqIGljY19kYXRhX3B0ciA9IE5VTEw7Ci0gICAgRlhfRFdPUkQgaWNjX2RhdGFfbGVuID0gMDsKLSAgICB1aW50OF90IGNvdW50X2ljY19tYXJrZXIgPSAwOwotICAgIHVpbnQ4X3QgbnVtX2ljY19tYXJrZXIgPSAwOwotICAgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBtYXJrZXJfbGlzdFsyNTZdID0ge05VTEx9OwotICAgIGZvciAoanBlZ19zYXZlZF9tYXJrZXJfcHRyIGN1cl9tYXJrZXIgPSBjaW5mby0+bWFya2VyX2xpc3Q7Ci0gICAgICAgICAgICBjdXJfbWFya2VyICE9IE5VTEw7Ci0gICAgICAgICAgICBjdXJfbWFya2VyID0gY3VyX21hcmtlci0+bmV4dCkgewotICAgICAgICBpZihfSnBlZ0lzSWNjTWFya2VyKGN1cl9tYXJrZXIpKSB7Ci0gICAgICAgICAgICBpZihjb3VudF9pY2NfbWFya2VyID09IDApIHsKLSAgICAgICAgICAgICAgICBudW1faWNjX21hcmtlciA9IGN1cl9tYXJrZXItPmRhdGFbMTNdOwotICAgICAgICAgICAgfSBlbHNlIGlmKG51bV9pY2NfbWFya2VyICE9IGN1cl9tYXJrZXItPmRhdGFbMTNdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNuID0gY3VyX21hcmtlci0+ZGF0YVsxMl0gLSAxOwotICAgICAgICAgICAgaWYoc24gPCAwIHx8IHNuID49IG51bV9pY2NfbWFya2VyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYobWFya2VyX2xpc3Rbc25dID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtYXJrZXJfbGlzdFtzbl0gPSBjdXJfbWFya2VyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb3VudF9pY2NfbWFya2VyICsrOwotICAgICAgICAgICAgaWNjX2RhdGFfbGVuICs9CShjdXJfbWFya2VyLT5kYXRhX2xlbmd0aCAtIEpQRUdfT1ZFUkhFQURfTEVOKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihjb3VudF9pY2NfbWFya2VyICE9IG51bV9pY2NfbWFya2VyKSB7CisgICAgICB9CisgICAgICBpbnQgc24gPSBjdXJfbWFya2VyLT5kYXRhWzEyXSAtIDE7CisgICAgICBpZiAoc24gPCAwIHx8IHNuID49IG51bV9pY2NfbWFya2VyKSB7CiAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYobnVtX2ljY19tYXJrZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWNjX2RhdGFfcHRyID0gRlhfQWxsb2ModWludDhfdCwgaWNjX2RhdGFfbGVuKTsKLSAgICBpZihpY2NfYnVmX3B0ciA9PSBOVUxMKQl7CisgICAgICB9CisgICAgICBpZiAobWFya2VyX2xpc3Rbc25dID09IE5VTEwpIHsKKyAgICAgICAgbWFya2VyX2xpc3Rbc25dID0gY3VyX21hcmtlcjsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGNvdW50X2ljY19tYXJrZXIrKzsKKyAgICAgIGljY19kYXRhX2xlbiArPSAoY3VyX21hcmtlci0+ZGF0YV9sZW5ndGggLSBKUEVHX09WRVJIRUFEX0xFTik7CiAgICAgfQotICAgICppY2NfYnVmX3B0ciA9IGljY19kYXRhX3B0cjsKLSAgICAqaWNjX2xlbmd0aCA9IGljY19kYXRhX2xlbjsKLSAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBudW1faWNjX21hcmtlcjsgaWR4KyspIHsKLSAgICAgICAgaWNjX2RhdGFfbGVuID0gbWFya2VyX2xpc3RbaWR4XS0+ZGF0YV9sZW5ndGggLSBKUEVHX09WRVJIRUFEX0xFTjsKLSAgICAgICAgRlhTWVNfbWVtY3B5KGljY19kYXRhX3B0ciwgbWFya2VyX2xpc3RbaWR4XS0+ZGF0YSArIEpQRUdfT1ZFUkhFQURfTEVOLCBpY2NfZGF0YV9sZW4pOwotICAgICAgICBpY2NfZGF0YV9wdHIgKz0gaWNjX2RhdGFfbGVuOwotICAgIH0KKyAgfQorICBpZiAoY291bnRfaWNjX21hcmtlciAhPSBudW1faWNjX21hcmtlcikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobnVtX2ljY19tYXJrZXIgPT0gMCkgewogICAgIHJldHVybiBUUlVFOworICB9CisgIGljY19kYXRhX3B0ciA9IEZYX0FsbG9jKHVpbnQ4X3QsIGljY19kYXRhX2xlbik7CisgIGlmIChpY2NfYnVmX3B0ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgICppY2NfYnVmX3B0ciA9IGljY19kYXRhX3B0cjsKKyAgKmljY19sZW5ndGggPSBpY2NfZGF0YV9sZW47CisgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IG51bV9pY2NfbWFya2VyOyBpZHgrKykgeworICAgIGljY19kYXRhX2xlbiA9IG1hcmtlcl9saXN0W2lkeF0tPmRhdGFfbGVuZ3RoIC0gSlBFR19PVkVSSEVBRF9MRU47CisgICAgRlhTWVNfbWVtY3B5KGljY19kYXRhX3B0ciwgbWFya2VyX2xpc3RbaWR4XS0+ZGF0YSArIEpQRUdfT1ZFUkhFQURfTEVOLAorICAgICAgICAgICAgICAgICBpY2NfZGF0YV9sZW4pOworICAgIGljY19kYXRhX3B0ciArPSBpY2NfZGF0YV9sZW47CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1zdGF0aWMJRlhfQk9PTCBfSnBlZ0VtYmVkSWNjUHJvZmlsZShqX2NvbXByZXNzX3B0ciBjaW5mbywgY29uc3QgdWludDhfdCogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEIGljY19sZW5ndGgpCi17Ci0gICAgaWYoaWNjX2J1Zl9wdHIgPT0gTlVMTCB8fCBpY2NfbGVuZ3RoID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9EV09SRCBpY2Nfc2VnbWVudF9zaXplID0gKEpQRUdfTUFSS0VSX01BWFNJWkUgLSAyIC0gSlBFR19PVkVSSEVBRF9MRU4pOwotICAgIEZYX0RXT1JEIGljY19zZWdtZW50X251bSA9IChpY2NfbGVuZ3RoIC8gaWNjX3NlZ21lbnRfc2l6ZSkgKyAxOwotICAgIGlmIChpY2Nfc2VnbWVudF9udW0gPiAyNTUpCXsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9EV09SRCBpY2NfZGF0YV9sZW5ndGggPSBKUEVHX09WRVJIRUFEX0xFTiArIChpY2Nfc2VnbWVudF9udW0gPiAxID8gaWNjX3NlZ21lbnRfc2l6ZSA6IGljY19sZW5ndGgpOwotICAgIHVpbnQ4X3QqIGljY19kYXRhID0gRlhfQWxsb2ModWludDhfdCwgaWNjX2RhdGFfbGVuZ3RoKTsKLSAgICBGWFNZU19tZW1jcHkoaWNjX2RhdGEsICJceDQ5XHg0M1x4NDNceDVmXHg1MFx4NTJceDRmXHg0Nlx4NDlceDRjXHg0NVx4MDAiLCAxMik7Ci0gICAgaWNjX2RhdGFbMTNdID0gKHVpbnQ4X3QpaWNjX3NlZ21lbnRfbnVtOwotICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8IChpY2Nfc2VnbWVudF9udW0gLSAxKTsgaSsrKSB7Ci0gICAgICAgIGljY19kYXRhWzEyXSA9IGkgKyAxOwotICAgICAgICBGWFNZU19tZW1jcHkoaWNjX2RhdGEgKyBKUEVHX09WRVJIRUFEX0xFTiwgaWNjX2J1Zl9wdHIgKyBpICogaWNjX3NlZ21lbnRfc2l6ZSwgaWNjX3NlZ21lbnRfc2l6ZSk7Ci0gICAgICAgIGpwZWdfd3JpdGVfbWFya2VyKGNpbmZvLCBKUEVHX01BUktFUl9JQ0MsIGljY19kYXRhLCBpY2NfZGF0YV9sZW5ndGgpOwotICAgIH0KLSAgICBpY2NfZGF0YVsxMl0gPSAodWludDhfdClpY2Nfc2VnbWVudF9udW07Ci0gICAgRlhfRFdPUkQgaWNjX3NpemUgPSAoaWNjX3NlZ21lbnRfbnVtIC0gMSkgKiBpY2Nfc2VnbWVudF9zaXplOwotICAgIEZYU1lTX21lbWNweShpY2NfZGF0YSArIEpQRUdfT1ZFUkhFQURfTEVOLCBpY2NfYnVmX3B0ciArIGljY19zaXplLCBpY2NfbGVuZ3RoIC0gaWNjX3NpemUpOwotICAgIGpwZWdfd3JpdGVfbWFya2VyKGNpbmZvLCBKUEVHX01BUktFUl9JQ0MsIGljY19kYXRhLCBKUEVHX09WRVJIRUFEX0xFTiArIGljY19sZW5ndGggLSBpY2Nfc2l6ZSk7Ci0gICAgRlhfRnJlZShpY2NfZGF0YSk7Ci0gICAgcmV0dXJuIFRSVUU7CitzdGF0aWMgRlhfQk9PTCBfSnBlZ0VtYmVkSWNjUHJvZmlsZShqX2NvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGljY19idWZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgaWNjX2xlbmd0aCkgeworICBpZiAoaWNjX2J1Zl9wdHIgPT0gTlVMTCB8fCBpY2NfbGVuZ3RoID09IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRFdPUkQgaWNjX3NlZ21lbnRfc2l6ZSA9IChKUEVHX01BUktFUl9NQVhTSVpFIC0gMiAtIEpQRUdfT1ZFUkhFQURfTEVOKTsKKyAgRlhfRFdPUkQgaWNjX3NlZ21lbnRfbnVtID0gKGljY19sZW5ndGggLyBpY2Nfc2VnbWVudF9zaXplKSArIDE7CisgIGlmIChpY2Nfc2VnbWVudF9udW0gPiAyNTUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRFdPUkQgaWNjX2RhdGFfbGVuZ3RoID0KKyAgICAgIEpQRUdfT1ZFUkhFQURfTEVOICsgKGljY19zZWdtZW50X251bSA+IDEgPyBpY2Nfc2VnbWVudF9zaXplIDogaWNjX2xlbmd0aCk7CisgIHVpbnQ4X3QqIGljY19kYXRhID0gRlhfQWxsb2ModWludDhfdCwgaWNjX2RhdGFfbGVuZ3RoKTsKKyAgRlhTWVNfbWVtY3B5KGljY19kYXRhLCAiXHg0OVx4NDNceDQzXHg1Zlx4NTBceDUyXHg0Zlx4NDZceDQ5XHg0Y1x4NDVceDAwIiwKKyAgICAgICAgICAgICAgIDEyKTsKKyAgaWNjX2RhdGFbMTNdID0gKHVpbnQ4X3QpaWNjX3NlZ21lbnRfbnVtOworICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCAoaWNjX3NlZ21lbnRfbnVtIC0gMSk7IGkrKykgeworICAgIGljY19kYXRhWzEyXSA9IGkgKyAxOworICAgIEZYU1lTX21lbWNweShpY2NfZGF0YSArIEpQRUdfT1ZFUkhFQURfTEVOLAorICAgICAgICAgICAgICAgICBpY2NfYnVmX3B0ciArIGkgKiBpY2Nfc2VnbWVudF9zaXplLCBpY2Nfc2VnbWVudF9zaXplKTsKKyAgICBqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgSlBFR19NQVJLRVJfSUNDLCBpY2NfZGF0YSwgaWNjX2RhdGFfbGVuZ3RoKTsKKyAgfQorICBpY2NfZGF0YVsxMl0gPSAodWludDhfdClpY2Nfc2VnbWVudF9udW07CisgIEZYX0RXT1JEIGljY19zaXplID0gKGljY19zZWdtZW50X251bSAtIDEpICogaWNjX3NlZ21lbnRfc2l6ZTsKKyAgRlhTWVNfbWVtY3B5KGljY19kYXRhICsgSlBFR19PVkVSSEVBRF9MRU4sIGljY19idWZfcHRyICsgaWNjX3NpemUsCisgICAgICAgICAgICAgICBpY2NfbGVuZ3RoIC0gaWNjX3NpemUpOworICBqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgSlBFR19NQVJLRVJfSUNDLCBpY2NfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgSlBFR19PVkVSSEVBRF9MRU4gKyBpY2NfbGVuZ3RoIC0gaWNjX3NpemUpOworICBGWF9GcmVlKGljY19kYXRhKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgdm9pZCBfZGVzdF9kb19ub3RoaW5nKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7fQorc3RhdGljIHZvaWQgX2Rlc3RfZG9fbm90aGluZyhqX2NvbXByZXNzX3B0ciBjaW5mbykge30KIH07CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgYm9vbGVhbiBfZGVzdF9lbXB0eShqX2NvbXByZXNzX3B0ciBjaW5mbykKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CitzdGF0aWMgYm9vbGVhbiBfZGVzdF9lbXB0eShqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICByZXR1cm4gRkFMU0U7Cit9CiB9OwotI2RlZmluZQlKUEVHX0JMT0NLX1NJWkUJMTA0ODU3Ngotc3RhdGljIHZvaWQgX0pwZWdFbmNvZGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgdWludDhfdComIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5LCBjb25zdCB1aW50OF90KiBpY2NfYnVmLCBGWF9EV09SRCBpY2NfbGVuZ3RoKQotewotICAgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOwotICAgIGplcnIuZXJyb3JfZXhpdCA9IF9lcnJvcl9kb19ub3RoaW5nOwotICAgIGplcnIuZW1pdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcxOwotICAgIGplcnIub3V0cHV0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzsKLSAgICBqZXJyLmZvcm1hdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcyOwotICAgIGplcnIucmVzZXRfZXJyb3JfbWdyID0gX2Vycm9yX2RvX25vdGhpbmc7CisjZGVmaW5lIEpQRUdfQkxPQ0tfU0laRSAxMDQ4NTc2CitzdGF0aWMgdm9pZCBfSnBlZ0VuY29kZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSYgZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpY2NfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgaWNjX2xlbmd0aCkgeworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKKyAgamVyci5lcnJvcl9leGl0ID0gX2Vycm9yX2RvX25vdGhpbmc7CisgIGplcnIuZW1pdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcxOworICBqZXJyLm91dHB1dF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmc7CisgIGplcnIuZm9ybWF0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzI7CisgIGplcnIucmVzZXRfZXJyb3JfbWdyID0gX2Vycm9yX2RvX25vdGhpbmc7CiAKLSAgICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0gICAgbWVtc2V0KCZjaW5mbywgMCwgc2l6ZW9mKGNpbmZvKSk7Ci0gICAgY2luZm8uZXJyID0gJmplcnI7Ci0gICAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKLSAgICBpbnQgQnBwID0gcFNvdXJjZS0+R2V0QlBQKCkgLyA4OwotICAgIEZYX0RXT1JEIG5Db21wb25lbnRzID0gQnBwID49IDMgPyAocFNvdXJjZS0+SXNDbXlrSW1hZ2UoKSA/IDQgOiAzKSA6IDE7Ci0gICAgRlhfRFdPUkQgcGl0Y2ggPSBwU291cmNlLT5HZXRQaXRjaCgpOwotICAgIEZYX0RXT1JEIHdpZHRoID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KHBTb3VyY2UtPkdldFdpZHRoKCkpOwotICAgIEZYX0RXT1JEIGhlaWdodCA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPihwU291cmNlLT5HZXRIZWlnaHQoKSk7Ci0gICAgRlhfU0FGRV9EV09SRCBzYWZlX2J1Zl9sZW4gPSB3aWR0aDsKLSAgICBzYWZlX2J1Zl9sZW4gKj0gaGVpZ2h0OwotICAgIHNhZmVfYnVmX2xlbiAqPSBuQ29tcG9uZW50czsKLSAgICBzYWZlX2J1Zl9sZW4gKz0gMTAyNDsKLSAgICBpZiAoaWNjX2xlbmd0aCkgewotICAgICAgICBzYWZlX2J1Zl9sZW4gKz0gMjU1ICogMTg7Ci0gICAgICAgIHNhZmVfYnVmX2xlbiArPSBpY2NfbGVuZ3RoOworICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87CisgIG1lbXNldCgmY2luZm8sIDAsIHNpemVvZihjaW5mbykpOworICBjaW5mby5lcnIgPSAmamVycjsKKyAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKKyAgaW50IEJwcCA9IHBTb3VyY2UtPkdldEJQUCgpIC8gODsKKyAgRlhfRFdPUkQgbkNvbXBvbmVudHMgPSBCcHAgPj0gMyA/IChwU291cmNlLT5Jc0NteWtJbWFnZSgpID8gNCA6IDMpIDogMTsKKyAgRlhfRFdPUkQgcGl0Y2ggPSBwU291cmNlLT5HZXRQaXRjaCgpOworICBGWF9EV09SRCB3aWR0aCA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPihwU291cmNlLT5HZXRXaWR0aCgpKTsKKyAgRlhfRFdPUkQgaGVpZ2h0ID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KHBTb3VyY2UtPkdldEhlaWdodCgpKTsKKyAgRlhfU0FGRV9EV09SRCBzYWZlX2J1Zl9sZW4gPSB3aWR0aDsKKyAgc2FmZV9idWZfbGVuICo9IGhlaWdodDsKKyAgc2FmZV9idWZfbGVuICo9IG5Db21wb25lbnRzOworICBzYWZlX2J1Zl9sZW4gKz0gMTAyNDsKKyAgaWYgKGljY19sZW5ndGgpIHsKKyAgICBzYWZlX2J1Zl9sZW4gKz0gMjU1ICogMTg7CisgICAgc2FmZV9idWZfbGVuICs9IGljY19sZW5ndGg7CisgIH0KKyAgRlhfRFdPUkQgZGVzdF9idWZfbGVuZ3RoID0gMDsKKyAgaWYgKCFzYWZlX2J1Zl9sZW4uSXNWYWxpZCgpKSB7CisgICAgZGVzdF9idWYgPSBudWxscHRyOworICB9IGVsc2UgeworICAgIGRlc3RfYnVmX2xlbmd0aCA9IHNhZmVfYnVmX2xlbi5WYWx1ZU9yRGllKCk7CisgICAgZGVzdF9idWYgPSBGWF9UcnlBbGxvYyh1aW50OF90LCBkZXN0X2J1Zl9sZW5ndGgpOworICAgIGNvbnN0IGludCBNSU5fVFJZX0JVRl9MRU4gPSAxMDI0OworICAgIHdoaWxlICghZGVzdF9idWYgJiYgZGVzdF9idWZfbGVuZ3RoID4gTUlOX1RSWV9CVUZfTEVOKSB7CisgICAgICBkZXN0X2J1Zl9sZW5ndGggPj49IDE7CisgICAgICBkZXN0X2J1ZiA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIGRlc3RfYnVmX2xlbmd0aCk7CiAgICAgfQotICAgIEZYX0RXT1JEIGRlc3RfYnVmX2xlbmd0aCA9IDA7Ci0gICAgaWYgKCFzYWZlX2J1Zl9sZW4uSXNWYWxpZCgpKSB7Ci0gICAgICAgIGRlc3RfYnVmID0gbnVsbHB0cjsKLSAgICB9IGVsc2UgewotICAgICAgICBkZXN0X2J1Zl9sZW5ndGggPSBzYWZlX2J1Zl9sZW4uVmFsdWVPckRpZSgpOwotICAgICAgICBkZXN0X2J1ZiA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIGRlc3RfYnVmX2xlbmd0aCk7Ci0gICAgICAgIGNvbnN0IGludCBNSU5fVFJZX0JVRl9MRU4gPSAxMDI0OwotICAgICAgICB3aGlsZSAoIWRlc3RfYnVmICYmIGRlc3RfYnVmX2xlbmd0aCA+IE1JTl9UUllfQlVGX0xFTikgewotICAgICAgICAgICAgZGVzdF9idWZfbGVuZ3RoID4+PSAxOwotICAgICAgICAgICAgZGVzdF9idWYgPSBGWF9UcnlBbGxvYyh1aW50OF90LCBkZXN0X2J1Zl9sZW5ndGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghZGVzdF9idWYpIHsKLSAgICAgICAgRlhfT3V0T2ZNZW1vcnlUZXJtaW5hdGUoKTsKLSAgICB9Ci0gICAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIGRlc3Q7Ci0gICAgZGVzdC5pbml0X2Rlc3RpbmF0aW9uID0gX2Rlc3RfZG9fbm90aGluZzsKLSAgICBkZXN0LnRlcm1fZGVzdGluYXRpb24gPSBfZGVzdF9kb19ub3RoaW5nOwotICAgIGRlc3QuZW1wdHlfb3V0cHV0X2J1ZmZlciA9IF9kZXN0X2VtcHR5OwotICAgIGRlc3QubmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3RfYnVmOwotICAgIGRlc3QuZnJlZV9pbl9idWZmZXIgPSBkZXN0X2J1Zl9sZW5ndGg7Ci0gICAgY2luZm8uZGVzdCA9ICZkZXN0OwotICAgIGNpbmZvLmltYWdlX3dpZHRoID0gd2lkdGg7Ci0gICAgY2luZm8uaW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIGNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSBuQ29tcG9uZW50czsKLSAgICBpZiAobkNvbXBvbmVudHMgPT0gMSkgewotICAgICAgICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19HUkFZU0NBTEU7Ci0gICAgfSBlbHNlIGlmIChuQ29tcG9uZW50cyA9PSAzKSB7Ci0gICAgICAgIGNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKLSAgICB9IGVsc2UgewotICAgICAgICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19DTVlLOwotICAgIH0KLSAgICB1aW50OF90KiBsaW5lX2J1ZiA9IE5VTEw7CisgIH0KKyAgaWYgKCFkZXN0X2J1ZikgeworICAgIEZYX091dE9mTWVtb3J5VGVybWluYXRlKCk7CisgIH0KKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIGRlc3Q7CisgIGRlc3QuaW5pdF9kZXN0aW5hdGlvbiA9IF9kZXN0X2RvX25vdGhpbmc7CisgIGRlc3QudGVybV9kZXN0aW5hdGlvbiA9IF9kZXN0X2RvX25vdGhpbmc7CisgIGRlc3QuZW1wdHlfb3V0cHV0X2J1ZmZlciA9IF9kZXN0X2VtcHR5OworICBkZXN0Lm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0X2J1ZjsKKyAgZGVzdC5mcmVlX2luX2J1ZmZlciA9IGRlc3RfYnVmX2xlbmd0aDsKKyAgY2luZm8uZGVzdCA9ICZkZXN0OworICBjaW5mby5pbWFnZV93aWR0aCA9IHdpZHRoOworICBjaW5mby5pbWFnZV9oZWlnaHQgPSBoZWlnaHQ7CisgIGNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSBuQ29tcG9uZW50czsKKyAgaWYgKG5Db21wb25lbnRzID09IDEpIHsKKyAgICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19HUkFZU0NBTEU7CisgIH0gZWxzZSBpZiAobkNvbXBvbmVudHMgPT0gMykgeworICAgIGNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKyAgfSBlbHNlIHsKKyAgICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19DTVlLOworICB9CisgIHVpbnQ4X3QqIGxpbmVfYnVmID0gTlVMTDsKKyAgaWYgKG5Db21wb25lbnRzID4gMSkgeworICAgIGxpbmVfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCB3aWR0aCwgbkNvbXBvbmVudHMpOworICB9CisgIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7CisgIGlmIChxdWFsaXR5ICE9IDc1KSB7CisgICAganBlZ19zZXRfcXVhbGl0eSgmY2luZm8sIHF1YWxpdHksIFRSVUUpOworICB9CisgIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKKyAgX0pwZWdFbWJlZEljY1Byb2ZpbGUoJmNpbmZvLCBpY2NfYnVmLCBpY2NfbGVuZ3RoKTsKKyAgSlNBTVBST1cgcm93X3BvaW50ZXJbMV07CisgIEpESU1FTlNJT04gcm93OworICB3aGlsZSAoY2luZm8ubmV4dF9zY2FubGluZSA8IGNpbmZvLmltYWdlX2hlaWdodCkgeworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNvdXJjZS0+R2V0U2NhbmxpbmUoY2luZm8ubmV4dF9zY2FubGluZSk7CiAgICAgaWYgKG5Db21wb25lbnRzID4gMSkgewotICAgICAgICBsaW5lX2J1ZiA9IEZYX0FsbG9jMkQodWludDhfdCwgd2lkdGgsIG5Db21wb25lbnRzKTsKLSAgICB9Ci0gICAganBlZ19zZXRfZGVmYXVsdHMoJmNpbmZvKTsKLSAgICBpZihxdWFsaXR5ICE9IDc1KSB7Ci0gICAgICAgIGpwZWdfc2V0X3F1YWxpdHkoJmNpbmZvLCBxdWFsaXR5LCBUUlVFKTsKLSAgICB9Ci0gICAganBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIFRSVUUpOwotICAgIF9KcGVnRW1iZWRJY2NQcm9maWxlKCZjaW5mbywgaWNjX2J1ZiwgaWNjX2xlbmd0aCk7Ci0gICAgSlNBTVBST1cgcm93X3BvaW50ZXJbMV07Ci0gICAgSkRJTUVOU0lPTiByb3c7Ci0gICAgd2hpbGUgKGNpbmZvLm5leHRfc2NhbmxpbmUgPCBjaW5mby5pbWFnZV9oZWlnaHQpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU291cmNlLT5HZXRTY2FubGluZShjaW5mby5uZXh0X3NjYW5saW5lKTsKLSAgICAgICAgaWYgKG5Db21wb25lbnRzID4gMSkgewotICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbGluZV9idWY7Ci0gICAgICAgICAgICBpZiAobkNvbXBvbmVudHMgPT0gMykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3NjYW5bMl07Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IEJwcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl0Y2g7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gfipzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvd19wb2ludGVyWzBdID0gbGluZV9idWY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByb3dfcG9pbnRlclswXSA9ICh1aW50OF90KilzcmNfc2NhbjsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGxpbmVfYnVmOworICAgICAgaWYgKG5Db21wb25lbnRzID09IDMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3NjYW5bMl07CisgICAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICAgICAgc3JjX3NjYW4gKz0gQnBwOwogICAgICAgICB9Ci0gICAgICAgIHJvdyA9IGNpbmZvLm5leHRfc2NhbmxpbmU7Ci0gICAgICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjaW5mbywgcm93X3BvaW50ZXIsIDEpOwotICAgICAgICBpZiAoY2luZm8ubmV4dF9zY2FubGluZSA9PSByb3cpIHsKLSAgICAgICAgICAgIGRlc3RfYnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBkZXN0X2J1ZiwgZGVzdF9idWZfbGVuZ3RoICsgSlBFR19CTE9DS19TSVpFKTsKLSAgICAgICAgICAgIGRlc3QubmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3RfYnVmICsgZGVzdF9idWZfbGVuZ3RoIC0gZGVzdC5mcmVlX2luX2J1ZmZlcjsKLSAgICAgICAgICAgIGRlc3RfYnVmX2xlbmd0aCArPSBKUEVHX0JMT0NLX1NJWkU7Ci0gICAgICAgICAgICBkZXN0LmZyZWVfaW5fYnVmZmVyICs9IEpQRUdfQkxPQ0tfU0laRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl0Y2g7IGkrKykgeworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IH4qc3JjX3NjYW4rKzsKICAgICAgICAgfQorICAgICAgfQorICAgICAgcm93X3BvaW50ZXJbMF0gPSBsaW5lX2J1ZjsKKyAgICB9IGVsc2UgeworICAgICAgcm93X3BvaW50ZXJbMF0gPSAodWludDhfdCopc3JjX3NjYW47CiAgICAgfQotICAgIGpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7Ci0gICAganBlZ19kZXN0cm95X2NvbXByZXNzKCZjaW5mbyk7Ci0gICAgaWYgKGxpbmVfYnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobGluZV9idWYpOworICAgIHJvdyA9IGNpbmZvLm5leHRfc2NhbmxpbmU7CisgICAganBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCByb3dfcG9pbnRlciwgMSk7CisgICAgaWYgKGNpbmZvLm5leHRfc2NhbmxpbmUgPT0gcm93KSB7CisgICAgICBkZXN0X2J1ZiA9CisgICAgICAgICAgRlhfUmVhbGxvYyh1aW50OF90LCBkZXN0X2J1ZiwgZGVzdF9idWZfbGVuZ3RoICsgSlBFR19CTE9DS19TSVpFKTsKKyAgICAgIGRlc3QubmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3RfYnVmICsgZGVzdF9idWZfbGVuZ3RoIC0gZGVzdC5mcmVlX2luX2J1ZmZlcjsKKyAgICAgIGRlc3RfYnVmX2xlbmd0aCArPSBKUEVHX0JMT0NLX1NJWkU7CisgICAgICBkZXN0LmZyZWVfaW5fYnVmZmVyICs9IEpQRUdfQkxPQ0tfU0laRTsKICAgICB9Ci0gICAgZGVzdF9zaXplID0gZGVzdF9idWZfbGVuZ3RoIC0gKEZYX1NUUlNJWkUpZGVzdC5mcmVlX2luX2J1ZmZlcjsKKyAgfQorICBqcGVnX2ZpbmlzaF9jb21wcmVzcygmY2luZm8pOworICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmNpbmZvKTsKKyAgaWYgKGxpbmVfYnVmKSB7CisgICAgRlhfRnJlZShsaW5lX2J1Zik7CisgIH0KKyAgZGVzdF9zaXplID0gZGVzdF9idWZfbGVuZ3RoIC0gKEZYX1NUUlNJWkUpZGVzdC5mcmVlX2luX2J1ZmZlcjsKIH0KLXN0YXRpYyB2b2lkIF9KcGVnTG9hZEF0dHJpYnV0ZShzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCogcEluZm8sIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpCi17Ci0gICAgaWYgKHBJbmZvID09IE5VTEwgfHwgcEF0dHJpYnV0ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBBdHRyaWJ1dGUpIHsKLSAgICAgICAgcEF0dHJpYnV0ZS0+bV9uWERQSSA9IHBJbmZvLT5YX2RlbnNpdHk7Ci0gICAgICAgIHBBdHRyaWJ1dGUtPm1fbllEUEkgPSBwSW5mby0+WV9kZW5zaXR5OwotICAgICAgICBwQXR0cmlidXRlLT5tX3dEUElVbml0ID0gcEluZm8tPmRlbnNpdHlfdW5pdDsKLSAgICB9CitzdGF0aWMgdm9pZCBfSnBlZ0xvYWRBdHRyaWJ1dGUoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIHBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIHsKKyAgaWYgKHBJbmZvID09IE5VTEwgfHwgcEF0dHJpYnV0ZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChwQXR0cmlidXRlKSB7CisgICAgcEF0dHJpYnV0ZS0+bV9uWERQSSA9IHBJbmZvLT5YX2RlbnNpdHk7CisgICAgcEF0dHJpYnV0ZS0+bV9uWURQSSA9IHBJbmZvLT5ZX2RlbnNpdHk7CisgICAgcEF0dHJpYnV0ZS0+bV93RFBJVW5pdCA9IHBJbmZvLT5kZW5zaXR5X3VuaXQ7CisgIH0KIH0KLXN0YXRpYyBGWF9CT09MIF9KcGVnTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyLCBGWF9EV09SRCogaWNjX2xlbmd0aCkKLXsKLSAgICBfSnBlZ1NjYW5TT0koc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGNpbmZvOwotICAgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOwotICAgIGplcnIuZXJyb3JfZXhpdCA9IF9lcnJvcl9mYXRhbDsKLSAgICBqZXJyLmVtaXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMTsKLSAgICBqZXJyLm91dHB1dF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmc7Ci0gICAgamVyci5mb3JtYXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMjsKLSAgICBqZXJyLnJlc2V0X2Vycm9yX21nciA9IF9lcnJvcl9kb19ub3RoaW5nOwotICAgIGplcnIudHJhY2VfbGV2ZWwgPSAwOwotICAgIGNpbmZvLmVyciA9ICZqZXJyOwotICAgIGptcF9idWYgbWFyazsKLSAgICBjaW5mby5jbGllbnRfZGF0YSA9ICZtYXJrOwotICAgIGlmIChzZXRqbXAobWFyaykgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgc3RydWN0IGpwZWdfc291cmNlX21nciBzcmM7Ci0gICAgc3JjLmluaXRfc291cmNlID0gX3NyY19kb19ub3RoaW5nOwotICAgIHNyYy50ZXJtX3NvdXJjZSA9IF9zcmNfZG9fbm90aGluZzsKLSAgICBzcmMuc2tpcF9pbnB1dF9kYXRhID0gX3NyY19za2lwX2RhdGE7Ci0gICAgc3JjLmZpbGxfaW5wdXRfYnVmZmVyID0gX3NyY19maWxsX2J1ZmZlcjsKLSAgICBzcmMucmVzeW5jX3RvX3Jlc3RhcnQgPSBfc3JjX3Jlc3luYzsKLSAgICBzcmMuYnl0ZXNfaW5fYnVmZmVyID0gc3JjX3NpemU7Ci0gICAgc3JjLm5leHRfaW5wdXRfYnl0ZSA9IHNyY19idWY7Ci0gICAgY2luZm8uc3JjID0gJnNyYzsKLSAgICBpZiAoc2V0am1wKG1hcmspID09IC0xKSB7Ci0gICAgICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYoaWNjX2J1Zl9wdHIgJiYgaWNjX2xlbmd0aCkgewotICAgICAgICBqcGVnX3NhdmVfbWFya2VycygmY2luZm8sIEpQRUdfTUFSS0VSX0lDQywgSlBFR19NQVJLRVJfTUFYU0laRSk7Ci0gICAgfQotICAgIGludCByZXQgPSBqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgVFJVRSk7Ci0gICAgaWYgKHJldCAhPSBKUEVHX0hFQURFUl9PSykgewotICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHdpZHRoID0gY2luZm8uaW1hZ2Vfd2lkdGg7Ci0gICAgaGVpZ2h0ID0gY2luZm8uaW1hZ2VfaGVpZ2h0OwotICAgIG51bV9jb21wb25lbnRzID0gY2luZm8ubnVtX2NvbXBvbmVudHM7Ci0gICAgY29sb3JfdHJhbnNmb3JtID0gY2luZm8uanBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IgfHwgY2luZm8uanBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSzsKLSAgICBiaXRzX3Blcl9jb21wb25lbnRzID0gY2luZm8uZGF0YV9wcmVjaXNpb247Ci0gICAgaWYoaWNjX2J1Zl9wdHIgIT0gTlVMTCkgewotICAgICAgICAqaWNjX2J1Zl9wdHIgPSBOVUxMOwotICAgIH0KLSAgICBpZihpY2NfbGVuZ3RoICE9IE5VTEwpIHsKLSAgICAgICAgKmljY19sZW5ndGggPSAwOwotICAgIH0KK3N0YXRpYyBGWF9CT09MIF9KcGVnTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogaWNjX2xlbmd0aCkgeworICBfSnBlZ1NjYW5TT0koc3JjX2J1Ziwgc3JjX3NpemUpOworICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisgIGplcnIuZXJyb3JfZXhpdCA9IF9lcnJvcl9mYXRhbDsKKyAgamVyci5lbWl0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzE7CisgIGplcnIub3V0cHV0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzsKKyAgamVyci5mb3JtYXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMjsKKyAgamVyci5yZXNldF9lcnJvcl9tZ3IgPSBfZXJyb3JfZG9fbm90aGluZzsKKyAgamVyci50cmFjZV9sZXZlbCA9IDA7CisgIGNpbmZvLmVyciA9ICZqZXJyOworICBqbXBfYnVmIG1hcms7CisgIGNpbmZvLmNsaWVudF9kYXRhID0gJm1hcms7CisgIGlmIChzZXRqbXAobWFyaykgPT0gLTEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmY2luZm8pOworICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHNyYzsKKyAgc3JjLmluaXRfc291cmNlID0gX3NyY19kb19ub3RoaW5nOworICBzcmMudGVybV9zb3VyY2UgPSBfc3JjX2RvX25vdGhpbmc7CisgIHNyYy5za2lwX2lucHV0X2RhdGEgPSBfc3JjX3NraXBfZGF0YTsKKyAgc3JjLmZpbGxfaW5wdXRfYnVmZmVyID0gX3NyY19maWxsX2J1ZmZlcjsKKyAgc3JjLnJlc3luY190b19yZXN0YXJ0ID0gX3NyY19yZXN5bmM7CisgIHNyYy5ieXRlc19pbl9idWZmZXIgPSBzcmNfc2l6ZTsKKyAgc3JjLm5leHRfaW5wdXRfYnl0ZSA9IHNyY19idWY7CisgIGNpbmZvLnNyYyA9ICZzcmM7CisgIGlmIChzZXRqbXAobWFyaykgPT0gLTEpIHsKICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoaWNjX2J1Zl9wdHIgJiYgaWNjX2xlbmd0aCkgeworICAgIGpwZWdfc2F2ZV9tYXJrZXJzKCZjaW5mbywgSlBFR19NQVJLRVJfSUNDLCBKUEVHX01BUktFUl9NQVhTSVpFKTsKKyAgfQorICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOworICBpZiAocmV0ICE9IEpQRUdfSEVBREVSX09LKSB7CisgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgd2lkdGggPSBjaW5mby5pbWFnZV93aWR0aDsKKyAgaGVpZ2h0ID0gY2luZm8uaW1hZ2VfaGVpZ2h0OworICBudW1fY29tcG9uZW50cyA9IGNpbmZvLm51bV9jb21wb25lbnRzOworICBjb2xvcl90cmFuc2Zvcm0gPQorICAgICAgY2luZm8uanBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IgfHwgY2luZm8uanBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSzsKKyAgYml0c19wZXJfY29tcG9uZW50cyA9IGNpbmZvLmRhdGFfcHJlY2lzaW9uOworICBpZiAoaWNjX2J1Zl9wdHIgIT0gTlVMTCkgeworICAgICppY2NfYnVmX3B0ciA9IE5VTEw7CisgIH0KKyAgaWYgKGljY19sZW5ndGggIT0gTlVMTCkgeworICAgICppY2NfbGVuZ3RoID0gMDsKKyAgfQorICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOworICByZXR1cm4gVFJVRTsKIH0KLWNsYXNzIENDb2RlY19KcGVnRGVjb2RlciA6IHB1YmxpYyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyCi17Ci1wdWJsaWM6Ci0gICAgQ0NvZGVjX0pwZWdEZWNvZGVyKCk7Ci0gICAgfkNDb2RlY19KcGVnRGVjb2RlcigpOwotICAgIEZYX0JPT0wJCQkJQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSwgSUZYX0pwZWdQcm92aWRlciogcEpQKTsKLSAgICB2aXJ0dWFsIHZvaWQJCURlc3Ryb3koKQotICAgIHsKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZAkJdl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X1Jld2luZCgpOwotICAgIHZpcnR1YWwgdWludDhfdCoJdl9HZXROZXh0TGluZSgpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3JjT2Zmc2V0KCk7Ci0gICAgam1wX2J1ZgkJbV9KbXBCdWY7Ci0gICAgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0gICAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7Ci0gICAgc3RydWN0IGpwZWdfc291cmNlX21nciBzcmM7Ci0gICAgY29uc3QgdWludDhfdCoJbV9TcmNCdWY7Ci0gICAgRlhfRFdPUkQJbV9TcmNTaXplOwotICAgIHVpbnQ4X3QqCW1fcFNjYW5saW5lQnVmOwotICAgIEZYX0JPT0wJCUluaXREZWNvZGUoKTsKLSAgICBGWF9CT09MCQltX2JJbml0ZWQsIG1fYlN0YXJ0ZWQsIG1fYkpwZWdUcmFuc2Zvcm07Ci1wcm90ZWN0ZWQ6Ci0gICAgSUZYX0pwZWdQcm92aWRlcioJbV9wRXh0UHJvdmlkZXI7Ci0gICAgdm9pZCoJCQkJbV9wRXh0Q29udGV4dDsKLSAgICBGWF9EV09SRAkJCW1fbkRlZmF1bHRTY2FsZURlbm9tOworY2xhc3MgQ0NvZGVjX0pwZWdEZWNvZGVyIDogcHVibGljIENDb2RlY19TY2FubGluZURlY29kZXIgeworIHB1YmxpYzoKKyAgQ0NvZGVjX0pwZWdEZWNvZGVyKCk7CisgIH5DQ29kZWNfSnBlZ0RlY29kZXIoKTsKKyAgRlhfQk9PTCBDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgaW50IG5Db21wcywKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgSUZYX0pwZWdQcm92aWRlciogcEpQKTsKKyAgdmlydHVhbCB2b2lkIERlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzOyB9CisgIHZpcnR1YWwgdm9pZCB2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KTsKKyAgdmlydHVhbCBGWF9CT09MIHZfUmV3aW5kKCk7CisgIHZpcnR1YWwgdWludDhfdCogdl9HZXROZXh0TGluZSgpOworICB2aXJ0dWFsIEZYX0RXT1JEIEdldFNyY09mZnNldCgpOworICBqbXBfYnVmIG1fSm1wQnVmOworICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3Igc3JjOworICBjb25zdCB1aW50OF90KiBtX1NyY0J1ZjsKKyAgRlhfRFdPUkQgbV9TcmNTaXplOworICB1aW50OF90KiBtX3BTY2FubGluZUJ1ZjsKKyAgRlhfQk9PTCBJbml0RGVjb2RlKCk7CisgIEZYX0JPT0wgbV9iSW5pdGVkLCBtX2JTdGFydGVkLCBtX2JKcGVnVHJhbnNmb3JtOworCisgcHJvdGVjdGVkOgorICBJRlhfSnBlZ1Byb3ZpZGVyKiBtX3BFeHRQcm92aWRlcjsKKyAgdm9pZCogbV9wRXh0Q29udGV4dDsKKyAgRlhfRFdPUkQgbV9uRGVmYXVsdFNjYWxlRGVub207CiB9OwotQ0NvZGVjX0pwZWdEZWNvZGVyOjpDQ29kZWNfSnBlZ0RlY29kZXIoKQotewotICAgIG1fcFNjYW5saW5lQnVmID0gTlVMTDsKLSAgICBtX0Rvd25TY2FsZSA9IDE7Ci0gICAgbV9iU3RhcnRlZCA9IEZBTFNFOworQ0NvZGVjX0pwZWdEZWNvZGVyOjpDQ29kZWNfSnBlZ0RlY29kZXIoKSB7CisgIG1fcFNjYW5saW5lQnVmID0gTlVMTDsKKyAgbV9Eb3duU2NhbGUgPSAxOworICBtX2JTdGFydGVkID0gRkFMU0U7CisgIG1fYkluaXRlZCA9IEZBTFNFOworICBtX3BFeHRQcm92aWRlciA9IE5VTEw7CisgIG1fcEV4dENvbnRleHQgPSBOVUxMOworICBGWFNZU19tZW1zZXQoJmNpbmZvLCAwLCBzaXplb2YoY2luZm8pKTsKKyAgRlhTWVNfbWVtc2V0KCZqZXJyLCAwLCBzaXplb2YoamVycikpOworICBGWFNZU19tZW1zZXQoJnNyYywgMCwgc2l6ZW9mKHNyYykpOworICBtX25EZWZhdWx0U2NhbGVEZW5vbSA9IDE7Cit9CitDQ29kZWNfSnBlZ0RlY29kZXI6On5DQ29kZWNfSnBlZ0RlY29kZXIoKSB7CisgIGlmIChtX3BFeHRQcm92aWRlcikgeworICAgIG1fcEV4dFByb3ZpZGVyLT5EZXN0cm95RGVjb2RlcihtX3BFeHRDb250ZXh0KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcFNjYW5saW5lQnVmKSB7CisgICAgRlhfRnJlZShtX3BTY2FubGluZUJ1Zik7CisgIH0KKyAgaWYgKG1fYkluaXRlZCkgeworICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7CisgIH0KK30KK0ZYX0JPT0wgQ0NvZGVjX0pwZWdEZWNvZGVyOjpJbml0RGVjb2RlKCkgeworICBjaW5mby5lcnIgPSAmamVycjsKKyAgY2luZm8uY2xpZW50X2RhdGEgPSAmbV9KbXBCdWY7CisgIGlmIChzZXRqbXAobV9KbXBCdWYpID09IC0xKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgbV9iSW5pdGVkID0gVFJVRTsKKyAgY2luZm8uc3JjID0gJnNyYzsKKyAgc3JjLmJ5dGVzX2luX2J1ZmZlciA9IG1fU3JjU2l6ZTsKKyAgc3JjLm5leHRfaW5wdXRfYnl0ZSA9IG1fU3JjQnVmOworICBpZiAoc2V0am1wKG1fSm1wQnVmKSA9PSAtMSkgeworICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7CiAgICAgbV9iSW5pdGVkID0gRkFMU0U7Ci0gICAgbV9wRXh0UHJvdmlkZXIgPSBOVUxMOwotICAgIG1fcEV4dENvbnRleHQgPSBOVUxMOwotICAgIEZYU1lTX21lbXNldCgmY2luZm8sIDAsIHNpemVvZihjaW5mbykpOwotICAgIEZYU1lTX21lbXNldCgmamVyciwgMCwgc2l6ZW9mKGplcnIpKTsKLSAgICBGWFNZU19tZW1zZXQoJnNyYywgMCwgc2l6ZW9mKHNyYykpOwotICAgIG1fbkRlZmF1bHRTY2FsZURlbm9tID0gMTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY2luZm8uaW1hZ2Vfd2lkdGggPSBtX09yaWdXaWR0aDsKKyAgY2luZm8uaW1hZ2VfaGVpZ2h0ID0gbV9PcmlnSGVpZ2h0OworICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOworICBpZiAocmV0ICE9IEpQRUdfSEVBREVSX09LKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChjaW5mby5zYXdfQWRvYmVfbWFya2VyKSB7CisgICAgbV9iSnBlZ1RyYW5zZm9ybSA9IFRSVUU7CisgIH0KKyAgaWYgKGNpbmZvLm51bV9jb21wb25lbnRzID09IDMgJiYgIW1fYkpwZWdUcmFuc2Zvcm0pIHsKKyAgICBjaW5mby5vdXRfY29sb3Jfc3BhY2UgPSBjaW5mby5qcGVnX2NvbG9yX3NwYWNlOworICB9CisgIG1fT3JpZ1dpZHRoID0gY2luZm8uaW1hZ2Vfd2lkdGg7CisgIG1fT3JpZ0hlaWdodCA9IGNpbmZvLmltYWdlX2hlaWdodDsKKyAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoOworICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodDsKKyAgbV9uRGVmYXVsdFNjYWxlRGVub20gPSBjaW5mby5zY2FsZV9kZW5vbTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1DQ29kZWNfSnBlZ0RlY29kZXI6On5DQ29kZWNfSnBlZ0RlY29kZXIoKQotewotICAgIGlmIChtX3BFeHRQcm92aWRlcikgewotICAgICAgICBtX3BFeHRQcm92aWRlci0+RGVzdHJveURlY29kZXIobV9wRXh0Q29udGV4dCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fcFNjYW5saW5lQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wU2NhbmxpbmVCdWYpOwotICAgIH0KLSAgICBpZiAobV9iSW5pdGVkKSB7Ci0gICAgICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgfQotfQotRlhfQk9PTCBDQ29kZWNfSnBlZ0RlY29kZXI6OkluaXREZWNvZGUoKQotewotICAgIGNpbmZvLmVyciA9ICZqZXJyOwotICAgIGNpbmZvLmNsaWVudF9kYXRhID0gJm1fSm1wQnVmOwotICAgIGlmIChzZXRqbXAobV9KbXBCdWYpID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmY2luZm8pOwotICAgIG1fYkluaXRlZCA9IFRSVUU7Ci0gICAgY2luZm8uc3JjID0gJnNyYzsKLSAgICBzcmMuYnl0ZXNfaW5fYnVmZmVyID0gbV9TcmNTaXplOwotICAgIHNyYy5uZXh0X2lucHV0X2J5dGUgPSBtX1NyY0J1ZjsKLSAgICBpZiAoc2V0am1wKG1fSm1wQnVmKSA9PSAtMSkgewotICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgICAgICBtX2JJbml0ZWQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBjaW5mby5pbWFnZV93aWR0aCA9IG1fT3JpZ1dpZHRoOwotICAgIGNpbmZvLmltYWdlX2hlaWdodCA9IG1fT3JpZ0hlaWdodDsKLSAgICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOwotICAgIGlmIChyZXQgIT0gSlBFR19IRUFERVJfT0spIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoY2luZm8uc2F3X0Fkb2JlX21hcmtlcikgewotICAgICAgICBtX2JKcGVnVHJhbnNmb3JtID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKGNpbmZvLm51bV9jb21wb25lbnRzID09IDMgJiYgIW1fYkpwZWdUcmFuc2Zvcm0pIHsKLSAgICAgICAgY2luZm8ub3V0X2NvbG9yX3NwYWNlID0gY2luZm8uanBlZ19jb2xvcl9zcGFjZTsKLSAgICB9Ci0gICAgbV9PcmlnV2lkdGggPSBjaW5mby5pbWFnZV93aWR0aDsKLSAgICBtX09yaWdIZWlnaHQgPSBjaW5mby5pbWFnZV9oZWlnaHQ7Ci0gICAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoOwotICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0OwotICAgIG1fbkRlZmF1bHRTY2FsZURlbm9tID0gY2luZm8uc2NhbGVfZGVub207Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENDb2RlY19KcGVnRGVjb2Rlcjo6Q3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0sIElGWF9KcGVnUHJvdmlkZXIqIHBKUCkKLXsKLSAgICBpZiAocEpQKSB7Ci0gICAgICAgIG1fcEV4dFByb3ZpZGVyID0gcEpQOwotICAgICAgICBtX3BFeHRDb250ZXh0ID0gbV9wRXh0UHJvdmlkZXItPkNyZWF0ZURlY29kZXIoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG5Db21wcywgQ29sb3JUcmFuc2Zvcm0pOwotICAgICAgICByZXR1cm4gbV9wRXh0Q29udGV4dCAhPSBOVUxMOwotICAgIH0KLSAgICBfSnBlZ1NjYW5TT0koc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgIG1fU3JjQnVmID0gc3JjX2J1ZjsKLSAgICBtX1NyY1NpemUgPSBzcmNfc2l6ZTsKLSAgICBqZXJyLmVycm9yX2V4aXQgPSBfZXJyb3JfZmF0YWw7Ci0gICAgamVyci5lbWl0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzE7Ci0gICAgamVyci5vdXRwdXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nOwotICAgIGplcnIuZm9ybWF0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzI7Ci0gICAgamVyci5yZXNldF9lcnJvcl9tZ3IgPSBfZXJyb3JfZG9fbm90aGluZzsKLSAgICBzcmMuaW5pdF9zb3VyY2UgPSBfc3JjX2RvX25vdGhpbmc7Ci0gICAgc3JjLnRlcm1fc291cmNlID0gX3NyY19kb19ub3RoaW5nOwotICAgIHNyYy5za2lwX2lucHV0X2RhdGEgPSBfc3JjX3NraXBfZGF0YTsKLSAgICBzcmMuZmlsbF9pbnB1dF9idWZmZXIgPSBfc3JjX2ZpbGxfYnVmZmVyOwotICAgIHNyYy5yZXN5bmNfdG9fcmVzdGFydCA9IF9zcmNfcmVzeW5jOwotICAgIG1fYkpwZWdUcmFuc2Zvcm0gPSBDb2xvclRyYW5zZm9ybTsKLSAgICBpZihzcmNfc2l6ZSA+IDEgJiYgRlhTWVNfbWVtY21wKHNyY19idWYgKyBzcmNfc2l6ZSAtIDIsICJceEZGXHhEOSIsIDIpICE9IDApIHsKLSAgICAgICAgKCh1aW50OF90KilzcmNfYnVmKVtzcmNfc2l6ZSAtIDJdID0gMHhGRjsKLSAgICAgICAgKCh1aW50OF90KilzcmNfYnVmKVtzcmNfc2l6ZSAtIDFdID0gMHhEOTsKLSAgICB9Ci0gICAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoID0gd2lkdGg7Ci0gICAgbV9PdXRwdXRIZWlnaHQgPSBtX09yaWdIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgaWYgKCFJbml0RGVjb2RlKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoY2luZm8ubnVtX2NvbXBvbmVudHMgPCBuQ29tcHMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoKGludCljaW5mby5pbWFnZV93aWR0aCA8IHdpZHRoKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9QaXRjaCA9IChjaW5mby5pbWFnZV93aWR0aCAqIGNpbmZvLm51bV9jb21wb25lbnRzICsgMykgLyA0ICogNDsKLSAgICBtX3BTY2FubGluZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOwotICAgIG1fbkNvbXBzID0gY2luZm8ubnVtX2NvbXBvbmVudHM7Ci0gICAgbV9icGMgPSA4OwotICAgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKLSAgICBtX2JTdGFydGVkID0gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENDb2RlY19KcGVnRGVjb2Rlcjo6Q3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9KcGVnUHJvdmlkZXIqIHBKUCkgeworICBpZiAocEpQKSB7CisgICAgbV9wRXh0UHJvdmlkZXIgPSBwSlA7CisgICAgbV9wRXh0Q29udGV4dCA9IG1fcEV4dFByb3ZpZGVyLT5DcmVhdGVEZWNvZGVyKAorICAgICAgICBzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgbkNvbXBzLCBDb2xvclRyYW5zZm9ybSk7CisgICAgcmV0dXJuIG1fcEV4dENvbnRleHQgIT0gTlVMTDsKKyAgfQorICBfSnBlZ1NjYW5TT0koc3JjX2J1Ziwgc3JjX3NpemUpOworICBtX1NyY0J1ZiA9IHNyY19idWY7CisgIG1fU3JjU2l6ZSA9IHNyY19zaXplOworICBqZXJyLmVycm9yX2V4aXQgPSBfZXJyb3JfZmF0YWw7CisgIGplcnIuZW1pdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcxOworICBqZXJyLm91dHB1dF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmc7CisgIGplcnIuZm9ybWF0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzI7CisgIGplcnIucmVzZXRfZXJyb3JfbWdyID0gX2Vycm9yX2RvX25vdGhpbmc7CisgIHNyYy5pbml0X3NvdXJjZSA9IF9zcmNfZG9fbm90aGluZzsKKyAgc3JjLnRlcm1fc291cmNlID0gX3NyY19kb19ub3RoaW5nOworICBzcmMuc2tpcF9pbnB1dF9kYXRhID0gX3NyY19za2lwX2RhdGE7CisgIHNyYy5maWxsX2lucHV0X2J1ZmZlciA9IF9zcmNfZmlsbF9idWZmZXI7CisgIHNyYy5yZXN5bmNfdG9fcmVzdGFydCA9IF9zcmNfcmVzeW5jOworICBtX2JKcGVnVHJhbnNmb3JtID0gQ29sb3JUcmFuc2Zvcm07CisgIGlmIChzcmNfc2l6ZSA+IDEgJiYKKyAgICAgIEZYU1lTX21lbWNtcChzcmNfYnVmICsgc3JjX3NpemUgLSAyLCAiXHhGRlx4RDkiLCAyKSAhPSAwKSB7CisgICAgKCh1aW50OF90KilzcmNfYnVmKVtzcmNfc2l6ZSAtIDJdID0gMHhGRjsKKyAgICAoKHVpbnQ4X3QqKXNyY19idWYpW3NyY19zaXplIC0gMV0gPSAweEQ5OworICB9CisgIG1fT3V0cHV0V2lkdGggPSBtX09yaWdXaWR0aCA9IHdpZHRoOworICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodCA9IGhlaWdodDsKKyAgaWYgKCFJbml0RGVjb2RlKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKGNpbmZvLm51bV9jb21wb25lbnRzIDwgbkNvbXBzKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICgoaW50KWNpbmZvLmltYWdlX3dpZHRoIDwgd2lkdGgpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9QaXRjaCA9IChjaW5mby5pbWFnZV93aWR0aCAqIGNpbmZvLm51bV9jb21wb25lbnRzICsgMykgLyA0ICogNDsKKyAgbV9wU2NhbmxpbmVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKKyAgbV9uQ29tcHMgPSBjaW5mby5udW1fY29tcG9uZW50czsKKyAgbV9icGMgPSA4OworICBtX2JDb2xvclRyYW5zZm9ybWVkID0gRkFMU0U7CisgIG1fYlN0YXJ0ZWQgPSBGQUxTRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiBleHRlcm4gIkMiIHsKLSAgICBpbnQzMl90IEZYX0dldERvd25zYW1wbGVSYXRpbyhpbnQzMl90IG9yaWdpbldpZHRoLCBpbnQzMl90IG9yaWdpbkhlaWdodCwgaW50MzJfdCBkb3duc2FtcGxlV2lkdGgsIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCkKLSAgICB7Ci0gICAgICAgIGludCBpcmF0aW9fdyA9IG9yaWdpbldpZHRoIC8gZG93bnNhbXBsZVdpZHRoOwotICAgICAgICBpbnQgaXJhdGlvX2ggPSBvcmlnaW5IZWlnaHQgLyBkb3duc2FtcGxlSGVpZ2h0OwotICAgICAgICBpbnQgcmF0aW8gPSAoaXJhdGlvX3cgPiBpcmF0aW9faCkgPyBpcmF0aW9faCA6IGlyYXRpb193OwotICAgICAgICBpZiAocmF0aW8gPj0gOCkgewotICAgICAgICAgICAgcmV0dXJuIDg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJhdGlvID49IDQpIHsKLSAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChyYXRpbyA+PSAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMTsKLSAgICB9CitpbnQzMl90IEZYX0dldERvd25zYW1wbGVSYXRpbyhpbnQzMl90IG9yaWdpbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvcmlnaW5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCkgeworICBpbnQgaXJhdGlvX3cgPSBvcmlnaW5XaWR0aCAvIGRvd25zYW1wbGVXaWR0aDsKKyAgaW50IGlyYXRpb19oID0gb3JpZ2luSGVpZ2h0IC8gZG93bnNhbXBsZUhlaWdodDsKKyAgaW50IHJhdGlvID0gKGlyYXRpb193ID4gaXJhdGlvX2gpID8gaXJhdGlvX2ggOiBpcmF0aW9fdzsKKyAgaWYgKHJhdGlvID49IDgpIHsKKyAgICByZXR1cm4gODsKKyAgfQorICBpZiAocmF0aW8gPj0gNCkgeworICAgIHJldHVybiA0OworICB9CisgIGlmIChyYXRpbyA+PSAyKSB7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgcmV0dXJuIDE7CiB9Ci12b2lkIENDb2RlY19KcGVnRGVjb2Rlcjo6dl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkKLXsKLSAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKLSAgICAgICAgbV9wRXh0UHJvdmlkZXItPkRvd25TY2FsZShtX3BFeHRDb250ZXh0LCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IG9sZF9zY2FsZSA9IG1fRG93blNjYWxlOwotICAgIG1fRG93blNjYWxlID0gRlhfR2V0RG93bnNhbXBsZVJhdGlvKG1fT3JpZ1dpZHRoLCBtX09yaWdIZWlnaHQsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKLSAgICBtX091dHB1dFdpZHRoID0gKG1fT3JpZ1dpZHRoICsgbV9Eb3duU2NhbGUgLSAxKSAvIG1fRG93blNjYWxlOwotICAgIG1fT3V0cHV0SGVpZ2h0ID0gKG1fT3JpZ0hlaWdodCArIG1fRG93blNjYWxlIC0gMSkgLyBtX0Rvd25TY2FsZTsKLSAgICBtX1BpdGNoID0gKG1fT3V0cHV0V2lkdGggKiBtX25Db21wcyArIDMpIC8gNCAqIDQ7Ci0gICAgaWYgKG9sZF9zY2FsZSAhPSBtX0Rvd25TY2FsZSkgewotICAgICAgICBtX05leHRMaW5lID0gLTE7Ci0gICAgfQogfQotRlhfQk9PTCBDQ29kZWNfSnBlZ0RlY29kZXI6OnZfUmV3aW5kKCkKLXsKLSAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKLSAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5SZXdpbmQobV9wRXh0Q29udGV4dCk7Ci0gICAgfQotICAgIGlmIChtX2JTdGFydGVkKSB7Ci0gICAgICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgICAgIGlmICghSW5pdERlY29kZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHNldGptcChtX0ptcEJ1ZikgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBjaW5mby5zY2FsZV9kZW5vbSA9IG1fbkRlZmF1bHRTY2FsZURlbm9tICogbV9Eb3duU2NhbGU7Ci0gICAgbV9PdXRwdXRXaWR0aCA9IChtX09yaWdXaWR0aCArIG1fRG93blNjYWxlIC0gMSkgLyBtX0Rvd25TY2FsZTsKLSAgICBtX091dHB1dEhlaWdodCA9IChtX09yaWdIZWlnaHQgKyBtX0Rvd25TY2FsZSAtIDEpIC8gbV9Eb3duU2NhbGU7Ci0gICAgaWYgKCFqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJmNpbmZvKSkgewotICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICgoaW50KWNpbmZvLm91dHB1dF93aWR0aCA+IG1fT3JpZ1dpZHRoKSB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9iU3RhcnRlZCA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7Cit2b2lkIENDb2RlY19KcGVnRGVjb2Rlcjo6dl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgeworICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKKyAgICBtX3BFeHRQcm92aWRlci0+RG93blNjYWxlKG1fcEV4dENvbnRleHQsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IG9sZF9zY2FsZSA9IG1fRG93blNjYWxlOworICBtX0Rvd25TY2FsZSA9CisgICAgICBGWF9HZXREb3duc2FtcGxlUmF0aW8obV9PcmlnV2lkdGgsIG1fT3JpZ0hlaWdodCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOworICBtX091dHB1dFdpZHRoID0gKG1fT3JpZ1dpZHRoICsgbV9Eb3duU2NhbGUgLSAxKSAvIG1fRG93blNjYWxlOworICBtX091dHB1dEhlaWdodCA9IChtX09yaWdIZWlnaHQgKyBtX0Rvd25TY2FsZSAtIDEpIC8gbV9Eb3duU2NhbGU7CisgIG1fUGl0Y2ggPSAobV9PdXRwdXRXaWR0aCAqIG1fbkNvbXBzICsgMykgLyA0ICogNDsKKyAgaWYgKG9sZF9zY2FsZSAhPSBtX0Rvd25TY2FsZSkgeworICAgIG1fTmV4dExpbmUgPSAtMTsKKyAgfQogfQotdWludDhfdCogQ0NvZGVjX0pwZWdEZWNvZGVyOjp2X0dldE5leHRMaW5lKCkKLXsKLSAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKLSAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5HZXROZXh0TGluZShtX3BFeHRDb250ZXh0KTsKK0ZYX0JPT0wgQ0NvZGVjX0pwZWdEZWNvZGVyOjp2X1Jld2luZCgpIHsKKyAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7CisgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5SZXdpbmQobV9wRXh0Q29udGV4dCk7CisgIH0KKyAgaWYgKG1fYlN0YXJ0ZWQpIHsKKyAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOworICAgIGlmICghSW5pdERlY29kZSgpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGludCBubGluZXMgPSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZjaW5mbywgJm1fcFNjYW5saW5lQnVmLCAxKTsKLSAgICBpZiAobmxpbmVzIDwgMSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcFNjYW5saW5lQnVmOworICB9CisgIGlmIChzZXRqbXAobV9KbXBCdWYpID09IC0xKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNpbmZvLnNjYWxlX2Rlbm9tID0gbV9uRGVmYXVsdFNjYWxlRGVub20gKiBtX0Rvd25TY2FsZTsKKyAgbV9PdXRwdXRXaWR0aCA9IChtX09yaWdXaWR0aCArIG1fRG93blNjYWxlIC0gMSkgLyBtX0Rvd25TY2FsZTsKKyAgbV9PdXRwdXRIZWlnaHQgPSAobV9PcmlnSGVpZ2h0ICsgbV9Eb3duU2NhbGUgLSAxKSAvIG1fRG93blNjYWxlOworICBpZiAoIWpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pKSB7CisgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKChpbnQpY2luZm8ub3V0cHV0X3dpZHRoID4gbV9PcmlnV2lkdGgpIHsKKyAgICBGWFNZU19hc3NlcnQoRkFMU0UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX2JTdGFydGVkID0gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9EV09SRCBDQ29kZWNfSnBlZ0RlY29kZXI6OkdldFNyY09mZnNldCgpCi17Ci0gICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7Ci0gICAgICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+R2V0U3JjT2Zmc2V0KG1fcEV4dENvbnRleHQpOwotICAgIH0KLSAgICByZXR1cm4gKEZYX0RXT1JEKShtX1NyY1NpemUgLSBzcmMuYnl0ZXNfaW5fYnVmZmVyKTsKK3VpbnQ4X3QqIENDb2RlY19KcGVnRGVjb2Rlcjo6dl9HZXROZXh0TGluZSgpIHsKKyAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7CisgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5HZXROZXh0TGluZShtX3BFeHRDb250ZXh0KTsKKyAgfQorICBpbnQgbmxpbmVzID0ganBlZ19yZWFkX3NjYW5saW5lcygmY2luZm8sICZtX3BTY2FubGluZUJ1ZiwgMSk7CisgIGlmIChubGluZXMgPCAxKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG1fcFNjYW5saW5lQnVmOwogfQotSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ0NvZGVjX0pwZWdNb2R1bGU6OkNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSkKLXsKLSAgICBpZiAoc3JjX2J1ZiA9PSBOVUxMIHx8IHNyY19zaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENDb2RlY19KcGVnRGVjb2RlciogcERlY29kZXIgPSBuZXcgQ0NvZGVjX0pwZWdEZWNvZGVyOwotICAgIGlmICghcERlY29kZXItPkNyZWF0ZShzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgbkNvbXBzLCBDb2xvclRyYW5zZm9ybSwgbV9wRXh0UHJvdmlkZXIpKSB7Ci0gICAgICAgIGRlbGV0ZSBwRGVjb2RlcjsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwRGVjb2RlcjsKK0ZYX0RXT1JEIENDb2RlY19KcGVnRGVjb2Rlcjo6R2V0U3JjT2Zmc2V0KCkgeworICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKKyAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPkdldFNyY09mZnNldChtX3BFeHRDb250ZXh0KTsKKyAgfQorICByZXR1cm4gKEZYX0RXT1JEKShtX1NyY1NpemUgLSBzcmMuYnl0ZXNfaW5fYnVmZmVyKTsKIH0KLUZYX0JPT0wgQ0NvZGVjX0pwZWdNb2R1bGU6OkxvYWRJbmZvKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyLCBGWF9EV09SRCogaWNjX2xlbmd0aCkKLXsKLSAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKLSAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5Mb2FkSW5mbyhzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY29tcG9uZW50cywgYml0c19wZXJfY29tcG9uZW50cywgY29sb3JfdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljY19idWZfcHRyLCBpY2NfbGVuZ3RoKTsKLSAgICB9Ci0gICAgcmV0dXJuIF9KcGVnTG9hZEluZm8oc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG51bV9jb21wb25lbnRzLCBiaXRzX3Blcl9jb21wb25lbnRzLCBjb2xvcl90cmFuc2Zvcm0sIGljY19idWZfcHRyLCBpY2NfbGVuZ3RoKTsKK0lDb2RlY19TY2FubGluZURlY29kZXIqIENDb2RlY19KcGVnTW9kdWxlOjpDcmVhdGVEZWNvZGVyKAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgaW50IHdpZHRoLAorICAgIGludCBoZWlnaHQsCisgICAgaW50IG5Db21wcywKKyAgICBGWF9CT09MIENvbG9yVHJhbnNmb3JtKSB7CisgIGlmIChzcmNfYnVmID09IE5VTEwgfHwgc3JjX3NpemUgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENDb2RlY19KcGVnRGVjb2RlciogcERlY29kZXIgPSBuZXcgQ0NvZGVjX0pwZWdEZWNvZGVyOworICBpZiAoIXBEZWNvZGVyLT5DcmVhdGUoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG5Db21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVHJhbnNmb3JtLCBtX3BFeHRQcm92aWRlcikpIHsKKyAgICBkZWxldGUgcERlY29kZXI7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHBEZWNvZGVyOwogfQotRlhfQk9PTCBDQ29kZWNfSnBlZ01vZHVsZTo6RW5jb2RlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfU1RSU0laRSYgZGVzdF9zaXplLCBpbnQgcXVhbGl0eSwgY29uc3QgdWludDhfdCogaWNjX2J1ZiwgRlhfRFdPUkQgaWNjX2xlbmd0aCkKLXsKLSAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKLSAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5FbmNvZGUocFNvdXJjZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSwgcXVhbGl0eSwgaWNjX2J1ZiwgaWNjX2xlbmd0aCk7Ci0gICAgfQotICAgIGlmKHBTb3VyY2UtPkdldEJQUCgpIDwgOCB8fCBwU291cmNlLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgewotICAgICAgICBBU1NFUlQocFNvdXJjZS0+R2V0QlBQKCkgPj0gOCAmJiBwU291cmNlLT5HZXRQYWxldHRlKCkgPT0gTlVMTCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgX0pwZWdFbmNvZGUocFNvdXJjZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSwgcXVhbGl0eSwgaWNjX2J1ZiwgaWNjX2xlbmd0aCk7Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENDb2RlY19KcGVnTW9kdWxlOjpMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGljY19sZW5ndGgpIHsKKyAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7CisgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5Mb2FkSW5mbyhzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb21wb25lbnRzLCBiaXRzX3Blcl9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfdHJhbnNmb3JtLCBpY2NfYnVmX3B0ciwgaWNjX2xlbmd0aCk7CisgIH0KKyAgcmV0dXJuIF9KcGVnTG9hZEluZm8oc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG51bV9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBiaXRzX3Blcl9jb21wb25lbnRzLCBjb2xvcl90cmFuc2Zvcm0sIGljY19idWZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBpY2NfbGVuZ3RoKTsKK30KK0ZYX0JPT0wgQ0NvZGVjX0pwZWdNb2R1bGU6OkVuY29kZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFJiBkZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogaWNjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBpY2NfbGVuZ3RoKSB7CisgIGlmIChtX3BFeHRQcm92aWRlcikgeworICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+RW5jb2RlKHBTb3VyY2UsIGRlc3RfYnVmLCBkZXN0X3NpemUsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2J1ZiwgaWNjX2xlbmd0aCk7CisgIH0KKyAgaWYgKHBTb3VyY2UtPkdldEJQUCgpIDwgOCB8fCBwU291cmNlLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgeworICAgIEFTU0VSVChwU291cmNlLT5HZXRCUFAoKSA+PSA4ICYmIHBTb3VyY2UtPkdldFBhbGV0dGUoKSA9PSBOVUxMKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgX0pwZWdFbmNvZGUocFNvdXJjZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSwgcXVhbGl0eSwgaWNjX2J1ZiwgaWNjX2xlbmd0aCk7CisgIHJldHVybiBUUlVFOwogfQogc3RydWN0IEZYSlBFR19Db250ZXh0IHsKLSAgICBqbXBfYnVmCQkJbV9KdW1wTWFyazsKLSAgICBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IG1fSW5mbzsKLSAgICBqcGVnX2Vycm9yX21ncgltX0Vyck1ncjsKLSAgICBqcGVnX3NvdXJjZV9tZ3IJbV9TcmNNZ3I7Ci0gICAgdW5zaWduZWQgaW50CW1fU2tpcFNpemU7Ci0gICAgdm9pZCoJCSgqbV9BbGxvY0Z1bmMpKHVuc2lnbmVkIGludCk7Ci0gICAgdm9pZAkJKCptX0ZyZWVGdW5jKSh2b2lkKik7CisgIGptcF9idWYgbV9KdW1wTWFyazsKKyAganBlZ19kZWNvbXByZXNzX3N0cnVjdCBtX0luZm87CisgIGpwZWdfZXJyb3JfbWdyIG1fRXJyTWdyOworICBqcGVnX3NvdXJjZV9tZ3IgbV9TcmNNZ3I7CisgIHVuc2lnbmVkIGludCBtX1NraXBTaXplOworICB2b2lkKiAoKm1fQWxsb2NGdW5jKSh1bnNpZ25lZCBpbnQpOworICB2b2lkICgqbV9GcmVlRnVuYykodm9pZCopOwogfTsKIGV4dGVybiAiQyIgewotICAgIHN0YXRpYyB2b2lkIF9lcnJvcl9mYXRhbDEoal9jb21tb25fcHRyIGNpbmZvKQotICAgIHsKLSAgICAgICAgbG9uZ2ptcCgoKEZYSlBFR19Db250ZXh0KiljaW5mby0+Y2xpZW50X2RhdGEpLT5tX0p1bXBNYXJrLCAtMSk7Ci0gICAgfQorc3RhdGljIHZvaWQgX2Vycm9yX2ZhdGFsMShqX2NvbW1vbl9wdHIgY2luZm8pIHsKKyAgbG9uZ2ptcCgoKEZYSlBFR19Db250ZXh0KiljaW5mby0+Y2xpZW50X2RhdGEpLT5tX0p1bXBNYXJrLCAtMSk7Cit9CiB9OwogZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIHZvaWQgX3NyY19za2lwX2RhdGExKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbywgbG9uZyBudW0pCi0gICAgewotICAgICAgICBpZiAoY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyIDwgKHNpemVfdCludW0pIHsKLSAgICAgICAgICAgICgoRlhKUEVHX0NvbnRleHQqKWNpbmZvLT5jbGllbnRfZGF0YSktPm1fU2tpcFNpemUgPSAodW5zaWduZWQgaW50KShudW0gLSBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXIpOwotICAgICAgICAgICAgY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSArPSBudW07Ci0gICAgICAgICAgICBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXIgLT0gbnVtOwotICAgICAgICB9Ci0gICAgfQorc3RhdGljIHZvaWQgX3NyY19za2lwX2RhdGExKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbywgbG9uZyBudW0pIHsKKyAgaWYgKGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciA8IChzaXplX3QpbnVtKSB7CisgICAgKChGWEpQRUdfQ29udGV4dCopY2luZm8tPmNsaWVudF9kYXRhKS0+bV9Ta2lwU2l6ZSA9CisgICAgICAgICh1bnNpZ25lZCBpbnQpKG51bSAtIGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcik7CisgICAgY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyID0gMDsKKyAgfSBlbHNlIHsKKyAgICBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGUgKz0gbnVtOworICAgIGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciAtPSBudW07CisgIH0KK30KIH07Ci1zdGF0aWMgdm9pZCoganBlZ19hbGxvY19mdW5jKHVuc2lnbmVkIGludCBzaXplKQotewotICAgIHJldHVybiBGWF9BbGxvYyhjaGFyLCBzaXplKTsKK3N0YXRpYyB2b2lkKiBqcGVnX2FsbG9jX2Z1bmModW5zaWduZWQgaW50IHNpemUpIHsKKyAgcmV0dXJuIEZYX0FsbG9jKGNoYXIsIHNpemUpOwogfQotc3RhdGljIHZvaWQganBlZ19mcmVlX2Z1bmModm9pZCogcCkKLXsKLSAgICBGWF9GcmVlKHApOworc3RhdGljIHZvaWQganBlZ19mcmVlX2Z1bmModm9pZCogcCkgeworICBGWF9GcmVlKHApOwogfQotdm9pZCogQ0NvZGVjX0pwZWdNb2R1bGU6OlN0YXJ0KCkKLXsKLSAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKLSAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5TdGFydCgpOwotICAgIH0KLSAgICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEZYSlBFR19Db250ZXh0KSk7Ci0gICAgcC0+bV9BbGxvY0Z1bmMgPSBqcGVnX2FsbG9jX2Z1bmM7Ci0gICAgcC0+bV9GcmVlRnVuYyA9IGpwZWdfZnJlZV9mdW5jOwotICAgIHAtPm1fRXJyTWdyLmVycm9yX2V4aXQgPSBfZXJyb3JfZmF0YWwxOwotICAgIHAtPm1fRXJyTWdyLmVtaXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMTsKLSAgICBwLT5tX0Vyck1nci5vdXRwdXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nOwotICAgIHAtPm1fRXJyTWdyLmZvcm1hdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcyOwotICAgIHAtPm1fRXJyTWdyLnJlc2V0X2Vycm9yX21nciA9IF9lcnJvcl9kb19ub3RoaW5nOwotICAgIHAtPm1fU3JjTWdyLmluaXRfc291cmNlID0gX3NyY19kb19ub3RoaW5nOwotICAgIHAtPm1fU3JjTWdyLnRlcm1fc291cmNlID0gX3NyY19kb19ub3RoaW5nOwotICAgIHAtPm1fU3JjTWdyLnNraXBfaW5wdXRfZGF0YSA9IF9zcmNfc2tpcF9kYXRhMTsKLSAgICBwLT5tX1NyY01nci5maWxsX2lucHV0X2J1ZmZlciA9IF9zcmNfZmlsbF9idWZmZXI7Ci0gICAgcC0+bV9TcmNNZ3IucmVzeW5jX3RvX3Jlc3RhcnQgPSBfc3JjX3Jlc3luYzsKLSAgICBwLT5tX0luZm8uY2xpZW50X2RhdGEgPSBwOwotICAgIHAtPm1fSW5mby5lcnIgPSAmcC0+bV9FcnJNZ3I7Ci0gICAgaWYgKHNldGptcChwLT5tX0p1bXBNYXJrKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmcC0+bV9JbmZvKTsKLSAgICBwLT5tX0luZm8uc3JjID0gJnAtPm1fU3JjTWdyOwotICAgIHAtPm1fU2tpcFNpemUgPSAwOwotICAgIHJldHVybiBwOwotfQotdm9pZCBDQ29kZWNfSnBlZ01vZHVsZTo6RmluaXNoKHZvaWQqIHBDb250ZXh0KQotewotICAgIGlmIChtX3BFeHRQcm92aWRlcikgewotICAgICAgICBtX3BFeHRQcm92aWRlci0+RmluaXNoKHBDb250ZXh0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopcENvbnRleHQ7Ci0gICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJnAtPm1fSW5mbyk7Ci0gICAgcC0+bV9GcmVlRnVuYyhwKTsKLX0KLXZvaWQgQ0NvZGVjX0pwZWdNb2R1bGU6OklucHV0KHZvaWQqIHBDb250ZXh0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkKLXsKLSAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKLSAgICAgICAgbV9wRXh0UHJvdmlkZXItPklucHV0KHBDb250ZXh0LCBzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhKUEVHX0NvbnRleHQqIHAgPSAoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0OwotICAgIGlmIChwLT5tX1NraXBTaXplKSB7Ci0gICAgICAgIGlmIChwLT5tX1NraXBTaXplID4gc3JjX3NpemUpIHsKLSAgICAgICAgICAgIHAtPm1fU3JjTWdyLmJ5dGVzX2luX2J1ZmZlciA9IDA7Ci0gICAgICAgICAgICBwLT5tX1NraXBTaXplIC09IHNyY19zaXplOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNyY19zaXplIC09IHAtPm1fU2tpcFNpemU7Ci0gICAgICAgIHNyY19idWYgKz0gcC0+bV9Ta2lwU2l6ZTsKLSAgICAgICAgcC0+bV9Ta2lwU2l6ZSA9IDA7Ci0gICAgfQotICAgIHAtPm1fU3JjTWdyLm5leHRfaW5wdXRfYnl0ZSA9IHNyY19idWY7Ci0gICAgcC0+bV9TcmNNZ3IuYnl0ZXNfaW5fYnVmZmVyID0gc3JjX3NpemU7Ci19Ci1pbnQgQ0NvZGVjX0pwZWdNb2R1bGU6OlJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsIGludCogd2lkdGgsIGludCogaGVpZ2h0LCBpbnQqIG5Db21wcywgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkKLXsKLSAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKLSAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5SZWFkSGVhZGVyKHBDb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCBuQ29tcHMsIHBBdHRyaWJ1dGUpOwotICAgIH0KLSAgICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgaWYgKHNldGptcChwLT5tX0p1bXBNYXJrKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaW50IHJldCA9IGpwZWdfcmVhZF9oZWFkZXIoJnAtPm1fSW5mbywgdHJ1ZSk7Ci0gICAgaWYgKHJldCA9PSBKUEVHX1NVU1BFTkRFRCkgewotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgaWYgKHJldCAhPSBKUEVHX0hFQURFUl9PSykgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgKndpZHRoID0gcC0+bV9JbmZvLmltYWdlX3dpZHRoOwotICAgICpoZWlnaHQgPSBwLT5tX0luZm8uaW1hZ2VfaGVpZ2h0OwotICAgICpuQ29tcHMgPSBwLT5tX0luZm8ubnVtX2NvbXBvbmVudHM7Ci0gICAgX0pwZWdMb2FkQXR0cmlidXRlKCZwLT5tX0luZm8sIHBBdHRyaWJ1dGUpOwordm9pZCogQ0NvZGVjX0pwZWdNb2R1bGU6OlN0YXJ0KCkgeworICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKKyAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPlN0YXJ0KCk7CisgIH0KKyAgRlhKUEVHX0NvbnRleHQqIHAgPQorICAgICAgKEZYSlBFR19Db250ZXh0KilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoRlhKUEVHX0NvbnRleHQpKTsKKyAgcC0+bV9BbGxvY0Z1bmMgPSBqcGVnX2FsbG9jX2Z1bmM7CisgIHAtPm1fRnJlZUZ1bmMgPSBqcGVnX2ZyZWVfZnVuYzsKKyAgcC0+bV9FcnJNZ3IuZXJyb3JfZXhpdCA9IF9lcnJvcl9mYXRhbDE7CisgIHAtPm1fRXJyTWdyLmVtaXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMTsKKyAgcC0+bV9FcnJNZ3Iub3V0cHV0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzsKKyAgcC0+bV9FcnJNZ3IuZm9ybWF0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzI7CisgIHAtPm1fRXJyTWdyLnJlc2V0X2Vycm9yX21nciA9IF9lcnJvcl9kb19ub3RoaW5nOworICBwLT5tX1NyY01nci5pbml0X3NvdXJjZSA9IF9zcmNfZG9fbm90aGluZzsKKyAgcC0+bV9TcmNNZ3IudGVybV9zb3VyY2UgPSBfc3JjX2RvX25vdGhpbmc7CisgIHAtPm1fU3JjTWdyLnNraXBfaW5wdXRfZGF0YSA9IF9zcmNfc2tpcF9kYXRhMTsKKyAgcC0+bV9TcmNNZ3IuZmlsbF9pbnB1dF9idWZmZXIgPSBfc3JjX2ZpbGxfYnVmZmVyOworICBwLT5tX1NyY01nci5yZXN5bmNfdG9fcmVzdGFydCA9IF9zcmNfcmVzeW5jOworICBwLT5tX0luZm8uY2xpZW50X2RhdGEgPSBwOworICBwLT5tX0luZm8uZXJyID0gJnAtPm1fRXJyTWdyOworICBpZiAoc2V0am1wKHAtPm1fSnVtcE1hcmspID09IC0xKSB7CiAgICAgcmV0dXJuIDA7CisgIH0KKyAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmcC0+bV9JbmZvKTsKKyAgcC0+bV9JbmZvLnNyYyA9ICZwLT5tX1NyY01ncjsKKyAgcC0+bV9Ta2lwU2l6ZSA9IDA7CisgIHJldHVybiBwOwogfQotaW50IENDb2RlY19KcGVnTW9kdWxlOjpTdGFydFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCBpbnQgZG93bl9zY2FsZSkKLXsKLSAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKLSAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5TdGFydFNjYW5saW5lKHBDb250ZXh0LCBkb3duX3NjYWxlKTsKLSAgICB9Ci0gICAgRlhKUEVHX0NvbnRleHQqIHAgPSAoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0OwotICAgIGlmIChzZXRqbXAocC0+bV9KdW1wTWFyaykgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHAtPm1fSW5mby5zY2FsZV9kZW5vbSA9IGRvd25fc2NhbGU7Ci0gICAgcmV0dXJuIGpwZWdfc3RhcnRfZGVjb21wcmVzcygmcC0+bV9JbmZvKTsKK3ZvaWQgQ0NvZGVjX0pwZWdNb2R1bGU6OkZpbmlzaCh2b2lkKiBwQ29udGV4dCkgeworICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKKyAgICBtX3BFeHRQcm92aWRlci0+RmluaXNoKHBDb250ZXh0KTsKKyAgICByZXR1cm47CisgIH0KKyAgRlhKUEVHX0NvbnRleHQqIHAgPSAoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0OworICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmcC0+bV9JbmZvKTsKKyAgcC0+bV9GcmVlRnVuYyhwKTsKIH0KLUZYX0JPT0wgQ0NvZGVjX0pwZWdNb2R1bGU6OlJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgdW5zaWduZWQgY2hhciogZGVzdF9idWYpCi17Ci0gICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7Ci0gICAgICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+UmVhZFNjYW5saW5lKHBDb250ZXh0LCBkZXN0X2J1Zik7Cit2b2lkIENDb2RlY19KcGVnTW9kdWxlOjpJbnB1dCh2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSkgeworICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKKyAgICBtX3BFeHRQcm92aWRlci0+SW5wdXQocENvbnRleHQsIHNyY19idWYsIHNyY19zaXplKTsKKyAgICByZXR1cm47CisgIH0KKyAgRlhKUEVHX0NvbnRleHQqIHAgPSAoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0OworICBpZiAocC0+bV9Ta2lwU2l6ZSkgeworICAgIGlmIChwLT5tX1NraXBTaXplID4gc3JjX3NpemUpIHsKKyAgICAgIHAtPm1fU3JjTWdyLmJ5dGVzX2luX2J1ZmZlciA9IDA7CisgICAgICBwLT5tX1NraXBTaXplIC09IHNyY19zaXplOworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgaWYgKHNldGptcChwLT5tX0p1bXBNYXJrKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBubGluZXMgPSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZwLT5tX0luZm8sICZkZXN0X2J1ZiwgMSk7Ci0gICAgcmV0dXJuIG5saW5lcyA9PSAxOworICAgIHNyY19zaXplIC09IHAtPm1fU2tpcFNpemU7CisgICAgc3JjX2J1ZiArPSBwLT5tX1NraXBTaXplOworICAgIHAtPm1fU2tpcFNpemUgPSAwOworICB9CisgIHAtPm1fU3JjTWdyLm5leHRfaW5wdXRfYnl0ZSA9IHNyY19idWY7CisgIHAtPm1fU3JjTWdyLmJ5dGVzX2luX2J1ZmZlciA9IHNyY19zaXplOwogfQotRlhfRFdPUkQgQ0NvZGVjX0pwZWdNb2R1bGU6OkdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyKQotewotICAgIGlmIChtX3BFeHRQcm92aWRlcikgewotICAgICAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPkdldEF2YWlsSW5wdXQocENvbnRleHQsIGF2YWlsX2J1Zl9wdHIpOworaW50IENDb2RlY19KcGVnTW9kdWxlOjpSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgeworICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKKyAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPlJlYWRIZWFkZXIocENvbnRleHQsIHdpZHRoLCBoZWlnaHQsIG5Db21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF0dHJpYnV0ZSk7CisgIH0KKyAgRlhKUEVHX0NvbnRleHQqIHAgPSAoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0OworICBpZiAoc2V0am1wKHAtPm1fSnVtcE1hcmspID09IC0xKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaW50IHJldCA9IGpwZWdfcmVhZF9oZWFkZXIoJnAtPm1fSW5mbywgdHJ1ZSk7CisgIGlmIChyZXQgPT0gSlBFR19TVVNQRU5ERUQpIHsKKyAgICByZXR1cm4gMjsKKyAgfQorICBpZiAocmV0ICE9IEpQRUdfSEVBREVSX09LKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgKndpZHRoID0gcC0+bV9JbmZvLmltYWdlX3dpZHRoOworICAqaGVpZ2h0ID0gcC0+bV9JbmZvLmltYWdlX2hlaWdodDsKKyAgKm5Db21wcyA9IHAtPm1fSW5mby5udW1fY29tcG9uZW50czsKKyAgX0pwZWdMb2FkQXR0cmlidXRlKCZwLT5tX0luZm8sIHBBdHRyaWJ1dGUpOworICByZXR1cm4gMDsKK30KK2ludCBDQ29kZWNfSnBlZ01vZHVsZTo6U3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpIHsKKyAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7CisgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5TdGFydFNjYW5saW5lKHBDb250ZXh0LCBkb3duX3NjYWxlKTsKKyAgfQorICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopcENvbnRleHQ7CisgIGlmIChzZXRqbXAocC0+bV9KdW1wTWFyaykgPT0gLTEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwLT5tX0luZm8uc2NhbGVfZGVub20gPSBkb3duX3NjYWxlOworICByZXR1cm4ganBlZ19zdGFydF9kZWNvbXByZXNzKCZwLT5tX0luZm8pOworfQorRlhfQk9PTCBDQ29kZWNfSnBlZ01vZHVsZTo6UmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGRlc3RfYnVmKSB7CisgIGlmIChtX3BFeHRQcm92aWRlcikgeworICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+UmVhZFNjYW5saW5lKHBDb250ZXh0LCBkZXN0X2J1Zik7CisgIH0KKyAgRlhKUEVHX0NvbnRleHQqIHAgPSAoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0OworICBpZiAoc2V0am1wKHAtPm1fSnVtcE1hcmspID09IC0xKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBubGluZXMgPSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZwLT5tX0luZm8sICZkZXN0X2J1ZiwgMSk7CisgIHJldHVybiBubGluZXMgPT0gMTsKK30KK0ZYX0RXT1JEIENDb2RlY19KcGVnTW9kdWxlOjpHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIpIHsKKyAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7CisgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5HZXRBdmFpbElucHV0KHBDb250ZXh0LCBhdmFpbF9idWZfcHRyKTsKKyAgfQorICBpZiAoYXZhaWxfYnVmX3B0ciAhPSBOVUxMKSB7CisgICAgKmF2YWlsX2J1Zl9wdHIgPSBOVUxMOworICAgIGlmICgoKEZYSlBFR19Db250ZXh0KilwQ29udGV4dCktPm1fU3JjTWdyLmJ5dGVzX2luX2J1ZmZlciA+IDApIHsKKyAgICAgICphdmFpbF9idWZfcHRyID0KKyAgICAgICAgICAodWludDhfdCopKChGWEpQRUdfQ29udGV4dCopcENvbnRleHQpLT5tX1NyY01nci5uZXh0X2lucHV0X2J5dGU7CiAgICAgfQotICAgIGlmKGF2YWlsX2J1Zl9wdHIgIT0gTlVMTCkgewotICAgICAgICAqYXZhaWxfYnVmX3B0ciA9IE5VTEw7Ci0gICAgICAgIGlmKCgoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0KS0+bV9TcmNNZ3IuYnl0ZXNfaW5fYnVmZmVyID4gMCkgewotICAgICAgICAgICAgKmF2YWlsX2J1Zl9wdHIgPSAodWludDhfdCopKChGWEpQRUdfQ29udGV4dCopcENvbnRleHQpLT5tX1NyY01nci5uZXh0X2lucHV0X2J5dGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChGWF9EV09SRCkoKEZYSlBFR19Db250ZXh0KilwQ29udGV4dCktPm1fU3JjTWdyLmJ5dGVzX2luX2J1ZmZlcjsKKyAgfQorICByZXR1cm4gKEZYX0RXT1JEKSgoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0KS0+bV9TcmNNZ3IuYnl0ZXNfaW5fYnVmZmVyOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfb3BqLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X29wai5jcHAKaW5kZXggMmQzOTViMC4uZTFiOWQyNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfb3BqLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF9vcGouY3BwCkBAIC0xMiw3OTUgKzEyLDg0MSBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgogI2luY2x1ZGUgImNvZGVjX2ludC5oIgogCi1zdGF0aWMgdm9pZCBmeF9lcnJvcl9jYWxsYmFjayhjb25zdCBjaGFyICptc2csIHZvaWQgKmNsaWVudF9kYXRhKQotewotICAgICh2b2lkKWNsaWVudF9kYXRhOworc3RhdGljIHZvaWQgZnhfZXJyb3JfY2FsbGJhY2soY29uc3QgY2hhciogbXNnLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAodm9pZCljbGllbnRfZGF0YTsKIH0KLXN0YXRpYyB2b2lkIGZ4X3dhcm5pbmdfY2FsbGJhY2soY29uc3QgY2hhciAqbXNnLCB2b2lkICpjbGllbnRfZGF0YSkKLXsKLSAgICAodm9pZCljbGllbnRfZGF0YTsKK3N0YXRpYyB2b2lkIGZ4X3dhcm5pbmdfY2FsbGJhY2soY29uc3QgY2hhciogbXNnLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAodm9pZCljbGllbnRfZGF0YTsKIH0KLXN0YXRpYyB2b2lkIGZ4X2luZm9fY2FsbGJhY2soY29uc3QgY2hhciAqbXNnLCB2b2lkICpjbGllbnRfZGF0YSkKLXsKLSAgICAodm9pZCljbGllbnRfZGF0YTsKK3N0YXRpYyB2b2lkIGZ4X2luZm9fY2FsbGJhY2soY29uc3QgY2hhciogbXNnLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAodm9pZCljbGllbnRfZGF0YTsKIH0KLU9QSl9TSVpFX1Qgb3BqX3JlYWRfZnJvbV9tZW1vcnkodm9pZCogcF9idWZmZXIsIE9QSl9TSVpFX1QgbmJfYnl0ZXMsIHZvaWQqIHBfdXNlcl9kYXRhKQotewotICAgIERlY29kZURhdGEqIHNyY0RhdGEgPSBzdGF0aWNfY2FzdDxEZWNvZGVEYXRhKj4ocF91c2VyX2RhdGEpOwotICAgIGlmICghc3JjRGF0YSB8fCAhc3JjRGF0YS0+c3JjX2RhdGEgfHwgc3JjRGF0YS0+c3JjX3NpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIC8vIFJlYWRzIGF0IEVPRiByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICBpZiAoc3JjRGF0YS0+b2Zmc2V0ID49IHNyY0RhdGEtPnNyY19zaXplKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgT1BKX1NJWkVfVCBidWZmZXJMZW5ndGggPSBzcmNEYXRhLT5zcmNfc2l6ZSAtIHNyY0RhdGEtPm9mZnNldDsKLSAgICBPUEpfU0laRV9UIHJlYWRsZW5ndGggPSBuYl9ieXRlcyA8IGJ1ZmZlckxlbmd0aCA/IG5iX2J5dGVzIDogYnVmZmVyTGVuZ3RoOwotICAgIG1lbWNweShwX2J1ZmZlciwgJnNyY0RhdGEtPnNyY19kYXRhW3NyY0RhdGEtPm9mZnNldF0sIHJlYWRsZW5ndGgpOwotICAgIHNyY0RhdGEtPm9mZnNldCArPSByZWFkbGVuZ3RoOwotICAgIHJldHVybiByZWFkbGVuZ3RoOworT1BKX1NJWkVfVCBvcGpfcmVhZF9mcm9tX21lbW9yeSh2b2lkKiBwX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCBuYl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF91c2VyX2RhdGEpIHsKKyAgRGVjb2RlRGF0YSogc3JjRGF0YSA9IHN0YXRpY19jYXN0PERlY29kZURhdGEqPihwX3VzZXJfZGF0YSk7CisgIGlmICghc3JjRGF0YSB8fCAhc3JjRGF0YS0+c3JjX2RhdGEgfHwgc3JjRGF0YS0+c3JjX3NpemUgPT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBSZWFkcyBhdCBFT0YgcmV0dXJuIGFuIGVycm9yIGNvZGUuCisgIGlmIChzcmNEYXRhLT5vZmZzZXQgPj0gc3JjRGF0YS0+c3JjX3NpemUpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgT1BKX1NJWkVfVCBidWZmZXJMZW5ndGggPSBzcmNEYXRhLT5zcmNfc2l6ZSAtIHNyY0RhdGEtPm9mZnNldDsKKyAgT1BKX1NJWkVfVCByZWFkbGVuZ3RoID0gbmJfYnl0ZXMgPCBidWZmZXJMZW5ndGggPyBuYl9ieXRlcyA6IGJ1ZmZlckxlbmd0aDsKKyAgbWVtY3B5KHBfYnVmZmVyLCAmc3JjRGF0YS0+c3JjX2RhdGFbc3JjRGF0YS0+b2Zmc2V0XSwgcmVhZGxlbmd0aCk7CisgIHNyY0RhdGEtPm9mZnNldCArPSByZWFkbGVuZ3RoOworICByZXR1cm4gcmVhZGxlbmd0aDsKIH0KLU9QSl9TSVpFX1Qgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KHZvaWQqIHBfYnVmZmVyLCBPUEpfU0laRV9UIG5iX2J5dGVzLCB2b2lkKiBwX3VzZXJfZGF0YSkKLXsKLSAgICBEZWNvZGVEYXRhKiBzcmNEYXRhID0gc3RhdGljX2Nhc3Q8RGVjb2RlRGF0YSo+KHBfdXNlcl9kYXRhKTsKLSAgICBpZiAoIXNyY0RhdGEgfHwgIXNyY0RhdGEtPnNyY19kYXRhIHx8IHNyY0RhdGEtPnNyY19zaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAvLyBXcml0ZXMgYXQgRU9GIHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgIGlmIChzcmNEYXRhLT5vZmZzZXQgPj0gc3JjRGF0YS0+c3JjX3NpemUpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBPUEpfU0laRV9UIGJ1ZmZlckxlbmd0aCA9IHNyY0RhdGEtPnNyY19zaXplIC0gc3JjRGF0YS0+b2Zmc2V0OwotICAgIE9QSl9TSVpFX1Qgd3JpdGVMZW5ndGggPSBuYl9ieXRlcyA8IGJ1ZmZlckxlbmd0aCA/IG5iX2J5dGVzIDogYnVmZmVyTGVuZ3RoOwotICAgIG1lbWNweSgmc3JjRGF0YS0+c3JjX2RhdGFbc3JjRGF0YS0+b2Zmc2V0XSwgcF9idWZmZXIsIHdyaXRlTGVuZ3RoKTsKLSAgICBzcmNEYXRhLT5vZmZzZXQgKz0gd3JpdGVMZW5ndGg7Ci0gICAgcmV0dXJuIHdyaXRlTGVuZ3RoOworT1BKX1NJWkVfVCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkodm9pZCogcF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfU0laRV9UIG5iX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF91c2VyX2RhdGEpIHsKKyAgRGVjb2RlRGF0YSogc3JjRGF0YSA9IHN0YXRpY19jYXN0PERlY29kZURhdGEqPihwX3VzZXJfZGF0YSk7CisgIGlmICghc3JjRGF0YSB8fCAhc3JjRGF0YS0+c3JjX2RhdGEgfHwgc3JjRGF0YS0+c3JjX3NpemUgPT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBXcml0ZXMgYXQgRU9GIHJldHVybiBhbiBlcnJvciBjb2RlLgorICBpZiAoc3JjRGF0YS0+b2Zmc2V0ID49IHNyY0RhdGEtPnNyY19zaXplKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIE9QSl9TSVpFX1QgYnVmZmVyTGVuZ3RoID0gc3JjRGF0YS0+c3JjX3NpemUgLSBzcmNEYXRhLT5vZmZzZXQ7CisgIE9QSl9TSVpFX1Qgd3JpdGVMZW5ndGggPSBuYl9ieXRlcyA8IGJ1ZmZlckxlbmd0aCA/IG5iX2J5dGVzIDogYnVmZmVyTGVuZ3RoOworICBtZW1jcHkoJnNyY0RhdGEtPnNyY19kYXRhW3NyY0RhdGEtPm9mZnNldF0sIHBfYnVmZmVyLCB3cml0ZUxlbmd0aCk7CisgIHNyY0RhdGEtPm9mZnNldCArPSB3cml0ZUxlbmd0aDsKKyAgcmV0dXJuIHdyaXRlTGVuZ3RoOwogfQotT1BKX09GRl9UIG9wal9za2lwX2Zyb21fbWVtb3J5KE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpCi17Ci0gICAgRGVjb2RlRGF0YSogc3JjRGF0YSA9IHN0YXRpY19jYXN0PERlY29kZURhdGEqPihwX3VzZXJfZGF0YSk7Ci0gICAgaWYgKCFzcmNEYXRhIHx8ICFzcmNEYXRhLT5zcmNfZGF0YSB8fCBzcmNEYXRhLT5zcmNfc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgLy8gT2Zmc2V0cyBhcmUgc2lnbmVkIGFuZCBtYXkgaW5kaWNhdGUgYSBuZWdhdGl2ZSBza2lwLiBEbyBub3Qgc3VwcG9ydCB0aGlzCi0gICAgLy8gYmVjYXVzZSBvZiB0aGUgc3RyYW5nZSByZXR1cm4gY29udmVudGlvbiB3aGVyZSBlaXRoZXIgYnl0ZXMgc2tpcHBlZCBvcgotICAgIC8vIC0xIGlzIHJldHVybmVkLiBGb2xsb3dpbmcgdGhhdCBjb252ZW50aW9uLCBhIHN1Y2Nlc3NmdWwgcmVsYXRpdmUgc2VlayBvZgotICAgIC8vIC0xIGJ5dGVzIHdvdWxkIGJlIHJlcXVpcmVkIHRvIHRvIGdpdmUgdGhlIHNhbWUgcmVzdWx0IGFzIHRoZSBlcnJvciBjYXNlLgotICAgIGlmIChuYl9ieXRlcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAvLyBGSVhNRTogdXNlIHN0ZDo6bWFrZV91bnNpZ25lZDxPUEpfT0ZGX1Q+Ojp0eXBlIG9uY2UgYysrMTEgbGliIGlzIE9LJ2QuCi0gICAgdWludDY0X3QgdW5zaWduZWROYkJ5dGVzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5iX2J5dGVzKTsKLSAgICAvLyBBZGRpdGlvbmFsbHksIHRoZSBvZmZzZXQgbWF5IHRha2UgdXMgYmV5b25kIHRoZSByYW5nZSBvZiBhIHNpemVfdCAoZS5nLgotICAgIC8vIDMyLWJpdCBwbGF0Zm9ybXMpLiBJZiBzbywganVzdCBjbGFtcCBhdCBFT0YuCi0gICAgaWYgKHVuc2lnbmVkTmJCeXRlcyA+IHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX1NJWkVfVD46Om1heCgpIC0gc3JjRGF0YS0+b2Zmc2V0KSB7Ci0gICAgICAgIHNyY0RhdGEtPm9mZnNldCA9IHNyY0RhdGEtPnNyY19zaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE9QSl9TSVpFX1QgY2hlY2tlZE5iQnl0ZXMgPSBzdGF0aWNfY2FzdDxPUEpfU0laRV9UPih1bnNpZ25lZE5iQnl0ZXMpOwotICAgICAgICAvLyBPdGhlcndpc2UsIG1pbWljIGZzZWVrKCkgc2VtYW50aWNzIHRvIGFsd2F5cyBzdWNjZWVkLCBldmVuIHBhc3QgRU9GLAotICAgICAgICAvLyBjbGFtcGluZyBhdCBFT0YuICBXZSBjYW4gZ2V0IGF3YXkgd2l0aCB0aGlzIHNpbmNlIHdlIGRvbid0IGFjdHVhbGx5Ci0gICAgICAgIC8vIHByb3ZpZGUgbmVnYXRpdmUgcmVsYXRpdmUgc2tpcHMgZnJvbSBiZXlvbmQgRU9GIGJhY2sgdG8gaW5zaWRlIHRoZQotICAgICAgICAvLyBkYXRhLCB3aGljaCB3b3VsZCBiZSB0aGUgb25seSByZWFzb24gdG8gbmVlZCB0byBrbm93IGV4YWN0bHkgaG93IGZhcgotICAgICAgICAvLyBiZXlvbmQgRU9GIHdlIGFyZS4KLSAgICAgICAgc3JjRGF0YS0+b2Zmc2V0ID0gc3RkOjptaW4oc3JjRGF0YS0+b2Zmc2V0ICsgY2hlY2tlZE5iQnl0ZXMsIHNyY0RhdGEtPnNyY19zaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5iX2J5dGVzOworT1BKX09GRl9UIG9wal9za2lwX2Zyb21fbWVtb3J5KE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpIHsKKyAgRGVjb2RlRGF0YSogc3JjRGF0YSA9IHN0YXRpY19jYXN0PERlY29kZURhdGEqPihwX3VzZXJfZGF0YSk7CisgIGlmICghc3JjRGF0YSB8fCAhc3JjRGF0YS0+c3JjX2RhdGEgfHwgc3JjRGF0YS0+c3JjX3NpemUgPT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBPZmZzZXRzIGFyZSBzaWduZWQgYW5kIG1heSBpbmRpY2F0ZSBhIG5lZ2F0aXZlIHNraXAuIERvIG5vdCBzdXBwb3J0IHRoaXMKKyAgLy8gYmVjYXVzZSBvZiB0aGUgc3RyYW5nZSByZXR1cm4gY29udmVudGlvbiB3aGVyZSBlaXRoZXIgYnl0ZXMgc2tpcHBlZCBvcgorICAvLyAtMSBpcyByZXR1cm5lZC4gRm9sbG93aW5nIHRoYXQgY29udmVudGlvbiwgYSBzdWNjZXNzZnVsIHJlbGF0aXZlIHNlZWsgb2YKKyAgLy8gLTEgYnl0ZXMgd291bGQgYmUgcmVxdWlyZWQgdG8gdG8gZ2l2ZSB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIGVycm9yIGNhc2UuCisgIGlmIChuYl9ieXRlcyA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLy8gRklYTUU6IHVzZSBzdGQ6Om1ha2VfdW5zaWduZWQ8T1BKX09GRl9UPjo6dHlwZSBvbmNlIGMrKzExIGxpYiBpcyBPSydkLgorICB1aW50NjRfdCB1bnNpZ25lZE5iQnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmJfYnl0ZXMpOworICAvLyBBZGRpdGlvbmFsbHksIHRoZSBvZmZzZXQgbWF5IHRha2UgdXMgYmV5b25kIHRoZSByYW5nZSBvZiBhIHNpemVfdCAoZS5nLgorICAvLyAzMi1iaXQgcGxhdGZvcm1zKS4gSWYgc28sIGp1c3QgY2xhbXAgYXQgRU9GLgorICBpZiAodW5zaWduZWROYkJ5dGVzID4KKyAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX1NJWkVfVD46Om1heCgpIC0gc3JjRGF0YS0+b2Zmc2V0KSB7CisgICAgc3JjRGF0YS0+b2Zmc2V0ID0gc3JjRGF0YS0+c3JjX3NpemU7CisgIH0gZWxzZSB7CisgICAgT1BKX1NJWkVfVCBjaGVja2VkTmJCeXRlcyA9IHN0YXRpY19jYXN0PE9QSl9TSVpFX1Q+KHVuc2lnbmVkTmJCeXRlcyk7CisgICAgLy8gT3RoZXJ3aXNlLCBtaW1pYyBmc2VlaygpIHNlbWFudGljcyB0byBhbHdheXMgc3VjY2VlZCwgZXZlbiBwYXN0IEVPRiwKKyAgICAvLyBjbGFtcGluZyBhdCBFT0YuICBXZSBjYW4gZ2V0IGF3YXkgd2l0aCB0aGlzIHNpbmNlIHdlIGRvbid0IGFjdHVhbGx5CisgICAgLy8gcHJvdmlkZSBuZWdhdGl2ZSByZWxhdGl2ZSBza2lwcyBmcm9tIGJleW9uZCBFT0YgYmFjayB0byBpbnNpZGUgdGhlCisgICAgLy8gZGF0YSwgd2hpY2ggd291bGQgYmUgdGhlIG9ubHkgcmVhc29uIHRvIG5lZWQgdG8ga25vdyBleGFjdGx5IGhvdyBmYXIKKyAgICAvLyBiZXlvbmQgRU9GIHdlIGFyZS4KKyAgICBzcmNEYXRhLT5vZmZzZXQgPQorICAgICAgICBzdGQ6Om1pbihzcmNEYXRhLT5vZmZzZXQgKyBjaGVja2VkTmJCeXRlcywgc3JjRGF0YS0+c3JjX3NpemUpOworICB9CisgIHJldHVybiBuYl9ieXRlczsKIH0KLU9QSl9CT09MIG9wal9zZWVrX2Zyb21fbWVtb3J5KE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpCi17Ci0gICAgRGVjb2RlRGF0YSogc3JjRGF0YSA9IHN0YXRpY19jYXN0PERlY29kZURhdGEqPihwX3VzZXJfZGF0YSk7Ci0gICAgaWYgKCFzcmNEYXRhIHx8ICFzcmNEYXRhLT5zcmNfZGF0YSB8fCBzcmNEYXRhLT5zcmNfc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgfQotICAgIC8vIE9mZnNldHMgYXJlIHNpZ25lZCBhbmQgbWF5IGluZGljYXRlIGEgbmVnYXRpdmUgcG9zaXRpb24sIHdoaWNoIHdvdWxkCi0gICAgLy8gYmUgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gRG8gbm90IHN1cHBvcnQgdGhpcy4KLSAgICBpZiAobmJfYnl0ZXMgPCAwKSB7Ci0gICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgfQotICAgIC8vIEZJWE1FOiB1c2Ugc3RkOjptYWtlX3Vuc2lnbmVkPE9QSl9PRkZfVD46OnR5cGUgb25jZSBjKysxMSBsaWIgaXMgT0snZC4KLSAgICB1aW50NjRfdCB1bnNpZ25lZE5iQnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmJfYnl0ZXMpOwotICAgIC8vIEFkZGl0aW9uYWxseSwgdGhlIG9mZnNldCBtYXkgdGFrZSB1cyBiZXlvbmQgdGhlIHJhbmdlIG9mIGEgc2l6ZV90IChlLmcuCi0gICAgLy8gMzItYml0IHBsYXRmb3JtcykuIElmIHNvLCBqdXN0IGNsYW1wIGF0IEVPRi4KLSAgICBpZiAodW5zaWduZWROYkJ5dGVzID4gc3RkOjpudW1lcmljX2xpbWl0czxPUEpfU0laRV9UPjo6bWF4KCkpIHsKLSAgICAgICAgc3JjRGF0YS0+b2Zmc2V0ID0gc3JjRGF0YS0+c3JjX3NpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgT1BKX1NJWkVfVCBjaGVja2VkTmJCeXRlcyA9IHN0YXRpY19jYXN0PE9QSl9TSVpFX1Q+KG5iX2J5dGVzKTsKLSAgICAgICAgLy8gT3RoZXJ3aXNlLCBtaW1pYyBmc2VlaygpIHNlbWFudGljcyB0byBhbHdheXMgc3VjY2VlZCwgZXZlbiBwYXN0IEVPRiwKLSAgICAgICAgLy8gYWdhaW4gY2xhbXBpbmcgYXQgRU9GLgotICAgICAgICBzcmNEYXRhLT5vZmZzZXQgPSBzdGQ6Om1pbihjaGVja2VkTmJCeXRlcywgc3JjRGF0YS0+c3JjX3NpemUpOwotICAgIH0KLSAgICByZXR1cm4gT1BKX1RSVUU7CitPUEpfQk9PTCBvcGpfc2Vla19mcm9tX21lbW9yeShPUEpfT0ZGX1QgbmJfYnl0ZXMsIHZvaWQqIHBfdXNlcl9kYXRhKSB7CisgIERlY29kZURhdGEqIHNyY0RhdGEgPSBzdGF0aWNfY2FzdDxEZWNvZGVEYXRhKj4ocF91c2VyX2RhdGEpOworICBpZiAoIXNyY0RhdGEgfHwgIXNyY0RhdGEtPnNyY19kYXRhIHx8IHNyY0RhdGEtPnNyY19zaXplID09IDApIHsKKyAgICByZXR1cm4gT1BKX0ZBTFNFOworICB9CisgIC8vIE9mZnNldHMgYXJlIHNpZ25lZCBhbmQgbWF5IGluZGljYXRlIGEgbmVnYXRpdmUgcG9zaXRpb24sIHdoaWNoIHdvdWxkCisgIC8vIGJlIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuIERvIG5vdCBzdXBwb3J0IHRoaXMuCisgIGlmIChuYl9ieXRlcyA8IDApIHsKKyAgICByZXR1cm4gT1BKX0ZBTFNFOworICB9CisgIC8vIEZJWE1FOiB1c2Ugc3RkOjptYWtlX3Vuc2lnbmVkPE9QSl9PRkZfVD46OnR5cGUgb25jZSBjKysxMSBsaWIgaXMgT0snZC4KKyAgdWludDY0X3QgdW5zaWduZWROYkJ5dGVzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5iX2J5dGVzKTsKKyAgLy8gQWRkaXRpb25hbGx5LCB0aGUgb2Zmc2V0IG1heSB0YWtlIHVzIGJleW9uZCB0aGUgcmFuZ2Ugb2YgYSBzaXplX3QgKGUuZy4KKyAgLy8gMzItYml0IHBsYXRmb3JtcykuIElmIHNvLCBqdXN0IGNsYW1wIGF0IEVPRi4KKyAgaWYgKHVuc2lnbmVkTmJCeXRlcyA+IHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX1NJWkVfVD46Om1heCgpKSB7CisgICAgc3JjRGF0YS0+b2Zmc2V0ID0gc3JjRGF0YS0+c3JjX3NpemU7CisgIH0gZWxzZSB7CisgICAgT1BKX1NJWkVfVCBjaGVja2VkTmJCeXRlcyA9IHN0YXRpY19jYXN0PE9QSl9TSVpFX1Q+KG5iX2J5dGVzKTsKKyAgICAvLyBPdGhlcndpc2UsIG1pbWljIGZzZWVrKCkgc2VtYW50aWNzIHRvIGFsd2F5cyBzdWNjZWVkLCBldmVuIHBhc3QgRU9GLAorICAgIC8vIGFnYWluIGNsYW1waW5nIGF0IEVPRi4KKyAgICBzcmNEYXRhLT5vZmZzZXQgPSBzdGQ6Om1pbihjaGVja2VkTmJCeXRlcywgc3JjRGF0YS0+c3JjX3NpemUpOworICB9CisgIHJldHVybiBPUEpfVFJVRTsKIH0KLW9wal9zdHJlYW1fdCogZnhfb3BqX3N0cmVhbV9jcmVhdGVfbWVtb3J5X3N0cmVhbSAoRGVjb2RlRGF0YSogZGF0YSwJT1BKX1NJWkVfVCBwX3NpemUsIAlPUEpfQk9PTCBwX2lzX3JlYWRfc3RyZWFtKQotewotICAgIG9wal9zdHJlYW1fdCogbF9zdHJlYW0gPSAwMDsKLSAgICBpZiAoIWRhdGEgfHwgISBkYXRhLT5zcmNfZGF0YSB8fCBkYXRhLT5zcmNfc2l6ZSA8PSAwICkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbF9zdHJlYW0gPSBvcGpfc3RyZWFtX2NyZWF0ZShwX3NpemUsIHBfaXNfcmVhZF9zdHJlYW0pOwotICAgIGlmICghIGxfc3RyZWFtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGEobF9zdHJlYW0sIGRhdGEsIE5VTEwpOwotICAgIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YV9sZW5ndGgobF9zdHJlYW0sIGRhdGEtPnNyY19zaXplKTsKLSAgICBvcGpfc3RyZWFtX3NldF9yZWFkX2Z1bmN0aW9uKGxfc3RyZWFtLCBvcGpfcmVhZF9mcm9tX21lbW9yeSk7Ci0gICAgb3BqX3N0cmVhbV9zZXRfd3JpdGVfZnVuY3Rpb24obF9zdHJlYW0sIG9wal93cml0ZV9mcm9tX21lbW9yeSk7Ci0gICAgb3BqX3N0cmVhbV9zZXRfc2tpcF9mdW5jdGlvbihsX3N0cmVhbSwgb3BqX3NraXBfZnJvbV9tZW1vcnkpOwotICAgIG9wal9zdHJlYW1fc2V0X3NlZWtfZnVuY3Rpb24obF9zdHJlYW0sIG9wal9zZWVrX2Zyb21fbWVtb3J5KTsKLSAgICByZXR1cm4gbF9zdHJlYW07CitvcGpfc3RyZWFtX3QqIGZ4X29wal9zdHJlYW1fY3JlYXRlX21lbW9yeV9zdHJlYW0oRGVjb2RlRGF0YSogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfU0laRV9UIHBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCBwX2lzX3JlYWRfc3RyZWFtKSB7CisgIG9wal9zdHJlYW1fdCogbF9zdHJlYW0gPSAwMDsKKyAgaWYgKCFkYXRhIHx8ICFkYXRhLT5zcmNfZGF0YSB8fCBkYXRhLT5zcmNfc2l6ZSA8PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgbF9zdHJlYW0gPSBvcGpfc3RyZWFtX2NyZWF0ZShwX3NpemUsIHBfaXNfcmVhZF9zdHJlYW0pOworICBpZiAoIWxfc3RyZWFtKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhKGxfc3RyZWFtLCBkYXRhLCBOVUxMKTsKKyAgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhX2xlbmd0aChsX3N0cmVhbSwgZGF0YS0+c3JjX3NpemUpOworICBvcGpfc3RyZWFtX3NldF9yZWFkX2Z1bmN0aW9uKGxfc3RyZWFtLCBvcGpfcmVhZF9mcm9tX21lbW9yeSk7CisgIG9wal9zdHJlYW1fc2V0X3dyaXRlX2Z1bmN0aW9uKGxfc3RyZWFtLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkpOworICBvcGpfc3RyZWFtX3NldF9za2lwX2Z1bmN0aW9uKGxfc3RyZWFtLCBvcGpfc2tpcF9mcm9tX21lbW9yeSk7CisgIG9wal9zdHJlYW1fc2V0X3NlZWtfZnVuY3Rpb24obF9zdHJlYW0sIG9wal9zZWVrX2Zyb21fbWVtb3J5KTsKKyAgcmV0dXJuIGxfc3RyZWFtOwogfQotc3RhdGljIHZvaWQgc3ljY190b19yZ2IoaW50IG9mZnNldCwgaW50IHVwYiwgaW50IHksIGludCBjYiwgaW50IGNyLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpvdXRfciwgaW50ICpvdXRfZywgaW50ICpvdXRfYikKLXsKLSAgICBpbnQgciwgZywgYjsKLSAgICBjYiAtPSBvZmZzZXQ7Ci0gICAgY3IgLT0gb2Zmc2V0OwotICAgIHIgPSB5ICsgKGludCkoMS40MDIgKiAoZmxvYXQpY3IpOwotICAgIGlmKHIgPCAwKSB7Ci0gICAgICAgIHIgPSAwOwotICAgIH0gZWxzZSBpZihyID4gdXBiKSB7Ci0gICAgICAgIHIgPSB1cGI7Ci0gICAgfSAqb3V0X3IgPSByOwotICAgIGcgPSB5IC0gKGludCkoMC4zNDQgKiAoZmxvYXQpY2IgKyAwLjcxNCAqIChmbG9hdCljcik7Ci0gICAgaWYoZyA8IDApIHsKLSAgICAgICAgZyA9IDA7Ci0gICAgfSBlbHNlIGlmKGcgPiB1cGIpIHsKLSAgICAgICAgZyA9IHVwYjsKLSAgICB9ICpvdXRfZyA9IGc7Ci0gICAgYiA9IHkgKyAoaW50KSgxLjc3MiAqIChmbG9hdCljYik7Ci0gICAgaWYoYiA8IDApIHsKLSAgICAgICAgYiA9IDA7Ci0gICAgfSBlbHNlIGlmKGIgPiB1cGIpIHsKLSAgICAgICAgYiA9IHVwYjsKLSAgICB9ICpvdXRfYiA9IGI7CitzdGF0aWMgdm9pZCBzeWNjX3RvX3JnYihpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRfciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0X2csCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dF9iKSB7CisgIGludCByLCBnLCBiOworICBjYiAtPSBvZmZzZXQ7CisgIGNyIC09IG9mZnNldDsKKyAgciA9IHkgKyAoaW50KSgxLjQwMiAqIChmbG9hdCljcik7CisgIGlmIChyIDwgMCkgeworICAgIHIgPSAwOworICB9IGVsc2UgaWYgKHIgPiB1cGIpIHsKKyAgICByID0gdXBiOworICB9CisgICpvdXRfciA9IHI7CisgIGcgPSB5IC0gKGludCkoMC4zNDQgKiAoZmxvYXQpY2IgKyAwLjcxNCAqIChmbG9hdCljcik7CisgIGlmIChnIDwgMCkgeworICAgIGcgPSAwOworICB9IGVsc2UgaWYgKGcgPiB1cGIpIHsKKyAgICBnID0gdXBiOworICB9CisgICpvdXRfZyA9IGc7CisgIGIgPSB5ICsgKGludCkoMS43NzIgKiAoZmxvYXQpY2IpOworICBpZiAoYiA8IDApIHsKKyAgICBiID0gMDsKKyAgfSBlbHNlIGlmIChiID4gdXBiKSB7CisgICAgYiA9IHVwYjsKKyAgfQorICAqb3V0X2IgPSBiOwogfQotc3RhdGljIHZvaWQgc3ljYzQ0NF90b19yZ2Iob3BqX2ltYWdlX3QgKmltZykKLXsKLSAgICBpbnQgKmQwLCAqZDEsICpkMiwgKnIsICpnLCAqYjsKLSAgICBjb25zdCBpbnQgKnksICpjYiwgKmNyOwotICAgIGludCBtYXh3LCBtYXhoLCBtYXgsIGksIG9mZnNldCwgdXBiOwotICAgIGkgPSAoaW50KWltZy0+Y29tcHNbMF0ucHJlYzsKLSAgICBvZmZzZXQgPSAxIDw8IChpIC0gMSk7Ci0gICAgdXBiID0gKDEgPDwgaSkgLSAxOwotICAgIG1heHcgPSAoaW50KWltZy0+Y29tcHNbMF0udzsKLSAgICBtYXhoID0gKGludClpbWctPmNvbXBzWzBdLmg7Ci0gICAgbWF4ID0gbWF4dyAqIG1heGg7Ci0gICAgeSA9IGltZy0+Y29tcHNbMF0uZGF0YTsKLSAgICBjYiA9IGltZy0+Y29tcHNbMV0uZGF0YTsKLSAgICBjciA9IGltZy0+Y29tcHNbMl0uZGF0YTsKLSAgICBkMCA9IHIgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKLSAgICBkMSA9IGcgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKLSAgICBkMiA9IGIgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKLSAgICBmb3IoaSA9IDA7IGkgPCBtYXg7ICsraSkgewotICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKLSAgICAgICAgKyt5OwotICAgICAgICArK2NiOwotICAgICAgICArK2NyOwotICAgICAgICArK3I7Ci0gICAgICAgICsrZzsKLSAgICAgICAgKytiOwotICAgIH0KLSAgICBGWF9GcmVlKGltZy0+Y29tcHNbMF0uZGF0YSk7Ci0gICAgaW1nLT5jb21wc1swXS5kYXRhID0gZDA7Ci0gICAgRlhfRnJlZShpbWctPmNvbXBzWzFdLmRhdGEpOwotICAgIGltZy0+Y29tcHNbMV0uZGF0YSA9IGQxOwotICAgIEZYX0ZyZWUoaW1nLT5jb21wc1syXS5kYXRhKTsKLSAgICBpbWctPmNvbXBzWzJdLmRhdGEgPSBkMjsKK3N0YXRpYyB2b2lkIHN5Y2M0NDRfdG9fcmdiKG9wal9pbWFnZV90KiBpbWcpIHsKKyAgaW50ICpkMCwgKmQxLCAqZDIsICpyLCAqZywgKmI7CisgIGNvbnN0IGludCAqeSwgKmNiLCAqY3I7CisgIGludCBtYXh3LCBtYXhoLCBtYXgsIGksIG9mZnNldCwgdXBiOworICBpID0gKGludClpbWctPmNvbXBzWzBdLnByZWM7CisgIG9mZnNldCA9IDEgPDwgKGkgLSAxKTsKKyAgdXBiID0gKDEgPDwgaSkgLSAxOworICBtYXh3ID0gKGludClpbWctPmNvbXBzWzBdLnc7CisgIG1heGggPSAoaW50KWltZy0+Y29tcHNbMF0uaDsKKyAgbWF4ID0gbWF4dyAqIG1heGg7CisgIHkgPSBpbWctPmNvbXBzWzBdLmRhdGE7CisgIGNiID0gaW1nLT5jb21wc1sxXS5kYXRhOworICBjciA9IGltZy0+Y29tcHNbMl0uZGF0YTsKKyAgZDAgPSByID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7CisgIGQxID0gZyA9IEZYX0FsbG9jKGludCwgKHNpemVfdCltYXgpOworICBkMiA9IGIgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKKyAgZm9yIChpID0gMDsgaSA8IG1heDsgKytpKSB7CisgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7CisgICAgKyt5OworICAgICsrY2I7CisgICAgKytjcjsKKyAgICArK3I7CisgICAgKytnOworICAgICsrYjsKKyAgfQorICBGWF9GcmVlKGltZy0+Y29tcHNbMF0uZGF0YSk7CisgIGltZy0+Y29tcHNbMF0uZGF0YSA9IGQwOworICBGWF9GcmVlKGltZy0+Y29tcHNbMV0uZGF0YSk7CisgIGltZy0+Y29tcHNbMV0uZGF0YSA9IGQxOworICBGWF9GcmVlKGltZy0+Y29tcHNbMl0uZGF0YSk7CisgIGltZy0+Y29tcHNbMl0uZGF0YSA9IGQyOwogfQotc3RhdGljIHZvaWQgc3ljYzQyMl90b19yZ2Iob3BqX2ltYWdlX3QgKmltZykKLXsKLSAgICBpbnQgKmQwLCAqZDEsICpkMiwgKnIsICpnLCAqYjsKLSAgICBjb25zdCBpbnQgKnksICpjYiwgKmNyOwotICAgIGludCBtYXh3LCBtYXhoLCBtYXgsIG9mZnNldCwgdXBiOwotICAgIGludCBpLCBqOwotICAgIGkgPSAoaW50KWltZy0+Y29tcHNbMF0ucHJlYzsKLSAgICBvZmZzZXQgPSAxIDw8IChpIC0gMSk7Ci0gICAgdXBiID0gKDEgPDwgaSkgLSAxOwotICAgIG1heHcgPSAoaW50KWltZy0+Y29tcHNbMF0udzsKLSAgICBtYXhoID0gKGludClpbWctPmNvbXBzWzBdLmg7Ci0gICAgbWF4ID0gbWF4dyAqIG1heGg7Ci0gICAgeSA9IGltZy0+Y29tcHNbMF0uZGF0YTsKLSAgICBjYiA9IGltZy0+Y29tcHNbMV0uZGF0YTsKLSAgICBjciA9IGltZy0+Y29tcHNbMl0uZGF0YTsKLSAgICBkMCA9IHIgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKLSAgICBkMSA9IGcgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKLSAgICBkMiA9IGIgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKLSAgICBmb3IoaSA9IDA7IGkgPCBtYXhoOyArK2kpCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyAoT1BKX1VJTlQzMilqIDwgKG1heHcgJiB+KE9QSl9VSU5UMzIpMSk7IGogKz0gMikKLSAgICAgICAgewotICAgICAgICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7Ci0gICAgICAgICAgICArK3k7ICsrcjsgKytnOyArK2I7Ci0gICAgICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKLSAgICAgICAgICAgICsreTsgKytyOyArK2c7ICsrYjsgKytjYjsgKytjcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaiA8IG1heHcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSwgKmNiLCAqY3IsIHIsIGcsIGIpOwotICAgICAgICAgICAgKyt5OyArK3I7ICsrZzsgKytiOyArK2NiOyArK2NyOwotICAgICAgICB9CitzdGF0aWMgdm9pZCBzeWNjNDIyX3RvX3JnYihvcGpfaW1hZ2VfdCogaW1nKSB7CisgIGludCAqZDAsICpkMSwgKmQyLCAqciwgKmcsICpiOworICBjb25zdCBpbnQgKnksICpjYiwgKmNyOworICBpbnQgbWF4dywgbWF4aCwgbWF4LCBvZmZzZXQsIHVwYjsKKyAgaW50IGksIGo7CisgIGkgPSAoaW50KWltZy0+Y29tcHNbMF0ucHJlYzsKKyAgb2Zmc2V0ID0gMSA8PCAoaSAtIDEpOworICB1cGIgPSAoMSA8PCBpKSAtIDE7CisgIG1heHcgPSAoaW50KWltZy0+Y29tcHNbMF0udzsKKyAgbWF4aCA9IChpbnQpaW1nLT5jb21wc1swXS5oOworICBtYXggPSBtYXh3ICogbWF4aDsKKyAgeSA9IGltZy0+Y29tcHNbMF0uZGF0YTsKKyAgY2IgPSBpbWctPmNvbXBzWzFdLmRhdGE7CisgIGNyID0gaW1nLT5jb21wc1syXS5kYXRhOworICBkMCA9IHIgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKKyAgZDEgPSBnID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7CisgIGQyID0gYiA9IEZYX0FsbG9jKGludCwgKHNpemVfdCltYXgpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4aDsgKytpKSB7CisgICAgZm9yIChqID0gMDsgKE9QSl9VSU5UMzIpaiA8IChtYXh3ICYgfihPUEpfVUlOVDMyKTEpOyBqICs9IDIpIHsKKyAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSwgKmNiLCAqY3IsIHIsIGcsIGIpOworICAgICAgKyt5OworICAgICAgKytyOworICAgICAgKytnOworICAgICAgKytiOworICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7CisgICAgICArK3k7CisgICAgICArK3I7CisgICAgICArK2c7CisgICAgICArK2I7CisgICAgICArK2NiOworICAgICAgKytjcjsKICAgICB9Ci0gICAgRlhfRnJlZShpbWctPmNvbXBzWzBdLmRhdGEpOwotICAgIGltZy0+Y29tcHNbMF0uZGF0YSA9IGQwOwotICAgIEZYX0ZyZWUoaW1nLT5jb21wc1sxXS5kYXRhKTsKLSAgICBpbWctPmNvbXBzWzFdLmRhdGEgPSBkMTsKLSAgICBGWF9GcmVlKGltZy0+Y29tcHNbMl0uZGF0YSk7Ci0gICAgaW1nLT5jb21wc1syXS5kYXRhID0gZDI7Ci0gICAgaW1nLT5jb21wc1sxXS53ID0gbWF4dzsKLSAgICBpbWctPmNvbXBzWzFdLmggPSBtYXhoOwotICAgIGltZy0+Y29tcHNbMl0udyA9IG1heHc7Ci0gICAgaW1nLT5jb21wc1syXS5oID0gbWF4aDsKLSAgICBpbWctPmNvbXBzWzFdLncgPSAoT1BKX1VJTlQzMiltYXh3OwotICAgIGltZy0+Y29tcHNbMV0uaCA9IChPUEpfVUlOVDMyKW1heGg7Ci0gICAgaW1nLT5jb21wc1syXS53ID0gKE9QSl9VSU5UMzIpbWF4dzsKLSAgICBpbWctPmNvbXBzWzJdLmggPSAoT1BKX1VJTlQzMiltYXhoOwotICAgIGltZy0+Y29tcHNbMV0uZHggPSBpbWctPmNvbXBzWzBdLmR4OwotICAgIGltZy0+Y29tcHNbMl0uZHggPSBpbWctPmNvbXBzWzBdLmR4OwotICAgIGltZy0+Y29tcHNbMV0uZHkgPSBpbWctPmNvbXBzWzBdLmR5OwotICAgIGltZy0+Y29tcHNbMl0uZHkgPSBpbWctPmNvbXBzWzBdLmR5OworICAgIGlmIChqIDwgbWF4dykgeworICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7CisgICAgICArK3k7CisgICAgICArK3I7CisgICAgICArK2c7CisgICAgICArK2I7CisgICAgICArK2NiOworICAgICAgKytjcjsKKyAgICB9CisgIH0KKyAgRlhfRnJlZShpbWctPmNvbXBzWzBdLmRhdGEpOworICBpbWctPmNvbXBzWzBdLmRhdGEgPSBkMDsKKyAgRlhfRnJlZShpbWctPmNvbXBzWzFdLmRhdGEpOworICBpbWctPmNvbXBzWzFdLmRhdGEgPSBkMTsKKyAgRlhfRnJlZShpbWctPmNvbXBzWzJdLmRhdGEpOworICBpbWctPmNvbXBzWzJdLmRhdGEgPSBkMjsKKyAgaW1nLT5jb21wc1sxXS53ID0gbWF4dzsKKyAgaW1nLT5jb21wc1sxXS5oID0gbWF4aDsKKyAgaW1nLT5jb21wc1syXS53ID0gbWF4dzsKKyAgaW1nLT5jb21wc1syXS5oID0gbWF4aDsKKyAgaW1nLT5jb21wc1sxXS53ID0gKE9QSl9VSU5UMzIpbWF4dzsKKyAgaW1nLT5jb21wc1sxXS5oID0gKE9QSl9VSU5UMzIpbWF4aDsKKyAgaW1nLT5jb21wc1syXS53ID0gKE9QSl9VSU5UMzIpbWF4dzsKKyAgaW1nLT5jb21wc1syXS5oID0gKE9QSl9VSU5UMzIpbWF4aDsKKyAgaW1nLT5jb21wc1sxXS5keCA9IGltZy0+Y29tcHNbMF0uZHg7CisgIGltZy0+Y29tcHNbMl0uZHggPSBpbWctPmNvbXBzWzBdLmR4OworICBpbWctPmNvbXBzWzFdLmR5ID0gaW1nLT5jb21wc1swXS5keTsKKyAgaW1nLT5jb21wc1syXS5keSA9IGltZy0+Y29tcHNbMF0uZHk7CiB9Ci1zdGF0aWMgdm9pZCBzeWNjNDIwX3RvX3JnYihvcGpfaW1hZ2VfdCAqaW1nKQotewotICAgIGludCAqZDAsICpkMSwgKmQyLCAqciwgKmcsICpiLCAqbnIsICpuZywgKm5iOwotICAgIGNvbnN0IGludCAqeSwgKmNiLCAqY3IsICpueTsKLSAgICBpbnQgbWF4dywgbWF4aCwgbWF4LCBvZmZzZXQsIHVwYjsKLSAgICBpbnQgaSwgajsKLSAgICBpID0gKGludClpbWctPmNvbXBzWzBdLnByZWM7Ci0gICAgb2Zmc2V0ID0gMSA8PCAoaSAtIDEpOwotICAgIHVwYiA9ICgxIDw8IGkpIC0gMTsKLSAgICBtYXh3ID0gKGludClpbWctPmNvbXBzWzBdLnc7Ci0gICAgbWF4aCA9IChpbnQpaW1nLT5jb21wc1swXS5oOwotICAgIG1heCA9IG1heHcgKiBtYXhoOwotICAgIHkgPSBpbWctPmNvbXBzWzBdLmRhdGE7Ci0gICAgY2IgPSBpbWctPmNvbXBzWzFdLmRhdGE7Ci0gICAgY3IgPSBpbWctPmNvbXBzWzJdLmRhdGE7Ci0gICAgZDAgPSByID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7Ci0gICAgZDEgPSBnID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7Ci0gICAgZDIgPSBiID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7Ci0gICAgZm9yIChpID0gMDsgKE9QSl9VSU5UMzIpaSA8IChtYXhoICYgfihPUEpfVUlOVDMyKTEpOyBpICs9IDIpCi0gICAgewotICAgICAgICBueSA9IHkgKyBtYXh3OwotICAgICAgICBuciA9IHIgKyBtYXh3OwotICAgICAgICBuZyA9IGcgKyBtYXh3OwotICAgICAgICBuYiA9IGIgKyBtYXh3OwotICAgICAgICBmb3IgKGogPSAwOyAoT1BKX1VJTlQzMilqIDwgKG1heHcgJiB+KE9QSl9VSU5UMzIpMSk7IGogKz0gMikKLSAgICAgICAgewotICAgICAgICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7Ci0gICAgICAgICAgICArK3k7ICsrcjsgKytnOyArK2I7Ci0gICAgICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKLSAgICAgICAgICAgICsreTsgKytyOyArK2c7ICsrYjsKLSAgICAgICAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqbnksICpjYiwgKmNyLCBuciwgbmcsIG5iKTsKLSAgICAgICAgICAgICsrbnk7ICsrbnI7ICsrbmc7ICsrbmI7Ci0gICAgICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKm55LCAqY2IsICpjciwgbnIsIG5nLCBuYik7Ci0gICAgICAgICAgICArK255OyArK25yOyArK25nOyArK25iOyArK2NiOyArK2NyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqIDwgbWF4dykKLSAgICAgICAgewotICAgICAgICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7Ci0gICAgICAgICAgICArK3k7ICsrcjsgKytnOyArK2I7Ci0gICAgICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKm55LCAqY2IsICpjciwgbnIsIG5nLCBuYik7Ci0gICAgICAgICAgICArK255OyArK25yOyArK25nOyArK25iOyArK2NiOyArK2NyOwotICAgICAgICB9Ci0gICAgICAgIHkgKz0gbWF4dzsgciArPSBtYXh3OyBnICs9IG1heHc7IGIgKz0gbWF4dzsKK3N0YXRpYyB2b2lkIHN5Y2M0MjBfdG9fcmdiKG9wal9pbWFnZV90KiBpbWcpIHsKKyAgaW50ICpkMCwgKmQxLCAqZDIsICpyLCAqZywgKmIsICpuciwgKm5nLCAqbmI7CisgIGNvbnN0IGludCAqeSwgKmNiLCAqY3IsICpueTsKKyAgaW50IG1heHcsIG1heGgsIG1heCwgb2Zmc2V0LCB1cGI7CisgIGludCBpLCBqOworICBpID0gKGludClpbWctPmNvbXBzWzBdLnByZWM7CisgIG9mZnNldCA9IDEgPDwgKGkgLSAxKTsKKyAgdXBiID0gKDEgPDwgaSkgLSAxOworICBtYXh3ID0gKGludClpbWctPmNvbXBzWzBdLnc7CisgIG1heGggPSAoaW50KWltZy0+Y29tcHNbMF0uaDsKKyAgbWF4ID0gbWF4dyAqIG1heGg7CisgIHkgPSBpbWctPmNvbXBzWzBdLmRhdGE7CisgIGNiID0gaW1nLT5jb21wc1sxXS5kYXRhOworICBjciA9IGltZy0+Y29tcHNbMl0uZGF0YTsKKyAgZDAgPSByID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7CisgIGQxID0gZyA9IEZYX0FsbG9jKGludCwgKHNpemVfdCltYXgpOworICBkMiA9IGIgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKKyAgZm9yIChpID0gMDsgKE9QSl9VSU5UMzIpaSA8IChtYXhoICYgfihPUEpfVUlOVDMyKTEpOyBpICs9IDIpIHsKKyAgICBueSA9IHkgKyBtYXh3OworICAgIG5yID0gciArIG1heHc7CisgICAgbmcgPSBnICsgbWF4dzsKKyAgICBuYiA9IGIgKyBtYXh3OworICAgIGZvciAoaiA9IDA7IChPUEpfVUlOVDMyKWogPCAobWF4dyAmIH4oT1BKX1VJTlQzMikxKTsgaiArPSAyKSB7CisgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKKyAgICAgICsreTsKKyAgICAgICsrcjsKKyAgICAgICsrZzsKKyAgICAgICsrYjsKKyAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSwgKmNiLCAqY3IsIHIsIGcsIGIpOworICAgICAgKyt5OworICAgICAgKytyOworICAgICAgKytnOworICAgICAgKytiOworICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICpueSwgKmNiLCAqY3IsIG5yLCBuZywgbmIpOworICAgICAgKytueTsKKyAgICAgICsrbnI7CisgICAgICArK25nOworICAgICAgKytuYjsKKyAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqbnksICpjYiwgKmNyLCBuciwgbmcsIG5iKTsKKyAgICAgICsrbnk7CisgICAgICArK25yOworICAgICAgKytuZzsKKyAgICAgICsrbmI7CisgICAgICArK2NiOworICAgICAgKytjcjsKICAgICB9Ci0gICAgaWYgKGkgPCBtYXhoKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgKE9QSl9VSU5UMzIpaiA8IChtYXh3ICYgfihPUEpfVUlOVDMyKTEpOyBqICs9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSwgKmNiLCAqY3IsIHIsIGcsIGIpOwotICAgICAgICAgICAgKyt5OyArK3I7ICsrZzsgKytiOwotICAgICAgICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7Ci0gICAgICAgICAgICArK3k7ICsrcjsgKytnOyArK2I7ICsrY2I7ICsrY3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGogPCBtYXh3KQotICAgICAgICB7Ci0gICAgICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKLSAgICAgICAgfQorICAgIGlmIChqIDwgbWF4dykgeworICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7CisgICAgICArK3k7CisgICAgICArK3I7CisgICAgICArK2c7CisgICAgICArK2I7CisgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKm55LCAqY2IsICpjciwgbnIsIG5nLCBuYik7CisgICAgICArK255OworICAgICAgKytucjsKKyAgICAgICsrbmc7CisgICAgICArK25iOworICAgICAgKytjYjsKKyAgICAgICsrY3I7CiAgICAgfQorICAgIHkgKz0gbWF4dzsKKyAgICByICs9IG1heHc7CisgICAgZyArPSBtYXh3OworICAgIGIgKz0gbWF4dzsKKyAgfQorICBpZiAoaSA8IG1heGgpIHsKKyAgICBmb3IgKGogPSAwOyAoT1BKX1VJTlQzMilqIDwgKG1heHcgJiB+KE9QSl9VSU5UMzIpMSk7IGogKz0gMikgeworICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7CisgICAgICArK3k7CisgICAgICArK3I7CisgICAgICArK2c7CisgICAgICArK2I7CisgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKKyAgICAgICsreTsKKyAgICAgICsrcjsKKyAgICAgICsrZzsKKyAgICAgICsrYjsKKyAgICAgICsrY2I7CisgICAgICArK2NyOworICAgIH0KKyAgICBpZiAoaiA8IG1heHcpIHsKKyAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSwgKmNiLCAqY3IsIHIsIGcsIGIpOworICAgIH0KKyAgfQogCi0gICAgRlhfRnJlZShpbWctPmNvbXBzWzBdLmRhdGEpOwotICAgIGltZy0+Y29tcHNbMF0uZGF0YSA9IGQwOwotICAgIEZYX0ZyZWUoaW1nLT5jb21wc1sxXS5kYXRhKTsKLSAgICBpbWctPmNvbXBzWzFdLmRhdGEgPSBkMTsKLSAgICBGWF9GcmVlKGltZy0+Y29tcHNbMl0uZGF0YSk7Ci0gICAgaW1nLT5jb21wc1syXS5kYXRhID0gZDI7Ci0gICAgaW1nLT5jb21wc1sxXS53ID0gbWF4dzsKLSAgICBpbWctPmNvbXBzWzFdLmggPSBtYXhoOwotICAgIGltZy0+Y29tcHNbMl0udyA9IG1heHc7Ci0gICAgaW1nLT5jb21wc1syXS5oID0gbWF4aDsKLSAgICBpbWctPmNvbXBzWzFdLncgPSAoT1BKX1VJTlQzMiltYXh3OwotICAgIGltZy0+Y29tcHNbMV0uaCA9IChPUEpfVUlOVDMyKW1heGg7Ci0gICAgaW1nLT5jb21wc1syXS53ID0gKE9QSl9VSU5UMzIpbWF4dzsKLSAgICBpbWctPmNvbXBzWzJdLmggPSAoT1BKX1VJTlQzMiltYXhoOwotICAgIGltZy0+Y29tcHNbMV0uZHggPSBpbWctPmNvbXBzWzBdLmR4OwotICAgIGltZy0+Y29tcHNbMl0uZHggPSBpbWctPmNvbXBzWzBdLmR4OwotICAgIGltZy0+Y29tcHNbMV0uZHkgPSBpbWctPmNvbXBzWzBdLmR5OwotICAgIGltZy0+Y29tcHNbMl0uZHkgPSBpbWctPmNvbXBzWzBdLmR5OworICBGWF9GcmVlKGltZy0+Y29tcHNbMF0uZGF0YSk7CisgIGltZy0+Y29tcHNbMF0uZGF0YSA9IGQwOworICBGWF9GcmVlKGltZy0+Y29tcHNbMV0uZGF0YSk7CisgIGltZy0+Y29tcHNbMV0uZGF0YSA9IGQxOworICBGWF9GcmVlKGltZy0+Y29tcHNbMl0uZGF0YSk7CisgIGltZy0+Y29tcHNbMl0uZGF0YSA9IGQyOworICBpbWctPmNvbXBzWzFdLncgPSBtYXh3OworICBpbWctPmNvbXBzWzFdLmggPSBtYXhoOworICBpbWctPmNvbXBzWzJdLncgPSBtYXh3OworICBpbWctPmNvbXBzWzJdLmggPSBtYXhoOworICBpbWctPmNvbXBzWzFdLncgPSAoT1BKX1VJTlQzMiltYXh3OworICBpbWctPmNvbXBzWzFdLmggPSAoT1BKX1VJTlQzMiltYXhoOworICBpbWctPmNvbXBzWzJdLncgPSAoT1BKX1VJTlQzMiltYXh3OworICBpbWctPmNvbXBzWzJdLmggPSAoT1BKX1VJTlQzMiltYXhoOworICBpbWctPmNvbXBzWzFdLmR4ID0gaW1nLT5jb21wc1swXS5keDsKKyAgaW1nLT5jb21wc1syXS5keCA9IGltZy0+Y29tcHNbMF0uZHg7CisgIGltZy0+Y29tcHNbMV0uZHkgPSBpbWctPmNvbXBzWzBdLmR5OworICBpbWctPmNvbXBzWzJdLmR5ID0gaW1nLT5jb21wc1swXS5keTsKIH0KLXZvaWQgY29sb3Jfc3ljY190b19yZ2Iob3BqX2ltYWdlX3QgKmltZykKLXsKLSAgICBpZihpbWctPm51bWNvbXBzIDwgMykgewotICAgICAgICBpbWctPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19HUkFZOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmKChpbWctPmNvbXBzWzBdLmR4ID09IDEpCi0gICAgICAgICAgICAmJiAoaW1nLT5jb21wc1sxXS5keCA9PSAyKQotICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHggPT0gMikKLSAgICAgICAgICAgICYmIChpbWctPmNvbXBzWzBdLmR5ID09IDEpCi0gICAgICAgICAgICAmJiAoaW1nLT5jb21wc1sxXS5keSA9PSAyKQotICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHkgPT0gMikpIHsKLSAgICAgICAgc3ljYzQyMF90b19yZ2IoaW1nKTsKLSAgICB9IGVsc2UgaWYoKGltZy0+Y29tcHNbMF0uZHggPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMV0uZHggPT0gMikKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHggPT0gMikKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMF0uZHkgPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMV0uZHkgPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHkgPT0gMSkpIHsKLSAgICAgICAgc3ljYzQyMl90b19yZ2IoaW1nKTsKLSAgICB9IGVsc2UgaWYoKGltZy0+Y29tcHNbMF0uZHggPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMV0uZHggPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHggPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMF0uZHkgPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMV0uZHkgPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHkgPT0gMSkpIHsKLSAgICAgICAgc3ljYzQ0NF90b19yZ2IoaW1nKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGltZy0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NSR0I7Cit2b2lkIGNvbG9yX3N5Y2NfdG9fcmdiKG9wal9pbWFnZV90KiBpbWcpIHsKKyAgaWYgKGltZy0+bnVtY29tcHMgPCAzKSB7CisgICAgaW1nLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfR1JBWTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKChpbWctPmNvbXBzWzBdLmR4ID09IDEpICYmIChpbWctPmNvbXBzWzFdLmR4ID09IDIpICYmCisgICAgICAoaW1nLT5jb21wc1syXS5keCA9PSAyKSAmJiAoaW1nLT5jb21wc1swXS5keSA9PSAxKSAmJgorICAgICAgKGltZy0+Y29tcHNbMV0uZHkgPT0gMikgJiYgKGltZy0+Y29tcHNbMl0uZHkgPT0gMikpIHsKKyAgICBzeWNjNDIwX3RvX3JnYihpbWcpOworICB9IGVsc2UgaWYgKChpbWctPmNvbXBzWzBdLmR4ID09IDEpICYmIChpbWctPmNvbXBzWzFdLmR4ID09IDIpICYmCisgICAgICAgICAgICAgKGltZy0+Y29tcHNbMl0uZHggPT0gMikgJiYgKGltZy0+Y29tcHNbMF0uZHkgPT0gMSkgJiYKKyAgICAgICAgICAgICAoaW1nLT5jb21wc1sxXS5keSA9PSAxKSAmJiAoaW1nLT5jb21wc1syXS5keSA9PSAxKSkgeworICAgIHN5Y2M0MjJfdG9fcmdiKGltZyk7CisgIH0gZWxzZSBpZiAoKGltZy0+Y29tcHNbMF0uZHggPT0gMSkgJiYgKGltZy0+Y29tcHNbMV0uZHggPT0gMSkgJiYKKyAgICAgICAgICAgICAoaW1nLT5jb21wc1syXS5keCA9PSAxKSAmJiAoaW1nLT5jb21wc1swXS5keSA9PSAxKSAmJgorICAgICAgICAgICAgIChpbWctPmNvbXBzWzFdLmR5ID09IDEpICYmIChpbWctPmNvbXBzWzJdLmR5ID09IDEpKSB7CisgICAgc3ljYzQ0NF90b19yZ2IoaW1nKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW1nLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKIH0KLXZvaWQgY29sb3JfYXBwbHlfaWNjX3Byb2ZpbGUob3BqX2ltYWdlX3QgKmltYWdlKQotewotICAgIGNtc0hQUk9GSUxFIG91dF9wcm9mOwotICAgIGNtc1VJbnQzMk51bWJlciBpbl90eXBlOwotICAgIGNtc1VJbnQzMk51bWJlciBvdXRfdHlwZTsKLSAgICBpbnQgKnI7Ci0gICAgaW50ICpnOwotICAgIGludCAqYjsKLSAgICBpbnQgbWF4OwotICAgIGNtc0hQUk9GSUxFIGluX3Byb2YgPQotICAgICAgICBjbXNPcGVuUHJvZmlsZUZyb21NZW0oaW1hZ2UtPmljY19wcm9maWxlX2J1ZiwgaW1hZ2UtPmljY19wcm9maWxlX2xlbik7Ci0gICAgaWYoaW5fcHJvZiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBvdXRfc3BhY2UgPSBjbXNHZXRDb2xvclNwYWNlKGluX3Byb2YpOwotICAgIGNtc1VJbnQzMk51bWJlciBpbnRlbnQgPSBjbXNHZXRIZWFkZXJSZW5kZXJpbmdJbnRlbnQoaW5fcHJvZik7Ci0gICAgaW50IG1heF93ID0gKGludClpbWFnZS0+Y29tcHNbMF0udzsKLSAgICBpbnQgbWF4X2ggPSAoaW50KWltYWdlLT5jb21wc1swXS5oOwotICAgIGludCBwcmVjID0gKGludClpbWFnZS0+Y29tcHNbMF0ucHJlYzsKLSAgICBPUEpfQ09MT1JfU1BBQ0Ugb2xkc3BhY2UgPSBpbWFnZS0+Y29sb3Jfc3BhY2U7Ci0gICAgaWYob3V0X3NwYWNlID09IGNtc1NpZ1JnYkRhdGEpIHsKLSAgICAgICAgaWYoIHByZWMgPD0gOCApIHsKLSAgICAgICAgICAgIGluX3R5cGUgPSBUWVBFX1JHQl84OwotICAgICAgICAgICAgb3V0X3R5cGUgPSBUWVBFX1JHQl84OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5fdHlwZSA9IFRZUEVfUkdCXzE2OwotICAgICAgICAgICAgb3V0X3R5cGUgPSBUWVBFX1JHQl8xNjsKLSAgICAgICAgfQotICAgICAgICBvdXRfcHJvZiA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOwotICAgICAgICBpbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NSR0I7Ci0gICAgfSBlbHNlIGlmKG91dF9zcGFjZSA9PSBjbXNTaWdHcmF5RGF0YSkgewotICAgICAgICBpZiggcHJlYyA8PSA4ICkgewotICAgICAgICAgICAgaW5fdHlwZSA9IFRZUEVfR1JBWV84OwotICAgICAgICAgICAgb3V0X3R5cGUgPSBUWVBFX1JHQl84OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5fdHlwZSA9IFRZUEVfR1JBWV8xNjsKLSAgICAgICAgICAgIG91dF90eXBlID0gVFlQRV9SR0JfMTY7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0X3Byb2YgPSBjbXNDcmVhdGVfc1JHQlByb2ZpbGUoKTsKLSAgICAgICAgaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOwotICAgIH0gZWxzZSBpZihvdXRfc3BhY2UgPT0gY21zU2lnWUNiQ3JEYXRhKSB7Ci0gICAgICAgIGluX3R5cGUgPSBUWVBFX1lDYkNyXzE2OwotICAgICAgICBvdXRfdHlwZSA9IFRZUEVfUkdCXzE2OwotICAgICAgICBvdXRfcHJvZiA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOwotICAgICAgICBpbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NSR0I7Cit2b2lkIGNvbG9yX2FwcGx5X2ljY19wcm9maWxlKG9wal9pbWFnZV90KiBpbWFnZSkgeworICBjbXNIUFJPRklMRSBvdXRfcHJvZjsKKyAgY21zVUludDMyTnVtYmVyIGluX3R5cGU7CisgIGNtc1VJbnQzMk51bWJlciBvdXRfdHlwZTsKKyAgaW50KiByOworICBpbnQqIGc7CisgIGludCogYjsKKyAgaW50IG1heDsKKyAgY21zSFBST0ZJTEUgaW5fcHJvZiA9CisgICAgICBjbXNPcGVuUHJvZmlsZUZyb21NZW0oaW1hZ2UtPmljY19wcm9maWxlX2J1ZiwgaW1hZ2UtPmljY19wcm9maWxlX2xlbik7CisgIGlmIChpbl9wcm9mID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBvdXRfc3BhY2UgPSBjbXNHZXRDb2xvclNwYWNlKGluX3Byb2YpOworICBjbXNVSW50MzJOdW1iZXIgaW50ZW50ID0gY21zR2V0SGVhZGVyUmVuZGVyaW5nSW50ZW50KGluX3Byb2YpOworICBpbnQgbWF4X3cgPSAoaW50KWltYWdlLT5jb21wc1swXS53OworICBpbnQgbWF4X2ggPSAoaW50KWltYWdlLT5jb21wc1swXS5oOworICBpbnQgcHJlYyA9IChpbnQpaW1hZ2UtPmNvbXBzWzBdLnByZWM7CisgIE9QSl9DT0xPUl9TUEFDRSBvbGRzcGFjZSA9IGltYWdlLT5jb2xvcl9zcGFjZTsKKyAgaWYgKG91dF9zcGFjZSA9PSBjbXNTaWdSZ2JEYXRhKSB7CisgICAgaWYgKHByZWMgPD0gOCkgeworICAgICAgaW5fdHlwZSA9IFRZUEVfUkdCXzg7CisgICAgICBvdXRfdHlwZSA9IFRZUEVfUkdCXzg7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuOworICAgICAgaW5fdHlwZSA9IFRZUEVfUkdCXzE2OworICAgICAgb3V0X3R5cGUgPSBUWVBFX1JHQl8xNjsKICAgICB9Ci0gICAgY21zSFRSQU5TRk9STSB0cmFuc2Zvcm0gPQotICAgICAgICBjbXNDcmVhdGVUcmFuc2Zvcm0oaW5fcHJvZiwgaW5fdHlwZSwgb3V0X3Byb2YsIG91dF90eXBlLCBpbnRlbnQsIDApOwotICAgIGNtc0Nsb3NlUHJvZmlsZShpbl9wcm9mKTsKLSAgICBjbXNDbG9zZVByb2ZpbGUob3V0X3Byb2YpOwotICAgIGlmKHRyYW5zZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IG9sZHNwYWNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmKGltYWdlLT5udW1jb21wcyA+IDIpIHsKLSAgICAgICAgaWYoIHByZWMgPD0gOCApIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmluYnVmLCAqb3V0YnVmLCAqaW4sICpvdXQ7Ci0gICAgICAgICAgICBtYXggPSBtYXhfdyAqIG1heF9oOwotICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5yX3NhbXBsZXMgPSBtYXggKiAzICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwotICAgICAgICAgICAgaW4gPSBpbmJ1ZiA9IEZYX0FsbG9jKHVuc2lnbmVkIGNoYXIsIG5yX3NhbXBsZXMpOwotICAgICAgICAgICAgb3V0ID0gb3V0YnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7Ci0gICAgICAgICAgICByID0gaW1hZ2UtPmNvbXBzWzBdLmRhdGE7Ci0gICAgICAgICAgICBnID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7Ci0gICAgICAgICAgICBiID0gaW1hZ2UtPmNvbXBzWzJdLmRhdGE7Ci0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKLSAgICAgICAgICAgICAgICAqaW4rKyA9ICh1bnNpZ25lZCBjaGFyKSAqIHIrKzsKLSAgICAgICAgICAgICAgICAqaW4rKyA9ICh1bnNpZ25lZCBjaGFyKSAqIGcrKzsKLSAgICAgICAgICAgICAgICAqaW4rKyA9ICh1bnNpZ25lZCBjaGFyKSAqIGIrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNtc0RvVHJhbnNmb3JtKHRyYW5zZm9ybSwgaW5idWYsIG91dGJ1ZiwgKGNtc1VJbnQzMk51bWJlciltYXgpOwotICAgICAgICAgICAgciA9IGltYWdlLT5jb21wc1swXS5kYXRhOwotICAgICAgICAgICAgZyA9IGltYWdlLT5jb21wc1sxXS5kYXRhOwotICAgICAgICAgICAgYiA9IGltYWdlLT5jb21wc1syXS5kYXRhOwotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgKnIrKyA9IChpbnQpICogb3V0Kys7Ci0gICAgICAgICAgICAgICAgKmcrKyA9IChpbnQpICogb3V0Kys7Ci0gICAgICAgICAgICAgICAgKmIrKyA9IChpbnQpICogb3V0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GcmVlKGluYnVmKTsKLSAgICAgICAgICAgIEZYX0ZyZWUob3V0YnVmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICppbmJ1ZiwgKm91dGJ1ZiwgKmluLCAqb3V0OwotICAgICAgICAgICAgbWF4ID0gbWF4X3cgKiBtYXhfaDsKLSAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBucl9zYW1wbGVzID0gbWF4ICogMyAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7Ci0gICAgICAgICAgICBpbiA9IGluYnVmID0gRlhfQWxsb2ModW5zaWduZWQgc2hvcnQsIG5yX3NhbXBsZXMpOwotICAgICAgICAgICAgb3V0ID0gb3V0YnVmID0gRlhfQWxsb2ModW5zaWduZWQgc2hvcnQsIG5yX3NhbXBsZXMpOwotICAgICAgICAgICAgciA9IGltYWdlLT5jb21wc1swXS5kYXRhOwotICAgICAgICAgICAgZyA9IGltYWdlLT5jb21wc1sxXS5kYXRhOwotICAgICAgICAgICAgYiA9IGltYWdlLT5jb21wc1syXS5kYXRhOwotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgKmluKysgPSAodW5zaWduZWQgc2hvcnQpICogcisrOwotICAgICAgICAgICAgICAgICppbisrID0gKHVuc2lnbmVkIHNob3J0KSAqIGcrKzsKLSAgICAgICAgICAgICAgICAqaW4rKyA9ICh1bnNpZ25lZCBzaG9ydCkgKiBiKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbXNEb1RyYW5zZm9ybSh0cmFuc2Zvcm0sIGluYnVmLCBvdXRidWYsIChjbXNVSW50MzJOdW1iZXIpbWF4KTsKLSAgICAgICAgICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKLSAgICAgICAgICAgIGcgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKLSAgICAgICAgICAgIGIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgewotICAgICAgICAgICAgICAgICpyKysgPSAoaW50KSAqIG91dCsrOwotICAgICAgICAgICAgICAgICpnKysgPSAoaW50KSAqIG91dCsrOwotICAgICAgICAgICAgICAgICpiKysgPSAoaW50KSAqIG91dCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRnJlZShpbmJ1Zik7Ci0gICAgICAgICAgICBGWF9GcmVlKG91dGJ1Zik7Ci0gICAgICAgIH0KKyAgICBvdXRfcHJvZiA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOworICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKKyAgfSBlbHNlIGlmIChvdXRfc3BhY2UgPT0gY21zU2lnR3JheURhdGEpIHsKKyAgICBpZiAocHJlYyA8PSA4KSB7CisgICAgICBpbl90eXBlID0gVFlQRV9HUkFZXzg7CisgICAgICBvdXRfdHlwZSA9IFRZUEVfUkdCXzg7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqaW4sICppbmJ1ZiwgKm91dCwgKm91dGJ1ZjsKLSAgICAgICAgbWF4ID0gbWF4X3cgKiBtYXhfaDsKLSAgICAgICAgY21zVUludDMyTnVtYmVyIG5yX3NhbXBsZXMgPQotICAgICAgICAgICAgKGNtc1VJbnQzMk51bWJlciltYXggKiAzICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwotICAgICAgICBpbiA9IGluYnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7Ci0gICAgICAgIG91dCA9IG91dGJ1ZiA9IEZYX0FsbG9jKHVuc2lnbmVkIGNoYXIsIG5yX3NhbXBsZXMpOwotICAgICAgICBpbWFnZS0+Y29tcHMgPSAob3BqX2ltYWdlX2NvbXBfdCopCi0gICAgICAgICAgICAgICAgICAgICAgIHJlYWxsb2MoaW1hZ2UtPmNvbXBzLCAoaW1hZ2UtPm51bWNvbXBzICsgMikgKiBzaXplb2Yob3BqX2ltYWdlX2NvbXBfdCkpOwotICAgICAgICBpZihpbWFnZS0+bnVtY29tcHMgPT0gMikgewotICAgICAgICAgICAgaW1hZ2UtPmNvbXBzWzNdID0gaW1hZ2UtPmNvbXBzWzFdOwotICAgICAgICB9Ci0gICAgICAgIGltYWdlLT5jb21wc1sxXSA9IGltYWdlLT5jb21wc1swXTsKLSAgICAgICAgaW1hZ2UtPmNvbXBzWzJdID0gaW1hZ2UtPmNvbXBzWzBdOwotICAgICAgICBpbWFnZS0+Y29tcHNbMV0uZGF0YSA9IEZYX0FsbG9jKGludCwgKHNpemVfdCltYXgpOwotICAgICAgICBGWFNZU19tZW1zZXQoaW1hZ2UtPmNvbXBzWzFdLmRhdGEsIDAsIHNpemVvZihpbnQpICogKHNpemVfdCltYXgpOwotICAgICAgICBpbWFnZS0+Y29tcHNbMl0uZGF0YSA9IEZYX0FsbG9jKGludCwgKHNpemVfdCltYXgpOwotICAgICAgICBGWFNZU19tZW1zZXQoaW1hZ2UtPmNvbXBzWzJdLmRhdGEsIDAsIHNpemVvZihpbnQpICogKHNpemVfdCltYXgpOwotICAgICAgICBpbWFnZS0+bnVtY29tcHMgKz0gMjsKLSAgICAgICAgciA9IGltYWdlLT5jb21wc1swXS5kYXRhOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKLSAgICAgICAgICAgICppbisrID0gKHVuc2lnbmVkIGNoYXIpICogcisrOwotICAgICAgICB9Ci0gICAgICAgIGNtc0RvVHJhbnNmb3JtKHRyYW5zZm9ybSwgaW5idWYsIG91dGJ1ZiwgKGNtc1VJbnQzMk51bWJlciltYXgpOwotICAgICAgICByID0gaW1hZ2UtPmNvbXBzWzBdLmRhdGE7Ci0gICAgICAgIGcgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKLSAgICAgICAgYiA9IGltYWdlLT5jb21wc1syXS5kYXRhOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKLSAgICAgICAgICAgICpyKysgPSAoaW50KSAqIG91dCsrOwotICAgICAgICAgICAgKmcrKyA9IChpbnQpICogb3V0Kys7Ci0gICAgICAgICAgICAqYisrID0gKGludCkgKiBvdXQrKzsKLSAgICAgICAgfQotICAgICAgICBGWF9GcmVlKGluYnVmKTsKLSAgICAgICAgRlhfRnJlZShvdXRidWYpOworICAgICAgaW5fdHlwZSA9IFRZUEVfR1JBWV8xNjsKKyAgICAgIG91dF90eXBlID0gVFlQRV9SR0JfMTY7CisgICAgfQorICAgIG91dF9wcm9mID0gY21zQ3JlYXRlX3NSR0JQcm9maWxlKCk7CisgICAgaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOworICB9IGVsc2UgaWYgKG91dF9zcGFjZSA9PSBjbXNTaWdZQ2JDckRhdGEpIHsKKyAgICBpbl90eXBlID0gVFlQRV9ZQ2JDcl8xNjsKKyAgICBvdXRfdHlwZSA9IFRZUEVfUkdCXzE2OworICAgIG91dF9wcm9mID0gY21zQ3JlYXRlX3NSR0JQcm9maWxlKCk7CisgICAgaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOworICB9IGVsc2UgeworICAgIHJldHVybjsKKyAgfQorICBjbXNIVFJBTlNGT1JNIHRyYW5zZm9ybSA9CisgICAgICBjbXNDcmVhdGVUcmFuc2Zvcm0oaW5fcHJvZiwgaW5fdHlwZSwgb3V0X3Byb2YsIG91dF90eXBlLCBpbnRlbnQsIDApOworICBjbXNDbG9zZVByb2ZpbGUoaW5fcHJvZik7CisgIGNtc0Nsb3NlUHJvZmlsZShvdXRfcHJvZik7CisgIGlmICh0cmFuc2Zvcm0gPT0gTlVMTCkgeworICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IG9sZHNwYWNlOworICAgIHJldHVybjsKKyAgfQorICBpZiAoaW1hZ2UtPm51bWNvbXBzID4gMikgeworICAgIGlmIChwcmVjIDw9IDgpIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmluYnVmLCAqb3V0YnVmLCAqaW4sICpvdXQ7CisgICAgICBtYXggPSBtYXhfdyAqIG1heF9oOworICAgICAgY21zVUludDMyTnVtYmVyIG5yX3NhbXBsZXMgPSBtYXggKiAzICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworICAgICAgaW4gPSBpbmJ1ZiA9IEZYX0FsbG9jKHVuc2lnbmVkIGNoYXIsIG5yX3NhbXBsZXMpOworICAgICAgb3V0ID0gb3V0YnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7CisgICAgICByID0gaW1hZ2UtPmNvbXBzWzBdLmRhdGE7CisgICAgICBnID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7CisgICAgICBiID0gaW1hZ2UtPmNvbXBzWzJdLmRhdGE7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7CisgICAgICAgICppbisrID0gKHVuc2lnbmVkIGNoYXIpKnIrKzsKKyAgICAgICAgKmluKysgPSAodW5zaWduZWQgY2hhcikqZysrOworICAgICAgICAqaW4rKyA9ICh1bnNpZ25lZCBjaGFyKSpiKys7CisgICAgICB9CisgICAgICBjbXNEb1RyYW5zZm9ybSh0cmFuc2Zvcm0sIGluYnVmLCBvdXRidWYsIChjbXNVSW50MzJOdW1iZXIpbWF4KTsKKyAgICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKKyAgICAgIGcgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKKyAgICAgIGIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKyAgICAgICAgKnIrKyA9IChpbnQpKm91dCsrOworICAgICAgICAqZysrID0gKGludCkqb3V0Kys7CisgICAgICAgICpiKysgPSAoaW50KSpvdXQrKzsKKyAgICAgIH0KKyAgICAgIEZYX0ZyZWUoaW5idWYpOworICAgICAgRlhfRnJlZShvdXRidWYpOworICAgIH0gZWxzZSB7CisgICAgICB1bnNpZ25lZCBzaG9ydCAqaW5idWYsICpvdXRidWYsICppbiwgKm91dDsKKyAgICAgIG1heCA9IG1heF93ICogbWF4X2g7CisgICAgICBjbXNVSW50MzJOdW1iZXIgbnJfc2FtcGxlcyA9IG1heCAqIDMgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpOworICAgICAgaW4gPSBpbmJ1ZiA9IEZYX0FsbG9jKHVuc2lnbmVkIHNob3J0LCBucl9zYW1wbGVzKTsKKyAgICAgIG91dCA9IG91dGJ1ZiA9IEZYX0FsbG9jKHVuc2lnbmVkIHNob3J0LCBucl9zYW1wbGVzKTsKKyAgICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKKyAgICAgIGcgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKKyAgICAgIGIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKyAgICAgICAgKmluKysgPSAodW5zaWduZWQgc2hvcnQpKnIrKzsKKyAgICAgICAgKmluKysgPSAodW5zaWduZWQgc2hvcnQpKmcrKzsKKyAgICAgICAgKmluKysgPSAodW5zaWduZWQgc2hvcnQpKmIrKzsKKyAgICAgIH0KKyAgICAgIGNtc0RvVHJhbnNmb3JtKHRyYW5zZm9ybSwgaW5idWYsIG91dGJ1ZiwgKGNtc1VJbnQzMk51bWJlciltYXgpOworICAgICAgciA9IGltYWdlLT5jb21wc1swXS5kYXRhOworICAgICAgZyA9IGltYWdlLT5jb21wc1sxXS5kYXRhOworICAgICAgYiA9IGltYWdlLT5jb21wc1syXS5kYXRhOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgeworICAgICAgICAqcisrID0gKGludCkqb3V0Kys7CisgICAgICAgICpnKysgPSAoaW50KSpvdXQrKzsKKyAgICAgICAgKmIrKyA9IChpbnQpKm91dCsrOworICAgICAgfQorICAgICAgRlhfRnJlZShpbmJ1Zik7CisgICAgICBGWF9GcmVlKG91dGJ1Zik7CisgICAgfQorICB9IGVsc2UgeworICAgIHVuc2lnbmVkIGNoYXIgKmluLCAqaW5idWYsICpvdXQsICpvdXRidWY7CisgICAgbWF4ID0gbWF4X3cgKiBtYXhfaDsKKyAgICBjbXNVSW50MzJOdW1iZXIgbnJfc2FtcGxlcyA9CisgICAgICAgIChjbXNVSW50MzJOdW1iZXIpbWF4ICogMyAqIHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKyAgICBpbiA9IGluYnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7CisgICAgb3V0ID0gb3V0YnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7CisgICAgaW1hZ2UtPmNvbXBzID0gKG9wal9pbWFnZV9jb21wX3QqKXJlYWxsb2MoCisgICAgICAgIGltYWdlLT5jb21wcywgKGltYWdlLT5udW1jb21wcyArIDIpICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKyAgICBpZiAoaW1hZ2UtPm51bWNvbXBzID09IDIpIHsKKyAgICAgIGltYWdlLT5jb21wc1szXSA9IGltYWdlLT5jb21wc1sxXTsKKyAgICB9CisgICAgaW1hZ2UtPmNvbXBzWzFdID0gaW1hZ2UtPmNvbXBzWzBdOworICAgIGltYWdlLT5jb21wc1syXSA9IGltYWdlLT5jb21wc1swXTsKKyAgICBpbWFnZS0+Y29tcHNbMV0uZGF0YSA9IEZYX0FsbG9jKGludCwgKHNpemVfdCltYXgpOworICAgIEZYU1lTX21lbXNldChpbWFnZS0+Y29tcHNbMV0uZGF0YSwgMCwgc2l6ZW9mKGludCkgKiAoc2l6ZV90KW1heCk7CisgICAgaW1hZ2UtPmNvbXBzWzJdLmRhdGEgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKKyAgICBGWFNZU19tZW1zZXQoaW1hZ2UtPmNvbXBzWzJdLmRhdGEsIDAsIHNpemVvZihpbnQpICogKHNpemVfdCltYXgpOworICAgIGltYWdlLT5udW1jb21wcyArPSAyOworICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7CisgICAgICAqaW4rKyA9ICh1bnNpZ25lZCBjaGFyKSpyKys7CisgICAgfQorICAgIGNtc0RvVHJhbnNmb3JtKHRyYW5zZm9ybSwgaW5idWYsIG91dGJ1ZiwgKGNtc1VJbnQzMk51bWJlciltYXgpOworICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKKyAgICBnID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7CisgICAgYiA9IGltYWdlLT5jb21wc1syXS5kYXRhOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKyAgICAgICpyKysgPSAoaW50KSpvdXQrKzsKKyAgICAgICpnKysgPSAoaW50KSpvdXQrKzsKKyAgICAgICpiKysgPSAoaW50KSpvdXQrKzsKKyAgICB9CisgICAgRlhfRnJlZShpbmJ1Zik7CisgICAgRlhfRnJlZShvdXRidWYpOworICB9CisgIGNtc0RlbGV0ZVRyYW5zZm9ybSh0cmFuc2Zvcm0pOworfQordm9pZCBjb2xvcl9hcHBseV9jb252ZXJzaW9uKG9wal9pbWFnZV90KiBpbWFnZSkgeworICBpbnQqIHJvdzsKKyAgaW50IGVudW1jcywgbnVtY29tcHM7CisgIG51bWNvbXBzID0gaW1hZ2UtPm51bWNvbXBzOworICBpZiAobnVtY29tcHMgPCAzKSB7CisgICAgcmV0dXJuOworICB9CisgIHJvdyA9IChpbnQqKWltYWdlLT5pY2NfcHJvZmlsZV9idWY7CisgIGVudW1jcyA9IHJvd1swXTsKKyAgaWYgKGVudW1jcyA9PSAxNCkgeworICAgIGludCAqTCwgKmEsICpiLCAqcmVkLCAqZ3JlZW4sICpibHVlLCAqc3JjMCwgKnNyYzEsICpzcmMyOworICAgIGRvdWJsZSBybCwgb2wsIHJhLCBvYSwgcmIsIG9iLCBwcmVjMCwgcHJlYzEsIHByZWMyOworICAgIGRvdWJsZSBtaW5MLCBtYXhMLCBtaW5hLCBtYXhhLCBtaW5iLCBtYXhiOworICAgIHVuc2lnbmVkIGludCBkZWZhdWx0X3R5cGU7CisgICAgdW5zaWduZWQgaW50IGksIG1heDsKKyAgICBjbXNIUFJPRklMRSBpbiwgb3V0OworICAgIGNtc0hUUkFOU0ZPUk0gdHJhbnNmb3JtOworICAgIGNtc1VJbnQxNk51bWJlciBSR0JbM107CisgICAgY21zQ0lFTGFiIExhYjsKKyAgICBpbiA9IGNtc0NyZWF0ZUxhYjRQcm9maWxlKE5VTEwpOworICAgIG91dCA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOworICAgIHRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShpbiwgVFlQRV9MYWJfREJMLCBvdXQsIFRZUEVfUkdCXzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTlRfUEVSQ0VQVFVBTCwgMCk7CisgICAgY21zQ2xvc2VQcm9maWxlKGluKTsKKyAgICBjbXNDbG9zZVByb2ZpbGUob3V0KTsKKyAgICBpZiAodHJhbnNmb3JtID09IE5VTEwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcHJlYzAgPSAoZG91YmxlKWltYWdlLT5jb21wc1swXS5wcmVjOworICAgIHByZWMxID0gKGRvdWJsZSlpbWFnZS0+Y29tcHNbMV0ucHJlYzsKKyAgICBwcmVjMiA9IChkb3VibGUpaW1hZ2UtPmNvbXBzWzJdLnByZWM7CisgICAgZGVmYXVsdF90eXBlID0gcm93WzFdOworICAgIGlmIChkZWZhdWx0X3R5cGUgPT0gMHg0NDQ1NDYwMCkgeworICAgICAgcmwgPSAxMDA7CisgICAgICByYSA9IDE3MDsKKyAgICAgIHJiID0gMjAwOworICAgICAgb2wgPSAwOworICAgICAgb2EgPSBwb3coMiwgcHJlYzEgLSAxKTsKKyAgICAgIG9iID0gcG93KDIsIHByZWMyIC0gMikgKyBwb3coMiwgcHJlYzIgLSAzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmwgPSByb3dbMl07CisgICAgICByYSA9IHJvd1s0XTsKKyAgICAgIHJiID0gcm93WzZdOworICAgICAgb2wgPSByb3dbM107CisgICAgICBvYSA9IHJvd1s1XTsKKyAgICAgIG9iID0gcm93WzddOworICAgIH0KKyAgICBMID0gc3JjMCA9IGltYWdlLT5jb21wc1swXS5kYXRhOworICAgIGEgPSBzcmMxID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7CisgICAgYiA9IHNyYzIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YTsKKyAgICBtYXggPSBpbWFnZS0+Y29tcHNbMF0udyAqIGltYWdlLT5jb21wc1swXS5oOworICAgIHJlZCA9IEZYX0FsbG9jKGludCwgbWF4KTsKKyAgICBpbWFnZS0+Y29tcHNbMF0uZGF0YSA9IHJlZDsKKyAgICBncmVlbiA9IEZYX0FsbG9jKGludCwgbWF4KTsKKyAgICBpbWFnZS0+Y29tcHNbMV0uZGF0YSA9IGdyZWVuOworICAgIGJsdWUgPSBGWF9BbGxvYyhpbnQsIG1heCk7CisgICAgaW1hZ2UtPmNvbXBzWzJdLmRhdGEgPSBibHVlOworICAgIG1pbkwgPSAtKHJsICogb2wpIC8gKHBvdygyLCBwcmVjMCkgLSAxKTsKKyAgICBtYXhMID0gbWluTCArIHJsOworICAgIG1pbmEgPSAtKHJhICogb2EpIC8gKHBvdygyLCBwcmVjMSkgLSAxKTsKKyAgICBtYXhhID0gbWluYSArIHJhOworICAgIG1pbmIgPSAtKHJiICogb2IpIC8gKHBvdygyLCBwcmVjMikgLSAxKTsKKyAgICBtYXhiID0gbWluYiArIHJiOworICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7ICsraSkgeworICAgICAgTGFiLkwgPSBtaW5MICsgKGRvdWJsZSkoKkwpICogKG1heEwgLSBtaW5MKSAvIChwb3coMiwgcHJlYzApIC0gMSk7CisgICAgICArK0w7CisgICAgICBMYWIuYSA9IG1pbmEgKyAoZG91YmxlKSgqYSkgKiAobWF4YSAtIG1pbmEpIC8gKHBvdygyLCBwcmVjMSkgLSAxKTsKKyAgICAgICsrYTsKKyAgICAgIExhYi5iID0gbWluYiArIChkb3VibGUpKCpiKSAqIChtYXhiIC0gbWluYikgLyAocG93KDIsIHByZWMyKSAtIDEpOworICAgICAgKytiOworICAgICAgY21zRG9UcmFuc2Zvcm0odHJhbnNmb3JtLCAmTGFiLCBSR0IsIDEpOworICAgICAgKnJlZCsrID0gUkdCWzBdOworICAgICAgKmdyZWVuKysgPSBSR0JbMV07CisgICAgICAqYmx1ZSsrID0gUkdCWzJdOwogICAgIH0KICAgICBjbXNEZWxldGVUcmFuc2Zvcm0odHJhbnNmb3JtKTsKKyAgICBGWF9GcmVlKHNyYzApOworICAgIEZYX0ZyZWUoc3JjMSk7CisgICAgRlhfRnJlZShzcmMyKTsKKyAgICBpbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NSR0I7CisgICAgaW1hZ2UtPmNvbXBzWzBdLnByZWMgPSAxNjsKKyAgICBpbWFnZS0+Y29tcHNbMV0ucHJlYyA9IDE2OworICAgIGltYWdlLT5jb21wc1syXS5wcmVjID0gMTY7CisgICAgcmV0dXJuOworICB9CiB9Ci12b2lkIGNvbG9yX2FwcGx5X2NvbnZlcnNpb24ob3BqX2ltYWdlX3QgKmltYWdlKQotewotICAgIGludCAqcm93OwotICAgIGludCBlbnVtY3MsIG51bWNvbXBzOwotICAgIG51bWNvbXBzID0gaW1hZ2UtPm51bWNvbXBzOwotICAgIGlmKG51bWNvbXBzIDwgMykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJvdyA9IChpbnQqKWltYWdlLT5pY2NfcHJvZmlsZV9idWY7Ci0gICAgZW51bWNzID0gcm93WzBdOwotICAgIGlmKGVudW1jcyA9PSAxNCkgewotICAgICAgICBpbnQgKkwsICphLCAqYiwgKnJlZCwgKmdyZWVuLCAqYmx1ZSwgKnNyYzAsICpzcmMxLCAqc3JjMjsKLSAgICAgICAgZG91YmxlIHJsLCBvbCwgcmEsIG9hLCByYiwgb2IsIHByZWMwLCBwcmVjMSwgcHJlYzI7Ci0gICAgICAgIGRvdWJsZSBtaW5MLCBtYXhMLCBtaW5hLCBtYXhhLCBtaW5iLCBtYXhiOwotICAgICAgICB1bnNpZ25lZCBpbnQgZGVmYXVsdF90eXBlOwotICAgICAgICB1bnNpZ25lZCBpbnQgaSwgbWF4OwotICAgICAgICBjbXNIUFJPRklMRSBpbiwgb3V0OwotICAgICAgICBjbXNIVFJBTlNGT1JNIHRyYW5zZm9ybTsKLSAgICAgICAgY21zVUludDE2TnVtYmVyIFJHQlszXTsKLSAgICAgICAgY21zQ0lFTGFiIExhYjsKLSAgICAgICAgaW4gPSBjbXNDcmVhdGVMYWI0UHJvZmlsZShOVUxMKTsKLSAgICAgICAgb3V0ID0gY21zQ3JlYXRlX3NSR0JQcm9maWxlKCk7Ci0gICAgICAgIHRyYW5zZm9ybSA9Ci0gICAgICAgICAgICBjbXNDcmVhdGVUcmFuc2Zvcm0oaW4sIFRZUEVfTGFiX0RCTCwgb3V0LCBUWVBFX1JHQl8xNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTlRfUEVSQ0VQVFVBTCwgMCk7Ci0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShpbik7Ci0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShvdXQpOwotICAgICAgICBpZih0cmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHByZWMwID0gKGRvdWJsZSlpbWFnZS0+Y29tcHNbMF0ucHJlYzsKLSAgICAgICAgcHJlYzEgPSAoZG91YmxlKWltYWdlLT5jb21wc1sxXS5wcmVjOwotICAgICAgICBwcmVjMiA9IChkb3VibGUpaW1hZ2UtPmNvbXBzWzJdLnByZWM7Ci0gICAgICAgIGRlZmF1bHRfdHlwZSA9IHJvd1sxXTsKLSAgICAgICAgaWYoZGVmYXVsdF90eXBlID09IDB4NDQ0NTQ2MDApIHsKLSAgICAgICAgICAgIHJsID0gMTAwOwotICAgICAgICAgICAgcmEgPSAxNzA7Ci0gICAgICAgICAgICByYiA9IDIwMDsKLSAgICAgICAgICAgIG9sID0gMDsKLSAgICAgICAgICAgIG9hID0gcG93KDIsIHByZWMxIC0gMSk7Ci0gICAgICAgICAgICBvYiA9IHBvdygyLCBwcmVjMiAtIDIpICArIHBvdygyLCBwcmVjMiAtIDMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmwgPSByb3dbMl07Ci0gICAgICAgICAgICByYSA9IHJvd1s0XTsKLSAgICAgICAgICAgIHJiID0gcm93WzZdOwotICAgICAgICAgICAgb2wgPSByb3dbM107Ci0gICAgICAgICAgICBvYSA9IHJvd1s1XTsKLSAgICAgICAgICAgIG9iID0gcm93WzddOwotICAgICAgICB9Ci0gICAgICAgIEwgPSBzcmMwID0gaW1hZ2UtPmNvbXBzWzBdLmRhdGE7Ci0gICAgICAgIGEgPSBzcmMxID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7Ci0gICAgICAgIGIgPSBzcmMyID0gaW1hZ2UtPmNvbXBzWzJdLmRhdGE7Ci0gICAgICAgIG1heCA9IGltYWdlLT5jb21wc1swXS53ICogaW1hZ2UtPmNvbXBzWzBdLmg7Ci0gICAgICAgIHJlZCA9IEZYX0FsbG9jKGludCwgbWF4KTsKLSAgICAgICAgaW1hZ2UtPmNvbXBzWzBdLmRhdGEgPSByZWQ7Ci0gICAgICAgIGdyZWVuID0gRlhfQWxsb2MoaW50LCBtYXgpOwotICAgICAgICBpbWFnZS0+Y29tcHNbMV0uZGF0YSA9IGdyZWVuOwotICAgICAgICBibHVlID0gRlhfQWxsb2MoaW50LCBtYXgpOwotICAgICAgICBpbWFnZS0+Y29tcHNbMl0uZGF0YSA9IGJsdWU7Ci0gICAgICAgIG1pbkwgPSAtKHJsICogb2wpIC8gKHBvdygyLCBwcmVjMCkgLSAxKTsKLSAgICAgICAgbWF4TCA9IG1pbkwgKyBybDsKLSAgICAgICAgbWluYSA9IC0ocmEgKiBvYSkgLyAocG93KDIsIHByZWMxKSAtIDEpOwotICAgICAgICBtYXhhID0gbWluYSArIHJhOwotICAgICAgICBtaW5iID0gLShyYiAqIG9iKSAvIChwb3coMiwgcHJlYzIpIC0gMSk7Ci0gICAgICAgIG1heGIgPSBtaW5iICsgcmI7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IG1heDsgKytpKSB7Ci0gICAgICAgICAgICBMYWIuTCA9IG1pbkwgKyAoZG91YmxlKSgqTCkgKiAobWF4TCAtIG1pbkwpIC8gKHBvdygyLCBwcmVjMCkgLSAxKTsKLSAgICAgICAgICAgICsrTDsKLSAgICAgICAgICAgIExhYi5hID0gbWluYSArIChkb3VibGUpKCphKSAqIChtYXhhIC0gbWluYSkgLyAocG93KDIsIHByZWMxKSAtIDEpOwotICAgICAgICAgICAgKythOwotICAgICAgICAgICAgTGFiLmIgPSBtaW5iICsgKGRvdWJsZSkoKmIpICogKG1heGIgLSBtaW5iKSAvIChwb3coMiwgcHJlYzIpIC0gMSk7Ci0gICAgICAgICAgICArK2I7Ci0gICAgICAgICAgICBjbXNEb1RyYW5zZm9ybSh0cmFuc2Zvcm0sICZMYWIsIFJHQiwgMSk7Ci0gICAgICAgICAgICAqcmVkKysgPSBSR0JbMF07Ci0gICAgICAgICAgICAqZ3JlZW4rKyA9IFJHQlsxXTsKLSAgICAgICAgICAgICpibHVlKysgPSBSR0JbMl07Ci0gICAgICAgIH0KLSAgICAgICAgY21zRGVsZXRlVHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0gICAgICAgIEZYX0ZyZWUoc3JjMCk7Ci0gICAgICAgIEZYX0ZyZWUoc3JjMSk7Ci0gICAgICAgIEZYX0ZyZWUoc3JjMik7Ci0gICAgICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKLSAgICAgICAgaW1hZ2UtPmNvbXBzWzBdLnByZWMgPSAxNjsKLSAgICAgICAgaW1hZ2UtPmNvbXBzWzFdLnByZWMgPSAxNjsKLSAgICAgICAgaW1hZ2UtPmNvbXBzWzJdLnByZWMgPSAxNjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLWNsYXNzIENKUFhfRGVjb2RlcgotewotcHVibGljOgotICAgIENKUFhfRGVjb2RlcigpOwotICAgIH5DSlBYX0RlY29kZXIoKTsKLSAgICBGWF9CT09MCUluaXQoY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2RhdGEsIGludCBzcmNfc2l6ZSk7Ci0gICAgdm9pZAlHZXRJbmZvKEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLCBGWF9EV09SRCYgb3V0cHV0X25Db21wcyk7Ci0gICAgRlhfQk9PTAlEZWNvZGUodWludDhfdCogZGVzdF9idWYsIGludCBwaXRjaCwgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpOwotICAgIGNvbnN0IHVpbnQ4X3QqIG1fU3JjRGF0YTsKLSAgICBpbnQgbV9TcmNTaXplOwotICAgIG9wal9pbWFnZV90ICppbWFnZTsKLSAgICBvcGpfY29kZWNfdCogbF9jb2RlYzsKLSAgICBvcGpfc3RyZWFtX3QgKmxfc3RyZWFtOwotICAgIEZYX0JPT0wgbV91c2VDb2xvclNwYWNlOworY2xhc3MgQ0pQWF9EZWNvZGVyIHsKKyBwdWJsaWM6CisgIENKUFhfRGVjb2RlcigpOworICB+Q0pQWF9EZWNvZGVyKCk7CisgIEZYX0JPT0wgSW5pdChjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfZGF0YSwgaW50IHNyY19zaXplKTsKKyAgdm9pZCBHZXRJbmZvKEZYX0RXT1JEJiB3aWR0aCwKKyAgICAgICAgICAgICAgIEZYX0RXT1JEJiBoZWlnaHQsCisgICAgICAgICAgICAgICBGWF9EV09SRCYgY29kZXN0cmVhbV9uQ29tcHMsCisgICAgICAgICAgICAgICBGWF9EV09SRCYgb3V0cHV0X25Db21wcyk7CisgIEZYX0JPT0wgRGVjb2RlKHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yLAorICAgICAgICAgICAgICAgICB1aW50OF90KiBvZmZzZXRzKTsKKyAgY29uc3QgdWludDhfdCogbV9TcmNEYXRhOworICBpbnQgbV9TcmNTaXplOworICBvcGpfaW1hZ2VfdCogaW1hZ2U7CisgIG9wal9jb2RlY190KiBsX2NvZGVjOworICBvcGpfc3RyZWFtX3QqIGxfc3RyZWFtOworICBGWF9CT09MIG1fdXNlQ29sb3JTcGFjZTsKIH07Ci1DSlBYX0RlY29kZXI6OkNKUFhfRGVjb2RlcigpOiBpbWFnZShOVUxMKSwgbF9jb2RlYyhOVUxMKSwgbF9zdHJlYW0oTlVMTCksIG1fdXNlQ29sb3JTcGFjZShGQUxTRSkKLXsKLX0KLUNKUFhfRGVjb2Rlcjo6fkNKUFhfRGVjb2RlcigpCi17Ci0gICAgaWYobF9jb2RlYykgewotICAgICAgICBvcGpfZGVzdHJveV9jb2RlYyhsX2NvZGVjKTsKLSAgICB9Ci0gICAgaWYobF9zdHJlYW0pIHsKLSAgICAgICAgb3BqX3N0cmVhbV9kZXN0cm95KGxfc3RyZWFtKTsKLSAgICB9Ci0gICAgaWYoaW1hZ2UpIHsKLSAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOwotICAgIH0KLX0KLUZYX0JPT0wgQ0pQWF9EZWNvZGVyOjpJbml0KGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhLCBpbnQgc3JjX3NpemUpCi17Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3pKUDJIZWFkZXJbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywgMHg2YSwgMHg1MCwgMHgyMCwgMHgyMCwgMHgwZCwgMHgwYSwgMHg4NywgMHgwYSB9OwotICAgIGlmICghc3JjX2RhdGEgfHwgc3JjX3NpemUgPCBzaXplb2Yoc3pKUDJIZWFkZXIpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW1hZ2UgPSBOVUxMOwotICAgIG1fU3JjRGF0YSA9IHNyY19kYXRhOwotICAgIG1fU3JjU2l6ZSA9IHNyY19zaXplOwotICAgIERlY29kZURhdGEgc3JjRGF0YShjb25zdF9jYXN0PHVuc2lnbmVkIGNoYXIqPihzcmNfZGF0YSksIHNyY19zaXplKTsKLSAgICBsX3N0cmVhbSA9IGZ4X29wal9zdHJlYW1fY3JlYXRlX21lbW9yeV9zdHJlYW0oJnNyY0RhdGEsIE9QSl9KMktfU1RSRUFNX0NIVU5LX1NJWkUsIDEpOwotICAgIGlmIChsX3N0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgb3BqX2RwYXJhbWV0ZXJzX3QgcGFyYW1ldGVyczsKLSAgICBvcGpfc2V0X2RlZmF1bHRfZGVjb2Rlcl9wYXJhbWV0ZXJzKCZwYXJhbWV0ZXJzKTsKLSAgICBwYXJhbWV0ZXJzLmRlY29kX2Zvcm1hdCA9IDA7Ci0gICAgcGFyYW1ldGVycy5jb2RfZm9ybWF0ID0gMzsKLSAgICBpZihGWFNZU19tZW1jbXAobV9TcmNEYXRhLCBzekpQMkhlYWRlciwgc2l6ZW9mKHN6SlAySGVhZGVyKSkgPT0gMCkgewotICAgICAgICBsX2NvZGVjID0gb3BqX2NyZWF0ZV9kZWNvbXByZXNzKE9QSl9DT0RFQ19KUDIpOwotICAgICAgICBwYXJhbWV0ZXJzLmRlY29kX2Zvcm1hdCA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbF9jb2RlYyA9IG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfSjJLKTsKLSAgICB9Ci0gICAgaWYoIWxfY29kZWMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBvcGpfc2V0X2luZm9faGFuZGxlcihsX2NvZGVjLCBmeF9pbmZvX2NhbGxiYWNrLCAwMCk7Ci0gICAgb3BqX3NldF93YXJuaW5nX2hhbmRsZXIobF9jb2RlYywgZnhfd2FybmluZ19jYWxsYmFjaywgMDApOwotICAgIG9wal9zZXRfZXJyb3JfaGFuZGxlcihsX2NvZGVjLCBmeF9lcnJvcl9jYWxsYmFjaywgMDApOwotICAgIGlmICggIW9wal9zZXR1cF9kZWNvZGVyKGxfY29kZWMsICZwYXJhbWV0ZXJzKSApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZighIG9wal9yZWFkX2hlYWRlcihsX3N0cmVhbSwgbF9jb2RlYywgJmltYWdlKSkgewotICAgICAgICBpbWFnZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCFwYXJhbWV0ZXJzLm5iX3RpbGVfdG9fZGVjb2RlKSB7Ci0gICAgICAgIGlmICghb3BqX3NldF9kZWNvZGVfYXJlYShsX2NvZGVjLCBpbWFnZSwgcGFyYW1ldGVycy5EQV94MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuREFfeTAsIHBhcmFtZXRlcnMuREFfeDEsIHBhcmFtZXRlcnMuREFfeTEpKSB7Ci0gICAgICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7Ci0gICAgICAgICAgICBpbWFnZSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEob3BqX2RlY29kZShsX2NvZGVjLCBsX3N0cmVhbSwgaW1hZ2UpICYmIG9wal9lbmRfZGVjb21wcmVzcyhsX2NvZGVjLCBsX3N0cmVhbSkpKSB7Ci0gICAgICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7Ci0gICAgICAgICAgICBpbWFnZSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIW9wal9nZXRfZGVjb2RlZF90aWxlKGxfY29kZWMsIGxfc3RyZWFtLCBpbWFnZSwgcGFyYW1ldGVycy50aWxlX2luZGV4KSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQorQ0pQWF9EZWNvZGVyOjpDSlBYX0RlY29kZXIoKQorICAgIDogaW1hZ2UoTlVMTCksIGxfY29kZWMoTlVMTCksIGxfc3RyZWFtKE5VTEwpLCBtX3VzZUNvbG9yU3BhY2UoRkFMU0UpIHt9CitDSlBYX0RlY29kZXI6On5DSlBYX0RlY29kZXIoKSB7CisgIGlmIChsX2NvZGVjKSB7CisgICAgb3BqX2Rlc3Ryb3lfY29kZWMobF9jb2RlYyk7CisgIH0KKyAgaWYgKGxfc3RyZWFtKSB7CiAgICAgb3BqX3N0cmVhbV9kZXN0cm95KGxfc3RyZWFtKTsKLSAgICBsX3N0cmVhbSA9IE5VTEw7Ci0gICAgaWYoIGltYWdlLT5jb2xvcl9zcGFjZSAhPSBPUEpfQ0xSU1BDX1NZQ0MKLSAgICAgICAgICAgICYmIGltYWdlLT5udW1jb21wcyA9PSAzICYmIGltYWdlLT5jb21wc1swXS5keCA9PSBpbWFnZS0+Y29tcHNbMF0uZHkKLSAgICAgICAgICAgICYmIGltYWdlLT5jb21wc1sxXS5keCAhPSAxICkgewotICAgICAgICBpbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NZQ0M7Ci0gICAgfSBlbHNlIGlmIChpbWFnZS0+bnVtY29tcHMgPD0gMikgewotICAgICAgICBpbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX0dSQVk7Ci0gICAgfQotICAgIGlmKGltYWdlLT5jb2xvcl9zcGFjZSA9PSBPUEpfQ0xSU1BDX1NZQ0MpIHsKLSAgICAgICAgY29sb3Jfc3ljY190b19yZ2IoaW1hZ2UpOwotICAgIH0KLSAgICBpZihpbWFnZS0+aWNjX3Byb2ZpbGVfYnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUoaW1hZ2UtPmljY19wcm9maWxlX2J1Zik7Ci0gICAgICAgIGltYWdlLT5pY2NfcHJvZmlsZV9idWYgPSBOVUxMOwotICAgICAgICBpbWFnZS0+aWNjX3Byb2ZpbGVfbGVuID0gMDsKLSAgICB9Ci0gICAgaWYoIWltYWdlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGltYWdlKSB7CisgICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworICB9CiB9Ci12b2lkIENKUFhfRGVjb2Rlcjo6R2V0SW5mbyhGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsIEZYX0RXT1JEJiBjb2Rlc3RyZWFtX25Db21wcywgRlhfRFdPUkQmIG91dHB1dF9uQ29tcHMpCi17Ci0gICAgd2lkdGggPSAoRlhfRFdPUkQpaW1hZ2UtPngxOwotICAgIGhlaWdodCA9IChGWF9EV09SRClpbWFnZS0+eTE7Ci0gICAgb3V0cHV0X25Db21wcyA9IGNvZGVzdHJlYW1fbkNvbXBzID0gKEZYX0RXT1JEKWltYWdlLT5udW1jb21wczsKK0ZYX0JPT0wgQ0pQWF9EZWNvZGVyOjpJbml0KGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhLCBpbnQgc3JjX3NpemUpIHsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3pKUDJIZWFkZXJbXSA9IHsKKyAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4NmEsIDB4NTAsIDB4MjAsIDB4MjAsIDB4MGQsIDB4MGEsIDB4ODcsIDB4MGF9OworICBpZiAoIXNyY19kYXRhIHx8IHNyY19zaXplIDwgc2l6ZW9mKHN6SlAySGVhZGVyKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbWFnZSA9IE5VTEw7CisgIG1fU3JjRGF0YSA9IHNyY19kYXRhOworICBtX1NyY1NpemUgPSBzcmNfc2l6ZTsKKyAgRGVjb2RlRGF0YSBzcmNEYXRhKGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHNyY19kYXRhKSwgc3JjX3NpemUpOworICBsX3N0cmVhbSA9IGZ4X29wal9zdHJlYW1fY3JlYXRlX21lbW9yeV9zdHJlYW0oJnNyY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSjJLX1NUUkVBTV9DSFVOS19TSVpFLCAxKTsKKyAgaWYgKGxfc3RyZWFtID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgb3BqX2RwYXJhbWV0ZXJzX3QgcGFyYW1ldGVyczsKKyAgb3BqX3NldF9kZWZhdWx0X2RlY29kZXJfcGFyYW1ldGVycygmcGFyYW1ldGVycyk7CisgIHBhcmFtZXRlcnMuZGVjb2RfZm9ybWF0ID0gMDsKKyAgcGFyYW1ldGVycy5jb2RfZm9ybWF0ID0gMzsKKyAgaWYgKEZYU1lTX21lbWNtcChtX1NyY0RhdGEsIHN6SlAySGVhZGVyLCBzaXplb2Yoc3pKUDJIZWFkZXIpKSA9PSAwKSB7CisgICAgbF9jb2RlYyA9IG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfSlAyKTsKKyAgICBwYXJhbWV0ZXJzLmRlY29kX2Zvcm1hdCA9IDE7CisgIH0gZWxzZSB7CisgICAgbF9jb2RlYyA9IG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfSjJLKTsKKyAgfQorICBpZiAoIWxfY29kZWMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgb3BqX3NldF9pbmZvX2hhbmRsZXIobF9jb2RlYywgZnhfaW5mb19jYWxsYmFjaywgMDApOworICBvcGpfc2V0X3dhcm5pbmdfaGFuZGxlcihsX2NvZGVjLCBmeF93YXJuaW5nX2NhbGxiYWNrLCAwMCk7CisgIG9wal9zZXRfZXJyb3JfaGFuZGxlcihsX2NvZGVjLCBmeF9lcnJvcl9jYWxsYmFjaywgMDApOworICBpZiAoIW9wal9zZXR1cF9kZWNvZGVyKGxfY29kZWMsICZwYXJhbWV0ZXJzKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIW9wal9yZWFkX2hlYWRlcihsX3N0cmVhbSwgbF9jb2RlYywgJmltYWdlKSkgeworICAgIGltYWdlID0gTlVMTDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFwYXJhbWV0ZXJzLm5iX3RpbGVfdG9fZGVjb2RlKSB7CisgICAgaWYgKCFvcGpfc2V0X2RlY29kZV9hcmVhKGxfY29kZWMsIGltYWdlLCBwYXJhbWV0ZXJzLkRBX3gwLCBwYXJhbWV0ZXJzLkRBX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLkRBX3gxLCBwYXJhbWV0ZXJzLkRBX3kxKSkgeworICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworICAgICAgaW1hZ2UgPSBOVUxMOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoIShvcGpfZGVjb2RlKGxfY29kZWMsIGxfc3RyZWFtLCBpbWFnZSkgJiYKKyAgICAgICAgICBvcGpfZW5kX2RlY29tcHJlc3MobF9jb2RlYywgbF9zdHJlYW0pKSkgeworICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworICAgICAgaW1hZ2UgPSBOVUxMOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIW9wal9nZXRfZGVjb2RlZF90aWxlKGxfY29kZWMsIGxfc3RyZWFtLCBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMudGlsZV9pbmRleCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgb3BqX3N0cmVhbV9kZXN0cm95KGxfc3RyZWFtKTsKKyAgbF9zdHJlYW0gPSBOVUxMOworICBpZiAoaW1hZ2UtPmNvbG9yX3NwYWNlICE9IE9QSl9DTFJTUENfU1lDQyAmJiBpbWFnZS0+bnVtY29tcHMgPT0gMyAmJgorICAgICAgaW1hZ2UtPmNvbXBzWzBdLmR4ID09IGltYWdlLT5jb21wc1swXS5keSAmJiBpbWFnZS0+Y29tcHNbMV0uZHggIT0gMSkgeworICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1lDQzsKKyAgfSBlbHNlIGlmIChpbWFnZS0+bnVtY29tcHMgPD0gMikgeworICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfR1JBWTsKKyAgfQorICBpZiAoaW1hZ2UtPmNvbG9yX3NwYWNlID09IE9QSl9DTFJTUENfU1lDQykgeworICAgIGNvbG9yX3N5Y2NfdG9fcmdiKGltYWdlKTsKKyAgfQorICBpZiAoaW1hZ2UtPmljY19wcm9maWxlX2J1ZikgeworICAgIEZYX0ZyZWUoaW1hZ2UtPmljY19wcm9maWxlX2J1Zik7CisgICAgaW1hZ2UtPmljY19wcm9maWxlX2J1ZiA9IE5VTEw7CisgICAgaW1hZ2UtPmljY19wcm9maWxlX2xlbiA9IDA7CisgIH0KKyAgaWYgKCFpbWFnZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0pQWF9EZWNvZGVyOjpEZWNvZGUodWludDhfdCogZGVzdF9idWYsIGludCBwaXRjaCwgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3IsIHVpbnQ4X3QqIG9mZnNldHMpCi17Ci0gICAgaW50IGksIHdpZCwgaGVpLCByb3csIGNvbCwgY2hhbm5lbCwgc3JjOwotICAgIHVpbnQ4X3QqIHBDaGFubmVsOwotICAgIHVpbnQ4X3QqIHBTY2FubGluZTsKLSAgICB1aW50OF90KiBwUGl4ZWw7Cit2b2lkIENKUFhfRGVjb2Rlcjo6R2V0SW5mbyhGWF9EV09SRCYgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIG91dHB1dF9uQ29tcHMpIHsKKyAgd2lkdGggPSAoRlhfRFdPUkQpaW1hZ2UtPngxOworICBoZWlnaHQgPSAoRlhfRFdPUkQpaW1hZ2UtPnkxOworICBvdXRwdXRfbkNvbXBzID0gY29kZXN0cmVhbV9uQ29tcHMgPSAoRlhfRFdPUkQpaW1hZ2UtPm51bWNvbXBzOworfQorRlhfQk9PTCBDSlBYX0RlY29kZXI6OkRlY29kZSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb2Zmc2V0cykgeworICBpbnQgaSwgd2lkLCBoZWksIHJvdywgY29sLCBjaGFubmVsLCBzcmM7CisgIHVpbnQ4X3QqIHBDaGFubmVsOworICB1aW50OF90KiBwU2NhbmxpbmU7CisgIHVpbnQ4X3QqIHBQaXhlbDsKIAotICAgIGlmKGltYWdlLT5jb21wc1swXS53ICE9IGltYWdlLT54MSB8fCBpbWFnZS0+Y29tcHNbMF0uaCAhPSBpbWFnZS0+eTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICBpZiAoaW1hZ2UtPmNvbXBzWzBdLncgIT0gaW1hZ2UtPngxIHx8IGltYWdlLT5jb21wc1swXS5oICE9IGltYWdlLT55MSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocGl0Y2g8KGludCkoaW1hZ2UtPmNvbXBzWzBdLncgKiA4ICogaW1hZ2UtPm51bWNvbXBzICsgMzEpPj4gNSA8PCAyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgMHhmZiwgaW1hZ2UtPnkxICogcGl0Y2gpOworICB1aW50OF90KiogY2hhbm5lbF9idWZzID0gRlhfQWxsb2ModWludDhfdCosIGltYWdlLT5udW1jb21wcyk7CisgIEZYX0JPT0wgcmVzdWx0ID0gRkFMU0U7CisgIGludCogYWRqdXN0X2NvbXBzID0gRlhfQWxsb2MoaW50LCBpbWFnZS0+bnVtY29tcHMpOworICBmb3IgKGkgPSAwOyBpIDwgKGludClpbWFnZS0+bnVtY29tcHM7IGkrKykgeworICAgIGNoYW5uZWxfYnVmc1tpXSA9IGRlc3RfYnVmICsgb2Zmc2V0c1tpXTsKKyAgICBhZGp1c3RfY29tcHNbaV0gPSBpbWFnZS0+Y29tcHNbaV0ucHJlYyAtIDg7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICBpZiAoaW1hZ2UtPmNvbXBzW2ldLmR4ICE9IGltYWdlLT5jb21wc1tpIC0gMV0uZHggfHwKKyAgICAgICAgICBpbWFnZS0+Y29tcHNbaV0uZHkgIT0gaW1hZ2UtPmNvbXBzW2kgLSAxXS5keSB8fAorICAgICAgICAgIGltYWdlLT5jb21wc1tpXS5wcmVjICE9IGltYWdlLT5jb21wc1tpIC0gMV0ucHJlYykgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CiAgICAgfQotICAgIGlmKHBpdGNoIDwgKGludCkoaW1hZ2UtPmNvbXBzWzBdLncgKiA4ICogaW1hZ2UtPm51bWNvbXBzICsgMzEpID4+IDUgPDwgMikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgMHhmZiwgaW1hZ2UtPnkxICogcGl0Y2gpOwotICAgIHVpbnQ4X3QqKiBjaGFubmVsX2J1ZnMgPSBGWF9BbGxvYyh1aW50OF90KiwgaW1hZ2UtPm51bWNvbXBzKTsKLSAgICBGWF9CT09MIHJlc3VsdCA9IEZBTFNFOwotICAgIGludCogYWRqdXN0X2NvbXBzID0gRlhfQWxsb2MoaW50LCBpbWFnZS0+bnVtY29tcHMpOwotICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWltYWdlLT5udW1jb21wczsgaSArKykgewotICAgICAgICBjaGFubmVsX2J1ZnNbaV0gPSBkZXN0X2J1ZiArIG9mZnNldHNbaV07Ci0gICAgICAgIGFkanVzdF9jb21wc1tpXSA9IGltYWdlLT5jb21wc1tpXS5wcmVjIC0gODsKLSAgICAgICAgaWYoaSA+IDApIHsKLSAgICAgICAgICAgIGlmKGltYWdlLT5jb21wc1tpXS5keCAhPSBpbWFnZS0+Y29tcHNbaSAtIDFdLmR4Ci0gICAgICAgICAgICAgICAgICAgIHx8IGltYWdlLT5jb21wc1tpXS5keSAhPSBpbWFnZS0+Y29tcHNbaSAtIDFdLmR5Ci0gICAgICAgICAgICAgICAgICAgIHx8IGltYWdlLT5jb21wc1tpXS5wcmVjICE9IGltYWdlLT5jb21wc1tpIC0gMV0ucHJlYykgewotICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgICAgIH0KKyAgfQorICB3aWQgPSBpbWFnZS0+Y29tcHNbMF0udzsKKyAgaGVpID0gaW1hZ2UtPmNvbXBzWzBdLmg7CisgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCAoaW50KWltYWdlLT5udW1jb21wczsgY2hhbm5lbCsrKSB7CisgICAgcENoYW5uZWwgPSBjaGFubmVsX2J1ZnNbY2hhbm5lbF07CisgICAgaWYgKGFkanVzdF9jb21wc1tjaGFubmVsXSA8IDApIHsKKyAgICAgIGZvciAocm93ID0gMDsgcm93IDwgaGVpOyByb3crKykgeworICAgICAgICBwU2NhbmxpbmUgPSBwQ2hhbm5lbCArIHJvdyAqIHBpdGNoOworICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHdpZDsgY29sKyspIHsKKyAgICAgICAgICBwUGl4ZWwgPSBwU2NhbmxpbmUgKyBjb2wgKiBpbWFnZS0+bnVtY29tcHM7CisgICAgICAgICAgc3JjID0gaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLmRhdGFbcm93ICogd2lkICsgY29sXTsKKyAgICAgICAgICBzcmMgKz0gaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLnNnbmQKKyAgICAgICAgICAgICAgICAgICAgID8gMSA8PCAoaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLnByZWMgLSAxKQorICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgICAgIGlmIChhZGp1c3RfY29tcHNbY2hhbm5lbF0gPiAwKSB7CisgICAgICAgICAgICAqcFBpeGVsID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnBQaXhlbCA9ICh1aW50OF90KShzcmMgPDwgLWFkanVzdF9jb21wc1tjaGFubmVsXSk7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIHdpZCA9IGltYWdlLT5jb21wc1swXS53OwotICAgIGhlaSA9IGltYWdlLT5jb21wc1swXS5oOwotICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCAoaW50KWltYWdlLT5udW1jb21wczsgY2hhbm5lbCsrKSB7Ci0gICAgICAgIHBDaGFubmVsID0gY2hhbm5lbF9idWZzW2NoYW5uZWxdOwotICAgICAgICBpZihhZGp1c3RfY29tcHNbY2hhbm5lbF0gPCAwKSB7Ci0gICAgICAgICAgICBmb3Iocm93ID0gMDsgcm93IDwgaGVpOyByb3crKykgewotICAgICAgICAgICAgICAgIHBTY2FubGluZSA9IHBDaGFubmVsICsgcm93ICogcGl0Y2g7Ci0gICAgICAgICAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3aWQ7IGNvbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBQaXhlbCA9IHBTY2FubGluZSArIGNvbCAqIGltYWdlLT5udW1jb21wczsKLSAgICAgICAgICAgICAgICAgICAgc3JjID0gaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLmRhdGFbcm93ICogd2lkICsgY29sXTsKLSAgICAgICAgICAgICAgICAgICAgc3JjICs9IGltYWdlLT5jb21wc1tjaGFubmVsXS5zZ25kID8gMSA8PCAoaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLnByZWMgLSAxKSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZGp1c3RfY29tcHNbY2hhbm5lbF0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcFBpeGVsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwUGl4ZWwgPSAodWludDhfdCkoc3JjIDw8IC1hZGp1c3RfY29tcHNbY2hhbm5lbF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaTsgcm93KyspIHsKKyAgICAgICAgcFNjYW5saW5lID0gcENoYW5uZWwgKyByb3cgKiBwaXRjaDsKKyAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3aWQ7IGNvbCsrKSB7CisgICAgICAgICAgcFBpeGVsID0gcFNjYW5saW5lICsgY29sICogaW1hZ2UtPm51bWNvbXBzOworICAgICAgICAgIGlmICghaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLmRhdGEpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBzcmMgPSBpbWFnZS0+Y29tcHNbY2hhbm5lbF0uZGF0YVtyb3cgKiB3aWQgKyBjb2xdOworICAgICAgICAgIHNyYyArPSBpbWFnZS0+Y29tcHNbY2hhbm5lbF0uc2duZAorICAgICAgICAgICAgICAgICAgICAgPyAxIDw8IChpbWFnZS0+Y29tcHNbY2hhbm5lbF0ucHJlYyAtIDEpCisgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgICAgaWYgKGFkanVzdF9jb21wc1tjaGFubmVsXSAtIDEgPCAwKSB7CisgICAgICAgICAgICAqcFBpeGVsID0gKHVpbnQ4X3QpKChzcmMgPj4gYWRqdXN0X2NvbXBzW2NoYW5uZWxdKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCB0bXBQaXhlbCA9IChzcmMgPj4gYWRqdXN0X2NvbXBzW2NoYW5uZWxdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyYyA+PiAoYWRqdXN0X2NvbXBzW2NoYW5uZWxdIC0gMSkpICUgMik7CisgICAgICAgICAgICBpZiAodG1wUGl4ZWwgPiAyNTUpIHsKKyAgICAgICAgICAgICAgdG1wUGl4ZWwgPSAyNTU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRtcFBpeGVsIDwgMCkgeworICAgICAgICAgICAgICB0bXBQaXhlbCA9IDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3Iocm93ID0gMDsgcm93IDwgaGVpOyByb3crKykgewotICAgICAgICAgICAgICAgIHBTY2FubGluZSA9IHBDaGFubmVsICsgcm93ICogcGl0Y2g7Ci0gICAgICAgICAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3aWQ7IGNvbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBQaXhlbCA9IHBTY2FubGluZSArIGNvbCAqIGltYWdlLT5udW1jb21wczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbWFnZS0+Y29tcHNbY2hhbm5lbF0uZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3JjID0gaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLmRhdGFbcm93ICogd2lkICsgY29sXTsKLSAgICAgICAgICAgICAgICAgICAgc3JjICs9IGltYWdlLT5jb21wc1tjaGFubmVsXS5zZ25kID8gMSA8PCAoaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLnByZWMgLSAxKSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZGp1c3RfY29tcHNbY2hhbm5lbF0gLSAxIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKnBQaXhlbCA9ICh1aW50OF90KSgoc3JjID4+IGFkanVzdF9jb21wc1tjaGFubmVsXSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRtcFBpeGVsID0gKHNyYyA+PiBhZGp1c3RfY29tcHNbY2hhbm5lbF0pICsgKChzcmMgPj4gKGFkanVzdF9jb21wc1tjaGFubmVsXSAtIDEpKSAlIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFBpeGVsID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wUGl4ZWwgPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRtcFBpeGVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFBpeGVsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwUGl4ZWwgPSAodWludDhfdCl0bXBQaXhlbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwUGl4ZWwgPSAodWludDhfdCl0bXBQaXhlbDsKKyAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgcmVzdWx0ID0gVFJVRTsKKyAgfQorICByZXN1bHQgPSBUUlVFOwogCiBkb25lOgotICAgIEZYX0ZyZWUoY2hhbm5lbF9idWZzKTsKLSAgICBGWF9GcmVlKGFkanVzdF9jb21wcyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgRlhfRnJlZShjaGFubmVsX2J1ZnMpOworICBGWF9GcmVlKGFkanVzdF9jb21wcyk7CisgIHJldHVybiByZXN1bHQ7CiB9CiB2b2lkIGluaXRpYWxpemVfdHJhbnNpdGlvbl90YWJsZSgpOwogdm9pZCBpbml0aWFsaXplX3NpZ25pZmljYW5jZV9sdXRzKCk7CiB2b2lkIGluaXRpYWxpemVfc2lnbl9sdXQoKTsKLUNDb2RlY19KcHhNb2R1bGU6OkNDb2RlY19KcHhNb2R1bGUoKQotewotfQotdm9pZCogQ0NvZGVjX0pweE1vZHVsZTo6Q3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSAsIEZYX0JPT0wgdXNlQ29sb3JTcGFjZSkKLXsKLSAgICBDSlBYX0RlY29kZXIqIHBEZWNvZGVyID0gbmV3IENKUFhfRGVjb2RlcjsKLSAgICBwRGVjb2Rlci0+bV91c2VDb2xvclNwYWNlID0gdXNlQ29sb3JTcGFjZTsKLSAgICBpZiAoIXBEZWNvZGVyLT5Jbml0KHNyY19idWYsIHNyY19zaXplKSkgewotICAgICAgICBkZWxldGUgcERlY29kZXI7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gcERlY29kZXI7Ci19Ci12b2lkIENDb2RlY19KcHhNb2R1bGU6OkdldEltYWdlSW5mbyh2b2lkKiBjdHgsIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb2Rlc3RyZWFtX25Db21wcywgRlhfRFdPUkQmIG91dHB1dF9uQ29tcHMpCi17Ci0gICAgQ0pQWF9EZWNvZGVyKiBwRGVjb2RlciA9IChDSlBYX0RlY29kZXIqKWN0eDsKLSAgICBwRGVjb2Rlci0+R2V0SW5mbyh3aWR0aCwgaGVpZ2h0LCBjb2Rlc3RyZWFtX25Db21wcywgb3V0cHV0X25Db21wcyk7Ci19Ci1GWF9CT09MIENDb2RlY19KcHhNb2R1bGU6OkRlY29kZSh2b2lkKiBjdHgsIHVpbnQ4X3QqIGRlc3RfZGF0YSwgaW50IHBpdGNoLCBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwgdWludDhfdCogb2Zmc2V0cykKLXsKLSAgICBDSlBYX0RlY29kZXIqIHBEZWNvZGVyID0gKENKUFhfRGVjb2RlciopY3R4OwotICAgIHJldHVybiBwRGVjb2Rlci0+RGVjb2RlKGRlc3RfZGF0YSwgcGl0Y2gsIGJUcmFuc2xhdGVDb2xvciwgb2Zmc2V0cyk7Ci19Ci12b2lkIENDb2RlY19KcHhNb2R1bGU6OkRlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCkKLXsKLSAgICBDSlBYX0RlY29kZXIqIHBEZWNvZGVyID0gKENKUFhfRGVjb2RlciopY3R4OworQ0NvZGVjX0pweE1vZHVsZTo6Q0NvZGVjX0pweE1vZHVsZSgpIHt9Cit2b2lkKiBDQ29kZWNfSnB4TW9kdWxlOjpDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIHVzZUNvbG9yU3BhY2UpIHsKKyAgQ0pQWF9EZWNvZGVyKiBwRGVjb2RlciA9IG5ldyBDSlBYX0RlY29kZXI7CisgIHBEZWNvZGVyLT5tX3VzZUNvbG9yU3BhY2UgPSB1c2VDb2xvclNwYWNlOworICBpZiAoIXBEZWNvZGVyLT5Jbml0KHNyY19idWYsIHNyY19zaXplKSkgewogICAgIGRlbGV0ZSBwRGVjb2RlcjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcERlY29kZXI7Cit9Cit2b2lkIENDb2RlY19KcHhNb2R1bGU6OkdldEltYWdlSW5mbyh2b2lkKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIG91dHB1dF9uQ29tcHMpIHsKKyAgQ0pQWF9EZWNvZGVyKiBwRGVjb2RlciA9IChDSlBYX0RlY29kZXIqKWN0eDsKKyAgcERlY29kZXItPkdldEluZm8od2lkdGgsIGhlaWdodCwgY29kZXN0cmVhbV9uQ29tcHMsIG91dHB1dF9uQ29tcHMpOworfQorRlhfQk9PTCBDQ29kZWNfSnB4TW9kdWxlOjpEZWNvZGUodm9pZCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvZmZzZXRzKSB7CisgIENKUFhfRGVjb2RlciogcERlY29kZXIgPSAoQ0pQWF9EZWNvZGVyKiljdHg7CisgIHJldHVybiBwRGVjb2Rlci0+RGVjb2RlKGRlc3RfZGF0YSwgcGl0Y2gsIGJUcmFuc2xhdGVDb2xvciwgb2Zmc2V0cyk7Cit9Cit2b2lkIENDb2RlY19KcHhNb2R1bGU6OkRlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCkgeworICBDSlBYX0RlY29kZXIqIHBEZWNvZGVyID0gKENKUFhfRGVjb2RlciopY3R4OworICBkZWxldGUgcERlY29kZXI7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF91bml0dGVzdC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF91bml0dGVzdC5jcHAKaW5kZXggZjg2Nzc4OC4uMGFlMTQ2NCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfdW5pdHRlc3QuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X3VuaXR0ZXN0LmNwcApAQCAtMjAsNDUxICsyMCw0NDcgQEAKIH07CiAKIFRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YU51bGxEZWNvZGVEYXRhKSB7Ci0gICAgdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOwotICAgIERlY29kZURhdGEqIHB0ciA9IG51bGxwdHI7CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKKyAgRGVjb2RlRGF0YSogcHRyID0gbnVsbHB0cjsKIAotICAgIC8vIEVycm9yIGNvZGVzLCBub3Qgc2VndnMsIHNob3VsZCBjYWxsZXJzIHBhc3MgdXMgYSBOVUxMIHBvaW50ZXIuCi0gICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHB0cikpOwotICAgIEVYUEVDVF9FUShrV3JpdGVFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHB0cikpOwotICAgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgxLCBwdHIpKTsKLSAgICBFWFBFQ1RfRkFMU0Uob3BqX3NlZWtfZnJvbV9tZW1vcnkoMSwgcHRyKSk7CisgIC8vIEVycm9yIGNvZGVzLCBub3Qgc2VndnMsIHNob3VsZCBjYWxsZXJzIHBhc3MgdXMgYSBOVUxMIHBvaW50ZXIuCisgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCBwdHIpKTsKKyAgRVhQRUNUX0VRKGtXcml0ZUVycm9yLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgcHRyKSk7CisgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgxLCBwdHIpKTsKKyAgRVhQRUNUX0ZBTFNFKG9wal9zZWVrX2Zyb21fbWVtb3J5KDEsIHB0cikpOwogfQogCiBURVNUKGZ4Y29kZWMsIERlY29kZURhdGFOdWxsU3RyZWFtKSB7Ci0gICAgRGVjb2RlRGF0YSBkZChudWxscHRyLCAwKTsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07CisgIERlY29kZURhdGEgZGQobnVsbHB0ciwgMCk7CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKIAotICAgIC8vIFJlYWRzIG9mIHNpemUgMCBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMCwgJmRkKSk7Ci0gICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CisgIC8vIFJlYWRzIG9mIHNpemUgMCBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KKyAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAwLCAmZGQpKTsKKyAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CiAKLSAgICAvLyBSZWFkcyBvZiBub256ZXJvIHNpemUgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKKyAgLy8gUmVhZHMgb2Ygbm9uemVybyBzaXplIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgorICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZGQpKTsKKyAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CiAKLSAgICAvLyB3cml0ZXMgb2Ygc2l6ZSAwIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyLCAwLCAmZGQpKTsKKyAgLy8gd3JpdGVzIG9mIHNpemUgMCBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KKyAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXIsIDAsICZkZCkpOwogCi0gICAgLy8gd3JpdGVzIG9mIG5vbnplcm8gc2l6ZSBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZkZCkpOworICAvLyB3cml0ZXMgb2Ygbm9uemVybyBzaXplIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgorICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZkZCkpOwogCi0gICAgLy8gU2tpcHMgb2Ygc2l6ZSAwIGFsd2F5cyByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3NraXBfZnJvbV9tZW1vcnkoMCwgJmRkKSk7CisgIC8vIFNraXBzIG9mIHNpemUgMCBhbHdheXMgcmV0dXJuIGFuIGVycm9yIGNvZGUuCisgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgwLCAmZGQpKTsKIAotICAgIC8vIFNraXBzIG9mIG5vbnplcm8gc2l6ZSBhbHdheXMgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9za2lwX2Zyb21fbWVtb3J5KDEsICZkZCkpOworICAvLyBTa2lwcyBvZiBub256ZXJvIHNpemUgYWx3YXlzIHJldHVybiBhbiBlcnJvciBjb2RlLgorICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3NraXBfZnJvbV9tZW1vcnkoMSwgJmRkKSk7CiAKLSAgICAvLyBTZWVrcyB0byAwIG9mZnNldCByZXR1cm4gaW4gZXJyb3IuCi0gICAgRVhQRUNUX0ZBTFNFKG9wal9zZWVrX2Zyb21fbWVtb3J5KDAsICZkZCkpOworICAvLyBTZWVrcyB0byAwIG9mZnNldCByZXR1cm4gaW4gZXJyb3IuCisgIEVYUEVDVF9GQUxTRShvcGpfc2Vla19mcm9tX21lbW9yeSgwLCAmZGQpKTsKIAotICAgIC8vIFNlZWtzIHRvIG5vbi16ZXJvIG9mZnNldHMgcmV0dXJuIGluIGVycm9yLgotICAgIEVYUEVDVF9GQUxTRShvcGpfc2Vla19mcm9tX21lbW9yeSgxLCAmZGQpKTsKKyAgLy8gU2Vla3MgdG8gbm9uLXplcm8gb2Zmc2V0cyByZXR1cm4gaW4gZXJyb3IuCisgIEVYUEVDVF9GQUxTRShvcGpfc2Vla19mcm9tX21lbW9yeSgxLCAmZGQpKTsKIH0KIAogVEVTVChmeGNvZGVjLCBEZWNvZGVEYXRhWmVyb1NpemUpIHsKLSAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCAwKTsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07CisgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIDApOworICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07CiAKLSAgICAvLyBSZWFkcyBvZiBzaXplIDAgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDAsICZkZCkpOwotICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOworICAvLyBSZWFkcyBvZiBzaXplIDAgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCisgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMCwgJmRkKSk7CisgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOwogCi0gICAgLy8gUmVhZHMgb2Ygbm9uemVybyBzaXplIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgJmRkKSk7Ci0gICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CisgIC8vIFJlYWRzIG9mIG5vbnplcm8gc2l6ZSBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KKyAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgJmRkKSk7CisgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOwogCi0gICAgLy8gd3JpdGVzIG9mIHNpemUgMCBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMCwgJmRkKSk7CisgIC8vIHdyaXRlcyBvZiBzaXplIDAgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCisgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyLCAwLCAmZGQpKTsKIAotICAgIC8vIHdyaXRlcyBvZiBub256ZXJvIHNpemUgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZGQpKTsKKyAgLy8gd3JpdGVzIG9mIG5vbnplcm8gc2l6ZSBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KKyAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZGQpKTsKIAotICAgIC8vIFNraXBzIG9mIHNpemUgMCBhbHdheXMgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9za2lwX2Zyb21fbWVtb3J5KDAsICZkZCkpOworICAvLyBTa2lwcyBvZiBzaXplIDAgYWx3YXlzIHJldHVybiBhbiBlcnJvciBjb2RlLgorICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3NraXBfZnJvbV9tZW1vcnkoMCwgJmRkKSk7CiAKLSAgICAvLyBTa2lwcyBvZiBub256ZXJvIHNpemUgYWx3YXlzIHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgxLCAmZGQpKTsKKyAgLy8gU2tpcHMgb2Ygbm9uemVybyBzaXplIGFsd2F5cyByZXR1cm4gYW4gZXJyb3IgY29kZS4KKyAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9za2lwX2Zyb21fbWVtb3J5KDEsICZkZCkpOwogCi0gICAgLy8gU2Vla3MgdG8gMCBvZmZzZXQgcmV0dXJuIGluIGVycm9yLgotICAgIEVYUEVDVF9GQUxTRShvcGpfc2Vla19mcm9tX21lbW9yeSgwLCAmZGQpKTsKKyAgLy8gU2Vla3MgdG8gMCBvZmZzZXQgcmV0dXJuIGluIGVycm9yLgorICBFWFBFQ1RfRkFMU0Uob3BqX3NlZWtfZnJvbV9tZW1vcnkoMCwgJmRkKSk7CiAKLSAgICAvLyBTZWVrcyB0byBub24temVybyBvZmZzZXRzIHJldHVybiBpbiBlcnJvci4KLSAgICBFWFBFQ1RfRkFMU0Uob3BqX3NlZWtfZnJvbV9tZW1vcnkoMSwgJmRkKSk7CisgIC8vIFNlZWtzIHRvIG5vbi16ZXJvIG9mZnNldHMgcmV0dXJuIGluIGVycm9yLgorICBFWFBFQ1RfRkFMU0Uob3BqX3NlZWtfZnJvbV9tZW1vcnkoMSwgJmRkKSk7CiB9CiAKIFRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YVJlYWRJbkJvdW5kcykgewotICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOworICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07CisgIHsKKyAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKIAotICAgICAgICAvLyBFeGFjdCBzaXplZCByZWFkIGluIGEgc2luZ2xlIGNhbGwuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKDh1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDAsIGJ1ZmZlclswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAxLCBidWZmZXJbMV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMiwgYnVmZmVyWzJdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDMsIGJ1ZmZlclszXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg0LCBidWZmZXJbNF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NSwgYnVmZmVyWzVdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODYsIGJ1ZmZlcls2XSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg3LCBidWZmZXJbN10pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzhdKTsKLSAgICB9Ci0gICAgewotICAgICAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKKyAgICAvLyBFeGFjdCBzaXplZCByZWFkIGluIGEgc2luZ2xlIGNhbGwuCisgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIEVYUEVDVF9FUSg4dSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4MDAsIGJ1ZmZlclswXSk7CisgICAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclsxXSk7CisgICAgRVhQRUNUX0VRKDB4MDIsIGJ1ZmZlclsyXSk7CisgICAgRVhQRUNUX0VRKDB4MDMsIGJ1ZmZlclszXSk7CisgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlcls0XSk7CisgICAgRVhQRUNUX0VRKDB4ODUsIGJ1ZmZlcls1XSk7CisgICAgRVhQRUNUX0VRKDB4ODYsIGJ1ZmZlcls2XSk7CisgICAgRVhQRUNUX0VRKDB4ODcsIGJ1ZmZlcls3XSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlcls4XSk7CisgIH0KKyAgeworICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwogCi0gICAgICAgIC8vIFNpbXBsZSByZWFkLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgydSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAyLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDAsIGJ1ZmZlclswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAxLCBidWZmZXJbMV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzJdKTsKKyAgICAvLyBTaW1wbGUgcmVhZC4KKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKDJ1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDIsICZkZCkpOworICAgIEVYUEVDVF9FUSgweDAwLCBidWZmZXJbMF0pOworICAgIEVYUEVDVF9FUSgweDAxLCBidWZmZXJbMV0pOworICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMl0pOwogCi0gICAgICAgIC8vIFJlYWQgb2Ygc2l6ZSAwIGRvZXNuJ3QgYWZmZWN0IHRoaW5ncy4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoMHUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMCwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOworICAgIC8vIFJlYWQgb2Ygc2l6ZSAwIGRvZXNuJ3QgYWZmZWN0IHRoaW5ncy4KKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKDB1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDAsICZkZCkpOworICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOwogCi0gICAgICAgIC8vIFJlYWQgZXhhY3RseSB1cCB0byBlbmQgb2YgZGF0YS4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoNnUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgNiwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAyLCBidWZmZXJbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMywgYnVmZmVyWzFdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlclsyXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg1LCBidWZmZXJbM10pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NiwgYnVmZmVyWzRdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODcsIGJ1ZmZlcls1XSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbNl0pOworICAgIC8vIFJlYWQgZXhhY3RseSB1cCB0byBlbmQgb2YgZGF0YS4KKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKDZ1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDYsICZkZCkpOworICAgIEVYUEVDVF9FUSgweDAyLCBidWZmZXJbMF0pOworICAgIEVYUEVDVF9FUSgweDAzLCBidWZmZXJbMV0pOworICAgIEVYUEVDVF9FUSgweDg0LCBidWZmZXJbMl0pOworICAgIEVYUEVDVF9FUSgweDg1LCBidWZmZXJbM10pOworICAgIEVYUEVDVF9FUSgweDg2LCBidWZmZXJbNF0pOworICAgIEVYUEVDVF9FUSgweDg3LCBidWZmZXJbNV0pOworICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbNl0pOwogCi0gICAgICAgIC8vIFJlYWQgb2Ygc2l6ZSAwIGF0IEVPRiBpcyBzdGlsbCBhbiBlcnJvci4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAwLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7Ci0gICAgfQorICAgIC8vIFJlYWQgb2Ygc2l6ZSAwIGF0IEVPRiBpcyBzdGlsbCBhbiBlcnJvci4KKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMCwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CisgIH0KIH0KIAogVEVTVChmeGNvZGVjLCBEZWNvZGVEYXRhUmVhZEJleW9uZEJvdW5kcykgewotICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOworICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07CisgIHsKKyAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKIAotICAgICAgICAvLyBSZWFkIGJleW9uZCBib3VuZHMgaW4gYSBzaW5nbGUgc3RlcC4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoOHUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKyAxLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDAsIGJ1ZmZlclswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAxLCBidWZmZXJbMV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMiwgYnVmZmVyWzJdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDMsIGJ1ZmZlclszXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg0LCBidWZmZXJbNF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NSwgYnVmZmVyWzVdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODYsIGJ1ZmZlcls2XSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg3LCBidWZmZXJbN10pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzhdKTsKLSAgICB9Ci0gICAgewotICAgICAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKKyAgICAvLyBSZWFkIGJleW9uZCBib3VuZHMgaW4gYSBzaW5nbGUgc3RlcC4KKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKDh1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpICsgMSwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4MDAsIGJ1ZmZlclswXSk7CisgICAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclsxXSk7CisgICAgRVhQRUNUX0VRKDB4MDIsIGJ1ZmZlclsyXSk7CisgICAgRVhQRUNUX0VRKDB4MDMsIGJ1ZmZlclszXSk7CisgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlcls0XSk7CisgICAgRVhQRUNUX0VRKDB4ODUsIGJ1ZmZlcls1XSk7CisgICAgRVhQRUNUX0VRKDB4ODYsIGJ1ZmZlcls2XSk7CisgICAgRVhQRUNUX0VRKDB4ODcsIGJ1ZmZlcls3XSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlcls4XSk7CisgIH0KKyAgeworICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwogCi0gICAgICAgIC8vIFJlYWQgd2VsbCBiZXlvbmQgYm91bmRzIGluIGEgc2luZ2xlIHN0ZXAuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKDh1LCBvcGpfcmVhZF9mcm9tX21lbW9yeSgKLSAgICAgICAgICAgIGJ1ZmZlciwgc3RkOjpudW1lcmljX2xpbWl0czxPUEpfU0laRV9UPjo6bWF4KCksICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMCwgYnVmZmVyWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclsxXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAyLCBidWZmZXJbMl0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMywgYnVmZmVyWzNdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlcls0XSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg1LCBidWZmZXJbNV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NiwgYnVmZmVyWzZdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODcsIGJ1ZmZlcls3XSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbOF0pOwotICAgIH0KLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOworICAgIC8vIFJlYWQgd2VsbCBiZXlvbmQgYm91bmRzIGluIGEgc2luZ2xlIHN0ZXAuCisgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIEVYUEVDVF9FUSg4dSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoCisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzdGQ6Om51bWVyaWNfbGltaXRzPE9QSl9TSVpFX1Q+OjptYXgoKSwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4MDAsIGJ1ZmZlclswXSk7CisgICAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclsxXSk7CisgICAgRVhQRUNUX0VRKDB4MDIsIGJ1ZmZlclsyXSk7CisgICAgRVhQRUNUX0VRKDB4MDMsIGJ1ZmZlclszXSk7CisgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlcls0XSk7CisgICAgRVhQRUNUX0VRKDB4ODUsIGJ1ZmZlcls1XSk7CisgICAgRVhQRUNUX0VRKDB4ODYsIGJ1ZmZlcls2XSk7CisgICAgRVhQRUNUX0VRKDB4ODcsIGJ1ZmZlcls3XSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlcls4XSk7CisgIH0KKyAgeworICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwogCi0gICAgICAgIC8vIFJlYWQgb2Ygc2l6ZSA2IGdldHMgZmlyc3QgNiBieXRlcy4KLSAgICAgICAgLy8gcmVzdCBvZiBidWZmZXIgaW50YWN0LgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSg2dSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCA2LCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDAsIGJ1ZmZlclswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAxLCBidWZmZXJbMV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMiwgYnVmZmVyWzJdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDMsIGJ1ZmZlclszXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg0LCBidWZmZXJbNF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NSwgYnVmZmVyWzVdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlcls2XSk7CisgICAgLy8gUmVhZCBvZiBzaXplIDYgZ2V0cyBmaXJzdCA2IGJ5dGVzLgorICAgIC8vIHJlc3Qgb2YgYnVmZmVyIGludGFjdC4KKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKDZ1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDYsICZkZCkpOworICAgIEVYUEVDVF9FUSgweDAwLCBidWZmZXJbMF0pOworICAgIEVYUEVDVF9FUSgweDAxLCBidWZmZXJbMV0pOworICAgIEVYUEVDVF9FUSgweDAyLCBidWZmZXJbMl0pOworICAgIEVYUEVDVF9FUSgweDAzLCBidWZmZXJbM10pOworICAgIEVYUEVDVF9FUSgweDg0LCBidWZmZXJbNF0pOworICAgIEVYUEVDVF9FUSgweDg1LCBidWZmZXJbNV0pOworICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbNl0pOwogCi0gICAgICAgIC8vIFJlYWQgb2Ygc2l6ZSA2IGdldHMgcmVtYWluaW5nIHR3byBieXRlcy4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoMnUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgNiwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg2LCBidWZmZXJbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NywgYnVmZmVyWzFdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclsyXSk7CisgICAgLy8gUmVhZCBvZiBzaXplIDYgZ2V0cyByZW1haW5pbmcgdHdvIGJ5dGVzLgorICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgICBFWFBFQ1RfRVEoMnUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgNiwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4ODYsIGJ1ZmZlclswXSk7CisgICAgRVhQRUNUX0VRKDB4ODcsIGJ1ZmZlclsxXSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclsyXSk7CiAKLSAgICAgICAgLy8gUmVhZCBvZiA2IG1vcmUgZ2V0cyBub3RoaW5nIGFuZCBsZWF2ZXMgcmVzdCBvZiBidWZmZXIgaW50YWN0LgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDYsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKLSAgICB9CisgICAgLy8gUmVhZCBvZiA2IG1vcmUgZ2V0cyBub3RoaW5nIGFuZCBsZWF2ZXMgcmVzdCBvZiBidWZmZXIgaW50YWN0LgorICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCA2LCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKKyAgfQogfQogCiBURVNUKGZ4Y29kZWMsIERlY29kZURhdGFXcml0ZUluQm91bmRzKSB7Ci0gICAgdW5zaWduZWQgY2hhciBzdHJlYW1bMTZdOwotICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcl9kYXRhW10gPSB7Ci0gICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4ODAsCi0gICAgICAgIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsCi0gICAgfTsKLSAgICB7Ci0gICAgICAgIC8vIFByZXRlbmQgdGhlIHN0cmVhbSBjYW4gb25seSBob2xkIDQgYnl0ZXMuCi0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtLCA0KTsKKyAgdW5zaWduZWQgY2hhciBzdHJlYW1bMTZdOworICBzdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXJfZGF0YVtdID0geworICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwKKyAgfTsKKyAgeworICAgIC8vIFByZXRlbmQgdGhlIHN0cmVhbSBjYW4gb25seSBob2xkIDQgYnl0ZXMuCisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW0sIDQpOwogCi0gICAgICAgIG1lbXNldChzdHJlYW0sIDB4YmQsIHNpemVvZihzdHJlYW0pKTsKLSAgICAgICAgRVhQRUNUX0VRKDR1LCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyX2RhdGEsIDQsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMCwgc3RyZWFtWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDEsIHN0cmVhbVsxXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAyLCBzdHJlYW1bMl0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMywgc3RyZWFtWzNdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIHN0cmVhbVs0XSk7Ci0gICAgfQotICAgIHsKLSAgICAgICAgLy8gUHJldGVuZCB0aGUgc3RyZWFtIGNhbiBvbmx5IGhvbGQgNCBieXRlcy4KLSAgICAgICAgRGVjb2RlRGF0YSBkZChzdHJlYW0sIDQpOworICAgIG1lbXNldChzdHJlYW0sIDB4YmQsIHNpemVvZihzdHJlYW0pKTsKKyAgICBFWFBFQ1RfRVEoNHUsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgNCwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4MDAsIHN0cmVhbVswXSk7CisgICAgRVhQRUNUX0VRKDB4MDEsIHN0cmVhbVsxXSk7CisgICAgRVhQRUNUX0VRKDB4MDIsIHN0cmVhbVsyXSk7CisgICAgRVhQRUNUX0VRKDB4MDMsIHN0cmVhbVszXSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIHN0cmVhbVs0XSk7CisgIH0KKyAgeworICAgIC8vIFByZXRlbmQgdGhlIHN0cmVhbSBjYW4gb25seSBob2xkIDQgYnl0ZXMuCisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW0sIDQpOwogCi0gICAgICAgIG1lbXNldChzdHJlYW0sIDB4YmQsIHNpemVvZihzdHJlYW0pKTsKLSAgICAgICAgRVhQRUNUX0VRKDJ1LCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyX2RhdGEsIDIsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMnUsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgMiwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAwLCBzdHJlYW1bMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMSwgc3RyZWFtWzFdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDAsIHN0cmVhbVsyXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAxLCBzdHJlYW1bM10pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzRdKTsKLSAgICB9CisgICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOworICAgIEVYUEVDVF9FUSgydSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCAyLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMnUsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgMiwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4MDAsIHN0cmVhbVswXSk7CisgICAgRVhQRUNUX0VRKDB4MDEsIHN0cmVhbVsxXSk7CisgICAgRVhQRUNUX0VRKDB4MDAsIHN0cmVhbVsyXSk7CisgICAgRVhQRUNUX0VRKDB4MDEsIHN0cmVhbVszXSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIHN0cmVhbVs0XSk7CisgIH0KIH0KIAogVEVTVChmeGNvZGVjLCBEZWNvZGVEYXRhV3JpdGVCZXlvbmRCb3VuZHMpIHsKLSAgICB1bnNpZ25lZCBjaGFyIHN0cmVhbVsxNl07Ci0gICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmZmVyX2RhdGFbXSA9IHsKLSAgICAgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywKLSAgICAgICAgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywKLSAgICB9OwotICAgIHsKLSAgICAgICAgLy8gUHJldGVuZCB0aGUgc3RyZWFtIGNhbiBvbmx5IGhvbGQgNCBieXRlcy4KLSAgICAgICAgRGVjb2RlRGF0YSBkZChzdHJlYW0sIDQpOworICB1bnNpZ25lZCBjaGFyIHN0cmVhbVsxNl07CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcl9kYXRhW10gPSB7CisgICAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LAorICB9OworICB7CisgICAgLy8gUHJldGVuZCB0aGUgc3RyZWFtIGNhbiBvbmx5IGhvbGQgNCBieXRlcy4KKyAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbSwgNCk7CiAKLSAgICAgICAgLy8gV3JpdGUgZW5kaW5nIHBhc3QgRU9GIHRyYW5zZmVycyB1cCB0aWwgRU9GLgotICAgICAgICBtZW1zZXQoc3RyZWFtLCAweGJkLCBzaXplb2Yoc3RyZWFtKSk7Ci0gICAgICAgIEVYUEVDVF9FUSg0dSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCA1LCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MTAsIHN0cmVhbVswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDExLCBzdHJlYW1bMV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgxMiwgc3RyZWFtWzJdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MTMsIHN0cmVhbVszXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBzdHJlYW1bNF0pOworICAgIC8vIFdyaXRlIGVuZGluZyBwYXN0IEVPRiB0cmFuc2ZlcnMgdXAgdGlsIEVPRi4KKyAgICBtZW1zZXQoc3RyZWFtLCAweGJkLCBzaXplb2Yoc3RyZWFtKSk7CisgICAgRVhQRUNUX0VRKDR1LCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyX2RhdGEsIDUsICZkZCkpOworICAgIEVYUEVDVF9FUSgweDEwLCBzdHJlYW1bMF0pOworICAgIEVYUEVDVF9FUSgweDExLCBzdHJlYW1bMV0pOworICAgIEVYUEVDVF9FUSgweDEyLCBzdHJlYW1bMl0pOworICAgIEVYUEVDVF9FUSgweDEzLCBzdHJlYW1bM10pOworICAgIEVYUEVDVF9FUSgweGJkLCBzdHJlYW1bNF0pOwogCi0gICAgICAgIC8vIFN1YnNlcXVlbnQgd3JpdGVzIGZhaWwuCi0gICAgICAgIG1lbXNldChzdHJlYW0sIDB4YmQsIHNpemVvZihzdHJlYW0pKTsKLSAgICAgICAgRVhQRUNUX0VRKGtXcml0ZUVycm9yLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyX2RhdGEsIDUsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzBdKTsKLSAgICB9Ci0gICAgewotICAgICAgICAvLyBQcmV0ZW5kIHRoZSBzdHJlYW0gY2FuIG9ubHkgaG9sZCA0IGJ5dGVzLgotICAgICAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbSwgNCk7CisgICAgLy8gU3Vic2VxdWVudCB3cml0ZXMgZmFpbC4KKyAgICBtZW1zZXQoc3RyZWFtLCAweGJkLCBzaXplb2Yoc3RyZWFtKSk7CisgICAgRVhQRUNUX0VRKGtXcml0ZUVycm9yLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyX2RhdGEsIDUsICZkZCkpOworICAgIEVYUEVDVF9FUSgweGJkLCBzdHJlYW1bMF0pOworICB9CisgIHsKKyAgICAvLyBQcmV0ZW5kIHRoZSBzdHJlYW0gY2FuIG9ubHkgaG9sZCA0IGJ5dGVzLgorICAgIERlY29kZURhdGEgZGQoc3RyZWFtLCA0KTsKIAotICAgICAgICAvLyBXcml0ZSBlbmRpbmcgcGFzdCBFT0YgKHR3byBzdGVwcykgdHJhbnNmZXJzIHVwIHRpbCBFT0YuCi0gICAgICAgIG1lbXNldChzdHJlYW0sIDB4YmQsIHNpemVvZihzdHJlYW0pKTsKLSAgICAgICAgRVhQRUNUX0VRKDJ1LCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyX2RhdGEsIDIsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMnUsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgNCwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDEwLCBzdHJlYW1bMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgxMSwgc3RyZWFtWzFdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MTAsIHN0cmVhbVsyXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDExLCBzdHJlYW1bM10pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzRdKTsKKyAgICAvLyBXcml0ZSBlbmRpbmcgcGFzdCBFT0YgKHR3byBzdGVwcykgdHJhbnNmZXJzIHVwIHRpbCBFT0YuCisgICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOworICAgIEVYUEVDVF9FUSgydSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCAyLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMnUsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgNCwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4MTAsIHN0cmVhbVswXSk7CisgICAgRVhQRUNUX0VRKDB4MTEsIHN0cmVhbVsxXSk7CisgICAgRVhQRUNUX0VRKDB4MTAsIHN0cmVhbVsyXSk7CisgICAgRVhQRUNUX0VRKDB4MTEsIHN0cmVhbVszXSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIHN0cmVhbVs0XSk7CiAKLSAgICAgICAgLy8gU3Vic2VxdWVudCB3cml0ZXMgZmFpbC4KLSAgICAgICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOwotICAgICAgICBFWFBFQ1RfRVEoa1dyaXRlRXJyb3IsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgNSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBzdHJlYW1bMF0pOwotICAgIH0KKyAgICAvLyBTdWJzZXF1ZW50IHdyaXRlcyBmYWlsLgorICAgIG1lbXNldChzdHJlYW0sIDB4YmQsIHNpemVvZihzdHJlYW0pKTsKKyAgICBFWFBFQ1RfRVEoa1dyaXRlRXJyb3IsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgNSwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIHN0cmVhbVswXSk7CisgIH0KIH0KIAogLy8gTm90ZTogU29tZSBjYXJlIG5lZWRzIHRvIGJlIHRha2VuIGhlcmUgYmVjYXVzZSB0aGUgc2tpcC9zZWVrIGZ1bmN0aW9ucwogLy8gdGFrZSBPUEpfT0ZGX1QncyBhcyBhcmd1bWVudHMsIHdoaWNoIGFyZSB0eXBpY2FsbHkgYSBzaWduZWQgdHlwZS4KIFRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YVNraXApIHsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07Ci0gICAgewotICAgICAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKLQotICAgICAgICAvLyBTa2lwaW5nIHdpdGhpbiBidWZmZXIgaXMgYWxsb3dlZC4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoMSwgb3BqX3NraXBfZnJvbV9tZW1vcnkoMSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgxdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOwotCi0gICAgICAgIC8vIFNraXBpbmcgMCBieXRlcyBjaGFuZ2VzIG5vdGhpbmcuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIG9wal9za2lwX2Zyb21fbWVtb3J5KDAsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAyLCBidWZmZXJbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKLQotICAgICAgICAvLyBTa2lwaW5nIHRvIEVPUy0xIGlzIHBvc3NpYmxlLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSg0LCBvcGpfc2tpcF9mcm9tX21lbW9yeSg0LCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NywgYnVmZmVyWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclsxXSk7Ci0KLSAgICAgICAgLy8gTmV4dCByZWFkIGZhaWxzLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKLSAgICB9Ci0gICAgewotICAgICAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKLQotICAgICAgICAvLyBTa2lwaW5nIGRpcmVjdGx5IHRvIEVPUyBpcyBhbGxvd2VkLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSg4LCBvcGpfc2tpcF9mcm9tX21lbW9yeSg4LCAmZGQpKTsKLQotICAgICAgICAvLyBOZXh0IHJlYWQgZmFpbHMuCi0gICAgICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKLSAgICB9Ci0gICAgewotICAgICAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKLQotICAgICAgICAvLyBTa2lwcGluZyBiZXlvbmQgZW5kIG9mIHN0cmVhbSBpcyBhbGxvd2VkIGFuZCByZXR1cm5zIGZ1bGwgZGlzdGFuY2UuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKDksIG9wal9za2lwX2Zyb21fbWVtb3J5KDksICZkZCkpOwotCi0gICAgICAgIC8vIE5leHQgcmVhZCBmYWlscy4KLSAgICAgICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOwotICAgIH0KLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwotCi0gICAgICAgIC8vIFNraXBwaW5nIHdheSBiZXlvbmQgRU9TIGlzIGFsbG93ZCwgZG9lc24ndCB3cmFwLCBhbmQgcmV0dXJucwotICAgICAgICAvLyBmdWxsIGRpc3RhbmNlLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSg0LCBvcGpfc2tpcF9mcm9tX21lbW9yeSg0LCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX09GRl9UPjo6bWF4KCksIG9wal9za2lwX2Zyb21fbWVtb3J5KAotICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxPUEpfT0ZGX1Q+OjptYXgoKSwgJmRkKSk7Ci0KLSAgICAgICAgLy8gTmV4dCByZWFkIGZhaWxzLiBJZiBpdCBzdWNjZWVkcywgaXQgbWF5IG1lYW4gd2Ugd3JhcHBlZC4KLSAgICAgICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOwotICAgIH0KLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwotCi0gICAgICAgIC8vIE5lZ2F0aXZlIHNraXAgd2l0aGluIGJ1ZmZlciBub3QgaXMgYWxsb3dlZCwgcG9zaXRpb24gdW5jaGFuZ2VkLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSg0LCBvcGpfc2tpcF9mcm9tX21lbW9yeSg0LCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKGtTa2lwRXJyb3IsIG9wal9za2lwX2Zyb21fbWVtb3J5KC0yLCAmZGQpKTsKLQotICAgICAgICAvLyBOZXh0IHJlYWQgc3VjY2VlZHMgYXMgaWYgbm90aGluZyBoYXMgaGFwcGVubmVkLgotICAgICAgICBFWFBFQ1RfRVEoMXUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg0LCBidWZmZXJbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKLQotICAgICAgICAvLyBOZWdhdGl2ZSBza2lwIGJlZm9yZSBidWZmZXIgaXMgbm90IGFsbG93ZWQsIHBvc2l0aW9uIHVuY2hhbmdlZC4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoa1NraXBFcnJvciwgb3BqX3NraXBfZnJvbV9tZW1vcnkoLTQsICZkZCkpOwotCi0gICAgICAgIC8vIE5leHQgcmVhZCBzdWNjZWVkcyBhcyBpZiBub3RoaW5nIGhhcyBoYXBwZW5uZWQuCi0gICAgICAgIEVYUEVDVF9FUSgxdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODUsIGJ1ZmZlclswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOwotICAgIH0KLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwotCi0gICAgICAgIC8vIE5lZ2F0aXZlIHNraXAgd2F5IGJlZm9yZSBidWZmZXIgaXMgbm90IGFsbG93ZWQsIGRvZXNuJ3Qgd3JhcAotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSg0LCBvcGpfc2tpcF9mcm9tX21lbW9yeSg0LCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKGtTa2lwRXJyb3IsIG9wal9za2lwX2Zyb21fbWVtb3J5KAotICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxPUEpfT0ZGX1Q+OjptaW4oKSwgJmRkKSk7Ci0KLSAgICAgICAgLy8gTmV4dCByZWFkIHN1Y2NlZWRzLiBJZiBpdCBmYWlscywgaXQgbWF5IG1lYW4gd2Ugd3JhcHBlZC4KLSAgICAgICAgRVhQRUNUX0VRKDEsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg0LCBidWZmZXJbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKLSAgICB9Ci0gICAgewotICAgICAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKLQotICAgICAgICAvLyBOZWdhdGl2ZSBza2lwIGFmdGVyIEVPUyBpc24ndCBhbG93ZWQsIHN0aWxsIEVPUy4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoOCwgb3BqX3NraXBfZnJvbV9tZW1vcnkoOCwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgtNCwgJmRkKSk7Ci0KLSAgICAgICAgLy8gTmV4dCByZWFkIGZhaWxzLgotICAgICAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7Ci0gICAgfQotCi19Ci0KLVRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YVNlZWspIHsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKKyAgewogICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwogCi0gICAgLy8gU2Vla2luZyB3aXRoaW4gYnVmZmVyIGlzIGFsbG93ZWQgYW5kIHJlYWQgc3VjY2VlZHMKKyAgICAvLyBTa2lwaW5nIHdpdGhpbiBidWZmZXIgaXMgYWxsb3dlZC4KICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgRVhQRUNUX1RSVUUob3BqX3NlZWtfZnJvbV9tZW1vcnkoMSwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDEsIG9wal9za2lwX2Zyb21fbWVtb3J5KDEsICZkZCkpOwogICAgIEVYUEVDVF9FUSgxdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKICAgICBFWFBFQ1RfRVEoMHgwMSwgYnVmZmVyWzBdKTsKICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKIAotICAgIC8vIFNlZWtpbmcgYmVmb3JlIHN0YXJ0IHJldHVybnMgZXJyb3IgbGVhdmluZyBwb3NpdGlvbiB1bmNoYW5nZWQuCisgICAgLy8gU2tpcGluZyAwIGJ5dGVzIGNoYW5nZXMgbm90aGluZy4KICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKG9wal9zZWVrX2Zyb21fbWVtb3J5KC0xLCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMCwgb3BqX3NraXBfZnJvbV9tZW1vcnkoMCwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDF1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwogICAgIEVYUEVDVF9FUSgweDAyLCBidWZmZXJbMF0pOwogICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOwogCi0gICAgLy8gU2Vla2luZyB3YXkgYmVmb3JlIHN0YXJ0IHJldHVybnMgZXJyb3IgbGVhdmluZyBwb3NpdGlvbiB1bmNoYW5nZWQuCisgICAgLy8gU2tpcGluZyB0byBFT1MtMSBpcyBwb3NzaWJsZS4KICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKG9wal9zZWVrX2Zyb21fbWVtb3J5KAotICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPE9QSl9PRkZfVD46Om1pbigpLCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMHgwMywgYnVmZmVyWzBdKTsKLSAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKLQotICAgIC8vIFNlZWtpbmcgZXhhY3RseSB0byBFT1MgaXMgYWxsb3dlZCBidXQgcmVhZCBmYWlscy4KLSAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgRVhQRUNUX1RSVUUob3BqX3NlZWtfZnJvbV9tZW1vcnkoOCwgJmRkKSk7Ci0gICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7Ci0gICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7Ci0KLSAgICAvLyBTZWVraW5nIGJhY2sgdG8gemVybyBvZmZzZXQgaXMgYWxsb3dlZCBhbmQgcmVhZCBzdWNjZWVkcy4KLSAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgRVhQRUNUX1RSVUUob3BqX3NlZWtfZnJvbV9tZW1vcnkoMCwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDQsIG9wal9za2lwX2Zyb21fbWVtb3J5KDQsICZkZCkpOwogICAgIEVYUEVDVF9FUSgxdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMHgwMCwgYnVmZmVyWzBdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NywgYnVmZmVyWzBdKTsKICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKIAotICAgIC8vIFNlZWtpbmcgYmV5b25kIGVuZCBvZiBzdHJlYW0gaXMgYWxsb3dlZCBidXQgcmVhZCBmYWlscy4KKyAgICAvLyBOZXh0IHJlYWQgZmFpbHMuCiAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgIEVYUEVDVF9UUlVFKG9wal9zZWVrX2Zyb21fbWVtb3J5KDE2LCAmZGQpKTsKICAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKKyAgfQorICB7CisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CiAKLSAgICAvLyBTZWVraW5nIHdpdGhpbiBidWZmZXIgYWZ0ZXIgc2VlayBwYXN0IEVPRiByZXN0b3JlcyBnb29kIHN0YXRlLgorICAgIC8vIFNraXBpbmcgZGlyZWN0bHkgdG8gRU9TIGlzIGFsbG93ZWQuCiAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgIEVYUEVDVF9UUlVFKG9wal9zZWVrX2Zyb21fbWVtb3J5KDQsICZkZCkpOworICAgIEVYUEVDVF9FUSg4LCBvcGpfc2tpcF9mcm9tX21lbW9yeSg4LCAmZGQpKTsKKworICAgIC8vIE5leHQgcmVhZCBmYWlscy4KKyAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKKyAgfQorICB7CisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CisKKyAgICAvLyBTa2lwcGluZyBiZXlvbmQgZW5kIG9mIHN0cmVhbSBpcyBhbGxvd2VkIGFuZCByZXR1cm5zIGZ1bGwgZGlzdGFuY2UuCisgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIEVYUEVDVF9FUSg5LCBvcGpfc2tpcF9mcm9tX21lbW9yeSg5LCAmZGQpKTsKKworICAgIC8vIE5leHQgcmVhZCBmYWlscy4KKyAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKKyAgfQorICB7CisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CisKKyAgICAvLyBTa2lwcGluZyB3YXkgYmV5b25kIEVPUyBpcyBhbGxvd2QsIGRvZXNuJ3Qgd3JhcCwgYW5kIHJldHVybnMKKyAgICAvLyBmdWxsIGRpc3RhbmNlLgorICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgICBFWFBFQ1RfRVEoNCwgb3BqX3NraXBfZnJvbV9tZW1vcnkoNCwgJmRkKSk7CisgICAgRVhQRUNUX0VRKHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX09GRl9UPjo6bWF4KCksCisgICAgICAgICAgICAgIG9wal9za2lwX2Zyb21fbWVtb3J5KHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX09GRl9UPjo6bWF4KCksICZkZCkpOworCisgICAgLy8gTmV4dCByZWFkIGZhaWxzLiBJZiBpdCBzdWNjZWVkcywgaXQgbWF5IG1lYW4gd2Ugd3JhcHBlZC4KKyAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKKyAgfQorICB7CisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CisKKyAgICAvLyBOZWdhdGl2ZSBza2lwIHdpdGhpbiBidWZmZXIgbm90IGlzIGFsbG93ZWQsIHBvc2l0aW9uIHVuY2hhbmdlZC4KKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKDQsIG9wal9za2lwX2Zyb21fbWVtb3J5KDQsICZkZCkpOworICAgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgtMiwgJmRkKSk7CisKKyAgICAvLyBOZXh0IHJlYWQgc3VjY2VlZHMgYXMgaWYgbm90aGluZyBoYXMgaGFwcGVubmVkLgogICAgIEVYUEVDVF9FUSgxdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKICAgICBFWFBFQ1RfRVEoMHg4NCwgYnVmZmVyWzBdKTsKICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKIAotICAgIC8vIFNlZWtpbmcgd2F5IGJleW9uZCBFT1MgaXMgYWxsb3dlZCwgZG9lc24ndCB3cmFwLCBhbmQgcmVhZCBmYWlscy4KKyAgICAvLyBOZWdhdGl2ZSBza2lwIGJlZm9yZSBidWZmZXIgaXMgbm90IGFsbG93ZWQsIHBvc2l0aW9uIHVuY2hhbmdlZC4KICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgRVhQRUNUX1RSVUUob3BqX3NlZWtfZnJvbV9tZW1vcnkoCi0gICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX09GRl9UPjo6bWF4KCksICZkZCkpOworICAgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgtNCwgJmRkKSk7CisKKyAgICAvLyBOZXh0IHJlYWQgc3VjY2VlZHMgYXMgaWYgbm90aGluZyBoYXMgaGFwcGVubmVkLgorICAgIEVYUEVDVF9FUSgxdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHg4NSwgYnVmZmVyWzBdKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKKyAgfQorICB7CisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CisKKyAgICAvLyBOZWdhdGl2ZSBza2lwIHdheSBiZWZvcmUgYnVmZmVyIGlzIG5vdCBhbGxvd2VkLCBkb2Vzbid0IHdyYXAKKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKDQsIG9wal9za2lwX2Zyb21fbWVtb3J5KDQsICZkZCkpOworICAgIEVYUEVDVF9FUShrU2tpcEVycm9yLAorICAgICAgICAgICAgICBvcGpfc2tpcF9mcm9tX21lbW9yeShzdGQ6Om51bWVyaWNfbGltaXRzPE9QSl9PRkZfVD46Om1pbigpLCAmZGQpKTsKKworICAgIC8vIE5leHQgcmVhZCBzdWNjZWVkcy4gSWYgaXQgZmFpbHMsIGl0IG1heSBtZWFuIHdlIHdyYXBwZWQuCisgICAgRVhQRUNUX0VRKDEsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlclswXSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclsxXSk7CisgIH0KKyAgeworICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOworCisgICAgLy8gTmVnYXRpdmUgc2tpcCBhZnRlciBFT1MgaXNuJ3QgYWxvd2VkLCBzdGlsbCBFT1MuCisgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIEVYUEVDVF9FUSg4LCBvcGpfc2tpcF9mcm9tX21lbW9yeSg4LCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoa1NraXBFcnJvciwgb3BqX3NraXBfZnJvbV9tZW1vcnkoLTQsICZkZCkpOworCisgICAgLy8gTmV4dCByZWFkIGZhaWxzLgogICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwogICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOworICB9Cit9CisKK1RFU1QoZnhjb2RlYywgRGVjb2RlRGF0YVNlZWspIHsKKyAgdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOworICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKKworICAvLyBTZWVraW5nIHdpdGhpbiBidWZmZXIgaXMgYWxsb3dlZCBhbmQgcmVhZCBzdWNjZWVkcworICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgIEVYUEVDVF9UUlVFKG9wal9zZWVrX2Zyb21fbWVtb3J5KDEsICZkZCkpOworICBFWFBFQ1RfRVEoMXUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7CisgIEVYUEVDVF9FUSgweDAxLCBidWZmZXJbMF0pOworICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKKworICAvLyBTZWVraW5nIGJlZm9yZSBzdGFydCByZXR1cm5zIGVycm9yIGxlYXZpbmcgcG9zaXRpb24gdW5jaGFuZ2VkLgorICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgIEVYUEVDVF9GQUxTRShvcGpfc2Vla19mcm9tX21lbW9yeSgtMSwgJmRkKSk7CisgIEVYUEVDVF9FUSgxLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOworICBFWFBFQ1RfRVEoMHgwMiwgYnVmZmVyWzBdKTsKKyAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclsxXSk7CisKKyAgLy8gU2Vla2luZyB3YXkgYmVmb3JlIHN0YXJ0IHJldHVybnMgZXJyb3IgbGVhdmluZyBwb3NpdGlvbiB1bmNoYW5nZWQuCisgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgb3BqX3NlZWtfZnJvbV9tZW1vcnkoc3RkOjpudW1lcmljX2xpbWl0czxPUEpfT0ZGX1Q+OjptaW4oKSwgJmRkKSk7CisgIEVYUEVDVF9FUSgxLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOworICBFWFBFQ1RfRVEoMHgwMywgYnVmZmVyWzBdKTsKKyAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclsxXSk7CisKKyAgLy8gU2Vla2luZyBleGFjdGx5IHRvIEVPUyBpcyBhbGxvd2VkIGJ1dCByZWFkIGZhaWxzLgorICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgIEVYUEVDVF9UUlVFKG9wal9zZWVrX2Zyb21fbWVtb3J5KDgsICZkZCkpOworICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKKyAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CisKKyAgLy8gU2Vla2luZyBiYWNrIHRvIHplcm8gb2Zmc2V0IGlzIGFsbG93ZWQgYW5kIHJlYWQgc3VjY2VlZHMuCisgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgRVhQRUNUX1RSVUUob3BqX3NlZWtfZnJvbV9tZW1vcnkoMCwgJmRkKSk7CisgIEVYUEVDVF9FUSgxdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKKyAgRVhQRUNUX0VRKDB4MDAsIGJ1ZmZlclswXSk7CisgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOworCisgIC8vIFNlZWtpbmcgYmV5b25kIGVuZCBvZiBzdHJlYW0gaXMgYWxsb3dlZCBidXQgcmVhZCBmYWlscy4KKyAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICBFWFBFQ1RfVFJVRShvcGpfc2Vla19mcm9tX21lbW9yeSgxNiwgJmRkKSk7CisgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOworICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKKworICAvLyBTZWVraW5nIHdpdGhpbiBidWZmZXIgYWZ0ZXIgc2VlayBwYXN0IEVPRiByZXN0b3JlcyBnb29kIHN0YXRlLgorICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgIEVYUEVDVF9UUlVFKG9wal9zZWVrX2Zyb21fbWVtb3J5KDQsICZkZCkpOworICBFWFBFQ1RfRVEoMXUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7CisgIEVYUEVDVF9FUSgweDg0LCBidWZmZXJbMF0pOworICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKKworICAvLyBTZWVraW5nIHdheSBiZXlvbmQgRU9TIGlzIGFsbG93ZWQsIGRvZXNuJ3Qgd3JhcCwgYW5kIHJlYWQgZmFpbHMuCisgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgRVhQRUNUX1RSVUUob3BqX3NlZWtfZnJvbV9tZW1vcnkoc3RkOjpudW1lcmljX2xpbWl0czxPUEpfT0ZGX1Q+OjptYXgoKSwgJmRkKSk7CisgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOworICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcG5nLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcG5nLmNwcAppbmRleCBiOTZjY2Y2Li5mODI0NDE0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3BuZy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wbmcuY3BwCkBAIC0xMSwyMzggKzExLDI0MiBAQAogI3VuZGVmIEZBUg0KICNpbmNsdWRlICIuLi9meF9scG5nL2luY2x1ZGUvZnhfcG5nLmgiDQogfQ0KLXN0YXRpYyB2b2lkIF9wbmdfZXJyb3JfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbXNnKQ0KLXsNCi0gICAgaWYocG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cikpIHsNCi0gICAgICAgIEZYU1lTX3N0cm5jcHkoKGNoYXIqKXBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpLCBlcnJvcl9tc2csIFBOR19FUlJPUl9TSVpFIC0gMSk7DQotICAgIH0NCi0gICAgbG9uZ2ptcChwbmdfam1wYnVmKHBuZ19wdHIpLCAxKTsNCitzdGF0aWMgdm9pZCBfcG5nX2Vycm9yX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21zZykgew0KKyAgaWYgKHBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpKSB7DQorICAgIEZYU1lTX3N0cm5jcHkoKGNoYXIqKXBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpLCBlcnJvcl9tc2csDQorICAgICAgICAgICAgICAgICAgUE5HX0VSUk9SX1NJWkUgLSAxKTsNCisgIH0NCisgIGxvbmdqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSwgMSk7DQogfQ0KLXN0YXRpYyB2b2lkIF9wbmdfd2FybmluZ19kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tc2cpDQotew0KLX0NCi1zdGF0aWMgdm9pZCBfcG5nX2xvYWRfYm1wX2F0dHJpYnV0ZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpDQotew0KLSAgICBpZiAocEF0dHJpYnV0ZSkgew0KK3N0YXRpYyB2b2lkIF9wbmdfd2FybmluZ19kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tc2cpIHt9DQorc3RhdGljIHZvaWQgX3BuZ19sb2FkX2JtcF9hdHRyaWJ1dGUocG5nX3N0cnVjdHAgcG5nX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfaW5mb3AgaW5mb19wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgew0KKyAgaWYgKHBBdHRyaWJ1dGUpIHsNCiAjaWYgZGVmaW5lZChQTkdfcEhZc19TVVBQT1JURUQpDQotICAgICAgICBwQXR0cmlidXRlLT5tX25YRFBJID0gcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwgaW5mb19wdHIpOw0KLSAgICAgICAgcEF0dHJpYnV0ZS0+bV9uWURQSSA9IHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsIGluZm9fcHRyKTsNCi0gICAgICAgIHBuZ191aW50XzMyIHJlc194LCByZXNfeTsNCi0gICAgICAgIGludCB1bml0X3R5cGU7DQotICAgICAgICBwbmdfZ2V0X3BIWXMocG5nX3B0ciwgaW5mb19wdHIsICZyZXNfeCwgJnJlc195LCAmdW5pdF90eXBlKTsNCi0gICAgICAgIHN3aXRjaCAodW5pdF90eXBlKSB7DQotICAgICAgICAgICAgY2FzZSBQTkdfUkVTT0xVVElPTl9NRVRFUjoNCi0gICAgICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV93RFBJVW5pdCA9IEZYQ09ERUNfUkVTVU5JVF9NRVRFUjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV93RFBJVW5pdCA9IEZYQ09ERUNfUkVTVU5JVF9OT05FOw0KLSAgICAgICAgfQ0KKyAgICBwQXR0cmlidXRlLT5tX25YRFBJID0gcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwgaW5mb19wdHIpOw0KKyAgICBwQXR0cmlidXRlLT5tX25ZRFBJID0gcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwgaW5mb19wdHIpOw0KKyAgICBwbmdfdWludF8zMiByZXNfeCwgcmVzX3k7DQorICAgIGludCB1bml0X3R5cGU7DQorICAgIHBuZ19nZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnJlc194LCAmcmVzX3ksICZ1bml0X3R5cGUpOw0KKyAgICBzd2l0Y2ggKHVuaXRfdHlwZSkgew0KKyAgICAgIGNhc2UgUE5HX1JFU09MVVRJT05fTUVURVI6DQorICAgICAgICBwQXR0cmlidXRlLT5tX3dEUElVbml0ID0gRlhDT0RFQ19SRVNVTklUX01FVEVSOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQgPSBGWENPREVDX1JFU1VOSVRfTk9ORTsNCisgICAgfQ0KICNlbmRpZg0KICNpZiBkZWZpbmVkKFBOR19pQ0NQX1NVUFBPUlRFRCkNCi0gICAgICAgIHBuZ19jaGFycCBpY2NfbmFtZTsNCi0gICAgICAgIHBuZ19ieXRlcCBpY2NfcHJvZmlsZTsNCi0gICAgICAgIHBuZ191aW50XzMyIGljY19wcm9mbGVuOw0KLSAgICAgICAgaW50IGNvbXByZXNzX3R5cGU7DQotICAgICAgICBwbmdfZ2V0X2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsICZpY2NfbmFtZSwgJmNvbXByZXNzX3R5cGUsICZpY2NfcHJvZmlsZSwgJmljY19wcm9mbGVuKTsNCisgICAgcG5nX2NoYXJwIGljY19uYW1lOw0KKyAgICBwbmdfYnl0ZXAgaWNjX3Byb2ZpbGU7DQorICAgIHBuZ191aW50XzMyIGljY19wcm9mbGVuOw0KKyAgICBpbnQgY29tcHJlc3NfdHlwZTsNCisgICAgcG5nX2dldF9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCAmaWNjX25hbWUsICZjb21wcmVzc190eXBlLCAmaWNjX3Byb2ZpbGUsDQorICAgICAgICAgICAgICAgICAmaWNjX3Byb2ZsZW4pOw0KICNlbmRpZg0KLSAgICAgICAgaW50IGJUaW1lID0gMDsNCisgICAgaW50IGJUaW1lID0gMDsNCiAjaWYgZGVmaW5lZChQTkdfdElNRV9TVVBQT1JURUQpDQotICAgICAgICBwbmdfdGltZXAgdCA9IE5VTEw7DQotICAgICAgICBwbmdfZ2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZ0KTsNCi0gICAgICAgIGlmICh0KSB7DQotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KHBBdHRyaWJ1dGUtPm1fc3RyVGltZSwgMCwgc2l6ZW9mKHBBdHRyaWJ1dGUtPm1fc3RyVGltZSkpOw0KLSAgICAgICAgICAgIEZYU1lTX3NucHJpbnRmKChGWF9DSEFSKilwQXR0cmlidXRlLT5tX3N0clRpbWUsIHNpemVvZihwQXR0cmlidXRlLT5tX3N0clRpbWUpLCAiJTRkOiUyZDolMmQgJTJkOiUyZDolMmQiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnllYXIsIHQtPm1vbnRoLCB0LT5kYXksIHQtPmhvdXIsIHQtPm1pbnV0ZSwgdC0+c2Vjb25kKTsNCi0gICAgICAgICAgICBwQXR0cmlidXRlLT5tX3N0clRpbWVbc2l6ZW9mKHBBdHRyaWJ1dGUtPm1fc3RyVGltZSkgLSAxXSA9IDA7DQotICAgICAgICAgICAgYlRpbWUgPSAxOw0KLSAgICAgICAgfQ0KKyAgICBwbmdfdGltZXAgdCA9IE5VTEw7DQorICAgIHBuZ19nZXRfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgJnQpOw0KKyAgICBpZiAodCkgew0KKyAgICAgIEZYU1lTX21lbXNldChwQXR0cmlidXRlLT5tX3N0clRpbWUsIDAsIHNpemVvZihwQXR0cmlidXRlLT5tX3N0clRpbWUpKTsNCisgICAgICBGWFNZU19zbnByaW50ZigoRlhfQ0hBUiopcEF0dHJpYnV0ZS0+bV9zdHJUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwQXR0cmlidXRlLT5tX3N0clRpbWUpLCAiJTRkOiUyZDolMmQgJTJkOiUyZDolMmQiLA0KKyAgICAgICAgICAgICAgICAgICAgIHQtPnllYXIsIHQtPm1vbnRoLCB0LT5kYXksIHQtPmhvdXIsIHQtPm1pbnV0ZSwgdC0+c2Vjb25kKTsNCisgICAgICBwQXR0cmlidXRlLT5tX3N0clRpbWVbc2l6ZW9mKHBBdHRyaWJ1dGUtPm1fc3RyVGltZSkgLSAxXSA9IDA7DQorICAgICAgYlRpbWUgPSAxOw0KKyAgICB9DQogI2VuZGlmDQogI2lmIGRlZmluZWQoUE5HX1RFWFRfU1VQUE9SVEVEKQ0KLSAgICAgICAgaW50IGk7DQotICAgICAgICBGWF9EV09SRCBsZW47DQotICAgICAgICBjb25zdCBGWF9DSEFSKiBidWY7DQotICAgICAgICBpbnQgbnVtX3RleHQ7DQotICAgICAgICBwbmdfdGV4dHAgdGV4dCA9IE5VTEw7DQotICAgICAgICBwbmdfZ2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsICZ0ZXh0LCAmbnVtX3RleHQpOw0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90ZXh0OyBpKyspIHsNCi0gICAgICAgICAgICBsZW4gPSAoRlhfRFdPUkQpRlhTWVNfc3RybGVuKHRleHRbaV0ua2V5KTsNCi0gICAgICAgICAgICBidWYgPSAiVGltZSI7DQotICAgICAgICAgICAgaWYgKCFGWFNZU19tZW1jbXAoYnVmLCB0ZXh0W2ldLmtleSwgRlhfTUlOKGxlbiwgRlhTWVNfc3RybGVuKGJ1ZikpKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoIWJUaW1lKSB7DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQocEF0dHJpYnV0ZS0+bV9zdHJUaW1lLCAwLCBzaXplb2YocEF0dHJpYnV0ZS0+bV9zdHJUaW1lKSk7DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkocEF0dHJpYnV0ZS0+bV9zdHJUaW1lLCB0ZXh0W2ldLnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9NSU4oc2l6ZW9mKHBBdHRyaWJ1dGUtPm1fc3RyVGltZSkgLSAxLCB0ZXh0W2ldLnRleHRfbGVuZ3RoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBidWYgPSAiQXV0aG9yIjsNCi0gICAgICAgICAgICAgICAgaWYgKCFGWFNZU19tZW1jbXAoYnVmLCB0ZXh0W2ldLmtleSwgRlhfTUlOKGxlbiwgRlhTWVNfc3RybGVuKGJ1ZikpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV9zdHJBdXRob3IuRW1wdHkoKTsNCi0gICAgICAgICAgICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyQXV0aG9yLkxvYWQoKHVpbnQ4X3QqKXRleHRbaV0udGV4dCwgKEZYX1NUUlNJWkUpdGV4dFtpXS50ZXh0X2xlbmd0aCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQorICAgIGludCBpOw0KKyAgICBGWF9EV09SRCBsZW47DQorICAgIGNvbnN0IEZYX0NIQVIqIGJ1ZjsNCisgICAgaW50IG51bV90ZXh0Ow0KKyAgICBwbmdfdGV4dHAgdGV4dCA9IE5VTEw7DQorICAgIHBuZ19nZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgJnRleHQsICZudW1fdGV4dCk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGV4dDsgaSsrKSB7DQorICAgICAgbGVuID0gKEZYX0RXT1JEKUZYU1lTX3N0cmxlbih0ZXh0W2ldLmtleSk7DQorICAgICAgYnVmID0gIlRpbWUiOw0KKyAgICAgIGlmICghRlhTWVNfbWVtY21wKGJ1ZiwgdGV4dFtpXS5rZXksIEZYX01JTihsZW4sIEZYU1lTX3N0cmxlbihidWYpKSkpIHsNCisgICAgICAgIGlmICghYlRpbWUpIHsNCisgICAgICAgICAgRlhTWVNfbWVtc2V0KHBBdHRyaWJ1dGUtPm1fc3RyVGltZSwgMCwgc2l6ZW9mKHBBdHRyaWJ1dGUtPm1fc3RyVGltZSkpOw0KKyAgICAgICAgICBGWFNZU19tZW1jcHkoDQorICAgICAgICAgICAgICBwQXR0cmlidXRlLT5tX3N0clRpbWUsIHRleHRbaV0udGV4dCwNCisgICAgICAgICAgICAgIEZYX01JTihzaXplb2YocEF0dHJpYnV0ZS0+bV9zdHJUaW1lKSAtIDEsIHRleHRbaV0udGV4dF9sZW5ndGgpKTsNCiAgICAgICAgIH0NCi0jZW5kaWYNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgYnVmID0gIkF1dGhvciI7DQorICAgICAgICBpZiAoIUZYU1lTX21lbWNtcChidWYsIHRleHRbaV0ua2V5LCBGWF9NSU4obGVuLCBGWFNZU19zdHJsZW4oYnVmKSkpKSB7DQorICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyQXV0aG9yLkVtcHR5KCk7DQorICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyQXV0aG9yLkxvYWQoKHVpbnQ4X3QqKXRleHRbaV0udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfU1RSU0laRSl0ZXh0W2ldLnRleHRfbGVuZ3RoKTsNCisgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCisjZW5kaWYNCisgIH0NCiB9DQogc3RydWN0IEZYUE5HX0NvbnRleHQgew0KLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyOw0KLSAgICBwbmdfaW5mb3AJaW5mb19wdHI7DQotICAgIHZvaWQqCQlwYXJlbnRfcHRyOw0KLSAgICB2b2lkKgkJY2hpbGRfcHRyOw0KKyAgcG5nX3N0cnVjdHAgcG5nX3B0cjsNCisgIHBuZ19pbmZvcCBpbmZvX3B0cjsNCisgIHZvaWQqIHBhcmVudF9wdHI7DQorICB2b2lkKiBjaGlsZF9wdHI7DQogDQotICAgIHZvaWQqCQkoKm1fQWxsb2NGdW5jKSh1bnNpZ25lZCBpbnQpOw0KLSAgICB2b2lkCQkoKm1fRnJlZUZ1bmMpKHZvaWQqKTsNCisgIHZvaWQqICgqbV9BbGxvY0Z1bmMpKHVuc2lnbmVkIGludCk7DQorICB2b2lkICgqbV9GcmVlRnVuYykodm9pZCopOw0KIH07DQogZXh0ZXJuICJDIiB7DQotICAgIHN0YXRpYyB2b2lkKiBfcG5nX2FsbG9jX2Z1bmModW5zaWduZWQgaW50IHNpemUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGWF9BbGxvYyhjaGFyLCBzaXplKTsNCi0gICAgfQ0KLSAgICBzdGF0aWMgdm9pZCAgX3BuZ19mcmVlX2Z1bmModm9pZCogcCkNCi0gICAgew0KLSAgICAgICAgaWYocCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgRlhfRnJlZShwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KK3N0YXRpYyB2b2lkKiBfcG5nX2FsbG9jX2Z1bmModW5zaWduZWQgaW50IHNpemUpIHsNCisgIHJldHVybiBGWF9BbGxvYyhjaGFyLCBzaXplKTsNCit9DQorc3RhdGljIHZvaWQgX3BuZ19mcmVlX2Z1bmModm9pZCogcCkgew0KKyAgaWYgKHAgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKHApOw0KKyAgfQ0KK30NCiB9Ow0KLXN0YXRpYyB2b2lkIF9wbmdfZ2V0X2hlYWRlcl9mdW5jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikNCi17DQotICAgIEZYUE5HX0NvbnRleHQqIHAgPSAoRlhQTkdfQ29udGV4dCopcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7DQotICAgIGlmKHAgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENDb2RlY19QbmdNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX1BuZ01vZHVsZSopcC0+cGFyZW50X3B0cjsNCi0gICAgaWYocE1vZHVsZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgcG5nX3VpbnRfMzIgd2lkdGggPSAwLCBoZWlnaHQgPSAwOw0KLSAgICBpbnQgYnBjID0gMCwgY29sb3JfdHlwZSA9IDAgLCBjb2xvcl90eXBlMSA9IDAsIHBhc3MgPSAwOw0KLSAgICBkb3VibGUgZ2FtbWEgPSAxLjA7DQotICAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LCAmYnBjLCAmY29sb3JfdHlwZSwgTlVMTCwgTlVMTCwgTlVMTCk7DQotICAgIGNvbG9yX3R5cGUxID0gY29sb3JfdHlwZTsNCi0gICAgaWYoYnBjID4gOCkgew0KLSAgICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsNCi0gICAgfSBlbHNlIGlmKGJwYyA8IDgpIHsNCi0gICAgICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfcHRyKTsNCi0gICAgfQ0KLSAgICBicGMgPSA4Ow0KLSAgICBpZihjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsNCi0gICAgICAgIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IocG5nX3B0cik7DQotICAgIH0NCi0gICAgcGFzcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOw0KLSAgICBpZighcE1vZHVsZS0+UmVhZEhlYWRlckNhbGxiYWNrKHAtPmNoaWxkX3B0ciwgd2lkdGgsIGhlaWdodCwgYnBjLCBwYXNzLCAmY29sb3JfdHlwZSwgJmdhbW1hKSkgew0KLSAgICAgICAgcG5nX2Vycm9yKHAtPnBuZ19wdHIsICJSZWFkIEhlYWRlciBDYWxsYmFjayBFcnJvciIpOw0KLSAgICB9DQotICAgIGludCBpbnRlbnQ7DQotICAgIGlmIChwbmdfZ2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsICZpbnRlbnQpKSB7DQotICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIGdhbW1hLCAwLjQ1NDU1KTsNCitzdGF0aWMgdm9pZCBfcG5nX2dldF9oZWFkZXJfZnVuYyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpIHsNCisgIEZYUE5HX0NvbnRleHQqIHAgPSAoRlhQTkdfQ29udGV4dCopcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7DQorICBpZiAocCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENDb2RlY19QbmdNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX1BuZ01vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgIGlmIChwTW9kdWxlID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcG5nX3VpbnRfMzIgd2lkdGggPSAwLCBoZWlnaHQgPSAwOw0KKyAgaW50IGJwYyA9IDAsIGNvbG9yX3R5cGUgPSAwLCBjb2xvcl90eXBlMSA9IDAsIHBhc3MgPSAwOw0KKyAgZG91YmxlIGdhbW1hID0gMS4wOw0KKyAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZicGMsICZjb2xvcl90eXBlLCBOVUxMLA0KKyAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOw0KKyAgY29sb3JfdHlwZTEgPSBjb2xvcl90eXBlOw0KKyAgaWYgKGJwYyA+IDgpIHsNCisgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsNCisgIH0gZWxzZSBpZiAoYnBjIDwgOCkgew0KKyAgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nX3B0cik7DQorICB9DQorICBicGMgPSA4Ow0KKyAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgew0KKyAgICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKHBuZ19wdHIpOw0KKyAgfQ0KKyAgcGFzcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOw0KKyAgaWYgKCFwTW9kdWxlLT5SZWFkSGVhZGVyQ2FsbGJhY2socC0+Y2hpbGRfcHRyLCB3aWR0aCwgaGVpZ2h0LCBicGMsIHBhc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JfdHlwZSwgJmdhbW1hKSkgew0KKyAgICBwbmdfZXJyb3IocC0+cG5nX3B0ciwgIlJlYWQgSGVhZGVyIENhbGxiYWNrIEVycm9yIik7DQorICB9DQorICBpbnQgaW50ZW50Ow0KKyAgaWYgKHBuZ19nZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgJmludGVudCkpIHsNCisgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBnYW1tYSwgMC40NTQ1NSk7DQorICB9IGVsc2Ugew0KKyAgICBkb3VibGUgaW1hZ2VfZ2FtbWE7DQorICAgIGlmIChwbmdfZ2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsICZpbWFnZV9nYW1tYSkpIHsNCisgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIGdhbW1hLCBpbWFnZV9nYW1tYSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBkb3VibGUgaW1hZ2VfZ2FtbWE7DQotICAgICAgICBpZihwbmdfZ2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsICZpbWFnZV9nYW1tYSkpIHsNCi0gICAgICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIGdhbW1hLCBpbWFnZV9nYW1tYSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgZ2FtbWEsIDAuNDU0NTUpOw0KLSAgICAgICAgfQ0KKyAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgZ2FtbWEsIDAuNDU0NTUpOw0KICAgICB9DQotICAgIHN3aXRjaChjb2xvcl90eXBlKSB7DQotICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6DQotICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE6IHsNCi0gICAgICAgICAgICAgICAgaWYoY29sb3JfdHlwZTEgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgew0KLSAgICAgICAgICAgICAgICAgICAgcG5nX3NldF9yZ2JfdG9fZ3JheShwbmdfcHRyLCAxLCAwLjI5OSwgMC41ODcpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOg0KLSAgICAgICAgICAgIGlmKGNvbG9yX3R5cGUxICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsNCi0gICAgICAgICAgICAgICAgcG5nX2Vycm9yKHAtPnBuZ19wdHIsICJOb3QgU3VwcG9ydCBPdXRwdXQgUGFsZXR0ZSBOb3ciKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoNCi0gICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOg0KLSAgICAgICAgICAgIGlmKCEoY29sb3JfdHlwZTEgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpIHsNCi0gICAgICAgICAgICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgaWYoIShjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpKSB7DQotICAgICAgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19wdHIpOw0KLSAgICB9DQotICAgIGlmKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSAmJiAhKGNvbG9yX3R5cGUxICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpKSB7DQotICAgICAgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAweGZmLCBQTkdfRklMTEVSX0FGVEVSKTsNCi0gICAgfQ0KLSAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7DQorICB9DQorICBzd2l0Y2ggKGNvbG9yX3R5cGUpIHsNCisgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOg0KKyAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE6IHsNCisgICAgICBpZiAoY29sb3JfdHlwZTEgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgew0KKyAgICAgICAgcG5nX3NldF9yZ2JfdG9fZ3JheShwbmdfcHRyLCAxLCAwLjI5OSwgMC41ODcpOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOg0KKyAgICAgIGlmIChjb2xvcl90eXBlMSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSB7DQorICAgICAgICBwbmdfZXJyb3IocC0+cG5nX3B0ciwgIk5vdCBTdXBwb3J0IE91dHB1dCBQYWxldHRlIE5vdyIpOw0KKyAgICAgIH0NCisgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0I6DQorICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOg0KKyAgICAgIGlmICghKGNvbG9yX3R5cGUxICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKSB7DQorICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOw0KKyAgICAgIH0NCisgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIGlmICghKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkpIHsNCisgICAgcG5nX3NldF9zdHJpcF9hbHBoYShwbmdfcHRyKTsNCisgIH0NCisgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEgJiYNCisgICAgICAhKGNvbG9yX3R5cGUxICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpKSB7DQorICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIDB4ZmYsIFBOR19GSUxMRVJfQUZURVIpOw0KKyAgfQ0KKyAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOw0KIH0NCiBzdGF0aWMgdm9pZCBfcG5nX2dldF9lbmRfZnVuYyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpIHt9DQotc3RhdGljIHZvaWQgX3BuZ19nZXRfcm93X2Z1bmMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIG5ld19yb3csIHBuZ191aW50XzMyIHJvd19udW0sIGludCBwYXNzKQ0KLXsNCi0gICAgRlhQTkdfQ29udGV4dCogcCA9IChGWFBOR19Db250ZXh0KilwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKTsNCi0gICAgaWYocCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0NvZGVjX1BuZ01vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfUG5nTW9kdWxlKilwLT5wYXJlbnRfcHRyOw0KLSAgICB1aW50OF90KiBzcmNfYnVmID0gTlVMTDsNCi0gICAgaWYoIXBNb2R1bGUtPkFza1NjYW5saW5lQnVmQ2FsbGJhY2socC0+Y2hpbGRfcHRyLCByb3dfbnVtLCBzcmNfYnVmKSkgew0KLSAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJBc2sgU2NhbmxpbmUgYnVmZmVyIENhbGxiYWNrIEVycm9yIik7DQotICAgIH0NCi0gICAgaWYoc3JjX2J1ZiAhPSBOVUxMKSB7DQotICAgICAgICBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cocG5nX3B0ciwgc3JjX2J1ZiwgbmV3X3Jvdyk7DQotICAgIH0NCi0gICAgcE1vZHVsZS0+RmlsbFNjYW5saW5lQnVmQ29tcGxldGVkQ2FsbGJhY2socC0+Y2hpbGRfcHRyLCBwYXNzLCByb3dfbnVtKTsNCitzdGF0aWMgdm9pZCBfcG5nX2dldF9yb3dfZnVuYyhwbmdfc3RydWN0cCBwbmdfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCBuZXdfcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd19udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhc3MpIHsNCisgIEZYUE5HX0NvbnRleHQqIHAgPSAoRlhQTkdfQ29udGV4dCopcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7DQorICBpZiAocCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENDb2RlY19QbmdNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX1BuZ01vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgIHVpbnQ4X3QqIHNyY19idWYgPSBOVUxMOw0KKyAgaWYgKCFwTW9kdWxlLT5Bc2tTY2FubGluZUJ1ZkNhbGxiYWNrKHAtPmNoaWxkX3B0ciwgcm93X251bSwgc3JjX2J1ZikpIHsNCisgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJBc2sgU2NhbmxpbmUgYnVmZmVyIENhbGxiYWNrIEVycm9yIik7DQorICB9DQorICBpZiAoc3JjX2J1ZiAhPSBOVUxMKSB7DQorICAgIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyhwbmdfcHRyLCBzcmNfYnVmLCBuZXdfcm93KTsNCisgIH0NCisgIHBNb2R1bGUtPkZpbGxTY2FubGluZUJ1ZkNvbXBsZXRlZENhbGxiYWNrKHAtPmNoaWxkX3B0ciwgcGFzcywgcm93X251bSk7DQogfQ0KLXZvaWQqIENDb2RlY19QbmdNb2R1bGU6OlN0YXJ0KHZvaWQqIHBNb2R1bGUpDQotew0KLSAgICBGWFBOR19Db250ZXh0KiBwID0gKEZYUE5HX0NvbnRleHQqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihGWFBOR19Db250ZXh0KSk7DQotICAgIGlmKHAgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQordm9pZCogQ0NvZGVjX1BuZ01vZHVsZTo6U3RhcnQodm9pZCogcE1vZHVsZSkgew0KKyAgRlhQTkdfQ29udGV4dCogcCA9IChGWFBOR19Db250ZXh0KilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoRlhQTkdfQ29udGV4dCkpOw0KKyAgaWYgKHAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHAtPm1fQWxsb2NGdW5jID0gX3BuZ19hbGxvY19mdW5jOw0KKyAgcC0+bV9GcmVlRnVuYyA9IF9wbmdfZnJlZV9mdW5jOw0KKyAgcC0+cG5nX3B0ciA9IE5VTEw7DQorICBwLT5pbmZvX3B0ciA9IE5VTEw7DQorICBwLT5wYXJlbnRfcHRyID0gKHZvaWQqKXRoaXM7DQorICBwLT5jaGlsZF9wdHIgPSBwTW9kdWxlOw0KKyAgcC0+cG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLCBOVUxMLCBOVUxMKTsNCisgIGlmIChwLT5wbmdfcHRyID09IE5VTEwpIHsNCisgICAgRlhfRnJlZShwKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwLT5pbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocC0+cG5nX3B0cik7DQorICBpZiAocC0+aW5mb19wdHIgPT0gTlVMTCkgew0KKyAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmKHAtPnBuZ19wdHIpLCAocG5nX2luZm9wcClOVUxMLCAocG5nX2luZm9wcClOVUxMKTsNCisgICAgRlhfRnJlZShwKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAoc2V0am1wKHBuZ19qbXBidWYocC0+cG5nX3B0cikpKSB7DQorICAgIGlmIChwICE9IE5VTEwpIHsNCisgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmKHAtPnBuZ19wdHIpLCAmKHAtPmluZm9fcHRyKSwgKHBuZ19pbmZvcHApTlVMTCk7DQorICAgICAgRlhfRnJlZShwKTsNCiAgICAgfQ0KLSAgICBwLT5tX0FsbG9jRnVuYyA9IF9wbmdfYWxsb2NfZnVuYzsNCi0gICAgcC0+bV9GcmVlRnVuYyA9IF9wbmdfZnJlZV9mdW5jOw0KLSAgICBwLT5wbmdfcHRyID0gTlVMTDsNCi0gICAgcC0+aW5mb19wdHIgPSBOVUxMOw0KLSAgICBwLT5wYXJlbnRfcHRyID0gKHZvaWQqKXRoaXM7DQotICAgIHAtPmNoaWxkX3B0ciA9IHBNb2R1bGU7DQotICAgIHAtPnBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgTlVMTCwgTlVMTCwgTlVMTCk7DQotICAgIGlmIChwLT5wbmdfcHRyID09IE5VTEwpIHsNCi0gICAgICAgIEZYX0ZyZWUocCk7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBwLT5pbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocC0+cG5nX3B0cik7DQotICAgIGlmIChwLT5pbmZvX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmKHAtPnBuZ19wdHIpLCAocG5nX2luZm9wcClOVUxMLCAocG5nX2luZm9wcClOVUxMKTsNCi0gICAgICAgIEZYX0ZyZWUocCk7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocC0+cG5nX3B0cikpKSB7DQotICAgICAgICBpZihwICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmKHAtPnBuZ19wdHIpLCAmKHAtPmluZm9fcHRyKSwgKHBuZ19pbmZvcHApTlVMTCk7DQotICAgICAgICAgICAgRlhfRnJlZShwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwLT5wbmdfcHRyLCBwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BuZ19nZXRfaGVhZGVyX2Z1bmMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcG5nX2dldF9yb3dfZnVuYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wbmdfZ2V0X2VuZF9mdW5jKTsNCi0gICAgcG5nX3NldF9lcnJvcl9mbihwLT5wbmdfcHRyLCBtX3N6TGFzdEVycm9yLCAocG5nX2Vycm9yX3B0cilfcG5nX2Vycm9yX2RhdGEsIChwbmdfZXJyb3JfcHRyKV9wbmdfd2FybmluZ19kYXRhKTsNCi0gICAgcmV0dXJuIHA7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHAtPnBuZ19wdHIsIHAsIF9wbmdfZ2V0X2hlYWRlcl9mdW5jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wbmdfZ2V0X3Jvd19mdW5jLCBfcG5nX2dldF9lbmRfZnVuYyk7DQorICBwbmdfc2V0X2Vycm9yX2ZuKHAtPnBuZ19wdHIsIG1fc3pMYXN0RXJyb3IsIChwbmdfZXJyb3JfcHRyKV9wbmdfZXJyb3JfZGF0YSwNCisgICAgICAgICAgICAgICAgICAgKHBuZ19lcnJvcl9wdHIpX3BuZ193YXJuaW5nX2RhdGEpOw0KKyAgcmV0dXJuIHA7DQogfQ0KLXZvaWQgQ0NvZGVjX1BuZ01vZHVsZTo6RmluaXNoKHZvaWQqIHBDb250ZXh0KQ0KLXsNCi0gICAgRlhQTkdfQ29udGV4dCogcCA9IChGWFBOR19Db250ZXh0KilwQ29udGV4dDsNCi0gICAgaWYocCAhPSBOVUxMKSB7DQotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmKHAtPnBuZ19wdHIpLCAmKHAtPmluZm9fcHRyKSwgKHBuZ19pbmZvcHApTlVMTCk7DQotICAgICAgICBwLT5tX0ZyZWVGdW5jKHApOw0KLSAgICB9DQordm9pZCBDQ29kZWNfUG5nTW9kdWxlOjpGaW5pc2godm9pZCogcENvbnRleHQpIHsNCisgIEZYUE5HX0NvbnRleHQqIHAgPSAoRlhQTkdfQ29udGV4dCopcENvbnRleHQ7DQorICBpZiAocCAhPSBOVUxMKSB7DQorICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCYocC0+cG5nX3B0ciksICYocC0+aW5mb19wdHIpLCAocG5nX2luZm9wcClOVUxMKTsNCisgICAgcC0+bV9GcmVlRnVuYyhwKTsNCisgIH0NCiB9DQotRlhfQk9PTCBDQ29kZWNfUG5nTW9kdWxlOjpJbnB1dCh2b2lkKiBwQ29udGV4dCwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpDQotew0KLSAgICBGWFBOR19Db250ZXh0KiBwID0gKEZYUE5HX0NvbnRleHQqKXBDb250ZXh0Ow0KLSAgICBpZihzZXRqbXAocG5nX2ptcGJ1ZihwLT5wbmdfcHRyKSkpIHsNCi0gICAgICAgIGlmIChwQXR0cmlidXRlICYmIDAgPT0gRlhTWVNfc3RyY21wKG1fc3pMYXN0RXJyb3IsICJSZWFkIEhlYWRlciBDYWxsYmFjayBFcnJvciIpKSB7DQotICAgICAgICAgICAgX3BuZ19sb2FkX2JtcF9hdHRyaWJ1dGUocC0+cG5nX3B0ciwgcC0+aW5mb19wdHIsIHBBdHRyaWJ1dGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ0NvZGVjX1BuZ01vZHVsZTo6SW5wdXQodm9pZCogcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSB7DQorICBGWFBOR19Db250ZXh0KiBwID0gKEZYUE5HX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgaWYgKHNldGptcChwbmdfam1wYnVmKHAtPnBuZ19wdHIpKSkgew0KKyAgICBpZiAocEF0dHJpYnV0ZSAmJg0KKyAgICAgICAgMCA9PSBGWFNZU19zdHJjbXAobV9zekxhc3RFcnJvciwgIlJlYWQgSGVhZGVyIENhbGxiYWNrIEVycm9yIikpIHsNCisgICAgICBfcG5nX2xvYWRfYm1wX2F0dHJpYnV0ZShwLT5wbmdfcHRyLCBwLT5pbmZvX3B0ciwgcEF0dHJpYnV0ZSk7DQogICAgIH0NCi0gICAgcG5nX3Byb2Nlc3NfZGF0YShwLT5wbmdfcHRyLCBwLT5pbmZvX3B0ciwgKHVpbnQ4X3QqKXNyY19idWYsIHNyY19zaXplKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHBuZ19wcm9jZXNzX2RhdGEocC0+cG5nX3B0ciwgcC0+aW5mb19wdHIsICh1aW50OF90KilzcmNfYnVmLCBzcmNfc2l6ZSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wcm9ncmVzcy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmNwcAppbmRleCAzMzM5OGYwLi4wYWQ0YzJhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmNwcApAQCAtNywyMjMyICs3LDIzNDYgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgiDQogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIg0KICNpbmNsdWRlICJmeF9jb2RlY19wcm9ncmVzcy5oIg0KLXZvaWQgQ0ZYQ09ERUNfV2VpZ2h0VGFibGU6OkNhbGMoaW50IGRlc3RfbGVuLCBpbnQgZGVzdF9taW4sIGludCBkZXN0X21heCwgaW50IHNyY19sZW4sIGludCBzcmNfbWluLCBpbnQgc3JjX21heCwgRlhfQk9PTCBiSW50ZXJwb2wpDQotew0KLSAgICBpZiAobV9wV2VpZ2h0VGFibGVzKSB7DQotICAgICAgICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7DQotICAgIH0NCi0gICAgZG91YmxlIHNjYWxlLCBiYXNlOw0KLSAgICBzY2FsZSA9IEZYU1lTX0RpdigoRlhfRkxPQVQpKHNyY19sZW4pLCAoRlhfRkxPQVQpKGRlc3RfbGVuKSk7DQotICAgIGlmIChkZXN0X2xlbiA8IDApIHsNCi0gICAgICAgIGJhc2UgPSAoRlhfRkxPQVQpKHNyY19sZW4pOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgYmFzZSA9IDAuMGY7DQotICAgIH0NCi0gICAgbV9JdGVtU2l6ZSA9IChpbnQpKHNpemVvZihpbnQpICogMiArIHNpemVvZihpbnQpICogKEZYU1lTX2NlaWwoRlhTWVNfZmFicygoRlhfRkxPQVQpc2NhbGUpKSArIDEpKTsNCi0gICAgbV9EZXN0TWluID0gZGVzdF9taW47DQotICAgIG1fcFdlaWdodFRhYmxlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIChkZXN0X21heCAtIGRlc3RfbWluKSAqIG1fSXRlbVNpemUgKyA0KTsNCi0gICAgaWYobV9wV2VpZ2h0VGFibGVzID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoRlhTWVNfZmFicygoRlhfRkxPQVQpc2NhbGUpIDwgMS4wZikgew0KLSAgICAgICAgZm9yIChpbnQgZGVzdF9waXhlbCA9IGRlc3RfbWluOyBkZXN0X3BpeGVsIDwgZGVzdF9tYXg7IGRlc3RfcGl4ZWwgKyspIHsNCi0gICAgICAgICAgICBQaXhlbFdlaWdodCYgcGl4ZWxfd2VpZ2h0cyA9ICpHZXRQaXhlbFdlaWdodChkZXN0X3BpeGVsKTsNCi0gICAgICAgICAgICBkb3VibGUgc3JjX3BvcyA9IGRlc3RfcGl4ZWwgKiBzY2FsZSArIHNjYWxlIC8gMiArIGJhc2U7DQotICAgICAgICAgICAgaWYgKGJJbnRlcnBvbCkgew0KLSAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfcG9zIC0gMS4wZiAvIDIpOw0KLSAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3BvcyArIDEuMGYgLyAyKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA8IHNyY19taW4pIHsNCi0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHNyY19taW47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPj0gc3JjX21heCkgew0KLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHNyY19tYXggLSAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgew0KLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSA2NTUzNjsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKShzcmNfcG9zIC0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IC0gMS4wZiAvIDIpICogNjU1MzYpOw0KLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSA2NTUzNiAtIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MpOw0KLSAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KLSAgICAgICAgICAgIH0NCit2b2lkIENGWENPREVDX1dlaWdodFRhYmxlOjpDYWxjKGludCBkZXN0X2xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X21pbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X21heCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19taW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX21heCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkludGVycG9sKSB7DQorICBpZiAobV9wV2VpZ2h0VGFibGVzKSB7DQorICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCisgIH0NCisgIGRvdWJsZSBzY2FsZSwgYmFzZTsNCisgIHNjYWxlID0gRlhTWVNfRGl2KChGWF9GTE9BVCkoc3JjX2xlbiksIChGWF9GTE9BVCkoZGVzdF9sZW4pKTsNCisgIGlmIChkZXN0X2xlbiA8IDApIHsNCisgICAgYmFzZSA9IChGWF9GTE9BVCkoc3JjX2xlbik7DQorICB9IGVsc2Ugew0KKyAgICBiYXNlID0gMC4wZjsNCisgIH0NCisgIG1fSXRlbVNpemUgPQ0KKyAgICAgIChpbnQpKHNpemVvZihpbnQpICogMiArDQorICAgICAgICAgICAgc2l6ZW9mKGludCkgKiAoRlhTWVNfY2VpbChGWFNZU19mYWJzKChGWF9GTE9BVClzY2FsZSkpICsgMSkpOw0KKyAgbV9EZXN0TWluID0gZGVzdF9taW47DQorICBtX3BXZWlnaHRUYWJsZXMgPSBGWF9BbGxvYyh1aW50OF90LCAoZGVzdF9tYXggLSBkZXN0X21pbikgKiBtX0l0ZW1TaXplICsgNCk7DQorICBpZiAobV9wV2VpZ2h0VGFibGVzID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKEZYU1lTX2ZhYnMoKEZYX0ZMT0FUKXNjYWxlKSA8IDEuMGYpIHsNCisgICAgZm9yIChpbnQgZGVzdF9waXhlbCA9IGRlc3RfbWluOyBkZXN0X3BpeGVsIDwgZGVzdF9tYXg7IGRlc3RfcGl4ZWwrKykgew0KKyAgICAgIFBpeGVsV2VpZ2h0JiBwaXhlbF93ZWlnaHRzID0gKkdldFBpeGVsV2VpZ2h0KGRlc3RfcGl4ZWwpOw0KKyAgICAgIGRvdWJsZSBzcmNfcG9zID0gZGVzdF9waXhlbCAqIHNjYWxlICsgc2NhbGUgLyAyICsgYmFzZTsNCisgICAgICBpZiAoYkludGVycG9sKSB7DQorICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPQ0KKyAgICAgICAgICAgIChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgLSAxLjBmIC8gMik7DQorICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3BvcyArIDEuMGYgLyAyKTsNCisgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPCBzcmNfbWluKSB7DQorICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHNyY19taW47DQogICAgICAgICB9DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgZm9yIChpbnQgZGVzdF9waXhlbCA9IGRlc3RfbWluOyBkZXN0X3BpeGVsIDwgZGVzdF9tYXg7IGRlc3RfcGl4ZWwgKyspIHsNCi0gICAgICAgIFBpeGVsV2VpZ2h0JiBwaXhlbF93ZWlnaHRzID0gKkdldFBpeGVsV2VpZ2h0KGRlc3RfcGl4ZWwpOw0KLSAgICAgICAgZG91YmxlIHNyY19zdGFydCA9IGRlc3RfcGl4ZWwgKiBzY2FsZSArIGJhc2U7DQotICAgICAgICBkb3VibGUgc3JjX2VuZCA9IHNyY19zdGFydCArIHNjYWxlOw0KLSAgICAgICAgaW50IHN0YXJ0X2ksIGVuZF9pOw0KLSAgICAgICAgaWYgKHNyY19zdGFydCA8IHNyY19lbmQpIHsNCi0gICAgICAgICAgICBzdGFydF9pID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3N0YXJ0KTsNCi0gICAgICAgICAgICBlbmRfaSA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX2VuZCk7DQorICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7DQorICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzcmNfbWF4IC0gMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgew0KKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBzdGFydF9pID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX2VuZCk7DQotICAgICAgICAgICAgZW5kX2kgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19zdGFydCk7DQorICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gRlhTWVNfcm91bmQoDQorICAgICAgICAgICAgICAoRlhfRkxPQVQpKHNyY19wb3MgLSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgLSAxLjBmIC8gMikgKg0KKyAgICAgICAgICAgICAgNjU1MzYpOw0KKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2IC0gcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV07DQogICAgICAgICB9DQotICAgICAgICBpZiAoc3RhcnRfaSA8IHNyY19taW4pIHsNCi0gICAgICAgICAgICBzdGFydF9pID0gc3JjX21pbjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChlbmRfaSA+PSBzcmNfbWF4KSB7DQotICAgICAgICAgICAgZW5kX2kgPSBzcmNfbWF4IC0gMTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChzdGFydF9pID4gZW5kX2kpIHsNCi0gICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydF9pOw0KLSAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzdGFydF9pOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnRfaTsNCi0gICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBlbmRfaTsNCi0gICAgICAgIGZvciAoaW50IGogPSBzdGFydF9pOyBqIDw9IGVuZF9pOyBqICsrKSB7DQotICAgICAgICAgICAgZG91YmxlIGRlc3Rfc3RhcnQgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShqKSAtIGJhc2UsIHNjYWxlKTsNCi0gICAgICAgICAgICBkb3VibGUgZGVzdF9lbmQgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShqICsgMSkgLSBiYXNlLCBzY2FsZSk7DQotICAgICAgICAgICAgaWYgKGRlc3Rfc3RhcnQgPiBkZXN0X2VuZCkgew0KLSAgICAgICAgICAgICAgICBkb3VibGUgdGVtcCA9IGRlc3Rfc3RhcnQ7DQotICAgICAgICAgICAgICAgIGRlc3Rfc3RhcnQgPSBkZXN0X2VuZDsNCi0gICAgICAgICAgICAgICAgZGVzdF9lbmQgPSB0ZW1wOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkb3VibGUgYXJlYV9zdGFydCA9IGRlc3Rfc3RhcnQgPiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwpID8gZGVzdF9zdGFydCA6IChGWF9GTE9BVCkoZGVzdF9waXhlbCk7DQotICAgICAgICAgICAgZG91YmxlIGFyZWFfZW5kID0gZGVzdF9lbmQgPiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwgKyAxKSA/IChGWF9GTE9BVCkoZGVzdF9waXhlbCArIDEpIDogZGVzdF9lbmQ7DQotICAgICAgICAgICAgZG91YmxlIHdlaWdodCA9IGFyZWFfc3RhcnQgPj0gYXJlYV9lbmQgPyAwLjBmIDogYXJlYV9lbmQgLSBhcmVhX3N0YXJ0Ow0KLSAgICAgICAgICAgIGlmICh3ZWlnaHQgPT0gMCAmJiBqID09IGVuZF9pKSB7DQotICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1tqIC0gc3RhcnRfaV0gPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpKHdlaWdodCAqIDY1NTM2KSk7DQotICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPQ0KKyAgICAgICAgICAgIChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MpOw0KKyAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSA2NTUzNjsNCisgICAgICB9DQogICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgZm9yIChpbnQgZGVzdF9waXhlbCA9IGRlc3RfbWluOyBkZXN0X3BpeGVsIDwgZGVzdF9tYXg7IGRlc3RfcGl4ZWwrKykgew0KKyAgICBQaXhlbFdlaWdodCYgcGl4ZWxfd2VpZ2h0cyA9ICpHZXRQaXhlbFdlaWdodChkZXN0X3BpeGVsKTsNCisgICAgZG91YmxlIHNyY19zdGFydCA9IGRlc3RfcGl4ZWwgKiBzY2FsZSArIGJhc2U7DQorICAgIGRvdWJsZSBzcmNfZW5kID0gc3JjX3N0YXJ0ICsgc2NhbGU7DQorICAgIGludCBzdGFydF9pLCBlbmRfaTsNCisgICAgaWYgKHNyY19zdGFydCA8IHNyY19lbmQpIHsNCisgICAgICBzdGFydF9pID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3N0YXJ0KTsNCisgICAgICBlbmRfaSA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX2VuZCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgc3RhcnRfaSA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19lbmQpOw0KKyAgICAgIGVuZF9pID0gKGludClGWFNZU19jZWlsKChGWF9GTE9BVClzcmNfc3RhcnQpOw0KKyAgICB9DQorICAgIGlmIChzdGFydF9pIDwgc3JjX21pbikgew0KKyAgICAgIHN0YXJ0X2kgPSBzcmNfbWluOw0KKyAgICB9DQorICAgIGlmIChlbmRfaSA+PSBzcmNfbWF4KSB7DQorICAgICAgZW5kX2kgPSBzcmNfbWF4IC0gMTsNCisgICAgfQ0KKyAgICBpZiAoc3RhcnRfaSA+IGVuZF9pKSB7DQorICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnRfaTsNCisgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gc3RhcnRfaTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydF9pOw0KKyAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kX2k7DQorICAgIGZvciAoaW50IGogPSBzdGFydF9pOyBqIDw9IGVuZF9pOyBqKyspIHsNCisgICAgICBkb3VibGUgZGVzdF9zdGFydCA9IEZYU1lTX0RpdigoRlhfRkxPQVQpKGopLWJhc2UsIHNjYWxlKTsNCisgICAgICBkb3VibGUgZGVzdF9lbmQgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShqICsgMSkgLSBiYXNlLCBzY2FsZSk7DQorICAgICAgaWYgKGRlc3Rfc3RhcnQgPiBkZXN0X2VuZCkgew0KKyAgICAgICAgZG91YmxlIHRlbXAgPSBkZXN0X3N0YXJ0Ow0KKyAgICAgICAgZGVzdF9zdGFydCA9IGRlc3RfZW5kOw0KKyAgICAgICAgZGVzdF9lbmQgPSB0ZW1wOw0KKyAgICAgIH0NCisgICAgICBkb3VibGUgYXJlYV9zdGFydCA9IGRlc3Rfc3RhcnQgPiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXN0X3N0YXJ0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwpOw0KKyAgICAgIGRvdWJsZSBhcmVhX2VuZCA9IGRlc3RfZW5kID4gKEZYX0ZMT0FUKShkZXN0X3BpeGVsICsgMSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwgKyAxKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc3RfZW5kOw0KKyAgICAgIGRvdWJsZSB3ZWlnaHQgPSBhcmVhX3N0YXJ0ID49IGFyZWFfZW5kID8gMC4wZiA6IGFyZWFfZW5kIC0gYXJlYV9zdGFydDsNCisgICAgICBpZiAod2VpZ2h0ID09IDAgJiYgaiA9PSBlbmRfaSkgew0KKyAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZC0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzW2ogLSBzdGFydF9pXSA9DQorICAgICAgICAgIEZYU1lTX3JvdW5kKChGWF9GTE9BVCkod2VpZ2h0ICogNjU1MzYpKTsNCisgICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENGWENPREVDX0hvcnpUYWJsZTo6Q2FsYyhpbnQgZGVzdF9sZW4sIGludCBzcmNfbGVuLCBGWF9CT09MIGJJbnRlcnBvbCkNCi17DQotICAgIGlmIChtX3BXZWlnaHRUYWJsZXMpIHsNCi0gICAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCi0gICAgfQ0KLSAgICBkb3VibGUgc2NhbGUgPSAoZG91YmxlKWRlc3RfbGVuIC8gKGRvdWJsZSlzcmNfbGVuOw0KLSAgICBtX0l0ZW1TaXplID0gc2l6ZW9mKGludCkgKiA0Ow0KLSAgICBpbnQgc2l6ZSA9IGRlc3RfbGVuICogbV9JdGVtU2l6ZSArIDQ7DQotICAgIG1fcFdlaWdodFRhYmxlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOw0KLSAgICBpZihtX3BXZWlnaHRUYWJsZXMgPT0gTlVMTCkJew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYU1lTX21lbXNldChtX3BXZWlnaHRUYWJsZXMsIDAsIHNpemUpOw0KLSAgICBpZihzY2FsZSA+IDEpIHsNCi0gICAgICAgIGludCBwcmVfZGVzX2NvbCA9IDA7DQotICAgICAgICBmb3IgKGludCBzcmNfY29sID0gMDsgc3JjX2NvbCA8IHNyY19sZW47IHNyY19jb2wrKykgew0KLSAgICAgICAgICAgIGRvdWJsZSBkZXNfY29sX2YgPSBzcmNfY29sICogc2NhbGU7DQotICAgICAgICAgICAgaW50IGRlc19jb2wgPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpZGVzX2NvbF9mKTsNCi0gICAgICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIGRlc19jb2wgKiBtX0l0ZW1TaXplKTsNCi0gICAgICAgICAgICBwV2VpZ2h0LT5tX1NyY1N0YXJ0ID0gcFdlaWdodC0+bV9TcmNFbmQgPSBzcmNfY29sOw0KLSAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KLSAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSA9IDA7DQotICAgICAgICAgICAgaWYoc3JjX2NvbCA9PSBzcmNfbGVuIC0gMSAmJiBkZXNfY29sIDwgZGVzdF9sZW4gLSAxKSB7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGRlc19jb2xfaW5kZXggPSBwcmVfZGVzX2NvbCArIDE7IGRlc19jb2xfaW5kZXggPCBkZXN0X2xlbjsgZGVzX2NvbF9pbmRleCsrKSB7DQotICAgICAgICAgICAgICAgICAgICBwV2VpZ2h0ID0gKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX2NvbF9pbmRleCAqIG1fSXRlbVNpemUpOw0KLSAgICAgICAgICAgICAgICAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IHBXZWlnaHQtPm1fU3JjRW5kID0gc3JjX2NvbDsNCi0gICAgICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KLSAgICAgICAgICAgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludCBkZXNfY29sX2xlbiA9IGRlc19jb2wgLSBwcmVfZGVzX2NvbDsNCi0gICAgICAgICAgICBmb3IgKGludCBkZXNfY29sX2luZGV4ID0gcHJlX2Rlc19jb2wgKyAxOyBkZXNfY29sX2luZGV4IDwgZGVzX2NvbDsgZGVzX2NvbF9pbmRleCsrKSB7DQotICAgICAgICAgICAgICAgIHBXZWlnaHQgPSAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyBkZXNfY29sX2luZGV4ICogbV9JdGVtU2l6ZSk7DQotICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBzcmNfY29sIC0gMTsNCi0gICAgICAgICAgICAgICAgcFdlaWdodC0+bV9TcmNFbmQgPSBzcmNfY29sOw0KLSAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gPSBiSW50ZXJwb2wgPyBGWFNZU19yb3VuZCgoRlhfRkxPQVQpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRlhfRkxPQVQpZGVzX2NvbCAtIChGWF9GTE9BVClkZXNfY29sX2luZGV4KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoRlhfRkxPQVQpZGVzX2NvbF9sZW4gKiA2NTUzNg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IDY1NTM2Ow0KLSAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gPSA2NTUzNiAtIHBXZWlnaHQtPm1fV2VpZ2h0c1swXTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcHJlX2Rlc19jb2wgPSBkZXNfY29sOw0KK3ZvaWQgQ0ZYQ09ERUNfSG9yelRhYmxlOjpDYWxjKGludCBkZXN0X2xlbiwgaW50IHNyY19sZW4sIEZYX0JPT0wgYkludGVycG9sKSB7DQorICBpZiAobV9wV2VpZ2h0VGFibGVzKSB7DQorICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCisgIH0NCisgIGRvdWJsZSBzY2FsZSA9IChkb3VibGUpZGVzdF9sZW4gLyAoZG91YmxlKXNyY19sZW47DQorICBtX0l0ZW1TaXplID0gc2l6ZW9mKGludCkgKiA0Ow0KKyAgaW50IHNpemUgPSBkZXN0X2xlbiAqIG1fSXRlbVNpemUgKyA0Ow0KKyAgbV9wV2VpZ2h0VGFibGVzID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7DQorICBpZiAobV9wV2VpZ2h0VGFibGVzID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KG1fcFdlaWdodFRhYmxlcywgMCwgc2l6ZSk7DQorICBpZiAoc2NhbGUgPiAxKSB7DQorICAgIGludCBwcmVfZGVzX2NvbCA9IDA7DQorICAgIGZvciAoaW50IHNyY19jb2wgPSAwOyBzcmNfY29sIDwgc3JjX2xlbjsgc3JjX2NvbCsrKSB7DQorICAgICAgZG91YmxlIGRlc19jb2xfZiA9IHNyY19jb2wgKiBzY2FsZTsNCisgICAgICBpbnQgZGVzX2NvbCA9IEZYU1lTX3JvdW5kKChGWF9GTE9BVClkZXNfY29sX2YpOw0KKyAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0NCisgICAgICAgICAgKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX2NvbCAqIG1fSXRlbVNpemUpOw0KKyAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBwV2VpZ2h0LT5tX1NyY0VuZCA9IHNyY19jb2w7DQorICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gNjU1MzY7DQorICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gMDsNCisgICAgICBpZiAoc3JjX2NvbCA9PSBzcmNfbGVuIC0gMSAmJiBkZXNfY29sIDwgZGVzdF9sZW4gLSAxKSB7DQorICAgICAgICBmb3IgKGludCBkZXNfY29sX2luZGV4ID0gcHJlX2Rlc19jb2wgKyAxOyBkZXNfY29sX2luZGV4IDwgZGVzdF9sZW47DQorICAgICAgICAgICAgIGRlc19jb2xfaW5kZXgrKykgew0KKyAgICAgICAgICBwV2VpZ2h0ID0NCisgICAgICAgICAgICAgIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIGRlc19jb2xfaW5kZXggKiBtX0l0ZW1TaXplKTsNCisgICAgICAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IHBXZWlnaHQtPm1fU3JjRW5kID0gc3JjX2NvbDsNCisgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gNjU1MzY7DQorICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSA9IDA7DQogICAgICAgICB9DQogICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIGludCBkZXNfY29sX2xlbiA9IGRlc19jb2wgLSBwcmVfZGVzX2NvbDsNCisgICAgICBmb3IgKGludCBkZXNfY29sX2luZGV4ID0gcHJlX2Rlc19jb2wgKyAxOyBkZXNfY29sX2luZGV4IDwgZGVzX2NvbDsNCisgICAgICAgICAgIGRlc19jb2xfaW5kZXgrKykgew0KKyAgICAgICAgcFdlaWdodCA9IChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIGRlc19jb2xfaW5kZXggKiBtX0l0ZW1TaXplKTsNCisgICAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBzcmNfY29sIC0gMTsNCisgICAgICAgIHBXZWlnaHQtPm1fU3JjRW5kID0gc3JjX2NvbDsNCisgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1swXSA9DQorICAgICAgICAgICAgYkludGVycG9sID8gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGWF9GTE9BVClkZXNfY29sIC0gKEZYX0ZMT0FUKWRlc19jb2xfaW5kZXgpIC8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWRlc19jb2xfbGVuICogNjU1MzYpKQ0KKyAgICAgICAgICAgICAgICAgICAgICA6IDY1NTM2Ow0KKyAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gNjU1MzYgLSBwV2VpZ2h0LT5tX1dlaWdodHNbMF07DQorICAgICAgfQ0KKyAgICAgIHByZV9kZXNfY29sID0gZGVzX2NvbDsNCiAgICAgfQ0KLSAgICBmb3IgKGludCBkZXNfY29sID0gMDsgZGVzX2NvbCA8IGRlc3RfbGVuOyBkZXNfY29sKyspIHsNCi0gICAgICAgIGRvdWJsZSBzcmNfY29sX2YgPSBkZXNfY29sIC8gc2NhbGU7DQotICAgICAgICBpbnQgc3JjX2NvbCA9IEZYU1lTX3JvdW5kKChGWF9GTE9BVClzcmNfY29sX2YpOw0KLSAgICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPSAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyBkZXNfY29sICogbV9JdGVtU2l6ZSk7DQotICAgICAgICBwV2VpZ2h0LT5tX1NyY1N0YXJ0ID0gcFdlaWdodC0+bV9TcmNFbmQgPSBzcmNfY29sOw0KKyAgICByZXR1cm47DQorICB9DQorICBmb3IgKGludCBkZXNfY29sID0gMDsgZGVzX2NvbCA8IGRlc3RfbGVuOyBkZXNfY29sKyspIHsNCisgICAgZG91YmxlIHNyY19jb2xfZiA9IGRlc19jb2wgLyBzY2FsZTsNCisgICAgaW50IHNyY19jb2wgPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpc3JjX2NvbF9mKTsNCisgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPQ0KKyAgICAgICAgKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX2NvbCAqIG1fSXRlbVNpemUpOw0KKyAgICBwV2VpZ2h0LT5tX1NyY1N0YXJ0ID0gcFdlaWdodC0+bV9TcmNFbmQgPSBzcmNfY29sOw0KKyAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gPSA2NTUzNjsNCisgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gMDsNCisgIH0NCit9DQordm9pZCBDRlhDT0RFQ19WZXJ0VGFibGU6OkNhbGMoaW50IGRlc3RfbGVuLCBpbnQgc3JjX2xlbikgew0KKyAgaWYgKG1fcFdlaWdodFRhYmxlcykgew0KKyAgICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7DQorICB9DQorICBkb3VibGUgc2NhbGUgPSAoZG91YmxlKWRlc3RfbGVuIC8gKGRvdWJsZSlzcmNfbGVuOw0KKyAgbV9JdGVtU2l6ZSA9IHNpemVvZihpbnQpICogNDsNCisgIGludCBzaXplID0gZGVzdF9sZW4gKiBtX0l0ZW1TaXplICsgNDsNCisgIG1fcFdlaWdodFRhYmxlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOw0KKyAgaWYgKG1fcFdlaWdodFRhYmxlcyA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYU1lTX21lbXNldChtX3BXZWlnaHRUYWJsZXMsIDAsIHNpemUpOw0KKyAgaWYgKHNjYWxlID4gMSkgew0KKyAgICBkb3VibGUgc3RlcCA9IDAuMDsNCisgICAgaW50IHNyY19yb3cgPSAwOw0KKyAgICB3aGlsZSAoc3RlcCA8IChkb3VibGUpZGVzdF9sZW4pIHsNCisgICAgICBpbnQgc3RhcnRfc3RlcCA9IChpbnQpc3RlcDsNCisgICAgICBzdGVwID0gc2NhbGUgKiAoKytzcmNfcm93KTsNCisgICAgICBpbnQgZW5kX3N0ZXAgPSAoaW50KXN0ZXA7DQorICAgICAgaWYgKGVuZF9zdGVwID49IGRlc3RfbGVuKSB7DQorICAgICAgICBlbmRfc3RlcCA9IGRlc3RfbGVuOw0KKyAgICAgICAgZm9yIChpbnQgZGVzX3JvdyA9IHN0YXJ0X3N0ZXA7IGRlc19yb3cgPCBlbmRfc3RlcDsgZGVzX3JvdysrKSB7DQorICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0NCisgICAgICAgICAgICAgIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIGRlc19yb3cgKiBtX0l0ZW1TaXplKTsNCisgICAgICAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IHN0YXJ0X3N0ZXA7DQorICAgICAgICAgIHBXZWlnaHQtPm1fU3JjRW5kID0gc3RhcnRfc3RlcDsNCisgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gNjU1MzY7DQorICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSA9IDA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIGludCBsZW5ndGggPSBlbmRfc3RlcCAtIHN0YXJ0X3N0ZXA7DQorICAgICAgew0KKyAgICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPQ0KKyAgICAgICAgICAgIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIHN0YXJ0X3N0ZXAgKiBtX0l0ZW1TaXplKTsNCisgICAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBzdGFydF9zdGVwOw0KKyAgICAgICAgcFdlaWdodC0+bV9TcmNFbmQgPSBzdGFydF9zdGVwOw0KICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gNjU1MzY7DQogICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gPSAwOw0KKyAgICAgIH0NCisgICAgICBmb3IgKGludCBkZXNfcm93ID0gc3RhcnRfc3RlcCArIDE7IGRlc19yb3cgPCBlbmRfc3RlcDsgZGVzX3JvdysrKSB7DQorICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9DQorICAgICAgICAgICAgKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX3JvdyAqIG1fSXRlbVNpemUpOw0KKyAgICAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IHN0YXJ0X3N0ZXA7DQorICAgICAgICBwV2VpZ2h0LT5tX1NyY0VuZCA9IGVuZF9zdGVwOw0KKyAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKShlbmRfc3RlcCAtIGRlc19yb3cpIC8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClsZW5ndGggKiA2NTUzNik7DQorICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gPSA2NTUzNiAtIHBXZWlnaHQtPm1fV2VpZ2h0c1swXTsNCisgICAgICB9DQogICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGZvciAoaW50IGRlc19yb3cgPSAwOyBkZXNfcm93IDwgZGVzdF9sZW47IGRlc19yb3crKykgew0KKyAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0NCisgICAgICAgICAgKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX3JvdyAqIG1fSXRlbVNpemUpOw0KKyAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBkZXNfcm93Ow0KKyAgICAgIHBXZWlnaHQtPm1fU3JjRW5kID0gZGVzX3JvdzsNCisgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gPSA2NTUzNjsNCisgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gPSAwOw0KKyAgICB9DQorICB9DQogfQ0KLXZvaWQgQ0ZYQ09ERUNfVmVydFRhYmxlOjpDYWxjKGludCBkZXN0X2xlbiwgaW50IHNyY19sZW4pDQotew0KLSAgICBpZiAobV9wV2VpZ2h0VGFibGVzKSB7DQotICAgICAgICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7DQotICAgIH0NCi0gICAgZG91YmxlIHNjYWxlID0gKGRvdWJsZSlkZXN0X2xlbiAvIChkb3VibGUpc3JjX2xlbjsNCi0gICAgbV9JdGVtU2l6ZSA9IHNpemVvZihpbnQpICogNDsNCi0gICAgaW50IHNpemUgPSBkZXN0X2xlbiAqIG1fSXRlbVNpemUgKyA0Ow0KLSAgICBtX3BXZWlnaHRUYWJsZXMgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsNCi0gICAgaWYobV9wV2VpZ2h0VGFibGVzID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWFNZU19tZW1zZXQobV9wV2VpZ2h0VGFibGVzLCAwLCBzaXplKTsNCi0gICAgaWYoc2NhbGUgPiAxKSB7DQotICAgICAgICBkb3VibGUgc3RlcCA9IDAuMDsNCi0gICAgICAgIGludCBzcmNfcm93ID0gMDsNCi0gICAgICAgIHdoaWxlICggc3RlcCA8IChkb3VibGUpZGVzdF9sZW4gKSB7DQotICAgICAgICAgICAgaW50IHN0YXJ0X3N0ZXAgPSAoaW50KXN0ZXA7DQotICAgICAgICAgICAgc3RlcCA9IHNjYWxlICogKCsrc3JjX3Jvdyk7DQotICAgICAgICAgICAgaW50IGVuZF9zdGVwID0gKGludClzdGVwOw0KLSAgICAgICAgICAgIGlmKGVuZF9zdGVwID49IGRlc3RfbGVuKSB7DQotICAgICAgICAgICAgICAgIGVuZF9zdGVwID0gZGVzdF9sZW47DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGRlc19yb3cgPSBzdGFydF9zdGVwOyBkZXNfcm93IDwgZW5kX3N0ZXA7IGRlc19yb3crKykgew0KLSAgICAgICAgICAgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPSAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyBkZXNfcm93ICogbV9JdGVtU2l6ZSk7DQotICAgICAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1NyY1N0YXJ0ID0gc3RhcnRfc3RlcDsNCi0gICAgICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fU3JjRW5kID0gc3RhcnRfc3RlcDsNCi0gICAgICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KLSAgICAgICAgICAgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBlbmRfc3RlcCAtIHN0YXJ0X3N0ZXA7DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIHN0YXJ0X3N0ZXAgKiBtX0l0ZW1TaXplKTsNCi0gICAgICAgICAgICAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IHN0YXJ0X3N0ZXA7DQotICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fU3JjRW5kID0gc3RhcnRfc3RlcDsNCi0gICAgICAgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gNjU1MzY7DQotICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSA9IDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZvciAoaW50IGRlc19yb3cgPSBzdGFydF9zdGVwICsgMTsgZGVzX3JvdyA8IGVuZF9zdGVwOyBkZXNfcm93KyspIHsNCi0gICAgICAgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPSAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyBkZXNfcm93ICogbV9JdGVtU2l6ZSk7DQotICAgICAgICAgICAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBzdGFydF9zdGVwOw0KLSAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1NyY0VuZCA9IGVuZF9zdGVwOw0KLSAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpKGVuZF9zdGVwIC0gZGVzX3JvdykgLyAoRlhfRkxPQVQpbGVuZ3RoICogNjU1MzYpOw0KLSAgICAgICAgICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gPSA2NTUzNiAtIHBXZWlnaHQtPm1fV2VpZ2h0c1swXTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBmb3IgKGludCBkZXNfcm93ID0gMDsgZGVzX3JvdyA8IGRlc3RfbGVuOyBkZXNfcm93KyspIHsNCi0gICAgICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIGRlc19yb3cgKiBtX0l0ZW1TaXplKTsNCi0gICAgICAgICAgICBwV2VpZ2h0LT5tX1NyY1N0YXJ0ID0gZGVzX3JvdzsNCi0gICAgICAgICAgICBwV2VpZ2h0LT5tX1NyY0VuZCA9IGRlc19yb3c7DQotICAgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gNjU1MzY7DQotICAgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gMDsNCi0gICAgICAgIH0NCi0gICAgfQ0KK0NDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkNDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIoDQorICAgIENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01ncikgew0KKyAgbV9wRmlsZSA9IE5VTEw7DQorICBtX3BKcGVnQ29udGV4dCA9IE5VTEw7DQorICBtX3BQbmdDb250ZXh0ID0gTlVMTDsNCisgIG1fcEdpZkNvbnRleHQgPSBOVUxMOw0KKyAgbV9wQm1wQ29udGV4dCA9IE5VTEw7DQorICBtX3BUaWZmQ29udGV4dCA9IE5VTEw7DQorICBtX3BDb2RlY01nciA9IE5VTEw7DQorICBtX3BTcmNCdWYgPSBOVUxMOw0KKyAgbV9wRGVjb2RlQnVmID0gTlVMTDsNCisgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICBtX3BTcmNQYWxldHRlID0gTlVMTDsNCisgIG1fcENvZGVjTWdyID0gcENvZGVjTWdyOw0KKyAgbV9vZmZTZXQgPSAwOw0KKyAgbV9TcmNTaXplID0gMDsNCisgIG1fU2NhbmxpbmVTaXplID0gMDsNCisgIG1fU3JjV2lkdGggPSBtX1NyY0hlaWdodCA9IDA7DQorICBtX1NyY0NvbXBvbmVudHMgPSAwOw0KKyAgbV9TcmNCUEMgPSAwOw0KKyAgbV9TcmNQYXNzTnVtYmVyID0gMDsNCisgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgMCwgMCk7DQorICBtX2ltYWdUeXBlID0gRlhDT0RFQ19JTUFHRV9VTktOT1dOOw0KKyAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgbV9UcmFuc01ldGhvZCA9IC0xOw0KKyAgbV9TcmNSb3cgPSAwOw0KKyAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX0ludmFsaWQ7DQorICBtX2JJbnRlcnBvbCA9IFRSVUU7DQorICBtX0ZyYW1lTnVtYmVyID0gMDsNCisgIG1fRnJhbWVDdXIgPSAwOw0KKyAgbV9TcmNQYWxldHRlTnVtYmVyID0gMDsNCisgIG1fR2lmUGx0TnVtYmVyID0gMDsNCisgIG1fR2lmQmdJbmRleCA9IDA7DQorICBtX3BHaWZQYWxldHRlID0gTlVMTDsNCisgIG1fR2lmVHJhbnNJbmRleCA9IC0xOw0KKyAgbV9HaWZGcmFtZVJlY3QgPSBGWF9SRUNUKDAsIDAsIDAsIDApOw0KKyAgbV9CbXBJc1RvcEJvdHRvbSA9IEZBTFNFOw0KIH0NCi1DQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01ncikNCi17DQotICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICBtX3BKcGVnQ29udGV4dCA9IE5VTEw7DQotICAgIG1fcFBuZ0NvbnRleHQgPSBOVUxMOw0KLSAgICBtX3BHaWZDb250ZXh0ID0gTlVMTDsNCi0gICAgbV9wQm1wQ29udGV4dCA9IE5VTEw7DQotICAgIG1fcFRpZmZDb250ZXh0ID0gTlVMTDsNCi0gICAgbV9wQ29kZWNNZ3IgPSBOVUxMOw0KLSAgICBtX3BTcmNCdWYgPSBOVUxMOw0KLSAgICBtX3BEZWNvZGVCdWYgPSBOVUxMOw0KLSAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICBtX3BTcmNQYWxldHRlID0gTlVMTDsNCi0gICAgbV9wQ29kZWNNZ3IgPSBwQ29kZWNNZ3I7DQotICAgIG1fb2ZmU2V0ID0gMDsNCi0gICAgbV9TcmNTaXplID0gMDsNCi0gICAgbV9TY2FubGluZVNpemUgPSAwOw0KLSAgICBtX1NyY1dpZHRoID0gbV9TcmNIZWlnaHQgPSAwOw0KLSAgICBtX1NyY0NvbXBvbmVudHMgPSAwOw0KLSAgICBtX1NyY0JQQyA9IDA7DQotICAgIG1fU3JjUGFzc051bWJlciA9IDA7DQotICAgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgMCwgMCk7DQotICAgIG1faW1hZ1R5cGUgPSBGWENPREVDX0lNQUdFX1VOS05PV047DQotICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCi0gICAgbV9UcmFuc01ldGhvZCA9IC0xOw0KLSAgICBtX1NyY1JvdyA9IDA7DQotICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19JbnZhbGlkOw0KLSAgICBtX2JJbnRlcnBvbCA9IFRSVUU7DQotICAgIG1fRnJhbWVOdW1iZXIgPSAwOw0KLSAgICBtX0ZyYW1lQ3VyID0gMDsNCi0gICAgbV9TcmNQYWxldHRlTnVtYmVyID0gMDsNCi0gICAgbV9HaWZQbHROdW1iZXIgPSAwOw0KLSAgICBtX0dpZkJnSW5kZXggPSAwOw0KLSAgICBtX3BHaWZQYWxldHRlID0gTlVMTDsNCi0gICAgbV9HaWZUcmFuc0luZGV4ID0gLTE7DQotICAgIG1fR2lmRnJhbWVSZWN0ID0gRlhfUkVDVCgwLCAwLCAwLCAwKTsNCi0gICAgbV9CbXBJc1RvcEJvdHRvbSA9IEZBTFNFOw0KK0NDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6On5DQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKCkgew0KKyAgbV9wRmlsZSA9IE5VTEw7DQorICBpZiAobV9wSnBlZ0NvbnRleHQgIT0gTlVMTCkgew0KKyAgICBtX3BDb2RlY01nci0+R2V0SnBlZ01vZHVsZSgpLT5GaW5pc2gobV9wSnBlZ0NvbnRleHQpOw0KKyAgfQ0KKyAgaWYgKG1fcFBuZ0NvbnRleHQgIT0gTlVMTCkgew0KKyAgICBtX3BDb2RlY01nci0+R2V0UG5nTW9kdWxlKCktPkZpbmlzaChtX3BQbmdDb250ZXh0KTsNCisgIH0NCisgIGlmIChtX3BHaWZDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgbV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpLT5GaW5pc2gobV9wR2lmQ29udGV4dCk7DQorICB9DQorICBpZiAobV9wQm1wQ29udGV4dCAhPSBOVUxMKSB7DQorICAgIG1fcENvZGVjTWdyLT5HZXRCbXBNb2R1bGUoKS0+RmluaXNoKG1fcEJtcENvbnRleHQpOw0KKyAgfQ0KKyAgaWYgKG1fcFRpZmZDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgbV9wQ29kZWNNZ3ItPkdldFRpZmZNb2R1bGUoKS0+RGVzdHJveURlY29kZXIobV9wVGlmZkNvbnRleHQpOw0KKyAgfQ0KKyAgaWYgKG1fcFNyY0J1ZiAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUobV9wU3JjQnVmKTsNCisgIH0NCisgIGlmIChtX3BEZWNvZGVCdWYgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fcERlY29kZUJ1Zik7DQorICB9DQorICBpZiAobV9wU3JjUGFsZXR0ZSAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUobV9wU3JjUGFsZXR0ZSk7DQorICB9DQogfQ0KLUNDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6On5DQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKCkNCi17DQotICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICBpZihtX3BKcGVnQ29udGV4dCAhPSBOVUxMKSB7DQotICAgICAgICBtX3BDb2RlY01nci0+R2V0SnBlZ01vZHVsZSgpLT5GaW5pc2gobV9wSnBlZ0NvbnRleHQpOw0KK0ZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6SnBlZ1JlYWRNb3JlRGF0YSgNCisgICAgSUNvZGVjX0pwZWdNb2R1bGUqIHBKcGVnTW9kdWxlLA0KKyAgICBGWENPREVDX1NUQVRVUyYgZXJyX3N0YXR1cykgew0KKyAgRlhfRFdPUkQgZHdTaXplID0gKEZYX0RXT1JEKW1fcEZpbGUtPkdldFNpemUoKTsNCisgIGlmIChkd1NpemUgPD0gbV9vZmZTZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgZHdTaXplID0gZHdTaXplIC0gbV9vZmZTZXQ7DQorICBGWF9EV09SRCBkd0F2YWlsID0gcEpwZWdNb2R1bGUtPkdldEF2YWlsSW5wdXQobV9wSnBlZ0NvbnRleHQsIE5VTEwpOw0KKyAgaWYgKGR3QXZhaWwgPT0gbV9TcmNTaXplKSB7DQorICAgIGlmIChkd1NpemUgPiBGWENPREVDX0JMT0NLX1NJWkUpIHsNCisgICAgICBkd1NpemUgPSBGWENPREVDX0JMT0NLX1NJWkU7DQogICAgIH0NCi0gICAgaWYobV9wUG5nQ29udGV4dCAhPSBOVUxMKSB7DQotICAgICAgICBtX3BDb2RlY01nci0+R2V0UG5nTW9kdWxlKCktPkZpbmlzaChtX3BQbmdDb250ZXh0KTsNCisgICAgbV9TcmNTaXplID0gKGR3U2l6ZSArIGR3QXZhaWwgKyBGWENPREVDX0JMT0NLX1NJWkUgLSAxKSAvDQorICAgICAgICAgICAgICAgIEZYQ09ERUNfQkxPQ0tfU0laRSAqIEZYQ09ERUNfQkxPQ0tfU0laRTsNCisgICAgbV9wU3JjQnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BTcmNCdWYsIG1fU3JjU2l6ZSk7DQorICAgIGlmICghbV9wU3JjQnVmKSB7DQorICAgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIGlmKG1fcEdpZkNvbnRleHQgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpLT5GaW5pc2gobV9wR2lmQ29udGV4dCk7DQorICB9IGVsc2Ugew0KKyAgICBGWF9EV09SRCBkd0NvbnN1bWUgPSBtX1NyY1NpemUgLSBkd0F2YWlsOw0KKyAgICBpZiAoZHdBdmFpbCkgew0KKyAgICAgIEZYU1lTX21lbWNweShtX3BTcmNCdWYsIG1fcFNyY0J1ZiArIGR3Q29uc3VtZSwgZHdBdmFpbCk7DQogICAgIH0NCi0gICAgaWYobV9wQm1wQ29udGV4dCAhPSBOVUxMKSB7DQotICAgICAgICBtX3BDb2RlY01nci0+R2V0Qm1wTW9kdWxlKCktPkZpbmlzaChtX3BCbXBDb250ZXh0KTsNCisgICAgaWYgKGR3U2l6ZSA+IGR3Q29uc3VtZSkgew0KKyAgICAgIGR3U2l6ZSA9IGR3Q29uc3VtZTsNCiAgICAgfQ0KLSAgICBpZihtX3BUaWZmQ29udGV4dCAhPSBOVUxMKSB7DQotICAgICAgICBtX3BDb2RlY01nci0+R2V0VGlmZk1vZHVsZSgpLT5EZXN0cm95RGVjb2RlcihtX3BUaWZmQ29udGV4dCk7DQotICAgIH0NCi0gICAgaWYobV9wU3JjQnVmICE9IE5VTEwpIHsNCi0gICAgICAgIEZYX0ZyZWUobV9wU3JjQnVmKTsNCi0gICAgfQ0KLSAgICBpZihtX3BEZWNvZGVCdWYgIT0gTlVMTCkgew0KLSAgICAgICAgRlhfRnJlZShtX3BEZWNvZGVCdWYpOw0KLSAgICB9DQotICAgIGlmKG1fcFNyY1BhbGV0dGUgIT0gTlVMTCkgew0KLSAgICAgICAgRlhfRnJlZShtX3BTcmNQYWxldHRlKTsNCi0gICAgfQ0KKyAgfQ0KKyAgaWYgKCFtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmICsgZHdBdmFpbCwgbV9vZmZTZXQsIGR3U2l6ZSkpIHsNCisgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX29mZlNldCArPSBkd1NpemU7DQorICBwSnBlZ01vZHVsZS0+SW5wdXQobV9wSnBlZ0NvbnRleHQsIG1fcFNyY0J1ZiwgZHdTaXplICsgZHdBdmFpbCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpKcGVnUmVhZE1vcmVEYXRhKElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSwgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpDQotew0KLSAgICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpbV9wRmlsZS0+R2V0U2l6ZSgpOw0KLSAgICBpZiAoZHdTaXplIDw9IG1fb2ZmU2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgZHdTaXplID0gZHdTaXplIC0gbV9vZmZTZXQ7DQotICAgIEZYX0RXT1JEIGR3QXZhaWwgPSBwSnBlZ01vZHVsZS0+R2V0QXZhaWxJbnB1dChtX3BKcGVnQ29udGV4dCwgTlVMTCk7DQotICAgIGlmIChkd0F2YWlsID09IG1fU3JjU2l6ZSkgew0KLSAgICAgICAgaWYgKGR3U2l6ZSA+IEZYQ09ERUNfQkxPQ0tfU0laRSkgew0KLSAgICAgICAgICAgIGR3U2l6ZSA9IEZYQ09ERUNfQkxPQ0tfU0laRTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fU3JjU2l6ZSA9IChkd1NpemUgKyBkd0F2YWlsICsgRlhDT0RFQ19CTE9DS19TSVpFIC0gMSkgLyBGWENPREVDX0JMT0NLX1NJWkUgKiBGWENPREVDX0JMT0NLX1NJWkU7DQotICAgICAgICBtX3BTcmNCdWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcFNyY0J1ZiwgbV9TcmNTaXplKTsNCi0gICAgICAgIGlmICghbV9wU3JjQnVmKSB7DQotICAgICAgICAgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhfRFdPUkQgZHdDb25zdW1lID0gbV9TcmNTaXplIC0gZHdBdmFpbDsNCi0gICAgICAgIGlmIChkd0F2YWlsKSB7DQotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFNyY0J1ZiwgbV9wU3JjQnVmICsgZHdDb25zdW1lLCBkd0F2YWlsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChkd1NpemUgPiBkd0NvbnN1bWUpIHsNCi0gICAgICAgICAgICBkd1NpemUgPSBkd0NvbnN1bWU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKCFtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmICsgZHdBdmFpbCwgbV9vZmZTZXQsIGR3U2l6ZSkpIHsNCi0gICAgICAgIGVycl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX29mZlNldCArPSBkd1NpemU7DQotICAgIHBKcGVnTW9kdWxlLT5JbnB1dChtX3BKcGVnQ29udGV4dCwgbV9wU3JjQnVmLCBkd1NpemUgKyBkd0F2YWlsKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdSZWFkSGVhZGVyRnVuYyh2b2lkKiBwTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29sb3JfdHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZ2FtbWEpIHsNCisgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KKyAgaWYgKHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwID09IE5VTEwpIHsNCisgICAgcENvZGVjLT5tX1NyY1dpZHRoID0gd2lkdGg7DQorICAgIHBDb2RlYy0+bV9TcmNIZWlnaHQgPSBoZWlnaHQ7DQorICAgIHBDb2RlYy0+bV9TcmNCUEMgPSBicGM7DQorICAgIHBDb2RlYy0+bV9TcmNQYXNzTnVtYmVyID0gcGFzczsNCisgICAgcENvZGVjLT5tX1NyY0NvbXBvbmVudHMgPQ0KKyAgICAgICAgKmNvbG9yX3R5cGUgPT0gMCA/IDEgOiAqY29sb3JfdHlwZSA9PSAyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDMNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKmNvbG9yX3R5cGUgPT0gMw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyA0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICpjb2xvcl90eXBlID09IDQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAqY29sb3JfdHlwZSA9PSA2ID8gNCA6IDA7DQorICAgIHBDb2RlYy0+bV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKTsNCisgIHN3aXRjaCAoZm9ybWF0KSB7DQorICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQorICAgIGNhc2UgRlhESUJfMWJwcFJnYjoNCisgICAgICBBU1NFUlQoRkFMU0UpOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgY2FzZSBGWERJQl84YnBwUmdiOg0KKyAgICAgICpjb2xvcl90eXBlID0gMDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgKmNvbG9yX3R5cGUgPSAyOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYRElCX1JnYjMyOg0KKyAgICBjYXNlIEZYRElCX0FyZ2I6DQorICAgICAgKmNvbG9yX3R5cGUgPSA2Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIEFTU0VSVChGQUxTRSk7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgKmdhbW1hID0gRlhDT0RFQ19QTkdfR0FNTUE7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdSZWFkSGVhZGVyRnVuYyh2b2lkKiBwTW9kdWxlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicGMsIGludCBwYXNzLCBpbnQqIGNvbG9yX3R5cGUsIGRvdWJsZSogZ2FtbWEpDQotew0KLSAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCi0gICAgaWYocENvZGVjLT5tX3BEZXZpY2VCaXRtYXAgPT0gTlVMTCkgew0KLSAgICAgICAgcENvZGVjLT5tX1NyY1dpZHRoID0gd2lkdGg7DQotICAgICAgICBwQ29kZWMtPm1fU3JjSGVpZ2h0ID0gaGVpZ2h0Ow0KLSAgICAgICAgcENvZGVjLT5tX1NyY0JQQyA9IGJwYzsNCi0gICAgICAgIHBDb2RlYy0+bV9TcmNQYXNzTnVtYmVyID0gcGFzczsNCi0gICAgICAgIHBDb2RlYy0+bV9TcmNDb21wb25lbnRzID0gKmNvbG9yX3R5cGUgPT0gMCA/IDEgOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29sb3JfdHlwZSA9PSAyID8gMyA6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb2xvcl90eXBlID09IDMgPyA0IDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbG9yX3R5cGUgPT0gNCA/IDIgOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29sb3JfdHlwZSA9PSA2ID8gNCA6IDA7DQotICAgICAgICBwQ29kZWMtPm1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgd2lkdGgsIGhlaWdodCk7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKTsNCi0gICAgc3dpdGNoKGZvcm1hdCkgew0KK0ZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UG5nQXNrU2NhbmxpbmVCdWZGdW5jKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHNyY19idWYpIHsNCisgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KKyAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcDsNCisgIEFTU0VSVChwRElCaXRtYXAgIT0gTlVMTCk7DQorICBpZiAocERJQml0bWFwID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGxpbmUgPj0gcENvZGVjLT5tX2NsaXBCb3gudG9wICYmIGxpbmUgPCBwQ29kZWMtPm1fY2xpcEJveC5ib3R0b20pIHsNCisgICAgZG91YmxlIHNjYWxlX3kgPQ0KKyAgICAgICAgKGRvdWJsZSlwQ29kZWMtPm1fc2l6ZVkgLyAoZG91YmxlKXBDb2RlYy0+bV9jbGlwQm94LkhlaWdodCgpOw0KKyAgICBpbnQzMl90IHJvdyA9DQorICAgICAgICAoaW50MzJfdCkoKGxpbmUgLSBwQ29kZWMtPm1fY2xpcEJveC50b3ApICogc2NhbGVfeSkgKyBwQ29kZWMtPm1fc3RhcnRZOw0KKyAgICB1aW50OF90KiBzcmNfc2NhbiA9ICh1aW50OF90KilwRElCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQorICAgIHVpbnQ4X3QqIGRlc19zY2FuID0gcENvZGVjLT5tX3BEZWNvZGVCdWY7DQorICAgIHNyY19idWYgPSBwQ29kZWMtPm1fcERlY29kZUJ1ZjsNCisgICAgaW50MzJfdCBzcmNfQnBwID0gcERJQml0bWFwLT5HZXRCUFAoKSA+PiAzOw0KKyAgICBpbnQzMl90IGRlc19CcHAgPSAocENvZGVjLT5tX1NyY0Zvcm1hdCAmIDB4ZmYpID4+IDM7DQorICAgIGludDMyX3Qgc3JjX2xlZnQgPSBwQ29kZWMtPm1fc3RhcnRYOw0KKyAgICBpbnQzMl90IGRlc19sZWZ0ID0gcENvZGVjLT5tX2NsaXBCb3gubGVmdDsNCisgICAgc3JjX3NjYW4gKz0gc3JjX2xlZnQgKiBzcmNfQnBwOw0KKyAgICBkZXNfc2NhbiArPSBkZXNfbGVmdCAqIGRlc19CcHA7DQorICAgIGZvciAoaW50MzJfdCBzcmNfY29sID0gMDsgc3JjX2NvbCA8IHBDb2RlYy0+bV9zaXplWDsgc3JjX2NvbCsrKSB7DQorICAgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPQ0KKyAgICAgICAgICBwQ29kZWMtPm1fV2VpZ2h0SG9yek9PLkdldFBpeGVsV2VpZ2h0KHNyY19jb2wpOw0KKyAgICAgIGlmIChwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0ICE9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgc3dpdGNoIChwRElCaXRtYXAtPkdldEZvcm1hdCgpKSB7DQogICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOg0KICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOg0KLSAgICAgICAgICAgIEFTU0VSVChGQUxTRSk7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCi0gICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjoNCi0gICAgICAgICAgICAqY29sb3JfdHlwZSA9IDA7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYRElCX1JnYjoNCi0gICAgICAgICAgICAqY29sb3JfdHlwZSA9IDI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYRElCX1JnYjMyOg0KLSAgICAgICAgY2FzZSBGWERJQl9BcmdiOg0KLSAgICAgICAgICAgICpjb2xvcl90eXBlID0gNjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgQVNTRVJUKEZBTFNFKTsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgKmdhbW1hID0gRlhDT0RFQ19QTkdfR0FNTUE7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlBuZ0Fza1NjYW5saW5lQnVmRnVuYyh2b2lkKiBwTW9kdWxlLCBpbnQgbGluZSwgdWludDhfdComIHNyY19idWYpDQotew0KLSAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCi0gICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcDsNCi0gICAgQVNTRVJUKHBESUJpdG1hcCAhPSBOVUxMKTsNCi0gICAgaWYocERJQml0bWFwID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZihsaW5lID49IHBDb2RlYy0+bV9jbGlwQm94LnRvcCAmJiBsaW5lIDwgcENvZGVjLT5tX2NsaXBCb3guYm90dG9tKSB7DQotICAgICAgICBkb3VibGUgc2NhbGVfeSA9IChkb3VibGUpcENvZGVjLT5tX3NpemVZIC8gKGRvdWJsZSlwQ29kZWMtPm1fY2xpcEJveC5IZWlnaHQoKTsNCi0gICAgICAgIGludDMyX3Qgcm93ID0gKGludDMyX3QpKChsaW5lIC0gcENvZGVjLT5tX2NsaXBCb3gudG9wKSAqIHNjYWxlX3kpICsgcENvZGVjLT5tX3N0YXJ0WTsNCi0gICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gKHVpbnQ4X3QqKXBESUJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsNCi0gICAgICAgIHVpbnQ4X3QqIGRlc19zY2FuID0gcENvZGVjLT5tX3BEZWNvZGVCdWY7DQotICAgICAgICBzcmNfYnVmID0gcENvZGVjLT5tX3BEZWNvZGVCdWY7DQotICAgICAgICBpbnQzMl90IHNyY19CcHAgPSBwRElCaXRtYXAtPkdldEJQUCgpID4+IDM7DQotICAgICAgICBpbnQzMl90IGRlc19CcHAgPSAocENvZGVjLT5tX1NyY0Zvcm1hdCAmIDB4ZmYpID4+IDM7DQotICAgICAgICBpbnQzMl90IHNyY19sZWZ0ID0gcENvZGVjLT5tX3N0YXJ0WDsNCi0gICAgICAgIGludDMyX3QgZGVzX2xlZnQgPSBwQ29kZWMtPm1fY2xpcEJveC5sZWZ0Ow0KLSAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2xlZnQgKiBzcmNfQnBwOw0KLSAgICAgICAgZGVzX3NjYW4gKz0gZGVzX2xlZnQgKiBkZXNfQnBwOw0KLSAgICAgICAgZm9yIChpbnQzMl90IHNyY19jb2wgPSAwOyBzcmNfY29sIDwgcENvZGVjLT5tX3NpemVYOyBzcmNfY29sKyspIHsNCi0gICAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IHBDb2RlYy0+bV9XZWlnaHRIb3J6T08uR2V0UGl4ZWxXZWlnaHQoc3JjX2NvbCk7DQotICAgICAgICAgICAgaWYocFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydCAhPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZCkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc3dpdGNoKHBESUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoNCi0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOg0KLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCi0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocERJQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc19nID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiBzcmNfc2NhbltzcmNfY29sXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfc2NhbltwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XSA9ICh1aW50OF90KShkZXNfZyA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQotICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBzcmNfc2NhbiArIHNyY19jb2wgKiBzcmNfQnBwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGVzID0gJmRlc19zY2FuW3BQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQgKiBkZXNfQnBwXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAqcERlcysrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwRGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAgICAgKnBEZXMJPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl9BcmdiOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX3IgPSAwLCBkZXNfZyA9IDAsIGRlc19iID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwID0gc3JjX3NjYW4gKyBzcmNfY29sICogc3JjX0JwcDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGVzID0gJmRlc19zY2FuW3BQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQgKiBkZXNfQnBwXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAqcERlcysrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwRGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAgICAgKnBEZXMrKwk9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAqcERlcwk9ICpwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlBuZ09uZU9uZU1hcFJlc2FtcGxlSG9yeihDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGludDMyX3QgZGVzX2xpbmUsIHVpbnQ4X3QqIHNyY19zY2FuLCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KQ0KLXsNCi0gICAgdWludDhfdCogZGVzX3NjYW4gPSAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX2xpbmUpOw0KLSAgICBpbnQzMl90IHNyY19CcHAgPSAobV9TcmNGb3JtYXQgJiAweGZmKSA+PiAzOw0KLSAgICBpbnQzMl90IGRlc19CcHAgPSBwRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA+PiAzOw0KLSAgICBpbnQzMl90IHNyY19sZWZ0ID0gbV9jbGlwQm94LmxlZnQ7DQotICAgIGludDMyX3QgZGVzX2xlZnQgPSBtX3N0YXJ0WDsNCi0gICAgc3JjX3NjYW4gKz0gc3JjX2xlZnQgKiBzcmNfQnBwOw0KLSAgICBkZXNfc2NhbiArPSBkZXNfbGVmdCAqIGRlc19CcHA7DQotICAgIGZvciAoaW50MzJfdCBkZXNfY29sID0gMDsgZGVzX2NvbCA8IG1fc2l6ZVg7IGRlc19jb2wrKykgew0KLSAgICAgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPSBtX1dlaWdodEhvcnpPTy5HZXRQaXhlbFdlaWdodChkZXNfY29sKTsNCi0gICAgICAgIHN3aXRjaChwRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgew0KLSAgICAgICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQotICAgICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOg0KLSAgICAgICAgICAgICAgICBBU1NFUlQoRkFMU0UpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCi0gICAgICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBEZXZpY2VCaXRtYXAtPkdldFBhbGV0dGUoKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2cgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogc3JjX3NjYW5bcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07DQotICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiBzcmNfc2NhbltwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZF07DQotICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KShkZXNfZyA+PiAxNik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQotICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjogew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBzcmNfc2NhbjsNCi0gICAgICAgICAgICAgICAgICAgIHAgPSBzcmNfc2NhbiArIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQgKiBzcmNfQnBwOw0KLSAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKyspOw0KLSAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKyspOw0KLSAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKTsNCi0gICAgICAgICAgICAgICAgICAgIHAgPSBzcmNfc2NhbiArIHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kICogc3JjX0JwcDsNCi0gICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1sxXSAqICgqcCsrKTsNCi0gICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1sxXSAqICgqcCsrKTsNCi0gICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1sxXSAqICgqcCk7DQotICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICBkZXNfc2NhbiArPSBkZXNfQnBwIC0gMzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZYRElCX0FyZ2I6IHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc19hID0gMCwgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBzcmNfc2NhbjsNCi0gICAgICAgICAgICAgICAgICAgIHAgPSBzcmNfc2NhbiArIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQgKiBzcmNfQnBwOw0KLSAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKyspOw0KLSAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKyspOw0KLSAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKyspOw0KLSAgICAgICAgICAgICAgICAgICAgZGVzX2EgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKTsNCi0gICAgICAgICAgICAgICAgICAgIHAgPSBzcmNfc2NhbiArIHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kICogc3JjX0JwcDsNCi0gICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1sxXSAqICgqcCsrKTsNCi0gICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1sxXSAqICgqcCsrKTsNCi0gICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1sxXSAqICgqcCsrKTsNCi0gICAgICAgICAgICAgICAgICAgIGRlc19hICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1sxXSAqICgqcCk7DQotICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2EpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdGaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWRGdW5jKHZvaWQqIHBNb2R1bGUsIGludCBwYXNzLCBpbnQgbGluZSkNCi17DQotICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KLSAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwOw0KLSAgICBBU1NFUlQocERJQml0bWFwICE9IE5VTEwpOw0KLSAgICBpbnQgc3JjX3RvcCA9IHBDb2RlYy0+bV9jbGlwQm94LnRvcDsNCi0gICAgaW50IHNyY19ib3R0b20gPSBwQ29kZWMtPm1fY2xpcEJveC5ib3R0b207DQotICAgIGludCBkZXNfdG9wID0gcENvZGVjLT5tX3N0YXJ0WTsNCi0gICAgaW50IHNyY19oZWkgPSBwQ29kZWMtPm1fY2xpcEJveC5IZWlnaHQoKTsNCi0gICAgaW50IGRlc19oZWkgPSBwQ29kZWMtPm1fc2l6ZVk7DQotICAgIGlmKGxpbmUgPj0gc3JjX3RvcCAmJiBsaW5lIDwgc3JjX2JvdHRvbSkgew0KLSAgICAgICAgZG91YmxlIHNjYWxlX3kgPSAoZG91YmxlKWRlc19oZWkgLyAoZG91YmxlKXNyY19oZWk7DQotICAgICAgICBpbnQgc3JjX3JvdyA9IGxpbmUgLSBzcmNfdG9wOw0KLSAgICAgICAgaW50IGRlc19yb3cgPSAoaW50KShzcmNfcm93ICogc2NhbGVfeSkgICsgZGVzX3RvcDsNCi0gICAgICAgIGlmKGRlc19yb3cgPj0gZGVzX3RvcCArIGRlc19oZWkpCXsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBwQ29kZWMtPlBuZ09uZU9uZU1hcFJlc2FtcGxlSG9yeihwRElCaXRtYXAsIGRlc19yb3csIHBDb2RlYy0+bV9wRGVjb2RlQnVmLCBwQ29kZWMtPm1fU3JjRm9ybWF0KTsNCi0gICAgICAgIGlmKHBDb2RlYy0+bV9TcmNQYXNzTnVtYmVyID09IDEgJiYgc2NhbGVfeSA+IDEuMCkgew0KLSAgICAgICAgICAgIHBDb2RlYy0+UmVzYW1wbGVWZXJ0KHBESUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYocGFzcyA9PSA2ICYmIHNjYWxlX3kgPiAxLjApIHsNCi0gICAgICAgICAgICBwQ29kZWMtPlJlc2FtcGxlVmVydChwRElCaXRtYXAsIHNjYWxlX3ksIGRlc19yb3cpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmUmVhZE1vcmVEYXRhKElDb2RlY19HaWZNb2R1bGUqIHBHaWZNb2R1bGUsIEZYQ09ERUNfU1RBVFVTJiBlcnJfc3RhdHVzKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdTaXplID0gKEZYX0RXT1JEKW1fcEZpbGUtPkdldFNpemUoKTsNCi0gICAgaWYgKGR3U2l6ZSA8PSBtX29mZlNldCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGR3U2l6ZSA9IGR3U2l6ZSAtIG1fb2ZmU2V0Ow0KLSAgICBGWF9EV09SRCBkd0F2YWlsID0gcEdpZk1vZHVsZS0+R2V0QXZhaWxJbnB1dChtX3BHaWZDb250ZXh0LCBOVUxMKTsNCi0gICAgaWYgKGR3QXZhaWwgPT0gbV9TcmNTaXplKSB7DQotICAgICAgICBpZiAoZHdTaXplID4gRlhDT0RFQ19CTE9DS19TSVpFKSB7DQotICAgICAgICAgICAgZHdTaXplID0gRlhDT0RFQ19CTE9DS19TSVpFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9TcmNTaXplID0gKGR3U2l6ZSArIGR3QXZhaWwgKyBGWENPREVDX0JMT0NLX1NJWkUgLSAxKSAvIEZYQ09ERUNfQkxPQ0tfU0laRSAqIEZYQ09ERUNfQkxPQ0tfU0laRTsNCi0gICAgICAgIG1fcFNyY0J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgbV9wU3JjQnVmLCBtX1NyY1NpemUpOw0KLSAgICAgICAgaWYgKCFtX3BTcmNCdWYpIHsNCi0gICAgICAgICAgICBlcnJfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWF9EV09SRCBkd0NvbnN1bWUgPSBtX1NyY1NpemUgLSBkd0F2YWlsOw0KLSAgICAgICAgaWYgKGR3QXZhaWwpIHsNCi0gICAgICAgICAgICBGWFNZU19tZW1jcHkobV9wU3JjQnVmLCBtX3BTcmNCdWYgKyBkd0NvbnN1bWUsIGR3QXZhaWwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGR3U2l6ZSA+IGR3Q29uc3VtZSkgew0KLSAgICAgICAgICAgIGR3U2l6ZSA9IGR3Q29uc3VtZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoIW1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYgKyBkd0F2YWlsLCBtX29mZlNldCwgZHdTaXplKSkgew0KLSAgICAgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG1fb2ZmU2V0ICs9IGR3U2l6ZTsNCi0gICAgcEdpZk1vZHVsZS0+SW5wdXQobV9wR2lmQ29udGV4dCwgbV9wU3JjQnVmLCBkd1NpemUgKyBkd0F2YWlsKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmUmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2sodm9pZCogcE1vZHVsZSwgRlhfRFdPUkQmIGN1cl9wb3MpDQotew0KLSAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCi0gICAgRlhfRFdPUkQgcmVtYWluX3NpemUgPSBwQ29kZWMtPm1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKS0+R2V0QXZhaWxJbnB1dChwQ29kZWMtPm1fcEdpZkNvbnRleHQpOw0KLSAgICBjdXJfcG9zID0gcENvZGVjLT5tX29mZlNldCAtIHJlbWFpbl9zaXplOw0KLX0NCi11aW50OF90KiBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZBc2tMb2NhbFBhbGV0dGVCdWZDYWxsYmFjayh2b2lkKiBwTW9kdWxlLCBpbnQzMl90IGZyYW1lX251bSwgaW50MzJfdCBwYWxfc2l6ZSkNCi17DQotICAgIHJldHVybiBGWF9BbGxvYyh1aW50OF90LCBwYWxfc2l6ZSk7DQotfQ0KLUZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmSW5wdXRSZWNvcmRQb3NpdGlvbkJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsIEZYX0RXT1JEIHJjZF9wb3MsIGNvbnN0IEZYX1JFQ1QmIGltZ19yYywNCi0gICAgICAgIGludDMyX3QgcGFsX251bSwgdm9pZCogcGFsX3B0ciwNCi0gICAgICAgIGludDMyX3QgZGVsYXlfdGltZSwgRlhfQk9PTCB1c2VyX2lucHV0LA0KLSAgICAgICAgaW50MzJfdCB0cmFuc19pbmRleCwgaW50MzJfdCBkaXNwb3NhbF9tZXRob2QsIEZYX0JPT0wgaW50ZXJsYWNlKQ0KLXsNCi0gICAgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogcENvZGVjID0gKENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqKXBNb2R1bGU7DQotICAgIHBDb2RlYy0+bV9vZmZTZXQgPSByY2RfcG9zOw0KLSAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsNCi0gICAgaWYoIXBDb2RlYy0+R2lmUmVhZE1vcmVEYXRhKHBDb2RlYy0+bV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpLCBlcnJvcl9zdGF0dXMpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgdWludDhfdCogcFBhbGV0dGUgPSBOVUxMOw0KLSAgICBpZihwYWxfbnVtICE9IDAgJiYgcGFsX3B0cikgew0KLSAgICAgICAgcFBhbGV0dGUgPSAodWludDhfdCopcGFsX3B0cjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBhbF9udW0gPSBwQ29kZWMtPm1fR2lmUGx0TnVtYmVyOw0KLSAgICAgICAgcFBhbGV0dGUgPSBwQ29kZWMtPm1fcEdpZlBhbGV0dGU7DQotICAgIH0NCi0gICAgaWYocENvZGVjLT5tX3BTcmNQYWxldHRlID09IE5VTEwpIHsNCi0gICAgICAgIHBDb2RlYy0+bV9wU3JjUGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0FSR0IsIHBhbF9udW0pOw0KLSAgICB9IGVsc2UgaWYocGFsX251bSA+IHBDb2RlYy0+bV9TcmNQYWxldHRlTnVtYmVyKSB7DQotICAgICAgICBwQ29kZWMtPm1fcFNyY1BhbGV0dGUgPSBGWF9SZWFsbG9jKEZYX0FSR0IsIHBDb2RlYy0+bV9wU3JjUGFsZXR0ZSwgcGFsX251bSk7DQotICAgIH0NCi0gICAgaWYocENvZGVjLT5tX3BTcmNQYWxldHRlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBwQ29kZWMtPm1fU3JjUGFsZXR0ZU51bWJlciA9IHBhbF9udW07DQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX251bTsgaSsrKSB7DQotICAgICAgICByZWdpc3RlciBGWF9EV09SRCBqID0gaSAqIDM7DQotICAgICAgICBwQ29kZWMtPm1fcFNyY1BhbGV0dGVbaV0gPQ0KLSAgICAgICAgICAgIEFyZ2JFbmNvZGUoMHhmZiwgcFBhbGV0dGVbal0sIHBQYWxldHRlW2ogKyAxXSwgcFBhbGV0dGVbaiArIDJdKTsNCi0gICAgfQ0KLSAgICBwQ29kZWMtPm1fR2lmVHJhbnNJbmRleCA9IHRyYW5zX2luZGV4Ow0KLSAgICBwQ29kZWMtPm1fR2lmRnJhbWVSZWN0ID0gaW1nX3JjOw0KLSAgICBwQ29kZWMtPm1fU3JjUGFzc051bWJlciA9IGludGVybGFjZSA/IDQgOiAxOw0KLSAgICBpbnQzMl90IHBhbF9pbmRleCA9IHBDb2RlYy0+bV9HaWZCZ0luZGV4Ow0KLSAgICBDRlhfRElCaXRtYXAqIHBEZXZpY2UgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcDsNCi0gICAgaWYgKHRyYW5zX2luZGV4ID49IHBhbF9udW0pIHsNCi0gICAgICAgIHRyYW5zX2luZGV4ID0gLTE7DQotICAgIH0NCi0gICAgaWYgKHRyYW5zX2luZGV4ICE9IC0xKSB7DQotICAgICAgICBwQ29kZWMtPm1fcFNyY1BhbGV0dGVbdHJhbnNfaW5kZXhdICY9IDB4MDBmZmZmZmY7DQotICAgICAgICBpZiAocERldmljZS0+SGFzQWxwaGEoKSkgew0KLSAgICAgICAgICAgIHBhbF9pbmRleCA9IHRyYW5zX2luZGV4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGludCBzdGFydFggPSBwQ29kZWMtPm1fc3RhcnRYOw0KLSAgICBpbnQgc3RhcnRZID0gcENvZGVjLT5tX3N0YXJ0WTsNCi0gICAgaW50IHNpemVYID0gcENvZGVjLT5tX3NpemVYOw0KLSAgICBpbnQgc2l6ZVkgPSBwQ29kZWMtPm1fc2l6ZVk7DQotICAgIGludCBCcHAgPSBwRGV2aWNlLT5HZXRCUFAoKSAvIDg7DQotICAgIEZYX0FSR0IgYXJnYiA9IHBDb2RlYy0+bV9wU3JjUGFsZXR0ZVtwYWxfaW5kZXhdOw0KLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBzaXplWTsgcm93ICsrKSB7DQotICAgICAgICB1aW50OF90KiBwU2NhbmxpbmUgPSAodWludDhfdCopcERldmljZS0+R2V0U2NhbmxpbmUocm93ICsgc3RhcnRZKSArIHN0YXJ0WCAqIEJwcDsNCi0gICAgICAgIHN3aXRjaChwQ29kZWMtPm1fVHJhbnNNZXRob2QpIHsNCi0gICAgICAgICAgICBjYXNlIDM6CXsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JheSA9IEZYUkdCMkdSQVkoRlhBUkdCX1IoYXJnYiksIEZYQVJHQl9HKGFyZ2IpLCBGWEFSR0JfQihhcmdiKSk7DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQocFNjYW5saW5lLCBncmF5LCBzaXplWCk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgODoJew0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgc2l6ZVg7IGNvbCArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwU2NhbmxpbmUrKyA9IEZYQVJHQl9CKGFyZ2IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwU2NhbmxpbmUrKyA9IEZYQVJHQl9HKGFyZ2IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwU2NhbmxpbmUrKyA9IEZYQVJHQl9SKGFyZ2IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FubGluZSArPSBCcHAgLSAzOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIDEyOiB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBzaXplWDsgY29sICsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihwU2NhbmxpbmUsIGFyZ2IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTY2FubGluZSArPSA0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZSZWFkU2NhbmxpbmVDYWxsYmFjayh2b2lkKiBwTW9kdWxlLCBpbnQzMl90IHJvd19udW0sIHVpbnQ4X3QqIHJvd19idWYpDQotew0KLSAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCi0gICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcDsNCi0gICAgQVNTRVJUKHBESUJpdG1hcCAhPSBOVUxMKTsNCi0gICAgaW50MzJfdCBpbWdfd2lkdGggPSBwQ29kZWMtPm1fR2lmRnJhbWVSZWN0LldpZHRoKCk7DQotICAgIGlmICghcERJQml0bWFwLT5IYXNBbHBoYSgpKSB7DQotICAgICAgICB1aW50OF90KiBieXRlX3B0ciA9IHJvd19idWY7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltZ193aWR0aDsgaSsrICkgew0KLSAgICAgICAgICAgIGlmKCpieXRlX3B0ciA9PSBwQ29kZWMtPm1fR2lmVHJhbnNJbmRleCkgew0KLSAgICAgICAgICAgICAgICAqYnl0ZV9wdHIgPSBwQ29kZWMtPm1fR2lmQmdJbmRleDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnl0ZV9wdHIrKzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpbnQzMl90IHBhbF9pbmRleCA9IHBDb2RlYy0+bV9HaWZCZ0luZGV4Ow0KLSAgICBpZiAocENvZGVjLT5tX0dpZlRyYW5zSW5kZXggIT0gLTEgJiYgcENvZGVjLT5tX3BEZXZpY2VCaXRtYXAtPkhhc0FscGhhKCkpIHsNCi0gICAgICAgIHBhbF9pbmRleCA9IHBDb2RlYy0+bV9HaWZUcmFuc0luZGV4Ow0KLSAgICB9DQotICAgIEZYU1lTX21lbXNldChwQ29kZWMtPm1fcERlY29kZUJ1ZiwgcGFsX2luZGV4LCBwQ29kZWMtPm1fU3JjV2lkdGgpOw0KLSAgICBGWF9CT09MIGJMYXN0UGFzcyA9ICgocm93X251bSAlIDIpID09IDEpID8gVFJVRSA6IEZBTFNFOw0KLSAgICBpbnQzMl90IGxpbmUgPSByb3dfbnVtICsgcENvZGVjLT5tX0dpZkZyYW1lUmVjdC50b3A7DQotICAgIGludDMyX3QgbGVmdCA9IHBDb2RlYy0+bV9HaWZGcmFtZVJlY3QubGVmdDsNCi0gICAgRlhTWVNfbWVtY3B5KHBDb2RlYy0+bV9wRGVjb2RlQnVmICsgbGVmdCwgcm93X2J1ZiwgaW1nX3dpZHRoKTsNCi0gICAgaW50IHNyY190b3AgPSBwQ29kZWMtPm1fY2xpcEJveC50b3A7DQotICAgIGludCBzcmNfYm90dG9tID0gcENvZGVjLT5tX2NsaXBCb3guYm90dG9tOw0KLSAgICBpbnQgZGVzX3RvcCA9IHBDb2RlYy0+bV9zdGFydFk7DQotICAgIGludCBzcmNfaGVpID0gcENvZGVjLT5tX2NsaXBCb3guSGVpZ2h0KCk7DQotICAgIGludCBkZXNfaGVpID0gcENvZGVjLT5tX3NpemVZOw0KLSAgICBpZihsaW5lID49IHNyY190b3AgJiYgbGluZSA8IHNyY19ib3R0b20pIHsNCi0gICAgICAgIGRvdWJsZSBzY2FsZV95ID0gKGRvdWJsZSlkZXNfaGVpIC8gKGRvdWJsZSlzcmNfaGVpOw0KLSAgICAgICAgaW50IHNyY19yb3cgPSBsaW5lIC0gc3JjX3RvcDsNCi0gICAgICAgIGludCBkZXNfcm93ID0gKGludCkoc3JjX3JvdyAqIHNjYWxlX3kpICArIGRlc190b3A7DQotICAgICAgICBpZihkZXNfcm93ID49IGRlc190b3AgKyBkZXNfaGVpKQl7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcENvZGVjLT5SZVNhbXBsZVNjYW5saW5lKHBESUJpdG1hcCwgZGVzX3JvdywgcENvZGVjLT5tX3BEZWNvZGVCdWYsIHBDb2RlYy0+bV9TcmNGb3JtYXQpOw0KLSAgICAgICAgaWYoc2NhbGVfeSA+IDEuMCAmJiAoIXBDb2RlYy0+bV9iSW50ZXJwb2wgfHwgcENvZGVjLT5tX1NyY1Bhc3NOdW1iZXIgPT0gMSkpIHsNCi0gICAgICAgICAgICBwQ29kZWMtPlJlc2FtcGxlVmVydChwRElCaXRtYXAsIHNjYWxlX3ksIGRlc19yb3cpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKHNjYWxlX3kgPiAxLjApIHsNCi0gICAgICAgICAgICBpbnQgZGVzX2JvdHRvbSA9IGRlc190b3AgKyBwQ29kZWMtPm1fc2l6ZVk7DQotICAgICAgICAgICAgaW50IGRlc19CcHAgPSBwRElCaXRtYXAtPkdldEJQUCgpID4+IDM7DQotICAgICAgICAgICAgRlhfRFdPUkQgZGVzX1NjYW5PZmZldCA9IHBDb2RlYy0+bV9zdGFydFggKiBkZXNfQnBwOw0KLSAgICAgICAgICAgIGlmKGRlc19yb3cgKyAoaW50KXNjYWxlX3kgPj0gZGVzX2JvdHRvbSAtIDEpIHsNCi0gICAgICAgICAgICAgICAgdWludDhfdCogc2Nhbl9zcmMgPSAodWludDhfdCopcERJQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQotICAgICAgICAgICAgICAgIGludCBjdXJfcm93ID0gZGVzX3JvdzsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKCsrY3VyX3JvdyA8IGRlc19ib3R0b20pIHsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0gKHVpbnQ4X3QqKXBESUJpdG1hcC0+R2V0U2NhbmxpbmUoY3VyX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IHBDb2RlYy0+bV9zaXplWCAqIGRlc19CcHA7DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihiTGFzdFBhc3MpIHsNCi0gICAgICAgICAgICAgICAgcENvZGVjLT5HaWZEb3VibGVMaW5lUmVzYW1wbGVWZXJ0KHBESUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmRG91YmxlTGluZVJlc2FtcGxlVmVydChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGRvdWJsZSBzY2FsZV95LCBpbnQgZGVzX3JvdykNCi17DQotICAgIGludCBkZXNfQnBwID0gcERldmljZUJpdG1hcC0+R2V0QlBQKCkgPj4gMzsNCi0gICAgRlhfRFdPUkQgZGVzX1NjYW5PZmZldCA9IG1fc3RhcnRYICogZGVzX0JwcDsNCi0gICAgaW50IGRlc190b3AgPSBtX3N0YXJ0WTsNCi0gICAgaW50IGRlc19yb3dfMSA9IGRlc19yb3cgLSBpbnQoMiAqIHNjYWxlX3kpOw0KLSAgICBpZihkZXNfcm93XzEgPCBkZXNfdG9wKSB7DQotICAgICAgICBkZXNfcm93XzEgPSBkZXNfdG9wOw0KLSAgICB9DQotICAgIGZvciAoOyBkZXNfcm93XzEgPCBkZXNfcm93OyBkZXNfcm93XzErKykgew0KLSAgICAgICAgdWludDhfdCogc2Nhbl9kZXMgPSAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3Jvd18xKSArIGRlc19TY2FuT2ZmZXQ7DQotICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IG1fV2VpZ2h0VmVydC5HZXRQaXhlbFdlaWdodChkZXNfcm93XzEgLSBkZXNfdG9wKTsNCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fc3JjMSA9IHBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKHBXZWlnaHQtPm1fU3JjU3RhcnQgKyBkZXNfdG9wKSArIGRlc19TY2FuT2ZmZXQ7DQotICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX3NyYzIgPSBwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShwV2VpZ2h0LT5tX1NyY0VuZCArIGRlc190b3ApICsgZGVzX1NjYW5PZmZldDsNCi0gICAgICAgIGZvciAoaW50IGRlc19jb2wgPSAwOyBkZXNfY29sIDwgbV9zaXplWDsgZGVzX2NvbCsrKSB7DQotICAgICAgICAgICAgc3dpdGNoKHBEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfSW52YWxpZDoNCi0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoNCi0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOg0KLSAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwRGV2aWNlQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNfZyA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoZGVzX2cgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KLSAgICAgICAgICAgICAgICBjYXNlIEZYRElCX1JnYjMyOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3NyYzEgKz0gZGVzX0JwcCAtIDM7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9zcmMyICs9IGRlc19CcHAgLSAzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fZGVzICs9IGRlc19CcHAgLSAzOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfQXJnYjogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc19hID0gMCwgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfYSArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfYSArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2EpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpbnQgZGVzX2JvdHRvbSA9IGRlc190b3AgKyBtX3NpemVZIC0gMTsNCi0gICAgaWYoZGVzX3JvdyArIChpbnQpKDIgKiBzY2FsZV95KSA+PSBkZXNfYm90dG9tICYmIGRlc19yb3cgKyAoaW50KXNjYWxlX3kgPCBkZXNfYm90dG9tKSB7DQotICAgICAgICBHaWZEb3VibGVMaW5lUmVzYW1wbGVWZXJ0KHBEZXZpY2VCaXRtYXAsIHNjYWxlX3ksIGRlc19yb3cgKyAoaW50KXNjYWxlX3kpOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6Qm1wUmVhZE1vcmVEYXRhKElDb2RlY19CbXBNb2R1bGUqIHBCbXBNb2R1bGUsIEZYQ09ERUNfU1RBVFVTJiBlcnJfc3RhdHVzKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdTaXplID0gKEZYX0RXT1JEKW1fcEZpbGUtPkdldFNpemUoKTsNCi0gICAgaWYgKGR3U2l6ZSA8PSBtX29mZlNldCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGR3U2l6ZSA9IGR3U2l6ZSAtIG1fb2ZmU2V0Ow0KLSAgICBGWF9EV09SRCBkd0F2YWlsID0gcEJtcE1vZHVsZS0+R2V0QXZhaWxJbnB1dChtX3BCbXBDb250ZXh0LCBOVUxMKTsNCi0gICAgaWYgKGR3QXZhaWwgPT0gbV9TcmNTaXplKSB7DQotICAgICAgICBpZiAoZHdTaXplID4gRlhDT0RFQ19CTE9DS19TSVpFKSB7DQotICAgICAgICAgICAgZHdTaXplID0gRlhDT0RFQ19CTE9DS19TSVpFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9TcmNTaXplID0gKGR3U2l6ZSArIGR3QXZhaWwgKyBGWENPREVDX0JMT0NLX1NJWkUgLSAxKSAvIEZYQ09ERUNfQkxPQ0tfU0laRSAqIEZYQ09ERUNfQkxPQ0tfU0laRTsNCi0gICAgICAgIG1fcFNyY0J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgbV9wU3JjQnVmLCBtX1NyY1NpemUpOw0KLSAgICAgICAgaWYgKCFtX3BTcmNCdWYpIHsNCi0gICAgICAgICAgICBlcnJfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWF9EV09SRCBkd0NvbnN1bWUgPSBtX1NyY1NpemUgLSBkd0F2YWlsOw0KLSAgICAgICAgaWYgKGR3QXZhaWwpIHsNCi0gICAgICAgICAgICBGWFNZU19tZW1jcHkobV9wU3JjQnVmLCBtX3BTcmNCdWYgKyBkd0NvbnN1bWUsIGR3QXZhaWwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGR3U2l6ZSA+IGR3Q29uc3VtZSkgew0KLSAgICAgICAgICAgIGR3U2l6ZSA9IGR3Q29uc3VtZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoIW1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYgKyBkd0F2YWlsLCBtX29mZlNldCwgZHdTaXplKSkgew0KLSAgICAgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG1fb2ZmU2V0ICs9IGR3U2l6ZTsNCi0gICAgcEJtcE1vZHVsZS0+SW5wdXQobV9wQm1wQ29udGV4dCwgbV9wU3JjQnVmLCBkd1NpemUgKyBkd0F2YWlsKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6Qm1wSW5wdXRJbWFnZVBvc2l0aW9uQnVmQ2FsbGJhY2sodm9pZCogcE1vZHVsZSwgRlhfRFdPUkQgcmNkX3BvcykNCi17DQotICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KLSAgICBwQ29kZWMtPm1fb2ZmU2V0ID0gcmNkX3BvczsNCi0gICAgRlhDT0RFQ19TVEFUVVMgZXJyb3Jfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQotICAgIGlmKCFwQ29kZWMtPkJtcFJlYWRNb3JlRGF0YShwQ29kZWMtPm1fcENvZGVjTWdyLT5HZXRCbXBNb2R1bGUoKSwgZXJyb3Jfc3RhdHVzKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkJtcFJlYWRTY2FubGluZUNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsIGludDMyX3Qgcm93X251bSwgdWludDhfdCogcm93X2J1ZikNCi17DQotICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KLSAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwOw0KLSAgICBBU1NFUlQocERJQml0bWFwICE9IE5VTEwpOw0KLSAgICBGWFNZU19tZW1jcHkocENvZGVjLT5tX3BEZWNvZGVCdWYsIHJvd19idWYsIHBDb2RlYy0+bV9TY2FubGluZVNpemUpOw0KLSAgICBpbnQgc3JjX3RvcCA9IHBDb2RlYy0+bV9jbGlwQm94LnRvcDsNCi0gICAgaW50IHNyY19ib3R0b20gPSBwQ29kZWMtPm1fY2xpcEJveC5ib3R0b207DQotICAgIGludCBkZXNfdG9wID0gcENvZGVjLT5tX3N0YXJ0WTsNCi0gICAgaW50IHNyY19oZWkgPSBwQ29kZWMtPm1fY2xpcEJveC5IZWlnaHQoKTsNCi0gICAgaW50IGRlc19oZWkgPSBwQ29kZWMtPm1fc2l6ZVk7DQotICAgIGlmKHJvd19udW0gPj0gc3JjX3RvcCAmJiByb3dfbnVtIDwgc3JjX2JvdHRvbSkgew0KLSAgICAgICAgZG91YmxlIHNjYWxlX3kgPSAoZG91YmxlKWRlc19oZWkgLyAoZG91YmxlKXNyY19oZWk7DQotICAgICAgICBpbnQgc3JjX3JvdyA9IHJvd19udW0gLSBzcmNfdG9wOw0KLSAgICAgICAgaW50IGRlc19yb3cgPSAoaW50KShzcmNfcm93ICogc2NhbGVfeSkgICsgZGVzX3RvcDsNCi0gICAgICAgIGlmKGRlc19yb3cgPj0gZGVzX3RvcCArIGRlc19oZWkpCXsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBwQ29kZWMtPlJlU2FtcGxlU2NhbmxpbmUocERJQml0bWFwLCBkZXNfcm93LCBwQ29kZWMtPm1fcERlY29kZUJ1ZiwgcENvZGVjLT5tX1NyY0Zvcm1hdCk7DQotICAgICAgICBpZihzY2FsZV95ID4gMS4wKSB7DQotICAgICAgICAgICAgaWYocENvZGVjLT5tX0JtcElzVG9wQm90dG9tIHx8ICFwQ29kZWMtPm1fYkludGVycG9sKSB7DQotICAgICAgICAgICAgICAgIHBDb2RlYy0+UmVzYW1wbGVWZXJ0KHBESUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBwQ29kZWMtPlJlc2FtcGxlVmVydEJUKHBESUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UmVzYW1wbGVWZXJ0QlQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLCBkb3VibGUgc2NhbGVfeSwgaW50IGRlc19yb3cpDQotew0KLSAgICBpbnQgZGVzX0JwcCA9IHBEZXZpY2VCaXRtYXAtPkdldEJQUCgpID4+IDM7DQotICAgIEZYX0RXT1JEIGRlc19TY2FuT2ZmZXQgPSBtX3N0YXJ0WCAqIGRlc19CcHA7DQotICAgIGludCBkZXNfdG9wID0gbV9zdGFydFk7DQotICAgIGludCBkZXNfYm90dG9tID0gbV9zdGFydFkgKyBtX3NpemVZOw0KLSAgICBpbnQgZGVzX3Jvd18xID0gZGVzX3JvdyArIGludChzY2FsZV95KTsNCi0gICAgaWYoZGVzX3Jvd18xID49IGRlc19ib3R0b20gLSAxKSB7DQotICAgICAgICB1aW50OF90KiBzY2FuX3NyYyA9ICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQotICAgICAgICB3aGlsZSAoKytkZXNfcm93IDwgZGVzX2JvdHRvbSkgew0KLSAgICAgICAgICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0gKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsNCi0gICAgICAgICAgICBGWF9EV09SRCBzaXplID0gbV9zaXplWCAqIGRlc19CcHA7DQotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHNjYW5fZGVzLCBzY2FuX3NyYywgc2l6ZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgZm9yICg7IGRlc19yb3dfMSA+IGRlc19yb3c7IGRlc19yb3dfMS0tKSB7DQotICAgICAgICB1aW50OF90KiBzY2FuX2RlcyA9ICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93XzEpICsgZGVzX1NjYW5PZmZldDsNCi0gICAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0gbV9XZWlnaHRWZXJ0LkdldFBpeGVsV2VpZ2h0KGRlc19yb3dfMSAtIGRlc190b3ApOw0KLSAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9zcmMxID0gcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUocFdlaWdodC0+bV9TcmNTdGFydCArIGRlc190b3ApICsgZGVzX1NjYW5PZmZldDsNCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fc3JjMiA9IHBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKHBXZWlnaHQtPm1fU3JjRW5kICsgZGVzX3RvcCkgKyBkZXNfU2Nhbk9mZmV0Ow0KLSAgICAgICAgZm9yIChpbnQgZGVzX2NvbCA9IDA7IGRlc19jb2wgPCBtX3NpemVYOyBkZXNfY29sKyspIHsNCi0gICAgICAgICAgICBzd2l0Y2gocERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl9JbnZhbGlkOg0KLSAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOg0KLSAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6DQotICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBEZXZpY2VCaXRtYXAtPkdldFBhbGV0dGUoKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc19nID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KShkZXNfZyA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQotICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fc3JjMSArPSBkZXNfQnBwIC0gMzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3NyYzIgKz0gZGVzX0JwcCAtIDM7DQotICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9kZXMgKz0gZGVzX0JwcCAtIDM7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl9BcmdiOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2EgPSAwLCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19hICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19hICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfYSkgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6RGV0ZWN0SW1hZ2VUeXBlKEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpDQotew0KLSAgICBtX29mZlNldCA9IDA7DQotICAgIEZYX0RXT1JEIHNpemUgPSAoRlhfRFdPUkQpbV9wRmlsZS0+R2V0U2l6ZSgpOw0KLSAgICBpZihzaXplID4gRlhDT0RFQ19CTE9DS19TSVpFKSB7DQotICAgICAgICBzaXplID0gRlhDT0RFQ19CTE9DS19TSVpFOw0KLSAgICB9DQotICAgIGlmKG1fcFNyY0J1ZiAhPSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKG1fcFNyY0J1Zik7DQotICAgICAgICBtX3BTcmNCdWYgPSBOVUxMOw0KLSAgICB9DQotICAgIG1fcFNyY0J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOw0KLSAgICBpZihtX3BTcmNCdWYgPT0gTlVMTCkgew0KLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEZYU1lTX21lbXNldChtX3BTcmNCdWYsIDAsIHNpemUpOw0KLSAgICBtX1NyY1NpemUgPSBzaXplOw0KLSAgICBzd2l0Y2goaW1hZ2VUeXBlKSB7DQotICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfQk1QOiB7DQotICAgICAgICAgICAgICAgIElDb2RlY19CbXBNb2R1bGUqIHBCbXBNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0Qm1wTW9kdWxlKCk7DQotICAgICAgICAgICAgICAgIGlmKHBCbXBNb2R1bGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBCbXBNb2R1bGUtPklucHV0SW1hZ2VQb3NpdGlvbkJ1ZkNhbGxiYWNrID0gQm1wSW5wdXRJbWFnZVBvc2l0aW9uQnVmQ2FsbGJhY2s7DQotICAgICAgICAgICAgICAgIHBCbXBNb2R1bGUtPlJlYWRTY2FubGluZUNhbGxiYWNrID0gQm1wUmVhZFNjYW5saW5lQ2FsbGJhY2s7DQotICAgICAgICAgICAgICAgIG1fcEJtcENvbnRleHQgPSBwQm1wTW9kdWxlLT5TdGFydCgodm9pZCopdGhpcyk7DQotICAgICAgICAgICAgICAgIGlmKG1fcEJtcENvbnRleHQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc3VsdCA9IG1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYsIDAsIHNpemUpOw0KLSAgICAgICAgICAgICAgICBpZighYlJlc3VsdCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX29mZlNldCArPSBzaXplOw0KLSAgICAgICAgICAgICAgICBwQm1wTW9kdWxlLT5JbnB1dChtX3BCbXBDb250ZXh0LCBtX3BTcmNCdWYsIHNpemUpOw0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHJlYWRSZXN1bHQgPSBwQm1wTW9kdWxlLT5SZWFkSGVhZGVyKG1fcEJtcENvbnRleHQsICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsICZtX0JtcElzVG9wQm90dG9tLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fU3JjQ29tcG9uZW50cywgJm1fU3JjUGFsZXR0ZU51bWJlciwgJnBQYWxldHRlLCBwQXR0cmlidXRlKTsNCi0gICAgICAgICAgICAgICAgd2hpbGUocmVhZFJlc3VsdCA9PSAyKSB7DQotICAgICAgICAgICAgICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoIUJtcFJlYWRNb3JlRGF0YShwQm1wTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmVhZFJlc3VsdCA9IHBCbXBNb2R1bGUtPlJlYWRIZWFkZXIobV9wQm1wQ29udGV4dCwgJm1fU3JjV2lkdGgsICZtX1NyY0hlaWdodCwgJm1fQm1wSXNUb3BCb3R0b20sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9TcmNDb21wb25lbnRzLCAmbV9TcmNQYWxldHRlTnVtYmVyLCAmcFBhbGV0dGUsIHBBdHRyaWJ1dGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKHJlYWRSZXN1bHQgPT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9TcmNCUEMgPSA4Ow0KLSAgICAgICAgICAgICAgICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7DQotICAgICAgICAgICAgICAgICAgICBpZihtX3BTcmNQYWxldHRlICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKG1fcFNyY1BhbGV0dGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFNyY1BhbGV0dGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fU3JjUGFsZXR0ZU51bWJlcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFNyY1BhbGV0dGUgPSBGWF9BbGxvYyhGWF9BUkdCLCBtX1NyY1BhbGV0dGVOdW1iZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1fcFNyY1BhbGV0dGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFNyY1BhbGV0dGUsIHBQYWxldHRlLCBtX1NyY1BhbGV0dGVOdW1iZXIgKiBzaXplb2YoRlhfRFdPUkQpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKG1fcEJtcENvbnRleHQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgcEJtcE1vZHVsZS0+RmluaXNoKG1fcEJtcENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wQm1wQ29udGV4dCA9IE5VTEw7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX0pQRzogew0KLSAgICAgICAgICAgICAgICBJQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0SnBlZ01vZHVsZSgpOw0KLSAgICAgICAgICAgICAgICBpZihwSnBlZ01vZHVsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9wSnBlZ0NvbnRleHQgPSBwSnBlZ01vZHVsZS0+U3RhcnQoKTsNCi0gICAgICAgICAgICAgICAgaWYobV9wSnBlZ0NvbnRleHQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc3VsdCA9IG1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYsIDAsIHNpemUpOw0KLSAgICAgICAgICAgICAgICBpZighYlJlc3VsdCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX29mZlNldCArPSBzaXplOw0KLSAgICAgICAgICAgICAgICBwSnBlZ01vZHVsZS0+SW5wdXQobV9wSnBlZ0NvbnRleHQsIG1fcFNyY0J1Ziwgc2l6ZSk7DQotICAgICAgICAgICAgICAgIGludDMyX3QgcmVhZFJlc3VsdCA9IHBKcGVnTW9kdWxlLT5SZWFkSGVhZGVyKG1fcEpwZWdDb250ZXh0LCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LCAmbV9TcmNDb21wb25lbnRzLCBwQXR0cmlidXRlKTsNCi0gICAgICAgICAgICAgICAgd2hpbGUocmVhZFJlc3VsdCA9PSAyKSB7DQotICAgICAgICAgICAgICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoIUpwZWdSZWFkTW9yZURhdGEocEpwZWdNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZWFkUmVzdWx0ID0gcEpwZWdNb2R1bGUtPlJlYWRIZWFkZXIobV9wSnBlZ0NvbnRleHQsICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsICZtX1NyY0NvbXBvbmVudHMsIHBBdHRyaWJ1dGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKCFyZWFkUmVzdWx0KSB7DQotICAgICAgICAgICAgICAgICAgICBtX1NyY0JQQyA9IDg7DQotICAgICAgICAgICAgICAgICAgICBtX2NsaXBCb3ggPSBGWF9SRUNUKDAsIDAsIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0KTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKG1fcEpwZWdDb250ZXh0ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBKcGVnTW9kdWxlLT5GaW5pc2gobV9wSnBlZ0NvbnRleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wSnBlZ0NvbnRleHQgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6IHsNCi0gICAgICAgICAgICAgICAgSUNvZGVjX1BuZ01vZHVsZSogcFBuZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRQbmdNb2R1bGUoKTsNCi0gICAgICAgICAgICAgICAgaWYocFBuZ01vZHVsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcFBuZ01vZHVsZS0+UmVhZEhlYWRlckNhbGxiYWNrID0gQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UG5nUmVhZEhlYWRlckZ1bmM7DQotICAgICAgICAgICAgICAgIHBQbmdNb2R1bGUtPkFza1NjYW5saW5lQnVmQ2FsbGJhY2sgPSBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdBc2tTY2FubGluZUJ1ZkZ1bmM7DQotICAgICAgICAgICAgICAgIHBQbmdNb2R1bGUtPkZpbGxTY2FubGluZUJ1ZkNvbXBsZXRlZENhbGxiYWNrID0gQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UG5nRmlsbFNjYW5saW5lQnVmQ29tcGxldGVkRnVuYzsNCi0gICAgICAgICAgICAgICAgbV9wUG5nQ29udGV4dCA9IHBQbmdNb2R1bGUtPlN0YXJ0KCh2b2lkKil0aGlzKTsNCi0gICAgICAgICAgICAgICAgaWYobV9wUG5nQ29udGV4dCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgMCwgc2l6ZSk7DQotICAgICAgICAgICAgICAgIGlmKCFiUmVzdWx0KSB7DQotICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fb2ZmU2V0ICs9IHNpemU7DQotICAgICAgICAgICAgICAgIGJSZXN1bHQgPSBwUG5nTW9kdWxlLT5JbnB1dChtX3BQbmdDb250ZXh0LCBtX3BTcmNCdWYsIHNpemUsIHBBdHRyaWJ1dGUpOw0KLSAgICAgICAgICAgICAgICB3aGlsZShiUmVzdWx0KSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByZW1haW5fc2l6ZSA9IChGWF9EV09SRCltX3BGaWxlLT5HZXRTaXplKCkgLSBtX29mZlNldDsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGlucHV0X3NpemUgPSByZW1haW5fc2l6ZSA+IEZYQ09ERUNfQkxPQ0tfU0laRSA/IEZYQ09ERUNfQkxPQ0tfU0laRSA6IHJlbWFpbl9zaXplOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoaW5wdXRfc2l6ZSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYobV9wUG5nQ29udGV4dCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbmdNb2R1bGUtPkZpbmlzaChtX3BQbmdDb250ZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wUG5nQ29udGV4dCA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKG1fcFNyY0J1ZiAhPSBOVUxMICYmIGlucHV0X3NpemUgPiBtX1NyY1NpemUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKG1fcFNyY0J1Zik7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3JjQnVmID0gRlhfQWxsb2ModWludDhfdCwgaW5wdXRfc2l6ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYobV9wU3JjQnVmID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldChtX3BTcmNCdWYsIDAsIGlucHV0X3NpemUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fU3JjU2l6ZSA9IGlucHV0X3NpemU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgbV9vZmZTZXQsIGlucHV0X3NpemUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoIWJSZXN1bHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIG1fb2ZmU2V0ICs9IGlucHV0X3NpemU7DQotICAgICAgICAgICAgICAgICAgICBiUmVzdWx0ID0gcFBuZ01vZHVsZS0+SW5wdXQobV9wUG5nQ29udGV4dCwgbV9wU3JjQnVmLCBpbnB1dF9zaXplLCBwQXR0cmlidXRlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBBU1NFUlQoIWJSZXN1bHQpOw0KLSAgICAgICAgICAgICAgICBpZihtX3BQbmdDb250ZXh0ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBQbmdNb2R1bGUtPkZpbmlzaChtX3BQbmdDb250ZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgIG1fcFBuZ0NvbnRleHQgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKG1fU3JjUGFzc051bWJlciA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfR0lGOiB7DQotICAgICAgICAgICAgICAgIElDb2RlY19HaWZNb2R1bGUqIHBHaWZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0R2lmTW9kdWxlKCk7DQotICAgICAgICAgICAgICAgIGlmKHBHaWZNb2R1bGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBHaWZNb2R1bGUtPlJlY29yZEN1cnJlbnRQb3NpdGlvbkNhbGxiYWNrID0gQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmUmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2s7DQotICAgICAgICAgICAgICAgIHBHaWZNb2R1bGUtPkFza0xvY2FsUGFsZXR0ZUJ1ZkNhbGxiYWNrID0gQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmQXNrTG9jYWxQYWxldHRlQnVmQ2FsbGJhY2s7DQotICAgICAgICAgICAgICAgIHBHaWZNb2R1bGUtPklucHV0UmVjb3JkUG9zaXRpb25CdWZDYWxsYmFjayA9IENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZklucHV0UmVjb3JkUG9zaXRpb25CdWZDYWxsYmFjazsNCi0gICAgICAgICAgICAgICAgcEdpZk1vZHVsZS0+UmVhZFNjYW5saW5lQ2FsbGJhY2sgPSBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZSZWFkU2NhbmxpbmVDYWxsYmFjazsNCi0gICAgICAgICAgICAgICAgbV9wR2lmQ29udGV4dCA9IHBHaWZNb2R1bGUtPlN0YXJ0KCh2b2lkKil0aGlzKTsNCi0gICAgICAgICAgICAgICAgaWYobV9wR2lmQ29udGV4dCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgMCwgc2l6ZSk7DQotICAgICAgICAgICAgICAgIGlmKCFiUmVzdWx0KSB7DQotICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fb2ZmU2V0ICs9IHNpemU7DQotICAgICAgICAgICAgICAgIHBHaWZNb2R1bGUtPklucHV0KG1fcEdpZkNvbnRleHQsIG1fcFNyY0J1Ziwgc2l6ZSk7DQotICAgICAgICAgICAgICAgIG1fU3JjQ29tcG9uZW50cyA9IDE7DQotICAgICAgICAgICAgICAgIGludDMyX3QgcmVhZFJlc3VsdCA9IHBHaWZNb2R1bGUtPlJlYWRIZWFkZXIobV9wR2lmQ29udGV4dCwgJm1fU3JjV2lkdGgsICZtX1NyY0hlaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX0dpZlBsdE51bWJlciwgKHZvaWQqKikmbV9wR2lmUGFsZXR0ZSwgJm1fR2lmQmdJbmRleCk7DQotICAgICAgICAgICAgICAgIHdoaWxlKHJlYWRSZXN1bHQgPT0gMikgew0KLSAgICAgICAgICAgICAgICAgICAgRlhDT0RFQ19TVEFUVVMgZXJyb3Jfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFHaWZSZWFkTW9yZURhdGEocEdpZk1vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJlYWRSZXN1bHQgPSBwR2lmTW9kdWxlLT5SZWFkSGVhZGVyKG1fcEdpZkNvbnRleHQsICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9HaWZQbHROdW1iZXIsICh2b2lkKiopJm1fcEdpZlBhbGV0dGUsICZtX0dpZkJnSW5kZXgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKHJlYWRSZXN1bHQgPT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9TcmNCUEMgPSA4Ow0KLSAgICAgICAgICAgICAgICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZihtX3BHaWZDb250ZXh0ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBHaWZNb2R1bGUtPkZpbmlzaChtX3BHaWZDb250ZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgIG1fcEdpZkNvbnRleHQgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6IHsNCi0gICAgICAgICAgICAgICAgSUNvZGVjX1RpZmZNb2R1bGUqIHBUaWZmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFRpZmZNb2R1bGUoKTsNCi0gICAgICAgICAgICAgICAgaWYocFRpZmZNb2R1bGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fcFRpZmZDb250ZXh0ID0gcFRpZmZNb2R1bGUtPkNyZWF0ZURlY29kZXIobV9wRmlsZSk7DQotICAgICAgICAgICAgICAgIGlmKG1fcFRpZmZDb250ZXh0ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lcyA9IDA7DQotICAgICAgICAgICAgICAgIHBUaWZmTW9kdWxlLT5HZXRGcmFtZXMobV9wVGlmZkNvbnRleHQsIGZyYW1lcyk7DQotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJwYzsNCi0gICAgICAgICAgICAgICAgRlhfQk9PTCByZXQgPSBwVGlmZk1vZHVsZS0+TG9hZEZyYW1lSW5mbyhtX3BUaWZmQ29udGV4dCwgMCwgKEZYX0RXT1JEJiltX1NyY1dpZHRoLCAoRlhfRFdPUkQmKW1fU3JjSGVpZ2h0LCAoRlhfRFdPUkQmKW1fU3JjQ29tcG9uZW50cywgYnBjLCBwQXR0cmlidXRlKTsNCi0gICAgICAgICAgICAgICAgbV9TcmNDb21wb25lbnRzID0gNDsNCi0gICAgICAgICAgICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7DQotICAgICAgICAgICAgICAgIGlmKCFyZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBUaWZmTW9kdWxlLT5EZXN0cm95RGVjb2RlcihtX3BUaWZmQ29udGV4dCk7DQotICAgICAgICAgICAgICAgICAgICAobV9wVGlmZkNvbnRleHQgPSBOVUxMKTsNCi0gICAgICAgICAgICAgICAgICAgIChtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWENPREVDX1NUQVRVUyBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpMb2FkSW1hZ2VJbmZvKElGWF9GaWxlUmVhZCogcEZpbGUsIEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpDQotew0KLSAgICBzd2l0Y2gobV9zdGF0dXMpIHsNCi0gICAgICAgIGNhc2UgRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFk6DQotICAgICAgICBjYXNlIEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1RPQkVDT05USU5VRToNCi0gICAgICAgIGNhc2UgRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOg0KLSAgICAgICAgY2FzZSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOg0KLSAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgOw0KLSAgICB9DQotICAgIGlmKHBGaWxlID09IE5VTEwpIHsNCi0gICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsNCi0gICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgcmV0dXJuIG1fc3RhdHVzOw0KLSAgICB9DQotICAgIG1fcEZpbGUgPSBwRmlsZTsNCi0gICAgbV9vZmZTZXQgPSAwOw0KLSAgICBtX1NyY1dpZHRoID0gbV9TcmNIZWlnaHQgPSAwOw0KLSAgICBtX1NyY0NvbXBvbmVudHMgPSBtX1NyY0JQQyA9IDA7DQotICAgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgMCwgMCk7DQotICAgIG1fc3RhcnRYID0gbV9zdGFydFkgPSAwOw0KLSAgICBtX3NpemVYID0gbV9zaXplWSA9IDA7DQotICAgIG1fU3JjUGFzc051bWJlciA9IDA7DQotICAgIGlmKGltYWdlVHlwZSAhPSBGWENPREVDX0lNQUdFX1VOS05PV04gJiYNCi0gICAgICAgICAgICBEZXRlY3RJbWFnZVR5cGUoaW1hZ2VUeXBlLCBwQXR0cmlidXRlKSkgew0KLSAgICAgICAgbV9pbWFnVHlwZSA9IGltYWdlVHlwZTsNCi0gICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFk7DQotICAgICAgICByZXR1cm4gbV9zdGF0dXM7DQotICAgIH0NCi0gICAgZm9yIChpbnQgdHlwZSA9IEZYQ09ERUNfSU1BR0VfQk1QOyB0eXBlIDwgRlhDT0RFQ19JTUFHRV9NQVg7IHR5cGUrKykgew0KLSAgICAgICAgaWYoRGV0ZWN0SW1hZ2VUeXBlKChGWENPREVDX0lNQUdFX1RZUEUpdHlwZSwgcEF0dHJpYnV0ZSkpIHsNCi0gICAgICAgICAgICBtX2ltYWdUeXBlID0gKEZYQ09ERUNfSU1BR0VfVFlQRSl0eXBlOw0KLSAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFk7DQotICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCi0gICAgbV9wRmlsZSA9IE5VTEw7DQotICAgIHJldHVybiBtX3N0YXR1czsNCi19DQotdm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpTZXRDbGlwQm94KEZYX1JFQ1QqIGNsaXApDQotew0KLSAgICBpZihtX3N0YXR1cyAhPSBGWENPREVDX1NUQVRVU19GUkFNRV9SRUFEWSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmKGNsaXAtPklzRW1wdHkoKSkgew0KLSAgICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCAwLCAwKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZihjbGlwLT5sZWZ0IDwgMCkgew0KLSAgICAgICAgY2xpcC0+bGVmdCA9IDA7DQotICAgIH0NCi0gICAgaWYoY2xpcC0+cmlnaHQgPiBtX1NyY1dpZHRoKSB7DQotICAgICAgICBjbGlwLT5yaWdodCA9IG1fU3JjV2lkdGg7DQotICAgIH0NCi0gICAgaWYoY2xpcC0+dG9wIDwgMCkgew0KLSAgICAgICAgY2xpcC0+dG9wID0gMDsNCi0gICAgfQ0KLSAgICBpZihjbGlwLT5ib3R0b20gPiBtX1NyY0hlaWdodCkgew0KLSAgICAgICAgY2xpcC0+Ym90dG9tID0gbV9TcmNIZWlnaHQ7DQotICAgIH0NCi0gICAgaWYoY2xpcC0+SXNFbXB0eSgpKSB7DQotICAgICAgICBtX2NsaXBCb3ggPSBGWF9SRUNUKDAsIDAsIDAsIDApOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIG1fY2xpcEJveCA9ICpjbGlwOw0KLX0NCi12b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdldERvd25TY2FsZShpbnQmIGRvd25fc2NhbGUpDQotew0KLSAgICBkb3duX3NjYWxlID0gMTsNCi0gICAgaW50IHJhdGlvX3cgPSBtX2NsaXBCb3guV2lkdGgoKSAvIG1fc2l6ZVg7DQotICAgIGludCByYXRpb19oID0gbV9jbGlwQm94LkhlaWdodCgpIC8gbV9zaXplWTsNCi0gICAgaW50IHJhdGlvID0gKHJhdGlvX3cgPiByYXRpb19oKSA/IHJhdGlvX2ggOiByYXRpb193Ow0KLSAgICBpZiAocmF0aW8gPj0gOCkgew0KLSAgICAgICAgZG93bl9zY2FsZSA9IDg7DQotICAgIH0gZWxzZSBpZiAocmF0aW8gPj0gNCkJew0KLSAgICAgICAgZG93bl9zY2FsZSA9IDQ7DQotICAgIH0gZWxzZSBpZiAocmF0aW8gPj0gMikJew0KLSAgICAgICAgZG93bl9zY2FsZSA9IDI7DQotICAgIH0NCi0gICAgbV9jbGlwQm94LmxlZnQgLz0gZG93bl9zY2FsZTsNCi0gICAgbV9jbGlwQm94LnJpZ2h0IC89IGRvd25fc2NhbGU7DQotICAgIG1fY2xpcEJveC50b3AgLz0gZG93bl9zY2FsZTsNCi0gICAgbV9jbGlwQm94LmJvdHRvbSAvPSBkb3duX3NjYWxlOw0KLSAgICBpZihtX2NsaXBCb3gucmlnaHQgPT0gbV9jbGlwQm94LmxlZnQpIHsNCi0gICAgICAgIG1fY2xpcEJveC5yaWdodCA9IG1fY2xpcEJveC5sZWZ0ICsgMTsNCi0gICAgfQ0KLSAgICBpZihtX2NsaXBCb3guYm90dG9tID09IG1fY2xpcEJveC50b3ApIHsNCi0gICAgICAgIG1fY2xpcEJveC5ib3R0b20gPSBtX2NsaXBCb3gudG9wICsgMTsNCi0gICAgfQ0KLX0NCi12b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdldFRyYW5zTWV0aG9kKEZYRElCX0Zvcm1hdCBkZXNfZm9ybWF0LCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KQ0KLXsNCi0gICAgc3dpdGNoKGRlc19mb3JtYXQpIHsNCi0gICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQotICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsNCi0gICAgICAgICAgICAgICAgc3dpdGNoKHNyY19mb3JtYXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY18xYnBwR3JheToNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBBU1NFUlQoRkFMU0UpOw0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQogICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOg0KICAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7DQotICAgICAgICAgICAgICAgIHN3aXRjaChzcmNfZm9ybWF0KSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfMWJwcEdyYXk6DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfOGJwcEdyYXk6DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfMWJwcFJnYjoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY184YnBwUmdiOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjX1JnYjoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY19SZ2IzMjoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY19BcmdiOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjX0NteWs6DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDU7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhESUJfUmdiOiB7DQotICAgICAgICAgICAgICAgIHN3aXRjaChzcmNfZm9ybWF0KSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfMWJwcEdyYXk6DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDY7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfOGJwcEdyYXk6DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDc7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfMWJwcFJnYjoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY184YnBwUmdiOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA4Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjX1JnYjoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY19SZ2IzMjoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY19BcmdiOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA5Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjX0NteWs6DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDEwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gLTE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYRElCX1JnYjMyOg0KKyAgICAgICAgICBpZiAocERJQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWF9EV09SRCBkZXNfZyA9IDA7DQorICAgICAgICAgIGRlc19nICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqIHNyY19zY2FuW3NyY19jb2xdOw0KKyAgICAgICAgICBkZXNfc2NhbltwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XSA9ICh1aW50OF90KShkZXNfZyA+PiAxNik7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgICBjYXNlIEZYRElCX1JnYjMyOiB7DQorICAgICAgICAgIEZYX0RXT1JEIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBzcmNfc2NhbiArIHNyY19jb2wgKiBzcmNfQnBwOw0KKyAgICAgICAgICBkZXNfYiArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQorICAgICAgICAgIGRlc19nICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgICAgZGVzX3IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKTsNCisgICAgICAgICAgdWludDhfdCogcERlcyA9ICZkZXNfc2NhbltwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0ICogZGVzX0JwcF07DQorICAgICAgICAgICpwRGVzKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICpwRGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICpwRGVzID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgfSBicmVhazsNCiAgICAgICAgIGNhc2UgRlhESUJfQXJnYjogew0KLSAgICAgICAgICAgICAgICBzd2l0Y2goc3JjX2Zvcm1hdCkgew0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzFicHBHcmF5Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA2Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzhicHBHcmF5Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA3Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGWENvZGVjXzFicHBSZ2I6DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfOGJwcFJnYjoNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihkZXNfZm9ybWF0ID09IEZYRElCX0FyZ2IpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDEyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA4Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhDb2RlY19SZ2I6DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfUmdiMzI6DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfQ215azoNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMTA7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYQ29kZWNfQXJnYjoNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMTE7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgRlhfRFdPUkQgZGVzX3IgPSAwLCBkZXNfZyA9IDAsIGRlc19iID0gMDsNCisgICAgICAgICAgY29uc3QgdWludDhfdCogcCA9IHNyY19zY2FuICsgc3JjX2NvbCAqIHNyY19CcHA7DQorICAgICAgICAgIGRlc19iICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgICAgZGVzX2cgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKyspOw0KKyAgICAgICAgICBkZXNfciArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQorICAgICAgICAgIHVpbnQ4X3QqIHBEZXMgPSAmZGVzX3NjYW5bcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydCAqIGRlc19CcHBdOw0KKyAgICAgICAgICAqcERlcysrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgICAqcERlcysrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgICAqcERlcysrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAqcERlcyA9ICpwOw0KKyAgICAgICAgfSBicmVhazsNCiAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IC0xOw0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KICAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBfUkdCMkJHUih1aW50OF90KiBidWZmZXIsIGludCB3aWR0aCA9IDEpDQotew0KLSAgICBpZiAoYnVmZmVyICYmIHdpZHRoID4gMCkgew0KLSAgICAgICAgdWludDhfdCB0ZW1wOw0KLSAgICAgICAgaW50IGkgPSAwOw0KLSAgICAgICAgaW50IGogPSAwOw0KLSAgICAgICAgZm9yICg7IGkgPCB3aWR0aDsgaSsrLCBqICs9IDMpIHsNCi0gICAgICAgICAgICB0ZW1wID0gYnVmZmVyW2pdOw0KLSAgICAgICAgICAgIGJ1ZmZlcltqXSA9IGJ1ZmZlcltqICsgMl07DQotICAgICAgICAgICAgYnVmZmVyW2ogKyAyXSA9IHRlbXA7DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdPbmVPbmVNYXBSZXNhbXBsZUhvcnooDQorICAgIENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwNCisgICAgaW50MzJfdCBkZXNfbGluZSwNCisgICAgdWludDhfdCogc3JjX3NjYW4sDQorICAgIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpIHsNCisgIHVpbnQ4X3QqIGRlc19zY2FuID0gKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19saW5lKTsNCisgIGludDMyX3Qgc3JjX0JwcCA9IChtX1NyY0Zvcm1hdCAmIDB4ZmYpID4+IDM7DQorICBpbnQzMl90IGRlc19CcHAgPSBwRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA+PiAzOw0KKyAgaW50MzJfdCBzcmNfbGVmdCA9IG1fY2xpcEJveC5sZWZ0Ow0KKyAgaW50MzJfdCBkZXNfbGVmdCA9IG1fc3RhcnRYOw0KKyAgc3JjX3NjYW4gKz0gc3JjX2xlZnQgKiBzcmNfQnBwOw0KKyAgZGVzX3NjYW4gKz0gZGVzX2xlZnQgKiBkZXNfQnBwOw0KKyAgZm9yIChpbnQzMl90IGRlc19jb2wgPSAwOyBkZXNfY29sIDwgbV9zaXplWDsgZGVzX2NvbCsrKSB7DQorICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRIb3J6T08uR2V0UGl4ZWxXZWlnaHQoZGVzX2NvbCk7DQorICAgIHN3aXRjaCAocERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCisgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOg0KKyAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjoNCisgICAgICAgIEFTU0VSVChGQUxTRSk7DQorICAgICAgICByZXR1cm47DQorICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsNCisgICAgICAgIGlmIChwRGV2aWNlQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgew0KKyAgICAgICAgICByZXR1cm47DQogICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpSZVNhbXBsZVNjYW5saW5lKENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwgaW50IGRlc19saW5lLCB1aW50OF90KiBzcmNfc2NhbiwgRlhDb2RlY19Gb3JtYXQgc3JjX2Zvcm1hdCkNCi17DQotICAgIGludCBzcmNfbGVmdCA9IG1fY2xpcEJveC5sZWZ0Ow0KLSAgICBpbnQgZGVzX2xlZnQgPSBtX3N0YXJ0WDsNCi0gICAgdWludDhfdCogZGVzX3NjYW4gPSBwRGV2aWNlQml0bWFwLT5HZXRCdWZmZXIoKSArIGRlc19saW5lICogcERldmljZUJpdG1hcC0+R2V0UGl0Y2goKTsNCi0gICAgaW50IHNyY19icHAgPSBzcmNfZm9ybWF0ICYgMHhmZjsNCi0gICAgaW50IGRlc19icHAgPSBwRGV2aWNlQml0bWFwLT5HZXRCUFAoKTsNCi0gICAgaW50IHNyY19CcHAgPSBzcmNfYnBwID4+IDM7DQotICAgIGludCBkZXNfQnBwID0gZGVzX2JwcCA+PiAzOw0KLSAgICBzcmNfc2NhbiArPSBzcmNfbGVmdCAqIHNyY19CcHA7DQotICAgIGRlc19zY2FuICs9IGRlc19sZWZ0ICogZGVzX0JwcDsNCi0gICAgZm9yIChpbnQgZGVzX2NvbCA9IDA7IGRlc19jb2wgPCBtX3NpemVYOyBkZXNfY29sKyspIHsNCi0gICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRIb3J6LkdldFBpeGVsV2VpZ2h0KGRlc19jb2wpOw0KLSAgICAgICAgc3dpdGNoKG1fVHJhbnNNZXRob2QpIHsNCi0gICAgICAgICAgICBjYXNlIC0xOg0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgY2FzZSAyOiB7DQotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfZyA9IDA7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bal07DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KShkZXNfZyA+PiAxNik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAzOiB7DQotICAgICAgICAgICAgICAgICAgICBpbnQgZGVzX3IgPSAwLCBkZXNfZyA9IDAsIGRlc19iID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqICsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07DQotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdiID0gbV9wU3JjUGFsZXR0ZVtzcmNfc2NhbltqXV07DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2IgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiID4+IDgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KWFyZ2I7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KUZYUkdCMkdSQVkoKGRlc19yID4+IDE2KSwgKGRlc19nID4+IDE2KSwgKGRlc19iID4+IDE2KSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSA0OiB7DQotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIHNyY19CcHA7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdClGWFJHQjJHUkFZKChkZXNfciA+PiAxNiksIChkZXNfZyA+PiAxNiksIChkZXNfYiA+PiAxNikpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgNTogew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWwgPSBzcmNfc2NhbiArIGogKiBzcmNfQnBwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX2IgPSAwLCBzcmNfZyA9IDAsIHNyY19yID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoMjU1IC0gc3JjX3BpeGVsWzBdLCAyNTUgLSBzcmNfcGl4ZWxbMV0sIDI1NSAtIHNyY19waXhlbFsyXSwgMjU1IC0gc3JjX3BpeGVsWzNdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfciwgc3JjX2csIHNyY19iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiBzcmNfYjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiBzcmNfZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwaXhlbF93ZWlnaHQgKiBzcmNfcjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpRlhSR0IyR1JBWSgoZGVzX3IgPj4gMTYpLCAoZGVzX2cgPj4gMTYpLCAoZGVzX2IgPj4gMTYpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICBjYXNlIDc6IHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc19nID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiBzcmNfc2NhbltqXTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldChkZXNfc2NhbiwgKHVpbnQ4X3QpKGRlc19nID4+IDE2KSwgMyk7DQotICAgICAgICAgICAgICAgICAgICBkZXNfc2NhbiArPSBkZXNfQnBwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgODogew0KLSAgICAgICAgICAgICAgICAgICAgaW50IGRlc19yID0gMCwgZGVzX2cgPSAwLCBkZXNfYiA9IDA7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYiA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYiA+PiA4KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdClhcmdiOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgZGVzX3NjYW4gKz0gZGVzX0JwcCAtIDM7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAxMjogew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fcEJtcENvbnRleHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzX3IgPSAwLCBkZXNfZyA9IDAsIGRlc19iID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdiID0gbV9wU3JjUGFsZXR0ZVtzcmNfc2NhbltqXV07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2IgPj4gOCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KWFyZ2I7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gMHhGRjsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc19hID0gMCwgZGVzX3IgPSAwLCBkZXNfZyA9IDAsIGRlc19iID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdiID0gbV9wU3JjUGFsZXR0ZVtzcmNfc2NhbltqXV07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19hICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiID4+IDI0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2IgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYiA+PiA4KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpYXJnYjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19hKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSA5OiB7DQotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIHNyY19CcHA7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgZGVzX3NjYW4gKz0gZGVzX0JwcCAtIDM7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAxMDogew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWwgPSBzcmNfc2NhbiArIGogKiBzcmNfQnBwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX2IgPSAwLCBzcmNfZyA9IDAsIHNyY19yID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoMjU1IC0gc3JjX3BpeGVsWzBdLCAyNTUgLSBzcmNfcGl4ZWxbMV0sIDI1NSAtIHNyY19waXhlbFsyXSwgMjU1IC0gc3JjX3BpeGVsWzNdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfciwgc3JjX2csIHNyY19iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiBzcmNfYjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiBzcmNfZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwaXhlbF93ZWlnaHQgKiBzcmNfcjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgIGRlc19zY2FuICs9IGRlc19CcHAgLSAzOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgMTE6IHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc19hbHBoYSA9IDAsIGRlc19yID0gMCwgZGVzX2cgPSAwLCBkZXNfYiA9IDA7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIHNyY19CcHA7DQotICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ID0gcGl4ZWxfd2VpZ2h0ICogc3JjX3BpeGVsWzNdIC8gMjU1Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNfYWxwaGEgKz0gcGl4ZWxfd2VpZ2h0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19hbHBoYSAqIDI1NSkgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlJlc2FtcGxlVmVydChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGRvdWJsZSBzY2FsZV95LCBpbnQgZGVzX3JvdykNCi17DQotICAgIGludCBkZXNfQnBwID0gcERldmljZUJpdG1hcC0+R2V0QlBQKCkgPj4gMzsNCi0gICAgRlhfRFdPUkQgZGVzX1NjYW5PZmZldCA9IG1fc3RhcnRYICogZGVzX0JwcDsNCi0gICAgaWYobV9iSW50ZXJwb2wpIHsNCi0gICAgICAgIGludCBkZXNfdG9wID0gbV9zdGFydFk7DQotICAgICAgICBpbnQgZGVzX3Jvd18xID0gZGVzX3JvdyAtIGludChzY2FsZV95KTsNCi0gICAgICAgIGlmKGRlc19yb3dfMSA8IGRlc190b3ApIHsNCi0gICAgICAgICAgICBpbnQgZGVzX2JvdHRvbSA9IGRlc190b3AgKyBtX3NpemVZOw0KLSAgICAgICAgICAgIGlmKGRlc19yb3cgKyAoaW50KXNjYWxlX3kgPj0gZGVzX2JvdHRvbSAtIDEpIHsNCi0gICAgICAgICAgICAgICAgdWludDhfdCogc2Nhbl9zcmMgPSAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKytkZXNfcm93IDwgZGVzX2JvdHRvbSkgew0KLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc2Nhbl9kZXMgPSAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IG1fc2l6ZVggKiBkZXNfQnBwOw0KLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHNjYW5fZGVzLCBzY2FuX3NyYywgc2l6ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yICg7IGRlc19yb3dfMSA8IGRlc19yb3c7IGRlc19yb3dfMSsrKSB7DQotICAgICAgICAgICAgdWludDhfdCogc2Nhbl9kZXMgPSAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3Jvd18xKSArIGRlc19TY2FuT2ZmZXQ7DQotICAgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPSBtX1dlaWdodFZlcnQuR2V0UGl4ZWxXZWlnaHQoZGVzX3Jvd18xIC0gZGVzX3RvcCk7DQotICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9zcmMxID0gcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUocFdlaWdodC0+bV9TcmNTdGFydCArIGRlc190b3ApICsgZGVzX1NjYW5PZmZldDsNCi0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX3NyYzIgPSBwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShwV2VpZ2h0LT5tX1NyY0VuZCArIGRlc190b3ApICsgZGVzX1NjYW5PZmZldDsNCi0gICAgICAgICAgICBmb3IgKGludCBkZXNfY29sID0gMDsgZGVzX2NvbCA8IG1fc2l6ZVg7IGRlc19jb2wrKykgew0KLSAgICAgICAgICAgICAgICBzd2l0Y2gocERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfSW52YWxpZDoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwRGV2aWNlQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNfZyA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoZGVzX2cgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3NyYzEgKz0gZGVzX0JwcCAtIDM7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fc3JjMiArPSBkZXNfQnBwIC0gMzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9kZXMgKz0gZGVzX0JwcCAtIDM7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9BcmdiOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc19hID0gMCwgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2EgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc19hICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2EpID4+IDE2KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGludCBkZXNfYm90dG9tID0gZGVzX3RvcCArIG1fc2l6ZVk7DQotICAgICAgICBpZihkZXNfcm93ICsgKGludClzY2FsZV95ID49IGRlc19ib3R0b20gLSAxKSB7DQotICAgICAgICAgICAgdWludDhfdCogc2Nhbl9zcmMgPSAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KLSAgICAgICAgICAgIHdoaWxlICgrK2Rlc19yb3cgPCBkZXNfYm90dG9tKSB7DQotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0gKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsNCi0gICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IG1fc2l6ZVggKiBkZXNfQnBwOw0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICAgICAgICBGWF9EV09SRCBkZXNfZyA9IDA7DQorICAgICAgICBkZXNfZyArPQ0KKyAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqIHNyY19zY2FuW3BQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgZGVzX2cgKz0NCisgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiBzcmNfc2NhbltwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZF07DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KShkZXNfZyA+PiAxNik7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZYRElCX1JnYjoNCisgICAgICBjYXNlIEZYRElCX1JnYjMyOiB7DQorICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgY29uc3QgdWludDhfdCogcCA9IHNyY19zY2FuOw0KKyAgICAgICAgcCA9IHNyY19zY2FuICsgcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydCAqIHNyY19CcHA7DQorICAgICAgICBkZXNfYiArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQorICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQorICAgICAgICBkZXNfciArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnApOw0KKyAgICAgICAgcCA9IHNyY19zY2FuICsgcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQgKiBzcmNfQnBwOw0KKyAgICAgICAgZGVzX2IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzFdICogKCpwKyspOw0KKyAgICAgICAgZGVzX2cgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzFdICogKCpwKyspOw0KKyAgICAgICAgZGVzX3IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzFdICogKCpwKTsNCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgIGRlc19zY2FuICs9IGRlc19CcHAgLSAzOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBGWERJQl9BcmdiOiB7DQorICAgICAgICBGWF9EV09SRCBkZXNfYSA9IDAsIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICBjb25zdCB1aW50OF90KiBwID0gc3JjX3NjYW47DQorICAgICAgICBwID0gc3JjX3NjYW4gKyBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0ICogc3JjX0JwcDsNCisgICAgICAgIGRlc19iICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgIGRlc19nICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgIGRlc19yICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgIGRlc19hICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCk7DQorICAgICAgICBwID0gc3JjX3NjYW4gKyBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZCAqIHNyY19CcHA7DQorICAgICAgICBkZXNfYiArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnArKyk7DQorICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnArKyk7DQorICAgICAgICBkZXNfciArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnArKyk7DQorICAgICAgICBkZXNfYSArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnApOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19hKSA+PiAxNik7DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KICAgICAgICAgcmV0dXJuOw0KICAgICB9DQotICAgIGludCBtdWx0aXBsZSA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc2NhbGVfeSAtIDEpOw0KLSAgICBpZihtdWx0aXBsZSA+IDApIHsNCi0gICAgICAgIHVpbnQ4X3QqIHNjYW5fc3JjID0gKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsNCi0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG11bHRpcGxlOyBpKyspIHsNCi0gICAgICAgICAgICBpZihkZXNfcm93ICsgaSA+PSBtX3N0YXJ0WSArIG1fc2l6ZVkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB1aW50OF90KiBzY2FuX2RlcyA9ICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93ICsgaSkgKyBkZXNfU2Nhbk9mZmV0Ow0KLSAgICAgICAgICAgIEZYX0RXT1JEIHNpemUgPSBtX3NpemVYICogZGVzX0JwcDsNCi0gICAgICAgICAgICBGWFNZU19tZW1jcHkoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlJlc2FtcGxlKENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwgaW50MzJfdCBzcmNfbGluZSwgdWludDhfdCogc3JjX3NjYW4sIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpDQotew0KLSAgICBpbnQgc3JjX3RvcCA9IG1fY2xpcEJveC50b3A7DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdGaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWRGdW5jKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgew0KKyAgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogcENvZGVjID0gKENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqKXBNb2R1bGU7DQorICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwOw0KKyAgQVNTRVJUKHBESUJpdG1hcCAhPSBOVUxMKTsNCisgIGludCBzcmNfdG9wID0gcENvZGVjLT5tX2NsaXBCb3gudG9wOw0KKyAgaW50IHNyY19ib3R0b20gPSBwQ29kZWMtPm1fY2xpcEJveC5ib3R0b207DQorICBpbnQgZGVzX3RvcCA9IHBDb2RlYy0+bV9zdGFydFk7DQorICBpbnQgc3JjX2hlaSA9IHBDb2RlYy0+bV9jbGlwQm94LkhlaWdodCgpOw0KKyAgaW50IGRlc19oZWkgPSBwQ29kZWMtPm1fc2l6ZVk7DQorICBpZiAobGluZSA+PSBzcmNfdG9wICYmIGxpbmUgPCBzcmNfYm90dG9tKSB7DQorICAgIGRvdWJsZSBzY2FsZV95ID0gKGRvdWJsZSlkZXNfaGVpIC8gKGRvdWJsZSlzcmNfaGVpOw0KKyAgICBpbnQgc3JjX3JvdyA9IGxpbmUgLSBzcmNfdG9wOw0KKyAgICBpbnQgZGVzX3JvdyA9IChpbnQpKHNyY19yb3cgKiBzY2FsZV95KSArIGRlc190b3A7DQorICAgIGlmIChkZXNfcm93ID49IGRlc190b3AgKyBkZXNfaGVpKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBDb2RlYy0+UG5nT25lT25lTWFwUmVzYW1wbGVIb3J6KHBESUJpdG1hcCwgZGVzX3JvdywgcENvZGVjLT5tX3BEZWNvZGVCdWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2RlYy0+bV9TcmNGb3JtYXQpOw0KKyAgICBpZiAocENvZGVjLT5tX1NyY1Bhc3NOdW1iZXIgPT0gMSAmJiBzY2FsZV95ID4gMS4wKSB7DQorICAgICAgcENvZGVjLT5SZXNhbXBsZVZlcnQocERJQml0bWFwLCBzY2FsZV95LCBkZXNfcm93KTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHBhc3MgPT0gNiAmJiBzY2FsZV95ID4gMS4wKSB7DQorICAgICAgcENvZGVjLT5SZXNhbXBsZVZlcnQocERJQml0bWFwLCBzY2FsZV95LCBkZXNfcm93KTsNCisgICAgfQ0KKyAgfQ0KK30NCitGWF9CT09MIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZlJlYWRNb3JlRGF0YShJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTJiBlcnJfc3RhdHVzKSB7DQorICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpbV9wRmlsZS0+R2V0U2l6ZSgpOw0KKyAgaWYgKGR3U2l6ZSA8PSBtX29mZlNldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBkd1NpemUgPSBkd1NpemUgLSBtX29mZlNldDsNCisgIEZYX0RXT1JEIGR3QXZhaWwgPSBwR2lmTW9kdWxlLT5HZXRBdmFpbElucHV0KG1fcEdpZkNvbnRleHQsIE5VTEwpOw0KKyAgaWYgKGR3QXZhaWwgPT0gbV9TcmNTaXplKSB7DQorICAgIGlmIChkd1NpemUgPiBGWENPREVDX0JMT0NLX1NJWkUpIHsNCisgICAgICBkd1NpemUgPSBGWENPREVDX0JMT0NLX1NJWkU7DQorICAgIH0NCisgICAgbV9TcmNTaXplID0gKGR3U2l6ZSArIGR3QXZhaWwgKyBGWENPREVDX0JMT0NLX1NJWkUgLSAxKSAvDQorICAgICAgICAgICAgICAgIEZYQ09ERUNfQkxPQ0tfU0laRSAqIEZYQ09ERUNfQkxPQ0tfU0laRTsNCisgICAgbV9wU3JjQnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BTcmNCdWYsIG1fU3JjU2l6ZSk7DQorICAgIGlmICghbV9wU3JjQnVmKSB7DQorICAgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBGWF9EV09SRCBkd0NvbnN1bWUgPSBtX1NyY1NpemUgLSBkd0F2YWlsOw0KKyAgICBpZiAoZHdBdmFpbCkgew0KKyAgICAgIEZYU1lTX21lbWNweShtX3BTcmNCdWYsIG1fcFNyY0J1ZiArIGR3Q29uc3VtZSwgZHdBdmFpbCk7DQorICAgIH0NCisgICAgaWYgKGR3U2l6ZSA+IGR3Q29uc3VtZSkgew0KKyAgICAgIGR3U2l6ZSA9IGR3Q29uc3VtZTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmICsgZHdBdmFpbCwgbV9vZmZTZXQsIGR3U2l6ZSkpIHsNCisgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX29mZlNldCArPSBkd1NpemU7DQorICBwR2lmTW9kdWxlLT5JbnB1dChtX3BHaWZDb250ZXh0LCBtX3BTcmNCdWYsIGR3U2l6ZSArIGR3QXZhaWwpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmUmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2soDQorICAgIHZvaWQqIHBNb2R1bGUsDQorICAgIEZYX0RXT1JEJiBjdXJfcG9zKSB7DQorICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCisgIEZYX0RXT1JEIHJlbWFpbl9zaXplID0NCisgICAgICBwQ29kZWMtPm1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKS0+R2V0QXZhaWxJbnB1dChwQ29kZWMtPm1fcEdpZkNvbnRleHQpOw0KKyAgY3VyX3BvcyA9IHBDb2RlYy0+bV9vZmZTZXQgLSByZW1haW5fc2l6ZTsNCit9DQordWludDhfdCogQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmQXNrTG9jYWxQYWxldHRlQnVmQ2FsbGJhY2soDQorICAgIHZvaWQqIHBNb2R1bGUsDQorICAgIGludDMyX3QgZnJhbWVfbnVtLA0KKyAgICBpbnQzMl90IHBhbF9zaXplKSB7DQorICByZXR1cm4gRlhfQWxsb2ModWludDhfdCwgcGFsX3NpemUpOw0KK30NCitGWF9CT09MIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZklucHV0UmVjb3JkUG9zaXRpb25CdWZDYWxsYmFjaygNCisgICAgdm9pZCogcE1vZHVsZSwNCisgICAgRlhfRFdPUkQgcmNkX3BvcywNCisgICAgY29uc3QgRlhfUkVDVCYgaW1nX3JjLA0KKyAgICBpbnQzMl90IHBhbF9udW0sDQorICAgIHZvaWQqIHBhbF9wdHIsDQorICAgIGludDMyX3QgZGVsYXlfdGltZSwNCisgICAgRlhfQk9PTCB1c2VyX2lucHV0LA0KKyAgICBpbnQzMl90IHRyYW5zX2luZGV4LA0KKyAgICBpbnQzMl90IGRpc3Bvc2FsX21ldGhvZCwNCisgICAgRlhfQk9PTCBpbnRlcmxhY2UpIHsNCisgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KKyAgcENvZGVjLT5tX29mZlNldCA9IHJjZF9wb3M7DQorICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgIGlmICghcENvZGVjLT5HaWZSZWFkTW9yZURhdGEocENvZGVjLT5tX3BDb2RlY01nci0+R2V0R2lmTW9kdWxlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0YXR1cykpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdWludDhfdCogcFBhbGV0dGUgPSBOVUxMOw0KKyAgaWYgKHBhbF9udW0gIT0gMCAmJiBwYWxfcHRyKSB7DQorICAgIHBQYWxldHRlID0gKHVpbnQ4X3QqKXBhbF9wdHI7DQorICB9IGVsc2Ugew0KKyAgICBwYWxfbnVtID0gcENvZGVjLT5tX0dpZlBsdE51bWJlcjsNCisgICAgcFBhbGV0dGUgPSBwQ29kZWMtPm1fcEdpZlBhbGV0dGU7DQorICB9DQorICBpZiAocENvZGVjLT5tX3BTcmNQYWxldHRlID09IE5VTEwpIHsNCisgICAgcENvZGVjLT5tX3BTcmNQYWxldHRlID0gRlhfQWxsb2MoRlhfQVJHQiwgcGFsX251bSk7DQorICB9IGVsc2UgaWYgKHBhbF9udW0gPiBwQ29kZWMtPm1fU3JjUGFsZXR0ZU51bWJlcikgew0KKyAgICBwQ29kZWMtPm1fcFNyY1BhbGV0dGUgPSBGWF9SZWFsbG9jKEZYX0FSR0IsIHBDb2RlYy0+bV9wU3JjUGFsZXR0ZSwgcGFsX251bSk7DQorICB9DQorICBpZiAocENvZGVjLT5tX3BTcmNQYWxldHRlID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcENvZGVjLT5tX1NyY1BhbGV0dGVOdW1iZXIgPSBwYWxfbnVtOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfbnVtOyBpKyspIHsNCisgICAgcmVnaXN0ZXIgRlhfRFdPUkQgaiA9IGkgKiAzOw0KKyAgICBwQ29kZWMtPm1fcFNyY1BhbGV0dGVbaV0gPQ0KKyAgICAgICAgQXJnYkVuY29kZSgweGZmLCBwUGFsZXR0ZVtqXSwgcFBhbGV0dGVbaiArIDFdLCBwUGFsZXR0ZVtqICsgMl0pOw0KKyAgfQ0KKyAgcENvZGVjLT5tX0dpZlRyYW5zSW5kZXggPSB0cmFuc19pbmRleDsNCisgIHBDb2RlYy0+bV9HaWZGcmFtZVJlY3QgPSBpbWdfcmM7DQorICBwQ29kZWMtPm1fU3JjUGFzc051bWJlciA9IGludGVybGFjZSA/IDQgOiAxOw0KKyAgaW50MzJfdCBwYWxfaW5kZXggPSBwQ29kZWMtPm1fR2lmQmdJbmRleDsNCisgIENGWF9ESUJpdG1hcCogcERldmljZSA9IHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwOw0KKyAgaWYgKHRyYW5zX2luZGV4ID49IHBhbF9udW0pIHsNCisgICAgdHJhbnNfaW5kZXggPSAtMTsNCisgIH0NCisgIGlmICh0cmFuc19pbmRleCAhPSAtMSkgew0KKyAgICBwQ29kZWMtPm1fcFNyY1BhbGV0dGVbdHJhbnNfaW5kZXhdICY9IDB4MDBmZmZmZmY7DQorICAgIGlmIChwRGV2aWNlLT5IYXNBbHBoYSgpKSB7DQorICAgICAgcGFsX2luZGV4ID0gdHJhbnNfaW5kZXg7DQorICAgIH0NCisgIH0NCisgIGludCBzdGFydFggPSBwQ29kZWMtPm1fc3RhcnRYOw0KKyAgaW50IHN0YXJ0WSA9IHBDb2RlYy0+bV9zdGFydFk7DQorICBpbnQgc2l6ZVggPSBwQ29kZWMtPm1fc2l6ZVg7DQorICBpbnQgc2l6ZVkgPSBwQ29kZWMtPm1fc2l6ZVk7DQorICBpbnQgQnBwID0gcERldmljZS0+R2V0QlBQKCkgLyA4Ow0KKyAgRlhfQVJHQiBhcmdiID0gcENvZGVjLT5tX3BTcmNQYWxldHRlW3BhbF9pbmRleF07DQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBzaXplWTsgcm93KyspIHsNCisgICAgdWludDhfdCogcFNjYW5saW5lID0NCisgICAgICAgICh1aW50OF90KilwRGV2aWNlLT5HZXRTY2FubGluZShyb3cgKyBzdGFydFkpICsgc3RhcnRYICogQnBwOw0KKyAgICBzd2l0Y2ggKHBDb2RlYy0+bV9UcmFuc01ldGhvZCkgew0KKyAgICAgIGNhc2UgMzogew0KKyAgICAgICAgdWludDhfdCBncmF5ID0NCisgICAgICAgICAgICBGWFJHQjJHUkFZKEZYQVJHQl9SKGFyZ2IpLCBGWEFSR0JfRyhhcmdiKSwgRlhBUkdCX0IoYXJnYikpOw0KKyAgICAgICAgRlhTWVNfbWVtc2V0KHBTY2FubGluZSwgZ3JheSwgc2l6ZVgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgODogew0KKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgc2l6ZVg7IGNvbCsrKSB7DQorICAgICAgICAgICpwU2NhbmxpbmUrKyA9IEZYQVJHQl9CKGFyZ2IpOw0KKyAgICAgICAgICAqcFNjYW5saW5lKysgPSBGWEFSR0JfRyhhcmdiKTsNCisgICAgICAgICAgKnBTY2FubGluZSsrID0gRlhBUkdCX1IoYXJnYik7DQorICAgICAgICAgIHBTY2FubGluZSArPSBCcHAgLSAzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgMTI6IHsNCisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHNpemVYOyBjb2wrKykgew0KKyAgICAgICAgICBGWEFSR0JfU0VURElCKHBTY2FubGluZSwgYXJnYik7DQorICAgICAgICAgIHBTY2FubGluZSArPSA0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZSZWFkU2NhbmxpbmVDYWxsYmFjayh2b2lkKiBwTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcm93X2J1Zikgew0KKyAgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogcENvZGVjID0gKENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqKXBNb2R1bGU7DQorICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwOw0KKyAgQVNTRVJUKHBESUJpdG1hcCAhPSBOVUxMKTsNCisgIGludDMyX3QgaW1nX3dpZHRoID0gcENvZGVjLT5tX0dpZkZyYW1lUmVjdC5XaWR0aCgpOw0KKyAgaWYgKCFwRElCaXRtYXAtPkhhc0FscGhhKCkpIHsNCisgICAgdWludDhfdCogYnl0ZV9wdHIgPSByb3dfYnVmOw0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGltZ193aWR0aDsgaSsrKSB7DQorICAgICAgaWYgKCpieXRlX3B0ciA9PSBwQ29kZWMtPm1fR2lmVHJhbnNJbmRleCkgew0KKyAgICAgICAgKmJ5dGVfcHRyID0gcENvZGVjLT5tX0dpZkJnSW5kZXg7DQorICAgICAgfQ0KKyAgICAgIGJ5dGVfcHRyKys7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgcGFsX2luZGV4ID0gcENvZGVjLT5tX0dpZkJnSW5kZXg7DQorICBpZiAocENvZGVjLT5tX0dpZlRyYW5zSW5kZXggIT0gLTEgJiYgcENvZGVjLT5tX3BEZXZpY2VCaXRtYXAtPkhhc0FscGhhKCkpIHsNCisgICAgcGFsX2luZGV4ID0gcENvZGVjLT5tX0dpZlRyYW5zSW5kZXg7DQorICB9DQorICBGWFNZU19tZW1zZXQocENvZGVjLT5tX3BEZWNvZGVCdWYsIHBhbF9pbmRleCwgcENvZGVjLT5tX1NyY1dpZHRoKTsNCisgIEZYX0JPT0wgYkxhc3RQYXNzID0gKChyb3dfbnVtICUgMikgPT0gMSkgPyBUUlVFIDogRkFMU0U7DQorICBpbnQzMl90IGxpbmUgPSByb3dfbnVtICsgcENvZGVjLT5tX0dpZkZyYW1lUmVjdC50b3A7DQorICBpbnQzMl90IGxlZnQgPSBwQ29kZWMtPm1fR2lmRnJhbWVSZWN0LmxlZnQ7DQorICBGWFNZU19tZW1jcHkocENvZGVjLT5tX3BEZWNvZGVCdWYgKyBsZWZ0LCByb3dfYnVmLCBpbWdfd2lkdGgpOw0KKyAgaW50IHNyY190b3AgPSBwQ29kZWMtPm1fY2xpcEJveC50b3A7DQorICBpbnQgc3JjX2JvdHRvbSA9IHBDb2RlYy0+bV9jbGlwQm94LmJvdHRvbTsNCisgIGludCBkZXNfdG9wID0gcENvZGVjLT5tX3N0YXJ0WTsNCisgIGludCBzcmNfaGVpID0gcENvZGVjLT5tX2NsaXBCb3guSGVpZ2h0KCk7DQorICBpbnQgZGVzX2hlaSA9IHBDb2RlYy0+bV9zaXplWTsNCisgIGlmIChsaW5lID49IHNyY190b3AgJiYgbGluZSA8IHNyY19ib3R0b20pIHsNCisgICAgZG91YmxlIHNjYWxlX3kgPSAoZG91YmxlKWRlc19oZWkgLyAoZG91YmxlKXNyY19oZWk7DQorICAgIGludCBzcmNfcm93ID0gbGluZSAtIHNyY190b3A7DQorICAgIGludCBkZXNfcm93ID0gKGludCkoc3JjX3JvdyAqIHNjYWxlX3kpICsgZGVzX3RvcDsNCisgICAgaWYgKGRlc19yb3cgPj0gZGVzX3RvcCArIGRlc19oZWkpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcENvZGVjLT5SZVNhbXBsZVNjYW5saW5lKHBESUJpdG1hcCwgZGVzX3JvdywgcENvZGVjLT5tX3BEZWNvZGVCdWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZWMtPm1fU3JjRm9ybWF0KTsNCisgICAgaWYgKHNjYWxlX3kgPiAxLjAgJiYNCisgICAgICAgICghcENvZGVjLT5tX2JJbnRlcnBvbCB8fCBwQ29kZWMtPm1fU3JjUGFzc051bWJlciA9PSAxKSkgew0KKyAgICAgIHBDb2RlYy0+UmVzYW1wbGVWZXJ0KHBESUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChzY2FsZV95ID4gMS4wKSB7DQorICAgICAgaW50IGRlc19ib3R0b20gPSBkZXNfdG9wICsgcENvZGVjLT5tX3NpemVZOw0KKyAgICAgIGludCBkZXNfQnBwID0gcERJQml0bWFwLT5HZXRCUFAoKSA+PiAzOw0KKyAgICAgIEZYX0RXT1JEIGRlc19TY2FuT2ZmZXQgPSBwQ29kZWMtPm1fc3RhcnRYICogZGVzX0JwcDsNCisgICAgICBpZiAoZGVzX3JvdyArIChpbnQpc2NhbGVfeSA+PSBkZXNfYm90dG9tIC0gMSkgew0KKyAgICAgICAgdWludDhfdCogc2Nhbl9zcmMgPQ0KKyAgICAgICAgICAgICh1aW50OF90KilwRElCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsNCisgICAgICAgIGludCBjdXJfcm93ID0gZGVzX3JvdzsNCisgICAgICAgIHdoaWxlICgrK2N1cl9yb3cgPCBkZXNfYm90dG9tKSB7DQorICAgICAgICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0NCisgICAgICAgICAgICAgICh1aW50OF90KilwRElCaXRtYXAtPkdldFNjYW5saW5lKGN1cl9yb3cpICsgZGVzX1NjYW5PZmZldDsNCisgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IHBDb2RlYy0+bV9zaXplWCAqIGRlc19CcHA7DQorICAgICAgICAgIEZYU1lTX21lbWNweShzY2FuX2Rlcywgc2Nhbl9zcmMsIHNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoYkxhc3RQYXNzKSB7DQorICAgICAgICBwQ29kZWMtPkdpZkRvdWJsZUxpbmVSZXNhbXBsZVZlcnQocERJQml0bWFwLCBzY2FsZV95LCBkZXNfcm93KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZEb3VibGVMaW5lUmVzYW1wbGVWZXJ0KA0KKyAgICBDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsDQorICAgIGRvdWJsZSBzY2FsZV95LA0KKyAgICBpbnQgZGVzX3Jvdykgew0KKyAgaW50IGRlc19CcHAgPSBwRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA+PiAzOw0KKyAgRlhfRFdPUkQgZGVzX1NjYW5PZmZldCA9IG1fc3RhcnRYICogZGVzX0JwcDsNCisgIGludCBkZXNfdG9wID0gbV9zdGFydFk7DQorICBpbnQgZGVzX3Jvd18xID0gZGVzX3JvdyAtIGludCgyICogc2NhbGVfeSk7DQorICBpZiAoZGVzX3Jvd18xIDwgZGVzX3RvcCkgew0KKyAgICBkZXNfcm93XzEgPSBkZXNfdG9wOw0KKyAgfQ0KKyAgZm9yICg7IGRlc19yb3dfMSA8IGRlc19yb3c7IGRlc19yb3dfMSsrKSB7DQorICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0NCisgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93XzEpICsgZGVzX1NjYW5PZmZldDsNCisgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPSBtX1dlaWdodFZlcnQuR2V0UGl4ZWxXZWlnaHQoZGVzX3Jvd18xIC0gZGVzX3RvcCk7DQorICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fc3JjMSA9DQorICAgICAgICBwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShwV2VpZ2h0LT5tX1NyY1N0YXJ0ICsgZGVzX3RvcCkgKw0KKyAgICAgICAgZGVzX1NjYW5PZmZldDsNCisgICAgY29uc3QgdWludDhfdCogc2Nhbl9zcmMyID0NCisgICAgICAgIHBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKHBXZWlnaHQtPm1fU3JjRW5kICsgZGVzX3RvcCkgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICBmb3IgKGludCBkZXNfY29sID0gMDsgZGVzX2NvbCA8IG1fc2l6ZVg7IGRlc19jb2wrKykgew0KKyAgICAgIHN3aXRjaCAocERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCisgICAgICAgIGNhc2UgRlhESUJfSW52YWxpZDoNCisgICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQorICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6DQorICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsNCisgICAgICAgICAgaWYgKHBEZXZpY2VCaXRtYXAtPkdldFBhbGV0dGUoKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludCBkZXNfZyA9IDA7DQorICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoZGVzX2cgPj4gMTYpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KKyAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjogew0KKyAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICBzY2FuX3NyYzEgKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgIHNjYW5fc3JjMiArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgICAgc2Nhbl9kZXMgKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWERJQl9BcmdiOiB7DQorICAgICAgICAgIEZYX0RXT1JEIGRlc19hID0gMCwgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgZGVzX2EgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgIGRlc19hICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2EpID4+IDE2KTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpbnQgZGVzX2JvdHRvbSA9IGRlc190b3AgKyBtX3NpemVZIC0gMTsNCisgIGlmIChkZXNfcm93ICsgKGludCkoMiAqIHNjYWxlX3kpID49IGRlc19ib3R0b20gJiYNCisgICAgICBkZXNfcm93ICsgKGludClzY2FsZV95IDwgZGVzX2JvdHRvbSkgew0KKyAgICBHaWZEb3VibGVMaW5lUmVzYW1wbGVWZXJ0KHBEZXZpY2VCaXRtYXAsIHNjYWxlX3ksIGRlc19yb3cgKyAoaW50KXNjYWxlX3kpOw0KKyAgfQ0KK30NCitGWF9CT09MIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkJtcFJlYWRNb3JlRGF0YShJQ29kZWNfQm1wTW9kdWxlKiBwQm1wTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTJiBlcnJfc3RhdHVzKSB7DQorICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpbV9wRmlsZS0+R2V0U2l6ZSgpOw0KKyAgaWYgKGR3U2l6ZSA8PSBtX29mZlNldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBkd1NpemUgPSBkd1NpemUgLSBtX29mZlNldDsNCisgIEZYX0RXT1JEIGR3QXZhaWwgPSBwQm1wTW9kdWxlLT5HZXRBdmFpbElucHV0KG1fcEJtcENvbnRleHQsIE5VTEwpOw0KKyAgaWYgKGR3QXZhaWwgPT0gbV9TcmNTaXplKSB7DQorICAgIGlmIChkd1NpemUgPiBGWENPREVDX0JMT0NLX1NJWkUpIHsNCisgICAgICBkd1NpemUgPSBGWENPREVDX0JMT0NLX1NJWkU7DQorICAgIH0NCisgICAgbV9TcmNTaXplID0gKGR3U2l6ZSArIGR3QXZhaWwgKyBGWENPREVDX0JMT0NLX1NJWkUgLSAxKSAvDQorICAgICAgICAgICAgICAgIEZYQ09ERUNfQkxPQ0tfU0laRSAqIEZYQ09ERUNfQkxPQ0tfU0laRTsNCisgICAgbV9wU3JjQnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BTcmNCdWYsIG1fU3JjU2l6ZSk7DQorICAgIGlmICghbV9wU3JjQnVmKSB7DQorICAgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBGWF9EV09SRCBkd0NvbnN1bWUgPSBtX1NyY1NpemUgLSBkd0F2YWlsOw0KKyAgICBpZiAoZHdBdmFpbCkgew0KKyAgICAgIEZYU1lTX21lbWNweShtX3BTcmNCdWYsIG1fcFNyY0J1ZiArIGR3Q29uc3VtZSwgZHdBdmFpbCk7DQorICAgIH0NCisgICAgaWYgKGR3U2l6ZSA+IGR3Q29uc3VtZSkgew0KKyAgICAgIGR3U2l6ZSA9IGR3Q29uc3VtZTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmICsgZHdBdmFpbCwgbV9vZmZTZXQsIGR3U2l6ZSkpIHsNCisgICAgZXJyX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX29mZlNldCArPSBkd1NpemU7DQorICBwQm1wTW9kdWxlLT5JbnB1dChtX3BCbXBDb250ZXh0LCBtX3BTcmNCdWYsIGR3U2l6ZSArIGR3QXZhaWwpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6Qm1wSW5wdXRJbWFnZVBvc2l0aW9uQnVmQ2FsbGJhY2soDQorICAgIHZvaWQqIHBNb2R1bGUsDQorICAgIEZYX0RXT1JEIHJjZF9wb3MpIHsNCisgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KKyAgcENvZGVjLT5tX29mZlNldCA9IHJjZF9wb3M7DQorICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgIGlmICghcENvZGVjLT5CbXBSZWFkTW9yZURhdGEocENvZGVjLT5tX3BDb2RlY01nci0+R2V0Qm1wTW9kdWxlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3N0YXR1cykpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6Qm1wUmVhZFNjYW5saW5lQ2FsbGJhY2sodm9pZCogcE1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93X251bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJvd19idWYpIHsNCisgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KKyAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcDsNCisgIEFTU0VSVChwRElCaXRtYXAgIT0gTlVMTCk7DQorICBGWFNZU19tZW1jcHkocENvZGVjLT5tX3BEZWNvZGVCdWYsIHJvd19idWYsIHBDb2RlYy0+bV9TY2FubGluZVNpemUpOw0KKyAgaW50IHNyY190b3AgPSBwQ29kZWMtPm1fY2xpcEJveC50b3A7DQorICBpbnQgc3JjX2JvdHRvbSA9IHBDb2RlYy0+bV9jbGlwQm94LmJvdHRvbTsNCisgIGludCBkZXNfdG9wID0gcENvZGVjLT5tX3N0YXJ0WTsNCisgIGludCBzcmNfaGVpID0gcENvZGVjLT5tX2NsaXBCb3guSGVpZ2h0KCk7DQorICBpbnQgZGVzX2hlaSA9IHBDb2RlYy0+bV9zaXplWTsNCisgIGlmIChyb3dfbnVtID49IHNyY190b3AgJiYgcm93X251bSA8IHNyY19ib3R0b20pIHsNCisgICAgZG91YmxlIHNjYWxlX3kgPSAoZG91YmxlKWRlc19oZWkgLyAoZG91YmxlKXNyY19oZWk7DQorICAgIGludCBzcmNfcm93ID0gcm93X251bSAtIHNyY190b3A7DQorICAgIGludCBkZXNfcm93ID0gKGludCkoc3JjX3JvdyAqIHNjYWxlX3kpICsgZGVzX3RvcDsNCisgICAgaWYgKGRlc19yb3cgPj0gZGVzX3RvcCArIGRlc19oZWkpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcENvZGVjLT5SZVNhbXBsZVNjYW5saW5lKHBESUJpdG1hcCwgZGVzX3JvdywgcENvZGVjLT5tX3BEZWNvZGVCdWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZWMtPm1fU3JjRm9ybWF0KTsNCisgICAgaWYgKHNjYWxlX3kgPiAxLjApIHsNCisgICAgICBpZiAocENvZGVjLT5tX0JtcElzVG9wQm90dG9tIHx8ICFwQ29kZWMtPm1fYkludGVycG9sKSB7DQorICAgICAgICBwQ29kZWMtPlJlc2FtcGxlVmVydChwRElCaXRtYXAsIHNjYWxlX3ksIGRlc19yb3cpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29kZWMtPlJlc2FtcGxlVmVydEJUKHBESUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UmVzYW1wbGVWZXJ0QlQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlX3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzX3Jvdykgew0KKyAgaW50IGRlc19CcHAgPSBwRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA+PiAzOw0KKyAgRlhfRFdPUkQgZGVzX1NjYW5PZmZldCA9IG1fc3RhcnRYICogZGVzX0JwcDsNCisgIGludCBkZXNfdG9wID0gbV9zdGFydFk7DQorICBpbnQgZGVzX2JvdHRvbSA9IG1fc3RhcnRZICsgbV9zaXplWTsNCisgIGludCBkZXNfcm93XzEgPSBkZXNfcm93ICsgaW50KHNjYWxlX3kpOw0KKyAgaWYgKGRlc19yb3dfMSA+PSBkZXNfYm90dG9tIC0gMSkgew0KKyAgICB1aW50OF90KiBzY2FuX3NyYyA9DQorICAgICAgICAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICB3aGlsZSAoKytkZXNfcm93IDwgZGVzX2JvdHRvbSkgew0KKyAgICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0NCisgICAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsNCisgICAgICBGWF9EV09SRCBzaXplID0gbV9zaXplWCAqIGRlc19CcHA7DQorICAgICAgRlhTWVNfbWVtY3B5KHNjYW5fZGVzLCBzY2FuX3NyYywgc2l6ZSk7DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgZm9yICg7IGRlc19yb3dfMSA+IGRlc19yb3c7IGRlc19yb3dfMS0tKSB7DQorICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0NCisgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93XzEpICsgZGVzX1NjYW5PZmZldDsNCisgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPSBtX1dlaWdodFZlcnQuR2V0UGl4ZWxXZWlnaHQoZGVzX3Jvd18xIC0gZGVzX3RvcCk7DQorICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fc3JjMSA9DQorICAgICAgICBwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShwV2VpZ2h0LT5tX1NyY1N0YXJ0ICsgZGVzX3RvcCkgKw0KKyAgICAgICAgZGVzX1NjYW5PZmZldDsNCisgICAgY29uc3QgdWludDhfdCogc2Nhbl9zcmMyID0NCisgICAgICAgIHBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKHBXZWlnaHQtPm1fU3JjRW5kICsgZGVzX3RvcCkgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICBmb3IgKGludCBkZXNfY29sID0gMDsgZGVzX2NvbCA8IG1fc2l6ZVg7IGRlc19jb2wrKykgew0KKyAgICAgIHN3aXRjaCAocERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCisgICAgICAgIGNhc2UgRlhESUJfSW52YWxpZDoNCisgICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQorICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6DQorICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsNCisgICAgICAgICAgaWYgKHBEZXZpY2VCaXRtYXAtPkdldFBhbGV0dGUoKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludCBkZXNfZyA9IDA7DQorICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoZGVzX2cgPj4gMTYpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KKyAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjogew0KKyAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICBzY2FuX3NyYzEgKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgIHNjYW5fc3JjMiArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgICAgc2Nhbl9kZXMgKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWERJQl9BcmdiOiB7DQorICAgICAgICAgIEZYX0RXT1JEIGRlc19hID0gMCwgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgZGVzX2EgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgIGRlc19hICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2EpID4+IDE2KTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6RGV0ZWN0SW1hZ2VUeXBlKA0KKyAgICBGWENPREVDX0lNQUdFX1RZUEUgaW1hZ2VUeXBlLA0KKyAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSB7DQorICBtX29mZlNldCA9IDA7DQorICBGWF9EV09SRCBzaXplID0gKEZYX0RXT1JEKW1fcEZpbGUtPkdldFNpemUoKTsNCisgIGlmIChzaXplID4gRlhDT0RFQ19CTE9DS19TSVpFKSB7DQorICAgIHNpemUgPSBGWENPREVDX0JMT0NLX1NJWkU7DQorICB9DQorICBpZiAobV9wU3JjQnVmICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShtX3BTcmNCdWYpOw0KKyAgICBtX3BTcmNCdWYgPSBOVUxMOw0KKyAgfQ0KKyAgbV9wU3JjQnVmID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7DQorICBpZiAobV9wU3JjQnVmID09IE5VTEwpIHsNCisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWFNZU19tZW1zZXQobV9wU3JjQnVmLCAwLCBzaXplKTsNCisgIG1fU3JjU2l6ZSA9IHNpemU7DQorICBzd2l0Y2ggKGltYWdlVHlwZSkgew0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfQk1QOiB7DQorICAgICAgSUNvZGVjX0JtcE1vZHVsZSogcEJtcE1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRCbXBNb2R1bGUoKTsNCisgICAgICBpZiAocEJtcE1vZHVsZSA9PSBOVUxMKSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHBCbXBNb2R1bGUtPklucHV0SW1hZ2VQb3NpdGlvbkJ1ZkNhbGxiYWNrID0NCisgICAgICAgICAgQm1wSW5wdXRJbWFnZVBvc2l0aW9uQnVmQ2FsbGJhY2s7DQorICAgICAgcEJtcE1vZHVsZS0+UmVhZFNjYW5saW5lQ2FsbGJhY2sgPSBCbXBSZWFkU2NhbmxpbmVDYWxsYmFjazsNCisgICAgICBtX3BCbXBDb250ZXh0ID0gcEJtcE1vZHVsZS0+U3RhcnQoKHZvaWQqKXRoaXMpOw0KKyAgICAgIGlmIChtX3BCbXBDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgRlhfQk9PTCBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgMCwgc2l6ZSk7DQorICAgICAgaWYgKCFiUmVzdWx0KSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBtX29mZlNldCArPSBzaXplOw0KKyAgICAgIHBCbXBNb2R1bGUtPklucHV0KG1fcEJtcENvbnRleHQsIG1fcFNyY0J1Ziwgc2l6ZSk7DQorICAgICAgRlhfRFdPUkQqIHBQYWxldHRlID0gTlVMTDsNCisgICAgICBpbnQzMl90IHJlYWRSZXN1bHQgPSBwQm1wTW9kdWxlLT5SZWFkSGVhZGVyKA0KKyAgICAgICAgICBtX3BCbXBDb250ZXh0LCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LCAmbV9CbXBJc1RvcEJvdHRvbSwNCisgICAgICAgICAgJm1fU3JjQ29tcG9uZW50cywgJm1fU3JjUGFsZXR0ZU51bWJlciwgJnBQYWxldHRlLCBwQXR0cmlidXRlKTsNCisgICAgICB3aGlsZSAocmVhZFJlc3VsdCA9PSAyKSB7DQorICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KKyAgICAgICAgaWYgKCFCbXBSZWFkTW9yZURhdGEocEJtcE1vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgew0KKyAgICAgICAgICBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVhZFJlc3VsdCA9IHBCbXBNb2R1bGUtPlJlYWRIZWFkZXIoDQorICAgICAgICAgICAgbV9wQm1wQ29udGV4dCwgJm1fU3JjV2lkdGgsICZtX1NyY0hlaWdodCwgJm1fQm1wSXNUb3BCb3R0b20sDQorICAgICAgICAgICAgJm1fU3JjQ29tcG9uZW50cywgJm1fU3JjUGFsZXR0ZU51bWJlciwgJnBQYWxldHRlLCBwQXR0cmlidXRlKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlYWRSZXN1bHQgPT0gMSkgew0KKyAgICAgICAgbV9TcmNCUEMgPSA4Ow0KKyAgICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7DQorICAgICAgICBpZiAobV9wU3JjUGFsZXR0ZSAhPSBOVUxMKSB7DQorICAgICAgICAgIEZYX0ZyZWUobV9wU3JjUGFsZXR0ZSk7DQorICAgICAgICAgIG1fcFNyY1BhbGV0dGUgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fU3JjUGFsZXR0ZU51bWJlcikgew0KKyAgICAgICAgICBtX3BTcmNQYWxldHRlID0gRlhfQWxsb2MoRlhfQVJHQiwgbV9TcmNQYWxldHRlTnVtYmVyKTsNCisgICAgICAgICAgaWYgKG1fcFNyY1BhbGV0dGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFNyY1BhbGV0dGUsIHBQYWxldHRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNQYWxldHRlTnVtYmVyICogc2l6ZW9mKEZYX0RXT1JEKSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgaWYgKG1fcEJtcENvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgcEJtcE1vZHVsZS0+RmluaXNoKG1fcEJtcENvbnRleHQpOw0KKyAgICAgICAgbV9wQm1wQ29udGV4dCA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9KUEc6IHsNCisgICAgICBJQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0SnBlZ01vZHVsZSgpOw0KKyAgICAgIGlmIChwSnBlZ01vZHVsZSA9PSBOVUxMKSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIG1fcEpwZWdDb250ZXh0ID0gcEpwZWdNb2R1bGUtPlN0YXJ0KCk7DQorICAgICAgaWYgKG1fcEpwZWdDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgRlhfQk9PTCBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgMCwgc2l6ZSk7DQorICAgICAgaWYgKCFiUmVzdWx0KSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBtX29mZlNldCArPSBzaXplOw0KKyAgICAgIHBKcGVnTW9kdWxlLT5JbnB1dChtX3BKcGVnQ29udGV4dCwgbV9wU3JjQnVmLCBzaXplKTsNCisgICAgICBpbnQzMl90IHJlYWRSZXN1bHQgPQ0KKyAgICAgICAgICBwSnBlZ01vZHVsZS0+UmVhZEhlYWRlcihtX3BKcGVnQ29udGV4dCwgJm1fU3JjV2lkdGgsICZtX1NyY0hlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fU3JjQ29tcG9uZW50cywgcEF0dHJpYnV0ZSk7DQorICAgICAgd2hpbGUgKHJlYWRSZXN1bHQgPT0gMikgew0KKyAgICAgICAgRlhDT0RFQ19TVEFUVVMgZXJyb3Jfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCisgICAgICAgIGlmICghSnBlZ1JlYWRNb3JlRGF0YShwSnBlZ01vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgew0KKyAgICAgICAgICBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVhZFJlc3VsdCA9DQorICAgICAgICAgICAgcEpwZWdNb2R1bGUtPlJlYWRIZWFkZXIobV9wSnBlZ0NvbnRleHQsICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fU3JjQ29tcG9uZW50cywgcEF0dHJpYnV0ZSk7DQorICAgICAgfQ0KKyAgICAgIGlmICghcmVhZFJlc3VsdCkgew0KKyAgICAgICAgbV9TcmNCUEMgPSA4Ow0KKyAgICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgaWYgKG1fcEpwZWdDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgIHBKcGVnTW9kdWxlLT5GaW5pc2gobV9wSnBlZ0NvbnRleHQpOw0KKyAgICAgICAgbV9wSnBlZ0NvbnRleHQgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfUE5HOiB7DQorICAgICAgSUNvZGVjX1BuZ01vZHVsZSogcFBuZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRQbmdNb2R1bGUoKTsNCisgICAgICBpZiAocFBuZ01vZHVsZSA9PSBOVUxMKSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHBQbmdNb2R1bGUtPlJlYWRIZWFkZXJDYWxsYmFjayA9DQorICAgICAgICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlBuZ1JlYWRIZWFkZXJGdW5jOw0KKyAgICAgIHBQbmdNb2R1bGUtPkFza1NjYW5saW5lQnVmQ2FsbGJhY2sgPQ0KKyAgICAgICAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdBc2tTY2FubGluZUJ1ZkZ1bmM7DQorICAgICAgcFBuZ01vZHVsZS0+RmlsbFNjYW5saW5lQnVmQ29tcGxldGVkQ2FsbGJhY2sgPQ0KKyAgICAgICAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdGaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWRGdW5jOw0KKyAgICAgIG1fcFBuZ0NvbnRleHQgPSBwUG5nTW9kdWxlLT5TdGFydCgodm9pZCopdGhpcyk7DQorICAgICAgaWYgKG1fcFBuZ0NvbnRleHQgPT0gTlVMTCkgew0KKyAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBGWF9CT09MIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKTsNCisgICAgICBpZiAoIWJSZXN1bHQpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIG1fb2ZmU2V0ICs9IHNpemU7DQorICAgICAgYlJlc3VsdCA9IHBQbmdNb2R1bGUtPklucHV0KG1fcFBuZ0NvbnRleHQsIG1fcFNyY0J1Ziwgc2l6ZSwgcEF0dHJpYnV0ZSk7DQorICAgICAgd2hpbGUgKGJSZXN1bHQpIHsNCisgICAgICAgIEZYX0RXT1JEIHJlbWFpbl9zaXplID0gKEZYX0RXT1JEKW1fcEZpbGUtPkdldFNpemUoKSAtIG1fb2ZmU2V0Ow0KKyAgICAgICAgRlhfRFdPUkQgaW5wdXRfc2l6ZSA9DQorICAgICAgICAgICAgcmVtYWluX3NpemUgPiBGWENPREVDX0JMT0NLX1NJWkUgPyBGWENPREVDX0JMT0NLX1NJWkUgOiByZW1haW5fc2l6ZTsNCisgICAgICAgIGlmIChpbnB1dF9zaXplID09IDApIHsNCisgICAgICAgICAgaWYgKG1fcFBuZ0NvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBQbmdNb2R1bGUtPkZpbmlzaChtX3BQbmdDb250ZXh0KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBtX3BQbmdDb250ZXh0ID0gTlVMTDsNCisgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9wU3JjQnVmICE9IE5VTEwgJiYgaW5wdXRfc2l6ZSA+IG1fU3JjU2l6ZSkgew0KKyAgICAgICAgICBGWF9GcmVlKG1fcFNyY0J1Zik7DQorICAgICAgICAgIG1fcFNyY0J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlucHV0X3NpemUpOw0KKyAgICAgICAgICBpZiAobV9wU3JjQnVmID09IE5VTEwpIHsNCisgICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYU1lTX21lbXNldChtX3BTcmNCdWYsIDAsIGlucHV0X3NpemUpOw0KKyAgICAgICAgICBtX1NyY1NpemUgPSBpbnB1dF9zaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYlJlc3VsdCA9IG1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYsIG1fb2ZmU2V0LCBpbnB1dF9zaXplKTsNCisgICAgICAgIGlmICghYlJlc3VsdCkgew0KKyAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBtX29mZlNldCArPSBpbnB1dF9zaXplOw0KKyAgICAgICAgYlJlc3VsdCA9DQorICAgICAgICAgICAgcFBuZ01vZHVsZS0+SW5wdXQobV9wUG5nQ29udGV4dCwgbV9wU3JjQnVmLCBpbnB1dF9zaXplLCBwQXR0cmlidXRlKTsNCisgICAgICB9DQorICAgICAgQVNTRVJUKCFiUmVzdWx0KTsNCisgICAgICBpZiAobV9wUG5nQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgICBwUG5nTW9kdWxlLT5GaW5pc2gobV9wUG5nQ29udGV4dCk7DQorICAgICAgICBtX3BQbmdDb250ZXh0ID0gTlVMTDsNCisgICAgICB9DQorICAgICAgaWYgKG1fU3JjUGFzc051bWJlciA9PSAwKSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfR0lGOiB7DQorICAgICAgSUNvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKTsNCisgICAgICBpZiAocEdpZk1vZHVsZSA9PSBOVUxMKSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHBHaWZNb2R1bGUtPlJlY29yZEN1cnJlbnRQb3NpdGlvbkNhbGxiYWNrID0NCisgICAgICAgICAgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmUmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2s7DQorICAgICAgcEdpZk1vZHVsZS0+QXNrTG9jYWxQYWxldHRlQnVmQ2FsbGJhY2sgPQ0KKyAgICAgICAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZBc2tMb2NhbFBhbGV0dGVCdWZDYWxsYmFjazsNCisgICAgICBwR2lmTW9kdWxlLT5JbnB1dFJlY29yZFBvc2l0aW9uQnVmQ2FsbGJhY2sgPQ0KKyAgICAgICAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZJbnB1dFJlY29yZFBvc2l0aW9uQnVmQ2FsbGJhY2s7DQorICAgICAgcEdpZk1vZHVsZS0+UmVhZFNjYW5saW5lQ2FsbGJhY2sgPQ0KKyAgICAgICAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZSZWFkU2NhbmxpbmVDYWxsYmFjazsNCisgICAgICBtX3BHaWZDb250ZXh0ID0gcEdpZk1vZHVsZS0+U3RhcnQoKHZvaWQqKXRoaXMpOw0KKyAgICAgIGlmIChtX3BHaWZDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgRlhfQk9PTCBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgMCwgc2l6ZSk7DQorICAgICAgaWYgKCFiUmVzdWx0KSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBtX29mZlNldCArPSBzaXplOw0KKyAgICAgIHBHaWZNb2R1bGUtPklucHV0KG1fcEdpZkNvbnRleHQsIG1fcFNyY0J1Ziwgc2l6ZSk7DQorICAgICAgbV9TcmNDb21wb25lbnRzID0gMTsNCisgICAgICBpbnQzMl90IHJlYWRSZXN1bHQgPSBwR2lmTW9kdWxlLT5SZWFkSGVhZGVyKA0KKyAgICAgICAgICBtX3BHaWZDb250ZXh0LCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LCAmbV9HaWZQbHROdW1iZXIsDQorICAgICAgICAgICh2b2lkKiopJm1fcEdpZlBhbGV0dGUsICZtX0dpZkJnSW5kZXgpOw0KKyAgICAgIHdoaWxlIChyZWFkUmVzdWx0ID09IDIpIHsNCisgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgICBpZiAoIUdpZlJlYWRNb3JlRGF0YShwR2lmTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQorICAgICAgICAgIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOw0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICByZWFkUmVzdWx0ID0gcEdpZk1vZHVsZS0+UmVhZEhlYWRlcigNCisgICAgICAgICAgICBtX3BHaWZDb250ZXh0LCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LCAmbV9HaWZQbHROdW1iZXIsDQorICAgICAgICAgICAgKHZvaWQqKikmbV9wR2lmUGFsZXR0ZSwgJm1fR2lmQmdJbmRleCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZWFkUmVzdWx0ID09IDEpIHsNCisgICAgICAgIG1fU3JjQlBDID0gODsNCisgICAgICAgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX3BHaWZDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgIHBHaWZNb2R1bGUtPkZpbmlzaChtX3BHaWZDb250ZXh0KTsNCisgICAgICAgIG1fcEdpZkNvbnRleHQgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfVElGOiB7DQorICAgICAgSUNvZGVjX1RpZmZNb2R1bGUqIHBUaWZmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFRpZmZNb2R1bGUoKTsNCisgICAgICBpZiAocFRpZmZNb2R1bGUgPT0gTlVMTCkgew0KKyAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBtX3BUaWZmQ29udGV4dCA9IHBUaWZmTW9kdWxlLT5DcmVhdGVEZWNvZGVyKG1fcEZpbGUpOw0KKyAgICAgIGlmIChtX3BUaWZmQ29udGV4dCA9PSBOVUxMKSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGludDMyX3QgZnJhbWVzID0gMDsNCisgICAgICBwVGlmZk1vZHVsZS0+R2V0RnJhbWVzKG1fcFRpZmZDb250ZXh0LCBmcmFtZXMpOw0KKyAgICAgIEZYX0RXT1JEIGJwYzsNCisgICAgICBGWF9CT09MIHJldCA9IHBUaWZmTW9kdWxlLT5Mb2FkRnJhbWVJbmZvKA0KKyAgICAgICAgICBtX3BUaWZmQ29udGV4dCwgMCwgKEZYX0RXT1JEJiltX1NyY1dpZHRoLCAoRlhfRFdPUkQmKW1fU3JjSGVpZ2h0LA0KKyAgICAgICAgICAoRlhfRFdPUkQmKW1fU3JjQ29tcG9uZW50cywgYnBjLCBwQXR0cmlidXRlKTsNCisgICAgICBtX1NyY0NvbXBvbmVudHMgPSA0Ow0KKyAgICAgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQpOw0KKyAgICAgIGlmICghcmV0KSB7DQorICAgICAgICBwVGlmZk1vZHVsZS0+RGVzdHJveURlY29kZXIobV9wVGlmZkNvbnRleHQpOw0KKyAgICAgICAgKG1fcFRpZmZDb250ZXh0ID0gTlVMTCk7DQorICAgICAgICAobV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUKTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWENPREVDX1NUQVRVUyBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpMb2FkSW1hZ2VJbmZvKA0KKyAgICBJRlhfRmlsZVJlYWQqIHBGaWxlLA0KKyAgICBGWENPREVDX0lNQUdFX1RZUEUgaW1hZ2VUeXBlLA0KKyAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSB7DQorICBzd2l0Y2ggKG1fc3RhdHVzKSB7DQorICAgIGNhc2UgRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFk6DQorICAgIGNhc2UgRlhDT0RFQ19TVEFUVVNfRlJBTUVfVE9CRUNPTlRJTlVFOg0KKyAgICBjYXNlIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWToNCisgICAgY2FzZSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOg0KKyAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgICAgZGVmYXVsdDo7DQorICB9DQorICBpZiAocEZpbGUgPT0gTlVMTCkgew0KKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQorICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICByZXR1cm4gbV9zdGF0dXM7DQorICB9DQorICBtX3BGaWxlID0gcEZpbGU7DQorICBtX29mZlNldCA9IDA7DQorICBtX1NyY1dpZHRoID0gbV9TcmNIZWlnaHQgPSAwOw0KKyAgbV9TcmNDb21wb25lbnRzID0gbV9TcmNCUEMgPSAwOw0KKyAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCAwLCAwKTsNCisgIG1fc3RhcnRYID0gbV9zdGFydFkgPSAwOw0KKyAgbV9zaXplWCA9IG1fc2l6ZVkgPSAwOw0KKyAgbV9TcmNQYXNzTnVtYmVyID0gMDsNCisgIGlmIChpbWFnZVR5cGUgIT0gRlhDT0RFQ19JTUFHRV9VTktOT1dOICYmDQorICAgICAgRGV0ZWN0SW1hZ2VUeXBlKGltYWdlVHlwZSwgcEF0dHJpYnV0ZSkpIHsNCisgICAgbV9pbWFnVHlwZSA9IGltYWdlVHlwZTsNCisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19GUkFNRV9SRUFEWTsNCisgICAgcmV0dXJuIG1fc3RhdHVzOw0KKyAgfQ0KKyAgZm9yIChpbnQgdHlwZSA9IEZYQ09ERUNfSU1BR0VfQk1QOyB0eXBlIDwgRlhDT0RFQ19JTUFHRV9NQVg7IHR5cGUrKykgew0KKyAgICBpZiAoRGV0ZWN0SW1hZ2VUeXBlKChGWENPREVDX0lNQUdFX1RZUEUpdHlwZSwgcEF0dHJpYnV0ZSkpIHsNCisgICAgICBtX2ltYWdUeXBlID0gKEZYQ09ERUNfSU1BR0VfVFlQRSl0eXBlOw0KKyAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFk7DQorICAgICAgcmV0dXJuIG1fc3RhdHVzOw0KKyAgICB9DQorICB9DQorICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICBtX3BGaWxlID0gTlVMTDsNCisgIHJldHVybiBtX3N0YXR1czsNCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpTZXRDbGlwQm94KEZYX1JFQ1QqIGNsaXApIHsNCisgIGlmIChtX3N0YXR1cyAhPSBGWENPREVDX1NUQVRVU19GUkFNRV9SRUFEWSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoY2xpcC0+SXNFbXB0eSgpKSB7DQorICAgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgMCwgMCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChjbGlwLT5sZWZ0IDwgMCkgew0KKyAgICBjbGlwLT5sZWZ0ID0gMDsNCisgIH0NCisgIGlmIChjbGlwLT5yaWdodCA+IG1fU3JjV2lkdGgpIHsNCisgICAgY2xpcC0+cmlnaHQgPSBtX1NyY1dpZHRoOw0KKyAgfQ0KKyAgaWYgKGNsaXAtPnRvcCA8IDApIHsNCisgICAgY2xpcC0+dG9wID0gMDsNCisgIH0NCisgIGlmIChjbGlwLT5ib3R0b20gPiBtX1NyY0hlaWdodCkgew0KKyAgICBjbGlwLT5ib3R0b20gPSBtX1NyY0hlaWdodDsNCisgIH0NCisgIGlmIChjbGlwLT5Jc0VtcHR5KCkpIHsNCisgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCAwLCAwKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9jbGlwQm94ID0gKmNsaXA7DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2V0RG93blNjYWxlKGludCYgZG93bl9zY2FsZSkgew0KKyAgZG93bl9zY2FsZSA9IDE7DQorICBpbnQgcmF0aW9fdyA9IG1fY2xpcEJveC5XaWR0aCgpIC8gbV9zaXplWDsNCisgIGludCByYXRpb19oID0gbV9jbGlwQm94LkhlaWdodCgpIC8gbV9zaXplWTsNCisgIGludCByYXRpbyA9IChyYXRpb193ID4gcmF0aW9faCkgPyByYXRpb19oIDogcmF0aW9fdzsNCisgIGlmIChyYXRpbyA+PSA4KSB7DQorICAgIGRvd25fc2NhbGUgPSA4Ow0KKyAgfSBlbHNlIGlmIChyYXRpbyA+PSA0KSB7DQorICAgIGRvd25fc2NhbGUgPSA0Ow0KKyAgfSBlbHNlIGlmIChyYXRpbyA+PSAyKSB7DQorICAgIGRvd25fc2NhbGUgPSAyOw0KKyAgfQ0KKyAgbV9jbGlwQm94LmxlZnQgLz0gZG93bl9zY2FsZTsNCisgIG1fY2xpcEJveC5yaWdodCAvPSBkb3duX3NjYWxlOw0KKyAgbV9jbGlwQm94LnRvcCAvPSBkb3duX3NjYWxlOw0KKyAgbV9jbGlwQm94LmJvdHRvbSAvPSBkb3duX3NjYWxlOw0KKyAgaWYgKG1fY2xpcEJveC5yaWdodCA9PSBtX2NsaXBCb3gubGVmdCkgew0KKyAgICBtX2NsaXBCb3gucmlnaHQgPSBtX2NsaXBCb3gubGVmdCArIDE7DQorICB9DQorICBpZiAobV9jbGlwQm94LmJvdHRvbSA9PSBtX2NsaXBCb3gudG9wKSB7DQorICAgIG1fY2xpcEJveC5ib3R0b20gPSBtX2NsaXBCb3gudG9wICsgMTsNCisgIH0NCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHZXRUcmFuc01ldGhvZChGWERJQl9Gb3JtYXQgZGVzX2Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpIHsNCisgIHN3aXRjaCAoZGVzX2Zvcm1hdCkgew0KKyAgICBjYXNlIEZYRElCXzFicHBNYXNrOg0KKyAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsNCisgICAgICBzd2l0Y2ggKHNyY19mb3JtYXQpIHsNCisgICAgICAgIGNhc2UgRlhDb2RlY18xYnBwR3JheToNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDA7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IC0xOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7DQorICAgICAgc3dpdGNoIChzcmNfZm9ybWF0KSB7DQorICAgICAgICBjYXNlIEZYQ29kZWNfMWJwcEdyYXk6DQorICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAxOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDb2RlY184YnBwR3JheToNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDI7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENvZGVjXzFicHBSZ2I6DQorICAgICAgICBjYXNlIEZYQ29kZWNfOGJwcFJnYjoNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDM7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENvZGVjX1JnYjoNCisgICAgICAgIGNhc2UgRlhDb2RlY19SZ2IzMjoNCisgICAgICAgIGNhc2UgRlhDb2RlY19BcmdiOg0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gNDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQ29kZWNfQ215azoNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IC0xOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWERJQl9SZ2I6IHsNCisgICAgICBzd2l0Y2ggKHNyY19mb3JtYXQpIHsNCisgICAgICAgIGNhc2UgRlhDb2RlY18xYnBwR3JheToNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDY7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENvZGVjXzhicHBHcmF5Og0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gNzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQ29kZWNfMWJwcFJnYjoNCisgICAgICAgIGNhc2UgRlhDb2RlY184YnBwUmdiOg0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gODsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQ29kZWNfUmdiOg0KKyAgICAgICAgY2FzZSBGWENvZGVjX1JnYjMyOg0KKyAgICAgICAgY2FzZSBGWENvZGVjX0FyZ2I6DQorICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA5Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDb2RlY19DbXlrOg0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMTA7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IC0xOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWERJQl9SZ2IzMjoNCisgICAgY2FzZSBGWERJQl9BcmdiOiB7DQorICAgICAgc3dpdGNoIChzcmNfZm9ybWF0KSB7DQorICAgICAgICBjYXNlIEZYQ29kZWNfMWJwcEdyYXk6DQorICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA2Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDb2RlY184YnBwR3JheToNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDc7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENvZGVjXzFicHBSZ2I6DQorICAgICAgICBjYXNlIEZYQ29kZWNfOGJwcFJnYjoNCisgICAgICAgICAgaWYgKGRlc19mb3JtYXQgPT0gRlhESUJfQXJnYikgew0KKyAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAxMjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gODsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDb2RlY19SZ2I6DQorICAgICAgICBjYXNlIEZYQ29kZWNfUmdiMzI6DQorICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA5Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDb2RlY19DbXlrOg0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMTA7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENvZGVjX0FyZ2I6DQorICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAxMTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gLTE7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIG1fVHJhbnNNZXRob2QgPSAtMTsNCisgIH0NCit9DQordm9pZCBfUkdCMkJHUih1aW50OF90KiBidWZmZXIsIGludCB3aWR0aCA9IDEpIHsNCisgIGlmIChidWZmZXIgJiYgd2lkdGggPiAwKSB7DQorICAgIHVpbnQ4X3QgdGVtcDsNCisgICAgaW50IGkgPSAwOw0KKyAgICBpbnQgaiA9IDA7DQorICAgIGZvciAoOyBpIDwgd2lkdGg7IGkrKywgaiArPSAzKSB7DQorICAgICAgdGVtcCA9IGJ1ZmZlcltqXTsNCisgICAgICBidWZmZXJbal0gPSBidWZmZXJbaiArIDJdOw0KKyAgICAgIGJ1ZmZlcltqICsgMl0gPSB0ZW1wOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UmVTYW1wbGVTY2FubGluZShDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNfbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX3NjYW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpIHsNCisgIGludCBzcmNfbGVmdCA9IG1fY2xpcEJveC5sZWZ0Ow0KKyAgaW50IGRlc19sZWZ0ID0gbV9zdGFydFg7DQorICB1aW50OF90KiBkZXNfc2NhbiA9DQorICAgICAgcERldmljZUJpdG1hcC0+R2V0QnVmZmVyKCkgKyBkZXNfbGluZSAqIHBEZXZpY2VCaXRtYXAtPkdldFBpdGNoKCk7DQorICBpbnQgc3JjX2JwcCA9IHNyY19mb3JtYXQgJiAweGZmOw0KKyAgaW50IGRlc19icHAgPSBwRGV2aWNlQml0bWFwLT5HZXRCUFAoKTsNCisgIGludCBzcmNfQnBwID0gc3JjX2JwcCA+PiAzOw0KKyAgaW50IGRlc19CcHAgPSBkZXNfYnBwID4+IDM7DQorICBzcmNfc2NhbiArPSBzcmNfbGVmdCAqIHNyY19CcHA7DQorICBkZXNfc2NhbiArPSBkZXNfbGVmdCAqIGRlc19CcHA7DQorICBmb3IgKGludCBkZXNfY29sID0gMDsgZGVzX2NvbCA8IG1fc2l6ZVg7IGRlc19jb2wrKykgew0KKyAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0SG9yei5HZXRQaXhlbFdlaWdodChkZXNfY29sKTsNCisgICAgc3dpdGNoIChtX1RyYW5zTWV0aG9kKSB7DQorICAgICAgY2FzZSAtMToNCisgICAgICAgIHJldHVybjsNCisgICAgICBjYXNlIDA6DQorICAgICAgICByZXR1cm47DQorICAgICAgY2FzZSAxOg0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIGNhc2UgMjogew0KKyAgICAgICAgRlhfRFdPUkQgZGVzX2cgPSAwOw0KKyAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7DQorICAgICAgICAgICAgIGorKykgew0KKyAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0NCisgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07DQorICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuW2pdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoZGVzX2cgPj4gMTYpOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAzOiB7DQorICAgICAgICBpbnQgZGVzX3IgPSAwLCBkZXNfZyA9IDAsIGRlc19iID0gMDsNCisgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOw0KKyAgICAgICAgICAgICBqKyspIHsNCisgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9DQorICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ2IgPSBtX3BTcmNQYWxldHRlW3NyY19zY2FuW2pdXTsNCisgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2IgPj4gMTYpOw0KKyAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYiA+PiA4KTsNCisgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpYXJnYjsNCisgICAgICAgIH0NCisgICAgICAgICpkZXNfc2NhbisrID0NCisgICAgICAgICAgICAodWludDhfdClGWFJHQjJHUkFZKChkZXNfciA+PiAxNiksIChkZXNfZyA+PiAxNiksIChkZXNfYiA+PiAxNikpOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSA0OiB7DQorICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7DQorICAgICAgICAgICAgIGorKykgew0KKyAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0NCisgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07DQorICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIHNyY19CcHA7DQorICAgICAgICAgIGRlc19iICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOw0KKyAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsNCisgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKmRlc19zY2FuKysgPQ0KKyAgICAgICAgICAgICh1aW50OF90KUZYUkdCMkdSQVkoKGRlc19yID4+IDE2KSwgKGRlc19nID4+IDE2KSwgKGRlc19iID4+IDE2KSk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIDU6IHsNCisgICAgICAgIEZYX0RXT1JEIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsNCisgICAgICAgICAgICAgaisrKSB7DQorICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQ0KKyAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogc3JjX0JwcDsNCisgICAgICAgICAgdWludDhfdCBzcmNfYiA9IDAsIHNyY19nID0gMCwgc3JjX3IgPSAwOw0KKyAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoMjU1IC0gc3JjX3BpeGVsWzBdLCAyNTUgLSBzcmNfcGl4ZWxbMV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgLSBzcmNfcGl4ZWxbMl0sIDI1NSAtIHNyY19waXhlbFszXSwgc3JjX3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZywgc3JjX2IpOw0KKyAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiBzcmNfYjsNCisgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX2c7DQorICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqIHNyY19yOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKmRlc19zY2FuKysgPQ0KKyAgICAgICAgICAgICh1aW50OF90KUZYUkdCMkdSQVkoKGRlc19yID4+IDE2KSwgKGRlc19nID4+IDE2KSwgKGRlc19iID4+IDE2KSk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIDY6DQorICAgICAgICByZXR1cm47DQorICAgICAgY2FzZSA3OiB7DQorICAgICAgICBGWF9EV09SRCBkZXNfZyA9IDA7DQorICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsNCisgICAgICAgICAgICAgaisrKSB7DQorICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQ0KKyAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bal07DQorICAgICAgICB9DQorICAgICAgICBGWFNZU19tZW1zZXQoZGVzX3NjYW4sICh1aW50OF90KShkZXNfZyA+PiAxNiksIDMpOw0KKyAgICAgICAgZGVzX3NjYW4gKz0gZGVzX0JwcDsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgODogew0KKyAgICAgICAgaW50IGRlc19yID0gMCwgZGVzX2cgPSAwLCBkZXNfYiA9IDA7DQorICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsNCisgICAgICAgICAgICAgaisrKSB7DQorICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQ0KKyAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdiID0gbV9wU3JjUGFsZXR0ZVtzcmNfc2NhbltqXV07DQorICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiID4+IDE2KTsNCisgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2IgPj4gOCk7DQorICAgICAgICAgIGRlc19iICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KWFyZ2I7DQorICAgICAgICB9DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICBkZXNfc2NhbiArPSBkZXNfQnBwIC0gMzsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgMTI6IHsNCisgICAgICAgIGlmIChtX3BCbXBDb250ZXh0KSB7DQorICAgICAgICAgIGludCBkZXNfciA9IDAsIGRlc19nID0gMCwgZGVzX2IgPSAwOw0KKyAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsNCisgICAgICAgICAgICAgICBqKyspIHsNCisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0NCisgICAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ2IgPSBtX3BTcmNQYWxldHRlW3NyY19zY2FuW2pdXTsNCisgICAgICAgICAgICBkZXNfciArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYiA+PiAxNik7DQorICAgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2IgPj4gOCk7DQorICAgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpYXJnYjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAqZGVzX3NjYW4rKyA9IDB4RkY7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpbnQgZGVzX2EgPSAwLCBkZXNfciA9IDAsIGRlc19nID0gMCwgZGVzX2IgPSAwOw0KKyAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsNCisgICAgICAgICAgICAgICBqKyspIHsNCisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0NCisgICAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ2IgPSBtX3BTcmNQYWxldHRlW3NyY19zY2FuW2pdXTsNCisgICAgICAgICAgICBkZXNfYSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYiA+PiAyNCk7DQorICAgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2IgPj4gMTYpOw0KKyAgICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiID4+IDgpOw0KKyAgICAgICAgICAgIGRlc19iICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KWFyZ2I7DQorICAgICAgICAgIH0NCisgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19hKSA+PiAxNik7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIDk6IHsNCisgICAgICAgIEZYX0RXT1JEIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsNCisgICAgICAgICAgICAgaisrKSB7DQorICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQ0KKyAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogc3JjX0JwcDsNCisgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7DQorICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOw0KKyAgICAgICAgICBkZXNfciArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCk7DQorICAgICAgICB9DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICBkZXNfc2NhbiArPSBkZXNfQnBwIC0gMzsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgMTA6IHsNCisgICAgICAgIEZYX0RXT1JEIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsNCisgICAgICAgICAgICAgaisrKSB7DQorICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQ0KKyAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogc3JjX0JwcDsNCisgICAgICAgICAgdWludDhfdCBzcmNfYiA9IDAsIHNyY19nID0gMCwgc3JjX3IgPSAwOw0KKyAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoMjU1IC0gc3JjX3BpeGVsWzBdLCAyNTUgLSBzcmNfcGl4ZWxbMV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgLSBzcmNfcGl4ZWxbMl0sIDI1NSAtIHNyY19waXhlbFszXSwgc3JjX3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZywgc3JjX2IpOw0KKyAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiBzcmNfYjsNCisgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX2c7DQorICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqIHNyY19yOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgZGVzX3NjYW4gKz0gZGVzX0JwcCAtIDM7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIDExOiB7DQorICAgICAgICBGWF9EV09SRCBkZXNfYWxwaGEgPSAwLCBkZXNfciA9IDAsIGRlc19nID0gMCwgZGVzX2IgPSAwOw0KKyAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7DQorICAgICAgICAgICAgIGorKykgew0KKyAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0NCisgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07DQorICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIHNyY19CcHA7DQorICAgICAgICAgIHBpeGVsX3dlaWdodCA9IHBpeGVsX3dlaWdodCAqIHNyY19waXhlbFszXSAvIDI1NTsNCisgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7DQorICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOw0KKyAgICAgICAgICBkZXNfciArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCk7DQorICAgICAgICAgIGRlc19hbHBoYSArPSBwaXhlbF93ZWlnaHQ7DQorICAgICAgICB9DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2FscGhhICogMjU1KSA+PiAxNik7DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UmVzYW1wbGVWZXJ0KENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2NhbGVfeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzX3Jvdykgew0KKyAgaW50IGRlc19CcHAgPSBwRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA+PiAzOw0KKyAgRlhfRFdPUkQgZGVzX1NjYW5PZmZldCA9IG1fc3RhcnRYICogZGVzX0JwcDsNCisgIGlmIChtX2JJbnRlcnBvbCkgew0KICAgICBpbnQgZGVzX3RvcCA9IG1fc3RhcnRZOw0KLSAgICBpbnQgc3JjX2hlaSA9IG1fY2xpcEJveC5IZWlnaHQoKTsNCi0gICAgaW50IGRlc19oZWkgPSBtX3NpemVZOw0KLSAgICBpZihzcmNfbGluZSA+PSBzcmNfdG9wKSB7DQotICAgICAgICBkb3VibGUgc2NhbGVfeSA9IChkb3VibGUpZGVzX2hlaSAvIChkb3VibGUpc3JjX2hlaTsNCi0gICAgICAgIGludCBzcmNfcm93ID0gc3JjX2xpbmUgLSBzcmNfdG9wOw0KLSAgICAgICAgaW50IGRlc19yb3cgPSAoaW50KShzcmNfcm93ICogc2NhbGVfeSkgICsgZGVzX3RvcDsNCi0gICAgICAgIGlmKGRlc19yb3cgPj0gZGVzX3RvcCArIGRlc19oZWkpCXsNCisgICAgaW50IGRlc19yb3dfMSA9IGRlc19yb3cgLSBpbnQoc2NhbGVfeSk7DQorICAgIGlmIChkZXNfcm93XzEgPCBkZXNfdG9wKSB7DQorICAgICAgaW50IGRlc19ib3R0b20gPSBkZXNfdG9wICsgbV9zaXplWTsNCisgICAgICBpZiAoZGVzX3JvdyArIChpbnQpc2NhbGVfeSA+PSBkZXNfYm90dG9tIC0gMSkgew0KKyAgICAgICAgdWludDhfdCogc2Nhbl9zcmMgPQ0KKyAgICAgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgICB3aGlsZSAoKytkZXNfcm93IDwgZGVzX2JvdHRvbSkgew0KKyAgICAgICAgICB1aW50OF90KiBzY2FuX2RlcyA9DQorICAgICAgICAgICAgICAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgICAgICBGWF9EV09SRCBzaXplID0gbV9zaXplWCAqIGRlc19CcHA7DQorICAgICAgICAgIEZYU1lTX21lbWNweShzY2FuX2Rlcywgc2Nhbl9zcmMsIHNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgZm9yICg7IGRlc19yb3dfMSA8IGRlc19yb3c7IGRlc19yb3dfMSsrKSB7DQorICAgICAgdWludDhfdCogc2Nhbl9kZXMgPQ0KKyAgICAgICAgICAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3Jvd18xKSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPSBtX1dlaWdodFZlcnQuR2V0UGl4ZWxXZWlnaHQoZGVzX3Jvd18xIC0gZGVzX3RvcCk7DQorICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9zcmMxID0NCisgICAgICAgICAgcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUocFdlaWdodC0+bV9TcmNTdGFydCArIGRlc190b3ApICsNCisgICAgICAgICAgZGVzX1NjYW5PZmZldDsNCisgICAgICBjb25zdCB1aW50OF90KiBzY2FuX3NyYzIgPQ0KKyAgICAgICAgICBwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShwV2VpZ2h0LT5tX1NyY0VuZCArIGRlc190b3ApICsNCisgICAgICAgICAgZGVzX1NjYW5PZmZldDsNCisgICAgICBmb3IgKGludCBkZXNfY29sID0gMDsgZGVzX2NvbCA8IG1fc2l6ZVg7IGRlc19jb2wrKykgew0KKyAgICAgICAgc3dpdGNoIChwRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgew0KKyAgICAgICAgICBjYXNlIEZYRElCX0ludmFsaWQ6DQorICAgICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQorICAgICAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjoNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6DQorICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogew0KKyAgICAgICAgICAgIGlmIChwRGV2aWNlQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpbnQgZGVzX2cgPSAwOw0KKyAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKGRlc19nID4+IDE2KTsNCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsNCisgICAgICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICAgIHNjYW5fc3JjMSArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICBzY2FuX3NyYzIgKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAgICAgc2Nhbl9kZXMgKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgIGNhc2UgRlhESUJfQXJnYjogew0KKyAgICAgICAgICAgIEZYX0RXT1JEIGRlc19hID0gMCwgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgICBkZXNfYSArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICBkZXNfYSArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2EpID4+IDE2KTsNCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICB9DQotICAgICAgICBSZVNhbXBsZVNjYW5saW5lKHBEZXZpY2VCaXRtYXAsIGRlc19yb3csIG1fcERlY29kZUJ1Ziwgc3JjX2Zvcm1hdCk7DQotICAgICAgICBpZihzY2FsZV95ID4gMS4wKSB7DQotICAgICAgICAgICAgUmVzYW1wbGVWZXJ0KHBEZXZpY2VCaXRtYXAsIHNjYWxlX3ksIGRlc19yb3cpOw0KLSAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KKyAgICBpbnQgZGVzX2JvdHRvbSA9IGRlc190b3AgKyBtX3NpemVZOw0KKyAgICBpZiAoZGVzX3JvdyArIChpbnQpc2NhbGVfeSA+PSBkZXNfYm90dG9tIC0gMSkgew0KKyAgICAgIHVpbnQ4X3QqIHNjYW5fc3JjID0NCisgICAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsNCisgICAgICB3aGlsZSAoKytkZXNfcm93IDwgZGVzX2JvdHRvbSkgew0KKyAgICAgICAgdWludDhfdCogc2Nhbl9kZXMgPQ0KKyAgICAgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgICBGWF9EV09SRCBzaXplID0gbV9zaXplWCAqIGRlc19CcHA7DQorICAgICAgICBGWFNZU19tZW1jcHkoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50IG11bHRpcGxlID0gKGludClGWFNZU19jZWlsKChGWF9GTE9BVClzY2FsZV95IC0gMSk7DQorICBpZiAobXVsdGlwbGUgPiAwKSB7DQorICAgIHVpbnQ4X3QqIHNjYW5fc3JjID0NCisgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQorICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG11bHRpcGxlOyBpKyspIHsNCisgICAgICBpZiAoZGVzX3JvdyArIGkgPj0gbV9zdGFydFkgKyBtX3NpemVZKSB7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0NCisgICAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cgKyBpKSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgRlhfRFdPUkQgc2l6ZSA9IG1fc2l6ZVggKiBkZXNfQnBwOw0KKyAgICAgIEZYU1lTX21lbWNweShzY2FuX2Rlcywgc2Nhbl9zcmMsIHNpemUpOw0KKyAgICB9DQorICB9DQogfQ0KLUZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdldEZyYW1lcyhpbnQzMl90JiBmcmFtZXMsIElGWF9QYXVzZSogcFBhdXNlKQ0KLXsNCi0gICAgaWYoIShtX3N0YXR1cyA9PSBGWENPREVDX1NUQVRVU19GUkFNRV9SRUFEWSB8fCBtX3N0YXR1cyA9PSBGWENPREVDX1NUQVRVU19GUkFNRV9UT0JFQ09OVElOVUUpKSB7DQotICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpSZXNhbXBsZShDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19saW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX3NjYW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KSB7DQorICBpbnQgc3JjX3RvcCA9IG1fY2xpcEJveC50b3A7DQorICBpbnQgZGVzX3RvcCA9IG1fc3RhcnRZOw0KKyAgaW50IHNyY19oZWkgPSBtX2NsaXBCb3guSGVpZ2h0KCk7DQorICBpbnQgZGVzX2hlaSA9IG1fc2l6ZVk7DQorICBpZiAoc3JjX2xpbmUgPj0gc3JjX3RvcCkgew0KKyAgICBkb3VibGUgc2NhbGVfeSA9IChkb3VibGUpZGVzX2hlaSAvIChkb3VibGUpc3JjX2hlaTsNCisgICAgaW50IHNyY19yb3cgPSBzcmNfbGluZSAtIHNyY190b3A7DQorICAgIGludCBkZXNfcm93ID0gKGludCkoc3JjX3JvdyAqIHNjYWxlX3kpICsgZGVzX3RvcDsNCisgICAgaWYgKGRlc19yb3cgPj0gZGVzX3RvcCArIGRlc19oZWkpIHsNCisgICAgICByZXR1cm47DQogICAgIH0NCi0gICAgc3dpdGNoKG1faW1hZ1R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9CTVA6DQotICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOg0KLSAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX1BORzoNCi0gICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6DQotICAgICAgICAgICAgZnJhbWVzID0gbV9GcmFtZU51bWJlciA9IDE7DQotICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOw0KLSAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjogew0KLSAgICAgICAgICAgICAgICBJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAoVFJVRSkgew0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByZWFkUmVzdWx0ID0gcEdpZk1vZHVsZS0+TG9hZEZyYW1lSW5mbyhtX3BHaWZDb250ZXh0LCAmbV9GcmFtZU51bWJlcik7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZShyZWFkUmVzdWx0ID09IDIpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighR2lmUmVhZE1vcmVEYXRhKHBHaWZNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yX3N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19GUkFNRV9UT0JFQ09OVElOVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRSZXN1bHQgPSBwR2lmTW9kdWxlLT5Mb2FkRnJhbWVJbmZvKG1fcEdpZkNvbnRleHQsICZtX0ZyYW1lTnVtYmVyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKHJlYWRSZXN1bHQgPT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcyA9IG1fRnJhbWVOdW1iZXI7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYobV9wR2lmQ29udGV4dCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEdpZk1vZHVsZS0+RmluaXNoKG1fcEdpZkNvbnRleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEdpZkNvbnRleHQgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIDsNCisgICAgUmVTYW1wbGVTY2FubGluZShwRGV2aWNlQml0bWFwLCBkZXNfcm93LCBtX3BEZWNvZGVCdWYsIHNyY19mb3JtYXQpOw0KKyAgICBpZiAoc2NhbGVfeSA+IDEuMCkgew0KKyAgICAgIFJlc2FtcGxlVmVydChwRGV2aWNlQml0bWFwLCBzY2FsZV95LCBkZXNfcm93KTsNCiAgICAgfQ0KKyAgfQ0KK30NCitGWENPREVDX1NUQVRVUyBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHZXRGcmFtZXMoaW50MzJfdCYgZnJhbWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgaWYgKCEobV9zdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFkgfHwNCisgICAgICAgIG1fc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1RPQkVDT05USU5VRSkpIHsNCiAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgfQ0KKyAgc3dpdGNoIChtX2ltYWdUeXBlKSB7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9CTVA6DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9KUEc6DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6DQorICAgICAgZnJhbWVzID0gbV9GcmFtZU51bWJlciA9IDE7DQorICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOw0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfR0lGOiB7DQorICAgICAgSUNvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKTsNCisgICAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgaW50MzJfdCByZWFkUmVzdWx0ID0NCisgICAgICAgICAgICBwR2lmTW9kdWxlLT5Mb2FkRnJhbWVJbmZvKG1fcEdpZkNvbnRleHQsICZtX0ZyYW1lTnVtYmVyKTsNCisgICAgICAgIHdoaWxlIChyZWFkUmVzdWx0ID09IDIpIHsNCisgICAgICAgICAgRlhDT0RFQ19TVEFUVVMgZXJyb3Jfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgICAgICAgIGlmICghR2lmUmVhZE1vcmVEYXRhKHBHaWZNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCisgICAgICAgICAgICByZXR1cm4gZXJyb3Jfc3RhdHVzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfVE9CRUNPTlRJTlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJlYWRSZXN1bHQgPSBwR2lmTW9kdWxlLT5Mb2FkRnJhbWVJbmZvKG1fcEdpZkNvbnRleHQsICZtX0ZyYW1lTnVtYmVyKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChyZWFkUmVzdWx0ID09IDEpIHsNCisgICAgICAgICAgZnJhbWVzID0gbV9GcmFtZU51bWJlcjsNCisgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcEdpZkNvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgICBwR2lmTW9kdWxlLT5GaW5pc2gobV9wR2lmQ29udGV4dCk7DQorICAgICAgICAgIG1fcEdpZkNvbnRleHQgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBkZWZhdWx0OjsNCisgIH0NCisgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsNCiB9DQogRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6U3RhcnREZWNvZGUoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsDQotICAgICAgICBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksDQotICAgICAgICBpbnQzMl90IGZyYW1lcywgRlhfQk9PTCBiSW50ZXJwb2wpDQotew0KLSAgICBpZihtX3N0YXR1cyAhPSBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFkpIHsNCi0gICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW50ZXJwb2wpIHsNCisgIGlmIChtX3N0YXR1cyAhPSBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFkpIHsNCisgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgfQ0KKyAgaWYgKHBESUJpdG1hcCA9PSBOVUxMIHx8IHBESUJpdG1hcC0+R2V0QlBQKCkgPCA4IHx8IGZyYW1lcyA8IDAgfHwNCisgICAgICBmcmFtZXMgPj0gbV9GcmFtZU51bWJlcikgew0KKyAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsNCisgIH0NCisgIG1fcERldmljZUJpdG1hcCA9IHBESUJpdG1hcDsNCisgIGlmIChtX2NsaXBCb3guSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOw0KKyAgfQ0KKyAgaWYgKHNpemVfeCA8PSAwIHx8IHNpemVfeCA+IDY1NTM1IHx8IHNpemVfeSA8PSAwIHx8IHNpemVfeSA+IDY1NTM1KSB7DQorICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOw0KKyAgfQ0KKyAgRlhfUkVDVCBkZXZpY2VfcmMgPQ0KKyAgICAgIEZYX1JFQ1Qoc3RhcnRfeCwgc3RhcnRfeSwgc3RhcnRfeCArIHNpemVfeCwgc3RhcnRfeSArIHNpemVfeSk7DQorICBpbnQzMl90IG91dF9yYW5nZV94ID0gZGV2aWNlX3JjLnJpZ2h0IC0gcERJQml0bWFwLT5HZXRXaWR0aCgpOw0KKyAgaW50MzJfdCBvdXRfcmFuZ2VfeSA9IGRldmljZV9yYy5ib3R0b20gLSBwRElCaXRtYXAtPkdldEhlaWdodCgpOw0KKyAgZGV2aWNlX3JjLkludGVyc2VjdCgNCisgICAgICBGWF9SRUNUKDAsIDAsIHBESUJpdG1hcC0+R2V0V2lkdGgoKSwgcERJQml0bWFwLT5HZXRIZWlnaHQoKSkpOw0KKyAgaWYgKGRldmljZV9yYy5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQorICB9DQorICBtX3N0YXJ0WCA9IGRldmljZV9yYy5sZWZ0Ow0KKyAgbV9zdGFydFkgPSBkZXZpY2VfcmMudG9wOw0KKyAgbV9zaXplWCA9IGRldmljZV9yYy5XaWR0aCgpOw0KKyAgbV9zaXplWSA9IGRldmljZV9yYy5IZWlnaHQoKTsNCisgIG1fYkludGVycG9sID0gYkludGVycG9sOw0KKyAgbV9GcmFtZUN1ciA9IDA7DQorICBpZiAoc3RhcnRfeCA8IDAgfHwgb3V0X3JhbmdlX3ggPiAwKSB7DQorICAgIEZYX0ZMT0FUIHNjYWxlWCA9IChGWF9GTE9BVCltX2NsaXBCb3guV2lkdGgoKSAvIChGWF9GTE9BVClzaXplX3g7DQorICAgIGlmIChzdGFydF94IDwgMCkgew0KKyAgICAgIG1fY2xpcEJveC5sZWZ0IC09IChpbnQzMl90KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXN0YXJ0X3ggKiBzY2FsZVgpOw0KICAgICB9DQotICAgIGlmKHBESUJpdG1hcCA9PSBOVUxMIHx8IHBESUJpdG1hcC0+R2V0QlBQKCkgPCA4IHx8DQotICAgICAgICAgICAgZnJhbWVzIDwgMCB8fCBmcmFtZXMgPj0gbV9GcmFtZU51bWJlcikgew0KLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQorICAgIGlmIChvdXRfcmFuZ2VfeCA+IDApIHsNCisgICAgICBtX2NsaXBCb3gucmlnaHQgLT0gKGludDMyX3QpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKW91dF9yYW5nZV94ICogc2NhbGVYKTsNCiAgICAgfQ0KLSAgICBtX3BEZXZpY2VCaXRtYXAgPSBwRElCaXRtYXA7DQotICAgIGlmKG1fY2xpcEJveC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOw0KKyAgfQ0KKyAgaWYgKHN0YXJ0X3kgPCAwIHx8IG91dF9yYW5nZV95ID4gMCkgew0KKyAgICBGWF9GTE9BVCBzY2FsZVkgPSAoRlhfRkxPQVQpbV9jbGlwQm94LkhlaWdodCgpIC8gKEZYX0ZMT0FUKXNpemVfeTsNCisgICAgaWYgKHN0YXJ0X3kgPCAwKSB7DQorICAgICAgbV9jbGlwQm94LnRvcCAtPSAoaW50MzJfdClGWFNZU19jZWlsKChGWF9GTE9BVClzdGFydF95ICogc2NhbGVZKTsNCiAgICAgfQ0KLSAgICBpZihzaXplX3ggPD0gMCB8fCBzaXplX3ggPiA2NTUzNSB8fCBzaXplX3kgPD0gMCB8fCBzaXplX3kgPiA2NTUzNSkgew0KLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQorICAgIGlmIChvdXRfcmFuZ2VfeSA+IDApIHsNCisgICAgICBtX2NsaXBCb3guYm90dG9tIC09IChpbnQzMl90KUZYU1lTX2Zsb29yKChGWF9GTE9BVClvdXRfcmFuZ2VfeSAqIHNjYWxlWSk7DQogICAgIH0NCi0gICAgRlhfUkVDVCBkZXZpY2VfcmMgPSBGWF9SRUNUKHN0YXJ0X3gsIHN0YXJ0X3ksIHN0YXJ0X3ggKyBzaXplX3gsIHN0YXJ0X3kgKyBzaXplX3kpOw0KLSAgICBpbnQzMl90IG91dF9yYW5nZV94ID0gZGV2aWNlX3JjLnJpZ2h0IC0gcERJQml0bWFwLT5HZXRXaWR0aCgpOw0KLSAgICBpbnQzMl90IG91dF9yYW5nZV95ID0gZGV2aWNlX3JjLmJvdHRvbSAtIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCk7DQotICAgIGRldmljZV9yYy5JbnRlcnNlY3QoRlhfUkVDVCgwLCAwLCBwRElCaXRtYXAtPkdldFdpZHRoKCksIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCkpKTsNCi0gICAgaWYoZGV2aWNlX3JjLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQotICAgIH0NCi0gICAgbV9zdGFydFggPSBkZXZpY2VfcmMubGVmdDsNCi0gICAgbV9zdGFydFkgPSBkZXZpY2VfcmMudG9wOw0KLSAgICBtX3NpemVYICA9IGRldmljZV9yYy5XaWR0aCgpOw0KLSAgICBtX3NpemVZICA9IGRldmljZV9yYy5IZWlnaHQoKTsNCi0gICAgbV9iSW50ZXJwb2wgPSBiSW50ZXJwb2w7DQotICAgIG1fRnJhbWVDdXIgPSAwOw0KLSAgICBpZihzdGFydF94IDwgMCB8fCBvdXRfcmFuZ2VfeCA+IDApIHsNCi0gICAgICAgIEZYX0ZMT0FUIHNjYWxlWCA9IChGWF9GTE9BVCltX2NsaXBCb3guV2lkdGgoKSAvIChGWF9GTE9BVClzaXplX3g7DQotICAgICAgICBpZihzdGFydF94IDwgMCkJew0KLSAgICAgICAgICAgIG1fY2xpcEJveC5sZWZ0IC09IChpbnQzMl90KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXN0YXJ0X3ggKiBzY2FsZVgpOw0KKyAgfQ0KKyAgaWYgKG1fY2xpcEJveC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQorICB9DQorICBzd2l0Y2ggKG1faW1hZ1R5cGUpIHsNCisgICAgY2FzZSBGWENPREVDX0lNQUdFX0pQRzogew0KKyAgICAgIElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRKcGVnTW9kdWxlKCk7DQorICAgICAgaW50IGRvd25fc2NhbGUgPSAxOw0KKyAgICAgIEdldERvd25TY2FsZShkb3duX3NjYWxlKTsNCisgICAgICBGWF9CT09MIGJTdGFydCA9IHBKcGVnTW9kdWxlLT5TdGFydFNjYW5saW5lKG1fcEpwZWdDb250ZXh0LCBkb3duX3NjYWxlKTsNCisgICAgICB3aGlsZSAoIWJTdGFydCkgew0KKyAgICAgICAgRlhDT0RFQ19TVEFUVVMgZXJyb3Jfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICAgICAgICBpZiAoIUpwZWdSZWFkTW9yZURhdGEocEpwZWdNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmKG91dF9yYW5nZV94ID4gMCkJew0KLSAgICAgICAgICAgIG1fY2xpcEJveC5yaWdodCAtPSAoaW50MzJfdClGWFNZU19mbG9vcigoRlhfRkxPQVQpb3V0X3JhbmdlX3ggKiBzY2FsZVgpOw0KKyAgICAgICAgYlN0YXJ0ID0gcEpwZWdNb2R1bGUtPlN0YXJ0U2NhbmxpbmUobV9wSnBlZ0NvbnRleHQsIGRvd25fc2NhbGUpOw0KKyAgICAgIH0NCisgICAgICBpbnQgc2NhbmxpbmVfc2l6ZSA9IChtX1NyY1dpZHRoICsgZG93bl9zY2FsZSAtIDEpIC8gZG93bl9zY2FsZTsNCisgICAgICBzY2FubGluZV9zaXplID0gKHNjYW5saW5lX3NpemUgKiBtX1NyY0NvbXBvbmVudHMgKyAzKSAvIDQgKiA0Ow0KKyAgICAgIGlmIChtX3BEZWNvZGVCdWYgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShtX3BEZWNvZGVCdWYpOw0KKyAgICAgICAgbV9wRGVjb2RlQnVmID0gTlVMTDsNCisgICAgICB9DQorICAgICAgbV9wRGVjb2RlQnVmID0gRlhfQWxsb2ModWludDhfdCwgc2NhbmxpbmVfc2l6ZSk7DQorICAgICAgaWYgKG1fcERlY29kZUJ1ZiA9PSBOVUxMKSB7DQorICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgIH0NCisgICAgICBGWFNZU19tZW1zZXQobV9wRGVjb2RlQnVmLCAwLCBzY2FubGluZV9zaXplKTsNCisgICAgICBtX1dlaWdodEhvcnouQ2FsYyhtX3NpemVYLCAwLCBtX3NpemVYLCBtX2NsaXBCb3guV2lkdGgoKSwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2NsaXBCb3guV2lkdGgoKSwgbV9iSW50ZXJwb2wpOw0KKyAgICAgIG1fV2VpZ2h0VmVydC5DYWxjKG1fc2l6ZVksIG1fY2xpcEJveC5IZWlnaHQoKSk7DQorICAgICAgc3dpdGNoIChtX1NyY0NvbXBvbmVudHMpIHsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjXzhicHBHcmF5Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX1JnYjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19DbXlrOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgR2V0VHJhbnNNZXRob2QocERJQml0bWFwLT5HZXRGb3JtYXQoKSwgbV9TcmNGb3JtYXQpOw0KKyAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6IHsNCisgICAgICBJQ29kZWNfUG5nTW9kdWxlKiBwUG5nTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFBuZ01vZHVsZSgpOw0KKyAgICAgIGlmIChwUG5nTW9kdWxlID09IE5VTEwpIHsNCisgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX3BQbmdDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgIHBQbmdNb2R1bGUtPkZpbmlzaChtX3BQbmdDb250ZXh0KTsNCisgICAgICAgIG1fcFBuZ0NvbnRleHQgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBtX3BQbmdDb250ZXh0ID0gcFBuZ01vZHVsZS0+U3RhcnQoKHZvaWQqKXRoaXMpOw0KKyAgICAgIGlmIChtX3BQbmdDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgfQ0KKyAgICAgIG1fb2ZmU2V0ID0gMDsNCisgICAgICBzd2l0Y2ggKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCisgICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6DQorICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6DQorICAgICAgICAgIG1fU3JjQ29tcG9uZW50cyA9IDE7DQorICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY184YnBwR3JheTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYRElCX1JnYjoNCisgICAgICAgICAgbV9TcmNDb21wb25lbnRzID0gMzsNCisgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX1JnYjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYRElCX1JnYjMyOg0KKyAgICAgICAgY2FzZSBGWERJQl9BcmdiOg0KKyAgICAgICAgICBtX1NyY0NvbXBvbmVudHMgPSA0Ow0KKyAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfQXJnYjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOw0KICAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmKHN0YXJ0X3kgPCAwIHx8IG91dF9yYW5nZV95ID4gMCkgew0KLSAgICAgICAgRlhfRkxPQVQgc2NhbGVZID0gKEZYX0ZMT0FUKW1fY2xpcEJveC5IZWlnaHQoKSAvIChGWF9GTE9BVClzaXplX3k7DQotICAgICAgICBpZihzdGFydF95IDwgMCkgew0KLSAgICAgICAgICAgIG1fY2xpcEJveC50b3AgIC09IChpbnQzMl90KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXN0YXJ0X3kgKiBzY2FsZVkpOw0KKyAgICAgIH0NCisgICAgICBHZXRUcmFuc01ldGhvZChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpLCBtX1NyY0Zvcm1hdCk7DQorICAgICAgaW50IHNjYW5saW5lX3NpemUgPSAobV9TcmNXaWR0aCAqIG1fU3JjQ29tcG9uZW50cyArIDMpIC8gNCAqIDQ7DQorICAgICAgaWYgKG1fcERlY29kZUJ1ZiAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKG1fcERlY29kZUJ1Zik7DQorICAgICAgICBtX3BEZWNvZGVCdWYgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBtX3BEZWNvZGVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzY2FubGluZV9zaXplKTsNCisgICAgICBpZiAobV9wRGVjb2RlQnVmID09IE5VTEwpIHsNCisgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgfQ0KKyAgICAgIEZYU1lTX21lbXNldChtX3BEZWNvZGVCdWYsIDAsIHNjYW5saW5lX3NpemUpOw0KKyAgICAgIG1fV2VpZ2h0SG9yek9PLkNhbGMobV9zaXplWCwgbV9jbGlwQm94LldpZHRoKCksIG1fYkludGVycG9sKTsNCisgICAgICBtX1dlaWdodFZlcnQuQ2FsYyhtX3NpemVZLCBtX2NsaXBCb3guSGVpZ2h0KCkpOw0KKyAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9HSUY6IHsNCisgICAgICBJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpOw0KKyAgICAgIGlmIChwR2lmTW9kdWxlID09IE5VTEwpIHsNCisgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgfQ0KKyAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY184YnBwUmdiOw0KKyAgICAgIEdldFRyYW5zTWV0aG9kKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCksIG1fU3JjRm9ybWF0KTsNCisgICAgICBpbnQgc2NhbmxpbmVfc2l6ZSA9IChtX1NyY1dpZHRoICsgMykgLyA0ICogNDsNCisgICAgICBpZiAobV9wRGVjb2RlQnVmICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUobV9wRGVjb2RlQnVmKTsNCisgICAgICAgIG1fcERlY29kZUJ1ZiA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIG1fcERlY29kZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNjYW5saW5lX3NpemUpOw0KKyAgICAgIGlmIChtX3BEZWNvZGVCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICB9DQorICAgICAgRlhTWVNfbWVtc2V0KG1fcERlY29kZUJ1ZiwgMCwgc2NhbmxpbmVfc2l6ZSk7DQorICAgICAgbV9XZWlnaHRIb3J6LkNhbGMobV9zaXplWCwgMCwgbV9zaXplWCwgbV9jbGlwQm94LldpZHRoKCksIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgbV9jbGlwQm94LldpZHRoKCksIG1fYkludGVycG9sKTsNCisgICAgICBtX1dlaWdodFZlcnQuQ2FsYyhtX3NpemVZLCBtX2NsaXBCb3guSGVpZ2h0KCkpOw0KKyAgICAgIG1fRnJhbWVDdXIgPSBmcmFtZXM7DQorICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWENPREVDX0lNQUdFX0JNUDogew0KKyAgICAgIElDb2RlY19CbXBNb2R1bGUqIHBCbXBNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0Qm1wTW9kdWxlKCk7DQorICAgICAgaWYgKHBCbXBNb2R1bGUgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICB9DQorICAgICAgc3dpdGNoIChtX1NyY0NvbXBvbmVudHMpIHsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjXzhicHBSZ2I7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAzOg0KKyAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfUmdiOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX1JnYjMyOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgR2V0VHJhbnNNZXRob2QobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSwgbV9TcmNGb3JtYXQpOw0KKyAgICAgIG1fU2NhbmxpbmVTaXplID0gKG1fU3JjV2lkdGggKiBtX1NyY0NvbXBvbmVudHMgKyAzKSAvIDQgKiA0Ow0KKyAgICAgIGlmIChtX3BEZWNvZGVCdWYgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShtX3BEZWNvZGVCdWYpOw0KKyAgICAgICAgbV9wRGVjb2RlQnVmID0gTlVMTDsNCisgICAgICB9DQorICAgICAgbV9wRGVjb2RlQnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9TY2FubGluZVNpemUpOw0KKyAgICAgIGlmIChtX3BEZWNvZGVCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICB9DQorICAgICAgRlhTWVNfbWVtc2V0KG1fcERlY29kZUJ1ZiwgMCwgbV9TY2FubGluZVNpemUpOw0KKyAgICAgIG1fV2VpZ2h0SG9yei5DYWxjKG1fc2l6ZVgsIDAsIG1fc2l6ZVgsIG1fY2xpcEJveC5XaWR0aCgpLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fY2xpcEJveC5XaWR0aCgpLCBtX2JJbnRlcnBvbCk7DQorICAgICAgbV9XZWlnaHRWZXJ0LkNhbGMobV9zaXplWSwgbV9jbGlwQm94LkhlaWdodCgpKTsNCisgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfVElGOg0KKyAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorfQ0KK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkNvbnRpbnVlRGVjb2RlKElGWF9QYXVzZSogcFBhdXNlKSB7DQorICBpZiAobV9zdGF0dXMgIT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgew0KKyAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICB9DQorICBzd2l0Y2ggKG1faW1hZ1R5cGUpIHsNCisgICAgY2FzZSBGWENPREVDX0lNQUdFX0pQRzogew0KKyAgICAgIElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRKcGVnTW9kdWxlKCk7DQorICAgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgIEZYX0JPT0wgcmVhZFJlcyA9DQorICAgICAgICAgICAgcEpwZWdNb2R1bGUtPlJlYWRTY2FubGluZShtX3BKcGVnQ29udGV4dCwgbV9wRGVjb2RlQnVmKTsNCisgICAgICAgIHdoaWxlICghcmVhZFJlcykgew0KKyAgICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgICAgICAgICBpZiAoIUpwZWdSZWFkTW9yZURhdGEocEpwZWdNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCisgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICByZWFkUmVzID0gcEpwZWdNb2R1bGUtPlJlYWRTY2FubGluZShtX3BKcGVnQ29udGV4dCwgbV9wRGVjb2RlQnVmKTsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmKG91dF9yYW5nZV95ID4gMCkgew0KLSAgICAgICAgICAgIG1fY2xpcEJveC5ib3R0b20gIC09IChpbnQzMl90KUZYU1lTX2Zsb29yKChGWF9GTE9BVClvdXRfcmFuZ2VfeSAqIHNjYWxlWSk7DQorICAgICAgICBpZiAobV9TcmNGb3JtYXQgPT0gRlhDb2RlY19SZ2IpIHsNCisgICAgICAgICAgaW50IHNyY19CcHAgPSAobV9TcmNGb3JtYXQgJiAweGZmKSA+PiAzOw0KKyAgICAgICAgICBfUkdCMkJHUihtX3BEZWNvZGVCdWYgKyBtX2NsaXBCb3gubGVmdCAqIHNyY19CcHAsIG1fY2xpcEJveC5XaWR0aCgpKTsNCiAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZihtX2NsaXBCb3guSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsNCi0gICAgfQ0KLSAgICBzd2l0Y2gobV9pbWFnVHlwZSkgew0KLSAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX0pQRzogew0KLSAgICAgICAgICAgICAgICBJQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0SnBlZ01vZHVsZSgpOw0KLSAgICAgICAgICAgICAgICBpbnQgZG93bl9zY2FsZSA9IDE7DQotICAgICAgICAgICAgICAgIEdldERvd25TY2FsZShkb3duX3NjYWxlKTsNCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RhcnQgPSBwSnBlZ01vZHVsZS0+U3RhcnRTY2FubGluZShtX3BKcGVnQ29udGV4dCwgZG93bl9zY2FsZSk7DQotICAgICAgICAgICAgICAgIHdoaWxlKCFiU3RhcnQpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoIUpwZWdSZWFkTW9yZURhdGEocEpwZWdNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJTdGFydCA9IHBKcGVnTW9kdWxlLT5TdGFydFNjYW5saW5lKG1fcEpwZWdDb250ZXh0LCBkb3duX3NjYWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpbnQgc2NhbmxpbmVfc2l6ZSA9ICggbV9TcmNXaWR0aCArIGRvd25fc2NhbGUgLSAxKSAvIGRvd25fc2NhbGU7DQotICAgICAgICAgICAgICAgIHNjYW5saW5lX3NpemUgPSAoc2NhbmxpbmVfc2l6ZSAqIG1fU3JjQ29tcG9uZW50cyArIDMpIC8gNCAqIDQ7DQotICAgICAgICAgICAgICAgIGlmKG1fcERlY29kZUJ1ZiAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKG1fcERlY29kZUJ1Zik7DQotICAgICAgICAgICAgICAgICAgICBtX3BEZWNvZGVCdWYgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fcERlY29kZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNjYW5saW5lX3NpemUpOw0KLSAgICAgICAgICAgICAgICBpZihtX3BEZWNvZGVCdWYgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQobV9wRGVjb2RlQnVmLCAwLCBzY2FubGluZV9zaXplKTsNCi0gICAgICAgICAgICAgICAgbV9XZWlnaHRIb3J6LkNhbGMobV9zaXplWCwgMCwgbV9zaXplWCwgbV9jbGlwQm94LldpZHRoKCksIDAsIG1fY2xpcEJveC5XaWR0aCgpLCBtX2JJbnRlcnBvbCk7DQotICAgICAgICAgICAgICAgIG1fV2VpZ2h0VmVydC5DYWxjKG1fc2l6ZVksIG1fY2xpcEJveC5IZWlnaHQoKSk7DQotICAgICAgICAgICAgICAgIHN3aXRjaChtX1NyY0NvbXBvbmVudHMpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfOGJwcEdyYXk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX1JnYjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfQ215azsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBHZXRUcmFuc01ldGhvZChwRElCaXRtYXAtPkdldEZvcm1hdCgpLCBtX1NyY0Zvcm1hdCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX1BORzogew0KLSAgICAgICAgICAgICAgICBJQ29kZWNfUG5nTW9kdWxlKiBwUG5nTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFBuZ01vZHVsZSgpOw0KLSAgICAgICAgICAgICAgICBpZihwUG5nTW9kdWxlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYobV9wUG5nQ29udGV4dCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBwUG5nTW9kdWxlLT5GaW5pc2gobV9wUG5nQ29udGV4dCk7DQotICAgICAgICAgICAgICAgICAgICBtX3BQbmdDb250ZXh0ID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BQbmdDb250ZXh0ID0gcFBuZ01vZHVsZS0+U3RhcnQoKHZvaWQqKXRoaXMpOw0KLSAgICAgICAgICAgICAgICBpZihtX3BQbmdDb250ZXh0ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9vZmZTZXQgPSAwOw0KLSAgICAgICAgICAgICAgICBzd2l0Y2gobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjoNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NyY0NvbXBvbmVudHMgPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY184YnBwR3JheTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fU3JjQ29tcG9uZW50cyA9IDM7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX1JnYjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCX0FyZ2I6DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNDb21wb25lbnRzID0gNDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfQXJnYjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEdldFRyYW5zTWV0aG9kKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCksIG1fU3JjRm9ybWF0KTsNCi0gICAgICAgICAgICAgICAgaW50IHNjYW5saW5lX3NpemUgPSAobV9TcmNXaWR0aCAqIG1fU3JjQ29tcG9uZW50cyArIDMpIC8gNCAqIDQ7DQotICAgICAgICAgICAgICAgIGlmKG1fcERlY29kZUJ1ZiAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKG1fcERlY29kZUJ1Zik7DQotICAgICAgICAgICAgICAgICAgICBtX3BEZWNvZGVCdWYgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fcERlY29kZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNjYW5saW5lX3NpemUpOw0KLSAgICAgICAgICAgICAgICBpZihtX3BEZWNvZGVCdWYgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQobV9wRGVjb2RlQnVmLCAwLCBzY2FubGluZV9zaXplKTsNCi0gICAgICAgICAgICAgICAgbV9XZWlnaHRIb3J6T08uQ2FsYyhtX3NpemVYLCBtX2NsaXBCb3guV2lkdGgoKSwgbV9iSW50ZXJwb2wpOw0KLSAgICAgICAgICAgICAgICBtX1dlaWdodFZlcnQuQ2FsYyhtX3NpemVZLCBtX2NsaXBCb3guSGVpZ2h0KCkpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9HSUY6IHsNCi0gICAgICAgICAgICAgICAgSUNvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKTsNCi0gICAgICAgICAgICAgICAgaWYocEdpZk1vZHVsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY184YnBwUmdiOw0KLSAgICAgICAgICAgICAgICBHZXRUcmFuc01ldGhvZChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpLCBtX1NyY0Zvcm1hdCk7DQotICAgICAgICAgICAgICAgIGludCBzY2FubGluZV9zaXplID0gKG1fU3JjV2lkdGggKyAzKSAvIDQgKiA0Ow0KLSAgICAgICAgICAgICAgICBpZihtX3BEZWNvZGVCdWYgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShtX3BEZWNvZGVCdWYpOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2RlQnVmID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzY2FubGluZV9zaXplKTsNCi0gICAgICAgICAgICAgICAgaWYobV9wRGVjb2RlQnVmID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcERlY29kZUJ1ZiwgMCwgc2NhbmxpbmVfc2l6ZSk7DQotICAgICAgICAgICAgICAgIG1fV2VpZ2h0SG9yei5DYWxjKG1fc2l6ZVgsIDAsIG1fc2l6ZVgsIG1fY2xpcEJveC5XaWR0aCgpLCAwLCBtX2NsaXBCb3guV2lkdGgoKSwgbV9iSW50ZXJwb2wpOw0KLSAgICAgICAgICAgICAgICBtX1dlaWdodFZlcnQuQ2FsYyhtX3NpemVZLCBtX2NsaXBCb3guSGVpZ2h0KCkpOw0KLSAgICAgICAgICAgICAgICBtX0ZyYW1lQ3VyID0gZnJhbWVzOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9CTVA6IHsNCi0gICAgICAgICAgICAgICAgSUNvZGVjX0JtcE1vZHVsZSogcEJtcE1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRCbXBNb2R1bGUoKTsNCi0gICAgICAgICAgICAgICAgaWYocEJtcE1vZHVsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHN3aXRjaChtX1NyY0NvbXBvbmVudHMpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfOGJwcFJnYjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfUmdiOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19SZ2IzMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBHZXRUcmFuc01ldGhvZChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpLCBtX1NyY0Zvcm1hdCk7DQotICAgICAgICAgICAgICAgIG1fU2NhbmxpbmVTaXplID0gKG1fU3JjV2lkdGggKiBtX1NyY0NvbXBvbmVudHMgKyAzKSAvIDQgKiA0Ow0KLSAgICAgICAgICAgICAgICBpZihtX3BEZWNvZGVCdWYgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShtX3BEZWNvZGVCdWYpOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2RlQnVmID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBtX1NjYW5saW5lU2l6ZSk7DQotICAgICAgICAgICAgICAgIGlmKG1fcERlY29kZUJ1ZiA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldChtX3BEZWNvZGVCdWYsIDAsIG1fU2NhbmxpbmVTaXplKTsNCi0gICAgICAgICAgICAgICAgbV9XZWlnaHRIb3J6LkNhbGMobV9zaXplWCwgMCwgbV9zaXplWCwgbV9jbGlwQm94LldpZHRoKCksIDAsIG1fY2xpcEJveC5XaWR0aCgpLCBtX2JJbnRlcnBvbCk7DQotICAgICAgICAgICAgICAgIG1fV2VpZ2h0VmVydC5DYWxjKG1fc2l6ZVksIG1fY2xpcEJveC5IZWlnaHQoKSk7DQotICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX1RJRjoNCisgICAgICAgIGlmIChtX1NyY1JvdyA+PSBtX2NsaXBCb3guYm90dG9tKSB7DQorICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgICAgICAgfQ0KKyAgICAgICAgUmVzYW1wbGUobV9wRGV2aWNlQml0bWFwLCBtX1NyY1JvdywgbV9wRGVjb2RlQnVmLCBtX1NyY0Zvcm1hdCk7DQorICAgICAgICBtX1NyY1JvdysrOw0KKyAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCisgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6IHsNCisgICAgICBJQ29kZWNfUG5nTW9kdWxlKiBwUG5nTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFBuZ01vZHVsZSgpOw0KKyAgICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICBGWF9EV09SRCByZW1haW5fc2l6ZSA9IChGWF9EV09SRCltX3BGaWxlLT5HZXRTaXplKCkgLSBtX29mZlNldDsNCisgICAgICAgIEZYX0RXT1JEIGlucHV0X3NpemUgPQ0KKyAgICAgICAgICAgIHJlbWFpbl9zaXplID4gRlhDT0RFQ19CTE9DS19TSVpFID8gRlhDT0RFQ19CTE9DS19TSVpFIDogcmVtYWluX3NpemU7DQorICAgICAgICBpZiAoaW5wdXRfc2l6ZSA9PSAwKSB7DQorICAgICAgICAgIGlmIChtX3BQbmdDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICBwUG5nTW9kdWxlLT5GaW5pc2gobV9wUG5nQ29udGV4dCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgbV9wUG5nQ29udGV4dCA9IE5VTEw7DQorICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcFNyY0J1ZiAhPSBOVUxMICYmIGlucHV0X3NpemUgPiBtX1NyY1NpemUpIHsNCisgICAgICAgICAgRlhfRnJlZShtX3BTcmNCdWYpOw0KKyAgICAgICAgICBtX3BTcmNCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBpbnB1dF9zaXplKTsNCisgICAgICAgICAgaWYgKG1fcFNyY0J1ZiA9PSBOVUxMKSB7DQorICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYU1lTX21lbXNldChtX3BTcmNCdWYsIDAsIGlucHV0X3NpemUpOw0KKyAgICAgICAgICBtX1NyY1NpemUgPSBpbnB1dF9zaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTCBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgbV9vZmZTZXQsIGlucHV0X3NpemUpOw0KKyAgICAgICAgaWYgKCFiUmVzdWx0KSB7DQorICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsNCisgICAgICAgIH0NCisgICAgICAgIG1fb2ZmU2V0ICs9IGlucHV0X3NpemU7DQorICAgICAgICBiUmVzdWx0ID0gcFBuZ01vZHVsZS0+SW5wdXQobV9wUG5nQ29udGV4dCwgbV9wU3JjQnVmLCBpbnB1dF9zaXplKTsNCisgICAgICAgIGlmICghYlJlc3VsdCkgew0KKyAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICAgICAgICB9DQorICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjogew0KKyAgICAgIElDb2RlY19HaWZNb2R1bGUqIHBHaWZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0R2lmTW9kdWxlKCk7DQorICAgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgIGludDMyX3QgcmVhZFJlcyA9IHBHaWZNb2R1bGUtPkxvYWRGcmFtZShtX3BHaWZDb250ZXh0LCBtX0ZyYW1lQ3VyKTsNCisgICAgICAgIHdoaWxlIChyZWFkUmVzID09IDIpIHsNCisgICAgICAgICAgRlhDT0RFQ19TVEFUVVMgZXJyb3Jfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCisgICAgICAgICAgaWYgKCFHaWZSZWFkTW9yZURhdGEocEdpZk1vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgew0KKyAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQogICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCi0gICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIH0NCisgICAgICAgICAgcmVhZFJlcyA9IHBHaWZNb2R1bGUtPkxvYWRGcmFtZShtX3BHaWZDb250ZXh0LCBtX0ZyYW1lQ3VyKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChyZWFkUmVzID09IDEpIHsNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQorICAgICAgICB9DQorICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9CTVA6IHsNCisgICAgICBJQ29kZWNfQm1wTW9kdWxlKiBwQm1wTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEJtcE1vZHVsZSgpOw0KKyAgICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICBpbnQzMl90IHJlYWRSZXMgPSBwQm1wTW9kdWxlLT5Mb2FkSW1hZ2UobV9wQm1wQ29udGV4dCk7DQorICAgICAgICB3aGlsZSAocmVhZFJlcyA9PSAyKSB7DQorICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQorICAgICAgICAgIGlmICghQm1wUmVhZE1vcmVEYXRhKHBCbXBNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCisgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcmVhZFJlcyA9IHBCbXBNb2R1bGUtPkxvYWRJbWFnZShtX3BCbXBDb250ZXh0KTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChyZWFkUmVzID09IDEpIHsNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQorICAgICAgICB9DQorICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6IHsNCisgICAgICBJQ29kZWNfVGlmZk1vZHVsZSogcFRpZmZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0VGlmZk1vZHVsZSgpOw0KKyAgICAgIEZYX0JPT0wgcmV0ID0gRkFMU0U7DQorICAgICAgaWYgKG1fcERldmljZUJpdG1hcC0+R2V0QlBQKCkgPT0gMzIgJiYNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwLT5HZXRXaWR0aCgpID09IG1fU3JjV2lkdGggJiYgbV9TcmNXaWR0aCA9PSBtX3NpemVYICYmDQorICAgICAgICAgIG1fcERldmljZUJpdG1hcC0+R2V0SGVpZ2h0KCkgPT0gbV9TcmNIZWlnaHQgJiYNCisgICAgICAgICAgbV9TcmNIZWlnaHQgPT0gbV9zaXplWSAmJiBtX3N0YXJ0WCA9PSAwICYmIG1fc3RhcnRZID09IDAgJiYNCisgICAgICAgICAgbV9jbGlwQm94LmxlZnQgPT0gMCAmJiBtX2NsaXBCb3gudG9wID09IDAgJiYNCisgICAgICAgICAgbV9jbGlwQm94LnJpZ2h0ID09IG1fU3JjV2lkdGggJiYgbV9jbGlwQm94LmJvdHRvbSA9PSBtX1NyY0hlaWdodCkgew0KKyAgICAgICAgcmV0ID0gcFRpZmZNb2R1bGUtPkRlY29kZShtX3BUaWZmQ29udGV4dCwgbV9wRGV2aWNlQml0bWFwKTsNCisgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgIGlmICghcmV0KSB7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOw0KKyAgICAgICAgcERJQml0bWFwLT5DcmVhdGUobV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQsIEZYRElCX0FyZ2IpOw0KKyAgICAgICAgaWYgKHBESUJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgew0KKyAgICAgICAgICBkZWxldGUgcERJQml0bWFwOw0KKyAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgIH0NCisgICAgICAgIHJldCA9IHBUaWZmTW9kdWxlLT5EZWNvZGUobV9wVGlmZkNvbnRleHQsIHBESUJpdG1hcCk7DQorICAgICAgICBpZiAoIXJldCkgew0KKyAgICAgICAgICBkZWxldGUgcERJQml0bWFwOw0KKyAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICAgICAgICB9DQorICAgICAgICBDRlhfRElCaXRtYXAqIHBDbGlwQml0bWFwID0NCisgICAgICAgICAgICAobV9jbGlwQm94LmxlZnQgPT0gMCAmJiBtX2NsaXBCb3gudG9wID09IDAgJiYNCisgICAgICAgICAgICAgbV9jbGlwQm94LnJpZ2h0ID09IG1fU3JjV2lkdGggJiYgbV9jbGlwQm94LmJvdHRvbSA9PSBtX1NyY0hlaWdodCkNCisgICAgICAgICAgICAgICAgPyBwRElCaXRtYXANCisgICAgICAgICAgICAgICAgOiBwRElCaXRtYXAtPkNsb25lKCZtX2NsaXBCb3gpOw0KKyAgICAgICAgaWYgKHBESUJpdG1hcCAhPSBwQ2xpcEJpdG1hcCkgew0KKyAgICAgICAgICBkZWxldGUgcERJQml0bWFwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBDbGlwQml0bWFwID09IE5VTEwpIHsNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICB9DQorICAgICAgICBDRlhfRElCaXRtYXAqIHBGb3JtYXRCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgc3dpdGNoIChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpKSB7DQorICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjoNCisgICAgICAgICAgICBwRm9ybWF0Qml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsNCisgICAgICAgICAgICBwRm9ybWF0Qml0bWFwLT5DcmVhdGUocENsaXBCaXRtYXAtPkdldFdpZHRoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQml0bWFwLT5HZXRIZWlnaHQoKSwgRlhESUJfOGJwcFJnYik7DQogICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOg0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOw0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAtPkNyZWF0ZShwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl84YnBwTWFzayk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOw0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAtPkNyZWF0ZShwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl9SZ2IpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZYRElCX1JnYjMyOg0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOw0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAtPkNyZWF0ZShwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl9SZ2IzMik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgRlhESUJfQXJnYjoNCisgICAgICAgICAgICBwRm9ybWF0Qml0bWFwID0gcENsaXBCaXRtYXA7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGRlZmF1bHQ6Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoIChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpKSB7DQorICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjoNCisgICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazogew0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCk7IHJvdysrKSB7DQorICAgICAgICAgICAgICB1aW50OF90KiBzcmNfbGluZSA9ICh1aW50OF90KilwQ2xpcEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsNCisgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc19saW5lID0gKHVpbnQ4X3QqKXBGb3JtYXRCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQorICAgICAgICAgICAgICBmb3IgKGludDMyX3QgY29sID0gMDsgY29sIDwgcENsaXBCaXRtYXAtPkdldFdpZHRoKCk7IGNvbCsrKSB7DQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgX2EgPSAyNTUgLSBzcmNfbGluZVszXTsNCisgICAgICAgICAgICAgICAgdWludDhfdCBiID0gKHNyY19saW5lWzBdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1Ow0KKyAgICAgICAgICAgICAgICB1aW50OF90IGcgPSAoc3JjX2xpbmVbMV0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7DQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgciA9IChzcmNfbGluZVsyXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsNCisgICAgICAgICAgICAgICAgKmRlc19saW5lKysgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOw0KKyAgICAgICAgICAgICAgICBzcmNfbGluZSArPSA0Ow0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsNCisgICAgICAgICAgICBpbnQzMl90IGRlc0JwcCA9DQorICAgICAgICAgICAgICAgIChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX1JnYikgPyAzIDogNDsNCisgICAgICAgICAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpOyByb3crKykgew0KKyAgICAgICAgICAgICAgdWludDhfdCogc3JjX2xpbmUgPSAodWludDhfdCopcENsaXBCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQorICAgICAgICAgICAgICB1aW50OF90KiBkZXNfbGluZSA9ICh1aW50OF90KilwRm9ybWF0Qml0bWFwLT5HZXRTY2FubGluZShyb3cpOw0KKyAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpOyBjb2wrKykgew0KKyAgICAgICAgICAgICAgICB1aW50OF90IF9hID0gMjU1IC0gc3JjX2xpbmVbM107DQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgYiA9IChzcmNfbGluZVswXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsNCisgICAgICAgICAgICAgICAgdWludDhfdCBnID0gKHNyY19saW5lWzFdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1Ow0KKyAgICAgICAgICAgICAgICB1aW50OF90IHIgPSAoc3JjX2xpbmVbMl0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7DQorICAgICAgICAgICAgICAgICpkZXNfbGluZSsrID0gYjsNCisgICAgICAgICAgICAgICAgKmRlc19saW5lKysgPSBnOw0KKyAgICAgICAgICAgICAgICAqZGVzX2xpbmUrKyA9IHI7DQorICAgICAgICAgICAgICAgIGRlc19saW5lICs9IGRlc0JwcCAtIDM7DQorICAgICAgICAgICAgICAgIHNyY19saW5lICs9IDQ7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICBkZWZhdWx0OjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwQ2xpcEJpdG1hcCAhPSBwRm9ybWF0Qml0bWFwKSB7DQorICAgICAgICAgIGRlbGV0ZSBwQ2xpcEJpdG1hcDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwRm9ybWF0Qml0bWFwID09IE5VTEwpIHsNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICB9DQorICAgICAgICBDRlhfRElCaXRtYXAqIHBTdHJlY2hCaXRtYXAgPSBwRm9ybWF0Qml0bWFwLT5TdHJldGNoVG8oDQorICAgICAgICAgICAgbV9zaXplWCwgbV9zaXplWSwgbV9iSW50ZXJwb2wgPyBGWERJQl9JTlRFUlBPTCA6IEZYRElCX0RPV05TQU1QTEUpOw0KKyAgICAgICAgZGVsZXRlIHBGb3JtYXRCaXRtYXA7DQorICAgICAgICBwRm9ybWF0Qml0bWFwID0gTlVMTDsNCisgICAgICAgIGlmIChwU3RyZWNoQml0bWFwID09IE5VTEwpIHsNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICB9DQorICAgICAgICBtX3BEZXZpY2VCaXRtYXAtPlRyYW5zZmVyQml0bWFwKG1fc3RhcnRYLCBtX3N0YXJ0WSwgbV9zaXplWCwgbV9zaXplWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVjaEJpdG1hcCwgMCwgMCk7DQorICAgICAgICBkZWxldGUgcFN0cmVjaEJpdG1hcDsNCisgICAgICAgIHBTdHJlY2hCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQogfQ0KLUZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkNvbnRpbnVlRGVjb2RlKElGWF9QYXVzZSogcFBhdXNlKQ0KLXsNCi0gICAgaWYobV9zdGF0dXMgIT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgew0KLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KLSAgICB9DQotICAgIHN3aXRjaChtX2ltYWdUeXBlKSB7DQotICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOiB7DQotICAgICAgICAgICAgICAgIElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRKcGVnTW9kdWxlKCk7DQotICAgICAgICAgICAgICAgIHdoaWxlKFRSVUUpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgcmVhZFJlcyA9IHBKcGVnTW9kdWxlLT5SZWFkU2NhbmxpbmUobV9wSnBlZ0NvbnRleHQsIG1fcERlY29kZUJ1Zik7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSghcmVhZFJlcykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUpwZWdSZWFkTW9yZURhdGEocEpwZWdNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFJlcyA9IHBKcGVnTW9kdWxlLT5SZWFkU2NhbmxpbmUobV9wSnBlZ0NvbnRleHQsIG1fcERlY29kZUJ1Zik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZihtX1NyY0Zvcm1hdCA9PSBGWENvZGVjX1JnYikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwID0gKG1fU3JjRm9ybWF0ICYgMHhmZikgPj4gMzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBfUkdCMkJHUihtX3BEZWNvZGVCdWYgKyBtX2NsaXBCb3gubGVmdCAqIHNyY19CcHAsIG1fY2xpcEJveC5XaWR0aCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKG1fU3JjUm93ID49IG1fY2xpcEJveC5ib3R0b20pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBSZXNhbXBsZShtX3BEZXZpY2VCaXRtYXAsIG1fU3JjUm93LCBtX3BEZWNvZGVCdWYsIG1fU3JjRm9ybWF0KTsNCi0gICAgICAgICAgICAgICAgICAgIG1fU3JjUm93Kys7DQotICAgICAgICAgICAgICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6IHsNCi0gICAgICAgICAgICAgICAgSUNvZGVjX1BuZ01vZHVsZSogcFBuZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRQbmdNb2R1bGUoKTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKFRSVUUpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJlbWFpbl9zaXplID0gKEZYX0RXT1JEKW1fcEZpbGUtPkdldFNpemUoKSAtIG1fb2ZmU2V0Ow0KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgaW5wdXRfc2l6ZSA9IHJlbWFpbl9zaXplID4gRlhDT0RFQ19CTE9DS19TSVpFID8gRlhDT0RFQ19CTE9DS19TSVpFIDogcmVtYWluX3NpemU7DQotICAgICAgICAgICAgICAgICAgICBpZihpbnB1dF9zaXplID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihtX3BQbmdDb250ZXh0ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBuZ01vZHVsZS0+RmluaXNoKG1fcFBuZ0NvbnRleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BQbmdDb250ZXh0ID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZihtX3BTcmNCdWYgIT0gTlVMTCAmJiBpbnB1dF9zaXplID4gbV9TcmNTaXplKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShtX3BTcmNCdWYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFNyY0J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlucHV0X3NpemUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1fcFNyY0J1ZiA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQobV9wU3JjQnVmLCAwLCBpbnB1dF9zaXplKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NyY1NpemUgPSBpbnB1dF9zaXplOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgbV9vZmZTZXQsIGlucHV0X3NpemUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoIWJSZXN1bHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgbV9vZmZTZXQgKz0gaW5wdXRfc2l6ZTsNCi0gICAgICAgICAgICAgICAgICAgIGJSZXN1bHQgPSBwUG5nTW9kdWxlLT5JbnB1dChtX3BQbmdDb250ZXh0LCBtX3BTcmNCdWYsIGlucHV0X3NpemUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoIWJSZXN1bHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfR0lGOiB7DQotICAgICAgICAgICAgICAgIElDb2RlY19HaWZNb2R1bGUqIHBHaWZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0R2lmTW9kdWxlKCk7DQotICAgICAgICAgICAgICAgIHdoaWxlKFRSVUUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmVhZFJlcyA9IHBHaWZNb2R1bGUtPkxvYWRGcmFtZShtX3BHaWZDb250ZXh0LCBtX0ZyYW1lQ3VyKTsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlKHJlYWRSZXMgPT0gMikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUdpZlJlYWRNb3JlRGF0YShwR2lmTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFJlcyA9IHBHaWZNb2R1bGUtPkxvYWRGcmFtZShtX3BHaWZDb250ZXh0LCBtX0ZyYW1lQ3VyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKHJlYWRSZXMgPT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX0JNUDogew0KLSAgICAgICAgICAgICAgICBJQ29kZWNfQm1wTW9kdWxlKiBwQm1wTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEJtcE1vZHVsZSgpOw0KLSAgICAgICAgICAgICAgICB3aGlsZShUUlVFKSB7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJlYWRSZXMgPSBwQm1wTW9kdWxlLT5Mb2FkSW1hZ2UobV9wQm1wQ29udGV4dCk7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZShyZWFkUmVzID09IDIpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFCbXBSZWFkTW9yZURhdGEocEJtcE1vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRSZXMgPSBwQm1wTW9kdWxlLT5Mb2FkSW1hZ2UobV9wQm1wQ29udGV4dCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZihyZWFkUmVzID09IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6IHsNCi0gICAgICAgICAgICAgICAgSUNvZGVjX1RpZmZNb2R1bGUqIHBUaWZmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFRpZmZNb2R1bGUoKTsNCi0gICAgICAgICAgICAgICAgRlhfQk9PTCByZXQgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgaWYobV9wRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA9PSAzMiAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcC0+R2V0V2lkdGgoKSA9PSBtX1NyY1dpZHRoICYmIG1fU3JjV2lkdGggPT0gbV9zaXplWCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcC0+R2V0SGVpZ2h0KCkgPT0gbV9TcmNIZWlnaHQgJiYgbV9TcmNIZWlnaHQgPT0gbV9zaXplWSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhcnRYID09IDAgJiYgbV9zdGFydFkgPT0gMCAmJiBtX2NsaXBCb3gubGVmdCA9PSAwICYmIG1fY2xpcEJveC50b3AgPT0gMA0KLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1fY2xpcEJveC5yaWdodCA9PSBtX1NyY1dpZHRoICYmIG1fY2xpcEJveC5ib3R0b20gPT0gbV9TcmNIZWlnaHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IHBUaWZmTW9kdWxlLT5EZWNvZGUobV9wVGlmZkNvbnRleHQsIG1fcERldmljZUJpdG1hcCk7DQotICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICBpZighcmV0KQl7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOw0KLSAgICAgICAgICAgICAgICAgICAgcERJQml0bWFwLT5DcmVhdGUobV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQsIEZYRElCX0FyZ2IpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYocERJQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXQgPSBwVGlmZk1vZHVsZS0+RGVjb2RlKG1fcFRpZmZDb250ZXh0LCBwRElCaXRtYXApOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoIXJldCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwRElCaXRtYXA7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcENsaXBCaXRtYXAgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtX2NsaXBCb3gubGVmdCAgPT0gMCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBtX2NsaXBCb3gudG9wID09IDAgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9jbGlwQm94LnJpZ2h0ID09IG1fU3JjV2lkdGggJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9jbGlwQm94LmJvdHRvbSA9PSBtX1NyY0hlaWdodCkgPyBwRElCaXRtYXAgOiBwRElCaXRtYXAtPkNsb25lKCZtX2NsaXBCb3gpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYocERJQml0bWFwICE9IHBDbGlwQml0bWFwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDbGlwQml0bWFwID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBGb3JtYXRCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0Qml0bWFwLT5DcmVhdGUocENsaXBCaXRtYXAtPkdldFdpZHRoKCksIHBDbGlwQml0bWFwLT5HZXRIZWlnaHQoKSwgRlhESUJfOGJwcFJnYik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0Qml0bWFwLT5DcmVhdGUocENsaXBCaXRtYXAtPkdldFdpZHRoKCksIHBDbGlwQml0bWFwLT5HZXRIZWlnaHQoKSwgRlhESUJfOGJwcE1hc2spOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCX1JnYjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAtPkNyZWF0ZShwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKSwgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl9SZ2IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCX1JnYjMyOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0Qml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1hdEJpdG1hcC0+Q3JlYXRlKHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpLCBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCksIEZYRElCX1JnYjMyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl9BcmdiOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybWF0Qml0bWFwID0gcENsaXBCaXRtYXA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCk7IHJvdysrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2xpbmUgPSAodWludDhfdCopcENsaXBCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzX2xpbmUgPSAodWludDhfdCopcEZvcm1hdEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgY29sID0gMDsgY29sIDwgcENsaXBCaXRtYXAtPkdldFdpZHRoKCk7IGNvbCsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgX2EgPSAyNTUgLSBzcmNfbGluZVszXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiID0gKHNyY19saW5lWzBdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGcgPSAoc3JjX2xpbmVbMV0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgciA9IChzcmNfbGluZVsyXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc19saW5lKysgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbGluZSArPSA0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCX1JnYjoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYRElCX1JnYjMyOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlc0JwcCA9IChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX1JnYikgPyAzIDogNDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCk7IHJvdysrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2xpbmUgPSAodWludDhfdCopcENsaXBCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzX2xpbmUgPSAodWludDhfdCopcEZvcm1hdEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgY29sID0gMDsgY29sIDwgcENsaXBCaXRtYXAtPkdldFdpZHRoKCk7IGNvbCsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgX2EgPSAyNTUgLSBzcmNfbGluZVszXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiID0gKHNyY19saW5lWzBdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGcgPSAoc3JjX2xpbmVbMV0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgciA9IChzcmNfbGluZVsyXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc19saW5lKysgPSBiOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzX2xpbmUrKyA9IGc7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNfbGluZSsrID0gcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2xpbmUgKz0gZGVzQnBwIC0gMzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xpbmUgKz0gNDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYocENsaXBCaXRtYXAgIT0gcEZvcm1hdEJpdG1hcCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwQ2xpcEJpdG1hcDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKHBGb3JtYXRCaXRtYXAgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcFN0cmVjaEJpdG1hcCA9IHBGb3JtYXRCaXRtYXAtPlN0cmV0Y2hUbyhtX3NpemVYLCBtX3NpemVZLCBtX2JJbnRlcnBvbCA/IEZYRElCX0lOVEVSUE9MIDogRlhESUJfRE9XTlNBTVBMRSk7DQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEZvcm1hdEJpdG1hcDsNCi0gICAgICAgICAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgaWYocFN0cmVjaEJpdG1hcCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwLT5UcmFuc2ZlckJpdG1hcChtX3N0YXJ0WCwgbV9zdGFydFksIG1fc2l6ZVgsIG1fc2l6ZVksIHBTdHJlY2hCaXRtYXAsIDAsIDApOw0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTdHJlY2hCaXRtYXA7DQotICAgICAgICAgICAgICAgICAgICBwU3RyZWNoQml0bWFwID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsNCi19DQotSUNvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogQ0NvZGVjX01vZHVsZU1ncjo6Q3JlYXRlUHJvZ3Jlc3NpdmVEZWNvZGVyKCkNCi17DQotICAgIHJldHVybiBuZXcgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcih0aGlzKTsNCitJQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBDQ29kZWNfTW9kdWxlTWdyOjpDcmVhdGVQcm9ncmVzc2l2ZURlY29kZXIoKSB7DQorICByZXR1cm4gbmV3IENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIodGhpcyk7DQogfQ0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcHJvZ3Jlc3MuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcHJvZ3Jlc3MuaAppbmRleCA4YTMyZjk3Li40NWRjNmQ3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wcm9ncmVzcy5oCkBAIC03LDIwMCArNywyMTggQEAKICNpZm5kZWYgX0ZYX0NPREVDX1BST0dSRVNTX0hfDQogI2RlZmluZSBfRlhfQ09ERUNfUFJPR1JFU1NfSF8NCiAjZGVmaW5lIEZYQ09ERUNfQkxPQ0tfU0laRSA0MDk2DQotI2RlZmluZSBGWENPREVDX1BOR19HQU1NQQkyLjINCisjZGVmaW5lIEZYQ09ERUNfUE5HX0dBTU1BIDIuMg0KICNpZiBfRlhfT1NfID09IF9GWF9NQUNPU1hfIHx8IF9GWF9PU18gPT0gX0ZYX0lPU18NCi0jCXVuZGVmIEZYQ09ERUNfUE5HX0dBTU1BDQotIwlkZWZpbmUgRlhDT0RFQ19QTkdfR0FNTUEJMS43DQorI3VuZGVmIEZYQ09ERUNfUE5HX0dBTU1BDQorI2RlZmluZSBGWENPREVDX1BOR19HQU1NQSAxLjcNCiAjZW5kaWYNCiBzdHJ1Y3QgUGl4ZWxXZWlnaHQgew0KLSAgICBpbnQJCW1fU3JjU3RhcnQ7DQotICAgIGludAkJbV9TcmNFbmQ7DQotICAgIGludAkJbV9XZWlnaHRzWzFdOw0KKyAgaW50IG1fU3JjU3RhcnQ7DQorICBpbnQgbV9TcmNFbmQ7DQorICBpbnQgbV9XZWlnaHRzWzFdOw0KIH07DQotY2xhc3MgQ0ZYQ09ERUNfV2VpZ2h0VGFibGUNCi17DQotcHVibGljOg0KLSAgICBDRlhDT0RFQ19XZWlnaHRUYWJsZSgpDQotICAgIHsNCi0gICAgICAgIG1fcFdlaWdodFRhYmxlcyA9IE5VTEw7DQorY2xhc3MgQ0ZYQ09ERUNfV2VpZ2h0VGFibGUgew0KKyBwdWJsaWM6DQorICBDRlhDT0RFQ19XZWlnaHRUYWJsZSgpIHsgbV9wV2VpZ2h0VGFibGVzID0gTlVMTDsgfQ0KKyAgfkNGWENPREVDX1dlaWdodFRhYmxlKCkgew0KKyAgICBpZiAobV9wV2VpZ2h0VGFibGVzICE9IE5VTEwpIHsNCisgICAgICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7DQogICAgIH0NCi0gICAgfkNGWENPREVDX1dlaWdodFRhYmxlKCkNCi0gICAgew0KLSAgICAgICAgaWYobV9wV2VpZ2h0VGFibGVzICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7DQotICAgICAgICB9DQotICAgIH0NCisgIH0NCiANCi0gICAgdm9pZAkJCUNhbGMoaW50IGRlc3RfbGVuLCBpbnQgZGVzdF9taW4sIGludCBkZXN0X21heCwgaW50IHNyY19sZW4sIGludCBzcmNfbWluLCBpbnQgc3JjX21heCwgRlhfQk9PTCBiSW50ZXJwb2wpOw0KLSAgICBQaXhlbFdlaWdodCoJR2V0UGl4ZWxXZWlnaHQoaW50IHBpeGVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgKHBpeGVsIC0gbV9EZXN0TWluKSAqIG1fSXRlbVNpemUpOw0KLSAgICB9DQorICB2b2lkIENhbGMoaW50IGRlc3RfbGVuLA0KKyAgICAgICAgICAgIGludCBkZXN0X21pbiwNCisgICAgICAgICAgICBpbnQgZGVzdF9tYXgsDQorICAgICAgICAgICAgaW50IHNyY19sZW4sDQorICAgICAgICAgICAgaW50IHNyY19taW4sDQorICAgICAgICAgICAgaW50IHNyY19tYXgsDQorICAgICAgICAgICAgRlhfQk9PTCBiSW50ZXJwb2wpOw0KKyAgUGl4ZWxXZWlnaHQqIEdldFBpeGVsV2VpZ2h0KGludCBwaXhlbCkgew0KKyAgICByZXR1cm4gKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgKHBpeGVsIC0gbV9EZXN0TWluKSAqIG1fSXRlbVNpemUpOw0KKyAgfQ0KIA0KLSAgICBpbnQJCQkJbV9EZXN0TWluLCBtX0l0ZW1TaXplOw0KLSAgICB1aW50OF90KgkJbV9wV2VpZ2h0VGFibGVzOw0KKyAgaW50IG1fRGVzdE1pbiwgbV9JdGVtU2l6ZTsNCisgIHVpbnQ4X3QqIG1fcFdlaWdodFRhYmxlczsNCiB9Ow0KLWNsYXNzIENGWENPREVDX0hvcnpUYWJsZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGWENPREVDX0hvcnpUYWJsZSgpDQotICAgIHsNCi0gICAgICAgIG1fcFdlaWdodFRhYmxlcyA9IE5VTEw7DQorY2xhc3MgQ0ZYQ09ERUNfSG9yelRhYmxlIHsNCisgcHVibGljOg0KKyAgQ0ZYQ09ERUNfSG9yelRhYmxlKCkgeyBtX3BXZWlnaHRUYWJsZXMgPSBOVUxMOyB9DQorICB+Q0ZYQ09ERUNfSG9yelRhYmxlKCkgew0KKyAgICBpZiAobV9wV2VpZ2h0VGFibGVzICE9IE5VTEwpIHsNCisgICAgICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7DQogICAgIH0NCi0gICAgfkNGWENPREVDX0hvcnpUYWJsZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1fcFdlaWdodFRhYmxlcyAhPSBOVUxMKSB7DQotICAgICAgICAgICAgRlhfRnJlZShtX3BXZWlnaHRUYWJsZXMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICB9DQogDQotICAgIHZvaWQJCQlDYWxjKGludCBkZXN0X2xlbiwgaW50IHNyY19sZW4sIEZYX0JPT0wgYkludGVycG9sKTsNCi0gICAgUGl4ZWxXZWlnaHQqCUdldFBpeGVsV2VpZ2h0KGludCBwaXhlbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIHBpeGVsICogbV9JdGVtU2l6ZSk7DQotICAgIH0NCisgIHZvaWQgQ2FsYyhpbnQgZGVzdF9sZW4sIGludCBzcmNfbGVuLCBGWF9CT09MIGJJbnRlcnBvbCk7DQorICBQaXhlbFdlaWdodCogR2V0UGl4ZWxXZWlnaHQoaW50IHBpeGVsKSB7DQorICAgIHJldHVybiAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyBwaXhlbCAqIG1fSXRlbVNpemUpOw0KKyAgfQ0KIA0KLSAgICBpbnQJCQkJbV9JdGVtU2l6ZTsNCi0gICAgdWludDhfdCoJCW1fcFdlaWdodFRhYmxlczsNCisgIGludCBtX0l0ZW1TaXplOw0KKyAgdWludDhfdCogbV9wV2VpZ2h0VGFibGVzOw0KIH07DQotY2xhc3MgQ0ZYQ09ERUNfVmVydFRhYmxlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYQ09ERUNfVmVydFRhYmxlKCkNCi0gICAgew0KLSAgICAgICAgbV9wV2VpZ2h0VGFibGVzID0gTlVMTDsNCitjbGFzcyBDRlhDT0RFQ19WZXJ0VGFibGUgew0KKyBwdWJsaWM6DQorICBDRlhDT0RFQ19WZXJ0VGFibGUoKSB7IG1fcFdlaWdodFRhYmxlcyA9IE5VTEw7IH0NCisgIH5DRlhDT0RFQ19WZXJ0VGFibGUoKSB7DQorICAgIGlmIChtX3BXZWlnaHRUYWJsZXMgIT0gTlVMTCkgew0KKyAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCiAgICAgfQ0KLSAgICB+Q0ZYQ09ERUNfVmVydFRhYmxlKCkNCi0gICAgew0KLSAgICAgICAgaWYobV9wV2VpZ2h0VGFibGVzICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgdm9pZAkJCUNhbGMoaW50IGRlc3RfbGVuLCBpbnQgc3JjX2xlbik7DQotICAgIFBpeGVsV2VpZ2h0KglHZXRQaXhlbFdlaWdodChpbnQgcGl4ZWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyBwaXhlbCAqIG1fSXRlbVNpemUpOw0KLSAgICB9DQotICAgIGludAkJCQltX0l0ZW1TaXplOw0KLSAgICB1aW50OF90KgkJbV9wV2VpZ2h0VGFibGVzOw0KKyAgfQ0KKyAgdm9pZCBDYWxjKGludCBkZXN0X2xlbiwgaW50IHNyY19sZW4pOw0KKyAgUGl4ZWxXZWlnaHQqIEdldFBpeGVsV2VpZ2h0KGludCBwaXhlbCkgew0KKyAgICByZXR1cm4gKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgcGl4ZWwgKiBtX0l0ZW1TaXplKTsNCisgIH0NCisgIGludCBtX0l0ZW1TaXplOw0KKyAgdWludDhfdCogbV9wV2VpZ2h0VGFibGVzOw0KIH07DQogZW51bSBGWENvZGVjX0Zvcm1hdCB7DQotICAgIEZYQ29kZWNfSW52YWxpZCA9IDAsDQotICAgIEZYQ29kZWNfMWJwcEdyYXkgPSAweDEwMSwNCi0gICAgRlhDb2RlY18xYnBwUmdiID0gMHgwMDEsDQotICAgIEZYQ29kZWNfOGJwcEdyYXkgPSAweDEwOCwNCi0gICAgRlhDb2RlY184YnBwUmdiID0gMHgwMDgsDQotICAgIEZYQ29kZWNfUmdiID0gMHgwMTgsDQotICAgIEZYQ29kZWNfUmdiMzIgPSAweDAyMCwNCi0gICAgRlhDb2RlY19BcmdiID0gMHgyMjAsDQotICAgIEZYQ29kZWNfQ215ayA9IDB4MTIwDQorICBGWENvZGVjX0ludmFsaWQgPSAwLA0KKyAgRlhDb2RlY18xYnBwR3JheSA9IDB4MTAxLA0KKyAgRlhDb2RlY18xYnBwUmdiID0gMHgwMDEsDQorICBGWENvZGVjXzhicHBHcmF5ID0gMHgxMDgsDQorICBGWENvZGVjXzhicHBSZ2IgPSAweDAwOCwNCisgIEZYQ29kZWNfUmdiID0gMHgwMTgsDQorICBGWENvZGVjX1JnYjMyID0gMHgwMjAsDQorICBGWENvZGVjX0FyZ2IgPSAweDIyMCwNCisgIEZYQ29kZWNfQ215ayA9IDB4MTIwDQogfTsNCi1jbGFzcyBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyIDogcHVibGljIElDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXINCi17DQotcHVibGljOg0KLSAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01ncik7DQotICAgIHZpcnR1YWwgfkNDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIoKTsNCitjbGFzcyBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyIDogcHVibGljIElDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIgew0KKyBwdWJsaWM6DQorICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01ncik7DQorICB2aXJ0dWFsIH5DQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKCk7DQogDQotcHVibGljOg0KLSAgICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTCQlMb2FkSW1hZ2VJbmZvKElGWF9GaWxlUmVhZCogcEZpbGUsIEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOw0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTIExvYWRJbWFnZUluZm8oSUZYX0ZpbGVSZWFkKiBwRmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWENPREVDX0lNQUdFX1RZUEUgaW1hZ2VUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOw0KIA0KLSAgICB2aXJ0dWFsIEZYQ09ERUNfSU1BR0VfVFlQRQlHZXRUeXBlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faW1hZ1R5cGU7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0V2lkdGgoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9TcmNXaWR0aDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRIZWlnaHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9TcmNIZWlnaHQ7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0TnVtQ29tcG9uZW50cygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX1NyY0NvbXBvbmVudHM7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0QlBDKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fU3JjQlBDOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRDbGlwQm94KEZYX1JFQ1QqIGNsaXApOw0KLSAgICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTCQlHZXRGcmFtZXMoaW50MzJfdCYgZnJhbWVzLCBJRlhfUGF1c2UqIHBQYXVzZSk7DQorICB2aXJ0dWFsIEZYQ09ERUNfSU1BR0VfVFlQRSBHZXRUeXBlKCkgeyByZXR1cm4gbV9pbWFnVHlwZTsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZHRoKCkgeyByZXR1cm4gbV9TcmNXaWR0aDsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldEhlaWdodCgpIHsgcmV0dXJuIG1fU3JjSGVpZ2h0OyB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TnVtQ29tcG9uZW50cygpIHsgcmV0dXJuIG1fU3JjQ29tcG9uZW50czsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldEJQQygpIHsgcmV0dXJuIG1fU3JjQlBDOyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2xpcEJveChGWF9SRUNUKiBjbGlwKTsNCisgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMgR2V0RnJhbWVzKGludDMyX3QmIGZyYW1lcywgSUZYX1BhdXNlKiBwUGF1c2UpOw0KIA0KLSAgICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTCQlTdGFydERlY29kZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzLCBGWF9CT09MIGJJbnRlcnBvbCk7DQorICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTIFN0YXJ0RGVjb2RlKENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbnRlcnBvbCk7DQogDQotICAgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMJCUNvbnRpbnVlRGVjb2RlKElGWF9QYXVzZSogcFBhdXNlKTsNCisgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMgQ29udGludWVEZWNvZGUoSUZYX1BhdXNlKiBwUGF1c2UpOw0KIA0KLXByb3RlY3RlZDoNCi0gICAgRlhfQk9PTAkJCQkJCURldGVjdEltYWdlVHlwZShGWENPREVDX0lNQUdFX1RZUEUgaW1hZ2VUeXBlLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlID0gTlVMTCk7DQotICAgIHZvaWQJCQkJCQlHZXREb3duU2NhbGUoaW50JiBkb3duX3NjYWxlKTsNCi0gICAgdm9pZAkJCQkJCUdldFRyYW5zTWV0aG9kKEZYRElCX0Zvcm1hdCBkZXNfZm9ybWF0LCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsNCi0gICAgdm9pZAkJCQkJCVJlU2FtcGxlU2NhbmxpbmUoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLCBpbnQzMl90IGRlc19saW5lLCB1aW50OF90KiBzcmNfc2NhbiwgRlhDb2RlY19Gb3JtYXQgc3JjX2Zvcm1hdCk7DQotICAgIHZvaWQJCQkJCQlSZXNhbXBsZShDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGludDMyX3Qgc3JjX2xpbmUsIHVpbnQ4X3QqIHNyY19zY2FuLCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsNCi0gICAgdm9pZAkJCQkJCVJlc2FtcGxlVmVydChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGRvdWJsZSBzY2FsZV95LCBpbnQgZGVzX3Jvdyk7DQotICAgIEZYX0JPT0wJCQkJCQlKcGVnUmVhZE1vcmVEYXRhKElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSwgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpOw0KLSAgICBzdGF0aWMgRlhfQk9PTAkJCQlQbmdSZWFkSGVhZGVyRnVuYyh2b2lkKiBwTW9kdWxlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicGMsIGludCBwYXNzLCBpbnQqIGNvbG9yX3R5cGUsIGRvdWJsZSogZ2FtbWEpOw0KLSAgICBzdGF0aWMgRlhfQk9PTAkJCQlQbmdBc2tTY2FubGluZUJ1ZkZ1bmModm9pZCogcE1vZHVsZSwgaW50IGxpbmUsIHVpbnQ4X3QqJiBzcmNfYnVmKTsNCi0gICAgc3RhdGljIHZvaWQJCQkJCVBuZ0ZpbGxTY2FubGluZUJ1ZkNvbXBsZXRlZEZ1bmModm9pZCogcE1vZHVsZSwgaW50IHBhc3MsIGludCBsaW5lKTsNCi0gICAgdm9pZAkJCQkJCVBuZ09uZU9uZU1hcFJlc2FtcGxlSG9yeihDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGludDMyX3QgZGVzX2xpbmUsIHVpbnQ4X3QqIHNyY19zY2FuLCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBEZXRlY3RJbWFnZVR5cGUoRlhDT0RFQ19JTUFHRV9UWVBFIGltYWdlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUgPSBOVUxMKTsNCisgIHZvaWQgR2V0RG93blNjYWxlKGludCYgZG93bl9zY2FsZSk7DQorICB2b2lkIEdldFRyYW5zTWV0aG9kKEZYRElCX0Zvcm1hdCBkZXNfZm9ybWF0LCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsNCisgIHZvaWQgUmVTYW1wbGVTY2FubGluZShDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXNfbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsNCisgIHZvaWQgUmVzYW1wbGUoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLA0KKyAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19saW5lLA0KKyAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiwNCisgICAgICAgICAgICAgICAgRlhDb2RlY19Gb3JtYXQgc3JjX2Zvcm1hdCk7DQorICB2b2lkIFJlc2FtcGxlVmVydChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGRvdWJsZSBzY2FsZV95LCBpbnQgZGVzX3Jvdyk7DQorICBGWF9CT09MIEpwZWdSZWFkTW9yZURhdGEoSUNvZGVjX0pwZWdNb2R1bGUqIHBKcGVnTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTJiBlcnJfc3RhdHVzKTsNCisgIHN0YXRpYyBGWF9CT09MIFBuZ1JlYWRIZWFkZXJGdW5jKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb2xvcl90eXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBnYW1tYSk7DQorICBzdGF0aWMgRlhfQk9PTCBQbmdBc2tTY2FubGluZUJ1ZkZ1bmModm9pZCogcE1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgc3JjX2J1Zik7DQorICBzdGF0aWMgdm9pZCBQbmdGaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWRGdW5jKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7DQorICB2b2lkIFBuZ09uZU9uZU1hcFJlc2FtcGxlSG9yeihDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlc19saW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX3NjYW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsNCiANCi0gICAgRlhfQk9PTAkJCQkJCUdpZlJlYWRNb3JlRGF0YShJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlLCBGWENPREVDX1NUQVRVUyYgZXJyX3N0YXR1cyk7DQotICAgIHN0YXRpYyB2b2lkCQkJCQlHaWZSZWNvcmRDdXJyZW50UG9zaXRpb25DYWxsYmFjayh2b2lkKiBwTW9kdWxlLCBGWF9EV09SRCYgY3VyX3Bvcyk7DQotICAgIHN0YXRpYyB1aW50OF90KgkJCUdpZkFza0xvY2FsUGFsZXR0ZUJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsIGludDMyX3QgZnJhbWVfbnVtLCBpbnQzMl90IHBhbF9zaXplKTsNCi0gICAgc3RhdGljIEZYX0JPT0wJCQkJR2lmSW5wdXRSZWNvcmRQb3NpdGlvbkJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsIEZYX0RXT1JEIHJjZF9wb3MsIGNvbnN0IEZYX1JFQ1QmIGltZ19yYywNCi0gICAgICAgICAgICBpbnQzMl90IHBhbF9udW0sIHZvaWQqIHBhbF9wdHIsDQotICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLCBGWF9CT09MIHVzZXJfaW5wdXQsDQotICAgICAgICAgICAgaW50MzJfdCB0cmFuc19pbmRleCwgaW50MzJfdCBkaXNwb3NhbF9tZXRob2QsIEZYX0JPT0wgaW50ZXJsYWNlKTsNCi0gICAgc3RhdGljIHZvaWQJCQkJCUdpZlJlYWRTY2FubGluZUNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsIGludDMyX3Qgcm93X251bSwgdWludDhfdCogcm93X2J1Zik7DQotICAgIHZvaWQJCQkJCQlHaWZEb3VibGVMaW5lUmVzYW1wbGVWZXJ0KENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwgZG91YmxlIHNjYWxlX3ksIGludCBkZXNfcm93KTsNCi0gICAgRlhfQk9PTAkJCQkJCUJtcFJlYWRNb3JlRGF0YShJQ29kZWNfQm1wTW9kdWxlKiBwQm1wTW9kdWxlLCBGWENPREVDX1NUQVRVUyYgZXJyX3N0YXR1cyk7DQotICAgIHN0YXRpYyBGWF9CT09MCQkJCUJtcElucHV0SW1hZ2VQb3NpdGlvbkJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsIEZYX0RXT1JEIHJjZF9wb3MpOw0KLSAgICBzdGF0aWMgdm9pZAkJCQkJQm1wUmVhZFNjYW5saW5lQ2FsbGJhY2sodm9pZCogcE1vZHVsZSwgaW50MzJfdCByb3dfbnVtLCB1aW50OF90KiByb3dfYnVmKTsNCi0gICAgdm9pZAkJCQkJCVJlc2FtcGxlVmVydEJUKENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwgZG91YmxlIHNjYWxlX3ksIGludCBkZXNfcm93KTsNCi1wdWJsaWM6DQotICAgIElGWF9GaWxlUmVhZCoJCQkJbV9wRmlsZTsNCi0gICAgQ0NvZGVjX01vZHVsZU1ncioJCQltX3BDb2RlY01ncjsNCi0gICAgdm9pZCoJCQkJCW1fcEpwZWdDb250ZXh0Ow0KLSAgICB2b2lkKgkJCQkJbV9wUG5nQ29udGV4dDsNCi0gICAgdm9pZCoJCQkJCW1fcEdpZkNvbnRleHQ7DQotICAgIHZvaWQqCQkJCQltX3BCbXBDb250ZXh0Ow0KLSAgICB2b2lkKgkJCQkJbV9wVGlmZkNvbnRleHQ7DQotICAgIEZYQ09ERUNfSU1BR0VfVFlQRQkJCW1faW1hZ1R5cGU7DQotICAgIEZYX0RXT1JECQkJCQltX29mZlNldDsNCi0gICAgdWludDhfdCoJCQkJCW1fcFNyY0J1ZjsNCi0gICAgRlhfRFdPUkQJCQkJCW1fU3JjU2l6ZTsNCi0gICAgdWludDhfdCoJCQkJCW1fcERlY29kZUJ1ZjsNCi0gICAgaW50CQkJCQkJCW1fU2NhbmxpbmVTaXplOw0KLSAgICBDRlhfRElCaXRtYXAqCQkJCW1fcERldmljZUJpdG1hcDsNCi0gICAgRlhfQk9PTAkJCQkJCW1fYkludGVycG9sOw0KLSAgICBDRlhDT0RFQ19XZWlnaHRUYWJsZQkJbV9XZWlnaHRIb3J6Ow0KLSAgICBDRlhDT0RFQ19WZXJ0VGFibGUJCQltX1dlaWdodFZlcnQ7DQotICAgIENGWENPREVDX0hvcnpUYWJsZQkJCW1fV2VpZ2h0SG9yek9POw0KLSAgICBpbnQJCQltX1NyY1dpZHRoOw0KLSAgICBpbnQJCQltX1NyY0hlaWdodDsNCi0gICAgaW50CQkJbV9TcmNDb21wb25lbnRzOw0KLSAgICBpbnQJCQltX1NyY0JQQzsNCi0gICAgRlhfUkVDVAkJbV9jbGlwQm94Ow0KLSAgICBpbnQJCQltX3N0YXJ0WDsNCi0gICAgaW50CQkJbV9zdGFydFk7DQotICAgIGludAkJCW1fc2l6ZVg7DQotICAgIGludAkJCW1fc2l6ZVk7DQotICAgIGludAkJCW1fVHJhbnNNZXRob2Q7DQotICAgIEZYX0FSR0IqCW1fcFNyY1BhbGV0dGU7DQotICAgIGludAkJCW1fU3JjUGFsZXR0ZU51bWJlcjsNCi0gICAgaW50CQkJbV9TcmNSb3c7DQotICAgIEZYQ29kZWNfRm9ybWF0IG1fU3JjRm9ybWF0Ow0KLSAgICBpbnQJCQltX1NyY1Bhc3NOdW1iZXI7DQotICAgIGludAkJCW1fRnJhbWVOdW1iZXI7DQotICAgIGludAkJCW1fRnJhbWVDdXI7DQotICAgIGludAkJCQltX0dpZkJnSW5kZXg7DQotICAgIHVpbnQ4X3QqCQltX3BHaWZQYWxldHRlOw0KLSAgICBpbnQzMl90CQltX0dpZlBsdE51bWJlcjsNCi0gICAgaW50CQkJCW1fR2lmVHJhbnNJbmRleDsNCi0gICAgRlhfUkVDVAkJCW1fR2lmRnJhbWVSZWN0Ow0KLSAgICBGWF9CT09MCQkJbV9CbXBJc1RvcEJvdHRvbTsNCi0gICAgRlhDT0RFQ19TVEFUVVMgbV9zdGF0dXM7DQorICBGWF9CT09MIEdpZlJlYWRNb3JlRGF0YShJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpOw0KKyAgc3RhdGljIHZvaWQgR2lmUmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2sodm9pZCogcE1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjdXJfcG9zKTsNCisgIHN0YXRpYyB1aW50OF90KiBHaWZBc2tMb2NhbFBhbGV0dGVCdWZDYWxsYmFjayh2b2lkKiBwTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGFsX3NpemUpOw0KKyAgc3RhdGljIEZYX0JPT0wgR2lmSW5wdXRSZWNvcmRQb3NpdGlvbkJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcmNkX3BvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBpbWdfcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYWxfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhbF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgdXNlcl9pbnB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zX2luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcG9zYWxfbWV0aG9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaW50ZXJsYWNlKTsNCisgIHN0YXRpYyB2b2lkIEdpZlJlYWRTY2FubGluZUNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd19udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKTsNCisgIHZvaWQgR2lmRG91YmxlTGluZVJlc2FtcGxlVmVydChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlX3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc19yb3cpOw0KKyAgRlhfQk9PTCBCbXBSZWFkTW9yZURhdGEoSUNvZGVjX0JtcE1vZHVsZSogcEJtcE1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTJiBlcnJfc3RhdHVzKTsNCisgIHN0YXRpYyBGWF9CT09MIEJtcElucHV0SW1hZ2VQb3NpdGlvbkJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByY2RfcG9zKTsNCisgIHN0YXRpYyB2b2lkIEJtcFJlYWRTY2FubGluZUNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd19udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKTsNCisgIHZvaWQgUmVzYW1wbGVWZXJ0QlQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLCBkb3VibGUgc2NhbGVfeSwgaW50IGRlc19yb3cpOw0KKw0KKyBwdWJsaWM6DQorICBJRlhfRmlsZVJlYWQqIG1fcEZpbGU7DQorICBDQ29kZWNfTW9kdWxlTWdyKiBtX3BDb2RlY01ncjsNCisgIHZvaWQqIG1fcEpwZWdDb250ZXh0Ow0KKyAgdm9pZCogbV9wUG5nQ29udGV4dDsNCisgIHZvaWQqIG1fcEdpZkNvbnRleHQ7DQorICB2b2lkKiBtX3BCbXBDb250ZXh0Ow0KKyAgdm9pZCogbV9wVGlmZkNvbnRleHQ7DQorICBGWENPREVDX0lNQUdFX1RZUEUgbV9pbWFnVHlwZTsNCisgIEZYX0RXT1JEIG1fb2ZmU2V0Ow0KKyAgdWludDhfdCogbV9wU3JjQnVmOw0KKyAgRlhfRFdPUkQgbV9TcmNTaXplOw0KKyAgdWludDhfdCogbV9wRGVjb2RlQnVmOw0KKyAgaW50IG1fU2NhbmxpbmVTaXplOw0KKyAgQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2VCaXRtYXA7DQorICBGWF9CT09MIG1fYkludGVycG9sOw0KKyAgQ0ZYQ09ERUNfV2VpZ2h0VGFibGUgbV9XZWlnaHRIb3J6Ow0KKyAgQ0ZYQ09ERUNfVmVydFRhYmxlIG1fV2VpZ2h0VmVydDsNCisgIENGWENPREVDX0hvcnpUYWJsZSBtX1dlaWdodEhvcnpPTzsNCisgIGludCBtX1NyY1dpZHRoOw0KKyAgaW50IG1fU3JjSGVpZ2h0Ow0KKyAgaW50IG1fU3JjQ29tcG9uZW50czsNCisgIGludCBtX1NyY0JQQzsNCisgIEZYX1JFQ1QgbV9jbGlwQm94Ow0KKyAgaW50IG1fc3RhcnRYOw0KKyAgaW50IG1fc3RhcnRZOw0KKyAgaW50IG1fc2l6ZVg7DQorICBpbnQgbV9zaXplWTsNCisgIGludCBtX1RyYW5zTWV0aG9kOw0KKyAgRlhfQVJHQiogbV9wU3JjUGFsZXR0ZTsNCisgIGludCBtX1NyY1BhbGV0dGVOdW1iZXI7DQorICBpbnQgbV9TcmNSb3c7DQorICBGWENvZGVjX0Zvcm1hdCBtX1NyY0Zvcm1hdDsNCisgIGludCBtX1NyY1Bhc3NOdW1iZXI7DQorICBpbnQgbV9GcmFtZU51bWJlcjsNCisgIGludCBtX0ZyYW1lQ3VyOw0KKyAgaW50IG1fR2lmQmdJbmRleDsNCisgIHVpbnQ4X3QqIG1fcEdpZlBhbGV0dGU7DQorICBpbnQzMl90IG1fR2lmUGx0TnVtYmVyOw0KKyAgaW50IG1fR2lmVHJhbnNJbmRleDsNCisgIEZYX1JFQ1QgbV9HaWZGcmFtZVJlY3Q7DQorICBGWF9CT09MIG1fQm1wSXNUb3BCb3R0b207DQorICBGWENPREVDX1NUQVRVUyBtX3N0YXR1czsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfdGlmZi5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3RpZmYuY3BwCmluZGV4IDEzOTA5NDcuLmI5M2RkYWMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfdGlmZi5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY190aWZmLmNwcApAQCAtMTAsNTEyICsxMCw1NTQgQEAKIGV4dGVybiAiQyIgew0KICNpbmNsdWRlICIuLi9meF90aWZmL2luY2x1ZGUvZnhfdGlmZmlvcC5oIg0KIH0NCi12b2lkKiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtX3NSR0IoY29uc3QgdW5zaWduZWQgY2hhciogcFByb2ZpbGVEYXRhLCB1bnNpZ25lZCBpbnQgZHdQcm9maWxlU2l6ZSwgaW50IG5Db21wb25lbnRzLCBpbnQgaW50ZW50LCBGWF9EV09SRCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCk7DQotdm9pZCBJY2NMaWJfVHJhbnNsYXRlSW1hZ2Uodm9pZCogcFRyYW5zZm9ybSwgdW5zaWduZWQgY2hhciogcERlc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBTcmMsIGludCBwaXhlbHMpOw0KK3ZvaWQqIEljY0xpYl9DcmVhdGVUcmFuc2Zvcm1fc1JHQihjb25zdCB1bnNpZ25lZCBjaGFyKiBwUHJvZmlsZURhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkd1Byb2ZpbGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbXBvbmVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3JjRm9ybWF0ID0gSWNjX0ZPUk1BVF9ERUZBVUxUKTsNCit2b2lkIEljY0xpYl9UcmFuc2xhdGVJbWFnZSh2b2lkKiBwVHJhbnNmb3JtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBEZXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBTcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscyk7DQogdm9pZCBJY2NMaWJfRGVzdHJveVRyYW5zZm9ybSh2b2lkKiBwVHJhbnNmb3JtKTsNCi1jbGFzcyBDQ29kZWNfVGlmZkNvbnRleHQNCi17DQotcHVibGljOg0KLSAgICBDQ29kZWNfVGlmZkNvbnRleHQoKTsNCi0gICAgfkNDb2RlY19UaWZmQ29udGV4dCgpOw0KK2NsYXNzIENDb2RlY19UaWZmQ29udGV4dCB7DQorIHB1YmxpYzoNCisgIENDb2RlY19UaWZmQ29udGV4dCgpOw0KKyAgfkNDb2RlY19UaWZmQ29udGV4dCgpOw0KIA0KLSAgICBGWF9CT09MCUluaXREZWNvZGVyKElGWF9GaWxlUmVhZCogZmlsZV9wdHIpOw0KLSAgICB2b2lkCUdldEZyYW1lcyhpbnQzMl90JiBmcmFtZXMpOw0KLSAgICBGWF9CT09MCUxvYWRGcmFtZUluZm8oaW50MzJfdCBmcmFtZSwgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LCBGWF9EV09SRCYgY29tcHMsIEZYX0RXT1JEJiBicGMsIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOw0KLSAgICBGWF9CT09MCURlY29kZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCk7DQorICBGWF9CT09MIEluaXREZWNvZGVyKElGWF9GaWxlUmVhZCogZmlsZV9wdHIpOw0KKyAgdm9pZCBHZXRGcmFtZXMoaW50MzJfdCYgZnJhbWVzKTsNCisgIEZYX0JPT0wgTG9hZEZyYW1lSW5mbyhpbnQzMl90IGZyYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb21wcywNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgYnBjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOw0KKyAgRlhfQk9PTCBEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApOw0KIA0KLSAgICB1bmlvbiB7DQotICAgICAgICBJRlhfRmlsZVJlYWQqCWluOw0KLSAgICAgICAgSUZYX0ZpbGVTdHJlYW0qIG91dDsNCi0gICAgfSBpbzsNCisgIHVuaW9uIHsNCisgICAgSUZYX0ZpbGVSZWFkKiBpbjsNCisgICAgSUZYX0ZpbGVTdHJlYW0qIG91dDsNCisgIH0gaW87DQogDQotICAgIEZYX0RXT1JECQlvZmZzZXQ7DQorICBGWF9EV09SRCBvZmZzZXQ7DQogDQotICAgIFRJRkYqCQkJdGlmX2N0eDsNCi0gICAgdm9pZCoJCQlpY2NfY3R4Ow0KLSAgICBpbnQzMl90CQlmcmFtZV9udW07DQotICAgIGludDMyX3QJCWZyYW1lX2N1cjsNCi0gICAgRlhfQk9PTAkJCWlzRGVjb2RlcjsNCi1wcml2YXRlOg0KLSAgICBGWF9CT09MCWlzU3VwcG9ydChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCk7DQotICAgIHZvaWQJU2V0UGFsZXR0ZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgdWludDE2X3QgYnBzKTsNCi0gICAgRlhfQk9PTAlEZWNvZGUxYnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCB3aWR0aCwgdWludDE2X3QgYnBzLCB1aW50MTZfdCBzcHApOw0KLSAgICBGWF9CT09MCURlY29kZThicHBSR0IoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHdpZHRoLCB1aW50MTZfdCBicHMsIHVpbnQxNl90IHNwcCk7DQotICAgIEZYX0JPT0wJRGVjb2RlMjRicHBSR0IoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHdpZHRoLCB1aW50MTZfdCBicHMsIHVpbnQxNl90IHNwcCk7DQorICBUSUZGKiB0aWZfY3R4Ow0KKyAgdm9pZCogaWNjX2N0eDsNCisgIGludDMyX3QgZnJhbWVfbnVtOw0KKyAgaW50MzJfdCBmcmFtZV9jdXI7DQorICBGWF9CT09MIGlzRGVjb2RlcjsNCisNCisgcHJpdmF0ZToNCisgIEZYX0JPT0wgaXNTdXBwb3J0KENGWF9ESUJpdG1hcCogcERJQml0bWFwKTsNCisgIHZvaWQgU2V0UGFsZXR0ZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgdWludDE2X3QgYnBzKTsNCisgIEZYX0JPT0wgRGVjb2RlMWJwcFJHQihDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJwcywNCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcHApOw0KKyAgRlhfQk9PTCBEZWNvZGU4YnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnBzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNwcCk7DQorICBGWF9CT09MIERlY29kZTI0YnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnBzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcHApOw0KIH07DQotQ0NvZGVjX1RpZmZDb250ZXh0OjpDQ29kZWNfVGlmZkNvbnRleHQoKQ0KLXsNCi0gICAgb2Zmc2V0ID0gMDsNCi0gICAgZnJhbWVfbnVtID0gMDsNCi0gICAgZnJhbWVfY3VyID0gMDsNCi0gICAgaW8uaW4gPSBOVUxMOw0KLSAgICB0aWZfY3R4ID0gTlVMTDsNCitDQ29kZWNfVGlmZkNvbnRleHQ6OkNDb2RlY19UaWZmQ29udGV4dCgpIHsNCisgIG9mZnNldCA9IDA7DQorICBmcmFtZV9udW0gPSAwOw0KKyAgZnJhbWVfY3VyID0gMDsNCisgIGlvLmluID0gTlVMTDsNCisgIHRpZl9jdHggPSBOVUxMOw0KKyAgaWNjX2N0eCA9IE5VTEw7DQorICBpc0RlY29kZXIgPSBUUlVFOw0KK30NCitDQ29kZWNfVGlmZkNvbnRleHQ6On5DQ29kZWNfVGlmZkNvbnRleHQoKSB7DQorICBpZiAoaWNjX2N0eCkgew0KKyAgICBJY2NMaWJfRGVzdHJveVRyYW5zZm9ybShpY2NfY3R4KTsNCiAgICAgaWNjX2N0eCA9IE5VTEw7DQotICAgIGlzRGVjb2RlciA9IFRSVUU7DQorICB9DQorICBpZiAodGlmX2N0eCkgew0KKyAgICBUSUZGQ2xvc2UodGlmX2N0eCk7DQorICB9DQogfQ0KLUNDb2RlY19UaWZmQ29udGV4dDo6fkNDb2RlY19UaWZmQ29udGV4dCgpDQotew0KLSAgICBpZihpY2NfY3R4KSB7DQotICAgICAgICBJY2NMaWJfRGVzdHJveVRyYW5zZm9ybShpY2NfY3R4KTsNCi0gICAgICAgIGljY19jdHggPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKHRpZl9jdHgpCXsNCi0gICAgICAgIFRJRkZDbG9zZSh0aWZfY3R4KTsNCi0gICAgfQ0KLX0NCi1zdGF0aWMgdHNpemVfdCBfdGlmZl9yZWFkKHRoYW5kbGVfdCBjb250ZXh0LCB0ZGF0YV90IGJ1ZiwgdHNpemVfdCBsZW5ndGgpDQotew0KLSAgICBDQ29kZWNfVGlmZkNvbnRleHQqIHBUaWZmQ29udGV4dCA9IChDQ29kZWNfVGlmZkNvbnRleHQqKWNvbnRleHQ7DQotICAgIEZYX0JPT0wgcmV0ID0gRkFMU0U7DQotICAgIGlmKHBUaWZmQ29udGV4dC0+aXNEZWNvZGVyKSB7DQotICAgICAgICByZXQgPSBwVGlmZkNvbnRleHQtPmlvLmluLT5SZWFkQmxvY2soYnVmLCBwVGlmZkNvbnRleHQtPm9mZnNldCwgbGVuZ3RoKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldCA9IHBUaWZmQ29udGV4dC0+aW8ub3V0LT5SZWFkQmxvY2soYnVmLCBwVGlmZkNvbnRleHQtPm9mZnNldCwgbGVuZ3RoKTsNCi0gICAgfQ0KLSAgICBpZighcmV0KSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBwVGlmZkNvbnRleHQtPm9mZnNldCArPSAoRlhfRFdPUkQpbGVuZ3RoOw0KLSAgICByZXR1cm4gbGVuZ3RoOw0KLX0NCi1zdGF0aWMgdHNpemVfdCBfdGlmZl93cml0ZSh0aGFuZGxlX3QgY29udGV4dCwgdGRhdGFfdCBidWYsIHRzaXplX3QgbGVuZ3RoKQ0KLXsNCi0gICAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwVGlmZkNvbnRleHQgPSAoQ0NvZGVjX1RpZmZDb250ZXh0Kiljb250ZXh0Ow0KLSAgICBBU1NFUlQoIXBUaWZmQ29udGV4dC0+aXNEZWNvZGVyKTsNCi0gICAgaWYoIXBUaWZmQ29udGV4dC0+aW8ub3V0LT5Xcml0ZUJsb2NrKGJ1ZiwgcFRpZmZDb250ZXh0LT5vZmZzZXQsIGxlbmd0aCkpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIHBUaWZmQ29udGV4dC0+b2Zmc2V0ICs9IChGWF9EV09SRClsZW5ndGg7DQotICAgIHJldHVybiBsZW5ndGg7DQotfQ0KLXN0YXRpYyB0b2ZmX3QgX3RpZmZfc2Vlayh0aGFuZGxlX3QgY29udGV4dCwgdG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkNCi17DQotICAgIENDb2RlY19UaWZmQ29udGV4dCogcFRpZmZDb250ZXh0ID0gKENDb2RlY19UaWZmQ29udGV4dCopY29udGV4dDsNCi0gICAgc3dpdGNoKHdoZW5jZSkgew0KLSAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgIHBUaWZmQ29udGV4dC0+b2Zmc2V0ID0gKEZYX0RXT1JEKW9mZnNldDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICBwVGlmZkNvbnRleHQtPm9mZnNldCArPSAoRlhfRFdPUkQpb2Zmc2V0Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgIGlmKHBUaWZmQ29udGV4dC0+aXNEZWNvZGVyKSB7DQotICAgICAgICAgICAgICAgIGlmKHBUaWZmQ29udGV4dC0+aW8uaW4tPkdldFNpemUoKSA8IChGWF9GSUxFU0laRSlvZmZzZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwVGlmZkNvbnRleHQtPm9mZnNldCA9IChGWF9EV09SRCkocFRpZmZDb250ZXh0LT5pby5pbi0+R2V0U2l6ZSgpIC0gb2Zmc2V0KTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZihwVGlmZkNvbnRleHQtPmlvLm91dC0+R2V0U2l6ZSgpIDwgKEZYX0ZJTEVTSVpFKW9mZnNldCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBUaWZmQ29udGV4dC0+b2Zmc2V0ID0gKEZYX0RXT1JEKShwVGlmZkNvbnRleHQtPmlvLm91dC0+R2V0U2l6ZSgpIC0gb2Zmc2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBBU1NFUlQocFRpZmZDb250ZXh0LT5pc0RlY29kZXIgPw0KLSAgICAgICAgICAgKHBUaWZmQ29udGV4dC0+b2Zmc2V0IDw9IChGWF9EV09SRClwVGlmZkNvbnRleHQtPmlvLmluLT5HZXRTaXplKCkpIDoNCi0gICAgICAgICAgIFRSVUUpOw0KLSAgICByZXR1cm4gcFRpZmZDb250ZXh0LT5vZmZzZXQ7DQotfQ0KLXN0YXRpYyBpbnQgX3RpZmZfY2xvc2UodGhhbmRsZV90IGNvbnRleHQpDQotew0KK3N0YXRpYyB0c2l6ZV90IF90aWZmX3JlYWQodGhhbmRsZV90IGNvbnRleHQsIHRkYXRhX3QgYnVmLCB0c2l6ZV90IGxlbmd0aCkgew0KKyAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwVGlmZkNvbnRleHQgPSAoQ0NvZGVjX1RpZmZDb250ZXh0Kiljb250ZXh0Ow0KKyAgRlhfQk9PTCByZXQgPSBGQUxTRTsNCisgIGlmIChwVGlmZkNvbnRleHQtPmlzRGVjb2Rlcikgew0KKyAgICByZXQgPSBwVGlmZkNvbnRleHQtPmlvLmluLT5SZWFkQmxvY2soYnVmLCBwVGlmZkNvbnRleHQtPm9mZnNldCwgbGVuZ3RoKTsNCisgIH0gZWxzZSB7DQorICAgIHJldCA9IHBUaWZmQ29udGV4dC0+aW8ub3V0LT5SZWFkQmxvY2soYnVmLCBwVGlmZkNvbnRleHQtPm9mZnNldCwgbGVuZ3RoKTsNCisgIH0NCisgIGlmICghcmV0KSB7DQogICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcFRpZmZDb250ZXh0LT5vZmZzZXQgKz0gKEZYX0RXT1JEKWxlbmd0aDsNCisgIHJldHVybiBsZW5ndGg7DQogfQ0KLXN0YXRpYyB0b2ZmX3QgX3RpZmZfZ2V0X3NpemUodGhhbmRsZV90IGNvbnRleHQpDQotew0KLSAgICBDQ29kZWNfVGlmZkNvbnRleHQqIHBUaWZmQ29udGV4dCA9IChDQ29kZWNfVGlmZkNvbnRleHQqKWNvbnRleHQ7DQotICAgIHJldHVybiBwVGlmZkNvbnRleHQtPmlzRGVjb2RlciA/DQotICAgICAgICAgICAodG9mZl90KXBUaWZmQ29udGV4dC0+aW8uaW4tPkdldFNpemUoKSA6DQotICAgICAgICAgICAodG9mZl90KXBUaWZmQ29udGV4dC0+aW8ub3V0LT5HZXRTaXplKCk7DQotfQ0KLXN0YXRpYyBpbnQgX3RpZmZfbWFwKHRoYW5kbGVfdCBjb250ZXh0LCB0ZGF0YV90KiwgdG9mZl90KikNCi17DQorc3RhdGljIHRzaXplX3QgX3RpZmZfd3JpdGUodGhhbmRsZV90IGNvbnRleHQsIHRkYXRhX3QgYnVmLCB0c2l6ZV90IGxlbmd0aCkgew0KKyAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwVGlmZkNvbnRleHQgPSAoQ0NvZGVjX1RpZmZDb250ZXh0Kiljb250ZXh0Ow0KKyAgQVNTRVJUKCFwVGlmZkNvbnRleHQtPmlzRGVjb2Rlcik7DQorICBpZiAoIXBUaWZmQ29udGV4dC0+aW8ub3V0LT5Xcml0ZUJsb2NrKGJ1ZiwgcFRpZmZDb250ZXh0LT5vZmZzZXQsIGxlbmd0aCkpIHsNCiAgICAgcmV0dXJuIDA7DQorICB9DQorICBwVGlmZkNvbnRleHQtPm9mZnNldCArPSAoRlhfRFdPUkQpbGVuZ3RoOw0KKyAgcmV0dXJuIGxlbmd0aDsNCit9DQorc3RhdGljIHRvZmZfdCBfdGlmZl9zZWVrKHRoYW5kbGVfdCBjb250ZXh0LCB0b2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSB7DQorICBDQ29kZWNfVGlmZkNvbnRleHQqIHBUaWZmQ29udGV4dCA9IChDQ29kZWNfVGlmZkNvbnRleHQqKWNvbnRleHQ7DQorICBzd2l0Y2ggKHdoZW5jZSkgew0KKyAgICBjYXNlIDA6DQorICAgICAgcFRpZmZDb250ZXh0LT5vZmZzZXQgPSAoRlhfRFdPUkQpb2Zmc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE6DQorICAgICAgcFRpZmZDb250ZXh0LT5vZmZzZXQgKz0gKEZYX0RXT1JEKW9mZnNldDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIGlmIChwVGlmZkNvbnRleHQtPmlzRGVjb2Rlcikgew0KKyAgICAgICAgaWYgKHBUaWZmQ29udGV4dC0+aW8uaW4tPkdldFNpemUoKSA8IChGWF9GSUxFU0laRSlvZmZzZXQpIHsNCisgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFRpZmZDb250ZXh0LT5vZmZzZXQgPQ0KKyAgICAgICAgICAgIChGWF9EV09SRCkocFRpZmZDb250ZXh0LT5pby5pbi0+R2V0U2l6ZSgpIC0gb2Zmc2V0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHBUaWZmQ29udGV4dC0+aW8ub3V0LT5HZXRTaXplKCkgPCAoRlhfRklMRVNJWkUpb2Zmc2V0KSB7DQorICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgIH0NCisgICAgICAgIHBUaWZmQ29udGV4dC0+b2Zmc2V0ID0NCisgICAgICAgICAgICAoRlhfRFdPUkQpKHBUaWZmQ29udGV4dC0+aW8ub3V0LT5HZXRTaXplKCkgLSBvZmZzZXQpOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gLTE7DQorICB9DQorICBBU1NFUlQocFRpZmZDb250ZXh0LT5pc0RlY29kZXIgPyAocFRpZmZDb250ZXh0LT5vZmZzZXQgPD0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRFdPUkQpcFRpZmZDb250ZXh0LT5pby5pbi0+R2V0U2l6ZSgpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVFJVRSk7DQorICByZXR1cm4gcFRpZmZDb250ZXh0LT5vZmZzZXQ7DQorfQ0KK3N0YXRpYyBpbnQgX3RpZmZfY2xvc2UodGhhbmRsZV90IGNvbnRleHQpIHsNCisgIHJldHVybiAwOw0KK30NCitzdGF0aWMgdG9mZl90IF90aWZmX2dldF9zaXplKHRoYW5kbGVfdCBjb250ZXh0KSB7DQorICBDQ29kZWNfVGlmZkNvbnRleHQqIHBUaWZmQ29udGV4dCA9IChDQ29kZWNfVGlmZkNvbnRleHQqKWNvbnRleHQ7DQorICByZXR1cm4gcFRpZmZDb250ZXh0LT5pc0RlY29kZXIgPyAodG9mZl90KXBUaWZmQ29udGV4dC0+aW8uaW4tPkdldFNpemUoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHRvZmZfdClwVGlmZkNvbnRleHQtPmlvLm91dC0+R2V0U2l6ZSgpOw0KK30NCitzdGF0aWMgaW50IF90aWZmX21hcCh0aGFuZGxlX3QgY29udGV4dCwgdGRhdGFfdCosIHRvZmZfdCopIHsNCisgIHJldHVybiAwOw0KIH0NCiBzdGF0aWMgdm9pZCBfdGlmZl91bm1hcCh0aGFuZGxlX3QgY29udGV4dCwgdGRhdGFfdCwgdG9mZl90KSB7fQ0KLVRJRkYqIF90aWZmX29wZW4odm9pZCogY29udGV4dCwgY29uc3QgY2hhciogbW9kZSkNCi17DQotICAgIFRJRkYqIHRpZiA9IFRJRkZDbGllbnRPcGVuKCJUaWZmIEltYWdlIiwgbW9kZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoYW5kbGVfdCljb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGlmZl9yZWFkLCBfdGlmZl93cml0ZSwgX3RpZmZfc2VlaywgX3RpZmZfY2xvc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aWZmX2dldF9zaXplLCBfdGlmZl9tYXAsIF90aWZmX3VubWFwKTsNCi0gICAgaWYodGlmKQl7DQotICAgICAgICB0aWYtPnRpZl9mZCA9IChpbnQpKGludHB0cl90KWNvbnRleHQ7DQotICAgIH0NCi0gICAgcmV0dXJuIHRpZjsNCitUSUZGKiBfdGlmZl9vcGVuKHZvaWQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIG1vZGUpIHsNCisgIFRJRkYqIHRpZiA9IFRJRkZDbGllbnRPcGVuKCJUaWZmIEltYWdlIiwgbW9kZSwgKHRoYW5kbGVfdCljb250ZXh0LCBfdGlmZl9yZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RpZmZfd3JpdGUsIF90aWZmX3NlZWssIF90aWZmX2Nsb3NlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RpZmZfZ2V0X3NpemUsIF90aWZmX21hcCwgX3RpZmZfdW5tYXApOw0KKyAgaWYgKHRpZikgew0KKyAgICB0aWYtPnRpZl9mZCA9IChpbnQpKGludHB0cl90KWNvbnRleHQ7DQorICB9DQorICByZXR1cm4gdGlmOw0KIH0NCi12b2lkKiBfVElGRm1hbGxvYyh0bXNpemVfdCBzaXplKQ0KLXsNCi0gICAgcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplLCAwKTsNCit2b2lkKiBfVElGRm1hbGxvYyh0bXNpemVfdCBzaXplKSB7DQorICByZXR1cm4gRlhNRU1fRGVmYXVsdEFsbG9jKHNpemUsIDApOw0KIH0NCi12b2lkIF9USUZGZnJlZSh2b2lkKiBwdHIpDQotew0KLSAgICBGWE1FTV9EZWZhdWx0RnJlZShwdHIsIDApOw0KK3ZvaWQgX1RJRkZmcmVlKHZvaWQqIHB0cikgew0KKyAgRlhNRU1fRGVmYXVsdEZyZWUocHRyLCAwKTsNCiB9DQotdm9pZCogX1RJRkZyZWFsbG9jKHZvaWQqIHB0ciwgdG1zaXplX3Qgc2l6ZSkNCi17DQotICAgIHJldHVybiBGWE1FTV9EZWZhdWx0UmVhbGxvYyhwdHIsIHNpemUsIDApOw0KK3ZvaWQqIF9USUZGcmVhbGxvYyh2b2lkKiBwdHIsIHRtc2l6ZV90IHNpemUpIHsNCisgIHJldHVybiBGWE1FTV9EZWZhdWx0UmVhbGxvYyhwdHIsIHNpemUsIDApOw0KIH0NCi12b2lkIF9USUZGbWVtc2V0KHZvaWQqIHB0ciwgaW50IHZhbCwgdG1zaXplX3Qgc2l6ZSkNCi17DQotICAgIEZYU1lTX21lbXNldChwdHIsIHZhbCwgKHNpemVfdClzaXplKTsNCit2b2lkIF9USUZGbWVtc2V0KHZvaWQqIHB0ciwgaW50IHZhbCwgdG1zaXplX3Qgc2l6ZSkgew0KKyAgRlhTWVNfbWVtc2V0KHB0ciwgdmFsLCAoc2l6ZV90KXNpemUpOw0KIH0NCi12b2lkIF9USUZGbWVtY3B5KHZvaWQqIGRlcywgY29uc3Qgdm9pZCogc3JjLCB0bXNpemVfdCBzaXplKQ0KLXsNCi0gICAgRlhTWVNfbWVtY3B5KGRlcywgc3JjLCAoc2l6ZV90KXNpemUpOw0KK3ZvaWQgX1RJRkZtZW1jcHkodm9pZCogZGVzLCBjb25zdCB2b2lkKiBzcmMsIHRtc2l6ZV90IHNpemUpIHsNCisgIEZYU1lTX21lbWNweShkZXMsIHNyYywgKHNpemVfdClzaXplKTsNCiB9DQotaW50IF9USUZGbWVtY21wKGNvbnN0IHZvaWQqIHB0cjEsIGNvbnN0IHZvaWQqIHB0cjIsIHRtc2l6ZV90IHNpemUpDQotew0KLSAgICByZXR1cm4gRlhTWVNfbWVtY21wKHB0cjEsIHB0cjIsIChzaXplX3Qpc2l6ZSk7DQoraW50IF9USUZGbWVtY21wKGNvbnN0IHZvaWQqIHB0cjEsIGNvbnN0IHZvaWQqIHB0cjIsIHRtc2l6ZV90IHNpemUpIHsNCisgIHJldHVybiBGWFNZU19tZW1jbXAocHRyMSwgcHRyMiwgKHNpemVfdClzaXplKTsNCiB9DQotc3RhdGljIHZvaWQgX3RpZmZfd2FybmluZ19leHQodGhhbmRsZV90IGNvbnRleHQsIGNvbnN0IGNoYXIqIG1vZHVsZSwgY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFwKQ0KLXsNCi0gICAgaWYobW9kdWxlICE9IE5VTEwpIHsNCi0gICAgfQ0KK3N0YXRpYyB2b2lkIF90aWZmX3dhcm5pbmdfZXh0KHRoYW5kbGVfdCBjb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmbXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcCkgew0KKyAgaWYgKG1vZHVsZSAhPSBOVUxMKSB7DQorICB9DQogfQ0KIFRJRkZFcnJvckhhbmRsZXJFeHQgX1RJRkZ3YXJuaW5nSGFuZGxlckV4dCA9IF90aWZmX3dhcm5pbmdfZXh0Ow0KLXN0YXRpYyB2b2lkIF90aWZmX2Vycm9yX2V4dCh0aGFuZGxlX3QgY29udGV4dCwgY29uc3QgY2hhciogbW9kdWxlLCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXApDQotew0KLSAgICBpZihtb2R1bGUgIT0gTlVMTCkgew0KLSAgICB9DQorc3RhdGljIHZvaWQgX3RpZmZfZXJyb3JfZXh0KHRoYW5kbGVfdCBjb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZtdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcCkgew0KKyAgaWYgKG1vZHVsZSAhPSBOVUxMKSB7DQorICB9DQogfQ0KIFRJRkZFcnJvckhhbmRsZXJFeHQgX1RJRkZlcnJvckhhbmRsZXJFeHQgPSBfdGlmZl9lcnJvcl9leHQ7DQotaW50IFRJRkZDbXlrMlJnYih0aGFuZGxlX3QgY29udGV4dCwgdWludDggYywgdWludDggbSwgdWludDggeSwgdWludDggaywgdWludDgqIHIsIHVpbnQ4KiBnLCB1aW50OCogYikNCi17DQotICAgIGlmKGNvbnRleHQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwID0gKENDb2RlY19UaWZmQ29udGV4dCopY29udGV4dDsNCi0gICAgaWYocC0+aWNjX2N0eCkgew0KLSAgICAgICAgdW5zaWduZWQgY2hhciBjbXlrWzRdLCBiZ3JbM107DQotICAgICAgICBjbXlrWzBdID0gYywgY215a1sxXSA9IG0sIGNteWtbMl0gPSB5LCBjbXlrWzNdID0gazsNCi0gICAgICAgIEljY0xpYl9UcmFuc2xhdGVJbWFnZShwLT5pY2NfY3R4LCBiZ3IsIGNteWssIDEpOw0KLSAgICAgICAgKnIgPSBiZ3JbMl0sICpnID0gYmdyWzFdLCAqYiA9IGJnclswXTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShjLCBtLCB5LCBrLCAqciwgKmcsICpiKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gMTsNCitpbnQgVElGRkNteWsyUmdiKHRoYW5kbGVfdCBjb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgdWludDggYywNCisgICAgICAgICAgICAgICAgIHVpbnQ4IG0sDQorICAgICAgICAgICAgICAgICB1aW50OCB5LA0KKyAgICAgICAgICAgICAgICAgdWludDggaywNCisgICAgICAgICAgICAgICAgIHVpbnQ4KiByLA0KKyAgICAgICAgICAgICAgICAgdWludDgqIGcsDQorICAgICAgICAgICAgICAgICB1aW50OCogYikgew0KKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENDb2RlY19UaWZmQ29udGV4dCogcCA9IChDQ29kZWNfVGlmZkNvbnRleHQqKWNvbnRleHQ7DQorICBpZiAocC0+aWNjX2N0eCkgew0KKyAgICB1bnNpZ25lZCBjaGFyIGNteWtbNF0sIGJnclszXTsNCisgICAgY215a1swXSA9IGMsIGNteWtbMV0gPSBtLCBjbXlrWzJdID0geSwgY215a1szXSA9IGs7DQorICAgIEljY0xpYl9UcmFuc2xhdGVJbWFnZShwLT5pY2NfY3R4LCBiZ3IsIGNteWssIDEpOw0KKyAgICAqciA9IGJnclsyXSwgKmcgPSBiZ3JbMV0sICpiID0gYmdyWzBdOw0KKyAgfSBlbHNlIHsNCisgICAgQWRvYmVDTVlLX3RvX3NSR0IxKGMsIG0sIHksIGssICpyLCAqZywgKmIpOw0KKyAgfQ0KKyAgcmV0dXJuIDE7DQogfQ0KLUZYX0JPT0wgQ0NvZGVjX1RpZmZDb250ZXh0OjpJbml0RGVjb2RlcihJRlhfRmlsZVJlYWQqIGZpbGVfcHRyKQ0KLXsNCi0gICAgaW8uaW4gPSBmaWxlX3B0cjsNCi0gICAgdGlmX2N0eCA9IF90aWZmX29wZW4odGhpcywgInIiKTsNCi0gICAgaWYodGlmX2N0eCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDQ29kZWNfVGlmZkNvbnRleHQ6OkluaXREZWNvZGVyKElGWF9GaWxlUmVhZCogZmlsZV9wdHIpIHsNCisgIGlvLmluID0gZmlsZV9wdHI7DQorICB0aWZfY3R4ID0gX3RpZmZfb3Blbih0aGlzLCAiciIpOw0KKyAgaWYgKHRpZl9jdHggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDQ29kZWNfVGlmZkNvbnRleHQ6OkdldEZyYW1lcyhpbnQzMl90JiBmcmFtZXMpDQotew0KLSAgICBmcmFtZXMgPSBmcmFtZV9udW0gPSBUSUZGTnVtYmVyT2ZEaXJlY3Rvcmllcyh0aWZfY3R4KTsNCit2b2lkIENDb2RlY19UaWZmQ29udGV4dDo6R2V0RnJhbWVzKGludDMyX3QmIGZyYW1lcykgew0KKyAgZnJhbWVzID0gZnJhbWVfbnVtID0gVElGRk51bWJlck9mRGlyZWN0b3JpZXModGlmX2N0eCk7DQogfQ0KLSNkZWZpbmUgVElGRl9FWElGX0dFVElORk8oa2V5LCBULCB0YWcpIHtcDQotICAgICAgICBUIHZhbCA9IChUKTA7XA0KLSAgICAgICAgVElGRkdldEZpZWxkKHRpZl9jdHgsdGFnLCZ2YWwpO1wNCi0gICAgICAgIGlmICh2YWwpIHtcDQotICAgICAgICAgICAgKGtleSkgPSBGWF9BbGxvYyh1aW50OF90LHNpemVvZihUKSk7XA0KLSAgICAgICAgICAgIGlmICgoa2V5KSkge1wNCi0gICAgICAgICAgICAgICAgVCogcHRyID0gKFQqKShrZXkpO1wNCi0gICAgICAgICAgICAgICAgKnB0ciA9IHZhbDtcDQotICAgICAgICAgICAgICAgIHBFeGlmLT5tX1RhZ1ZhbC5TZXRBdCh0YWcsKGtleSkpO319fVwNCi0gICAgKGtleSkgPSBOVUxMOw0KLSNkZWZpbmUgVElGRl9FWElGX0dFVFNUUklOR0lORk8oa2V5LCB0YWcpIHtcDQotICAgICAgICBGWF9EV09SRCBzaXplID0gMDtcDQotICAgICAgICB1aW50OF90KiBidWYgPSBOVUxMO1wNCi0gICAgICAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LHRhZywmc2l6ZSwgJmJ1Zik7XA0KLSAgICAgICAgaWYgKHNpemUgJiYgYnVmKSB7XA0KLSAgICAgICAgICAgIChrZXkpID0gRlhfQWxsb2ModWludDhfdCxzaXplKTtcDQotICAgICAgICAgICAgaWYgKChrZXkpKSB7XA0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkoKGtleSksYnVmLHNpemUpO1wNCi0gICAgICAgICAgICAgICAgcEV4aWYtPm1fVGFnVmFsLlNldEF0KHRhZywoa2V5KSk7fX19XA0KLSAgICAoa2V5KSA9IE5VTEw7DQorI2RlZmluZSBUSUZGX0VYSUZfR0VUSU5GTyhrZXksIFQsIHRhZykgICAgICBcDQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIFQgdmFsID0gKFQpMDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCB0YWcsICZ2YWwpOyAgICAgICBcDQorICAgIGlmICh2YWwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgKGtleSkgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoVCkpOyBcDQorICAgICAgaWYgKChrZXkpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgICBUKiBwdHIgPSAoVCopKGtleSk7ICAgICAgICAgICAgICAgICBcDQorICAgICAgICAqcHRyID0gdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgICBwRXhpZi0+bV9UYWdWYWwuU2V0QXQodGFnLCAoa2V5KSk7ICBcDQorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAoa2V5KSA9IE5VTEw7DQorI2RlZmluZSBUSUZGX0VYSUZfR0VUU1RSSU5HSU5GTyhrZXksIHRhZykgICAgXA0KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgRlhfRFdPUkQgc2l6ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIHVpbnQ4X3QqIGJ1ZiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgdGFnLCAmc2l6ZSwgJmJ1Zik7IFwNCisgICAgaWYgKHNpemUgJiYgYnVmKSB7ICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgKGtleSkgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsgICAgICAgXA0KKyAgICAgIGlmICgoa2V5KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICAgIEZYU1lTX21lbWNweSgoa2V5KSwgYnVmLCBzaXplKTsgICAgICBcDQorICAgICAgICBwRXhpZi0+bV9UYWdWYWwuU2V0QXQodGFnLCAoa2V5KSk7ICAgXA0KKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgKGtleSkgPSBOVUxMOw0KIHRlbXBsYXRlIDxjbGFzcyBUPg0KLXN0YXRpYyBGWF9CT09MIFRpZmZfRXhpZl9HZXRJbmZvKFRJRkYqIHRpZl9jdHgsIHR0YWdfdCB0YWcsIENGWF9ESUJBdHRyaWJ1dGVFeGlmKiBwRXhpZikNCi17DQotICAgIHVpbnQ4X3QqIGtleSA9IE5VTEw7DQotICAgIFQgdmFsID0gKFQpMDsNCi0gICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIHRhZywgJnZhbCk7DQotICAgIGlmICh2YWwpIHsNCi0gICAgICAgIChrZXkpID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKFQpKTsNCi0gICAgICAgIGlmICgoa2V5KSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgVCogcHRyID0gKFQqKShrZXkpOw0KLSAgICAgICAgKnB0ciA9IHZhbDsNCi0gICAgICAgIHBFeGlmLT5tX1RhZ1ZhbC5TZXRBdCh0YWcsIChrZXkpKTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KK3N0YXRpYyBGWF9CT09MIFRpZmZfRXhpZl9HZXRJbmZvKFRJRkYqIHRpZl9jdHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRhZ190IHRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlRXhpZiogcEV4aWYpIHsNCisgIHVpbnQ4X3QqIGtleSA9IE5VTEw7DQorICBUIHZhbCA9IChUKTA7DQorICBUSUZGR2V0RmllbGQodGlmX2N0eCwgdGFnLCAmdmFsKTsNCisgIGlmICh2YWwpIHsNCisgICAgKGtleSkgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoVCkpOw0KKyAgICBpZiAoKGtleSkgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLXN0YXRpYyB2b2lkIFRpZmZfRXhpZl9HZXRTdHJpbmdJbmZvKFRJRkYqIHRpZl9jdHgsIHR0YWdfdCB0YWcsIENGWF9ESUJBdHRyaWJ1dGVFeGlmKiBwRXhpZikNCi17DQotICAgIEZYX0NIQVIqIGJ1ZiA9IE5VTEw7DQotICAgIHVpbnQ4X3QqIGtleSA9IE5VTEw7DQotICAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCB0YWcsICZidWYpOw0KLSAgICBpZiAoYnVmKSB7DQotICAgICAgICBpbnQzMl90IHNpemUgPSAoaW50MzJfdClGWFNZU19zdHJsZW4oYnVmKTsNCi0gICAgICAgIChrZXkpID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSArIDEpOw0KLSAgICAgICAgaWYgKChrZXkpID09IE5VTEwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBGWFNZU19tZW1jcHkoKGtleSksIGJ1Ziwgc2l6ZSk7DQotICAgICAgICBrZXlbc2l6ZV0gPSAwOw0KLSAgICAgICAgcEV4aWYtPm1fVGFnVmFsLlNldEF0KHRhZywgKGtleSkpOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ0NvZGVjX1RpZmZDb250ZXh0OjpMb2FkRnJhbWVJbmZvKGludDMyX3QgZnJhbWUsIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIGNvbXBzLCBGWF9EV09SRCYgYnBjLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKCFUSUZGU2V0RGlyZWN0b3J5KHRpZl9jdHgsICh1aW50MTYpZnJhbWUpKQl7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRlhfV09SRCB0aWZfY3M7DQotICAgIEZYX0RXT1JEIHRpZl9pY2Nfc2l6ZSA9IDA7DQotICAgIHVpbnQ4X3QqIHRpZl9pY2NfYnVmID0gTlVMTDsNCi0gICAgRlhfV09SRCB0aWZfYnBjID0gMDsNCi0gICAgRlhfV09SRCB0aWZfY3BzOw0KLSAgICBGWF9EV09SRCB0aWZfcnBzOw0KLSAgICB3aWR0aCA9IGhlaWdodCA9IGNvbXBzID0gMDsNCi0gICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSU1BR0VXSURUSCwgJndpZHRoKTsNCi0gICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSU1BR0VMRU5HVEgsICZoZWlnaHQpOw0KLSAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19TQU1QTEVTUEVSUElYRUwsICZjb21wcyk7DQotICAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX0JJVFNQRVJTQU1QTEUsICZ0aWZfYnBjKTsNCi0gICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfUEhPVE9NRVRSSUMsICZ0aWZfY3MpOw0KLSAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19DT01QUkVTU0lPTiwgJnRpZl9jcHMpOw0KLSAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19ST1dTUEVSU1RSSVAsICZ0aWZfcnBzKTsNCi0gICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSUNDUFJPRklMRSwgJnRpZl9pY2Nfc2l6ZSwgJnRpZl9pY2NfYnVmKTsNCi0gICAgaWYgKHBBdHRyaWJ1dGUpIHsNCi0gICAgICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQgPSBGWENPREVDX1JFU1VOSVRfSU5DSDsNCi0gICAgICAgIGlmIChUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19SRVNPTFVUSU9OVU5JVCwgJnBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQpKSB7DQotICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV93RFBJVW5pdCAtPSAxOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZUV4aWYqIHBFeGlmID0gKENGWF9ESUJBdHRyaWJ1dGVFeGlmKilwQXR0cmlidXRlLT5tX3BFeGlmOw0KLSAgICAgICAgcEV4aWYtPmNsZWFyKCk7DQotICAgICAgICBUaWZmX0V4aWZfR2V0SW5mbzxGWF9XT1JEPih0aWZfY3R4LCBUSUZGVEFHX09SSUVOVEFUSU9OLCBwRXhpZik7DQotICAgICAgICBpZiAoVGlmZl9FeGlmX0dldEluZm88RlhfRkxPQVQ+KHRpZl9jdHgsIFRJRkZUQUdfWFJFU09MVVRJT04sIHBFeGlmKSkgew0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZEcGkgPSAwOw0KLSAgICAgICAgICAgIHBFeGlmLT5HZXRJbmZvKFRJRkZUQUdfWFJFU09MVVRJT04sICZmRHBpKTsNCi0gICAgICAgICAgICBwQXR0cmlidXRlLT5tX25YRFBJID0gKGludDMyX3QpKGZEcGkgKyAwLjVmKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChUaWZmX0V4aWZfR2V0SW5mbzxGWF9GTE9BVD4odGlmX2N0eCwgVElGRlRBR19ZUkVTT0xVVElPTiwgcEV4aWYpKSB7DQotICAgICAgICAgICAgRlhfRkxPQVQgZkRwaSA9IDA7DQotICAgICAgICAgICAgcEV4aWYtPkdldEluZm8oVElGRlRBR19ZUkVTT0xVVElPTiwgJmZEcGkpOw0KLSAgICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fbllEUEkgPSAoaW50MzJfdCkoZkRwaSArIDAuNWYpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgVGlmZl9FeGlmX0dldFN0cmluZ0luZm8odGlmX2N0eCwgVElGRlRBR19JTUFHRURFU0NSSVBUSU9OLCBwRXhpZik7DQotICAgICAgICBUaWZmX0V4aWZfR2V0U3RyaW5nSW5mbyh0aWZfY3R4LCBUSUZGVEFHX01BS0UsIHBFeGlmKTsNCi0gICAgICAgIFRpZmZfRXhpZl9HZXRTdHJpbmdJbmZvKHRpZl9jdHgsIFRJRkZUQUdfTU9ERUwsIHBFeGlmKTsNCi0gICAgfQ0KLSAgICBicGMgPSB0aWZfYnBjOw0KLSAgICBpZih0aWZfcnBzID4gaGVpZ2h0KSB7DQotICAgICAgICBUSUZGU2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19ST1dTUEVSU1RSSVAsIHRpZl9ycHMgPSBoZWlnaHQpOw0KLSAgICB9DQorICAgIFQqIHB0ciA9IChUKikoa2V5KTsNCisgICAgKnB0ciA9IHZhbDsNCisgICAgcEV4aWYtPm1fVGFnVmFsLlNldEF0KHRhZywgKGtleSkpOw0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotdm9pZCBfVGlmZkJHUkEyUkdCQSh1aW50OF90KiBwQnVmLCBpbnQzMl90IHBpeGVsLCBpbnQzMl90IHNwcCkNCi17DQotICAgIHJlZ2lzdGVyIHVpbnQ4X3QgdG1wOw0KLSAgICBmb3IgKGludDMyX3QgbiA9IDA7IG4gPCBwaXhlbDsgbisrKSB7DQotICAgICAgICB0bXAgPSBwQnVmWzBdOw0KLSAgICAgICAgcEJ1ZlswXSA9IHBCdWZbMl07DQotICAgICAgICBwQnVmWzJdID0gdG1wOw0KLSAgICAgICAgcEJ1ZiArPSBzcHA7DQorc3RhdGljIHZvaWQgVGlmZl9FeGlmX0dldFN0cmluZ0luZm8oVElGRiogdGlmX2N0eCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGFnX3QgdGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGVFeGlmKiBwRXhpZikgew0KKyAgRlhfQ0hBUiogYnVmID0gTlVMTDsNCisgIHVpbnQ4X3QqIGtleSA9IE5VTEw7DQorICBUSUZGR2V0RmllbGQodGlmX2N0eCwgdGFnLCAmYnVmKTsNCisgIGlmIChidWYpIHsNCisgICAgaW50MzJfdCBzaXplID0gKGludDMyX3QpRlhTWVNfc3RybGVuKGJ1Zik7DQorICAgIChrZXkpID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSArIDEpOw0KKyAgICBpZiAoKGtleSkgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KKyAgICBGWFNZU19tZW1jcHkoKGtleSksIGJ1Ziwgc2l6ZSk7DQorICAgIGtleVtzaXplXSA9IDA7DQorICAgIHBFeGlmLT5tX1RhZ1ZhbC5TZXRBdCh0YWcsIChrZXkpKTsNCisgIH0NCiB9DQotRlhfQk9PTCBDQ29kZWNfVGlmZkNvbnRleHQ6OmlzU3VwcG9ydChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCkNCi17DQotICAgIGlmIChUSUZGSXNUaWxlZCh0aWZfY3R4KSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ0NvZGVjX1RpZmZDb250ZXh0OjpMb2FkRnJhbWVJbmZvKGludDMyX3QgZnJhbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvbXBzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBicGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgew0KKyAgaWYgKCFUSUZGU2V0RGlyZWN0b3J5KHRpZl9jdHgsICh1aW50MTYpZnJhbWUpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX1dPUkQgdGlmX2NzOw0KKyAgRlhfRFdPUkQgdGlmX2ljY19zaXplID0gMDsNCisgIHVpbnQ4X3QqIHRpZl9pY2NfYnVmID0gTlVMTDsNCisgIEZYX1dPUkQgdGlmX2JwYyA9IDA7DQorICBGWF9XT1JEIHRpZl9jcHM7DQorICBGWF9EV09SRCB0aWZfcnBzOw0KKyAgd2lkdGggPSBoZWlnaHQgPSBjb21wcyA9IDA7DQorICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19JTUFHRVdJRFRILCAmd2lkdGgpOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSU1BR0VMRU5HVEgsICZoZWlnaHQpOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLCAmY29tcHMpOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfQklUU1BFUlNBTVBMRSwgJnRpZl9icGMpOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfUEhPVE9NRVRSSUMsICZ0aWZfY3MpOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfQ09NUFJFU1NJT04sICZ0aWZfY3BzKTsNCisgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX1JPV1NQRVJTVFJJUCwgJnRpZl9ycHMpOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSUNDUFJPRklMRSwgJnRpZl9pY2Nfc2l6ZSwgJnRpZl9pY2NfYnVmKTsNCisgIGlmIChwQXR0cmlidXRlKSB7DQorICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQgPSBGWENPREVDX1JFU1VOSVRfSU5DSDsNCisgICAgaWYgKFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX1JFU09MVVRJT05VTklULA0KKyAgICAgICAgICAgICAgICAgICAgICZwQXR0cmlidXRlLT5tX3dEUElVbml0KSkgew0KKyAgICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQgLT0gMTsNCiAgICAgfQ0KLSAgICB1aW50MTZfdCBwaG90b21ldHJpYzsNCi0gICAgaWYgKCFUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19QSE9UT01FVFJJQywgJnBob3RvbWV0cmljKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICBDRlhfRElCQXR0cmlidXRlRXhpZiogcEV4aWYgPSAoQ0ZYX0RJQkF0dHJpYnV0ZUV4aWYqKXBBdHRyaWJ1dGUtPm1fcEV4aWY7DQorICAgIHBFeGlmLT5jbGVhcigpOw0KKyAgICBUaWZmX0V4aWZfR2V0SW5mbzxGWF9XT1JEPih0aWZfY3R4LCBUSUZGVEFHX09SSUVOVEFUSU9OLCBwRXhpZik7DQorICAgIGlmIChUaWZmX0V4aWZfR2V0SW5mbzxGWF9GTE9BVD4odGlmX2N0eCwgVElGRlRBR19YUkVTT0xVVElPTiwgcEV4aWYpKSB7DQorICAgICAgRlhfRkxPQVQgZkRwaSA9IDA7DQorICAgICAgcEV4aWYtPkdldEluZm8oVElGRlRBR19YUkVTT0xVVElPTiwgJmZEcGkpOw0KKyAgICAgIHBBdHRyaWJ1dGUtPm1fblhEUEkgPSAoaW50MzJfdCkoZkRwaSArIDAuNWYpOw0KICAgICB9DQotICAgIHN3aXRjaCAocERJQml0bWFwLT5HZXRCUFAoKSkgew0KLSAgICAgICAgY2FzZSAxOg0KKyAgICBpZiAoVGlmZl9FeGlmX0dldEluZm88RlhfRkxPQVQ+KHRpZl9jdHgsIFRJRkZUQUdfWVJFU09MVVRJT04sIHBFeGlmKSkgew0KKyAgICAgIEZYX0ZMT0FUIGZEcGkgPSAwOw0KKyAgICAgIHBFeGlmLT5HZXRJbmZvKFRJRkZUQUdfWVJFU09MVVRJT04sICZmRHBpKTsNCisgICAgICBwQXR0cmlidXRlLT5tX25ZRFBJID0gKGludDMyX3QpKGZEcGkgKyAwLjVmKTsNCisgICAgfQ0KKyAgICBUaWZmX0V4aWZfR2V0U3RyaW5nSW5mbyh0aWZfY3R4LCBUSUZGVEFHX0lNQUdFREVTQ1JJUFRJT04sIHBFeGlmKTsNCisgICAgVGlmZl9FeGlmX0dldFN0cmluZ0luZm8odGlmX2N0eCwgVElGRlRBR19NQUtFLCBwRXhpZik7DQorICAgIFRpZmZfRXhpZl9HZXRTdHJpbmdJbmZvKHRpZl9jdHgsIFRJRkZUQUdfTU9ERUwsIHBFeGlmKTsNCisgIH0NCisgIGJwYyA9IHRpZl9icGM7DQorICBpZiAodGlmX3JwcyA+IGhlaWdodCkgew0KKyAgICBUSUZGU2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19ST1dTUEVSU1RSSVAsIHRpZl9ycHMgPSBoZWlnaHQpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgX1RpZmZCR1JBMlJHQkEodWludDhfdCogcEJ1ZiwgaW50MzJfdCBwaXhlbCwgaW50MzJfdCBzcHApIHsNCisgIHJlZ2lzdGVyIHVpbnQ4X3QgdG1wOw0KKyAgZm9yIChpbnQzMl90IG4gPSAwOyBuIDwgcGl4ZWw7IG4rKykgew0KKyAgICB0bXAgPSBwQnVmWzBdOw0KKyAgICBwQnVmWzBdID0gcEJ1ZlsyXTsNCisgICAgcEJ1ZlsyXSA9IHRtcDsNCisgICAgcEJ1ZiArPSBzcHA7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0NvZGVjX1RpZmZDb250ZXh0Ojppc1N1cHBvcnQoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApIHsNCisgIGlmIChUSUZGSXNUaWxlZCh0aWZfY3R4KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB1aW50MTZfdCBwaG90b21ldHJpYzsNCisgIGlmICghVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfUEhPVE9NRVRSSUMsICZwaG90b21ldHJpYykpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgc3dpdGNoIChwRElCaXRtYXAtPkdldEJQUCgpKSB7DQorICAgIGNhc2UgMToNCisgICAgY2FzZSA4Og0KKyAgICAgIGlmIChwaG90b21ldHJpYyAhPSBQSE9UT01FVFJJQ19QQUxFVFRFKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDI0Og0KKyAgICAgIGlmIChwaG90b21ldHJpYyAhPSBQSE9UT01FVFJJQ19SR0IpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdWludDE2X3QgcGxhbmFyY29uZmlnOw0KKyAgaWYgKCFUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmX2N0eCwgVElGRlRBR19QTEFOQVJDT05GSUcsICZwbGFuYXJjb25maWcpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENDb2RlY19UaWZmQ29udGV4dDo6U2V0UGFsZXR0ZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgdWludDE2X3QgYnBzKSB7DQorICB1aW50MTZfdCAqcmVkX29yaWcsICpncmVlbl9vcmlnLCAqYmx1ZV9vcmlnOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfQ09MT1JNQVAsICZyZWRfb3JpZywgJmdyZWVuX29yaWcsICZibHVlX29yaWcpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAoMUwgPDwgYnBzKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorI2RlZmluZSBDVlQoeCkgKCh1aW50MTZfdCkoKHgpID4+IDgpKQ0KKyAgICByZWRfb3JpZ1tpXSA9IENWVChyZWRfb3JpZ1tpXSk7DQorICAgIGdyZWVuX29yaWdbaV0gPSBDVlQoZ3JlZW5fb3JpZ1tpXSk7DQorICAgIGJsdWVfb3JpZ1tpXSA9IENWVChibHVlX29yaWdbaV0pOw0KKyN1bmRlZiBDVlQNCisgIH0NCisgIGludDMyX3QgbGVuID0gMSA8PCBicHM7DQorICBmb3IgKGludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgaW5kZXgrKykgew0KKyAgICBGWF9EV09SRCByID0gcmVkX29yaWdbaW5kZXhdICYgMHhGRjsNCisgICAgRlhfRFdPUkQgZyA9IGdyZWVuX29yaWdbaW5kZXhdICYgMHhGRjsNCisgICAgRlhfRFdPUkQgYiA9IGJsdWVfb3JpZ1tpbmRleF0gJiAweEZGOw0KKyAgICBGWF9EV09SRCBjb2xvciA9ICh1aW50MzJfdCliIHwgKCh1aW50MzJfdClnIDw8IDgpIHwgKCh1aW50MzJfdClyIDw8IDE2KSB8DQorICAgICAgICAgICAgICAgICAgICAgKCgodWludDMyKTB4ZmZMKSA8PCAyNCk7DQorICAgIHBESUJpdG1hcC0+U2V0UGFsZXR0ZUVudHJ5KGluZGV4LCBjb2xvcik7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0NvZGVjX1RpZmZDb250ZXh0OjpEZWNvZGUxYnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnBzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNwcCkgew0KKyAgaWYgKHBESUJpdG1hcC0+R2V0QlBQKCkgIT0gMSB8fCBzcHAgIT0gMSB8fCBicHMgIT0gMSB8fA0KKyAgICAgICFpc1N1cHBvcnQocERJQml0bWFwKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBTZXRQYWxldHRlKHBESUJpdG1hcCwgYnBzKTsNCisgIGludDMyX3Qgc2l6ZSA9IChpbnQzMl90KVRJRkZTY2FubGluZVNpemUodGlmX2N0eCk7DQorICB1aW50OF90KiBidWYgPSAodWludDhfdCopX1RJRkZtYWxsb2Moc2l6ZSk7DQorICBpZiAoYnVmID09IE5VTEwpIHsNCisgICAgVElGRkVycm9yKFRJRkZGaWxlTmFtZSh0aWZfY3R4KSwgIk5vIHNwYWNlIGZvciBzY2FubGluZSBidWZmZXIiKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdWludDhfdCogYml0TWFwYnVmZmVyID0gKHVpbnQ4X3QqKXBESUJpdG1hcC0+R2V0QnVmZmVyKCk7DQorICBGWF9EV09SRCBwaXRjaCA9IHBESUJpdG1hcC0+R2V0UGl0Y2goKTsNCisgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7DQorICAgIFRJRkZSZWFkU2NhbmxpbmUodGlmX2N0eCwgYnVmLCByb3csIDApOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBzaXplOyBqKyspIHsNCisgICAgICBiaXRNYXBidWZmZXJbcm93ICogcGl0Y2ggKyBqXSA9IGJ1ZltqXTsNCisgICAgfQ0KKyAgfQ0KKyAgX1RJRkZmcmVlKGJ1Zik7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQ29kZWNfVGlmZkNvbnRleHQ6OkRlY29kZThicHBSR0IoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBicHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3BwKSB7DQorICBpZiAocERJQml0bWFwLT5HZXRCUFAoKSAhPSA4IHx8IHNwcCAhPSAxIHx8IChicHMgIT0gNCAmJiBicHMgIT0gOCkgfHwNCisgICAgICAhaXNTdXBwb3J0KHBESUJpdG1hcCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgU2V0UGFsZXR0ZShwRElCaXRtYXAsIGJwcyk7DQorICBpbnQzMl90IHNpemUgPSAoaW50MzJfdClUSUZGU2NhbmxpbmVTaXplKHRpZl9jdHgpOw0KKyAgdWludDhfdCogYnVmID0gKHVpbnQ4X3QqKV9USUZGbWFsbG9jKHNpemUpOw0KKyAgaWYgKGJ1ZiA9PSBOVUxMKSB7DQorICAgIFRJRkZFcnJvcihUSUZGRmlsZU5hbWUodGlmX2N0eCksICJObyBzcGFjZSBmb3Igc2NhbmxpbmUgYnVmZmVyIik7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHVpbnQ4X3QqIGJpdE1hcGJ1ZmZlciA9ICh1aW50OF90KilwRElCaXRtYXAtPkdldEJ1ZmZlcigpOw0KKyAgRlhfRFdPUkQgcGl0Y2ggPSBwRElCaXRtYXAtPkdldFBpdGNoKCk7DQorICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgew0KKyAgICBUSUZGUmVhZFNjYW5saW5lKHRpZl9jdHgsIGJ1Ziwgcm93LCAwKTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7DQorICAgICAgc3dpdGNoIChicHMpIHsNCisgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgYml0TWFwYnVmZmVyW3JvdyAqIHBpdGNoICsgMiAqIGogKyAwXSA9IChidWZbal0gJiAweEYwKSA+PiA0Ow0KKyAgICAgICAgICBiaXRNYXBidWZmZXJbcm93ICogcGl0Y2ggKyAyICogaiArIDFdID0gKGJ1ZltqXSAmIDB4MEYpID4+IDA7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgY2FzZSA4Og0KLSAgICAgICAgICAgIGlmIChwaG90b21ldHJpYyAhPSBQSE9UT01FVFJJQ19QQUxFVFRFKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDI0Og0KLSAgICAgICAgICAgIGlmIChwaG90b21ldHJpYyAhPSBQSE9UT01FVFJJQ19SR0IpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICBiaXRNYXBidWZmZXJbcm93ICogcGl0Y2ggKyBqXSA9IGJ1ZltqXTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KICAgICB9DQotICAgIHVpbnQxNl90IHBsYW5hcmNvbmZpZzsNCi0gICAgaWYgKCFUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmX2N0eCwgVElGRlRBR19QTEFOQVJDT05GSUcsICZwbGFuYXJjb25maWcpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKHBsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIF9USUZGZnJlZShidWYpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ0NvZGVjX1RpZmZDb250ZXh0OjpTZXRQYWxldHRlKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCB1aW50MTZfdCBicHMpDQotew0KLSAgICB1aW50MTZfdCAqcmVkX29yaWcsICpncmVlbl9vcmlnLCAqYmx1ZV9vcmlnOw0KLSAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19DT0xPUk1BUCwgJnJlZF9vcmlnLCAmZ3JlZW5fb3JpZywgJmJsdWVfb3JpZyk7DQotICAgIGZvciAoaW50MzJfdCBpID0gKDFMIDw8IGJwcykgLSAxOyBpID49IDA7IGktLSkgew0KLSNkZWZpbmUJQ1ZUKHgpCQkoKHVpbnQxNl90KSgoeCk+PjgpKQ0KLSAgICAgICAgcmVkX29yaWdbaV0gPSBDVlQocmVkX29yaWdbaV0pOw0KLSAgICAgICAgZ3JlZW5fb3JpZ1tpXSA9IENWVChncmVlbl9vcmlnW2ldKTsNCi0gICAgICAgIGJsdWVfb3JpZ1tpXSA9IENWVChibHVlX29yaWdbaV0pOw0KLSN1bmRlZglDVlQNCi0gICAgfQ0KLSAgICBpbnQzMl90IGxlbiA9IDEgPDwgYnBzOw0KLSAgICBmb3IoaW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgbGVuOyBpbmRleCsrKSB7DQotICAgICAgICBGWF9EV09SRCByID0gcmVkX29yaWdbaW5kZXhdICYgMHhGRjsNCi0gICAgICAgIEZYX0RXT1JEIGcgPSBncmVlbl9vcmlnW2luZGV4XSAmIDB4RkY7DQotICAgICAgICBGWF9EV09SRCBiID0gYmx1ZV9vcmlnW2luZGV4XSAmIDB4RkY7DQotICAgICAgICBGWF9EV09SRCBjb2xvciA9ICh1aW50MzJfdCliIHwgKCh1aW50MzJfdClnIDw8IDgpIHwgKCh1aW50MzJfdClyIDw8IDE2KSB8ICgoKHVpbnQzMikweGZmTCkgPDwgMjQpOw0KLSAgICAgICAgcERJQml0bWFwLT5TZXRQYWxldHRlRW50cnkoaW5kZXgsIGNvbG9yKTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENDb2RlY19UaWZmQ29udGV4dDo6RGVjb2RlMWJwcFJHQihDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgd2lkdGgsIHVpbnQxNl90IGJwcywgdWludDE2X3Qgc3BwKQ0KLXsNCi0gICAgaWYgKHBESUJpdG1hcC0+R2V0QlBQKCkgIT0gMSB8fCBzcHAgIT0gMSB8fCBicHMgIT0gMSB8fCAhaXNTdXBwb3J0KHBESUJpdG1hcCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBTZXRQYWxldHRlKHBESUJpdG1hcCwgYnBzKTsNCi0gICAgaW50MzJfdCBzaXplID0gKGludDMyX3QpVElGRlNjYW5saW5lU2l6ZSh0aWZfY3R4KTsNCi0gICAgdWludDhfdCogYnVmID0gKHVpbnQ4X3QqKV9USUZGbWFsbG9jKHNpemUpOw0KLSAgICBpZiAoYnVmID09IE5VTEwpIHsNCi0gICAgICAgIFRJRkZFcnJvcihUSUZGRmlsZU5hbWUodGlmX2N0eCksICJObyBzcGFjZSBmb3Igc2NhbmxpbmUgYnVmZmVyIik7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgdWludDhfdCogYml0TWFwYnVmZmVyID0gKHVpbnQ4X3QqKXBESUJpdG1hcC0+R2V0QnVmZmVyKCk7DQotICAgIEZYX0RXT1JEIHBpdGNoID0gcERJQml0bWFwLT5HZXRQaXRjaCgpOw0KLSAgICBmb3IoaW50MzJfdCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7DQotICAgICAgICBUSUZGUmVhZFNjYW5saW5lKHRpZl9jdHgsIGJ1Ziwgcm93LCAwKTsNCi0gICAgICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7DQotICAgICAgICAgICAgYml0TWFwYnVmZmVyW3JvdyAqIHBpdGNoICsgal0gPSBidWZbal07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgX1RJRkZmcmVlKGJ1Zik7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENDb2RlY19UaWZmQ29udGV4dDo6RGVjb2RlOGJwcFJHQihDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgd2lkdGgsIHVpbnQxNl90IGJwcywgdWludDE2X3Qgc3BwKQ0KLXsNCi0gICAgaWYgKHBESUJpdG1hcC0+R2V0QlBQKCkgIT0gOCB8fCBzcHAgIT0gMSB8fCAoYnBzICE9IDQgJiYgYnBzICE9IDgpIHx8ICFpc1N1cHBvcnQocERJQml0bWFwKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIFNldFBhbGV0dGUocERJQml0bWFwLCBicHMpOw0KLSAgICBpbnQzMl90IHNpemUgPSAoaW50MzJfdClUSUZGU2NhbmxpbmVTaXplKHRpZl9jdHgpOw0KLSAgICB1aW50OF90KiBidWYgPSAodWludDhfdCopX1RJRkZtYWxsb2Moc2l6ZSk7DQotICAgIGlmIChidWYgPT0gTlVMTCkgew0KLSAgICAgICAgVElGRkVycm9yKFRJRkZGaWxlTmFtZSh0aWZfY3R4KSwgIk5vIHNwYWNlIGZvciBzY2FubGluZSBidWZmZXIiKTsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB1aW50OF90KiBiaXRNYXBidWZmZXIgPSAodWludDhfdCopcERJQml0bWFwLT5HZXRCdWZmZXIoKTsNCi0gICAgRlhfRFdPUkQgcGl0Y2ggPSBwRElCaXRtYXAtPkdldFBpdGNoKCk7DQotICAgIGZvcihpbnQzMl90IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsNCi0gICAgICAgIFRJRkZSZWFkU2NhbmxpbmUodGlmX2N0eCwgYnVmLCByb3csIDApOw0KLSAgICAgICAgZm9yKGludDMyX3QgaiA9IDA7IGogPCBzaXplOyBqKyspIHsNCi0gICAgICAgICAgICBzd2l0Y2goYnBzKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIGJpdE1hcGJ1ZmZlcltyb3cgKiBwaXRjaCArIDIgKiBqICsgMF0gPSAoYnVmW2pdICYgMHhGMCkgPj4gNDsNCi0gICAgICAgICAgICAgICAgICAgIGJpdE1hcGJ1ZmZlcltyb3cgKiBwaXRjaCArIDIgKiBqICsgMV0gPSAoYnVmW2pdICYgMHgwRikgPj4gMDsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDg6DQotICAgICAgICAgICAgICAgICAgICBiaXRNYXBidWZmZXJbcm93ICogcGl0Y2ggKyBqXSA9IGJ1ZltqXTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBfVElGRmZyZWUoYnVmKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0NvZGVjX1RpZmZDb250ZXh0OjpEZWNvZGUyNGJwcFJHQihDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgd2lkdGgsIHVpbnQxNl90IGJwcywgdWludDE2X3Qgc3BwKQ0KLXsNCi0gICAgaWYgKHBESUJpdG1hcC0+R2V0QlBQKCkgIT0gMjQgfHwgIWlzU3VwcG9ydChwRElCaXRtYXApKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaW50MzJfdCBzaXplID0gKGludDMyX3QpVElGRlNjYW5saW5lU2l6ZSh0aWZfY3R4KTsNCi0gICAgdWludDhfdCogYnVmID0gKHVpbnQ4X3QqKV9USUZGbWFsbG9jKHNpemUpOw0KLSAgICBpZiAoYnVmID09IE5VTEwpIHsNCi0gICAgICAgIFRJRkZFcnJvcihUSUZGRmlsZU5hbWUodGlmX2N0eCksICJObyBzcGFjZSBmb3Igc2NhbmxpbmUgYnVmZmVyIik7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgdWludDhfdCogYml0TWFwYnVmZmVyID0gKHVpbnQ4X3QqKXBESUJpdG1hcC0+R2V0QnVmZmVyKCk7DQotICAgIEZYX0RXT1JEIHBpdGNoID0gcERJQml0bWFwLT5HZXRQaXRjaCgpOw0KLSAgICBmb3IoaW50MzJfdCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7DQotICAgICAgICBUSUZGUmVhZFNjYW5saW5lKHRpZl9jdHgsIGJ1Ziwgcm93LCAwKTsNCi0gICAgICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgc2l6ZSAtIDI7IGogKz0gMykgew0KLSAgICAgICAgICAgIGJpdE1hcGJ1ZmZlcltyb3cgKiBwaXRjaCArIGogKyAwXSA9IGJ1ZltqICsgMl07DQotICAgICAgICAgICAgYml0TWFwYnVmZmVyW3JvdyAqIHBpdGNoICsgaiArIDFdID0gYnVmW2ogKyAxXTsNCi0gICAgICAgICAgICBiaXRNYXBidWZmZXJbcm93ICogcGl0Y2ggKyBqICsgMl0gPSBidWZbaiArIDBdOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIF9USUZGZnJlZShidWYpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDQ29kZWNfVGlmZkNvbnRleHQ6OkRlY29kZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCkNCi17DQotICAgIEZYX0RXT1JEIGltZ193aWQgPSBwRElCaXRtYXAtPkdldFdpZHRoKCk7DQotICAgIEZYX0RXT1JEIGltZ19oZWkgPSBwRElCaXRtYXAtPkdldEhlaWdodCgpOw0KLSAgICBGWF9EV09SRCB3aWR0aCA9IDA7DQotICAgIEZYX0RXT1JEIGhlaWdodCA9IDA7DQotICAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX0lNQUdFV0lEVEgsICZ3aWR0aCk7DQotICAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX0lNQUdFTEVOR1RILCAmaGVpZ2h0KTsNCi0gICAgaWYgKGltZ193aWQgIT0gd2lkdGggfHwgaW1nX2hlaSAhPSBoZWlnaHQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAocERJQml0bWFwLT5HZXRCUFAoKSA9PSAzMikgew0KLSAgICAgICAgRlhfV09SRCByb3RhdGlvbiA9IE9SSUVOVEFUSU9OX1RPUExFRlQ7DQotICAgICAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19PUklFTlRBVElPTiwgJnJvdGF0aW9uKTsNCi0gICAgICAgIGlmKFRJRkZSZWFkUkdCQUltYWdlT3JpZW50ZWQodGlmX2N0eCwgaW1nX3dpZCwgaW1nX2hlaSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMiopcERJQml0bWFwLT5HZXRCdWZmZXIoKSwgcm90YXRpb24sIDEpKSB7DQotICAgICAgICAgICAgZm9yIChGWF9EV09SRCByb3cgPSAwOyByb3cgPCBpbWdfaGVpOyByb3crKykgew0KLSAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmID0gKHVpbnQ4X3QqKXBESUJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsNCi0gICAgICAgICAgICAgICAgX1RpZmZCR1JBMlJHQkEocm93X2J1ZiwgaW1nX3dpZCwgNCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHVpbnQxNl90IHNwcCwgYnBzOw0KLSAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19TQU1QTEVTUEVSUElYRUwsICZzcHApOw0KLSAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19CSVRTUEVSU0FNUExFLCAmYnBzKTsNCi0gICAgRlhfRFdPUkQgYnBwID0gYnBzICogc3BwOw0KLSAgICBpZiAoYnBwID09IDEpIHsNCi0gICAgICAgIHJldHVybiBEZWNvZGUxYnBwUkdCKHBESUJpdG1hcCwgaGVpZ2h0LCB3aWR0aCwgYnBzLCBzcHApOw0KLSAgICB9IGVsc2UgaWYgKGJwcCA8PSA4KSB7DQotICAgICAgICByZXR1cm4gRGVjb2RlOGJwcFJHQihwRElCaXRtYXAsIGhlaWdodCwgd2lkdGgsIGJwcywgc3BwKTsNCi0gICAgfSBlbHNlIGlmIChicHAgPD0gMjQpIHsNCi0gICAgICAgIHJldHVybiBEZWNvZGUyNGJwcFJHQihwRElCaXRtYXAsIGhlaWdodCwgd2lkdGgsIGJwcywgc3BwKTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ0NvZGVjX1RpZmZDb250ZXh0OjpEZWNvZGUyNGJwcFJHQihDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJwcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3BwKSB7DQorICBpZiAocERJQml0bWFwLT5HZXRCUFAoKSAhPSAyNCB8fCAhaXNTdXBwb3J0KHBESUJpdG1hcCkpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KLX0NCi12b2lkKiBDQ29kZWNfVGlmZk1vZHVsZTo6Q3JlYXRlRGVjb2RlcihJRlhfRmlsZVJlYWQqIGZpbGVfcHRyKQ0KLXsNCi0gICAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwRGVjb2RlciA9IG5ldyBDQ29kZWNfVGlmZkNvbnRleHQ7DQotICAgIGlmICghcERlY29kZXItPkluaXREZWNvZGVyKGZpbGVfcHRyKSkgew0KLSAgICAgICAgZGVsZXRlIHBEZWNvZGVyOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IHNpemUgPSAoaW50MzJfdClUSUZGU2NhbmxpbmVTaXplKHRpZl9jdHgpOw0KKyAgdWludDhfdCogYnVmID0gKHVpbnQ4X3QqKV9USUZGbWFsbG9jKHNpemUpOw0KKyAgaWYgKGJ1ZiA9PSBOVUxMKSB7DQorICAgIFRJRkZFcnJvcihUSUZGRmlsZU5hbWUodGlmX2N0eCksICJObyBzcGFjZSBmb3Igc2NhbmxpbmUgYnVmZmVyIik7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHVpbnQ4X3QqIGJpdE1hcGJ1ZmZlciA9ICh1aW50OF90KilwRElCaXRtYXAtPkdldEJ1ZmZlcigpOw0KKyAgRlhfRFdPUkQgcGl0Y2ggPSBwRElCaXRtYXAtPkdldFBpdGNoKCk7DQorICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgew0KKyAgICBUSUZGUmVhZFNjYW5saW5lKHRpZl9jdHgsIGJ1Ziwgcm93LCAwKTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgc2l6ZSAtIDI7IGogKz0gMykgew0KKyAgICAgIGJpdE1hcGJ1ZmZlcltyb3cgKiBwaXRjaCArIGogKyAwXSA9IGJ1ZltqICsgMl07DQorICAgICAgYml0TWFwYnVmZmVyW3JvdyAqIHBpdGNoICsgaiArIDFdID0gYnVmW2ogKyAxXTsNCisgICAgICBiaXRNYXBidWZmZXJbcm93ICogcGl0Y2ggKyBqICsgMl0gPSBidWZbaiArIDBdOw0KICAgICB9DQotICAgIHJldHVybiBwRGVjb2RlcjsNCisgIH0NCisgIF9USUZGZnJlZShidWYpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ0NvZGVjX1RpZmZNb2R1bGU6OkdldEZyYW1lcyh2b2lkKiBjdHgsIGludDMyX3QmIGZyYW1lcykNCi17DQotICAgIENDb2RlY19UaWZmQ29udGV4dCogcERlY29kZXIgPSAoQ0NvZGVjX1RpZmZDb250ZXh0KiljdHg7DQotICAgIHBEZWNvZGVyLT5HZXRGcmFtZXMoZnJhbWVzKTsNCitGWF9CT09MIENDb2RlY19UaWZmQ29udGV4dDo6RGVjb2RlKENGWF9ESUJpdG1hcCogcERJQml0bWFwKSB7DQorICBGWF9EV09SRCBpbWdfd2lkID0gcERJQml0bWFwLT5HZXRXaWR0aCgpOw0KKyAgRlhfRFdPUkQgaW1nX2hlaSA9IHBESUJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorICBGWF9EV09SRCB3aWR0aCA9IDA7DQorICBGWF9EV09SRCBoZWlnaHQgPSAwOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSU1BR0VXSURUSCwgJndpZHRoKTsNCisgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX0lNQUdFTEVOR1RILCAmaGVpZ2h0KTsNCisgIGlmIChpbWdfd2lkICE9IHdpZHRoIHx8IGltZ19oZWkgIT0gaGVpZ2h0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwRElCaXRtYXAtPkdldEJQUCgpID09IDMyKSB7DQorICAgIEZYX1dPUkQgcm90YXRpb24gPSBPUklFTlRBVElPTl9UT1BMRUZUOw0KKyAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19PUklFTlRBVElPTiwgJnJvdGF0aW9uKTsNCisgICAgaWYgKFRJRkZSZWFkUkdCQUltYWdlT3JpZW50ZWQodGlmX2N0eCwgaW1nX3dpZCwgaW1nX2hlaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMiopcERJQml0bWFwLT5HZXRCdWZmZXIoKSwgcm90YXRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpKSB7DQorICAgICAgZm9yIChGWF9EV09SRCByb3cgPSAwOyByb3cgPCBpbWdfaGVpOyByb3crKykgew0KKyAgICAgICAgdWludDhfdCogcm93X2J1ZiA9ICh1aW50OF90KilwRElCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQorICAgICAgICBfVGlmZkJHUkEyUkdCQShyb3dfYnVmLCBpbWdfd2lkLCA0KTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHVpbnQxNl90IHNwcCwgYnBzOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLCAmc3BwKTsNCisgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX0JJVFNQRVJTQU1QTEUsICZicHMpOw0KKyAgRlhfRFdPUkQgYnBwID0gYnBzICogc3BwOw0KKyAgaWYgKGJwcCA9PSAxKSB7DQorICAgIHJldHVybiBEZWNvZGUxYnBwUkdCKHBESUJpdG1hcCwgaGVpZ2h0LCB3aWR0aCwgYnBzLCBzcHApOw0KKyAgfSBlbHNlIGlmIChicHAgPD0gOCkgew0KKyAgICByZXR1cm4gRGVjb2RlOGJwcFJHQihwRElCaXRtYXAsIGhlaWdodCwgd2lkdGgsIGJwcywgc3BwKTsNCisgIH0gZWxzZSBpZiAoYnBwIDw9IDI0KSB7DQorICAgIHJldHVybiBEZWNvZGUyNGJwcFJHQihwRElCaXRtYXAsIGhlaWdodCwgd2lkdGgsIGJwcywgc3BwKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDQ29kZWNfVGlmZk1vZHVsZTo6TG9hZEZyYW1lSW5mbyh2b2lkKiBjdHgsIGludDMyX3QgZnJhbWUsIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIGNvbXBzLCBGWF9EV09SRCYgYnBjLCBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKQ0KLXsNCi0gICAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwRGVjb2RlciA9IChDQ29kZWNfVGlmZkNvbnRleHQqKWN0eDsNCi0gICAgcmV0dXJuIHBEZWNvZGVyLT5Mb2FkRnJhbWVJbmZvKGZyYW1lLCB3aWR0aCwgaGVpZ2h0LCBjb21wcywgYnBjLCBwQXR0cmlidXRlKTsNCi19DQotRlhfQk9PTCBDQ29kZWNfVGlmZk1vZHVsZTo6RGVjb2RlKHZvaWQqIGN0eCwgY2xhc3MgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApDQotew0KLSAgICBDQ29kZWNfVGlmZkNvbnRleHQqIHBEZWNvZGVyID0gKENDb2RlY19UaWZmQ29udGV4dCopY3R4Ow0KLSAgICByZXR1cm4gcERlY29kZXItPkRlY29kZShwRElCaXRtYXApOw0KLX0NCi12b2lkIENDb2RlY19UaWZmTW9kdWxlOjpEZXN0cm95RGVjb2Rlcih2b2lkKiBjdHgpDQotew0KLSAgICBDQ29kZWNfVGlmZkNvbnRleHQqIHBEZWNvZGVyID0gKENDb2RlY19UaWZmQ29udGV4dCopY3R4Ow0KK3ZvaWQqIENDb2RlY19UaWZmTW9kdWxlOjpDcmVhdGVEZWNvZGVyKElGWF9GaWxlUmVhZCogZmlsZV9wdHIpIHsNCisgIENDb2RlY19UaWZmQ29udGV4dCogcERlY29kZXIgPSBuZXcgQ0NvZGVjX1RpZmZDb250ZXh0Ow0KKyAgaWYgKCFwRGVjb2Rlci0+SW5pdERlY29kZXIoZmlsZV9wdHIpKSB7DQogICAgIGRlbGV0ZSBwRGVjb2RlcjsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcERlY29kZXI7DQorfQ0KK3ZvaWQgQ0NvZGVjX1RpZmZNb2R1bGU6OkdldEZyYW1lcyh2b2lkKiBjdHgsIGludDMyX3QmIGZyYW1lcykgew0KKyAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwRGVjb2RlciA9IChDQ29kZWNfVGlmZkNvbnRleHQqKWN0eDsNCisgIHBEZWNvZGVyLT5HZXRGcmFtZXMoZnJhbWVzKTsNCit9DQorRlhfQk9PTCBDQ29kZWNfVGlmZk1vZHVsZTo6TG9hZEZyYW1lSW5mbyh2b2lkKiBjdHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb21wcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBicGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSB7DQorICBDQ29kZWNfVGlmZkNvbnRleHQqIHBEZWNvZGVyID0gKENDb2RlY19UaWZmQ29udGV4dCopY3R4Ow0KKyAgcmV0dXJuIHBEZWNvZGVyLT5Mb2FkRnJhbWVJbmZvKGZyYW1lLCB3aWR0aCwgaGVpZ2h0LCBjb21wcywgYnBjLCBwQXR0cmlidXRlKTsNCit9DQorRlhfQk9PTCBDQ29kZWNfVGlmZk1vZHVsZTo6RGVjb2RlKHZvaWQqIGN0eCwgY2xhc3MgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApIHsNCisgIENDb2RlY19UaWZmQ29udGV4dCogcERlY29kZXIgPSAoQ0NvZGVjX1RpZmZDb250ZXh0KiljdHg7DQorICByZXR1cm4gcERlY29kZXItPkRlY29kZShwRElCaXRtYXApOw0KK30NCit2b2lkIENDb2RlY19UaWZmTW9kdWxlOjpEZXN0cm95RGVjb2Rlcih2b2lkKiBjdHgpIHsNCisgIENDb2RlY19UaWZmQ29udGV4dCogcERlY29kZXIgPSAoQ0NvZGVjX1RpZmZDb250ZXh0KiljdHg7DQorICBkZWxldGUgcERlY29kZXI7DQogfQ0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhEZWNvZGVyLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoRGVjb2Rlci5oCmluZGV4IDMzYmJlMzkuLjAyNTgwMTQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhEZWNvZGVyLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aERlY29kZXIuaApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBfSkJJRzJfQVJJVEhNRVRJQ19ERUNPREVSX0hfCkBAIC0xMCwxMjEgKzEwLDExNCBAQAogI2luY2x1ZGUgIkpCaWcyX0JpdFN0cmVhbS5oIgogI2luY2x1ZGUgIkpCaWcyX0FyaXRoUWUuaCIKIHR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBpbnQgTVBTOwotICAgIHVuc2lnbmVkIGludCBJOworICB1bnNpZ25lZCBpbnQgTVBTOworICB1bnNpZ25lZCBpbnQgSTsKIH0gSkJpZzJBcml0aEN0eDsKLWNsYXNzIENKQmlnMl9Bcml0aERlY29kZXIgOiBwdWJsaWMgQ0pCaWcyX09iamVjdAotewotcHVibGljOgorY2xhc3MgQ0pCaWcyX0FyaXRoRGVjb2RlciA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKQmlnMl9Bcml0aERlY29kZXIoQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSk7CiAKLSAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0pOworICB+Q0pCaWcyX0FyaXRoRGVjb2RlcigpOwogCi0gICAgfkNKQmlnMl9Bcml0aERlY29kZXIoKTsKKyAgaW50IERFQ09ERShKQmlnMkFyaXRoQ3R4KiBwQ1gpOwogCi0gICAgaW50IERFQ09ERShKQmlnMkFyaXRoQ3R4ICpwQ1gpOwotcHJpdmF0ZToKKyBwcml2YXRlOgorICB2b2lkIElOSVRERUMoKTsKIAotICAgIHZvaWQgSU5JVERFQygpOwotCi0gICAgdm9pZCBCWVRFSU4oKTsKLSAgICB1bnNpZ25lZCBjaGFyIEI7Ci0gICAgdW5zaWduZWQgaW50IEM7Ci0gICAgdW5zaWduZWQgaW50IEE7Ci0gICAgdW5zaWduZWQgaW50IENUOwotICAgIENKQmlnMl9CaXRTdHJlYW0gKm1fcFN0cmVhbTsKKyAgdm9pZCBCWVRFSU4oKTsKKyAgdW5zaWduZWQgY2hhciBCOworICB1bnNpZ25lZCBpbnQgQzsKKyAgdW5zaWduZWQgaW50IEE7CisgIHVuc2lnbmVkIGludCBDVDsKKyAgQ0pCaWcyX0JpdFN0cmVhbSogbV9wU3RyZWFtOwogfTsKLWlubGluZSBDSkJpZzJfQXJpdGhEZWNvZGVyOjpDSkJpZzJfQXJpdGhEZWNvZGVyKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0pCi17Ci0gICAgbV9wU3RyZWFtID0gcFN0cmVhbTsKLSAgICBJTklUREVDKCk7CitpbmxpbmUgQ0pCaWcyX0FyaXRoRGVjb2Rlcjo6Q0pCaWcyX0FyaXRoRGVjb2RlcihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtKSB7CisgIG1fcFN0cmVhbSA9IHBTdHJlYW07CisgIElOSVRERUMoKTsKIH0KLWlubGluZSBDSkJpZzJfQXJpdGhEZWNvZGVyOjp+Q0pCaWcyX0FyaXRoRGVjb2RlcigpCi17CitpbmxpbmUgQ0pCaWcyX0FyaXRoRGVjb2Rlcjo6fkNKQmlnMl9Bcml0aERlY29kZXIoKSB7fQoraW5saW5lIHZvaWQgQ0pCaWcyX0FyaXRoRGVjb2Rlcjo6SU5JVERFQygpIHsKKyAgQiA9IG1fcFN0cmVhbS0+Z2V0Q3VyQnl0ZV9hcml0aCgpOworICBDID0gKEIgXiAweGZmKSA8PCAxNjsKKyAgOworICBCWVRFSU4oKTsKKyAgQyA9IEMgPDwgNzsKKyAgQ1QgPSBDVCAtIDc7CisgIEEgPSAweDgwMDA7CiB9Ci1pbmxpbmUgdm9pZCBDSkJpZzJfQXJpdGhEZWNvZGVyOjpJTklUREVDKCkKLXsKK2lubGluZSB2b2lkIENKQmlnMl9Bcml0aERlY29kZXI6OkJZVEVJTigpIHsKKyAgdW5zaWduZWQgY2hhciBCMTsKKyAgaWYgKEIgPT0gMHhmZikgeworICAgIEIxID0gbV9wU3RyZWFtLT5nZXROZXh0Qnl0ZV9hcml0aCgpOworICAgIGlmIChCMSA+IDB4OGYpIHsKKyAgICAgIENUID0gODsKKyAgICB9IGVsc2UgeworICAgICAgbV9wU3RyZWFtLT5pbmNCeXRlSWR4KCk7CisgICAgICBCID0gQjE7CisgICAgICBDID0gQyArIDB4ZmUwMCAtIChCIDw8IDkpOworICAgICAgQ1QgPSA3OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX3BTdHJlYW0tPmluY0J5dGVJZHgoKTsKICAgICBCID0gbV9wU3RyZWFtLT5nZXRDdXJCeXRlX2FyaXRoKCk7Ci0gICAgQyA9IChCIF4gMHhmZikgPDwgMTY7OwotICAgIEJZVEVJTigpOwotICAgIEMgPSBDIDw8IDc7Ci0gICAgQ1QgPSBDVCAtIDc7Ci0gICAgQSA9IDB4ODAwMDsKKyAgICBDID0gQyArIDB4ZmYwMCAtIChCIDw8IDgpOworICAgIENUID0gODsKKyAgfQogfQotaW5saW5lIHZvaWQgQ0pCaWcyX0FyaXRoRGVjb2Rlcjo6QllURUlOKCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIEIxOwotICAgIGlmKEIgPT0gMHhmZikgewotICAgICAgICBCMSA9IG1fcFN0cmVhbS0+Z2V0TmV4dEJ5dGVfYXJpdGgoKTsKLSAgICAgICAgaWYoQjEgPiAweDhmKSB7Ci0gICAgICAgICAgICBDVCA9IDg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BTdHJlYW0tPmluY0J5dGVJZHgoKTsKLSAgICAgICAgICAgIEIgPSBCMTsKLSAgICAgICAgICAgIEMgPSBDICsgMHhmZTAwIC0gKEIgPDwgOSk7Ci0gICAgICAgICAgICBDVCA9IDc7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX3BTdHJlYW0tPmluY0J5dGVJZHgoKTsKLSAgICAgICAgQiA9IG1fcFN0cmVhbS0+Z2V0Q3VyQnl0ZV9hcml0aCgpOwotICAgICAgICBDID0gQyArIDB4ZmYwMCAtIChCIDw8IDgpOwotICAgICAgICBDVCA9IDg7Ci0gICAgfQotfQotaW5saW5lIGludCBDSkJpZzJfQXJpdGhEZWNvZGVyOjpERUNPREUoSkJpZzJBcml0aEN0eCAqcENYKQotewotICAgIGlmICghcENYIHx8IHBDWC0+SSA+PSBKQklHMl9RRV9OVU0pIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQoraW5saW5lIGludCBDSkJpZzJfQXJpdGhEZWNvZGVyOjpERUNPREUoSkJpZzJBcml0aEN0eCogcENYKSB7CisgIGlmICghcENYIHx8IHBDWC0+SSA+PSBKQklHMl9RRV9OVU0pIHsKKyAgICByZXR1cm4gMDsKKyAgfQogCi0gICAgaW50IEQ7Ci0gICAgY29uc3QgSkJpZzJBcml0aFFlICogcWUgPSAmUWVUYWJsZVtwQ1gtPkldOwotICAgIEEgPSBBIC0gcWUtPlFlOwotICAgIGlmKChDID4+IDE2KSA8IEEpIHsKLSAgICAgICAgaWYoQSAmIDB4ODAwMCkgewotICAgICAgICAgICAgRCA9IHBDWC0+TVBTOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoQSA8IHFlLT5RZSkgewotICAgICAgICAgICAgICAgIEQgPSAxIC0gcENYLT5NUFM7Ci0gICAgICAgICAgICAgICAgaWYocWUtPm5Td2l0Y2ggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBwQ1gtPk1QUyA9IDEgLSBwQ1gtPk1QUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcENYLT5JID0gcWUtPk5MUFM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEQgPSBwQ1gtPk1QUzsKLSAgICAgICAgICAgICAgICBwQ1gtPkkgPSBxZS0+Tk1QUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoQ1QgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBCWVRFSU4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQSA8PD0gMTsKLSAgICAgICAgICAgICAgICBDIDw8PSAxOwotICAgICAgICAgICAgICAgIENULS07Ci0gICAgICAgICAgICB9IHdoaWxlICgoQSAmIDB4ODAwMCkgPT0gMCk7Ci0gICAgICAgIH0KKyAgaW50IEQ7CisgIGNvbnN0IEpCaWcyQXJpdGhRZSogcWUgPSAmUWVUYWJsZVtwQ1gtPkldOworICBBID0gQSAtIHFlLT5RZTsKKyAgaWYgKChDID4+IDE2KSA8IEEpIHsKKyAgICBpZiAoQSAmIDB4ODAwMCkgeworICAgICAgRCA9IHBDWC0+TVBTOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEMgLT0gQSA8PCAxNjsKLSAgICAgICAgaWYoQSA8IHFlLT5RZSkgewotICAgICAgICAgICAgQSA9IHFlLT5RZTsKLSAgICAgICAgICAgIEQgPSBwQ1gtPk1QUzsKLSAgICAgICAgICAgIHBDWC0+SSA9IHFlLT5OTVBTOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQSA9IHFlLT5RZTsKLSAgICAgICAgICAgIEQgPSAxIC0gcENYLT5NUFM7Ci0gICAgICAgICAgICBpZihxZS0+blN3aXRjaCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcENYLT5NUFMgPSAxIC0gcENYLT5NUFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQ1gtPkkgPSBxZS0+TkxQUzsKKyAgICAgIGlmIChBIDwgcWUtPlFlKSB7CisgICAgICAgIEQgPSAxIC0gcENYLT5NUFM7CisgICAgICAgIGlmIChxZS0+blN3aXRjaCA9PSAxKSB7CisgICAgICAgICAgcENYLT5NUFMgPSAxIC0gcENYLT5NUFM7CiAgICAgICAgIH0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKENUID09IDApIHsKLSAgICAgICAgICAgICAgICBCWVRFSU4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEEgPDw9IDE7Ci0gICAgICAgICAgICBDIDw8PSAxOwotICAgICAgICAgICAgQ1QtLTsKLSAgICAgICAgfSB3aGlsZSAoKEEgJiAweDgwMDApID09IDApOworICAgICAgICBwQ1gtPkkgPSBxZS0+TkxQUzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEQgPSBwQ1gtPk1QUzsKKyAgICAgICAgcENYLT5JID0gcWUtPk5NUFM7CisgICAgICB9CisgICAgICBkbyB7CisgICAgICAgIGlmIChDVCA9PSAwKSB7CisgICAgICAgICAgQllURUlOKCk7CisgICAgICAgIH0KKyAgICAgICAgQSA8PD0gMTsKKyAgICAgICAgQyA8PD0gMTsKKyAgICAgICAgQ1QtLTsKKyAgICAgIH0gd2hpbGUgKChBICYgMHg4MDAwKSA9PSAwKTsKICAgICB9Ci0gICAgcmV0dXJuIEQ7CisgIH0gZWxzZSB7CisgICAgQyAtPSBBIDw8IDE2OworICAgIGlmIChBIDwgcWUtPlFlKSB7CisgICAgICBBID0gcWUtPlFlOworICAgICAgRCA9IHBDWC0+TVBTOworICAgICAgcENYLT5JID0gcWUtPk5NUFM7CisgICAgfSBlbHNlIHsKKyAgICAgIEEgPSBxZS0+UWU7CisgICAgICBEID0gMSAtIHBDWC0+TVBTOworICAgICAgaWYgKHFlLT5uU3dpdGNoID09IDEpIHsKKyAgICAgICAgcENYLT5NUFMgPSAxIC0gcENYLT5NUFM7CisgICAgICB9CisgICAgICBwQ1gtPkkgPSBxZS0+TkxQUzsKKyAgICB9CisgICAgZG8geworICAgICAgaWYgKENUID09IDApIHsKKyAgICAgICAgQllURUlOKCk7CisgICAgICB9CisgICAgICBBIDw8PSAxOworICAgICAgQyA8PD0gMTsKKyAgICAgIENULS07CisgICAgfSB3aGlsZSAoKEEgJiAweDgwMDApID09IDApOworICB9CisgIHJldHVybiBEOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoSW50RGVjb2Rlci5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoSW50RGVjb2Rlci5jcHAKaW5kZXggMWUxMTU4NC4uM2FhYjJmYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aEludERlY29kZXIuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhJbnREZWNvZGVyLmNwcApAQCAtMSwxMDUgKzEsMTAyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlICJKQmlnMl9Bcml0aEludERlY29kZXIuaCIKLUNKQmlnMl9Bcml0aEludERlY29kZXI6OkNKQmlnMl9Bcml0aEludERlY29kZXIoKQotewotICAgIElBeCA9IChKQmlnMkFyaXRoQ3R4KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEpCaWcyQXJpdGhDdHgpLCA1MTIpOwotICAgIEpCSUcyX21lbXNldChJQXgsIDAsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSAqIDUxMik7CitDSkJpZzJfQXJpdGhJbnREZWNvZGVyOjpDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkgeworICBJQXggPSAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgNTEyKTsKKyAgSkJJRzJfbWVtc2V0KElBeCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpICogNTEyKTsKIH0KLUNKQmlnMl9Bcml0aEludERlY29kZXI6On5DSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkKLXsKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoSUF4KTsKK0NKQmlnMl9Bcml0aEludERlY29kZXI6On5DSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkgeworICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoSUF4KTsKIH0KLWludCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyOjpkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgaW50ICpuUmVzdWx0KQotewotICAgIGludCBQUkVWLCBWOwotICAgIGludCBTLCBEOwotICAgIGludCBuTmVlZEJpdHMsIG5UZW1wLCBpOwotICAgIFBSRVYgPSAxOwotICAgIFMgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoSUF4ICsgUFJFVik7Ci0gICAgUFJFViA9IChQUkVWIDw8IDEpIHwgUzsKK2ludCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyOjpkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuUmVzdWx0KSB7CisgIGludCBQUkVWLCBWOworICBpbnQgUywgRDsKKyAgaW50IG5OZWVkQml0cywgblRlbXAsIGk7CisgIFBSRVYgPSAxOworICBTID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKElBeCArIFBSRVYpOworICBQUkVWID0gKFBSRVYgPDwgMSkgfCBTOworICBEID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKElBeCArIFBSRVYpOworICBQUkVWID0gKFBSRVYgPDwgMSkgfCBEOworICBpZiAoRCkgewogICAgIEQgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoSUF4ICsgUFJFVik7CiAgICAgUFJFViA9IChQUkVWIDw8IDEpIHwgRDsKLSAgICBpZihEKSB7CisgICAgaWYgKEQpIHsKKyAgICAgIEQgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoSUF4ICsgUFJFVik7CisgICAgICBQUkVWID0gKFBSRVYgPDwgMSkgfCBEOworICAgICAgaWYgKEQpIHsKICAgICAgICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQXggKyBQUkVWKTsKICAgICAgICAgUFJFViA9IChQUkVWIDw8IDEpIHwgRDsKLSAgICAgICAgaWYoRCkgewotICAgICAgICAgICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQXggKyBQUkVWKTsKLSAgICAgICAgICAgIFBSRVYgPSAoUFJFViA8PCAxKSB8IEQ7Ci0gICAgICAgICAgICBpZihEKSB7Ci0gICAgICAgICAgICAgICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQXggKyBQUkVWKTsKLSAgICAgICAgICAgICAgICBQUkVWID0gKFBSRVYgPDwgMSkgfCBEOwotICAgICAgICAgICAgICAgIGlmKEQpIHsKLSAgICAgICAgICAgICAgICAgICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQXggKyBQUkVWKTsKLSAgICAgICAgICAgICAgICAgICAgUFJFViA9IChQUkVWIDw8IDEpIHwgRDsKLSAgICAgICAgICAgICAgICAgICAgaWYoRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbk5lZWRCaXRzID0gMzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWID0gNDQzNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5OZWVkQml0cyA9IDEyOwotICAgICAgICAgICAgICAgICAgICAgICAgViA9IDM0MDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5OZWVkQml0cyA9IDg7Ci0gICAgICAgICAgICAgICAgICAgIFYgPSA4NDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5OZWVkQml0cyA9IDY7Ci0gICAgICAgICAgICAgICAgViA9IDIwOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAoRCkgeworICAgICAgICAgIEQgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoSUF4ICsgUFJFVik7CisgICAgICAgICAgUFJFViA9IChQUkVWIDw8IDEpIHwgRDsKKyAgICAgICAgICBpZiAoRCkgeworICAgICAgICAgICAgbk5lZWRCaXRzID0gMzI7CisgICAgICAgICAgICBWID0gNDQzNjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbk5lZWRCaXRzID0gMTI7CisgICAgICAgICAgICBWID0gMzQwOworICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5OZWVkQml0cyA9IDQ7Ci0gICAgICAgICAgICBWID0gNDsKKyAgICAgICAgICBuTmVlZEJpdHMgPSA4OworICAgICAgICAgIFYgPSA4NDsKICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgbk5lZWRCaXRzID0gNjsKKyAgICAgICAgViA9IDIwOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIG5OZWVkQml0cyA9IDI7Ci0gICAgICAgIFYgPSAwOworICAgICAgbk5lZWRCaXRzID0gNDsKKyAgICAgIFYgPSA0OwogICAgIH0KLSAgICBuVGVtcCA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpIDwgbk5lZWRCaXRzOyBpKyspIHsKLSAgICAgICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQXggKyBQUkVWKTsKLSAgICAgICAgaWYoUFJFViA8IDI1NikgewotICAgICAgICAgICAgUFJFViA9IChQUkVWIDw8IDEpIHwgRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFBSRVYgPSAoKChQUkVWIDw8IDEpIHwgRCkgJiA1MTEpIHwgMjU2OwotICAgICAgICB9Ci0gICAgICAgIG5UZW1wID0gKG5UZW1wIDw8IDEpIHwgRDsKKyAgfSBlbHNlIHsKKyAgICBuTmVlZEJpdHMgPSAyOworICAgIFYgPSAwOworICB9CisgIG5UZW1wID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG5OZWVkQml0czsgaSsrKSB7CisgICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQXggKyBQUkVWKTsKKyAgICBpZiAoUFJFViA8IDI1NikgeworICAgICAgUFJFViA9IChQUkVWIDw8IDEpIHwgRDsKKyAgICB9IGVsc2UgeworICAgICAgUFJFViA9ICgoKFBSRVYgPDwgMSkgfCBEKSAmIDUxMSkgfCAyNTY7CiAgICAgfQotICAgIFYgKz0gblRlbXA7Ci0gICAgaWYoUyA9PSAxICYmIFYgPiAwKSB7Ci0gICAgICAgIFYgPSAtVjsKLSAgICB9Ci0gICAgKm5SZXN1bHQgPSBWOwotICAgIGlmKFMgPT0gMSAmJiBWID09IDApIHsKLSAgICAgICAgcmV0dXJuIEpCSUcyX09PQjsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisgICAgblRlbXAgPSAoblRlbXAgPDwgMSkgfCBEOworICB9CisgIFYgKz0gblRlbXA7CisgIGlmIChTID09IDEgJiYgViA+IDApIHsKKyAgICBWID0gLVY7CisgIH0KKyAgKm5SZXN1bHQgPSBWOworICBpZiAoUyA9PSAxICYmIFYgPT0gMCkgeworICAgIHJldHVybiBKQklHMl9PT0I7CisgIH0KKyAgcmV0dXJuIDA7CiB9Ci1DSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcjo6Q0pCaWcyX0FyaXRoSWFpZERlY29kZXIodW5zaWduZWQgY2hhciBTQlNZTUNPREVMRU5BKQotewotICAgIFNCU1lNQ09ERUxFTiA9IFNCU1lNQ09ERUxFTkE7Ci0gICAgSUFJRCA9IChKQmlnMkFyaXRoQ3R4KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEpCaWcyQXJpdGhDdHgpLCAoMSA8PCBTQlNZTUNPREVMRU4pKTsKLSAgICBKQklHMl9tZW1zZXQoSUFJRCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpICogKGludCkoMSA8PCBTQlNZTUNPREVMRU4pKTsKK0NKQmlnMl9Bcml0aElhaWREZWNvZGVyOjpDSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcih1bnNpZ25lZCBjaGFyIFNCU1lNQ09ERUxFTkEpIHsKKyAgU0JTWU1DT0RFTEVOID0gU0JTWU1DT0RFTEVOQTsKKyAgSUFJRCA9IChKQmlnMkFyaXRoQ3R4KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEpCaWcyQXJpdGhDdHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBTQlNZTUNPREVMRU4pKTsKKyAgSkJJRzJfbWVtc2V0KElBSUQsIDAsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSAqIChpbnQpKDEgPDwgU0JTWU1DT0RFTEVOKSk7CiB9Ci1DSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcjo6fkNKQmlnMl9Bcml0aElhaWREZWNvZGVyKCkKLXsKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoSUFJRCk7CitDSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcjo6fkNKQmlnMl9Bcml0aElhaWREZWNvZGVyKCkgeworICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoSUFJRCk7CiB9Ci1pbnQgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXI6OmRlY29kZShDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBpbnQgKm5SZXN1bHQpCi17Ci0gICAgaW50IFBSRVY7Ci0gICAgaW50IEQ7Ci0gICAgaW50IGk7Ci0gICAgUFJFViA9IDE7Ci0gICAgZm9yKGkgPSAwOyBpIDwgU0JTWU1DT0RFTEVOOyBpKyspIHsKLSAgICAgICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQUlEICsgUFJFVik7Ci0gICAgICAgIFBSRVYgPSAoUFJFViA8PCAxKSB8IEQ7Ci0gICAgfQotICAgIFBSRVYgPSBQUkVWIC0gKDEgPDwgU0JTWU1DT0RFTEVOKTsKLSAgICAqblJlc3VsdCA9IFBSRVY7Ci0gICAgcmV0dXJuIDA7CitpbnQgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXI6OmRlY29kZShDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuUmVzdWx0KSB7CisgIGludCBQUkVWOworICBpbnQgRDsKKyAgaW50IGk7CisgIFBSRVYgPSAxOworICBmb3IgKGkgPSAwOyBpIDwgU0JTWU1DT0RFTEVOOyBpKyspIHsKKyAgICBEID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKElBSUQgKyBQUkVWKTsKKyAgICBQUkVWID0gKFBSRVYgPDwgMSkgfCBEOworICB9CisgIFBSRVYgPSBQUkVWIC0gKDEgPDwgU0JTWU1DT0RFTEVOKTsKKyAgKm5SZXN1bHQgPSBQUkVWOworICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhJbnREZWNvZGVyLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoSW50RGVjb2Rlci5oCmluZGV4IDRlYTEwNGMuLmQwMjRlNzEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhJbnREZWNvZGVyLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aEludERlY29kZXIuaApAQCAtMSwzOSArMSwzNSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIF9KQklHMl9BUklUSF9JTlRfREVDT0RFUl9IXwogI2RlZmluZSBfSkJJRzJfQVJJVEhfSU5UX0RFQ09ERVJfSF8KICNpbmNsdWRlICJKQmlnMl9Nb2R1bGUuaCIKICNpbmNsdWRlICJKQmlnMl9Bcml0aERlY29kZXIuaCIKLWNsYXNzIENKQmlnMl9Bcml0aEludERlY29kZXIgOiBwdWJsaWMgQ0pCaWcyX09iamVjdAotewotcHVibGljOgorY2xhc3MgQ0pCaWcyX0FyaXRoSW50RGVjb2RlciA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKQmlnMl9Bcml0aEludERlY29kZXIoKTsKIAotICAgIENKQmlnMl9Bcml0aEludERlY29kZXIoKTsKKyAgfkNKQmlnMl9Bcml0aEludERlY29kZXIoKTsKIAotICAgIH5DSkJpZzJfQXJpdGhJbnREZWNvZGVyKCk7CisgIGludCBkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwgaW50KiBuUmVzdWx0KTsKIAotICAgIGludCBkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgaW50ICpuUmVzdWx0KTsKLXByaXZhdGU6Ci0KLSAgICBKQmlnMkFyaXRoQ3R4ICpJQXg7CisgcHJpdmF0ZToKKyAgSkJpZzJBcml0aEN0eCogSUF4OwogfTsKLWNsYXNzIENKQmlnMl9Bcml0aElhaWREZWNvZGVyIDogcHVibGljIENKQmlnMl9PYmplY3QKLXsKLXB1YmxpYzoKK2NsYXNzIENKQmlnMl9Bcml0aElhaWREZWNvZGVyIDogcHVibGljIENKQmlnMl9PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXIodW5zaWduZWQgY2hhciBTQlNZTUNPREVMRU5BKTsKIAotICAgIENKQmlnMl9Bcml0aElhaWREZWNvZGVyKHVuc2lnbmVkIGNoYXIgU0JTWU1DT0RFTEVOQSk7CisgIH5DSkJpZzJfQXJpdGhJYWlkRGVjb2RlcigpOwogCi0gICAgfkNKQmlnMl9Bcml0aElhaWREZWNvZGVyKCk7CisgIGludCBkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwgaW50KiBuUmVzdWx0KTsKIAotICAgIGludCBkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgaW50ICpuUmVzdWx0KTsKLXByaXZhdGU6CisgcHJpdmF0ZToKKyAgSkJpZzJBcml0aEN0eCogSUFJRDsKIAotICAgIEpCaWcyQXJpdGhDdHggKklBSUQ7Ci0KLSAgICB1bnNpZ25lZCBjaGFyIFNCU1lNQ09ERUxFTjsKKyAgdW5zaWduZWQgY2hhciBTQlNZTUNPREVMRU47CiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoUWUuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhRZS5oCmluZGV4IDhhNzIzYmUuLmQ0ZWFiZWMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhRZS5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhRZS5oCkBAIC0xLDE2ICsxLDE2IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgX0pCSUcyX0FSSVRIX1FFX0hfCiAjZGVmaW5lIF9KQklHMl9BUklUSF9RRV9IXwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGludCBRZTsKLSAgICB1bnNpZ25lZCBpbnQgTk1QUzsKLSAgICB1bnNpZ25lZCBpbnQgTkxQUzsKLSAgICB1bnNpZ25lZCBpbnQgblN3aXRjaDsKKyAgdW5zaWduZWQgaW50IFFlOworICB1bnNpZ25lZCBpbnQgTk1QUzsKKyAgdW5zaWduZWQgaW50IE5MUFM7CisgIHVuc2lnbmVkIGludCBuU3dpdGNoOwogfSBKQmlnMkFyaXRoUWU7CiBleHRlcm4gY29uc3QgSkJpZzJBcml0aFFlIFFlVGFibGVbXTsKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgSkJJRzJfUUVfTlVNOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgKaW5kZXggZmYwYjlmYy4uYzc0OTY0NCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5oCkBAIC0xLDMxNiArMSwyODcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBfSkJJRzJfQklUX1NUUkVBTV9IXwogI2RlZmluZSBfSkJJRzJfQklUX1NUUkVBTV9IXwogI2luY2x1ZGUgIkpCaWcyX0RlZmluZS5oIgotY2xhc3MgQ0pCaWcyX0JpdFN0cmVhbSA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDSkJpZzJfQml0U3RyZWFtIDogcHVibGljIENKQmlnMl9PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pCaWcyX0JpdFN0cmVhbSh1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBkd0xlbmd0aCk7CiAKLSAgICBDSkJpZzJfQml0U3RyZWFtKHVpbnQ4X3QgKnBCdWZmZXIsIEZYX0RXT1JEIGR3TGVuZ3RoKTsKKyAgQ0pCaWcyX0JpdFN0cmVhbShDSkJpZzJfQml0U3RyZWFtJiBicyk7CiAKLSAgICBDSkJpZzJfQml0U3RyZWFtKENKQmlnMl9CaXRTdHJlYW0gJmJzKTsKKyAgfkNKQmlnMl9CaXRTdHJlYW0oKTsKIAotICAgIH5DSkJpZzJfQml0U3RyZWFtKCk7CisgIGludDMyX3QgcmVhZE5CaXRzKEZYX0RXT1JEIG5CaXRzLCBGWF9EV09SRCogZHdSZXN1bHQpOwogCi0gICAgaW50MzJfdCByZWFkTkJpdHMoRlhfRFdPUkQgbkJpdHMsIEZYX0RXT1JEICpkd1Jlc3VsdCk7CisgIGludDMyX3QgcmVhZE5CaXRzKEZYX0RXT1JEIG5CaXRzLCBpbnQzMl90KiBuUmVzdWx0KTsKIAotICAgIGludDMyX3QgcmVhZE5CaXRzKEZYX0RXT1JEIG5CaXRzLCBpbnQzMl90ICpuUmVzdWx0KTsKKyAgaW50MzJfdCByZWFkMUJpdChGWF9EV09SRCogZHdSZXN1bHQpOwogCi0gICAgaW50MzJfdCByZWFkMUJpdChGWF9EV09SRCAqZHdSZXN1bHQpOworICBpbnQzMl90IHJlYWQxQml0KEZYX0JPT0wqIGJSZXN1bHQpOwogCi0gICAgaW50MzJfdCByZWFkMUJpdChGWF9CT09MICAqYlJlc3VsdCk7CisgIGludDMyX3QgcmVhZDFCeXRlKHVpbnQ4X3QqIGNSZXN1bHQpOwogCi0gICAgaW50MzJfdCByZWFkMUJ5dGUodWludDhfdCAqY1Jlc3VsdCk7CisgIGludDMyX3QgcmVhZEludGVnZXIoRlhfRFdPUkQqIGR3UmVzdWx0KTsKIAotICAgIGludDMyX3QgcmVhZEludGVnZXIoRlhfRFdPUkQgKmR3UmVzdWx0KTsKKyAgaW50MzJfdCByZWFkU2hvcnRJbnRlZ2VyKEZYX1dPUkQqIHdSZXN1bHQpOwogCi0gICAgaW50MzJfdCByZWFkU2hvcnRJbnRlZ2VyKEZYX1dPUkQgKndSZXN1bHQpOworICB2b2lkIGFsaWduQnl0ZSgpOwogCi0gICAgdm9pZCBhbGlnbkJ5dGUoKTsKKyAgdm9pZCBhbGlnbjRCeXRlKCk7CiAKLSAgICB2b2lkIGFsaWduNEJ5dGUoKTsKKyAgdWludDhfdCBnZXRBdChGWF9EV09SRCBkd09mZnNldCk7CiAKLSAgICB1aW50OF90IGdldEF0KEZYX0RXT1JEIGR3T2Zmc2V0KTsKKyAgdWludDhfdCBnZXRDdXJCeXRlKCk7CiAKLSAgICB1aW50OF90IGdldEN1ckJ5dGUoKTsKKyAgdWludDhfdCBnZXROZXh0Qnl0ZSgpOwogCi0gICAgdWludDhfdCBnZXROZXh0Qnl0ZSgpOworICBpbnQzMl90IGluY0J5dGVJZHgoKTsKIAotICAgIGludDMyX3QgaW5jQnl0ZUlkeCgpOworICB1aW50OF90IGdldEN1ckJ5dGVfYXJpdGgoKTsKIAotICAgIHVpbnQ4X3QgZ2V0Q3VyQnl0ZV9hcml0aCgpOworICB1aW50OF90IGdldE5leHRCeXRlX2FyaXRoKCk7CiAKLSAgICB1aW50OF90IGdldE5leHRCeXRlX2FyaXRoKCk7CisgIEZYX0RXT1JEIGdldE9mZnNldCgpOwogCi0gICAgRlhfRFdPUkQgZ2V0T2Zmc2V0KCk7CisgIHZvaWQgc2V0T2Zmc2V0KEZYX0RXT1JEIGR3T2Zmc2V0KTsKIAotICAgIHZvaWQgc2V0T2Zmc2V0KEZYX0RXT1JEIGR3T2Zmc2V0KTsKKyAgRlhfRFdPUkQgZ2V0Qml0UG9zKCk7CiAKLSAgICBGWF9EV09SRCBnZXRCaXRQb3MoKTsKKyAgdm9pZCBzZXRCaXRQb3MoRlhfRFdPUkQgZHdCaXRQb3MpOwogCi0gICAgdm9pZCBzZXRCaXRQb3MoRlhfRFdPUkQgZHdCaXRQb3MpOworICB1aW50OF90KiBnZXRCdWYoKTsKIAotICAgIHVpbnQ4X3QgKmdldEJ1ZigpOworICBGWF9EV09SRCBnZXRMZW5ndGgoKSB7IHJldHVybiBtX2R3TGVuZ3RoOyB9CiAKLSAgICBGWF9EV09SRCBnZXRMZW5ndGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fZHdMZW5ndGg7Ci0gICAgfQorICB1aW50OF90KiBnZXRQb2ludGVyKCk7CiAKLSAgICB1aW50OF90ICpnZXRQb2ludGVyKCk7CisgIHZvaWQgb2Zmc2V0KEZYX0RXT1JEIGR3T2Zmc2V0KTsKIAotICAgIHZvaWQgb2Zmc2V0KEZYX0RXT1JEIGR3T2Zmc2V0KTsKKyAgRlhfRFdPUkQgZ2V0Qnl0ZUxlZnQoKTsKIAotICAgIEZYX0RXT1JEIGdldEJ5dGVMZWZ0KCk7Ci1wcml2YXRlOgorIHByaXZhdGU6CisgIHVpbnQ4X3QqIG1fcEJ1ZjsKIAotICAgIHVpbnQ4X3QgKm1fcEJ1ZjsKKyAgRlhfRFdPUkQgbV9kd0xlbmd0aDsKIAotICAgIEZYX0RXT1JEIG1fZHdMZW5ndGg7CisgIEZYX0RXT1JEIG1fZHdCeXRlSWR4OwogCi0gICAgRlhfRFdPUkQgbV9kd0J5dGVJZHg7Ci0KLSAgICBGWF9EV09SRCBtX2R3Qml0SWR4OworICBGWF9EV09SRCBtX2R3Qml0SWR4OwogfTsKLWlubGluZSBDSkJpZzJfQml0U3RyZWFtOjpDSkJpZzJfQml0U3RyZWFtKHVpbnQ4X3QgKnBCdWZmZXIsIEZYX0RXT1JEIGR3TGVuZ3RoKQotewotICAgIG1fcEJ1ZiA9IHBCdWZmZXI7Ci0gICAgbV9kd0xlbmd0aCA9IGR3TGVuZ3RoOwotICAgIG1fZHdCeXRlSWR4ID0gMDsKLSAgICBtX2R3Qml0SWR4ICA9IDA7Ci0gICAgaWYgKG1fZHdMZW5ndGggPiAyNTYgKiAxMDI0ICogMTAyNCkgewotICAgICAgICBtX2R3TGVuZ3RoID0gMDsKLSAgICAgICAgbV9wQnVmID0gTlVMTDsKLSAgICB9CitpbmxpbmUgQ0pCaWcyX0JpdFN0cmVhbTo6Q0pCaWcyX0JpdFN0cmVhbSh1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBkd0xlbmd0aCkgeworICBtX3BCdWYgPSBwQnVmZmVyOworICBtX2R3TGVuZ3RoID0gZHdMZW5ndGg7CisgIG1fZHdCeXRlSWR4ID0gMDsKKyAgbV9kd0JpdElkeCA9IDA7CisgIGlmIChtX2R3TGVuZ3RoID4gMjU2ICogMTAyNCAqIDEwMjQpIHsKKyAgICBtX2R3TGVuZ3RoID0gMDsKKyAgICBtX3BCdWYgPSBOVUxMOworICB9CiB9Ci1pbmxpbmUgQ0pCaWcyX0JpdFN0cmVhbTo6Q0pCaWcyX0JpdFN0cmVhbShDSkJpZzJfQml0U3RyZWFtICZicykKLXsKLSAgICBtX3BCdWYgPSBicy5tX3BCdWY7Ci0gICAgbV9kd0xlbmd0aCA9IGJzLm1fZHdMZW5ndGg7Ci0gICAgbV9kd0J5dGVJZHggPSBicy5tX2R3Qnl0ZUlkeDsKLSAgICBtX2R3Qml0SWR4ID0gYnMubV9kd0JpdElkeDsKK2lubGluZSBDSkJpZzJfQml0U3RyZWFtOjpDSkJpZzJfQml0U3RyZWFtKENKQmlnMl9CaXRTdHJlYW0mIGJzKSB7CisgIG1fcEJ1ZiA9IGJzLm1fcEJ1ZjsKKyAgbV9kd0xlbmd0aCA9IGJzLm1fZHdMZW5ndGg7CisgIG1fZHdCeXRlSWR4ID0gYnMubV9kd0J5dGVJZHg7CisgIG1fZHdCaXRJZHggPSBicy5tX2R3Qml0SWR4OwogfQotaW5saW5lIENKQmlnMl9CaXRTdHJlYW06On5DSkJpZzJfQml0U3RyZWFtKCkKLXsKLX0KLWlubGluZSBpbnQzMl90IENKQmlnMl9CaXRTdHJlYW06OnJlYWROQml0cyhGWF9EV09SRCBkd0JpdHMsIEZYX0RXT1JEICpkd1Jlc3VsdCkKLXsKLSAgICBGWF9EV09SRCBkd1RlbXAgPSAobV9kd0J5dGVJZHggPDwgMykgKyBtX2R3Qml0SWR4OwotICAgIGlmKGR3VGVtcCA8PSAobV9kd0xlbmd0aCA8PCAzKSkgewotICAgICAgICAqZHdSZXN1bHQgPSAwOwotICAgICAgICBpZihkd1RlbXAgKyBkd0JpdHMgPD0gKG1fZHdMZW5ndGggPDwgMykpIHsKLSAgICAgICAgICAgIGR3VGVtcCA9IGR3Qml0czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGR3VGVtcCA9IChtX2R3TGVuZ3RoIDw8IDMpIC0gZHdUZW1wOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlKGR3VGVtcCA+IDApIHsKLSAgICAgICAgICAgICpkd1Jlc3VsdCA9ICgqZHdSZXN1bHQgPDwgMSkgfCAoKG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gPj4gKDcgLSBtX2R3Qml0SWR4KSkgJiAweDAxKTsKLSAgICAgICAgICAgIGlmKG1fZHdCaXRJZHggPT0gNykgewotICAgICAgICAgICAgICAgIG1fZHdCeXRlSWR4ICsrOwotICAgICAgICAgICAgICAgIG1fZHdCaXRJZHggPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX2R3Qml0SWR4ICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHdUZW1wIC0tOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworaW5saW5lIENKQmlnMl9CaXRTdHJlYW06On5DSkJpZzJfQml0U3RyZWFtKCkge30KK2lubGluZSBpbnQzMl90IENKQmlnMl9CaXRTdHJlYW06OnJlYWROQml0cyhGWF9EV09SRCBkd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGR3UmVzdWx0KSB7CisgIEZYX0RXT1JEIGR3VGVtcCA9IChtX2R3Qnl0ZUlkeCA8PCAzKSArIG1fZHdCaXRJZHg7CisgIGlmIChkd1RlbXAgPD0gKG1fZHdMZW5ndGggPDwgMykpIHsKKyAgICAqZHdSZXN1bHQgPSAwOworICAgIGlmIChkd1RlbXAgKyBkd0JpdHMgPD0gKG1fZHdMZW5ndGggPDwgMykpIHsKKyAgICAgIGR3VGVtcCA9IGR3Qml0czsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7CisgICAgICBkd1RlbXAgPSAobV9kd0xlbmd0aCA8PCAzKSAtIGR3VGVtcDsKICAgICB9Ci19Ci1pbmxpbmUgaW50MzJfdCBDSkJpZzJfQml0U3RyZWFtOjpyZWFkTkJpdHMoRlhfRFdPUkQgZHdCaXRzLCBpbnQzMl90ICpuUmVzdWx0KQotewotICAgIEZYX0RXT1JEIGR3VGVtcCA9IChtX2R3Qnl0ZUlkeCA8PCAzKSArIG1fZHdCaXRJZHg7Ci0gICAgaWYoZHdUZW1wIDw9IChtX2R3TGVuZ3RoIDw8IDMpKSB7Ci0gICAgICAgICpuUmVzdWx0ID0gMDsKLSAgICAgICAgaWYoZHdUZW1wICsgZHdCaXRzIDw9IChtX2R3TGVuZ3RoIDw8IDMpKSB7Ci0gICAgICAgICAgICBkd1RlbXAgPSBkd0JpdHM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkd1RlbXAgPSAobV9kd0xlbmd0aCA8PCAzKSAtIGR3VGVtcDsKLSAgICAgICAgfQotICAgICAgICB3aGlsZShkd1RlbXAgPiAwKSB7Ci0gICAgICAgICAgICAqblJlc3VsdCA9ICgqblJlc3VsdCA8PCAxKSB8ICgobV9wQnVmW21fZHdCeXRlSWR4XSA+PiAoNyAtIG1fZHdCaXRJZHgpKSAmIDB4MDEpOwotICAgICAgICAgICAgaWYobV9kd0JpdElkeCA9PSA3KSB7Ci0gICAgICAgICAgICAgICAgbV9kd0J5dGVJZHggKys7Ci0gICAgICAgICAgICAgICAgbV9kd0JpdElkeCA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fZHdCaXRJZHggKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkd1RlbXAgLS07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotaW5saW5lIGludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZDFCaXQoRlhfRFdPUkQgKmR3UmVzdWx0KQotewotICAgIGlmKG1fZHdCeXRlSWR4IDwgbV9kd0xlbmd0aCkgewotICAgICAgICAqZHdSZXN1bHQgPSAobV9wQnVmW21fZHdCeXRlSWR4XSA+PiAoNyAtIG1fZHdCaXRJZHgpKSAmIDB4MDE7Ci0gICAgICAgIGlmKG1fZHdCaXRJZHggPT0gNykgewotICAgICAgICAgICAgbV9kd0J5dGVJZHggKys7Ci0gICAgICAgICAgICBtX2R3Qml0SWR4ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fZHdCaXRJZHggKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotaW5saW5lIGludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZDFCaXQoRlhfQk9PTCAqYlJlc3VsdCkKLXsKLSAgICBpZihtX2R3Qnl0ZUlkeCA8IG1fZHdMZW5ndGgpIHsKLSAgICAgICAgKmJSZXN1bHQgPSAobV9wQnVmW21fZHdCeXRlSWR4XSA+PiAoNyAtIG1fZHdCaXRJZHgpKSAmIDB4MDE7Ci0gICAgICAgIGlmKG1fZHdCaXRJZHggPT0gNykgewotICAgICAgICAgICAgbV9kd0J5dGVJZHggKys7Ci0gICAgICAgICAgICBtX2R3Qml0SWR4ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fZHdCaXRJZHggKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLWlubGluZSBpbnQzMl90IENKQmlnMl9CaXRTdHJlYW06OnJlYWQxQnl0ZSh1aW50OF90ICpjUmVzdWx0KQotewotICAgIGlmKG1fZHdCeXRlSWR4IDwgbV9kd0xlbmd0aCkgewotICAgICAgICAqY1Jlc3VsdCA9IG1fcEJ1ZlttX2R3Qnl0ZUlkeF07Ci0gICAgICAgIG1fZHdCeXRlSWR4ICsrOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi1pbmxpbmUgaW50MzJfdCBDSkJpZzJfQml0U3RyZWFtOjpyZWFkSW50ZWdlcihGWF9EV09SRCAqZHdSZXN1bHQpCi17Ci0gICAgaWYobV9kd0J5dGVJZHggKyAzIDwgbV9kd0xlbmd0aCkgewotICAgICAgICAqZHdSZXN1bHQgPSAobV9wQnVmW21fZHdCeXRlSWR4XSA8PCAyNCkgfCAobV9wQnVmW21fZHdCeXRlSWR4ICsgMV0gPDwgMTYpCi0gICAgICAgICAgICAgICAgICAgIHwgKG1fcEJ1ZlttX2R3Qnl0ZUlkeCArIDJdIDw8IDgpIHwgbV9wQnVmW21fZHdCeXRlSWR4ICsgM107Ci0gICAgICAgIG1fZHdCeXRlSWR4ICs9IDQ7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLWlubGluZSBpbnQzMl90IENKQmlnMl9CaXRTdHJlYW06OnJlYWRTaG9ydEludGVnZXIoRlhfV09SRCAqZHdSZXN1bHQpCi17Ci0gICAgaWYobV9kd0J5dGVJZHggKyAxIDwgbV9kd0xlbmd0aCkgewotICAgICAgICAqZHdSZXN1bHQgPSAobV9wQnVmW21fZHdCeXRlSWR4XSA8PCA4KSB8IG1fcEJ1ZlttX2R3Qnl0ZUlkeCArIDFdOwotICAgICAgICBtX2R3Qnl0ZUlkeCArPSAyOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgQ0pCaWcyX0JpdFN0cmVhbTo6YWxpZ25CeXRlKCkKLXsKLSAgICBpZihtX2R3Qml0SWR4ICE9IDApIHsKLSAgICAgICAgbV9kd0J5dGVJZHggKys7CisgICAgd2hpbGUgKGR3VGVtcCA+IDApIHsKKyAgICAgICpkd1Jlc3VsdCA9CisgICAgICAgICAgKCpkd1Jlc3VsdCA8PCAxKSB8ICgobV9wQnVmW21fZHdCeXRlSWR4XSA+PiAoNyAtIG1fZHdCaXRJZHgpKSAmIDB4MDEpOworICAgICAgaWYgKG1fZHdCaXRJZHggPT0gNykgeworICAgICAgICBtX2R3Qnl0ZUlkeCsrOwogICAgICAgICBtX2R3Qml0SWR4ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fZHdCaXRJZHgrKzsKKyAgICAgIH0KKyAgICAgIGR3VGVtcC0tOwogICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KIH0KLWlubGluZSB2b2lkIENKQmlnMl9CaXRTdHJlYW06OmFsaWduNEJ5dGUoKQotewotICAgIGlmKG1fZHdCaXRJZHggIT0gMCkgewotICAgICAgICBtX2R3Qnl0ZUlkeCArKzsKK2lubGluZSBpbnQzMl90IENKQmlnMl9CaXRTdHJlYW06OnJlYWROQml0cyhGWF9EV09SRCBkd0JpdHMsIGludDMyX3QqIG5SZXN1bHQpIHsKKyAgRlhfRFdPUkQgZHdUZW1wID0gKG1fZHdCeXRlSWR4IDw8IDMpICsgbV9kd0JpdElkeDsKKyAgaWYgKGR3VGVtcCA8PSAobV9kd0xlbmd0aCA8PCAzKSkgeworICAgICpuUmVzdWx0ID0gMDsKKyAgICBpZiAoZHdUZW1wICsgZHdCaXRzIDw9IChtX2R3TGVuZ3RoIDw8IDMpKSB7CisgICAgICBkd1RlbXAgPSBkd0JpdHM7CisgICAgfSBlbHNlIHsKKyAgICAgIGR3VGVtcCA9IChtX2R3TGVuZ3RoIDw8IDMpIC0gZHdUZW1wOworICAgIH0KKyAgICB3aGlsZSAoZHdUZW1wID4gMCkgeworICAgICAgKm5SZXN1bHQgPQorICAgICAgICAgICgqblJlc3VsdCA8PCAxKSB8ICgobV9wQnVmW21fZHdCeXRlSWR4XSA+PiAoNyAtIG1fZHdCaXRJZHgpKSAmIDB4MDEpOworICAgICAgaWYgKG1fZHdCaXRJZHggPT0gNykgeworICAgICAgICBtX2R3Qnl0ZUlkeCsrOwogICAgICAgICBtX2R3Qml0SWR4ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fZHdCaXRJZHgrKzsKKyAgICAgIH0KKyAgICAgIGR3VGVtcC0tOwogICAgIH0KLSAgICBtX2R3Qnl0ZUlkeCA9IChtX2R3Qnl0ZUlkeCArIDMpICYgLTQ7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9CiB9Ci1pbmxpbmUgdWludDhfdCBDSkJpZzJfQml0U3RyZWFtOjpnZXRBdChGWF9EV09SRCBkd09mZnNldCkKLXsKLSAgICBpZihkd09mZnNldCA8IG1fZHdMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIG1fcEJ1Zltkd09mZnNldF07CisKK2lubGluZSBpbnQzMl90IENKQmlnMl9CaXRTdHJlYW06OnJlYWQxQml0KEZYX0RXT1JEKiBkd1Jlc3VsdCkgeworICBpZiAobV9kd0J5dGVJZHggPCBtX2R3TGVuZ3RoKSB7CisgICAgKmR3UmVzdWx0ID0gKG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gPj4gKDcgLSBtX2R3Qml0SWR4KSkgJiAweDAxOworICAgIGlmIChtX2R3Qml0SWR4ID09IDcpIHsKKyAgICAgIG1fZHdCeXRlSWR4Kys7CisgICAgICBtX2R3Qml0SWR4ID0gMDsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgIG1fZHdCaXRJZHgrKzsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9CiB9Ci1pbmxpbmUgdWludDhfdCBDSkJpZzJfQml0U3RyZWFtOjpnZXRDdXJCeXRlKCkKLXsKLSAgICBpZihtX2R3Qnl0ZUlkeCA8IG1fZHdMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIG1fcEJ1ZlttX2R3Qnl0ZUlkeF07CisKK2lubGluZSBpbnQzMl90IENKQmlnMl9CaXRTdHJlYW06OnJlYWQxQml0KEZYX0JPT0wqIGJSZXN1bHQpIHsKKyAgaWYgKG1fZHdCeXRlSWR4IDwgbV9kd0xlbmd0aCkgeworICAgICpiUmVzdWx0ID0gKG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gPj4gKDcgLSBtX2R3Qml0SWR4KSkgJiAweDAxOworICAgIGlmIChtX2R3Qml0SWR4ID09IDcpIHsKKyAgICAgIG1fZHdCeXRlSWR4Kys7CisgICAgICBtX2R3Qml0SWR4ID0gMDsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgIG1fZHdCaXRJZHgrKzsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9CiB9Ci1pbmxpbmUgdWludDhfdCBDSkJpZzJfQml0U3RyZWFtOjpnZXROZXh0Qnl0ZSgpCi17Ci0gICAgaWYobV9kd0J5dGVJZHggKyAxIDwgbV9kd0xlbmd0aCkgewotICAgICAgICByZXR1cm4gbV9wQnVmW21fZHdCeXRlSWR4ICsgMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQoraW5saW5lIGludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZDFCeXRlKHVpbnQ4X3QqIGNSZXN1bHQpIHsKKyAgaWYgKG1fZHdCeXRlSWR4IDwgbV9kd0xlbmd0aCkgeworICAgICpjUmVzdWx0ID0gbV9wQnVmW21fZHdCeXRlSWR4XTsKKyAgICBtX2R3Qnl0ZUlkeCsrOworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQogfQotaW5saW5lIGludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6aW5jQnl0ZUlkeCgpCi17Ci0gICAgaWYobV9kd0J5dGVJZHggPCBtX2R3TGVuZ3RoKSB7Ci0gICAgICAgIG1fZHdCeXRlSWR4ICsrOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorCitpbmxpbmUgaW50MzJfdCBDSkJpZzJfQml0U3RyZWFtOjpyZWFkSW50ZWdlcihGWF9EV09SRCogZHdSZXN1bHQpIHsKKyAgaWYgKG1fZHdCeXRlSWR4ICsgMyA8IG1fZHdMZW5ndGgpIHsKKyAgICAqZHdSZXN1bHQgPSAobV9wQnVmW21fZHdCeXRlSWR4XSA8PCAyNCkgfCAobV9wQnVmW21fZHdCeXRlSWR4ICsgMV0gPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAobV9wQnVmW21fZHdCeXRlSWR4ICsgMl0gPDwgOCkgfCBtX3BCdWZbbV9kd0J5dGVJZHggKyAzXTsKKyAgICBtX2R3Qnl0ZUlkeCArPSA0OworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQogfQotaW5saW5lIHVpbnQ4X3QgQ0pCaWcyX0JpdFN0cmVhbTo6Z2V0Q3VyQnl0ZV9hcml0aCgpCi17Ci0gICAgaWYobV9kd0J5dGVJZHggPCBtX2R3TGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiBtX3BCdWZbbV9kd0J5dGVJZHhdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAweGZmOwotICAgIH0KKworaW5saW5lIGludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZFNob3J0SW50ZWdlcihGWF9XT1JEKiBkd1Jlc3VsdCkgeworICBpZiAobV9kd0J5dGVJZHggKyAxIDwgbV9kd0xlbmd0aCkgeworICAgICpkd1Jlc3VsdCA9IChtX3BCdWZbbV9kd0J5dGVJZHhdIDw8IDgpIHwgbV9wQnVmW21fZHdCeXRlSWR4ICsgMV07CisgICAgbV9kd0J5dGVJZHggKz0gMjsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KIH0KLWlubGluZSB1aW50OF90IENKQmlnMl9CaXRTdHJlYW06OmdldE5leHRCeXRlX2FyaXRoKCkKLXsKLSAgICBpZihtX2R3Qnl0ZUlkeCArIDEgPCBtX2R3TGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiBtX3BCdWZbbV9kd0J5dGVJZHggKyAxXTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMHhmZjsKLSAgICB9CitpbmxpbmUgdm9pZCBDSkJpZzJfQml0U3RyZWFtOjphbGlnbkJ5dGUoKSB7CisgIGlmIChtX2R3Qml0SWR4ICE9IDApIHsKKyAgICBtX2R3Qnl0ZUlkeCsrOworICAgIG1fZHdCaXRJZHggPSAwOworICB9CiB9Ci1pbmxpbmUgRlhfRFdPUkQgQ0pCaWcyX0JpdFN0cmVhbTo6Z2V0T2Zmc2V0KCkKLXsKLSAgICByZXR1cm4gbV9kd0J5dGVJZHg7CitpbmxpbmUgdm9pZCBDSkJpZzJfQml0U3RyZWFtOjphbGlnbjRCeXRlKCkgeworICBpZiAobV9kd0JpdElkeCAhPSAwKSB7CisgICAgbV9kd0J5dGVJZHgrKzsKKyAgICBtX2R3Qml0SWR4ID0gMDsKKyAgfQorICBtX2R3Qnl0ZUlkeCA9IChtX2R3Qnl0ZUlkeCArIDMpICYgLTQ7CiB9Ci1pbmxpbmUgdm9pZCBDSkJpZzJfQml0U3RyZWFtOjpzZXRPZmZzZXQoRlhfRFdPUkQgZHdPZmZzZXQpCi17Ci0gICAgaWYgKGR3T2Zmc2V0ID4gbV9kd0xlbmd0aCkgewotICAgICAgICBkd09mZnNldCA9IG1fZHdMZW5ndGg7Ci0gICAgfQotICAgIG1fZHdCeXRlSWR4ID0gZHdPZmZzZXQ7CitpbmxpbmUgdWludDhfdCBDSkJpZzJfQml0U3RyZWFtOjpnZXRBdChGWF9EV09SRCBkd09mZnNldCkgeworICBpZiAoZHdPZmZzZXQgPCBtX2R3TGVuZ3RoKSB7CisgICAgcmV0dXJuIG1fcEJ1Zltkd09mZnNldF07CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KIH0KLWlubGluZSBGWF9EV09SRCBDSkJpZzJfQml0U3RyZWFtOjpnZXRCaXRQb3MoKQotewotICAgIHJldHVybiAobV9kd0J5dGVJZHggPDwgMykgKyBtX2R3Qml0SWR4OworaW5saW5lIHVpbnQ4X3QgQ0pCaWcyX0JpdFN0cmVhbTo6Z2V0Q3VyQnl0ZSgpIHsKKyAgaWYgKG1fZHdCeXRlSWR4IDwgbV9kd0xlbmd0aCkgeworICAgIHJldHVybiBtX3BCdWZbbV9kd0J5dGVJZHhdOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9CiB9Ci1pbmxpbmUgdm9pZCBDSkJpZzJfQml0U3RyZWFtOjpzZXRCaXRQb3MoRlhfRFdPUkQgZHdCaXRQb3MpCi17Ci0gICAgbV9kd0J5dGVJZHggPSBkd0JpdFBvcyA+PiAzOwotICAgIG1fZHdCaXRJZHggPSBkd0JpdFBvcyAmIDc7CitpbmxpbmUgdWludDhfdCBDSkJpZzJfQml0U3RyZWFtOjpnZXROZXh0Qnl0ZSgpIHsKKyAgaWYgKG1fZHdCeXRlSWR4ICsgMSA8IG1fZHdMZW5ndGgpIHsKKyAgICByZXR1cm4gbV9wQnVmW21fZHdCeXRlSWR4ICsgMV07CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KIH0KLWlubGluZSB1aW50OF90ICpDSkJpZzJfQml0U3RyZWFtOjpnZXRCdWYoKQotewotICAgIHJldHVybiBtX3BCdWY7CitpbmxpbmUgaW50MzJfdCBDSkJpZzJfQml0U3RyZWFtOjppbmNCeXRlSWR4KCkgeworICBpZiAobV9kd0J5dGVJZHggPCBtX2R3TGVuZ3RoKSB7CisgICAgbV9kd0J5dGVJZHgrKzsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KIH0KLWlubGluZSB1aW50OF90ICpDSkJpZzJfQml0U3RyZWFtOjpnZXRQb2ludGVyKCkKLXsKLSAgICByZXR1cm4gbV9wQnVmICsgbV9kd0J5dGVJZHg7CitpbmxpbmUgdWludDhfdCBDSkJpZzJfQml0U3RyZWFtOjpnZXRDdXJCeXRlX2FyaXRoKCkgeworICBpZiAobV9kd0J5dGVJZHggPCBtX2R3TGVuZ3RoKSB7CisgICAgcmV0dXJuIG1fcEJ1ZlttX2R3Qnl0ZUlkeF07CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDB4ZmY7CisgIH0KIH0KLWlubGluZSB2b2lkIENKQmlnMl9CaXRTdHJlYW06Om9mZnNldChGWF9EV09SRCBkd09mZnNldCkKLXsKLSAgICBtX2R3Qnl0ZUlkeCArPSBkd09mZnNldDsKK2lubGluZSB1aW50OF90IENKQmlnMl9CaXRTdHJlYW06OmdldE5leHRCeXRlX2FyaXRoKCkgeworICBpZiAobV9kd0J5dGVJZHggKyAxIDwgbV9kd0xlbmd0aCkgeworICAgIHJldHVybiBtX3BCdWZbbV9kd0J5dGVJZHggKyAxXTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMHhmZjsKKyAgfQogfQotaW5saW5lIEZYX0RXT1JEIENKQmlnMl9CaXRTdHJlYW06OmdldEJ5dGVMZWZ0KCkKLXsKLSAgICByZXR1cm4gbV9kd0xlbmd0aCAtIG1fZHdCeXRlSWR4OworaW5saW5lIEZYX0RXT1JEIENKQmlnMl9CaXRTdHJlYW06OmdldE9mZnNldCgpIHsKKyAgcmV0dXJuIG1fZHdCeXRlSWR4OworfQoraW5saW5lIHZvaWQgQ0pCaWcyX0JpdFN0cmVhbTo6c2V0T2Zmc2V0KEZYX0RXT1JEIGR3T2Zmc2V0KSB7CisgIGlmIChkd09mZnNldCA+IG1fZHdMZW5ndGgpIHsKKyAgICBkd09mZnNldCA9IG1fZHdMZW5ndGg7CisgIH0KKyAgbV9kd0J5dGVJZHggPSBkd09mZnNldDsKK30KK2lubGluZSBGWF9EV09SRCBDSkJpZzJfQml0U3RyZWFtOjpnZXRCaXRQb3MoKSB7CisgIHJldHVybiAobV9kd0J5dGVJZHggPDwgMykgKyBtX2R3Qml0SWR4OworfQoraW5saW5lIHZvaWQgQ0pCaWcyX0JpdFN0cmVhbTo6c2V0Qml0UG9zKEZYX0RXT1JEIGR3Qml0UG9zKSB7CisgIG1fZHdCeXRlSWR4ID0gZHdCaXRQb3MgPj4gMzsKKyAgbV9kd0JpdElkeCA9IGR3Qml0UG9zICYgNzsKK30KK2lubGluZSB1aW50OF90KiBDSkJpZzJfQml0U3RyZWFtOjpnZXRCdWYoKSB7CisgIHJldHVybiBtX3BCdWY7Cit9CitpbmxpbmUgdWludDhfdCogQ0pCaWcyX0JpdFN0cmVhbTo6Z2V0UG9pbnRlcigpIHsKKyAgcmV0dXJuIG1fcEJ1ZiArIG1fZHdCeXRlSWR4OworfQoraW5saW5lIHZvaWQgQ0pCaWcyX0JpdFN0cmVhbTo6b2Zmc2V0KEZYX0RXT1JEIGR3T2Zmc2V0KSB7CisgIG1fZHdCeXRlSWR4ICs9IGR3T2Zmc2V0OworfQoraW5saW5lIEZYX0RXT1JEIENKQmlnMl9CaXRTdHJlYW06OmdldEJ5dGVMZWZ0KCkgeworICByZXR1cm4gbV9kd0xlbmd0aCAtIG1fZHdCeXRlSWR4OwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmNwcAppbmRleCA2OGM5NzM1Li40YTA4YzIxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5jcHAKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlIDxtYXA+CkBAIC0xNywxNzUzICsxNywxODgwIEBACiAvLyBkaWZmZXJlbmNlIGZvciB0eXBpY2FsIEpCSUcyIGRvY3VtZW50cy4KIGNvbnN0IGludCBrU3ltYm9sRGljdENhY2hlTWF4U2l6ZSA9IDI7CiAKLXZvaWQgT3V0cHV0Qml0bWFwKENKQmlnMl9JbWFnZSogcEltYWdlKQotewotICAgIGlmKCFwSW1hZ2UpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KK3ZvaWQgT3V0cHV0Qml0bWFwKENKQmlnMl9JbWFnZSogcEltYWdlKSB7CisgIGlmICghcEltYWdlKSB7CisgICAgcmV0dXJuOworICB9CiB9Ci1DSkJpZzJfQ29udGV4dCAqQ0pCaWcyX0NvbnRleHQ6OkNyZWF0ZUNvbnRleHQoQ0pCaWcyX01vZHVsZSAqcE1vZHVsZSwgdWludDhfdCAqcEdsb2JhbERhdGEsIEZYX0RXT1JEIGR3R2xvYmFsTGVuZ3RoLAotICAgICAgICB1aW50OF90ICpwRGF0YSwgRlhfRFdPUkQgZHdMZW5ndGgsIGludDMyX3QgblN0cmVhbVR5cGUsIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiogcFN5bWJvbERpY3RDYWNoZSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgcmV0dXJuIG5ldyhwTW9kdWxlKUNKQmlnMl9Db250ZXh0KHBHbG9iYWxEYXRhLCBkd0dsb2JhbExlbmd0aCwgcERhdGEsIGR3TGVuZ3RoLCBuU3RyZWFtVHlwZSwgcFN5bWJvbERpY3RDYWNoZSwgcFBhdXNlKTsKK0NKQmlnMl9Db250ZXh0KiBDSkJpZzJfQ29udGV4dDo6Q3JlYXRlQ29udGV4dCgKKyAgICBDSkJpZzJfTW9kdWxlKiBwTW9kdWxlLAorICAgIHVpbnQ4X3QqIHBHbG9iYWxEYXRhLAorICAgIEZYX0RXT1JEIGR3R2xvYmFsTGVuZ3RoLAorICAgIHVpbnQ4X3QqIHBEYXRhLAorICAgIEZYX0RXT1JEIGR3TGVuZ3RoLAorICAgIGludDMyX3QgblN0cmVhbVR5cGUsCisgICAgc3RkOjpsaXN0PENKQmlnMl9DYWNoZVBhaXI+KiBwU3ltYm9sRGljdENhY2hlLAorICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIHJldHVybiBuZXcgKHBNb2R1bGUpCisgICAgICBDSkJpZzJfQ29udGV4dChwR2xvYmFsRGF0YSwgZHdHbG9iYWxMZW5ndGgsIHBEYXRhLCBkd0xlbmd0aCwgblN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICBwU3ltYm9sRGljdENhY2hlLCBwUGF1c2UpOwogfQotdm9pZCBDSkJpZzJfQ29udGV4dDo6RGVzdHJveUNvbnRleHQoQ0pCaWcyX0NvbnRleHQgKnBDb250ZXh0KQotewotICAgIGRlbGV0ZSBwQ29udGV4dDsKK3ZvaWQgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KENKQmlnMl9Db250ZXh0KiBwQ29udGV4dCkgeworICBkZWxldGUgcENvbnRleHQ7CiB9Ci1DSkJpZzJfQ29udGV4dDo6Q0pCaWcyX0NvbnRleHQodWludDhfdCAqcEdsb2JhbERhdGEsIEZYX0RXT1JEIGR3R2xvYmFsTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCBGWF9EV09SRCBkd0xlbmd0aCwgaW50MzJfdCBuU3RyZWFtVHlwZSwgc3RkOjpsaXN0PENKQmlnMl9DYWNoZVBhaXI+KiBwU3ltYm9sRGljdENhY2hlLCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZihwR2xvYmFsRGF0YSAmJiAoZHdHbG9iYWxMZW5ndGggPiAwKSkgewotICAgICAgICBKQklHMl9BTExPQyhtX3BHbG9iYWxDb250ZXh0LCBDSkJpZzJfQ29udGV4dChOVUxMLCAwLCBwR2xvYmFsRGF0YSwgZHdHbG9iYWxMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0VNQkVEX1NUUkVBTSwgcFN5bWJvbERpY3RDYWNoZSwgcFBhdXNlKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wR2xvYmFsQ29udGV4dCA9IE5VTEw7Ci0gICAgfQotICAgIEpCSUcyX0FMTE9DKG1fcFN0cmVhbSwgQ0pCaWcyX0JpdFN0cmVhbShwRGF0YSwgZHdMZW5ndGgpKTsKLSAgICBtX25TdHJlYW1UeXBlID0gblN0cmVhbVR5cGU7Ci0gICAgbV9uU3RhdGUgPSBKQklHMl9PVVRfT0ZfUEFHRTsKLSAgICBKQklHMl9BTExPQyhtX3BTZWdtZW50TGlzdCwgQ0pCaWcyX0xpc3Q8Q0pCaWcyX1NlZ21lbnQ+KTsKLSAgICBKQklHMl9BTExPQyhtX3BQYWdlSW5mb0xpc3QsIENKQmlnMl9MaXN0PEpCaWcyUGFnZUluZm8+KDEpKTsKLSAgICBtX3BQYWdlID0gTlVMTDsKLSAgICBtX2JCdWZTcGVjaWZpZWQgPSBGQUxTRTsKLSAgICBtX3BQYXVzZSA9IHBQYXVzZTsKLSAgICBtX25TZWdtZW50RGVjb2RlZCA9IDA7Ci0gICAgbV9QYXVzZVN0ZXAgPSAxMDsKLSAgICBtX3BBcml0aERlY29kZXIgPSBOVUxMOwotICAgIG1fcEdSRCA9IE5VTEw7Ci0gICAgbV9nYkNvbnRleHQgPSBOVUxMOwotICAgIG1fcFNlZ21lbnQgPSBOVUxMOwotICAgIG1fZHdPZmZzZXQgPSAwOwotICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZOwotICAgIG1fcFN5bWJvbERpY3RDYWNoZSA9IHBTeW1ib2xEaWN0Q2FjaGU7Ci19Ci1DSkJpZzJfQ29udGV4dDo6fkNKQmlnMl9Db250ZXh0KCkKLXsKLSAgICBkZWxldGUgbV9wQXJpdGhEZWNvZGVyOwotICAgIG1fcEFyaXRoRGVjb2RlciA9IE5VTEw7Ci0gICAgZGVsZXRlIG1fcEdSRDsKLSAgICBtX3BHUkQgPSBOVUxMOwotICAgIGlmKG1fZ2JDb250ZXh0KSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShtX2diQ29udGV4dCk7Ci0gICAgfQotICAgIG1fZ2JDb250ZXh0ID0gTlVMTDsKLSAgICBkZWxldGUgbV9wR2xvYmFsQ29udGV4dDsKK0NKQmlnMl9Db250ZXh0OjpDSkJpZzJfQ29udGV4dCh1aW50OF90KiBwR2xvYmFsRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0dsb2JhbExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiogcFN5bWJvbERpY3RDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAocEdsb2JhbERhdGEgJiYgKGR3R2xvYmFsTGVuZ3RoID4gMCkpIHsKKyAgICBKQklHMl9BTExPQyhtX3BHbG9iYWxDb250ZXh0LAorICAgICAgICAgICAgICAgIENKQmlnMl9Db250ZXh0KE5VTEwsIDAsIHBHbG9iYWxEYXRhLCBkd0dsb2JhbExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQklHMl9FTUJFRF9TVFJFQU0sIHBTeW1ib2xEaWN0Q2FjaGUsIHBQYXVzZSkpOworICB9IGVsc2UgewogICAgIG1fcEdsb2JhbENvbnRleHQgPSBOVUxMOwotICAgIGRlbGV0ZSBtX3BQYWdlSW5mb0xpc3Q7Ci0gICAgbV9wUGFnZUluZm9MaXN0ID0gTlVMTDsKLSAgICBpZihtX2JCdWZTcGVjaWZpZWQpIHsKLSAgICAgICAgZGVsZXRlIG1fcFBhZ2U7Ci0gICAgfQotICAgIG1fcFBhZ2UgPSBOVUxMOwotICAgIGRlbGV0ZSBtX3BTdHJlYW07Ci0gICAgbV9wU3RyZWFtID0gTlVMTDsKLSAgICBkZWxldGUgbV9wU2VnbWVudExpc3Q7Ci0gICAgbV9wU2VnbWVudExpc3QgPSBOVUxMOworICB9CisgIEpCSUcyX0FMTE9DKG1fcFN0cmVhbSwgQ0pCaWcyX0JpdFN0cmVhbShwRGF0YSwgZHdMZW5ndGgpKTsKKyAgbV9uU3RyZWFtVHlwZSA9IG5TdHJlYW1UeXBlOworICBtX25TdGF0ZSA9IEpCSUcyX09VVF9PRl9QQUdFOworICBKQklHMl9BTExPQyhtX3BTZWdtZW50TGlzdCwgQ0pCaWcyX0xpc3Q8Q0pCaWcyX1NlZ21lbnQ+KTsKKyAgSkJJRzJfQUxMT0MobV9wUGFnZUluZm9MaXN0LCBDSkJpZzJfTGlzdDxKQmlnMlBhZ2VJbmZvPigxKSk7CisgIG1fcFBhZ2UgPSBOVUxMOworICBtX2JCdWZTcGVjaWZpZWQgPSBGQUxTRTsKKyAgbV9wUGF1c2UgPSBwUGF1c2U7CisgIG1fblNlZ21lbnREZWNvZGVkID0gMDsKKyAgbV9QYXVzZVN0ZXAgPSAxMDsKKyAgbV9wQXJpdGhEZWNvZGVyID0gTlVMTDsKKyAgbV9wR1JEID0gTlVMTDsKKyAgbV9nYkNvbnRleHQgPSBOVUxMOworICBtX3BTZWdtZW50ID0gTlVMTDsKKyAgbV9kd09mZnNldCA9IDA7CisgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZOworICBtX3BTeW1ib2xEaWN0Q2FjaGUgPSBwU3ltYm9sRGljdENhY2hlOwogfQotaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6ZGVjb2RlRmlsZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICB1aW50OF90IGNGbGFnczsKLSAgICBGWF9EV09SRCBkd1RlbXA7Ci0gICAgY29uc3QgdWludDhfdCBmaWxlSURbXSA9IHsweDk3LCAweDRBLCAweDQyLCAweDMyLCAweDBELCAweDBBLCAweDFBLCAweDBBfTsKLSAgICBpbnQzMl90IG5SZXQ7Ci0gICAgaWYobV9wU3RyZWFtLT5nZXRCeXRlTGVmdCgpIDwgOCkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJmaWxlIGhlYWRlciB0b28gc2hvcnQuIik7Ci0gICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBpZihKQklHMl9tZW1jbXAobV9wU3RyZWFtLT5nZXRQb2ludGVyKCksIGZpbGVJRCwgOCkgIT0gMCkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJub3QgamJpZzIgZmlsZSIpOwotICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRklMRV9GT1JNQVQ7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBtX3BTdHJlYW0tPm9mZnNldCg4KTsKLSAgICBpZihtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY0ZsYWdzKSAhPSAwKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImZpbGUgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIGlmKCEoY0ZsYWdzICYgMHgwMikpIHsKLSAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmZHdUZW1wKSAhPSAwKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJmaWxlIGhlYWRlciB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoZHdUZW1wID4gMCkgewotICAgICAgICAgICAgZGVsZXRlIG1fcFBhZ2VJbmZvTGlzdDsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKG1fcFBhZ2VJbmZvTGlzdCwgQ0pCaWcyX0xpc3Q8SkJpZzJQYWdlSW5mbz4oZHdUZW1wKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoY0ZsYWdzICYgMHgwMSkgewotICAgICAgICBtX25TdHJlYW1UeXBlID0gSkJJRzJfU1FVRU5USUFMX1NUUkVBTTsKLSAgICAgICAgcmV0dXJuIGRlY29kZV9TcXVlbnRpYWxPcmduYXphdGlvbihwUGF1c2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fblN0cmVhbVR5cGUgPSBKQklHMl9SQU5ET01fU1RSRUFNOwotICAgICAgICByZXR1cm4gZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uX0ZpcnN0UGFnZShwUGF1c2UpOwotICAgIH0KLWZhaWxlZDoKLSAgICByZXR1cm4gblJldDsKK0NKQmlnMl9Db250ZXh0Ojp+Q0pCaWcyX0NvbnRleHQoKSB7CisgIGRlbGV0ZSBtX3BBcml0aERlY29kZXI7CisgIG1fcEFyaXRoRGVjb2RlciA9IE5VTEw7CisgIGRlbGV0ZSBtX3BHUkQ7CisgIG1fcEdSRCA9IE5VTEw7CisgIGlmIChtX2diQ29udGV4dCkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShtX2diQ29udGV4dCk7CisgIH0KKyAgbV9nYkNvbnRleHQgPSBOVUxMOworICBkZWxldGUgbV9wR2xvYmFsQ29udGV4dDsKKyAgbV9wR2xvYmFsQ29udGV4dCA9IE5VTEw7CisgIGRlbGV0ZSBtX3BQYWdlSW5mb0xpc3Q7CisgIG1fcFBhZ2VJbmZvTGlzdCA9IE5VTEw7CisgIGlmIChtX2JCdWZTcGVjaWZpZWQpIHsKKyAgICBkZWxldGUgbV9wUGFnZTsKKyAgfQorICBtX3BQYWdlID0gTlVMTDsKKyAgZGVsZXRlIG1fcFN0cmVhbTsKKyAgbV9wU3RyZWFtID0gTlVMTDsKKyAgZGVsZXRlIG1fcFNlZ21lbnRMaXN0OworICBtX3BTZWdtZW50TGlzdCA9IE5VTEw7CiB9Ci1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpkZWNvZGVfU3F1ZW50aWFsT3JnbmF6YXRpb24oSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaW50MzJfdCBuUmV0OwotICAgIGlmKG1fcFN0cmVhbS0+Z2V0Qnl0ZUxlZnQoKSA+IDApIHsKLSAgICAgICAgd2hpbGUobV9wU3RyZWFtLT5nZXRCeXRlTGVmdCgpID49IEpCSUcyX01JTl9TRUdNRU5UX1NJWkUpIHsKLSAgICAgICAgICAgIGlmKG1fcFNlZ21lbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKG1fcFNlZ21lbnQsIENKQmlnMl9TZWdtZW50KCkpOwotICAgICAgICAgICAgICAgIG5SZXQgPSBwYXJzZVNlZ21lbnRIZWFkZXIobV9wU2VnbWVudCk7Ci0gICAgICAgICAgICAgICAgaWYoblJldCAhPSBKQklHMl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtX3BTZWdtZW50OwotICAgICAgICAgICAgICAgICAgICBtX3BTZWdtZW50ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5SZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fZHdPZmZzZXQgPSBtX3BTdHJlYW0tPmdldE9mZnNldCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgblJldCA9IHBhcnNlU2VnbWVudERhdGEobV9wU2VnbWVudCwgcFBhdXNlKTsKLSAgICAgICAgICAgIGlmKG1fUHJvY2Vzc2l2ZVN0YXR1cyAgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgewotICAgICAgICAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgICAgICAgICAgbV9QYXVzZVN0ZXAgPSAyOwotICAgICAgICAgICAgICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKG5SZXQgPT0gSkJJRzJfRU5EX09GX1BBR0UpIHx8IChuUmV0ID09IEpCSUcyX0VORF9PRl9GSUxFKSkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBtX3BTZWdtZW50OwotICAgICAgICAgICAgICAgIG1fcFNlZ21lbnQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmKG5SZXQgIT0gSkJJRzJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBtX3BTZWdtZW50OwotICAgICAgICAgICAgICAgIG1fcFNlZ21lbnQgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBuUmV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wU2VnbWVudExpc3QtPmFkZEl0ZW0obV9wU2VnbWVudCk7Ci0gICAgICAgICAgICBpZihtX3BTZWdtZW50LT5tX2R3RGF0YV9sZW5ndGggIT0gMHhmZmZmZmZmZikgewotICAgICAgICAgICAgICAgIG1fZHdPZmZzZXQgPSBtX2R3T2Zmc2V0ICsgbV9wU2VnbWVudC0+bV9kd0RhdGFfbGVuZ3RoOwotICAgICAgICAgICAgICAgIG1fcFN0cmVhbS0+c2V0T2Zmc2V0KG1fZHdPZmZzZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX3BTdHJlYW0tPm9mZnNldCg0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE91dHB1dEJpdG1hcChtX3BQYWdlKTsKLSAgICAgICAgICAgIG1fcFNlZ21lbnQgPSBOVUxMOwotICAgICAgICAgICAgaWYobV9wU3RyZWFtLT5nZXRCeXRlTGVmdCgpID4gMCAmJiBtX3BQYWdlICYmIHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICAgICAgICAgIG1fUGF1c2VTdGVwID0gMjsKLSAgICAgICAgICAgICAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBKQklHMl9FTkRfT0ZfRklMRTsKK2ludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OmRlY29kZUZpbGUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgdWludDhfdCBjRmxhZ3M7CisgIEZYX0RXT1JEIGR3VGVtcDsKKyAgY29uc3QgdWludDhfdCBmaWxlSURbXSA9IHsweDk3LCAweDRBLCAweDQyLCAweDMyLCAweDBELCAweDBBLCAweDFBLCAweDBBfTsKKyAgaW50MzJfdCBuUmV0OworICBpZiAobV9wU3RyZWFtLT5nZXRCeXRlTGVmdCgpIDwgOCkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImZpbGUgaGVhZGVyIHRvbyBzaG9ydC4iKTsKKyAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICAgIGdvdG8gZmFpbGVkOworICB9CisgIGlmIChKQklHMl9tZW1jbXAobV9wU3RyZWFtLT5nZXRQb2ludGVyKCksIGZpbGVJRCwgOCkgIT0gMCkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIm5vdCBqYmlnMiBmaWxlIik7CisgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZJTEVfRk9STUFUOworICAgIGdvdG8gZmFpbGVkOworICB9CisgIG1fcFN0cmVhbS0+b2Zmc2V0KDgpOworICBpZiAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoJmNGbGFncykgIT0gMCkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImZpbGUgaGVhZGVyIHRvbyBzaG9ydC4iKTsKKyAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICAgIGdvdG8gZmFpbGVkOworICB9CisgIGlmICghKGNGbGFncyAmIDB4MDIpKSB7CisgICAgaWYgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJmR3VGVtcCkgIT0gMCkgeworICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiZmlsZSBoZWFkZXIgdG9vIHNob3J0LiIpOworICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgICAgIGdvdG8gZmFpbGVkOwogICAgIH0KLSAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLX0KLWludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OmRlY29kZV9FbWJlZE9yZ25hemF0aW9uKElGWF9QYXVzZSogcFBhdXNlKQoteworICAgIGlmIChkd1RlbXAgPiAwKSB7CisgICAgICBkZWxldGUgbV9wUGFnZUluZm9MaXN0OworICAgICAgSkJJRzJfQUxMT0MobV9wUGFnZUluZm9MaXN0LCBDSkJpZzJfTGlzdDxKQmlnMlBhZ2VJbmZvPihkd1RlbXApKTsKKyAgICB9CisgIH0KKyAgaWYgKGNGbGFncyAmIDB4MDEpIHsKKyAgICBtX25TdHJlYW1UeXBlID0gSkJJRzJfU1FVRU5USUFMX1NUUkVBTTsKICAgICByZXR1cm4gZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKHBQYXVzZSk7CisgIH0gZWxzZSB7CisgICAgbV9uU3RyZWFtVHlwZSA9IEpCSUcyX1JBTkRPTV9TVFJFQU07CisgICAgcmV0dXJuIGRlY29kZV9SYW5kb21PcmduYXphdGlvbl9GaXJzdFBhZ2UocFBhdXNlKTsKKyAgfQorZmFpbGVkOgorICByZXR1cm4gblJldDsKIH0KLWludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OmRlY29kZV9SYW5kb21PcmduYXphdGlvbl9GaXJzdFBhZ2UoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50OwotICAgIGludDMyX3QgblJldDsKLSAgICB3aGlsZShtX3BTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPiBKQklHMl9NSU5fU0VHTUVOVF9TSVpFKSB7Ci0gICAgICAgIEpCSUcyX0FMTE9DKHBTZWdtZW50LCBDSkJpZzJfU2VnbWVudCgpKTsKLSAgICAgICAgblJldCA9IHBhcnNlU2VnbWVudEhlYWRlcihwU2VnbWVudCk7Ci0gICAgICAgIGlmKG5SZXQgIT0gSkJJRzJfU1VDQ0VTUykgewotICAgICAgICAgICAgZGVsZXRlIHBTZWdtZW50OwotICAgICAgICAgICAgcmV0dXJuIG5SZXQ7Ci0gICAgICAgIH0gZWxzZSBpZihwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlID09IDUxKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFNlZ21lbnQ7Ci0gICAgICAgICAgICBicmVhazsKK2ludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OmRlY29kZV9TcXVlbnRpYWxPcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpbnQzMl90IG5SZXQ7CisgIGlmIChtX3BTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPiAwKSB7CisgICAgd2hpbGUgKG1fcFN0cmVhbS0+Z2V0Qnl0ZUxlZnQoKSA+PSBKQklHMl9NSU5fU0VHTUVOVF9TSVpFKSB7CisgICAgICBpZiAobV9wU2VnbWVudCA9PSBOVUxMKSB7CisgICAgICAgIEpCSUcyX0FMTE9DKG1fcFNlZ21lbnQsIENKQmlnMl9TZWdtZW50KCkpOworICAgICAgICBuUmV0ID0gcGFyc2VTZWdtZW50SGVhZGVyKG1fcFNlZ21lbnQpOworICAgICAgICBpZiAoblJldCAhPSBKQklHMl9TVUNDRVNTKSB7CisgICAgICAgICAgZGVsZXRlIG1fcFNlZ21lbnQ7CisgICAgICAgICAgbV9wU2VnbWVudCA9IE5VTEw7CisgICAgICAgICAgcmV0dXJuIG5SZXQ7CiAgICAgICAgIH0KLSAgICAgICAgbV9wU2VnbWVudExpc3QtPmFkZEl0ZW0ocFNlZ21lbnQpOwotICAgICAgICBpZihwUGF1c2UgJiYgbV9wUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX1BhdXNlU3RlcCA9IDM7Ci0gICAgICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9uU2VnbWVudERlY29kZWQgPSAwOwotICAgIHJldHVybiBkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb24ocFBhdXNlKTsKLX0KLWludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OmRlY29kZV9SYW5kb21PcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpbnQzMl90IG5SZXQ7Ci0gICAgZm9yKDsgbV9uU2VnbWVudERlY29kZWQgPCBtX3BTZWdtZW50TGlzdC0+Z2V0TGVuZ3RoKCk7IG1fblNlZ21lbnREZWNvZGVkKyspIHsKLSAgICAgICAgblJldCA9IHBhcnNlU2VnbWVudERhdGEobV9wU2VnbWVudExpc3QtPmdldEF0KG1fblNlZ21lbnREZWNvZGVkKSwgcFBhdXNlKTsKLSAgICAgICAgaWYoKG5SZXQgPT0gSkJJRzJfRU5EX09GX1BBR0UpIHx8IChuUmV0ID09IEpCSUcyX0VORF9PRl9GSUxFKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZihuUmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBuUmV0OwotICAgICAgICB9Ci0gICAgICAgIGlmKG1fcFBhZ2UgJiYgcFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgbV9QYXVzZVN0ZXAgPSA0OwotICAgICAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwotfQotaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6Z2V0Rmlyc3RQYWdlKHVpbnQ4X3QgKnBCdWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHN0cmlkZSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaW50MzJfdCBuUmV0ID0gMDsKLSAgICBpZihtX3BHbG9iYWxDb250ZXh0KSB7Ci0gICAgICAgIG5SZXQgPSBtX3BHbG9iYWxDb250ZXh0LT5kZWNvZGVfRW1iZWRPcmduYXphdGlvbihwUGF1c2UpOwotICAgICAgICBpZihuUmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgcmV0dXJuIG5SZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9iRmlyc3RQYWdlID0gVFJVRTsKLSAgICBtX1BhdXNlU3RlcCA9IDA7Ci0gICAgZGVsZXRlIG1fcFBhZ2U7Ci0gICAgSkJJRzJfQUxMT0MobV9wUGFnZSwgQ0pCaWcyX0ltYWdlKHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcEJ1ZikpOwotICAgIG1fYkJ1ZlNwZWNpZmllZCA9IFRSVUU7Ci0gICAgaWYobV9wUGFnZSAmJiBwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgIG1fUGF1c2VTdGVwID0gMTsKKyAgICAgICAgbV9kd09mZnNldCA9IG1fcFN0cmVhbS0+Z2V0T2Zmc2V0KCk7CisgICAgICB9CisgICAgICBuUmV0ID0gcGFyc2VTZWdtZW50RGF0YShtX3BTZWdtZW50LCBwUGF1c2UpOworICAgICAgaWYgKG1fUHJvY2Vzc2l2ZVN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7CiAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICAgIG1fUGF1c2VTdGVwID0gMjsKKyAgICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CisgICAgICB9CisgICAgICBpZiAoKG5SZXQgPT0gSkJJRzJfRU5EX09GX1BBR0UpIHx8IChuUmV0ID09IEpCSUcyX0VORF9PRl9GSUxFKSkgeworICAgICAgICBkZWxldGUgbV9wU2VnbWVudDsKKyAgICAgICAgbV9wU2VnbWVudCA9IE5VTEw7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIGlmIChuUmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKKyAgICAgICAgZGVsZXRlIG1fcFNlZ21lbnQ7CisgICAgICAgIG1fcFNlZ21lbnQgPSBOVUxMOwogICAgICAgICByZXR1cm4gblJldDsKKyAgICAgIH0KKyAgICAgIG1fcFNlZ21lbnRMaXN0LT5hZGRJdGVtKG1fcFNlZ21lbnQpOworICAgICAgaWYgKG1fcFNlZ21lbnQtPm1fZHdEYXRhX2xlbmd0aCAhPSAweGZmZmZmZmZmKSB7CisgICAgICAgIG1fZHdPZmZzZXQgPSBtX2R3T2Zmc2V0ICsgbV9wU2VnbWVudC0+bV9kd0RhdGFfbGVuZ3RoOworICAgICAgICBtX3BTdHJlYW0tPnNldE9mZnNldChtX2R3T2Zmc2V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDQpOworICAgICAgfQorICAgICAgT3V0cHV0Qml0bWFwKG1fcFBhZ2UpOworICAgICAgbV9wU2VnbWVudCA9IE5VTEw7CisgICAgICBpZiAobV9wU3RyZWFtLT5nZXRCeXRlTGVmdCgpID4gMCAmJiBtX3BQYWdlICYmIHBQYXVzZSAmJgorICAgICAgICAgIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgICBtX1BhdXNlU3RlcCA9IDI7CisgICAgICAgIHJldHVybiBKQklHMl9TVUNDRVNTOworICAgICAgfQogICAgIH0KLSAgICBpbnQgcmV0ID0gQ29udGludWUocFBhdXNlKTsKLSAgICByZXR1cm4gcmV0OworICB9IGVsc2UgeworICAgIHJldHVybiBKQklHMl9FTkRfT0ZfRklMRTsKKyAgfQorICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKIH0KLWludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWTsKLSAgICBpbnQzMl90IG5SZXQ7Ci0gICAgaWYobV9QYXVzZVN0ZXAgPD0gMSkgewotICAgICAgICBzd2l0Y2gobV9uU3RyZWFtVHlwZSkgewotICAgICAgICAgICAgY2FzZSBKQklHMl9GSUxFX1NUUkVBTToKLSAgICAgICAgICAgICAgICBuUmV0ID0gZGVjb2RlRmlsZShwUGF1c2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBKQklHMl9TUVVFTlRJQUxfU1RSRUFNOgotICAgICAgICAgICAgICAgIG5SZXQgPSBkZWNvZGVfU3F1ZW50aWFsT3JnbmF6YXRpb24ocFBhdXNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSkJJRzJfUkFORE9NX1NUUkVBTToKLSAgICAgICAgICAgICAgICBpZihtX2JGaXJzdFBhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgblJldCA9IGRlY29kZV9SYW5kb21PcmduYXphdGlvbl9GaXJzdFBhZ2UocFBhdXNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuUmV0ID0gZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uKHBQYXVzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBKQklHMl9FTUJFRF9TVFJFQU06Ci0gICAgICAgICAgICAgICAgblJldCA9IGRlY29kZV9FbWJlZE9yZ25hemF0aW9uKHBQYXVzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9TVFJFQU1fVFlQRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZihtX1BhdXNlU3RlcCA9PSAyKSB7CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpkZWNvZGVfRW1iZWRPcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSkgeworICByZXR1cm4gZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKHBQYXVzZSk7Cit9CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb25fRmlyc3RQYWdlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIENKQmlnMl9TZWdtZW50KiBwU2VnbWVudDsKKyAgaW50MzJfdCBuUmV0OworICB3aGlsZSAobV9wU3RyZWFtLT5nZXRCeXRlTGVmdCgpID4gSkJJRzJfTUlOX1NFR01FTlRfU0laRSkgeworICAgIEpCSUcyX0FMTE9DKHBTZWdtZW50LCBDSkJpZzJfU2VnbWVudCgpKTsKKyAgICBuUmV0ID0gcGFyc2VTZWdtZW50SGVhZGVyKHBTZWdtZW50KTsKKyAgICBpZiAoblJldCAhPSBKQklHMl9TVUNDRVNTKSB7CisgICAgICBkZWxldGUgcFNlZ21lbnQ7CisgICAgICByZXR1cm4gblJldDsKKyAgICB9IGVsc2UgaWYgKHBTZWdtZW50LT5tX2NGbGFncy5zLnR5cGUgPT0gNTEpIHsKKyAgICAgIGRlbGV0ZSBwU2VnbWVudDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX3BTZWdtZW50TGlzdC0+YWRkSXRlbShwU2VnbWVudCk7CisgICAgaWYgKHBQYXVzZSAmJiBtX3BQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgIG1fUGF1c2VTdGVwID0gMzsKKyAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKKyAgICB9CisgIH0KKyAgbV9uU2VnbWVudERlY29kZWQgPSAwOworICByZXR1cm4gZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uKHBQYXVzZSk7Cit9CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb24oSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaW50MzJfdCBuUmV0OworICBmb3IgKDsgbV9uU2VnbWVudERlY29kZWQgPCBtX3BTZWdtZW50TGlzdC0+Z2V0TGVuZ3RoKCk7IG1fblNlZ21lbnREZWNvZGVkKyspIHsKKyAgICBuUmV0ID0gcGFyc2VTZWdtZW50RGF0YShtX3BTZWdtZW50TGlzdC0+Z2V0QXQobV9uU2VnbWVudERlY29kZWQpLCBwUGF1c2UpOworICAgIGlmICgoblJldCA9PSBKQklHMl9FTkRfT0ZfUEFHRSkgfHwgKG5SZXQgPT0gSkJJRzJfRU5EX09GX0ZJTEUpKSB7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKG5SZXQgIT0gSkJJRzJfU1VDQ0VTUykgeworICAgICAgcmV0dXJuIG5SZXQ7CisgICAgfQorICAgIGlmIChtX3BQYWdlICYmIHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgIG1fUGF1c2VTdGVwID0gNDsKKyAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Cit9CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpnZXRGaXJzdFBhZ2UodWludDhfdCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGludDMyX3QgblJldCA9IDA7CisgIGlmIChtX3BHbG9iYWxDb250ZXh0KSB7CisgICAgblJldCA9IG1fcEdsb2JhbENvbnRleHQtPmRlY29kZV9FbWJlZE9yZ25hemF0aW9uKHBQYXVzZSk7CisgICAgaWYgKG5SZXQgIT0gSkJJRzJfU1VDQ0VTUykgeworICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgICByZXR1cm4gblJldDsKKyAgICB9CisgIH0KKyAgbV9iRmlyc3RQYWdlID0gVFJVRTsKKyAgbV9QYXVzZVN0ZXAgPSAwOworICBkZWxldGUgbV9wUGFnZTsKKyAgSkJJRzJfQUxMT0MobV9wUGFnZSwgQ0pCaWcyX0ltYWdlKHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcEJ1ZikpOworICBtX2JCdWZTcGVjaWZpZWQgPSBUUlVFOworICBpZiAobV9wUGFnZSAmJiBwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgbV9QYXVzZVN0ZXAgPSAxOworICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgcmV0dXJuIG5SZXQ7CisgIH0KKyAgaW50IHJldCA9IENvbnRpbnVlKHBQYXVzZSk7CisgIHJldHVybiByZXQ7Cit9CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFk7CisgIGludDMyX3QgblJldDsKKyAgaWYgKG1fUGF1c2VTdGVwIDw9IDEpIHsKKyAgICBzd2l0Y2ggKG1fblN0cmVhbVR5cGUpIHsKKyAgICAgIGNhc2UgSkJJRzJfRklMRV9TVFJFQU06CisgICAgICAgIG5SZXQgPSBkZWNvZGVGaWxlKHBQYXVzZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKQklHMl9TUVVFTlRJQUxfU1RSRUFNOgogICAgICAgICBuUmV0ID0gZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKHBQYXVzZSk7Ci0gICAgfSBlbHNlIGlmKG1fUGF1c2VTdGVwID09IDMpIHsKLSAgICAgICAgblJldCA9IGRlY29kZV9SYW5kb21PcmduYXphdGlvbl9GaXJzdFBhZ2UocFBhdXNlKTsKLSAgICB9IGVsc2UgaWYobV9QYXVzZVN0ZXAgPT0gNCkgewotICAgICAgICBuUmV0ID0gZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uKHBQYXVzZSk7Ci0gICAgfSBlbHNlIGlmKG1fUGF1c2VTdGVwID09IDUpIHsKLSAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci0gICAgfQotICAgIGlmKG1fUHJvY2Vzc2l2ZVN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgIHJldHVybiBuUmV0OwotICAgIH0KLSAgICBtX1BhdXNlU3RlcCA9IDU7Ci0gICAgaWYoIW1fYkJ1ZlNwZWNpZmllZCAmJiBuUmV0ID09IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci0gICAgfQotICAgIGlmKG5SZXQgPT0gSkJJRzJfU1VDQ0VTUykgewotICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKQklHMl9SQU5ET01fU1RSRUFNOgorICAgICAgICBpZiAobV9iRmlyc3RQYWdlKSB7CisgICAgICAgICAgblJldCA9IGRlY29kZV9SYW5kb21PcmduYXphdGlvbl9GaXJzdFBhZ2UocFBhdXNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuUmV0ID0gZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uKHBQYXVzZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEpCSUcyX0VNQkVEX1NUUkVBTToKKyAgICAgICAgblJldCA9IGRlY29kZV9FbWJlZE9yZ25hemF0aW9uKHBQYXVzZSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKICAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9TVFJFQU1fVFlQRTsKICAgICB9Ci0gICAgcmV0dXJuIG5SZXQ7Ci19Ci1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpnZXROZXh0UGFnZSh1aW50OF90ICpwQnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBzdHJpZGUsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGludDMyX3QgblJldCA9IEpCSUcyX0VSUk9SX1NUUkVBTV9UWVBFOwotICAgIG1fYkZpcnN0UGFnZSA9IEZBTFNFOwotICAgIG1fUGF1c2VTdGVwID0gMDsKLSAgICBkZWxldGUgbV9wUGFnZTsKLSAgICBKQklHMl9BTExPQyhtX3BQYWdlLCBDSkJpZzJfSW1hZ2Uod2lkdGgsIGhlaWdodCwgc3RyaWRlLCBwQnVmKSk7Ci0gICAgbV9iQnVmU3BlY2lmaWVkID0gVFJVRTsKLSAgICBpZihtX3BQYWdlICYmIHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgbV9QYXVzZVN0ZXAgPSAxOwotICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICByZXR1cm4gblJldDsKLSAgICB9Ci0gICAgcmV0dXJuIENvbnRpbnVlKHBQYXVzZSk7Ci0gICAgc3dpdGNoKG1fblN0cmVhbVR5cGUpIHsKLSAgICAgICAgY2FzZSBKQklHMl9GSUxFX1NUUkVBTToKLSAgICAgICAgICAgIG5SZXQgPSBkZWNvZGVGaWxlKHBQYXVzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKQklHMl9TUVVFTlRJQUxfU1RSRUFNOgotICAgICAgICAgICAgblJldCA9IGRlY29kZV9TcXVlbnRpYWxPcmduYXphdGlvbihwUGF1c2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSkJJRzJfUkFORE9NX1NUUkVBTToKLSAgICAgICAgICAgIG5SZXQgPSBkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb24ocFBhdXNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEpCSUcyX0VNQkVEX1NUUkVBTToKLSAgICAgICAgICAgIG5SZXQgPSBkZWNvZGVfRW1iZWRPcmduYXphdGlvbihwUGF1c2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfU1RSRUFNX1RZUEU7Ci0gICAgfQotICAgIHJldHVybiBuUmV0OwotfQotaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6Z2V0Rmlyc3RQYWdlKENKQmlnMl9JbWFnZSAqKmltYWdlLCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpbnQzMl90IG5SZXQ7Ci0gICAgbV9iRmlyc3RQYWdlID0gVFJVRTsKLSAgICBtX1BhdXNlU3RlcCA9IDA7Ci0gICAgaWYobV9wR2xvYmFsQ29udGV4dCkgewotICAgICAgICBuUmV0ID0gbV9wR2xvYmFsQ29udGV4dC0+ZGVjb2RlX0VtYmVkT3JnbmF6YXRpb24ocFBhdXNlKTsKLSAgICAgICAgaWYoblJldCAhPSBKQklHMl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICByZXR1cm4gblJldDsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX2JCdWZTcGVjaWZpZWQgPSBGQUxTRTsKLSAgICByZXR1cm4gQ29udGludWUocFBhdXNlKTsKLX0KLWludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OmdldE5leHRQYWdlKENKQmlnMl9JbWFnZSAqKmltYWdlLCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpbnQzMl90IG5SZXQ7Ci0gICAgbV9iQnVmU3BlY2lmaWVkID0gRkFMU0U7Ci0gICAgbV9iRmlyc3RQYWdlID0gRkFMU0U7Ci0gICAgbV9QYXVzZVN0ZXAgPSAwOwotICAgIHN3aXRjaChtX25TdHJlYW1UeXBlKSB7Ci0gICAgICAgIGNhc2UgSkJJRzJfRklMRV9TVFJFQU06Ci0gICAgICAgICAgICBuUmV0ID0gZGVjb2RlRmlsZShwUGF1c2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSkJJRzJfU1FVRU5USUFMX1NUUkVBTToKLSAgICAgICAgICAgIG5SZXQgPSBkZWNvZGVfU3F1ZW50aWFsT3JnbmF6YXRpb24ocFBhdXNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEpCSUcyX1JBTkRPTV9TVFJFQU06Ci0gICAgICAgICAgICBuUmV0ID0gZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uKHBQYXVzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKQklHMl9FTUJFRF9TVFJFQU06Ci0gICAgICAgICAgICBuUmV0ID0gZGVjb2RlX0VtYmVkT3JnbmF6YXRpb24ocFBhdXNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1NUUkVBTV9UWVBFOwotICAgIH0KLSAgICBpZihuUmV0ID09IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgKmltYWdlID0gbV9wUGFnZTsKLSAgICAgICAgbV9wUGFnZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwotICAgIH0KLSAgICByZXR1cm4gblJldDsKLX0KLUNKQmlnMl9TZWdtZW50ICpDSkJpZzJfQ29udGV4dDo6ZmluZFNlZ21lbnRCeU51bWJlcihGWF9EV09SRCBkd051bWJlcikKLXsKLSAgICBDSkJpZzJfU2VnbWVudCAqcFNlZzsKLSAgICBpbnQzMl90IGk7Ci0gICAgaWYobV9wR2xvYmFsQ29udGV4dCkgewotICAgICAgICBwU2VnID0gbV9wR2xvYmFsQ29udGV4dC0+ZmluZFNlZ21lbnRCeU51bWJlcihkd051bWJlcik7Ci0gICAgICAgIGlmKHBTZWcpIHsKLSAgICAgICAgICAgIHJldHVybiBwU2VnOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvcihpID0gMDsgaSA8IG1fcFNlZ21lbnRMaXN0LT5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIHBTZWcgPSBtX3BTZWdtZW50TGlzdC0+Z2V0QXQoaSk7Ci0gICAgICAgIGlmKHBTZWctPm1fZHdOdW1iZXIgPT0gZHdOdW1iZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBwU2VnOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotQ0pCaWcyX1NlZ21lbnQgKkNKQmlnMl9Db250ZXh0OjpmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgoQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LAotICAgICAgICB1aW50OF90IGNUeXBlLCBpbnQzMl90IG5JbmRleCkKLXsKLSAgICBDSkJpZzJfU2VnbWVudCAqcFNlZzsKLSAgICBpbnQzMl90IGksIGNvdW50OwotICAgIGNvdW50ID0gMDsKLSAgICBmb3IoaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgaSsrKSB7Ci0gICAgICAgIHBTZWcgPSBmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pOwotICAgICAgICBpZihwU2VnICYmIHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSBjVHlwZSkgewotICAgICAgICAgICAgaWYoY291bnQgPT0gbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBTZWc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VTZWdtZW50SGVhZGVyKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCkKLXsKLSAgICB1aW50OF90ICBjU1NpemUsIGNQU2l6ZTsKLSAgICB1aW50OF90IGNUZW1wOwotICAgIEZYX1dPUkQgd1RlbXA7Ci0gICAgRlhfRFdPUkQgZHdUZW1wOwotICAgIGlmKChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwU2VnbWVudC0+bV9kd051bWJlcikgIT0gMCkKLSAgICAgICAgICAgIHx8IChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmcFNlZ21lbnQtPm1fY0ZsYWdzLmMpICE9IDApKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBjVGVtcCA9IG1fcFN0cmVhbS0+Z2V0Q3VyQnl0ZSgpOwotICAgIGlmKChjVGVtcCA+PiA1KSA9PSA3KSB7Ci0gICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoKEZYX0RXT1JEKikmcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQpICE9IDApIHsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ICY9IDB4MWZmZmZmZmY7Ci0gICAgICAgIGlmIChwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCA+IEpCSUcyX01BWF9SRUZFUlJFRF9TRUdNRU5UX0NPVU5UKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJUb28gbWFueSByZWZlcnJlZCBzZWdtZW50cy4iKTsKLSAgICAgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9MSU1JVDsKLSAgICAgICAgfQotICAgICAgICBkd1RlbXAgPSA1ICsgNCArIChwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCArIDEpIC8gODsKLSAgICB9IGVsc2UgewotICAgICAgICBpZihtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY1RlbXApICE9IDApIHsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ID0gY1RlbXAgPj4gNTsKLSAgICAgICAgZHdUZW1wID0gNSArIDE7Ci0gICAgfQotICAgIGNTU2l6ZSA9IHBTZWdtZW50LT5tX2R3TnVtYmVyID4gNjU1MzYgPyA0IDogcFNlZ21lbnQtPm1fZHdOdW1iZXIgPiAyNTYgPyAyIDogMTsKLSAgICBjUFNpemUgPSBwU2VnbWVudC0+bV9jRmxhZ3Mucy5wYWdlX2Fzc29jaWF0aW9uX3NpemUgPyA0IDogMTsKLSAgICBpZihwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCkgewotICAgICAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzID0gKEZYX0RXT1JEKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9EV09SRCksIHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50KTsKLSAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBzd2l0Y2goY1NTaXplKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBpZihtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY1RlbXApICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0gPSBjVGVtcDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBpZihtX3BTdHJlYW0tPnJlYWRTaG9ydEludGVnZXIoJndUZW1wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID0gd1RlbXA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmZHdUZW1wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID0gZHdUZW1wOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID49IHBTZWdtZW50LT5tX2R3TnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiVGhlIHJlZmVycmVkIHNlZ21lbnQgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHNlZ21lbnQgbnVtYmVyLiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKGNQU2l6ZSA9PSAxKSB7Ci0gICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjVGVtcCkgIT0gMCkgewotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcFNlZ21lbnQtPm1fZHdQYWdlX2Fzc29jaWF0aW9uID0gY1RlbXA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFNlZ21lbnQtPm1fZHdQYWdlX2Fzc29jaWF0aW9uKSAhPSAwKSB7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwU2VnbWVudC0+bV9kd0RhdGFfbGVuZ3RoKSAhPSAwKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBwU2VnbWVudC0+bV9wRGF0YSA9IG1fcFN0cmVhbS0+Z2V0UG9pbnRlcigpOwotICAgIHBTZWdtZW50LT5tX1N0YXRlID0gSkJJRzJfU0VHTUVOVF9EQVRBX1VOUEFSU0VEOworICB9IGVsc2UgaWYgKG1fUGF1c2VTdGVwID09IDIpIHsKKyAgICBuUmV0ID0gZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKHBQYXVzZSk7CisgIH0gZWxzZSBpZiAobV9QYXVzZVN0ZXAgPT0gMykgeworICAgIG5SZXQgPSBkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb25fRmlyc3RQYWdlKHBQYXVzZSk7CisgIH0gZWxzZSBpZiAobV9QYXVzZVN0ZXAgPT0gNCkgeworICAgIG5SZXQgPSBkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb24ocFBhdXNlKTsKKyAgfSBlbHNlIGlmIChtX1BhdXNlU3RlcCA9PSA1KSB7CisgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKICAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLWZhaWxlZDoKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJoZWFkZXIgdG9vIHNob3J0LiIpOwotICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisgIH0KKyAgaWYgKG1fUHJvY2Vzc2l2ZVN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7CisgICAgcmV0dXJuIG5SZXQ7CisgIH0KKyAgbV9QYXVzZVN0ZXAgPSA1OworICBpZiAoIW1fYkJ1ZlNwZWNpZmllZCAmJiBuUmV0ID09IEpCSUcyX1NVQ0NFU1MpIHsKKyAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICAgIHJldHVybiBKQklHMl9TVUNDRVNTOworICB9CisgIGlmIChuUmV0ID09IEpCSUcyX1NVQ0NFU1MpIHsKKyAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICB9IGVsc2UgeworICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICB9CisgIHJldHVybiBuUmV0OwogfQotaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VTZWdtZW50RGF0YShDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGludDMyX3QgcmV0ID0gUHJvY2Vzc2l2ZVBhcnNlU2VnbWVudERhdGEocFNlZ21lbnQsIHBQYXVzZSk7Ci0gICAgd2hpbGUobV9Qcm9jZXNzaXZlU3RhdHVzICA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFICYmIG1fcFN0cmVhbS0+Z2V0Qnl0ZUxlZnQoKSA+IDApIHsKLSAgICAgICAgcmV0ID0gUHJvY2Vzc2l2ZVBhcnNlU2VnbWVudERhdGEocFNlZ21lbnQsIHBQYXVzZSk7CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpnZXROZXh0UGFnZSh1aW50OF90KiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpbnQzMl90IG5SZXQgPSBKQklHMl9FUlJPUl9TVFJFQU1fVFlQRTsKKyAgbV9iRmlyc3RQYWdlID0gRkFMU0U7CisgIG1fUGF1c2VTdGVwID0gMDsKKyAgZGVsZXRlIG1fcFBhZ2U7CisgIEpCSUcyX0FMTE9DKG1fcFBhZ2UsIENKQmlnMl9JbWFnZSh3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHBCdWYpKTsKKyAgbV9iQnVmU3BlY2lmaWVkID0gVFJVRTsKKyAgaWYgKG1fcFBhZ2UgJiYgcFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgIG1fUGF1c2VTdGVwID0gMTsKKyAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgIHJldHVybiBuUmV0OworICB9CisgIHJldHVybiBDb250aW51ZShwUGF1c2UpOworICBzd2l0Y2ggKG1fblN0cmVhbVR5cGUpIHsKKyAgICBjYXNlIEpCSUcyX0ZJTEVfU1RSRUFNOgorICAgICAgblJldCA9IGRlY29kZUZpbGUocFBhdXNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSkJJRzJfU1FVRU5USUFMX1NUUkVBTToKKyAgICAgIG5SZXQgPSBkZWNvZGVfU3F1ZW50aWFsT3JnbmF6YXRpb24ocFBhdXNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSkJJRzJfUkFORE9NX1NUUkVBTToKKyAgICAgIG5SZXQgPSBkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb24ocFBhdXNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSkJJRzJfRU1CRURfU1RSRUFNOgorICAgICAgblJldCA9IGRlY29kZV9FbWJlZE9yZ25hemF0aW9uKHBQYXVzZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1NUUkVBTV9UWVBFOworICB9CisgIHJldHVybiBuUmV0OworfQoraW50MzJfdCBDSkJpZzJfQ29udGV4dDo6Z2V0Rmlyc3RQYWdlKENKQmlnMl9JbWFnZSoqIGltYWdlLCBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpbnQzMl90IG5SZXQ7CisgIG1fYkZpcnN0UGFnZSA9IFRSVUU7CisgIG1fUGF1c2VTdGVwID0gMDsKKyAgaWYgKG1fcEdsb2JhbENvbnRleHQpIHsKKyAgICBuUmV0ID0gbV9wR2xvYmFsQ29udGV4dC0+ZGVjb2RlX0VtYmVkT3JnbmF6YXRpb24ocFBhdXNlKTsKKyAgICBpZiAoblJldCAhPSBKQklHMl9TVUNDRVNTKSB7CisgICAgICByZXR1cm4gblJldDsKICAgICB9Ci0gICAgcmV0dXJuIHJldDsKKyAgfQorICBtX2JCdWZTcGVjaWZpZWQgPSBGQUxTRTsKKyAgcmV0dXJuIENvbnRpbnVlKHBQYXVzZSk7CiB9Ci1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpQcm9jZXNzaXZlUGFyc2VTZWdtZW50RGF0YShDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIHN3aXRjaChwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiBwYXJzZVN5bWJvbERpY3QocFNlZ21lbnQsIHBQYXVzZSk7CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpnZXROZXh0UGFnZShDSkJpZzJfSW1hZ2UqKiBpbWFnZSwgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaW50MzJfdCBuUmV0OworICBtX2JCdWZTcGVjaWZpZWQgPSBGQUxTRTsKKyAgbV9iRmlyc3RQYWdlID0gRkFMU0U7CisgIG1fUGF1c2VTdGVwID0gMDsKKyAgc3dpdGNoIChtX25TdHJlYW1UeXBlKSB7CisgICAgY2FzZSBKQklHMl9GSUxFX1NUUkVBTToKKyAgICAgIG5SZXQgPSBkZWNvZGVGaWxlKHBQYXVzZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEpCSUcyX1NRVUVOVElBTF9TVFJFQU06CisgICAgICBuUmV0ID0gZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKHBQYXVzZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEpCSUcyX1JBTkRPTV9TVFJFQU06CisgICAgICBuUmV0ID0gZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uKHBQYXVzZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEpCSUcyX0VNQkVEX1NUUkVBTToKKyAgICAgIG5SZXQgPSBkZWNvZGVfRW1iZWRPcmduYXphdGlvbihwUGF1c2UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBKQklHMl9FUlJPUl9TVFJFQU1fVFlQRTsKKyAgfQorICBpZiAoblJldCA9PSBKQklHMl9TVUNDRVNTKSB7CisgICAgKmltYWdlID0gbV9wUGFnZTsKKyAgICBtX3BQYWdlID0gTlVMTDsKKyAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKKyAgfQorICByZXR1cm4gblJldDsKK30KK0NKQmlnMl9TZWdtZW50KiBDSkJpZzJfQ29udGV4dDo6ZmluZFNlZ21lbnRCeU51bWJlcihGWF9EV09SRCBkd051bWJlcikgeworICBDSkJpZzJfU2VnbWVudCogcFNlZzsKKyAgaW50MzJfdCBpOworICBpZiAobV9wR2xvYmFsQ29udGV4dCkgeworICAgIHBTZWcgPSBtX3BHbG9iYWxDb250ZXh0LT5maW5kU2VnbWVudEJ5TnVtYmVyKGR3TnVtYmVyKTsKKyAgICBpZiAocFNlZykgeworICAgICAgcmV0dXJuIHBTZWc7CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCBtX3BTZWdtZW50TGlzdC0+Z2V0TGVuZ3RoKCk7IGkrKykgeworICAgIHBTZWcgPSBtX3BTZWdtZW50TGlzdC0+Z2V0QXQoaSk7CisgICAgaWYgKHBTZWctPm1fZHdOdW1iZXIgPT0gZHdOdW1iZXIpIHsKKyAgICAgIHJldHVybiBwU2VnOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KK0NKQmlnMl9TZWdtZW50KiBDSkJpZzJfQ29udGV4dDo6ZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KAorICAgIENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwKKyAgICB1aW50OF90IGNUeXBlLAorICAgIGludDMyX3QgbkluZGV4KSB7CisgIENKQmlnMl9TZWdtZW50KiBwU2VnOworICBpbnQzMl90IGksIGNvdW50OworICBjb3VudCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgaSsrKSB7CisgICAgcFNlZyA9IGZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSk7CisgICAgaWYgKHBTZWcgJiYgcFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IGNUeXBlKSB7CisgICAgICBpZiAoY291bnQgPT0gbkluZGV4KSB7CisgICAgICAgIHJldHVybiBwU2VnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVNlZ21lbnRIZWFkZXIoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50KSB7CisgIHVpbnQ4X3QgY1NTaXplLCBjUFNpemU7CisgIHVpbnQ4X3QgY1RlbXA7CisgIEZYX1dPUkQgd1RlbXA7CisgIEZYX0RXT1JEIGR3VGVtcDsKKyAgaWYgKChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwU2VnbWVudC0+bV9kd051bWJlcikgIT0gMCkgfHwKKyAgICAgIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmcFNlZ21lbnQtPm1fY0ZsYWdzLmMpICE9IDApKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgY1RlbXAgPSBtX3BTdHJlYW0tPmdldEN1ckJ5dGUoKTsKKyAgaWYgKChjVGVtcCA+PiA1KSA9PSA3KSB7CisgICAgaWYgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoCisgICAgICAgICAgICAoRlhfRFdPUkQqKSZwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCkgIT0gMCkgeworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ICY9IDB4MWZmZmZmZmY7CisgICAgaWYgKHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ID4KKyAgICAgICAgSkJJRzJfTUFYX1JFRkVSUkVEX1NFR01FTlRfQ09VTlQpIHsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIlRvbyBtYW55IHJlZmVycmVkIHNlZ21lbnRzLiIpOworICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0xJTUlUOworICAgIH0KKyAgICBkd1RlbXAgPSA1ICsgNCArIChwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCArIDEpIC8gODsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoJmNUZW1wKSAhPSAwKSB7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQgPSBjVGVtcCA+PiA1OworICAgIGR3VGVtcCA9IDUgKyAxOworICB9CisgIGNTU2l6ZSA9CisgICAgICBwU2VnbWVudC0+bV9kd051bWJlciA+IDY1NTM2ID8gNCA6IHBTZWdtZW50LT5tX2R3TnVtYmVyID4gMjU2ID8gMiA6IDE7CisgIGNQU2l6ZSA9IHBTZWdtZW50LT5tX2NGbGFncy5zLnBhZ2VfYXNzb2NpYXRpb25fc2l6ZSA/IDQgOiAxOworICBpZiAocFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQpIHsKKyAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzID0KKyAgICAgICAgKEZYX0RXT1JEKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoCisgICAgICAgICAgICBzaXplb2YoRlhfRFdPUkQpLCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7IGkrKykgeworICAgICAgc3dpdGNoIChjU1NpemUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGlmIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY1RlbXApICE9IDApIHsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgIH0KKyAgICAgICAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID0gY1RlbXA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBpZiAobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZ3VGVtcCkgIT0gMCkgeworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgICAgIHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0gPSB3VGVtcDsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA0OgotICAgICAgICBjYXNlIDY6Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgIGlmKG1fblN0YXRlID09IEpCSUcyX09VVF9PRl9QQUdFKSB7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VUZXh0UmVnaW9uKHBTZWdtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHJldHVybiBwYXJzZVBhdHRlcm5EaWN0KHBTZWdtZW50LCBwUGF1c2UpOwotICAgICAgICBjYXNlIDIwOgotICAgICAgICBjYXNlIDIyOgotICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgaWYobV9uU3RhdGUgPT0gSkJJRzJfT1VUX09GX1BBR0UpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUhhbGZ0b25lUmVnaW9uKHBTZWdtZW50LCBwUGF1c2UpOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIDM2OgotICAgICAgICBjYXNlIDM4OgotICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgaWYobV9uU3RhdGUgPT0gSkJJRzJfT1VUX09GX1BBR0UpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUdlbmVyaWNSZWdpb24ocFNlZ21lbnQsIHBQYXVzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDA6Ci0gICAgICAgIGNhc2UgNDI6Ci0gICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICBpZihtX25TdGF0ZSA9PSBKQklHMl9PVVRfT0ZfUEFHRSkgewotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkMjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24ocFNlZ21lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIDQ4OiB7Ci0gICAgICAgICAgICAgICAgRlhfV09SRCB3VGVtcDsKLSAgICAgICAgICAgICAgICBKQmlnMlBhZ2VJbmZvICpwUGFnZUluZm87Ci0gICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MocFBhZ2VJbmZvLCBKQmlnMlBhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICBpZigobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFBhZ2VJbmZvLT5tX2R3V2lkdGgpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFBhZ2VJbmZvLT5tX2R3SGVpZ2h0KSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBQYWdlSW5mby0+bV9kd1Jlc29sdXRpb25YKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBQYWdlSW5mby0+bV9kd1Jlc29sdXRpb25ZKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZwUGFnZUluZm8tPm1fY0ZsYWdzKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmd1RlbXApICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwUGFnZUluZm87Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgPSAoKHdUZW1wID4+IDE1KSAmIDEpID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgcFBhZ2VJbmZvLT5tX3dNYXhTdHJpcGVTaXplID0gd1RlbXAgJiAweDdmZmY7Ci0gICAgICAgICAgICAgICAgaWYoKHBQYWdlSW5mby0+bV9kd0hlaWdodCA9PSAweGZmZmZmZmZmKSAmJiAocFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgIT0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9XYXJuKCJwYWdlIGhlaWdodCA9IDB4ZmZmZmZmZmYgYnVmIHN0cmlwZSBmaWVsZCBpcyAwIik7Ci0gICAgICAgICAgICAgICAgICAgIHBQYWdlSW5mby0+bV9iSXNTdHJpcGVkID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIW1fYkJ1ZlNwZWNpZmllZCkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGUgbV9wUGFnZTsKLSAgICAgICAgICAgICAgICAgICAgaWYocFBhZ2VJbmZvLT5tX2R3SGVpZ2h0ID09IDB4ZmZmZmZmZmYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKG1fcFBhZ2UsIENKQmlnMl9JbWFnZShwUGFnZUluZm8tPm1fZHdXaWR0aCwgcFBhZ2VJbmZvLT5tX3dNYXhTdHJpcGVTaXplKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhtX3BQYWdlLCBDSkJpZzJfSW1hZ2UocFBhZ2VJbmZvLT5tX2R3V2lkdGgsIHBQYWdlSW5mby0+bV9kd0hlaWdodCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcFBhZ2UtPmZpbGwoKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKLSAgICAgICAgICAgICAgICBtX3BQYWdlSW5mb0xpc3QtPmFkZEl0ZW0ocFBhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICBtX25TdGF0ZSA9IEpCSUcyX0lOX1BBR0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OToKLSAgICAgICAgICAgIG1fblN0YXRlID0gSkJJRzJfT1VUX09GX1BBR0U7Ci0gICAgICAgICAgICByZXR1cm4gSkJJRzJfRU5EX09GX1BBR0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KHBTZWdtZW50LT5tX2R3RGF0YV9sZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICByZXR1cm4gSkJJRzJfRU5EX09GX0ZJTEU7Ci0gICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICBtX3BTdHJlYW0tPm9mZnNldChwU2VnbWVudC0+bV9kd0RhdGFfbGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGFibGUocFNlZ21lbnQpOwotICAgICAgICBjYXNlIDYyOgotICAgICAgICAgICAgbV9wU3RyZWFtLT5vZmZzZXQocFNlZ21lbnQtPm1fZHdEYXRhX2xlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZkd1RlbXApICE9IDApIHsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgIH0KKyAgICAgICAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID0gZHdUZW1wOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0gPj0gcFNlZ21lbnQtPm1fZHdOdW1iZXIpIHsKKyAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICJUaGUgcmVmZXJyZWQgc2VnbWVudCBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIHRoaXMgc2VnbWVudCBudW1iZXIuIik7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKKyAgfQorICBpZiAoY1BTaXplID09IDEpIHsKKyAgICBpZiAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoJmNUZW1wKSAhPSAwKSB7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgcFNlZ21lbnQtPm1fZHdQYWdlX2Fzc29jaWF0aW9uID0gY1RlbXA7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBTZWdtZW50LT5tX2R3UGFnZV9hc3NvY2lhdGlvbikgIT0gMCkgeworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICB9CisgIGlmIChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwU2VnbWVudC0+bV9kd0RhdGFfbGVuZ3RoKSAhPSAwKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgcFNlZ21lbnQtPm1fcERhdGEgPSBtX3BTdHJlYW0tPmdldFBvaW50ZXIoKTsKKyAgcFNlZ21lbnQtPm1fU3RhdGUgPSBKQklHMl9TRUdNRU5UX0RBVEFfVU5QQVJTRUQ7CisgIHJldHVybiBKQklHMl9TVUNDRVNTOworZmFpbGVkOgorICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJoZWFkZXIgdG9vIHNob3J0LiIpOworICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworfQoraW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VTZWdtZW50RGF0YShDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGludDMyX3QgcmV0ID0gUHJvY2Vzc2l2ZVBhcnNlU2VnbWVudERhdGEocFNlZ21lbnQsIHBQYXVzZSk7CisgIHdoaWxlIChtX1Byb2Nlc3NpdmVTdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSAmJgorICAgICAgICAgbV9wU3RyZWFtLT5nZXRCeXRlTGVmdCgpID4gMCkgeworICAgIHJldCA9IFByb2Nlc3NpdmVQYXJzZVNlZ21lbnREYXRhKHBTZWdtZW50LCBwUGF1c2UpOworICB9CisgIHJldHVybiByZXQ7Cit9CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpQcm9jZXNzaXZlUGFyc2VTZWdtZW50RGF0YShDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBzd2l0Y2ggKHBTZWdtZW50LT5tX2NGbGFncy5zLnR5cGUpIHsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gcGFyc2VTeW1ib2xEaWN0KHBTZWdtZW50LCBwUGF1c2UpOworICAgIGNhc2UgNDoKKyAgICBjYXNlIDY6CisgICAgY2FzZSA3OgorICAgICAgaWYgKG1fblN0YXRlID09IEpCSUcyX09VVF9PRl9QQUdFKSB7CisgICAgICAgIGdvdG8gZmFpbGVkMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwYXJzZVRleHRSZWdpb24ocFNlZ21lbnQpOworICAgICAgfQorICAgIGNhc2UgMTY6CisgICAgICByZXR1cm4gcGFyc2VQYXR0ZXJuRGljdChwU2VnbWVudCwgcFBhdXNlKTsKKyAgICBjYXNlIDIwOgorICAgIGNhc2UgMjI6CisgICAgY2FzZSAyMzoKKyAgICAgIGlmIChtX25TdGF0ZSA9PSBKQklHMl9PVVRfT0ZfUEFHRSkgeworICAgICAgICBnb3RvIGZhaWxlZDI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcGFyc2VIYWxmdG9uZVJlZ2lvbihwU2VnbWVudCwgcFBhdXNlKTsKKyAgICAgIH0KKyAgICBjYXNlIDM2OgorICAgIGNhc2UgMzg6CisgICAgY2FzZSAzOToKKyAgICAgIGlmIChtX25TdGF0ZSA9PSBKQklHMl9PVVRfT0ZfUEFHRSkgeworICAgICAgICBnb3RvIGZhaWxlZDI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcGFyc2VHZW5lcmljUmVnaW9uKHBTZWdtZW50LCBwUGF1c2UpOworICAgICAgfQorICAgIGNhc2UgNDA6CisgICAgY2FzZSA0MjoKKyAgICBjYXNlIDQzOgorICAgICAgaWYgKG1fblN0YXRlID09IEpCSUcyX09VVF9PRl9QQUdFKSB7CisgICAgICAgIGdvdG8gZmFpbGVkMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwYXJzZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uKHBTZWdtZW50KTsKKyAgICAgIH0KKyAgICBjYXNlIDQ4OiB7CisgICAgICBGWF9XT1JEIHdUZW1wOworICAgICAgSkJpZzJQYWdlSW5mbyogcFBhZ2VJbmZvOworICAgICAgSkJJRzJfQUxMT0MocFBhZ2VJbmZvLCBKQmlnMlBhZ2VJbmZvKTsKKyAgICAgIGlmICgobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFBhZ2VJbmZvLT5tX2R3V2lkdGgpICE9IDApIHx8CisgICAgICAgICAgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBQYWdlSW5mby0+bV9kd0hlaWdodCkgIT0gMCkgfHwKKyAgICAgICAgICAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFBhZ2VJbmZvLT5tX2R3UmVzb2x1dGlvblgpICE9IDApIHx8CisgICAgICAgICAgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBQYWdlSW5mby0+bV9kd1Jlc29sdXRpb25ZKSAhPSAwKSB8fAorICAgICAgICAgIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmcFBhZ2VJbmZvLT5tX2NGbGFncykgIT0gMCkgfHwKKyAgICAgICAgICAobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZ3VGVtcCkgIT0gMCkpIHsKKyAgICAgICAgZGVsZXRlIHBQYWdlSW5mbzsKKyAgICAgICAgZ290byBmYWlsZWQxOworICAgICAgfQorICAgICAgcFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgPSAoKHdUZW1wID4+IDE1KSAmIDEpID8gMSA6IDA7CisgICAgICBwUGFnZUluZm8tPm1fd01heFN0cmlwZVNpemUgPSB3VGVtcCAmIDB4N2ZmZjsKKyAgICAgIGlmICgocFBhZ2VJbmZvLT5tX2R3SGVpZ2h0ID09IDB4ZmZmZmZmZmYpICYmCisgICAgICAgICAgKHBQYWdlSW5mby0+bV9iSXNTdHJpcGVkICE9IDEpKSB7CisgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfV2FybigicGFnZSBoZWlnaHQgPSAweGZmZmZmZmZmIGJ1ZiBzdHJpcGUgZmllbGQgaXMgMCIpOworICAgICAgICBwUGFnZUluZm8tPm1fYklzU3RyaXBlZCA9IDE7CisgICAgICB9CisgICAgICBpZiAoIW1fYkJ1ZlNwZWNpZmllZCkgeworICAgICAgICBkZWxldGUgbV9wUGFnZTsKKyAgICAgICAgaWYgKHBQYWdlSW5mby0+bV9kd0hlaWdodCA9PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgSkJJRzJfQUxMT0MobV9wUGFnZSwgQ0pCaWcyX0ltYWdlKHBQYWdlSW5mby0+bV9kd1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFnZUluZm8tPm1fd01heFN0cmlwZVNpemUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBKQklHMl9BTExPQyhtX3BQYWdlLCBDSkJpZzJfSW1hZ2UocFBhZ2VJbmZvLT5tX2R3V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWdlSW5mby0+bV9kd0hlaWdodCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBtX3BQYWdlLT5maWxsKChwUGFnZUluZm8tPm1fY0ZsYWdzICYgNCkgPyAxIDogMCk7CisgICAgICBtX3BQYWdlSW5mb0xpc3QtPmFkZEl0ZW0ocFBhZ2VJbmZvKTsKKyAgICAgIG1fblN0YXRlID0gSkJJRzJfSU5fUEFHRTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgNDk6CisgICAgICBtX25TdGF0ZSA9IEpCSUcyX09VVF9PRl9QQUdFOworICAgICAgcmV0dXJuIEpCSUcyX0VORF9PRl9QQUdFOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1MDoKKyAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KHBTZWdtZW50LT5tX2R3RGF0YV9sZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1MToKKyAgICAgIHJldHVybiBKQklHMl9FTkRfT0ZfRklMRTsKKyAgICBjYXNlIDUyOgorICAgICAgbV9wU3RyZWFtLT5vZmZzZXQocFNlZ21lbnQtPm1fZHdEYXRhX2xlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDUzOgorICAgICAgcmV0dXJuIHBhcnNlVGFibGUocFNlZ21lbnQpOworICAgIGNhc2UgNjI6CisgICAgICBtX3BTdHJlYW0tPm9mZnNldChwU2VnbWVudC0+bV9kd0RhdGFfbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKIGZhaWxlZDE6Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic2VnbWVudCBkYXRhIHRvbyBzaG9ydC4iKTsKLSAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzZWdtZW50IGRhdGEgdG9vIHNob3J0LiIpOworICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwogZmFpbGVkMjoKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzZWdtZW50IHN5bnRheCBlcnJvci4iKTsKLSAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInNlZ21lbnQgc3ludGF4IGVycm9yLiIpOworICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CiB9Ci1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVN5bWJvbERpY3QoQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9EV09SRCBkd1RlbXA7Ci0gICAgRlhfV09SRCB3RmxhZ3M7Ci0gICAgdWludDhfdCBjU0RIVUZGREgsIGNTREhVRkZEVywgY1NESFVGRkJNU0laRSwgY1NESFVGRkFHR0lOU1Q7Ci0gICAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSAqVGFibGVfQjEgPSBOVUxMLCAqVGFibGVfQjIgPSBOVUxMLCAqVGFibGVfQjMgPSBOVUxMLCAqVGFibGVfQjQgPSBOVUxMLCAqVGFibGVfQjUgPSBOVUxMOwotICAgIGludDMyX3QgaSwgbkluZGV4LCBuUmV0OwotICAgIENKQmlnMl9TZWdtZW50ICpwU2VnID0gTlVMTCwgKnBMUlNlZyA9IE5VTEw7Ci0gICAgRlhfQk9PTCBiVXNlZDsKLSAgICBDSkJpZzJfSW1hZ2UgKiogU0RJTlNZTVMgPSBOVUxMOwotICAgIENKQmlnMl9TRERQcm9jICpwU3ltYm9sRGljdERlY29kZXI7Ci0gICAgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0ID0gTlVMTCwgKmdyQ29udGV4dCA9IE5VTEw7Ci0gICAgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlcjsKLSAgICBKQklHMl9BTExPQyhwU3ltYm9sRGljdERlY29kZXIsIENKQmlnMl9TRERQcm9jKCkpOwotICAgIHVpbnQ4X3QgKmtleSA9IHBTZWdtZW50LT5tX3BEYXRhOwotICAgIEZYX0JPT0wgY2FjaGVfaGl0ID0gZmFsc2U7Ci0gICAgaWYobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZ3RmxhZ3MpICE9IDApIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKK2ludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OnBhcnNlU3ltYm9sRGljdChDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfRFdPUkQgZHdUZW1wOworICBGWF9XT1JEIHdGbGFnczsKKyAgdWludDhfdCBjU0RIVUZGREgsIGNTREhVRkZEVywgY1NESFVGRkJNU0laRSwgY1NESFVGRkFHR0lOU1Q7CisgIENKQmlnMl9IdWZmbWFuVGFibGUgKlRhYmxlX0IxID0gTlVMTCwgKlRhYmxlX0IyID0gTlVMTCwgKlRhYmxlX0IzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAqVGFibGVfQjQgPSBOVUxMLCAqVGFibGVfQjUgPSBOVUxMOworICBpbnQzMl90IGksIG5JbmRleCwgblJldDsKKyAgQ0pCaWcyX1NlZ21lbnQgKnBTZWcgPSBOVUxMLCAqcExSU2VnID0gTlVMTDsKKyAgRlhfQk9PTCBiVXNlZDsKKyAgQ0pCaWcyX0ltYWdlKiogU0RJTlNZTVMgPSBOVUxMOworICBDSkJpZzJfU0REUHJvYyogcFN5bWJvbERpY3REZWNvZGVyOworICBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQgPSBOVUxMLCAqZ3JDb250ZXh0ID0gTlVMTDsKKyAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlcjsKKyAgSkJJRzJfQUxMT0MocFN5bWJvbERpY3REZWNvZGVyLCBDSkJpZzJfU0REUHJvYygpKTsKKyAgdWludDhfdCoga2V5ID0gcFNlZ21lbnQtPm1fcERhdGE7CisgIEZYX0JPT0wgY2FjaGVfaGl0ID0gZmFsc2U7CisgIGlmIChtX3BTdHJlYW0tPnJlYWRTaG9ydEludGVnZXIoJndGbGFncykgIT0gMCkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICJzeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOworICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkYgPSB3RmxhZ3MgJiAweDAwMDE7CisgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSRUZBR0cgPSAod0ZsYWdzID4+IDEpICYgMHgwMDAxOworICBwU3ltYm9sRGljdERlY29kZXItPlNEVEVNUExBVEUgPSAod0ZsYWdzID4+IDEwKSAmIDB4MDAwMzsKKyAgcFN5bWJvbERpY3REZWNvZGVyLT5TRFJURU1QTEFURSA9ICh3RmxhZ3MgPj4gMTIpICYgMHgwMDAzOworICBjU0RIVUZGREggPSAod0ZsYWdzID4+IDIpICYgMHgwMDAzOworICBjU0RIVUZGRFcgPSAod0ZsYWdzID4+IDQpICYgMHgwMDAzOworICBjU0RIVUZGQk1TSVpFID0gKHdGbGFncyA+PiA2KSAmIDB4MDAwMTsKKyAgY1NESFVGRkFHR0lOU1QgPSAod0ZsYWdzID4+IDcpICYgMHgwMDAxOworICBpZiAocFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkYgPT0gMCkgeworICAgIGlmIChwU3ltYm9sRGljdERlY29kZXItPlNEVEVNUExBVEUgPT0gMCkgeworICAgICAgZHdUZW1wID0gODsKKyAgICB9IGVsc2UgeworICAgICAgZHdUZW1wID0gMjsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IChpbnQzMl90KWR3VGVtcDsgaSsrKSB7CisgICAgICBpZiAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoKHVpbnQ4X3QqKSZwU3ltYm9sRGljdERlY29kZXItPlNEQVRbaV0pICE9IDApIHsKKyAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICJzeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOwogICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwogICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KICAgICB9Ci0gICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkYgPSB3RmxhZ3MgJiAweDAwMDE7Ci0gICAgcFN5bWJvbERpY3REZWNvZGVyLT5TRFJFRkFHRyA9ICh3RmxhZ3MgPj4gMSkgJiAweDAwMDE7Ci0gICAgcFN5bWJvbERpY3REZWNvZGVyLT5TRFRFTVBMQVRFID0gKHdGbGFncyA+PiAxMCkgJiAweDAwMDM7Ci0gICAgcFN5bWJvbERpY3REZWNvZGVyLT5TRFJURU1QTEFURSA9ICh3RmxhZ3MgPj4gMTIpICYgMHgwMDAzOwotICAgIGNTREhVRkZESCA9ICh3RmxhZ3MgPj4gMikgJiAweDAwMDM7Ci0gICAgY1NESFVGRkRXID0gKHdGbGFncyA+PiA0KSAmIDB4MDAwMzsKLSAgICBjU0RIVUZGQk1TSVpFID0gKHdGbGFncyA+PiA2KSAmIDB4MDAwMTsKLSAgICBjU0RIVUZGQUdHSU5TVCA9ICh3RmxhZ3MgPj4gNykgJiAweDAwMDE7Ci0gICAgaWYocFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkYgPT0gMCkgewotICAgICAgICBpZihwU3ltYm9sRGljdERlY29kZXItPlNEVEVNUExBVEUgPT0gMCkgewotICAgICAgICAgICAgZHdUZW1wID0gODsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGR3VGVtcCA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgKGludDMyX3QpZHdUZW1wOyBpKyspIHsKLSAgICAgICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCh1aW50OF90KikmcFN5bWJvbERpY3REZWNvZGVyLT5TREFUW2ldKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKChwU3ltYm9sRGljdERlY29kZXItPlNEUkVGQUdHID09IDEpICYmIChwU3ltYm9sRGljdERlY29kZXItPlNEUlRFTVBMQVRFID09IDApKSB7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkMUJ5dGUoKHVpbnQ4X3QqKSZwU3ltYm9sRGljdERlY29kZXItPlNEUkFUW2ldKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwU3ltYm9sRGljdERlY29kZXItPlNETlVNRVhTWU1TKSAhPSAwKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1ORVdTWU1TKSAhPSAwKSkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOworICB9CisgIGlmICgocFN5bWJvbERpY3REZWNvZGVyLT5TRFJFRkFHRyA9PSAxKSAmJgorICAgICAgKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSVEVNUExBVEUgPT0gMCkpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBpZiAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoKHVpbnQ4X3QqKSZwU3ltYm9sRGljdERlY29kZXItPlNEUkFUW2ldKSAhPSAwKSB7CisgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CiAgICAgfQotICAgIGlmIChwU3ltYm9sRGljdERlY29kZXItPlNETlVNRVhTWU1TID4gSkJJRzJfTUFYX0VYUE9SVF9TWVNNQk9MUwotICAgICAgICAgICAgfHwgcFN5bWJvbERpY3REZWNvZGVyLT5TRE5VTU5FV1NZTVMgPiBKQklHMl9NQVhfTkVXX1NZU01CT0xTKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgOiB0b28gbWFueSBleHBvcnQvbmV3IHN5bWJvbHMuIik7Ci0gICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9MSU1JVDsKKyAgfQorICBpZiAoKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1FWFNZTVMpICE9IDApIHx8CisgICAgICAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFN5bWJvbERpY3REZWNvZGVyLT5TRE5VTU5FV1NZTVMpICE9IDApKSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7CisgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBpZiAocFN5bWJvbERpY3REZWNvZGVyLT5TRE5VTUVYU1lNUyA+IEpCSUcyX01BWF9FWFBPUlRfU1lTTUJPTFMgfHwKKyAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1ORVdTWU1TID4gSkJJRzJfTUFYX05FV19TWVNNQk9MUykgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICJzeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IDogdG9vIG1hbnkgZXhwb3J0L25ldyBzeW1ib2xzLiIpOworICAgIG5SZXQgPSBKQklHMl9FUlJPUl9MSU1JVDsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7IGkrKykgeworICAgIGlmICghZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKSkgeworICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IGNhbid0IGZpbmQgcmVmZXJlZCB0byBzZWdtZW50cyIpOworICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICB9CisgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1JTlNZTVMgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7IGkrKykgeworICAgIHBTZWcgPSBmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pOworICAgIGlmIChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gMCkgeworICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TRE5VTUlOU1lNUyArPSBwU2VnLT5tX1Jlc3VsdC5zZC0+U0ROVU1FWFNZTVM7CisgICAgICBwTFJTZWcgPSBwU2VnOworICAgIH0KKyAgfQorICBpZiAocFN5bWJvbERpY3REZWNvZGVyLT5TRE5VTUlOU1lNUyA9PSAwKSB7CisgICAgU0RJTlNZTVMgPSBOVUxMOworICB9IGVsc2UgeworICAgIFNESU5TWU1TID0gKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMigKKyAgICAgICAgc2l6ZW9mKENKQmlnMl9JbWFnZSopLCBwU3ltYm9sRGljdERlY29kZXItPlNETlVNSU5TWU1TKTsKKyAgICBkd1RlbXAgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgaSsrKSB7CisgICAgICBwU2VnID0gZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKKyAgICAgIGlmIChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gMCkgeworICAgICAgICBKQklHMl9tZW1jcHkoU0RJTlNZTVMgKyBkd1RlbXAsIHBTZWctPm1fUmVzdWx0LnNkLT5TREVYU1lNUywKKyAgICAgICAgICAgICAgICAgICAgIHBTZWctPm1fUmVzdWx0LnNkLT5TRE5VTUVYU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7CisgICAgICAgIGR3VGVtcCArPSBwU2VnLT5tX1Jlc3VsdC5zZC0+U0ROVU1FWFNZTVM7CisgICAgICB9CisgICAgfQorICB9CisgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RJTlNZTVMgPSBTRElOU1lNUzsKKyAgaWYgKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGID09IDEpIHsKKyAgICBpZiAoKGNTREhVRkZESCA9PSAyKSB8fCAoY1NESFVGRkRXID09IDIpKSB7CisgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICJzeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IDogU0RIVUZGREg9MiBvciBTREhVRkZEVz0yIGlzIG5vdCAiCisgICAgICAgICAgInBlcm1pdHRlZC4iKTsKKyAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgICBuSW5kZXggPSAwOworICAgIGlmIChjU0RIVUZGREggPT0gMCkgeworICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjQsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0I0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CNCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjQpKTsKKyAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGREggPSBUYWJsZV9CNDsKKyAgICB9IGVsc2UgaWYgKGNTREhVRkZESCA9PSAxKSB7CisgICAgICBKQklHMl9BTExPQyhUYWJsZV9CNSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0I1KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNSkpOworICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZESCA9IFRhYmxlX0I1OworICAgIH0gZWxzZSB7CisgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOworICAgICAgaWYgKCFwU2VnKSB7CisgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IFNESFVGRkRIIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCAiCisgICAgICAgICAgICAidGFibGUuIik7CisgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkRIID0gcFNlZy0+bV9SZXN1bHQuaHQ7CiAgICAgfQotICAgIGZvcihpID0gMDsgaSA8IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OyBpKyspIHsKLSAgICAgICAgaWYoIWZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSkpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgOiBjYW4ndCBmaW5kIHJlZmVyZWQgdG8gc2VnbWVudHMiKTsKLSAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgfQotICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1JTlNZTVMgPSAwOwotICAgIGZvcihpID0gMDsgaSA8IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OyBpKyspIHsKLSAgICAgICAgcFNlZyA9IGZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSk7Ci0gICAgICAgIGlmKHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNETlVNSU5TWU1TICs9IHBTZWctPm1fUmVzdWx0LnNkLT5TRE5VTUVYU1lNUzsKLSAgICAgICAgICAgIHBMUlNlZyA9IHBTZWc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYocFN5bWJvbERpY3REZWNvZGVyLT5TRE5VTUlOU1lNUyA9PSAwKSB7Ci0gICAgICAgIFNESU5TWU1TID0gTlVMTDsKKyAgICBpZiAoY1NESFVGRkRXID09IDApIHsKKyAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IyLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjIpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IyKSk7CisgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkRXID0gVGFibGVfQjI7CisgICAgfSBlbHNlIGlmIChjU0RIVUZGRFcgPT0gMSkgeworICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjMsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMykgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjMpKTsKKyAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGRFcgPSBUYWJsZV9CMzsKICAgICB9IGVsc2UgewotICAgICAgICBTRElOU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDSkJpZzJfSW1hZ2UqKSwgcFN5bWJvbERpY3REZWNvZGVyLT5TRE5VTUlOU1lNUyk7Ci0gICAgICAgIGR3VGVtcCA9IDA7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHBTZWcgPSBmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pOwotICAgICAgICAgICAgaWYocFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IDApIHsKLSAgICAgICAgICAgICAgICBKQklHMl9tZW1jcHkoU0RJTlNZTVMgKyBkd1RlbXAsIHBTZWctPm1fUmVzdWx0LnNkLT5TREVYU1lNUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZy0+bV9SZXN1bHQuc2QtPlNETlVNRVhTWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICAgICAgICBkd1RlbXAgKz0gcFNlZy0+bV9SZXN1bHQuc2QtPlNETlVNRVhTWU1TOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOworICAgICAgaWYgKCFwU2VnKSB7CisgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IFNESFVGRkRXIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCAiCisgICAgICAgICAgICAidGFibGUuIik7CisgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkRXID0gcFNlZy0+bV9SZXN1bHQuaHQ7CiAgICAgfQotICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RJTlNZTVMgPSBTRElOU1lNUzsKLSAgICBpZihwU3ltYm9sRGljdERlY29kZXItPlNESFVGRiA9PSAxKSB7Ci0gICAgICAgIGlmKChjU0RIVUZGREggPT0gMikgfHwgKGNTREhVRkZEVyA9PSAyKSkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IFNESFVGRkRIPTIgb3IgU0RIVUZGRFc9MiBpcyBub3QgcGVybWl0dGVkLiIpOwotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbkluZGV4ID0gMDsKLSAgICAgICAgaWYoY1NESFVGRkRIID09IDApIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0I0LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjQpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0I0KSk7Ci0gICAgICAgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkRIID0gVGFibGVfQjQ7Ci0gICAgICAgIH0gZWxzZSBpZihjU0RIVUZGREggPT0gMSkgewotICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjUsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0I1LAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CNSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjUpKTsKLSAgICAgICAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGREggPSBUYWJsZV9CNTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTZWcgPSBmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgocFNlZ21lbnQsIDUzLCBuSW5kZXgrKyk7Ci0gICAgICAgICAgICBpZighcFNlZykgewotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgOiBTREhVRkZESCBjYW4ndCBmaW5kIHVzZXIgc3VwcGxpZWQgdGFibGUuIik7Ci0gICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZESCA9IHBTZWctPm1fUmVzdWx0Lmh0OwotICAgICAgICB9Ci0gICAgICAgIGlmKGNTREhVRkZEVyA9PSAwKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMiwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IyKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMikpOwotICAgICAgICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZEVyA9IFRhYmxlX0IyOwotICAgICAgICB9IGVsc2UgaWYoY1NESFVGRkRXID09IDEpIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IzLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjMpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IzKSk7Ci0gICAgICAgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkRXID0gVGFibGVfQjM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwotICAgICAgICAgICAgaWYoIXBTZWcpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IDogU0RIVUZGRFcgY2FuJ3QgZmluZCB1c2VyIHN1cHBsaWVkIHRhYmxlLiIpOwotICAgICAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGRFcgPSBwU2VnLT5tX1Jlc3VsdC5odDsKLSAgICAgICAgfQotICAgICAgICBpZihjU0RIVUZGQk1TSVpFID09IDApIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjEpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxKSk7Ci0gICAgICAgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkJNU0laRSA9IFRhYmxlX0IxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKLSAgICAgICAgICAgIGlmKCFwU2VnKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IFNESFVGRkJNU0laRSBjYW4ndCBmaW5kIHVzZXIgc3VwcGxpZWQgdGFibGUuIik7Ci0gICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZCTVNJWkUgPSBwU2VnLT5tX1Jlc3VsdC5odDsKLSAgICAgICAgfQotICAgICAgICBpZihwU3ltYm9sRGljdERlY29kZXItPlNEUkVGQUdHID09IDEpIHsKLSAgICAgICAgICAgIGlmKGNTREhVRkZBR0dJTlNUID09IDApIHsKLSAgICAgICAgICAgICAgICBpZighVGFibGVfQjEpIHsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjEsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkFHR0lOU1QgPSBUYWJsZV9CMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKLSAgICAgICAgICAgICAgICBpZighcFNlZykgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IDogU0RIVUZGQUdHSU5TVCBjYW4ndCBmaW5kIHVzZXIgc3VwcGxpZWQgdGFibGUuIik7Ci0gICAgICAgICAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGQUdHSU5TVCA9IHBTZWctPm1fUmVzdWx0Lmh0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKCh3RmxhZ3MgJiAweDAxMDApICYmIHBMUlNlZyAmJiBwTFJTZWctPm1fUmVzdWx0LnNkLT5tX2JDb250ZXh0UmV0YWluZWQpIHsKLSAgICAgICAgaWYgKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGID09IDApIHsKLSAgICAgICAgICAgIGR3VGVtcCA9IHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RURU1QTEFURSA9PSAwID8gNjU1MzYgOiBwU3ltYm9sRGljdERlY29kZXItPlNEVEVNUExBVEUgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICA4MTkyIDogMTAyNDsKLSAgICAgICAgICAgIGdiQ29udGV4dCA9IChKQmlnMkFyaXRoQ3R4KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEpCaWcyQXJpdGhDdHgpLCBkd1RlbXApOwotICAgICAgICAgICAgSkJJRzJfbWVtY3B5KGdiQ29udGV4dCwgcExSU2VnLT5tX1Jlc3VsdC5zZC0+bV9nYkNvbnRleHQsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSpkd1RlbXApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwU3ltYm9sRGljdERlY29kZXItPlNEUkVGQUdHID09IDEpIHsKLSAgICAgICAgICAgIGR3VGVtcCA9IHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSVEVNUExBVEUgPyAxIDw8IDEwIDogMSA8PCAxMzsKLSAgICAgICAgICAgIGdyQ29udGV4dCA9IChKQmlnMkFyaXRoQ3R4KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEpCaWcyQXJpdGhDdHgpLCBkd1RlbXApOwotICAgICAgICAgICAgSkJJRzJfbWVtY3B5KGdyQ29udGV4dCwgcExSU2VnLT5tX1Jlc3VsdC5zZC0+bV9nckNvbnRleHQsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSpkd1RlbXApOwotICAgICAgICB9CisgICAgaWYgKGNTREhVRkZCTVNJWkUgPT0gMCkgeworICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjEsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjEpKTsKKyAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGQk1TSVpFID0gVGFibGVfQjE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGID09IDApIHsKLSAgICAgICAgICAgIGR3VGVtcCA9IHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RURU1QTEFURSA9PSAwID8gNjU1MzYgOiBwU3ltYm9sRGljdERlY29kZXItPlNEVEVNUExBVEUgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICA4MTkyIDogMTAyNDsKLSAgICAgICAgICAgIGdiQ29udGV4dCA9IChKQmlnMkFyaXRoQ3R4KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEpCaWcyQXJpdGhDdHgpLCBkd1RlbXApOwotICAgICAgICAgICAgSkJJRzJfbWVtc2V0KGdiQ29udGV4dCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpKmR3VGVtcCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSRUZBR0cgPT0gMSkgewotICAgICAgICAgICAgZHdUZW1wID0gcFN5bWJvbERpY3REZWNvZGVyLT5TRFJURU1QTEFURSA/IDEgPDwgMTAgOiAxIDw8IDEzOwotICAgICAgICAgICAgZ3JDb250ZXh0ID0gKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoSkJpZzJBcml0aEN0eCksIGR3VGVtcCk7Ci0gICAgICAgICAgICBKQklHMl9tZW1zZXQoZ3JDb250ZXh0LCAwLCBzaXplb2YoSkJpZzJBcml0aEN0eCkqZHdUZW1wKTsKLSAgICAgICAgfQorICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgIGlmICghcFNlZykgeworICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgOiBTREhVRkZCTVNJWkUgY2FuJ3QgZmluZCB1c2VyIHN1cHBsaWVkICIKKyAgICAgICAgICAgICJ0YWJsZS4iKTsKKyAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKyAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGQk1TSVpFID0gcFNlZy0+bV9SZXN1bHQuaHQ7CiAgICAgfQotICAgIHBTZWdtZW50LT5tX25SZXN1bHRUeXBlID0gSkJJRzJfU1lNQk9MX0RJQ1RfUE9JTlRFUjsKLSAgICBmb3Ioc3RkOjpsaXN0PENKQmlnMl9DYWNoZVBhaXI+OjppdGVyYXRvciBpdCA9Ci0gICAgICAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPmJlZ2luKCk7IGl0ICE9IG1fcFN5bWJvbERpY3RDYWNoZS0+ZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKGl0LT5maXJzdCA9PSBrZXkpIHsKLSAgICAgICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZCA9IGl0LT5zZWNvbmQtPkRlZXBDb3B5KCk7Ci0gICAgICAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPnB1c2hfZnJvbnQoKml0KTsKLSAgICAgICAgICAgIG1fcFN5bWJvbERpY3RDYWNoZS0+ZXJhc2UoaXQpOwotICAgICAgICAgICAgY2FjaGVfaGl0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChwU3ltYm9sRGljdERlY29kZXItPlNEUkVGQUdHID09IDEpIHsKKyAgICAgIGlmIChjU0RIVUZGQUdHSU5TVCA9PSAwKSB7CisgICAgICAgIGlmICghVGFibGVfQjEpIHsKKyAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOwogICAgICAgICB9CisgICAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGQUdHSU5TVCA9IFRhYmxlX0IxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgICAgaWYgKCFwU2VnKSB7CisgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgOiBTREhVRkZBR0dJTlNUIGNhbid0IGZpbmQgdXNlciAiCisgICAgICAgICAgICAgICJzdXBwbGllZCB0YWJsZS4iKTsKKyAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZBR0dJTlNUID0gcFNlZy0+bV9SZXN1bHQuaHQ7CisgICAgICB9CiAgICAgfQotICAgIGlmICghY2FjaGVfaGl0KSB7Ci0gICAgICAgIGlmKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGID09IDApIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKHBBcml0aERlY29kZXIsIENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtKSk7Ci0gICAgICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QgPSBwU3ltYm9sRGljdERlY29kZXItPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQsIGdyQ29udGV4dCk7Ci0gICAgICAgICAgICBkZWxldGUgcEFyaXRoRGVjb2RlcjsKLSAgICAgICAgICAgIGlmKHBTZWdtZW50LT5tX1Jlc3VsdC5zZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICAgICAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkID0gcFN5bWJvbERpY3REZWNvZGVyLT5kZWNvZGVfSHVmZm1hbihtX3BTdHJlYW0sIGdiQ29udGV4dCwgZ3JDb250ZXh0LCBwUGF1c2UpOwotICAgICAgICAgICAgaWYocFNlZ21lbnQtPm1fUmVzdWx0LnNkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIENKQmlnMl9TeW1ib2xEaWN0ICp2YWx1ZSA9IHBTZWdtZW50LT5tX1Jlc3VsdC5zZC0+RGVlcENvcHkoKTsKLSAgICAgICAgaWYgKHZhbHVlICYmIGtTeW1ib2xEaWN0Q2FjaGVNYXhTaXplID4gMCkgewotICAgICAgICAgICAgd2hpbGUgKG1fcFN5bWJvbERpY3RDYWNoZS0+c2l6ZSgpID49IGtTeW1ib2xEaWN0Q2FjaGVNYXhTaXplKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fcFN5bWJvbERpY3RDYWNoZS0+YmFjaygpLnNlY29uZDsKLSAgICAgICAgICAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPnBvcF9iYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPnB1c2hfZnJvbnQoQ0pCaWcyX0NhY2hlUGFpcihrZXksIHZhbHVlKSk7Ci0gICAgICAgIH0KKyAgfQorICBpZiAoKHdGbGFncyAmIDB4MDEwMCkgJiYgcExSU2VnICYmIHBMUlNlZy0+bV9SZXN1bHQuc2QtPm1fYkNvbnRleHRSZXRhaW5lZCkgeworICAgIGlmIChwU3ltYm9sRGljdERlY29kZXItPlNESFVGRiA9PSAwKSB7CisgICAgICBkd1RlbXAgPSBwU3ltYm9sRGljdERlY29kZXItPlNEVEVNUExBVEUgPT0gMAorICAgICAgICAgICAgICAgICAgID8gNjU1MzYKKyAgICAgICAgICAgICAgICAgICA6IHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RURU1QTEFURSA9PSAxID8gODE5MiA6IDEwMjQ7CisgICAgICBnYkNvbnRleHQgPSAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKAorICAgICAgICAgIHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgZHdUZW1wKTsKKyAgICAgIEpCSUcyX21lbWNweShnYkNvbnRleHQsIHBMUlNlZy0+bV9SZXN1bHQuc2QtPm1fZ2JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMkFyaXRoQ3R4KSAqIGR3VGVtcCk7CiAgICAgfQotICAgIGlmKHdGbGFncyAmIDB4MDIwMCkgewotICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QtPm1fYkNvbnRleHRSZXRhaW5lZCA9IFRSVUU7Ci0gICAgICAgIGlmKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGID09IDApIHsKLSAgICAgICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZC0+bV9nYkNvbnRleHQgPSBnYkNvbnRleHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYocFN5bWJvbERpY3REZWNvZGVyLT5TRFJFRkFHRyA9PSAxKSB7Ci0gICAgICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QtPm1fZ3JDb250ZXh0ID0gZ3JDb250ZXh0OwotICAgICAgICB9Ci0gICAgICAgIGJVc2VkID0gVFJVRTsKKyAgICBpZiAocFN5bWJvbERpY3REZWNvZGVyLT5TRFJFRkFHRyA9PSAxKSB7CisgICAgICBkd1RlbXAgPSBwU3ltYm9sRGljdERlY29kZXItPlNEUlRFTVBMQVRFID8gMSA8PCAxMCA6IDEgPDwgMTM7CisgICAgICBnckNvbnRleHQgPSAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKAorICAgICAgICAgIHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgZHdUZW1wKTsKKyAgICAgIEpCSUcyX21lbWNweShnckNvbnRleHQsIHBMUlNlZy0+bV9SZXN1bHQuc2QtPm1fZ3JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMkFyaXRoQ3R4KSAqIGR3VGVtcCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChwU3ltYm9sRGljdERlY29kZXItPlNESFVGRiA9PSAwKSB7CisgICAgICBkd1RlbXAgPSBwU3ltYm9sRGljdERlY29kZXItPlNEVEVNUExBVEUgPT0gMAorICAgICAgICAgICAgICAgICAgID8gNjU1MzYKKyAgICAgICAgICAgICAgICAgICA6IHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RURU1QTEFURSA9PSAxID8gODE5MiA6IDEwMjQ7CisgICAgICBnYkNvbnRleHQgPSAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKAorICAgICAgICAgIHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgZHdUZW1wKTsKKyAgICAgIEpCSUcyX21lbXNldChnYkNvbnRleHQsIDAsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSAqIGR3VGVtcCk7CisgICAgfQorICAgIGlmIChwU3ltYm9sRGljdERlY29kZXItPlNEUkVGQUdHID09IDEpIHsKKyAgICAgIGR3VGVtcCA9IHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSVEVNUExBVEUgPyAxIDw8IDEwIDogMSA8PCAxMzsKKyAgICAgIGdyQ29udGV4dCA9IChKQmlnMkFyaXRoQ3R4KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoCisgICAgICAgICAgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpLCBkd1RlbXApOworICAgICAgSkJJRzJfbWVtc2V0KGdyQ29udGV4dCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpICogZHdUZW1wKTsKKyAgICB9CisgIH0KKyAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9TWU1CT0xfRElDVF9QT0lOVEVSOworICBmb3IgKHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPjo6aXRlcmF0b3IgaXQgPSBtX3BTeW1ib2xEaWN0Q2FjaGUtPmJlZ2luKCk7CisgICAgICAgaXQgIT0gbV9wU3ltYm9sRGljdENhY2hlLT5lbmQoKTsgKytpdCkgeworICAgIGlmIChpdC0+Zmlyc3QgPT0ga2V5KSB7CisgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QgPSBpdC0+c2Vjb25kLT5EZWVwQ29weSgpOworICAgICAgbV9wU3ltYm9sRGljdENhY2hlLT5wdXNoX2Zyb250KCppdCk7CisgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPmVyYXNlKGl0KTsKKyAgICAgIGNhY2hlX2hpdCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFjYWNoZV9oaXQpIHsKKyAgICBpZiAocFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkYgPT0gMCkgeworICAgICAgSkJJRzJfQUxMT0MocEFyaXRoRGVjb2RlciwgQ0pCaWcyX0FyaXRoRGVjb2RlcihtX3BTdHJlYW0pKTsKKyAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZCA9CisgICAgICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5kZWNvZGVfQXJpdGgocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0LCBnckNvbnRleHQpOworICAgICAgZGVsZXRlIHBBcml0aERlY29kZXI7CisgICAgICBpZiAocFNlZ21lbnQtPm1fUmVzdWx0LnNkID09IE5VTEwpIHsKKyAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKyAgICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgICAgICBtX3BTdHJlYW0tPm9mZnNldCgyKTsKICAgICB9IGVsc2UgewotICAgICAgICBiVXNlZCA9IEZBTFNFOworICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkID0gcFN5bWJvbERpY3REZWNvZGVyLT5kZWNvZGVfSHVmZm1hbigKKyAgICAgICAgICBtX3BTdHJlYW0sIGdiQ29udGV4dCwgZ3JDb250ZXh0LCBwUGF1c2UpOworICAgICAgaWYgKHBTZWdtZW50LT5tX1Jlc3VsdC5zZCA9PSBOVUxMKSB7CisgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisgICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwogICAgIH0KLSAgICBkZWxldGUgcFN5bWJvbERpY3REZWNvZGVyOwotICAgIGlmKFNESU5TWU1TKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRElOU1lNUyk7CisgICAgQ0pCaWcyX1N5bWJvbERpY3QqIHZhbHVlID0gcFNlZ21lbnQtPm1fUmVzdWx0LnNkLT5EZWVwQ29weSgpOworICAgIGlmICh2YWx1ZSAmJiBrU3ltYm9sRGljdENhY2hlTWF4U2l6ZSA+IDApIHsKKyAgICAgIHdoaWxlIChtX3BTeW1ib2xEaWN0Q2FjaGUtPnNpemUoKSA+PSBrU3ltYm9sRGljdENhY2hlTWF4U2l6ZSkgeworICAgICAgICBkZWxldGUgbV9wU3ltYm9sRGljdENhY2hlLT5iYWNrKCkuc2Vjb25kOworICAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPnBvcF9iYWNrKCk7CisgICAgICB9CisgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPnB1c2hfZnJvbnQoQ0pCaWcyX0NhY2hlUGFpcihrZXksIHZhbHVlKSk7CiAgICAgfQotICAgIGRlbGV0ZSBUYWJsZV9CMTsKLSAgICBkZWxldGUgVGFibGVfQjI7Ci0gICAgZGVsZXRlIFRhYmxlX0IzOwotICAgIGRlbGV0ZSBUYWJsZV9CNDsKLSAgICBkZWxldGUgVGFibGVfQjU7Ci0gICAgaWYoYlVzZWQgPT0gRkFMU0UpIHsKLSAgICAgICAgaWYoZ2JDb250ZXh0KSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoZ2JDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBpZihnckNvbnRleHQpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnckNvbnRleHQpOwotICAgICAgICB9CisgIH0KKyAgaWYgKHdGbGFncyAmIDB4MDIwMCkgeworICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZC0+bV9iQ29udGV4dFJldGFpbmVkID0gVFJVRTsKKyAgICBpZiAocFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkYgPT0gMCkgeworICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkLT5tX2diQ29udGV4dCA9IGdiQ29udGV4dDsKICAgICB9Ci0gICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CisgICAgaWYgKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSRUZBR0cgPT0gMSkgeworICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkLT5tX2dyQ29udGV4dCA9IGdyQ29udGV4dDsKKyAgICB9CisgICAgYlVzZWQgPSBUUlVFOworICB9IGVsc2UgeworICAgIGJVc2VkID0gRkFMU0U7CisgIH0KKyAgZGVsZXRlIHBTeW1ib2xEaWN0RGVjb2RlcjsKKyAgaWYgKFNESU5TWU1TKSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNESU5TWU1TKTsKKyAgfQorICBkZWxldGUgVGFibGVfQjE7CisgIGRlbGV0ZSBUYWJsZV9CMjsKKyAgZGVsZXRlIFRhYmxlX0IzOworICBkZWxldGUgVGFibGVfQjQ7CisgIGRlbGV0ZSBUYWJsZV9CNTsKKyAgaWYgKGJVc2VkID09IEZBTFNFKSB7CisgICAgaWYgKGdiQ29udGV4dCkgeworICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdiQ29udGV4dCk7CisgICAgfQorICAgIGlmIChnckNvbnRleHQpIHsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnckNvbnRleHQpOworICAgIH0KKyAgfQorICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKIGZhaWxlZDoKLSAgICBkZWxldGUgcFN5bWJvbERpY3REZWNvZGVyOwotICAgIGlmKFNESU5TWU1TKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRElOU1lNUyk7Ci0gICAgfQotICAgIGRlbGV0ZSBUYWJsZV9CMTsKLSAgICBkZWxldGUgVGFibGVfQjI7Ci0gICAgZGVsZXRlIFRhYmxlX0IzOwotICAgIGRlbGV0ZSBUYWJsZV9CNDsKLSAgICBkZWxldGUgVGFibGVfQjU7Ci0gICAgaWYoZ2JDb250ZXh0KSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnYkNvbnRleHQpOwotICAgIH0KLSAgICBpZihnckNvbnRleHQpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdyQ29udGV4dCk7Ci0gICAgfQotICAgIHJldHVybiBuUmV0OworICBkZWxldGUgcFN5bWJvbERpY3REZWNvZGVyOworICBpZiAoU0RJTlNZTVMpIHsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0RJTlNZTVMpOworICB9CisgIGRlbGV0ZSBUYWJsZV9CMTsKKyAgZGVsZXRlIFRhYmxlX0IyOworICBkZWxldGUgVGFibGVfQjM7CisgIGRlbGV0ZSBUYWJsZV9CNDsKKyAgZGVsZXRlIFRhYmxlX0I1OworICBpZiAoZ2JDb250ZXh0KSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdiQ29udGV4dCk7CisgIH0KKyAgaWYgKGdyQ29udGV4dCkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnckNvbnRleHQpOworICB9CisgIHJldHVybiBuUmV0OwogfQogCi1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVRleHRSZWdpb24oQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50KQotewotICAgIEZYX0RXT1JEIGR3VGVtcDsKLSAgICBGWF9XT1JEIHdGbGFnczsKLSAgICBpbnQzMl90IGksIG5JbmRleCwgblJldDsKLSAgICBKQmlnMlJlZ2lvbkluZm8gcmk7Ci0gICAgQ0pCaWcyX1NlZ21lbnQgKnBTZWc7Ci0gICAgQ0pCaWcyX0ltYWdlICoqU0JTWU1TID0gTlVMTDsKLSAgICBKQmlnMkh1ZmZtYW5Db2RlICpTQlNZTUNPREVTID0gTlVMTDsKLSAgICB1aW50OF90IGNTQkhVRkZGUywgY1NCSFVGRkRTLCBjU0JIVUZGRFQsIGNTQkhVRkZSRFcsIGNTQkhVRkZSREgsIGNTQkhVRkZSRFgsIGNTQkhVRkZSRFksIGNTQkhVRkZSU0laRTsKLSAgICBDSkJpZzJfSHVmZm1hblRhYmxlICpUYWJsZV9CMSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0I2ID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0I3ID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpUYWJsZV9COCA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0I5ID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0IxMCA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVGFibGVfQjExID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVGFibGVfQjEyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0IxMyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVGFibGVfQjE0ID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVGFibGVfQjE1ID0gTlVMTDsKLSAgICBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQgPSBOVUxMOwotICAgIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXI7Ci0gICAgQ0pCaWcyX1RSRFByb2MgKnBUUkQ7Ci0gICAgSkJJRzJfQUxMT0MocFRSRCwgQ0pCaWcyX1RSRFByb2MoKSk7Ci0gICAgaWYoKHBhcnNlUmVnaW9uSW5mbygmcmkpICE9IEpCSUcyX1NVQ0NFU1MpCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZ3RmxhZ3MpICE9IDApKSB7CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVRleHRSZWdpb24oQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50KSB7CisgIEZYX0RXT1JEIGR3VGVtcDsKKyAgRlhfV09SRCB3RmxhZ3M7CisgIGludDMyX3QgaSwgbkluZGV4LCBuUmV0OworICBKQmlnMlJlZ2lvbkluZm8gcmk7CisgIENKQmlnMl9TZWdtZW50KiBwU2VnOworICBDSkJpZzJfSW1hZ2UqKiBTQlNZTVMgPSBOVUxMOworICBKQmlnMkh1ZmZtYW5Db2RlKiBTQlNZTUNPREVTID0gTlVMTDsKKyAgdWludDhfdCBjU0JIVUZGRlMsIGNTQkhVRkZEUywgY1NCSFVGRkRULCBjU0JIVUZGUkRXLCBjU0JIVUZGUkRILCBjU0JIVUZGUkRYLAorICAgICAgY1NCSFVGRlJEWSwgY1NCSFVGRlJTSVpFOworICBDSkJpZzJfSHVmZm1hblRhYmxlICpUYWJsZV9CMSA9IE5VTEwsICpUYWJsZV9CNiA9IE5VTEwsICpUYWJsZV9CNyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0I4ID0gTlVMTCwgKlRhYmxlX0I5ID0gTlVMTCwgKlRhYmxlX0IxMCA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0IxMSA9IE5VTEwsICpUYWJsZV9CMTIgPSBOVUxMLCAqVGFibGVfQjEzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAqVGFibGVfQjE0ID0gTlVMTCwgKlRhYmxlX0IxNSA9IE5VTEw7CisgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCA9IE5VTEw7CisgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXI7CisgIENKQmlnMl9UUkRQcm9jKiBwVFJEOworICBKQklHMl9BTExPQyhwVFJELCBDSkJpZzJfVFJEUHJvYygpKTsKKyAgaWYgKChwYXJzZVJlZ2lvbkluZm8oJnJpKSAhPSBKQklHMl9TVUNDRVNTKSB8fAorICAgICAgKG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmd0ZsYWdzKSAhPSAwKSkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7CisgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBwVFJELT5TQlcgPSByaS53aWR0aDsKKyAgcFRSRC0+U0JIID0gcmkuaGVpZ2h0OworICBwVFJELT5TQkhVRkYgPSB3RmxhZ3MgJiAweDAwMDE7CisgIHBUUkQtPlNCUkVGSU5FID0gKHdGbGFncyA+PiAxKSAmIDB4MDAwMTsKKyAgZHdUZW1wID0gKHdGbGFncyA+PiAyKSAmIDB4MDAwMzsKKyAgcFRSRC0+U0JTVFJJUFMgPSAxIDw8IGR3VGVtcDsKKyAgcFRSRC0+UkVGQ09STkVSID0gKEpCaWcyQ29ybmVyKSgod0ZsYWdzID4+IDQpICYgMHgwMDAzKTsKKyAgcFRSRC0+VFJBTlNQT1NFRCA9ICh3RmxhZ3MgPj4gNikgJiAweDAwMDE7CisgIHBUUkQtPlNCQ09NQk9QID0gKEpCaWcyQ29tcG9zZU9wKSgod0ZsYWdzID4+IDcpICYgMHgwMDAzKTsKKyAgcFRSRC0+U0JERUZQSVhFTCA9ICh3RmxhZ3MgPj4gOSkgJiAweDAwMDE7CisgIHBUUkQtPlNCRFNPRkZTRVQgPSAod0ZsYWdzID4+IDEwKSAmIDB4MDAxZjsKKyAgaWYgKHBUUkQtPlNCRFNPRkZTRVQgPj0gMHgwMDEwKSB7CisgICAgcFRSRC0+U0JEU09GRlNFVCA9IHBUUkQtPlNCRFNPRkZTRVQgLSAweDAwMjA7CisgIH0KKyAgcFRSRC0+U0JSVEVNUExBVEUgPSAod0ZsYWdzID4+IDE1KSAmIDB4MDAwMTsKKyAgaWYgKHBUUkQtPlNCSFVGRiA9PSAxKSB7CisgICAgaWYgKG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmd0ZsYWdzKSAhPSAwKSB7CisgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOworICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgICBjU0JIVUZGRlMgPSB3RmxhZ3MgJiAweDAwMDM7CisgICAgY1NCSFVGRkRTID0gKHdGbGFncyA+PiAyKSAmIDB4MDAwMzsKKyAgICBjU0JIVUZGRFQgPSAod0ZsYWdzID4+IDQpICYgMHgwMDAzOworICAgIGNTQkhVRkZSRFcgPSAod0ZsYWdzID4+IDYpICYgMHgwMDAzOworICAgIGNTQkhVRkZSREggPSAod0ZsYWdzID4+IDgpICYgMHgwMDAzOworICAgIGNTQkhVRkZSRFggPSAod0ZsYWdzID4+IDEwKSAmIDB4MDAwMzsKKyAgICBjU0JIVUZGUkRZID0gKHdGbGFncyA+PiAxMikgJiAweDAwMDM7CisgICAgY1NCSFVGRlJTSVpFID0gKHdGbGFncyA+PiAxNCkgJiAweDAwMDE7CisgIH0KKyAgaWYgKChwVFJELT5TQlJFRklORSA9PSAxKSAmJiAocFRSRC0+U0JSVEVNUExBVEUgPT0gMCkpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBpZiAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoKHVpbnQ4X3QqKSZwVFJELT5TQlJBVFtpXSkgIT0gMCkgewogICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOwogICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwogICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KICAgICB9Ci0gICAgcFRSRC0+U0JXID0gcmkud2lkdGg7Ci0gICAgcFRSRC0+U0JIID0gcmkuaGVpZ2h0OwotICAgIHBUUkQtPlNCSFVGRiA9IHdGbGFncyAmIDB4MDAwMTsKLSAgICBwVFJELT5TQlJFRklORSA9ICh3RmxhZ3MgPj4gMSkgJiAweDAwMDE7Ci0gICAgZHdUZW1wID0gKHdGbGFncyA+PiAyKSAmIDB4MDAwMzsKLSAgICBwVFJELT5TQlNUUklQUyA9IDEgPDwgZHdUZW1wOwotICAgIHBUUkQtPlJFRkNPUk5FUiA9IChKQmlnMkNvcm5lcikoKHdGbGFncyA+PiA0KSAmIDB4MDAwMyk7Ci0gICAgcFRSRC0+VFJBTlNQT1NFRCA9ICh3RmxhZ3MgPj4gNikgJiAweDAwMDE7Ci0gICAgcFRSRC0+U0JDT01CT1AgPSAoSkJpZzJDb21wb3NlT3ApKCh3RmxhZ3MgPj4gNykgJiAweDAwMDMpOwotICAgIHBUUkQtPlNCREVGUElYRUwgPSAod0ZsYWdzID4+IDkpICYgMHgwMDAxOwotICAgIHBUUkQtPlNCRFNPRkZTRVQgPSAod0ZsYWdzID4+IDEwKSAmIDB4MDAxZjsKLSAgICBpZihwVFJELT5TQkRTT0ZGU0VUID49IDB4MDAxMCkgewotICAgICAgICBwVFJELT5TQkRTT0ZGU0VUID0gcFRSRC0+U0JEU09GRlNFVCAtIDB4MDAyMDsKKyAgfQorICBpZiAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFRSRC0+U0JOVU1JTlNUQU5DRVMpICE9IDApIHsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOworICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OyBpKyspIHsKKyAgICBpZiAoIWZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSkpIHsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgInRleHQgcmVnaW9uIHNlZ21lbnQgOiBjYW4ndCBmaW5kIHJlZmVyZWQgdG8gc2VnbWVudHMiKTsKKyAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICAgIGdvdG8gZmFpbGVkOwogICAgIH0KLSAgICBwVFJELT5TQlJURU1QTEFURSA9ICh3RmxhZ3MgPj4gMTUpICYgMHgwMDAxOwotICAgIGlmKHBUUkQtPlNCSFVGRiA9PSAxKSB7Ci0gICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmd0ZsYWdzKSAhPSAwKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIGNTQkhVRkZGUyA9IHdGbGFncyAmIDB4MDAwMzsKLSAgICAgICAgY1NCSFVGRkRTID0gKHdGbGFncyA+PiAyKSAmIDB4MDAwMzsKLSAgICAgICAgY1NCSFVGRkRUID0gKHdGbGFncyA+PiA0KSAmIDB4MDAwMzsKLSAgICAgICAgY1NCSFVGRlJEVyA9ICh3RmxhZ3MgPj4gNikgJiAweDAwMDM7Ci0gICAgICAgIGNTQkhVRkZSREggPSAod0ZsYWdzID4+IDgpICYgMHgwMDAzOwotICAgICAgICBjU0JIVUZGUkRYID0gKHdGbGFncyA+PiAxMCkgJiAweDAwMDM7Ci0gICAgICAgIGNTQkhVRkZSRFkgPSAod0ZsYWdzID4+IDEyKSAmIDB4MDAwMzsKLSAgICAgICAgY1NCSFVGRlJTSVpFID0gKHdGbGFncyA+PiAxNCkgJiAweDAwMDE7CisgIH0KKyAgcFRSRC0+U0JOVU1TWU1TID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OyBpKyspIHsKKyAgICBwU2VnID0gZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKKyAgICBpZiAocFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IDApIHsKKyAgICAgIHBUUkQtPlNCTlVNU1lNUyArPSBwU2VnLT5tX1Jlc3VsdC5zZC0+U0ROVU1FWFNZTVM7CiAgICAgfQotICAgIGlmKChwVFJELT5TQlJFRklORSA9PSAxKSAmJiAocFRSRC0+U0JSVEVNUExBVEUgPT0gMCkpIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICBpZihtX3BTdHJlYW0tPnJlYWQxQnl0ZSgodWludDhfdCopJnBUUkQtPlNCUkFUW2ldKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIH0KKyAgaWYgKHBUUkQtPlNCTlVNU1lNUyA+IDApIHsKKyAgICBTQlNZTVMgPSAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihDSkJpZzJfSW1hZ2UqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUUkQtPlNCTlVNU1lNUyk7CisgICAgZHdUZW1wID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7IGkrKykgeworICAgICAgcFNlZyA9IGZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSk7CisgICAgICBpZiAocFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IDApIHsKKyAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUyArIGR3VGVtcCwgcFNlZy0+bV9SZXN1bHQuc2QtPlNERVhTWU1TLAorICAgICAgICAgICAgICAgICAgICAgcFNlZy0+bV9SZXN1bHQuc2QtPlNETlVNRVhTWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgICAgICAgZHdUZW1wICs9IHBTZWctPm1fUmVzdWx0LnNkLT5TRE5VTUVYU1lNUzsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFRSRC0+U0JOVU1JTlNUQU5DRVMpICE9IDApIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKLSAgICAgICAgZ290byBmYWlsZWQ7CisgICAgcFRSRC0+U0JTWU1TID0gU0JTWU1TOworICB9IGVsc2UgeworICAgIHBUUkQtPlNCU1lNUyA9IE5VTEw7CisgIH0KKyAgaWYgKHBUUkQtPlNCSFVGRiA9PSAxKSB7CisgICAgU0JTWU1DT0RFUyA9IGRlY29kZVN5bWJvbElESHVmZm1hblRhYmxlKG1fcFN0cmVhbSwgcFRSRC0+U0JOVU1TWU1TKTsKKyAgICBpZiAoU0JTWU1DT0RFUyA9PSBOVUxMKSB7CisgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICJ0ZXh0IHJlZ2lvbiBzZWdtZW50OiBzeW1ib2wgSUQgaHVmZm1hbiB0YWJsZSBkZWNvZGUgZmFpbHVyZSEiKTsKKyAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICAgIGdvdG8gZmFpbGVkOwogICAgIH0KLSAgICBmb3IoaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmKCFmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogY2FuJ3QgZmluZCByZWZlcmVkIHRvIHNlZ21lbnRzIik7Ci0gICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQorICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgICAgcFRSRC0+U0JTWU1DT0RFUyA9IFNCU1lNQ09ERVM7CisgIH0gZWxzZSB7CisgICAgZHdUZW1wID0gMDsKKyAgICB3aGlsZSAoKEZYX0RXT1JEKSgxIDw8IGR3VGVtcCkgPCBwVFJELT5TQk5VTVNZTVMpIHsKKyAgICAgIGR3VGVtcCsrOwogICAgIH0KLSAgICBwVFJELT5TQk5VTVNZTVMgPSAwOwotICAgIGZvcihpID0gMDsgaSA8IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OyBpKyspIHsKLSAgICAgICAgcFNlZyA9IGZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSk7Ci0gICAgICAgIGlmKHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICBwVFJELT5TQk5VTVNZTVMgKz0gcFNlZy0+bV9SZXN1bHQuc2QtPlNETlVNRVhTWU1TOwotICAgICAgICB9CisgICAgcFRSRC0+U0JTWU1DT0RFTEVOID0gKHVpbnQ4X3QpZHdUZW1wOworICB9CisgIGlmIChwVFJELT5TQkhVRkYgPT0gMSkgeworICAgIGlmICgoY1NCSFVGRkZTID09IDIpIHx8IChjU0JIVUZGUkRXID09IDIpIHx8IChjU0JIVUZGUkRIID09IDIpIHx8CisgICAgICAgIChjU0JIVUZGUkRYID09IDIpIHx8IChjU0JIVUZGUkRZID09IDIpKSB7CisgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogU0JIVUZGRlM9MiBvciBTQkhVRkZSRFc9MiBvciAiCisgICAgICAgICAgIlNCSFVGRlJESD0yIG9yIFNCSFVGRlJEWD0yIG9yIFNCSFVGRlJEWT0yIGlzIG5vdCBwZXJtaXR0ZWQiKTsKKyAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICAgIGdvdG8gZmFpbGVkOwogICAgIH0KLSAgICBpZiAocFRSRC0+U0JOVU1TWU1TID4gMCkgewotICAgICAgICBTQlNZTVMgPSAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKAotICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENKQmlnMl9JbWFnZSopLCBwVFJELT5TQk5VTVNZTVMpOwotICAgICAgICBkd1RlbXAgPSAwOwotICAgICAgICBmb3IoaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBwU2VnID0gZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKLSAgICAgICAgICAgIGlmKHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUyArIGR3VGVtcCwgcFNlZy0+bV9SZXN1bHQuc2QtPlNERVhTWU1TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnLT5tX1Jlc3VsdC5zZC0+U0ROVU1FWFNZTVMgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgICAgICAgIGR3VGVtcCArPSBwU2VnLT5tX1Jlc3VsdC5zZC0+U0ROVU1FWFNZTVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcFRSRC0+U0JTWU1TID0gU0JTWU1TOworICAgIG5JbmRleCA9IDA7CisgICAgaWYgKGNTQkhVRkZGUyA9PSAwKSB7CisgICAgICBKQklHMl9BTExPQyhUYWJsZV9CNiwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0I2KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNikpOworICAgICAgcFRSRC0+U0JIVUZGRlMgPSBUYWJsZV9CNjsKKyAgICB9IGVsc2UgaWYgKGNTQkhVRkZGUyA9PSAxKSB7CisgICAgICBKQklHMl9BTExPQyhUYWJsZV9CNywgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0I3KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNykpOworICAgICAgcFRSRC0+U0JIVUZGRlMgPSBUYWJsZV9CNzsKICAgICB9IGVsc2UgewotICAgICAgICBwVFJELT5TQlNZTVMgPSBOVUxMOwotICAgIH0KLSAgICBpZihwVFJELT5TQkhVRkYgPT0gMSkgewotICAgICAgICBTQlNZTUNPREVTID0gZGVjb2RlU3ltYm9sSURIdWZmbWFuVGFibGUobV9wU3RyZWFtLCBwVFJELT5TQk5VTVNZTVMpOwotICAgICAgICBpZihTQlNZTUNPREVTID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIHNlZ21lbnQ6IHN5bWJvbCBJRCBodWZmbWFuIHRhYmxlIGRlY29kZSBmYWlsdXJlISIpOwotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICAgICAgcFRSRC0+U0JTWU1DT0RFUyA9IFNCU1lNQ09ERVM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHdUZW1wID0gMDsKLSAgICAgICAgd2hpbGUoKEZYX0RXT1JEKSgxIDw8IGR3VGVtcCkgPCBwVFJELT5TQk5VTVNZTVMpIHsKLSAgICAgICAgICAgIGR3VGVtcCArKzsKLSAgICAgICAgfQotICAgICAgICBwVFJELT5TQlNZTUNPREVMRU4gPSAodWludDhfdClkd1RlbXA7Ci0gICAgfQotICAgIGlmKHBUUkQtPlNCSFVGRiA9PSAxKSB7Ci0gICAgICAgIGlmKChjU0JIVUZGRlMgPT0gMikgfHwgKGNTQkhVRkZSRFcgPT0gMikgfHwgKGNTQkhVRkZSREggPT0gMikKLSAgICAgICAgICAgICAgICB8fCAoY1NCSFVGRlJEWCA9PSAyKSB8fCAoY1NCSFVGRlJEWSA9PSAyKSkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gc2VnbWVudCA6IFNCSFVGRkZTPTIgb3IgU0JIVUZGUkRXPTIgb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0JIVUZGUkRIPTIgb3IgU0JIVUZGUkRYPTIgb3IgU0JIVUZGUkRZPTIgaXMgbm90IHBlcm1pdHRlZCIpOwotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbkluZGV4ID0gMDsKLSAgICAgICAgaWYoY1NCSFVGRkZTID09IDApIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0I2LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjYpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0I2KSk7Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZGUyA9IFRhYmxlX0I2OwotICAgICAgICB9IGVsc2UgaWYoY1NCSFVGRkZTID09IDEpIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0I3LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CNywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjcpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0I3KSk7Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZGUyA9IFRhYmxlX0I3OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKLSAgICAgICAgICAgIGlmKCFwU2VnKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gc2VnbWVudCA6IFNCSFVGRkZTIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZSIpOwotICAgICAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRkZTID0gcFNlZy0+bV9SZXN1bHQuaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoY1NCSFVGRkRTID09IDApIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0I4LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9COCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjgpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0I4KSk7Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZEUyA9IFRhYmxlX0I4OwotICAgICAgICB9IGVsc2UgaWYoY1NCSFVGRkRTID09IDEpIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0I5LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9COSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjkpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0I5KSk7Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZEUyA9IFRhYmxlX0I5OwotICAgICAgICB9IGVsc2UgaWYoY1NCSFVGRkRTID09IDIpIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxMCwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEwLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTApIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxMCkpOwotICAgICAgICAgICAgcFRSRC0+U0JIVUZGRFMgPSBUYWJsZV9CMTA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwotICAgICAgICAgICAgaWYoIXBTZWcpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogU0JIVUZGRFMgY2FuJ3QgZmluZCB1c2VyIHN1cHBsaWVkIHRhYmxlIik7Ci0gICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFRSRC0+U0JIVUZGRFMgPSBwU2VnLT5tX1Jlc3VsdC5odDsKLSAgICAgICAgfQotICAgICAgICBpZihjU0JIVUZGRFQgPT0gMCkgewotICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjExLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxMSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjExKSk7Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZEVCA9IFRhYmxlX0IxMTsKLSAgICAgICAgfSBlbHNlIGlmKGNTQkhVRkZEVCA9PSAxKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMTIsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjEyKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTIpKTsKLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRkRUID0gVGFibGVfQjEyOwotICAgICAgICB9IGVsc2UgaWYoY1NCSFVGRkRUID09IDIpIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxMywgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEzLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTMpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxMykpOwotICAgICAgICAgICAgcFRSRC0+U0JIVUZGRFQgPSBUYWJsZV9CMTM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwotICAgICAgICAgICAgaWYoIXBTZWcpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogU0JIVUZGRFQgY2FuJ3QgZmluZCB1c2VyIHN1cHBsaWVkIHRhYmxlIik7Ci0gICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFRSRC0+U0JIVUZGRFQgPSBwU2VnLT5tX1Jlc3VsdC5odDsKLSAgICAgICAgfQotICAgICAgICBpZihjU0JIVUZGUkRXID09IDApIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxNCwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTQpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNCkpOwotICAgICAgICAgICAgcFRSRC0+U0JIVUZGUkRXID0gVGFibGVfQjE0OwotICAgICAgICB9IGVsc2UgaWYoY1NCSFVGRlJEVyA9PSAxKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMTUsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRlJEVyA9IFRhYmxlX0IxNTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTZWcgPSBmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgocFNlZ21lbnQsIDUzLCBuSW5kZXgrKyk7Ci0gICAgICAgICAgICBpZighcFNlZykgewotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIHNlZ21lbnQgOiBTQkhVRkZSRFcgY2FuJ3QgZmluZCB1c2VyIHN1cHBsaWVkIHRhYmxlIik7Ci0gICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFRSRC0+U0JIVUZGUkRXID0gcFNlZy0+bV9SZXN1bHQuaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoY1NCSFVGRlJESCA9PSAwKSB7Ci0gICAgICAgICAgICBpZighVGFibGVfQjE0KSB7Ci0gICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjE0LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTQpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFRSRC0+U0JIVUZGUkRIID0gVGFibGVfQjE0OwotICAgICAgICB9IGVsc2UgaWYoY1NCSFVGRlJESCA9PSAxKSB7Ci0gICAgICAgICAgICBpZighVGFibGVfQjE1KSB7Ci0gICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjE1LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTUpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFRSRC0+U0JIVUZGUkRIID0gVGFibGVfQjE1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKLSAgICAgICAgICAgIGlmKCFwU2VnKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gc2VnbWVudCA6IFNCSFVGRlJESCBjYW4ndCBmaW5kIHVzZXIgc3VwcGxpZWQgdGFibGUiKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZSREggPSBwU2VnLT5tX1Jlc3VsdC5odDsKLSAgICAgICAgfQotICAgICAgICBpZihjU0JIVUZGUkRYID09IDApIHsKLSAgICAgICAgICAgIGlmKCFUYWJsZV9CMTQpIHsKLSAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMTQsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNCkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZSRFggPSBUYWJsZV9CMTQ7Ci0gICAgICAgIH0gZWxzZSBpZihjU0JIVUZGUkRYID09IDEpIHsKLSAgICAgICAgICAgIGlmKCFUYWJsZV9CMTUpIHsKLSAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMTUsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZSRFggPSBUYWJsZV9CMTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwotICAgICAgICAgICAgaWYoIXBTZWcpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogU0JIVUZGUkRYIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZSIpOwotICAgICAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRlJEWCA9IHBTZWctPm1fUmVzdWx0Lmh0OwotICAgICAgICB9Ci0gICAgICAgIGlmKGNTQkhVRkZSRFkgPT0gMCkgewotICAgICAgICAgICAgaWYoIVRhYmxlX0IxNCkgewotICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxNCwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE0KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRlJEWSA9IFRhYmxlX0IxNDsKLSAgICAgICAgfSBlbHNlIGlmKGNTQkhVRkZSRFkgPT0gMSkgewotICAgICAgICAgICAgaWYoIVRhYmxlX0IxNSkgewotICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxNSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRlJEWSA9IFRhYmxlX0IxNTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTZWcgPSBmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgocFNlZ21lbnQsIDUzLCBuSW5kZXgrKyk7Ci0gICAgICAgICAgICBpZighcFNlZykgewotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIHNlZ21lbnQgOiBTQkhVRkZSRFkgY2FuJ3QgZmluZCB1c2VyIHN1cHBsaWVkIHRhYmxlIik7Ci0gICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFRSRC0+U0JIVUZGUkRZID0gcFNlZy0+bV9SZXN1bHQuaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoY1NCSFVGRlJTSVpFID09IDApIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjEpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxKSk7Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZSU0laRSA9IFRhYmxlX0IxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKLSAgICAgICAgICAgIGlmKCFwU2VnKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gc2VnbWVudCA6IFNCSFVGRlJTSVpFIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZSIpOwotICAgICAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRlJTSVpFID0gcFNlZy0+bV9SZXN1bHQuaHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYocFRSRC0+U0JSRUZJTkUgPT0gMSkgewotICAgICAgICBkd1RlbXAgPSBwVFJELT5TQlJURU1QTEFURSA/IDEgPDwgMTAgOiAxIDw8IDEzOwotICAgICAgICBnckNvbnRleHQgPSAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgZHdUZW1wKTsKLSAgICAgICAgSkJJRzJfbWVtc2V0KGdyQ29udGV4dCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpKmR3VGVtcCk7Ci0gICAgfQotICAgIGlmKHBUUkQtPlNCSFVGRiA9PSAwKSB7Ci0gICAgICAgIEpCSUcyX0FMTE9DKHBBcml0aERlY29kZXIsIENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtKSk7Ci0gICAgICAgIHBTZWdtZW50LT5tX25SZXN1bHRUeXBlID0gSkJJRzJfSU1BR0VfUE9JTlRFUjsKLSAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gcFRSRC0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7Ci0gICAgICAgIGRlbGV0ZSBwQXJpdGhEZWNvZGVyOwotICAgICAgICBpZihwU2VnbWVudC0+bV9SZXN1bHQuaW0gPT0gTlVMTCkgewotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICAgICAgbV9wU3RyZWFtLT5vZmZzZXQoMik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9JTUFHRV9QT0lOVEVSOwotICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBwVFJELT5kZWNvZGVfSHVmZm1hbihtX3BTdHJlYW0sIGdyQ29udGV4dCk7Ci0gICAgICAgIGlmKHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgIH0KLSAgICBpZihwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlICE9IDQpIHsKLSAgICAgICAgaWYoIW1fYkJ1ZlNwZWNpZmllZCkgewotICAgICAgICAgICAgSkJpZzJQYWdlSW5mbyAqcFBhZ2VJbmZvID0gbV9wUGFnZUluZm9MaXN0LT5nZXRMYXN0KCk7Ci0gICAgICAgICAgICBpZiAoKHBQYWdlSW5mby0+bV9iSXNTdHJpcGVkID09IDEpICYmIChyaS55ICsgcmkuaGVpZ2h0ID4gbV9wUGFnZS0+bV9uSGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIG1fcFBhZ2UtPmV4cGFuZChyaS55ICsgcmkuaGVpZ2h0LCAocFBhZ2VJbmZvLT5tX2NGbGFncyAmIDQpID8gMSA6IDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fcFBhZ2UtPmNvbXBvc2VGcm9tKHJpLngsIHJpLnksIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSwgKEpCaWcyQ29tcG9zZU9wKShyaS5mbGFncyAmIDB4MDMpKTsKLSAgICAgICAgZGVsZXRlIHBTZWdtZW50LT5tX1Jlc3VsdC5pbTsKLSAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gTlVMTDsKLSAgICB9Ci0gICAgZGVsZXRlIHBUUkQ7Ci0gICAgaWYoU0JTWU1TKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTVMpOwotICAgIH0KLSAgICBpZihTQlNZTUNPREVTKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTUNPREVTKTsKLSAgICB9Ci0gICAgaWYoZ3JDb250ZXh0KSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnckNvbnRleHQpOwotICAgIH0KLSAgICBkZWxldGUgVGFibGVfQjE7Ci0gICAgZGVsZXRlIFRhYmxlX0I2OwotICAgIGRlbGV0ZSBUYWJsZV9CNzsKLSAgICBkZWxldGUgVGFibGVfQjg7Ci0gICAgZGVsZXRlIFRhYmxlX0I5OwotICAgIGRlbGV0ZSBUYWJsZV9CMTA7Ci0gICAgZGVsZXRlIFRhYmxlX0IxMTsKLSAgICBkZWxldGUgVGFibGVfQjEyOwotICAgIGRlbGV0ZSBUYWJsZV9CMTM7Ci0gICAgZGVsZXRlIFRhYmxlX0IxNDsKLSAgICBkZWxldGUgVGFibGVfQjE1OwotICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwotZmFpbGVkOgotICAgIGRlbGV0ZSBwVFJEOwotICAgIGlmKFNCU1lNUykgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKLSAgICB9Ci0gICAgaWYoU0JTWU1DT0RFUykgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1DT0RFUyk7Ci0gICAgfQotICAgIGlmKGdyQ29udGV4dCkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoZ3JDb250ZXh0KTsKLSAgICB9Ci0gICAgZGVsZXRlIFRhYmxlX0IxOwotICAgIGRlbGV0ZSBUYWJsZV9CNjsKLSAgICBkZWxldGUgVGFibGVfQjc7Ci0gICAgZGVsZXRlIFRhYmxlX0I4OwotICAgIGRlbGV0ZSBUYWJsZV9COTsKLSAgICBkZWxldGUgVGFibGVfQjEwOwotICAgIGRlbGV0ZSBUYWJsZV9CMTE7Ci0gICAgZGVsZXRlIFRhYmxlX0IxMjsKLSAgICBkZWxldGUgVGFibGVfQjEzOwotICAgIGRlbGV0ZSBUYWJsZV9CMTQ7Ci0gICAgZGVsZXRlIFRhYmxlX0IxNTsKLSAgICByZXR1cm4gblJldDsKLX0KLQotaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VQYXR0ZXJuRGljdChDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0RXT1JEIGR3VGVtcDsKLSAgICB1aW50OF90IGNGbGFnczsKLSAgICBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQ7Ci0gICAgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlcjsKLSAgICBDSkJpZzJfUEREUHJvYyAqcFBERDsKLSAgICBpbnQzMl90IG5SZXQ7Ci0gICAgSkJJRzJfQUxMT0MocFBERCwgQ0pCaWcyX1BERFByb2MoKSk7Ci0gICAgaWYoKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjRmxhZ3MpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoJnBQREQtPkhEUFcpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoJnBQREQtPkhEUEgpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFBERC0+R1JBWU1BWCkgIT0gMCkpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigicGF0dGVybiBkaWN0aW9uYXJ5IHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7Ci0gICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBpZiAocFBERC0+R1JBWU1BWCA+IEpCSUcyX01BWF9QQVRURVJOX0lOREVYKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInBhdHRlcm4gZGljdGlvbmFyeSBzZWdtZW50IDogdG9vIG1heCBncmF5IG1heC4iKTsKLSAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0xJTUlUOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgcFBERC0+SERNTVIgPSBjRmxhZ3MgJiAweDAxOwotICAgIHBQREQtPkhEVEVNUExBVEUgPSAoY0ZsYWdzID4+IDEpICYgMHgwMzsKLSAgICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX1BBVFRFUk5fRElDVF9QT0lOVEVSOwotICAgIGlmKHBQREQtPkhETU1SID09IDApIHsKLSAgICAgICAgZHdUZW1wID0gcFBERC0+SERURU1QTEFURSA9PSAwID8gNjU1MzYgOiBwUERELT5IRFRFTVBMQVRFID09IDEgPyA4MTkyIDogMTAyNDsKLSAgICAgICAgZ2JDb250ZXh0ID0gKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoSkJpZzJBcml0aEN0eCksIGR3VGVtcCk7Ci0gICAgICAgIEpCSUcyX21lbXNldChnYkNvbnRleHQsIDAsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSpkd1RlbXApOwotICAgICAgICBKQklHMl9BTExPQyhwQXJpdGhEZWNvZGVyLCBDSkJpZzJfQXJpdGhEZWNvZGVyKG1fcFN0cmVhbSkpOwotICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQucGQgPSBwUERELT5kZWNvZGVfQXJpdGgocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0LCBwUGF1c2UpOwotICAgICAgICBkZWxldGUgcEFyaXRoRGVjb2RlcjsKLSAgICAgICAgaWYocFNlZ21lbnQtPm1fUmVzdWx0LnBkID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnYkNvbnRleHQpOwotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdiQ29udGV4dCk7Ci0gICAgICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5wZCA9IHBQREQtPmRlY29kZV9NTVIobV9wU3RyZWFtLCBwUGF1c2UpOwotICAgICAgICBpZihwU2VnbWVudC0+bV9SZXN1bHQucGQgPT0gTlVMTCkgewotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICB9Ci0gICAgZGVsZXRlIHBQREQ7Ci0gICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci1mYWlsZWQ6Ci0gICAgZGVsZXRlIHBQREQ7Ci0gICAgcmV0dXJuIG5SZXQ7Ci19Ci1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZUhhbGZ0b25lUmVnaW9uKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfRFdPUkQgZHdUZW1wOwotICAgIHVpbnQ4X3QgY0ZsYWdzOwotICAgIEpCaWcyUmVnaW9uSW5mbyByaTsKLSAgICBDSkJpZzJfU2VnbWVudCAqcFNlZzsKLSAgICBDSkJpZzJfUGF0dGVybkRpY3QgKnBQYXR0ZXJuRGljdDsKLSAgICBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQ7Ci0gICAgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlcjsKLSAgICBDSkJpZzJfSFRSRFByb2MgKnBIUkQ7Ci0gICAgaW50MzJfdCBuUmV0OwotICAgIEpCSUcyX0FMTE9DKHBIUkQsIENKQmlnMl9IVFJEUHJvYygpKTsKLSAgICBpZigocGFyc2VSZWdpb25JbmZvKCZyaSkgIT0gSkJJRzJfU1VDQ0VTUykKLSAgICAgICAgICAgIHx8IChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY0ZsYWdzKSAhPSAwKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBIUkQtPkhHVykgIT0gMCkKLSAgICAgICAgICAgIHx8IChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwSFJELT5IR0gpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigoRlhfRFdPUkQqKSZwSFJELT5IR1gpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigoRlhfRFdPUkQqKSZwSFJELT5IR1kpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZwSFJELT5IUlgpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZwSFJELT5IUlkpICE9IDApKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImhhbGZ0b25lIHJlZ2lvbiBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOwotICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgcEhSRC0+SEJXID0gcmkud2lkdGg7Ci0gICAgcEhSRC0+SEJIID0gcmkuaGVpZ2h0OwotICAgIHBIUkQtPkhNTVIgPSBjRmxhZ3MgJiAweDAxOwotICAgIHBIUkQtPkhURU1QTEFURSA9IChjRmxhZ3MgPj4gMSkgJiAweDAzOwotICAgIHBIUkQtPkhFTkFCTEVTS0lQID0gKGNGbGFncyA+PiAzKSAmIDB4MDE7Ci0gICAgcEhSRC0+SENPTUJPUCA9IChKQmlnMkNvbXBvc2VPcCkoKGNGbGFncyA+PiA0KSAmIDB4MDcpOwotICAgIHBIUkQtPkhERUZQSVhFTCA9IChjRmxhZ3MgPj4gNykgJiAweDAxOwotICAgIGlmKHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ICE9IDEpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiaGFsZnRvbmUgcmVnaW9uIHNlZ21lbnQgOiByZWZlcmVkIHRvIHNlZ21lbnQgY291bnQgbm90IGVxdWFscyAxIik7CisgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOworICAgICAgaWYgKCFwU2VnKSB7CisgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAidGV4dCByZWdpb24gc2VnbWVudCA6IFNCSFVGRkZTIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZSIpOwogICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7CiAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorICAgICAgcFRSRC0+U0JIVUZGRlMgPSBwU2VnLT5tX1Jlc3VsdC5odDsKICAgICB9Ci0gICAgcFNlZyA9IGZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1swXSk7Ci0gICAgaWYoIChwU2VnID09IE5VTEwpIHx8IChwU2VnLT5tX2NGbGFncy5zLnR5cGUgIT0gMTYpKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImhhbGZ0b25lIHJlZ2lvbiBzZWdtZW50IDogcmVmZXJlZCB0byBzZWdtZW50IGlzIG5vdCBwYXR0ZXJuIGRpY3QiKTsKKyAgICBpZiAoY1NCSFVGRkRTID09IDApIHsKKyAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0I4LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9COCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjgpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0I4KSk7CisgICAgICBwVFJELT5TQkhVRkZEUyA9IFRhYmxlX0I4OworICAgIH0gZWxzZSBpZiAoY1NCSFVGRkRTID09IDEpIHsKKyAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0I5LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9COSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjkpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0I5KSk7CisgICAgICBwVFJELT5TQkhVRkZEUyA9IFRhYmxlX0I5OworICAgIH0gZWxzZSBpZiAoY1NCSFVGRkRTID09IDIpIHsKKyAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxMCwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjEwKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxMCkpOworICAgICAgcFRSRC0+U0JIVUZGRFMgPSBUYWJsZV9CMTA7CisgICAgfSBlbHNlIHsKKyAgICAgIHBTZWcgPSBmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgocFNlZ21lbnQsIDUzLCBuSW5kZXgrKyk7CisgICAgICBpZiAoIXBTZWcpIHsKKyAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogU0JIVUZGRFMgY2FuJ3QgZmluZCB1c2VyIHN1cHBsaWVkIHRhYmxlIik7CiAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisgICAgICBwVFJELT5TQkhVRkZEUyA9IHBTZWctPm1fUmVzdWx0Lmh0OwogICAgIH0KLSAgICBwUGF0dGVybkRpY3QgPSBwU2VnLT5tX1Jlc3VsdC5wZDsKLSAgICBpZigocFBhdHRlcm5EaWN0ID09IE5VTEwpIHx8IChwUGF0dGVybkRpY3QtPk5VTVBBVFMgPT0gMCkpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiaGFsZnRvbmUgcmVnaW9uIHNlZ21lbnQgOiBoYXMgbm8gcGF0dGVybnMgaW5wdXQiKTsKKyAgICBpZiAoY1NCSFVGRkRUID09IDApIHsKKyAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxMSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjExKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxMSkpOworICAgICAgcFRSRC0+U0JIVUZGRFQgPSBUYWJsZV9CMTE7CisgICAgfSBlbHNlIGlmIChjU0JIVUZGRFQgPT0gMSkgeworICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjEyLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTIpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjEyKSk7CisgICAgICBwVFJELT5TQkhVRkZEVCA9IFRhYmxlX0IxMjsKKyAgICB9IGVsc2UgaWYgKGNTQkhVRkZEVCA9PSAyKSB7CisgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMTMsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxMykgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTMpKTsKKyAgICAgIHBUUkQtPlNCSFVGRkRUID0gVGFibGVfQjEzOworICAgIH0gZWxzZSB7CisgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOworICAgICAgaWYgKCFwU2VnKSB7CisgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAidGV4dCByZWdpb24gc2VnbWVudCA6IFNCSFVGRkRUIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZSIpOwogICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7CiAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorICAgICAgcFRSRC0+U0JIVUZGRFQgPSBwU2VnLT5tX1Jlc3VsdC5odDsKICAgICB9Ci0gICAgcEhSRC0+SE5VTVBBVFMgPSBwUGF0dGVybkRpY3QtPk5VTVBBVFM7Ci0gICAgcEhSRC0+SFBBVFMgPSBwUGF0dGVybkRpY3QtPkhEUEFUUzsKLSAgICBwSFJELT5IUFcgPSBwUGF0dGVybkRpY3QtPkhEUEFUU1swXS0+bV9uV2lkdGg7Ci0gICAgcEhSRC0+SFBIID0gcFBhdHRlcm5EaWN0LT5IRFBBVFNbMF0tPm1fbkhlaWdodDsKLSAgICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0lNQUdFX1BPSU5URVI7Ci0gICAgaWYocEhSRC0+SE1NUiA9PSAwKSB7Ci0gICAgICAgIGR3VGVtcCA9IHBIUkQtPkhURU1QTEFURSA9PSAwID8gNjU1MzYgOiBwSFJELT5IVEVNUExBVEUgPT0gMSA/IDgxOTIgOiAxMDI0OwotICAgICAgICBnYkNvbnRleHQgPSAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgZHdUZW1wKTsKLSAgICAgICAgSkJJRzJfbWVtc2V0KGdiQ29udGV4dCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpKmR3VGVtcCk7Ci0gICAgICAgIEpCSUcyX0FMTE9DKHBBcml0aERlY29kZXIsIENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtKSk7Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9IHBIUkQtPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIGRlbGV0ZSBwQXJpdGhEZWNvZGVyOwotICAgICAgICBpZihwU2VnbWVudC0+bV9SZXN1bHQuaW0gPT0gTlVMTCkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdiQ29udGV4dCk7Ci0gICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoZ2JDb250ZXh0KTsKLSAgICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICAgICAgbV9wU3RyZWFtLT5vZmZzZXQoMik7CisgICAgaWYgKGNTQkhVRkZSRFcgPT0gMCkgeworICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjE0LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTQpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE0KSk7CisgICAgICBwVFJELT5TQkhVRkZSRFcgPSBUYWJsZV9CMTQ7CisgICAgfSBlbHNlIGlmIChjU0JIVUZGUkRXID09IDEpIHsKKyAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxNSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOworICAgICAgcFRSRC0+U0JIVUZGUkRXID0gVGFibGVfQjE1OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9IHBIUkQtPmRlY29kZV9NTVIobV9wU3RyZWFtLCBwUGF1c2UpOwotICAgICAgICBpZihwU2VnbWVudC0+bV9SZXN1bHQuaW0gPT0gTlVMTCkgewotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICB9Ci0gICAgaWYocFNlZ21lbnQtPm1fY0ZsYWdzLnMudHlwZSAhPSAyMCkgewotICAgICAgICBpZighbV9iQnVmU3BlY2lmaWVkKSB7Ci0gICAgICAgICAgICBKQmlnMlBhZ2VJbmZvICpwUGFnZUluZm8gPSBtX3BQYWdlSW5mb0xpc3QtPmdldExhc3QoKTsKLSAgICAgICAgICAgIGlmICgocFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgPT0gMSkgJiYgKHJpLnkgKyByaS5oZWlnaHQgPiBtX3BQYWdlLT5tX25IZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgbV9wUGFnZS0+ZXhwYW5kKHJpLnkgKyByaS5oZWlnaHQsIChwUGFnZUluZm8tPm1fY0ZsYWdzICYgNCkgPyAxIDogMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9wUGFnZS0+Y29tcG9zZUZyb20ocmkueCwgcmkueSwgcFNlZ21lbnQtPm1fUmVzdWx0LmltLCAoSkJpZzJDb21wb3NlT3ApKHJpLmZsYWdzICYgMHgwMykpOwotICAgICAgICBkZWxldGUgcFNlZ21lbnQtPm1fUmVzdWx0LmltOwotICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBOVUxMOwotICAgIH0KLSAgICBkZWxldGUgcEhSRDsKLSAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLWZhaWxlZDoKLSAgICBkZWxldGUgcEhSRDsKLSAgICByZXR1cm4gblJldDsKLX0KLQotaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VHZW5lcmljUmVnaW9uKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfRFdPUkQgZHdUZW1wOwotICAgIHVpbnQ4X3QgY0ZsYWdzOwotICAgIGludDMyX3QgaSwgblJldDsKLSAgICBpZihtX3BHUkQgPT0gTlVMTCkgewotICAgICAgICBKQklHMl9BTExPQyhtX3BHUkQsIENKQmlnMl9HUkRQcm9jKCkpOwotICAgICAgICBpZigocGFyc2VSZWdpb25JbmZvKCZtX3JpKSAhPSBKQklHMl9TVUNDRVNTKQotICAgICAgICAgICAgICAgIHx8IChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY0ZsYWdzKSAhPSAwKSkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiZ2VuZXJpYyByZWdpb24gc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9yaS5oZWlnaHQgPCAwIHx8IG1fcmkud2lkdGggPCAwKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJnZW5lcmljIHJlZ2lvbiBzZWdtZW50IDogd3JvbmcgZGF0YS4iKTsKLSAgICAgICAgICAgIG5SZXQgPSBKQklHMl9GQUlMRUQ7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBtX3BHUkQtPkdCVyA9IG1fcmkud2lkdGg7Ci0gICAgICAgIG1fcEdSRC0+R0JIID0gbV9yaS5oZWlnaHQ7Ci0gICAgICAgIG1fcEdSRC0+TU1SID0gY0ZsYWdzICYgMHgwMTsKLSAgICAgICAgbV9wR1JELT5HQlRFTVBMQVRFID0gKGNGbGFncyA+PiAxKSAmIDB4MDM7Ci0gICAgICAgIG1fcEdSRC0+VFBHRE9OID0gKGNGbGFncyA+PiAzKSAmIDB4MDE7Ci0gICAgICAgIGlmKG1fcEdSRC0+TU1SID09IDApIHsKLSAgICAgICAgICAgIGlmKG1fcEdSRC0+R0JURU1QTEFURSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCh1aW50OF90KikmbV9wR1JELT5HQkFUW2ldKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJnZW5lcmljIHJlZ2lvbiBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkMUJ5dGUoKHVpbnQ4X3QqKSZtX3BHUkQtPkdCQVRbaV0pICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImdlbmVyaWMgcmVnaW9uIHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9wR1JELT5VU0VTS0lQID0gMDsKLSAgICB9Ci0gICAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9JTUFHRV9QT0lOVEVSOwotICAgIGlmKG1fcEdSRC0+TU1SID09IDApIHsKLSAgICAgICAgZHdUZW1wID0gbV9wR1JELT5HQlRFTVBMQVRFID09IDAgPyA2NTUzNiA6IG1fcEdSRC0+R0JURU1QTEFURSA9PSAxID8gODE5MiA6IDEwMjQ7Ci0gICAgICAgIGlmKG1fZ2JDb250ZXh0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1fZ2JDb250ZXh0ID0gKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jKHNpemVvZihKQmlnMkFyaXRoQ3R4KSAqIGR3VGVtcCk7Ci0gICAgICAgICAgICBKQklHMl9tZW1zZXQobV9nYkNvbnRleHQsIDAsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSpkd1RlbXApOwotICAgICAgICB9Ci0gICAgICAgIGlmKG1fcEFyaXRoRGVjb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhtX3BBcml0aERlY29kZXIsIENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtKSk7Ci0gICAgICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBtX3BHUkQtPlN0YXJ0X2RlY29kZV9Bcml0aCgmcFNlZ21lbnQtPm1fUmVzdWx0LmltLCBtX3BBcml0aERlY29kZXIsIG1fZ2JDb250ZXh0LCBwUGF1c2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gbV9wR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKLSAgICAgICAgfQotICAgICAgICBPdXRwdXRCaXRtYXAocFNlZ21lbnQtPm1fUmVzdWx0LmltKTsKLSAgICAgICAgaWYobV9Qcm9jZXNzaXZlU3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgICAgIGlmKHBTZWdtZW50LT5tX2NGbGFncy5zLnR5cGUgIT0gMzYpIHsKLSAgICAgICAgICAgICAgICBpZighbV9iQnVmU3BlY2lmaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEpCaWcyUGFnZUluZm8gKnBQYWdlSW5mbyA9IG1fcFBhZ2VJbmZvTGlzdC0+Z2V0TGFzdCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBQYWdlSW5mby0+bV9iSXNTdHJpcGVkID09IDEpICYmIChtX3JpLnkgKyBtX3JpLmhlaWdodCA+IG1fcFBhZ2UtPm1fbkhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFBhZ2UtPmV4cGFuZChtX3JpLnkgKyBtX3JpLmhlaWdodCwgKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9SRUNUIFJlY3QgPSBtX3BHUkQtPkdldFJlcGxhY2VSZWN0KCk7Ci0gICAgICAgICAgICAgICAgbV9wUGFnZS0+Y29tcG9zZUZyb20obV9yaS54ICsgUmVjdC5sZWZ0LCBtX3JpLnkgKyBSZWN0LnRvcCwgcFNlZ21lbnQtPm1fUmVzdWx0LmltLCAoSkJpZzJDb21wb3NlT3ApKG1fcmkuZmxhZ3MgJiAweDAzKSwgJlJlY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWxldGUgbV9wQXJpdGhEZWNvZGVyOwotICAgICAgICAgICAgbV9wQXJpdGhEZWNvZGVyID0gTlVMTDsKLSAgICAgICAgICAgIGlmKHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fZ2JDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICAgICAgICAgICAgbV9nYkNvbnRleHQgPSBOVUxMOwotICAgICAgICAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fZ2JDb250ZXh0KTsKLSAgICAgICAgICAgIG1fZ2JDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgICAgICAgICBtX3BTdHJlYW0tPm9mZnNldCgyKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IG1fcEdSRC0+U3RhcnRfZGVjb2RlX01NUigmcFNlZ21lbnQtPm1fUmVzdWx0LmltLCBtX3BTdHJlYW0sIHBQYXVzZSk7Ci0gICAgICAgIHdoaWxlKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgICAgICBtX3BHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgIH0KLSAgICBpZihwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlICE9IDM2KSB7Ci0gICAgICAgIGlmKCFtX2JCdWZTcGVjaWZpZWQpIHsKLSAgICAgICAgICAgIEpCaWcyUGFnZUluZm8gKnBQYWdlSW5mbyA9IG1fcFBhZ2VJbmZvTGlzdC0+Z2V0TGFzdCgpOwotICAgICAgICAgICAgaWYgKChwUGFnZUluZm8tPm1fYklzU3RyaXBlZCA9PSAxKSAmJiAobV9yaS55ICsgbV9yaS5oZWlnaHQgPiBtX3BQYWdlLT5tX25IZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgbV9wUGFnZS0+ZXhwYW5kKG1fcmkueSArIG1fcmkuaGVpZ2h0LCAocFBhZ2VJbmZvLT5tX2NGbGFncyAmIDQpID8gMSA6IDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZYX1JFQ1QgUmVjdCA9IG1fcEdSRC0+R2V0UmVwbGFjZVJlY3QoKTsKLSAgICAgICAgbV9wUGFnZS0+Y29tcG9zZUZyb20obV9yaS54ICsgUmVjdC5sZWZ0LCBtX3JpLnkgKyBSZWN0LnRvcCwgcFNlZ21lbnQtPm1fUmVzdWx0LmltLCAoSkJpZzJDb21wb3NlT3ApKG1fcmkuZmxhZ3MgJiAweDAzKSwgJlJlY3QpOwotICAgICAgICBkZWxldGUgcFNlZ21lbnQtPm1fUmVzdWx0LmltOwotICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBOVUxMOwotICAgIH0KLSAgICBkZWxldGUgbV9wR1JEOwotICAgIG1fcEdSRCA9IE5VTEw7Ci0gICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci1mYWlsZWQ6Ci0gICAgZGVsZXRlIG1fcEdSRDsKLSAgICBtX3BHUkQgPSBOVUxMOwotICAgIHJldHVybiBuUmV0OwotfQotCi1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCkKLXsKLSAgICBGWF9EV09SRCBkd1RlbXA7Ci0gICAgSkJpZzJSZWdpb25JbmZvIHJpOwotICAgIENKQmlnMl9TZWdtZW50ICpwU2VnOwotICAgIGludDMyX3QgaSwgblJldDsKLSAgICB1aW50OF90IGNGbGFnczsKLSAgICBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQ7Ci0gICAgQ0pCaWcyX0dSUkRQcm9jICpwR1JSRDsKLSAgICBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyOwotICAgIEpCSUcyX0FMTE9DKHBHUlJELCBDSkJpZzJfR1JSRFByb2MoKSk7Ci0gICAgaWYoKHBhcnNlUmVnaW9uSW5mbygmcmkpICE9IEpCSUcyX1NVQ0NFU1MpCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoJmNGbGFncykgIT0gMCkpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiZ2VuZXJpYyByZWZpbmVtZW50IHJlZ2lvbiBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOwotICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgIGlmICghcFNlZykgeworICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgInRleHQgcmVnaW9uIHNlZ21lbnQgOiBTQkhVRkZSRFcgY2FuJ3QgZmluZCB1c2VyIHN1cHBsaWVkIHRhYmxlIik7CisgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisgICAgICBwVFJELT5TQkhVRkZSRFcgPSBwU2VnLT5tX1Jlc3VsdC5odDsKICAgICB9Ci0gICAgcEdSUkQtPkdSVyA9IHJpLndpZHRoOwotICAgIHBHUlJELT5HUkggPSByaS5oZWlnaHQ7Ci0gICAgcEdSUkQtPkdSVEVNUExBVEUgPSBjRmxhZ3MgJiAweDAxOwotICAgIHBHUlJELT5UUEdST04gPSAoY0ZsYWdzID4+IDEpICYgMHgwMTsKLSAgICBpZihwR1JSRC0+R1JURU1QTEFURSA9PSAwKSB7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkMUJ5dGUoKHVpbnQ4X3QqKSZwR1JSRC0+R1JBVFtpXSkgIT0gMCkgewotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImdlbmVyaWMgcmVmaW5lbWVudCByZWdpb24gc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHBTZWcgPSBOVUxMOwotICAgIGlmKHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ID4gMCkgewotICAgICAgICBmb3IoaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBwU2VnID0gZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzWzBdKTsKLSAgICAgICAgICAgIGlmKHBTZWcgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImdlbmVyaWMgcmVmaW5lbWVudCByZWdpb24gc2VnbWVudCA6IGNhbid0IGZpbmQgcmVmZXJlZCB0byBzZWdtZW50cyIpOwotICAgICAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gNCkgfHwgKHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSAyMCkKLSAgICAgICAgICAgICAgICAgICAgfHwgKHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSAzNikgfHwgKHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSA0MCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihpID49IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50KSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJnZW5lcmljIHJlZmluZW1lbnQgcmVnaW9uIHNlZ21lbnQgOiBjYW4ndCBmaW5kIHJlZmVyZWQgdG8gaW50ZXJtZWRpYXRlIHJlZ2lvbiIpOwotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFID0gcFNlZy0+bV9SZXN1bHQuaW07CisgICAgaWYgKGNTQkhVRkZSREggPT0gMCkgeworICAgICAgaWYgKCFUYWJsZV9CMTQpIHsKKyAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjE0LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE0KSk7CisgICAgICB9CisgICAgICBwVFJELT5TQkhVRkZSREggPSBUYWJsZV9CMTQ7CisgICAgfSBlbHNlIGlmIChjU0JIVUZGUkRIID09IDEpIHsKKyAgICAgIGlmICghVGFibGVfQjE1KSB7CisgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxNSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOworICAgICAgfQorICAgICAgcFRSRC0+U0JIVUZGUkRIID0gVGFibGVfQjE1OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRSA9IG1fcFBhZ2U7CisgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOworICAgICAgaWYgKCFwU2VnKSB7CisgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAidGV4dCByZWdpb24gc2VnbWVudCA6IFNCSFVGRlJESCBjYW4ndCBmaW5kIHVzZXIgc3VwcGxpZWQgdGFibGUiKTsKKyAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKyAgICAgIHBUUkQtPlNCSFVGRlJESCA9IHBTZWctPm1fUmVzdWx0Lmh0OwogICAgIH0KLSAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWCA9IDA7Ci0gICAgcEdSUkQtPkdSUkVGRVJFTkNFRFkgPSAwOwotICAgIGR3VGVtcCA9IHBHUlJELT5HUlRFTVBMQVRFID8gMSA8PCAxMCA6IDEgPDwgMTM7Ci0gICAgZ3JDb250ZXh0ID0gKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoSkJpZzJBcml0aEN0eCksIGR3VGVtcCk7Ci0gICAgSkJJRzJfbWVtc2V0KGdyQ29udGV4dCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpKmR3VGVtcCk7CisgICAgaWYgKGNTQkhVRkZSRFggPT0gMCkgeworICAgICAgaWYgKCFUYWJsZV9CMTQpIHsKKyAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjE0LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE0KSk7CisgICAgICB9CisgICAgICBwVFJELT5TQkhVRkZSRFggPSBUYWJsZV9CMTQ7CisgICAgfSBlbHNlIGlmIChjU0JIVUZGUkRYID09IDEpIHsKKyAgICAgIGlmICghVGFibGVfQjE1KSB7CisgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxNSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOworICAgICAgfQorICAgICAgcFRSRC0+U0JIVUZGUkRYID0gVGFibGVfQjE1OworICAgIH0gZWxzZSB7CisgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOworICAgICAgaWYgKCFwU2VnKSB7CisgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAidGV4dCByZWdpb24gc2VnbWVudCA6IFNCSFVGRlJEWCBjYW4ndCBmaW5kIHVzZXIgc3VwcGxpZWQgdGFibGUiKTsKKyAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKyAgICAgIHBUUkQtPlNCSFVGRlJEWCA9IHBTZWctPm1fUmVzdWx0Lmh0OworICAgIH0KKyAgICBpZiAoY1NCSFVGRlJEWSA9PSAwKSB7CisgICAgICBpZiAoIVRhYmxlX0IxNCkgeworICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMTQsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE0KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTQpKTsKKyAgICAgIH0KKyAgICAgIHBUUkQtPlNCSFVGRlJEWSA9IFRhYmxlX0IxNDsKKyAgICB9IGVsc2UgaWYgKGNTQkhVRkZSRFkgPT0gMSkgeworICAgICAgaWYgKCFUYWJsZV9CMTUpIHsKKyAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjE1LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7CisgICAgICB9CisgICAgICBwVFJELT5TQkhVRkZSRFkgPSBUYWJsZV9CMTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHBTZWcgPSBmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgocFNlZ21lbnQsIDUzLCBuSW5kZXgrKyk7CisgICAgICBpZiAoIXBTZWcpIHsKKyAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogU0JIVUZGUkRZIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZSIpOworICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorICAgICAgcFRSRC0+U0JIVUZGUkRZID0gcFNlZy0+bV9SZXN1bHQuaHQ7CisgICAgfQorICAgIGlmIChjU0JIVUZGUlNJWkUgPT0gMCkgeworICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjEsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjEpKTsKKyAgICAgIHBUUkQtPlNCSFVGRlJTSVpFID0gVGFibGVfQjE7CisgICAgfSBlbHNlIHsKKyAgICAgIHBTZWcgPSBmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgocFNlZ21lbnQsIDUzLCBuSW5kZXgrKyk7CisgICAgICBpZiAoIXBTZWcpIHsKKyAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogU0JIVUZGUlNJWkUgY2FuJ3QgZmluZCB1c2VyIHN1cHBsaWVkIHRhYmxlIik7CisgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisgICAgICBwVFJELT5TQkhVRkZSU0laRSA9IHBTZWctPm1fUmVzdWx0Lmh0OworICAgIH0KKyAgfQorICBpZiAocFRSRC0+U0JSRUZJTkUgPT0gMSkgeworICAgIGR3VGVtcCA9IHBUUkQtPlNCUlRFTVBMQVRFID8gMSA8PCAxMCA6IDEgPDwgMTM7CisgICAgZ3JDb250ZXh0ID0KKyAgICAgICAgKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoSkJpZzJBcml0aEN0eCksIGR3VGVtcCk7CisgICAgSkJJRzJfbWVtc2V0KGdyQ29udGV4dCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpICogZHdUZW1wKTsKKyAgfQorICBpZiAocFRSRC0+U0JIVUZGID09IDApIHsKICAgICBKQklHMl9BTExPQyhwQXJpdGhEZWNvZGVyLCBDSkJpZzJfQXJpdGhEZWNvZGVyKG1fcFN0cmVhbSkpOwogICAgIHBTZWdtZW50LT5tX25SZXN1bHRUeXBlID0gSkJJRzJfSU1BR0VfUE9JTlRFUjsKLSAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBwR1JSRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gcFRSRC0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7CiAgICAgZGVsZXRlIHBBcml0aERlY29kZXI7Ci0gICAgaWYocFNlZ21lbnQtPm1fUmVzdWx0LmltID09IE5VTEwpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdyQ29udGV4dCk7Ci0gICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKLSAgICAgICAgZ290byBmYWlsZWQ7CisgICAgaWYgKHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9PSBOVUxMKSB7CisgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgICBnb3RvIGZhaWxlZDsKICAgICB9Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdyQ29udGV4dCk7CiAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKICAgICBtX3BTdHJlYW0tPm9mZnNldCgyKTsKLSAgICBpZihwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlICE9IDQwKSB7Ci0gICAgICAgIGlmKCFtX2JCdWZTcGVjaWZpZWQpIHsKLSAgICAgICAgICAgIEpCaWcyUGFnZUluZm8gKnBQYWdlSW5mbyA9IG1fcFBhZ2VJbmZvTGlzdC0+Z2V0TGFzdCgpOwotICAgICAgICAgICAgaWYgKChwUGFnZUluZm8tPm1fYklzU3RyaXBlZCA9PSAxKSAmJiAocmkueSArIHJpLmhlaWdodCA+IG1fcFBhZ2UtPm1fbkhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICBtX3BQYWdlLT5leHBhbmQocmkueSArIHJpLmhlaWdodCwgKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX3BQYWdlLT5jb21wb3NlRnJvbShyaS54LCByaS55LCBwU2VnbWVudC0+bV9SZXN1bHQuaW0sIChKQmlnMkNvbXBvc2VPcCkocmkuZmxhZ3MgJiAweDAzKSk7Ci0gICAgICAgIGRlbGV0ZSBwU2VnbWVudC0+bV9SZXN1bHQuaW07Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9IE5VTEw7Ci0gICAgfQotICAgIGRlbGV0ZSBwR1JSRDsKLSAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLWZhaWxlZDoKLSAgICBkZWxldGUgcEdSUkQ7Ci0gICAgcmV0dXJuIG5SZXQ7Ci19Ci1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVRhYmxlKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCkKLXsKLSAgICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0hVRkZNQU5fVEFCTEVfUE9JTlRFUjsKLSAgICBKQklHMl9BTExPQyhwU2VnbWVudC0+bV9SZXN1bHQuaHQsIENKQmlnMl9IdWZmbWFuVGFibGUobV9wU3RyZWFtKSk7Ci0gICAgaWYoIXBTZWdtZW50LT5tX1Jlc3VsdC5odC0+aXNPSygpKSB7Ci0gICAgICAgIGRlbGV0ZSBwU2VnbWVudC0+bV9SZXN1bHQuaHQ7Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5odCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKKyAgfSBlbHNlIHsKKyAgICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0lNQUdFX1BPSU5URVI7CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gcFRSRC0+ZGVjb2RlX0h1ZmZtYW4obV9wU3RyZWFtLCBnckNvbnRleHQpOworICAgIGlmIChwU2VnbWVudC0+bV9SZXN1bHQuaW0gPT0gTlVMTCkgeworICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgZ290byBmYWlsZWQ7CiAgICAgfQogICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci19Ci1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVJlZ2lvbkluZm8oSkJpZzJSZWdpb25JbmZvICpwUkkpCi17Ci0gICAgaWYoKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoKEZYX0RXT1JEKikmcFJJLT53aWR0aCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKChGWF9EV09SRCopJnBSSS0+aGVpZ2h0KSAhPSAwKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoKEZYX0RXT1JEKikmcFJJLT54KSAhPSAwKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoKEZYX0RXT1JEKikmcFJJLT55KSAhPSAwKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZwUkktPmZsYWdzKSAhPSAwKSkgewotICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICB9CisgIGlmIChwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlICE9IDQpIHsKKyAgICBpZiAoIW1fYkJ1ZlNwZWNpZmllZCkgeworICAgICAgSkJpZzJQYWdlSW5mbyogcFBhZ2VJbmZvID0gbV9wUGFnZUluZm9MaXN0LT5nZXRMYXN0KCk7CisgICAgICBpZiAoKHBQYWdlSW5mby0+bV9iSXNTdHJpcGVkID09IDEpICYmCisgICAgICAgICAgKHJpLnkgKyByaS5oZWlnaHQgPiBtX3BQYWdlLT5tX25IZWlnaHQpKSB7CisgICAgICAgIG1fcFBhZ2UtPmV4cGFuZChyaS55ICsgcmkuaGVpZ2h0LCAocFBhZ2VJbmZvLT5tX2NGbGFncyAmIDQpID8gMSA6IDApOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLX0KLUpCaWcySHVmZm1hbkNvZGUgKkNKQmlnMl9Db250ZXh0OjpkZWNvZGVTeW1ib2xJREh1ZmZtYW5UYWJsZShDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLAotICAgICAgICBGWF9EV09SRCBTQk5VTVNZTVMpCi17Ci0gICAgSkJpZzJIdWZmbWFuQ29kZSAqU0JTWU1DT0RFUzsKLSAgICBpbnQzMl90IHJ1bmNvZGVzWzM1XTsKLSAgICBpbnQzMl90IHJ1bmNvZGVzX2xlblszNV07Ci0gICAgaW50MzJfdCBydW5jb2RlOwotICAgIGludDMyX3QgaTsKLSAgICBpbnQzMl90IGo7Ci0gICAgaW50MzJfdCBuVmFsOwotICAgIGludDMyX3QgbkJpdHM7Ci0gICAgaW50MzJfdCBydW47Ci0gICAgRlhfRFdPUkQgblRlbXA7Ci0gICAgU0JTWU1DT0RFUyA9IChKQmlnMkh1ZmZtYW5Db2RlKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEpCaWcySHVmZm1hbkNvZGUpLCBTQk5VTVNZTVMpOwotICAgIGZvciAoaSA9IDA7IGkgPCAzNTsgaSArKykgewotICAgICAgICBpZihwU3RyZWFtLT5yZWFkTkJpdHMoNCwgJnJ1bmNvZGVzX2xlbltpXSkgIT0gMCkgewotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaHVmZm1hbl9hc3NpZ25fY29kZShydW5jb2RlcywgcnVuY29kZXNfbGVuLCAzNSk7Ci0gICAgaSA9IDA7Ci0gICAgd2hpbGUoaSA8IChpbnQpU0JOVU1TWU1TKSB7Ci0gICAgICAgIG5WYWwgPSAwOwotICAgICAgICBuQml0cyA9IDA7Ci0gICAgICAgIGZvcig7OykgewotICAgICAgICAgICAgaWYocFN0cmVhbS0+cmVhZDFCaXQoJm5UZW1wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuVmFsID0gKG5WYWwgPDwgMSkgfCBuVGVtcDsKLSAgICAgICAgICAgIG5CaXRzICsrOwotICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgMzU7IGorKykgewotICAgICAgICAgICAgICAgIGlmKChuQml0cyA9PSBydW5jb2Rlc19sZW5bal0pICYmIChuVmFsID09IHJ1bmNvZGVzW2pdKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihqIDwgMzUpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBydW5jb2RlID0gajsKLSAgICAgICAgaWYocnVuY29kZSA8IDMyKSB7Ci0gICAgICAgICAgICBTQlNZTUNPREVTW2ldLmNvZGVsZW4gPSBydW5jb2RlOwotICAgICAgICAgICAgcnVuID0gMDsKLSAgICAgICAgfSBlbHNlIGlmKHJ1bmNvZGUgPT0gMzIpIHsKLSAgICAgICAgICAgIGlmKHBTdHJlYW0tPnJlYWROQml0cygyLCAmblRlbXApICE9IDApIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1biA9IG5UZW1wICsgMzsKLSAgICAgICAgfSBlbHNlIGlmKHJ1bmNvZGUgPT0gMzMpIHsKLSAgICAgICAgICAgIGlmKHBTdHJlYW0tPnJlYWROQml0cygzLCAmblRlbXApICE9IDApIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1biA9IG5UZW1wICsgMzsKLSAgICAgICAgfSBlbHNlIGlmKHJ1bmNvZGUgPT0gMzQpIHsKLSAgICAgICAgICAgIGlmKHBTdHJlYW0tPnJlYWROQml0cyg3LCAmblRlbXApICE9IDApIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1biA9IG5UZW1wICsgMTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYocnVuID4gMCkgewotICAgICAgICAgICAgaWYgKGkgKyBydW4gPiAoaW50KVNCTlVNU1lNUykgewotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgcnVuOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZihydW5jb2RlID09IDMyICYmIGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNCU1lNQ09ERVNbaSArIGpdLmNvZGVsZW4gPSBTQlNZTUNPREVTW2kgLSAxXS5jb2RlbGVuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFNCU1lNQ09ERVNbaSArIGpdLmNvZGVsZW4gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkgKz0gcnVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaSArKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBodWZmbWFuX2Fzc2lnbl9jb2RlKFNCU1lNQ09ERVMsIFNCTlVNU1lNUyk7Ci0gICAgcmV0dXJuIFNCU1lNQ09ERVM7Ci1mYWlsZWQ6CisgICAgbV9wUGFnZS0+Y29tcG9zZUZyb20ocmkueCwgcmkueSwgcFNlZ21lbnQtPm1fUmVzdWx0LmltLAorICAgICAgICAgICAgICAgICAgICAgICAgIChKQmlnMkNvbXBvc2VPcCkocmkuZmxhZ3MgJiAweDAzKSk7CisgICAgZGVsZXRlIHBTZWdtZW50LT5tX1Jlc3VsdC5pbTsKKyAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBOVUxMOworICB9CisgIGRlbGV0ZSBwVFJEOworICBpZiAoU0JTWU1TKSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7CisgIH0KKyAgaWYgKFNCU1lNQ09ERVMpIHsKICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1DT0RFUyk7Ci0gICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGdyQ29udGV4dCkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnckNvbnRleHQpOworICB9CisgIGRlbGV0ZSBUYWJsZV9CMTsKKyAgZGVsZXRlIFRhYmxlX0I2OworICBkZWxldGUgVGFibGVfQjc7CisgIGRlbGV0ZSBUYWJsZV9CODsKKyAgZGVsZXRlIFRhYmxlX0I5OworICBkZWxldGUgVGFibGVfQjEwOworICBkZWxldGUgVGFibGVfQjExOworICBkZWxldGUgVGFibGVfQjEyOworICBkZWxldGUgVGFibGVfQjEzOworICBkZWxldGUgVGFibGVfQjE0OworICBkZWxldGUgVGFibGVfQjE1OworICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKK2ZhaWxlZDoKKyAgZGVsZXRlIHBUUkQ7CisgIGlmIChTQlNZTVMpIHsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKKyAgfQorICBpZiAoU0JTWU1DT0RFUykgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTUNPREVTKTsKKyAgfQorICBpZiAoZ3JDb250ZXh0KSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdyQ29udGV4dCk7CisgIH0KKyAgZGVsZXRlIFRhYmxlX0IxOworICBkZWxldGUgVGFibGVfQjY7CisgIGRlbGV0ZSBUYWJsZV9CNzsKKyAgZGVsZXRlIFRhYmxlX0I4OworICBkZWxldGUgVGFibGVfQjk7CisgIGRlbGV0ZSBUYWJsZV9CMTA7CisgIGRlbGV0ZSBUYWJsZV9CMTE7CisgIGRlbGV0ZSBUYWJsZV9CMTI7CisgIGRlbGV0ZSBUYWJsZV9CMTM7CisgIGRlbGV0ZSBUYWJsZV9CMTQ7CisgIGRlbGV0ZSBUYWJsZV9CMTU7CisgIHJldHVybiBuUmV0OwogfQotdm9pZCBDSkJpZzJfQ29udGV4dDo6aHVmZm1hbl9hc3NpZ25fY29kZShpbnQqIENPREVTLCBpbnQqIFBSRUZMRU4sIGludCBOVEVNUCkKLXsKLSAgICBpbnQgQ1VSTEVOLCBMRU5NQVgsIENVUkNPREUsIENVUlRFTVAsIGk7Ci0gICAgaW50ICpMRU5DT1VOVDsKLSAgICBpbnQgKkZJUlNUQ09ERTsKLSAgICBMRU5NQVggPSAwOwotICAgIGZvcihpID0gMDsgaSA8IE5URU1QOyBpKyspIHsKLSAgICAgICAgaWYoUFJFRkxFTltpXSA+IExFTk1BWCkgewotICAgICAgICAgICAgTEVOTUFYID0gUFJFRkxFTltpXTsKLSAgICAgICAgfQorCitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVBhdHRlcm5EaWN0KENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfRFdPUkQgZHdUZW1wOworICB1aW50OF90IGNGbGFnczsKKyAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0OworICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyOworICBDSkJpZzJfUEREUHJvYyogcFBERDsKKyAgaW50MzJfdCBuUmV0OworICBKQklHMl9BTExPQyhwUERELCBDSkJpZzJfUEREUHJvYygpKTsKKyAgaWYgKChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY0ZsYWdzKSAhPSAwKSB8fAorICAgICAgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZwUERELT5IRFBXKSAhPSAwKSB8fAorICAgICAgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZwUERELT5IRFBIKSAhPSAwKSB8fAorICAgICAgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBQREQtPkdSQVlNQVgpICE9IDApKSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgInBhdHRlcm4gZGljdGlvbmFyeSBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOworICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgaWYgKHBQREQtPkdSQVlNQVggPiBKQklHMl9NQVhfUEFUVEVSTl9JTkRFWCkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInBhdHRlcm4gZGljdGlvbmFyeSBzZWdtZW50IDogdG9vIG1heCBncmF5IG1heC4iKTsKKyAgICBuUmV0ID0gSkJJRzJfRVJST1JfTElNSVQ7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgcFBERC0+SERNTVIgPSBjRmxhZ3MgJiAweDAxOworICBwUERELT5IRFRFTVBMQVRFID0gKGNGbGFncyA+PiAxKSAmIDB4MDM7CisgIHBTZWdtZW50LT5tX25SZXN1bHRUeXBlID0gSkJJRzJfUEFUVEVSTl9ESUNUX1BPSU5URVI7CisgIGlmIChwUERELT5IRE1NUiA9PSAwKSB7CisgICAgZHdUZW1wID0KKyAgICAgICAgcFBERC0+SERURU1QTEFURSA9PSAwID8gNjU1MzYgOiBwUERELT5IRFRFTVBMQVRFID09IDEgPyA4MTkyIDogMTAyNDsKKyAgICBnYkNvbnRleHQgPQorICAgICAgICAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgZHdUZW1wKTsKKyAgICBKQklHMl9tZW1zZXQoZ2JDb250ZXh0LCAwLCBzaXplb2YoSkJpZzJBcml0aEN0eCkgKiBkd1RlbXApOworICAgIEpCSUcyX0FMTE9DKHBBcml0aERlY29kZXIsIENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtKSk7CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnBkID0KKyAgICAgICAgcFBERC0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIsIGdiQ29udGV4dCwgcFBhdXNlKTsKKyAgICBkZWxldGUgcEFyaXRoRGVjb2RlcjsKKyAgICBpZiAocFNlZ21lbnQtPm1fUmVzdWx0LnBkID09IE5VTEwpIHsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnYkNvbnRleHQpOworICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgZ290byBmYWlsZWQ7CiAgICAgfQotICAgIExFTkNPVU5UID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCAoTEVOTUFYICsgMSkpOwotICAgIEpCSUcyX21lbXNldChMRU5DT1VOVCwgMCwgc2l6ZW9mKGludCkgKiAoTEVOTUFYICsgMSkpOwotICAgIEZJUlNUQ09ERSA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoaW50KSwgKExFTk1BWCArIDEpKTsKLSAgICBmb3IoaSA9IDA7IGkgPCBOVEVNUDsgaSsrKSB7Ci0gICAgICAgIExFTkNPVU5UW1BSRUZMRU5baV1dICsrOworICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnYkNvbnRleHQpOworICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgICAgbV9wU3RyZWFtLT5vZmZzZXQoMik7CisgIH0gZWxzZSB7CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnBkID0gcFBERC0+ZGVjb2RlX01NUihtX3BTdHJlYW0sIHBQYXVzZSk7CisgICAgaWYgKHBTZWdtZW50LT5tX1Jlc3VsdC5wZCA9PSBOVUxMKSB7CisgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgICBnb3RvIGZhaWxlZDsKICAgICB9Ci0gICAgQ1VSTEVOID0gMTsKLSAgICBGSVJTVENPREVbMF0gPSAwOwotICAgIExFTkNPVU5UWzBdICA9IDA7Ci0gICAgd2hpbGUoQ1VSTEVOIDw9IExFTk1BWCkgewotICAgICAgICBGSVJTVENPREVbQ1VSTEVOXSA9IChGSVJTVENPREVbQ1VSTEVOIC0gMV0gKyBMRU5DT1VOVFtDVVJMRU4gLSAxXSkgPDwgMTsKLSAgICAgICAgQ1VSQ09ERSA9IEZJUlNUQ09ERVtDVVJMRU5dOwotICAgICAgICBDVVJURU1QID0gMDsKLSAgICAgICAgd2hpbGUoQ1VSVEVNUCA8IE5URU1QKSB7Ci0gICAgICAgICAgICBpZihQUkVGTEVOW0NVUlRFTVBdID09IENVUkxFTikgewotICAgICAgICAgICAgICAgIENPREVTW0NVUlRFTVBdID0gQ1VSQ09ERTsKLSAgICAgICAgICAgICAgICBDVVJDT0RFID0gQ1VSQ09ERSArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDVVJURU1QID0gQ1VSVEVNUCArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgQ1VSTEVOID0gQ1VSTEVOICsgMTsKLSAgICB9Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKExFTkNPVU5UKTsKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoRklSU1RDT0RFKTsKKyAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOworICB9CisgIGRlbGV0ZSBwUEREOworICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKK2ZhaWxlZDoKKyAgZGVsZXRlIHBQREQ7CisgIHJldHVybiBuUmV0OwogfQotdm9pZCBDSkJpZzJfQ29udGV4dDo6aHVmZm1hbl9hc3NpZ25fY29kZShKQmlnMkh1ZmZtYW5Db2RlICpTQlNZTUNPREVTLCBpbnQgTlRFTVApCi17Ci0gICAgaW50IENVUkxFTiwgTEVOTUFYLCBDVVJDT0RFLCBDVVJURU1QLCBpOwotICAgIGludCAqTEVOQ09VTlQ7Ci0gICAgaW50ICpGSVJTVENPREU7Ci0gICAgTEVOTUFYID0gMDsKLSAgICBmb3IoaSA9IDA7IGkgPCBOVEVNUDsgaSsrKSB7Ci0gICAgICAgIGlmKFNCU1lNQ09ERVNbaV0uY29kZWxlbiA+IExFTk1BWCkgewotICAgICAgICAgICAgTEVOTUFYID0gU0JTWU1DT0RFU1tpXS5jb2RlbGVuOworaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VIYWxmdG9uZVJlZ2lvbihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0RXT1JEIGR3VGVtcDsKKyAgdWludDhfdCBjRmxhZ3M7CisgIEpCaWcyUmVnaW9uSW5mbyByaTsKKyAgQ0pCaWcyX1NlZ21lbnQqIHBTZWc7CisgIENKQmlnMl9QYXR0ZXJuRGljdCogcFBhdHRlcm5EaWN0OworICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQ7CisgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXI7CisgIENKQmlnMl9IVFJEUHJvYyogcEhSRDsKKyAgaW50MzJfdCBuUmV0OworICBKQklHMl9BTExPQyhwSFJELCBDSkJpZzJfSFRSRFByb2MoKSk7CisgIGlmICgocGFyc2VSZWdpb25JbmZvKCZyaSkgIT0gSkJJRzJfU1VDQ0VTUykgfHwKKyAgICAgIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY0ZsYWdzKSAhPSAwKSB8fAorICAgICAgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBIUkQtPkhHVykgIT0gMCkgfHwKKyAgICAgIChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwSFJELT5IR0gpICE9IDApIHx8CisgICAgICAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigoRlhfRFdPUkQqKSZwSFJELT5IR1gpICE9IDApIHx8CisgICAgICAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigoRlhfRFdPUkQqKSZwSFJELT5IR1kpICE9IDApIHx8CisgICAgICAobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZwSFJELT5IUlgpICE9IDApIHx8CisgICAgICAobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZwSFJELT5IUlkpICE9IDApKSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiaGFsZnRvbmUgcmVnaW9uIHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7CisgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBwSFJELT5IQlcgPSByaS53aWR0aDsKKyAgcEhSRC0+SEJIID0gcmkuaGVpZ2h0OworICBwSFJELT5ITU1SID0gY0ZsYWdzICYgMHgwMTsKKyAgcEhSRC0+SFRFTVBMQVRFID0gKGNGbGFncyA+PiAxKSAmIDB4MDM7CisgIHBIUkQtPkhFTkFCTEVTS0lQID0gKGNGbGFncyA+PiAzKSAmIDB4MDE7CisgIHBIUkQtPkhDT01CT1AgPSAoSkJpZzJDb21wb3NlT3ApKChjRmxhZ3MgPj4gNCkgJiAweDA3KTsKKyAgcEhSRC0+SERFRlBJWEVMID0gKGNGbGFncyA+PiA3KSAmIDB4MDE7CisgIGlmIChwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCAhPSAxKSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgImhhbGZ0b25lIHJlZ2lvbiBzZWdtZW50IDogcmVmZXJlZCB0byBzZWdtZW50IGNvdW50IG5vdCBlcXVhbHMgMSIpOworICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBwU2VnID0gZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzWzBdKTsKKyAgaWYgKChwU2VnID09IE5VTEwpIHx8IChwU2VnLT5tX2NGbGFncy5zLnR5cGUgIT0gMTYpKSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgImhhbGZ0b25lIHJlZ2lvbiBzZWdtZW50IDogcmVmZXJlZCB0byBzZWdtZW50IGlzIG5vdCBwYXR0ZXJuIGRpY3QiKTsKKyAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgcFBhdHRlcm5EaWN0ID0gcFNlZy0+bV9SZXN1bHQucGQ7CisgIGlmICgocFBhdHRlcm5EaWN0ID09IE5VTEwpIHx8IChwUGF0dGVybkRpY3QtPk5VTVBBVFMgPT0gMCkpIHsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJoYWxmdG9uZSByZWdpb24gc2VnbWVudCA6IGhhcyBubyBwYXR0ZXJucyBpbnB1dCIpOworICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBwSFJELT5ITlVNUEFUUyA9IHBQYXR0ZXJuRGljdC0+TlVNUEFUUzsKKyAgcEhSRC0+SFBBVFMgPSBwUGF0dGVybkRpY3QtPkhEUEFUUzsKKyAgcEhSRC0+SFBXID0gcFBhdHRlcm5EaWN0LT5IRFBBVFNbMF0tPm1fbldpZHRoOworICBwSFJELT5IUEggPSBwUGF0dGVybkRpY3QtPkhEUEFUU1swXS0+bV9uSGVpZ2h0OworICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0lNQUdFX1BPSU5URVI7CisgIGlmIChwSFJELT5ITU1SID09IDApIHsKKyAgICBkd1RlbXAgPSBwSFJELT5IVEVNUExBVEUgPT0gMCA/IDY1NTM2IDogcEhSRC0+SFRFTVBMQVRFID09IDEgPyA4MTkyIDogMTAyNDsKKyAgICBnYkNvbnRleHQgPQorICAgICAgICAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgZHdUZW1wKTsKKyAgICBKQklHMl9tZW1zZXQoZ2JDb250ZXh0LCAwLCBzaXplb2YoSkJpZzJBcml0aEN0eCkgKiBkd1RlbXApOworICAgIEpCSUcyX0FMTE9DKHBBcml0aERlY29kZXIsIENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtKSk7CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0KKyAgICAgICAgcEhSRC0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIsIGdiQ29udGV4dCwgcFBhdXNlKTsKKyAgICBkZWxldGUgcEFyaXRoRGVjb2RlcjsKKyAgICBpZiAocFNlZ21lbnQtPm1fUmVzdWx0LmltID09IE5VTEwpIHsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnYkNvbnRleHQpOworICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnYkNvbnRleHQpOworICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgICAgbV9wU3RyZWFtLT5vZmZzZXQoMik7CisgIH0gZWxzZSB7CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gcEhSRC0+ZGVjb2RlX01NUihtX3BTdHJlYW0sIHBQYXVzZSk7CisgICAgaWYgKHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9PSBOVUxMKSB7CisgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgfQorICBpZiAocFNlZ21lbnQtPm1fY0ZsYWdzLnMudHlwZSAhPSAyMCkgeworICAgIGlmICghbV9iQnVmU3BlY2lmaWVkKSB7CisgICAgICBKQmlnMlBhZ2VJbmZvKiBwUGFnZUluZm8gPSBtX3BQYWdlSW5mb0xpc3QtPmdldExhc3QoKTsKKyAgICAgIGlmICgocFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgPT0gMSkgJiYKKyAgICAgICAgICAocmkueSArIHJpLmhlaWdodCA+IG1fcFBhZ2UtPm1fbkhlaWdodCkpIHsKKyAgICAgICAgbV9wUGFnZS0+ZXhwYW5kKHJpLnkgKyByaS5oZWlnaHQsIChwUGFnZUluZm8tPm1fY0ZsYWdzICYgNCkgPyAxIDogMCk7CisgICAgICB9CisgICAgfQorICAgIG1fcFBhZ2UtPmNvbXBvc2VGcm9tKHJpLngsIHJpLnksIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoSkJpZzJDb21wb3NlT3ApKHJpLmZsYWdzICYgMHgwMykpOworICAgIGRlbGV0ZSBwU2VnbWVudC0+bV9SZXN1bHQuaW07CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gTlVMTDsKKyAgfQorICBkZWxldGUgcEhSRDsKKyAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CitmYWlsZWQ6CisgIGRlbGV0ZSBwSFJEOworICByZXR1cm4gblJldDsKK30KKworaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VHZW5lcmljUmVnaW9uKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWF9EV09SRCBkd1RlbXA7CisgIHVpbnQ4X3QgY0ZsYWdzOworICBpbnQzMl90IGksIG5SZXQ7CisgIGlmIChtX3BHUkQgPT0gTlVMTCkgeworICAgIEpCSUcyX0FMTE9DKG1fcEdSRCwgQ0pCaWcyX0dSRFByb2MoKSk7CisgICAgaWYgKChwYXJzZVJlZ2lvbkluZm8oJm1fcmkpICE9IEpCSUcyX1NVQ0NFU1MpIHx8CisgICAgICAgIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY0ZsYWdzKSAhPSAwKSkgeworICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiZ2VuZXJpYyByZWdpb24gc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKKyAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgaWYgKG1fcmkuaGVpZ2h0IDwgMCB8fCBtX3JpLndpZHRoIDwgMCkgeworICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiZ2VuZXJpYyByZWdpb24gc2VnbWVudCA6IHdyb25nIGRhdGEuIik7CisgICAgICBuUmV0ID0gSkJJRzJfRkFJTEVEOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIG1fcEdSRC0+R0JXID0gbV9yaS53aWR0aDsKKyAgICBtX3BHUkQtPkdCSCA9IG1fcmkuaGVpZ2h0OworICAgIG1fcEdSRC0+TU1SID0gY0ZsYWdzICYgMHgwMTsKKyAgICBtX3BHUkQtPkdCVEVNUExBVEUgPSAoY0ZsYWdzID4+IDEpICYgMHgwMzsKKyAgICBtX3BHUkQtPlRQR0RPTiA9IChjRmxhZ3MgPj4gMykgJiAweDAxOworICAgIGlmIChtX3BHUkQtPk1NUiA9PSAwKSB7CisgICAgICBpZiAobV9wR1JELT5HQlRFTVBMQVRFID09IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgIGlmIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgodWludDhfdCopJm1fcEdSRC0+R0JBVFtpXSkgIT0gMCkgeworICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICAgICAiZ2VuZXJpYyByZWdpb24gc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKKyAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgTEVOQ09VTlQgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIChMRU5NQVggKyAxKSk7Ci0gICAgSkJJRzJfbWVtc2V0KExFTkNPVU5ULCAwLCBzaXplb2YoaW50KSAqIChMRU5NQVggKyAxKSk7Ci0gICAgRklSU1RDT0RFID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCAoTEVOTUFYICsgMSkpOwotICAgIGZvcihpID0gMDsgaSA8IE5URU1QOyBpKyspIHsKLSAgICAgICAgTEVOQ09VTlRbU0JTWU1DT0RFU1tpXS5jb2RlbGVuXSArKzsKLSAgICB9Ci0gICAgQ1VSTEVOID0gMTsKLSAgICBGSVJTVENPREVbMF0gPSAwOwotICAgIExFTkNPVU5UWzBdICA9IDA7Ci0gICAgd2hpbGUoQ1VSTEVOIDw9IExFTk1BWCkgewotICAgICAgICBGSVJTVENPREVbQ1VSTEVOXSA9IChGSVJTVENPREVbQ1VSTEVOIC0gMV0gKyBMRU5DT1VOVFtDVVJMRU4gLSAxXSkgPDwgMTsKLSAgICAgICAgQ1VSQ09ERSA9IEZJUlNUQ09ERVtDVVJMRU5dOwotICAgICAgICBDVVJURU1QID0gMDsKLSAgICAgICAgd2hpbGUoQ1VSVEVNUCA8IE5URU1QKSB7Ci0gICAgICAgICAgICBpZihTQlNZTUNPREVTW0NVUlRFTVBdLmNvZGVsZW4gPT0gQ1VSTEVOKSB7Ci0gICAgICAgICAgICAgICAgU0JTWU1DT0RFU1tDVVJURU1QXS5jb2RlID0gQ1VSQ09ERTsKLSAgICAgICAgICAgICAgICBDVVJDT0RFID0gQ1VSQ09ERSArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDVVJURU1QID0gQ1VSVEVNUCArIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgaWYgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCh1aW50OF90KikmbV9wR1JELT5HQkFUW2ldKSAhPSAwKSB7CisgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgICAgICJnZW5lcmljIHJlZ2lvbiBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOworICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBDVVJMRU4gPSBDVVJMRU4gKyAxOworICAgICAgfQogICAgIH0KLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoTEVOQ09VTlQpOwotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShGSVJTVENPREUpOworICAgIG1fcEdSRC0+VVNFU0tJUCA9IDA7CisgIH0KKyAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9JTUFHRV9QT0lOVEVSOworICBpZiAobV9wR1JELT5NTVIgPT0gMCkgeworICAgIGR3VGVtcCA9CisgICAgICAgIG1fcEdSRC0+R0JURU1QTEFURSA9PSAwID8gNjU1MzYgOiBtX3BHUkQtPkdCVEVNUExBVEUgPT0gMSA/IDgxOTIgOiAxMDI0OworICAgIGlmIChtX2diQ29udGV4dCA9PSBOVUxMKSB7CisgICAgICBtX2diQ29udGV4dCA9IChKQmlnMkFyaXRoQ3R4KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYygKKyAgICAgICAgICBzaXplb2YoSkJpZzJBcml0aEN0eCkgKiBkd1RlbXApOworICAgICAgSkJJRzJfbWVtc2V0KG1fZ2JDb250ZXh0LCAwLCBzaXplb2YoSkJpZzJBcml0aEN0eCkgKiBkd1RlbXApOworICAgIH0KKyAgICBpZiAobV9wQXJpdGhEZWNvZGVyID09IE5VTEwpIHsKKyAgICAgIEpCSUcyX0FMTE9DKG1fcEFyaXRoRGVjb2RlciwgQ0pCaWcyX0FyaXRoRGVjb2RlcihtX3BTdHJlYW0pKTsKKyAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IG1fcEdSRC0+U3RhcnRfZGVjb2RlX0FyaXRoKAorICAgICAgICAgICZwU2VnbWVudC0+bV9SZXN1bHQuaW0sIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IG1fcEdSRC0+Q29udGludWVfZGVjb2RlKHBQYXVzZSk7CisgICAgfQorICAgIE91dHB1dEJpdG1hcChwU2VnbWVudC0+bV9SZXN1bHQuaW0pOworICAgIGlmIChtX1Byb2Nlc3NpdmVTdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgeworICAgICAgaWYgKHBTZWdtZW50LT5tX2NGbGFncy5zLnR5cGUgIT0gMzYpIHsKKyAgICAgICAgaWYgKCFtX2JCdWZTcGVjaWZpZWQpIHsKKyAgICAgICAgICBKQmlnMlBhZ2VJbmZvKiBwUGFnZUluZm8gPSBtX3BQYWdlSW5mb0xpc3QtPmdldExhc3QoKTsKKyAgICAgICAgICBpZiAoKHBQYWdlSW5mby0+bV9iSXNTdHJpcGVkID09IDEpICYmCisgICAgICAgICAgICAgIChtX3JpLnkgKyBtX3JpLmhlaWdodCA+IG1fcFBhZ2UtPm1fbkhlaWdodCkpIHsKKyAgICAgICAgICAgIG1fcFBhZ2UtPmV4cGFuZChtX3JpLnkgKyBtX3JpLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFBhZ2VJbmZvLT5tX2NGbGFncyAmIDQpID8gMSA6IDApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGWF9SRUNUIFJlY3QgPSBtX3BHUkQtPkdldFJlcGxhY2VSZWN0KCk7CisgICAgICAgIG1fcFBhZ2UtPmNvbXBvc2VGcm9tKG1fcmkueCArIFJlY3QubGVmdCwgbV9yaS55ICsgUmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEpCaWcyQ29tcG9zZU9wKShtX3JpLmZsYWdzICYgMHgwMyksICZSZWN0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBKQklHMl9TVUNDRVNTOworICAgIH0gZWxzZSB7CisgICAgICBkZWxldGUgbV9wQXJpdGhEZWNvZGVyOworICAgICAgbV9wQXJpdGhEZWNvZGVyID0gTlVMTDsKKyAgICAgIGlmIChwU2VnbWVudC0+bV9SZXN1bHQuaW0gPT0gTlVMTCkgeworICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUobV9nYkNvbnRleHQpOworICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgICAgIG1fZ2JDb250ZXh0ID0gTlVMTDsKKyAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fZ2JDb250ZXh0KTsKKyAgICAgIG1fZ2JDb250ZXh0ID0gTlVMTDsKKyAgICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgICAgICBtX3BTdHJlYW0tPm9mZnNldCgyKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0KKyAgICAgICAgbV9wR1JELT5TdGFydF9kZWNvZGVfTU1SKCZwU2VnbWVudC0+bV9SZXN1bHQuaW0sIG1fcFN0cmVhbSwgcFBhdXNlKTsKKyAgICB3aGlsZSAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKKyAgICAgIG1fcEdSRC0+Q29udGludWVfZGVjb2RlKHBQYXVzZSk7CisgICAgfQorICAgIGlmIChwU2VnbWVudC0+bV9SZXN1bHQuaW0gPT0gTlVMTCkgeworICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgIH0KKyAgaWYgKHBTZWdtZW50LT5tX2NGbGFncy5zLnR5cGUgIT0gMzYpIHsKKyAgICBpZiAoIW1fYkJ1ZlNwZWNpZmllZCkgeworICAgICAgSkJpZzJQYWdlSW5mbyogcFBhZ2VJbmZvID0gbV9wUGFnZUluZm9MaXN0LT5nZXRMYXN0KCk7CisgICAgICBpZiAoKHBQYWdlSW5mby0+bV9iSXNTdHJpcGVkID09IDEpICYmCisgICAgICAgICAgKG1fcmkueSArIG1fcmkuaGVpZ2h0ID4gbV9wUGFnZS0+bV9uSGVpZ2h0KSkgeworICAgICAgICBtX3BQYWdlLT5leHBhbmQobV9yaS55ICsgbV9yaS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAocFBhZ2VJbmZvLT5tX2NGbGFncyAmIDQpID8gMSA6IDApOworICAgICAgfQorICAgIH0KKyAgICBGWF9SRUNUIFJlY3QgPSBtX3BHUkQtPkdldFJlcGxhY2VSZWN0KCk7CisgICAgbV9wUGFnZS0+Y29tcG9zZUZyb20obV9yaS54ICsgUmVjdC5sZWZ0LCBtX3JpLnkgKyBSZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgKEpCaWcyQ29tcG9zZU9wKShtX3JpLmZsYWdzICYgMHgwMyksICZSZWN0KTsKKyAgICBkZWxldGUgcFNlZ21lbnQtPm1fUmVzdWx0LmltOworICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9IE5VTEw7CisgIH0KKyAgZGVsZXRlIG1fcEdSRDsKKyAgbV9wR1JEID0gTlVMTDsKKyAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CitmYWlsZWQ6CisgIGRlbGV0ZSBtX3BHUkQ7CisgIG1fcEdSRCA9IE5VTEw7CisgIHJldHVybiBuUmV0OworfQorCitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCkgeworICBGWF9EV09SRCBkd1RlbXA7CisgIEpCaWcyUmVnaW9uSW5mbyByaTsKKyAgQ0pCaWcyX1NlZ21lbnQqIHBTZWc7CisgIGludDMyX3QgaSwgblJldDsKKyAgdWludDhfdCBjRmxhZ3M7CisgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dDsKKyAgQ0pCaWcyX0dSUkRQcm9jKiBwR1JSRDsKKyAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlcjsKKyAgSkJJRzJfQUxMT0MocEdSUkQsIENKQmlnMl9HUlJEUHJvYygpKTsKKyAgaWYgKChwYXJzZVJlZ2lvbkluZm8oJnJpKSAhPSBKQklHMl9TVUNDRVNTKSB8fAorICAgICAgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjRmxhZ3MpICE9IDApKSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgImdlbmVyaWMgcmVmaW5lbWVudCByZWdpb24gc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKKyAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICAgIGdvdG8gZmFpbGVkOworICB9CisgIHBHUlJELT5HUlcgPSByaS53aWR0aDsKKyAgcEdSUkQtPkdSSCA9IHJpLmhlaWdodDsKKyAgcEdSUkQtPkdSVEVNUExBVEUgPSBjRmxhZ3MgJiAweDAxOworICBwR1JSRC0+VFBHUk9OID0gKGNGbGFncyA+PiAxKSAmIDB4MDE7CisgIGlmIChwR1JSRC0+R1JURU1QTEFURSA9PSAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgaWYgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCh1aW50OF90KikmcEdSUkQtPkdSQVRbaV0pICE9IDApIHsKKyAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICJnZW5lcmljIHJlZmluZW1lbnQgcmVnaW9uIHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7CisgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorICAgIH0KKyAgfQorICBwU2VnID0gTlVMTDsKKyAgaWYgKHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ID4gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgaSsrKSB7CisgICAgICBwU2VnID0gZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzWzBdKTsKKyAgICAgIGlmIChwU2VnID09IE5VTEwpIHsKKyAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICJnZW5lcmljIHJlZmluZW1lbnQgcmVnaW9uIHNlZ21lbnQgOiBjYW4ndCBmaW5kIHJlZmVyZWQgdG8gIgorICAgICAgICAgICAgInNlZ21lbnRzIik7CisgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisgICAgICBpZiAoKHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSA0KSB8fCAocFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IDIwKSB8fAorICAgICAgICAgIChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gMzYpIHx8IChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gNDApKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA+PSBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCkgeworICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAiZ2VuZXJpYyByZWZpbmVtZW50IHJlZ2lvbiBzZWdtZW50IDogY2FuJ3QgZmluZCByZWZlcmVkIHRvICIKKyAgICAgICAgICAiaW50ZXJtZWRpYXRlIHJlZ2lvbiIpOworICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIHBHUlJELT5HUlJFRkVSRU5DRSA9IHBTZWctPm1fUmVzdWx0LmltOworICB9IGVsc2UgeworICAgIHBHUlJELT5HUlJFRkVSRU5DRSA9IG1fcFBhZ2U7CisgIH0KKyAgcEdSUkQtPkdSUkVGRVJFTkNFRFggPSAwOworICBwR1JSRC0+R1JSRUZFUkVOQ0VEWSA9IDA7CisgIGR3VGVtcCA9IHBHUlJELT5HUlRFTVBMQVRFID8gMSA8PCAxMCA6IDEgPDwgMTM7CisgIGdyQ29udGV4dCA9CisgICAgICAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgZHdUZW1wKTsKKyAgSkJJRzJfbWVtc2V0KGdyQ29udGV4dCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpICogZHdUZW1wKTsKKyAgSkJJRzJfQUxMT0MocEFyaXRoRGVjb2RlciwgQ0pCaWcyX0FyaXRoRGVjb2RlcihtX3BTdHJlYW0pKTsKKyAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9JTUFHRV9QT0lOVEVSOworICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBwR1JSRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7CisgIGRlbGV0ZSBwQXJpdGhEZWNvZGVyOworICBpZiAocFNlZ21lbnQtPm1fUmVzdWx0LmltID09IE5VTEwpIHsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoZ3JDb250ZXh0KTsKKyAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdyQ29udGV4dCk7CisgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgIG1fcFN0cmVhbS0+b2Zmc2V0KDIpOworICBpZiAocFNlZ21lbnQtPm1fY0ZsYWdzLnMudHlwZSAhPSA0MCkgeworICAgIGlmICghbV9iQnVmU3BlY2lmaWVkKSB7CisgICAgICBKQmlnMlBhZ2VJbmZvKiBwUGFnZUluZm8gPSBtX3BQYWdlSW5mb0xpc3QtPmdldExhc3QoKTsKKyAgICAgIGlmICgocFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgPT0gMSkgJiYKKyAgICAgICAgICAocmkueSArIHJpLmhlaWdodCA+IG1fcFBhZ2UtPm1fbkhlaWdodCkpIHsKKyAgICAgICAgbV9wUGFnZS0+ZXhwYW5kKHJpLnkgKyByaS5oZWlnaHQsIChwUGFnZUluZm8tPm1fY0ZsYWdzICYgNCkgPyAxIDogMCk7CisgICAgICB9CisgICAgfQorICAgIG1fcFBhZ2UtPmNvbXBvc2VGcm9tKHJpLngsIHJpLnksIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoSkJpZzJDb21wb3NlT3ApKHJpLmZsYWdzICYgMHgwMykpOworICAgIGRlbGV0ZSBwU2VnbWVudC0+bV9SZXN1bHQuaW07CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gTlVMTDsKKyAgfQorICBkZWxldGUgcEdSUkQ7CisgIHJldHVybiBKQklHMl9TVUNDRVNTOworZmFpbGVkOgorICBkZWxldGUgcEdSUkQ7CisgIHJldHVybiBuUmV0OworfQoraW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VUYWJsZShDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQpIHsKKyAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9IVUZGTUFOX1RBQkxFX1BPSU5URVI7CisgIEpCSUcyX0FMTE9DKHBTZWdtZW50LT5tX1Jlc3VsdC5odCwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShtX3BTdHJlYW0pKTsKKyAgaWYgKCFwU2VnbWVudC0+bV9SZXN1bHQuaHQtPmlzT0soKSkgeworICAgIGRlbGV0ZSBwU2VnbWVudC0+bV9SZXN1bHQuaHQ7CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0Lmh0ID0gTlVMTDsKKyAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisgIH0KKyAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Cit9CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVJlZ2lvbkluZm8oSkJpZzJSZWdpb25JbmZvKiBwUkkpIHsKKyAgaWYgKChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKChGWF9EV09SRCopJnBSSS0+d2lkdGgpICE9IDApIHx8CisgICAgICAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigoRlhfRFdPUkQqKSZwUkktPmhlaWdodCkgIT0gMCkgfHwKKyAgICAgIChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKChGWF9EV09SRCopJnBSSS0+eCkgIT0gMCkgfHwKKyAgICAgIChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKChGWF9EV09SRCopJnBSSS0+eSkgIT0gMCkgfHwKKyAgICAgIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmcFJJLT5mbGFncykgIT0gMCkpIHsKKyAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICB9CisgIHJldHVybiBKQklHMl9TVUNDRVNTOworfQorSkJpZzJIdWZmbWFuQ29kZSogQ0pCaWcyX0NvbnRleHQ6OmRlY29kZVN5bWJvbElESHVmZm1hblRhYmxlKAorICAgIENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCisgICAgRlhfRFdPUkQgU0JOVU1TWU1TKSB7CisgIEpCaWcySHVmZm1hbkNvZGUqIFNCU1lNQ09ERVM7CisgIGludDMyX3QgcnVuY29kZXNbMzVdOworICBpbnQzMl90IHJ1bmNvZGVzX2xlblszNV07CisgIGludDMyX3QgcnVuY29kZTsKKyAgaW50MzJfdCBpOworICBpbnQzMl90IGo7CisgIGludDMyX3QgblZhbDsKKyAgaW50MzJfdCBuQml0czsKKyAgaW50MzJfdCBydW47CisgIEZYX0RXT1JEIG5UZW1wOworICBTQlNZTUNPREVTID0gKEpCaWcySHVmZm1hbkNvZGUqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMigKKyAgICAgIHNpemVvZihKQmlnMkh1ZmZtYW5Db2RlKSwgU0JOVU1TWU1TKTsKKyAgZm9yIChpID0gMDsgaSA8IDM1OyBpKyspIHsKKyAgICBpZiAocFN0cmVhbS0+cmVhZE5CaXRzKDQsICZydW5jb2Rlc19sZW5baV0pICE9IDApIHsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgfQorICBodWZmbWFuX2Fzc2lnbl9jb2RlKHJ1bmNvZGVzLCBydW5jb2Rlc19sZW4sIDM1KTsKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludClTQk5VTVNZTVMpIHsKKyAgICBuVmFsID0gMDsKKyAgICBuQml0cyA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgaWYgKHBTdHJlYW0tPnJlYWQxQml0KCZuVGVtcCkgIT0gMCkgeworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKyAgICAgIG5WYWwgPSAoblZhbCA8PCAxKSB8IG5UZW1wOworICAgICAgbkJpdHMrKzsKKyAgICAgIGZvciAoaiA9IDA7IGogPCAzNTsgaisrKSB7CisgICAgICAgIGlmICgobkJpdHMgPT0gcnVuY29kZXNfbGVuW2pdKSAmJiAoblZhbCA9PSBydW5jb2Rlc1tqXSkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGogPCAzNSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcnVuY29kZSA9IGo7CisgICAgaWYgKHJ1bmNvZGUgPCAzMikgeworICAgICAgU0JTWU1DT0RFU1tpXS5jb2RlbGVuID0gcnVuY29kZTsKKyAgICAgIHJ1biA9IDA7CisgICAgfSBlbHNlIGlmIChydW5jb2RlID09IDMyKSB7CisgICAgICBpZiAocFN0cmVhbS0+cmVhZE5CaXRzKDIsICZuVGVtcCkgIT0gMCkgeworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKyAgICAgIHJ1biA9IG5UZW1wICsgMzsKKyAgICB9IGVsc2UgaWYgKHJ1bmNvZGUgPT0gMzMpIHsKKyAgICAgIGlmIChwU3RyZWFtLT5yZWFkTkJpdHMoMywgJm5UZW1wKSAhPSAwKSB7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorICAgICAgcnVuID0gblRlbXAgKyAzOworICAgIH0gZWxzZSBpZiAocnVuY29kZSA9PSAzNCkgeworICAgICAgaWYgKHBTdHJlYW0tPnJlYWROQml0cyg3LCAmblRlbXApICE9IDApIHsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisgICAgICBydW4gPSBuVGVtcCArIDExOworICAgIH0KKyAgICBpZiAocnVuID4gMCkgeworICAgICAgaWYgKGkgKyBydW4gPiAoaW50KVNCTlVNU1lNUykgeworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKyAgICAgIGZvciAoaiA9IDA7IGogPCBydW47IGorKykgeworICAgICAgICBpZiAocnVuY29kZSA9PSAzMiAmJiBpID4gMCkgeworICAgICAgICAgIFNCU1lNQ09ERVNbaSArIGpdLmNvZGVsZW4gPSBTQlNZTUNPREVTW2kgLSAxXS5jb2RlbGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNCU1lNQ09ERVNbaSArIGpdLmNvZGVsZW4gPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgICBpICs9IHJ1bjsKKyAgICB9IGVsc2UgeworICAgICAgaSsrOworICAgIH0KKyAgfQorICBodWZmbWFuX2Fzc2lnbl9jb2RlKFNCU1lNQ09ERVMsIFNCTlVNU1lNUyk7CisgIHJldHVybiBTQlNZTUNPREVTOworZmFpbGVkOgorICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1DT0RFUyk7CisgIHJldHVybiBOVUxMOworfQordm9pZCBDSkJpZzJfQ29udGV4dDo6aHVmZm1hbl9hc3NpZ25fY29kZShpbnQqIENPREVTLCBpbnQqIFBSRUZMRU4sIGludCBOVEVNUCkgeworICBpbnQgQ1VSTEVOLCBMRU5NQVgsIENVUkNPREUsIENVUlRFTVAsIGk7CisgIGludCogTEVOQ09VTlQ7CisgIGludCogRklSU1RDT0RFOworICBMRU5NQVggPSAwOworICBmb3IgKGkgPSAwOyBpIDwgTlRFTVA7IGkrKykgeworICAgIGlmIChQUkVGTEVOW2ldID4gTEVOTUFYKSB7CisgICAgICBMRU5NQVggPSBQUkVGTEVOW2ldOworICAgIH0KKyAgfQorICBMRU5DT1VOVCA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoaW50KSwgKExFTk1BWCArIDEpKTsKKyAgSkJJRzJfbWVtc2V0KExFTkNPVU5ULCAwLCBzaXplb2YoaW50KSAqIChMRU5NQVggKyAxKSk7CisgIEZJUlNUQ09ERSA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoaW50KSwgKExFTk1BWCArIDEpKTsKKyAgZm9yIChpID0gMDsgaSA8IE5URU1QOyBpKyspIHsKKyAgICBMRU5DT1VOVFtQUkVGTEVOW2ldXSsrOworICB9CisgIENVUkxFTiA9IDE7CisgIEZJUlNUQ09ERVswXSA9IDA7CisgIExFTkNPVU5UWzBdID0gMDsKKyAgd2hpbGUgKENVUkxFTiA8PSBMRU5NQVgpIHsKKyAgICBGSVJTVENPREVbQ1VSTEVOXSA9IChGSVJTVENPREVbQ1VSTEVOIC0gMV0gKyBMRU5DT1VOVFtDVVJMRU4gLSAxXSkgPDwgMTsKKyAgICBDVVJDT0RFID0gRklSU1RDT0RFW0NVUkxFTl07CisgICAgQ1VSVEVNUCA9IDA7CisgICAgd2hpbGUgKENVUlRFTVAgPCBOVEVNUCkgeworICAgICAgaWYgKFBSRUZMRU5bQ1VSVEVNUF0gPT0gQ1VSTEVOKSB7CisgICAgICAgIENPREVTW0NVUlRFTVBdID0gQ1VSQ09ERTsKKyAgICAgICAgQ1VSQ09ERSA9IENVUkNPREUgKyAxOworICAgICAgfQorICAgICAgQ1VSVEVNUCA9IENVUlRFTVAgKyAxOworICAgIH0KKyAgICBDVVJMRU4gPSBDVVJMRU4gKyAxOworICB9CisgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShMRU5DT1VOVCk7CisgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShGSVJTVENPREUpOworfQordm9pZCBDSkJpZzJfQ29udGV4dDo6aHVmZm1hbl9hc3NpZ25fY29kZShKQmlnMkh1ZmZtYW5Db2RlKiBTQlNZTUNPREVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTlRFTVApIHsKKyAgaW50IENVUkxFTiwgTEVOTUFYLCBDVVJDT0RFLCBDVVJURU1QLCBpOworICBpbnQqIExFTkNPVU5UOworICBpbnQqIEZJUlNUQ09ERTsKKyAgTEVOTUFYID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE5URU1QOyBpKyspIHsKKyAgICBpZiAoU0JTWU1DT0RFU1tpXS5jb2RlbGVuID4gTEVOTUFYKSB7CisgICAgICBMRU5NQVggPSBTQlNZTUNPREVTW2ldLmNvZGVsZW47CisgICAgfQorICB9CisgIExFTkNPVU5UID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCAoTEVOTUFYICsgMSkpOworICBKQklHMl9tZW1zZXQoTEVOQ09VTlQsIDAsIHNpemVvZihpbnQpICogKExFTk1BWCArIDEpKTsKKyAgRklSU1RDT0RFID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCAoTEVOTUFYICsgMSkpOworICBmb3IgKGkgPSAwOyBpIDwgTlRFTVA7IGkrKykgeworICAgIExFTkNPVU5UW1NCU1lNQ09ERVNbaV0uY29kZWxlbl0rKzsKKyAgfQorICBDVVJMRU4gPSAxOworICBGSVJTVENPREVbMF0gPSAwOworICBMRU5DT1VOVFswXSA9IDA7CisgIHdoaWxlIChDVVJMRU4gPD0gTEVOTUFYKSB7CisgICAgRklSU1RDT0RFW0NVUkxFTl0gPSAoRklSU1RDT0RFW0NVUkxFTiAtIDFdICsgTEVOQ09VTlRbQ1VSTEVOIC0gMV0pIDw8IDE7CisgICAgQ1VSQ09ERSA9IEZJUlNUQ09ERVtDVVJMRU5dOworICAgIENVUlRFTVAgPSAwOworICAgIHdoaWxlIChDVVJURU1QIDwgTlRFTVApIHsKKyAgICAgIGlmIChTQlNZTUNPREVTW0NVUlRFTVBdLmNvZGVsZW4gPT0gQ1VSTEVOKSB7CisgICAgICAgIFNCU1lNQ09ERVNbQ1VSVEVNUF0uY29kZSA9IENVUkNPREU7CisgICAgICAgIENVUkNPREUgPSBDVVJDT0RFICsgMTsKKyAgICAgIH0KKyAgICAgIENVUlRFTVAgPSBDVVJURU1QICsgMTsKKyAgICB9CisgICAgQ1VSTEVOID0gQ1VSTEVOICsgMTsKKyAgfQorICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoTEVOQ09VTlQpOworICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoRklSU1RDT0RFKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKaW5kZXggZTZhMGQ3Yi4uMDdmODg2ZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKQEAgLTE5LDEyMyArMTksMTM5IEBACiAKIHR5cGVkZWYgc3RkOjpwYWlyPHVpbnQ4X3QqLCBDSkJpZzJfU3ltYm9sRGljdCo+IENKQmlnMl9DYWNoZVBhaXI7CiB0eXBlZGVmIGVudW0gewotICAgIEpCSUcyX09VVF9PRl9QQUdFID0gMCwKLSAgICBKQklHMl9JTl9QQUdFLAorICBKQklHMl9PVVRfT0ZfUEFHRSA9IDAsCisgIEpCSUcyX0lOX1BBR0UsCiB9IEpCaWcyU3RhdGU7Ci0jZGVmaW5lIEpCSUcyX1NVQ0NFU1MJCQkgMAotI2RlZmluZSBKQklHMl9GQUlMRUQJCQktMQotI2RlZmluZSBKQklHMl9FUlJPUl9UT09fU0hPUlQJLTIKLSNkZWZpbmUgSkJJRzJfRVJST1JfRkFUQUwJCS0zCi0jZGVmaW5lIEpCSUcyX0VORF9PRl9QQUdFCQkgMgotI2RlZmluZSBKQklHMl9FTkRfT0ZfRklMRQkJIDMKKyNkZWZpbmUgSkJJRzJfU1VDQ0VTUyAwCisjZGVmaW5lIEpCSUcyX0ZBSUxFRCAtMQorI2RlZmluZSBKQklHMl9FUlJPUl9UT09fU0hPUlQgLTIKKyNkZWZpbmUgSkJJRzJfRVJST1JfRkFUQUwgLTMKKyNkZWZpbmUgSkJJRzJfRU5EX09GX1BBR0UgMgorI2RlZmluZSBKQklHMl9FTkRfT0ZfRklMRSAzCiAjZGVmaW5lIEpCSUcyX0VSUk9SX0ZJTEVfRk9STUFUIC00CiAjZGVmaW5lIEpCSUcyX0VSUk9SX1NUUkVBTV9UWVBFIC01Ci0jZGVmaW5lIEpCSUcyX0VSUk9SX0xJTUlUCQktNgotI2RlZmluZSBKQklHMl9GSUxFX1NUUkVBTQkJCTAKLSNkZWZpbmUgSkJJRzJfU1FVRU5USUFMX1NUUkVBTQkJMQotI2RlZmluZSBKQklHMl9SQU5ET01fU1RSRUFNCQkJMgotI2RlZmluZSBKQklHMl9FTUJFRF9TVFJFQU0JCQkzCi0jZGVmaW5lIEpCSUcyX01JTl9TRUdNRU5UX1NJWkUJCQkJCTExCi1jbGFzcyBDSkJpZzJfQ29udGV4dCA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CisjZGVmaW5lIEpCSUcyX0VSUk9SX0xJTUlUIC02CisjZGVmaW5lIEpCSUcyX0ZJTEVfU1RSRUFNIDAKKyNkZWZpbmUgSkJJRzJfU1FVRU5USUFMX1NUUkVBTSAxCisjZGVmaW5lIEpCSUcyX1JBTkRPTV9TVFJFQU0gMgorI2RlZmluZSBKQklHMl9FTUJFRF9TVFJFQU0gMworI2RlZmluZSBKQklHMl9NSU5fU0VHTUVOVF9TSVpFIDExCitjbGFzcyBDSkJpZzJfQ29udGV4dCA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDSkJpZzJfQ29udGV4dCogQ3JlYXRlQ29udGV4dCgKKyAgICAgIENKQmlnMl9Nb2R1bGUqIHBNb2R1bGUsCisgICAgICB1aW50OF90KiBwR2xvYmFsRGF0YSwKKyAgICAgIEZYX0RXT1JEIGR3R2xvYmFsTGVuZ3RoLAorICAgICAgdWludDhfdCogcERhdGEsCisgICAgICBGWF9EV09SRCBkd0xlbmd0aCwKKyAgICAgIGludDMyX3QgblN0cmVhbVR5cGUsCisgICAgICBzdGQ6Omxpc3Q8Q0pCaWcyX0NhY2hlUGFpcj4qIHBTeW1ib2xEaWN0Q2FjaGUsCisgICAgICBJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOwogCi0gICAgc3RhdGljIENKQmlnMl9Db250ZXh0ICpDcmVhdGVDb250ZXh0KENKQmlnMl9Nb2R1bGUgKnBNb2R1bGUsIHVpbnQ4X3QgKnBHbG9iYWxEYXRhLCBGWF9EV09SRCBkd0dsb2JhbExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcERhdGEsIEZYX0RXT1JEIGR3TGVuZ3RoLCBpbnQzMl90IG5TdHJlYW1UeXBlLCBzdGQ6Omxpc3Q8Q0pCaWcyX0NhY2hlUGFpcj4qIHBTeW1ib2xEaWN0Q2FjaGUsIElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7CisgIHN0YXRpYyB2b2lkIERlc3Ryb3lDb250ZXh0KENKQmlnMl9Db250ZXh0KiBwQ29udGV4dCk7CiAKLSAgICBzdGF0aWMgdm9pZCBEZXN0cm95Q29udGV4dChDSkJpZzJfQ29udGV4dCAqcENvbnRleHQpOworICBpbnQzMl90IGdldEZpcnN0UGFnZSh1aW50OF90KiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKTsKIAotICAgIGludDMyX3QgZ2V0Rmlyc3RQYWdlKHVpbnQ4X3QgKnBCdWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHN0cmlkZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IGdldE5leHRQYWdlKHVpbnQ4X3QqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBpbnQzMl90IGdldE5leHRQYWdlKHVpbnQ4X3QgKnBCdWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHN0cmlkZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IGdldEZpcnN0UGFnZShDSkJpZzJfSW1hZ2UqKiBpbWFnZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgaW50MzJfdCBnZXRGaXJzdFBhZ2UoQ0pCaWcyX0ltYWdlICoqaW1hZ2UsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBnZXROZXh0UGFnZShDSkJpZzJfSW1hZ2UqKiBpbWFnZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhDT0RFQ19TVEFUVVMgR2V0UHJvY2Vzc2l2ZVN0YXR1cygpIHsgcmV0dXJuIG1fUHJvY2Vzc2l2ZVN0YXR1czsgfTsKIAotICAgIGludDMyX3QgZ2V0TmV4dFBhZ2UoQ0pCaWcyX0ltYWdlICoqaW1hZ2UsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBpbnQzMl90IENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWENPREVDX1NUQVRVUyBHZXRQcm9jZXNzaXZlU3RhdHVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1Byb2Nlc3NpdmVTdGF0dXM7Ci0gICAgfTsKLXByaXZhdGU6CisgcHJpdmF0ZToKKyAgQ0pCaWcyX0NvbnRleHQodWludDhfdCogcEdsb2JhbERhdGEsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3R2xvYmFsTGVuZ3RoLAorICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdMZW5ndGgsCisgICAgICAgICAgICAgICAgIGludDMyX3QgblN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiogcFN5bWJvbERpY3RDYWNoZSwKKyAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgQ0pCaWcyX0NvbnRleHQodWludDhfdCAqcEdsb2JhbERhdGEsIEZYX0RXT1JEIGR3R2xvYmFsTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCBGWF9EV09SRCBkd0xlbmd0aCwgaW50MzJfdCBuU3RyZWFtVHlwZSwgc3RkOjpsaXN0PENKQmlnMl9DYWNoZVBhaXI+KiBwU3ltYm9sRGljdENhY2hlLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIH5DSkJpZzJfQ29udGV4dCgpOwogCi0gICAgfkNKQmlnMl9Db250ZXh0KCk7CisgIGludDMyX3QgZGVjb2RlRmlsZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBpbnQzMl90IGRlY29kZUZpbGUoSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IGRlY29kZV9TcXVlbnRpYWxPcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBpbnQzMl90IGRlY29kZV9TcXVlbnRpYWxPcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgZGVjb2RlX0VtYmVkT3JnbmF6YXRpb24oSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgaW50MzJfdCBkZWNvZGVfRW1iZWRPcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uX0ZpcnN0UGFnZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBpbnQzMl90IGRlY29kZV9SYW5kb21PcmduYXphdGlvbl9GaXJzdFBhZ2UoSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IGRlY29kZV9SYW5kb21PcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBpbnQzMl90IGRlY29kZV9SYW5kb21PcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSk7CisgIENKQmlnMl9TZWdtZW50KiBmaW5kU2VnbWVudEJ5TnVtYmVyKEZYX0RXT1JEIGR3TnVtYmVyKTsKIAotICAgIENKQmlnMl9TZWdtZW50ICpmaW5kU2VnbWVudEJ5TnVtYmVyKEZYX0RXT1JEIGR3TnVtYmVyKTsKKyAgQ0pCaWcyX1NlZ21lbnQqIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCk7CiAKLSAgICBDSkJpZzJfU2VnbWVudCAqZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCwgdWludDhfdCBjVHlwZSwgaW50MzJfdCBuSW5kZXgpOworICBpbnQzMl90IHBhcnNlU2VnbWVudEhlYWRlcihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQpOwogCi0gICAgaW50MzJfdCBwYXJzZVNlZ21lbnRIZWFkZXIoQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50KTsKKyAgaW50MzJfdCBwYXJzZVNlZ21lbnREYXRhKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IFByb2Nlc3NpdmVQYXJzZVNlZ21lbnREYXRhKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBpbnQzMl90IHBhcnNlU2VnbWVudERhdGEoQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgaW50MzJfdCBQcm9jZXNzaXZlUGFyc2VTZWdtZW50RGF0YShDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBwYXJzZVN5bWJvbERpY3QoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBpbnQzMl90IHBhcnNlU3ltYm9sRGljdChDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBwYXJzZVRleHRSZWdpb24oQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50KTsKIAotICAgIGludDMyX3QgcGFyc2VUZXh0UmVnaW9uKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCk7CisgIGludDMyX3QgcGFyc2VQYXR0ZXJuRGljdChDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKTsKIAotICAgIGludDMyX3QgcGFyc2VQYXR0ZXJuRGljdChDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBwYXJzZUhhbGZ0b25lUmVnaW9uKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgaW50MzJfdCBwYXJzZUhhbGZ0b25lUmVnaW9uKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IHBhcnNlR2VuZXJpY1JlZ2lvbihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKTsKIAotICAgIGludDMyX3QgcGFyc2VHZW5lcmljUmVnaW9uKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IHBhcnNlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24oQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50KTsKIAotICAgIGludDMyX3QgcGFyc2VHZW5lcmljUmVmaW5lbWVudFJlZ2lvbihDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQpOworICBpbnQzMl90IHBhcnNlVGFibGUoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50KTsKIAotICAgIGludDMyX3QgcGFyc2VUYWJsZShDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQpOworICBpbnQzMl90IHBhcnNlUmVnaW9uSW5mbyhKQmlnMlJlZ2lvbkluZm8qIHBSSSk7CiAKLSAgICBpbnQzMl90IHBhcnNlUmVnaW9uSW5mbyhKQmlnMlJlZ2lvbkluZm8gKnBSSSk7CisgIEpCaWcySHVmZm1hbkNvZGUqIGRlY29kZVN5bWJvbElESHVmZm1hblRhYmxlKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIFNCTlVNU1lNUyk7CiAKKyAgdm9pZCBodWZmbWFuX2Fzc2lnbl9jb2RlKGludCogQ09ERVMsIGludCogUFJFRkxFTiwgaW50IE5URU1QKTsKIAorICB2b2lkIGh1ZmZtYW5fYXNzaWduX2NvZGUoSkJpZzJIdWZmbWFuQ29kZSogU0JTWU1DT0RFUywgaW50IE5URU1QKTsKIAotICAgIEpCaWcySHVmZm1hbkNvZGUgKmRlY29kZVN5bWJvbElESHVmZm1hblRhYmxlKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0sIEZYX0RXT1JEIFNCTlVNU1lNUyk7CisgcHJpdmF0ZToKKyAgQ0pCaWcyX0NvbnRleHQqIG1fcEdsb2JhbENvbnRleHQ7CiAKLSAgICB2b2lkIGh1ZmZtYW5fYXNzaWduX2NvZGUoaW50KiBDT0RFUywgaW50KiBQUkVGTEVOLCBpbnQgTlRFTVApOworICBpbnQzMl90IG1fblN0cmVhbVR5cGU7CiAKLSAgICB2b2lkIGh1ZmZtYW5fYXNzaWduX2NvZGUoSkJpZzJIdWZmbWFuQ29kZSAqU0JTWU1DT0RFUywgaW50IE5URU1QKTsKKyAgQ0pCaWcyX0JpdFN0cmVhbSogbV9wU3RyZWFtOwogCi1wcml2YXRlOgorICBpbnQzMl90IG1fblN0YXRlOwogCi0gICAgQ0pCaWcyX0NvbnRleHQgKm1fcEdsb2JhbENvbnRleHQ7CisgIENKQmlnMl9MaXN0PENKQmlnMl9TZWdtZW50PiogbV9wU2VnbWVudExpc3Q7CiAKLSAgICBpbnQzMl90IG1fblN0cmVhbVR5cGU7CisgIENKQmlnMl9MaXN0PEpCaWcyUGFnZUluZm8+KiBtX3BQYWdlSW5mb0xpc3Q7CiAKLSAgICBDSkJpZzJfQml0U3RyZWFtICptX3BTdHJlYW07CisgIENKQmlnMl9JbWFnZSogbV9wUGFnZTsKIAotICAgIGludDMyX3QgbV9uU3RhdGU7CisgIEZYX0JPT0wgbV9iQnVmU3BlY2lmaWVkOwogCi0gICAgQ0pCaWcyX0xpc3Q8Q0pCaWcyX1NlZ21lbnQ+ICptX3BTZWdtZW50TGlzdDsKLQotICAgIENKQmlnMl9MaXN0PEpCaWcyUGFnZUluZm8+ICptX3BQYWdlSW5mb0xpc3Q7Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKm1fcFBhZ2U7Ci0KLSAgICBGWF9CT09MIG1fYkJ1ZlNwZWNpZmllZDsKLQotICAgIGludDMyX3QgbV9uU2VnbWVudERlY29kZWQ7Ci0gICAgSUZYX1BhdXNlKgltX3BQYXVzZTsKLSAgICBpbnQzMl90CW1fUGF1c2VTdGVwOwotICAgIEZYQ09ERUNfU1RBVFVTIG1fUHJvY2Vzc2l2ZVN0YXR1czsKLSAgICBGWF9CT09MCW1fYkZpcnN0UGFnZTsKLSAgICBDSkJpZzJfQXJpdGhEZWNvZGVyICptX3BBcml0aERlY29kZXI7Ci0gICAgQ0pCaWcyX0dSRFByb2MgKm1fcEdSRDsKLSAgICBKQmlnMkFyaXRoQ3R4ICptX2diQ29udGV4dDsKLSAgICBDSkJpZzJfU2VnbWVudCAqbV9wU2VnbWVudDsKLSAgICBGWF9EV09SRCBtX2R3T2Zmc2V0OwotICAgIEpCaWcyUmVnaW9uSW5mbyBtX3JpOwotICAgIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiogbV9wU3ltYm9sRGljdENhY2hlOworICBpbnQzMl90IG1fblNlZ21lbnREZWNvZGVkOworICBJRlhfUGF1c2UqIG1fcFBhdXNlOworICBpbnQzMl90IG1fUGF1c2VTdGVwOworICBGWENPREVDX1NUQVRVUyBtX1Byb2Nlc3NpdmVTdGF0dXM7CisgIEZYX0JPT0wgbV9iRmlyc3RQYWdlOworICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBtX3BBcml0aERlY29kZXI7CisgIENKQmlnMl9HUkRQcm9jKiBtX3BHUkQ7CisgIEpCaWcyQXJpdGhDdHgqIG1fZ2JDb250ZXh0OworICBDSkJpZzJfU2VnbWVudCogbV9wU2VnbWVudDsKKyAgRlhfRFdPUkQgbV9kd09mZnNldDsKKyAgSkJpZzJSZWdpb25JbmZvIG1fcmk7CisgIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiogbV9wU3ltYm9sRGljdENhY2hlOwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9EZWZpbmUuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfRGVmaW5lLmgKaW5kZXggZjNiZGQ1YS4uM2NjYTZhYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9EZWZpbmUuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0RlZmluZS5oCkBAIC0xLDM0ICsxLDM5IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgX0pCSUcyX0RFRklORV9IXwogI2RlZmluZSBfSkJJRzJfREVGSU5FX0hfCiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKLSNkZWZpbmUgSkJJRzJfbWVtc2V0CUZYU1lTX21lbXNldAotI2RlZmluZSBKQklHMl9tZW1jbXAJRlhTWVNfbWVtY21wCi0jZGVmaW5lIEpCSUcyX21lbWNweQlGWFNZU19tZW1jcHkKKyNkZWZpbmUgSkJJRzJfbWVtc2V0IEZYU1lTX21lbXNldAorI2RlZmluZSBKQklHMl9tZW1jbXAgRlhTWVNfbWVtY21wCisjZGVmaW5lIEpCSUcyX21lbWNweSBGWFNZU19tZW1jcHkKICNpbmNsdWRlICJKQmlnMl9PYmplY3QuaCIKLSNkZWZpbmUgSkJJRzJfT09CCQkJMQorI2RlZmluZSBKQklHMl9PT0IgMQogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludDMyX3Qgd2lkdGgsCi0gICAgICAgICAgICAgaGVpZ2h0OwotICAgIGludDMyX3QgeCwKLSAgICAgICAgICAgICB5OwotICAgIHVpbnQ4X3QgZmxhZ3M7CisgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgaW50MzJfdCB4LCB5OworICB1aW50OF90IGZsYWdzOwogfSBKQmlnMlJlZ2lvbkluZm87CiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50MzJfdCBjb2RlbGVuOwotICAgIGludDMyX3QgY29kZTsKKyAgaW50MzJfdCBjb2RlbGVuOworICBpbnQzMl90IGNvZGU7CiB9IEpCaWcySHVmZm1hbkNvZGU7CiBleHRlcm4gIkMiIHsKLSAgICB2b2lkIF9GYXhHNERlY29kZSh2b2lkICpwTW9kdWxlLCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50KiBwYml0cG9zLCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2ggPSAwKTsKK3ZvaWQgX0ZheEc0RGVjb2RlKHZvaWQqIHBNb2R1bGUsCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICBpbnQqIHBiaXRwb3MsCisgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2ggPSAwKTsKIH07Ci0jZGVmaW5lIEpCSUcyX01BWF9SRUZFUlJFRF9TRUdNRU5UX0NPVU5UCQk2NAotI2RlZmluZSBKQklHMl9NQVhfRVhQT1JUX1NZU01CT0xTCQkJCTY1NTM1Ci0jZGVmaW5lIEpCSUcyX01BWF9ORVdfU1lTTUJPTFMJCQkJCTY1NTM1Ci0jZGVmaW5lIEpCSUcyX01BWF9QQVRURVJOX0lOREVYCQkJCQk2NTUzNQotI2RlZmluZSBKQklHMl9NQVhfSU1BR0VfU0laRQkJCQkJNjU1MzUKKyNkZWZpbmUgSkJJRzJfTUFYX1JFRkVSUkVEX1NFR01FTlRfQ09VTlQgNjQKKyNkZWZpbmUgSkJJRzJfTUFYX0VYUE9SVF9TWVNNQk9MUyA2NTUzNQorI2RlZmluZSBKQklHMl9NQVhfTkVXX1NZU01CT0xTIDY1NTM1CisjZGVmaW5lIEpCSUcyX01BWF9QQVRURVJOX0lOREVYIDY1NTM1CisjZGVmaW5lIEpCSUcyX01BWF9JTUFHRV9TSVpFIDY1NTM1CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKaW5kZXggY2FiY2Q0Yy4uNDE1ZDkxOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlICJKQmlnMl9HZW5lcmFsRGVjb2Rlci5oIgpAQCAtMTIsMjM1NyArMTIsMjI2NSBAQAogI2luY2x1ZGUgIkpCaWcyX1BhdHRlcm5EaWN0LmgiCiAKIGV4dGVybiBjb25zdCBKQmlnMkFyaXRoUWUgUWVUYWJsZVtdID0gewotICAgIHsgMHg1NjAxLCAgMSwgIDEsIDEgfSwKLSAgICB7IDB4MzQwMSwgIDIsICA2LCAwIH0sCi0gICAgeyAweDE4MDEsICAzLCAgOSwgMCB9LAotICAgIHsgMHgwQUMxLCAgNCwgMTIsIDAgfSwKLSAgICB7IDB4MDUyMSwgIDUsIDI5LCAwIH0sCi0gICAgeyAweDAyMjEsIDM4LCAzMywgMCB9LAotICAgIHsgMHg1NjAxLCAgNywgIDYsIDEgfSwKLSAgICB7IDB4NTQwMSwgIDgsIDE0LCAwIH0sCi0gICAgeyAweDQ4MDEsICA5LCAxNCwgMCB9LAotICAgIHsgMHgzODAxLCAxMCwgMTQsIDAgfSwKLSAgICB7IDB4MzAwMSwgMTEsIDE3LCAwIH0sCi0gICAgeyAweDI0MDEsIDEyLCAxOCwgMCB9LAotICAgIHsgMHgxQzAxLCAxMywgMjAsIDAgfSwKLSAgICB7IDB4MTYwMSwgMjksIDIxLCAwIH0sCi0gICAgeyAweDU2MDEsIDE1LCAxNCwgMSB9LAotICAgIHsgMHg1NDAxLCAxNiwgMTQsIDAgfSwKLSAgICB7IDB4NTEwMSwgMTcsIDE1LCAwIH0sCi0gICAgeyAweDQ4MDEsIDE4LCAxNiwgMCB9LAotICAgIHsgMHgzODAxLCAxOSwgMTcsIDAgfSwKLSAgICB7IDB4MzQwMSwgMjAsIDE4LCAwIH0sCi0gICAgeyAweDMwMDEsIDIxLCAxOSwgMCB9LAotICAgIHsgMHgyODAxLCAyMiwgMTksIDAgfSwKLSAgICB7IDB4MjQwMSwgMjMsIDIwLCAwIH0sCi0gICAgeyAweDIyMDEsIDI0LCAyMSwgMCB9LAotICAgIHsgMHgxQzAxLCAyNSwgMjIsIDAgfSwKLSAgICB7IDB4MTgwMSwgMjYsIDIzLCAwIH0sCi0gICAgeyAweDE2MDEsIDI3LCAyNCwgMCB9LAotICAgIHsgMHgxNDAxLCAyOCwgMjUsIDAgfSwKLSAgICB7IDB4MTIwMSwgMjksIDI2LCAwIH0sCi0gICAgeyAweDExMDEsIDMwLCAyNywgMCB9LAotICAgIHsgMHgwQUMxLCAzMSwgMjgsIDAgfSwKLSAgICB7IDB4MDlDMSwgMzIsIDI5LCAwIH0sCi0gICAgeyAweDA4QTEsIDMzLCAzMCwgMCB9LAotICAgIHsgMHgwNTIxLCAzNCwgMzEsIDAgfSwKLSAgICB7IDB4MDQ0MSwgMzUsIDMyLCAwIH0sCi0gICAgeyAweDAyQTEsIDM2LCAzMywgMCB9LAotICAgIHsgMHgwMjIxLCAzNywgMzQsIDAgfSwKLSAgICB7IDB4MDE0MSwgMzgsIDM1LCAwIH0sCi0gICAgeyAweDAxMTEsIDM5LCAzNiwgMCB9LAotICAgIHsgMHgwMDg1LCA0MCwgMzcsIDAgfSwKLSAgICB7IDB4MDA0OSwgNDEsIDM4LCAwIH0sCi0gICAgeyAweDAwMjUsIDQyLCAzOSwgMCB9LAotICAgIHsgMHgwMDE1LCA0MywgNDAsIDAgfSwKLSAgICB7IDB4MDAwOSwgNDQsIDQxLCAwIH0sCi0gICAgeyAweDAwMDUsIDQ1LCA0MiwgMCB9LAotICAgIHsgMHgwMDAxLCA0NSwgNDMsIDAgfSwKLSAgICB7IDB4NTYwMSwgNDYsIDQ2LCAwIH0KLX07CisgICAgezB4NTYwMSwgMSwgMSwgMX0sICAgezB4MzQwMSwgMiwgNiwgMH0sICAgezB4MTgwMSwgMywgOSwgMH0sCisgICAgezB4MEFDMSwgNCwgMTIsIDB9LCAgezB4MDUyMSwgNSwgMjksIDB9LCAgezB4MDIyMSwgMzgsIDMzLCAwfSwKKyAgICB7MHg1NjAxLCA3LCA2LCAxfSwgICB7MHg1NDAxLCA4LCAxNCwgMH0sICB7MHg0ODAxLCA5LCAxNCwgMH0sCisgICAgezB4MzgwMSwgMTAsIDE0LCAwfSwgezB4MzAwMSwgMTEsIDE3LCAwfSwgezB4MjQwMSwgMTIsIDE4LCAwfSwKKyAgICB7MHgxQzAxLCAxMywgMjAsIDB9LCB7MHgxNjAxLCAyOSwgMjEsIDB9LCB7MHg1NjAxLCAxNSwgMTQsIDF9LAorICAgIHsweDU0MDEsIDE2LCAxNCwgMH0sIHsweDUxMDEsIDE3LCAxNSwgMH0sIHsweDQ4MDEsIDE4LCAxNiwgMH0sCisgICAgezB4MzgwMSwgMTksIDE3LCAwfSwgezB4MzQwMSwgMjAsIDE4LCAwfSwgezB4MzAwMSwgMjEsIDE5LCAwfSwKKyAgICB7MHgyODAxLCAyMiwgMTksIDB9LCB7MHgyNDAxLCAyMywgMjAsIDB9LCB7MHgyMjAxLCAyNCwgMjEsIDB9LAorICAgIHsweDFDMDEsIDI1LCAyMiwgMH0sIHsweDE4MDEsIDI2LCAyMywgMH0sIHsweDE2MDEsIDI3LCAyNCwgMH0sCisgICAgezB4MTQwMSwgMjgsIDI1LCAwfSwgezB4MTIwMSwgMjksIDI2LCAwfSwgezB4MTEwMSwgMzAsIDI3LCAwfSwKKyAgICB7MHgwQUMxLCAzMSwgMjgsIDB9LCB7MHgwOUMxLCAzMiwgMjksIDB9LCB7MHgwOEExLCAzMywgMzAsIDB9LAorICAgIHsweDA1MjEsIDM0LCAzMSwgMH0sIHsweDA0NDEsIDM1LCAzMiwgMH0sIHsweDAyQTEsIDM2LCAzMywgMH0sCisgICAgezB4MDIyMSwgMzcsIDM0LCAwfSwgezB4MDE0MSwgMzgsIDM1LCAwfSwgezB4MDExMSwgMzksIDM2LCAwfSwKKyAgICB7MHgwMDg1LCA0MCwgMzcsIDB9LCB7MHgwMDQ5LCA0MSwgMzgsIDB9LCB7MHgwMDI1LCA0MiwgMzksIDB9LAorICAgIHsweDAwMTUsIDQzLCA0MCwgMH0sIHsweDAwMDksIDQ0LCA0MSwgMH0sIHsweDAwMDUsIDQ1LCA0MiwgMH0sCisgICAgezB4MDAwMSwgNDUsIDQzLCAwfSwgezB4NTYwMSwgNDYsIDQ2LCAwfX07CiAKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgSkJJRzJfUUVfTlVNID0gc2l6ZW9mKFFlVGFibGUpIC8gc2l6ZW9mKEpCaWcyQXJpdGhRZSk7CiAKLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgaWYgKEdCVyA9PSAwIHx8IEdCSCA9PSAwKSB7Ci0gICAgICAgIENKQmlnMl9JbWFnZSogcEltYWdlOwotICAgICAgICBKQklHMl9BTExPQyhwSW1hZ2UsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgICAgICByZXR1cm4gcEltYWdlOwotICAgIH0KLSAgICBpZihHQlRFTVBMQVRFID09IDApIHsKLSAgICAgICAgaWYoKEdCQVRbMF0gPT0gMykgJiYgKEdCQVRbMV0gPT0gKHNpZ25lZCBjaGFyKSAtIDEpCi0gICAgICAgICAgICAgICAgJiYgKEdCQVRbMl0gPT0gKHNpZ25lZCBjaGFyKSAtIDMpICYmIChHQkFUWzNdID09IChzaWduZWQgY2hhcikgLSAxKQotICAgICAgICAgICAgICAgICYmIChHQkFUWzRdID09IDIpICYmIChHQkFUWzVdID09IChzaWduZWQgY2hhcikgLSAyKQotICAgICAgICAgICAgICAgICYmIChHQkFUWzZdID09IChzaWduZWQgY2hhcikgLSAyKSAmJiAoR0JBVFs3XSA9PSAoc2lnbmVkIGNoYXIpIC0gMikpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYoR0JURU1QTEFURSA9PSAxKSB7Ci0gICAgICAgIGlmKChHQkFUWzBdID09IDMpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhcikgLSAxKSkgewotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MyhwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZihHQlRFTVBMQVRFID09IDIpIHsKLSAgICAgICAgaWYoKEdCQVRbMF0gPT0gMikgJiYgKEdCQVRbMV0gPT0gKHNpZ25lZCBjaGFyKSAtIDEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYoKEdCQVRbMF0gPT0gMikgJiYgKEdCQVRbMV0gPT0gKHNpZ25lZCBjaGFyKSAtIDEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgIEdCUkVHLT5maWxsKDApOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4OWIyNV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDIsIGggLSAyKTsKLSAgICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMikgPDwgMTsKLSAgICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMikgPDwgMjsKLSAgICAgICAgICAgIGxpbmUyID0gR0JSRUctPmdldFBpeGVsKDMsIGggLSAxKTsKLSAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSkgPDwgMTsKLSAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMzsKLSAgICAgICAgICAgIGxpbmUzID0gMDsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCAxMTsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMywgaCAtIDIpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyA0LCBoIC0gMSkpICYgMHg3ZjsKLSAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwotICAgIHVpbnQ4X3QgKnBMaW5lLCBjVmFsOwotICAgIGludHB0cl90IG5TdHJpZGUsIG5TdHJpZGUyOwotICAgIGludDMyX3QgbkJpdHMsIGs7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgaWYgKEdCUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIEdCUkVHOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwgR0JXLCBHQkgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKLSAgICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKLSAgICBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDliMjVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IChoID4gMSkgPyBwTGluZVstblN0cmlkZTJdIDw8IDYgOiAwOwotICAgICAgICAgICAgbGluZTIgPSAoaCA+IDApID8gcExpbmVbLW5TdHJpZGVdIDogMDsKLSAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweGY4MDApIHwgKGxpbmUyICYgMHgwN2YwKTsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdyArPSA4KSB7Ci0gICAgICAgICAgICAgICAgaWYodyArIDggPCBHQlcpIHsKLSAgICAgICAgICAgICAgICAgICAgbkJpdHMgPSA4OwotICAgICAgICAgICAgICAgICAgICBpZihoID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAocExpbmVbLW5TdHJpZGUyICsgKHcgPj4gMykgKyAxXSA8PCA2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAocExpbmVbLW5TdHJpZGUgKyAodyA+PiAzKSArIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5CaXRzID0gR0JXIC0gdzsKLSAgICAgICAgICAgICAgICAgICAgaWYoaCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxIDw8PSA4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA8PD0gODsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0czsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDA4MDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKDcgLSBrKSkgJiAweDAwMTApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwTGluZSArPSBuU3RyaWRlOwotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7Ci0gICAgdWludDhfdCAqcExpbmUsICpwTGluZTEsICpwTGluZTIsIGNWYWw7Ci0gICAgaW50MzJfdCBuU3RyaWRlLCBuU3RyaWRlMiwgazsKLSAgICBpbnQzMl90IG5MaW5lQnl0ZXMsIG5CaXRzTGVmdCwgY2M7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgaWYgKEdCUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIEdCUkVHOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwgR0JXLCBHQkgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKLSAgICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKLSAgICBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKLSAgICBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7Ci0gICAgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7Ci0gICAgRlhfRFdPUkQgaGVpZ2h0ID0gR0JIICYgMHg3ZmZmZmZmZjsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBoZWlnaHQ7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDliMjVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZihoID4gMSkgewotICAgICAgICAgICAgICAgIHBMaW5lMSA9IHBMaW5lIC0gblN0cmlkZTI7Ci0gICAgICAgICAgICAgICAgcExpbmUyID0gcExpbmUgLSBuU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmUxID0gKCpwTGluZTErKykgPDwgNjsKLSAgICAgICAgICAgICAgICBsaW5lMiA9ICpwTGluZTIrKzsKLSAgICAgICAgICAgICAgICBDT05URVhUID0gKChsaW5lMSAmIDB4ZjgwMCkgfCAobGluZTIgJiAweDA3ZjApKTsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKCpwTGluZTErKykgPDwgNik7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKCgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMSA+PiBrKSAmIDB4MDgwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+IGspICYgMHgwMDEwKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPDw9IDg7Ci0gICAgICAgICAgICAgICAgbGluZTIgPDw9IDg7Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDA4MDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+ICg3IC0gaykpICYgMHgwMDEwKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcExpbmUyID0gcExpbmUgLSBuU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKGggJiAxKSA/ICgqcExpbmUyKyspIDogMDsKLSAgICAgICAgICAgICAgICBDT05URVhUID0gKGxpbmUyICYgMHgwN2YwKTsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoaCAmIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihrID0gNzsgayA+PSAwOyBrLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+IGspICYgMHgwMDEwKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTIgPDw9IDg7Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKGxpbmUyID4+ICg3IC0gaykpKSAmIDB4MDAxMCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcExpbmUgKz0gblN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgR0JSRUctPmZpbGwoMCk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHg5YjI1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpOwotICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAyKSA8PCAxOwotICAgICAgICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgaCAtIDEpOwotICAgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAyOwotICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzJdLCBoICsgR0JBVFszXSkgPDwgMTA7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBoICsgR0JBVFs1XSkgPDwgMTE7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgMTI7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzZdLCBoICsgR0JBVFs3XSkgPDwgMTU7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAyKSkgJiAweDA3OwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMywgaCAtIDEpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDBmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHQlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBHQlJFRy0+ZmlsbCgwKTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDA3OTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMik7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDI7Ci0gICAgICAgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgzLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMiwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDI7Ci0gICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDM7Ci0gICAgICAgICAgICBsaW5lMyA9IDA7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMywgaCAtIDIpKSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyA0LCBoIC0gMSkpICYgMHgzZjsKLSAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwotICAgIHVpbnQ4X3QgKnBMaW5lLCBjVmFsOwotICAgIGludHB0cl90IG5TdHJpZGUsIG5TdHJpZGUyOwotICAgIGludDMyX3QgbkJpdHMsIGs7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgaWYgKEdCUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIEdCUkVHOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwgR0JXLCBHQkgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKLSAgICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKLSAgICBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDA3OTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IChoID4gMSkgPyBwTGluZVstblN0cmlkZTJdIDw8IDQgOiAwOwotICAgICAgICAgICAgbGluZTIgPSAoaCA+IDApID8gcExpbmVbLW5TdHJpZGVdIDogMDsKLSAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDFlMDApIHwgKChsaW5lMiA+PiAxKSAmIDB4MDFmOCk7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcgKz0gOCkgewotICAgICAgICAgICAgICAgIGlmKHcgKyA4IDwgR0JXKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5CaXRzID0gODsKLSAgICAgICAgICAgICAgICAgICAgaWYoaCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKHBMaW5lWy1uU3RyaWRlMiArICh3ID4+IDMpICsgMV0gPDwgNCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoaCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKHBMaW5lWy1uU3RyaWRlICsgKHcgPj4gMykgKyAxXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuQml0cyA9IEdCVyAtIHc7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA8PD0gODsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPDw9IDg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHM7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwMjAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+ICg4IC0gaykpICYgMHgwMDA4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbdyA+PiAzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcExpbmUgKz0gblN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwotICAgIHVpbnQ4X3QgKnBMaW5lLCAqcExpbmUxLCAqcExpbmUyLCBjVmFsOwotICAgIGludDMyX3QgblN0cmlkZSwgblN0cmlkZTIsIGs7Ci0gICAgaW50MzJfdCBuTGluZUJ5dGVzLCBuQml0c0xlZnQsIGNjOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgIGlmIChHQlJFRy0+bV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBHQlJFRzsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsIEdCVywgR0JIKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBMaW5lID0gR0JSRUctPm1fcERhdGE7Ci0gICAgblN0cmlkZSA9IEdCUkVHLT5tX25TdHJpZGU7Ci0gICAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7Ci0gICAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwotICAgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDc5NV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgcExpbmUxID0gcExpbmUgLSBuU3RyaWRlMjsKLSAgICAgICAgICAgICAgICBwTGluZTIgPSBwTGluZSAtIG5TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAoKnBMaW5lMSsrKSA8PCA0OwotICAgICAgICAgICAgICAgIGxpbmUyID0gKnBMaW5lMisrOwotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDFlMDApIHwgKChsaW5lMiA+PiAxKSAmIDB4MDFmOCk7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDQpOwotICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOwotICAgICAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSA3OyBrID49IDA7IGstLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUxID4+IGspICYgMHgwMjAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoayArIDEpKSAmIDB4MDAwOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPDw9IDg7Ci0gICAgICAgICAgICAgICAgbGluZTIgPDw9IDg7Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwMjAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+ICg4IC0gaykpICYgMHgwMDA4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwTGluZTIgPSBwTGluZSAtIG5TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoaCAmIDEpID8gKCpwTGluZTIrKykgOiAwOwotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTIgPj4gMSkgJiAweDAxZjg7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggJiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKGsgKyAxKSkgJiAweDAwMDgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBMaW5lW2NjXSA9IGNWYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUyIDw8PSA4OwotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoOCAtIGspKSAmIDB4MDAwOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwTGluZSArPSBuU3RyaWRlOwotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBHQlJFRy0+ZmlsbCgwKTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDA3OTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMik7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDI7Ci0gICAgICAgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDI7Ci0gICAgICAgICAgICBsaW5lMyA9IDA7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA5OwotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBoIC0gMikpICYgMHgwZjsKLSAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAxKSkgJiAweDFmOwotICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgR0JSRUctPmZpbGwoMCk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMGU1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpOwotICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAyKSA8PCAxOwotICAgICAgICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgaCAtIDEpOwotICAgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAyOwotICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCAyOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAyKSkgJiAweDA3OwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMywgaCAtIDEpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDAzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHQlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKLSAgICB1aW50OF90ICpwTGluZSwgY1ZhbDsKLSAgICBpbnRwdHJfdCBuU3RyaWRlLCBuU3RyaWRlMjsKLSAgICBpbnQzMl90IG5CaXRzLCBrOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgIGlmIChHQlJFRy0+bV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBHQlJFRzsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsIEdCVywgR0JIKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBMaW5lID0gR0JSRUctPm1fcERhdGE7Ci0gICAgblN0cmlkZSA9IEdCUkVHLT5tX25TdHJpZGU7Ci0gICAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMGU1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZTEgPSAoaCA+IDEpID8gcExpbmVbLW5TdHJpZGUyXSA8PCAxIDogMDsKLSAgICAgICAgICAgIGxpbmUyID0gKGggPiAwKSA/IHBMaW5lWy1uU3RyaWRlXSA6IDA7Ci0gICAgICAgICAgICBDT05URVhUID0gKGxpbmUxICYgMHgwMzgwKSB8ICgobGluZTIgPj4gMykgJiAweDAwN2MpOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3ICs9IDgpIHsKLSAgICAgICAgICAgICAgICBpZih3ICsgOCA8IEdCVykgewotICAgICAgICAgICAgICAgICAgICBuQml0cyA9IDg7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8IChwTGluZVstblN0cmlkZTIgKyAodyA+PiAzKSArIDFdIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8IChwTGluZVstblN0cmlkZSArICh3ID4+IDMpICsgMV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbkJpdHMgPSBHQlcgLSB3OwotICAgICAgICAgICAgICAgICAgICBpZihoID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPDw9IDg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoaCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyIDw8PSA4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDA4MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoMTAgLSBrKSkgJiAweDAwMDQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwTGluZSArPSBuU3RyaWRlOwotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7Ci0gICAgdWludDhfdCAqcExpbmUsICpwTGluZTEsICpwTGluZTIsIGNWYWw7Ci0gICAgaW50MzJfdCBuU3RyaWRlLCBuU3RyaWRlMiwgazsKLSAgICBpbnQzMl90IG5MaW5lQnl0ZXMsIG5CaXRzTGVmdCwgY2M7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgaWYgKEdCUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIEdCUkVHOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwgR0JXLCBHQkgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKLSAgICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKLSAgICBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKLSAgICBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7Ci0gICAgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMGU1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoaCA+IDEpIHsKLSAgICAgICAgICAgICAgICBwTGluZTEgPSBwTGluZSAtIG5TdHJpZGUyOwotICAgICAgICAgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgqcExpbmUxKyspIDw8IDE7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAqcExpbmUyKys7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MDM4MCkgfCAoKGxpbmUyID4+IDMpICYgMHgwMDdjKTsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKCpwTGluZTErKykgPDwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gaykgJiAweDAwODApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+IChrICsgMykpICYgMHgwMDA0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwTGluZVtjY10gPSBjVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA8PD0gODsKLSAgICAgICAgICAgICAgICBsaW5lMiA8PD0gODsKLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAwODApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKDEwIC0gaykpICYgMHgwMDA0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwTGluZTIgPSBwTGluZSAtIG5TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoaCAmIDEpID8gKCpwTGluZTIrKykgOiAwOwotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTIgPj4gMykgJiAweDAwN2M7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggJiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKGsgKyAzKSkgJiAweDAwMDQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBMaW5lW2NjXSA9IGNWYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUyIDw8PSA4OwotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCgobGluZTIgPj4gKDEwIC0gaykpKSAmIDB4MDAwNCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwTGluZSArPSBuU3RyaWRlOwotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBHQlJFRy0+ZmlsbCgwKTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAwZTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMik7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMyA9IDA7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OwotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMikpICYgMHgwNzsKLSAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDBmOwotICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBHQlJFRy0+ZmlsbCgwKTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAxOTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDI7Ci0gICAgICAgICAgICBsaW5lMiA9IDA7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUyOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAxKSkgJiAweDNmOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdDIoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMTsKLSAgICB1aW50OF90ICpwTGluZSwgY1ZhbDsKLSAgICBpbnRwdHJfdCBuU3RyaWRlOwotICAgIGludDMyX3QgbkJpdHMsIGs7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgaWYgKEdCUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIEdCUkVHOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwgR0JXLCBHQkgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKLSAgICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAxOTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IChoID4gMCkgPyBwTGluZVstblN0cmlkZV0gOiAwOwotICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMSA+PiAxKSAmIDB4MDNmMDsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdyArPSA4KSB7Ci0gICAgICAgICAgICAgICAgaWYodyArIDggPCBHQlcpIHsKLSAgICAgICAgICAgICAgICAgICAgbkJpdHMgPSA4OwotICAgICAgICAgICAgICAgICAgICBpZihoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAocExpbmVbLW5TdHJpZGUgKyAodyA+PiAzKSArIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5CaXRzID0gR0JXIC0gdzsKLSAgICAgICAgICAgICAgICAgICAgaWYoaCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxIDw8PSA4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWY3KSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMSA+PiAoOCAtIGspKSAmIDB4MDAxMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBMaW5lW3cgPj4gM10gPSBjVmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBMaW5lICs9IG5TdHJpZGU7Ci0gICAgfQotICAgIHJldHVybiBHQlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MyhDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxOwotICAgIHVpbnQ4X3QgKnBMaW5lLCAqcExpbmUxLCBjVmFsOwotICAgIGludDMyX3QgblN0cmlkZSwgazsKLSAgICBpbnQzMl90IG5MaW5lQnl0ZXMsIG5CaXRzTGVmdCwgY2M7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgaWYgKEdCUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIEdCUkVHOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwgR0JXLCBHQkgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKLSAgICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKLSAgICBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7Ci0gICAgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMTk1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoaCA+IDApIHsKLSAgICAgICAgICAgICAgICBwTGluZTEgPSBwTGluZSAtIG5TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAqcExpbmUxKys7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMSA+PiAxKSAmIDB4MDNmMDsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKnBMaW5lMSsrKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihrID0gNzsgayA+PSAwOyBrLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMSA+PiAoayArIDEpKSAmIDB4MDAxMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPDw9IDg7Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUxID4+ICg4IC0gaykpICYgMHgwMDEwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDT05URVhUID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihrID0gNzsgayA+PSAwOyBrLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwTGluZVtjY10gPSBjVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFmNykgPDwgMSkgfCBiVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcExpbmUgKz0gblN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBHQlJFRy0+ZmlsbCgwKTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAxOTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMiA9IDA7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUyOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDEpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDBmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHQlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9WMihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgR0JSRUctPmZpbGwoMCk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBzd2l0Y2goR0JURU1QTEFURSkgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4OWIyNTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHgwNzk1OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAweDAwZTU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4MDE5NTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN3aXRjaChHQlRFTVBMQVRFKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMl0sIGggKyBHQkFUWzNdKSA8PCAxMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbNF0sIGggKyBHQkFUWzVdKSA8PCAxMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCAxMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbNl0sIGggKyBHQkFUWzddKSA8PCAxNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDIpKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBoIC0gMSkpICYgMHgxZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBoIC0gMikpICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAxKSkgJiAweDFmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwNzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMikgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAyKSkgJiAweDA3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDEpKSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzogewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDFmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVjEoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQgPSAwOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgR0JSRUctPmZpbGwoMCk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBzd2l0Y2goR0JURU1QTEFURSkgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4OWIyNTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHgwNzk1OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAweDAwZTU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4MDE5NTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgR0JSRUctPmdldFBpeGVsKHcsIGggLSAxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAwOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goR0JURU1QTEFURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCkgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMywgaCkgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gNCwgaCkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSA8PCA1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkgPDwgNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBoIC0gMSkgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDIsIGggLSAxKSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzJdLCBoICsgR0JBVFszXSkgPDwgMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbNF0sIGggKyBHQkFUWzVdKSA8PCAxMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDIpIDw8IDEyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIGggLSAyKSA8PCAxMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDIpIDw8IDE0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzZdLCBoICsgR0JBVFs3XSkgPDwgMTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBoKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAzLCBoKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDEpIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSA8PCA1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIGggLSAxKSA8PCA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBoIC0gMSkgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCAtIDEpIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAyKSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBoIC0gMikgPDwgMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgaCAtIDIpIDw8IDExOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBoIC0gMikgPDwgMTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBoKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDEpIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgaCAtIDEpIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGggLSAxKSA8PCA1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBoIC0gMSkgPDwgNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDIpIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgaCAtIDIpIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGggLSAyKSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCkgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMywgaCkgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gNCwgaCkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSA8PCA1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIGggLSAxKSA8PCA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBoIC0gMSkgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCAtIDEpIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDMsIGggLSAxKSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtKQotewotICAgIGludCBiaXRwb3MsIGk7Ci0gICAgQ0pCaWcyX0ltYWdlICpwSW1hZ2U7CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpIHsKKyAgaWYgKEdCVyA9PSAwIHx8IEdCSCA9PSAwKSB7CisgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2U7CiAgICAgSkJJRzJfQUxMT0MocEltYWdlLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBpZiAocEltYWdlLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIHBJbWFnZTsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsIEdCVywgR0JIKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGJpdHBvcyA9IChpbnQpcFN0cmVhbS0+Z2V0Qml0UG9zKCk7Ci0gICAgX0ZheEc0RGVjb2RlKG1fcE1vZHVsZSwgcFN0cmVhbS0+Z2V0QnVmKCksIHBTdHJlYW0tPmdldExlbmd0aCgpLCAmYml0cG9zLCBwSW1hZ2UtPm1fcERhdGEsIEdCVywgR0JILCBwSW1hZ2UtPm1fblN0cmlkZSk7Ci0gICAgcFN0cmVhbS0+c2V0Qml0UG9zKGJpdHBvcyk7Ci0gICAgZm9yKGkgPSAwOyAoRlhfRFdPUkQpaSA8IHBJbWFnZS0+bV9uU3RyaWRlICogR0JIOyBpKyspIHsKLSAgICAgICAgcEltYWdlLT5tX3BEYXRhW2ldID0gfnBJbWFnZS0+bV9wRGF0YVtpXTsKLSAgICB9CiAgICAgcmV0dXJuIHBJbWFnZTsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KQotewotICAgIGlmIChHUlcgPT0gMCB8fCBHUkggPT0gMCkgewotICAgICAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZTsKLSAgICAgICAgSkJJRzJfQUxMT0MocEltYWdlLCBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKLSAgICAgICAgcmV0dXJuIHBJbWFnZTsKLSAgICB9Ci0gICAgaWYoR1JURU1QTEFURSA9PSAwKSB7Ci0gICAgICAgIGlmKChHUkFUWzBdID09IChzaWduZWQgY2hhcikgLSAxKSAmJiAoR1JBVFsxXSA9PSAoc2lnbmVkIGNoYXIpIC0gMSkKLSAgICAgICAgICAgICAgICAmJiAoR1JBVFsyXSA9PSAoc2lnbmVkIGNoYXIpIC0gMSkgJiYgKEdSQVRbM10gPT0gKHNpZ25lZCBjaGFyKSAtIDEpCi0gICAgICAgICAgICAgICAgJiYgKEdSUkVGRVJFTkNFRFggPT0gMCkgJiYgKEdSVyA9PSAoRlhfRFdPUkQpR1JSRUZFUkVOQ0UtPm1fbldpZHRoKSkgewotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9UZW1wbGF0ZTBfb3B0KHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX1RlbXBsYXRlMF91bm9wdChwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOwotICAgICAgICB9CisgIH0KKyAgaWYgKEdCVEVNUExBVEUgPT0gMCkgeworICAgIGlmICgoR0JBVFswXSA9PSAzKSAmJiAoR0JBVFsxXSA9PSAoc2lnbmVkIGNoYXIpLTEpICYmCisgICAgICAgIChHQkFUWzJdID09IChzaWduZWQgY2hhciktMykgJiYgKEdCQVRbM10gPT0gKHNpZ25lZCBjaGFyKS0xKSAmJgorICAgICAgICAoR0JBVFs0XSA9PSAyKSAmJiAoR0JBVFs1XSA9PSAoc2lnbmVkIGNoYXIpLTIpICYmCisgICAgICAgIChHQkFUWzZdID09IChzaWduZWQgY2hhciktMikgJiYgKEdCQVRbN10gPT0gKHNpZ25lZCBjaGFyKS0yKSkgeworICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKChHUlJFRkVSRU5DRURYID09IDApICYmIChHUlcgPT0gKEZYX0RXT1JEKUdSUkVGRVJFTkNFLT5tX25XaWR0aCkpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfVGVtcGxhdGUxX29wdChwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9UZW1wbGF0ZTFfdW5vcHQocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKLSAgICAgICAgfQorICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfdW5vcHQocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKICAgICB9Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlX1RlbXBsYXRlMF91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdSUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTMsIGxpbmU0LCBsaW5lNTsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdSUkVHLCBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKLSAgICBHUlJFRy0+ZmlsbCgwKTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHUkg7IGgrKykgewotICAgICAgICBpZihUUEdST04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFsweDAwMTBdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDApIHsKLSAgICAgICAgICAgIGxpbmUxID0gR1JSRUctPmdldFBpeGVsKDEsIGggLSAxKTsKLSAgICAgICAgICAgIGxpbmUxIHw9IEdSUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMTsKLSAgICAgICAgICAgIGxpbmUyID0gMDsKLSAgICAgICAgICAgIGxpbmUzID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKTsKLSAgICAgICAgICAgIGxpbmUzIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTQgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSk7Ci0gICAgICAgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAxOwotICAgICAgICAgICAgbGluZTQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDI7Ci0gICAgICAgICAgICBsaW5lNSA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSk7Ci0gICAgICAgICAgICBsaW5lNSB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZICsgMSkgPDwgMTsKLSAgICAgICAgICAgIGxpbmU1IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCAtIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSkgPDwgMjsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdSVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmU1OwotICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTQgPDwgMzsKLSAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUzIDw8IDY7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyBHUkFUWzJdLCBoIC0gR1JSRUZFUkVOQ0VEWSArIEdSQVRbM10pIDw8IDg7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA5OwotICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgMTA7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyArIEdSQVRbMF0sIGggKyBHUkFUWzFdKSA8PCAxMjsKLSAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHUlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDAzOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwMTsKLSAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpKSAmIDB4MDM7Ci0gICAgICAgICAgICAgICAgbGluZTQgPSAoKGxpbmU0IDw8IDEpIHwgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwgaCAtIEdSUkVGRVJFTkNFRFkpKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgbGluZTUgPSAoKGxpbmU1IDw8IDEpIHwgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSkgJiAweDA3OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZTEgPSBHUlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOwotICAgICAgICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTIgPSAwOwotICAgICAgICAgICAgbGluZTMgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpOwotICAgICAgICAgICAgbGluZTMgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lNCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKTsKLSAgICAgICAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmU1ID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKTsKLSAgICAgICAgICAgIGxpbmU1IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTUgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSA8PCAyOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR1JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBiVmFsID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGgpOwotICAgICAgICAgICAgICAgIGlmKCEoVFBHUk9OICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSAxLCBoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIDEsIGggKyAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoICsgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIDEsIGggKyAxKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lNTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lNCA8PCAzOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUzIDw8IDY7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgR1JBVFsyXSwgaCAtIEdSUkVGRVJFTkNFRFkgKyBHUkFUWzNdKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgMTA7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgKyBHUkFUWzBdLCBoICsgR1JBVFsxXSkgPDwgMTI7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHUlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDAzOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwMTsKLSAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpKSAmIDB4MDM7Ci0gICAgICAgICAgICAgICAgbGluZTQgPSAoKGxpbmU0IDw8IDEpIHwgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwgaCAtIEdSUkVGRVJFTkNFRFkpKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgbGluZTUgPSAoKGxpbmU1IDw8IDEpIHwgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSkgJiAweDA3OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHUlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUwX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdSUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMV9yLCBsaW5lMl9yLCBsaW5lM19yOwotICAgIHVpbnQ4X3QgKnBMaW5lLCAqcExpbmVSLCBjVmFsOwotICAgIGludHB0cl90IG5TdHJpZGUsIG5TdHJpZGVSLCBuT2Zmc2V0OwotICAgIGludDMyX3QgaywgbkJpdHM7Ci0gICAgaW50MzJfdCBHUldSLCBHUkhSOwotICAgIGludDMyX3QgR1JXLCBHUkg7Ci0gICAgR1JXID0gKGludDMyX3QpQ0pCaWcyX0dSUkRQcm9jOjpHUlc7Ci0gICAgR1JIID0gKGludDMyX3QpQ0pCaWcyX0dSUkRQcm9jOjpHUkg7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHUlJFRywgQ0pCaWcyX0ltYWdlKEdSVywgR1JIKSk7Ci0gICAgaWYgKEdSUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIEdSUkVHOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJHZW5lcmljIHJlZmluZW1lbnQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLCBHUlcsIEdSSCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwTGluZSA9IEdSUkVHLT5tX3BEYXRhOwotICAgIHBMaW5lUiA9IEdSUkVGRVJFTkNFLT5tX3BEYXRhOwotICAgIG5TdHJpZGUgPSBHUlJFRy0+bV9uU3RyaWRlOwotICAgIG5TdHJpZGVSID0gR1JSRUZFUkVOQ0UtPm1fblN0cmlkZTsKLSAgICBHUldSID0gKGludDMyX3QpR1JSRUZFUkVOQ0UtPm1fbldpZHRoOwotICAgIEdSSFIgPSAoaW50MzJfdClHUlJFRkVSRU5DRS0+bV9uSGVpZ2h0OwotICAgIGlmIChHUlJFRkVSRU5DRURZIDwgLUdSSFIgKyAxIHx8IEdSUkVGRVJFTkNFRFkgPiBHUkhSIC0gMSkgewotICAgICAgICBHUlJFRkVSRU5DRURZID0gMDsKLSAgICB9Ci0gICAgbk9mZnNldCA9IC1HUlJFRkVSRU5DRURZICogblN0cmlkZVI7Ci0gICAgZm9yIChpbnQzMl90IGggPSAwOyBoIDwgR1JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHUk9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbMHgwMDEwXSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGxpbmUxID0gKGggPiAwKSA/IHBMaW5lWy1uU3RyaWRlXSA8PCA0IDogMDsKLSAgICAgICAgaW50MzJfdCByZWZlcmVuY2VfaCA9IGggLSBHUlJFRkVSRU5DRURZOwotICAgICAgICBGWF9CT09MIGxpbmUxX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAwICYmIHJlZmVyZW5jZV9oIDwgR1JIUiArIDEpOwotICAgICAgICBGWF9CT09MIGxpbmUyX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMSAmJiByZWZlcmVuY2VfaCA8IEdSSFIpOwotICAgICAgICBGWF9CT09MIGxpbmUzX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMiAmJiByZWZlcmVuY2VfaCA8IEdSSFIgLSAxKTsKLSAgICAgICAgbGluZTFfciA9IGxpbmUxX3Jfb2sgPyBwTGluZVJbbk9mZnNldCAtIG5TdHJpZGVSXSA6IDA7Ci0gICAgICAgIGxpbmUyX3IgPSBsaW5lMl9yX29rID8gcExpbmVSW25PZmZzZXRdIDogMDsKLSAgICAgICAgbGluZTNfciA9IGxpbmUzX3Jfb2sgPyBwTGluZVJbbk9mZnNldCArIG5TdHJpZGVSXSA6IDA7Ci0gICAgICAgIGlmKExUUCA9PSAwKSB7Ci0gICAgICAgICAgICBDT05URVhUID0gKGxpbmUxICYgMHgxYzAwKSB8IChsaW5lMV9yICYgMHgwMWMwKQotICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMl9yID4+IDMpICYgMHgwMDM4KSB8ICgobGluZTNfciA+PiA2KSAmIDB4MDAwNyk7Ci0gICAgICAgICAgICBmb3IgKGludDMyX3QgdyA9IDA7IHcgPCBHUlc7IHcgKz0gOCkgewotICAgICAgICAgICAgICAgIG5CaXRzID0gR1JXIC0gdyA+IDggPyA4IDogR1JXIC0gdzsKLSAgICAgICAgICAgICAgICBpZiAoaCA+IDApCi0gICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUlcgPyBwTGluZVstblN0cmlkZSArICh3ID4+IDMpICsgMV0gPDwgNCA6IDApOwotICAgICAgICAgICAgICAgIGlmIChoID4gR1JIUiArIEdSUkVGRVJFTkNFRFkgKyAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUxX3IgPSAwOwotICAgICAgICAgICAgICAgICAgICBsaW5lMl9yICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUzX3IgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxpbmUxX3Jfb2spCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMV9yID0gKGxpbmUxX3IgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCAtIG5TdHJpZGVSICsgKHcgPj4gMykgKyAxXSA6IDApOwotICAgICAgICAgICAgICAgICAgICBpZihsaW5lMl9yX29rKQotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTJfciA9IChsaW5lMl9yIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgKyAodyA+PiAzKSArIDFdIDogMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxpbmUzX3Jfb2spCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lM19yID0gKGxpbmUzX3IgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCArIG5TdHJpZGVSICsgKHcgPj4gMykgKyAxXSA6IDApOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUzX3IgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0czsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwY2RiKSA8PCAxKSB8IChiVmFsIDw8IDkpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDA0MDApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTFfciA+PiAoNyAtIGspKSAmIDB4MDA0MCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMl9yID4+ICgxMCAtIGspKSAmIDB4MDAwOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsaW5lM19yID4+ICgxMyAtIGspKSAmIDB4MDAwMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBMaW5lW3cgPj4gM10gPSBjVmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MWMwMCkgfCAobGluZTFfciAmIDB4MDFjMCkKLSAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTJfciA+PiAzKSAmIDB4MDAzOCkgfCAoKGxpbmUzX3IgPj4gNikgJiAweDAwMDcpOwotICAgICAgICAgICAgZm9yIChpbnQzMl90IHcgPSAwOyB3IDwgR1JXOyB3ICs9IDgpIHsKLSAgICAgICAgICAgICAgICBuQml0cyA9IEdSVyAtIHcgPiA4ID8gOCA6IEdSVyAtIHc7Ci0gICAgICAgICAgICAgICAgaWYgKGggPiAwKQotICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXID8gcExpbmVbLW5TdHJpZGUgKyAodyA+PiAzKSArIDFdIDw8IDQgOiAwKTsKLSAgICAgICAgICAgICAgICBpZihsaW5lMV9yX29rKQotICAgICAgICAgICAgICAgICAgICBsaW5lMV9yID0gKGxpbmUxX3IgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7Ci0gICAgICAgICAgICAgICAgaWYobGluZTJfcl9vaykKLSAgICAgICAgICAgICAgICAgICAgbGluZTJfciA9IChsaW5lMl9yIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCArICh3ID4+IDMpICsgMV0gOiAwKTsKLSAgICAgICAgICAgICAgICBpZihsaW5lM19yX29rKQotICAgICAgICAgICAgICAgICAgICBsaW5lM19yID0gKGxpbmUzX3IgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUzX3IgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHM7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrLCBoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIShUUEdST04gJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrIC0gMSwgaCAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgaywgaCAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayArIDEsIGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgLSAxLCBoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgKyAxLCBoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgLSAxLCBoICsgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrLCBoICsgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrICsgMSwgaCArIDEpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBjZGIpIDw8IDEpIHwgKGJWYWwgPDwgOSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDQwMCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMV9yID4+ICg3IC0gaykpICYgMHgwMDQwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUyX3IgPj4gKDEwIC0gaykpICYgMHgwMDA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUzX3IgPj4gKDEzIC0gaykpICYgMHgwMDAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbdyA+PiAzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcExpbmUgKz0gblN0cmlkZTsKLSAgICAgICAgaWYgKGggPCBHUkhSICsgR1JSRUZFUkVOQ0VEWSkgewotICAgICAgICAgICAgcExpbmVSICs9IG5TdHJpZGVSOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHUlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUxX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR1JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMywgbGluZTQsIGxpbmU1OwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR1JSRUcsIENKQmlnMl9JbWFnZShHUlcsIEdSSCkpOwotICAgIEdSUkVHLT5maWxsKDApOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdSSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR1JPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0WzB4MDAwOF0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMCkgewotICAgICAgICAgICAgbGluZTEgPSBHUlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOwotICAgICAgICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKC0xLCBoIC0gMSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmUyID0gMDsKLSAgICAgICAgICAgIGxpbmUzID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpOwotICAgICAgICAgICAgbGluZTQgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSk7Ci0gICAgICAgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAxOwotICAgICAgICAgICAgbGluZTQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDI7Ci0gICAgICAgICAgICBsaW5lNSA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSk7Ci0gICAgICAgICAgICBsaW5lNSB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZICsgMSkgPDwgMTsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdSVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmU1OwotICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTQgPDwgMjsKLSAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUzIDw8IDU7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA2OwotICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgNzsKLSAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHUlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDA3OwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwMTsKLSAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpKSAmIDB4MDE7Ci0gICAgICAgICAgICAgICAgbGluZTQgPSAoKGxpbmU0IDw8IDEpIHwgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwgaCAtIEdSUkVGRVJFTkNFRFkpKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgbGluZTUgPSAoKGxpbmU1IDw8IDEpIHwgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSkgJiAweDAzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZTEgPSBHUlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOwotICAgICAgICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKC0xLCBoIC0gMSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmUyID0gMDsKLSAgICAgICAgICAgIGxpbmUzID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpOwotICAgICAgICAgICAgbGluZTQgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSk7Ci0gICAgICAgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAxOwotICAgICAgICAgICAgbGluZTQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDI7Ci0gICAgICAgICAgICBsaW5lNSA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSk7Ci0gICAgICAgICAgICBsaW5lNSB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZICsgMSkgPDwgMTsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdSVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgYlZhbCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoKTsKLSAgICAgICAgICAgICAgICBpZighKFRQR1JPTiAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIDEsIGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIDEsIGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSAxLCBoICsgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodywgaCArIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyAxLCBoICsgMSkpKSkgewotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTU7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTQgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMyA8PCA1OwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDY7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdSUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDEpKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDAxOwotICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkpICYgMHgwMTsKLSAgICAgICAgICAgICAgICBsaW5lNCA9ICgobGluZTQgPDwgMSkgfCBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLCBoIC0gR1JSRUZFUkVOQ0VEWSkpICYgMHgwNzsKLSAgICAgICAgICAgICAgICBsaW5lNSA9ICgobGluZTUgPDwgMSkgfCBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpKSAmIDB4MDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEdSUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTFfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR1JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUxX3IsIGxpbmUyX3IsIGxpbmUzX3I7Ci0gICAgdWludDhfdCAqcExpbmUsICpwTGluZVIsIGNWYWw7Ci0gICAgaW50cHRyX3QgblN0cmlkZSwgblN0cmlkZVIsIG5PZmZzZXQ7Ci0gICAgaW50MzJfdCBrLCBuQml0czsKLSAgICBpbnQzMl90IEdSV1IsIEdSSFI7Ci0gICAgaW50MzJfdCBHUlcsIEdSSDsKLSAgICBHUlcgPSAoaW50MzJfdClDSkJpZzJfR1JSRFByb2M6OkdSVzsKLSAgICBHUkggPSAoaW50MzJfdClDSkJpZzJfR1JSRFByb2M6OkdSSDsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdSUkVHLCBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKLSAgICBpZiAoR1JSRUctPm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgR1JSRUc7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIkdlbmVyaWMgcmVmaW5lbWVudCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsIEdSVywgR1JIKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBMaW5lID0gR1JSRUctPm1fcERhdGE7Ci0gICAgcExpbmVSID0gR1JSRUZFUkVOQ0UtPm1fcERhdGE7Ci0gICAgblN0cmlkZSA9IEdSUkVHLT5tX25TdHJpZGU7Ci0gICAgblN0cmlkZVIgPSBHUlJFRkVSRU5DRS0+bV9uU3RyaWRlOwotICAgIEdSV1IgPSAoaW50MzJfdClHUlJFRkVSRU5DRS0+bV9uV2lkdGg7Ci0gICAgR1JIUiA9IChpbnQzMl90KUdSUkVGRVJFTkNFLT5tX25IZWlnaHQ7Ci0gICAgaWYgKEdSUkVGRVJFTkNFRFkgPCAtR1JIUiArIDEgfHwgR1JSRUZFUkVOQ0VEWSA+IEdSSFIgLSAxKSB7Ci0gICAgICAgIEdSUkVGRVJFTkNFRFkgPSAwOwotICAgIH0KLSAgICBuT2Zmc2V0ID0gLUdSUkVGRVJFTkNFRFkgKiBuU3RyaWRlUjsKLSAgICBmb3IgKGludDMyX3QgaCA9IDA7IGggPCBHUkg7IGgrKykgewotICAgICAgICBpZihUUEdST04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFsweDAwMDhdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgbGluZTEgPSAoaCA+IDApID8gcExpbmVbLW5TdHJpZGVdIDw8IDEgOiAwOwotICAgICAgICBpbnQzMl90IHJlZmVyZW5jZV9oID0gaCAtIEdSUkVGRVJFTkNFRFk7Ci0gICAgICAgIEZYX0JPT0wgbGluZTFfcl9vayA9IChyZWZlcmVuY2VfaCA+IDAgJiYgcmVmZXJlbmNlX2ggPCBHUkhSICsgMSk7Ci0gICAgICAgIEZYX0JPT0wgbGluZTJfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0xICYmIHJlZmVyZW5jZV9oIDwgR1JIUik7Ci0gICAgICAgIEZYX0JPT0wgbGluZTNfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0yICYmIHJlZmVyZW5jZV9oIDwgR1JIUiAtIDEpOwotICAgICAgICBsaW5lMV9yID0gbGluZTFfcl9vayA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVJdIDogMDsKLSAgICAgICAgbGluZTJfciA9IGxpbmUyX3Jfb2sgPyBwTGluZVJbbk9mZnNldF0gOiAwOwotICAgICAgICBsaW5lM19yID0gbGluZTNfcl9vayA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVJdIDogMDsKLSAgICAgICAgaWYoTFRQID09IDApIHsKLSAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDAzODApIHwgKChsaW5lMV9yID4+IDIpICYgMHgwMDIwKQotICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMl9yID4+IDQpICYgMHgwMDFjKSB8ICgobGluZTNfciA+PiA2KSAmIDB4MDAwMyk7Ci0gICAgICAgICAgICBmb3IgKGludDMyX3QgdyA9IDA7IHcgPCBHUlc7IHcgKz0gOCkgewotICAgICAgICAgICAgICAgIG5CaXRzID0gR1JXIC0gdyA+IDggPyA4IDogR1JXIC0gdzsKLSAgICAgICAgICAgICAgICBpZiAoaCA+IDApCi0gICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUlcgPyBwTGluZVstblN0cmlkZSArICh3ID4+IDMpICsgMV0gPDwgMSA6IDApOwotICAgICAgICAgICAgICAgIGlmKGxpbmUxX3Jfb2spCi0gICAgICAgICAgICAgICAgICAgIGxpbmUxX3IgPSAobGluZTFfciA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgLSBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKLSAgICAgICAgICAgICAgICBpZihsaW5lMl9yX29rKQotICAgICAgICAgICAgICAgICAgICBsaW5lMl9yID0gKGxpbmUyX3IgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0ICsgKHcgPj4gMykgKyAxXSA6IDApOwotICAgICAgICAgICAgICAgIGlmKGxpbmUzX3Jfb2spCi0gICAgICAgICAgICAgICAgICAgIGxpbmUzX3IgPSAobGluZTNfciA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgKyBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZTNfciA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0czsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMThkKSA8PCAxKSB8IChiVmFsIDw8IDYpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAwODApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTFfciA+PiAoOSAtIGspKSAmIDB4MDAyMCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMl9yID4+ICgxMSAtIGspKSAmIDB4MDAwNCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsaW5lM19yID4+ICgxMyAtIGspKSAmIDB4MDAwMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBMaW5lW3cgPj4gM10gPSBjVmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MDM4MCkgfCAoKGxpbmUxX3IgPj4gMikgJiAweDAwMjApCi0gICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyX3IgPj4gNCkgJiAweDAwMWMpIHwgKChsaW5lM19yID4+IDYpICYgMHgwMDAzKTsKLSAgICAgICAgICAgIGZvciAoaW50MzJfdCB3ID0gMDsgdyA8IEdSVzsgdyArPSA4KSB7Ci0gICAgICAgICAgICAgICAgbkJpdHMgPSBHUlcgLSB3ID4gOCA/IDggOiBHUlcgLSB3OwotICAgICAgICAgICAgICAgIGlmIChoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSVyA/IHBMaW5lWy1uU3RyaWRlICsgKHcgPj4gMykgKyAxXSA8PCAxIDogMCk7Ci0gICAgICAgICAgICAgICAgaWYobGluZTFfcl9vaykKLSAgICAgICAgICAgICAgICAgICAgbGluZTFfciA9IChsaW5lMV9yIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCAtIG5TdHJpZGVSICsgKHcgPj4gMykgKyAxXSA6IDApOwotICAgICAgICAgICAgICAgIGlmKGxpbmUyX3Jfb2spCi0gICAgICAgICAgICAgICAgICAgIGxpbmUyX3IgPSAobGluZTJfciA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgKyAodyA+PiAzKSArIDFdIDogMCk7Ci0gICAgICAgICAgICAgICAgaWYobGluZTNfcl9vaykKLSAgICAgICAgICAgICAgICAgICAgbGluZTNfciA9IChsaW5lM19yIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCArIG5TdHJpZGVSICsgKHcgPj4gMykgKyAxXSA6IDApOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsaW5lM19yID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgaywgaCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCEoVFBHUk9OICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayAtIDEsIGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGssIGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgKyAxLCBoIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrIC0gMSwgaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrICsgMSwgaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrIC0gMSwgaCArIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgaywgaCArIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayArIDEsIGggKyAxKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMThkKSA8PCAxKSB8IChiVmFsIDw8IDYpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAwODApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTFfciA+PiAoOSAtIGspKSAmIDB4MDAyMCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMl9yID4+ICgxMSAtIGspKSAmIDB4MDAwNCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsaW5lM19yID4+ICgxMyAtIGspKSAmIDB4MDAwMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBMaW5lW3cgPj4gM10gPSBjVmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBMaW5lICs9IG5TdHJpZGU7Ci0gICAgICAgIGlmIChoIDwgR1JIUiArIEdSUkVGRVJFTkNFRFkpIHsKLSAgICAgICAgICAgIHBMaW5lUiArPSBuU3RyaWRlUjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR1JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlX1YxKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9CT09MIFRQR1JQSVgsIFRQR1JWQUw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdSUkVHOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR1JSRUcsIENKQmlnMl9JbWFnZShHUlcsIEdSSCkpOwotICAgIEdSUkVHLT5maWxsKDApOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdSSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR1JPTikgewotICAgICAgICAgICAgc3dpdGNoKEdSVEVNUExBVEUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAweDAwMTA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4MDAwODsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMCkgewotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR1JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBDT05URVhUID0gMDsKLSAgICAgICAgICAgICAgICBzd2l0Y2goR1JURU1QTEFURSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAzOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSA8PCA2OwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgR1JBVFsyXSwgaCAtIEdSUkVGRVJFTkNFRFkgKyBHUkFUWzNdKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGgpIDw8IDk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDEpIDw8IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodywgaCAtIDEpIDw8IDExOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyArIEdSQVRbMF0sIGggKyBHUkFUWzFdKSA8PCAxMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSA8PCA1OwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGgpIDw8IDY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDEpIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3LCBoIC0gMSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgLSAxLCBoIC0gMSkgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdSVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgYlZhbCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoKTsKLSAgICAgICAgICAgICAgICBpZihUUEdST04gJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSAxLCBoIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodywgaCAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIDEsIGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyAxLCBoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCArIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGggKyAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCArIDEpKSkgewotICAgICAgICAgICAgICAgICAgICBUUEdSUElYID0gMTsKLSAgICAgICAgICAgICAgICAgICAgVFBHUlZBTCA9IGJWYWw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgVFBHUlBJWCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKFRQR1JQSVgpIHsKLSAgICAgICAgICAgICAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIFRQR1JWQUwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAwOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goR1JURU1QTEFURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpIDw8IDY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIEdSQVRbMl0sIGggLSBHUlJFRkVSRU5DRURZICsgR1JBVFszXSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCkgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDEpIDw8IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcsIGggLSAxKSA8PCAxMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3ICsgR1JBVFswXSwgaCArIEdSQVRbMV0pIDw8IDEyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCkgPDwgNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDEpIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodywgaCAtIDEpIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGggLSAxKSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEdSUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfVFJEUHJvYzo6ZGVjb2RlX0h1ZmZtYW4oQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KQotewotICAgIGludDMyX3QgU1RSSVBULCBGSVJTVFM7Ci0gICAgRlhfRFdPUkQgTklOU1RBTkNFUzsKLSAgICBpbnQzMl90IERULCBERlMsIENVUlM7Ci0gICAgdWludDhfdCBDVVJUOwotICAgIGludDMyX3QgU0ksIFRJOwotICAgIEZYX0RXT1JEIElESTsKLSAgICBDSkJpZzJfSW1hZ2UgKklCSTsKLSAgICBGWF9EV09SRCBXSSwgSEk7Ci0gICAgaW50MzJfdCBJRFM7Ci0gICAgRlhfQk9PTCBSSTsKLSAgICBpbnQzMl90IFJEV0ksIFJESEksIFJEWEksIFJEWUk7Ci0gICAgQ0pCaWcyX0ltYWdlICpJQk9JOwotICAgIEZYX0RXT1JEIFdPSSwgSE9JOwotICAgIENKQmlnMl9JbWFnZSAqU0JSRUc7Ci0gICAgRlhfQk9PTCBiRmlyc3Q7Ci0gICAgRlhfRFdPUkQgblRtcDsKLSAgICBpbnQzMl90IG5WYWwsIG5CaXRzOwotICAgIENKQmlnMl9IdWZmbWFuRGVjb2RlciAqcEh1ZmZtYW5EZWNvZGVyOwotICAgIENKQmlnMl9HUlJEUHJvYyAqcEdSUkQ7Ci0gICAgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlcjsKLSAgICBKQklHMl9BTExPQyhwSHVmZm1hbkRlY29kZXIsIENKQmlnMl9IdWZmbWFuRGVjb2RlcihwU3RyZWFtKSk7Ci0gICAgSkJJRzJfQUxMT0MoU0JSRUcsIENKQmlnMl9JbWFnZShTQlcsIFNCSCkpOwotICAgIFNCUkVHLT5maWxsKFNCREVGUElYRUwpOwotICAgIGlmKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkRULCAmU1RSSVBUKSAhPSAwKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIFNUUklQVCAqPSBTQlNUUklQUzsKLSAgICBTVFJJUFQgPSAtU1RSSVBUOwotICAgIEZJUlNUUyA9IDA7Ci0gICAgTklOU1RBTkNFUyA9IDA7Ci0gICAgd2hpbGUoTklOU1RBTkNFUyA8IFNCTlVNSU5TVEFOQ0VTKSB7Ci0gICAgICAgIGlmKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkRULCAmRFQpICE9IDApIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIERUICo9IFNCU1RSSVBTOwotICAgICAgICBTVFJJUFQgPSBTVFJJUFQgKyBEVDsKLSAgICAgICAgYkZpcnN0ID0gVFJVRTsKLSAgICAgICAgZm9yKDs7KSB7Ci0gICAgICAgICAgICBpZihiRmlyc3QpIHsKLSAgICAgICAgICAgICAgICBpZihwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZGUywgJkRGUykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGSVJTVFMgPSBGSVJTVFMgKyBERlM7Ci0gICAgICAgICAgICAgICAgQ1VSUyA9IEZJUlNUUzsKLSAgICAgICAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgblZhbCA9IHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkRTLCAmSURTKTsKLSAgICAgICAgICAgICAgICBpZihuVmFsID09IEpCSUcyX09PQikgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoblZhbCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ1VSUyA9IENVUlMgKyBJRFMgKyBTQkRTT0ZGU0VUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFNCU1RSSVBTID09IDEpIHsKLSAgICAgICAgICAgICAgICBDVVJUID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgblRtcCA9IDE7Ci0gICAgICAgICAgICAgICAgd2hpbGUoKEZYX0RXT1JEKSgxIDw8IG5UbXApIDwgU0JTVFJJUFMpIHsKLSAgICAgICAgICAgICAgICAgICAgblRtcCArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocFN0cmVhbS0+cmVhZE5CaXRzKG5UbXAsICZuVmFsKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENVUlQgPSBuVmFsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVEkgPSBTVFJJUFQgKyBDVVJUOwotICAgICAgICAgICAgblZhbCA9IDA7Ci0gICAgICAgICAgICBuQml0cyA9IDA7Ci0gICAgICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgICAgICBpZihwU3RyZWFtLT5yZWFkMUJpdCgmblRtcCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuVmFsID0gKG5WYWwgPDwgMSkgfCBuVG1wOwotICAgICAgICAgICAgICAgIG5CaXRzICsrOwotICAgICAgICAgICAgICAgIGZvcihJREkgPSAwOyBJREkgPCBTQk5VTVNZTVM7IElESSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKChuQml0cyA9PSBTQlNZTUNPREVTW0lESV0uY29kZWxlbikgJiYgKG5WYWwgPT0gU0JTWU1DT0RFU1tJREldLmNvZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihJREkgPCBTQk5VTVNZTVMpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoU0JSRUZJTkUgPT0gMCkgewotICAgICAgICAgICAgICAgIFJJID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYocFN0cmVhbS0+cmVhZDFCaXQoJlJJKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoUkkgPT0gMCkgewotICAgICAgICAgICAgICAgIElCSSA9IFNCU1lNU1tJREldOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZigocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRXLCAmUkRXSSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSREgsICZSREhJKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJEWCwgJlJEWEkpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRZLCAmUkRZSSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSU0laRSwgJm5WYWwpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgICAgICAgICAgIG5UbXAgPSBwU3RyZWFtLT5nZXRPZmZzZXQoKTsKLSAgICAgICAgICAgICAgICBJQk9JID0gU0JTWU1TW0lESV07Ci0gICAgICAgICAgICAgICAgaWYgKCFJQk9JKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBXT0kgPSBJQk9JLT5tX25XaWR0aDsKLSAgICAgICAgICAgICAgICBIT0kgPSBJQk9JLT5tX25IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaWYgKChpbnQpKFdPSSArIFJEV0kpIDwgMCB8fCAoaW50KShIT0kgKyBSREhJKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogSW52YWxpZCBSRFdJIG9yIFJESEkgdmFsdWUuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhwR1JSRCwgQ0pCaWcyX0dSUkRQcm9jKCkpOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUlcgPSBXT0kgKyBSRFdJOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUkggPSBIT0kgKyBSREhJOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUlRFTVBMQVRFID0gU0JSVEVNUExBVEU7Ci0gICAgICAgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFID0gSUJPSTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWCA9IChSRFdJID4+IDIpICsgUkRYSTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWSA9IChSREhJID4+IDIpICsgUkRZSTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+VFBHUk9OID0gMDsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JBVFswXSA9IFNCUkFUWzBdOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUkFUWzFdID0gU0JSQVRbMV07Ci0gICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbMl0gPSBTQlJBVFsyXTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JBVFszXSA9IFNCUkFUWzNdOwotICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKHBBcml0aERlY29kZXIsIENKQmlnMl9Bcml0aERlY29kZXIocFN0cmVhbSkpOwotICAgICAgICAgICAgICAgIElCSSA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZihJQkkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEdSUkQ7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwQXJpdGhEZWNvZGVyOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBBcml0aERlY29kZXI7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbS0+b2Zmc2V0KDIpOwotICAgICAgICAgICAgICAgIGlmKChGWF9EV09SRCluVmFsICE9IChwU3RyZWFtLT5nZXRPZmZzZXQoKSAtIG5UbXApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBJQkk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwR1JSRDsKLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKToiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIHByb2Nlc3NlZCBieSBnZW5lcmljIHJlZmluZW1lbnQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSBkb2Vzbid0IGVxdWFsIFNCSFVGRlJTSVpFLiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBHUlJEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFJQkkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFdJID0gSUJJLT5tX25XaWR0aDsKLSAgICAgICAgICAgIEhJID0gSUJJLT5tX25IZWlnaHQ7Ci0gICAgICAgICAgICBpZihUUkFOU1BPU0VEID09IDAgJiYgKChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX1RPUFJJR0hUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVCkpKSB7Ci0gICAgICAgICAgICAgICAgQ1VSUyA9IENVUlMgKyBXSSAtIDE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoVFJBTlNQT1NFRCA9PSAxICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9CT1RUT01MRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQpKSkgewotICAgICAgICAgICAgICAgIENVUlMgPSBDVVJTICsgSEkgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU0kgPSBDVVJTOwotICAgICAgICAgICAgaWYoVFJBTlNQT1NFRCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKFJFRkNPUk5FUikgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9UT1BMRUZUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJLCBUSSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QUklHSFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0kgLSBXSSArIDEsIFRJLCBJQkksIFNCQ09NQk9QKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9CT1RUT01MRUZUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJLCBUSSAtIEhJICsgMSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0kgLSBXSSArIDEsIFRJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKFJFRkNPUk5FUikgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9UT1BMRUZUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJLCBTSSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QUklHSFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEkgLSBXSSArIDEsIFNJLCBJQkksIFNCQ09NQk9QKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9CT1RUT01MRUZUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJLCBTSSAtIEhJICsgMSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEkgLSBXSSArIDEsIFNJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFJJICE9IDApIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgSUJJOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoVFJBTlNQT1NFRCA9PSAwICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BMRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9CT1RUT01MRUZUKSkpIHsKLSAgICAgICAgICAgICAgICBDVVJTID0gQ1VSUyArIFdJIC0gMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihUUkFOU1BPU0VEID09IDEgJiYgKChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX1RPUExFRlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BSSUdIVCkpKSB7Ci0gICAgICAgICAgICAgICAgQ1VSUyA9IENVUlMgKyBISSAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOSU5TVEFOQ0VTID0gTklOU1RBTkNFUyArIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZGVsZXRlIHBIdWZmbWFuRGVjb2RlcjsKLSAgICByZXR1cm4gU0JSRUc7Ci1mYWlsZWQ6Ci0gICAgZGVsZXRlIHBIdWZmbWFuRGVjb2RlcjsKLSAgICBkZWxldGUgU0JSRUc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9UUkRQcm9jOjpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0LAotICAgICAgICBKQmlnMkludERlY29kZXJTdGF0ZSAqcElEUykKLXsKLSAgICBpbnQzMl90IFNUUklQVCwgRklSU1RTOwotICAgIEZYX0RXT1JEIE5JTlNUQU5DRVM7Ci0gICAgaW50MzJfdCBEVCwgREZTLCBDVVJTOwotICAgIGludDMyX3QgQ1VSVDsKLSAgICBpbnQzMl90IFNJLCBUSTsKLSAgICBGWF9EV09SRCBJREk7Ci0gICAgQ0pCaWcyX0ltYWdlICpJQkk7Ci0gICAgRlhfRFdPUkQgV0ksIEhJOwotICAgIGludDMyX3QgSURTOwotICAgIGludCBSSTsKLSAgICBpbnQzMl90IFJEV0ksIFJESEksIFJEWEksIFJEWUk7Ci0gICAgQ0pCaWcyX0ltYWdlICpJQk9JOwotICAgIEZYX0RXT1JEIFdPSSwgSE9JOwotICAgIENKQmlnMl9JbWFnZSAqU0JSRUc7Ci0gICAgRlhfQk9PTCBiRmlyc3Q7Ci0gICAgaW50MzJfdCBuUmV0LCBuVmFsOwotICAgIGludDMyX3QgYlJldGFpbmVkOwotICAgIENKQmlnMl9Bcml0aEludERlY29kZXIgKklBRFQsICpJQUZTLCAqSUFEUywgKklBSVQsICpJQVJJLCAqSUFSRFcsICpJQVJESCwgKklBUkRYLCAqSUFSRFk7Ci0gICAgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXIgKklBSUQ7Ci0gICAgQ0pCaWcyX0dSUkRQcm9jICpwR1JSRDsKLSAgICBpZihwSURTKSB7Ci0gICAgICAgIElBRFQgPSBwSURTLT5JQURUOwotICAgICAgICBJQUZTID0gcElEUy0+SUFGUzsKLSAgICAgICAgSUFEUyA9IHBJRFMtPklBRFM7Ci0gICAgICAgIElBSVQgPSBwSURTLT5JQUlUOwotICAgICAgICBJQVJJID0gcElEUy0+SUFSSTsKLSAgICAgICAgSUFSRFcgPSBwSURTLT5JQVJEVzsKLSAgICAgICAgSUFSREggPSBwSURTLT5JQVJESDsKLSAgICAgICAgSUFSRFggPSBwSURTLT5JQVJEWDsKLSAgICAgICAgSUFSRFkgPSBwSURTLT5JQVJEWTsKLSAgICAgICAgSUFJRCA9IHBJRFMtPklBSUQ7Ci0gICAgICAgIGJSZXRhaW5lZCA9IFRSVUU7CisgIH0gZWxzZSBpZiAoR0JURU1QTEFURSA9PSAxKSB7CisgICAgaWYgKChHQkFUWzBdID09IDMpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhciktMSkpIHsKKyAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKICAgICB9IGVsc2UgewotICAgICAgICBKQklHMl9BTExPQyhJQURULCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQUZTLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQURTLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQUlULCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQVJJLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQVJEVywgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKLSAgICAgICAgSkJJRzJfQUxMT0MoSUFSREgsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7Ci0gICAgICAgIEpCSUcyX0FMTE9DKElBUkRYLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQVJEWSwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKLSAgICAgICAgSkJJRzJfQUxMT0MoSUFJRCAsIENKQmlnMl9Bcml0aElhaWREZWNvZGVyKFNCU1lNQ09ERUxFTikpOwotICAgICAgICBiUmV0YWluZWQgPSBGQUxTRTsKKyAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX3Vub3B0KHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7CiAgICAgfQotICAgIEpCSUcyX0FMTE9DKFNCUkVHLCBDSkJpZzJfSW1hZ2UoU0JXLCBTQkgpKTsKLSAgICBTQlJFRy0+ZmlsbChTQkRFRlBJWEVMKTsKLSAgICBpZihJQURULT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlNUUklQVCkgPT0gLTEpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgZ290byBmYWlsZWQ7CisgIH0gZWxzZSBpZiAoR0JURU1QTEFURSA9PSAyKSB7CisgICAgaWYgKChHQkFUWzBdID09IDIpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhciktMSkpIHsKKyAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKICAgICB9Ci0gICAgU1RSSVBUICo9IFNCU1RSSVBTOwotICAgIFNUUklQVCA9IC1TVFJJUFQ7Ci0gICAgRklSU1RTID0gMDsKLSAgICBOSU5TVEFOQ0VTID0gMDsKLSAgICB3aGlsZShOSU5TVEFOQ0VTIDwgU0JOVU1JTlNUQU5DRVMpIHsKLSAgICAgICAgaWYoSUFEVC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZEVCkgPT0gLTEpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBEVCAqPSBTQlNUUklQUzsKLSAgICAgICAgU1RSSVBUID0gU1RSSVBUICsgRFQ7Ci0gICAgICAgIGJGaXJzdCA9IFRSVUU7Ci0gICAgICAgIGZvcig7OykgewotICAgICAgICAgICAgaWYoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgaWYoSUFGUy0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZERlMpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGSVJTVFMgPSBGSVJTVFMgKyBERlM7Ci0gICAgICAgICAgICAgICAgQ1VSUyA9IEZJUlNUUzsKLSAgICAgICAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgblJldCA9IElBRFMtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmSURTKTsKLSAgICAgICAgICAgICAgICBpZihuUmV0ID09IEpCSUcyX09PQikgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoblJldCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENVUlMgPSBDVVJTICsgSURTICsgU0JEU09GRlNFVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTklOU1RBTkNFUyA+PSBTQk5VTUlOU1RBTkNFUykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoU0JTVFJJUFMgPT0gMSkgewotICAgICAgICAgICAgICAgIENVUlQgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZihJQUlULT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJm5WYWwpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDVVJUID0gblZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRJID0gU1RSSVBUICsgQ1VSVDsKLSAgICAgICAgICAgIGlmKElBSUQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmblZhbCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSURJID0gblZhbDsKLSAgICAgICAgICAgIGlmKElESSA+PSBTQk5VTVNZTVMpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogc3ltYm9sIGlkIG91dCBvZiByYW5nZS4oJWQvJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElESSwgU0JOVU1TWU1TKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFNCUkVGSU5FID09IDApIHsKLSAgICAgICAgICAgICAgICBSSSA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmKElBUkktPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmUkkpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghU0JTWU1TW0lESV0pIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFJJID09IDApIHsKLSAgICAgICAgICAgICAgICBJQkkgPSBTQlNZTVNbSURJXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYoKElBUkRXLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEV0kpID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKElBUkRILT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJESEkpID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKElBUkRYLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEWEkpID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKElBUkRZLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEWUkpID09IC0xKSkgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSUJPSSA9IFNCU1lNU1tJREldOwotICAgICAgICAgICAgICAgIFdPSSA9IElCT0ktPm1fbldpZHRoOwotICAgICAgICAgICAgICAgIEhPSSA9IElCT0ktPm1fbkhlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoKGludCkoV09JICsgUkRXSSkgPCAwIHx8IChpbnQpKEhPSSArIFJESEkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogSW52YWxpZCBSRFdJIG9yIFJESEkgdmFsdWUuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhwR1JSRCwgQ0pCaWcyX0dSUkRQcm9jKCkpOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUlcgPSBXT0kgKyBSRFdJOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUkggPSBIT0kgKyBSREhJOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUlRFTVBMQVRFID0gU0JSVEVNUExBVEU7Ci0gICAgICAgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFID0gSUJPSTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWCA9IChSRFdJID4+IDEpICsgUkRYSTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWSA9IChSREhJID4+IDEpICsgUkRZSTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+VFBHUk9OID0gMDsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JBVFswXSA9IFNCUkFUWzBdOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUkFUWzFdID0gU0JSQVRbMV07Ci0gICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbMl0gPSBTQlJBVFsyXTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JBVFszXSA9IFNCUkFUWzNdOwotICAgICAgICAgICAgICAgIElCSSA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZihJQkkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEdSUkQ7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWxldGUgcEdSUkQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBXSSA9IElCSS0+bV9uV2lkdGg7Ci0gICAgICAgICAgICBISSA9IElCSS0+bV9uSGVpZ2h0OwotICAgICAgICAgICAgaWYoVFJBTlNQT1NFRCA9PSAwICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BSSUdIVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQpKSkgewotICAgICAgICAgICAgICAgIENVUlMgPSBDVVJTICsgV0kgLSAxOwotICAgICAgICAgICAgfSBlbHNlIGlmKFRSQU5TUE9TRUQgPT0gMSAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUKSkpIHsKLSAgICAgICAgICAgICAgICBDVVJTID0gQ1VSUyArIEhJIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNJID0gQ1VSUzsKLSAgICAgICAgICAgIGlmKFRSQU5TUE9TRUQgPT0gMCkgewotICAgICAgICAgICAgICAgIHN3aXRjaChSRUZDT1JORVIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QTEVGVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEksIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUFJJR0hUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEkgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSAtIEhJICsgMSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN3aXRjaChSRUZDT1JORVIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QTEVGVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0ksIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUFJJR0hUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJIC0gV0kgKyAxLCBTSSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0kgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJIC0gV0kgKyAxLCBTSSAtIEhJICsgMSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihSSSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIElCSTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFRSQU5TUE9TRUQgPT0gMCAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVCkpKSB7Ci0gICAgICAgICAgICAgICAgQ1VSUyA9IENVUlMgKyBXSSAtIDE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoVFJBTlNQT1NFRCA9PSAxICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BMRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QUklHSFQpKSkgewotICAgICAgICAgICAgICAgIENVUlMgPSBDVVJTICsgSEkgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTklOU1RBTkNFUyA9IE5JTlNUQU5DRVMgKyAxOwotICAgICAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKChHQkFUWzBdID09IDIpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhciktMSkpIHsKKyAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdDMocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKICAgICB9Ci0gICAgaWYoYlJldGFpbmVkID09IEZBTFNFKSB7Ci0gICAgICAgIGRlbGV0ZSBJQURUOwotICAgICAgICBkZWxldGUgSUFGUzsKLSAgICAgICAgZGVsZXRlIElBRFM7Ci0gICAgICAgIGRlbGV0ZSBJQUlUOwotICAgICAgICBkZWxldGUgSUFSSTsKLSAgICAgICAgZGVsZXRlIElBUkRXOwotICAgICAgICBkZWxldGUgSUFSREg7Ci0gICAgICAgIGRlbGV0ZSBJQVJEWDsKLSAgICAgICAgZGVsZXRlIElBUkRZOwotICAgICAgICBkZWxldGUgSUFJRDsKLSAgICB9Ci0gICAgcmV0dXJuIFNCUkVHOwotZmFpbGVkOgotICAgIGlmKGJSZXRhaW5lZCA9PSBGQUxTRSkgewotICAgICAgICBkZWxldGUgSUFEVDsKLSAgICAgICAgZGVsZXRlIElBRlM7Ci0gICAgICAgIGRlbGV0ZSBJQURTOwotICAgICAgICBkZWxldGUgSUFJVDsKLSAgICAgICAgZGVsZXRlIElBUkk7Ci0gICAgICAgIGRlbGV0ZSBJQVJEVzsKLSAgICAgICAgZGVsZXRlIElBUkRIOwotICAgICAgICBkZWxldGUgSUFSRFg7Ci0gICAgICAgIGRlbGV0ZSBJQVJEWTsKLSAgICAgICAgZGVsZXRlIElBSUQ7Ci0gICAgfQotICAgIGRlbGV0ZSBTQlJFRzsKLSAgICByZXR1cm4gTlVMTDsKKyAgfQogfQotQ0pCaWcyX1N5bWJvbERpY3QgKkNKQmlnMl9TRERQcm9jOjpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwKLSAgICAgICAgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpCi17Ci0gICAgQ0pCaWcyX0ltYWdlICoqU0RORVdTWU1TOwotICAgIEZYX0RXT1JEIEhDSEVJR0hULCBOU1lNU0RFQ09ERUQ7Ci0gICAgaW50MzJfdCBIQ0RIOwotICAgIEZYX0RXT1JEIFNZTVdJRFRILCBUT1RXSURUSDsKLSAgICBpbnQzMl90IERXOwotICAgIENKQmlnMl9JbWFnZSAqQlM7Ci0gICAgRlhfRFdPUkQgSSwgSiwgUkVGQUdHTklOU1Q7Ci0gICAgRlhfQk9PTCAqRVhGTEFHUzsKLSAgICBGWF9EV09SRCBFWElOREVYOwotICAgIEZYX0JPT0wgQ1VSRVhGTEFHOwotICAgIEZYX0RXT1JEIEVYUlVOTEVOR1RIOwotICAgIGludDMyX3QgblZhbDsKLSAgICBGWF9EV09SRCBuVG1wOwotICAgIEZYX0RXT1JEIFNCTlVNU1lNUzsKLSAgICB1aW50OF90IFNCU1lNQ09ERUxFTjsKLSAgICBGWF9EV09SRCBJREk7Ci0gICAgaW50MzJfdCBSRFhJLCBSRFlJOwotICAgIENKQmlnMl9JbWFnZSAqKlNCU1lNUzsKLSAgICBDSkJpZzJfSHVmZm1hblRhYmxlICpTQkhVRkZGUywgKlNCSFVGRkRTLCAqU0JIVUZGRFQsICpTQkhVRkZSRFcsICpTQkhVRkZSREgsICpTQkhVRkZSRFgsICpTQkhVRkZSRFksCi0gICAgICAgICAgICAgICAgICAgICAgICAqU0JIVUZGUlNJWkU7Ci0gICAgQ0pCaWcyX0dSUkRQcm9jICpwR1JSRDsKLSAgICBDSkJpZzJfR1JEUHJvYyAqcEdSRDsKLSAgICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyICpJQURILCAqSUFEVywgKklBQUksICpJQVJEWCwgKklBUkRZLCAqSUFFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpJQURULCAqSUFGUywgKklBRFMsICpJQUlULCAqSUFSSSwgKklBUkRXLCAqSUFSREg7Ci0gICAgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXIgKklBSUQ7Ci0gICAgQ0pCaWcyX1N5bWJvbERpY3QgKnBEaWN0OwotICAgIEpCSUcyX0FMTE9DKElBREgsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7Ci0gICAgSkJJRzJfQUxMT0MoSUFEVywgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKLSAgICBKQklHMl9BTExPQyhJQUFJLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgIEpCSUcyX0FMTE9DKElBUkRYLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgIEpCSUcyX0FMTE9DKElBUkRZLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgIEpCSUcyX0FMTE9DKElBRVgsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgQ0pCaWcyX0ltYWdlKiBHQlJFRzsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBHQlJFRy0+ZmlsbCgwKTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4OWIyNV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMik7CisgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpIDw8IDE7CisgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDI7CisgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgzLCBoIC0gMSk7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMiwgaCAtIDEpIDw8IDE7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDI7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDM7CisgICAgICBsaW5lMyA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDT05URVhUID0gbGluZTM7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA0OworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgMTE7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYlZhbCkgeworICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAyKSkgJiAweDFmOworICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDQsIGggLSAxKSkgJiAweDdmOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MGY7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBHQlJFRzsKK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MigKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgQ0pCaWcyX0ltYWdlKiBHQlJFRzsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOworICB1aW50OF90ICpwTGluZSwgY1ZhbDsKKyAgaW50cHRyX3QgblN0cmlkZSwgblN0cmlkZTI7CisgIGludDMyX3QgbkJpdHMsIGs7CisgIExUUCA9IDA7CisgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKKyAgaWYgKEdCUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKKyAgICBkZWxldGUgR0JSRUc7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gIgorICAgICAgICAiJWQsIGhlaWdodCA9ICVkXG4iLAorICAgICAgICBHQlcsIEdCSCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKKyAgblN0cmlkZSA9IEdCUkVHLT5tX25TdHJpZGU7CisgIG5TdHJpZGUyID0gblN0cmlkZSA8PCAxOworICBmb3IgKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHg5YjI1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUxID0gKGggPiAxKSA/IHBMaW5lWy1uU3RyaWRlMl0gPDwgNiA6IDA7CisgICAgICBsaW5lMiA9IChoID4gMCkgPyBwTGluZVstblN0cmlkZV0gOiAwOworICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4ZjgwMCkgfCAobGluZTIgJiAweDA3ZjApOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdyArPSA4KSB7CisgICAgICAgIGlmICh3ICsgOCA8IEdCVykgeworICAgICAgICAgIG5CaXRzID0gODsKKyAgICAgICAgICBpZiAoaCA+IDEpIHsKKyAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKHBMaW5lWy1uU3RyaWRlMiArICh3ID4+IDMpICsgMV0gPDwgNik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChoID4gMCkgeworICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAocExpbmVbLW5TdHJpZGUgKyAodyA+PiAzKSArIDFdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbkJpdHMgPSBHQlcgLSB3OworICAgICAgICAgIGlmIChoID4gMSkgeworICAgICAgICAgICAgbGluZTEgPDw9IDg7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChoID4gMCkgeworICAgICAgICAgICAgbGluZTIgPDw9IDg7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHM7IGsrKykgeworICAgICAgICAgIGlmIChVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7CisgICAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDgwMCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUyID4+ICg3IC0gaykpICYgMHgwMDEwKTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKKyAgICAgIH0KKyAgICB9CisgICAgcExpbmUgKz0gblN0cmlkZTsKKyAgfQorICByZXR1cm4gR0JSRUc7Cit9CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpIHsKKyAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIENKQmlnMl9JbWFnZSogR0JSRUc7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKKyAgdWludDhfdCAqcExpbmUsICpwTGluZTEsICpwTGluZTIsIGNWYWw7CisgIGludDMyX3QgblN0cmlkZSwgblN0cmlkZTIsIGs7CisgIGludDMyX3QgbkxpbmVCeXRlcywgbkJpdHNMZWZ0LCBjYzsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBpZiAoR0JSRUctPm1fcERhdGEgPT0gTlVMTCkgeworICAgIGRlbGV0ZSBHQlJFRzsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAiCisgICAgICAgICIlZCwgaGVpZ2h0ID0gJWRcbiIsCisgICAgICAgIEdCVywgR0JIKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwTGluZSA9IEdCUkVHLT5tX3BEYXRhOworICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKKyAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7CisgIG5MaW5lQnl0ZXMgPSAoKEdCVyArIDcpID4+IDMpIC0gMTsKKyAgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7CisgIEZYX0RXT1JEIGhlaWdodCA9IEdCSCAmIDB4N2ZmZmZmZmY7CisgIGZvciAoRlhfRFdPUkQgaCA9IDA7IGggPCBoZWlnaHQ7IGgrKykgeworICAgIGlmIChUUEdET04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDliMjVdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGlmIChMVFAgPT0gMSkgeworICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGggPiAxKSB7CisgICAgICAgIHBMaW5lMSA9IHBMaW5lIC0gblN0cmlkZTI7CisgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKKyAgICAgICAgbGluZTEgPSAoKnBMaW5lMSsrKSA8PCA2OworICAgICAgICBsaW5lMiA9ICpwTGluZTIrKzsKKyAgICAgICAgQ09OVEVYVCA9ICgobGluZTEgJiAweGY4MDApIHwgKGxpbmUyICYgMHgwN2YwKSk7CisgICAgICAgIGZvciAoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKKyAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8ICgoKnBMaW5lMSsrKSA8PCA2KTsKKyAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOworICAgICAgICAgIGNWYWwgPSAwOworICAgICAgICAgIGZvciAoayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CisgICAgICAgICAgICBDT05URVhUID0gKCgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiBrKSAmIDB4MDgwMCkgfCAoKGxpbmUyID4+IGspICYgMHgwMDEwKSk7CisgICAgICAgICAgfQorICAgICAgICAgIHBMaW5lW2NjXSA9IGNWYWw7CisgICAgICAgIH0KKyAgICAgICAgbGluZTEgPDw9IDg7CisgICAgICAgIGxpbmUyIDw8PSA4OworICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0KKyAgICAgICAgICAgICAgKCgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDA4MDApIHwgKChsaW5lMiA+PiAoNyAtIGspKSAmIDB4MDAxMCkpOworICAgICAgICB9CisgICAgICAgIHBMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKKyAgICAgICAgbGluZTIgPSAoaCAmIDEpID8gKCpwTGluZTIrKykgOiAwOworICAgICAgICBDT05URVhUID0gKGxpbmUyICYgMHgwN2YwKTsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGlmIChoICYgMSkgeworICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPQorICAgICAgICAgICAgICAgICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbCB8ICgobGluZTIgPj4gaykgJiAweDAwMTApKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBsaW5lMiA8PD0gODsKKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9ICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAoKChsaW5lMiA+PiAoNyAtIGspKSkgJiAweDAwMTApKTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7CisgICAgICB9CisgICAgfQorICAgIHBMaW5lICs9IG5TdHJpZGU7CisgIH0KKyAgcmV0dXJuIEdCUkVHOworfQorQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgQ0pCaWcyX0ltYWdlKiBHQlJFRzsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBHQlJFRy0+ZmlsbCgwKTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4OWIyNV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMik7CisgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDE7CisgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSk7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDE7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDI7CisgICAgICBsaW5lMyA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDT05URVhUID0gbGluZTM7CisgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCA0OworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNTsKKyAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFsyXSwgaCArIEdCQVRbM10pIDw8IDEwOworICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBoICsgR0JBVFs1XSkgPDwgMTE7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCAxMjsKKyAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFs2XSwgaCArIEdCQVRbN10pIDw8IDE1OworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7CisgICAgICAgIH0KKyAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMikpICYgMHgwNzsKKyAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBoIC0gMSkpICYgMHgxZjsKKyAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDBmOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gR0JSRUc7Cit9CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgQ0pCaWcyX0ltYWdlKiBHQlJFRzsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBHQlJFRy0+ZmlsbCgwKTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDc5NV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMik7CisgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpIDw8IDE7CisgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDI7CisgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgzLCBoIC0gMSk7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMiwgaCAtIDEpIDw8IDE7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDI7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDM7CisgICAgICBsaW5lMyA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDT05URVhUID0gbGluZTM7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCAzOworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgOTsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICB9CisgICAgICAgIGlmIChiVmFsKSB7CisgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOworICAgICAgICB9CisgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMywgaCAtIDIpKSAmIDB4MGY7CisgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgNCwgaCAtIDEpKSAmIDB4M2Y7CisgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwNzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEdCUkVHOworfQorQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQyKAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KSB7CisgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBDSkJpZzJfSW1hZ2UqIEdCUkVHOworICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CisgIHVpbnQ4X3QgKnBMaW5lLCBjVmFsOworICBpbnRwdHJfdCBuU3RyaWRlLCBuU3RyaWRlMjsKKyAgaW50MzJfdCBuQml0cywgazsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBpZiAoR0JSRUctPm1fcERhdGEgPT0gTlVMTCkgeworICAgIGRlbGV0ZSBHQlJFRzsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAiCisgICAgICAgICIlZCwgaGVpZ2h0ID0gJWRcbiIsCisgICAgICAgIEdCVywgR0JIKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwTGluZSA9IEdCUkVHLT5tX3BEYXRhOworICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKKyAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7CisgIGZvciAoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgeworICAgIGlmIChUUEdET04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDA3OTVdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGlmIChMVFAgPT0gMSkgeworICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgbGluZTEgPSAoaCA+IDEpID8gcExpbmVbLW5TdHJpZGUyXSA8PCA0IDogMDsKKyAgICAgIGxpbmUyID0gKGggPiAwKSA/IHBMaW5lWy1uU3RyaWRlXSA6IDA7CisgICAgICBDT05URVhUID0gKGxpbmUxICYgMHgxZTAwKSB8ICgobGluZTIgPj4gMSkgJiAweDAxZjgpOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdyArPSA4KSB7CisgICAgICAgIGlmICh3ICsgOCA8IEdCVykgeworICAgICAgICAgIG5CaXRzID0gODsKKyAgICAgICAgICBpZiAoaCA+IDEpIHsKKyAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKHBMaW5lWy1uU3RyaWRlMiArICh3ID4+IDMpICsgMV0gPDwgNCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChoID4gMCkgeworICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAocExpbmVbLW5TdHJpZGUgKyAodyA+PiAzKSArIDFdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbkJpdHMgPSBHQlcgLSB3OworICAgICAgICAgIGlmIChoID4gMSkgeworICAgICAgICAgICAgbGluZTEgPDw9IDg7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChoID4gMCkgeworICAgICAgICAgICAgbGluZTIgPDw9IDg7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHM7IGsrKykgeworICAgICAgICAgIGlmIChVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7CisgICAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDIwMCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUyID4+ICg4IC0gaykpICYgMHgwMDA4KTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKKyAgICAgIH0KKyAgICB9CisgICAgcExpbmUgKz0gblN0cmlkZTsKKyAgfQorICByZXR1cm4gR0JSRUc7Cit9CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpIHsKKyAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIENKQmlnMl9JbWFnZSogR0JSRUc7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKKyAgdWludDhfdCAqcExpbmUsICpwTGluZTEsICpwTGluZTIsIGNWYWw7CisgIGludDMyX3QgblN0cmlkZSwgblN0cmlkZTIsIGs7CisgIGludDMyX3QgbkxpbmVCeXRlcywgbkJpdHNMZWZ0LCBjYzsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBpZiAoR0JSRUctPm1fcERhdGEgPT0gTlVMTCkgeworICAgIGRlbGV0ZSBHQlJFRzsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAiCisgICAgICAgICIlZCwgaGVpZ2h0ID0gJWRcbiIsCisgICAgICAgIEdCVywgR0JIKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwTGluZSA9IEdCUkVHLT5tX3BEYXRhOworICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKKyAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7CisgIG5MaW5lQnl0ZXMgPSAoKEdCVyArIDcpID4+IDMpIC0gMTsKKyAgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7CisgIGZvciAoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgeworICAgIGlmIChUUEdET04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDA3OTVdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGlmIChMVFAgPT0gMSkgeworICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGggPiAxKSB7CisgICAgICAgIHBMaW5lMSA9IHBMaW5lIC0gblN0cmlkZTI7CisgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKKyAgICAgICAgbGluZTEgPSAoKnBMaW5lMSsrKSA8PCA0OworICAgICAgICBsaW5lMiA9ICpwTGluZTIrKzsKKyAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MWUwMCkgfCAoKGxpbmUyID4+IDEpICYgMHgwMWY4KTsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDQpOworICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiBrKSAmIDB4MDIwMCkgfCAoKGxpbmUyID4+IChrICsgMSkpICYgMHgwMDA4KTsKKyAgICAgICAgICB9CisgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA8PD0gODsKKyAgICAgICAgbGluZTIgPDw9IDg7CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAyMDApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMiA+PiAoOCAtIGspKSAmIDB4MDAwOCk7CisgICAgICAgIH0KKyAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcExpbmUyID0gcExpbmUgLSBuU3RyaWRlOworICAgICAgICBsaW5lMiA9IChoICYgMSkgPyAoKnBMaW5lMisrKSA6IDA7CisgICAgICAgIENPTlRFWFQgPSAobGluZTIgPj4gMSkgJiAweDAxZjg7CisgICAgICAgIGZvciAoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKKyAgICAgICAgICBpZiAoaCAmIDEpIHsKKyAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgfQorICAgICAgICAgIGNWYWwgPSAwOworICAgICAgICAgIGZvciAoayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CisgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwgfAorICAgICAgICAgICAgICAgICAgICAgICgobGluZTIgPj4gKGsgKyAxKSkgJiAweDAwMDgpOworICAgICAgICAgIH0KKyAgICAgICAgICBwTGluZVtjY10gPSBjVmFsOworICAgICAgICB9CisgICAgICAgIGxpbmUyIDw8PSA4OworICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0KKyAgICAgICAgICAgICAgKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwgfCAoKGxpbmUyID4+ICg4IC0gaykpICYgMHgwMDA4KTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7CisgICAgICB9CisgICAgfQorICAgIHBMaW5lICs9IG5TdHJpZGU7CisgIH0KKyAgcmV0dXJuIEdCUkVHOworfQorQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgQ0pCaWcyX0ltYWdlKiBHQlJFRzsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBHQlJFRy0+ZmlsbCgwKTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDc5NV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMik7CisgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpIDw8IDE7CisgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDI7CisgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSk7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDE7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDI7CisgICAgICBsaW5lMyA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDT05URVhUID0gbGluZTM7CisgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCAzOworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNDsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDk7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYlZhbCkgeworICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAyKSkgJiAweDBmOworICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAxKSkgJiAweDFmOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDc7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBHQlJFRzsKK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0KAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KSB7CisgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBDSkJpZzJfSW1hZ2UqIEdCUkVHOworICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOworICBMVFAgPSAwOworICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIEdCUkVHLT5maWxsKDApOworICBmb3IgKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMGU1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAyKTsKKyAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMikgPDwgMTsKKyAgICAgIGxpbmUyID0gR0JSRUctPmdldFBpeGVsKDIsIGggLSAxKTsKKyAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSkgPDwgMTsKKyAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMjsKKyAgICAgIGxpbmUzID0gMDsKKyAgICAgIGZvciAoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgeworICAgICAgICBpZiAoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgeworICAgICAgICAgIGJWYWwgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDI7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7CisgICAgICAgIH0KKyAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMikpICYgMHgwNzsKKyAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBoIC0gMSkpICYgMHgxZjsKKyAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDAzOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gR0JSRUc7Cit9CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDIoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpIHsKKyAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIENKQmlnMl9JbWFnZSogR0JSRUc7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKKyAgdWludDhfdCAqcExpbmUsIGNWYWw7CisgIGludHB0cl90IG5TdHJpZGUsIG5TdHJpZGUyOworICBpbnQzMl90IG5CaXRzLCBrOworICBMVFAgPSAwOworICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIGlmIChHQlJFRy0+bV9wRGF0YSA9PSBOVUxMKSB7CisgICAgZGVsZXRlIEdCUkVHOworICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICIKKyAgICAgICAgIiVkLCBoZWlnaHQgPSAlZFxuIiwKKyAgICAgICAgR0JXLCBHQkgpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHBMaW5lID0gR0JSRUctPm1fcERhdGE7CisgIG5TdHJpZGUgPSBHQlJFRy0+bV9uU3RyaWRlOworICBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDBlNV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IChoID4gMSkgPyBwTGluZVstblN0cmlkZTJdIDw8IDEgOiAwOworICAgICAgbGluZTIgPSAoaCA+IDApID8gcExpbmVbLW5TdHJpZGVdIDogMDsKKyAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDAzODApIHwgKChsaW5lMiA+PiAzKSAmIDB4MDA3Yyk7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3ICs9IDgpIHsKKyAgICAgICAgaWYgKHcgKyA4IDwgR0JXKSB7CisgICAgICAgICAgbkJpdHMgPSA4OworICAgICAgICAgIGlmIChoID4gMSkgeworICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAocExpbmVbLW5TdHJpZGUyICsgKHcgPj4gMykgKyAxXSA8PCAxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGggPiAwKSB7CisgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8IChwTGluZVstblN0cmlkZSArICh3ID4+IDMpICsgMV0pOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuQml0cyA9IEdCVyAtIHc7CisgICAgICAgICAgaWYgKGggPiAxKSB7CisgICAgICAgICAgICBsaW5lMSA8PD0gODsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGggPiAwKSB7CisgICAgICAgICAgICBsaW5lMiA8PD0gODsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0czsgaysrKSB7CisgICAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICAgIGJWYWwgPSAwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIH0KKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwMDgwKSB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTIgPj4gKDEwIC0gaykpICYgMHgwMDA0KTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKKyAgICAgIH0KKyAgICB9CisgICAgcExpbmUgKz0gblN0cmlkZTsKKyAgfQorICByZXR1cm4gR0JSRUc7Cit9CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpIHsKKyAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIENKQmlnMl9JbWFnZSogR0JSRUc7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKKyAgdWludDhfdCAqcExpbmUsICpwTGluZTEsICpwTGluZTIsIGNWYWw7CisgIGludDMyX3QgblN0cmlkZSwgblN0cmlkZTIsIGs7CisgIGludDMyX3QgbkxpbmVCeXRlcywgbkJpdHNMZWZ0LCBjYzsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBpZiAoR0JSRUctPm1fcERhdGEgPT0gTlVMTCkgeworICAgIGRlbGV0ZSBHQlJFRzsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAiCisgICAgICAgICIlZCwgaGVpZ2h0ID0gJWRcbiIsCisgICAgICAgIEdCVywgR0JIKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwTGluZSA9IEdCUkVHLT5tX3BEYXRhOworICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKKyAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7CisgIG5MaW5lQnl0ZXMgPSAoKEdCVyArIDcpID4+IDMpIC0gMTsKKyAgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7CisgIGZvciAoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgeworICAgIGlmIChUUEdET04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAwZTVdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGlmIChMVFAgPT0gMSkgeworICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGggPiAxKSB7CisgICAgICAgIHBMaW5lMSA9IHBMaW5lIC0gblN0cmlkZTI7CisgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKKyAgICAgICAgbGluZTEgPSAoKnBMaW5lMSsrKSA8PCAxOworICAgICAgICBsaW5lMiA9ICpwTGluZTIrKzsKKyAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MDM4MCkgfCAoKGxpbmUyID4+IDMpICYgMHgwMDdjKTsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDEpOworICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiBrKSAmIDB4MDA4MCkgfCAoKGxpbmUyID4+IChrICsgMykpICYgMHgwMDA0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA8PD0gODsKKyAgICAgICAgbGluZTIgPDw9IDg7CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAwODApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMiA+PiAoMTAgLSBrKSkgJiAweDAwMDQpOworICAgICAgICB9CisgICAgICAgIHBMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKKyAgICAgICAgbGluZTIgPSAoaCAmIDEpID8gKCpwTGluZTIrKykgOiAwOworICAgICAgICBDT05URVhUID0gKGxpbmUyID4+IDMpICYgMHgwMDdjOworICAgICAgICBmb3IgKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7CisgICAgICAgICAgaWYgKGggJiAxKSB7CisgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOworICAgICAgICAgIH0KKyAgICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgICBmb3IgKGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOworICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUyID4+IChrICsgMykpICYgMHgwMDA0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBsaW5lMiA8PD0gODsKKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgKCgobGluZTIgPj4gKDEwIC0gaykpKSAmIDB4MDAwNCk7CisgICAgICAgIH0KKyAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOworICAgICAgfQorICAgIH0KKyAgICBwTGluZSArPSBuU3RyaWRlOworICB9CisgIHJldHVybiBHQlJFRzsKK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpIHsKKyAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIENKQmlnMl9JbWFnZSogR0JSRUc7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CisgIExUUCA9IDA7CisgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKKyAgR0JSRUctPmZpbGwoMCk7CisgIGZvciAoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgeworICAgIGlmIChUUEdET04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAwZTVdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGlmIChMVFAgPT0gMSkgeworICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpOworICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAyKSA8PCAxOworICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOworICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOworICAgICAgbGluZTMgPSAwOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7CisgICAgICAgIGlmIChVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7CisgICAgICAgICAgYlZhbCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOworICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMjsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDM7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7CisgICAgICAgIH0KKyAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMikpICYgMHgwNzsKKyAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgwZjsKKyAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDAzOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gR0JSRUc7Cit9CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgQ0pCaWcyX0ltYWdlKiBHQlJFRzsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOworICBMVFAgPSAwOworICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIEdCUkVHLT5maWxsKDApOworICBmb3IgKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMTk1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDIsIGggLSAxKTsKKyAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSkgPDwgMTsKKyAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMjsKKyAgICAgIGxpbmUyID0gMDsKKyAgICAgIGZvciAoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgeworICAgICAgICBpZiAoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgeworICAgICAgICAgIGJWYWwgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENPTlRFWFQgPSBsaW5lMjsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDQ7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYlZhbCkgeworICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAxKSkgJiAweDNmOworICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBiVmFsKSAmIDB4MGY7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBHQlJFRzsKK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MigKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgQ0pCaWcyX0ltYWdlKiBHQlJFRzsKKyAgRlhfRFdPUkQgbGluZTE7CisgIHVpbnQ4X3QgKnBMaW5lLCBjVmFsOworICBpbnRwdHJfdCBuU3RyaWRlOworICBpbnQzMl90IG5CaXRzLCBrOworICBMVFAgPSAwOworICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIGlmIChHQlJFRy0+bV9wRGF0YSA9PSBOVUxMKSB7CisgICAgZGVsZXRlIEdCUkVHOworICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICIKKyAgICAgICAgIiVkLCBoZWlnaHQgPSAlZFxuIiwKKyAgICAgICAgR0JXLCBHQkgpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHBMaW5lID0gR0JSRUctPm1fcERhdGE7CisgIG5TdHJpZGUgPSBHQlJFRy0+bV9uU3RyaWRlOworICBmb3IgKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMTk1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUxID0gKGggPiAwKSA/IHBMaW5lWy1uU3RyaWRlXSA6IDA7CisgICAgICBDT05URVhUID0gKGxpbmUxID4+IDEpICYgMHgwM2YwOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdyArPSA4KSB7CisgICAgICAgIGlmICh3ICsgOCA8IEdCVykgeworICAgICAgICAgIG5CaXRzID0gODsKKyAgICAgICAgICBpZiAoaCA+IDApIHsKKyAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKHBMaW5lWy1uU3RyaWRlICsgKHcgPj4gMykgKyAxXSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5CaXRzID0gR0JXIC0gdzsKKyAgICAgICAgICBpZiAoaCA+IDApIHsKKyAgICAgICAgICAgIGxpbmUxIDw8PSA4OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzOyBrKyspIHsKKyAgICAgICAgICBpZiAoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgeworICAgICAgICAgICAgYlZhbCA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgfQorICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPQorICAgICAgICAgICAgICAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbCB8ICgobGluZTEgPj4gKDggLSBrKSkgJiAweDAwMTApOworICAgICAgICB9CisgICAgICAgIHBMaW5lW3cgPj4gM10gPSBjVmFsOworICAgICAgfQorICAgIH0KKyAgICBwTGluZSArPSBuU3RyaWRlOworICB9CisgIHJldHVybiBHQlJFRzsKK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MygKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgQ0pCaWcyX0ltYWdlKiBHQlJFRzsKKyAgRlhfRFdPUkQgbGluZTE7CisgIHVpbnQ4X3QgKnBMaW5lLCAqcExpbmUxLCBjVmFsOworICBpbnQzMl90IG5TdHJpZGUsIGs7CisgIGludDMyX3QgbkxpbmVCeXRlcywgbkJpdHNMZWZ0LCBjYzsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBpZiAoR0JSRUctPm1fcERhdGEgPT0gTlVMTCkgeworICAgIGRlbGV0ZSBHQlJFRzsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAiCisgICAgICAgICIlZCwgaGVpZ2h0ID0gJWRcbiIsCisgICAgICAgIEdCVywgR0JIKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwTGluZSA9IEdCUkVHLT5tX3BEYXRhOworICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKKyAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOworICBuQml0c0xlZnQgPSBHQlcgLSAobkxpbmVCeXRlcyA8PCAzKTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaCA+IDApIHsKKyAgICAgICAgcExpbmUxID0gcExpbmUgLSBuU3RyaWRlOworICAgICAgICBsaW5lMSA9ICpwTGluZTErKzsKKyAgICAgICAgQ09OVEVYVCA9IChsaW5lMSA+PiAxKSAmIDB4MDNmMDsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCpwTGluZTErKyk7CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoayArIDEpKSAmIDB4MDAxMCk7CisgICAgICAgICAgfQorICAgICAgICAgIHBMaW5lW2NjXSA9IGNWYWw7CisgICAgICAgIH0KKyAgICAgICAgbGluZTEgPDw9IDg7CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPQorICAgICAgICAgICAgICAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbCB8ICgobGluZTEgPj4gKDggLSBrKSkgJiAweDAwMTApOworICAgICAgICB9CisgICAgICAgIHBMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENPTlRFWFQgPSAwOworICAgICAgICBmb3IgKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbDsKKyAgICAgICAgICB9CisgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWY3KSA8PCAxKSB8IGJWYWw7CisgICAgICAgIH0KKyAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOworICAgICAgfQorICAgIH0KKyAgICBwTGluZSArPSBuU3RyaWRlOworICB9CisgIHJldHVybiBHQlJFRzsKK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpIHsKKyAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIENKQmlnMl9JbWFnZSogR0JSRUc7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBHQlJFRy0+ZmlsbCgwKTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7CisgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7CisgICAgICBsaW5lMiA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDT05URVhUID0gbGluZTI7CisgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCA0OworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgNTsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICB9CisgICAgICAgIGlmIChiVmFsKSB7CisgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOworICAgICAgICB9CisgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDEpKSAmIDB4MWY7CisgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwZjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEdCUkVHOworfQorQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1YyKAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KSB7CisgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBDSkJpZzJfSW1hZ2UqIEdCUkVHOworICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOworICBMVFAgPSAwOworICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIEdCUkVHLT5maWxsKDApOworICBmb3IgKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBzd2l0Y2ggKEdCVEVNUExBVEUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIENPTlRFWFQgPSAweDliMjU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBDT05URVhUID0gMHgwNzk1OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgQ09OVEVYVCA9IDB4MDBlNTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIENPTlRFWFQgPSAweDAxOTU7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKEdCVEVNUExBVEUpIHsKKyAgICAgICAgY2FzZSAwOiB7CisgICAgICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpOworICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMikgPDwgMTsKKyAgICAgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSk7CisgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKSA8PCAxOworICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMjsKKyAgICAgICAgICBsaW5lMyA9IDA7CisgICAgICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7CisgICAgICAgICAgICBpZiAoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgeworICAgICAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCA0OworICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDU7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzJdLCBoICsgR0JBVFszXSkgPDwgMTA7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBoICsgR0JBVFs1XSkgPDwgMTE7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgMTI7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzZdLCBoICsgR0JBVFs3XSkgPDwgMTU7CisgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYlZhbCkgeworICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAyKSkgJiAweDA3OworICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBoIC0gMSkpICYgMHgxZjsKKyAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwZjsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgMTogeworICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDIsIGggLSAyKTsKKyAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpIDw8IDE7CisgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAyKSA8PCAyOworICAgICAgICAgIGxpbmUyID0gR0JSRUctPmdldFBpeGVsKDIsIGggLSAxKTsKKyAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDE7CisgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAyOworICAgICAgICAgIGxpbmUzID0gMDsKKyAgICAgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgICAgIGlmIChVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7CisgICAgICAgICAgICAgIGJWYWwgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDM7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNDsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA5OworICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBoIC0gMikpICYgMHgwZjsKKyAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMywgaCAtIDEpKSAmIDB4MWY7CisgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDc7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMik7CisgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAyKSA8PCAxOworICAgICAgICAgIGxpbmUyID0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKTsKKyAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7CisgICAgICAgICAgbGluZTMgPSAwOworICAgICAgICAgIGZvciAoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgeworICAgICAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICAgICAgYlZhbCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMjsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCAzOworICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDc7CisgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYlZhbCkgeworICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAyKSkgJiAweDA3OworICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgwZjsKKyAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwMzsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgMzogeworICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKTsKKyAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7CisgICAgICAgICAgbGluZTIgPSAwOworICAgICAgICAgIGZvciAoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgeworICAgICAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICAgICAgYlZhbCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBDT05URVhUID0gbGluZTI7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgNDsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA1OworICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgxZjsKKyAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwZjsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBHQlJFRzsKK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9WMSgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVCA9IDA7CisgIENKQmlnMl9JbWFnZSogR0JSRUc7CisgIExUUCA9IDA7CisgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKKyAgR0JSRUctPmZpbGwoMCk7CisgIGZvciAoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgeworICAgIGlmIChUUEdET04pIHsKKyAgICAgIHN3aXRjaCAoR0JURU1QTEFURSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgQ09OVEVYVCA9IDB4OWIyNTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIENPTlRFWFQgPSAweDA3OTU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBDT05URVhUID0gMHgwMGU1OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgQ09OVEVYVCA9IDB4MDE5NTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIGZvciAoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgeworICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgR0JSRUctPmdldFBpeGVsKHcsIGggLSAxKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgeworICAgICAgICBpZiAoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgeworICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDT05URVhUID0gMDsKKyAgICAgICAgICBzd2l0Y2ggKEdCVEVNUExBVEUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGgpOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCkgPDwgMTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDMsIGgpIDw8IDI7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSA0LCBoKSA8PCAzOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDQ7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkgPDwgNTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSA8PCA2OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBoIC0gMSkgPDwgNzsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGggLSAxKSA8PCA4OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCAtIDEpIDw8IDk7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzJdLCBoICsgR0JBVFszXSkgPDwgMTA7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBoICsgR0JBVFs1XSkgPDwgMTE7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBoIC0gMikgPDwgMTI7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIGggLSAyKSA8PCAxMzsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGggLSAyKSA8PCAxNDsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbNl0sIGggKyBHQkFUWzddKSA8PCAxNTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBoKTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDIsIGgpIDw8IDE7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAzLCBoKSA8PCAyOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDM7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkgPDwgNDsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSA8PCA1OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBoIC0gMSkgPDwgNjsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGggLSAxKSA8PCA3OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCAtIDEpIDw8IDg7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMikgPDwgOTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAyKSA8PCAxMDsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgaCAtIDIpIDw8IDExOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDIpIDw8IDEyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGgpOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCkgPDwgMTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCAyOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDEpIDw8IDM7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIGggLSAxKSA8PCA0OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpIDw8IDU7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBoIC0gMSkgPDwgNjsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAyKSA8PCA3OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBoIC0gMikgPDwgODsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGggLSAyKSA8PCA5OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGgpOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCkgPDwgMTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDMsIGgpIDw8IDI7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSA0LCBoKSA8PCAzOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDQ7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkgPDwgNTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgaCAtIDEpIDw8IDY7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBoIC0gMSkgPDwgNzsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDIsIGggLSAxKSA8PCA4OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMywgaCAtIDEpIDw8IDk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gR0JSRUc7Cit9CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0pIHsKKyAgaW50IGJpdHBvcywgaTsKKyAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2U7CisgIEpCSUcyX0FMTE9DKHBJbWFnZSwgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIGlmIChwSW1hZ2UtPm1fcERhdGEgPT0gTlVMTCkgeworICAgIGRlbGV0ZSBwSW1hZ2U7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gIgorICAgICAgICAiJWQsIGhlaWdodCA9ICVkXG4iLAorICAgICAgICBHQlcsIEdCSCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYml0cG9zID0gKGludClwU3RyZWFtLT5nZXRCaXRQb3MoKTsKKyAgX0ZheEc0RGVjb2RlKG1fcE1vZHVsZSwgcFN0cmVhbS0+Z2V0QnVmKCksIHBTdHJlYW0tPmdldExlbmd0aCgpLCAmYml0cG9zLAorICAgICAgICAgICAgICAgcEltYWdlLT5tX3BEYXRhLCBHQlcsIEdCSCwgcEltYWdlLT5tX25TdHJpZGUpOworICBwU3RyZWFtLT5zZXRCaXRQb3MoYml0cG9zKTsKKyAgZm9yIChpID0gMDsgKEZYX0RXT1JEKWkgPCBwSW1hZ2UtPm1fblN0cmlkZSAqIEdCSDsgaSsrKSB7CisgICAgcEltYWdlLT5tX3BEYXRhW2ldID0gfnBJbWFnZS0+bV9wRGF0YVtpXTsKKyAgfQorICByZXR1cm4gcEltYWdlOworfQorQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JSRFByb2M6OmRlY29kZShDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpIHsKKyAgaWYgKEdSVyA9PSAwIHx8IEdSSCA9PSAwKSB7CisgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2U7CisgICAgSkJJRzJfQUxMT0MocEltYWdlLCBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKKyAgICByZXR1cm4gcEltYWdlOworICB9CisgIGlmIChHUlRFTVBMQVRFID09IDApIHsKKyAgICBpZiAoKEdSQVRbMF0gPT0gKHNpZ25lZCBjaGFyKS0xKSAmJiAoR1JBVFsxXSA9PSAoc2lnbmVkIGNoYXIpLTEpICYmCisgICAgICAgIChHUkFUWzJdID09IChzaWduZWQgY2hhciktMSkgJiYgKEdSQVRbM10gPT0gKHNpZ25lZCBjaGFyKS0xKSAmJgorICAgICAgICAoR1JSRUZFUkVOQ0VEWCA9PSAwKSAmJiAoR1JXID09IChGWF9EV09SRClHUlJFRkVSRU5DRS0+bV9uV2lkdGgpKSB7CisgICAgICByZXR1cm4gZGVjb2RlX1RlbXBsYXRlMF9vcHQocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGRlY29kZV9UZW1wbGF0ZTBfdW5vcHQocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKChHUlJFRkVSRU5DRURYID09IDApICYmIChHUlcgPT0gKEZYX0RXT1JEKUdSUkVGRVJFTkNFLT5tX25XaWR0aCkpIHsKKyAgICAgIHJldHVybiBkZWNvZGVfVGVtcGxhdGUxX29wdChwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZGVjb2RlX1RlbXBsYXRlMV91bm9wdChwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOworICAgIH0KKyAgfQorfQorQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTBfdW5vcHQoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpIHsKKyAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIENKQmlnMl9JbWFnZSogR1JSRUc7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTMsIGxpbmU0LCBsaW5lNTsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR1JSRUcsIENKQmlnMl9JbWFnZShHUlcsIEdSSCkpOworICBHUlJFRy0+ZmlsbCgwKTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdSSDsgaCsrKSB7CisgICAgaWYgKFRQR1JPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0WzB4MDAxMF0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAwKSB7CisgICAgICBsaW5lMSA9IEdSUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7CisgICAgICBsaW5lMSB8PSBHUlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7CisgICAgICBsaW5lMiA9IDA7CisgICAgICBsaW5lMyA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZIC0gMSk7CisgICAgICBsaW5lMyB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkKKyAgICAgICAgICAgICAgIDw8IDE7CisgICAgICBsaW5lNCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKTsKKyAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDE7CisgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkKKyAgICAgICAgICAgICAgIDw8IDI7CisgICAgICBsaW5lNSA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSk7CisgICAgICBsaW5lNSB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZICsgMSkKKyAgICAgICAgICAgICAgIDw8IDE7CisgICAgICBsaW5lNSB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpCisgICAgICAgICAgICAgICA8PCAyOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdSVzsgdysrKSB7CisgICAgICAgIENPTlRFWFQgPSBsaW5lNTsKKyAgICAgICAgQ09OVEVYVCB8PSBsaW5lNCA8PCAzOworICAgICAgICBDT05URVhUIHw9IGxpbmUzIDw8IDY7CisgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgR1JBVFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgKyBHUkFUWzNdKQorICAgICAgICAgICAgICAgICAgIDw8IDg7CisgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgOTsKKyAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCAxMDsKKyAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyArIEdSQVRbMF0sIGggKyBHUkFUWzFdKSA8PCAxMjsKKyAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOworICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHUlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDAzOworICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBiVmFsKSAmIDB4MDE7CisgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8CisgICAgICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpKSAmCisgICAgICAgICAgICAgICAgMHgwMzsKKyAgICAgICAgbGluZTQgPQorICAgICAgICAgICAgKChsaW5lNCA8PCAxKSB8CisgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwgaCAtIEdSUkVGRVJFTkNFRFkpKSAmCisgICAgICAgICAgICAweDA3OworICAgICAgICBsaW5lNSA9ICgobGluZTUgPDwgMSkgfAorICAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSkgJgorICAgICAgICAgICAgICAgIDB4MDc7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUxID0gR1JSRUctPmdldFBpeGVsKDEsIGggLSAxKTsKKyAgICAgIGxpbmUxIHw9IEdSUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMTsKKyAgICAgIGxpbmUyID0gMDsKKyAgICAgIGxpbmUzID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKTsKKyAgICAgIGxpbmUzIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKQorICAgICAgICAgICAgICAgPDwgMTsKKyAgICAgIGxpbmU0ID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkpOworICAgICAgbGluZTQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgMTsKKyAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCAtIDEsIGggLSBHUlJFRkVSRU5DRURZKQorICAgICAgICAgICAgICAgPDwgMjsKKyAgICAgIGxpbmU1ID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKTsKKyAgICAgIGxpbmU1IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKQorICAgICAgICAgICAgICAgPDwgMTsKKyAgICAgIGxpbmU1IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCAtIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSkKKyAgICAgICAgICAgICAgIDw8IDI7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR1JXOyB3KyspIHsKKyAgICAgICAgYlZhbCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoKTsKKyAgICAgICAgaWYgKCEoVFBHUk9OICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpKSAmJgorICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodywgaCAtIDEpKSAmJgorICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSAxLCBoKSkgJiYKKyAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyAxLCBoKSkgJiYKKyAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSAxLCBoICsgMSkpICYmCisgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoICsgMSkpICYmCisgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCArIDEpKSkpIHsKKyAgICAgICAgICBDT05URVhUID0gbGluZTU7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lNCA8PCAzOworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTMgPDwgNjsKKyAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIEdSQVRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgKyBHUkFUWzNdKQorICAgICAgICAgICAgICAgICAgICAgPDwgODsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDk7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCAxMDsKKyAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3ICsgR1JBVFswXSwgaCArIEdSQVRbMV0pIDw8IDEyOworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOworICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHUlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDAzOworICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBiVmFsKSAmIDB4MDE7CisgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8CisgICAgICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpKSAmCisgICAgICAgICAgICAgICAgMHgwMzsKKyAgICAgICAgbGluZTQgPQorICAgICAgICAgICAgKChsaW5lNCA8PCAxKSB8CisgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwgaCAtIEdSUkVGRVJFTkNFRFkpKSAmCisgICAgICAgICAgICAweDA3OworICAgICAgICBsaW5lNSA9ICgobGluZTUgPDwgMSkgfAorICAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSkgJgorICAgICAgICAgICAgICAgIDB4MDc7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBHUlJFRzsKK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUwX29wdCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgQ0pCaWcyX0ltYWdlKiBHUlJFRzsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUxX3IsIGxpbmUyX3IsIGxpbmUzX3I7CisgIHVpbnQ4X3QgKnBMaW5lLCAqcExpbmVSLCBjVmFsOworICBpbnRwdHJfdCBuU3RyaWRlLCBuU3RyaWRlUiwgbk9mZnNldDsKKyAgaW50MzJfdCBrLCBuQml0czsKKyAgaW50MzJfdCBHUldSLCBHUkhSOworICBpbnQzMl90IEdSVywgR1JIOworICBHUlcgPSAoaW50MzJfdClDSkJpZzJfR1JSRFByb2M6OkdSVzsKKyAgR1JIID0gKGludDMyX3QpQ0pCaWcyX0dSUkRQcm9jOjpHUkg7CisgIExUUCA9IDA7CisgIEpCSUcyX0FMTE9DKEdSUkVHLCBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKKyAgaWYgKEdSUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKKyAgICBkZWxldGUgR1JSRUc7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgIkdlbmVyaWMgcmVmaW5lbWVudCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkICIKKyAgICAgICAgIndpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsCisgICAgICAgIEdSVywgR1JIKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwTGluZSA9IEdSUkVHLT5tX3BEYXRhOworICBwTGluZVIgPSBHUlJFRkVSRU5DRS0+bV9wRGF0YTsKKyAgblN0cmlkZSA9IEdSUkVHLT5tX25TdHJpZGU7CisgIG5TdHJpZGVSID0gR1JSRUZFUkVOQ0UtPm1fblN0cmlkZTsKKyAgR1JXUiA9IChpbnQzMl90KUdSUkVGRVJFTkNFLT5tX25XaWR0aDsKKyAgR1JIUiA9IChpbnQzMl90KUdSUkVGRVJFTkNFLT5tX25IZWlnaHQ7CisgIGlmIChHUlJFRkVSRU5DRURZIDwgLUdSSFIgKyAxIHx8IEdSUkVGRVJFTkNFRFkgPiBHUkhSIC0gMSkgeworICAgIEdSUkVGRVJFTkNFRFkgPSAwOworICB9CisgIG5PZmZzZXQgPSAtR1JSRUZFUkVOQ0VEWSAqIG5TdHJpZGVSOworICBmb3IgKGludDMyX3QgaCA9IDA7IGggPCBHUkg7IGgrKykgeworICAgIGlmIChUUEdST04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFsweDAwMTBdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGxpbmUxID0gKGggPiAwKSA/IHBMaW5lWy1uU3RyaWRlXSA8PCA0IDogMDsKKyAgICBpbnQzMl90IHJlZmVyZW5jZV9oID0gaCAtIEdSUkVGRVJFTkNFRFk7CisgICAgRlhfQk9PTCBsaW5lMV9yX29rID0gKHJlZmVyZW5jZV9oID4gMCAmJiByZWZlcmVuY2VfaCA8IEdSSFIgKyAxKTsKKyAgICBGWF9CT09MIGxpbmUyX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMSAmJiByZWZlcmVuY2VfaCA8IEdSSFIpOworICAgIEZYX0JPT0wgbGluZTNfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0yICYmIHJlZmVyZW5jZV9oIDwgR1JIUiAtIDEpOworICAgIGxpbmUxX3IgPSBsaW5lMV9yX29rID8gcExpbmVSW25PZmZzZXQgLSBuU3RyaWRlUl0gOiAwOworICAgIGxpbmUyX3IgPSBsaW5lMl9yX29rID8gcExpbmVSW25PZmZzZXRdIDogMDsKKyAgICBsaW5lM19yID0gbGluZTNfcl9vayA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVJdIDogMDsKKyAgICBpZiAoTFRQID09IDApIHsKKyAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDFjMDApIHwgKGxpbmUxX3IgJiAweDAxYzApIHwKKyAgICAgICAgICAgICAgICAoKGxpbmUyX3IgPj4gMykgJiAweDAwMzgpIHwgKChsaW5lM19yID4+IDYpICYgMHgwMDA3KTsKKyAgICAgIGZvciAoaW50MzJfdCB3ID0gMDsgdyA8IEdSVzsgdyArPSA4KSB7CisgICAgICAgIG5CaXRzID0gR1JXIC0gdyA+IDggPyA4IDogR1JXIC0gdzsKKyAgICAgICAgaWYgKGggPiAwKQorICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSVyA/IHBMaW5lWy1uU3RyaWRlICsgKHcgPj4gMykgKyAxXSA8PCA0IDogMCk7CisgICAgICAgIGlmIChoID4gR1JIUiArIEdSUkVGRVJFTkNFRFkgKyAxKSB7CisgICAgICAgICAgbGluZTFfciA9IDA7CisgICAgICAgICAgbGluZTJfciA9IDA7CisgICAgICAgICAgbGluZTNfciA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGxpbmUxX3Jfb2spCisgICAgICAgICAgICBsaW5lMV9yID0KKyAgICAgICAgICAgICAgICAobGluZTFfciA8PCA4KSB8CisgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7CisgICAgICAgICAgaWYgKGxpbmUyX3Jfb2spCisgICAgICAgICAgICBsaW5lMl9yID0gKGxpbmUyX3IgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCArICh3ID4+IDMpICsgMV0gOiAwKTsKKyAgICAgICAgICBpZiAobGluZTNfcl9vaykKKyAgICAgICAgICAgIGxpbmUzX3IgPQorICAgICAgICAgICAgICAgIChsaW5lM19yIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgKyBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxpbmUzX3IgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzOyBrKyspIHsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBjZGIpIDw8IDEpIHwgKGJWYWwgPDwgOSkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwNDAwKSB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTFfciA+PiAoNyAtIGspKSAmIDB4MDA0MCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUyX3IgPj4gKDEwIC0gaykpICYgMHgwMDA4KSB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTNfciA+PiAoMTMgLSBrKSkgJiAweDAwMDEpOworICAgICAgICB9CisgICAgICAgIHBMaW5lW3cgPj4gM10gPSBjVmFsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBDT05URVhUID0gKGxpbmUxICYgMHgxYzAwKSB8IChsaW5lMV9yICYgMHgwMWMwKSB8CisgICAgICAgICAgICAgICAgKChsaW5lMl9yID4+IDMpICYgMHgwMDM4KSB8ICgobGluZTNfciA+PiA2KSAmIDB4MDAwNyk7CisgICAgICBmb3IgKGludDMyX3QgdyA9IDA7IHcgPCBHUlc7IHcgKz0gOCkgeworICAgICAgICBuQml0cyA9IEdSVyAtIHcgPiA4ID8gOCA6IEdSVyAtIHc7CisgICAgICAgIGlmIChoID4gMCkKKyAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAodyArIDggPCBHUlcgPyBwTGluZVstblN0cmlkZSArICh3ID4+IDMpICsgMV0gPDwgNCA6IDApOworICAgICAgICBpZiAobGluZTFfcl9vaykKKyAgICAgICAgICBsaW5lMV9yID0KKyAgICAgICAgICAgICAgKGxpbmUxX3IgPDwgOCkgfAorICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgLSBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKKyAgICAgICAgaWYgKGxpbmUyX3Jfb2spCisgICAgICAgICAgbGluZTJfciA9IChsaW5lMl9yIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0ICsgKHcgPj4gMykgKyAxXSA6IDApOworICAgICAgICBpZiAobGluZTNfcl9vaykKKyAgICAgICAgICBsaW5lM19yID0KKyAgICAgICAgICAgICAgKGxpbmUzX3IgPDwgOCkgfAorICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgKyBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgbGluZTNfciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0czsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgaywgaCk7CisgICAgICAgICAgaWYgKCEoVFBHUk9OICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayAtIDEsIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGssIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgKyAxLCBoIC0gMSkpICYmCisgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrIC0gMSwgaCkpICYmCisgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrICsgMSwgaCkpICYmCisgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrIC0gMSwgaCArIDEpKSAmJgorICAgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgaywgaCArIDEpKSAmJgorICAgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayArIDEsIGggKyAxKSkpKSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIH0KKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwY2RiKSA8PCAxKSB8IChiVmFsIDw8IDkpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDQwMCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUxX3IgPj4gKDcgLSBrKSkgJiAweDAwNDApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMl9yID4+ICgxMCAtIGspKSAmIDB4MDAwOCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUzX3IgPj4gKDEzIC0gaykpICYgMHgwMDAxKTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKKyAgICAgIH0KKyAgICB9CisgICAgcExpbmUgKz0gblN0cmlkZTsKKyAgICBpZiAoaCA8IEdSSFIgKyBHUlJFRkVSRU5DRURZKSB7CisgICAgICBwTGluZVIgKz0gblN0cmlkZVI7CisgICAgfQorICB9CisgIHJldHVybiBHUlJFRzsKK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUxX3Vub3B0KAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KSB7CisgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBDSkJpZzJfSW1hZ2UqIEdSUkVHOworICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCwgbGluZTU7CisgIExUUCA9IDA7CisgIEpCSUcyX0FMTE9DKEdSUkVHLCBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKKyAgR1JSRUctPmZpbGwoMCk7CisgIGZvciAoRlhfRFdPUkQgaCA9IDA7IGggPCBHUkg7IGgrKykgeworICAgIGlmIChUUEdST04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFsweDAwMDhdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGlmIChMVFAgPT0gMCkgeworICAgICAgbGluZTEgPSBHUlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOworICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOworICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKC0xLCBoIC0gMSkgPDwgMjsKKyAgICAgIGxpbmUyID0gMDsKKyAgICAgIGxpbmUzID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpOworICAgICAgbGluZTQgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSk7CisgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAxOworICAgICAgbGluZTQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkpCisgICAgICAgICAgICAgICA8PCAyOworICAgICAgbGluZTUgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpOworICAgICAgbGluZTUgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpCisgICAgICAgICAgICAgICA8PCAxOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdSVzsgdysrKSB7CisgICAgICAgIENPTlRFWFQgPSBsaW5lNTsKKyAgICAgICAgQ09OVEVYVCB8PSBsaW5lNCA8PCAyOworICAgICAgICBDT05URVhUIHw9IGxpbmUzIDw8IDU7CisgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNjsKKyAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OworICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICBHUlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7CisgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdSUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDEpKSAmIDB4MDc7CisgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwMTsKKyAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwKKyAgICAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZIC0gMSkpICYKKyAgICAgICAgICAgICAgICAweDAxOworICAgICAgICBsaW5lNCA9CisgICAgICAgICAgICAoKGxpbmU0IDw8IDEpIHwKKyAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLCBoIC0gR1JSRUZFUkVOQ0VEWSkpICYKKyAgICAgICAgICAgIDB4MDc7CisgICAgICAgIGxpbmU1ID0gKChsaW5lNSA8PCAxKSB8CisgICAgICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpKSAmCisgICAgICAgICAgICAgICAgMHgwMzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbGluZTEgPSBHUlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOworICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOworICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKC0xLCBoIC0gMSkgPDwgMjsKKyAgICAgIGxpbmUyID0gMDsKKyAgICAgIGxpbmUzID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpOworICAgICAgbGluZTQgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSk7CisgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAxOworICAgICAgbGluZTQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkpCisgICAgICAgICAgICAgICA8PCAyOworICAgICAgbGluZTUgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpOworICAgICAgbGluZTUgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpCisgICAgICAgICAgICAgICA8PCAxOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdSVzsgdysrKSB7CisgICAgICAgIGJWYWwgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodywgaCk7CisgICAgICAgIGlmICghKFRQR1JPTiAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIDEsIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkpICYmCisgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCkpICYmCisgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCkpICYmCisgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCArIDEpKSAmJgorICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodywgaCArIDEpKSAmJgorICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIDEsIGggKyAxKSkpKSB7CisgICAgICAgICAgQ09OVEVYVCA9IGxpbmU1OworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTQgPDwgMjsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUzIDw8IDU7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA2OworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgNzsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICB9CisgICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKKyAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR1JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgwNzsKKyAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDAxOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfAorICAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSkgJgorICAgICAgICAgICAgICAgIDB4MDE7CisgICAgICAgIGxpbmU0ID0KKyAgICAgICAgICAgICgobGluZTQgPDwgMSkgfAorICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsIGggLSBHUlJFRkVSRU5DRURZKSkgJgorICAgICAgICAgICAgMHgwNzsKKyAgICAgICAgbGluZTUgPSAoKGxpbmU1IDw8IDEpIHwKKyAgICAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZICsgMSkpICYKKyAgICAgICAgICAgICAgICAweDAzOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gR1JSRUc7Cit9CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlX1RlbXBsYXRlMV9vcHQoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpIHsKKyAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIENKQmlnMl9JbWFnZSogR1JSRUc7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMV9yLCBsaW5lMl9yLCBsaW5lM19yOworICB1aW50OF90ICpwTGluZSwgKnBMaW5lUiwgY1ZhbDsKKyAgaW50cHRyX3QgblN0cmlkZSwgblN0cmlkZVIsIG5PZmZzZXQ7CisgIGludDMyX3QgaywgbkJpdHM7CisgIGludDMyX3QgR1JXUiwgR1JIUjsKKyAgaW50MzJfdCBHUlcsIEdSSDsKKyAgR1JXID0gKGludDMyX3QpQ0pCaWcyX0dSUkRQcm9jOjpHUlc7CisgIEdSSCA9IChpbnQzMl90KUNKQmlnMl9HUlJEUHJvYzo6R1JIOworICBMVFAgPSAwOworICBKQklHMl9BTExPQyhHUlJFRywgQ0pCaWcyX0ltYWdlKEdSVywgR1JIKSk7CisgIGlmIChHUlJFRy0+bV9wRGF0YSA9PSBOVUxMKSB7CisgICAgZGVsZXRlIEdSUkVHOworICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICJHZW5lcmljIHJlZmluZW1lbnQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCAiCisgICAgICAgICJ3aXRoIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLAorICAgICAgICBHUlcsIEdSSCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcExpbmUgPSBHUlJFRy0+bV9wRGF0YTsKKyAgcExpbmVSID0gR1JSRUZFUkVOQ0UtPm1fcERhdGE7CisgIG5TdHJpZGUgPSBHUlJFRy0+bV9uU3RyaWRlOworICBuU3RyaWRlUiA9IEdSUkVGRVJFTkNFLT5tX25TdHJpZGU7CisgIEdSV1IgPSAoaW50MzJfdClHUlJFRkVSRU5DRS0+bV9uV2lkdGg7CisgIEdSSFIgPSAoaW50MzJfdClHUlJFRkVSRU5DRS0+bV9uSGVpZ2h0OworICBpZiAoR1JSRUZFUkVOQ0VEWSA8IC1HUkhSICsgMSB8fCBHUlJFRkVSRU5DRURZID4gR1JIUiAtIDEpIHsKKyAgICBHUlJFRkVSRU5DRURZID0gMDsKKyAgfQorICBuT2Zmc2V0ID0gLUdSUkVGRVJFTkNFRFkgKiBuU3RyaWRlUjsKKyAgZm9yIChpbnQzMl90IGggPSAwOyBoIDwgR1JIOyBoKyspIHsKKyAgICBpZiAoVFBHUk9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbMHgwMDA4XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBsaW5lMSA9IChoID4gMCkgPyBwTGluZVstblN0cmlkZV0gPDwgMSA6IDA7CisgICAgaW50MzJfdCByZWZlcmVuY2VfaCA9IGggLSBHUlJFRkVSRU5DRURZOworICAgIEZYX0JPT0wgbGluZTFfcl9vayA9IChyZWZlcmVuY2VfaCA+IDAgJiYgcmVmZXJlbmNlX2ggPCBHUkhSICsgMSk7CisgICAgRlhfQk9PTCBsaW5lMl9yX29rID0gKHJlZmVyZW5jZV9oID4gLTEgJiYgcmVmZXJlbmNlX2ggPCBHUkhSKTsKKyAgICBGWF9CT09MIGxpbmUzX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMiAmJiByZWZlcmVuY2VfaCA8IEdSSFIgLSAxKTsKKyAgICBsaW5lMV9yID0gbGluZTFfcl9vayA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVJdIDogMDsKKyAgICBsaW5lMl9yID0gbGluZTJfcl9vayA/IHBMaW5lUltuT2Zmc2V0XSA6IDA7CisgICAgbGluZTNfciA9IGxpbmUzX3Jfb2sgPyBwTGluZVJbbk9mZnNldCArIG5TdHJpZGVSXSA6IDA7CisgICAgaWYgKExUUCA9PSAwKSB7CisgICAgICBDT05URVhUID0gKGxpbmUxICYgMHgwMzgwKSB8ICgobGluZTFfciA+PiAyKSAmIDB4MDAyMCkgfAorICAgICAgICAgICAgICAgICgobGluZTJfciA+PiA0KSAmIDB4MDAxYykgfCAoKGxpbmUzX3IgPj4gNikgJiAweDAwMDMpOworICAgICAgZm9yIChpbnQzMl90IHcgPSAwOyB3IDwgR1JXOyB3ICs9IDgpIHsKKyAgICAgICAgbkJpdHMgPSBHUlcgLSB3ID4gOCA/IDggOiBHUlcgLSB3OworICAgICAgICBpZiAoaCA+IDApCisgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXID8gcExpbmVbLW5TdHJpZGUgKyAodyA+PiAzKSArIDFdIDw8IDEgOiAwKTsKKyAgICAgICAgaWYgKGxpbmUxX3Jfb2spCisgICAgICAgICAgbGluZTFfciA9CisgICAgICAgICAgICAgIChsaW5lMV9yIDw8IDgpIHwKKyAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7CisgICAgICAgIGlmIChsaW5lMl9yX29rKQorICAgICAgICAgIGxpbmUyX3IgPSAobGluZTJfciA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCArICh3ID4+IDMpICsgMV0gOiAwKTsKKyAgICAgICAgaWYgKGxpbmUzX3Jfb2spCisgICAgICAgICAgbGluZTNfciA9CisgICAgICAgICAgICAgIChsaW5lM19yIDw8IDgpIHwKKyAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGxpbmUzX3IgPSAwOworICAgICAgICB9CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHM7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDE4ZCkgPDwgMSkgfCAoYlZhbCA8PCA2KSB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAwODApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMV9yID4+ICg5IC0gaykpICYgMHgwMDIwKSB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTJfciA+PiAoMTEgLSBrKSkgJiAweDAwMDQpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lM19yID4+ICgxMyAtIGspKSAmIDB4MDAwMSk7CisgICAgICAgIH0KKyAgICAgICAgcExpbmVbdyA+PiAzXSA9IGNWYWw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDAzODApIHwgKChsaW5lMV9yID4+IDIpICYgMHgwMDIwKSB8CisgICAgICAgICAgICAgICAgKChsaW5lMl9yID4+IDQpICYgMHgwMDFjKSB8ICgobGluZTNfciA+PiA2KSAmIDB4MDAwMyk7CisgICAgICBmb3IgKGludDMyX3QgdyA9IDA7IHcgPCBHUlc7IHcgKz0gOCkgeworICAgICAgICBuQml0cyA9IEdSVyAtIHcgPiA4ID8gOCA6IEdSVyAtIHc7CisgICAgICAgIGlmIChoID4gMCkKKyAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAodyArIDggPCBHUlcgPyBwTGluZVstblN0cmlkZSArICh3ID4+IDMpICsgMV0gPDwgMSA6IDApOworICAgICAgICBpZiAobGluZTFfcl9vaykKKyAgICAgICAgICBsaW5lMV9yID0KKyAgICAgICAgICAgICAgKGxpbmUxX3IgPDwgOCkgfAorICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgLSBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKKyAgICAgICAgaWYgKGxpbmUyX3Jfb2spCisgICAgICAgICAgbGluZTJfciA9IChsaW5lMl9yIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0ICsgKHcgPj4gMykgKyAxXSA6IDApOworICAgICAgICBpZiAobGluZTNfcl9vaykKKyAgICAgICAgICBsaW5lM19yID0KKyAgICAgICAgICAgICAgKGxpbmUzX3IgPDwgOCkgfAorICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgKyBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgbGluZTNfciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0czsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgaywgaCk7CisgICAgICAgICAgaWYgKCEoVFBHUk9OICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayAtIDEsIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGssIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgKyAxLCBoIC0gMSkpICYmCisgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrIC0gMSwgaCkpICYmCisgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrICsgMSwgaCkpICYmCisgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrIC0gMSwgaCArIDEpKSAmJgorICAgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgaywgaCArIDEpKSAmJgorICAgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayArIDEsIGggKyAxKSkpKSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIH0KKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMThkKSA8PCAxKSB8IChiVmFsIDw8IDYpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDA4MCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUxX3IgPj4gKDkgLSBrKSkgJiAweDAwMjApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMl9yID4+ICgxMSAtIGspKSAmIDB4MDAwNCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUzX3IgPj4gKDEzIC0gaykpICYgMHgwMDAxKTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKKyAgICAgIH0KKyAgICB9CisgICAgcExpbmUgKz0gblN0cmlkZTsKKyAgICBpZiAoaCA8IEdSSFIgKyBHUlJFRkVSRU5DRURZKSB7CisgICAgICBwTGluZVIgKz0gblN0cmlkZVI7CisgICAgfQorICB9CisgIHJldHVybiBHUlJFRzsKK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVjEoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KSB7CisgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICBGWF9CT09MIFRQR1JQSVgsIFRQR1JWQUw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIENKQmlnMl9JbWFnZSogR1JSRUc7CisgIExUUCA9IDA7CisgIEpCSUcyX0FMTE9DKEdSUkVHLCBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKKyAgR1JSRUctPmZpbGwoMCk7CisgIGZvciAoRlhfRFdPUkQgaCA9IDA7IGggPCBHUkg7IGgrKykgeworICAgIGlmIChUUEdST04pIHsKKyAgICAgIHN3aXRjaCAoR1JURU1QTEFURSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgQ09OVEVYVCA9IDB4MDAxMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIENPTlRFWFQgPSAweDAwMDg7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAwKSB7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR1JXOyB3KyspIHsKKyAgICAgICAgQ09OVEVYVCA9IDA7CisgICAgICAgIHN3aXRjaCAoR1JURU1QTEFURSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZICsgMSk7CisgICAgICAgICAgICBDT05URVhUIHw9CisgICAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpCisgICAgICAgICAgICAgICAgPDwgMTsKKyAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgMjsKKyAgICAgICAgICAgIENPTlRFWFQgfD0KKyAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkKKyAgICAgICAgICAgICAgICA8PCAzOworICAgICAgICAgICAgQ09OVEVYVCB8PQorICAgICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpCisgICAgICAgICAgICAgICAgPDwgNDsKKyAgICAgICAgICAgIENPTlRFWFQgfD0KKyAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkKKyAgICAgICAgICAgICAgICA8PCA1OworICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICA8PCA2OworICAgICAgICAgICAgQ09OVEVYVCB8PQorICAgICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKQorICAgICAgICAgICAgICAgIDw8IDc7CisgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIEdSQVRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSArIEdSQVRbM10pCisgICAgICAgICAgICAgICAgICAgICAgIDw8IDg7CisgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCkgPDwgOTsKKyAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkgPDwgMTA7CisgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3LCBoIC0gMSkgPDwgMTE7CisgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3ICsgR1JBVFswXSwgaCArIEdSQVRbMV0pIDw8IDEyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKTsKKyAgICAgICAgICAgIENPTlRFWFQgfD0KKyAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZICsgMSkKKyAgICAgICAgICAgICAgICA8PCAxOworICAgICAgICAgICAgQ09OVEVYVCB8PQorICAgICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKQorICAgICAgICAgICAgICAgIDw8IDI7CisgICAgICAgICAgICBDT05URVhUIHw9CisgICAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSkKKyAgICAgICAgICAgICAgICA8PCAzOworICAgICAgICAgICAgQ09OVEVYVCB8PQorICAgICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCAtIDEsIGggLSBHUlJFRkVSRU5DRURZKQorICAgICAgICAgICAgICAgIDw8IDQ7CisgICAgICAgICAgICBDT05URVhUIHw9CisgICAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpCisgICAgICAgICAgICAgICAgPDwgNTsKKyAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgLSAxLCBoKSA8PCA2OworICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSA8PCA3OworICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodywgaCAtIDEpIDw8IDg7CisgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpIDw8IDk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICBHUlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoRlhfRFdPUkQgdyA9IDA7IHcgPCBHUlc7IHcrKykgeworICAgICAgICBiVmFsID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGgpOworICAgICAgICBpZiAoVFBHUk9OICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpKSAmJgorICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGggLSAxKSkgJiYKKyAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDEpKSAmJgorICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSAxLCBoKSkgJiYKKyAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCkpICYmCisgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIDEsIGggKyAxKSkgJiYKKyAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoICsgMSkpICYmCisgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIDEsIGggKyAxKSkpIHsKKyAgICAgICAgICBUUEdSUElYID0gMTsKKyAgICAgICAgICBUUEdSVkFMID0gYlZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBUUEdSUElYID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoVFBHUlBJWCkgeworICAgICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBUUEdSVkFMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDT05URVhUID0gMDsKKyAgICAgICAgICBzd2l0Y2ggKEdSVEVNUExBVEUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDI7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMzsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PQorICAgICAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSkKKyAgICAgICAgICAgICAgICAgIDw8IDQ7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNjsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCA3OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIEdSQVRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZICsgR1JBVFszXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCA4OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCkgPDwgOTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSA8PCAxMDsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodywgaCAtIDEpIDw8IDExOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3ICsgR1JBVFswXSwgaCArIEdSQVRbMV0pIDw8IDEyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMjsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PQorICAgICAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSkKKyAgICAgICAgICAgICAgICAgIDw8IDM7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNDsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCA1OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCkgPDwgNjsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSA8PCA3OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3LCBoIC0gMSkgPDwgODsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGggLSAxKSA8PCA5OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBHUlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEdSUkVHOworfQorQ0pCaWcyX0ltYWdlKiBDSkJpZzJfVFJEUHJvYzo6ZGVjb2RlX0h1ZmZtYW4oQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCkgeworICBpbnQzMl90IFNUUklQVCwgRklSU1RTOworICBGWF9EV09SRCBOSU5TVEFOQ0VTOworICBpbnQzMl90IERULCBERlMsIENVUlM7CisgIHVpbnQ4X3QgQ1VSVDsKKyAgaW50MzJfdCBTSSwgVEk7CisgIEZYX0RXT1JEIElESTsKKyAgQ0pCaWcyX0ltYWdlKiBJQkk7CisgIEZYX0RXT1JEIFdJLCBISTsKKyAgaW50MzJfdCBJRFM7CisgIEZYX0JPT0wgUkk7CisgIGludDMyX3QgUkRXSSwgUkRISSwgUkRYSSwgUkRZSTsKKyAgQ0pCaWcyX0ltYWdlKiBJQk9JOworICBGWF9EV09SRCBXT0ksIEhPSTsKKyAgQ0pCaWcyX0ltYWdlKiBTQlJFRzsKKyAgRlhfQk9PTCBiRmlyc3Q7CisgIEZYX0RXT1JEIG5UbXA7CisgIGludDMyX3QgblZhbCwgbkJpdHM7CisgIENKQmlnMl9IdWZmbWFuRGVjb2RlciogcEh1ZmZtYW5EZWNvZGVyOworICBDSkJpZzJfR1JSRFByb2MqIHBHUlJEOworICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyOworICBKQklHMl9BTExPQyhwSHVmZm1hbkRlY29kZXIsIENKQmlnMl9IdWZmbWFuRGVjb2RlcihwU3RyZWFtKSk7CisgIEpCSUcyX0FMTE9DKFNCUkVHLCBDSkJpZzJfSW1hZ2UoU0JXLCBTQkgpKTsKKyAgU0JSRUctPmZpbGwoU0JERUZQSVhFTCk7CisgIGlmIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZEVCwgJlNUUklQVCkgIT0gMCkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgU1RSSVBUICo9IFNCU1RSSVBTOworICBTVFJJUFQgPSAtU1RSSVBUOworICBGSVJTVFMgPSAwOworICBOSU5TVEFOQ0VTID0gMDsKKyAgd2hpbGUgKE5JTlNUQU5DRVMgPCBTQk5VTUlOU1RBTkNFUykgeworICAgIGlmIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZEVCwgJkRUKSAhPSAwKSB7CisgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgRFQgKj0gU0JTVFJJUFM7CisgICAgU1RSSVBUID0gU1RSSVBUICsgRFQ7CisgICAgYkZpcnN0ID0gVFJVRTsKKyAgICBmb3IgKDs7KSB7CisgICAgICBpZiAoYkZpcnN0KSB7CisgICAgICAgIGlmIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZGUywgJkRGUykgIT0gMCkgeworICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAgICJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgRklSU1RTID0gRklSU1RTICsgREZTOworICAgICAgICBDVVJTID0gRklSU1RTOworICAgICAgICBiRmlyc3QgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5WYWwgPSBwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZEUywgJklEUyk7CisgICAgICAgIGlmIChuVmFsID09IEpCSUcyX09PQikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKG5WYWwgIT0gMCkgeworICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAgICJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ1VSUyA9IENVUlMgKyBJRFMgKyBTQkRTT0ZGU0VUOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoU0JTVFJJUFMgPT0gMSkgeworICAgICAgICBDVVJUID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5UbXAgPSAxOworICAgICAgICB3aGlsZSAoKEZYX0RXT1JEKSgxIDw8IG5UbXApIDwgU0JTVFJJUFMpIHsKKyAgICAgICAgICBuVG1wKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBTdHJlYW0tPnJlYWROQml0cyhuVG1wLCAmblZhbCkgIT0gMCkgeworICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAgICJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgQ1VSVCA9IG5WYWw7CisgICAgICB9CisgICAgICBUSSA9IFNUUklQVCArIENVUlQ7CisgICAgICBuVmFsID0gMDsKKyAgICAgIG5CaXRzID0gMDsKKyAgICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKHBTdHJlYW0tPnJlYWQxQml0KCZuVG1wKSAhPSAwKSB7CisgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICAgInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICBuVmFsID0gKG5WYWwgPDwgMSkgfCBuVG1wOworICAgICAgICBuQml0cysrOworICAgICAgICBmb3IgKElESSA9IDA7IElESSA8IFNCTlVNU1lNUzsgSURJKyspIHsKKyAgICAgICAgICBpZiAoKG5CaXRzID09IFNCU1lNQ09ERVNbSURJXS5jb2RlbGVuKSAmJgorICAgICAgICAgICAgICAoblZhbCA9PSBTQlNZTUNPREVTW0lESV0uY29kZSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoSURJIDwgU0JOVU1TWU1TKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChTQlJFRklORSA9PSAwKSB7CisgICAgICAgIFJJID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwU3RyZWFtLT5yZWFkMUJpdCgmUkkpICE9IDApIHsKKyAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgICAidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoUkkgPT0gMCkgeworICAgICAgICBJQkkgPSBTQlNZTVNbSURJXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRXLCAmUkRXSSkgIT0gMCkgfHwKKyAgICAgICAgICAgIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSREgsICZSREhJKSAhPSAwKSB8fAorICAgICAgICAgICAgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJEWCwgJlJEWEkpICE9IDApIHx8CisgICAgICAgICAgICAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRZLCAmUkRZSSkgIT0gMCkgfHwKKyAgICAgICAgICAgIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSU0laRSwgJm5WYWwpICE9IDApKSB7CisgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICAgInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgICAgICAgblRtcCA9IHBTdHJlYW0tPmdldE9mZnNldCgpOworICAgICAgICBJQk9JID0gU0JTWU1TW0lESV07CisgICAgICAgIGlmICghSUJPSSkgeworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAgIFdPSSA9IElCT0ktPm1fbldpZHRoOworICAgICAgICBIT0kgPSBJQk9JLT5tX25IZWlnaHQ7CisgICAgICAgIGlmICgoaW50KShXT0kgKyBSRFdJKSA8IDAgfHwgKGludCkoSE9JICsgUkRISSkgPCAwKSB7CisgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICAgInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IEludmFsaWQgUkRXSSBvciBSREhJICIKKyAgICAgICAgICAgICAgInZhbHVlLiIpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAgIEpCSUcyX0FMTE9DKHBHUlJELCBDSkJpZzJfR1JSRFByb2MoKSk7CisgICAgICAgIHBHUlJELT5HUlcgPSBXT0kgKyBSRFdJOworICAgICAgICBwR1JSRC0+R1JIID0gSE9JICsgUkRISTsKKyAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTQlJURU1QTEFURTsKKyAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFID0gSUJPSTsKKyAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFRFggPSAoUkRXSSA+PiAyKSArIFJEWEk7CisgICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRURZID0gKFJESEkgPj4gMikgKyBSRFlJOworICAgICAgICBwR1JSRC0+VFBHUk9OID0gMDsKKyAgICAgICAgcEdSUkQtPkdSQVRbMF0gPSBTQlJBVFswXTsKKyAgICAgICAgcEdSUkQtPkdSQVRbMV0gPSBTQlJBVFsxXTsKKyAgICAgICAgcEdSUkQtPkdSQVRbMl0gPSBTQlJBVFsyXTsKKyAgICAgICAgcEdSUkQtPkdSQVRbM10gPSBTQlJBVFszXTsKKyAgICAgICAgSkJJRzJfQUxMT0MocEFyaXRoRGVjb2RlciwgQ0pCaWcyX0FyaXRoRGVjb2RlcihwU3RyZWFtKSk7CisgICAgICAgIElCSSA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKKyAgICAgICAgaWYgKElCSSA9PSBOVUxMKSB7CisgICAgICAgICAgZGVsZXRlIHBHUlJEOworICAgICAgICAgIGRlbGV0ZSBwQXJpdGhEZWNvZGVyOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBwQXJpdGhEZWNvZGVyOworICAgICAgICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgICAgICAgcFN0cmVhbS0+b2Zmc2V0KDIpOworICAgICAgICBpZiAoKEZYX0RXT1JEKW5WYWwgIT0gKHBTdHJlYW0tPmdldE9mZnNldCgpIC0gblRtcCkpIHsKKyAgICAgICAgICBkZWxldGUgSUJJOworICAgICAgICAgIGRlbGV0ZSBwR1JSRDsKKyAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgICAidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKToiCisgICAgICAgICAgICAgICJieXRlcyBwcm9jZXNzZWQgYnkgZ2VuZXJpYyByZWZpbmVtZW50IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgIgorICAgICAgICAgICAgICAiZG9lc24ndCBlcXVhbCBTQkhVRkZSU0laRS4iKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgcEdSUkQ7CisgICAgICB9CisgICAgICBpZiAoIUlCSSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIFdJID0gSUJJLT5tX25XaWR0aDsKKyAgICAgIEhJID0gSUJJLT5tX25IZWlnaHQ7CisgICAgICBpZiAoVFJBTlNQT1NFRCA9PSAwICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BSSUdIVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUKSkpIHsKKyAgICAgICAgQ1VSUyA9IENVUlMgKyBXSSAtIDE7CisgICAgICB9IGVsc2UgaWYgKFRSQU5TUE9TRUQgPT0gMSAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVCkpKSB7CisgICAgICAgIENVUlMgPSBDVVJTICsgSEkgLSAxOworICAgICAgfQorICAgICAgU0kgPSBDVVJTOworICAgICAgaWYgKFRSQU5TUE9TRUQgPT0gMCkgeworICAgICAgICBzd2l0Y2ggKFJFRkNPUk5FUikgeworICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUExFRlQ6CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0ksIFRJLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUFJJR0hUOgorICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9CT1RUT01MRUZUOgorICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJLCBUSSAtIEhJICsgMSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVDoKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSAtIFdJICsgMSwgVEkgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoUkVGQ09STkVSKSB7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QTEVGVDoKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0ksIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QUklHSFQ6CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEkgLSBXSSArIDEsIFNJLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQ6CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEksIFNJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUOgorICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJIC0gV0kgKyAxLCBTSSAtIEhJICsgMSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKFJJICE9IDApIHsKKyAgICAgICAgZGVsZXRlIElCSTsKKyAgICAgIH0KKyAgICAgIGlmIChUUkFOU1BPU0VEID09IDAgJiYgKChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX1RPUExFRlQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9CT1RUT01MRUZUKSkpIHsKKyAgICAgICAgQ1VSUyA9IENVUlMgKyBXSSAtIDE7CisgICAgICB9IGVsc2UgaWYgKFRSQU5TUE9TRUQgPT0gMSAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QTEVGVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BSSUdIVCkpKSB7CisgICAgICAgIENVUlMgPSBDVVJTICsgSEkgLSAxOworICAgICAgfQorICAgICAgTklOU1RBTkNFUyA9IE5JTlNUQU5DRVMgKyAxOworICAgIH0KKyAgfQorICBkZWxldGUgcEh1ZmZtYW5EZWNvZGVyOworICByZXR1cm4gU0JSRUc7CitmYWlsZWQ6CisgIGRlbGV0ZSBwSHVmZm1hbkRlY29kZXI7CisgIGRlbGV0ZSBTQlJFRzsKKyAgcmV0dXJuIE5VTEw7Cit9CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9UUkRQcm9jOjpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJJbnREZWNvZGVyU3RhdGUqIHBJRFMpIHsKKyAgaW50MzJfdCBTVFJJUFQsIEZJUlNUUzsKKyAgRlhfRFdPUkQgTklOU1RBTkNFUzsKKyAgaW50MzJfdCBEVCwgREZTLCBDVVJTOworICBpbnQzMl90IENVUlQ7CisgIGludDMyX3QgU0ksIFRJOworICBGWF9EV09SRCBJREk7CisgIENKQmlnMl9JbWFnZSogSUJJOworICBGWF9EV09SRCBXSSwgSEk7CisgIGludDMyX3QgSURTOworICBpbnQgUkk7CisgIGludDMyX3QgUkRXSSwgUkRISSwgUkRYSSwgUkRZSTsKKyAgQ0pCaWcyX0ltYWdlKiBJQk9JOworICBGWF9EV09SRCBXT0ksIEhPSTsKKyAgQ0pCaWcyX0ltYWdlKiBTQlJFRzsKKyAgRlhfQk9PTCBiRmlyc3Q7CisgIGludDMyX3QgblJldCwgblZhbDsKKyAgaW50MzJfdCBiUmV0YWluZWQ7CisgIENKQmlnMl9Bcml0aEludERlY29kZXIgKklBRFQsICpJQUZTLCAqSUFEUywgKklBSVQsICpJQVJJLCAqSUFSRFcsICpJQVJESCwKKyAgICAgICpJQVJEWCwgKklBUkRZOworICBDSkJpZzJfQXJpdGhJYWlkRGVjb2RlciogSUFJRDsKKyAgQ0pCaWcyX0dSUkRQcm9jKiBwR1JSRDsKKyAgaWYgKHBJRFMpIHsKKyAgICBJQURUID0gcElEUy0+SUFEVDsKKyAgICBJQUZTID0gcElEUy0+SUFGUzsKKyAgICBJQURTID0gcElEUy0+SUFEUzsKKyAgICBJQUlUID0gcElEUy0+SUFJVDsKKyAgICBJQVJJID0gcElEUy0+SUFSSTsKKyAgICBJQVJEVyA9IHBJRFMtPklBUkRXOworICAgIElBUkRIID0gcElEUy0+SUFSREg7CisgICAgSUFSRFggPSBwSURTLT5JQVJEWDsKKyAgICBJQVJEWSA9IHBJRFMtPklBUkRZOworICAgIElBSUQgPSBwSURTLT5JQUlEOworICAgIGJSZXRhaW5lZCA9IFRSVUU7CisgIH0gZWxzZSB7CiAgICAgSkJJRzJfQUxMT0MoSUFEVCwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKICAgICBKQklHMl9BTExPQyhJQUZTLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwogICAgIEpCSUcyX0FMTE9DKElBRFMsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7CkBAIC0yMzcwLDI2OSArMjI3OCwxODYgQEAKICAgICBKQklHMl9BTExPQyhJQVJJLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwogICAgIEpCSUcyX0FMTE9DKElBUkRXLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwogICAgIEpCSUcyX0FMTE9DKElBUkRILCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgIG5UbXAgPSAwOwotICAgIHdoaWxlKChGWF9EV09SRCkoMSA8PCBuVG1wKSA8IChTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykpIHsKLSAgICAgICAgblRtcCArKzsKKyAgICBKQklHMl9BTExPQyhJQVJEWCwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKKyAgICBKQklHMl9BTExPQyhJQVJEWSwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKKyAgICBKQklHMl9BTExPQyhJQUlELCBDSkJpZzJfQXJpdGhJYWlkRGVjb2RlcihTQlNZTUNPREVMRU4pKTsKKyAgICBiUmV0YWluZWQgPSBGQUxTRTsKKyAgfQorICBKQklHMl9BTExPQyhTQlJFRywgQ0pCaWcyX0ltYWdlKFNCVywgU0JIKSk7CisgIFNCUkVHLT5maWxsKFNCREVGUElYRUwpOworICBpZiAoSUFEVC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZTVFJJUFQpID09IC0xKSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgU1RSSVBUICo9IFNCU1RSSVBTOworICBTVFJJUFQgPSAtU1RSSVBUOworICBGSVJTVFMgPSAwOworICBOSU5TVEFOQ0VTID0gMDsKKyAgd2hpbGUgKE5JTlNUQU5DRVMgPCBTQk5VTUlOU1RBTkNFUykgeworICAgIGlmIChJQURULT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJkRUKSA9PSAtMSkgeworICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IHRvbyBzaG9ydC4iKTsKKyAgICAgIGdvdG8gZmFpbGVkOwogICAgIH0KLSAgICBKQklHMl9BTExPQyhJQUlELCBDSkJpZzJfQXJpdGhJYWlkRGVjb2RlcigodWludDhfdCluVG1wKSk7Ci0gICAgU0RORVdTWU1TID0gKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihTRE5VTU5FV1NZTVMsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgRlhTWVNfbWVtc2V0KFNETkVXU1lNUywgMCAsIFNETlVNTkVXU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgSENIRUlHSFQgPSAwOwotICAgIE5TWU1TREVDT0RFRCA9IDA7Ci0gICAgd2hpbGUoTlNZTVNERUNPREVEIDwgU0ROVU1ORVdTWU1TKSB7Ci0gICAgICAgIEJTID0gTlVMTDsKLSAgICAgICAgaWYoSUFESC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZIQ0RIKSA9PSAtMSkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgIERUICo9IFNCU1RSSVBTOworICAgIFNUUklQVCA9IFNUUklQVCArIERUOworICAgIGJGaXJzdCA9IFRSVUU7CisgICAgZm9yICg7OykgeworICAgICAgaWYgKGJGaXJzdCkgeworICAgICAgICBpZiAoSUFGUy0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZERlMpID09IC0xKSB7CisgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICAgInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CiAgICAgICAgIH0KLSAgICAgICAgSENIRUlHSFQgPSBIQ0hFSUdIVCArIEhDREg7Ci0gICAgICAgIGlmICgoaW50KUhDSEVJR0hUIDwgMCB8fCAoaW50KUhDSEVJR0hUID4gSkJJRzJfTUFYX0lNQUdFX1NJWkUpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiBpbnZhbGlkIEhDSEVJR0hUIHZhbHVlLiIpOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIEZJUlNUUyA9IEZJUlNUUyArIERGUzsKKyAgICAgICAgQ1VSUyA9IEZJUlNUUzsKKyAgICAgICAgYkZpcnN0ID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBuUmV0ID0gSUFEUy0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZJRFMpOworICAgICAgICBpZiAoblJldCA9PSBKQklHMl9PT0IpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChuUmV0ICE9IDApIHsKKyAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgICAidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IHRvbyBzaG9ydC4iKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDVVJTID0gQ1VSUyArIElEUyArIFNCRFNPRkZTRVQ7CiAgICAgICAgIH0KLSAgICAgICAgU1lNV0lEVEggPSAwOwotICAgICAgICBUT1RXSURUSCA9IDA7Ci0gICAgICAgIGZvcig7OykgewotICAgICAgICAgICAgblZhbCA9IElBRFctPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmRFcpOwotICAgICAgICAgICAgaWYoblZhbCA9PSBKQklHMl9PT0IpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZihuVmFsICE9IDApIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoTlNZTVNERUNPREVEID49IFNETlVNTkVXU1lNUykgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogTlNZTVNERUNPREVEID49IFNETlVNTkVXU1lNUy4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNZTVdJRFRIID0gU1lNV0lEVEggKyBEVzsKLSAgICAgICAgICAgICAgICBpZiAoKGludClTWU1XSURUSCA8IDAgfHwgKGludClTWU1XSURUSCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiBpbnZhbGlkIFNZTVdJRFRIIHZhbHVlLiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEhDSEVJR0hUID09IDAgfHwgU1lNV0lEVEggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBUT1RXSURUSCA9IFRPVFdJRFRIICsgU1lNV0lEVEg7Ci0gICAgICAgICAgICAgICAgICAgIFNETkVXU1lNU1tOU1lNU0RFQ09ERURdID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgTlNZTVNERUNPREVEID0gTlNZTVNERUNPREVEICsgMTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRPVFdJRFRIID0gVE9UV0lEVEggKyBTWU1XSURUSDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFNEUkVGQUdHID09IDApIHsKLSAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhwR1JELCBDSkJpZzJfR1JEUHJvYygpKTsKLSAgICAgICAgICAgICAgICBwR1JELT5NTVIgPSAwOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCVyA9IFNZTVdJRFRIOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCSCA9IEhDSEVJR0hUOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCVEVNUExBVEUgPSBTRFRFTVBMQVRFOwotICAgICAgICAgICAgICAgIHBHUkQtPlRQR0RPTiA9IDA7Ci0gICAgICAgICAgICAgICAgcEdSRC0+VVNFU0tJUCA9IDA7Ci0gICAgICAgICAgICAgICAgcEdSRC0+R0JBVFswXSA9IFNEQVRbMF07Ci0gICAgICAgICAgICAgICAgcEdSRC0+R0JBVFsxXSA9IFNEQVRbMV07Ci0gICAgICAgICAgICAgICAgcEdSRC0+R0JBVFsyXSA9IFNEQVRbMl07Ci0gICAgICAgICAgICAgICAgcEdSRC0+R0JBVFszXSA9IFNEQVRbM107Ci0gICAgICAgICAgICAgICAgcEdSRC0+R0JBVFs0XSA9IFNEQVRbNF07Ci0gICAgICAgICAgICAgICAgcEdSRC0+R0JBVFs1XSA9IFNEQVRbNV07Ci0gICAgICAgICAgICAgICAgcEdSRC0+R0JBVFs2XSA9IFNEQVRbNl07Ci0gICAgICAgICAgICAgICAgcEdSRC0+R0JBVFs3XSA9IFNEQVRbN107Ci0gICAgICAgICAgICAgICAgQlMgPSBwR1JELT5kZWNvZGVfQXJpdGgocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZihCUyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwR1JEOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBHUkQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmKElBQUktPmRlY29kZShwQXJpdGhEZWNvZGVyLCAoaW50KikmUkVGQUdHTklOU1QpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihSRUZBR0dOSU5TVCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX1RSRFByb2MgKnBEZWNvZGVyOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhwRGVjb2RlciwgQ0pCaWcyX1RSRFByb2MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkYgPSBTREhVRkY7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlJFRklORSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlcgPSBTWU1XSURUSDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSCA9IEhDSEVJR0hUOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JOVU1JTlNUQU5DRVMgPSBSRUZBR0dOSU5TVDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCU1RSSVBTID0gMTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCTlVNU1lNUyA9IFNETlVNSU5TWU1TICsgTlNZTVNERUNPREVEOwotICAgICAgICAgICAgICAgICAgICBTQk5VTVNZTVMgPSBwRGVjb2Rlci0+U0JOVU1TWU1TOwotICAgICAgICAgICAgICAgICAgICBuVG1wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoKEZYX0RXT1JEKSgxIDw8IG5UbXApIDwgU0JOVU1TWU1TKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuVG1wICsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFNCU1lNQ09ERUxFTiA9ICh1aW50OF90KW5UbXA7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlNZTUNPREVMRU4gPSBTQlNZTUNPREVMRU47Ci0gICAgICAgICAgICAgICAgICAgIFNCU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoU0JOVU1TWU1TLCBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TLCBTRElOU1lNUywgU0ROVU1JTlNZTVMgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TICsgU0ROVU1JTlNZTVMsIFNETkVXU1lNUywgTlNZTVNERUNPREVEICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCU1lNUyA9IFNCU1lNUzsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCREVGUElYRUwgPSAwOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JDT01CT1AgPSBKQklHMl9DT01QT1NFX09SOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+VFJBTlNQT1NFRCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5SRUZDT1JORVIgPSBKQklHMl9DT1JORVJfVE9QTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCRFNPRkZTRVQgPSAwOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhTQkhVRkZGUywgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjYpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0I2KSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRkRTLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9COCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9COCkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjgpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGRFQsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTEpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxMSkpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhTQkhVRkZSRFcsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTUpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhTQkhVRkZSREgsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTUpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhTQkhVRkZSRFgsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTUpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhTQkhVRkZSRFksIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTUpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhTQkhVRkZSU0laRSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjEpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZGUyA9IFNCSFVGRkZTOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGRFMgPSBTQkhVRkZEUzsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSFVGRkRUID0gU0JIVUZGRFQ7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSRFcgPSBTQkhVRkZSRFc7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSREggPSBTQkhVRkZSREg7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSRFggPSBTQkhVRkZSRFg7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSRFkgPSBTQkhVRkZSRFk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSU0laRSA9IFNCSFVGRlJTSVpFOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JSVEVNUExBVEUgPSBTRFJURU1QTEFURTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCUkFUWzBdID0gU0RSQVRbMF07Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlJBVFsxXSA9IFNEUkFUWzFdOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JSQVRbMl0gPSBTRFJBVFsyXTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCUkFUWzNdID0gU0RSQVRbM107Ci0gICAgICAgICAgICAgICAgICAgIEpCaWcySW50RGVjb2RlclN0YXRlIGlkczsKLSAgICAgICAgICAgICAgICAgICAgaWRzLklBRFQgPSBJQURUOwotICAgICAgICAgICAgICAgICAgICBpZHMuSUFGUyA9IElBRlM7Ci0gICAgICAgICAgICAgICAgICAgIGlkcy5JQURTID0gSUFEUzsKLSAgICAgICAgICAgICAgICAgICAgaWRzLklBSVQgPSBJQUlUOwotICAgICAgICAgICAgICAgICAgICBpZHMuSUFSSSA9IElBUkk7Ci0gICAgICAgICAgICAgICAgICAgIGlkcy5JQVJEVyA9IElBUkRXOwotICAgICAgICAgICAgICAgICAgICBpZHMuSUFSREggPSBJQVJESDsKLSAgICAgICAgICAgICAgICAgICAgaWRzLklBUkRYID0gSUFSRFg7Ci0gICAgICAgICAgICAgICAgICAgIGlkcy5JQVJEWSA9IElBUkRZOwotICAgICAgICAgICAgICAgICAgICBpZHMuSUFJRCA9IElBSUQ7Ci0gICAgICAgICAgICAgICAgICAgIEJTID0gcERlY29kZXItPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQsICZpZHMpOwotICAgICAgICAgICAgICAgICAgICBpZihCUyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZGUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZEUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZEVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRIOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEWDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUlNJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcERlY29kZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRkZTOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGRFM7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZEVDsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEVzsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJESDsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEWDsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEWTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJTSVpFOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcERlY29kZXI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKFJFRkFHR05JTlNUID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgU0JOVU1TWU1TID0gU0ROVU1JTlNZTVMgKyBOU1lNU0RFQ09ERUQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmKElBSUQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAoaW50KikmSURJKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKChJQVJEWC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZSRFhJKSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoSUFSRFktPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmUkRZSSkgPT0gLTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKElESSA+PSBTQk5VTVNZTVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZWZpbmVtZW50IHJlZmVyZW5jZXMgdW5rbm93biBzeW1ib2wgJWQiLCBJREkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU0JTWU1TID0gKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihTQk5VTVNZTVMsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMsIFNESU5TWU1TLCBTRE5VTUlOU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMgKyBTRE5VTUlOU1lNUywgU0RORVdTWU1TLCBOU1lNU0RFQ09ERUQgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVNCU1lNU1tJREldKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKHBHUlJELCBDSkJpZzJfR1JSRFByb2MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUlcgPSBTWU1XSURUSDsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSSCA9IEhDSEVJR0hUOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+R1JURU1QTEFURSA9IFNEUlRFTVBMQVRFOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0UgPSBTQlNZTVNbSURJXTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFRFggPSBSRFhJOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWSA9IFJEWUk7Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5UUEdST04gPSAwOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+R1JBVFswXSA9IFNEUkFUWzBdOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+R1JBVFsxXSA9IFNEUkFUWzFdOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+R1JBVFsyXSA9IFNEUkFUWzJdOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+R1JBVFszXSA9IFNEUkFUWzNdOwotICAgICAgICAgICAgICAgICAgICBCUyA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYoQlMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEdSUkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBHUlJEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNETkVXU1lNU1tOU1lNU0RFQ09ERURdID0gQlM7Ci0gICAgICAgICAgICBCUyA9IE5VTEw7Ci0gICAgICAgICAgICBOU1lNU0RFQ09ERUQgPSBOU1lNU0RFQ09ERUQgKyAxOworICAgICAgfQorICAgICAgaWYgKE5JTlNUQU5DRVMgPj0gU0JOVU1JTlNUQU5DRVMpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoU0JTVFJJUFMgPT0gMSkgeworICAgICAgICBDVVJUID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChJQUlULT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJm5WYWwpID09IC0xKSB7CisgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICAgInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CiAgICAgICAgIH0KKyAgICAgICAgQ1VSVCA9IG5WYWw7CisgICAgICB9CisgICAgICBUSSA9IFNUUklQVCArIENVUlQ7CisgICAgICBpZiAoSUFJRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZuVmFsKSA9PSAtMSkgeworICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorICAgICAgSURJID0gblZhbDsKKyAgICAgIGlmIChJREkgPj0gU0JOVU1TWU1TKSB7CisgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IHN5bWJvbCBpZCBvdXQgb2YgIgorICAgICAgICAgICAgInJhbmdlLiglZC8lZCkiLAorICAgICAgICAgICAgSURJLCBTQk5VTVNZTVMpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKyAgICAgIGlmIChTQlJFRklORSA9PSAwKSB7CisgICAgICAgIFJJID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChJQVJJLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJJKSA9PSAtMSkgeworICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAgICJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIVNCU1lNU1tJREldKSB7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorICAgICAgaWYgKFJJID09IDApIHsKKyAgICAgICAgSUJJID0gU0JTWU1TW0lESV07CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKElBUkRXLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEV0kpID09IC0xKSB8fAorICAgICAgICAgICAgKElBUkRILT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJESEkpID09IC0xKSB8fAorICAgICAgICAgICAgKElBUkRYLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEWEkpID09IC0xKSB8fAorICAgICAgICAgICAgKElBUkRZLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEWUkpID09IC0xKSkgeworICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAgICJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAgIElCT0kgPSBTQlNZTVNbSURJXTsKKyAgICAgICAgV09JID0gSUJPSS0+bV9uV2lkdGg7CisgICAgICAgIEhPSSA9IElCT0ktPm1fbkhlaWdodDsKKyAgICAgICAgaWYgKChpbnQpKFdPSSArIFJEV0kpIDwgMCB8fCAoaW50KShIT0kgKyBSREhJKSA8IDApIHsKKyAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgICAidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IEludmFsaWQgUkRXSSBvciBSREhJICIKKyAgICAgICAgICAgICAgInZhbHVlLiIpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAgIEpCSUcyX0FMTE9DKHBHUlJELCBDSkJpZzJfR1JSRFByb2MoKSk7CisgICAgICAgIHBHUlJELT5HUlcgPSBXT0kgKyBSRFdJOworICAgICAgICBwR1JSRC0+R1JIID0gSE9JICsgUkRISTsKKyAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTQlJURU1QTEFURTsKKyAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFID0gSUJPSTsKKyAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFRFggPSAoUkRXSSA+PiAxKSArIFJEWEk7CisgICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRURZID0gKFJESEkgPj4gMSkgKyBSRFlJOworICAgICAgICBwR1JSRC0+VFBHUk9OID0gMDsKKyAgICAgICAgcEdSUkQtPkdSQVRbMF0gPSBTQlJBVFswXTsKKyAgICAgICAgcEdSUkQtPkdSQVRbMV0gPSBTQlJBVFsxXTsKKyAgICAgICAgcEdSUkQtPkdSQVRbMl0gPSBTQlJBVFsyXTsKKyAgICAgICAgcEdSUkQtPkdSQVRbM10gPSBTQlJBVFszXTsKKyAgICAgICAgSUJJID0gcEdSUkQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOworICAgICAgICBpZiAoSUJJID09IE5VTEwpIHsKKyAgICAgICAgICBkZWxldGUgcEdSUkQ7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIHBHUlJEOworICAgICAgfQorICAgICAgV0kgPSBJQkktPm1fbldpZHRoOworICAgICAgSEkgPSBJQkktPm1fbkhlaWdodDsKKyAgICAgIGlmIChUUkFOU1BPU0VEID09IDAgJiYgKChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX1RPUFJJR0hUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQpKSkgeworICAgICAgICBDVVJTID0gQ1VSUyArIFdJIC0gMTsKKyAgICAgIH0gZWxzZSBpZiAoVFJBTlNQT1NFRCA9PSAxICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9CT1RUT01MRUZUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUKSkpIHsKKyAgICAgICAgQ1VSUyA9IENVUlMgKyBISSAtIDE7CisgICAgICB9CisgICAgICBTSSA9IENVUlM7CisgICAgICBpZiAoVFJBTlNQT1NFRCA9PSAwKSB7CisgICAgICAgIHN3aXRjaCAoUkVGQ09STkVSKSB7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QTEVGVDoKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEksIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QUklHSFQ6CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0kgLSBXSSArIDEsIFRJLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQ6CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0ksIFRJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUOgorICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSAtIEhJICsgMSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChSRUZDT1JORVIpIHsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9UT1BMRUZUOgorICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJLCBTSSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9UT1BSSUdIVDoKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSAtIFdJICsgMSwgU0ksIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVDoKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0kgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQ6CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEkgLSBXSSArIDEsIFNJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoUkkgIT0gMCkgeworICAgICAgICBkZWxldGUgSUJJOworICAgICAgfQorICAgICAgaWYgKFRSQU5TUE9TRUQgPT0gMCAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QTEVGVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQpKSkgeworICAgICAgICBDVVJTID0gQ1VSUyArIFdJIC0gMTsKKyAgICAgIH0gZWxzZSBpZiAoVFJBTlNQT1NFRCA9PSAxICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BMRUZUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX1RPUFJJR0hUKSkpIHsKKyAgICAgICAgQ1VSUyA9IENVUlMgKyBISSAtIDE7CisgICAgICB9CisgICAgICBOSU5TVEFOQ0VTID0gTklOU1RBTkNFUyArIDE7CiAgICAgfQotICAgIEVYSU5ERVggPSAwOwotICAgIENVUkVYRkxBRyA9IDA7Ci0gICAgRVhGTEFHUyA9IChGWF9CT09MKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEZYX0JPT0wpLCAoU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpKTsKLSAgICB3aGlsZShFWElOREVYIDwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKLSAgICAgICAgaWYoSUFFWC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIChpbnQqKSZFWFJVTkxFTkdUSCkgPT0gLTEpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShFWEZMQUdTKTsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoRVhJTkRFWCArIEVYUlVOTEVOR1RIID4gU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShFWEZMQUdTKTsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiBJbnZhbGlkIEVYUlVOTEVOR1RIIHZhbHVlLiIpOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoRVhSVU5MRU5HVEggIT0gMCkgewotICAgICAgICAgICAgZm9yKEkgPSBFWElOREVYOyBJIDwgRVhJTkRFWCArIEVYUlVOTEVOR1RIOyBJKyspIHsKLSAgICAgICAgICAgICAgICBFWEZMQUdTW0ldID0gQ1VSRVhGTEFHOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEVYSU5ERVggPSBFWElOREVYICsgRVhSVU5MRU5HVEg7Ci0gICAgICAgIENVUkVYRkxBRyA9ICFDVVJFWEZMQUc7Ci0gICAgfQotICAgIEpCSUcyX0FMTE9DKHBEaWN0LCBDSkJpZzJfU3ltYm9sRGljdCgpKTsKLSAgICBwRGljdC0+U0ROVU1FWFNZTVMgPSBTRE5VTUVYU1lNUzsKLSAgICBwRGljdC0+U0RFWFNZTVMgPSAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihDSkJpZzJfSW1hZ2UqKSwgU0ROVU1FWFNZTVMpOwotICAgIEkgPSBKID0gMDsKLSAgICBmb3IoSSA9IDA7IEkgPCBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUzsgSSsrKSB7Ci0gICAgICAgIGlmKEVYRkxBR1NbSV0gJiYgSiA8IFNETlVNRVhTWU1TKSB7Ci0gICAgICAgICAgICBpZihJIDwgU0ROVU1JTlNZTVMpIHsKLSAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhwRGljdC0+U0RFWFNZTVNbSl0sIENKQmlnMl9JbWFnZSgqU0RJTlNZTVNbSV0pKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcERpY3QtPlNERVhTWU1TW0pdID0gU0RORVdTWU1TW0kgLSBTRE5VTUlOU1lNU107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBKID0gSiArIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoIUVYRkxBR1NbSV0gJiYgSSA+PSBTRE5VTUlOU1lNUykgewotICAgICAgICAgICAgZGVsZXRlIFNETkVXU1lNU1tJIC0gU0ROVU1JTlNZTVNdOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChKIDwgU0ROVU1FWFNZTVMpIHsKLSAgICAgICAgcERpY3QtPlNETlVNRVhTWU1TID0gSjsKLSAgICB9Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEVYRkxBR1MpOwotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRE5FV1NZTVMpOwotICAgIGRlbGV0ZSBJQURIOwotICAgIGRlbGV0ZSBJQURXOwotICAgIGRlbGV0ZSBJQUFJOwotICAgIGRlbGV0ZSBJQVJEWDsKLSAgICBkZWxldGUgSUFSRFk7Ci0gICAgZGVsZXRlIElBRVg7Ci0gICAgZGVsZXRlIElBSUQ7CisgIH0KKyAgaWYgKGJSZXRhaW5lZCA9PSBGQUxTRSkgewogICAgIGRlbGV0ZSBJQURUOwogICAgIGRlbGV0ZSBJQUZTOwogICAgIGRlbGV0ZSBJQURTOwpAQCAtMjY0MCwyMiArMjQ2NSwxMyBAQAogICAgIGRlbGV0ZSBJQVJJOwogICAgIGRlbGV0ZSBJQVJEVzsKICAgICBkZWxldGUgSUFSREg7Ci0gICAgcmV0dXJuIHBEaWN0OworICAgIGRlbGV0ZSBJQVJEWDsKKyAgICBkZWxldGUgSUFSRFk7CisgICAgZGVsZXRlIElBSUQ7CisgIH0KKyAgcmV0dXJuIFNCUkVHOwogZmFpbGVkOgotICAgIGZvcihJID0gMDsgSSA8IE5TWU1TREVDT0RFRDsgSSsrKSB7Ci0gICAgICAgIGlmIChTRE5FV1NZTVNbSV0pIHsKLSAgICAgICAgICAgIGRlbGV0ZSBTRE5FV1NZTVNbSV07Ci0gICAgICAgICAgICBTRE5FV1NZTVNbSV0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRE5FV1NZTVMpOwotICAgIGRlbGV0ZSBJQURIOwotICAgIGRlbGV0ZSBJQURXOwotICAgIGRlbGV0ZSBJQUFJOwotICAgIGRlbGV0ZSBJQVJEWDsKLSAgICBkZWxldGUgSUFSRFk7Ci0gICAgZGVsZXRlIElBRVg7Ci0gICAgZGVsZXRlIElBSUQ7CisgIGlmIChiUmV0YWluZWQgPT0gRkFMU0UpIHsKICAgICBkZWxldGUgSUFEVDsKICAgICBkZWxldGUgSUFGUzsKICAgICBkZWxldGUgSUFEUzsKQEAgLTI2NjMsMTY2OSArMjQ3OSwyMTg0IEBACiAgICAgZGVsZXRlIElBUkk7CiAgICAgZGVsZXRlIElBUkRXOwogICAgIGRlbGV0ZSBJQVJESDsKLSAgICByZXR1cm4gTlVMTDsKKyAgICBkZWxldGUgSUFSRFg7CisgICAgZGVsZXRlIElBUkRZOworICAgIGRlbGV0ZSBJQUlEOworICB9CisgIGRlbGV0ZSBTQlJFRzsKKyAgcmV0dXJuIE5VTEw7CiB9Ci1DSkJpZzJfU3ltYm9sRGljdCAqQ0pCaWcyX1NERFByb2M6OmRlY29kZV9IdWZmbWFuKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0sCi0gICAgICAgIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBDSkJpZzJfSW1hZ2UgKipTRE5FV1NZTVM7Ci0gICAgRlhfRFdPUkQgKlNETkVXU1lNV0lEVEhTOwotICAgIEZYX0RXT1JEIEhDSEVJR0hULCBOU1lNU0RFQ09ERUQ7Ci0gICAgaW50MzJfdCBIQ0RIOwotICAgIEZYX0RXT1JEIFNZTVdJRFRILCBUT1RXSURUSCwgSENGSVJTVFNZTTsKLSAgICBpbnQzMl90IERXOwotICAgIENKQmlnMl9JbWFnZSAqQlMsICpCSEM7Ci0gICAgRlhfRFdPUkQgSSwgSiwgUkVGQUdHTklOU1Q7Ci0gICAgRlhfQk9PTCAqRVhGTEFHUzsKLSAgICBGWF9EV09SRCBFWElOREVYOwotICAgIEZYX0JPT0wgQ1VSRVhGTEFHOwotICAgIEZYX0RXT1JEIEVYUlVOTEVOR1RIOwotICAgIGludDMyX3QgblZhbCwgbkJpdHM7Ci0gICAgRlhfRFdPUkQgblRtcDsKLSAgICBGWF9EV09SRCBTQk5VTVNZTVM7Ci0gICAgdWludDhfdCBTQlNZTUNPREVMRU47Ci0gICAgSkJpZzJIdWZmbWFuQ29kZSAqU0JTWU1DT0RFUzsKLSAgICBGWF9EV09SRCBJREk7Ci0gICAgaW50MzJfdCBSRFhJLCBSRFlJOwotICAgIEZYX0RXT1JEIEJNU0laRTsKLSAgICBGWF9EV09SRCBzdHJpZGU7Ci0gICAgQ0pCaWcyX0ltYWdlICoqU0JTWU1TOwotICAgIENKQmlnMl9IdWZmbWFuVGFibGUgKlNCSFVGRkZTLCAqU0JIVUZGRFMsICpTQkhVRkZEVCwgKlNCSFVGRlJEVywgKlNCSFVGRlJESCwgKlNCSFVGRlJEWCwgKlNCSFVGRlJEWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICpTQkhVRkZSU0laRSwgKnBUYWJsZTsKLSAgICBDSkJpZzJfSHVmZm1hbkRlY29kZXIgKnBIdWZmbWFuRGVjb2RlcjsKLSAgICBDSkJpZzJfR1JSRFByb2MgKnBHUlJEOwotICAgIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXI7Ci0gICAgQ0pCaWcyX0dSRFByb2MgKnBHUkQ7Ci0gICAgQ0pCaWcyX1N5bWJvbERpY3QgKnBEaWN0OwotICAgIEpCSUcyX0FMTE9DKHBIdWZmbWFuRGVjb2RlciwgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyKHBTdHJlYW0pKTsKLSAgICBTRE5FV1NZTVMgPSAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKFNETlVNTkVXU1lNUywgc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICBGWFNZU19tZW1zZXQoU0RORVdTWU1TLCAwICwgU0ROVU1ORVdTWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICBTRE5FV1NZTVdJRFRIUyA9IE5VTEw7Ci0gICAgQkhDID0gTlVMTDsKLSAgICBpZihTRFJFRkFHRyA9PSAwKSB7Ci0gICAgICAgIFNETkVXU1lNV0lEVEhTID0gKEZYX0RXT1JEICopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKFNETlVNTkVXU1lNUywgc2l6ZW9mKEZYX0RXT1JEKSk7Ci0gICAgICAgIEZYU1lTX21lbXNldChTRE5FV1NZTVdJRFRIUywgMCAsIFNETlVNTkVXU1lNUyAqIHNpemVvZihGWF9EV09SRCkpOwotICAgIH0KLSAgICBIQ0hFSUdIVCA9IDA7Ci0gICAgTlNZTVNERUNPREVEID0gMDsKK0NKQmlnMl9TeW1ib2xEaWN0KiBDSkJpZzJfU0REUHJvYzo6ZGVjb2RlX0FyaXRoKAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCkgeworICBDSkJpZzJfSW1hZ2UqKiBTRE5FV1NZTVM7CisgIEZYX0RXT1JEIEhDSEVJR0hULCBOU1lNU0RFQ09ERUQ7CisgIGludDMyX3QgSENESDsKKyAgRlhfRFdPUkQgU1lNV0lEVEgsIFRPVFdJRFRIOworICBpbnQzMl90IERXOworICBDSkJpZzJfSW1hZ2UqIEJTOworICBGWF9EV09SRCBJLCBKLCBSRUZBR0dOSU5TVDsKKyAgRlhfQk9PTCogRVhGTEFHUzsKKyAgRlhfRFdPUkQgRVhJTkRFWDsKKyAgRlhfQk9PTCBDVVJFWEZMQUc7CisgIEZYX0RXT1JEIEVYUlVOTEVOR1RIOworICBpbnQzMl90IG5WYWw7CisgIEZYX0RXT1JEIG5UbXA7CisgIEZYX0RXT1JEIFNCTlVNU1lNUzsKKyAgdWludDhfdCBTQlNZTUNPREVMRU47CisgIEZYX0RXT1JEIElESTsKKyAgaW50MzJfdCBSRFhJLCBSRFlJOworICBDSkJpZzJfSW1hZ2UqKiBTQlNZTVM7CisgIENKQmlnMl9IdWZmbWFuVGFibGUgKlNCSFVGRkZTLCAqU0JIVUZGRFMsICpTQkhVRkZEVCwgKlNCSFVGRlJEVywgKlNCSFVGRlJESCwKKyAgICAgICpTQkhVRkZSRFgsICpTQkhVRkZSRFksICpTQkhVRkZSU0laRTsKKyAgQ0pCaWcyX0dSUkRQcm9jKiBwR1JSRDsKKyAgQ0pCaWcyX0dSRFByb2MqIHBHUkQ7CisgIENKQmlnMl9Bcml0aEludERlY29kZXIgKklBREgsICpJQURXLCAqSUFBSSwgKklBUkRYLCAqSUFSRFksICpJQUVYLCAqSUFEVCwKKyAgICAgICpJQUZTLCAqSUFEUywgKklBSVQsICpJQVJJLCAqSUFSRFcsICpJQVJESDsKKyAgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXIqIElBSUQ7CisgIENKQmlnMl9TeW1ib2xEaWN0KiBwRGljdDsKKyAgSkJJRzJfQUxMT0MoSUFESCwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKKyAgSkJJRzJfQUxMT0MoSUFEVywgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKKyAgSkJJRzJfQUxMT0MoSUFBSSwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKKyAgSkJJRzJfQUxMT0MoSUFSRFgsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7CisgIEpCSUcyX0FMTE9DKElBUkRZLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOworICBKQklHMl9BTExPQyhJQUVYLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOworICBKQklHMl9BTExPQyhJQURULCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOworICBKQklHMl9BTExPQyhJQUZTLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOworICBKQklHMl9BTExPQyhJQURTLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOworICBKQklHMl9BTExPQyhJQUlULCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOworICBKQklHMl9BTExPQyhJQVJJLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOworICBKQklHMl9BTExPQyhJQVJEVywgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKKyAgSkJJRzJfQUxMT0MoSUFSREgsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7CisgIG5UbXAgPSAwOworICB3aGlsZSAoKEZYX0RXT1JEKSgxIDw8IG5UbXApIDwgKFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSkgeworICAgIG5UbXArKzsKKyAgfQorICBKQklHMl9BTExPQyhJQUlELCBDSkJpZzJfQXJpdGhJYWlkRGVjb2RlcigodWludDhfdCluVG1wKSk7CisgIFNETkVXU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoU0ROVU1ORVdTWU1TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7CisgIEZYU1lTX21lbXNldChTRE5FV1NZTVMsIDAsIFNETlVNTkVXU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7CisgIEhDSEVJR0hUID0gMDsKKyAgTlNZTVNERUNPREVEID0gMDsKKyAgd2hpbGUgKE5TWU1TREVDT0RFRCA8IFNETlVNTkVXU1lNUykgewogICAgIEJTID0gTlVMTDsKLSAgICB3aGlsZShOU1lNU0RFQ09ERUQgPCBTRE5VTU5FV1NZTVMpIHsKLSAgICAgICAgaWYocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0RIVUZGREgsICZIQ0RIKSAhPSAwKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBIQ0hFSUdIVCA9IEhDSEVJR0hUICsgSENESDsKLSAgICAgICAgaWYgKChpbnQpSENIRUlHSFQgPCAwIHx8IChpbnQpSENIRUlHSFQgPiBKQklHMl9NQVhfSU1BR0VfU0laRSkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogaW52YWxpZCBIQ0hFSUdIVCB2YWx1ZS4iKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIFNZTVdJRFRIID0gMDsKLSAgICAgICAgVE9UV0lEVEggPSAwOwotICAgICAgICBIQ0ZJUlNUU1lNID0gTlNZTVNERUNPREVEOwotICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgIG5WYWwgPSBwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTREhVRkZEVywgJkRXKTsKLSAgICAgICAgICAgIGlmKG5WYWwgPT0gSkJJRzJfT09CKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoblZhbCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoTlNZTVNERUNPREVEID49IFNETlVNTkVXU1lNUykgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiBOU1lNU0RFQ09ERUQgPj0gU0ROVU1ORVdTWU1TLiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU1lNV0lEVEggPSBTWU1XSURUSCArIERXOwotICAgICAgICAgICAgICAgIGlmICgoaW50KVNZTVdJRFRIIDwgMCB8fCAoaW50KVNZTVdJRFRIID4gSkJJRzJfTUFYX0lNQUdFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogaW52YWxpZCBTWU1XSURUSCB2YWx1ZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChIQ0hFSUdIVCA9PSAwIHx8IFNZTVdJRFRIID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgVE9UV0lEVEggPSBUT1RXSURUSCArIFNZTVdJRFRIOwotICAgICAgICAgICAgICAgICAgICBTRE5FV1NZTVNbTlNZTVNERUNPREVEXSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIE5TWU1TREVDT0RFRCA9IE5TWU1TREVDT0RFRCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUT1RXSURUSCA9IFRPVFdJRFRIICsgU1lNV0lEVEg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihTRFJFRkFHRyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgaWYocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0RIVUZGQUdHSU5TVCwgKGludCopJlJFRkFHR05JTlNUKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJTID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZihSRUZBR0dOSU5TVCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX1RSRFByb2MgKnBEZWNvZGVyOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhwRGVjb2RlciwgQ0pCaWcyX1RSRFByb2MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkYgPSBTREhVRkY7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlJFRklORSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlcgPSBTWU1XSURUSDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSCA9IEhDSEVJR0hUOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JOVU1JTlNUQU5DRVMgPSBSRUZBR0dOSU5TVDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCU1RSSVBTID0gMTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCTlVNU1lNUyA9IFNETlVNSU5TWU1TICsgTlNZTVNERUNPREVEOwotICAgICAgICAgICAgICAgICAgICBTQk5VTVNZTVMgPSBwRGVjb2Rlci0+U0JOVU1TWU1TOwotICAgICAgICAgICAgICAgICAgICBTQlNZTUNPREVTID0gKEpCaWcySHVmZm1hbkNvZGUqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihTQk5VTVNZTVMsIHNpemVvZihKQmlnMkh1ZmZtYW5Db2RlKSk7Ci0gICAgICAgICAgICAgICAgICAgIG5UbXAgPSAxOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSgoRlhfRFdPUkQpKDEgPDwgblRtcCkgPCBTQk5VTVNZTVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5UbXAgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yKEkgPSAwOyBJIDwgU0JOVU1TWU1TOyBJKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCU1lNQ09ERVNbSV0uY29kZWxlbiA9IG5UbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTQlNZTUNPREVTW0ldLmNvZGUgPSBJOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlNZTUNPREVTID0gU0JTWU1DT0RFUzsKLSAgICAgICAgICAgICAgICAgICAgU0JTWU1TID0gKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihTQk5VTVNZTVMsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMsIFNESU5TWU1TLCBTRE5VTUlOU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMgKyBTRE5VTUlOU1lNUywgU0RORVdTWU1TLCBOU1lNU0RFQ09ERUQgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JTWU1TID0gU0JTWU1TOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JERUZQSVhFTCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkNPTUJPUCA9IEpCSUcyX0NPTVBPU0VfT1I7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5UUkFOU1BPU0VEID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlJFRkNPUk5FUiA9IEpCSUcyX0NPUk5FUl9UT1BMRUZUOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JEU09GRlNFVCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRkZTLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CNikgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjYpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGRFMsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0I4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0I4KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9COCkpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhTQkhVRkZEVCwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxMSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjExKSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRlJEVywgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRlJESCwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRlJEWCwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRlJEWSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRlJTSVpFLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjEpKTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSFVGRkZTID0gU0JIVUZGRlM7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZEUyA9IFNCSFVGRkRTOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGRFQgPSBTQkhVRkZEVDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJEVyA9IFNCSFVGRlJEVzsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJESCA9IFNCSFVGRlJESDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJEWCA9IFNCSFVGRlJEWDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJEWSA9IFNCSFVGRlJEWTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJTSVpFID0gU0JIVUZGUlNJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlJURU1QTEFURSA9IFNEUlRFTVBMQVRFOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JSQVRbMF0gPSBTRFJBVFswXTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCUkFUWzFdID0gU0RSQVRbMV07Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlJBVFsyXSA9IFNEUkFUWzJdOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JSQVRbM10gPSBTRFJBVFszXTsKLSAgICAgICAgICAgICAgICAgICAgQlMgPSBwRGVjb2Rlci0+ZGVjb2RlX0h1ZmZtYW4ocFN0cmVhbSwgZ3JDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYoQlMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNQ09ERVMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGRlM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGRFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGRFQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRXOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJESDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRZOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJTSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBEZWNvZGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNQ09ERVMpOwotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRkZTOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGRFM7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZEVDsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEVzsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJESDsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEWDsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEWTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJTSVpFOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcERlY29kZXI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKFJFRkFHR05JTlNUID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgU0JOVU1TWU1TID0gU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVM7Ci0gICAgICAgICAgICAgICAgICAgIG5UbXAgPSAxOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSgoRlhfRFdPUkQpKDEgPDwgblRtcCkgPCBTQk5VTVNZTVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5UbXAgKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU0JTWU1DT0RFTEVOID0gKHVpbnQ4X3QpblRtcDsKLSAgICAgICAgICAgICAgICAgICAgU0JTWU1DT0RFUyA9IChKQmlnMkh1ZmZtYW5Db2RlKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoU0JOVU1TWU1TLCBzaXplb2YoSkJpZzJIdWZmbWFuQ29kZSkpOwotICAgICAgICAgICAgICAgICAgICBmb3IoSSA9IDA7IEkgPCBTQk5VTVNZTVM7IEkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU0JTWU1DT0RFU1tJXS5jb2RlbGVuID0gU0JTWU1DT0RFTEVOOwotICAgICAgICAgICAgICAgICAgICAgICAgU0JTWU1DT0RFU1tJXS5jb2RlID0gSTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbkJpdHMgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBTdHJlYW0tPnJlYWQxQml0KCZuVG1wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNQ09ERVMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5WYWwgPSAoblZhbCA8PCAxKSB8IG5UbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoSURJID0gMDsgSURJIDwgU0JOVU1TWU1TOyBJREkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChuVmFsID09IFNCU1lNQ09ERVNbSURJXS5jb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG5CaXRzID09IFNCU1lNQ09ERVNbSURJXS5jb2RlbGVuKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihJREkgPCBTQk5VTVNZTVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1DT0RFUyk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRlJEWCwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRlJTSVpFLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJEWCwgJlJEWEkpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJEWCwgJlJEWUkpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJTSVpFLCAmblZhbCkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUlNJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRYOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUlNJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgICAgICAgICAgICAgICBuVG1wID0gcFN0cmVhbS0+Z2V0T2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNCU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoU0JOVU1TWU1TLCBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TLCBTRElOU1lNUywgU0ROVU1JTlNZTVMgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TICsgU0ROVU1JTlNZTVMsIFNETkVXU1lNUywgTlNZTVNERUNPREVEICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MocEdSUkQsIENKQmlnMl9HUlJEUHJvYygpKTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSVyA9IFNZTVdJRFRIOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+R1JIID0gSENIRUlHSFQ7Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUlRFTVBMQVRFID0gU0RSVEVNUExBVEU7Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRSA9IFNCU1lNU1tJREldOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWCA9IFJEWEk7Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRURZID0gUkRZSTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPlRQR1JPTiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUkFUWzBdID0gU0RSQVRbMF07Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUkFUWzFdID0gU0RSQVRbMV07Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUkFUWzJdID0gU0RSQVRbMl07Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUkFUWzNdID0gU0RSQVRbM107Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKHBBcml0aERlY29kZXIsIENKQmlnMl9Bcml0aERlY29kZXIocFN0cmVhbSkpOwotICAgICAgICAgICAgICAgICAgICBCUyA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYoQlMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEdSUkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEFyaXRoRGVjb2RlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5vZmZzZXQoMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmKChGWF9EV09SRCluVmFsICE9IChwU3RyZWFtLT5nZXRPZmZzZXQoKSAtIG5UbXApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgQlM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwR1JSRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwQXJpdGhEZWNvZGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKToiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyBwcm9jZXNzZWQgYnkgZ2VuZXJpYyByZWZpbmVtZW50IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgZG9lc24ndCBlcXVhbCBTQkhVRkZSU0laRS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTVMpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEdSUkQ7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwQXJpdGhEZWNvZGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTRE5FV1NZTVNbTlNZTVNERUNPREVEXSA9IEJTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoU0RSRUZBR0cgPT0gMCkgewotICAgICAgICAgICAgICAgIFNETkVXU1lNV0lEVEhTW05TWU1TREVDT0RFRF0gPSBTWU1XSURUSDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5TWU1TREVDT0RFRCA9IE5TWU1TREVDT0RFRCArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoU0RSRUZBR0cgPT0gMCkgewotICAgICAgICAgICAgaWYocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0RIVUZGQk1TSVpFLCAoaW50MzJfdCopJkJNU0laRSkgIT0gMCkgewotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgICAgICAgaWYoQk1TSVpFID09IDApIHsKLSAgICAgICAgICAgICAgICBzdHJpZGUgPSAoVE9UV0lEVEggKyA3KSA+PiAzOwotICAgICAgICAgICAgICAgIGlmKHBTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPj0gc3RyaWRlICogSENIRUlHSFQpIHsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoQkhDLCBDSkJpZzJfSW1hZ2UoVE9UV0lEVEgsIEhDSEVJR0hUKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihJID0gMDsgSSA8IEhDSEVJR0hUOyBJICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKQklHMl9tZW1jcHkoQkhDLT5tX3BEYXRhICsgSSAqIEJIQy0+bV9uU3RyaWRlLCBwU3RyZWFtLT5nZXRQb2ludGVyKCksIHN0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5vZmZzZXQoc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhwR1JELCBDSkJpZzJfR1JEUHJvYygpKTsKLSAgICAgICAgICAgICAgICBwR1JELT5NTVIgPSAxOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCVyA9IFRPVFdJRFRIOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCSCA9IEhDSEVJR0hUOwotICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IHBHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJkJIQywgcFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgd2hpbGUoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgcEdSRC0+Q29udGludWVfZGVjb2RlKHBQYXVzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlbGV0ZSBwR1JEOwotICAgICAgICAgICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgblRtcCA9IDA7Ci0gICAgICAgICAgICBpZiAoIUJIQykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKEkgPSBIQ0ZJUlNUU1lNOyBJIDwgTlNZTVNERUNPREVEOyBJKyspIHsKLSAgICAgICAgICAgICAgICBTRE5FV1NZTVNbSV0gPSBCSEMtPnN1YkltYWdlKG5UbXAsIDAsIFNETkVXU1lNV0lEVEhTW0ldLCBIQ0hFSUdIVCk7Ci0gICAgICAgICAgICAgICAgblRtcCArPSBTRE5FV1NZTVdJRFRIU1tJXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZSBCSEM7Ci0gICAgICAgICAgICBCSEMgPSBOVUxMOwotICAgICAgICB9CisgICAgaWYgKElBREgtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmSENESCkgPT0gLTEpIHsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7CisgICAgICBnb3RvIGZhaWxlZDsKICAgICB9Ci0gICAgRVhJTkRFWCA9IDA7Ci0gICAgQ1VSRVhGTEFHID0gMDsKLSAgICBKQklHMl9BTExPQyhwVGFibGUsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOwotICAgIEVYRkxBR1MgPSAoRlhfQk9PTCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihGWF9CT09MKSwgKFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSk7Ci0gICAgd2hpbGUoRVhJTkRFWCA8IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSB7Ci0gICAgICAgIGlmKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKHBUYWJsZSwgKGludCopJkVYUlVOTEVOR1RIKSAhPSAwKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFRhYmxlOwotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEVYRkxBR1MpOwotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEVYSU5ERVggKyBFWFJVTkxFTkdUSCA+IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFRhYmxlOwotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEVYRkxBR1MpOwotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IEludmFsaWQgRVhSVU5MRU5HVEggdmFsdWUuIik7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBpZihFWFJVTkxFTkdUSCAhPSAwKSB7Ci0gICAgICAgICAgICBmb3IoSSA9IEVYSU5ERVg7IEkgPCBFWElOREVYICsgRVhSVU5MRU5HVEg7IEkrKykgewotICAgICAgICAgICAgICAgIEVYRkxBR1NbSV0gPSBDVVJFWEZMQUc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRVhJTkRFWCA9IEVYSU5ERVggKyBFWFJVTkxFTkdUSDsKLSAgICAgICAgQ1VSRVhGTEFHID0gIUNVUkVYRkxBRzsKKyAgICBIQ0hFSUdIVCA9IEhDSEVJR0hUICsgSENESDsKKyAgICBpZiAoKGludClIQ0hFSUdIVCA8IDAgfHwgKGludClIQ0hFSUdIVCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKSB7CisgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogaW52YWxpZCBIQ0hFSUdIVCAiCisgICAgICAgICAgInZhbHVlLiIpOworICAgICAgZ290byBmYWlsZWQ7CiAgICAgfQotICAgIGRlbGV0ZSBwVGFibGU7Ci0gICAgSkJJRzJfQUxMT0MocERpY3QsIENKQmlnMl9TeW1ib2xEaWN0KCkpOwotICAgIHBEaWN0LT5TRE5VTUVYU1lNUyA9IFNETlVNRVhTWU1TOwotICAgIHBEaWN0LT5TREVYU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKENKQmlnMl9JbWFnZSopLCBTRE5VTUVYU1lNUyk7Ci0gICAgSSA9IEogPSAwOwotICAgIGZvcihJID0gMDsgSSA8IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TOyBJKyspIHsKLSAgICAgICAgaWYoRVhGTEFHU1tJXSAmJiBKIDwgU0ROVU1FWFNZTVMpIHsKLSAgICAgICAgICAgIGlmKEkgPCBTRE5VTUlOU1lNUykgewotICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKHBEaWN0LT5TREVYU1lNU1tKXSwgQ0pCaWcyX0ltYWdlKCpTRElOU1lNU1tJXSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwRGljdC0+U0RFWFNZTVNbSl0gPSBTRE5FV1NZTVNbSSAtIFNETlVNSU5TWU1TXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEogPSBKICsgMTsKLSAgICAgICAgfSBlbHNlIGlmICghRVhGTEFHU1tJXSAmJiBJID49IFNETlVNSU5TWU1TKSB7Ci0gICAgICAgICAgICBkZWxldGUgU0RORVdTWU1TW0kgLSBTRE5VTUlOU1lNU107Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKEogPCBTRE5VTUVYU1lNUykgewotICAgICAgICBwRGljdC0+U0ROVU1FWFNZTVMgPSBKOwotICAgIH0KLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoRVhGTEFHUyk7Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNETkVXU1lNUyk7Ci0gICAgaWYoU0RSRUZBR0cgPT0gMCkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0RORVdTWU1XSURUSFMpOwotICAgIH0KLSAgICBkZWxldGUgcEh1ZmZtYW5EZWNvZGVyOwotICAgIHJldHVybiBwRGljdDsKLWZhaWxlZDoKLSAgICBmb3IoSSA9IDA7IEkgPCBOU1lNU0RFQ09ERUQ7IEkrKykgewotICAgICAgICBkZWxldGUgU0RORVdTWU1TW0ldOwotICAgIH0KLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0RORVdTWU1TKTsKLSAgICBpZihTRFJFRkFHRyA9PSAwKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRE5FV1NZTVdJRFRIUyk7Ci0gICAgfQotICAgIGRlbGV0ZSBwSHVmZm1hbkRlY29kZXI7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9IVFJEUHJvYzo6ZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsCi0gICAgICAgIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfRFdPUkQgbmcsIG1nOwotICAgIGludDMyX3QgeCwgeTsKLSAgICBDSkJpZzJfSW1hZ2UgKkhTS0lQOwotICAgIEZYX0RXT1JEIEhCUFA7Ci0gICAgRlhfRFdPUkQgKkdJOwotICAgIENKQmlnMl9JbWFnZSAqSFRSRUc7Ci0gICAgQ0pCaWcyX0dTSURQcm9jICpwR0lEOwotICAgIEpCSUcyX0FMTE9DKEhUUkVHLCBDSkJpZzJfSW1hZ2UoSEJXLCBIQkgpKTsKLSAgICBIVFJFRy0+ZmlsbChIREVGUElYRUwpOwotICAgIEhTS0lQID0gTlVMTDsKLSAgICBpZihIRU5BQkxFU0tJUCA9PSAxKSB7Ci0gICAgICAgIEpCSUcyX0FMTE9DKEhTS0lQLCBDSkJpZzJfSW1hZ2UoSEdXLCBIR0gpKTsKLSAgICAgICAgZm9yKG1nID0gMDsgbWcgPCBIR0g7IG1nKyspIHsKLSAgICAgICAgICAgIGZvcihuZyA9IDA7IG5nIDwgSEdXOyBuZysrKSB7Ci0gICAgICAgICAgICAgICAgeCA9IChIR1ggKyBtZyAqIEhSWSArIG5nICogSFJYKSA+PiA4OwotICAgICAgICAgICAgICAgIHkgPSAoSEdZICsgbWcgKiBIUlggLSBuZyAqIEhSWSkgPj4gODsKLSAgICAgICAgICAgICAgICBpZigoeCArIEhQVyA8PSAwKSB8ICh4ID49IChpbnQzMl90KUhCVykKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgKHkgKyBIUEggPD0gMCkgfCAoeSA+PSAoaW50MzJfdClIUEgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhTS0lQLT5zZXRQaXhlbChuZywgbWcsIDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEhTS0lQLT5zZXRQaXhlbChuZywgbWcsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBIQlBQID0gMTsKLSAgICB3aGlsZSgoRlhfRFdPUkQpKDEgPDwgSEJQUCkgPCBITlVNUEFUUykgewotICAgICAgICBIQlBQICsrOwotICAgIH0KLSAgICBKQklHMl9BTExPQyhwR0lELCBDSkJpZzJfR1NJRFByb2MoKSk7Ci0gICAgcEdJRC0+R1NNTVIgPSBITU1SOwotICAgIHBHSUQtPkdTVyA9IEhHVzsKLSAgICBwR0lELT5HU0ggPSBIR0g7Ci0gICAgcEdJRC0+R1NCUFAgPSAodWludDhfdClIQlBQOwotICAgIHBHSUQtPkdTVVNFU0tJUCA9IEhFTkFCTEVTS0lQOwotICAgIHBHSUQtPkdTS0lQID0gSFNLSVA7Ci0gICAgcEdJRC0+R1NURU1QTEFURSA9IEhURU1QTEFURTsKLSAgICBHSSA9IHBHSUQtPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgaWYoR0kgPT0gTlVMTCkgeworICAgIFNZTVdJRFRIID0gMDsKKyAgICBUT1RXSURUSCA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgblZhbCA9IElBRFctPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmRFcpOworICAgICAgaWYgKG5WYWwgPT0gSkJJRzJfT09CKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIGlmIChuVmFsICE9IDApIHsKKyAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOwogICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgZm9yKG1nID0gMDsgbWcgPCBIR0g7IG1nKyspIHsKLSAgICAgICAgZm9yKG5nID0gMDsgbmcgPCBIR1c7IG5nKyspIHsKLSAgICAgICAgICAgIHggPSAoSEdYICsgbWcgKiBIUlkgKyBuZyAqIEhSWCkgPj4gODsKLSAgICAgICAgICAgIHkgPSAoSEdZICsgbWcgKiBIUlggLSBuZyAqIEhSWSkgPj4gODsKLSAgICAgICAgICAgIEZYX0RXT1JEIHBhdF9pbmRleCA9IEdJW21nICogSEdXICsgbmddOwotICAgICAgICAgICAgaWYgKHBhdF9pbmRleCA+PSBITlVNUEFUUykgewotICAgICAgICAgICAgICAgIHBhdF9pbmRleCA9IEhOVU1QQVRTIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEhUUkVHLT5jb21wb3NlRnJvbSh4LCB5LCBIUEFUU1twYXRfaW5kZXhdLCBIQ09NQk9QKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChOU1lNU0RFQ09ERUQgPj0gU0ROVU1ORVdTWU1TKSB7CisgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiBOU1lNU0RFQ09ERUQgPj0gIgorICAgICAgICAgICAgICAiU0ROVU1ORVdTWU1TLiIpOworICAgICAgICAgIGdvdG8gZmFpbGVkOwogICAgICAgICB9Ci0gICAgfQotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShHSSk7Ci0gICAgZGVsZXRlIEhTS0lQOwotICAgIGRlbGV0ZSBwR0lEOwotICAgIHJldHVybiBIVFJFRzsKLWZhaWxlZDoKLSAgICBkZWxldGUgSFNLSVA7Ci0gICAgZGVsZXRlIHBHSUQ7Ci0gICAgZGVsZXRlIEhUUkVHOwotICAgIHJldHVybiBOVUxMOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfSFRSRFByb2M6OmRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfRFdPUkQgbmcsIG1nOwotICAgIGludDMyX3QgeCwgeTsKLSAgICBGWF9EV09SRCBIQlBQOwotICAgIEZYX0RXT1JEICpHSTsKLSAgICBDSkJpZzJfSW1hZ2UgKkhUUkVHOwotICAgIENKQmlnMl9HU0lEUHJvYyAqcEdJRDsKLSAgICBKQklHMl9BTExPQyhIVFJFRywgQ0pCaWcyX0ltYWdlKEhCVywgSEJIKSk7Ci0gICAgSFRSRUctPmZpbGwoSERFRlBJWEVMKTsKLSAgICBIQlBQID0gMTsKLSAgICB3aGlsZSgoRlhfRFdPUkQpKDEgPDwgSEJQUCkgPCBITlVNUEFUUykgewotICAgICAgICBIQlBQICsrOwotICAgIH0KLSAgICBKQklHMl9BTExPQyhwR0lELCBDSkJpZzJfR1NJRFByb2MoKSk7Ci0gICAgcEdJRC0+R1NNTVIgPSBITU1SOwotICAgIHBHSUQtPkdTVyA9IEhHVzsKLSAgICBwR0lELT5HU0ggPSBIR0g7Ci0gICAgcEdJRC0+R1NCUFAgPSAodWludDhfdClIQlBQOwotICAgIHBHSUQtPkdTVVNFU0tJUCA9IDA7Ci0gICAgR0kgPSBwR0lELT5kZWNvZGVfTU1SKHBTdHJlYW0sIHBQYXVzZSk7Ci0gICAgaWYoR0kgPT0gTlVMTCkgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgZm9yKG1nID0gMDsgbWcgPCBIR0g7IG1nKyspIHsKLSAgICAgICAgZm9yKG5nID0gMDsgbmcgPCBIR1c7IG5nKyspIHsKLSAgICAgICAgICAgIHggPSAoSEdYICsgbWcgKiBIUlkgKyBuZyAqIEhSWCkgPj4gODsKLSAgICAgICAgICAgIHkgPSAoSEdZICsgbWcgKiBIUlggLSBuZyAqIEhSWSkgPj4gODsKLSAgICAgICAgICAgIEZYX0RXT1JEIHBhdF9pbmRleCA9IEdJW21nICogSEdXICsgbmddOwotICAgICAgICAgICAgaWYgKHBhdF9pbmRleCA+PSBITlVNUEFUUykgewotICAgICAgICAgICAgICAgIHBhdF9pbmRleCA9IEhOVU1QQVRTIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEhUUkVHLT5jb21wb3NlRnJvbSh4LCB5LCBIUEFUU1twYXRfaW5kZXhdLCBIQ09NQk9QKTsKKyAgICAgICAgU1lNV0lEVEggPSBTWU1XSURUSCArIERXOworICAgICAgICBpZiAoKGludClTWU1XSURUSCA8IDAgfHwgKGludClTWU1XSURUSCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKSB7CisgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiBpbnZhbGlkIFNZTVdJRFRIICIKKyAgICAgICAgICAgICAgInZhbHVlLiIpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9IGVsc2UgaWYgKEhDSEVJR0hUID09IDAgfHwgU1lNV0lEVEggPT0gMCkgeworICAgICAgICAgIFRPVFdJRFRIID0gVE9UV0lEVEggKyBTWU1XSURUSDsKKyAgICAgICAgICBTRE5FV1NZTVNbTlNZTVNERUNPREVEXSA9IE5VTEw7CisgICAgICAgICAgTlNZTVNERUNPREVEID0gTlNZTVNERUNPREVEICsgMTsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgIH0KLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR0kpOwotICAgIGRlbGV0ZSBwR0lEOwotICAgIHJldHVybiBIVFJFRzsKLWZhaWxlZDoKLSAgICBkZWxldGUgcEdJRDsKLSAgICBkZWxldGUgSFRSRUc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DSkJpZzJfUGF0dGVybkRpY3QgKkNKQmlnMl9QRERQcm9jOjpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwKLSAgICAgICAgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9EV09SRCBHUkFZOwotICAgIENKQmlnMl9JbWFnZSAqQkhEQyA9IE5VTEw7Ci0gICAgQ0pCaWcyX1BhdHRlcm5EaWN0ICpwRGljdDsKLSAgICBDSkJpZzJfR1JEUHJvYyAqcEdSRDsKLSAgICBKQklHMl9BTExPQyhwRGljdCwgQ0pCaWcyX1BhdHRlcm5EaWN0KCkpOwotICAgIHBEaWN0LT5OVU1QQVRTID0gR1JBWU1BWCArIDE7Ci0gICAgcERpY3QtPkhEUEFUUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKENKQmlnMl9JbWFnZSopLCBwRGljdC0+TlVNUEFUUyk7Ci0gICAgSkJJRzJfbWVtc2V0KHBEaWN0LT5IRFBBVFMsIDAsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSpwRGljdC0+TlVNUEFUUyk7Ci0gICAgSkJJRzJfQUxMT0MocEdSRCwgQ0pCaWcyX0dSRFByb2MoKSk7Ci0gICAgcEdSRC0+TU1SID0gSERNTVI7Ci0gICAgcEdSRC0+R0JXID0gKEdSQVlNQVggKyAxKSAqIEhEUFc7Ci0gICAgcEdSRC0+R0JIID0gSERQSDsKLSAgICBwR1JELT5HQlRFTVBMQVRFID0gSERURU1QTEFURTsKLSAgICBwR1JELT5UUEdET04gPSAwOwotICAgIHBHUkQtPlVTRVNLSVAgPSAwOwotICAgIHBHUkQtPkdCQVRbMF0gPSAtKGludDMyX3QpSERQVzsKLSAgICBwR1JELT5HQkFUWzFdID0gMDsKLSAgICBpZihwR1JELT5HQlRFTVBMQVRFID09IDApIHsKLSAgICAgICAgcEdSRC0+R0JBVFsyXSA9IC0zOwotICAgICAgICBwR1JELT5HQkFUWzNdID0gLTE7Ci0gICAgICAgIHBHUkQtPkdCQVRbNF0gPSAyOwotICAgICAgICBwR1JELT5HQkFUWzVdID0gLTI7Ci0gICAgICAgIHBHUkQtPkdCQVRbNl0gPSAtMjsKLSAgICAgICAgcEdSRC0+R0JBVFs3XSA9IC0yOwotICAgIH0KLSAgICBGWENPREVDX1NUQVRVUyBzdGF0dXMgPSBwR1JELT5TdGFydF9kZWNvZGVfQXJpdGgoJkJIREMsIHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7Ci0gICAgd2hpbGUoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgcEdSRC0+Q29udGludWVfZGVjb2RlKHBQYXVzZSk7Ci0gICAgfQotICAgIGlmKEJIREMgPT0gTlVMTCkgeworICAgICAgICBUT1RXSURUSCA9IFRPVFdJRFRIICsgU1lNV0lEVEg7CisgICAgICB9CisgICAgICBpZiAoU0RSRUZBR0cgPT0gMCkgeworICAgICAgICBKQklHMl9BTExPQyhwR1JELCBDSkJpZzJfR1JEUHJvYygpKTsKKyAgICAgICAgcEdSRC0+TU1SID0gMDsKKyAgICAgICAgcEdSRC0+R0JXID0gU1lNV0lEVEg7CisgICAgICAgIHBHUkQtPkdCSCA9IEhDSEVJR0hUOworICAgICAgICBwR1JELT5HQlRFTVBMQVRFID0gU0RURU1QTEFURTsKKyAgICAgICAgcEdSRC0+VFBHRE9OID0gMDsKKyAgICAgICAgcEdSRC0+VVNFU0tJUCA9IDA7CisgICAgICAgIHBHUkQtPkdCQVRbMF0gPSBTREFUWzBdOworICAgICAgICBwR1JELT5HQkFUWzFdID0gU0RBVFsxXTsKKyAgICAgICAgcEdSRC0+R0JBVFsyXSA9IFNEQVRbMl07CisgICAgICAgIHBHUkQtPkdCQVRbM10gPSBTREFUWzNdOworICAgICAgICBwR1JELT5HQkFUWzRdID0gU0RBVFs0XTsKKyAgICAgICAgcEdSRC0+R0JBVFs1XSA9IFNEQVRbNV07CisgICAgICAgIHBHUkQtPkdCQVRbNl0gPSBTREFUWzZdOworICAgICAgICBwR1JELT5HQkFUWzddID0gU0RBVFs3XTsKKyAgICAgICAgQlMgPSBwR1JELT5kZWNvZGVfQXJpdGgocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKKyAgICAgICAgaWYgKEJTID09IE5VTEwpIHsKKyAgICAgICAgICBkZWxldGUgcEdSRDsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQogICAgICAgICBkZWxldGUgcEdSRDsKLSAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoSUFBSS0+ZGVjb2RlKHBBcml0aERlY29kZXIsIChpbnQqKSZSRUZBR0dOSU5TVCkgPT0gLTEpIHsKKyAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IHRvbyBzaG9ydC4iKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUkVGQUdHTklOU1QgPiAxKSB7CisgICAgICAgICAgQ0pCaWcyX1RSRFByb2MqIHBEZWNvZGVyOworICAgICAgICAgIEpCSUcyX0FMTE9DKHBEZWNvZGVyLCBDSkJpZzJfVFJEUHJvYygpKTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGID0gU0RIVUZGOworICAgICAgICAgIHBEZWNvZGVyLT5TQlJFRklORSA9IDE7CisgICAgICAgICAgcERlY29kZXItPlNCVyA9IFNZTVdJRFRIOworICAgICAgICAgIHBEZWNvZGVyLT5TQkggPSBIQ0hFSUdIVDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JOVU1JTlNUQU5DRVMgPSBSRUZBR0dOSU5TVDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JTVFJJUFMgPSAxOworICAgICAgICAgIHBEZWNvZGVyLT5TQk5VTVNZTVMgPSBTRE5VTUlOU1lNUyArIE5TWU1TREVDT0RFRDsKKyAgICAgICAgICBTQk5VTVNZTVMgPSBwRGVjb2Rlci0+U0JOVU1TWU1TOworICAgICAgICAgIG5UbXAgPSAwOworICAgICAgICAgIHdoaWxlICgoRlhfRFdPUkQpKDEgPDwgblRtcCkgPCBTQk5VTVNZTVMpIHsKKyAgICAgICAgICAgIG5UbXArKzsKKyAgICAgICAgICB9CisgICAgICAgICAgU0JTWU1DT0RFTEVOID0gKHVpbnQ4X3QpblRtcDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JTWU1DT0RFTEVOID0gU0JTWU1DT0RFTEVOOworICAgICAgICAgIFNCU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoCisgICAgICAgICAgICAgIFNCTlVNU1lNUywgc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TLCBTRElOU1lNUywgU0ROVU1JTlNZTVMgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOworICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMgKyBTRE5VTUlOU1lNUywgU0RORVdTWU1TLAorICAgICAgICAgICAgICAgICAgICAgICBOU1lNU0RFQ09ERUQgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOworICAgICAgICAgIHBEZWNvZGVyLT5TQlNZTVMgPSBTQlNZTVM7CisgICAgICAgICAgcERlY29kZXItPlNCREVGUElYRUwgPSAwOworICAgICAgICAgIHBEZWNvZGVyLT5TQkNPTUJPUCA9IEpCSUcyX0NPTVBPU0VfT1I7CisgICAgICAgICAgcERlY29kZXItPlRSQU5TUE9TRUQgPSAwOworICAgICAgICAgIHBEZWNvZGVyLT5SRUZDT1JORVIgPSBKQklHMl9DT1JORVJfVE9QTEVGVDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JEU09GRlNFVCA9IDA7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGRlMsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0I2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjYpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjYpKTsKKyAgICAgICAgICBKQklHMl9BTExPQyhTQkhVRkZEUywgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9COCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9COCkpOworICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRkRULCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTEpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjExKSk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRXLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRILCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRYLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRZLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUlNJWkUsCisgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZGUyA9IFNCSFVGRkZTOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZEUyA9IFNCSFVGRkRTOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZEVCA9IFNCSFVGRkRUOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSRFcgPSBTQkhVRkZSRFc7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJESCA9IFNCSFVGRlJESDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRYID0gU0JIVUZGUkRYOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSRFkgPSBTQkhVRkZSRFk7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJTSVpFID0gU0JIVUZGUlNJWkU7CisgICAgICAgICAgcERlY29kZXItPlNCUlRFTVBMQVRFID0gU0RSVEVNUExBVEU7CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzBdID0gU0RSQVRbMF07CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzFdID0gU0RSQVRbMV07CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzJdID0gU0RSQVRbMl07CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzNdID0gU0RSQVRbM107CisgICAgICAgICAgSkJpZzJJbnREZWNvZGVyU3RhdGUgaWRzOworICAgICAgICAgIGlkcy5JQURUID0gSUFEVDsKKyAgICAgICAgICBpZHMuSUFGUyA9IElBRlM7CisgICAgICAgICAgaWRzLklBRFMgPSBJQURTOworICAgICAgICAgIGlkcy5JQUlUID0gSUFJVDsKKyAgICAgICAgICBpZHMuSUFSSSA9IElBUkk7CisgICAgICAgICAgaWRzLklBUkRXID0gSUFSRFc7CisgICAgICAgICAgaWRzLklBUkRIID0gSUFSREg7CisgICAgICAgICAgaWRzLklBUkRYID0gSUFSRFg7CisgICAgICAgICAgaWRzLklBUkRZID0gSUFSRFk7CisgICAgICAgICAgaWRzLklBSUQgPSBJQUlEOworICAgICAgICAgIEJTID0gcERlY29kZXItPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQsICZpZHMpOworICAgICAgICAgIGlmIChCUyA9PSBOVUxMKSB7CisgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKKyAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZGUzsKKyAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZEUzsKKyAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZEVDsKKyAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFc7CisgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRIOworICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEWDsKKyAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFk7CisgICAgICAgICAgICBkZWxldGUgU0JIVUZGUlNJWkU7CisgICAgICAgICAgICBkZWxldGUgcERlY29kZXI7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7CisgICAgICAgICAgZGVsZXRlIFNCSFVGRkZTOworICAgICAgICAgIGRlbGV0ZSBTQkhVRkZEUzsKKyAgICAgICAgICBkZWxldGUgU0JIVUZGRFQ7CisgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEVzsKKyAgICAgICAgICBkZWxldGUgU0JIVUZGUkRIOworICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFg7CisgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEWTsKKyAgICAgICAgICBkZWxldGUgU0JIVUZGUlNJWkU7CisgICAgICAgICAgZGVsZXRlIHBEZWNvZGVyOworICAgICAgICB9IGVsc2UgaWYgKFJFRkFHR05JTlNUID09IDEpIHsKKyAgICAgICAgICBTQk5VTVNZTVMgPSBTRE5VTUlOU1lNUyArIE5TWU1TREVDT0RFRDsKKyAgICAgICAgICBpZiAoSUFJRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIChpbnQqKSZJREkpID09IC0xKSB7CisgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgICAgICJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoSUFSRFgtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmUkRYSSkgPT0gLTEpIHx8CisgICAgICAgICAgICAgIChJQVJEWS0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZSRFlJKSA9PSAtMSkpIHsKKyAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKElESSA+PSBTQk5VTVNZTVMpIHsKKyAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiIKKyAgICAgICAgICAgICAgICAiIHJlZmluZW1lbnQgcmVmZXJlbmNlcyB1bmtub3duIHN5bWJvbCAlZCIsCisgICAgICAgICAgICAgICAgSURJKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgIH0KKyAgICAgICAgICBTQlNZTVMgPSAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKAorICAgICAgICAgICAgICBTQk5VTVNZTVMsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7CisgICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUywgU0RJTlNZTVMsIFNETlVNSU5TWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TICsgU0ROVU1JTlNZTVMsIFNETkVXU1lNUywKKyAgICAgICAgICAgICAgICAgICAgICAgTlNZTVNERUNPREVEICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgICAgICAgICBpZiAoIVNCU1lNU1tJREldKSB7CisgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgIH0KKyAgICAgICAgICBKQklHMl9BTExPQyhwR1JSRCwgQ0pCaWcyX0dSUkRQcm9jKCkpOworICAgICAgICAgIHBHUlJELT5HUlcgPSBTWU1XSURUSDsKKyAgICAgICAgICBwR1JSRC0+R1JIID0gSENIRUlHSFQ7CisgICAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTRFJURU1QTEFURTsKKyAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0UgPSBTQlNZTVNbSURJXTsKKyAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWCA9IFJEWEk7CisgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFRFkgPSBSRFlJOworICAgICAgICAgIHBHUlJELT5UUEdST04gPSAwOworICAgICAgICAgIHBHUlJELT5HUkFUWzBdID0gU0RSQVRbMF07CisgICAgICAgICAgcEdSUkQtPkdSQVRbMV0gPSBTRFJBVFsxXTsKKyAgICAgICAgICBwR1JSRC0+R1JBVFsyXSA9IFNEUkFUWzJdOworICAgICAgICAgIHBHUlJELT5HUkFUWzNdID0gU0RSQVRbM107CisgICAgICAgICAgQlMgPSBwR1JSRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7CisgICAgICAgICAgaWYgKEJTID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTVMpOworICAgICAgICAgICAgZGVsZXRlIHBHUlJEOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTVMpOworICAgICAgICAgIGRlbGV0ZSBwR1JSRDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgU0RORVdTWU1TW05TWU1TREVDT0RFRF0gPSBCUzsKKyAgICAgIEJTID0gTlVMTDsKKyAgICAgIE5TWU1TREVDT0RFRCA9IE5TWU1TREVDT0RFRCArIDE7CiAgICAgfQotICAgIGRlbGV0ZSBwR1JEOwotICAgIEdSQVkgPSAwOwotICAgIHdoaWxlKEdSQVkgPD0gR1JBWU1BWCkgewotICAgICAgICBwRGljdC0+SERQQVRTW0dSQVldID0gQkhEQy0+c3ViSW1hZ2UoSERQVyAqIEdSQVksIDAsIEhEUFcsIEhEUEgpOwotICAgICAgICBHUkFZID0gR1JBWSArIDE7CisgIH0KKyAgRVhJTkRFWCA9IDA7CisgIENVUkVYRkxBRyA9IDA7CisgIEVYRkxBR1MgPSAoRlhfQk9PTCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihGWF9CT09MKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSk7CisgIHdoaWxlIChFWElOREVYIDwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKKyAgICBpZiAoSUFFWC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIChpbnQqKSZFWFJVTkxFTkdUSCkgPT0gLTEpIHsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShFWEZMQUdTKTsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7CisgICAgICBnb3RvIGZhaWxlZDsKICAgICB9Ci0gICAgZGVsZXRlIEJIREM7Ci0gICAgcmV0dXJuIHBEaWN0OworICAgIGlmIChFWElOREVYICsgRVhSVU5MRU5HVEggPiBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykgeworICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEVYRkxBR1MpOworICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IEludmFsaWQgRVhSVU5MRU5HVEggIgorICAgICAgICAgICJ2YWx1ZS4iKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgICBpZiAoRVhSVU5MRU5HVEggIT0gMCkgeworICAgICAgZm9yIChJID0gRVhJTkRFWDsgSSA8IEVYSU5ERVggKyBFWFJVTkxFTkdUSDsgSSsrKSB7CisgICAgICAgIEVYRkxBR1NbSV0gPSBDVVJFWEZMQUc7CisgICAgICB9CisgICAgfQorICAgIEVYSU5ERVggPSBFWElOREVYICsgRVhSVU5MRU5HVEg7CisgICAgQ1VSRVhGTEFHID0gIUNVUkVYRkxBRzsKKyAgfQorICBKQklHMl9BTExPQyhwRGljdCwgQ0pCaWcyX1N5bWJvbERpY3QoKSk7CisgIHBEaWN0LT5TRE5VTUVYU1lNUyA9IFNETlVNRVhTWU1TOworICBwRGljdC0+U0RFWFNZTVMgPSAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKAorICAgICAgc2l6ZW9mKENKQmlnMl9JbWFnZSopLCBTRE5VTUVYU1lNUyk7CisgIEkgPSBKID0gMDsKKyAgZm9yIChJID0gMDsgSSA8IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TOyBJKyspIHsKKyAgICBpZiAoRVhGTEFHU1tJXSAmJiBKIDwgU0ROVU1FWFNZTVMpIHsKKyAgICAgIGlmIChJIDwgU0ROVU1JTlNZTVMpIHsKKyAgICAgICAgSkJJRzJfQUxMT0MocERpY3QtPlNERVhTWU1TW0pdLCBDSkJpZzJfSW1hZ2UoKlNESU5TWU1TW0ldKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwRGljdC0+U0RFWFNZTVNbSl0gPSBTRE5FV1NZTVNbSSAtIFNETlVNSU5TWU1TXTsKKyAgICAgIH0KKyAgICAgIEogPSBKICsgMTsKKyAgICB9IGVsc2UgaWYgKCFFWEZMQUdTW0ldICYmIEkgPj0gU0ROVU1JTlNZTVMpIHsKKyAgICAgIGRlbGV0ZSBTRE5FV1NZTVNbSSAtIFNETlVNSU5TWU1TXTsKKyAgICB9CisgIH0KKyAgaWYgKEogPCBTRE5VTUVYU1lNUykgeworICAgIHBEaWN0LT5TRE5VTUVYU1lNUyA9IEo7CisgIH0KKyAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEVYRkxBR1MpOworICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0RORVdTWU1TKTsKKyAgZGVsZXRlIElBREg7CisgIGRlbGV0ZSBJQURXOworICBkZWxldGUgSUFBSTsKKyAgZGVsZXRlIElBUkRYOworICBkZWxldGUgSUFSRFk7CisgIGRlbGV0ZSBJQUVYOworICBkZWxldGUgSUFJRDsKKyAgZGVsZXRlIElBRFQ7CisgIGRlbGV0ZSBJQUZTOworICBkZWxldGUgSUFEUzsKKyAgZGVsZXRlIElBSVQ7CisgIGRlbGV0ZSBJQVJJOworICBkZWxldGUgSUFSRFc7CisgIGRlbGV0ZSBJQVJESDsKKyAgcmV0dXJuIHBEaWN0OwogZmFpbGVkOgotICAgIGRlbGV0ZSBwRGljdDsKLSAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChJID0gMDsgSSA8IE5TWU1TREVDT0RFRDsgSSsrKSB7CisgICAgaWYgKFNETkVXU1lNU1tJXSkgeworICAgICAgZGVsZXRlIFNETkVXU1lNU1tJXTsKKyAgICAgIFNETkVXU1lNU1tJXSA9IE5VTEw7CisgICAgfQorICB9CisgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRE5FV1NZTVMpOworICBkZWxldGUgSUFESDsKKyAgZGVsZXRlIElBRFc7CisgIGRlbGV0ZSBJQUFJOworICBkZWxldGUgSUFSRFg7CisgIGRlbGV0ZSBJQVJEWTsKKyAgZGVsZXRlIElBRVg7CisgIGRlbGV0ZSBJQUlEOworICBkZWxldGUgSUFEVDsKKyAgZGVsZXRlIElBRlM7CisgIGRlbGV0ZSBJQURTOworICBkZWxldGUgSUFJVDsKKyAgZGVsZXRlIElBUkk7CisgIGRlbGV0ZSBJQVJEVzsKKyAgZGVsZXRlIElBUkRIOworICByZXR1cm4gTlVMTDsKK30KK0NKQmlnMl9TeW1ib2xEaWN0KiBDSkJpZzJfU0REUHJvYzo6ZGVjb2RlX0h1ZmZtYW4oQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIENKQmlnMl9JbWFnZSoqIFNETkVXU1lNUzsKKyAgRlhfRFdPUkQqIFNETkVXU1lNV0lEVEhTOworICBGWF9EV09SRCBIQ0hFSUdIVCwgTlNZTVNERUNPREVEOworICBpbnQzMl90IEhDREg7CisgIEZYX0RXT1JEIFNZTVdJRFRILCBUT1RXSURUSCwgSENGSVJTVFNZTTsKKyAgaW50MzJfdCBEVzsKKyAgQ0pCaWcyX0ltYWdlICpCUywgKkJIQzsKKyAgRlhfRFdPUkQgSSwgSiwgUkVGQUdHTklOU1Q7CisgIEZYX0JPT0wqIEVYRkxBR1M7CisgIEZYX0RXT1JEIEVYSU5ERVg7CisgIEZYX0JPT0wgQ1VSRVhGTEFHOworICBGWF9EV09SRCBFWFJVTkxFTkdUSDsKKyAgaW50MzJfdCBuVmFsLCBuQml0czsKKyAgRlhfRFdPUkQgblRtcDsKKyAgRlhfRFdPUkQgU0JOVU1TWU1TOworICB1aW50OF90IFNCU1lNQ09ERUxFTjsKKyAgSkJpZzJIdWZmbWFuQ29kZSogU0JTWU1DT0RFUzsKKyAgRlhfRFdPUkQgSURJOworICBpbnQzMl90IFJEWEksIFJEWUk7CisgIEZYX0RXT1JEIEJNU0laRTsKKyAgRlhfRFdPUkQgc3RyaWRlOworICBDSkJpZzJfSW1hZ2UqKiBTQlNZTVM7CisgIENKQmlnMl9IdWZmbWFuVGFibGUgKlNCSFVGRkZTLCAqU0JIVUZGRFMsICpTQkhVRkZEVCwgKlNCSFVGRlJEVywgKlNCSFVGRlJESCwKKyAgICAgICpTQkhVRkZSRFgsICpTQkhVRkZSRFksICpTQkhVRkZSU0laRSwgKnBUYWJsZTsKKyAgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyKiBwSHVmZm1hbkRlY29kZXI7CisgIENKQmlnMl9HUlJEUHJvYyogcEdSUkQ7CisgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXI7CisgIENKQmlnMl9HUkRQcm9jKiBwR1JEOworICBDSkJpZzJfU3ltYm9sRGljdCogcERpY3Q7CisgIEpCSUcyX0FMTE9DKHBIdWZmbWFuRGVjb2RlciwgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyKHBTdHJlYW0pKTsKKyAgU0RORVdTWU1TID0gKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihTRE5VTU5FV1NZTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgRlhTWVNfbWVtc2V0KFNETkVXU1lNUywgMCwgU0ROVU1ORVdTWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgU0RORVdTWU1XSURUSFMgPSBOVUxMOworICBCSEMgPSBOVUxMOworICBpZiAoU0RSRUZBR0cgPT0gMCkgeworICAgIFNETkVXU1lNV0lEVEhTID0KKyAgICAgICAgKEZYX0RXT1JEKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoU0ROVU1ORVdTWU1TLCBzaXplb2YoRlhfRFdPUkQpKTsKKyAgICBGWFNZU19tZW1zZXQoU0RORVdTWU1XSURUSFMsIDAsIFNETlVNTkVXU1lNUyAqIHNpemVvZihGWF9EV09SRCkpOworICB9CisgIEhDSEVJR0hUID0gMDsKKyAgTlNZTVNERUNPREVEID0gMDsKKyAgQlMgPSBOVUxMOworICB3aGlsZSAoTlNZTVNERUNPREVEIDwgU0ROVU1ORVdTWU1TKSB7CisgICAgaWYgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNESFVGRkRILCAmSENESCkgIT0gMCkgeworICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIEhDSEVJR0hUID0gSENIRUlHSFQgKyBIQ0RIOworICAgIGlmICgoaW50KUhDSEVJR0hUIDwgMCB8fCAoaW50KUhDSEVJR0hUID4gSkJJRzJfTUFYX0lNQUdFX1NJWkUpIHsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IGludmFsaWQgSENIRUlHSFQgIgorICAgICAgICAgICJ2YWx1ZS4iKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgICBTWU1XSURUSCA9IDA7CisgICAgVE9UV0lEVEggPSAwOworICAgIEhDRklSU1RTWU0gPSBOU1lNU0RFQ09ERUQ7CisgICAgZm9yICg7OykgeworICAgICAgblZhbCA9IHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNESFVGRkRXLCAmRFcpOworICAgICAgaWYgKG5WYWwgPT0gSkJJRzJfT09CKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIGlmIChuVmFsICE9IDApIHsKKyAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKE5TWU1TREVDT0RFRCA+PSBTRE5VTU5FV1NZTVMpIHsKKyAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogTlNZTVNERUNPREVEID49ICIKKyAgICAgICAgICAgICAgIlNETlVNTkVXU1lNUy4iKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICBTWU1XSURUSCA9IFNZTVdJRFRIICsgRFc7CisgICAgICAgIGlmICgoaW50KVNZTVdJRFRIIDwgMCB8fCAoaW50KVNZTVdJRFRIID4gSkJJRzJfTUFYX0lNQUdFX1NJWkUpIHsKKyAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogaW52YWxpZCAiCisgICAgICAgICAgICAgICJTWU1XSURUSCB2YWx1ZS4iKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfSBlbHNlIGlmIChIQ0hFSUdIVCA9PSAwIHx8IFNZTVdJRFRIID09IDApIHsKKyAgICAgICAgICBUT1RXSURUSCA9IFRPVFdJRFRIICsgU1lNV0lEVEg7CisgICAgICAgICAgU0RORVdTWU1TW05TWU1TREVDT0RFRF0gPSBOVUxMOworICAgICAgICAgIE5TWU1TREVDT0RFRCA9IE5TWU1TREVDT0RFRCArIDE7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVE9UV0lEVEggPSBUT1RXSURUSCArIFNZTVdJRFRIOworICAgICAgfQorICAgICAgaWYgKFNEUkVGQUdHID09IDEpIHsKKyAgICAgICAgaWYgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNESFVGRkFHR0lOU1QsIChpbnQqKSZSRUZBR0dOSU5TVCkgIT0KKyAgICAgICAgICAgIDApIHsKKyAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAgIEJTID0gTlVMTDsKKyAgICAgICAgaWYgKFJFRkFHR05JTlNUID4gMSkgeworICAgICAgICAgIENKQmlnMl9UUkRQcm9jKiBwRGVjb2RlcjsKKyAgICAgICAgICBKQklHMl9BTExPQyhwRGVjb2RlciwgQ0pCaWcyX1RSRFByb2MoKSk7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRiA9IFNESFVGRjsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JSRUZJTkUgPSAxOworICAgICAgICAgIHBEZWNvZGVyLT5TQlcgPSBTWU1XSURUSDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JIID0gSENIRUlHSFQ7CisgICAgICAgICAgcERlY29kZXItPlNCTlVNSU5TVEFOQ0VTID0gUkVGQUdHTklOU1Q7CisgICAgICAgICAgcERlY29kZXItPlNCU1RSSVBTID0gMTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JOVU1TWU1TID0gU0ROVU1JTlNZTVMgKyBOU1lNU0RFQ09ERUQ7CisgICAgICAgICAgU0JOVU1TWU1TID0gcERlY29kZXItPlNCTlVNU1lNUzsKKyAgICAgICAgICBTQlNZTUNPREVTID0gKEpCaWcySHVmZm1hbkNvZGUqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMigKKyAgICAgICAgICAgICAgU0JOVU1TWU1TLCBzaXplb2YoSkJpZzJIdWZmbWFuQ29kZSkpOworICAgICAgICAgIG5UbXAgPSAxOworICAgICAgICAgIHdoaWxlICgoRlhfRFdPUkQpKDEgPDwgblRtcCkgPCBTQk5VTVNZTVMpIHsKKyAgICAgICAgICAgIG5UbXArKzsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yIChJID0gMDsgSSA8IFNCTlVNU1lNUzsgSSsrKSB7CisgICAgICAgICAgICBTQlNZTUNPREVTW0ldLmNvZGVsZW4gPSBuVG1wOworICAgICAgICAgICAgU0JTWU1DT0RFU1tJXS5jb2RlID0gSTsKKyAgICAgICAgICB9CisgICAgICAgICAgcERlY29kZXItPlNCU1lNQ09ERVMgPSBTQlNZTUNPREVTOworICAgICAgICAgIFNCU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoCisgICAgICAgICAgICAgIFNCTlVNU1lNUywgc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TLCBTRElOU1lNUywgU0ROVU1JTlNZTVMgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOworICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMgKyBTRE5VTUlOU1lNUywgU0RORVdTWU1TLAorICAgICAgICAgICAgICAgICAgICAgICBOU1lNU0RFQ09ERUQgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOworICAgICAgICAgIHBEZWNvZGVyLT5TQlNZTVMgPSBTQlNZTVM7CisgICAgICAgICAgcERlY29kZXItPlNCREVGUElYRUwgPSAwOworICAgICAgICAgIHBEZWNvZGVyLT5TQkNPTUJPUCA9IEpCSUcyX0NPTVBPU0VfT1I7CisgICAgICAgICAgcERlY29kZXItPlRSQU5TUE9TRUQgPSAwOworICAgICAgICAgIHBEZWNvZGVyLT5SRUZDT1JORVIgPSBKQklHMl9DT1JORVJfVE9QTEVGVDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JEU09GRlNFVCA9IDA7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGRlMsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0I2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjYpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjYpKTsKKyAgICAgICAgICBKQklHMl9BTExPQyhTQkhVRkZEUywgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9COCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9COCkpOworICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRkRULCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTEpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjExKSk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRXLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRILCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRYLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRZLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUlNJWkUsCisgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZGUyA9IFNCSFVGRkZTOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZEUyA9IFNCSFVGRkRTOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZEVCA9IFNCSFVGRkRUOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSRFcgPSBTQkhVRkZSRFc7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJESCA9IFNCSFVGRlJESDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRYID0gU0JIVUZGUkRYOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSRFkgPSBTQkhVRkZSRFk7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJTSVpFID0gU0JIVUZGUlNJWkU7CisgICAgICAgICAgcERlY29kZXItPlNCUlRFTVBMQVRFID0gU0RSVEVNUExBVEU7CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzBdID0gU0RSQVRbMF07CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzFdID0gU0RSQVRbMV07CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzJdID0gU0RSQVRbMl07CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzNdID0gU0RSQVRbM107CisgICAgICAgICAgQlMgPSBwRGVjb2Rlci0+ZGVjb2RlX0h1ZmZtYW4ocFN0cmVhbSwgZ3JDb250ZXh0KTsKKyAgICAgICAgICBpZiAoQlMgPT0gTlVMTCkgeworICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNQ09ERVMpOworICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7CisgICAgICAgICAgICBkZWxldGUgU0JIVUZGRlM7CisgICAgICAgICAgICBkZWxldGUgU0JIVUZGRFM7CisgICAgICAgICAgICBkZWxldGUgU0JIVUZGRFQ7CisgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRXOworICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJESDsKKyAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFg7CisgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRZOworICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJTSVpFOworICAgICAgICAgICAgZGVsZXRlIHBEZWNvZGVyOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTUNPREVTKTsKKyAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKKyAgICAgICAgICBkZWxldGUgU0JIVUZGRlM7CisgICAgICAgICAgZGVsZXRlIFNCSFVGRkRTOworICAgICAgICAgIGRlbGV0ZSBTQkhVRkZEVDsKKyAgICAgICAgICBkZWxldGUgU0JIVUZGUkRXOworICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSREg7CisgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEWDsKKyAgICAgICAgICBkZWxldGUgU0JIVUZGUkRZOworICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSU0laRTsKKyAgICAgICAgICBkZWxldGUgcERlY29kZXI7CisgICAgICAgIH0gZWxzZSBpZiAoUkVGQUdHTklOU1QgPT0gMSkgeworICAgICAgICAgIFNCTlVNU1lNUyA9IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TOworICAgICAgICAgIG5UbXAgPSAxOworICAgICAgICAgIHdoaWxlICgoRlhfRFdPUkQpKDEgPDwgblRtcCkgPCBTQk5VTVNZTVMpIHsKKyAgICAgICAgICAgIG5UbXArKzsKKyAgICAgICAgICB9CisgICAgICAgICAgU0JTWU1DT0RFTEVOID0gKHVpbnQ4X3QpblRtcDsKKyAgICAgICAgICBTQlNZTUNPREVTID0gKEpCaWcySHVmZm1hbkNvZGUqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMigKKyAgICAgICAgICAgICAgU0JOVU1TWU1TLCBzaXplb2YoSkJpZzJIdWZmbWFuQ29kZSkpOworICAgICAgICAgIGZvciAoSSA9IDA7IEkgPCBTQk5VTVNZTVM7IEkrKykgeworICAgICAgICAgICAgU0JTWU1DT0RFU1tJXS5jb2RlbGVuID0gU0JTWU1DT0RFTEVOOworICAgICAgICAgICAgU0JTWU1DT0RFU1tJXS5jb2RlID0gSTsKKyAgICAgICAgICB9CisgICAgICAgICAgblZhbCA9IDA7CisgICAgICAgICAgbkJpdHMgPSAwOworICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGlmIChwU3RyZWFtLT5yZWFkMUJpdCgmblRtcCkgIT0gMCkgeworICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1DT0RFUyk7CisgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5WYWwgPSAoblZhbCA8PCAxKSB8IG5UbXA7CisgICAgICAgICAgICBmb3IgKElESSA9IDA7IElESSA8IFNCTlVNU1lNUzsgSURJKyspIHsKKyAgICAgICAgICAgICAgaWYgKChuVmFsID09IFNCU1lNQ09ERVNbSURJXS5jb2RlKSAmJgorICAgICAgICAgICAgICAgICAgKG5CaXRzID09IFNCU1lNQ09ERVNbSURJXS5jb2RlbGVuKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSURJIDwgU0JOVU1TWU1TKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1DT0RFUyk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRYLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7CisgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUlNJWkUsCisgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOworICAgICAgICAgIGlmICgocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRYLCAmUkRYSSkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJEWCwgJlJEWUkpICE9IDApIHx8CisgICAgICAgICAgICAgIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSU0laRSwgJm5WYWwpICE9IDApKSB7CisgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRYOworICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJTSVpFOworICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFg7CisgICAgICAgICAgZGVsZXRlIFNCSFVGRlJTSVpFOworICAgICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOworICAgICAgICAgIG5UbXAgPSBwU3RyZWFtLT5nZXRPZmZzZXQoKTsKKyAgICAgICAgICBTQlNZTVMgPSAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKAorICAgICAgICAgICAgICBTQk5VTVNZTVMsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7CisgICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUywgU0RJTlNZTVMsIFNETlVNSU5TWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TICsgU0ROVU1JTlNZTVMsIFNETkVXU1lNUywKKyAgICAgICAgICAgICAgICAgICAgICAgTlNZTVNERUNPREVEICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgICAgICAgICBKQklHMl9BTExPQyhwR1JSRCwgQ0pCaWcyX0dSUkRQcm9jKCkpOworICAgICAgICAgIHBHUlJELT5HUlcgPSBTWU1XSURUSDsKKyAgICAgICAgICBwR1JSRC0+R1JIID0gSENIRUlHSFQ7CisgICAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTRFJURU1QTEFURTsKKyAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0UgPSBTQlNZTVNbSURJXTsKKyAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWCA9IFJEWEk7CisgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFRFkgPSBSRFlJOworICAgICAgICAgIHBHUlJELT5UUEdST04gPSAwOworICAgICAgICAgIHBHUlJELT5HUkFUWzBdID0gU0RSQVRbMF07CisgICAgICAgICAgcEdSUkQtPkdSQVRbMV0gPSBTRFJBVFsxXTsKKyAgICAgICAgICBwR1JSRC0+R1JBVFsyXSA9IFNEUkFUWzJdOworICAgICAgICAgIHBHUlJELT5HUkFUWzNdID0gU0RSQVRbM107CisgICAgICAgICAgSkJJRzJfQUxMT0MocEFyaXRoRGVjb2RlciwgQ0pCaWcyX0FyaXRoRGVjb2RlcihwU3RyZWFtKSk7CisgICAgICAgICAgQlMgPSBwR1JSRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7CisgICAgICAgICAgaWYgKEJTID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTVMpOworICAgICAgICAgICAgZGVsZXRlIHBHUlJEOworICAgICAgICAgICAgZGVsZXRlIHBBcml0aERlY29kZXI7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisgICAgICAgICAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgICAgICAgICAgcFN0cmVhbS0+b2Zmc2V0KDIpOworICAgICAgICAgIGlmICgoRlhfRFdPUkQpblZhbCAhPSAocFN0cmVhbS0+Z2V0T2Zmc2V0KCkgLSBuVG1wKSkgeworICAgICAgICAgICAgZGVsZXRlIEJTOworICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7CisgICAgICAgICAgICBkZWxldGUgcEdSUkQ7CisgICAgICAgICAgICBkZWxldGUgcEFyaXRoRGVjb2RlcjsKKyAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IgorICAgICAgICAgICAgICAgICJieXRlcyBwcm9jZXNzZWQgYnkgZ2VuZXJpYyByZWZpbmVtZW50IHJlZ2lvbiBkZWNvZGluZyAiCisgICAgICAgICAgICAgICAgInByb2NlZHVyZSBkb2Vzbid0IGVxdWFsIFNCSFVGRlJTSVpFLiIpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTVMpOworICAgICAgICAgIGRlbGV0ZSBwR1JSRDsKKyAgICAgICAgICBkZWxldGUgcEFyaXRoRGVjb2RlcjsKKyAgICAgICAgfQorICAgICAgICBTRE5FV1NZTVNbTlNZTVNERUNPREVEXSA9IEJTOworICAgICAgfQorICAgICAgaWYgKFNEUkVGQUdHID09IDApIHsKKyAgICAgICAgU0RORVdTWU1XSURUSFNbTlNZTVNERUNPREVEXSA9IFNZTVdJRFRIOworICAgICAgfQorICAgICAgTlNZTVNERUNPREVEID0gTlNZTVNERUNPREVEICsgMTsKKyAgICB9CisgICAgaWYgKFNEUkVGQUdHID09IDApIHsKKyAgICAgIGlmIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTREhVRkZCTVNJWkUsIChpbnQzMl90KikmQk1TSVpFKSAhPSAwKSB7CisgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKyAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOworICAgICAgaWYgKEJNU0laRSA9PSAwKSB7CisgICAgICAgIHN0cmlkZSA9IChUT1RXSURUSCArIDcpID4+IDM7CisgICAgICAgIGlmIChwU3RyZWFtLT5nZXRCeXRlTGVmdCgpID49IHN0cmlkZSAqIEhDSEVJR0hUKSB7CisgICAgICAgICAgSkJJRzJfQUxMT0MoQkhDLCBDSkJpZzJfSW1hZ2UoVE9UV0lEVEgsIEhDSEVJR0hUKSk7CisgICAgICAgICAgZm9yIChJID0gMDsgSSA8IEhDSEVJR0hUOyBJKyspIHsKKyAgICAgICAgICAgIEpCSUcyX21lbWNweShCSEMtPm1fcERhdGEgKyBJICogQkhDLT5tX25TdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+Z2V0UG9pbnRlcigpLCBzdHJpZGUpOworICAgICAgICAgICAgcFN0cmVhbS0+b2Zmc2V0KHN0cmlkZSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgICAgICJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEpCSUcyX0FMTE9DKHBHUkQsIENKQmlnMl9HUkRQcm9jKCkpOworICAgICAgICBwR1JELT5NTVIgPSAxOworICAgICAgICBwR1JELT5HQlcgPSBUT1RXSURUSDsKKyAgICAgICAgcEdSRC0+R0JIID0gSENIRUlHSFQ7CisgICAgICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IHBHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJkJIQywgcFN0cmVhbSk7CisgICAgICAgIHdoaWxlIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgeworICAgICAgICAgIHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBwR1JEOworICAgICAgICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgICAgIH0KKyAgICAgIG5UbXAgPSAwOworICAgICAgaWYgKCFCSEMpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBmb3IgKEkgPSBIQ0ZJUlNUU1lNOyBJIDwgTlNZTVNERUNPREVEOyBJKyspIHsKKyAgICAgICAgU0RORVdTWU1TW0ldID0gQkhDLT5zdWJJbWFnZShuVG1wLCAwLCBTRE5FV1NZTVdJRFRIU1tJXSwgSENIRUlHSFQpOworICAgICAgICBuVG1wICs9IFNETkVXU1lNV0lEVEhTW0ldOworICAgICAgfQorICAgICAgZGVsZXRlIEJIQzsKKyAgICAgIEJIQyA9IE5VTEw7CisgICAgfQorICB9CisgIEVYSU5ERVggPSAwOworICBDVVJFWEZMQUcgPSAwOworICBKQklHMl9BTExPQyhwVGFibGUsIENKQmlnMl9IdWZmbWFuVGFibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9CMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjEpKTsKKyAgRVhGTEFHUyA9IChGWF9CT09MKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEZYX0JPT0wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpKTsKKyAgd2hpbGUgKEVYSU5ERVggPCBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykgeworICAgIGlmIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShwVGFibGUsIChpbnQqKSZFWFJVTkxFTkdUSCkgIT0gMCkgeworICAgICAgZGVsZXRlIHBUYWJsZTsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShFWEZMQUdTKTsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoCisgICAgICAgICAgInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgICBpZiAoRVhJTkRFWCArIEVYUlVOTEVOR1RIID4gU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKKyAgICAgIGRlbGV0ZSBwVGFibGU7CisgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoRVhGTEFHUyk7CisgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAgICJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogSW52YWxpZCBFWFJVTkxFTkdUSCAiCisgICAgICAgICAgInZhbHVlLiIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIGlmIChFWFJVTkxFTkdUSCAhPSAwKSB7CisgICAgICBmb3IgKEkgPSBFWElOREVYOyBJIDwgRVhJTkRFWCArIEVYUlVOTEVOR1RIOyBJKyspIHsKKyAgICAgICAgRVhGTEFHU1tJXSA9IENVUkVYRkxBRzsKKyAgICAgIH0KKyAgICB9CisgICAgRVhJTkRFWCA9IEVYSU5ERVggKyBFWFJVTkxFTkdUSDsKKyAgICBDVVJFWEZMQUcgPSAhQ1VSRVhGTEFHOworICB9CisgIGRlbGV0ZSBwVGFibGU7CisgIEpCSUcyX0FMTE9DKHBEaWN0LCBDSkJpZzJfU3ltYm9sRGljdCgpKTsKKyAgcERpY3QtPlNETlVNRVhTWU1TID0gU0ROVU1FWFNZTVM7CisgIHBEaWN0LT5TREVYU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoCisgICAgICBzaXplb2YoQ0pCaWcyX0ltYWdlKiksIFNETlVNRVhTWU1TKTsKKyAgSSA9IEogPSAwOworICBmb3IgKEkgPSAwOyBJIDwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVM7IEkrKykgeworICAgIGlmIChFWEZMQUdTW0ldICYmIEogPCBTRE5VTUVYU1lNUykgeworICAgICAgaWYgKEkgPCBTRE5VTUlOU1lNUykgeworICAgICAgICBKQklHMl9BTExPQyhwRGljdC0+U0RFWFNZTVNbSl0sIENKQmlnMl9JbWFnZSgqU0RJTlNZTVNbSV0pKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBEaWN0LT5TREVYU1lNU1tKXSA9IFNETkVXU1lNU1tJIC0gU0ROVU1JTlNZTVNdOworICAgICAgfQorICAgICAgSiA9IEogKyAxOworICAgIH0gZWxzZSBpZiAoIUVYRkxBR1NbSV0gJiYgSSA+PSBTRE5VTUlOU1lNUykgeworICAgICAgZGVsZXRlIFNETkVXU1lNU1tJIC0gU0ROVU1JTlNZTVNdOworICAgIH0KKyAgfQorICBpZiAoSiA8IFNETlVNRVhTWU1TKSB7CisgICAgcERpY3QtPlNETlVNRVhTWU1TID0gSjsKKyAgfQorICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoRVhGTEFHUyk7CisgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRE5FV1NZTVMpOworICBpZiAoU0RSRUZBR0cgPT0gMCkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRE5FV1NZTVdJRFRIUyk7CisgIH0KKyAgZGVsZXRlIHBIdWZmbWFuRGVjb2RlcjsKKyAgcmV0dXJuIHBEaWN0OworZmFpbGVkOgorICBmb3IgKEkgPSAwOyBJIDwgTlNZTVNERUNPREVEOyBJKyspIHsKKyAgICBkZWxldGUgU0RORVdTWU1TW0ldOworICB9CisgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRE5FV1NZTVMpOworICBpZiAoU0RSRUZBR0cgPT0gMCkgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRE5FV1NZTVdJRFRIUyk7CisgIH0KKyAgZGVsZXRlIHBIdWZmbWFuRGVjb2RlcjsKKyAgcmV0dXJuIE5VTEw7Cit9CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9IVFJEUHJvYzo6ZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfRFdPUkQgbmcsIG1nOworICBpbnQzMl90IHgsIHk7CisgIENKQmlnMl9JbWFnZSogSFNLSVA7CisgIEZYX0RXT1JEIEhCUFA7CisgIEZYX0RXT1JEKiBHSTsKKyAgQ0pCaWcyX0ltYWdlKiBIVFJFRzsKKyAgQ0pCaWcyX0dTSURQcm9jKiBwR0lEOworICBKQklHMl9BTExPQyhIVFJFRywgQ0pCaWcyX0ltYWdlKEhCVywgSEJIKSk7CisgIEhUUkVHLT5maWxsKEhERUZQSVhFTCk7CisgIEhTS0lQID0gTlVMTDsKKyAgaWYgKEhFTkFCTEVTS0lQID09IDEpIHsKKyAgICBKQklHMl9BTExPQyhIU0tJUCwgQ0pCaWcyX0ltYWdlKEhHVywgSEdIKSk7CisgICAgZm9yIChtZyA9IDA7IG1nIDwgSEdIOyBtZysrKSB7CisgICAgICBmb3IgKG5nID0gMDsgbmcgPCBIR1c7IG5nKyspIHsKKyAgICAgICAgeCA9IChIR1ggKyBtZyAqIEhSWSArIG5nICogSFJYKSA+PiA4OworICAgICAgICB5ID0gKEhHWSArIG1nICogSFJYIC0gbmcgKiBIUlkpID4+IDg7CisgICAgICAgIGlmICgoeCArIEhQVyA8PSAwKSB8ICh4ID49IChpbnQzMl90KUhCVykgfCAoeSArIEhQSCA8PSAwKSB8CisgICAgICAgICAgICAoeSA+PSAoaW50MzJfdClIUEgpKSB7CisgICAgICAgICAgSFNLSVAtPnNldFBpeGVsKG5nLCBtZywgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgSFNLSVAtPnNldFBpeGVsKG5nLCBtZywgMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgSEJQUCA9IDE7CisgIHdoaWxlICgoRlhfRFdPUkQpKDEgPDwgSEJQUCkgPCBITlVNUEFUUykgeworICAgIEhCUFArKzsKKyAgfQorICBKQklHMl9BTExPQyhwR0lELCBDSkJpZzJfR1NJRFByb2MoKSk7CisgIHBHSUQtPkdTTU1SID0gSE1NUjsKKyAgcEdJRC0+R1NXID0gSEdXOworICBwR0lELT5HU0ggPSBIR0g7CisgIHBHSUQtPkdTQlBQID0gKHVpbnQ4X3QpSEJQUDsKKyAgcEdJRC0+R1NVU0VTS0lQID0gSEVOQUJMRVNLSVA7CisgIHBHSUQtPkdTS0lQID0gSFNLSVA7CisgIHBHSUQtPkdTVEVNUExBVEUgPSBIVEVNUExBVEU7CisgIEdJID0gcEdJRC0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIsIGdiQ29udGV4dCwgcFBhdXNlKTsKKyAgaWYgKEdJID09IE5VTEwpIHsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBmb3IgKG1nID0gMDsgbWcgPCBIR0g7IG1nKyspIHsKKyAgICBmb3IgKG5nID0gMDsgbmcgPCBIR1c7IG5nKyspIHsKKyAgICAgIHggPSAoSEdYICsgbWcgKiBIUlkgKyBuZyAqIEhSWCkgPj4gODsKKyAgICAgIHkgPSAoSEdZICsgbWcgKiBIUlggLSBuZyAqIEhSWSkgPj4gODsKKyAgICAgIEZYX0RXT1JEIHBhdF9pbmRleCA9IEdJW21nICogSEdXICsgbmddOworICAgICAgaWYgKHBhdF9pbmRleCA+PSBITlVNUEFUUykgeworICAgICAgICBwYXRfaW5kZXggPSBITlVNUEFUUyAtIDE7CisgICAgICB9CisgICAgICBIVFJFRy0+Y29tcG9zZUZyb20oeCwgeSwgSFBBVFNbcGF0X2luZGV4XSwgSENPTUJPUCk7CisgICAgfQorICB9CisgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShHSSk7CisgIGRlbGV0ZSBIU0tJUDsKKyAgZGVsZXRlIHBHSUQ7CisgIHJldHVybiBIVFJFRzsKK2ZhaWxlZDoKKyAgZGVsZXRlIEhTS0lQOworICBkZWxldGUgcEdJRDsKKyAgZGVsZXRlIEhUUkVHOworICByZXR1cm4gTlVMTDsKK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0hUUkRQcm9jOjpkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWF9EV09SRCBuZywgbWc7CisgIGludDMyX3QgeCwgeTsKKyAgRlhfRFdPUkQgSEJQUDsKKyAgRlhfRFdPUkQqIEdJOworICBDSkJpZzJfSW1hZ2UqIEhUUkVHOworICBDSkJpZzJfR1NJRFByb2MqIHBHSUQ7CisgIEpCSUcyX0FMTE9DKEhUUkVHLCBDSkJpZzJfSW1hZ2UoSEJXLCBIQkgpKTsKKyAgSFRSRUctPmZpbGwoSERFRlBJWEVMKTsKKyAgSEJQUCA9IDE7CisgIHdoaWxlICgoRlhfRFdPUkQpKDEgPDwgSEJQUCkgPCBITlVNUEFUUykgeworICAgIEhCUFArKzsKKyAgfQorICBKQklHMl9BTExPQyhwR0lELCBDSkJpZzJfR1NJRFByb2MoKSk7CisgIHBHSUQtPkdTTU1SID0gSE1NUjsKKyAgcEdJRC0+R1NXID0gSEdXOworICBwR0lELT5HU0ggPSBIR0g7CisgIHBHSUQtPkdTQlBQID0gKHVpbnQ4X3QpSEJQUDsKKyAgcEdJRC0+R1NVU0VTS0lQID0gMDsKKyAgR0kgPSBwR0lELT5kZWNvZGVfTU1SKHBTdHJlYW0sIHBQYXVzZSk7CisgIGlmIChHSSA9PSBOVUxMKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgZm9yIChtZyA9IDA7IG1nIDwgSEdIOyBtZysrKSB7CisgICAgZm9yIChuZyA9IDA7IG5nIDwgSEdXOyBuZysrKSB7CisgICAgICB4ID0gKEhHWCArIG1nICogSFJZICsgbmcgKiBIUlgpID4+IDg7CisgICAgICB5ID0gKEhHWSArIG1nICogSFJYIC0gbmcgKiBIUlkpID4+IDg7CisgICAgICBGWF9EV09SRCBwYXRfaW5kZXggPSBHSVttZyAqIEhHVyArIG5nXTsKKyAgICAgIGlmIChwYXRfaW5kZXggPj0gSE5VTVBBVFMpIHsKKyAgICAgICAgcGF0X2luZGV4ID0gSE5VTVBBVFMgLSAxOworICAgICAgfQorICAgICAgSFRSRUctPmNvbXBvc2VGcm9tKHgsIHksIEhQQVRTW3BhdF9pbmRleF0sIEhDT01CT1ApOworICAgIH0KKyAgfQorICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR0kpOworICBkZWxldGUgcEdJRDsKKyAgcmV0dXJuIEhUUkVHOworZmFpbGVkOgorICBkZWxldGUgcEdJRDsKKyAgZGVsZXRlIEhUUkVHOworICByZXR1cm4gTlVMTDsKK30KK0NKQmlnMl9QYXR0ZXJuRGljdCogQ0pCaWcyX1BERFByb2M6OmRlY29kZV9Bcml0aCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWF9EV09SRCBHUkFZOworICBDSkJpZzJfSW1hZ2UqIEJIREMgPSBOVUxMOworICBDSkJpZzJfUGF0dGVybkRpY3QqIHBEaWN0OworICBDSkJpZzJfR1JEUHJvYyogcEdSRDsKKyAgSkJJRzJfQUxMT0MocERpY3QsIENKQmlnMl9QYXR0ZXJuRGljdCgpKTsKKyAgcERpY3QtPk5VTVBBVFMgPSBHUkFZTUFYICsgMTsKKyAgcERpY3QtPkhEUEFUUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoCisgICAgICBzaXplb2YoQ0pCaWcyX0ltYWdlKiksIHBEaWN0LT5OVU1QQVRTKTsKKyAgSkJJRzJfbWVtc2V0KHBEaWN0LT5IRFBBVFMsIDAsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSAqIHBEaWN0LT5OVU1QQVRTKTsKKyAgSkJJRzJfQUxMT0MocEdSRCwgQ0pCaWcyX0dSRFByb2MoKSk7CisgIHBHUkQtPk1NUiA9IEhETU1SOworICBwR1JELT5HQlcgPSAoR1JBWU1BWCArIDEpICogSERQVzsKKyAgcEdSRC0+R0JIID0gSERQSDsKKyAgcEdSRC0+R0JURU1QTEFURSA9IEhEVEVNUExBVEU7CisgIHBHUkQtPlRQR0RPTiA9IDA7CisgIHBHUkQtPlVTRVNLSVAgPSAwOworICBwR1JELT5HQkFUWzBdID0gLShpbnQzMl90KUhEUFc7CisgIHBHUkQtPkdCQVRbMV0gPSAwOworICBpZiAocEdSRC0+R0JURU1QTEFURSA9PSAwKSB7CisgICAgcEdSRC0+R0JBVFsyXSA9IC0zOworICAgIHBHUkQtPkdCQVRbM10gPSAtMTsKKyAgICBwR1JELT5HQkFUWzRdID0gMjsKKyAgICBwR1JELT5HQkFUWzVdID0gLTI7CisgICAgcEdSRC0+R0JBVFs2XSA9IC0yOworICAgIHBHUkQtPkdCQVRbN10gPSAtMjsKKyAgfQorICBGWENPREVDX1NUQVRVUyBzdGF0dXMgPQorICAgICAgcEdSRC0+U3RhcnRfZGVjb2RlX0FyaXRoKCZCSERDLCBwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOworICB3aGlsZSAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKKyAgICBwR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKKyAgfQorICBpZiAoQkhEQyA9PSBOVUxMKSB7CisgICAgZGVsZXRlIHBHUkQ7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgZGVsZXRlIHBHUkQ7CisgIEdSQVkgPSAwOworICB3aGlsZSAoR1JBWSA8PSBHUkFZTUFYKSB7CisgICAgcERpY3QtPkhEUEFUU1tHUkFZXSA9IEJIREMtPnN1YkltYWdlKEhEUFcgKiBHUkFZLCAwLCBIRFBXLCBIRFBIKTsKKyAgICBHUkFZID0gR1JBWSArIDE7CisgIH0KKyAgZGVsZXRlIEJIREM7CisgIHJldHVybiBwRGljdDsKK2ZhaWxlZDoKKyAgZGVsZXRlIHBEaWN0OworICByZXR1cm4gTlVMTDsKIH0KIAotQ0pCaWcyX1BhdHRlcm5EaWN0ICpDSkJpZzJfUEREUHJvYzo6ZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9EV09SRCBHUkFZOwotICAgIENKQmlnMl9JbWFnZSAqQkhEQyA9IE5VTEw7Ci0gICAgQ0pCaWcyX1BhdHRlcm5EaWN0ICpwRGljdDsKLSAgICBDSkJpZzJfR1JEUHJvYyAqcEdSRDsKLSAgICBKQklHMl9BTExPQyhwRGljdCwgQ0pCaWcyX1BhdHRlcm5EaWN0KCkpOwotICAgIHBEaWN0LT5OVU1QQVRTID0gR1JBWU1BWCArIDE7Ci0gICAgcERpY3QtPkhEUEFUUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKENKQmlnMl9JbWFnZSopLCBwRGljdC0+TlVNUEFUUyk7Ci0gICAgSkJJRzJfbWVtc2V0KHBEaWN0LT5IRFBBVFMsIDAsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSpwRGljdC0+TlVNUEFUUyk7Ci0gICAgSkJJRzJfQUxMT0MocEdSRCwgQ0pCaWcyX0dSRFByb2MoKSk7Ci0gICAgcEdSRC0+TU1SID0gSERNTVI7Ci0gICAgcEdSRC0+R0JXID0gKEdSQVlNQVggKyAxKSAqIEhEUFc7Ci0gICAgcEdSRC0+R0JIID0gSERQSDsKLSAgICBGWENPREVDX1NUQVRVUyBzdGF0dXMgPSBwR1JELT5TdGFydF9kZWNvZGVfTU1SKCZCSERDLCBwU3RyZWFtKTsKLSAgICB3aGlsZShzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgewotICAgICAgICBwR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKLSAgICB9Ci0gICAgaWYoQkhEQyA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBwR1JEOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9CitDSkJpZzJfUGF0dGVybkRpY3QqIENKQmlnMl9QRERQcm9jOjpkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0RXT1JEIEdSQVk7CisgIENKQmlnMl9JbWFnZSogQkhEQyA9IE5VTEw7CisgIENKQmlnMl9QYXR0ZXJuRGljdCogcERpY3Q7CisgIENKQmlnMl9HUkRQcm9jKiBwR1JEOworICBKQklHMl9BTExPQyhwRGljdCwgQ0pCaWcyX1BhdHRlcm5EaWN0KCkpOworICBwRGljdC0+TlVNUEFUUyA9IEdSQVlNQVggKyAxOworICBwRGljdC0+SERQQVRTID0gKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMigKKyAgICAgIHNpemVvZihDSkJpZzJfSW1hZ2UqKSwgcERpY3QtPk5VTVBBVFMpOworICBKQklHMl9tZW1zZXQocERpY3QtPkhEUEFUUywgMCwgc2l6ZW9mKENKQmlnMl9JbWFnZSopICogcERpY3QtPk5VTVBBVFMpOworICBKQklHMl9BTExPQyhwR1JELCBDSkJpZzJfR1JEUHJvYygpKTsKKyAgcEdSRC0+TU1SID0gSERNTVI7CisgIHBHUkQtPkdCVyA9IChHUkFZTUFYICsgMSkgKiBIRFBXOworICBwR1JELT5HQkggPSBIRFBIOworICBGWENPREVDX1NUQVRVUyBzdGF0dXMgPSBwR1JELT5TdGFydF9kZWNvZGVfTU1SKCZCSERDLCBwU3RyZWFtKTsKKyAgd2hpbGUgKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7CisgICAgcEdSRC0+Q29udGludWVfZGVjb2RlKHBQYXVzZSk7CisgIH0KKyAgaWYgKEJIREMgPT0gTlVMTCkgewogICAgIGRlbGV0ZSBwR1JEOwotICAgIEdSQVkgPSAwOwotICAgIHdoaWxlKEdSQVkgPD0gR1JBWU1BWCkgewotICAgICAgICBwRGljdC0+SERQQVRTW0dSQVldID0gQkhEQy0+c3ViSW1hZ2UoSERQVyAqIEdSQVksIDAsIEhEUFcsIEhEUEgpOwotICAgICAgICBHUkFZID0gR1JBWSArIDE7Ci0gICAgfQotICAgIGRlbGV0ZSBCSERDOwotICAgIHJldHVybiBwRGljdDsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBkZWxldGUgcEdSRDsKKyAgR1JBWSA9IDA7CisgIHdoaWxlIChHUkFZIDw9IEdSQVlNQVgpIHsKKyAgICBwRGljdC0+SERQQVRTW0dSQVldID0gQkhEQy0+c3ViSW1hZ2UoSERQVyAqIEdSQVksIDAsIEhEUFcsIEhEUEgpOworICAgIEdSQVkgPSBHUkFZICsgMTsKKyAgfQorICBkZWxldGUgQkhEQzsKKyAgcmV0dXJuIHBEaWN0OwogZmFpbGVkOgotICAgIGRlbGV0ZSBwRGljdDsKLSAgICByZXR1cm4gTlVMTDsKKyAgZGVsZXRlIHBEaWN0OworICByZXR1cm4gTlVMTDsKIH0KLUZYX0RXT1JEICpDSkJpZzJfR1NJRFByb2M6OmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgQ0pCaWcyX0ltYWdlICoqR1NQTEFORVM7Ci0gICAgaW50MzJfdCBKLCBLOwotICAgIEZYX0RXT1JEIHgsIHk7Ci0gICAgRlhfRFdPUkQgKkdTVkFMUzsKLSAgICBDSkJpZzJfR1JEUHJvYyAqcEdSRDsKLSAgICBHU1BMQU5FUyA9IChDSkJpZzJfSW1hZ2UgKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihDSkJpZzJfSW1hZ2UqKSwgR1NCUFApOwotICAgIGlmICghR1NQTEFORVMpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEdTVkFMUyA9IChGWF9EV09SRCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MzKHNpemVvZihGWF9EV09SRCksIEdTVywgR1NIKTsKLSAgICBpZiAoIUdTVkFMUykgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR1NQTEFORVMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgSkJJRzJfbWVtc2V0KEdTUExBTkVTLCAwLCBzaXplb2YoQ0pCaWcyX0ltYWdlKikqR1NCUFApOwotICAgIEpCSUcyX21lbXNldChHU1ZBTFMsIDAsIHNpemVvZihGWF9EV09SRCkqR1NXICogR1NIKTsKLSAgICBKQklHMl9BTExPQyhwR1JELCBDSkJpZzJfR1JEUHJvYygpKTsKLSAgICBwR1JELT5NTVIgPSBHU01NUjsKLSAgICBwR1JELT5HQlcgPSBHU1c7Ci0gICAgcEdSRC0+R0JIID0gR1NIOwotICAgIHBHUkQtPkdCVEVNUExBVEUgPSBHU1RFTVBMQVRFOwotICAgIHBHUkQtPlRQR0RPTiA9IDA7Ci0gICAgcEdSRC0+VVNFU0tJUCA9IEdTVVNFU0tJUDsKLSAgICBwR1JELT5TS0lQID0gR1NLSVA7Ci0gICAgaWYoR1NURU1QTEFURSA8PSAxKSB7Ci0gICAgICAgIHBHUkQtPkdCQVRbMF0gPSAzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBHUkQtPkdCQVRbMF0gPSAyOwotICAgIH0KLSAgICBwR1JELT5HQkFUWzFdID0gLTE7Ci0gICAgaWYocEdSRC0+R0JURU1QTEFURSA9PSAwKSB7Ci0gICAgICAgIHBHUkQtPkdCQVRbMl0gPSAtMzsKLSAgICAgICAgcEdSRC0+R0JBVFszXSA9IC0xOwotICAgICAgICBwR1JELT5HQkFUWzRdID0gMjsKLSAgICAgICAgcEdSRC0+R0JBVFs1XSA9IC0yOwotICAgICAgICBwR1JELT5HQkFUWzZdID0gLTI7Ci0gICAgICAgIHBHUkQtPkdCQVRbN10gPSAtMjsKLSAgICB9Ci0gICAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0gcEdSRC0+U3RhcnRfZGVjb2RlX0FyaXRoKCZHU1BMQU5FU1tHU0JQUCAtIDFdLCBwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOwotICAgIHdoaWxlKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgIHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOwotICAgIH0KLSAgICBpZihHU1BMQU5FU1tHU0JQUCAtIDFdID09IE5VTEwpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIEogPSBHU0JQUCAtIDI7Ci0gICAgd2hpbGUoSiA+PSAwKSB7Ci0gICAgICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IHBHUkQtPlN0YXJ0X2RlY29kZV9Bcml0aCgmR1NQTEFORVNbSl0sIHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7Ci0gICAgICAgIHdoaWxlKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgICAgICBwR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKLSAgICAgICAgfQotICAgICAgICBpZihHU1BMQU5FU1tKXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmb3IoSyA9IEdTQlBQIC0gMTsgSyA+IEo7IEstLSkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBHU1BMQU5FU1tLXTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBHU1BMQU5FU1tKXS0+Y29tcG9zZUZyb20oMCwgMCwgR1NQTEFORVNbSiArIDFdLCBKQklHMl9DT01QT1NFX1hPUik7Ci0gICAgICAgIEogPSBKIC0gMTsKLSAgICB9Ci0gICAgZm9yKHkgPSAwOyB5IDwgR1NIOyB5KyspIHsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgR1NXOyB4KyspIHsKLSAgICAgICAgICAgIGZvcihKID0gMDsgSiA8IEdTQlBQOyBKKyspIHsKLSAgICAgICAgICAgICAgICBHU1ZBTFNbeSAqIEdTVyArIHhdIHw9IEdTUExBTkVTW0pdLT5nZXRQaXhlbCh4LCB5KSA8PCBKOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGZvcihKID0gMDsgSiA8IEdTQlBQOyBKKyspIHsKLSAgICAgICAgZGVsZXRlIEdTUExBTkVTW0pdOwotICAgIH0KK0ZYX0RXT1JEKiBDSkJpZzJfR1NJRFByb2M6OmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBDSkJpZzJfSW1hZ2UqKiBHU1BMQU5FUzsKKyAgaW50MzJfdCBKLCBLOworICBGWF9EV09SRCB4LCB5OworICBGWF9EV09SRCogR1NWQUxTOworICBDSkJpZzJfR1JEUHJvYyogcEdSRDsKKyAgR1NQTEFORVMgPQorICAgICAgKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoQ0pCaWcyX0ltYWdlKiksIEdTQlBQKTsKKyAgaWYgKCFHU1BMQU5FUykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEdTVkFMUyA9IChGWF9EV09SRCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MzKHNpemVvZihGWF9EV09SRCksIEdTVywgR1NIKTsKKyAgaWYgKCFHU1ZBTFMpIHsKICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR1NQTEFORVMpOwotICAgIGRlbGV0ZSBwR1JEOwotICAgIHJldHVybiBHU1ZBTFM7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgSkJJRzJfbWVtc2V0KEdTUExBTkVTLCAwLCBzaXplb2YoQ0pCaWcyX0ltYWdlKikgKiBHU0JQUCk7CisgIEpCSUcyX21lbXNldChHU1ZBTFMsIDAsIHNpemVvZihGWF9EV09SRCkgKiBHU1cgKiBHU0gpOworICBKQklHMl9BTExPQyhwR1JELCBDSkJpZzJfR1JEUHJvYygpKTsKKyAgcEdSRC0+TU1SID0gR1NNTVI7CisgIHBHUkQtPkdCVyA9IEdTVzsKKyAgcEdSRC0+R0JIID0gR1NIOworICBwR1JELT5HQlRFTVBMQVRFID0gR1NURU1QTEFURTsKKyAgcEdSRC0+VFBHRE9OID0gMDsKKyAgcEdSRC0+VVNFU0tJUCA9IEdTVVNFU0tJUDsKKyAgcEdSRC0+U0tJUCA9IEdTS0lQOworICBpZiAoR1NURU1QTEFURSA8PSAxKSB7CisgICAgcEdSRC0+R0JBVFswXSA9IDM7CisgIH0gZWxzZSB7CisgICAgcEdSRC0+R0JBVFswXSA9IDI7CisgIH0KKyAgcEdSRC0+R0JBVFsxXSA9IC0xOworICBpZiAocEdSRC0+R0JURU1QTEFURSA9PSAwKSB7CisgICAgcEdSRC0+R0JBVFsyXSA9IC0zOworICAgIHBHUkQtPkdCQVRbM10gPSAtMTsKKyAgICBwR1JELT5HQkFUWzRdID0gMjsKKyAgICBwR1JELT5HQkFUWzVdID0gLTI7CisgICAgcEdSRC0+R0JBVFs2XSA9IC0yOworICAgIHBHUkQtPkdCQVRbN10gPSAtMjsKKyAgfQorICBGWENPREVDX1NUQVRVUyBzdGF0dXMgPQorICAgICAgcEdSRC0+U3RhcnRfZGVjb2RlX0FyaXRoKCZHU1BMQU5FU1tHU0JQUCAtIDFdLCBwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOworICB3aGlsZSAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKKyAgICBwR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKKyAgfQorICBpZiAoR1NQTEFORVNbR1NCUFAgLSAxXSA9PSBOVUxMKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgSiA9IEdTQlBQIC0gMjsKKyAgd2hpbGUgKEogPj0gMCkgeworICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9CisgICAgICAgIHBHUkQtPlN0YXJ0X2RlY29kZV9Bcml0aCgmR1NQTEFORVNbSl0sIHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7CisgICAgd2hpbGUgKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7CisgICAgICBwR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKKyAgICB9CisgICAgaWYgKEdTUExBTkVTW0pdID09IE5VTEwpIHsKKyAgICAgIGZvciAoSyA9IEdTQlBQIC0gMTsgSyA+IEo7IEstLSkgeworICAgICAgICBkZWxldGUgR1NQTEFORVNbS107CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorICAgIH0KKyAgICBHU1BMQU5FU1tKXS0+Y29tcG9zZUZyb20oMCwgMCwgR1NQTEFORVNbSiArIDFdLCBKQklHMl9DT01QT1NFX1hPUik7CisgICAgSiA9IEogLSAxOworICB9CisgIGZvciAoeSA9IDA7IHkgPCBHU0g7IHkrKykgeworICAgIGZvciAoeCA9IDA7IHggPCBHU1c7IHgrKykgeworICAgICAgZm9yIChKID0gMDsgSiA8IEdTQlBQOyBKKyspIHsKKyAgICAgICAgR1NWQUxTW3kgKiBHU1cgKyB4XSB8PSBHU1BMQU5FU1tKXS0+Z2V0UGl4ZWwoeCwgeSkgPDwgSjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZm9yIChKID0gMDsgSiA8IEdTQlBQOyBKKyspIHsKKyAgICBkZWxldGUgR1NQTEFORVNbSl07CisgIH0KKyAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEdTUExBTkVTKTsKKyAgZGVsZXRlIHBHUkQ7CisgIHJldHVybiBHU1ZBTFM7CiBmYWlsZWQ6Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEdTUExBTkVTKTsKLSAgICBkZWxldGUgcEdSRDsKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR1NWQUxTKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEdTUExBTkVTKTsKKyAgZGVsZXRlIHBHUkQ7CisgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShHU1ZBTFMpOworICByZXR1cm4gTlVMTDsKIH0KLUZYX0RXT1JEICpDSkJpZzJfR1NJRFByb2M6OmRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgQ0pCaWcyX0ltYWdlICoqR1NQTEFORVM7Ci0gICAgaW50MzJfdCBKLCBLOwotICAgIEZYX0RXT1JEIHgsIHk7Ci0gICAgRlhfRFdPUkQgKkdTVkFMUzsKLSAgICBDSkJpZzJfR1JEUHJvYyAqcEdSRDsKLSAgICBHU1BMQU5FUyA9IChDSkJpZzJfSW1hZ2UgKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihDSkJpZzJfSW1hZ2UqKSwgR1NCUFApOwotICAgIGlmICghR1NQTEFORVMpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitGWF9EV09SRCogQ0pCaWcyX0dTSURQcm9jOjpkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIENKQmlnMl9JbWFnZSoqIEdTUExBTkVTOworICBpbnQzMl90IEosIEs7CisgIEZYX0RXT1JEIHgsIHk7CisgIEZYX0RXT1JEKiBHU1ZBTFM7CisgIENKQmlnMl9HUkRQcm9jKiBwR1JEOworICBHU1BMQU5FUyA9CisgICAgICAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihDSkJpZzJfSW1hZ2UqKSwgR1NCUFApOworICBpZiAoIUdTUExBTkVTKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgR1NWQUxTID0gKEZYX0RXT1JEKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzMoc2l6ZW9mKEZYX0RXT1JEKSwgR1NXLCBHU0gpOworICBpZiAoIUdTVkFMUykgeworICAgIGlmIChHU1BMQU5FUykgeworICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEdTUExBTkVTKTsKICAgICB9Ci0gICAgR1NWQUxTID0gKEZYX0RXT1JEKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzMoc2l6ZW9mKEZYX0RXT1JEKSwgR1NXLCBHU0gpOwotICAgIGlmICghR1NWQUxTKSB7Ci0gICAgICAgIGlmIChHU1BMQU5FUykgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEdTUExBTkVTKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBKQklHMl9tZW1zZXQoR1NQTEFORVMsIDAsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSAqIEdTQlBQKTsKKyAgSkJJRzJfbWVtc2V0KEdTVkFMUywgMCwgc2l6ZW9mKEZYX0RXT1JEKSAqIEdTVyAqIEdTSCk7CisgIEpCSUcyX0FMTE9DKHBHUkQsIENKQmlnMl9HUkRQcm9jKCkpOworICBwR1JELT5NTVIgPSBHU01NUjsKKyAgcEdSRC0+R0JXID0gR1NXOworICBwR1JELT5HQkggPSBHU0g7CisgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IHBHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJkdTUExBTkVTW0dTQlBQIC0gMV0sIHBTdHJlYW0pOworICB3aGlsZSAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKKyAgICBwR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKKyAgfQorICBpZiAoR1NQTEFORVNbR1NCUFAgLSAxXSA9PSBOVUxMKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgIHBTdHJlYW0tPm9mZnNldCgzKTsKKyAgSiA9IEdTQlBQIC0gMjsKKyAgd2hpbGUgKEogPj0gMCkgeworICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IHBHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJkdTUExBTkVTW0pdLCBwU3RyZWFtKTsKKyAgICB3aGlsZSAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKKyAgICAgIHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOwogICAgIH0KLSAgICBKQklHMl9tZW1zZXQoR1NQTEFORVMsIDAsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSpHU0JQUCk7Ci0gICAgSkJJRzJfbWVtc2V0KEdTVkFMUywgMCwgc2l6ZW9mKEZYX0RXT1JEKSpHU1cgKiBHU0gpOwotICAgIEpCSUcyX0FMTE9DKHBHUkQsIENKQmlnMl9HUkRQcm9jKCkpOwotICAgIHBHUkQtPk1NUiA9IEdTTU1SOwotICAgIHBHUkQtPkdCVyA9IEdTVzsKLSAgICBwR1JELT5HQkggPSBHU0g7Ci0gICAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0gcEdSRC0+U3RhcnRfZGVjb2RlX01NUigmR1NQTEFORVNbR1NCUFAgLSAxXSwgcFN0cmVhbSk7Ci0gICAgd2hpbGUoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgcEdSRC0+Q29udGludWVfZGVjb2RlKHBQYXVzZSk7Ci0gICAgfQotICAgIGlmKEdTUExBTkVTW0dTQlBQIC0gMV0gPT0gTlVMTCkgeworICAgIGlmIChHU1BMQU5FU1tKXSA9PSBOVUxMKSB7CisgICAgICBmb3IgKEsgPSBHU0JQUCAtIDE7IEsgPiBKOyBLLS0pIHsKKyAgICAgICAgZGVsZXRlIEdTUExBTkVTW0tdOwogICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KICAgICB9CiAgICAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7CiAgICAgcFN0cmVhbS0+b2Zmc2V0KDMpOwotICAgIEogPSBHU0JQUCAtIDI7Ci0gICAgd2hpbGUoSiA+PSAwKSB7Ci0gICAgICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IHBHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJkdTUExBTkVTW0pdLCBwU3RyZWFtKTsKLSAgICAgICAgd2hpbGUoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgICAgIHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmKEdTUExBTkVTW0pdID09IE5VTEwpIHsKLSAgICAgICAgICAgIGZvcihLID0gR1NCUFAgLSAxOyBLID4gSjsgSy0tKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIEdTUExBTkVTW0tdOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgICBwU3RyZWFtLT5vZmZzZXQoMyk7Ci0gICAgICAgIEdTUExBTkVTW0pdLT5jb21wb3NlRnJvbSgwLCAwLCBHU1BMQU5FU1tKICsgMV0sIEpCSUcyX0NPTVBPU0VfWE9SKTsKLSAgICAgICAgSiA9IEogLSAxOworICAgIEdTUExBTkVTW0pdLT5jb21wb3NlRnJvbSgwLCAwLCBHU1BMQU5FU1tKICsgMV0sIEpCSUcyX0NPTVBPU0VfWE9SKTsKKyAgICBKID0gSiAtIDE7CisgIH0KKyAgZm9yICh5ID0gMDsgeSA8IEdTSDsgeSsrKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IEdTVzsgeCsrKSB7CisgICAgICBmb3IgKEogPSAwOyBKIDwgR1NCUFA7IEorKykgeworICAgICAgICBHU1ZBTFNbeSAqIEdTVyArIHhdIHw9IEdTUExBTkVTW0pdLT5nZXRQaXhlbCh4LCB5KSA8PCBKOworICAgICAgfQogICAgIH0KLSAgICBmb3IoeSA9IDA7IHkgPCBHU0g7IHkrKykgewotICAgICAgICBmb3IoeCA9IDA7IHggPCBHU1c7IHgrKykgewotICAgICAgICAgICAgZm9yKEogPSAwOyBKIDwgR1NCUFA7IEorKykgewotICAgICAgICAgICAgICAgIEdTVkFMU1t5ICogR1NXICsgeF0gfD0gR1NQTEFORVNbSl0tPmdldFBpeGVsKHgsIHkpIDw8IEo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yKEogPSAwOyBKIDwgR1NCUFA7IEorKykgewotICAgICAgICBkZWxldGUgR1NQTEFORVNbSl07Ci0gICAgfQotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShHU1BMQU5FUyk7Ci0gICAgZGVsZXRlIHBHUkQ7Ci0gICAgcmV0dXJuIEdTVkFMUzsKKyAgfQorICBmb3IgKEogPSAwOyBKIDwgR1NCUFA7IEorKykgeworICAgIGRlbGV0ZSBHU1BMQU5FU1tKXTsKKyAgfQorICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR1NQTEFORVMpOworICBkZWxldGUgcEdSRDsKKyAgcmV0dXJuIEdTVkFMUzsKIGZhaWxlZDoKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR1NQTEFORVMpOwotICAgIGRlbGV0ZSBwR1JEOwotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShHU1ZBTFMpOwotICAgIHJldHVybiBOVUxMOworICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR1NQTEFORVMpOworICBkZWxldGUgcEdSRDsKKyAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEdTVkFMUyk7CisgIHJldHVybiBOVUxMOwogfQotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OlN0YXJ0X2RlY29kZV9Bcml0aChDSkJpZzJfSW1hZ2UqKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKEdCVyA9PSAwIHx8IEdCSCA9PSAwKSB7Ci0gICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICB9Ci0gICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWTsKLSAgICBtX3BQYXVzZSA9IHBQYXVzZTsKLSAgICBpZigqcEltYWdlID09IE5VTEwpIHsKLSAgICAgICAgSkJJRzJfQUxMT0MoKCpwSW1hZ2UpLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICB9Ci0gICAgaWYgKCgqcEltYWdlKS0+bV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSAqcEltYWdlOwotICAgICAgICAqcEltYWdlID0gTlVMTDsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsIEdCVywgR0JIKTsKLSAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0gICAgfQotICAgIG1fRGVjb2RlVHlwZSA9IDE7Ci0gICAgbV9wSW1hZ2UgPSBwSW1hZ2U7Ci0gICAgKCptX3BJbWFnZSktPmZpbGwoMCk7Ci0gICAgbV9wQXJpdGhEZWNvZGVyID0gcEFyaXRoRGVjb2RlcjsKLSAgICBtX2diQ29udGV4dCA9IGdiQ29udGV4dDsKLSAgICBMVFAgPSAwOwotICAgIG1fcExpbmUgPSBOVUxMOwotICAgIG1fbG9vcEluZGV4ID0gMDsKLSAgICByZXR1cm4gZGVjb2RlX0FyaXRoKHBQYXVzZSk7CitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6U3RhcnRfZGVjb2RlX0FyaXRoKAorICAgIENKQmlnMl9JbWFnZSoqIHBJbWFnZSwKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAoR0JXID09IDAgfHwgR0JIID09IDApIHsKKyAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgfQorICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOworICBtX3BQYXVzZSA9IHBQYXVzZTsKKyAgaWYgKCpwSW1hZ2UgPT0gTlVMTCkgeworICAgIEpCSUcyX0FMTE9DKCgqcEltYWdlKSwgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIH0KKyAgaWYgKCgqcEltYWdlKS0+bV9wRGF0YSA9PSBOVUxMKSB7CisgICAgZGVsZXRlICpwSW1hZ2U7CisgICAgKnBJbWFnZSA9IE5VTEw7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gIgorICAgICAgICAiJWQsIGhlaWdodCA9ICVkXG4iLAorICAgICAgICBHQlcsIEdCSCk7CisgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKyAgfQorICBtX0RlY29kZVR5cGUgPSAxOworICBtX3BJbWFnZSA9IHBJbWFnZTsKKyAgKCptX3BJbWFnZSktPmZpbGwoMCk7CisgIG1fcEFyaXRoRGVjb2RlciA9IHBBcml0aERlY29kZXI7CisgIG1fZ2JDb250ZXh0ID0gZ2JDb250ZXh0OworICBMVFAgPSAwOworICBtX3BMaW5lID0gTlVMTDsKKyAgbV9sb29wSW5kZXggPSAwOworICByZXR1cm4gZGVjb2RlX0FyaXRoKHBQYXVzZSk7CiB9Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGludCBpbGluZSA9IG1fbG9vcEluZGV4OwotICAgIENKQmlnMl9JbWFnZSogcEltYWdlID0gKm1fcEltYWdlOwotICAgIGlmKEdCVEVNUExBVEUgPT0gMCkgewotICAgICAgICBpZigoR0JBVFswXSA9PSAzKSAmJiAoR0JBVFsxXSA9PSAoc2lnbmVkIGNoYXIpIC0gMSkKLSAgICAgICAgICAgICAgICAmJiAoR0JBVFsyXSA9PSAoc2lnbmVkIGNoYXIpIC0gMykgJiYgKEdCQVRbM10gPT0gKHNpZ25lZCBjaGFyKSAtIDEpCi0gICAgICAgICAgICAgICAgJiYgKEdCQVRbNF0gPT0gMikgJiYgKEdCQVRbNV0gPT0gKHNpZ25lZCBjaGFyKSAtIDIpCi0gICAgICAgICAgICAgICAgJiYgKEdCQVRbNl0gPT0gKHNpZ25lZCBjaGFyKSAtIDIpICYmIChHQkFUWzddID09IChzaWduZWQgY2hhcikgLSAyKSkgewotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdChwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYoR0JURU1QTEFURSA9PSAxKSB7Ci0gICAgICAgIGlmKChHQkFUWzBdID09IDMpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhcikgLSAxKSkgewotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MyhwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdChwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYoR0JURU1QTEFURSA9PSAyKSB7Ci0gICAgICAgIGlmKChHQkFUWzBdID09IDIpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhcikgLSAxKSkgewotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9ICBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMocEltYWdlLCBtX3BBcml0aERlY29kZXIsIG1fZ2JDb250ZXh0LCBwUGF1c2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9ICBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX3Vub3B0KHBJbWFnZSwgbV9wQXJpdGhEZWNvZGVyLCBtX2diQ29udGV4dCwgcFBhdXNlKTsKLSAgICAgICAgfQorRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aChJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpbnQgaWxpbmUgPSBtX2xvb3BJbmRleDsKKyAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UgPSAqbV9wSW1hZ2U7CisgIGlmIChHQlRFTVBMQVRFID09IDApIHsKKyAgICBpZiAoKEdCQVRbMF0gPT0gMykgJiYgKEdCQVRbMV0gPT0gKHNpZ25lZCBjaGFyKS0xKSAmJgorICAgICAgICAoR0JBVFsyXSA9PSAoc2lnbmVkIGNoYXIpLTMpICYmIChHQkFUWzNdID09IChzaWduZWQgY2hhciktMSkgJiYKKyAgICAgICAgKEdCQVRbNF0gPT0gMikgJiYgKEdCQVRbNV0gPT0gKHNpZ25lZCBjaGFyKS0yKSAmJgorICAgICAgICAoR0JBVFs2XSA9PSAoc2lnbmVkIGNoYXIpLTIpICYmIChHQkFUWzddID09IChzaWduZWQgY2hhciktMikpIHsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMocEltYWdlLCBtX3BBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZ2JDb250ZXh0LCBwUGF1c2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKChHQkFUWzBdID09IDIpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhcikgLSAxKSkgewotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MyhwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdChwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0KKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KHBJbWFnZSwgbV9wQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9nYkNvbnRleHQsIHBQYXVzZSk7CiAgICAgfQotICAgIG1fUmVwbGFjZVJlY3QubGVmdCA9IDA7Ci0gICAgbV9SZXBsYWNlUmVjdC5yaWdodCA9IHBJbWFnZS0+bV9uV2lkdGg7Ci0gICAgbV9SZXBsYWNlUmVjdC50b3AgPSBpbGluZTsKLSAgICBtX1JlcGxhY2VSZWN0LmJvdHRvbSA9IG1fbG9vcEluZGV4OwotICAgIGlmKG1fUHJvc3NpdmVTdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSCkgewotICAgICAgICBtX2xvb3BJbmRleCA9IDA7CisgIH0gZWxzZSBpZiAoR0JURU1QTEFURSA9PSAxKSB7CisgICAgaWYgKChHQkFUWzBdID09IDMpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhciktMSkpIHsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMocEltYWdlLCBtX3BBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZ2JDb250ZXh0LCBwUGF1c2UpOworICAgIH0gZWxzZSB7CisgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdChwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZ2JDb250ZXh0LCBwUGF1c2UpOwogICAgIH0KLSAgICByZXR1cm4gbV9Qcm9zc2l2ZVN0YXR1czsKLX0KLUZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpTdGFydF9kZWNvZGVfQXJpdGhfVjIoQ0pCaWcyX0ltYWdlKiogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmKEdCVyA9PSAwIHx8IEdCSCA9PSAwKSB7Ci0gICAgICAgICogcEltYWdlID0gTlVMTDsKLSAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICB9IGVsc2UgaWYgKEdCVEVNUExBVEUgPT0gMikgeworICAgIGlmICgoR0JBVFswXSA9PSAyKSAmJiAoR0JBVFsxXSA9PSAoc2lnbmVkIGNoYXIpLTEpKSB7CisgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKHBJbWFnZSwgbV9wQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2diQ29udGV4dCwgcFBhdXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQocEltYWdlLCBtX3BBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2diQ29udGV4dCwgcFBhdXNlKTsKICAgICB9Ci0gICAgaWYoKnBJbWFnZSA9PSBOVUxMKSB7Ci0gICAgICAgIEpCSUcyX0FMTE9DKCgqcEltYWdlKSwgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIH0gZWxzZSB7CisgICAgaWYgKChHQkFUWzBdID09IDIpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhciktMSkpIHsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdDMocEltYWdlLCBtX3BBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZ2JDb250ZXh0LCBwUGF1c2UpOworICAgIH0gZWxzZSB7CisgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdChwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZ2JDb250ZXh0LCBwUGF1c2UpOwogICAgIH0KLSAgICBpZiAoKCpwSW1hZ2UpLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlICpwSW1hZ2U7Ci0gICAgICAgICpwSW1hZ2UgPSBOVUxMOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwgR0JXLCBHQkgpOwotICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0gICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKLSAgICB9Ci0gICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWTsKLSAgICBtX0RlY29kZVR5cGUgPSAyOwotICAgIG1fcFBhdXNlID0gcFBhdXNlOwotICAgIG1fcEltYWdlID0gcEltYWdlOwotICAgICgqbV9wSW1hZ2UpLT5maWxsKDApOwotICAgIExUUCA9IDA7CisgIH0KKyAgbV9SZXBsYWNlUmVjdC5sZWZ0ID0gMDsKKyAgbV9SZXBsYWNlUmVjdC5yaWdodCA9IHBJbWFnZS0+bV9uV2lkdGg7CisgIG1fUmVwbGFjZVJlY3QudG9wID0gaWxpbmU7CisgIG1fUmVwbGFjZVJlY3QuYm90dG9tID0gbV9sb29wSW5kZXg7CisgIGlmIChtX1Byb3NzaXZlU3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0gpIHsKICAgICBtX2xvb3BJbmRleCA9IDA7Ci0gICAgbV9wQXJpdGhEZWNvZGVyID0gcEFyaXRoRGVjb2RlcjsKLSAgICBtX2diQ29udGV4dCA9IGdiQ29udGV4dDsKLSAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1YyKHBQYXVzZSk7CisgIH0KKyAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7CiB9Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1YyKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUcgPSAqbV9wSW1hZ2U7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBHQlJFRy0+ZmlsbCgwKTsKLSAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIHN3aXRjaChHQlRFTVBMQVRFKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHg5YjI1OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAweDA3OTU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4MDBlNTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHgwMTk1OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNMVFAgPSBtX3BBcml0aERlY29kZXItPkRFQ09ERSgmbV9nYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoKEdCVEVNUExBVEUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAyKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgbV9sb29wSW5kZXggLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMl0sIG1fbG9vcEluZGV4ICsgR0JBVFszXSkgPDwgMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBtX2xvb3BJbmRleCArIEdCQVRbNV0pIDw8IDExOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDEyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFs2XSwgbV9sb29wSW5kZXggKyBHQkFUWzddKSA8PCAxNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IG1fcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZtX2diQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIG1fbG9vcEluZGV4LCBiVmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBtX2xvb3BJbmRleCAtIDIpKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBtX2xvb3BJbmRleCAtIDEpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDBmOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTogewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgbV9sb29wSW5kZXggLSAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDIpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAyKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgbV9sb29wSW5kZXggLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gbV9wQXJpdGhEZWNvZGVyLT5ERUNPREUoJm1fZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIG1fbG9vcEluZGV4IC0gMikpICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIG1fbG9vcEluZGV4IC0gMSkpICYgMHgxZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIG1fbG9vcEluZGV4IC0gMikgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gR0JSRUctPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gbV9wQXJpdGhEZWNvZGVyLT5ERUNPREUoJm1fZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMikpICYgMHgwNzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMSkpICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIG1fbG9vcEluZGV4IC0gMSkgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgbV9sb29wSW5kZXggKyBHQkFUWzFdKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBtX3BBcml0aERlY29kZXItPkRFQ09ERSgmbV9nYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBtX2xvb3BJbmRleCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAxKSkgJiAweDFmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX2xvb3BJbmRleCArKzsKLSAgICAgICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICB9CitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6U3RhcnRfZGVjb2RlX0FyaXRoX1YyKAorICAgIENKQmlnMl9JbWFnZSoqIHBJbWFnZSwKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAoR0JXID09IDAgfHwgR0JIID09IDApIHsKKyAgICAqcEltYWdlID0gTlVMTDsKICAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgfQorICBpZiAoKnBJbWFnZSA9PSBOVUxMKSB7CisgICAgSkJJRzJfQUxMT0MoKCpwSW1hZ2UpLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKKyAgfQorICBpZiAoKCpwSW1hZ2UpLT5tX3BEYXRhID09IE5VTEwpIHsKKyAgICBkZWxldGUgKnBJbWFnZTsKKyAgICAqcEltYWdlID0gTlVMTDsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKAorICAgICAgICAiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAiCisgICAgICAgICIlZCwgaGVpZ2h0ID0gJWRcbiIsCisgICAgICAgIEdCVywgR0JIKTsKKyAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICB9CisgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFk7CisgIG1fRGVjb2RlVHlwZSA9IDI7CisgIG1fcFBhdXNlID0gcFBhdXNlOworICBtX3BJbWFnZSA9IHBJbWFnZTsKKyAgKCptX3BJbWFnZSktPmZpbGwoMCk7CisgIExUUCA9IDA7CisgIG1fbG9vcEluZGV4ID0gMDsKKyAgbV9wQXJpdGhEZWNvZGVyID0gcEFyaXRoRGVjb2RlcjsKKyAgbV9nYkNvbnRleHQgPSBnYkNvbnRleHQ7CisgIHJldHVybiBkZWNvZGVfQXJpdGhfVjIocFBhdXNlKTsKIH0KLUZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpTdGFydF9kZWNvZGVfQXJpdGhfVjEoQ0pCaWcyX0ltYWdlKiogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmKEdCVyA9PSAwIHx8IEdCSCA9PSAwKSB7Ci0gICAgICAgICogcEltYWdlID0gTlVMTDsKLSAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgIH0KLSAgICBpZigqcEltYWdlID09IE5VTEwpIHsKLSAgICAgICAgSkJJRzJfQUxMT0MoKCpwSW1hZ2UpLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICB9Ci0gICAgaWYgKCgqcEltYWdlKS0+bV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSAqcEltYWdlOwotICAgICAgICAqcEltYWdlID0gTlVMTDsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsIEdCVywgR0JIKTsKLSAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0gICAgfQotICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFk7Ci0gICAgbV9wUGF1c2UgPSBwUGF1c2U7Ci0gICAgbV9wSW1hZ2UgPSBwSW1hZ2U7Ci0gICAgbV9EZWNvZGVUeXBlID0gMzsKLSAgICAoKm1fcEltYWdlKS0+ZmlsbCgwKTsKLSAgICBMVFAgPSAwOwotICAgIG1fbG9vcEluZGV4ID0gMDsKLSAgICBtX3BBcml0aERlY29kZXIgPSBwQXJpdGhEZWNvZGVyOwotICAgIG1fZ2JDb250ZXh0ID0gZ2JDb250ZXh0OwotICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVjEocFBhdXNlKTsKLX0KLUZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVjEoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQgPSAwOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUcgPSAoKm1fcEltYWdlKTsKLSAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIHN3aXRjaChHQlRFTVBMQVRFKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHg5YjI1OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAweDA3OTU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4MDBlNTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHgwMTk1OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNMVFAgPSBtX3BBcml0aERlY29kZXItPkRFQ09ERSgmbV9nYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIEdCUkVHLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCAtIDEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIG1fbG9vcEluZGV4LCAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMDsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKEdCVEVNUExBVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgbV9sb29wSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBtX2xvb3BJbmRleCkgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMywgbV9sb29wSW5kZXgpIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDQsIG1fbG9vcEluZGV4KSA8PCAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMSkgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgbV9sb29wSW5kZXggLSAxKSA8PCA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4IC0gMSkgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgbV9sb29wSW5kZXggLSAxKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBtX2xvb3BJbmRleCAtIDEpIDw8IDk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMl0sIG1fbG9vcEluZGV4ICsgR0JBVFszXSkgPDwgMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbNF0sIG1fbG9vcEluZGV4ICsgR0JBVFs1XSkgPDwgMTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIG1fbG9vcEluZGV4IC0gMikgPDwgMTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXggLSAyKSA8PCAxMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgbV9sb29wSW5kZXggLSAyKSA8PCAxNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFs2XSwgbV9sb29wSW5kZXggKyBHQkFUWzddKSA8PCAxNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgbV9sb29wSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBtX2xvb3BJbmRleCkgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMywgbV9sb29wSW5kZXgpIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAxKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXggLSAxKSA8PCA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDIsIG1fbG9vcEluZGV4IC0gMSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAyKSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBtX2xvb3BJbmRleCAtIDIpIDw8IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4IC0gMikgPDwgMTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4IC0gMikgPDwgMTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgbV9sb29wSW5kZXgpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgbV9sb29wSW5kZXggLSAxKSA8PCAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4IC0gMSkgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgbV9sb29wSW5kZXggLSAxKSA8PCA1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBtX2xvb3BJbmRleCAtIDEpIDw8IDY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIG1fbG9vcEluZGV4IC0gMikgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCAtIDIpIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4IC0gMikgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgbV9sb29wSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBtX2xvb3BJbmRleCkgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMywgbV9sb29wSW5kZXgpIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDQsIG1fbG9vcEluZGV4KSA8PCAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIG1fbG9vcEluZGV4IC0gMSkgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCAtIDEpIDw8IDY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4IC0gMSkgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgbV9sb29wSW5kZXggLSAxKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAzLCBtX2xvb3BJbmRleCAtIDEpIDw8IDk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IG1fcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZtX2diQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBtX2xvb3BJbmRleCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fbG9vcEluZGV4ICsrOwotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLX0KLUZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpTdGFydF9kZWNvZGVfTU1SKENKQmlnMl9JbWFnZSoqIHBJbWFnZSwgQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaW50IGJpdHBvcywgaTsKLSAgICBKQklHMl9BTExPQygoKiBwSW1hZ2UpLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBpZiAoKCogcEltYWdlKS0+bV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSAoKiBwSW1hZ2UpOwotICAgICAgICAoKiBwSW1hZ2UpID0gTlVMTDsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsIEdCVywgR0JIKTsKLSAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICByZXR1cm4gbV9Qcm9zc2l2ZVN0YXR1czsKLSAgICB9Ci0gICAgYml0cG9zID0gKGludClwU3RyZWFtLT5nZXRCaXRQb3MoKTsKLSAgICBfRmF4RzREZWNvZGUobV9wTW9kdWxlLCBwU3RyZWFtLT5nZXRCdWYoKSwgcFN0cmVhbS0+Z2V0TGVuZ3RoKCksICZiaXRwb3MsICgqIHBJbWFnZSktPm1fcERhdGEsIEdCVywgR0JILCAoKiBwSW1hZ2UpLT5tX25TdHJpZGUpOwotICAgIHBTdHJlYW0tPnNldEJpdFBvcyhiaXRwb3MpOwotICAgIGZvcihpID0gMDsgKEZYX0RXT1JEKWkgPCAoKiBwSW1hZ2UpLT5tX25TdHJpZGUgKiBHQkg7IGkrKykgewotICAgICAgICAoKiBwSW1hZ2UpLT5tX3BEYXRhW2ldID0gfigqIHBJbWFnZSktPm1fcERhdGFbaV07Ci0gICAgfQotICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgIHJldHVybiBtX1Byb3NzaXZlU3RhdHVzOwotfQotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9NTVIoKQotewotICAgIHJldHVybiBtX1Byb3NzaXZlU3RhdHVzOwotfQotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OkNvbnRpbnVlX2RlY29kZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZihtX1Byb3NzaXZlU3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7Ci0gICAgfQotICAgIHN3aXRjaCAobV9EZWNvZGVUeXBlKSB7CitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1YyKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgQ0pCaWcyX0ltYWdlKiBHQlJFRyA9ICptX3BJbWFnZTsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKKyAgTFRQID0gMDsKKyAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBHQlJFRy0+ZmlsbCgwKTsKKyAgZm9yICg7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgc3dpdGNoIChHQlRFTVBMQVRFKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBDT05URVhUID0gMHg5YjI1OworICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoKHBQYXVzZSk7CisgICAgICAgICAgQ09OVEVYVCA9IDB4MDc5NTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9WMihwUGF1c2UpOworICAgICAgICAgIENPTlRFWFQgPSAweDAwZTU7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVjEocFBhdXNlKTsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9NTVIoKTsKKyAgICAgICAgICBDT05URVhUID0gMHgwMTk1OworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgU0xUUCA9IG1fcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZtX2diQ29udGV4dFtDT05URVhUXSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOwogICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIEdCUkVHLT5jb3B5TGluZShtX2xvb3BJbmRleCwgbV9sb29wSW5kZXggLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChHQlRFTVBMQVRFKSB7CisgICAgICAgIGNhc2UgMDogeworICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMik7CisgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIG1fbG9vcEluZGV4IC0gMikgPDwgMTsKKyAgICAgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgyLCBtX2xvb3BJbmRleCAtIDEpOworICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDE7CisgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDAsIG1fbG9vcEluZGV4IC0gMSkgPDwgMjsKKyAgICAgICAgICBsaW5lMyA9IDA7CisgICAgICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7CisgICAgICAgICAgICBpZiAoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCkpIHsKKyAgICAgICAgICAgICAgYlZhbCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNDsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA1OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFsyXSwgbV9sb29wSW5kZXggKyBHQkFUWzNdKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDEwOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFs0XSwgbV9sb29wSW5kZXggKyBHQkFUWzVdKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDExOworICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDEyOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFs2XSwgbV9sb29wSW5kZXggKyBHQkFUWzddKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE1OworICAgICAgICAgICAgICBiVmFsID0gbV9wQXJpdGhEZWNvZGVyLT5ERUNPREUoJm1fZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiVmFsKSB7CisgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBtX2xvb3BJbmRleCwgYlZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lMSA9CisgICAgICAgICAgICAgICAgKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAyKSkgJiAweDA3OworICAgICAgICAgICAgbGluZTIgPQorICAgICAgICAgICAgICAgICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIG1fbG9vcEluZGV4IC0gMSkpICYgMHgxZjsKKyAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwZjsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgMTogeworICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDIsIG1fbG9vcEluZGV4IC0gMik7CisgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMikgPDwgMTsKKyAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAyKSA8PCAyOworICAgICAgICAgIGxpbmUyID0gR0JSRUctPmdldFBpeGVsKDIsIG1fbG9vcEluZGV4IC0gMSk7CisgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMSkgPDwgMTsKKyAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAyOworICAgICAgICAgIGxpbmUzID0gMDsKKyAgICAgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgICAgIGlmIChVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgeworICAgICAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAzOworICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDQ7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgOTsKKyAgICAgICAgICAgICAgYlZhbCA9IG1fcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZtX2diQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYlZhbCkgeworICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZTEgPQorICAgICAgICAgICAgICAgICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIG1fbG9vcEluZGV4IC0gMikpICYgMHgwZjsKKyAgICAgICAgICAgIGxpbmUyID0KKyAgICAgICAgICAgICAgICAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBtX2xvb3BJbmRleCAtIDEpKSAmIDB4MWY7CisgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDc7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDIpOworICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBtX2xvb3BJbmRleCAtIDIpIDw8IDE7CisgICAgICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMSwgbV9sb29wSW5kZXggLSAxKTsKKyAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAxOworICAgICAgICAgIGxpbmUzID0gMDsKKyAgICAgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgICAgIGlmIChVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgeworICAgICAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAyOworICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDM7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgNzsKKyAgICAgICAgICAgICAgYlZhbCA9IG1fcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZtX2diQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYlZhbCkgeworICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZTEgPQorICAgICAgICAgICAgICAgICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMikpICYgMHgwNzsKKyAgICAgICAgICAgIGxpbmUyID0KKyAgICAgICAgICAgICAgICAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBtX2xvb3BJbmRleCAtIDEpKSAmIDB4MGY7CisgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDM7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpOworICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBtX2xvb3BJbmRleCAtIDEpIDw8IDE7CisgICAgICAgICAgbGluZTIgPSAwOworICAgICAgICAgIGZvciAoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgeworICAgICAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXgpKSB7CisgICAgICAgICAgICAgIGJWYWwgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUyOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgbV9sb29wSW5kZXggKyBHQkFUWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDQ7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgNTsKKyAgICAgICAgICAgICAgYlZhbCA9IG1fcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZtX2diQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYlZhbCkgeworICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZTEgPQorICAgICAgICAgICAgICAgICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMSkpICYgMHgxZjsKKyAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwZjsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX2xvb3BJbmRleCsrOworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgICB9CisgIH0KKyAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworfQorRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OlN0YXJ0X2RlY29kZV9Bcml0aF9WMSgKKyAgICBDSkJpZzJfSW1hZ2UqKiBwSW1hZ2UsCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaWYgKEdCVyA9PSAwIHx8IEdCSCA9PSAwKSB7CisgICAgKnBJbWFnZSA9IE5VTEw7CisgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgIH0KKyAgaWYgKCpwSW1hZ2UgPT0gTlVMTCkgeworICAgIEpCSUcyX0FMTE9DKCgqcEltYWdlKSwgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIH0KKyAgaWYgKCgqcEltYWdlKS0+bV9wRGF0YSA9PSBOVUxMKSB7CisgICAgZGVsZXRlICpwSW1hZ2U7CisgICAgKnBJbWFnZSA9IE5VTEw7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gIgorICAgICAgICAiJWQsIGhlaWdodCA9ICVkXG4iLAorICAgICAgICBHQlcsIEdCSCk7CisgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKyAgfQorICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOworICBtX3BQYXVzZSA9IHBQYXVzZTsKKyAgbV9wSW1hZ2UgPSBwSW1hZ2U7CisgIG1fRGVjb2RlVHlwZSA9IDM7CisgICgqbV9wSW1hZ2UpLT5maWxsKDApOworICBMVFAgPSAwOworICBtX2xvb3BJbmRleCA9IDA7CisgIG1fcEFyaXRoRGVjb2RlciA9IHBBcml0aERlY29kZXI7CisgIG1fZ2JDb250ZXh0ID0gZ2JDb250ZXh0OworICByZXR1cm4gZGVjb2RlX0FyaXRoX1YxKHBQYXVzZSk7Cit9CitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1YxKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVCA9IDA7CisgIENKQmlnMl9JbWFnZSogR0JSRUcgPSAoKm1fcEltYWdlKTsKKyAgZm9yICg7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgc3dpdGNoIChHQlRFTVBMQVRFKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBDT05URVhUID0gMHg5YjI1OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgQ09OVEVYVCA9IDB4MDc5NTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIENPTlRFWFQgPSAweDAwZTU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBDT05URVhUID0gMHgwMTk1OworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgU0xUUCA9IG1fcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZtX2diQ29udGV4dFtDT05URVhUXSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIGZvciAoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgeworICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIEdCUkVHLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCAtIDEpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7CisgICAgICAgIGlmIChVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgeworICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBtX2xvb3BJbmRleCwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ09OVEVYVCA9IDA7CisgICAgICAgICAgc3dpdGNoIChHQlRFTVBMQVRFKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBtX2xvb3BJbmRleCk7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBtX2xvb3BJbmRleCkgPDwgMTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDMsIG1fbG9vcEluZGV4KSA8PCAyOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gNCwgbV9sb29wSW5kZXgpIDw8IDM7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNDsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMSkgPDwgNTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIG1fbG9vcEluZGV4IC0gMSkgPDwgNjsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXggLSAxKSA8PCA3OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgbV9sb29wSW5kZXggLSAxKSA8PCA4OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgbV9sb29wSW5kZXggLSAxKSA8PCA5OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFsyXSwgbV9sb29wSW5kZXggKyBHQkFUWzNdKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDEwOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFs0XSwgbV9sb29wSW5kZXggKyBHQkFUWzVdKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDExOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgbV9sb29wSW5kZXggLSAyKSA8PCAxMjsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXggLSAyKSA8PCAxMzsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4IC0gMikgPDwgMTQ7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzZdLCBtX2xvb3BJbmRleCArIEdCQVRbN10pCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgbV9sb29wSW5kZXgpOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgbV9sb29wSW5kZXgpIDw8IDE7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAzLCBtX2xvb3BJbmRleCkgPDwgMjsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAzOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAxKSA8PCA0OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgbV9sb29wSW5kZXggLSAxKSA8PCA1OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCAtIDEpIDw8IDY7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDc7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBtX2xvb3BJbmRleCAtIDEpIDw8IDg7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAyLCBtX2xvb3BJbmRleCAtIDIpIDw8IDk7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBtX2xvb3BJbmRleCAtIDIpIDw8IDEwOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCAtIDIpIDw8IDExOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgbV9sb29wSW5kZXggLSAyKSA8PCAxMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBtX2xvb3BJbmRleCk7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBtX2xvb3BJbmRleCkgPDwgMTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAyOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgbV9sb29wSW5kZXggLSAxKSA8PCAzOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCAtIDEpIDw8IDQ7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDU7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBtX2xvb3BJbmRleCAtIDEpIDw8IDY7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBtX2xvb3BJbmRleCAtIDIpIDw8IDc7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4IC0gMikgPDwgODsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4IC0gMikgPDwgOTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBtX2xvb3BJbmRleCk7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBtX2xvb3BJbmRleCkgPDwgMTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDMsIG1fbG9vcEluZGV4KSA8PCAyOworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gNCwgbV9sb29wSW5kZXgpIDw8IDM7CisgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNDsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIG1fbG9vcEluZGV4IC0gMSkgPDwgNTsKKyAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXggLSAxKSA8PCA2OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgbV9sb29wSW5kZXggLSAxKSA8PCA3OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgbV9sb29wSW5kZXggLSAxKSA8PCA4OworICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMywgbV9sb29wSW5kZXggLSAxKSA8PCA5OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgYlZhbCA9IG1fcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZtX2diQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIG1fbG9vcEluZGV4LCBiVmFsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgbV9sb29wSW5kZXgrKzsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgfQorICB9CisgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKK30KK0ZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpTdGFydF9kZWNvZGVfTU1SKENKQmlnMl9JbWFnZSoqIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpbnQgYml0cG9zLCBpOworICBKQklHMl9BTExPQygoKnBJbWFnZSksIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBpZiAoKCpwSW1hZ2UpLT5tX3BEYXRhID09IE5VTEwpIHsKKyAgICBkZWxldGUgKCpwSW1hZ2UpOworICAgICgqcEltYWdlKSA9IE5VTEw7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigKKyAgICAgICAgIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gIgorICAgICAgICAiJWQsIGhlaWdodCA9ICVkXG4iLAorICAgICAgICBHQlcsIEdCSCk7CiAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwogICAgIHJldHVybiBtX1Byb3NzaXZlU3RhdHVzOworICB9CisgIGJpdHBvcyA9IChpbnQpcFN0cmVhbS0+Z2V0Qml0UG9zKCk7CisgIF9GYXhHNERlY29kZShtX3BNb2R1bGUsIHBTdHJlYW0tPmdldEJ1ZigpLCBwU3RyZWFtLT5nZXRMZW5ndGgoKSwgJmJpdHBvcywKKyAgICAgICAgICAgICAgICgqcEltYWdlKS0+bV9wRGF0YSwgR0JXLCBHQkgsICgqcEltYWdlKS0+bV9uU3RyaWRlKTsKKyAgcFN0cmVhbS0+c2V0Qml0UG9zKGJpdHBvcyk7CisgIGZvciAoaSA9IDA7IChGWF9EV09SRClpIDwgKCpwSW1hZ2UpLT5tX25TdHJpZGUgKiBHQkg7IGkrKykgeworICAgICgqcEltYWdlKS0+bV9wRGF0YVtpXSA9IH4oKnBJbWFnZSktPm1fcERhdGFbaV07CisgIH0KKyAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgIHJldHVybiBtX1Byb3NzaXZlU3RhdHVzOwogfQotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhDSkJpZzJfSW1hZ2UgKnBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9CT09MIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7Ci0gICAgdWludDhfdCAqcExpbmUxLCAqcExpbmUyLCBjVmFsOwotICAgIGludDMyX3QgblN0cmlkZSwgblN0cmlkZTIsIGs7Ci0gICAgaW50MzJfdCBuTGluZUJ5dGVzLCBuQml0c0xlZnQsIGNjOwotICAgIGlmKG1fcExpbmUgPT0gTlVMTCkgewotICAgICAgICBtX3BMaW5lID0gcEltYWdlLT5tX3BEYXRhOwotICAgIH0KLSAgICBuU3RyaWRlID0gcEltYWdlLT5tX25TdHJpZGU7Ci0gICAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7Ci0gICAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwotICAgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwotICAgIEZYX0RXT1JEIGhlaWdodCA9IEdCSCAmIDB4N2ZmZmZmZmY7Ci0gICAgZm9yKDsgbV9sb29wSW5kZXggPCBoZWlnaHQ7IG1fbG9vcEluZGV4KyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHg5YjI1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBwSW1hZ2UtPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYobV9sb29wSW5kZXggPiAxKSB7Ci0gICAgICAgICAgICAgICAgcExpbmUxID0gbV9wTGluZSAtIG5TdHJpZGUyOwotICAgICAgICAgICAgICAgIHBMaW5lMiA9IG1fcExpbmUgLSBuU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmUxID0gKCpwTGluZTErKykgPDwgNjsKLSAgICAgICAgICAgICAgICBsaW5lMiA9ICpwTGluZTIrKzsKLSAgICAgICAgICAgICAgICBDT05URVhUID0gKChsaW5lMSAmIDB4ZjgwMCkgfCAobGluZTIgJiAweDA3ZjApKTsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKCpwTGluZTErKykgPDwgNik7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKCgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMSA+PiBrKSAmIDB4MDgwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+IGspICYgMHgwMDEwKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA8PD0gODsKLSAgICAgICAgICAgICAgICBsaW5lMiA8PD0gODsKLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDgwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKDcgLSBrKSkgJiAweDAwMTApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBMaW5lMiA9IG1fcExpbmUgLSBuU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKG1fbG9vcEluZGV4ICYgMSkgPyAoKnBMaW5lMisrKSA6IDA7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMiAmIDB4MDdmMCk7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1fbG9vcEluZGV4ICYgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSA3OyBrID49IDA7IGstLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gaykgJiAweDAwMTApKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3BMaW5lW2NjXSA9IGNWYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUyIDw8PSA4OwotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKCgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+ICg3IC0gaykpICYgMHgwMDEwKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fcExpbmUgKz0gblN0cmlkZTsKLSAgICAgICAgaWYocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgbV9sb29wSW5kZXgrKzsKLSAgICAgICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX01NUigpIHsKKyAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7CiB9Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdChDSkJpZzJfSW1hZ2UgKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKLSAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDliMjVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IHBJbWFnZS0+Z2V0UGl4ZWwoMSwgbV9sb29wSW5kZXggLSAyKTsKLSAgICAgICAgICAgIGxpbmUxIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAyKSA8PCAxOwotICAgICAgICAgICAgbGluZTIgPSBwSW1hZ2UtPmdldFBpeGVsKDIsIG1fbG9vcEluZGV4IC0gMSk7Ci0gICAgICAgICAgICBsaW5lMiB8PSBwSW1hZ2UtPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMSkgPDwgMTsKLSAgICAgICAgICAgIGxpbmUyIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAyOwotICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gcEltYWdlLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgbV9sb29wSW5kZXggKyBHQkFUWzFdKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gcEltYWdlLT5nZXRQaXhlbCh3ICsgR0JBVFsyXSwgbV9sb29wSW5kZXggKyBHQkFUWzNdKSA8PCAxMDsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBtX2xvb3BJbmRleCArIEdCQVRbNV0pIDw8IDExOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDEyOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbNl0sIG1fbG9vcEluZGV4ICsgR0JBVFs3XSkgPDwgMTU7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlLT5zZXRQaXhlbCh3LCBtX2xvb3BJbmRleCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IHBJbWFnZS0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMikpICYgMHgwNzsKLSAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBwSW1hZ2UtPmdldFBpeGVsKHcgKyAzLCBtX2xvb3BJbmRleCAtIDEpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDBmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fbG9vcEluZGV4Kys7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OkNvbnRpbnVlX2RlY29kZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAobV9Qcm9zc2l2ZVN0YXR1cyAhPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7CisgICAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7CisgIH0KKyAgc3dpdGNoIChtX0RlY29kZVR5cGUpIHsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoKHBQYXVzZSk7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9WMihwUGF1c2UpOworICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVjEocFBhdXNlKTsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gZGVjb2RlX01NUigpOworICB9CisgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKKyAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7CiB9Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKENKQmlnMl9JbWFnZSAqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKLSAgICB1aW50OF90ICpwTGluZTEsICpwTGluZTIsIGNWYWw7Ci0gICAgaW50MzJfdCBuU3RyaWRlLCBuU3RyaWRlMiwgazsKLSAgICBpbnQzMl90IG5MaW5lQnl0ZXMsIG5CaXRzTGVmdCwgY2M7Ci0gICAgaWYgKCFtX3BMaW5lKSB7Ci0gICAgICAgIG1fcExpbmUgPSBwSW1hZ2UtPm1fcERhdGE7CitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQzKAorICAgIENKQmlnMl9JbWFnZSogcEltYWdlLAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOworICB1aW50OF90ICpwTGluZTEsICpwTGluZTIsIGNWYWw7CisgIGludDMyX3QgblN0cmlkZSwgblN0cmlkZTIsIGs7CisgIGludDMyX3QgbkxpbmVCeXRlcywgbkJpdHNMZWZ0LCBjYzsKKyAgaWYgKG1fcExpbmUgPT0gTlVMTCkgeworICAgIG1fcExpbmUgPSBwSW1hZ2UtPm1fcERhdGE7CisgIH0KKyAgblN0cmlkZSA9IHBJbWFnZS0+bV9uU3RyaWRlOworICBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKKyAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOworICBuQml0c0xlZnQgPSBHQlcgLSAobkxpbmVCeXRlcyA8PCAzKTsKKyAgRlhfRFdPUkQgaGVpZ2h0ID0gR0JIICYgMHg3ZmZmZmZmZjsKKyAgZm9yICg7IG1fbG9vcEluZGV4IDwgaGVpZ2h0OyBtX2xvb3BJbmRleCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4OWIyNV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKICAgICB9Ci0gICAgblN0cmlkZSA9IHBJbWFnZS0+bV9uU3RyaWRlOwotICAgIG5TdHJpZGUyID0gblN0cmlkZSA8PCAxOwotICAgIG5MaW5lQnl0ZXMgPSAoKEdCVyArIDcpID4+IDMpIC0gMTsKLSAgICBuQml0c0xlZnQgPSBHQlcgLSAobkxpbmVCeXRlcyA8PCAzKTsKLSAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDA3OTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBwSW1hZ2UtPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9sb29wSW5kZXggPiAxKSB7CisgICAgICAgIHBMaW5lMSA9IG1fcExpbmUgLSBuU3RyaWRlMjsKKyAgICAgICAgcExpbmUyID0gbV9wTGluZSAtIG5TdHJpZGU7CisgICAgICAgIGxpbmUxID0gKCpwTGluZTErKykgPDwgNjsKKyAgICAgICAgbGluZTIgPSAqcExpbmUyKys7CisgICAgICAgIENPTlRFWFQgPSAoKGxpbmUxICYgMHhmODAwKSB8IChsaW5lMiAmIDB4MDdmMCkpOworICAgICAgICBmb3IgKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7CisgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKCpwTGluZTErKykgPDwgNik7CisgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKKyAgICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgICBmb3IgKGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOworICAgICAgICAgICAgQ09OVEVYVCA9ICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gaykgJiAweDA4MDApIHwgKChsaW5lMiA+PiBrKSAmIDB4MDAxMCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBtX3BMaW5lW2NjXSA9IGNWYWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZihtX2xvb3BJbmRleCA+IDEpIHsKLSAgICAgICAgICAgICAgICBwTGluZTEgPSBtX3BMaW5lIC0gblN0cmlkZTI7Ci0gICAgICAgICAgICAgICAgcExpbmUyID0gbV9wTGluZSAtIG5TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAoKnBMaW5lMSsrKSA8PCA0OwotICAgICAgICAgICAgICAgIGxpbmUyID0gKnBMaW5lMisrOwotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDFlMDApIHwgKChsaW5lMiA+PiAxKSAmIDB4MDFmOCk7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDQpOwotICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOwotICAgICAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSA3OyBrID49IDA7IGstLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUxID4+IGspICYgMHgwMjAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoayArIDEpKSAmIDB4MDAwOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA8PD0gODsKLSAgICAgICAgICAgICAgICBsaW5lMiA8PD0gODsKLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAyMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKDggLSBrKSkgJiAweDAwMDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcExpbmUyID0gbV9wTGluZSAtIG5TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAobV9sb29wSW5kZXggJiAxKSA/ICgqcExpbmUyKyspIDogMDsKLSAgICAgICAgICAgICAgICBDT05URVhUID0gKGxpbmUyID4+IDEpICYgMHgwMWY4OwotICAgICAgICAgICAgICAgIGZvcihjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgewotICAgICAgICAgICAgICAgICAgICBpZihtX2xvb3BJbmRleCAmIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihrID0gNzsgayA+PSAwOyBrLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoayArIDEpKSAmIDB4MDAwOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMiA8PD0gODsKLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKDggLSBrKSkgJiAweDAwMDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgbGluZTEgPDw9IDg7CisgICAgICAgIGxpbmUyIDw8PSA4OworICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0KKyAgICAgICAgICAgICAgKCgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDA4MDApIHwgKChsaW5lMiA+PiAoNyAtIGspKSAmIDB4MDAxMCkpOwogICAgICAgICB9Ci0gICAgICAgIG1fcExpbmUgKz0gblN0cmlkZTsKLSAgICAgICAgaWYocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgbV9sb29wSW5kZXgrKzsKLSAgICAgICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICAgIG1fcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcExpbmUyID0gbV9wTGluZSAtIG5TdHJpZGU7CisgICAgICAgIGxpbmUyID0gKG1fbG9vcEluZGV4ICYgMSkgPyAoKnBMaW5lMisrKSA6IDA7CisgICAgICAgIENPTlRFWFQgPSAobGluZTIgJiAweDA3ZjApOworICAgICAgICBmb3IgKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7CisgICAgICAgICAgaWYgKG1fbG9vcEluZGV4ICYgMSkgeworICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPQorICAgICAgICAgICAgICAgICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbCB8ICgobGluZTIgPj4gaykgJiAweDAwMTApKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOwogICAgICAgICB9CisgICAgICAgIGxpbmUyIDw8PSA4OworICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKCgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgICgobGluZTIgPj4gKDcgLSBrKSkgJiAweDAwMTApKTsKKyAgICAgICAgfQorICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKKyAgICAgIH0KICAgICB9Ci0gICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgICAgbV9wTGluZSArPSBuU3RyaWRlOworICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX2xvb3BJbmRleCsrOworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgICB9CisgIH0KKyAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwogfQotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoQ0pCaWcyX0ltYWdlICogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwNzk1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBwSW1hZ2UtPmNvcHlMaW5lKGgsIGggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmUxID0gcEltYWdlLT5nZXRQaXhlbCgyLCBoIC0gMik7Ci0gICAgICAgICAgICBsaW5lMSB8PSBwSW1hZ2UtPmdldFBpeGVsKDEsIGggLSAyKSA8PCAxOwotICAgICAgICAgICAgbGluZTEgfD0gcEltYWdlLT5nZXRQaXhlbCgwLCBoIC0gMikgPDwgMjsKLSAgICAgICAgICAgIGxpbmUyID0gcEltYWdlLT5nZXRQaXhlbCgyLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMiB8PSBwSW1hZ2UtPmdldFBpeGVsKDEsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTIgfD0gcEltYWdlLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmUzID0gMDsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gcEltYWdlLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA5OwotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+c2V0UGl4ZWwodywgaCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IHBJbWFnZS0+Z2V0UGl4ZWwodyArIDMsIGggLSAyKSkgJiAweDBmOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IHBJbWFnZS0+Z2V0UGl4ZWwodyArIDMsIGggLSAxKSkgJiAweDFmOwotICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX2xvb3BJbmRleCsrOwotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgfQorRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfdW5vcHQoCisgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfQk9PTCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOworICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHg5YjI1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOwogICAgIH0KLSAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUxID0gcEltYWdlLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDIpOworICAgICAgbGluZTEgfD0gcEltYWdlLT5nZXRQaXhlbCgwLCBtX2xvb3BJbmRleCAtIDIpIDw8IDE7CisgICAgICBsaW5lMiA9IHBJbWFnZS0+Z2V0UGl4ZWwoMiwgbV9sb29wSW5kZXggLSAxKTsKKyAgICAgIGxpbmUyIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMSwgbV9sb29wSW5kZXggLSAxKSA8PCAxOworICAgICAgbGluZTIgfD0gcEltYWdlLT5nZXRQaXhlbCgwLCBtX2xvb3BJbmRleCAtIDEpIDw8IDI7CisgICAgICBsaW5lMyA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXgpKSB7CisgICAgICAgICAgYlZhbCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOworICAgICAgICAgIENPTlRFWFQgfD0gcEltYWdlLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgbV9sb29wSW5kZXggKyBHQkFUWzFdKSA8PCA0OworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNTsKKyAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbMl0sIG1fbG9vcEluZGV4ICsgR0JBVFszXSkgPDwgMTA7CisgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBtX2xvb3BJbmRleCArIEdCQVRbNV0pIDw8IDExOworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgMTI7CisgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzZdLCBtX2xvb3BJbmRleCArIEdCQVRbN10pIDw8IDE1OworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICBwSW1hZ2UtPnNldFBpeGVsKHcsIG1fbG9vcEluZGV4LCBiVmFsKTsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA9CisgICAgICAgICAgICAoKGxpbmUxIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAyKSkgJiAweDA3OworICAgICAgICBsaW5lMiA9CisgICAgICAgICAgICAoKGxpbmUyIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMywgbV9sb29wSW5kZXggLSAxKSkgJiAweDFmOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MGY7CisgICAgICB9CisgICAgfQorICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX2xvb3BJbmRleCsrOworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgICB9CisgIH0KKyAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwogfQotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MyhDSkJpZzJfSW1hZ2UgKnBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9CT09MIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7Ci0gICAgdWludDhfdCAqcExpbmUxLCAqcExpbmUyLCBjVmFsOwotICAgIGludDMyX3QgblN0cmlkZSwgblN0cmlkZTIsIGs7Ci0gICAgaW50MzJfdCBuTGluZUJ5dGVzLCBuQml0c0xlZnQsIGNjOwotICAgIGlmKCFtX3BMaW5lKSB7Ci0gICAgICAgIG1fcExpbmUgPSBwSW1hZ2UtPm1fcERhdGE7CitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKAorICAgIENKQmlnMl9JbWFnZSogcEltYWdlLAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOworICB1aW50OF90ICpwTGluZTEsICpwTGluZTIsIGNWYWw7CisgIGludDMyX3QgblN0cmlkZSwgblN0cmlkZTIsIGs7CisgIGludDMyX3QgbkxpbmVCeXRlcywgbkJpdHNMZWZ0LCBjYzsKKyAgaWYgKCFtX3BMaW5lKSB7CisgICAgbV9wTGluZSA9IHBJbWFnZS0+bV9wRGF0YTsKKyAgfQorICBuU3RyaWRlID0gcEltYWdlLT5tX25TdHJpZGU7CisgIG5TdHJpZGUyID0gblN0cmlkZSA8PCAxOworICBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7CisgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOworICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwNzk1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOwogICAgIH0KLSAgICBuU3RyaWRlID0gcEltYWdlLT5tX25TdHJpZGU7Ci0gICAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7Ci0gICAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwotICAgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwotICAgIGZvcig7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDBlNV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX2xvb3BJbmRleCA+IDEpIHsKKyAgICAgICAgcExpbmUxID0gbV9wTGluZSAtIG5TdHJpZGUyOworICAgICAgICBwTGluZTIgPSBtX3BMaW5lIC0gblN0cmlkZTsKKyAgICAgICAgbGluZTEgPSAoKnBMaW5lMSsrKSA8PCA0OworICAgICAgICBsaW5lMiA9ICpwTGluZTIrKzsKKyAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MWUwMCkgfCAoKGxpbmUyID4+IDEpICYgMHgwMWY4KTsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDQpOworICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiBrKSAmIDB4MDIwMCkgfCAoKGxpbmUyID4+IChrICsgMSkpICYgMHgwMDA4KTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOwogICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBwSW1hZ2UtPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYobV9sb29wSW5kZXggPiAxKSB7Ci0gICAgICAgICAgICAgICAgcExpbmUxID0gbV9wTGluZSAtIG5TdHJpZGUyOwotICAgICAgICAgICAgICAgIHBMaW5lMiA9IG1fcExpbmUgLSBuU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmUxID0gKCpwTGluZTErKykgPDwgMTsKLSAgICAgICAgICAgICAgICBsaW5lMiA9ICpwTGluZTIrKzsKLSAgICAgICAgICAgICAgICBDT05URVhUID0gKGxpbmUxICYgMHgwMzgwKSB8ICgobGluZTIgPj4gMykgJiAweDAwN2MpOwotICAgICAgICAgICAgICAgIGZvcihjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgewotICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8ICgoKnBMaW5lMSsrKSA8PCAxKTsKLSAgICAgICAgICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihrID0gNzsgayA+PSAwOyBrLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMSA+PiBrKSAmIDB4MDA4MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKGsgKyAzKSkgJiAweDAwMDQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcExpbmVbY2NdID0gY1ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPDw9IDg7Ci0gICAgICAgICAgICAgICAgbGluZTIgPDw9IDg7Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwMDgwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+ICgxMCAtIGspKSAmIDB4MDAwNCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwTGluZTIgPSBtX3BMaW5lIC0gblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lMiA9IChtX2xvb3BJbmRleCAmIDEpID8gKCpwTGluZTIrKykgOiAwOwotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTIgPj4gMykgJiAweDAwN2M7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1fbG9vcEluZGV4ICYgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSA3OyBrID49IDA7IGstLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+IChrICsgMykpICYgMHgwMDA0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3BMaW5lW2NjXSA9IGNWYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUyIDw8PSA4OwotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCgobGluZTIgPj4gKDEwIC0gaykpKSAmIDB4MDAwNCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfQorICAgICAgICBsaW5lMSA8PD0gODsKKyAgICAgICAgbGluZTIgPDw9IDg7CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAyMDApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMiA+PiAoOCAtIGspKSAmIDB4MDAwOCk7CiAgICAgICAgIH0KLSAgICAgICAgbV9wTGluZSArPSBuU3RyaWRlOwotICAgICAgICBpZihwUGF1c2UgJiYgbV9sb29wSW5kZXggJSA1MCA9PSAwICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgbV9sb29wSW5kZXgrKzsKLSAgICAgICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICAgIG1fcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcExpbmUyID0gbV9wTGluZSAtIG5TdHJpZGU7CisgICAgICAgIGxpbmUyID0gKG1fbG9vcEluZGV4ICYgMSkgPyAoKnBMaW5lMisrKSA6IDA7CisgICAgICAgIENPTlRFWFQgPSAobGluZTIgPj4gMSkgJiAweDAxZjg7CisgICAgICAgIGZvciAoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKKyAgICAgICAgICBpZiAobV9sb29wSW5kZXggJiAxKSB7CisgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOworICAgICAgICAgIH0KKyAgICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgICBmb3IgKGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOworICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUyID4+IChrICsgMSkpICYgMHgwMDA4KTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOwogICAgICAgICB9CisgICAgICAgIGxpbmUyIDw8PSA4OworICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0KKyAgICAgICAgICAgICAgKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwgfCAoKGxpbmUyID4+ICg4IC0gaykpICYgMHgwMDA4KTsKKyAgICAgICAgfQorICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKKyAgICAgIH0KICAgICB9Ci0gICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgICAgbV9wTGluZSArPSBuU3RyaWRlOworICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX2xvb3BJbmRleCsrOworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgICB9CisgIH0KKyAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwogfQotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQoQ0pCaWcyX0ltYWdlICogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7Ci0gICAgZm9yKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMGU1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBwSW1hZ2UtPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZTEgPSBwSW1hZ2UtPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMik7Ci0gICAgICAgICAgICBsaW5lMSB8PSBwSW1hZ2UtPmdldFBpeGVsKDAsIG1fbG9vcEluZGV4IC0gMikgPDwgMTsKLSAgICAgICAgICAgIGxpbmUyID0gcEltYWdlLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICAgICAgbGluZTIgfD0gcEltYWdlLT5nZXRQaXhlbCgwLCBtX2xvb3BJbmRleCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMyA9IDA7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OwotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBwSW1hZ2UtPmdldFBpeGVsKHcgKyAyLCBtX2xvb3BJbmRleCAtIDIpKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAxKSkgJiAweDBmOwotICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX2xvb3BJbmRleCsrOwotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgfQorRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoCisgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfQk9PTCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOworICBmb3IgKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwNzk1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOwogICAgIH0KLSAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIHBJbWFnZS0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IHBJbWFnZS0+Z2V0UGl4ZWwoMiwgaCAtIDIpOworICAgICAgbGluZTEgfD0gcEltYWdlLT5nZXRQaXhlbCgxLCBoIC0gMikgPDwgMTsKKyAgICAgIGxpbmUxIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDI7CisgICAgICBsaW5lMiA9IHBJbWFnZS0+Z2V0UGl4ZWwoMiwgaCAtIDEpOworICAgICAgbGluZTIgfD0gcEltYWdlLT5nZXRQaXhlbCgxLCBoIC0gMSkgPDwgMTsKKyAgICAgIGxpbmUyIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDI7CisgICAgICBsaW5lMyA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDT05URVhUID0gbGluZTM7CisgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMzsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDQ7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA5OworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICBwSW1hZ2UtPnNldFBpeGVsKHcsIGgsIGJWYWwpOworICAgICAgICB9CisgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IHBJbWFnZS0+Z2V0UGl4ZWwodyArIDMsIGggLSAyKSkgJiAweDBmOworICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBwSW1hZ2UtPmdldFBpeGVsKHcgKyAzLCBoIC0gMSkpICYgMHgxZjsKKyAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDA3OworICAgICAgfQorICAgIH0KKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgbV9sb29wSW5kZXgrKzsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgfQorICB9CisgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKIH0KLUZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdDMoQ0pCaWcyX0ltYWdlICpwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgRlhfRFdPUkQgbGluZTE7Ci0gICAgdWludDhfdCAqcExpbmUxLCBjVmFsOwotICAgIGludDMyX3QgblN0cmlkZSwgazsKLSAgICBpbnQzMl90IG5MaW5lQnl0ZXMsIG5CaXRzTGVmdCwgY2M7Ci0gICAgaWYgKCFtX3BMaW5lKSB7Ci0gICAgICAgIG1fcExpbmUgPSBwSW1hZ2UtPm1fcERhdGE7CitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKAorICAgIENKQmlnMl9JbWFnZSogcEltYWdlLAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOworICB1aW50OF90ICpwTGluZTEsICpwTGluZTIsIGNWYWw7CisgIGludDMyX3QgblN0cmlkZSwgblN0cmlkZTIsIGs7CisgIGludDMyX3QgbkxpbmVCeXRlcywgbkJpdHNMZWZ0LCBjYzsKKyAgaWYgKCFtX3BMaW5lKSB7CisgICAgbV9wTGluZSA9IHBJbWFnZS0+bV9wRGF0YTsKKyAgfQorICBuU3RyaWRlID0gcEltYWdlLT5tX25TdHJpZGU7CisgIG5TdHJpZGUyID0gblN0cmlkZSA8PCAxOworICBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7CisgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOworICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMGU1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOwogICAgIH0KLSAgICBuU3RyaWRlID0gcEltYWdlLT5tX25TdHJpZGU7Ci0gICAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwotICAgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwotICAgIGZvcig7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX2xvb3BJbmRleCA+IDEpIHsKKyAgICAgICAgcExpbmUxID0gbV9wTGluZSAtIG5TdHJpZGUyOworICAgICAgICBwTGluZTIgPSBtX3BMaW5lIC0gblN0cmlkZTsKKyAgICAgICAgbGluZTEgPSAoKnBMaW5lMSsrKSA8PCAxOworICAgICAgICBsaW5lMiA9ICpwTGluZTIrKzsKKyAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MDM4MCkgfCAoKGxpbmUyID4+IDMpICYgMHgwMDdjKTsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDEpOworICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiBrKSAmIDB4MDA4MCkgfCAoKGxpbmUyID4+IChrICsgMykpICYgMHgwMDA0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOwogICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBwSW1hZ2UtPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYobV9sb29wSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgcExpbmUxID0gbV9wTGluZSAtIG5TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAqcExpbmUxKys7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMSA+PiAxKSAmIDB4MDNmMDsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKnBMaW5lMSsrKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihrID0gNzsgayA+PSAwOyBrLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMSA+PiAoayArIDEpKSAmIDB4MDAxMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA8PD0gODsKLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFmNykgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKDggLSBrKSkgJiAweDAwMTApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWY3KSA8PCAxKSB8IGJWYWw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFmNykgPDwgMSkgfCBiVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgbGluZTEgPDw9IDg7CisgICAgICAgIGxpbmUyIDw8PSA4OworICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwMDgwKSB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTIgPj4gKDEwIC0gaykpICYgMHgwMDA0KTsKICAgICAgICAgfQotICAgICAgICBtX3BMaW5lICs9IG5TdHJpZGU7Ci0gICAgICAgIGlmKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fbG9vcEluZGV4Kys7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBMaW5lMiA9IG1fcExpbmUgLSBuU3RyaWRlOworICAgICAgICBsaW5lMiA9IChtX2xvb3BJbmRleCAmIDEpID8gKCpwTGluZTIrKykgOiAwOworICAgICAgICBDT05URVhUID0gKGxpbmUyID4+IDMpICYgMHgwMDdjOworICAgICAgICBmb3IgKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7CisgICAgICAgICAgaWYgKG1fbG9vcEluZGV4ICYgMSkgeworICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMiA+PiAoayArIDMpKSAmIDB4MDAwNCk7CisgICAgICAgICAgfQorICAgICAgICAgIG1fcExpbmVbY2NdID0gY1ZhbDsKICAgICAgICAgfQorICAgICAgICBsaW5lMiA8PD0gODsKKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgKCgobGluZTIgPj4gKDEwIC0gaykpKSAmIDB4MDAwNCk7CisgICAgICAgIH0KKyAgICAgICAgbV9wTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7CisgICAgICB9CiAgICAgfQotICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICAgIG1fcExpbmUgKz0gblN0cmlkZTsKKyAgICBpZiAocFBhdXNlICYmIG1fbG9vcEluZGV4ICUgNTAgPT0gMCAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgIG1fbG9vcEluZGV4Kys7CisgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgIH0KKyAgfQorICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CiB9Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdChDSkJpZzJfSW1hZ2UgKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwotICAgIGZvcig7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgcEltYWdlLT5jb3B5TGluZShtX2xvb3BJbmRleCwgbV9sb29wSW5kZXggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmUxID0gcEltYWdlLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICAgICAgbGluZTEgfD0gcEltYWdlLT5nZXRQaXhlbCgwLCBtX2xvb3BJbmRleCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMiA9IDA7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMjsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPnNldFBpeGVsKHcsIG1fbG9vcEluZGV4LCBiVmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAxKSkgJiAweDFmOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX2xvb3BJbmRleCsrOwotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgfQorRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQoCisgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfQk9PTCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOworICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMGU1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOwogICAgIH0KLSAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUxID0gcEltYWdlLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDIpOworICAgICAgbGluZTEgfD0gcEltYWdlLT5nZXRQaXhlbCgwLCBtX2xvb3BJbmRleCAtIDIpIDw8IDE7CisgICAgICBsaW5lMiA9IHBJbWFnZS0+Z2V0UGl4ZWwoMSwgbV9sb29wSW5kZXggLSAxKTsKKyAgICAgIGxpbmUyIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAxOworICAgICAgbGluZTMgPSAwOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7CisgICAgICAgIGlmIChVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgeworICAgICAgICAgIGJWYWwgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKKyAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkgPDwgMjsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDM7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICBwSW1hZ2UtPnNldFBpeGVsKHcsIG1fbG9vcEluZGV4LCBiVmFsKTsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA9CisgICAgICAgICAgICAoKGxpbmUxIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAyKSkgJiAweDA3OworICAgICAgICBsaW5lMiA9CisgICAgICAgICAgICAoKGxpbmUyIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAxKSkgJiAweDBmOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDM7CisgICAgICB9CisgICAgfQorICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX2xvb3BJbmRleCsrOworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgICB9CisgIH0KKyAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworfQorRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MygKKyAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWF9CT09MIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIEZYX0RXT1JEIGxpbmUxOworICB1aW50OF90ICpwTGluZTEsIGNWYWw7CisgIGludDMyX3QgblN0cmlkZSwgazsKKyAgaW50MzJfdCBuTGluZUJ5dGVzLCBuQml0c0xlZnQsIGNjOworICBpZiAoIW1fcExpbmUpIHsKKyAgICBtX3BMaW5lID0gcEltYWdlLT5tX3BEYXRhOworICB9CisgIG5TdHJpZGUgPSBwSW1hZ2UtPm1fblN0cmlkZTsKKyAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOworICBuQml0c0xlZnQgPSBHQlcgLSAobkxpbmVCeXRlcyA8PCAzKTsKKyAgZm9yICg7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBwSW1hZ2UtPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9sb29wSW5kZXggPiAwKSB7CisgICAgICAgIHBMaW5lMSA9IG1fcExpbmUgLSBuU3RyaWRlOworICAgICAgICBsaW5lMSA9ICpwTGluZTErKzsKKyAgICAgICAgQ09OVEVYVCA9IChsaW5lMSA+PiAxKSAmIDB4MDNmMDsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCpwTGluZTErKyk7CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoayArIDEpKSAmIDB4MDAxMCk7CisgICAgICAgICAgfQorICAgICAgICAgIG1fcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA8PD0gODsKKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9CisgICAgICAgICAgICAgICgoQ09OVEVYVCAmIDB4MDFmNykgPDwgMSkgfCBiVmFsIHwgKChsaW5lMSA+PiAoOCAtIGspKSAmIDB4MDAxMCk7CisgICAgICAgIH0KKyAgICAgICAgbV9wTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7CisgICAgICB9IGVsc2UgeworICAgICAgICBDT05URVhUID0gMDsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGNWYWwgPSAwOworICAgICAgICAgIGZvciAoayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CisgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWY3KSA8PCAxKSB8IGJWYWw7CisgICAgICAgICAgfQorICAgICAgICAgIG1fcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWY3KSA8PCAxKSB8IGJWYWw7CisgICAgICAgIH0KKyAgICAgICAgbV9wTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7CisgICAgICB9CisgICAgfQorICAgIG1fcExpbmUgKz0gblN0cmlkZTsKKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgbV9sb29wSW5kZXgrKzsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgfQorICB9CisgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKK30KK0ZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KAorICAgIENKQmlnMl9JbWFnZSogcEltYWdlLAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOworICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMTk1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUxID0gcEltYWdlLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpOworICAgICAgbGluZTEgfD0gcEltYWdlLT5nZXRQaXhlbCgwLCBtX2xvb3BJbmRleCAtIDEpIDw8IDE7CisgICAgICBsaW5lMiA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXgpKSB7CisgICAgICAgICAgYlZhbCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ09OVEVYVCA9IGxpbmUyOworICAgICAgICAgIENPTlRFWFQgfD0gcEltYWdlLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgbV9sb29wSW5kZXggKyBHQkFUWzFdKSA8PCA0OworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgNTsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICB9CisgICAgICAgIGlmIChiVmFsKSB7CisgICAgICAgICAgcEltYWdlLT5zZXRQaXhlbCh3LCBtX2xvb3BJbmRleCwgYlZhbCk7CisgICAgICAgIH0KKyAgICAgICAgbGluZTEgPQorICAgICAgICAgICAgKChsaW5lMSA8PCAxKSB8IHBJbWFnZS0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMSkpICYgMHgxZjsKKyAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDBmOworICAgICAgfQorICAgIH0KKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgbV9sb29wSW5kZXgrKzsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgfQorICB9CisgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuaAppbmRleCAyYmQyY2VhLi4zYzlhMzlhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dlbmVyYWxEZWNvZGVyLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5oCkBAIC0xOCwyNjIgKzE4LDMwNyBAQAogY2xhc3MgQ0pCaWcyX0ltYWdlOwogY2xhc3MgQ0pCaWcyX1BhdHRlcm5EaWN0OwogdHlwZWRlZiBlbnVtIHsKLSAgICBKQklHMl9DT1JORVJfQk9UVE9NTEVGVCA9IDAsCi0gICAgSkJJRzJfQ09STkVSX1RPUExFRlQJPSAxLAotICAgIEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVCA9IDIsCi0gICAgSkJJRzJfQ09STkVSX1RPUFJJR0hUCT0gMworICBKQklHMl9DT1JORVJfQk9UVE9NTEVGVCA9IDAsCisgIEpCSUcyX0NPUk5FUl9UT1BMRUZUID0gMSwKKyAgSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUID0gMiwKKyAgSkJJRzJfQ09STkVSX1RPUFJJR0hUID0gMwogfSBKQmlnMkNvcm5lcjsKLWNsYXNzIENKQmlnMl9HUkRQcm9jIDogcHVibGljIENKQmlnMl9PYmplY3QKLXsKLXB1YmxpYzoKLSAgICBDSkJpZzJfR1JEUHJvYygpCi0gICAgewotICAgICAgICBtX2xvb3BJbmRleCA9IDA7Ci0gICAgICAgIG1fcExpbmUgPSBOVUxMOwotICAgICAgICBtX3BQYXVzZSA9IE5VTEw7Ci0gICAgICAgIG1fRGVjb2RlVHlwZSA9IDA7Ci0gICAgICAgIExUUCA9IDA7Ci0gICAgICAgIG1fUmVwbGFjZVJlY3QubGVmdCA9IDA7Ci0gICAgICAgIG1fUmVwbGFjZVJlY3QuYm90dG9tID0gMDsKLSAgICAgICAgbV9SZXBsYWNlUmVjdC50b3AgPSAwOwotICAgICAgICBtX1JlcGxhY2VSZWN0LnJpZ2h0ID0gMDsKLSAgICB9CitjbGFzcyBDSkJpZzJfR1JEUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKQmlnMl9HUkRQcm9jKCkgeworICAgIG1fbG9vcEluZGV4ID0gMDsKKyAgICBtX3BMaW5lID0gTlVMTDsKKyAgICBtX3BQYXVzZSA9IE5VTEw7CisgICAgbV9EZWNvZGVUeXBlID0gMDsKKyAgICBMVFAgPSAwOworICAgIG1fUmVwbGFjZVJlY3QubGVmdCA9IDA7CisgICAgbV9SZXBsYWNlUmVjdC5ib3R0b20gPSAwOworICAgIG1fUmVwbGFjZVJlY3QudG9wID0gMDsKKyAgICBtX1JlcGxhY2VSZWN0LnJpZ2h0ID0gMDsKKyAgfQogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKIAotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1YyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1YyKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CiAKLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9WMShDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpOworICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9Bcml0aF9WMShDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0pOwotICAgIEZYQ09ERUNfU1RBVFVTIFN0YXJ0X2RlY29kZV9Bcml0aChDSkJpZzJfSW1hZ2UqKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsKLSAgICBGWENPREVDX1NUQVRVUyBTdGFydF9kZWNvZGVfQXJpdGhfVjIoQ0pCaWcyX0ltYWdlKiogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7Ci0gICAgRlhDT0RFQ19TVEFUVVMgU3RhcnRfZGVjb2RlX0FyaXRoX1YxKENKQmlnMl9JbWFnZSoqIHBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOwotICAgIEZYQ09ERUNfU1RBVFVTIFN0YXJ0X2RlY29kZV9NTVIoQ0pCaWcyX0ltYWdlKiogcEltYWdlLCBDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOwotICAgIEZYQ09ERUNfU1RBVFVTIENvbnRpbnVlX2RlY29kZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhfUkVDVAkJICAgR2V0UmVwbGFjZVJlY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUmVwbGFjZVJlY3Q7Ci0gICAgfTsKLXByaXZhdGU6Ci0gICAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX0FyaXRoKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVjIoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9WMShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX01NUigpOwotICAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhDSkJpZzJfSW1hZ2UqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KENKQmlnMl9JbWFnZSAqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMoQ0pCaWcyX0ltYWdlICpwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoQ0pCaWcyX0ltYWdlICogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMoQ0pCaWcyX0ltYWdlICpwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQoQ0pCaWcyX0ltYWdlICogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdDMoQ0pCaWcyX0ltYWdlICpwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQoQ0pCaWcyX0ltYWdlICogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWF9EV09SRAltX2xvb3BJbmRleDsKLSAgICB1aW50OF90ICoJbV9wTGluZTsKLSAgICBJRlhfUGF1c2UqCW1fcFBhdXNlOwotICAgIEZYQ09ERUNfU1RBVFVTCW1fUHJvc3NpdmVTdGF0dXM7Ci0gICAgQ0pCaWcyX0ltYWdlKiogbV9wSW1hZ2U7Ci0gICAgQ0pCaWcyX0FyaXRoRGVjb2RlciAqbV9wQXJpdGhEZWNvZGVyOwotICAgIEpCaWcyQXJpdGhDdHggKm1fZ2JDb250ZXh0OwotICAgIEZYX1dPUkQJCW1fRGVjb2RlVHlwZTsKLSAgICBGWF9CT09MIExUUDsKLSAgICBGWF9SRUNUIG1fUmVwbGFjZVJlY3Q7Ci1wcml2YXRlOgorICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSk7CisgIEZYQ09ERUNfU1RBVFVTIFN0YXJ0X2RlY29kZV9Bcml0aChDSkJpZzJfSW1hZ2UqKiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsKKyAgRlhDT0RFQ19TVEFUVVMgU3RhcnRfZGVjb2RlX0FyaXRoX1YyKENKQmlnMl9JbWFnZSoqIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOworICBGWENPREVDX1NUQVRVUyBTdGFydF9kZWNvZGVfQXJpdGhfVjEoQ0pCaWcyX0ltYWdlKiogcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7CisgIEZYQ09ERUNfU1RBVFVTIFN0YXJ0X2RlY29kZV9NTVIoQ0pCaWcyX0ltYWdlKiogcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsKKyAgRlhDT0RFQ19TVEFUVVMgQ29udGludWVfZGVjb2RlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhfUkVDVCBHZXRSZXBsYWNlUmVjdCgpIHsgcmV0dXJuIG1fUmVwbGFjZVJlY3Q7IH07CiAKLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7CisgcHJpdmF0ZToKKyAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX0FyaXRoKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX0FyaXRoX1YyKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX0FyaXRoX1YxKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX01NUigpOworICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMoQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KAorICAgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMoQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX3Vub3B0KAorICAgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMoQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX3Vub3B0KAorICAgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdDMoQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KAorICAgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICBGWF9EV09SRCBtX2xvb3BJbmRleDsKKyAgdWludDhfdCogbV9wTGluZTsKKyAgSUZYX1BhdXNlKiBtX3BQYXVzZTsKKyAgRlhDT0RFQ19TVEFUVVMgbV9Qcm9zc2l2ZVN0YXR1czsKKyAgQ0pCaWcyX0ltYWdlKiogbV9wSW1hZ2U7CisgIENKQmlnMl9Bcml0aERlY29kZXIqIG1fcEFyaXRoRGVjb2RlcjsKKyAgSkJpZzJBcml0aEN0eCogbV9nYkNvbnRleHQ7CisgIEZYX1dPUkQgbV9EZWNvZGVUeXBlOworICBGWF9CT09MIExUUDsKKyAgRlhfUkVDVCBtX1JlcGxhY2VSZWN0OwogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDIoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKKyBwcml2YXRlOgorICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKIAotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQyKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CiAKLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKIAotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDIoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CiAKLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MyhDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpOworICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MihDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CiAKLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKIAotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDIoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKIAotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpOworICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MyhDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpOworICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CiAKLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpOworICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKIAotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQyKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CiAKLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKLXB1YmxpYzoKLSAgICBGWF9CT09MIE1NUjsKLSAgICBGWF9EV09SRCBHQlc7Ci0gICAgRlhfRFdPUkQgR0JIOwotICAgIHVpbnQ4X3QgR0JURU1QTEFURTsKLSAgICBGWF9CT09MIFRQR0RPTjsKLSAgICBGWF9CT09MIFVTRVNLSVA7Ci0gICAgQ0pCaWcyX0ltYWdlICogU0tJUDsKLSAgICBzaWduZWQgY2hhciBHQkFUWzhdOworICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MyhDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOworCisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKKworIHB1YmxpYzoKKyAgRlhfQk9PTCBNTVI7CisgIEZYX0RXT1JEIEdCVzsKKyAgRlhfRFdPUkQgR0JIOworICB1aW50OF90IEdCVEVNUExBVEU7CisgIEZYX0JPT0wgVFBHRE9OOworICBGWF9CT09MIFVTRVNLSVA7CisgIENKQmlnMl9JbWFnZSogU0tJUDsKKyAgc2lnbmVkIGNoYXIgR0JBVFs4XTsKIH07Ci1jbGFzcyBDSkJpZzJfR1JSRFByb2MgOiBwdWJsaWMgQ0pCaWcyX09iamVjdAotewotcHVibGljOgorY2xhc3MgQ0pCaWcyX0dSUkRQcm9jIDogcHVibGljIENKQmlnMl9PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KTsKIAotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCk7CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX1RlbXBsYXRlMF91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KTsKIAotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX1RlbXBsYXRlMF91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpOworICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9UZW1wbGF0ZTBfb3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KTsKIAotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX1RlbXBsYXRlMF9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KTsKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfVGVtcGxhdGUxX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpOwogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfVGVtcGxhdGUxX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCk7CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX1RlbXBsYXRlMV9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpOwogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfVGVtcGxhdGUxX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpOworICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9WMShDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpOwogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfVjEoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KTsKLXB1YmxpYzoKLSAgICBGWF9EV09SRCBHUlc7Ci0gICAgRlhfRFdPUkQgR1JIOwotICAgIEZYX0JPT0wgR1JURU1QTEFURTsKLSAgICBDSkJpZzJfSW1hZ2UgKkdSUkVGRVJFTkNFOwotICAgIGludDMyX3QgR1JSRUZFUkVOQ0VEWDsKLSAgICBpbnQzMl90IEdSUkVGRVJFTkNFRFk7Ci0gICAgRlhfQk9PTCBUUEdST047Ci0gICAgc2lnbmVkIGNoYXIJR1JBVFs0XTsKKyBwdWJsaWM6CisgIEZYX0RXT1JEIEdSVzsKKyAgRlhfRFdPUkQgR1JIOworICBGWF9CT09MIEdSVEVNUExBVEU7CisgIENKQmlnMl9JbWFnZSogR1JSRUZFUkVOQ0U7CisgIGludDMyX3QgR1JSRUZFUkVOQ0VEWDsKKyAgaW50MzJfdCBHUlJFRkVSRU5DRURZOworICBGWF9CT09MIFRQR1JPTjsKKyAgc2lnbmVkIGNoYXIgR1JBVFs0XTsKIH07CiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgQ0pCaWcyX0FyaXRoSW50RGVjb2RlciAqSUFEVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpJQUZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKklBRFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqSUFJVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpJQVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKklBUkRXLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKklBUkRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKklBUkRYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKklBUkRZOwotICAgIENKQmlnMl9Bcml0aElhaWREZWNvZGVyICpJQUlEOworICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyICpJQURULCAqSUFGUywgKklBRFMsICpJQUlULCAqSUFSSSwgKklBUkRXLCAqSUFSREgsCisgICAgICAqSUFSRFgsICpJQVJEWTsKKyAgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXIqIElBSUQ7CiB9IEpCaWcySW50RGVjb2RlclN0YXRlOwotY2xhc3MgQ0pCaWcyX1RSRFByb2MgOiBwdWJsaWMgQ0pCaWcyX09iamVjdAotewotcHVibGljOgorY2xhc3MgQ0pCaWcyX1RSRFByb2MgOiBwdWJsaWMgQ0pCaWcyX09iamVjdCB7CisgcHVibGljOgorICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9IdWZmbWFuKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KTsKIAotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0h1ZmZtYW4oQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KTsKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkludERlY29kZXJTdGF0ZSogcElEUyA9IE5VTEwpOwogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcySW50RGVjb2RlclN0YXRlICpwSURTID0gTlVMTCk7Ci1wdWJsaWM6Ci0gICAgRlhfQk9PTCBTQkhVRkY7Ci0gICAgRlhfQk9PTCBTQlJFRklORTsKLSAgICBGWF9EV09SRCBTQlc7Ci0gICAgRlhfRFdPUkQgU0JIOwotICAgIEZYX0RXT1JEIFNCTlVNSU5TVEFOQ0VTOwotICAgIEZYX0RXT1JEIFNCU1RSSVBTOwotICAgIEZYX0RXT1JEIFNCTlVNU1lNUzsKKyBwdWJsaWM6CisgIEZYX0JPT0wgU0JIVUZGOworICBGWF9CT09MIFNCUkVGSU5FOworICBGWF9EV09SRCBTQlc7CisgIEZYX0RXT1JEIFNCSDsKKyAgRlhfRFdPUkQgU0JOVU1JTlNUQU5DRVM7CisgIEZYX0RXT1JEIFNCU1RSSVBTOworICBGWF9EV09SRCBTQk5VTVNZTVM7CiAKLSAgICBKQmlnMkh1ZmZtYW5Db2RlICpTQlNZTUNPREVTOwotICAgIHVpbnQ4X3QgU0JTWU1DT0RFTEVOOworICBKQmlnMkh1ZmZtYW5Db2RlKiBTQlNZTUNPREVTOworICB1aW50OF90IFNCU1lNQ09ERUxFTjsKIAotICAgIENKQmlnMl9JbWFnZSAqKlNCU1lNUzsKLSAgICBGWF9CT09MIFNCREVGUElYRUw7CisgIENKQmlnMl9JbWFnZSoqIFNCU1lNUzsKKyAgRlhfQk9PTCBTQkRFRlBJWEVMOwogCi0gICAgSkJpZzJDb21wb3NlT3AgU0JDT01CT1A7Ci0gICAgRlhfQk9PTCBUUkFOU1BPU0VEOworICBKQmlnMkNvbXBvc2VPcCBTQkNPTUJPUDsKKyAgRlhfQk9PTCBUUkFOU1BPU0VEOwogCi0gICAgSkJpZzJDb3JuZXIgUkVGQ09STkVSOwotICAgIHNpZ25lZCBjaGFyIFNCRFNPRkZTRVQ7Ci0gICAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSAqU0JIVUZGRlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAqU0JIVUZGRFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAqU0JIVUZGRFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAqU0JIVUZGUkRXLAotICAgICAgICAgICAgICAgICAgICAgICAgKlNCSFVGRlJESCwKLSAgICAgICAgICAgICAgICAgICAgICAgICpTQkhVRkZSRFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAqU0JIVUZGUkRZLAotICAgICAgICAgICAgICAgICAgICAgICAgKlNCSFVGRlJTSVpFOwotICAgIEZYX0JPT0wgU0JSVEVNUExBVEU7Ci0gICAgc2lnbmVkIGNoYXIgU0JSQVRbNF07CisgIEpCaWcyQ29ybmVyIFJFRkNPUk5FUjsKKyAgc2lnbmVkIGNoYXIgU0JEU09GRlNFVDsKKyAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSAqU0JIVUZGRlMsICpTQkhVRkZEUywgKlNCSFVGRkRULCAqU0JIVUZGUkRXLCAqU0JIVUZGUkRILAorICAgICAgKlNCSFVGRlJEWCwgKlNCSFVGRlJEWSwgKlNCSFVGRlJTSVpFOworICBGWF9CT09MIFNCUlRFTVBMQVRFOworICBzaWduZWQgY2hhciBTQlJBVFs0XTsKIH07Ci1jbGFzcyBDSkJpZzJfU0REUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDSkJpZzJfU0REUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKQmlnMl9TeW1ib2xEaWN0KiBkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KTsKIAotICAgIENKQmlnMl9TeW1ib2xEaWN0ICpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpOworICBDSkJpZzJfU3ltYm9sRGljdCogZGVjb2RlX0h1ZmZtYW4oQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKTsKIAotICAgIENKQmlnMl9TeW1ib2xEaWN0ICpkZWNvZGVfSHVmZm1hbihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpOwotcHVibGljOgotICAgIEZYX0JPT0wgU0RIVUZGOwotICAgIEZYX0JPT0wgU0RSRUZBR0c7Ci0gICAgRlhfRFdPUkQgU0ROVU1JTlNZTVM7Ci0gICAgQ0pCaWcyX0ltYWdlICoqIFNESU5TWU1TOwotICAgIEZYX0RXT1JEIFNETlVNTkVXU1lNUzsKLSAgICBGWF9EV09SRCBTRE5VTUVYU1lNUzsKLSAgICBDSkJpZzJfSHVmZm1hblRhYmxlICpTREhVRkZESCwKLSAgICAgICAgICAgICAgICAgICAgICAgICpTREhVRkZEVywKLSAgICAgICAgICAgICAgICAgICAgICAgICpTREhVRkZCTVNJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAqU0RIVUZGQUdHSU5TVDsKLSAgICB1aW50OF90IFNEVEVNUExBVEU7Ci0gICAgc2lnbmVkIGNoYXIgU0RBVFs4XTsKLSAgICBGWF9CT09MIFNEUlRFTVBMQVRFOwotICAgIHNpZ25lZCBjaGFyIFNEUkFUWzRdOworIHB1YmxpYzoKKyAgRlhfQk9PTCBTREhVRkY7CisgIEZYX0JPT0wgU0RSRUZBR0c7CisgIEZYX0RXT1JEIFNETlVNSU5TWU1TOworICBDSkJpZzJfSW1hZ2UqKiBTRElOU1lNUzsKKyAgRlhfRFdPUkQgU0ROVU1ORVdTWU1TOworICBGWF9EV09SRCBTRE5VTUVYU1lNUzsKKyAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSAqU0RIVUZGREgsICpTREhVRkZEVywgKlNESFVGRkJNU0laRSwgKlNESFVGRkFHR0lOU1Q7CisgIHVpbnQ4X3QgU0RURU1QTEFURTsKKyAgc2lnbmVkIGNoYXIgU0RBVFs4XTsKKyAgRlhfQk9PTCBTRFJURU1QTEFURTsKKyAgc2lnbmVkIGNoYXIgU0RSQVRbNF07CiB9OwotY2xhc3MgQ0pCaWcyX0hUUkRQcm9jIDogcHVibGljIENKQmlnMl9PYmplY3QKLXsKLXB1YmxpYzoKK2NsYXNzIENKQmlnMl9IVFJEUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSUZYX1BhdXNlKiBwUGF1c2UpOwotcHVibGljOgotICAgIEZYX0RXT1JEIEhCVywKLSAgICAgICAgICAgICBIQkg7Ci0gICAgRlhfQk9PTCBITU1SOwotICAgIHVpbnQ4X3QgSFRFTVBMQVRFOwotICAgIEZYX0RXT1JEIEhOVU1QQVRTOwotICAgIENKQmlnMl9JbWFnZSAqKkhQQVRTOwotICAgIEZYX0JPT0wgSERFRlBJWEVMOwotICAgIEpCaWcyQ29tcG9zZU9wIEhDT01CT1A7Ci0gICAgRlhfQk9PTCBIRU5BQkxFU0tJUDsKLSAgICBGWF9EV09SRCBIR1csCi0gICAgICAgICAgICAgSEdIOwotICAgIGludDMyX3QgSEdYLAotICAgICAgICAgICAgIEhHWTsKLSAgICBGWF9XT1JEIEhSWCwKLSAgICAgICAgICAgIEhSWTsKLSAgICB1aW50OF90IEhQVywKLSAgICAgICAgICAgIEhQSDsKKyBwdWJsaWM6CisgIEZYX0RXT1JEIEhCVywgSEJIOworICBGWF9CT09MIEhNTVI7CisgIHVpbnQ4X3QgSFRFTVBMQVRFOworICBGWF9EV09SRCBITlVNUEFUUzsKKyAgQ0pCaWcyX0ltYWdlKiogSFBBVFM7CisgIEZYX0JPT0wgSERFRlBJWEVMOworICBKQmlnMkNvbXBvc2VPcCBIQ09NQk9QOworICBGWF9CT09MIEhFTkFCTEVTS0lQOworICBGWF9EV09SRCBIR1csIEhHSDsKKyAgaW50MzJfdCBIR1gsIEhHWTsKKyAgRlhfV09SRCBIUlgsIEhSWTsKKyAgdWludDhfdCBIUFcsIEhQSDsKIH07Ci1jbGFzcyBDSkJpZzJfUEREUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDSkJpZzJfUEREUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKQmlnMl9QYXR0ZXJuRGljdCogZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgQ0pCaWcyX1BhdHRlcm5EaWN0ICpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIENKQmlnMl9QYXR0ZXJuRGljdCogZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtLCBJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBDSkJpZzJfUGF0dGVybkRpY3QgKmRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSUZYX1BhdXNlKiBwUGF1c2UpOwotcHVibGljOgotICAgIEZYX0JPT0wgSERNTVI7Ci0gICAgdWludDhfdCBIRFBXLAotICAgICAgICAgICAgSERQSDsKLSAgICBGWF9EV09SRCBHUkFZTUFYOwotICAgIHVpbnQ4X3QgSERURU1QTEFURTsKKyBwdWJsaWM6CisgIEZYX0JPT0wgSERNTVI7CisgIHVpbnQ4X3QgSERQVywgSERQSDsKKyAgRlhfRFdPUkQgR1JBWU1BWDsKKyAgdWludDhfdCBIRFRFTVBMQVRFOwogfTsKLWNsYXNzIENKQmlnMl9HU0lEUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDSkJpZzJfR1NJRFByb2MgOiBwdWJsaWMgQ0pCaWcyX09iamVjdCB7CisgcHVibGljOgorICBGWF9EV09SRCogZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKTsKIAotICAgIEZYX0RXT1JEICpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYX0RXT1JEKiBkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sIElGWF9QYXVzZSogcFBhdXNlKTsKIAotICAgIEZYX0RXT1JEICpkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0sIElGWF9QYXVzZSogcFBhdXNlKTsKLXB1YmxpYzoKLSAgICBGWF9CT09MIEdTTU1SOwotICAgIEZYX0JPT0wgR1NVU0VTS0lQOwotICAgIHVpbnQ4X3QgR1NCUFA7Ci0gICAgRlhfRFdPUkQgR1NXLAotICAgICAgICAgICAgIEdTSDsKLSAgICB1aW50OF90IEdTVEVNUExBVEU7Ci0gICAgQ0pCaWcyX0ltYWdlICpHU0tJUDsKKyBwdWJsaWM6CisgIEZYX0JPT0wgR1NNTVI7CisgIEZYX0JPT0wgR1NVU0VTS0lQOworICB1aW50OF90IEdTQlBQOworICBGWF9EV09SRCBHU1csIEdTSDsKKyAgdWludDhfdCBHU1RFTVBMQVRFOworICBDSkJpZzJfSW1hZ2UqIEdTS0lQOwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5EZWNvZGVyLmNwcAppbmRleCBlZjg0NTQ3Li5kNWFjYzM2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5EZWNvZGVyLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5EZWNvZGVyLmNwcApAQCAtMSw1NiArMSw1MyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiSkJpZzJfSHVmZm1hbkRlY29kZXIuaCIKLUNKQmlnMl9IdWZmbWFuRGVjb2Rlcjo6Q0pCaWcyX0h1ZmZtYW5EZWNvZGVyKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0pCi17Ci0gICAgbV9wU3RyZWFtID0gcFN0cmVhbTsKK0NKQmlnMl9IdWZmbWFuRGVjb2Rlcjo6Q0pCaWcyX0h1ZmZtYW5EZWNvZGVyKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0pIHsKKyAgbV9wU3RyZWFtID0gcFN0cmVhbTsKIH0KLUNKQmlnMl9IdWZmbWFuRGVjb2Rlcjo6fkNKQmlnMl9IdWZmbWFuRGVjb2RlcigpCi17Ci19Ci1pbnQgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyOjpkZWNvZGVBVmFsdWUoQ0pCaWcyX0h1ZmZtYW5UYWJsZSAqcFRhYmxlLCBpbnQgKm5SZXN1bHQpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IG5WYWwgPSAwOwotICAgIGludCBuQml0cyA9IDA7Ci0gICAgRlhfRFdPUkQgblRtcDsKLSAgICB3aGlsZSgxKSB7Ci0gICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZDFCaXQoJm5UbXApID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgblZhbCA9IChuVmFsIDw8IDEpIHwgblRtcDsKLSAgICAgICAgbkJpdHMgKys7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IHBUYWJsZS0+TlRFTVA7IGkrKykgewotICAgICAgICAgICAgaWYoKHBUYWJsZS0+UFJFRkxFTltpXSA9PSBuQml0cykgJiYgKHBUYWJsZS0+Q09ERVNbaV0gPT0gblZhbCkpIHsKLSAgICAgICAgICAgICAgICBpZigocFRhYmxlLT5IVE9PQiA9PSAxKSAmJiAoaSA9PSBwVGFibGUtPk5URU1QIC0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpCSUcyX09PQjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkTkJpdHMocFRhYmxlLT5SQU5HRUxFTltpXSwgJm5UbXApID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocFRhYmxlLT5IVE9PQikgewotICAgICAgICAgICAgICAgICAgICBpZihpID09IHBUYWJsZS0+TlRFTVAgLSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqblJlc3VsdCA9IHBUYWJsZS0+UkFOR0VMT1dbaV0gLSBuVG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqblJlc3VsdCA9IHBUYWJsZS0+UkFOR0VMT1dbaV0gKyBuVG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZihpID09IHBUYWJsZS0+TlRFTVAgLSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqblJlc3VsdCA9IHBUYWJsZS0+UkFOR0VMT1dbaV0gLSBuVG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqblJlc3VsdCA9IHBUYWJsZS0+UkFOR0VMT1dbaV0gKyBuVG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK0NKQmlnMl9IdWZmbWFuRGVjb2Rlcjo6fkNKQmlnMl9IdWZmbWFuRGVjb2RlcigpIHt9CitpbnQgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyOjpkZWNvZGVBVmFsdWUoQ0pCaWcyX0h1ZmZtYW5UYWJsZSogcFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogblJlc3VsdCkgeworICBpbnQgaTsKKyAgaW50IG5WYWwgPSAwOworICBpbnQgbkJpdHMgPSAwOworICBGWF9EV09SRCBuVG1wOworICB3aGlsZSAoMSkgeworICAgIGlmIChtX3BTdHJlYW0tPnJlYWQxQml0KCZuVG1wKSA9PSAtMSkgeworICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICByZXR1cm4gLTI7CisgICAgblZhbCA9IChuVmFsIDw8IDEpIHwgblRtcDsKKyAgICBuQml0cysrOworICAgIGZvciAoaSA9IDA7IGkgPCBwVGFibGUtPk5URU1QOyBpKyspIHsKKyAgICAgIGlmICgocFRhYmxlLT5QUkVGTEVOW2ldID09IG5CaXRzKSAmJiAocFRhYmxlLT5DT0RFU1tpXSA9PSBuVmFsKSkgeworICAgICAgICBpZiAoKHBUYWJsZS0+SFRPT0IgPT0gMSkgJiYgKGkgPT0gcFRhYmxlLT5OVEVNUCAtIDEpKSB7CisgICAgICAgICAgcmV0dXJuIEpCSUcyX09PQjsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9wU3RyZWFtLT5yZWFkTkJpdHMocFRhYmxlLT5SQU5HRUxFTltpXSwgJm5UbXApID09IC0xKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChwVGFibGUtPkhUT09CKSB7CisgICAgICAgICAgaWYgKGkgPT0gcFRhYmxlLT5OVEVNUCAtIDMpIHsKKyAgICAgICAgICAgICpuUmVzdWx0ID0gcFRhYmxlLT5SQU5HRUxPV1tpXSAtIG5UbXA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm5SZXN1bHQgPSBwVGFibGUtPlJBTkdFTE9XW2ldICsgblRtcDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoaSA9PSBwVGFibGUtPk5URU1QIC0gMikgeworICAgICAgICAgICAgKm5SZXN1bHQgPSBwVGFibGUtPlJBTkdFTE9XW2ldIC0gblRtcDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqblJlc3VsdCA9IHBUYWJsZS0+UkFOR0VMT1dbaV0gKyBuVG1wOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAtMjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hbkRlY29kZXIuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hbkRlY29kZXIuaAppbmRleCA2MGVjMjkwLi42YmYxY2I0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5EZWNvZGVyLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5oCkBAIC0xLDI0ICsxLDIyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgX0pCSUcyX0hVRkZNQU5fREVDT0RFUl9IXwogI2RlZmluZSBfSkJJRzJfSFVGRk1BTl9ERUNPREVSX0hfCiAjaW5jbHVkZSAiSkJpZzJfQml0U3RyZWFtLmgiCiAjaW5jbHVkZSAiSkJpZzJfSHVmZm1hblRhYmxlLmgiCi1jbGFzcyBDSkJpZzJfSHVmZm1hbkRlY29kZXIgOiBwdWJsaWMgQ0pCaWcyX09iamVjdAotewotcHVibGljOgorY2xhc3MgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyIDogcHVibGljIENKQmlnMl9PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0pOwogCi0gICAgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0pOworICB+Q0pCaWcyX0h1ZmZtYW5EZWNvZGVyKCk7CiAKLSAgICB+Q0pCaWcyX0h1ZmZtYW5EZWNvZGVyKCk7CisgIGludCBkZWNvZGVBVmFsdWUoQ0pCaWcyX0h1ZmZtYW5UYWJsZSogcFRhYmxlLCBpbnQqIG5SZXN1bHQpOwogCi0gICAgaW50IGRlY29kZUFWYWx1ZShDSkJpZzJfSHVmZm1hblRhYmxlICpwVGFibGUsIGludCAqblJlc3VsdCk7Ci1wcml2YXRlOgotCi0gICAgQ0pCaWcyX0JpdFN0cmVhbSAqbV9wU3RyZWFtOworIHByaXZhdGU6CisgIENKQmlnMl9CaXRTdHJlYW0qIG1fcFN0cmVhbTsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmNwcAppbmRleCAwNjE2MTIzLi44NzcyMmQyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuY3BwCkBAIC0xLDE5NCArMSwxODkgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIkpCaWcyX0h1ZmZtYW5UYWJsZS5oIgogI2luY2x1ZGUgIkpCaWcyX0JpdFN0cmVhbS5oIgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi1DSkJpZzJfSHVmZm1hblRhYmxlOjpDSkJpZzJfSHVmZm1hblRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lICpwVGFibGUsIGludCBuTGluZXMsCi0gICAgICAgIEZYX0JPT0wgYkhUT09CKQotewotICAgIGluaXQoKTsKLSAgICBtX2JPSyA9IHBhcnNlRnJvbVN0YW5kYXJkVGFibGUocFRhYmxlLCBuTGluZXMsIGJIVE9PQik7CitDSkJpZzJfSHVmZm1hblRhYmxlOjpDSkJpZzJfSHVmZm1hblRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lKiBwVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhUT09CKSB7CisgIGluaXQoKTsKKyAgbV9iT0sgPSBwYXJzZUZyb21TdGFuZGFyZFRhYmxlKHBUYWJsZSwgbkxpbmVzLCBiSFRPT0IpOwogfQogCi1DSkJpZzJfSHVmZm1hblRhYmxlOjpDSkJpZzJfSHVmZm1hblRhYmxlKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0pCi17Ci0gICAgaW5pdCgpOwotICAgIG1fYk9LID0gcGFyc2VGcm9tQ29kZWRCdWZmZXIocFN0cmVhbSk7CitDSkJpZzJfSHVmZm1hblRhYmxlOjpDSkJpZzJfSHVmZm1hblRhYmxlKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0pIHsKKyAgaW5pdCgpOworICBtX2JPSyA9IHBhcnNlRnJvbUNvZGVkQnVmZmVyKHBTdHJlYW0pOwogfQogCi1DSkJpZzJfSHVmZm1hblRhYmxlOjp+Q0pCaWcyX0h1ZmZtYW5UYWJsZSgpCi17Ci0gICAgaWYoQ09ERVMpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKENPREVTKTsKLSAgICB9Ci0gICAgaWYoUFJFRkxFTikgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoUFJFRkxFTik7Ci0gICAgfQotICAgIGlmKFJBTkdFTEVOKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShSQU5HRUxFTik7Ci0gICAgfQotICAgIGlmKFJBTkdFTE9XKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShSQU5HRUxPVyk7Ci0gICAgfQorQ0pCaWcyX0h1ZmZtYW5UYWJsZTo6fkNKQmlnMl9IdWZmbWFuVGFibGUoKSB7CisgIGlmIChDT0RFUykgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShDT0RFUyk7CisgIH0KKyAgaWYgKFBSRUZMRU4pIHsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoUFJFRkxFTik7CisgIH0KKyAgaWYgKFJBTkdFTEVOKSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFJBTkdFTEVOKTsKKyAgfQorICBpZiAoUkFOR0VMT1cpIHsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoUkFOR0VMT1cpOworICB9CiB9Ci12b2lkIENKQmlnMl9IdWZmbWFuVGFibGU6OmluaXQoKQotewotICAgIEhUT09CID0gRkFMU0U7Ci0gICAgTlRFTVAgPSAwOwotICAgIENPREVTID0gTlVMTDsKLSAgICBQUkVGTEVOID0gTlVMTDsKLSAgICBSQU5HRUxFTiA9IE5VTEw7Ci0gICAgUkFOR0VMT1cgPSBOVUxMOwordm9pZCBDSkJpZzJfSHVmZm1hblRhYmxlOjppbml0KCkgeworICBIVE9PQiA9IEZBTFNFOworICBOVEVNUCA9IDA7CisgIENPREVTID0gTlVMTDsKKyAgUFJFRkxFTiA9IE5VTEw7CisgIFJBTkdFTEVOID0gTlVMTDsKKyAgUkFOR0VMT1cgPSBOVUxMOwogfQotaW50IENKQmlnMl9IdWZmbWFuVGFibGU6OnBhcnNlRnJvbVN0YW5kYXJkVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUgKnBUYWJsZSwgaW50IG5MaW5lcywgRlhfQk9PTCBiSFRPT0IpCi17Ci0gICAgaW50IENVUkxFTiwgTEVOTUFYLCBDVVJDT0RFLCBDVVJURU1QLCBpOwotICAgIGludCAqTEVOQ09VTlQ7Ci0gICAgaW50ICpGSVJTVENPREU7Ci0gICAgSFRPT0IgPSBiSFRPT0I7Ci0gICAgTlRFTVAgPSBuTGluZXM7Ci0gICAgQ09ERVMgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIE5URU1QKTsKLSAgICBQUkVGTEVOID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCBOVEVNUCk7Ci0gICAgUkFOR0VMRU4gPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIE5URU1QKTsKLSAgICBSQU5HRUxPVyA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoaW50KSwgTlRFTVApOwotICAgIExFTk1BWCA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpIDwgTlRFTVA7IGkrKykgewotICAgICAgICBQUkVGTEVOW2ldID0gcFRhYmxlW2ldLlBSRUZMRU47Ci0gICAgICAgIFJBTkdFTEVOW2ldID0gcFRhYmxlW2ldLlJBTkRFTEVOOwotICAgICAgICBSQU5HRUxPV1tpXSA9IHBUYWJsZVtpXS5SQU5HRUxPVzsKLSAgICAgICAgaWYoUFJFRkxFTltpXSA+IExFTk1BWCkgewotICAgICAgICAgICAgTEVOTUFYID0gUFJFRkxFTltpXTsKLSAgICAgICAgfQoraW50IENKQmlnMl9IdWZmbWFuVGFibGU6OnBhcnNlRnJvbVN0YW5kYXJkVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUqIHBUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJIVE9PQikgeworICBpbnQgQ1VSTEVOLCBMRU5NQVgsIENVUkNPREUsIENVUlRFTVAsIGk7CisgIGludCogTEVOQ09VTlQ7CisgIGludCogRklSU1RDT0RFOworICBIVE9PQiA9IGJIVE9PQjsKKyAgTlRFTVAgPSBuTGluZXM7CisgIENPREVTID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCBOVEVNUCk7CisgIFBSRUZMRU4gPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIE5URU1QKTsKKyAgUkFOR0VMRU4gPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIE5URU1QKTsKKyAgUkFOR0VMT1cgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIE5URU1QKTsKKyAgTEVOTUFYID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE5URU1QOyBpKyspIHsKKyAgICBQUkVGTEVOW2ldID0gcFRhYmxlW2ldLlBSRUZMRU47CisgICAgUkFOR0VMRU5baV0gPSBwVGFibGVbaV0uUkFOREVMRU47CisgICAgUkFOR0VMT1dbaV0gPSBwVGFibGVbaV0uUkFOR0VMT1c7CisgICAgaWYgKFBSRUZMRU5baV0gPiBMRU5NQVgpIHsKKyAgICAgIExFTk1BWCA9IFBSRUZMRU5baV07CiAgICAgfQotICAgIExFTkNPVU5UID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCAoTEVOTUFYICsgMSkpOwotICAgIEpCSUcyX21lbXNldChMRU5DT1VOVCwgMCwgc2l6ZW9mKGludCkgKiAoTEVOTUFYICsgMSkpOwotICAgIEZJUlNUQ09ERSA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoaW50KSwgKExFTk1BWCArIDEpKTsKLSAgICBmb3IoaSA9IDA7IGkgPCBOVEVNUDsgaSsrKSB7Ci0gICAgICAgIExFTkNPVU5UW1BSRUZMRU5baV1dICsrOworICB9CisgIExFTkNPVU5UID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCAoTEVOTUFYICsgMSkpOworICBKQklHMl9tZW1zZXQoTEVOQ09VTlQsIDAsIHNpemVvZihpbnQpICogKExFTk1BWCArIDEpKTsKKyAgRklSU1RDT0RFID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCAoTEVOTUFYICsgMSkpOworICBmb3IgKGkgPSAwOyBpIDwgTlRFTVA7IGkrKykgeworICAgIExFTkNPVU5UW1BSRUZMRU5baV1dKys7CisgIH0KKyAgQ1VSTEVOID0gMTsKKyAgRklSU1RDT0RFWzBdID0gMDsKKyAgTEVOQ09VTlRbMF0gPSAwOworICB3aGlsZSAoQ1VSTEVOIDw9IExFTk1BWCkgeworICAgIEZJUlNUQ09ERVtDVVJMRU5dID0gKEZJUlNUQ09ERVtDVVJMRU4gLSAxXSArIExFTkNPVU5UW0NVUkxFTiAtIDFdKSA8PCAxOworICAgIENVUkNPREUgPSBGSVJTVENPREVbQ1VSTEVOXTsKKyAgICBDVVJURU1QID0gMDsKKyAgICB3aGlsZSAoQ1VSVEVNUCA8IE5URU1QKSB7CisgICAgICBpZiAoUFJFRkxFTltDVVJURU1QXSA9PSBDVVJMRU4pIHsKKyAgICAgICAgQ09ERVNbQ1VSVEVNUF0gPSBDVVJDT0RFOworICAgICAgICBDVVJDT0RFID0gQ1VSQ09ERSArIDE7CisgICAgICB9CisgICAgICBDVVJURU1QID0gQ1VSVEVNUCArIDE7CiAgICAgfQotICAgIENVUkxFTiA9IDE7Ci0gICAgRklSU1RDT0RFWzBdID0gMDsKLSAgICBMRU5DT1VOVFswXSAgPSAwOwotICAgIHdoaWxlKENVUkxFTiA8PSBMRU5NQVgpIHsKLSAgICAgICAgRklSU1RDT0RFW0NVUkxFTl0gPSAoRklSU1RDT0RFW0NVUkxFTiAtIDFdICsgTEVOQ09VTlRbQ1VSTEVOIC0gMV0pIDw8IDE7Ci0gICAgICAgIENVUkNPREUgPSBGSVJTVENPREVbQ1VSTEVOXTsKLSAgICAgICAgQ1VSVEVNUCA9IDA7Ci0gICAgICAgIHdoaWxlKENVUlRFTVAgPCBOVEVNUCkgewotICAgICAgICAgICAgaWYoUFJFRkxFTltDVVJURU1QXSA9PSBDVVJMRU4pIHsKLSAgICAgICAgICAgICAgICBDT0RFU1tDVVJURU1QXSA9IENVUkNPREU7Ci0gICAgICAgICAgICAgICAgQ1VSQ09ERSA9IENVUkNPREUgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1VSVEVNUCA9IENVUlRFTVAgKyAxOwotICAgICAgICB9Ci0gICAgICAgIENVUkxFTiA9IENVUkxFTiArIDE7Ci0gICAgfQotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShMRU5DT1VOVCk7Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEZJUlNUQ09ERSk7Ci0gICAgcmV0dXJuIDE7CisgICAgQ1VSTEVOID0gQ1VSTEVOICsgMTsKKyAgfQorICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoTEVOQ09VTlQpOworICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoRklSU1RDT0RFKTsKKyAgcmV0dXJuIDE7CiB9CiAKLSNkZWZpbmUgSFRfQ0hFQ0tfTUVNT1JZX0FESlVTVAkJCVwKLSAgICBpZihOVEVNUCA+PSBuU2l6ZSkJXAotICAgIHsJXAotICAgICAgICBuU2l6ZSArPSAxNjsJXAotICAgICAgICBQUkVGTEVOICA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfUmVhbGxvYyhQUkVGTEVOLHNpemVvZihpbnQpKm5TaXplKTsJXAotICAgICAgICBSQU5HRUxFTiA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfUmVhbGxvYyhSQU5HRUxFTixzaXplb2YoaW50KSpuU2l6ZSk7CVwKLSAgICAgICAgUkFOR0VMT1cgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX1JlYWxsb2MoUkFOR0VMT1csc2l6ZW9mKGludCkqblNpemUpOwlcCi0gICAgfQotaW50IENKQmlnMl9IdWZmbWFuVGFibGU6OnBhcnNlRnJvbUNvZGVkQnVmZmVyKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0pCi17Ci0gICAgdW5zaWduZWQgY2hhciBIVFBTLCBIVFJTOwotICAgIEZYX0RXT1JEIEhUTE9XLCBIVEhJR0g7Ci0gICAgRlhfRFdPUkQgQ1VSUkFOR0VMT1c7Ci0gICAgRlhfRFdPUkQgblNpemUgPSAxNjsKLSAgICBpbnQgQ1VSTEVOLCBMRU5NQVgsIENVUkNPREUsIENVUlRFTVA7Ci0gICAgaW50ICpMRU5DT1VOVDsKLSAgICBpbnQgKkZJUlNUQ09ERTsKLSAgICB1bnNpZ25lZCBjaGFyIGNUZW1wOwotICAgIGlmKHBTdHJlYW0tPnJlYWQxQnl0ZSgmY1RlbXApID09IC0xKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBIVE9PQiA9IGNUZW1wICYgMHgwMTsKLSAgICBIVFBTICA9ICgoY1RlbXAgPj4gMSkgJiAweDA3KSArIDE7Ci0gICAgSFRSUyAgPSAoKGNUZW1wID4+IDQpICYgMHgwNykgKyAxOwotICAgIGlmKHBTdHJlYW0tPnJlYWRJbnRlZ2VyKCZIVExPVykgPT0gLTEgIHx8Ci0gICAgICAgcFN0cmVhbS0+cmVhZEludGVnZXIoJkhUSElHSCkgPT0gLTEgfHwKLSAgICAgICBIVExPVyA+IEhUSElHSCkgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgUFJFRkxFTiAgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIG5TaXplKTsKLSAgICBSQU5HRUxFTiA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoaW50KSwgblNpemUpOwotICAgIFJBTkdFTE9XID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCBuU2l6ZSk7Ci0gICAgQ1VSUkFOR0VMT1cgPSBIVExPVzsKLSAgICBOVEVNUCA9IDA7Ci0gICAgZG8gewotICAgICAgICBIVF9DSEVDS19NRU1PUllfQURKVVNUCi0gICAgICAgIGlmKChwU3RyZWFtLT5yZWFkTkJpdHMoSFRQUywgJlBSRUZMRU5bTlRFTVBdKSA9PSAtMSkgfHwKLSAgICAgICAgICAgKHBTdHJlYW0tPnJlYWROQml0cyhIVFJTLCAmUkFOR0VMRU5bTlRFTVBdKSA9PSAtMSkpIHsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIFJBTkdFTE9XW05URU1QXSA9IENVUlJBTkdFTE9XOwotICAgICAgICBDVVJSQU5HRUxPVyA9IENVUlJBTkdFTE9XICsgKDEgPDwgUkFOR0VMRU5bTlRFTVBdKTsKLSAgICAgICAgTlRFTVAgPSBOVEVNUCArIDE7Ci0gICAgfSB3aGlsZShDVVJSQU5HRUxPVyA8IEhUSElHSCk7CisjZGVmaW5lIEhUX0NIRUNLX01FTU9SWV9BREpVU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChOVEVNUCA+PSBuU2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgblNpemUgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFJFRkxFTiA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfUmVhbGxvYyhQUkVGTEVOLCBzaXplb2YoaW50KSAqIG5TaXplKTsgICBcCisgICAgUkFOR0VMRU4gPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX1JlYWxsb2MoUkFOR0VMRU4sIHNpemVvZihpbnQpICogblNpemUpOyBcCisgICAgUkFOR0VMT1cgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX1JlYWxsb2MoUkFOR0VMT1csIHNpemVvZihpbnQpICogblNpemUpOyBcCisgIH0KK2ludCBDSkJpZzJfSHVmZm1hblRhYmxlOjpwYXJzZUZyb21Db2RlZEJ1ZmZlcihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtKSB7CisgIHVuc2lnbmVkIGNoYXIgSFRQUywgSFRSUzsKKyAgRlhfRFdPUkQgSFRMT1csIEhUSElHSDsKKyAgRlhfRFdPUkQgQ1VSUkFOR0VMT1c7CisgIEZYX0RXT1JEIG5TaXplID0gMTY7CisgIGludCBDVVJMRU4sIExFTk1BWCwgQ1VSQ09ERSwgQ1VSVEVNUDsKKyAgaW50KiBMRU5DT1VOVDsKKyAgaW50KiBGSVJTVENPREU7CisgIHVuc2lnbmVkIGNoYXIgY1RlbXA7CisgIGlmIChwU3RyZWFtLT5yZWFkMUJ5dGUoJmNUZW1wKSA9PSAtMSkgeworICAgIGdvdG8gZmFpbGVkOworICB9CisgIEhUT09CID0gY1RlbXAgJiAweDAxOworICBIVFBTID0gKChjVGVtcCA+PiAxKSAmIDB4MDcpICsgMTsKKyAgSFRSUyA9ICgoY1RlbXAgPj4gNCkgJiAweDA3KSArIDE7CisgIGlmIChwU3RyZWFtLT5yZWFkSW50ZWdlcigmSFRMT1cpID09IC0xIHx8CisgICAgICBwU3RyZWFtLT5yZWFkSW50ZWdlcigmSFRISUdIKSA9PSAtMSB8fCBIVExPVyA+IEhUSElHSCkgeworICAgIGdvdG8gZmFpbGVkOworICB9CisgIFBSRUZMRU4gPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIG5TaXplKTsKKyAgUkFOR0VMRU4gPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIG5TaXplKTsKKyAgUkFOR0VMT1cgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIG5TaXplKTsKKyAgQ1VSUkFOR0VMT1cgPSBIVExPVzsKKyAgTlRFTVAgPSAwOworICBkbyB7CiAgICAgSFRfQ0hFQ0tfTUVNT1JZX0FESlVTVAotICAgIGlmKHBTdHJlYW0tPnJlYWROQml0cyhIVFBTLCAmUFJFRkxFTltOVEVNUF0pID09IC0xKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOworICAgIGlmICgocFN0cmVhbS0+cmVhZE5CaXRzKEhUUFMsICZQUkVGTEVOW05URU1QXSkgPT0gLTEpIHx8CisgICAgICAgIChwU3RyZWFtLT5yZWFkTkJpdHMoSFRSUywgJlJBTkdFTEVOW05URU1QXSkgPT0gLTEpKSB7CisgICAgICBnb3RvIGZhaWxlZDsKICAgICB9Ci0gICAgUkFOR0VMRU5bTlRFTVBdID0gMzI7Ci0gICAgUkFOR0VMT1dbTlRFTVBdID0gSFRMT1cgLSAxOworICAgIFJBTkdFTE9XW05URU1QXSA9IENVUlJBTkdFTE9XOworICAgIENVUlJBTkdFTE9XID0gQ1VSUkFOR0VMT1cgKyAoMSA8PCBSQU5HRUxFTltOVEVNUF0pOwogICAgIE5URU1QID0gTlRFTVAgKyAxOworICB9IHdoaWxlIChDVVJSQU5HRUxPVyA8IEhUSElHSCk7CisgIEhUX0NIRUNLX01FTU9SWV9BREpVU1QKKyAgaWYgKHBTdHJlYW0tPnJlYWROQml0cyhIVFBTLCAmUFJFRkxFTltOVEVNUF0pID09IC0xKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgUkFOR0VMRU5bTlRFTVBdID0gMzI7CisgIFJBTkdFTE9XW05URU1QXSA9IEhUTE9XIC0gMTsKKyAgTlRFTVAgPSBOVEVNUCArIDE7CisgIEhUX0NIRUNLX01FTU9SWV9BREpVU1QKKyAgaWYgKHBTdHJlYW0tPnJlYWROQml0cyhIVFBTLCAmUFJFRkxFTltOVEVNUF0pID09IC0xKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgUkFOR0VMRU5bTlRFTVBdID0gMzI7CisgIFJBTkdFTE9XW05URU1QXSA9IEhUSElHSDsKKyAgTlRFTVAgPSBOVEVNUCArIDE7CisgIGlmIChIVE9PQikgewogICAgIEhUX0NIRUNLX01FTU9SWV9BREpVU1QKLSAgICBpZihwU3RyZWFtLT5yZWFkTkJpdHMoSFRQUywgJlBSRUZMRU5bTlRFTVBdKSA9PSAtMSkgewotICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICBpZiAocFN0cmVhbS0+cmVhZE5CaXRzKEhUUFMsICZQUkVGTEVOW05URU1QXSkgPT0gLTEpIHsKKyAgICAgIGdvdG8gZmFpbGVkOwogICAgIH0KLSAgICBSQU5HRUxFTltOVEVNUF0gPSAzMjsKLSAgICBSQU5HRUxPV1tOVEVNUF0gPSBIVEhJR0g7CiAgICAgTlRFTVAgPSBOVEVNUCArIDE7Ci0gICAgaWYoSFRPT0IpIHsKLSAgICAgICAgSFRfQ0hFQ0tfTUVNT1JZX0FESlVTVAotICAgICAgICBpZihwU3RyZWFtLT5yZWFkTkJpdHMoSFRQUywgJlBSRUZMRU5bTlRFTVBdKSA9PSAtMSkgewotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgTlRFTVAgPSBOVEVNUCArIDE7CisgIH0KKyAgQ09ERVMgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIE5URU1QKTsKKyAgTEVOTUFYID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVEVNUDsgaSsrKSB7CisgICAgaWYgKFBSRUZMRU5baV0gPiBMRU5NQVgpIHsKKyAgICAgIExFTk1BWCA9IFBSRUZMRU5baV07CiAgICAgfQotICAgIENPREVTID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCBOVEVNUCk7Ci0gICAgTEVOTUFYID0gMDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgTlRFTVA7IGkrKykgewotICAgICAgICBpZihQUkVGTEVOW2ldID4gTEVOTUFYKSB7Ci0gICAgICAgICAgICBMRU5NQVggPSBQUkVGTEVOW2ldOwotICAgICAgICB9CisgIH0KKyAgTEVOQ09VTlQgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIChMRU5NQVggKyAxKSk7CisgIEpCSUcyX21lbXNldChMRU5DT1VOVCwgMCwgc2l6ZW9mKGludCkgKiAoTEVOTUFYICsgMSkpOworICBGSVJTVENPREUgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIChMRU5NQVggKyAxKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTlRFTVA7IGkrKykgeworICAgIExFTkNPVU5UW1BSRUZMRU5baV1dKys7CisgIH0KKyAgQ1VSTEVOID0gMTsKKyAgRklSU1RDT0RFWzBdID0gMDsKKyAgTEVOQ09VTlRbMF0gPSAwOworICB3aGlsZSAoQ1VSTEVOIDw9IExFTk1BWCkgeworICAgIEZJUlNUQ09ERVtDVVJMRU5dID0gKEZJUlNUQ09ERVtDVVJMRU4gLSAxXSArIExFTkNPVU5UW0NVUkxFTiAtIDFdKSA8PCAxOworICAgIENVUkNPREUgPSBGSVJTVENPREVbQ1VSTEVOXTsKKyAgICBDVVJURU1QID0gMDsKKyAgICB3aGlsZSAoQ1VSVEVNUCA8IE5URU1QKSB7CisgICAgICBpZiAoUFJFRkxFTltDVVJURU1QXSA9PSBDVVJMRU4pIHsKKyAgICAgICAgQ09ERVNbQ1VSVEVNUF0gPSBDVVJDT0RFOworICAgICAgICBDVVJDT0RFID0gQ1VSQ09ERSArIDE7CisgICAgICB9CisgICAgICBDVVJURU1QID0gQ1VSVEVNUCArIDE7CiAgICAgfQotICAgIExFTkNPVU5UID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCAoTEVOTUFYICsgMSkpOwotICAgIEpCSUcyX21lbXNldChMRU5DT1VOVCwgMCwgc2l6ZW9mKGludCkgKiAoTEVOTUFYICsgMSkpOwotICAgIEZJUlNUQ09ERSA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoaW50KSwgKExFTk1BWCArIDEpKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgTlRFTVA7IGkrKykgewotICAgICAgICBMRU5DT1VOVFtQUkVGTEVOW2ldXSArKzsKLSAgICB9Ci0gICAgQ1VSTEVOID0gMTsKLSAgICBGSVJTVENPREVbMF0gPSAwOwotICAgIExFTkNPVU5UWzBdICA9IDA7Ci0gICAgd2hpbGUoQ1VSTEVOIDw9IExFTk1BWCkgewotICAgICAgICBGSVJTVENPREVbQ1VSTEVOXSA9IChGSVJTVENPREVbQ1VSTEVOIC0gMV0gKyBMRU5DT1VOVFtDVVJMRU4gLSAxXSkgPDwgMTsKLSAgICAgICAgQ1VSQ09ERSA9IEZJUlNUQ09ERVtDVVJMRU5dOwotICAgICAgICBDVVJURU1QID0gMDsKLSAgICAgICAgd2hpbGUoQ1VSVEVNUCA8IE5URU1QKSB7Ci0gICAgICAgICAgICBpZihQUkVGTEVOW0NVUlRFTVBdID09IENVUkxFTikgewotICAgICAgICAgICAgICAgIENPREVTW0NVUlRFTVBdID0gQ1VSQ09ERTsKLSAgICAgICAgICAgICAgICBDVVJDT0RFID0gQ1VSQ09ERSArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDVVJURU1QID0gQ1VSVEVNUCArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgQ1VSTEVOID0gQ1VSTEVOICsgMTsKLSAgICB9Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKExFTkNPVU5UKTsKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoRklSU1RDT0RFKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBDVVJMRU4gPSBDVVJMRU4gKyAxOworICB9CisgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShMRU5DT1VOVCk7CisgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShGSVJTVENPREUpOworICByZXR1cm4gVFJVRTsKIGZhaWxlZDoKLSAgICByZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5oCmluZGV4IGQ2OGNlZDIuLmU2ZjE1OTIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuaApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBfSkJJRzJfSFVGRk1BTl9UQUJMRV9IXwpAQCAtOSwzNCArOSwzMiBAQAogI2luY2x1ZGUgIkpCaWcyX01vZHVsZS5oIgogI2luY2x1ZGUgIkpCaWcyX0h1ZmZtYW5UYWJsZV9TdGFuZGFyZC5oIgogI2luY2x1ZGUgIkpCaWcyX0JpdFN0cmVhbS5oIgotY2xhc3MgQ0pCaWcyX0h1ZmZtYW5UYWJsZSA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDSkJpZzJfSHVmZm1hblRhYmxlIDogcHVibGljIENKQmlnMl9PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pCaWcyX0h1ZmZtYW5UYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSogcFRhYmxlLCBpbnQgbkxpbmVzLCBGWF9CT09MIGJIVE9PQik7CiAKLSAgICBDSkJpZzJfSHVmZm1hblRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lICpwVGFibGUsIGludCBuTGluZXMsIEZYX0JPT0wgYkhUT09CKTsKKyAgQ0pCaWcyX0h1ZmZtYW5UYWJsZShDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtKTsKIAotICAgIENKQmlnMl9IdWZmbWFuVGFibGUoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSk7CisgIH5DSkJpZzJfSHVmZm1hblRhYmxlKCk7CiAKLSAgICB+Q0pCaWcyX0h1ZmZtYW5UYWJsZSgpOworICB2b2lkIGluaXQoKTsKIAotICAgIHZvaWQgaW5pdCgpOworICBpbnQgcGFyc2VGcm9tU3RhbmRhcmRUYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSogcFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJIVE9PQik7CiAKLSAgICBpbnQgcGFyc2VGcm9tU3RhbmRhcmRUYWJsZShjb25zdCBKQmlnMlRhYmxlTGluZSAqcFRhYmxlLCBpbnQgbkxpbmVzLCBGWF9CT09MIGJIVE9PQik7CisgIGludCBwYXJzZUZyb21Db2RlZEJ1ZmZlcihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtKTsKIAotICAgIGludCBwYXJzZUZyb21Db2RlZEJ1ZmZlcihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtKTsKKyAgRlhfQk9PTCBpc09LKCkgeyByZXR1cm4gbV9iT0s7IH0KIAotICAgIEZYX0JPT0wgaXNPSygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9iT0s7Ci0gICAgfQotcHJpdmF0ZToKLSAgICBGWF9CT09MIEhUT09COwotICAgIGludCBOVEVNUDsKLSAgICBpbnQgKkNPREVTOwotICAgIGludCAqUFJFRkxFTjsKLSAgICBpbnQgKlJBTkdFTEVOOwotICAgIGludCAqUkFOR0VMT1c7Ci0gICAgRlhfQk9PTCBtX2JPSzsKLSAgICBmcmllbmQgY2xhc3MgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyOworIHByaXZhdGU6CisgIEZYX0JPT0wgSFRPT0I7CisgIGludCBOVEVNUDsKKyAgaW50KiBDT0RFUzsKKyAgaW50KiBQUkVGTEVOOworICBpbnQqIFJBTkdFTEVOOworICBpbnQqIFJBTkdFTE9XOworICBGWF9CT09MIG1fYk9LOworICBmcmllbmQgY2xhc3MgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyOwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlX1N0YW5kYXJkLmgKaW5kZXggNDI4YjJjMy4uYWEyOTI1OCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZV9TdGFuZGFyZC5oCkBAIC0xLDI1MSArMSw5MyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIF9KQklHMl9IVUZGTUFOX1RBQkxFX1NUQU5EQVJEX0hfCiAjZGVmaW5lIF9KQklHMl9IVUZGTUFOX1RBQkxFX1NUQU5EQVJEX0hfCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IFBSRUZMRU47Ci0gICAgaW50IFJBTkRFTEVOOwotICAgIGludCBSQU5HRUxPVzsKKyAgaW50IFBSRUZMRU47CisgIGludCBSQU5ERUxFTjsKKyAgaW50IFJBTkdFTE9XOwogfSBKQmlnMlRhYmxlTGluZTsKIGNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxID0gRkFMU0U7Ci1jb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjFbXSA9IHsKLSAgICB7IDEsCTQsCQkwIH0sCi0gICAgeyAyLAk4LAkgICAxNiB9LAotICAgIHsgMywgICAxNiwJICAyNzIgfSwKLSAgICB7IDAsICAgMzIsCSAgIC0xIH0sCi0gICAgeyAzLCAgIDMyLAk2NTgwOCB9Ci19OworY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxW10gPSB7ezEsIDQsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsIDgsIDE2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLCAxNiwgMjcyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAzMiwgLTF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsIDMyLCA2NTgwOH19OwogY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjIgPSBUUlVFOwotY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IyW10gPSB7Ci0gICAgeyAxLAkwLAkJMCB9LAotICAgIHsgMiwJMCwJCTEgfSwKLSAgICB7IDMsCTAsCQkyIH0sCi0gICAgeyA0LAkzLAkJMyB9LAotICAgIHsgNSwJNiwJICAgMTEgfSwKLSAgICB7IDAsICAgMzIsCSAgIC0xIH0sCi0gICAgeyA2LCAgIDMyLCAgICAgNzUgfSwKLSAgICB7IDYsCTAsICAgICAgMCB9Ci19OworY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IyW10gPSB7ezEsIDAsIDB9LCAgIHsyLCAwLCAxfSwgIHszLCAwLCAyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0LCAzLCAzfSwgICB7NSwgNiwgMTF9LCB7MCwgMzIsIC0xfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2LCAzMiwgNzV9LCB7NiwgMCwgMH19OwogY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjMgPSBUUlVFOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IzW10gPSB7Ci0gICAgeyA4LAk4LCAgIC0yNTYgfSwKLSAgICB7IDEsCTAsCQkwIH0sCi0gICAgeyAyLAkwLAkJMSB9LAotICAgIHsgMywJMCwJCTIgfSwKLSAgICB7IDQsCTMsCQkzIH0sCi0gICAgeyA1LAk2LAkgICAxMSB9LAotICAgIHsgOCwgICAzMiwgICAtMjU3IH0sCi0gICAgeyA3LCAgIDMyLCAgICAgNzUgfSwKLSAgICB7IDYsCTAsCQkwIH0KLX07CisgICAgezgsIDgsIC0yNTZ9LCB7MSwgMCwgMH0sICAgICB7MiwgMCwgMX0sICAgezMsIDAsIDJ9LCB7NCwgMywgM30sCisgICAgezUsIDYsIDExfSwgICB7OCwgMzIsIC0yNTd9LCB7NywgMzIsIDc1fSwgezYsIDAsIDB9fTsKIGNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0I0ID0gRkFMU0U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjRbXSA9IHsKLSAgICB7IDEsCTAsCQkxIH0sCi0gICAgeyAyLAkwLAkJMiB9LAotICAgIHsgMywJMCwJCTMgfSwKLSAgICB7IDQsCTMsCQk0IH0sCi0gICAgeyA1LAk2LAkgICAxMiB9LAotICAgIHsgMCwgICAzMiwgICAgIC0xIH0sCi0gICAgeyA1LCAgIDMyLAkgICA3NiB9LAorICAgIHsxLCAwLCAxfSwgIHsyLCAwLCAyfSwgICB7MywgMCwgM30sICAgezQsIDMsIDR9LAorICAgIHs1LCA2LCAxMn0sIHswLCAzMiwgLTF9LCB7NSwgMzIsIDc2fSwKIH07CiBjb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNSA9IEZBTFNFOwotY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I1W10gPSB7Ci0gICAgeyA3LAk4LAkgLTI1NSB9LAotICAgIHsgMSwJMCwJICAgIDEgfSwKLSAgICB7IDIsCTAsCSAgICAyIH0sCi0gICAgeyAzLCAgICAwLCAgICAgIDMgfSwKLSAgICB7IDQsCTMsCSAgICA0IH0sCi0gICAgeyA1LAk2LAkgICAxMiB9LAotICAgIHsgNywgICAzMiwgICAtMjU2IH0sCi0gICAgeyA2LCAgIDMyLCAgICAgNzYgfQotfTsKK2NvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CNVtdID0ge3s3LCA4LCAtMjU1fSwgIHsxLCAwLCAxfSwgIHsyLCAwLCAyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLCAwLCAzfSwgICAgIHs0LCAzLCA0fSwgIHs1LCA2LCAxMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NywgMzIsIC0yNTZ9LCB7NiwgMzIsIDc2fX07CiBjb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNiA9IEZBTFNFOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I2W10gPSB7Ci0gICAgeyA1LCAgIDEwLAktMjA0OCB9LAotICAgIHsgNCwgICAgOSwJLTEwMjQgfSwKLSAgICB7IDQsCTgsCSAtNTEyIH0sCi0gICAgeyA0LAk3LAkgLTI1NiB9LAotICAgIHsgNSwJNiwJIC0xMjggfSwKLSAgICB7IDUsCTUsCSAgLTY0IH0sCi0gICAgeyA0LAk1LAkgIC0zMiB9LAotICAgIHsgMiwJNywJCTAgfSwKLSAgICB7IDMsCTcsCSAgMTI4IH0sCi0gICAgeyAzLAk4LAkgIDI1NiB9LAotICAgIHsgNCwJOSwJICA1MTIgfSwKLSAgICB7IDQsICAgMTAsCSAxMDI0IH0sCi0gICAgeyA2LCAgIDMyLAktMjA0OSB9LAotICAgIHsgNiwgICAzMiwJIDIwNDggfQotfTsKKyAgICB7NSwgMTAsIC0yMDQ4fSwgezQsIDksIC0xMDI0fSwgezQsIDgsIC01MTJ9LCAgIHs0LCA3LCAtMjU2fSwgezUsIDYsIC0xMjh9LAorICAgIHs1LCA1LCAtNjR9LCAgICB7NCwgNSwgLTMyfSwgICB7MiwgNywgMH0sICAgICAgezMsIDcsIDEyOH0sICB7MywgOCwgMjU2fSwKKyAgICB7NCwgOSwgNTEyfSwgICAgezQsIDEwLCAxMDI0fSwgezYsIDMyLCAtMjA0OX0sIHs2LCAzMiwgMjA0OH19OwogY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjcgPSBGQUxTRTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CN1tdID0gewotICAgIHsgNCwJOSwJLTEwMjQgfSwKLSAgICB7IDMsCTgsCSAtNTEyIH0sCi0gICAgeyA0LAk3LAkgLTI1NiB9LAotICAgIHsgNSwJNiwJIC0xMjggfSwKLSAgICB7IDUsCTUsCSAgLTY0IH0sCi0gICAgeyA0LAk1LAkgIC0zMiB9LAotICAgIHsgNCwJNSwJCTAgfSwKLSAgICB7IDUsCTUsCSAgIDMyIH0sCi0gICAgeyA1LAk2LAkgICA2NCB9LAotICAgIHsgNCwJNywJICAxMjggfSwKLSAgICB7IDMsCTgsCSAgMjU2IH0sCi0gICAgeyAzLAk5LAkgIDUxMiB9LAotICAgIHsgMywgICAxMCwJIDEwMjQgfSwKLSAgICB7IDUsICAgMzIsCS0xMDI1IH0sCi0gICAgeyA1LCAgIDMyLAkgMjA0OCB9LAorICAgIHs0LCA5LCAtMTAyNH0sIHszLCA4LCAtNTEyfSwgezQsIDcsIC0yNTZ9LCAgezUsIDYsIC0xMjh9LCAgIHs1LCA1LCAtNjR9LAorICAgIHs0LCA1LCAtMzJ9LCAgIHs0LCA1LCAwfSwgICAgezUsIDUsIDMyfSwgICAgezUsIDYsIDY0fSwgICAgIHs0LCA3LCAxMjh9LAorICAgIHszLCA4LCAyNTZ9LCAgIHszLCA5LCA1MTJ9LCAgezMsIDEwLCAxMDI0fSwgezUsIDMyLCAtMTAyNX0sIHs1LCAzMiwgMjA0OH0sCiB9OwogY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjggPSBUUlVFOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I4W10gPSB7Ci0gICAgeyA4LAkzLAkgIC0xNSB9LAotICAgIHsgOSwJMSwJICAgLTcgfSwKLSAgICB7IDgsCTEsCSAgIC01IH0sCi0gICAgeyA5LAkwLAkgICAtMyB9LAotICAgIHsgNywJMCwJICAgLTIgfSwKLSAgICB7IDQsCTAsCSAgIC0xIH0sCi0gICAgeyAyLAkxLAkJMCB9LAotICAgIHsgNSwJMCwJCTIgfSwKLSAgICB7IDYsCTAsCQkzIH0sCi0gICAgeyAzLAk0LAkJNCB9LAotICAgIHsgNiwJMSwJICAgMjAgfSwKLSAgICB7IDQsCTQsCSAgIDIyIH0sCi0gICAgeyA0LAk1LAkgICAzOCB9LAotICAgIHsgNSwJNiwJICAgNzAgfSwKLSAgICB7IDUsCTcsCSAgMTM0IH0sCi0gICAgeyA2LAk3LAkgIDI2MiB9LAotICAgIHsgNywJOCwJICAzOTAgfSwKLSAgICB7IDYsICAgMTAsCSAgNjQ2IH0sCi0gICAgeyA5LCAgIDMyLAkgIC0xNiB9LAotICAgIHsgOSwgICAzMiwJIDE2NzAgfSwKLSAgICB7IDIsCTAsCQkwIH0KLX07CisgICAgezgsIDMsIC0xNX0sIHs5LCAxLCAtN30sICB7OCwgMSwgLTV9LCAgIHs5LCAwLCAtM30sICAgezcsIDAsIC0yfSwKKyAgICB7NCwgMCwgLTF9LCAgezIsIDEsIDB9LCAgIHs1LCAwLCAyfSwgICAgezYsIDAsIDN9LCAgICB7MywgNCwgNH0sCisgICAgezYsIDEsIDIwfSwgIHs0LCA0LCAyMn0sICB7NCwgNSwgMzh9LCAgIHs1LCA2LCA3MH0sICAgezUsIDcsIDEzNH0sCisgICAgezYsIDcsIDI2Mn0sIHs3LCA4LCAzOTB9LCB7NiwgMTAsIDY0Nn0sIHs5LCAzMiwgLTE2fSwgezksIDMyLCAxNjcwfSwKKyAgICB7MiwgMCwgMH19OwogY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjkgPSBUUlVFOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I5W10gPSB7Ci0gICAgeyA4LAk0LAkgIC0zMSB9LAotICAgIHsgOSwJMiwJICAtMTUgfSwKLSAgICB7IDgsCTIsCSAgLTExIH0sCi0gICAgeyA5LAkxLAkgICAtNyB9LAotICAgIHsgNywJMSwJICAgLTUgfSwKLSAgICB7IDQsCTEsCSAgIC0zIH0sCi0gICAgeyAzLAkxLAkgICAtMSB9LAotICAgIHsgMywJMSwJCTEgfSwKLSAgICB7IDUsCTEsCQkzIH0sCi0gICAgeyA2LAkxLAkJNSB9LAotICAgIHsgMywJNSwJCTcgfSwKLSAgICB7IDYsCTIsCSAgIDM5IH0sCi0gICAgeyA0LAk1LAkgICA0MyB9LAotICAgIHsgNCwJNiwJICAgNzUgfSwKLSAgICB7IDUsCTcsCSAgMTM5IH0sCi0gICAgeyA1LAk4LAkgIDI2NyB9LAotICAgIHsgNiwJOCwJICA1MjMgfSwKLSAgICB7IDcsCTksCSAgNzc5IH0sCi0gICAgeyA2LCAgIDExLAkgMTI5MSB9LAotICAgIHsgOSwgICAzMiwJICAtMzIgfSwKLSAgICB7IDksICAgMzIsCSAzMzM5IH0sCi0gICAgeyAyLAkwLAkJMCB9Ci19OworICAgIHs4LCA0LCAtMzF9LCAgIHs5LCAyLCAtMTV9LCB7OCwgMiwgLTExfSwgezksIDEsIC03fSwgICAgezcsIDEsIC01fSwKKyAgICB7NCwgMSwgLTN9LCAgICB7MywgMSwgLTF9LCAgezMsIDEsIDF9LCAgIHs1LCAxLCAzfSwgICAgIHs2LCAxLCA1fSwKKyAgICB7MywgNSwgN30sICAgICB7NiwgMiwgMzl9LCAgezQsIDUsIDQzfSwgIHs0LCA2LCA3NX0sICAgIHs1LCA3LCAxMzl9LAorICAgIHs1LCA4LCAyNjd9LCAgIHs2LCA4LCA1MjN9LCB7NywgOSwgNzc5fSwgezYsIDExLCAxMjkxfSwgezksIDMyLCAtMzJ9LAorICAgIHs5LCAzMiwgMzMzOX0sIHsyLCAwLCAwfX07CiBjb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTAgPSBUUlVFOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxMFtdID0gewotICAgIHsgNywJNCwJICAtMjEgfSwKLSAgICB7IDgsCTAsCSAgIC01IH0sCi0gICAgeyA3LAkwLAkgICAtNCB9LAotICAgIHsgNSwJMCwJICAgLTMgfSwKLSAgICB7IDIsCTIsCSAgIC0yIH0sCi0gICAgeyA1LAkwLAkJMiB9LAotICAgIHsgNiwJMCwJCTMgfSwKLSAgICB7IDcsCTAsCQk0IH0sCi0gICAgeyA4LAkwLAkJNSB9LAotICAgIHsgMiwJNiwJCTYgfSwKLSAgICB7IDUsCTUsCSAgIDcwIH0sCi0gICAgeyA2LAk1LAkgIDEwMiB9LAotICAgIHsgNiwJNiwJICAxMzQgfSwKLSAgICB7IDYsCTcsCSAgMTk4IH0sCi0gICAgeyA2LAk4LAkgIDMyNiB9LAotICAgIHsgNiwJOSwJICA1ODIgfSwKLSAgICB7IDYsICAgMTAsCSAxMDk0IH0sCi0gICAgeyA3LCAgIDExLAkgMjExOCB9LAotICAgIHsgOCwgICAzMiwJICAtMjIgfSwKLSAgICB7IDgsICAgMzIsCSA0MTY2IH0sCi0gICAgeyAyLAkwLAkJMCB9Ci19OworICAgIHs3LCA0LCAtMjF9LCB7OCwgMCwgLTV9LCAgICB7NywgMCwgLTR9LCAgICB7NSwgMCwgLTN9LCAgIHsyLCAyLCAtMn0sCisgICAgezUsIDAsIDJ9LCAgIHs2LCAwLCAzfSwgICAgIHs3LCAwLCA0fSwgICAgIHs4LCAwLCA1fSwgICAgezIsIDYsIDZ9LAorICAgIHs1LCA1LCA3MH0sICB7NiwgNSwgMTAyfSwgICB7NiwgNiwgMTM0fSwgICB7NiwgNywgMTk4fSwgIHs2LCA4LCAzMjZ9LAorICAgIHs2LCA5LCA1ODJ9LCB7NiwgMTAsIDEwOTR9LCB7NywgMTEsIDIxMTh9LCB7OCwgMzIsIC0yMn0sIHs4LCAzMiwgNDE2Nn0sCisgICAgezIsIDAsIDB9fTsKIGNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxMSA9IEZBTFNFOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxMVtdID0gewotICAgIHsgMSwJMCwJCTEgfSwKLSAgICB7IDIsCTEsCQkyIH0sCi0gICAgeyA0LAkwLAkJNCB9LAotICAgIHsgNCwJMSwJCTUgfSwKLSAgICB7IDUsCTEsCQk3IH0sCi0gICAgeyA1LAkyLAkJOSB9LAotICAgIHsgNiwJMiwJICAgMTMgfSwKLSAgICB7IDcsCTIsCSAgIDE3IH0sCi0gICAgeyA3LAkzLAkgICAyMSB9LAotICAgIHsgNywJNCwJICAgMjkgfSwKLSAgICB7IDcsCTUsCSAgIDQ1IH0sCi0gICAgeyA3LAk2LAkgICA3NyB9LAotICAgIHsgMCwgICAzMiwJCTAgfSwKLSAgICB7IDcsICAgMzIsCSAgMTQxIH0KLX07CisgICAgezEsIDAsIDF9LCAgezIsIDEsIDJ9LCAgezQsIDAsIDR9LCAgezQsIDEsIDV9LCAgIHs1LCAxLCA3fSwKKyAgICB7NSwgMiwgOX0sICB7NiwgMiwgMTN9LCB7NywgMiwgMTd9LCB7NywgMywgMjF9LCAgezcsIDQsIDI5fSwKKyAgICB7NywgNSwgNDV9LCB7NywgNiwgNzd9LCB7MCwgMzIsIDB9LCB7NywgMzIsIDE0MX19OwogY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjEyID0gRkFMU0U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjEyW10gPSB7Ci0gICAgeyAxLAkwLAkJMSB9LAotICAgIHsgMiwJMCwJCTIgfSwKLSAgICB7IDMsCTEsCQkzIH0sCi0gICAgeyA1LAkwLAkJNSB9LAotICAgIHsgNSwJMSwJCTYgfSwKLSAgICB7IDYsCTEsCQk4IH0sCi0gICAgeyA3LAkwLAkgICAxMCB9LAotICAgIHsgNywJMSwJICAgMTEgfSwKLSAgICB7IDcsCTIsCSAgIDEzIH0sCi0gICAgeyA3LAkzLAkgICAxNyB9LAotICAgIHsgNywJNCwJICAgMjUgfSwKLSAgICB7IDgsCTUsCSAgIDQxIH0sCi0gICAgeyAwLCAgIDMyLAkJMCB9LAotICAgIHsgOCwgICAzMiwJICAgNzMgfQotfTsKKyAgICB7MSwgMCwgMX0sICB7MiwgMCwgMn0sICB7MywgMSwgM30sICB7NSwgMCwgNX0sICB7NSwgMSwgNn0sCisgICAgezYsIDEsIDh9LCAgezcsIDAsIDEwfSwgezcsIDEsIDExfSwgezcsIDIsIDEzfSwgezcsIDMsIDE3fSwKKyAgICB7NywgNCwgMjV9LCB7OCwgNSwgNDF9LCB7MCwgMzIsIDB9LCB7OCwgMzIsIDczfX07CiBjb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTMgPSBGQUxTRTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMTNbXSA9IHsKLSAgICB7IDEsCTAsCQkxIH0sCi0gICAgeyAzLAkwLAkJMiB9LAotICAgIHsgNCwJMCwJCTMgfSwKLSAgICB7IDUsCTAsCQk0IH0sCi0gICAgeyA0LAkxLAkJNSB9LAotICAgIHsgMywJMywJCTcgfSwKLSAgICB7IDYsCTEsCSAgIDE1IH0sCi0gICAgeyA2LAkyLAkgICAxNyB9LAotICAgIHsgNiwJMywJICAgMjEgfSwKLSAgICB7IDYsCTQsCSAgIDI5IH0sCi0gICAgeyA2LAk1LAkgICA0NSB9LAotICAgIHsgNywJNiwJICAgNzcgfSwKLSAgICB7IDAsICAgMzIsCQkwIH0sCi0gICAgeyA3LCAgIDMyLAkgIDE0MSB9Ci19OworICAgIHsxLCAwLCAxfSwgIHszLCAwLCAyfSwgIHs0LCAwLCAzfSwgIHs1LCAwLCA0fSwgICB7NCwgMSwgNX0sCisgICAgezMsIDMsIDd9LCAgezYsIDEsIDE1fSwgezYsIDIsIDE3fSwgezYsIDMsIDIxfSwgIHs2LCA0LCAyOX0sCisgICAgezYsIDUsIDQ1fSwgezcsIDYsIDc3fSwgezAsIDMyLCAwfSwgezcsIDMyLCAxNDF9fTsKIGNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxNCA9IEZBTFNFOwotY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxNFtdID0gewotICAgIHsgMywJMCwJICAgLTIgfSwKLSAgICB7IDMsCTAsCSAgIC0xIH0sCi0gICAgeyAxLAkwLAkJMCB9LAotICAgIHsgMywJMCwJCTEgfSwKLSAgICB7IDMsCTAsCQkyIH0sCi0gICAgeyAwLCAgIDMyLAkgICAtMyB9LAotICAgIHsgMCwgICAzMiwJCTMgfQotfTsKK2NvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMTRbXSA9IHt7MywgMCwgLTJ9LCB7MywgMCwgLTF9LCB7MSwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsIDAsIDF9LCAgezMsIDAsIDJ9LCAgezAsIDMyLCAtM30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDMyLCAzfX07CiBjb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUgPSBGQUxTRTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMTVbXSA9IHsKLSAgICB7IDcsCTQsCSAgLTI0IH0sCi0gICAgeyA2LAkyLAkgICAtOCB9LAotICAgIHsgNSwJMSwJICAgLTQgfSwKLSAgICB7IDQsCTAsCSAgIC0yIH0sCi0gICAgeyAzLAkwLAkgICAtMSB9LAotICAgIHsgMSwJMCwJCTAgfSwKLSAgICB7IDMsCTAsCQkxIH0sCi0gICAgeyA0LAkwLAkJMiB9LAotICAgIHsgNSwJMSwJCTMgfSwKLSAgICB7IDYsCTIsCQk1IH0sCi0gICAgeyA3LAk0LAkJOSB9LAotICAgIHsgNywgICAzMiwJICAtMjUgfSwKLSAgICB7IDcsICAgMzIsCSAgIDI1IH0KLX07CisgICAgezcsIDQsIC0yNH0sIHs2LCAyLCAtOH0sICAgezUsIDEsIC00fSwgezQsIDAsIC0yfSwgezMsIDAsIC0xfSwKKyAgICB7MSwgMCwgMH0sICAgezMsIDAsIDF9LCAgICB7NCwgMCwgMn0sICB7NSwgMSwgM30sICB7NiwgMiwgNX0sCisgICAgezcsIDQsIDl9LCAgIHs3LCAzMiwgLTI1fSwgezcsIDMyLCAyNX19OwogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCmluZGV4IDllZjQ0NjQuLjc3MmU0ZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSA8bGltaXRzLmg+CkBAIC0xMCwxNjIxICsxMCwxNjQ2IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCiAjaW5jbHVkZSAiSkJpZzJfSW1hZ2UuaCIKIAotQ0pCaWcyX0ltYWdlOjpDSkJpZzJfSW1hZ2UoaW50MzJfdCB3LCBpbnQzMl90IGgpCi17Ci0gICAgbV9uV2lkdGgJPSB3OwotICAgIG1fbkhlaWdodAk9IGg7Ci0gICAgaWYgKG1fbldpZHRoIDw9IDAgfHwgbV9uSGVpZ2h0IDw9IDAgfHwgbV9uV2lkdGggPiBJTlRfTUFYIC0gMzEpIHsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgICAgIG1fYk5lZWRGcmVlID0gRkFMU0U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9uU3RyaWRlICA9ICgodyArIDMxKSA+PiA1KSA8PCAyOwotICAgIGlmIChtX25TdHJpZGUgKiBtX25IZWlnaHQgPiAwICYmIDEwNDg1NzYwMCAvIChpbnQpbV9uU3RyaWRlID4gbV9uSGVpZ2h0KSB7Ci0gICAgICAgIG1fcERhdGEgPSAodWludDhfdCAqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihtX25TdHJpZGUsIG1fbkhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgfQotICAgIG1fYk5lZWRGcmVlID0gVFJVRTsKLX0KLUNKQmlnMl9JbWFnZTo6Q0pCaWcyX0ltYWdlKGludDMyX3QgdywgaW50MzJfdCBoLCBpbnQzMl90IHN0cmlkZSwgdWludDhfdCpwQnVmKQotewotICAgIG1fbldpZHRoID0gdzsKLSAgICBtX25IZWlnaHQgPSBoOwotICAgIG1fblN0cmlkZSA9IHN0cmlkZTsKLSAgICBtX3BEYXRhID0gcEJ1ZjsKK0NKQmlnMl9JbWFnZTo6Q0pCaWcyX0ltYWdlKGludDMyX3QgdywgaW50MzJfdCBoKSB7CisgIG1fbldpZHRoID0gdzsKKyAgbV9uSGVpZ2h0ID0gaDsKKyAgaWYgKG1fbldpZHRoIDw9IDAgfHwgbV9uSGVpZ2h0IDw9IDAgfHwgbV9uV2lkdGggPiBJTlRfTUFYIC0gMzEpIHsKKyAgICBtX3BEYXRhID0gTlVMTDsKICAgICBtX2JOZWVkRnJlZSA9IEZBTFNFOworICAgIHJldHVybjsKKyAgfQorICBtX25TdHJpZGUgPSAoKHcgKyAzMSkgPj4gNSkgPDwgMjsKKyAgaWYgKG1fblN0cmlkZSAqIG1fbkhlaWdodCA+IDAgJiYgMTA0ODU3NjAwIC8gKGludCltX25TdHJpZGUgPiBtX25IZWlnaHQpIHsKKyAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihtX25TdHJpZGUsIG1fbkhlaWdodCk7CisgIH0gZWxzZSB7CisgICAgbV9wRGF0YSA9IE5VTEw7CisgIH0KKyAgbV9iTmVlZEZyZWUgPSBUUlVFOwogfQotQ0pCaWcyX0ltYWdlOjpDSkJpZzJfSW1hZ2UoQ0pCaWcyX0ltYWdlICZpbSkKLXsKLSAgICBtX3BNb2R1bGUgPSBpbS5tX3BNb2R1bGU7Ci0gICAgbV9uV2lkdGgJPSBpbS5tX25XaWR0aDsKLSAgICBtX25IZWlnaHQJPSBpbS5tX25IZWlnaHQ7Ci0gICAgbV9uU3RyaWRlCT0gaW0ubV9uU3RyaWRlOwotICAgIGlmIChpbS5tX3BEYXRhKSB7Ci0gICAgICAgIG1fcERhdGEgPSAodWludDhfdCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKG1fblN0cmlkZSwgbV9uSGVpZ2h0KTsKLSAgICAgICAgSkJJRzJfbWVtY3B5KG1fcERhdGEsIGltLm1fcERhdGEsIG1fblN0cmlkZSAqIG1fbkhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgfQotICAgIG1fYk5lZWRGcmVlID0gVFJVRTsKK0NKQmlnMl9JbWFnZTo6Q0pCaWcyX0ltYWdlKGludDMyX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcEJ1ZikgeworICBtX25XaWR0aCA9IHc7CisgIG1fbkhlaWdodCA9IGg7CisgIG1fblN0cmlkZSA9IHN0cmlkZTsKKyAgbV9wRGF0YSA9IHBCdWY7CisgIG1fYk5lZWRGcmVlID0gRkFMU0U7CiB9Ci1DSkJpZzJfSW1hZ2U6On5DSkJpZzJfSW1hZ2UoKQotewotICAgIGlmKG1fYk5lZWRGcmVlICYmIG1fcERhdGEpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fcERhdGEpOwotICAgIH0KK0NKQmlnMl9JbWFnZTo6Q0pCaWcyX0ltYWdlKENKQmlnMl9JbWFnZSYgaW0pIHsKKyAgbV9wTW9kdWxlID0gaW0ubV9wTW9kdWxlOworICBtX25XaWR0aCA9IGltLm1fbldpZHRoOworICBtX25IZWlnaHQgPSBpbS5tX25IZWlnaHQ7CisgIG1fblN0cmlkZSA9IGltLm1fblN0cmlkZTsKKyAgaWYgKGltLm1fcERhdGEpIHsKKyAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihtX25TdHJpZGUsIG1fbkhlaWdodCk7CisgICAgSkJJRzJfbWVtY3B5KG1fcERhdGEsIGltLm1fcERhdGEsIG1fblN0cmlkZSAqIG1fbkhlaWdodCk7CisgIH0gZWxzZSB7CisgICAgbV9wRGF0YSA9IE5VTEw7CisgIH0KKyAgbV9iTmVlZEZyZWUgPSBUUlVFOwogfQotRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmdldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KQotewotICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50MzJfdCBtLCBuOwotICAgIGlmKHggPCAwIHx8IHggPj0gbV9uV2lkdGgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmKHkgPCAwIHx8IHkgPj0gbV9uSGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBtID0geSAqIG1fblN0cmlkZSArICh4ID4+IDMpOwotICAgIG4gPSB4ICYgNzsKLSAgICByZXR1cm4gKChtX3BEYXRhW21dID4+ICg3IC0gbikpICYgMSk7CitDSkJpZzJfSW1hZ2U6On5DSkJpZzJfSW1hZ2UoKSB7CisgIGlmIChtX2JOZWVkRnJlZSAmJiBtX3BEYXRhKSB7CisgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fcERhdGEpOworICB9Cit9CitGWF9CT09MIENKQmlnMl9JbWFnZTo6Z2V0UGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHkpIHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50MzJfdCBtLCBuOworICBpZiAoeCA8IDAgfHwgeCA+PSBtX25XaWR0aCkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICh5IDwgMCB8fCB5ID49IG1fbkhlaWdodCkgeworICAgIHJldHVybiAwOworICB9CisgIG0gPSB5ICogbV9uU3RyaWRlICsgKHggPj4gMyk7CisgIG4gPSB4ICYgNzsKKyAgcmV0dXJuICgobV9wRGF0YVttXSA+PiAoNyAtIG4pKSAmIDEpOwogfQogCi1pbnQzMl90IENKQmlnMl9JbWFnZTo6c2V0UGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0JPT0wgdikKLXsKLSAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludDMyX3QgbSwgbjsKLSAgICBpZih4IDwgMCB8fCB4ID49IG1fbldpZHRoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZih5IDwgMCB8fCB5ID49IG1fbkhlaWdodCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgbSA9IHkgKiBtX25TdHJpZGUgKyAoeCA+PiAzKTsKLSAgICBuID0geCAmIDc7Ci0gICAgaWYodikgewotICAgICAgICBtX3BEYXRhW21dIHw9IDEgPDwgKDcgLSBuKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BEYXRhW21dICY9IH4oMSA8PCAoNyAtIG4pKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7CitpbnQzMl90IENKQmlnMl9JbWFnZTo6c2V0UGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0JPT0wgdikgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQzMl90IG0sIG47CisgIGlmICh4IDwgMCB8fCB4ID49IG1fbldpZHRoKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHkgPCAwIHx8IHkgPj0gbV9uSGVpZ2h0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbSA9IHkgKiBtX25TdHJpZGUgKyAoeCA+PiAzKTsKKyAgbiA9IHggJiA3OworICBpZiAodikgeworICAgIG1fcERhdGFbbV0gfD0gMSA8PCAoNyAtIG4pOworICB9IGVsc2UgeworICAgIG1fcERhdGFbbV0gJj0gfigxIDw8ICg3IC0gbikpOworICB9CisgIHJldHVybiAxOwogfQotdm9pZCBDSkJpZzJfSW1hZ2U6OmNvcHlMaW5lKGludDMyX3QgaFRvLCBpbnQzMl90IGhGcm9tKQotewotICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmKGhGcm9tIDwgMCB8fCBoRnJvbSA+PSBtX25IZWlnaHQpIHsKLSAgICAgICAgSkJJRzJfbWVtc2V0KG1fcERhdGEgKyBoVG8gKiBtX25TdHJpZGUsIDAsIG1fblN0cmlkZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgSkJJRzJfbWVtY3B5KG1fcERhdGEgKyBoVG8gKiBtX25TdHJpZGUsIG1fcERhdGEgKyBoRnJvbSAqIG1fblN0cmlkZSwgbV9uU3RyaWRlKTsKLSAgICB9Cit2b2lkIENKQmlnMl9JbWFnZTo6Y29weUxpbmUoaW50MzJfdCBoVG8sIGludDMyX3QgaEZyb20pIHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChoRnJvbSA8IDAgfHwgaEZyb20gPj0gbV9uSGVpZ2h0KSB7CisgICAgSkJJRzJfbWVtc2V0KG1fcERhdGEgKyBoVG8gKiBtX25TdHJpZGUsIDAsIG1fblN0cmlkZSk7CisgIH0gZWxzZSB7CisgICAgSkJJRzJfbWVtY3B5KG1fcERhdGEgKyBoVG8gKiBtX25TdHJpZGUsIG1fcERhdGEgKyBoRnJvbSAqIG1fblN0cmlkZSwKKyAgICAgICAgICAgICAgICAgbV9uU3RyaWRlKTsKKyAgfQogfQotdm9pZCBDSkJpZzJfSW1hZ2U6OmZpbGwoRlhfQk9PTCB2KQotewotICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEpCSUcyX21lbXNldChtX3BEYXRhLCB2ID8gMHhmZiA6IDAsIG1fblN0cmlkZSAqIG1fbkhlaWdodCk7Cit2b2lkIENKQmlnMl9JbWFnZTo6ZmlsbChGWF9CT09MIHYpIHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuOworICB9CisgIEpCSUcyX21lbXNldChtX3BEYXRhLCB2ID8gMHhmZiA6IDAsIG1fblN0cmlkZSAqIG1fbkhlaWdodCk7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKQotewotICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UqIHBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkNvbXBvc2VPcCBvcCkgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIGNvbXBvc2VUb19vcHQyKHBEc3QsIHgsIHksIG9wKTsKK30KK0ZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG8oQ0pCaWcyX0ltYWdlKiBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoTlVMTCA9PSBwU3JjUmVjdCB8fCAqcFNyY1JlY3QgPT0gRlhfUkVDVCgwLCAwLCBtX25XaWR0aCwgbV9uSGVpZ2h0KSkgewogICAgIHJldHVybiBjb21wb3NlVG9fb3B0MihwRHN0LCB4LCB5LCBvcCk7CisgIH0KKyAgcmV0dXJuIGNvbXBvc2VUb19vcHQyKHBEc3QsIHgsIHksIG9wLCBwU3JjUmVjdCk7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCkKLXsKLSAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoTlVMTCA9PSBwU3JjUmVjdCB8fCAqcFNyY1JlY3QgPT0gRlhfUkVDVCgwLCAwLCBtX25XaWR0aCwgbV9uSGVpZ2h0KSkgewotICAgICAgICByZXR1cm4gY29tcG9zZVRvX29wdDIocERzdCwgeCwgeSwgb3ApOwotICAgIH0KLSAgICByZXR1cm4gY29tcG9zZVRvX29wdDIocERzdCwgeCwgeSwgb3AsIHBTcmNSZWN0KTsKLX0KLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fdW5vcHQoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApCi17Ci0gICAgaW50MzJfdCB3LCBoLCBkeCwgZHk7Ci0gICAgaW50MzJfdCBpLCBqOwotICAgIHcgPSBtX25XaWR0aDsKLSAgICBoID0gbV9uSGVpZ2h0OwotICAgIGR4ID0gZHkgPSAwOwotICAgIGlmKHggPCAwKSB7Ci0gICAgICAgIGR4ICs9IC14OwotICAgICAgICB3ICAtPSAteDsKLSAgICAgICAgeCA9IDA7Ci0gICAgfQotICAgIGlmKHkgPCAwKSB7Ci0gICAgICAgIGR5ICs9IC15OwotICAgICAgICBoICAtPSAteTsKLSAgICAgICAgeSA9IDA7Ci0gICAgfQotICAgIGlmKHggKyB3ID4gcERzdC0+bV9uV2lkdGgpIHsKLSAgICAgICAgdyA9IHBEc3QtPm1fbldpZHRoIC0geDsKLSAgICB9Ci0gICAgaWYoeSArIGggPiBwRHN0LT5tX25IZWlnaHQpIHsKLSAgICAgICAgaCA9IHBEc3QtPm1fbkhlaWdodCAtIHk7Ci0gICAgfQotICAgIHN3aXRjaChvcCkgewotICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCB3OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcERzdC0+c2V0UGl4ZWwoeCArIGksIHkgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0UGl4ZWwoaSArIGR4LCBqICsgZHkpIHwgcERzdC0+Z2V0UGl4ZWwoeCArIGksIHkgKyBqKSkgJiAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IGg7IGorKykgewotICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHc7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBwRHN0LT5zZXRQaXhlbCh4ICsgaSwgeSArIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRQaXhlbChpICsgZHgsIGogKyBkeSkgJiBwRHN0LT5nZXRQaXhlbCh4ICsgaSwgeSArIGopKSAmIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgaDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgdzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEc3QtPnNldFBpeGVsKHggKyBpLCB5ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldFBpeGVsKGkgKyBkeCwgaiArIGR5KSBeIHBEc3QtPmdldFBpeGVsKHggKyBpLCB5ICsgaikpICYgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgaDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgdzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEc3QtPnNldFBpeGVsKHggKyBpLCB5ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKH4oZ2V0UGl4ZWwoaSArIGR4LCBqICsgZHkpIF4gcERzdC0+Z2V0UGl4ZWwoeCArIGksIHkgKyBqKSkpICYgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgaDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgdzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEc3QtPnNldFBpeGVsKHggKyBpLCB5ICsgaiwgZ2V0UGl4ZWwoaSArIGR4LCBqICsgZHkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX3Vub3B0KENKQmlnMl9JbWFnZSogcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wKSB7CisgIGludDMyX3QgdywgaCwgZHgsIGR5OworICBpbnQzMl90IGksIGo7CisgIHcgPSBtX25XaWR0aDsKKyAgaCA9IG1fbkhlaWdodDsKKyAgZHggPSBkeSA9IDA7CisgIGlmICh4IDwgMCkgeworICAgIGR4ICs9IC14OworICAgIHcgLT0gLXg7CisgICAgeCA9IDA7CisgIH0KKyAgaWYgKHkgPCAwKSB7CisgICAgZHkgKz0gLXk7CisgICAgaCAtPSAteTsKKyAgICB5ID0gMDsKKyAgfQorICBpZiAoeCArIHcgPiBwRHN0LT5tX25XaWR0aCkgeworICAgIHcgPSBwRHN0LT5tX25XaWR0aCAtIHg7CisgIH0KKyAgaWYgKHkgKyBoID4gcERzdC0+bV9uSGVpZ2h0KSB7CisgICAgaCA9IHBEc3QtPm1fbkhlaWdodCAtIHk7CisgIH0KKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgIGZvciAoaiA9IDA7IGogPCBoOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICAgIHBEc3QtPnNldFBpeGVsKAorICAgICAgICAgICAgICB4ICsgaSwgeSArIGosCisgICAgICAgICAgICAgIChnZXRQaXhlbChpICsgZHgsIGogKyBkeSkgfCBwRHN0LT5nZXRQaXhlbCh4ICsgaSwgeSArIGopKSAmIDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgZm9yIChqID0gMDsgaiA8IGg7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKSB7CisgICAgICAgICAgcERzdC0+c2V0UGl4ZWwoCisgICAgICAgICAgICAgIHggKyBpLCB5ICsgaiwKKyAgICAgICAgICAgICAgKGdldFBpeGVsKGkgKyBkeCwgaiArIGR5KSAmIHBEc3QtPmdldFBpeGVsKHggKyBpLCB5ICsgaikpICYgMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgICBwRHN0LT5zZXRQaXhlbCgKKyAgICAgICAgICAgICAgeCArIGksIHkgKyBqLAorICAgICAgICAgICAgICAoZ2V0UGl4ZWwoaSArIGR4LCBqICsgZHkpIF4gcERzdC0+Z2V0UGl4ZWwoeCArIGksIHkgKyBqKSkgJiAxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgICBwRHN0LT5zZXRQaXhlbCgKKyAgICAgICAgICAgICAgeCArIGksIHkgKyBqLAorICAgICAgICAgICAgICAofihnZXRQaXhlbChpICsgZHgsIGogKyBkeSkgXiBwRHN0LT5nZXRQaXhlbCh4ICsgaSwgeSArIGopKSkgJiAxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgICBwRHN0LT5zZXRQaXhlbCh4ICsgaSwgeSArIGosIGdldFBpeGVsKGkgKyBkeCwgaiArIGR5KSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX29wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCkKLXsKLSAgICBpbnQzMl90IHgwLCB4MSwgeTAsIHkxLCB4eCwgeXk7Ci0gICAgdWludDhfdCAqcExpbmVTcmMsICpwTGluZURzdCwgKnNyY1B0ciwgKmRlc3RQdHI7Ci0gICAgRlhfRFdPUkQgc3JjMCwgc3JjMSwgc3JjLCBkZXN0LCBzMSwgczIsIG0xLCBtMiwgbTM7Ci0gICAgRlhfQk9PTCBvbmVCeXRlOwotICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICh5IDwgMCkgewotICAgICAgICB5MCA9IC15OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHkwID0gMDsKLSAgICB9Ci0gICAgaWYgKHkgKyBtX25IZWlnaHQgPiBwRHN0LT5tX25IZWlnaHQpIHsKLSAgICAgICAgeTEgPSBwRHN0LT5tX25IZWlnaHQgLSB5OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHkxID0gbV9uSGVpZ2h0OwotICAgIH0KLSAgICBpZiAoeTAgPj0geTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KK0ZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0KENKQmlnMl9JbWFnZSogcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wKSB7CisgIGludDMyX3QgeDAsIHgxLCB5MCwgeTEsIHh4LCB5eTsKKyAgdWludDhfdCAqcExpbmVTcmMsICpwTGluZURzdCwgKnNyY1B0ciwgKmRlc3RQdHI7CisgIEZYX0RXT1JEIHNyYzAsIHNyYzEsIHNyYywgZGVzdCwgczEsIHMyLCBtMSwgbTIsIG0zOworICBGWF9CT09MIG9uZUJ5dGU7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoeSA8IDApIHsKKyAgICB5MCA9IC15OworICB9IGVsc2UgeworICAgIHkwID0gMDsKKyAgfQorICBpZiAoeSArIG1fbkhlaWdodCA+IHBEc3QtPm1fbkhlaWdodCkgeworICAgIHkxID0gcERzdC0+bV9uSGVpZ2h0IC0geTsKKyAgfSBlbHNlIHsKKyAgICB5MSA9IG1fbkhlaWdodDsKKyAgfQorICBpZiAoeTAgPj0geTEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHggPj0gMCkgeworICAgIHgwID0geCAmIH43OworICB9IGVsc2UgeworICAgIHgwID0gMDsKKyAgfQorICB4MSA9IHggKyBtX25XaWR0aDsKKyAgaWYgKHgxID4gcERzdC0+bV9uV2lkdGgpIHsKKyAgICB4MSA9IHBEc3QtPm1fbldpZHRoOworICB9CisgIGlmICh4MCA+PSB4MSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzMSA9IHggJiA3OworICBzMiA9IDggLSBzMTsKKyAgbTEgPSAweGZmID4+ICh4MSAmIDcpOworICBtMiA9IDB4ZmYgPDwgKCgoeDEgJiA3KSA9PSAwKSA/IDAgOiA4IC0gKHgxICYgNykpOworICBtMyA9ICgweGZmID4+IHMxKSAmIG0yOworICBvbmVCeXRlID0geDAgPT0gKCh4MSAtIDEpICYgfjcpOworICBwTGluZURzdCA9IHBEc3QtPm1fcERhdGEgKyB5ICogcERzdC0+bV9uU3RyaWRlOworICBwTGluZVNyYyA9IG1fcERhdGEgKyB5MCAqIG1fblN0cmlkZTsKKyAgaWYgKG9uZUJ5dGUpIHsKICAgICBpZiAoeCA+PSAwKSB7Ci0gICAgICAgIHgwID0geCAmIH43OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHgwID0gMDsKLSAgICB9Ci0gICAgeDEgPSB4ICsgbV9uV2lkdGg7Ci0gICAgaWYgKHgxID4gcERzdC0+bV9uV2lkdGgpIHsKLSAgICAgICAgeDEgPSBwRHN0LT5tX25XaWR0aDsKLSAgICB9Ci0gICAgaWYgKHgwID49IHgxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgczEgPSB4ICYgNzsKLSAgICBzMiA9IDggLSBzMTsKLSAgICBtMSA9IDB4ZmYgPj4gKHgxICYgNyk7Ci0gICAgbTIgPSAweGZmIDw8ICgoKHgxICYgNykgPT0gMCkgPyAwIDogOCAtICh4MSAmIDcpKTsKLSAgICBtMyA9ICgweGZmID4+IHMxKSAmIG0yOwotICAgIG9uZUJ5dGUgPSB4MCA9PSAoKHgxIC0gMSkgJiB+Nyk7Ci0gICAgcExpbmVEc3QgPSBwRHN0LT5tX3BEYXRhICsgeSAqIHBEc3QtPm1fblN0cmlkZTsKLSAgICBwTGluZVNyYyA9IG1fcERhdGEgKyB5MCAqIG1fblN0cmlkZTsKLSAgICBpZihvbmVCeXRlKSB7Ci0gICAgICAgIGlmKHggPj0gMCkgewotICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3QgKyAoeCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCB8PSAoKnNyY1B0ciA+PiBzMSkgJiBtMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0ciA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3QgKyAoeCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCAmPSAoKDB4ZmYwMCB8ICpzcmNQdHIpID4+IHMxKSB8IG0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49ICgqc3JjUHRyID4+IHMxKSAmIG0yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3QgKyAoeCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCBePSAoKCpzcmNQdHIgXiAweGZmKSA+PiBzMSkgJiBtMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0ciA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRTogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0ICsgKHggPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAoZGVzdCAmIH5tMykgfCAoKCpzcmNQdHIgPj4gczEpICYgbTMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCB8PSAqc3JjUHRyICYgbTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmMgKyAoLXggPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgJj0gKnNyY1B0ciB8IG0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjICsgKC14ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49ICpzcmNQdHIgJiBtMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0ciA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmMgKyAoLXggPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgXj0gKCpzcmNQdHIgXiAweGZmKSAmIG0yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICgqc3JjUHRyICYgbTIpIHwgKGRlc3QgJiBtMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZih4ID49IDApIHsKLSAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3QgKyAoeCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IHw9IHNyYzEgPj4gczE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHggPSB4MCArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IHw9IHNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzcmNQdHIgLSBwTGluZVNyYyA8IG1fblN0cmlkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IHw9IHNyYyAmIG0yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0ICsgKHggPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCAmPSAoMHhmZjAwIHwgc3JjMSkgPj4gczE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHggPSB4MCArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ICY9IHNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzcmNQdHIgLSBwTGluZVNyYyA8IG1fblN0cmlkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ICY9IHNyYyB8IG0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0ICsgKHggPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCBePSBzcmMxID4+IHMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyKysgPSAodWludDhfdClkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4ID0geDAgKyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyB4eCA8IHgxIC0gODsgeHggKz0gOCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCBePSBzcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyKysgPSAodWludDhfdClkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3JjUHRyIC0gcExpbmVTcmMgPCBtX25TdHJpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCBePSBzcmMgJiBtMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0ciA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3QgKyAoeCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49IChzcmMxIF4gMHhmZikgPj4gczE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHggPSB4MCArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49IHNyYyBeIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyKysgPSAodWludDhfdClkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3JjUHRyIC0gcExpbmVTcmMgPCBtX25TdHJpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCBePSAoc3JjIF4gMHhmZikgJiBtMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0ciA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRTogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3QgKyAoeCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKGRlc3QgJiAoMHhmZiA8PCBzMikpIHwgKHNyYzEgPj4gczEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyKysgPSAodWludDhfdClkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4ID0geDAgKyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyB4eCA8IHgxIC0gODsgeHggKz0gOCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9IHNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzcmNQdHIgLSBwTGluZVNyYyA8IG1fblN0cmlkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKHNyYyAmIG0yKSB8IChkZXN0ICYgbTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4ID0geDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IHw9IHNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzcmNQdHIgLSBwTGluZVNyYyA8IG1fblN0cmlkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IHw9IHNyYyAmIG0yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjICsgKC14ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHggPSB4MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgeHggPCB4MSAtIDg7IHh4ICs9IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgJj0gc3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKHVpbnQ4X3QpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyY1B0ciAtIHBMaW5lU3JjIDwgbV9uU3RyaWRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgJj0gc3JjIHwgbTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmMgKyAoLXggPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eCA9IHgwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyB4eCA8IHgxIC0gODsgeHggKz0gOCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCBePSBzcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyKysgPSAodWludDhfdClkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3JjUHRyIC0gcExpbmVTcmMgPCBtX25TdHJpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCBePSBzcmMgJiBtMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0ciA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmMgKyAoLXggPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eCA9IHgwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyB4eCA8IHgxIC0gODsgeHggKz0gOCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCBePSBzcmMgXiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKHVpbnQ4X3QpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyY1B0ciAtIHBMaW5lU3JjIDwgbV9uU3RyaWRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgXj0gKHNyYyBeIDB4ZmYpICYgbTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjICsgKC14ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHggPSB4MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgeHggPCB4MSAtIDg7IHh4ICs9IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSBzcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyKysgPSAodWludDhfdClkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3JjUHRyIC0gcExpbmVTcmMgPCBtX25TdHJpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9IChzcmMgJiBtMikgfCAoZGVzdCAmIG0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0ciA9ICh1aW50OF90KWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlRnJvbShpbnQzMl90IHgsIGludDMyX3QgeSwgQ0pCaWcyX0ltYWdlICpwU3JjLCBKQmlnMkNvbXBvc2VPcCBvcCkKLXsKLSAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gcFNyYy0+Y29tcG9zZVRvKHRoaXMsIHgsIHksIG9wKTsKLX0KLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlRnJvbShpbnQzMl90IHgsIGludDMyX3QgeSwgQ0pCaWcyX0ltYWdlICpwU3JjLCBKQmlnMkNvbXBvc2VPcCBvcCwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpCi17Ci0gICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIHBTcmMtPmNvbXBvc2VUbyh0aGlzLCB4LCB5LCBvcCwgcFNyY1JlY3QpOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfSW1hZ2U6OnN1YkltYWdlX3Vub3B0KGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHcsIGludDMyX3QgaCkKLXsKLSAgICBDSkJpZzJfSW1hZ2UgKnBJbWFnZTsKLSAgICBpbnQzMl90IGksIGo7Ci0gICAgSkJJRzJfQUxMT0MocEltYWdlLCBDSkJpZzJfSW1hZ2UodywgaCkpOwotICAgIGZvcihqID0gMDsgaiA8IGg7IGorKykgewotICAgICAgICBmb3IoaSA9IDA7IGkgPCB3OyBpKyspIHsKLSAgICAgICAgICAgIHBJbWFnZS0+c2V0UGl4ZWwoaSwgaiwgZ2V0UGl4ZWwoeCArIGksIHkgKyBqKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBJbWFnZTsKLX0KLSNkZWZpbmUgSkJJRzJfR0VURFdPUkQoYnVmKQkoKEZYX0RXT1JEKSgoKGJ1ZilbMF0gPDwgMjQpIHwgKChidWYpWzFdIDw8IDE2KSB8ICgoYnVmKVsyXSA8PCA4KSB8IChidWYpWzNdKSkKLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0ltYWdlOjpzdWJJbWFnZShpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB3LCBpbnQzMl90IGgpCi17Ci0gICAgQ0pCaWcyX0ltYWdlICpwSW1hZ2U7Ci0gICAgaW50MzJfdCBtLCBuLCBqOwotICAgIHVpbnQ4X3QgKnBMaW5lU3JjLCAqcExpbmVEc3Q7Ci0gICAgRlhfRFdPUkQgd1RtcDsKLSAgICB1aW50OF90ICpwU3JjLCAqcFNyY0VuZCwgKnBEc3QsICpwRHN0RW5kOwotICAgIGlmICh3ID09IDAgfHwgaCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBKQklHMl9BTExPQyhwSW1hZ2UsIENKQmlnMl9JbWFnZSh3LCBoKSk7Ci0gICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHBJbWFnZS0+ZmlsbCgwKTsKLSAgICAgICAgcmV0dXJuIHBJbWFnZTsKLSAgICB9Ci0gICAgaWYgKCFwSW1hZ2UtPm1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIHBJbWFnZTsKLSAgICB9Ci0gICAgcExpbmVTcmMgPSBtX3BEYXRhICsgbV9uU3RyaWRlICogeTsKLSAgICBwTGluZURzdCA9IHBJbWFnZS0+bV9wRGF0YTsKLSAgICBtID0gKHggPj4gNSkgPDwgMjsKLSAgICBuID0geCAmIDMxOwotICAgIGlmKG4gPT0gMCkgewotICAgICAgICBmb3IoaiA9IDA7IGogPCBoOyBqKyspIHsKLSAgICAgICAgICAgIHBTcmMgPSBwTGluZVNyYyArIG07Ci0gICAgICAgICAgICBwU3JjRW5kID0gcExpbmVTcmMgKyBtX25TdHJpZGU7Ci0gICAgICAgICAgICBwRHN0ID0gcExpbmVEc3Q7Ci0gICAgICAgICAgICBwRHN0RW5kID0gcExpbmVEc3QgKyBwSW1hZ2UtPm1fblN0cmlkZTsKLSAgICAgICAgICAgIGZvcig7IHBEc3QgPCBwRHN0RW5kOyBwU3JjICs9IDQsIHBEc3QgKz0gNCkgewotICAgICAgICAgICAgICAgICooKEZYX0RXT1JEICopcERzdCkgPSAqKChGWF9EV09SRCAqKXBTcmMpOwotICAgICAgICAgICAgfQorICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6IHsKKyAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKKyAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOworICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmM7CisgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICBkZXN0IHw9ICgqc3JjUHRyID4+IHMxKSAmIG0yOworICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OworICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwogICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgcExpbmVEc3QgKz0gcEltYWdlLT5tX25TdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IoaiA9IDA7IGogPCBoOyBqKyspIHsKLSAgICAgICAgICAgIHBTcmMgPSBwTGluZVNyYyArIG07Ci0gICAgICAgICAgICBwU3JjRW5kID0gcExpbmVTcmMgKyBtX25TdHJpZGU7Ci0gICAgICAgICAgICBwRHN0ID0gcExpbmVEc3Q7Ci0gICAgICAgICAgICBwRHN0RW5kID0gcExpbmVEc3QgKyBwSW1hZ2UtPm1fblN0cmlkZTsKLSAgICAgICAgICAgIGZvcig7IHBEc3QgPCBwRHN0RW5kOyBwU3JjICs9IDQsIHBEc3QgKz0gNCkgewotICAgICAgICAgICAgICAgIGlmKHBTcmMgKyA0IDwgcFNyY0VuZCkgewotICAgICAgICAgICAgICAgICAgICB3VG1wID0gKEpCSUcyX0dFVERXT1JEKHBTcmMpIDw8IG4pIHwgKEpCSUcyX0dFVERXT1JEKHBTcmMgKyA0KSA+PiAoMzIgLSBuKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd1RtcCA9IEpCSUcyX0dFVERXT1JEKHBTcmMpIDw8IG47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEc3RbMF0gPSAodWludDhfdCkod1RtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgcERzdFsxXSA9ICh1aW50OF90KSh3VG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICBwRHN0WzJdID0gKHVpbnQ4X3QpKHdUbXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgcERzdFszXSA9ICh1aW50OF90KXdUbXA7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOiB7CisgICAgICAgICAgZm9yICh5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7CisgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3QgKyAoeCA+PiAzKTsKKyAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjOworICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOworICAgICAgICAgICAgZGVzdCAmPSAoKDB4ZmYwMCB8ICpzcmNQdHIpID4+IHMxKSB8IG0xOworICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OworICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwogICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgcExpbmVEc3QgKz0gcEltYWdlLT5tX25TdHJpZGU7Ci0gICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6IHsKKyAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKKyAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOworICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmM7CisgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICBkZXN0IF49ICgqc3JjUHRyID4+IHMxKSAmIG0yOworICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OworICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOworICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6IHsKKyAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKKyAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOworICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmM7CisgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICBkZXN0IF49ICgoKnNyY1B0ciBeIDB4ZmYpID4+IHMxKSAmIG0yOworICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OworICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOworICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6IHsKKyAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKKyAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOworICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmM7CisgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICBkZXN0ID0gKGRlc3QgJiB+bTMpIHwgKCgqc3JjUHRyID4+IHMxKSAmIG0zKTsKKyAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOiB7CisgICAgICAgICAgZm9yICh5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7CisgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7CisgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKKyAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgIGRlc3QgfD0gKnNyY1B0ciAmIG0yOworICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OworICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOworICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDogeworICAgICAgICAgIGZvciAoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgeworICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0OworICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmMgKyAoLXggPj4gMyk7CisgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICBkZXN0ICY9ICpzcmNQdHIgfCBtMTsKKyAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6IHsKKyAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKKyAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdDsKKyAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjICsgKC14ID4+IDMpOworICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOworICAgICAgICAgICAgZGVzdCBePSAqc3JjUHRyICYgbTI7CisgICAgICAgICAgICAqZGVzdFB0ciA9ICh1aW50OF90KWRlc3Q7CisgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CisgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjogeworICAgICAgICAgIGZvciAoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgeworICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0OworICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmMgKyAoLXggPj4gMyk7CisgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICBkZXN0IF49ICgqc3JjUHRyIF4gMHhmZikgJiBtMjsKKyAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOiB7CisgICAgICAgICAgZm9yICh5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7CisgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7CisgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKKyAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgIGRlc3QgPSAoKnNyY1B0ciAmIG0yKSB8IChkZXN0ICYgbTEpOworICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OworICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOworICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgIH0KICAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHggPj0gMCkgeworICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6IHsKKyAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKKyAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOworICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmM7CisgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOworICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOworICAgICAgICAgICAgZGVzdCB8PSBzcmMxID4+IHMxOworICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7CisgICAgICAgICAgICB4eCA9IHgwICsgODsKKyAgICAgICAgICAgIGZvciAoOyB4eCA8IHgxIC0gODsgeHggKz0gOCkgeworICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOworICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOworICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKKyAgICAgICAgICAgICAgZGVzdCB8PSBzcmM7CisgICAgICAgICAgICAgICpkZXN0UHRyKysgPSAodWludDhfdClkZXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOworICAgICAgICAgICAgc3JjMCA9IHNyYzE7CisgICAgICAgICAgICBpZiAoc3JjUHRyIC0gcExpbmVTcmMgPCBtX25TdHJpZGUpIHsKKyAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHNyYzEgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7CisgICAgICAgICAgICBkZXN0IHw9IHNyYyAmIG0yOworICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OworICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOworICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDogeworICAgICAgICAgIGZvciAoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgeworICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0ICsgKHggPj4gMyk7CisgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYzsKKyAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICBkZXN0ICY9ICgweGZmMDAgfCBzcmMxKSA+PiBzMTsKKyAgICAgICAgICAgICpkZXN0UHRyKysgPSAodWludDhfdClkZXN0OworICAgICAgICAgICAgeHggPSB4MCArIDg7CisgICAgICAgICAgICBmb3IgKDsgeHggPCB4MSAtIDg7IHh4ICs9IDgpIHsKKyAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOworICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKKyAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKKyAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7CisgICAgICAgICAgICAgIGRlc3QgJj0gc3JjOworICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgIHNyYzAgPSBzcmMxOworICAgICAgICAgICAgaWYgKHNyY1B0ciAtIHBMaW5lU3JjIDwgbV9uU3RyaWRlKSB7CisgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzcmMxID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOworICAgICAgICAgICAgZGVzdCAmPSBzcmMgfCBtMTsKKyAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6IHsKKyAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKKyAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOworICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmM7CisgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOworICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOworICAgICAgICAgICAgZGVzdCBePSBzcmMxID4+IHMxOworICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7CisgICAgICAgICAgICB4eCA9IHgwICsgODsKKyAgICAgICAgICAgIGZvciAoOyB4eCA8IHgxIC0gODsgeHggKz0gOCkgeworICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOworICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOworICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKKyAgICAgICAgICAgICAgZGVzdCBePSBzcmM7CisgICAgICAgICAgICAgICpkZXN0UHRyKysgPSAodWludDhfdClkZXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOworICAgICAgICAgICAgc3JjMCA9IHNyYzE7CisgICAgICAgICAgICBpZiAoc3JjUHRyIC0gcExpbmVTcmMgPCBtX25TdHJpZGUpIHsKKyAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHNyYzEgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7CisgICAgICAgICAgICBkZXN0IF49IHNyYyAmIG0yOworICAgICAgICAgICAgKmRlc3RQdHIgPSAodWludDhfdClkZXN0OworICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOworICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6IHsKKyAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKKyAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOworICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmM7CisgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOworICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOworICAgICAgICAgICAgZGVzdCBePSAoc3JjMSBeIDB4ZmYpID4+IHMxOworICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7CisgICAgICAgICAgICB4eCA9IHgwICsgODsKKyAgICAgICAgICAgIGZvciAoOyB4eCA8IHgxIC0gODsgeHggKz0gOCkgeworICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOworICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOworICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKKyAgICAgICAgICAgICAgZGVzdCBePSBzcmMgXiAweGZmOworICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgIHNyYzAgPSBzcmMxOworICAgICAgICAgICAgaWYgKHNyY1B0ciAtIHBMaW5lU3JjIDwgbV9uU3RyaWRlKSB7CisgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzcmMxID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOworICAgICAgICAgICAgZGVzdCBePSAoc3JjIF4gMHhmZikgJiBtMjsKKyAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOiB7CisgICAgICAgICAgZm9yICh5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7CisgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3QgKyAoeCA+PiAzKTsKKyAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjOworICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKKyAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgIGRlc3QgPSAoZGVzdCAmICgweGZmIDw8IHMyKSkgfCAoc3JjMSA+PiBzMSk7CisgICAgICAgICAgICAqZGVzdFB0cisrID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIHh4ID0geDAgKyA4OworICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7CisgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7CisgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOworICAgICAgICAgICAgICBkZXN0ID0gc3JjOworICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgIHNyYzAgPSBzcmMxOworICAgICAgICAgICAgaWYgKHNyY1B0ciAtIHBMaW5lU3JjIDwgbV9uU3RyaWRlKSB7CisgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzcmMxID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOworICAgICAgICAgICAgZGVzdCA9IChzcmMgJiBtMikgfCAoZGVzdCAmIG0xKTsKKyAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOiB7CisgICAgICAgICAgZm9yICh5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7CisgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7CisgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKKyAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICB4eCA9IHgwOworICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7CisgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7CisgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOworICAgICAgICAgICAgICBkZXN0IHw9IHNyYzsKKyAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICBzcmMwID0gc3JjMTsKKyAgICAgICAgICAgIGlmIChzcmNQdHIgLSBwTGluZVNyYyA8IG1fblN0cmlkZSkgeworICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3JjMSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKKyAgICAgICAgICAgIGRlc3QgfD0gc3JjICYgbTI7CisgICAgICAgICAgICAqZGVzdFB0ciA9ICh1aW50OF90KWRlc3Q7CisgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CisgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOiB7CisgICAgICAgICAgZm9yICh5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7CisgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7CisgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKKyAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICB4eCA9IHgwOworICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7CisgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7CisgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOworICAgICAgICAgICAgICBkZXN0ICY9IHNyYzsKKyAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICBzcmMwID0gc3JjMTsKKyAgICAgICAgICAgIGlmIChzcmNQdHIgLSBwTGluZVNyYyA8IG1fblN0cmlkZSkgeworICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3JjMSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKKyAgICAgICAgICAgIGRlc3QgJj0gc3JjIHwgbTE7CisgICAgICAgICAgICAqZGVzdFB0ciA9ICh1aW50OF90KWRlc3Q7CisgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CisgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOiB7CisgICAgICAgICAgZm9yICh5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7CisgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7CisgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKKyAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICB4eCA9IHgwOworICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7CisgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7CisgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOworICAgICAgICAgICAgICBkZXN0IF49IHNyYzsKKyAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9ICh1aW50OF90KWRlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICBzcmMwID0gc3JjMTsKKyAgICAgICAgICAgIGlmIChzcmNQdHIgLSBwTGluZVNyYyA8IG1fblN0cmlkZSkgeworICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3JjMSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKKyAgICAgICAgICAgIGRlc3QgXj0gc3JjICYgbTI7CisgICAgICAgICAgICAqZGVzdFB0ciA9ICh1aW50OF90KWRlc3Q7CisgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CisgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjogeworICAgICAgICAgIGZvciAoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgeworICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0OworICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmMgKyAoLXggPj4gMyk7CisgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOworICAgICAgICAgICAgeHggPSB4MDsKKyAgICAgICAgICAgIGZvciAoOyB4eCA8IHgxIC0gODsgeHggKz0gOCkgeworICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7CisgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOworICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOworICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKKyAgICAgICAgICAgICAgZGVzdCBePSBzcmMgXiAweGZmOworICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgIHNyYzAgPSBzcmMxOworICAgICAgICAgICAgaWYgKHNyY1B0ciAtIHBMaW5lU3JjIDwgbV9uU3RyaWRlKSB7CisgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzcmMxID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOworICAgICAgICAgICAgZGVzdCBePSAoc3JjIF4gMHhmZikgJiBtMjsKKyAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOiB7CisgICAgICAgICAgZm9yICh5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7CisgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7CisgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKKyAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICB4eCA9IHgwOworICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7CisgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7CisgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOworICAgICAgICAgICAgICBkZXN0ID0gc3JjOworICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKKyAgICAgICAgICAgIHNyYzAgPSBzcmMxOworICAgICAgICAgICAgaWYgKHNyY1B0ciAtIHBMaW5lU3JjIDwgbV9uU3RyaWRlKSB7CisgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzcmMxID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOworICAgICAgICAgICAgZGVzdCA9IChzcmMgJiBtMikgfCAoZGVzdCAmIG0xKTsKKyAgICAgICAgICAgICpkZXN0UHRyID0gKHVpbnQ4X3QpZGVzdDsKKyAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VGcm9tKGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX0ltYWdlKiBwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wKSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gcFNyYy0+Y29tcG9zZVRvKHRoaXMsIHgsIHksIG9wKTsKK30KK0ZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlRnJvbShpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9JbWFnZSogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkNvbXBvc2VPcCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCkgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIHBTcmMtPmNvbXBvc2VUbyh0aGlzLCB4LCB5LCBvcCwgcFNyY1JlY3QpOworfQorQ0pCaWcyX0ltYWdlKiBDSkJpZzJfSW1hZ2U6OnN1YkltYWdlX3Vub3B0KGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaCkgeworICBDSkJpZzJfSW1hZ2UqIHBJbWFnZTsKKyAgaW50MzJfdCBpLCBqOworICBKQklHMl9BTExPQyhwSW1hZ2UsIENKQmlnMl9JbWFnZSh3LCBoKSk7CisgIGZvciAoaiA9IDA7IGogPCBoOyBqKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKSB7CisgICAgICBwSW1hZ2UtPnNldFBpeGVsKGksIGosIGdldFBpeGVsKHggKyBpLCB5ICsgaikpOworICAgIH0KKyAgfQorICByZXR1cm4gcEltYWdlOworfQorI2RlZmluZSBKQklHMl9HRVREV09SRChidWYpIFwKKyAgKChGWF9EV09SRCkoKChidWYpWzBdIDw8IDI0KSB8ICgoYnVmKVsxXSA8PCAxNikgfCAoKGJ1ZilbMl0gPDwgOCkgfCAoYnVmKVszXSkpCitDSkJpZzJfSW1hZ2UqIENKQmlnMl9JbWFnZTo6c3ViSW1hZ2UoaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoKSB7CisgIENKQmlnMl9JbWFnZSogcEltYWdlOworICBpbnQzMl90IG0sIG4sIGo7CisgIHVpbnQ4X3QgKnBMaW5lU3JjLCAqcExpbmVEc3Q7CisgIEZYX0RXT1JEIHdUbXA7CisgIHVpbnQ4X3QgKnBTcmMsICpwU3JjRW5kLCAqcERzdCwgKnBEc3RFbmQ7CisgIGlmICh3ID09IDAgfHwgaCA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgSkJJRzJfQUxMT0MocEltYWdlLCBDSkJpZzJfSW1hZ2UodywgaCkpOworICBpZiAoIW1fcERhdGEpIHsKKyAgICBwSW1hZ2UtPmZpbGwoMCk7CiAgICAgcmV0dXJuIHBJbWFnZTsKKyAgfQorICBpZiAoIXBJbWFnZS0+bV9wRGF0YSkgeworICAgIHJldHVybiBwSW1hZ2U7CisgIH0KKyAgcExpbmVTcmMgPSBtX3BEYXRhICsgbV9uU3RyaWRlICogeTsKKyAgcExpbmVEc3QgPSBwSW1hZ2UtPm1fcERhdGE7CisgIG0gPSAoeCA+PiA1KSA8PCAyOworICBuID0geCAmIDMxOworICBpZiAobiA9PSAwKSB7CisgICAgZm9yIChqID0gMDsgaiA8IGg7IGorKykgeworICAgICAgcFNyYyA9IHBMaW5lU3JjICsgbTsKKyAgICAgIHBTcmNFbmQgPSBwTGluZVNyYyArIG1fblN0cmlkZTsKKyAgICAgIHBEc3QgPSBwTGluZURzdDsKKyAgICAgIHBEc3RFbmQgPSBwTGluZURzdCArIHBJbWFnZS0+bV9uU3RyaWRlOworICAgICAgZm9yICg7IHBEc3QgPCBwRHN0RW5kOyBwU3JjICs9IDQsIHBEc3QgKz0gNCkgeworICAgICAgICAqKChGWF9EV09SRCopcERzdCkgPSAqKChGWF9EV09SRCopcFNyYyk7CisgICAgICB9CisgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICBwTGluZURzdCArPSBwSW1hZ2UtPm1fblN0cmlkZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChqID0gMDsgaiA8IGg7IGorKykgeworICAgICAgcFNyYyA9IHBMaW5lU3JjICsgbTsKKyAgICAgIHBTcmNFbmQgPSBwTGluZVNyYyArIG1fblN0cmlkZTsKKyAgICAgIHBEc3QgPSBwTGluZURzdDsKKyAgICAgIHBEc3RFbmQgPSBwTGluZURzdCArIHBJbWFnZS0+bV9uU3RyaWRlOworICAgICAgZm9yICg7IHBEc3QgPCBwRHN0RW5kOyBwU3JjICs9IDQsIHBEc3QgKz0gNCkgeworICAgICAgICBpZiAocFNyYyArIDQgPCBwU3JjRW5kKSB7CisgICAgICAgICAgd1RtcCA9IChKQklHMl9HRVREV09SRChwU3JjKSA8PCBuKSB8CisgICAgICAgICAgICAgICAgIChKQklHMl9HRVREV09SRChwU3JjICsgNCkgPj4gKDMyIC0gbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdUbXAgPSBKQklHMl9HRVREV09SRChwU3JjKSA8PCBuOworICAgICAgICB9CisgICAgICAgIHBEc3RbMF0gPSAodWludDhfdCkod1RtcCA+PiAyNCk7CisgICAgICAgIHBEc3RbMV0gPSAodWludDhfdCkod1RtcCA+PiAxNik7CisgICAgICAgIHBEc3RbMl0gPSAodWludDhfdCkod1RtcCA+PiA4KTsKKyAgICAgICAgcERzdFszXSA9ICh1aW50OF90KXdUbXA7CisgICAgICB9CisgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICBwTGluZURzdCArPSBwSW1hZ2UtPm1fblN0cmlkZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBJbWFnZTsKIH0KLXZvaWQgQ0pCaWcyX0ltYWdlOjpleHBhbmQoaW50MzJfdCBoLCBGWF9CT09MIHYpCi17Ci0gICAgaWYgKCFtX3BEYXRhIHx8IGggPD0gbV9uSGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfRFdPUkQgZHdIID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KGgpOwotICAgIEZYX0RXT1JEIGR3U3RyaWRlID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KG1fblN0cmlkZSk7Ci0gICAgRlhfRFdPUkQgZHdIZWlnaHQgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRD4obV9uSGVpZ2h0KTsKLSAgICBGWF9TQUZFX0RXT1JEIHNhZmVNZW1TaXplID0gZHdIOyAKLSAgICBzYWZlTWVtU2l6ZSAqPSBkd1N0cmlkZTsKLSAgICBpZiAoIXNhZmVNZW1TaXplLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vVGhlIGd1YXJhbnRlZWQgcmVhbGxvY2F0ZWQgbWVtb3J5IGlzIHRvIGJlIDwgNEdCICh1bnNpZ25lZCBpbnQpLiAKLSAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKW1fcE1vZHVsZS0+SkJpZzJfUmVhbGxvYyhtX3BEYXRhLCBzYWZlTWVtU2l6ZS5WYWx1ZU9yRGllKCkpOwotICAgIC8vVGhlIHJlc3VsdCBvZiBkd0hlaWdodCAqIGR3U3RyaWRlIGRvZXNuJ3Qgb3ZlcmZsb3cgYWZ0ZXIgdGhlIAotICAgIC8vY2hlY2tpbmcgb2Ygc2FmZU1lbVNpemUuCi0gICAgLy9UaGUgc2FtZSBhcyB0aGUgcmVzdWx0IG9mIChkd0ggLSBkd0hlaWdodCkgKiBkd1N0cmlkZSkgYmVjYXVzZQotICAgIC8vZHdIIC0gZHdIZWlnaHQgaXMgYWx3YXlzIGxlc3MgdGhhbiBkd0goaCkgd2hpY2ggaXMgY2hlY2tlZCBpbgotICAgIC8vdGhlIGNhbGN1bGF0aW9uIG9mIGR3SCAqIGR3U3RyaWRlLiAKLSAgICBKQklHMl9tZW1zZXQobV9wRGF0YSArIGR3SGVpZ2h0ICogZHdTdHJpZGUsIHYgPyAweGZmIDogMCwgKGR3SCAtIGR3SGVpZ2h0KSAqIGR3U3RyaWRlKTsKLSAgICBtX25IZWlnaHQgPSBoOwordm9pZCBDSkJpZzJfSW1hZ2U6OmV4cGFuZChpbnQzMl90IGgsIEZYX0JPT0wgdikgeworICBpZiAoIW1fcERhdGEgfHwgaCA8PSBtX25IZWlnaHQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRFdPUkQgZHdIID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KGgpOworICBGWF9EV09SRCBkd1N0cmlkZSA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPihtX25TdHJpZGUpOworICBGWF9EV09SRCBkd0hlaWdodCA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPihtX25IZWlnaHQpOworICBGWF9TQUZFX0RXT1JEIHNhZmVNZW1TaXplID0gZHdIOworICBzYWZlTWVtU2l6ZSAqPSBkd1N0cmlkZTsKKyAgaWYgKCFzYWZlTWVtU2l6ZS5Jc1ZhbGlkKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gVGhlIGd1YXJhbnRlZWQgcmVhbGxvY2F0ZWQgbWVtb3J5IGlzIHRvIGJlIDwgNEdCICh1bnNpZ25lZCBpbnQpLgorICBtX3BEYXRhID0KKyAgICAgICh1aW50OF90KiltX3BNb2R1bGUtPkpCaWcyX1JlYWxsb2MobV9wRGF0YSwgc2FmZU1lbVNpemUuVmFsdWVPckRpZSgpKTsKKyAgLy8gVGhlIHJlc3VsdCBvZiBkd0hlaWdodCAqIGR3U3RyaWRlIGRvZXNuJ3Qgb3ZlcmZsb3cgYWZ0ZXIgdGhlCisgIC8vIGNoZWNraW5nIG9mIHNhZmVNZW1TaXplLgorICAvLyBUaGUgc2FtZSBhcyB0aGUgcmVzdWx0IG9mIChkd0ggLSBkd0hlaWdodCkgKiBkd1N0cmlkZSkgYmVjYXVzZQorICAvLyBkd0ggLSBkd0hlaWdodCBpcyBhbHdheXMgbGVzcyB0aGFuIGR3SChoKSB3aGljaCBpcyBjaGVja2VkIGluCisgIC8vIHRoZSBjYWxjdWxhdGlvbiBvZiBkd0ggKiBkd1N0cmlkZS4KKyAgSkJJRzJfbWVtc2V0KG1fcERhdGEgKyBkd0hlaWdodCAqIGR3U3RyaWRlLCB2ID8gMHhmZiA6IDAsCisgICAgICAgICAgICAgICAoZHdIIC0gZHdIZWlnaHQpICogZHdTdHJpZGUpOworICBtX25IZWlnaHQgPSBoOwogfQotRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUb19vcHQyKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKQotewotICAgIGludDMyX3QgeHMwID0gMCwgeXMwICA9IDAsIHhzMSAgPSAwLCB5czEgICA9IDAsIHhkMCAgICA9IDAsIHlkMCAgICAgICAgICA9IDAsIHhkMSAgICAgID0gMCwgCi0gICAgICAgICAgICAgeWQxID0gMCwgeHggICA9IDAsIHl5ICAgPSAwLCB3ICAgICA9IDAsIGggICAgICA9IDAsIG1pZGRsZUR3b3JkcyA9IDAsIGxpbmVMZWZ0ID0gMDsKK0ZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UqIHBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkNvbXBvc2VPcCBvcCkgeworICBpbnQzMl90IHhzMCA9IDAsIHlzMCA9IDAsIHhzMSA9IDAsIHlzMSA9IDAsIHhkMCA9IDAsIHlkMCA9IDAsIHhkMSA9IDAsCisgICAgICAgICAgeWQxID0gMCwgeHggPSAwLCB5eSA9IDAsIHcgPSAwLCBoID0gMCwgbWlkZGxlRHdvcmRzID0gMCwgbGluZUxlZnQgPSAwOwogCi0gICAgRlhfRFdPUkQgczEgID0gMCwgZDEgICA9IDAsIGQyICAgPSAwLCBzaGlmdCA9IDAsIHNoaWZ0MSA9IDAsIHNoaWZ0MiAgICAgICA9IDAsIAotICAgICAgICAgICAgIHRtcCA9IDAsIHRtcDEgPSAwLCB0bXAyID0gMCwgbWFza0wgPSAwLCBtYXNrUiAgPSAwLCBtYXNrTSAgICAgICAgPSAwOworICBGWF9EV09SRCBzMSA9IDAsIGQxID0gMCwgZDIgPSAwLCBzaGlmdCA9IDAsIHNoaWZ0MSA9IDAsIHNoaWZ0MiA9IDAsIHRtcCA9IDAsCisgICAgICAgICAgIHRtcDEgPSAwLCB0bXAyID0gMCwgbWFza0wgPSAwLCBtYXNrUiA9IDAsIG1hc2tNID0gMDsKIAotICAgIHVpbnQ4X3QgKmxpbmVTcmMgPSBOVUxMLCAqbGluZURzdCA9IE5VTEwsICpzcCA9IE5VTEwsICpkcCA9IE5VTEw7CisgIHVpbnQ4X3QgKmxpbmVTcmMgPSBOVUxMLCAqbGluZURzdCA9IE5VTEwsICpzcCA9IE5VTEwsICpkcCA9IE5VTEw7CiAKLSAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoeCA8IC0xMDQ4NTc2IHx8IHggPiAxMDQ4NTc2IHx8IHkgPCAtMTA0ODU3NiB8fCB5ID4gMTA0ODU3NikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmKHkgPCAwKSB7Ci0gICAgICAgIHlzMCA9IC15OwotICAgIH0KLSAgICBpZih5ICsgbV9uSGVpZ2h0ID4gcERzdC0+bV9uSGVpZ2h0KSB7Ci0gICAgICAgIHlzMSA9IHBEc3QtPm1fbkhlaWdodCAtIHk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeXMxID0gbV9uSGVpZ2h0OwotICAgIH0KLSAgICBpZih4IDwgMCkgewotICAgICAgICB4czAgPSAteDsKLSAgICB9Ci0gICAgaWYoeCArIG1fbldpZHRoID4gcERzdC0+bV9uV2lkdGgpIHsKLSAgICAgICAgeHMxID0gcERzdC0+bV9uV2lkdGggLSB4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHhzMSA9IG1fbldpZHRoOwotICAgIH0KLSAgICBpZigoeXMwID49IHlzMSkgfHwgKHhzMCA+PSB4czEpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB3ID0geHMxIC0geHMwOwotICAgIGggPSB5czEgLSB5czA7Ci0gICAgaWYoeSA+PSAwKSB7Ci0gICAgICAgIHlkMCA9IHk7Ci0gICAgfSAKLSAgICBpZih4ID49IDApIHsKLSAgICAgICAgeGQwID0geDsKLSAgICB9Ci0gICAgeGQxID0geGQwICsgdzsKLSAgICB5ZDEgPSB5ZDAgKyBoOwotICAgIGQxID0geGQwICYgMzE7Ci0gICAgZDIgPSB4ZDEgJiAzMTsKLSAgICBzMSA9IHhzMCAmIDMxOwotICAgIG1hc2tMID0gMHhmZmZmZmZmZiA+PiBkMTsKLSAgICBtYXNrUiA9IDB4ZmZmZmZmZmYgPDwgKCgzMiAtICh4ZDEgJiAzMSkpICUgMzIpOwotICAgIG1hc2tNID0gbWFza0wgJiBtYXNrUjsKLSAgICBsaW5lU3JjID0gbV9wRGF0YSArIHlzMCAqIG1fblN0cmlkZSArICgoeHMwID4+IDUpIDw8IDIpOwotICAgIGxpbmVMZWZ0ID0gbV9uU3RyaWRlIC0gKCh4czAgPj4gNSkgPDwgMik7Ci0gICAgbGluZURzdCA9IHBEc3QtPm1fcERhdGEgKyB5ZDAgKiBwRHN0LT5tX25TdHJpZGUgKyAoKHhkMCA+PiA1KSA8PCAyKTsKLSAgICBpZigoeGQwICYgfjMxKSA9PSAoKHhkMSAtIDEpICYgfjMxKSkgewotICAgICAgICBpZigoeHMwICYgfjMxKSA9PSAoKHhzMSAtIDEpICYgfjMxKSkgewotICAgICAgICAgICAgaWYoczEgPiBkMSkgewotICAgICAgICAgICAgICAgIHNoaWZ0ID0gczEgLSBkMTsKLSAgICAgICAgICAgICAgICBmb3IoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChsaW5lU3JjKSA8PCBzaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGxpbmVEc3QpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAodG1wMSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgbGluZURzdFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbM10gPSAodWludDhfdCl0bXA7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNoaWZ0ID0gZDEgLSBzMTsKLSAgICAgICAgICAgICAgICBmb3IoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChsaW5lU3JjKSA+PiBzaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGxpbmVEc3QpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAodG1wMSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgbGluZURzdFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbM10gPSAodWludDhfdCl0bXA7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaGlmdDEgPSBzMSAtIGQxOwotICAgICAgICAgICAgc2hpZnQyID0gMzIgLSBzaGlmdDE7Ci0gICAgICAgICAgICBmb3IoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7Ci0gICAgICAgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChsaW5lU3JjKSA8PCBzaGlmdDEpIHwgKEpCSUcyX0dFVERXT1JEKGxpbmVTcmMgKyA0KSA+PiBzaGlmdDIpOwotICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKLSAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKHRtcDEgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZURzdFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgIGxpbmVEc3RbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICBsaW5lRHN0WzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICBsaW5lRHN0WzNdID0gKHVpbnQ4X3QpdG1wOwotICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgfQorICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHggPCAtMTA0ODU3NiB8fCB4ID4gMTA0ODU3NiB8fCB5IDwgLTEwNDg1NzYgfHwgeSA+IDEwNDg1NzYpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHkgPCAwKSB7CisgICAgeXMwID0gLXk7CisgIH0KKyAgaWYgKHkgKyBtX25IZWlnaHQgPiBwRHN0LT5tX25IZWlnaHQpIHsKKyAgICB5czEgPSBwRHN0LT5tX25IZWlnaHQgLSB5OworICB9IGVsc2UgeworICAgIHlzMSA9IG1fbkhlaWdodDsKKyAgfQorICBpZiAoeCA8IDApIHsKKyAgICB4czAgPSAteDsKKyAgfQorICBpZiAoeCArIG1fbldpZHRoID4gcERzdC0+bV9uV2lkdGgpIHsKKyAgICB4czEgPSBwRHN0LT5tX25XaWR0aCAtIHg7CisgIH0gZWxzZSB7CisgICAgeHMxID0gbV9uV2lkdGg7CisgIH0KKyAgaWYgKCh5czAgPj0geXMxKSB8fCAoeHMwID49IHhzMSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICB3ID0geHMxIC0geHMwOworICBoID0geXMxIC0geXMwOworICBpZiAoeSA+PSAwKSB7CisgICAgeWQwID0geTsKKyAgfQorICBpZiAoeCA+PSAwKSB7CisgICAgeGQwID0geDsKKyAgfQorICB4ZDEgPSB4ZDAgKyB3OworICB5ZDEgPSB5ZDAgKyBoOworICBkMSA9IHhkMCAmIDMxOworICBkMiA9IHhkMSAmIDMxOworICBzMSA9IHhzMCAmIDMxOworICBtYXNrTCA9IDB4ZmZmZmZmZmYgPj4gZDE7CisgIG1hc2tSID0gMHhmZmZmZmZmZiA8PCAoKDMyIC0gKHhkMSAmIDMxKSkgJSAzMik7CisgIG1hc2tNID0gbWFza0wgJiBtYXNrUjsKKyAgbGluZVNyYyA9IG1fcERhdGEgKyB5czAgKiBtX25TdHJpZGUgKyAoKHhzMCA+PiA1KSA8PCAyKTsKKyAgbGluZUxlZnQgPSBtX25TdHJpZGUgLSAoKHhzMCA+PiA1KSA8PCAyKTsKKyAgbGluZURzdCA9IHBEc3QtPm1fcERhdGEgKyB5ZDAgKiBwRHN0LT5tX25TdHJpZGUgKyAoKHhkMCA+PiA1KSA8PCAyKTsKKyAgaWYgKCh4ZDAgJiB+MzEpID09ICgoeGQxIC0gMSkgJiB+MzEpKSB7CisgICAgaWYgKCh4czAgJiB+MzEpID09ICgoeHMxIC0gMSkgJiB+MzEpKSB7CisgICAgICBpZiAoczEgPiBkMSkgeworICAgICAgICBzaGlmdCA9IHMxIC0gZDE7CisgICAgICAgIGZvciAoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CisgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKGxpbmVTcmMpIDw8IHNoaWZ0OworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKHRtcDEgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBsaW5lRHN0WzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgbGluZURzdFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGxpbmVEc3RbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGxpbmVEc3RbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgICAgbGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZihzMSA+IGQxKSB7Ci0gICAgICAgICAgICBzaGlmdDEgPSBzMSAtIGQxOwotICAgICAgICAgICAgc2hpZnQyID0gMzIgLSBzaGlmdDE7Ci0gICAgICAgICAgICBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7Ci0gICAgICAgICAgICBmb3IoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7Ci0gICAgICAgICAgICAgICAgc3AgPSBsaW5lU3JjOwotICAgICAgICAgICAgICAgIGRwID0gbGluZURzdDsKLSAgICAgICAgICAgICAgICBpZihkMSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MSkgfCAoSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA+PiBzaGlmdDIpOwotICAgICAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAodG1wMSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOwotICAgICAgICAgICAgICAgICAgICBzcCArPSA0OwotICAgICAgICAgICAgICAgICAgICBkcCArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IoeHggPSAwOyB4eCA8IG1pZGRsZUR3b3JkczsgeHgrKykgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDEpIHwgKEpCSUcyX0dFVERXT1JEKHNwICsgNCkgPj4gc2hpZnQyKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSB8IHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgJiB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxIF4gdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IH4odG1wMSBeIHRtcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOwotICAgICAgICAgICAgICAgICAgICBzcCArPSA0OwotICAgICAgICAgICAgICAgICAgICBkcCArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihkMiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MSkgfCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcCArIDQpIDwgbGluZVNyYyArIGxpbmVMZWZ0ID8gSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA6IDApID4+IHNoaWZ0Mik7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICh0bXAxICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYoczEgPT0gZDEpIHsKLSAgICAgICAgICAgIG1pZGRsZUR3b3JkcyA9ICh4ZDEgPj4gNSkgLSAoKHhkMCArIDMxKSA+PiA1KTsKLSAgICAgICAgICAgIGZvcih5eSA9IHlkMDsgeXkgPCB5ZDE7IHl5KyspIHsKLSAgICAgICAgICAgICAgICBzcCA9IGxpbmVTcmM7Ci0gICAgICAgICAgICAgICAgZHAgPSBsaW5lRHN0OwotICAgICAgICAgICAgICAgIGlmKGQxICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKHRtcDEgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKLSAgICAgICAgICAgICAgICAgICAgc3AgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgZHAgKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yKHh4ID0gMDsgeHggPCBtaWRkbGVEd29yZHM7IHh4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSB8IHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgJiB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxIF4gdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IH4odG1wMSBeIHRtcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOwotICAgICAgICAgICAgICAgICAgICBzcCArPSA0OwotICAgICAgICAgICAgICAgICAgICBkcCArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihkMiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICh0bXAxICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hpZnQxID0gZDEgLSBzMTsKLSAgICAgICAgICAgIHNoaWZ0MiA9IDMyIC0gc2hpZnQxOwotICAgICAgICAgICAgbWlkZGxlRHdvcmRzID0gKHhkMSA+PiA1KSAtICgoeGQwICsgMzEpID4+IDUpOwotICAgICAgICAgICAgZm9yKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgICAgICAgIHNwID0gbGluZVNyYzsKLSAgICAgICAgICAgICAgICBkcCA9IGxpbmVEc3Q7Ci0gICAgICAgICAgICAgICAgaWYoZDEgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApID4+IHNoaWZ0MTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKHRtcDEgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKLSAgICAgICAgICAgICAgICAgICAgZHAgKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yKHh4ID0gMDsgeHggPCBtaWRkbGVEd29yZHM7IHh4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQyKSB8ICgoSkJJRzJfR0VURFdPUkQoc3AgKyA0KSkgPj4gc2hpZnQxKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSB8IHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgJiB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxIF4gdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IH4odG1wMSBeIHRtcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOwotICAgICAgICAgICAgICAgICAgICBzcCArPSA0OwotICAgICAgICAgICAgICAgICAgICBkcCArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihkMiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MikgfCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcCArIDQpIDwgbGluZVNyYyArIGxpbmVMZWZ0ID8gSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA6IDApID4+IHNoaWZ0MSk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICh0bXAxICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2hpZnQgPSBkMSAtIHMxOworICAgICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChsaW5lU3JjKSA+PiBzaGlmdDsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQobGluZURzdCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICh0bXAxICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgbGluZURzdFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGxpbmVEc3RbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBsaW5lRHN0WzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBsaW5lRHN0WzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwogICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNoaWZ0MSA9IHMxIC0gZDE7CisgICAgICBzaGlmdDIgPSAzMiAtIHNoaWZ0MTsKKyAgICAgIGZvciAoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CisgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQobGluZVNyYykgPDwgc2hpZnQxKSB8CisgICAgICAgICAgICAgICAoSkJJRzJfR0VURFdPUkQobGluZVNyYyArIDQpID4+IHNoaWZ0Mik7CisgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKHRtcDEgJiBtYXNrTSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBsaW5lRHN0WzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgIGxpbmVEc3RbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgbGluZURzdFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgIGxpbmVEc3RbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgaWYgKHMxID4gZDEpIHsKKyAgICAgIHNoaWZ0MSA9IHMxIC0gZDE7CisgICAgICBzaGlmdDIgPSAzMiAtIHNoaWZ0MTsKKyAgICAgIG1pZGRsZUR3b3JkcyA9ICh4ZDEgPj4gNSkgLSAoKHhkMCArIDMxKSA+PiA1KTsKKyAgICAgIGZvciAoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CisgICAgICAgIHNwID0gbGluZVNyYzsKKyAgICAgICAgZHAgPSBsaW5lRHN0OworICAgICAgICBpZiAoZDEgIT0gMCkgeworICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MSkgfAorICAgICAgICAgICAgICAgICAoSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA+PiBzaGlmdDIpOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICh0bXAxICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBzcCArPSA0OworICAgICAgICAgIGRwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh4eCA9IDA7IHh4IDwgbWlkZGxlRHdvcmRzOyB4eCsrKSB7CisgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQxKSB8CisgICAgICAgICAgICAgICAgIChKQklHMl9HRVREV09SRChzcCArIDQpID4+IHNoaWZ0Mik7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgfCB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgJiB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgXiB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSB+KHRtcDEgXiB0bXAyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gdG1wMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgICAgc3AgKz0gNDsKKyAgICAgICAgICBkcCArPSA0OworICAgICAgICB9CisgICAgICAgIGlmIChkMiAhPSAwKSB7CisgICAgICAgICAgdG1wMSA9CisgICAgICAgICAgICAgIChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQxKSB8CisgICAgICAgICAgICAgICgoKHNwICsgNCkgPCBsaW5lU3JjICsgbGluZUxlZnQgPyBKQklHMl9HRVREV09SRChzcCArIDQpIDogMCkgPj4KKyAgICAgICAgICAgICAgIHNoaWZ0Mik7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKHRtcDEgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICB9CisgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHMxID09IGQxKSB7CisgICAgICBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7CisgICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgICBzcCA9IGxpbmVTcmM7CisgICAgICAgIGRwID0gbGluZURzdDsKKyAgICAgICAgaWYgKGQxICE9IDApIHsKKyAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICh0bXAxICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBzcCArPSA0OworICAgICAgICAgIGRwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh4eCA9IDA7IHh4IDwgbWlkZGxlRHdvcmRzOyB4eCsrKSB7CisgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKTsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSB8IHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSAmIHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSBeIHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9IH4odG1wMSBeIHRtcDIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBzcCArPSA0OworICAgICAgICAgIGRwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGQyICE9IDApIHsKKyAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICh0bXAxICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgfQorICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNoaWZ0MSA9IGQxIC0gczE7CisgICAgICBzaGlmdDIgPSAzMiAtIHNoaWZ0MTsKKyAgICAgIG1pZGRsZUR3b3JkcyA9ICh4ZDEgPj4gNSkgLSAoKHhkMCArIDMxKSA+PiA1KTsKKyAgICAgIGZvciAoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CisgICAgICAgIHNwID0gbGluZVNyYzsKKyAgICAgICAgZHAgPSBsaW5lRHN0OworICAgICAgICBpZiAoZDEgIT0gMCkgeworICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCkgPj4gc2hpZnQxOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICh0bXAxICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBkcCArPSA0OworICAgICAgICB9CisgICAgICAgIGZvciAoeHggPSAwOyB4eCA8IG1pZGRsZUR3b3JkczsgeHgrKykgeworICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MikgfAorICAgICAgICAgICAgICAgICAoKEpCSUcyX0dFVERXT1JEKHNwICsgNCkpID4+IHNoaWZ0MSk7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgfCB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgJiB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgXiB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSB+KHRtcDEgXiB0bXAyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gdG1wMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgICAgc3AgKz0gNDsKKyAgICAgICAgICBkcCArPSA0OworICAgICAgICB9CisgICAgICAgIGlmIChkMiAhPSAwKSB7CisgICAgICAgICAgdG1wMSA9CisgICAgICAgICAgICAgIChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQyKSB8CisgICAgICAgICAgICAgICgoKHNwICsgNCkgPCBsaW5lU3JjICsgbGluZUxlZnQgPyBKQklHMl9HRVREV09SRChzcCArIDQpIDogMCkgPj4KKyAgICAgICAgICAgICAgIHNoaWZ0MSk7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKHRtcDEgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICB9CisgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KQotewotICAgIGludDMyX3QgeHMwLCB5czAsIHhzMSwgeXMxLCB4ZDAsIHlkMCwgeGQxLCB5ZDEsIHh4LCB5eSwgdywgaCwgbWlkZGxlRHdvcmRzLCBsaW5lTGVmdDsKLSAgICBGWF9EV09SRCBzMSwgZDEsIGQyLCBzaGlmdCwgc2hpZnQxLCBzaGlmdDIsIHRtcCwgdG1wMSwgdG1wMiwgbWFza0wsIG1hc2tSLCBtYXNrTTsKLSAgICB1aW50OF90ICpsaW5lU3JjLCAqbGluZURzdCwgKnNwLCAqZHA7Ci0gICAgaW50MzJfdCBzdywgc2g7Ci0gICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHggPCAtMTA0ODU3NiB8fCB4ID4gMTA0ODU3NiB8fCB5IDwgLTEwNDg1NzYgfHwgeSA+IDEwNDg1NzYpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBzdyA9IHBTcmNSZWN0LT5XaWR0aCgpOwotICAgIHNoID0gcFNyY1JlY3QtPkhlaWdodCgpOwotICAgIGlmKHkgPCAwKSB7Ci0gICAgICAgIHlzMCA9IC15OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHlzMCA9IDA7Ci0gICAgfQotICAgIGlmKHkgKyBzaCA+IHBEc3QtPm1fbkhlaWdodCkgewotICAgICAgICB5czEgPSBwRHN0LT5tX25IZWlnaHQgLSB5OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHlzMSA9IHNoOwotICAgIH0KLSAgICBpZih4IDwgMCkgewotICAgICAgICB4czAgPSAteDsKLSAgICB9IGVsc2UgewotICAgICAgICB4czAgPSAwOwotICAgIH0KLSAgICBpZih4ICsgc3cgPiBwRHN0LT5tX25XaWR0aCkgewotICAgICAgICB4czEgPSBwRHN0LT5tX25XaWR0aCAtIHg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeHMxID0gc3c7Ci0gICAgfQotICAgIGlmKCh5czAgPj0geXMxKSB8fCAoeHMwID49IHhzMSkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHcgPSB4czEgLSB4czA7Ci0gICAgaCA9IHlzMSAtIHlzMDsKLSAgICBpZih5IDwgMCkgewotICAgICAgICB5ZDAgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHlkMCA9IHk7Ci0gICAgfQotICAgIGlmKHggPCAwKSB7Ci0gICAgICAgIHhkMCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeGQwID0geDsKLSAgICB9Ci0gICAgeGQxID0geGQwICsgdzsKLSAgICB5ZDEgPSB5ZDAgKyBoOwotICAgIGQxID0geGQwICYgMzE7Ci0gICAgZDIgPSB4ZDEgJiAzMTsKLSAgICBzMSA9IHhzMCAmIDMxOwotICAgIG1hc2tMID0gMHhmZmZmZmZmZiA+PiBkMTsKLSAgICBtYXNrUiA9IDB4ZmZmZmZmZmYgPDwgKCgzMiAtICh4ZDEgJiAzMSkpICUgMzIpOwotICAgIG1hc2tNID0gbWFza0wgJiBtYXNrUjsKLSAgICBsaW5lU3JjID0gbV9wRGF0YSArIChwU3JjUmVjdC0+dG9wICsgeXMwKSAqIG1fblN0cmlkZSArICgoKHhzMCArIHBTcmNSZWN0LT5sZWZ0KSA+PiA1KSA8PCAyKTsKLSAgICBsaW5lTGVmdCA9IG1fblN0cmlkZSAtICgoeHMwID4+IDUpIDw8IDIpOwotICAgIGxpbmVEc3QgPSBwRHN0LT5tX3BEYXRhICsgeWQwICogcERzdC0+bV9uU3RyaWRlICsgKCh4ZDAgPj4gNSkgPDwgMik7Ci0gICAgaWYoKHhkMCAmIH4zMSkgPT0gKCh4ZDEgLSAxKSAmIH4zMSkpIHsKLSAgICAgICAgaWYoKHhzMCAmIH4zMSkgPT0gKCh4czEgLSAxKSAmIH4zMSkpIHsKLSAgICAgICAgICAgIGlmKHMxID4gZDEpIHsKLSAgICAgICAgICAgICAgICBzaGlmdCA9IHMxIC0gZDE7Ci0gICAgICAgICAgICAgICAgZm9yKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQobGluZVNyYykgPDwgc2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKHRtcDEgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGluZURzdFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbMl0gPSAodWludDhfdCkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzNdID0gKHVpbnQ4X3QpdG1wOwotICAgICAgICAgICAgICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaGlmdCA9IGQxIC0gczE7Ci0gICAgICAgICAgICAgICAgZm9yKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQobGluZVNyYykgPj4gc2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKHRtcDEgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGluZURzdFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbMl0gPSAodWludDhfdCkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzNdID0gKHVpbnQ4X3QpdG1wOwotICAgICAgICAgICAgICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hpZnQxID0gczEgLSBkMTsKLSAgICAgICAgICAgIHNoaWZ0MiA9IDMyIC0gc2hpZnQxOwotICAgICAgICAgICAgZm9yKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQobGluZVNyYykgPDwgc2hpZnQxKSB8IChKQklHMl9HRVREV09SRChsaW5lU3JjICsgNCkgPj4gc2hpZnQyKTsKLSAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQobGluZURzdCk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICh0bXAxICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmVEc3RbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICBsaW5lRHN0WzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgbGluZURzdFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgbGluZURzdFszXSA9ICh1aW50OF90KXRtcDsKLSAgICAgICAgICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgIH0KK0ZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UqIHBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkNvbXBvc2VPcCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCkgeworICBpbnQzMl90IHhzMCwgeXMwLCB4czEsIHlzMSwgeGQwLCB5ZDAsIHhkMSwgeWQxLCB4eCwgeXksIHcsIGgsIG1pZGRsZUR3b3JkcywKKyAgICAgIGxpbmVMZWZ0OworICBGWF9EV09SRCBzMSwgZDEsIGQyLCBzaGlmdCwgc2hpZnQxLCBzaGlmdDIsIHRtcCwgdG1wMSwgdG1wMiwgbWFza0wsIG1hc2tSLAorICAgICAgbWFza007CisgIHVpbnQ4X3QgKmxpbmVTcmMsICpsaW5lRHN0LCAqc3AsICpkcDsKKyAgaW50MzJfdCBzdywgc2g7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoeCA8IC0xMDQ4NTc2IHx8IHggPiAxMDQ4NTc2IHx8IHkgPCAtMTA0ODU3NiB8fCB5ID4gMTA0ODU3NikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzdyA9IHBTcmNSZWN0LT5XaWR0aCgpOworICBzaCA9IHBTcmNSZWN0LT5IZWlnaHQoKTsKKyAgaWYgKHkgPCAwKSB7CisgICAgeXMwID0gLXk7CisgIH0gZWxzZSB7CisgICAgeXMwID0gMDsKKyAgfQorICBpZiAoeSArIHNoID4gcERzdC0+bV9uSGVpZ2h0KSB7CisgICAgeXMxID0gcERzdC0+bV9uSGVpZ2h0IC0geTsKKyAgfSBlbHNlIHsKKyAgICB5czEgPSBzaDsKKyAgfQorICBpZiAoeCA8IDApIHsKKyAgICB4czAgPSAteDsKKyAgfSBlbHNlIHsKKyAgICB4czAgPSAwOworICB9CisgIGlmICh4ICsgc3cgPiBwRHN0LT5tX25XaWR0aCkgeworICAgIHhzMSA9IHBEc3QtPm1fbldpZHRoIC0geDsKKyAgfSBlbHNlIHsKKyAgICB4czEgPSBzdzsKKyAgfQorICBpZiAoKHlzMCA+PSB5czEpIHx8ICh4czAgPj0geHMxKSkgeworICAgIHJldHVybiAwOworICB9CisgIHcgPSB4czEgLSB4czA7CisgIGggPSB5czEgLSB5czA7CisgIGlmICh5IDwgMCkgeworICAgIHlkMCA9IDA7CisgIH0gZWxzZSB7CisgICAgeWQwID0geTsKKyAgfQorICBpZiAoeCA8IDApIHsKKyAgICB4ZDAgPSAwOworICB9IGVsc2UgeworICAgIHhkMCA9IHg7CisgIH0KKyAgeGQxID0geGQwICsgdzsKKyAgeWQxID0geWQwICsgaDsKKyAgZDEgPSB4ZDAgJiAzMTsKKyAgZDIgPSB4ZDEgJiAzMTsKKyAgczEgPSB4czAgJiAzMTsKKyAgbWFza0wgPSAweGZmZmZmZmZmID4+IGQxOworICBtYXNrUiA9IDB4ZmZmZmZmZmYgPDwgKCgzMiAtICh4ZDEgJiAzMSkpICUgMzIpOworICBtYXNrTSA9IG1hc2tMICYgbWFza1I7CisgIGxpbmVTcmMgPSBtX3BEYXRhICsgKHBTcmNSZWN0LT50b3AgKyB5czApICogbV9uU3RyaWRlICsKKyAgICAgICAgICAgICgoKHhzMCArIHBTcmNSZWN0LT5sZWZ0KSA+PiA1KSA8PCAyKTsKKyAgbGluZUxlZnQgPSBtX25TdHJpZGUgLSAoKHhzMCA+PiA1KSA8PCAyKTsKKyAgbGluZURzdCA9IHBEc3QtPm1fcERhdGEgKyB5ZDAgKiBwRHN0LT5tX25TdHJpZGUgKyAoKHhkMCA+PiA1KSA8PCAyKTsKKyAgaWYgKCh4ZDAgJiB+MzEpID09ICgoeGQxIC0gMSkgJiB+MzEpKSB7CisgICAgaWYgKCh4czAgJiB+MzEpID09ICgoeHMxIC0gMSkgJiB+MzEpKSB7CisgICAgICBpZiAoczEgPiBkMSkgeworICAgICAgICBzaGlmdCA9IHMxIC0gZDE7CisgICAgICAgIGZvciAoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CisgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKGxpbmVTcmMpIDw8IHNoaWZ0OworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKHRtcDEgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBsaW5lRHN0WzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgbGluZURzdFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGxpbmVEc3RbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGxpbmVEc3RbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgICAgbGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZihzMSA+IGQxKSB7Ci0gICAgICAgICAgICBzaGlmdDEgPSBzMSAtIGQxOwotICAgICAgICAgICAgc2hpZnQyID0gMzIgLSBzaGlmdDE7Ci0gICAgICAgICAgICBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7Ci0gICAgICAgICAgICBmb3IoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7Ci0gICAgICAgICAgICAgICAgc3AgPSBsaW5lU3JjOwotICAgICAgICAgICAgICAgIGRwID0gbGluZURzdDsKLSAgICAgICAgICAgICAgICBpZihkMSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MSkgfCAoSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA+PiBzaGlmdDIpOwotICAgICAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAodG1wMSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOwotICAgICAgICAgICAgICAgICAgICBzcCArPSA0OwotICAgICAgICAgICAgICAgICAgICBkcCArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IoeHggPSAwOyB4eCA8IG1pZGRsZUR3b3JkczsgeHgrKykgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDEpIHwgKEpCSUcyX0dFVERXT1JEKHNwICsgNCkgPj4gc2hpZnQyKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSB8IHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgJiB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxIF4gdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IH4odG1wMSBeIHRtcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOwotICAgICAgICAgICAgICAgICAgICBzcCArPSA0OwotICAgICAgICAgICAgICAgICAgICBkcCArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihkMiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MSkgfCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcCArIDQpIDwgbGluZVNyYyArIGxpbmVMZWZ0ID8gSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA6IDApID4+IHNoaWZ0Mik7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICh0bXAxICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYoczEgPT0gZDEpIHsKLSAgICAgICAgICAgIG1pZGRsZUR3b3JkcyA9ICh4ZDEgPj4gNSkgLSAoKHhkMCArIDMxKSA+PiA1KTsKLSAgICAgICAgICAgIGZvcih5eSA9IHlkMDsgeXkgPCB5ZDE7IHl5KyspIHsKLSAgICAgICAgICAgICAgICBzcCA9IGxpbmVTcmM7Ci0gICAgICAgICAgICAgICAgZHAgPSBsaW5lRHN0OwotICAgICAgICAgICAgICAgIGlmKGQxICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKHRtcDEgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKLSAgICAgICAgICAgICAgICAgICAgc3AgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgZHAgKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yKHh4ID0gMDsgeHggPCBtaWRkbGVEd29yZHM7IHh4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSB8IHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgJiB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxIF4gdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IH4odG1wMSBeIHRtcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOwotICAgICAgICAgICAgICAgICAgICBzcCArPSA0OwotICAgICAgICAgICAgICAgICAgICBkcCArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihkMiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICh0bXAxICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hpZnQxID0gZDEgLSBzMTsKLSAgICAgICAgICAgIHNoaWZ0MiA9IDMyIC0gc2hpZnQxOwotICAgICAgICAgICAgbWlkZGxlRHdvcmRzID0gKHhkMSA+PiA1KSAtICgoeGQwICsgMzEpID4+IDUpOwotICAgICAgICAgICAgZm9yKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgICAgICAgIHNwID0gbGluZVNyYzsKLSAgICAgICAgICAgICAgICBkcCA9IGxpbmVEc3Q7Ci0gICAgICAgICAgICAgICAgaWYoZDEgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApID4+IHNoaWZ0MTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKHRtcDEgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKLSAgICAgICAgICAgICAgICAgICAgZHAgKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yKHh4ID0gMDsgeHggPCBtaWRkbGVEd29yZHM7IHh4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQyKSB8ICgoSkJJRzJfR0VURFdPUkQoc3AgKyA0KSkgPj4gc2hpZnQxKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSB8IHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgJiB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxIF4gdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IH4odG1wMSBeIHRtcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOwotICAgICAgICAgICAgICAgICAgICBzcCArPSA0OwotICAgICAgICAgICAgICAgICAgICBkcCArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihkMiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MikgfCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcCArIDQpIDwgbGluZVNyYyArIGxpbmVMZWZ0ID8gSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA6IDApID4+IHNoaWZ0MSk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICh0bXAxICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2hpZnQgPSBkMSAtIHMxOworICAgICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChsaW5lU3JjKSA+PiBzaGlmdDsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQobGluZURzdCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICh0bXAxICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgbGluZURzdFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGxpbmVEc3RbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBsaW5lRHN0WzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBsaW5lRHN0WzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwogICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNoaWZ0MSA9IHMxIC0gZDE7CisgICAgICBzaGlmdDIgPSAzMiAtIHNoaWZ0MTsKKyAgICAgIGZvciAoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CisgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQobGluZVNyYykgPDwgc2hpZnQxKSB8CisgICAgICAgICAgICAgICAoSkJJRzJfR0VURFdPUkQobGluZVNyYyArIDQpID4+IHNoaWZ0Mik7CisgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKHRtcDEgJiBtYXNrTSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBsaW5lRHN0WzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgIGxpbmVEc3RbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgbGluZURzdFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgIGxpbmVEc3RbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgaWYgKHMxID4gZDEpIHsKKyAgICAgIHNoaWZ0MSA9IHMxIC0gZDE7CisgICAgICBzaGlmdDIgPSAzMiAtIHNoaWZ0MTsKKyAgICAgIG1pZGRsZUR3b3JkcyA9ICh4ZDEgPj4gNSkgLSAoKHhkMCArIDMxKSA+PiA1KTsKKyAgICAgIGZvciAoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CisgICAgICAgIHNwID0gbGluZVNyYzsKKyAgICAgICAgZHAgPSBsaW5lRHN0OworICAgICAgICBpZiAoZDEgIT0gMCkgeworICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MSkgfAorICAgICAgICAgICAgICAgICAoSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA+PiBzaGlmdDIpOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICh0bXAxICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBzcCArPSA0OworICAgICAgICAgIGRwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh4eCA9IDA7IHh4IDwgbWlkZGxlRHdvcmRzOyB4eCsrKSB7CisgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQxKSB8CisgICAgICAgICAgICAgICAgIChKQklHMl9HRVREV09SRChzcCArIDQpID4+IHNoaWZ0Mik7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgfCB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgJiB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgXiB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSB+KHRtcDEgXiB0bXAyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gdG1wMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgICAgc3AgKz0gNDsKKyAgICAgICAgICBkcCArPSA0OworICAgICAgICB9CisgICAgICAgIGlmIChkMiAhPSAwKSB7CisgICAgICAgICAgdG1wMSA9CisgICAgICAgICAgICAgIChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQxKSB8CisgICAgICAgICAgICAgICgoKHNwICsgNCkgPCBsaW5lU3JjICsgbGluZUxlZnQgPyBKQklHMl9HRVREV09SRChzcCArIDQpIDogMCkgPj4KKyAgICAgICAgICAgICAgIHNoaWZ0Mik7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKHRtcDEgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICB9CisgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHMxID09IGQxKSB7CisgICAgICBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7CisgICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgICBzcCA9IGxpbmVTcmM7CisgICAgICAgIGRwID0gbGluZURzdDsKKyAgICAgICAgaWYgKGQxICE9IDApIHsKKyAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICh0bXAxICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBzcCArPSA0OworICAgICAgICAgIGRwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh4eCA9IDA7IHh4IDwgbWlkZGxlRHdvcmRzOyB4eCsrKSB7CisgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKTsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSB8IHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSAmIHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSBeIHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9IH4odG1wMSBeIHRtcDIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBzcCArPSA0OworICAgICAgICAgIGRwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGQyICE9IDApIHsKKyAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICh0bXAxICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgfQorICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNoaWZ0MSA9IGQxIC0gczE7CisgICAgICBzaGlmdDIgPSAzMiAtIHNoaWZ0MTsKKyAgICAgIG1pZGRsZUR3b3JkcyA9ICh4ZDEgPj4gNSkgLSAoKHhkMCArIDMxKSA+PiA1KTsKKyAgICAgIGZvciAoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CisgICAgICAgIHNwID0gbGluZVNyYzsKKyAgICAgICAgZHAgPSBsaW5lRHN0OworICAgICAgICBpZiAoZDEgIT0gMCkgeworICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCkgPj4gc2hpZnQxOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICh0bXAxICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBkcCArPSA0OworICAgICAgICB9CisgICAgICAgIGZvciAoeHggPSAwOyB4eCA8IG1pZGRsZUR3b3JkczsgeHgrKykgeworICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MikgfAorICAgICAgICAgICAgICAgICAoKEpCSUcyX0dFVERXT1JEKHNwICsgNCkpID4+IHNoaWZ0MSk7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgfCB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgJiB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgXiB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSB+KHRtcDEgXiB0bXAyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gdG1wMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgICAgc3AgKz0gNDsKKyAgICAgICAgICBkcCArPSA0OworICAgICAgICB9CisgICAgICAgIGlmIChkMiAhPSAwKSB7CisgICAgICAgICAgdG1wMSA9CisgICAgICAgICAgICAgIChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQyKSB8CisgICAgICAgICAgICAgICgoKHNwICsgNCkgPCBsaW5lU3JjICsgbGluZUxlZnQgPyBKQklHMl9HRVREV09SRChzcCArIDQpIDogMCkgPj4KKyAgICAgICAgICAgICAgIHNoaWZ0MSk7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKHRtcDEgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICB9CisgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmgKaW5kZXggNDIzYmViYy4uNDcyMTVlYSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBfSkJJRzJfSU1BR0VfSF8KQEAgLTksNjAgKzksODUgQEAKICNpbmNsdWRlICJKQmlnMl9EZWZpbmUuaCIKICNpbmNsdWRlICJKQmlnMl9Nb2R1bGUuaCIKIHR5cGVkZWYgZW51bSB7Ci0gICAgSkJJRzJfQ09NUE9TRV9PUgkJPSAwLAotICAgIEpCSUcyX0NPTVBPU0VfQU5ECQk9IDEsCi0gICAgSkJJRzJfQ09NUE9TRV9YT1IJCT0gMiwKLSAgICBKQklHMl9DT01QT1NFX1hOT1IJCT0gMywKLSAgICBKQklHMl9DT01QT1NFX1JFUExBQ0UJPSA0CisgIEpCSUcyX0NPTVBPU0VfT1IgPSAwLAorICBKQklHMl9DT01QT1NFX0FORCA9IDEsCisgIEpCSUcyX0NPTVBPU0VfWE9SID0gMiwKKyAgSkJJRzJfQ09NUE9TRV9YTk9SID0gMywKKyAgSkJJRzJfQ09NUE9TRV9SRVBMQUNFID0gNAogfSBKQmlnMkNvbXBvc2VPcDsKIHN0cnVjdCBGWF9SRUNUOwotY2xhc3MgQ0pCaWcyX0ltYWdlIDogcHVibGljIENKQmlnMl9PYmplY3QKLXsKLXB1YmxpYzoKK2NsYXNzIENKQmlnMl9JbWFnZSA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKQmlnMl9JbWFnZShpbnQzMl90IHcsIGludDMyX3QgaCk7CiAKLSAgICBDSkJpZzJfSW1hZ2UoaW50MzJfdCB3LCBpbnQzMl90IGgpOworICBDSkJpZzJfSW1hZ2UoaW50MzJfdCB3LCBpbnQzMl90IGgsIGludDMyX3Qgc3RyaWRlLCB1aW50OF90KiBwQnVmKTsKIAotICAgIENKQmlnMl9JbWFnZShpbnQzMl90IHcsIGludDMyX3QgaCwgaW50MzJfdCBzdHJpZGUsIHVpbnQ4X3QqcEJ1Zik7CisgIENKQmlnMl9JbWFnZShDSkJpZzJfSW1hZ2UmIGltKTsKIAotICAgIENKQmlnMl9JbWFnZShDSkJpZzJfSW1hZ2UgJmltKTsKKyAgfkNKQmlnMl9JbWFnZSgpOwogCi0gICAgfkNKQmlnMl9JbWFnZSgpOworICBGWF9CT09MIGdldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KTsKIAotICAgIEZYX0JPT0wgZ2V0UGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHkpOworICBpbnQzMl90IHNldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5LCBGWF9CT09MIHYpOwogCi0gICAgaW50MzJfdCBzZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfQk9PTCB2KTsKKyAgdm9pZCBjb3B5TGluZShpbnQzMl90IGhUbywgaW50MzJfdCBoRnJvbSk7CiAKLSAgICB2b2lkIGNvcHlMaW5lKGludDMyX3QgaFRvLCBpbnQzMl90IGhGcm9tKTsKKyAgdm9pZCBmaWxsKEZYX0JPT0wgdik7CiAKLSAgICB2b2lkIGZpbGwoRlhfQk9PTCB2KTsKKyAgRlhfQk9PTCBjb21wb3NlVG8oQ0pCaWcyX0ltYWdlKiBwRHN0LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3ApOworICBGWF9CT09MIGNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UqIHBEc3QsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICBKQmlnMkNvbXBvc2VPcCBvcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpOwogCi0gICAgRlhfQk9PTCBjb21wb3NlVG8oQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOwotICAgIEZYX0JPT0wgY29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7CisgIEZYX0JPT0wgY29tcG9zZVRvX3Vub3B0KENKQmlnMl9JbWFnZSogcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wKTsKIAotICAgIEZYX0JPT0wgY29tcG9zZVRvX3Vub3B0KENKQmlnMl9JbWFnZSAqcERzdCwgaW50MzJfdCB4LCBpbnQzMl90IHksIEpCaWcyQ29tcG9zZU9wIG9wKTsKKyAgRlhfQk9PTCBjb21wb3NlVG9fb3B0KENKQmlnMl9JbWFnZSogcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wKTsKIAotICAgIEZYX0JPT0wgY29tcG9zZVRvX29wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIGludDMyX3QgeCwgaW50MzJfdCB5LCBKQmlnMkNvbXBvc2VPcCBvcCk7CisgIEZYX0JPT0wgY29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlKiBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3ApOworICBGWF9CT09MIGNvbXBvc2VUb19vcHQyKENKQmlnMl9JbWFnZSogcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KTsKIAotICAgIEZYX0JPT0wgY29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3ApOwotICAgIEZYX0JPT0wgY29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBpbnQzMl90IHgsIGludDMyX3QgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KTsKKyAgRlhfQk9PTCBjb21wb3NlRnJvbShpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9JbWFnZSogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICBKQmlnMkNvbXBvc2VPcCBvcCk7CisgIEZYX0JPT0wgY29tcG9zZUZyb20oaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfSW1hZ2UqIHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3AsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpOworICBDSkJpZzJfSW1hZ2UqIHN1YkltYWdlX3Vub3B0KGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHcsIGludDMyX3QgaCk7CiAKLSAgICBGWF9CT09MIGNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wKTsKLSAgICBGWF9CT09MIGNvbXBvc2VGcm9tKGludDMyX3QgeCwgaW50MzJfdCB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7Ci0gICAgQ0pCaWcyX0ltYWdlICpzdWJJbWFnZV91bm9wdChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICBDSkJpZzJfSW1hZ2UqIHN1YkltYWdlKGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHcsIGludDMyX3QgaCk7CiAKLSAgICBDSkJpZzJfSW1hZ2UgKnN1YkltYWdlKGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHcsIGludDMyX3QgaCk7CisgIHZvaWQgZXhwYW5kKGludDMyX3QgaCwgRlhfQk9PTCB2KTsKIAotICAgIHZvaWQgZXhwYW5kKGludDMyX3QgaCwgRlhfQk9PTCB2KTsKLXB1YmxpYzoKKyBwdWJsaWM6CisgIGludDMyX3QgbV9uV2lkdGg7CiAKLSAgICBpbnQzMl90IG1fbldpZHRoOworICBpbnQzMl90IG1fbkhlaWdodDsKIAotICAgIGludDMyX3QgbV9uSGVpZ2h0OworICBpbnQzMl90IG1fblN0cmlkZTsKIAotICAgIGludDMyX3QgbV9uU3RyaWRlOworICB1aW50OF90KiBtX3BEYXRhOwogCi0gICAgdWludDhfdCAqbV9wRGF0YTsKLQotICAgIEZYX0JPT0wgbV9iTmVlZEZyZWU7CisgIEZYX0JPT0wgbV9iTmVlZEZyZWU7CiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0xpc3QuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTGlzdC5oCmluZGV4IDE5Zjk5ZGUuLmJlMmQ3Y2IgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTGlzdC5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTGlzdC5oCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIF9KQklHMl9MSVNUX0hfCkBAIC05LDU5ICs5LDQ1IEBACiAjaW5jbHVkZSAiSkJpZzJfRGVmaW5lLmgiCiAjaW5jbHVkZSAiSkJpZzJfT2JqZWN0LmgiCiB0ZW1wbGF0ZSA8Y2xhc3MgVFlQRT4KLWNsYXNzIENKQmlnMl9MaXN0IDogcHVibGljIENKQmlnMl9PYmplY3QKLXsKLXB1YmxpYzoKK2NsYXNzIENKQmlnMl9MaXN0IDogcHVibGljIENKQmlnMl9PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pCaWcyX0xpc3QoaW50MzJfdCBuU2l6ZSA9IDgpIHsKKyAgICBtX25TaXplID0gblNpemU7CisgICAgbV9wQXJyYXkgPSAoVFlQRSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoVFlQRSopLCBuU2l6ZSk7CisgICAgbV9uTGVuZ3RoID0gMDsKKyAgfQogCi0gICAgQ0pCaWcyX0xpc3QoaW50MzJfdCBuU2l6ZSA9IDgpCi0gICAgewotICAgICAgICBtX25TaXplID0gblNpemU7Ci0gICAgICAgIG1fcEFycmF5ID0gKFRZUEUqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKFRZUEUqKSwgblNpemUpOwotICAgICAgICBtX25MZW5ndGggPSAwOworICB+Q0pCaWcyX0xpc3QoKSB7CisgICAgY2xlYXIoKTsKKyAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUobV9wQXJyYXkpOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBpbnQzMl90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1fbkxlbmd0aDsgaSsrKSB7CisgICAgICBkZWxldGUgbV9wQXJyYXlbaV07CiAgICAgfQorICAgIG1fbkxlbmd0aCA9IDA7CisgIH0KIAotICAgIH5DSkJpZzJfTGlzdCgpCi0gICAgewotICAgICAgICBjbGVhcigpOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUobV9wQXJyYXkpOworICB2b2lkIGFkZEl0ZW0oVFlQRSogcEl0ZW0pIHsKKyAgICBpZiAobV9uTGVuZ3RoID49IG1fblNpemUpIHsKKyAgICAgIG1fblNpemUgKz0gODsKKyAgICAgIG1fcEFycmF5ID0KKyAgICAgICAgICAoVFlQRSoqKW1fcE1vZHVsZS0+SkJpZzJfUmVhbGxvYyhtX3BBcnJheSwgc2l6ZW9mKFRZUEUqKSAqIG1fblNpemUpOwogICAgIH0KKyAgICBtX3BBcnJheVttX25MZW5ndGgrK10gPSBwSXRlbTsKKyAgfQogCi0gICAgdm9pZCBjbGVhcigpCi0gICAgewotICAgICAgICBpbnQzMl90IGk7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IG1fbkxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBkZWxldGUgbV9wQXJyYXlbaV07Ci0gICAgICAgIH0KLSAgICAgICAgbV9uTGVuZ3RoID0gMDsKLSAgICB9CisgIGludDMyX3QgZ2V0TGVuZ3RoKCkgeyByZXR1cm4gbV9uTGVuZ3RoOyB9CiAKLSAgICB2b2lkIGFkZEl0ZW0oVFlQRSAqcEl0ZW0pCi0gICAgewotICAgICAgICBpZihtX25MZW5ndGggPj0gbV9uU2l6ZSkgewotICAgICAgICAgICAgbV9uU2l6ZSArPSA4OwotICAgICAgICAgICAgbV9wQXJyYXkgPSAoVFlQRSoqKW1fcE1vZHVsZS0+SkJpZzJfUmVhbGxvYyhtX3BBcnJheSwgc2l6ZW9mKFRZUEUqKSptX25TaXplKTsKLSAgICAgICAgfQotICAgICAgICBtX3BBcnJheVttX25MZW5ndGgrK10gPSBwSXRlbTsKLSAgICB9CisgIFRZUEUqIGdldEF0KGludDMyX3QgbkluZGV4KSB7IHJldHVybiBtX3BBcnJheVtuSW5kZXhdOyB9CiAKKyAgVFlQRSogZ2V0TGFzdCgpIHsgcmV0dXJuIG1fcEFycmF5W21fbkxlbmd0aCAtIDFdOyB9CiAKLSAgICBpbnQzMl90IGdldExlbmd0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9uTGVuZ3RoOwotICAgIH0KLQotICAgIFRZUEUgKmdldEF0KGludDMyX3QgbkluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEFycmF5W25JbmRleF07Ci0gICAgfQotCi0gICAgVFlQRSAqZ2V0TGFzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wQXJyYXlbbV9uTGVuZ3RoIC0gMV07Ci0gICAgfQotcHJpdmF0ZToKLSAgICBpbnQzMl90IG1fblNpemU7Ci0gICAgVFlQRSAqKm1fcEFycmF5OwotICAgIGludDMyX3QgbV9uTGVuZ3RoOworIHByaXZhdGU6CisgIGludDMyX3QgbV9uU2l6ZTsKKyAgVFlQRSoqIG1fcEFycmF5OworICBpbnQzMl90IG1fbkxlbmd0aDsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTW9kdWxlLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX01vZHVsZS5oCmluZGV4IDVhOTZmNDMuLmM2NjlhZmUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTW9kdWxlLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Nb2R1bGUuaApAQCAtMSwzMyArMSwzNCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIF9KQklHMl9NT0RVTEVfSF8KICNkZWZpbmUgX0pCSUcyX01PRFVMRV9IXwogI2luY2x1ZGUgIkpCaWcyX0RlZmluZS5oIgotY2xhc3MgQ0pCaWcyX01vZHVsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgfkNKQmlnMl9Nb2R1bGUoKSB7IH0KK2NsYXNzIENKQmlnMl9Nb2R1bGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q0pCaWcyX01vZHVsZSgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgKkpCaWcyX01hbGxvYyhGWF9EV09SRCBkd1NpemUpID0gMDsKKyAgdmlydHVhbCB2b2lkKiBKQmlnMl9NYWxsb2MoRlhfRFdPUkQgZHdTaXplKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgKkpCaWcyX01hbGxvYzIoRlhfRFdPUkQgbnVtLCBGWF9EV09SRCBkd1NpemUpID0gMDsKKyAgdmlydHVhbCB2b2lkKiBKQmlnMl9NYWxsb2MyKEZYX0RXT1JEIG51bSwgRlhfRFdPUkQgZHdTaXplKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgKkpCaWcyX01hbGxvYzMoRlhfRFdPUkQgbnVtLCBGWF9EV09SRCBkd1NpemUsIEZYX0RXT1JEIGR3U2l6ZTIpID0gMDsKKyAgdmlydHVhbCB2b2lkKiBKQmlnMl9NYWxsb2MzKEZYX0RXT1JEIG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZTIpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCAqSkJpZzJfUmVhbGxvYyh2b2lkKiBwTWVtLCBGWF9EV09SRCBkd1NpemUpID0gMDsKKyAgdmlydHVhbCB2b2lkKiBKQmlnMl9SZWFsbG9jKHZvaWQqIHBNZW0sIEZYX0RXT1JEIGR3U2l6ZSkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIEpCaWcyX0ZyZWUodm9pZCogcE1lbSkgPSAwOworICB2aXJ0dWFsIHZvaWQgSkJpZzJfRnJlZSh2b2lkKiBwTWVtKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgSkJpZzJfQXNzZXJ0KGludDMyX3QgbkV4cHJlc3Npb24pIHt9OworICB2aXJ0dWFsIHZvaWQgSkJpZzJfQXNzZXJ0KGludDMyX3QgbkV4cHJlc3Npb24pe307CiAKLSAgICB2aXJ0dWFsCXZvaWQgSkJpZzJfRXJyb3IoY29uc3QgRlhfQ0hBUiogZm9ybWF0LCAuLi4pIHt9OworICB2aXJ0dWFsIHZvaWQgSkJpZzJfRXJyb3IoY29uc3QgRlhfQ0hBUiogZm9ybWF0LCAuLi4pe307CiAKLSAgICB2aXJ0dWFsIHZvaWQgSkJpZzJfV2Fybihjb25zdCBGWF9DSEFSKiBmb3JtYXQsIC4uLikge307CisgIHZpcnR1YWwgdm9pZCBKQmlnMl9XYXJuKGNvbnN0IEZYX0NIQVIqIGZvcm1hdCwgLi4uKXt9OwogCi0gICAgdmlydHVhbCB2b2lkIEpCaWcyX0xvZyhjb25zdCBGWF9DSEFSKiBmb3JtYXQsIC4uLikge307CisgIHZpcnR1YWwgdm9pZCBKQmlnMl9Mb2coY29uc3QgRlhfQ0hBUiogZm9ybWF0LCAuLi4pe307CiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX09iamVjdC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX09iamVjdC5jcHAKaW5kZXggMTQyOWE5MS4uZjFlODk0MyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9PYmplY3QuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfT2JqZWN0LmNwcApAQCAtMSw3MiArMSw3OCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiSkJpZzJfT2JqZWN0LmgiCiAjaW5jbHVkZSAiSkJpZzJfTW9kdWxlLmgiCi12b2lkICpDSkJpZzJfT2JqZWN0OjpvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIENKQmlnMl9Nb2R1bGUgKnBNb2R1bGUsIGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBpbnQgbGluZSkKLXsKLSAgICBDSkJpZzJfT2JqZWN0ICpwOwotICAgIHAgPSAoQ0pCaWcyX09iamVjdCAqKXBNb2R1bGUtPkpCaWcyX01hbGxvYygoRlhfRFdPUkQpc2l6ZSk7Ci0gICAgcC0+bV9wTW9kdWxlID0gcE1vZHVsZTsKLSAgICByZXR1cm4gcDsKK3ZvaWQqIENKQmlnMl9PYmplY3Q6Om9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfTW9kdWxlKiBwTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgIENKQmlnMl9PYmplY3QqIHA7CisgIHAgPSAoQ0pCaWcyX09iamVjdCopcE1vZHVsZS0+SkJpZzJfTWFsbG9jKChGWF9EV09SRClzaXplKTsKKyAgcC0+bV9wTW9kdWxlID0gcE1vZHVsZTsKKyAgcmV0dXJuIHA7CiB9Ci12b2lkIENKQmlnMl9PYmplY3Q6Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgaW50IGxpbmUpCi17Ci0gICAgcE1vZHVsZS0+SkJpZzJfRnJlZShwKTsKK3ZvaWQgQ0pCaWcyX09iamVjdDo6b3BlcmF0b3IgZGVsZXRlKHZvaWQqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfTW9kdWxlKiBwTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICBwTW9kdWxlLT5KQmlnMl9GcmVlKHApOwogfQotdm9pZCAqQ0pCaWcyX09iamVjdDo6b3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlKQotewotICAgIENKQmlnMl9PYmplY3QgKnA7Ci0gICAgcCA9IChDSkJpZzJfT2JqZWN0ICopcE1vZHVsZS0+SkJpZzJfTWFsbG9jKChGWF9EV09SRClzaXplKTsKLSAgICBwLT5tX3BNb2R1bGUgPSBwTW9kdWxlOwotICAgIHJldHVybiBwOwordm9pZCogQ0pCaWcyX09iamVjdDo6b3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBDSkJpZzJfTW9kdWxlKiBwTW9kdWxlKSB7CisgIENKQmlnMl9PYmplY3QqIHA7CisgIHAgPSAoQ0pCaWcyX09iamVjdCopcE1vZHVsZS0+SkJpZzJfTWFsbG9jKChGWF9EV09SRClzaXplKTsKKyAgcC0+bV9wTW9kdWxlID0gcE1vZHVsZTsKKyAgcmV0dXJuIHA7CiB9Ci12b2lkIENKQmlnMl9PYmplY3Q6Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwKQotewotICAgICgoQ0pCaWcyX09iamVjdCAqKXApLT5tX3BNb2R1bGUtPkpCaWcyX0ZyZWUocCk7Cit2b2lkIENKQmlnMl9PYmplY3Q6Om9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwKSB7CisgICgoQ0pCaWcyX09iamVjdCopcCktPm1fcE1vZHVsZS0+SkJpZzJfRnJlZShwKTsKIH0KLXZvaWQgQ0pCaWcyX09iamVjdDo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKnAsIENKQmlnMl9Nb2R1bGUgKnBNb2R1bGUpCi17Ci0gICAgcE1vZHVsZS0+SkJpZzJfRnJlZShwKTsKK3ZvaWQgQ0pCaWcyX09iamVjdDo6b3BlcmF0b3IgZGVsZXRlKHZvaWQqIHAsIENKQmlnMl9Nb2R1bGUqIHBNb2R1bGUpIHsKKyAgcE1vZHVsZS0+SkJpZzJfRnJlZShwKTsKIH0KLXZvaWQgKkNKQmlnMl9PYmplY3Q6Om9wZXJhdG9yIG5ld1tdKHNpemVfdCBzaXplLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBzaXplX3QgdW5pdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIGludCBsaW5lKQotewotICAgIHZvaWQgKnA7Ci0gICAgdWludDhfdCAqcEN1ciwgKnBFbmQ7Ci0gICAgcCA9ICh1aW50OF90ICopcE1vZHVsZS0+SkJpZzJfTWFsbG9jKChGWF9EV09SRClzaXplKTsKLSAgICBwQ3VyID0gKHVpbnQ4X3QgKilwOwotICAgIHBFbmQgPSBwQ3VyICsgc2l6ZTsKLSAgICBmb3IoOyBwQ3VyIDwgcEVuZDsgcEN1ciArPSB1bml0X3NpemUpIHsKLSAgICAgICAgKChDSkJpZzJfT2JqZWN0ICopcEN1ciktPm1fcE1vZHVsZSA9IHBNb2R1bGU7Ci0gICAgfQotICAgIHJldHVybiBwOwordm9pZCogQ0pCaWcyX09iamVjdDo6b3BlcmF0b3IgbmV3W10oc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfTW9kdWxlKiBwTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVuaXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpIHsKKyAgdm9pZCogcDsKKyAgdWludDhfdCAqcEN1ciwgKnBFbmQ7CisgIHAgPSAodWludDhfdCopcE1vZHVsZS0+SkJpZzJfTWFsbG9jKChGWF9EV09SRClzaXplKTsKKyAgcEN1ciA9ICh1aW50OF90KilwOworICBwRW5kID0gcEN1ciArIHNpemU7CisgIGZvciAoOyBwQ3VyIDwgcEVuZDsgcEN1ciArPSB1bml0X3NpemUpIHsKKyAgICAoKENKQmlnMl9PYmplY3QqKXBDdXIpLT5tX3BNb2R1bGUgPSBwTW9kdWxlOworICB9CisgIHJldHVybiBwOwogfQotdm9pZCBDSkJpZzJfT2JqZWN0OjpvcGVyYXRvciBkZWxldGVbXSh2b2lkICpwLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBzaXplX3QgdW5pdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgaW50IGxpbmUpCi17Ci0gICAgcE1vZHVsZS0+SkJpZzJfRnJlZShwKTsKK3ZvaWQgQ0pCaWcyX09iamVjdDo6b3BlcmF0b3IgZGVsZXRlW10odm9pZCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX01vZHVsZSogcE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVuaXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgIHBNb2R1bGUtPkpCaWcyX0ZyZWUocCk7CiB9Ci12b2lkICpDSkJpZzJfT2JqZWN0OjpvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSwgQ0pCaWcyX01vZHVsZSAqcE1vZHVsZSwgc2l6ZV90IHVuaXRfc2l6ZSkKLXsKLSAgICB2b2lkICpwOwotICAgIHVpbnQ4X3QgKnBDdXIsICpwRW5kOwotICAgIHAgPSAodWludDhfdCAqKXBNb2R1bGUtPkpCaWcyX01hbGxvYygoRlhfRFdPUkQpc2l6ZSk7Ci0gICAgcEN1ciA9ICh1aW50OF90ICopcDsKLSAgICBwRW5kID0gcEN1ciArIHNpemU7Ci0gICAgZm9yKDsgcEN1ciA8IHBFbmQ7IHBDdXIgKz0gdW5pdF9zaXplKSB7Ci0gICAgICAgICgoQ0pCaWcyX09iamVjdCAqKXBDdXIpLT5tX3BNb2R1bGUgPSBwTW9kdWxlOwotICAgIH0KLSAgICByZXR1cm4gcDsKK3ZvaWQqIENKQmlnMl9PYmplY3Q6Om9wZXJhdG9yIG5ld1tdKHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX01vZHVsZSogcE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bml0X3NpemUpIHsKKyAgdm9pZCogcDsKKyAgdWludDhfdCAqcEN1ciwgKnBFbmQ7CisgIHAgPSAodWludDhfdCopcE1vZHVsZS0+SkJpZzJfTWFsbG9jKChGWF9EV09SRClzaXplKTsKKyAgcEN1ciA9ICh1aW50OF90KilwOworICBwRW5kID0gcEN1ciArIHNpemU7CisgIGZvciAoOyBwQ3VyIDwgcEVuZDsgcEN1ciArPSB1bml0X3NpemUpIHsKKyAgICAoKENKQmlnMl9PYmplY3QqKXBDdXIpLT5tX3BNb2R1bGUgPSBwTW9kdWxlOworICB9CisgIHJldHVybiBwOwogfQotdm9pZCBDSkJpZzJfT2JqZWN0OjpvcGVyYXRvciBkZWxldGVbXSh2b2lkKiBwKQotewotICAgICgoQ0pCaWcyX09iamVjdCAqKXApLT5tX3BNb2R1bGUtPkpCaWcyX0ZyZWUocCk7Cit2b2lkIENKQmlnMl9PYmplY3Q6Om9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIHApIHsKKyAgKChDSkJpZzJfT2JqZWN0KilwKS0+bV9wTW9kdWxlLT5KQmlnMl9GcmVlKHApOwogfQotdm9pZCBDSkJpZzJfT2JqZWN0OjpvcGVyYXRvciBkZWxldGVbXSh2b2lkICpwLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBzaXplX3QgdW5pdF9zaXplKQotewotICAgIHBNb2R1bGUtPkpCaWcyX0ZyZWUocCk7Cit2b2lkIENKQmlnMl9PYmplY3Q6Om9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Nb2R1bGUqIHBNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bml0X3NpemUpIHsKKyAgcE1vZHVsZS0+SkJpZzJfRnJlZShwKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfT2JqZWN0LmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX09iamVjdC5oCmluZGV4IDE1MGE4ZTcuLmJhYjFhMTYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfT2JqZWN0LmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9PYmplY3QuaApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBfSkJJRzJfT0JKRUNUX0hfCkBAIC05LDM1ICs5LDQ3IEBACiAjaW5jbHVkZSAiSkJpZzJfRGVmaW5lLmgiCiBjbGFzcyBDSkJpZzJfTW9kdWxlOwogI2RlZmluZSBfSkJJRzJfTk9fRVhQRUNUSU9OXwotY2xhc3MgQ0pCaWcyX09iamVjdAotewotcHVibGljOgorY2xhc3MgQ0pCaWcyX09iamVjdCB7CisgcHVibGljOgorICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfTW9kdWxlKiBwTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7CiAKLSAgICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIENKQmlnMl9Nb2R1bGUgKnBNb2R1bGUsIGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBpbnQgbGluZSk7CisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHAsCisgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Nb2R1bGUqIHBNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7CiAKLSAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgaW50IGxpbmUpOworICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIENKQmlnMl9Nb2R1bGUqIHBNb2R1bGUpOwogCi0gICAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlKTsKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCogcCk7CiAKLSAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwKTsKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCogcCwgQ0pCaWcyX01vZHVsZSogcE1vZHVsZSk7CiAKLSAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlKTsKKyAgdm9pZCogb3BlcmF0b3IgbmV3W10oc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Nb2R1bGUqIHBNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bml0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7CiAKLSAgICB2b2lkICpvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSwgQ0pCaWcyX01vZHVsZSAqcE1vZHVsZSwgc2l6ZV90IHVuaXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgaW50IGxpbmUpOworICB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX01vZHVsZSogcE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdW5pdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKTsKIAotICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCAqcCwgQ0pCaWcyX01vZHVsZSAqcE1vZHVsZSwgc2l6ZV90IHVuaXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBpbnQgbGluZSk7CisgIHZvaWQqIG9wZXJhdG9yIG5ld1tdKHNpemVfdCBzaXplLCBDSkJpZzJfTW9kdWxlKiBwTW9kdWxlLCBzaXplX3QgdW5pdF9zaXplKTsKIAotICAgIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCBzaXplLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBzaXplX3QgdW5pdF9zaXplKTsKKyAgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiBwKTsKIAotICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcCk7CisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcCwgQ0pCaWcyX01vZHVsZSogcE1vZHVsZSwgc2l6ZV90IHVuaXRfc2l6ZSk7CiAKLSAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQgKnAsIENKQmlnMl9Nb2R1bGUgKnBNb2R1bGUsIHNpemVfdCB1bml0X3NpemUpOwotcHVibGljOgotCi0gICAgQ0pCaWcyX01vZHVsZSAqbV9wTW9kdWxlOworIHB1YmxpYzoKKyAgQ0pCaWcyX01vZHVsZSogbV9wTW9kdWxlOwogfTsKLSNkZWZpbmUgSkJJRzJfTkVXIG5ldyhtX3BNb2R1bGUpCi0jZGVmaW5lIEpCSUcyX0FMTE9DKHAsIGEpIHAgPSBKQklHMl9ORVcgYTsgcC0+bV9wTW9kdWxlID0gbV9wTW9kdWxlOworI2RlZmluZSBKQklHMl9ORVcgbmV3IChtX3BNb2R1bGUpCisjZGVmaW5lIEpCSUcyX0FMTE9DKHAsIGEpIFwKKyAgcCA9IEpCSUcyX05FVyBhOyAgICAgICAgXAorICBwLT5tX3BNb2R1bGUgPSBtX3BNb2R1bGU7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGFnZS5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYWdlLmgKaW5kZXggYjA3ZWJhOC4uNWIyZmE2OSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYWdlLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYWdlLmgKQEAgLTEsMTkgKzEsMTcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBfSkJJRzJfUEFHRV9IXwogI2RlZmluZSBfSkJJRzJfUEFHRV9IXwogI2luY2x1ZGUgIkpCaWcyX0ltYWdlLmgiCiBzdHJ1Y3QgSkJpZzJQYWdlSW5mbyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0IHsKLSAgICBGWF9EV09SRCBtX2R3V2lkdGgsCi0gICAgICAgICAgICAgbV9kd0hlaWdodDsKLSAgICBGWF9EV09SRCBtX2R3UmVzb2x1dGlvblgsCi0gICAgICAgICAgICAgbV9kd1Jlc29sdXRpb25ZOwotICAgIHVpbnQ4X3QgbV9jRmxhZ3M7Ci0gICAgRlhfQk9PTCBtX2JJc1N0cmlwZWQ7Ci0gICAgRlhfV09SRCBtX3dNYXhTdHJpcGVTaXplOworICBGWF9EV09SRCBtX2R3V2lkdGgsIG1fZHdIZWlnaHQ7CisgIEZYX0RXT1JEIG1fZHdSZXNvbHV0aW9uWCwgbV9kd1Jlc29sdXRpb25ZOworICB1aW50OF90IG1fY0ZsYWdzOworICBGWF9CT09MIG1fYklzU3RyaXBlZDsKKyAgRlhfV09SRCBtX3dNYXhTdHJpcGVTaXplOwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmNwcAppbmRleCBkZjQ1Mjg4Li4zNDY5YzM2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmNwcApAQCAtMSwyMiArMSwyMCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiSkJpZzJfUGF0dGVybkRpY3QuaCIKLUNKQmlnMl9QYXR0ZXJuRGljdDo6Q0pCaWcyX1BhdHRlcm5EaWN0KCkKLXsKLSAgICBOVU1QQVRTID0gMDsKLSAgICBIRFBBVFMgPSBOVUxMOworQ0pCaWcyX1BhdHRlcm5EaWN0OjpDSkJpZzJfUGF0dGVybkRpY3QoKSB7CisgIE5VTVBBVFMgPSAwOworICBIRFBBVFMgPSBOVUxMOwogfQogCi1DSkJpZzJfUGF0dGVybkRpY3Q6On5DSkJpZzJfUGF0dGVybkRpY3QoKQotewotICAgIGlmKEhEUEFUUykgewotICAgICAgICBmb3IoRlhfRFdPUkQgaSA9IDA7IGkgPCBOVU1QQVRTOyBpKyspIHsKLSAgICAgICAgICAgIGRlbGV0ZSBIRFBBVFNbaV07Ci0gICAgICAgIH0KLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEhEUEFUUyk7CitDSkJpZzJfUGF0dGVybkRpY3Q6On5DSkJpZzJfUGF0dGVybkRpY3QoKSB7CisgIGlmIChIRFBBVFMpIHsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgTlVNUEFUUzsgaSsrKSB7CisgICAgICBkZWxldGUgSERQQVRTW2ldOwogICAgIH0KKyAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoSERQQVRTKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5oCmluZGV4IGI3NWNiZGUuLmZkMzliZmQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGF0dGVybkRpY3QuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmgKQEAgLTEsMjIgKzEsMjEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBfSkJJRzJfUEFUVEVSTl9ESUNUX0hfCiAjZGVmaW5lIF9KQklHMl9QQVRURVJOX0RJQ1RfSF8KICNpbmNsdWRlICJKQmlnMl9EZWZpbmUuaCIKICNpbmNsdWRlICJKQmlnMl9JbWFnZS5oIgotY2xhc3MgQ0pCaWcyX1BhdHRlcm5EaWN0IDogcHVibGljIENKQmlnMl9PYmplY3QKLXsKLXB1YmxpYzoKK2NsYXNzIENKQmlnMl9QYXR0ZXJuRGljdCA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKQmlnMl9QYXR0ZXJuRGljdCgpOwogCi0gICAgQ0pCaWcyX1BhdHRlcm5EaWN0KCk7CisgIH5DSkJpZzJfUGF0dGVybkRpY3QoKTsKIAotICAgIH5DSkJpZzJfUGF0dGVybkRpY3QoKTsKLXB1YmxpYzoKLSAgICBGWF9EV09SRCBOVU1QQVRTOwotICAgIENKQmlnMl9JbWFnZSAqKkhEUEFUUzsKKyBwdWJsaWM6CisgIEZYX0RXT1JEIE5VTVBBVFM7CisgIENKQmlnMl9JbWFnZSoqIEhEUEFUUzsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1NlZ21lbnQuY3BwCmluZGV4IGI3ZWVkMzUuLmFmYmY3MWEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZWdtZW50LmNwcApAQCAtMSw1MyArMSw0OSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiSkJpZzJfU2VnbWVudC5oIgotQ0pCaWcyX1NlZ21lbnQ6OkNKQmlnMl9TZWdtZW50KCkKLXsKLSAgICBpbml0KCk7CitDSkJpZzJfU2VnbWVudDo6Q0pCaWcyX1NlZ21lbnQoKSB7CisgIGluaXQoKTsKIH0KLUNKQmlnMl9TZWdtZW50Ojp+Q0pCaWcyX1NlZ21lbnQoKQotewotICAgIGNsZWFuKCk7CitDSkJpZzJfU2VnbWVudDo6fkNKQmlnMl9TZWdtZW50KCkgeworICBjbGVhbigpOwogfQotdm9pZCBDSkJpZzJfU2VnbWVudDo6aW5pdCgpCi17Ci0gICAgbV9kd051bWJlciA9IDA7Ci0gICAgbV9jRmxhZ3MuYyA9IDA7Ci0gICAgbV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCA9IDA7Ci0gICAgbV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzID0gTlVMTDsKLSAgICBtX2R3UGFnZV9hc3NvY2lhdGlvbiA9IDA7Ci0gICAgbV9kd0RhdGFfbGVuZ3RoID0gMDsKLSAgICBtX2R3SGVhZGVyX0xlbmd0aCA9IDA7Ci0gICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgbV9TdGF0ZSA9IEpCSUcyX1NFR01FTlRfSEVBREVSX1VOUEFSU0VEOwotICAgIG1fblJlc3VsdFR5cGUgPSBKQklHMl9WT0lEX1BPSU5URVI7Ci0gICAgbV9SZXN1bHQudmQgPSBOVUxMOwordm9pZCBDSkJpZzJfU2VnbWVudDo6aW5pdCgpIHsKKyAgbV9kd051bWJlciA9IDA7CisgIG1fY0ZsYWdzLmMgPSAwOworICBtX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ID0gMDsKKyAgbV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzID0gTlVMTDsKKyAgbV9kd1BhZ2VfYXNzb2NpYXRpb24gPSAwOworICBtX2R3RGF0YV9sZW5ndGggPSAwOworICBtX2R3SGVhZGVyX0xlbmd0aCA9IDA7CisgIG1fcERhdGEgPSBOVUxMOworICBtX1N0YXRlID0gSkJJRzJfU0VHTUVOVF9IRUFERVJfVU5QQVJTRUQ7CisgIG1fblJlc3VsdFR5cGUgPSBKQklHMl9WT0lEX1BPSU5URVI7CisgIG1fUmVzdWx0LnZkID0gTlVMTDsKIH0KLXZvaWQgQ0pCaWcyX1NlZ21lbnQ6OmNsZWFuKCkKLXsKLSAgICBpZihtX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnMpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVycyk7Cit2b2lkIENKQmlnMl9TZWdtZW50OjpjbGVhbigpIHsKKyAgaWYgKG1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVycykgeworICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShtX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnMpOworICB9CisgIGlmIChtX1Jlc3VsdC52ZCkgeworICAgIHN3aXRjaCAobV9uUmVzdWx0VHlwZSkgeworICAgICAgY2FzZSBKQklHMl9JTUFHRV9QT0lOVEVSOgorICAgICAgICBkZWxldGUgbV9SZXN1bHQuaW07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKQklHMl9TWU1CT0xfRElDVF9QT0lOVEVSOgorICAgICAgICBkZWxldGUgbV9SZXN1bHQuc2Q7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKQklHMl9QQVRURVJOX0RJQ1RfUE9JTlRFUjoKKyAgICAgICAgZGVsZXRlIG1fUmVzdWx0LnBkOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSkJJRzJfSFVGRk1BTl9UQUJMRV9QT0lOVEVSOgorICAgICAgICBkZWxldGUgbV9SZXN1bHQuaHQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fUmVzdWx0LnZkKTsKICAgICB9Ci0gICAgaWYobV9SZXN1bHQudmQpIHsKLSAgICAgICAgc3dpdGNoKG1fblJlc3VsdFR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgSkJJRzJfSU1BR0VfUE9JTlRFUjoKLSAgICAgICAgICAgICAgICBkZWxldGUgbV9SZXN1bHQuaW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEpCSUcyX1NZTUJPTF9ESUNUX1BPSU5URVI6Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fUmVzdWx0LnNkOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBKQklHMl9QQVRURVJOX0RJQ1RfUE9JTlRFUjoKLSAgICAgICAgICAgICAgICBkZWxldGUgbV9SZXN1bHQucGQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEpCSUcyX0hVRkZNQU5fVEFCTEVfUE9JTlRFUjoKLSAgICAgICAgICAgICAgICBkZWxldGUgbV9SZXN1bHQuaHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShtX1Jlc3VsdC52ZCk7Ci0gICAgICAgIH0KLSAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZWdtZW50LmgKaW5kZXggYjYxZThlNS4uYzljNmQ1OSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZWdtZW50LmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZWdtZW50LmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgX0pCSUcyX1NFR01FTlRfSF8KQEAgLTExLDU4ICsxMSw1OCBAQAogI2luY2x1ZGUgIkpCaWcyX1BhdHRlcm5EaWN0LmgiCiAjaW5jbHVkZSAiSkJpZzJfTW9kdWxlLmgiCiAjaW5jbHVkZSAiSkJpZzJfSHVmZm1hblRhYmxlLmgiCi0jZGVmaW5lIEpCSUcyX0dFVF9JTlQzMihidWYpICgoKGJ1ZilbMF08PDI0KSB8ICgoYnVmKVsxXTw8MTYpIHwgKChidWYpWzJdPDw4KSB8IChidWYpWzNdKQotI2RlZmluZSBKQklHMl9HRVRfSU5UMTYoYnVmKSAoKChidWYpWzBdPDw4KSB8IChidWYpWzFdKQorI2RlZmluZSBKQklHMl9HRVRfSU5UMzIoYnVmKSBcCisgICgoKGJ1ZilbMF0gPDwgMjQpIHwgKChidWYpWzFdIDw8IDE2KSB8ICgoYnVmKVsyXSA8PCA4KSB8IChidWYpWzNdKQorI2RlZmluZSBKQklHMl9HRVRfSU5UMTYoYnVmKSAoKChidWYpWzBdIDw8IDgpIHwgKGJ1ZilbMV0pCiB0eXBlZGVmIGVudW0gewotICAgIEpCSUcyX1NFR01FTlRfSEVBREVSX1VOUEFSU0VELAotICAgIEpCSUcyX1NFR01FTlRfREFUQV9VTlBBUlNFRCwKLSAgICBKQklHMl9TRUdNRU5UX1BBUlNFX0NPTVBMRVRFLAotICAgIEpCSUcyX1NFR01FTlRfUEFVU0VELAotICAgIEpCSUcyX1NFR01FTlRfRVJST1IKKyAgSkJJRzJfU0VHTUVOVF9IRUFERVJfVU5QQVJTRUQsCisgIEpCSUcyX1NFR01FTlRfREFUQV9VTlBBUlNFRCwKKyAgSkJJRzJfU0VHTUVOVF9QQVJTRV9DT01QTEVURSwKKyAgSkJJRzJfU0VHTUVOVF9QQVVTRUQsCisgIEpCSUcyX1NFR01FTlRfRVJST1IKIH0gSkJpZzJfU2VnbWVudFN0YXRlOwogdHlwZWRlZiBlbnVtIHsKLSAgICBKQklHMl9WT0lEX1BPSU5URVIJPSAwLAotICAgIEpCSUcyX0lNQUdFX1BPSU5URVIsCi0gICAgSkJJRzJfU1lNQk9MX0RJQ1RfUE9JTlRFUiwKLSAgICBKQklHMl9QQVRURVJOX0RJQ1RfUE9JTlRFUiwKLSAgICBKQklHMl9IVUZGTUFOX1RBQkxFX1BPSU5URVIKKyAgSkJJRzJfVk9JRF9QT0lOVEVSID0gMCwKKyAgSkJJRzJfSU1BR0VfUE9JTlRFUiwKKyAgSkJJRzJfU1lNQk9MX0RJQ1RfUE9JTlRFUiwKKyAgSkJJRzJfUEFUVEVSTl9ESUNUX1BPSU5URVIsCisgIEpCSUcyX0hVRkZNQU5fVEFCTEVfUE9JTlRFUgogfSBKQmlnMl9SZXN1bHRUeXBlOwotY2xhc3MgQ0pCaWcyX1NlZ21lbnQgOiBwdWJsaWMgQ0pCaWcyX09iamVjdAotewotcHVibGljOgorY2xhc3MgQ0pCaWcyX1NlZ21lbnQgOiBwdWJsaWMgQ0pCaWcyX09iamVjdCB7CisgcHVibGljOgorICBDSkJpZzJfU2VnbWVudCgpOwogCi0gICAgQ0pCaWcyX1NlZ21lbnQoKTsKKyAgfkNKQmlnMl9TZWdtZW50KCk7CiAKLSAgICB+Q0pCaWcyX1NlZ21lbnQoKTsKKyAgdm9pZCBpbml0KCk7CiAKLSAgICB2b2lkIGluaXQoKTsKKyAgdm9pZCBjbGVhbigpOwogCi0gICAgdm9pZCBjbGVhbigpOwotcHVibGljOgotICAgIEZYX0RXT1JEIG1fZHdOdW1iZXI7Ci0gICAgdW5pb24gewotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgdWludDhfdCB0eXBlCQkJCQk6CTY7Ci0gICAgICAgICAgICB1aW50OF90IHBhZ2VfYXNzb2NpYXRpb25fc2l6ZQk6CTE7Ci0gICAgICAgICAgICB1aW50OF90IGRlZmVycmVkX25vbl9yZXRhaW4JCToJMTsKLSAgICAgICAgfSBzOwotICAgICAgICB1aW50OF90IGM7Ci0gICAgfSBtX2NGbGFnczsKLSAgICBpbnQzMl90IG1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7Ci0gICAgRlhfRFdPUkQgKiBtX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnM7Ci0gICAgRlhfRFdPUkQgbV9kd1BhZ2VfYXNzb2NpYXRpb247Ci0gICAgRlhfRFdPUkQgbV9kd0RhdGFfbGVuZ3RoOworIHB1YmxpYzoKKyAgRlhfRFdPUkQgbV9kd051bWJlcjsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICB1aW50OF90IHR5cGUgOiA2OworICAgICAgdWludDhfdCBwYWdlX2Fzc29jaWF0aW9uX3NpemUgOiAxOworICAgICAgdWludDhfdCBkZWZlcnJlZF9ub25fcmV0YWluIDogMTsKKyAgICB9IHM7CisgICAgdWludDhfdCBjOworICB9IG1fY0ZsYWdzOworICBpbnQzMl90IG1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7CisgIEZYX0RXT1JEKiBtX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnM7CisgIEZYX0RXT1JEIG1fZHdQYWdlX2Fzc29jaWF0aW9uOworICBGWF9EV09SRCBtX2R3RGF0YV9sZW5ndGg7CiAKLSAgICBGWF9EV09SRCBtX2R3SGVhZGVyX0xlbmd0aDsKLSAgICB1aW50OF90ICAqbV9wRGF0YTsKLSAgICBKQmlnMl9TZWdtZW50U3RhdGUgbV9TdGF0ZTsKLSAgICBKQmlnMl9SZXN1bHRUeXBlIG1fblJlc3VsdFR5cGU7Ci0gICAgdW5pb24gewotICAgICAgICBDSkJpZzJfU3ltYm9sRGljdAkqc2Q7Ci0gICAgICAgIENKQmlnMl9QYXR0ZXJuRGljdAkqcGQ7Ci0gICAgICAgIENKQmlnMl9JbWFnZQkJKmltOwotICAgICAgICBDSkJpZzJfSHVmZm1hblRhYmxlCSpodDsKLSAgICAgICAgdm9pZCoJCQkgdmQ7Ci0gICAgfSBtX1Jlc3VsdDsKKyAgRlhfRFdPUkQgbV9kd0hlYWRlcl9MZW5ndGg7CisgIHVpbnQ4X3QqIG1fcERhdGE7CisgIEpCaWcyX1NlZ21lbnRTdGF0ZSBtX1N0YXRlOworICBKQmlnMl9SZXN1bHRUeXBlIG1fblJlc3VsdFR5cGU7CisgIHVuaW9uIHsKKyAgICBDSkJpZzJfU3ltYm9sRGljdCogc2Q7CisgICAgQ0pCaWcyX1BhdHRlcm5EaWN0KiBwZDsKKyAgICBDSkJpZzJfSW1hZ2UqIGltOworICAgIENKQmlnMl9IdWZmbWFuVGFibGUqIGh0OworICAgIHZvaWQqIHZkOworICB9IG1fUmVzdWx0OwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5jcHAKaW5kZXggMGU1YjkyZi4uMjI4N2I5MSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuY3BwCkBAIC0xLDU2ICsxLDUwIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlICJKQmlnMl9TeW1ib2xEaWN0LmgiCi1DSkJpZzJfU3ltYm9sRGljdDo6Q0pCaWcyX1N5bWJvbERpY3QoKQotewotICAgIFNETlVNRVhTWU1TID0gMDsKLSAgICBTREVYU1lNUyA9IE5VTEw7Ci0gICAgbV9iQ29udGV4dFJldGFpbmVkID0gRkFMU0U7Ci0gICAgbV9nYkNvbnRleHQgPSBtX2dyQ29udGV4dCA9IE5VTEw7CitDSkJpZzJfU3ltYm9sRGljdDo6Q0pCaWcyX1N5bWJvbERpY3QoKSB7CisgIFNETlVNRVhTWU1TID0gMDsKKyAgU0RFWFNZTVMgPSBOVUxMOworICBtX2JDb250ZXh0UmV0YWluZWQgPSBGQUxTRTsKKyAgbV9nYkNvbnRleHQgPSBtX2dyQ29udGV4dCA9IE5VTEw7CiB9CiAKLUNKQmlnMl9TeW1ib2xEaWN0ICpDSkJpZzJfU3ltYm9sRGljdDo6RGVlcENvcHkoKQotewotICAgIENKQmlnMl9TeW1ib2xEaWN0ICpkc3QgPSBOVUxMOwotICAgIENKQmlnMl9TeW1ib2xEaWN0ICpzcmMgPSB0aGlzOwotICAgIGlmIChzcmMtPm1fYkNvbnRleHRSZXRhaW5lZCB8fAotICAgICAgICBzcmMtPm1fZ2JDb250ZXh0IHx8Ci0gICAgICAgIHNyYy0+bV9nckNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitDSkJpZzJfU3ltYm9sRGljdCogQ0pCaWcyX1N5bWJvbERpY3Q6OkRlZXBDb3B5KCkgeworICBDSkJpZzJfU3ltYm9sRGljdCogZHN0ID0gTlVMTDsKKyAgQ0pCaWcyX1N5bWJvbERpY3QqIHNyYyA9IHRoaXM7CisgIGlmIChzcmMtPm1fYkNvbnRleHRSZXRhaW5lZCB8fCBzcmMtPm1fZ2JDb250ZXh0IHx8IHNyYy0+bV9nckNvbnRleHQpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBKQklHMl9BTExPQyhkc3QsIENKQmlnMl9TeW1ib2xEaWN0KCkpOworICBkc3QtPlNETlVNRVhTWU1TID0gc3JjLT5TRE5VTUVYU1lNUzsKKyAgZHN0LT5TREVYU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoCisgICAgICBzaXplb2YoQ0pCaWcyX0ltYWdlKiksIHNyYy0+U0ROVU1FWFNZTVMpOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgc3JjLT5TRE5VTUVYU1lNUzsgaSsrKSB7CisgICAgaWYgKHNyYy0+U0RFWFNZTVNbaV0pIHsKKyAgICAgIEpCSUcyX0FMTE9DKGRzdC0+U0RFWFNZTVNbaV0sIENKQmlnMl9JbWFnZSgqKHNyYy0+U0RFWFNZTVNbaV0pKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRzdC0+U0RFWFNZTVNbaV0gPSBOVUxMOwogICAgIH0KLSAgICBKQklHMl9BTExPQyhkc3QsIENKQmlnMl9TeW1ib2xEaWN0KCkpOwotICAgIGRzdC0+U0ROVU1FWFNZTVMgPSBzcmMtPlNETlVNRVhTWU1TOwotICAgIGRzdC0+U0RFWFNZTVMgPSAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKAotICAgICAgICBzaXplb2YoQ0pCaWcyX0ltYWdlKiksIHNyYy0+U0ROVU1FWFNZTVMpOwotICAgIGZvcihGWF9EV09SRCBpID0gMDsgaSA8IHNyYy0+U0ROVU1FWFNZTVM7IGkrKykgewotICAgICAgICBpZiAoc3JjLT5TREVYU1lNU1tpXSkgewotICAgICAgICAgICAgSkJJRzJfQUxMT0MoZHN0LT5TREVYU1lNU1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9JbWFnZSgqKHNyYy0+U0RFWFNZTVNbaV0pKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkc3QtPlNERVhTWU1TW2ldID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZHN0OworICB9CisgIHJldHVybiBkc3Q7CiB9CiAKLUNKQmlnMl9TeW1ib2xEaWN0Ojp+Q0pCaWcyX1N5bWJvbERpY3QoKQotewotICAgIGlmKFNERVhTWU1TKSB7Ci0gICAgICAgIGZvcihGWF9EV09SRCBpID0gMDsgaSA8IFNETlVNRVhTWU1TOyBpKyspIHsKLSAgICAgICAgICAgIGRlbGV0ZSBTREVYU1lNU1tpXTsKLSAgICAgICAgfQotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0RFWFNZTVMpOworQ0pCaWcyX1N5bWJvbERpY3Q6On5DSkJpZzJfU3ltYm9sRGljdCgpIHsKKyAgaWYgKFNERVhTWU1TKSB7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IFNETlVNRVhTWU1TOyBpKyspIHsKKyAgICAgIGRlbGV0ZSBTREVYU1lNU1tpXTsKICAgICB9Ci0gICAgaWYobV9iQ29udGV4dFJldGFpbmVkKSB7Ci0gICAgICAgIGlmKG1fZ2JDb250ZXh0KSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUobV9nYkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmKG1fZ3JDb250ZXh0KSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUobV9nckNvbnRleHQpOwotICAgICAgICB9CisgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNERVhTWU1TKTsKKyAgfQorICBpZiAobV9iQ29udGV4dFJldGFpbmVkKSB7CisgICAgaWYgKG1fZ2JDb250ZXh0KSB7CisgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUobV9nYkNvbnRleHQpOwogICAgIH0KKyAgICBpZiAobV9nckNvbnRleHQpIHsKKyAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShtX2dyQ29udGV4dCk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5oCmluZGV4IDkxNTZlMzAuLjFhMDc0NDEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5oCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIF9KQklHMl9TWU1CT0xfRElDVF9IXwpAQCAtOSwxOCArOSwxNiBAQAogI2luY2x1ZGUgIkpCaWcyX0RlZmluZS5oIgogI2luY2x1ZGUgIkpCaWcyX0FyaXRoRGVjb2Rlci5oIgogI2luY2x1ZGUgIkpCaWcyX0ltYWdlLmgiCi1jbGFzcyBDSkJpZzJfU3ltYm9sRGljdCA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDSkJpZzJfU3ltYm9sRGljdCA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKQmlnMl9TeW1ib2xEaWN0KCk7CisgIENKQmlnMl9TeW1ib2xEaWN0KiBEZWVwQ29weSgpOworICB+Q0pCaWcyX1N5bWJvbERpY3QoKTsKIAotICAgIENKQmlnMl9TeW1ib2xEaWN0KCk7Ci0gICAgQ0pCaWcyX1N5bWJvbERpY3QgKkRlZXBDb3B5KCk7Ci0gICAgfkNKQmlnMl9TeW1ib2xEaWN0KCk7Ci1wdWJsaWM6Ci0gICAgRlhfRFdPUkQgU0ROVU1FWFNZTVM7Ci0gICAgQ0pCaWcyX0ltYWdlICoqU0RFWFNZTVM7Ci0gICAgRlhfQk9PTCBtX2JDb250ZXh0UmV0YWluZWQ7Ci0gICAgSkJpZzJBcml0aEN0eCAqbV9nYkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAqbV9nckNvbnRleHQ7CisgcHVibGljOgorICBGWF9EV09SRCBTRE5VTUVYU1lNUzsKKyAgQ0pCaWcyX0ltYWdlKiogU0RFWFNZTVM7CisgIEZYX0JPT0wgbV9iQ29udGV4dFJldGFpbmVkOworICBKQmlnMkFyaXRoQ3R4ICptX2diQ29udGV4dCwgKm1fZ3JDb250ZXh0OwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sYm1wL2Z4X2JtcC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2xibXAvZnhfYm1wLmNwcAppbmRleCA3NTUzZWM3Li45OGJjZWZkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xibXAvZnhfYm1wLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2xibXAvZnhfYm1wLmNwcApAQCAtNSw5MTMgKzUsOTU4IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICJmeF9ibXAuaCINCi1GWF9EV09SRCBfR2V0RFdvcmRfTFNCRmlyc3QodWludDhfdCogcCkNCi17DQotICAgIHJldHVybiBwWzBdIHwgKHBbMV0gPDwgOCkgfCAocFsyXSA8PCAxNikgfCAocFszXSA8PCAyNCk7DQorRlhfRFdPUkQgX0dldERXb3JkX0xTQkZpcnN0KHVpbnQ4X3QqIHApIHsNCisgIHJldHVybiBwWzBdIHwgKHBbMV0gPDwgOCkgfCAocFsyXSA8PCAxNikgfCAocFszXSA8PCAyNCk7DQogfQ0KLUZYX1dPUkQgX0dldFdvcmRfTFNCRmlyc3QodWludDhfdCogcCkNCi17DQotICAgIHJldHVybiBwWzBdIHwgKHBbMV0gPDwgOCk7DQorRlhfV09SRCBfR2V0V29yZF9MU0JGaXJzdCh1aW50OF90KiBwKSB7DQorICByZXR1cm4gcFswXSB8IChwWzFdIDw8IDgpOw0KIH0NCi12b2lkIF9TZXREV29yZF9MU0JGaXJzdCh1aW50OF90KiBwLCBGWF9EV09SRCB2KQ0KLXsNCi0gICAgcFswXSA9ICh1aW50OF90KXY7DQotICAgIHBbMV0gPSAodWludDhfdCkodiA+PiA4KTsNCi0gICAgcFsyXSA9ICh1aW50OF90KSh2ID4+IDE2KTsNCi0gICAgcFszXSA9ICh1aW50OF90KSh2ID4+IDI0KTsNCit2b2lkIF9TZXREV29yZF9MU0JGaXJzdCh1aW50OF90KiBwLCBGWF9EV09SRCB2KSB7DQorICBwWzBdID0gKHVpbnQ4X3QpdjsNCisgIHBbMV0gPSAodWludDhfdCkodiA+PiA4KTsNCisgIHBbMl0gPSAodWludDhfdCkodiA+PiAxNik7DQorICBwWzNdID0gKHVpbnQ4X3QpKHYgPj4gMjQpOw0KIH0NCi12b2lkIF9TZXRXb3JkX0xTQkZpcnN0KHVpbnQ4X3QqIHAsIEZYX1dPUkQgdikNCi17DQotICAgIHBbMF0gPSAodWludDhfdCl2Ow0KLSAgICBwWzFdID0gKHVpbnQ4X3QpKHYgPj4gOCk7DQordm9pZCBfU2V0V29yZF9MU0JGaXJzdCh1aW50OF90KiBwLCBGWF9XT1JEIHYpIHsNCisgIHBbMF0gPSAodWludDhfdCl2Ow0KKyAgcFsxXSA9ICh1aW50OF90KSh2ID4+IDgpOw0KIH0NCi12b2lkIF9ibXBfZXJyb3IoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgY29uc3QgRlhfQ0hBUiogZXJyX21zZykNCi17DQotICAgIGlmKGJtcF9wdHIgIT0gTlVMTCAmJiBibXBfcHRyLT5fYm1wX2Vycm9yX2ZuICE9IE5VTEwpIHsNCi0gICAgICAgIGJtcF9wdHItPl9ibXBfZXJyb3JfZm4oYm1wX3B0ciwgZXJyX21zZyk7DQotICAgIH0NCit2b2lkIF9ibXBfZXJyb3IoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgY29uc3QgRlhfQ0hBUiogZXJyX21zZykgew0KKyAgaWYgKGJtcF9wdHIgIT0gTlVMTCAmJiBibXBfcHRyLT5fYm1wX2Vycm9yX2ZuICE9IE5VTEwpIHsNCisgICAgYm1wX3B0ci0+X2JtcF9lcnJvcl9mbihibXBfcHRyLCBlcnJfbXNnKTsNCisgIH0NCiB9DQotYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgX2JtcF9jcmVhdGVfZGVjb21wcmVzcygpDQotew0KLSAgICBibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyID0gRlhfQWxsb2MoYm1wX2RlY29tcHJlc3Nfc3RydWN0LCAxKTsNCi0gICAgaWYoYm1wX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBGWFNZU19tZW1zZXQoYm1wX3B0ciwgMCwgc2l6ZW9mKGJtcF9kZWNvbXByZXNzX3N0cnVjdCkpOw0KLSAgICBibXBfcHRyLT5kZWNvZGVfc3RhdHVzID0gQk1QX0RfU1RBVFVTX0hFQURFUjsNCi0gICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHIgPSBGWF9BbGxvYyhCbXBGaWxlSGVhZGVyLCAxKTsNCi0gICAgcmV0dXJuIGJtcF9wdHI7DQorYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgX2JtcF9jcmVhdGVfZGVjb21wcmVzcygpIHsNCisgIGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIgPSBGWF9BbGxvYyhibXBfZGVjb21wcmVzc19zdHJ1Y3QsIDEpOw0KKyAgaWYgKGJtcF9wdHIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZYU1lTX21lbXNldChibXBfcHRyLCAwLCBzaXplb2YoYm1wX2RlY29tcHJlc3Nfc3RydWN0KSk7DQorICBibXBfcHRyLT5kZWNvZGVfc3RhdHVzID0gQk1QX0RfU1RBVFVTX0hFQURFUjsNCisgIGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyID0gRlhfQWxsb2MoQm1wRmlsZUhlYWRlciwgMSk7DQorICByZXR1cm4gYm1wX3B0cjsNCiB9DQotdm9pZCBfYm1wX2Rlc3Ryb3lfZGVjb21wcmVzcyhibXBfZGVjb21wcmVzc19zdHJ1Y3RfcHAgYm1wX3B0cl9wdHIpDQotew0KLSAgICBpZihibXBfcHRyX3B0ciA9PSBOVUxMIHx8ICpibXBfcHRyX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciA9ICpibXBfcHRyX3B0cjsNCi0gICAgKmJtcF9wdHJfcHRyID0gTlVMTDsNCi0gICAgaWYoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgIT0gTlVMTCkgew0KLSAgICAgICAgRlhfRnJlZShibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7DQotICAgIH0NCi0gICAgaWYoYm1wX3B0ci0+cGFsX3B0ciAhPSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKGJtcF9wdHItPnBhbF9wdHIpOw0KLSAgICB9DQotICAgIGlmKGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyICE9IE5VTEwpCXsNCi0gICAgICAgIEZYX0ZyZWUoYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHIpOw0KLSAgICB9DQotICAgIEZYX0ZyZWUoYm1wX3B0cik7DQordm9pZCBfYm1wX2Rlc3Ryb3lfZGVjb21wcmVzcyhibXBfZGVjb21wcmVzc19zdHJ1Y3RfcHAgYm1wX3B0cl9wdHIpIHsNCisgIGlmIChibXBfcHRyX3B0ciA9PSBOVUxMIHx8ICpibXBfcHRyX3B0ciA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIgPSAqYm1wX3B0cl9wdHI7DQorICAqYm1wX3B0cl9wdHIgPSBOVUxMOw0KKyAgaWYgKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7DQorICB9DQorICBpZiAoYm1wX3B0ci0+cGFsX3B0ciAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoYm1wX3B0ci0+cGFsX3B0cik7DQorICB9DQorICBpZiAoYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHIgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyKTsNCisgIH0NCisgIEZYX0ZyZWUoYm1wX3B0cik7DQogfQ0KLWludDMyX3QgX2JtcF9yZWFkX2hlYWRlcihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKQ0KLXsNCi0gICAgaWYoYm1wX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gMDsNCitpbnQzMl90IF9ibXBfcmVhZF9oZWFkZXIoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikgew0KKyAgaWYgKGJtcF9wdHIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBibXBfcHRyLT5za2lwX3NpemU7DQorICBpZiAoYm1wX3B0ci0+ZGVjb2RlX3N0YXR1cyA9PSBCTVBfRF9TVEFUVVNfSEVBREVSKSB7DQorICAgIEFTU0VSVChzaXplb2YoQm1wRmlsZUhlYWRlcikgPT0gMTQpOw0KKyAgICBCbXBGaWxlSGVhZGVyKiBibXBfaGVhZGVyX3B0ciA9IE5VTEw7DQorICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAodWludDhfdCoqKSZibXBfaGVhZGVyX3B0ciwgMTQpID09IE5VTEwpIHsNCisgICAgICByZXR1cm4gMjsNCiAgICAgfQ0KLSAgICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gYm1wX3B0ci0+c2tpcF9zaXplOw0KLSAgICBpZihibXBfcHRyLT5kZWNvZGVfc3RhdHVzID09IEJNUF9EX1NUQVRVU19IRUFERVIpIHsNCi0gICAgICAgIEFTU0VSVChzaXplb2YoQm1wRmlsZUhlYWRlcikgPT0gMTQpOw0KLSAgICAgICAgQm1wRmlsZUhlYWRlciogYm1wX2hlYWRlcl9wdHIgPSBOVUxMOw0KLSAgICAgICAgaWYoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgKHVpbnQ4X3QqKikmYm1wX2hlYWRlcl9wdHIsIDE0KSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgIGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyLT5iZlR5cGUgPQ0KKyAgICAgICAgX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaGVhZGVyX3B0ci0+YmZUeXBlKTsNCisgICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cyA9DQorICAgICAgICBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzKTsNCisgICAgYm1wX3B0ci0+ZGF0YV9zaXplID0gX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2hlYWRlcl9wdHItPmJmU2l6ZSk7DQorICAgIGlmIChibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZUeXBlICE9IEJNUF9TSUdOQVRVUkUpIHsNCisgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJOb3QgQSBCbXAgSW1hZ2UiKTsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAoYm1wX3B0ci0+YXZhaWxfaW4gPCBzaXplb2YoRlhfRFdPUkQpKSB7DQorICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBibXBfcHRyLT5pbWdfaWZoX3NpemUgPQ0KKyAgICAgICAgX0dldERXb3JkX0xTQkZpcnN0KGJtcF9wdHItPm5leHRfaW4gKyBibXBfcHRyLT5za2lwX3NpemUpOw0KKyAgICBibXBfcHRyLT5wYWxfdHlwZSA9IDA7DQorICAgIEFTU0VSVChzaXplb2YoQm1wQ29yZUhlYWRlcikgPT0gMTIpOw0KKyAgICBBU1NFUlQoc2l6ZW9mKEJtcEluZm9IZWFkZXIpID09IDQwKTsNCisgICAgc3dpdGNoIChibXBfcHRyLT5pbWdfaWZoX3NpemUpIHsNCisgICAgICBjYXNlIEZYX01JTigxMiwgc2l6ZW9mKEJtcENvcmVIZWFkZXIpKTogew0KKyAgICAgICAgYm1wX3B0ci0+cGFsX3R5cGUgPSAxOw0KKyAgICAgICAgQm1wQ29yZUhlYWRlclB0ciBibXBfY29yZV9oZWFkZXJfcHRyID0gTlVMTDsNCisgICAgICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAodWludDhfdCoqKSZibXBfY29yZV9oZWFkZXJfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkgPT0gTlVMTCkgew0KKyAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICByZXR1cm4gMjsNCiAgICAgICAgIH0NCi0gICAgICAgIGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyLT5iZlR5cGUgPSBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9oZWFkZXJfcHRyLT5iZlR5cGUpOw0KLSAgICAgICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cyA9IF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9oZWFkZXJfcHRyLT5iZk9mZkJpdHMpOw0KLSAgICAgICAgYm1wX3B0ci0+ZGF0YV9zaXplID0gX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2hlYWRlcl9wdHItPmJmU2l6ZSk7DQotICAgICAgICBpZihibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZUeXBlICE9IEJNUF9TSUdOQVRVUkUpIHsNCi0gICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJOb3QgQSBCbXAgSW1hZ2UiKTsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIGJtcF9wdHItPndpZHRoID0gKEZYX0RXT1JEKV9HZXRXb3JkX0xTQkZpcnN0KA0KKyAgICAgICAgICAgICh1aW50OF90KikmYm1wX2NvcmVfaGVhZGVyX3B0ci0+YmNXaWR0aCk7DQorICAgICAgICBibXBfcHRyLT5oZWlnaHQgPSAoRlhfRFdPUkQpX0dldFdvcmRfTFNCRmlyc3QoDQorICAgICAgICAgICAgKHVpbnQ4X3QqKSZibXBfY29yZV9oZWFkZXJfcHRyLT5iY0hlaWdodCk7DQorICAgICAgICBibXBfcHRyLT5iaXRDb3VudHMgPQ0KKyAgICAgICAgICAgIF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2NvcmVfaGVhZGVyX3B0ci0+YmNCaXRDb3VudCk7DQorICAgICAgICBibXBfcHRyLT5jb21wcmVzc19mbGFnID0gQk1QX1JHQjsNCisgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPSBGQUxTRTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRlhfTUlOKDQwLCBzaXplb2YoQm1wSW5mb0hlYWRlcikpOiB7DQorICAgICAgICBCbXBJbmZvSGVhZGVyUHRyIGJtcF9pbmZvX2hlYWRlcl9wdHIgPSBOVUxMOw0KKyAgICAgICAgaWYgKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICh1aW50OF90KiopJmJtcF9pbmZvX2hlYWRlcl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+aW1nX2lmaF9zaXplKSA9PSBOVUxMKSB7DQorICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgIHJldHVybiAyOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYoYm1wX3B0ci0+YXZhaWxfaW4gPCBzaXplb2YoRlhfRFdPUkQpKSB7DQorICAgICAgICBibXBfcHRyLT53aWR0aCA9DQorICAgICAgICAgICAgX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlXaWR0aCk7DQorICAgICAgICBibXBfcHRyLT5oZWlnaHQgPQ0KKyAgICAgICAgICAgIF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpSGVpZ2h0KTsNCisgICAgICAgIGJtcF9wdHItPmJpdENvdW50cyA9DQorICAgICAgICAgICAgX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaUJpdENvdW50KTsNCisgICAgICAgIGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPQ0KKyAgICAgICAgICAgIF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQ29tcHJlc3Npb24pOw0KKyAgICAgICAgYm1wX3B0ci0+Y29sb3JfdXNlZCA9DQorICAgICAgICAgICAgX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlDbHJVc2VkKTsNCisgICAgICAgIGJtcF9wdHItPmRwaV94ID0gKGludDMyX3QpX0dldERXb3JkX0xTQkZpcnN0KA0KKyAgICAgICAgICAgICh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlYUGVsc1Blck1ldGVyKTsNCisgICAgICAgIGJtcF9wdHItPmRwaV95ID0gKGludDMyX3QpX0dldERXb3JkX0xTQkZpcnN0KA0KKyAgICAgICAgICAgICh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlZUGVsc1Blck1ldGVyKTsNCisgICAgICAgIGlmIChibXBfcHRyLT5oZWlnaHQgPCAwKSB7DQorICAgICAgICAgIGJtcF9wdHItPmhlaWdodCA9IC1ibXBfcHRyLT5oZWlnaHQ7DQorICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgaWYgKGJtcF9wdHItPmltZ19pZmhfc2l6ZSA+IEZYX01JTig0MCwgc2l6ZW9mKEJtcEluZm9IZWFkZXIpKSkgew0KKyAgICAgICAgICBCbXBJbmZvSGVhZGVyUHRyIGJtcF9pbmZvX2hlYWRlcl9wdHIgPSBOVUxMOw0KKyAgICAgICAgICBpZiAoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgKHVpbnQ4X3QqKikmYm1wX2luZm9faGVhZGVyX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkgPT0gTlVMTCkgew0KICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQogICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhfV09SRCBiaVBsYW5lczsNCisgICAgICAgICAgYm1wX3B0ci0+d2lkdGggPQ0KKyAgICAgICAgICAgICAgX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlXaWR0aCk7DQorICAgICAgICAgIGJtcF9wdHItPmhlaWdodCA9DQorICAgICAgICAgICAgICBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaUhlaWdodCk7DQorICAgICAgICAgIGJtcF9wdHItPmJpdENvdW50cyA9DQorICAgICAgICAgICAgICBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQml0Q291bnQpOw0KKyAgICAgICAgICBibXBfcHRyLT5jb21wcmVzc19mbGFnID0NCisgICAgICAgICAgICAgIF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQ29tcHJlc3Npb24pOw0KKyAgICAgICAgICBibXBfcHRyLT5jb2xvcl91c2VkID0NCisgICAgICAgICAgICAgIF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQ2xyVXNlZCk7DQorICAgICAgICAgIGJpUGxhbmVzID0NCisgICAgICAgICAgICAgIF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlQbGFuZXMpOw0KKyAgICAgICAgICBibXBfcHRyLT5kcGlfeCA9IF9HZXREV29yZF9MU0JGaXJzdCgNCisgICAgICAgICAgICAgICh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlYUGVsc1Blck1ldGVyKTsNCisgICAgICAgICAgYm1wX3B0ci0+ZHBpX3kgPSBfR2V0RFdvcmRfTFNCRmlyc3QoDQorICAgICAgICAgICAgICAodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpWVBlbHNQZXJNZXRlcik7DQorICAgICAgICAgIGlmIChibXBfcHRyLT5oZWlnaHQgPCAwKSB7DQorICAgICAgICAgICAgYm1wX3B0ci0+aGVpZ2h0ID0gLWJtcF9wdHItPmhlaWdodDsNCisgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID0gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYm1wX3B0ci0+Y29tcHJlc3NfZmxhZyA9PSBCTVBfUkdCICYmIGJpUGxhbmVzID09IDEgJiYNCisgICAgICAgICAgICAgIGJtcF9wdHItPmNvbG9yX3VzZWQgPT0gMCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBibXBfcHRyLT5pbWdfaWZoX3NpemUgPSBfR2V0RFdvcmRfTFNCRmlyc3QoYm1wX3B0ci0+bmV4dF9pbiArIGJtcF9wdHItPnNraXBfc2l6ZSk7DQotICAgICAgICBibXBfcHRyLT5wYWxfdHlwZSA9IDA7DQotICAgICAgICBBU1NFUlQoc2l6ZW9mKEJtcENvcmVIZWFkZXIpID09IDEyKTsNCi0gICAgICAgIEFTU0VSVChzaXplb2YoQm1wSW5mb0hlYWRlcikgPT0gNDApOw0KLSAgICAgICAgc3dpdGNoKGJtcF9wdHItPmltZ19pZmhfc2l6ZSkgew0KLSAgICAgICAgICAgIGNhc2UgRlhfTUlOKDEyLCBzaXplb2YoQm1wQ29yZUhlYWRlcikpOiB7DQotICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5wYWxfdHlwZSA9IDE7DQotICAgICAgICAgICAgICAgICAgICBCbXBDb3JlSGVhZGVyUHRyIGJtcF9jb3JlX2hlYWRlcl9wdHIgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgKHVpbnQ4X3QqKikmYm1wX2NvcmVfaGVhZGVyX3B0ciwgYm1wX3B0ci0+aW1nX2lmaF9zaXplKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPndpZHRoID0gKEZYX0RXT1JEKV9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2NvcmVfaGVhZGVyX3B0ci0+YmNXaWR0aCk7DQotICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5oZWlnaHQgPSAoRlhfRFdPUkQpX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfY29yZV9oZWFkZXJfcHRyLT5iY0hlaWdodCk7DQotICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5iaXRDb3VudHMgPSBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9jb3JlX2hlYWRlcl9wdHItPmJjQml0Q291bnQpOw0KLSAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Y29tcHJlc3NfZmxhZyA9IEJNUF9SR0I7DQotICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGWF9NSU4oNDAsIHNpemVvZihCbXBJbmZvSGVhZGVyKSk6IHsNCi0gICAgICAgICAgICAgICAgICAgIEJtcEluZm9IZWFkZXJQdHIgYm1wX2luZm9faGVhZGVyX3B0ciA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAodWludDhfdCoqKSZibXBfaW5mb19oZWFkZXJfcHRyLCBibXBfcHRyLT5pbWdfaWZoX3NpemUpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+d2lkdGggPSBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaVdpZHRoKTsNCi0gICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmhlaWdodCA9IF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpSGVpZ2h0KTsNCi0gICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmJpdENvdW50cyA9IF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlCaXRDb3VudCk7DQotICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5jb21wcmVzc19mbGFnID0gX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlDb21wcmVzc2lvbik7DQotICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5jb2xvcl91c2VkID0gX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlDbHJVc2VkKTsNCi0gICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmRwaV94ID0gKGludDMyX3QpX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlYUGVsc1Blck1ldGVyKTsNCi0gICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmRwaV95ID0gKGludDMyX3QpX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlZUGVsc1Blck1ldGVyKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGJtcF9wdHItPmhlaWdodCA8IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5oZWlnaHQgPSAtYm1wX3B0ci0+aGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGJtcF9wdHItPmltZ19pZmhfc2l6ZSA+IEZYX01JTig0MCwgc2l6ZW9mKEJtcEluZm9IZWFkZXIpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJtcEluZm9IZWFkZXJQdHIgYm1wX2luZm9faGVhZGVyX3B0ciA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgKHVpbnQ4X3QqKikmYm1wX2luZm9faGVhZGVyX3B0ciwgYm1wX3B0ci0+aW1nX2lmaF9zaXplKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIGJpUGxhbmVzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPndpZHRoID0gX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlXaWR0aCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+aGVpZ2h0ID0gX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlIZWlnaHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmJpdENvdW50cyA9IF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlCaXRDb3VudCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Y29tcHJlc3NfZmxhZyA9IF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQ29tcHJlc3Npb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbG9yX3VzZWQgPSBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaUNsclVzZWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJpUGxhbmVzID0gX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaVBsYW5lcyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+ZHBpX3ggPSBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaVhQZWxzUGVyTWV0ZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmRwaV95ID0gX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlZUGVsc1Blck1ldGVyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihibXBfcHRyLT5oZWlnaHQgPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmhlaWdodCA9IC1ibXBfcHRyLT5oZWlnaHQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihibXBfcHRyLT5jb21wcmVzc19mbGFnID09IEJNUF9SR0IgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpUGxhbmVzID09IDEgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbG9yX3VzZWQgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJVbnN1cHBvcnRlZCBCbXAgRmlsZSIpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEFTU0VSVChibXBfcHRyLT53aWR0aCA+IDApOw0KLSAgICAgICAgQVNTRVJUKGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPD0gQk1QX0JJVEZJRUxEUyk7DQotICAgICAgICBzd2l0Y2goYm1wX3B0ci0+Yml0Q291bnRzKSB7DQotICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICBjYXNlIDg6DQotICAgICAgICAgICAgY2FzZSAxNjoNCi0gICAgICAgICAgICBjYXNlIDI0OiB7DQotICAgICAgICAgICAgICAgICAgICBpZihibXBfcHRyLT5jb2xvcl91c2VkID4gKChGWF9EV09SRCkxKSA8PCBibXBfcHRyLT5iaXRDb3VudHMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSAzMjogew0KLSAgICAgICAgICAgICAgICAgICAgaWYoYm1wX3B0ci0+d2lkdGggPD0gMCB8fCBibXBfcHRyLT5jb21wcmVzc19mbGFnID4gQk1QX0JJVEZJRUxEUykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgICAgICBibXBfcHRyLT5zcmNfcm93X2J5dGVzID0gQk1QX1dJRFRIQllURVMoYm1wX3B0ci0+d2lkdGgsIGJtcF9wdHItPmJpdENvdW50cyk7DQotICAgICAgICBzd2l0Y2goYm1wX3B0ci0+Yml0Q291bnRzKSB7DQotICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICBjYXNlIDg6DQotICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgPSBCTVBfV0lEVEhCWVRFUyhibXBfcHRyLT53aWR0aCwgOCk7DQotICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbXBvbmVudHMgPSAxOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIDE2Og0KLSAgICAgICAgICAgIGNhc2UgMjQ6DQotICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgPSBCTVBfV0lEVEhCWVRFUyhibXBfcHRyLT53aWR0aCwgMjQpOw0KLSAgICAgICAgICAgICAgICBibXBfcHRyLT5jb21wb25lbnRzID0gMzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAzMjoNCi0gICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyA9IGJtcF9wdHItPnNyY19yb3dfYnl0ZXM7DQotICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbXBvbmVudHMgPSA0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBGWF9GcmVlKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsNCi0gICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlciA9IE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOw0KLSAgICAgICAgQk1QX1BUUl9OT1RfTlVMTChibXBfcHRyLT5vdXRfcm93X2J1ZmZlciwgYm1wX3B0cik7DQotICAgICAgICBGWFNZU19tZW1zZXQoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIsIDAsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOw0KLSAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfUEFMKTsNCisgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlVuc3VwcG9ydGVkIEJtcCBGaWxlIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPT0gQk1QX0RfU1RBVFVTX1BBTCkgew0KLSAgICAgICAgc2tpcF9zaXplX29yZyA9IGJtcF9wdHItPnNraXBfc2l6ZTsNCi0jaWZkZWYgQk1QX1NVUFBPUlRfQklURklFTEQNCi0gICAgICAgIGlmKGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPT0gQk1QX0JJVEZJRUxEUykgew0KLSAgICAgICAgICAgIGlmKGJtcF9wdHItPmJpdENvdW50cyAhPSAxNiAmJiBibXBfcHRyLT5iaXRDb3VudHMgIT0gMzIpIHsNCi0gICAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYX0RXT1JEKiBtYXNrOw0KLSAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICh1aW50OF90KiopJm1hc2ssIDMgKiBzaXplb2YoRlhfRFdPUkQpKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQotICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBibXBfcHRyLT5tYXNrX3JlZAk9IF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJm1hc2tbMF0pOw0KLSAgICAgICAgICAgIGJtcF9wdHItPm1hc2tfZ3JlZW4JPSBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZtYXNrWzFdKTsNCi0gICAgICAgICAgICBibXBfcHRyLT5tYXNrX2JsdWUJPSBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZtYXNrWzJdKTsNCi0gICAgICAgICAgICBpZihibXBfcHRyLT5tYXNrX3JlZCAmIGJtcF9wdHItPm1hc2tfZ3JlZW4gfHwNCi0gICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm1hc2tfcmVkICYgYm1wX3B0ci0+bWFza19ibHVlIHx8DQotICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5tYXNrX2dyZWVuICYgYm1wX3B0ci0+bWFza19ibHVlKSB7DQotICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCaXRmaWVsZCBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQotICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzIDwgMjYgKyBibXBfcHRyLT5pbWdfaWZoX3NpemUpIHsNCi0gICAgICAgICAgICAgICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cyA9IDI2ICsgYm1wX3B0ci0+aW1nX2lmaF9zaXplOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBX1BSRSk7DQotICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICB9IGVsc2UgaWYoYm1wX3B0ci0+Yml0Q291bnRzID09IDE2KSB7DQotICAgICAgICAgICAgYm1wX3B0ci0+bWFza19yZWQJPSAweDdDMDA7DQotICAgICAgICAgICAgYm1wX3B0ci0+bWFza19ncmVlbiA9IDB4MDNFMDsNCi0gICAgICAgICAgICBibXBfcHRyLT5tYXNrX2JsdWUJPSAweDAwMUY7DQorICAgIEFTU0VSVChibXBfcHRyLT53aWR0aCA+IDApOw0KKyAgICBBU1NFUlQoYm1wX3B0ci0+Y29tcHJlc3NfZmxhZyA8PSBCTVBfQklURklFTERTKTsNCisgICAgc3dpdGNoIChibXBfcHRyLT5iaXRDb3VudHMpIHsNCisgICAgICBjYXNlIDE6DQorICAgICAgY2FzZSA0Og0KKyAgICAgIGNhc2UgODoNCisgICAgICBjYXNlIDE2Og0KKyAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgIGlmIChibXBfcHRyLT5jb2xvcl91c2VkID4gKChGWF9EV09SRCkxKSA8PCBibXBfcHRyLT5iaXRDb3VudHMpIHsNCisgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCisgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGNhc2UgMzI6IHsNCisgICAgICAgIGlmIChibXBfcHRyLT53aWR0aCA8PSAwIHx8IGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPiBCTVBfQklURklFTERTKSB7DQorICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBibXBfcHRyLT5zcmNfcm93X2J5dGVzID0gQk1QX1dJRFRIQllURVMoYm1wX3B0ci0+d2lkdGgsIGJtcF9wdHItPmJpdENvdW50cyk7DQorICAgIHN3aXRjaCAoYm1wX3B0ci0+Yml0Q291bnRzKSB7DQorICAgICAgY2FzZSAxOg0KKyAgICAgIGNhc2UgNDoNCisgICAgICBjYXNlIDg6DQorICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J5dGVzID0gQk1QX1dJRFRIQllURVMoYm1wX3B0ci0+d2lkdGgsIDgpOw0KKyAgICAgICAgYm1wX3B0ci0+Y29tcG9uZW50cyA9IDE7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDE2Og0KKyAgICAgIGNhc2UgMjQ6DQorICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J5dGVzID0gQk1QX1dJRFRIQllURVMoYm1wX3B0ci0+d2lkdGgsIDI0KTsNCisgICAgICAgIGJtcF9wdHItPmNvbXBvbmVudHMgPSAzOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAzMjoNCisgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgPSBibXBfcHRyLT5zcmNfcm93X2J5dGVzOw0KKyAgICAgICAgYm1wX3B0ci0+Y29tcG9uZW50cyA9IDQ7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgIT0gTlVMTCkgew0KKyAgICAgIEZYX0ZyZWUoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KKyAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyID0gTlVMTDsNCisgICAgfQ0KKyAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOw0KKyAgICBCTVBfUFRSX05PVF9OVUxMKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCBibXBfcHRyKTsNCisgICAgRlhTWVNfbWVtc2V0KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCAwLCBibXBfcHRyLT5vdXRfcm93X2J5dGVzKTsNCisgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfUEFMKTsNCisgIH0NCisgIGlmIChibXBfcHRyLT5kZWNvZGVfc3RhdHVzID09IEJNUF9EX1NUQVRVU19QQUwpIHsNCisgICAgc2tpcF9zaXplX29yZyA9IGJtcF9wdHItPnNraXBfc2l6ZTsNCisjaWZkZWYgQk1QX1NVUFBPUlRfQklURklFTEQNCisgICAgaWYgKGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPT0gQk1QX0JJVEZJRUxEUykgew0KKyAgICAgIGlmIChibXBfcHRyLT5iaXRDb3VudHMgIT0gMTYgJiYgYm1wX3B0ci0+Yml0Q291bnRzICE9IDMyKSB7DQorICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgICAgfQ0KKyAgICAgIEZYX0RXT1JEKiBtYXNrOw0KKyAgICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAodWludDhfdCoqKSZtYXNrLCAzICogc2l6ZW9mKEZYX0RXT1JEKSkgPT0NCisgICAgICAgICAgTlVMTCkgew0KKyAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICAgIH0NCisgICAgICBibXBfcHRyLT5tYXNrX3JlZCA9IF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJm1hc2tbMF0pOw0KKyAgICAgIGJtcF9wdHItPm1hc2tfZ3JlZW4gPSBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZtYXNrWzFdKTsNCisgICAgICBibXBfcHRyLT5tYXNrX2JsdWUgPSBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZtYXNrWzJdKTsNCisgICAgICBpZiAoYm1wX3B0ci0+bWFza19yZWQgJiBibXBfcHRyLT5tYXNrX2dyZWVuIHx8DQorICAgICAgICAgIGJtcF9wdHItPm1hc2tfcmVkICYgYm1wX3B0ci0+bWFza19ibHVlIHx8DQorICAgICAgICAgIGJtcF9wdHItPm1hc2tfZ3JlZW4gJiBibXBfcHRyLT5tYXNrX2JsdWUpIHsNCisgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCaXRmaWVsZCBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgICB9DQorICAgICAgaWYgKGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyLT5iZk9mZkJpdHMgPCAyNiArIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkgew0KKyAgICAgICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cyA9IDI2ICsgYm1wX3B0ci0+aW1nX2lmaF9zaXplOw0KKyAgICAgIH0NCisgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBX1BSRSk7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0gZWxzZSBpZiAoYm1wX3B0ci0+Yml0Q291bnRzID09IDE2KSB7DQorICAgICAgYm1wX3B0ci0+bWFza19yZWQgPSAweDdDMDA7DQorICAgICAgYm1wX3B0ci0+bWFza19ncmVlbiA9IDB4MDNFMDsNCisgICAgICBibXBfcHRyLT5tYXNrX2JsdWUgPSAweDAwMUY7DQorICAgIH0NCiAjZWxzZQ0KLSAgICAgICAgaWYoYm1wX3B0ci0+Y29tcHJlc3NfZmxhZyA9PSBCTVBfQklURklFTERTIHx8IGJtcF9wdHItPmJpdENvdW50cyA9PSAxNikgew0KLSAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlVuc3VwcG9ydGVkIEJpdGZpZWxkIEJtcCBGaWxlIik7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQorICAgIGlmIChibXBfcHRyLT5jb21wcmVzc19mbGFnID09IEJNUF9CSVRGSUVMRFMgfHwgYm1wX3B0ci0+Yml0Q291bnRzID09IDE2KSB7DQorICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVW5zdXBwb3J0ZWQgQml0ZmllbGQgQm1wIEZpbGUiKTsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KICNlbmRpZg0KLSAgICAgICAgYm1wX3B0ci0+cGFsX251bSA9IDA7DQotICAgICAgICBpZihibXBfcHRyLT5iaXRDb3VudHMgPCAxNikgew0KLSAgICAgICAgICAgIGJtcF9wdHItPnBhbF9udW0gPSAxIDw8IGJtcF9wdHItPmJpdENvdW50czsNCi0gICAgICAgICAgICBpZihibXBfcHRyLT5jb2xvcl91c2VkICE9IDApIHsNCi0gICAgICAgICAgICAgICAgYm1wX3B0ci0+cGFsX251bSA9IGJtcF9wdHItPmNvbG9yX3VzZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19wYWxfcHRyID0gTlVMTDsNCi0gICAgICAgICAgICBGWF9EV09SRCBzcmNfcGFsX3NpemUgPSBibXBfcHRyLT5wYWxfbnVtICogKGJtcF9wdHItPnBhbF90eXBlID8gMyA6IDQpOw0KLSAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICh1aW50OF90KiopJnNyY19wYWxfcHRyLCBzcmNfcGFsX3NpemUpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKGJtcF9wdHItPnBhbF9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBGWF9GcmVlKGJtcF9wdHItPnBhbF9wdHIpOw0KLSAgICAgICAgICAgICAgICBibXBfcHRyLT5wYWxfcHRyID0gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYm1wX3B0ci0+cGFsX3B0ciA9IEZYX0FsbG9jKEZYX0RXT1JELCBibXBfcHRyLT5wYWxfbnVtKTsNCi0gICAgICAgICAgICBCTVBfUFRSX05PVF9OVUxMKGJtcF9wdHItPnBhbF9wdHIsIGJtcF9wdHIpOw0KLSAgICAgICAgICAgIGludDMyX3Qgc3JjX3BhbF9pbmRleCA9IDA7DQotICAgICAgICAgICAgaWYoYm1wX3B0ci0+cGFsX3R5cGUgPT0gQk1QX1BBTF9PTEQpIHsNCi0gICAgICAgICAgICAgICAgd2hpbGUoc3JjX3BhbF9pbmRleCA8IGJtcF9wdHItPnBhbF9udW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPnBhbF9wdHJbc3JjX3BhbF9pbmRleCsrXSA9IEJNUF9QQUxfRU5DT0RFKDB4MDAsIHNyY19wYWxfcHRyWzJdLCBzcmNfcGFsX3B0clsxXSwgc3JjX3BhbF9wdHJbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgc3JjX3BhbF9wdHIgKz0gMzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHdoaWxlKHNyY19wYWxfaW5kZXggPCBibXBfcHRyLT5wYWxfbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5wYWxfcHRyW3NyY19wYWxfaW5kZXgrK10gPSBCTVBfUEFMX0VOQ09ERShzcmNfcGFsX3B0clszXSwgc3JjX3BhbF9wdHJbMl0sIHNyY19wYWxfcHRyWzFdLCBzcmNfcGFsX3B0clswXSk7DQotICAgICAgICAgICAgICAgICAgICBzcmNfcGFsX3B0ciArPSA0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KKyAgICBibXBfcHRyLT5wYWxfbnVtID0gMDsNCisgICAgaWYgKGJtcF9wdHItPmJpdENvdW50cyA8IDE2KSB7DQorICAgICAgYm1wX3B0ci0+cGFsX251bSA9IDEgPDwgYm1wX3B0ci0+Yml0Q291bnRzOw0KKyAgICAgIGlmIChibXBfcHRyLT5jb2xvcl91c2VkICE9IDApIHsNCisgICAgICAgIGJtcF9wdHItPnBhbF9udW0gPSBibXBfcHRyLT5jb2xvcl91c2VkOw0KKyAgICAgIH0NCisgICAgICB1aW50OF90KiBzcmNfcGFsX3B0ciA9IE5VTEw7DQorICAgICAgRlhfRFdPUkQgc3JjX3BhbF9zaXplID0gYm1wX3B0ci0+cGFsX251bSAqIChibXBfcHRyLT5wYWxfdHlwZSA/IDMgOiA0KTsNCisgICAgICBpZiAoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgKHVpbnQ4X3QqKikmc3JjX3BhbF9wdHIsIHNyY19wYWxfc2l6ZSkgPT0NCisgICAgICAgICAgTlVMTCkgew0KKyAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICAgIH0NCisgICAgICBpZiAoYm1wX3B0ci0+cGFsX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKGJtcF9wdHItPnBhbF9wdHIpOw0KKyAgICAgICAgYm1wX3B0ci0+cGFsX3B0ciA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGJtcF9wdHItPnBhbF9wdHIgPSBGWF9BbGxvYyhGWF9EV09SRCwgYm1wX3B0ci0+cGFsX251bSk7DQorICAgICAgQk1QX1BUUl9OT1RfTlVMTChibXBfcHRyLT5wYWxfcHRyLCBibXBfcHRyKTsNCisgICAgICBpbnQzMl90IHNyY19wYWxfaW5kZXggPSAwOw0KKyAgICAgIGlmIChibXBfcHRyLT5wYWxfdHlwZSA9PSBCTVBfUEFMX09MRCkgew0KKyAgICAgICAgd2hpbGUgKHNyY19wYWxfaW5kZXggPCBibXBfcHRyLT5wYWxfbnVtKSB7DQorICAgICAgICAgIGJtcF9wdHItPnBhbF9wdHJbc3JjX3BhbF9pbmRleCsrXSA9IEJNUF9QQUxfRU5DT0RFKA0KKyAgICAgICAgICAgICAgMHgwMCwgc3JjX3BhbF9wdHJbMl0sIHNyY19wYWxfcHRyWzFdLCBzcmNfcGFsX3B0clswXSk7DQorICAgICAgICAgIHNyY19wYWxfcHRyICs9IDM7DQogICAgICAgICB9DQotICAgICAgICBpZihibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzIDwgMTQgKyBibXBfcHRyLT5pbWdfaWZoX3NpemUgKyBibXBfcHRyLT5wYWxfbnVtICogKGJtcF9wdHItPnBhbF90eXBlID8gMyA6IDQpKSB7DQotICAgICAgICAgICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cyA9IDE0ICsgYm1wX3B0ci0+aW1nX2lmaF9zaXplICsgYm1wX3B0ci0+cGFsX251bSAqIChibXBfcHRyLT5wYWxfdHlwZSA/IDMgOiA0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgd2hpbGUgKHNyY19wYWxfaW5kZXggPCBibXBfcHRyLT5wYWxfbnVtKSB7DQorICAgICAgICAgIGJtcF9wdHItPnBhbF9wdHJbc3JjX3BhbF9pbmRleCsrXSA9IEJNUF9QQUxfRU5DT0RFKA0KKyAgICAgICAgICAgICAgc3JjX3BhbF9wdHJbM10sIHNyY19wYWxfcHRyWzJdLCBzcmNfcGFsX3B0clsxXSwgc3JjX3BhbF9wdHJbMF0pOw0KKyAgICAgICAgICBzcmNfcGFsX3B0ciArPSA0Ow0KICAgICAgICAgfQ0KLSAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfREFUQV9QUkUpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gMTsNCisgICAgaWYgKGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyLT5iZk9mZkJpdHMgPA0KKyAgICAgICAgMTQgKyBibXBfcHRyLT5pbWdfaWZoX3NpemUgKw0KKyAgICAgICAgICAgIGJtcF9wdHItPnBhbF9udW0gKiAoYm1wX3B0ci0+cGFsX3R5cGUgPyAzIDogNCkpIHsNCisgICAgICBibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzID0NCisgICAgICAgICAgMTQgKyBibXBfcHRyLT5pbWdfaWZoX3NpemUgKw0KKyAgICAgICAgICBibXBfcHRyLT5wYWxfbnVtICogKGJtcF9wdHItPnBhbF90eXBlID8gMyA6IDQpOw0KKyAgICB9DQorICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX0RBVEFfUFJFKTsNCisgIH0NCisgIHJldHVybiAxOw0KIH0NCi1pbnQzMl90IF9ibXBfZGVjb2RlX2ltYWdlKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpDQotew0KLSAgICBpZihibXBfcHRyLT5kZWNvZGVfc3RhdHVzID09IEJNUF9EX1NUQVRVU19EQVRBX1BSRSkgew0KLSAgICAgICAgYm1wX3B0ci0+YXZhaWxfaW4gPSAwOw0KLSAgICAgICAgaWYoIWJtcF9wdHItPl9ibXBfZ2V0X2RhdGFfcG9zaXRpb25fZm4oYm1wX3B0ciwgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cykpIHsNCi0gICAgICAgICAgICBibXBfcHRyLT5kZWNvZGVfc3RhdHVzID0gQk1QX0RfU1RBVFVTX1RBSUw7DQotICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQsIFVuZXhwZWN0ZWQgU3RyZWFtIE9mZnNldCIpOw0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYm1wX3B0ci0+cm93X251bSA9IDA7DQotICAgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBKTsNCitpbnQzMl90IF9ibXBfZGVjb2RlX2ltYWdlKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpIHsNCisgIGlmIChibXBfcHRyLT5kZWNvZGVfc3RhdHVzID09IEJNUF9EX1NUQVRVU19EQVRBX1BSRSkgew0KKyAgICBibXBfcHRyLT5hdmFpbF9pbiA9IDA7DQorICAgIGlmICghYm1wX3B0ci0+X2JtcF9nZXRfZGF0YV9wb3NpdGlvbl9mbigNCisgICAgICAgICAgICBibXBfcHRyLCBibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzKSkgew0KKyAgICAgIGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPSBCTVBfRF9TVEFUVVNfVEFJTDsNCisgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCwgVW5leHBlY3RlZCBTdHJlYW0gT2Zmc2V0Iik7DQorICAgICAgcmV0dXJuIDA7DQogICAgIH0NCi0gICAgaWYoYm1wX3B0ci0+ZGVjb2RlX3N0YXR1cyA9PSBCTVBfRF9TVEFUVVNfREFUQSkgew0KLSAgICAgICAgc3dpdGNoKGJtcF9wdHItPmNvbXByZXNzX2ZsYWcpIHsNCi0gICAgICAgICAgICBjYXNlIEJNUF9SR0I6DQotICAgICAgICAgICAgY2FzZSBCTVBfQklURklFTERTOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2JtcF9kZWNvZGVfcmdiKGJtcF9wdHIpOw0KLSAgICAgICAgICAgIGNhc2UgQk1QX1JMRTg6DQotICAgICAgICAgICAgICAgIHJldHVybiBfYm1wX2RlY29kZV9ybGU4KGJtcF9wdHIpOw0KLSAgICAgICAgICAgIGNhc2UgQk1QX1JMRTQ6DQotICAgICAgICAgICAgICAgIHJldHVybiBfYm1wX2RlY29kZV9ybGU0KGJtcF9wdHIpOw0KLSAgICAgICAgfQ0KKyAgICBibXBfcHRyLT5yb3dfbnVtID0gMDsNCisgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfREFUQSk7DQorICB9DQorICBpZiAoYm1wX3B0ci0+ZGVjb2RlX3N0YXR1cyA9PSBCTVBfRF9TVEFUVVNfREFUQSkgew0KKyAgICBzd2l0Y2ggKGJtcF9wdHItPmNvbXByZXNzX2ZsYWcpIHsNCisgICAgICBjYXNlIEJNUF9SR0I6DQorICAgICAgY2FzZSBCTVBfQklURklFTERTOg0KKyAgICAgICAgcmV0dXJuIF9ibXBfZGVjb2RlX3JnYihibXBfcHRyKTsNCisgICAgICBjYXNlIEJNUF9STEU4Og0KKyAgICAgICAgcmV0dXJuIF9ibXBfZGVjb2RlX3JsZTgoYm1wX3B0cik7DQorICAgICAgY2FzZSBCTVBfUkxFNDoNCisgICAgICAgIHJldHVybiBfYm1wX2RlY29kZV9ybGU0KGJtcF9wdHIpOw0KICAgICB9DQotICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIkFueSBVbmNvbnRyb2wgRXJyb3IiKTsNCi0gICAgcmV0dXJuIDA7DQorICB9DQorICBfYm1wX2Vycm9yKGJtcF9wdHIsICJBbnkgVW5jb250cm9sIEVycm9yIik7DQorICByZXR1cm4gMDsNCiB9DQotaW50MzJfdCBfYm1wX2RlY29kZV9yZ2IoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikNCi17DQotICAgIHVpbnQ4X3QqIHJvd19idWYgPSBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcjsNCi0gICAgdWludDhfdCogZGVzX2J1ZiA9IE5VTEw7DQotICAgIHdoaWxlIChibXBfcHRyLT5yb3dfbnVtIDwgYm1wX3B0ci0+aGVpZ2h0KSB7DQotICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmZGVzX2J1ZiwgYm1wX3B0ci0+c3JjX3Jvd19ieXRlcykgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiAyOw0KK2ludDMyX3QgX2JtcF9kZWNvZGVfcmdiKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpIHsNCisgIHVpbnQ4X3QqIHJvd19idWYgPSBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcjsNCisgIHVpbnQ4X3QqIGRlc19idWYgPSBOVUxMOw0KKyAgd2hpbGUgKGJtcF9wdHItPnJvd19udW0gPCBibXBfcHRyLT5oZWlnaHQpIHsNCisgICAgaWYgKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZkZXNfYnVmLCBibXBfcHRyLT5zcmNfcm93X2J5dGVzKSA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIDI7DQorICAgIH0NCisgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfREFUQSk7DQorICAgIHN3aXRjaCAoYm1wX3B0ci0+Yml0Q291bnRzKSB7DQorICAgICAgY2FzZSAxOiB7DQorICAgICAgICBmb3IgKGludDMyX3QgY29sID0gMDsgY29sIDwgYm1wX3B0ci0+d2lkdGg7IGNvbCsrKSB7DQorICAgICAgICAgICpyb3dfYnVmKysgPSBkZXNfYnVmW2NvbCA+PiAzXSAmICgweDgwID4+IChjb2wgJSA4KSkgPyAweDAxIDogMHgwMDsNCiAgICAgICAgIH0NCi0gICAgICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX0RBVEEpOw0KLSAgICAgICAgc3dpdGNoKGJtcF9wdHItPmJpdENvdW50cykgew0KLSAgICAgICAgICAgIGNhc2UgMTogew0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGNvbCA9IDA7IGNvbCA8IGJtcF9wdHItPndpZHRoOyBjb2wrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICpyb3dfYnVmKysgPSBkZXNfYnVmW2NvbCA+PiAzXSAmICgweDgwID4+IChjb2wgJSA4KSkgPyAweDAxIDogMHgwMDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIDQ6IHsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCBibXBfcHRyLT53aWR0aDsgY29sKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAqcm93X2J1ZisrID0gKGNvbCAmIDB4MDEpID8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc19idWZbY29sID4+IDFdICYgMHgwRikgOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGRlc19idWZbY29sID4+IDFdICYgMHhGMCkgPj4gNCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIDQ6IHsNCisgICAgICAgIGZvciAoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCBibXBfcHRyLT53aWR0aDsgY29sKyspIHsNCisgICAgICAgICAgKnJvd19idWYrKyA9IChjb2wgJiAweDAxKSA/IChkZXNfYnVmW2NvbCA+PiAxXSAmIDB4MEYpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGRlc19idWZbY29sID4+IDFdICYgMHhGMCkgPj4gNCk7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCiAjaWZkZWYgQk1QX1NVUFBPUlRfQklURklFTEQNCi0gICAgICAgICAgICBjYXNlIDE2OiB7DQotICAgICAgICAgICAgICAgICAgICBGWF9XT1JEKiBidWYgPSAoRlhfV09SRCopZGVzX2J1ZjsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmx1ZV9iaXRzID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JlZW5fYml0cyA9IDA7DQotICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlZF9iaXRzID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKChibXBfcHRyLT5tYXNrX2JsdWUgPj4gaSkgJiAweDAxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWVfYml0cysrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZigoYm1wX3B0ci0+bWFza19ncmVlbiA+PiBpKSAmIDB4MDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW5fYml0cysrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZigoYm1wX3B0ci0+bWFza19yZWQgPj4gaSkgJiAweDAxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZF9iaXRzKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZ3JlZW5fYml0cyArPSBibHVlX2JpdHM7DQotICAgICAgICAgICAgICAgICAgICByZWRfYml0cyArPSBncmVlbl9iaXRzOw0KLSAgICAgICAgICAgICAgICAgICAgYmx1ZV9iaXRzID0gOCAtIGJsdWVfYml0czsNCi0gICAgICAgICAgICAgICAgICAgIGdyZWVuX2JpdHMgLT0gODsNCi0gICAgICAgICAgICAgICAgICAgIHJlZF9iaXRzIC09IDg7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgY29sID0gMDsgY29sIDwgYm1wX3B0ci0+d2lkdGg7IGNvbCsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiA9IF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KilidWYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpyb3dfYnVmKysgPSAodWludDhfdCkoKCpidWYgJiBibXBfcHRyLT5tYXNrX2JsdWUpIDw8IGJsdWVfYml0cyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgKnJvd19idWYrKyA9ICh1aW50OF90KSgoKmJ1ZiAmIGJtcF9wdHItPm1hc2tfZ3JlZW4pID4+IGdyZWVuX2JpdHMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICpyb3dfYnVmKysgPSAodWludDhfdCkoKCpidWYrKyAmIGJtcF9wdHItPm1hc2tfcmVkKSA+PiByZWRfYml0cyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotI2VuZGlmDQotICAgICAgICAgICAgY2FzZSA4Og0KLSAgICAgICAgICAgIGNhc2UgMjQ6DQotICAgICAgICAgICAgY2FzZSAzMjoNCi0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCBkZXNfYnVmLCBibXBfcHRyLT5zcmNfcm93X2J5dGVzKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICByb3dfYnVmID0gYm1wX3B0ci0+b3V0X3Jvd19idWZmZXI7DQotICAgICAgICBibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4oYm1wX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID8gYm1wX3B0ci0+cm93X251bSsrIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsNCi0gICAgfQ0KLSAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19UQUlMKTsNCi0gICAgcmV0dXJuIDE7DQotfQ0KLWludDMyX3QgX2JtcF9kZWNvZGVfcmxlOChibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKQ0KLXsNCi0gICAgdWludDhfdCogZmlyc3RfYnl0ZV9wdHIgPSBOVUxMOw0KLSAgICB1aW50OF90KiBzZWNvbmRfYnl0ZV9wdHIgPSBOVUxMOw0KLSAgICBibXBfcHRyLT5jb2xfbnVtID0gMDsNCi0gICAgd2hpbGUoVFJVRSkgew0KLSAgICAgICAgRlhfRFdPUkQgc2tpcF9zaXplX29yZyA9IGJtcF9wdHItPnNraXBfc2l6ZTsNCi0gICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZmaXJzdF9ieXRlX3B0ciwgMSkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3dpdGNoKCpmaXJzdF9ieXRlX3B0cikgew0KLSAgICAgICAgICAgIGNhc2UgUkxFX01BUktFUjogew0KLSAgICAgICAgICAgICAgICAgICAgaWYoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJmZpcnN0X2J5dGVfcHRyLCAxKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCgqZmlyc3RfYnl0ZV9wdHIpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJMRV9FT0w6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJtcF9wdHItPnJvd19udW0gPj0gYm1wX3B0ci0+aGVpZ2h0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfVEFJTCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbihibXBfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPyBibXBfcHRyLT5yb3dfbnVtKysgOiAoYm1wX3B0ci0+aGVpZ2h0IC0gMSAtIGJtcF9wdHItPnJvd19udW0rKyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIsIDAsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfREFUQSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkxFX0VPSTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm1wX3B0ci0+cm93X251bSA8IGJtcF9wdHItPmhlaWdodCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbihibXBfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID8gYm1wX3B0ci0+cm93X251bSsrIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19UQUlMKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSTEVfREVMVEE6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlbHRhX3B0cjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZkZWx0YV9wdHIsIDIpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSArPSAoaW50MzJfdClkZWx0YV9wdHJbMF07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJtcF9yb3dfbnVtX25leHQgPSBibXBfcHRyLT5yb3dfbnVtICsgKGludDMyX3QpZGVsdGFfcHRyWzFdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm1wX3B0ci0+Y29sX251bSA+PSBibXBfcHRyLT5vdXRfcm93X2J5dGVzIHx8IGJtcF9yb3dfbnVtX25leHQgPj0gYm1wX3B0ci0+aGVpZ2h0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQgT3IgTm90IFN1cHBvcnRlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoYm1wX3B0ci0+cm93X251bSA8IGJtcF9yb3dfbnVtX25leHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIsIDAsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbihibXBfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID8gYm1wX3B0ci0+cm93X251bSsrIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGludDMyX3QpKCpmaXJzdF9ieXRlX3B0cikgPiBibXBfcHRyLT5zcmNfcm93X2J5dGVzIC0gYm1wX3B0ci0+Y29sX251bSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmc2Vjb25kX2J5dGVfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZpcnN0X2J5dGVfcHRyICYgMSA/ICpmaXJzdF9ieXRlX3B0ciArIDEgOiAqZmlyc3RfYnl0ZV9wdHIpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICsgYm1wX3B0ci0+Y29sX251bSwgc2Vjb25kX2J5dGVfcHRyLCAqZmlyc3RfYnl0ZV9wdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSArPSAoaW50MzJfdCkoKmZpcnN0X2J5dGVfcHRyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZzZWNvbmRfYnl0ZV9wdHIsIDEpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoKGludDMyX3QpKCpmaXJzdF9ieXRlX3B0cikgPiBibXBfcHRyLT5zcmNfcm93X2J5dGVzIC0gYm1wX3B0ci0+Y29sX251bSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgKyBibXBfcHRyLT5jb2xfbnVtLCAqc2Vjb25kX2J5dGVfcHRyLCAqZmlyc3RfYnl0ZV9wdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSArPSAoaW50MzJfdCkoKmZpcnN0X2J5dGVfcHRyKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIkFueSBVbmNvbnRyb2wgRXJyb3IiKTsNCi0gICAgcmV0dXJuIDA7DQotfQ0KLWludDMyX3QgX2JtcF9kZWNvZGVfcmxlNChibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKQ0KLXsNCi0gICAgdWludDhfdCogZmlyc3RfYnl0ZV9wdHIgPSBOVUxMOw0KLSAgICB1aW50OF90KiBzZWNvbmRfYnl0ZV9wdHIgPSBOVUxMOw0KLSAgICBibXBfcHRyLT5jb2xfbnVtID0gMDsNCi0gICAgd2hpbGUgKFRSVUUpIHsNCi0gICAgICAgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBibXBfcHRyLT5za2lwX3NpemU7DQotICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmZmlyc3RfYnl0ZV9wdHIsIDEpID09IE5VTEwpIHsNCi0gICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgIH0NCi0gICAgICAgIHN3aXRjaCgqZmlyc3RfYnl0ZV9wdHIpIHsNCi0gICAgICAgICAgICBjYXNlIFJMRV9NQVJLRVI6IHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZmaXJzdF9ieXRlX3B0ciwgMSkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goKmZpcnN0X2J5dGVfcHRyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSTEVfRU9MOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihibXBfcHRyLT5yb3dfbnVtID49IGJtcF9wdHItPmhlaWdodCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX1RBSUwpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4oYm1wX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID8gYm1wX3B0ci0+cm93X251bSsrIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbF9udW0gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCAwLCBibXBfcHRyLT5vdXRfcm93X2J5dGVzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX0RBVEEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJMRV9FT0k6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJtcF9wdHItPnJvd19udW0gPCBibXBfcHRyLT5oZWlnaHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4oYm1wX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+aW1nVEJfZmxhZyA/IGJtcF9wdHItPnJvd19udW0rKyA6IChibXBfcHRyLT5oZWlnaHQgLSAxIC0gYm1wX3B0ci0+cm93X251bSsrKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfVEFJTCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkxFX0RFTFRBOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZWx0YV9wdHI7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmZGVsdGFfcHRyLCAyKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmNvbF9udW0gKz0gKGludDMyX3QpZGVsdGFfcHRyWzBdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBibXBfcm93X251bV9uZXh0ID0gYm1wX3B0ci0+cm93X251bSArIChpbnQzMl90KWRlbHRhX3B0clsxXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJtcF9wdHItPmNvbF9udW0gPj0gYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyB8fCBibXBfcm93X251bV9uZXh0ID49IGJtcF9wdHItPmhlaWdodCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0IE9yIE5vdCBTdXBwb3J0ZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGJtcF9wdHItPnJvd19udW0gPCBibXBfcm93X251bV9uZXh0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCAwLCBibXBfcHRyLT5vdXRfcm93X2J5dGVzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4oYm1wX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+aW1nVEJfZmxhZyA/IGJtcF9wdHItPnJvd19udW0rKyA6IChibXBfcHRyLT5oZWlnaHQgLSAxIC0gYm1wX3B0ci0+cm93X251bSsrKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2l6ZSA9ICh1aW50OF90KSgoKEZYX1dPUkQpKCpmaXJzdF9ieXRlX3B0cikgKyAxKSA+PiAxKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChpbnQzMl90KSpmaXJzdF9ieXRlX3B0ciA+PSBibXBfcHRyLT5vdXRfcm93X2J5dGVzIC0gYm1wX3B0ci0+Y29sX251bSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNpemUgKyAoYm1wX3B0ci0+Y29sX251bSA+PiAxKSA+IGJtcF9wdHItPnNyY19yb3dfYnl0ZXMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmaXJzdF9ieXRlX3B0ciA9IGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgLSBibXBfcHRyLT5jb2xfbnVtIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZzZWNvbmRfYnl0ZV9wdHIsIHNpemUgJiAxID8gc2l6ZSArIDEgOiBzaXplKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8ICpmaXJzdF9ieXRlX3B0cjsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSAmIDB4MDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0rKykgPSAoKnNlY29uZF9ieXRlX3B0cisrICYgMHgwRik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0rKykgPSAoKCpzZWNvbmRfYnl0ZV9wdHIgJiAweEYwKSA+PiA0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICBpZihfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmc2Vjb25kX2J5dGVfcHRyLCAxKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKChpbnQzMl90KSpmaXJzdF9ieXRlX3B0ciA+IGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgLSBibXBfcHRyLT5jb2xfbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzaXplID0gKHVpbnQ4X3QpKCgoRlhfV09SRCkoKmZpcnN0X2J5dGVfcHRyKSArIDEpID4+IDEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNpemUgKyAoYm1wX3B0ci0+Y29sX251bSA+PiAxKSA+IGJtcF9wdHItPnNyY19yb3dfYnl0ZXMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICpmaXJzdF9ieXRlX3B0ciA9IGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgLSBibXBfcHRyLT5jb2xfbnVtIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8ICpmaXJzdF9ieXRlX3B0cjsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSAmIDB4MDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKihibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0rKykgPSAoKnNlY29uZF9ieXRlX3B0ciAmIDB4MEYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICooYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgKyBibXBfcHRyLT5jb2xfbnVtKyspID0gKCgqc2Vjb25kX2J5dGVfcHRyICYgMHhGMCkgPj4gNCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgX2JtcF9lcnJvcihibXBfcHRyLCAiQW55IFVuY29udHJvbCBFcnJvciIpOw0KLSAgICByZXR1cm4gMDsNCi19DQotdWludDhfdCogX2JtcF9yZWFkX2RhdGEoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgdWludDhfdCoqIGRlc19idWZfcHAsIEZYX0RXT1JEIGRhdGFfc2l6ZSkNCi17DQotICAgIGlmKGJtcF9wdHIgPT0gTlVMTCB8fA0KLSAgICAgICAgICAgIGJtcF9wdHItPmF2YWlsX2luIDwgYm1wX3B0ci0+c2tpcF9zaXplICsgZGF0YV9zaXplKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICAqZGVzX2J1Zl9wcCA9IGJtcF9wdHItPm5leHRfaW4gKyBibXBfcHRyLT5za2lwX3NpemU7DQotICAgIGJtcF9wdHItPnNraXBfc2l6ZSArPSBkYXRhX3NpemU7DQotICAgIHJldHVybiAqZGVzX2J1Zl9wcDsNCi19DQotdm9pZCBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIGludDMyX3Qgc3RhdHVzKQ0KLXsNCi0gICAgYm1wX3B0ci0+ZGVjb2RlX3N0YXR1cyA9IHN0YXR1czsNCi0gICAgYm1wX3B0ci0+bmV4dF9pbiArPSBibXBfcHRyLT5za2lwX3NpemU7DQotICAgIGJtcF9wdHItPmF2YWlsX2luIC09IGJtcF9wdHItPnNraXBfc2l6ZTsNCi0gICAgYm1wX3B0ci0+c2tpcF9zaXplID0gMDsNCi19DQotdm9pZCBfYm1wX2lucHV0X2J1ZmZlcihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkNCi17DQotICAgIGJtcF9wdHItPm5leHRfaW4gPSBzcmNfYnVmOw0KLSAgICBibXBfcHRyLT5hdmFpbF9pbiA9IHNyY19zaXplOw0KLSAgICBibXBfcHRyLT5za2lwX3NpemUgPSAwOw0KLX0NCi1GWF9EV09SRCBfYm1wX2dldF9hdmFpbF9pbnB1dChibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCB1aW50OF90KiogYXZpYWxfYnVmX3B0cikNCi17DQotICAgIGlmKGF2aWFsX2J1Zl9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgKmF2aWFsX2J1Zl9wdHIgPSBOVUxMOw0KLSAgICAgICAgaWYoYm1wX3B0ci0+YXZhaWxfaW4gPiAwKSB7DQotICAgICAgICAgICAgKmF2aWFsX2J1Zl9wdHIgPSBibXBfcHRyLT5uZXh0X2luOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBibXBfcHRyLT5hdmFpbF9pbjsNCi19DQotYm1wX2NvbXByZXNzX3N0cnVjdF9wIF9ibXBfY3JlYXRlX2NvbXByZXNzKCkNCi17DQotICAgIGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyOw0KLSAgICBibXBfcHRyID0gRlhfQWxsb2MoYm1wX2NvbXByZXNzX3N0cnVjdCwgMSk7DQotICAgIGlmIChibXBfcHRyKSB7DQotICAgICAgICBGWFNZU19tZW1zZXQoYm1wX3B0ciwgMCwgc2l6ZW9mKGJtcF9jb21wcmVzc19zdHJ1Y3QpKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gYm1wX3B0cjsNCi19DQotdm9pZCBfYm1wX2Rlc3Ryb3lfY29tcHJlc3MoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpDQotew0KLSAgICBpZiAoYm1wX3B0cikgew0KLSAgICAgICAgaWYgKGJtcF9wdHItPnNyY19mcmVlICYmIGJtcF9wdHItPnNyY19idWYpIHsNCi0gICAgICAgICAgICBGWF9GcmVlKGJtcF9wdHItPnNyY19idWYpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRnJlZShibXBfcHRyKTsNCi0gICAgfQ0KLX0NCi1zdGF0aWMgdm9pZCBXcml0ZUZpbGVIZWFkZXIoQm1wRmlsZUhlYWRlclB0ciBoZWFkX3B0ciwgdWludDhfdCogZHN0X2J1ZikNCi17DQotICAgIEZYX0RXT1JEIG9mZnNldDsNCi0gICAgb2Zmc2V0ID0gMDsNCi0gICAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmVHlwZSk7DQotICAgIG9mZnNldCArPSAyOw0KLSAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmU2l6ZSk7DQotICAgIG9mZnNldCArPSA0Ow0KLSAgICBfU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBoZWFkX3B0ci0+YmZSZXNlcnZlZDEpOw0KLSAgICBvZmZzZXQgKz0gMjsNCi0gICAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmUmVzZXJ2ZWQyKTsNCi0gICAgb2Zmc2V0ICs9IDI7DQotICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBoZWFkX3B0ci0+YmZPZmZCaXRzKTsNCi0gICAgb2Zmc2V0ICs9IDQ7DQotfQ0KLXN0YXRpYyB2b2lkIFdyaXRlSW5mb0hlYWRlcihCbXBJbmZvSGVhZGVyUHRyIGluZm9faGVhZF9wdHIsIHVpbnQ4X3QqIGRzdF9idWYpDQotew0KLSAgICBGWF9EV09SRCBvZmZzZXQ7DQotICAgIG9mZnNldCA9IHNpemVvZihCbXBGaWxlSGVhZGVyKTsNCi0gICAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGluZm9faGVhZF9wdHItPmJpU2l6ZSk7DQotICAgIG9mZnNldCArPSA0Ow0KLSAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgKEZYX0RXT1JEKWluZm9faGVhZF9wdHItPmJpV2lkdGgpOw0KLSAgICBvZmZzZXQgKz0gNDsNCi0gICAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIChGWF9EV09SRClpbmZvX2hlYWRfcHRyLT5iaUhlaWdodCk7DQotICAgIG9mZnNldCArPSA0Ow0KLSAgICBfU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaVBsYW5lcyk7DQotICAgIG9mZnNldCArPSAyOw0KLSAgICBfU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaUJpdENvdW50KTsNCi0gICAgb2Zmc2V0ICs9IDI7DQotICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaUNvbXByZXNzaW9uKTsNCi0gICAgb2Zmc2V0ICs9IDQ7DQotICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaVNpemVJbWFnZSk7DQotICAgIG9mZnNldCArPSA0Ow0KLSAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgKEZYX0RXT1JEKWluZm9faGVhZF9wdHItPmJpWFBlbHNQZXJNZXRlcik7DQotICAgIG9mZnNldCArPSA0Ow0KLSAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgKEZYX0RXT1JEKWluZm9faGVhZF9wdHItPmJpWVBlbHNQZXJNZXRlcik7DQotICAgIG9mZnNldCArPSA0Ow0KLSAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlDbHJVc2VkKTsNCi0gICAgb2Zmc2V0ICs9IDQ7DQotICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaUNsckltcG9ydGFudCk7DQotICAgIG9mZnNldCArPSA0Ow0KLX0NCi0jaWZkZWYgQk1QX1NVUFBPUlRfQklURklFTEQNCi1zdGF0aWMgdm9pZCBfYm1wX2VuY29kZV9iaXRmaWVsZHMoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X3NpemUpDQotew0KLSAgICBpZiAoYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudCAhPSAxNiAmJiBibXBfcHRyLT5pbmZvX2hlYWRlci5iaUJpdENvdW50ICE9IDMyKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfRFdPUkQgc2l6ZSwgZHN0X3BvcywgaTsNCi0gICAgc2l6ZSA9IGJtcF9wdHItPnNyY19waXRjaCAqIGJtcF9wdHItPnNyY19yb3cgKiBibXBfcHRyLT5pbmZvX2hlYWRlci5iaUJpdENvdW50IC8gMTY7DQotICAgIGRzdF9wb3MgPSBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHM7DQotICAgIGRzdF9zaXplICs9IHNpemU7DQotICAgIGRzdF9idWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIGRzdF9idWYsIGRzdF9zaXplKTsNCi0gICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYU1lTX21lbXNldCgmZHN0X2J1Zltkc3RfcG9zXSwgMCwgc2l6ZSk7DQotICAgIEZYX0RXT1JECQltYXNrX3JlZDsNCi0gICAgRlhfRFdPUkQJCW1hc2tfZ3JlZW47DQotICAgIEZYX0RXT1JECQltYXNrX2JsdWU7DQotICAgIG1hc2tfcmVkCT0gMHg3QzAwOw0KLSAgICBtYXNrX2dyZWVuID0gMHgwM0UwOw0KLSAgICBtYXNrX2JsdWUJPSAweDAwMUY7DQotICAgIGlmIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUNvbXByZXNzaW9uID09IEJNUF9CSVRGSUVMRFMpIHsNCi0gICAgICAgIGlmIChibXBfcHRyLT5iaXRfdHlwZSA9PSBCTVBfQklUXzU2NSkgew0KLSAgICAgICAgICAgIG1hc2tfcmVkCT0gMHhGODAwOw0KLSAgICAgICAgICAgIG1hc2tfZ3JlZW4gPSAweDA3RTA7DQotICAgICAgICAgICAgbWFza19ibHVlCT0gMHgwMDFGOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgPT0gMzIpIHsNCi0gICAgICAgICAgICBtYXNrX3JlZAk9IDB4RkYwMDAwOw0KLSAgICAgICAgICAgIG1hc2tfZ3JlZW4gPSAweDAwRkYwMDsNCi0gICAgICAgICAgICBtYXNrX2JsdWUJPSAweDAwMDBGRjsNCi0gICAgICAgIH0NCi0gICAgICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1Zltkc3RfcG9zXSwgbWFza19yZWQpOw0KLSAgICAgICAgZHN0X3BvcyArPSA0Ow0KLSAgICAgICAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW2RzdF9wb3NdLCBtYXNrX2dyZWVuKTsNCi0gICAgICAgIGRzdF9wb3MgKz0gNDsNCi0gICAgICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1Zltkc3RfcG9zXSwgbWFza19ibHVlKTsNCi0gICAgICAgIGRzdF9wb3MgKz0gNDsNCi0gICAgICAgIGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0cyA9IGRzdF9wb3M7DQotICAgIH0NCi0gICAgdWludDhfdCBibHVlX2JpdHMgPSAwOw0KLSAgICB1aW50OF90IGdyZWVuX2JpdHMgPSAwOw0KLSAgICB1aW50OF90IHJlZF9iaXRzID0gMDsNCi0gICAgZm9yKGkgPSAwOyBpIDwgYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudDsgaSsrKSB7DQotICAgICAgICBpZigobWFza19ibHVlID4+IGkpICYgMHgwMSkgew0KKyAgICAgIGNhc2UgMTY6IHsNCisgICAgICAgIEZYX1dPUkQqIGJ1ZiA9IChGWF9XT1JEKilkZXNfYnVmOw0KKyAgICAgICAgdWludDhfdCBibHVlX2JpdHMgPSAwOw0KKyAgICAgICAgdWludDhfdCBncmVlbl9iaXRzID0gMDsNCisgICAgICAgIHVpbnQ4X3QgcmVkX2JpdHMgPSAwOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykgew0KKyAgICAgICAgICBpZiAoKGJtcF9wdHItPm1hc2tfYmx1ZSA+PiBpKSAmIDB4MDEpIHsNCiAgICAgICAgICAgICBibHVlX2JpdHMrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKChtYXNrX2dyZWVuID4+IGkpICYgMHgwMSkgew0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICgoYm1wX3B0ci0+bWFza19ncmVlbiA+PiBpKSAmIDB4MDEpIHsNCiAgICAgICAgICAgICBncmVlbl9iaXRzKys7DQotICAgICAgICB9DQotICAgICAgICBpZigobWFza19yZWQgPj4gaSkgJiAweDAxKSB7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKChibXBfcHRyLT5tYXNrX3JlZCA+PiBpKSAmIDB4MDEpIHsNCiAgICAgICAgICAgICByZWRfYml0cysrOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgIH0NCi0gICAgZ3JlZW5fYml0cyArPSBibHVlX2JpdHM7DQotICAgIHJlZF9iaXRzICs9IGdyZWVuX2JpdHM7DQotICAgIGJsdWVfYml0cyA9IDggLSBibHVlX2JpdHM7DQotICAgIGdyZWVuX2JpdHMgLT0gODsNCi0gICAgcmVkX2JpdHMgLT0gODsNCi0gICAgaSA9IDA7DQotICAgIGZvciAoaW50MzJfdCByb3dfbnVtID0gYm1wX3B0ci0+c3JjX3JvdyAtIDE7IHJvd19udW0gPiAtMTsgcm93X251bS0tLCBpID0gMCkgew0KLSAgICAgICAgd2hpbGUgKGkgPCBibXBfcHRyLT5zcmNfd2lkdGggKiBibXBfcHRyLT5zcmNfYnBwIC8gOCkgew0KLSAgICAgICAgICAgIHVpbnQ4X3QgYiA9IGJtcF9wdHItPnNyY19idWZbcm93X251bSAqIGJtcF9wdHItPnNyY19waXRjaCArIGkrK107DQotICAgICAgICAgICAgdWludDhfdCBnID0gYm1wX3B0ci0+c3JjX2J1Zltyb3dfbnVtICogYm1wX3B0ci0+c3JjX3BpdGNoICsgaSsrXTsNCi0gICAgICAgICAgICB1aW50OF90IHIgPSBibXBfcHRyLT5zcmNfYnVmW3Jvd19udW0gKiBibXBfcHRyLT5zcmNfcGl0Y2ggKyBpKytdOw0KLSAgICAgICAgICAgIGlmIChibXBfcHRyLT5zcmNfYnBwID09IDMyKSB7DQotICAgICAgICAgICAgICAgIGkrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhfRFdPUkQgcGl4X3ZhbCA9IDA7DQotICAgICAgICAgICAgcGl4X3ZhbCB8PSAoYiA+PiBibHVlX2JpdHMpICYgbWFza19ibHVlOw0KLSAgICAgICAgICAgIHBpeF92YWwgfD0gKGcgPDwgZ3JlZW5fYml0cykgJiBtYXNrX2dyZWVuOw0KLSAgICAgICAgICAgIHBpeF92YWwgfD0gKHIgPDwgcmVkX2JpdHMpICYgbWFza19yZWQ7DQotICAgICAgICAgICAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgPT0gMTYpIHsNCi0gICAgICAgICAgICAgICAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbZHN0X3Bvc10sIChGWF9XT1JEKXBpeF92YWwpOw0KLSAgICAgICAgICAgICAgICBkc3RfcG9zICs9IDI7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW2RzdF9wb3NdLCBwaXhfdmFsKTsNCi0gICAgICAgICAgICAgICAgZHN0X3BvcyArPSA0Ow0KLSAgICAgICAgICAgIH0NCisgICAgICAgIGdyZWVuX2JpdHMgKz0gYmx1ZV9iaXRzOw0KKyAgICAgICAgcmVkX2JpdHMgKz0gZ3JlZW5fYml0czsNCisgICAgICAgIGJsdWVfYml0cyA9IDggLSBibHVlX2JpdHM7DQorICAgICAgICBncmVlbl9iaXRzIC09IDg7DQorICAgICAgICByZWRfYml0cyAtPSA4Ow0KKyAgICAgICAgZm9yIChpbnQzMl90IGNvbCA9IDA7IGNvbCA8IGJtcF9wdHItPndpZHRoOyBjb2wrKykgew0KKyAgICAgICAgICAqYnVmID0gX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKWJ1Zik7DQorICAgICAgICAgICpyb3dfYnVmKysgPSAodWludDhfdCkoKCpidWYgJiBibXBfcHRyLT5tYXNrX2JsdWUpIDw8IGJsdWVfYml0cyk7DQorICAgICAgICAgICpyb3dfYnVmKysgPSAodWludDhfdCkoKCpidWYgJiBibXBfcHRyLT5tYXNrX2dyZWVuKSA+PiBncmVlbl9iaXRzKTsNCisgICAgICAgICAgKnJvd19idWYrKyA9ICh1aW50OF90KSgoKmJ1ZisrICYgYm1wX3B0ci0+bWFza19yZWQpID4+IHJlZF9iaXRzKTsNCiAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBkc3Rfc2l6ZSA9IGRzdF9wb3M7DQotfQ0KKyAgICAgIH0gYnJlYWs7DQogI2VuZGlmDQotc3RhdGljIHZvaWQgX2JtcF9lbmNvZGVfcmdiKGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCB1aW50OF90KiYgZHN0X2J1ZiwgRlhfRFdPUkQmIGRzdF9zaXplKQ0KLXsNCi0gICAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgPT0gMTYpIHsNCisgICAgICBjYXNlIDg6DQorICAgICAgY2FzZSAyNDoNCisgICAgICBjYXNlIDMyOg0KKyAgICAgICAgRlhTWVNfbWVtY3B5KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCBkZXNfYnVmLCBibXBfcHRyLT5zcmNfcm93X2J5dGVzKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJvd19idWYgPSBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcjsNCisgICAgYm1wX3B0ci0+X2JtcF9nZXRfcm93X2ZuKGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibXBfcHRyLT5yb3dfbnVtKysNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChibXBfcHRyLT5oZWlnaHQgLSAxIC0gYm1wX3B0ci0+cm93X251bSsrKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsNCisgIH0NCisgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX1RBSUwpOw0KKyAgcmV0dXJuIDE7DQorfQ0KK2ludDMyX3QgX2JtcF9kZWNvZGVfcmxlOChibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKSB7DQorICB1aW50OF90KiBmaXJzdF9ieXRlX3B0ciA9IE5VTEw7DQorICB1aW50OF90KiBzZWNvbmRfYnl0ZV9wdHIgPSBOVUxMOw0KKyAgYm1wX3B0ci0+Y29sX251bSA9IDA7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gYm1wX3B0ci0+c2tpcF9zaXplOw0KKyAgICBpZiAoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJmZpcnN0X2J5dGVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIDI7DQorICAgIH0NCisgICAgc3dpdGNoICgqZmlyc3RfYnl0ZV9wdHIpIHsNCisgICAgICBjYXNlIFJMRV9NQVJLRVI6IHsNCisgICAgICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmZmlyc3RfYnl0ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICB9DQorICAgICAgICBzd2l0Y2ggKCpmaXJzdF9ieXRlX3B0cikgew0KKyAgICAgICAgICBjYXNlIFJMRV9FT0w6IHsNCisgICAgICAgICAgICBpZiAoYm1wX3B0ci0+cm93X251bSA+PSBibXBfcHRyLT5oZWlnaHQpIHsNCisgICAgICAgICAgICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX1RBSUwpOw0KKyAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCisgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4oDQorICAgICAgICAgICAgICAgIGJtcF9wdHIsIGJtcF9wdHItPmltZ1RCX2ZsYWcNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYm1wX3B0ci0+cm93X251bSsrDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChibXBfcHRyLT5oZWlnaHQgLSAxIC0gYm1wX3B0ci0+cm93X251bSsrKSwNCisgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KKyAgICAgICAgICAgIGJtcF9wdHItPmNvbF9udW0gPSAwOw0KKyAgICAgICAgICAgIEZYU1lTX21lbXNldChibXBfcHRyLT5vdXRfcm93X2J1ZmZlciwgMCwgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyk7DQorICAgICAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfREFUQSk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2FzZSBSTEVfRU9JOiB7DQorICAgICAgICAgICAgaWYgKGJtcF9wdHItPnJvd19udW0gPCBibXBfcHRyLT5oZWlnaHQpIHsNCisgICAgICAgICAgICAgIGJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbigNCisgICAgICAgICAgICAgICAgICBibXBfcHRyLCBibXBfcHRyLT5pbWdUQl9mbGFnDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYm1wX3B0ci0+cm93X251bSsrDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KKyAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfVEFJTCk7DQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2FzZSBSTEVfREVMVEE6IHsNCisgICAgICAgICAgICB1aW50OF90KiBkZWx0YV9wdHI7DQorICAgICAgICAgICAgaWYgKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZkZWx0YV9wdHIsIDIpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSArPSAoaW50MzJfdClkZWx0YV9wdHJbMF07DQorICAgICAgICAgICAgaW50MzJfdCBibXBfcm93X251bV9uZXh0ID0gYm1wX3B0ci0+cm93X251bSArIChpbnQzMl90KWRlbHRhX3B0clsxXTsNCisgICAgICAgICAgICBpZiAoYm1wX3B0ci0+Y29sX251bSA+PSBibXBfcHRyLT5vdXRfcm93X2J5dGVzIHx8DQorICAgICAgICAgICAgICAgIGJtcF9yb3dfbnVtX25leHQgPj0gYm1wX3B0ci0+aGVpZ2h0KSB7DQorICAgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCBPciBOb3QgU3VwcG9ydGVkIik7DQorICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd2hpbGUgKGJtcF9wdHItPnJvd19udW0gPCBibXBfcm93X251bV9uZXh0KSB7DQorICAgICAgICAgICAgICBGWFNZU19tZW1zZXQoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIsIDAsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOw0KKyAgICAgICAgICAgICAgYm1wX3B0ci0+X2JtcF9nZXRfcm93X2ZuKA0KKyAgICAgICAgICAgICAgICAgIGJtcF9wdHIsIGJtcF9wdHItPmltZ1RCX2ZsYWcNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibXBfcHRyLT5yb3dfbnVtKysNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoYm1wX3B0ci0+aGVpZ2h0IC0gMSAtIGJtcF9wdHItPnJvd19udW0rKyksDQorICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIGlmICgoaW50MzJfdCkoKmZpcnN0X2J5dGVfcHRyKSA+DQorICAgICAgICAgICAgICAgIGJtcF9wdHItPnNyY19yb3dfYnl0ZXMgLSBibXBfcHRyLT5jb2xfbnVtKSB7DQorICAgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmc2Vjb25kX2J5dGVfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmlyc3RfYnl0ZV9wdHIgJiAxID8gKmZpcnN0X2J5dGVfcHRyICsgMQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKmZpcnN0X2J5dGVfcHRyKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYU1lTX21lbWNweShibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF9ieXRlX3B0ciwgKmZpcnN0X2J5dGVfcHRyKTsNCisgICAgICAgICAgICBibXBfcHRyLT5jb2xfbnVtICs9IChpbnQzMl90KSgqZmlyc3RfYnl0ZV9wdHIpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0OiB7DQorICAgICAgICBpZiAoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJnNlY29uZF9ieXRlX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgoaW50MzJfdCkoKmZpcnN0X2J5dGVfcHRyKSA+DQorICAgICAgICAgICAgYm1wX3B0ci0+c3JjX3Jvd19ieXRlcyAtIGJtcF9wdHItPmNvbF9udW0pIHsNCisgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCisgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICB9DQorICAgICAgICBGWFNZU19tZW1zZXQoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgKyBibXBfcHRyLT5jb2xfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICpzZWNvbmRfYnl0ZV9wdHIsICpmaXJzdF9ieXRlX3B0cik7DQorICAgICAgICBibXBfcHRyLT5jb2xfbnVtICs9IChpbnQzMl90KSgqZmlyc3RfYnl0ZV9wdHIpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgX2JtcF9lcnJvcihibXBfcHRyLCAiQW55IFVuY29udHJvbCBFcnJvciIpOw0KKyAgcmV0dXJuIDA7DQorfQ0KK2ludDMyX3QgX2JtcF9kZWNvZGVfcmxlNChibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKSB7DQorICB1aW50OF90KiBmaXJzdF9ieXRlX3B0ciA9IE5VTEw7DQorICB1aW50OF90KiBzZWNvbmRfYnl0ZV9wdHIgPSBOVUxMOw0KKyAgYm1wX3B0ci0+Y29sX251bSA9IDA7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gYm1wX3B0ci0+c2tpcF9zaXplOw0KKyAgICBpZiAoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJmZpcnN0X2J5dGVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIDI7DQorICAgIH0NCisgICAgc3dpdGNoICgqZmlyc3RfYnl0ZV9wdHIpIHsNCisgICAgICBjYXNlIFJMRV9NQVJLRVI6IHsNCisgICAgICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmZmlyc3RfYnl0ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICB9DQorICAgICAgICBzd2l0Y2ggKCpmaXJzdF9ieXRlX3B0cikgew0KKyAgICAgICAgICBjYXNlIFJMRV9FT0w6IHsNCisgICAgICAgICAgICBpZiAoYm1wX3B0ci0+cm93X251bSA+PSBibXBfcHRyLT5oZWlnaHQpIHsNCisgICAgICAgICAgICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX1RBSUwpOw0KKyAgICAgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCisgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4oDQorICAgICAgICAgICAgICAgIGJtcF9wdHIsIGJtcF9wdHItPmltZ1RCX2ZsYWcNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYm1wX3B0ci0+cm93X251bSsrDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChibXBfcHRyLT5oZWlnaHQgLSAxIC0gYm1wX3B0ci0+cm93X251bSsrKSwNCisgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KKyAgICAgICAgICAgIGJtcF9wdHItPmNvbF9udW0gPSAwOw0KKyAgICAgICAgICAgIEZYU1lTX21lbXNldChibXBfcHRyLT5vdXRfcm93X2J1ZmZlciwgMCwgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyk7DQorICAgICAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfREFUQSk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2FzZSBSTEVfRU9JOiB7DQorICAgICAgICAgICAgaWYgKGJtcF9wdHItPnJvd19udW0gPCBibXBfcHRyLT5oZWlnaHQpIHsNCisgICAgICAgICAgICAgIGJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbigNCisgICAgICAgICAgICAgICAgICBibXBfcHRyLCBibXBfcHRyLT5pbWdUQl9mbGFnDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYm1wX3B0ci0+cm93X251bSsrDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KKyAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfVEFJTCk7DQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2FzZSBSTEVfREVMVEE6IHsNCisgICAgICAgICAgICB1aW50OF90KiBkZWx0YV9wdHI7DQorICAgICAgICAgICAgaWYgKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZkZWx0YV9wdHIsIDIpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSArPSAoaW50MzJfdClkZWx0YV9wdHJbMF07DQorICAgICAgICAgICAgaW50MzJfdCBibXBfcm93X251bV9uZXh0ID0gYm1wX3B0ci0+cm93X251bSArIChpbnQzMl90KWRlbHRhX3B0clsxXTsNCisgICAgICAgICAgICBpZiAoYm1wX3B0ci0+Y29sX251bSA+PSBibXBfcHRyLT5vdXRfcm93X2J5dGVzIHx8DQorICAgICAgICAgICAgICAgIGJtcF9yb3dfbnVtX25leHQgPj0gYm1wX3B0ci0+aGVpZ2h0KSB7DQorICAgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCBPciBOb3QgU3VwcG9ydGVkIik7DQorICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd2hpbGUgKGJtcF9wdHItPnJvd19udW0gPCBibXBfcm93X251bV9uZXh0KSB7DQorICAgICAgICAgICAgICBGWFNZU19tZW1zZXQoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIsIDAsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOw0KKyAgICAgICAgICAgICAgYm1wX3B0ci0+X2JtcF9nZXRfcm93X2ZuKA0KKyAgICAgICAgICAgICAgICAgIGJtcF9wdHIsIGJtcF9wdHItPmltZ1RCX2ZsYWcNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibXBfcHRyLT5yb3dfbnVtKysNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoYm1wX3B0ci0+aGVpZ2h0IC0gMSAtIGJtcF9wdHItPnJvd19udW0rKyksDQorICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIHVpbnQ4X3Qgc2l6ZSA9ICh1aW50OF90KSgoKEZYX1dPUkQpKCpmaXJzdF9ieXRlX3B0cikgKyAxKSA+PiAxKTsNCisgICAgICAgICAgICBpZiAoKGludDMyX3QpKmZpcnN0X2J5dGVfcHRyID49DQorICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgLSBibXBfcHRyLT5jb2xfbnVtKSB7DQorICAgICAgICAgICAgICBpZiAoc2l6ZSArIChibXBfcHRyLT5jb2xfbnVtID4+IDEpID4gYm1wX3B0ci0+c3JjX3Jvd19ieXRlcykgew0KKyAgICAgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICpmaXJzdF9ieXRlX3B0ciA9IGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgLSBibXBfcHRyLT5jb2xfbnVtIC0gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZzZWNvbmRfYnl0ZV9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgJiAxID8gc2l6ZSArIDEgOiBzaXplKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8ICpmaXJzdF9ieXRlX3B0cjsgaSsrKSB7DQorICAgICAgICAgICAgICBpZiAoaSAmIDB4MDEpIHsNCisgICAgICAgICAgICAgICAgKihibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0rKykgPQ0KKyAgICAgICAgICAgICAgICAgICAgKCpzZWNvbmRfYnl0ZV9wdHIrKyAmIDB4MEYpOw0KKyAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgKihibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0rKykgPQ0KKyAgICAgICAgICAgICAgICAgICAgKCgqc2Vjb25kX2J5dGVfcHRyICYgMHhGMCkgPj4gNCk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0OiB7DQorICAgICAgICBpZiAoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJnNlY29uZF9ieXRlX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgIGlmICgoaW50MzJfdCkqZmlyc3RfYnl0ZV9wdHIgPg0KKyAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgLSBibXBfcHRyLT5jb2xfbnVtKSB7DQorICAgICAgICAgIHVpbnQ4X3Qgc2l6ZSA9ICh1aW50OF90KSgoKEZYX1dPUkQpKCpmaXJzdF9ieXRlX3B0cikgKyAxKSA+PiAxKTsNCisgICAgICAgICAgaWYgKHNpemUgKyAoYm1wX3B0ci0+Y29sX251bSA+PiAxKSA+IGJtcF9wdHItPnNyY19yb3dfYnl0ZXMpIHsNCisgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOw0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICB9DQorICAgICAgICAgICpmaXJzdF9ieXRlX3B0ciA9IGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgLSBibXBfcHRyLT5jb2xfbnVtIC0gMTsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8ICpmaXJzdF9ieXRlX3B0cjsgaSsrKSB7DQorICAgICAgICAgIGlmIChpICYgMHgwMSkgew0KKyAgICAgICAgICAgICooYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgKyBibXBfcHRyLT5jb2xfbnVtKyspID0NCisgICAgICAgICAgICAgICAgKCpzZWNvbmRfYnl0ZV9wdHIgJiAweDBGKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAqKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICsgYm1wX3B0ci0+Y29sX251bSsrKSA9DQorICAgICAgICAgICAgICAgICgoKnNlY29uZF9ieXRlX3B0ciAmIDB4RjApID4+IDQpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBfYm1wX2Vycm9yKGJtcF9wdHIsICJBbnkgVW5jb250cm9sIEVycm9yIik7DQorICByZXR1cm4gMDsNCit9DQordWludDhfdCogX2JtcF9yZWFkX2RhdGEoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzX2J1Zl9wcCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkYXRhX3NpemUpIHsNCisgIGlmIChibXBfcHRyID09IE5VTEwgfHwgYm1wX3B0ci0+YXZhaWxfaW4gPCBibXBfcHRyLT5za2lwX3NpemUgKyBkYXRhX3NpemUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICAqZGVzX2J1Zl9wcCA9IGJtcF9wdHItPm5leHRfaW4gKyBibXBfcHRyLT5za2lwX3NpemU7DQorICBibXBfcHRyLT5za2lwX3NpemUgKz0gZGF0YV9zaXplOw0KKyAgcmV0dXJuICpkZXNfYnVmX3BwOw0KK30NCit2b2lkIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMpIHsNCisgIGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPSBzdGF0dXM7DQorICBibXBfcHRyLT5uZXh0X2luICs9IGJtcF9wdHItPnNraXBfc2l6ZTsNCisgIGJtcF9wdHItPmF2YWlsX2luIC09IGJtcF9wdHItPnNraXBfc2l6ZTsNCisgIGJtcF9wdHItPnNraXBfc2l6ZSA9IDA7DQorfQ0KK3ZvaWQgX2JtcF9pbnB1dF9idWZmZXIoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19idWYsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSkgew0KKyAgYm1wX3B0ci0+bmV4dF9pbiA9IHNyY19idWY7DQorICBibXBfcHRyLT5hdmFpbF9pbiA9IHNyY19zaXplOw0KKyAgYm1wX3B0ci0+c2tpcF9zaXplID0gMDsNCit9DQorRlhfRFdPUkQgX2JtcF9nZXRfYXZhaWxfaW5wdXQoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYXZpYWxfYnVmX3B0cikgew0KKyAgaWYgKGF2aWFsX2J1Zl9wdHIgIT0gTlVMTCkgew0KKyAgICAqYXZpYWxfYnVmX3B0ciA9IE5VTEw7DQorICAgIGlmIChibXBfcHRyLT5hdmFpbF9pbiA+IDApIHsNCisgICAgICAqYXZpYWxfYnVmX3B0ciA9IGJtcF9wdHItPm5leHRfaW47DQorICAgIH0NCisgIH0NCisgIHJldHVybiBibXBfcHRyLT5hdmFpbF9pbjsNCit9DQorYm1wX2NvbXByZXNzX3N0cnVjdF9wIF9ibXBfY3JlYXRlX2NvbXByZXNzKCkgew0KKyAgYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHI7DQorICBibXBfcHRyID0gRlhfQWxsb2MoYm1wX2NvbXByZXNzX3N0cnVjdCwgMSk7DQorICBpZiAoYm1wX3B0cikgew0KKyAgICBGWFNZU19tZW1zZXQoYm1wX3B0ciwgMCwgc2l6ZW9mKGJtcF9jb21wcmVzc19zdHJ1Y3QpKTsNCisgIH0NCisgIHJldHVybiBibXBfcHRyOw0KK30NCit2b2lkIF9ibXBfZGVzdHJveV9jb21wcmVzcyhibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikgew0KKyAgaWYgKGJtcF9wdHIpIHsNCisgICAgaWYgKGJtcF9wdHItPnNyY19mcmVlICYmIGJtcF9wdHItPnNyY19idWYpIHsNCisgICAgICBGWF9GcmVlKGJtcF9wdHItPnNyY19idWYpOw0KKyAgICB9DQorICAgIEZYX0ZyZWUoYm1wX3B0cik7DQorICB9DQorfQ0KK3N0YXRpYyB2b2lkIFdyaXRlRmlsZUhlYWRlcihCbXBGaWxlSGVhZGVyUHRyIGhlYWRfcHRyLCB1aW50OF90KiBkc3RfYnVmKSB7DQorICBGWF9EV09SRCBvZmZzZXQ7DQorICBvZmZzZXQgPSAwOw0KKyAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmVHlwZSk7DQorICBvZmZzZXQgKz0gMjsNCisgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBoZWFkX3B0ci0+YmZTaXplKTsNCisgIG9mZnNldCArPSA0Ow0KKyAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmUmVzZXJ2ZWQxKTsNCisgIG9mZnNldCArPSAyOw0KKyAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmUmVzZXJ2ZWQyKTsNCisgIG9mZnNldCArPSAyOw0KKyAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGhlYWRfcHRyLT5iZk9mZkJpdHMpOw0KKyAgb2Zmc2V0ICs9IDQ7DQorfQ0KK3N0YXRpYyB2b2lkIFdyaXRlSW5mb0hlYWRlcihCbXBJbmZvSGVhZGVyUHRyIGluZm9faGVhZF9wdHIsIHVpbnQ4X3QqIGRzdF9idWYpIHsNCisgIEZYX0RXT1JEIG9mZnNldDsNCisgIG9mZnNldCA9IHNpemVvZihCbXBGaWxlSGVhZGVyKTsNCisgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaVNpemUpOw0KKyAgb2Zmc2V0ICs9IDQ7DQorICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgKEZYX0RXT1JEKWluZm9faGVhZF9wdHItPmJpV2lkdGgpOw0KKyAgb2Zmc2V0ICs9IDQ7DQorICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgKEZYX0RXT1JEKWluZm9faGVhZF9wdHItPmJpSGVpZ2h0KTsNCisgIG9mZnNldCArPSA0Ow0KKyAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlQbGFuZXMpOw0KKyAgb2Zmc2V0ICs9IDI7DQorICBfU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaUJpdENvdW50KTsNCisgIG9mZnNldCArPSAyOw0KKyAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGluZm9faGVhZF9wdHItPmJpQ29tcHJlc3Npb24pOw0KKyAgb2Zmc2V0ICs9IDQ7DQorICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlTaXplSW1hZ2UpOw0KKyAgb2Zmc2V0ICs9IDQ7DQorICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwNCisgICAgICAgICAgICAgICAgICAgICAoRlhfRFdPUkQpaW5mb19oZWFkX3B0ci0+YmlYUGVsc1Blck1ldGVyKTsNCisgIG9mZnNldCArPSA0Ow0KKyAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sDQorICAgICAgICAgICAgICAgICAgICAgKEZYX0RXT1JEKWluZm9faGVhZF9wdHItPmJpWVBlbHNQZXJNZXRlcik7DQorICBvZmZzZXQgKz0gNDsNCisgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaUNsclVzZWQpOw0KKyAgb2Zmc2V0ICs9IDQ7DQorICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlDbHJJbXBvcnRhbnQpOw0KKyAgb2Zmc2V0ICs9IDQ7DQorfQ0KICNpZmRlZiBCTVBfU1VQUE9SVF9CSVRGSUVMRA0KLSAgICAgICAgX2JtcF9lbmNvZGVfYml0ZmllbGRzKGJtcF9wdHIsIGRzdF9idWYsIGRzdF9zaXplKTsNCitzdGF0aWMgdm9pZCBfYm1wX2VuY29kZV9iaXRmaWVsZHMoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHN0X3NpemUpIHsNCisgIGlmIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUJpdENvdW50ICE9IDE2ICYmDQorICAgICAgYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudCAhPSAzMikgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9EV09SRCBzaXplLCBkc3RfcG9zLCBpOw0KKyAgc2l6ZSA9IGJtcF9wdHItPnNyY19waXRjaCAqIGJtcF9wdHItPnNyY19yb3cgKg0KKyAgICAgICAgIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgLyAxNjsNCisgIGRzdF9wb3MgPSBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHM7DQorICBkc3Rfc2l6ZSArPSBzaXplOw0KKyAgZHN0X2J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgaWYgKGRzdF9idWYgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWFNZU19tZW1zZXQoJmRzdF9idWZbZHN0X3Bvc10sIDAsIHNpemUpOw0KKyAgRlhfRFdPUkQgbWFza19yZWQ7DQorICBGWF9EV09SRCBtYXNrX2dyZWVuOw0KKyAgRlhfRFdPUkQgbWFza19ibHVlOw0KKyAgbWFza19yZWQgPSAweDdDMDA7DQorICBtYXNrX2dyZWVuID0gMHgwM0UwOw0KKyAgbWFza19ibHVlID0gMHgwMDFGOw0KKyAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ29tcHJlc3Npb24gPT0gQk1QX0JJVEZJRUxEUykgew0KKyAgICBpZiAoYm1wX3B0ci0+Yml0X3R5cGUgPT0gQk1QX0JJVF81NjUpIHsNCisgICAgICBtYXNrX3JlZCA9IDB4RjgwMDsNCisgICAgICBtYXNrX2dyZWVuID0gMHgwN0UwOw0KKyAgICAgIG1hc2tfYmx1ZSA9IDB4MDAxRjsNCisgICAgfQ0KKyAgICBpZiAoYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudCA9PSAzMikgew0KKyAgICAgIG1hc2tfcmVkID0gMHhGRjAwMDA7DQorICAgICAgbWFza19ncmVlbiA9IDB4MDBGRjAwOw0KKyAgICAgIG1hc2tfYmx1ZSA9IDB4MDAwMEZGOw0KKyAgICB9DQorICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1Zltkc3RfcG9zXSwgbWFza19yZWQpOw0KKyAgICBkc3RfcG9zICs9IDQ7DQorICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1Zltkc3RfcG9zXSwgbWFza19ncmVlbik7DQorICAgIGRzdF9wb3MgKz0gNDsNCisgICAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW2RzdF9wb3NdLCBtYXNrX2JsdWUpOw0KKyAgICBkc3RfcG9zICs9IDQ7DQorICAgIGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0cyA9IGRzdF9wb3M7DQorICB9DQorICB1aW50OF90IGJsdWVfYml0cyA9IDA7DQorICB1aW50OF90IGdyZWVuX2JpdHMgPSAwOw0KKyAgdWludDhfdCByZWRfYml0cyA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudDsgaSsrKSB7DQorICAgIGlmICgobWFza19ibHVlID4+IGkpICYgMHgwMSkgew0KKyAgICAgIGJsdWVfYml0cysrOw0KKyAgICB9DQorICAgIGlmICgobWFza19ncmVlbiA+PiBpKSAmIDB4MDEpIHsNCisgICAgICBncmVlbl9iaXRzKys7DQorICAgIH0NCisgICAgaWYgKChtYXNrX3JlZCA+PiBpKSAmIDB4MDEpIHsNCisgICAgICByZWRfYml0cysrOw0KKyAgICB9DQorICB9DQorICBncmVlbl9iaXRzICs9IGJsdWVfYml0czsNCisgIHJlZF9iaXRzICs9IGdyZWVuX2JpdHM7DQorICBibHVlX2JpdHMgPSA4IC0gYmx1ZV9iaXRzOw0KKyAgZ3JlZW5fYml0cyAtPSA4Ow0KKyAgcmVkX2JpdHMgLT0gODsNCisgIGkgPSAwOw0KKyAgZm9yIChpbnQzMl90IHJvd19udW0gPSBibXBfcHRyLT5zcmNfcm93IC0gMTsgcm93X251bSA+IC0xOyByb3dfbnVtLS0sIGkgPSAwKSB7DQorICAgIHdoaWxlIChpIDwgYm1wX3B0ci0+c3JjX3dpZHRoICogYm1wX3B0ci0+c3JjX2JwcCAvIDgpIHsNCisgICAgICB1aW50OF90IGIgPSBibXBfcHRyLT5zcmNfYnVmW3Jvd19udW0gKiBibXBfcHRyLT5zcmNfcGl0Y2ggKyBpKytdOw0KKyAgICAgIHVpbnQ4X3QgZyA9IGJtcF9wdHItPnNyY19idWZbcm93X251bSAqIGJtcF9wdHItPnNyY19waXRjaCArIGkrK107DQorICAgICAgdWludDhfdCByID0gYm1wX3B0ci0+c3JjX2J1Zltyb3dfbnVtICogYm1wX3B0ci0+c3JjX3BpdGNoICsgaSsrXTsNCisgICAgICBpZiAoYm1wX3B0ci0+c3JjX2JwcCA9PSAzMikgew0KKyAgICAgICAgaSsrOw0KKyAgICAgIH0NCisgICAgICBGWF9EV09SRCBwaXhfdmFsID0gMDsNCisgICAgICBwaXhfdmFsIHw9IChiID4+IGJsdWVfYml0cykgJiBtYXNrX2JsdWU7DQorICAgICAgcGl4X3ZhbCB8PSAoZyA8PCBncmVlbl9iaXRzKSAmIG1hc2tfZ3JlZW47DQorICAgICAgcGl4X3ZhbCB8PSAociA8PCByZWRfYml0cykgJiBtYXNrX3JlZDsNCisgICAgICBpZiAoYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudCA9PSAxNikgew0KKyAgICAgICAgX1NldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbZHN0X3Bvc10sIChGWF9XT1JEKXBpeF92YWwpOw0KKyAgICAgICAgZHN0X3BvcyArPSAyOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbZHN0X3Bvc10sIHBpeF92YWwpOw0KKyAgICAgICAgZHN0X3BvcyArPSA0Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgZHN0X3NpemUgPSBkc3RfcG9zOw0KK30NCiAjZW5kaWYNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBzaXplLCBkc3RfcG9zOw0KLSAgICBGWF9EV09SRCBkc3RfcGl0Y2ggPSAoYm1wX3B0ci0+c3JjX3dpZHRoICogYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudCArIDMxKSAvIDMyICogNDsNCi0gICAgc2l6ZSA9IGRzdF9waXRjaCAqIGJtcF9wdHItPnNyY19yb3c7DQotICAgIGRzdF9wb3MgPSBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHM7DQotICAgIGRzdF9zaXplICs9IHNpemU7DQotICAgIGRzdF9idWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIGRzdF9idWYsIGRzdF9zaXplKTsNCi0gICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYU1lTX21lbXNldCgmZHN0X2J1Zltkc3RfcG9zXSwgMCwgc2l6ZSk7DQotICAgIGZvciAoaW50MzJfdCByb3dfbnVtID0gYm1wX3B0ci0+c3JjX3JvdyAtIDE7IHJvd19udW0gPiAtMTsgcm93X251bS0tKSB7DQotICAgICAgICBGWFNZU19tZW1jcHkoJmRzdF9idWZbZHN0X3Bvc10sICZibXBfcHRyLT5zcmNfYnVmW3Jvd19udW0gKiBibXBfcHRyLT5zcmNfcGl0Y2hdLCBibXBfcHRyLT5zcmNfcGl0Y2gpOw0KLSAgICAgICAgZHN0X3BvcyArPSBkc3RfcGl0Y2g7DQotICAgIH0NCi0gICAgZHN0X3NpemUgPSBkc3RfcG9zOw0KLX0NCi1zdGF0aWMgdWludDhfdCBfYm1wX3JsZThfc2VhcmNoKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCBsZW4pDQotew0KLSAgICB1aW50OF90IG51bTsNCi0gICAgbnVtID0gMTsNCi0gICAgd2hpbGUgKG51bSA8IGxlbikgew0KLSAgICAgICAgaWYgKGJ1ZltudW0gLSAxXSAhPSBidWZbbnVtXSB8fCBudW0gPT0gMHhGRikgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbnVtKys7DQotICAgIH0NCi0gICAgcmV0dXJuIG51bTsNCi19DQotc3RhdGljIHZvaWQgX2JtcF9lbmNvZGVfcmxlOChibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgdWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBkc3Rfc2l6ZSkNCi17DQotICAgIEZYX0RXT1JEIHNpemUsIGRzdF9wb3MsIGluZGV4Ow0KLSAgICB1aW50OF90IHJsZVsyXSA9IHswfTsNCi0gICAgc2l6ZSA9IGJtcF9wdHItPnNyY19waXRjaCAqIGJtcF9wdHItPnNyY19yb3cgKiAyOw0KLSAgICBkc3RfcG9zID0gYm1wX3B0ci0+ZmlsZV9oZWFkZXIuYmZPZmZCaXRzOw0KLSAgICBkc3Rfc2l6ZSArPSBzaXplOw0KLSAgICBkc3RfYnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBkc3RfYnVmLCBkc3Rfc2l6ZSk7DQotICAgIGlmIChkc3RfYnVmID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWFNZU19tZW1zZXQoJmRzdF9idWZbZHN0X3Bvc10sIDAsIHNpemUpOw0KLSAgICBmb3IgKGludDMyX3Qgcm93X251bSA9IGJtcF9wdHItPnNyY19yb3cgLSAxLCBpID0gMDsgcm93X251bSA+IC0xOyApIHsNCi0gICAgICAgIGluZGV4ID0gcm93X251bSAqIGJtcF9wdHItPnNyY19waXRjaDsNCi0gICAgICAgIHJsZVswXSA9IF9ibXBfcmxlOF9zZWFyY2goJmJtcF9wdHItPnNyY19idWZbaW5kZXggKyBpXSwgc2l6ZSAtIGluZGV4IC0gaSk7DQotICAgICAgICBybGVbMV0gPSBibXBfcHRyLT5zcmNfYnVmW2luZGV4ICsgaV07DQotICAgICAgICBpZiAoaSArIHJsZVswXSA+PSAoaW50MzJfdClibXBfcHRyLT5zcmNfcGl0Y2gpIHsNCi0gICAgICAgICAgICBybGVbMF0gPSB1aW50OF90KGJtcF9wdHItPnNyY19waXRjaCAtIGkpOw0KLSAgICAgICAgICAgIGlmIChybGVbMF0pIHsNCi0gICAgICAgICAgICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzBdOw0KLSAgICAgICAgICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMV07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IFJMRV9NQVJLRVI7DQotICAgICAgICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX0VPTDsNCi0gICAgICAgICAgICBpID0gMDsNCi0gICAgICAgICAgICByb3dfbnVtLS07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGkgKz0gcmxlWzBdOw0KLSAgICAgICAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVswXTsNCi0gICAgICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMV07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX01BUktFUjsNCi0gICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX0VPSTsNCi0gICAgZHN0X3NpemUgPSBkc3RfcG9zOw0KLX0NCi1zdGF0aWMgdWludDhfdCBfYm1wX3JsZTRfc2VhcmNoKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCBsZW4pDQotew0KLSAgICB1aW50OF90IG51bTsNCi0gICAgbnVtID0gMjsNCi0gICAgd2hpbGUgKG51bSA8IGxlbikgew0KLSAgICAgICAgaWYgKGJ1ZltudW0gLSAyXSAhPSBidWZbbnVtXSB8fCBudW0gPT0gMHhGRikgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbnVtKys7DQotICAgIH0NCi0gICAgcmV0dXJuIG51bTsNCi19DQotc3RhdGljIHZvaWQgX2JtcF9lbmNvZGVfcmxlNChibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgdWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBkc3Rfc2l6ZSkNCi17DQotICAgIEZYX0RXT1JEIHNpemUsIGRzdF9wb3MsIGluZGV4Ow0KLSAgICB1aW50OF90IHJsZVsyXSA9IHswfTsNCi0gICAgc2l6ZSA9IGJtcF9wdHItPnNyY19waXRjaCAqIGJtcF9wdHItPnNyY19yb3c7DQotICAgIGRzdF9wb3MgPSBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHM7DQotICAgIGRzdF9zaXplICs9IHNpemU7DQotICAgIGRzdF9idWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIGRzdF9idWYsIGRzdF9zaXplKTsNCi0gICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYU1lTX21lbXNldCgmZHN0X2J1Zltkc3RfcG9zXSwgMCwgc2l6ZSk7DQotICAgIGZvciAoaW50MzJfdCByb3dfbnVtID0gYm1wX3B0ci0+c3JjX3JvdyAtIDEsIGkgPSAwOyByb3dfbnVtID4gLTE7IHJsZVsxXSA9IDApIHsNCi0gICAgICAgIGluZGV4ID0gcm93X251bSAqIGJtcF9wdHItPnNyY19waXRjaDsNCi0gICAgICAgIHJsZVswXSA9IF9ibXBfcmxlNF9zZWFyY2goJmJtcF9wdHItPnNyY19idWZbaW5kZXggKyBpXSwgc2l6ZSAtIGluZGV4IC0gaSk7DQotICAgICAgICBybGVbMV0gfD0gKGJtcF9wdHItPnNyY19idWZbaW5kZXggKyBpXSAmIDB4MGYpIDw8IDQ7DQotICAgICAgICBybGVbMV0gfD0gYm1wX3B0ci0+c3JjX2J1ZltpbmRleCArIGkgKyAxXSAmIDB4MGY7DQotICAgICAgICBpZiAoaSArIHJsZVswXSA+PSAoaW50MzJfdClibXBfcHRyLT5zcmNfcGl0Y2gpIHsNCi0gICAgICAgICAgICBybGVbMF0gPSB1aW50OF90KGJtcF9wdHItPnNyY19waXRjaCAtIGkpOw0KLSAgICAgICAgICAgIGlmIChybGVbMF0pIHsNCi0gICAgICAgICAgICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzBdOw0KLSAgICAgICAgICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMV07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IFJMRV9NQVJLRVI7DQotICAgICAgICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX0VPTDsNCi0gICAgICAgICAgICBpID0gMDsNCi0gICAgICAgICAgICByb3dfbnVtLS07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGkgKz0gcmxlWzBdOw0KLSAgICAgICAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVswXTsNCi0gICAgICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMV07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX01BUktFUjsNCi0gICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX0VPSTsNCi0gICAgZHN0X3NpemUgPSBkc3RfcG9zOw0KLX0NCi1GWF9CT09MIF9ibXBfZW5jb2RlX2ltYWdlKCBibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgdWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBkc3Rfc2l6ZSApDQotew0KLSAgICBGWF9EV09SRCBoZWFkX3NpemUgPSBzaXplb2YoQm1wRmlsZUhlYWRlcikgKyBzaXplb2YoQm1wSW5mb0hlYWRlcik7DQotICAgIEZYX0RXT1JEIHBhbF9zaXplID0gc2l6ZW9mKEZYX0RXT1JEKSAqIGJtcF9wdHItPnBhbF9udW07DQotICAgIGlmIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUNsclVzZWQgPiAwICYmIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ2xyVXNlZCA8IGJtcF9wdHItPnBhbF9udW0pIHsNCi0gICAgICAgIHBhbF9zaXplID0gc2l6ZW9mKEZYX0RXT1JEKSAqIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ2xyVXNlZDsNCi0gICAgfQ0KLSAgICBkc3Rfc2l6ZSA9IGhlYWRfc2l6ZSArIHNpemVvZihGWF9EV09SRCkgKiBibXBfcHRyLT5wYWxfbnVtOw0KLSAgICBkc3RfYnVmID0gRlhfVHJ5QWxsb2ModWludDhfdCwgZHN0X3NpemUpOw0KLSAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRlhTWVNfbWVtc2V0KGRzdF9idWYsIDAsIGRzdF9zaXplKTsNCi0gICAgYm1wX3B0ci0+ZmlsZV9oZWFkZXIuYmZPZmZCaXRzID0gaGVhZF9zaXplOw0KLSAgICBpZiAoYm1wX3B0ci0+cGFsX3B0ciAmJiBwYWxfc2l6ZSkgew0KLSAgICAgICAgRlhTWVNfbWVtY3B5KCZkc3RfYnVmW2hlYWRfc2l6ZV0sIGJtcF9wdHItPnBhbF9wdHIsIHBhbF9zaXplKTsNCi0gICAgICAgIGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0cyArPSBwYWxfc2l6ZTsNCi0gICAgfQ0KLSAgICBXcml0ZUluZm9IZWFkZXIoJmJtcF9wdHItPmluZm9faGVhZGVyLCBkc3RfYnVmKTsNCi0gICAgc3dpdGNoKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ29tcHJlc3Npb24pIHsNCi0gICAgICAgIGNhc2UgQk1QX1JHQjoNCi0gICAgICAgICAgICBfYm1wX2VuY29kZV9yZ2IoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBCTVBfQklURklFTERTOg0KK3N0YXRpYyB2b2lkIF9ibXBfZW5jb2RlX3JnYihibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3Rfc2l6ZSkgew0KKyAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgPT0gMTYpIHsNCiAjaWZkZWYgQk1QX1NVUFBPUlRfQklURklFTEQNCi0gICAgICAgICAgICBfYm1wX2VuY29kZV9iaXRmaWVsZHMoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgICBfYm1wX2VuY29kZV9iaXRmaWVsZHMoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KICNlbmRpZg0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBCTVBfUkxFODoNCi0gICAgICAgICAgICBfYm1wX2VuY29kZV9ybGU4KGJtcF9wdHIsIGRzdF9idWYsIGRzdF9zaXplKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgQk1QX1JMRTQ6DQotICAgICAgICAgICAgX2JtcF9lbmNvZGVfcmxlNChibXBfcHRyLCBkc3RfYnVmLCBkc3Rfc2l6ZSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRFdPUkQgc2l6ZSwgZHN0X3BvczsNCisgIEZYX0RXT1JEIGRzdF9waXRjaCA9DQorICAgICAgKGJtcF9wdHItPnNyY193aWR0aCAqIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgKyAzMSkgLyAzMiAqIDQ7DQorICBzaXplID0gZHN0X3BpdGNoICogYm1wX3B0ci0+c3JjX3JvdzsNCisgIGRzdF9wb3MgPSBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHM7DQorICBkc3Rfc2l6ZSArPSBzaXplOw0KKyAgZHN0X2J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgaWYgKGRzdF9idWYgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWFNZU19tZW1zZXQoJmRzdF9idWZbZHN0X3Bvc10sIDAsIHNpemUpOw0KKyAgZm9yIChpbnQzMl90IHJvd19udW0gPSBibXBfcHRyLT5zcmNfcm93IC0gMTsgcm93X251bSA+IC0xOyByb3dfbnVtLS0pIHsNCisgICAgRlhTWVNfbWVtY3B5KCZkc3RfYnVmW2RzdF9wb3NdLA0KKyAgICAgICAgICAgICAgICAgJmJtcF9wdHItPnNyY19idWZbcm93X251bSAqIGJtcF9wdHItPnNyY19waXRjaF0sDQorICAgICAgICAgICAgICAgICBibXBfcHRyLT5zcmNfcGl0Y2gpOw0KKyAgICBkc3RfcG9zICs9IGRzdF9waXRjaDsNCisgIH0NCisgIGRzdF9zaXplID0gZHN0X3BvczsNCit9DQorc3RhdGljIHVpbnQ4X3QgX2JtcF9ybGU4X3NlYXJjaChjb25zdCB1aW50OF90KiBidWYsIGludDMyX3QgbGVuKSB7DQorICB1aW50OF90IG51bTsNCisgIG51bSA9IDE7DQorICB3aGlsZSAobnVtIDwgbGVuKSB7DQorICAgIGlmIChidWZbbnVtIC0gMV0gIT0gYnVmW251bV0gfHwgbnVtID09IDB4RkYpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBibXBfcHRyLT5maWxlX2hlYWRlci5iZlNpemUgPSBkc3Rfc2l6ZTsNCi0gICAgV3JpdGVGaWxlSGVhZGVyKCZibXBfcHRyLT5maWxlX2hlYWRlciwgZHN0X2J1Zik7DQotICAgIHJldHVybiBUUlVFOw0KKyAgICBudW0rKzsNCisgIH0NCisgIHJldHVybiBudW07DQorfQ0KK3N0YXRpYyB2b2lkIF9ibXBfZW5jb2RlX3JsZTgoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3Rfc2l6ZSkgew0KKyAgRlhfRFdPUkQgc2l6ZSwgZHN0X3BvcywgaW5kZXg7DQorICB1aW50OF90IHJsZVsyXSA9IHswfTsNCisgIHNpemUgPSBibXBfcHRyLT5zcmNfcGl0Y2ggKiBibXBfcHRyLT5zcmNfcm93ICogMjsNCisgIGRzdF9wb3MgPSBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHM7DQorICBkc3Rfc2l6ZSArPSBzaXplOw0KKyAgZHN0X2J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgaWYgKGRzdF9idWYgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWFNZU19tZW1zZXQoJmRzdF9idWZbZHN0X3Bvc10sIDAsIHNpemUpOw0KKyAgZm9yIChpbnQzMl90IHJvd19udW0gPSBibXBfcHRyLT5zcmNfcm93IC0gMSwgaSA9IDA7IHJvd19udW0gPiAtMTspIHsNCisgICAgaW5kZXggPSByb3dfbnVtICogYm1wX3B0ci0+c3JjX3BpdGNoOw0KKyAgICBybGVbMF0gPSBfYm1wX3JsZThfc2VhcmNoKCZibXBfcHRyLT5zcmNfYnVmW2luZGV4ICsgaV0sIHNpemUgLSBpbmRleCAtIGkpOw0KKyAgICBybGVbMV0gPSBibXBfcHRyLT5zcmNfYnVmW2luZGV4ICsgaV07DQorICAgIGlmIChpICsgcmxlWzBdID49IChpbnQzMl90KWJtcF9wdHItPnNyY19waXRjaCkgew0KKyAgICAgIHJsZVswXSA9IHVpbnQ4X3QoYm1wX3B0ci0+c3JjX3BpdGNoIC0gaSk7DQorICAgICAgaWYgKHJsZVswXSkgew0KKyAgICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzBdOw0KKyAgICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzFdOw0KKyAgICAgIH0NCisgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBSTEVfTUFSS0VSOw0KKyAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IFJMRV9FT0w7DQorICAgICAgaSA9IDA7DQorICAgICAgcm93X251bS0tOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGkgKz0gcmxlWzBdOw0KKyAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVswXTsNCisgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMV07DQorICAgIH0NCisgIH0NCisgIGRzdF9idWZbZHN0X3BvcysrXSA9IFJMRV9NQVJLRVI7DQorICBkc3RfYnVmW2RzdF9wb3MrK10gPSBSTEVfRU9JOw0KKyAgZHN0X3NpemUgPSBkc3RfcG9zOw0KK30NCitzdGF0aWMgdWludDhfdCBfYm1wX3JsZTRfc2VhcmNoKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCBsZW4pIHsNCisgIHVpbnQ4X3QgbnVtOw0KKyAgbnVtID0gMjsNCisgIHdoaWxlIChudW0gPCBsZW4pIHsNCisgICAgaWYgKGJ1ZltudW0gLSAyXSAhPSBidWZbbnVtXSB8fCBudW0gPT0gMHhGRikgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIG51bSsrOw0KKyAgfQ0KKyAgcmV0dXJuIG51bTsNCit9DQorc3RhdGljIHZvaWQgX2JtcF9lbmNvZGVfcmxlNChibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9zaXplKSB7DQorICBGWF9EV09SRCBzaXplLCBkc3RfcG9zLCBpbmRleDsNCisgIHVpbnQ4X3QgcmxlWzJdID0gezB9Ow0KKyAgc2l6ZSA9IGJtcF9wdHItPnNyY19waXRjaCAqIGJtcF9wdHItPnNyY19yb3c7DQorICBkc3RfcG9zID0gYm1wX3B0ci0+ZmlsZV9oZWFkZXIuYmZPZmZCaXRzOw0KKyAgZHN0X3NpemUgKz0gc2l6ZTsNCisgIGRzdF9idWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIGRzdF9idWYsIGRzdF9zaXplKTsNCisgIGlmIChkc3RfYnVmID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KCZkc3RfYnVmW2RzdF9wb3NdLCAwLCBzaXplKTsNCisgIGZvciAoaW50MzJfdCByb3dfbnVtID0gYm1wX3B0ci0+c3JjX3JvdyAtIDEsIGkgPSAwOyByb3dfbnVtID4gLTE7DQorICAgICAgIHJsZVsxXSA9IDApIHsNCisgICAgaW5kZXggPSByb3dfbnVtICogYm1wX3B0ci0+c3JjX3BpdGNoOw0KKyAgICBybGVbMF0gPSBfYm1wX3JsZTRfc2VhcmNoKCZibXBfcHRyLT5zcmNfYnVmW2luZGV4ICsgaV0sIHNpemUgLSBpbmRleCAtIGkpOw0KKyAgICBybGVbMV0gfD0gKGJtcF9wdHItPnNyY19idWZbaW5kZXggKyBpXSAmIDB4MGYpIDw8IDQ7DQorICAgIHJsZVsxXSB8PSBibXBfcHRyLT5zcmNfYnVmW2luZGV4ICsgaSArIDFdICYgMHgwZjsNCisgICAgaWYgKGkgKyBybGVbMF0gPj0gKGludDMyX3QpYm1wX3B0ci0+c3JjX3BpdGNoKSB7DQorICAgICAgcmxlWzBdID0gdWludDhfdChibXBfcHRyLT5zcmNfcGl0Y2ggLSBpKTsNCisgICAgICBpZiAocmxlWzBdKSB7DQorICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMF07DQorICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMV07DQorICAgICAgfQ0KKyAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IFJMRV9NQVJLRVI7DQorICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX0VPTDsNCisgICAgICBpID0gMDsNCisgICAgICByb3dfbnVtLS07DQorICAgIH0gZWxzZSB7DQorICAgICAgaSArPSBybGVbMF07DQorICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzBdOw0KKyAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVsxXTsNCisgICAgfQ0KKyAgfQ0KKyAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX01BUktFUjsNCisgIGRzdF9idWZbZHN0X3BvcysrXSA9IFJMRV9FT0k7DQorICBkc3Rfc2l6ZSA9IGRzdF9wb3M7DQorfQ0KK0ZYX0JPT0wgX2JtcF9lbmNvZGVfaW1hZ2UoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3Rfc2l6ZSkgew0KKyAgRlhfRFdPUkQgaGVhZF9zaXplID0gc2l6ZW9mKEJtcEZpbGVIZWFkZXIpICsgc2l6ZW9mKEJtcEluZm9IZWFkZXIpOw0KKyAgRlhfRFdPUkQgcGFsX3NpemUgPSBzaXplb2YoRlhfRFdPUkQpICogYm1wX3B0ci0+cGFsX251bTsNCisgIGlmIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUNsclVzZWQgPiAwICYmDQorICAgICAgYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlDbHJVc2VkIDwgYm1wX3B0ci0+cGFsX251bSkgew0KKyAgICBwYWxfc2l6ZSA9IHNpemVvZihGWF9EV09SRCkgKiBibXBfcHRyLT5pbmZvX2hlYWRlci5iaUNsclVzZWQ7DQorICB9DQorICBkc3Rfc2l6ZSA9IGhlYWRfc2l6ZSArIHNpemVvZihGWF9EV09SRCkgKiBibXBfcHRyLT5wYWxfbnVtOw0KKyAgZHN0X2J1ZiA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIGRzdF9zaXplKTsNCisgIGlmIChkc3RfYnVmID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KGRzdF9idWYsIDAsIGRzdF9zaXplKTsNCisgIGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0cyA9IGhlYWRfc2l6ZTsNCisgIGlmIChibXBfcHRyLT5wYWxfcHRyICYmIHBhbF9zaXplKSB7DQorICAgIEZYU1lTX21lbWNweSgmZHN0X2J1ZltoZWFkX3NpemVdLCBibXBfcHRyLT5wYWxfcHRyLCBwYWxfc2l6ZSk7DQorICAgIGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0cyArPSBwYWxfc2l6ZTsNCisgIH0NCisgIFdyaXRlSW5mb0hlYWRlcigmYm1wX3B0ci0+aW5mb19oZWFkZXIsIGRzdF9idWYpOw0KKyAgc3dpdGNoIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUNvbXByZXNzaW9uKSB7DQorICAgIGNhc2UgQk1QX1JHQjoNCisgICAgICBfYm1wX2VuY29kZV9yZ2IoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEJNUF9CSVRGSUVMRFM6DQorI2lmZGVmIEJNUF9TVVBQT1JUX0JJVEZJRUxEDQorICAgICAgX2JtcF9lbmNvZGVfYml0ZmllbGRzKGJtcF9wdHIsIGRzdF9idWYsIGRzdF9zaXplKTsNCisjZW5kaWYNCisgICAgICBicmVhazsNCisgICAgY2FzZSBCTVBfUkxFODoNCisgICAgICBfYm1wX2VuY29kZV9ybGU4KGJtcF9wdHIsIGRzdF9idWYsIGRzdF9zaXplKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBCTVBfUkxFNDoNCisgICAgICBfYm1wX2VuY29kZV9ybGU0KGJtcF9wdHIsIGRzdF9idWYsIGRzdF9zaXplKTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDo7DQorICB9DQorICBibXBfcHRyLT5maWxlX2hlYWRlci5iZlNpemUgPSBkc3Rfc2l6ZTsNCisgIFdyaXRlRmlsZUhlYWRlcigmYm1wX3B0ci0+ZmlsZV9oZWFkZXIsIGRzdF9idWYpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGJtcC9meF9ibXAuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvbGJtcC9meF9ibXAuaAppbmRleCBmM2M2ZTViLi4yZjA1ZjJjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xibXAvZnhfYm1wLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9sYm1wL2Z4X2JtcC5oCkBAIC05LDEwMCArOSwxMDQgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiDQogDQogI2RlZmluZSBCTVBfU1VQUE9SVF9CSVRGSUVMRA0KLSNkZWZpbmUgQk1QX1dJRFRIQllURVMod2lkdGgsYml0Q291bnQpCSgod2lkdGgqYml0Q291bnQpICsgMzEpLzMyKjQNCi0jZGVmaW5lIEJNUF9QQUxfRU5DT0RFKGEscixnLGIpICgoKEZYX0RXT1JEKShhKSA8PCAyNCkgfCAoKHIpIDw8IDE2KSB8ICgoZykgPDwgOCkgfCAoYikpDQotI2RlZmluZSBCTVBfRF9TVEFUVVNfSEVBREVSCQkweDAxDQotI2RlZmluZSBCTVBfRF9TVEFUVVNfUEFMCQkweDAyDQotI2RlZmluZSBCTVBfRF9TVEFUVVNfREFUQV9QUkUJMHgwMw0KLSNkZWZpbmUgQk1QX0RfU1RBVFVTX0RBVEEJCTB4MDQNCi0jZGVmaW5lIEJNUF9EX1NUQVRVU19UQUlMCQkweDAwDQotI2RlZmluZSBCTVBfU0lHTkFUVVJFCTB4NEQ0Mg0KLSNkZWZpbmUgQk1QX1BBTF9ORVcJCTANCi0jZGVmaW5lIEJNUF9QQUxfT0xECQkxDQotI2RlZmluZSBSTEVfTUFSS0VSCQkwDQotI2RlZmluZSBSTEVfRU9MCQkJMA0KLSNkZWZpbmUgUkxFX0VPSQkJCTENCi0jZGVmaW5lIFJMRV9ERUxUQQkJMg0KLSNkZWZpbmUgQk1QX1JHQgkJCTBMDQotI2RlZmluZSBCTVBfUkxFOAkJMUwNCi0jZGVmaW5lIEJNUF9STEU0CQkyTA0KLSNkZWZpbmUgQk1QX0JJVEZJRUxEUwkzTA0KLSNkZWZpbmUgQk1QX0JJVF81NTUJCTANCi0jZGVmaW5lIEJNUF9CSVRfNTY1CQkxDQotI2RlZmluZSBCTVBfTUFYX0VSUk9SX1NJWkUJMjU2DQorI2RlZmluZSBCTVBfV0lEVEhCWVRFUyh3aWR0aCwgYml0Q291bnQpICgod2lkdGggKiBiaXRDb3VudCkgKyAzMSkgLyAzMiAqIDQNCisjZGVmaW5lIEJNUF9QQUxfRU5DT0RFKGEsIHIsIGcsIGIpIFwNCisgICgoKEZYX0RXT1JEKShhKSA8PCAyNCkgfCAoKHIpIDw8IDE2KSB8ICgoZykgPDwgOCkgfCAoYikpDQorI2RlZmluZSBCTVBfRF9TVEFUVVNfSEVBREVSIDB4MDENCisjZGVmaW5lIEJNUF9EX1NUQVRVU19QQUwgMHgwMg0KKyNkZWZpbmUgQk1QX0RfU1RBVFVTX0RBVEFfUFJFIDB4MDMNCisjZGVmaW5lIEJNUF9EX1NUQVRVU19EQVRBIDB4MDQNCisjZGVmaW5lIEJNUF9EX1NUQVRVU19UQUlMIDB4MDANCisjZGVmaW5lIEJNUF9TSUdOQVRVUkUgMHg0RDQyDQorI2RlZmluZSBCTVBfUEFMX05FVyAwDQorI2RlZmluZSBCTVBfUEFMX09MRCAxDQorI2RlZmluZSBSTEVfTUFSS0VSIDANCisjZGVmaW5lIFJMRV9FT0wgMA0KKyNkZWZpbmUgUkxFX0VPSSAxDQorI2RlZmluZSBSTEVfREVMVEEgMg0KKyNkZWZpbmUgQk1QX1JHQiAwTA0KKyNkZWZpbmUgQk1QX1JMRTggMUwNCisjZGVmaW5lIEJNUF9STEU0IDJMDQorI2RlZmluZSBCTVBfQklURklFTERTIDNMDQorI2RlZmluZSBCTVBfQklUXzU1NSAwDQorI2RlZmluZSBCTVBfQklUXzU2NSAxDQorI2RlZmluZSBCTVBfTUFYX0VSUk9SX1NJWkUgMjU2DQogI3ByYWdtYSBwYWNrKDEpDQogdHlwZWRlZiBzdHJ1Y3QgdGFnQm1wRmlsZUhlYWRlciB7DQotICAgIEZYX1dPUkQJCWJmVHlwZTsNCi0gICAgRlhfRFdPUkQJYmZTaXplOw0KLSAgICBGWF9XT1JECQliZlJlc2VydmVkMTsNCi0gICAgRlhfV09SRAkJYmZSZXNlcnZlZDI7DQotICAgIEZYX0RXT1JECWJmT2ZmQml0czsNCisgIEZYX1dPUkQgYmZUeXBlOw0KKyAgRlhfRFdPUkQgYmZTaXplOw0KKyAgRlhfV09SRCBiZlJlc2VydmVkMTsNCisgIEZYX1dPUkQgYmZSZXNlcnZlZDI7DQorICBGWF9EV09SRCBiZk9mZkJpdHM7DQogfSBCbXBGaWxlSGVhZGVyLCAqQm1wRmlsZUhlYWRlclB0cjsNCiB0eXBlZGVmIHN0cnVjdCB0YWdCbXBDb3JlSGVhZGVyIHsNCi0gICAgRlhfRFdPUkQgICBiY1NpemU7DQotICAgIEZYX1dPUkQgICAgYmNXaWR0aDsNCi0gICAgRlhfV09SRCAgICBiY0hlaWdodDsNCi0gICAgRlhfV09SRCAgICBiY1BsYW5lczsNCi0gICAgRlhfV09SRCAgICBiY0JpdENvdW50Ow0KKyAgRlhfRFdPUkQgYmNTaXplOw0KKyAgRlhfV09SRCBiY1dpZHRoOw0KKyAgRlhfV09SRCBiY0hlaWdodDsNCisgIEZYX1dPUkQgYmNQbGFuZXM7DQorICBGWF9XT1JEIGJjQml0Q291bnQ7DQogfSBCbXBDb3JlSGVhZGVyLCAqQm1wQ29yZUhlYWRlclB0cjsNCiB0eXBlZGVmIHN0cnVjdCB0YWdCbXBJbmZvSGVhZGVyIHsNCi0gICAgRlhfRFdPUkQJYmlTaXplOw0KLSAgICBpbnQzMl90CWJpV2lkdGg7DQotICAgIGludDMyX3QJYmlIZWlnaHQ7DQotICAgIEZYX1dPUkQJCWJpUGxhbmVzOw0KLSAgICBGWF9XT1JECQliaUJpdENvdW50Ow0KLSAgICBGWF9EV09SRAliaUNvbXByZXNzaW9uOw0KLSAgICBGWF9EV09SRAliaVNpemVJbWFnZTsNCi0gICAgaW50MzJfdAliaVhQZWxzUGVyTWV0ZXI7DQotICAgIGludDMyX3QJYmlZUGVsc1Blck1ldGVyOw0KLSAgICBGWF9EV09SRAliaUNsclVzZWQ7DQotICAgIEZYX0RXT1JECWJpQ2xySW1wb3J0YW50Ow0KKyAgRlhfRFdPUkQgYmlTaXplOw0KKyAgaW50MzJfdCBiaVdpZHRoOw0KKyAgaW50MzJfdCBiaUhlaWdodDsNCisgIEZYX1dPUkQgYmlQbGFuZXM7DQorICBGWF9XT1JEIGJpQml0Q291bnQ7DQorICBGWF9EV09SRCBiaUNvbXByZXNzaW9uOw0KKyAgRlhfRFdPUkQgYmlTaXplSW1hZ2U7DQorICBpbnQzMl90IGJpWFBlbHNQZXJNZXRlcjsNCisgIGludDMyX3QgYmlZUGVsc1Blck1ldGVyOw0KKyAgRlhfRFdPUkQgYmlDbHJVc2VkOw0KKyAgRlhfRFdPUkQgYmlDbHJJbXBvcnRhbnQ7DQogfSBCbXBJbmZvSGVhZGVyLCAqQm1wSW5mb0hlYWRlclB0cjsNCiAjcHJhZ21hIHBhY2soKQ0KIHR5cGVkZWYgc3RydWN0IHRhZ19ibXBfZGVjb21wcmVzc19zdHJ1Y3QgYm1wX2RlY29tcHJlc3Nfc3RydWN0Ow0KLXR5cGVkZWYgYm1wX2RlY29tcHJlc3Nfc3RydWN0ICpibXBfZGVjb21wcmVzc19zdHJ1Y3RfcDsNCi10eXBlZGVmIGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wICpibXBfZGVjb21wcmVzc19zdHJ1Y3RfcHA7DQordHlwZWRlZiBibXBfZGVjb21wcmVzc19zdHJ1Y3QqIGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wOw0KK3R5cGVkZWYgYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AqIGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wcDsNCiBzdHJ1Y3QgdGFnX2JtcF9kZWNvbXByZXNzX3N0cnVjdCB7DQotICAgIGptcF9idWYJCQlqbXBidWY7DQotICAgIEZYX0NIQVIqCQllcnJfcHRyOw0KLSAgICB2b2lkCQkJKCpfYm1wX2Vycm9yX2ZuKShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKTsNCisgIGptcF9idWYgam1wYnVmOw0KKyAgRlhfQ0hBUiogZXJyX3B0cjsNCisgIHZvaWQgKCpfYm1wX2Vycm9yX2ZuKShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGVycl9tc2cpOw0KIA0KLSAgICB2b2lkKgkJCWNvbnRleHRfcHRyOw0KKyAgdm9pZCogY29udGV4dF9wdHI7DQogDQotICAgIEJtcEZpbGVIZWFkZXJQdHIJYm1wX2hlYWRlcl9wdHI7DQotICAgIEJtcEluZm9IZWFkZXJQdHIJYm1wX2luZm9oZWFkZXJfcHRyOw0KLSAgICBpbnQzMl90CQl3aWR0aDsNCi0gICAgaW50MzJfdAkJaGVpZ2h0Ow0KLSAgICBGWF9EV09SRAkJY29tcHJlc3NfZmxhZzsNCi0gICAgaW50MzJfdAkJY29tcG9uZW50czsNCi0gICAgaW50MzJfdAkJc3JjX3Jvd19ieXRlczsNCi0gICAgaW50MzJfdAkJb3V0X3Jvd19ieXRlczsNCi0gICAgdWludDhfdCoJCW91dF9yb3dfYnVmZmVyOw0KLSAgICBGWF9XT1JECQkJYml0Q291bnRzOw0KLSAgICBGWF9EV09SRAkJY29sb3JfdXNlZDsNCi0gICAgRlhfQk9PTAkJCWltZ1RCX2ZsYWc7DQotICAgIGludDMyX3QJCXBhbF9udW07DQotICAgIGludDMyX3QJCXBhbF90eXBlOw0KLSAgICBGWF9EV09SRCoJCXBhbF9wdHI7DQotICAgIEZYX0RXT1JECQlkYXRhX3NpemU7DQotICAgIEZYX0RXT1JECQlpbWdfZGF0YV9vZmZzZXQ7DQotICAgIEZYX0RXT1JECQlpbWdfaWZoX3NpemU7DQotICAgIGludDMyX3QJCXJvd19udW07DQotICAgIGludDMyX3QJCWNvbF9udW07DQotICAgIGludDMyX3QJCWRwaV94Ow0KLSAgICBpbnQzMl90CQlkcGlfeTsNCisgIEJtcEZpbGVIZWFkZXJQdHIgYm1wX2hlYWRlcl9wdHI7DQorICBCbXBJbmZvSGVhZGVyUHRyIGJtcF9pbmZvaGVhZGVyX3B0cjsNCisgIGludDMyX3Qgd2lkdGg7DQorICBpbnQzMl90IGhlaWdodDsNCisgIEZYX0RXT1JEIGNvbXByZXNzX2ZsYWc7DQorICBpbnQzMl90IGNvbXBvbmVudHM7DQorICBpbnQzMl90IHNyY19yb3dfYnl0ZXM7DQorICBpbnQzMl90IG91dF9yb3dfYnl0ZXM7DQorICB1aW50OF90KiBvdXRfcm93X2J1ZmZlcjsNCisgIEZYX1dPUkQgYml0Q291bnRzOw0KKyAgRlhfRFdPUkQgY29sb3JfdXNlZDsNCisgIEZYX0JPT0wgaW1nVEJfZmxhZzsNCisgIGludDMyX3QgcGFsX251bTsNCisgIGludDMyX3QgcGFsX3R5cGU7DQorICBGWF9EV09SRCogcGFsX3B0cjsNCisgIEZYX0RXT1JEIGRhdGFfc2l6ZTsNCisgIEZYX0RXT1JEIGltZ19kYXRhX29mZnNldDsNCisgIEZYX0RXT1JEIGltZ19pZmhfc2l6ZTsNCisgIGludDMyX3Qgcm93X251bTsNCisgIGludDMyX3QgY29sX251bTsNCisgIGludDMyX3QgZHBpX3g7DQorICBpbnQzMl90IGRwaV95Ow0KICNpZmRlZiBCTVBfU1VQUE9SVF9CSVRGSUVMRA0KLSAgICBGWF9EV09SRAkJbWFza19yZWQ7DQotICAgIEZYX0RXT1JECQltYXNrX2dyZWVuOw0KLSAgICBGWF9EV09SRAkJbWFza19ibHVlOw0KKyAgRlhfRFdPUkQgbWFza19yZWQ7DQorICBGWF9EV09SRCBtYXNrX2dyZWVuOw0KKyAgRlhfRFdPUkQgbWFza19ibHVlOw0KICNlbmRpZg0KIA0KLSAgICBGWF9CT09MCQkJKCpfYm1wX2dldF9kYXRhX3Bvc2l0aW9uX2ZuKShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCBGWF9EV09SRCBjdXJfcG9zKTsNCi0gICAgdm9pZAkJCSgqX2JtcF9nZXRfcm93X2ZuKShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLCBpbnQzMl90IHJvd19udW0sIHVpbnQ4X3QqIHJvd19idWYpOw0KLSAgICB1aW50OF90KgkJbmV4dF9pbjsNCi0gICAgRlhfRFdPUkQJCWF2YWlsX2luOw0KLSAgICBGWF9EV09SRAkJc2tpcF9zaXplOw0KLSAgICBpbnQzMl90CQlkZWNvZGVfc3RhdHVzOw0KKyAgRlhfQk9PTAkJCSgqX2JtcF9nZXRfZGF0YV9wb3NpdGlvbl9mbikoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgRlhfRFdPUkQgY3VyX3Bvcyk7DQorICB2b2lkICgqX2JtcF9nZXRfcm93X2ZuKShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcm93X2J1Zik7DQorICB1aW50OF90KiBuZXh0X2luOw0KKyAgRlhfRFdPUkQgYXZhaWxfaW47DQorICBGWF9EV09SRCBza2lwX3NpemU7DQorICBpbnQzMl90IGRlY29kZV9zdGF0dXM7DQogfTsNCiB2b2lkIF9ibXBfZXJyb3IoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgY29uc3QgRlhfQ0hBUiogZXJyX21zZyk7DQogYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgX2JtcF9jcmVhdGVfZGVjb21wcmVzcygpOw0KQEAgLTExMiwzMiArMTE2LDQwIEBACiBpbnQzMl90IF9ibXBfZGVjb2RlX3JnYihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKTsNCiBpbnQzMl90IF9ibXBfZGVjb2RlX3JsZTgoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cik7DQogaW50MzJfdCBfYm1wX2RlY29kZV9ybGU0KGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpOw0KLXVpbnQ4X3QqIF9ibXBfcmVhZF9kYXRhKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIHVpbnQ4X3QqKiBkZXNfYnVmX3BwLCBGWF9EV09SRCBkYXRhX3NpemUpOw0KK3VpbnQ4X3QqIF9ibXBfcmVhZF9kYXRhKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGRlc19idWZfcHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGF0YV9zaXplKTsNCiB2b2lkIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgaW50MzJfdCBzdGF0dXMpOw0KLXZvaWQgX2JtcF9pbnB1dF9idWZmZXIoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpOw0KLUZYX0RXT1JEIF9ibXBfZ2V0X2F2YWlsX2lucHV0KGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIHVpbnQ4X3QqKiBhdmlhbF9idWZfcHRyKTsNCi0jZGVmaW5lIEJNUF9QVFJfTk9UX05VTEwocHRyLGJtcF9wdHIpCWlmKHB0ciA9PSBOVUxMKXsJCQkJCQlcDQotICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsIk91dCBPZiBNZW1vcnkiKTtcDQotICAgICAgICByZXR1cm4gMDsJCQkJCQkJXA0KLSAgICB9DQordm9pZCBfYm1wX2lucHV0X2J1ZmZlcihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKTsNCitGWF9EV09SRCBfYm1wX2dldF9hdmFpbF9pbnB1dChibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmlhbF9idWZfcHRyKTsNCisjZGVmaW5lIEJNUF9QVFJfTk9UX05VTEwocHRyLCBibXBfcHRyKSAgICBcDQorICBpZiAocHRyID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJPdXQgT2YgTWVtb3J5Iik7IFwNCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9DQogdHlwZWRlZiBzdHJ1Y3QgdGFnX2JtcF9jb21wcmVzc19zdHJ1Y3QgYm1wX2NvbXByZXNzX3N0cnVjdDsNCi10eXBlZGVmIGJtcF9jb21wcmVzc19zdHJ1Y3QgKmJtcF9jb21wcmVzc19zdHJ1Y3RfcDsNCi10eXBlZGVmIGJtcF9jb21wcmVzc19zdHJ1Y3RfcCAqYm1wX2NvbXByZXNzX3N0cnVjdF9wcDsNCit0eXBlZGVmIGJtcF9jb21wcmVzc19zdHJ1Y3QqIGJtcF9jb21wcmVzc19zdHJ1Y3RfcDsNCit0eXBlZGVmIGJtcF9jb21wcmVzc19zdHJ1Y3RfcCogYm1wX2NvbXByZXNzX3N0cnVjdF9wcDsNCiBzdHJ1Y3QgdGFnX2JtcF9jb21wcmVzc19zdHJ1Y3Qgew0KLSAgICBCbXBGaWxlSGVhZGVyCWZpbGVfaGVhZGVyOw0KLSAgICBCbXBJbmZvSGVhZGVyCWluZm9faGVhZGVyOw0KLSAgICB1aW50OF90KgkJc3JjX2J1ZjsNCi0gICAgRlhfRFdPUkQJCXNyY19waXRjaDsNCi0gICAgRlhfRFdPUkQJCXNyY19yb3c7DQotICAgIHVpbnQ4X3QJCQlzcmNfYnBwOw0KLSAgICBGWF9EV09SRAkJc3JjX3dpZHRoOw0KLSAgICBGWF9CT09MCQkJc3JjX2ZyZWU7DQotICAgIEZYX0RXT1JEKgkJcGFsX3B0cjsNCi0gICAgRlhfV09SRAkJCXBhbF9udW07DQorICBCbXBGaWxlSGVhZGVyIGZpbGVfaGVhZGVyOw0KKyAgQm1wSW5mb0hlYWRlciBpbmZvX2hlYWRlcjsNCisgIHVpbnQ4X3QqIHNyY19idWY7DQorICBGWF9EV09SRCBzcmNfcGl0Y2g7DQorICBGWF9EV09SRCBzcmNfcm93Ow0KKyAgdWludDhfdCBzcmNfYnBwOw0KKyAgRlhfRFdPUkQgc3JjX3dpZHRoOw0KKyAgRlhfQk9PTCBzcmNfZnJlZTsNCisgIEZYX0RXT1JEKiBwYWxfcHRyOw0KKyAgRlhfV09SRCBwYWxfbnVtOw0KICNpZmRlZiBCTVBfU1VQUE9SVF9CSVRGSUVMRA0KLSAgICB1aW50OF90CQkJYml0X3R5cGU7DQorICB1aW50OF90IGJpdF90eXBlOw0KICNlbmRpZg0KIH07DQogYm1wX2NvbXByZXNzX3N0cnVjdF9wIF9ibXBfY3JlYXRlX2NvbXByZXNzKCk7DQogdm9pZCBfYm1wX2Rlc3Ryb3lfY29tcHJlc3MoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpOw0KLUZYX0JPT0wgX2JtcF9lbmNvZGVfaW1hZ2UoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X3NpemUpOw0KK0ZYX0JPT0wgX2JtcF9lbmNvZGVfaW1hZ2UoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3Rfc2l6ZSk7DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2xnaWYvZnhfZ2lmLmNwcAppbmRleCA2ZDIyZjU4Li5iMDdlYmIzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xnaWYvZnhfZ2lmLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2xnaWYvZnhfZ2lmLmNwcApAQCAtNSwxMzQ1ICs1LDE0MjIgQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQogDQogI2luY2x1ZGUgImZ4X2dpZi5oIg0KLXZvaWQgQ0dpZkxaV0RlY29kZXI6OklucHV0KHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKQ0KLXsNCi0gICAgbmV4dF9pbiA9IHNyY19idWY7DQotICAgIGF2YWlsX2luID0gc3JjX3NpemU7DQordm9pZCBDR2lmTFpXRGVjb2Rlcjo6SW5wdXQodWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpIHsNCisgIG5leHRfaW4gPSBzcmNfYnVmOw0KKyAgYXZhaWxfaW4gPSBzcmNfc2l6ZTsNCiB9DQotRlhfRFdPUkQgQ0dpZkxaV0RlY29kZXI6OkdldEF2YWlsSW5wdXQoKQ0KLXsNCi0gICAgcmV0dXJuIGF2YWlsX2luOw0KK0ZYX0RXT1JEIENHaWZMWldEZWNvZGVyOjpHZXRBdmFpbElucHV0KCkgew0KKyAgcmV0dXJuIGF2YWlsX2luOw0KIH0NCi12b2lkIENHaWZMWldEZWNvZGVyOjpJbml0VGFibGUodWludDhfdCBjb2RlX2xlbikNCi17DQotICAgIGNvZGVfc2l6ZSA9IGNvZGVfbGVuOw0KLSAgICBjb2RlX2NsZWFyID0gMSA8PCBjb2RlX3NpemU7DQotICAgIGNvZGVfZW5kID0gY29kZV9jbGVhciArIDE7DQotICAgIGJpdHNfbGVmdCA9IDA7DQotICAgIGNvZGVfc3RvcmUgPSAwOw0KLSAgICBuZXh0X2luID0gTlVMTDsNCi0gICAgYXZhaWxfaW4gPSAwOw0KK3ZvaWQgQ0dpZkxaV0RlY29kZXI6OkluaXRUYWJsZSh1aW50OF90IGNvZGVfbGVuKSB7DQorICBjb2RlX3NpemUgPSBjb2RlX2xlbjsNCisgIGNvZGVfY2xlYXIgPSAxIDw8IGNvZGVfc2l6ZTsNCisgIGNvZGVfZW5kID0gY29kZV9jbGVhciArIDE7DQorICBiaXRzX2xlZnQgPSAwOw0KKyAgY29kZV9zdG9yZSA9IDA7DQorICBuZXh0X2luID0gTlVMTDsNCisgIGF2YWlsX2luID0gMDsNCisgIHN0YWNrX3NpemUgPSAwOw0KKyAgY29kZV9maXJzdCA9IDA7DQorICBDbGVhclRhYmxlKCk7DQorfQ0KK3ZvaWQgQ0dpZkxaV0RlY29kZXI6OkNsZWFyVGFibGUoKSB7DQorICBjb2RlX3NpemVfY3VyID0gY29kZV9zaXplICsgMTsNCisgIGNvZGVfbmV4dCA9IGNvZGVfZW5kICsgMTsNCisgIGNvZGVfb2xkID0gKEZYX1dPUkQpLTE7DQorICBGWFNZU19tZW1zZXQoY29kZV90YWJsZSwgMCwgc2l6ZW9mKHRhZ19UYWJsZSkgKiBHSUZfTUFYX0xaV19DT0RFKTsNCisgIEZYU1lTX21lbXNldChzdGFjaywgMCwgR0lGX01BWF9MWldfQ09ERSk7DQorICBmb3IgKEZYX1dPUkQgaSA9IDA7IGkgPCBjb2RlX2NsZWFyOyBpKyspIHsNCisgICAgY29kZV90YWJsZVtpXS5zdWZmaXggPSAodWludDhfdClpOw0KKyAgfQ0KK30NCit2b2lkIENHaWZMWldEZWNvZGVyOjpEZWNvZGVTdHJpbmcoRlhfV09SRCBjb2RlKSB7DQorICBzdGFja19zaXplID0gMDsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIEFTU0VSVChjb2RlIDw9IGNvZGVfbmV4dCk7DQorICAgIGlmIChjb2RlIDwgY29kZV9jbGVhciB8fCBjb2RlID4gY29kZV9uZXh0KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIDEgLSBzdGFja19zaXplKytdID0gY29kZV90YWJsZVtjb2RlXS5zdWZmaXg7DQorICAgIGNvZGUgPSBjb2RlX3RhYmxlW2NvZGVdLnByZWZpeDsNCisgIH0NCisgIHN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSAxIC0gc3RhY2tfc2l6ZSsrXSA9ICh1aW50OF90KWNvZGU7DQorICBjb2RlX2ZpcnN0ID0gKHVpbnQ4X3QpY29kZTsNCit9DQordm9pZCBDR2lmTFpXRGVjb2Rlcjo6QWRkQ29kZShGWF9XT1JEIHByZWZpeF9jb2RlLCB1aW50OF90IGFwcGVuZF9jaGFyKSB7DQorICBpZiAoY29kZV9uZXh0ID09IEdJRl9NQVhfTFpXX0NPREUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgY29kZV90YWJsZVtjb2RlX25leHRdLnByZWZpeCA9IHByZWZpeF9jb2RlOw0KKyAgY29kZV90YWJsZVtjb2RlX25leHRdLnN1ZmZpeCA9IGFwcGVuZF9jaGFyOw0KKyAgaWYgKCsrY29kZV9uZXh0IDwgR0lGX01BWF9MWldfQ09ERSkgew0KKyAgICBpZiAoY29kZV9uZXh0ID4+IGNvZGVfc2l6ZV9jdXIpIHsNCisgICAgICBjb2RlX3NpemVfY3VyKys7DQorICAgIH0NCisgIH0NCit9DQoraW50MzJfdCBDR2lmTFpXRGVjb2Rlcjo6RGVjb2RlKHVpbnQ4X3QqIGRlc19idWYsIEZYX0RXT1JEJiBkZXNfc2l6ZSkgew0KKyAgaWYgKGRlc19zaXplID09IDApIHsNCisgICAgcmV0dXJuIDM7DQorICB9DQorICBGWF9EV09SRCBpID0gMDsNCisgIGlmIChzdGFja19zaXplICE9IDApIHsNCisgICAgaWYgKGRlc19zaXplIDwgc3RhY2tfc2l6ZSkgew0KKyAgICAgIEZYU1lTX21lbWNweShkZXNfYnVmLCAmc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIHN0YWNrX3NpemVdLCBkZXNfc2l6ZSk7DQorICAgICAgc3RhY2tfc2l6ZSAtPSAoRlhfV09SRClkZXNfc2l6ZTsNCisgICAgICByZXR1cm4gMzsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1jcHkoZGVzX2J1ZiwgJnN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXSwgc3RhY2tfc2l6ZSk7DQorICAgIGRlc19idWYgKz0gc3RhY2tfc2l6ZTsNCisgICAgaSArPSBzdGFja19zaXplOw0KICAgICBzdGFja19zaXplID0gMDsNCi0gICAgY29kZV9maXJzdCA9IDA7DQotICAgIENsZWFyVGFibGUoKTsNCi19DQotdm9pZCBDR2lmTFpXRGVjb2Rlcjo6Q2xlYXJUYWJsZSgpDQotew0KLSAgICBjb2RlX3NpemVfY3VyID0gY29kZV9zaXplICsgMTsNCi0gICAgY29kZV9uZXh0ID0gY29kZV9lbmQgKyAxOw0KLSAgICBjb2RlX29sZCA9IChGWF9XT1JEKSAtIDE7DQotICAgIEZYU1lTX21lbXNldChjb2RlX3RhYmxlLCAwLCBzaXplb2YodGFnX1RhYmxlKSpHSUZfTUFYX0xaV19DT0RFKTsNCi0gICAgRlhTWVNfbWVtc2V0KHN0YWNrLCAwLCBHSUZfTUFYX0xaV19DT0RFKTsNCi0gICAgZm9yIChGWF9XT1JEIGkgPSAwOyBpIDwgY29kZV9jbGVhcjsgaSsrKSB7DQotICAgICAgICBjb2RlX3RhYmxlW2ldLnN1ZmZpeCA9ICh1aW50OF90KWk7DQorICB9DQorICBGWF9XT1JEIGNvZGUgPSAwOw0KKyAgd2hpbGUgKGkgPD0gZGVzX3NpemUgJiYgKGF2YWlsX2luID4gMCB8fCBiaXRzX2xlZnQgPj0gY29kZV9zaXplX2N1cikpIHsNCisgICAgaWYgKGNvZGVfc2l6ZV9jdXIgPiAxMikgew0KKyAgICAgIGlmIChlcnJfbXNnX3B0cikgew0KKyAgICAgICAgRlhTWVNfc3RybmNweShlcnJfbXNnX3B0ciwgIkNvZGUgTGVuZ3RoIE91dCBPZiBSYW5nZSIsDQorICAgICAgICAgICAgICAgICAgICAgIEdJRl9NQVhfRVJST1JfU0laRSAtIDEpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gMDsNCiAgICAgfQ0KLX0NCi12b2lkIENHaWZMWldEZWNvZGVyOjpEZWNvZGVTdHJpbmcoRlhfV09SRCBjb2RlKQ0KLXsNCi0gICAgc3RhY2tfc2l6ZSA9IDA7DQotICAgIHdoaWxlIChUUlVFKSB7DQotICAgICAgICBBU1NFUlQoY29kZSA8PSBjb2RlX25leHQpOw0KLSAgICAgICAgaWYoY29kZSA8IGNvZGVfY2xlYXIgfHwgY29kZSA+IGNvZGVfbmV4dCkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KKyAgICBpZiAoYXZhaWxfaW4gPiAwKSB7DQorICAgICAgY29kZV9zdG9yZSB8PSAoKm5leHRfaW4rKykgPDwgYml0c19sZWZ0Ow0KKyAgICAgIGF2YWlsX2luLS07DQorICAgICAgYml0c19sZWZ0ICs9IDg7DQorICAgIH0NCisgICAgd2hpbGUgKGJpdHNfbGVmdCA+PSBjb2RlX3NpemVfY3VyKSB7DQorICAgICAgY29kZSA9IChGWF9XT1JEKWNvZGVfc3RvcmUgJiAoKDEgPDwgY29kZV9zaXplX2N1cikgLSAxKTsNCisgICAgICBjb2RlX3N0b3JlID4+PSBjb2RlX3NpemVfY3VyOw0KKyAgICAgIGJpdHNfbGVmdCAtPSBjb2RlX3NpemVfY3VyOw0KKyAgICAgIGlmIChjb2RlID09IGNvZGVfY2xlYXIpIHsNCisgICAgICAgIENsZWFyVGFibGUoKTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSBjb2RlX2VuZCkgew0KKyAgICAgICAgZGVzX3NpemUgPSBpOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChjb2RlX29sZCAhPSAoRlhfV09SRCktMSkgew0KKyAgICAgICAgICBpZiAoY29kZV9uZXh0IDwgR0lGX01BWF9MWldfQ09ERSkgew0KKyAgICAgICAgICAgIGlmIChjb2RlID09IGNvZGVfbmV4dCkgew0KKyAgICAgICAgICAgICAgQWRkQ29kZShjb2RlX29sZCwgY29kZV9maXJzdCk7DQorICAgICAgICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID4gY29kZV9uZXh0KSB7DQorICAgICAgICAgICAgICBpZiAoZXJyX21zZ19wdHIpIHsNCisgICAgICAgICAgICAgICAgRlhTWVNfc3RybmNweShlcnJfbXNnX3B0ciwgIkRlY29kZSBFcnJvciwgT3V0IE9mIFJhbmdlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSUZfTUFYX0VSUk9SX1NJWkUgLSAxKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7DQorICAgICAgICAgICAgICB1aW50OF90IGFwcGVuZF9jaGFyID0gc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIHN0YWNrX3NpemVdOw0KKyAgICAgICAgICAgICAgQWRkQ29kZShjb2RlX29sZCwgYXBwZW5kX2NoYXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgRGVjb2RlU3RyaW5nKGNvZGUpOw0KICAgICAgICAgfQ0KLSAgICAgICAgc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIDEgLSBzdGFja19zaXplKytdID0gY29kZV90YWJsZVtjb2RlXS5zdWZmaXg7DQotICAgICAgICBjb2RlID0gY29kZV90YWJsZVtjb2RlXS5wcmVmaXg7DQotICAgIH0NCi0gICAgc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIDEgLSBzdGFja19zaXplKytdID0gKHVpbnQ4X3QpY29kZTsNCi0gICAgY29kZV9maXJzdCA9ICh1aW50OF90KWNvZGU7DQotfQ0KLXZvaWQgQ0dpZkxaV0RlY29kZXI6OkFkZENvZGUoRlhfV09SRCBwcmVmaXhfY29kZSwgdWludDhfdCBhcHBlbmRfY2hhcikNCi17DQotICAgIGlmKGNvZGVfbmV4dCA9PSBHSUZfTUFYX0xaV19DT0RFKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgY29kZV90YWJsZVtjb2RlX25leHRdLnByZWZpeCA9IHByZWZpeF9jb2RlOw0KLSAgICBjb2RlX3RhYmxlW2NvZGVfbmV4dF0uc3VmZml4ID0gYXBwZW5kX2NoYXI7DQotICAgIGlmKCsrY29kZV9uZXh0IDwgR0lGX01BWF9MWldfQ09ERSkgew0KLSAgICAgICAgaWYoY29kZV9uZXh0ID4+IGNvZGVfc2l6ZV9jdXIpIHsNCi0gICAgICAgICAgICBjb2RlX3NpemVfY3VyKys7DQorICAgICAgICBjb2RlX29sZCA9IGNvZGU7DQorICAgICAgICBpZiAoaSArIHN0YWNrX3NpemUgPiBkZXNfc2l6ZSkgew0KKyAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzX2J1ZiwgJnN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXSwNCisgICAgICAgICAgICAgICAgICAgICAgIGRlc19zaXplIC0gaSk7DQorICAgICAgICAgIHN0YWNrX3NpemUgLT0gKEZYX1dPUkQpKGRlc19zaXplIC0gaSk7DQorICAgICAgICAgIHJldHVybiAzOw0KICAgICAgICAgfQ0KLSAgICB9DQotfQ0KLWludDMyX3QgQ0dpZkxaV0RlY29kZXI6OkRlY29kZSh1aW50OF90KiBkZXNfYnVmLCBGWF9EV09SRCYgZGVzX3NpemUpDQotew0KLSAgICBpZihkZXNfc2l6ZSA9PSAwKSB7DQotICAgICAgICByZXR1cm4gMzsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBpID0gMDsNCi0gICAgaWYoc3RhY2tfc2l6ZSAhPSAwKSB7DQotICAgICAgICBpZihkZXNfc2l6ZSA8IHN0YWNrX3NpemUpIHsNCi0gICAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzX2J1ZiwgJnN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXSwgZGVzX3NpemUpOw0KLSAgICAgICAgICAgIHN0YWNrX3NpemUgLT0gKEZYX1dPUkQpZGVzX3NpemU7DQotICAgICAgICAgICAgcmV0dXJuIDM7DQotICAgICAgICB9DQotICAgICAgICBGWFNZU19tZW1jcHkoZGVzX2J1ZiwgJnN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXSwgc3RhY2tfc2l6ZSk7DQorICAgICAgICBGWFNZU19tZW1jcHkoZGVzX2J1ZiwgJnN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXSwNCisgICAgICAgICAgICAgICAgICAgICBzdGFja19zaXplKTsNCiAgICAgICAgIGRlc19idWYgKz0gc3RhY2tfc2l6ZTsNCiAgICAgICAgIGkgKz0gc3RhY2tfc2l6ZTsNCiAgICAgICAgIHN0YWNrX3NpemUgPSAwOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGWF9XT1JEIGNvZGUgPSAwOw0KLSAgICB3aGlsZShpIDw9IGRlc19zaXplICYmIChhdmFpbF9pbiA+IDAgfHwgYml0c19sZWZ0ID49IGNvZGVfc2l6ZV9jdXIpKSB7DQotICAgICAgICBpZihjb2RlX3NpemVfY3VyID4gMTIpIHsNCi0gICAgICAgICAgICBpZihlcnJfbXNnX3B0cikJew0KLSAgICAgICAgICAgICAgICBGWFNZU19zdHJuY3B5KGVycl9tc2dfcHRyLCAiQ29kZSBMZW5ndGggT3V0IE9mIFJhbmdlIiwgR0lGX01BWF9FUlJPUl9TSVpFIC0gMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGF2YWlsX2luID4gMCkgew0KLSAgICAgICAgICAgIGNvZGVfc3RvcmUgfD0gKCpuZXh0X2luKyspIDw8IGJpdHNfbGVmdDsNCi0gICAgICAgICAgICBhdmFpbF9pbi0tOw0KLSAgICAgICAgICAgIGJpdHNfbGVmdCArPSA4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgd2hpbGUgKGJpdHNfbGVmdCA+PSBjb2RlX3NpemVfY3VyKSB7DQotICAgICAgICAgICAgY29kZSA9IChGWF9XT1JEKWNvZGVfc3RvcmUgJiAoKDEgPDwgY29kZV9zaXplX2N1cikgLSAxKTsNCi0gICAgICAgICAgICBjb2RlX3N0b3JlID4+PSBjb2RlX3NpemVfY3VyOw0KLSAgICAgICAgICAgIGJpdHNfbGVmdCAtPSBjb2RlX3NpemVfY3VyOw0KLSAgICAgICAgICAgIGlmKGNvZGUgPT0gY29kZV9jbGVhcikgew0KLSAgICAgICAgICAgICAgICBDbGVhclRhYmxlKCk7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSBjb2RlX2VuZCkgew0KLSAgICAgICAgICAgICAgICBkZXNfc2l6ZSA9IGk7DQotICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmKGNvZGVfb2xkICE9IChGWF9XT1JEKSAtIDEpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGNvZGVfbmV4dCA8IEdJRl9NQVhfTFpXX0NPREUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihjb2RlID09IGNvZGVfbmV4dCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRDb2RlKGNvZGVfb2xkLCBjb2RlX2ZpcnN0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlU3RyaW5nKGNvZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihjb2RlID4gY29kZV9uZXh0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVycl9tc2dfcHRyKQl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19zdHJuY3B5KGVycl9tc2dfcHRyLCAiRGVjb2RlIEVycm9yLCBPdXQgT2YgUmFuZ2UiLCBHSUZfTUFYX0VSUk9SX1NJWkUgLSAxKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwZW5kX2NoYXIgPSBzdGFja1tHSUZfTUFYX0xaV19DT0RFIC0gc3RhY2tfc2l6ZV07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZENvZGUoY29kZV9vbGQsIGFwcGVuZF9jaGFyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY29kZV9vbGQgPSBjb2RlOw0KLSAgICAgICAgICAgICAgICBpZihpICsgc3RhY2tfc2l6ZSA+IGRlc19zaXplKSB7DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzX2J1ZiwgJnN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXSwgZGVzX3NpemUgLSBpKTsNCi0gICAgICAgICAgICAgICAgICAgIHN0YWNrX3NpemUgLT0gKEZYX1dPUkQpKGRlc19zaXplIC0gaSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzX2J1ZiwgJnN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXSwgc3RhY2tfc2l6ZSk7DQotICAgICAgICAgICAgICAgIGRlc19idWYgKz0gc3RhY2tfc2l6ZTsNCi0gICAgICAgICAgICAgICAgaSArPSBzdGFja19zaXplOw0KLSAgICAgICAgICAgICAgICBzdGFja19zaXplID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYoYXZhaWxfaW4gPT0gMCkgew0KLSAgICAgICAgZGVzX3NpemUgPSBpOw0KLSAgICAgICAgcmV0dXJuIDI7DQotICAgIH0NCi0gICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAoYXZhaWxfaW4gPT0gMCkgew0KKyAgICBkZXNfc2l6ZSA9IGk7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQogfQ0KLXN0YXRpYyBGWF9CT09MIF9naWZfZ3Jvd19idWYodWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuLCBGWF9EV09SRCBzaXplKQ0KLXsNCi0gICAgaWYgKGRzdF9sZW4gPCBzaXplKSB7DQotICAgICAgICBGWF9EV09SRCBsZW5fb3JnID0gZHN0X2xlbjsNCi0gICAgICAgIHdoaWxlIChkc3RfYnVmICYmIGRzdF9sZW4gPCBzaXplKSB7DQotICAgICAgICAgICAgZHN0X2xlbiA8PD0gMTsNCi0gICAgICAgICAgICBkc3RfYnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBkc3RfYnVmLCBkc3RfbGVuKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChkc3RfYnVmID09IE5VTEwpIHsNCi0gICAgICAgICAgICBkc3RfbGVuID0gc2l6ZTsNCi0gICAgICAgICAgICBkc3RfYnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBkc3RfYnVmLCBkc3RfbGVuKTsNCi0gICAgICAgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBGWFNZU19tZW1zZXQoZHN0X2J1ZiArIGxlbl9vcmcsIDAsIGRzdF9sZW4gLSBsZW5fb3JnKTsNCi0gICAgICAgIHJldHVybiBkc3RfYnVmICE9IE5VTEw7DQorc3RhdGljIEZYX0JPT0wgX2dpZl9ncm93X2J1Zih1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3RfbGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSkgew0KKyAgaWYgKGRzdF9sZW4gPCBzaXplKSB7DQorICAgIEZYX0RXT1JEIGxlbl9vcmcgPSBkc3RfbGVuOw0KKyAgICB3aGlsZSAoZHN0X2J1ZiAmJiBkc3RfbGVuIDwgc2l6ZSkgew0KKyAgICAgIGRzdF9sZW4gPDw9IDE7DQorICAgICAgZHN0X2J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgZHN0X2J1ZiwgZHN0X2xlbik7DQogICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIGlmIChkc3RfYnVmID09IE5VTEwpIHsNCisgICAgICBkc3RfbGVuID0gc2l6ZTsNCisgICAgICBkc3RfYnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBkc3RfYnVmLCBkc3RfbGVuKTsNCisgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYU1lTX21lbXNldChkc3RfYnVmICsgbGVuX29yZywgMCwgZHN0X2xlbiAtIGxlbl9vcmcpOw0KKyAgICByZXR1cm4gZHN0X2J1ZiAhPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfZ2lmX2N1dF9pbmRleCh1aW50OF90JiB2YWwsIEZYX0RXT1JEIGluZGV4LCB1aW50OF90IGluZGV4X2JpdCwgdWludDhfdCBpbmRleF9iaXRfdXNlLCB1aW50OF90IGJpdF91c2UpDQotew0KLSAgICBGWF9EV09SRCBjdXQgPSAoKDEgPDwgKGluZGV4X2JpdCAtIGluZGV4X2JpdF91c2UpKSAtIDEpIDw8IGluZGV4X2JpdF91c2U7DQotICAgIHZhbCB8PSAoKGluZGV4ICYgY3V0KSA+PiBpbmRleF9iaXRfdXNlKSA8PCBiaXRfdXNlOw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBfZ2lmX2N1dF9pbmRleCh1aW50OF90JiB2YWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGluZGV4X2JpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbmRleF9iaXRfdXNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJpdF91c2UpIHsNCisgIEZYX0RXT1JEIGN1dCA9ICgoMSA8PCAoaW5kZXhfYml0IC0gaW5kZXhfYml0X3VzZSkpIC0gMSkgPDwgaW5kZXhfYml0X3VzZTsNCisgIHZhbCB8PSAoKGluZGV4ICYgY3V0KSA+PiBpbmRleF9iaXRfdXNlKSA8PCBiaXRfdXNlOw0KIH0NCi1zdGF0aWMgaW5saW5lIHVpbnQ4X3QgX2dpZl9jdXRfYnVmKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgRlhfRFdPUkQmIG9mZnNldCwgdWludDhfdCBiaXRfY3V0LCB1aW50OF90JiBiaXRfb2Zmc2V0LCBGWF9EV09SRCYgYml0X251bSkNCi17DQotICAgIGlmIChiaXRfY3V0ICE9IDgpIHsNCi0gICAgICAgIEZYX1dPUkQgaW5kZXggPSAwOw0KLSAgICAgICAgaW5kZXggfD0gKCgxIDw8IGJpdF9jdXQpIC0gMSkgPDwgKDcgLSBiaXRfb2Zmc2V0KTsNCi0gICAgICAgIHVpbnQ4X3QgcmV0ID0gKChpbmRleCAmIGJ1ZltvZmZzZXRdKSA+PiAoNyAtIGJpdF9vZmZzZXQpKTsNCi0gICAgICAgIGJpdF9vZmZzZXQgKz0gYml0X2N1dDsNCi0gICAgICAgIGlmIChiaXRfb2Zmc2V0ID49IDgpIHsNCi0gICAgICAgICAgICBpZiAoYml0X29mZnNldCA+IDgpIHsNCi0gICAgICAgICAgICAgICAgcmV0IHw9ICgoaW5kZXggJiAoYnVmW29mZnNldCArIDFdIDw8IDgpKSA+PiA4KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYml0X29mZnNldCAtPSA4Ow0KLSAgICAgICAgICAgIG9mZnNldCArKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGJpdF9udW0gKz0gYml0X2N1dDsNCi0gICAgICAgIHJldHVybiByZXQ7DQorc3RhdGljIGlubGluZSB1aW50OF90IF9naWZfY3V0X2J1Zihjb25zdCB1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiaXRfY3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgYml0X29mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBiaXRfbnVtKSB7DQorICBpZiAoYml0X2N1dCAhPSA4KSB7DQorICAgIEZYX1dPUkQgaW5kZXggPSAwOw0KKyAgICBpbmRleCB8PSAoKDEgPDwgYml0X2N1dCkgLSAxKSA8PCAoNyAtIGJpdF9vZmZzZXQpOw0KKyAgICB1aW50OF90IHJldCA9ICgoaW5kZXggJiBidWZbb2Zmc2V0XSkgPj4gKDcgLSBiaXRfb2Zmc2V0KSk7DQorICAgIGJpdF9vZmZzZXQgKz0gYml0X2N1dDsNCisgICAgaWYgKGJpdF9vZmZzZXQgPj0gOCkgew0KKyAgICAgIGlmIChiaXRfb2Zmc2V0ID4gOCkgew0KKyAgICAgICAgcmV0IHw9ICgoaW5kZXggJiAoYnVmW29mZnNldCArIDFdIDw8IDgpKSA+PiA4KTsNCisgICAgICB9DQorICAgICAgYml0X29mZnNldCAtPSA4Ow0KKyAgICAgIG9mZnNldCsrOw0KICAgICB9DQogICAgIGJpdF9udW0gKz0gYml0X2N1dDsNCi0gICAgcmV0dXJuIGJ1ZltvZmZzZXQrK107DQorICAgIHJldHVybiByZXQ7DQorICB9DQorICBiaXRfbnVtICs9IGJpdF9jdXQ7DQorICByZXR1cm4gYnVmW29mZnNldCsrXTsNCiB9DQotQ0dpZkxaV0VuY29kZXI6OkNHaWZMWldFbmNvZGVyKCkNCi17DQotICAgIEZYU1lTX21lbXNldCh0aGlzLCAwLCBzaXplb2YoQ0dpZkxaV0VuY29kZXIpKTsNCitDR2lmTFpXRW5jb2Rlcjo6Q0dpZkxaV0VuY29kZXIoKSB7DQorICBGWFNZU19tZW1zZXQodGhpcywgMCwgc2l6ZW9mKENHaWZMWldFbmNvZGVyKSk7DQogfQ0KLUNHaWZMWldFbmNvZGVyOjp+Q0dpZkxaV0VuY29kZXIoKQ0KLXsNCitDR2lmTFpXRW5jb2Rlcjo6fkNHaWZMWldFbmNvZGVyKCkge30NCit2b2lkIENHaWZMWldFbmNvZGVyOjpDbGVhclRhYmxlKCkgew0KKyAgaW5kZXhfYml0X2N1ciA9IGNvZGVfc2l6ZSArIDE7DQorICBpbmRleF9udW0gPSBjb2RlX2VuZCArIDE7DQorICB0YWJsZV9jdXIgPSBjb2RlX2VuZCArIDE7DQorICBmb3IgKEZYX1dPUkQgaSA9IDA7IGkgPCBHSUZfTUFYX0xaV19DT0RFOyBpKyspIHsNCisgICAgY29kZV90YWJsZVtpXS5wcmVmaXggPSAwOw0KKyAgICBjb2RlX3RhYmxlW2ldLnN1ZmZpeCA9IDA7DQorICB9DQogfQ0KLXZvaWQgQ0dpZkxaV0VuY29kZXI6OkNsZWFyVGFibGUoKQ0KLXsNCi0gICAgaW5kZXhfYml0X2N1ciA9IGNvZGVfc2l6ZSArIDE7DQotICAgIGluZGV4X251bSA9IGNvZGVfZW5kICsgMTsNCi0gICAgdGFibGVfY3VyID0gY29kZV9lbmQgKyAxOw0KLSAgICBmb3IgKEZYX1dPUkQgaSA9IDA7IGkgPCBHSUZfTUFYX0xaV19DT0RFOyBpKyspIHsNCi0gICAgICAgIGNvZGVfdGFibGVbaV0ucHJlZml4ID0gMDsNCi0gICAgICAgIGNvZGVfdGFibGVbaV0uc3VmZml4ID0gMDsNCi0gICAgfQ0KK3ZvaWQgQ0dpZkxaV0VuY29kZXI6OlN0YXJ0KHVpbnQ4X3QgY29kZV9sZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgb2Zmc2V0KSB7DQorICBjb2RlX3NpemUgPSBjb2RlX2xlbiArIDE7DQorICBzcmNfYml0X2N1dCA9IGNvZGVfc2l6ZTsNCisgIGlmIChjb2RlX2xlbiA9PSAwKSB7DQorICAgIHNyY19iaXRfY3V0ID0gMTsNCisgICAgY29kZV9zaXplID0gMjsNCisgIH0NCisgIGNvZGVfY2xlYXIgPSAxIDw8IGNvZGVfc2l6ZTsNCisgIGNvZGVfZW5kID0gY29kZV9jbGVhciArIDE7DQorICBkc3RfYnVmW29mZnNldCsrXSA9IGNvZGVfc2l6ZTsNCisgIGJpdF9vZmZzZXQgPSAwOw0KKyAgQ2xlYXJUYWJsZSgpOw0KKyAgc3JjX29mZnNldCA9IDA7DQorICBzcmNfYml0X29mZnNldCA9IDA7DQorICBzcmNfYml0X251bSA9IDA7DQorICBjb2RlX3RhYmxlW2luZGV4X251bV0ucHJlZml4ID0gX2dpZl9jdXRfYnVmKHNyY19idWYsIHNyY19vZmZzZXQsIHNyY19iaXRfY3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYml0X29mZnNldCwgc3JjX2JpdF9udW0pOw0KKyAgY29kZV90YWJsZVtpbmRleF9udW1dLnN1ZmZpeCA9IF9naWZfY3V0X2J1ZihzcmNfYnVmLCBzcmNfb2Zmc2V0LCBzcmNfYml0X2N1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2JpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsNCiB9DQotdm9pZCBDR2lmTFpXRW5jb2Rlcjo6U3RhcnQoIHVpbnQ4X3QgY29kZV9sZW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgb2Zmc2V0KQ0KLXsNCi0gICAgY29kZV9zaXplID0gY29kZV9sZW4gKyAxOw0KLSAgICBzcmNfYml0X2N1dCA9IGNvZGVfc2l6ZTsNCi0gICAgaWYgKGNvZGVfbGVuID09IDApIHsNCi0gICAgICAgIHNyY19iaXRfY3V0ID0gMTsNCi0gICAgICAgIGNvZGVfc2l6ZSA9IDI7DQotICAgIH0NCi0gICAgY29kZV9jbGVhciA9IDEgPDwgY29kZV9zaXplOw0KLSAgICBjb2RlX2VuZCA9IGNvZGVfY2xlYXIgKyAxOw0KLSAgICBkc3RfYnVmW29mZnNldCsrXSA9IGNvZGVfc2l6ZTsNCit2b2lkIENHaWZMWldFbmNvZGVyOjpXcml0ZUJsb2NrKHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9sZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgb2Zmc2V0KSB7DQorICBpZiAoIV9naWZfZ3Jvd19idWYoZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0ICsgR0lGX0RBVEFfQkxPQ0sgKyAxKSkgew0KKyAgICBsb25nam1wKGptcCwgMSk7DQorICB9DQorICBkc3RfYnVmW29mZnNldCsrXSA9IGluZGV4X2J1Zl9sZW47DQorICBGWFNZU19tZW1jcHkoJmRzdF9idWZbb2Zmc2V0XSwgaW5kZXhfYnVmLCBpbmRleF9idWZfbGVuKTsNCisgIG9mZnNldCArPSBpbmRleF9idWZfbGVuOw0KKyAgRlhTWVNfbWVtc2V0KGluZGV4X2J1ZiwgMCwgR0lGX0RBVEFfQkxPQ0spOw0KKyAgaW5kZXhfYnVmX2xlbiA9IDA7DQorfQ0KK3ZvaWQgQ0dpZkxaV0VuY29kZXI6OkVuY29kZVN0cmluZyhGWF9EV09SRCBpbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3RfbGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgb2Zmc2V0KSB7DQorICB1aW50OF90IGluZGV4X2JpdF91c2U7DQorICBpbmRleF9iaXRfdXNlID0gMDsNCisgIGlmIChpbmRleF9idWZfbGVuID09IEdJRl9EQVRBX0JMT0NLKSB7DQorICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCisgIH0NCisgIF9naWZfY3V0X2luZGV4KGluZGV4X2J1ZltpbmRleF9idWZfbGVuXSwgaW5kZXgsIGluZGV4X2JpdF9jdXIsIGluZGV4X2JpdF91c2UsDQorICAgICAgICAgICAgICAgICBiaXRfb2Zmc2V0KTsNCisgIGlmIChpbmRleF9iaXRfY3VyIDw9ICg4IC0gYml0X29mZnNldCkpIHsNCisgICAgYml0X29mZnNldCArPSBpbmRleF9iaXRfY3VyOw0KKyAgfSBlbHNlIGlmIChpbmRleF9iaXRfY3VyIDw9ICgxNiAtIGJpdF9vZmZzZXQpKSB7DQorICAgIGluZGV4X2JpdF91c2UgKz0gKDggLSBiaXRfb2Zmc2V0KTsNCiAgICAgYml0X29mZnNldCA9IDA7DQotICAgIENsZWFyVGFibGUoKTsNCi0gICAgc3JjX29mZnNldCA9IDA7DQotICAgIHNyY19iaXRfb2Zmc2V0ID0gMDsNCi0gICAgc3JjX2JpdF9udW0gPSAwOw0KLSAgICBjb2RlX3RhYmxlW2luZGV4X251bV0ucHJlZml4ID0gX2dpZl9jdXRfYnVmKHNyY19idWYsIHNyY19vZmZzZXQsIHNyY19iaXRfY3V0LCBzcmNfYml0X29mZnNldCwgc3JjX2JpdF9udW0pOw0KLSAgICBjb2RlX3RhYmxlW2luZGV4X251bV0uc3VmZml4ID0gX2dpZl9jdXRfYnVmKHNyY19idWYsIHNyY19vZmZzZXQsIHNyY19iaXRfY3V0LCBzcmNfYml0X29mZnNldCwgc3JjX2JpdF9udW0pOw0KLX0NCi12b2lkIENHaWZMWldFbmNvZGVyOjpXcml0ZUJsb2NrKHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiwgRlhfRFdPUkQmIG9mZnNldCkNCi17DQotICAgIGlmICghX2dpZl9ncm93X2J1Zihkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQgKyBHSUZfREFUQV9CTE9DSyArIDEpKSB7DQotICAgICAgICBsb25nam1wKGptcCwgMSk7DQotICAgIH0NCi0gICAgZHN0X2J1ZltvZmZzZXQrK10gPSBpbmRleF9idWZfbGVuOw0KLSAgICBGWFNZU19tZW1jcHkoJmRzdF9idWZbb2Zmc2V0XSwgaW5kZXhfYnVmLCBpbmRleF9idWZfbGVuKTsNCi0gICAgb2Zmc2V0ICs9IGluZGV4X2J1Zl9sZW47DQotICAgIEZYU1lTX21lbXNldChpbmRleF9idWYsIDAsIEdJRl9EQVRBX0JMT0NLKTsNCi0gICAgaW5kZXhfYnVmX2xlbiA9IDA7DQotfQ0KLXZvaWQgQ0dpZkxaV0VuY29kZXI6OkVuY29kZVN0cmluZyggRlhfRFdPUkQgaW5kZXgsIHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiwgRlhfRFdPUkQmIG9mZnNldCApDQotew0KLSAgICB1aW50OF90IGluZGV4X2JpdF91c2U7DQotICAgIGluZGV4X2JpdF91c2UgPSAwOw0KKyAgICBpbmRleF9idWZfbGVuKys7DQogICAgIGlmIChpbmRleF9idWZfbGVuID09IEdJRl9EQVRBX0JMT0NLKSB7DQotICAgICAgICBXcml0ZUJsb2NrKGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQorICAgICAgV3JpdGVCbG9jayhkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KICAgICB9DQotICAgIF9naWZfY3V0X2luZGV4KGluZGV4X2J1ZltpbmRleF9idWZfbGVuXSwgaW5kZXgsIGluZGV4X2JpdF9jdXIsIGluZGV4X2JpdF91c2UsIGJpdF9vZmZzZXQpOw0KLSAgICBpZiAoaW5kZXhfYml0X2N1ciA8PSAoOCAtIGJpdF9vZmZzZXQpKSB7DQotICAgICAgICBiaXRfb2Zmc2V0ICs9IGluZGV4X2JpdF9jdXI7DQotICAgIH0gZWxzZSBpZiAoaW5kZXhfYml0X2N1ciA8PSAoMTYgLSBiaXRfb2Zmc2V0KSkgew0KLSAgICAgICAgaW5kZXhfYml0X3VzZSArPSAoOCAtIGJpdF9vZmZzZXQpOw0KLSAgICAgICAgYml0X29mZnNldCA9IDA7DQotICAgICAgICBpbmRleF9idWZfbGVuKys7DQotICAgICAgICBpZiAoaW5kZXhfYnVmX2xlbiA9PSBHSUZfREFUQV9CTE9DSykgew0KLSAgICAgICAgICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIF9naWZfY3V0X2luZGV4KGluZGV4X2J1ZltpbmRleF9idWZfbGVuXSwgaW5kZXgsIGluZGV4X2JpdF9jdXIsIGluZGV4X2JpdF91c2UsIGJpdF9vZmZzZXQpOw0KLSAgICAgICAgYml0X29mZnNldCA9IGluZGV4X2JpdF9jdXIgLSBpbmRleF9iaXRfdXNlOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaW5kZXhfYml0X3VzZSArPSAoOCAtIGJpdF9vZmZzZXQpOw0KLSAgICAgICAgYml0X29mZnNldCA9IDA7DQotICAgICAgICBpbmRleF9idWZfbGVuKys7DQotICAgICAgICBpZiAoaW5kZXhfYnVmX2xlbiA9PSBHSUZfREFUQV9CTE9DSykgew0KLSAgICAgICAgICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIF9naWZfY3V0X2luZGV4KGluZGV4X2J1ZltpbmRleF9idWZfbGVuXSwgaW5kZXgsIGluZGV4X2JpdF9jdXIsIGluZGV4X2JpdF91c2UsIGJpdF9vZmZzZXQpOw0KLSAgICAgICAgaW5kZXhfYml0X3VzZSArPSA4Ow0KLSAgICAgICAgYml0X29mZnNldCA9IDA7DQotICAgICAgICBpbmRleF9idWZfbGVuKys7DQotICAgICAgICBpZiAoaW5kZXhfYnVmX2xlbiA9PSBHSUZfREFUQV9CTE9DSykgew0KLSAgICAgICAgICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIF9naWZfY3V0X2luZGV4KGluZGV4X2J1ZltpbmRleF9idWZfbGVuXSwgaW5kZXgsIGluZGV4X2JpdF9jdXIsIGluZGV4X2JpdF91c2UsIGJpdF9vZmZzZXQpOw0KLSAgICAgICAgYml0X29mZnNldCA9IGluZGV4X2JpdF9jdXIgLSBpbmRleF9iaXRfdXNlOw0KLSAgICB9DQotICAgIGlmIChiaXRfb2Zmc2V0ID09IDgpIHsNCi0gICAgICAgIGJpdF9vZmZzZXQgPSAwOw0KLSAgICAgICAgaW5kZXhfYnVmX2xlbisrOw0KLSAgICAgICAgaWYgKGluZGV4X2J1Zl9sZW4gPT0gR0lGX0RBVEFfQkxPQ0spIHsNCi0gICAgICAgICAgICBXcml0ZUJsb2NrKGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGluZGV4ID09IGNvZGVfZW5kKQl7DQotICAgICAgICBpbmRleF9idWZfbGVuKys7DQotICAgICAgICBXcml0ZUJsb2NrKGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQotICAgIH0NCi0gICAgaWYgKGluZGV4X251bSsrID4+IGluZGV4X2JpdF9jdXIpIHsNCi0gICAgICAgIGluZGV4X2JpdF9jdXIrKzsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENHaWZMWldFbmNvZGVyOjpFbmNvZGUoIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19sZW4sIHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiwgRlhfRFdPUkQmIG9mZnNldCApDQotew0KLSAgICB1aW50OF90CQlzdWZmaXg7DQotICAgIGlmIChzZXRqbXAoam1wKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHdoaWxlKHNyY19iaXRfbnVtIDwgc3JjX2xlbikgew0KLSAgICAgICAgaWYgKCFMb29rVXBJblRhYmxlKHNyY19idWYsIHNyY19vZmZzZXQsIHNyY19iaXRfb2Zmc2V0KSkgew0KLSAgICAgICAgICAgIEVuY29kZVN0cmluZyhjb2RlX3RhYmxlW2luZGV4X251bV0ucHJlZml4LCBkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KLSAgICAgICAgICAgIGlmIChpbmRleF9udW0gPT0gR0lGX01BWF9MWldfQ09ERSkgew0KLSAgICAgICAgICAgICAgICBzdWZmaXggPSBjb2RlX3RhYmxlW2luZGV4X251bSAtIDFdLnN1ZmZpeDsNCi0gICAgICAgICAgICAgICAgRW5jb2RlU3RyaW5nKGNvZGVfY2xlYXIsIGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQotICAgICAgICAgICAgICAgIENsZWFyVGFibGUoKTsNCi0gICAgICAgICAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCA9IHN1ZmZpeDsNCi0gICAgICAgICAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnN1ZmZpeCA9IF9naWZfY3V0X2J1ZihzcmNfYnVmLCBzcmNfb2Zmc2V0LCBzcmNfYml0X2N1dCwgc3JjX2JpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjb2RlX3RhYmxlW2luZGV4X251bV0ucHJlZml4ID0gY29kZV90YWJsZVtpbmRleF9udW0gLSAxXS5zdWZmaXg7DQotICAgICAgICAgICAgICAgIGNvZGVfdGFibGVbaW5kZXhfbnVtXS5zdWZmaXggPSBfZ2lmX2N1dF9idWYoc3JjX2J1Ziwgc3JjX29mZnNldCwgc3JjX2JpdF9jdXQsIHNyY19iaXRfb2Zmc2V0LCBzcmNfYml0X251bSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHNyY19vZmZzZXQgPSAwOw0KLSAgICBzcmNfYml0X29mZnNldCA9IDA7DQotICAgIHNyY19iaXRfbnVtID0gMDsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0dpZkxaV0VuY29kZXI6Okxvb2tVcEluVGFibGUoIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgRlhfRFdPUkQmIG9mZnNldCwgdWludDhfdCYgYml0X29mZnNldCApDQotew0KLSAgICBmb3IgKEZYX1dPUkQgaSA9IHRhYmxlX2N1cjsgaSA8IGluZGV4X251bTsgaSsrKSB7DQotICAgICAgICBpZiAoY29kZV90YWJsZVtpXS5wcmVmaXggPT0gY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCAmJg0KLSAgICAgICAgICAgICAgICBjb2RlX3RhYmxlW2ldLnN1ZmZpeCA9PSBjb2RlX3RhYmxlW2luZGV4X251bV0uc3VmZml4KSB7DQotICAgICAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCA9IGk7DQotICAgICAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnN1ZmZpeCA9IF9naWZfY3V0X2J1ZihidWYsIG9mZnNldCwgc3JjX2JpdF9jdXQsIGJpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsNCi0gICAgICAgICAgICB0YWJsZV9jdXIgPSBpOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHRhYmxlX2N1ciA9IGNvZGVfZW5kICsgMTsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi12b2lkIENHaWZMWldFbmNvZGVyOjpGaW5pc2godWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuLCBGWF9EV09SRCYgb2Zmc2V0KQ0KLXsNCi0gICAgRW5jb2RlU3RyaW5nKGNvZGVfdGFibGVbaW5kZXhfbnVtXS5wcmVmaXgsIGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQotICAgIEVuY29kZVN0cmluZyhjb2RlX2VuZCwgZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCisgICAgX2dpZl9jdXRfaW5kZXgoaW5kZXhfYnVmW2luZGV4X2J1Zl9sZW5dLCBpbmRleCwgaW5kZXhfYml0X2N1ciwNCisgICAgICAgICAgICAgICAgICAgaW5kZXhfYml0X3VzZSwgYml0X29mZnNldCk7DQorICAgIGJpdF9vZmZzZXQgPSBpbmRleF9iaXRfY3VyIC0gaW5kZXhfYml0X3VzZTsNCisgIH0gZWxzZSB7DQorICAgIGluZGV4X2JpdF91c2UgKz0gKDggLSBiaXRfb2Zmc2V0KTsNCiAgICAgYml0X29mZnNldCA9IDA7DQotICAgIENsZWFyVGFibGUoKTsNCi19DQotZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgX2dpZl9jcmVhdGVfZGVjb21wcmVzcygpDQotew0KLSAgICBnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyID0gKGdpZl9kZWNvbXByZXNzX3N0cnVjdCopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKGdpZl9kZWNvbXByZXNzX3N0cnVjdCkpOw0KLSAgICBpZihnaWZfcHRyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KKyAgICBpbmRleF9idWZfbGVuKys7DQorICAgIGlmIChpbmRleF9idWZfbGVuID09IEdJRl9EQVRBX0JMT0NLKSB7DQorICAgICAgV3JpdGVCbG9jayhkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KICAgICB9DQotICAgIEZYU1lTX21lbXNldChnaWZfcHRyLCAwLCBzaXplb2YoZ2lmX2RlY29tcHJlc3Nfc3RydWN0KSk7DQotICAgIGdpZl9wdHItPmRlY29kZV9zdGF0dXMgPSBHSUZfRF9TVEFUVVNfU0lHOw0KLSAgICBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHIgPSBuZXcgQ0ZYX0FycmF5VGVtcGxhdGU8R2lmSW1hZ2UqPjsNCisgICAgX2dpZl9jdXRfaW5kZXgoaW5kZXhfYnVmW2luZGV4X2J1Zl9sZW5dLCBpbmRleCwgaW5kZXhfYml0X2N1ciwNCisgICAgICAgICAgICAgICAgICAgaW5kZXhfYml0X3VzZSwgYml0X29mZnNldCk7DQorICAgIGluZGV4X2JpdF91c2UgKz0gODsNCisgICAgYml0X29mZnNldCA9IDA7DQorICAgIGluZGV4X2J1Zl9sZW4rKzsNCisgICAgaWYgKGluZGV4X2J1Zl9sZW4gPT0gR0lGX0RBVEFfQkxPQ0spIHsNCisgICAgICBXcml0ZUJsb2NrKGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQorICAgIH0NCisgICAgX2dpZl9jdXRfaW5kZXgoaW5kZXhfYnVmW2luZGV4X2J1Zl9sZW5dLCBpbmRleCwgaW5kZXhfYml0X2N1ciwNCisgICAgICAgICAgICAgICAgICAgaW5kZXhfYml0X3VzZSwgYml0X29mZnNldCk7DQorICAgIGJpdF9vZmZzZXQgPSBpbmRleF9iaXRfY3VyIC0gaW5kZXhfYml0X3VzZTsNCisgIH0NCisgIGlmIChiaXRfb2Zmc2V0ID09IDgpIHsNCisgICAgYml0X29mZnNldCA9IDA7DQorICAgIGluZGV4X2J1Zl9sZW4rKzsNCisgICAgaWYgKGluZGV4X2J1Zl9sZW4gPT0gR0lGX0RBVEFfQkxPQ0spIHsNCisgICAgICBXcml0ZUJsb2NrKGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQorICAgIH0NCisgIH0NCisgIGlmIChpbmRleCA9PSBjb2RlX2VuZCkgew0KKyAgICBpbmRleF9idWZfbGVuKys7DQorICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCisgIH0NCisgIGlmIChpbmRleF9udW0rKyA+PiBpbmRleF9iaXRfY3VyKSB7DQorICAgIGluZGV4X2JpdF9jdXIrKzsNCisgIH0NCit9DQorRlhfQk9PTCBDR2lmTFpXRW5jb2Rlcjo6RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19sZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHN0X2xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIG9mZnNldCkgew0KKyAgdWludDhfdCBzdWZmaXg7DQorICBpZiAoc2V0am1wKGptcCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgd2hpbGUgKHNyY19iaXRfbnVtIDwgc3JjX2xlbikgew0KKyAgICBpZiAoIUxvb2tVcEluVGFibGUoc3JjX2J1Ziwgc3JjX29mZnNldCwgc3JjX2JpdF9vZmZzZXQpKSB7DQorICAgICAgRW5jb2RlU3RyaW5nKGNvZGVfdGFibGVbaW5kZXhfbnVtXS5wcmVmaXgsIGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQorICAgICAgaWYgKGluZGV4X251bSA9PSBHSUZfTUFYX0xaV19DT0RFKSB7DQorICAgICAgICBzdWZmaXggPSBjb2RlX3RhYmxlW2luZGV4X251bSAtIDFdLnN1ZmZpeDsNCisgICAgICAgIEVuY29kZVN0cmluZyhjb2RlX2NsZWFyLCBkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KKyAgICAgICAgQ2xlYXJUYWJsZSgpOw0KKyAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCA9IHN1ZmZpeDsNCisgICAgICAgIGNvZGVfdGFibGVbaW5kZXhfbnVtXS5zdWZmaXggPSBfZ2lmX2N1dF9idWYoDQorICAgICAgICAgICAgc3JjX2J1Ziwgc3JjX29mZnNldCwgc3JjX2JpdF9jdXQsIHNyY19iaXRfb2Zmc2V0LCBzcmNfYml0X251bSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNvZGVfdGFibGVbaW5kZXhfbnVtXS5wcmVmaXggPSBjb2RlX3RhYmxlW2luZGV4X251bSAtIDFdLnN1ZmZpeDsNCisgICAgICAgIGNvZGVfdGFibGVbaW5kZXhfbnVtXS5zdWZmaXggPSBfZ2lmX2N1dF9idWYoDQorICAgICAgICAgICAgc3JjX2J1Ziwgc3JjX29mZnNldCwgc3JjX2JpdF9jdXQsIHNyY19iaXRfb2Zmc2V0LCBzcmNfYml0X251bSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBzcmNfb2Zmc2V0ID0gMDsNCisgIHNyY19iaXRfb2Zmc2V0ID0gMDsNCisgIHNyY19iaXRfbnVtID0gMDsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENHaWZMWldFbmNvZGVyOjpMb29rVXBJblRhYmxlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBvZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBiaXRfb2Zmc2V0KSB7DQorICBmb3IgKEZYX1dPUkQgaSA9IHRhYmxlX2N1cjsgaSA8IGluZGV4X251bTsgaSsrKSB7DQorICAgIGlmIChjb2RlX3RhYmxlW2ldLnByZWZpeCA9PSBjb2RlX3RhYmxlW2luZGV4X251bV0ucHJlZml4ICYmDQorICAgICAgICBjb2RlX3RhYmxlW2ldLnN1ZmZpeCA9PSBjb2RlX3RhYmxlW2luZGV4X251bV0uc3VmZml4KSB7DQorICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCA9IGk7DQorICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnN1ZmZpeCA9DQorICAgICAgICAgIF9naWZfY3V0X2J1ZihidWYsIG9mZnNldCwgc3JjX2JpdF9jdXQsIGJpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsNCisgICAgICB0YWJsZV9jdXIgPSBpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICB0YWJsZV9jdXIgPSBjb2RlX2VuZCArIDE7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ0dpZkxaV0VuY29kZXI6OkZpbmlzaCh1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9sZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBvZmZzZXQpIHsNCisgIEVuY29kZVN0cmluZyhjb2RlX3RhYmxlW2luZGV4X251bV0ucHJlZml4LCBkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KKyAgRW5jb2RlU3RyaW5nKGNvZGVfZW5kLCBkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KKyAgYml0X29mZnNldCA9IDA7DQorICBDbGVhclRhYmxlKCk7DQorfQ0KK2dpZl9kZWNvbXByZXNzX3N0cnVjdF9wIF9naWZfY3JlYXRlX2RlY29tcHJlc3MoKSB7DQorICBnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyID0NCisgICAgICAoZ2lmX2RlY29tcHJlc3Nfc3RydWN0KilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoZ2lmX2RlY29tcHJlc3Nfc3RydWN0KSk7DQorICBpZiAoZ2lmX3B0ciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KGdpZl9wdHIsIDAsIHNpemVvZihnaWZfZGVjb21wcmVzc19zdHJ1Y3QpKTsNCisgIGdpZl9wdHItPmRlY29kZV9zdGF0dXMgPSBHSUZfRF9TVEFUVVNfU0lHOw0KKyAgZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyID0gbmV3IENGWF9BcnJheVRlbXBsYXRlPEdpZkltYWdlKj47DQogI2lmZGVmIEdJRl9TVVBQT1JUX0NPTU1FTlRfRVhURU5TSU9ODQotICAgIGdpZl9wdHItPmNtdF9kYXRhX3B0ciA9IG5ldyBDRlhfQnl0ZVN0cmluZzsNCisgIGdpZl9wdHItPmNtdF9kYXRhX3B0ciA9IG5ldyBDRlhfQnl0ZVN0cmluZzsNCiAjZW5kaWYNCiAjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCi0gICAgZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHIgPSBuZXcgQ0ZYX0FycmF5VGVtcGxhdGU8R2lmUGxhaW5UZXh0Kj47DQorICBnaWZfcHRyLT5wdF9wdHJfYXJyX3B0ciA9IG5ldyBDRlhfQXJyYXlUZW1wbGF0ZTxHaWZQbGFpblRleHQqPjsNCiAjZW5kaWYNCi0gICAgcmV0dXJuIGdpZl9wdHI7DQorICByZXR1cm4gZ2lmX3B0cjsNCiB9DQotdm9pZCBfZ2lmX2Rlc3Ryb3lfZGVjb21wcmVzcyhnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcHAgZ2lmX3B0cl9wdHIpDQotew0KLSAgICBpZihnaWZfcHRyX3B0ciA9PSBOVUxMIHx8ICpnaWZfcHRyX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQordm9pZCBfZ2lmX2Rlc3Ryb3lfZGVjb21wcmVzcyhnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcHAgZ2lmX3B0cl9wdHIpIHsNCisgIGlmIChnaWZfcHRyX3B0ciA9PSBOVUxMIHx8ICpnaWZfcHRyX3B0ciA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIgPSAqZ2lmX3B0cl9wdHI7DQorICAqZ2lmX3B0cl9wdHIgPSBOVUxMOw0KKyAgaWYgKGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5nbG9iYWxfcGFsX3B0cik7DQorICB9DQorICBpZiAoZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIGdpZl9wdHItPmltZ19kZWNvZGVyX3B0cjsNCisgIH0NCisgIGlmIChnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHIgIT0gTlVMTCkgew0KKyAgICBpbnQzMl90IHNpemVfaW1nX2FyciA9IGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+R2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplX2ltZ19hcnI7IGkrKykgew0KKyAgICAgIEdpZkltYWdlKiBwID0gZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5HZXRBdChpKTsNCisgICAgICBpZiAocC0+aW1hZ2VfaW5mb19wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShwLT5pbWFnZV9pbmZvX3B0cik7DQorICAgICAgfQ0KKyAgICAgIGlmIChwLT5pbWFnZV9nY2VfcHRyICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUocC0+aW1hZ2VfZ2NlX3B0cik7DQorICAgICAgfQ0KKyAgICAgIGlmIChwLT5pbWFnZV9yb3dfYnVmICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUocC0+aW1hZ2Vfcm93X2J1Zik7DQorICAgICAgfQ0KKyAgICAgIGlmIChwLT5sb2NhbF9wYWxfcHRyICE9IE5VTEwgJiYNCisgICAgICAgICAgcC0+bG9jYWxfcGFsX3B0ciAhPSBnaWZfcHRyLT5nbG9iYWxfcGFsX3B0cikgew0KKyAgICAgICAgRlhfRnJlZShwLT5sb2NhbF9wYWxfcHRyKTsNCisgICAgICB9DQorICAgICAgRlhfRnJlZShwKTsNCiAgICAgfQ0KLSAgICBnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyID0gKmdpZl9wdHJfcHRyOw0KLSAgICAqZ2lmX3B0cl9wdHIgPSBOVUxMOw0KLSAgICBpZihnaWZfcHRyLT5nbG9iYWxfcGFsX3B0ciAhPSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyKTsNCi0gICAgfQ0KLSAgICBpZihnaWZfcHRyLT5pbWdfZGVjb2Rlcl9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIGdpZl9wdHItPmltZ19kZWNvZGVyX3B0cjsNCi0gICAgfQ0KLSAgICBpZihnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgaW50MzJfdCBzaXplX2ltZ19hcnIgPSBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHItPkdldFNpemUoKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemVfaW1nX2FycjsgaSsrKSB7DQotICAgICAgICAgICAgR2lmSW1hZ2UqIHAgPSBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHItPkdldEF0KGkpOw0KLSAgICAgICAgICAgIGlmKHAtPmltYWdlX2luZm9fcHRyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgRlhfRnJlZShwLT5pbWFnZV9pbmZvX3B0cik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKHAtPmltYWdlX2djZV9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBGWF9GcmVlKHAtPmltYWdlX2djZV9wdHIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihwLT5pbWFnZV9yb3dfYnVmICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgRlhfRnJlZShwLT5pbWFnZV9yb3dfYnVmKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYocC0+bG9jYWxfcGFsX3B0ciAhPSBOVUxMICYmIHAtPmxvY2FsX3BhbF9wdHIgIT0gZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIpIHsNCi0gICAgICAgICAgICAgICAgRlhfRnJlZShwLT5sb2NhbF9wYWxfcHRyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhfRnJlZShwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+UmVtb3ZlQWxsKCk7DQotICAgICAgICBkZWxldGUgZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyOw0KLSAgICB9DQorICAgIGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHI7DQorICB9DQogI2lmZGVmIEdJRl9TVVBQT1JUX0FQUExJQ0FUSU9OX0VYVEVOU0lPTg0KLSAgICBpZihnaWZfcHRyLT5hcHBfZGF0YSAhPSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmFwcF9kYXRhKTsNCi0gICAgfQ0KKyAgaWYgKGdpZl9wdHItPmFwcF9kYXRhICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5hcHBfZGF0YSk7DQorICB9DQogI2VuZGlmDQogI2lmZGVmIEdJRl9TVVBQT1JUX0NPTU1FTlRfRVhURU5TSU9ODQotICAgIGlmKGdpZl9wdHItPmNtdF9kYXRhX3B0ciAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgZ2lmX3B0ci0+Y210X2RhdGFfcHRyOw0KLSAgICB9DQorICBpZiAoZ2lmX3B0ci0+Y210X2RhdGFfcHRyICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIGdpZl9wdHItPmNtdF9kYXRhX3B0cjsNCisgIH0NCiAjZW5kaWYNCiAjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KLSAgICBpZihnaWZfcHRyLT5nY2VfcHRyICE9IE5VTEwpIHsNCi0gICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2NlX3B0cik7DQotICAgIH0NCisgIGlmIChnaWZfcHRyLT5nY2VfcHRyICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5nY2VfcHRyKTsNCisgIH0NCiAjZW5kaWYNCiAjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCi0gICAgaWYoZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgaW50MzJfdCBzaXplX3B0X2FyciA9IGdpZl9wdHItPnB0X3B0cl9hcnJfcHRyLT5HZXRTaXplKCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplX3B0X2FycjsgaSsrKSB7DQotICAgICAgICAgICAgR2lmUGxhaW5UZXh0KiBwID0gZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHItPkdldEF0KGkpOw0KLSAgICAgICAgICAgIGlmKHAtPmdjZV9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBGWF9GcmVlKHAtPmdjZV9wdHIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihwLT5wdGVfcHRyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgRlhfRnJlZShwLT5wdGVfcHRyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYocC0+c3RyaW5nX3B0ciAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBwLT5zdHJpbmdfcHRyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGdpZl9wdHItPnB0X3B0cl9hcnJfcHRyLT5SZW1vdmVBbGwoKTsNCi0gICAgICAgIGRlbGV0ZSBnaWZfcHRyLT5wdF9wdHJfYXJyX3B0cjsNCisgIGlmIChnaWZfcHRyLT5wdF9wdHJfYXJyX3B0ciAhPSBOVUxMKSB7DQorICAgIGludDMyX3Qgc2l6ZV9wdF9hcnIgPSBnaWZfcHRyLT5wdF9wdHJfYXJyX3B0ci0+R2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplX3B0X2FycjsgaSsrKSB7DQorICAgICAgR2lmUGxhaW5UZXh0KiBwID0gZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHItPkdldEF0KGkpOw0KKyAgICAgIGlmIChwLT5nY2VfcHRyICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUocC0+Z2NlX3B0cik7DQorICAgICAgfQ0KKyAgICAgIGlmIChwLT5wdGVfcHRyICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUocC0+cHRlX3B0cik7DQorICAgICAgfQ0KKyAgICAgIGlmIChwLT5zdHJpbmdfcHRyICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBwLT5zdHJpbmdfcHRyOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgICBnaWZfcHRyLT5wdF9wdHJfYXJyX3B0ci0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBnaWZfcHRyLT5wdF9wdHJfYXJyX3B0cjsNCisgIH0NCiAjZW5kaWYNCisgIEZYX0ZyZWUoZ2lmX3B0cik7DQorfQ0KK2dpZl9jb21wcmVzc19zdHJ1Y3RfcCBfZ2lmX2NyZWF0ZV9jb21wcmVzcygpIHsNCisgIGdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyID0NCisgICAgICAoZ2lmX2NvbXByZXNzX3N0cnVjdCopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKGdpZl9jb21wcmVzc19zdHJ1Y3QpKTsNCisgIGlmIChnaWZfcHRyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBGWFNZU19tZW1zZXQoZ2lmX3B0ciwgMCwgc2l6ZW9mKGdpZl9jb21wcmVzc19zdHJ1Y3QpKTsNCisgIGdpZl9wdHItPmltZ19lbmNvZGVyX3B0ciA9IG5ldyBDR2lmTFpXRW5jb2RlcjsNCisgIGdpZl9wdHItPmhlYWRlcl9wdHIgPSAoR2lmSGVhZGVyKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoR2lmSGVhZGVyKSk7DQorICBpZiAoZ2lmX3B0ci0+aGVhZGVyX3B0ciA9PSBOVUxMKSB7DQorICAgIGRlbGV0ZSAoZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyKTsNCiAgICAgRlhfRnJlZShnaWZfcHRyKTsNCi19DQotZ2lmX2NvbXByZXNzX3N0cnVjdF9wIF9naWZfY3JlYXRlX2NvbXByZXNzKCkNCi17DQotICAgIGdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyID0gKGdpZl9jb21wcmVzc19zdHJ1Y3QqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihnaWZfY29tcHJlc3Nfc3RydWN0KSk7DQotICAgIGlmIChnaWZfcHRyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIEZYU1lTX21lbXNldChnaWZfcHRyLCAwLCBzaXplb2YoZ2lmX2NvbXByZXNzX3N0cnVjdCkpOw0KLSAgICBnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIgPSBuZXcgQ0dpZkxaV0VuY29kZXI7DQotICAgIGdpZl9wdHItPmhlYWRlcl9wdHIgPSAoR2lmSGVhZGVyKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoR2lmSGVhZGVyKSk7DQotICAgIGlmIChnaWZfcHRyLT5oZWFkZXJfcHRyID09IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZShnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIpOw0KLSAgICAgICAgRlhfRnJlZShnaWZfcHRyKTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIEZYU1lTX21lbWNweShnaWZfcHRyLT5oZWFkZXJfcHRyLT5zaWduYXR1cmUsIEdJRl9TSUdOQVRVUkUsIDMpOw0KLSAgICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+aGVhZGVyX3B0ci0+dmVyc2lvbiwgIjg5YSIsIDMpOw0KLSAgICBnaWZfcHRyLT5sc2RfcHRyID0gKEdpZkxTRCopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEdpZkxTRCkpOw0KLSAgICBpZiAoZ2lmX3B0ci0+bHNkX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmhlYWRlcl9wdHIpOw0KLSAgICAgICAgZGVsZXRlKGdpZl9wdHItPmltZ19lbmNvZGVyX3B0cik7DQotICAgICAgICBGWF9GcmVlKGdpZl9wdHIpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgRlhTWVNfbWVtc2V0KGdpZl9wdHItPmxzZF9wdHIsIDAsIHNpemVvZihHaWZMU0QpKTsNCi0gICAgZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIgPSAoR2lmSW1hZ2VJbmZvKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoR2lmSW1hZ2VJbmZvKSk7DQotICAgIGlmIChnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmxzZF9wdHIpOw0KLSAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5oZWFkZXJfcHRyKTsNCi0gICAgICAgIGRlbGV0ZShnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIpOw0KLSAgICAgICAgRlhfRnJlZShnaWZfcHRyKTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIEZYU1lTX21lbXNldChnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ciwgMCwgc2l6ZW9mKEdpZkltYWdlSW5mbykpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZYU1lTX21lbWNweShnaWZfcHRyLT5oZWFkZXJfcHRyLT5zaWduYXR1cmUsIEdJRl9TSUdOQVRVUkUsIDMpOw0KKyAgRlhTWVNfbWVtY3B5KGdpZl9wdHItPmhlYWRlcl9wdHItPnZlcnNpb24sICI4OWEiLCAzKTsNCisgIGdpZl9wdHItPmxzZF9wdHIgPSAoR2lmTFNEKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoR2lmTFNEKSk7DQorICBpZiAoZ2lmX3B0ci0+bHNkX3B0ciA9PSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aGVhZGVyX3B0cik7DQorICAgIGRlbGV0ZSAoZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyKTsNCisgICAgRlhfRnJlZShnaWZfcHRyKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBGWFNZU19tZW1zZXQoZ2lmX3B0ci0+bHNkX3B0ciwgMCwgc2l6ZW9mKEdpZkxTRCkpOw0KKyAgZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIgPQ0KKyAgICAgIChHaWZJbWFnZUluZm8qKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihHaWZJbWFnZUluZm8pKTsNCisgIGlmIChnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ciA9PSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+bHNkX3B0cik7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aGVhZGVyX3B0cik7DQorICAgIGRlbGV0ZSAoZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyKTsNCisgICAgRlhfRnJlZShnaWZfcHRyKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBGWFNZU19tZW1zZXQoZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIsIDAsIHNpemVvZihHaWZJbWFnZUluZm8pKTsNCiAjaWZkZWYgR0lGX1NVUFBPUlRfQVBQTElDQVRJT05fRVhURU5TSU9ODQotICAgIEZYU1lTX21lbWNweShnaWZfcHRyLT5hcHBfaWRlbnRpZnksICJuZXRzY2FwZSIsIDgpOw0KLSAgICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+YXBwX2F1dGhlbnRpY2F0aW9uLCAiMi4wIiwgMyk7DQorICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+YXBwX2lkZW50aWZ5LCAibmV0c2NhcGUiLCA4KTsNCisgIEZYU1lTX21lbWNweShnaWZfcHRyLT5hcHBfYXV0aGVudGljYXRpb24sICIyLjAiLCAzKTsNCiAjZW5kaWYNCiAjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KLSAgICBnaWZfcHRyLT5nY2VfcHRyID0gKEdpZkdDRSopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEdpZkdDRSkpOw0KLSAgICBpZiAoZ2lmX3B0ci0+Z2NlX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmltYWdlX2luZm9fcHRyKTsNCi0gICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+bHNkX3B0cik7DQotICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmhlYWRlcl9wdHIpOw0KLSAgICAgICAgZGVsZXRlKGdpZl9wdHItPmltZ19lbmNvZGVyX3B0cik7DQotICAgICAgICBGWF9GcmVlKGdpZl9wdHIpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCisgIGdpZl9wdHItPmdjZV9wdHIgPSAoR2lmR0NFKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoR2lmR0NFKSk7DQorICBpZiAoZ2lmX3B0ci0+Z2NlX3B0ciA9PSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIpOw0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmxzZF9wdHIpOw0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmhlYWRlcl9wdHIpOw0KKyAgICBkZWxldGUgKGdpZl9wdHItPmltZ19lbmNvZGVyX3B0cik7DQorICAgIEZYX0ZyZWUoZ2lmX3B0cik7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KICNlbmRpZg0KICNpZmRlZiBHSUZfU1VQUE9SVF9QTEFJTl9URVhUX0VYVEVOU0lPTg0KLSAgICBnaWZfcHRyLT5wdGVfcHRyID0gKEdpZlBURSopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEdpZlBURSkpOw0KLSAgICBpZiAoZ2lmX3B0ci0+cHRlX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmdjZV9wdHIpOw0KLSAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5pbWFnZV9pbmZvX3B0cik7DQotICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmxzZF9wdHIpOw0KLSAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5oZWFkZXJfcHRyKTsNCi0gICAgICAgIGRlbGV0ZShnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIpOw0KLSAgICAgICAgRlhfRnJlZShnaWZfcHRyKTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIEZYU1lTX21lbXNldChnaWZfcHRyLT5wdGVfcHRyLCAwLCBzaXplb2YoR2lmUFRFKSk7DQotICAgIGdpZl9wdHItPnB0ZV9wdHItPmJsb2NrX3NpemUgPSAxMjsNCisgIGdpZl9wdHItPnB0ZV9wdHIgPSAoR2lmUFRFKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoR2lmUFRFKSk7DQorICBpZiAoZ2lmX3B0ci0+cHRlX3B0ciA9PSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2NlX3B0cik7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIpOw0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmxzZF9wdHIpOw0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmhlYWRlcl9wdHIpOw0KKyAgICBkZWxldGUgKGdpZl9wdHItPmltZ19lbmNvZGVyX3B0cik7DQorICAgIEZYX0ZyZWUoZ2lmX3B0cik7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KGdpZl9wdHItPnB0ZV9wdHIsIDAsIHNpemVvZihHaWZQVEUpKTsNCisgIGdpZl9wdHItPnB0ZV9wdHItPmJsb2NrX3NpemUgPSAxMjsNCiAjZW5kaWYNCi0gICAgcmV0dXJuIGdpZl9wdHI7DQorICByZXR1cm4gZ2lmX3B0cjsNCiB9DQotdm9pZCBfZ2lmX2Rlc3Ryb3lfY29tcHJlc3MoZ2lmX2NvbXByZXNzX3N0cnVjdF9wcCBnaWZfcHRyX3B0cikNCi17DQotICAgIGlmKGdpZl9wdHJfcHRyID09IE5VTEwgfHwgKmdpZl9wdHJfcHRyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciA9ICpnaWZfcHRyX3B0cjsNCi0gICAgKmdpZl9wdHJfcHRyID0gTlVMTDsNCi0gICAgaWYoZ2lmX3B0ci0+aGVhZGVyX3B0ciAhPSBOVUxMKQl7DQotICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmhlYWRlcl9wdHIpOw0KLSAgICB9DQotICAgIGlmKGdpZl9wdHItPmxzZF9wdHIgIT0gTlVMTCkJew0KLSAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5sc2RfcHRyKTsNCi0gICAgfQ0KLSAgICBpZihnaWZfcHRyLT5nbG9iYWxfcGFsICE9IE5VTEwpCXsNCi0gICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2xvYmFsX3BhbCk7DQotICAgIH0NCi0gICAgaWYoZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIgIT0gTlVMTCkJew0KLSAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5pbWFnZV9pbmZvX3B0cik7DQotICAgIH0NCi0gICAgaWYoZ2lmX3B0ci0+bG9jYWxfcGFsICE9IE5VTEwpCXsNCi0gICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+bG9jYWxfcGFsKTsNCi0gICAgfQ0KLSAgICBpZihnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIGdpZl9wdHItPmltZ19lbmNvZGVyX3B0cjsNCi0gICAgfQ0KK3ZvaWQgX2dpZl9kZXN0cm95X2NvbXByZXNzKGdpZl9jb21wcmVzc19zdHJ1Y3RfcHAgZ2lmX3B0cl9wdHIpIHsNCisgIGlmIChnaWZfcHRyX3B0ciA9PSBOVUxMIHx8ICpnaWZfcHRyX3B0ciA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyID0gKmdpZl9wdHJfcHRyOw0KKyAgKmdpZl9wdHJfcHRyID0gTlVMTDsNCisgIGlmIChnaWZfcHRyLT5oZWFkZXJfcHRyICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5oZWFkZXJfcHRyKTsNCisgIH0NCisgIGlmIChnaWZfcHRyLT5sc2RfcHRyICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5sc2RfcHRyKTsNCisgIH0NCisgIGlmIChnaWZfcHRyLT5nbG9iYWxfcGFsICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5nbG9iYWxfcGFsKTsNCisgIH0NCisgIGlmIChnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ciAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIpOw0KKyAgfQ0KKyAgaWYgKGdpZl9wdHItPmxvY2FsX3BhbCAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+bG9jYWxfcGFsKTsNCisgIH0NCisgIGlmIChnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyOw0KKyAgfQ0KICNpZmRlZiBHSUZfU1VQUE9SVF9BUFBMSUNBVElPTl9FWFRFTlNJT04NCi0gICAgaWYoZ2lmX3B0ci0+YXBwX2RhdGEgIT0gTlVMTCkgew0KLSAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5hcHBfZGF0YSk7DQotICAgIH0NCisgIGlmIChnaWZfcHRyLT5hcHBfZGF0YSAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+YXBwX2RhdGEpOw0KKyAgfQ0KICNlbmRpZg0KICNpZmRlZiBHSUZfU1VQUE9SVF9HUkFQSElDX0NPTlRST0xfRVhURU5TSU9ODQotICAgIGlmKGdpZl9wdHItPmdjZV9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5nY2VfcHRyKTsNCi0gICAgfQ0KKyAgaWYgKGdpZl9wdHItPmdjZV9wdHIgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmdjZV9wdHIpOw0KKyAgfQ0KICNlbmRpZg0KICNpZmRlZiBHSUZfU1VQUE9SVF9DT01NRU5UX0VYVEVOU0lPTg0KLSAgICBpZihnaWZfcHRyLT5jbXRfZGF0YV9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5jbXRfZGF0YV9wdHIpOw0KLSAgICB9DQorICBpZiAoZ2lmX3B0ci0+Y210X2RhdGFfcHRyICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5jbXRfZGF0YV9wdHIpOw0KKyAgfQ0KICNlbmRpZg0KICNpZmRlZiBHSUZfU1VQUE9SVF9QTEFJTl9URVhUX0VYVEVOU0lPTg0KLSAgICBpZihnaWZfcHRyLT5wdGVfcHRyICE9IE5VTEwpIHsNCi0gICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+cHRlX3B0cik7DQotICAgIH0NCisgIGlmIChnaWZfcHRyLT5wdGVfcHRyICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5wdGVfcHRyKTsNCisgIH0NCiAjZW5kaWYNCi0gICAgRlhfRnJlZShnaWZfcHRyKTsNCisgIEZYX0ZyZWUoZ2lmX3B0cik7DQogfQ0KLXZvaWQgX2dpZl9lcnJvcihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKQ0KLXsNCi0gICAgaWYoZ2lmX3B0ciAhPSBOVUxMICYmIGdpZl9wdHItPl9naWZfZXJyb3JfZm4gIT0gTlVMTCkgew0KLSAgICAgICAgZ2lmX3B0ci0+X2dpZl9lcnJvcl9mbihnaWZfcHRyLCBlcnJfbXNnKTsNCi0gICAgfQ0KK3ZvaWQgX2dpZl9lcnJvcihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKSB7DQorICBpZiAoZ2lmX3B0ciAhPSBOVUxMICYmIGdpZl9wdHItPl9naWZfZXJyb3JfZm4gIT0gTlVMTCkgew0KKyAgICBnaWZfcHRyLT5fZ2lmX2Vycm9yX2ZuKGdpZl9wdHIsIGVycl9tc2cpOw0KKyAgfQ0KIH0NCiB2b2lkIF9naWZfd2FybihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKSB7fQ0KLWludDMyX3QgX2dpZl9yZWFkX2hlYWRlcihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKQ0KLXsNCi0gICAgaWYoZ2lmX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gMDsNCitpbnQzMl90IF9naWZfcmVhZF9oZWFkZXIoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cikgew0KKyAgaWYgKGdpZl9wdHIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7DQorICBBU1NFUlQoc2l6ZW9mKEdpZkhlYWRlcikgPT0gNik7DQorICBHaWZIZWFkZXIqIGdpZl9oZWFkZXJfcHRyID0gTlVMTDsNCisgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAodWludDhfdCoqKSZnaWZfaGVhZGVyX3B0ciwgNikgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMjsNCisgIH0NCisgIGlmIChGWFNZU19zdHJuY21wKGdpZl9oZWFkZXJfcHRyLT5zaWduYXR1cmUsIEdJRl9TSUdOQVRVUkUsIDMpICE9IDAgfHwNCisgICAgICBnaWZfaGVhZGVyX3B0ci0+dmVyc2lvblswXSAhPSAnOCcgfHwgZ2lmX2hlYWRlcl9wdHItPnZlcnNpb25bMl0gIT0gJ2EnKSB7DQorICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIk5vdCBBIEdpZiBJbWFnZSIpOw0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEFTU0VSVChzaXplb2YoR2lmTFNEKSA9PSA3KTsNCisgIEdpZkxTRCogZ2lmX2xzZF9wdHIgPSBOVUxMOw0KKyAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICh1aW50OF90KiopJmdpZl9sc2RfcHRyLCA3KSA9PSBOVUxMKSB7DQorICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgaWYgKCgoR2lmR0YqKSZnaWZfbHNkX3B0ci0+Z2xvYmFsX2ZsYWcpLT5nbG9iYWxfcGFsKSB7DQorICAgIGdpZl9wdHItPmdsb2JhbF9wYWxfbnVtID0gMg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgoR2lmR0YqKSZnaWZfbHNkX3B0ci0+Z2xvYmFsX2ZsYWcpLT5wYWxfYml0czsNCisgICAgQVNTRVJUKHNpemVvZihHaWZQYWxldHRlKSA9PSAzKTsNCisgICAgaW50MzJfdCBnbG9iYWxfcGFsX3NpemUgPSBnaWZfcHRyLT5nbG9iYWxfcGFsX251bSAqIDM7DQorICAgIHVpbnQ4X3QqIGdsb2JhbF9wYWxfcHRyID0gTlVMTDsNCisgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZnbG9iYWxfcGFsX3B0ciwgZ2xvYmFsX3BhbF9zaXplKSA9PSBOVUxMKSB7DQorICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICByZXR1cm4gMjsNCiAgICAgfQ0KLSAgICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KLSAgICBBU1NFUlQoc2l6ZW9mKEdpZkhlYWRlcikgPT0gNik7DQotICAgIEdpZkhlYWRlciogZ2lmX2hlYWRlcl9wdHIgPSBOVUxMOw0KLSAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAodWludDhfdCoqKSZnaWZfaGVhZGVyX3B0ciwgNikgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDI7DQorICAgIGdpZl9wdHItPmdsb2JhbF9zb3J0X2ZsYWcgPSAoKEdpZkdGKikmZ2lmX2xzZF9wdHItPmdsb2JhbF9mbGFnKS0+c29ydF9mbGFnOw0KKyAgICBnaWZfcHRyLT5nbG9iYWxfY29sb3JfcmVzb2x1dGlvbiA9DQorICAgICAgICAoKEdpZkdGKikmZ2lmX2xzZF9wdHItPmdsb2JhbF9mbGFnKS0+Y29sb3JfcmVzb2x1dGlvbjsNCisgICAgaWYgKGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyICE9IE5VTEwpIHsNCisgICAgICBGWF9GcmVlKGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyKTsNCiAgICAgfQ0KLSAgICBpZihGWFNZU19zdHJuY21wKGdpZl9oZWFkZXJfcHRyLT5zaWduYXR1cmUsIEdJRl9TSUdOQVRVUkUsIDMpICE9IDAgfHwNCi0gICAgICAgICAgICBnaWZfaGVhZGVyX3B0ci0+dmVyc2lvblswXSAhPSAnOCcgfHwNCi0gICAgICAgICAgICBnaWZfaGVhZGVyX3B0ci0+dmVyc2lvblsyXSAhPSAnYScpIHsNCi0gICAgICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIk5vdCBBIEdpZiBJbWFnZSIpOw0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgQVNTRVJUKHNpemVvZihHaWZMU0QpID09IDcpOw0KLSAgICBHaWZMU0QqIGdpZl9sc2RfcHRyID0gTlVMTDsNCi0gICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgKHVpbnQ4X3QqKikmZ2lmX2xzZF9wdHIsIDcpID09IE5VTEwpIHsNCi0gICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQotICAgICAgICByZXR1cm4gMjsNCi0gICAgfQ0KLSAgICBpZigoKEdpZkdGKikmZ2lmX2xzZF9wdHItPmdsb2JhbF9mbGFnKS0+Z2xvYmFsX3BhbCkgew0KLSAgICAgICAgZ2lmX3B0ci0+Z2xvYmFsX3BhbF9udW0gPSAyIDw8ICgoR2lmR0YqKSZnaWZfbHNkX3B0ci0+Z2xvYmFsX2ZsYWcpLT5wYWxfYml0czsNCi0gICAgICAgIEFTU0VSVChzaXplb2YoR2lmUGFsZXR0ZSkgPT0gMyk7DQotICAgICAgICBpbnQzMl90IGdsb2JhbF9wYWxfc2l6ZSA9IGdpZl9wdHItPmdsb2JhbF9wYWxfbnVtICogMzsNCi0gICAgICAgIHVpbnQ4X3QqIGdsb2JhbF9wYWxfcHRyID0gTlVMTDsNCi0gICAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZ2xvYmFsX3BhbF9wdHIsIGdsb2JhbF9wYWxfc2l6ZSkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQotICAgICAgICAgICAgcmV0dXJuIDI7DQotICAgICAgICB9DQotICAgICAgICBnaWZfcHRyLT5nbG9iYWxfc29ydF9mbGFnID0gKChHaWZHRiopJmdpZl9sc2RfcHRyLT5nbG9iYWxfZmxhZyktPnNvcnRfZmxhZzsNCi0gICAgICAgIGdpZl9wdHItPmdsb2JhbF9jb2xvcl9yZXNvbHV0aW9uID0gKChHaWZHRiopJmdpZl9sc2RfcHRyLT5nbG9iYWxfZmxhZyktPmNvbG9yX3Jlc29sdXRpb247DQotICAgICAgICBpZihnaWZfcHRyLT5nbG9iYWxfcGFsX3B0ciAhPSBOVUxMKSB7DQotICAgICAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5nbG9iYWxfcGFsX3B0cik7DQotICAgICAgICB9DQotICAgICAgICBnaWZfcHRyLT5nbG9iYWxfcGFsX3B0ciA9IE5VTEw7DQotICAgICAgICBnaWZfcHRyLT5nbG9iYWxfcGFsX3B0ciA9IChHaWZQYWxldHRlKilGWF9BbGxvYyh1aW50OF90LCBnbG9iYWxfcGFsX3NpemUpOw0KLSAgICAgICAgR0lGX1BUUl9OT1RfTlVMTChnaWZfcHRyLT5nbG9iYWxfcGFsX3B0ciwgZ2lmX3B0cik7DQotICAgICAgICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIsIGdsb2JhbF9wYWxfcHRyLCBnbG9iYWxfcGFsX3NpemUpOw0KLSAgICB9DQotICAgIGdpZl9wdHItPndpZHRoID0gKGludClfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9sc2RfcHRyLT53aWR0aCk7DQotICAgIGdpZl9wdHItPmhlaWdodCA9IChpbnQpX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfbHNkX3B0ci0+aGVpZ2h0KTsNCi0gICAgZ2lmX3B0ci0+YmNfaW5kZXggPSBnaWZfbHNkX3B0ci0+YmNfaW5kZXg7DQotICAgIGdpZl9wdHItPnBpeGVsX2FzcGVjdCA9IGdpZl9sc2RfcHRyLT5waXhlbF9hc3BlY3Q7DQotICAgIHJldHVybiAxOw0KKyAgICBnaWZfcHRyLT5nbG9iYWxfcGFsX3B0ciA9IE5VTEw7DQorICAgIGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyID0gKEdpZlBhbGV0dGUqKUZYX0FsbG9jKHVpbnQ4X3QsIGdsb2JhbF9wYWxfc2l6ZSk7DQorICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIsIGdpZl9wdHIpOw0KKyAgICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIsIGdsb2JhbF9wYWxfcHRyLCBnbG9iYWxfcGFsX3NpemUpOw0KKyAgfQ0KKyAgZ2lmX3B0ci0+d2lkdGggPSAoaW50KV9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX2xzZF9wdHItPndpZHRoKTsNCisgIGdpZl9wdHItPmhlaWdodCA9IChpbnQpX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfbHNkX3B0ci0+aGVpZ2h0KTsNCisgIGdpZl9wdHItPmJjX2luZGV4ID0gZ2lmX2xzZF9wdHItPmJjX2luZGV4Ow0KKyAgZ2lmX3B0ci0+cGl4ZWxfYXNwZWN0ID0gZ2lmX2xzZF9wdHItPnBpeGVsX2FzcGVjdDsNCisgIHJldHVybiAxOw0KIH0NCi1pbnQzMl90IF9naWZfZ2V0X2ZyYW1lKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIpDQotew0KLSAgICBpZihnaWZfcHRyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIGludDMyX3QgcmV0ID0gMTsNCi0gICAgd2hpbGUgKFRSVUUpIHsNCi0gICAgICAgIHN3aXRjaChnaWZfcHRyLT5kZWNvZGVfc3RhdHVzKSB7DQotICAgICAgICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfVEFJTDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfU0lHOiB7DQotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzaWdfcHRyID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZzaWdfcHRyLCAxKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goKnNpZ19wdHIpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdJRl9TSUdfRVhURU5TSU9OOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19FWFQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdJRl9TSUdfSU1BR0U6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0lNR19JTkZPKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHSUZfU0lHX1RSQUlMRVI6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2lmX3B0ci0+YXZhaWxfaW4pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfd2FybihnaWZfcHRyLCAiVGhlIEdpZiBGaWxlIGhhcyBub25fc3RhbmRhcmQgVGFnISIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfU0lHKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfd2FybihnaWZfcHRyLCAiVGhlIEdpZiBGaWxlIERvZXNuJ3QgaGF2ZSBUcmFpbGVyIFRhZyEiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIEdJRl9EX1NUQVRVU19FWFQ6IHsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGV4dF9wdHIgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmV4dF9wdHIsIDEpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCgqZXh0X3B0cikgew0KK2ludDMyX3QgX2dpZl9nZXRfZnJhbWUoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cikgew0KKyAgaWYgKGdpZl9wdHIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgcmV0ID0gMTsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIHN3aXRjaCAoZ2lmX3B0ci0+ZGVjb2RlX3N0YXR1cykgew0KKyAgICAgIGNhc2UgR0lGX0RfU1RBVFVTX1RBSUw6DQorICAgICAgICByZXR1cm4gMTsNCisgICAgICBjYXNlIEdJRl9EX1NUQVRVU19TSUc6IHsNCisgICAgICAgIHVpbnQ4X3QqIHNpZ19wdHIgPSBOVUxMOw0KKyAgICAgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZzaWdfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoICgqc2lnX3B0cikgew0KKyAgICAgICAgICBjYXNlIEdJRl9TSUdfRVhURU5TSU9OOg0KKyAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0VYVCk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIGNhc2UgR0lGX1NJR19JTUFHRToNCisgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19JTUdfSU5GTyk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIGNhc2UgR0lGX1NJR19UUkFJTEVSOg0KKyAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOw0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGlmIChnaWZfcHRyLT5hdmFpbF9pbikgew0KKyAgICAgICAgICAgICAgX2dpZl93YXJuKGdpZl9wdHIsICJUaGUgR2lmIEZpbGUgaGFzIG5vbl9zdGFuZGFyZCBUYWchIik7DQorICAgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19TSUcpOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIF9naWZfd2FybihnaWZfcHRyLCAiVGhlIEdpZiBGaWxlIERvZXNuJ3QgaGF2ZSBUcmFpbGVyIFRhZyEiKTsNCisgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUOiB7DQorICAgICAgICB1aW50OF90KiBleHRfcHRyID0gTlVMTDsNCisgICAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZXh0X3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAoKmV4dF9wdHIpIHsNCiAjaWZkZWYgR0lGX1NVUFBPUlRfQVBQTElDQVRJT05fRVhURU5TSU9ODQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHSUZfQkxPQ0tfQUU6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0VYVF9BRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICBjYXNlIEdJRl9CTE9DS19BRToNCisgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19FWFRfQUUpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KICNlbmRpZg0KICNpZmRlZiBHSUZfU1VQUE9SVF9DT01NRU5UX0VYVEVOU0lPTg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0lGX0JMT0NLX0NFOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19FWFRfQ0UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgY2FzZSBHSUZfQkxPQ0tfQ0U6DQorICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfRVhUX0NFKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCiAjZW5kaWYNCiAjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0lGX0JMT0NLX0dDRToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfRVhUX0dDRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICBjYXNlIEdJRl9CTE9DS19HQ0U6DQorICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfRVhUX0dDRSk7DQorICAgICAgICAgICAgY29udGludWU7DQogI2VuZGlmDQogI2lmZGVmIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHSUZfQkxPQ0tfUFRFOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19FWFRfUFRFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIGNhc2UgR0lGX0JMT0NLX1BURToNCisgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19FWFRfUFRFKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCiAjZW5kaWYNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXR1cyA9IEdJRl9EX1NUQVRVU19FWFRfVU5FOw0KKyAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBHSUZfRF9TVEFUVVNfRVhUX1VORTsNCiAjaWZuZGVmIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigqZXh0X3B0ciA9PSBHSUZfQkxPQ0tfUFRFKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gR0lGX0RfU1RBVFVTX0VYVF9QVEU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotI2VuZGlmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIHN0YXR1cyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfSU1HX0lORk86IHsNCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IF9naWZfZGVjb2RlX2ltYWdlX2luZm8oZ2lmX3B0cik7DQotICAgICAgICAgICAgICAgICAgICBpZihyZXQgIT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgR0lGX0RfU1RBVFVTX0lNR19EQVRBOiB7DQotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhX3NpemVfcHRyID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGFfcHRyID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7DQotICAgICAgICAgICAgICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoKmRhdGFfc2l6ZV9wdHIgIT0gR0lGX0JMT0NLX1RFUk1JTkFMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfU0lHKTsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gX2dpZl9kZWNvZGVfZXh0ZW5zaW9uKGdpZl9wdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYocmV0ICE9IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gMTsNCi19DQotdm9pZCBfZ2lmX3Rha2VvdmVyX2djZV9wdHIoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgR2lmR0NFKiogZ2NlX3B0cl9wdHIpDQotew0KLSAgICAqZ2NlX3B0cl9wdHIgPSBOVUxMOw0KLSNpZmRlZiBHSUZfU1VQUE9SVF9HUkFQSElDX0NPTlRST0xfRVhURU5TSU9ODQotICAgIGlmKGdpZl9wdHItPmdjZV9wdHIgIT0gTlVMTCAmJiBnY2VfcHRyX3B0ciAhPSBOVUxMKSB7DQotICAgICAgICAqZ2NlX3B0cl9wdHIgPSBnaWZfcHRyLT5nY2VfcHRyOw0KLSAgICAgICAgZ2lmX3B0ci0+Z2NlX3B0ciA9IE5VTEw7DQotICAgIH0NCi0jZW5kaWYNCi19DQotaW50MzJfdCBfZ2lmX2RlY29kZV9leHRlbnNpb24oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cikNCi17DQotICAgIHVpbnQ4X3QqIGRhdGFfc2l6ZV9wdHIgPSBOVUxMOw0KLSAgICB1aW50OF90KiBkYXRhX3B0ciA9IE5VTEw7DQotICAgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7DQotICAgIHN3aXRjaChnaWZfcHRyLT5kZWNvZGVfc3RhdHVzKSB7DQotI2lmZGVmIEdJRl9TVVBQT1JUX0FQUExJQ0FUSU9OX0VYVEVOU0lPTg0KLSAgICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUX0FFOiB7DQotICAgICAgICAgICAgICAgIEFTU0VSVChzaXplb2YoR2lmQUUpID09IDEyKTsNCi0gICAgICAgICAgICAgICAgR2lmQUUqIGdpZl9hZV9wdHIgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAodWludDhfdCoqKSZnaWZfYWVfcHRyLCAxMikgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZ2lmX2FlX2RhdGFfc3RyOw0KLSAgICAgICAgICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdoaWxlKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgew0KLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXRhX3NpemUgPSAqZGF0YV9zaXplX3B0cjsNCi0gICAgICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3B0ciwgKmRhdGFfc2l6ZV9wdHIpID09IE5VTEwgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZ2lmX2FlX2RhdGFfc3RyICs9IENGWF9CeXRlU3RyaW5nKChjb25zdCB1aW50OF90KilkYXRhX3B0ciwgZGF0YV9zaXplKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+YXBwX2lkZW50aWZ5LCBnaWZfYWVfcHRyLT5hcHBfaWRlbnRpZnksIDgpOw0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+YXBwX2F1dGhlbnRpY2F0aW9uLCBnaWZfYWVfcHRyLT5hcHBfYXV0aGVudGljYXRpb24sIDMpOw0KLSAgICAgICAgICAgICAgICBnaWZfcHRyLT5hcHBfZGF0YV9zaXplID0gZ2lmX2FlX2RhdGFfc3RyLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICBpZihnaWZfcHRyLT5hcHBfZGF0YSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmFwcF9kYXRhKTsNCi0gICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmFwcF9kYXRhID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBnaWZfcHRyLT5hcHBfZGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIGdpZl9wdHItPmFwcF9kYXRhX3NpemUpOw0KLSAgICAgICAgICAgICAgICBHSUZfUFRSX05PVF9OVUxMKGdpZl9wdHItPmFwcF9kYXRhLCBnaWZfcHRyKTsNCi0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGdpZl9wdHItPmFwcF9kYXRhLCBjb25zdCB1aW50OF90KihnaWZfYWVfZGF0YV9zdHIpLCBnaWZfcHRyLT5hcHBfZGF0YV9zaXplKTsNCisgICAgICAgICAgICBpZiAoKmV4dF9wdHIgPT0gR0lGX0JMT0NLX1BURSkgew0KKyAgICAgICAgICAgICAgc3RhdHVzID0gR0lGX0RfU1RBVFVTX0VYVF9QVEU7DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgc3RhdHVzKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBjYXNlIEdJRl9EX1NUQVRVU19JTUdfSU5GTzogew0KKyAgICAgICAgcmV0ID0gX2dpZl9kZWNvZGVfaW1hZ2VfaW5mbyhnaWZfcHRyKTsNCisgICAgICAgIGlmIChyZXQgIT0gMSkgew0KKyAgICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgR0lGX0RfU1RBVFVTX0lNR19EQVRBOiB7DQorICAgICAgICB1aW50OF90KiBkYXRhX3NpemVfcHRyID0gTlVMTDsNCisgICAgICAgIHVpbnQ4X3QqIGRhdGFfcHRyID0gTlVMTDsNCisgICAgICAgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7DQorICAgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICB9DQorICAgICAgICB3aGlsZSAoKmRhdGFfc2l6ZV9wdHIgIT0gR0lGX0JMT0NLX1RFUk1JTkFMKSB7DQorICAgICAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19JTUdfREFUQSk7DQorICAgICAgICAgIHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7DQorICAgICAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19TSUcpOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgIHJldCA9IF9naWZfZGVjb2RlX2V4dGVuc2lvbihnaWZfcHRyKTsNCisgICAgICAgIGlmIChyZXQgIT0gMSkgew0KKyAgICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gMTsNCit9DQordm9pZCBfZ2lmX3Rha2VvdmVyX2djZV9wdHIoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHaWZHQ0UqKiBnY2VfcHRyX3B0cikgew0KKyAgKmdjZV9wdHJfcHRyID0gTlVMTDsNCisjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KKyAgaWYgKGdpZl9wdHItPmdjZV9wdHIgIT0gTlVMTCAmJiBnY2VfcHRyX3B0ciAhPSBOVUxMKSB7DQorICAgICpnY2VfcHRyX3B0ciA9IGdpZl9wdHItPmdjZV9wdHI7DQorICAgIGdpZl9wdHItPmdjZV9wdHIgPSBOVUxMOw0KKyAgfQ0KKyNlbmRpZg0KK30NCitpbnQzMl90IF9naWZfZGVjb2RlX2V4dGVuc2lvbihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKSB7DQorICB1aW50OF90KiBkYXRhX3NpemVfcHRyID0gTlVMTDsNCisgIHVpbnQ4X3QqIGRhdGFfcHRyID0gTlVMTDsNCisgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7DQorICBzd2l0Y2ggKGdpZl9wdHItPmRlY29kZV9zdGF0dXMpIHsNCisjaWZkZWYgR0lGX1NVUFBPUlRfQVBQTElDQVRJT05fRVhURU5TSU9ODQorICAgIGNhc2UgR0lGX0RfU1RBVFVTX0VYVF9BRTogew0KKyAgICAgIEFTU0VSVChzaXplb2YoR2lmQUUpID09IDEyKTsNCisgICAgICBHaWZBRSogZ2lmX2FlX3B0ciA9IE5VTEw7DQorICAgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICh1aW50OF90KiopJmdpZl9hZV9wdHIsIDEyKSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgICB9DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgZ2lmX2FlX2RhdGFfc3RyOw0KKyAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAoKmRhdGFfc2l6ZV9wdHIgIT0gR0lGX0JMT0NLX1RFUk1JTkFMKSB7DQorICAgICAgICB1aW50OF90IGRhdGFfc2l6ZSA9ICpkYXRhX3NpemVfcHRyOw0KKyAgICAgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3B0ciwgKmRhdGFfc2l6ZV9wdHIpID09IE5VTEwgfHwNCisgICAgICAgICAgICBfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgIGdpZl9hZV9kYXRhX3N0ciArPSBDRlhfQnl0ZVN0cmluZygoY29uc3QgdWludDhfdCopZGF0YV9wdHIsIGRhdGFfc2l6ZSk7DQorICAgICAgfQ0KKyAgICAgIEZYU1lTX21lbWNweShnaWZfcHRyLT5hcHBfaWRlbnRpZnksIGdpZl9hZV9wdHItPmFwcF9pZGVudGlmeSwgOCk7DQorICAgICAgRlhTWVNfbWVtY3B5KGdpZl9wdHItPmFwcF9hdXRoZW50aWNhdGlvbiwgZ2lmX2FlX3B0ci0+YXBwX2F1dGhlbnRpY2F0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAzKTsNCisgICAgICBnaWZfcHRyLT5hcHBfZGF0YV9zaXplID0gZ2lmX2FlX2RhdGFfc3RyLkdldExlbmd0aCgpOw0KKyAgICAgIGlmIChnaWZfcHRyLT5hcHBfZGF0YSAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKGdpZl9wdHItPmFwcF9kYXRhKTsNCisgICAgICAgIGdpZl9wdHItPmFwcF9kYXRhID0gTlVMTDsNCisgICAgICB9DQorICAgICAgZ2lmX3B0ci0+YXBwX2RhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBnaWZfcHRyLT5hcHBfZGF0YV9zaXplKTsNCisgICAgICBHSUZfUFRSX05PVF9OVUxMKGdpZl9wdHItPmFwcF9kYXRhLCBnaWZfcHRyKTsNCisgICAgICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+YXBwX2RhdGEsIGNvbnN0IHVpbnQ4X3QqKGdpZl9hZV9kYXRhX3N0ciksDQorICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmFwcF9kYXRhX3NpemUpOw0KKyAgICB9IGJyZWFrOw0KICNlbmRpZg0KICNpZmRlZiBHSUZfU1VQUE9SVF9DT01NRU5UX0VYVEVOU0lPTg0KLSAgICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUX0NFOiB7DQotICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZ2lmX3B0ci0+Y210X2RhdGFfcHRyLT5FbXB0eSgpOw0KLSAgICAgICAgICAgICAgICB3aGlsZSgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF0YV9zaXplID0gKmRhdGFfc2l6ZV9wdHI7DQotICAgICAgICAgICAgICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSA9PSBOVUxMIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICooZ2lmX3B0ci0+Y210X2RhdGFfcHRyKSArPSBDRlhfQnl0ZVN0cmluZygoY29uc3QgRlhfQ0hBUiopZGF0YV9wdHIsIGRhdGFfc2l6ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgR0lGX0RfU1RBVFVTX0VYVF9DRTogew0KKyAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICAgIH0NCisgICAgICBnaWZfcHRyLT5jbXRfZGF0YV9wdHItPkVtcHR5KCk7DQorICAgICAgd2hpbGUgKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgew0KKyAgICAgICAgdWludDhfdCBkYXRhX3NpemUgPSAqZGF0YV9zaXplX3B0cjsNCisgICAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSA9PSBOVUxMIHx8DQorICAgICAgICAgICAgX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICB9DQorICAgICAgICAqKGdpZl9wdHItPmNtdF9kYXRhX3B0cikgKz0NCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZygoY29uc3QgRlhfQ0hBUiopZGF0YV9wdHIsIGRhdGFfc2l6ZSk7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KICNlbmRpZg0KICNpZmRlZiBHSUZfU1VQUE9SVF9QTEFJTl9URVhUX0VYVEVOU0lPTg0KLSAgICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUX1BURTogew0KLSAgICAgICAgICAgICAgICBBU1NFUlQoc2l6ZW9mKEdpZlBURSkgPT0gMTMpOw0KLSAgICAgICAgICAgICAgICBHaWZQVEUqIGdpZl9wdGVfcHRyID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgKHVpbnQ4X3QqKikmZ2lmX3B0ZV9wdHIsIDEzKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBHaWZQbGFpblRleHQqIGdpZl9wdF9wdHIgPSBGWF9BbGxvYyhHaWZQbGFpblRleHQsIDEpOw0KLSAgICAgICAgICAgICAgICBHSUZfUFRSX05PVF9OVUxMKGdpZl9wdF9wdHIsIGdpZl9wdHIpOw0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQoZ2lmX3B0X3B0ciwgMCwgc2l6ZW9mKEdpZlBsYWluVGV4dCkpOw0KLSAgICAgICAgICAgICAgICBfZ2lmX3Rha2VvdmVyX2djZV9wdHIoZ2lmX3B0ciwgJmdpZl9wdF9wdHItPmdjZV9wdHIpOw0KLSAgICAgICAgICAgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyID0gKEdpZlBURSopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEdpZlBURSkpOw0KLSAgICAgICAgICAgICAgICBHSUZfUFRSX05PVF9OVUxMKGdpZl9wdF9wdHItPnB0ZV9wdHIsIGdpZl9wdHIpOw0KLSAgICAgICAgICAgICAgICBnaWZfcHRfcHRyLT5zdHJpbmdfcHRyID0gbmV3IENGWF9CeXRlU3RyaW5nOw0KLSAgICAgICAgICAgICAgICBHSUZfUFRSX05PVF9OVUxMKGdpZl9wdF9wdHItPnN0cmluZ19wdHIsIGdpZl9wdHIpOw0KLSAgICAgICAgICAgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5ibG9ja19zaXplID0gZ2lmX3B0ZV9wdHItPmJsb2NrX3NpemU7DQotICAgICAgICAgICAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmdyaWRfbGVmdCA9IF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX3B0ZV9wdHItPmdyaWRfbGVmdCk7DQotICAgICAgICAgICAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmdyaWRfdG9wID0gX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfcHRlX3B0ci0+Z3JpZF90b3ApOw0KLSAgICAgICAgICAgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5ncmlkX3dpZHRoID0gX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfcHRlX3B0ci0+Z3JpZF93aWR0aCk7DQotICAgICAgICAgICAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmdyaWRfaGVpZ2h0ID0gX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfcHRlX3B0ci0+Z3JpZF9oZWlnaHQpOw0KLSAgICAgICAgICAgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5jaGFyX3dpZHRoID0gZ2lmX3B0ZV9wdHItPmNoYXJfd2lkdGg7DQotICAgICAgICAgICAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmNoYXJfaGVpZ2h0ID0gZ2lmX3B0ZV9wdHItPmNoYXJfaGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5mY19pbmRleCA9IGdpZl9wdGVfcHRyLT5mY19pbmRleDsNCi0gICAgICAgICAgICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+YmNfaW5kZXggPSBnaWZfcHRlX3B0ci0+YmNfaW5kZXg7DQotICAgICAgICAgICAgICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoZ2lmX3B0X3B0ciAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZ2lmX3B0X3B0ci0+Z2NlX3B0ciAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0X3B0ci0+Z2NlX3B0cik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGdpZl9wdF9wdHItPnB0ZV9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPnB0ZV9wdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihnaWZfcHRfcHRyLT5zdHJpbmdfcHRyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGdpZl9wdF9wdHItPnN0cmluZ19wdHI7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0X3B0cik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB3aGlsZSgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF0YV9zaXplID0gKmRhdGFfc2l6ZV9wdHI7DQotICAgICAgICAgICAgICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSA9PSBOVUxMIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihnaWZfcHRfcHRyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZ2lmX3B0X3B0ci0+Z2NlX3B0ciAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPmdjZV9wdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGdpZl9wdF9wdHItPnB0ZV9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShnaWZfcHRfcHRyLT5wdGVfcHRyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihnaWZfcHRfcHRyLT5zdHJpbmdfcHRyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBnaWZfcHRfcHRyLT5zdHJpbmdfcHRyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0X3B0cik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgKihnaWZfcHRfcHRyLT5zdHJpbmdfcHRyKSArPSBDRlhfQnl0ZVN0cmluZygoY29uc3QgRlhfQ0hBUiopZGF0YV9wdHIsIGRhdGFfc2l6ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHItPkFkZChnaWZfcHRfcHRyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotI2VuZGlmDQotI2lmZGVmIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCi0gICAgICAgIGNhc2UgR0lGX0RfU1RBVFVTX0VYVF9HQ0U6IHsNCi0gICAgICAgICAgICAgICAgQVNTRVJUKHNpemVvZihHaWZHQ0UpID09IDUpOw0KLSAgICAgICAgICAgICAgICBHaWZHQ0UqIGdpZl9nY2VfcHRyID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgKHVpbnQ4X3QqKikmZ2lmX2djZV9wdHIsIDYpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKGdpZl9wdHItPmdjZV9wdHIgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+Z2NlX3B0ciA9IChHaWZHQ0UqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihHaWZHQ0UpKTsNCi0gICAgICAgICAgICAgICAgICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0ci0+Z2NlX3B0ciwgZ2lmX3B0cik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZ2lmX3B0ci0+Z2NlX3B0ci0+YmxvY2tfc2l6ZSA9IGdpZl9nY2VfcHRyLT5ibG9ja19zaXplOw0KLSAgICAgICAgICAgICAgICBnaWZfcHRyLT5nY2VfcHRyLT5nY2VfZmxhZyA9IGdpZl9nY2VfcHRyLT5nY2VfZmxhZzsNCi0gICAgICAgICAgICAgICAgZ2lmX3B0ci0+Z2NlX3B0ci0+ZGVsYXlfdGltZSA9IF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX2djZV9wdHItPmRlbGF5X3RpbWUpOw0KLSAgICAgICAgICAgICAgICBnaWZfcHRyLT5nY2VfcHRyLT50cmFuc19pbmRleCA9IGdpZl9nY2VfcHRyLT50cmFuc19pbmRleDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotI2VuZGlmDQotICAgICAgICBkZWZhdWx0OiB7DQotI2lmbmRlZiBHSUZfU1VQUE9SVF9QTEFJTl9URVhUX0VYVEVOU0lPTg0KLSAgICAgICAgICAgICAgICBpZihnaWZfcHRyLT5kZWNvZGVfc3RhdHVzID09IEdJRl9EX1NUQVRVU19FWFRfUFRFKSB7DQotI2lmZGVmIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCi0gICAgICAgICAgICAgICAgICAgIGlmKGdpZl9wdHItPmdjZV9wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2NlX3B0cik7DQotICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+Z2NlX3B0ciA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICB9DQotI2VuZGlmDQotICAgICAgICAgICAgICAgIH0NCi0jZW5kaWYNCi0gICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdoaWxlKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikgPT0gTlVMTCB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1NJRyk7DQotICAgIHJldHVybiAxOw0KLX0NCi1pbnQzMl90IF9naWZfZGVjb2RlX2ltYWdlX2luZm8oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cikNCi17DQotICAgIGlmKGdpZl9wdHItPndpZHRoID09IDAgfHwgZ2lmX3B0ci0+aGVpZ2h0ID09IDApIHsNCi0gICAgICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIk5vIEltYWdlIEhlYWRlciBJbmZvIik7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KLSAgICBBU1NFUlQoc2l6ZW9mKEdpZkltYWdlSW5mbykgPT0gOSk7DQotICAgIEdpZkltYWdlSW5mbyogZ2lmX2ltZ19pbmZvX3B0ciA9IE5VTEw7DQotICAgIGlmKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICh1aW50OF90KiopJmdpZl9pbWdfaW5mb19wdHIsIDkpID09IE5VTEwpIHsNCisgICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUX1BURTogew0KKyAgICAgIEFTU0VSVChzaXplb2YoR2lmUFRFKSA9PSAxMyk7DQorICAgICAgR2lmUFRFKiBnaWZfcHRlX3B0ciA9IE5VTEw7DQorICAgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICh1aW50OF90KiopJmdpZl9wdGVfcHRyLCAxMykgPT0gTlVMTCkgew0KICAgICAgICAgcmV0dXJuIDI7DQotICAgIH0NCi0gICAgR2lmSW1hZ2UqIGdpZl9pbWFnZV9wdHIgPSAoR2lmSW1hZ2UqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihHaWZJbWFnZSkpOw0KLSAgICBHSUZfUFRSX05PVF9OVUxMKGdpZl9pbWFnZV9wdHIsIGdpZl9wdHIpOw0KLSAgICBGWFNZU19tZW1zZXQoZ2lmX2ltYWdlX3B0ciwgMCwgc2l6ZW9mKEdpZkltYWdlKSk7DQotICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyID0gKEdpZkltYWdlSW5mbyopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEdpZkltYWdlSW5mbykpOw0KLSAgICBHSUZfUFRSX05PVF9OVUxMKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLCBnaWZfcHRyKTsNCi0gICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxlZnQgPSBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9pbWdfaW5mb19wdHItPmxlZnQpOw0KLSAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+dG9wID0gX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfaW1nX2luZm9fcHRyLT50b3ApOw0KLSAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+d2lkdGggPSBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9pbWdfaW5mb19wdHItPndpZHRoKTsNCi0gICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCA9IF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX2ltZ19pbmZvX3B0ci0+aGVpZ2h0KTsNCi0gICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcgPSBnaWZfaW1nX2luZm9fcHRyLT5sb2NhbF9mbGFnOw0KLSAgICBpZihnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCArIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT53aWR0aCA+IGdpZl9wdHItPndpZHRoIHx8DQotICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPnRvcCArIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5oZWlnaHQgPiBnaWZfcHRyLT5oZWlnaHQpIHsNCi0gICAgICAgIGlmKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQotICAgICAgICB9DQotICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHIpOw0KLSAgICAgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiSW1hZ2UgRGF0YSBPdXQgT2YgTFNELCBUaGUgRmlsZSBNYXkgQmUgQ29ycnVwdCIpOw0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgR2lmTEYqIGdpZl9pbWdfaW5mb19sZl9wdHIgPSAoR2lmTEYqKSZnaWZfaW1nX2luZm9fcHRyLT5sb2NhbF9mbGFnOw0KLSAgICBpZihnaWZfaW1nX2luZm9fbGZfcHRyLT5sb2NhbF9wYWwpIHsNCi0gICAgICAgIEFTU0VSVChzaXplb2YoR2lmUGFsZXR0ZSkgPT0gMyk7DQotICAgICAgICBpbnQzMl90IGxvY19wYWxfc2l6ZSA9ICgyIDw8IGdpZl9pbWdfaW5mb19sZl9wdHItPnBhbF9iaXRzKSAqIDM7DQotICAgICAgICB1aW50OF90KiBsb2NfcGFsX3B0ciA9IE5VTEw7DQotICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmbG9jX3BhbF9wdHIsIGxvY19wYWxfc2l6ZSkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQotICAgICAgICAgICAgaWYoZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHIgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0cik7DQotICAgICAgICAgICAgcmV0dXJuIDI7DQotICAgICAgICB9DQotICAgICAgICBnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyID0gKEdpZlBhbGV0dGUqKWdpZl9wdHItPl9naWZfYXNrX2J1Zl9mb3JfcGFsX2ZuKGdpZl9wdHIsIGxvY19wYWxfc2l6ZSk7DQotICAgICAgICBpZihnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBGWFNZU19tZW1jcHkoKHVpbnQ4X3QqKWdpZl9pbWFnZV9wdHItPmxvY2FsX3BhbF9wdHIsIGxvY19wYWxfcHRyLCBsb2NfcGFsX3NpemUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHVpbnQ4X3QqIGNvZGVfc2l6ZV9wdHIgPSBOVUxMOw0KLSAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmY29kZV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgIH0NCisgICAgICBHaWZQbGFpblRleHQqIGdpZl9wdF9wdHIgPSBGWF9BbGxvYyhHaWZQbGFpblRleHQsIDEpOw0KKyAgICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0X3B0ciwgZ2lmX3B0cik7DQorICAgICAgRlhTWVNfbWVtc2V0KGdpZl9wdF9wdHIsIDAsIHNpemVvZihHaWZQbGFpblRleHQpKTsNCisgICAgICBfZ2lmX3Rha2VvdmVyX2djZV9wdHIoZ2lmX3B0ciwgJmdpZl9wdF9wdHItPmdjZV9wdHIpOw0KKyAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHIgPSAoR2lmUFRFKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoR2lmUFRFKSk7DQorICAgICAgR0lGX1BUUl9OT1RfTlVMTChnaWZfcHRfcHRyLT5wdGVfcHRyLCBnaWZfcHRyKTsNCisgICAgICBnaWZfcHRfcHRyLT5zdHJpbmdfcHRyID0gbmV3IENGWF9CeXRlU3RyaW5nOw0KKyAgICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0X3B0ci0+c3RyaW5nX3B0ciwgZ2lmX3B0cik7DQorICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+YmxvY2tfc2l6ZSA9IGdpZl9wdGVfcHRyLT5ibG9ja19zaXplOw0KKyAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmdyaWRfbGVmdCA9DQorICAgICAgICAgIF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX3B0ZV9wdHItPmdyaWRfbGVmdCk7DQorICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+Z3JpZF90b3AgPQ0KKyAgICAgICAgICBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9wdGVfcHRyLT5ncmlkX3RvcCk7DQorICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+Z3JpZF93aWR0aCA9DQorICAgICAgICAgIF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX3B0ZV9wdHItPmdyaWRfd2lkdGgpOw0KKyAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmdyaWRfaGVpZ2h0ID0NCisgICAgICAgICAgX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfcHRlX3B0ci0+Z3JpZF9oZWlnaHQpOw0KKyAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmNoYXJfd2lkdGggPSBnaWZfcHRlX3B0ci0+Y2hhcl93aWR0aDsNCisgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5jaGFyX2hlaWdodCA9IGdpZl9wdGVfcHRyLT5jaGFyX2hlaWdodDsNCisgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5mY19pbmRleCA9IGdpZl9wdGVfcHRyLT5mY19pbmRleDsNCisgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5iY19pbmRleCA9IGdpZl9wdGVfcHRyLT5iY19pbmRleDsNCisgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCiAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQotICAgICAgICBpZihnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ciAhPSBOVUxMKSB7DQotICAgICAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0cik7DQorICAgICAgICBpZiAoZ2lmX3B0X3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgIGlmIChnaWZfcHRfcHRyLT5nY2VfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPmdjZV9wdHIpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChnaWZfcHRfcHRyLT5wdGVfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPnB0ZV9wdHIpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChnaWZfcHRfcHRyLT5zdHJpbmdfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBkZWxldGUgZ2lmX3B0X3B0ci0+c3RyaW5nX3B0cjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHIpOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYoZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0ciAhPSBOVUxMKSB7DQotICAgICAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQotICAgICAgICB9DQotICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHIpOw0KICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgfQ0KKyAgICAgIHdoaWxlICgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsNCisgICAgICAgIHVpbnQ4X3QgZGF0YV9zaXplID0gKmRhdGFfc2l6ZV9wdHI7DQorICAgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikgPT0gTlVMTCB8fA0KKyAgICAgICAgICAgIF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgIGlmIChnaWZfcHRfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBpZiAoZ2lmX3B0X3B0ci0+Z2NlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPmdjZV9wdHIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZ2lmX3B0X3B0ci0+cHRlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPnB0ZV9wdHIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZ2lmX3B0X3B0ci0+c3RyaW5nX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICBkZWxldGUgZ2lmX3B0X3B0ci0+c3RyaW5nX3B0cjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfRnJlZShnaWZfcHRfcHRyKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgICooZ2lmX3B0X3B0ci0+c3RyaW5nX3B0cikgKz0NCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZygoY29uc3QgRlhfQ0hBUiopZGF0YV9wdHIsIGRhdGFfc2l6ZSk7DQorICAgICAgfQ0KKyAgICAgIGdpZl9wdHItPnB0X3B0cl9hcnJfcHRyLT5BZGQoZ2lmX3B0X3B0cik7DQorICAgIH0gYnJlYWs7DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCisgICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUX0dDRTogew0KKyAgICAgIEFTU0VSVChzaXplb2YoR2lmR0NFKSA9PSA1KTsNCisgICAgICBHaWZHQ0UqIGdpZl9nY2VfcHRyID0gTlVMTDsNCisgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgKHVpbnQ4X3QqKikmZ2lmX2djZV9wdHIsIDYpID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICAgIH0NCisgICAgICBpZiAoZ2lmX3B0ci0+Z2NlX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICBnaWZfcHRyLT5nY2VfcHRyID0gKEdpZkdDRSopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEdpZkdDRSkpOw0KKyAgICAgICAgR0lGX1BUUl9OT1RfTlVMTChnaWZfcHRyLT5nY2VfcHRyLCBnaWZfcHRyKTsNCisgICAgICB9DQorICAgICAgZ2lmX3B0ci0+Z2NlX3B0ci0+YmxvY2tfc2l6ZSA9IGdpZl9nY2VfcHRyLT5ibG9ja19zaXplOw0KKyAgICAgIGdpZl9wdHItPmdjZV9wdHItPmdjZV9mbGFnID0gZ2lmX2djZV9wdHItPmdjZV9mbGFnOw0KKyAgICAgIGdpZl9wdHItPmdjZV9wdHItPmRlbGF5X3RpbWUgPQ0KKyAgICAgICAgICBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9nY2VfcHRyLT5kZWxheV90aW1lKTsNCisgICAgICBnaWZfcHRyLT5nY2VfcHRyLT50cmFuc19pbmRleCA9IGdpZl9nY2VfcHRyLT50cmFuc19pbmRleDsNCisgICAgfSBicmVhazsNCisjZW5kaWYNCisgICAgZGVmYXVsdDogew0KKyNpZm5kZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgICAgICBpZiAoZ2lmX3B0ci0+ZGVjb2RlX3N0YXR1cyA9PSBHSUZfRF9TVEFUVVNfRVhUX1BURSkgew0KKyNpZmRlZiBHSUZfU1VQUE9SVF9HUkFQSElDX0NPTlRST0xfRVhURU5TSU9ODQorICAgICAgICBpZiAoZ2lmX3B0ci0+Z2NlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2NlX3B0cik7DQorICAgICAgICAgIGdpZl9wdHItPmdjZV9wdHIgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgIH0NCisjZW5kaWYNCisgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAoKmRhdGFfc2l6ZV9wdHIgIT0gR0lGX0JMT0NLX1RFUk1JTkFMKSB7DQorICAgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikgPT0gTlVMTCB8fA0KKyAgICAgICAgICAgIF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9jb2RlX3NpemUgPSAqY29kZV9zaXplX3B0cjsNCi0gICAgZ2lmX3B0ci0+X2dpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbl9mbihnaWZfcHRyLCAmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZGF0YV9wb3MpOw0KLSAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9kYXRhX3BvcyArPSBnaWZfcHRyLT5za2lwX3NpemU7DQotICAgIF9naWZfdGFrZW92ZXJfZ2NlX3B0cihnaWZfcHRyLCAmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0cik7DQotICAgIGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+QWRkKGdpZl9pbWFnZV9wdHIpOw0KKyAgfQ0KKyAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfU0lHKTsNCisgIHJldHVybiAxOw0KK30NCitpbnQzMl90IF9naWZfZGVjb2RlX2ltYWdlX2luZm8oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cikgew0KKyAgaWYgKGdpZl9wdHItPndpZHRoID09IDAgfHwgZ2lmX3B0ci0+aGVpZ2h0ID09IDApIHsNCisgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiTm8gSW1hZ2UgSGVhZGVyIEluZm8iKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgQVNTRVJUKHNpemVvZihHaWZJbWFnZUluZm8pID09IDkpOw0KKyAgR2lmSW1hZ2VJbmZvKiBnaWZfaW1nX2luZm9fcHRyID0gTlVMTDsNCisgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAodWludDhfdCoqKSZnaWZfaW1nX2luZm9fcHRyLCA5KSA9PSBOVUxMKSB7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgR2lmSW1hZ2UqIGdpZl9pbWFnZV9wdHIgPSAoR2lmSW1hZ2UqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihHaWZJbWFnZSkpOw0KKyAgR0lGX1BUUl9OT1RfTlVMTChnaWZfaW1hZ2VfcHRyLCBnaWZfcHRyKTsNCisgIEZYU1lTX21lbXNldChnaWZfaW1hZ2VfcHRyLCAwLCBzaXplb2YoR2lmSW1hZ2UpKTsNCisgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyID0NCisgICAgICAoR2lmSW1hZ2VJbmZvKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoR2lmSW1hZ2VJbmZvKSk7DQorICBHSUZfUFRSX05PVF9OVUxMKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLCBnaWZfcHRyKTsNCisgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sZWZ0ID0NCisgICAgICBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9pbWdfaW5mb19wdHItPmxlZnQpOw0KKyAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPnRvcCA9DQorICAgICAgX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfaW1nX2luZm9fcHRyLT50b3ApOw0KKyAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoID0NCisgICAgICBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9pbWdfaW5mb19wdHItPndpZHRoKTsNCisgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5oZWlnaHQgPQ0KKyAgICAgIF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX2ltZ19pbmZvX3B0ci0+aGVpZ2h0KTsNCisgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sb2NhbF9mbGFnID0gZ2lmX2ltZ19pbmZvX3B0ci0+bG9jYWxfZmxhZzsNCisgIGlmIChnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCArDQorICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+d2lkdGggPg0KKyAgICAgICAgICBnaWZfcHRyLT53aWR0aCB8fA0KKyAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT50b3AgKw0KKyAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCA+DQorICAgICAgICAgIGdpZl9wdHItPmhlaWdodCkgew0KKyAgICBpZiAoZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHIgIT0gTlVMTCkgew0KKyAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHIpOw0KKyAgICB9DQorICAgIGlmIChnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmICE9IE5VTEwpIHsNCisgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICB9DQorICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0cik7DQorICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIkltYWdlIERhdGEgT3V0IE9mIExTRCwgVGhlIEZpbGUgTWF5IEJlIENvcnJ1cHQiKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBHaWZMRiogZ2lmX2ltZ19pbmZvX2xmX3B0ciA9IChHaWZMRiopJmdpZl9pbWdfaW5mb19wdHItPmxvY2FsX2ZsYWc7DQorICBpZiAoZ2lmX2ltZ19pbmZvX2xmX3B0ci0+bG9jYWxfcGFsKSB7DQorICAgIEFTU0VSVChzaXplb2YoR2lmUGFsZXR0ZSkgPT0gMyk7DQorICAgIGludDMyX3QgbG9jX3BhbF9zaXplID0gKDIgPDwgZ2lmX2ltZ19pbmZvX2xmX3B0ci0+cGFsX2JpdHMpICogMzsNCisgICAgdWludDhfdCogbG9jX3BhbF9wdHIgPSBOVUxMOw0KKyAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmxvY19wYWxfcHRyLCBsb2NfcGFsX3NpemUpID09IE5VTEwpIHsNCisgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgIGlmIChnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyKTsNCisgICAgICB9DQorICAgICAgaWYgKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgICB9DQorICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyKTsNCisgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyID0NCisgICAgICAgIChHaWZQYWxldHRlKilnaWZfcHRyLT5fZ2lmX2Fza19idWZfZm9yX3BhbF9mbihnaWZfcHRyLCBsb2NfcGFsX3NpemUpOw0KKyAgICBpZiAoZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0ciAhPSBOVUxMKSB7DQorICAgICAgRlhTWVNfbWVtY3B5KCh1aW50OF90KilnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyLCBsb2NfcGFsX3B0ciwNCisgICAgICAgICAgICAgICAgICAgbG9jX3BhbF9zaXplKTsNCisgICAgfQ0KKyAgfQ0KKyAgdWludDhfdCogY29kZV9zaXplX3B0ciA9IE5VTEw7DQorICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmNvZGVfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgaWYgKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyICE9IE5VTEwpIHsNCisgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyKTsNCisgICAgfQ0KKyAgICBpZiAoZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0ciAhPSBOVUxMKSB7DQorICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyKTsNCisgICAgfQ0KKyAgICBpZiAoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiAhPSBOVUxMKSB7DQorICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgfQ0KKyAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHIpOw0KKyAgICByZXR1cm4gMjsNCisgIH0NCisgIGdpZl9pbWFnZV9wdHItPmltYWdlX2NvZGVfc2l6ZSA9ICpjb2RlX3NpemVfcHRyOw0KKyAgZ2lmX3B0ci0+X2dpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbl9mbihnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZGF0YV9wb3MpOw0KKyAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZGF0YV9wb3MgKz0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgX2dpZl90YWtlb3Zlcl9nY2VfcHRyKGdpZl9wdHIsICZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyKTsNCisgIGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+QWRkKGdpZl9pbWFnZV9wdHIpOw0KKyAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOw0KKyAgcmV0dXJuIDE7DQorfQ0KK2ludDMyX3QgX2dpZl9sb2FkX2ZyYW1lKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGludDMyX3QgZnJhbWVfbnVtKSB7DQorICBpZiAoZ2lmX3B0ciA9PSBOVUxMIHx8IGZyYW1lX251bSA8IDAgfHwNCisgICAgICBmcmFtZV9udW0gPj0gZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB1aW50OF90KiBkYXRhX3NpemVfcHRyID0gTlVMTDsNCisgIHVpbnQ4X3QqIGRhdGFfcHRyID0gTlVMTDsNCisgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7DQorICBHaWZJbWFnZSogZ2lmX2ltYWdlX3B0ciA9IGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+R2V0QXQoZnJhbWVfbnVtKTsNCisgIEZYX0RXT1JEIGdpZl9pbWdfcm93X2J5dGVzID0gZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoOw0KKyAgaWYgKGdpZl9wdHItPmRlY29kZV9zdGF0dXMgPT0gR0lGX0RfU1RBVFVTX1RBSUwpIHsNCisgICAgaWYgKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpIHsNCisgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgPSBOVUxMOw0KKyAgICB9DQorICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgPSBGWF9BbGxvYyh1aW50OF90LCBnaWZfaW1nX3Jvd19ieXRlcyk7DQorICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiwgZ2lmX3B0cik7DQorICAgIEdpZkdDRSogZ2lmX2ltZ19nY2VfcHRyID0gZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0cjsNCisgICAgaW50MzJfdCBsb2NfcGFsX251bSA9DQorICAgICAgICAoKEdpZkxGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcpLT5sb2NhbF9wYWwNCisgICAgICAgICAgICA/ICgyIDw8ICgoR2lmTEYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZykNCisgICAgICAgICAgICAgICAgICAgICAgICAtPnBhbF9iaXRzKQ0KKyAgICAgICAgICAgIDogMDsNCisgICAgZ2lmX3B0ci0+YXZhaWxfaW4gPSAwOw0KKyAgICBpZiAoZ2lmX2ltZ19nY2VfcHRyID09IE5VTEwpIHsNCisgICAgICBGWF9CT09MIGJSZXMgPSBnaWZfcHRyLT5fZ2lmX2dldF9yZWNvcmRfcG9zaXRpb25fZm4oDQorICAgICAgICAgIGdpZl9wdHIsIGdpZl9pbWFnZV9wdHItPmltYWdlX2RhdGFfcG9zLA0KKyAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPnRvcCwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoLA0KKyAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0LCBsb2NfcGFsX251bSwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0ciwgMCwgMCwgLTEsIDAsDQorICAgICAgICAgIChGWF9CT09MKSgoR2lmTEYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZykNCisgICAgICAgICAgICAgIC0+aW50ZXJsYWNlKTsNCisgICAgICBpZiAoIWJSZXMpIHsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQorICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gTlVMTDsNCisgICAgICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIkVycm9yIFJlYWQgUmVjb3JkIFBvc2l0aW9uIERhdGEiKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9CT09MIGJSZXMgPSBnaWZfcHRyLT5fZ2lmX2dldF9yZWNvcmRfcG9zaXRpb25fZm4oDQorICAgICAgICAgIGdpZl9wdHIsIGdpZl9pbWFnZV9wdHItPmltYWdlX2RhdGFfcG9zLA0KKyAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPnRvcCwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoLA0KKyAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0LCBsb2NfcGFsX251bSwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0ciwNCisgICAgICAgICAgKGludDMyX3QpZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0ci0+ZGVsYXlfdGltZSwNCisgICAgICAgICAgKEZYX0JPT0wpKChHaWZDRUYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT5nY2VfZmxhZykNCisgICAgICAgICAgICAgIC0+dXNlcl9pbnB1dCwNCisgICAgICAgICAgKChHaWZDRUYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT5nY2VfZmxhZyktPnRyYW5zcGFyZW5jeQ0KKyAgICAgICAgICAgICAgPyAoaW50MzJfdClnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT50cmFuc19pbmRleA0KKyAgICAgICAgICAgICAgOiAtMSwNCisgICAgICAgICAgKGludDMyX3QpKChHaWZDRUYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT5nY2VfZmxhZykNCisgICAgICAgICAgICAgIC0+ZGlzcG9zYWxfbWV0aG9kLA0KKyAgICAgICAgICAoRlhfQk9PTCkoKEdpZkxGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcpDQorICAgICAgICAgICAgICAtPmludGVybGFjZSk7DQorICAgICAgaWYgKCFiUmVzKSB7DQorICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiA9IE5VTEw7DQorICAgICAgICBfZ2lmX2Vycm9yKGdpZl9wdHIsICJFcnJvciBSZWFkIFJlY29yZCBQb3NpdGlvbiBEYXRhIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGdpZl9wdHItPmltZ19kZWNvZGVyX3B0ciA9PSBOVUxMKSB7DQorICAgICAgZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyID0gbmV3IENHaWZMWldEZWNvZGVyKGdpZl9wdHItPmVycl9wdHIpOw0KKyAgICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyLCBnaWZfcHRyKTsNCisgICAgfQ0KKyAgICBnaWZfcHRyLT5pbWdfZGVjb2Rlcl9wdHItPkluaXRUYWJsZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9jb2RlX3NpemUpOw0KKyAgICBnaWZfcHRyLT5pbWdfcm93X29mZnNldCA9IDA7DQorICAgIGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZSA9IDA7DQorICAgIGdpZl9wdHItPmltZ19wYXNzX251bSA9IDA7DQorICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0gPSAwOw0KICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19JTUdfREFUQSk7DQotICAgIHJldHVybiAxOw0KLX0NCi1pbnQzMl90IF9naWZfbG9hZF9mcmFtZShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBpbnQzMl90IGZyYW1lX251bSkNCi17DQotICAgIGlmKGdpZl9wdHIgPT0gTlVMTCB8fA0KLSAgICAgICAgICAgIGZyYW1lX251bSA8IDAgfHwNCi0gICAgICAgICAgICBmcmFtZV9udW0gPj0gZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5HZXRTaXplKCkNCi0gICAgICApIHsNCisgIH0NCisgIENHaWZMWldEZWNvZGVyKiBpbWdfZGVjb2Rlcl9wdHIgPSBnaWZfcHRyLT5pbWdfZGVjb2Rlcl9wdHI7DQorICBpZiAoZ2lmX3B0ci0+ZGVjb2RlX3N0YXR1cyA9PSBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpIHsNCisgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIDI7DQorICAgIH0NCisgICAgaWYgKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgew0KKyAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSA9PSBOVUxMKSB7DQorICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgcmV0dXJuIDI7DQorICAgICAgfQ0KKyAgICAgIGltZ19kZWNvZGVyX3B0ci0+SW5wdXQoZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKTsNCisgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19JTUdfREFUQSk7DQorICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19vZmZzZXQgKz0gZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplOw0KKyAgICAgIGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZSA9IGdpZl9pbWdfcm93X2J5dGVzIC0gZ2lmX3B0ci0+aW1nX3Jvd19vZmZzZXQ7DQorICAgICAgaW50MzJfdCByZXQgPSBpbWdfZGVjb2Rlcl9wdHItPkRlY29kZSgNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiArIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0LA0KKyAgICAgICAgICBnaWZfcHRyLT5pbWdfcm93X2F2YWlsX3NpemUpOw0KKyAgICAgIGlmIChyZXQgPT0gMCkgew0KKyAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgPSBOVUxMOw0KKyAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfVEFJTCk7DQorICAgICAgICBfZ2lmX2Vycm9yKGdpZl9wdHIsICJEZWNvZGUgSW1hZ2UgRGF0YSBFcnJvciIpOw0KICAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgdWludDhfdCogZGF0YV9zaXplX3B0ciA9IE5VTEw7DQotICAgIHVpbnQ4X3QqIGRhdGFfcHRyID0gTlVMTDsNCi0gICAgRlhfRFdPUkQgc2tpcF9zaXplX29yZyA9IGdpZl9wdHItPnNraXBfc2l6ZTsNCi0gICAgR2lmSW1hZ2UqIGdpZl9pbWFnZV9wdHIgPSBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHItPkdldEF0KGZyYW1lX251bSk7DQotICAgIEZYX0RXT1JEIGdpZl9pbWdfcm93X2J5dGVzID0gZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoOw0KLSAgICBpZihnaWZfcHRyLT5kZWNvZGVfc3RhdHVzID09IEdJRl9EX1NUQVRVU19UQUlMKSB7DQotICAgICAgICBpZihnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKSB7DQotICAgICAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCi0gICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gTlVMTDsNCisgICAgICB9DQorICAgICAgd2hpbGUgKHJldCAhPSAwKSB7DQorICAgICAgICBpZiAocmV0ID09IDEpIHsNCisgICAgICAgICAgZ2lmX3B0ci0+X2dpZl9nZXRfcm93X2ZuKGdpZl9wdHIsIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiA9IE5VTEw7DQorICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOw0KKyAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgIH0NCi0gICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgPSBGWF9BbGxvYyh1aW50OF90LCBnaWZfaW1nX3Jvd19ieXRlcyk7DQotICAgICAgICBHSUZfUFRSX05PVF9OVUxMKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYsIGdpZl9wdHIpOw0KLSAgICAgICAgR2lmR0NFKiBnaWZfaW1nX2djZV9wdHIgPSBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyOw0KLSAgICAgICAgaW50MzJfdCBsb2NfcGFsX251bSA9ICgoR2lmTEYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZyktPmxvY2FsX3BhbCA/DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyIDw8ICgoR2lmTEYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZyktPnBhbF9iaXRzKSA6IDA7DQotICAgICAgICBnaWZfcHRyLT5hdmFpbF9pbiA9IDA7DQotICAgICAgICBpZihnaWZfaW1nX2djZV9wdHIgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIEZYX0JPT0wgYlJlcyA9IGdpZl9wdHItPl9naWZfZ2V0X3JlY29yZF9wb3NpdGlvbl9mbihnaWZfcHRyLCBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9kYXRhX3BvcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+dG9wLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT53aWR0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY19wYWxfbnVtLCBnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIC0xLCAwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9CT09MKSgoR2lmTEYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZyktPmludGVybGFjZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7DQotICAgICAgICAgICAgaWYoIWJSZXMpIHsNCi0gICAgICAgICAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCi0gICAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiA9IE5VTEw7DQotICAgICAgICAgICAgICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIkVycm9yIFJlYWQgUmVjb3JkIFBvc2l0aW9uIERhdGEiKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWF9CT09MIGJSZXMgPSBnaWZfcHRyLT5fZ2lmX2dldF9yZWNvcmRfcG9zaXRpb25fZm4oZ2lmX3B0ciwgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZGF0YV9wb3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxlZnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPnRvcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+d2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfcGFsX251bSwgZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT5kZWxheV90aW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9CT09MKSgoR2lmQ0VGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0ci0+Z2NlX2ZsYWcpLT51c2VyX2lucHV0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoR2lmQ0VGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0ci0+Z2NlX2ZsYWcpLT50cmFuc3BhcmVuY3kgPw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWdpZl9pbWFnZV9wdHItPmltYWdlX2djZV9wdHItPnRyYW5zX2luZGV4IDogLTEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKChHaWZDRUYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT5nY2VfZmxhZyktPmRpc3Bvc2FsX21ldGhvZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfQk9PTCkoKEdpZkxGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcpLT5pbnRlcmxhY2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KLSAgICAgICAgICAgIGlmKCFiUmVzKSB7DQotICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQotICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBfZ2lmX2Vycm9yKGdpZl9wdHIsICJFcnJvciBSZWFkIFJlY29yZCBQb3NpdGlvbiBEYXRhIik7DQotICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGdpZl9wdHItPmltZ19kZWNvZGVyX3B0ciA9PSBOVUxMKSB7DQotICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyID0gbmV3IENHaWZMWldEZWNvZGVyKGdpZl9wdHItPmVycl9wdHIpOw0KLSAgICAgICAgICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyLCBnaWZfcHRyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGdpZl9wdHItPmltZ19kZWNvZGVyX3B0ci0+SW5pdFRhYmxlKGdpZl9pbWFnZV9wdHItPmltYWdlX2NvZGVfc2l6ZSk7DQotICAgICAgICBnaWZfcHRyLT5pbWdfcm93X29mZnNldCA9IDA7DQotICAgICAgICBnaWZfcHRyLT5pbWdfcm93X2F2YWlsX3NpemUgPSAwOw0KLSAgICAgICAgZ2lmX3B0ci0+aW1nX3Bhc3NfbnVtID0gMDsNCi0gICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0gPSAwOw0KLSAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOw0KLSAgICB9DQotICAgIENHaWZMWldEZWNvZGVyKiBpbWdfZGVjb2Rlcl9wdHIgPSBnaWZfcHRyLT5pbWdfZGVjb2Rlcl9wdHI7DQotICAgIGlmKGdpZl9wdHItPmRlY29kZV9zdGF0dXMgPT0gR0lGX0RfU1RBVFVTX0lNR19EQVRBKSB7DQotICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgaWYgKHJldCA9PSAyKSB7DQorICAgICAgICAgIEFTU0VSVChpbWdfZGVjb2Rlcl9wdHItPkdldEF2YWlsSW5wdXQoKSA9PSAwKTsNCisgICAgICAgICAgc2tpcF9zaXplX29yZyA9IGdpZl9wdHItPnNraXBfc2l6ZTsNCisgICAgICAgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQogICAgICAgICAgICAgcmV0dXJuIDI7DQotICAgICAgICB9DQotICAgICAgICBpZigqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsNCi0gICAgICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQotICAgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsNCisgICAgICAgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICAgIHJldHVybiAyOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICBpbWdfZGVjb2Rlcl9wdHItPklucHV0KGRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cik7DQogICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOw0KICAgICAgICAgICAgIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0ICs9IGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZTsNCi0gICAgICAgICAgICBnaWZfcHRyLT5pbWdfcm93X2F2YWlsX3NpemUgPSBnaWZfaW1nX3Jvd19ieXRlcyAtIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0Ow0KLSAgICAgICAgICAgIGludDMyX3QgcmV0ID0gaW1nX2RlY29kZXJfcHRyLT5EZWNvZGUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiArIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0LCBnaWZfcHRyLT5pbWdfcm93X2F2YWlsX3NpemUpOw0KLSAgICAgICAgICAgIGlmKHJldCA9PSAwKSB7DQotICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQotICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19UQUlMKTsNCi0gICAgICAgICAgICAgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiRGVjb2RlIEltYWdlIERhdGEgRXJyb3IiKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplID0NCisgICAgICAgICAgICAgICAgZ2lmX2ltZ19yb3dfYnl0ZXMgLSBnaWZfcHRyLT5pbWdfcm93X29mZnNldDsNCisgICAgICAgICAgICByZXQgPSBpbWdfZGVjb2Rlcl9wdHItPkRlY29kZSgNCisgICAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiArIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICBnaWZfcHRyLT5pbWdfcm93X2F2YWlsX3NpemUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAocmV0ID09IDMpIHsNCisgICAgICAgICAgaWYgKCgoR2lmTEYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZyktPmludGVybGFjZSkgew0KKyAgICAgICAgICAgIGdpZl9wdHItPl9naWZfZ2V0X3Jvd19mbihnaWZfcHRyLCBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtICs9DQorICAgICAgICAgICAgICAgIHNfZ2lmX2ludGVybGFjZV9zdGVwW2dpZl9wdHItPmltZ19wYXNzX251bV07DQorICAgICAgICAgICAgaWYgKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0gPj0NCisgICAgICAgICAgICAgICAgKGludDMyX3QpZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCkgew0KKyAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Bhc3NfbnVtKys7DQorICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtID0NCisgICAgICAgICAgICAgICAgICBzX2dpZl9pbnRlcmxhY2Vfc3RlcFtnaWZfcHRyLT5pbWdfcGFzc19udW1dIC8gMjsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgd2hpbGUgKHJldCAhPSAwKSB7DQotICAgICAgICAgICAgICAgIGlmKHJldCA9PSAxKSB7DQotICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5fZ2lmX2dldF9yb3dfZm4oZ2lmX3B0ciwgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X251bSwgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQotICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KLSAgICAgICAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19UQUlMKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKHJldCA9PSAyKSB7DQotICAgICAgICAgICAgICAgICAgICBBU1NFUlQoaW1nX2RlY29kZXJfcHRyLT5HZXRBdmFpbElucHV0KCkgPT0gMCk7DQotICAgICAgICAgICAgICAgICAgICBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmICgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpbWdfZGVjb2Rlcl9wdHItPklucHV0KGRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cik7DQotICAgICAgICAgICAgICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0ICs9IGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5pbWdfcm93X2F2YWlsX3NpemUgPSBnaWZfaW1nX3Jvd19ieXRlcyAtIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGltZ19kZWNvZGVyX3B0ci0+RGVjb2RlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgKyBnaWZfcHRyLT5pbWdfcm93X29mZnNldCwgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZihyZXQgPT0gMykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoKChHaWZMRiopJmdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sb2NhbF9mbGFnKS0+aW50ZXJsYWNlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+X2dpZl9nZXRfcm93X2ZuKGdpZl9wdHIsIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0sIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0gKz0gc19naWZfaW50ZXJsYWNlX3N0ZXBbZ2lmX3B0ci0+aW1nX3Bhc3NfbnVtXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtID49IChpbnQzMl90KWdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5oZWlnaHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Bhc3NfbnVtKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0gPSBzX2dpZl9pbnRlcmxhY2Vfc3RlcFtnaWZfcHRyLT5pbWdfcGFzc19udW1dIC8gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPl9naWZfZ2V0X3Jvd19mbihnaWZfcHRyLCBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtKyssIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19vZmZzZXQgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplID0gZ2lmX2ltZ19yb3dfYnl0ZXM7DQotICAgICAgICAgICAgICAgICAgICByZXQgPSBpbWdfZGVjb2Rlcl9wdHItPkRlY29kZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmICsgZ2lmX3B0ci0+aW1nX3Jvd19vZmZzZXQsIGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYocmV0ID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQotICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOw0KLSAgICAgICAgICAgICAgICAgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiRGVjb2RlIEltYWdlIERhdGEgRXJyb3IiKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGdpZl9wdHItPl9naWZfZ2V0X3Jvd19mbihnaWZfcHRyLCBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtKyssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0ID0gMDsNCisgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplID0gZ2lmX2ltZ19yb3dfYnl0ZXM7DQorICAgICAgICAgIHJldCA9IGltZ19kZWNvZGVyX3B0ci0+RGVjb2RlKA0KKyAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiArIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0LA0KKyAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplKTsNCiAgICAgICAgIH0NCi0gICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOw0KLSAgICB9DQotICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIkRlY29kZSBJbWFnZSBEYXRhIEVycm9yIik7DQotICAgIHJldHVybiAwOw0KLX0NCi12b2lkIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgaW50MzJfdCBzdGF0dXMpDQotew0KLSAgICBnaWZfcHRyLT5kZWNvZGVfc3RhdHVzID0gc3RhdHVzOw0KLSAgICBnaWZfcHRyLT5uZXh0X2luICs9IGdpZl9wdHItPnNraXBfc2l6ZTsNCi0gICAgZ2lmX3B0ci0+YXZhaWxfaW4gLT0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KLSAgICBnaWZfcHRyLT5za2lwX3NpemUgPSAwOw0KLX0NCi11aW50OF90KiBfZ2lmX3JlYWRfZGF0YShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCB1aW50OF90KiogZGVzX2J1Zl9wcCwgRlhfRFdPUkQgZGF0YV9zaXplKQ0KLXsNCi0gICAgaWYoZ2lmX3B0ciA9PSBOVUxMIHx8DQotICAgICAgICAgICAgZ2lmX3B0ci0+YXZhaWxfaW4gPCBnaWZfcHRyLT5za2lwX3NpemUgKyBkYXRhX3NpemUpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgICpkZXNfYnVmX3BwID0gZ2lmX3B0ci0+bmV4dF9pbiArIGdpZl9wdHItPnNraXBfc2l6ZTsNCi0gICAgZ2lmX3B0ci0+c2tpcF9zaXplICs9IGRhdGFfc2l6ZTsNCi0gICAgcmV0dXJuICpkZXNfYnVmX3BwOw0KLX0NCi12b2lkIF9naWZfaW5wdXRfYnVmZmVyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKQ0KLXsNCi0gICAgZ2lmX3B0ci0+bmV4dF9pbiA9IHNyY19idWY7DQotICAgIGdpZl9wdHItPmF2YWlsX2luID0gc3JjX3NpemU7DQotICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IDA7DQotfQ0KLUZYX0RXT1JEIF9naWZfZ2V0X2F2YWlsX2lucHV0KGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIHVpbnQ4X3QqKiBhdmlhbF9idWZfcHRyKQ0KLXsNCi0gICAgaWYoYXZpYWxfYnVmX3B0ciAhPSBOVUxMKSB7DQotICAgICAgICAqYXZpYWxfYnVmX3B0ciA9IE5VTEw7DQotICAgICAgICBpZihnaWZfcHRyLT5hdmFpbF9pbiA+IDApIHsNCi0gICAgICAgICAgICAqYXZpYWxfYnVmX3B0ciA9IGdpZl9wdHItPm5leHRfaW47DQorICAgICAgICBpZiAocmV0ID09IDApIHsNCisgICAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiA9IE5VTEw7DQorICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOw0KKyAgICAgICAgICBfZ2lmX2Vycm9yKGdpZl9wdHIsICJEZWNvZGUgSW1hZ2UgRGF0YSBFcnJvciIpOw0KKyAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIGdpZl9wdHItPmF2YWlsX2luOw0KKyAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19UQUlMKTsNCisgIH0NCisgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIkRlY29kZSBJbWFnZSBEYXRhIEVycm9yIik7DQorICByZXR1cm4gMDsNCiB9DQotaW50MzJfdCBfZ2lmX2dldF9mcmFtZV9udW0oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cikNCi17DQotICAgIHJldHVybiBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHItPkdldFNpemUoKTsNCit2b2lkIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMpIHsNCisgIGdpZl9wdHItPmRlY29kZV9zdGF0dXMgPSBzdGF0dXM7DQorICBnaWZfcHRyLT5uZXh0X2luICs9IGdpZl9wdHItPnNraXBfc2l6ZTsNCisgIGdpZl9wdHItPmF2YWlsX2luIC09IGdpZl9wdHItPnNraXBfc2l6ZTsNCisgIGdpZl9wdHItPnNraXBfc2l6ZSA9IDA7DQogfQ0KLXN0YXRpYyBGWF9CT09MIF9naWZfd3JpdGVfaGVhZGVyKCBnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgdWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuICkNCi17DQotICAgIGlmIChnaWZfcHRyLT5jdXJfb2Zmc2V0KSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCit1aW50OF90KiBfZ2lmX3JlYWRfZGF0YShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBkZXNfYnVmX3BwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRhdGFfc2l6ZSkgew0KKyAgaWYgKGdpZl9wdHIgPT0gTlVMTCB8fCBnaWZfcHRyLT5hdmFpbF9pbiA8IGdpZl9wdHItPnNraXBfc2l6ZSArIGRhdGFfc2l6ZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgICpkZXNfYnVmX3BwID0gZ2lmX3B0ci0+bmV4dF9pbiArIGdpZl9wdHItPnNraXBfc2l6ZTsNCisgIGdpZl9wdHItPnNraXBfc2l6ZSArPSBkYXRhX3NpemU7DQorICByZXR1cm4gKmRlc19idWZfcHA7DQorfQ0KK3ZvaWQgX2dpZl9pbnB1dF9idWZmZXIoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19idWYsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSkgew0KKyAgZ2lmX3B0ci0+bmV4dF9pbiA9IHNyY19idWY7DQorICBnaWZfcHRyLT5hdmFpbF9pbiA9IHNyY19zaXplOw0KKyAgZ2lmX3B0ci0+c2tpcF9zaXplID0gMDsNCit9DQorRlhfRFdPUkQgX2dpZl9nZXRfYXZhaWxfaW5wdXQoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYXZpYWxfYnVmX3B0cikgew0KKyAgaWYgKGF2aWFsX2J1Zl9wdHIgIT0gTlVMTCkgew0KKyAgICAqYXZpYWxfYnVmX3B0ciA9IE5VTEw7DQorICAgIGlmIChnaWZfcHRyLT5hdmFpbF9pbiA+IDApIHsNCisgICAgICAqYXZpYWxfYnVmX3B0ciA9IGdpZl9wdHItPm5leHRfaW47DQogICAgIH0NCi0gICAgZHN0X2xlbiA9IHNpemVvZihHaWZIZWFkZXIpICsgc2l6ZW9mKEdpZkxTRCkgKyBzaXplb2YoR2lmR0YpOw0KLSAgICBkc3RfYnVmID0gRlhfVHJ5QWxsb2ModWludDhfdCwgZHN0X2xlbik7DQotICAgIGlmIChkc3RfYnVmID09IE5VTEwpCXsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWFNZU19tZW1zZXQoZHN0X2J1ZiwgMCwgZHN0X2xlbik7DQotICAgIEZYU1lTX21lbWNweShkc3RfYnVmLCBnaWZfcHRyLT5oZWFkZXJfcHRyLCBzaXplb2YoR2lmSGVhZGVyKSk7DQotICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gc2l6ZW9mKEdpZkhlYWRlcik7DQotICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5sc2RfcHRyLT53aWR0aCk7DQotICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCi0gICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsIGdpZl9wdHItPmxzZF9wdHItPmhlaWdodCk7DQotICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCi0gICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+bHNkX3B0ci0+Z2xvYmFsX2ZsYWc7DQotICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPmxzZF9wdHItPmJjX2luZGV4Ow0KLSAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5sc2RfcHRyLT5waXhlbF9hc3BlY3Q7DQotICAgIGlmIChnaWZfcHRyLT5nbG9iYWxfcGFsKSB7DQotICAgICAgICBGWF9XT1JEIHNpemUgPSBzaXplb2YoR2lmUGFsZXR0ZSkgKiBnaWZfcHRyLT5ncGFsX251bTsNCi0gICAgICAgIGlmICghX2dpZl9ncm93X2J1Zihkc3RfYnVmLCBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0ICsgc2l6ZSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBGWFNZU19tZW1jcHkoJmRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldF0sIGdpZl9wdHItPmdsb2JhbF9wYWwsIHNpemUpOw0KLSAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSBzaXplOw0KLSAgICB9DQorICB9DQorICByZXR1cm4gZ2lmX3B0ci0+YXZhaWxfaW47DQorfQ0KK2ludDMyX3QgX2dpZl9nZXRfZnJhbWVfbnVtKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIpIHsNCisgIHJldHVybiBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHItPkdldFNpemUoKTsNCit9DQorc3RhdGljIEZYX0JPT0wgX2dpZl93cml0ZV9oZWFkZXIoZ2lmX2NvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9sZW4pIHsNCisgIGlmIChnaWZfcHRyLT5jdXJfb2Zmc2V0KSB7DQogICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgZHN0X2xlbiA9IHNpemVvZihHaWZIZWFkZXIpICsgc2l6ZW9mKEdpZkxTRCkgKyBzaXplb2YoR2lmR0YpOw0KKyAgZHN0X2J1ZiA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIGRzdF9sZW4pOw0KKyAgaWYgKGRzdF9idWYgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWFNZU19tZW1zZXQoZHN0X2J1ZiwgMCwgZHN0X2xlbik7DQorICBGWFNZU19tZW1jcHkoZHN0X2J1ZiwgZ2lmX3B0ci0+aGVhZGVyX3B0ciwgc2l6ZW9mKEdpZkhlYWRlcikpOw0KKyAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSBzaXplb2YoR2lmSGVhZGVyKTsNCisgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5sc2RfcHRyLT53aWR0aCk7DQorICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+bHNkX3B0ci0+aGVpZ2h0KTsNCisgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPmxzZF9wdHItPmdsb2JhbF9mbGFnOw0KKyAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+bHNkX3B0ci0+YmNfaW5kZXg7DQorICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5sc2RfcHRyLT5waXhlbF9hc3BlY3Q7DQorICBpZiAoZ2lmX3B0ci0+Z2xvYmFsX3BhbCkgew0KKyAgICBGWF9XT1JEIHNpemUgPSBzaXplb2YoR2lmUGFsZXR0ZSkgKiBnaWZfcHRyLT5ncGFsX251bTsNCisgICAgaWYgKCFfZ2lmX2dyb3dfYnVmKGRzdF9idWYsIGRzdF9sZW4sIGdpZl9wdHItPmN1cl9vZmZzZXQgKyBzaXplKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1jcHkoJmRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldF0sIGdpZl9wdHItPmdsb2JhbF9wYWwsIHNpemUpOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IHNpemU7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBpbnRlcmxhY2VfYnVmKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgRlhfRFdPUkQgcGl0Y2gsIEZYX0RXT1JEIGhlaWdodCkNCi17DQotICAgIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3QqPiBwYXNzWzRdOw0KLSAgICBpbnQgaSwgajsNCi0gICAgRlhfRFdPUkQgcm93Ow0KLSAgICByb3cgPSAwOw0KLSAgICB1aW50OF90KiB0ZW1wOw0KLSAgICB3aGlsZSAocm93IDwgaGVpZ2h0KSB7DQotICAgICAgICBpZiAocm93ICUgOCA9PSAwKSB7DQotICAgICAgICAgICAgaiA9IDA7DQotICAgICAgICB9IGVsc2UgaWYgKHJvdyAlIDQgPT0gMCkgew0KLSAgICAgICAgICAgIGogPSAxOw0KLSAgICAgICAgfSBlbHNlIGlmIChyb3cgJSAyID09IDApIHsNCi0gICAgICAgICAgICBqID0gMjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaiA9IDM7DQotICAgICAgICB9DQotICAgICAgICB0ZW1wID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2gpOw0KLSAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYU1lTX21lbWNweSh0ZW1wLCAmYnVmW3BpdGNoICogcm93XSwgcGl0Y2gpOw0KLSAgICAgICAgcGFzc1tqXS5BZGQodGVtcCk7DQotICAgICAgICByb3cgKys7DQordm9pZCBpbnRlcmxhY2VfYnVmKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgRlhfRFdPUkQgcGl0Y2gsIEZYX0RXT1JEIGhlaWdodCkgew0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdCo+IHBhc3NbNF07DQorICBpbnQgaSwgajsNCisgIEZYX0RXT1JEIHJvdzsNCisgIHJvdyA9IDA7DQorICB1aW50OF90KiB0ZW1wOw0KKyAgd2hpbGUgKHJvdyA8IGhlaWdodCkgew0KKyAgICBpZiAocm93ICUgOCA9PSAwKSB7DQorICAgICAgaiA9IDA7DQorICAgIH0gZWxzZSBpZiAocm93ICUgNCA9PSAwKSB7DQorICAgICAgaiA9IDE7DQorICAgIH0gZWxzZSBpZiAocm93ICUgMiA9PSAwKSB7DQorICAgICAgaiA9IDI7DQorICAgIH0gZWxzZSB7DQorICAgICAgaiA9IDM7DQogICAgIH0NCi0gICAgZm9yIChpID0gMCwgcm93ID0gMDsgaSA8IDQ7IGkrKykgew0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhc3NbaV0uR2V0U2l6ZSgpOyBqKyssIHJvdysrKSB7DQotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KCh1aW50OF90KikmYnVmW3BpdGNoICogcm93XSwgcGFzc1tpXS5HZXRBdChqKSwgcGl0Y2gpOw0KLSAgICAgICAgICAgIEZYX0ZyZWUocGFzc1tpXS5HZXRBdChqKSk7DQotICAgICAgICB9DQorICAgIHRlbXAgPSBGWF9BbGxvYyh1aW50OF90LCBwaXRjaCk7DQorICAgIGlmICh0ZW1wID09IE5VTEwpIHsNCisgICAgICByZXR1cm47DQogICAgIH0NCisgICAgRlhTWVNfbWVtY3B5KHRlbXAsICZidWZbcGl0Y2ggKiByb3ddLCBwaXRjaCk7DQorICAgIHBhc3Nbal0uQWRkKHRlbXApOw0KKyAgICByb3crKzsNCisgIH0NCisgIGZvciAoaSA9IDAsIHJvdyA9IDA7IGkgPCA0OyBpKyspIHsNCisgICAgZm9yIChqID0gMDsgaiA8IHBhc3NbaV0uR2V0U2l6ZSgpOyBqKyssIHJvdysrKSB7DQorICAgICAgRlhTWVNfbWVtY3B5KCh1aW50OF90KikmYnVmW3BpdGNoICogcm93XSwgcGFzc1tpXS5HZXRBdChqKSwgcGl0Y2gpOw0KKyAgICAgIEZYX0ZyZWUocGFzc1tpXS5HZXRBdChqKSk7DQorICAgIH0NCisgIH0NCiB9DQotc3RhdGljIHZvaWQgX2dpZl93cml0ZV9ibG9ja19kYXRhKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19sZW4sIHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiwgRlhfRFdPUkQmIGRzdF9vZmZzZXQpDQotew0KLSAgICBGWF9EV09SRCBzcmNfb2Zmc2V0ID0gMDsNCi0gICAgd2hpbGUgKHNyY19sZW4gPiBHSUZfREFUQV9CTE9DSykgew0KLSAgICAgICAgZHN0X2J1Zltkc3Rfb2Zmc2V0KytdID0gR0lGX0RBVEFfQkxPQ0s7DQotICAgICAgICBGWFNZU19tZW1jcHkoJmRzdF9idWZbZHN0X29mZnNldF0sICZzcmNfYnVmW3NyY19vZmZzZXRdLCBHSUZfREFUQV9CTE9DSyk7DQotICAgICAgICBkc3Rfb2Zmc2V0ICs9IEdJRl9EQVRBX0JMT0NLOw0KLSAgICAgICAgc3JjX29mZnNldCArPSBHSUZfREFUQV9CTE9DSzsNCi0gICAgICAgIHNyY19sZW4gLT0gR0lGX0RBVEFfQkxPQ0s7DQotICAgIH0NCi0gICAgZHN0X2J1Zltkc3Rfb2Zmc2V0KytdID0gKHVpbnQ4X3Qpc3JjX2xlbjsNCi0gICAgRlhTWVNfbWVtY3B5KCZkc3RfYnVmW2RzdF9vZmZzZXRdLCAmc3JjX2J1ZltzcmNfb2Zmc2V0XSwgc3JjX2xlbik7DQotICAgIGRzdF9vZmZzZXQgKz0gc3JjX2xlbjsNCitzdGF0aWMgdm9pZCBfZ2lmX3dyaXRlX2Jsb2NrX2RhdGEoY29uc3QgdWludDhfdCogc3JjX2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX2xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3RfbGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHN0X29mZnNldCkgew0KKyAgRlhfRFdPUkQgc3JjX29mZnNldCA9IDA7DQorICB3aGlsZSAoc3JjX2xlbiA+IEdJRl9EQVRBX0JMT0NLKSB7DQorICAgIGRzdF9idWZbZHN0X29mZnNldCsrXSA9IEdJRl9EQVRBX0JMT0NLOw0KKyAgICBGWFNZU19tZW1jcHkoJmRzdF9idWZbZHN0X29mZnNldF0sICZzcmNfYnVmW3NyY19vZmZzZXRdLCBHSUZfREFUQV9CTE9DSyk7DQorICAgIGRzdF9vZmZzZXQgKz0gR0lGX0RBVEFfQkxPQ0s7DQorICAgIHNyY19vZmZzZXQgKz0gR0lGX0RBVEFfQkxPQ0s7DQorICAgIHNyY19sZW4gLT0gR0lGX0RBVEFfQkxPQ0s7DQorICB9DQorICBkc3RfYnVmW2RzdF9vZmZzZXQrK10gPSAodWludDhfdClzcmNfbGVuOw0KKyAgRlhTWVNfbWVtY3B5KCZkc3RfYnVmW2RzdF9vZmZzZXRdLCAmc3JjX2J1ZltzcmNfb2Zmc2V0XSwgc3JjX2xlbik7DQorICBkc3Rfb2Zmc2V0ICs9IHNyY19sZW47DQogfQ0KLXN0YXRpYyBGWF9CT09MIF9naWZfd3JpdGVfZGF0YSggZ2lmX2NvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiApDQotew0KLSAgICBpZiAoIV9naWZfZ3Jvd19idWYoZHN0X2J1ZiwgZHN0X2xlbiwgZ2lmX3B0ci0+Y3VyX29mZnNldCArIEdJRl9EQVRBX0JMT0NLKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQorc3RhdGljIEZYX0JPT0wgX2dpZl93cml0ZV9kYXRhKGdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9sZW4pIHsNCisgIGlmICghX2dpZl9ncm93X2J1Zihkc3RfYnVmLCBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0ICsgR0lGX0RBVEFfQkxPQ0spKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCiAjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KLSAgICBpZiAoRlhTWVNfbWVtY21wKGdpZl9wdHItPmhlYWRlcl9wdHItPnZlcnNpb24sICI4OWEiLCAzKSA9PSAwKSB7DQotICAgICAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX0VYVEVOU0lPTjsNCi0gICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9CTE9DS19HQ0U7DQotICAgICAgICBnaWZfcHRyLT5nY2VfcHRyLT5ibG9ja19zaXplID0gNDsNCi0gICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPmdjZV9wdHItPmJsb2NrX3NpemU7DQotICAgICAgICBnaWZfcHRyLT5nY2VfcHRyLT5nY2VfZmxhZyA9IDA7DQotICAgICAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5nY2VfcHRyLT5nY2VfZmxhZzsNCi0gICAgICAgIGdpZl9wdHItPmdjZV9wdHItPmRlbGF5X3RpbWUgPSAxMDsNCi0gICAgICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5nY2VfcHRyLT5kZWxheV90aW1lKTsNCi0gICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCi0gICAgICAgIGdpZl9wdHItPmdjZV9wdHItPnRyYW5zX2luZGV4ID0gMDsNCi0gICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPmdjZV9wdHItPnRyYW5zX2luZGV4Ow0KLSAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gMDsNCi0gICAgfQ0KLSNlbmRpZg0KLSAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX0lNQUdFOw0KLSAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxlZnQpOw0KKyAgaWYgKEZYU1lTX21lbWNtcChnaWZfcHRyLT5oZWFkZXJfcHRyLT52ZXJzaW9uLCAiODlhIiwgMykgPT0gMCkgew0KKyAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX0VYVEVOU0lPTjsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX0JMT0NLX0dDRTsNCisgICAgZ2lmX3B0ci0+Z2NlX3B0ci0+YmxvY2tfc2l6ZSA9IDQ7DQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPmdjZV9wdHItPmJsb2NrX3NpemU7DQorICAgIGdpZl9wdHItPmdjZV9wdHItPmdjZV9mbGFnID0gMDsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+Z2NlX3B0ci0+Z2NlX2ZsYWc7DQorICAgIGdpZl9wdHItPmdjZV9wdHItPmRlbGF5X3RpbWUgPSAxMDsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmdjZV9wdHItPmRlbGF5X3RpbWUpOw0KICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQotICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+dG9wKTsNCi0gICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KLSAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoKTsNCi0gICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KLSAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCk7DQotICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCi0gICAgR2lmTEYmIGxmID0gKEdpZkxGJilnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZzsNCi0gICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWc7DQotICAgIGlmIChnaWZfcHRyLT5sb2NhbF9wYWwpIHsNCi0gICAgICAgIEZYX0RXT1JEIHBhbF9zaXplID0gc2l6ZW9mKEdpZlBhbGV0dGUpICogZ2lmX3B0ci0+bHBhbF9udW07DQotICAgICAgICBpZiAoIV9naWZfZ3Jvd19idWYoZHN0X2J1ZiwgZHN0X2xlbiwgcGFsX3NpemUgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0KSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYU1lTX21lbWNweSgmZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0XSwgZ2lmX3B0ci0+bG9jYWxfcGFsLCBwYWxfc2l6ZSk7DQotICAgICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IHBhbF9zaXplOw0KLSAgICB9DQotICAgIGlmIChsZi5pbnRlcmxhY2UpIHsNCi0gICAgICAgIGludGVybGFjZV9idWYoZ2lmX3B0ci0+c3JjX2J1ZiwgZ2lmX3B0ci0+c3JjX3BpdGNoLCBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0KTsNCi0gICAgfQ0KLSAgICB1aW50OF90IGNvZGVfYml0ID0gbGYucGFsX2JpdHM7DQotICAgIGlmIChsZi5sb2NhbF9wYWwgPT0gMCkgew0KLSAgICAgICAgR2lmR0YmIGdmID0gKEdpZkdGJilnaWZfcHRyLT5sc2RfcHRyLT5nbG9iYWxfZmxhZzsNCi0gICAgICAgIGNvZGVfYml0ID0gZ2YucGFsX2JpdHM7DQotICAgIH0NCi0gICAgZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyLT5TdGFydChjb2RlX2JpdCwgZ2lmX3B0ci0+c3JjX2J1ZiwgZHN0X2J1ZiwgZ2lmX3B0ci0+Y3VyX29mZnNldCk7DQotICAgIEZYX0RXT1JEIGk7DQotICAgIGZvciAoaSA9IDA7IGkgPCBnaWZfcHRyLT5zcmNfcm93OyBpKyspIHsNCi0gICAgICAgIGlmICghZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyLT5FbmNvZGUoJmdpZl9wdHItPnNyY19idWZbaSAqIGdpZl9wdHItPnNyY19waXRjaF0sIGdpZl9wdHItPnNyY193aWR0aCAqIChjb2RlX2JpdCArIDEpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmLCBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0KSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHItPkZpbmlzaChkc3RfYnVmLCBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0KTsNCisgICAgZ2lmX3B0ci0+Z2NlX3B0ci0+dHJhbnNfaW5kZXggPSAwOw0KKyAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5nY2VfcHRyLT50cmFuc19pbmRleDsNCiAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gMDsNCi0jaWZkZWYgR0lGX1NVUFBPUlRfQ09NTUVOVF9FWFRFTlNJT04NCi0gICAgaWYgKEZYU1lTX21lbWNtcChnaWZfcHRyLT5oZWFkZXJfcHRyLT52ZXJzaW9uLCAiODlhIiwgMykgPT0gMCAmJiBnaWZfcHRyLT5jbXRfZGF0YV9wdHIpIHsNCi0gICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9TSUdfRVhURU5TSU9OOw0KLSAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX0JMT0NLX0NFOw0KLSAgICAgICAgX2dpZl93cml0ZV9ibG9ja19kYXRhKGdpZl9wdHItPmNtdF9kYXRhX3B0ciwgZ2lmX3B0ci0+Y210X2RhdGFfbGVuLCBkc3RfYnVmLCBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0KTsNCi0gICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IDA7DQorICB9DQorI2VuZGlmDQorICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX0lNQUdFOw0KKyAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCk7DQorICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwNCisgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmltYWdlX2luZm9fcHRyLT50b3ApOw0KKyAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+d2lkdGgpOw0KKyAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0KTsNCisgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgIEdpZkxGJiBsZiA9IChHaWZMRiYpZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWc7DQorICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZzsNCisgIGlmIChnaWZfcHRyLT5sb2NhbF9wYWwpIHsNCisgICAgRlhfRFdPUkQgcGFsX3NpemUgPSBzaXplb2YoR2lmUGFsZXR0ZSkgKiBnaWZfcHRyLT5scGFsX251bTsNCisgICAgaWYgKCFfZ2lmX2dyb3dfYnVmKGRzdF9idWYsIGRzdF9sZW4sIHBhbF9zaXplICsgZ2lmX3B0ci0+Y3VyX29mZnNldCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCisgICAgRlhTWVNfbWVtY3B5KCZkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXRdLCBnaWZfcHRyLT5sb2NhbF9wYWwsIHBhbF9zaXplKTsNCisgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSBwYWxfc2l6ZTsNCisgIH0NCisgIGlmIChsZi5pbnRlcmxhY2UpIHsNCisgICAgaW50ZXJsYWNlX2J1ZihnaWZfcHRyLT5zcmNfYnVmLCBnaWZfcHRyLT5zcmNfcGl0Y2gsDQorICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCk7DQorICB9DQorICB1aW50OF90IGNvZGVfYml0ID0gbGYucGFsX2JpdHM7DQorICBpZiAobGYubG9jYWxfcGFsID09IDApIHsNCisgICAgR2lmR0YmIGdmID0gKEdpZkdGJilnaWZfcHRyLT5sc2RfcHRyLT5nbG9iYWxfZmxhZzsNCisgICAgY29kZV9iaXQgPSBnZi5wYWxfYml0czsNCisgIH0NCisgIGdpZl9wdHItPmltZ19lbmNvZGVyX3B0ci0+U3RhcnQoY29kZV9iaXQsIGdpZl9wdHItPnNyY19idWYsIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQpOw0KKyAgRlhfRFdPUkQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBnaWZfcHRyLT5zcmNfcm93OyBpKyspIHsNCisgICAgaWYgKCFnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHItPkVuY29kZSgNCisgICAgICAgICAgICAmZ2lmX3B0ci0+c3JjX2J1ZltpICogZ2lmX3B0ci0+c3JjX3BpdGNoXSwNCisgICAgICAgICAgICBnaWZfcHRyLT5zcmNfd2lkdGggKiAoY29kZV9iaXQgKyAxKSwgZHN0X2J1ZiwgZHN0X2xlbiwNCisgICAgICAgICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0KSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyLT5GaW5pc2goZHN0X2J1ZiwgZHN0X2xlbiwgZ2lmX3B0ci0+Y3VyX29mZnNldCk7DQorICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSAwOw0KKyNpZmRlZiBHSUZfU1VQUE9SVF9DT01NRU5UX0VYVEVOU0lPTg0KKyAgaWYgKEZYU1lTX21lbWNtcChnaWZfcHRyLT5oZWFkZXJfcHRyLT52ZXJzaW9uLCAiODlhIiwgMykgPT0gMCAmJg0KKyAgICAgIGdpZl9wdHItPmNtdF9kYXRhX3B0cikgew0KKyAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX0VYVEVOU0lPTjsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX0JMT0NLX0NFOw0KKyAgICBfZ2lmX3dyaXRlX2Jsb2NrX2RhdGEoZ2lmX3B0ci0+Y210X2RhdGFfcHRyLCBnaWZfcHRyLT5jbXRfZGF0YV9sZW4sIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0KTsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gMDsNCisgIH0NCiAjZW5kaWYNCiAjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCi0gICAgaWYgKEZYU1lTX21lbWNtcChnaWZfcHRyLT5oZWFkZXJfcHRyLT52ZXJzaW9uLCAiODlhIiwgMykgPT0gMCAmJiBnaWZfcHRyLT5wdGVfZGF0YV9wdHIpIHsNCi0gICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9TSUdfRVhURU5TSU9OOw0KLSAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX0JMT0NLX1BURTsNCi0gICAgICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPnB0ZV9wdHItPmJsb2NrX3NpemU7DQotICAgICAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+cHRlX3B0ci0+Z3JpZF9sZWZ0KTsNCi0gICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCi0gICAgICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5wdGVfcHRyLT5ncmlkX3RvcCk7DQotICAgICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQotICAgICAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+cHRlX3B0ci0+Z3JpZF93aWR0aCk7DQotICAgICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQotICAgICAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+cHRlX3B0ci0+Z3JpZF9oZWlnaHQpOw0KLSAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KLSAgICAgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsIGdpZl9wdHItPnB0ZV9wdHItPmNoYXJfd2lkdGgpOw0KLSAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KLSAgICAgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsIGdpZl9wdHItPnB0ZV9wdHItPmNoYXJfaGVpZ2h0KTsNCi0gICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCi0gICAgICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5wdGVfcHRyLT5mY19pbmRleCk7DQotICAgICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQotICAgICAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+cHRlX3B0ci0+YmNfaW5kZXgpOw0KLSAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KLSAgICAgICAgX2dpZl93cml0ZV9ibG9ja19kYXRhKGdpZl9wdHItPnB0ZV9kYXRhX3B0ciwgZ2lmX3B0ci0+cHRlX2RhdGFfbGVuLCBkc3RfYnVmLCBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0KTsNCi0gICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gZ2lmX3B0ci0+cHRlX2RhdGFfbGVuOw0KLSAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gMDsNCi0gICAgfQ0KKyAgaWYgKEZYU1lTX21lbWNtcChnaWZfcHRyLT5oZWFkZXJfcHRyLT52ZXJzaW9uLCAiODlhIiwgMykgPT0gMCAmJg0KKyAgICAgIGdpZl9wdHItPnB0ZV9kYXRhX3B0cikgew0KKyAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX0VYVEVOU0lPTjsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX0JMT0NLX1BURTsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+cHRlX3B0ci0+YmxvY2tfc2l6ZTsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPnB0ZV9wdHItPmdyaWRfbGVmdCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPnB0ZV9wdHItPmdyaWRfdG9wKTsNCisgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+cHRlX3B0ci0+Z3JpZF93aWR0aCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPnB0ZV9wdHItPmdyaWRfaGVpZ2h0KTsNCisgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+cHRlX3B0ci0+Y2hhcl93aWR0aCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPnB0ZV9wdHItPmNoYXJfaGVpZ2h0KTsNCisgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+cHRlX3B0ci0+ZmNfaW5kZXgpOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5wdGVfcHRyLT5iY19pbmRleCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgX2dpZl93cml0ZV9ibG9ja19kYXRhKGdpZl9wdHItPnB0ZV9kYXRhX3B0ciwgZ2lmX3B0ci0+cHRlX2RhdGFfbGVuLCBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2xlbiwgZ2lmX3B0ci0+Y3VyX29mZnNldCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gZ2lmX3B0ci0+cHRlX2RhdGFfbGVuOw0KKyAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSAwOw0KKyAgfQ0KICNlbmRpZg0KICNpZmRlZiBHSUZfU1VQUE9SVF9BUFBMSUNBVElPTl9FWFRFTlNJT04NCi0gICAgaWYgKEZYU1lTX21lbWNtcChnaWZfcHRyLT5oZWFkZXJfcHRyLT52ZXJzaW9uLCAiODlhIiwgMykgPT0gMCAmJiBnaWZfcHRyLT5hcHBfZGF0YSkgew0KLSAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX1NJR19FWFRFTlNJT047DQotICAgICAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfQkxPQ0tfQUU7DQotICAgICAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSAxMTsNCi0gICAgICAgIEZYU1lTX21lbWNweSgmZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0XSwgZ2lmX3B0ci0+YXBwX2lkZW50aWZ5LCA4KTsNCi0gICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gODsNCi0gICAgICAgIEZYU1lTX21lbWNweSgmZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0XSwgZ2lmX3B0ci0+YXBwX2F1dGhlbnRpY2F0aW9uLCA4KTsNCi0gICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMzsNCi0gICAgICAgIEZYU1lTX21lbWNweSgmZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0XSwgZ2lmX3B0ci0+YXBwX2RhdGEsIGdpZl9wdHItPmFwcF9kYXRhX3NpemUpOw0KLSAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSBnaWZfcHRyLT5hcHBfZGF0YV9zaXplOw0KLSAgICAgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gMDsNCi0gICAgfQ0KKyAgaWYgKEZYU1lTX21lbWNtcChnaWZfcHRyLT5oZWFkZXJfcHRyLT52ZXJzaW9uLCAiODlhIiwgMykgPT0gMCAmJg0KKyAgICAgIGdpZl9wdHItPmFwcF9kYXRhKSB7DQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9TSUdfRVhURU5TSU9OOw0KKyAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfQkxPQ0tfQUU7DQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IDExOw0KKyAgICBGWFNZU19tZW1jcHkoJmRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldF0sIGdpZl9wdHItPmFwcF9pZGVudGlmeSwgOCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gODsNCisgICAgRlhTWVNfbWVtY3B5KCZkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXRdLCBnaWZfcHRyLT5hcHBfYXV0aGVudGljYXRpb24sIDgpOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDM7DQorICAgIEZYU1lTX21lbWNweSgmZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0XSwgZ2lmX3B0ci0+YXBwX2RhdGEsDQorICAgICAgICAgICAgICAgICBnaWZfcHRyLT5hcHBfZGF0YV9zaXplKTsNCisgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSBnaWZfcHRyLT5hcHBfZGF0YV9zaXplOw0KKyAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSAwOw0KKyAgfQ0KICNlbmRpZg0KLSAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX1RSQUlMRVI7DQotICAgIHJldHVybiBUUlVFOw0KKyAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX1NJR19UUkFJTEVSOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgX2dpZl9lbmNvZGUoIGdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCB1aW50OF90KiYgZHN0X2J1ZiwgRlhfRFdPUkQmIGRzdF9sZW4gKQ0KLXsNCi0gICAgaWYgKCFfZ2lmX3dyaXRlX2hlYWRlcihnaWZfcHRyLCBkc3RfYnVmLCBkc3RfbGVuKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIGN1cl9vZmZzZXQgPSBnaWZfcHRyLT5jdXJfb2Zmc2V0Ow0KLSAgICBGWF9CT09MIHJlcyA9IFRSVUU7DQotICAgIGlmIChnaWZfcHRyLT5mcmFtZXMpIHsNCi0gICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQtLTsNCi0gICAgfQ0KLSAgICBpZiAoIV9naWZfd3JpdGVfZGF0YShnaWZfcHRyLCBkc3RfYnVmLCBkc3RfbGVuKSkgew0KLSAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCA9IGN1cl9vZmZzZXQ7DQotICAgICAgICByZXMgPSBGQUxTRTsNCi0gICAgfQ0KLSAgICBkc3RfbGVuID0gZ2lmX3B0ci0+Y3VyX29mZnNldDsNCi0gICAgZHN0X2J1Zltkc3RfbGVuIC0gMV0gPSBHSUZfU0lHX1RSQUlMRVI7DQotICAgIGlmIChyZXMpIHsNCi0gICAgICAgIGdpZl9wdHItPmZyYW1lcysrOw0KLSAgICB9DQotICAgIHJldHVybiByZXM7DQorRlhfQk9PTCBfZ2lmX2VuY29kZShnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9sZW4pIHsNCisgIGlmICghX2dpZl93cml0ZV9oZWFkZXIoZ2lmX3B0ciwgZHN0X2J1ZiwgZHN0X2xlbikpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfRFdPUkQgY3VyX29mZnNldCA9IGdpZl9wdHItPmN1cl9vZmZzZXQ7DQorICBGWF9CT09MIHJlcyA9IFRSVUU7DQorICBpZiAoZ2lmX3B0ci0+ZnJhbWVzKSB7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQtLTsNCisgIH0NCisgIGlmICghX2dpZl93cml0ZV9kYXRhKGdpZl9wdHIsIGRzdF9idWYsIGRzdF9sZW4pKSB7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgPSBjdXJfb2Zmc2V0Ow0KKyAgICByZXMgPSBGQUxTRTsNCisgIH0NCisgIGRzdF9sZW4gPSBnaWZfcHRyLT5jdXJfb2Zmc2V0Ow0KKyAgZHN0X2J1Zltkc3RfbGVuIC0gMV0gPSBHSUZfU0lHX1RSQUlMRVI7DQorICBpZiAocmVzKSB7DQorICAgIGdpZl9wdHItPmZyYW1lcysrOw0KKyAgfQ0KKyAgcmV0dXJuIHJlczsNCiB9DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5oIGIvY29yZS9zcmMvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5oCmluZGV4IDAzMWU0YTQuLjdlNDUzMzAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGdpZi9meF9naWYuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2xnaWYvZnhfZ2lmLmgKQEAgLTEwLDI3NyArMTAsMjkyIEBACiANCiBleHRlcm4gRlhfV09SRCBfR2V0V29yZF9MU0JGaXJzdCh1aW50OF90KiBwKTsNCiBleHRlcm4gdm9pZCBfU2V0V29yZF9MU0JGaXJzdCh1aW50OF90KiBwLCBGWF9XT1JEIHYpOw0KLWV4dGVybiB2b2lkIF9CcGNDb252ZXJ0KGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19sZW4sIGludDMyX3Qgc3JjX2JwYywgaW50MzJfdCBkc3RfYnBjLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbik7DQorZXh0ZXJuIHZvaWQgX0JwY0NvbnZlcnQoY29uc3QgdWludDhfdCogc3JjX2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfbGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX2JwYywNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9icGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9sZW4pOw0KICNkZWZpbmUgR0lGX1NVUFBPUlRfQ09NTUVOVF9FWFRFTlNJT04NCiAjZGVmaW5lIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCiAjZGVmaW5lIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQotI2RlZmluZSBHSUZfU0lHTkFUVVJFCQkiR0lGIg0KLSNkZWZpbmUgR0lGX1NJR19FWFRFTlNJT04JMHgyMQ0KLSNkZWZpbmUgR0lGX1NJR19JTUFHRQkJMHgyQw0KLSNkZWZpbmUgR0lGX1NJR19UUkFJTEVSCQkweDNCDQotI2RlZmluZSBHSUZfQkxPQ0tfR0NFCQkweEY5DQotI2RlZmluZSBHSUZfQkxPQ0tfUFRFCQkweDAxDQotI2RlZmluZSBHSUZfQkxPQ0tfQ0UJCTB4RkUNCi0jZGVmaW5lIEdJRl9CTE9DS19BRQkJMHhGRg0KLSNkZWZpbmUgR0lGX0JMT0NLX1RFUk1JTkFMCTB4MDANCi0jZGVmaW5lIEdJRl9NQVhfTFpXX0NPREUJNDA5Ng0KLSNkZWZpbmUgR0lGX0RBVEFfQkxPQ0sJCTI1NQ0KLSNkZWZpbmUgR0lGX01BWF9FUlJPUl9TSVpFCTI1Ng0KLSNkZWZpbmUgR0lGX0RfU1RBVFVTX1NJRwkJMHgwMQ0KLSNkZWZpbmUgR0lGX0RfU1RBVFVTX1RBSUwJCTB4MDINCi0jZGVmaW5lIEdJRl9EX1NUQVRVU19FWFQJCTB4MDMNCi0jZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfQUUJCTB4MDQNCi0jZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfQ0UJCTB4MDUNCi0jZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfR0NFCTB4MDYNCi0jZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfUFRFCTB4MDcNCi0jZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfVU5FCTB4MDgNCi0jZGVmaW5lIEdJRl9EX1NUQVRVU19JTUdfSU5GTwkweDA5DQotI2RlZmluZSBHSUZfRF9TVEFUVVNfSU1HX0RBVEEJMHgwQQ0KKyNkZWZpbmUgR0lGX1NJR05BVFVSRSAiR0lGIg0KKyNkZWZpbmUgR0lGX1NJR19FWFRFTlNJT04gMHgyMQ0KKyNkZWZpbmUgR0lGX1NJR19JTUFHRSAweDJDDQorI2RlZmluZSBHSUZfU0lHX1RSQUlMRVIgMHgzQg0KKyNkZWZpbmUgR0lGX0JMT0NLX0dDRSAweEY5DQorI2RlZmluZSBHSUZfQkxPQ0tfUFRFIDB4MDENCisjZGVmaW5lIEdJRl9CTE9DS19DRSAweEZFDQorI2RlZmluZSBHSUZfQkxPQ0tfQUUgMHhGRg0KKyNkZWZpbmUgR0lGX0JMT0NLX1RFUk1JTkFMIDB4MDANCisjZGVmaW5lIEdJRl9NQVhfTFpXX0NPREUgNDA5Ng0KKyNkZWZpbmUgR0lGX0RBVEFfQkxPQ0sgMjU1DQorI2RlZmluZSBHSUZfTUFYX0VSUk9SX1NJWkUgMjU2DQorI2RlZmluZSBHSUZfRF9TVEFUVVNfU0lHIDB4MDENCisjZGVmaW5lIEdJRl9EX1NUQVRVU19UQUlMIDB4MDINCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFQgMHgwMw0KKyNkZWZpbmUgR0lGX0RfU1RBVFVTX0VYVF9BRSAweDA0DQorI2RlZmluZSBHSUZfRF9TVEFUVVNfRVhUX0NFIDB4MDUNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfR0NFIDB4MDYNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfUFRFIDB4MDcNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfVU5FIDB4MDgNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19JTUdfSU5GTyAweDA5DQorI2RlZmluZSBHSUZfRF9TVEFUVVNfSU1HX0RBVEEgMHgwQQ0KICNwcmFnbWEgcGFjaygxKQ0KIHR5cGVkZWYgc3RydWN0IHRhZ0dpZkdGIHsNCi0gICAgdWludDhfdCBwYWxfYml0cyA6IDM7DQotICAgIHVpbnQ4X3Qgc29ydF9mbGFnIDogMTsNCi0gICAgdWludDhfdCBjb2xvcl9yZXNvbHV0aW9uIDogMzsNCi0gICAgdWludDhfdCBnbG9iYWxfcGFsIDogMTsNCisgIHVpbnQ4X3QgcGFsX2JpdHMgOiAzOw0KKyAgdWludDhfdCBzb3J0X2ZsYWcgOiAxOw0KKyAgdWludDhfdCBjb2xvcl9yZXNvbHV0aW9uIDogMzsNCisgIHVpbnQ4X3QgZ2xvYmFsX3BhbCA6IDE7DQogfSBHaWZHRjsNCiB0eXBlZGVmIHN0cnVjdCB0YWdHaWZMRiB7DQotICAgIHVpbnQ4X3QgcGFsX2JpdHMgOiAzOw0KLSAgICB1aW50OF90IHJlc2VydmVkIDogMjsNCi0gICAgdWludDhfdCBzb3J0X2ZsYWcgOiAxOw0KLSAgICB1aW50OF90IGludGVybGFjZSA6IDE7DQotICAgIHVpbnQ4X3QgbG9jYWxfcGFsIDogMTsNCisgIHVpbnQ4X3QgcGFsX2JpdHMgOiAzOw0KKyAgdWludDhfdCByZXNlcnZlZCA6IDI7DQorICB1aW50OF90IHNvcnRfZmxhZyA6IDE7DQorICB1aW50OF90IGludGVybGFjZSA6IDE7DQorICB1aW50OF90IGxvY2FsX3BhbCA6IDE7DQogfSBHaWZMRjsNCiB0eXBlZGVmIHN0cnVjdCB0YWdHaWZIZWFkZXIgew0KLSAgICBjaGFyIHNpZ25hdHVyZVszXTsNCi0gICAgY2hhciB2ZXJzaW9uWzNdOw0KKyAgY2hhciBzaWduYXR1cmVbM107DQorICBjaGFyIHZlcnNpb25bM107DQogfSBHaWZIZWFkZXI7DQogdHlwZWRlZiBzdHJ1Y3QgdGFnR2lmTFNEIHsNCi0gICAgRlhfV09SRAl3aWR0aDsNCi0gICAgRlhfV09SRCBoZWlnaHQ7DQotICAgIHVpbnQ4X3QJZ2xvYmFsX2ZsYWc7DQotICAgIHVpbnQ4X3QgYmNfaW5kZXg7DQotICAgIHVpbnQ4X3QJcGl4ZWxfYXNwZWN0Ow0KKyAgRlhfV09SRCB3aWR0aDsNCisgIEZYX1dPUkQgaGVpZ2h0Ow0KKyAgdWludDhfdCBnbG9iYWxfZmxhZzsNCisgIHVpbnQ4X3QgYmNfaW5kZXg7DQorICB1aW50OF90IHBpeGVsX2FzcGVjdDsNCiB9IEdpZkxTRDsNCiB0eXBlZGVmIHN0cnVjdCB0YWdHaWZJbWFnZUluZm8gew0KLSAgICBGWF9XT1JEIGxlZnQ7DQotICAgIEZYX1dPUkQgdG9wOw0KLSAgICBGWF9XT1JEIHdpZHRoOw0KLSAgICBGWF9XT1JEIGhlaWdodDsNCisgIEZYX1dPUkQgbGVmdDsNCisgIEZYX1dPUkQgdG9wOw0KKyAgRlhfV09SRCB3aWR0aDsNCisgIEZYX1dPUkQgaGVpZ2h0Ow0KIA0KLSAgICB1aW50OF90CWxvY2FsX2ZsYWc7DQorICB1aW50OF90IGxvY2FsX2ZsYWc7DQogfSBHaWZJbWFnZUluZm87DQogdHlwZWRlZiBzdHJ1Y3QgdGFnR2lmQ0VGIHsNCi0gICAgdWludDhfdCB0cmFuc3BhcmVuY3kgOiAxOw0KLSAgICB1aW50OF90IHVzZXJfaW5wdXQgOiAxOw0KLSAgICB1aW50OF90IGRpc3Bvc2FsX21ldGhvZCA6IDM7DQotICAgIHVpbnQ4X3QgcmVzZXJ2ZWQgOiAzOw0KKyAgdWludDhfdCB0cmFuc3BhcmVuY3kgOiAxOw0KKyAgdWludDhfdCB1c2VyX2lucHV0IDogMTsNCisgIHVpbnQ4X3QgZGlzcG9zYWxfbWV0aG9kIDogMzsNCisgIHVpbnQ4X3QgcmVzZXJ2ZWQgOiAzOw0KIH0gR2lmQ0VGOw0KIHR5cGVkZWYgc3RydWN0IHRhZ0dpZkdDRSB7DQotICAgIHVpbnQ4X3QgYmxvY2tfc2l6ZTsNCi0gICAgdWludDhfdAlnY2VfZmxhZzsNCi0gICAgRlhfV09SRCBkZWxheV90aW1lOw0KLSAgICB1aW50OF90CXRyYW5zX2luZGV4Ow0KKyAgdWludDhfdCBibG9ja19zaXplOw0KKyAgdWludDhfdCBnY2VfZmxhZzsNCisgIEZYX1dPUkQgZGVsYXlfdGltZTsNCisgIHVpbnQ4X3QgdHJhbnNfaW5kZXg7DQogfSBHaWZHQ0U7DQogdHlwZWRlZiBzdHJ1Y3QgdGFnR2lmUFRFIHsNCi0gICAgdWludDhfdCBibG9ja19zaXplOw0KLSAgICBGWF9XT1JECWdyaWRfbGVmdDsNCi0gICAgRlhfV09SRAlncmlkX3RvcDsNCi0gICAgRlhfV09SRCBncmlkX3dpZHRoOw0KLSAgICBGWF9XT1JECWdyaWRfaGVpZ2h0Ow0KKyAgdWludDhfdCBibG9ja19zaXplOw0KKyAgRlhfV09SRCBncmlkX2xlZnQ7DQorICBGWF9XT1JEIGdyaWRfdG9wOw0KKyAgRlhfV09SRCBncmlkX3dpZHRoOw0KKyAgRlhfV09SRCBncmlkX2hlaWdodDsNCiANCi0gICAgdWludDhfdCBjaGFyX3dpZHRoOw0KLSAgICB1aW50OF90IGNoYXJfaGVpZ2h0Ow0KKyAgdWludDhfdCBjaGFyX3dpZHRoOw0KKyAgdWludDhfdCBjaGFyX2hlaWdodDsNCiANCi0gICAgdWludDhfdCBmY19pbmRleDsNCi0gICAgdWludDhfdCBiY19pbmRleDsNCisgIHVpbnQ4X3QgZmNfaW5kZXg7DQorICB1aW50OF90IGJjX2luZGV4Ow0KIH0gR2lmUFRFOw0KIHR5cGVkZWYgc3RydWN0IHRhZ0dpZkFFIHsNCi0gICAgdWludDhfdCBibG9ja19zaXplOw0KLSAgICB1aW50OF90IGFwcF9pZGVudGlmeVs4XTsNCi0gICAgdWludDhfdAlhcHBfYXV0aGVudGljYXRpb25bM107DQorICB1aW50OF90IGJsb2NrX3NpemU7DQorICB1aW50OF90IGFwcF9pZGVudGlmeVs4XTsNCisgIHVpbnQ4X3QgYXBwX2F1dGhlbnRpY2F0aW9uWzNdOw0KIH0gR2lmQUU7DQotdHlwZWRlZiBzdHJ1Y3QgdGFnR2lmUGFsZXR0ZSB7DQotICAgIHVpbnQ4X3QgciwgZywgYjsNCi19IEdpZlBhbGV0dGU7DQordHlwZWRlZiBzdHJ1Y3QgdGFnR2lmUGFsZXR0ZSB7IHVpbnQ4X3QgciwgZywgYjsgfSBHaWZQYWxldHRlOw0KICNwcmFnbWEgcGFjaygpDQogdHlwZWRlZiBzdHJ1Y3QgdGFnR2lmSW1hZ2Ugew0KLSAgICBHaWZHQ0UqCQkJaW1hZ2VfZ2NlX3B0cjsNCi0gICAgR2lmUGFsZXR0ZSoJCWxvY2FsX3BhbF9wdHI7DQotICAgIEdpZkltYWdlSW5mbyoJaW1hZ2VfaW5mb19wdHI7DQotICAgIHVpbnQ4X3QJCQlpbWFnZV9jb2RlX3NpemU7DQotICAgIEZYX0RXT1JECQlpbWFnZV9kYXRhX3BvczsNCi0gICAgdWludDhfdCoJCWltYWdlX3Jvd19idWY7DQotICAgIGludDMyX3QJCWltYWdlX3Jvd19udW07DQorICBHaWZHQ0UqIGltYWdlX2djZV9wdHI7DQorICBHaWZQYWxldHRlKiBsb2NhbF9wYWxfcHRyOw0KKyAgR2lmSW1hZ2VJbmZvKiBpbWFnZV9pbmZvX3B0cjsNCisgIHVpbnQ4X3QgaW1hZ2VfY29kZV9zaXplOw0KKyAgRlhfRFdPUkQgaW1hZ2VfZGF0YV9wb3M7DQorICB1aW50OF90KiBpbWFnZV9yb3dfYnVmOw0KKyAgaW50MzJfdCBpbWFnZV9yb3dfbnVtOw0KIH0gR2lmSW1hZ2U7DQogdHlwZWRlZiBzdHJ1Y3QgdGFnR2lmUGxhaW5UZXh0IHsNCi0gICAgR2lmR0NFKgkJCWdjZV9wdHI7DQotICAgIEdpZlBURSoJCQlwdGVfcHRyOw0KLSAgICBDRlhfQnl0ZVN0cmluZyogc3RyaW5nX3B0cjsNCisgIEdpZkdDRSogZ2NlX3B0cjsNCisgIEdpZlBURSogcHRlX3B0cjsNCisgIENGWF9CeXRlU3RyaW5nKiBzdHJpbmdfcHRyOw0KIH0gR2lmUGxhaW5UZXh0Ow0KLWNsYXNzIENHaWZMWldEZWNvZGVyDQotew0KLXB1YmxpYzoNCi0gICAgc3RydWN0IHRhZ19UYWJsZSB7DQotICAgICAgICBGWF9XT1JEIHByZWZpeDsNCi0gICAgICAgIHVpbnQ4X3Qgc3VmZml4Ow0KLSAgICB9Ow0KLSAgICBDR2lmTFpXRGVjb2RlcihGWF9DSEFSKiBlcnJvcl9wdHIgPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICBlcnJfbXNnX3B0ciA9IGVycm9yX3B0cjsNCi0gICAgfQ0KLSAgICB2b2lkCQlJbml0VGFibGUodWludDhfdCBjb2RlX2xlbik7DQorY2xhc3MgQ0dpZkxaV0RlY29kZXIgew0KKyBwdWJsaWM6DQorICBzdHJ1Y3QgdGFnX1RhYmxlIHsNCisgICAgRlhfV09SRCBwcmVmaXg7DQorICAgIHVpbnQ4X3Qgc3VmZml4Ow0KKyAgfTsNCisgIENHaWZMWldEZWNvZGVyKEZYX0NIQVIqIGVycm9yX3B0ciA9IE5VTEwpIHsgZXJyX21zZ19wdHIgPSBlcnJvcl9wdHI7IH0NCisgIHZvaWQgSW5pdFRhYmxlKHVpbnQ4X3QgY29kZV9sZW4pOw0KIA0KLSAgICBpbnQzMl90CURlY29kZSh1aW50OF90KiBkZXNfYnVmLCBGWF9EV09SRCYgZGVzX3NpemUpOw0KKyAgaW50MzJfdCBEZWNvZGUodWludDhfdCogZGVzX2J1ZiwgRlhfRFdPUkQmIGRlc19zaXplKTsNCiANCi0gICAgdm9pZAkJSW5wdXQodWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpOw0KLSAgICBGWF9EV09SRAlHZXRBdmFpbElucHV0KCk7DQorICB2b2lkIElucHV0KHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKTsNCisgIEZYX0RXT1JEIEdldEF2YWlsSW5wdXQoKTsNCiANCi1wcml2YXRlOg0KLSAgICB2b2lkCQlDbGVhclRhYmxlKCk7DQotICAgIHZvaWQJCUFkZENvZGUoRlhfV09SRCBwcmVmaXhfY29kZSwgdWludDhfdCBhcHBlbmRfY2hhcik7DQotICAgIHZvaWQJCURlY29kZVN0cmluZyhGWF9XT1JEIGNvZGUpOw0KLSAgICB1aW50OF90CQljb2RlX3NpemU7DQotICAgIHVpbnQ4X3QJCWNvZGVfc2l6ZV9jdXI7DQotICAgIEZYX1dPUkQJCWNvZGVfY2xlYXI7DQotICAgIEZYX1dPUkQJCWNvZGVfZW5kOw0KLSAgICBGWF9XT1JECQljb2RlX25leHQ7DQotICAgIHVpbnQ4X3QJCWNvZGVfZmlyc3Q7DQotICAgIHVpbnQ4X3QJCXN0YWNrW0dJRl9NQVhfTFpXX0NPREVdOw0KLSAgICBGWF9XT1JECQlzdGFja19zaXplOw0KLSAgICB0YWdfVGFibGUJY29kZV90YWJsZVtHSUZfTUFYX0xaV19DT0RFXTsNCi0gICAgRlhfV09SRAkJY29kZV9vbGQ7DQorIHByaXZhdGU6DQorICB2b2lkIENsZWFyVGFibGUoKTsNCisgIHZvaWQgQWRkQ29kZShGWF9XT1JEIHByZWZpeF9jb2RlLCB1aW50OF90IGFwcGVuZF9jaGFyKTsNCisgIHZvaWQgRGVjb2RlU3RyaW5nKEZYX1dPUkQgY29kZSk7DQorICB1aW50OF90IGNvZGVfc2l6ZTsNCisgIHVpbnQ4X3QgY29kZV9zaXplX2N1cjsNCisgIEZYX1dPUkQgY29kZV9jbGVhcjsNCisgIEZYX1dPUkQgY29kZV9lbmQ7DQorICBGWF9XT1JEIGNvZGVfbmV4dDsNCisgIHVpbnQ4X3QgY29kZV9maXJzdDsNCisgIHVpbnQ4X3Qgc3RhY2tbR0lGX01BWF9MWldfQ09ERV07DQorICBGWF9XT1JEIHN0YWNrX3NpemU7DQorICB0YWdfVGFibGUgY29kZV90YWJsZVtHSUZfTUFYX0xaV19DT0RFXTsNCisgIEZYX1dPUkQgY29kZV9vbGQ7DQogDQotICAgIHVpbnQ4X3QqCW5leHRfaW47DQotICAgIEZYX0RXT1JECWF2YWlsX2luOw0KKyAgdWludDhfdCogbmV4dF9pbjsNCisgIEZYX0RXT1JEIGF2YWlsX2luOw0KIA0KLSAgICB1aW50OF90CQliaXRzX2xlZnQ7DQotICAgIEZYX0RXT1JECWNvZGVfc3RvcmU7DQorICB1aW50OF90IGJpdHNfbGVmdDsNCisgIEZYX0RXT1JEIGNvZGVfc3RvcmU7DQogDQotICAgIEZYX0NIQVIqCWVycl9tc2dfcHRyOw0KKyAgRlhfQ0hBUiogZXJyX21zZ19wdHI7DQogfTsNCi1jbGFzcyBDR2lmTFpXRW5jb2Rlcg0KLXsNCi1wdWJsaWM6DQotICAgIHN0cnVjdCB0YWdfVGFibGUgew0KLSAgICAgICAgRlhfV09SRAkJcHJlZml4Ow0KLSAgICAgICAgdWludDhfdAkJc3VmZml4Ow0KLSAgICB9Ow0KLSAgICBDR2lmTFpXRW5jb2RlcigpOw0KLSAgICB+Q0dpZkxaV0VuY29kZXIoKTsNCi0gICAgdm9pZAkJU3RhcnQodWludDhfdCBjb2RlX2xlbiwgY29uc3QgdWludDhfdCogc3JjX2J1ZiwgdWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBvZmZzZXQpOw0KLSAgICBGWF9CT09MCQlFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX2xlbiwgdWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuLCBGWF9EV09SRCYgb2Zmc2V0KTsNCi0gICAgdm9pZAkJRmluaXNoKHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiwgRlhfRFdPUkQmIG9mZnNldCk7DQotcHJpdmF0ZToNCi0gICAgdm9pZAkJQ2xlYXJUYWJsZSgpOw0KLSAgICBGWF9CT09MCQlMb29rVXBJblRhYmxlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgRlhfRFdPUkQmIG9mZnNldCwgdWludDhfdCYgYml0X29mZnNldCk7DQotICAgIHZvaWQJCUVuY29kZVN0cmluZyhGWF9EV09SRCBpbmRleCwgdWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuLCBGWF9EV09SRCYgb2Zmc2V0KTsNCi0gICAgdm9pZAkJV3JpdGVCbG9jayh1aW50OF90KiYgZHN0X2J1ZiwgRlhfRFdPUkQmIGRzdF9sZW4sIEZYX0RXT1JEJiBvZmZzZXQpOw0KLSAgICBqbXBfYnVmCQlqbXA7DQotICAgIEZYX0RXT1JECXNyY19vZmZzZXQ7DQotICAgIHVpbnQ4X3QJCXNyY19iaXRfb2Zmc2V0Ow0KLSAgICB1aW50OF90CQlzcmNfYml0X2N1dDsNCi0gICAgRlhfRFdPUkQJc3JjX2JpdF9udW07DQotICAgIHVpbnQ4X3QJCWNvZGVfc2l6ZTsNCi0gICAgRlhfV09SRAkJY29kZV9jbGVhcjsNCi0gICAgRlhfV09SRAkJY29kZV9lbmQ7DQotICAgIEZYX1dPUkQJCWluZGV4X251bTsNCi0gICAgdWludDhfdAkJYml0X29mZnNldDsNCi0gICAgdWludDhfdAkJaW5kZXhfYml0X2N1cjsNCi0gICAgdWludDhfdAkJaW5kZXhfYnVmW0dJRl9EQVRBX0JMT0NLXTsNCi0gICAgdWludDhfdAkJaW5kZXhfYnVmX2xlbjsNCi0gICAgdGFnX1RhYmxlCWNvZGVfdGFibGVbR0lGX01BWF9MWldfQ09ERV07DQotICAgIEZYX1dPUkQJCXRhYmxlX2N1cjsNCitjbGFzcyBDR2lmTFpXRW5jb2RlciB7DQorIHB1YmxpYzoNCisgIHN0cnVjdCB0YWdfVGFibGUgew0KKyAgICBGWF9XT1JEIHByZWZpeDsNCisgICAgdWludDhfdCBzdWZmaXg7DQorICB9Ow0KKyAgQ0dpZkxaV0VuY29kZXIoKTsNCisgIH5DR2lmTFpXRW5jb2RlcigpOw0KKyAgdm9pZCBTdGFydCh1aW50OF90IGNvZGVfbGVuLA0KKyAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLA0KKyAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgRlhfRFdPUkQmIG9mZnNldCk7DQorICBGWF9CT09MIEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLA0KKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX2xlbiwNCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9sZW4sDQorICAgICAgICAgICAgICAgICBGWF9EV09SRCYgb2Zmc2V0KTsNCisgIHZvaWQgRmluaXNoKHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiwgRlhfRFdPUkQmIG9mZnNldCk7DQorDQorIHByaXZhdGU6DQorICB2b2lkIENsZWFyVGFibGUoKTsNCisgIEZYX0JPT0wgTG9va1VwSW5UYWJsZShjb25zdCB1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBiaXRfb2Zmc2V0KTsNCisgIHZvaWQgRW5jb2RlU3RyaW5nKEZYX0RXT1JEIGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHN0X2xlbiwNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBvZmZzZXQpOw0KKyAgdm9pZCBXcml0ZUJsb2NrKHVpbnQ4X3QqJiBkc3RfYnVmLCBGWF9EV09SRCYgZHN0X2xlbiwgRlhfRFdPUkQmIG9mZnNldCk7DQorICBqbXBfYnVmIGptcDsNCisgIEZYX0RXT1JEIHNyY19vZmZzZXQ7DQorICB1aW50OF90IHNyY19iaXRfb2Zmc2V0Ow0KKyAgdWludDhfdCBzcmNfYml0X2N1dDsNCisgIEZYX0RXT1JEIHNyY19iaXRfbnVtOw0KKyAgdWludDhfdCBjb2RlX3NpemU7DQorICBGWF9XT1JEIGNvZGVfY2xlYXI7DQorICBGWF9XT1JEIGNvZGVfZW5kOw0KKyAgRlhfV09SRCBpbmRleF9udW07DQorICB1aW50OF90IGJpdF9vZmZzZXQ7DQorICB1aW50OF90IGluZGV4X2JpdF9jdXI7DQorICB1aW50OF90IGluZGV4X2J1ZltHSUZfREFUQV9CTE9DS107DQorICB1aW50OF90IGluZGV4X2J1Zl9sZW47DQorICB0YWdfVGFibGUgY29kZV90YWJsZVtHSUZfTUFYX0xaV19DT0RFXTsNCisgIEZYX1dPUkQgdGFibGVfY3VyOw0KIH07DQogdHlwZWRlZiBzdHJ1Y3QgdGFnX2dpZl9kZWNvbXByZXNzX3N0cnVjdCBnaWZfZGVjb21wcmVzc19zdHJ1Y3Q7DQotdHlwZWRlZiBnaWZfZGVjb21wcmVzc19zdHJ1Y3QgKmdpZl9kZWNvbXByZXNzX3N0cnVjdF9wOw0KLXR5cGVkZWYgZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgKmdpZl9kZWNvbXByZXNzX3N0cnVjdF9wcDsNCit0eXBlZGVmIGdpZl9kZWNvbXByZXNzX3N0cnVjdCogZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3A7DQordHlwZWRlZiBnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCogZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3BwOw0KIHN0YXRpYyBpbnQzMl90IHNfZ2lmX2ludGVybGFjZV9zdGVwWzRdID0gezgsIDgsIDQsIDJ9Ow0KIHN0cnVjdCB0YWdfZ2lmX2RlY29tcHJlc3Nfc3RydWN0IHsNCi0gICAgam1wX2J1ZgkJCWptcGJ1ZjsNCi0gICAgRlhfQ0hBUioJCWVycl9wdHI7DQotICAgIHZvaWQJCQkoKl9naWZfZXJyb3JfZm4pKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGNvbnN0IEZYX0NIQVIqIGVycl9tc2cpOw0KLSAgICB2b2lkKgkJCWNvbnRleHRfcHRyOw0KLSAgICBpbnQJCQkJd2lkdGg7DQotICAgIGludAkJCQloZWlnaHQ7DQotICAgIEdpZlBhbGV0dGUqCQlnbG9iYWxfcGFsX3B0cjsNCi0gICAgaW50MzJfdAkJZ2xvYmFsX3BhbF9udW07DQotICAgIHVpbnQ4X3QJCQlnbG9iYWxfc29ydF9mbGFnOw0KLSAgICB1aW50OF90CQkJZ2xvYmFsX2NvbG9yX3Jlc29sdXRpb247DQorICBqbXBfYnVmIGptcGJ1ZjsNCisgIEZYX0NIQVIqIGVycl9wdHI7DQorICB2b2lkICgqX2dpZl9lcnJvcl9mbikoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKTsNCisgIHZvaWQqIGNvbnRleHRfcHRyOw0KKyAgaW50IHdpZHRoOw0KKyAgaW50IGhlaWdodDsNCisgIEdpZlBhbGV0dGUqIGdsb2JhbF9wYWxfcHRyOw0KKyAgaW50MzJfdCBnbG9iYWxfcGFsX251bTsNCisgIHVpbnQ4X3QgZ2xvYmFsX3NvcnRfZmxhZzsNCisgIHVpbnQ4X3QgZ2xvYmFsX2NvbG9yX3Jlc29sdXRpb247DQogDQotICAgIHVpbnQ4X3QJCQliY19pbmRleDsNCi0gICAgdWludDhfdAkJCXBpeGVsX2FzcGVjdDsNCi0gICAgQ0dpZkxaV0RlY29kZXIqCWltZ19kZWNvZGVyX3B0cjsNCi0gICAgRlhfRFdPUkQJCWltZ19yb3dfb2Zmc2V0Ow0KLSAgICBGWF9EV09SRAkJaW1nX3Jvd19hdmFpbF9zaXplOw0KLSAgICB1aW50OF90CQkJaW1nX3Bhc3NfbnVtOw0KLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxHaWZJbWFnZSo+KiBpbWdfcHRyX2Fycl9wdHI7DQotICAgIHVpbnQ4X3QqCQkoKl9naWZfYXNrX2J1Zl9mb3JfcGFsX2ZuKShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBpbnQzMl90IHBhbF9zaXplKTsNCi0gICAgdWludDhfdCoJCW5leHRfaW47DQotICAgIEZYX0RXT1JECQlhdmFpbF9pbjsNCi0gICAgaW50MzJfdAkJZGVjb2RlX3N0YXR1czsNCi0gICAgRlhfRFdPUkQJCXNraXBfc2l6ZTsNCi0gICAgdm9pZAkJCSgqX2dpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbl9mbikoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfRFdPUkQqIGN1cl9wb3NfcHRyKTsNCi0gICAgdm9pZAkJCSgqX2dpZl9nZXRfcm93X2ZuKShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBpbnQzMl90IHJvd19udW0sIHVpbnQ4X3QqIHJvd19idWYpOw0KLSAgICBGWF9CT09MCQkJKCpfZ2lmX2dldF9yZWNvcmRfcG9zaXRpb25fZm4pKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0RXT1JEIGN1cl9wb3MsDQorICB1aW50OF90IGJjX2luZGV4Ow0KKyAgdWludDhfdCBwaXhlbF9hc3BlY3Q7DQorICBDR2lmTFpXRGVjb2RlciogaW1nX2RlY29kZXJfcHRyOw0KKyAgRlhfRFdPUkQgaW1nX3Jvd19vZmZzZXQ7DQorICBGWF9EV09SRCBpbWdfcm93X2F2YWlsX3NpemU7DQorICB1aW50OF90IGltZ19wYXNzX251bTsNCisgIENGWF9BcnJheVRlbXBsYXRlPEdpZkltYWdlKj4qIGltZ19wdHJfYXJyX3B0cjsNCisgIHVpbnQ4X3QqICgqX2dpZl9hc2tfYnVmX2Zvcl9wYWxfZm4pKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhbF9zaXplKTsNCisgIHVpbnQ4X3QqIG5leHRfaW47DQorICBGWF9EV09SRCBhdmFpbF9pbjsNCisgIGludDMyX3QgZGVjb2RlX3N0YXR1czsNCisgIEZYX0RXT1JEIHNraXBfc2l6ZTsNCisgIHZvaWQgKCpfZ2lmX3JlY29yZF9jdXJyZW50X3Bvc2l0aW9uX2ZuKShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBjdXJfcG9zX3B0cik7DQorICB2b2lkICgqX2dpZl9nZXRfcm93X2ZuKShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcm93X2J1Zik7DQorICBGWF9CT09MCQkJKCpfZ2lmX2dldF9yZWNvcmRfcG9zaXRpb25fZm4pKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIEZYX0RXT1JEIGN1cl9wb3MsDQogICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsDQogICAgICAgICAgICAgaW50MzJfdCBwYWxfbnVtLCB2b2lkKiBwYWxfcHRyLA0KICAgICAgICAgICAgIGludDMyX3QgZGVsYXlfdGltZSwgRlhfQk9PTCB1c2VyX2lucHV0LA0KICAgICAgICAgICAgIGludDMyX3QgdHJhbnNfaW5kZXgsIGludDMyX3QgZGlzcG9zYWxfbWV0aG9kLCBGWF9CT09MIGludGVybGFjZSk7DQogI2lmZGVmIEdJRl9TVVBQT1JUX0FQUExJQ0FUSU9OX0VYVEVOU0lPTg0KLSAgICB1aW50OF90CQkJYXBwX2lkZW50aWZ5WzhdOw0KLSAgICB1aW50OF90CQkJYXBwX2F1dGhlbnRpY2F0aW9uWzNdOw0KLSAgICBGWF9EV09SRAkJYXBwX2RhdGFfc2l6ZTsNCi0gICAgdWludDhfdCoJCWFwcF9kYXRhOw0KKyAgdWludDhfdCBhcHBfaWRlbnRpZnlbOF07DQorICB1aW50OF90IGFwcF9hdXRoZW50aWNhdGlvblszXTsNCisgIEZYX0RXT1JEIGFwcF9kYXRhX3NpemU7DQorICB1aW50OF90KiBhcHBfZGF0YTsNCiAjZW5kaWYNCiAjaWZkZWYgR0lGX1NVUFBPUlRfQ09NTUVOVF9FWFRFTlNJT04NCi0gICAgQ0ZYX0J5dGVTdHJpbmcqCWNtdF9kYXRhX3B0cjsNCisgIENGWF9CeXRlU3RyaW5nKiBjbXRfZGF0YV9wdHI7DQogI2VuZGlmDQogI2lmZGVmIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCi0gICAgR2lmR0NFKgkJCWdjZV9wdHI7DQorICBHaWZHQ0UqIGdjZV9wdHI7DQogI2VuZGlmDQogI2lmZGVmIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQotICAgIENGWF9BcnJheVRlbXBsYXRlPEdpZlBsYWluVGV4dCo+KiBwdF9wdHJfYXJyX3B0cjsNCisgIENGWF9BcnJheVRlbXBsYXRlPEdpZlBsYWluVGV4dCo+KiBwdF9wdHJfYXJyX3B0cjsNCiAjZW5kaWYNCiB9Ow0KIHR5cGVkZWYgc3RydWN0IHRhZ19naWZfY29tcHJlc3Nfc3RydWN0IGdpZl9jb21wcmVzc19zdHJ1Y3Q7DQotdHlwZWRlZiBnaWZfY29tcHJlc3Nfc3RydWN0ICpnaWZfY29tcHJlc3Nfc3RydWN0X3A7DQotdHlwZWRlZiBnaWZfY29tcHJlc3Nfc3RydWN0X3AgKmdpZl9jb21wcmVzc19zdHJ1Y3RfcHA7DQordHlwZWRlZiBnaWZfY29tcHJlc3Nfc3RydWN0KiBnaWZfY29tcHJlc3Nfc3RydWN0X3A7DQordHlwZWRlZiBnaWZfY29tcHJlc3Nfc3RydWN0X3AqIGdpZl9jb21wcmVzc19zdHJ1Y3RfcHA7DQogc3RydWN0IHRhZ19naWZfY29tcHJlc3Nfc3RydWN0IHsNCi0gICAgY29uc3QgdWludDhfdCoJCXNyY19idWY7DQotICAgIEZYX0RXT1JECQlzcmNfcGl0Y2g7DQotICAgIEZYX0RXT1JECQlzcmNfd2lkdGg7DQotICAgIEZYX0RXT1JECQlzcmNfcm93Ow0KLSAgICBGWF9EV09SRAkJY3VyX29mZnNldDsNCi0gICAgRlhfRFdPUkQJCWZyYW1lczsNCi0gICAgR2lmSGVhZGVyKgkJaGVhZGVyX3B0cjsNCi0gICAgR2lmTFNEKgkJCWxzZF9wdHI7DQotICAgIEdpZlBhbGV0dGUqCQlnbG9iYWxfcGFsOw0KLSAgICBGWF9XT1JECQkJZ3BhbF9udW07DQotICAgIEdpZlBhbGV0dGUqCQlsb2NhbF9wYWw7DQotICAgIEZYX1dPUkQJCQlscGFsX251bTsNCi0gICAgR2lmSW1hZ2VJbmZvKglpbWFnZV9pbmZvX3B0cjsNCi0gICAgQ0dpZkxaV0VuY29kZXIqIGltZ19lbmNvZGVyX3B0cjsNCisgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWY7DQorICBGWF9EV09SRCBzcmNfcGl0Y2g7DQorICBGWF9EV09SRCBzcmNfd2lkdGg7DQorICBGWF9EV09SRCBzcmNfcm93Ow0KKyAgRlhfRFdPUkQgY3VyX29mZnNldDsNCisgIEZYX0RXT1JEIGZyYW1lczsNCisgIEdpZkhlYWRlciogaGVhZGVyX3B0cjsNCisgIEdpZkxTRCogbHNkX3B0cjsNCisgIEdpZlBhbGV0dGUqIGdsb2JhbF9wYWw7DQorICBGWF9XT1JEIGdwYWxfbnVtOw0KKyAgR2lmUGFsZXR0ZSogbG9jYWxfcGFsOw0KKyAgRlhfV09SRCBscGFsX251bTsNCisgIEdpZkltYWdlSW5mbyogaW1hZ2VfaW5mb19wdHI7DQorICBDR2lmTFpXRW5jb2RlciogaW1nX2VuY29kZXJfcHRyOw0KICNpZmRlZiBHSUZfU1VQUE9SVF9BUFBMSUNBVElPTl9FWFRFTlNJT04NCi0gICAgdWludDhfdAkJCWFwcF9pZGVudGlmeVs4XTsNCi0gICAgdWludDhfdAkJCWFwcF9hdXRoZW50aWNhdGlvblszXTsNCi0gICAgRlhfRFdPUkQJCWFwcF9kYXRhX3NpemU7DQotICAgIHVpbnQ4X3QqCQlhcHBfZGF0YTsNCisgIHVpbnQ4X3QgYXBwX2lkZW50aWZ5WzhdOw0KKyAgdWludDhfdCBhcHBfYXV0aGVudGljYXRpb25bM107DQorICBGWF9EV09SRCBhcHBfZGF0YV9zaXplOw0KKyAgdWludDhfdCogYXBwX2RhdGE7DQogI2VuZGlmDQogDQogI2lmZGVmIEdJRl9TVVBQT1JUX0NPTU1FTlRfRVhURU5TSU9ODQotICAgIHVpbnQ4X3QqCQljbXRfZGF0YV9wdHI7DQotICAgIEZYX0RXT1JECQljbXRfZGF0YV9sZW47DQorICB1aW50OF90KiBjbXRfZGF0YV9wdHI7DQorICBGWF9EV09SRCBjbXRfZGF0YV9sZW47DQogI2VuZGlmDQogDQogI2lmZGVmIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCi0gICAgR2lmR0NFKgkJCWdjZV9wdHI7DQorICBHaWZHQ0UqIGdjZV9wdHI7DQogI2VuZGlmDQogDQogI2lmZGVmIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQotICAgIEdpZlBURSoJCQlwdGVfcHRyOw0KLSAgICBjb25zdCB1aW50OF90KgkJcHRlX2RhdGFfcHRyOw0KLSAgICBGWF9EV09SRAkJcHRlX2RhdGFfbGVuOw0KKyAgR2lmUFRFKiBwdGVfcHRyOw0KKyAgY29uc3QgdWludDhfdCogcHRlX2RhdGFfcHRyOw0KKyAgRlhfRFdPUkQgcHRlX2RhdGFfbGVuOw0KICNlbmRpZg0KIH07DQogdm9pZCBfZ2lmX2Vycm9yKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGNvbnN0IEZYX0NIQVIqIGVycl9tc2cpOw0KQEAgLTI5NCwxNSArMzA5LDI0IEBACiBpbnQzMl90IF9naWZfZ2V0X2ZyYW1lX251bShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKTsNCiBpbnQzMl90IF9naWZfZGVjb2RlX2V4dGVuc2lvbihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKTsNCiBpbnQzMl90IF9naWZfZGVjb2RlX2ltYWdlX2luZm8oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cik7DQotdm9pZCBfZ2lmX3Rha2VvdmVyX2djZV9wdHIoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgR2lmR0NFKiogZ2NlX3B0cl9wdHIpOw0KK3ZvaWQgX2dpZl90YWtlb3Zlcl9nY2VfcHRyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2lmR0NFKiogZ2NlX3B0cl9wdHIpOw0KIGludDMyX3QgX2dpZl9sb2FkX2ZyYW1lKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGludDMyX3QgZnJhbWVfbnVtKTsNCi11aW50OF90KiBfZ2lmX3JlYWRfZGF0YShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCB1aW50OF90KiogZGVzX2J1Zl9wcCwgRlhfRFdPUkQgZGF0YV9zaXplKTsNCit1aW50OF90KiBfZ2lmX3JlYWRfZGF0YShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBkZXNfYnVmX3BwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRhdGFfc2l6ZSk7DQogdm9pZCBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGludDMyX3Qgc3RhdHVzKTsNCi12b2lkIF9naWZfaW5wdXRfYnVmZmVyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKTsNCi1GWF9EV09SRCBfZ2lmX2dldF9hdmFpbF9pbnB1dChnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCB1aW50OF90KiogYXZpYWxfYnVmX3B0cik7DQordm9pZCBfZ2lmX2lucHV0X2J1ZmZlcihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKTsNCitGWF9EV09SRCBfZ2lmX2dldF9hdmFpbF9pbnB1dChnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmlhbF9idWZfcHRyKTsNCiB2b2lkIGludGVybGFjZV9idWYoY29uc3QgdWludDhfdCogYnVmLCBGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0KTsNCi1GWF9CT09MIF9naWZfZW5jb2RlKCBnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgdWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuICk7DQotI2RlZmluZSBHSUZfUFRSX05PVF9OVUxMKHB0cixnaWZfcHRyKQlpZihwdHIgPT0gTlVMTCl7CQkJCQkJXA0KLSAgICAgICAgX2dpZl9lcnJvcihnaWZfcHRyLCJPdXQgT2YgTWVtb3J5Iik7XA0KLSAgICAgICAgcmV0dXJuIDA7CQkJCQkJCVwNCi0gICAgfQ0KK0ZYX0JPT0wgX2dpZl9lbmNvZGUoZ2lmX2NvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3RfbGVuKTsNCisjZGVmaW5lIEdJRl9QVFJfTk9UX05VTEwocHRyLCBnaWZfcHRyKSAgICBcDQorICBpZiAocHRyID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBfZ2lmX2Vycm9yKGdpZl9wdHIsICJPdXQgT2YgTWVtb3J5Iik7IFwNCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmggYi9jb3JlL3NyYy9meGNydC9leHRlbnNpb24uaAppbmRleCAwOWE0ZjY3Li4zNjc4MTZlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9leHRlbnNpb24uaAorKysgYi9jb3JlL3NyYy9meGNydC9leHRlbnNpb24uaApAQCAtMTAsNDY1ICsxMCw0MzQgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCiAKLWNsYXNzIElGWENSVF9GaWxlQWNjZXNzCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYQ1JUX0ZpbGVBY2Nlc3MoKSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkCQlDbG9zZSgpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQlHZXRTaXplKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0UG9zaXRpb24oKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQlTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSA9IDA7Ci0gICAgdmlydHVhbCBzaXplX3QJCVJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUZsdXNoKCkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKSA9IDA7CitjbGFzcyBJRlhDUlRfRmlsZUFjY2VzcyB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhDUlRfRmlsZUFjY2VzcygpIHt9CisgIHZpcnR1YWwgRlhfQk9PTCBPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpID0gMDsKKyAgdmlydHVhbCB2b2lkIENsb3NlKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRTaXplKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIFNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykgPSAwOworICB2aXJ0dWFsIHNpemVfdCBSZWFkKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgPSAwOworICB2aXJ0dWFsIHNpemVfdCBXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpID0gMDsKKyAgdmlydHVhbCBzaXplX3QgUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcykgPSAwOworICB2aXJ0dWFsIHNpemVfdCBXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcykgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgRmx1c2goKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpID0gMDsKIH07Ci1JRlhDUlRfRmlsZUFjY2VzcyoJRlhDUlRfRmlsZUFjY2Vzc19DcmVhdGUoKTsKLWNsYXNzIENGWF9DUlRGaWxlQWNjZXNzIDogcHVibGljIElGWF9GaWxlQWNjZXNzCi17Ci1wdWJsaWM6Ci0JQ0ZYX0NSVEZpbGVBY2Nlc3MoKSA6IG1fUmVmQ291bnQoMCkge30KK0lGWENSVF9GaWxlQWNjZXNzKiBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpOworY2xhc3MgQ0ZYX0NSVEZpbGVBY2Nlc3MgOiBwdWJsaWMgSUZYX0ZpbGVBY2Nlc3MgeworIHB1YmxpYzoKKyAgQ0ZYX0NSVEZpbGVBY2Nlc3MoKSA6IG1fUmVmQ291bnQoMCkge30KIAotCXZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkKLQl7Ci0JCWlmICgtLW1fUmVmQ291bnQgPT0gMCkKLQkJCWRlbGV0ZSB0aGlzOwotCX0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7CisgICAgaWYgKC0tbV9SZWZDb3VudCA9PSAwKQorICAgICAgZGVsZXRlIHRoaXM7CisgIH0KIAotCUlGWF9GaWxlQWNjZXNzKgkJCQlSZXRhaW4oKQotCXsKLQkJbV9SZWZDb3VudCsrOwotCQlyZXR1cm4gKElGWF9GaWxlQWNjZXNzKil0aGlzOwotCX0KKyAgSUZYX0ZpbGVBY2Nlc3MqIFJldGFpbigpIHsKKyAgICBtX1JlZkNvdW50Kys7CisgICAgcmV0dXJuIChJRlhfRmlsZUFjY2VzcyopdGhpczsKKyAgfQogCi0JdmlydHVhbCBGWF9CT09MCQkJCUluaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhdGgpCi0JewotCQltX3BhdGggPSB3c1BhdGg7Ci0JCW1fUmVmQ291bnQgPSAxOwotCQlyZXR1cm4gVFJVRTsKLQl9CisgIHZpcnR1YWwgRlhfQk9PTCBJbml0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYXRoKSB7CisgICAgbV9wYXRoID0gd3NQYXRoOworICAgIG1fUmVmQ291bnQgPSAxOworICAgIHJldHVybiBUUlVFOworICB9CiAKLQl2aXJ0dWFsIHZvaWQJCQkJR2V0UGF0aChDRlhfV2lkZVN0cmluZyYgd3NQYXRoKQotCXsKLQkJd3NQYXRoID0gbV9wYXRoOwotCX0KKyAgdmlydHVhbCB2b2lkIEdldFBhdGgoQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0aCkgeyB3c1BhdGggPSBtX3BhdGg7IH0KIAotCXZpcnR1YWwgSUZYX0ZpbGVTdHJlYW0qCQlDcmVhdGVGaWxlU3RyZWFtKEZYX0RXT1JEIGR3TW9kZXMpCi0JewotCQlyZXR1cm4gRlhfQ3JlYXRlRmlsZVN0cmVhbShtX3BhdGgsIGR3TW9kZXMpOwotCX0KKyAgdmlydHVhbCBJRlhfRmlsZVN0cmVhbSogQ3JlYXRlRmlsZVN0cmVhbShGWF9EV09SRCBkd01vZGVzKSB7CisgICAgcmV0dXJuIEZYX0NyZWF0ZUZpbGVTdHJlYW0obV9wYXRoLCBkd01vZGVzKTsKKyAgfQogCi1wcm90ZWN0ZWQ6Ci0JQ0ZYX1dpZGVTdHJpbmcJCW1fcGF0aDsKLQlGWF9EV09SRAkJCW1fUmVmQ291bnQ7CisgcHJvdGVjdGVkOgorICBDRlhfV2lkZVN0cmluZyBtX3BhdGg7CisgIEZYX0RXT1JEIG1fUmVmQ291bnQ7CiB9OwotY2xhc3MgQ0ZYX0NSVEZpbGVTdHJlYW0gZmluYWwgOiBwdWJsaWMgSUZYX0ZpbGVTdHJlYW0KLXsKLXB1YmxpYzoKLSAgICBDRlhfQ1JURmlsZVN0cmVhbShJRlhDUlRfRmlsZUFjY2VzcyogcEZBKSA6IG1fcEZpbGUocEZBKSwgbV9kd0NvdW50KDEpLCBtX2JVc2VSYW5nZShGQUxTRSksIG1fbk9mZnNldCgwKSwgbV9uU2l6ZSgwKSB7fQotICAgIH5DRlhfQ1JURmlsZVN0cmVhbSgpCi0gICAgewotICAgICAgICBpZiAobV9wRmlsZSkgewotICAgICAgICAgICAgbV9wRmlsZS0+UmVsZWFzZSgpOwotICAgICAgICB9CitjbGFzcyBDRlhfQ1JURmlsZVN0cmVhbSBmaW5hbCA6IHB1YmxpYyBJRlhfRmlsZVN0cmVhbSB7CisgcHVibGljOgorICBDRlhfQ1JURmlsZVN0cmVhbShJRlhDUlRfRmlsZUFjY2VzcyogcEZBKQorICAgICAgOiBtX3BGaWxlKHBGQSksCisgICAgICAgIG1fZHdDb3VudCgxKSwKKyAgICAgICAgbV9iVXNlUmFuZ2UoRkFMU0UpLAorICAgICAgICBtX25PZmZzZXQoMCksCisgICAgICAgIG1fblNpemUoMCkge30KKyAgfkNGWF9DUlRGaWxlU3RyZWFtKCkgeworICAgIGlmIChtX3BGaWxlKSB7CisgICAgICBtX3BGaWxlLT5SZWxlYXNlKCk7CiAgICAgfQotICAgIHZpcnR1YWwgSUZYX0ZpbGVTdHJlYW0qCQlSZXRhaW4oKSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgbV9kd0NvdW50ICsrOwotICAgICAgICByZXR1cm4gdGhpczsKKyAgfQorICB2aXJ0dWFsIElGWF9GaWxlU3RyZWFtKiBSZXRhaW4oKSBvdmVycmlkZSB7CisgICAgbV9kd0NvdW50Kys7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZSB7CisgICAgRlhfRFdPUkQgbkNvdW50ID0gLS1tX2R3Q291bnQ7CisgICAgaWYgKCFuQ291bnQpIHsKKyAgICAgIGRlbGV0ZSB0aGlzOwogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpIG92ZXJyaWRlCi0gICAgewotICAgICAgICBGWF9EV09SRCBuQ291bnQgPSAtLSBtX2R3Q291bnQ7Ci0gICAgICAgIGlmICghbkNvdW50KSB7Ci0gICAgICAgICAgICBkZWxldGUgdGhpczsKLSAgICAgICAgfQorICB9CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbV9iVXNlUmFuZ2UgPyBtX25TaXplIDogbV9wRmlsZS0+R2V0U2l6ZSgpOworICB9CisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRigpIG92ZXJyaWRlIHsgcmV0dXJuIEdldFBvc2l0aW9uKCkgPj0gR2V0U2l6ZSgpOyB9CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBvdmVycmlkZSB7CisgICAgRlhfRklMRVNJWkUgcG9zID0gbV9wRmlsZS0+R2V0UG9zaXRpb24oKTsKKyAgICBpZiAobV9iVXNlUmFuZ2UpIHsKKyAgICAgIHBvcyAtPSBtX25PZmZzZXQ7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCQlHZXRTaXplKCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JVc2VSYW5nZSA/IG1fblNpemUgOiBtX3BGaWxlLT5HZXRTaXplKCk7CisgICAgcmV0dXJuIHBvczsKKyAgfQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKSBvdmVycmlkZSB7CisgICAgaWYgKG9mZnNldCA8IDAgfHwgc2l6ZSA8IDApIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCUlzRU9GKCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRQb3NpdGlvbigpID49IEdldFNpemUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJCUdldFBvc2l0aW9uKCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fcEZpbGUtPkdldFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChtX2JVc2VSYW5nZSkgewotICAgICAgICAgICAgcG9zIC09IG1fbk9mZnNldDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9zOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgc2l6ZSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQogCi0gICAgICAgIEZYX1NBRkVfRklMRVNJWkUgcG9zID0gc2l6ZTsKLSAgICAgICAgcG9zICs9IG9mZnNldDsKKyAgICBGWF9TQUZFX0ZJTEVTSVpFIHBvcyA9IHNpemU7CisgICAgcG9zICs9IG9mZnNldDsKIAotICAgICAgICBpZiAoIXBvcy5Jc1ZhbGlkKCkgfHwgcG9zLlZhbHVlT3JEaWUoKSA+IG1fcEZpbGUtPkdldFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CisgICAgaWYgKCFwb3MuSXNWYWxpZCgpIHx8IHBvcy5WYWx1ZU9yRGllKCkgPiBtX3BGaWxlLT5HZXRTaXplKCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAKLSAgICAgICAgbV9uT2Zmc2V0ID0gb2Zmc2V0LCBtX25TaXplID0gc2l6ZTsKLSAgICAgICAgbV9iVXNlUmFuZ2UgPSBUUlVFOwotICAgICAgICBtX3BGaWxlLT5TZXRQb3NpdGlvbihtX25PZmZzZXQpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBtX25PZmZzZXQgPSBvZmZzZXQsIG1fblNpemUgPSBzaXplOworICAgIG1fYlVzZVJhbmdlID0gVFJVRTsKKyAgICBtX3BGaWxlLT5TZXRQb3NpdGlvbihtX25PZmZzZXQpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHZpcnR1YWwgdm9pZCBDbGVhclJhbmdlKCkgb3ZlcnJpZGUgeyBtX2JVc2VSYW5nZSA9IEZBTFNFOyB9CisgIHZpcnR1YWwgRlhfQk9PTCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgIGlmIChtX2JVc2VSYW5nZSAmJiBvZmZzZXQgPCAwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZAkJCQlDbGVhclJhbmdlKCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIG1fYlVzZVJhbmdlID0gRkFMU0U7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgaWYgKG1fYlVzZVJhbmdlICYmIG9mZnNldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWF9TQUZFX0ZJTEVTSVpFIHBvcyA9IG9mZnNldDsKKyAgICBGWF9TQUZFX0ZJTEVTSVpFIHBvcyA9IG9mZnNldDsKIAotICAgICAgICBpZiAobV9iVXNlUmFuZ2UpIHsKLSAgICAgICAgICAgIHBvcyArPSBtX25PZmZzZXQ7Ci0gICAgICAgICAgICBpZiAoIXBvcy5Jc1ZhbGlkKCkgfHwgcG9zLlZhbHVlT3JEaWUoKSA+IChzaXplX3QpR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRlhfQk9PTCltX3BGaWxlLT5SZWFkUG9zKGJ1ZmZlciwgc2l6ZSwgcG9zLlZhbHVlT3JEaWUoKSk7CisgICAgaWYgKG1fYlVzZVJhbmdlKSB7CisgICAgICBwb3MgKz0gbV9uT2Zmc2V0OworICAgICAgaWYgKCFwb3MuSXNWYWxpZCgpIHx8IHBvcy5WYWx1ZU9yRGllKCkgPiAoc2l6ZV90KUdldFNpemUoKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CiAgICAgfQotICAgIHZpcnR1YWwgc2l6ZV90CQkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSBhdmFpbFNpemUgPSBtX25PZmZzZXQgKyBtX25TaXplIC0gbV9wRmlsZS0+R2V0UG9zaXRpb24oKTsKLSAgICAgICAgICAgIGlmICgoc2l6ZV90KWF2YWlsU2l6ZSA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBzaXplIC09IHNpemUgLSAoc2l6ZV90KWF2YWlsU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wRmlsZS0+UmVhZChidWZmZXIsIHNpemUpOworICAgIHJldHVybiAoRlhfQk9PTCltX3BGaWxlLT5SZWFkUG9zKGJ1ZmZlciwgc2l6ZSwgcG9zLlZhbHVlT3JEaWUoKSk7CisgIH0KKyAgdmlydHVhbCBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9iVXNlUmFuZ2UpIHsKKyAgICAgIEZYX0ZJTEVTSVpFIGF2YWlsU2l6ZSA9IG1fbk9mZnNldCArIG1fblNpemUgLSBtX3BGaWxlLT5HZXRQb3NpdGlvbigpOworICAgICAgaWYgKChzaXplX3QpYXZhaWxTaXplIDwgc2l6ZSkgeworICAgICAgICBzaXplIC09IHNpemUgLSAoc2l6ZV90KWF2YWlsU2l6ZTsKKyAgICAgIH0KICAgICB9Ci0gICAgdmlydHVhbAlGWF9CT09MCQkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gbV9uT2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRlhfQk9PTCltX3BGaWxlLT5Xcml0ZVBvcyhidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcmV0dXJuIG1fcEZpbGUtPlJlYWQoYnVmZmVyLCBzaXplKTsKKyAgfQorICB2aXJ0dWFsIEZYX0JPT0wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9iVXNlUmFuZ2UpIHsKKyAgICAgIG9mZnNldCArPSBtX25PZmZzZXQ7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGbHVzaCgpICBvdmVycmlkZQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEZpbGUtPkZsdXNoKCk7Ci0gICAgfQotICAgIElGWENSVF9GaWxlQWNjZXNzKgltX3BGaWxlOwotICAgIEZYX0RXT1JECQkJbV9kd0NvdW50OwotICAgIEZYX0JPT0wJCQkJbV9iVXNlUmFuZ2U7Ci0gICAgRlhfRklMRVNJWkUJCQltX25PZmZzZXQ7Ci0gICAgRlhfRklMRVNJWkUJCQltX25TaXplOworICAgIHJldHVybiAoRlhfQk9PTCltX3BGaWxlLT5Xcml0ZVBvcyhidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKyAgdmlydHVhbCBGWF9CT09MIEZsdXNoKCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9wRmlsZS0+Rmx1c2goKTsgfQorICBJRlhDUlRfRmlsZUFjY2VzcyogbV9wRmlsZTsKKyAgRlhfRFdPUkQgbV9kd0NvdW50OworICBGWF9CT09MIG1fYlVzZVJhbmdlOworICBGWF9GSUxFU0laRSBtX25PZmZzZXQ7CisgIEZYX0ZJTEVTSVpFIG1fblNpemU7CiB9OwotI2RlZmluZSBGWF9NRU1TVFJFQU1fQmxvY2tTaXplCQkoNjQgKiAxMDI0KQotI2RlZmluZSBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUJMHgwMQotI2RlZmluZSBGWF9NRU1TVFJFQU1fVGFrZU92ZXIJCTB4MDIKLWNsYXNzIENGWF9NZW1vcnlTdHJlYW0gZmluYWwgOiBwdWJsaWMgSUZYX01lbW9yeVN0cmVhbQotewotcHVibGljOgotICAgIENGWF9NZW1vcnlTdHJlYW0oRlhfQk9PTCBiQ29uc2VjdXRpdmUpCi0gICAgICAgIDogbV9kd0NvdW50KDEpCi0gICAgICAgICwgbV9uVG90YWxTaXplKDApCi0gICAgICAgICwgbV9uQ3VyU2l6ZSgwKQotICAgICAgICAsIG1fbkN1clBvcygwKQotICAgICAgICAsIG1fbkdyb3dTaXplKEZYX01FTVNUUkVBTV9CbG9ja1NpemUpCi0gICAgICAgICwgbV9iVXNlUmFuZ2UoRkFMU0UpCi0gICAgewotICAgICAgICBtX2R3RmxhZ3MgPSBGWF9NRU1TVFJFQU1fVGFrZU92ZXIgfCAoYkNvbnNlY3V0aXZlID8gRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlIDogMCk7CisjZGVmaW5lIEZYX01FTVNUUkVBTV9CbG9ja1NpemUgKDY0ICogMTAyNCkKKyNkZWZpbmUgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlIDB4MDEKKyNkZWZpbmUgRlhfTUVNU1RSRUFNX1Rha2VPdmVyIDB4MDIKK2NsYXNzIENGWF9NZW1vcnlTdHJlYW0gZmluYWwgOiBwdWJsaWMgSUZYX01lbW9yeVN0cmVhbSB7CisgcHVibGljOgorICBDRlhfTWVtb3J5U3RyZWFtKEZYX0JPT0wgYkNvbnNlY3V0aXZlKQorICAgICAgOiBtX2R3Q291bnQoMSksCisgICAgICAgIG1fblRvdGFsU2l6ZSgwKSwKKyAgICAgICAgbV9uQ3VyU2l6ZSgwKSwKKyAgICAgICAgbV9uQ3VyUG9zKDApLAorICAgICAgICBtX25Hcm93U2l6ZShGWF9NRU1TVFJFQU1fQmxvY2tTaXplKSwKKyAgICAgICAgbV9iVXNlUmFuZ2UoRkFMU0UpIHsKKyAgICBtX2R3RmxhZ3MgPQorICAgICAgICBGWF9NRU1TVFJFQU1fVGFrZU92ZXIgfCAoYkNvbnNlY3V0aXZlID8gRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlIDogMCk7CisgIH0KKyAgQ0ZYX01lbW9yeVN0cmVhbSh1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgblNpemUsIEZYX0JPT0wgYlRha2VPdmVyKQorICAgICAgOiBtX2R3Q291bnQoMSksCisgICAgICAgIG1fblRvdGFsU2l6ZShuU2l6ZSksCisgICAgICAgIG1fbkN1clNpemUoblNpemUpLAorICAgICAgICBtX25DdXJQb3MoMCksCisgICAgICAgIG1fbkdyb3dTaXplKEZYX01FTVNUUkVBTV9CbG9ja1NpemUpLAorICAgICAgICBtX2JVc2VSYW5nZShGQUxTRSkgeworICAgIG1fQmxvY2tzLkFkZChwQnVmZmVyKTsKKyAgICBtX2R3RmxhZ3MgPQorICAgICAgICBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUgfCAoYlRha2VPdmVyID8gRlhfTUVNU1RSRUFNX1Rha2VPdmVyIDogMCk7CisgIH0KKyAgfkNGWF9NZW1vcnlTdHJlYW0oKSB7CisgICAgaWYgKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9UYWtlT3ZlcikgeworICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9CbG9ja3MuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRlhfRnJlZSgodWludDhfdCopbV9CbG9ja3NbaV0pOworICAgICAgfQogICAgIH0KLSAgICBDRlhfTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgRlhfQk9PTCBiVGFrZU92ZXIpCi0gICAgICAgIDogbV9kd0NvdW50KDEpCi0gICAgICAgICwgbV9uVG90YWxTaXplKG5TaXplKQotICAgICAgICAsIG1fbkN1clNpemUoblNpemUpCi0gICAgICAgICwgbV9uQ3VyUG9zKDApCi0gICAgICAgICwgbV9uR3Jvd1NpemUoRlhfTUVNU1RSRUFNX0Jsb2NrU2l6ZSkKLSAgICAgICAgLCBtX2JVc2VSYW5nZShGQUxTRSkKLSAgICB7Ci0gICAgICAgIG1fQmxvY2tzLkFkZChwQnVmZmVyKTsKLSAgICAgICAgbV9kd0ZsYWdzID0gRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlIHwgKGJUYWtlT3ZlciA/IEZYX01FTVNUUkVBTV9UYWtlT3ZlciA6IDApOworICAgIG1fQmxvY2tzLlJlbW92ZUFsbCgpOworICB9CisgIHZpcnR1YWwgSUZYX0ZpbGVTdHJlYW0qIFJldGFpbigpIG92ZXJyaWRlIHsKKyAgICBtX2R3Q291bnQrKzsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlIHsKKyAgICBGWF9EV09SRCBuQ291bnQgPSAtLW1fZHdDb3VudDsKKyAgICBpZiAobkNvdW50KSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIH5DRlhfTWVtb3J5U3RyZWFtKCkKLSAgICB7Ci0gICAgICAgIGlmIChtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fVGFrZU92ZXIpIHsKLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fQmxvY2tzLkdldFNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfRnJlZSgodWludDhfdCopbV9CbG9ja3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fQmxvY2tzLlJlbW92ZUFsbCgpOworICAgIGRlbGV0ZSB0aGlzOworICB9CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbV9iVXNlUmFuZ2UgPyAoRlhfRklMRVNJWkUpbV9uU2l6ZSA6IChGWF9GSUxFU0laRSltX25DdXJTaXplOworICB9CisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRigpIG92ZXJyaWRlIHsgcmV0dXJuIG1fbkN1clBvcyA+PSAoc2l6ZV90KUdldFNpemUoKTsgfQorICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgb3ZlcnJpZGUgeworICAgIEZYX0ZJTEVTSVpFIHBvcyA9IChGWF9GSUxFU0laRSltX25DdXJQb3M7CisgICAgaWYgKG1fYlVzZVJhbmdlKSB7CisgICAgICBwb3MgLT0gKEZYX0ZJTEVTSVpFKW1fbk9mZnNldDsKICAgICB9Ci0gICAgdmlydHVhbCBJRlhfRmlsZVN0cmVhbSoJCVJldGFpbigpICBvdmVycmlkZQotICAgIHsKLSAgICAgICAgbV9kd0NvdW50ICsrOwotICAgICAgICByZXR1cm4gdGhpczsKKyAgICByZXR1cm4gcG9zOworICB9CisgIHZpcnR1YWwgRlhfQk9PTCBTZXRSYW5nZShGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0ZJTEVTSVpFIHNpemUpIG92ZXJyaWRlIHsKKyAgICBpZiAob2Zmc2V0IDwgMCB8fCBzaXplIDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpICBvdmVycmlkZQotICAgIHsKLSAgICAgICAgRlhfRFdPUkQgbkNvdW50ID0gLS0gbV9kd0NvdW50OwotICAgICAgICBpZiAobkNvdW50KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgRlhfU0FGRV9GSUxFU0laRSByYW5nZSA9IHNpemU7CisgICAgcmFuZ2UgKz0gb2Zmc2V0OworICAgIGlmICghcmFuZ2UuSXNWYWxpZCgpIHx8IHJhbmdlLlZhbHVlT3JEaWUoKSA+IG1fbkN1clNpemUpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJCUdldFNpemUoKSAgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JVc2VSYW5nZSA/IChGWF9GSUxFU0laRSkgbV9uU2l6ZSA6IChGWF9GSUxFU0laRSltX25DdXJTaXplOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSXNFT0YoKSAgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25DdXJQb3MgPj0gKHNpemVfdClHZXRTaXplKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCQlHZXRQb3NpdGlvbigpICBvdmVycmlkZQotICAgIHsKLSAgICAgICAgRlhfRklMRVNJWkUgcG9zID0gKEZYX0ZJTEVTSVpFKW1fbkN1clBvczsKLSAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7Ci0gICAgICAgICAgICBwb3MgLT0gKEZYX0ZJTEVTSVpFKW1fbk9mZnNldDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9zOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0UmFuZ2UoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9GSUxFU0laRSBzaXplKSAgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IHNpemUgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfU0FGRV9GSUxFU0laRSByYW5nZSA9IHNpemU7Ci0gICAgICAgIHJhbmdlICs9IG9mZnNldDsKLSAgICAgICAgaWYgKCFyYW5nZS5Jc1ZhbGlkKCkgfHwgcmFuZ2UuVmFsdWVPckRpZSgpID4gbV9uQ3VyU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CiAKLSAgICAgICAgbV9uT2Zmc2V0ID0gKHNpemVfdClvZmZzZXQsIG1fblNpemUgPSAoc2l6ZV90KXNpemU7Ci0gICAgICAgIG1fYlVzZVJhbmdlID0gVFJVRTsKLSAgICAgICAgbV9uQ3VyUG9zID0gbV9uT2Zmc2V0OwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBtX25PZmZzZXQgPSAoc2l6ZV90KW9mZnNldCwgbV9uU2l6ZSA9IChzaXplX3Qpc2l6ZTsKKyAgICBtX2JVc2VSYW5nZSA9IFRSVUU7CisgICAgbV9uQ3VyUG9zID0gbV9uT2Zmc2V0OworICAgIHJldHVybiBUUlVFOworICB9CisgIHZpcnR1YWwgdm9pZCBDbGVhclJhbmdlKCkgb3ZlcnJpZGUgeyBtX2JVc2VSYW5nZSA9IEZBTFNFOyB9CisgIHZpcnR1YWwgRlhfQk9PTCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgIGlmICghYnVmZmVyIHx8ICFzaXplKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZAkJCQlDbGVhclJhbmdlKCkgIG92ZXJyaWRlCi0gICAgewotICAgICAgICBtX2JVc2VSYW5nZSA9IEZBTFNFOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgIG92ZXJyaWRlCi0gICAgewotICAgICAgICBpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CiAKLSAgICAgICAgRlhfU0FGRV9GSUxFU0laRSBzYWZlT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBpZiAobV9iVXNlUmFuZ2UpIHsKLSAgICAgICAgICAgIHNhZmVPZmZzZXQgKz0gbV9uT2Zmc2V0OwotICAgICAgICB9CisgICAgRlhfU0FGRV9GSUxFU0laRSBzYWZlT2Zmc2V0ID0gb2Zmc2V0OworICAgIGlmIChtX2JVc2VSYW5nZSkgeworICAgICAgc2FmZU9mZnNldCArPSBtX25PZmZzZXQ7CisgICAgfQogCi0gICAgICAgIGlmICghc2FmZU9mZnNldC5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQorICAgIGlmICghc2FmZU9mZnNldC5Jc1ZhbGlkKCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAKLSAgICAgICAgb2Zmc2V0ID0gc2FmZU9mZnNldC5WYWx1ZU9yRGllKCk7CisgICAgb2Zmc2V0ID0gc2FmZU9mZnNldC5WYWx1ZU9yRGllKCk7CiAKLSAgICAgICAgRlhfU0FGRV9TSVpFX1QgbmV3UG9zID0gc2l6ZTsKLSAgICAgICAgbmV3UG9zICs9IG9mZnNldDsKLSAgICAgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpIHx8IG5ld1Bvcy5WYWx1ZU9yRGVmYXVsdCgwKSA9PSAwIHx8IG5ld1Bvcy5WYWx1ZU9yRGllKCkgPiBtX25DdXJTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KKyAgICBGWF9TQUZFX1NJWkVfVCBuZXdQb3MgPSBzaXplOworICAgIG5ld1BvcyArPSBvZmZzZXQ7CisgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpIHx8IG5ld1Bvcy5WYWx1ZU9yRGVmYXVsdCgwKSA9PSAwIHx8CisgICAgICAgIG5ld1Bvcy5WYWx1ZU9yRGllKCkgPiBtX25DdXJTaXplKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogCi0gICAgICAgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7Ci0gICAgICAgIGlmIChtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShidWZmZXIsICh1aW50OF90KiltX0Jsb2Nrc1swXSArIChzaXplX3Qpb2Zmc2V0LCBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBuU3RhcnRCbG9jayA9IChzaXplX3Qpb2Zmc2V0IC8gbV9uR3Jvd1NpemU7Ci0gICAgICAgIG9mZnNldCAtPSAoRlhfRklMRVNJWkUpKG5TdGFydEJsb2NrICogbV9uR3Jvd1NpemUpOwotICAgICAgICB3aGlsZSAoc2l6ZSkgewotICAgICAgICAgICAgc2l6ZV90IG5SZWFkID0gbV9uR3Jvd1NpemUgLSAoc2l6ZV90KW9mZnNldDsKLSAgICAgICAgICAgIGlmIChuUmVhZCA+IHNpemUpIHsKLSAgICAgICAgICAgICAgICBuUmVhZCA9IHNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCAodWludDhfdCopbV9CbG9ja3NbKGludCluU3RhcnRCbG9ja10gKyAoc2l6ZV90KW9mZnNldCwgblJlYWQpOwotICAgICAgICAgICAgYnVmZmVyID0gKCh1aW50OF90KilidWZmZXIpICsgblJlYWQ7Ci0gICAgICAgICAgICBzaXplIC09IG5SZWFkOwotICAgICAgICAgICAgblN0YXJ0QmxvY2sgKys7Ci0gICAgICAgICAgICBvZmZzZXQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7CisgICAgaWYgKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSkgeworICAgICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgKHVpbnQ4X3QqKW1fQmxvY2tzWzBdICsgKHNpemVfdClvZmZzZXQsIHNpemUpOworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHZpcnR1YWwgc2l6ZV90CQkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSAgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIGlmIChtX25DdXJQb3MgPj0gbV9uQ3VyU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7Ci0gICAgICAgICAgICBzaXplX3QgYXZhaWxTaXplID0gbV9uT2Zmc2V0ICsgbV9uU2l6ZSAtIG1fbkN1clBvczsKLSAgICAgICAgICAgIGlmIChhdmFpbFNpemUgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSAtPSBzaXplIC0gKHNpemVfdClhdmFpbFNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZV90IG5SZWFkID0gRlhfTUlOKHNpemUsIG1fbkN1clNpemUgLSBtX25DdXJQb3MpOwotICAgICAgICBpZiAoIVJlYWRCbG9jayhidWZmZXIsIChpbnQzMl90KW1fbkN1clBvcywgblJlYWQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gblJlYWQ7CisgICAgc2l6ZV90IG5TdGFydEJsb2NrID0gKHNpemVfdClvZmZzZXQgLyBtX25Hcm93U2l6ZTsKKyAgICBvZmZzZXQgLT0gKEZYX0ZJTEVTSVpFKShuU3RhcnRCbG9jayAqIG1fbkdyb3dTaXplKTsKKyAgICB3aGlsZSAoc2l6ZSkgeworICAgICAgc2l6ZV90IG5SZWFkID0gbV9uR3Jvd1NpemUgLSAoc2l6ZV90KW9mZnNldDsKKyAgICAgIGlmIChuUmVhZCA+IHNpemUpIHsKKyAgICAgICAgblJlYWQgPSBzaXplOworICAgICAgfQorICAgICAgRlhTWVNfbWVtY3B5KAorICAgICAgICAgIGJ1ZmZlciwgKHVpbnQ4X3QqKW1fQmxvY2tzWyhpbnQpblN0YXJ0QmxvY2tdICsgKHNpemVfdClvZmZzZXQsIG5SZWFkKTsKKyAgICAgIGJ1ZmZlciA9ICgodWludDhfdCopYnVmZmVyKSArIG5SZWFkOworICAgICAgc2l6ZSAtPSBuUmVhZDsKKyAgICAgIG5TdGFydEJsb2NrKys7CisgICAgICBvZmZzZXQgPSAwOwogICAgIH0KLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpICBvdmVycmlkZQotICAgIHsKLSAgICAgICAgaWYgKCFidWZmZXIgfHwgIXNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9iVXNlUmFuZ2UpIHsKLSAgICAgICAgICAgIG9mZnNldCArPSAoRlhfRklMRVNJWkUpbV9uT2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUpIHsKLSAgICAgICAgICAgIEZYX1NBRkVfU0laRV9UIG5ld1BvcyA9IHNpemU7Ci0gICAgICAgICAgICBuZXdQb3MgKz0gb2Zmc2V0OwotICAgICAgICAgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICB2aXJ0dWFsIHNpemVfdCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgIGlmIChtX25DdXJQb3MgPj0gbV9uQ3VyU2l6ZSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChtX2JVc2VSYW5nZSkgeworICAgICAgc2l6ZV90IGF2YWlsU2l6ZSA9IG1fbk9mZnNldCArIG1fblNpemUgLSBtX25DdXJQb3M7CisgICAgICBpZiAoYXZhaWxTaXplIDwgc2l6ZSkgeworICAgICAgICBzaXplIC09IHNpemUgLSAoc2l6ZV90KWF2YWlsU2l6ZTsKKyAgICAgIH0KKyAgICB9CisgICAgc2l6ZV90IG5SZWFkID0gRlhfTUlOKHNpemUsIG1fbkN1clNpemUgLSBtX25DdXJQb3MpOworICAgIGlmICghUmVhZEJsb2NrKGJ1ZmZlciwgKGludDMyX3QpbV9uQ3VyUG9zLCBuUmVhZCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gblJlYWQ7CisgIH0KKyAgdmlydHVhbCBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSBvdmVycmlkZSB7CisgICAgaWYgKCFidWZmZXIgfHwgIXNpemUpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKG1fYlVzZVJhbmdlKSB7CisgICAgICBvZmZzZXQgKz0gKEZYX0ZJTEVTSVpFKW1fbk9mZnNldDsKKyAgICB9CisgICAgaWYgKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSkgeworICAgICAgRlhfU0FGRV9TSVpFX1QgbmV3UG9zID0gc2l6ZTsKKyAgICAgIG5ld1BvcyArPSBvZmZzZXQ7CisgICAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKIAotICAgICAgICAgICAgbV9uQ3VyUG9zID0gbmV3UG9zLlZhbHVlT3JEaWUoKTsKLSAgICAgICAgICAgIGlmIChtX25DdXJQb3MgPiBtX25Ub3RhbFNpemUpIHsKLSAgICAgICAgICAgICAgICBtX25Ub3RhbFNpemUgPSAobV9uQ3VyUG9zICsgbV9uR3Jvd1NpemUgLSAxKSAvIG1fbkdyb3dTaXplICogbV9uR3Jvd1NpemU7Ci0gICAgICAgICAgICAgICAgaWYgKG1fQmxvY2tzLkdldFNpemUoKSA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogYmxvY2sgPSBGWF9BbGxvYyh1aW50OF90LCBtX25Ub3RhbFNpemUpOwotICAgICAgICAgICAgICAgICAgICBtX0Jsb2Nrcy5BZGQoYmxvY2spOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fQmxvY2tzWzBdID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX0Jsb2Nrc1swXSwgbV9uVG90YWxTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtX0Jsb2Nrc1swXSkgewotICAgICAgICAgICAgICAgICAgICBtX0Jsb2Nrcy5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYU1lTX21lbWNweSgodWludDhfdCopbV9CbG9ja3NbMF0gKyAoc2l6ZV90KW9mZnNldCwgYnVmZmVyLCBzaXplKTsKLSAgICAgICAgICAgIGlmIChtX25DdXJTaXplIDwgbV9uQ3VyUG9zKSB7Ci0gICAgICAgICAgICAgICAgbV9uQ3VyU2l6ZSA9IG1fbkN1clBvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgbV9uQ3VyUG9zID0gbmV3UG9zLlZhbHVlT3JEaWUoKTsKKyAgICAgIGlmIChtX25DdXJQb3MgPiBtX25Ub3RhbFNpemUpIHsKKyAgICAgICAgbV9uVG90YWxTaXplID0KKyAgICAgICAgICAgIChtX25DdXJQb3MgKyBtX25Hcm93U2l6ZSAtIDEpIC8gbV9uR3Jvd1NpemUgKiBtX25Hcm93U2l6ZTsKKyAgICAgICAgaWYgKG1fQmxvY2tzLkdldFNpemUoKSA8IDEpIHsKKyAgICAgICAgICB2b2lkKiBibG9jayA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fblRvdGFsU2l6ZSk7CisgICAgICAgICAgbV9CbG9ja3MuQWRkKGJsb2NrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX0Jsb2Nrc1swXSA9IEZYX1JlYWxsb2ModWludDhfdCwgbV9CbG9ja3NbMF0sIG1fblRvdGFsU2l6ZSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKCFtX0Jsb2Nrc1swXSkgeworICAgICAgICAgIG1fQmxvY2tzLlJlbW92ZUFsbCgpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgRlhTWVNfbWVtY3B5KCh1aW50OF90KiltX0Jsb2Nrc1swXSArIChzaXplX3Qpb2Zmc2V0LCBidWZmZXIsIHNpemUpOworICAgICAgaWYgKG1fbkN1clNpemUgPCBtX25DdXJQb3MpIHsKKyAgICAgICAgbV9uQ3VyU2l6ZSA9IG1fbkN1clBvczsKKyAgICAgIH0KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KIAotICAgICAgICBGWF9TQUZFX1NJWkVfVCBuZXdQb3MgPSBzaXplOwotICAgICAgICBuZXdQb3MgKz0gb2Zmc2V0OwotICAgICAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQorICAgIEZYX1NBRkVfU0laRV9UIG5ld1BvcyA9IHNpemU7CisgICAgbmV3UG9zICs9IG9mZnNldDsKKyAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAKLSAgICAgICAgaWYgKCFFeHBhbmRCbG9ja3MobmV3UG9zLlZhbHVlT3JEaWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX25DdXJQb3MgPSBuZXdQb3MuVmFsdWVPckRpZSgpOwotICAgICAgICBzaXplX3QgblN0YXJ0QmxvY2sgPSAoc2l6ZV90KW9mZnNldCAvIG1fbkdyb3dTaXplOwotICAgICAgICBvZmZzZXQgLT0gKEZYX0ZJTEVTSVpFKShuU3RhcnRCbG9jayAqIG1fbkdyb3dTaXplKTsKLSAgICAgICAgd2hpbGUgKHNpemUpIHsKLSAgICAgICAgICAgIHNpemVfdCBuV3JpdGUgPSBtX25Hcm93U2l6ZSAtIChzaXplX3Qpb2Zmc2V0OwotICAgICAgICAgICAgaWYgKG5Xcml0ZSA+IHNpemUpIHsKLSAgICAgICAgICAgICAgICBuV3JpdGUgPSBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KCh1aW50OF90KiltX0Jsb2Nrc1soaW50KW5TdGFydEJsb2NrXSArIChzaXplX3Qpb2Zmc2V0LCBidWZmZXIsIG5Xcml0ZSk7Ci0gICAgICAgICAgICBidWZmZXIgPSAoKHVpbnQ4X3QqKWJ1ZmZlcikgKyBuV3JpdGU7Ci0gICAgICAgICAgICBzaXplIC09IG5Xcml0ZTsKLSAgICAgICAgICAgIG5TdGFydEJsb2NrICsrOwotICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBpZiAoIUV4cGFuZEJsb2NrcyhuZXdQb3MuVmFsdWVPckRpZSgpKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmx1c2goKSAgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7CisgICAgc2l6ZV90IG5TdGFydEJsb2NrID0gKHNpemVfdClvZmZzZXQgLyBtX25Hcm93U2l6ZTsKKyAgICBvZmZzZXQgLT0gKEZYX0ZJTEVTSVpFKShuU3RhcnRCbG9jayAqIG1fbkdyb3dTaXplKTsKKyAgICB3aGlsZSAoc2l6ZSkgeworICAgICAgc2l6ZV90IG5Xcml0ZSA9IG1fbkdyb3dTaXplIC0gKHNpemVfdClvZmZzZXQ7CisgICAgICBpZiAobldyaXRlID4gc2l6ZSkgeworICAgICAgICBuV3JpdGUgPSBzaXplOworICAgICAgfQorICAgICAgRlhTWVNfbWVtY3B5KCh1aW50OF90KiltX0Jsb2Nrc1soaW50KW5TdGFydEJsb2NrXSArIChzaXplX3Qpb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgbldyaXRlKTsKKyAgICAgIGJ1ZmZlciA9ICgodWludDhfdCopYnVmZmVyKSArIG5Xcml0ZTsKKyAgICAgIHNpemUgLT0gbldyaXRlOworICAgICAgblN0YXJ0QmxvY2srKzsKKyAgICAgIG9mZnNldCA9IDA7CiAgICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0NvbnNlY3V0aXZlKCkgY29uc3QgIG92ZXJyaWRlCi0gICAgewotICAgICAgICByZXR1cm4gbV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlOworICAgIHJldHVybiBUUlVFOworICB9CisgIHZpcnR1YWwgRlhfQk9PTCBGbHVzaCgpIG92ZXJyaWRlIHsgcmV0dXJuIFRSVUU7IH0KKyAgdmlydHVhbCBGWF9CT09MIElzQ29uc2VjdXRpdmUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgRXN0aW1hdGVTaXplKHNpemVfdCBuSW5pdFNpemUsIHNpemVfdCBuR3Jvd1NpemUpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSB7CisgICAgICBpZiAobV9CbG9ja3MuR2V0U2l6ZSgpIDwgMSkgeworICAgICAgICB1aW50OF90KiBwQmxvY2sgPSBGWF9BbGxvYyh1aW50OF90LCBGWF9NQVgobkluaXRTaXplLCA0MDk2KSk7CisgICAgICAgIG1fQmxvY2tzLkFkZChwQmxvY2spOworICAgICAgfQorICAgICAgbV9uR3Jvd1NpemUgPSBGWF9NQVgobkdyb3dTaXplLCA0MDk2KTsKKyAgICB9IGVsc2UgaWYgKG1fQmxvY2tzLkdldFNpemUoKSA8IDEpIHsKKyAgICAgIG1fbkdyb3dTaXplID0gRlhfTUFYKG5Hcm93U2l6ZSwgNDA5Nik7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZAkJCQlFc3RpbWF0ZVNpemUoc2l6ZV90IG5Jbml0U2l6ZSwgc2l6ZV90IG5Hcm93U2l6ZSkgIG92ZXJyaWRlCi0gICAgewotICAgICAgICBpZiAobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSB7Ci0gICAgICAgICAgICBpZiAobV9CbG9ja3MuR2V0U2l6ZSgpIDwgMSkgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBCbG9jayA9IEZYX0FsbG9jKHVpbnQ4X3QsIEZYX01BWChuSW5pdFNpemUsIDQwOTYpKTsKLSAgICAgICAgICAgICAgICBtX0Jsb2Nrcy5BZGQocEJsb2NrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fbkdyb3dTaXplID0gRlhfTUFYKG5Hcm93U2l6ZSwgNDA5Nik7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9CbG9ja3MuR2V0U2l6ZSgpIDwgMSkgewotICAgICAgICAgICAgbV9uR3Jvd1NpemUgPSBGWF9NQVgobkdyb3dTaXplLCA0MDk2KTsKLSAgICAgICAgfQorICB9CisgIHZpcnR1YWwgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBtX0Jsb2Nrcy5HZXRTaXplKCkgPyAodWludDhfdCopbV9CbG9ja3NbMF0gOiBOVUxMOworICB9CisgIHZpcnR1YWwgdm9pZCBBdHRhY2hCdWZmZXIodWludDhfdCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVGFrZU92ZXIgPSBGQUxTRSkgb3ZlcnJpZGUgeworICAgIGlmICghKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSkpIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgdmlydHVhbCB1aW50OF90KgkJCUdldEJ1ZmZlcigpIGNvbnN0ICBvdmVycmlkZQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQmxvY2tzLkdldFNpemUoKSA/ICh1aW50OF90KiltX0Jsb2Nrc1swXSA6IE5VTEw7CisgICAgbV9CbG9ja3MuUmVtb3ZlQWxsKCk7CisgICAgbV9CbG9ja3MuQWRkKHBCdWZmZXIpOworICAgIG1fblRvdGFsU2l6ZSA9IG1fbkN1clNpemUgPSBuU2l6ZTsKKyAgICBtX25DdXJQb3MgPSAwOworICAgIG1fZHdGbGFncyA9CisgICAgICAgIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSB8IChiVGFrZU92ZXIgPyBGWF9NRU1TVFJFQU1fVGFrZU92ZXIgOiAwKTsKKyAgICBDbGVhclJhbmdlKCk7CisgIH0KKyAgdmlydHVhbCB2b2lkIERldGFjaEJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICBpZiAoIShtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUpKSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZAkJCQlBdHRhY2hCdWZmZXIodWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKSAgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIGlmICghKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtX0Jsb2Nrcy5SZW1vdmVBbGwoKTsKLSAgICAgICAgbV9CbG9ja3MuQWRkKHBCdWZmZXIpOwotICAgICAgICBtX25Ub3RhbFNpemUgPSBtX25DdXJTaXplID0gblNpemU7Ci0gICAgICAgIG1fbkN1clBvcyA9IDA7Ci0gICAgICAgIG1fZHdGbGFncyA9IEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSB8IChiVGFrZU92ZXIgPyBGWF9NRU1TVFJFQU1fVGFrZU92ZXIgOiAwKTsKLSAgICAgICAgQ2xlYXJSYW5nZSgpOworICAgIG1fQmxvY2tzLlJlbW92ZUFsbCgpOworICAgIG1fblRvdGFsU2l6ZSA9IG1fbkN1clNpemUgPSBtX25DdXJQb3MgPSAwOworICAgIG1fZHdGbGFncyA9IEZYX01FTVNUUkVBTV9UYWtlT3ZlcjsKKyAgICBDbGVhclJhbmdlKCk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgQ0ZYX1B0ckFycmF5IG1fQmxvY2tzOworICBGWF9EV09SRCBtX2R3Q291bnQ7CisgIHNpemVfdCBtX25Ub3RhbFNpemU7CisgIHNpemVfdCBtX25DdXJTaXplOworICBzaXplX3QgbV9uQ3VyUG9zOworICBzaXplX3QgbV9uR3Jvd1NpemU7CisgIEZYX0RXT1JEIG1fZHdGbGFnczsKKyAgRlhfQk9PTCBtX2JVc2VSYW5nZTsKKyAgc2l6ZV90IG1fbk9mZnNldDsKKyAgc2l6ZV90IG1fblNpemU7CisgIEZYX0JPT0wgRXhwYW5kQmxvY2tzKHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1fbkN1clNpemUgPCBzaXplKSB7CisgICAgICBtX25DdXJTaXplID0gc2l6ZTsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkCQkJCURldGFjaEJ1ZmZlcigpICBvdmVycmlkZQotICAgIHsKLSAgICAgICAgaWYgKCEobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fQmxvY2tzLlJlbW92ZUFsbCgpOwotICAgICAgICBtX25Ub3RhbFNpemUgPSBtX25DdXJTaXplID0gbV9uQ3VyUG9zID0gMDsKLSAgICAgICAgbV9kd0ZsYWdzID0gRlhfTUVNU1RSRUFNX1Rha2VPdmVyOwotICAgICAgICBDbGVhclJhbmdlKCk7CisgICAgaWYgKHNpemUgPD0gbV9uVG90YWxTaXplKSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgQ0ZYX1B0ckFycmF5CW1fQmxvY2tzOwotICAgIEZYX0RXT1JECQltX2R3Q291bnQ7Ci0gICAgc2l6ZV90CQkJbV9uVG90YWxTaXplOwotICAgIHNpemVfdAkJCW1fbkN1clNpemU7Ci0gICAgc2l6ZV90CQkJbV9uQ3VyUG9zOwotICAgIHNpemVfdAkJCW1fbkdyb3dTaXplOwotICAgIEZYX0RXT1JECQltX2R3RmxhZ3M7Ci0gICAgRlhfQk9PTAkJCW1fYlVzZVJhbmdlOwotICAgIHNpemVfdAkJCW1fbk9mZnNldDsKLSAgICBzaXplX3QJCQltX25TaXplOwotICAgIEZYX0JPT0wJRXhwYW5kQmxvY2tzKHNpemVfdCBzaXplKQotICAgIHsKLSAgICAgICAgaWYgKG1fbkN1clNpemUgPCBzaXplKSB7Ci0gICAgICAgICAgICBtX25DdXJTaXplID0gc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2l6ZSA8PSBtX25Ub3RhbFNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgaUNvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOwotICAgICAgICBzaXplID0gKHNpemUgLSBtX25Ub3RhbFNpemUgKyBtX25Hcm93U2l6ZSAtIDEpIC8gbV9uR3Jvd1NpemU7Ci0gICAgICAgIG1fQmxvY2tzLlNldFNpemUobV9CbG9ja3MuR2V0U2l6ZSgpICsgKGludDMyX3Qpc2l6ZSk7Ci0gICAgICAgIHdoaWxlIChzaXplIC0tKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBwQmxvY2sgPSBGWF9BbGxvYyh1aW50OF90LCBtX25Hcm93U2l6ZSk7Ci0gICAgICAgICAgICBtX0Jsb2Nrcy5TZXRBdChpQ291bnQgKyssIHBCbG9jayk7Ci0gICAgICAgICAgICBtX25Ub3RhbFNpemUgKz0gbV9uR3Jvd1NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgaW50MzJfdCBpQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCk7CisgICAgc2l6ZSA9IChzaXplIC0gbV9uVG90YWxTaXplICsgbV9uR3Jvd1NpemUgLSAxKSAvIG1fbkdyb3dTaXplOworICAgIG1fQmxvY2tzLlNldFNpemUobV9CbG9ja3MuR2V0U2l6ZSgpICsgKGludDMyX3Qpc2l6ZSk7CisgICAgd2hpbGUgKHNpemUtLSkgeworICAgICAgdWludDhfdCogcEJsb2NrID0gRlhfQWxsb2ModWludDhfdCwgbV9uR3Jvd1NpemUpOworICAgICAgbV9CbG9ja3MuU2V0QXQoaUNvdW50KyssIHBCbG9jayk7CisgICAgICBtX25Ub3RhbFNpemUgKz0gbV9uR3Jvd1NpemU7CiAgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CiB9OwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgotI2RlZmluZSBNVF9OCQkJODQ4Ci0jZGVmaW5lIE1UX00JCQk0NTYKLSNkZWZpbmUgTVRfTWF0cml4X0EJCTB4OTkwOGIwZGYKLSNkZWZpbmUgTVRfVXBwZXJfTWFzawkweDgwMDAwMDAwCi0jZGVmaW5lIE1UX0xvd2VyX01hc2sJMHg3ZmZmZmZmZgorI2RlZmluZSBNVF9OIDg0OAorI2RlZmluZSBNVF9NIDQ1NgorI2RlZmluZSBNVF9NYXRyaXhfQSAweDk5MDhiMGRmCisjZGVmaW5lIE1UX1VwcGVyX01hc2sgMHg4MDAwMDAwMAorI2RlZmluZSBNVF9Mb3dlcl9NYXNrIDB4N2ZmZmZmZmYKIHR5cGVkZWYgc3RydWN0IF9GWF9NVFJBTkRPTUNPTlRFWFQgewotICAgIF9GWF9NVFJBTkRPTUNPTlRFWFQoKQotICAgIHsKLSAgICAgICAgbXRpID0gTVRfTiArIDE7Ci0gICAgICAgIGJIYXZlU2VlZCA9IEZBTFNFOwotICAgIH0KLSAgICBGWF9EV09SRCBtdGk7Ci0gICAgRlhfQk9PTAkgYkhhdmVTZWVkOwotICAgIEZYX0RXT1JEIG10W01UX05dOwotfSBGWF9NVFJBTkRPTUNPTlRFWFQsICogRlhfTFBNVFJBTkRPTUNPTlRFWFQ7Ci10eXBlZGVmIEZYX01UUkFORE9NQ09OVEVYVCBjb25zdCAqIEZYX0xQQ01UUkFORE9NQ09OVEVYVDsKKyAgX0ZYX01UUkFORE9NQ09OVEVYVCgpIHsKKyAgICBtdGkgPSBNVF9OICsgMTsKKyAgICBiSGF2ZVNlZWQgPSBGQUxTRTsKKyAgfQorICBGWF9EV09SRCBtdGk7CisgIEZYX0JPT0wgYkhhdmVTZWVkOworICBGWF9EV09SRCBtdFtNVF9OXTsKK30gRlhfTVRSQU5ET01DT05URVhULCAqRlhfTFBNVFJBTkRPTUNPTlRFWFQ7Cit0eXBlZGVmIEZYX01UUkFORE9NQ09OVEVYVCBjb25zdCogRlhfTFBDTVRSQU5ET01DT05URVhUOwogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KIEZYX0JPT0wgRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20oRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5jcHAKaW5kZXggOTUyNTljNy4uOWQyZDFiZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuY3BwCkBAIC0xMiwxODYgKzEyLDk2IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogc3RhdGljIGNvbnN0IEZYX0FSQkZPUk1UQUJMRSBnX0ZYX0FyYWJpY0Zvcm1UYWJsZXNbXSA9IHsKLSAgICB7MHhGRTgxLAkweEZFODIsCTB4RkU4MSwJMHhGRTgyfSwKLSAgICB7MHhGRTgzLAkweEZFODQsCTB4RkU4MywJMHhGRTg0fSwKLSAgICB7MHhGRTg1LAkweEZFODYsCTB4RkU4NSwJMHhGRTg2fSwKLSAgICB7MHhGRTg3LAkweEZFODgsCTB4RkU4NywJMHhGRTg4fSwKLSAgICB7MHhGRTg5LAkweEZFOEEsCTB4RkU4QiwJMHhGRThDfSwKLSAgICB7MHhGRThELAkweEZFOEUsCTB4RkU4RCwJMHhGRThFfSwKLSAgICB7MHhGRThGLAkweEZFOTAsCTB4RkU5MSwJMHhGRTkyfSwKLSAgICB7MHhGRTkzLAkweEZFOTQsCTB4RkU5MywJMHhGRTk0fSwKLSAgICB7MHhGRTk1LAkweEZFOTYsCTB4RkU5NywJMHhGRTk4fSwKLSAgICB7MHhGRTk5LAkweEZFOUEsCTB4RkU5QiwJMHhGRTlDfSwKLSAgICB7MHhGRTlELAkweEZFOUUsCTB4RkU5RiwJMHhGRUEwfSwKLSAgICB7MHhGRUExLAkweEZFQTIsCTB4RkVBMywJMHhGRUE0fSwKLSAgICB7MHhGRUE1LAkweEZFQTYsCTB4RkVBNywJMHhGRUE4fSwKLSAgICB7MHhGRUE5LAkweEZFQUEsCTB4RkVBOSwJMHhGRUFBfSwKLSAgICB7MHhGRUFCLAkweEZFQUMsCTB4RkVBQiwJMHhGRUFDfSwKLSAgICB7MHhGRUFELAkweEZFQUUsCTB4RkVBRCwJMHhGRUFFfSwKLSAgICB7MHhGRUFGLAkweEZFQjAsCTB4RkVBRiwJMHhGRUIwfSwKLSAgICB7MHhGRUIxLAkweEZFQjIsCTB4RkVCMywJMHhGRUI0fSwKLSAgICB7MHhGRUI1LAkweEZFQjYsCTB4RkVCNywJMHhGRUI4fSwKLSAgICB7MHhGRUI5LAkweEZFQkEsCTB4RkVCQiwJMHhGRUJDfSwKLSAgICB7MHhGRUJELAkweEZFQkUsCTB4RkVCRiwJMHhGRUMwfSwKLSAgICB7MHhGRUMxLAkweEZFQzIsCTB4RkVDMywJMHhGRUM0fSwKLSAgICB7MHhGRUM1LAkweEZFQzYsCTB4RkVDNywJMHhGRUM4fSwKLSAgICB7MHhGRUM5LAkweEZFQ0EsCTB4RkVDQiwJMHhGRUNDfSwKLSAgICB7MHhGRUNELAkweEZFQ0UsCTB4RkVDRiwJMHhGRUQwfSwKLSAgICB7MHgwNjNCLAkweDA2M0IsCTB4MDYzQiwJMHgwNjNCfSwKLSAgICB7MHgwNjNDLAkweDA2M0MsCTB4MDYzQywJMHgwNjNDfSwKLSAgICB7MHgwNjNELAkweDA2M0QsCTB4MDYzRCwJMHgwNjNEfSwKLSAgICB7MHgwNjNFLAkweDA2M0UsCTB4MDYzRSwJMHgwNjNFfSwKLSAgICB7MHgwNjNGLAkweDA2M0YsCTB4MDYzRiwJMHgwNjNGfSwKLSAgICB7MHgwNjQwLAkweDA2NDAsCTB4MDY0MCwJMHgwNjQwfSwKLSAgICB7MHhGRUQxLAkweEZFRDIsCTB4RkVEMywJMHhGRUQ0fSwKLSAgICB7MHhGRUQ1LAkweEZFRDYsCTB4RkVENywJMHhGRUQ4fSwKLSAgICB7MHhGRUQ5LAkweEZFREEsCTB4RkVEQiwJMHhGRURDfSwKLSAgICB7MHhGRURELAkweEZFREUsCTB4RkVERiwJMHhGRUUwfSwKLSAgICB7MHhGRUUxLAkweEZFRTIsCTB4RkVFMywJMHhGRUU0fSwKLSAgICB7MHhGRUU1LAkweEZFRTYsCTB4RkVFNywJMHhGRUU4fSwKLSAgICB7MHhGRUU5LAkweEZFRUEsCTB4RkVFQiwJMHhGRUVDfSwKLSAgICB7MHhGRUVELAkweEZFRUUsCTB4RkVFRCwJMHhGRUVFfSwKLSAgICB7MHhGRUVGLAkweEZFRjAsCTB4RkJGRSwJMHhGQkZGfSwKLSAgICB7MHhGRUYxLAkweEZFRjIsCTB4RkVGMywJMHhGRUY0fSwKLSAgICB7MHgwNjRCLAkweDA2NEIsCTB4MDY0QiwJMHgwNjRCfSwKLSAgICB7MHgwNjRDLAkweDA2NEMsCTB4MDY0QywJMHgwNjRDfSwKLSAgICB7MHgwNjRELAkweDA2NEQsCTB4MDY0RCwJMHgwNjREfSwKLSAgICB7MHgwNjRFLAkweDA2NEUsCTB4MDY0RSwJMHgwNjRFfSwKLSAgICB7MHgwNjRGLAkweDA2NEYsCTB4MDY0RiwJMHgwNjRGfSwKLSAgICB7MHgwNjUwLAkweDA2NTAsCTB4MDY1MCwJMHgwNjUwfSwKLSAgICB7MHgwNjUxLAkweDA2NTEsCTB4MDY1MSwJMHgwNjUxfSwKLSAgICB7MHgwNjUyLAkweDA2NTIsCTB4MDY1MiwJMHgwNjUyfSwKLSAgICB7MHgwNjUzLAkweDA2NTMsCTB4MDY1MywJMHgwNjUzfSwKLSAgICB7MHgwNjU0LAkweDA2NTQsCTB4MDY1NCwJMHgwNjU0fSwKLSAgICB7MHgwNjU1LAkweDA2NTUsCTB4MDY1NSwJMHgwNjU1fSwKLSAgICB7MHgwNjU2LAkweDA2NTYsCTB4MDY1NiwJMHgwNjU2fSwKLSAgICB7MHgwNjU3LAkweDA2NTcsCTB4MDY1NywJMHgwNjU3fSwKLSAgICB7MHgwNjU4LAkweDA2NTgsCTB4MDY1OCwJMHgwNjU4fSwKLSAgICB7MHgwNjU5LAkweDA2NTksCTB4MDY1OSwJMHgwNjU5fSwKLSAgICB7MHgwNjVBLAkweDA2NUEsCTB4MDY1QSwJMHgwNjVBfSwKLSAgICB7MHgwNjVCLAkweDA2NUIsCTB4MDY1QiwJMHgwNjVCfSwKLSAgICB7MHgwNjVDLAkweDA2NUMsCTB4MDY1QywJMHgwNjVDfSwKLSAgICB7MHgwNjVELAkweDA2NUQsCTB4MDY1RCwJMHgwNjVEfSwKLSAgICB7MHgwNjVFLAkweDA2NUUsCTB4MDY1RSwJMHgwNjVFfSwKLSAgICB7MHgwNjVGLAkweDA2NUYsCTB4MDY1RiwJMHgwNjVGfSwKLSAgICB7MHgwNjYwLAkweDA2NjAsCTB4MDY2MCwJMHgwNjYwfSwKLSAgICB7MHgwNjYxLAkweDA2NjEsCTB4MDY2MSwJMHgwNjYxfSwKLSAgICB7MHgwNjYyLAkweDA2NjIsCTB4MDY2MiwJMHgwNjYyfSwKLSAgICB7MHgwNjYzLAkweDA2NjMsCTB4MDY2MywJMHgwNjYzfSwKLSAgICB7MHgwNjY0LAkweDA2NjQsCTB4MDY2NCwJMHgwNjY0fSwKLSAgICB7MHgwNjY1LAkweDA2NjUsCTB4MDY2NSwJMHgwNjY1fSwKLSAgICB7MHgwNjY2LAkweDA2NjYsCTB4MDY2NiwJMHgwNjY2fSwKLSAgICB7MHgwNjY3LAkweDA2NjcsCTB4MDY2NywJMHgwNjY3fSwKLSAgICB7MHgwNjY4LAkweDA2NjgsCTB4MDY2OCwJMHgwNjY4fSwKLSAgICB7MHgwNjY5LAkweDA2NjksCTB4MDY2OSwJMHgwNjY5fSwKLSAgICB7MHgwNjZBLAkweDA2NkEsCTB4MDY2QSwJMHgwNjZBfSwKLSAgICB7MHgwNjZCLAkweDA2NkIsCTB4MDY2QiwJMHgwNjZCfSwKLSAgICB7MHgwNjZDLAkweDA2NkMsCTB4MDY2QywJMHgwNjZDfSwKLSAgICB7MHgwNjZELAkweDA2NkQsCTB4MDY2RCwJMHgwNjZEfSwKLSAgICB7MHgwNjZFLAkweDA2NkUsCTB4MDY2RSwJMHgwNjZFfSwKLSAgICB7MHgwNjZGLAkweDA2NkYsCTB4MDY2RiwJMHgwNjZGfSwKLSAgICB7MHgwNjcwLAkweDA2NzAsCTB4MDY3MCwJMHgwNjcwfSwKLSAgICB7MHhGQjUwLAkweEZCNTEsCTB4RkI1MCwJMHhGQjUxfSwKLSAgICB7MHgwNjcyLAkweDA2NzIsCTB4MDY3MiwJMHgwNjcyfSwKLSAgICB7MHgwNjczLAkweDA2NzMsCTB4MDY3MywJMHgwNjczfSwKLSAgICB7MHgwNjc0LAkweDA2NzQsCTB4MDY3NCwJMHgwNjc0fSwKLSAgICB7MHgwNjc1LAkweDA2NzUsCTB4MDY3NSwJMHgwNjc1fSwKLSAgICB7MHgwNjc2LAkweDA2NzYsCTB4MDY3NiwJMHgwNjc2fSwKLSAgICB7MHgwNjc3LAkweDA2NzcsCTB4MDY3NywJMHgwNjc3fSwKLSAgICB7MHgwNjc4LAkweDA2NzgsCTB4MDY3OCwJMHgwNjc4fSwKLSAgICB7MHhGQjY2LAkweEZCNjcsCTB4RkI2OCwJMHhGQjY5fSwKLSAgICB7MHhGQjVFLAkweEZCNUYsCTB4RkI2MCwJMHhGQjYxfSwKLSAgICB7MHhGQjUyLAkweEZCNTMsCTB4RkI1NCwJMHhGQjU1fSwKLSAgICB7MHgwNjdDLAkweDA2N0MsCTB4MDY3QywJMHgwNjdDfSwKLSAgICB7MHgwNjdELAkweDA2N0QsCTB4MDY3RCwJMHgwNjdEfSwKLSAgICB7MHhGQjU2LAkweEZCNTcsCTB4RkI1OCwJMHhGQjU5fSwKLSAgICB7MHhGQjYyLAkweEZCNjMsCTB4RkI2NCwJMHhGQjY1fSwKLSAgICB7MHhGQjVBLAkweEZCNUIsCTB4RkI1QywJMHhGQjVEfSwKLSAgICB7MHgwNjgxLAkweDA2ODEsCTB4MDY4MSwJMHgwNjgxfSwKLSAgICB7MHgwNjgyLAkweDA2ODIsCTB4MDY4MiwJMHgwNjgyfSwKLSAgICB7MHhGQjc2LAkweEZCNzcsCTB4RkI3OCwJMHhGQjc5fSwKLSAgICB7MHhGQjcyLAkweEZCNzMsCTB4RkI3NCwJMHhGQjc1fSwKLSAgICB7MHgwNjg1LAkweDA2ODUsCTB4MDY4NSwJMHgwNjg1fSwKLSAgICB7MHhGQjdBLAkweEZCN0IsCTB4RkI3QywJMHhGQjdEfSwKLSAgICB7MHhGQjdFLAkweEZCN0YsCTB4RkI4MCwJMHhGQjgxfSwKLSAgICB7MHhGQjg4LAkweEZCODksCTB4RkI4OCwJMHhGQjg5fSwKLSAgICB7MHgwNjg5LAkweDA2ODksCTB4MDY4OSwJMHgwNjg5fSwKLSAgICB7MHgwNjhBLAkweDA2OEEsCTB4MDY4QSwJMHgwNjhBfSwKLSAgICB7MHgwNjhCLAkweDA2OEIsCTB4MDY4QiwJMHgwNjhCfSwKLSAgICB7MHhGQjg0LAkweEZCODUsCTB4RkI4NCwJMHhGQjg1fSwKLSAgICB7MHhGQjgyLAkweEZCODMsCTB4RkI4MiwJMHhGQjgzfSwKLSAgICB7MHhGQjg2LAkweEZCODcsCTB4RkI4NiwJMHhGQjg3fSwKLSAgICB7MHgwNjhGLAkweDA2OEYsCTB4MDY4RiwJMHgwNjhGfSwKLSAgICB7MHgwNjkwLAkweDA2OTAsCTB4MDY5MCwJMHgwNjkwfSwKLSAgICB7MHhGQjhDLAkweEZCOEQsCTB4RkI4QywJMHhGQjhEfSwKLSAgICB7MHgwNjkyLAkweDA2OTIsCTB4MDY5MiwJMHgwNjkyfSwKLSAgICB7MHgwNjkzLAkweDA2OTMsCTB4MDY5MywJMHgwNjkzfSwKLSAgICB7MHgwNjk0LAkweDA2OTQsCTB4MDY5NCwJMHgwNjk0fSwKLSAgICB7MHgwNjk1LAkweDA2OTUsCTB4MDY5NSwJMHgwNjk1fSwKLSAgICB7MHgwNjk2LAkweDA2OTYsCTB4MDY5NiwJMHgwNjk2fSwKLSAgICB7MHgwNjk3LAkweDA2OTcsCTB4MDY5NywJMHgwNjk3fSwKLSAgICB7MHhGQjhBLAkweEZCOEIsCTB4RkI4QSwJMHhGQjhCfSwKLSAgICB7MHgwNjk5LAkweDA2OTksCTB4MDY5OSwJMHgwNjk5fSwKLSAgICB7MHgwNjlBLAkweDA2OUEsCTB4MDY5QSwJMHgwNjlBfSwKLSAgICB7MHgwNjlCLAkweDA2OUIsCTB4MDY5QiwJMHgwNjlCfSwKLSAgICB7MHgwNjlDLAkweDA2OUMsCTB4MDY5QywJMHgwNjlDfSwKLSAgICB7MHgwNjlELAkweDA2OUQsCTB4MDY5RCwJMHgwNjlEfSwKLSAgICB7MHgwNjlFLAkweDA2OUUsCTB4MDY5RSwJMHgwNjlFfSwKLSAgICB7MHgwNjlGLAkweDA2OUYsCTB4MDY5RiwJMHgwNjlGfSwKLSAgICB7MHgwNkEwLAkweDA2QTAsCTB4MDZBMCwJMHgwNkEwfSwKLSAgICB7MHgwNkExLAkweDA2QTEsCTB4MDZBMSwJMHgwNkExfSwKLSAgICB7MHgwNkEyLAkweDA2QTIsCTB4MDZBMiwJMHgwNkEyfSwKLSAgICB7MHgwNkEzLAkweDA2QTMsCTB4MDZBMywJMHgwNkEzfSwKLSAgICB7MHhGQjZBLAkweEZCNkIsCTB4RkI2QywJMHhGQjZEfSwKLSAgICB7MHgwNkE1LAkweDA2QTUsCTB4MDZBNSwJMHgwNkE1fSwKLSAgICB7MHhGQjZFLAkweEZCNkYsCTB4RkI3MCwJMHhGQjcxfSwKLSAgICB7MHgwNkE3LAkweDA2QTcsCTB4MDZBNywJMHgwNkE3fSwKLSAgICB7MHgwNkE4LAkweDA2QTgsCTB4MDZBOCwJMHgwNkE4fSwKLSAgICB7MHhGQjhFLAkweEZCOEYsCTB4RkI5MCwJMHhGQjkxfSwKLSAgICB7MHgwNkFBLAkweDA2QUEsCTB4MDZBQSwJMHgwNkFBfSwKLSAgICB7MHgwNkFCLAkweDA2QUIsCTB4MDZBQiwJMHgwNkFCfSwKLSAgICB7MHgwNkFDLAkweDA2QUMsCTB4MDZBQywJMHgwNkFDfSwKLSAgICB7MHhGQkQzLAkweEZCRDQsCTB4RkJENSwJMHhGQkQ2fSwKLSAgICB7MHgwNkFFLAkweDA2QUUsCTB4MDZBRSwJMHgwNkFFfSwKLSAgICB7MHhGQjkyLAkweEZCOTMsCTB4RkI5NCwJMHhGQjk1fSwKLSAgICB7MHgwNkIwLAkweDA2QjAsCTB4MDZCMCwJMHgwNkIwfSwKLSAgICB7MHhGQjlBLAkweEZCOUIsCTB4RkI5QywJMHhGQjlEfSwKLSAgICB7MHgwNkIyLAkweDA2QjIsCTB4MDZCMiwJMHgwNkIyfSwKLSAgICB7MHhGQjk2LAkweEZCOTcsCTB4RkI5OCwJMHhGQjk5fSwKLSAgICB7MHgwNkI0LAkweDA2QjQsCTB4MDZCNCwJMHgwNkI0fSwKLSAgICB7MHgwNkI1LAkweDA2QjUsCTB4MDZCNSwJMHgwNkI1fSwKLSAgICB7MHgwNkI2LAkweDA2QjYsCTB4MDZCNiwJMHgwNkI2fSwKLSAgICB7MHgwNkI3LAkweDA2QjcsCTB4MDZCNywJMHgwNkI3fSwKLSAgICB7MHgwNkI4LAkweDA2QjgsCTB4MDZCOCwJMHgwNkI4fSwKLSAgICB7MHgwNkI5LAkweDA2QjksCTB4MDZCOSwJMHgwNkI5fSwKLSAgICB7MHhGQjlFLAkweEZCOUYsCTB4RkJFOCwJMHhGQkU5fSwKLSAgICB7MHhGQkEwLAkweEZCQTEsCTB4RkJBMiwJMHhGQkEzfSwKLSAgICB7MHgwNkJDLAkweDA2QkMsCTB4MDZCQywJMHgwNkJDfSwKLSAgICB7MHgwNkJELAkweDA2QkQsCTB4MDZCRCwJMHgwNkJEfSwKLSAgICB7MHhGQkFBLAkweEZCQUIsCTB4RkJBQywJMHhGQkFEfSwKLSAgICB7MHgwNkJGLAkweDA2QkYsCTB4MDZCRiwJMHgwNkJGfSwKLSAgICB7MHhGQkE0LAkweEZCQTUsCTB4RkJBNCwJMHhGQkE1fSwKLSAgICB7MHhGQkE2LAkweEZCQTcsCTB4RkJBOCwJMHhGQkE5fSwKLSAgICB7MHgwNkMyLAkweDA2QzIsCTB4MDZDMiwJMHgwNkMyfSwKLSAgICB7MHgwNkMzLAkweDA2QzMsCTB4MDZDMywJMHgwNkMzfSwKLSAgICB7MHgwNkM0LAkweDA2QzQsCTB4MDZDNCwJMHgwNkM0fSwKLSAgICB7MHhGQkUwLAkweEZCRTEsCTB4RkJFMCwJMHhGQkUxfSwKLSAgICB7MHhGQkQ5LAkweEZCREEsCTB4RkJEOSwJMHhGQkRBfSwKLSAgICB7MHhGQkQ3LAkweEZCRDgsCTB4RkJENywJMHhGQkQ4fSwKLSAgICB7MHhGQkRCLAkweEZCREMsCTB4RkJEQiwJMHhGQkRDfSwKLSAgICB7MHhGQkUyLAkweEZCRTMsCTB4RkJFMiwJMHhGQkUzfSwKLSAgICB7MHgwNkNBLAkweDA2Q0EsCTB4MDZDQSwJMHgwNkNBfSwKLSAgICB7MHhGQkRFLAkweEZCREYsCTB4RkJERSwJMHhGQkRGfSwKLSAgICB7MHhGQkZDLAkweEZCRkQsCTB4RkJGRSwJMHhGQkZGfSwKLSAgICB7MHgwNkNELAkweDA2Q0QsCTB4MDZDRCwJMHgwNkNEfSwKLSAgICB7MHgwNkNFLAkweDA2Q0UsCTB4MDZDRSwJMHgwNkNFfSwKLSAgICB7MHgwNkNGLAkweDA2Q0YsCTB4MDZDRiwJMHgwNkNGfSwKLSAgICB7MHhGQkU0LAkweEZCRTUsCTB4RkJFNiwJMHhGQkU3fSwKLSAgICB7MHgwNkQxLAkweDA2RDEsCTB4MDZEMSwJMHgwNkQxfSwKLSAgICB7MHhGQkFFLAkweEZCQUYsCTB4RkJBRSwJMHhGQkFGfSwKLSAgICB7MHhGQkIwLAkweEZCQjEsCTB4RkJCMCwJMHhGQkIxfSwKLSAgICB7MHgwNkQ0LAkweDA2RDQsCTB4MDZENCwJMHgwNkQ0fSwKLSAgICB7MHgwNkQ1LAkweDA2RDUsCTB4MDZENSwJMHgwNkQ1fSwKKyAgICB7MHhGRTgxLCAweEZFODIsIDB4RkU4MSwgMHhGRTgyfSwgezB4RkU4MywgMHhGRTg0LCAweEZFODMsIDB4RkU4NH0sCisgICAgezB4RkU4NSwgMHhGRTg2LCAweEZFODUsIDB4RkU4Nn0sIHsweEZFODcsIDB4RkU4OCwgMHhGRTg3LCAweEZFODh9LAorICAgIHsweEZFODksIDB4RkU4QSwgMHhGRThCLCAweEZFOEN9LCB7MHhGRThELCAweEZFOEUsIDB4RkU4RCwgMHhGRThFfSwKKyAgICB7MHhGRThGLCAweEZFOTAsIDB4RkU5MSwgMHhGRTkyfSwgezB4RkU5MywgMHhGRTk0LCAweEZFOTMsIDB4RkU5NH0sCisgICAgezB4RkU5NSwgMHhGRTk2LCAweEZFOTcsIDB4RkU5OH0sIHsweEZFOTksIDB4RkU5QSwgMHhGRTlCLCAweEZFOUN9LAorICAgIHsweEZFOUQsIDB4RkU5RSwgMHhGRTlGLCAweEZFQTB9LCB7MHhGRUExLCAweEZFQTIsIDB4RkVBMywgMHhGRUE0fSwKKyAgICB7MHhGRUE1LCAweEZFQTYsIDB4RkVBNywgMHhGRUE4fSwgezB4RkVBOSwgMHhGRUFBLCAweEZFQTksIDB4RkVBQX0sCisgICAgezB4RkVBQiwgMHhGRUFDLCAweEZFQUIsIDB4RkVBQ30sIHsweEZFQUQsIDB4RkVBRSwgMHhGRUFELCAweEZFQUV9LAorICAgIHsweEZFQUYsIDB4RkVCMCwgMHhGRUFGLCAweEZFQjB9LCB7MHhGRUIxLCAweEZFQjIsIDB4RkVCMywgMHhGRUI0fSwKKyAgICB7MHhGRUI1LCAweEZFQjYsIDB4RkVCNywgMHhGRUI4fSwgezB4RkVCOSwgMHhGRUJBLCAweEZFQkIsIDB4RkVCQ30sCisgICAgezB4RkVCRCwgMHhGRUJFLCAweEZFQkYsIDB4RkVDMH0sIHsweEZFQzEsIDB4RkVDMiwgMHhGRUMzLCAweEZFQzR9LAorICAgIHsweEZFQzUsIDB4RkVDNiwgMHhGRUM3LCAweEZFQzh9LCB7MHhGRUM5LCAweEZFQ0EsIDB4RkVDQiwgMHhGRUNDfSwKKyAgICB7MHhGRUNELCAweEZFQ0UsIDB4RkVDRiwgMHhGRUQwfSwgezB4MDYzQiwgMHgwNjNCLCAweDA2M0IsIDB4MDYzQn0sCisgICAgezB4MDYzQywgMHgwNjNDLCAweDA2M0MsIDB4MDYzQ30sIHsweDA2M0QsIDB4MDYzRCwgMHgwNjNELCAweDA2M0R9LAorICAgIHsweDA2M0UsIDB4MDYzRSwgMHgwNjNFLCAweDA2M0V9LCB7MHgwNjNGLCAweDA2M0YsIDB4MDYzRiwgMHgwNjNGfSwKKyAgICB7MHgwNjQwLCAweDA2NDAsIDB4MDY0MCwgMHgwNjQwfSwgezB4RkVEMSwgMHhGRUQyLCAweEZFRDMsIDB4RkVENH0sCisgICAgezB4RkVENSwgMHhGRUQ2LCAweEZFRDcsIDB4RkVEOH0sIHsweEZFRDksIDB4RkVEQSwgMHhGRURCLCAweEZFREN9LAorICAgIHsweEZFREQsIDB4RkVERSwgMHhGRURGLCAweEZFRTB9LCB7MHhGRUUxLCAweEZFRTIsIDB4RkVFMywgMHhGRUU0fSwKKyAgICB7MHhGRUU1LCAweEZFRTYsIDB4RkVFNywgMHhGRUU4fSwgezB4RkVFOSwgMHhGRUVBLCAweEZFRUIsIDB4RkVFQ30sCisgICAgezB4RkVFRCwgMHhGRUVFLCAweEZFRUQsIDB4RkVFRX0sIHsweEZFRUYsIDB4RkVGMCwgMHhGQkZFLCAweEZCRkZ9LAorICAgIHsweEZFRjEsIDB4RkVGMiwgMHhGRUYzLCAweEZFRjR9LCB7MHgwNjRCLCAweDA2NEIsIDB4MDY0QiwgMHgwNjRCfSwKKyAgICB7MHgwNjRDLCAweDA2NEMsIDB4MDY0QywgMHgwNjRDfSwgezB4MDY0RCwgMHgwNjRELCAweDA2NEQsIDB4MDY0RH0sCisgICAgezB4MDY0RSwgMHgwNjRFLCAweDA2NEUsIDB4MDY0RX0sIHsweDA2NEYsIDB4MDY0RiwgMHgwNjRGLCAweDA2NEZ9LAorICAgIHsweDA2NTAsIDB4MDY1MCwgMHgwNjUwLCAweDA2NTB9LCB7MHgwNjUxLCAweDA2NTEsIDB4MDY1MSwgMHgwNjUxfSwKKyAgICB7MHgwNjUyLCAweDA2NTIsIDB4MDY1MiwgMHgwNjUyfSwgezB4MDY1MywgMHgwNjUzLCAweDA2NTMsIDB4MDY1M30sCisgICAgezB4MDY1NCwgMHgwNjU0LCAweDA2NTQsIDB4MDY1NH0sIHsweDA2NTUsIDB4MDY1NSwgMHgwNjU1LCAweDA2NTV9LAorICAgIHsweDA2NTYsIDB4MDY1NiwgMHgwNjU2LCAweDA2NTZ9LCB7MHgwNjU3LCAweDA2NTcsIDB4MDY1NywgMHgwNjU3fSwKKyAgICB7MHgwNjU4LCAweDA2NTgsIDB4MDY1OCwgMHgwNjU4fSwgezB4MDY1OSwgMHgwNjU5LCAweDA2NTksIDB4MDY1OX0sCisgICAgezB4MDY1QSwgMHgwNjVBLCAweDA2NUEsIDB4MDY1QX0sIHsweDA2NUIsIDB4MDY1QiwgMHgwNjVCLCAweDA2NUJ9LAorICAgIHsweDA2NUMsIDB4MDY1QywgMHgwNjVDLCAweDA2NUN9LCB7MHgwNjVELCAweDA2NUQsIDB4MDY1RCwgMHgwNjVEfSwKKyAgICB7MHgwNjVFLCAweDA2NUUsIDB4MDY1RSwgMHgwNjVFfSwgezB4MDY1RiwgMHgwNjVGLCAweDA2NUYsIDB4MDY1Rn0sCisgICAgezB4MDY2MCwgMHgwNjYwLCAweDA2NjAsIDB4MDY2MH0sIHsweDA2NjEsIDB4MDY2MSwgMHgwNjYxLCAweDA2NjF9LAorICAgIHsweDA2NjIsIDB4MDY2MiwgMHgwNjYyLCAweDA2NjJ9LCB7MHgwNjYzLCAweDA2NjMsIDB4MDY2MywgMHgwNjYzfSwKKyAgICB7MHgwNjY0LCAweDA2NjQsIDB4MDY2NCwgMHgwNjY0fSwgezB4MDY2NSwgMHgwNjY1LCAweDA2NjUsIDB4MDY2NX0sCisgICAgezB4MDY2NiwgMHgwNjY2LCAweDA2NjYsIDB4MDY2Nn0sIHsweDA2NjcsIDB4MDY2NywgMHgwNjY3LCAweDA2Njd9LAorICAgIHsweDA2NjgsIDB4MDY2OCwgMHgwNjY4LCAweDA2Njh9LCB7MHgwNjY5LCAweDA2NjksIDB4MDY2OSwgMHgwNjY5fSwKKyAgICB7MHgwNjZBLCAweDA2NkEsIDB4MDY2QSwgMHgwNjZBfSwgezB4MDY2QiwgMHgwNjZCLCAweDA2NkIsIDB4MDY2Qn0sCisgICAgezB4MDY2QywgMHgwNjZDLCAweDA2NkMsIDB4MDY2Q30sIHsweDA2NkQsIDB4MDY2RCwgMHgwNjZELCAweDA2NkR9LAorICAgIHsweDA2NkUsIDB4MDY2RSwgMHgwNjZFLCAweDA2NkV9LCB7MHgwNjZGLCAweDA2NkYsIDB4MDY2RiwgMHgwNjZGfSwKKyAgICB7MHgwNjcwLCAweDA2NzAsIDB4MDY3MCwgMHgwNjcwfSwgezB4RkI1MCwgMHhGQjUxLCAweEZCNTAsIDB4RkI1MX0sCisgICAgezB4MDY3MiwgMHgwNjcyLCAweDA2NzIsIDB4MDY3Mn0sIHsweDA2NzMsIDB4MDY3MywgMHgwNjczLCAweDA2NzN9LAorICAgIHsweDA2NzQsIDB4MDY3NCwgMHgwNjc0LCAweDA2NzR9LCB7MHgwNjc1LCAweDA2NzUsIDB4MDY3NSwgMHgwNjc1fSwKKyAgICB7MHgwNjc2LCAweDA2NzYsIDB4MDY3NiwgMHgwNjc2fSwgezB4MDY3NywgMHgwNjc3LCAweDA2NzcsIDB4MDY3N30sCisgICAgezB4MDY3OCwgMHgwNjc4LCAweDA2NzgsIDB4MDY3OH0sIHsweEZCNjYsIDB4RkI2NywgMHhGQjY4LCAweEZCNjl9LAorICAgIHsweEZCNUUsIDB4RkI1RiwgMHhGQjYwLCAweEZCNjF9LCB7MHhGQjUyLCAweEZCNTMsIDB4RkI1NCwgMHhGQjU1fSwKKyAgICB7MHgwNjdDLCAweDA2N0MsIDB4MDY3QywgMHgwNjdDfSwgezB4MDY3RCwgMHgwNjdELCAweDA2N0QsIDB4MDY3RH0sCisgICAgezB4RkI1NiwgMHhGQjU3LCAweEZCNTgsIDB4RkI1OX0sIHsweEZCNjIsIDB4RkI2MywgMHhGQjY0LCAweEZCNjV9LAorICAgIHsweEZCNUEsIDB4RkI1QiwgMHhGQjVDLCAweEZCNUR9LCB7MHgwNjgxLCAweDA2ODEsIDB4MDY4MSwgMHgwNjgxfSwKKyAgICB7MHgwNjgyLCAweDA2ODIsIDB4MDY4MiwgMHgwNjgyfSwgezB4RkI3NiwgMHhGQjc3LCAweEZCNzgsIDB4RkI3OX0sCisgICAgezB4RkI3MiwgMHhGQjczLCAweEZCNzQsIDB4RkI3NX0sIHsweDA2ODUsIDB4MDY4NSwgMHgwNjg1LCAweDA2ODV9LAorICAgIHsweEZCN0EsIDB4RkI3QiwgMHhGQjdDLCAweEZCN0R9LCB7MHhGQjdFLCAweEZCN0YsIDB4RkI4MCwgMHhGQjgxfSwKKyAgICB7MHhGQjg4LCAweEZCODksIDB4RkI4OCwgMHhGQjg5fSwgezB4MDY4OSwgMHgwNjg5LCAweDA2ODksIDB4MDY4OX0sCisgICAgezB4MDY4QSwgMHgwNjhBLCAweDA2OEEsIDB4MDY4QX0sIHsweDA2OEIsIDB4MDY4QiwgMHgwNjhCLCAweDA2OEJ9LAorICAgIHsweEZCODQsIDB4RkI4NSwgMHhGQjg0LCAweEZCODV9LCB7MHhGQjgyLCAweEZCODMsIDB4RkI4MiwgMHhGQjgzfSwKKyAgICB7MHhGQjg2LCAweEZCODcsIDB4RkI4NiwgMHhGQjg3fSwgezB4MDY4RiwgMHgwNjhGLCAweDA2OEYsIDB4MDY4Rn0sCisgICAgezB4MDY5MCwgMHgwNjkwLCAweDA2OTAsIDB4MDY5MH0sIHsweEZCOEMsIDB4RkI4RCwgMHhGQjhDLCAweEZCOER9LAorICAgIHsweDA2OTIsIDB4MDY5MiwgMHgwNjkyLCAweDA2OTJ9LCB7MHgwNjkzLCAweDA2OTMsIDB4MDY5MywgMHgwNjkzfSwKKyAgICB7MHgwNjk0LCAweDA2OTQsIDB4MDY5NCwgMHgwNjk0fSwgezB4MDY5NSwgMHgwNjk1LCAweDA2OTUsIDB4MDY5NX0sCisgICAgezB4MDY5NiwgMHgwNjk2LCAweDA2OTYsIDB4MDY5Nn0sIHsweDA2OTcsIDB4MDY5NywgMHgwNjk3LCAweDA2OTd9LAorICAgIHsweEZCOEEsIDB4RkI4QiwgMHhGQjhBLCAweEZCOEJ9LCB7MHgwNjk5LCAweDA2OTksIDB4MDY5OSwgMHgwNjk5fSwKKyAgICB7MHgwNjlBLCAweDA2OUEsIDB4MDY5QSwgMHgwNjlBfSwgezB4MDY5QiwgMHgwNjlCLCAweDA2OUIsIDB4MDY5Qn0sCisgICAgezB4MDY5QywgMHgwNjlDLCAweDA2OUMsIDB4MDY5Q30sIHsweDA2OUQsIDB4MDY5RCwgMHgwNjlELCAweDA2OUR9LAorICAgIHsweDA2OUUsIDB4MDY5RSwgMHgwNjlFLCAweDA2OUV9LCB7MHgwNjlGLCAweDA2OUYsIDB4MDY5RiwgMHgwNjlGfSwKKyAgICB7MHgwNkEwLCAweDA2QTAsIDB4MDZBMCwgMHgwNkEwfSwgezB4MDZBMSwgMHgwNkExLCAweDA2QTEsIDB4MDZBMX0sCisgICAgezB4MDZBMiwgMHgwNkEyLCAweDA2QTIsIDB4MDZBMn0sIHsweDA2QTMsIDB4MDZBMywgMHgwNkEzLCAweDA2QTN9LAorICAgIHsweEZCNkEsIDB4RkI2QiwgMHhGQjZDLCAweEZCNkR9LCB7MHgwNkE1LCAweDA2QTUsIDB4MDZBNSwgMHgwNkE1fSwKKyAgICB7MHhGQjZFLCAweEZCNkYsIDB4RkI3MCwgMHhGQjcxfSwgezB4MDZBNywgMHgwNkE3LCAweDA2QTcsIDB4MDZBN30sCisgICAgezB4MDZBOCwgMHgwNkE4LCAweDA2QTgsIDB4MDZBOH0sIHsweEZCOEUsIDB4RkI4RiwgMHhGQjkwLCAweEZCOTF9LAorICAgIHsweDA2QUEsIDB4MDZBQSwgMHgwNkFBLCAweDA2QUF9LCB7MHgwNkFCLCAweDA2QUIsIDB4MDZBQiwgMHgwNkFCfSwKKyAgICB7MHgwNkFDLCAweDA2QUMsIDB4MDZBQywgMHgwNkFDfSwgezB4RkJEMywgMHhGQkQ0LCAweEZCRDUsIDB4RkJENn0sCisgICAgezB4MDZBRSwgMHgwNkFFLCAweDA2QUUsIDB4MDZBRX0sIHsweEZCOTIsIDB4RkI5MywgMHhGQjk0LCAweEZCOTV9LAorICAgIHsweDA2QjAsIDB4MDZCMCwgMHgwNkIwLCAweDA2QjB9LCB7MHhGQjlBLCAweEZCOUIsIDB4RkI5QywgMHhGQjlEfSwKKyAgICB7MHgwNkIyLCAweDA2QjIsIDB4MDZCMiwgMHgwNkIyfSwgezB4RkI5NiwgMHhGQjk3LCAweEZCOTgsIDB4RkI5OX0sCisgICAgezB4MDZCNCwgMHgwNkI0LCAweDA2QjQsIDB4MDZCNH0sIHsweDA2QjUsIDB4MDZCNSwgMHgwNkI1LCAweDA2QjV9LAorICAgIHsweDA2QjYsIDB4MDZCNiwgMHgwNkI2LCAweDA2QjZ9LCB7MHgwNkI3LCAweDA2QjcsIDB4MDZCNywgMHgwNkI3fSwKKyAgICB7MHgwNkI4LCAweDA2QjgsIDB4MDZCOCwgMHgwNkI4fSwgezB4MDZCOSwgMHgwNkI5LCAweDA2QjksIDB4MDZCOX0sCisgICAgezB4RkI5RSwgMHhGQjlGLCAweEZCRTgsIDB4RkJFOX0sIHsweEZCQTAsIDB4RkJBMSwgMHhGQkEyLCAweEZCQTN9LAorICAgIHsweDA2QkMsIDB4MDZCQywgMHgwNkJDLCAweDA2QkN9LCB7MHgwNkJELCAweDA2QkQsIDB4MDZCRCwgMHgwNkJEfSwKKyAgICB7MHhGQkFBLCAweEZCQUIsIDB4RkJBQywgMHhGQkFEfSwgezB4MDZCRiwgMHgwNkJGLCAweDA2QkYsIDB4MDZCRn0sCisgICAgezB4RkJBNCwgMHhGQkE1LCAweEZCQTQsIDB4RkJBNX0sIHsweEZCQTYsIDB4RkJBNywgMHhGQkE4LCAweEZCQTl9LAorICAgIHsweDA2QzIsIDB4MDZDMiwgMHgwNkMyLCAweDA2QzJ9LCB7MHgwNkMzLCAweDA2QzMsIDB4MDZDMywgMHgwNkMzfSwKKyAgICB7MHgwNkM0LCAweDA2QzQsIDB4MDZDNCwgMHgwNkM0fSwgezB4RkJFMCwgMHhGQkUxLCAweEZCRTAsIDB4RkJFMX0sCisgICAgezB4RkJEOSwgMHhGQkRBLCAweEZCRDksIDB4RkJEQX0sIHsweEZCRDcsIDB4RkJEOCwgMHhGQkQ3LCAweEZCRDh9LAorICAgIHsweEZCREIsIDB4RkJEQywgMHhGQkRCLCAweEZCREN9LCB7MHhGQkUyLCAweEZCRTMsIDB4RkJFMiwgMHhGQkUzfSwKKyAgICB7MHgwNkNBLCAweDA2Q0EsIDB4MDZDQSwgMHgwNkNBfSwgezB4RkJERSwgMHhGQkRGLCAweEZCREUsIDB4RkJERn0sCisgICAgezB4RkJGQywgMHhGQkZELCAweEZCRkUsIDB4RkJGRn0sIHsweDA2Q0QsIDB4MDZDRCwgMHgwNkNELCAweDA2Q0R9LAorICAgIHsweDA2Q0UsIDB4MDZDRSwgMHgwNkNFLCAweDA2Q0V9LCB7MHgwNkNGLCAweDA2Q0YsIDB4MDZDRiwgMHgwNkNGfSwKKyAgICB7MHhGQkU0LCAweEZCRTUsIDB4RkJFNiwgMHhGQkU3fSwgezB4MDZEMSwgMHgwNkQxLCAweDA2RDEsIDB4MDZEMX0sCisgICAgezB4RkJBRSwgMHhGQkFGLCAweEZCQUUsIDB4RkJBRn0sIHsweEZCQjAsIDB4RkJCMSwgMHhGQkIwLCAweEZCQjF9LAorICAgIHsweDA2RDQsIDB4MDZENCwgMHgwNkQ0LCAweDA2RDR9LCB7MHgwNkQ1LCAweDA2RDUsIDB4MDZENSwgMHgwNkQ1fSwKIH07CiBzdGF0aWMgY29uc3QgRlhfQVJBQUxFRiBnc19GWF9BbGVmVGFibGVbXSA9IHsKICAgICB7MHgwNjIyLCAweEZFRjV9LApAQCAtMjAwLDE5NSArMTEwLDE5MiBAQAogICAgIHsweDA2MjcsIDB4RkVGQn0sCiB9Owogc3RhdGljIGNvbnN0IEZYX0FSQVNIQUREQSBnc19GWF9TaGFkZGFUYWJsZVtdID0gewotICAgIHsweDA2NEMsCTB4RkM1RX0sCi0gICAgezB4MDY0RCwJMHhGQzVGfSwKLSAgICB7MHgwNjRFLAkweEZDNjB9LAotICAgIHsweDA2NEYsCTB4RkM2MX0sCi0gICAgezB4MDY1MCwJMHhGQzYyfSwKKyAgICB7MHgwNjRDLCAweEZDNUV9LCB7MHgwNjRELCAweEZDNUZ9LCB7MHgwNjRFLCAweEZDNjB9LAorICAgIHsweDA2NEYsIDB4RkM2MX0sIHsweDA2NTAsIDB4RkM2Mn0sCiB9OwotRlhfTFBDQVJCRk9STVRBQkxFIEZYX0dldEFyYWJpY0Zvcm1UYWJsZShGWF9XQ0hBUiB1bmljb2RlKQotewotICAgIGlmICh1bmljb2RlIDwgMHg2MjIgfHwgdW5pY29kZSA+IDB4NmQ1KSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gZ19GWF9BcmFiaWNGb3JtVGFibGVzICsgdW5pY29kZSAtIDB4NjIyOworRlhfTFBDQVJCRk9STVRBQkxFIEZYX0dldEFyYWJpY0Zvcm1UYWJsZShGWF9XQ0hBUiB1bmljb2RlKSB7CisgIGlmICh1bmljb2RlIDwgMHg2MjIgfHwgdW5pY29kZSA+IDB4NmQ1KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIGdfRlhfQXJhYmljRm9ybVRhYmxlcyArIHVuaWNvZGUgLSAweDYyMjsKIH0KLUZYX1dDSEFSIEZYX0dldEFyYWJpY0Zyb21BbGVmVGFibGUoRlhfV0NIQVIgYWxlZikKLXsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBzX2lBbGVmQ291bnQgPSBzaXplb2YoZ3NfRlhfQWxlZlRhYmxlKSAvIHNpemVvZihGWF9BUkFBTEVGKTsKLSAgICBmb3IgKGludDMyX3QgaVN0YXJ0ID0gMDsgaVN0YXJ0IDwgc19pQWxlZkNvdW50OyBpU3RhcnQgKyspIHsKLSAgICAgICAgY29uc3QgRlhfQVJBQUxFRiAmdiA9IGdzX0ZYX0FsZWZUYWJsZVtpU3RhcnRdOwotICAgICAgICBpZiAodi53QWxlZiA9PSBhbGVmKSB7Ci0gICAgICAgICAgICByZXR1cm4gdi53SXNvbGF0ZWQ7Ci0gICAgICAgIH0KK0ZYX1dDSEFSIEZYX0dldEFyYWJpY0Zyb21BbGVmVGFibGUoRlhfV0NIQVIgYWxlZikgeworICBzdGF0aWMgY29uc3QgaW50MzJfdCBzX2lBbGVmQ291bnQgPQorICAgICAgc2l6ZW9mKGdzX0ZYX0FsZWZUYWJsZSkgLyBzaXplb2YoRlhfQVJBQUxFRik7CisgIGZvciAoaW50MzJfdCBpU3RhcnQgPSAwOyBpU3RhcnQgPCBzX2lBbGVmQ291bnQ7IGlTdGFydCsrKSB7CisgICAgY29uc3QgRlhfQVJBQUxFRiYgdiA9IGdzX0ZYX0FsZWZUYWJsZVtpU3RhcnRdOworICAgIGlmICh2LndBbGVmID09IGFsZWYpIHsKKyAgICAgIHJldHVybiB2LndJc29sYXRlZDsKICAgICB9Ci0gICAgcmV0dXJuIGFsZWY7CisgIH0KKyAgcmV0dXJuIGFsZWY7CiB9Ci1GWF9XQ0hBUiBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUoRlhfV0NIQVIgc2hhZGRhKQotewotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IHNfaVNoYWRkYUNvdW50ID0gc2l6ZW9mKGdzX0ZYX1NoYWRkYVRhYmxlKSAvIHNpemVvZihGWF9BUkFTSEFEREEpOwotICAgIGZvciAoaW50MzJfdCBpU3RhcnQgPSAwOyBpU3RhcnQgPCBzX2lTaGFkZGFDb3VudDsgaVN0YXJ0ICsrKSB7Ci0gICAgICAgIGNvbnN0IEZYX0FSQVNIQUREQSAmdiA9IGdzX0ZYX1NoYWRkYVRhYmxlW2lTdGFydF07Ci0gICAgICAgIGlmICh2LndTaGFkZGEgPT0gc2hhZGRhKSB7Ci0gICAgICAgICAgICByZXR1cm4gdi53SXNvbGF0ZWQ7Ci0gICAgICAgIH0KK0ZYX1dDSEFSIEZYX0dldEFyYWJpY0Zyb21TaGFkZGFUYWJsZShGWF9XQ0hBUiBzaGFkZGEpIHsKKyAgc3RhdGljIGNvbnN0IGludDMyX3Qgc19pU2hhZGRhQ291bnQgPQorICAgICAgc2l6ZW9mKGdzX0ZYX1NoYWRkYVRhYmxlKSAvIHNpemVvZihGWF9BUkFTSEFEREEpOworICBmb3IgKGludDMyX3QgaVN0YXJ0ID0gMDsgaVN0YXJ0IDwgc19pU2hhZGRhQ291bnQ7IGlTdGFydCsrKSB7CisgICAgY29uc3QgRlhfQVJBU0hBRERBJiB2ID0gZ3NfRlhfU2hhZGRhVGFibGVbaVN0YXJ0XTsKKyAgICBpZiAodi53U2hhZGRhID09IHNoYWRkYSkgeworICAgICAgcmV0dXJuIHYud0lzb2xhdGVkOwogICAgIH0KLSAgICByZXR1cm4gc2hhZGRhOworICB9CisgIHJldHVybiBzaGFkZGE7CiB9CiAjaWZkZWYgX19jcGx1c3BsdXMKIH07CiAjZW5kaWYKLUlGWF9BcmFiaWNDaGFyKiBJRlhfQXJhYmljQ2hhcjo6Q3JlYXRlKCkKLXsKLSAgICByZXR1cm4gRlhfTkVXIENGWF9BcmFiaWNDaGFyOworSUZYX0FyYWJpY0NoYXIqIElGWF9BcmFiaWNDaGFyOjpDcmVhdGUoKSB7CisgIHJldHVybiBGWF9ORVcgQ0ZYX0FyYWJpY0NoYXI7CiB9Ci1GWF9CT09MIENGWF9BcmFiaWNDaGFyOjpJc0FyYWJpY0NoYXIoRlhfV0NIQVIgd2NoKSBjb25zdAotewotICAgIEZYX0RXT1JEIGR3UmV0ID0gKGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXSAmIEZYX0NIQVJUWVBFQklUU01BU0spOwotICAgIHJldHVybiBkd1JldCA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmOworRlhfQk9PTCBDRlhfQXJhYmljQ2hhcjo6SXNBcmFiaWNDaGFyKEZYX1dDSEFSIHdjaCkgY29uc3QgeworICBGWF9EV09SRCBkd1JldCA9CisgICAgICAoZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7CisgIHJldHVybiBkd1JldCA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmOwogfQotRlhfQk9PTCBDRlhfQXJhYmljQ2hhcjo6SXNBcmFiaWNGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiBGWF9DSEFSVFlQRUJJVFNNQVNLKSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNGb3JtOworRlhfQk9PTCBDRlhfQXJhYmljQ2hhcjo6SXNBcmFiaWNGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0IHsKKyAgcmV0dXJuIChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJgorICAgICAgICAgIEZYX0NIQVJUWVBFQklUU01BU0spID09IEZYX0NIQVJUWVBFX0FyYWJpY0Zvcm07CiB9Ci1GWF9XQ0hBUiBDRlhfQXJhYmljQ2hhcjo6R2V0Rm9ybUNoYXIoRlhfV0NIQVIgd2NoLCBGWF9XQ0hBUiBwcmV2LCBGWF9XQ0hBUiBuZXh0KSBjb25zdAotewotICAgIENGWF9DaGFyIGMod2NoLCBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0pOwotICAgIENGWF9DaGFyIHAocHJldiwgZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRClwcmV2XSk7Ci0gICAgQ0ZYX0NoYXIgbihuZXh0LCBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKW5leHRdKTsKLSAgICByZXR1cm4gR2V0Rm9ybUNoYXIoJmMsICZwLCAmbik7CitGWF9XQ0hBUiBDRlhfQXJhYmljQ2hhcjo6R2V0Rm9ybUNoYXIoRlhfV0NIQVIgd2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgbmV4dCkgY29uc3QgeworICBDRlhfQ2hhciBjKHdjaCwgZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdKTsKKyAgQ0ZYX0NoYXIgcChwcmV2LCBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXByZXZdKTsKKyAgQ0ZYX0NoYXIgbihuZXh0LCBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKW5leHRdKTsKKyAgcmV0dXJuIEdldEZvcm1DaGFyKCZjLCAmcCwgJm4pOwogfQotRlhfV0NIQVIgQ0ZYX0FyYWJpY0NoYXI6OkdldEZvcm1DaGFyKGNvbnN0IENGWF9DaGFyICpjdXIsIGNvbnN0IENGWF9DaGFyICpwcmV2LCBjb25zdCBDRlhfQ2hhciAqbmV4dCkgY29uc3QKLXsKLSAgICBGWF9DSEFSVFlQRSBlQ3VyOwotICAgIEZYX1dDSEFSIHdDdXI7Ci0gICAgRlhfTFBDQVJCRk9STVRBQkxFIGZ0ID0gUGFyc2VDaGFyKGN1ciwgd0N1ciwgZUN1cik7Ci0gICAgaWYgKGVDdXIgPCBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmIHx8IGVDdXIgPj0gRlhfQ0hBUlRZUEVfQXJhYmljTm9ybWFsKSB7Ci0gICAgICAgIHJldHVybiB3Q3VyOwotICAgIH0KLSAgICBGWF9DSEFSVFlQRSBlUHJldjsKLSAgICBGWF9XQ0hBUiB3UHJldjsKLSAgICBQYXJzZUNoYXIocHJldiwgd1ByZXYsIGVQcmV2KTsKLSAgICBpZiAod1ByZXYgPT0gMHgwNjQ0ICYmIGVDdXIgPT0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgewotICAgICAgICByZXR1cm4gMHhGRUZGOwotICAgIH0KLSAgICBGWF9DSEFSVFlQRSBlTmV4dDsKLSAgICBGWF9XQ0hBUiB3TmV4dDsKLSAgICBQYXJzZUNoYXIobmV4dCwgd05leHQsIGVOZXh0KTsKLSAgICBGWF9CT09MIGJBbGVmID0gKGVOZXh0ID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgJiYgd0N1ciA9PSAweDY0NCk7Ci0gICAgaWYgKGVQcmV2IDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgewotICAgICAgICBpZiAoYkFsZWYpIHsKLSAgICAgICAgICAgIHJldHVybiBGWF9HZXRBcmFiaWNGcm9tQWxlZlRhYmxlKHdOZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAoZU5leHQgPCBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSA/IGZ0LT53SXNvbGF0ZWQgOiBmdC0+d0luaXRpYWw7Ci0gICAgICAgIH0KK0ZYX1dDSEFSIENGWF9BcmFiaWNDaGFyOjpHZXRGb3JtQ2hhcihjb25zdCBDRlhfQ2hhciogY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DaGFyKiBwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DaGFyKiBuZXh0KSBjb25zdCB7CisgIEZYX0NIQVJUWVBFIGVDdXI7CisgIEZYX1dDSEFSIHdDdXI7CisgIEZYX0xQQ0FSQkZPUk1UQUJMRSBmdCA9IFBhcnNlQ2hhcihjdXIsIHdDdXIsIGVDdXIpOworICBpZiAoZUN1ciA8IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgfHwgZUN1ciA+PSBGWF9DSEFSVFlQRV9BcmFiaWNOb3JtYWwpIHsKKyAgICByZXR1cm4gd0N1cjsKKyAgfQorICBGWF9DSEFSVFlQRSBlUHJldjsKKyAgRlhfV0NIQVIgd1ByZXY7CisgIFBhcnNlQ2hhcihwcmV2LCB3UHJldiwgZVByZXYpOworICBpZiAod1ByZXYgPT0gMHgwNjQ0ICYmIGVDdXIgPT0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgeworICAgIHJldHVybiAweEZFRkY7CisgIH0KKyAgRlhfQ0hBUlRZUEUgZU5leHQ7CisgIEZYX1dDSEFSIHdOZXh0OworICBQYXJzZUNoYXIobmV4dCwgd05leHQsIGVOZXh0KTsKKyAgRlhfQk9PTCBiQWxlZiA9IChlTmV4dCA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmIHdDdXIgPT0gMHg2NDQpOworICBpZiAoZVByZXYgPCBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSB7CisgICAgaWYgKGJBbGVmKSB7CisgICAgICByZXR1cm4gRlhfR2V0QXJhYmljRnJvbUFsZWZUYWJsZSh3TmV4dCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGJBbGVmKSB7Ci0gICAgICAgICAgICB3Q3VyID0gRlhfR2V0QXJhYmljRnJvbUFsZWZUYWJsZSh3TmV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gKGVQcmV2ICE9IEZYX0NIQVJUWVBFX0FyYWJpY0Rpc3RvcnRpb24pID8gd0N1ciA6ICsrIHdDdXI7Ci0gICAgICAgIH0gZWxzZSBpZiAoZVByZXYgPT0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZiB8fCBlUHJldiA9PSBGWF9DSEFSVFlQRV9BcmFiaWNTcGVjaWFsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGVOZXh0IDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgPyBmdC0+d0lzb2xhdGVkIDogZnQtPndJbml0aWFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChlTmV4dCA8IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpID8gZnQtPndGaW5hbCA6IGZ0LT53TWVkaWFsOwotICAgICAgICB9CisgICAgICByZXR1cm4gKGVOZXh0IDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgPyBmdC0+d0lzb2xhdGVkIDogZnQtPndJbml0aWFsOwogICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoYkFsZWYpIHsKKyAgICAgIHdDdXIgPSBGWF9HZXRBcmFiaWNGcm9tQWxlZlRhYmxlKHdOZXh0KTsKKyAgICAgIHJldHVybiAoZVByZXYgIT0gRlhfQ0hBUlRZUEVfQXJhYmljRGlzdG9ydGlvbikgPyB3Q3VyIDogKyt3Q3VyOworICAgIH0gZWxzZSBpZiAoZVByZXYgPT0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZiB8fAorICAgICAgICAgICAgICAgZVByZXYgPT0gRlhfQ0hBUlRZUEVfQXJhYmljU3BlY2lhbCkgeworICAgICAgcmV0dXJuIChlTmV4dCA8IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpID8gZnQtPndJc29sYXRlZCA6IGZ0LT53SW5pdGlhbDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIChlTmV4dCA8IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpID8gZnQtPndGaW5hbCA6IGZ0LT53TWVkaWFsOworICAgIH0KKyAgfQogfQotRlhfTFBDQVJCRk9STVRBQkxFIENGWF9BcmFiaWNDaGFyOjpQYXJzZUNoYXIoY29uc3QgQ0ZYX0NoYXIgKnBUQywgRlhfV0NIQVIgJndDaGFyLCBGWF9DSEFSVFlQRSAmZVR5cGUpIGNvbnN0Ci17Ci0gICAgaWYgKHBUQyA9PSBOVUxMKSB7Ci0gICAgICAgIGVUeXBlID0gRlhfQ0hBUlRZUEVfVW5rbm93bjsKLSAgICAgICAgd0NoYXIgPSAweEZFRkY7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBlVHlwZSA9IChGWF9DSEFSVFlQRSlwVEMtPkdldENoYXJUeXBlKCk7Ci0gICAgd0NoYXIgPSAoRlhfV0NIQVIpcFRDLT5tX3dDaGFyQ29kZTsKLSAgICBGWF9MUENBUkJGT1JNVEFCTEUgcEZUID0gRlhfR2V0QXJhYmljRm9ybVRhYmxlKHdDaGFyKTsKLSAgICBpZiAocEZUID09IE5VTEwgfHwgZVR5cGUgPj0gRlhfQ0hBUlRZUEVfQXJhYmljTm9ybWFsKSB7Ci0gICAgICAgIGVUeXBlID0gRlhfQ0hBUlRZUEVfVW5rbm93bjsKLSAgICB9Ci0gICAgcmV0dXJuIHBGVDsKK0ZYX0xQQ0FSQkZPUk1UQUJMRSBDRlhfQXJhYmljQ2hhcjo6UGFyc2VDaGFyKGNvbnN0IENGWF9DaGFyKiBwVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiYgd0NoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSVFlQRSYgZVR5cGUpIGNvbnN0IHsKKyAgaWYgKHBUQyA9PSBOVUxMKSB7CisgICAgZVR5cGUgPSBGWF9DSEFSVFlQRV9Vbmtub3duOworICAgIHdDaGFyID0gMHhGRUZGOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVUeXBlID0gKEZYX0NIQVJUWVBFKXBUQy0+R2V0Q2hhclR5cGUoKTsKKyAgd0NoYXIgPSAoRlhfV0NIQVIpcFRDLT5tX3dDaGFyQ29kZTsKKyAgRlhfTFBDQVJCRk9STVRBQkxFIHBGVCA9IEZYX0dldEFyYWJpY0Zvcm1UYWJsZSh3Q2hhcik7CisgIGlmIChwRlQgPT0gTlVMTCB8fCBlVHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNOb3JtYWwpIHsKKyAgICBlVHlwZSA9IEZYX0NIQVJUWVBFX1Vua25vd247CisgIH0KKyAgcmV0dXJuIHBGVDsKIH0KLXZvaWQgRlhfQmlkaVJldmVyc2VTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBpU3RhcnQsIGludDMyX3QgaUNvdW50KQotewotICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCB3c1RleHQuR2V0TGVuZ3RoKCkpOwotICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPj0gMCAmJiBpU3RhcnQgKyBpQ291bnQgPD0gd3NUZXh0LkdldExlbmd0aCgpKTsKLSAgICBGWF9XQ0hBUiB3Y2g7Ci0gICAgRlhfV0NIQVIqIHBTdGFydCA9IChGWF9XQ0hBUiopKGNvbnN0IEZYX1dDSEFSKil3c1RleHQ7Ci0gICAgcFN0YXJ0ICs9IGlTdGFydDsKLSAgICBGWF9XQ0hBUiogcEVuZCA9IHBTdGFydCArIGlDb3VudCAtIDE7Ci0gICAgd2hpbGUgKHBTdGFydCA8IHBFbmQpIHsKLSAgICAgICAgd2NoID0gKnBTdGFydDsKLSAgICAgICAgKnBTdGFydCArKyA9ICpwRW5kOwotICAgICAgICAqcEVuZCAtLSA9IHdjaDsKLSAgICB9Cit2b2lkIEZYX0JpZGlSZXZlcnNlU3RyaW5nKENGWF9XaWRlU3RyaW5nJiB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCkgeworICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgd3NUZXh0LkdldExlbmd0aCgpKTsKKyAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+PSAwICYmIGlTdGFydCArIGlDb3VudCA8PSB3c1RleHQuR2V0TGVuZ3RoKCkpOworICBGWF9XQ0hBUiB3Y2g7CisgIEZYX1dDSEFSKiBwU3RhcnQgPSAoRlhfV0NIQVIqKShjb25zdCBGWF9XQ0hBUiopd3NUZXh0OworICBwU3RhcnQgKz0gaVN0YXJ0OworICBGWF9XQ0hBUiogcEVuZCA9IHBTdGFydCArIGlDb3VudCAtIDE7CisgIHdoaWxlIChwU3RhcnQgPCBwRW5kKSB7CisgICAgd2NoID0gKnBTdGFydDsKKyAgICAqcFN0YXJ0KysgPSAqcEVuZDsKKyAgICAqcEVuZC0tID0gd2NoOworICB9CiB9Ci12b2lkIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihDRlhfSW50MzJBcnJheSAmdmFsdWVzLCBpbnQzMl90IGlTdGFydCwgaW50MzJfdCBpQ291bnQsIGludDMyX3QgaVZhbHVlKQotewotICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPD0gdmFsdWVzLkdldFNpemUoKSk7Ci0gICAgRlhTWVNfYXNzZXJ0KGlTdGFydCAtIGlDb3VudCA+IC0xKTsKLSAgICBmb3IgKGludDMyX3QgaSA9IGlTdGFydCAtIDE7IGkgPj0gaVN0YXJ0IC0gaUNvdW50OyBpIC0tKSB7Ci0gICAgICAgIHZhbHVlcy5TZXRBdChpLCBpVmFsdWUpOwotICAgIH0KK3ZvaWQgRlhfQmlkaVNldERlZmVycmVkUnVuKENGWF9JbnQzMkFycmF5JiB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWUpIHsKKyAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8PSB2YWx1ZXMuR2V0U2l6ZSgpKTsKKyAgRlhTWVNfYXNzZXJ0KGlTdGFydCAtIGlDb3VudCA+IC0xKTsKKyAgZm9yIChpbnQzMl90IGkgPSBpU3RhcnQgLSAxOyBpID49IGlTdGFydCAtIGlDb3VudDsgaS0tKSB7CisgICAgdmFsdWVzLlNldEF0KGksIGlWYWx1ZSk7CisgIH0KIH0KIGNvbnN0IGludDMyX3QgZ2NfRlhfQmlkaU5UeXBlc1tdID0gewotICAgIEZYX0JJRElDTEFTU19OLAotICAgIEZYX0JJRElDTEFTU19MLAotICAgIEZYX0JJRElDTEFTU19SLAotICAgIEZYX0JJRElDTEFTU19BTiwKLSAgICBGWF9CSURJQ0xBU1NfRU4sCi0gICAgRlhfQklESUNMQVNTX0FMLAotICAgIEZYX0JJRElDTEFTU19OU00sCi0gICAgRlhfQklESUNMQVNTX0NTLAotICAgIEZYX0JJRElDTEFTU19FUywKLSAgICBGWF9CSURJQ0xBU1NfRVQsCi0gICAgRlhfQklESUNMQVNTX0JOLAotICAgIEZYX0JJRElDTEFTU19CTiwKLSAgICBGWF9CSURJQ0xBU1NfTiwKLSAgICBGWF9CSURJQ0xBU1NfQiwKLSAgICBGWF9CSURJQ0xBU1NfUkxPLAotICAgIEZYX0JJRElDTEFTU19STEUsCi0gICAgRlhfQklESUNMQVNTX0xSTywKLSAgICBGWF9CSURJQ0xBU1NfTFJFLAotICAgIEZYX0JJRElDTEFTU19QREYsCi0gICAgRlhfQklESUNMQVNTX09OLAorICAgIEZYX0JJRElDTEFTU19OLCAgIEZYX0JJRElDTEFTU19MLCAgIEZYX0JJRElDTEFTU19SLCAgIEZYX0JJRElDTEFTU19BTiwKKyAgICBGWF9CSURJQ0xBU1NfRU4sICBGWF9CSURJQ0xBU1NfQUwsICBGWF9CSURJQ0xBU1NfTlNNLCBGWF9CSURJQ0xBU1NfQ1MsCisgICAgRlhfQklESUNMQVNTX0VTLCAgRlhfQklESUNMQVNTX0VULCAgRlhfQklESUNMQVNTX0JOLCAgRlhfQklESUNMQVNTX0JOLAorICAgIEZYX0JJRElDTEFTU19OLCAgIEZYX0JJRElDTEFTU19CLCAgIEZYX0JJRElDTEFTU19STE8sIEZYX0JJRElDTEFTU19STEUsCisgICAgRlhfQklESUNMQVNTX0xSTywgRlhfQklESUNMQVNTX0xSRSwgRlhfQklESUNMQVNTX1BERiwgRlhfQklESUNMQVNTX09OLAogfTsKLXZvaWQgRlhfQmlkaUNsYXNzaWZ5KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIENGWF9JbnQzMkFycmF5ICZjbGFzc2VzLCBGWF9CT09MIGJXUykKLXsKLSAgICBGWFNZU19hc3NlcnQod3NUZXh0LkdldExlbmd0aCgpID09IGNsYXNzZXMuR2V0U2l6ZSgpKTsKLSAgICBpbnQzMl90IGlDb3VudCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKLSAgICBjb25zdCBGWF9XQ0hBUiogcHdzU3RhcnQgPSAoY29uc3QgRlhfV0NIQVIqKXdzVGV4dDsKLSAgICBGWF9XQ0hBUiB3Y2g7Ci0gICAgaW50MzJfdCBpQ2xzOwotICAgIGlmIChiV1MpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICB3Y2ggPSAqcHdzU3RhcnQgKys7Ci0gICAgICAgICAgICBpQ2xzID0gKChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4gRlhfQklESUNMQVNTQklUUyk7Ci0gICAgICAgICAgICBjbGFzc2VzLlNldEF0KGksIGlDbHMpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICB3Y2ggPSAqcHdzU3RhcnQgKys7Ci0gICAgICAgICAgICBpQ2xzID0gKChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4gRlhfQklESUNMQVNTQklUUyk7Ci0gICAgICAgICAgICBjbGFzc2VzLlNldEF0KGksIGdjX0ZYX0JpZGlOVHlwZXNbaUNsc10pOwotICAgICAgICB9Cit2b2lkIEZYX0JpZGlDbGFzc2lmeShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXUykgeworICBGWFNZU19hc3NlcnQod3NUZXh0LkdldExlbmd0aCgpID09IGNsYXNzZXMuR2V0U2l6ZSgpKTsKKyAgaW50MzJfdCBpQ291bnQgPSB3c1RleHQuR2V0TGVuZ3RoKCk7CisgIGNvbnN0IEZYX1dDSEFSKiBwd3NTdGFydCA9IChjb25zdCBGWF9XQ0hBUiopd3NUZXh0OworICBGWF9XQ0hBUiB3Y2g7CisgIGludDMyX3QgaUNsczsKKyAgaWYgKGJXUykgeworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgICB3Y2ggPSAqcHdzU3RhcnQrKzsKKyAgICAgIGlDbHMgPSAoKGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXSAmCisgICAgICAgICAgICAgICBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4KKyAgICAgICAgICAgICAgRlhfQklESUNMQVNTQklUUyk7CisgICAgICBjbGFzc2VzLlNldEF0KGksIGlDbHMpOwogICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgd2NoID0gKnB3c1N0YXJ0Kys7CisgICAgICBpQ2xzID0gKChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJgorICAgICAgICAgICAgICAgRlhfQklESUNMQVNTQklUU01BU0spID4+CisgICAgICAgICAgICAgIEZYX0JJRElDTEFTU0JJVFMpOworICAgICAgY2xhc3Nlcy5TZXRBdChpLCBnY19GWF9CaWRpTlR5cGVzW2lDbHNdKTsKKyAgICB9CisgIH0KIH0KLWludDMyX3QgRlhfQmlkaVJlc29sdmVFeHBsaWNpdChpbnQzMl90IGlCYXNlTGV2ZWwsIGludDMyX3QgaURpcmVjdGlvbiwgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMsIGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlDb3VudCwgaW50MzJfdCBpTmVzdCkKLXsKLSAgICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMICYmIGlOZXN0ID49IDApOwotICAgIEZYU1lTX2Fzc2VydChjbGFzc2VzLkdldFNpemUoKSA9PSBsZXZlbHMuR2V0U2l6ZSgpKTsKLSAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID49IDAgJiYgaVN0YXJ0IDwgY2xhc3Nlcy5HZXRTaXplKCkpOwotICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPj0gMCAmJiBpU3RhcnQgKyBpQ291bnQgPD0gY2xhc3Nlcy5HZXRTaXplKCkpOwotICAgIGlmIChpQ291bnQgPCAxKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KK2ludDMyX3QgRlhfQmlkaVJlc29sdmVFeHBsaWNpdChpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBsZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTmVzdCkgeworICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMICYmIGlOZXN0ID49IDApOworICBGWFNZU19hc3NlcnQoY2xhc3Nlcy5HZXRTaXplKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgIEZYU1lTX2Fzc2VydChpU3RhcnQgPj0gMCAmJiBpU3RhcnQgPCBjbGFzc2VzLkdldFNpemUoKSk7CisgIEZYU1lTX2Fzc2VydChpQ291bnQgPj0gMCAmJiBpU3RhcnQgKyBpQ291bnQgPD0gY2xhc3Nlcy5HZXRTaXplKCkpOworICBpZiAoaUNvdW50IDwgMSkgeworICAgIHJldHVybiAwOworICB9CiAjaWYgMAogICAgIGludDMyX3QgaUxhc3ROZXN0ID0gaU5lc3Q7CiAjZW5kaWYKLSAgICBpbnQzMl90IGlTaXplID0gY2xhc3Nlcy5HZXRTaXplKCk7Ci0gICAgaW50MzJfdCBpID0gaVN0YXJ0LCBpQ3VyLCBpQ2xzOwotICAgIGZvciAoOyBpIDwgaVNpemUgJiYgaUNvdW50ID4gMDsgaSArKywgaUNvdW50IC0tKSB7Ci0gICAgICAgIGlDdXIgPSBpQ2xzID0gY2xhc3Nlcy5HZXRBdChpKTsKKyAgaW50MzJfdCBpU2l6ZSA9IGNsYXNzZXMuR2V0U2l6ZSgpOworICBpbnQzMl90IGkgPSBpU3RhcnQsIGlDdXIsIGlDbHM7CisgIGZvciAoOyBpIDwgaVNpemUgJiYgaUNvdW50ID4gMDsgaSsrLCBpQ291bnQtLSkgeworICAgIGlDdXIgPSBpQ2xzID0gY2xhc3Nlcy5HZXRBdChpKTsKICNpZiAwCiAgICAgICAgIHN3aXRjaCAoaUNscykgewogICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJPOgpAQCAtNDQzLDc0ICszNTAsMTE1IEBACiAgICAgICAgIH0KICAgICAgICAgaUN1ciA9IGlDbHM7CiAjZW5kaWYKLSAgICAgICAgaWYgKGlEaXJlY3Rpb24gIT0gRlhfQklESUNMQVNTX04pIHsKLSAgICAgICAgICAgIGlDbHMgPSBpRGlyZWN0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpQ3VyICE9IEZYX0JJRElDTEFTU19CTikgewotICAgICAgICAgICAgY2xhc3Nlcy5TZXRBdChpLCBpQ2xzKTsKLSAgICAgICAgfQotICAgICAgICBsZXZlbHMuU2V0QXQoaSwgaUJhc2VMZXZlbCk7CisgICAgaWYgKGlEaXJlY3Rpb24gIT0gRlhfQklESUNMQVNTX04pIHsKKyAgICAgIGlDbHMgPSBpRGlyZWN0aW9uOwogICAgIH0KLSAgICByZXR1cm4gaSAtIGlTdGFydDsKKyAgICBpZiAoaUN1ciAhPSBGWF9CSURJQ0xBU1NfQk4pIHsKKyAgICAgIGNsYXNzZXMuU2V0QXQoaSwgaUNscyk7CisgICAgfQorICAgIGxldmVscy5TZXRBdChpLCBpQmFzZUxldmVsKTsKKyAgfQorICByZXR1cm4gaSAtIGlTdGFydDsKIH0KIGNvbnN0IGludDMyX3QgZ2NfRlhfQmlkaVdlYWtTdGF0ZXNbXVsxMF0gPSB7Ci0gICAge0ZYX0JXU2FvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU2NuLAlGWF9CV1NjbiwJRlhfQldTeGEsCUZYX0JXU3hhLAlGWF9CV1NhbywJRlhfQldTYW8sCUZYX0JXU2FvfSwKLSAgICB7RlhfQldTcm8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTcmEsCUZYX0JXU3JlLAlGWF9CV1N4YSwJRlhfQldTeHIsCUZYX0JXU3JvLAlGWF9CV1NybywJRlhfQldTcnR9LAotICAgIHtGWF9CV1NsbywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NsYSwJRlhfQldTbGUsCUZYX0JXU3hhLAlGWF9CV1N4bCwJRlhfQldTbG8sCUZYX0JXU2xvLAlGWF9CV1NsdH0sCi0gICAge0ZYX0JXU2FvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU2NuLAlGWF9CV1NjbiwJRlhfQldTeGEsCUZYX0JXU2FvLAlGWF9CV1NhbywJRlhfQldTYW8sCUZYX0JXU2FvfSwKLSAgICB7RlhfQldTcm8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTcmEsCUZYX0JXU3JlLAlGWF9CV1N4YSwJRlhfQldTcm8sCUZYX0JXU3JvLAlGWF9CV1NybywJRlhfQldTcnR9LAotICAgIHtGWF9CV1NsbywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NsYSwJRlhfQldTbGUsCUZYX0JXU3hhLAlGWF9CV1NsbywJRlhfQldTbG8sCUZYX0JXU2xvLAlGWF9CV1NsdH0sCi0gICAge0ZYX0JXU3JvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU3JhLAlGWF9CV1NyZSwJRlhfQldTeGEsCUZYX0JXU3J0LAlGWF9CV1NybywJRlhfQldTcm8sCUZYX0JXU3J0fSwKLSAgICB7RlhfQldTbG8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTbGEsCUZYX0JXU2xlLAlGWF9CV1N4YSwJRlhfQldTbHQsCUZYX0JXU2xvLAlGWF9CV1NsbywJRlhfQldTbHR9LAotICAgIHtGWF9CV1NhbywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NjbiwJRlhfQldTY24sCUZYX0JXU3hhLAlGWF9CV1NjbiwJRlhfQldTYWMsCUZYX0JXU2FvLAlGWF9CV1Nhb30sCi0gICAge0ZYX0JXU3JvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU3JhLAlGWF9CV1NyZSwJRlhfQldTeGEsCUZYX0JXU3JhLAlGWF9CV1NyYywJRlhfQldTcm8sCUZYX0JXU3J0fSwKLSAgICB7RlhfQldTcm8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTcmEsCUZYX0JXU3JlLAlGWF9CV1N4YSwJRlhfQldTcmUsCUZYX0JXU3JzLAlGWF9CV1NycywJRlhfQldTcmV0fSwKLSAgICB7RlhfQldTbG8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTbGEsCUZYX0JXU2xlLAlGWF9CV1N4YSwJRlhfQldTbGEsCUZYX0JXU2xjLAlGWF9CV1NsbywJRlhfQldTbHR9LAotICAgIHtGWF9CV1NsbywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NsYSwJRlhfQldTbGUsCUZYX0JXU3hhLAlGWF9CV1NsZSwJRlhfQldTbHMsCUZYX0JXU2xzLAlGWF9CV1NsZXR9LAotICAgIHtGWF9CV1NhbywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NjbiwJRlhfQldTY24sCUZYX0JXU3hhLAlGWF9CV1NhbywJRlhfQldTYW8sCUZYX0JXU2FvLAlGWF9CV1Nhb30sCi0gICAge0ZYX0JXU3JvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU3JhLAlGWF9CV1NyZSwJRlhfQldTeGEsCUZYX0JXU3JvLAlGWF9CV1NybywJRlhfQldTcm8sCUZYX0JXU3J0fSwKLSAgICB7RlhfQldTcm8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTcmEsCUZYX0JXU3JlLAlGWF9CV1N4YSwJRlhfQldTcm8sCUZYX0JXU3JvLAlGWF9CV1NybywJRlhfQldTcnR9LAotICAgIHtGWF9CV1NsbywJRlhfQldTeGwsCUZYX0JXU3hyLAlGWF9CV1NsYSwJRlhfQldTbGUsCUZYX0JXU3hhLAlGWF9CV1NsbywJRlhfQldTbG8sCUZYX0JXU2xvLAlGWF9CV1NsdH0sCi0gICAge0ZYX0JXU2xvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU2xhLAlGWF9CV1NsZSwJRlhfQldTeGEsCUZYX0JXU2xvLAlGWF9CV1NsbywJRlhfQldTbG8sCUZYX0JXU2x0fSwKLSAgICB7RlhfQldTcm8sCUZYX0JXU3hsLAlGWF9CV1N4ciwJRlhfQldTcmEsCUZYX0JXU3JlLAlGWF9CV1N4YSwJRlhfQldTcmV0LAlGWF9CV1NybywJRlhfQldTcm8sCUZYX0JXU3JldH0sCi0gICAge0ZYX0JXU2xvLAlGWF9CV1N4bCwJRlhfQldTeHIsCUZYX0JXU2xhLAlGWF9CV1NsZSwJRlhfQldTeGEsCUZYX0JXU2xldCwJRlhfQldTbG8sCUZYX0JXU2xvLAlGWF9CV1NsZXR9LAorICAgIHtGWF9CV1NhbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NjbiwgRlhfQldTY24sIEZYX0JXU3hhLCBGWF9CV1N4YSwKKyAgICAgRlhfQldTYW8sIEZYX0JXU2FvLCBGWF9CV1Nhb30sCisgICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3hyLAorICAgICBGWF9CV1NybywgRlhfQldTcm8sIEZYX0JXU3J0fSwKKyAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTeGwsCisgICAgIEZYX0JXU2xvLCBGWF9CV1NsbywgRlhfQldTbHR9LAorICAgIHtGWF9CV1NhbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NjbiwgRlhfQldTY24sIEZYX0JXU3hhLCBGWF9CV1NhbywKKyAgICAgRlhfQldTYW8sIEZYX0JXU2FvLCBGWF9CV1Nhb30sCisgICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3JvLAorICAgICBGWF9CV1NybywgRlhfQldTcm8sIEZYX0JXU3J0fSwKKyAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTbG8sCisgICAgIEZYX0JXU2xvLCBGWF9CV1NsbywgRlhfQldTbHR9LAorICAgIHtGWF9CV1NybywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NyYSwgRlhfQldTcmUsIEZYX0JXU3hhLCBGWF9CV1NydCwKKyAgICAgRlhfQldTcm8sIEZYX0JXU3JvLCBGWF9CV1NydH0sCisgICAge0ZYX0JXU2xvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2xhLCBGWF9CV1NsZSwgRlhfQldTeGEsIEZYX0JXU2x0LAorICAgICBGWF9CV1NsbywgRlhfQldTbG8sIEZYX0JXU2x0fSwKKyAgICB7RlhfQldTYW8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTY24sIEZYX0JXU2NuLCBGWF9CV1N4YSwgRlhfQldTY24sCisgICAgIEZYX0JXU2FjLCBGWF9CV1NhbywgRlhfQldTYW99LAorICAgIHtGWF9CV1NybywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NyYSwgRlhfQldTcmUsIEZYX0JXU3hhLCBGWF9CV1NyYSwKKyAgICAgRlhfQldTcmMsIEZYX0JXU3JvLCBGWF9CV1NydH0sCisgICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3JlLAorICAgICBGWF9CV1NycywgRlhfQldTcnMsIEZYX0JXU3JldH0sCisgICAge0ZYX0JXU2xvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2xhLCBGWF9CV1NsZSwgRlhfQldTeGEsIEZYX0JXU2xhLAorICAgICBGWF9CV1NsYywgRlhfQldTbG8sIEZYX0JXU2x0fSwKKyAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTbGUsCisgICAgIEZYX0JXU2xzLCBGWF9CV1NscywgRlhfQldTbGV0fSwKKyAgICB7RlhfQldTYW8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTY24sIEZYX0JXU2NuLCBGWF9CV1N4YSwgRlhfQldTYW8sCisgICAgIEZYX0JXU2FvLCBGWF9CV1NhbywgRlhfQldTYW99LAorICAgIHtGWF9CV1NybywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NyYSwgRlhfQldTcmUsIEZYX0JXU3hhLCBGWF9CV1NybywKKyAgICAgRlhfQldTcm8sIEZYX0JXU3JvLCBGWF9CV1NydH0sCisgICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3JvLAorICAgICBGWF9CV1NybywgRlhfQldTcm8sIEZYX0JXU3J0fSwKKyAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTbG8sCisgICAgIEZYX0JXU2xvLCBGWF9CV1NsbywgRlhfQldTbHR9LAorICAgIHtGWF9CV1NsbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NsYSwgRlhfQldTbGUsIEZYX0JXU3hhLCBGWF9CV1NsbywKKyAgICAgRlhfQldTbG8sIEZYX0JXU2xvLCBGWF9CV1NsdH0sCisgICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3JldCwKKyAgICAgRlhfQldTcm8sIEZYX0JXU3JvLCBGWF9CV1NyZXR9LAorICAgIHtGWF9CV1NsbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NsYSwgRlhfQldTbGUsIEZYX0JXU3hhLCBGWF9CV1NsZXQsCisgICAgIEZYX0JXU2xvLCBGWF9CV1NsbywgRlhfQldTbGV0fSwKIH07CiBjb25zdCBpbnQzMl90IGdjX0ZYX0JpZGlXZWFrQWN0aW9uc1tdWzEwXSA9IHsKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEEsIEZYX0JXQXh4UiwgRlhfQldBeHhSLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeHhOfSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEUsIEZYX0JXQXh4UiwgRlhfQldBeHhSLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEwsIEZYX0JXQXh4UiwgRlhfQldBeHhMLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEEsIEZYX0JXQXh4UiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeHhOfSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEUsIEZYX0JXQXh4UiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEwsIEZYX0JXQXh4UiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKLSAgICB7RlhfQldBTnh4LAlGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FFeEUsIEZYX0JXQU54UiwgRlhfQldBeEl4LCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBeEl4fSwKLSAgICB7RlhfQldBTnh4LAlGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FMeEwsIEZYX0JXQU54UiwgRlhfQldBeEl4LCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBeEl4fSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEEsIEZYX0JXQXh4UiwgRlhfQldBeHhBLCBGWF9CV0F4SXgsIEZYX0JXQXh4TiwgRlhfQldBeHhOfSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEUsIEZYX0JXQXh4UiwgRlhfQldBeHhBLCBGWF9CV0F4SXgsIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEUsIEZYX0JXQXh4UiwgRlhfQldBeHhFLCBGWF9CV0F4SXgsIEZYX0JXQXhJeCwgRlhfQldBeHhFfSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEwsIEZYX0JXQXh4UiwgRlhfQldBeHhBLCBGWF9CV0F4SXgsIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEwsIEZYX0JXQXh4UiwgRlhfQldBeHhMLCBGWF9CV0F4SXgsIEZYX0JXQXhJeCwgRlhfQldBeHhMfSwKLSAgICB7RlhfQldBTnh4LAlGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBQXh4LCBGWF9CV0FBeEEsIEZYX0JXQU54UiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTnhOfSwKLSAgICB7RlhfQldBTnh4LAlGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBQXh4LCBGWF9CV0FOeEUsIEZYX0JXQU54UiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTkl4fSwKLSAgICB7RlhfQldBTnh4LAlGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FFeEUsIEZYX0JXQU54UiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTkl4fSwKLSAgICB7RlhfQldBTnh4LAlGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBQXh4LCBGWF9CV0FOeEwsIEZYX0JXQU54UiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTkl4fSwKLSAgICB7RlhfQldBTnh4LAlGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FMeEwsIEZYX0JXQU54UiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTkl4fSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEUsIEZYX0JXQXh4UiwgRlhfQldBeHhFLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeHhFfSwKLSAgICB7RlhfQldBeHh4LAlGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEwsIEZYX0JXQXh4UiwgRlhfQldBeHhMLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeHhMfSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEEsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhSLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeHhOfSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEUsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhSLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEwsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhMLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEEsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeHhOfSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEUsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEwsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKKyAgICB7RlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FFeEUsIEZYX0JXQU54UiwKKyAgICAgRlhfQldBeEl4LCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBeEl4fSwKKyAgICB7RlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FMeEwsIEZYX0JXQU54UiwKKyAgICAgRlhfQldBeEl4LCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBeEl4fSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEEsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhBLCBGWF9CV0F4SXgsIEZYX0JXQXh4TiwgRlhfQldBeHhOfSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEUsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhBLCBGWF9CV0F4SXgsIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEUsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhFLCBGWF9CV0F4SXgsIEZYX0JXQXhJeCwgRlhfQldBeHhFfSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEwsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhBLCBGWF9CV0F4SXgsIEZYX0JXQXh4TiwgRlhfQldBeEl4fSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEwsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhMLCBGWF9CV0F4SXgsIEZYX0JXQXhJeCwgRlhfQldBeHhMfSwKKyAgICB7RlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBQXh4LCBGWF9CV0FBeEEsIEZYX0JXQU54UiwKKyAgICAgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTnhOfSwKKyAgICB7RlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBQXh4LCBGWF9CV0FOeEUsIEZYX0JXQU54UiwKKyAgICAgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTkl4fSwKKyAgICB7RlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FFeEUsIEZYX0JXQU54UiwKKyAgICAgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTkl4fSwKKyAgICB7RlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBQXh4LCBGWF9CV0FOeEwsIEZYX0JXQU54UiwKKyAgICAgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTkl4fSwKKyAgICB7RlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FMeEwsIEZYX0JXQU54UiwKKyAgICAgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTkl4fSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEUsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhFLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeHhFfSwKKyAgICB7RlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eEwsIEZYX0JXQXh4UiwKKyAgICAgRlhfQldBeHhMLCBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeHhMfSwKIH07Ci12b2lkIEZYX0JpZGlSZXNvbHZlV2VhayhpbnQzMl90IGlCYXNlTGV2ZWwsIENGWF9JbnQzMkFycmF5ICZjbGFzc2VzLCBDRlhfSW50MzJBcnJheSAmbGV2ZWxzKQotewotICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOwotICAgIEZYU1lTX2Fzc2VydChjbGFzc2VzLkdldFNpemUoKSA9PSBsZXZlbHMuR2V0U2l6ZSgpKTsKLSAgICBpbnQzMl90IGlTaXplID0gY2xhc3Nlcy5HZXRTaXplKCk7Ci0gICAgaWYgKGlTaXplIDwgMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlTaXplIC0tOwotICAgIGludDMyX3QgaUxldmVsQ3VyID0gaUJhc2VMZXZlbDsKLSAgICBpbnQzMl90IGlTdGF0ZSA9IEZYX0lzT2RkKGlCYXNlTGV2ZWwpID8gRlhfQldTeHIgOiBGWF9CV1N4bDsKLSAgICBpbnQzMl90IGkgPSAwLCBpQ291bnQgPSAwLCBpQ2xzQ3VyLCBpQ2xzUnVuLCBpQ2xzTmV3LCBpQWN0aW9uOwotICAgIGZvciAoOyBpIDw9IGlTaXplOyBpICsrKSB7Ci0gICAgICAgIGlDbHNDdXIgPSBjbGFzc2VzLkdldEF0KGkpOwordm9pZCBGWF9CaWRpUmVzb2x2ZVdlYWsoaW50MzJfdCBpQmFzZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgbGV2ZWxzKSB7CisgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICBGWFNZU19hc3NlcnQoY2xhc3Nlcy5HZXRTaXplKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgIGludDMyX3QgaVNpemUgPSBjbGFzc2VzLkdldFNpemUoKTsKKyAgaWYgKGlTaXplIDwgMSkgeworICAgIHJldHVybjsKKyAgfQorICBpU2l6ZS0tOworICBpbnQzMl90IGlMZXZlbEN1ciA9IGlCYXNlTGV2ZWw7CisgIGludDMyX3QgaVN0YXRlID0gRlhfSXNPZGQoaUJhc2VMZXZlbCkgPyBGWF9CV1N4ciA6IEZYX0JXU3hsOworICBpbnQzMl90IGkgPSAwLCBpQ291bnQgPSAwLCBpQ2xzQ3VyLCBpQ2xzUnVuLCBpQ2xzTmV3LCBpQWN0aW9uOworICBmb3IgKDsgaSA8PSBpU2l6ZTsgaSsrKSB7CisgICAgaUNsc0N1ciA9IGNsYXNzZXMuR2V0QXQoaSk7CiAjaWYgMAogICAgICAgICBpZiAoaUNsc0N1ciA9PSBGWF9CSURJQ0xBU1NfQk4pIHsKICAgICAgICAgICAgIGxldmVscy5TZXRBdChpLCBpTGV2ZWxDdXIpOwpAQCAtNTQ0LDYyNyArNDkyLDYzOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAjZW5kaWYKLSAgICAgICAgRlhTWVNfYXNzZXJ0KGlDbHNDdXIgPD0gRlhfQklESUNMQVNTX0JOKTsKLSAgICAgICAgaUFjdGlvbiA9IGdjX0ZYX0JpZGlXZWFrQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdOwotICAgICAgICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkVHlwZShpQWN0aW9uKTsKLSAgICAgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESVdFQUtBQ1RJT05fWFggJiYgaUNvdW50ID4gMCkgewotICAgICAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNsYXNzZXMsIGksIGlDb3VudCwgaUNsc1J1bik7Ci0gICAgICAgICAgICBpQ291bnQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlDbHNOZXcgPSBGWF9CaWRpR2V0UmVzb2x2ZWRUeXBlKGlBY3Rpb24pOwotICAgICAgICBpZiAoaUNsc05ldyAhPSBGWF9CSURJV0VBS0FDVElPTl9YWCkgewotICAgICAgICAgICAgY2xhc3Nlcy5TZXRBdChpLCBpQ2xzTmV3KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRlhfQklESVdFQUtBQ1RJT05fSVggJiBpQWN0aW9uKSB7Ci0gICAgICAgICAgICBpQ291bnQgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaVN0YXRlID0gZ2NfRlhfQmlkaVdlYWtTdGF0ZXNbaVN0YXRlXVtpQ2xzQ3VyXTsKLSAgICB9Ci0gICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsQ3VyKTsKLSAgICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkVHlwZShnY19GWF9CaWRpV2Vha0FjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXSk7CisgICAgRlhTWVNfYXNzZXJ0KGlDbHNDdXIgPD0gRlhfQklESUNMQVNTX0JOKTsKKyAgICBpQWN0aW9uID0gZ2NfRlhfQmlkaVdlYWtBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl07CisgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoaUFjdGlvbik7CiAgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESVdFQUtBQ1RJT05fWFggJiYgaUNvdW50ID4gMCkgewotICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2xhc3NlcywgaSwgaUNvdW50LCBpQ2xzUnVuKTsKKyAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjbGFzc2VzLCBpLCBpQ291bnQsIGlDbHNSdW4pOworICAgICAgaUNvdW50ID0gMDsKICAgICB9CisgICAgaUNsc05ldyA9IEZYX0JpZGlHZXRSZXNvbHZlZFR5cGUoaUFjdGlvbik7CisgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESVdFQUtBQ1RJT05fWFgpIHsKKyAgICAgIGNsYXNzZXMuU2V0QXQoaSwgaUNsc05ldyk7CisgICAgfQorICAgIGlmIChGWF9CSURJV0VBS0FDVElPTl9JWCAmIGlBY3Rpb24pIHsKKyAgICAgIGlDb3VudCsrOworICAgIH0KKyAgICBpU3RhdGUgPSBnY19GWF9CaWRpV2Vha1N0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOworICB9CisgIGlDbHNDdXIgPSBGWF9CaWRpRGlyZWN0aW9uKGlMZXZlbEN1cik7CisgIGlDbHNSdW4gPSBGWF9CaWRpR2V0RGVmZXJyZWRUeXBlKGdjX0ZYX0JpZGlXZWFrQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdKTsKKyAgaWYgKGlDbHNSdW4gIT0gRlhfQklESVdFQUtBQ1RJT05fWFggJiYgaUNvdW50ID4gMCkgeworICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjbGFzc2VzLCBpLCBpQ291bnQsIGlDbHNSdW4pOworICB9CiB9CiBjb25zdCBpbnQzMl90IGdjX0ZYX0JpZGlOZXV0cmFsU3RhdGVzW11bNV0gPSB7Ci0gICAge0ZYX0JOU3JuLAlGWF9CTlNsLAlGWF9CTlNyLAlGWF9CTlNyLAlGWF9CTlNyfSwKLSAgICB7RlhfQk5TbG4sCUZYX0JOU2wsCUZYX0JOU3IsCUZYX0JOU2EsCUZYX0JOU2x9LAotICAgIHtGWF9CTlNybiwJRlhfQk5TbCwJRlhfQk5TciwJRlhfQk5TciwJRlhfQk5Tcn0sCi0gICAge0ZYX0JOU2xuLAlGWF9CTlNsLAlGWF9CTlNyLAlGWF9CTlNhLAlGWF9CTlNsfSwKLSAgICB7RlhfQk5TbmEsCUZYX0JOU2wsCUZYX0JOU3IsCUZYX0JOU2EsCUZYX0JOU2x9LAotICAgIHtGWF9CTlNuYSwJRlhfQk5TbCwJRlhfQk5TciwJRlhfQk5TYSwJRlhfQk5TbH0sCisgICAge0ZYX0JOU3JuLCBGWF9CTlNsLCBGWF9CTlNyLCBGWF9CTlNyLCBGWF9CTlNyfSwKKyAgICB7RlhfQk5TbG4sIEZYX0JOU2wsIEZYX0JOU3IsIEZYX0JOU2EsIEZYX0JOU2x9LAorICAgIHtGWF9CTlNybiwgRlhfQk5TbCwgRlhfQk5TciwgRlhfQk5TciwgRlhfQk5Tcn0sCisgICAge0ZYX0JOU2xuLCBGWF9CTlNsLCBGWF9CTlNyLCBGWF9CTlNhLCBGWF9CTlNsfSwKKyAgICB7RlhfQk5TbmEsIEZYX0JOU2wsIEZYX0JOU3IsIEZYX0JOU2EsIEZYX0JOU2x9LAorICAgIHtGWF9CTlNuYSwgRlhfQk5TbCwgRlhfQk5TciwgRlhfQk5TYSwgRlhfQk5TbH0sCiB9OwogY29uc3QgaW50MzJfdCBnY19GWF9CaWRpTmV1dHJhbEFjdGlvbnNbXVs1XSA9IHsKLSAgICB7RlhfQk5BSW4sICAwLAkJCTAsCQkJMCwJCQkwCQkJfSwKLSAgICB7RlhfQk5BSW4sICAwLAkJCTAsCQkJMCwJCQlGWF9CQ0wJCX0sCi0gICAge0ZYX0JOQUluLAlGWF9CTkFFbiwJRlhfQk5BUm4sCUZYX0JOQVJuLAlGWF9CTkFSbgl9LAotICAgIHtGWF9CTkFJbiwJRlhfQk5BTG4sCUZYX0JOQUVuLAlGWF9CTkFFbiwJRlhfQk5BTG5MCX0sCi0gICAge0ZYX0JOQUluLCAgMCwJCQkwLAkJCTAsCQkJRlhfQkNMCQl9LAotICAgIHtGWF9CTkFJbiwJRlhfQk5BRW4sCUZYX0JOQVJuLAlGWF9CTkFSbiwJRlhfQk5BRW4JfSwKKyAgICB7RlhfQk5BSW4sIDAsIDAsIDAsIDB9LAorICAgIHtGWF9CTkFJbiwgMCwgMCwgMCwgRlhfQkNMfSwKKyAgICB7RlhfQk5BSW4sIEZYX0JOQUVuLCBGWF9CTkFSbiwgRlhfQk5BUm4sIEZYX0JOQVJufSwKKyAgICB7RlhfQk5BSW4sIEZYX0JOQUxuLCBGWF9CTkFFbiwgRlhfQk5BRW4sIEZYX0JOQUxuTH0sCisgICAge0ZYX0JOQUluLCAwLCAwLCAwLCBGWF9CQ0x9LAorICAgIHtGWF9CTkFJbiwgRlhfQk5BRW4sIEZYX0JOQVJuLCBGWF9CTkFSbiwgRlhfQk5BRW59LAogfTsKLWludDMyX3QgRlhfQmlkaUdldERlZmVycmVkTmV1dHJhbHMoaW50MzJfdCBpQWN0aW9uLCBpbnQzMl90IGlMZXZlbCkKLXsKLSAgICBpQWN0aW9uID0gKGlBY3Rpb24gPj4gNCkgJiAweEY7Ci0gICAgaWYgKGlBY3Rpb24gPT0gKEZYX0JJRElORVVUUkFMQUNUSU9OX0VuID4+IDQpKSB7Ci0gICAgICAgIHJldHVybiBGWF9CaWRpRGlyZWN0aW9uKGlMZXZlbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGlBY3Rpb247Ci0gICAgfQoraW50MzJfdCBGWF9CaWRpR2V0RGVmZXJyZWROZXV0cmFscyhpbnQzMl90IGlBY3Rpb24sIGludDMyX3QgaUxldmVsKSB7CisgIGlBY3Rpb24gPSAoaUFjdGlvbiA+PiA0KSAmIDB4RjsKKyAgaWYgKGlBY3Rpb24gPT0gKEZYX0JJRElORVVUUkFMQUNUSU9OX0VuID4+IDQpKSB7CisgICAgcmV0dXJuIEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gaUFjdGlvbjsKKyAgfQogfQotaW50MzJfdCBGWF9CaWRpR2V0UmVzb2x2ZWROZXV0cmFscyhpbnQzMl90IGlBY3Rpb24pCi17Ci0gICAgaUFjdGlvbiA9IChpQWN0aW9uICYgMHhGKTsKLSAgICBpZiAoaUFjdGlvbiA9PSBGWF9CSURJTkVVVFJBTEFDVElPTl9JbikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gaUFjdGlvbjsKLSAgICB9CitpbnQzMl90IEZYX0JpZGlHZXRSZXNvbHZlZE5ldXRyYWxzKGludDMyX3QgaUFjdGlvbikgeworICBpQWN0aW9uID0gKGlBY3Rpb24gJiAweEYpOworICBpZiAoaUFjdGlvbiA9PSBGWF9CSURJTkVVVFJBTEFDVElPTl9JbikgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiBpQWN0aW9uOworICB9CiB9Ci12b2lkIEZYX0JpZGlSZXNvbHZlTmV1dHJhbHMoaW50MzJfdCBpQmFzZUxldmVsLCBDRlhfSW50MzJBcnJheSAmY2xhc3NlcywgY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmxldmVscykKLXsKLSAgICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMKTsKLSAgICBGWFNZU19hc3NlcnQoY2xhc3Nlcy5HZXRTaXplKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7Ci0gICAgaW50MzJfdCBpU2l6ZSA9IGNsYXNzZXMuR2V0U2l6ZSgpOwotICAgIGlmIChpU2l6ZSA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBGWF9CaWRpUmVzb2x2ZU5ldXRyYWxzKGludDMyX3QgaUJhc2VMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgbGV2ZWxzKSB7CisgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICBGWFNZU19hc3NlcnQoY2xhc3Nlcy5HZXRTaXplKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgIGludDMyX3QgaVNpemUgPSBjbGFzc2VzLkdldFNpemUoKTsKKyAgaWYgKGlTaXplIDwgMSkgeworICAgIHJldHVybjsKKyAgfQorICBpU2l6ZS0tOworICBpbnQzMl90IGlMZXZlbCA9IGlCYXNlTGV2ZWw7CisgIGludDMyX3QgaVN0YXRlID0gRlhfSXNPZGQoaUJhc2VMZXZlbCkgPyBGWF9CTlNyIDogRlhfQk5TbDsKKyAgaW50MzJfdCBpID0gMCwgaUNvdW50ID0gMCwgaUNsc0N1ciwgaUNsc1J1biwgaUNsc05ldywgaUFjdGlvbjsKKyAgZm9yICg7IGkgPD0gaVNpemU7IGkrKykgeworICAgIGlDbHNDdXIgPSBjbGFzc2VzLkdldEF0KGkpOworICAgIGlmIChpQ2xzQ3VyID09IEZYX0JJRElDTEFTU19CTikgeworICAgICAgaWYgKGlDb3VudCkgeworICAgICAgICBpQ291bnQrKzsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpU2l6ZSAtLTsKLSAgICBpbnQzMl90IGlMZXZlbCA9IGlCYXNlTGV2ZWw7Ci0gICAgaW50MzJfdCBpU3RhdGUgPSBGWF9Jc09kZChpQmFzZUxldmVsKSA/IEZYX0JOU3IgOiBGWF9CTlNsOwotICAgIGludDMyX3QgaSA9IDAsIGlDb3VudCA9IDAsIGlDbHNDdXIsIGlDbHNSdW4sIGlDbHNOZXcsIGlBY3Rpb247Ci0gICAgZm9yICg7IGkgPD0gaVNpemU7IGkgKyspIHsKLSAgICAgICAgaUNsc0N1ciA9IGNsYXNzZXMuR2V0QXQoaSk7Ci0gICAgICAgIGlmIChpQ2xzQ3VyID09IEZYX0JJRElDTEFTU19CTikgewotICAgICAgICAgICAgaWYgKGlDb3VudCkgewotICAgICAgICAgICAgICAgIGlDb3VudCArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYU1lTX2Fzc2VydChpQ2xzQ3VyIDwgRlhfQklESUNMQVNTX0FMKTsKLSAgICAgICAgaUFjdGlvbiA9IGdjX0ZYX0JpZGlOZXV0cmFsQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdOwotICAgICAgICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkTmV1dHJhbHMoaUFjdGlvbiwgaUxldmVsKTsKLSAgICAgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESUNMQVNTX04gJiYgaUNvdW50ID4gMCkgewotICAgICAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNsYXNzZXMsIGksIGlDb3VudCwgaUNsc1J1bik7Ci0gICAgICAgICAgICBpQ291bnQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlDbHNOZXcgPSBGWF9CaWRpR2V0UmVzb2x2ZWROZXV0cmFscyhpQWN0aW9uKTsKLSAgICAgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESUNMQVNTX04pIHsKLSAgICAgICAgICAgIGNsYXNzZXMuU2V0QXQoaSwgaUNsc05ldyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZYX0JJRElORVVUUkFMQUNUSU9OX0luICYgaUFjdGlvbikgewotICAgICAgICAgICAgaUNvdW50ICsrOwotICAgICAgICB9Ci0gICAgICAgIGlTdGF0ZSA9IGdjX0ZYX0JpZGlOZXV0cmFsU3RhdGVzW2lTdGF0ZV1baUNsc0N1cl07Ci0gICAgICAgIGlMZXZlbCA9IGxldmVscy5HZXRBdChpKTsKLSAgICB9Ci0gICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsKTsKLSAgICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkTmV1dHJhbHMoZ2NfRlhfQmlkaU5ldXRyYWxBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl0sIGlMZXZlbCk7CisgICAgRlhTWVNfYXNzZXJ0KGlDbHNDdXIgPCBGWF9CSURJQ0xBU1NfQUwpOworICAgIGlBY3Rpb24gPSBnY19GWF9CaWRpTmV1dHJhbEFjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXTsKKyAgICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkTmV1dHJhbHMoaUFjdGlvbiwgaUxldmVsKTsKICAgICBpZiAoaUNsc1J1biAhPSBGWF9CSURJQ0xBU1NfTiAmJiBpQ291bnQgPiAwKSB7Ci0gICAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjbGFzc2VzLCBpLCBpQ291bnQsIGlDbHNSdW4pOworICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNsYXNzZXMsIGksIGlDb3VudCwgaUNsc1J1bik7CisgICAgICBpQ291bnQgPSAwOwogICAgIH0KKyAgICBpQ2xzTmV3ID0gRlhfQmlkaUdldFJlc29sdmVkTmV1dHJhbHMoaUFjdGlvbik7CisgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESUNMQVNTX04pIHsKKyAgICAgIGNsYXNzZXMuU2V0QXQoaSwgaUNsc05ldyk7CisgICAgfQorICAgIGlmIChGWF9CSURJTkVVVFJBTEFDVElPTl9JbiAmIGlBY3Rpb24pIHsKKyAgICAgIGlDb3VudCsrOworICAgIH0KKyAgICBpU3RhdGUgPSBnY19GWF9CaWRpTmV1dHJhbFN0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOworICAgIGlMZXZlbCA9IGxldmVscy5HZXRBdChpKTsKKyAgfQorICBpQ2xzQ3VyID0gRlhfQmlkaURpcmVjdGlvbihpTGV2ZWwpOworICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkTmV1dHJhbHMoCisgICAgICBnY19GWF9CaWRpTmV1dHJhbEFjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXSwgaUxldmVsKTsKKyAgaWYgKGlDbHNSdW4gIT0gRlhfQklESUNMQVNTX04gJiYgaUNvdW50ID4gMCkgeworICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjbGFzc2VzLCBpLCBpQ291bnQsIGlDbHNSdW4pOworICB9CiB9CiBjb25zdCBpbnQzMl90IGdjX0ZYX0JpZGlBZGRMZXZlbFtdWzRdID0gewotICAgIHswLCAgMSwgIDIsICAyfSwKLSAgICB7MSwgIDAsICAxLCAgMX0sCisgICAgezAsIDEsIDIsIDJ9LAorICAgIHsxLCAwLCAxLCAxfSwKIH07Ci12b2lkIEZYX0JpZGlSZXNvbHZlSW1wbGljaXQoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KGNsYXNzZXMuR2V0U2l6ZSgpID09IGxldmVscy5HZXRTaXplKCkpOwotICAgIGludDMyX3QgaVNpemUgPSBjbGFzc2VzLkdldFNpemUoKTsKLSAgICBpZiAoaVNpemUgPCAxKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgRlhfQmlkaVJlc29sdmVJbXBsaWNpdChjb25zdCBDRlhfSW50MzJBcnJheSYgY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgbGV2ZWxzKSB7CisgIEZYU1lTX2Fzc2VydChjbGFzc2VzLkdldFNpemUoKSA9PSBsZXZlbHMuR2V0U2l6ZSgpKTsKKyAgaW50MzJfdCBpU2l6ZSA9IGNsYXNzZXMuR2V0U2l6ZSgpOworICBpZiAoaVNpemUgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIGlTaXplLS07CisgIGludDMyX3QgaUNscywgaUxldmVsOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPD0gaVNpemU7IGkrKykgeworICAgIGlDbHMgPSBjbGFzc2VzLkdldEF0KGkpOworICAgIGlmIChpQ2xzID09IEZYX0JJRElDTEFTU19CTikgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlTaXplIC0tOwotICAgIGludDMyX3QgaUNscywgaUxldmVsOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8PSBpU2l6ZTsgaSArKykgewotICAgICAgICBpQ2xzID0gY2xhc3Nlcy5HZXRBdChpKTsKLSAgICAgICAgaWYgKGlDbHMgPT0gRlhfQklESUNMQVNTX0JOKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWFNZU19hc3NlcnQoaUNscyA+IEZYX0JJRElDTEFTU19PTiAmJiBpQ2xzIDwgRlhfQklESUNMQVNTX0FMKTsKLSAgICAgICAgaUxldmVsID0gbGV2ZWxzLkdldEF0KGkpOwotICAgICAgICBpTGV2ZWwgKz0gZ2NfRlhfQmlkaUFkZExldmVsW0ZYX0lzT2RkKGlMZXZlbCldW2lDbHMgLSAxXTsKKyAgICBGWFNZU19hc3NlcnQoaUNscyA+IEZYX0JJRElDTEFTU19PTiAmJiBpQ2xzIDwgRlhfQklESUNMQVNTX0FMKTsKKyAgICBpTGV2ZWwgPSBsZXZlbHMuR2V0QXQoaSk7CisgICAgaUxldmVsICs9IGdjX0ZYX0JpZGlBZGRMZXZlbFtGWF9Jc09kZChpTGV2ZWwpXVtpQ2xzIC0gMV07CisgICAgbGV2ZWxzLlNldEF0KGksIGlMZXZlbCk7CisgIH0KK30KK3ZvaWQgRlhfQmlkaVJlc29sdmVXaGl0ZXNwYWNlKGludDMyX3QgaUJhc2VMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGxldmVscykgeworICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMKTsKKyAgRlhTWVNfYXNzZXJ0KGNsYXNzZXMuR2V0U2l6ZSgpID09IGxldmVscy5HZXRTaXplKCkpOworICBpbnQzMl90IGlTaXplID0gY2xhc3Nlcy5HZXRTaXplKCk7CisgIGlmIChpU2l6ZSA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaVNpemUtLTsKKyAgaW50MzJfdCBpTGV2ZWwgPSBpQmFzZUxldmVsOworICBpbnQzMl90IGkgPSAwLCBpQ291bnQgPSAwOworICBmb3IgKDsgaSA8PSBpU2l6ZTsgaSsrKSB7CisgICAgc3dpdGNoIChjbGFzc2VzLkdldEF0KGkpKSB7CisgICAgICBjYXNlIEZYX0JJRElDTEFTU19XUzoKKyAgICAgICAgaUNvdW50Kys7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUkxFOgorICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJFOgorICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJPOgorICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUkxPOgorICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUERGOgorICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfQk46CiAgICAgICAgIGxldmVscy5TZXRBdChpLCBpTGV2ZWwpOwotICAgIH0KLX0KLXZvaWQgRlhfQmlkaVJlc29sdmVXaGl0ZXNwYWNlKGludDMyX3QgaUJhc2VMZXZlbCwgY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7Ci0gICAgRlhTWVNfYXNzZXJ0KGNsYXNzZXMuR2V0U2l6ZSgpID09IGxldmVscy5HZXRTaXplKCkpOwotICAgIGludDMyX3QgaVNpemUgPSBjbGFzc2VzLkdldFNpemUoKTsKLSAgICBpZiAoaVNpemUgPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaVNpemUgLS07Ci0gICAgaW50MzJfdCBpTGV2ZWwgPSBpQmFzZUxldmVsOwotICAgIGludDMyX3QgaSA9IDAsIGlDb3VudCA9IDA7Ci0gICAgZm9yICg7IGkgPD0gaVNpemU7IGkgKyspIHsKLSAgICAgICAgc3dpdGNoKGNsYXNzZXMuR2V0QXQoaSkpIHsKLSAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1dTOgotICAgICAgICAgICAgICAgIGlDb3VudCArKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMRToKLSAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX0xSRToKLSAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX0xSTzoKLSAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMTzoKLSAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1BERjoKLSAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX0JOOgotICAgICAgICAgICAgICAgIGxldmVscy5TZXRBdChpLCBpTGV2ZWwpOwotICAgICAgICAgICAgICAgIGlDb3VudCArKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1M6Ci0gICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19COgotICAgICAgICAgICAgICAgIGlmIChpQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihsZXZlbHMsIGksIGlDb3VudCwgaUJhc2VMZXZlbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxldmVscy5TZXRBdChpLCBpQmFzZUxldmVsKTsKLSAgICAgICAgICAgICAgICBpQ291bnQgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpQ291bnQgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpQ291bnQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYX0JJRElDTEFTU19TOgorICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfQjoKKyAgICAgICAgaWYgKGlDb3VudCA+IDApIHsKKyAgICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4obGV2ZWxzLCBpLCBpQ291bnQsIGlCYXNlTGV2ZWwpOwogICAgICAgICB9Ci0gICAgICAgIGlMZXZlbCA9IGxldmVscy5HZXRBdChpKTsKKyAgICAgICAgbGV2ZWxzLlNldEF0KGksIGlCYXNlTGV2ZWwpOworICAgICAgICBpQ291bnQgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlDb3VudCA9IDA7CisgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBpZiAoaUNvdW50ID4gMCkgewotICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4obGV2ZWxzLCBpLCBpQ291bnQsIGlCYXNlTGV2ZWwpOwotICAgIH0KKyAgICBpTGV2ZWwgPSBsZXZlbHMuR2V0QXQoaSk7CisgIH0KKyAgaWYgKGlDb3VudCA+IDApIHsKKyAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4obGV2ZWxzLCBpLCBpQ291bnQsIGlCYXNlTGV2ZWwpOworICB9CiB9Ci1pbnQzMl90IEZYX0JpZGlSZW9yZGVyTGV2ZWwoaW50MzJfdCBpQmFzZUxldmVsLCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBjb25zdCBDRlhfSW50MzJBcnJheSAmbGV2ZWxzLCBpbnQzMl90IGlTdGFydCwgRlhfQk9PTCBiUmV2ZXJzZSkKLXsKLSAgICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMKTsKLSAgICBGWFNZU19hc3NlcnQod3NUZXh0LkdldExlbmd0aCgpID09IGxldmVscy5HZXRTaXplKCkpOwotICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPj0gMCAmJiBpU3RhcnQgPCB3c1RleHQuR2V0TGVuZ3RoKCkpOwotICAgIGludDMyX3QgaVNpemUgPSB3c1RleHQuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKGlTaXplIDwgMSkgewotICAgICAgICByZXR1cm4gMDsKK2ludDMyX3QgRlhfQmlkaVJlb3JkZXJMZXZlbChpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgbGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldmVyc2UpIHsKKyAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7CisgIEZYU1lTX2Fzc2VydCh3c1RleHQuR2V0TGVuZ3RoKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgIEZYU1lTX2Fzc2VydChpU3RhcnQgPj0gMCAmJiBpU3RhcnQgPCB3c1RleHQuR2V0TGVuZ3RoKCkpOworICBpbnQzMl90IGlTaXplID0gd3NUZXh0LkdldExlbmd0aCgpOworICBpZiAoaVNpemUgPCAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgYlJldmVyc2UgPSBiUmV2ZXJzZSB8fCBGWF9Jc09kZChpQmFzZUxldmVsKTsKKyAgaW50MzJfdCBpID0gaVN0YXJ0LCBpTGV2ZWw7CisgIGZvciAoOyBpIDwgaVNpemU7IGkrKykgeworICAgIGlmICgoaUxldmVsID0gbGV2ZWxzLkdldEF0KGkpKSA9PSBpQmFzZUxldmVsKSB7CisgICAgICBjb250aW51ZTsKICAgICB9CisgICAgaWYgKGlMZXZlbCA8IGlCYXNlTGV2ZWwpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpICs9IEZYX0JpZGlSZW9yZGVyTGV2ZWwoaUJhc2VMZXZlbCArIDEsIHdzVGV4dCwgbGV2ZWxzLCBpLCBiUmV2ZXJzZSkgLSAxOworICB9CisgIGludDMyX3QgaUNvdW50ID0gaSAtIGlTdGFydDsKKyAgaWYgKGJSZXZlcnNlICYmIGlDb3VudCA+IDEpIHsKKyAgICBGWF9CaWRpUmV2ZXJzZVN0cmluZyh3c1RleHQsIGlTdGFydCwgaUNvdW50KTsKKyAgfQorICByZXR1cm4gaUNvdW50OworfQordm9pZCBGWF9CaWRpUmVvcmRlcihpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBsZXZlbHMpIHsKKyAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7CisgIEZYU1lTX2Fzc2VydCh3c1RleHQuR2V0TGVuZ3RoKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgIGludDMyX3QgaVNpemUgPSB3c1RleHQuR2V0TGVuZ3RoKCk7CisgIGlmIChpU2l6ZSA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50MzJfdCBpID0gMDsKKyAgd2hpbGUgKGkgPCBpU2l6ZSkgeworICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChpQmFzZUxldmVsLCB3c1RleHQsIGxldmVscywgaSwgRkFMU0UpOworICB9Cit9Cit2b2lkIEZYX0JpZGlMaW5lKENGWF9XaWRlU3RyaW5nJiB3c1RleHQsIGludDMyX3QgaUJhc2VMZXZlbCkgeworICBpbnQzMl90IGlMZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7CisgIGlmIChpTGVuZ3RoIDwgMikgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfSW50MzJBcnJheSBjbGFzc2VzLCBsZXZlbHM7CisgIGNsYXNzZXMuU2V0QXRHcm93KGlMZW5ndGggLSAxLCAwKTsKKyAgbGV2ZWxzLlNldEF0R3JvdyhpTGVuZ3RoIC0gMSwgMCk7CisgIEZYX0JpZGlDbGFzc2lmeSh3c1RleHQsIGNsYXNzZXMsIEZBTFNFKTsKKyAgRlhfQmlkaVJlc29sdmVFeHBsaWNpdChpQmFzZUxldmVsLCBGWF9CSURJQ0xBU1NfTiwgY2xhc3NlcywgbGV2ZWxzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlMZW5ndGgsIDApOworICBGWF9CaWRpUmVzb2x2ZVdlYWsoaUJhc2VMZXZlbCwgY2xhc3NlcywgbGV2ZWxzKTsKKyAgRlhfQmlkaVJlc29sdmVOZXV0cmFscyhpQmFzZUxldmVsLCBjbGFzc2VzLCBsZXZlbHMpOworICBGWF9CaWRpUmVzb2x2ZUltcGxpY2l0KGNsYXNzZXMsIGxldmVscyk7CisgIEZYX0JpZGlDbGFzc2lmeSh3c1RleHQsIGNsYXNzZXMsIFRSVUUpOworICBGWF9CaWRpUmVzb2x2ZVdoaXRlc3BhY2UoaUJhc2VMZXZlbCwgY2xhc3NlcywgbGV2ZWxzKTsKKyAgRlhfQmlkaVJlb3JkZXIoaUJhc2VMZXZlbCwgd3NUZXh0LCBsZXZlbHMpOworICBjbGFzc2VzLlJlbW92ZUFsbCgpOworICBsZXZlbHMuUmVtb3ZlQWxsKCk7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+CitjbGFzcyBDRlhfQmlkaUxpbmVUZW1wbGF0ZSB7CisgcHVibGljOgorICB2b2lkIEZYX0JpZGlSZXZlcnNlU3RyaW5nKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiYgY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsKKyAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgY2hhcnMuR2V0U2l6ZSgpKTsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID49IDAgJiYgaVN0YXJ0ICsgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgYmFzZVR5cGUgKnBTdGFydCwgKnBFbmQ7CisgICAgaW50MzJfdCBpRW5kID0gaVN0YXJ0ICsgaUNvdW50IC0gMSwgaVRlbXA7CisgICAgd2hpbGUgKGlTdGFydCA8IGlFbmQpIHsKKyAgICAgIHBTdGFydCA9IGNoYXJzLkdldERhdGFQdHIoaVN0YXJ0KyspOworICAgICAgcEVuZCA9IGNoYXJzLkdldERhdGFQdHIoaUVuZC0tKTsKKyAgICAgIGlUZW1wID0gcFN0YXJ0LT5tX2lCaWRpUG9zOworICAgICAgcFN0YXJ0LT5tX2lCaWRpUG9zID0gcEVuZC0+bV9pQmlkaVBvczsKKyAgICAgIHBFbmQtPm1faUJpZGlQb3MgPSBpVGVtcDsKKyAgICB9CisgIH0KKyAgdm9pZCBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+JiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWUpIHsKKyAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCAtIGlDb3VudCA+IC0xKTsKKyAgICBiYXNlVHlwZSogcFRDOworICAgIGludDMyX3QgaUxhc3QgPSBpU3RhcnQgLSBpQ291bnQ7CisgICAgaWYgKGJDbGFzcykgeworICAgICAgZm9yIChpbnQzMl90IGkgPSBpU3RhcnQgLSAxOyBpID49IGlMYXN0OyBpLS0pIHsKKyAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKKyAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoaW50MTZfdClpVmFsdWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50MzJfdCBpID0gaVN0YXJ0IC0gMTsgaSA+PSBpTGFzdDsgaS0tKSB7CisgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7CisgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaVZhbHVlOworICAgICAgfQorICAgIH0KKyAgfQorICB2b2lkIEZYX0JpZGlDbGFzc2lmeShDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4mIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV1MpIHsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgYmFzZVR5cGUqIHBUQzsKKyAgICBpZiAoYldTKSB7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOworICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9CisgICAgICAgICAgICAoaW50MTZfdCkocFRDLT5tX2R3Q2hhclByb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+CisgICAgICAgICAgICBGWF9CSURJQ0xBU1NCSVRTOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOworICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChpbnQxNl90KQorICAgICAgICAgICAgZ2NfRlhfQmlkaU5UeXBlc1socFRDLT5tX2R3Q2hhclByb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JJRElDTEFTU0JJVFNdOworICAgICAgfQorICAgIH0KKyAgfQorICB2b2lkIEZYX0JpZGlSZXNvbHZlRXhwbGljaXQoQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+JiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmFzZUxldmVsKSB7CisgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IC0xICYmIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOworICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICAgIGlmIChpQ291bnQgPCAxKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGJhc2VUeXBlKiBwVEM7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7CisgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IChpbnQxNl90KWlCYXNlTGV2ZWw7CisgICAgfQorICB9CisgIHZvaWQgRlhfQmlkaVJlc29sdmVXZWFrKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiYgY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCYXNlTGV2ZWwpIHsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgaUNvdW50LS07CisgICAgaWYgKGlDb3VudCA8IDEpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYmFzZVR5cGUgKnBUQywgKnBUQ05leHQ7CisgICAgaW50MzJfdCBpTGV2ZWxDdXIgPSBpQmFzZUxldmVsOworICAgIGludDMyX3QgaVN0YXRlID0gRlhfSXNPZGQoaUJhc2VMZXZlbCkgPyBGWF9CV1N4ciA6IEZYX0JXU3hsOworICAgIGludDMyX3QgaSA9IDAsIGlOdW0gPSAwLCBpQ2xzQ3VyLCBpQ2xzUnVuLCBpQ2xzTmV3LCBpQWN0aW9uOworICAgIGZvciAoOyBpIDw9IGlDb3VudDsgaSsrKSB7CisgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOworICAgICAgaUNsc0N1ciA9IHBUQy0+bV9pQmlkaUNsYXNzOworICAgICAgaWYgKGlDbHNDdXIgPT0gRlhfQklESUNMQVNTX0JOKSB7CisgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsQ3VyOworICAgICAgICBpZiAoaSA9PSBpQ291bnQgJiYgaUxldmVsQ3VyICE9IGlCYXNlTGV2ZWwpIHsKKyAgICAgICAgICBpQ2xzQ3VyID0gRlhfQmlkaURpcmVjdGlvbihpTGV2ZWxDdXIpOworICAgICAgICAgIHBUQy0+bV9pQmlkaUNsYXNzID0gKGludDE2X3QpaUNsc0N1cjsKKyAgICAgICAgfSBlbHNlIGlmIChpIDwgaUNvdW50KSB7CisgICAgICAgICAgcFRDTmV4dCA9IGNoYXJzLkdldERhdGFQdHIoaSArIDEpOworICAgICAgICAgIGludDMyX3QgaUxldmVsTmV4dCwgaUxldmVsTmV3OworICAgICAgICAgIGlDbHNOZXcgPSBwVENOZXh0LT5tX2lCaWRpQ2xhc3M7CisgICAgICAgICAgaUxldmVsTmV4dCA9IHBUQ05leHQtPm1faUJpZGlMZXZlbDsKKyAgICAgICAgICBpZiAoaUNsc05ldyAhPSBGWF9CSURJQ0xBU1NfQk4gJiYgaUxldmVsQ3VyICE9IGlMZXZlbE5leHQpIHsKKyAgICAgICAgICAgIGlMZXZlbE5ldyA9IGlMZXZlbE5leHQ7CisgICAgICAgICAgICBpZiAoaUxldmVsQ3VyID4gaUxldmVsTmV3KSB7CisgICAgICAgICAgICAgIGlMZXZlbE5ldyA9IGlMZXZlbEN1cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsTmV3OworICAgICAgICAgICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsTmV3KTsKKyAgICAgICAgICAgIHBUQy0+bV9pQmlkaUNsYXNzID0gKGludDE2X3QpaUNsc0N1cjsKKyAgICAgICAgICAgIGlMZXZlbEN1ciA9IGlMZXZlbE5leHQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpTnVtID4gMCkgeworICAgICAgICAgICAgICBpTnVtKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGlOdW0gPiAwKSB7CisgICAgICAgICAgICBpTnVtKys7CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBGWFNZU19hc3NlcnQoaUNsc0N1ciA8PSBGWF9CSURJQ0xBU1NfQk4pOworICAgICAgaUFjdGlvbiA9IGdjX0ZYX0JpZGlXZWFrQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdOworICAgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoaUFjdGlvbik7CisgICAgICBpZiAoaUNsc1J1biAhPSBGWF9CSURJV0VBS0FDVElPTl9YWCAmJiBpTnVtID4gMCkgeworICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2hhcnMsIFRSVUUsIGksIGlOdW0sIGlDbHNSdW4pOworICAgICAgICBpTnVtID0gMDsKKyAgICAgIH0KKyAgICAgIGlDbHNOZXcgPSBGWF9CaWRpR2V0UmVzb2x2ZWRUeXBlKGlBY3Rpb24pOworICAgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESVdFQUtBQ1RJT05fWFgpIHsKKyAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoaW50MTZfdClpQ2xzTmV3OworICAgICAgfQorICAgICAgaWYgKEZYX0JJRElXRUFLQUNUSU9OX0lYICYgaUFjdGlvbikgeworICAgICAgICBpTnVtKys7CisgICAgICB9CisgICAgICBpU3RhdGUgPSBnY19GWF9CaWRpV2Vha1N0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOworICAgIH0KKyAgICBpZiAoaU51bSA+IDApIHsKKyAgICAgIGlDbHNDdXIgPSBGWF9CaWRpRGlyZWN0aW9uKGlCYXNlTGV2ZWwpOworICAgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoZ2NfRlhfQmlkaVdlYWtBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl0pOworICAgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESVdFQUtBQ1RJT05fWFgpIHsKKyAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNoYXJzLCBUUlVFLCBpLCBpTnVtLCBpQ2xzUnVuKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdm9pZCBGWF9CaWRpUmVzb2x2ZU5ldXRyYWxzKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiYgY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJhc2VMZXZlbCkgeworICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAtMSAmJiBpQ291bnQgPD0gY2hhcnMuR2V0U2l6ZSgpKTsKKyAgICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMKTsKKyAgICBpQ291bnQtLTsKKyAgICBpZiAoaUNvdW50IDwgMSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBiYXNlVHlwZSogcFRDOworICAgIGludDMyX3QgaUxldmVsID0gaUJhc2VMZXZlbDsKKyAgICBpbnQzMl90IGlTdGF0ZSA9IEZYX0lzT2RkKGlCYXNlTGV2ZWwpID8gRlhfQk5TciA6IEZYX0JOU2w7CisgICAgaW50MzJfdCBpID0gMCwgaU51bSA9IDAsIGlDbHNDdXIsIGlDbHNSdW4sIGlDbHNOZXcsIGlBY3Rpb247CisgICAgZm9yICg7IGkgPD0gaUNvdW50OyBpKyspIHsKKyAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7CisgICAgICBpQ2xzQ3VyID0gcFRDLT5tX2lCaWRpQ2xhc3M7CisgICAgICBpZiAoaUNsc0N1ciA9PSBGWF9CSURJQ0xBU1NfQk4pIHsKKyAgICAgICAgaWYgKGlOdW0pIHsKKyAgICAgICAgICBpTnVtKys7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBGWFNZU19hc3NlcnQoaUNsc0N1ciA8IEZYX0JJRElDTEFTU19BTCk7CisgICAgICBpQWN0aW9uID0gZ2NfRlhfQmlkaU5ldXRyYWxBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl07CisgICAgICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkTmV1dHJhbHMoaUFjdGlvbiwgaUxldmVsKTsKKyAgICAgIGlmIChpQ2xzUnVuICE9IEZYX0JJRElDTEFTU19OICYmIGlOdW0gPiAwKSB7CisgICAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjaGFycywgVFJVRSwgaSwgaU51bSwgaUNsc1J1bik7CisgICAgICAgIGlOdW0gPSAwOworICAgICAgfQorICAgICAgaUNsc05ldyA9IEZYX0JpZGlHZXRSZXNvbHZlZE5ldXRyYWxzKGlBY3Rpb24pOworICAgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESUNMQVNTX04pIHsKKyAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoaW50MTZfdClpQ2xzTmV3OworICAgICAgfQorICAgICAgaWYgKEZYX0JJRElORVVUUkFMQUNUSU9OX0luICYgaUFjdGlvbikgeworICAgICAgICBpTnVtKys7CisgICAgICB9CisgICAgICBpU3RhdGUgPSBnY19GWF9CaWRpTmV1dHJhbFN0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOworICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7CisgICAgfQorICAgIGlmIChpTnVtID4gMCkgeworICAgICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsKTsKKyAgICAgIGlDbHNSdW4gPSBGWF9CaWRpR2V0RGVmZXJyZWROZXV0cmFscygKKyAgICAgICAgICBnY19GWF9CaWRpTmV1dHJhbEFjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXSwgaUxldmVsKTsKKyAgICAgIGlmIChpQ2xzUnVuICE9IEZYX0JJRElDTEFTU19OKSB7CisgICAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjaGFycywgVFJVRSwgaSwgaU51bSwgaUNsc1J1bik7CisgICAgICB9CisgICAgfQorICB9CisgIHZvaWQgRlhfQmlkaVJlc29sdmVJbXBsaWNpdChDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4mIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgYmFzZVR5cGUqIHBUQzsKKyAgICBpbnQzMl90IGlDbHMsIGlMZXZlbDsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKKyAgICAgIGlDbHMgPSBwVEMtPm1faUJpZGlDbGFzczsKKyAgICAgIGlmIChpQ2xzID09IEZYX0JJRElDTEFTU19CTikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEZYU1lTX2Fzc2VydChpQ2xzID4gRlhfQklESUNMQVNTX09OICYmIGlDbHMgPCBGWF9CSURJQ0xBU1NfQUwpOworICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7CisgICAgICBpTGV2ZWwgKz0gZ2NfRlhfQmlkaUFkZExldmVsW0ZYX0lzT2RkKGlMZXZlbCldW2lDbHMgLSAxXTsKKyAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsOworICAgIH0KKyAgfQorICB2b2lkIEZYX0JpZGlSZXNvbHZlV2hpdGVzcGFjZShDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4mIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmFzZUxldmVsKSB7CisgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IC0xICYmIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOworICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICAgIGlmIChpQ291bnQgPCAxKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlDb3VudC0tOworICAgIGludDMyX3QgaUxldmVsID0gaUJhc2VMZXZlbDsKKyAgICBpbnQzMl90IGkgPSAwLCBpTnVtID0gMDsKKyAgICBiYXNlVHlwZSogcFRDOworICAgIGZvciAoOyBpIDw9IGlDb3VudDsgaSsrKSB7CisgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOworICAgICAgc3dpdGNoIChwVEMtPm1faUJpZGlDbGFzcykgeworICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19XUzoKKyAgICAgICAgICBpTnVtKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMRToKKyAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJFOgorICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19MUk86CisgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMTzoKKyAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUERGOgorICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19CTjoKKyAgICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IChpbnQxNl90KWlMZXZlbDsKKyAgICAgICAgICBpTnVtKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1M6CisgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX0I6CisgICAgICAgICAgaWYgKGlOdW0gPiAwKSB7CisgICAgICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2hhcnMsIEZBTFNFLCBpLCBpTnVtLCBpQmFzZUxldmVsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAoaW50MTZfdClpQmFzZUxldmVsOworICAgICAgICAgIGlOdW0gPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlOdW0gPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7CisgICAgfQorICAgIGlmIChpTnVtID4gMCkgeworICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNoYXJzLCBGQUxTRSwgaSwgaU51bSwgaUJhc2VMZXZlbCk7CisgICAgfQorICB9CisgIGludDMyX3QgRlhfQmlkaVJlb3JkZXJMZXZlbChDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4mIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldmVyc2UpIHsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7CisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+PSAwICYmIGlTdGFydCA8IGlDb3VudCk7CisgICAgaWYgKGlDb3VudCA8IDEpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBiYXNlVHlwZSogcFRDOwogICAgIGJSZXZlcnNlID0gYlJldmVyc2UgfHwgRlhfSXNPZGQoaUJhc2VMZXZlbCk7CiAgICAgaW50MzJfdCBpID0gaVN0YXJ0LCBpTGV2ZWw7Ci0gICAgZm9yICg7IGkgPCBpU2l6ZTsgaSArKykgewotICAgICAgICBpZiAoKGlMZXZlbCA9IGxldmVscy5HZXRBdChpKSkgPT0gaUJhc2VMZXZlbCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlMZXZlbCA8IGlCYXNlTGV2ZWwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChpQmFzZUxldmVsICsgMSwgd3NUZXh0LCBsZXZlbHMsIGksIGJSZXZlcnNlKSAtIDE7CisgICAgZm9yICg7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKKyAgICAgIGlmICgoaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWwpID09IGlCYXNlTGV2ZWwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoaUxldmVsIDwgaUJhc2VMZXZlbCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChjaGFycywgaUNvdW50LCBpQmFzZUxldmVsICsgMSwgaSwgYlJldmVyc2UpIC0gMTsKICAgICB9Ci0gICAgaW50MzJfdCBpQ291bnQgPSBpIC0gaVN0YXJ0OwotICAgIGlmIChiUmV2ZXJzZSAmJiBpQ291bnQgPiAxKSB7Ci0gICAgICAgIEZYX0JpZGlSZXZlcnNlU3RyaW5nKHdzVGV4dCwgaVN0YXJ0LCBpQ291bnQpOworICAgIGludDMyX3QgaU51bSA9IGkgLSBpU3RhcnQ7CisgICAgaWYgKGJSZXZlcnNlICYmIGlOdW0gPiAxKSB7CisgICAgICBGWF9CaWRpUmV2ZXJzZVN0cmluZyhjaGFycywgaVN0YXJ0LCBpTnVtKTsKICAgICB9Ci0gICAgcmV0dXJuIGlDb3VudDsKLX0KLXZvaWQgRlhfQmlkaVJlb3JkZXIoaW50MzJfdCBpQmFzZUxldmVsLCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBjb25zdCBDRlhfSW50MzJBcnJheSAmbGV2ZWxzKQoteworICAgIHJldHVybiBpTnVtOworICB9CisgIHZvaWQgRlhfQmlkaVJlb3JkZXIoQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+JiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCYXNlTGV2ZWwpIHsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CiAgICAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7Ci0gICAgRlhTWVNfYXNzZXJ0KHdzVGV4dC5HZXRMZW5ndGgoKSA9PSBsZXZlbHMuR2V0U2l6ZSgpKTsKLSAgICBpbnQzMl90IGlTaXplID0gd3NUZXh0LkdldExlbmd0aCgpOwotICAgIGlmIChpU2l6ZSA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KICAgICBpbnQzMl90IGkgPSAwOwotICAgIHdoaWxlIChpIDwgaVNpemUpIHsKLSAgICAgICAgaSArPSBGWF9CaWRpUmVvcmRlckxldmVsKGlCYXNlTGV2ZWwsIHdzVGV4dCwgbGV2ZWxzLCBpLCBGQUxTRSk7CisgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKKyAgICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChjaGFycywgaUNvdW50LCBpQmFzZUxldmVsLCBpLCBGQUxTRSk7CiAgICAgfQotfQotdm9pZCBGWF9CaWRpTGluZShDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBpbnQzMl90IGlCYXNlTGV2ZWwpCi17Ci0gICAgaW50MzJfdCBpTGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOwotICAgIGlmIChpTGVuZ3RoIDwgMikgewotICAgICAgICByZXR1cm47CisgIH0KKyAgdm9pZCBGWF9CaWRpUG9zaXRpb24oQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+JiBjaGFycywgaW50MzJfdCBpQ291bnQpIHsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgYmFzZVR5cGUqIHBUQzsKKyAgICBpbnQzMl90IGkgPSAwOworICAgIHdoaWxlIChpIDwgaUNvdW50KSB7CisgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOworICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihwVEMtPm1faUJpZGlQb3MpOworICAgICAgcFRDLT5tX2lCaWRpT3JkZXIgPSBpKys7CiAgICAgfQotICAgIENGWF9JbnQzMkFycmF5IGNsYXNzZXMsIGxldmVsczsKLSAgICBjbGFzc2VzLlNldEF0R3JvdyhpTGVuZ3RoIC0gMSwgMCk7Ci0gICAgbGV2ZWxzLlNldEF0R3JvdyhpTGVuZ3RoIC0gMSwgMCk7Ci0gICAgRlhfQmlkaUNsYXNzaWZ5KHdzVGV4dCwgY2xhc3NlcywgRkFMU0UpOwotICAgIEZYX0JpZGlSZXNvbHZlRXhwbGljaXQoaUJhc2VMZXZlbCwgRlhfQklESUNMQVNTX04sIGNsYXNzZXMsIGxldmVscywgMCwgaUxlbmd0aCwgMCk7Ci0gICAgRlhfQmlkaVJlc29sdmVXZWFrKGlCYXNlTGV2ZWwsIGNsYXNzZXMsIGxldmVscyk7Ci0gICAgRlhfQmlkaVJlc29sdmVOZXV0cmFscyhpQmFzZUxldmVsLCBjbGFzc2VzLCBsZXZlbHMpOwotICAgIEZYX0JpZGlSZXNvbHZlSW1wbGljaXQoY2xhc3NlcywgbGV2ZWxzKTsKLSAgICBGWF9CaWRpQ2xhc3NpZnkod3NUZXh0LCBjbGFzc2VzLCBUUlVFKTsKLSAgICBGWF9CaWRpUmVzb2x2ZVdoaXRlc3BhY2UoaUJhc2VMZXZlbCwgY2xhc3NlcywgbGV2ZWxzKTsKLSAgICBGWF9CaWRpUmVvcmRlcihpQmFzZUxldmVsLCB3c1RleHQsIGxldmVscyk7Ci0gICAgY2xhc3Nlcy5SZW1vdmVBbGwoKTsKLSAgICBsZXZlbHMuUmVtb3ZlQWxsKCk7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4KLWNsYXNzIENGWF9CaWRpTGluZVRlbXBsYXRlCi17Ci1wdWJsaWM6Ci0gICAgdm9pZCBGWF9CaWRpUmV2ZXJzZVN0cmluZyhDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4gJmNoYXJzLCBpbnQzMl90IGlTdGFydCwgaW50MzJfdCBpQ291bnQpCi0gICAgewotICAgICAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgY2hhcnMuR2V0U2l6ZSgpKTsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+PSAwICYmIGlTdGFydCArIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOwotICAgICAgICBiYXNlVHlwZSAqcFN0YXJ0LCAqcEVuZDsKLSAgICAgICAgaW50MzJfdCBpRW5kID0gaVN0YXJ0ICsgaUNvdW50IC0gMSwgaVRlbXA7Ci0gICAgICAgIHdoaWxlIChpU3RhcnQgPCBpRW5kKSB7Ci0gICAgICAgICAgICBwU3RhcnQgPSBjaGFycy5HZXREYXRhUHRyKGlTdGFydCArKyk7Ci0gICAgICAgICAgICBwRW5kID0gY2hhcnMuR2V0RGF0YVB0cihpRW5kIC0tKTsKLSAgICAgICAgICAgIGlUZW1wID0gcFN0YXJ0LT5tX2lCaWRpUG9zOwotICAgICAgICAgICAgcFN0YXJ0LT5tX2lCaWRpUG9zID0gcEVuZC0+bV9pQmlkaVBvczsKLSAgICAgICAgICAgIHBFbmQtPm1faUJpZGlQb3MgPSBpVGVtcDsKLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4gJmNoYXJzLCBGWF9CT09MIGJDbGFzcywgaW50MzJfdCBpU3RhcnQsIGludDMyX3QgaUNvdW50LCBpbnQzMl90IGlWYWx1ZSkKLSAgICB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPD0gY2hhcnMuR2V0U2l6ZSgpKTsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCAtIGlDb3VudCA+IC0xKTsKLSAgICAgICAgYmFzZVR5cGUgKnBUQzsKLSAgICAgICAgaW50MzJfdCBpTGFzdCA9IGlTdGFydCAtIGlDb3VudDsKLSAgICAgICAgaWYgKGJDbGFzcykgewotICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSBpU3RhcnQgLSAxOyBpID49IGlMYXN0OyBpIC0tKSB7Ci0gICAgICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKLSAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChpbnQxNl90KWlWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gaVN0YXJ0IC0gMTsgaSA+PSBpTGFzdDsgaSAtLSkgewotICAgICAgICAgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7Ci0gICAgICAgICAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAoaW50MTZfdClpVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBGWF9CaWRpQ2xhc3NpZnkoQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+ICZjaGFycywgaW50MzJfdCBpQ291bnQsIEZYX0JPT0wgYldTKQotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IC0xICYmIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOwotICAgICAgICBiYXNlVHlwZSAqcFRDOwotICAgICAgICBpZiAoYldTKSB7Ci0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOwotICAgICAgICAgICAgICAgIHBUQy0+bV9pQmlkaUNsYXNzID0gKGludDE2X3QpKHBUQy0+bV9kd0NoYXJQcm9wcyAmIEZYX0JJRElDTEFTU0JJVFNNQVNLKSA+PiBGWF9CSURJQ0xBU1NCSVRTOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKLSAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChpbnQxNl90KWdjX0ZYX0JpZGlOVHlwZXNbKHBUQy0+bV9kd0NoYXJQcm9wcyAmIEZYX0JJRElDTEFTU0JJVFNNQVNLKSA+PiBGWF9CSURJQ0xBU1NCSVRTXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIEZYX0JpZGlSZXNvbHZlRXhwbGljaXQoQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+ICZjaGFycywgaW50MzJfdCBpQ291bnQsIGludDMyX3QgaUJhc2VMZXZlbCkKLSAgICB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAtMSAmJiBpQ291bnQgPD0gY2hhcnMuR2V0U2l6ZSgpKTsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7Ci0gICAgICAgIGlmIChpQ291bnQgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYmFzZVR5cGUgKnBUQzsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOwotICAgICAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAoaW50MTZfdClpQmFzZUxldmVsOwotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgRlhfQmlkaVJlc29sdmVXZWFrKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiAmY2hhcnMsIGludDMyX3QgaUNvdW50LCBpbnQzMl90IGlCYXNlTGV2ZWwpCi0gICAgewotICAgICAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7Ci0gICAgICAgIGlDb3VudCAtLTsKLSAgICAgICAgaWYgKGlDb3VudCA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBiYXNlVHlwZSAqcFRDLCAqcFRDTmV4dDsKLSAgICAgICAgaW50MzJfdCBpTGV2ZWxDdXIgPSBpQmFzZUxldmVsOwotICAgICAgICBpbnQzMl90IGlTdGF0ZSA9IEZYX0lzT2RkKGlCYXNlTGV2ZWwpID8gRlhfQldTeHIgOiBGWF9CV1N4bDsKLSAgICAgICAgaW50MzJfdCBpID0gMCwgaU51bSA9IDAsIGlDbHNDdXIsIGlDbHNSdW4sIGlDbHNOZXcsIGlBY3Rpb247Ci0gICAgICAgIGZvciAoOyBpIDw9IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKLSAgICAgICAgICAgIGlDbHNDdXIgPSBwVEMtPm1faUJpZGlDbGFzczsKLSAgICAgICAgICAgIGlmIChpQ2xzQ3VyID09IEZYX0JJRElDTEFTU19CTikgewotICAgICAgICAgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsQ3VyOwotICAgICAgICAgICAgICAgIGlmIChpID09IGlDb3VudCAmJiBpTGV2ZWxDdXIgIT0gaUJhc2VMZXZlbCkgewotICAgICAgICAgICAgICAgICAgICBpQ2xzQ3VyID0gRlhfQmlkaURpcmVjdGlvbihpTGV2ZWxDdXIpOwotICAgICAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChpbnQxNl90KWlDbHNDdXI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgaUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBUQ05leHQgPSBjaGFycy5HZXREYXRhUHRyKGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGV2ZWxOZXh0LCBpTGV2ZWxOZXc7Ci0gICAgICAgICAgICAgICAgICAgIGlDbHNOZXcgPSBwVENOZXh0LT5tX2lCaWRpQ2xhc3M7Ci0gICAgICAgICAgICAgICAgICAgIGlMZXZlbE5leHQgPSBwVENOZXh0LT5tX2lCaWRpTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpQ2xzTmV3ICE9IEZYX0JJRElDTEFTU19CTiAmJiBpTGV2ZWxDdXIgIT0gaUxldmVsTmV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaUxldmVsTmV3ID0gaUxldmVsTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpTGV2ZWxDdXIgPiBpTGV2ZWxOZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTGV2ZWxOZXcgPSBpTGV2ZWxDdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IChpbnQxNl90KWlMZXZlbE5ldzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlDbHNDdXIgPSBGWF9CaWRpRGlyZWN0aW9uKGlMZXZlbE5ldyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChpbnQxNl90KWlDbHNDdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpTGV2ZWxDdXIgPSBpTGV2ZWxOZXh0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlOdW0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaU51bSArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlOdW0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpTnVtICsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChpQ2xzQ3VyIDw9IEZYX0JJRElDTEFTU19CTik7Ci0gICAgICAgICAgICBpQWN0aW9uID0gZ2NfRlhfQmlkaVdlYWtBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl07Ci0gICAgICAgICAgICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkVHlwZShpQWN0aW9uKTsKLSAgICAgICAgICAgIGlmIChpQ2xzUnVuICE9IEZYX0JJRElXRUFLQUNUSU9OX1hYICYmIGlOdW0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNoYXJzLCBUUlVFLCBpLCBpTnVtLCBpQ2xzUnVuKTsKLSAgICAgICAgICAgICAgICBpTnVtID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlDbHNOZXcgPSBGWF9CaWRpR2V0UmVzb2x2ZWRUeXBlKGlBY3Rpb24pOwotICAgICAgICAgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESVdFQUtBQ1RJT05fWFgpIHsKLSAgICAgICAgICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChpbnQxNl90KWlDbHNOZXc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRlhfQklESVdFQUtBQ1RJT05fSVggJiBpQWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaU51bSArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlTdGF0ZSA9IGdjX0ZYX0JpZGlXZWFrU3RhdGVzW2lTdGF0ZV1baUNsc0N1cl07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlOdW0gPiAwKSB7Ci0gICAgICAgICAgICBpQ2xzQ3VyID0gRlhfQmlkaURpcmVjdGlvbihpQmFzZUxldmVsKTsKLSAgICAgICAgICAgIGlDbHNSdW4gPSBGWF9CaWRpR2V0RGVmZXJyZWRUeXBlKGdjX0ZYX0JpZGlXZWFrQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdKTsKLSAgICAgICAgICAgIGlmIChpQ2xzUnVuICE9IEZYX0JJRElXRUFLQUNUSU9OX1hYKSB7Ci0gICAgICAgICAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNoYXJzLCBUUlVFLCBpLCBpTnVtLCBpQ2xzUnVuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIEZYX0JpZGlSZXNvbHZlTmV1dHJhbHMoQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+ICZjaGFycywgaW50MzJfdCBpQ291bnQsIGludDMyX3QgaUJhc2VMZXZlbCkKLSAgICB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAtMSAmJiBpQ291bnQgPD0gY2hhcnMuR2V0U2l6ZSgpKTsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7Ci0gICAgICAgIGlDb3VudCAtLTsKLSAgICAgICAgaWYgKGlDb3VudCA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBiYXNlVHlwZSAqcFRDOwotICAgICAgICBpbnQzMl90IGlMZXZlbCA9IGlCYXNlTGV2ZWw7Ci0gICAgICAgIGludDMyX3QgaVN0YXRlID0gRlhfSXNPZGQoaUJhc2VMZXZlbCkgPyBGWF9CTlNyIDogRlhfQk5TbDsKLSAgICAgICAgaW50MzJfdCBpID0gMCwgaU51bSA9IDAsIGlDbHNDdXIsIGlDbHNSdW4sIGlDbHNOZXcsIGlBY3Rpb247Ci0gICAgICAgIGZvciAoOyBpIDw9IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKLSAgICAgICAgICAgIGlDbHNDdXIgPSBwVEMtPm1faUJpZGlDbGFzczsKLSAgICAgICAgICAgIGlmIChpQ2xzQ3VyID09IEZYX0JJRElDTEFTU19CTikgewotICAgICAgICAgICAgICAgIGlmIChpTnVtKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlOdW0gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGlDbHNDdXIgPCBGWF9CSURJQ0xBU1NfQUwpOwotICAgICAgICAgICAgaUFjdGlvbiA9IGdjX0ZYX0JpZGlOZXV0cmFsQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdOwotICAgICAgICAgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZE5ldXRyYWxzKGlBY3Rpb24sIGlMZXZlbCk7Ci0gICAgICAgICAgICBpZiAoaUNsc1J1biAhPSBGWF9CSURJQ0xBU1NfTiAmJiBpTnVtID4gMCkgewotICAgICAgICAgICAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjaGFycywgVFJVRSwgaSwgaU51bSwgaUNsc1J1bik7Ci0gICAgICAgICAgICAgICAgaU51bSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpQ2xzTmV3ID0gRlhfQmlkaUdldFJlc29sdmVkTmV1dHJhbHMoaUFjdGlvbik7Ci0gICAgICAgICAgICBpZiAoaUNsc05ldyAhPSBGWF9CSURJQ0xBU1NfTikgewotICAgICAgICAgICAgICAgIHBUQy0+bV9pQmlkaUNsYXNzID0gKGludDE2X3QpaUNsc05ldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChGWF9CSURJTkVVVFJBTEFDVElPTl9JbiAmIGlBY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBpTnVtICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaVN0YXRlID0gZ2NfRlhfQmlkaU5ldXRyYWxTdGF0ZXNbaVN0YXRlXVtpQ2xzQ3VyXTsKLSAgICAgICAgICAgIGlMZXZlbCA9IHBUQy0+bV9pQmlkaUxldmVsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpTnVtID4gMCkgewotICAgICAgICAgICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsKTsKLSAgICAgICAgICAgIGlDbHNSdW4gPSBGWF9CaWRpR2V0RGVmZXJyZWROZXV0cmFscyhnY19GWF9CaWRpTmV1dHJhbEFjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXSwgaUxldmVsKTsKLSAgICAgICAgICAgIGlmIChpQ2xzUnVuICE9IEZYX0JJRElDTEFTU19OKSB7Ci0gICAgICAgICAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNoYXJzLCBUUlVFLCBpLCBpTnVtLCBpQ2xzUnVuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIEZYX0JpZGlSZXNvbHZlSW1wbGljaXQoQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+ICZjaGFycywgaW50MzJfdCBpQ291bnQpCi0gICAgewotICAgICAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7Ci0gICAgICAgIGJhc2VUeXBlICpwVEM7Ci0gICAgICAgIGludDMyX3QgaUNscywgaUxldmVsOwotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7Ci0gICAgICAgICAgICBpQ2xzID0gcFRDLT5tX2lCaWRpQ2xhc3M7Ci0gICAgICAgICAgICBpZiAoaUNscyA9PSBGWF9CSURJQ0xBU1NfQk4pIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChpQ2xzID4gRlhfQklESUNMQVNTX09OICYmIGlDbHMgPCBGWF9CSURJQ0xBU1NfQUwpOwotICAgICAgICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7Ci0gICAgICAgICAgICBpTGV2ZWwgKz0gZ2NfRlhfQmlkaUFkZExldmVsW0ZYX0lzT2RkKGlMZXZlbCldW2lDbHMgLSAxXTsKLSAgICAgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsOwotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgRlhfQmlkaVJlc29sdmVXaGl0ZXNwYWNlKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiAmY2hhcnMsIGludDMyX3QgaUNvdW50LCBpbnQzMl90IGlCYXNlTGV2ZWwpCi0gICAgewotICAgICAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOwotICAgICAgICBpZiAoaUNvdW50IDwgMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlDb3VudCAtLTsKLSAgICAgICAgaW50MzJfdCBpTGV2ZWwgPSBpQmFzZUxldmVsOwotICAgICAgICBpbnQzMl90IGkgPSAwLCBpTnVtID0gMDsKLSAgICAgICAgYmFzZVR5cGUgKnBUQzsKLSAgICAgICAgZm9yICg7IGkgPD0gaUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOwotICAgICAgICAgICAgc3dpdGNoKHBUQy0+bV9pQmlkaUNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfV1M6Ci0gICAgICAgICAgICAgICAgICAgIGlOdW0gKys7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMRToKLSAgICAgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19MUkU6Ci0gICAgICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJPOgotICAgICAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMTzoKLSAgICAgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19QREY6Ci0gICAgICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfQk46Ci0gICAgICAgICAgICAgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsOwotICAgICAgICAgICAgICAgICAgICBpTnVtICsrOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19TOgotICAgICAgICAgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX0I6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpTnVtID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNoYXJzLCBGQUxTRSwgaSwgaU51bSwgaUJhc2VMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAoaW50MTZfdClpQmFzZUxldmVsOwotICAgICAgICAgICAgICAgICAgICBpTnVtID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaU51bSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlOdW0gPiAwKSB7Ci0gICAgICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2hhcnMsIEZBTFNFLCBpLCBpTnVtLCBpQmFzZUxldmVsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQzMl90IEZYX0JpZGlSZW9yZGVyTGV2ZWwoQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+ICZjaGFycywgaW50MzJfdCBpQ291bnQsIGludDMyX3QgaUJhc2VMZXZlbCwgaW50MzJfdCBpU3RhcnQsIEZYX0JPT0wgYlJldmVyc2UpCi0gICAgewotICAgICAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOwotICAgICAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID49IDAgJiYgaVN0YXJ0IDwgaUNvdW50KTsKLSAgICAgICAgaWYgKGlDb3VudCA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGJhc2VUeXBlICpwVEM7Ci0gICAgICAgIGJSZXZlcnNlID0gYlJldmVyc2UgfHwgRlhfSXNPZGQoaUJhc2VMZXZlbCk7Ci0gICAgICAgIGludDMyX3QgaSA9IGlTdGFydCwgaUxldmVsOwotICAgICAgICBmb3IgKDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKLSAgICAgICAgICAgIGlmICgoaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWwpID09IGlCYXNlTGV2ZWwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpTGV2ZWwgPCBpQmFzZUxldmVsKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpICs9IEZYX0JpZGlSZW9yZGVyTGV2ZWwoY2hhcnMsIGlDb3VudCwgaUJhc2VMZXZlbCArIDEsIGksIGJSZXZlcnNlKSAtIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBpTnVtID0gaSAtIGlTdGFydDsKLSAgICAgICAgaWYgKGJSZXZlcnNlICYmIGlOdW0gPiAxKSB7Ci0gICAgICAgICAgICBGWF9CaWRpUmV2ZXJzZVN0cmluZyhjaGFycywgaVN0YXJ0LCBpTnVtKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaU51bTsKLSAgICB9Ci0gICAgdm9pZCBGWF9CaWRpUmVvcmRlcihDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4gJmNoYXJzLCBpbnQzMl90IGlDb3VudCwgaW50MzJfdCBpQmFzZUxldmVsKQotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IC0xICYmIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOwotICAgICAgICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMKTsKLSAgICAgICAgaW50MzJfdCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKLSAgICAgICAgICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChjaGFycywgaUNvdW50LCBpQmFzZUxldmVsLCBpLCBGQUxTRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBGWF9CaWRpUG9zaXRpb24oQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+ICZjaGFycywgaW50MzJfdCBpQ291bnQpCi0gICAgewotICAgICAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7Ci0gICAgICAgIGJhc2VUeXBlICpwVEM7Ci0gICAgICAgIGludDMyX3QgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChpIDwgaUNvdW50KSB7Ci0gICAgICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOwotICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihwVEMtPm1faUJpZGlQb3MpOwotICAgICAgICAgICAgcFRDLT5tX2lCaWRpT3JkZXIgPSBpICsrOwotICAgICAgICB9Ci0gICAgfQorICB9CiAKLSAgICB2b2lkIEZYX0JpZGlMaW5lKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiAmY2hhcnMsIGludDMyX3QgaUNvdW50LCBpbnQzMl90IGlCYXNlTGV2ZWwpCi0gICAgewotICAgICAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7Ci0gICAgICAgIGlmIChpQ291bnQgPCAyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQmlkaUNsYXNzaWZ5KGNoYXJzLCBpQ291bnQsIEZBTFNFKTsKLSAgICAgICAgRlhfQmlkaVJlc29sdmVFeHBsaWNpdChjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKLSAgICAgICAgRlhfQmlkaVJlc29sdmVXZWFrKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOwotICAgICAgICBGWF9CaWRpUmVzb2x2ZU5ldXRyYWxzKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOwotICAgICAgICBGWF9CaWRpUmVzb2x2ZUltcGxpY2l0KGNoYXJzLCBpQ291bnQpOwotICAgICAgICBGWF9CaWRpQ2xhc3NpZnkoY2hhcnMsIGlDb3VudCwgVFJVRSk7Ci0gICAgICAgIEZYX0JpZGlSZXNvbHZlV2hpdGVzcGFjZShjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKLSAgICAgICAgRlhfQmlkaVJlb3JkZXIoY2hhcnMsIGlDb3VudCwgaUJhc2VMZXZlbCk7Ci0gICAgICAgIEZYX0JpZGlQb3NpdGlvbihjaGFycywgaUNvdW50KTsKKyAgdm9pZCBGWF9CaWRpTGluZShDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4mIGNoYXJzLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJhc2VMZXZlbCkgeworICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAtMSAmJiBpQ291bnQgPD0gY2hhcnMuR2V0U2l6ZSgpKTsKKyAgICBpZiAoaUNvdW50IDwgMikgeworICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBGWF9CaWRpQ2xhc3NpZnkoY2hhcnMsIGlDb3VudCwgRkFMU0UpOworICAgIEZYX0JpZGlSZXNvbHZlRXhwbGljaXQoY2hhcnMsIGlDb3VudCwgaUJhc2VMZXZlbCk7CisgICAgRlhfQmlkaVJlc29sdmVXZWFrKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOworICAgIEZYX0JpZGlSZXNvbHZlTmV1dHJhbHMoY2hhcnMsIGlDb3VudCwgaUJhc2VMZXZlbCk7CisgICAgRlhfQmlkaVJlc29sdmVJbXBsaWNpdChjaGFycywgaUNvdW50KTsKKyAgICBGWF9CaWRpQ2xhc3NpZnkoY2hhcnMsIGlDb3VudCwgVFJVRSk7CisgICAgRlhfQmlkaVJlc29sdmVXaGl0ZXNwYWNlKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOworICAgIEZYX0JpZGlSZW9yZGVyKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOworICAgIEZYX0JpZGlQb3NpdGlvbihjaGFycywgaUNvdW50KTsKKyAgfQogfTsKLXZvaWQgRlhfQmlkaUxpbmUoQ0ZYX1R4dENoYXJBcnJheSAmY2hhcnMsIGludDMyX3QgaUNvdW50LCBpbnQzMl90IGlCYXNlTGV2ZWwpCi17Ci0gICAgQ0ZYX0JpZGlMaW5lVGVtcGxhdGU8Q0ZYX1R4dENoYXI+IGJsdDsKLSAgICBibHQuRlhfQmlkaUxpbmUoY2hhcnMsIGlDb3VudCwgaUJhc2VMZXZlbCk7Cit2b2lkIEZYX0JpZGlMaW5lKENGWF9UeHRDaGFyQXJyYXkmIGNoYXJzLCBpbnQzMl90IGlDb3VudCwgaW50MzJfdCBpQmFzZUxldmVsKSB7CisgIENGWF9CaWRpTGluZVRlbXBsYXRlPENGWF9UeHRDaGFyPiBibHQ7CisgIGJsdC5GWF9CaWRpTGluZShjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKIH0KLXZvaWQgRlhfQmlkaUxpbmUoQ0ZYX1JURkNoYXJBcnJheSAmY2hhcnMsIGludDMyX3QgaUNvdW50LCBpbnQzMl90IGlCYXNlTGV2ZWwpCi17Ci0gICAgQ0ZYX0JpZGlMaW5lVGVtcGxhdGU8Q0ZYX1JURkNoYXI+IGJsdDsKLSAgICBibHQuRlhfQmlkaUxpbmUoY2hhcnMsIGlDb3VudCwgaUJhc2VMZXZlbCk7Cit2b2lkIEZYX0JpZGlMaW5lKENGWF9SVEZDaGFyQXJyYXkmIGNoYXJzLCBpbnQzMl90IGlDb3VudCwgaW50MzJfdCBpQmFzZUxldmVsKSB7CisgIENGWF9CaWRpTGluZVRlbXBsYXRlPENGWF9SVEZDaGFyPiBibHQ7CisgIGJsdC5GWF9CaWRpTGluZShjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKIH0KLUlGWF9CaWRpQ2hhciogSUZYX0JpZGlDaGFyOjpDcmVhdGUoKQotewotICAgIHJldHVybiBGWF9ORVcgQ0ZYX0JpZGlDaGFyOworSUZYX0JpZGlDaGFyKiBJRlhfQmlkaUNoYXI6OkNyZWF0ZSgpIHsKKyAgcmV0dXJuIEZYX05FVyBDRlhfQmlkaUNoYXI7CiB9CiBDRlhfQmlkaUNoYXI6OkNGWF9CaWRpQ2hhcigpCi0gICAgOiBtX2JTZXBhcmF0ZU5ldXRyYWwoVFJVRSkKLSAgICAsIG1faUN1clN0YXJ0KDApCi0gICAgLCBtX2lDdXJDb3VudCgwKQotICAgICwgbV9pQ3VyQmlkaSgwKQotICAgICwgbV9pTGFzdEJpZGkoMCkKLSAgICAsIG1faUxhc3RTdGFydCgwKQotICAgICwgbV9pTGFzdENvdW50KDApCi17Ci19Ci12b2lkIENGWF9CaWRpQ2hhcjo6U2V0UG9saWN5KEZYX0JPT0wgYlNlcGFyYXRlTmV1dHJhbCkKLXsKLSAgICBtX2JTZXBhcmF0ZU5ldXRyYWwgPSBiU2VwYXJhdGVOZXV0cmFsOworICAgIDogbV9iU2VwYXJhdGVOZXV0cmFsKFRSVUUpLAorICAgICAgbV9pQ3VyU3RhcnQoMCksCisgICAgICBtX2lDdXJDb3VudCgwKSwKKyAgICAgIG1faUN1ckJpZGkoMCksCisgICAgICBtX2lMYXN0QmlkaSgwKSwKKyAgICAgIG1faUxhc3RTdGFydCgwKSwKKyAgICAgIG1faUxhc3RDb3VudCgwKSB7fQordm9pZCBDRlhfQmlkaUNoYXI6OlNldFBvbGljeShGWF9CT09MIGJTZXBhcmF0ZU5ldXRyYWwpIHsKKyAgbV9iU2VwYXJhdGVOZXV0cmFsID0gYlNlcGFyYXRlTmV1dHJhbDsKIH0KIAotRlhfQk9PTCBDRlhfQmlkaUNoYXI6OkFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKQotewotICAgIEZYX0RXT1JEIGR3UHJvcHMgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07Ci0gICAgaW50MzJfdCBpQmlkaUNscyA9IChkd1Byb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+IEZYX0JJRElDTEFTU0JJVFM7Ci0gICAgaW50MzJfdCBpQ29udGV4dCA9IDA7Ci0gICAgc3dpdGNoIChpQmlkaUNscykgewotICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19MOgotICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19BTjoKLSAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfRU46Ci0gICAgICAgICAgICBpQ29udGV4dCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUjoKLSAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfQUw6Ci0gICAgICAgICAgICBpQ29udGV4dCA9IDI7Ci0gICAgICAgICAgICBicmVhazsKK0ZYX0JPT0wgQ0ZYX0JpZGlDaGFyOjpBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgeworICBGWF9EV09SRCBkd1Byb3BzID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOworICBpbnQzMl90IGlCaWRpQ2xzID0gKGR3UHJvcHMgJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4gRlhfQklESUNMQVNTQklUUzsKKyAgaW50MzJfdCBpQ29udGV4dCA9IDA7CisgIHN3aXRjaCAoaUJpZGlDbHMpIHsKKyAgICBjYXNlIEZYX0JJRElDTEFTU19MOgorICAgIGNhc2UgRlhfQklESUNMQVNTX0FOOgorICAgIGNhc2UgRlhfQklESUNMQVNTX0VOOgorICAgICAgaUNvbnRleHQgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWF9CSURJQ0xBU1NfUjoKKyAgICBjYXNlIEZYX0JJRElDTEFTU19BTDoKKyAgICAgIGlDb250ZXh0ID0gMjsKKyAgICAgIGJyZWFrOworICB9CisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBpZiAoaUNvbnRleHQgIT0gbV9pQ3VyQmlkaSkgeworICAgIGlmIChtX2JTZXBhcmF0ZU5ldXRyYWwpIHsKKyAgICAgIGJSZXQgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9pQ3VyQmlkaSA9PSAwKSB7CisgICAgICAgIGJSZXQgPSAobV9pQ3VyQ291bnQgPiAwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJSZXQgPSAoaUNvbnRleHQgIT0gMCk7CisgICAgICB9CiAgICAgfQotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOwotICAgIGlmIChpQ29udGV4dCAhPSBtX2lDdXJCaWRpKSB7Ci0gICAgICAgIGlmIChtX2JTZXBhcmF0ZU5ldXRyYWwpIHsKLSAgICAgICAgICAgIGJSZXQgPSBUUlVFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1faUN1ckJpZGkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJSZXQgPSAobV9pQ3VyQ291bnQgPiAwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYlJldCA9IChpQ29udGV4dCAhPSAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYlJldCkgewotICAgICAgICAgICAgbV9pTGFzdEJpZGkgPSBtX2lDdXJCaWRpOwotICAgICAgICAgICAgbV9pTGFzdFN0YXJ0ID0gbV9pQ3VyU3RhcnQ7Ci0gICAgICAgICAgICBtX2lDdXJTdGFydCA9IG1faUN1ckNvdW50OwotICAgICAgICAgICAgbV9pTGFzdENvdW50ID0gbV9pQ3VyQ291bnQgLSBtX2lMYXN0U3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fYlNlcGFyYXRlTmV1dHJhbCB8fCBpQ29udGV4dCAhPSAwKSB7Ci0gICAgICAgICAgICBtX2lDdXJCaWRpID0gaUNvbnRleHQ7Ci0gICAgICAgIH0KKyAgICBpZiAoYlJldCkgeworICAgICAgbV9pTGFzdEJpZGkgPSBtX2lDdXJCaWRpOworICAgICAgbV9pTGFzdFN0YXJ0ID0gbV9pQ3VyU3RhcnQ7CisgICAgICBtX2lDdXJTdGFydCA9IG1faUN1ckNvdW50OworICAgICAgbV9pTGFzdENvdW50ID0gbV9pQ3VyQ291bnQgLSBtX2lMYXN0U3RhcnQ7CiAgICAgfQotICAgIG1faUN1ckNvdW50ICsrOwotICAgIHJldHVybiBiUmV0OworICAgIGlmIChtX2JTZXBhcmF0ZU5ldXRyYWwgfHwgaUNvbnRleHQgIT0gMCkgeworICAgICAgbV9pQ3VyQmlkaSA9IGlDb250ZXh0OworICAgIH0KKyAgfQorICBtX2lDdXJDb3VudCsrOworICByZXR1cm4gYlJldDsKIH0KLUZYX0JPT0wgQ0ZYX0JpZGlDaGFyOjpFbmRDaGFyKCkKLXsKLSAgICBtX2lMYXN0QmlkaSA9IG1faUN1ckJpZGk7Ci0gICAgbV9pTGFzdFN0YXJ0ID0gbV9pQ3VyU3RhcnQ7Ci0gICAgbV9pQ3VyU3RhcnQgPSBtX2lDdXJDb3VudDsKLSAgICBtX2lMYXN0Q291bnQgPSBtX2lDdXJDb3VudCAtIG1faUxhc3RTdGFydDsKLSAgICByZXR1cm4gbV9pTGFzdENvdW50ID4gMDsKK0ZYX0JPT0wgQ0ZYX0JpZGlDaGFyOjpFbmRDaGFyKCkgeworICBtX2lMYXN0QmlkaSA9IG1faUN1ckJpZGk7CisgIG1faUxhc3RTdGFydCA9IG1faUN1clN0YXJ0OworICBtX2lDdXJTdGFydCA9IG1faUN1ckNvdW50OworICBtX2lMYXN0Q291bnQgPSBtX2lDdXJDb3VudCAtIG1faUxhc3RTdGFydDsKKyAgcmV0dXJuIG1faUxhc3RDb3VudCA+IDA7CiB9Ci1pbnQzMl90IENGWF9CaWRpQ2hhcjo6R2V0QmlkaUluZm8oaW50MzJfdCAmaVN0YXJ0LCBpbnQzMl90ICZpQ291bnQpCi17Ci0gICAgaVN0YXJ0ID0gbV9pTGFzdFN0YXJ0OwotICAgIGlDb3VudCA9IG1faUxhc3RDb3VudDsKLSAgICByZXR1cm4gbV9pTGFzdEJpZGk7CitpbnQzMl90IENGWF9CaWRpQ2hhcjo6R2V0QmlkaUluZm8oaW50MzJfdCYgaVN0YXJ0LCBpbnQzMl90JiBpQ291bnQpIHsKKyAgaVN0YXJ0ID0gbV9pTGFzdFN0YXJ0OworICBpQ291bnQgPSBtX2lMYXN0Q291bnQ7CisgIHJldHVybiBtX2lMYXN0QmlkaTsKIH0KLXZvaWQgQ0ZYX0JpZGlDaGFyOjpSZXNldCgpCi17Ci0gICAgbV9pQ3VyU3RhcnQgPSAwOwotICAgIG1faUN1ckNvdW50ID0gMDsKLSAgICBtX2lDdXJCaWRpID0gMDsKLSAgICBtX2lMYXN0QmlkaSA9IDA7Ci0gICAgbV9pTGFzdFN0YXJ0ID0gMDsKLSAgICBtX2lMYXN0Q291bnQgPSAwOwordm9pZCBDRlhfQmlkaUNoYXI6OlJlc2V0KCkgeworICBtX2lDdXJTdGFydCA9IDA7CisgIG1faUN1ckNvdW50ID0gMDsKKyAgbV9pQ3VyQmlkaSA9IDA7CisgIG1faUxhc3RCaWRpID0gMDsKKyAgbV9pTGFzdFN0YXJ0ID0gMDsKKyAgbV9pTGFzdENvdW50ID0gMDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5oIGIvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKaW5kZXggMjE2NTQ3NS4uODM4OTNlMyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgKQEAgLTksMTk1ICs5LDIyMyBAQAogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9hcmIuaCIKIAotY2xhc3MgQ0ZYX0FyYWJpY0NoYXIgOiBwdWJsaWMgSUZYX0FyYWJpY0NoYXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKQotICAgIHsKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNBcmFiaWNDaGFyKEZYX1dDSEFSIHdjaCkgY29uc3Q7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlJc0FyYWJpY0Zvcm1DaGFyKEZYX1dDSEFSIHdjaCkgY29uc3Q7CitjbGFzcyBDRlhfQXJhYmljQ2hhciA6IHB1YmxpYyBJRlhfQXJhYmljQ2hhciB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0KKyAgdmlydHVhbCBGWF9CT09MIElzQXJhYmljQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0OworICB2aXJ0dWFsIEZYX0JPT0wgSXNBcmFiaWNGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0OwogCi0gICAgdmlydHVhbCBGWF9XQ0hBUglHZXRGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX1dDSEFSIHByZXYgPSAwLCBGWF9XQ0hBUiBuZXh0ID0gMCkgY29uc3Q7Ci0gICAgdmlydHVhbCBGWF9XQ0hBUglHZXRGb3JtQ2hhcihjb25zdCBDRlhfQ2hhciAqY3VyLCBjb25zdCBDRlhfQ2hhciAqcHJldiwgY29uc3QgQ0ZYX0NoYXIgKm5leHQpIGNvbnN0OwotcHJvdGVjdGVkOgotICAgIEZYX0xQQ0FSQkZPUk1UQUJMRSBQYXJzZUNoYXIoY29uc3QgQ0ZYX0NoYXIgKnBUQywgRlhfV0NIQVIgJndDaGFyLCBGWF9DSEFSVFlQRSAmZVR5cGUpIGNvbnN0OworICB2aXJ0dWFsIEZYX1dDSEFSIEdldEZvcm1DaGFyKEZYX1dDSEFSIHdjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBwcmV2ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBuZXh0ID0gMCkgY29uc3Q7CisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0Rm9ybUNoYXIoY29uc3QgQ0ZYX0NoYXIqIGN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2hhciogcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2hhciogbmV4dCkgY29uc3Q7CisKKyBwcm90ZWN0ZWQ6CisgIEZYX0xQQ0FSQkZPUk1UQUJMRSBQYXJzZUNoYXIoY29uc3QgQ0ZYX0NoYXIqIHBUQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiYgd0NoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUlRZUEUmIGVUeXBlKSBjb25zdDsKIH07Ci12b2lkIEZYX0JpZGlSZXZlcnNlU3RyaW5nKENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlDb3VudCk7Ci12b2lkIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihDRlhfSW50MzJBcnJheSAmdmFsdWVzLCBpbnQzMl90IGlTdGFydCwgaW50MzJfdCBpQ291bnQsIGludDMyX3QgaVZhbHVlKTsKLSNkZWZpbmUgRlhfQkNPTgkJRlhfQklESUNMQVNTX09OCi0jZGVmaW5lIEZYX0JDTAkJRlhfQklESUNMQVNTX0wKLSNkZWZpbmUgRlhfQkNSCQlGWF9CSURJQ0xBU1NfUgotI2RlZmluZSBGWF9CQ0FOCQlGWF9CSURJQ0xBU1NfQU4KLSNkZWZpbmUgRlhfQkNFTgkJRlhfQklESUNMQVNTX0VOCi0jZGVmaW5lIEZYX0JDQUwJCUZYX0JJRElDTEFTU19BTAotI2RlZmluZSBGWF9CQ05TTQlGWF9CSURJQ0xBU1NfTlNNCi0jZGVmaW5lIEZYX0JDQ1MJCUZYX0JJRElDTEFTU19DUwotI2RlZmluZSBGWF9CQ0VTCQlGWF9CSURJQ0xBU1NfRVMKLSNkZWZpbmUgRlhfQkNFVAkJRlhfQklESUNMQVNTX0VUCi0jZGVmaW5lIEZYX0JDQk4JCUZYX0JJRElDTEFTU19CTgotI2RlZmluZSBGWF9CQ1MJCUZYX0JJRElDTEFTU19TCi0jZGVmaW5lIEZYX0JDV1MJCUZYX0JJRElDTEFTU19XUwotI2RlZmluZSBGWF9CQ0IJCUZYX0JJRElDTEFTU19CCi0jZGVmaW5lIEZYX0JDUkxPCUZYX0JJRElDTEFTU19STE8KLSNkZWZpbmUgRlhfQkNSTEUJRlhfQklESUNMQVNTX1JMRQotI2RlZmluZSBGWF9CQ0xSTwlGWF9CSURJQ0xBU1NfTFJPCi0jZGVmaW5lIEZYX0JDTFJFCUZYX0JJRElDTEFTU19MUkUKLSNkZWZpbmUgRlhfQkNQREYJRlhfQklESUNMQVNTX1BERgotI2RlZmluZSBGWF9CQ04JCUZYX0JJRElDTEFTU19OCi12b2lkIEZYX0JpZGlDbGFzc2lmeShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBDRlhfSW50MzJBcnJheSAmY2xhc3NlcywgRlhfQk9PTCBiV1MgPSBGQUxTRSk7Ci0jZGVmaW5lIEZYX0JJRElNQVhMRVZFTAkJCTYxCi0jZGVmaW5lIEZYX0JpZGlHcmVhdGVyRXZlbihhKQkoRlhfSXNPZGQoYSkgPyAoKGEpICsgMSkgOiAoKGEpICsgMikpCi0jZGVmaW5lIEZYX0JpZGlHcmVhdGVyT2RkKGEpCShGWF9Jc09kZChhKSA/ICgoYSkgKyAyKSA6ICgoYSkgKyAxKSkKLWludDMyX3QgRlhfQmlkaVJlc29sdmVFeHBsaWNpdChpbnQzMl90IGlCYXNlTGV2ZWwsIGludDMyX3QgaURpcmVjdGlvbiwgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMsIGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlDb3VudCwgaW50MzJfdCBpTmVzdCA9IDApOwotI2RlZmluZSBGWF9CaWRpRGlyZWN0aW9uKGEpCShGWF9Jc09kZChhKSA/IEZYX0JJRElDTEFTU19SIDogRlhfQklESUNMQVNTX0wpCit2b2lkIEZYX0JpZGlSZXZlcnNlU3RyaW5nKENGWF9XaWRlU3RyaW5nJiB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCk7Cit2b2lkIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihDRlhfSW50MzJBcnJheSYgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlKTsKKyNkZWZpbmUgRlhfQkNPTiBGWF9CSURJQ0xBU1NfT04KKyNkZWZpbmUgRlhfQkNMIEZYX0JJRElDTEFTU19MCisjZGVmaW5lIEZYX0JDUiBGWF9CSURJQ0xBU1NfUgorI2RlZmluZSBGWF9CQ0FOIEZYX0JJRElDTEFTU19BTgorI2RlZmluZSBGWF9CQ0VOIEZYX0JJRElDTEFTU19FTgorI2RlZmluZSBGWF9CQ0FMIEZYX0JJRElDTEFTU19BTAorI2RlZmluZSBGWF9CQ05TTSBGWF9CSURJQ0xBU1NfTlNNCisjZGVmaW5lIEZYX0JDQ1MgRlhfQklESUNMQVNTX0NTCisjZGVmaW5lIEZYX0JDRVMgRlhfQklESUNMQVNTX0VTCisjZGVmaW5lIEZYX0JDRVQgRlhfQklESUNMQVNTX0VUCisjZGVmaW5lIEZYX0JDQk4gRlhfQklESUNMQVNTX0JOCisjZGVmaW5lIEZYX0JDUyBGWF9CSURJQ0xBU1NfUworI2RlZmluZSBGWF9CQ1dTIEZYX0JJRElDTEFTU19XUworI2RlZmluZSBGWF9CQ0IgRlhfQklESUNMQVNTX0IKKyNkZWZpbmUgRlhfQkNSTE8gRlhfQklESUNMQVNTX1JMTworI2RlZmluZSBGWF9CQ1JMRSBGWF9CSURJQ0xBU1NfUkxFCisjZGVmaW5lIEZYX0JDTFJPIEZYX0JJRElDTEFTU19MUk8KKyNkZWZpbmUgRlhfQkNMUkUgRlhfQklESUNMQVNTX0xSRQorI2RlZmluZSBGWF9CQ1BERiBGWF9CSURJQ0xBU1NfUERGCisjZGVmaW5lIEZYX0JDTiBGWF9CSURJQ0xBU1NfTgordm9pZCBGWF9CaWRpQ2xhc3NpZnkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV1MgPSBGQUxTRSk7CisjZGVmaW5lIEZYX0JJRElNQVhMRVZFTCA2MQorI2RlZmluZSBGWF9CaWRpR3JlYXRlckV2ZW4oYSkgKEZYX0lzT2RkKGEpID8gKChhKSArIDEpIDogKChhKSArIDIpKQorI2RlZmluZSBGWF9CaWRpR3JlYXRlck9kZChhKSAoRlhfSXNPZGQoYSkgPyAoKGEpICsgMikgOiAoKGEpICsgMSkpCitpbnQzMl90IEZYX0JpZGlSZXNvbHZlRXhwbGljaXQoaW50MzJfdCBpQmFzZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgbGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU5lc3QgPSAwKTsKKyNkZWZpbmUgRlhfQmlkaURpcmVjdGlvbihhKSAoRlhfSXNPZGQoYSkgPyBGWF9CSURJQ0xBU1NfUiA6IEZYX0JJRElDTEFTU19MKQogZW51bSBGWF9CSURJV0VBS1NUQVRFIHsKLSAgICBGWF9CSURJV0VBS1NUQVRFX3hhID0gMCwKLSAgICBGWF9CSURJV0VBS1NUQVRFX3hyLAotICAgIEZYX0JJRElXRUFLU1RBVEVfeGwsCi0gICAgRlhfQklESVdFQUtTVEFURV9hbywKLSAgICBGWF9CSURJV0VBS1NUQVRFX3JvLAotICAgIEZYX0JJRElXRUFLU1RBVEVfbG8sCi0gICAgRlhfQklESVdFQUtTVEFURV9ydCwKLSAgICBGWF9CSURJV0VBS1NUQVRFX2x0LAotICAgIEZYX0JJRElXRUFLU1RBVEVfY24sCi0gICAgRlhfQklESVdFQUtTVEFURV9yYSwKLSAgICBGWF9CSURJV0VBS1NUQVRFX3JlLAotICAgIEZYX0JJRElXRUFLU1RBVEVfbGEsCi0gICAgRlhfQklESVdFQUtTVEFURV9sZSwKLSAgICBGWF9CSURJV0VBS1NUQVRFX2FjLAotICAgIEZYX0JJRElXRUFLU1RBVEVfcmMsCi0gICAgRlhfQklESVdFQUtTVEFURV9ycywKLSAgICBGWF9CSURJV0VBS1NUQVRFX2xjLAotICAgIEZYX0JJRElXRUFLU1RBVEVfbHMsCi0gICAgRlhfQklESVdFQUtTVEFURV9yZXQsCi0gICAgRlhfQklESVdFQUtTVEFURV9sZXQsCisgIEZYX0JJRElXRUFLU1RBVEVfeGEgPSAwLAorICBGWF9CSURJV0VBS1NUQVRFX3hyLAorICBGWF9CSURJV0VBS1NUQVRFX3hsLAorICBGWF9CSURJV0VBS1NUQVRFX2FvLAorICBGWF9CSURJV0VBS1NUQVRFX3JvLAorICBGWF9CSURJV0VBS1NUQVRFX2xvLAorICBGWF9CSURJV0VBS1NUQVRFX3J0LAorICBGWF9CSURJV0VBS1NUQVRFX2x0LAorICBGWF9CSURJV0VBS1NUQVRFX2NuLAorICBGWF9CSURJV0VBS1NUQVRFX3JhLAorICBGWF9CSURJV0VBS1NUQVRFX3JlLAorICBGWF9CSURJV0VBS1NUQVRFX2xhLAorICBGWF9CSURJV0VBS1NUQVRFX2xlLAorICBGWF9CSURJV0VBS1NUQVRFX2FjLAorICBGWF9CSURJV0VBS1NUQVRFX3JjLAorICBGWF9CSURJV0VBS1NUQVRFX3JzLAorICBGWF9CSURJV0VBS1NUQVRFX2xjLAorICBGWF9CSURJV0VBS1NUQVRFX2xzLAorICBGWF9CSURJV0VBS1NUQVRFX3JldCwKKyAgRlhfQklESVdFQUtTVEFURV9sZXQsCiB9OwotI2RlZmluZSBGWF9CV1N4YQlGWF9CSURJV0VBS1NUQVRFX3hhCi0jZGVmaW5lIEZYX0JXU3hyCUZYX0JJRElXRUFLU1RBVEVfeHIKLSNkZWZpbmUgRlhfQldTeGwJRlhfQklESVdFQUtTVEFURV94bAotI2RlZmluZSBGWF9CV1NhbwlGWF9CSURJV0VBS1NUQVRFX2FvCi0jZGVmaW5lIEZYX0JXU3JvCUZYX0JJRElXRUFLU1RBVEVfcm8KLSNkZWZpbmUgRlhfQldTbG8JRlhfQklESVdFQUtTVEFURV9sbwotI2RlZmluZSBGWF9CV1NydAlGWF9CSURJV0VBS1NUQVRFX3J0Ci0jZGVmaW5lIEZYX0JXU2x0CUZYX0JJRElXRUFLU1RBVEVfbHQKLSNkZWZpbmUgRlhfQldTY24JRlhfQklESVdFQUtTVEFURV9jbgotI2RlZmluZSBGWF9CV1NyYQlGWF9CSURJV0VBS1NUQVRFX3JhCi0jZGVmaW5lIEZYX0JXU3JlCUZYX0JJRElXRUFLU1RBVEVfcmUKLSNkZWZpbmUgRlhfQldTbGEJRlhfQklESVdFQUtTVEFURV9sYQotI2RlZmluZSBGWF9CV1NsZQlGWF9CSURJV0VBS1NUQVRFX2xlCi0jZGVmaW5lIEZYX0JXU2FjCUZYX0JJRElXRUFLU1RBVEVfYWMKLSNkZWZpbmUgRlhfQldTcmMJRlhfQklESVdFQUtTVEFURV9yYwotI2RlZmluZSBGWF9CV1NycwlGWF9CSURJV0VBS1NUQVRFX3JzCi0jZGVmaW5lIEZYX0JXU2xjCUZYX0JJRElXRUFLU1RBVEVfbGMKLSNkZWZpbmUgRlhfQldTbHMJRlhfQklESVdFQUtTVEFURV9scwotI2RlZmluZSBGWF9CV1NyZXQJRlhfQklESVdFQUtTVEFURV9yZXQKLSNkZWZpbmUgRlhfQldTbGV0CUZYX0JJRElXRUFLU1RBVEVfbGV0CisjZGVmaW5lIEZYX0JXU3hhIEZYX0JJRElXRUFLU1RBVEVfeGEKKyNkZWZpbmUgRlhfQldTeHIgRlhfQklESVdFQUtTVEFURV94cgorI2RlZmluZSBGWF9CV1N4bCBGWF9CSURJV0VBS1NUQVRFX3hsCisjZGVmaW5lIEZYX0JXU2FvIEZYX0JJRElXRUFLU1RBVEVfYW8KKyNkZWZpbmUgRlhfQldTcm8gRlhfQklESVdFQUtTVEFURV9ybworI2RlZmluZSBGWF9CV1NsbyBGWF9CSURJV0VBS1NUQVRFX2xvCisjZGVmaW5lIEZYX0JXU3J0IEZYX0JJRElXRUFLU1RBVEVfcnQKKyNkZWZpbmUgRlhfQldTbHQgRlhfQklESVdFQUtTVEFURV9sdAorI2RlZmluZSBGWF9CV1NjbiBGWF9CSURJV0VBS1NUQVRFX2NuCisjZGVmaW5lIEZYX0JXU3JhIEZYX0JJRElXRUFLU1RBVEVfcmEKKyNkZWZpbmUgRlhfQldTcmUgRlhfQklESVdFQUtTVEFURV9yZQorI2RlZmluZSBGWF9CV1NsYSBGWF9CSURJV0VBS1NUQVRFX2xhCisjZGVmaW5lIEZYX0JXU2xlIEZYX0JJRElXRUFLU1RBVEVfbGUKKyNkZWZpbmUgRlhfQldTYWMgRlhfQklESVdFQUtTVEFURV9hYworI2RlZmluZSBGWF9CV1NyYyBGWF9CSURJV0VBS1NUQVRFX3JjCisjZGVmaW5lIEZYX0JXU3JzIEZYX0JJRElXRUFLU1RBVEVfcnMKKyNkZWZpbmUgRlhfQldTbGMgRlhfQklESVdFQUtTVEFURV9sYworI2RlZmluZSBGWF9CV1NscyBGWF9CSURJV0VBS1NUQVRFX2xzCisjZGVmaW5lIEZYX0JXU3JldCBGWF9CSURJV0VBS1NUQVRFX3JldAorI2RlZmluZSBGWF9CV1NsZXQgRlhfQklESVdFQUtTVEFURV9sZXQKIGVudW0gRlhfQklESVdFQUtBQ1RJT04gewotICAgIEZYX0JJRElXRUFLQUNUSU9OX0lYID0gMHgxMDAsCi0gICAgRlhfQklESVdFQUtBQ1RJT05fWFggPSAweDBGLAotICAgIEZYX0JJRElXRUFLQUNUSU9OX3h4eCA9ICgweDBGIDw8IDQpICsgMHgwRiwKLSAgICBGWF9CSURJV0VBS0FDVElPTl94SXggPSAweDEwMCArIEZYX0JJRElXRUFLQUNUSU9OX3h4eCwKLSAgICBGWF9CSURJV0VBS0FDVElPTl94eE4gPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19PTiwKLSAgICBGWF9CSURJV0VBS0FDVElPTl94eEUgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19FTiwKLSAgICBGWF9CSURJV0VBS0FDVElPTl94eEEgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19BTiwKLSAgICBGWF9CSURJV0VBS0FDVElPTl94eFIgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19SLAotICAgIEZYX0JJRElXRUFLQUNUSU9OX3h4TCA9ICgweDBGIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCi0gICAgRlhfQklESVdFQUtBQ1RJT05fTnh4ID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIDB4MEYsCi0gICAgRlhfQklESVdFQUtBQ1RJT05fQXh4ID0gKEZYX0JJRElDTEFTU19BTiA8PCA0KSArIDB4MEYsCi0gICAgRlhfQklESVdFQUtBQ1RJT05fRXhFID0gKEZYX0JJRElDTEFTU19FTiA8PCA0KSArIEZYX0JJRElDTEFTU19FTiwKLSAgICBGWF9CSURJV0VBS0FDVElPTl9OSXggPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgMHgwRiArIDB4MTAwLAotICAgIEZYX0JJRElXRUFLQUNUSU9OX054TiA9IChGWF9CSURJQ0xBU1NfT04gPDwgNCkgKyBGWF9CSURJQ0xBU1NfT04sCi0gICAgRlhfQklESVdFQUtBQ1RJT05fTnhSID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIEZYX0JJRElDTEFTU19SLAotICAgIEZYX0JJRElXRUFLQUNUSU9OX054RSA9IChGWF9CSURJQ0xBU1NfT04gPDwgNCkgKyBGWF9CSURJQ0xBU1NfRU4sCi0gICAgRlhfQklESVdFQUtBQ1RJT05fQXhBID0gKEZYX0JJRElDTEFTU19BTiA8PCA0KSArIEZYX0JJRElDTEFTU19BTiwKLSAgICBGWF9CSURJV0VBS0FDVElPTl9OeEwgPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCi0gICAgRlhfQklESVdFQUtBQ1RJT05fTHhMID0gKEZYX0JJRElDTEFTU19MIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCi0gICAgRlhfQklESVdFQUtBQ1RJT05feElMID0gKDB4MEYgPDwgNCkgKyBGWF9CSURJQ0xBU1NfTCArIDB4MTAwLAotICAgIEZYX0JJRElXRUFLQUNUSU9OX0F4UiA9IChGWF9CSURJQ0xBU1NfQU4gPDwgNCkgKyBGWF9CSURJQ0xBU1NfUiwKLSAgICBGWF9CSURJV0VBS0FDVElPTl9MeHggPSAoRlhfQklESUNMQVNTX0wgPDwgNCkgKyAweDBGLAorICBGWF9CSURJV0VBS0FDVElPTl9JWCA9IDB4MTAwLAorICBGWF9CSURJV0VBS0FDVElPTl9YWCA9IDB4MEYsCisgIEZYX0JJRElXRUFLQUNUSU9OX3h4eCA9ICgweDBGIDw8IDQpICsgMHgwRiwKKyAgRlhfQklESVdFQUtBQ1RJT05feEl4ID0gMHgxMDAgKyBGWF9CSURJV0VBS0FDVElPTl94eHgsCisgIEZYX0JJRElXRUFLQUNUSU9OX3h4TiA9ICgweDBGIDw8IDQpICsgRlhfQklESUNMQVNTX09OLAorICBGWF9CSURJV0VBS0FDVElPTl94eEUgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19FTiwKKyAgRlhfQklESVdFQUtBQ1RJT05feHhBID0gKDB4MEYgPDwgNCkgKyBGWF9CSURJQ0xBU1NfQU4sCisgIEZYX0JJRElXRUFLQUNUSU9OX3h4UiA9ICgweDBGIDw8IDQpICsgRlhfQklESUNMQVNTX1IsCisgIEZYX0JJRElXRUFLQUNUSU9OX3h4TCA9ICgweDBGIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCisgIEZYX0JJRElXRUFLQUNUSU9OX054eCA9IChGWF9CSURJQ0xBU1NfT04gPDwgNCkgKyAweDBGLAorICBGWF9CSURJV0VBS0FDVElPTl9BeHggPSAoRlhfQklESUNMQVNTX0FOIDw8IDQpICsgMHgwRiwKKyAgRlhfQklESVdFQUtBQ1RJT05fRXhFID0gKEZYX0JJRElDTEFTU19FTiA8PCA0KSArIEZYX0JJRElDTEFTU19FTiwKKyAgRlhfQklESVdFQUtBQ1RJT05fTkl4ID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIDB4MEYgKyAweDEwMCwKKyAgRlhfQklESVdFQUtBQ1RJT05fTnhOID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIEZYX0JJRElDTEFTU19PTiwKKyAgRlhfQklESVdFQUtBQ1RJT05fTnhSID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIEZYX0JJRElDTEFTU19SLAorICBGWF9CSURJV0VBS0FDVElPTl9OeEUgPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgRlhfQklESUNMQVNTX0VOLAorICBGWF9CSURJV0VBS0FDVElPTl9BeEEgPSAoRlhfQklESUNMQVNTX0FOIDw8IDQpICsgRlhfQklESUNMQVNTX0FOLAorICBGWF9CSURJV0VBS0FDVElPTl9OeEwgPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCisgIEZYX0JJRElXRUFLQUNUSU9OX0x4TCA9IChGWF9CSURJQ0xBU1NfTCA8PCA0KSArIEZYX0JJRElDTEFTU19MLAorICBGWF9CSURJV0VBS0FDVElPTl94SUwgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19MICsgMHgxMDAsCisgIEZYX0JJRElXRUFLQUNUSU9OX0F4UiA9IChGWF9CSURJQ0xBU1NfQU4gPDwgNCkgKyBGWF9CSURJQ0xBU1NfUiwKKyAgRlhfQklESVdFQUtBQ1RJT05fTHh4ID0gKEZYX0JJRElDTEFTU19MIDw8IDQpICsgMHgwRiwKIH07Ci0jZGVmaW5lIEZYX0JXQUlYCUZYX0JJRElXRUFLQUNUSU9OX0lYCi0jZGVmaW5lIEZYX0JXQVhYCUZYX0JJRElXRUFLQUNUSU9OX1hYCi0jZGVmaW5lIEZYX0JXQXh4eAlGWF9CSURJV0VBS0FDVElPTl94eHgKLSNkZWZpbmUgRlhfQldBeEl4CUZYX0JJRElXRUFLQUNUSU9OX3hJeAotI2RlZmluZSBGWF9CV0F4eE4JRlhfQklESVdFQUtBQ1RJT05feHhOCi0jZGVmaW5lIEZYX0JXQXh4RQlGWF9CSURJV0VBS0FDVElPTl94eEUKLSNkZWZpbmUgRlhfQldBeHhBCUZYX0JJRElXRUFLQUNUSU9OX3h4QQotI2RlZmluZSBGWF9CV0F4eFIJRlhfQklESVdFQUtBQ1RJT05feHhSCi0jZGVmaW5lIEZYX0JXQXh4TAlGWF9CSURJV0VBS0FDVElPTl94eEwKLSNkZWZpbmUgRlhfQldBTnh4CUZYX0JJRElXRUFLQUNUSU9OX054eAotI2RlZmluZSBGWF9CV0FBeHgJRlhfQklESVdFQUtBQ1RJT05fQXh4Ci0jZGVmaW5lIEZYX0JXQUV4RQlGWF9CSURJV0VBS0FDVElPTl9FeEUKLSNkZWZpbmUgRlhfQldBTkl4CUZYX0JJRElXRUFLQUNUSU9OX05JeAotI2RlZmluZSBGWF9CV0FOeE4JRlhfQklESVdFQUtBQ1RJT05fTnhOCi0jZGVmaW5lIEZYX0JXQU54UglGWF9CSURJV0VBS0FDVElPTl9OeFIKLSNkZWZpbmUgRlhfQldBTnhFCUZYX0JJRElXRUFLQUNUSU9OX054RQotI2RlZmluZSBGWF9CV0FBeEEJRlhfQklESVdFQUtBQ1RJT05fQXhBCi0jZGVmaW5lIEZYX0JXQU54TAlGWF9CSURJV0VBS0FDVElPTl9OeEwKLSNkZWZpbmUgRlhfQldBTHhMCUZYX0JJRElXRUFLQUNUSU9OX0x4TAotI2RlZmluZSBGWF9CV0F4SUwJRlhfQklESVdFQUtBQ1RJT05feElMCi0jZGVmaW5lIEZYX0JXQUF4UglGWF9CSURJV0VBS0FDVElPTl9BeFIKLSNkZWZpbmUgRlhfQldBTHh4CUZYX0JJRElXRUFLQUNUSU9OX0x4eAotI2RlZmluZSBGWF9CaWRpR2V0RGVmZXJyZWRUeXBlKGEpCSgoKGEpID4+IDQpICYgMHgwRikKLSNkZWZpbmUgRlhfQmlkaUdldFJlc29sdmVkVHlwZShhKQkoKGEpICYgMHgwRikKLXZvaWQgRlhfQmlkaVJlc29sdmVXZWFrKGludDMyX3QgaUJhc2VMZXZlbCwgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMpOworI2RlZmluZSBGWF9CV0FJWCBGWF9CSURJV0VBS0FDVElPTl9JWAorI2RlZmluZSBGWF9CV0FYWCBGWF9CSURJV0VBS0FDVElPTl9YWAorI2RlZmluZSBGWF9CV0F4eHggRlhfQklESVdFQUtBQ1RJT05feHh4CisjZGVmaW5lIEZYX0JXQXhJeCBGWF9CSURJV0VBS0FDVElPTl94SXgKKyNkZWZpbmUgRlhfQldBeHhOIEZYX0JJRElXRUFLQUNUSU9OX3h4TgorI2RlZmluZSBGWF9CV0F4eEUgRlhfQklESVdFQUtBQ1RJT05feHhFCisjZGVmaW5lIEZYX0JXQXh4QSBGWF9CSURJV0VBS0FDVElPTl94eEEKKyNkZWZpbmUgRlhfQldBeHhSIEZYX0JJRElXRUFLQUNUSU9OX3h4UgorI2RlZmluZSBGWF9CV0F4eEwgRlhfQklESVdFQUtBQ1RJT05feHhMCisjZGVmaW5lIEZYX0JXQU54eCBGWF9CSURJV0VBS0FDVElPTl9OeHgKKyNkZWZpbmUgRlhfQldBQXh4IEZYX0JJRElXRUFLQUNUSU9OX0F4eAorI2RlZmluZSBGWF9CV0FFeEUgRlhfQklESVdFQUtBQ1RJT05fRXhFCisjZGVmaW5lIEZYX0JXQU5JeCBGWF9CSURJV0VBS0FDVElPTl9OSXgKKyNkZWZpbmUgRlhfQldBTnhOIEZYX0JJRElXRUFLQUNUSU9OX054TgorI2RlZmluZSBGWF9CV0FOeFIgRlhfQklESVdFQUtBQ1RJT05fTnhSCisjZGVmaW5lIEZYX0JXQU54RSBGWF9CSURJV0VBS0FDVElPTl9OeEUKKyNkZWZpbmUgRlhfQldBQXhBIEZYX0JJRElXRUFLQUNUSU9OX0F4QQorI2RlZmluZSBGWF9CV0FOeEwgRlhfQklESVdFQUtBQ1RJT05fTnhMCisjZGVmaW5lIEZYX0JXQUx4TCBGWF9CSURJV0VBS0FDVElPTl9MeEwKKyNkZWZpbmUgRlhfQldBeElMIEZYX0JJRElXRUFLQUNUSU9OX3hJTAorI2RlZmluZSBGWF9CV0FBeFIgRlhfQklESVdFQUtBQ1RJT05fQXhSCisjZGVmaW5lIEZYX0JXQUx4eCBGWF9CSURJV0VBS0FDVElPTl9MeHgKKyNkZWZpbmUgRlhfQmlkaUdldERlZmVycmVkVHlwZShhKSAoKChhKSA+PiA0KSAmIDB4MEYpCisjZGVmaW5lIEZYX0JpZGlHZXRSZXNvbHZlZFR5cGUoYSkgKChhKSYweDBGKQordm9pZCBGWF9CaWRpUmVzb2x2ZVdlYWsoaW50MzJfdCBpQmFzZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgbGV2ZWxzKTsKIGVudW0gRlhfQklESU5FVVRSQUxTVEFURSB7Ci0gICAgRlhfQklESU5FVVRSQUxTVEFURV9yID0gMCwKLSAgICBGWF9CSURJTkVVVFJBTFNUQVRFX2wsCi0gICAgRlhfQklESU5FVVRSQUxTVEFURV9ybiwKLSAgICBGWF9CSURJTkVVVFJBTFNUQVRFX2xuLAotICAgIEZYX0JJRElORVVUUkFMU1RBVEVfYSwKLSAgICBGWF9CSURJTkVVVFJBTFNUQVRFX25hLAorICBGWF9CSURJTkVVVFJBTFNUQVRFX3IgPSAwLAorICBGWF9CSURJTkVVVFJBTFNUQVRFX2wsCisgIEZYX0JJRElORVVUUkFMU1RBVEVfcm4sCisgIEZYX0JJRElORVVUUkFMU1RBVEVfbG4sCisgIEZYX0JJRElORVVUUkFMU1RBVEVfYSwKKyAgRlhfQklESU5FVVRSQUxTVEFURV9uYSwKIH07Ci0jZGVmaW5lIEZYX0JOU3IJCUZYX0JJRElORVVUUkFMU1RBVEVfcgotI2RlZmluZSBGWF9CTlNsCQlGWF9CSURJTkVVVFJBTFNUQVRFX2wKLSNkZWZpbmUgRlhfQk5Tcm4JRlhfQklESU5FVVRSQUxTVEFURV9ybgotI2RlZmluZSBGWF9CTlNsbglGWF9CSURJTkVVVFJBTFNUQVRFX2xuCi0jZGVmaW5lIEZYX0JOU2EJCUZYX0JJRElORVVUUkFMU1RBVEVfYQotI2RlZmluZSBGWF9CTlNuYQlGWF9CSURJTkVVVFJBTFNUQVRFX25hCisjZGVmaW5lIEZYX0JOU3IgRlhfQklESU5FVVRSQUxTVEFURV9yCisjZGVmaW5lIEZYX0JOU2wgRlhfQklESU5FVVRSQUxTVEFURV9sCisjZGVmaW5lIEZYX0JOU3JuIEZYX0JJRElORVVUUkFMU1RBVEVfcm4KKyNkZWZpbmUgRlhfQk5TbG4gRlhfQklESU5FVVRSQUxTVEFURV9sbgorI2RlZmluZSBGWF9CTlNhIEZYX0JJRElORVVUUkFMU1RBVEVfYQorI2RlZmluZSBGWF9CTlNuYSBGWF9CSURJTkVVVFJBTFNUQVRFX25hCiBlbnVtIEZYX0JJRElORVVUUkFMQUNUSU9OIHsKLSAgICBGWF9CSURJTkVVVFJBTEFDVElPTl9uTCA9IEZYX0JJRElDTEFTU19MLAotICAgIEZYX0JJRElORVVUUkFMQUNUSU9OX0VuID0gKEZYX0JJRElDTEFTU19BTiA8PCA0KSwKLSAgICBGWF9CSURJTkVVVFJBTEFDVElPTl9SbiA9IChGWF9CSURJQ0xBU1NfUiA8PCA0KSwKLSAgICBGWF9CSURJTkVVVFJBTEFDVElPTl9MbiA9IChGWF9CSURJQ0xBU1NfTCA8PCA0KSwKLSAgICBGWF9CSURJTkVVVFJBTEFDVElPTl9JbiA9IEZYX0JJRElXRUFLQUNUSU9OX0lYLAotICAgIEZYX0JJRElORVVUUkFMQUNUSU9OX0xuTCA9IChGWF9CSURJQ0xBU1NfTCA8PCA0KSArIEZYX0JJRElDTEFTU19MLAorICBGWF9CSURJTkVVVFJBTEFDVElPTl9uTCA9IEZYX0JJRElDTEFTU19MLAorICBGWF9CSURJTkVVVFJBTEFDVElPTl9FbiA9IChGWF9CSURJQ0xBU1NfQU4gPDwgNCksCisgIEZYX0JJRElORVVUUkFMQUNUSU9OX1JuID0gKEZYX0JJRElDTEFTU19SIDw8IDQpLAorICBGWF9CSURJTkVVVFJBTEFDVElPTl9MbiA9IChGWF9CSURJQ0xBU1NfTCA8PCA0KSwKKyAgRlhfQklESU5FVVRSQUxBQ1RJT05fSW4gPSBGWF9CSURJV0VBS0FDVElPTl9JWCwKKyAgRlhfQklESU5FVVRSQUxBQ1RJT05fTG5MID0gKEZYX0JJRElDTEFTU19MIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCiB9OwotI2RlZmluZSBGWF9CTkFuTAlGWF9CSURJTkVVVFJBTEFDVElPTl9uTAotI2RlZmluZSBGWF9CTkFFbglGWF9CSURJTkVVVFJBTEFDVElPTl9FbgotI2RlZmluZSBGWF9CTkFSbglGWF9CSURJTkVVVFJBTEFDVElPTl9SbgotI2RlZmluZSBGWF9CTkFMbglGWF9CSURJTkVVVFJBTEFDVElPTl9MbgotI2RlZmluZSBGWF9CTkFJbglGWF9CSURJTkVVVFJBTEFDVElPTl9JbgotI2RlZmluZSBGWF9CTkFMbkwJRlhfQklESU5FVVRSQUxBQ1RJT05fTG5MCisjZGVmaW5lIEZYX0JOQW5MIEZYX0JJRElORVVUUkFMQUNUSU9OX25MCisjZGVmaW5lIEZYX0JOQUVuIEZYX0JJRElORVVUUkFMQUNUSU9OX0VuCisjZGVmaW5lIEZYX0JOQVJuIEZYX0JJRElORVVUUkFMQUNUSU9OX1JuCisjZGVmaW5lIEZYX0JOQUxuIEZYX0JJRElORVVUUkFMQUNUSU9OX0xuCisjZGVmaW5lIEZYX0JOQUluIEZYX0JJRElORVVUUkFMQUNUSU9OX0luCisjZGVmaW5lIEZYX0JOQUxuTCBGWF9CSURJTkVVVFJBTEFDVElPTl9MbkwKIGludDMyX3QgRlhfQmlkaUdldERlZmVycmVkTmV1dHJhbHMoaW50MzJfdCBpQWN0aW9uLCBpbnQzMl90IGlMZXZlbCk7CiBpbnQzMl90IEZYX0JpZGlHZXRSZXNvbHZlZE5ldXRyYWxzKGludDMyX3QgaUFjdGlvbik7Ci12b2lkIEZYX0JpZGlSZXNvbHZlTmV1dHJhbHMoaW50MzJfdCBpQmFzZUxldmVsLCBDRlhfSW50MzJBcnJheSAmY2xhc3NlcywgY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmxldmVscyk7Ci12b2lkIEZYX0JpZGlSZXNvbHZlSW1wbGljaXQoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmNsYXNzZXMsIENGWF9JbnQzMkFycmF5ICZsZXZlbHMpOwotdm9pZCBGWF9CaWRpUmVzb2x2ZVdoaXRlc3BhY2UoaW50MzJfdCBpQmFzZUxldmVsLCBjb25zdCBDRlhfSW50MzJBcnJheSAmY2xhc3NlcywgQ0ZYX0ludDMyQXJyYXkgJmxldmVscyk7Ci1pbnQzMl90IEZYX0JpZGlSZW9yZGVyTGV2ZWwoaW50MzJfdCBpQmFzZUxldmVsLCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBjb25zdCBDRlhfSW50MzJBcnJheSAmbGV2ZWxzLCBpbnQzMl90IGlTdGFydCwgRlhfQk9PTCBiUmV2ZXJzZSA9IEZBTFNFKTsKLXZvaWQgRlhfQmlkaVJlb3JkZXIoaW50MzJfdCBpQmFzZUxldmVsLCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBjb25zdCBDRlhfSW50MzJBcnJheSAmbGV2ZWxzKTsKLWNsYXNzIENGWF9CaWRpQ2hhciBmaW5hbCA6IHB1YmxpYyBJRlhfQmlkaUNoYXIKLXsKLXB1YmxpYzoKLSAgICBDRlhfQmlkaUNoYXIoKTsKLSAgICB+Q0ZYX0JpZGlDaGFyKCkgb3ZlcnJpZGUge30KK3ZvaWQgRlhfQmlkaVJlc29sdmVOZXV0cmFscyhpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIGxldmVscyk7Cit2b2lkIEZYX0JpZGlSZXNvbHZlSW1wbGljaXQoY29uc3QgQ0ZYX0ludDMyQXJyYXkmIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGxldmVscyk7Cit2b2lkIEZYX0JpZGlSZXNvbHZlV2hpdGVzcGFjZShpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBsZXZlbHMpOworaW50MzJfdCBGWF9CaWRpUmVvcmRlckxldmVsKGludDMyX3QgaUJhc2VMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBsZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmV2ZXJzZSA9IEZBTFNFKTsKK3ZvaWQgRlhfQmlkaVJlb3JkZXIoaW50MzJfdCBpQmFzZUxldmVsLAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgbGV2ZWxzKTsKK2NsYXNzIENGWF9CaWRpQ2hhciBmaW5hbCA6IHB1YmxpYyBJRlhfQmlkaUNoYXIgeworIHB1YmxpYzoKKyAgQ0ZYX0JpZGlDaGFyKCk7CisgIH5DRlhfQmlkaUNoYXIoKSBvdmVycmlkZSB7fQogCi0gICAgdm9pZCBTZXRQb2xpY3koRlhfQk9PTCBiU2VwYXJhdGVOZXV0cmFsID0gVFJVRSkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTCBFbmRDaGFyKCkgb3ZlcnJpZGU7Ci0gICAgaW50MzJfdCBHZXRCaWRpSW5mbyhpbnQzMl90ICZpU3RhcnQsIGludDMyX3QgJmlDb3VudCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBSZXNldCgpIG92ZXJyaWRlOworICB2b2lkIFNldFBvbGljeShGWF9CT09MIGJTZXBhcmF0ZU5ldXRyYWwgPSBUUlVFKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgRW5kQ2hhcigpIG92ZXJyaWRlOworICBpbnQzMl90IEdldEJpZGlJbmZvKGludDMyX3QmIGlTdGFydCwgaW50MzJfdCYgaUNvdW50KSBvdmVycmlkZTsKKyAgdm9pZCBSZXNldCgpIG92ZXJyaWRlOwogCi1wcml2YXRlOgotICAgIEZYX0JPT0wJbV9iU2VwYXJhdGVOZXV0cmFsOwotICAgIGludDMyX3QJbV9pQ3VyU3RhcnQ7Ci0gICAgaW50MzJfdAltX2lDdXJDb3VudDsKLSAgICBpbnQzMl90CW1faUN1ckJpZGk7Ci0gICAgaW50MzJfdAltX2lMYXN0QmlkaTsKLSAgICBpbnQzMl90CW1faUxhc3RTdGFydDsKLSAgICBpbnQzMl90CW1faUxhc3RDb3VudDsKKyBwcml2YXRlOgorICBGWF9CT09MIG1fYlNlcGFyYXRlTmV1dHJhbDsKKyAgaW50MzJfdCBtX2lDdXJTdGFydDsKKyAgaW50MzJfdCBtX2lDdXJDb3VudDsKKyAgaW50MzJfdCBtX2lDdXJCaWRpOworICBpbnQzMl90IG1faUxhc3RCaWRpOworICBpbnQzMl90IG1faUxhc3RTdGFydDsKKyAgaW50MzJfdCBtX2lMYXN0Q291bnQ7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZYQ1JUX0ZYX0FSQUJJQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYXJyYXkuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYXJyYXkuY3BwCmluZGV4IDRhYjM0YmIuLjU1NTVlZDIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2FycmF5LmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19hcnJheS5jcHAKQEAgLTgsMzMzICs4LDMzNSBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCiAKIENGWF9CYXNpY0FycmF5OjpDRlhfQmFzaWNBcnJheShpbnQgdW5pdF9zaXplKQotICAgIDogbV9wRGF0YShOVUxMKQotICAgICwgbV9uU2l6ZSgwKQotICAgICwgbV9uTWF4U2l6ZSgwKQotewotICAgIGlmICh1bml0X3NpemUgPCAwIHx8IHVuaXRfc2l6ZSA+ICgxIDw8IDI4KSkgewotICAgICAgICBtX25Vbml0U2l6ZSA9IDQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9uVW5pdFNpemUgPSB1bml0X3NpemU7Ci0gICAgfQorICAgIDogbV9wRGF0YShOVUxMKSwgbV9uU2l6ZSgwKSwgbV9uTWF4U2l6ZSgwKSB7CisgIGlmICh1bml0X3NpemUgPCAwIHx8IHVuaXRfc2l6ZSA+ICgxIDw8IDI4KSkgeworICAgIG1fblVuaXRTaXplID0gNDsKKyAgfSBlbHNlIHsKKyAgICBtX25Vbml0U2l6ZSA9IHVuaXRfc2l6ZTsKKyAgfQogfQotQ0ZYX0Jhc2ljQXJyYXk6On5DRlhfQmFzaWNBcnJheSgpCi17CitDRlhfQmFzaWNBcnJheTo6fkNGWF9CYXNpY0FycmF5KCkgeworICBGWF9GcmVlKG1fcERhdGEpOworfQorRlhfQk9PTCBDRlhfQmFzaWNBcnJheTo6U2V0U2l6ZShpbnQgbk5ld1NpemUpIHsKKyAgaWYgKG5OZXdTaXplIDw9IDApIHsKICAgICBGWF9GcmVlKG1fcERhdGEpOwotfQotRlhfQk9PTCBDRlhfQmFzaWNBcnJheTo6U2V0U2l6ZShpbnQgbk5ld1NpemUpCi17Ci0gICAgaWYgKG5OZXdTaXplIDw9IDApIHsKLSAgICAgICAgRlhfRnJlZShtX3BEYXRhKTsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgICAgIG1fblNpemUgPSBtX25NYXhTaXplID0gMDsKLSAgICAgICAgcmV0dXJuIDAgPT0gbk5ld1NpemU7Ci0gICAgfQorICAgIG1fcERhdGEgPSBOVUxMOworICAgIG1fblNpemUgPSBtX25NYXhTaXplID0gMDsKKyAgICByZXR1cm4gMCA9PSBuTmV3U2l6ZTsKKyAgfQogCi0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gdG90YWxTaXplID0gbk5ld1NpemU7Ci0gICAgICAgIHRvdGFsU2l6ZSAqPSBtX25Vbml0U2l6ZTsKLSAgICAgICAgaWYgKCF0b3RhbFNpemUuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBtX25TaXplID0gbV9uTWF4U2l6ZSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHRvdGFsU2l6ZS5WYWx1ZU9yRGllKCkpOwotICAgICAgICBtX25TaXplID0gbV9uTWF4U2l6ZSA9IG5OZXdTaXplOwotICAgIH0gZWxzZSBpZiAobk5ld1NpemUgPD0gbV9uTWF4U2l6ZSkgewotICAgICAgICBpZiAobk5ld1NpemUgPiBtX25TaXplKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQobV9wRGF0YSArIG1fblNpemUgKiBtX25Vbml0U2l6ZSwgMCwgKG5OZXdTaXplIC0gbV9uU2l6ZSkgKiBtX25Vbml0U2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9uU2l6ZSA9IG5OZXdTaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBuTmV3TWF4ID0gbk5ld1NpemUgPCBtX25NYXhTaXplID8gbV9uTWF4U2l6ZSA6IG5OZXdTaXplOwotICAgICAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gdG90YWxTaXplID0gbk5ld01heDsKLSAgICAgICAgdG90YWxTaXplICo9IG1fblVuaXRTaXplOwotICAgICAgICBpZiAoIXRvdGFsU2l6ZS5Jc1ZhbGlkKCkgfHwgbk5ld01heCA8IG1fblNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90KiBwTmV3RGF0YSA9IEZYX1JlYWxsb2ModWludDhfdCwgbV9wRGF0YSwgdG90YWxTaXplLlZhbHVlT3JEaWUoKSk7Ci0gICAgICAgIGlmIChwTmV3RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtc2V0KHBOZXdEYXRhICsgbV9uU2l6ZSAqIG1fblVuaXRTaXplLCAwLCAobk5ld01heCAtIG1fblNpemUpICogbV9uVW5pdFNpemUpOwotICAgICAgICBtX3BEYXRhID0gcE5ld0RhdGE7Ci0gICAgICAgIG1fblNpemUgPSBuTmV3U2l6ZTsKLSAgICAgICAgbV9uTWF4U2l6ZSA9IG5OZXdNYXg7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gdG90YWxTaXplID0gbk5ld1NpemU7CisgICAgdG90YWxTaXplICo9IG1fblVuaXRTaXplOworICAgIGlmICghdG90YWxTaXplLklzVmFsaWQoKSkgeworICAgICAgbV9uU2l6ZSA9IG1fbk1heFNpemUgPSAwOworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICBtX3BEYXRhID0gRlhfQWxsb2ModWludDhfdCwgdG90YWxTaXplLlZhbHVlT3JEaWUoKSk7CisgICAgbV9uU2l6ZSA9IG1fbk1heFNpemUgPSBuTmV3U2l6ZTsKKyAgfSBlbHNlIGlmIChuTmV3U2l6ZSA8PSBtX25NYXhTaXplKSB7CisgICAgaWYgKG5OZXdTaXplID4gbV9uU2l6ZSkgeworICAgICAgRlhTWVNfbWVtc2V0KG1fcERhdGEgKyBtX25TaXplICogbV9uVW5pdFNpemUsIDAsCisgICAgICAgICAgICAgICAgICAgKG5OZXdTaXplIC0gbV9uU2l6ZSkgKiBtX25Vbml0U2l6ZSk7CisgICAgfQorICAgIG1fblNpemUgPSBuTmV3U2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbk5ld01heCA9IG5OZXdTaXplIDwgbV9uTWF4U2l6ZSA/IG1fbk1heFNpemUgOiBuTmV3U2l6ZTsKKyAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gdG90YWxTaXplID0gbk5ld01heDsKKyAgICB0b3RhbFNpemUgKj0gbV9uVW5pdFNpemU7CisgICAgaWYgKCF0b3RhbFNpemUuSXNWYWxpZCgpIHx8IG5OZXdNYXggPCBtX25TaXplKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHVpbnQ4X3QqIHBOZXdEYXRhID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BEYXRhLCB0b3RhbFNpemUuVmFsdWVPckRpZSgpKTsKKyAgICBpZiAocE5ld0RhdGEgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBGWFNZU19tZW1zZXQocE5ld0RhdGEgKyBtX25TaXplICogbV9uVW5pdFNpemUsIDAsCisgICAgICAgICAgICAgICAgIChuTmV3TWF4IC0gbV9uU2l6ZSkgKiBtX25Vbml0U2l6ZSk7CisgICAgbV9wRGF0YSA9IHBOZXdEYXRhOworICAgIG1fblNpemUgPSBuTmV3U2l6ZTsKKyAgICBtX25NYXhTaXplID0gbk5ld01heDsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OkFwcGVuZChjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKQoteworRlhfQk9PTCBDRlhfQmFzaWNBcnJheTo6QXBwZW5kKGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpIHsKKyAgaW50IG5PbGRTaXplID0gbV9uU2l6ZTsKKyAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IG5ld1NpemUgPSBtX25TaXplOworICBuZXdTaXplICs9IHNyYy5tX25TaXplOworICBpZiAobV9uVW5pdFNpemUgIT0gc3JjLm1fblVuaXRTaXplIHx8ICFuZXdTaXplLklzVmFsaWQoKSB8fAorICAgICAgIVNldFNpemUobmV3U2l6ZS5WYWx1ZU9yRGllKCkpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBuT2xkU2l6ZSAqIG1fblVuaXRTaXplLCBzcmMubV9wRGF0YSwKKyAgICAgICAgICAgICAgIHNyYy5tX25TaXplICogbV9uVW5pdFNpemUpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OkNvcHkoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYykgeworICBpZiAoIVNldFNpemUoc3JjLm1fblNpemUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYU1lTX21lbWNweShtX3BEYXRhLCBzcmMubV9wRGF0YSwgc3JjLm1fblNpemUgKiBtX25Vbml0U2l6ZSk7CisgIHJldHVybiBUUlVFOworfQordWludDhfdCogQ0ZYX0Jhc2ljQXJyYXk6Okluc2VydFNwYWNlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCkgeworICBpZiAobkluZGV4IDwgMCB8fCBuQ291bnQgPD0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChuSW5kZXggPj0gbV9uU2l6ZSkgeworICAgIGlmICghU2V0U2l6ZShuSW5kZXggKyBuQ291bnQpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0gZWxzZSB7CiAgICAgaW50IG5PbGRTaXplID0gbV9uU2l6ZTsKLSAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gbmV3U2l6ZSA9IG1fblNpemU7Ci0gICAgbmV3U2l6ZSArPSBzcmMubV9uU2l6ZTsKLSAgICBpZiAobV9uVW5pdFNpemUgIT0gc3JjLm1fblVuaXRTaXplIHx8ICFuZXdTaXplLklzVmFsaWQoKSB8fCAhU2V0U2l6ZShuZXdTaXplLlZhbHVlT3JEaWUoKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICghU2V0U2l6ZShtX25TaXplICsgbkNvdW50KSkgeworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotCi0gICAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBuT2xkU2l6ZSAqIG1fblVuaXRTaXplLCBzcmMubV9wRGF0YSwgc3JjLm1fblNpemUgKiBtX25Vbml0U2l6ZSk7CisgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhICsgKG5JbmRleCArIG5Db3VudCkgKiBtX25Vbml0U2l6ZSwKKyAgICAgICAgICAgICAgICAgIG1fcERhdGEgKyBuSW5kZXggKiBtX25Vbml0U2l6ZSwKKyAgICAgICAgICAgICAgICAgIChuT2xkU2l6ZSAtIG5JbmRleCkgKiBtX25Vbml0U2l6ZSk7CisgICAgRlhTWVNfbWVtc2V0KG1fcERhdGEgKyBuSW5kZXggKiBtX25Vbml0U2l6ZSwgMCwgbkNvdW50ICogbV9uVW5pdFNpemUpOworICB9CisgIHJldHVybiBtX3BEYXRhICsgbkluZGV4ICogbV9uVW5pdFNpemU7Cit9CitGWF9CT09MIENGWF9CYXNpY0FycmF5OjpSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KSB7CisgIGlmIChuSW5kZXggPCAwIHx8IG5Db3VudCA8PSAwIHx8IG1fblNpemUgPCBuSW5kZXggKyBuQ291bnQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IG5Nb3ZlQ291bnQgPSBtX25TaXplIC0gKG5JbmRleCArIG5Db3VudCk7CisgIGlmIChuTW92ZUNvdW50KSB7CisgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhICsgbkluZGV4ICogbV9uVW5pdFNpemUsCisgICAgICAgICAgICAgICAgICBtX3BEYXRhICsgKG5JbmRleCArIG5Db3VudCkgKiBtX25Vbml0U2l6ZSwKKyAgICAgICAgICAgICAgICAgIG5Nb3ZlQ291bnQgKiBtX25Vbml0U2l6ZSk7CisgIH0KKyAgbV9uU2l6ZSAtPSBuQ291bnQ7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfQmFzaWNBcnJheTo6SW5zZXJ0QXQoaW50IG5TdGFydEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Jhc2ljQXJyYXkqIHBOZXdBcnJheSkgeworICBpZiAocE5ld0FycmF5ID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBOZXdBcnJheS0+bV9uU2l6ZSA9PSAwKSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFJbnNlcnRTcGFjZUF0KG5TdGFydEluZGV4LCBwTmV3QXJyYXktPm1fblNpemUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYU1lTX21lbWNweShtX3BEYXRhICsgblN0YXJ0SW5kZXggKiBtX25Vbml0U2l6ZSwgcE5ld0FycmF5LT5tX3BEYXRhLAorICAgICAgICAgICAgICAgcE5ld0FycmF5LT5tX25TaXplICogbV9uVW5pdFNpemUpOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OkNvcHkoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYykKLXsKLSAgICBpZiAoIVNldFNpemUoc3JjLm1fblNpemUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5KG1fcERhdGEsIHNyYy5tX3BEYXRhLCBzcmMubV9uU2l6ZSAqIG1fblVuaXRTaXplKTsKLSAgICByZXR1cm4gVFJVRTsKK2NvbnN0IHZvaWQqIENGWF9CYXNpY0FycmF5OjpHZXREYXRhUHRyKGludCBpbmRleCkgY29uc3QgeworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fblNpemUgfHwgbV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG1fcERhdGEgKyBpbmRleCAqIG1fblVuaXRTaXplOwogfQotdWludDhfdCogQ0ZYX0Jhc2ljQXJyYXk6Okluc2VydFNwYWNlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCkKLXsKLSAgICBpZiAobkluZGV4IDwgMCB8fCBuQ291bnQgPD0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG5JbmRleCA+PSBtX25TaXplKSB7Ci0gICAgICAgIGlmICghU2V0U2l6ZShuSW5kZXggKyBuQ291bnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBuT2xkU2l6ZSA9IG1fblNpemU7Ci0gICAgICAgIGlmICghU2V0U2l6ZShtX25TaXplICsgbkNvdW50KSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhICsgKG5JbmRleCArIG5Db3VudCkqbV9uVW5pdFNpemUsIG1fcERhdGEgKyBuSW5kZXggKiBtX25Vbml0U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChuT2xkU2l6ZSAtIG5JbmRleCkgKiBtX25Vbml0U2l6ZSk7Ci0gICAgICAgIEZYU1lTX21lbXNldChtX3BEYXRhICsgbkluZGV4ICogbV9uVW5pdFNpemUsIDAsIG5Db3VudCAqIG1fblVuaXRTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcERhdGEgKyBuSW5kZXggKiBtX25Vbml0U2l6ZTsKK0NGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkNGWF9CYXNlU2VnbWVudGVkQXJyYXkoaW50IHVuaXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlZ21lbnRfdW5pdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleF9zaXplKQorICAgIDogbV9Vbml0U2l6ZSh1bml0X3NpemUpLAorICAgICAgbV9TZWdtZW50U2l6ZShzZWdtZW50X3VuaXRzKSwKKyAgICAgIG1fSW5kZXhTaXplKGluZGV4X3NpemUpLAorICAgICAgbV9JbmRleERlcHRoKDApLAorICAgICAgbV9EYXRhU2l6ZSgwKSwKKyAgICAgIG1fcEluZGV4KE5VTEwpIHt9Cit2b2lkIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OlNldFVuaXRTaXplKGludCB1bml0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWdtZW50X3VuaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhfc2l6ZSkgeworICBBU1NFUlQobV9EYXRhU2l6ZSA9PSAwKTsKKyAgbV9Vbml0U2l6ZSA9IHVuaXRfc2l6ZTsKKyAgbV9TZWdtZW50U2l6ZSA9IHNlZ21lbnRfdW5pdHM7CisgIG1fSW5kZXhTaXplID0gaW5kZXhfc2l6ZTsKIH0KLUZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OlJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpCi17Ci0gICAgaWYgKG5JbmRleCA8IDAgfHwgbkNvdW50IDw9IDAgfHwgbV9uU2l6ZSA8IG5JbmRleCArIG5Db3VudCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBuTW92ZUNvdW50ID0gbV9uU2l6ZSAtIChuSW5kZXggKyBuQ291bnQpOwotICAgIGlmIChuTW92ZUNvdW50KSB7Ci0gICAgICAgIEZYU1lTX21lbW1vdmUobV9wRGF0YSArIG5JbmRleCAqIG1fblVuaXRTaXplLCBtX3BEYXRhICsgKG5JbmRleCArIG5Db3VudCkgKiBtX25Vbml0U2l6ZSwgbk1vdmVDb3VudCAqIG1fblVuaXRTaXplKTsKLSAgICB9Ci0gICAgbV9uU2l6ZSAtPSBuQ291bnQ7Ci0gICAgcmV0dXJuIFRSVUU7CitDRlhfQmFzZVNlZ21lbnRlZEFycmF5Ojp+Q0ZYX0Jhc2VTZWdtZW50ZWRBcnJheSgpIHsKKyAgUmVtb3ZlQWxsKCk7CiB9Ci1GWF9CT09MIENGWF9CYXNpY0FycmF5OjpJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpCi17Ci0gICAgaWYgKHBOZXdBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBOZXdBcnJheS0+bV9uU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoIUluc2VydFNwYWNlQXQoblN0YXJ0SW5kZXgsIHBOZXdBcnJheS0+bV9uU2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWFNZU19tZW1jcHkobV9wRGF0YSArIG5TdGFydEluZGV4ICogbV9uVW5pdFNpemUsIHBOZXdBcnJheS0+bV9wRGF0YSwgcE5ld0FycmF5LT5tX25TaXplICogbV9uVW5pdFNpemUpOwotICAgIHJldHVybiBUUlVFOwotfQotY29uc3Qgdm9pZCogQ0ZYX0Jhc2ljQXJyYXk6OkdldERhdGFQdHIoaW50IGluZGV4KSBjb25zdAotewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9uU2l6ZSB8fCBtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtX3BEYXRhICsgaW5kZXggKiBtX25Vbml0U2l6ZTsKLX0KLUNGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkNGWF9CYXNlU2VnbWVudGVkQXJyYXkoaW50IHVuaXRfc2l6ZSwgaW50IHNlZ21lbnRfdW5pdHMsIGludCBpbmRleF9zaXplKQotICAgIDogbV9Vbml0U2l6ZSh1bml0X3NpemUpCi0gICAgLCBtX1NlZ21lbnRTaXplKHNlZ21lbnRfdW5pdHMpCi0gICAgLCBtX0luZGV4U2l6ZShpbmRleF9zaXplKQotICAgICwgbV9JbmRleERlcHRoKDApCi0gICAgLCBtX0RhdGFTaXplKDApCi0gICAgLCBtX3BJbmRleChOVUxMKQotewotfQotdm9pZCBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpTZXRVbml0U2l6ZShpbnQgdW5pdF9zaXplLCBpbnQgc2VnbWVudF91bml0cywgaW50IGluZGV4X3NpemUpCi17Ci0gICAgQVNTRVJUKG1fRGF0YVNpemUgPT0gMCk7Ci0gICAgbV9Vbml0U2l6ZSA9IHVuaXRfc2l6ZTsKLSAgICBtX1NlZ21lbnRTaXplID0gc2VnbWVudF91bml0czsKLSAgICBtX0luZGV4U2l6ZSA9IGluZGV4X3NpemU7Ci19Ci1DRlhfQmFzZVNlZ21lbnRlZEFycmF5Ojp+Q0ZYX0Jhc2VTZWdtZW50ZWRBcnJheSgpCi17Ci0gICAgUmVtb3ZlQWxsKCk7Ci19Ci1zdGF0aWMgdm9pZCBfQ2xlYXJJbmRleChpbnQgbGV2ZWwsIGludCBzaXplLCB2b2lkKiogcEluZGV4KQotewotICAgIGlmIChsZXZlbCA9PSAwKSB7Ci0gICAgICAgIEZYX0ZyZWUocEluZGV4KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBpZiAocEluZGV4W2ldID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIF9DbGVhckluZGV4KGxldmVsIC0gMSwgc2l6ZSwgKHZvaWQqKilwSW5kZXhbaV0pOwotICAgIH0KK3N0YXRpYyB2b2lkIF9DbGVhckluZGV4KGludCBsZXZlbCwgaW50IHNpemUsIHZvaWQqKiBwSW5kZXgpIHsKKyAgaWYgKGxldmVsID09IDApIHsKICAgICBGWF9GcmVlKHBJbmRleCk7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYgKHBJbmRleFtpXSA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgX0NsZWFySW5kZXgobGV2ZWwgLSAxLCBzaXplLCAodm9pZCoqKXBJbmRleFtpXSk7CisgIH0KKyAgRlhfRnJlZShwSW5kZXgpOwogfQotdm9pZCBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpSZW1vdmVBbGwoKQotewotICAgIGlmIChtX3BJbmRleCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgX0NsZWFySW5kZXgobV9JbmRleERlcHRoLCBtX0luZGV4U2l6ZSwgKHZvaWQqKiltX3BJbmRleCk7Ci0gICAgbV9wSW5kZXggPSBOVUxMOwotICAgIG1fSW5kZXhEZXB0aCA9IDA7Ci0gICAgbV9EYXRhU2l6ZSA9IDA7Cit2b2lkIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OlJlbW92ZUFsbCgpIHsKKyAgaWYgKG1fcEluZGV4ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgX0NsZWFySW5kZXgobV9JbmRleERlcHRoLCBtX0luZGV4U2l6ZSwgKHZvaWQqKiltX3BJbmRleCk7CisgIG1fcEluZGV4ID0gTlVMTDsKKyAgbV9JbmRleERlcHRoID0gMDsKKyAgbV9EYXRhU2l6ZSA9IDA7CiB9Ci12b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpBZGQoKQotewotICAgIGlmIChtX0RhdGFTaXplICUgbV9TZWdtZW50U2l6ZSkgewotICAgICAgICByZXR1cm4gR2V0QXQobV9EYXRhU2l6ZSArKyk7Ci0gICAgfQotICAgIHZvaWQqIHBTZWdtZW50ID0gRlhfQWxsb2MyRCh1aW50OF90LCBtX1VuaXRTaXplLCBtX1NlZ21lbnRTaXplKTsKLSAgICBpZiAobV9wSW5kZXggPT0gTlVMTCkgewotICAgICAgICBtX3BJbmRleCA9IHBTZWdtZW50OwotICAgICAgICBtX0RhdGFTaXplICsrOwotICAgICAgICByZXR1cm4gcFNlZ21lbnQ7Ci0gICAgfQotICAgIGlmIChtX0luZGV4RGVwdGggPT0gMCkgewotICAgICAgICB2b2lkKiogcEluZGV4ID0gKHZvaWQqKilGWF9BbGxvYyh2b2lkKiwgbV9JbmRleFNpemUpOwotICAgICAgICBwSW5kZXhbMF0gPSBtX3BJbmRleDsKLSAgICAgICAgcEluZGV4WzFdID0gcFNlZ21lbnQ7Ci0gICAgICAgIG1fcEluZGV4ID0gcEluZGV4OwotICAgICAgICBtX0RhdGFTaXplICsrOwotICAgICAgICBtX0luZGV4RGVwdGggKys7Ci0gICAgICAgIHJldHVybiBwU2VnbWVudDsKLSAgICB9Ci0gICAgaW50IHNlZ19pbmRleCA9IG1fRGF0YVNpemUgLyBtX1NlZ21lbnRTaXplOwotICAgIGlmIChzZWdfaW5kZXggJSBtX0luZGV4U2l6ZSkgewotICAgICAgICB2b2lkKiogcEluZGV4ID0gR2V0SW5kZXgoc2VnX2luZGV4KTsKLSAgICAgICAgcEluZGV4W3NlZ19pbmRleCAlIG1fSW5kZXhTaXplXSA9IHBTZWdtZW50OwotICAgICAgICBtX0RhdGFTaXplICsrOwotICAgICAgICByZXR1cm4gcFNlZ21lbnQ7Ci0gICAgfQotICAgIGludCB0cmVlX3NpemUgPSAxOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX0luZGV4RGVwdGg7IGkgKyspIHsKLSAgICAgICAgdHJlZV9zaXplICo9IG1fSW5kZXhTaXplOwotICAgIH0KLSAgICBpZiAobV9EYXRhU2l6ZSA9PSB0cmVlX3NpemUgKiBtX1NlZ21lbnRTaXplKSB7Ci0gICAgICAgIHZvaWQqKiBwSW5kZXggPSAodm9pZCoqKUZYX0FsbG9jKHZvaWQqLCBtX0luZGV4U2l6ZSk7Ci0gICAgICAgIHBJbmRleFswXSA9IG1fcEluZGV4OwotICAgICAgICBtX3BJbmRleCA9IHBJbmRleDsKLSAgICAgICAgbV9JbmRleERlcHRoICsrOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRyZWVfc2l6ZSAvPSBtX0luZGV4U2l6ZTsKLSAgICB9Ci0gICAgdm9pZCoqIHBTcG90ID0gKHZvaWQqKiltX3BJbmRleDsKLSAgICBmb3IgKGkgPSAxOyBpIDwgbV9JbmRleERlcHRoOyBpICsrKSB7Ci0gICAgICAgIGlmIChwU3BvdFtzZWdfaW5kZXggLyB0cmVlX3NpemVdID09IE5VTEwpIHsKLSAgICAgICAgICAgIHBTcG90W3NlZ19pbmRleCAvIHRyZWVfc2l6ZV0gPSAodm9pZCopRlhfQWxsb2Modm9pZCosIG1fSW5kZXhTaXplKTsKLSAgICAgICAgfQotICAgICAgICBwU3BvdCA9ICh2b2lkKiopcFNwb3Rbc2VnX2luZGV4IC8gdHJlZV9zaXplXTsKLSAgICAgICAgc2VnX2luZGV4ID0gc2VnX2luZGV4ICUgdHJlZV9zaXplOwotICAgICAgICB0cmVlX3NpemUgLz0gbV9JbmRleFNpemU7Ci0gICAgfQotICAgIGlmIChpIDwgbV9JbmRleERlcHRoKSB7Ci0gICAgICAgIEZYX0ZyZWUocFNlZ21lbnQpOwotICAgICAgICBSZW1vdmVBbGwoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBTcG90W3NlZ19pbmRleCAlIG1fSW5kZXhTaXplXSA9IHBTZWdtZW50OwotICAgIG1fRGF0YVNpemUgKys7Cit2b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpBZGQoKSB7CisgIGlmIChtX0RhdGFTaXplICUgbV9TZWdtZW50U2l6ZSkgeworICAgIHJldHVybiBHZXRBdChtX0RhdGFTaXplKyspOworICB9CisgIHZvaWQqIHBTZWdtZW50ID0gRlhfQWxsb2MyRCh1aW50OF90LCBtX1VuaXRTaXplLCBtX1NlZ21lbnRTaXplKTsKKyAgaWYgKG1fcEluZGV4ID09IE5VTEwpIHsKKyAgICBtX3BJbmRleCA9IHBTZWdtZW50OworICAgIG1fRGF0YVNpemUrKzsKICAgICByZXR1cm4gcFNlZ21lbnQ7Ci19Ci12b2lkKiogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6R2V0SW5kZXgoaW50IHNlZ19pbmRleCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9JbmRleERlcHRoICE9IDApOwotICAgIGlmIChtX0luZGV4RGVwdGggPT0gMSkgewotICAgICAgICByZXR1cm4gKHZvaWQqKiltX3BJbmRleDsKKyAgfQorICBpZiAobV9JbmRleERlcHRoID09IDApIHsKKyAgICB2b2lkKiogcEluZGV4ID0gKHZvaWQqKilGWF9BbGxvYyh2b2lkKiwgbV9JbmRleFNpemUpOworICAgIHBJbmRleFswXSA9IG1fcEluZGV4OworICAgIHBJbmRleFsxXSA9IHBTZWdtZW50OworICAgIG1fcEluZGV4ID0gcEluZGV4OworICAgIG1fRGF0YVNpemUrKzsKKyAgICBtX0luZGV4RGVwdGgrKzsKKyAgICByZXR1cm4gcFNlZ21lbnQ7CisgIH0KKyAgaW50IHNlZ19pbmRleCA9IG1fRGF0YVNpemUgLyBtX1NlZ21lbnRTaXplOworICBpZiAoc2VnX2luZGV4ICUgbV9JbmRleFNpemUpIHsKKyAgICB2b2lkKiogcEluZGV4ID0gR2V0SW5kZXgoc2VnX2luZGV4KTsKKyAgICBwSW5kZXhbc2VnX2luZGV4ICUgbV9JbmRleFNpemVdID0gcFNlZ21lbnQ7CisgICAgbV9EYXRhU2l6ZSsrOworICAgIHJldHVybiBwU2VnbWVudDsKKyAgfQorICBpbnQgdHJlZV9zaXplID0gMTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX0luZGV4RGVwdGg7IGkrKykgeworICAgIHRyZWVfc2l6ZSAqPSBtX0luZGV4U2l6ZTsKKyAgfQorICBpZiAobV9EYXRhU2l6ZSA9PSB0cmVlX3NpemUgKiBtX1NlZ21lbnRTaXplKSB7CisgICAgdm9pZCoqIHBJbmRleCA9ICh2b2lkKiopRlhfQWxsb2Modm9pZCosIG1fSW5kZXhTaXplKTsKKyAgICBwSW5kZXhbMF0gPSBtX3BJbmRleDsKKyAgICBtX3BJbmRleCA9IHBJbmRleDsKKyAgICBtX0luZGV4RGVwdGgrKzsKKyAgfSBlbHNlIHsKKyAgICB0cmVlX3NpemUgLz0gbV9JbmRleFNpemU7CisgIH0KKyAgdm9pZCoqIHBTcG90ID0gKHZvaWQqKiltX3BJbmRleDsKKyAgZm9yIChpID0gMTsgaSA8IG1fSW5kZXhEZXB0aDsgaSsrKSB7CisgICAgaWYgKHBTcG90W3NlZ19pbmRleCAvIHRyZWVfc2l6ZV0gPT0gTlVMTCkgeworICAgICAgcFNwb3Rbc2VnX2luZGV4IC8gdHJlZV9zaXplXSA9ICh2b2lkKilGWF9BbGxvYyh2b2lkKiwgbV9JbmRleFNpemUpOwogICAgIH0KLSAgICBpZiAobV9JbmRleERlcHRoID09IDIpIHsKLSAgICAgICAgcmV0dXJuICh2b2lkKiopKCh2b2lkKiopbV9wSW5kZXgpW3NlZ19pbmRleCAvIG1fSW5kZXhTaXplXTsKLSAgICB9Ci0gICAgaW50IHRyZWVfc2l6ZSA9IDE7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMTsgaSA8IG1fSW5kZXhEZXB0aDsgaSArKykgewotICAgICAgICB0cmVlX3NpemUgKj0gbV9JbmRleFNpemU7Ci0gICAgfQotICAgIHZvaWQqKiBwU3BvdCA9ICh2b2lkKiopbV9wSW5kZXg7Ci0gICAgZm9yIChpID0gMTsgaSA8IG1fSW5kZXhEZXB0aDsgaSArKykgewotICAgICAgICBwU3BvdCA9ICh2b2lkKiopcFNwb3Rbc2VnX2luZGV4IC8gdHJlZV9zaXplXTsKLSAgICAgICAgc2VnX2luZGV4ID0gc2VnX2luZGV4ICUgdHJlZV9zaXplOwotICAgICAgICB0cmVlX3NpemUgLz0gbV9JbmRleFNpemU7Ci0gICAgfQotICAgIHJldHVybiBwU3BvdDsKLX0KLXZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6Okl0ZXJhdGVTZWdtZW50KGNvbnN0IHVpbnQ4X3QqIHBTZWdtZW50LCBpbnQgY291bnQsIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0Ci17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBpZiAoIWNhbGxiYWNrKHBhcmFtLCAodm9pZCopKHBTZWdtZW50ICsgaSAqIG1fVW5pdFNpemUpKSkgewotICAgICAgICAgICAgcmV0dXJuICh2b2lkKikocFNlZ21lbnQgKyBpICogbV9Vbml0U2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcFNwb3QgPSAodm9pZCoqKXBTcG90W3NlZ19pbmRleCAvIHRyZWVfc2l6ZV07CisgICAgc2VnX2luZGV4ID0gc2VnX2luZGV4ICUgdHJlZV9zaXplOworICAgIHRyZWVfc2l6ZSAvPSBtX0luZGV4U2l6ZTsKKyAgfQorICBpZiAoaSA8IG1fSW5kZXhEZXB0aCkgeworICAgIEZYX0ZyZWUocFNlZ21lbnQpOworICAgIFJlbW92ZUFsbCgpOwogICAgIHJldHVybiBOVUxMOworICB9CisgIHBTcG90W3NlZ19pbmRleCAlIG1fSW5kZXhTaXplXSA9IHBTZWdtZW50OworICBtX0RhdGFTaXplKys7CisgIHJldHVybiBwU2VnbWVudDsKIH0KLXZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6Okl0ZXJhdGVJbmRleChpbnQgbGV2ZWwsIGludCYgc3RhcnQsIHZvaWQqKiBwSW5kZXgsIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0Ci17Ci0gICAgaWYgKGxldmVsID09IDApIHsKLSAgICAgICAgaW50IGNvdW50ID0gbV9EYXRhU2l6ZSAtIHN0YXJ0OwotICAgICAgICBpZiAoY291bnQgPiBtX1NlZ21lbnRTaXplKSB7Ci0gICAgICAgICAgICBjb3VudCA9IG1fU2VnbWVudFNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnQgKz0gY291bnQ7Ci0gICAgICAgIHJldHVybiBJdGVyYXRlU2VnbWVudCgoY29uc3QgdWludDhfdCopcEluZGV4LCBjb3VudCwgY2FsbGJhY2ssIHBhcmFtKTsKK3ZvaWQqKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpHZXRJbmRleChpbnQgc2VnX2luZGV4KSBjb25zdCB7CisgIEFTU0VSVChtX0luZGV4RGVwdGggIT0gMCk7CisgIGlmIChtX0luZGV4RGVwdGggPT0gMSkgeworICAgIHJldHVybiAodm9pZCoqKW1fcEluZGV4OworICB9CisgIGlmIChtX0luZGV4RGVwdGggPT0gMikgeworICAgIHJldHVybiAodm9pZCoqKSgodm9pZCoqKW1fcEluZGV4KVtzZWdfaW5kZXggLyBtX0luZGV4U2l6ZV07CisgIH0KKyAgaW50IHRyZWVfc2l6ZSA9IDE7CisgIGludCBpOworICBmb3IgKGkgPSAxOyBpIDwgbV9JbmRleERlcHRoOyBpKyspIHsKKyAgICB0cmVlX3NpemUgKj0gbV9JbmRleFNpemU7CisgIH0KKyAgdm9pZCoqIHBTcG90ID0gKHZvaWQqKiltX3BJbmRleDsKKyAgZm9yIChpID0gMTsgaSA8IG1fSW5kZXhEZXB0aDsgaSsrKSB7CisgICAgcFNwb3QgPSAodm9pZCoqKXBTcG90W3NlZ19pbmRleCAvIHRyZWVfc2l6ZV07CisgICAgc2VnX2luZGV4ID0gc2VnX2luZGV4ICUgdHJlZV9zaXplOworICAgIHRyZWVfc2l6ZSAvPSBtX0luZGV4U2l6ZTsKKyAgfQorICByZXR1cm4gcFNwb3Q7Cit9Cit2b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpJdGVyYXRlU2VnbWVudChjb25zdCB1aW50OF90KiBwU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGlmICghY2FsbGJhY2socGFyYW0sICh2b2lkKikocFNlZ21lbnQgKyBpICogbV9Vbml0U2l6ZSkpKSB7CisgICAgICByZXR1cm4gKHZvaWQqKShwU2VnbWVudCArIGkgKiBtX1VuaXRTaXplKTsKICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0luZGV4U2l6ZTsgaSArKykgewotICAgICAgICBpZiAocEluZGV4W2ldID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQqIHAgPSBJdGVyYXRlSW5kZXgobGV2ZWwgLSAxLCBzdGFydCwgKHZvaWQqKilwSW5kZXhbaV0sIGNhbGxiYWNrLCBwYXJhbSk7Ci0gICAgICAgIGlmIChwKSB7Ci0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQordm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZUluZGV4KGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSkgY29uc3QgeworICBpZiAobGV2ZWwgPT0gMCkgeworICAgIGludCBjb3VudCA9IG1fRGF0YVNpemUgLSBzdGFydDsKKyAgICBpZiAoY291bnQgPiBtX1NlZ21lbnRTaXplKSB7CisgICAgICBjb3VudCA9IG1fU2VnbWVudFNpemU7CiAgICAgfQorICAgIHN0YXJ0ICs9IGNvdW50OworICAgIHJldHVybiBJdGVyYXRlU2VnbWVudCgoY29uc3QgdWludDhfdCopcEluZGV4LCBjb3VudCwgY2FsbGJhY2ssIHBhcmFtKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1fSW5kZXhTaXplOyBpKyspIHsKKyAgICBpZiAocEluZGV4W2ldID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB2b2lkKiBwID0KKyAgICAgICAgSXRlcmF0ZUluZGV4KGxldmVsIC0gMSwgc3RhcnQsICh2b2lkKiopcEluZGV4W2ldLCBjYWxsYmFjaywgcGFyYW0pOworICAgIGlmIChwKSB7CisgICAgICByZXR1cm4gcDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9Cit2b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpJdGVyYXRlKEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSkgY29uc3QgeworICBpZiAobV9wSW5kZXggPT0gTlVMTCkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIGludCBzdGFydCA9IDA7CisgIHJldHVybiBJdGVyYXRlSW5kZXgobV9JbmRleERlcHRoLCBzdGFydCwgKHZvaWQqKiltX3BJbmRleCwgY2FsbGJhY2ssIHBhcmFtKTsKIH0KLXZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6Okl0ZXJhdGUoRlhfQk9PTCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpLCB2b2lkKiBwYXJhbSkgY29uc3QKLXsKLSAgICBpZiAobV9wSW5kZXggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICByZXR1cm4gSXRlcmF0ZUluZGV4KG1fSW5kZXhEZXB0aCwgc3RhcnQsICh2b2lkKiopbV9wSW5kZXgsIGNhbGxiYWNrLCBwYXJhbSk7Cit2b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpHZXRBdChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX0RhdGFTaXplKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKG1fSW5kZXhEZXB0aCA9PSAwKSB7CisgICAgcmV0dXJuICh1aW50OF90KiltX3BJbmRleCArIG1fVW5pdFNpemUgKiBpbmRleDsKKyAgfQorICBpbnQgc2VnX2luZGV4ID0gaW5kZXggLyBtX1NlZ21lbnRTaXplOworICByZXR1cm4gKHVpbnQ4X3QqKUdldEluZGV4KHNlZ19pbmRleClbc2VnX2luZGV4ICUgbV9JbmRleFNpemVdICsKKyAgICAgICAgIChpbmRleCAlIG1fU2VnbWVudFNpemUpICogbV9Vbml0U2l6ZTsKIH0KLXZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkdldEF0KGludCBpbmRleCkgY29uc3QKLXsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fRGF0YVNpemUpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Cit2b2lkIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkRlbGV0ZShpbnQgaW5kZXgsIGludCBjb3VudCkgeworICBpZiAoaW5kZXggPCAwIHx8IGNvdW50IDwgMSB8fCBpbmRleCArIGNvdW50ID4gbV9EYXRhU2l6ZSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgaTsKKyAgZm9yIChpID0gaW5kZXg7IGkgPCBtX0RhdGFTaXplIC0gY291bnQ7IGkrKykgeworICAgIHVpbnQ4X3QqIHBTcmMgPSAodWludDhfdCopR2V0QXQoaSArIGNvdW50KTsKKyAgICB1aW50OF90KiBwRGVzdCA9ICh1aW50OF90KilHZXRBdChpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fVW5pdFNpemU7IGorKykgeworICAgICAgcERlc3Rbal0gPSBwU3JjW2pdOwogICAgIH0KLSAgICBpZiAobV9JbmRleERlcHRoID09IDApIHsKLSAgICAgICAgcmV0dXJuICh1aW50OF90KiltX3BJbmRleCArIG1fVW5pdFNpemUgKiBpbmRleDsKKyAgfQorICBpbnQgbmV3X3NlZ3MgPSAobV9EYXRhU2l6ZSAtIGNvdW50ICsgbV9TZWdtZW50U2l6ZSAtIDEpIC8gbV9TZWdtZW50U2l6ZTsKKyAgaW50IG9sZF9zZWdzID0gKG1fRGF0YVNpemUgKyBtX1NlZ21lbnRTaXplIC0gMSkgLyBtX1NlZ21lbnRTaXplOworICBpZiAobmV3X3NlZ3MgPCBvbGRfc2VncykgeworICAgIGlmIChtX0luZGV4RGVwdGgpIHsKKyAgICAgIGZvciAoaSA9IG5ld19zZWdzOyBpIDwgb2xkX3NlZ3M7IGkrKykgeworICAgICAgICB2b2lkKiogcEluZGV4ID0gR2V0SW5kZXgoaSk7CisgICAgICAgIEZYX0ZyZWUocEluZGV4W2kgJSBtX0luZGV4U2l6ZV0pOworICAgICAgICBwSW5kZXhbaSAlIG1fSW5kZXhTaXplXSA9IE5VTEw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEZYX0ZyZWUobV9wSW5kZXgpOworICAgICAgbV9wSW5kZXggPSBOVUxMOwogICAgIH0KLSAgICBpbnQgc2VnX2luZGV4ID0gaW5kZXggLyBtX1NlZ21lbnRTaXplOwotICAgIHJldHVybiAodWludDhfdCopR2V0SW5kZXgoc2VnX2luZGV4KVtzZWdfaW5kZXggJSBtX0luZGV4U2l6ZV0gKyAoaW5kZXggJSBtX1NlZ21lbnRTaXplKSAqIG1fVW5pdFNpemU7Ci19Ci12b2lkIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkRlbGV0ZShpbnQgaW5kZXgsIGludCBjb3VudCkKLXsKLSAgICBpZihpbmRleCA8IDAgfHwgY291bnQgPCAxIHx8IGluZGV4ICsgY291bnQgPiBtX0RhdGFTaXplKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gaW5kZXg7IGkgPCBtX0RhdGFTaXplIC0gY291bnQ7IGkgKyspIHsKLSAgICAgICAgdWludDhfdCogcFNyYyA9ICh1aW50OF90KilHZXRBdChpICsgY291bnQpOwotICAgICAgICB1aW50OF90KiBwRGVzdCA9ICh1aW50OF90KilHZXRBdChpKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtX1VuaXRTaXplOyBqICsrKSB7Ci0gICAgICAgICAgICBwRGVzdFtqXSA9IHBTcmNbal07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IG5ld19zZWdzID0gKG1fRGF0YVNpemUgLSBjb3VudCArIG1fU2VnbWVudFNpemUgLSAxKSAvIG1fU2VnbWVudFNpemU7Ci0gICAgaW50IG9sZF9zZWdzID0gKG1fRGF0YVNpemUgKyBtX1NlZ21lbnRTaXplIC0gMSkgLyBtX1NlZ21lbnRTaXplOwotICAgIGlmIChuZXdfc2VncyA8IG9sZF9zZWdzKSB7Ci0gICAgICAgIGlmKG1fSW5kZXhEZXB0aCkgewotICAgICAgICAgICAgZm9yIChpID0gbmV3X3NlZ3M7IGkgPCBvbGRfc2VnczsgaSArKykgewotICAgICAgICAgICAgICAgIHZvaWQqKiBwSW5kZXggPSBHZXRJbmRleChpKTsKLSAgICAgICAgICAgICAgICBGWF9GcmVlKHBJbmRleFtpICUgbV9JbmRleFNpemVdKTsKLSAgICAgICAgICAgICAgICBwSW5kZXhbaSAlIG1fSW5kZXhTaXplXSA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcEluZGV4KTsKLSAgICAgICAgICAgIG1fcEluZGV4ID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX0RhdGFTaXplIC09IGNvdW50OworICB9CisgIG1fRGF0YVNpemUgLT0gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmcuY3BwCmluZGV4IDVlZWIzM2IuLmM3MDY5MTIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmcuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmcuY3BwCkBAIC05LDExMjYgKzksMTA4NyBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICIuLi8uLi8uLi90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgogCi1zdGF0aWMgaW50IF9CdWZmZXJfaXRvYShjaGFyKiBidWYsIGludCBpLCBGWF9EV09SRCBmbGFncykKLXsKLSAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgIGJ1ZlswXSA9ICcwJzsKLSAgICAgICAgcmV0dXJuIDE7CitzdGF0aWMgaW50IF9CdWZmZXJfaXRvYShjaGFyKiBidWYsIGludCBpLCBGWF9EV09SRCBmbGFncykgeworICBpZiAoaSA9PSAwKSB7CisgICAgYnVmWzBdID0gJzAnOworICAgIHJldHVybiAxOworICB9CisgIGNoYXIgYnVmMVszMl07CisgIGludCBidWZfcG9zID0gMzE7CisgIEZYX0RXT1JEIHUgPSBpOworICBpZiAoKGZsYWdzICYgRlhGT1JNQVRfU0lHTkVEKSAmJiBpIDwgMCkgeworICAgIHUgPSAtaTsKKyAgfQorICBpbnQgYmFzZSA9IDEwOworICBjb25zdCBGWF9DSEFSKiBzdHJpbmcgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgIGlmIChmbGFncyAmIEZYRk9STUFUX0hFWCkgeworICAgIGJhc2UgPSAxNjsKKyAgICBpZiAoZmxhZ3MgJiBGWEZPUk1BVF9DQVBJVEFMKSB7CisgICAgICBzdHJpbmcgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CiAgICAgfQotICAgIGNoYXIgYnVmMVszMl07Ci0gICAgaW50IGJ1Zl9wb3MgPSAzMTsKLSAgICBGWF9EV09SRCB1ID0gaTsKLSAgICBpZiAoKGZsYWdzICYgRlhGT1JNQVRfU0lHTkVEKSAmJiBpIDwgMCkgewotICAgICAgICB1ID0gLWk7Ci0gICAgfQotICAgIGludCBiYXNlID0gMTA7Ci0gICAgY29uc3QgRlhfQ0hBUiogc3RyaW5nID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotICAgIGlmIChmbGFncyAmIEZYRk9STUFUX0hFWCkgewotICAgICAgICBiYXNlID0gMTY7Ci0gICAgICAgIGlmIChmbGFncyAmIEZYRk9STUFUX0NBUElUQUwpIHsKLSAgICAgICAgICAgIHN0cmluZyA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKLSAgICAgICAgfQotICAgIH0KLSAgICB3aGlsZSAodSAhPSAwKSB7Ci0gICAgICAgIGJ1ZjFbYnVmX3Bvcy0tXSA9IHN0cmluZ1t1ICUgYmFzZV07Ci0gICAgICAgIHUgPSB1IC8gYmFzZTsKLSAgICB9Ci0gICAgaWYgKChmbGFncyAmIEZYRk9STUFUX1NJR05FRCkgJiYgaSA8IDApIHsKLSAgICAgICAgYnVmMVtidWZfcG9zLS1dID0gJy0nOwotICAgIH0KLSAgICBpbnQgbGVuID0gMzEgLSBidWZfcG9zOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBsZW47IGlpICsrKSB7Ci0gICAgICAgIGJ1ZltpaV0gPSBidWYxW2lpICsgYnVmX3BvcyArIDFdOwotICAgIH0KLSAgICByZXR1cm4gbGVuOworICB9CisgIHdoaWxlICh1ICE9IDApIHsKKyAgICBidWYxW2J1Zl9wb3MtLV0gPSBzdHJpbmdbdSAlIGJhc2VdOworICAgIHUgPSB1IC8gYmFzZTsKKyAgfQorICBpZiAoKGZsYWdzICYgRlhGT1JNQVRfU0lHTkVEKSAmJiBpIDwgMCkgeworICAgIGJ1ZjFbYnVmX3Bvcy0tXSA9ICctJzsKKyAgfQorICBpbnQgbGVuID0gMzEgLSBidWZfcG9zOworICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbGVuOyBpaSsrKSB7CisgICAgYnVmW2lpXSA9IGJ1ZjFbaWkgKyBidWZfcG9zICsgMV07CisgIH0KKyAgcmV0dXJuIGxlbjsKIH0KLUNGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKGludCBpLCBGWF9EV09SRCBmbGFncykKLXsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhidWYsIF9CdWZmZXJfaXRvYShidWYsIGksIGZsYWdzKSk7CitDRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpbnQgaSwgRlhfRFdPUkQgZmxhZ3MpIHsKKyAgY2hhciBidWZbMzJdOworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKGJ1ZiwgX0J1ZmZlcl9pdG9hKGJ1ZiwgaSwgZmxhZ3MpKTsKIH0KIAogLy8gc3RhdGljCi1DRlhfQnl0ZVN0cmluZzo6U3RyaW5nRGF0YSogQ0ZYX0J5dGVTdHJpbmc6OlN0cmluZ0RhdGE6OkNyZWF0ZShpbnQgbkxlbikKLXsKLSAgICAvLyB8bkxlbnwgaXMgY3VycmVudGx5IGRlY2xhcmVkIGFzIGluIHxpbnR8LiBUT0RPKHBhbG1lcik6IEl0IHNob3VsZCBiZQotICAgIC8vIGEgfHNpemVfdHwsIG9yIGF0IGxlYXN0IHVuc2lnbmVkLgotICAgIGlmIChuTGVuID09IDAgfHwgbkxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorQ0ZYX0J5dGVTdHJpbmc6OlN0cmluZ0RhdGEqIENGWF9CeXRlU3RyaW5nOjpTdHJpbmdEYXRhOjpDcmVhdGUoaW50IG5MZW4pIHsKKyAgLy8gfG5MZW58IGlzIGN1cnJlbnRseSBkZWNsYXJlZCBhcyBpbiB8aW50fC4gVE9ETyhwYWxtZXIpOiBJdCBzaG91bGQgYmUKKyAgLy8gYSB8c2l6ZV90fCwgb3IgYXQgbGVhc3QgdW5zaWduZWQuCisgIGlmIChuTGVuID09IDAgfHwgbkxlbiA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogCi0gICAgLy8gRml4ZWQgcG9ydGlvbiBvZiBoZWFkZXIgcGx1cyBhIE5VTCBjaGFyIG5vdCBpbmNsdWRlZCBpbiBtX25BbGxvY0xlbmd0aC4KLSAgICAvLyBzaXplb2YoRlhfQ0hBUikgaXMgYWx3YXlzIDEsIHVzZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggQ0ZYX1dpZGVzdHJpbmcuCi0gICAgaW50IG92ZXJoZWFkID0gb2Zmc2V0b2YoU3RyaW5nRGF0YSwgbV9TdHJpbmcpICsgc2l6ZW9mKEZYX0NIQVIpOwotICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiBuU2l6ZSA9IG5MZW47Ci0gICAgblNpemUgKz0gb3ZlcmhlYWQ7CisgIC8vIEZpeGVkIHBvcnRpb24gb2YgaGVhZGVyIHBsdXMgYSBOVUwgY2hhciBub3QgaW5jbHVkZWQgaW4gbV9uQWxsb2NMZW5ndGguCisgIC8vIHNpemVvZihGWF9DSEFSKSBpcyBhbHdheXMgMSwgdXNlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBDRlhfV2lkZXN0cmluZy4KKyAgaW50IG92ZXJoZWFkID0gb2Zmc2V0b2YoU3RyaW5nRGF0YSwgbV9TdHJpbmcpICsgc2l6ZW9mKEZYX0NIQVIpOworICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gblNpemUgPSBuTGVuOworICBuU2l6ZSArPSBvdmVyaGVhZDsKIAotICAgIC8vIE5vdyByb3VuZCB0byBhbiA4LWJ5dGUgYm91bmRhcnkuIFdlJ2QgZXhwZWN0IHRoYXQgdGhpcyBpcyB0aGUgbWluaW11bQotICAgIC8vIGdyYW51bGFyaXR5IG9mIGFueSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3JzLCBzbyB0aGVyZSBtYXkgYmUgY2FzZXMKLSAgICAvLyB3aGVyZSB3ZSBjYW4gc2F2ZSBhIHJlLWFsbG9jIHdoZW4gYWRkaW5nIGEgZmV3IGNoYXJhY3RlcnMgdG8gYSBzdHJpbmcKLSAgICAvLyBieSB1c2luZyB0aGlzIG90aGVyd2lzZSB3YXN0ZWQgc3BhY2UuCi0gICAgblNpemUgKz0gNzsKLSAgICBpbnQgdG90YWxTaXplID0gblNpemUuVmFsdWVPckRpZSgpICYgfjc7Ci0gICAgaW50IHVzYWJsZVNpemUgPSB0b3RhbFNpemUgLSBvdmVyaGVhZDsKLSAgICBGWFNZU19hc3NlcnQodXNhYmxlU2l6ZSA+PSBuTGVuKTsKKyAgLy8gTm93IHJvdW5kIHRvIGFuIDgtYnl0ZSBib3VuZGFyeS4gV2UnZCBleHBlY3QgdGhhdCB0aGlzIGlzIHRoZSBtaW5pbXVtCisgIC8vIGdyYW51bGFyaXR5IG9mIGFueSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3JzLCBzbyB0aGVyZSBtYXkgYmUgY2FzZXMKKyAgLy8gd2hlcmUgd2UgY2FuIHNhdmUgYSByZS1hbGxvYyB3aGVuIGFkZGluZyBhIGZldyBjaGFyYWN0ZXJzIHRvIGEgc3RyaW5nCisgIC8vIGJ5IHVzaW5nIHRoaXMgb3RoZXJ3aXNlIHdhc3RlZCBzcGFjZS4KKyAgblNpemUgKz0gNzsKKyAgaW50IHRvdGFsU2l6ZSA9IG5TaXplLlZhbHVlT3JEaWUoKSAmIH43OworICBpbnQgdXNhYmxlU2l6ZSA9IHRvdGFsU2l6ZSAtIG92ZXJoZWFkOworICBGWFNZU19hc3NlcnQodXNhYmxlU2l6ZSA+PSBuTGVuKTsKIAotICAgIHZvaWQqIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgdG90YWxTaXplKTsKLSAgICByZXR1cm4gbmV3IChwRGF0YSkgU3RyaW5nRGF0YShuTGVuLCB1c2FibGVTaXplKTsKKyAgdm9pZCogcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCB0b3RhbFNpemUpOworICByZXR1cm4gbmV3IChwRGF0YSkgU3RyaW5nRGF0YShuTGVuLCB1c2FibGVTaXplKTsKIH0KLUNGWF9CeXRlU3RyaW5nOjp+Q0ZYX0J5dGVTdHJpbmcoKQoteworQ0ZYX0J5dGVTdHJpbmc6On5DRlhfQnl0ZVN0cmluZygpIHsKKyAgaWYgKG1fcERhdGEpIHsKKyAgICBtX3BEYXRhLT5SZWxlYXNlKCk7CisgIH0KK30KK0NGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjb25zdCBGWF9DSEFSKiBscHN6LCBGWF9TVFJTSVpFIG5MZW4pIHsKKyAgaWYgKG5MZW4gPCAwKSB7CisgICAgbkxlbiA9IGxwc3ogPyBGWFNZU19zdHJsZW4obHBzeikgOiAwOworICB9CisgIGlmIChuTGVuKSB7CisgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTGVuKTsKICAgICBpZiAobV9wRGF0YSkgewotICAgICAgICBtX3BEYXRhLT5SZWxlYXNlKCk7CisgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3osIG5MZW4pOwogICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX3BEYXRhID0gTlVMTDsKKyAgfQogfQotQ0ZYX0J5dGVTdHJpbmc6OkNGWF9CeXRlU3RyaW5nKGNvbnN0IEZYX0NIQVIqIGxwc3osIEZYX1NUUlNJWkUgbkxlbikKLXsKLSAgICBpZiAobkxlbiA8IDApIHsKLSAgICAgICAgbkxlbiA9IGxwc3ogPyBGWFNZU19zdHJsZW4obHBzeikgOiAwOwotICAgIH0KLSAgICBpZiAobkxlbikgewotICAgICAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5MZW4pOwotICAgICAgICBpZiAobV9wRGF0YSkgewotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBscHN6LCBuTGVuKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgIH0KLX0KLUNGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjb25zdCB1aW50OF90KiBscHN6LCBGWF9TVFJTSVpFIG5MZW4pCi17Ci0gICAgaWYgKG5MZW4gPiAwKSB7Ci0gICAgICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobkxlbik7Ci0gICAgICAgIGlmIChtX3BEYXRhKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3osIG5MZW4pOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgfQotfQotQ0ZYX0J5dGVTdHJpbmc6OkNGWF9CeXRlU3RyaW5nKGNoYXIgY2gpCi17Ci0gICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZSgxKTsKK0NGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjb25zdCB1aW50OF90KiBscHN6LCBGWF9TVFJTSVpFIG5MZW4pIHsKKyAgaWYgKG5MZW4gPiAwKSB7CisgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTGVuKTsKICAgICBpZiAobV9wRGF0YSkgewotICAgICAgICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IGNoOworICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBscHN6LCBuTGVuKTsKICAgICB9CisgIH0gZWxzZSB7CisgICAgbV9wRGF0YSA9IE5VTEw7CisgIH0KIH0KLUNGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nU3JjKQotewotICAgIGlmIChzdHJpbmdTcmMubV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChzdHJpbmdTcmMubV9wRGF0YS0+bV9uUmVmcyA+PSAwKSB7Ci0gICAgICAgIG1fcERhdGEgPSBzdHJpbmdTcmMubV9wRGF0YTsKLSAgICAgICAgbV9wRGF0YS0+UmV0YWluKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgICAgICp0aGlzID0gc3RyaW5nU3JjOwotICAgIH0KK0NGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjaGFyIGNoKSB7CisgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUoMSk7CisgIGlmIChtX3BEYXRhKSB7CisgICAgbV9wRGF0YS0+bV9TdHJpbmdbMF0gPSBjaDsKKyAgfQogfQotQ0ZYX0J5dGVTdHJpbmc6OkNGWF9CeXRlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyaW5nU3JjKQotewotICAgIGlmIChzdHJpbmdTcmMuSXNFbXB0eSgpKSB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQorQ0ZYX0J5dGVTdHJpbmc6OkNGWF9CeXRlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmdTcmMpIHsKKyAgaWYgKHN0cmluZ1NyYy5tX3BEYXRhID09IE5VTEwpIHsKKyAgICBtX3BEYXRhID0gTlVMTDsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHN0cmluZ1NyYy5tX3BEYXRhLT5tX25SZWZzID49IDApIHsKKyAgICBtX3BEYXRhID0gc3RyaW5nU3JjLm1fcERhdGE7CisgICAgbV9wRGF0YS0+UmV0YWluKCk7CisgIH0gZWxzZSB7CiAgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgKnRoaXMgPSBzdHJpbmdTcmM7CisgIH0KIH0KLUNGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjEsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyMikKLXsKK0NGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cmluZ1NyYykgeworICBpZiAoc3RyaW5nU3JjLklzRW1wdHkoKSkgewogICAgIG1fcERhdGEgPSBOVUxMOwotICAgIGludCBuTmV3TGVuID0gc3RyMS5HZXRMZW5ndGgoKSArIHN0cjIuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKG5OZXdMZW4gPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbik7Ci0gICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBzdHIxLkdldENTdHIoKSwgc3RyMS5HZXRMZW5ndGgoKSk7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZyArIHN0cjEuR2V0TGVuZ3RoKCksIHN0cjIuR2V0Q1N0cigpLCBzdHIyLkdldExlbmd0aCgpKTsKLSAgICB9CisgICAgcmV0dXJuOworICB9CisgIG1fcERhdGEgPSBOVUxMOworICAqdGhpcyA9IHN0cmluZ1NyYzsKIH0KLWNvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IEZYX0NIQVIqIGxwc3opCi17Ci0gICAgaWYgKGxwc3ogPT0gTlVMTCB8fCBscHN6WzBdID09IDApIHsKLSAgICAgICAgRW1wdHkoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBc3NpZ25Db3B5KEZYU1lTX3N0cmxlbihscHN6KSwgbHBzeik7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKK0NGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIyKSB7CisgIG1fcERhdGEgPSBOVUxMOworICBpbnQgbk5ld0xlbiA9IHN0cjEuR2V0TGVuZ3RoKCkgKyBzdHIyLkdldExlbmd0aCgpOworICBpZiAobk5ld0xlbiA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbik7CisgIGlmIChtX3BEYXRhKSB7CisgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBzdHIxLkdldENTdHIoKSwgc3RyMS5HZXRMZW5ndGgoKSk7CisgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nICsgc3RyMS5HZXRMZW5ndGgoKSwgc3RyMi5HZXRDU3RyKCksCisgICAgICAgICAgICAgICAgIHN0cjIuR2V0TGVuZ3RoKCkpOworICB9CiB9Ci1jb25zdCBDRlhfQnl0ZVN0cmluZyYgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yPShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikKLXsKLSAgICBpZiAoc3RyLklzRW1wdHkoKSkgewotICAgICAgICBFbXB0eSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFzc2lnbkNvcHkoc3RyLkdldExlbmd0aCgpLCBzdHIuR2V0Q1N0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotfQotY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZ1NyYykKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBzdHJpbmdTcmMubV9wRGF0YSkgewotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIGlmIChzdHJpbmdTcmMuSXNFbXB0eSgpKSB7Ci0gICAgICAgIEVtcHR5KCk7Ci0gICAgfSBlbHNlIGlmICgobV9wRGF0YSAmJiBtX3BEYXRhLT5tX25SZWZzIDwgMCkgfHwKLSAgICAgICAgICAgICAgIChzdHJpbmdTcmMubV9wRGF0YSAmJiBzdHJpbmdTcmMubV9wRGF0YS0+bV9uUmVmcyA8IDApKSB7Ci0gICAgICAgIEFzc2lnbkNvcHkoc3RyaW5nU3JjLm1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHN0cmluZ1NyYy5tX3BEYXRhLT5tX1N0cmluZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRW1wdHkoKTsKLSAgICAgICAgbV9wRGF0YSA9IHN0cmluZ1NyYy5tX3BEYXRhOwotICAgICAgICBpZiAobV9wRGF0YSkgewotICAgICAgICAgICAgbV9wRGF0YS0+UmV0YWluKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotfQotY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgQ0ZYX0JpbmFyeUJ1ZiYgYnVmKQotewotICAgIExvYWQoYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpMb2FkKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgRlhfU1RSU0laRSBsZW4pCi17Citjb25zdCBDRlhfQnl0ZVN0cmluZyYgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yPShjb25zdCBGWF9DSEFSKiBscHN6KSB7CisgIGlmIChscHN6ID09IE5VTEwgfHwgbHBzelswXSA9PSAwKSB7CiAgICAgRW1wdHkoKTsKLSAgICBpZiAobGVuKSB7Ci0gICAgICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobGVuKTsKLSAgICAgICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgYnVmLCBsZW4pOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgfQorICB9IGVsc2UgeworICAgIEFzc2lnbkNvcHkoRlhTWVNfc3RybGVuKGxwc3opLCBscHN6KTsKKyAgfQorICByZXR1cm4gKnRoaXM7CiB9Ci1jb25zdCBDRlhfQnl0ZVN0cmluZyYgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yKz0oY29uc3QgRlhfQ0hBUiogbHBzeikKLXsKLSAgICBpZiAobHBzeikgewotICAgICAgICBDb25jYXRJblBsYWNlKEZYU1lTX3N0cmxlbihscHN6KSwgbHBzeik7Ci0gICAgfQorY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIHsKKyAgaWYgKHN0ci5Jc0VtcHR5KCkpIHsKKyAgICBFbXB0eSgpOworICB9IGVsc2UgeworICAgIEFzc2lnbkNvcHkoc3RyLkdldExlbmd0aCgpLCBzdHIuR2V0Q1N0cigpKTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9Citjb25zdCBDRlhfQnl0ZVN0cmluZyYgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yPSgKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nU3JjKSB7CisgIGlmIChtX3BEYXRhID09IHN0cmluZ1NyYy5tX3BEYXRhKSB7CiAgICAgcmV0dXJuICp0aGlzOwotfQotY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcis9KGNoYXIgY2gpCi17Ci0gICAgQ29uY2F0SW5QbGFjZSgxLCAmY2gpOwotICAgIHJldHVybiAqdGhpczsKLX0KLWNvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3IrPShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKQotewotICAgIGlmIChzdHJpbmcubV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgQ29uY2F0SW5QbGFjZShzdHJpbmcubV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgc3RyaW5nLm1fcERhdGEtPm1fU3RyaW5nKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1jb25zdCBDRlhfQnl0ZVN0cmluZyYgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yKz0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHJpbmcpCi17Ci0gICAgaWYgKHN0cmluZy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBDb25jYXRJblBsYWNlKHN0cmluZy5HZXRMZW5ndGgoKSwgc3RyaW5nLkdldENTdHIoKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotYm9vbCBDRlhfQnl0ZVN0cmluZzo6RXF1YWwoY29uc3QgY2hhciogcHRyKSBjb25zdAotewotICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gIXB0ciB8fCBwdHJbMF0gPT0gJ1wwJzsKLSAgICB9Ci0gICAgaWYgKCFwdHIpIHsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPT0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIEZYU1lTX3N0cmxlbihwdHIpID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggJiYKLSAgICAgICAgRlhTWVNfbWVtY21wKHB0ciwgbV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpID09IDA7Ci19Ci1ib29sIENGWF9CeXRlU3RyaW5nOjpFcXVhbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBzdHIuSXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9PSBzdHIuR2V0TGVuZ3RoKCkgJiYKLSAgICAgICAgRlhTWVNfbWVtY21wKG1fcERhdGEtPm1fU3RyaW5nLCBzdHIuR2V0Q1N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpID09IDA7Ci19Ci1ib29sIENGWF9CeXRlU3RyaW5nOjpFcXVhbChjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKElzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gb3RoZXIuSXNFbXB0eSgpOwotICAgIH0KLSAgICBpZiAob3RoZXIuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIG90aGVyLm1fcERhdGEtPm1fbkRhdGFMZW5ndGggPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAmJgotICAgICAgICBGWFNZU19tZW1jbXAob3RoZXIubV9wRGF0YS0+bV9TdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fcERhdGEtPm1fU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSA9PSAwOwotfQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6RW1wdHkoKQoteworICB9CisgIGlmIChzdHJpbmdTcmMuSXNFbXB0eSgpKSB7CisgICAgRW1wdHkoKTsKKyAgfSBlbHNlIGlmICgobV9wRGF0YSAmJiBtX3BEYXRhLT5tX25SZWZzIDwgMCkgfHwKKyAgICAgICAgICAgICAoc3RyaW5nU3JjLm1fcERhdGEgJiYgc3RyaW5nU3JjLm1fcERhdGEtPm1fblJlZnMgPCAwKSkgeworICAgIEFzc2lnbkNvcHkoc3RyaW5nU3JjLm1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHN0cmluZ1NyYy5tX3BEYXRhLT5tX1N0cmluZyk7CisgIH0gZWxzZSB7CisgICAgRW1wdHkoKTsKKyAgICBtX3BEYXRhID0gc3RyaW5nU3JjLm1fcERhdGE7CiAgICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgbV9wRGF0YS0+UmVsZWFzZSgpOwotICAgICAgICBtX3BEYXRhID0gTlVMTDsKKyAgICAgIG1fcERhdGEtPlJldGFpbigpOwogICAgIH0KKyAgfQorICByZXR1cm4gKnRoaXM7CiB9Ci1ib29sIENGWF9CeXRlU3RyaW5nOjpFcXVhbE5vQ2FzZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBzdHIuSXNFbXB0eSgpOwotICAgIH0KLSAgICBGWF9TVFJTSVpFIGxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgICBpZiAobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAhPSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjb25zdCB1aW50OF90KiBwVGhpcyA9IChjb25zdCB1aW50OF90KiltX3BEYXRhLT5tX1N0cmluZzsKLSAgICBjb25zdCB1aW50OF90KiBwVGhhdCA9IHN0ci5HZXRQdHIoKTsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBsZW47IGkgKyspIHsKLSAgICAgICAgaWYgKCgqcFRoaXMpICE9ICgqcFRoYXQpKSB7Ci0gICAgICAgICAgICB1aW50OF90IGJUaGlzID0gKnBUaGlzOwotICAgICAgICAgICAgaWYgKGJUaGlzID49ICdBJyAmJiBiVGhpcyA8PSAnWicpIHsKLSAgICAgICAgICAgICAgICBiVGhpcyArPSAnYScgLSAnQSc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50OF90IGJUaGF0ID0gKnBUaGF0OwotICAgICAgICAgICAgaWYgKGJUaGF0ID49ICdBJyAmJiBiVGhhdCA8PSAnWicpIHsKLSAgICAgICAgICAgICAgICBiVGhhdCArPSAnYScgLSAnQSc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYlRoaXMgIT0gYlRoYXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcFRoaXMgKys7Ci0gICAgICAgIHBUaGF0ICsrOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKK2NvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IENGWF9CaW5hcnlCdWYmIGJ1ZikgeworICBMb2FkKGJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgIHJldHVybiAqdGhpczsKIH0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkFzc2lnbkNvcHkoRlhfU1RSU0laRSBuU3JjTGVuLCBjb25zdCBGWF9DSEFSKiBscHN6U3JjRGF0YSkKLXsKLSAgICBBbGxvY0JlZm9yZVdyaXRlKG5TcmNMZW4pOwotICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgbHBzelNyY0RhdGEsIG5TcmNMZW4pOwotICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuU3JjTGVuOwotICAgIG1fcERhdGEtPm1fU3RyaW5nW25TcmNMZW5dID0gMDsKLX0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkNvcHlCZWZvcmVXcml0ZSgpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCB8fCBtX3BEYXRhLT5tX25SZWZzIDw9IDEpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDRlhfQnl0ZVN0cmluZzo6TG9hZChjb25zdCB1aW50OF90KiBidWYsIEZYX1NUUlNJWkUgbGVuKSB7CisgIEVtcHR5KCk7CisgIGlmIChsZW4pIHsKKyAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKGxlbik7CisgICAgaWYgKG1fcERhdGEpIHsKKyAgICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgYnVmLCBsZW4pOwogICAgIH0KLSAgICBTdHJpbmdEYXRhKiBwRGF0YSA9IG1fcERhdGE7CisgIH0gZWxzZSB7CisgICAgbV9wRGF0YSA9IE5VTEw7CisgIH0KK30KK2NvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3IrPShjb25zdCBGWF9DSEFSKiBscHN6KSB7CisgIGlmIChscHN6KSB7CisgICAgQ29uY2F0SW5QbGFjZShGWFNZU19zdHJsZW4obHBzeiksIGxwc3opOworICB9CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3IrPShjaGFyIGNoKSB7CisgIENvbmNhdEluUGxhY2UoMSwgJmNoKTsKKyAgcmV0dXJuICp0aGlzOworfQorY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcis9KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpIHsKKyAgaWYgKHN0cmluZy5tX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQ29uY2F0SW5QbGFjZShzdHJpbmcubV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgc3RyaW5nLm1fcERhdGEtPm1fU3RyaW5nKTsKKyAgcmV0dXJuICp0aGlzOworfQorY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcis9KAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyaW5nKSB7CisgIGlmIChzdHJpbmcuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIENvbmNhdEluUGxhY2Uoc3RyaW5nLkdldExlbmd0aCgpLCBzdHJpbmcuR2V0Q1N0cigpKTsKKyAgcmV0dXJuICp0aGlzOworfQorYm9vbCBDRlhfQnl0ZVN0cmluZzo6RXF1YWwoY29uc3QgY2hhciogcHRyKSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiAhcHRyIHx8IHB0clswXSA9PSAnXDAnOworICB9CisgIGlmICghcHRyKSB7CisgICAgcmV0dXJuIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPT0gMDsKKyAgfQorICByZXR1cm4gRlhTWVNfc3RybGVuKHB0cikgPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAmJgorICAgICAgICAgRlhTWVNfbWVtY21wKHB0ciwgbV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpID09IDA7Cit9Citib29sIENGWF9CeXRlU3RyaW5nOjpFcXVhbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3QgeworICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIHN0ci5Jc0VtcHR5KCk7CisgIH0KKyAgcmV0dXJuIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPT0gc3RyLkdldExlbmd0aCgpICYmCisgICAgICAgICBGWFNZU19tZW1jbXAobV9wRGF0YS0+bV9TdHJpbmcsIHN0ci5HZXRDU3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPT0gMDsKK30KK2Jvb2wgQ0ZYX0J5dGVTdHJpbmc6OkVxdWFsKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvdGhlcikgY29uc3QgeworICBpZiAoSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIG90aGVyLklzRW1wdHkoKTsKKyAgfQorICBpZiAob3RoZXIuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBvdGhlci5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggJiYKKyAgICAgICAgIEZYU1lTX21lbWNtcChvdGhlci5tX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgPT0gMDsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkVtcHR5KCkgeworICBpZiAobV9wRGF0YSkgewogICAgIG1fcERhdGEtPlJlbGVhc2UoKTsKLSAgICBGWF9TVFJTSVpFIG5EYXRhTGVuZ3RoID0gcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuRGF0YUxlbmd0aCk7Ci0gICAgaWYgKG1fcERhdGEgIT0gTlVMTCkgewotICAgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIHBEYXRhLT5tX1N0cmluZywgbkRhdGFMZW5ndGggKyAxKTsKLSAgICB9CisgICAgbV9wRGF0YSA9IE5VTEw7CisgIH0KIH0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkFsbG9jQmVmb3JlV3JpdGUoRlhfU1RSU0laRSBuTGVuKQotewotICAgIGlmIChtX3BEYXRhICYmIG1fcERhdGEtPm1fblJlZnMgPD0gMSAmJiBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCA+PSBuTGVuKSB7Ci0gICAgICAgIHJldHVybjsKK2Jvb2wgQ0ZYX0J5dGVTdHJpbmc6OkVxdWFsTm9DYXNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdCB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gc3RyLklzRW1wdHkoKTsKKyAgfQorICBGWF9TVFJTSVpFIGxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgaWYgKG1fcERhdGEtPm1fbkRhdGFMZW5ndGggIT0gbGVuKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IHVpbnQ4X3QqIHBUaGlzID0gKGNvbnN0IHVpbnQ4X3QqKW1fcERhdGEtPm1fU3RyaW5nOworICBjb25zdCB1aW50OF90KiBwVGhhdCA9IHN0ci5HZXRQdHIoKTsKKyAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBpZiAoKCpwVGhpcykgIT0gKCpwVGhhdCkpIHsKKyAgICAgIHVpbnQ4X3QgYlRoaXMgPSAqcFRoaXM7CisgICAgICBpZiAoYlRoaXMgPj0gJ0EnICYmIGJUaGlzIDw9ICdaJykgeworICAgICAgICBiVGhpcyArPSAnYScgLSAnQSc7CisgICAgICB9CisgICAgICB1aW50OF90IGJUaGF0ID0gKnBUaGF0OworICAgICAgaWYgKGJUaGF0ID49ICdBJyAmJiBiVGhhdCA8PSAnWicpIHsKKyAgICAgICAgYlRoYXQgKz0gJ2EnIC0gJ0EnOworICAgICAgfQorICAgICAgaWYgKGJUaGlzICE9IGJUaGF0KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KICAgICB9CisgICAgcFRoaXMrKzsKKyAgICBwVGhhdCsrOworICB9CisgIHJldHVybiB0cnVlOworfQordm9pZCBDRlhfQnl0ZVN0cmluZzo6QXNzaWduQ29weShGWF9TVFJTSVpFIG5TcmNMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGxwc3pTcmNEYXRhKSB7CisgIEFsbG9jQmVmb3JlV3JpdGUoblNyY0xlbik7CisgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgbHBzelNyY0RhdGEsIG5TcmNMZW4pOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gblNyY0xlbjsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbblNyY0xlbl0gPSAwOworfQordm9pZCBDRlhfQnl0ZVN0cmluZzo6Q29weUJlZm9yZVdyaXRlKCkgeworICBpZiAobV9wRGF0YSA9PSBOVUxMIHx8IG1fcERhdGEtPm1fblJlZnMgPD0gMSkgeworICAgIHJldHVybjsKKyAgfQorICBTdHJpbmdEYXRhKiBwRGF0YSA9IG1fcERhdGE7CisgIG1fcERhdGEtPlJlbGVhc2UoKTsKKyAgRlhfU1RSU0laRSBuRGF0YUxlbmd0aCA9IHBEYXRhLT5tX25EYXRhTGVuZ3RoOworICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5EYXRhTGVuZ3RoKTsKKyAgaWYgKG1fcERhdGEgIT0gTlVMTCkgeworICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgcERhdGEtPm1fU3RyaW5nLCBuRGF0YUxlbmd0aCArIDEpOworICB9Cit9Cit2b2lkIENGWF9CeXRlU3RyaW5nOjpBbGxvY0JlZm9yZVdyaXRlKEZYX1NUUlNJWkUgbkxlbikgeworICBpZiAobV9wRGF0YSAmJiBtX3BEYXRhLT5tX25SZWZzIDw9IDEgJiYgbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPj0gbkxlbikgeworICAgIHJldHVybjsKKyAgfQorICBFbXB0eSgpOworICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5MZW4pOworfQordm9pZCBDRlhfQnl0ZVN0cmluZzo6UmVsZWFzZUJ1ZmZlcihGWF9TVFJTSVpFIG5OZXdMZW5ndGgpIHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBDb3B5QmVmb3JlV3JpdGUoKTsKKyAgaWYgKG5OZXdMZW5ndGggPT0gLTEpIHsKKyAgICBuTmV3TGVuZ3RoID0gRlhTWVNfc3RybGVuKChjb25zdCBGWF9DSEFSKiltX3BEYXRhLT5tX1N0cmluZyk7CisgIH0KKyAgaWYgKG5OZXdMZW5ndGggPT0gMCkgewogICAgIEVtcHR5KCk7Ci0gICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTGVuKTsKKyAgICByZXR1cm47CisgIH0KKyAgRlhTWVNfYXNzZXJ0KG5OZXdMZW5ndGggPD0gbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGgpOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk5ld0xlbmd0aDsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbbk5ld0xlbmd0aF0gPSAwOwogfQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6UmVsZWFzZUJ1ZmZlcihGWF9TVFJTSVpFIG5OZXdMZW5ndGgpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENvcHlCZWZvcmVXcml0ZSgpOwotICAgIGlmIChuTmV3TGVuZ3RoID09IC0xKSB7Ci0gICAgICAgIG5OZXdMZW5ndGggPSBGWFNZU19zdHJsZW4oKGNvbnN0IEZYX0NIQVIqKW1fcERhdGEtPm1fU3RyaW5nKTsKLSAgICB9Ci0gICAgaWYgKG5OZXdMZW5ndGggPT0gMCkgewotICAgICAgICBFbXB0eSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX2Fzc2VydChuTmV3TGVuZ3RoIDw9IG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoKTsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk5ld0xlbmd0aDsKLSAgICBtX3BEYXRhLT5tX1N0cmluZ1tuTmV3TGVuZ3RoXSA9IDA7Cit2b2lkIENGWF9CeXRlU3RyaW5nOjpSZXNlcnZlKEZYX1NUUlNJWkUgbGVuKSB7CisgIEdldEJ1ZmZlcihsZW4pOworICBSZWxlYXNlQnVmZmVyKEdldExlbmd0aCgpKTsKIH0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlJlc2VydmUoRlhfU1RSU0laRSBsZW4pCi17Ci0gICAgR2V0QnVmZmVyKGxlbik7Ci0gICAgUmVsZWFzZUJ1ZmZlcihHZXRMZW5ndGgoKSk7Ci19Ci1GWF9DSEFSKiBDRlhfQnl0ZVN0cmluZzo6R2V0QnVmZmVyKEZYX1NUUlNJWkUgbk1pbkJ1Zkxlbmd0aCkKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMICYmIG5NaW5CdWZMZW5ndGggPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fcERhdGEgJiYgbV9wRGF0YS0+bV9uUmVmcyA8PSAxICYmIG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoID49IG5NaW5CdWZMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOwotICAgIH0KLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk1pbkJ1Zkxlbmd0aCk7Ci0gICAgICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IDA7Ci0gICAgICAgIG1fcERhdGEtPm1fU3RyaW5nWzBdID0gMDsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOwotICAgIH0KLSAgICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7Ci0gICAgRlhfU1RSU0laRSBuT2xkTGVuID0gcE9sZERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgaWYgKG5NaW5CdWZMZW5ndGggPCBuT2xkTGVuKSB7Ci0gICAgICAgIG5NaW5CdWZMZW5ndGggPSBuT2xkTGVuOwotICAgIH0KK0ZYX0NIQVIqIENGWF9CeXRlU3RyaW5nOjpHZXRCdWZmZXIoRlhfU1RSU0laRSBuTWluQnVmTGVuZ3RoKSB7CisgIGlmIChtX3BEYXRhID09IE5VTEwgJiYgbk1pbkJ1Zkxlbmd0aCA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKG1fcERhdGEgJiYgbV9wRGF0YS0+bV9uUmVmcyA8PSAxICYmCisgICAgICBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCA+PSBuTWluQnVmTGVuZ3RoKSB7CisgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOworICB9CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKICAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5NaW5CdWZMZW5ndGgpOwogICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIHBPbGREYXRhLT5tX1N0cmluZywgKG5PbGRMZW4gKyAxKSk7Ci0gICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5PbGRMZW47Ci0gICAgcE9sZERhdGEtPlJlbGVhc2UoKTsKKyAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gMDsKKyAgICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IDA7CiAgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOwotfQotRlhfU1RSU0laRSBDRlhfQnl0ZVN0cmluZzo6RGVsZXRlKEZYX1NUUlNJWkUgbkluZGV4LCBGWF9TVFJTSVpFIG5Db3VudCkKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobkluZGV4IDwgMCkgewotICAgICAgICBuSW5kZXggPSAwOwotICAgIH0KLSAgICBGWF9TVFJTSVpFIG5PbGRMZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIGlmIChuQ291bnQgPiAwICYmIG5JbmRleCA8IG5PbGRMZW5ndGgpIHsKLSAgICAgICAgRlhfU1RSU0laRSBtTGVuZ3RoID0gbkluZGV4ICsgbkNvdW50OwotICAgICAgICBpZiAobUxlbmd0aCA+PSBuT2xkTGVuZ3RoKSB7Ci0gICAgICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbkluZGV4OwotICAgICAgICAgICAgcmV0dXJuIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgICAgIGludCBuQnl0ZXNUb0NvcHkgPSBuT2xkTGVuZ3RoIC0gbUxlbmd0aCArIDE7Ci0gICAgICAgIEZYU1lTX21lbW1vdmUobV9wRGF0YS0+bV9TdHJpbmcgKyBuSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEYXRhLT5tX1N0cmluZyArIG1MZW5ndGgsIG5CeXRlc1RvQ29weSk7Ci0gICAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuT2xkTGVuZ3RoIC0gbkNvdW50OwotICAgIH0KLSAgICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLX0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkNvbmNhdEluUGxhY2UoRlhfU1RSU0laRSBuU3JjTGVuLCBjb25zdCBGWF9DSEFSKiBscHN6U3JjRGF0YSkKLXsKLSAgICBpZiAoblNyY0xlbiA9PSAwIHx8IGxwc3pTcmNEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUoblNyY0xlbik7Ci0gICAgICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgbHBzelNyY0RhdGEsIG5TcmNMZW4pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX3BEYXRhLT5tX25SZWZzID4gMSB8fCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICsgblNyY0xlbiA+IG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoKSB7Ci0gICAgICAgIENvbmNhdENvcHkobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgbV9wRGF0YS0+bV9TdHJpbmcsIG5TcmNMZW4sIGxwc3pTcmNEYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBscHN6U3JjRGF0YSwgblNyY0xlbik7Ci0gICAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKz0gblNyY0xlbjsKLSAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmdbbV9wRGF0YS0+bV9uRGF0YUxlbmd0aF0gPSAwOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkNvbmNhdENvcHkoRlhfU1RSU0laRSBuU3JjMUxlbiwgY29uc3QgRlhfQ0hBUiogbHBzelNyYzFEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5TcmMyTGVuLCBjb25zdCBGWF9DSEFSKiBscHN6U3JjMkRhdGEpCi17Ci0gICAgaW50IG5OZXdMZW4gPSBuU3JjMUxlbiArIG5TcmMyTGVuOwotICAgIGlmIChuTmV3TGVuIDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBEb24ndCByZWxlYXNlIHVudGlsIGRvbmUgY29weWluZywgbWlnaHQgYmUgb25lIG9mIHRoZSBhcmd1bWVudHMuCi0gICAgU3RyaW5nRGF0YSogcE9sZERhdGEgPSBtX3BEYXRhOwotICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbik7Ci0gICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBscHN6U3JjMURhdGEsIG5TcmMxTGVuKTsKLSAgICAgICAgbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nICsgblNyYzFMZW4sIGxwc3pTcmMyRGF0YSwgblNyYzJMZW4pOwotICAgIH0KLSAgICBwT2xkRGF0YS0+UmVsZWFzZSgpOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6Ok1pZChGWF9TVFJTSVpFIG5GaXJzdCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gTWlkKG5GaXJzdCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5GaXJzdCk7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6TWlkKEZYX1NUUlNJWkUgbkZpcnN0LCBGWF9TVFJTSVpFIG5Db3VudCkgY29uc3QKLXsKLSAgICBpZiAobkZpcnN0IDwgMCkgewotICAgICAgICBuRmlyc3QgPSAwOwotICAgIH0KLSAgICBpZiAobkNvdW50IDwgMCkgewotICAgICAgICBuQ291bnQgPSAwOwotICAgIH0KLSAgICBpZiAobkZpcnN0ICsgbkNvdW50ID4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgewotICAgICAgICBuQ291bnQgPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gbkZpcnN0OwotICAgIH0KLSAgICBpZiAobkZpcnN0ID4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgewotICAgICAgICBuQ291bnQgPSAwOwotICAgIH0KLSAgICBpZiAobkZpcnN0ID09IDAgJiYgbkZpcnN0ICsgbkNvdW50ID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBkZXN0OwotICAgIEFsbG9jQ29weShkZXN0LCBuQ291bnQsIG5GaXJzdCk7Ci0gICAgcmV0dXJuIGRlc3Q7Ci19Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpBbGxvY0NvcHkoQ0ZYX0J5dGVTdHJpbmcmIGRlc3QsIEZYX1NUUlNJWkUgbkNvcHlMZW4sIEZYX1NUUlNJWkUgbkNvcHlJbmRleCkgY29uc3QKLXsKLSAgICAvLyB8RlhfU1RSU0laRXwgaXMgY3VycmVudGx5IHR5cGVkZWYnZCBhcyBpbiB8aW50fC4gVE9ETyhwYWxtZXIpOiBJdAotICAgIC8vIHNob3VsZCBiZSBhIHxzaXplX3R8LCBvciBhdCBsZWFzdCB1bnNpZ25lZC4KLSAgICBpZiAobkNvcHlMZW4gPT0gMCB8fCBuQ29weUxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBU1NFUlQoZGVzdC5tX3BEYXRhID09IE5VTEwpOwotICAgIGRlc3QubV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuQ29weUxlbik7Ci0gICAgaWYgKGRlc3QubV9wRGF0YSkgewotICAgICAgICBGWFNZU19tZW1jcHkoZGVzdC5tX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9TdHJpbmcgKyBuQ29weUluZGV4LCBuQ29weUxlbik7Ci0gICAgfQotfQotI2RlZmluZSBGT1JDRV9BTlNJICAgICAgMHgxMDAwMAotI2RlZmluZSBGT1JDRV9VTklDT0RFICAgMHgyMDAwMAotI2RlZmluZSBGT1JDRV9JTlQ2NCAgICAgMHg0MDAwMAotdm9pZCBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0Vihjb25zdCBGWF9DSEFSKiBscHN6Rm9ybWF0LCB2YV9saXN0IGFyZ0xpc3QpCi17Ci0gICAgdmFfbGlzdCBhcmdMaXN0U2F2ZTsKLSNpZiBkZWZpbmVkKF9fQVJNQ0NfVkVSU0lPTikgfHwgKCFkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX0ZYX0NQVV8gPT0gX0ZYX1g2NF8gfHwgX0ZYX0NQVV8gPT0gX0ZYX0lBNjRfIHx8IF9GWF9DUFVfID09IF9GWF9BUk02NF8pKSB8fCBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQotICAgIHZhX2NvcHkoYXJnTGlzdFNhdmUsIGFyZ0xpc3QpOwotI2Vsc2UKLSAgICBhcmdMaXN0U2F2ZSA9IGFyZ0xpc3Q7Ci0jZW5kaWYKLSAgICBpbnQgbk1heExlbiA9IDA7Ci0gICAgZm9yIChjb25zdCBGWF9DSEFSKiBscHN6ID0gbHBzekZvcm1hdDsgKmxwc3ogIT0gMDsgbHBzeiArKykgewotICAgICAgICBpZiAoKmxwc3ogIT0gJyUnIHx8ICoobHBzeiA9IGxwc3ogKyAxKSA9PSAnJScpIHsKLSAgICAgICAgICAgIG5NYXhMZW4gKz0gRlhTWVNfc3RybGVuKGxwc3opOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5JdGVtTGVuID0gMDsKLSAgICAgICAgaW50IG5XaWR0aCA9IDA7Ci0gICAgICAgIGZvciAoOyAqbHBzeiAhPSAwOyBscHN6ICsrKSB7Ci0gICAgICAgICAgICBpZiAoKmxwc3ogPT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgbk1heExlbiArPSAyOwotICAgICAgICAgICAgfSBlbHNlIGlmICgqbHBzeiA9PSAnKicpIHsKLSAgICAgICAgICAgICAgICBuV2lkdGggPSB2YV9hcmcoYXJnTGlzdCwgaW50KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKmxwc3ogPT0gJy0nIHx8ICpscHN6ID09ICcrJyB8fCAqbHBzeiA9PSAnMCcgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgKmxwc3ogPT0gJyAnKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChuV2lkdGggPT0gMCkgewotICAgICAgICAgICAgbldpZHRoID0gRlhTWVNfYXRvaShscHN6KTsKLSAgICAgICAgICAgIGZvciAoOyAoKmxwc3opID49ICcwJyAmJiAoKmxwc3opIDw9ICc5JzsgbHBzeiArKykKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5XaWR0aCA8IDAgfHwgbldpZHRoID4gMTI4ICogMTAyNCkgewotICAgICAgICAgICAgbHBzekZvcm1hdCA9ICJCYWQgd2lkdGgiOwotICAgICAgICAgICAgbk1heExlbiA9IDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5QcmVjaXNpb24gPSAwOwotICAgICAgICBpZiAoKmxwc3ogPT0gJy4nKSB7Ci0gICAgICAgICAgICBscHN6ICsrOwotICAgICAgICAgICAgaWYgKCpscHN6ID09ICcqJykgewotICAgICAgICAgICAgICAgIG5QcmVjaXNpb24gPSB2YV9hcmcoYXJnTGlzdCwgaW50KTsKLSAgICAgICAgICAgICAgICBscHN6ICsrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuUHJlY2lzaW9uID0gRlhTWVNfYXRvaShscHN6KTsKLSAgICAgICAgICAgICAgICBmb3IgKDsgKCpscHN6KSA+PSAnMCcgJiYgKCpscHN6KSA8PSAnOSc7IGxwc3ogKyspCi0gICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoblByZWNpc2lvbiA8IDAgfHwgblByZWNpc2lvbiA+IDEyOCAqIDEwMjQpIHsKLSAgICAgICAgICAgIGxwc3pGb3JtYXQgPSAiQmFkIHByZWNpc2lvbiI7Ci0gICAgICAgICAgICBuTWF4TGVuID0gMTQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbnQgbk1vZGlmaWVyID0gMDsKLSAgICAgICAgaWYgKEZYU1lTX3N0cm5jbXAobHBzeiwgIkk2NCIsIDMpID09IDApIHsKLSAgICAgICAgICAgIGxwc3ogKz0gMzsKLSAgICAgICAgICAgIG5Nb2RpZmllciA9IEZPUkNFX0lOVDY0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoICgqbHBzeikgewotICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICBuTW9kaWZpZXIgPSBGT1JDRV9BTlNJOwotICAgICAgICAgICAgICAgICAgICBscHN6ICsrOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICAgICAgbk1vZGlmaWVyID0gRk9SQ0VfVU5JQ09ERTsKLSAgICAgICAgICAgICAgICAgICAgbHBzeiArKzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnTic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgICAgICAgICAgIGxwc3ogKys7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKmxwc3ogfCBuTW9kaWZpZXIpIHsKLSAgICAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgY2FzZSAnQyc6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnYyd8Rk9SQ0VfQU5TSToKLSAgICAgICAgICAgIGNhc2UgJ0MnfEZPUkNFX0FOU0k6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnYyd8Rk9SQ0VfVU5JQ09ERToKLSAgICAgICAgICAgIGNhc2UgJ0MnfEZPUkNFX1VOSUNPREU6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyc6IHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgRlhfQ0hBUiopOwotICAgICAgICAgICAgICAgICAgICBpZiAocHN0ck5leHRBcmcgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSA2OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBGWFNZU19zdHJsZW4ocHN0ck5leHRBcmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ1MnOiB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSKiBwc3RyTmV4dEFyZyA9IHZhX2FyZyhhcmdMaXN0LCBGWF9XQ0hBUiopOwotICAgICAgICAgICAgICAgICAgICBpZiAocHN0ck5leHRBcmcgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSA2OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBGWFNZU193Y3NsZW4ocHN0ck5leHRBcmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3MnfEZPUkNFX0FOU0k6Ci0gICAgICAgICAgICBjYXNlICdTJ3xGT1JDRV9BTlNJOiB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIGNvbnN0IEZYX0NIQVIqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBzdHJOZXh0QXJnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfc3RybGVuKHBzdHJOZXh0QXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdzJ3xGT1JDRV9VTklDT0RFOgotICAgICAgICAgICAgY2FzZSAnUyd8Rk9SQ0VfVU5JQ09ERTogewotICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgRlhfV0NIQVIqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBzdHJOZXh0QXJnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfd2NzbGVuKHBzdHJOZXh0QXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5JdGVtTGVuICE9IDApIHsKLSAgICAgICAgICAgIGlmIChuUHJlY2lzaW9uICE9IDAgJiYgbkl0ZW1MZW4gPiBuUHJlY2lzaW9uKSB7Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuUHJlY2lzaW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCpscHN6KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnWCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnbyc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuTW9kaWZpZXIgJiBGT1JDRV9JTlQ2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludDY0X3QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAzMjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoICsgblByZWNpc2lvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGggKyBuUHJlY2lzaW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgICAgICAgIGNhc2UgJ0EnOgotICAgICAgICAgICAgICAgIGNhc2UgJ2UnOgotICAgICAgICAgICAgICAgIGNhc2UgJ0UnOgotICAgICAgICAgICAgICAgIGNhc2UgJ2cnOgotICAgICAgICAgICAgICAgIGNhc2UgJ0cnOgotICAgICAgICAgICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgZG91YmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAxMjg7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCArIG5QcmVjaXNpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gbldpZHRoICsgblByZWNpc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5XaWR0aCArIG5QcmVjaXNpb24gPiAxMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gblByZWNpc2lvbiArIG5XaWR0aCArIDEyODsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcHN6VGVtcFsyNTZdOwotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYgPSB2YV9hcmcoYXJnTGlzdCwgZG91YmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChwc3pUZW1wLCAwLCBzaXplb2YocHN6VGVtcCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfc25wcmludGYocHN6VGVtcCwgc2l6ZW9mKHBzelRlbXApIC0gMSwgIiUqLipmIiwgbldpZHRoLCBuUHJlY2lzaW9uICsgNiwgZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3pUZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIHZvaWQqKTsKLSAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAzMjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoICsgblByZWNpc2lvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGggKyBuUHJlY2lzaW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50Kik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5NYXhMZW4gKz0gbkl0ZW1MZW47Ci0gICAgfQotICAgIG5NYXhMZW4gKz0gMzI7ICAvLyBGdWRnZSBmYWN0b3IuCi0gICAgR2V0QnVmZmVyKG5NYXhMZW4pOwotICAgIGlmIChtX3BEYXRhKSB7Ci0gICAgICAgIG1lbXNldChtX3BEYXRhLT5tX1N0cmluZywgMCwgbk1heExlbik7Ci0gICAgICAgIEZYU1lTX3ZzbnByaW50ZihtX3BEYXRhLT5tX1N0cmluZywgbk1heExlbiAtIDEsIGxwc3pGb3JtYXQsIGFyZ0xpc3RTYXZlKTsKLSAgICAgICAgUmVsZWFzZUJ1ZmZlcigpOwotICAgIH0KLSAgICB2YV9lbmQoYXJnTGlzdFNhdmUpOwotfQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0KGNvbnN0IEZYX0NIQVIqIGxwc3pGb3JtYXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ0xpc3Q7Ci0gICAgdmFfc3RhcnQoYXJnTGlzdCwgbHBzekZvcm1hdCk7Ci0gICAgRm9ybWF0VihscHN6Rm9ybWF0LCBhcmdMaXN0KTsKLSAgICB2YV9lbmQoYXJnTGlzdCk7Ci19Ci1GWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpJbnNlcnQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX0NIQVIgY2gpCi17Ci0gICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgaWYgKG5JbmRleCA8IDApIHsKLSAgICAgICAgbkluZGV4ID0gMDsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBuTmV3TGVuZ3RoID0gbV9wRGF0YSA/IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggOiAwOwotICAgIGlmIChuSW5kZXggPiBuTmV3TGVuZ3RoKSB7Ci0gICAgICAgIG5JbmRleCA9IG5OZXdMZW5ndGg7Ci0gICAgfQotICAgIG5OZXdMZW5ndGgrKzsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMIHx8IG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoIDwgbk5ld0xlbmd0aCkgewotICAgICAgICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7Ci0gICAgICAgIGNvbnN0IEZYX0NIQVIqIHBzdHIgPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgICAgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuZ3RoKTsKLSAgICAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZihwT2xkRGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1tb3ZlKG1fcERhdGEtPm1fU3RyaW5nLCBwc3RyLCAocE9sZERhdGEtPm1fbkRhdGFMZW5ndGggKyAxKSk7Ci0gICAgICAgICAgICBwT2xkRGF0YS0+UmVsZWFzZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmdbMF0gPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYU1lTX21lbW1vdmUobV9wRGF0YS0+bV9TdHJpbmcgKyBuSW5kZXggKyAxLAotICAgICAgICAgICAgICAgICAgICBtX3BEYXRhLT5tX1N0cmluZyArIG5JbmRleCwgKG5OZXdMZW5ndGggLSBuSW5kZXgpKTsKLSAgICBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdID0gY2g7Ci0gICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5OZXdMZW5ndGg7Ci0gICAgcmV0dXJuIG5OZXdMZW5ndGg7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6UmlnaHQoRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgaWYgKG5Db3VudCA8IDApIHsKLSAgICAgICAgbkNvdW50ID0gMDsKLSAgICB9Ci0gICAgaWYgKG5Db3VudCA+PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZGVzdDsKLSAgICBBbGxvY0NvcHkoZGVzdCwgbkNvdW50LCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gbkNvdW50KTsKLSAgICByZXR1cm4gZGVzdDsKLX0KLUNGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpMZWZ0KEZYX1NUUlNJWkUgbkNvdW50KSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIGlmIChuQ291bnQgPCAwKSB7Ci0gICAgICAgIG5Db3VudCA9IDA7Ci0gICAgfQotICAgIGlmIChuQ291bnQgPj0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgewotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGRlc3Q7Ci0gICAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgMCk7Ci0gICAgcmV0dXJuIGRlc3Q7Ci19Ci1GWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpGaW5kKEZYX0NIQVIgY2gsIEZYX1NUUlNJWkUgblN0YXJ0KSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBGWF9TVFJTSVpFIG5MZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIGlmIChuU3RhcnQgPj0gbkxlbmd0aCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGNvbnN0IEZYX0NIQVIqIGxwc3ogPSBGWFNZU19zdHJjaHIobV9wRGF0YS0+bV9TdHJpbmcgKyBuU3RhcnQsIGNoKTsKLSAgICByZXR1cm4gKGxwc3ogPT0gTlVMTCkgPyAtMSA6IChpbnQpKGxwc3ogLSBtX3BEYXRhLT5tX1N0cmluZyk7Ci19Ci1GWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpSZXZlcnNlRmluZChGWF9DSEFSIGNoKSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBGWF9TVFJTSVpFIG5MZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIHdoaWxlIChuTGVuZ3RoKSB7Ci0gICAgICAgIGlmIChtX3BEYXRhLT5tX1N0cmluZ1tuTGVuZ3RoIC0gMV0gPT0gY2gpIHsKLSAgICAgICAgICAgIHJldHVybiBuTGVuZ3RoIC0gMTsKLSAgICAgICAgfQotICAgICAgICBuTGVuZ3RoIC0tOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci1jb25zdCBGWF9DSEFSKiBGWF9zdHJzdHIoY29uc3QgRlhfQ0hBUiogc3RyMSwgaW50IGxlbjEsIGNvbnN0IEZYX0NIQVIqIHN0cjIsIGludCBsZW4yKQotewotICAgIGlmIChsZW4yID4gbGVuMSB8fCBsZW4yID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGNvbnN0IEZYX0NIQVIqIGVuZF9wdHIgPSBzdHIxICsgbGVuMSAtIGxlbjI7Ci0gICAgd2hpbGUgKHN0cjEgPD0gZW5kX3B0cikgewotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBpZiAoc3RyMVtpXSAhPSBzdHIyW2ldKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICAgICAgaWYgKGkgPT0gbGVuMikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHIxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0cjEgKys7Ci0gICAgfQorICB9CisgIFN0cmluZ0RhdGEqIHBPbGREYXRhID0gbV9wRGF0YTsKKyAgRlhfU1RSU0laRSBuT2xkTGVuID0gcE9sZERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIGlmIChuTWluQnVmTGVuZ3RoIDwgbk9sZExlbikgeworICAgIG5NaW5CdWZMZW5ndGggPSBuT2xkTGVuOworICB9CisgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk1pbkJ1Zkxlbmd0aCk7CisgIGlmICghbV9wRGF0YSkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgcE9sZERhdGEtPm1fU3RyaW5nLCAobk9sZExlbiArIDEpKTsKKyAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5PbGRMZW47CisgIHBPbGREYXRhLT5SZWxlYXNlKCk7CisgIHJldHVybiBtX3BEYXRhLT5tX1N0cmluZzsKIH0KLUZYX1NUUlNJWkUgQ0ZYX0J5dGVTdHJpbmc6OkZpbmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6U3ViLCBGWF9TVFJTSVpFIG5TdGFydCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBuTGVuZ3RoID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgICBpZiAoblN0YXJ0ID4gbkxlbmd0aCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGNvbnN0IEZYX0NIQVIqIGxwc3ogPSBGWF9zdHJzdHIobV9wRGF0YS0+bV9TdHJpbmcgKyBuU3RhcnQsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBzelN1Yi5HZXRDU3RyKCksIGxwc3pTdWIuR2V0TGVuZ3RoKCkpOwotICAgIHJldHVybiAobHBzeiA9PSBOVUxMKSA/IC0xIDogKGludCkobHBzeiAtIG1fcERhdGEtPm1fU3RyaW5nKTsKLX0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6Ok1ha2VMb3dlcigpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENvcHlCZWZvcmVXcml0ZSgpOwotICAgIGlmIChHZXRMZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU19zdHJsd3IobV9wRGF0YS0+bV9TdHJpbmcpOwotfQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6TWFrZVVwcGVyKCkKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgaWYgKEdldExlbmd0aCgpIDwgMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX3N0cnVwcihtX3BEYXRhLT5tX1N0cmluZyk7Ci19Ci1GWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpSZW1vdmUoRlhfQ0hBUiBjaFJlbW92ZSkKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9DSEFSKiBwc3RyU291cmNlID0gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gICAgRlhfQ0hBUiogcHN0ckRlc3QgPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgICBGWF9DSEFSKiBwc3RyRW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIHdoaWxlIChwc3RyU291cmNlIDwgcHN0ckVuZCkgewotICAgICAgICBpZiAoKnBzdHJTb3VyY2UgIT0gY2hSZW1vdmUpIHsKLSAgICAgICAgICAgICpwc3RyRGVzdCA9ICpwc3RyU291cmNlOwotICAgICAgICAgICAgcHN0ckRlc3QgKys7Ci0gICAgICAgIH0KLSAgICAgICAgcHN0clNvdXJjZSArKzsKLSAgICB9Ci0gICAgKnBzdHJEZXN0ID0gMDsKLSAgICBGWF9TVFJTSVpFIG5Db3VudCA9IChGWF9TVFJTSVpFKShwc3RyU291cmNlIC0gcHN0ckRlc3QpOwotICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLT0gbkNvdW50OwotICAgIHJldHVybiBuQ291bnQ7Ci19Ci1GWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpSZXBsYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzek9sZCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6TmV3KQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChscHN6T2xkLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBuU291cmNlTGVuID0gbHBzek9sZC5HZXRMZW5ndGgoKTsKLSAgICBGWF9TVFJTSVpFIG5SZXBsYWNlbWVudExlbiA9IGxwc3pOZXcuR2V0TGVuZ3RoKCk7Ci0gICAgRlhfU1RSU0laRSBuQ291bnQgPSAwOwotICAgIGNvbnN0IEZYX0NIQVIqIHBTdGFydCA9IG1fcERhdGEtPm1fU3RyaW5nOwotICAgIEZYX0NIQVIqIHBFbmQgPSBtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgY29uc3QgRlhfQ0hBUiogcFRhcmdldCA9IEZYX3N0cnN0cihwU3RhcnQsIChGWF9TVFJTSVpFKShwRW5kIC0gcFN0YXJ0KSwgbHBzek9sZC5HZXRDU3RyKCksIG5Tb3VyY2VMZW4pOwotICAgICAgICBpZiAocFRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBuQ291bnQrKzsKLSAgICAgICAgcFN0YXJ0ID0gcFRhcmdldCArIG5Tb3VyY2VMZW47Ci0gICAgfQotICAgIGlmIChuQ291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBuTmV3TGVuZ3RoID0gIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKyAoblJlcGxhY2VtZW50TGVuIC0gblNvdXJjZUxlbikgKiBuQ291bnQ7Ci0gICAgaWYgKG5OZXdMZW5ndGggPT0gMCkgewotICAgICAgICBFbXB0eSgpOwotICAgICAgICByZXR1cm4gbkNvdW50OwotICAgIH0KLSAgICBTdHJpbmdEYXRhKiBwTmV3RGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuZ3RoKTsKLSAgICBpZiAoIXBOZXdEYXRhKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBwU3RhcnQgPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgICBGWF9DSEFSKiBwRGVzdCA9IHBOZXdEYXRhLT5tX1N0cmluZzsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsKLSAgICAgICAgY29uc3QgRlhfQ0hBUiogcFRhcmdldCA9IEZYX3N0cnN0cihwU3RhcnQsIChGWF9TVFJTSVpFKShwRW5kIC0gcFN0YXJ0KSwgbHBzek9sZC5HZXRDU3RyKCksIG5Tb3VyY2VMZW4pOwotICAgICAgICBGWFNZU19tZW1jcHkocERlc3QsIHBTdGFydCwgcFRhcmdldCAtIHBTdGFydCk7Ci0gICAgICAgIHBEZXN0ICs9IHBUYXJnZXQgLSBwU3RhcnQ7Ci0gICAgICAgIEZYU1lTX21lbWNweShwRGVzdCwgbHBzek5ldy5HZXRDU3RyKCksIGxwc3pOZXcuR2V0TGVuZ3RoKCkpOwotICAgICAgICBwRGVzdCArPSBscHN6TmV3LkdldExlbmd0aCgpOwotICAgICAgICBwU3RhcnQgPSBwVGFyZ2V0ICsgblNvdXJjZUxlbjsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5KHBEZXN0LCBwU3RhcnQsIHBFbmQgLSBwU3RhcnQpOwotICAgIG1fcERhdGEtPlJlbGVhc2UoKTsKLSAgICBtX3BEYXRhID0gcE5ld0RhdGE7Ci0gICAgcmV0dXJuIG5Db3VudDsKLX0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlNldEF0KEZYX1NUUlNJWkUgbkluZGV4LCBGWF9DSEFSIGNoKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU19hc3NlcnQobkluZGV4ID49IDApOwotICAgIEZYU1lTX2Fzc2VydChuSW5kZXggPCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKTsKLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdID0gY2g7Ci19Ci1DRlhfV2lkZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6VVRGOERlY29kZSgpIGNvbnN0Ci17Ci0gICAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7Ci0gICAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgR2V0TGVuZ3RoKCk7IGkgKyspIHsKLSAgICAgICAgZGVjb2Rlci5JbnB1dCgodWludDhfdCltX3BEYXRhLT5tX1N0cmluZ1tpXSk7Ci0gICAgfQotICAgIHJldHVybiBkZWNvZGVyLkdldFJlc3VsdCgpOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKGNvbnN0IEZYX1dDSEFSKiBzdHIsIEZYX1NUUlNJWkUgbGVuKQotewotICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgIGxlbiA9IEZYU1lTX3djc2xlbihzdHIpOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBic3RyOwotICAgIGJzdHIuQ29udmVydEZyb20oQ0ZYX1dpZGVTdHJpbmcoc3RyLCBsZW4pKTsKLSAgICByZXR1cm4gYnN0cjsKLX0KLUNGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKQotewotICAgIHJldHVybiBGcm9tVW5pY29kZShzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKLX0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkNvbnZlcnRGcm9tKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIsIENGWF9DaGFyTWFwKiBwQ2hhck1hcCkKLXsKLSAgICBpZiAocENoYXJNYXAgPT0gTlVMTCkgewotICAgICAgICBwQ2hhck1hcCA9IENGWF9DaGFyTWFwOjpHZXREZWZhdWx0TWFwcGVyKCk7Ci0gICAgfQotICAgICp0aGlzID0gKCpwQ2hhck1hcC0+bV9HZXRCeXRlU3RyaW5nKShwQ2hhck1hcCwgc3RyKTsKLX0KLWludCBDRlhfQnl0ZVN0cmluZzo6Q29tcGFyZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBzdHIuSXNFbXB0eSgpID8gMCA6IC0xOwotICAgIH0KLSAgICBpbnQgdGhpc19sZW4gPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIGludCB0aGF0X2xlbiA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgICBpbnQgbWluX2xlbiA9IHRoaXNfbGVuIDwgdGhhdF9sZW4gPyB0aGlzX2xlbiA6IHRoYXRfbGVuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWluX2xlbjsgaSArKykgewotICAgICAgICBpZiAoKHVpbnQ4X3QpbV9wRGF0YS0+bV9TdHJpbmdbaV0gPCBzdHIuR2V0QXQoaSkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHVpbnQ4X3QpbV9wRGF0YS0+bV9TdHJpbmdbaV0gPiBzdHIuR2V0QXQoaSkpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh0aGlzX2xlbiA8IHRoYXRfbGVuKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHRoaXNfbGVuID4gdGhhdF9sZW4pIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQorRlhfU1RSU0laRSBDRlhfQnl0ZVN0cmluZzo6RGVsZXRlKEZYX1NUUlNJWkUgbkluZGV4LCBGWF9TVFJTSVpFIG5Db3VudCkgeworICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIDA7Ci19Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpUcmltUmlnaHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6VGFyZ2V0cykKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMIHx8IGxwc3pUYXJnZXRzLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47CisgIH0KKyAgaWYgKG5JbmRleCA8IDApIHsKKyAgICBuSW5kZXggPSAwOworICB9CisgIEZYX1NUUlNJWkUgbk9sZExlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIGlmIChuQ291bnQgPiAwICYmIG5JbmRleCA8IG5PbGRMZW5ndGgpIHsKKyAgICBGWF9TVFJTSVpFIG1MZW5ndGggPSBuSW5kZXggKyBuQ291bnQ7CisgICAgaWYgKG1MZW5ndGggPj0gbk9sZExlbmd0aCkgeworICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5JbmRleDsKKyAgICAgIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwogICAgIH0KICAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBGWF9TVFJTSVpFIHBvcyA9IEdldExlbmd0aCgpOwotICAgIGlmIChwb3MgPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBGWF9TVFJTSVpFIGkgPSAwOwotICAgICAgICB3aGlsZSAoaSA8IGxwc3pUYXJnZXRzLkdldExlbmd0aCgpICYmIGxwc3pUYXJnZXRzW2ldICE9IG1fcERhdGEtPm1fU3RyaW5nW3BvcyAtIDFdKSB7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IGxwc3pUYXJnZXRzLkdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwb3MgLS07Ci0gICAgfQotICAgIGlmIChwb3MgPCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7Ci0gICAgICAgIG1fcERhdGEtPm1fU3RyaW5nW3Bvc10gPSAwOwotICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gcG9zOwotICAgIH0KKyAgICBpbnQgbkJ5dGVzVG9Db3B5ID0gbk9sZExlbmd0aCAtIG1MZW5ndGggKyAxOworICAgIEZYU1lTX21lbW1vdmUobV9wRGF0YS0+bV9TdHJpbmcgKyBuSW5kZXgsIG1fcERhdGEtPm1fU3RyaW5nICsgbUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIG5CeXRlc1RvQ29weSk7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5PbGRMZW5ndGggLSBuQ291bnQ7CisgIH0KKyAgcmV0dXJuIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CiB9Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpUcmltUmlnaHQoRlhfQ0hBUiBjaFRhcmdldCkKLXsKLSAgICBUcmltUmlnaHQoQ0ZYX0J5dGVTdHJpbmdDKGNoVGFyZ2V0KSk7Cit2b2lkIENGWF9CeXRlU3RyaW5nOjpDb25jYXRJblBsYWNlKEZYX1NUUlNJWkUgblNyY0xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbHBzelNyY0RhdGEpIHsKKyAgaWYgKG5TcmNMZW4gPT0gMCB8fCBscHN6U3JjRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5TcmNMZW4pOworICAgIGlmICghbV9wRGF0YSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3pTcmNEYXRhLCBuU3JjTGVuKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcERhdGEtPm1fblJlZnMgPiAxIHx8CisgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICsgblNyY0xlbiA+IG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoKSB7CisgICAgQ29uY2F0Q29weShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBtX3BEYXRhLT5tX1N0cmluZywgblNyY0xlbiwgbHBzelNyY0RhdGEpOworICB9IGVsc2UgeworICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIGxwc3pTcmNEYXRhLAorICAgICAgICAgICAgICAgICBuU3JjTGVuKTsKKyAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICs9IG5TcmNMZW47CisgICAgbV9wRGF0YS0+bV9TdHJpbmdbbV9wRGF0YS0+bV9uRGF0YUxlbmd0aF0gPSAwOworICB9CiB9Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpUcmltUmlnaHQoKQotewotICAgIFRyaW1SaWdodChGWF9CU1RSQygiXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwIikpOwordm9pZCBDRlhfQnl0ZVN0cmluZzo6Q29uY2F0Q29weShGWF9TVFJTSVpFIG5TcmMxTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBscHN6U3JjMURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgblNyYzJMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGxwc3pTcmMyRGF0YSkgeworICBpbnQgbk5ld0xlbiA9IG5TcmMxTGVuICsgblNyYzJMZW47CisgIGlmIChuTmV3TGVuIDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gRG9uJ3QgcmVsZWFzZSB1bnRpbCBkb25lIGNvcHlpbmcsIG1pZ2h0IGJlIG9uZSBvZiB0aGUgYXJndW1lbnRzLgorICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7CisgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbik7CisgIGlmIChtX3BEYXRhKSB7CisgICAgbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBscHN6U3JjMURhdGEsIG5TcmMxTGVuKTsKKyAgICBtZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcgKyBuU3JjMUxlbiwgbHBzelNyYzJEYXRhLCBuU3JjMkxlbik7CisgIH0KKyAgcE9sZERhdGEtPlJlbGVhc2UoKTsKIH0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlRyaW1MZWZ0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzelRhcmdldHMpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChscHN6VGFyZ2V0cy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBGWF9TVFJTSVpFIGxlbiA9IEdldExlbmd0aCgpOwotICAgIGlmIChsZW4gPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBwb3MgPSAwOwotICAgIHdoaWxlIChwb3MgPCBsZW4pIHsKLSAgICAgICAgRlhfU1RSU0laRSBpID0gMDsKLSAgICAgICAgd2hpbGUgKGkgPCBscHN6VGFyZ2V0cy5HZXRMZW5ndGgoKSAmJiBscHN6VGFyZ2V0c1tpXSAhPSBtX3BEYXRhLT5tX1N0cmluZ1twb3NdKSB7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IGxwc3pUYXJnZXRzLkdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwb3MgKys7Ci0gICAgfQotICAgIGlmIChwb3MpIHsKLSAgICAgICAgRlhfU1RSU0laRSBuRGF0YUxlbmd0aCA9IGxlbiAtIHBvczsKLSAgICAgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9TdHJpbmcgKyBwb3MsIChuRGF0YUxlbmd0aCArIDEpKnNpemVvZihGWF9DSEFSKSk7Ci0gICAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuRGF0YUxlbmd0aDsKLSAgICB9CitDRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6TWlkKEZYX1NUUlNJWkUgbkZpcnN0KSBjb25zdCB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgfQorICByZXR1cm4gTWlkKG5GaXJzdCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5GaXJzdCk7CiB9Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpUcmltTGVmdChGWF9DSEFSIGNoVGFyZ2V0KQotewotICAgIFRyaW1MZWZ0KENGWF9CeXRlU3RyaW5nQyhjaFRhcmdldCkpOworQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6Ok1pZChGWF9TVFJTSVpFIG5GaXJzdCwgRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0IHsKKyAgaWYgKG5GaXJzdCA8IDApIHsKKyAgICBuRmlyc3QgPSAwOworICB9CisgIGlmIChuQ291bnQgPCAwKSB7CisgICAgbkNvdW50ID0gMDsKKyAgfQorICBpZiAobkZpcnN0ICsgbkNvdW50ID4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgeworICAgIG5Db3VudCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuRmlyc3Q7CisgIH0KKyAgaWYgKG5GaXJzdCA+IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKKyAgICBuQ291bnQgPSAwOworICB9CisgIGlmIChuRmlyc3QgPT0gMCAmJiBuRmlyc3QgKyBuQ291bnQgPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBkZXN0OworICBBbGxvY0NvcHkoZGVzdCwgbkNvdW50LCBuRmlyc3QpOworICByZXR1cm4gZGVzdDsKIH0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlRyaW1MZWZ0KCkKLXsKLSAgICBUcmltTGVmdChGWF9CU1RSQygiXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwIikpOwordm9pZCBDRlhfQnl0ZVN0cmluZzo6QWxsb2NDb3B5KENGWF9CeXRlU3RyaW5nJiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgbkNvcHlMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuQ29weUluZGV4KSBjb25zdCB7CisgIC8vIHxGWF9TVFJTSVpFfCBpcyBjdXJyZW50bHkgdHlwZWRlZidkIGFzIGluIHxpbnR8LiBUT0RPKHBhbG1lcik6IEl0CisgIC8vIHNob3VsZCBiZSBhIHxzaXplX3R8LCBvciBhdCBsZWFzdCB1bnNpZ25lZC4KKyAgaWYgKG5Db3B5TGVuID09IDAgfHwgbkNvcHlMZW4gPCAwKSB7CisgICAgcmV0dXJuOworICB9CisgIEFTU0VSVChkZXN0Lm1fcERhdGEgPT0gTlVMTCk7CisgIGRlc3QubV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuQ29weUxlbik7CisgIGlmIChkZXN0Lm1fcERhdGEpIHsKKyAgICBGWFNZU19tZW1jcHkoZGVzdC5tX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9TdHJpbmcgKyBuQ29weUluZGV4LAorICAgICAgICAgICAgICAgICBuQ29weUxlbik7CisgIH0KIH0KLUZYX0RXT1JEIENGWF9CeXRlU3RyaW5nOjpHZXRJRChGWF9TVFJTSVpFIHN0YXJ0X3BvcykgY29uc3QKLXsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKCp0aGlzKS5HZXRJRChzdGFydF9wb3MpOwotfQotRlhfRFdPUkQgQ0ZYX0J5dGVTdHJpbmdDOjpHZXRJRChGWF9TVFJTSVpFIHN0YXJ0X3BvcykgY29uc3QKLXsKLSAgICBpZiAobV9MZW5ndGggPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKKyNkZWZpbmUgRk9SQ0VfQU5TSSAweDEwMDAwCisjZGVmaW5lIEZPUkNFX1VOSUNPREUgMHgyMDAwMAorI2RlZmluZSBGT1JDRV9JTlQ2NCAweDQwMDAwCit2b2lkIENGWF9CeXRlU3RyaW5nOjpGb3JtYXRWKGNvbnN0IEZYX0NIQVIqIGxwc3pGb3JtYXQsIHZhX2xpc3QgYXJnTGlzdCkgeworICB2YV9saXN0IGFyZ0xpc3RTYXZlOworI2lmIGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCFkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX0ZYX0NQVV8gPT0gX0ZYX1g2NF8gfHwgX0ZYX0NQVV8gPT0gX0ZYX0lBNjRfIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRlhfQ1BVXyA9PSBfRlhfQVJNNjRfKSkgfHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCisgIHZhX2NvcHkoYXJnTGlzdFNhdmUsIGFyZ0xpc3QpOworI2Vsc2UKKyAgYXJnTGlzdFNhdmUgPSBhcmdMaXN0OworI2VuZGlmCisgIGludCBuTWF4TGVuID0gMDsKKyAgZm9yIChjb25zdCBGWF9DSEFSKiBscHN6ID0gbHBzekZvcm1hdDsgKmxwc3ogIT0gMDsgbHBzeisrKSB7CisgICAgaWYgKCpscHN6ICE9ICclJyB8fCAqKGxwc3ogPSBscHN6ICsgMSkgPT0gJyUnKSB7CisgICAgICBuTWF4TGVuICs9IEZYU1lTX3N0cmxlbihscHN6KTsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAoc3RhcnRfcG9zIDwgMCB8fCBzdGFydF9wb3MgPj0gbV9MZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaW50IG5JdGVtTGVuID0gMDsKKyAgICBpbnQgbldpZHRoID0gMDsKKyAgICBmb3IgKDsgKmxwc3ogIT0gMDsgbHBzeisrKSB7CisgICAgICBpZiAoKmxwc3ogPT0gJyMnKSB7CisgICAgICAgIG5NYXhMZW4gKz0gMjsKKyAgICAgIH0gZWxzZSBpZiAoKmxwc3ogPT0gJyonKSB7CisgICAgICAgIG5XaWR0aCA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICAgfSBlbHNlIGlmICgqbHBzeiA9PSAnLScgfHwgKmxwc3ogPT0gJysnIHx8ICpscHN6ID09ICcwJyB8fCAqbHBzeiA9PSAnICcpCisgICAgICAgIDsKKyAgICAgIGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgRlhfRFdPUkQgc3RyaWQgPSAwOwotICAgIGlmIChzdGFydF9wb3MgKyA0ID4gbV9MZW5ndGgpIHsKLSAgICAgICAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbV9MZW5ndGggLSBzdGFydF9wb3M7IGkgKyspIHsKLSAgICAgICAgICAgIHN0cmlkID0gc3RyaWQgKiAyNTYgKyBtX1B0cltzdGFydF9wb3MgKyBpXTsKLSAgICAgICAgfQotICAgICAgICBzdHJpZCA9IHN0cmlkIDw8ICgoNCAtIG1fTGVuZ3RoICsgc3RhcnRfcG9zKSAqIDgpOworICAgIGlmIChuV2lkdGggPT0gMCkgeworICAgICAgbldpZHRoID0gRlhTWVNfYXRvaShscHN6KTsKKyAgICAgIGZvciAoOyAoKmxwc3opID49ICcwJyAmJiAoKmxwc3opIDw9ICc5JzsgbHBzeisrKQorICAgICAgICA7CisgICAgfQorICAgIGlmIChuV2lkdGggPCAwIHx8IG5XaWR0aCA+IDEyOCAqIDEwMjQpIHsKKyAgICAgIGxwc3pGb3JtYXQgPSAiQmFkIHdpZHRoIjsKKyAgICAgIG5NYXhMZW4gPSAxMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpbnQgblByZWNpc2lvbiA9IDA7CisgICAgaWYgKCpscHN6ID09ICcuJykgeworICAgICAgbHBzeisrOworICAgICAgaWYgKCpscHN6ID09ICcqJykgeworICAgICAgICBuUHJlY2lzaW9uID0gdmFfYXJnKGFyZ0xpc3QsIGludCk7CisgICAgICAgIGxwc3orKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5QcmVjaXNpb24gPSBGWFNZU19hdG9pKGxwc3opOworICAgICAgICBmb3IgKDsgKCpscHN6KSA+PSAnMCcgJiYgKCpscHN6KSA8PSAnOSc7IGxwc3orKykKKyAgICAgICAgICA7CisgICAgICB9CisgICAgfQorICAgIGlmIChuUHJlY2lzaW9uIDwgMCB8fCBuUHJlY2lzaW9uID4gMTI4ICogMTAyNCkgeworICAgICAgbHBzekZvcm1hdCA9ICJCYWQgcHJlY2lzaW9uIjsKKyAgICAgIG5NYXhMZW4gPSAxNDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpbnQgbk1vZGlmaWVyID0gMDsKKyAgICBpZiAoRlhTWVNfc3RybmNtcChscHN6LCAiSTY0IiwgMykgPT0gMCkgeworICAgICAgbHBzeiArPSAzOworICAgICAgbk1vZGlmaWVyID0gRk9SQ0VfSU5UNjQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgICAgICBzdHJpZCA9IHN0cmlkICogMjU2ICsgbV9QdHJbc3RhcnRfcG9zICsgaV07Ci0gICAgICAgIH0KKyAgICAgIHN3aXRjaCAoKmxwc3opIHsKKyAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgbk1vZGlmaWVyID0gRk9SQ0VfQU5TSTsKKyAgICAgICAgICBscHN6Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2wnOgorICAgICAgICAgIG5Nb2RpZmllciA9IEZPUkNFX1VOSUNPREU7CisgICAgICAgICAgbHBzeisrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgY2FzZSAnTic6CisgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgIGxwc3orKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHN0cmlkOworICAgIHN3aXRjaCAoKmxwc3ogfCBuTW9kaWZpZXIpIHsKKyAgICAgIGNhc2UgJ2MnOgorICAgICAgY2FzZSAnQyc6CisgICAgICAgIG5JdGVtTGVuID0gMjsKKyAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnYycgfCBGT1JDRV9BTlNJOgorICAgICAgY2FzZSAnQycgfCBGT1JDRV9BTlNJOgorICAgICAgICBuSXRlbUxlbiA9IDI7CisgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2MnIHwgRk9SQ0VfVU5JQ09ERToKKyAgICAgIGNhc2UgJ0MnIHwgRk9SQ0VfVU5JQ09ERToKKyAgICAgICAgbkl0ZW1MZW4gPSAyOworICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdzJzogeworICAgICAgICBjb25zdCBGWF9DSEFSKiBwc3RyTmV4dEFyZyA9IHZhX2FyZyhhcmdMaXN0LCBjb25zdCBGWF9DSEFSKik7CisgICAgICAgIGlmIChwc3RyTmV4dEFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSA2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfc3RybGVuKHBzdHJOZXh0QXJnKTsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAnUyc6IHsKKyAgICAgICAgRlhfV0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIEZYX1dDSEFSKik7CisgICAgICAgIGlmIChwc3RyTmV4dEFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSA2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfd2NzbGVuKHBzdHJOZXh0QXJnKTsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAncycgfCBGT1JDRV9BTlNJOgorICAgICAgY2FzZSAnUycgfCBGT1JDRV9BTlNJOiB7CisgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIGNvbnN0IEZYX0NIQVIqKTsKKyAgICAgICAgaWYgKHBzdHJOZXh0QXJnID09IE5VTEwpIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IDY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSBGWFNZU19zdHJsZW4ocHN0ck5leHRBcmcpOworICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlICdzJyB8IEZPUkNFX1VOSUNPREU6CisgICAgICBjYXNlICdTJyB8IEZPUkNFX1VOSUNPREU6IHsKKyAgICAgICAgRlhfV0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIEZYX1dDSEFSKik7CisgICAgICAgIGlmIChwc3RyTmV4dEFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSA2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfd2NzbGVuKHBzdHJOZXh0QXJnKTsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgIH0KKyAgICBpZiAobkl0ZW1MZW4gIT0gMCkgeworICAgICAgaWYgKG5QcmVjaXNpb24gIT0gMCAmJiBuSXRlbUxlbiA+IG5QcmVjaXNpb24pIHsKKyAgICAgICAgbkl0ZW1MZW4gPSBuUHJlY2lzaW9uOworICAgICAgfQorICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoKSB7CisgICAgICAgIG5JdGVtTGVuID0gbldpZHRoOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKCpscHN6KSB7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgaWYgKG5Nb2RpZmllciAmIEZPUkNFX0lOVDY0KSB7CisgICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50NjRfdCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICAgICAgIH0KKyAgICAgICAgICBuSXRlbUxlbiA9IDMyOworICAgICAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCArIG5QcmVjaXNpb24pIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gbldpZHRoICsgblByZWNpc2lvbjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgY2FzZSAnZSc6CisgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICBjYXNlICdnJzoKKyAgICAgICAgY2FzZSAnRyc6CisgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGRvdWJsZSk7CisgICAgICAgICAgbkl0ZW1MZW4gPSAxMjg7CisgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoICsgblByZWNpc2lvbikgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGggKyBuUHJlY2lzaW9uOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgaWYgKG5XaWR0aCArIG5QcmVjaXNpb24gPiAxMDApIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gblByZWNpc2lvbiArIG5XaWR0aCArIDEyODsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciBwc3pUZW1wWzI1Nl07CisgICAgICAgICAgICBkb3VibGUgZiA9IHZhX2FyZyhhcmdMaXN0LCBkb3VibGUpOworICAgICAgICAgICAgbWVtc2V0KHBzelRlbXAsIDAsIHNpemVvZihwc3pUZW1wKSk7CisgICAgICAgICAgICBGWFNZU19zbnByaW50Zihwc3pUZW1wLCBzaXplb2YocHN6VGVtcCkgLSAxLCAiJSouKmYiLCBuV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuUHJlY2lzaW9uICsgNiwgZik7CisgICAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3pUZW1wKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCB2b2lkKik7CisgICAgICAgICAgbkl0ZW1MZW4gPSAzMjsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50Kik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG5NYXhMZW4gKz0gbkl0ZW1MZW47CisgIH0KKyAgbk1heExlbiArPSAzMjsgIC8vIEZ1ZGdlIGZhY3Rvci4KKyAgR2V0QnVmZmVyKG5NYXhMZW4pOworICBpZiAobV9wRGF0YSkgeworICAgIG1lbXNldChtX3BEYXRhLT5tX1N0cmluZywgMCwgbk1heExlbik7CisgICAgRlhTWVNfdnNucHJpbnRmKG1fcERhdGEtPm1fU3RyaW5nLCBuTWF4TGVuIC0gMSwgbHBzekZvcm1hdCwgYXJnTGlzdFNhdmUpOworICAgIFJlbGVhc2VCdWZmZXIoKTsKKyAgfQorICB2YV9lbmQoYXJnTGlzdFNhdmUpOwogfQotRlhfU1RSU0laRSBGWF9mdG9hKEZYX0ZMT0FUIGQsIEZYX0NIQVIqIGJ1ZikKLXsKLSAgICBidWZbMF0gPSAnMCc7Ci0gICAgYnVmWzFdID0gJ1wwJzsKLSAgICBpZiAoZCA9PSAwLjBmKSB7Ci0gICAgICAgIHJldHVybiAxOwordm9pZCBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0KGNvbnN0IEZYX0NIQVIqIGxwc3pGb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFyZ0xpc3Q7CisgIHZhX3N0YXJ0KGFyZ0xpc3QsIGxwc3pGb3JtYXQpOworICBGb3JtYXRWKGxwc3pGb3JtYXQsIGFyZ0xpc3QpOworICB2YV9lbmQoYXJnTGlzdCk7Cit9CitGWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpJbnNlcnQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX0NIQVIgY2gpIHsKKyAgQ29weUJlZm9yZVdyaXRlKCk7CisgIGlmIChuSW5kZXggPCAwKSB7CisgICAgbkluZGV4ID0gMDsKKyAgfQorICBGWF9TVFJTSVpFIG5OZXdMZW5ndGggPSBtX3BEYXRhID8gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA6IDA7CisgIGlmIChuSW5kZXggPiBuTmV3TGVuZ3RoKSB7CisgICAgbkluZGV4ID0gbk5ld0xlbmd0aDsKKyAgfQorICBuTmV3TGVuZ3RoKys7CisgIGlmIChtX3BEYXRhID09IE5VTEwgfHwgbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPCBuTmV3TGVuZ3RoKSB7CisgICAgU3RyaW5nRGF0YSogcE9sZERhdGEgPSBtX3BEYXRhOworICAgIGNvbnN0IEZYX0NIQVIqIHBzdHIgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5OZXdMZW5ndGgpOworICAgIGlmICghbV9wRGF0YSkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7Ci0gICAgaWYgKGQgPCAwKSB7Ci0gICAgICAgIGJOZWdhdGl2ZSA9IFRSVUU7Ci0gICAgICAgIGQgPSAtZDsKKyAgICBpZiAocE9sZERhdGEgIT0gTlVMTCkgeworICAgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZywgcHN0ciwgKHBPbGREYXRhLT5tX25EYXRhTGVuZ3RoICsgMSkpOworICAgICAgcE9sZERhdGEtPlJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9wRGF0YS0+bV9TdHJpbmdbMF0gPSAwOwogICAgIH0KLSAgICBpbnQgc2NhbGUgPSAxOwotICAgIGludCBzY2FsZWQgPSBGWFNZU19yb3VuZChkKTsKLSAgICB3aGlsZSAoc2NhbGVkIDwgMTAwMDAwKSB7Ci0gICAgICAgIGlmIChzY2FsZSA9PSAxMDAwMDAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzY2FsZSAqPSAxMDsKLSAgICAgICAgc2NhbGVkID0gRlhTWVNfcm91bmQoZCAqIHNjYWxlKTsKKyAgfQorICBGWFNZU19tZW1tb3ZlKG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4ICsgMSwgbV9wRGF0YS0+bV9TdHJpbmcgKyBuSW5kZXgsCisgICAgICAgICAgICAgICAgKG5OZXdMZW5ndGggLSBuSW5kZXgpKTsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA9IGNoOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk5ld0xlbmd0aDsKKyAgcmV0dXJuIG5OZXdMZW5ndGg7Cit9CitDRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6UmlnaHQoRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0IHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICB9CisgIGlmIChuQ291bnQgPCAwKSB7CisgICAgbkNvdW50ID0gMDsKKyAgfQorICBpZiAobkNvdW50ID49IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgZGVzdDsKKyAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5Db3VudCk7CisgIHJldHVybiBkZXN0OworfQorQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6OkxlZnQoRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0IHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICB9CisgIGlmIChuQ291bnQgPCAwKSB7CisgICAgbkNvdW50ID0gMDsKKyAgfQorICBpZiAobkNvdW50ID49IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgZGVzdDsKKyAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgMCk7CisgIHJldHVybiBkZXN0OworfQorRlhfU1RSU0laRSBDRlhfQnl0ZVN0cmluZzo6RmluZChGWF9DSEFSIGNoLCBGWF9TVFJTSVpFIG5TdGFydCkgY29uc3QgeworICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIEZYX1NUUlNJWkUgbkxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIGlmIChuU3RhcnQgPj0gbkxlbmd0aCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBjb25zdCBGWF9DSEFSKiBscHN6ID0gRlhTWVNfc3RyY2hyKG1fcERhdGEtPm1fU3RyaW5nICsgblN0YXJ0LCBjaCk7CisgIHJldHVybiAobHBzeiA9PSBOVUxMKSA/IC0xIDogKGludCkobHBzeiAtIG1fcERhdGEtPm1fU3RyaW5nKTsKK30KK0ZYX1NUUlNJWkUgQ0ZYX0J5dGVTdHJpbmc6OlJldmVyc2VGaW5kKEZYX0NIQVIgY2gpIGNvbnN0IHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBGWF9TVFJTSVpFIG5MZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICB3aGlsZSAobkxlbmd0aCkgeworICAgIGlmIChtX3BEYXRhLT5tX1N0cmluZ1tuTGVuZ3RoIC0gMV0gPT0gY2gpIHsKKyAgICAgIHJldHVybiBuTGVuZ3RoIC0gMTsKICAgICB9Ci0gICAgaWYgKHNjYWxlZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAxOworICAgIG5MZW5ndGgtLTsKKyAgfQorICByZXR1cm4gLTE7Cit9Citjb25zdCBGWF9DSEFSKiBGWF9zdHJzdHIoY29uc3QgRlhfQ0hBUiogc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBzdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4yKSB7CisgIGlmIChsZW4yID4gbGVuMSB8fCBsZW4yID09IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjb25zdCBGWF9DSEFSKiBlbmRfcHRyID0gc3RyMSArIGxlbjEgLSBsZW4yOworICB3aGlsZSAoc3RyMSA8PSBlbmRfcHRyKSB7CisgICAgaW50IGkgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICBpZiAoc3RyMVtpXSAhPSBzdHIyW2ldKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaSsrOworICAgICAgaWYgKGkgPT0gbGVuMikgeworICAgICAgICByZXR1cm4gc3RyMTsKKyAgICAgIH0KICAgICB9Ci0gICAgY2hhciBidWYyWzMyXTsKLSAgICBpbnQgYnVmX3NpemUgPSAwOwotICAgIGlmIChiTmVnYXRpdmUpIHsKLSAgICAgICAgYnVmW2J1Zl9zaXplKytdID0gJy0nOworICAgIHN0cjErKzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KK0ZYX1NUUlNJWkUgQ0ZYX0J5dGVTdHJpbmc6OkZpbmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6U3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5TdGFydCkgY29uc3QgeworICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIEZYX1NUUlNJWkUgbkxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIGlmIChuU3RhcnQgPiBuTGVuZ3RoKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNvbnN0IEZYX0NIQVIqIGxwc3ogPQorICAgICAgRlhfc3Ryc3RyKG1fcERhdGEtPm1fU3RyaW5nICsgblN0YXJ0LCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gblN0YXJ0LAorICAgICAgICAgICAgICAgIGxwc3pTdWIuR2V0Q1N0cigpLCBscHN6U3ViLkdldExlbmd0aCgpKTsKKyAgcmV0dXJuIChscHN6ID09IE5VTEwpID8gLTEgOiAoaW50KShscHN6IC0gbV9wRGF0YS0+bV9TdHJpbmcpOworfQordm9pZCBDRlhfQnl0ZVN0cmluZzo6TWFrZUxvd2VyKCkgeworICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYU1lTX3N0cmx3cihtX3BEYXRhLT5tX1N0cmluZyk7Cit9Cit2b2lkIENGWF9CeXRlU3RyaW5nOjpNYWtlVXBwZXIoKSB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ29weUJlZm9yZVdyaXRlKCk7CisgIGlmIChHZXRMZW5ndGgoKSA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhTWVNfc3RydXByKG1fcERhdGEtPm1fU3RyaW5nKTsKK30KK0ZYX1NUUlNJWkUgQ0ZYX0J5dGVTdHJpbmc6OlJlbW92ZShGWF9DSEFSIGNoUmVtb3ZlKSB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDb3B5QmVmb3JlV3JpdGUoKTsKKyAgaWYgKEdldExlbmd0aCgpIDwgMSkgeworICAgIHJldHVybiAwOworICB9CisgIEZYX0NIQVIqIHBzdHJTb3VyY2UgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgRlhfQ0hBUiogcHN0ckRlc3QgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgRlhfQ0hBUiogcHN0ckVuZCA9IG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgd2hpbGUgKHBzdHJTb3VyY2UgPCBwc3RyRW5kKSB7CisgICAgaWYgKCpwc3RyU291cmNlICE9IGNoUmVtb3ZlKSB7CisgICAgICAqcHN0ckRlc3QgPSAqcHN0clNvdXJjZTsKKyAgICAgIHBzdHJEZXN0Kys7CiAgICAgfQotICAgIGludCBpID0gc2NhbGVkIC8gc2NhbGU7Ci0gICAgRlhTWVNfaXRvYShpLCBidWYyLCAxMCk7Ci0gICAgRlhfU1RSU0laRSBsZW4gPSBGWFNZU19zdHJsZW4oYnVmMik7Ci0gICAgRlhTWVNfbWVtY3B5KGJ1ZiArIGJ1Zl9zaXplLCBidWYyLCBsZW4pOwotICAgIGJ1Zl9zaXplICs9IGxlbjsKLSAgICBpbnQgZnJhY3Rpb24gPSBzY2FsZWQgJSBzY2FsZTsKLSAgICBpZiAoZnJhY3Rpb24gPT0gMCkgewotICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgcHN0clNvdXJjZSsrOworICB9CisgICpwc3RyRGVzdCA9IDA7CisgIEZYX1NUUlNJWkUgbkNvdW50ID0gKEZYX1NUUlNJWkUpKHBzdHJTb3VyY2UgLSBwc3RyRGVzdCk7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLT0gbkNvdW50OworICByZXR1cm4gbkNvdW50OworfQorRlhfU1RSU0laRSBDRlhfQnl0ZVN0cmluZzo6UmVwbGFjZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzek5ldykgeworICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGxwc3pPbGQuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhfU1RSU0laRSBuU291cmNlTGVuID0gbHBzek9sZC5HZXRMZW5ndGgoKTsKKyAgRlhfU1RSU0laRSBuUmVwbGFjZW1lbnRMZW4gPSBscHN6TmV3LkdldExlbmd0aCgpOworICBGWF9TVFJTSVpFIG5Db3VudCA9IDA7CisgIGNvbnN0IEZYX0NIQVIqIHBTdGFydCA9IG1fcERhdGEtPm1fU3RyaW5nOworICBGWF9DSEFSKiBwRW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICB3aGlsZSAoMSkgeworICAgIGNvbnN0IEZYX0NIQVIqIHBUYXJnZXQgPSBGWF9zdHJzdHIocFN0YXJ0LCAoRlhfU1RSU0laRSkocEVuZCAtIHBTdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHN6T2xkLkdldENTdHIoKSwgblNvdXJjZUxlbik7CisgICAgaWYgKHBUYXJnZXQgPT0gTlVMTCkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGJ1ZltidWZfc2l6ZSsrXSA9ICcuJzsKLSAgICBzY2FsZSAvPSAxMDsKLSAgICB3aGlsZSAoZnJhY3Rpb24pIHsKLSAgICAgICAgYnVmW2J1Zl9zaXplKytdID0gJzAnICsgZnJhY3Rpb24gLyBzY2FsZTsKLSAgICAgICAgZnJhY3Rpb24gJT0gc2NhbGU7Ci0gICAgICAgIHNjYWxlIC89IDEwOworICAgIG5Db3VudCsrOworICAgIHBTdGFydCA9IHBUYXJnZXQgKyBuU291cmNlTGVuOworICB9CisgIGlmIChuQ291bnQgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIEZYX1NUUlNJWkUgbk5ld0xlbmd0aCA9CisgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICsgKG5SZXBsYWNlbWVudExlbiAtIG5Tb3VyY2VMZW4pICogbkNvdW50OworICBpZiAobk5ld0xlbmd0aCA9PSAwKSB7CisgICAgRW1wdHkoKTsKKyAgICByZXR1cm4gbkNvdW50OworICB9CisgIFN0cmluZ0RhdGEqIHBOZXdEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5OZXdMZW5ndGgpOworICBpZiAoIXBOZXdEYXRhKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcFN0YXJ0ID0gbV9wRGF0YS0+bV9TdHJpbmc7CisgIEZYX0NIQVIqIHBEZXN0ID0gcE5ld0RhdGEtPm1fU3RyaW5nOworICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgIGNvbnN0IEZYX0NIQVIqIHBUYXJnZXQgPSBGWF9zdHJzdHIocFN0YXJ0LCAoRlhfU1RSU0laRSkocEVuZCAtIHBTdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHN6T2xkLkdldENTdHIoKSwgblNvdXJjZUxlbik7CisgICAgRlhTWVNfbWVtY3B5KHBEZXN0LCBwU3RhcnQsIHBUYXJnZXQgLSBwU3RhcnQpOworICAgIHBEZXN0ICs9IHBUYXJnZXQgLSBwU3RhcnQ7CisgICAgRlhTWVNfbWVtY3B5KHBEZXN0LCBscHN6TmV3LkdldENTdHIoKSwgbHBzek5ldy5HZXRMZW5ndGgoKSk7CisgICAgcERlc3QgKz0gbHBzek5ldy5HZXRMZW5ndGgoKTsKKyAgICBwU3RhcnQgPSBwVGFyZ2V0ICsgblNvdXJjZUxlbjsKKyAgfQorICBGWFNZU19tZW1jcHkocERlc3QsIHBTdGFydCwgcEVuZCAtIHBTdGFydCk7CisgIG1fcERhdGEtPlJlbGVhc2UoKTsKKyAgbV9wRGF0YSA9IHBOZXdEYXRhOworICByZXR1cm4gbkNvdW50OworfQordm9pZCBDRlhfQnl0ZVN0cmluZzo6U2V0QXQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX0NIQVIgY2gpIHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBGWFNZU19hc3NlcnQobkluZGV4ID49IDApOworICBGWFNZU19hc3NlcnQobkluZGV4IDwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdID0gY2g7Cit9CitDRlhfV2lkZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6VVRGOERlY29kZSgpIGNvbnN0IHsKKyAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7CisgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IEdldExlbmd0aCgpOyBpKyspIHsKKyAgICBkZWNvZGVyLklucHV0KCh1aW50OF90KW1fcERhdGEtPm1fU3RyaW5nW2ldKTsKKyAgfQorICByZXR1cm4gZGVjb2Rlci5HZXRSZXN1bHQoKTsKK30KK0NGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShjb25zdCBGWF9XQ0hBUiogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgbGVuKSB7CisgIGlmIChsZW4gPCAwKSB7CisgICAgbGVuID0gRlhTWVNfd2NzbGVuKHN0cik7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnN0cjsKKyAgYnN0ci5Db252ZXJ0RnJvbShDRlhfV2lkZVN0cmluZyhzdHIsIGxlbikpOworICByZXR1cm4gYnN0cjsKK30KK0NGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSB7CisgIHJldHVybiBGcm9tVW5pY29kZShzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkNvbnZlcnRGcm9tKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ2hhck1hcCogcENoYXJNYXApIHsKKyAgaWYgKHBDaGFyTWFwID09IE5VTEwpIHsKKyAgICBwQ2hhck1hcCA9IENGWF9DaGFyTWFwOjpHZXREZWZhdWx0TWFwcGVyKCk7CisgIH0KKyAgKnRoaXMgPSAoKnBDaGFyTWFwLT5tX0dldEJ5dGVTdHJpbmcpKHBDaGFyTWFwLCBzdHIpOworfQoraW50IENGWF9CeXRlU3RyaW5nOjpDb21wYXJlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdCB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gc3RyLklzRW1wdHkoKSA/IDAgOiAtMTsKKyAgfQorICBpbnQgdGhpc19sZW4gPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBpbnQgdGhhdF9sZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIGludCBtaW5fbGVuID0gdGhpc19sZW4gPCB0aGF0X2xlbiA/IHRoaXNfbGVuIDogdGhhdF9sZW47CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWluX2xlbjsgaSsrKSB7CisgICAgaWYgKCh1aW50OF90KW1fcERhdGEtPm1fU3RyaW5nW2ldIDwgc3RyLkdldEF0KGkpKSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQorICAgIGlmICgodWludDhfdCltX3BEYXRhLT5tX1N0cmluZ1tpXSA+IHN0ci5HZXRBdChpKSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIGlmICh0aGlzX2xlbiA8IHRoYXRfbGVuKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICh0aGlzX2xlbiA+IHRoYXRfbGVuKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9Cit2b2lkIENGWF9CeXRlU3RyaW5nOjpUcmltUmlnaHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6VGFyZ2V0cykgeworICBpZiAobV9wRGF0YSA9PSBOVUxMIHx8IGxwc3pUYXJnZXRzLklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDb3B5QmVmb3JlV3JpdGUoKTsKKyAgRlhfU1RSU0laRSBwb3MgPSBHZXRMZW5ndGgoKTsKKyAgaWYgKHBvcyA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgd2hpbGUgKHBvcykgeworICAgIEZYX1NUUlNJWkUgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBscHN6VGFyZ2V0cy5HZXRMZW5ndGgoKSAmJgorICAgICAgICAgICBscHN6VGFyZ2V0c1tpXSAhPSBtX3BEYXRhLT5tX1N0cmluZ1twb3MgLSAxXSkgeworICAgICAgaSsrOworICAgIH0KKyAgICBpZiAoaSA9PSBscHN6VGFyZ2V0cy5HZXRMZW5ndGgoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcy0tOworICB9CisgIGlmIChwb3MgPCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7CisgICAgbV9wRGF0YS0+bV9TdHJpbmdbcG9zXSA9IDA7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IHBvczsKKyAgfQorfQordm9pZCBDRlhfQnl0ZVN0cmluZzo6VHJpbVJpZ2h0KEZYX0NIQVIgY2hUYXJnZXQpIHsKKyAgVHJpbVJpZ2h0KENGWF9CeXRlU3RyaW5nQyhjaFRhcmdldCkpOworfQordm9pZCBDRlhfQnl0ZVN0cmluZzo6VHJpbVJpZ2h0KCkgeworICBUcmltUmlnaHQoRlhfQlNUUkMoIlx4MDlceDBhXHgwYlx4MGNceDBkXHgyMCIpKTsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlRyaW1MZWZ0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzelRhcmdldHMpIHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobHBzelRhcmdldHMuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBGWF9TVFJTSVpFIGxlbiA9IEdldExlbmd0aCgpOworICBpZiAobGVuIDwgMSkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9TVFJTSVpFIHBvcyA9IDA7CisgIHdoaWxlIChwb3MgPCBsZW4pIHsKKyAgICBGWF9TVFJTSVpFIGkgPSAwOworICAgIHdoaWxlIChpIDwgbHBzelRhcmdldHMuR2V0TGVuZ3RoKCkgJiYKKyAgICAgICAgICAgbHBzelRhcmdldHNbaV0gIT0gbV9wRGF0YS0+bV9TdHJpbmdbcG9zXSkgeworICAgICAgaSsrOworICAgIH0KKyAgICBpZiAoaSA9PSBscHN6VGFyZ2V0cy5HZXRMZW5ndGgoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcysrOworICB9CisgIGlmIChwb3MpIHsKKyAgICBGWF9TVFJTSVpFIG5EYXRhTGVuZ3RoID0gbGVuIC0gcG9zOworICAgIEZYU1lTX21lbW1vdmUobV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fU3RyaW5nICsgcG9zLAorICAgICAgICAgICAgICAgICAgKG5EYXRhTGVuZ3RoICsgMSkgKiBzaXplb2YoRlhfQ0hBUikpOworICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuRGF0YUxlbmd0aDsKKyAgfQorfQordm9pZCBDRlhfQnl0ZVN0cmluZzo6VHJpbUxlZnQoRlhfQ0hBUiBjaFRhcmdldCkgeworICBUcmltTGVmdChDRlhfQnl0ZVN0cmluZ0MoY2hUYXJnZXQpKTsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlRyaW1MZWZ0KCkgeworICBUcmltTGVmdChGWF9CU1RSQygiXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwIikpOworfQorRlhfRFdPUkQgQ0ZYX0J5dGVTdHJpbmc6OkdldElEKEZYX1NUUlNJWkUgc3RhcnRfcG9zKSBjb25zdCB7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKnRoaXMpLkdldElEKHN0YXJ0X3Bvcyk7Cit9CitGWF9EV09SRCBDRlhfQnl0ZVN0cmluZ0M6OkdldElEKEZYX1NUUlNJWkUgc3RhcnRfcG9zKSBjb25zdCB7CisgIGlmIChtX0xlbmd0aCA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHN0YXJ0X3BvcyA8IDAgfHwgc3RhcnRfcG9zID49IG1fTGVuZ3RoKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhfRFdPUkQgc3RyaWQgPSAwOworICBpZiAoc3RhcnRfcG9zICsgNCA+IG1fTGVuZ3RoKSB7CisgICAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbV9MZW5ndGggLSBzdGFydF9wb3M7IGkrKykgeworICAgICAgc3RyaWQgPSBzdHJpZCAqIDI1NiArIG1fUHRyW3N0YXJ0X3BvcyArIGldOworICAgIH0KKyAgICBzdHJpZCA9IHN0cmlkIDw8ICgoNCAtIG1fTGVuZ3RoICsgc3RhcnRfcG9zKSAqIDgpOworICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBzdHJpZCA9IHN0cmlkICogMjU2ICsgbV9QdHJbc3RhcnRfcG9zICsgaV07CisgICAgfQorICB9CisgIHJldHVybiBzdHJpZDsKK30KK0ZYX1NUUlNJWkUgRlhfZnRvYShGWF9GTE9BVCBkLCBGWF9DSEFSKiBidWYpIHsKKyAgYnVmWzBdID0gJzAnOworICBidWZbMV0gPSAnXDAnOworICBpZiAoZCA9PSAwLjBmKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKKyAgaWYgKGQgPCAwKSB7CisgICAgYk5lZ2F0aXZlID0gVFJVRTsKKyAgICBkID0gLWQ7CisgIH0KKyAgaW50IHNjYWxlID0gMTsKKyAgaW50IHNjYWxlZCA9IEZYU1lTX3JvdW5kKGQpOworICB3aGlsZSAoc2NhbGVkIDwgMTAwMDAwKSB7CisgICAgaWYgKHNjYWxlID09IDEwMDAwMDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzY2FsZSAqPSAxMDsKKyAgICBzY2FsZWQgPSBGWFNZU19yb3VuZChkICogc2NhbGUpOworICB9CisgIGlmIChzY2FsZWQgPT0gMCkgeworICAgIHJldHVybiAxOworICB9CisgIGNoYXIgYnVmMlszMl07CisgIGludCBidWZfc2l6ZSA9IDA7CisgIGlmIChiTmVnYXRpdmUpIHsKKyAgICBidWZbYnVmX3NpemUrK10gPSAnLSc7CisgIH0KKyAgaW50IGkgPSBzY2FsZWQgLyBzY2FsZTsKKyAgRlhTWVNfaXRvYShpLCBidWYyLCAxMCk7CisgIEZYX1NUUlNJWkUgbGVuID0gRlhTWVNfc3RybGVuKGJ1ZjIpOworICBGWFNZU19tZW1jcHkoYnVmICsgYnVmX3NpemUsIGJ1ZjIsIGxlbik7CisgIGJ1Zl9zaXplICs9IGxlbjsKKyAgaW50IGZyYWN0aW9uID0gc2NhbGVkICUgc2NhbGU7CisgIGlmIChmcmFjdGlvbiA9PSAwKSB7CiAgICAgcmV0dXJuIGJ1Zl9zaXplOworICB9CisgIGJ1ZltidWZfc2l6ZSsrXSA9ICcuJzsKKyAgc2NhbGUgLz0gMTA7CisgIHdoaWxlIChmcmFjdGlvbikgeworICAgIGJ1ZltidWZfc2l6ZSsrXSA9ICcwJyArIGZyYWN0aW9uIC8gc2NhbGU7CisgICAgZnJhY3Rpb24gJT0gc2NhbGU7CisgICAgc2NhbGUgLz0gMTA7CisgIH0KKyAgcmV0dXJuIGJ1Zl9zaXplOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEZsb2F0KEZYX0ZMT0FUIGQsIGludCBwcmVjaXNpb24pCi17Ci0gICAgRlhfQ0hBUiBidWZbMzJdOwotICAgIEZYX1NUUlNJWkUgbGVuID0gRlhfZnRvYShkLCBidWYpOwotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYsIGxlbik7CitDRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0RmxvYXQoRlhfRkxPQVQgZCwgaW50IHByZWNpc2lvbikgeworICBGWF9DSEFSIGJ1ZlszMl07CisgIEZYX1NUUlNJWkUgbGVuID0gRlhfZnRvYShkLCBidWYpOworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoYnVmLCBsZW4pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnN0cmluZ191bml0dGVzdC5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nX3VuaXR0ZXN0LmNwcAppbmRleCBmODY1NjAyLi4zNzc5Mzk3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nX3VuaXR0ZXN0LmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nX3VuaXR0ZXN0LmNwcApAQCAtNywyNDYgKzcsMjQ2IEBACiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKIFRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdPcGVyYXRvclN1YnNjcmlwdCkgewotICAgIC8vIENGWF9CeXRlU3RyaW5nIGluY2x1ZGVzIHRoZSBOVUwgdGVybWluYXRvciBmb3Igbm9uLWVtcHR5IHN0cmluZ3MuCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYWJjKCJhYmMiKTsKLSAgICBFWFBFQ1RfRVEoJ2EnLCBhYmNbMF0pOwotICAgIEVYUEVDVF9FUSgnYicsIGFiY1sxXSk7Ci0gICAgRVhQRUNUX0VRKCdjJywgYWJjWzJdKTsKLSAgICBFWFBFQ1RfRVEoMCwgYWJjWzNdKTsKKyAgLy8gQ0ZYX0J5dGVTdHJpbmcgaW5jbHVkZXMgdGhlIE5VTCB0ZXJtaW5hdG9yIGZvciBub24tZW1wdHkgc3RyaW5ncy4KKyAgQ0ZYX0J5dGVTdHJpbmcgYWJjKCJhYmMiKTsKKyAgRVhQRUNUX0VRKCdhJywgYWJjWzBdKTsKKyAgRVhQRUNUX0VRKCdiJywgYWJjWzFdKTsKKyAgRVhQRUNUX0VRKCdjJywgYWJjWzJdKTsKKyAgRVhQRUNUX0VRKDAsIGFiY1szXSk7CiB9CiAKIFRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdPcGVyYXRvckxUKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZW1wdHk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYSgiYSIpOwotICAgIENGWF9CeXRlU3RyaW5nIGFiYygiYWJjIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZGVmKCJkZWYiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgZW1wdHk7CisgIENGWF9CeXRlU3RyaW5nIGEoImEiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYWJjKCJhYmMiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgZGVmKCJkZWYiKTsKIAotICAgIEVYUEVDVF9GQUxTRShlbXB0eSA8IGVtcHR5KTsKLSAgICBFWFBFQ1RfRkFMU0UoYSA8IGEpOwotICAgIEVYUEVDVF9GQUxTRShhYmMgPCBhYmMpOwotICAgIEVYUEVDVF9GQUxTRShkZWYgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBlbXB0eSk7CisgIEVYUEVDVF9GQUxTRShhIDwgYSk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgZGVmKTsKIAotICAgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGEgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYSk7CisgIEVYUEVDVF9GQUxTRShhIDwgZW1wdHkpOwogCi0gICAgRVhQRUNUX1RSVUUoZW1wdHkgPCBhYmMpOwotICAgIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGVtcHR5KTsKIAotICAgIEVYUEVDVF9UUlVFKGVtcHR5IDwgZGVmKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBlbXB0eSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhIDwgYWJjKTsKLSAgICBFWFBFQ1RfRkFMU0UoYWJjIDwgYSk7CisgIEVYUEVDVF9UUlVFKGEgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgYSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhIDwgZGVmKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgYSk7CisgIEVYUEVDVF9UUlVFKGEgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgYSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhYmMgPCBkZWYpOwotICAgIEVYUEVDVF9GQUxTRShkZWYgPCBhYmMpOworICBFWFBFQ1RfVFJVRShhYmMgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgYWJjKTsKIH0KIAogVEVTVChmeGNydCwgQnl0ZVN0cmluZ09wZXJhdG9yRVEpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBudWxsX3N0cmluZzsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nIG51bGxfc3RyaW5nOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBudWxsX3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBlbXB0eV9zdHJpbmcoIiIpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgZW1wdHlfc3RyaW5nKCIiKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBkZWxldGVkX3N0cmluZygiaGVsbG8iKTsKLSAgICBkZWxldGVkX3N0cmluZy5EZWxldGUoMCwgNSk7Ci0gICAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZyBkZWxldGVkX3N0cmluZygiaGVsbG8iKTsKKyAgZGVsZXRlZF9zdHJpbmcuRGVsZXRlKDAsIDUpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcoImhlbGxvIik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyA9PSBieXRlX3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nKCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nID09IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nID09IGJ5dGVfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nX3NhbWUxKCJoZWxsbyIpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX3NhbWUxKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19zYW1lMSA9PSBieXRlX3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nX3NhbWUxKCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX3NhbWUxID09IGJ5dGVfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nX3NhbWUyKGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19zYW1lMik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfc2FtZTIgPT0gYnl0ZV9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMihieXRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX3NhbWUyKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfc2FtZTIgPT0gYnl0ZV9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcxKCJoZSIpOwotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMigiaGVsbHAiKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzMoImhlbGxvZCIpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZzEpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZzIpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZzMpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzEgPT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzMgPT0gYnl0ZV9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzEoImhlIik7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMigiaGVsbHAiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmczKCJoZWxsb2QiKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZzIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmczKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nMSA9PSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmczID09IGJ5dGVfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nQyBudWxsX3N0cmluZ19jOwotICAgIENGWF9CeXRlU3RyaW5nQyBlbXB0eV9zdHJpbmdfYygiIik7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gZGVsZXRlZF9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZ0MgbnVsbF9zdHJpbmdfYzsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGVtcHR5X3N0cmluZ19jKCIiKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nX2MgPT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBkZWxldGVkX3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfY19zYW1lMSgiaGVsbG8iKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19jX3NhbWUxKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jX3NhbWUxID09IGJ5dGVfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTEoImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX2Nfc2FtZTEpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jX3NhbWUxID09IGJ5dGVfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMSgiaGUiKTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzIoImhlbGxwIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MzKCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmdfYzEpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19jMik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX2MzKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYzEgPT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jMiA9PSBieXRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MzID09IGJ5dGVfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MxKCJoZSIpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzIoImhlbGxwIik7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMygiaGVsbG9kIik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19jMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19jMik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19jMyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jMSA9PSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jMiA9PSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jMyA9PSBieXRlX3N0cmluZyk7CiAKLSAgICBjb25zdCBjaGFyKiBjX251bGxfc3RyaW5nID0gbnVsbHB0cjsKLSAgICBjb25zdCBjaGFyKiBjX2VtcHR5X3N0cmluZyA9ICIiOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoY19udWxsX3N0cmluZyA9PSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfbnVsbF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfbnVsbF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgY29uc3QgY2hhciogY19udWxsX3N0cmluZyA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIqIGNfZW1wdHlfc3RyaW5nID0gIiI7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19udWxsX3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19udWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwogCi0gICAgY29uc3QgY2hhciogY19zdHJpbmdfc2FtZTEgPSAiaGVsbG8iOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nID09IGNfc3RyaW5nX3NhbWUxKTsKLSAgICBFWFBFQ1RfVFJVRShjX3N0cmluZ19zYW1lMSA9PSBieXRlX3N0cmluZyk7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nX3NhbWUxID0gImhlbGxvIjsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgPT0gY19zdHJpbmdfc2FtZTEpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZ19zYW1lMSA9PSBieXRlX3N0cmluZyk7CiAKLSAgICBjb25zdCBjaGFyKiBjX3N0cmluZzEgPSAiaGUiOwotICAgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMiA9ICJoZWxscCI7Ci0gICAgY29uc3QgY2hhciogY19zdHJpbmczID0gImhlbGxvZCI7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGNfc3RyaW5nMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGNfc3RyaW5nMik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGNfc3RyaW5nMyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMSA9PSBieXRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMiA9PSBieXRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMyA9PSBieXRlX3N0cmluZyk7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMSA9ICJoZSI7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMiA9ICJoZWxscCI7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMyA9ICJoZWxsb2QiOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gY19zdHJpbmcxKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGNfc3RyaW5nMik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBjX3N0cmluZzMpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmcxID09IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMiA9PSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzMgPT0gYnl0ZV9zdHJpbmcpOwogfQogCiBURVNUKGZ4Y3J0LCBCeXRlU3RyaW5nT3BlcmF0b3JORSkgewotICAgIENGWF9CeXRlU3RyaW5nIG51bGxfc3RyaW5nOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nIG51bGxfc3RyaW5nOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgZW1wdHlfc3RyaW5nKCIiKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nIGVtcHR5X3N0cmluZygiIik7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgZGVsZXRlZF9zdHJpbmcoImhlbGxvIik7Ci0gICAgZGVsZXRlZF9zdHJpbmcuRGVsZXRlKDAsIDUpOwotICAgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgZGVsZXRlZF9zdHJpbmcoImhlbGxvIik7CisgIGRlbGV0ZWRfc3RyaW5nLkRlbGV0ZSgwLCA1KTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcoImhlbGxvIik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyAhPSBieXRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZygiaGVsbG8iKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nICE9IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nICE9IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTEoImhlbGxvIik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX3NhbWUxKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfc2FtZTEgIT0gYnl0ZV9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMSgiaGVsbG8iKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX3NhbWUxICE9IGJ5dGVfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nX3NhbWUyKGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmdfc2FtZTIpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19zYW1lMiAhPSBieXRlX3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nX3NhbWUyKGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX3NhbWUyKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX3NhbWUyICE9IGJ5dGVfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMSgiaGUiKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzIoImhlbGxwIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmczKCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZzEpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nMik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmczKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzEgIT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nMiAhPSBieXRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmczICE9IGJ5dGVfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcxKCJoZSIpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzIoImhlbGxwIik7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMygiaGVsbG9kIik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nMSk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nMik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nMyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nMSAhPSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nMiAhPSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nMyAhPSBieXRlX3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MgbnVsbF9zdHJpbmdfYzsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgZW1wdHlfc3RyaW5nX2MoIiIpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBudWxsX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nX2MgIT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmdfYyAhPSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nX2MgIT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nX2MgIT0gZW1wdHlfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIG51bGxfc3RyaW5nX2M7CisgIENGWF9CeXRlU3RyaW5nQyBlbXB0eV9zdHJpbmdfYygiIik7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBudWxsX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZ19jICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZ19jICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nX2MgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZ19jICE9IGVtcHR5X3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfY19zYW1lMSgiaGVsbG8iKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmdfY19zYW1lMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2Nfc2FtZTEgIT0gYnl0ZV9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfY19zYW1lMSgiaGVsbG8iKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX2Nfc2FtZTEpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfY19zYW1lMSAhPSBieXRlX3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzEoImhlIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MyKCJoZWxscCIpOwotICAgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMygiaGVsbG9kIik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmdfYzEpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX2MyKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZ19jMyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzEgIT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MyICE9IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMyAhPSBieXRlX3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMSgiaGUiKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MyKCJoZWxscCIpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzMoImhlbGxvZCIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZ19jMSk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX2MyKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmdfYzMpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMSAhPSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MyICE9IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzMgIT0gYnl0ZV9zdHJpbmcpOwogCi0gICAgY29uc3QgY2hhciogY19udWxsX3N0cmluZyA9IG51bGxwdHI7Ci0gICAgY29uc3QgY2hhciogY19lbXB0eV9zdHJpbmcgPSAiIjsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gY19udWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBjX251bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19lbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfZW1wdHlfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfbnVsbF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIGNvbnN0IGNoYXIqIGNfbnVsbF9zdHJpbmcgPSBudWxscHRyOworICBjb25zdCBjaGFyKiBjX2VtcHR5X3N0cmluZyA9ICIiOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gY19udWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBjX2VtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gY19udWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gY19udWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBjX2VtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNfZW1wdHlfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNfbnVsbF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNfZW1wdHlfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNfZW1wdHlfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKIAotICAgIGNvbnN0IGNoYXIqIGNfc3RyaW5nX3NhbWUxID0gImhlbGxvIjsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgIT0gY19zdHJpbmdfc2FtZTEpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZ19zYW1lMSAhPSBieXRlX3N0cmluZyk7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nX3NhbWUxID0gImhlbGxvIjsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGNfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nX3NhbWUxICE9IGJ5dGVfc3RyaW5nKTsKIAotICAgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMSA9ICJoZSI7Ci0gICAgY29uc3QgY2hhciogY19zdHJpbmcyID0gImhlbGxwIjsKLSAgICBjb25zdCBjaGFyKiBjX3N0cmluZzMgPSAiaGVsbG9kIjsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBjX3N0cmluZzEpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGNfc3RyaW5nMik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gY19zdHJpbmczKTsKLSAgICBFWFBFQ1RfVFJVRShjX3N0cmluZzEgIT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMiAhPSBieXRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmczICE9IGJ5dGVfc3RyaW5nKTsKKyAgY29uc3QgY2hhciogY19zdHJpbmcxID0gImhlIjsKKyAgY29uc3QgY2hhciogY19zdHJpbmcyID0gImhlbGxwIjsKKyAgY29uc3QgY2hhciogY19zdHJpbmczID0gImhlbGxvZCI7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGNfc3RyaW5nMSk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGNfc3RyaW5nMik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGNfc3RyaW5nMyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMSAhPSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMiAhPSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMyAhPSBieXRlX3N0cmluZyk7CiB9CiAKIFRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdDTnVsbCkgewpAQCAtMjg5LDMwICsyODksMzAgQEAKIH0KIAogVEVTVChmeGNydCwgQnl0ZVN0cmluZ0NvbmNhdEluUGxhY2UpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBmcmVkOwotICAgIGZyZWQuQ29uY2F0SW5QbGFjZSg0LCAiRlJFRCIpOwotICAgIEVYUEVDVF9FUSgiRlJFRCIsIGZyZWQpOworICBDRlhfQnl0ZVN0cmluZyBmcmVkOworICBmcmVkLkNvbmNhdEluUGxhY2UoNCwgIkZSRUQiKTsKKyAgRVhQRUNUX0VRKCJGUkVEIiwgZnJlZCk7CiAKLSAgICBmcmVkLkNvbmNhdEluUGxhY2UoMiwgIkRZIik7Ci0gICAgRVhQRUNUX0VRKCJGUkVERFkiLCBmcmVkKTsKKyAgZnJlZC5Db25jYXRJblBsYWNlKDIsICJEWSIpOworICBFWFBFQ1RfRVEoIkZSRUREWSIsIGZyZWQpOwogCi0gICAgZnJlZC5EZWxldGUoMywgMyk7Ci0gICAgRVhQRUNUX0VRKCJGUkUiLCBmcmVkKTsKKyAgZnJlZC5EZWxldGUoMywgMyk7CisgIEVYUEVDVF9FUSgiRlJFIiwgZnJlZCk7CiAKLSAgICBmcmVkLkNvbmNhdEluUGxhY2UoMSwgIkQiKTsKLSAgICBFWFBFQ1RfRVEoIkZSRUQiLCBmcmVkKTsKKyAgZnJlZC5Db25jYXRJblBsYWNlKDEsICJEIik7CisgIEVYUEVDVF9FUSgiRlJFRCIsIGZyZWQpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgY29weSA9IGZyZWQ7Ci0gICAgZnJlZC5Db25jYXRJblBsYWNlKDIsICJEWSIpOwotICAgIEVYUEVDVF9FUSgiRlJFRERZIiwgZnJlZCk7Ci0gICAgRVhQRUNUX0VRKCJGUkVEIiwgY29weSk7CisgIENGWF9CeXRlU3RyaW5nIGNvcHkgPSBmcmVkOworICBmcmVkLkNvbmNhdEluUGxhY2UoMiwgIkRZIik7CisgIEVYUEVDVF9FUSgiRlJFRERZIiwgZnJlZCk7CisgIEVYUEVDVF9FUSgiRlJFRCIsIGNvcHkpOwogCi0gICAgLy8gVGVzdCBpbnZhbGlkIGFyZ3VtZW50cy4KLSAgICBjb3B5ID0gZnJlZDsKLSAgICBmcmVkLkNvbmNhdEluUGxhY2UoLTYsICJmcmVkZHkiKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBub3RfYWxpYXNlZCgieHh4eHh4Iik7Ci0gICAgRVhQRUNUX0VRKCJGUkVERFkiLCBmcmVkKTsKLSAgICBFWFBFQ1RfRVEoInh4eHh4eCIsIG5vdF9hbGlhc2VkKTsKKyAgLy8gVGVzdCBpbnZhbGlkIGFyZ3VtZW50cy4KKyAgY29weSA9IGZyZWQ7CisgIGZyZWQuQ29uY2F0SW5QbGFjZSgtNiwgImZyZWRkeSIpOworICBDRlhfQnl0ZVN0cmluZyBub3RfYWxpYXNlZCgieHh4eHh4Iik7CisgIEVYUEVDVF9FUSgiRlJFRERZIiwgZnJlZCk7CisgIEVYUEVDVF9FUSgieHh4eHh4Iiwgbm90X2FsaWFzZWQpOwogfQogCiBURVNUKGZ4Y3J0LCBCeXRlU3RyaW5nQ05vdE51bGwpIHsKQEAgLTQwOSw4ICs0MDksOCBAQAogICBFWFBFQ1RfRVEoRlhCU1RSX0lEKCdiJywgJ2MnLCAnZCcsICdlJyksIGxvbmdlcl9zdHJpbmcuR2V0SUQoMSkpOwogICBFWFBFQ1RfRVEoRlhCU1RSX0lEKCdjJywgJ2QnLCAnZScsICdmJyksIGxvbmdlcl9zdHJpbmcuR2V0SUQoMikpOwogICBFWFBFQ1RfRVEoRlhCU1RSX0lEKCdkJywgJ2UnLCAnZicsIDApLCBsb25nZXJfc3RyaW5nLkdldElEKDMpKTsKLSAgRVhQRUNUX0VRKEZYQlNUUl9JRCgnZScsICdmJywgMCAsIDApLCBsb25nZXJfc3RyaW5nLkdldElEKDQpKTsKLSAgRVhQRUNUX0VRKEZYQlNUUl9JRCgnZicsIDAgLCAwLCAwKSwgbG9uZ2VyX3N0cmluZy5HZXRJRCg1KSk7CisgIEVYUEVDVF9FUShGWEJTVFJfSUQoJ2UnLCAnZicsIDAsIDApLCBsb25nZXJfc3RyaW5nLkdldElEKDQpKTsKKyAgRVhQRUNUX0VRKEZYQlNUUl9JRCgnZicsIDAsIDAsIDApLCBsb25nZXJfc3RyaW5nLkdldElEKDUpKTsKICAgRVhQRUNUX0VRKDB1LCBsb25nZXJfc3RyaW5nLkdldElEKDYpKTsKICAgRVhQRUNUX0VRKDB1LCBsb25nZXJfc3RyaW5nLkdldElEKC0xKSk7CiAgIEVYUEVDVF9FUSgwdSwgbG9uZ2VyX3N0cmluZy5HZXRJRCgtMTAwMDAwMCkpOwpAQCAtNDYyLDE0NCArNDYyLDE0NCBAQAogfQogCiBURVNUKGZ4Y3J0LCBCeXRlU3RyaW5nQ09wZXJhdG9yU3Vic2NyaXB0KSB7Ci0gICAgLy8gQ0ZYX0J5dGVTdHJpbmdDIGluY2x1ZGVzIHRoZSBOVUwgdGVybWluYXRvciBmb3Igbm9uLWVtcHR5IHN0cmluZ3MuCi0gICAgQ0ZYX0J5dGVTdHJpbmdDIGFiYygiYWJjIik7Ci0gICAgRVhQRUNUX0VRKCdhJywgYWJjWzBdKTsKLSAgICBFWFBFQ1RfRVEoJ2InLCBhYmNbMV0pOwotICAgIEVYUEVDVF9FUSgnYycsIGFiY1syXSk7Ci0gICAgRVhQRUNUX0VRKDAsIGFiY1szXSk7CisgIC8vIENGWF9CeXRlU3RyaW5nQyBpbmNsdWRlcyB0aGUgTlVMIHRlcm1pbmF0b3IgZm9yIG5vbi1lbXB0eSBzdHJpbmdzLgorICBDRlhfQnl0ZVN0cmluZ0MgYWJjKCJhYmMiKTsKKyAgRVhQRUNUX0VRKCdhJywgYWJjWzBdKTsKKyAgRVhQRUNUX0VRKCdiJywgYWJjWzFdKTsKKyAgRVhQRUNUX0VRKCdjJywgYWJjWzJdKTsKKyAgRVhQRUNUX0VRKDAsIGFiY1szXSk7CiB9CiAKIFRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdDT3BlcmF0b3JMVCkgewotICAgIENGWF9CeXRlU3RyaW5nQyBlbXB0eTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYSgiYSIpOwotICAgIENGWF9CeXRlU3RyaW5nQyBhYmMoImFiYyIpOwotICAgIENGWF9CeXRlU3RyaW5nQyBkZWYoImRlZiIpOworICBDRlhfQnl0ZVN0cmluZ0MgZW1wdHk7CisgIENGWF9CeXRlU3RyaW5nQyBhKCJhIik7CisgIENGWF9CeXRlU3RyaW5nQyBhYmMoImFiYyIpOworICBDRlhfQnl0ZVN0cmluZ0MgZGVmKCJkZWYiKTsKIAotICAgIEVYUEVDVF9GQUxTRShlbXB0eSA8IGVtcHR5KTsKLSAgICBFWFBFQ1RfRkFMU0UoYSA8IGEpOwotICAgIEVYUEVDVF9GQUxTRShhYmMgPCBhYmMpOwotICAgIEVYUEVDVF9GQUxTRShkZWYgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBlbXB0eSk7CisgIEVYUEVDVF9GQUxTRShhIDwgYSk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgZGVmKTsKIAotICAgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGEgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYSk7CisgIEVYUEVDVF9GQUxTRShhIDwgZW1wdHkpOwogCi0gICAgRVhQRUNUX1RSVUUoZW1wdHkgPCBhYmMpOwotICAgIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGVtcHR5KTsKIAotICAgIEVYUEVDVF9UUlVFKGVtcHR5IDwgZGVmKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBlbXB0eSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhIDwgYWJjKTsKLSAgICBFWFBFQ1RfRkFMU0UoYWJjIDwgYSk7CisgIEVYUEVDVF9UUlVFKGEgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgYSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhIDwgZGVmKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgYSk7CisgIEVYUEVDVF9UUlVFKGEgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgYSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhYmMgPCBkZWYpOwotICAgIEVYUEVDVF9GQUxTRShkZWYgPCBhYmMpOworICBFWFBFQ1RfVFJVRShhYmMgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgYWJjKTsKIH0KIAogVEVTVChmeGNydCwgQnl0ZVN0cmluZ0NPcGVyYXRvckVRKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MoImhlbGxvIik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MoImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfY19zYW1lMSgiaGVsbG8iKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX2Nfc2FtZTEpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2Nfc2FtZTEgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jX3NhbWUxKCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX2Nfc2FtZTEpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jX3NhbWUxID09IGJ5dGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTIoYnl0ZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jX3NhbWUyKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jX3NhbWUyID09IGJ5dGVfc3RyaW5nX2MpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfY19zYW1lMihieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jX3NhbWUyKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfY19zYW1lMiA9PSBieXRlX3N0cmluZ19jKTsKIAotICAgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMSgiaGUiKTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzIoImhlbGxwIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MzKCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfYzIpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX2MzKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYzEgPT0gYnl0ZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MyID09IGJ5dGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jMyA9PSBieXRlX3N0cmluZ19jKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MxKCJoZSIpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzIoImhlbGxwIik7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMygiaGVsbG9kIik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX2MxKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfYzIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jMyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jMSA9PSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MyID09IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYzMgPT0gYnl0ZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMSgiaGVsbG8iKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX3NhbWUxKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19zYW1lMSA9PSBieXRlX3N0cmluZ19jKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTEoImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfc2FtZTEpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19zYW1lMSA9PSBieXRlX3N0cmluZ19jKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMSgiaGUiKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzIoImhlbGxwIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmczKCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZzEpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nMik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmczKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcxID09IGJ5dGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nMyA9PSBieXRlX3N0cmluZ19jKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcxKCJoZSIpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzIoImhlbGxwIik7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMygiaGVsbG9kIik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nMik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nMyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzEgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzMgPT0gYnl0ZV9zdHJpbmdfYyk7CiAKLSAgICBjb25zdCBjaGFyKiBjX3N0cmluZ19zYW1lMSA9ICJoZWxsbyI7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBjX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmdfc2FtZTEgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nX3NhbWUxID0gImhlbGxvIjsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBjX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nX3NhbWUxID09IGJ5dGVfc3RyaW5nX2MpOwogCi0gICAgY29uc3QgY2hhciogY19zdHJpbmcxID0gImhlIjsKLSAgICBjb25zdCBjaGFyKiBjX3N0cmluZzIgPSAiaGVsbHAiOwotICAgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMyA9ICJoZWxsb2QiOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGNfc3RyaW5nMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gY19zdHJpbmcyKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBjX3N0cmluZzMpOworICBjb25zdCBjaGFyKiBjX3N0cmluZzEgPSAiaGUiOworICBjb25zdCBjaGFyKiBjX3N0cmluZzIgPSAiaGVsbHAiOworICBjb25zdCBjaGFyKiBjX3N0cmluZzMgPSAiaGVsbG9kIjsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gY19zdHJpbmcxKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gY19zdHJpbmcyKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gY19zdHJpbmczKTsKIAotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZzEgPT0gYnl0ZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMiA9PSBieXRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19zdHJpbmczID09IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmcxID09IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmcyID09IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmczID09IGJ5dGVfc3RyaW5nX2MpOwogfQogCiBURVNUKGZ4Y3J0LCBCeXRlU3RyaW5nQ09wZXJhdG9yTkUpIHsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYygiaGVsbG8iKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MoImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTEoImhlbGxvIik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfY19zYW1lMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2Nfc2FtZTEgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jX3NhbWUxKCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2Nfc2FtZTEgIT0gYnl0ZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfY19zYW1lMihieXRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jX3NhbWUyKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfY19zYW1lMiAhPSBieXRlX3N0cmluZ19jKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTIoYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX2Nfc2FtZTIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfY19zYW1lMiAhPSBieXRlX3N0cmluZ19jKTsKIAotICAgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMSgiaGUiKTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzIoImhlbGxwIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MzKCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX2MxKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX2MyKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX2MzKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMSAhPSBieXRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMiAhPSBieXRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMyAhPSBieXRlX3N0cmluZ19jKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MxKCJoZSIpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzIoImhlbGxwIik7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMygiaGVsbG9kIik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfYzEpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX2MyKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jMyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MxICE9IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMiAhPSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzMgIT0gYnl0ZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMSgiaGVsbG8iKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX3NhbWUxICE9IGJ5dGVfc3RyaW5nX2MpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMSgiaGVsbG8iKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfc2FtZTEpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfc2FtZTEgIT0gYnl0ZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzEoImhlIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcyKCJoZWxscCIpOwotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMygiaGVsbG9kIik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZzEpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmcyKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nMyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcxICE9IGJ5dGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nMiAhPSBieXRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzMgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMSgiaGUiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcyKCJoZWxscCIpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzMoImhlbGxvZCIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nMSk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmcyKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZzMpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzEgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nMiAhPSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmczICE9IGJ5dGVfc3RyaW5nX2MpOwogCi0gICAgY29uc3QgY2hhciogY19zdHJpbmdfc2FtZTEgPSAiaGVsbG8iOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jICE9IGNfc3RyaW5nX3NhbWUxKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19zdHJpbmdfc2FtZTEgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nX3NhbWUxID0gImhlbGxvIjsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgIT0gY19zdHJpbmdfc2FtZTEpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmdfc2FtZTEgIT0gYnl0ZV9zdHJpbmdfYyk7CiAKLSAgICBjb25zdCBjaGFyKiBjX3N0cmluZzEgPSAiaGUiOwotICAgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMiA9ICJoZWxscCI7Ci0gICAgY29uc3QgY2hhciogY19zdHJpbmczID0gImhlbGxvZCI7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBjX3N0cmluZzEpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gY19zdHJpbmcyKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGNfc3RyaW5nMyk7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMSA9ICJoZSI7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMiA9ICJoZWxscCI7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMyA9ICJoZWxsb2QiOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGNfc3RyaW5nMSk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gY19zdHJpbmcyKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBjX3N0cmluZzMpOwogCi0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmcxICE9IGJ5dGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMiAhPSBieXRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShjX3N0cmluZzMgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMSAhPSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmcyICE9IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZzMgIT0gYnl0ZV9zdHJpbmdfYyk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19idWZmZXIuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnVmZmVyLmNwcAppbmRleCA5ZmM0MDBlLi5mMmNjM2RlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19idWZmZXIuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2J1ZmZlci5jcHAKQEAgLTcsNTUyICs3LDQ4MyBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKIEZYX1NUUlNJWkUgRlhfZnRvYShGWF9GTE9BVCBmLCBGWF9DSEFSKiBidWYpOwogQ0ZYX0JpbmFyeUJ1Zjo6Q0ZYX0JpbmFyeUJ1ZigpCi0gICAgOiBtX0FsbG9jU3RlcCgwKQotICAgICwgbV9wQnVmZmVyKE5VTEwpCi0gICAgLCBtX0RhdGFTaXplKDApCi0gICAgLCBtX0FsbG9jU2l6ZSgwKQotewotfQorICAgIDogbV9BbGxvY1N0ZXAoMCksIG1fcEJ1ZmZlcihOVUxMKSwgbV9EYXRhU2l6ZSgwKSwgbV9BbGxvY1NpemUoMCkge30KIENGWF9CaW5hcnlCdWY6OkNGWF9CaW5hcnlCdWYoRlhfU1RSU0laRSBzaXplKQotICAgIDogbV9BbGxvY1N0ZXAoMCkKLSAgICAsIG1fRGF0YVNpemUoc2l6ZSkKLSAgICAsIG1fQWxsb2NTaXplKHNpemUpCi17Ci0gICAgbV9wQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7CisgICAgOiBtX0FsbG9jU3RlcCgwKSwgbV9EYXRhU2l6ZShzaXplKSwgbV9BbGxvY1NpemUoc2l6ZSkgeworICBtX3BCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKIH0KLUNGWF9CaW5hcnlCdWY6On5DRlhfQmluYXJ5QnVmKCkKLXsKLSAgICBpZiAobV9wQnVmZmVyKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKK0NGWF9CaW5hcnlCdWY6On5DRlhfQmluYXJ5QnVmKCkgeworICBpZiAobV9wQnVmZmVyKSB7CisgICAgRlhfRnJlZShtX3BCdWZmZXIpOworICB9Cit9Cit2b2lkIENGWF9CaW5hcnlCdWY6OkRlbGV0ZShpbnQgc3RhcnRfaW5kZXgsIGludCBjb3VudCkgeworICBpZiAoIW1fcEJ1ZmZlciB8fCBzdGFydF9pbmRleCA8IDAgfHwgc3RhcnRfaW5kZXggKyBjb3VudCA+IG1fRGF0YVNpemUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhTWVNfbWVtbW92ZShtX3BCdWZmZXIgKyBzdGFydF9pbmRleCwgbV9wQnVmZmVyICsgc3RhcnRfaW5kZXggKyBjb3VudCwKKyAgICAgICAgICAgICAgICBtX0RhdGFTaXplIC0gc3RhcnRfaW5kZXggLSBjb3VudCk7CisgIG1fRGF0YVNpemUgLT0gY291bnQ7Cit9Cit2b2lkIENGWF9CaW5hcnlCdWY6OkNsZWFyKCkgeworICBtX0RhdGFTaXplID0gMDsKK30KK3ZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6RGV0YWNoQnVmZmVyKCkgeworICBtX0RhdGFTaXplID0gMDsKKyAgbV9wQnVmZmVyID0gTlVMTDsKKyAgbV9BbGxvY1NpemUgPSAwOworfQordm9pZCBDRlhfQmluYXJ5QnVmOjpBdHRhY2hEYXRhKHZvaWQqIGJ1ZmZlciwgRlhfU1RSU0laRSBzaXplKSB7CisgIGlmIChtX3BCdWZmZXIpIHsKKyAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7CisgIH0KKyAgbV9EYXRhU2l6ZSA9IHNpemU7CisgIG1fcEJ1ZmZlciA9ICh1aW50OF90KilidWZmZXI7CisgIG1fQWxsb2NTaXplID0gc2l6ZTsKK30KK3ZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6VGFrZU92ZXIoQ0ZYX0JpbmFyeUJ1ZiYgb3RoZXIpIHsKKyAgQXR0YWNoRGF0YShvdGhlci5HZXRCdWZmZXIoKSwgb3RoZXIuR2V0U2l6ZSgpKTsKKyAgb3RoZXIuRGV0YWNoQnVmZmVyKCk7Cit9Cit2b2lkIENGWF9CaW5hcnlCdWY6OkVzdGltYXRlU2l6ZShGWF9TVFJTSVpFIHNpemUsIEZYX1NUUlNJWkUgc3RlcCkgeworICBtX0FsbG9jU3RlcCA9IHN0ZXA7CisgIGlmIChtX0FsbG9jU2l6ZSA+PSBzaXplKSB7CisgICAgcmV0dXJuOworICB9CisgIEV4cGFuZEJ1ZihzaXplIC0gbV9EYXRhU2l6ZSk7Cit9Cit2b2lkIENGWF9CaW5hcnlCdWY6OkV4cGFuZEJ1ZihGWF9TVFJTSVpFIGFkZF9zaXplKSB7CisgIEZYX1NUUlNJWkUgbmV3X3NpemUgPSBhZGRfc2l6ZSArIG1fRGF0YVNpemU7CisgIGlmIChtX0FsbG9jU2l6ZSA+PSBuZXdfc2l6ZSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgYWxsb2Nfc3RlcDsKKyAgaWYgKG1fQWxsb2NTdGVwID09IDApIHsKKyAgICBhbGxvY19zdGVwID0gbV9BbGxvY1NpemUgLyA0OworICAgIGlmIChhbGxvY19zdGVwIDwgMTI4KSB7CisgICAgICBhbGxvY19zdGVwID0gMTI4OwogICAgIH0KKyAgfSBlbHNlIHsKKyAgICBhbGxvY19zdGVwID0gbV9BbGxvY1N0ZXA7CisgIH0KKyAgbmV3X3NpemUgPSAobmV3X3NpemUgKyBhbGxvY19zdGVwIC0gMSkgLyBhbGxvY19zdGVwICogYWxsb2Nfc3RlcDsKKyAgdWludDhfdCogcE5ld0J1ZmZlciA9IG1fcEJ1ZmZlcjsKKyAgaWYgKHBOZXdCdWZmZXIpIHsKKyAgICBwTmV3QnVmZmVyID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BCdWZmZXIsIG5ld19zaXplKTsKKyAgfSBlbHNlIHsKKyAgICBwTmV3QnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgbmV3X3NpemUpOworICB9CisgIG1fcEJ1ZmZlciA9IHBOZXdCdWZmZXI7CisgIG1fQWxsb2NTaXplID0gbmV3X3NpemU7CiB9Ci12b2lkIENGWF9CaW5hcnlCdWY6OkRlbGV0ZShpbnQgc3RhcnRfaW5kZXgsIGludCBjb3VudCkKLXsKLSAgICBpZiAoIW1fcEJ1ZmZlciB8fCBzdGFydF9pbmRleCA8IDAgfHwgc3RhcnRfaW5kZXggKyBjb3VudCA+IG1fRGF0YVNpemUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU19tZW1tb3ZlKG1fcEJ1ZmZlciArIHN0YXJ0X2luZGV4LCBtX3BCdWZmZXIgKyBzdGFydF9pbmRleCArIGNvdW50LCBtX0RhdGFTaXplIC0gc3RhcnRfaW5kZXggLSBjb3VudCk7Ci0gICAgbV9EYXRhU2l6ZSAtPSBjb3VudDsKLX0KLXZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6Q2xlYXIoKQotewordm9pZCBDRlhfQmluYXJ5QnVmOjpDb3B5RGF0YShjb25zdCB2b2lkKiBwU3RyLCBGWF9TVFJTSVpFIHNpemUpIHsKKyAgaWYgKHNpemUgPT0gMCkgewogICAgIG1fRGF0YVNpemUgPSAwOwotfQotdm9pZCBDRlhfQmluYXJ5QnVmOjpEZXRhY2hCdWZmZXIoKQotewotICAgIG1fRGF0YVNpemUgPSAwOwotICAgIG1fcEJ1ZmZlciA9IE5VTEw7Ci0gICAgbV9BbGxvY1NpemUgPSAwOwotfQotdm9pZCBDRlhfQmluYXJ5QnVmOjpBdHRhY2hEYXRhKHZvaWQqIGJ1ZmZlciwgRlhfU1RSU0laRSBzaXplKQotewotICAgIGlmIChtX3BCdWZmZXIpIHsKLSAgICAgICAgRlhfRnJlZShtX3BCdWZmZXIpOwotICAgIH0KLSAgICBtX0RhdGFTaXplID0gc2l6ZTsKLSAgICBtX3BCdWZmZXIgPSAodWludDhfdCopYnVmZmVyOwotICAgIG1fQWxsb2NTaXplID0gc2l6ZTsKLX0KLXZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6VGFrZU92ZXIoQ0ZYX0JpbmFyeUJ1ZiYgb3RoZXIpCi17Ci0gICAgQXR0YWNoRGF0YShvdGhlci5HZXRCdWZmZXIoKSwgb3RoZXIuR2V0U2l6ZSgpKTsKLSAgICBvdGhlci5EZXRhY2hCdWZmZXIoKTsKLX0KLXZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6RXN0aW1hdGVTaXplKEZYX1NUUlNJWkUgc2l6ZSwgRlhfU1RSU0laRSBzdGVwKQotewotICAgIG1fQWxsb2NTdGVwID0gc3RlcDsKLSAgICBpZiAobV9BbGxvY1NpemUgPj0gc2l6ZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAobV9BbGxvY1NpemUgPCBzaXplKSB7CiAgICAgRXhwYW5kQnVmKHNpemUgLSBtX0RhdGFTaXplKTsKKyAgfQorICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybjsKKyAgfQorICBGWFNZU19tZW1jcHkobV9wQnVmZmVyLCBwU3RyLCBzaXplKTsKKyAgbV9EYXRhU2l6ZSA9IHNpemU7CiB9Ci12b2lkIENGWF9CaW5hcnlCdWY6OkV4cGFuZEJ1ZihGWF9TVFJTSVpFIGFkZF9zaXplKQotewotICAgIEZYX1NUUlNJWkUgbmV3X3NpemUgPSBhZGRfc2l6ZSArIG1fRGF0YVNpemU7Ci0gICAgaWYgKG1fQWxsb2NTaXplID49IG5ld19zaXplKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGFsbG9jX3N0ZXA7Ci0gICAgaWYgKG1fQWxsb2NTdGVwID09IDApIHsKLSAgICAgICAgYWxsb2Nfc3RlcCA9IG1fQWxsb2NTaXplIC8gNDsKLSAgICAgICAgaWYgKGFsbG9jX3N0ZXAgPCAxMjggKSB7Ci0gICAgICAgICAgICBhbGxvY19zdGVwID0gMTI4OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWxsb2Nfc3RlcCA9IG1fQWxsb2NTdGVwOwotICAgIH0KLSAgICBuZXdfc2l6ZSA9IChuZXdfc2l6ZSArIGFsbG9jX3N0ZXAgLSAxKSAvIGFsbG9jX3N0ZXAgKiBhbGxvY19zdGVwOwotICAgIHVpbnQ4X3QqIHBOZXdCdWZmZXIgPSBtX3BCdWZmZXI7Ci0gICAgaWYgKHBOZXdCdWZmZXIpIHsKLSAgICAgICAgcE5ld0J1ZmZlciA9IEZYX1JlYWxsb2ModWludDhfdCwgbV9wQnVmZmVyLCBuZXdfc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcE5ld0J1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIG5ld19zaXplKTsKLSAgICB9Ci0gICAgbV9wQnVmZmVyID0gcE5ld0J1ZmZlcjsKLSAgICBtX0FsbG9jU2l6ZSA9IG5ld19zaXplOwordm9pZCBDRlhfQmluYXJ5QnVmOjpBcHBlbmRCbG9jayhjb25zdCB2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpIHsKKyAgRXhwYW5kQnVmKHNpemUpOworICBpZiAocEJ1ZiAmJiBtX3BCdWZmZXIpIHsKKyAgICBGWFNZU19tZW1jcHkobV9wQnVmZmVyICsgbV9EYXRhU2l6ZSwgcEJ1Ziwgc2l6ZSk7CisgIH0KKyAgbV9EYXRhU2l6ZSArPSBzaXplOwogfQotdm9pZCBDRlhfQmluYXJ5QnVmOjpDb3B5RGF0YShjb25zdCB2b2lkKiBwU3RyLCBGWF9TVFJTSVpFIHNpemUpCi17Ci0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICBtX0RhdGFTaXplID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9BbGxvY1NpemUgPCBzaXplKSB7Ci0gICAgICAgIEV4cGFuZEJ1ZihzaXplIC0gbV9EYXRhU2l6ZSk7Ci0gICAgfQotICAgIGlmICghbV9wQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciwgcFN0ciwgc2l6ZSk7Ci0gICAgbV9EYXRhU2l6ZSA9IHNpemU7Cit2b2lkIENGWF9CaW5hcnlCdWY6Okluc2VydEJsb2NrKEZYX1NUUlNJWkUgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIHNpemUpIHsKKyAgRXhwYW5kQnVmKHNpemUpOworICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybjsKKyAgfQorICBGWFNZU19tZW1tb3ZlKG1fcEJ1ZmZlciArIHBvcyArIHNpemUsIG1fcEJ1ZmZlciArIHBvcywgbV9EYXRhU2l6ZSAtIHBvcyk7CisgIGlmIChwQnVmKSB7CisgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciArIHBvcywgcEJ1Ziwgc2l6ZSk7CisgIH0KKyAgbV9EYXRhU2l6ZSArPSBzaXplOwogfQotdm9pZCBDRlhfQmluYXJ5QnVmOjpBcHBlbmRCbG9jayhjb25zdCB2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpCi17Ci0gICAgRXhwYW5kQnVmKHNpemUpOwotICAgIGlmIChwQnVmICYmIG1fcEJ1ZmZlcikgewotICAgICAgICBGWFNZU19tZW1jcHkobV9wQnVmZmVyICsgbV9EYXRhU2l6ZSwgcEJ1Ziwgc2l6ZSk7Ci0gICAgfQotICAgIG1fRGF0YVNpemUgKz0gc2l6ZTsKK3ZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6QXBwZW5kRmlsbCh1aW50OF90IGJ5dGUsIEZYX1NUUlNJWkUgY291bnQpIHsKKyAgRXhwYW5kQnVmKGNvdW50KTsKKyAgaWYgKCFtX3BCdWZmZXIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciArIG1fRGF0YVNpemUsIGJ5dGUsIGNvdW50KTsKKyAgbV9EYXRhU2l6ZSArPSBjb3VudDsKIH0KLXZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6SW5zZXJ0QmxvY2soRlhfU1RSU0laRSBwb3MsIGNvbnN0IHZvaWQqIHBCdWYsIEZYX1NUUlNJWkUgc2l6ZSkKLXsKLSAgICBFeHBhbmRCdWYoc2l6ZSk7Ci0gICAgaWYgKCFtX3BCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU19tZW1tb3ZlKG1fcEJ1ZmZlciArIHBvcyArIHNpemUsIG1fcEJ1ZmZlciArIHBvcywgbV9EYXRhU2l6ZSAtIHBvcyk7Ci0gICAgaWYgKHBCdWYpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciArIHBvcywgcEJ1Ziwgc2l6ZSk7Ci0gICAgfQotICAgIG1fRGF0YVNpemUgKz0gc2l6ZTsKK0NGWF9CeXRlU3RyaW5nQyBDRlhfQmluYXJ5QnVmOjpHZXRCeXRlU3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKG1fcEJ1ZmZlciwgbV9EYXRhU2l6ZSk7CiB9Ci12b2lkIENGWF9CaW5hcnlCdWY6OkFwcGVuZEZpbGwodWludDhfdCBieXRlLCBGWF9TVFJTSVpFIGNvdW50KQotewotICAgIEV4cGFuZEJ1Zihjb3VudCk7Ci0gICAgaWYgKCFtX3BCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU19tZW1zZXQobV9wQnVmZmVyICsgbV9EYXRhU2l6ZSwgYnl0ZSwgY291bnQpOwotICAgIG1fRGF0YVNpemUgKz0gY291bnQ7CitDRlhfQnl0ZVRleHRCdWYmIENGWF9CeXRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3opIHsKKyAgQXBwZW5kQmxvY2sobHBzei5HZXRQdHIoKSwgbHBzei5HZXRMZW5ndGgoKSk7CisgIHJldHVybiAqdGhpczsKIH0KLUNGWF9CeXRlU3RyaW5nQyBDRlhfQmluYXJ5QnVmOjpHZXRCeXRlU3RyaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKG1fcEJ1ZmZlciwgbV9EYXRhU2l6ZSk7CitDRlhfQnl0ZVRleHRCdWYmIENGWF9CeXRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChpbnQgaSkgeworICBjaGFyIGJ1ZlszMl07CisgIEZYU1lTX2l0b2EoaSwgYnVmLCAxMCk7CisgIEFwcGVuZEJsb2NrKGJ1ZiwgRlhTWVNfc3RybGVuKGJ1ZikpOworICByZXR1cm4gKnRoaXM7CiB9Ci1DRlhfQnl0ZVRleHRCdWYmIENGWF9CeXRlVGV4dEJ1Zjo6b3BlcmF0b3IgPDwgKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzeikKLXsKLSAgICBBcHBlbmRCbG9jayhscHN6LkdldFB0cigpLCBscHN6LkdldExlbmd0aCgpKTsKK0NGWF9CeXRlVGV4dEJ1ZiYgQ0ZYX0J5dGVUZXh0QnVmOjpvcGVyYXRvcjw8KEZYX0RXT1JEIGkpIHsKKyAgY2hhciBidWZbMzJdOworICBGWFNZU19pdG9hKGksIGJ1ZiwgMTApOworICBBcHBlbmRCbG9jayhidWYsIEZYU1lTX3N0cmxlbihidWYpKTsKKyAgcmV0dXJuICp0aGlzOworfQorQ0ZYX0J5dGVUZXh0QnVmJiBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yPDwoZG91YmxlIGYpIHsKKyAgY2hhciBidWZbMzJdOworICBGWF9TVFJTSVpFIGxlbiA9IEZYX2Z0b2EoKEZYX0ZMT0FUKWYsIGJ1Zik7CisgIEFwcGVuZEJsb2NrKGJ1ZiwgbGVuKTsKKyAgcmV0dXJuICp0aGlzOworfQorQ0ZYX0J5dGVUZXh0QnVmJiBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yPDwoY29uc3QgQ0ZYX0J5dGVUZXh0QnVmJiBidWYpIHsKKyAgQXBwZW5kQmxvY2soYnVmLm1fcEJ1ZmZlciwgYnVmLm1fRGF0YVNpemUpOworICByZXR1cm4gKnRoaXM7Cit9Cit2b2lkIENGWF9CeXRlVGV4dEJ1Zjo6b3BlcmF0b3I9KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7CisgIENvcHlEYXRhKHN0ci5HZXRQdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKK30KK3ZvaWQgQ0ZYX1dpZGVUZXh0QnVmOjpBcHBlbmRDaGFyKEZYX1dDSEFSIGNoKSB7CisgIGlmIChtX0FsbG9jU2l6ZSA8IG1fRGF0YVNpemUgKyAoRlhfU1RSU0laRSlzaXplb2YoRlhfV0NIQVIpKSB7CisgICAgRXhwYW5kQnVmKHNpemVvZihGWF9XQ0hBUikpOworICB9CisgIEFTU0VSVChtX3BCdWZmZXIgIT0gTlVMTCk7CisgICooRlhfV0NIQVIqKShtX3BCdWZmZXIgKyBtX0RhdGFTaXplKSA9IGNoOworICBtX0RhdGFTaXplICs9IHNpemVvZihGWF9XQ0hBUik7Cit9CitDRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgeworICBBcHBlbmRCbG9jayhzdHIuR2V0UHRyKCksIHN0ci5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpOworICByZXR1cm4gKnRoaXM7Cit9CitDRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSB7CisgIEFwcGVuZEJsb2NrKHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkgKiBzaXplb2YoRlhfV0NIQVIpKTsKKyAgcmV0dXJuICp0aGlzOworfQorQ0ZYX1dpZGVUZXh0QnVmJiBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yPDwoaW50IGkpIHsKKyAgY2hhciBidWZbMzJdOworICBGWFNZU19pdG9hKGksIGJ1ZiwgMTApOworICBGWF9TVFJTSVpFIGxlbiA9IEZYU1lTX3N0cmxlbihidWYpOworICBpZiAobV9BbGxvY1NpemUgPCBtX0RhdGFTaXplICsgKEZYX1NUUlNJWkUpKGxlbiAqIHNpemVvZihGWF9XQ0hBUikpKSB7CisgICAgRXhwYW5kQnVmKGxlbiAqIHNpemVvZihGWF9XQ0hBUikpOworICB9CisgIEFTU0VSVChtX3BCdWZmZXIgIT0gTlVMTCk7CisgIEZYX1dDSEFSKiBzdHIgPSAoRlhfV0NIQVIqKShtX3BCdWZmZXIgKyBtX0RhdGFTaXplKTsKKyAgZm9yIChGWF9TVFJTSVpFIGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAqc3RyKysgPSBidWZbal07CisgIH0KKyAgbV9EYXRhU2l6ZSArPSBsZW4gKiBzaXplb2YoRlhfV0NIQVIpOworICByZXR1cm4gKnRoaXM7Cit9CitDRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChkb3VibGUgZikgeworICBjaGFyIGJ1ZlszMl07CisgIEZYX1NUUlNJWkUgbGVuID0gRlhfZnRvYSgoRlhfRkxPQVQpZiwgYnVmKTsKKyAgaWYgKG1fQWxsb2NTaXplIDwgbV9EYXRhU2l6ZSArIChGWF9TVFJTSVpFKShsZW4gKiBzaXplb2YoRlhfV0NIQVIpKSkgeworICAgIEV4cGFuZEJ1ZihsZW4gKiBzaXplb2YoRlhfV0NIQVIpKTsKKyAgfQorICBBU1NFUlQobV9wQnVmZmVyICE9IE5VTEwpOworICBGWF9XQ0hBUiogc3RyID0gKEZYX1dDSEFSKikobV9wQnVmZmVyICsgbV9EYXRhU2l6ZSk7CisgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgKnN0cisrID0gYnVmW2ldOworICB9CisgIG1fRGF0YVNpemUgKz0gbGVuICogc2l6ZW9mKEZYX1dDSEFSKTsKKyAgcmV0dXJuICp0aGlzOworfQorQ0ZYX1dpZGVUZXh0QnVmJiBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yPDwoY29uc3QgRlhfV0NIQVIqIGxwc3opIHsKKyAgQXBwZW5kQmxvY2sobHBzeiwgRlhTWVNfd2NzbGVuKGxwc3opICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlVGV4dEJ1ZiYgYnVmKSB7CisgIEFwcGVuZEJsb2NrKGJ1Zi5tX3BCdWZmZXIsIGJ1Zi5tX0RhdGFTaXplKTsKKyAgcmV0dXJuICp0aGlzOworfQordm9pZCBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yPShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgeworICBDb3B5RGF0YShzdHIuR2V0UHRyKCksIHN0ci5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpOworfQorQ0ZYX1dpZGVTdHJpbmdDIENGWF9XaWRlVGV4dEJ1Zjo6R2V0V2lkZVN0cmluZygpIGNvbnN0IHsKKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQygoY29uc3QgRlhfV0NIQVIqKW1fcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX0RhdGFTaXplIC8gc2l6ZW9mKEZYX1dDSEFSKSk7Cit9CitDRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvcjw8KHVpbnQ4X3QgaSkgeworICBpZiAobV9wU3RyZWFtKSB7CisgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKCZpLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCeXRlKGkpOworICB9CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9BcmNoaXZlU2F2ZXImIENGWF9BcmNoaXZlU2F2ZXI6Om9wZXJhdG9yPDwoaW50IGkpIHsKKyAgaWYgKG1fcFN0cmVhbSkgeworICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jaygmaSwgc2l6ZW9mKGludCkpOworICB9IGVsc2UgeworICAgIG1fU2F2aW5nQnVmLkFwcGVuZEJsb2NrKCZpLCBzaXplb2YoaW50KSk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorQ0ZYX0FyY2hpdmVTYXZlciYgQ0ZYX0FyY2hpdmVTYXZlcjo6b3BlcmF0b3I8PChGWF9EV09SRCBpKSB7CisgIGlmIChtX3BTdHJlYW0pIHsKKyAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2soJmksIHNpemVvZihGWF9EV09SRCkpOworICB9IGVsc2UgeworICAgIG1fU2F2aW5nQnVmLkFwcGVuZEJsb2NrKCZpLCBzaXplb2YoRlhfRFdPUkQpKTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CitDRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvcjw8KEZYX0ZMT0FUIGYpIHsKKyAgaWYgKG1fcFN0cmVhbSkgeworICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jaygmZiwgc2l6ZW9mKEZYX0ZMT0FUKSk7CisgIH0gZWxzZSB7CisgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2soJmYsIHNpemVvZihGWF9GTE9BVCkpOworICB9CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9BcmNoaXZlU2F2ZXImIENGWF9BcmNoaXZlU2F2ZXI6Om9wZXJhdG9yPDwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyKSB7CisgIGludCBsZW4gPSBic3RyLkdldExlbmd0aCgpOworICBpZiAobV9wU3RyZWFtKSB7CisgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKCZsZW4sIHNpemVvZihpbnQpKTsKKyAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2soYnN0ci5HZXRQdHIoKSwgbGVuKTsKKyAgfSBlbHNlIHsKKyAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jaygmbGVuLCBzaXplb2YoaW50KSk7CisgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2soYnN0ci5HZXRQdHIoKSwgbGVuKTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CitDRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvcjw8KGNvbnN0IEZYX1dDSEFSKiB3c3RyKSB7CisgIEZYX1NUUlNJWkUgbGVuID0gRlhTWVNfd2NzbGVuKHdzdHIpOworICBpZiAobV9wU3RyZWFtKSB7CisgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKCZsZW4sIHNpemVvZihpbnQpKTsKKyAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2sod3N0ciwgbGVuKTsKKyAgfSBlbHNlIHsKKyAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jaygmbGVuLCBzaXplb2YoaW50KSk7CisgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2sod3N0ciwgbGVuKTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CitDRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c3RyKSB7CisgIENGWF9CeXRlU3RyaW5nIGVuY29kZWQgPSB3c3RyLlVURjE2TEVfRW5jb2RlKCk7CisgIHJldHVybiBvcGVyYXRvcjw8KGVuY29kZWQpOworfQordm9pZCBDRlhfQXJjaGl2ZVNhdmVyOjpXcml0ZShjb25zdCB2b2lkKiBwRGF0YSwgRlhfU1RSU0laRSBkd1NpemUpIHsKKyAgaWYgKG1fcFN0cmVhbSkgeworICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jayhwRGF0YSwgZHdTaXplKTsKKyAgfSBlbHNlIHsKKyAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jayhwRGF0YSwgZHdTaXplKTsKKyAgfQorfQorQ0ZYX0FyY2hpdmVMb2FkZXI6OkNGWF9BcmNoaXZlTG9hZGVyKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpIHsKKyAgbV9wTG9hZGluZ0J1ZiA9IHBEYXRhOworICBtX0xvYWRpbmdQb3MgPSAwOworICBtX0xvYWRpbmdTaXplID0gZHdTaXplOworfQorRlhfQk9PTCBDRlhfQXJjaGl2ZUxvYWRlcjo6SXNFT0YoKSB7CisgIHJldHVybiBtX0xvYWRpbmdQb3MgPj0gbV9Mb2FkaW5nU2l6ZTsKK30KK0NGWF9BcmNoaXZlTG9hZGVyJiBDRlhfQXJjaGl2ZUxvYWRlcjo6b3BlcmF0b3I+Pih1aW50OF90JiBpKSB7CisgIGlmIChtX0xvYWRpbmdQb3MgPj0gbV9Mb2FkaW5nU2l6ZSkgewogICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpID0gbV9wTG9hZGluZ0J1ZlttX0xvYWRpbmdQb3MrK107CisgIHJldHVybiAqdGhpczsKIH0KLUNGWF9CeXRlVGV4dEJ1ZiYgQ0ZYX0J5dGVUZXh0QnVmOjpvcGVyYXRvciA8PCAoaW50IGkpCi17Ci0gICAgY2hhciBidWZbMzJdOwotICAgIEZYU1lTX2l0b2EoaSwgYnVmLCAxMCk7Ci0gICAgQXBwZW5kQmxvY2soYnVmLCBGWFNZU19zdHJsZW4oYnVmKSk7CitDRlhfQXJjaGl2ZUxvYWRlciYgQ0ZYX0FyY2hpdmVMb2FkZXI6Om9wZXJhdG9yPj4oaW50JiBpKSB7CisgIFJlYWQoJmksIHNpemVvZihpbnQpKTsKKyAgcmV0dXJuICp0aGlzOworfQorQ0ZYX0FyY2hpdmVMb2FkZXImIENGWF9BcmNoaXZlTG9hZGVyOjpvcGVyYXRvcj4+KEZYX0RXT1JEJiBpKSB7CisgIFJlYWQoJmksIHNpemVvZihGWF9EV09SRCkpOworICByZXR1cm4gKnRoaXM7Cit9CitDRlhfQXJjaGl2ZUxvYWRlciYgQ0ZYX0FyY2hpdmVMb2FkZXI6Om9wZXJhdG9yPj4oRlhfRkxPQVQmIGkpIHsKKyAgUmVhZCgmaSwgc2l6ZW9mKEZYX0ZMT0FUKSk7CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9BcmNoaXZlTG9hZGVyJiBDRlhfQXJjaGl2ZUxvYWRlcjo6b3BlcmF0b3I+PihDRlhfQnl0ZVN0cmluZyYgc3RyKSB7CisgIGlmIChtX0xvYWRpbmdQb3MgKyA0ID4gbV9Mb2FkaW5nU2l6ZSkgewogICAgIHJldHVybiAqdGhpczsKLX0KLUNGWF9CeXRlVGV4dEJ1ZiYgQ0ZYX0J5dGVUZXh0QnVmOjpvcGVyYXRvciA8PCAoRlhfRFdPUkQgaSkKLXsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgRlhTWVNfaXRvYShpLCBidWYsIDEwKTsKLSAgICBBcHBlbmRCbG9jayhidWYsIEZYU1lTX3N0cmxlbihidWYpKTsKKyAgfQorICBpbnQgbGVuOworICBvcGVyYXRvcj4+KGxlbik7CisgIHN0ci5FbXB0eSgpOworICBpZiAobGVuIDw9IDAgfHwgbV9Mb2FkaW5nUG9zICsgbGVuID4gbV9Mb2FkaW5nU2l6ZSkgewogICAgIHJldHVybiAqdGhpczsKKyAgfQorICBGWF9DSEFSKiBidWZmZXIgPSBzdHIuR2V0QnVmZmVyKGxlbik7CisgIEZYU1lTX21lbWNweShidWZmZXIsIG1fcExvYWRpbmdCdWYgKyBtX0xvYWRpbmdQb3MsIGxlbik7CisgIHN0ci5SZWxlYXNlQnVmZmVyKGxlbik7CisgIG1fTG9hZGluZ1BvcyArPSBsZW47CisgIHJldHVybiAqdGhpczsKIH0KLUNGWF9CeXRlVGV4dEJ1ZiYgQ0ZYX0J5dGVUZXh0QnVmOjpvcGVyYXRvciA8PCAoZG91YmxlIGYpCi17Ci0gICAgY2hhciBidWZbMzJdOwotICAgIEZYX1NUUlNJWkUgbGVuID0gRlhfZnRvYSgoRlhfRkxPQVQpZiwgYnVmKTsKLSAgICBBcHBlbmRCbG9jayhidWYsIGxlbik7Ci0gICAgcmV0dXJuICp0aGlzOworQ0ZYX0FyY2hpdmVMb2FkZXImIENGWF9BcmNoaXZlTG9hZGVyOjpvcGVyYXRvcj4+KENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RlZDsKKyAgb3BlcmF0b3I+PihlbmNvZGVkKTsKKyAgc3RyID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKChjb25zdCB1bnNpZ25lZCBzaG9ydCopZW5jb2RlZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZC5HZXRMZW5ndGgoKSk7CisgIHJldHVybiAqdGhpczsKIH0KLUNGWF9CeXRlVGV4dEJ1ZiYgQ0ZYX0J5dGVUZXh0QnVmOjpvcGVyYXRvciA8PCAoY29uc3QgQ0ZYX0J5dGVUZXh0QnVmJiBidWYpCi17Ci0gICAgQXBwZW5kQmxvY2soYnVmLm1fcEJ1ZmZlciwgYnVmLm1fRGF0YVNpemUpOwotICAgIHJldHVybiAqdGhpczsKK0ZYX0JPT0wgQ0ZYX0FyY2hpdmVMb2FkZXI6OlJlYWQodm9pZCogcEJ1ZiwgRlhfRFdPUkQgZHdTaXplKSB7CisgIGlmIChtX0xvYWRpbmdQb3MgKyBkd1NpemUgPiBtX0xvYWRpbmdTaXplKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYU1lTX21lbWNweShwQnVmLCBtX3BMb2FkaW5nQnVmICsgbV9Mb2FkaW5nUG9zLCBkd1NpemUpOworICBtX0xvYWRpbmdQb3MgKz0gZHdTaXplOworICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ0ZYX0J5dGVUZXh0QnVmOjpvcGVyYXRvciA9KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKQotewotICAgIENvcHlEYXRhKHN0ci5HZXRQdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKK3ZvaWQgQ0ZYX0JpdFN0cmVhbTo6SW5pdChjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKSB7CisgIG1fcERhdGEgPSBwRGF0YTsKKyAgbV9CaXRTaXplID0gZHdTaXplICogODsKKyAgbV9CaXRQb3MgPSAwOwogfQotdm9pZCBDRlhfV2lkZVRleHRCdWY6OkFwcGVuZENoYXIoRlhfV0NIQVIgY2gpCi17Ci0gICAgaWYgKG1fQWxsb2NTaXplIDwgbV9EYXRhU2l6ZSArIChGWF9TVFJTSVpFKXNpemVvZihGWF9XQ0hBUikpIHsKLSAgICAgICAgRXhwYW5kQnVmKHNpemVvZihGWF9XQ0hBUikpOwordm9pZCBDRlhfQml0U3RyZWFtOjpCeXRlQWxpZ24oKSB7CisgIGludCBtb2QgPSBtX0JpdFBvcyAlIDg7CisgIGlmIChtb2QgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBtX0JpdFBvcyArPSA4IC0gbW9kOworfQorRlhfRFdPUkQgQ0ZYX0JpdFN0cmVhbTo6R2V0Qml0cyhGWF9EV09SRCBuQml0cykgeworICBpZiAobkJpdHMgPiBtX0JpdFNpemUgfHwgbV9CaXRQb3MgKyBuQml0cyA+IG1fQml0U2l6ZSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChuQml0cyA9PSAxKSB7CisgICAgaW50IGJpdCA9IChtX3BEYXRhW21fQml0UG9zIC8gOF0gJiAoMSA8PCAoNyAtIG1fQml0UG9zICUgOCkpKSA/IDEgOiAwOworICAgIG1fQml0UG9zKys7CisgICAgcmV0dXJuIGJpdDsKKyAgfQorICBGWF9EV09SRCBieXRlX3BvcyA9IG1fQml0UG9zIC8gODsKKyAgRlhfRFdPUkQgYml0X3BvcyA9IG1fQml0UG9zICUgOCwgYml0X2xlZnQgPSBuQml0czsKKyAgRlhfRFdPUkQgcmVzdWx0ID0gMDsKKyAgaWYgKGJpdF9wb3MpIHsKKyAgICBpZiAoOCAtIGJpdF9wb3MgPj0gYml0X2xlZnQpIHsKKyAgICAgIHJlc3VsdCA9CisgICAgICAgICAgKG1fcERhdGFbYnl0ZV9wb3NdICYgKDB4ZmYgPj4gYml0X3BvcykpID4+ICg4IC0gYml0X3BvcyAtIGJpdF9sZWZ0KTsKKyAgICAgIG1fQml0UG9zICs9IGJpdF9sZWZ0OworICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gICAgQVNTRVJUKG1fcEJ1ZmZlciAhPSBOVUxMKTsKLSAgICAqKEZYX1dDSEFSKikobV9wQnVmZmVyICsgbV9EYXRhU2l6ZSkgPSBjaDsKLSAgICBtX0RhdGFTaXplICs9IHNpemVvZihGWF9XQ0hBUik7Ci19Ci1DRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3IgPDwgKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKQotewotICAgIEFwcGVuZEJsb2NrKHN0ci5HZXRQdHIoKSwgc3RyLkdldExlbmd0aCgpICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX1dpZGVUZXh0QnVmJiBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yIDw8IChjb25zdCBDRlhfV2lkZVN0cmluZyAmc3RyKQotewotICAgIEFwcGVuZEJsb2NrKHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkgKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3IgPDwgKGludCBpKQotewotICAgIGNoYXIgYnVmWzMyXTsKLSAgICBGWFNZU19pdG9hKGksIGJ1ZiwgMTApOwotICAgIEZYX1NUUlNJWkUgbGVuID0gRlhTWVNfc3RybGVuKGJ1Zik7Ci0gICAgaWYgKG1fQWxsb2NTaXplIDwgbV9EYXRhU2l6ZSArIChGWF9TVFJTSVpFKShsZW4gKiBzaXplb2YoRlhfV0NIQVIpKSkgewotICAgICAgICBFeHBhbmRCdWYobGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgfQotICAgIEFTU0VSVChtX3BCdWZmZXIgIT0gTlVMTCk7Ci0gICAgRlhfV0NIQVIqIHN0ciA9IChGWF9XQ0hBUiopKG1fcEJ1ZmZlciArIG1fRGF0YVNpemUpOwotICAgIGZvciAoRlhfU1RSU0laRSBqID0gMDsgaiA8IGxlbjsgaiArKykgewotICAgICAgICAqc3RyICsrID0gYnVmW2pdOwotICAgIH0KLSAgICBtX0RhdGFTaXplICs9IGxlbiAqIHNpemVvZihGWF9XQ0hBUik7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX1dpZGVUZXh0QnVmJiBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yIDw8IChkb3VibGUgZikKLXsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgRlhfU1RSU0laRSBsZW4gPSBGWF9mdG9hKChGWF9GTE9BVClmLCBidWYpOwotICAgIGlmIChtX0FsbG9jU2l6ZSA8IG1fRGF0YVNpemUgKyAoRlhfU1RSU0laRSkobGVuICogc2l6ZW9mKEZYX1dDSEFSKSkpIHsKLSAgICAgICAgRXhwYW5kQnVmKGxlbiAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgIH0KLSAgICBBU1NFUlQobV9wQnVmZmVyICE9IE5VTEwpOwotICAgIEZYX1dDSEFSKiBzdHIgPSAoRlhfV0NIQVIqKShtX3BCdWZmZXIgKyBtX0RhdGFTaXplKTsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBsZW47IGkgKyspIHsKLSAgICAgICAgKnN0ciArKyA9IGJ1ZltpXTsKLSAgICB9Ci0gICAgbV9EYXRhU2l6ZSArPSBsZW4gKiBzaXplb2YoRlhfV0NIQVIpOwotICAgIHJldHVybiAqdGhpczsKLX0KLUNGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvciA8PCAoY29uc3QgRlhfV0NIQVIqIGxwc3opCi17Ci0gICAgQXBwZW5kQmxvY2sobHBzeiwgRlhTWVNfd2NzbGVuKGxwc3opKnNpemVvZihGWF9XQ0hBUikpOwotICAgIHJldHVybiAqdGhpczsKLX0KLUNGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvciA8PCAoY29uc3QgQ0ZYX1dpZGVUZXh0QnVmJiBidWYpCi17Ci0gICAgQXBwZW5kQmxvY2soYnVmLm1fcEJ1ZmZlciwgYnVmLm1fRGF0YVNpemUpOwotICAgIHJldHVybiAqdGhpczsKLX0KLXZvaWQgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvciA9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKQotewotICAgIENvcHlEYXRhKHN0ci5HZXRQdHIoKSwgc3RyLkdldExlbmd0aCgpICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci19Ci1DRlhfV2lkZVN0cmluZ0MgQ0ZYX1dpZGVUZXh0QnVmOjpHZXRXaWRlU3RyaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopbV9wQnVmZmVyLCBtX0RhdGFTaXplIC8gc2l6ZW9mKEZYX1dDSEFSKSk7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAodWludDhfdCBpKQotewotICAgIGlmIChtX3BTdHJlYW0pIHsKLSAgICAgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKCZpLCAxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCeXRlKGkpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoaW50IGkpCi17Ci0gICAgaWYgKG1fcFN0cmVhbSkgewotICAgICAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2soJmksIHNpemVvZihpbnQpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jaygmaSwgc2l6ZW9mKGludCkpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoRlhfRFdPUkQgaSkKLXsKLSAgICBpZiAobV9wU3RyZWFtKSB7Ci0gICAgICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jaygmaSwgc2l6ZW9mKEZYX0RXT1JEKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2soJmksIHNpemVvZihGWF9EV09SRCkpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoRlhfRkxPQVQgZikKLXsKLSAgICBpZiAobV9wU3RyZWFtKSB7Ci0gICAgICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jaygmZiwgc2l6ZW9mKEZYX0ZMT0FUKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2soJmYsIHNpemVvZihGWF9GTE9BVCkpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyKQotewotICAgIGludCBsZW4gPSBic3RyLkdldExlbmd0aCgpOwotICAgIGlmIChtX3BTdHJlYW0pIHsKLSAgICAgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKCZsZW4sIHNpemVvZihpbnQpKTsKLSAgICAgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKGJzdHIuR2V0UHRyKCksIGxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2soJmxlbiwgc2l6ZW9mKGludCkpOwotICAgICAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jayhic3RyLkdldFB0cigpLCBsZW4pOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoY29uc3QgRlhfV0NIQVIqIHdzdHIpCi17Ci0gICAgRlhfU1RSU0laRSBsZW4gPSBGWFNZU193Y3NsZW4od3N0cik7Ci0gICAgaWYgKG1fcFN0cmVhbSkgewotICAgICAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2soJmxlbiwgc2l6ZW9mKGludCkpOwotICAgICAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2sod3N0ciwgbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jaygmbGVuLCBzaXplb2YoaW50KSk7Ci0gICAgICAgIG1fU2F2aW5nQnVmLkFwcGVuZEJsb2NrKHdzdHIsIGxlbik7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLX0KLUNGWF9BcmNoaXZlU2F2ZXImIENGWF9BcmNoaXZlU2F2ZXI6Om9wZXJhdG9yIDw8IChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3N0cikKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGVkID0gd3N0ci5VVEYxNkxFX0VuY29kZSgpOwotICAgIHJldHVybiBvcGVyYXRvciA8PCAoZW5jb2RlZCk7Ci19Ci12b2lkIENGWF9BcmNoaXZlU2F2ZXI6OldyaXRlKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9TVFJTSVpFIGR3U2l6ZSkKLXsKLSAgICBpZiAobV9wU3RyZWFtKSB7Ci0gICAgICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jayhwRGF0YSwgZHdTaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jayhwRGF0YSwgZHdTaXplKTsKLSAgICB9Ci19Ci1DRlhfQXJjaGl2ZUxvYWRlcjo6Q0ZYX0FyY2hpdmVMb2FkZXIoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSkKLXsKLSAgICBtX3BMb2FkaW5nQnVmID0gcERhdGE7Ci0gICAgbV9Mb2FkaW5nUG9zID0gMDsKLSAgICBtX0xvYWRpbmdTaXplID0gZHdTaXplOwotfQotRlhfQk9PTCBDRlhfQXJjaGl2ZUxvYWRlcjo6SXNFT0YoKQotewotICAgIHJldHVybiBtX0xvYWRpbmdQb3MgPj0gbV9Mb2FkaW5nU2l6ZTsKLX0KLUNGWF9BcmNoaXZlTG9hZGVyJiBDRlhfQXJjaGl2ZUxvYWRlcjo6b3BlcmF0b3IgPj4gKHVpbnQ4X3QmIGkpCi17Ci0gICAgaWYgKG1fTG9hZGluZ1BvcyA+PSBtX0xvYWRpbmdTaXplKSB7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgaSA9IG1fcExvYWRpbmdCdWZbbV9Mb2FkaW5nUG9zKytdOwotICAgIHJldHVybiAqdGhpczsKLX0KLUNGWF9BcmNoaXZlTG9hZGVyJiBDRlhfQXJjaGl2ZUxvYWRlcjo6b3BlcmF0b3IgPj4gKGludCYgaSkKLXsKLSAgICBSZWFkKCZpLCBzaXplb2YoaW50KSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX0FyY2hpdmVMb2FkZXImIENGWF9BcmNoaXZlTG9hZGVyOjpvcGVyYXRvciA+PiAoRlhfRFdPUkQmIGkpCi17Ci0gICAgUmVhZCgmaSwgc2l6ZW9mKEZYX0RXT1JEKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX0FyY2hpdmVMb2FkZXImIENGWF9BcmNoaXZlTG9hZGVyOjpvcGVyYXRvciA+PiAoRlhfRkxPQVQmIGkpCi17Ci0gICAgUmVhZCgmaSwgc2l6ZW9mKEZYX0ZMT0FUKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX0FyY2hpdmVMb2FkZXImIENGWF9BcmNoaXZlTG9hZGVyOjpvcGVyYXRvciA+PiAoQ0ZYX0J5dGVTdHJpbmcmIHN0cikKLXsKLSAgICBpZiAobV9Mb2FkaW5nUG9zICsgNCA+IG1fTG9hZGluZ1NpemUpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBpbnQgbGVuOwotICAgIG9wZXJhdG9yID4+IChsZW4pOwotICAgIHN0ci5FbXB0eSgpOwotICAgIGlmIChsZW4gPD0gMCB8fCBtX0xvYWRpbmdQb3MgKyBsZW4gPiBtX0xvYWRpbmdTaXplKSB7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgRlhfQ0hBUiogYnVmZmVyID0gc3RyLkdldEJ1ZmZlcihsZW4pOwotICAgIEZYU1lTX21lbWNweShidWZmZXIsIG1fcExvYWRpbmdCdWYgKyBtX0xvYWRpbmdQb3MsIGxlbik7Ci0gICAgc3RyLlJlbGVhc2VCdWZmZXIobGVuKTsKLSAgICBtX0xvYWRpbmdQb3MgKz0gbGVuOwotICAgIHJldHVybiAqdGhpczsKLX0KLUNGWF9BcmNoaXZlTG9hZGVyJiBDRlhfQXJjaGl2ZUxvYWRlcjo6b3BlcmF0b3IgPj4gKENGWF9XaWRlU3RyaW5nJiBzdHIpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RlZDsKLSAgICBvcGVyYXRvciA+PiAoZW5jb2RlZCk7Ci0gICAgc3RyID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKChjb25zdCB1bnNpZ25lZCBzaG9ydCopZW5jb2RlZC5jX3N0cigpLCBlbmNvZGVkLkdldExlbmd0aCgpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1GWF9CT09MIENGWF9BcmNoaXZlTG9hZGVyOjpSZWFkKHZvaWQqIHBCdWYsIEZYX0RXT1JEIGR3U2l6ZSkKLXsKLSAgICBpZiAobV9Mb2FkaW5nUG9zICsgZHdTaXplID4gbV9Mb2FkaW5nU2l6ZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYU1lTX21lbWNweShwQnVmLCBtX3BMb2FkaW5nQnVmICsgbV9Mb2FkaW5nUG9zLCBkd1NpemUpOwotICAgIG1fTG9hZGluZ1BvcyArPSBkd1NpemU7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENGWF9CaXRTdHJlYW06OkluaXQoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSkKLXsKLSAgICBtX3BEYXRhID0gcERhdGE7Ci0gICAgbV9CaXRTaXplID0gZHdTaXplICogODsKLSAgICBtX0JpdFBvcyA9IDA7Ci19Ci12b2lkIENGWF9CaXRTdHJlYW06OkJ5dGVBbGlnbigpCi17Ci0gICAgaW50IG1vZCA9IG1fQml0UG9zICUgODsKLSAgICBpZiAobW9kID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX0JpdFBvcyArPSA4IC0gbW9kOwotfQotRlhfRFdPUkQgQ0ZYX0JpdFN0cmVhbTo6R2V0Qml0cyhGWF9EV09SRCBuQml0cykKLXsKLSAgICBpZiAobkJpdHMgPiBtX0JpdFNpemUgfHwgbV9CaXRQb3MgKyBuQml0cyA+IG1fQml0U2l6ZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG5CaXRzID09IDEpIHsKLSAgICAgICAgaW50IGJpdCA9IChtX3BEYXRhW21fQml0UG9zIC8gOF0gJiAoMSA8PCAoNyAtIG1fQml0UG9zICUgOCkpKSA/IDEgOiAwOwotICAgICAgICBtX0JpdFBvcyArKzsKLSAgICAgICAgcmV0dXJuIGJpdDsKLSAgICB9Ci0gICAgRlhfRFdPUkQgYnl0ZV9wb3MgPSBtX0JpdFBvcyAvIDg7Ci0gICAgRlhfRFdPUkQgYml0X3BvcyA9IG1fQml0UG9zICUgOCwgYml0X2xlZnQgPSBuQml0czsKLSAgICBGWF9EV09SRCByZXN1bHQgPSAwOwotICAgIGlmIChiaXRfcG9zKSB7Ci0gICAgICAgIGlmICg4IC0gYml0X3BvcyA+PSBiaXRfbGVmdCkgewotICAgICAgICAgICAgcmVzdWx0ID0gKG1fcERhdGFbYnl0ZV9wb3NdICYgKDB4ZmYgPj4gYml0X3BvcykpID4+ICg4IC0gYml0X3BvcyAtIGJpdF9sZWZ0KTsKLSAgICAgICAgICAgIG1fQml0UG9zICs9IGJpdF9sZWZ0OwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBiaXRfbGVmdCAtPSA4IC0gYml0X3BvczsKLSAgICAgICAgcmVzdWx0ID0gKG1fcERhdGFbYnl0ZV9wb3MrK10gJiAoKDEgPDwgKDggLSBiaXRfcG9zKSkgLSAxKSkgPDwgYml0X2xlZnQ7Ci0gICAgfQotICAgIHdoaWxlIChiaXRfbGVmdCA+PSA4KSB7Ci0gICAgICAgIGJpdF9sZWZ0IC09IDg7Ci0gICAgICAgIHJlc3VsdCB8PSBtX3BEYXRhW2J5dGVfcG9zKytdIDw8IGJpdF9sZWZ0OwotICAgIH0KLSAgICBpZiAoYml0X2xlZnQpIHsKLSAgICAgICAgcmVzdWx0IHw9IG1fcERhdGFbYnl0ZV9wb3NdID4+ICg4IC0gYml0X2xlZnQpOwotICAgIH0KLSAgICBtX0JpdFBvcyArPSBuQml0czsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIGJpdF9sZWZ0IC09IDggLSBiaXRfcG9zOworICAgIHJlc3VsdCA9IChtX3BEYXRhW2J5dGVfcG9zKytdICYgKCgxIDw8ICg4IC0gYml0X3BvcykpIC0gMSkpIDw8IGJpdF9sZWZ0OworICB9CisgIHdoaWxlIChiaXRfbGVmdCA+PSA4KSB7CisgICAgYml0X2xlZnQgLT0gODsKKyAgICByZXN1bHQgfD0gbV9wRGF0YVtieXRlX3BvcysrXSA8PCBiaXRfbGVmdDsKKyAgfQorICBpZiAoYml0X2xlZnQpIHsKKyAgICByZXN1bHQgfD0gbV9wRGF0YVtieXRlX3Bvc10gPj4gKDggLSBiaXRfbGVmdCk7CisgIH0KKyAgbV9CaXRQb3MgKz0gbkJpdHM7CisgIHJldHVybiByZXN1bHQ7CiB9CiBJRlhfQnVmZmVyQXJjaGl2ZTo6SUZYX0J1ZmZlckFyY2hpdmUoRlhfU1RSU0laRSBzaXplKQotICAgIDogbV9CdWZTaXplKHNpemUpCi0gICAgLCBtX3BCdWZmZXIoTlVMTCkKLSAgICAsIG1fTGVuZ3RoKDApCi17CisgICAgOiBtX0J1ZlNpemUoc2l6ZSksIG1fcEJ1ZmZlcihOVUxMKSwgbV9MZW5ndGgoMCkge30KK3ZvaWQgSUZYX0J1ZmZlckFyY2hpdmU6OkNsZWFyKCkgeworICBtX0xlbmd0aCA9IDA7CisgIGlmIChtX3BCdWZmZXIpIHsKKyAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7CisgICAgbV9wQnVmZmVyID0gTlVMTDsKKyAgfQogfQotdm9pZCBJRlhfQnVmZmVyQXJjaGl2ZTo6Q2xlYXIoKQotewotICAgIG1fTGVuZ3RoID0gMDsKLSAgICBpZiAobV9wQnVmZmVyKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKLSAgICAgICAgbV9wQnVmZmVyID0gTlVMTDsKK0ZYX0JPT0wgSUZYX0J1ZmZlckFyY2hpdmU6OkZsdXNoKCkgeworICBGWF9CT09MIGJSZXQgPSBEb1dvcmsobV9wQnVmZmVyLCBtX0xlbmd0aCk7CisgIG1fTGVuZ3RoID0gMDsKKyAgcmV0dXJuIGJSZXQ7Cit9CitpbnQzMl90IElGWF9CdWZmZXJBcmNoaXZlOjpBcHBlbmRCbG9jayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoIXBCdWYgfHwgc2l6ZSA8IDEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fQnVmU2l6ZSk7CisgIH0KKyAgdWludDhfdCogYnVmZmVyID0gKHVpbnQ4X3QqKXBCdWY7CisgIEZYX1NUUlNJWkUgdGVtcF9zaXplID0gKEZYX1NUUlNJWkUpc2l6ZTsKKyAgd2hpbGUgKHRlbXBfc2l6ZSA+IDApIHsKKyAgICBGWF9TVFJTSVpFIGJ1Zl9zaXplID0gRlhfTUlOKG1fQnVmU2l6ZSAtIG1fTGVuZ3RoLCAoRlhfU1RSU0laRSl0ZW1wX3NpemUpOworICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIgKyBtX0xlbmd0aCwgYnVmZmVyLCBidWZfc2l6ZSk7CisgICAgbV9MZW5ndGggKz0gYnVmX3NpemU7CisgICAgaWYgKG1fTGVuZ3RoID09IG1fQnVmU2l6ZSkgeworICAgICAgaWYgKCFGbHVzaCgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KICAgICB9CisgICAgdGVtcF9zaXplIC09IGJ1Zl9zaXplOworICAgIGJ1ZmZlciArPSBidWZfc2l6ZTsKKyAgfQorICByZXR1cm4gKGludDMyX3Qpc2l6ZTsKIH0KLUZYX0JPT0wgSUZYX0J1ZmZlckFyY2hpdmU6OkZsdXNoKCkKLXsKLSAgICBGWF9CT09MIGJSZXQgPSBEb1dvcmsobV9wQnVmZmVyLCBtX0xlbmd0aCk7Ci0gICAgbV9MZW5ndGggPSAwOwotICAgIHJldHVybiBiUmV0OworaW50MzJfdCBJRlhfQnVmZmVyQXJjaGl2ZTo6QXBwZW5kQnl0ZSh1aW50OF90IGJ5dGUpIHsKKyAgcmV0dXJuIEFwcGVuZEJsb2NrKCZieXRlLCAxKTsKIH0KLWludDMyX3QgSUZYX0J1ZmZlckFyY2hpdmU6OkFwcGVuZEJsb2NrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKQotewotICAgIGlmICghcEJ1ZiB8fCBzaXplIDwgMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKCFtX3BCdWZmZXIpIHsKLSAgICAgICAgbV9wQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgbV9CdWZTaXplKTsKLSAgICB9Ci0gICAgdWludDhfdCogYnVmZmVyID0gKHVpbnQ4X3QqKXBCdWY7Ci0gICAgRlhfU1RSU0laRSB0ZW1wX3NpemUgPSAoRlhfU1RSU0laRSlzaXplOwotICAgIHdoaWxlICh0ZW1wX3NpemUgPiAwKSB7Ci0gICAgICAgIEZYX1NUUlNJWkUgYnVmX3NpemUgPSBGWF9NSU4obV9CdWZTaXplIC0gbV9MZW5ndGgsIChGWF9TVFJTSVpFKXRlbXBfc2l6ZSk7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIgKyBtX0xlbmd0aCwgYnVmZmVyLCBidWZfc2l6ZSk7Ci0gICAgICAgIG1fTGVuZ3RoICs9IGJ1Zl9zaXplOwotICAgICAgICBpZiAobV9MZW5ndGggPT0gbV9CdWZTaXplKSB7Ci0gICAgICAgICAgICBpZiAoIUZsdXNoKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGVtcF9zaXplIC09IGJ1Zl9zaXplOwotICAgICAgICBidWZmZXIgKz0gYnVmX3NpemU7Ci0gICAgfQotICAgIHJldHVybiAoaW50MzJfdClzaXplOworaW50MzJfdCBJRlhfQnVmZmVyQXJjaGl2ZTo6QXBwZW5kRFdvcmQoRlhfRFdPUkQgaSkgeworICBjaGFyIGJ1ZlszMl07CisgIEZYU1lTX2l0b2EoaSwgYnVmLCAxMCk7CisgIHJldHVybiBBcHBlbmRCbG9jayhidWYsIChzaXplX3QpRlhTWVNfc3RybGVuKGJ1ZikpOwogfQotaW50MzJfdCBJRlhfQnVmZmVyQXJjaGl2ZTo6QXBwZW5kQnl0ZSh1aW50OF90IGJ5dGUpCi17Ci0gICAgcmV0dXJuIEFwcGVuZEJsb2NrKCZieXRlLCAxKTsKLX0KLWludDMyX3QgSUZYX0J1ZmZlckFyY2hpdmU6OkFwcGVuZERXb3JkKEZYX0RXT1JEIGkpCi17Ci0gICAgY2hhciBidWZbMzJdOwotICAgIEZYU1lTX2l0b2EoaSwgYnVmLCAxMCk7Ci0gICAgcmV0dXJuIEFwcGVuZEJsb2NrKGJ1ZiwgKHNpemVfdClGWFNZU19zdHJsZW4oYnVmKSk7Ci19Ci1pbnQzMl90IElGWF9CdWZmZXJBcmNoaXZlOjpBcHBlbmRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6KQotewotICAgIHJldHVybiBBcHBlbmRCbG9jayhscHN6LkdldFB0cigpLCBscHN6LkdldExlbmd0aCgpKTsKK2ludDMyX3QgSUZYX0J1ZmZlckFyY2hpdmU6OkFwcGVuZFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3opIHsKKyAgcmV0dXJuIEFwcGVuZEJsb2NrKGxwc3ouR2V0UHRyKCksIGxwc3ouR2V0TGVuZ3RoKCkpOwogfQogQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpDRlhfRmlsZUJ1ZmZlckFyY2hpdmUoRlhfU1RSU0laRSBzaXplKQotICAgIDogSUZYX0J1ZmZlckFyY2hpdmUoc2l6ZSkKLSAgICAsIG1fcEZpbGUoTlVMTCkKLSAgICAsIG1fYlRha2VvdmVyKEZBTFNFKQoteworICAgIDogSUZYX0J1ZmZlckFyY2hpdmUoc2l6ZSksIG1fcEZpbGUoTlVMTCksIG1fYlRha2VvdmVyKEZBTFNFKSB7fQorQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjp+Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKCkgeworICBDbGVhcigpOwogfQotQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjp+Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKCkKLXsKLSAgICBDbGVhcigpOwordm9pZCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkNsZWFyKCkgeworICBpZiAobV9wRmlsZSAmJiBtX2JUYWtlb3ZlcikgeworICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKKyAgfQorICBtX3BGaWxlID0gTlVMTDsKKyAgbV9iVGFrZW92ZXIgPSBGQUxTRTsKKyAgSUZYX0J1ZmZlckFyY2hpdmU6OkNsZWFyKCk7CiB9Ci12b2lkIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6Q2xlYXIoKQotewotICAgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7Ci0gICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbV9wRmlsZSA9IE5VTEw7Ci0gICAgbV9iVGFrZW92ZXIgPSBGQUxTRTsKLSAgICBJRlhfQnVmZmVyQXJjaGl2ZTo6Q2xlYXIoKTsKK0ZYX0JPT0wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpBdHRhY2hGaWxlKElGWF9TdHJlYW1Xcml0ZSogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUYWtlb3ZlcikgeworICBpZiAoIXBGaWxlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7CisgICAgbV9wRmlsZS0+UmVsZWFzZSgpOworICB9CisgIG1fcEZpbGUgPSBwRmlsZTsKKyAgbV9iVGFrZW92ZXIgPSBiVGFrZW92ZXI7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoSUZYX1N0cmVhbVdyaXRlICpwRmlsZSwgRlhfQk9PTCBiVGFrZW92ZXIgKQotewotICAgIGlmICghcEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wRmlsZSAmJiBtX2JUYWtlb3ZlcikgewotICAgICAgICBtX3BGaWxlLT5SZWxlYXNlKCk7Ci0gICAgfQotICAgIG1fcEZpbGUgPSBwRmlsZTsKLSAgICBtX2JUYWtlb3ZlciA9IGJUYWtlb3ZlcjsKK0ZYX0JPT0wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpBdHRhY2hGaWxlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSkgeworICBpZiAoIWZpbGVuYW1lKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7CisgICAgbV9wRmlsZS0+UmVsZWFzZSgpOworICB9CisgIG1fcEZpbGUgPSBGWF9DcmVhdGVGaWxlV3JpdGUoZmlsZW5hbWUpOworICBpZiAoIW1fcEZpbGUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9iVGFrZW92ZXIgPSBUUlVFOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpBdHRhY2hGaWxlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lKSB7CisgIGlmICghZmlsZW5hbWUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcEZpbGUgJiYgbV9iVGFrZW92ZXIpIHsKKyAgICBtX3BGaWxlLT5SZWxlYXNlKCk7CisgIH0KKyAgbV9wRmlsZSA9IEZYX0NyZWF0ZUZpbGVXcml0ZShmaWxlbmFtZSk7CisgIGlmICghbV9wRmlsZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX2JUYWtlb3ZlciA9IFRSVUU7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkRvV29yayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoIW1fcEZpbGUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFwQnVmIHx8IHNpemUgPCAxKSB7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6QXR0YWNoRmlsZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUpCi17Ci0gICAgaWYgKCFmaWxlbmFtZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7Ci0gICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbV9wRmlsZSA9IEZYX0NyZWF0ZUZpbGVXcml0ZShmaWxlbmFtZSk7Ci0gICAgaWYgKCFtX3BGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9iVGFrZW92ZXIgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpCi17Ci0gICAgaWYgKCFmaWxlbmFtZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7Ci0gICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbV9wRmlsZSA9IEZYX0NyZWF0ZUZpbGVXcml0ZShmaWxlbmFtZSk7Ci0gICAgaWYgKCFtX3BGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9iVGFrZW92ZXIgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkRvV29yayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBpZiAoIW1fcEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIXBCdWYgfHwgc2l6ZSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBtX3BGaWxlLT5Xcml0ZUJsb2NrKHBCdWYsIHNpemUpOworICB9CisgIHJldHVybiBtX3BGaWxlLT5Xcml0ZUJsb2NrKHBCdWYsIHNpemUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfY29vcmRzLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2Nvb3Jkcy5jcHAKaW5kZXggMmU4MzA4MC4uNGI1NzBjNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfY29vcmRzLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19jb29yZHMuY3BwCkBAIC05LDU2MSArOSw1MzEgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9leHQuaCIKIAotdm9pZCBGWF9SRUNUOjpOb3JtYWxpemUoKQotewotICAgIGlmIChsZWZ0ID4gcmlnaHQpIHsKLSAgICAgICAgaW50IHRlbXAgPSBsZWZ0OwotICAgICAgICBsZWZ0ID0gcmlnaHQ7Ci0gICAgICAgIHJpZ2h0ID0gdGVtcDsKLSAgICB9Ci0gICAgaWYgKHRvcCA+IGJvdHRvbSkgewotICAgICAgICBpbnQgdGVtcCA9IHRvcDsKLSAgICAgICAgdG9wID0gYm90dG9tOwotICAgICAgICBib3R0b20gPSB0ZW1wOwotICAgIH0KK3ZvaWQgRlhfUkVDVDo6Tm9ybWFsaXplKCkgeworICBpZiAobGVmdCA+IHJpZ2h0KSB7CisgICAgaW50IHRlbXAgPSBsZWZ0OworICAgIGxlZnQgPSByaWdodDsKKyAgICByaWdodCA9IHRlbXA7CisgIH0KKyAgaWYgKHRvcCA+IGJvdHRvbSkgeworICAgIGludCB0ZW1wID0gdG9wOworICAgIHRvcCA9IGJvdHRvbTsKKyAgICBib3R0b20gPSB0ZW1wOworICB9CiB9Ci12b2lkIEZYX1JFQ1Q6OkludGVyc2VjdChjb25zdCBGWF9SRUNUJiBzcmMpCi17Ci0gICAgRlhfUkVDVCBzcmNfbiA9IHNyYzsKLSAgICBzcmNfbi5Ob3JtYWxpemUoKTsKLSAgICBOb3JtYWxpemUoKTsKLSAgICBsZWZ0ID0gbGVmdCA+IHNyY19uLmxlZnQgPyBsZWZ0IDogc3JjX24ubGVmdDsKLSAgICB0b3AgPSB0b3AgPiBzcmNfbi50b3AgPyB0b3AgOiBzcmNfbi50b3A7Ci0gICAgcmlnaHQgPSByaWdodCA8IHNyY19uLnJpZ2h0ID8gcmlnaHQgOiBzcmNfbi5yaWdodDsKLSAgICBib3R0b20gPSBib3R0b20gPCBzcmNfbi5ib3R0b20gPyBib3R0b20gOiBzcmNfbi5ib3R0b207Ci0gICAgaWYgKGxlZnQgPiByaWdodCB8fCB0b3AgPiBib3R0b20pIHsKLSAgICAgICAgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMDsKLSAgICB9Cit2b2lkIEZYX1JFQ1Q6OkludGVyc2VjdChjb25zdCBGWF9SRUNUJiBzcmMpIHsKKyAgRlhfUkVDVCBzcmNfbiA9IHNyYzsKKyAgc3JjX24uTm9ybWFsaXplKCk7CisgIE5vcm1hbGl6ZSgpOworICBsZWZ0ID0gbGVmdCA+IHNyY19uLmxlZnQgPyBsZWZ0IDogc3JjX24ubGVmdDsKKyAgdG9wID0gdG9wID4gc3JjX24udG9wID8gdG9wIDogc3JjX24udG9wOworICByaWdodCA9IHJpZ2h0IDwgc3JjX24ucmlnaHQgPyByaWdodCA6IHNyY19uLnJpZ2h0OworICBib3R0b20gPSBib3R0b20gPCBzcmNfbi5ib3R0b20gPyBib3R0b20gOiBzcmNfbi5ib3R0b207CisgIGlmIChsZWZ0ID4gcmlnaHQgfHwgdG9wID4gYm90dG9tKSB7CisgICAgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMDsKKyAgfQogfQotdm9pZCBGWF9SRUNUOjpVbmlvbihjb25zdCBGWF9SRUNUJiBvdGhlcl9yZWN0KQotewotICAgIE5vcm1hbGl6ZSgpOwotICAgIEZYX1JFQ1Qgb3RoZXIgPSBvdGhlcl9yZWN0OwotICAgIG90aGVyLk5vcm1hbGl6ZSgpOwotICAgIGxlZnQgPSBsZWZ0IDwgb3RoZXIubGVmdCA/IGxlZnQgOiBvdGhlci5sZWZ0OwotICAgIHJpZ2h0ID0gcmlnaHQgPiBvdGhlci5yaWdodCA/IHJpZ2h0IDogb3RoZXIucmlnaHQ7Ci0gICAgYm90dG9tID0gYm90dG9tID4gb3RoZXIuYm90dG9tID8gYm90dG9tIDogb3RoZXIuYm90dG9tOwotICAgIHRvcCA9IHRvcCA8IG90aGVyLnRvcCA/IHRvcCA6IG90aGVyLnRvcDsKK3ZvaWQgRlhfUkVDVDo6VW5pb24oY29uc3QgRlhfUkVDVCYgb3RoZXJfcmVjdCkgeworICBOb3JtYWxpemUoKTsKKyAgRlhfUkVDVCBvdGhlciA9IG90aGVyX3JlY3Q7CisgIG90aGVyLk5vcm1hbGl6ZSgpOworICBsZWZ0ID0gbGVmdCA8IG90aGVyLmxlZnQgPyBsZWZ0IDogb3RoZXIubGVmdDsKKyAgcmlnaHQgPSByaWdodCA+IG90aGVyLnJpZ2h0ID8gcmlnaHQgOiBvdGhlci5yaWdodDsKKyAgYm90dG9tID0gYm90dG9tID4gb3RoZXIuYm90dG9tID8gYm90dG9tIDogb3RoZXIuYm90dG9tOworICB0b3AgPSB0b3AgPCBvdGhlci50b3AgPyB0b3AgOiBvdGhlci50b3A7CiB9Ci1GWF9CT09MIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLCBGWF9GTE9BVCBoaWdoMSwgRlhfRkxPQVQgbG93MiwgRlhfRkxPQVQgaGlnaDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaW50ZXJsb3csIEZYX0ZMT0FUJiBpbnRlcmhpZ2gpCi17Ci0gICAgaWYgKGxvdzEgPj0gaGlnaDIgfHwgbG93MiA+PSBoaWdoMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludGVybG93ID0gbG93MSA+IGxvdzIgPyBsb3cxIDogbG93MjsKLSAgICBpbnRlcmhpZ2ggPSBoaWdoMSA+IGhpZ2gyID8gaGlnaDIgOiBoaWdoMTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLWV4dGVybiAiQyIgaW50IEZYU1lTX3JvdW5kKEZYX0ZMT0FUIGQpCi17Ci0gICAgaWYgKGQgPCAoRlhfRkxPQVQpSU5UX01JTikgewotICAgICAgICByZXR1cm4gSU5UX01JTjsKLSAgICB9Ci0gICAgaWYgKGQgPiAoRlhfRkxPQVQpSU5UX01BWCkgewotICAgICAgICByZXR1cm4gSU5UX01BWDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKGludClyb3VuZChkKTsKLX0KLUNGWF9GbG9hdFJlY3Q6OkNGWF9GbG9hdFJlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCkKLXsKLSAgICBsZWZ0ID0gKEZYX0ZMT0FUKShyZWN0LmxlZnQpOwotICAgIHJpZ2h0ID0gKEZYX0ZMT0FUKShyZWN0LnJpZ2h0KTsKLSAgICBib3R0b20gPSAoRlhfRkxPQVQpKHJlY3QudG9wKTsKLSAgICB0b3AgPSAoRlhfRkxPQVQpKHJlY3QuYm90dG9tKTsKLX0KLXZvaWQgQ0ZYX0Zsb2F0UmVjdDo6Tm9ybWFsaXplKCkKLXsKLSAgICBGWF9GTE9BVCB0ZW1wOwotICAgIGlmIChsZWZ0ID4gcmlnaHQpIHsKLSAgICAgICAgdGVtcCA9IGxlZnQ7Ci0gICAgICAgIGxlZnQgPSByaWdodDsKLSAgICAgICAgcmlnaHQgPSB0ZW1wOwotICAgIH0KLSAgICBpZiAoYm90dG9tID4gdG9wKSB7Ci0gICAgICAgIHRlbXAgPSB0b3A7Ci0gICAgICAgIHRvcCA9IGJvdHRvbTsKLSAgICAgICAgYm90dG9tID0gdGVtcDsKLSAgICB9Ci19Ci12b2lkIENGWF9GbG9hdFJlY3Q6OkludGVyc2VjdChjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KQotewotICAgIE5vcm1hbGl6ZSgpOwotICAgIENGWF9GbG9hdFJlY3Qgb3RoZXIgPSBvdGhlcl9yZWN0OwotICAgIG90aGVyLk5vcm1hbGl6ZSgpOwotICAgIGxlZnQgPSBsZWZ0ID4gb3RoZXIubGVmdCA/IGxlZnQgOiBvdGhlci5sZWZ0OwotICAgIHJpZ2h0ID0gcmlnaHQgPCBvdGhlci5yaWdodCA/IHJpZ2h0IDogb3RoZXIucmlnaHQ7Ci0gICAgYm90dG9tID0gYm90dG9tID4gb3RoZXIuYm90dG9tID8gYm90dG9tIDogb3RoZXIuYm90dG9tOwotICAgIHRvcCA9IHRvcCA8IG90aGVyLnRvcCA/IHRvcCA6IG90aGVyLnRvcDsKLSAgICBpZiAobGVmdCA+IHJpZ2h0IHx8IGJvdHRvbSA+IHRvcCkgewotICAgICAgICBsZWZ0ID0gcmlnaHQgPSBib3R0b20gPSB0b3AgPSAwOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0Zsb2F0UmVjdDo6VW5pb24oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkKLXsKLSAgICBOb3JtYWxpemUoKTsKLSAgICBDRlhfRmxvYXRSZWN0IG90aGVyID0gb3RoZXJfcmVjdDsKLSAgICBvdGhlci5Ob3JtYWxpemUoKTsKLSAgICBsZWZ0ID0gbGVmdCA8IG90aGVyLmxlZnQgPyBsZWZ0IDogb3RoZXIubGVmdDsKLSAgICByaWdodCA9IHJpZ2h0ID4gb3RoZXIucmlnaHQgPyByaWdodCA6IG90aGVyLnJpZ2h0OwotICAgIGJvdHRvbSA9IGJvdHRvbSA8IG90aGVyLmJvdHRvbSA/IGJvdHRvbSA6IG90aGVyLmJvdHRvbTsKLSAgICB0b3AgPSB0b3AgPiBvdGhlci50b3AgPyB0b3AgOiBvdGhlci50b3A7Ci19Ci12b2lkIENGWF9GbG9hdFJlY3Q6OlRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KQotewotICAgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QobGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKTsKLX0KLWludCBDRlhfRmxvYXRSZWN0OjpTdWJzdHJhY3Q0KENGWF9GbG9hdFJlY3QmIHMsIENGWF9GbG9hdFJlY3QqIHBSZWN0cykKLXsKLSAgICBOb3JtYWxpemUoKTsKLSAgICBzLk5vcm1hbGl6ZSgpOwotICAgIGludCBuUmVjdHMgPSAwOwotICAgIENGWF9GbG9hdFJlY3QgcmVjdHNbNF07Ci0gICAgaWYgKGxlZnQgPCBzLmxlZnQpIHsKLSAgICAgICAgcmVjdHNbblJlY3RzXS5sZWZ0ID0gbGVmdDsKLSAgICAgICAgcmVjdHNbblJlY3RzXS5yaWdodCA9IHMubGVmdDsKLSAgICAgICAgcmVjdHNbblJlY3RzXS5ib3R0b20gPSBib3R0b207Ci0gICAgICAgIHJlY3RzW25SZWN0c10udG9wID0gdG9wOwotICAgICAgICBuUmVjdHMgKys7Ci0gICAgfQotICAgIGlmIChzLmxlZnQgPCByaWdodCAmJiBzLnRvcCA8IHRvcCkgewotICAgICAgICByZWN0c1tuUmVjdHNdLmxlZnQgPSBzLmxlZnQ7Ci0gICAgICAgIHJlY3RzW25SZWN0c10ucmlnaHQgPSByaWdodDsKLSAgICAgICAgcmVjdHNbblJlY3RzXS5ib3R0b20gPSBzLnRvcDsKLSAgICAgICAgcmVjdHNbblJlY3RzXS50b3AgPSB0b3A7Ci0gICAgICAgIG5SZWN0cyArKzsKLSAgICB9Ci0gICAgaWYgKHMudG9wID4gYm90dG9tICYmIHMucmlnaHQgPCByaWdodCkgewotICAgICAgICByZWN0c1tuUmVjdHNdLmxlZnQgPSBzLnJpZ2h0OwotICAgICAgICByZWN0c1tuUmVjdHNdLnJpZ2h0ID0gcmlnaHQ7Ci0gICAgICAgIHJlY3RzW25SZWN0c10uYm90dG9tID0gYm90dG9tOwotICAgICAgICByZWN0c1tuUmVjdHNdLnRvcCA9IHMudG9wOwotICAgICAgICBuUmVjdHMgKys7Ci0gICAgfQotICAgIGlmIChzLmJvdHRvbSA+IGJvdHRvbSkgewotICAgICAgICByZWN0c1tuUmVjdHNdLmxlZnQgPSBzLmxlZnQ7Ci0gICAgICAgIHJlY3RzW25SZWN0c10ucmlnaHQgPSBzLnJpZ2h0OwotICAgICAgICByZWN0c1tuUmVjdHNdLmJvdHRvbSA9IGJvdHRvbTsKLSAgICAgICAgcmVjdHNbblJlY3RzXS50b3AgPSBzLmJvdHRvbTsKLSAgICAgICAgblJlY3RzICsrOwotICAgIH0KLSAgICBpZiAoblJlY3RzID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblJlY3RzOyBpICsrKSB7Ci0gICAgICAgIHBSZWN0c1tpXSA9IHJlY3RzW2ldOwotICAgICAgICBwUmVjdHNbaV0uSW50ZXJzZWN0KCp0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5SZWN0czsKLX0KLUZYX1JFQ1QgQ0ZYX0Zsb2F0UmVjdDo6R2V0T3V0dGVyUmVjdCgpIGNvbnN0Ci17Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0MSA9ICp0aGlzOwotICAgIEZYX1JFQ1QgcmVjdDsKLSAgICByZWN0LmxlZnQgPSAoaW50KUZYU1lTX2Zsb29yKHJlY3QxLmxlZnQpOwotICAgIHJlY3QucmlnaHQgPSAoaW50KUZYU1lTX2NlaWwocmVjdDEucmlnaHQpOwotICAgIHJlY3QudG9wID0gKGludClGWFNZU19mbG9vcihyZWN0MS5ib3R0b20pOwotICAgIHJlY3QuYm90dG9tID0gKGludClGWFNZU19jZWlsKHJlY3QxLnRvcCk7Ci0gICAgcmVjdC5Ob3JtYWxpemUoKTsKLSAgICByZXR1cm4gcmVjdDsKLX0KLUZYX1JFQ1QgQ0ZYX0Zsb2F0UmVjdDo6R2V0SW5uZXJSZWN0KCkgY29uc3QKLXsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QxID0gKnRoaXM7Ci0gICAgRlhfUkVDVCByZWN0OwotICAgIHJlY3QubGVmdCA9IChpbnQpRlhTWVNfY2VpbChyZWN0MS5sZWZ0KTsKLSAgICByZWN0LnJpZ2h0ID0gKGludClGWFNZU19mbG9vcihyZWN0MS5yaWdodCk7Ci0gICAgcmVjdC50b3AgPSAoaW50KUZYU1lTX2NlaWwocmVjdDEuYm90dG9tKTsKLSAgICByZWN0LmJvdHRvbSA9IChpbnQpRlhTWVNfZmxvb3IocmVjdDEudG9wKTsKLSAgICByZWN0Lk5vcm1hbGl6ZSgpOwotICAgIHJldHVybiByZWN0OwotfQotc3RhdGljIHZvaWQgX01hdGNoRmxvYXRSYW5nZShGWF9GTE9BVCBmMSwgRlhfRkxPQVQgZjIsIGludCYgaTEsIGludCYgaTIpCi17Ci0gICAgaW50IGxlbmd0aCA9IChpbnQpRlhTWVNfY2VpbChmMiAtIGYxKTsKLSAgICBpbnQgaTFfMSA9IChpbnQpRlhTWVNfZmxvb3IoZjEpOwotICAgIGludCBpMV8yID0gKGludClGWFNZU19jZWlsKGYxKTsKLSAgICBGWF9GTE9BVCBlcnJvcjEgPSBmMSAtIGkxXzEgKyAoRlhfRkxPQVQpRlhTWVNfZmFicyhmMiAtIGkxXzEgLSBsZW5ndGgpOwotICAgIEZYX0ZMT0FUIGVycm9yMiA9IGkxXzIgLSBmMSArIChGWF9GTE9BVClGWFNZU19mYWJzKGYyIC0gaTFfMiAtIGxlbmd0aCk7Ci0gICAgaTEgPSAoZXJyb3IxID4gZXJyb3IyKSA/IGkxXzIgOiBpMV8xOwotICAgIGkyID0gaTEgKyBsZW5ndGg7Ci19Ci1GWF9SRUNUIENGWF9GbG9hdFJlY3Q6OkdldENsb3Nlc3RSZWN0KCkgY29uc3QKLXsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QxID0gKnRoaXM7Ci0gICAgRlhfUkVDVCByZWN0OwotICAgIF9NYXRjaEZsb2F0UmFuZ2UocmVjdDEubGVmdCwgcmVjdDEucmlnaHQsIHJlY3QubGVmdCwgcmVjdC5yaWdodCk7Ci0gICAgX01hdGNoRmxvYXRSYW5nZShyZWN0MS5ib3R0b20sIHJlY3QxLnRvcCwgcmVjdC50b3AsIHJlY3QuYm90dG9tKTsKLSAgICByZWN0Lk5vcm1hbGl6ZSgpOwotICAgIHJldHVybiByZWN0OwotfQotRlhfQk9PTCBDRlhfRmxvYXRSZWN0OjpDb250YWlucyhjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KSBjb25zdAotewotICAgIENGWF9GbG9hdFJlY3QgbjEgPSAqdGhpczsKLSAgICBuMS5Ob3JtYWxpemUoKTsKLSAgICBDRlhfRmxvYXRSZWN0IG4yID0gb3RoZXJfcmVjdDsKLSAgICBuMi5Ob3JtYWxpemUoKTsKLSAgICBpZiAobjIubGVmdCA+PSBuMS5sZWZ0ICYmIG4yLnJpZ2h0IDw9IG4xLnJpZ2h0ICYmIG4yLmJvdHRvbSA+PSBuMS5ib3R0b20gJiYgbjIudG9wIDw9IG4xLnRvcCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9CitGWF9CT09MIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGlnaDEsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb3cyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGlnaDIsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaW50ZXJsb3csCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaW50ZXJoaWdoKSB7CisgIGlmIChsb3cxID49IGhpZ2gyIHx8IGxvdzIgPj0gaGlnaDEpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50ZXJsb3cgPSBsb3cxID4gbG93MiA/IGxvdzEgOiBsb3cyOworICBpbnRlcmhpZ2ggPSBoaWdoMSA+IGhpZ2gyID8gaGlnaDIgOiBoaWdoMTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENGWF9GbG9hdFJlY3Q6OkNvbnRhaW5zKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIGNvbnN0Ci17Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBuMSA9ICp0aGlzOwotICAgIG4xLk5vcm1hbGl6ZSgpOwotICAgIHJldHVybiB4IDw9IG4xLnJpZ2h0ICYmIHggPj0gbjEubGVmdCAmJiB5IDw9IG4xLnRvcCAmJiB5ID49IG4xLmJvdHRvbTsKK2V4dGVybiAiQyIgaW50IEZYU1lTX3JvdW5kKEZYX0ZMT0FUIGQpIHsKKyAgaWYgKGQgPCAoRlhfRkxPQVQpSU5UX01JTikgeworICAgIHJldHVybiBJTlRfTUlOOworICB9CisgIGlmIChkID4gKEZYX0ZMT0FUKUlOVF9NQVgpIHsKKyAgICByZXR1cm4gSU5UX01BWDsKKyAgfQorCisgIHJldHVybiAoaW50KXJvdW5kKGQpOwogfQotdm9pZCBDRlhfRmxvYXRSZWN0OjpVcGRhdGVSZWN0KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpCi17Ci0gICAgaWYgKGxlZnQgPiB4KSB7Ci0gICAgICAgIGxlZnQgPSB4OwotICAgIH0KLSAgICBpZiAocmlnaHQgPCB4KSB7Ci0gICAgICAgIHJpZ2h0ID0geDsKLSAgICB9Ci0gICAgaWYgKGJvdHRvbSA+IHkpIHsKLSAgICAgICAgYm90dG9tID0geTsKLSAgICB9Ci0gICAgaWYgKHRvcCA8IHkpIHsKLSAgICAgICAgdG9wID0geTsKLSAgICB9CitDRlhfRmxvYXRSZWN0OjpDRlhfRmxvYXRSZWN0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpIHsKKyAgbGVmdCA9IChGWF9GTE9BVCkocmVjdC5sZWZ0KTsKKyAgcmlnaHQgPSAoRlhfRkxPQVQpKHJlY3QucmlnaHQpOworICBib3R0b20gPSAoRlhfRkxPQVQpKHJlY3QudG9wKTsKKyAgdG9wID0gKEZYX0ZMT0FUKShyZWN0LmJvdHRvbSk7CiB9Ci1DRlhfRmxvYXRSZWN0IENGWF9GbG9hdFJlY3Q6OkdldEJCb3goY29uc3QgQ0ZYX0Zsb2F0UG9pbnQqIHBQb2ludHMsIGludCBuUG9pbnRzKQotewotICAgIGlmIChuUG9pbnRzID09IDApIHsKLSAgICAgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoKTsKK3ZvaWQgQ0ZYX0Zsb2F0UmVjdDo6Tm9ybWFsaXplKCkgeworICBGWF9GTE9BVCB0ZW1wOworICBpZiAobGVmdCA+IHJpZ2h0KSB7CisgICAgdGVtcCA9IGxlZnQ7CisgICAgbGVmdCA9IHJpZ2h0OworICAgIHJpZ2h0ID0gdGVtcDsKKyAgfQorICBpZiAoYm90dG9tID4gdG9wKSB7CisgICAgdGVtcCA9IHRvcDsKKyAgICB0b3AgPSBib3R0b207CisgICAgYm90dG9tID0gdGVtcDsKKyAgfQorfQordm9pZCBDRlhfRmxvYXRSZWN0OjpJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgeworICBOb3JtYWxpemUoKTsKKyAgQ0ZYX0Zsb2F0UmVjdCBvdGhlciA9IG90aGVyX3JlY3Q7CisgIG90aGVyLk5vcm1hbGl6ZSgpOworICBsZWZ0ID0gbGVmdCA+IG90aGVyLmxlZnQgPyBsZWZ0IDogb3RoZXIubGVmdDsKKyAgcmlnaHQgPSByaWdodCA8IG90aGVyLnJpZ2h0ID8gcmlnaHQgOiBvdGhlci5yaWdodDsKKyAgYm90dG9tID0gYm90dG9tID4gb3RoZXIuYm90dG9tID8gYm90dG9tIDogb3RoZXIuYm90dG9tOworICB0b3AgPSB0b3AgPCBvdGhlci50b3AgPyB0b3AgOiBvdGhlci50b3A7CisgIGlmIChsZWZ0ID4gcmlnaHQgfHwgYm90dG9tID4gdG9wKSB7CisgICAgbGVmdCA9IHJpZ2h0ID0gYm90dG9tID0gdG9wID0gMDsKKyAgfQorfQordm9pZCBDRlhfRmxvYXRSZWN0OjpVbmlvbihjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KSB7CisgIE5vcm1hbGl6ZSgpOworICBDRlhfRmxvYXRSZWN0IG90aGVyID0gb3RoZXJfcmVjdDsKKyAgb3RoZXIuTm9ybWFsaXplKCk7CisgIGxlZnQgPSBsZWZ0IDwgb3RoZXIubGVmdCA/IGxlZnQgOiBvdGhlci5sZWZ0OworICByaWdodCA9IHJpZ2h0ID4gb3RoZXIucmlnaHQgPyByaWdodCA6IG90aGVyLnJpZ2h0OworICBib3R0b20gPSBib3R0b20gPCBvdGhlci5ib3R0b20gPyBib3R0b20gOiBvdGhlci5ib3R0b207CisgIHRvcCA9IHRvcCA+IG90aGVyLnRvcCA/IHRvcCA6IG90aGVyLnRvcDsKK30KK3ZvaWQgQ0ZYX0Zsb2F0UmVjdDo6VHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKKyAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pOworfQoraW50IENGWF9GbG9hdFJlY3Q6OlN1YnN0cmFjdDQoQ0ZYX0Zsb2F0UmVjdCYgcywgQ0ZYX0Zsb2F0UmVjdCogcFJlY3RzKSB7CisgIE5vcm1hbGl6ZSgpOworICBzLk5vcm1hbGl6ZSgpOworICBpbnQgblJlY3RzID0gMDsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0c1s0XTsKKyAgaWYgKGxlZnQgPCBzLmxlZnQpIHsKKyAgICByZWN0c1tuUmVjdHNdLmxlZnQgPSBsZWZ0OworICAgIHJlY3RzW25SZWN0c10ucmlnaHQgPSBzLmxlZnQ7CisgICAgcmVjdHNbblJlY3RzXS5ib3R0b20gPSBib3R0b207CisgICAgcmVjdHNbblJlY3RzXS50b3AgPSB0b3A7CisgICAgblJlY3RzKys7CisgIH0KKyAgaWYgKHMubGVmdCA8IHJpZ2h0ICYmIHMudG9wIDwgdG9wKSB7CisgICAgcmVjdHNbblJlY3RzXS5sZWZ0ID0gcy5sZWZ0OworICAgIHJlY3RzW25SZWN0c10ucmlnaHQgPSByaWdodDsKKyAgICByZWN0c1tuUmVjdHNdLmJvdHRvbSA9IHMudG9wOworICAgIHJlY3RzW25SZWN0c10udG9wID0gdG9wOworICAgIG5SZWN0cysrOworICB9CisgIGlmIChzLnRvcCA+IGJvdHRvbSAmJiBzLnJpZ2h0IDwgcmlnaHQpIHsKKyAgICByZWN0c1tuUmVjdHNdLmxlZnQgPSBzLnJpZ2h0OworICAgIHJlY3RzW25SZWN0c10ucmlnaHQgPSByaWdodDsKKyAgICByZWN0c1tuUmVjdHNdLmJvdHRvbSA9IGJvdHRvbTsKKyAgICByZWN0c1tuUmVjdHNdLnRvcCA9IHMudG9wOworICAgIG5SZWN0cysrOworICB9CisgIGlmIChzLmJvdHRvbSA+IGJvdHRvbSkgeworICAgIHJlY3RzW25SZWN0c10ubGVmdCA9IHMubGVmdDsKKyAgICByZWN0c1tuUmVjdHNdLnJpZ2h0ID0gcy5yaWdodDsKKyAgICByZWN0c1tuUmVjdHNdLmJvdHRvbSA9IGJvdHRvbTsKKyAgICByZWN0c1tuUmVjdHNdLnRvcCA9IHMuYm90dG9tOworICAgIG5SZWN0cysrOworICB9CisgIGlmIChuUmVjdHMgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgblJlY3RzOyBpKyspIHsKKyAgICBwUmVjdHNbaV0gPSByZWN0c1tpXTsKKyAgICBwUmVjdHNbaV0uSW50ZXJzZWN0KCp0aGlzKTsKKyAgfQorICByZXR1cm4gblJlY3RzOworfQorRlhfUkVDVCBDRlhfRmxvYXRSZWN0OjpHZXRPdXR0ZXJSZWN0KCkgY29uc3QgeworICBDRlhfRmxvYXRSZWN0IHJlY3QxID0gKnRoaXM7CisgIEZYX1JFQ1QgcmVjdDsKKyAgcmVjdC5sZWZ0ID0gKGludClGWFNZU19mbG9vcihyZWN0MS5sZWZ0KTsKKyAgcmVjdC5yaWdodCA9IChpbnQpRlhTWVNfY2VpbChyZWN0MS5yaWdodCk7CisgIHJlY3QudG9wID0gKGludClGWFNZU19mbG9vcihyZWN0MS5ib3R0b20pOworICByZWN0LmJvdHRvbSA9IChpbnQpRlhTWVNfY2VpbChyZWN0MS50b3ApOworICByZWN0Lk5vcm1hbGl6ZSgpOworICByZXR1cm4gcmVjdDsKK30KK0ZYX1JFQ1QgQ0ZYX0Zsb2F0UmVjdDo6R2V0SW5uZXJSZWN0KCkgY29uc3QgeworICBDRlhfRmxvYXRSZWN0IHJlY3QxID0gKnRoaXM7CisgIEZYX1JFQ1QgcmVjdDsKKyAgcmVjdC5sZWZ0ID0gKGludClGWFNZU19jZWlsKHJlY3QxLmxlZnQpOworICByZWN0LnJpZ2h0ID0gKGludClGWFNZU19mbG9vcihyZWN0MS5yaWdodCk7CisgIHJlY3QudG9wID0gKGludClGWFNZU19jZWlsKHJlY3QxLmJvdHRvbSk7CisgIHJlY3QuYm90dG9tID0gKGludClGWFNZU19mbG9vcihyZWN0MS50b3ApOworICByZWN0Lk5vcm1hbGl6ZSgpOworICByZXR1cm4gcmVjdDsKK30KK3N0YXRpYyB2b2lkIF9NYXRjaEZsb2F0UmFuZ2UoRlhfRkxPQVQgZjEsIEZYX0ZMT0FUIGYyLCBpbnQmIGkxLCBpbnQmIGkyKSB7CisgIGludCBsZW5ndGggPSAoaW50KUZYU1lTX2NlaWwoZjIgLSBmMSk7CisgIGludCBpMV8xID0gKGludClGWFNZU19mbG9vcihmMSk7CisgIGludCBpMV8yID0gKGludClGWFNZU19jZWlsKGYxKTsKKyAgRlhfRkxPQVQgZXJyb3IxID0gZjEgLSBpMV8xICsgKEZYX0ZMT0FUKUZYU1lTX2ZhYnMoZjIgLSBpMV8xIC0gbGVuZ3RoKTsKKyAgRlhfRkxPQVQgZXJyb3IyID0gaTFfMiAtIGYxICsgKEZYX0ZMT0FUKUZYU1lTX2ZhYnMoZjIgLSBpMV8yIC0gbGVuZ3RoKTsKKyAgaTEgPSAoZXJyb3IxID4gZXJyb3IyKSA/IGkxXzIgOiBpMV8xOworICBpMiA9IGkxICsgbGVuZ3RoOworfQorRlhfUkVDVCBDRlhfRmxvYXRSZWN0OjpHZXRDbG9zZXN0UmVjdCgpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0MSA9ICp0aGlzOworICBGWF9SRUNUIHJlY3Q7CisgIF9NYXRjaEZsb2F0UmFuZ2UocmVjdDEubGVmdCwgcmVjdDEucmlnaHQsIHJlY3QubGVmdCwgcmVjdC5yaWdodCk7CisgIF9NYXRjaEZsb2F0UmFuZ2UocmVjdDEuYm90dG9tLCByZWN0MS50b3AsIHJlY3QudG9wLCByZWN0LmJvdHRvbSk7CisgIHJlY3QuTm9ybWFsaXplKCk7CisgIHJldHVybiByZWN0OworfQorRlhfQk9PTCBDRlhfRmxvYXRSZWN0OjpDb250YWlucyhjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KSBjb25zdCB7CisgIENGWF9GbG9hdFJlY3QgbjEgPSAqdGhpczsKKyAgbjEuTm9ybWFsaXplKCk7CisgIENGWF9GbG9hdFJlY3QgbjIgPSBvdGhlcl9yZWN0OworICBuMi5Ob3JtYWxpemUoKTsKKyAgaWYgKG4yLmxlZnQgPj0gbjEubGVmdCAmJiBuMi5yaWdodCA8PSBuMS5yaWdodCAmJiBuMi5ib3R0b20gPj0gbjEuYm90dG9tICYmCisgICAgICBuMi50b3AgPD0gbjEudG9wKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDRlhfRmxvYXRSZWN0OjpDb250YWlucyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSBjb25zdCB7CisgIENGWF9GbG9hdFJlY3QgbjEgPSAqdGhpczsKKyAgbjEuTm9ybWFsaXplKCk7CisgIHJldHVybiB4IDw9IG4xLnJpZ2h0ICYmIHggPj0gbjEubGVmdCAmJiB5IDw9IG4xLnRvcCAmJiB5ID49IG4xLmJvdHRvbTsKK30KK3ZvaWQgQ0ZYX0Zsb2F0UmVjdDo6VXBkYXRlUmVjdChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSB7CisgIGlmIChsZWZ0ID4geCkgeworICAgIGxlZnQgPSB4OworICB9CisgIGlmIChyaWdodCA8IHgpIHsKKyAgICByaWdodCA9IHg7CisgIH0KKyAgaWYgKGJvdHRvbSA+IHkpIHsKKyAgICBib3R0b20gPSB5OworICB9CisgIGlmICh0b3AgPCB5KSB7CisgICAgdG9wID0geTsKKyAgfQorfQorQ0ZYX0Zsb2F0UmVjdCBDRlhfRmxvYXRSZWN0OjpHZXRCQm94KGNvbnN0IENGWF9GbG9hdFBvaW50KiBwUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUG9pbnRzKSB7CisgIGlmIChuUG9pbnRzID09IDApIHsKKyAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgpOworICB9CisgIEZYX0ZMT0FUIG1pbl94ID0gcFBvaW50cy0+eCwgbWF4X3ggPSBwUG9pbnRzLT54LCBtaW5feSA9IHBQb2ludHMtPnksCisgICAgICAgICAgIG1heF95ID0gcFBvaW50cy0+eTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBuUG9pbnRzOyBpKyspIHsKKyAgICBpZiAobWluX3ggPiBwUG9pbnRzW2ldLngpIHsKKyAgICAgIG1pbl94ID0gcFBvaW50c1tpXS54OwogICAgIH0KLSAgICBGWF9GTE9BVCBtaW5feCA9IHBQb2ludHMtPngsIG1heF94ID0gcFBvaW50cy0+eCwgbWluX3kgPSBwUG9pbnRzLT55LCBtYXhfeSA9IHBQb2ludHMtPnk7Ci0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuUG9pbnRzOyBpICsrKSB7Ci0gICAgICAgIGlmIChtaW5feCA+IHBQb2ludHNbaV0ueCkgewotICAgICAgICAgICAgbWluX3ggPSBwUG9pbnRzW2ldLng7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1heF94IDwgcFBvaW50c1tpXS54KSB7Ci0gICAgICAgICAgICBtYXhfeCA9IHBQb2ludHNbaV0ueDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWluX3kgPiBwUG9pbnRzW2ldLnkpIHsKLSAgICAgICAgICAgIG1pbl95ID0gcFBvaW50c1tpXS55OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXhfeSA8IHBQb2ludHNbaV0ueSkgewotICAgICAgICAgICAgbWF4X3kgPSBwUG9pbnRzW2ldLnk7Ci0gICAgICAgIH0KKyAgICBpZiAobWF4X3ggPCBwUG9pbnRzW2ldLngpIHsKKyAgICAgIG1heF94ID0gcFBvaW50c1tpXS54OwogICAgIH0KLSAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdChtaW5feCwgbWluX3ksIG1heF94LCBtYXhfeSk7CisgICAgaWYgKG1pbl95ID4gcFBvaW50c1tpXS55KSB7CisgICAgICBtaW5feSA9IHBQb2ludHNbaV0ueTsKKyAgICB9CisgICAgaWYgKG1heF95IDwgcFBvaW50c1tpXS55KSB7CisgICAgICBtYXhfeSA9IHBQb2ludHNbaV0ueTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENGWF9GbG9hdFJlY3QobWluX3gsIG1pbl95LCBtYXhfeCwgbWF4X3kpOwogfQogdm9pZCBDRlhfTWF0cml4OjpTZXQoRlhfRkxPQVQgb3RoZXJfYSwKICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2IsCiAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl9jLAogICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfZCwKICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2UsCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl9mKQotewotICAgIGEgPSBvdGhlcl9hOwotICAgIGIgPSBvdGhlcl9iOwotICAgIGMgPSBvdGhlcl9jOwotICAgIGQgPSBvdGhlcl9kOwotICAgIGUgPSBvdGhlcl9lOwotICAgIGYgPSBvdGhlcl9mOworICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfZikgeworICBhID0gb3RoZXJfYTsKKyAgYiA9IG90aGVyX2I7CisgIGMgPSBvdGhlcl9jOworICBkID0gb3RoZXJfZDsKKyAgZSA9IG90aGVyX2U7CisgIGYgPSBvdGhlcl9mOwogfQotdm9pZCBDRlhfTWF0cml4OjpTZXQoY29uc3QgRlhfRkxPQVQgbls2XSkKLXsKLSAgICBhID0gblswXTsKLSAgICBiID0gblsxXTsKLSAgICBjID0gblsyXTsKLSAgICBkID0gblszXTsKLSAgICBlID0gbls0XTsKLSAgICBmID0gbls1XTsKK3ZvaWQgQ0ZYX01hdHJpeDo6U2V0KGNvbnN0IEZYX0ZMT0FUIG5bNl0pIHsKKyAgYSA9IG5bMF07CisgIGIgPSBuWzFdOworICBjID0gblsyXTsKKyAgZCA9IG5bM107CisgIGUgPSBuWzRdOworICBmID0gbls1XTsKIH0KLXZvaWQgQ0ZYX01hdHJpeDo6U2V0UmV2ZXJzZShjb25zdCBDRlhfTWF0cml4ICZtKQotewotICAgIEZYX0ZMT0FUIGkgPSBtLmEgKiBtLmQgLSBtLmIgKiBtLmM7Ci0gICAgaWYgKEZYU1lTX2ZhYnMoaSkgPT0gMCkgewotICAgICAgICByZXR1cm47Cit2b2lkIENGWF9NYXRyaXg6OlNldFJldmVyc2UoY29uc3QgQ0ZYX01hdHJpeCYgbSkgeworICBGWF9GTE9BVCBpID0gbS5hICogbS5kIC0gbS5iICogbS5jOworICBpZiAoRlhTWVNfZmFicyhpKSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0ZMT0FUIGogPSAtaTsKKyAgYSA9IG0uZCAvIGk7CisgIGIgPSBtLmIgLyBqOworICBjID0gbS5jIC8gajsKKyAgZCA9IG0uYSAvIGk7CisgIGUgPSAobS5jICogbS5mIC0gbS5kICogbS5lKSAvIGk7CisgIGYgPSAobS5hICogbS5mIC0gbS5iICogbS5lKSAvIGo7Cit9CitzdGF0aWMgdm9pZCBGWENSVF9NYXRyaXhfQ29uY2F0KENGWF9NYXRyaXgmIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtMikgeworICBGWF9GTE9BVCBhYSA9IG0xLmEgKiBtMi5hICsgbTEuYiAqIG0yLmM7CisgIEZYX0ZMT0FUIGJiID0gbTEuYSAqIG0yLmIgKyBtMS5iICogbTIuZDsKKyAgRlhfRkxPQVQgY2MgPSBtMS5jICogbTIuYSArIG0xLmQgKiBtMi5jOworICBGWF9GTE9BVCBkZCA9IG0xLmMgKiBtMi5iICsgbTEuZCAqIG0yLmQ7CisgIEZYX0ZMT0FUIGVlID0gbTEuZSAqIG0yLmEgKyBtMS5mICogbTIuYyArIG0yLmU7CisgIEZYX0ZMT0FUIGZmID0gbTEuZSAqIG0yLmIgKyBtMS5mICogbTIuZCArIG0yLmY7CisgIG0uYSA9IGFhLCBtLmIgPSBiYiwgbS5jID0gY2MsIG0uZCA9IGRkLCBtLmUgPSBlZSwgbS5mID0gZmY7Cit9Cit2b2lkIENGWF9NYXRyaXg6OkNvbmNhdChGWF9GTE9BVCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGMsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGYsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmVwZW5kZWQpIHsKKyAgQ0ZYX01hdHJpeCBtOworICBtLlNldChhLCBiLCBjLCBkLCBlLCBmKTsKKyAgQ29uY2F0KG0sIGJQcmVwZW5kZWQpOworfQordm9pZCBDRlhfTWF0cml4OjpDb25jYXQoY29uc3QgQ0ZYX01hdHJpeCYgbSwgRlhfQk9PTCBiUHJlcGVuZGVkKSB7CisgIGlmIChiUHJlcGVuZGVkKSB7CisgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgbSwgKnRoaXMpOworICB9IGVsc2UgeworICAgIEZYQ1JUX01hdHJpeF9Db25jYXQoKnRoaXMsICp0aGlzLCBtKTsKKyAgfQorfQordm9pZCBDRlhfTWF0cml4OjpDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIHNyYywgRlhfQk9PTCBiUHJlcGVuZGVkKSB7CisgIENGWF9NYXRyaXggbTsKKyAgbS5TZXRSZXZlcnNlKHNyYyk7CisgIENvbmNhdChtLCBiUHJlcGVuZGVkKTsKK30KK0ZYX0JPT0wgQ0ZYX01hdHJpeDo6SXNJbnZlcnRpYmxlKCkgY29uc3QgeworICByZXR1cm4gRlhTWVNfZmFicyhhICogZCAtIGIgKiBjKSA+PSAwLjAwMDFmOworfQorRlhfQk9PTCBDRlhfTWF0cml4OjpJczkwUm90YXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIEZYU1lTX2ZhYnMoYSAqIDEwMDApIDwgRlhTWVNfZmFicyhiKSAmJgorICAgICAgICAgRlhTWVNfZmFicyhkICogMTAwMCkgPCBGWFNZU19mYWJzKGMpOworfQorRlhfQk9PTCBDRlhfTWF0cml4OjpJc1NjYWxlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIEZYU1lTX2ZhYnMoYiAqIDEwMDApIDwgRlhTWVNfZmFicyhhKSAmJgorICAgICAgICAgRlhTWVNfZmFicyhjICogMTAwMCkgPCBGWFNZU19mYWJzKGQpOworfQordm9pZCBDRlhfTWF0cml4OjpUcmFuc2xhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfQk9PTCBiUHJlcGVuZGVkKSB7CisgIGlmIChiUHJlcGVuZGVkKSB7CisgICAgZSArPSB4ICogYSArIHkgKiBjOworICAgIGYgKz0geSAqIGQgKyB4ICogYjsKKyAgfSBlbHNlIHsKKyAgICBlICs9IHgsIGYgKz0geTsKKyAgfQorfQordm9pZCBDRlhfTWF0cml4OjpTY2FsZShGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3ksIEZYX0JPT0wgYlByZXBlbmRlZCkgeworICBhICo9IHN4LCBkICo9IHN5OworICBpZiAoYlByZXBlbmRlZCkgeworICAgIGIgKj0gc3g7CisgICAgYyAqPSBzeTsKKyAgfSBlbHNlIHsKKyAgICBiICo9IHN5OworICAgIGMgKj0gc3g7CisgICAgZSAqPSBzeDsKKyAgICBmICo9IHN5OworICB9Cit9Cit2b2lkIENGWF9NYXRyaXg6OlJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQpIHsKKyAgRlhfRkxPQVQgY29zVmFsdWUgPSBGWFNZU19jb3MoZlJhZGlhbik7CisgIEZYX0ZMT0FUIHNpblZhbHVlID0gRlhTWVNfc2luKGZSYWRpYW4pOworICBDRlhfTWF0cml4IG07CisgIG0uU2V0KGNvc1ZhbHVlLCBzaW5WYWx1ZSwgLXNpblZhbHVlLCBjb3NWYWx1ZSwgMCwgMCk7CisgIGlmIChiUHJlcGVuZGVkKSB7CisgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgbSwgKnRoaXMpOworICB9IGVsc2UgeworICAgIEZYQ1JUX01hdHJpeF9Db25jYXQoKnRoaXMsICp0aGlzLCBtKTsKKyAgfQorfQordm9pZCBDRlhfTWF0cml4OjpSb3RhdGVBdChGWF9GTE9BVCBmUmFkaWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByZXBlbmRlZCkgeworICBUcmFuc2xhdGUoZHgsIGR5LCBiUHJlcGVuZGVkKTsKKyAgUm90YXRlKGZSYWRpYW4sIGJQcmVwZW5kZWQpOworICBUcmFuc2xhdGUoLWR4LCAtZHksIGJQcmVwZW5kZWQpOworfQordm9pZCBDRlhfTWF0cml4OjpTaGVhcihGWF9GTE9BVCBmQWxwaGFSYWRpYW4sCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZCZXRhUmFkaWFuLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmVwZW5kZWQpIHsKKyAgQ0ZYX01hdHJpeCBtOworICBtLlNldCgxLCBGWFNZU190YW4oZkFscGhhUmFkaWFuKSwgRlhTWVNfdGFuKGZCZXRhUmFkaWFuKSwgMSwgMCwgMCk7CisgIGlmIChiUHJlcGVuZGVkKSB7CisgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgbSwgKnRoaXMpOworICB9IGVsc2UgeworICAgIEZYQ1JUX01hdHJpeF9Db25jYXQoKnRoaXMsICp0aGlzLCBtKTsKKyAgfQorfQordm9pZCBDRlhfTWF0cml4OjpNYXRjaFJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHNyYykgeworICBGWF9GTE9BVCBmRGlmZiA9IHNyYy5sZWZ0IC0gc3JjLnJpZ2h0OworICBhID0gRlhTWVNfZmFicyhmRGlmZikgPCAwLjAwMWYgPyAxIDogKGRlc3QubGVmdCAtIGRlc3QucmlnaHQpIC8gZkRpZmY7CisgIGZEaWZmID0gc3JjLmJvdHRvbSAtIHNyYy50b3A7CisgIGQgPSBGWFNZU19mYWJzKGZEaWZmKSA8IDAuMDAxZiA/IDEgOiAoZGVzdC5ib3R0b20gLSBkZXN0LnRvcCkgLyBmRGlmZjsKKyAgZSA9IGRlc3QubGVmdCAtIHNyYy5sZWZ0ICogYTsKKyAgZiA9IGRlc3QuYm90dG9tIC0gc3JjLmJvdHRvbSAqIGQ7CisgIGIgPSAwOworICBjID0gMDsKK30KK0ZYX0ZMT0FUIENGWF9NYXRyaXg6OkdldFhVbml0KCkgY29uc3QgeworICBpZiAoYiA9PSAwKSB7CisgICAgcmV0dXJuIChhID4gMCA/IGEgOiAtYSk7CisgIH0KKyAgaWYgKGEgPT0gMCkgeworICAgIHJldHVybiAoYiA+IDAgPyBiIDogLWIpOworICB9CisgIHJldHVybiBGWFNZU19zcXJ0KGEgKiBhICsgYiAqIGIpOworfQorRlhfRkxPQVQgQ0ZYX01hdHJpeDo6R2V0WVVuaXQoKSBjb25zdCB7CisgIGlmIChjID09IDApIHsKKyAgICByZXR1cm4gKGQgPiAwID8gZCA6IC1kKTsKKyAgfQorICBpZiAoZCA9PSAwKSB7CisgICAgcmV0dXJuIChjID4gMCA/IGMgOiAtYyk7CisgIH0KKyAgcmV0dXJuIEZYU1lTX3NxcnQoYyAqIGMgKyBkICogZCk7Cit9Cit2b2lkIENGWF9NYXRyaXg6OkdldFVuaXRSZWN0KENGWF9SZWN0RiYgcmVjdCkgY29uc3QgeworICByZWN0LmxlZnQgPSByZWN0LnRvcCA9IDA7CisgIHJlY3Qud2lkdGggPSByZWN0LmhlaWdodCA9IDE7CisgIFRyYW5zZm9ybVJlY3QocmVjdCk7Cit9CitDRlhfRmxvYXRSZWN0IENGWF9NYXRyaXg6OkdldFVuaXRSZWN0KCkgY29uc3QgeworICBDRlhfRmxvYXRSZWN0IHJlY3QoMCwgMCwgMSwgMSk7CisgIHJlY3QuVHJhbnNmb3JtKChjb25zdCBDRlhfTWF0cml4Kil0aGlzKTsKKyAgcmV0dXJuIHJlY3Q7Cit9CitGWF9GTE9BVCBDRlhfTWF0cml4OjpHZXRVbml0QXJlYSgpIGNvbnN0IHsKKyAgRlhfRkxPQVQgQSA9IEZYU1lTX3NxcnQoYSAqIGEgKyBiICogYik7CisgIEZYX0ZMT0FUIEIgPSBGWFNZU19zcXJ0KGMgKiBjICsgZCAqIGQpOworICBGWF9GTE9BVCBhYyA9IGEgKyBjLCBiZCA9IGIgKyBkOworICBGWF9GTE9BVCBDID0gRlhTWVNfc3FydChhYyAqIGFjICsgYmQgKiBiZCk7CisgIEZYX0ZMT0FUIFAgPSAoQSArIEIgKyBDKSAvIDI7CisgIHJldHVybiBGWFNZU19zcXJ0KFAgKiAoUCAtIEEpICogKFAgLSBCKSAqIChQIC0gQykpICogMjsKK30KK0ZYX0ZMT0FUIENGWF9NYXRyaXg6OlRyYW5zZm9ybVhEaXN0YW5jZShGWF9GTE9BVCBkeCkgY29uc3QgeworICBGWF9GTE9BVCBmeCA9IGEgKiBkeCwgZnkgPSBiICogZHg7CisgIHJldHVybiBGWFNZU19zcXJ0KGZ4ICogZnggKyBmeSAqIGZ5KTsKK30KK2ludDMyX3QgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtWERpc3RhbmNlKGludDMyX3QgZHgpIGNvbnN0IHsKKyAgRlhfRkxPQVQgZnggPSBhICogZHgsIGZ5ID0gYiAqIGR4OworICByZXR1cm4gRlhTWVNfcm91bmQoRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSkpOworfQorRlhfRkxPQVQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtWURpc3RhbmNlKEZYX0ZMT0FUIGR5KSBjb25zdCB7CisgIEZYX0ZMT0FUIGZ4ID0gYyAqIGR5LCBmeSA9IGQgKiBkeTsKKyAgcmV0dXJuIEZYU1lTX3NxcnQoZnggKiBmeCArIGZ5ICogZnkpOworfQoraW50MzJfdCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1ZRGlzdGFuY2UoaW50MzJfdCBkeSkgY29uc3QgeworICBGWF9GTE9BVCBmeCA9IGMgKiBkeSwgZnkgPSBkICogZHk7CisgIHJldHVybiBGWFNZU19yb3VuZChGWFNZU19zcXJ0KGZ4ICogZnggKyBmeSAqIGZ5KSk7Cit9CitGWF9GTE9BVCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1EaXN0YW5jZShGWF9GTE9BVCBkeCwgRlhfRkxPQVQgZHkpIGNvbnN0IHsKKyAgRlhfRkxPQVQgZnggPSBhICogZHggKyBjICogZHksIGZ5ID0gYiAqIGR4ICsgZCAqIGR5OworICByZXR1cm4gRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSk7Cit9CitpbnQzMl90IENGWF9NYXRyaXg6OlRyYW5zZm9ybURpc3RhbmNlKGludDMyX3QgZHgsIGludDMyX3QgZHkpIGNvbnN0IHsKKyAgRlhfRkxPQVQgZnggPSBhICogZHggKyBjICogZHksIGZ5ID0gYiAqIGR4ICsgZCAqIGR5OworICByZXR1cm4gRlhTWVNfcm91bmQoRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSkpOworfQorRlhfRkxPQVQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtRGlzdGFuY2UoRlhfRkxPQVQgZGlzdGFuY2UpIGNvbnN0IHsKKyAgcmV0dXJuIGRpc3RhbmNlICogKEdldFhVbml0KCkgKyBHZXRZVW5pdCgpKSAvIDI7Cit9Cit2b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVZlY3RvcihDRlhfVmVjdG9yRiYgdikgY29uc3QgeworICBGWF9GTE9BVCBmeCA9IGEgKiB2LnggKyBjICogdi55OworICBGWF9GTE9BVCBmeSA9IGIgKiB2LnggKyBkICogdi55OworICB2LnggPSBmeCwgdi55ID0gZnk7Cit9Cit2b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVZlY3RvcihDRlhfVmVjdG9yJiB2KSBjb25zdCB7CisgIEZYX0ZMT0FUIGZ4ID0gYSAqIHYueCArIGMgKiB2Lnk7CisgIEZYX0ZMT0FUIGZ5ID0gYiAqIHYueCArIGQgKiB2Lnk7CisgIHYueCA9IEZYU1lTX3JvdW5kKGZ4KTsKKyAgdi55ID0gRlhTWVNfcm91bmQoZnkpOworfQordm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1Qb2ludHMoQ0ZYX1BvaW50KiBwb2ludHMsIGludDMyX3QgaUNvdW50KSBjb25zdCB7CisgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAwKTsKKyAgRlhfRkxPQVQgZngsIGZ5OworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIGZ4ID0gYSAqIHBvaW50cy0+eCArIGMgKiBwb2ludHMtPnkgKyBlOworICAgIGZ5ID0gYiAqIHBvaW50cy0+eCArIGQgKiBwb2ludHMtPnkgKyBmOworICAgIHBvaW50cy0+eCA9IEZYU1lTX3JvdW5kKGZ4KTsKKyAgICBwb2ludHMtPnkgPSBGWFNZU19yb3VuZChmeSk7CisgICAgcG9pbnRzKys7CisgIH0KK30KK3ZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtUG9pbnRzKENGWF9Qb2ludEYqIHBvaW50cywgaW50MzJfdCBpQ291bnQpIGNvbnN0IHsKKyAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IDApOworICBGWF9GTE9BVCBmeCwgZnk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgZnggPSBhICogcG9pbnRzLT54ICsgYyAqIHBvaW50cy0+eSArIGU7CisgICAgZnkgPSBiICogcG9pbnRzLT54ICsgZCAqIHBvaW50cy0+eSArIGY7CisgICAgcG9pbnRzLT54ID0gZngsIHBvaW50cy0+eSA9IGZ5OworICAgIHBvaW50cysrOworICB9Cit9Cit2b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVBvaW50KEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSkgY29uc3QgeworICBGWF9GTE9BVCBmeCA9IGEgKiB4ICsgYyAqIHkgKyBlOworICBGWF9GTE9BVCBmeSA9IGIgKiB4ICsgZCAqIHkgKyBmOworICB4ID0gZngsIHkgPSBmeTsKK30KK3ZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtUG9pbnQoaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgY29uc3QgeworICBGWF9GTE9BVCBmeCA9IGEgKiB4ICsgYyAqIHkgKyBlOworICBGWF9GTE9BVCBmeSA9IGIgKiB4ICsgZCAqIHkgKyBmOworICB4ID0gRlhTWVNfcm91bmQoZngpOworICB5ID0gRlhTWVNfcm91bmQoZnkpOworfQordm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1SZWN0KENGWF9SZWN0RiYgcmVjdCkgY29uc3QgeworICBGWF9GTE9BVCByaWdodCA9IHJlY3QucmlnaHQoKSwgYm90dG9tID0gcmVjdC5ib3R0b20oKTsKKyAgVHJhbnNmb3JtUmVjdChyZWN0LmxlZnQsIHJpZ2h0LCBib3R0b20sIHJlY3QudG9wKTsKKyAgcmVjdC53aWR0aCA9IHJpZ2h0IC0gcmVjdC5sZWZ0OworICByZWN0LmhlaWdodCA9IGJvdHRvbSAtIHJlY3QudG9wOworfQordm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1SZWN0KENGWF9SZWN0JiByZWN0KSBjb25zdCB7CisgIEZYX0ZMT0FUIGxlZnQgPSAoRlhfRkxPQVQpcmVjdC5sZWZ0OworICBGWF9GTE9BVCB0b3AgPSAoRlhfRkxPQVQpcmVjdC5ib3R0b20oKTsKKyAgRlhfRkxPQVQgcmlnaHQgPSAoRlhfRkxPQVQpcmVjdC5yaWdodCgpOworICBGWF9GTE9BVCBib3R0b20gPSAoRlhfRkxPQVQpcmVjdC50b3A7CisgIFRyYW5zZm9ybVJlY3QobGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKTsKKyAgcmVjdC5sZWZ0ID0gRlhTWVNfcm91bmQobGVmdCk7CisgIHJlY3QudG9wID0gRlhTWVNfcm91bmQoYm90dG9tKTsKKyAgcmVjdC53aWR0aCA9IEZYU1lTX3JvdW5kKHJpZ2h0IC0gbGVmdCk7CisgIHJlY3QuaGVpZ2h0ID0gRlhTWVNfcm91bmQodG9wIC0gYm90dG9tKTsKK30KK3ZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtUmVjdChGWF9GTE9BVCYgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYm90dG9tKSBjb25zdCB7CisgIEZYX0ZMT0FUIHhbNF0sIHlbNF07CisgIHhbMF0gPSBsZWZ0OworICB5WzBdID0gdG9wOworICB4WzFdID0gbGVmdDsKKyAgeVsxXSA9IGJvdHRvbTsKKyAgeFsyXSA9IHJpZ2h0OworICB5WzJdID0gdG9wOworICB4WzNdID0gcmlnaHQ7CisgIHlbM10gPSBib3R0b207CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgVHJhbnNmb3JtKHhbaV0sIHlbaV0sIHhbaV0sIHlbaV0pOworICB9CisgIHJpZ2h0ID0gbGVmdCA9IHhbMF07CisgIHRvcCA9IGJvdHRvbSA9IHlbMF07CisgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICBpZiAocmlnaHQgPCB4W2ldKSB7CisgICAgICByaWdodCA9IHhbaV07CiAgICAgfQotICAgIEZYX0ZMT0FUIGogPSAtaTsKLSAgICBhID0gbS5kIC8gaTsKLSAgICBiID0gbS5iIC8gajsKLSAgICBjID0gbS5jIC8gajsKLSAgICBkID0gbS5hIC8gaTsKLSAgICBlID0gKG0uYyAqIG0uZiAtIG0uZCAqIG0uZSkgLyBpOwotICAgIGYgPSAobS5hICogbS5mIC0gbS5iICogbS5lKSAvIGo7Ci19Ci1zdGF0aWMgdm9pZCBGWENSVF9NYXRyaXhfQ29uY2F0KENGWF9NYXRyaXggJm0sIGNvbnN0IENGWF9NYXRyaXggJm0xLCBjb25zdCBDRlhfTWF0cml4ICZtMikKLXsKLSAgICBGWF9GTE9BVCBhYSA9IG0xLmEgKiBtMi5hICsgbTEuYiAqIG0yLmM7Ci0gICAgRlhfRkxPQVQgYmIgPSBtMS5hICogbTIuYiArIG0xLmIgKiBtMi5kOwotICAgIEZYX0ZMT0FUIGNjID0gbTEuYyAqIG0yLmEgKyBtMS5kICogbTIuYzsKLSAgICBGWF9GTE9BVCBkZCA9IG0xLmMgKiBtMi5iICsgbTEuZCAqIG0yLmQ7Ci0gICAgRlhfRkxPQVQgZWUgPSBtMS5lICogbTIuYSArIG0xLmYgKiBtMi5jICsgbTIuZTsKLSAgICBGWF9GTE9BVCBmZiA9IG0xLmUgKiBtMi5iICsgbTEuZiAqIG0yLmQgKyBtMi5mOwotICAgIG0uYSA9IGFhLCBtLmIgPSBiYiwgbS5jID0gY2MsIG0uZCA9IGRkLCBtLmUgPSBlZSwgbS5mID0gZmY7Ci19Ci12b2lkIENGWF9NYXRyaXg6OkNvbmNhdChGWF9GTE9BVCBhLCBGWF9GTE9BVCBiLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBkLCBGWF9GTE9BVCBlLCBGWF9GTE9BVCBmLCBGWF9CT09MIGJQcmVwZW5kZWQpCi17Ci0gICAgQ0ZYX01hdHJpeCBtOwotICAgIG0uU2V0KGEsIGIsIGMsIGQsIGUsIGYpOwotICAgIENvbmNhdChtLCBiUHJlcGVuZGVkKTsKLX0KLXZvaWQgQ0ZYX01hdHJpeDo6Q29uY2F0KGNvbnN0IENGWF9NYXRyaXggJm0sIEZYX0JPT0wgYlByZXBlbmRlZCkKLXsKLSAgICBpZiAoYlByZXBlbmRlZCkgewotICAgICAgICBGWENSVF9NYXRyaXhfQ29uY2F0KCp0aGlzLCBtLCAqdGhpcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgKnRoaXMsIG0pOworICAgIGlmIChsZWZ0ID4geFtpXSkgeworICAgICAgbGVmdCA9IHhbaV07CiAgICAgfQotfQotdm9pZCBDRlhfTWF0cml4OjpDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIHNyYywgRlhfQk9PTCBiUHJlcGVuZGVkKQotewotICAgIENGWF9NYXRyaXggbTsKLSAgICBtLlNldFJldmVyc2Uoc3JjKTsKLSAgICBDb25jYXQobSwgYlByZXBlbmRlZCk7Ci19Ci1GWF9CT09MIENGWF9NYXRyaXg6OklzSW52ZXJ0aWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEZYU1lTX2ZhYnMoYSAqIGQgLSBiICogYykgPj0gMC4wMDAxZjsKLX0KLUZYX0JPT0wgQ0ZYX01hdHJpeDo6SXM5MFJvdGF0ZWQoKSBjb25zdAotewotICAgIHJldHVybiBGWFNZU19mYWJzKGEgKiAxMDAwKSA8IEZYU1lTX2ZhYnMoYikgJiYgRlhTWVNfZmFicyhkICogMTAwMCkgPCBGWFNZU19mYWJzKGMpOwotfQotRlhfQk9PTCBDRlhfTWF0cml4OjpJc1NjYWxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEZYU1lTX2ZhYnMoYiAqIDEwMDApIDwgRlhTWVNfZmFicyhhKSAmJiBGWFNZU19mYWJzKGMgKiAxMDAwKSA8IEZYU1lTX2ZhYnMoZCk7Ci19Ci12b2lkIENGWF9NYXRyaXg6OlRyYW5zbGF0ZShGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9CT09MIGJQcmVwZW5kZWQpCi17Ci0gICAgaWYgKGJQcmVwZW5kZWQpIHsKLSAgICAgICAgZSArPSB4ICogYSArIHkgKiBjOwotICAgICAgICBmICs9IHkgKiBkICsgeCAqIGI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZSArPSB4LCBmICs9IHk7CisgICAgaWYgKHRvcCA8IHlbaV0pIHsKKyAgICAgIHRvcCA9IHlbaV07CiAgICAgfQotfQotdm9pZCBDRlhfTWF0cml4OjpTY2FsZShGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3ksIEZYX0JPT0wgYlByZXBlbmRlZCkKLXsKLSAgICBhICo9IHN4LCBkICo9IHN5OwotICAgIGlmIChiUHJlcGVuZGVkKSB7Ci0gICAgICAgIGIgKj0gc3g7Ci0gICAgICAgIGMgKj0gc3k7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYiAqPSBzeTsKLSAgICAgICAgYyAqPSBzeDsKLSAgICAgICAgZSAqPSBzeDsKLSAgICAgICAgZiAqPSBzeTsKKyAgICBpZiAoYm90dG9tID4geVtpXSkgeworICAgICAgYm90dG9tID0geVtpXTsKICAgICB9Ci19Ci12b2lkIENGWF9NYXRyaXg6OlJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQpCi17Ci0gICAgRlhfRkxPQVQgY29zVmFsdWUgPSBGWFNZU19jb3MoZlJhZGlhbik7Ci0gICAgRlhfRkxPQVQgc2luVmFsdWUgPSBGWFNZU19zaW4oZlJhZGlhbik7Ci0gICAgQ0ZYX01hdHJpeCBtOwotICAgIG0uU2V0KGNvc1ZhbHVlLCBzaW5WYWx1ZSwgLXNpblZhbHVlLCBjb3NWYWx1ZSwgMCwgMCk7Ci0gICAgaWYgKGJQcmVwZW5kZWQpIHsKLSAgICAgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgbSwgKnRoaXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYQ1JUX01hdHJpeF9Db25jYXQoKnRoaXMsICp0aGlzLCBtKTsKLSAgICB9Ci19Ci12b2lkIENGWF9NYXRyaXg6OlJvdGF0ZUF0KEZYX0ZMT0FUIGZSYWRpYW4sIEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSwgRlhfQk9PTCBiUHJlcGVuZGVkKQotewotICAgIFRyYW5zbGF0ZShkeCwgZHksIGJQcmVwZW5kZWQpOwotICAgIFJvdGF0ZShmUmFkaWFuLCBiUHJlcGVuZGVkKTsKLSAgICBUcmFuc2xhdGUoLWR4LCAtZHksIGJQcmVwZW5kZWQpOwotfQotdm9pZCBDRlhfTWF0cml4OjpTaGVhcihGWF9GTE9BVCBmQWxwaGFSYWRpYW4sIEZYX0ZMT0FUIGZCZXRhUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQpCi17Ci0gICAgQ0ZYX01hdHJpeCBtOwotICAgIG0uU2V0KDEsIEZYU1lTX3RhbihmQWxwaGFSYWRpYW4pLCBGWFNZU190YW4oZkJldGFSYWRpYW4pLCAxLCAwLCAwKTsKLSAgICBpZiAoYlByZXBlbmRlZCkgewotICAgICAgICBGWENSVF9NYXRyaXhfQ29uY2F0KCp0aGlzLCBtLCAqdGhpcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgKnRoaXMsIG0pOwotICAgIH0KLX0KLXZvaWQgQ0ZYX01hdHJpeDo6TWF0Y2hSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIGRlc3QsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHNyYykKLXsKLSAgICBGWF9GTE9BVCBmRGlmZiA9IHNyYy5sZWZ0IC0gc3JjLnJpZ2h0OwotICAgIGEgPSBGWFNZU19mYWJzKGZEaWZmKSA8IDAuMDAxZiA/IDEgOiAoZGVzdC5sZWZ0IC0gZGVzdC5yaWdodCkgLyBmRGlmZjsKLSAgICBmRGlmZiA9IHNyYy5ib3R0b20gLSBzcmMudG9wOwotICAgIGQgPSBGWFNZU19mYWJzKGZEaWZmKSA8IDAuMDAxZiA/IDEgOiAoZGVzdC5ib3R0b20gLSBkZXN0LnRvcCkgLyBmRGlmZjsKLSAgICBlID0gZGVzdC5sZWZ0IC0gc3JjLmxlZnQgKiBhOwotICAgIGYgPSBkZXN0LmJvdHRvbSAtIHNyYy5ib3R0b20gKiBkOwotICAgIGIgPSAwOwotICAgIGMgPSAwOwotfQotRlhfRkxPQVQgQ0ZYX01hdHJpeDo6R2V0WFVuaXQoKSBjb25zdAotewotICAgIGlmIChiID09IDApIHsKLSAgICAgICAgcmV0dXJuIChhID4gMCA/IGEgOiAtYSk7Ci0gICAgfQotICAgIGlmIChhID09IDApIHsKLSAgICAgICAgcmV0dXJuIChiID4gMCA/IGIgOiAtYik7Ci0gICAgfQotICAgIHJldHVybiBGWFNZU19zcXJ0KGEgKiBhICsgYiAqIGIpOwotfQotRlhfRkxPQVQgQ0ZYX01hdHJpeDo6R2V0WVVuaXQoKSBjb25zdAotewotICAgIGlmIChjID09IDApIHsKLSAgICAgICAgcmV0dXJuIChkID4gMCA/IGQgOiAtZCk7Ci0gICAgfQotICAgIGlmIChkID09IDApIHsKLSAgICAgICAgcmV0dXJuIChjID4gMCA/IGMgOiAtYyk7Ci0gICAgfQotICAgIHJldHVybiBGWFNZU19zcXJ0KGMgKiBjICsgZCAqIGQpOwotfQotdm9pZCBDRlhfTWF0cml4OjpHZXRVbml0UmVjdChDRlhfUmVjdEYgJnJlY3QpIGNvbnN0Ci17Ci0gICAgcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOwotICAgIHJlY3Qud2lkdGggPSByZWN0LmhlaWdodCA9IDE7Ci0gICAgVHJhbnNmb3JtUmVjdChyZWN0KTsKLX0KLUNGWF9GbG9hdFJlY3QgQ0ZYX01hdHJpeDo6R2V0VW5pdFJlY3QoKSBjb25zdAotewotICAgIENGWF9GbG9hdFJlY3QgcmVjdCgwLCAwLCAxLCAxKTsKLSAgICByZWN0LlRyYW5zZm9ybSgoY29uc3QgQ0ZYX01hdHJpeCopdGhpcyk7Ci0gICAgcmV0dXJuIHJlY3Q7Ci19Ci1GWF9GTE9BVCBDRlhfTWF0cml4OjpHZXRVbml0QXJlYSgpIGNvbnN0Ci17Ci0gICAgRlhfRkxPQVQgQSA9IEZYU1lTX3NxcnQoYSAqIGEgKyBiICogYik7Ci0gICAgRlhfRkxPQVQgQiA9IEZYU1lTX3NxcnQoYyAqIGMgKyBkICogZCk7Ci0gICAgRlhfRkxPQVQgYWMgPSBhICsgYywgYmQgPSBiICsgZDsKLSAgICBGWF9GTE9BVCBDID0gRlhTWVNfc3FydChhYyAqIGFjICsgYmQgKiBiZCk7Ci0gICAgRlhfRkxPQVQgUCA9IChBICsgQiArIEMgKSAvIDI7Ci0gICAgcmV0dXJuIEZYU1lTX3NxcnQoUCAqIChQIC0gQSkgKiAoUCAtIEIpICogKFAgLSBDKSkgKiAyOwotfQotRlhfRkxPQVQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtWERpc3RhbmNlKEZYX0ZMT0FUIGR4KSBjb25zdAotewotICAgIEZYX0ZMT0FUIGZ4ID0gYSAqIGR4LCBmeSA9IGIgKiBkeDsKLSAgICByZXR1cm4gRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSk7Ci19Ci1pbnQzMl90IENGWF9NYXRyaXg6OlRyYW5zZm9ybVhEaXN0YW5jZShpbnQzMl90IGR4KSBjb25zdAotewotICAgIEZYX0ZMT0FUIGZ4ID0gYSAqIGR4LCBmeSA9IGIgKiBkeDsKLSAgICByZXR1cm4gRlhTWVNfcm91bmQoRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSkpOwotfQotRlhfRkxPQVQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtWURpc3RhbmNlKEZYX0ZMT0FUIGR5KSBjb25zdAotewotICAgIEZYX0ZMT0FUIGZ4ID0gYyAqIGR5LCBmeSA9IGQgKiBkeTsKLSAgICByZXR1cm4gRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSk7Ci19Ci1pbnQzMl90IENGWF9NYXRyaXg6OlRyYW5zZm9ybVlEaXN0YW5jZShpbnQzMl90IGR5KSBjb25zdAotewotICAgIEZYX0ZMT0FUIGZ4ID0gYyAqIGR5LCBmeSA9IGQgKiBkeTsKLSAgICByZXR1cm4gRlhTWVNfcm91bmQoRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSkpOwotfQotRlhfRkxPQVQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtRGlzdGFuY2UoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KSBjb25zdAotewotICAgIEZYX0ZMT0FUIGZ4ID0gYSAqIGR4ICsgYyAqIGR5LCBmeSA9IGIgKiBkeCArIGQgKiBkeTsKLSAgICByZXR1cm4gRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSk7Ci19Ci1pbnQzMl90IENGWF9NYXRyaXg6OlRyYW5zZm9ybURpc3RhbmNlKGludDMyX3QgZHgsIGludDMyX3QgZHkpIGNvbnN0Ci17Ci0gICAgRlhfRkxPQVQgZnggPSBhICogZHggKyBjICogZHksIGZ5ID0gYiAqIGR4ICsgZCAqIGR5OwotICAgIHJldHVybiBGWFNZU19yb3VuZChGWFNZU19zcXJ0KGZ4ICogZnggKyBmeSAqIGZ5KSk7Ci19Ci1GWF9GTE9BVCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1EaXN0YW5jZShGWF9GTE9BVCBkaXN0YW5jZSkgY29uc3QKLXsKLSAgICByZXR1cm4gZGlzdGFuY2UgKiAoR2V0WFVuaXQoKSArIEdldFlVbml0KCkpIC8gMjsKLX0KLXZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtVmVjdG9yKENGWF9WZWN0b3JGICZ2KSBjb25zdAotewotICAgIEZYX0ZMT0FUIGZ4ID0gYSAqIHYueCArIGMgKiB2Lnk7Ci0gICAgRlhfRkxPQVQgZnkgPSBiICogdi54ICsgZCAqIHYueTsKLSAgICB2LnggPSBmeCwgdi55ID0gZnk7Ci19Ci12b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVZlY3RvcihDRlhfVmVjdG9yICZ2KSBjb25zdAotewotICAgIEZYX0ZMT0FUIGZ4ID0gYSAqIHYueCArIGMgKiB2Lnk7Ci0gICAgRlhfRkxPQVQgZnkgPSBiICogdi54ICsgZCAqIHYueTsKLSAgICB2LnggPSBGWFNZU19yb3VuZChmeCk7Ci0gICAgdi55ID0gRlhTWVNfcm91bmQoZnkpOwotfQotdm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1Qb2ludHMoQ0ZYX1BvaW50ICpwb2ludHMsIGludDMyX3QgaUNvdW50KSBjb25zdAotewotICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAwKTsKLSAgICBGWF9GTE9BVCBmeCwgZnk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgIGZ4ID0gYSAqIHBvaW50cy0+eCArIGMgKiBwb2ludHMtPnkgKyBlOwotICAgICAgICBmeSA9IGIgKiBwb2ludHMtPnggKyBkICogcG9pbnRzLT55ICsgZjsKLSAgICAgICAgcG9pbnRzLT54ID0gRlhTWVNfcm91bmQoZngpOwotICAgICAgICBwb2ludHMtPnkgPSBGWFNZU19yb3VuZChmeSk7Ci0gICAgICAgIHBvaW50cyArKzsKLSAgICB9Ci19Ci12b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVBvaW50cyhDRlhfUG9pbnRGICpwb2ludHMsIGludDMyX3QgaUNvdW50KSBjb25zdAotewotICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAwKTsKLSAgICBGWF9GTE9BVCBmeCwgZnk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgIGZ4ID0gYSAqIHBvaW50cy0+eCArIGMgKiBwb2ludHMtPnkgKyBlOwotICAgICAgICBmeSA9IGIgKiBwb2ludHMtPnggKyBkICogcG9pbnRzLT55ICsgZjsKLSAgICAgICAgcG9pbnRzLT54ID0gZngsIHBvaW50cy0+eSA9IGZ5OwotICAgICAgICBwb2ludHMgKys7Ci0gICAgfQotfQotdm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1Qb2ludChGWF9GTE9BVCAmeCwgRlhfRkxPQVQgJnkpIGNvbnN0Ci17Ci0gICAgRlhfRkxPQVQgZnggPSBhICogeCArIGMgKiB5ICsgZTsKLSAgICBGWF9GTE9BVCBmeSA9IGIgKiB4ICsgZCAqIHkgKyBmOwotICAgIHggPSBmeCwgeSA9IGZ5OwotfQotdm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1Qb2ludChpbnQzMl90ICZ4LCBpbnQzMl90ICZ5KSBjb25zdAotewotICAgIEZYX0ZMT0FUIGZ4ID0gYSAqIHggKyBjICogeSArIGU7Ci0gICAgRlhfRkxPQVQgZnkgPSBiICogeCArIGQgKiB5ICsgZjsKLSAgICB4ID0gRlhTWVNfcm91bmQoZngpOwotICAgIHkgPSBGWFNZU19yb3VuZChmeSk7Ci19Ci12b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVJlY3QoQ0ZYX1JlY3RGICZyZWN0KSBjb25zdAotewotICAgIEZYX0ZMT0FUIHJpZ2h0ID0gcmVjdC5yaWdodCgpLCBib3R0b20gPSByZWN0LmJvdHRvbSgpOwotICAgIFRyYW5zZm9ybVJlY3QocmVjdC5sZWZ0LCByaWdodCwgYm90dG9tLCByZWN0LnRvcCk7Ci0gICAgcmVjdC53aWR0aCA9IHJpZ2h0IC0gcmVjdC5sZWZ0OwotICAgIHJlY3QuaGVpZ2h0ID0gYm90dG9tIC0gcmVjdC50b3A7Ci19Ci12b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVJlY3QoQ0ZYX1JlY3QgJnJlY3QpIGNvbnN0Ci17Ci0gICAgRlhfRkxPQVQgbGVmdCA9IChGWF9GTE9BVClyZWN0LmxlZnQ7Ci0gICAgRlhfRkxPQVQgdG9wID0gKEZYX0ZMT0FUKXJlY3QuYm90dG9tKCk7Ci0gICAgRlhfRkxPQVQgcmlnaHQgPSAoRlhfRkxPQVQpcmVjdC5yaWdodCgpOwotICAgIEZYX0ZMT0FUIGJvdHRvbSA9IChGWF9GTE9BVClyZWN0LnRvcDsKLSAgICBUcmFuc2Zvcm1SZWN0KGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSk7Ci0gICAgcmVjdC5sZWZ0ID0gRlhTWVNfcm91bmQobGVmdCk7Ci0gICAgcmVjdC50b3AgPSBGWFNZU19yb3VuZChib3R0b20pOwotICAgIHJlY3Qud2lkdGggPSBGWFNZU19yb3VuZChyaWdodCAtIGxlZnQpOwotICAgIHJlY3QuaGVpZ2h0ID0gRlhTWVNfcm91bmQodG9wIC0gYm90dG9tKTsKLX0KLXZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtUmVjdChGWF9GTE9BVCYgbGVmdCwgRlhfRkxPQVQmIHJpZ2h0LCBGWF9GTE9BVCYgdG9wLCBGWF9GTE9BVCYgYm90dG9tKSBjb25zdAotewotICAgIEZYX0ZMT0FUIHhbNF0sIHlbNF07Ci0gICAgeFswXSA9IGxlZnQ7Ci0gICAgeVswXSA9IHRvcDsKLSAgICB4WzFdID0gbGVmdDsKLSAgICB5WzFdID0gYm90dG9tOwotICAgIHhbMl0gPSByaWdodDsKLSAgICB5WzJdID0gdG9wOwotICAgIHhbM10gPSByaWdodDsKLSAgICB5WzNdID0gYm90dG9tOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgIFRyYW5zZm9ybSh4W2ldLCB5W2ldLCB4W2ldLCB5W2ldKTsKLSAgICB9Ci0gICAgcmlnaHQgPSBsZWZ0ID0geFswXTsKLSAgICB0b3AgPSBib3R0b20gPSB5WzBdOwotICAgIGZvciAoaSA9IDE7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgIGlmIChyaWdodCA8IHhbaV0pIHsKLSAgICAgICAgICAgIHJpZ2h0ID0geFtpXTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGVmdCA+IHhbaV0pIHsKLSAgICAgICAgICAgIGxlZnQgPSB4W2ldOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0b3AgPCB5W2ldKSB7Ci0gICAgICAgICAgICB0b3AgPSB5W2ldOwotICAgICAgICB9Ci0gICAgICAgIGlmIChib3R0b20gPiB5W2ldKSB7Ci0gICAgICAgICAgICBib3R0b20gPSB5W2ldOwotICAgICAgICB9Ci0gICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19nY2MuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcAppbmRleCAyNDk3Yzc0Li5iZjNkNjE1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19nY2MuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2djYy5jcHAKQEAgLTEwLDgwICsxMCw3MiBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCiAKIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTVFJfVD4KLVQgRlhTWVNfU3RyVG9JbnQoU1RSX1Qgc3RyKQotewotICAgIEZYX0JPT0wgbmVnID0gRkFMU0U7Ci0gICAgaWYgKHN0ciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworVCBGWFNZU19TdHJUb0ludChTVFJfVCBzdHIpIHsKKyAgRlhfQk9PTCBuZWcgPSBGQUxTRTsKKyAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCpzdHIgPT0gJy0nKSB7CisgICAgbmVnID0gVFJVRTsKKyAgICBzdHIrKzsKKyAgfQorICBUIG51bSA9IDA7CisgIHdoaWxlICgqc3RyKSB7CisgICAgaWYgKCgqc3RyKSA8ICcwJyB8fCAoKnN0cikgPiAnOScpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBpZiAoKnN0ciA9PSAnLScpIHsKLSAgICAgICAgbmVnID0gVFJVRTsKLSAgICAgICAgc3RyICsrOworICAgIGlmIChudW0gPiAoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkgLSA5KSAvIDEwKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgVCBudW0gPSAwOwotICAgIHdoaWxlICgqc3RyKSB7Ci0gICAgICAgIGlmICgoKnN0cikgPCAnMCcgfHwgKCpzdHIpID4gJzknKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVtID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpIC0gOSkgLyAxMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbnVtID0gbnVtICogMTAgKyAoKnN0cikgLSAnMCc7Ci0gICAgICAgIHN0ciArKzsKLSAgICB9Ci0gICAgcmV0dXJuIG5lZyA/IC1udW0gOiBudW07CisgICAgbnVtID0gbnVtICogMTAgKyAoKnN0cikgLSAnMCc7CisgICAgc3RyKys7CisgIH0KKyAgcmV0dXJuIG5lZyA/IC1udW0gOiBudW07CiB9CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgU1RSX1Q+Ci1TVFJfVCBGWFNZU19JbnRUb1N0cihUIHZhbHVlLCBTVFJfVCBzdHJpbmcsIGludCByYWRpeCkKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgaWYgKHZhbHVlIDwgMCkgewotICAgICAgICBzdHJpbmdbaSsrXSA9ICctJzsKLSAgICAgICAgdmFsdWUgPSAtdmFsdWU7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAwKSB7Ci0gICAgICAgIHN0cmluZ1swXSA9ICcwJzsKLSAgICAgICAgc3RyaW5nWzFdID0gMDsKLSAgICAgICAgcmV0dXJuIHN0cmluZzsKLSAgICB9Ci0gICAgaW50IGRpZ2l0cyA9IDE7Ci0gICAgVCBvcmRlciA9IHZhbHVlIC8gMTA7Ci0gICAgd2hpbGUob3JkZXIgPiAwKSB7Ci0gICAgICAgIGRpZ2l0cysrOwotICAgICAgICBvcmRlciA9IG9yZGVyIC8gMTA7Ci0gICAgfQotICAgIGZvciAoaW50IGQgPSBkaWdpdHMgLSAxOyBkID4gLTE7IGQtLSkgewotICAgICAgICBzdHJpbmdbZCArIGldID0gIjAxMjM0NTY3ODlhYmNkZWYiW3ZhbHVlICUgMTBdOwotICAgICAgICB2YWx1ZSAvPSAxMDsKLSAgICB9Ci0gICAgc3RyaW5nW2RpZ2l0cyArIGldID0gMDsKK1NUUl9UIEZYU1lTX0ludFRvU3RyKFQgdmFsdWUsIFNUUl9UIHN0cmluZywgaW50IHJhZGl4KSB7CisgIGludCBpID0gMDsKKyAgaWYgKHZhbHVlIDwgMCkgeworICAgIHN0cmluZ1tpKytdID0gJy0nOworICAgIHZhbHVlID0gLXZhbHVlOworICB9IGVsc2UgaWYgKHZhbHVlID09IDApIHsKKyAgICBzdHJpbmdbMF0gPSAnMCc7CisgICAgc3RyaW5nWzFdID0gMDsKICAgICByZXR1cm4gc3RyaW5nOworICB9CisgIGludCBkaWdpdHMgPSAxOworICBUIG9yZGVyID0gdmFsdWUgLyAxMDsKKyAgd2hpbGUgKG9yZGVyID4gMCkgeworICAgIGRpZ2l0cysrOworICAgIG9yZGVyID0gb3JkZXIgLyAxMDsKKyAgfQorICBmb3IgKGludCBkID0gZGlnaXRzIC0gMTsgZCA+IC0xOyBkLS0pIHsKKyAgICBzdHJpbmdbZCArIGldID0gIjAxMjM0NTY3ODlhYmNkZWYiW3ZhbHVlICUgMTBdOworICAgIHZhbHVlIC89IDEwOworICB9CisgIHN0cmluZ1tkaWdpdHMgKyBpXSA9IDA7CisgIHJldHVybiBzdHJpbmc7CiB9CiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCi1pbnQzMl90IEZYU1lTX2F0b2koY29uc3QgRlhfQ0hBUiogc3RyKQotewotICAgIHJldHVybiBGWFNZU19TdHJUb0ludDxpbnQzMl90LCBjb25zdCBGWF9DSEFSKj4oc3RyKTsKK2ludDMyX3QgRlhTWVNfYXRvaShjb25zdCBGWF9DSEFSKiBzdHIpIHsKKyAgcmV0dXJuIEZYU1lTX1N0clRvSW50PGludDMyX3QsIGNvbnN0IEZYX0NIQVIqPihzdHIpOwogfQotaW50MzJfdCBGWFNZU193dG9pKGNvbnN0IEZYX1dDSEFSKiBzdHIpCi17Ci0gICAgcmV0dXJuIEZYU1lTX1N0clRvSW50PGludDMyX3QsIGNvbnN0IEZYX1dDSEFSKj4oc3RyKTsKK2ludDMyX3QgRlhTWVNfd3RvaShjb25zdCBGWF9XQ0hBUiogc3RyKSB7CisgIHJldHVybiBGWFNZU19TdHJUb0ludDxpbnQzMl90LCBjb25zdCBGWF9XQ0hBUio+KHN0cik7CiB9Ci1pbnQ2NF90IEZYU1lTX2F0b2k2NChjb25zdCBGWF9DSEFSKiBzdHIpCi17Ci0gICAgcmV0dXJuIEZYU1lTX1N0clRvSW50PGludDY0X3QsIGNvbnN0IEZYX0NIQVIqPihzdHIpOworaW50NjRfdCBGWFNZU19hdG9pNjQoY29uc3QgRlhfQ0hBUiogc3RyKSB7CisgIHJldHVybiBGWFNZU19TdHJUb0ludDxpbnQ2NF90LCBjb25zdCBGWF9DSEFSKj4oc3RyKTsKIH0KLWludDY0X3QgRlhTWVNfd3RvaTY0KGNvbnN0IEZYX1dDSEFSKiBzdHIpCi17Ci0gICAgcmV0dXJuIEZYU1lTX1N0clRvSW50PGludDY0X3QsIGNvbnN0IEZYX1dDSEFSKj4oc3RyKTsKK2ludDY0X3QgRlhTWVNfd3RvaTY0KGNvbnN0IEZYX1dDSEFSKiBzdHIpIHsKKyAgcmV0dXJuIEZYU1lTX1N0clRvSW50PGludDY0X3QsIGNvbnN0IEZYX1dDSEFSKj4oc3RyKTsKIH0KLWNvbnN0IEZYX0NIQVIqIEZYU1lTX2k2NHRvYShpbnQ2NF90IHZhbHVlLCBGWF9DSEFSKiBzdHIsIGludCByYWRpeCkKLXsKLSAgICByZXR1cm4gRlhTWVNfSW50VG9TdHI8aW50NjRfdCwgRlhfQ0hBUio+KHZhbHVlLCBzdHIsIHJhZGl4KTsKK2NvbnN0IEZYX0NIQVIqIEZYU1lTX2k2NHRvYShpbnQ2NF90IHZhbHVlLCBGWF9DSEFSKiBzdHIsIGludCByYWRpeCkgeworICByZXR1cm4gRlhTWVNfSW50VG9TdHI8aW50NjRfdCwgRlhfQ0hBUio+KHZhbHVlLCBzdHIsIHJhZGl4KTsKIH0KLWNvbnN0IEZYX1dDSEFSKiBGWFNZU19pNjR0b3coaW50NjRfdCB2YWx1ZSwgRlhfV0NIQVIqIHN0ciwgaW50IHJhZGl4KQotewotICAgIHJldHVybiBGWFNZU19JbnRUb1N0cjxpbnQ2NF90LCBGWF9XQ0hBUio+KHZhbHVlLCBzdHIsIHJhZGl4KTsKK2NvbnN0IEZYX1dDSEFSKiBGWFNZU19pNjR0b3coaW50NjRfdCB2YWx1ZSwgRlhfV0NIQVIqIHN0ciwgaW50IHJhZGl4KSB7CisgIHJldHVybiBGWFNZU19JbnRUb1N0cjxpbnQ2NF90LCBGWF9XQ0hBUio+KHZhbHVlLCBzdHIsIHJhZGl4KTsKIH0KICNpZmRlZiBfX2NwbHVzcGx1cwogfQpAQCAtOTIsMjIgKzg0LDIyIEBACiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCi1pbnQgRlhTWVNfR2V0QUNQKCkKLXsKLSAgICByZXR1cm4gMDsKK2ludCBGWFNZU19HZXRBQ1AoKSB7CisgIHJldHVybiAwOwogfQotRlhfRFdPUkQgRlhTWVNfR2V0RnVsbFBhdGhOYW1lKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBidWZsZW4sIEZYX0NIQVIqIGJ1ZiwgRlhfQ0hBUioqIGZpbGVwYXJ0KQotewotICAgIGludCBzcmNsZW4gPSBGWFNZU19zdHJsZW4oZmlsZW5hbWUpOwotICAgIGlmIChidWYgPT0gTlVMTCB8fCAoaW50KWJ1ZmxlbiA8IHNyY2xlbiArIDEpIHsKLSAgICAgICAgcmV0dXJuIHNyY2xlbiArIDE7Ci0gICAgfQotICAgIEZYU1lTX3N0cmNweShidWYsIGZpbGVuYW1lKTsKLSAgICByZXR1cm4gc3JjbGVuOworRlhfRFdPUkQgRlhTWVNfR2V0RnVsbFBhdGhOYW1lKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUioqIGZpbGVwYXJ0KSB7CisgIGludCBzcmNsZW4gPSBGWFNZU19zdHJsZW4oZmlsZW5hbWUpOworICBpZiAoYnVmID09IE5VTEwgfHwgKGludClidWZsZW4gPCBzcmNsZW4gKyAxKSB7CisgICAgcmV0dXJuIHNyY2xlbiArIDE7CisgIH0KKyAgRlhTWVNfc3RyY3B5KGJ1ZiwgZmlsZW5hbWUpOworICByZXR1cm4gc3JjbGVuOwogfQotRlhfRFdPUkQgRlhTWVNfR2V0TW9kdWxlRmlsZU5hbWUodm9pZCogaE1vZHVsZSwgY2hhciogYnVmLCBGWF9EV09SRCBidWZzaXplKQotewotICAgIHJldHVybiAoRlhfRFdPUkQpIC0gMTsKK0ZYX0RXT1JEIEZYU1lTX0dldE1vZHVsZUZpbGVOYW1lKHZvaWQqIGhNb2R1bGUsIGNoYXIqIGJ1ZiwgRlhfRFdPUkQgYnVmc2l6ZSkgeworICByZXR1cm4gKEZYX0RXT1JEKS0xOwogfQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CkBAIC0xMTcsODcgKzEwOSw4MCBAQAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgotRlhTWVNfRklMRSogRlhTWVNfd2ZvcGVuKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSwgY29uc3QgRlhfV0NIQVIqIG1vZGUpCi17Ci0gICAgcmV0dXJuIEZYU1lTX2ZvcGVuKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShmaWxlbmFtZSksIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShtb2RlKSk7CitGWFNZU19GSUxFKiBGWFNZU193Zm9wZW4oY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBjb25zdCBGWF9XQ0hBUiogbW9kZSkgeworICByZXR1cm4gRlhTWVNfZm9wZW4oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShtb2RlKSk7CiB9Ci1jaGFyKiBGWFNZU19zdHJsd3IoY2hhciogc3RyKQotewotICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY2hhciogcyA9IHN0cjsKLSAgICB3aGlsZSAoKnN0cikgewotICAgICAgICAqc3RyID0gRlhTWVNfdG9sb3dlcigqc3RyKTsKLSAgICAgICAgc3RyICsrOwotICAgIH0KLSAgICByZXR1cm4gczsKK2NoYXIqIEZYU1lTX3N0cmx3cihjaGFyKiBzdHIpIHsKKyAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY2hhciogcyA9IHN0cjsKKyAgd2hpbGUgKCpzdHIpIHsKKyAgICAqc3RyID0gRlhTWVNfdG9sb3dlcigqc3RyKTsKKyAgICBzdHIrKzsKKyAgfQorICByZXR1cm4gczsKIH0KLWNoYXIqIEZYU1lTX3N0cnVwcihjaGFyKiBzdHIpCi17Ci0gICAgaWYgKHN0ciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBjaGFyKiBzID0gc3RyOwotICAgIHdoaWxlICgqc3RyKSB7Ci0gICAgICAgICpzdHIgPSBGWFNZU190b3VwcGVyKCpzdHIpOwotICAgICAgICBzdHIgKys7Ci0gICAgfQotICAgIHJldHVybiBzOworY2hhciogRlhTWVNfc3RydXByKGNoYXIqIHN0cikgeworICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjaGFyKiBzID0gc3RyOworICB3aGlsZSAoKnN0cikgeworICAgICpzdHIgPSBGWFNZU190b3VwcGVyKCpzdHIpOworICAgIHN0cisrOworICB9CisgIHJldHVybiBzOwogfQotRlhfV0NIQVIqIEZYU1lTX3djc2x3cihGWF9XQ0hBUiogc3RyKQotewotICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfV0NIQVIqIHMgPSBzdHI7Ci0gICAgd2hpbGUgKCpzdHIpIHsKLSAgICAgICAgKnN0ciA9IEZYU1lTX3RvbG93ZXIoKnN0cik7Ci0gICAgICAgIHN0ciArKzsKLSAgICB9Ci0gICAgcmV0dXJuIHM7CitGWF9XQ0hBUiogRlhTWVNfd2NzbHdyKEZYX1dDSEFSKiBzdHIpIHsKKyAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfV0NIQVIqIHMgPSBzdHI7CisgIHdoaWxlICgqc3RyKSB7CisgICAgKnN0ciA9IEZYU1lTX3RvbG93ZXIoKnN0cik7CisgICAgc3RyKys7CisgIH0KKyAgcmV0dXJuIHM7CiB9Ci1GWF9XQ0hBUiogRlhTWVNfd2NzdXByKEZYX1dDSEFSKiBzdHIpCi17Ci0gICAgaWYgKHN0ciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworRlhfV0NIQVIqIEZYU1lTX3djc3VwcihGWF9XQ0hBUiogc3RyKSB7CisgIGlmIChzdHIgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYX1dDSEFSKiBzID0gc3RyOworICB3aGlsZSAoKnN0cikgeworICAgICpzdHIgPSBGWFNZU190b3VwcGVyKCpzdHIpOworICAgIHN0cisrOworICB9CisgIHJldHVybiBzOworfQoraW50IEZYU1lTX3N0cmljbXAoY29uc3QgY2hhciogZHN0LCBjb25zdCBjaGFyKiBzcmMpIHsKKyAgaW50IGYsIGw7CisgIGRvIHsKKyAgICBpZiAoKChmID0gKHVuc2lnbmVkIGNoYXIpKCooZHN0KyspKSkgPj0gJ0EnKSAmJiAoZiA8PSAnWicpKSB7CisgICAgICBmIC09ICgnQScgLSAnYScpOwogICAgIH0KLSAgICBGWF9XQ0hBUiogcyA9IHN0cjsKLSAgICB3aGlsZSAoKnN0cikgewotICAgICAgICAqc3RyID0gRlhTWVNfdG91cHBlcigqc3RyKTsKLSAgICAgICAgc3RyICsrOworICAgIGlmICgoKGwgPSAodW5zaWduZWQgY2hhcikoKihzcmMrKykpKSA+PSAnQScpICYmIChsIDw9ICdaJykpIHsKKyAgICAgIGwgLT0gKCdBJyAtICdhJyk7CiAgICAgfQotICAgIHJldHVybiBzOworICB9IHdoaWxlIChmICYmIChmID09IGwpKTsKKyAgcmV0dXJuIChmIC0gbCk7CiB9Ci1pbnQgRlhTWVNfc3RyaWNtcChjb25zdCBjaGFyKmRzdCwgY29uc3QgY2hhcipzcmMpCi17Ci0gICAgaW50IGYsIGw7Ci0gICAgZG8gewotICAgICAgICBpZiAoICgoZiA9ICh1bnNpZ25lZCBjaGFyKSgqKGRzdCsrKSkpID49ICdBJykgJiYgKGYgPD0gJ1onKSApIHsKLSAgICAgICAgICAgIGYgLT0gKCdBJyAtICdhJyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAoKGwgPSAodW5zaWduZWQgY2hhcikoKihzcmMrKykpKSA+PSAnQScpICYmIChsIDw9ICdaJykgKSB7Ci0gICAgICAgICAgICBsIC09ICgnQScgLSAnYScpOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoIGYgJiYgKGYgPT0gbCkgKTsKLSAgICByZXR1cm4oZiAtIGwpOworaW50IEZYU1lTX3djc2ljbXAoY29uc3QgRlhfV0NIQVIqIGRzdCwgY29uc3QgRlhfV0NIQVIqIHNyYykgeworICBGWF9XQ0hBUiBmLCBsOworICBkbyB7CisgICAgaWYgKCgoZiA9IChGWF9XQ0hBUikoKihkc3QrKykpKSA+PSAnQScpICYmIChmIDw9ICdaJykpIHsKKyAgICAgIGYgLT0gKCdBJyAtICdhJyk7CisgICAgfQorICAgIGlmICgoKGwgPSAoRlhfV0NIQVIpKCooc3JjKyspKSkgPj0gJ0EnKSAmJiAobCA8PSAnWicpKSB7CisgICAgICBsIC09ICgnQScgLSAnYScpOworICAgIH0KKyAgfSB3aGlsZSAoZiAmJiAoZiA9PSBsKSk7CisgIHJldHVybiAoZiAtIGwpOwogfQotaW50IEZYU1lTX3djc2ljbXAoY29uc3QgRlhfV0NIQVIgKmRzdCwgY29uc3QgRlhfV0NIQVIgKnNyYykKLXsKLSAgICBGWF9XQ0hBUiBmLCBsOwotICAgIGRvIHsKLSAgICAgICAgaWYgKCAoKGYgPSAoRlhfV0NIQVIpKCooZHN0KyspKSkgPj0gJ0EnKSAmJiAoZiA8PSAnWicpICkgewotICAgICAgICAgICAgZiAtPSAoJ0EnIC0gJ2EnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoICgobCA9IChGWF9XQ0hBUikoKihzcmMrKykpKSA+PSAnQScpICYmIChsIDw9ICdaJykgKSB7Ci0gICAgICAgICAgICBsIC09ICgnQScgLSAnYScpOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoIGYgJiYgKGYgPT0gbCkgKTsKLSAgICByZXR1cm4oZiAtIGwpOwotfQotY2hhciogRlhTWVNfaXRvYShpbnQgdmFsdWUsIGNoYXIqIHN0cmluZywgaW50IHJhZGl4KQotewotICAgIHJldHVybiBGWFNZU19JbnRUb1N0cjxpbnQzMl90LCBGWF9DSEFSKj4odmFsdWUsIHN0cmluZywgcmFkaXgpOworY2hhciogRlhTWVNfaXRvYShpbnQgdmFsdWUsIGNoYXIqIHN0cmluZywgaW50IHJhZGl4KSB7CisgIHJldHVybiBGWFNZU19JbnRUb1N0cjxpbnQzMl90LCBGWF9DSEFSKj4odmFsdWUsIHN0cmluZywgcmFkaXgpOwogfQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CkBAIC0yMDcsMzEgKzE5MiwzOSBAQAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgotaW50IEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoRlhfRFdPUkQgY29kZXBhZ2UsIEZYX0RXT1JEIGR3RmxhZ3MsIGNvbnN0IEZYX1dDSEFSKiB3c3RyLCBpbnQgd2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NIQVIqIGJ1ZiwgaW50IGJ1ZmxlbiwgY29uc3QgRlhfQ0hBUiogZGVmYXVsdF9zdHIsIGludCogcFVzZURlZmF1bHQpCi17Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3bGVuOyBpICsrKSB7Ci0gICAgICAgIGlmICh3c3RyW2ldIDwgMHgxMDApIHsKLSAgICAgICAgICAgIGlmIChidWYgJiYgbGVuIDwgYnVmbGVuKSB7Ci0gICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAoRlhfQ0hBUil3c3RyW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVuICsrOwotICAgICAgICB9CitpbnQgRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShGWF9EV09SRCBjb2RlcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogd3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUiogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGRlZmF1bHRfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwVXNlRGVmYXVsdCkgeworICBpbnQgbGVuID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB3bGVuOyBpKyspIHsKKyAgICBpZiAod3N0cltpXSA8IDB4MTAwKSB7CisgICAgICBpZiAoYnVmICYmIGxlbiA8IGJ1ZmxlbikgeworICAgICAgICBidWZbbGVuXSA9IChGWF9DSEFSKXdzdHJbaV07CisgICAgICB9CisgICAgICBsZW4rKzsKICAgICB9Ci0gICAgcmV0dXJuIGxlbjsKKyAgfQorICByZXR1cm4gbGVuOwogfQotaW50IEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIoRlhfRFdPUkQgY29kZXBhZ2UsIEZYX0RXT1JEIGR3RmxhZ3MsIGNvbnN0IEZYX0NIQVIqIGJzdHIsIGludCBibGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIGJ1ZiwgaW50IGJ1ZmxlbikKLXsKLSAgICBpbnQgd2xlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibGVuOyBpICsrKSB7Ci0gICAgICAgIGlmIChidWYgJiYgd2xlbiA8IGJ1ZmxlbikgewotICAgICAgICAgICAgYnVmW3dsZW5dID0gYnN0cltpXTsKLSAgICAgICAgfQotICAgICAgICB3bGVuICsrOworaW50IEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIoRlhfRFdPUkQgY29kZXBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogYnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4pIHsKKyAgaW50IHdsZW4gPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGJsZW47IGkrKykgeworICAgIGlmIChidWYgJiYgd2xlbiA8IGJ1ZmxlbikgeworICAgICAgYnVmW3dsZW5dID0gYnN0cltpXTsKICAgICB9Ci0gICAgcmV0dXJuIHdsZW47CisgICAgd2xlbisrOworICB9CisgIHJldHVybiB3bGVuOwogfQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19saXN0LmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2xpc3QuY3BwCmluZGV4IGM5NjE5ZjkuLjA2OGFlZjIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2xpc3QuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2xpc3QuY3BwCkBAIC03LDEzNCArNywxMjMgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAjaW5jbHVkZSAicGxleC5oIgogQ0ZYX1B0ckxpc3Q6OkNGWF9QdHJMaXN0KGludCBuQmxvY2tTaXplKQotICAgIDogbV9wTm9kZUhlYWQoTlVMTCkKLSAgICAsIG1fcE5vZGVUYWlsKE5VTEwpCi0gICAgLCBtX25Db3VudCgwKQotICAgICwgbV9wTm9kZUZyZWUoTlVMTCkKLSAgICAsIG1fcEJsb2NrcyhOVUxMKQotICAgICwgbV9uQmxvY2tTaXplKG5CbG9ja1NpemUpCi17Ci19Ci1GWF9QT1NJVElPTiBDRlhfUHRyTGlzdDo6QWRkVGFpbCh2b2lkKiBuZXdFbGVtZW50KQotewotICAgIENOb2RlKiBwTmV3Tm9kZSA9IE5ld05vZGUobV9wTm9kZVRhaWwsIE5VTEwpOwotICAgIHBOZXdOb2RlLT5kYXRhID0gbmV3RWxlbWVudDsKLSAgICBpZiAobV9wTm9kZVRhaWwgIT0gTlVMTCkgewotICAgICAgICBtX3BOb2RlVGFpbC0+cE5leHQgPSBwTmV3Tm9kZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BOb2RlSGVhZCA9IHBOZXdOb2RlOwotICAgIH0KLSAgICBtX3BOb2RlVGFpbCA9IHBOZXdOb2RlOwotICAgIHJldHVybiAoRlhfUE9TSVRJT04pIHBOZXdOb2RlOwotfQotRlhfUE9TSVRJT04gQ0ZYX1B0ckxpc3Q6OkFkZEhlYWQodm9pZCogbmV3RWxlbWVudCkKLXsKLSAgICBDTm9kZSogcE5ld05vZGUgPSBOZXdOb2RlKE5VTEwsIG1fcE5vZGVIZWFkKTsKLSAgICBwTmV3Tm9kZS0+ZGF0YSA9IG5ld0VsZW1lbnQ7Ci0gICAgaWYgKG1fcE5vZGVIZWFkICE9IE5VTEwpIHsKLSAgICAgICAgbV9wTm9kZUhlYWQtPnBQcmV2ID0gcE5ld05vZGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wTm9kZVRhaWwgPSBwTmV3Tm9kZTsKLSAgICB9CisgICAgOiBtX3BOb2RlSGVhZChOVUxMKSwKKyAgICAgIG1fcE5vZGVUYWlsKE5VTEwpLAorICAgICAgbV9uQ291bnQoMCksCisgICAgICBtX3BOb2RlRnJlZShOVUxMKSwKKyAgICAgIG1fcEJsb2NrcyhOVUxMKSwKKyAgICAgIG1fbkJsb2NrU2l6ZShuQmxvY2tTaXplKSB7fQorRlhfUE9TSVRJT04gQ0ZYX1B0ckxpc3Q6OkFkZFRhaWwodm9pZCogbmV3RWxlbWVudCkgeworICBDTm9kZSogcE5ld05vZGUgPSBOZXdOb2RlKG1fcE5vZGVUYWlsLCBOVUxMKTsKKyAgcE5ld05vZGUtPmRhdGEgPSBuZXdFbGVtZW50OworICBpZiAobV9wTm9kZVRhaWwgIT0gTlVMTCkgeworICAgIG1fcE5vZGVUYWlsLT5wTmV4dCA9IHBOZXdOb2RlOworICB9IGVsc2UgewogICAgIG1fcE5vZGVIZWFkID0gcE5ld05vZGU7Ci0gICAgcmV0dXJuIChGWF9QT1NJVElPTikgcE5ld05vZGU7CisgIH0KKyAgbV9wTm9kZVRhaWwgPSBwTmV3Tm9kZTsKKyAgcmV0dXJuIChGWF9QT1NJVElPTilwTmV3Tm9kZTsKIH0KLUZYX1BPU0lUSU9OIENGWF9QdHJMaXN0OjpJbnNlcnRBZnRlcihGWF9QT1NJVElPTiBwb3NpdGlvbiwgdm9pZCogbmV3RWxlbWVudCkKLXsKLSAgICBpZiAocG9zaXRpb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQWRkVGFpbChuZXdFbGVtZW50KTsKLSAgICB9Ci0gICAgQ05vZGUqIHBPbGROb2RlID0gKENOb2RlKikgcG9zaXRpb247Ci0gICAgQ05vZGUqIHBOZXdOb2RlID0gTmV3Tm9kZShwT2xkTm9kZSwgcE9sZE5vZGUtPnBOZXh0KTsKLSAgICBwTmV3Tm9kZS0+ZGF0YSA9IG5ld0VsZW1lbnQ7Ci0gICAgaWYgKHBPbGROb2RlLT5wTmV4dCAhPSBOVUxMKSB7Ci0gICAgICAgIHBPbGROb2RlLT5wTmV4dC0+cFByZXYgPSBwTmV3Tm9kZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BOb2RlVGFpbCA9IHBOZXdOb2RlOwotICAgIH0KLSAgICBwT2xkTm9kZS0+cE5leHQgPSBwTmV3Tm9kZTsKLSAgICByZXR1cm4gKEZYX1BPU0lUSU9OKSBwTmV3Tm9kZTsKK0ZYX1BPU0lUSU9OIENGWF9QdHJMaXN0OjpBZGRIZWFkKHZvaWQqIG5ld0VsZW1lbnQpIHsKKyAgQ05vZGUqIHBOZXdOb2RlID0gTmV3Tm9kZShOVUxMLCBtX3BOb2RlSGVhZCk7CisgIHBOZXdOb2RlLT5kYXRhID0gbmV3RWxlbWVudDsKKyAgaWYgKG1fcE5vZGVIZWFkICE9IE5VTEwpIHsKKyAgICBtX3BOb2RlSGVhZC0+cFByZXYgPSBwTmV3Tm9kZTsKKyAgfSBlbHNlIHsKKyAgICBtX3BOb2RlVGFpbCA9IHBOZXdOb2RlOworICB9CisgIG1fcE5vZGVIZWFkID0gcE5ld05vZGU7CisgIHJldHVybiAoRlhfUE9TSVRJT04pcE5ld05vZGU7CiB9Ci12b2lkIENGWF9QdHJMaXN0OjpSZW1vdmVBdChGWF9QT1NJVElPTiBwb3NpdGlvbikKLXsKLSAgICBDTm9kZSogcE9sZE5vZGUgPSAoQ05vZGUqKSBwb3NpdGlvbjsKLSAgICBpZiAocE9sZE5vZGUgPT0gbV9wTm9kZUhlYWQpIHsKLSAgICAgICAgbV9wTm9kZUhlYWQgPSBwT2xkTm9kZS0+cE5leHQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcE9sZE5vZGUtPnBQcmV2LT5wTmV4dCA9IHBPbGROb2RlLT5wTmV4dDsKLSAgICB9Ci0gICAgaWYgKHBPbGROb2RlID09IG1fcE5vZGVUYWlsKSB7Ci0gICAgICAgIG1fcE5vZGVUYWlsID0gcE9sZE5vZGUtPnBQcmV2OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBPbGROb2RlLT5wTmV4dC0+cFByZXYgPSBwT2xkTm9kZS0+cFByZXY7Ci0gICAgfQotICAgIEZyZWVOb2RlKHBPbGROb2RlKTsKK0ZYX1BPU0lUSU9OIENGWF9QdHJMaXN0OjpJbnNlcnRBZnRlcihGWF9QT1NJVElPTiBwb3NpdGlvbiwgdm9pZCogbmV3RWxlbWVudCkgeworICBpZiAocG9zaXRpb24gPT0gTlVMTCkgeworICAgIHJldHVybiBBZGRUYWlsKG5ld0VsZW1lbnQpOworICB9CisgIENOb2RlKiBwT2xkTm9kZSA9IChDTm9kZSopcG9zaXRpb247CisgIENOb2RlKiBwTmV3Tm9kZSA9IE5ld05vZGUocE9sZE5vZGUsIHBPbGROb2RlLT5wTmV4dCk7CisgIHBOZXdOb2RlLT5kYXRhID0gbmV3RWxlbWVudDsKKyAgaWYgKHBPbGROb2RlLT5wTmV4dCAhPSBOVUxMKSB7CisgICAgcE9sZE5vZGUtPnBOZXh0LT5wUHJldiA9IHBOZXdOb2RlOworICB9IGVsc2UgeworICAgIG1fcE5vZGVUYWlsID0gcE5ld05vZGU7CisgIH0KKyAgcE9sZE5vZGUtPnBOZXh0ID0gcE5ld05vZGU7CisgIHJldHVybiAoRlhfUE9TSVRJT04pcE5ld05vZGU7CiB9Ci12b2lkIENGWF9QdHJMaXN0OjpGcmVlTm9kZShDRlhfUHRyTGlzdDo6Q05vZGUqIHBOb2RlKQotewotICAgIHBOb2RlLT5wTmV4dCA9IG1fcE5vZGVGcmVlOwotICAgIG1fcE5vZGVGcmVlID0gcE5vZGU7Ci0gICAgbV9uQ291bnQtLTsKLSAgICBpZiAobV9uQ291bnQgPT0gMCkgewotICAgICAgICBSZW1vdmVBbGwoKTsKLSAgICB9Cit2b2lkIENGWF9QdHJMaXN0OjpSZW1vdmVBdChGWF9QT1NJVElPTiBwb3NpdGlvbikgeworICBDTm9kZSogcE9sZE5vZGUgPSAoQ05vZGUqKXBvc2l0aW9uOworICBpZiAocE9sZE5vZGUgPT0gbV9wTm9kZUhlYWQpIHsKKyAgICBtX3BOb2RlSGVhZCA9IHBPbGROb2RlLT5wTmV4dDsKKyAgfSBlbHNlIHsKKyAgICBwT2xkTm9kZS0+cFByZXYtPnBOZXh0ID0gcE9sZE5vZGUtPnBOZXh0OworICB9CisgIGlmIChwT2xkTm9kZSA9PSBtX3BOb2RlVGFpbCkgeworICAgIG1fcE5vZGVUYWlsID0gcE9sZE5vZGUtPnBQcmV2OworICB9IGVsc2UgeworICAgIHBPbGROb2RlLT5wTmV4dC0+cFByZXYgPSBwT2xkTm9kZS0+cFByZXY7CisgIH0KKyAgRnJlZU5vZGUocE9sZE5vZGUpOwogfQotdm9pZCBDRlhfUHRyTGlzdDo6UmVtb3ZlQWxsKCkKLXsKLSAgICBtX25Db3VudCA9IDA7Ci0gICAgbV9wTm9kZUhlYWQgPSBtX3BOb2RlVGFpbCA9IG1fcE5vZGVGcmVlID0gTlVMTDsKLSAgICBtX3BCbG9ja3MtPkZyZWVEYXRhQ2hhaW4oKTsKLSAgICBtX3BCbG9ja3MgPSBOVUxMOwotfQotQ0ZYX1B0ckxpc3Q6OkNOb2RlKgotQ0ZYX1B0ckxpc3Q6Ok5ld05vZGUoQ0ZYX1B0ckxpc3Q6OkNOb2RlKiBwUHJldiwgQ0ZYX1B0ckxpc3Q6OkNOb2RlKiBwTmV4dCkKLXsKLSAgICBpZiAobV9wTm9kZUZyZWUgPT0gTlVMTCkgewotICAgICAgICBDRlhfUGxleCogcE5ld0Jsb2NrID0gQ0ZYX1BsZXg6OkNyZWF0ZShtX3BCbG9ja3MsIG1fbkJsb2NrU2l6ZSwgc2l6ZW9mKENOb2RlKSk7Ci0gICAgICAgIENOb2RlKiBwTm9kZSA9IChDTm9kZSopcE5ld0Jsb2NrLT5kYXRhKCk7Ci0gICAgICAgIHBOb2RlICs9IG1fbkJsb2NrU2l6ZSAtIDE7Ci0gICAgICAgIGZvciAoaW50IGkgPSBtX25CbG9ja1NpemUgLSAxOyBpID49IDA7IGktLSwgcE5vZGUtLSkgewotICAgICAgICAgICAgcE5vZGUtPnBOZXh0ID0gbV9wTm9kZUZyZWU7Ci0gICAgICAgICAgICBtX3BOb2RlRnJlZSA9IHBOb2RlOwotICAgICAgICB9Ci0gICAgfQotICAgIEFTU0VSVChtX3BOb2RlRnJlZSAhPSBOVUxMKTsKLSAgICBDRlhfUHRyTGlzdDo6Q05vZGUqIHBOb2RlID0gbV9wTm9kZUZyZWU7Ci0gICAgbV9wTm9kZUZyZWUgPSBtX3BOb2RlRnJlZS0+cE5leHQ7Ci0gICAgcE5vZGUtPnBQcmV2ID0gcFByZXY7Ci0gICAgcE5vZGUtPnBOZXh0ID0gcE5leHQ7Ci0gICAgbV9uQ291bnQrKzsKLSAgICBBU1NFUlQobV9uQ291bnQgPiAwKTsKLSAgICBwTm9kZS0+ZGF0YSA9IDA7Ci0gICAgcmV0dXJuIHBOb2RlOwotfQotQ0ZYX1B0ckxpc3Q6On5DRlhfUHRyTGlzdCgpCi17Cit2b2lkIENGWF9QdHJMaXN0OjpGcmVlTm9kZShDRlhfUHRyTGlzdDo6Q05vZGUqIHBOb2RlKSB7CisgIHBOb2RlLT5wTmV4dCA9IG1fcE5vZGVGcmVlOworICBtX3BOb2RlRnJlZSA9IHBOb2RlOworICBtX25Db3VudC0tOworICBpZiAobV9uQ291bnQgPT0gMCkgewogICAgIFJlbW92ZUFsbCgpOwotICAgIEFTU0VSVChtX25Db3VudCA9PSAwKTsKKyAgfQogfQotRlhfUE9TSVRJT04gQ0ZYX1B0ckxpc3Q6OkZpbmRJbmRleChpbnQgbkluZGV4KSBjb25zdAotewotICAgIGlmIChuSW5kZXggPj0gbV9uQ291bnQgfHwgbkluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ05vZGUqIHBOb2RlID0gbV9wTm9kZUhlYWQ7Ci0gICAgd2hpbGUgKG5JbmRleC0tKSB7Ci0gICAgICAgIHBOb2RlID0gcE5vZGUtPnBOZXh0OwotICAgIH0KLSAgICByZXR1cm4gKEZYX1BPU0lUSU9OKSBwTm9kZTsKK3ZvaWQgQ0ZYX1B0ckxpc3Q6OlJlbW92ZUFsbCgpIHsKKyAgbV9uQ291bnQgPSAwOworICBtX3BOb2RlSGVhZCA9IG1fcE5vZGVUYWlsID0gbV9wTm9kZUZyZWUgPSBOVUxMOworICBtX3BCbG9ja3MtPkZyZWVEYXRhQ2hhaW4oKTsKKyAgbV9wQmxvY2tzID0gTlVMTDsKIH0KLUZYX1BPU0lUSU9OIENGWF9QdHJMaXN0OjpGaW5kKHZvaWQqIHNlYXJjaFZhbHVlLCBGWF9QT1NJVElPTiBzdGFydEFmdGVyKSBjb25zdAotewotICAgIENOb2RlKiBwTm9kZSA9IChDTm9kZSopIHN0YXJ0QWZ0ZXI7Ci0gICAgaWYgKHBOb2RlID09IE5VTEwpIHsKLSAgICAgICAgcE5vZGUgPSBtX3BOb2RlSGVhZDsKLSAgICB9IGVsc2UgewotICAgICAgICBwTm9kZSA9IHBOb2RlLT5wTmV4dDsKK0NGWF9QdHJMaXN0OjpDTm9kZSogQ0ZYX1B0ckxpc3Q6Ok5ld05vZGUoQ0ZYX1B0ckxpc3Q6OkNOb2RlKiBwUHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckxpc3Q6OkNOb2RlKiBwTmV4dCkgeworICBpZiAobV9wTm9kZUZyZWUgPT0gTlVMTCkgeworICAgIENGWF9QbGV4KiBwTmV3QmxvY2sgPQorICAgICAgICBDRlhfUGxleDo6Q3JlYXRlKG1fcEJsb2NrcywgbV9uQmxvY2tTaXplLCBzaXplb2YoQ05vZGUpKTsKKyAgICBDTm9kZSogcE5vZGUgPSAoQ05vZGUqKXBOZXdCbG9jay0+ZGF0YSgpOworICAgIHBOb2RlICs9IG1fbkJsb2NrU2l6ZSAtIDE7CisgICAgZm9yIChpbnQgaSA9IG1fbkJsb2NrU2l6ZSAtIDE7IGkgPj0gMDsgaS0tLCBwTm9kZS0tKSB7CisgICAgICBwTm9kZS0+cE5leHQgPSBtX3BOb2RlRnJlZTsKKyAgICAgIG1fcE5vZGVGcmVlID0gcE5vZGU7CiAgICAgfQotICAgIGZvciAoOyBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5wTmV4dCkKLSAgICAgICAgaWYgKHBOb2RlLT5kYXRhID09IHNlYXJjaFZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEZYX1BPU0lUSU9OKSBwTm9kZTsKLSAgICAgICAgfQorICB9CisgIEFTU0VSVChtX3BOb2RlRnJlZSAhPSBOVUxMKTsKKyAgQ0ZYX1B0ckxpc3Q6OkNOb2RlKiBwTm9kZSA9IG1fcE5vZGVGcmVlOworICBtX3BOb2RlRnJlZSA9IG1fcE5vZGVGcmVlLT5wTmV4dDsKKyAgcE5vZGUtPnBQcmV2ID0gcFByZXY7CisgIHBOb2RlLT5wTmV4dCA9IHBOZXh0OworICBtX25Db3VudCsrOworICBBU1NFUlQobV9uQ291bnQgPiAwKTsKKyAgcE5vZGUtPmRhdGEgPSAwOworICByZXR1cm4gcE5vZGU7Cit9CitDRlhfUHRyTGlzdDo6fkNGWF9QdHJMaXN0KCkgeworICBSZW1vdmVBbGwoKTsKKyAgQVNTRVJUKG1fbkNvdW50ID09IDApOworfQorRlhfUE9TSVRJT04gQ0ZYX1B0ckxpc3Q6OkZpbmRJbmRleChpbnQgbkluZGV4KSBjb25zdCB7CisgIGlmIChuSW5kZXggPj0gbV9uQ291bnQgfHwgbkluZGV4IDwgMCkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIENOb2RlKiBwTm9kZSA9IG1fcE5vZGVIZWFkOworICB3aGlsZSAobkluZGV4LS0pIHsKKyAgICBwTm9kZSA9IHBOb2RlLT5wTmV4dDsKKyAgfQorICByZXR1cm4gKEZYX1BPU0lUSU9OKXBOb2RlOworfQorRlhfUE9TSVRJT04gQ0ZYX1B0ckxpc3Q6OkZpbmQodm9pZCogc2VhcmNoVmFsdWUsIEZYX1BPU0lUSU9OIHN0YXJ0QWZ0ZXIpIGNvbnN0IHsKKyAgQ05vZGUqIHBOb2RlID0gKENOb2RlKilzdGFydEFmdGVyOworICBpZiAocE5vZGUgPT0gTlVMTCkgeworICAgIHBOb2RlID0gbV9wTm9kZUhlYWQ7CisgIH0gZWxzZSB7CisgICAgcE5vZGUgPSBwTm9kZS0+cE5leHQ7CisgIH0KKyAgZm9yICg7IHBOb2RlICE9IE5VTEw7IHBOb2RlID0gcE5vZGUtPnBOZXh0KQorICAgIGlmIChwTm9kZS0+ZGF0YSA9PSBzZWFyY2hWYWx1ZSkgeworICAgICAgcmV0dXJuIChGWF9QT1NJVElPTilwTm9kZTsKKyAgICB9CisgIHJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWFwcy5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tYXBzLmNwcAppbmRleCBlMzRhY2IwLi4xNGE2ODFiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tYXBzLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tYXBzLmNwcApAQCAtNyw2MzYgKzcsNjEwIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgInBsZXguaCIKIAotc3RhdGljIHZvaWQgQ29uc3RydWN0RWxlbWVudChDRlhfQnl0ZVN0cmluZyogcE5ld0RhdGEpCi17Ci0gICAgbmV3IChwTmV3RGF0YSkgQ0ZYX0J5dGVTdHJpbmcoKTsKK3N0YXRpYyB2b2lkIENvbnN0cnVjdEVsZW1lbnQoQ0ZYX0J5dGVTdHJpbmcqIHBOZXdEYXRhKSB7CisgIG5ldyAocE5ld0RhdGEpIENGWF9CeXRlU3RyaW5nKCk7CiB9Ci1zdGF0aWMgdm9pZCBEZXN0cnVjdEVsZW1lbnQoQ0ZYX0J5dGVTdHJpbmcqIHBPbGREYXRhKQotewotICAgIHBPbGREYXRhLT5+Q0ZYX0J5dGVTdHJpbmcoKTsKK3N0YXRpYyB2b2lkIERlc3RydWN0RWxlbWVudChDRlhfQnl0ZVN0cmluZyogcE9sZERhdGEpIHsKKyAgcE9sZERhdGEtPn5DRlhfQnl0ZVN0cmluZygpOwogfQogQ0ZYX01hcFB0clRvUHRyOjpDRlhfTWFwUHRyVG9QdHIoaW50IG5CbG9ja1NpemUpCi0gICAgOiBtX3BIYXNoVGFibGUoTlVMTCkKLSAgICAsIG1fbkhhc2hUYWJsZVNpemUoMTcpCi0gICAgLCBtX25Db3VudCgwKQotICAgICwgbV9wRnJlZUxpc3QoTlVMTCkKLSAgICAsIG1fcEJsb2NrcyhOVUxMKQotICAgICwgbV9uQmxvY2tTaXplKG5CbG9ja1NpemUpCi17Ci0gICAgQVNTRVJUKG1fbkJsb2NrU2l6ZSA+IDApOworICAgIDogbV9wSGFzaFRhYmxlKE5VTEwpLAorICAgICAgbV9uSGFzaFRhYmxlU2l6ZSgxNyksCisgICAgICBtX25Db3VudCgwKSwKKyAgICAgIG1fcEZyZWVMaXN0KE5VTEwpLAorICAgICAgbV9wQmxvY2tzKE5VTEwpLAorICAgICAgbV9uQmxvY2tTaXplKG5CbG9ja1NpemUpIHsKKyAgQVNTRVJUKG1fbkJsb2NrU2l6ZSA+IDApOwogfQotdm9pZCBDRlhfTWFwUHRyVG9QdHI6OlJlbW92ZUFsbCgpCi17Ci0gICAgaWYgKG1fcEhhc2hUYWJsZSkgewotICAgICAgICBGWF9GcmVlKG1fcEhhc2hUYWJsZSk7Ci0gICAgICAgIG1fcEhhc2hUYWJsZSA9IE5VTEw7Ci0gICAgfQotICAgIG1fbkNvdW50ID0gMDsKLSAgICBtX3BGcmVlTGlzdCA9IE5VTEw7Ci0gICAgbV9wQmxvY2tzLT5GcmVlRGF0YUNoYWluKCk7Ci0gICAgbV9wQmxvY2tzID0gTlVMTDsKK3ZvaWQgQ0ZYX01hcFB0clRvUHRyOjpSZW1vdmVBbGwoKSB7CisgIGlmIChtX3BIYXNoVGFibGUpIHsKKyAgICBGWF9GcmVlKG1fcEhhc2hUYWJsZSk7CisgICAgbV9wSGFzaFRhYmxlID0gTlVMTDsKKyAgfQorICBtX25Db3VudCA9IDA7CisgIG1fcEZyZWVMaXN0ID0gTlVMTDsKKyAgbV9wQmxvY2tzLT5GcmVlRGF0YUNoYWluKCk7CisgIG1fcEJsb2NrcyA9IE5VTEw7CiB9Ci1DRlhfTWFwUHRyVG9QdHI6On5DRlhfTWFwUHRyVG9QdHIoKQotewotICAgIFJlbW92ZUFsbCgpOwotICAgIEFTU0VSVChtX25Db3VudCA9PSAwKTsKK0NGWF9NYXBQdHJUb1B0cjo6fkNGWF9NYXBQdHJUb1B0cigpIHsKKyAgUmVtb3ZlQWxsKCk7CisgIEFTU0VSVChtX25Db3VudCA9PSAwKTsKIH0KLUZYX0RXT1JEIENGWF9NYXBQdHJUb1B0cjo6SGFzaEtleSh2b2lkKiBrZXkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoRlhfRFdPUkQpKHVpbnRwdHJfdClrZXkpID4+IDQ7CitGWF9EV09SRCBDRlhfTWFwUHRyVG9QdHI6Okhhc2hLZXkodm9pZCoga2V5KSBjb25zdCB7CisgIHJldHVybiAoKEZYX0RXT1JEKSh1aW50cHRyX3Qpa2V5KSA+PiA0OwogfQotdm9pZCBDRlhfTWFwUHRyVG9QdHI6OkdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbiwgdm9pZComIHJLZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcEhhc2hUYWJsZSAhPSBOVUxMKTsKLSAgICBDQXNzb2MqIHBBc3NvY1JldCA9IChDQXNzb2MqKXJOZXh0UG9zaXRpb247Cit2b2lkIENGWF9NYXBQdHJUb1B0cjo6R2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgcktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHJWYWx1ZSkgY29uc3QgeworICBBU1NFUlQobV9wSGFzaFRhYmxlICE9IE5VTEwpOworICBDQXNzb2MqIHBBc3NvY1JldCA9IChDQXNzb2MqKXJOZXh0UG9zaXRpb247CisgIEFTU0VSVChwQXNzb2NSZXQgIT0gTlVMTCk7CisgIGlmIChwQXNzb2NSZXQgPT0gKENBc3NvYyopLTEpIHsKKyAgICBmb3IgKEZYX0RXT1JEIG5CdWNrZXQgPSAwOyBuQnVja2V0IDwgbV9uSGFzaFRhYmxlU2l6ZTsgbkJ1Y2tldCsrKQorICAgICAgaWYgKChwQXNzb2NSZXQgPSBtX3BIYXNoVGFibGVbbkJ1Y2tldF0pICE9IE5VTEwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgQVNTRVJUKHBBc3NvY1JldCAhPSBOVUxMKTsKLSAgICBpZiAocEFzc29jUmV0ID09IChDQXNzb2MqKSAtIDEpIHsKLSAgICAgICAgZm9yIChGWF9EV09SRCBuQnVja2V0ID0gMDsgbkJ1Y2tldCA8IG1fbkhhc2hUYWJsZVNpemU7IG5CdWNrZXQrKykKLSAgICAgICAgICAgIGlmICgocEFzc29jUmV0ID0gbV9wSGFzaFRhYmxlW25CdWNrZXRdKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIEFTU0VSVChwQXNzb2NSZXQgIT0gTlVMTCk7CisgIH0KKyAgQ0Fzc29jKiBwQXNzb2NOZXh0OworICBpZiAoKHBBc3NvY05leHQgPSBwQXNzb2NSZXQtPnBOZXh0KSA9PSBOVUxMKSB7CisgICAgZm9yIChGWF9EV09SRCBuQnVja2V0ID0gKEhhc2hLZXkocEFzc29jUmV0LT5rZXkpICUgbV9uSGFzaFRhYmxlU2l6ZSkgKyAxOworICAgICAgICAgbkJ1Y2tldCA8IG1fbkhhc2hUYWJsZVNpemU7IG5CdWNrZXQrKykgeworICAgICAgaWYgKChwQXNzb2NOZXh0ID0gbV9wSGFzaFRhYmxlW25CdWNrZXRdKSAhPSBOVUxMKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICBDQXNzb2MqIHBBc3NvY05leHQ7Ci0gICAgaWYgKChwQXNzb2NOZXh0ID0gcEFzc29jUmV0LT5wTmV4dCkgPT0gTlVMTCkgewotICAgICAgICBmb3IgKEZYX0RXT1JEIG5CdWNrZXQgPSAoSGFzaEtleShwQXNzb2NSZXQtPmtleSkgJSBtX25IYXNoVGFibGVTaXplKSArIDE7IG5CdWNrZXQgPCBtX25IYXNoVGFibGVTaXplOyBuQnVja2V0ICsrKSB7Ci0gICAgICAgICAgICBpZiAoKHBBc3NvY05leHQgPSBtX3BIYXNoVGFibGVbbkJ1Y2tldF0pICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByTmV4dFBvc2l0aW9uID0gKEZYX1BPU0lUSU9OKSBwQXNzb2NOZXh0OwotICAgIHJLZXkgPSBwQXNzb2NSZXQtPmtleTsKLSAgICByVmFsdWUgPSBwQXNzb2NSZXQtPnZhbHVlOworICB9CisgIHJOZXh0UG9zaXRpb24gPSAoRlhfUE9TSVRJT04pcEFzc29jTmV4dDsKKyAgcktleSA9IHBBc3NvY1JldC0+a2V5OworICByVmFsdWUgPSBwQXNzb2NSZXQtPnZhbHVlOwogfQotRlhfQk9PTCBDRlhfTWFwUHRyVG9QdHI6Okxvb2t1cCh2b2lkKiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0Ci17Ci0gICAgRlhfRFdPUkQgbkhhc2g7Ci0gICAgQ0Fzc29jKiBwQXNzb2MgPSBHZXRBc3NvY0F0KGtleSwgbkhhc2gpOwotICAgIGlmIChwQXNzb2MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJWYWx1ZSA9IHBBc3NvYy0+dmFsdWU7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkKiBDRlhfTWFwUHRyVG9QdHI6OkdldFZhbHVlQXQodm9pZCoga2V5KSBjb25zdAotewotICAgIEZYX0RXT1JEIG5IYXNoOwotICAgIENBc3NvYyogcEFzc29jID0gR2V0QXNzb2NBdChrZXksIG5IYXNoKTsKLSAgICBpZiAocEFzc29jID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwQXNzb2MtPnZhbHVlOwotfQotdm9pZComIENGWF9NYXBQdHJUb1B0cjo6b3BlcmF0b3JbXSh2b2lkKiBrZXkpCi17Ci0gICAgRlhfRFdPUkQgbkhhc2g7Ci0gICAgQ0Fzc29jKiBwQXNzb2M7Ci0gICAgaWYgKChwQXNzb2MgPSBHZXRBc3NvY0F0KGtleSwgbkhhc2gpKSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgewotICAgICAgICAgICAgSW5pdEhhc2hUYWJsZShtX25IYXNoVGFibGVTaXplKTsKLSAgICAgICAgfQotICAgICAgICBwQXNzb2MgPSBOZXdBc3NvYygpOwotICAgICAgICBwQXNzb2MtPmtleSA9IGtleTsKLSAgICAgICAgcEFzc29jLT5wTmV4dCA9IG1fcEhhc2hUYWJsZVtuSGFzaF07Ci0gICAgICAgIG1fcEhhc2hUYWJsZVtuSGFzaF0gPSBwQXNzb2M7Ci0gICAgfQotICAgIHJldHVybiBwQXNzb2MtPnZhbHVlOwotfQotQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqCi1DRlhfTWFwUHRyVG9QdHI6OkdldEFzc29jQXQodm9pZCoga2V5LCBGWF9EV09SRCYgbkhhc2gpIGNvbnN0Ci17Ci0gICAgbkhhc2ggPSBIYXNoS2V5KGtleSkgJSBtX25IYXNoVGFibGVTaXplOwotICAgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0Fzc29jKiBwQXNzb2M7Ci0gICAgZm9yIChwQXNzb2MgPSBtX3BIYXNoVGFibGVbbkhhc2hdOyBwQXNzb2MgIT0gTlVMTDsgcEFzc29jID0gcEFzc29jLT5wTmV4dCkgewotICAgICAgICBpZiAocEFzc29jLT5rZXkgPT0ga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gcEFzc29jOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqCi1DRlhfTWFwUHRyVG9QdHI6Ok5ld0Fzc29jKCkKLXsKLSAgICBpZiAobV9wRnJlZUxpc3QgPT0gTlVMTCkgewotICAgICAgICBDRlhfUGxleCogbmV3QmxvY2sgPSBDRlhfUGxleDo6Q3JlYXRlKG1fcEJsb2NrcywgbV9uQmxvY2tTaXplLCBzaXplb2YoQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MpKTsKLSAgICAgICAgQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqIHBBc3NvYyA9IChDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyopbmV3QmxvY2stPmRhdGEoKTsKLSAgICAgICAgcEFzc29jICs9IG1fbkJsb2NrU2l6ZSAtIDE7Ci0gICAgICAgIGZvciAoaW50IGkgPSBtX25CbG9ja1NpemUgLSAxOyBpID49IDA7IGktLSwgcEFzc29jLS0pIHsKLSAgICAgICAgICAgIHBBc3NvYy0+cE5leHQgPSBtX3BGcmVlTGlzdDsKLSAgICAgICAgICAgIG1fcEZyZWVMaXN0ID0gcEFzc29jOwotICAgICAgICB9Ci0gICAgfQotICAgIEFTU0VSVChtX3BGcmVlTGlzdCAhPSBOVUxMKTsKLSAgICBDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyogcEFzc29jID0gbV9wRnJlZUxpc3Q7Ci0gICAgbV9wRnJlZUxpc3QgPSBtX3BGcmVlTGlzdC0+cE5leHQ7Ci0gICAgbV9uQ291bnQrKzsKLSAgICBBU1NFUlQobV9uQ291bnQgPiAwKTsKLSAgICBwQXNzb2MtPmtleSA9IDA7Ci0gICAgcEFzc29jLT52YWx1ZSA9IDA7Ci0gICAgcmV0dXJuIHBBc3NvYzsKLX0KLXZvaWQgQ0ZYX01hcFB0clRvUHRyOjpJbml0SGFzaFRhYmxlKAotICAgIEZYX0RXT1JEIG5IYXNoU2l6ZSwgRlhfQk9PTCBiQWxsb2NOb3cpCi17Ci0gICAgQVNTRVJUKG1fbkNvdW50ID09IDApOwotICAgIEFTU0VSVChuSGFzaFNpemUgPiAwKTsKLSAgICBpZiAobV9wSGFzaFRhYmxlICE9IE5VTEwpIHsKLSAgICAgICAgRlhfRnJlZShtX3BIYXNoVGFibGUpOwotICAgICAgICBtX3BIYXNoVGFibGUgPSBOVUxMOwotICAgIH0KLSAgICBpZiAoYkFsbG9jTm93KSB7Ci0gICAgICAgIG1fcEhhc2hUYWJsZSA9IEZYX0FsbG9jKENBc3NvYyosIG5IYXNoU2l6ZSk7Ci0gICAgfQotICAgIG1fbkhhc2hUYWJsZVNpemUgPSBuSGFzaFNpemU7Ci19Ci1GWF9CT09MIENGWF9NYXBQdHJUb1B0cjo6UmVtb3ZlS2V5KHZvaWQqIGtleSkKLXsKLSAgICBpZiAobV9wSGFzaFRhYmxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDQXNzb2MqKiBwcEFzc29jUHJldjsKLSAgICBwcEFzc29jUHJldiA9ICZtX3BIYXNoVGFibGVbSGFzaEtleShrZXkpICUgbV9uSGFzaFRhYmxlU2l6ZV07Ci0gICAgQ0Fzc29jKiBwQXNzb2M7Ci0gICAgZm9yIChwQXNzb2MgPSAqcHBBc3NvY1ByZXY7IHBBc3NvYyAhPSBOVUxMOyBwQXNzb2MgPSBwQXNzb2MtPnBOZXh0KSB7Ci0gICAgICAgIGlmIChwQXNzb2MtPmtleSA9PSBrZXkpIHsKLSAgICAgICAgICAgICpwcEFzc29jUHJldiA9IHBBc3NvYy0+cE5leHQ7Ci0gICAgICAgICAgICBGcmVlQXNzb2MocEFzc29jKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHBwQXNzb2NQcmV2ID0gJnBBc3NvYy0+cE5leHQ7Ci0gICAgfQorRlhfQk9PTCBDRlhfTWFwUHRyVG9QdHI6Okxvb2t1cCh2b2lkKiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0IHsKKyAgRlhfRFdPUkQgbkhhc2g7CisgIENBc3NvYyogcEFzc29jID0gR2V0QXNzb2NBdChrZXksIG5IYXNoKTsKKyAgaWYgKHBBc3NvYyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJWYWx1ZSA9IHBBc3NvYy0+dmFsdWU7CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDRlhfTWFwUHRyVG9QdHI6OkZyZWVBc3NvYyhDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyogcEFzc29jKQotewotICAgIHBBc3NvYy0+cE5leHQgPSBtX3BGcmVlTGlzdDsKLSAgICBtX3BGcmVlTGlzdCA9IHBBc3NvYzsKLSAgICBtX25Db3VudC0tOwotICAgIEFTU0VSVChtX25Db3VudCA+PSAwKTsKLSAgICBpZiAobV9uQ291bnQgPT0gMCkgewotICAgICAgICBSZW1vdmVBbGwoKTsKK3ZvaWQqIENGWF9NYXBQdHJUb1B0cjo6R2V0VmFsdWVBdCh2b2lkKiBrZXkpIGNvbnN0IHsKKyAgRlhfRFdPUkQgbkhhc2g7CisgIENBc3NvYyogcEFzc29jID0gR2V0QXNzb2NBdChrZXksIG5IYXNoKTsKKyAgaWYgKHBBc3NvYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHBBc3NvYy0+dmFsdWU7Cit9Cit2b2lkKiYgQ0ZYX01hcFB0clRvUHRyOjpvcGVyYXRvcltdKHZvaWQqIGtleSkgeworICBGWF9EV09SRCBuSGFzaDsKKyAgQ0Fzc29jKiBwQXNzb2M7CisgIGlmICgocEFzc29jID0gR2V0QXNzb2NBdChrZXksIG5IYXNoKSkgPT0gTlVMTCkgeworICAgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgeworICAgICAgSW5pdEhhc2hUYWJsZShtX25IYXNoVGFibGVTaXplKTsKICAgICB9CisgICAgcEFzc29jID0gTmV3QXNzb2MoKTsKKyAgICBwQXNzb2MtPmtleSA9IGtleTsKKyAgICBwQXNzb2MtPnBOZXh0ID0gbV9wSGFzaFRhYmxlW25IYXNoXTsKKyAgICBtX3BIYXNoVGFibGVbbkhhc2hdID0gcEFzc29jOworICB9CisgIHJldHVybiBwQXNzb2MtPnZhbHVlOworfQorQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqIENGWF9NYXBQdHJUb1B0cjo6R2V0QXNzb2NBdCh2b2lkKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBuSGFzaCkgY29uc3QgeworICBuSGFzaCA9IEhhc2hLZXkoa2V5KSAlIG1fbkhhc2hUYWJsZVNpemU7CisgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENBc3NvYyogcEFzc29jOworICBmb3IgKHBBc3NvYyA9IG1fcEhhc2hUYWJsZVtuSGFzaF07IHBBc3NvYyAhPSBOVUxMOyBwQXNzb2MgPSBwQXNzb2MtPnBOZXh0KSB7CisgICAgaWYgKHBBc3NvYy0+a2V5ID09IGtleSkgeworICAgICAgcmV0dXJuIHBBc3NvYzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyogQ0ZYX01hcFB0clRvUHRyOjpOZXdBc3NvYygpIHsKKyAgaWYgKG1fcEZyZWVMaXN0ID09IE5VTEwpIHsKKyAgICBDRlhfUGxleCogbmV3QmxvY2sgPSBDRlhfUGxleDo6Q3JlYXRlKG1fcEJsb2NrcywgbV9uQmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENGWF9NYXBQdHJUb1B0cjo6Q0Fzc29jKSk7CisgICAgQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqIHBBc3NvYyA9CisgICAgICAgIChDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyopbmV3QmxvY2stPmRhdGEoKTsKKyAgICBwQXNzb2MgKz0gbV9uQmxvY2tTaXplIC0gMTsKKyAgICBmb3IgKGludCBpID0gbV9uQmxvY2tTaXplIC0gMTsgaSA+PSAwOyBpLS0sIHBBc3NvYy0tKSB7CisgICAgICBwQXNzb2MtPnBOZXh0ID0gbV9wRnJlZUxpc3Q7CisgICAgICBtX3BGcmVlTGlzdCA9IHBBc3NvYzsKKyAgICB9CisgIH0KKyAgQVNTRVJUKG1fcEZyZWVMaXN0ICE9IE5VTEwpOworICBDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyogcEFzc29jID0gbV9wRnJlZUxpc3Q7CisgIG1fcEZyZWVMaXN0ID0gbV9wRnJlZUxpc3QtPnBOZXh0OworICBtX25Db3VudCsrOworICBBU1NFUlQobV9uQ291bnQgPiAwKTsKKyAgcEFzc29jLT5rZXkgPSAwOworICBwQXNzb2MtPnZhbHVlID0gMDsKKyAgcmV0dXJuIHBBc3NvYzsKK30KK3ZvaWQgQ0ZYX01hcFB0clRvUHRyOjpJbml0SGFzaFRhYmxlKEZYX0RXT1JEIG5IYXNoU2l6ZSwgRlhfQk9PTCBiQWxsb2NOb3cpIHsKKyAgQVNTRVJUKG1fbkNvdW50ID09IDApOworICBBU1NFUlQobkhhc2hTaXplID4gMCk7CisgIGlmIChtX3BIYXNoVGFibGUgIT0gTlVMTCkgeworICAgIEZYX0ZyZWUobV9wSGFzaFRhYmxlKTsKKyAgICBtX3BIYXNoVGFibGUgPSBOVUxMOworICB9CisgIGlmIChiQWxsb2NOb3cpIHsKKyAgICBtX3BIYXNoVGFibGUgPSBGWF9BbGxvYyhDQXNzb2MqLCBuSGFzaFNpemUpOworICB9CisgIG1fbkhhc2hUYWJsZVNpemUgPSBuSGFzaFNpemU7Cit9CitGWF9CT09MIENGWF9NYXBQdHJUb1B0cjo6UmVtb3ZlS2V5KHZvaWQqIGtleSkgeworICBpZiAobV9wSGFzaFRhYmxlID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0Fzc29jKiogcHBBc3NvY1ByZXY7CisgIHBwQXNzb2NQcmV2ID0gJm1fcEhhc2hUYWJsZVtIYXNoS2V5KGtleSkgJSBtX25IYXNoVGFibGVTaXplXTsKKyAgQ0Fzc29jKiBwQXNzb2M7CisgIGZvciAocEFzc29jID0gKnBwQXNzb2NQcmV2OyBwQXNzb2MgIT0gTlVMTDsgcEFzc29jID0gcEFzc29jLT5wTmV4dCkgeworICAgIGlmIChwQXNzb2MtPmtleSA9PSBrZXkpIHsKKyAgICAgICpwcEFzc29jUHJldiA9IHBBc3NvYy0+cE5leHQ7CisgICAgICBGcmVlQXNzb2MocEFzc29jKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBwcEFzc29jUHJldiA9ICZwQXNzb2MtPnBOZXh0OworICB9CisgIHJldHVybiBGQUxTRTsKK30KK3ZvaWQgQ0ZYX01hcFB0clRvUHRyOjpGcmVlQXNzb2MoQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqIHBBc3NvYykgeworICBwQXNzb2MtPnBOZXh0ID0gbV9wRnJlZUxpc3Q7CisgIG1fcEZyZWVMaXN0ID0gcEFzc29jOworICBtX25Db3VudC0tOworICBBU1NFUlQobV9uQ291bnQgPj0gMCk7CisgIGlmIChtX25Db3VudCA9PSAwKSB7CisgICAgUmVtb3ZlQWxsKCk7CisgIH0KIH0KIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkNGWF9NYXBCeXRlU3RyaW5nVG9QdHIoaW50IG5CbG9ja1NpemUpCi0gICAgOiBtX3BIYXNoVGFibGUoTlVMTCkKLSAgICAsIG1fbkhhc2hUYWJsZVNpemUoMTcpCi0gICAgLCBtX25Db3VudCgwKQotICAgICwgbV9wRnJlZUxpc3QoTlVMTCkKLSAgICAsIG1fcEJsb2NrcyhOVUxMKQotICAgICwgbV9uQmxvY2tTaXplKG5CbG9ja1NpemUpCi17Ci0gICAgQVNTRVJUKG1fbkJsb2NrU2l6ZSA+IDApOworICAgIDogbV9wSGFzaFRhYmxlKE5VTEwpLAorICAgICAgbV9uSGFzaFRhYmxlU2l6ZSgxNyksCisgICAgICBtX25Db3VudCgwKSwKKyAgICAgIG1fcEZyZWVMaXN0KE5VTEwpLAorICAgICAgbV9wQmxvY2tzKE5VTEwpLAorICAgICAgbV9uQmxvY2tTaXplKG5CbG9ja1NpemUpIHsKKyAgQVNTRVJUKG1fbkJsb2NrU2l6ZSA+IDApOwogfQotdm9pZCBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpSZW1vdmVBbGwoKQotewotICAgIGlmIChtX3BIYXNoVGFibGUgIT0gTlVMTCkgewotICAgICAgICBmb3IgKEZYX0RXT1JEIG5IYXNoID0gMDsgbkhhc2ggPCBtX25IYXNoVGFibGVTaXplOyBuSGFzaCsrKSB7Ci0gICAgICAgICAgICBDQXNzb2MqIHBBc3NvYzsKLSAgICAgICAgICAgIGZvciAocEFzc29jID0gbV9wSGFzaFRhYmxlW25IYXNoXTsgcEFzc29jICE9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBBc3NvYyA9IHBBc3NvYy0+cE5leHQpIHsKLSAgICAgICAgICAgICAgICBEZXN0cnVjdEVsZW1lbnQoJnBBc3NvYy0+a2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGWF9GcmVlKG1fcEhhc2hUYWJsZSk7Ci0gICAgICAgIG1fcEhhc2hUYWJsZSA9IE5VTEw7Cit2b2lkIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OlJlbW92ZUFsbCgpIHsKKyAgaWYgKG1fcEhhc2hUYWJsZSAhPSBOVUxMKSB7CisgICAgZm9yIChGWF9EV09SRCBuSGFzaCA9IDA7IG5IYXNoIDwgbV9uSGFzaFRhYmxlU2l6ZTsgbkhhc2grKykgeworICAgICAgQ0Fzc29jKiBwQXNzb2M7CisgICAgICBmb3IgKHBBc3NvYyA9IG1fcEhhc2hUYWJsZVtuSGFzaF07IHBBc3NvYyAhPSBOVUxMOworICAgICAgICAgICBwQXNzb2MgPSBwQXNzb2MtPnBOZXh0KSB7CisgICAgICAgIERlc3RydWN0RWxlbWVudCgmcEFzc29jLT5rZXkpOworICAgICAgfQogICAgIH0KLSAgICBtX25Db3VudCA9IDA7Ci0gICAgbV9wRnJlZUxpc3QgPSBOVUxMOwotICAgIG1fcEJsb2Nrcy0+RnJlZURhdGFDaGFpbigpOwotICAgIG1fcEJsb2NrcyA9IE5VTEw7CisgICAgRlhfRnJlZShtX3BIYXNoVGFibGUpOworICAgIG1fcEhhc2hUYWJsZSA9IE5VTEw7CisgIH0KKyAgbV9uQ291bnQgPSAwOworICBtX3BGcmVlTGlzdCA9IE5VTEw7CisgIG1fcEJsb2Nrcy0+RnJlZURhdGFDaGFpbigpOworICBtX3BCbG9ja3MgPSBOVUxMOwogfQotQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6fkNGWF9NYXBCeXRlU3RyaW5nVG9QdHIoKQotewotICAgIFJlbW92ZUFsbCgpOwotICAgIEFTU0VSVChtX25Db3VudCA9PSAwKTsKK0NGWF9NYXBCeXRlU3RyaW5nVG9QdHI6On5DRlhfTWFwQnl0ZVN0cmluZ1RvUHRyKCkgeworICBSZW1vdmVBbGwoKTsKKyAgQVNTRVJUKG1fbkNvdW50ID09IDApOwogfQogdm9pZCBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpHZXROZXh0QXNzb2MoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24sCi0gICAgICAgIENGWF9CeXRlU3RyaW5nJiByS2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAotewotICAgIEFTU0VSVChtX3BIYXNoVGFibGUgIT0gTlVMTCk7Ci0gICAgQ0Fzc29jKiBwQXNzb2NSZXQgPSAoQ0Fzc29jKilyTmV4dFBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgclZhbHVlKSBjb25zdCB7CisgIEFTU0VSVChtX3BIYXNoVGFibGUgIT0gTlVMTCk7CisgIENBc3NvYyogcEFzc29jUmV0ID0gKENBc3NvYyopck5leHRQb3NpdGlvbjsKKyAgQVNTRVJUKHBBc3NvY1JldCAhPSBOVUxMKTsKKyAgaWYgKHBBc3NvY1JldCA9PSAoQ0Fzc29jKiktMSkgeworICAgIGZvciAoRlhfRFdPUkQgbkJ1Y2tldCA9IDA7IG5CdWNrZXQgPCBtX25IYXNoVGFibGVTaXplOyBuQnVja2V0KyspCisgICAgICBpZiAoKHBBc3NvY1JldCA9IG1fcEhhc2hUYWJsZVtuQnVja2V0XSkgIT0gTlVMTCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICBBU1NFUlQocEFzc29jUmV0ICE9IE5VTEwpOwotICAgIGlmIChwQXNzb2NSZXQgPT0gKENBc3NvYyopIC0gMSkgewotICAgICAgICBmb3IgKEZYX0RXT1JEIG5CdWNrZXQgPSAwOyBuQnVja2V0IDwgbV9uSGFzaFRhYmxlU2l6ZTsgbkJ1Y2tldCsrKQotICAgICAgICAgICAgaWYgKChwQXNzb2NSZXQgPSBtX3BIYXNoVGFibGVbbkJ1Y2tldF0pICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgQVNTRVJUKHBBc3NvY1JldCAhPSBOVUxMKTsKLSAgICB9Ci0gICAgQ0Fzc29jKiBwQXNzb2NOZXh0OwotICAgIGlmICgocEFzc29jTmV4dCA9IHBBc3NvY1JldC0+cE5leHQpID09IE5VTEwpIHsKLSAgICAgICAgZm9yIChGWF9EV09SRCBuQnVja2V0ID0gcEFzc29jUmV0LT5uSGFzaFZhbHVlICsgMTsKLSAgICAgICAgICAgICAgICBuQnVja2V0IDwgbV9uSGFzaFRhYmxlU2l6ZTsgbkJ1Y2tldCsrKQotICAgICAgICAgICAgaWYgKChwQXNzb2NOZXh0ID0gbV9wSGFzaFRhYmxlW25CdWNrZXRdKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIHJOZXh0UG9zaXRpb24gPSAoRlhfUE9TSVRJT04pIHBBc3NvY05leHQ7Ci0gICAgcktleSA9IHBBc3NvY1JldC0+a2V5OwotICAgIHJWYWx1ZSA9IHBBc3NvY1JldC0+dmFsdWU7CisgIH0KKyAgQ0Fzc29jKiBwQXNzb2NOZXh0OworICBpZiAoKHBBc3NvY05leHQgPSBwQXNzb2NSZXQtPnBOZXh0KSA9PSBOVUxMKSB7CisgICAgZm9yIChGWF9EV09SRCBuQnVja2V0ID0gcEFzc29jUmV0LT5uSGFzaFZhbHVlICsgMTsKKyAgICAgICAgIG5CdWNrZXQgPCBtX25IYXNoVGFibGVTaXplOyBuQnVja2V0KyspCisgICAgICBpZiAoKHBBc3NvY05leHQgPSBtX3BIYXNoVGFibGVbbkJ1Y2tldF0pICE9IE5VTEwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0KKyAgck5leHRQb3NpdGlvbiA9IChGWF9QT1NJVElPTilwQXNzb2NOZXh0OworICByS2V5ID0gcEFzc29jUmV0LT5rZXk7CisgIHJWYWx1ZSA9IHBBc3NvY1JldC0+dmFsdWU7CiB9Ci12b2lkKiBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpHZXROZXh0VmFsdWUoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24pIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcEhhc2hUYWJsZSAhPSBOVUxMKTsKLSAgICBDQXNzb2MqIHBBc3NvY1JldCA9IChDQXNzb2MqKXJOZXh0UG9zaXRpb247Cit2b2lkKiBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpHZXROZXh0VmFsdWUoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24pIGNvbnN0IHsKKyAgQVNTRVJUKG1fcEhhc2hUYWJsZSAhPSBOVUxMKTsKKyAgQ0Fzc29jKiBwQXNzb2NSZXQgPSAoQ0Fzc29jKilyTmV4dFBvc2l0aW9uOworICBBU1NFUlQocEFzc29jUmV0ICE9IE5VTEwpOworICBpZiAocEFzc29jUmV0ID09IChDQXNzb2MqKS0xKSB7CisgICAgZm9yIChGWF9EV09SRCBuQnVja2V0ID0gMDsgbkJ1Y2tldCA8IG1fbkhhc2hUYWJsZVNpemU7IG5CdWNrZXQrKykKKyAgICAgIGlmICgocEFzc29jUmV0ID0gbV9wSGFzaFRhYmxlW25CdWNrZXRdKSAhPSBOVUxMKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIEFTU0VSVChwQXNzb2NSZXQgIT0gTlVMTCk7Ci0gICAgaWYgKHBBc3NvY1JldCA9PSAoQ0Fzc29jKikgLSAxKSB7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgbkJ1Y2tldCA9IDA7IG5CdWNrZXQgPCBtX25IYXNoVGFibGVTaXplOyBuQnVja2V0KyspCi0gICAgICAgICAgICBpZiAoKHBBc3NvY1JldCA9IG1fcEhhc2hUYWJsZVtuQnVja2V0XSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBBU1NFUlQocEFzc29jUmV0ICE9IE5VTEwpOwotICAgIH0KLSAgICBDQXNzb2MqIHBBc3NvY05leHQ7Ci0gICAgaWYgKChwQXNzb2NOZXh0ID0gcEFzc29jUmV0LT5wTmV4dCkgPT0gTlVMTCkgewotICAgICAgICBmb3IgKEZYX0RXT1JEIG5CdWNrZXQgPSBwQXNzb2NSZXQtPm5IYXNoVmFsdWUgKyAxOwotICAgICAgICAgICAgICAgIG5CdWNrZXQgPCBtX25IYXNoVGFibGVTaXplOyBuQnVja2V0KyspCi0gICAgICAgICAgICBpZiAoKHBBc3NvY05leHQgPSBtX3BIYXNoVGFibGVbbkJ1Y2tldF0pICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgck5leHRQb3NpdGlvbiA9IChGWF9QT1NJVElPTikgcEFzc29jTmV4dDsKLSAgICByZXR1cm4gcEFzc29jUmV0LT52YWx1ZTsKKyAgfQorICBDQXNzb2MqIHBBc3NvY05leHQ7CisgIGlmICgocEFzc29jTmV4dCA9IHBBc3NvY1JldC0+cE5leHQpID09IE5VTEwpIHsKKyAgICBmb3IgKEZYX0RXT1JEIG5CdWNrZXQgPSBwQXNzb2NSZXQtPm5IYXNoVmFsdWUgKyAxOworICAgICAgICAgbkJ1Y2tldCA8IG1fbkhhc2hUYWJsZVNpemU7IG5CdWNrZXQrKykKKyAgICAgIGlmICgocEFzc29jTmV4dCA9IG1fcEhhc2hUYWJsZVtuQnVja2V0XSkgIT0gTlVMTCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgfQorICByTmV4dFBvc2l0aW9uID0gKEZYX1BPU0lUSU9OKXBBc3NvY05leHQ7CisgIHJldHVybiBwQXNzb2NSZXQtPnZhbHVlOwogfQotdm9pZComIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6Om9wZXJhdG9yW10oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpCi17Ci0gICAgRlhfRFdPUkQgbkhhc2g7Ci0gICAgQ0Fzc29jKiBwQXNzb2M7Ci0gICAgaWYgKChwQXNzb2MgPSBHZXRBc3NvY0F0KGtleSwgbkhhc2gpKSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgewotICAgICAgICAgICAgSW5pdEhhc2hUYWJsZShtX25IYXNoVGFibGVTaXplKTsKLSAgICAgICAgfQotICAgICAgICBwQXNzb2MgPSBOZXdBc3NvYygpOwotICAgICAgICBwQXNzb2MtPm5IYXNoVmFsdWUgPSBuSGFzaDsKLSAgICAgICAgcEFzc29jLT5rZXkgPSBrZXk7Ci0gICAgICAgIHBBc3NvYy0+cE5leHQgPSBtX3BIYXNoVGFibGVbbkhhc2hdOwotICAgICAgICBtX3BIYXNoVGFibGVbbkhhc2hdID0gcEFzc29jOwotICAgIH0KLSAgICByZXR1cm4gcEFzc29jLT52YWx1ZTsKLX0KLUNGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkNBc3NvYyoKLUNGWF9NYXBCeXRlU3RyaW5nVG9QdHI6Ok5ld0Fzc29jKCkKLXsKLSAgICBpZiAobV9wRnJlZUxpc3QgPT0gTlVMTCkgewotICAgICAgICBDRlhfUGxleCogbmV3QmxvY2sgPSBDRlhfUGxleDo6Q3JlYXRlKG1fcEJsb2NrcywgbV9uQmxvY2tTaXplLCBzaXplb2YoQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6Q0Fzc29jKSk7Ci0gICAgICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkNBc3NvYyogcEFzc29jID0gKENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkNBc3NvYyopbmV3QmxvY2stPmRhdGEoKTsKLSAgICAgICAgcEFzc29jICs9IG1fbkJsb2NrU2l6ZSAtIDE7Ci0gICAgICAgIGZvciAoaW50IGkgPSBtX25CbG9ja1NpemUgLSAxOyBpID49IDA7IGktLSwgcEFzc29jLS0pIHsKLSAgICAgICAgICAgIHBBc3NvYy0+cE5leHQgPSBtX3BGcmVlTGlzdDsKLSAgICAgICAgICAgIG1fcEZyZWVMaXN0ID0gcEFzc29jOwotICAgICAgICB9Ci0gICAgfQotICAgIEFTU0VSVChtX3BGcmVlTGlzdCAhPSBOVUxMKTsKLSAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpDQXNzb2MqIHBBc3NvYyA9IG1fcEZyZWVMaXN0OwotICAgIG1fcEZyZWVMaXN0ID0gbV9wRnJlZUxpc3QtPnBOZXh0OwotICAgIG1fbkNvdW50Kys7Ci0gICAgQVNTRVJUKG1fbkNvdW50ID4gMCk7Ci0gICAgQ29uc3RydWN0RWxlbWVudCgmcEFzc29jLT5rZXkpOwotICAgIHBBc3NvYy0+dmFsdWUgPSAwOwotICAgIHJldHVybiBwQXNzb2M7Ci19Ci12b2lkIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkZyZWVBc3NvYyhDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpDQXNzb2MqIHBBc3NvYykKLXsKLSAgICBEZXN0cnVjdEVsZW1lbnQoJnBBc3NvYy0+a2V5KTsKLSAgICBwQXNzb2MtPnBOZXh0ID0gbV9wRnJlZUxpc3Q7Ci0gICAgbV9wRnJlZUxpc3QgPSBwQXNzb2M7Ci0gICAgbV9uQ291bnQtLTsKLSAgICBBU1NFUlQobV9uQ291bnQgPj0gMCk7Ci0gICAgaWYgKG1fbkNvdW50ID09IDApIHsKLSAgICAgICAgUmVtb3ZlQWxsKCk7Ci0gICAgfQotfQotQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6Q0Fzc29jKgotQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6R2V0QXNzb2NBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgRlhfRFdPUkQmIG5IYXNoKSBjb25zdAotewotICAgIG5IYXNoID0gSGFzaEtleShrZXkpICUgbV9uSGFzaFRhYmxlU2l6ZTsKK3ZvaWQqJiBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpvcGVyYXRvcltdKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSB7CisgIEZYX0RXT1JEIG5IYXNoOworICBDQXNzb2MqIHBBc3NvYzsKKyAgaWYgKChwQXNzb2MgPSBHZXRBc3NvY0F0KGtleSwgbkhhc2gpKSA9PSBOVUxMKSB7CiAgICAgaWYgKG1fcEhhc2hUYWJsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgSW5pdEhhc2hUYWJsZShtX25IYXNoVGFibGVTaXplKTsKICAgICB9Ci0gICAgQ0Fzc29jKiBwQXNzb2M7Ci0gICAgZm9yIChwQXNzb2MgPSBtX3BIYXNoVGFibGVbbkhhc2hdOyBwQXNzb2MgIT0gTlVMTDsgcEFzc29jID0gcEFzc29jLT5wTmV4dCkgewotICAgICAgICBpZiAocEFzc29jLT5rZXkgPT0ga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gcEFzc29jOwotICAgICAgICB9CisgICAgcEFzc29jID0gTmV3QXNzb2MoKTsKKyAgICBwQXNzb2MtPm5IYXNoVmFsdWUgPSBuSGFzaDsKKyAgICBwQXNzb2MtPmtleSA9IGtleTsKKyAgICBwQXNzb2MtPnBOZXh0ID0gbV9wSGFzaFRhYmxlW25IYXNoXTsKKyAgICBtX3BIYXNoVGFibGVbbkhhc2hdID0gcEFzc29jOworICB9CisgIHJldHVybiBwQXNzb2MtPnZhbHVlOworfQorQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6Q0Fzc29jKiBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpOZXdBc3NvYygpIHsKKyAgaWYgKG1fcEZyZWVMaXN0ID09IE5VTEwpIHsKKyAgICBDRlhfUGxleCogbmV3QmxvY2sgPSBDRlhfUGxleDo6Q3JlYXRlKAorICAgICAgICBtX3BCbG9ja3MsIG1fbkJsb2NrU2l6ZSwgc2l6ZW9mKENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkNBc3NvYykpOworICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkNBc3NvYyogcEFzc29jID0KKyAgICAgICAgKENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkNBc3NvYyopbmV3QmxvY2stPmRhdGEoKTsKKyAgICBwQXNzb2MgKz0gbV9uQmxvY2tTaXplIC0gMTsKKyAgICBmb3IgKGludCBpID0gbV9uQmxvY2tTaXplIC0gMTsgaSA+PSAwOyBpLS0sIHBBc3NvYy0tKSB7CisgICAgICBwQXNzb2MtPnBOZXh0ID0gbV9wRnJlZUxpc3Q7CisgICAgICBtX3BGcmVlTGlzdCA9IHBBc3NvYzsKICAgICB9CisgIH0KKyAgQVNTRVJUKG1fcEZyZWVMaXN0ICE9IE5VTEwpOworICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpDQXNzb2MqIHBBc3NvYyA9IG1fcEZyZWVMaXN0OworICBtX3BGcmVlTGlzdCA9IG1fcEZyZWVMaXN0LT5wTmV4dDsKKyAgbV9uQ291bnQrKzsKKyAgQVNTRVJUKG1fbkNvdW50ID4gMCk7CisgIENvbnN0cnVjdEVsZW1lbnQoJnBBc3NvYy0+a2V5KTsKKyAgcEFzc29jLT52YWx1ZSA9IDA7CisgIHJldHVybiBwQXNzb2M7Cit9Cit2b2lkIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkZyZWVBc3NvYyhDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpDQXNzb2MqIHBBc3NvYykgeworICBEZXN0cnVjdEVsZW1lbnQoJnBBc3NvYy0+a2V5KTsKKyAgcEFzc29jLT5wTmV4dCA9IG1fcEZyZWVMaXN0OworICBtX3BGcmVlTGlzdCA9IHBBc3NvYzsKKyAgbV9uQ291bnQtLTsKKyAgQVNTRVJUKG1fbkNvdW50ID49IDApOworICBpZiAobV9uQ291bnQgPT0gMCkgeworICAgIFJlbW92ZUFsbCgpOworICB9Cit9CitDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpDQXNzb2MqIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkdldEFzc29jQXQoCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksCisgICAgRlhfRFdPUkQmIG5IYXNoKSBjb25zdCB7CisgIG5IYXNoID0gSGFzaEtleShrZXkpICUgbV9uSGFzaFRhYmxlU2l6ZTsKKyAgaWYgKG1fcEhhc2hUYWJsZSA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0Fzc29jKiBwQXNzb2M7CisgIGZvciAocEFzc29jID0gbV9wSGFzaFRhYmxlW25IYXNoXTsgcEFzc29jICE9IE5VTEw7IHBBc3NvYyA9IHBBc3NvYy0+cE5leHQpIHsKKyAgICBpZiAocEFzc29jLT5rZXkgPT0ga2V5KSB7CisgICAgICByZXR1cm4gcEFzc29jOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLUZYX0JPT0wgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6TG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAotewotICAgIEZYX0RXT1JEIG5IYXNoOwotICAgIENBc3NvYyogcEFzc29jID0gR2V0QXNzb2NBdChrZXksIG5IYXNoKTsKLSAgICBpZiAocEFzc29jID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByVmFsdWUgPSBwQXNzb2MtPnZhbHVlOwotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpJbml0SGFzaFRhYmxlKAotICAgIEZYX0RXT1JEIG5IYXNoU2l6ZSwgRlhfQk9PTCBiQWxsb2NOb3cpCi17Ci0gICAgQVNTRVJUKG1fbkNvdW50ID09IDApOwotICAgIEFTU0VSVChuSGFzaFNpemUgPiAwKTsKLSAgICBpZiAobV9wSGFzaFRhYmxlICE9IE5VTEwpIHsKLSAgICAgICAgRlhfRnJlZShtX3BIYXNoVGFibGUpOwotICAgICAgICBtX3BIYXNoVGFibGUgPSBOVUxMOwotICAgIH0KLSAgICBpZiAoYkFsbG9jTm93KSB7Ci0gICAgICAgIG1fcEhhc2hUYWJsZSA9IEZYX0FsbG9jKENBc3NvYyosIG5IYXNoU2l6ZSk7Ci0gICAgfQotICAgIG1fbkhhc2hUYWJsZVNpemUgPSBuSGFzaFNpemU7Ci19Ci1pbmxpbmUgRlhfRFdPUkQgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6SGFzaEtleShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QKLXsKLSAgICBGWF9EV09SRCBuSGFzaCA9IDA7Ci0gICAgaW50IGxlbiA9IGtleS5HZXRMZW5ndGgoKTsKLSAgICBjb25zdCB1aW50OF90KiBidWYgPSBrZXkuR2V0UHRyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgKyspIHsKLSAgICAgICAgbkhhc2ggPSAobkhhc2ggPDwgNSkgKyBuSGFzaCArIGJ1ZltpXTsKLSAgICB9Ci0gICAgcmV0dXJuIG5IYXNoOwotfQotRlhfQk9PTCBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpSZW1vdmVLZXkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpCi17Ci0gICAgaWYgKG1fcEhhc2hUYWJsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0Fzc29jKiogcHBBc3NvY1ByZXY7Ci0gICAgcHBBc3NvY1ByZXYgPSAmbV9wSGFzaFRhYmxlW0hhc2hLZXkoa2V5KSAlIG1fbkhhc2hUYWJsZVNpemVdOwotICAgIENBc3NvYyogcEFzc29jOwotICAgIGZvciAocEFzc29jID0gKnBwQXNzb2NQcmV2OyBwQXNzb2MgIT0gTlVMTDsgcEFzc29jID0gcEFzc29jLT5wTmV4dCkgewotICAgICAgICBpZiAocEFzc29jLT5rZXkgPT0ga2V5KSB7Ci0gICAgICAgICAgICAqcHBBc3NvY1ByZXYgPSBwQXNzb2MtPnBOZXh0OwotICAgICAgICAgICAgRnJlZUFzc29jKHBBc3NvYyk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBwcEFzc29jUHJldiA9ICZwQXNzb2MtPnBOZXh0OwotICAgIH0KK0ZYX0JPT0wgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6TG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHJWYWx1ZSkgY29uc3QgeworICBGWF9EV09SRCBuSGFzaDsKKyAgQ0Fzc29jKiBwQXNzb2MgPSBHZXRBc3NvY0F0KGtleSwgbkhhc2gpOworICBpZiAocEFzc29jID09IE5VTEwpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgclZhbHVlID0gcEFzc29jLT52YWx1ZTsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkluaXRIYXNoVGFibGUoRlhfRFdPUkQgbkhhc2hTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbG9jTm93KSB7CisgIEFTU0VSVChtX25Db3VudCA9PSAwKTsKKyAgQVNTRVJUKG5IYXNoU2l6ZSA+IDApOworICBpZiAobV9wSGFzaFRhYmxlICE9IE5VTEwpIHsKKyAgICBGWF9GcmVlKG1fcEhhc2hUYWJsZSk7CisgICAgbV9wSGFzaFRhYmxlID0gTlVMTDsKKyAgfQorICBpZiAoYkFsbG9jTm93KSB7CisgICAgbV9wSGFzaFRhYmxlID0gRlhfQWxsb2MoQ0Fzc29jKiwgbkhhc2hTaXplKTsKKyAgfQorICBtX25IYXNoVGFibGVTaXplID0gbkhhc2hTaXplOworfQoraW5saW5lIEZYX0RXT1JEIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6Okhhc2hLZXkoCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0IHsKKyAgRlhfRFdPUkQgbkhhc2ggPSAwOworICBpbnQgbGVuID0ga2V5LkdldExlbmd0aCgpOworICBjb25zdCB1aW50OF90KiBidWYgPSBrZXkuR2V0UHRyKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBuSGFzaCA9IChuSGFzaCA8PCA1KSArIG5IYXNoICsgYnVmW2ldOworICB9CisgIHJldHVybiBuSGFzaDsKK30KK0ZYX0JPT0wgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6UmVtb3ZlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSB7CisgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDQXNzb2MqKiBwcEFzc29jUHJldjsKKyAgcHBBc3NvY1ByZXYgPSAmbV9wSGFzaFRhYmxlW0hhc2hLZXkoa2V5KSAlIG1fbkhhc2hUYWJsZVNpemVdOworICBDQXNzb2MqIHBBc3NvYzsKKyAgZm9yIChwQXNzb2MgPSAqcHBBc3NvY1ByZXY7IHBBc3NvYyAhPSBOVUxMOyBwQXNzb2MgPSBwQXNzb2MtPnBOZXh0KSB7CisgICAgaWYgKHBBc3NvYy0+a2V5ID09IGtleSkgeworICAgICAgKnBwQXNzb2NQcmV2ID0gcEFzc29jLT5wTmV4dDsKKyAgICAgIEZyZWVBc3NvYyhwQXNzb2MpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHBwQXNzb2NQcmV2ID0gJnBBc3NvYy0+cE5leHQ7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogc3RydWN0IF9Db21wYWN0U3RyaW5nIHsKLSAgICB1aW50OF90CQltX0NvbXBhY3RMZW47Ci0gICAgdWludDhfdAkJbV9MZW5IaWdoOwotICAgIHVpbnQ4X3QJCW1fTGVuTG93OwotICAgIHVpbnQ4X3QJCW1fVW51c2VkOwotICAgIHVpbnQ4X3QqCW1fcEJ1ZmZlcjsKKyAgdWludDhfdCBtX0NvbXBhY3RMZW47CisgIHVpbnQ4X3QgbV9MZW5IaWdoOworICB1aW50OF90IG1fTGVuTG93OworICB1aW50OF90IG1fVW51c2VkOworICB1aW50OF90KiBtX3BCdWZmZXI7CiB9Owotc3RhdGljIHZvaWQgX0NvbXBhY3RTdHJpbmdSZWxlYXNlKF9Db21wYWN0U3RyaW5nKiBwQ29tcGFjdCkKLXsKLSAgICBpZiAocENvbXBhY3QtPm1fQ29tcGFjdExlbiA9PSAweGZmKSB7Ci0gICAgICAgIEZYX0ZyZWUocENvbXBhY3QtPm1fcEJ1ZmZlcik7Ci0gICAgfQorc3RhdGljIHZvaWQgX0NvbXBhY3RTdHJpbmdSZWxlYXNlKF9Db21wYWN0U3RyaW5nKiBwQ29tcGFjdCkgeworICBpZiAocENvbXBhY3QtPm1fQ29tcGFjdExlbiA9PSAweGZmKSB7CisgICAgRlhfRnJlZShwQ29tcGFjdC0+bV9wQnVmZmVyKTsKKyAgfQogfQotc3RhdGljIEZYX0JPT0wgX0NvbXBhY3RTdHJpbmdTYW1lKF9Db21wYWN0U3RyaW5nKiBwQ29tcGFjdCwgY29uc3QgdWludDhfdCogcFN0ciwgaW50IGxlbikKLXsKLSAgICBpZiAobGVuIDwgc2l6ZW9mKF9Db21wYWN0U3RyaW5nKSkgewotICAgICAgICBpZiAocENvbXBhY3QtPm1fQ29tcGFjdExlbiAhPSBsZW4pIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRlhTWVNfbWVtY21wKCZwQ29tcGFjdC0+bV9MZW5IaWdoLCBwU3RyLCBsZW4pID09IDA7CitzdGF0aWMgRlhfQk9PTCBfQ29tcGFjdFN0cmluZ1NhbWUoX0NvbXBhY3RTdHJpbmcqIHBDb21wYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikgeworICBpZiAobGVuIDwgc2l6ZW9mKF9Db21wYWN0U3RyaW5nKSkgeworICAgIGlmIChwQ29tcGFjdC0+bV9Db21wYWN0TGVuICE9IGxlbikgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZiAocENvbXBhY3QtPm1fQ29tcGFjdExlbiAhPSAweGZmIHx8IHBDb21wYWN0LT5tX0xlbkhpZ2ggKiAyNTYgKyBwQ29tcGFjdC0+bV9MZW5Mb3cgIT0gbGVuKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYU1lTX21lbWNtcChwQ29tcGFjdC0+bV9wQnVmZmVyLCBwU3RyLCBsZW4pID09IDA7CisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgmcENvbXBhY3QtPm1fTGVuSGlnaCwgcFN0ciwgbGVuKSA9PSAwOworICB9CisgIGlmIChwQ29tcGFjdC0+bV9Db21wYWN0TGVuICE9IDB4ZmYgfHwKKyAgICAgIHBDb21wYWN0LT5tX0xlbkhpZ2ggKiAyNTYgKyBwQ29tcGFjdC0+bV9MZW5Mb3cgIT0gbGVuKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGWFNZU19tZW1jbXAocENvbXBhY3QtPm1fcEJ1ZmZlciwgcFN0ciwgbGVuKSA9PSAwOwogfQotc3RhdGljIHZvaWQgX0NvbXBhY3RTdHJpbmdTdG9yZShfQ29tcGFjdFN0cmluZyogcENvbXBhY3QsIGNvbnN0IHVpbnQ4X3QqIHBTdHIsIGludCBsZW4pCi17Ci0gICAgaWYgKGxlbiA8IChpbnQpc2l6ZW9mKF9Db21wYWN0U3RyaW5nKSkgewotICAgICAgICBwQ29tcGFjdC0+bV9Db21wYWN0TGVuID0gKHVpbnQ4X3QpbGVuOwotICAgICAgICBGWFNZU19tZW1jcHkoJnBDb21wYWN0LT5tX0xlbkhpZ2gsIHBTdHIsIGxlbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcENvbXBhY3QtPm1fQ29tcGFjdExlbiA9IDB4ZmY7Ci0gICAgcENvbXBhY3QtPm1fTGVuSGlnaCA9IGxlbiAvIDI1NjsKLSAgICBwQ29tcGFjdC0+bV9MZW5Mb3cgPSBsZW4gJSAyNTY7Ci0gICAgcENvbXBhY3QtPm1fcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIGxlbik7Ci0gICAgRlhTWVNfbWVtY3B5KHBDb21wYWN0LT5tX3BCdWZmZXIsIHBTdHIsIGxlbik7CitzdGF0aWMgdm9pZCBfQ29tcGFjdFN0cmluZ1N0b3JlKF9Db21wYWN0U3RyaW5nKiBwQ29tcGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikgeworICBpZiAobGVuIDwgKGludClzaXplb2YoX0NvbXBhY3RTdHJpbmcpKSB7CisgICAgcENvbXBhY3QtPm1fQ29tcGFjdExlbiA9ICh1aW50OF90KWxlbjsKKyAgICBGWFNZU19tZW1jcHkoJnBDb21wYWN0LT5tX0xlbkhpZ2gsIHBTdHIsIGxlbik7CisgICAgcmV0dXJuOworICB9CisgIHBDb21wYWN0LT5tX0NvbXBhY3RMZW4gPSAweGZmOworICBwQ29tcGFjdC0+bV9MZW5IaWdoID0gbGVuIC8gMjU2OworICBwQ29tcGFjdC0+bV9MZW5Mb3cgPSBsZW4gJSAyNTY7CisgIHBDb21wYWN0LT5tX3BCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBsZW4pOworICBGWFNZU19tZW1jcHkocENvbXBhY3QtPm1fcEJ1ZmZlciwgcFN0ciwgbGVuKTsKIH0KLXN0YXRpYyBDRlhfQnl0ZVN0cmluZ0MgX0NvbXBhY3RTdHJpbmdHZXQoX0NvbXBhY3RTdHJpbmcqIHBDb21wYWN0KQotewotICAgIGlmIChwQ29tcGFjdC0+bV9Db21wYWN0TGVuID09IDB4ZmYpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhwQ29tcGFjdC0+bV9wQnVmZmVyLCBwQ29tcGFjdC0+bV9MZW5IaWdoICogMjU2ICsgcENvbXBhY3QtPm1fTGVuTG93KTsKLSAgICB9Ci0gICAgaWYgKHBDb21wYWN0LT5tX0NvbXBhY3RMZW4gPT0gMHhmZSkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKCk7Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoJnBDb21wYWN0LT5tX0xlbkhpZ2gsIHBDb21wYWN0LT5tX0NvbXBhY3RMZW4pOworc3RhdGljIENGWF9CeXRlU3RyaW5nQyBfQ29tcGFjdFN0cmluZ0dldChfQ29tcGFjdFN0cmluZyogcENvbXBhY3QpIHsKKyAgaWYgKHBDb21wYWN0LT5tX0NvbXBhY3RMZW4gPT0gMHhmZikgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MocENvbXBhY3QtPm1fcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21wYWN0LT5tX0xlbkhpZ2ggKiAyNTYgKyBwQ29tcGFjdC0+bV9MZW5Mb3cpOworICB9CisgIGlmIChwQ29tcGFjdC0+bV9Db21wYWN0TGVuID09IDB4ZmUpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKCk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygmcENvbXBhY3QtPm1fTGVuSGlnaCwgcENvbXBhY3QtPm1fQ29tcGFjdExlbik7CiB9Ci0jZGVmaW5lIENNQVBfQUxMT0NfU1RFUAkJOAotI2RlZmluZSBDTUFQX0lOREVYX1NJWkUJCTgKKyNkZWZpbmUgQ01BUF9BTExPQ19TVEVQIDgKKyNkZWZpbmUgQ01BUF9JTkRFWF9TSVpFIDgKIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cigpCi0gICAgOiBtX0J1ZmZlcihzaXplb2YoX0NvbXBhY3RTdHJpbmcpICsgc2l6ZW9mKHZvaWQqKSwgQ01BUF9BTExPQ19TVEVQLCBDTUFQX0lOREVYX1NJWkUpCi17CisgICAgOiBtX0J1ZmZlcihzaXplb2YoX0NvbXBhY3RTdHJpbmcpICsgc2l6ZW9mKHZvaWQqKSwKKyAgICAgICAgICAgICAgIENNQVBfQUxMT0NfU1RFUCwKKyAgICAgICAgICAgICAgIENNQVBfSU5ERVhfU0laRSkge30KK0NGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjp+Q0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIoKSB7CisgIFJlbW92ZUFsbCgpOwogfQotQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6On5DRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cigpCi17Ci0gICAgUmVtb3ZlQWxsKCk7Cit2b2lkIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpSZW1vdmVBbGwoKSB7CisgIGludCBzaXplID0gbV9CdWZmZXIuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIF9Db21wYWN0U3RyaW5nUmVsZWFzZSgoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGkpKTsKKyAgfQorICBtX0J1ZmZlci5SZW1vdmVBbGwoKTsKIH0KLXZvaWQgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6OlJlbW92ZUFsbCgpCi17Ci0gICAgaW50IHNpemUgPSBtX0J1ZmZlci5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgX0NvbXBhY3RTdHJpbmdSZWxlYXNlKChfQ29tcGFjdFN0cmluZyopbV9CdWZmZXIuR2V0QXQoaSkpOworRlhfUE9TSVRJT04gQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6OkdldFN0YXJ0UG9zaXRpb24oKSBjb25zdCB7CisgIGludCBzaXplID0gbV9CdWZmZXIuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5HZXRBdChpKTsKKyAgICBpZiAocEtleS0+bV9Db21wYWN0TGVuICE9IDB4ZmUpIHsKKyAgICAgIHJldHVybiAoRlhfUE9TSVRJT04pKHVpbnRwdHJfdCkoaSArIDEpOwogICAgIH0KLSAgICBtX0J1ZmZlci5SZW1vdmVBbGwoKTsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLUZYX1BPU0lUSU9OIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpHZXRTdGFydFBvc2l0aW9uKCkgY29uc3QKLXsKLSAgICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKLSAgICAgICAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGkpOwotICAgICAgICBpZiAocEtleS0+bV9Db21wYWN0TGVuICE9IDB4ZmUpIHsKLSAgICAgICAgICAgIHJldHVybiAoRlhfUE9TSVRJT04pKHVpbnRwdHJfdCkoaSArIDEpOwotICAgICAgICB9Cit2b2lkIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpHZXROZXh0QXNzb2MoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHJWYWx1ZSkgY29uc3QgeworICBpZiAock5leHRQb3NpdGlvbiA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBpbmRleCA9IChpbnQpKHVpbnRwdHJfdClyTmV4dFBvc2l0aW9uIC0gMTsKKyAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGluZGV4KTsKKyAgcktleSA9IF9Db21wYWN0U3RyaW5nR2V0KHBLZXkpOworICByVmFsdWUgPSAqKHZvaWQqKikocEtleSArIDEpOworICBpbmRleCsrOworICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKKyAgd2hpbGUgKGluZGV4IDwgc2l6ZSkgeworICAgIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGluZGV4KTsKKyAgICBpZiAocEtleS0+bV9Db21wYWN0TGVuICE9IDB4ZmUpIHsKKyAgICAgIHJOZXh0UG9zaXRpb24gPSAoRlhfUE9TSVRJT04pKHVpbnRwdHJfdCkoaW5kZXggKyAxKTsKKyAgICAgIHJldHVybjsKICAgICB9CisgICAgaW5kZXgrKzsKKyAgfQorICByTmV4dFBvc2l0aW9uID0gTlVMTDsKK30KK3ZvaWQqIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpHZXROZXh0VmFsdWUoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24pIGNvbnN0IHsKKyAgaWYgKHJOZXh0UG9zaXRpb24gPT0gTlVMTCkgewogICAgIHJldHVybiBOVUxMOwotfQotdm9pZCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6R2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uLCBDRlhfQnl0ZVN0cmluZyYgcktleSwgdm9pZComIHJWYWx1ZSkgY29uc3QKLXsKLSAgICBpZiAock5leHRQb3NpdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKKyAgfQorICBpbnQgaW5kZXggPSAoaW50KSh1aW50cHRyX3Qpck5leHRQb3NpdGlvbiAtIDE7CisgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5HZXRBdChpbmRleCk7CisgIHZvaWQqIHJWYWx1ZSA9ICoodm9pZCoqKShwS2V5ICsgMSk7CisgIGluZGV4Kys7CisgIGludCBzaXplID0gbV9CdWZmZXIuR2V0U2l6ZSgpOworICB3aGlsZSAoaW5kZXggPCBzaXplKSB7CisgICAgcEtleSA9IChfQ29tcGFjdFN0cmluZyopbV9CdWZmZXIuR2V0QXQoaW5kZXgpOworICAgIGlmIChwS2V5LT5tX0NvbXBhY3RMZW4gIT0gMHhmZSkgeworICAgICAgck5leHRQb3NpdGlvbiA9IChGWF9QT1NJVElPTikodWludHB0cl90KShpbmRleCArIDEpOworICAgICAgcmV0dXJuIHJWYWx1ZTsKICAgICB9Ci0gICAgaW50IGluZGV4ID0gKGludCkodWludHB0cl90KXJOZXh0UG9zaXRpb24gLSAxOworICAgIGluZGV4Kys7CisgIH0KKyAgck5leHRQb3NpdGlvbiA9IE5VTEw7CisgIHJldHVybiByVmFsdWU7Cit9CitGWF9CT09MIF9DTWFwTG9va3VwQ2FsbGJhY2sodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSB7CisgIHJldHVybiAhX0NvbXBhY3RTdHJpbmdTYW1lKChfQ29tcGFjdFN0cmluZyopcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0ZYX0J5dGVTdHJpbmdDKilwYXJhbSktPkdldFB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENGWF9CeXRlU3RyaW5nQyopcGFyYW0pLT5HZXRMZW5ndGgoKSk7Cit9CitGWF9CT09MIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHJWYWx1ZSkgY29uc3QgeworICB2b2lkKiBwID0gbV9CdWZmZXIuSXRlcmF0ZShfQ01hcExvb2t1cENhbGxiYWNrLCAodm9pZCopJmtleSk7CisgIGlmICghcCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByVmFsdWUgPSAqKHZvaWQqKikoKF9Db21wYWN0U3RyaW5nKilwICsgMSk7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6U2V0QXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIHZvaWQqIHZhbHVlKSB7CisgIEFTU0VSVCh2YWx1ZSAhPSBOVUxMKTsKKyAgaW50IGluZGV4LCBrZXlfbGVuID0ga2V5LkdldExlbmd0aCgpOworICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykgewogICAgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5HZXRBdChpbmRleCk7Ci0gICAgcktleSA9IF9Db21wYWN0U3RyaW5nR2V0KHBLZXkpOwotICAgIHJWYWx1ZSA9ICoodm9pZCoqKShwS2V5ICsgMSk7Ci0gICAgaW5kZXggKys7Ci0gICAgaW50IHNpemUgPSBtX0J1ZmZlci5HZXRTaXplKCk7Ci0gICAgd2hpbGUgKGluZGV4IDwgc2l6ZSkgewotICAgICAgICBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5HZXRBdChpbmRleCk7Ci0gICAgICAgIGlmIChwS2V5LT5tX0NvbXBhY3RMZW4gIT0gMHhmZSkgewotICAgICAgICAgICAgck5leHRQb3NpdGlvbiA9IChGWF9QT1NJVElPTikodWludHB0cl90KShpbmRleCArIDEpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGluZGV4ICsrOworICAgIGlmICghX0NvbXBhY3RTdHJpbmdTYW1lKHBLZXksIGtleS5HZXRQdHIoKSwga2V5X2xlbikpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICByTmV4dFBvc2l0aW9uID0gTlVMTDsKLX0KLXZvaWQqIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpHZXROZXh0VmFsdWUoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24pIGNvbnN0Ci17Ci0gICAgaWYgKHJOZXh0UG9zaXRpb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gKGludCkodWludHB0cl90KXJOZXh0UG9zaXRpb24gLSAxOworICAgICoodm9pZCoqKShwS2V5ICsgMSkgPSB2YWx1ZTsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykgewogICAgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5HZXRBdChpbmRleCk7Ci0gICAgdm9pZCogclZhbHVlID0gKih2b2lkKiopKHBLZXkgKyAxKTsKLSAgICBpbmRleCArKzsKLSAgICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKLSAgICB3aGlsZSAoaW5kZXggPCBzaXplKSB7Ci0gICAgICAgIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGluZGV4KTsKLSAgICAgICAgaWYgKHBLZXktPm1fQ29tcGFjdExlbiAhPSAweGZlKSB7Ci0gICAgICAgICAgICByTmV4dFBvc2l0aW9uID0gKEZYX1BPU0lUSU9OKSh1aW50cHRyX3QpKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICByZXR1cm4gclZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGluZGV4ICsrOworICAgIGlmIChwS2V5LT5tX0NvbXBhY3RMZW4pIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICByTmV4dFBvc2l0aW9uID0gTlVMTDsKLSAgICByZXR1cm4gclZhbHVlOwotfQotRlhfQk9PTCBfQ01hcExvb2t1cENhbGxiYWNrKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSkKLXsKLSAgICByZXR1cm4gIV9Db21wYWN0U3RyaW5nU2FtZSgoX0NvbXBhY3RTdHJpbmcqKXBEYXRhLCAoKENGWF9CeXRlU3RyaW5nQyopcGFyYW0pLT5HZXRQdHIoKSwgKChDRlhfQnl0ZVN0cmluZ0MqKXBhcmFtKS0+R2V0TGVuZ3RoKCkpOwotfQotRlhfQk9PTCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6TG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAotewotICAgIHZvaWQqIHAgPSBtX0J1ZmZlci5JdGVyYXRlKF9DTWFwTG9va3VwQ2FsbGJhY2ssICh2b2lkKikma2V5KTsKLSAgICBpZiAoIXApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByVmFsdWUgPSAqKHZvaWQqKikoKF9Db21wYWN0U3RyaW5nKilwICsgMSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpTZXRBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgdm9pZCogdmFsdWUpCi17Ci0gICAgQVNTRVJUKHZhbHVlICE9IE5VTEwpOwotICAgIGludCBpbmRleCwga2V5X2xlbiA9IGtleS5HZXRMZW5ndGgoKTsKLSAgICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyBpbmRleCArKykgewotICAgICAgICBfQ29tcGFjdFN0cmluZyogcEtleSA9IChfQ29tcGFjdFN0cmluZyopbV9CdWZmZXIuR2V0QXQoaW5kZXgpOwotICAgICAgICBpZiAoIV9Db21wYWN0U3RyaW5nU2FtZShwS2V5LCBrZXkuR2V0UHRyKCksIGtleV9sZW4pKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAqKHZvaWQqKikocEtleSArIDEpID0gdmFsdWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXggKyspIHsKLSAgICAgICAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGluZGV4KTsKLSAgICAgICAgaWYgKHBLZXktPm1fQ29tcGFjdExlbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgX0NvbXBhY3RTdHJpbmdTdG9yZShwS2V5LCBrZXkuR2V0UHRyKCksIGtleV9sZW4pOwotICAgICAgICAqKHZvaWQqKikocEtleSArIDEpID0gdmFsdWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkFkZCgpOwogICAgIF9Db21wYWN0U3RyaW5nU3RvcmUocEtleSwga2V5LkdldFB0cigpLCBrZXlfbGVuKTsKICAgICAqKHZvaWQqKikocEtleSArIDEpID0gdmFsdWU7CisgICAgcmV0dXJuOworICB9CisgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5BZGQoKTsKKyAgX0NvbXBhY3RTdHJpbmdTdG9yZShwS2V5LCBrZXkuR2V0UHRyKCksIGtleV9sZW4pOworICAqKHZvaWQqKikocEtleSArIDEpID0gdmFsdWU7CiB9Ci12b2lkIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpBZGRWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgdm9pZCogdmFsdWUpCi17Ci0gICAgQVNTRVJUKHZhbHVlICE9IE5VTEwpOwotICAgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5BZGQoKTsKLSAgICBfQ29tcGFjdFN0cmluZ1N0b3JlKHBLZXksIGtleS5HZXRQdHIoKSwga2V5LkdldExlbmd0aCgpKTsKLSAgICAqKHZvaWQqKikocEtleSArIDEpID0gdmFsdWU7Cit2b2lkIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpBZGRWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHZhbHVlKSB7CisgIEFTU0VSVCh2YWx1ZSAhPSBOVUxMKTsKKyAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkFkZCgpOworICBfQ29tcGFjdFN0cmluZ1N0b3JlKHBLZXksIGtleS5HZXRQdHIoKSwga2V5LkdldExlbmd0aCgpKTsKKyAgKih2b2lkKiopKHBLZXkgKyAxKSA9IHZhbHVlOwogfQotdm9pZCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6UmVtb3ZlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KQotewotICAgIGludCBrZXlfbGVuID0ga2V5LkdldExlbmd0aCgpOwotICAgIGludCBzaXplID0gbV9CdWZmZXIuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyBpbmRleCsrKSB7Ci0gICAgICAgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5HZXRBdChpbmRleCk7Ci0gICAgICAgIGlmICghX0NvbXBhY3RTdHJpbmdTYW1lKHBLZXksIGtleS5HZXRQdHIoKSwga2V5X2xlbikpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIF9Db21wYWN0U3RyaW5nUmVsZWFzZShwS2V5KTsKLSAgICAgICAgcEtleS0+bV9Db21wYWN0TGVuID0gMHhmZTsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6UmVtb3ZlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSB7CisgIGludCBrZXlfbGVuID0ga2V5LkdldExlbmd0aCgpOworICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKKyAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpemU7IGluZGV4KyspIHsKKyAgICBfQ29tcGFjdFN0cmluZyogcEtleSA9IChfQ29tcGFjdFN0cmluZyopbV9CdWZmZXIuR2V0QXQoaW5kZXgpOworICAgIGlmICghX0NvbXBhY3RTdHJpbmdTYW1lKHBLZXksIGtleS5HZXRQdHIoKSwga2V5X2xlbikpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KKyAgICBfQ29tcGFjdFN0cmluZ1JlbGVhc2UocEtleSk7CisgICAgcEtleS0+bV9Db21wYWN0TGVuID0gMHhmZTsKKyAgICByZXR1cm47CisgIH0KIH0KLWludCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6R2V0Q291bnQoKSBjb25zdAotewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgaW50IHNpemUgPSBtX0J1ZmZlci5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5HZXRBdChpKTsKLSAgICAgICAgaWYgKHBLZXktPm1fQ29tcGFjdExlbiAhPSAweGZlKSB7Ci0gICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgfQoraW50IENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpHZXRDb3VudCgpIGNvbnN0IHsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHNpemUgPSBtX0J1ZmZlci5HZXRTaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGkpOworICAgIGlmIChwS2V5LT5tX0NvbXBhY3RMZW4gIT0gMHhmZSkgeworICAgICAgY291bnQrKzsKICAgICB9Ci0gICAgcmV0dXJuIGNvdW50OworICB9CisgIHJldHVybiBjb3VudDsKIH0KIGV4dGVybiAiQyIgewotICAgIHN0YXRpYyBpbnQgX0NvbXBhcmVEV29yZChjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpCi0gICAgewotICAgICAgICByZXR1cm4gKCooRlhfRFdPUkQqKXAxKSAtICgqKEZYX0RXT1JEKilwMik7Ci0gICAgfQorc3RhdGljIGludCBfQ29tcGFyZURXb3JkKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgeworICByZXR1cm4gKCooRlhfRFdPUkQqKXAxKSAtICgqKEZYX0RXT1JEKilwMik7Cit9CiB9Owogc3RydWN0IF9EV29yZFBhaXIgewotICAgIEZYX0RXT1JEIGtleTsKLSAgICBGWF9EV09SRCB2YWx1ZTsKKyAgRlhfRFdPUkQga2V5OworICBGWF9EV09SRCB2YWx1ZTsKIH07Ci1GWF9CT09MIENGWF9DTWFwRFdvcmRUb0RXb3JkOjpMb29rdXAoRlhfRFdPUkQga2V5LCBGWF9EV09SRCYgdmFsdWUpIGNvbnN0Ci17Ci0gICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJmtleSwgbV9CdWZmZXIuR2V0QnVmZmVyKCksIG1fQnVmZmVyLkdldFNpemUoKSAvIHNpemVvZihfRFdvcmRQYWlyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKF9EV29yZFBhaXIpLCBfQ29tcGFyZURXb3JkKTsKLSAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdmFsdWUgPSAoKEZYX0RXT1JEKilwUmVzdWx0KVsxXTsKLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ0ZYX0NNYXBEV29yZFRvRFdvcmQ6Okxvb2t1cChGWF9EV09SRCBrZXksIEZYX0RXT1JEJiB2YWx1ZSkgY29uc3QgeworICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgma2V5LCBtX0J1ZmZlci5HZXRCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CdWZmZXIuR2V0U2l6ZSgpIC8gc2l6ZW9mKF9EV29yZFBhaXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX0RXb3JkUGFpciksIF9Db21wYXJlRFdvcmQpOworICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHZhbHVlID0gKChGWF9EV09SRCopcFJlc3VsdClbMV07CisgIHJldHVybiBUUlVFOwogfQotRlhfUE9TSVRJT04gQ0ZYX0NNYXBEV29yZFRvRFdvcmQ6OkdldFN0YXJ0UG9zaXRpb24oKSBjb25zdAotewotICAgIEZYX0RXT1JEIGNvdW50ID0gbV9CdWZmZXIuR2V0U2l6ZSgpIC8gc2l6ZW9mKF9EV29yZFBhaXIpOwotICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKEZYX1BPU0lUSU9OKTE7CitGWF9QT1NJVElPTiBDRlhfQ01hcERXb3JkVG9EV29yZDo6R2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0IHsKKyAgRlhfRFdPUkQgY291bnQgPSBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0RXb3JkUGFpcik7CisgIGlmIChjb3VudCA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIChGWF9QT1NJVElPTikxOwogfQotdm9pZCBDRlhfQ01hcERXb3JkVG9EV29yZDo6R2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiBwb3MsIEZYX0RXT1JEJiBrZXksIEZYX0RXT1JEJiB2YWx1ZSkgY29uc3QKLXsKLSAgICBpZiAocG9zID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9EV09SRCBpbmRleCA9ICgoRlhfRFdPUkQpKHVpbnRwdHJfdClwb3MpIC0gMTsKLSAgICBGWF9EV09SRCBjb3VudCA9IG1fQnVmZmVyLkdldFNpemUoKSAvIHNpemVvZihfRFdvcmRQYWlyKTsKLSAgICBfRFdvcmRQYWlyKiBidWYgPSAoX0RXb3JkUGFpciopbV9CdWZmZXIuR2V0QnVmZmVyKCk7Ci0gICAga2V5ID0gYnVmW2luZGV4XS5rZXk7Ci0gICAgdmFsdWUgPSBidWZbaW5kZXhdLnZhbHVlOwotICAgIGlmIChpbmRleCA9PSBjb3VudCAtIDEpIHsKLSAgICAgICAgcG9zID0gMDsKK3ZvaWQgQ0ZYX0NNYXBEV29yZFRvRFdvcmQ6OkdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHZhbHVlKSBjb25zdCB7CisgIGlmIChwb3MgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9EV09SRCBpbmRleCA9ICgoRlhfRFdPUkQpKHVpbnRwdHJfdClwb3MpIC0gMTsKKyAgRlhfRFdPUkQgY291bnQgPSBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0RXb3JkUGFpcik7CisgIF9EV29yZFBhaXIqIGJ1ZiA9IChfRFdvcmRQYWlyKiltX0J1ZmZlci5HZXRCdWZmZXIoKTsKKyAga2V5ID0gYnVmW2luZGV4XS5rZXk7CisgIHZhbHVlID0gYnVmW2luZGV4XS52YWx1ZTsKKyAgaWYgKGluZGV4ID09IGNvdW50IC0gMSkgeworICAgIHBvcyA9IDA7CisgIH0gZWxzZSB7CisgICAgcG9zID0gKEZYX1BPU0lUSU9OKSgodWludHB0cl90KXBvcyArIDEpOworICB9Cit9Cit2b2lkIENGWF9DTWFwRFdvcmRUb0RXb3JkOjpTZXRBdChGWF9EV09SRCBrZXksIEZYX0RXT1JEIHZhbHVlKSB7CisgIEZYX0RXT1JEIGNvdW50ID0gbV9CdWZmZXIuR2V0U2l6ZSgpIC8gc2l6ZW9mKF9EV29yZFBhaXIpOworICBfRFdvcmRQYWlyKiBidWYgPSAoX0RXb3JkUGFpciopbV9CdWZmZXIuR2V0QnVmZmVyKCk7CisgIF9EV29yZFBhaXIgcGFpciA9IHtrZXksIHZhbHVlfTsKKyAgaWYgKGNvdW50ID09IDAgfHwga2V5ID4gYnVmW2NvdW50IC0gMV0ua2V5KSB7CisgICAgbV9CdWZmZXIuQXBwZW5kQmxvY2soJnBhaXIsIHNpemVvZihfRFdvcmRQYWlyKSk7CisgICAgcmV0dXJuOworICB9CisgIGludCBsb3cgPSAwLCBoaWdoID0gY291bnQgLSAxOworICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKKyAgICBpbnQgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICBpZiAoYnVmW21pZF0ua2V5IDwga2V5KSB7CisgICAgICBsb3cgPSBtaWQgKyAxOworICAgIH0gZWxzZSBpZiAoYnVmW21pZF0ua2V5ID4ga2V5KSB7CisgICAgICBoaWdoID0gbWlkIC0gMTsKICAgICB9IGVsc2UgewotICAgICAgICBwb3MgPSAoRlhfUE9TSVRJT04pKCh1aW50cHRyX3QpcG9zICsgMSk7CisgICAgICBidWZbbWlkXS52YWx1ZSA9IHZhbHVlOworICAgICAgcmV0dXJuOwogICAgIH0KKyAgfQorICBtX0J1ZmZlci5JbnNlcnRCbG9jayhsb3cgKiBzaXplb2YoX0RXb3JkUGFpciksICZwYWlyLCBzaXplb2YoX0RXb3JkUGFpcikpOwogfQotdm9pZCBDRlhfQ01hcERXb3JkVG9EV29yZDo6U2V0QXQoRlhfRFdPUkQga2V5LCBGWF9EV09SRCB2YWx1ZSkKLXsKLSAgICBGWF9EV09SRCBjb3VudCA9IG1fQnVmZmVyLkdldFNpemUoKSAvIHNpemVvZihfRFdvcmRQYWlyKTsKLSAgICBfRFdvcmRQYWlyKiBidWYgPSAoX0RXb3JkUGFpciopbV9CdWZmZXIuR2V0QnVmZmVyKCk7Ci0gICAgX0RXb3JkUGFpciBwYWlyID0ge2tleSwgdmFsdWV9OwotICAgIGlmIChjb3VudCA9PSAwIHx8IGtleSA+IGJ1Zltjb3VudCAtIDFdLmtleSkgewotICAgICAgICBtX0J1ZmZlci5BcHBlbmRCbG9jaygmcGFpciwgc2l6ZW9mKF9EV29yZFBhaXIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbG93ID0gMCwgaGlnaCA9IGNvdW50IC0gMTsKLSAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKLSAgICAgICAgaW50IG1pZCA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICAgIGlmIChidWZbbWlkXS5rZXkgPCBrZXkpIHsKLSAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoYnVmW21pZF0ua2V5ID4ga2V5KSB7Ci0gICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZlttaWRdLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9CdWZmZXIuSW5zZXJ0QmxvY2sobG93ICogc2l6ZW9mKF9EV29yZFBhaXIpLCAmcGFpciwgc2l6ZW9mKF9EV29yZFBhaXIpKTsKLX0KLXZvaWQgQ0ZYX0NNYXBEV29yZFRvRFdvcmQ6OkVzdGltYXRlU2l6ZShGWF9EV09SRCBzaXplLCBGWF9EV09SRCBncm93X2J5KQotewotICAgIG1fQnVmZmVyLkVzdGltYXRlU2l6ZShzaXplLCBncm93X2J5KTsKK3ZvaWQgQ0ZYX0NNYXBEV29yZFRvRFdvcmQ6OkVzdGltYXRlU2l6ZShGWF9EV09SRCBzaXplLCBGWF9EV09SRCBncm93X2J5KSB7CisgIG1fQnVmZmVyLkVzdGltYXRlU2l6ZShzaXplLCBncm93X2J5KTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21lbW1nci5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tZW1tZ3IuY3BwCmluZGV4IDJhZTkwNzUuLmViYzI1ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21lbW1nci5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWVtbWdyLmNwcApAQCAtNyw2NiArNyw2MCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gRm9yIGFib3J0KCkuCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9tZW1vcnkuaCIKIAotdm9pZCoJRlhNRU1fRGVmYXVsdEFsbG9jKHNpemVfdCBieXRlX3NpemUsIGludCBmbGFncykKLXsKLSAgICByZXR1cm4gKHZvaWQqKW1hbGxvYyhieXRlX3NpemUpOwordm9pZCogRlhNRU1fRGVmYXVsdEFsbG9jKHNpemVfdCBieXRlX3NpemUsIGludCBmbGFncykgeworICByZXR1cm4gKHZvaWQqKW1hbGxvYyhieXRlX3NpemUpOwogfQotdm9pZCoJRlhNRU1fRGVmYXVsdFJlYWxsb2Modm9pZCogcG9pbnRlciwgc2l6ZV90IG5ld19zaXplLCBpbnQgZmxhZ3MpCi17Ci0gICAgcmV0dXJuIHJlYWxsb2MocG9pbnRlciwgbmV3X3NpemUpOwordm9pZCogRlhNRU1fRGVmYXVsdFJlYWxsb2Modm9pZCogcG9pbnRlciwgc2l6ZV90IG5ld19zaXplLCBpbnQgZmxhZ3MpIHsKKyAgcmV0dXJuIHJlYWxsb2MocG9pbnRlciwgbmV3X3NpemUpOwogfQotdm9pZAlGWE1FTV9EZWZhdWx0RnJlZSh2b2lkKiBwb2ludGVyLCBpbnQgZmxhZ3MpCi17Ci0gICAgZnJlZShwb2ludGVyKTsKK3ZvaWQgRlhNRU1fRGVmYXVsdEZyZWUodm9pZCogcG9pbnRlciwgaW50IGZsYWdzKSB7CisgIGZyZWUocG9pbnRlcik7CiB9CiAKIE5FVkVSX0lOTElORSB2b2lkIEZYX091dE9mTWVtb3J5VGVybWluYXRlKCkgewotICAgIC8vIFRlcm1pbWF0ZSBjbGVhbmx5IGlmIHdlIGNhbiwgZWxzZSBjcmFzaCBhdCBhIHNwZWNpZmljIGFkZHJlc3MgKDB4YmQpLgotICAgIGFib3J0KCk7Ci0gICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKCopKCk+KDB4YmQpKCk7CisgIC8vIFRlcm1pbWF0ZSBjbGVhbmx5IGlmIHdlIGNhbiwgZWxzZSBjcmFzaCBhdCBhIHNwZWNpZmljIGFkZHJlc3MgKDB4YmQpLgorICBhYm9ydCgpOworICByZWludGVycHJldF9jYXN0PHZvaWQgKCopKCk+KDB4YmQpKCk7CiB9CiAKLUNGWF9Hcm93T25seVBvb2w6OkNGWF9Hcm93T25seVBvb2woc2l6ZV90IHRydW5rX3NpemUpCi17Ci0gICAgbV9UcnVua1NpemUgPSB0cnVua19zaXplOwotICAgIG1fcEZpcnN0VHJ1bmsgPSBOVUxMOworQ0ZYX0dyb3dPbmx5UG9vbDo6Q0ZYX0dyb3dPbmx5UG9vbChzaXplX3QgdHJ1bmtfc2l6ZSkgeworICBtX1RydW5rU2l6ZSA9IHRydW5rX3NpemU7CisgIG1fcEZpcnN0VHJ1bmsgPSBOVUxMOwogfQotQ0ZYX0dyb3dPbmx5UG9vbDo6fkNGWF9Hcm93T25seVBvb2woKQotewotICAgIEZyZWVBbGwoKTsKK0NGWF9Hcm93T25seVBvb2w6On5DRlhfR3Jvd09ubHlQb29sKCkgeworICBGcmVlQWxsKCk7CiB9CiBzdHJ1Y3QgX0ZYX0dyb3dPbmx5VHJ1bmsgewotICAgIHNpemVfdAltX1NpemU7Ci0gICAgc2l6ZV90CW1fQWxsb2NhdGVkOwotICAgIF9GWF9Hcm93T25seVRydW5rKgltX3BOZXh0OworICBzaXplX3QgbV9TaXplOworICBzaXplX3QgbV9BbGxvY2F0ZWQ7CisgIF9GWF9Hcm93T25seVRydW5rKiBtX3BOZXh0OwogfTsKLXZvaWQgQ0ZYX0dyb3dPbmx5UG9vbDo6RnJlZUFsbCgpCi17Ci0gICAgX0ZYX0dyb3dPbmx5VHJ1bmsqIHBUcnVuayA9IChfRlhfR3Jvd09ubHlUcnVuayopbV9wRmlyc3RUcnVuazsKLSAgICB3aGlsZSAocFRydW5rKSB7Ci0gICAgICAgIF9GWF9Hcm93T25seVRydW5rKiBwTmV4dCA9IHBUcnVuay0+bV9wTmV4dDsKLSAgICAgICAgRlhfRnJlZShwVHJ1bmspOwotICAgICAgICBwVHJ1bmsgPSBwTmV4dDsKLSAgICB9Ci0gICAgbV9wRmlyc3RUcnVuayA9IE5VTEw7Cit2b2lkIENGWF9Hcm93T25seVBvb2w6OkZyZWVBbGwoKSB7CisgIF9GWF9Hcm93T25seVRydW5rKiBwVHJ1bmsgPSAoX0ZYX0dyb3dPbmx5VHJ1bmsqKW1fcEZpcnN0VHJ1bms7CisgIHdoaWxlIChwVHJ1bmspIHsKKyAgICBfRlhfR3Jvd09ubHlUcnVuayogcE5leHQgPSBwVHJ1bmstPm1fcE5leHQ7CisgICAgRlhfRnJlZShwVHJ1bmspOworICAgIHBUcnVuayA9IHBOZXh0OworICB9CisgIG1fcEZpcnN0VHJ1bmsgPSBOVUxMOwogfQotdm9pZCogQ0ZYX0dyb3dPbmx5UG9vbDo6QWxsb2Moc2l6ZV90IHNpemUpCi17Ci0gICAgc2l6ZSA9IChzaXplICsgMykgLyA0ICogNDsKLSAgICBfRlhfR3Jvd09ubHlUcnVuayogcFRydW5rID0gKF9GWF9Hcm93T25seVRydW5rKiltX3BGaXJzdFRydW5rOwotICAgIHdoaWxlIChwVHJ1bmspIHsKLSAgICAgICAgaWYgKHBUcnVuay0+bV9TaXplIC0gcFRydW5rLT5tX0FsbG9jYXRlZCA+PSBzaXplKSB7Ci0gICAgICAgICAgICB2b2lkKiBwID0gKHVpbnQ4X3QqKShwVHJ1bmsgKyAxKSArIHBUcnVuay0+bV9BbGxvY2F0ZWQ7Ci0gICAgICAgICAgICBwVHJ1bmstPm1fQWxsb2NhdGVkICs9IHNpemU7Ci0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfQotICAgICAgICBwVHJ1bmsgPSBwVHJ1bmstPm1fcE5leHQ7Cit2b2lkKiBDRlhfR3Jvd09ubHlQb29sOjpBbGxvYyhzaXplX3Qgc2l6ZSkgeworICBzaXplID0gKHNpemUgKyAzKSAvIDQgKiA0OworICBfRlhfR3Jvd09ubHlUcnVuayogcFRydW5rID0gKF9GWF9Hcm93T25seVRydW5rKiltX3BGaXJzdFRydW5rOworICB3aGlsZSAocFRydW5rKSB7CisgICAgaWYgKHBUcnVuay0+bV9TaXplIC0gcFRydW5rLT5tX0FsbG9jYXRlZCA+PSBzaXplKSB7CisgICAgICB2b2lkKiBwID0gKHVpbnQ4X3QqKShwVHJ1bmsgKyAxKSArIHBUcnVuay0+bV9BbGxvY2F0ZWQ7CisgICAgICBwVHJ1bmstPm1fQWxsb2NhdGVkICs9IHNpemU7CisgICAgICByZXR1cm4gcDsKICAgICB9Ci0gICAgc2l6ZV90IGFsbG9jX3NpemUgPSBzaXplID4gbV9UcnVua1NpemUgPyBzaXplIDogbV9UcnVua1NpemU7Ci0gICAgcFRydW5rID0gKF9GWF9Hcm93T25seVRydW5rKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoX0ZYX0dyb3dPbmx5VHJ1bmspICsgYWxsb2Nfc2l6ZSk7Ci0gICAgcFRydW5rLT5tX1NpemUgPSBhbGxvY19zaXplOwotICAgIHBUcnVuay0+bV9BbGxvY2F0ZWQgPSBzaXplOwotICAgIHBUcnVuay0+bV9wTmV4dCA9IChfRlhfR3Jvd09ubHlUcnVuayopbV9wRmlyc3RUcnVuazsKLSAgICBtX3BGaXJzdFRydW5rID0gcFRydW5rOwotICAgIHJldHVybiBwVHJ1bmsgKyAxOworICAgIHBUcnVuayA9IHBUcnVuay0+bV9wTmV4dDsKKyAgfQorICBzaXplX3QgYWxsb2Nfc2l6ZSA9IHNpemUgPiBtX1RydW5rU2l6ZSA/IHNpemUgOiBtX1RydW5rU2l6ZTsKKyAgcFRydW5rID0gKF9GWF9Hcm93T25seVRydW5rKilGWF9BbGxvYyh1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfRlhfR3Jvd09ubHlUcnVuaykgKyBhbGxvY19zaXplKTsKKyAgcFRydW5rLT5tX1NpemUgPSBhbGxvY19zaXplOworICBwVHJ1bmstPm1fQWxsb2NhdGVkID0gc2l6ZTsKKyAgcFRydW5rLT5tX3BOZXh0ID0gKF9GWF9Hcm93T25seVRydW5rKiltX3BGaXJzdFRydW5rOworICBtX3BGaXJzdFRydW5rID0gcFRydW5rOworICByZXR1cm4gcFRydW5rICsgMTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21lbW1ncl91bml0dGVzdC5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tZW1tZ3JfdW5pdHRlc3QuY3BwCmluZGV4IDk0ZTI2YzguLjgxOWNiYjQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21lbW1ncl91bml0dGVzdC5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWVtbWdyX3VuaXR0ZXN0LmNwcApAQCAtMjAsNTIgKzIwLDUxIEBACiAvLyBUT0RPKHRzZXBleik6IHJlLWVuYWJsZSBPT00gdGVzdHMgaWYgd2UgY2FuIGZpbmQgYSB3YXkgdG8KIC8vIHByZXZlbnQgaXQgZnJvbSBob3NpbmcgdGhlIGJvdHMuCiBURVNUKGZ4Y3J0LCBESVNBQkxFRF9GWF9BbGxvY09PTSkgewotICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoKHZvaWQpIEZYX0FsbG9jKGludCwga01heEludEFsbG9jKSwgIiIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKCh2b2lkKUZYX0FsbG9jKGludCwga01heEludEFsbG9jKSwgIiIpOwogCi0gICAgaW50KiBwdHIgPSBGWF9BbGxvYyhpbnQsIDEpOwotICAgIEVYUEVDVF9UUlVFKHB0cik7Ci0gICAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgodm9pZCkgRlhfUmVhbGxvYyhpbnQsIHB0ciwga01heEludEFsbG9jKSwgIiIpOwotICAgIEZYX0ZyZWUocHRyKTsKKyAgaW50KiBwdHIgPSBGWF9BbGxvYyhpbnQsIDEpOworICBFWFBFQ1RfVFJVRShwdHIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKCh2b2lkKUZYX1JlYWxsb2MoaW50LCBwdHIsIGtNYXhJbnRBbGxvYyksICIiKTsKKyAgRlhfRnJlZShwdHIpOwogfQogCiBURVNUKGZ4Y3J0LCBGWF9BbGxvY092ZXJmbG93KSB7Ci0gICAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgodm9pZCkgRlhfQWxsb2MoaW50LCBrT3ZlcmZsb3dJbnRBbGxvYyksICIiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgodm9pZClGWF9BbGxvYyhpbnQsIGtPdmVyZmxvd0ludEFsbG9jKSwgIiIpOwogCi0gICAgaW50KiBwdHIgPSBGWF9BbGxvYyhpbnQsIDEpOwotICAgIEVYUEVDVF9UUlVFKHB0cik7Ci0gICAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgKLSAgICAgICAgKHZvaWQpIEZYX1JlYWxsb2MoaW50LCBwdHIsIGtPdmVyZmxvd0ludEFsbG9jKSwgIiIpOwotICAgIEZYX0ZyZWUocHRyKTsKKyAgaW50KiBwdHIgPSBGWF9BbGxvYyhpbnQsIDEpOworICBFWFBFQ1RfVFJVRShwdHIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKCh2b2lkKUZYX1JlYWxsb2MoaW50LCBwdHIsIGtPdmVyZmxvd0ludEFsbG9jKSwgIiIpOworICBGWF9GcmVlKHB0cik7CiB9CiAKIFRFU1QoZnhjcnQsIEZYX0FsbG9jT3ZlcmZsb3cyRCkgewotICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCi0gICAgICAgICh2b2lkKSBGWF9BbGxvYzJEKGludCwga1dpZHRoLCBrT3ZlcmZsb3dJbnRBbGxvYzJEKSwgIiIpOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKCh2b2lkKUZYX0FsbG9jMkQoaW50LCBrV2lkdGgsIGtPdmVyZmxvd0ludEFsbG9jMkQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKTsKIH0KIAogVEVTVChmeGNydCwgRElTQUJMRURfRlhfVHJ5QWxsb2NPT00pIHsKLSAgICBFWFBFQ1RfRkFMU0UoRlhfVHJ5QWxsb2MoaW50LCBrTWF4SW50QWxsb2MpKTsKKyAgRVhQRUNUX0ZBTFNFKEZYX1RyeUFsbG9jKGludCwga01heEludEFsbG9jKSk7CiAKLSAgICBpbnQqIHB0ciA9IEZYX0FsbG9jKGludCwgMSk7Ci0gICAgRVhQRUNUX1RSVUUocHRyKTsKLSAgICBFWFBFQ1RfRkFMU0UoRlhfVHJ5UmVhbGxvYyhpbnQsIHB0ciwga01heEludEFsbG9jKSk7Ci0gICAgRlhfRnJlZShwdHIpOworICBpbnQqIHB0ciA9IEZYX0FsbG9jKGludCwgMSk7CisgIEVYUEVDVF9UUlVFKHB0cik7CisgIEVYUEVDVF9GQUxTRShGWF9UcnlSZWFsbG9jKGludCwgcHRyLCBrTWF4SW50QWxsb2MpKTsKKyAgRlhfRnJlZShwdHIpOwogfQogCiBURVNUKGZ4Y3J0LCBGWF9UcnlBbGxvY092ZXJmbG93KSB7Ci0gICAgRVhQRUNUX0ZBTFNFKEZYX1RyeUFsbG9jKGludCwga092ZXJmbG93SW50QWxsb2MpKTsKKyAgRVhQRUNUX0ZBTFNFKEZYX1RyeUFsbG9jKGludCwga092ZXJmbG93SW50QWxsb2MpKTsKIAotICAgIGludCogcHRyID0gRlhfQWxsb2MoaW50LCAxKTsKLSAgICBFWFBFQ1RfVFJVRShwdHIpOwotICAgIEVYUEVDVF9GQUxTRShGWF9UcnlSZWFsbG9jKGludCwgcHRyLCBrT3ZlcmZsb3dJbnRBbGxvYykpOwotICAgIEZYX0ZyZWUocHRyKTsKKyAgaW50KiBwdHIgPSBGWF9BbGxvYyhpbnQsIDEpOworICBFWFBFQ1RfVFJVRShwdHIpOworICBFWFBFQ1RfRkFMU0UoRlhfVHJ5UmVhbGxvYyhpbnQsIHB0ciwga092ZXJmbG93SW50QWxsb2MpKTsKKyAgRlhfRnJlZShwdHIpOwogfQogCiBURVNUKGZ4Y3J0LCBESVNBQkxFRF9GWE1FTV9EZWZhdWx0T09NKSB7Ci0gICAgRVhQRUNUX0ZBTFNFKEZYTUVNX0RlZmF1bHRBbGxvYyhrTWF4Qnl0ZUFsbG9jLCAwKSk7CisgIEVYUEVDVF9GQUxTRShGWE1FTV9EZWZhdWx0QWxsb2Moa01heEJ5dGVBbGxvYywgMCkpOwogCi0gICAgdm9pZCogcHRyID0gRlhNRU1fRGVmYXVsdEFsbG9jKDEsIDApOwotICAgIEVYUEVDVF9UUlVFKHB0cik7Ci0gICAgRVhQRUNUX0ZBTFNFKEZYTUVNX0RlZmF1bHRSZWFsbG9jKHB0ciwga01heEJ5dGVBbGxvYywgMCkpOwotICAgIEZYTUVNX0RlZmF1bHRGcmVlKHB0ciwgMCk7CisgIHZvaWQqIHB0ciA9IEZYTUVNX0RlZmF1bHRBbGxvYygxLCAwKTsKKyAgRVhQRUNUX1RSVUUocHRyKTsKKyAgRVhQRUNUX0ZBTFNFKEZYTUVNX0RlZmF1bHRSZWFsbG9jKHB0ciwga01heEJ5dGVBbGxvYywgMCkpOworICBGWE1FTV9EZWZhdWx0RnJlZShwdHIsIDApOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfcGxleC5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19wbGV4LmNwcAppbmRleCBjOTA4OGJjLi5iMDFhZDhhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19wbGV4LmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19wbGV4LmNwcApAQCAtNywyMCArNywyMSBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfbWVtb3J5LmgiCiAjaW5jbHVkZSAicGxleC5oIgogCi1DRlhfUGxleCogQ0ZYX1BsZXg6OkNyZWF0ZShDRlhfUGxleComIHBIZWFkLCBGWF9EV09SRCBuTWF4LCBGWF9EV09SRCBjYkVsZW1lbnQpCi17Ci0gICAgQ0ZYX1BsZXgqIHAgPSAoQ0ZYX1BsZXgqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihDRlhfUGxleCkgKyBuTWF4ICogY2JFbGVtZW50KTsKLSAgICBwLT5wTmV4dCA9IHBIZWFkOwotICAgIHBIZWFkID0gcDsKLSAgICByZXR1cm4gcDsKK0NGWF9QbGV4KiBDRlhfUGxleDo6Q3JlYXRlKENGWF9QbGV4KiYgcEhlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY2JFbGVtZW50KSB7CisgIENGWF9QbGV4KiBwID0KKyAgICAgIChDRlhfUGxleCopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKENGWF9QbGV4KSArIG5NYXggKiBjYkVsZW1lbnQpOworICBwLT5wTmV4dCA9IHBIZWFkOworICBwSGVhZCA9IHA7CisgIHJldHVybiBwOwogfQotdm9pZCBDRlhfUGxleDo6RnJlZURhdGFDaGFpbigpCi17Ci0gICAgQ0ZYX1BsZXgqIHAgPSB0aGlzOwotICAgIHdoaWxlIChwICE9IE5VTEwpIHsKLSAgICAgICAgdWludDhfdCogYnl0ZXMgPSAodWludDhfdCopcDsKLSAgICAgICAgQ0ZYX1BsZXgqIHBOZXh0ID0gcC0+cE5leHQ7Ci0gICAgICAgIEZYX0ZyZWUoYnl0ZXMpOwotICAgICAgICBwID0gcE5leHQ7Ci0gICAgfQordm9pZCBDRlhfUGxleDo6RnJlZURhdGFDaGFpbigpIHsKKyAgQ0ZYX1BsZXgqIHAgPSB0aGlzOworICB3aGlsZSAocCAhPSBOVUxMKSB7CisgICAgdWludDhfdCogYnl0ZXMgPSAodWludDhfdCopcDsKKyAgICBDRlhfUGxleCogcE5leHQgPSBwLT5wTmV4dDsKKyAgICBGWF9GcmVlKGJ5dGVzKTsKKyAgICBwID0gcE5leHQ7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0Zi5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY191dGYuY3BwCmluZGV4IDU0MTNlYWQuLmE5YWQ4MmYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0Zi5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRmLmNwcApAQCAtNSw4NiArNSw4MSBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKLXZvaWQgQ0ZYX1VURjhEZWNvZGVyOjpDbGVhcigpCi17Ci0gICAgbV9CdWZmZXIuQ2xlYXIoKTsKK3ZvaWQgQ0ZYX1VURjhEZWNvZGVyOjpDbGVhcigpIHsKKyAgbV9CdWZmZXIuQ2xlYXIoKTsKKyAgbV9QZW5kaW5nQnl0ZXMgPSAwOworfQordm9pZCBDRlhfVVRGOERlY29kZXI6OkFwcGVuZENoYXIoRlhfRFdPUkQgY2gpIHsKKyAgbV9CdWZmZXIuQXBwZW5kQ2hhcigoRlhfV0NIQVIpY2gpOworfQordm9pZCBDRlhfVVRGOERlY29kZXI6OklucHV0KHVpbnQ4X3QgYnl0ZSkgeworICBpZiAoYnl0ZSA8IDB4ODApIHsKICAgICBtX1BlbmRpbmdCeXRlcyA9IDA7Ci19Ci12b2lkIENGWF9VVEY4RGVjb2Rlcjo6QXBwZW5kQ2hhcihGWF9EV09SRCBjaCkKLXsKLSAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKChGWF9XQ0hBUiljaCk7Ci19Ci12b2lkIENGWF9VVEY4RGVjb2Rlcjo6SW5wdXQodWludDhfdCBieXRlKQotewotICAgIGlmIChieXRlIDwgMHg4MCkgewotICAgICAgICBtX1BlbmRpbmdCeXRlcyA9IDA7Ci0gICAgICAgIG1fQnVmZmVyLkFwcGVuZENoYXIoYnl0ZSk7Ci0gICAgfSBlbHNlIGlmIChieXRlIDwgMHhjMCkgewotICAgICAgICBpZiAobV9QZW5kaW5nQnl0ZXMgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fUGVuZGluZ0J5dGVzIC0tOwotICAgICAgICBtX1BlbmRpbmdDaGFyIHw9IChieXRlICYgMHgzZikgPDwgKG1fUGVuZGluZ0J5dGVzICogNik7Ci0gICAgICAgIGlmIChtX1BlbmRpbmdCeXRlcyA9PSAwKSB7Ci0gICAgICAgICAgICBBcHBlbmRDaGFyKG1fUGVuZGluZ0NoYXIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChieXRlIDwgMHhlMCkgewotICAgICAgICBtX1BlbmRpbmdCeXRlcyA9IDE7Ci0gICAgICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MWYpIDw8IDY7Ci0gICAgfSBlbHNlIGlmIChieXRlIDwgMHhmMCkgewotICAgICAgICBtX1BlbmRpbmdCeXRlcyA9IDI7Ci0gICAgICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MGYpIDw8IDEyOwotICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZjgpIHsKLSAgICAgICAgbV9QZW5kaW5nQnl0ZXMgPSAzOwotICAgICAgICBtX1BlbmRpbmdDaGFyID0gKGJ5dGUgJiAweDA3KSA8PCAxODsKLSAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGZjKSB7Ci0gICAgICAgIG1fUGVuZGluZ0J5dGVzID0gNDsKLSAgICAgICAgbV9QZW5kaW5nQ2hhciA9IChieXRlICYgMHgwMykgPDwgMjQ7Ci0gICAgfSBlbHNlIGlmIChieXRlIDwgMHhmZSkgewotICAgICAgICBtX1BlbmRpbmdCeXRlcyA9IDU7Ci0gICAgICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MDEpIDw8IDMwOworICAgIG1fQnVmZmVyLkFwcGVuZENoYXIoYnl0ZSk7CisgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4YzApIHsKKyAgICBpZiAobV9QZW5kaW5nQnl0ZXMgPT0gMCkgeworICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBtX1BlbmRpbmdCeXRlcy0tOworICAgIG1fUGVuZGluZ0NoYXIgfD0gKGJ5dGUgJiAweDNmKSA8PCAobV9QZW5kaW5nQnl0ZXMgKiA2KTsKKyAgICBpZiAobV9QZW5kaW5nQnl0ZXMgPT0gMCkgeworICAgICAgQXBwZW5kQ2hhcihtX1BlbmRpbmdDaGFyKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZTApIHsKKyAgICBtX1BlbmRpbmdCeXRlcyA9IDE7CisgICAgbV9QZW5kaW5nQ2hhciA9IChieXRlICYgMHgxZikgPDwgNjsKKyAgfSBlbHNlIGlmIChieXRlIDwgMHhmMCkgeworICAgIG1fUGVuZGluZ0J5dGVzID0gMjsKKyAgICBtX1BlbmRpbmdDaGFyID0gKGJ5dGUgJiAweDBmKSA8PCAxMjsKKyAgfSBlbHNlIGlmIChieXRlIDwgMHhmOCkgeworICAgIG1fUGVuZGluZ0J5dGVzID0gMzsKKyAgICBtX1BlbmRpbmdDaGFyID0gKGJ5dGUgJiAweDA3KSA8PCAxODsKKyAgfSBlbHNlIGlmIChieXRlIDwgMHhmYykgeworICAgIG1fUGVuZGluZ0J5dGVzID0gNDsKKyAgICBtX1BlbmRpbmdDaGFyID0gKGJ5dGUgJiAweDAzKSA8PCAyNDsKKyAgfSBlbHNlIGlmIChieXRlIDwgMHhmZSkgeworICAgIG1fUGVuZGluZ0J5dGVzID0gNTsKKyAgICBtX1BlbmRpbmdDaGFyID0gKGJ5dGUgJiAweDAxKSA8PCAzMDsKKyAgfQogfQotdm9pZCBDRlhfVVRGOEVuY29kZXI6OklucHV0KEZYX1dDSEFSIHVuaWNvZGUpCi17Ci0gICAgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHg4MCkgewotICAgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKHVuaWNvZGUpOwordm9pZCBDRlhfVVRGOEVuY29kZXI6OklucHV0KEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHg4MCkgeworICAgIG1fQnVmZmVyLkFwcGVuZENoYXIodW5pY29kZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKChGWF9EV09SRCl1bmljb2RlID49IDB4ODAwMDAwMDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IG5ieXRlcyA9IDA7CisgICAgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHg4MDApIHsKKyAgICAgIG5ieXRlcyA9IDI7CisgICAgfSBlbHNlIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4MTAwMDApIHsKKyAgICAgIG5ieXRlcyA9IDM7CisgICAgfSBlbHNlIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4MjAwMDAwKSB7CisgICAgICBuYnl0ZXMgPSA0OworICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDQwMDAwMDApIHsKKyAgICAgIG5ieXRlcyA9IDU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKChGWF9EV09SRCl1bmljb2RlID49IDB4ODAwMDAwMDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnQgbmJ5dGVzID0gMDsKLSAgICAgICAgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHg4MDApIHsKLSAgICAgICAgICAgIG5ieXRlcyA9IDI7Ci0gICAgICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDEwMDAwKSB7Ci0gICAgICAgICAgICBuYnl0ZXMgPSAzOwotICAgICAgICB9IGVsc2UgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHgyMDAwMDApIHsKLSAgICAgICAgICAgIG5ieXRlcyA9IDQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDQwMDAwMDApIHsKLSAgICAgICAgICAgIG5ieXRlcyA9IDU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuYnl0ZXMgPSA2OwotICAgICAgICB9Ci0gICAgICAgIHN0YXRpYyB1aW50OF90IHByZWZpeFtdID0gezB4YzAsIDB4ZTAsIDB4ZjAsIDB4ZjgsIDB4ZmN9OwotICAgICAgICBpbnQgb3JkZXIgPSAxIDw8ICgobmJ5dGVzIC0gMSkgKiA2KTsKLSAgICAgICAgaW50IGNvZGUgPSB1bmljb2RlOwotICAgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKHByZWZpeFtuYnl0ZXMgLSAyXSB8IChjb2RlIC8gb3JkZXIpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYnl0ZXMgLSAxOyBpICsrKSB7Ci0gICAgICAgICAgICBjb2RlID0gY29kZSAlIG9yZGVyOwotICAgICAgICAgICAgb3JkZXIgPj49IDY7Ci0gICAgICAgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKDB4ODAgfCAoY29kZSAvIG9yZGVyKSk7Ci0gICAgICAgIH0KKyAgICAgIG5ieXRlcyA9IDY7CiAgICAgfQorICAgIHN0YXRpYyB1aW50OF90IHByZWZpeFtdID0gezB4YzAsIDB4ZTAsIDB4ZjAsIDB4ZjgsIDB4ZmN9OworICAgIGludCBvcmRlciA9IDEgPDwgKChuYnl0ZXMgLSAxKSAqIDYpOworICAgIGludCBjb2RlID0gdW5pY29kZTsKKyAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKHByZWZpeFtuYnl0ZXMgLSAyXSB8IChjb2RlIC8gb3JkZXIpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ieXRlcyAtIDE7IGkrKykgeworICAgICAgY29kZSA9IGNvZGUgJSBvcmRlcjsKKyAgICAgIG9yZGVyID4+PSA2OworICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcigweDgwIHwgKGNvZGUgLyBvcmRlcikpOworICAgIH0KKyAgfQogfQotQ0ZYX0J5dGVTdHJpbmcgRlhfVVRGOEVuY29kZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBGWF9TVFJTSVpFIGxlbikKLXsKLSAgICBGWFNZU19hc3NlcnQocHdzU3RyICE9IE5VTEwpOwotICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgIGxlbiA9IEZYU1lTX3djc2xlbihwd3NTdHIpOwotICAgIH0KLSAgICBDRlhfVVRGOEVuY29kZXIgZW5jb2RlcjsKLSAgICB3aGlsZSAobGVuIC0tID4gMCkgewotICAgICAgICBlbmNvZGVyLklucHV0KCpwd3NTdHIgKyspOwotICAgIH0KLSAgICByZXR1cm4gZW5jb2Rlci5HZXRSZXN1bHQoKTsKK0NGWF9CeXRlU3RyaW5nIEZYX1VURjhFbmNvZGUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgRlhfU1RSU0laRSBsZW4pIHsKKyAgRlhTWVNfYXNzZXJ0KHB3c1N0ciAhPSBOVUxMKTsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBsZW4gPSBGWFNZU193Y3NsZW4ocHdzU3RyKTsKKyAgfQorICBDRlhfVVRGOEVuY29kZXIgZW5jb2RlcjsKKyAgd2hpbGUgKGxlbi0tID4gMCkgeworICAgIGVuY29kZXIuSW5wdXQoKnB3c1N0cisrKTsKKyAgfQorICByZXR1cm4gZW5jb2Rlci5HZXRSZXN1bHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0aWwuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAKaW5kZXggZmExZjZlYS4uZjE1MTJmZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAKQEAgLTExLDQ5NSArMTEsNDY1IEBACiAjZWxzZQogI2luY2x1ZGUgPGRpcmVjdC5oPgogI2VuZGlmCi1DRlhfUHJpdmF0ZURhdGE6On5DRlhfUHJpdmF0ZURhdGEoKQotewotICAgIENsZWFyQWxsKCk7CitDRlhfUHJpdmF0ZURhdGE6On5DRlhfUHJpdmF0ZURhdGEoKSB7CisgIENsZWFyQWxsKCk7CiB9Ci12b2lkIEZYX1BSSVZBVEVEQVRBOjpGcmVlRGF0YSgpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX2JTZWxmRGVzdHJ1Y3QpIHsKLSAgICAgICAgZGVsZXRlIChDRlhfRGVzdHJ1Y3RPYmplY3QqKW1fcERhdGE7Ci0gICAgfSBlbHNlIGlmIChtX3BDYWxsYmFjaykgewotICAgICAgICBtX3BDYWxsYmFjayhtX3BEYXRhKTsKLSAgICB9Cit2b2lkIEZYX1BSSVZBVEVEQVRBOjpGcmVlRGF0YSgpIHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9iU2VsZkRlc3RydWN0KSB7CisgICAgZGVsZXRlIChDRlhfRGVzdHJ1Y3RPYmplY3QqKW1fcERhdGE7CisgIH0gZWxzZSBpZiAobV9wQ2FsbGJhY2spIHsKKyAgICBtX3BDYWxsYmFjayhtX3BEYXRhKTsKKyAgfQogfQotdm9pZCBDRlhfUHJpdmF0ZURhdGE6OkFkZERhdGEodm9pZCogcE1vZHVsZUlkLCB2b2lkKiBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2ssIEZYX0JPT0wgYlNlbGZEZXN0cnVjdCkKLXsKLSAgICBpZiAocE1vZHVsZUlkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDRlhfUHJpdmF0ZURhdGE6OkFkZERhdGEodm9pZCogcE1vZHVsZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGZEZXN0cnVjdCkgeworICBpZiAocE1vZHVsZUlkID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfUFJJVkFURURBVEEqIHBMaXN0ID0gbV9EYXRhTGlzdC5HZXREYXRhKCk7CisgIGludCBjb3VudCA9IG1fRGF0YUxpc3QuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAocExpc3RbaV0ubV9wTW9kdWxlSWQgPT0gcE1vZHVsZUlkKSB7CisgICAgICBwTGlzdFtpXS5GcmVlRGF0YSgpOworICAgICAgcExpc3RbaV0ubV9wRGF0YSA9IHBEYXRhOworICAgICAgcExpc3RbaV0ubV9wQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgRlhfUFJJVkFURURBVEEqIHBMaXN0ID0gbV9EYXRhTGlzdC5HZXREYXRhKCk7Ci0gICAgaW50IGNvdW50ID0gbV9EYXRhTGlzdC5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBpZiAocExpc3RbaV0ubV9wTW9kdWxlSWQgPT0gcE1vZHVsZUlkKSB7Ci0gICAgICAgICAgICBwTGlzdFtpXS5GcmVlRGF0YSgpOwotICAgICAgICAgICAgcExpc3RbaV0ubV9wRGF0YSA9IHBEYXRhOwotICAgICAgICAgICAgcExpc3RbaV0ubV9wQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9QUklWQVRFREFUQSBkYXRhID0ge3BNb2R1bGVJZCwgcERhdGEsIGNhbGxiYWNrLCBiU2VsZkRlc3RydWN0fTsKLSAgICBtX0RhdGFMaXN0LkFkZChkYXRhKTsKKyAgfQorICBGWF9QUklWQVRFREFUQSBkYXRhID0ge3BNb2R1bGVJZCwgcERhdGEsIGNhbGxiYWNrLCBiU2VsZkRlc3RydWN0fTsKKyAgbV9EYXRhTGlzdC5BZGQoZGF0YSk7CiB9Ci12b2lkIENGWF9Qcml2YXRlRGF0YTo6U2V0UHJpdmF0ZURhdGEodm9pZCogcE1vZHVsZUlkLCB2b2lkKiBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spCi17Ci0gICAgQWRkRGF0YShwTW9kdWxlSWQsIHBEYXRhLCBjYWxsYmFjaywgRkFMU0UpOwordm9pZCBDRlhfUHJpdmF0ZURhdGE6OlNldFByaXZhdGVEYXRhKHZvaWQqIHBNb2R1bGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaykgeworICBBZGREYXRhKHBNb2R1bGVJZCwgcERhdGEsIGNhbGxiYWNrLCBGQUxTRSk7CiB9Ci12b2lkIENGWF9Qcml2YXRlRGF0YTo6U2V0UHJpdmF0ZU9iaih2b2lkKiBwTW9kdWxlSWQsIENGWF9EZXN0cnVjdE9iamVjdCogcE9iaikKLXsKLSAgICBBZGREYXRhKHBNb2R1bGVJZCwgcE9iaiwgTlVMTCwgVFJVRSk7Cit2b2lkIENGWF9Qcml2YXRlRGF0YTo6U2V0UHJpdmF0ZU9iaih2b2lkKiBwTW9kdWxlSWQsIENGWF9EZXN0cnVjdE9iamVjdCogcE9iaikgeworICBBZGREYXRhKHBNb2R1bGVJZCwgcE9iaiwgTlVMTCwgVFJVRSk7CiB9Ci1GWF9CT09MIENGWF9Qcml2YXRlRGF0YTo6UmVtb3ZlUHJpdmF0ZURhdGEodm9pZCogcE1vZHVsZUlkKQotewotICAgIGlmIChwTW9kdWxlSWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX1BSSVZBVEVEQVRBKiBwTGlzdCA9IG1fRGF0YUxpc3QuR2V0RGF0YSgpOwotICAgIGludCBjb3VudCA9IG1fRGF0YUxpc3QuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgaWYgKHBMaXN0W2ldLm1fcE1vZHVsZUlkID09IHBNb2R1bGVJZCkgewotICAgICAgICAgICAgbV9EYXRhTGlzdC5SZW1vdmVBdChpKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQorRlhfQk9PTCBDRlhfUHJpdmF0ZURhdGE6OlJlbW92ZVByaXZhdGVEYXRhKHZvaWQqIHBNb2R1bGVJZCkgeworICBpZiAocE1vZHVsZUlkID09IE5VTEwpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfUFJJVkFURURBVEEqIHBMaXN0ID0gbV9EYXRhTGlzdC5HZXREYXRhKCk7CisgIGludCBjb3VudCA9IG1fRGF0YUxpc3QuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAocExpc3RbaV0ubV9wTW9kdWxlSWQgPT0gcE1vZHVsZUlkKSB7CisgICAgICBtX0RhdGFMaXN0LlJlbW92ZUF0KGkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKIH0KLXZvaWQqIENGWF9Qcml2YXRlRGF0YTo6R2V0UHJpdmF0ZURhdGEodm9pZCogcE1vZHVsZUlkKQotewotICAgIGlmIChwTW9kdWxlSWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfUFJJVkFURURBVEEqIHBMaXN0ID0gbV9EYXRhTGlzdC5HZXREYXRhKCk7Ci0gICAgaW50IGNvdW50ID0gbV9EYXRhTGlzdC5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBpZiAocExpc3RbaV0ubV9wTW9kdWxlSWQgPT0gcE1vZHVsZUlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gcExpc3RbaV0ubV9wRGF0YTsKLSAgICAgICAgfQotICAgIH0KK3ZvaWQqIENGWF9Qcml2YXRlRGF0YTo6R2V0UHJpdmF0ZURhdGEodm9pZCogcE1vZHVsZUlkKSB7CisgIGlmIChwTW9kdWxlSWQgPT0gTlVMTCkgewogICAgIHJldHVybiBOVUxMOwotfQotdm9pZCBDRlhfUHJpdmF0ZURhdGE6OkNsZWFyQWxsKCkKLXsKLSAgICBGWF9QUklWQVRFREFUQSogcExpc3QgPSBtX0RhdGFMaXN0LkdldERhdGEoKTsKLSAgICBpbnQgY291bnQgPSBtX0RhdGFMaXN0LkdldFNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7Ci0gICAgICAgIHBMaXN0W2ldLkZyZWVEYXRhKCk7CisgIH0KKyAgRlhfUFJJVkFURURBVEEqIHBMaXN0ID0gbV9EYXRhTGlzdC5HZXREYXRhKCk7CisgIGludCBjb3VudCA9IG1fRGF0YUxpc3QuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAocExpc3RbaV0ubV9wTW9kdWxlSWQgPT0gcE1vZHVsZUlkKSB7CisgICAgICByZXR1cm4gcExpc3RbaV0ubV9wRGF0YTsKICAgICB9Ci0gICAgbV9EYXRhTGlzdC5SZW1vdmVBbGwoKTsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLXZvaWQgRlhfYXRvbnVtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyYywgRlhfQk9PTCYgYkludGVnZXIsIHZvaWQqIHBEYXRhKQotewotICAgIGlmIChGWFNZU19tZW1jaHIoc3RyYy5HZXRQdHIoKSwgJy4nLCBzdHJjLkdldExlbmd0aCgpKSA9PSBOVUxMKSB7Ci0gICAgICAgIGJJbnRlZ2VyID0gVFJVRTsKLSAgICAgICAgaW50IGNjID0gMCwgaW50ZWdlciA9IDA7Ci0gICAgICAgIGNvbnN0IEZYX0NIQVIqIHN0ciA9IHN0cmMuR2V0Q1N0cigpOwotICAgICAgICBpbnQgbGVuID0gc3RyYy5HZXRMZW5ndGgoKTsKLSAgICAgICAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKLSAgICAgICAgaWYgKHN0clswXSA9PSAnKycpIHsKLSAgICAgICAgICAgIGNjKys7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgewotICAgICAgICAgICAgYk5lZ2F0aXZlID0gVFJVRTsKLSAgICAgICAgICAgIGNjKys7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICAgICAgICBpZiAoc3RyW2NjXSA8ICcwJyB8fCBzdHJbY2NdID4gJzknKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlZ2VyID0gaW50ZWdlciAqIDEwICsgc3RyW2NjXSAtICcwJzsKLSAgICAgICAgICAgIGlmIChpbnRlZ2VyIDwgMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2MgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJOZWdhdGl2ZSkgewotICAgICAgICAgICAgaW50ZWdlciA9IC1pbnRlZ2VyOwotICAgICAgICB9Ci0gICAgICAgICooaW50KilwRGF0YSA9IGludGVnZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYkludGVnZXIgPSBGQUxTRTsKLSAgICAgICAgKihGWF9GTE9BVCopcERhdGEgPSBGWF9hdG9mKHN0cmMpOwotICAgIH0KK3ZvaWQgQ0ZYX1ByaXZhdGVEYXRhOjpDbGVhckFsbCgpIHsKKyAgRlhfUFJJVkFURURBVEEqIHBMaXN0ID0gbV9EYXRhTGlzdC5HZXREYXRhKCk7CisgIGludCBjb3VudCA9IG1fRGF0YUxpc3QuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBwTGlzdFtpXS5GcmVlRGF0YSgpOworICB9CisgIG1fRGF0YUxpc3QuUmVtb3ZlQWxsKCk7CiB9Ci1GWF9GTE9BVCBGWF9hdG9mKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyYykKLXsKLSAgICBpZiAoc3RyYy5HZXRMZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotICAgIGludCBjYyA9IDA7Ci0gICAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKK3ZvaWQgRlhfYXRvbnVtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyYywgRlhfQk9PTCYgYkludGVnZXIsIHZvaWQqIHBEYXRhKSB7CisgIGlmIChGWFNZU19tZW1jaHIoc3RyYy5HZXRQdHIoKSwgJy4nLCBzdHJjLkdldExlbmd0aCgpKSA9PSBOVUxMKSB7CisgICAgYkludGVnZXIgPSBUUlVFOworICAgIGludCBjYyA9IDAsIGludGVnZXIgPSAwOwogICAgIGNvbnN0IEZYX0NIQVIqIHN0ciA9IHN0cmMuR2V0Q1N0cigpOwogICAgIGludCBsZW4gPSBzdHJjLkdldExlbmd0aCgpOworICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7CiAgICAgaWYgKHN0clswXSA9PSAnKycpIHsKLSAgICAgICAgY2MrKzsKKyAgICAgIGNjKys7CiAgICAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7Ci0gICAgICAgIGJOZWdhdGl2ZSA9IFRSVUU7Ci0gICAgICAgIGNjKys7CisgICAgICBiTmVnYXRpdmUgPSBUUlVFOworICAgICAgY2MrKzsKICAgICB9CiAgICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICAgIGlmIChzdHJbY2NdICE9ICcrJyAmJiBzdHJbY2NdICE9ICctJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2MgKys7CisgICAgICBpZiAoc3RyW2NjXSA8ICcwJyB8fCBzdHJbY2NdID4gJzknKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaW50ZWdlciA9IGludGVnZXIgKiAxMCArIHN0cltjY10gLSAnMCc7CisgICAgICBpZiAoaW50ZWdlciA8IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYysrOwogICAgIH0KLSAgICBGWF9GTE9BVCB2YWx1ZSA9IDA7CisgICAgaWYgKGJOZWdhdGl2ZSkgeworICAgICAgaW50ZWdlciA9IC1pbnRlZ2VyOworICAgIH0KKyAgICAqKGludCopcERhdGEgPSBpbnRlZ2VyOworICB9IGVsc2UgeworICAgIGJJbnRlZ2VyID0gRkFMU0U7CisgICAgKihGWF9GTE9BVCopcERhdGEgPSBGWF9hdG9mKHN0cmMpOworICB9Cit9CitGWF9GTE9BVCBGWF9hdG9mKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyYykgeworICBpZiAoc3RyYy5HZXRMZW5ndGgoKSA9PSAwKSB7CisgICAgcmV0dXJuIDAuMDsKKyAgfQorICBpbnQgY2MgPSAwOworICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFOworICBjb25zdCBGWF9DSEFSKiBzdHIgPSBzdHJjLkdldENTdHIoKTsKKyAgaW50IGxlbiA9IHN0cmMuR2V0TGVuZ3RoKCk7CisgIGlmIChzdHJbMF0gPT0gJysnKSB7CisgICAgY2MrKzsKKyAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7CisgICAgYk5lZ2F0aXZlID0gVFJVRTsKKyAgICBjYysrOworICB9CisgIHdoaWxlIChjYyA8IGxlbikgeworICAgIGlmIChzdHJbY2NdICE9ICcrJyAmJiBzdHJbY2NdICE9ICctJykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNjKys7CisgIH0KKyAgRlhfRkxPQVQgdmFsdWUgPSAwOworICB3aGlsZSAoY2MgPCBsZW4pIHsKKyAgICBpZiAoc3RyW2NjXSA9PSAnLicpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB2YWx1ZSA9IHZhbHVlICogMTAgKyBzdHJbY2NdIC0gJzAnOworICAgIGNjKys7CisgIH0KKyAgc3RhdGljIGNvbnN0IEZYX0ZMT0FUIGZyYWN0aW9uX3NjYWxlc1tdID0geworICAgICAgMC4xZiwgICAgICAgICAwLjAxZiwgICAgICAgICAwLjAwMWYsICAgICAgICAwLjAwMDFmLAorICAgICAgMC4wMDAwMWYsICAgICAwLjAwMDAwMWYsICAgICAwLjAwMDAwMDFmLCAgICAwLjAwMDAwMDAxZiwKKyAgICAgIDAuMDAwMDAwMDAxZiwgMC4wMDAwMDAwMDAxZiwgMC4wMDAwMDAwMDAwMWZ9OworICBpbnQgc2NhbGUgPSAwOworICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsKKyAgICBjYysrOwogICAgIHdoaWxlIChjYyA8IGxlbikgewotICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLicpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHZhbHVlID0gdmFsdWUgKiAxMCArIHN0cltjY10gLSAnMCc7Ci0gICAgICAgIGNjICsrOworICAgICAgdmFsdWUgKz0gZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsKKyAgICAgIHNjYWxlKys7CisgICAgICBpZiAoc2NhbGUgPT0gc2l6ZW9mIGZyYWN0aW9uX3NjYWxlcyAvIHNpemVvZihGWF9GTE9BVCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYysrOwogICAgIH0KLSAgICBzdGF0aWMgY29uc3QgRlhfRkxPQVQgZnJhY3Rpb25fc2NhbGVzW10gPSB7MC4xZiwgMC4wMWYsIDAuMDAxZiwgMC4wMDAxZiwgMC4wMDAwMWYsIDAuMDAwMDAxZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAxZiwgMC4wMDAwMDAwMWYsIDAuMDAwMDAwMDAxZiwgMC4wMDAwMDAwMDAxZiwgMC4wMDAwMDAwMDAwMWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgIGludCBzY2FsZSA9IDA7Ci0gICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7Ci0gICAgICAgIGNjICsrOwotICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsKLSAgICAgICAgICAgIHZhbHVlICs9IGZyYWN0aW9uX3NjYWxlc1tzY2FsZV0gKiAoc3RyW2NjXSAtICcwJyk7Ci0gICAgICAgICAgICBzY2FsZSArKzsKLSAgICAgICAgICAgIGlmIChzY2FsZSA9PSBzaXplb2YgZnJhY3Rpb25fc2NhbGVzIC8gc2l6ZW9mKEZYX0ZMT0FUKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2MgKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJOZWdhdGl2ZSA/IC12YWx1ZSA6IHZhbHVlOworICB9CisgIHJldHVybiBiTmVnYXRpdmUgPyAtdmFsdWUgOiB2YWx1ZTsKIH0KIAogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18gJiYgX01TQ19WRVIgPCAxOTAwCi12b2lkIEZYU1lTX3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIF9QcmludGZfZm9ybWF0X3N0cmluZ18gY29uc3QgY2hhciogZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICBGWFNZU192c25wcmludGYoc3RyLCBzaXplLCBmbXQsIGFwKTsKLSAgICB2YV9lbmQoYXApOwordm9pZCBGWFNZU19zbnByaW50ZihjaGFyKiBzdHIsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICBfUHJpbnRmX2Zvcm1hdF9zdHJpbmdfIGNvbnN0IGNoYXIqIGZtdCwKKyAgICAgICAgICAgICAgICAgICAgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBmbXQpOworICBGWFNZU192c25wcmludGYoc3RyLCBzaXplLCBmbXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKIH0KLXZvaWQgRlhTWVNfdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcCkKLXsKLSAgICAodm9pZCkgX3ZzbnByaW50ZihzdHIsIHNpemUsIGZtdCwgYXApOwotICAgIGlmIChzaXplKSB7Ci0gICAgICAgIHN0cltzaXplIC0gMV0gPSAwOwotICAgIH0KK3ZvaWQgRlhTWVNfdnNucHJpbnRmKGNoYXIqIHN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcCkgeworICAodm9pZClfdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm10LCBhcCk7CisgIGlmIChzaXplKSB7CisgICAgc3RyW3NpemUgLSAxXSA9IDA7CisgIH0KIH0KICNlbmRpZiAgLy8gX0ZYTV9QTEFURk9STV9XSU5ET1dTXyAmJiBfTVNDX1ZFUiA8IDE5MDAKIAotc3RhdGljIEZYX0JPT0wgRlhfSXNEaWdpdCh1aW50OF90IGNoKQotewotICAgIHJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgPyBUUlVFIDogRkFMU0U7CitzdGF0aWMgRlhfQk9PTCBGWF9Jc0RpZ2l0KHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSA/IFRSVUUgOiBGQUxTRTsKIH0KLXN0YXRpYyBGWF9CT09MIEZYX0lzWERpZ2l0KHVpbnQ4X3QgY2gpCi17Ci0gICAgcmV0dXJuIChGWF9Jc0RpZ2l0KGNoKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgfHwgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpKSA/IFRSVUUgOiBGQUxTRTsKK3N0YXRpYyBGWF9CT09MIEZYX0lzWERpZ2l0KHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuIChGWF9Jc0RpZ2l0KGNoKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgfHwKKyAgICAgICAgICAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykpCisgICAgICAgICAgICAgPyBUUlVFCisgICAgICAgICAgICAgOiBGQUxTRTsKIH0KLXN0YXRpYyB1aW50OF90IEZYX01ha2VVcHBlcih1aW50OF90IGNoKQotewotICAgIGlmIChjaCA8ICdhJyB8fCBjaCA+ICd6JykgewotICAgICAgICByZXR1cm4gY2g7Ci0gICAgfQotICAgIHJldHVybiBjaCAtIDMyOworc3RhdGljIHVpbnQ4X3QgRlhfTWFrZVVwcGVyKHVpbnQ4X3QgY2gpIHsKKyAgaWYgKGNoIDwgJ2EnIHx8IGNoID4gJ3onKSB7CisgICAgcmV0dXJuIGNoOworICB9CisgIHJldHVybiBjaCAtIDMyOwogfQotc3RhdGljIGludCBGWF9IZXhUb0kodWludDhfdCBjaCkKLXsKLSAgICBjaCA9IEZYX01ha2VVcHBlcihjaCk7Ci0gICAgcmV0dXJuIEZYX0lzRGlnaXQoY2gpID8gKGNoIC0gJzAnKSA6IChjaCAtIDU1KTsKK3N0YXRpYyBpbnQgRlhfSGV4VG9JKHVpbnQ4X3QgY2gpIHsKKyAgY2ggPSBGWF9NYWtlVXBwZXIoY2gpOworICByZXR1cm4gRlhfSXNEaWdpdChjaCkgPyAoY2ggLSAnMCcpIDogKGNoIC0gNTUpOwogfQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdXJsX2VuY29kZVRhYmxlWzEyOF0gPSB7Ci0gICAgMSwgIDEsICAxLCAgMSwJCTEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMSwJCTEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMSwJCTEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMSwJCTEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDAsICAxLCAgMSwJCTAsICAxLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTEsICAwLCAgMSwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMSwJCTEsICAxLCAgMSwgIDAsCi0gICAgMSwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMSwJCTEsICAxLCAgMSwgIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsCiB9OwotQ0ZYX0J5dGVTdHJpbmcgRlhfVXJsRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1VybCkKLXsKLSAgICBjb25zdCBjaGFyIGFyRGlnaXRzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgclVybDsKLSAgICBpbnQgbkxlbmd0aCA9IHdzVXJsLkdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIEZYX0RXT1JEIHdvcmQgPSB3c1VybC5HZXRBdChpKTsKLSAgICAgICAgaWYgKHdvcmQgPiAweDdGIHx8IHVybF9lbmNvZGVUYWJsZVt3b3JkXSA9PSAxKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1VyaSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSgoRlhfV09SRCl3b3JkKTsKLSAgICAgICAgICAgIGludCBuQnl0ZSA9IGJzVXJpLkdldExlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuQnl0ZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgclVybCArPSAnJSc7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBjb2RlID0gYnNVcmkuR2V0QXQoaik7Ci0gICAgICAgICAgICAgICAgclVybCArPSBhckRpZ2l0c1tjb2RlID4+IDRdOwotICAgICAgICAgICAgICAgIHJVcmwgKz0gYXJEaWdpdHNbY29kZSAmIDB4MEZdOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgclVybCArPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoKEZYX1dPUkQpd29yZCk7Ci0gICAgICAgIH0KK0NGWF9CeXRlU3RyaW5nIEZYX1VybEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NVcmwpIHsKKyAgY29uc3QgY2hhciBhckRpZ2l0c1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOworICBDRlhfQnl0ZVN0cmluZyByVXJsOworICBpbnQgbkxlbmd0aCA9IHdzVXJsLkdldExlbmd0aCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5MZW5ndGg7IGkrKykgeworICAgIEZYX0RXT1JEIHdvcmQgPSB3c1VybC5HZXRBdChpKTsKKyAgICBpZiAod29yZCA+IDB4N0YgfHwgdXJsX2VuY29kZVRhYmxlW3dvcmRdID09IDEpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzVXJpID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKChGWF9XT1JEKXdvcmQpOworICAgICAgaW50IG5CeXRlID0gYnNVcmkuR2V0TGVuZ3RoKCk7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5CeXRlOyBqKyspIHsKKyAgICAgICAgclVybCArPSAnJSc7CisgICAgICAgIHVpbnQ4X3QgY29kZSA9IGJzVXJpLkdldEF0KGopOworICAgICAgICByVXJsICs9IGFyRGlnaXRzW2NvZGUgPj4gNF07CisgICAgICAgIHJVcmwgKz0gYXJEaWdpdHNbY29kZSAmIDB4MEZdOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByVXJsICs9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSgoRlhfV09SRCl3b3JkKTsKICAgICB9Ci0gICAgcmV0dXJuIHJVcmw7CisgIH0KKyAgcmV0dXJuIHJVcmw7CiB9Ci1DRlhfV2lkZVN0cmluZyBGWF9VcmxEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzVXJsKQotewotICAgIENGWF9CeXRlU3RyaW5nIHJVcmw7Ci0gICAgaW50IG5MZW5ndGggPSBic1VybC5HZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5MZW5ndGg7IGkrKykgewotICAgICAgICBpZiAoaSA8IG5MZW5ndGggLSAyICYmIGJzVXJsW2ldID09ICclJyAmJiBGWF9Jc1hEaWdpdChic1VybFtpICsgMV0pICYmIEZYX0lzWERpZ2l0KGJzVXJsW2kgKyAyXSkpIHsKLSAgICAgICAgICAgIHJVcmwgKz0gKEZYX0hleFRvSShic1VybFtpICsgMV0pIDw8IDQgfCBGWF9IZXhUb0koYnNVcmxbaSArIDJdKSk7Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByVXJsICs9IGJzVXJsW2ldOwotICAgICAgICB9CitDRlhfV2lkZVN0cmluZyBGWF9VcmxEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzVXJsKSB7CisgIENGWF9CeXRlU3RyaW5nIHJVcmw7CisgIGludCBuTGVuZ3RoID0gYnNVcmwuR2V0TGVuZ3RoKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxlbmd0aDsgaSsrKSB7CisgICAgaWYgKGkgPCBuTGVuZ3RoIC0gMiAmJiBic1VybFtpXSA9PSAnJScgJiYgRlhfSXNYRGlnaXQoYnNVcmxbaSArIDFdKSAmJgorICAgICAgICBGWF9Jc1hEaWdpdChic1VybFtpICsgMl0pKSB7CisgICAgICByVXJsICs9IChGWF9IZXhUb0koYnNVcmxbaSArIDFdKSA8PCA0IHwgRlhfSGV4VG9JKGJzVXJsW2kgKyAyXSkpOworICAgICAgaSArPSAyOworICAgIH0gZWxzZSB7CisgICAgICByVXJsICs9IGJzVXJsW2ldOwogICAgIH0KLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChyVXJsKTsKKyAgfQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChyVXJsKTsKIH0KLUNGWF9CeXRlU3RyaW5nIEZYX0VuY29kZVVSSShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NVUkkpCi17Ci0gICAgY29uc3QgY2hhciBhckRpZ2l0c1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOwotICAgIENGWF9CeXRlU3RyaW5nIHJVUkk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNVcmkgPSB3c1VSSS5VVEY4RW5jb2RlKCk7Ci0gICAgaW50IG5MZW5ndGggPSBic1VyaS5HZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5MZW5ndGg7IGkrKykgewotICAgICAgICB1aW50OF90IGNvZGUgPSBic1VyaS5HZXRBdChpKTsKLSAgICAgICAgaWYgKGNvZGUgPiAweDdGIHx8IHVybF9lbmNvZGVUYWJsZVtjb2RlXSA9PSAxKSB7Ci0gICAgICAgICAgICByVVJJICs9ICclJzsKLSAgICAgICAgICAgIHJVUkkgKz0gYXJEaWdpdHNbY29kZSA+PiA0XTsKLSAgICAgICAgICAgIHJVUkkgKz0gYXJEaWdpdHNbY29kZSAmIDB4MEZdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgclVSSSArPSBjb2RlOwotICAgICAgICB9CitDRlhfQnl0ZVN0cmluZyBGWF9FbmNvZGVVUkkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVVJJKSB7CisgIGNvbnN0IGNoYXIgYXJEaWdpdHNbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKyAgQ0ZYX0J5dGVTdHJpbmcgclVSSTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNVcmkgPSB3c1VSSS5VVEY4RW5jb2RlKCk7CisgIGludCBuTGVuZ3RoID0gYnNVcmkuR2V0TGVuZ3RoKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxlbmd0aDsgaSsrKSB7CisgICAgdWludDhfdCBjb2RlID0gYnNVcmkuR2V0QXQoaSk7CisgICAgaWYgKGNvZGUgPiAweDdGIHx8IHVybF9lbmNvZGVUYWJsZVtjb2RlXSA9PSAxKSB7CisgICAgICByVVJJICs9ICclJzsKKyAgICAgIHJVUkkgKz0gYXJEaWdpdHNbY29kZSA+PiA0XTsKKyAgICAgIHJVUkkgKz0gYXJEaWdpdHNbY29kZSAmIDB4MEZdOworICAgIH0gZWxzZSB7CisgICAgICByVVJJICs9IGNvZGU7CiAgICAgfQotICAgIHJldHVybiByVVJJOworICB9CisgIHJldHVybiByVVJJOwogfQotQ0ZYX1dpZGVTdHJpbmcgRlhfRGVjb2RlVVJJKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic1VSSSkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyByVVJJOwotICAgIGludCBuTGVuZ3RoID0gYnNVUkkuR2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaWYgKGkgPCBuTGVuZ3RoIC0gMiAmJiBic1VSSVtpXSA9PSAnJScgJiYgRlhfSXNYRGlnaXQoYnNVUklbaSArIDFdKSAmJiBGWF9Jc1hEaWdpdChic1VSSVtpICsgMl0pKSB7Ci0gICAgICAgICAgICByVVJJICs9IChGWF9IZXhUb0koYnNVUklbaSArIDFdKSA8PCA0IHwgRlhfSGV4VG9JKGJzVVJJW2kgKyAyXSkpOwotICAgICAgICAgICAgaSArPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgclVSSSArPSBic1VSSVtpXTsKLSAgICAgICAgfQorQ0ZYX1dpZGVTdHJpbmcgRlhfRGVjb2RlVVJJKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic1VSSSkgeworICBDRlhfQnl0ZVN0cmluZyByVVJJOworICBpbnQgbkxlbmd0aCA9IGJzVVJJLkdldExlbmd0aCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5MZW5ndGg7IGkrKykgeworICAgIGlmIChpIDwgbkxlbmd0aCAtIDIgJiYgYnNVUklbaV0gPT0gJyUnICYmIEZYX0lzWERpZ2l0KGJzVVJJW2kgKyAxXSkgJiYKKyAgICAgICAgRlhfSXNYRGlnaXQoYnNVUklbaSArIDJdKSkgeworICAgICAgclVSSSArPSAoRlhfSGV4VG9JKGJzVVJJW2kgKyAxXSkgPDwgNCB8IEZYX0hleFRvSShic1VSSVtpICsgMl0pKTsKKyAgICAgIGkgKz0gMjsKKyAgICB9IGVsc2UgeworICAgICAgclVSSSArPSBic1VSSVtpXTsKICAgICB9Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChyVVJJLCByVVJJLkdldExlbmd0aCgpKTsKKyAgfQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHJVUkksIHJVUkkuR2V0TGVuZ3RoKCkpOwogfQogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLWNsYXNzIENGaW5kRmlsZURhdGEKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5DRmluZEZpbGVEYXRhKCkge30KLSAgICBIQU5ETEUJCQkJbV9IYW5kbGU7Ci0gICAgRlhfQk9PTAkJCQltX2JFbmQ7CitjbGFzcyBDRmluZEZpbGVEYXRhIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNGaW5kRmlsZURhdGEoKSB7fQorICBIQU5ETEUgbV9IYW5kbGU7CisgIEZYX0JPT0wgbV9iRW5kOwogfTsKLWNsYXNzIENGaW5kRmlsZURhdGFBIDogcHVibGljIENGaW5kRmlsZURhdGEKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5DRmluZEZpbGVEYXRhQSgpIHt9Ci0gICAgV0lOMzJfRklORF9EQVRBQQltX0ZpbmREYXRhOworY2xhc3MgQ0ZpbmRGaWxlRGF0YUEgOiBwdWJsaWMgQ0ZpbmRGaWxlRGF0YSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5DRmluZEZpbGVEYXRhQSgpIHt9CisgIFdJTjMyX0ZJTkRfREFUQUEgbV9GaW5kRGF0YTsKIH07Ci1jbGFzcyBDRmluZEZpbGVEYXRhVyA6IHB1YmxpYyBDRmluZEZpbGVEYXRhCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+Q0ZpbmRGaWxlRGF0YVcoKSB7fQotICAgIFdJTjMyX0ZJTkRfREFUQVcJbV9GaW5kRGF0YTsKK2NsYXNzIENGaW5kRmlsZURhdGFXIDogcHVibGljIENGaW5kRmlsZURhdGEgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q0ZpbmRGaWxlRGF0YVcoKSB7fQorICBXSU4zMl9GSU5EX0RBVEFXIG1fRmluZERhdGE7CiB9OwogI2VuZGlmCi12b2lkKiBGWF9PcGVuRm9sZGVyKGNvbnN0IEZYX0NIQVIqIHBhdGgpCi17Cit2b2lkKiBGWF9PcGVuRm9sZGVyKGNvbnN0IEZYX0NIQVIqIHBhdGgpIHsKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAjaWZuZGVmIF9XSU4zMl9XQ0UKLSAgICBDRmluZEZpbGVEYXRhQSogcERhdGEgPSBGWF9ORVcgQ0ZpbmRGaWxlRGF0YUE7Ci0gICAgaWYgKCFwRGF0YSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisgIENGaW5kRmlsZURhdGFBKiBwRGF0YSA9IEZYX05FVyBDRmluZEZpbGVEYXRhQTsKKyAgaWYgKCFwRGF0YSkgeworICAgIHJldHVybiBOVUxMOworICB9CiAjaWZkZWYgX0ZYX1dJTkFQSV9QQVJUSVRJT05fREVTS1RPUF8KLSAgICBwRGF0YS0+bV9IYW5kbGUgPSBGaW5kRmlyc3RGaWxlQShDRlhfQnl0ZVN0cmluZyhwYXRoKSArICIvKi4qIiwgJnBEYXRhLT5tX0ZpbmREYXRhKTsKKyAgcERhdGEtPm1fSGFuZGxlID0KKyAgICAgIEZpbmRGaXJzdEZpbGVBKENGWF9CeXRlU3RyaW5nKHBhdGgpICsgIi8qLioiLCAmcERhdGEtPm1fRmluZERhdGEpOwogI2Vsc2UKLSAgICBwRGF0YS0+bV9IYW5kbGUgPSBGaW5kRmlyc3RGaWxlRXhBKENGWF9CeXRlU3RyaW5nKHBhdGgpICsgIi8qLioiLCBGaW5kRXhJbmZvU3RhbmRhcmQsICZwRGF0YS0+bV9GaW5kRGF0YSwgRmluZEV4U2VhcmNoTmFtZU1hdGNoLCBOVUxMLCAwKTsKKyAgcERhdGEtPm1fSGFuZGxlID0KKyAgICAgIEZpbmRGaXJzdEZpbGVFeEEoQ0ZYX0J5dGVTdHJpbmcocGF0aCkgKyAiLyouKiIsIEZpbmRFeEluZm9TdGFuZGFyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5tX0ZpbmREYXRhLCBGaW5kRXhTZWFyY2hOYW1lTWF0Y2gsIE5VTEwsIDApOwogI2VuZGlmCiAjZWxzZQotICAgIENGaW5kRmlsZURhdGFXKiBwRGF0YSA9IEZYX05FVyBDRmluZEZpbGVEYXRhVzsKLSAgICBpZiAoIXBEYXRhKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwRGF0YS0+bV9IYW5kbGUgPSBGaW5kRmlyc3RGaWxlVyhDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBhdGgpICsgTCIvKi4qIiwgJnBEYXRhLT5tX0ZpbmREYXRhKTsKKyAgQ0ZpbmRGaWxlRGF0YVcqIHBEYXRhID0gRlhfTkVXIENGaW5kRmlsZURhdGFXOworICBpZiAoIXBEYXRhKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcERhdGEtPm1fSGFuZGxlID0gRmluZEZpcnN0RmlsZVcoQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwYXRoKSArIEwiLyouKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+bV9GaW5kRGF0YSk7CiAjZW5kaWYKLSAgICBpZiAocERhdGEtPm1fSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgICAgIGRlbGV0ZSBwRGF0YTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBEYXRhLT5tX2JFbmQgPSBGQUxTRTsKLSAgICByZXR1cm4gcERhdGE7Ci0jZWxzZQotICAgIERJUiogZGlyID0gb3BlbmRpcihwYXRoKTsKLSAgICByZXR1cm4gZGlyOwotI2VuZGlmCi19Ci12b2lkKiBGWF9PcGVuRm9sZGVyKGNvbnN0IEZYX1dDSEFSKiBwYXRoKQotewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBDRmluZEZpbGVEYXRhVyogcERhdGEgPSBGWF9ORVcgQ0ZpbmRGaWxlRGF0YVc7Ci0gICAgaWYgKCFwRGF0YSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0jaWZkZWYgX0ZYX1dJTkFQSV9QQVJUSVRJT05fREVTS1RPUF8KLSAgICBwRGF0YS0+bV9IYW5kbGUgPSBGaW5kRmlyc3RGaWxlVygoQ0ZYX1dpZGVTdHJpbmcocGF0aCkgKyBMIi8qLioiKS5jX3N0cigpLCAmcERhdGEtPm1fRmluZERhdGEpOwotI2Vsc2UKLSAgICBwRGF0YS0+bV9IYW5kbGUgPSBGaW5kRmlyc3RGaWxlRXhXKChDRlhfV2lkZVN0cmluZyhwYXRoKSArIEwiLyouKiIpLmNfc3RyKCksIEZpbmRFeEluZm9TdGFuZGFyZCwgJnBEYXRhLT5tX0ZpbmREYXRhLCBGaW5kRXhTZWFyY2hOYW1lTWF0Y2gsIE5VTEwsIDApOwotI2VuZGlmCi0gICAgaWYgKHBEYXRhLT5tX0hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICBkZWxldGUgcERhdGE7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwRGF0YS0+bV9iRW5kID0gRkFMU0U7Ci0gICAgcmV0dXJuIHBEYXRhOwotI2Vsc2UKLSAgICBESVIqIGRpciA9IG9wZW5kaXIoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBhdGgpKTsKLSAgICByZXR1cm4gZGlyOwotI2VuZGlmCi19Ci1GWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX0J5dGVTdHJpbmcmIGZpbGVuYW1lLCBGWF9CT09MJiBiRm9sZGVyKQotewotICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSNpZm5kZWYgX1dJTjMyX1dDRQotICAgIENGaW5kRmlsZURhdGFBKiBwRGF0YSA9IChDRmluZEZpbGVEYXRhQSopaGFuZGxlOwotICAgIGlmIChwRGF0YS0+bV9iRW5kKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZmlsZW5hbWUgPSBwRGF0YS0+bV9GaW5kRGF0YS5jRmlsZU5hbWU7Ci0gICAgYkZvbGRlciA9IHBEYXRhLT5tX0ZpbmREYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7Ci0gICAgaWYgKCFGaW5kTmV4dEZpbGVBKHBEYXRhLT5tX0hhbmRsZSwgJnBEYXRhLT5tX0ZpbmREYXRhKSkgewotICAgICAgICBwRGF0YS0+bV9iRW5kID0gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci0jZWxzZQotICAgIENGaW5kRmlsZURhdGFXKiBwRGF0YSA9IChDRmluZEZpbGVEYXRhVyopaGFuZGxlOwotICAgIGlmIChwRGF0YS0+bV9iRW5kKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZmlsZW5hbWUgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocERhdGEtPm1fRmluZERhdGEuY0ZpbGVOYW1lKTsKLSAgICBiRm9sZGVyID0gcERhdGEtPm1fRmluZERhdGEuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWTsKLSAgICBpZiAoIUZpbmROZXh0RmlsZVcocERhdGEtPm1fSGFuZGxlLCAmcERhdGEtPm1fRmluZERhdGEpKSB7Ci0gICAgICAgIHBEYXRhLT5tX2JFbmQgPSBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLSNlbmRpZgotI2VsaWYgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKLSAgICBhYm9ydCgpOwotICAgIHJldHVybiBGQUxTRTsKLSNlbHNlCi0gICAgc3RydWN0IGRpcmVudCAqZGUgPSByZWFkZGlyKChESVIqKWhhbmRsZSk7Ci0gICAgaWYgKGRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmaWxlbmFtZSA9IGRlLT5kX25hbWU7Ci0gICAgYkZvbGRlciA9IGRlLT5kX3R5cGUgPT0gRFRfRElSOwotICAgIHJldHVybiBUUlVFOwotI2VuZGlmCi19Ci1GWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVuYW1lLCBGWF9CT09MJiBiRm9sZGVyKQotewotICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBDRmluZEZpbGVEYXRhVyogcERhdGEgPSAoQ0ZpbmRGaWxlRGF0YVcqKWhhbmRsZTsKLSAgICBpZiAocERhdGEtPm1fYkVuZCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGZpbGVuYW1lID0gcERhdGEtPm1fRmluZERhdGEuY0ZpbGVOYW1lOwotICAgIGJGb2xkZXIgPSBwRGF0YS0+bV9GaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZOwotICAgIGlmICghRmluZE5leHRGaWxlVyhwRGF0YS0+bV9IYW5kbGUsICZwRGF0YS0+bV9GaW5kRGF0YSkpIHsKLSAgICAgICAgcERhdGEtPm1fYkVuZCA9IFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotI2VsaWYgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKLSAgICBhYm9ydCgpOwotICAgIHJldHVybiBGQUxTRTsKLSNlbHNlCi0gICAgc3RydWN0IGRpcmVudCAqZGUgPSByZWFkZGlyKChESVIqKWhhbmRsZSk7Ci0gICAgaWYgKGRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmaWxlbmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoZGUtPmRfbmFtZSk7Ci0gICAgYkZvbGRlciA9IGRlLT5kX3R5cGUgPT0gRFRfRElSOwotICAgIHJldHVybiBUUlVFOwotI2VuZGlmCi19Ci12b2lkIEZYX0Nsb3NlRm9sZGVyKHZvaWQqIGhhbmRsZSkKLXsKLSAgICBpZiAoaGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgQ0ZpbmRGaWxlRGF0YSogcERhdGEgPSAoQ0ZpbmRGaWxlRGF0YSopaGFuZGxlOwotICAgIEZpbmRDbG9zZShwRGF0YS0+bV9IYW5kbGUpOworICBpZiAocERhdGEtPm1fSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CiAgICAgZGVsZXRlIHBEYXRhOworICAgIHJldHVybiBOVUxMOworICB9CisgIHBEYXRhLT5tX2JFbmQgPSBGQUxTRTsKKyAgcmV0dXJuIHBEYXRhOwogI2Vsc2UKLSAgICBjbG9zZWRpcigoRElSKiloYW5kbGUpOworICBESVIqIGRpciA9IG9wZW5kaXIocGF0aCk7CisgIHJldHVybiBkaXI7CiAjZW5kaWYKIH0KLUZYX1dDSEFSIEZYX0dldEZvbGRlclNlcGFyYXRvcigpCi17Cit2b2lkKiBGWF9PcGVuRm9sZGVyKGNvbnN0IEZYX1dDSEFSKiBwYXRoKSB7CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgIHJldHVybiAnXFwnOworICBDRmluZEZpbGVEYXRhVyogcERhdGEgPSBGWF9ORVcgQ0ZpbmRGaWxlRGF0YVc7CisgIGlmICghcERhdGEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2lmZGVmIF9GWF9XSU5BUElfUEFSVElUSU9OX0RFU0tUT1BfCisgIHBEYXRhLT5tX0hhbmRsZSA9IEZpbmRGaXJzdEZpbGVXKChDRlhfV2lkZVN0cmluZyhwYXRoKSArIEwiLyouKiIpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+bV9GaW5kRGF0YSk7CiAjZWxzZQotICAgIHJldHVybiAnLyc7CisgIHBEYXRhLT5tX0hhbmRsZSA9IEZpbmRGaXJzdEZpbGVFeFcoKENGWF9XaWRlU3RyaW5nKHBhdGgpICsgTCIvKi4qIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kRXhJbmZvU3RhbmRhcmQsICZwRGF0YS0+bV9GaW5kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kRXhTZWFyY2hOYW1lTWF0Y2gsIE5VTEwsIDApOworI2VuZGlmCisgIGlmIChwRGF0YS0+bV9IYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBkZWxldGUgcERhdGE7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcERhdGEtPm1fYkVuZCA9IEZBTFNFOworICByZXR1cm4gcERhdGE7CisjZWxzZQorICBESVIqIGRpciA9IG9wZW5kaXIoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBhdGgpKTsKKyAgcmV0dXJuIGRpcjsKKyNlbmRpZgorfQorRlhfQk9PTCBGWF9HZXROZXh0RmlsZSh2b2lkKiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkZvbGRlcikgeworICBpZiAoaGFuZGxlID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjaWZuZGVmIF9XSU4zMl9XQ0UKKyAgQ0ZpbmRGaWxlRGF0YUEqIHBEYXRhID0gKENGaW5kRmlsZURhdGFBKiloYW5kbGU7CisgIGlmIChwRGF0YS0+bV9iRW5kKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGZpbGVuYW1lID0gcERhdGEtPm1fRmluZERhdGEuY0ZpbGVOYW1lOworICBiRm9sZGVyID0gcERhdGEtPm1fRmluZERhdGEuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWTsKKyAgaWYgKCFGaW5kTmV4dEZpbGVBKHBEYXRhLT5tX0hhbmRsZSwgJnBEYXRhLT5tX0ZpbmREYXRhKSkgeworICAgIHBEYXRhLT5tX2JFbmQgPSBUUlVFOworICB9CisgIHJldHVybiBUUlVFOworI2Vsc2UKKyAgQ0ZpbmRGaWxlRGF0YVcqIHBEYXRhID0gKENGaW5kRmlsZURhdGFXKiloYW5kbGU7CisgIGlmIChwRGF0YS0+bV9iRW5kKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGZpbGVuYW1lID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBEYXRhLT5tX0ZpbmREYXRhLmNGaWxlTmFtZSk7CisgIGJGb2xkZXIgPSBwRGF0YS0+bV9GaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZOworICBpZiAoIUZpbmROZXh0RmlsZVcocERhdGEtPm1fSGFuZGxlLCAmcERhdGEtPm1fRmluZERhdGEpKSB7CisgICAgcERhdGEtPm1fYkVuZCA9IFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCisgIGFib3J0KCk7CisgIHJldHVybiBGQUxTRTsKKyNlbHNlCisgIHN0cnVjdCBkaXJlbnQqIGRlID0gcmVhZGRpcigoRElSKiloYW5kbGUpOworICBpZiAoZGUgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmaWxlbmFtZSA9IGRlLT5kX25hbWU7CisgIGJGb2xkZXIgPSBkZS0+ZF90eXBlID09IERUX0RJUjsKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYKK30KK0ZYX0JPT0wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJGb2xkZXIpIHsKKyAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworICBDRmluZEZpbGVEYXRhVyogcERhdGEgPSAoQ0ZpbmRGaWxlRGF0YVcqKWhhbmRsZTsKKyAgaWYgKHBEYXRhLT5tX2JFbmQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZmlsZW5hbWUgPSBwRGF0YS0+bV9GaW5kRGF0YS5jRmlsZU5hbWU7CisgIGJGb2xkZXIgPSBwRGF0YS0+bV9GaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZOworICBpZiAoIUZpbmROZXh0RmlsZVcocERhdGEtPm1fSGFuZGxlLCAmcERhdGEtPm1fRmluZERhdGEpKSB7CisgICAgcERhdGEtPm1fYkVuZCA9IFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CisjZWxpZiBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQorICBhYm9ydCgpOworICByZXR1cm4gRkFMU0U7CisjZWxzZQorICBzdHJ1Y3QgZGlyZW50KiBkZSA9IHJlYWRkaXIoKERJUiopaGFuZGxlKTsKKyAgaWYgKGRlID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZmlsZW5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGRlLT5kX25hbWUpOworICBiRm9sZGVyID0gZGUtPmRfdHlwZSA9PSBEVF9ESVI7CisgIHJldHVybiBUUlVFOworI2VuZGlmCit9Cit2b2lkIEZYX0Nsb3NlRm9sZGVyKHZvaWQqIGhhbmRsZSkgeworICBpZiAoaGFuZGxlID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgIENGaW5kRmlsZURhdGEqIHBEYXRhID0gKENGaW5kRmlsZURhdGEqKWhhbmRsZTsKKyAgRmluZENsb3NlKHBEYXRhLT5tX0hhbmRsZSk7CisgIGRlbGV0ZSBwRGF0YTsKKyNlbHNlCisgIGNsb3NlZGlyKChESVIqKWhhbmRsZSk7CisjZW5kaWYKK30KK0ZYX1dDSEFSIEZYX0dldEZvbGRlclNlcGFyYXRvcigpIHsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgIHJldHVybiAnXFwnOworI2Vsc2UKKyAgcmV0dXJuICcvJzsKICNlbmRpZgogfQogCi1DRlhfTWF0cml4XzNieTMgQ0ZYX01hdHJpeF8zYnkzOjpJbnZlcnNlKCkKLXsKLSAgICBGWF9GTE9BVCBkZXQgPSBhKihlKmkgLSBmKmgpIC0gYiooaSpkIC0gZipnKSArIGMqKGQqaCAtIGUqZyk7Ci0gICAgaWYgKEZYU1lTX2ZhYnMoZGV0KSA8IDAuMDAwMDAwMSkKLSAgICAgICAgcmV0dXJuIENGWF9NYXRyaXhfM2J5MygpOworQ0ZYX01hdHJpeF8zYnkzIENGWF9NYXRyaXhfM2J5Mzo6SW52ZXJzZSgpIHsKKyAgRlhfRkxPQVQgZGV0ID0KKyAgICAgIGEgKiAoZSAqIGkgLSBmICogaCkgLSBiICogKGkgKiBkIC0gZiAqIGcpICsgYyAqIChkICogaCAtIGUgKiBnKTsKKyAgaWYgKEZYU1lTX2ZhYnMoZGV0KSA8IDAuMDAwMDAwMSkKKyAgICByZXR1cm4gQ0ZYX01hdHJpeF8zYnkzKCk7CiAKLSAgICByZXR1cm4gQ0ZYX01hdHJpeF8zYnkzKAotICAgICAgICAoZSppIC0gZipoKSAvIGRldCwKLSAgICAgICAgLShiKmkgLSBjKmgpIC8gZGV0LAotICAgICAgICAoYipmIC0gYyplKSAvIGRldCwKLSAgICAgICAgLShkKmkgLSBmKmcpIC8gZGV0LAotICAgICAgICAoYSppIC0gYypnKSAvIGRldCwKLSAgICAgICAgLShhKmYgLSBjKmQpIC8gZGV0LAotICAgICAgICAoZCpoIC0gZSpnKSAvIGRldCwKLSAgICAgICAgLShhKmggLSBiKmcpIC8gZGV0LAotICAgICAgICAoYSplIC0gYipkKSAvIGRldAotICAgICk7CisgIHJldHVybiBDRlhfTWF0cml4XzNieTMoCisgICAgICAoZSAqIGkgLSBmICogaCkgLyBkZXQsIC0oYiAqIGkgLSBjICogaCkgLyBkZXQsIChiICogZiAtIGMgKiBlKSAvIGRldCwKKyAgICAgIC0oZCAqIGkgLSBmICogZykgLyBkZXQsIChhICogaSAtIGMgKiBnKSAvIGRldCwgLShhICogZiAtIGMgKiBkKSAvIGRldCwKKyAgICAgIChkICogaCAtIGUgKiBnKSAvIGRldCwgLShhICogaCAtIGIgKiBnKSAvIGRldCwgKGEgKiBlIC0gYiAqIGQpIC8gZGV0KTsKIH0KIAotQ0ZYX01hdHJpeF8zYnkzIENGWF9NYXRyaXhfM2J5Mzo6TXVsdGlwbHkoY29uc3QgQ0ZYX01hdHJpeF8zYnkzICZtKQotewotICAgIHJldHVybiBDRlhfTWF0cml4XzNieTMoCi0gICAgICAgIGEqbS5hICsgYiptLmQgKyBjKm0uZywKLSAgICAgICAgYSptLmIgKyBiKm0uZSArIGMqbS5oLAotICAgICAgICBhKm0uYyArIGIqbS5mICsgYyptLmksCi0gICAgICAgIGQqbS5hICsgZSptLmQgKyBmKm0uZywKLSAgICAgICAgZCptLmIgKyBlKm0uZSArIGYqbS5oLAotICAgICAgICBkKm0uYyArIGUqbS5mICsgZiptLmksCi0gICAgICAgIGcqbS5hICsgaCptLmQgKyBpKm0uZywKLSAgICAgICAgZyptLmIgKyBoKm0uZSArIGkqbS5oLAotICAgICAgICBnKm0uYyArIGgqbS5mICsgaSptLmkKLSAgICAgICk7CitDRlhfTWF0cml4XzNieTMgQ0ZYX01hdHJpeF8zYnkzOjpNdWx0aXBseShjb25zdCBDRlhfTWF0cml4XzNieTMmIG0pIHsKKyAgcmV0dXJuIENGWF9NYXRyaXhfM2J5MygKKyAgICAgIGEgKiBtLmEgKyBiICogbS5kICsgYyAqIG0uZywgYSAqIG0uYiArIGIgKiBtLmUgKyBjICogbS5oLAorICAgICAgYSAqIG0uYyArIGIgKiBtLmYgKyBjICogbS5pLCBkICogbS5hICsgZSAqIG0uZCArIGYgKiBtLmcsCisgICAgICBkICogbS5iICsgZSAqIG0uZSArIGYgKiBtLmgsIGQgKiBtLmMgKyBlICogbS5mICsgZiAqIG0uaSwKKyAgICAgIGcgKiBtLmEgKyBoICogbS5kICsgaSAqIG0uZywgZyAqIG0uYiArIGggKiBtLmUgKyBpICogbS5oLAorICAgICAgZyAqIG0uYyArIGggKiBtLmYgKyBpICogbS5pKTsKIH0KIAotQ0ZYX1ZlY3Rvcl8zYnkxIENGWF9NYXRyaXhfM2J5Mzo6VHJhbnNmb3JtVmVjdG9yKGNvbnN0IENGWF9WZWN0b3JfM2J5MSAmdikKLXsKLSAgICByZXR1cm4gQ0ZYX1ZlY3Rvcl8zYnkxKAotICAgICAgICBhICogdi5hICsgYiAqIHYuYiArIGMgKiB2LmMsCi0gICAgICAgIGQgKiB2LmEgKyBlICogdi5iICsgZiAqIHYuYywKLSAgICAgICAgZyAqIHYuYSArIGggKiB2LmIgKyBpICogdi5jCi0gICAgKTsKK0NGWF9WZWN0b3JfM2J5MSBDRlhfTWF0cml4XzNieTM6OlRyYW5zZm9ybVZlY3Rvcihjb25zdCBDRlhfVmVjdG9yXzNieTEmIHYpIHsKKyAgcmV0dXJuIENGWF9WZWN0b3JfM2J5MShhICogdi5hICsgYiAqIHYuYiArIGMgKiB2LmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZCAqIHYuYSArIGUgKiB2LmIgKyBmICogdi5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGcgKiB2LmEgKyBoICogdi5iICsgaSAqIHYuYyk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwCmluZGV4IGI2YjU5NTUuLmU3ZjhjMDEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwCkBAIC0xMCwxMDgwICsxMCwxMDU3IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKIAogLy8gc3RhdGljCi1DRlhfV2lkZVN0cmluZzo6U3RyaW5nRGF0YSogQ0ZYX1dpZGVTdHJpbmc6OlN0cmluZ0RhdGE6OkNyZWF0ZShpbnQgbkxlbikKLXsKLSAgICAvLyBUT0RPKHBhbG1lcik6IHxuTGVufCBzaG91bGQgcmVhbGx5IGJlIGRlY2xhcmVkIGFzIHxzaXplX3R8LCBvcgotICAgIC8vIGF0IGxlYXN0IHVuc2lnbmVkLgotICAgIGlmIChuTGVuID09IDAgfHwgbkxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorQ0ZYX1dpZGVTdHJpbmc6OlN0cmluZ0RhdGEqIENGWF9XaWRlU3RyaW5nOjpTdHJpbmdEYXRhOjpDcmVhdGUoaW50IG5MZW4pIHsKKyAgLy8gVE9ETyhwYWxtZXIpOiB8bkxlbnwgc2hvdWxkIHJlYWxseSBiZSBkZWNsYXJlZCBhcyB8c2l6ZV90fCwgb3IKKyAgLy8gYXQgbGVhc3QgdW5zaWduZWQuCisgIGlmIChuTGVuID09IDAgfHwgbkxlbiA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogCi0gICAgLy8gRml4ZWQgcG9ydGlvbiBvZiBoZWFkZXIgcGx1cyBhIE5VTCB3aWRlIGNoYXIgbm90IGluIG1fbkFsbG9jTGVuZ3RoLgotICAgIGludCBvdmVyaGVhZCA9IG9mZnNldG9mKFN0cmluZ0RhdGEsIG1fU3RyaW5nKSArIHNpemVvZihGWF9XQ0hBUik7Ci0gICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IGlTaXplID0gbkxlbjsKLSAgICBpU2l6ZSAqPSBzaXplb2YoRlhfV0NIQVIpOwotICAgIGlTaXplICs9IG92ZXJoZWFkOworICAvLyBGaXhlZCBwb3J0aW9uIG9mIGhlYWRlciBwbHVzIGEgTlVMIHdpZGUgY2hhciBub3QgaW4gbV9uQWxsb2NMZW5ndGguCisgIGludCBvdmVyaGVhZCA9IG9mZnNldG9mKFN0cmluZ0RhdGEsIG1fU3RyaW5nKSArIHNpemVvZihGWF9XQ0hBUik7CisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiBpU2l6ZSA9IG5MZW47CisgIGlTaXplICo9IHNpemVvZihGWF9XQ0hBUik7CisgIGlTaXplICs9IG92ZXJoZWFkOwogCi0gICAgLy8gTm93IHJvdW5kIHRvIGFuIDgtYnl0ZSBib3VuZGFyeS4gV2UnZCBleHBlY3QgdGhhdCB0aGlzIGlzIHRoZSBtaW5pbXVtCi0gICAgLy8gZ3JhbnVsYXJpdHkgb2YgYW55IG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRvcnMsIHNvIHRoZXJlIG1heSBiZSBjYXNlcwotICAgIC8vIHdoZXJlIHdlIGNhbiBzYXZlIGEgcmUtYWxsb2Mgd2hlbiBhZGRpbmcgYSBmZXcgY2hhcmFjdGVycyB0byBhIHN0cmluZwotICAgIC8vIGJ5IHVzaW5nIHRoaXMgb3RoZXJ3aXNlIHdhc3RlZCBzcGFjZS4KLSAgICBpU2l6ZSArPSA3OwotICAgIGludCB0b3RhbFNpemUgPSBpU2l6ZS5WYWx1ZU9yRGllKCkgJiB+NzsKLSAgICBpbnQgdXNhYmxlTGVuID0gKHRvdGFsU2l6ZSAtIG92ZXJoZWFkKSAvIHNpemVvZihGWF9XQ0hBUik7Ci0gICAgRlhTWVNfYXNzZXJ0KHVzYWJsZUxlbiA+PSBuTGVuKTsKKyAgLy8gTm93IHJvdW5kIHRvIGFuIDgtYnl0ZSBib3VuZGFyeS4gV2UnZCBleHBlY3QgdGhhdCB0aGlzIGlzIHRoZSBtaW5pbXVtCisgIC8vIGdyYW51bGFyaXR5IG9mIGFueSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3JzLCBzbyB0aGVyZSBtYXkgYmUgY2FzZXMKKyAgLy8gd2hlcmUgd2UgY2FuIHNhdmUgYSByZS1hbGxvYyB3aGVuIGFkZGluZyBhIGZldyBjaGFyYWN0ZXJzIHRvIGEgc3RyaW5nCisgIC8vIGJ5IHVzaW5nIHRoaXMgb3RoZXJ3aXNlIHdhc3RlZCBzcGFjZS4KKyAgaVNpemUgKz0gNzsKKyAgaW50IHRvdGFsU2l6ZSA9IGlTaXplLlZhbHVlT3JEaWUoKSAmIH43OworICBpbnQgdXNhYmxlTGVuID0gKHRvdGFsU2l6ZSAtIG92ZXJoZWFkKSAvIHNpemVvZihGWF9XQ0hBUik7CisgIEZYU1lTX2Fzc2VydCh1c2FibGVMZW4gPj0gbkxlbik7CiAKLSAgICB2b2lkKiBwRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlTaXplLlZhbHVlT3JEaWUoKSk7Ci0gICAgcmV0dXJuIG5ldyAocERhdGEpIFN0cmluZ0RhdGEobkxlbiwgdXNhYmxlTGVuKTsKKyAgdm9pZCogcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBpU2l6ZS5WYWx1ZU9yRGllKCkpOworICByZXR1cm4gbmV3IChwRGF0YSkgU3RyaW5nRGF0YShuTGVuLCB1c2FibGVMZW4pOwogfQotQ0ZYX1dpZGVTdHJpbmc6On5DRlhfV2lkZVN0cmluZygpCi17Ci0gICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgbV9wRGF0YS0+UmVsZWFzZSgpOwotICAgIH0KK0NGWF9XaWRlU3RyaW5nOjp+Q0ZYX1dpZGVTdHJpbmcoKSB7CisgIGlmIChtX3BEYXRhKSB7CisgICAgbV9wRGF0YS0+UmVsZWFzZSgpOworICB9CiB9Ci1DRlhfV2lkZVN0cmluZzo6Q0ZYX1dpZGVTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZ1NyYykKLXsKLSAgICBpZiAoc3RyaW5nU3JjLm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBtX3BEYXRhID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc3RyaW5nU3JjLm1fcERhdGEtPm1fblJlZnMgPj0gMCkgewotICAgICAgICBtX3BEYXRhID0gc3RyaW5nU3JjLm1fcERhdGE7Ci0gICAgICAgIG1fcERhdGEtPlJldGFpbigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgICAgICAqdGhpcyA9IHN0cmluZ1NyYzsKLSAgICB9CitDRlhfV2lkZVN0cmluZzo6Q0ZYX1dpZGVTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZ1NyYykgeworICBpZiAoc3RyaW5nU3JjLm1fcERhdGEgPT0gTlVMTCkgeworICAgIG1fcERhdGEgPSBOVUxMOworICAgIHJldHVybjsKKyAgfQorICBpZiAoc3RyaW5nU3JjLm1fcERhdGEtPm1fblJlZnMgPj0gMCkgeworICAgIG1fcERhdGEgPSBzdHJpbmdTcmMubV9wRGF0YTsKKyAgICBtX3BEYXRhLT5SZXRhaW4oKTsKKyAgfSBlbHNlIHsKKyAgICBtX3BEYXRhID0gTlVMTDsKKyAgICAqdGhpcyA9IHN0cmluZ1NyYzsKKyAgfQogfQogQ0ZYX1dpZGVTdHJpbmc6OkNGWF9XaWRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBscHN6LCBGWF9TVFJTSVpFIG5MZW4pIHsKLSAgICBpZiAobkxlbiA8IDApIHsKLSAgICAgICAgbkxlbiA9IGxwc3ogPyBGWFNZU193Y3NsZW4obHBzeikgOiAwOwotICAgIH0KLSAgICBpZiAobkxlbikgewotICAgICAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5MZW4pOwotICAgICAgICBpZiAobV9wRGF0YSkgewotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBscHN6LCBuTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX3BEYXRhID0gTlVMTDsKLSAgICB9Ci19Ci1DRlhfV2lkZVN0cmluZzo6Q0ZYX1dpZGVTdHJpbmcoRlhfV0NIQVIgY2gpCi17Ci0gICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZSgxKTsKLSAgICBpZiAobV9wRGF0YSkgewotICAgICAgICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IGNoOwotICAgIH0KLX0KLUNGWF9XaWRlU3RyaW5nOjpDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikKLXsKLSAgICBpZiAoc3RyLklzRW1wdHkoKSkgewotICAgICAgICBtX3BEYXRhID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKHN0ci5HZXRMZW5ndGgoKSk7Ci0gICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBzdHIuR2V0UHRyKCksIHN0ci5HZXRMZW5ndGgoKSpzaXplb2YoRlhfV0NIQVIpKTsKLSAgICB9Ci19Ci1DRlhfV2lkZVN0cmluZzo6Q0ZYX1dpZGVTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIxLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjIpCi17Ci0gICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgaW50IG5OZXdMZW4gPSBzdHIxLkdldExlbmd0aCgpICsgc3RyMi5HZXRMZW5ndGgoKTsKLSAgICBpZiAobk5ld0xlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuKTsKLSAgICBpZiAobV9wRGF0YSkgewotICAgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIHN0cjEuR2V0UHRyKCksIHN0cjEuR2V0TGVuZ3RoKCkqc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZyArIHN0cjEuR2V0TGVuZ3RoKCksIHN0cjIuR2V0UHRyKCksIHN0cjIuR2V0TGVuZ3RoKCkqc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgfQotfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6UmVsZWFzZUJ1ZmZlcihGWF9TVFJTSVpFIG5OZXdMZW5ndGgpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENvcHlCZWZvcmVXcml0ZSgpOwotICAgIGlmIChuTmV3TGVuZ3RoID09IC0xKSB7Ci0gICAgICAgIG5OZXdMZW5ndGggPSBtX3BEYXRhID8gRlhTWVNfd2NzbGVuKG1fcERhdGEtPm1fU3RyaW5nKSA6IDA7Ci0gICAgfQotICAgIGlmIChuTmV3TGVuZ3RoID09IDApIHsKLSAgICAgICAgRW1wdHkoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU19hc3NlcnQobk5ld0xlbmd0aCA8PSBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCk7Ci0gICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5OZXdMZW5ndGg7Ci0gICAgbV9wRGF0YS0+bV9TdHJpbmdbbk5ld0xlbmd0aF0gPSAwOwotfQotY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgRlhfV0NIQVIqIGxwc3opCi17Ci0gICAgaWYgKGxwc3ogPT0gTlVMTCB8fCBscHN6WzBdID09IDApIHsKLSAgICAgICAgRW1wdHkoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBc3NpZ25Db3B5KEZYU1lTX3djc2xlbihscHN6KSwgbHBzeik7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLX0KLWNvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyaW5nU3JjKQotewotICAgIGlmIChzdHJpbmdTcmMuSXNFbXB0eSgpKSB7Ci0gICAgICAgIEVtcHR5KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQXNzaWduQ29weShzdHJpbmdTcmMuR2V0TGVuZ3RoKCksIHN0cmluZ1NyYy5HZXRQdHIoKSk7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLX0KLWNvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmdTcmMpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gc3RyaW5nU3JjLm1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBpZiAoc3RyaW5nU3JjLklzRW1wdHkoKSkgewotICAgICAgICBFbXB0eSgpOwotICAgIH0gZWxzZSBpZiAoKG1fcERhdGEgJiYgbV9wRGF0YS0+bV9uUmVmcyA8IDApIHx8Ci0gICAgICAgICAgICAgICAoc3RyaW5nU3JjLm1fcERhdGEgJiYgc3RyaW5nU3JjLm1fcERhdGEtPm1fblJlZnMgPCAwKSkgewotICAgICAgICBBc3NpZ25Db3B5KHN0cmluZ1NyYy5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBzdHJpbmdTcmMubV9wRGF0YS0+bV9TdHJpbmcpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEVtcHR5KCk7Ci0gICAgICAgIG1fcERhdGEgPSBzdHJpbmdTcmMubV9wRGF0YTsKLSAgICAgICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgICAgIG1fcERhdGEtPlJldGFpbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLX0KLWNvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3IrPShGWF9XQ0hBUiBjaCkKLXsKLSAgICBDb25jYXRJblBsYWNlKDEsICZjaCk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcis9KGNvbnN0IEZYX1dDSEFSKiBscHN6KQotewotICAgIGlmIChscHN6KSB7Ci0gICAgICAgIENvbmNhdEluUGxhY2UoRlhTWVNfd2NzbGVuKGxwc3opLCBscHN6KTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotfQotY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcis9KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpCi17Ci0gICAgaWYgKHN0cmluZy5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBDb25jYXRJblBsYWNlKHN0cmluZy5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBzdHJpbmcubV9wRGF0YS0+bV9TdHJpbmcpOwotICAgIHJldHVybiAqdGhpczsKLX0KLWNvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3IrPShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cmluZykKLXsKLSAgICBpZiAoc3RyaW5nLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIENvbmNhdEluUGxhY2Uoc3RyaW5nLkdldExlbmd0aCgpLCBzdHJpbmcuR2V0UHRyKCkpOwotICAgIHJldHVybiAqdGhpczsKLX0KLWJvb2wgQ0ZYX1dpZGVTdHJpbmc6OkVxdWFsKGNvbnN0IHdjaGFyX3QqIHB0cikgY29uc3QKLXsKLSAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuICFwdHIgfHwgcHRyWzBdID09IEwnXDAnOwotICAgIH0KLSAgICBpZiAoIXB0cikgewotICAgICAgICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9PSAwOwotICAgIH0KLSAgICByZXR1cm4gd2NzbGVuKHB0cikgPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAmJgotICAgICAgICAgICAgd21lbWNtcChwdHIsIG1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSA9PSAwOwotfQotYm9vbCBDRlhfV2lkZVN0cmluZzo6RXF1YWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gc3RyLklzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0ci5HZXRMZW5ndGgoKSA9PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICYmCi0gICAgICAgIHdtZW1jbXAoc3RyLkdldFB0cigpLCBtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgPT0gMDsKLX0KLWJvb2wgQ0ZYX1dpZGVTdHJpbmc6OkVxdWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvdGhlcikgY29uc3QKLXsKLSAgICBpZiAoSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBvdGhlci5Jc0VtcHR5KCk7Ci0gICAgfQotICAgIGlmIChvdGhlci5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gb3RoZXIubV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICYmCi0gICAgICAgIHdtZW1jbXAob3RoZXIubV9wRGF0YS0+bV9TdHJpbmcsCi0gICAgICAgICAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmcsCi0gICAgICAgICAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgPT0gMDsKLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkVtcHR5KCkKLXsKLSAgICBpZiAobV9wRGF0YSkgewotICAgICAgICBtX3BEYXRhLT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgIH0KLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkNvbmNhdEluUGxhY2UoRlhfU1RSU0laRSBuU3JjTGVuLCBjb25zdCBGWF9XQ0hBUiogbHBzelNyY0RhdGEpCi17Ci0gICAgaWYgKG5TcmNMZW4gPT0gMCB8fCBscHN6U3JjRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5TcmNMZW4pOwotICAgICAgICBpZiAobV9wRGF0YSkgewotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBscHN6U3JjRGF0YSwgblNyY0xlbiAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fcERhdGEtPm1fblJlZnMgPiAxIHx8IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKyBuU3JjTGVuID4gbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGgpIHsKLSAgICAgICAgQ29uY2F0Q29weShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBtX3BEYXRhLT5tX1N0cmluZywgblNyY0xlbiwgbHBzelNyY0RhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIGxwc3pTcmNEYXRhLCBuU3JjTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKz0gblNyY0xlbjsKLSAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmdbbV9wRGF0YS0+bV9uRGF0YUxlbmd0aF0gPSAwOwotICAgIH0KLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkNvbmNhdENvcHkoRlhfU1RSU0laRSBuU3JjMUxlbiwgY29uc3QgRlhfV0NIQVIqIGxwc3pTcmMxRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuU3JjMkxlbiwgY29uc3QgRlhfV0NIQVIqIGxwc3pTcmMyRGF0YSkKLXsKLSAgICBGWF9TVFJTSVpFIG5OZXdMZW4gPSBuU3JjMUxlbiArIG5TcmMyTGVuOwotICAgIGlmIChuTmV3TGVuIDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBEb24ndCByZWxlYXNlIHVudGlsIGRvbmUgY29weWluZywgbWlnaHQgYmUgb25lIG9mIHRoZSBhcmd1bWVudHMuCi0gICAgU3RyaW5nRGF0YSogcE9sZERhdGEgPSBtX3BEYXRhOwotICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbik7Ci0gICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgd21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgbHBzelNyYzFEYXRhLCBuU3JjMUxlbik7Ci0gICAgICAgIHdtZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcgKyBuU3JjMUxlbiwgbHBzelNyYzJEYXRhLCBuU3JjMkxlbik7Ci0gICAgfQotICAgIHBPbGREYXRhLT5SZWxlYXNlKCk7Ci19Ci12b2lkIENGWF9XaWRlU3RyaW5nOjpDb3B5QmVmb3JlV3JpdGUoKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwgfHwgbV9wRGF0YS0+bV9uUmVmcyA8PSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgU3RyaW5nRGF0YSogcERhdGEgPSBtX3BEYXRhOwotICAgIG1fcERhdGEtPlJlbGVhc2UoKTsKLSAgICBGWF9TVFJTSVpFIG5EYXRhTGVuZ3RoID0gcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuRGF0YUxlbmd0aCk7Ci0gICAgaWYgKG1fcERhdGEgIT0gTlVMTCkgewotICAgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIHBEYXRhLT5tX1N0cmluZywgKG5EYXRhTGVuZ3RoICsgMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgICB9Ci19Ci12b2lkIENGWF9XaWRlU3RyaW5nOjpBbGxvY0JlZm9yZVdyaXRlKEZYX1NUUlNJWkUgbkxlbikKLXsKLSAgICBpZiAobV9wRGF0YSAmJiBtX3BEYXRhLT5tX25SZWZzIDw9IDEgJiYgbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPj0gbkxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEVtcHR5KCk7CisgIGlmIChuTGVuIDwgMCkgeworICAgIG5MZW4gPSBscHN6ID8gRlhTWVNfd2NzbGVuKGxwc3opIDogMDsKKyAgfQorICBpZiAobkxlbikgewogICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobkxlbik7CisgICAgaWYgKG1fcERhdGEpIHsKKyAgICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgbHBzeiwgbkxlbiAqIHNpemVvZihGWF9XQ0hBUikpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX3BEYXRhID0gTlVMTDsKKyAgfQogfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6QXNzaWduQ29weShGWF9TVFJTSVpFIG5TcmNMZW4sIGNvbnN0IEZYX1dDSEFSKiBscHN6U3JjRGF0YSkKLXsKLSAgICBBbGxvY0JlZm9yZVdyaXRlKG5TcmNMZW4pOwotICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgbHBzelNyY0RhdGEsIG5TcmNMZW4gKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gblNyY0xlbjsKLSAgICBtX3BEYXRhLT5tX1N0cmluZ1tuU3JjTGVuXSA9IDA7CitDRlhfV2lkZVN0cmluZzo6Q0ZYX1dpZGVTdHJpbmcoRlhfV0NIQVIgY2gpIHsKKyAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZSgxKTsKKyAgaWYgKG1fcERhdGEpIHsKKyAgICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IGNoOworICB9CiB9Ci1pbnQgQ0ZYX1dpZGVTdHJpbmc6OkNvbXBhcmUoY29uc3QgRlhfV0NIQVIqIGxwc3opIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gKGxwc3ogPT0gTlVMTCB8fCBscHN6WzBdID09IDApID8gMCA6IC0xOwotICAgIH0KLSAgICByZXR1cm4gRlhTWVNfd2NzY21wKG1fcERhdGEtPm1fU3RyaW5nLCBscHN6KTsKK0NGWF9XaWRlU3RyaW5nOjpDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgeworICBpZiAoc3RyLklzRW1wdHkoKSkgeworICAgIG1fcERhdGEgPSBOVUxMOworICAgIHJldHVybjsKKyAgfQorICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKHN0ci5HZXRMZW5ndGgoKSk7CisgIGlmIChtX3BEYXRhKSB7CisgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBzdHIuR2V0UHRyKCksCisgICAgICAgICAgICAgICAgIHN0ci5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpOworICB9CiB9Ci1DRlhfQnl0ZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6VVRGOEVuY29kZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEZYX1VURjhFbmNvZGUoKnRoaXMpOworQ0ZYX1dpZGVTdHJpbmc6OkNGWF9XaWRlU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjIpIHsKKyAgbV9wRGF0YSA9IE5VTEw7CisgIGludCBuTmV3TGVuID0gc3RyMS5HZXRMZW5ndGgoKSArIHN0cjIuR2V0TGVuZ3RoKCk7CisgIGlmIChuTmV3TGVuID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuKTsKKyAgaWYgKG1fcERhdGEpIHsKKyAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIHN0cjEuR2V0UHRyKCksCisgICAgICAgICAgICAgICAgIHN0cjEuR2V0TGVuZ3RoKCkgKiBzaXplb2YoRlhfV0NIQVIpKTsKKyAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcgKyBzdHIxLkdldExlbmd0aCgpLCBzdHIyLkdldFB0cigpLAorICAgICAgICAgICAgICAgICBzdHIyLkdldExlbmd0aCgpICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgIH0KIH0KLUNGWF9CeXRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpVVEYxNkxFX0VuY29kZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoRlhfQlNUUkMoIlwwXDAiKSk7Ci0gICAgfQotICAgIGludCBsZW4gPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsKLSAgICBGWF9DSEFSKiBidWZmZXIgPSByZXN1bHQuR2V0QnVmZmVyKGxlbiAqIDIgKyAyKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSArKykgewotICAgICAgICBidWZmZXJbaSAqIDJdID0gbV9wRGF0YS0+bV9TdHJpbmdbaV0gJiAweGZmOwotICAgICAgICBidWZmZXJbaSAqIDIgKyAxXSA9IG1fcERhdGEtPm1fU3RyaW5nW2ldID4+IDg7Ci0gICAgfQotICAgIGJ1ZmZlcltsZW4gKiAyXSA9IDA7Ci0gICAgYnVmZmVyW2xlbiAqIDIgKyAxXSA9IDA7Ci0gICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIobGVuICogMiArIDIpOwotICAgIHJldHVybiByZXN1bHQ7Cit2b2lkIENGWF9XaWRlU3RyaW5nOjpSZWxlYXNlQnVmZmVyKEZYX1NUUlNJWkUgbk5ld0xlbmd0aCkgeworICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBpZiAobk5ld0xlbmd0aCA9PSAtMSkgeworICAgIG5OZXdMZW5ndGggPSBtX3BEYXRhID8gRlhTWVNfd2NzbGVuKG1fcERhdGEtPm1fU3RyaW5nKSA6IDA7CisgIH0KKyAgaWYgKG5OZXdMZW5ndGggPT0gMCkgeworICAgIEVtcHR5KCk7CisgICAgcmV0dXJuOworICB9CisgIEZYU1lTX2Fzc2VydChuTmV3TGVuZ3RoIDw9IG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoKTsKKyAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5OZXdMZW5ndGg7CisgIG1fcERhdGEtPm1fU3RyaW5nW25OZXdMZW5ndGhdID0gMDsKIH0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkNvbnZlcnRGcm9tKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsIENGWF9DaGFyTWFwKiBwQ2hhck1hcCkKLXsKLSAgICBpZiAocENoYXJNYXAgPT0gTlVMTCkgewotICAgICAgICBwQ2hhck1hcCA9IENGWF9DaGFyTWFwOjpHZXREZWZhdWx0TWFwcGVyKCk7Ci0gICAgfQotICAgICp0aGlzID0gcENoYXJNYXAtPm1fR2V0V2lkZVN0cmluZyhwQ2hhck1hcCwgc3RyKTsKK2NvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IEZYX1dDSEFSKiBscHN6KSB7CisgIGlmIChscHN6ID09IE5VTEwgfHwgbHBzelswXSA9PSAwKSB7CisgICAgRW1wdHkoKTsKKyAgfSBlbHNlIHsKKyAgICBBc3NpZ25Db3B5KEZYU1lTX3djc2xlbihscHN6KSwgbHBzeik7CisgIH0KKyAgcmV0dXJuICp0aGlzOwogfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6UmVzZXJ2ZShGWF9TVFJTSVpFIGxlbikKLXsKLSAgICBHZXRCdWZmZXIobGVuKTsKLSAgICBSZWxlYXNlQnVmZmVyKEdldExlbmd0aCgpKTsKK2NvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3I9KAorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyaW5nU3JjKSB7CisgIGlmIChzdHJpbmdTcmMuSXNFbXB0eSgpKSB7CisgICAgRW1wdHkoKTsKKyAgfSBlbHNlIHsKKyAgICBBc3NpZ25Db3B5KHN0cmluZ1NyYy5HZXRMZW5ndGgoKSwgc3RyaW5nU3JjLkdldFB0cigpKTsKKyAgfQorICByZXR1cm4gKnRoaXM7CiB9Ci1GWF9XQ0hBUiogQ0ZYX1dpZGVTdHJpbmc6OkdldEJ1ZmZlcihGWF9TVFJTSVpFIG5NaW5CdWZMZW5ndGgpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCAmJiBuTWluQnVmTGVuZ3RoID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Citjb25zdCBDRlhfV2lkZVN0cmluZyYgQ0ZYX1dpZGVTdHJpbmc6Om9wZXJhdG9yPSgKKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nU3JjKSB7CisgIGlmIChtX3BEYXRhID09IHN0cmluZ1NyYy5tX3BEYXRhKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlmIChzdHJpbmdTcmMuSXNFbXB0eSgpKSB7CisgICAgRW1wdHkoKTsKKyAgfSBlbHNlIGlmICgobV9wRGF0YSAmJiBtX3BEYXRhLT5tX25SZWZzIDwgMCkgfHwKKyAgICAgICAgICAgICAoc3RyaW5nU3JjLm1fcERhdGEgJiYgc3RyaW5nU3JjLm1fcERhdGEtPm1fblJlZnMgPCAwKSkgeworICAgIEFzc2lnbkNvcHkoc3RyaW5nU3JjLm1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHN0cmluZ1NyYy5tX3BEYXRhLT5tX1N0cmluZyk7CisgIH0gZWxzZSB7CisgICAgRW1wdHkoKTsKKyAgICBtX3BEYXRhID0gc3RyaW5nU3JjLm1fcERhdGE7CisgICAgaWYgKG1fcERhdGEpIHsKKyAgICAgIG1fcERhdGEtPlJldGFpbigpOwogICAgIH0KLSAgICBpZiAobV9wRGF0YSAmJiBtX3BEYXRhLT5tX25SZWZzIDw9IDEgJiYgbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPj0gbk1pbkJ1Zkxlbmd0aCkgewotICAgICAgICByZXR1cm4gbV9wRGF0YS0+bV9TdHJpbmc7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcis9KEZYX1dDSEFSIGNoKSB7CisgIENvbmNhdEluUGxhY2UoMSwgJmNoKTsKKyAgcmV0dXJuICp0aGlzOworfQorY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcis9KGNvbnN0IEZYX1dDSEFSKiBscHN6KSB7CisgIGlmIChscHN6KSB7CisgICAgQ29uY2F0SW5QbGFjZShGWFNZU193Y3NsZW4obHBzeiksIGxwc3opOworICB9CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3IrPShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKSB7CisgIGlmIChzdHJpbmcubV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIENvbmNhdEluUGxhY2Uoc3RyaW5nLm1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHN0cmluZy5tX3BEYXRhLT5tX1N0cmluZyk7CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3IrPSgKKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cmluZykgeworICBpZiAoc3RyaW5nLklzRW1wdHkoKSkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBDb25jYXRJblBsYWNlKHN0cmluZy5HZXRMZW5ndGgoKSwgc3RyaW5nLkdldFB0cigpKTsKKyAgcmV0dXJuICp0aGlzOworfQorYm9vbCBDRlhfV2lkZVN0cmluZzo6RXF1YWwoY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiAhcHRyIHx8IHB0clswXSA9PSBMJ1wwJzsKKyAgfQorICBpZiAoIXB0cikgeworICAgIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID09IDA7CisgIH0KKyAgcmV0dXJuIHdjc2xlbihwdHIpID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggJiYKKyAgICAgICAgIHdtZW1jbXAocHRyLCBtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgPT0gMDsKK30KK2Jvb2wgQ0ZYX1dpZGVTdHJpbmc6OkVxdWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSBjb25zdCB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gc3RyLklzRW1wdHkoKTsKKyAgfQorICByZXR1cm4gc3RyLkdldExlbmd0aCgpID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggJiYKKyAgICAgICAgIHdtZW1jbXAoc3RyLkdldFB0cigpLCBtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgPT0gMDsKK30KK2Jvb2wgQ0ZYX1dpZGVTdHJpbmc6OkVxdWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvdGhlcikgY29uc3QgeworICBpZiAoSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIG90aGVyLklzRW1wdHkoKTsKKyAgfQorICBpZiAob3RoZXIuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBvdGhlci5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggJiYKKyAgICAgICAgIHdtZW1jbXAob3RoZXIubV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fU3RyaW5nLAorICAgICAgICAgICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSA9PSAwOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6RW1wdHkoKSB7CisgIGlmIChtX3BEYXRhKSB7CisgICAgbV9wRGF0YS0+UmVsZWFzZSgpOworICAgIG1fcERhdGEgPSBOVUxMOworICB9Cit9Cit2b2lkIENGWF9XaWRlU3RyaW5nOjpDb25jYXRJblBsYWNlKEZYX1NUUlNJWkUgblNyY0xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwc3pTcmNEYXRhKSB7CisgIGlmIChuU3JjTGVuID09IDAgfHwgbHBzelNyY0RhdGEgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CisgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuU3JjTGVuKTsKKyAgICBpZiAobV9wRGF0YSkgeworICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBscHN6U3JjRGF0YSwgblNyY0xlbiAqIHNpemVvZihGWF9XQ0hBUikpOwogICAgIH0KLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk1pbkJ1Zkxlbmd0aCk7Ci0gICAgICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IDA7Ci0gICAgICAgIG1fcERhdGEtPm1fU3RyaW5nWzBdID0gMDsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOwotICAgIH0KLSAgICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7Ci0gICAgRlhfU1RSU0laRSBuT2xkTGVuID0gcE9sZERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgaWYgKG5NaW5CdWZMZW5ndGggPCBuT2xkTGVuKSB7Ci0gICAgICAgIG5NaW5CdWZMZW5ndGggPSBuT2xkTGVuOwotICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcERhdGEtPm1fblJlZnMgPiAxIHx8CisgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICsgblNyY0xlbiA+IG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoKSB7CisgICAgQ29uY2F0Q29weShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBtX3BEYXRhLT5tX1N0cmluZywgblNyY0xlbiwgbHBzelNyY0RhdGEpOworICB9IGVsc2UgeworICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIGxwc3pTcmNEYXRhLAorICAgICAgICAgICAgICAgICBuU3JjTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCArPSBuU3JjTGVuOworICAgIG1fcERhdGEtPm1fU3RyaW5nW21fcERhdGEtPm1fbkRhdGFMZW5ndGhdID0gMDsKKyAgfQorfQordm9pZCBDRlhfV2lkZVN0cmluZzo6Q29uY2F0Q29weShGWF9TVFJTSVpFIG5TcmMxTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBzelNyYzFEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5TcmMyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBzelNyYzJEYXRhKSB7CisgIEZYX1NUUlNJWkUgbk5ld0xlbiA9IG5TcmMxTGVuICsgblNyYzJMZW47CisgIGlmIChuTmV3TGVuIDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gRG9uJ3QgcmVsZWFzZSB1bnRpbCBkb25lIGNvcHlpbmcsIG1pZ2h0IGJlIG9uZSBvZiB0aGUgYXJndW1lbnRzLgorICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7CisgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbik7CisgIGlmIChtX3BEYXRhKSB7CisgICAgd21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgbHBzelNyYzFEYXRhLCBuU3JjMUxlbik7CisgICAgd21lbWNweShtX3BEYXRhLT5tX1N0cmluZyArIG5TcmMxTGVuLCBscHN6U3JjMkRhdGEsIG5TcmMyTGVuKTsKKyAgfQorICBwT2xkRGF0YS0+UmVsZWFzZSgpOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6Q29weUJlZm9yZVdyaXRlKCkgeworICBpZiAobV9wRGF0YSA9PSBOVUxMIHx8IG1fcERhdGEtPm1fblJlZnMgPD0gMSkgeworICAgIHJldHVybjsKKyAgfQorICBTdHJpbmdEYXRhKiBwRGF0YSA9IG1fcERhdGE7CisgIG1fcERhdGEtPlJlbGVhc2UoKTsKKyAgRlhfU1RSU0laRSBuRGF0YUxlbmd0aCA9IHBEYXRhLT5tX25EYXRhTGVuZ3RoOworICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5EYXRhTGVuZ3RoKTsKKyAgaWYgKG1fcERhdGEgIT0gTlVMTCkgeworICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgcERhdGEtPm1fU3RyaW5nLAorICAgICAgICAgICAgICAgICAobkRhdGFMZW5ndGggKyAxKSAqIHNpemVvZihGWF9XQ0hBUikpOworICB9Cit9Cit2b2lkIENGWF9XaWRlU3RyaW5nOjpBbGxvY0JlZm9yZVdyaXRlKEZYX1NUUlNJWkUgbkxlbikgeworICBpZiAobV9wRGF0YSAmJiBtX3BEYXRhLT5tX25SZWZzIDw9IDEgJiYgbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPj0gbkxlbikgeworICAgIHJldHVybjsKKyAgfQorICBFbXB0eSgpOworICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5MZW4pOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6QXNzaWduQ29weShGWF9TVFJTSVpFIG5TcmNMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscHN6U3JjRGF0YSkgeworICBBbGxvY0JlZm9yZVdyaXRlKG5TcmNMZW4pOworICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3pTcmNEYXRhLCBuU3JjTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuU3JjTGVuOworICBtX3BEYXRhLT5tX1N0cmluZ1tuU3JjTGVuXSA9IDA7Cit9CitpbnQgQ0ZYX1dpZGVTdHJpbmc6OkNvbXBhcmUoY29uc3QgRlhfV0NIQVIqIGxwc3opIGNvbnN0IHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiAobHBzeiA9PSBOVUxMIHx8IGxwc3pbMF0gPT0gMCkgPyAwIDogLTE7CisgIH0KKyAgcmV0dXJuIEZYU1lTX3djc2NtcChtX3BEYXRhLT5tX1N0cmluZywgbHBzeik7Cit9CitDRlhfQnl0ZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6VVRGOEVuY29kZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEZYX1VURjhFbmNvZGUoKnRoaXMpOworfQorQ0ZYX0J5dGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OlVURjE2TEVfRW5jb2RlKCkgY29uc3QgeworICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKEZYX0JTVFJDKCJcMFwwIikpOworICB9CisgIGludCBsZW4gPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7CisgIEZYX0NIQVIqIGJ1ZmZlciA9IHJlc3VsdC5HZXRCdWZmZXIobGVuICogMiArIDIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgYnVmZmVyW2kgKiAyXSA9IG1fcERhdGEtPm1fU3RyaW5nW2ldICYgMHhmZjsKKyAgICBidWZmZXJbaSAqIDIgKyAxXSA9IG1fcERhdGEtPm1fU3RyaW5nW2ldID4+IDg7CisgIH0KKyAgYnVmZmVyW2xlbiAqIDJdID0gMDsKKyAgYnVmZmVyW2xlbiAqIDIgKyAxXSA9IDA7CisgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKGxlbiAqIDIgKyAyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkNvbnZlcnRGcm9tKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ2hhck1hcCogcENoYXJNYXApIHsKKyAgaWYgKHBDaGFyTWFwID09IE5VTEwpIHsKKyAgICBwQ2hhck1hcCA9IENGWF9DaGFyTWFwOjpHZXREZWZhdWx0TWFwcGVyKCk7CisgIH0KKyAgKnRoaXMgPSBwQ2hhck1hcC0+bV9HZXRXaWRlU3RyaW5nKHBDaGFyTWFwLCBzdHIpOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6UmVzZXJ2ZShGWF9TVFJTSVpFIGxlbikgeworICBHZXRCdWZmZXIobGVuKTsKKyAgUmVsZWFzZUJ1ZmZlcihHZXRMZW5ndGgoKSk7Cit9CitGWF9XQ0hBUiogQ0ZYX1dpZGVTdHJpbmc6OkdldEJ1ZmZlcihGWF9TVFJTSVpFIG5NaW5CdWZMZW5ndGgpIHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCAmJiBuTWluQnVmTGVuZ3RoID09IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAobV9wRGF0YSAmJiBtX3BEYXRhLT5tX25SZWZzIDw9IDEgJiYKKyAgICAgIG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoID49IG5NaW5CdWZMZW5ndGgpIHsKKyAgICByZXR1cm4gbV9wRGF0YS0+bV9TdHJpbmc7CisgIH0KKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewogICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk1pbkJ1Zkxlbmd0aCk7CiAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgcE9sZERhdGEtPm1fU3RyaW5nLCAobk9sZExlbiArIDEpKnNpemVvZihGWF9XQ0hBUikpOwotICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuT2xkTGVuOwotICAgIHBPbGREYXRhLT5SZWxlYXNlKCk7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IDA7CisgICAgbV9wRGF0YS0+bV9TdHJpbmdbMF0gPSAwOwogICAgIHJldHVybiBtX3BEYXRhLT5tX1N0cmluZzsKLX0KLUNGWF9XaWRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoY29uc3QgY2hhciogc3RyLCBGWF9TVFJTSVpFIGxlbikKLXsKLSAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgcmVzdWx0LkNvbnZlcnRGcm9tKENGWF9CeXRlU3RyaW5nKHN0ciwgbGVuKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLUNGWF9XaWRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChjb25zdCBjaGFyKiBzdHIsIEZYX1NUUlNJWkUgbGVuKQotewotICAgIGlmICghc3RyIHx8IDAgPT0gbGVuKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLQotICAgIENGWF9VVEY4RGVjb2RlciBkZWNvZGVyOwotICAgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IGxlbjsgaSArKykgewotICAgICAgICBkZWNvZGVyLklucHV0KHN0cltpXSk7Ci0gICAgfQotICAgIHJldHVybiBkZWNvZGVyLkdldFJlc3VsdCgpOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGNvbnN0IHVuc2lnbmVkIHNob3J0KiB3c3RyLCBGWF9TVFJTSVpFIHdsZW4pCi17Ci0gICAgaWYgKCF3c3RyIHx8IDAgPT0gd2xlbikgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgRlhfV0NIQVIqIGJ1ZiA9IHJlc3VsdC5HZXRCdWZmZXIod2xlbik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3bGVuOyBpICsrKSB7Ci0gICAgICAgIGJ1ZltpXSA9IHdzdHJbaV07Ci0gICAgfQotICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKHdsZW4pOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci1GWF9TVFJTSVpFIENGWF9XaWRlU3RyaW5nOjpXU3RyaW5nTGVuZ3RoKGNvbnN0IHVuc2lnbmVkIHNob3J0KiBzdHIpCi17Ci0gICAgRlhfU1RSU0laRSBsZW4gPSAwOwotICAgIGlmIChzdHIpCi0gICAgICAgIHdoaWxlIChzdHJbbGVuXSkgbGVuKys7Ci0gICAgcmV0dXJuIGxlbjsKLX0KLQotCi0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkFsbG9jQ29weShDRlhfV2lkZVN0cmluZyYgZGVzdCwgRlhfU1RSU0laRSBuQ29weUxlbiwgRlhfU1RSU0laRSBuQ29weUluZGV4KSBjb25zdAotewotICAgIC8vIHxGWF9TVFJTSVpFfCBpcyBjdXJyZW50bHkgdHlwZWRlZidkIGFzIGluIHxpbnR8LiBUT0RPKHBhbG1lcik6IEl0Ci0gICAgLy8gc2hvdWxkIGJlIGEgfHNpemVfdHwsIG9yIGF0IGxlYXN0IHVuc2lnbmVkLgotICAgIGlmIChuQ29weUxlbiA9PSAwIHx8IG5Db3B5TGVuIDwgMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8RlhfU1RSU0laRT4gaVNpemUgPSBzdGF0aWNfY2FzdDxGWF9TVFJTSVpFPihzaXplb2YoRlhfV0NIQVIpKTsKLSAgICBpU2l6ZSAqPSBuQ29weUxlbjsKLSAgICBBU1NFUlQoZGVzdC5tX3BEYXRhID09IE5VTEwpOwotICAgIGRlc3QubV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuQ29weUxlbik7Ci0gICAgaWYgKGRlc3QubV9wRGF0YSkgewotICAgICAgICBGWFNZU19tZW1jcHkoZGVzdC5tX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9TdHJpbmcgKyBuQ29weUluZGV4LCBpU2l6ZS5WYWx1ZU9yRGllKCkpOwotICAgIH0KLX0KLUNGWF9XaWRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpMZWZ0KEZYX1NUUlNJWkUgbkNvdW50KSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIGlmIChuQ291bnQgPCAwKSB7Ci0gICAgICAgIG5Db3VudCA9IDA7Ci0gICAgfQotICAgIGlmIChuQ291bnQgPj0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgewotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIGRlc3Q7Ci0gICAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgMCk7Ci0gICAgcmV0dXJuIGRlc3Q7Ci19Ci1DRlhfV2lkZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6TWlkKEZYX1NUUlNJWkUgbkZpcnN0KSBjb25zdAotewotICAgIHJldHVybiBNaWQobkZpcnN0LCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gbkZpcnN0KTsKLX0KLUNGWF9XaWRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpNaWQoRlhfU1RSU0laRSBuRmlyc3QsIEZYX1NUUlNJWkUgbkNvdW50KSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIGlmIChuRmlyc3QgPCAwKSB7Ci0gICAgICAgIG5GaXJzdCA9IDA7Ci0gICAgfQotICAgIGlmIChuQ291bnQgPCAwKSB7Ci0gICAgICAgIG5Db3VudCA9IDA7Ci0gICAgfQotICAgIGlmIChuRmlyc3QgKyBuQ291bnQgPiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7Ci0gICAgICAgIG5Db3VudCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuRmlyc3Q7Ci0gICAgfQotICAgIGlmIChuRmlyc3QgPiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7Ci0gICAgICAgIG5Db3VudCA9IDA7Ci0gICAgfQotICAgIGlmIChuRmlyc3QgPT0gMCAmJiBuRmlyc3QgKyBuQ291bnQgPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgewotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIGRlc3Q7Ci0gICAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgbkZpcnN0KTsKLSAgICByZXR1cm4gZGVzdDsKLX0KLUNGWF9XaWRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpSaWdodChGWF9TVFJTSVpFIG5Db3VudCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSAgICBpZiAobkNvdW50IDwgMCkgewotICAgICAgICBuQ291bnQgPSAwOwotICAgIH0KLSAgICBpZiAobkNvdW50ID49IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBkZXN0OwotICAgIEFsbG9jQ29weShkZXN0LCBuQ291bnQsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuQ291bnQpOwotICAgIHJldHVybiBkZXN0OwotfQotaW50IENGWF9XaWRlU3RyaW5nOjpDb21wYXJlTm9DYXNlKGNvbnN0IEZYX1dDSEFSKiBscHN6KSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChscHN6ID09IE5VTEwgfHwgbHBzelswXSA9PSAwKSA/IDAgOiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYU1lTX3djc2ljbXAobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3opOwotfQotaW50IENGWF9XaWRlU3RyaW5nOjpDb21wYXJlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBpZiAoc3RyLm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoc3RyLm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaW50IHRoaXNfbGVuID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgICBpbnQgdGhhdF9sZW4gPSBzdHIubV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgICBpbnQgbWluX2xlbiA9IHRoaXNfbGVuIDwgdGhhdF9sZW4gPyB0aGlzX2xlbiA6IHRoYXRfbGVuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWluX2xlbjsgaSArKykgewotICAgICAgICBpZiAobV9wRGF0YS0+bV9TdHJpbmdbaV0gPCBzdHIubV9wRGF0YS0+bV9TdHJpbmdbaV0pIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wRGF0YS0+bV9TdHJpbmdbaV0gPiBzdHIubV9wRGF0YS0+bV9TdHJpbmdbaV0pIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh0aGlzX2xlbiA8IHRoYXRfbGVuKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHRoaXNfbGVuID4gdGhhdF9sZW4pIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6U2V0QXQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX1dDSEFSIGNoKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBU1NFUlQobkluZGV4ID49IDApOwotICAgIEFTU0VSVChuSW5kZXggPCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKTsKLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdID0gY2g7Ci19Ci12b2lkIENGWF9XaWRlU3RyaW5nOjpNYWtlTG93ZXIoKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhTWVNfd2NzbHdyKG1fcERhdGEtPm1fU3RyaW5nKTsKLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6Ok1ha2VVcHBlcigpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENvcHlCZWZvcmVXcml0ZSgpOwotICAgIGlmIChHZXRMZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU193Y3N1cHIobV9wRGF0YS0+bV9TdHJpbmcpOwotfQotRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6RmluZChjb25zdCBGWF9XQ0hBUiogbHBzelN1YiwgRlhfU1RSU0laRSBuU3RhcnQpIGNvbnN0Ci17Ci0gICAgRlhfU1RSU0laRSBuTGVuZ3RoID0gR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKG5MZW5ndGggPCAxIHx8IG5TdGFydCA+IG5MZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBjb25zdCBGWF9XQ0hBUiogbHBzeiA9IEZYU1lTX3djc3N0cihtX3BEYXRhLT5tX1N0cmluZyArIG5TdGFydCwgbHBzelN1Yik7Ci0gICAgcmV0dXJuIChscHN6ID09IE5VTEwpID8gLTEgOiAoaW50KShscHN6IC0gbV9wRGF0YS0+bV9TdHJpbmcpOwotfQotRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6RmluZChGWF9XQ0hBUiBjaCwgRlhfU1RSU0laRSBuU3RhcnQpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIEZYX1NUUlNJWkUgbkxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgaWYgKG5TdGFydCA+PSBuTGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgY29uc3QgRlhfV0NIQVIqIGxwc3ogPSBGWFNZU193Y3NjaHIobV9wRGF0YS0+bV9TdHJpbmcgKyBuU3RhcnQsIGNoKTsKLSAgICByZXR1cm4gKGxwc3ogPT0gTlVMTCkgPyAtMSA6IChpbnQpKGxwc3ogLSBtX3BEYXRhLT5tX1N0cmluZyk7Ci19Ci12b2lkIENGWF9XaWRlU3RyaW5nOjpUcmltUmlnaHQoY29uc3QgRlhfV0NIQVIqIGxwc3pUYXJnZXRMaXN0KQotewotICAgIEZYU1lTX2Fzc2VydChscHN6VGFyZ2V0TGlzdCAhPSBOVUxMKTsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMIHx8ICpscHN6VGFyZ2V0TGlzdCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgRlhfU1RSU0laRSBsZW4gPSBHZXRMZW5ndGgoKTsKLSAgICBpZiAobGVuIDwgMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX1NUUlNJWkUgcG9zID0gbGVuOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgaWYgKEZYU1lTX3djc2NocihscHN6VGFyZ2V0TGlzdCwgbV9wRGF0YS0+bV9TdHJpbmdbcG9zIC0gMV0pID09IE5VTEwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBvcyAtLTsKLSAgICB9Ci0gICAgaWYgKHBvcyA8IGxlbikgewotICAgICAgICBtX3BEYXRhLT5tX1N0cmluZ1twb3NdID0gMDsKLSAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IHBvczsKLSAgICB9Ci19Ci12b2lkIENGWF9XaWRlU3RyaW5nOjpUcmltUmlnaHQoRlhfV0NIQVIgY2hUYXJnZXQpCi17Ci0gICAgRlhfV0NIQVIgc3RyWzJdID0ge2NoVGFyZ2V0LCAwfTsKLSAgICBUcmltUmlnaHQoc3RyKTsKLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1SaWdodCgpCi17Ci0gICAgVHJpbVJpZ2h0KEwiXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwIik7Ci19Ci12b2lkIENGWF9XaWRlU3RyaW5nOjpUcmltTGVmdChjb25zdCBGWF9XQ0hBUiogbHBzelRhcmdldHMpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KGxwc3pUYXJnZXRzICE9IE5VTEwpOwotICAgIGlmIChtX3BEYXRhID09IE5VTEwgfHwgKmxwc3pUYXJnZXRzID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY29uc3QgRlhfV0NIQVIqIGxwc3ogPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgICB3aGlsZSAoKmxwc3ogIT0gMCkgewotICAgICAgICBpZiAoRlhTWVNfd2NzY2hyKGxwc3pUYXJnZXRzLCAqbHBzeikgPT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbHBzeiArKzsKLSAgICB9Ci0gICAgaWYgKGxwc3ogIT0gbV9wRGF0YS0+bV9TdHJpbmcpIHsKLSAgICAgICAgaW50IG5EYXRhTGVuZ3RoID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIChGWF9TVFJTSVpFKShscHN6IC0gbV9wRGF0YS0+bV9TdHJpbmcpOwotICAgICAgICBGWFNZU19tZW1tb3ZlKG1fcERhdGEtPm1fU3RyaW5nLCBscHN6LCAobkRhdGFMZW5ndGggKyAxKSpzaXplb2YoRlhfV0NIQVIpKTsKLSAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5EYXRhTGVuZ3RoOwotICAgIH0KLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1MZWZ0KEZYX1dDSEFSIGNoVGFyZ2V0KQotewotICAgIEZYX1dDSEFSIHN0clsyXSA9IHtjaFRhcmdldCwgMH07Ci0gICAgVHJpbUxlZnQoc3RyKTsKLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1MZWZ0KCkKLXsKLSAgICBUcmltTGVmdChMIlx4MDlceDBhXHgwYlx4MGNceDBkXHgyMCIpOwotfQotRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6UmVwbGFjZShjb25zdCBGWF9XQ0hBUiogbHBzek9sZCwgY29uc3QgRlhfV0NIQVIqIGxwc3pOZXcpCi17Ci0gICAgaWYgKEdldExlbmd0aCgpIDwgMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGxwc3pPbGQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBuU291cmNlTGVuID0gRlhTWVNfd2NzbGVuKGxwc3pPbGQpOwotICAgIGlmIChuU291cmNlTGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEZYX1NUUlNJWkUgblJlcGxhY2VtZW50TGVuID0gbHBzek5ldyA/IEZYU1lTX3djc2xlbihscHN6TmV3KSA6IDA7Ci0gICAgRlhfU1RSU0laRSBuQ291bnQgPSAwOwotICAgIEZYX1dDSEFSKiBscHN6U3RhcnQgPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgICBGWF9XQ0hBUiogbHBzekVuZCA9IG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgICBGWF9XQ0hBUiogbHBzelRhcmdldDsKLSAgICB7Ci0gICAgICAgIHdoaWxlICgobHBzelRhcmdldCA9IChGWF9XQ0hBUiopRlhTWVNfd2Nzc3RyKGxwc3pTdGFydCwgbHBzek9sZCkpICE9IE5VTEwgJiYgbHBzelN0YXJ0IDwgbHBzekVuZCkgewotICAgICAgICAgICAgbkNvdW50Kys7Ci0gICAgICAgICAgICBscHN6U3RhcnQgPSBscHN6VGFyZ2V0ICsgblNvdXJjZUxlbjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobkNvdW50ID4gMCkgewotICAgICAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICAgICAgRlhfU1RSU0laRSBuT2xkTGVuZ3RoID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgICAgICAgRlhfU1RSU0laRSBuTmV3TGVuZ3RoID0gIG5PbGRMZW5ndGggKyAoblJlcGxhY2VtZW50TGVuIC0gblNvdXJjZUxlbikgKiBuQ291bnQ7Ci0gICAgICAgIGlmIChtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCA8IG5OZXdMZW5ndGggfHwgbV9wRGF0YS0+bV9uUmVmcyA+IDEpIHsKLSAgICAgICAgICAgIFN0cmluZ0RhdGEqIHBPbGREYXRhID0gbV9wRGF0YTsKLSAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3RyID0gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gICAgICAgICAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5OZXdMZW5ndGgpOwotICAgICAgICAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIHBzdHIsIHBPbGREYXRhLT5tX25EYXRhTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgICAgICAgICBwT2xkRGF0YS0+UmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgICAgIGxwc3pTdGFydCA9IG1fcERhdGEtPm1fU3RyaW5nOwotICAgICAgICBscHN6RW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBGWF9NQVgobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgbk5ld0xlbmd0aCk7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlICgobHBzelRhcmdldCA9IChGWF9XQ0hBUiopRlhTWVNfd2Nzc3RyKGxwc3pTdGFydCwgbHBzek9sZCkpICE9IE5VTEwgJiYgbHBzelN0YXJ0IDwgbHBzekVuZCkgewotICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgbkJhbGFuY2UgPSBuT2xkTGVuZ3RoIC0gKEZYX1NUUlNJWkUpKGxwc3pUYXJnZXQgLSBtX3BEYXRhLT5tX1N0cmluZyArIG5Tb3VyY2VMZW4pOwotICAgICAgICAgICAgICAgIEZYU1lTX21lbW1vdmUobHBzelRhcmdldCArIG5SZXBsYWNlbWVudExlbiwgbHBzelRhcmdldCArIG5Tb3VyY2VMZW4sIG5CYWxhbmNlICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGxwc3pUYXJnZXQsIGxwc3pOZXcsIG5SZXBsYWNlbWVudExlbiAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgICAgICAgICAgICAgIGxwc3pTdGFydCA9IGxwc3pUYXJnZXQgKyBuUmVwbGFjZW1lbnRMZW47Ci0gICAgICAgICAgICAgICAgbHBzelN0YXJ0W25CYWxhbmNlXSA9IDA7Ci0gICAgICAgICAgICAgICAgbk9sZExlbmd0aCArPSAoblJlcGxhY2VtZW50TGVuIC0gblNvdXJjZUxlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUKG1fcERhdGEtPm1fU3RyaW5nW25OZXdMZW5ndGhdID09IDApOwotICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk5ld0xlbmd0aDsKLSAgICB9Ci0gICAgcmV0dXJuIG5Db3VudDsKLX0KLUZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6Okluc2VydChGWF9TVFJTSVpFIG5JbmRleCwgRlhfV0NIQVIgY2gpCi17Ci0gICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgaWYgKG5JbmRleCA8IDApIHsKLSAgICAgICAgbkluZGV4ID0gMDsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBuTmV3TGVuZ3RoID0gR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKG5JbmRleCA+IG5OZXdMZW5ndGgpIHsKLSAgICAgICAgbkluZGV4ID0gbk5ld0xlbmd0aDsKLSAgICB9Ci0gICAgbk5ld0xlbmd0aCsrOwotICAgIGlmIChtX3BEYXRhID09IE5VTEwgfHwgbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPCBuTmV3TGVuZ3RoKSB7Ci0gICAgICAgIFN0cmluZ0RhdGEqIHBPbGREYXRhID0gbV9wRGF0YTsKLSAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzdHIgPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgICAgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuZ3RoKTsKLSAgICAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZihwT2xkRGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1tb3ZlKG1fcERhdGEtPm1fU3RyaW5nLCBwc3RyLCAocE9sZERhdGEtPm1fbkRhdGFMZW5ndGggKyAxKSpzaXplb2YoRlhfV0NIQVIpKTsKLSAgICAgICAgICAgIHBPbGREYXRhLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZyArIG5JbmRleCArIDEsCi0gICAgICAgICAgICAgICAgICAgIG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4LCAobk5ld0xlbmd0aCAtIG5JbmRleCkqc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA9IGNoOwotICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuTmV3TGVuZ3RoOwotICAgIHJldHVybiBuTmV3TGVuZ3RoOwotfQotRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6RGVsZXRlKEZYX1NUUlNJWkUgbkluZGV4LCBGWF9TVFJTSVpFIG5Db3VudCkKLXsKLSAgICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobkluZGV4IDwgMCkgewotICAgICAgICBuSW5kZXggPSAwOwotICAgIH0KLSAgICBGWF9TVFJTSVpFIG5PbGRMZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIGlmIChuQ291bnQgPiAwICYmIG5JbmRleCA8IG5PbGRMZW5ndGgpIHsKLSAgICAgICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgICAgIGludCBuQnl0ZXNUb0NvcHkgPSBuT2xkTGVuZ3RoIC0gKG5JbmRleCArIG5Db3VudCkgKyAxOwotICAgICAgICBGWFNZU19tZW1tb3ZlKG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmcgKyBuSW5kZXggKyBuQ291bnQsIG5CeXRlc1RvQ29weSAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk9sZExlbmd0aCAtIG5Db3VudDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci19Ci1GWF9TVFJTSVpFIENGWF9XaWRlU3RyaW5nOjpSZW1vdmUoRlhfV0NIQVIgY2hSZW1vdmUpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgaWYgKEdldExlbmd0aCgpIDwgMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfV0NIQVIqIHBzdHJTb3VyY2UgPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgICBGWF9XQ0hBUiogcHN0ckRlc3QgPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgICBGWF9XQ0hBUiogcHN0ckVuZCA9IG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgICB3aGlsZSAocHN0clNvdXJjZSA8IHBzdHJFbmQpIHsKLSAgICAgICAgaWYgKCpwc3RyU291cmNlICE9IGNoUmVtb3ZlKSB7Ci0gICAgICAgICAgICAqcHN0ckRlc3QgPSAqcHN0clNvdXJjZTsKLSAgICAgICAgICAgIHBzdHJEZXN0ICsrOwotICAgICAgICB9Ci0gICAgICAgIHBzdHJTb3VyY2UgKys7Ci0gICAgfQotICAgICpwc3RyRGVzdCA9IDA7Ci0gICAgRlhfU1RSU0laRSBuQ291bnQgPSAoRlhfU1RSU0laRSkocHN0clNvdXJjZSAtIHBzdHJEZXN0KTsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC09IG5Db3VudDsKLSAgICByZXR1cm4gbkNvdW50OwotfQotI2RlZmluZSBGT1JDRV9BTlNJICAgICAgMHgxMDAwMAotI2RlZmluZSBGT1JDRV9VTklDT0RFICAgMHgyMDAwMAotI2RlZmluZSBGT1JDRV9JTlQ2NCAgICAgMHg0MDAwMAotdm9pZCBDRlhfV2lkZVN0cmluZzo6Rm9ybWF0Vihjb25zdCBGWF9XQ0hBUiogbHBzekZvcm1hdCwgdmFfbGlzdCBhcmdMaXN0KQotewotICAgIHZhX2xpc3QgYXJnTGlzdFNhdmU7Ci0jaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pIHx8ICghZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9GWF9DUFVfID09IF9GWF9YNjRfIHx8IF9GWF9DUFVfID09IF9GWF9JQTY0XyB8fCBfRlhfQ1BVXyA9PSBfRlhfQVJNNjRfKSkgfHwgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKLSAgICB2YV9jb3B5KGFyZ0xpc3RTYXZlLCBhcmdMaXN0KTsKLSNlbHNlCi0gICAgYXJnTGlzdFNhdmUgPSBhcmdMaXN0OwotI2VuZGlmCi0gICAgaW50IG5NYXhMZW4gPSAwOwotICAgIGZvciAoY29uc3QgRlhfV0NIQVIqIGxwc3ogPSBscHN6Rm9ybWF0OyAqbHBzeiAhPSAwOyBscHN6ICsrKSB7Ci0gICAgICAgIGlmICgqbHBzeiAhPSAnJScgfHwgKihscHN6ID0gbHBzeiArIDEpID09ICclJykgewotICAgICAgICAgICAgbk1heExlbiArPSBGWFNZU193Y3NsZW4obHBzeik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbkl0ZW1MZW4gPSAwOwotICAgICAgICBpbnQgbldpZHRoID0gMDsKLSAgICAgICAgZm9yICg7ICpscHN6ICE9IDA7IGxwc3ogKyspIHsKLSAgICAgICAgICAgIGlmICgqbHBzeiA9PSAnIycpIHsKLSAgICAgICAgICAgICAgICBuTWF4TGVuICs9IDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCpscHN6ID09ICcqJykgewotICAgICAgICAgICAgICAgIG5XaWR0aCA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgqbHBzeiA9PSAnLScgfHwgKmxwc3ogPT0gJysnIHx8ICpscHN6ID09ICcwJyB8fAotICAgICAgICAgICAgICAgICAgICAgICAqbHBzeiA9PSAnICcpCi0gICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5XaWR0aCA9PSAwKSB7Ci0gICAgICAgICAgICBuV2lkdGggPSBGWFNZU193dG9pKGxwc3opOwotICAgICAgICAgICAgZm9yICg7ICpscHN6ICE9IDAgJiYgKCpscHN6KSA8PSAnOScgJiYgKCpscHN6KSA+PSAnMCc7IGxwc3ogKyspCi0gICAgICAgICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuV2lkdGggPCAwIHx8IG5XaWR0aCA+IDEyOCAqIDEwMjQpIHsKLSAgICAgICAgICAgIGxwc3pGb3JtYXQgPSBMIkJhZCB3aWR0aCI7Ci0gICAgICAgICAgICBuTWF4TGVuID0gMTA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbnQgblByZWNpc2lvbiA9IDA7Ci0gICAgICAgIGlmICgqbHBzeiA9PSAnLicpIHsKLSAgICAgICAgICAgIGxwc3ogKys7Ci0gICAgICAgICAgICBpZiAoKmxwc3ogPT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgblByZWNpc2lvbiA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGxwc3ogKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5QcmVjaXNpb24gPSBGWFNZU193dG9pKGxwc3opOwotICAgICAgICAgICAgICAgIGZvciAoOyAqbHBzeiAhPSAwICYmICgqbHBzeikgPj0gJzAnICYmICgqbHBzeikgPD0gJzknOyBscHN6ICsrKQotICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5QcmVjaXNpb24gPCAwIHx8IG5QcmVjaXNpb24gPiAxMjggKiAxMDI0KSB7Ci0gICAgICAgICAgICBscHN6Rm9ybWF0ID0gTCJCYWQgcHJlY2lzaW9uIjsKLSAgICAgICAgICAgIG5NYXhMZW4gPSAxNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGludCBuTW9kaWZpZXIgPSAwOwotICAgICAgICBpZiAoKmxwc3ogPT0gTCdJJyAmJiAqKGxwc3ogKyAxKSA9PSBMJzYnICYmICoobHBzeiArIDIpID09IEwnNCcpIHsKLSAgICAgICAgICAgIGxwc3ogKz0gMzsKLSAgICAgICAgICAgIG5Nb2RpZmllciA9IEZPUkNFX0lOVDY0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoICgqbHBzeikgewotICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICBuTW9kaWZpZXIgPSBGT1JDRV9BTlNJOwotICAgICAgICAgICAgICAgICAgICBscHN6ICsrOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICAgICAgbk1vZGlmaWVyID0gRk9SQ0VfVU5JQ09ERTsKLSAgICAgICAgICAgICAgICAgICAgbHBzeiArKzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnTic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgICAgICAgICAgIGxwc3ogKys7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKmxwc3ogfCBuTW9kaWZpZXIpIHsKLSAgICAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgY2FzZSAnQyc6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnYyd8Rk9SQ0VfQU5TSToKLSAgICAgICAgICAgIGNhc2UgJ0MnfEZPUkNFX0FOU0k6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnYyd8Rk9SQ0VfVU5JQ09ERToKLSAgICAgICAgICAgIGNhc2UgJ0MnfEZPUkNFX1VOSUNPREU6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyc6IHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIGNvbnN0IEZYX1dDSEFSKik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwc3RyTmV4dEFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3djc2xlbihwc3RyTmV4dEFyZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnUyc6IHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgRlhfQ0hBUiopOwotICAgICAgICAgICAgICAgICAgICBpZiAocHN0ck5leHRBcmcgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSA2OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBGWFNZU19zdHJsZW4ocHN0ck5leHRBcmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3MnfEZPUkNFX0FOU0k6Ci0gICAgICAgICAgICBjYXNlICdTJ3xGT1JDRV9BTlNJOiB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIGNvbnN0IEZYX0NIQVIqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBzdHJOZXh0QXJnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfc3RybGVuKHBzdHJOZXh0QXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdzJ3xGT1JDRV9VTklDT0RFOgotICAgICAgICAgICAgY2FzZSAnUyd8Rk9SQ0VfVU5JQ09ERTogewotICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgRlhfV0NIQVIqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBzdHJOZXh0QXJnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfd2NzbGVuKHBzdHJOZXh0QXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5JdGVtTGVuICE9IDApIHsKLSAgICAgICAgICAgIGlmIChuUHJlY2lzaW9uICE9IDAgJiYgbkl0ZW1MZW4gPiBuUHJlY2lzaW9uKSB7Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuUHJlY2lzaW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCpscHN6KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnWCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnbyc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuTW9kaWZpZXIgJiBGT1JDRV9JTlQ2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludDY0X3QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAzMjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoICsgblByZWNpc2lvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGggKyBuUHJlY2lzaW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgICAgICAgIGNhc2UgJ0EnOgotICAgICAgICAgICAgICAgIGNhc2UgJ2UnOgotICAgICAgICAgICAgICAgIGNhc2UgJ0UnOgotICAgICAgICAgICAgICAgIGNhc2UgJ2cnOgotICAgICAgICAgICAgICAgIGNhc2UgJ0cnOgotICAgICAgICAgICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgZG91YmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAxMjg7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCArIG5QcmVjaXNpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gbldpZHRoICsgblByZWNpc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5XaWR0aCArIG5QcmVjaXNpb24gPiAxMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gblByZWNpc2lvbiArIG5XaWR0aCArIDEyODsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBwc3pUZW1wWzI1Nl07Ci0gICAgICAgICAgICAgICAgICAgICAgICBmID0gdmFfYXJnKGFyZ0xpc3QsIGRvdWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19zbnByaW50Zihwc3pUZW1wLCBzaXplb2YocHN6VGVtcCksICIlKi4qZiIsIG5XaWR0aCwgblByZWNpc2lvbiArIDYsIGYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfc3RybGVuKHBzelRlbXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgdm9pZCopOwotICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDMyOwotICAgICAgICAgICAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnbic6Ci0gICAgICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbk1heExlbiArPSBuSXRlbUxlbjsKLSAgICB9Ci0gICAgR2V0QnVmZmVyKG5NYXhMZW4pOwotICAgIGlmIChtX3BEYXRhKSB7Ci0gICAgICAgIEZYU1lTX3Zzd3ByaW50Zigod2NoYXJfdCopbV9wRGF0YS0+bV9TdHJpbmcsIG5NYXhMZW4gKyAxLCAoY29uc3Qgd2NoYXJfdCopbHBzekZvcm1hdCwgYXJnTGlzdFNhdmUpOwotICAgICAgICBSZWxlYXNlQnVmZmVyKCk7Ci0gICAgfQotICAgIHZhX2VuZChhcmdMaXN0U2F2ZSk7Ci19Ci12b2lkIENGWF9XaWRlU3RyaW5nOjpGb3JtYXQoY29uc3QgRlhfV0NIQVIqIGxwc3pGb3JtYXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ0xpc3Q7Ci0gICAgdmFfc3RhcnQoYXJnTGlzdCwgbHBzekZvcm1hdCk7Ci0gICAgRm9ybWF0VihscHN6Rm9ybWF0LCBhcmdMaXN0KTsKLSAgICB2YV9lbmQoYXJnTGlzdCk7Ci19Ci1GWF9GTE9BVCBGWF93dG9mKGNvbnN0IEZYX1dDSEFSKiBzdHIsIGludCBsZW4pCi17Ci0gICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotICAgIGludCBjYyA9IDA7Ci0gICAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKLSAgICBpZiAoc3RyWzBdID09ICcrJykgewotICAgICAgICBjYysrOwotICAgIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgewotICAgICAgICBiTmVnYXRpdmUgPSBUUlVFOwotICAgICAgICBjYysrOwotICAgIH0KLSAgICBpbnQgaW50ZWdlciA9IDA7Ci0gICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICAgIGlmIChzdHJbY2NdID09ICcuJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZWdlciA9IGludGVnZXIgKiAxMCArIHN0cltjY10gLSAnMCc7Ci0gICAgICAgIGNjICsrOwotICAgIH0KLSAgICBGWF9GTE9BVCBmcmFjdGlvbiA9IDA7Ci0gICAgaWYgKHN0cltjY10gPT0gJy4nKSB7Ci0gICAgICAgIGNjICsrOwotICAgICAgICBGWF9GTE9BVCBzY2FsZSA9IDAuMWY7Ci0gICAgICAgIHdoaWxlIChjYyA8IGxlbikgewotICAgICAgICAgICAgZnJhY3Rpb24gKz0gc2NhbGUgKiAoc3RyW2NjXSAtICcwJyk7Ci0gICAgICAgICAgICBzY2FsZSAqPSAwLjFmOwotICAgICAgICAgICAgY2MgKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZnJhY3Rpb24gKz0gKEZYX0ZMT0FUKWludGVnZXI7Ci0gICAgcmV0dXJuIGJOZWdhdGl2ZSA/IC1mcmFjdGlvbiA6IGZyYWN0aW9uOwotfQotaW50IENGWF9XaWRlU3RyaW5nOjpHZXRJbnRlZ2VyKCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gRlhTWVNfd3RvaShtX3BEYXRhLT5tX1N0cmluZyk7Ci19Ci1GWF9GTE9BVCBDRlhfV2lkZVN0cmluZzo6R2V0RmxvYXQoKSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDAuMDsKLSAgICB9Ci0gICAgcmV0dXJuIEZYX3d0b2YobV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOwotfQotc3RhdGljIENGWF9CeXRlU3RyaW5nIF9EZWZNYXBfR2V0Qnl0ZVN0cmluZyhDRlhfQ2hhck1hcCogcENoYXJNYXAsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3aWRlc3RyKQotewotICAgIGludCBzcmNfbGVuID0gd2lkZXN0ci5HZXRMZW5ndGgoKTsKLSAgICBpbnQgY29kZXBhZ2UgPSBwQ2hhck1hcC0+bV9HZXRDb2RlUGFnZSA/IHBDaGFyTWFwLT5tX0dldENvZGVQYWdlKCkgOiAwOwotICAgIGludCBkZXN0X2xlbiA9IEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZXBhZ2UsIDAsIHdpZGVzdHIuY19zdHIoKSwgc3JjX2xlbiwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKGRlc3RfbGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHI7Ci0gICAgRlhfQ0hBUiogZGVzdF9idWYgPSBieXRlc3RyLkdldEJ1ZmZlcihkZXN0X2xlbik7Ci0gICAgRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShjb2RlcGFnZSwgMCwgd2lkZXN0ci5jX3N0cigpLCBzcmNfbGVuLCBkZXN0X2J1ZiwgZGVzdF9sZW4sIE5VTEwsIE5VTEwpOwotICAgIGJ5dGVzdHIuUmVsZWFzZUJ1ZmZlcihkZXN0X2xlbik7Ci0gICAgcmV0dXJuIGJ5dGVzdHI7Ci19Ci1zdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgX0RlZk1hcF9HZXRXaWRlU3RyaW5nKENGWF9DaGFyTWFwKiBwQ2hhck1hcCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJ5dGVzdHIpCi17Ci0gICAgaW50IHNyY19sZW4gPSBieXRlc3RyLkdldExlbmd0aCgpOwotICAgIGludCBjb2RlcGFnZSA9IHBDaGFyTWFwLT5tX0dldENvZGVQYWdlID8gcENoYXJNYXAtPm1fR2V0Q29kZVBhZ2UoKSA6IDA7Ci0gICAgaW50IGRlc3RfbGVuID0gRlhTWVNfTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlcGFnZSwgMCwgYnl0ZXN0ciwgc3JjX2xlbiwgTlVMTCwgMCk7Ci0gICAgaWYgKGRlc3RfbGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVzdHI7Ci0gICAgRlhfV0NIQVIqIGRlc3RfYnVmID0gd2lkZXN0ci5HZXRCdWZmZXIoZGVzdF9sZW4pOwotICAgIEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIoY29kZXBhZ2UsIDAsIGJ5dGVzdHIsIHNyY19sZW4sIGRlc3RfYnVmLCBkZXN0X2xlbik7Ci0gICAgd2lkZXN0ci5SZWxlYXNlQnVmZmVyKGRlc3RfbGVuKTsKLSAgICByZXR1cm4gd2lkZXN0cjsKLX0KLXN0YXRpYyBpbnQgX0RlZk1hcF9HZXRHQktDb2RlUGFnZSgpCi17Ci0gICAgcmV0dXJuIDkzNjsKLX0KLXN0YXRpYyBpbnQgX0RlZk1hcF9HZXRVSENDb2RlUGFnZSgpCi17Ci0gICAgcmV0dXJuIDk0OTsKLX0KLXN0YXRpYyBpbnQgX0RlZk1hcF9HZXRKSVNDb2RlUGFnZSgpCi17Ci0gICAgcmV0dXJuIDkzMjsKLX0KLXN0YXRpYyBpbnQgX0RlZk1hcF9HZXRCaWc1Q29kZVBhZ2UoKQotewotICAgIHJldHVybiA5NTA7Ci19Ci1zdGF0aWMgY29uc3QgQ0ZYX0NoYXJNYXAgZ19EZWZhdWx0TWFwcGVyID0geyZfRGVmTWFwX0dldFdpZGVTdHJpbmcsICZfRGVmTWFwX0dldEJ5dGVTdHJpbmcsIE5VTEx9Owotc3RhdGljIGNvbnN0IENGWF9DaGFyTWFwIGdfRGVmYXVsdEdCS01hcHBlciA9IHsmX0RlZk1hcF9HZXRXaWRlU3RyaW5nLCAmX0RlZk1hcF9HZXRCeXRlU3RyaW5nLCAmX0RlZk1hcF9HZXRHQktDb2RlUGFnZX07Ci1zdGF0aWMgY29uc3QgQ0ZYX0NoYXJNYXAgZ19EZWZhdWx0SklTTWFwcGVyID0geyZfRGVmTWFwX0dldFdpZGVTdHJpbmcsICZfRGVmTWFwX0dldEJ5dGVTdHJpbmcsICZfRGVmTWFwX0dldEpJU0NvZGVQYWdlfTsKLXN0YXRpYyBjb25zdCBDRlhfQ2hhck1hcCBnX0RlZmF1bHRVSENNYXBwZXIgPSB7Jl9EZWZNYXBfR2V0V2lkZVN0cmluZywgJl9EZWZNYXBfR2V0Qnl0ZVN0cmluZywgJl9EZWZNYXBfR2V0VUhDQ29kZVBhZ2V9Owotc3RhdGljIGNvbnN0IENGWF9DaGFyTWFwIGdfRGVmYXVsdEJpZzVNYXBwZXIgPSB7Jl9EZWZNYXBfR2V0V2lkZVN0cmluZywgJl9EZWZNYXBfR2V0Qnl0ZVN0cmluZywgJl9EZWZNYXBfR2V0QmlnNUNvZGVQYWdlfTsKLUNGWF9DaGFyTWFwKiBDRlhfQ2hhck1hcDo6R2V0RGVmYXVsdE1hcHBlcihpbnQzMl90IGNvZGVwYWdlKQotewotICAgIHN3aXRjaCAoY29kZXBhZ2UpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmV0dXJuIChDRlhfQ2hhck1hcCopJmdfRGVmYXVsdE1hcHBlcjsKLSAgICAgICAgY2FzZSA5MzI6Ci0gICAgICAgICAgICByZXR1cm4gKENGWF9DaGFyTWFwKikmZ19EZWZhdWx0SklTTWFwcGVyOwotICAgICAgICBjYXNlIDkzNjoKLSAgICAgICAgICAgIHJldHVybiAoQ0ZYX0NoYXJNYXAqKSZnX0RlZmF1bHRHQktNYXBwZXI7Ci0gICAgICAgIGNhc2UgOTQ5OgotICAgICAgICAgICAgcmV0dXJuIChDRlhfQ2hhck1hcCopJmdfRGVmYXVsdFVIQ01hcHBlcjsKLSAgICAgICAgY2FzZSA5NTA6Ci0gICAgICAgICAgICByZXR1cm4gKENGWF9DaGFyTWFwKikmZ19EZWZhdWx0QmlnNU1hcHBlcjsKLSAgICB9CisgIH0KKyAgU3RyaW5nRGF0YSogcE9sZERhdGEgPSBtX3BEYXRhOworICBGWF9TVFJTSVpFIG5PbGRMZW4gPSBwT2xkRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgaWYgKG5NaW5CdWZMZW5ndGggPCBuT2xkTGVuKSB7CisgICAgbk1pbkJ1Zkxlbmd0aCA9IG5PbGRMZW47CisgIH0KKyAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTWluQnVmTGVuZ3RoKTsKKyAgaWYgKCFtX3BEYXRhKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBwT2xkRGF0YS0+bV9TdHJpbmcsCisgICAgICAgICAgICAgICAobk9sZExlbiArIDEpICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuT2xkTGVuOworICBwT2xkRGF0YS0+UmVsZWFzZSgpOworICByZXR1cm4gbV9wRGF0YS0+bV9TdHJpbmc7Cit9CitDRlhfV2lkZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGNvbnN0IGNoYXIqIHN0ciwgRlhfU1RSU0laRSBsZW4pIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICByZXN1bHQuQ29udmVydEZyb20oQ0ZYX0J5dGVTdHJpbmcoc3RyLCBsZW4pKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KK0NGWF9XaWRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChjb25zdCBjaGFyKiBzdHIsIEZYX1NUUlNJWkUgbGVuKSB7CisgIGlmICghc3RyIHx8IDAgPT0gbGVuKSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKworICBDRlhfVVRGOERlY29kZXIgZGVjb2RlcjsKKyAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBkZWNvZGVyLklucHV0KHN0cltpXSk7CisgIH0KKyAgcmV0dXJuIGRlY29kZXIuR2V0UmVzdWx0KCk7Cit9CitDRlhfV2lkZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoY29uc3QgdW5zaWduZWQgc2hvcnQqIHdzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSB3bGVuKSB7CisgIGlmICghd3N0ciB8fCAwID09IHdsZW4pIHsKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorCisgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKKyAgRlhfV0NIQVIqIGJ1ZiA9IHJlc3VsdC5HZXRCdWZmZXIod2xlbik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgd2xlbjsgaSsrKSB7CisgICAgYnVmW2ldID0gd3N0cltpXTsKKyAgfQorICByZXN1bHQuUmVsZWFzZUJ1ZmZlcih3bGVuKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KK0ZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6OldTdHJpbmdMZW5ndGgoY29uc3QgdW5zaWduZWQgc2hvcnQqIHN0cikgeworICBGWF9TVFJTSVpFIGxlbiA9IDA7CisgIGlmIChzdHIpCisgICAgd2hpbGUgKHN0cltsZW5dKQorICAgICAgbGVuKys7CisgIHJldHVybiBsZW47Cit9CisKK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkFsbG9jQ29weShDRlhfV2lkZVN0cmluZyYgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3B5TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgbkNvcHlJbmRleCkgY29uc3QgeworICAvLyB8RlhfU1RSU0laRXwgaXMgY3VycmVudGx5IHR5cGVkZWYnZCBhcyBpbiB8aW50fC4gVE9ETyhwYWxtZXIpOiBJdAorICAvLyBzaG91bGQgYmUgYSB8c2l6ZV90fCwgb3IgYXQgbGVhc3QgdW5zaWduZWQuCisgIGlmIChuQ29weUxlbiA9PSAwIHx8IG5Db3B5TGVuIDwgMCkgeworICAgIHJldHVybjsKKyAgfQorICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPEZYX1NUUlNJWkU+IGlTaXplID0KKyAgICAgIHN0YXRpY19jYXN0PEZYX1NUUlNJWkU+KHNpemVvZihGWF9XQ0hBUikpOworICBpU2l6ZSAqPSBuQ29weUxlbjsKKyAgQVNTRVJUKGRlc3QubV9wRGF0YSA9PSBOVUxMKTsKKyAgZGVzdC5tX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5Db3B5TGVuKTsKKyAgaWYgKGRlc3QubV9wRGF0YSkgeworICAgIEZYU1lTX21lbWNweShkZXN0Lm1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX1N0cmluZyArIG5Db3B5SW5kZXgsCisgICAgICAgICAgICAgICAgIGlTaXplLlZhbHVlT3JEaWUoKSk7CisgIH0KK30KK0NGWF9XaWRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpMZWZ0KEZYX1NUUlNJWkUgbkNvdW50KSBjb25zdCB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorICBpZiAobkNvdW50IDwgMCkgeworICAgIG5Db3VudCA9IDA7CisgIH0KKyAgaWYgKG5Db3VudCA+PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIENGWF9XaWRlU3RyaW5nIGRlc3Q7CisgIEFsbG9jQ29weShkZXN0LCBuQ291bnQsIDApOworICByZXR1cm4gZGVzdDsKK30KK0NGWF9XaWRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpNaWQoRlhfU1RSU0laRSBuRmlyc3QpIGNvbnN0IHsKKyAgcmV0dXJuIE1pZChuRmlyc3QsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuRmlyc3QpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6Ok1pZChGWF9TVFJTSVpFIG5GaXJzdCwgRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0IHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisgIGlmIChuRmlyc3QgPCAwKSB7CisgICAgbkZpcnN0ID0gMDsKKyAgfQorICBpZiAobkNvdW50IDwgMCkgeworICAgIG5Db3VudCA9IDA7CisgIH0KKyAgaWYgKG5GaXJzdCArIG5Db3VudCA+IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKKyAgICBuQ291bnQgPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gbkZpcnN0OworICB9CisgIGlmIChuRmlyc3QgPiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7CisgICAgbkNvdW50ID0gMDsKKyAgfQorICBpZiAobkZpcnN0ID09IDAgJiYgbkZpcnN0ICsgbkNvdW50ID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgZGVzdDsKKyAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgbkZpcnN0KTsKKyAgcmV0dXJuIGRlc3Q7Cit9CitDRlhfV2lkZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6UmlnaHQoRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0IHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisgIGlmIChuQ291bnQgPCAwKSB7CisgICAgbkNvdW50ID0gMDsKKyAgfQorICBpZiAobkNvdW50ID49IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgZGVzdDsKKyAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5Db3VudCk7CisgIHJldHVybiBkZXN0OworfQoraW50IENGWF9XaWRlU3RyaW5nOjpDb21wYXJlTm9DYXNlKGNvbnN0IEZYX1dDSEFSKiBscHN6KSBjb25zdCB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gKGxwc3ogPT0gTlVMTCB8fCBscHN6WzBdID09IDApID8gMCA6IC0xOworICB9CisgIHJldHVybiBGWFNZU193Y3NpY21wKG1fcERhdGEtPm1fU3RyaW5nLCBscHN6KTsKK30KK2ludCBDRlhfV2lkZVN0cmluZzo6Q29tcGFyZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSBjb25zdCB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICBpZiAoc3RyLm1fcERhdGEgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoc3RyLm1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiAxOworICB9CisgIGludCB0aGlzX2xlbiA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIGludCB0aGF0X2xlbiA9IHN0ci5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBpbnQgbWluX2xlbiA9IHRoaXNfbGVuIDwgdGhhdF9sZW4gPyB0aGlzX2xlbiA6IHRoYXRfbGVuOworICBmb3IgKGludCBpID0gMDsgaSA8IG1pbl9sZW47IGkrKykgeworICAgIGlmIChtX3BEYXRhLT5tX1N0cmluZ1tpXSA8IHN0ci5tX3BEYXRhLT5tX1N0cmluZ1tpXSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobV9wRGF0YS0+bV9TdHJpbmdbaV0gPiBzdHIubV9wRGF0YS0+bV9TdHJpbmdbaV0pIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBpZiAodGhpc19sZW4gPCB0aGF0X2xlbikgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAodGhpc19sZW4gPiB0aGF0X2xlbikgeworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6U2V0QXQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX1dDSEFSIGNoKSB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQVNTRVJUKG5JbmRleCA+PSAwKTsKKyAgQVNTRVJUKG5JbmRleCA8IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOworICBDb3B5QmVmb3JlV3JpdGUoKTsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA9IGNoOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6TWFrZUxvd2VyKCkgeworICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYU1lTX3djc2x3cihtX3BEYXRhLT5tX1N0cmluZyk7Cit9Cit2b2lkIENGWF9XaWRlU3RyaW5nOjpNYWtlVXBwZXIoKSB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ29weUJlZm9yZVdyaXRlKCk7CisgIGlmIChHZXRMZW5ndGgoKSA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhTWVNfd2NzdXByKG1fcERhdGEtPm1fU3RyaW5nKTsKK30KK0ZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6OkZpbmQoY29uc3QgRlhfV0NIQVIqIGxwc3pTdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgblN0YXJ0KSBjb25zdCB7CisgIEZYX1NUUlNJWkUgbkxlbmd0aCA9IEdldExlbmd0aCgpOworICBpZiAobkxlbmd0aCA8IDEgfHwgblN0YXJ0ID4gbkxlbmd0aCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBjb25zdCBGWF9XQ0hBUiogbHBzeiA9IEZYU1lTX3djc3N0cihtX3BEYXRhLT5tX1N0cmluZyArIG5TdGFydCwgbHBzelN1Yik7CisgIHJldHVybiAobHBzeiA9PSBOVUxMKSA/IC0xIDogKGludCkobHBzeiAtIG1fcERhdGEtPm1fU3RyaW5nKTsKK30KK0ZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6OkZpbmQoRlhfV0NIQVIgY2gsIEZYX1NUUlNJWkUgblN0YXJ0KSBjb25zdCB7CisgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgRlhfU1RSU0laRSBuTGVuZ3RoID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgaWYgKG5TdGFydCA+PSBuTGVuZ3RoKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNvbnN0IEZYX1dDSEFSKiBscHN6ID0gRlhTWVNfd2NzY2hyKG1fcERhdGEtPm1fU3RyaW5nICsgblN0YXJ0LCBjaCk7CisgIHJldHVybiAobHBzeiA9PSBOVUxMKSA/IC0xIDogKGludCkobHBzeiAtIG1fcERhdGEtPm1fU3RyaW5nKTsKK30KK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1SaWdodChjb25zdCBGWF9XQ0hBUiogbHBzelRhcmdldExpc3QpIHsKKyAgRlhTWVNfYXNzZXJ0KGxwc3pUYXJnZXRMaXN0ICE9IE5VTEwpOworICBpZiAobV9wRGF0YSA9PSBOVUxMIHx8ICpscHN6VGFyZ2V0TGlzdCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBGWF9TVFJTSVpFIGxlbiA9IEdldExlbmd0aCgpOworICBpZiAobGVuIDwgMSkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9TVFJTSVpFIHBvcyA9IGxlbjsKKyAgd2hpbGUgKHBvcykgeworICAgIGlmIChGWFNZU193Y3NjaHIobHBzelRhcmdldExpc3QsIG1fcERhdGEtPm1fU3RyaW5nW3BvcyAtIDFdKSA9PSBOVUxMKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcG9zLS07CisgIH0KKyAgaWYgKHBvcyA8IGxlbikgeworICAgIG1fcERhdGEtPm1fU3RyaW5nW3Bvc10gPSAwOworICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBwb3M7CisgIH0KK30KK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1SaWdodChGWF9XQ0hBUiBjaFRhcmdldCkgeworICBGWF9XQ0hBUiBzdHJbMl0gPSB7Y2hUYXJnZXQsIDB9OworICBUcmltUmlnaHQoc3RyKTsKK30KK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1SaWdodCgpIHsKKyAgVHJpbVJpZ2h0KEwiXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwIik7Cit9Cit2b2lkIENGWF9XaWRlU3RyaW5nOjpUcmltTGVmdChjb25zdCBGWF9XQ0hBUiogbHBzelRhcmdldHMpIHsKKyAgRlhTWVNfYXNzZXJ0KGxwc3pUYXJnZXRzICE9IE5VTEwpOworICBpZiAobV9wRGF0YSA9PSBOVUxMIHx8ICpscHN6VGFyZ2V0cyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIGNvbnN0IEZYX1dDSEFSKiBscHN6ID0gbV9wRGF0YS0+bV9TdHJpbmc7CisgIHdoaWxlICgqbHBzeiAhPSAwKSB7CisgICAgaWYgKEZYU1lTX3djc2NocihscHN6VGFyZ2V0cywgKmxwc3opID09IE5VTEwpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBscHN6Kys7CisgIH0KKyAgaWYgKGxwc3ogIT0gbV9wRGF0YS0+bV9TdHJpbmcpIHsKKyAgICBpbnQgbkRhdGFMZW5ndGggPQorICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gKEZYX1NUUlNJWkUpKGxwc3ogLSBtX3BEYXRhLT5tX1N0cmluZyk7CisgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZywgbHBzeiwKKyAgICAgICAgICAgICAgICAgIChuRGF0YUxlbmd0aCArIDEpICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5EYXRhTGVuZ3RoOworICB9Cit9Cit2b2lkIENGWF9XaWRlU3RyaW5nOjpUcmltTGVmdChGWF9XQ0hBUiBjaFRhcmdldCkgeworICBGWF9XQ0hBUiBzdHJbMl0gPSB7Y2hUYXJnZXQsIDB9OworICBUcmltTGVmdChzdHIpOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6VHJpbUxlZnQoKSB7CisgIFRyaW1MZWZ0KEwiXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwIik7Cit9CitGWF9TVFJTSVpFIENGWF9XaWRlU3RyaW5nOjpSZXBsYWNlKGNvbnN0IEZYX1dDSEFSKiBscHN6T2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBzek5ldykgeworICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGxwc3pPbGQgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIEZYX1NUUlNJWkUgblNvdXJjZUxlbiA9IEZYU1lTX3djc2xlbihscHN6T2xkKTsKKyAgaWYgKG5Tb3VyY2VMZW4gPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIEZYX1NUUlNJWkUgblJlcGxhY2VtZW50TGVuID0gbHBzek5ldyA/IEZYU1lTX3djc2xlbihscHN6TmV3KSA6IDA7CisgIEZYX1NUUlNJWkUgbkNvdW50ID0gMDsKKyAgRlhfV0NIQVIqIGxwc3pTdGFydCA9IG1fcERhdGEtPm1fU3RyaW5nOworICBGWF9XQ0hBUiogbHBzekVuZCA9IG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgRlhfV0NIQVIqIGxwc3pUYXJnZXQ7CisgIHsKKyAgICB3aGlsZSAoKGxwc3pUYXJnZXQgPSAoRlhfV0NIQVIqKUZYU1lTX3djc3N0cihscHN6U3RhcnQsIGxwc3pPbGQpKSAhPSBOVUxMICYmCisgICAgICAgICAgIGxwc3pTdGFydCA8IGxwc3pFbmQpIHsKKyAgICAgIG5Db3VudCsrOworICAgICAgbHBzelN0YXJ0ID0gbHBzelRhcmdldCArIG5Tb3VyY2VMZW47CisgICAgfQorICB9CisgIGlmIChuQ291bnQgPiAwKSB7CisgICAgQ29weUJlZm9yZVdyaXRlKCk7CisgICAgRlhfU1RSU0laRSBuT2xkTGVuZ3RoID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgICBGWF9TVFJTSVpFIG5OZXdMZW5ndGggPQorICAgICAgICBuT2xkTGVuZ3RoICsgKG5SZXBsYWNlbWVudExlbiAtIG5Tb3VyY2VMZW4pICogbkNvdW50OworICAgIGlmIChtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCA8IG5OZXdMZW5ndGggfHwgbV9wRGF0YS0+bV9uUmVmcyA+IDEpIHsKKyAgICAgIFN0cmluZ0RhdGEqIHBPbGREYXRhID0gbV9wRGF0YTsKKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3RyID0gbV9wRGF0YS0+bV9TdHJpbmc7CisgICAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5OZXdMZW5ndGgpOworICAgICAgaWYgKCFtX3BEYXRhKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBwc3RyLAorICAgICAgICAgICAgICAgICAgIHBPbGREYXRhLT5tX25EYXRhTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgICAgICBwT2xkRGF0YS0+UmVsZWFzZSgpOworICAgIH0KKyAgICBscHN6U3RhcnQgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgICBscHN6RW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBGWF9NQVgobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgbk5ld0xlbmd0aCk7CisgICAgeworICAgICAgd2hpbGUgKChscHN6VGFyZ2V0ID0gKEZYX1dDSEFSKilGWFNZU193Y3NzdHIobHBzelN0YXJ0LCBscHN6T2xkKSkgIT0KKyAgICAgICAgICAgICAgICAgTlVMTCAmJgorICAgICAgICAgICAgIGxwc3pTdGFydCA8IGxwc3pFbmQpIHsKKyAgICAgICAgRlhfU1RSU0laRSBuQmFsYW5jZSA9CisgICAgICAgICAgICBuT2xkTGVuZ3RoIC0KKyAgICAgICAgICAgIChGWF9TVFJTSVpFKShscHN6VGFyZ2V0IC0gbV9wRGF0YS0+bV9TdHJpbmcgKyBuU291cmNlTGVuKTsKKyAgICAgICAgRlhTWVNfbWVtbW92ZShscHN6VGFyZ2V0ICsgblJlcGxhY2VtZW50TGVuLCBscHN6VGFyZ2V0ICsgblNvdXJjZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBuQmFsYW5jZSAqIHNpemVvZihGWF9XQ0hBUikpOworICAgICAgICBGWFNZU19tZW1jcHkobHBzelRhcmdldCwgbHBzek5ldywgblJlcGxhY2VtZW50TGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgICAgICAgIGxwc3pTdGFydCA9IGxwc3pUYXJnZXQgKyBuUmVwbGFjZW1lbnRMZW47CisgICAgICAgIGxwc3pTdGFydFtuQmFsYW5jZV0gPSAwOworICAgICAgICBuT2xkTGVuZ3RoICs9IChuUmVwbGFjZW1lbnRMZW4gLSBuU291cmNlTGVuKTsKKyAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUKG1fcERhdGEtPm1fU3RyaW5nW25OZXdMZW5ndGhdID09IDApOworICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuTmV3TGVuZ3RoOworICB9CisgIHJldHVybiBuQ291bnQ7Cit9CitGWF9TVFJTSVpFIENGWF9XaWRlU3RyaW5nOjpJbnNlcnQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX1dDSEFSIGNoKSB7CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBpZiAobkluZGV4IDwgMCkgeworICAgIG5JbmRleCA9IDA7CisgIH0KKyAgRlhfU1RSU0laRSBuTmV3TGVuZ3RoID0gR2V0TGVuZ3RoKCk7CisgIGlmIChuSW5kZXggPiBuTmV3TGVuZ3RoKSB7CisgICAgbkluZGV4ID0gbk5ld0xlbmd0aDsKKyAgfQorICBuTmV3TGVuZ3RoKys7CisgIGlmIChtX3BEYXRhID09IE5VTEwgfHwgbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPCBuTmV3TGVuZ3RoKSB7CisgICAgU3RyaW5nRGF0YSogcE9sZERhdGEgPSBtX3BEYXRhOworICAgIGNvbnN0IEZYX1dDSEFSKiBwc3RyID0gbV9wRGF0YS0+bV9TdHJpbmc7CisgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuZ3RoKTsKKyAgICBpZiAoIW1fcERhdGEpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAocE9sZERhdGEgIT0gTlVMTCkgeworICAgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZywgcHN0ciwKKyAgICAgICAgICAgICAgICAgICAgKHBPbGREYXRhLT5tX25EYXRhTGVuZ3RoICsgMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsKKyAgICAgIHBPbGREYXRhLT5SZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fcERhdGEtPm1fU3RyaW5nWzBdID0gMDsKKyAgICB9CisgIH0KKyAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZyArIG5JbmRleCArIDEsIG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4LAorICAgICAgICAgICAgICAgIChuTmV3TGVuZ3RoIC0gbkluZGV4KSAqIHNpemVvZihGWF9XQ0hBUikpOworICBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdID0gY2g7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuTmV3TGVuZ3RoOworICByZXR1cm4gbk5ld0xlbmd0aDsKK30KK0ZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6OkRlbGV0ZShGWF9TVFJTSVpFIG5JbmRleCwgRlhfU1RSU0laRSBuQ291bnQpIHsKKyAgaWYgKEdldExlbmd0aCgpIDwgMSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChuSW5kZXggPCAwKSB7CisgICAgbkluZGV4ID0gMDsKKyAgfQorICBGWF9TVFJTSVpFIG5PbGRMZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBpZiAobkNvdW50ID4gMCAmJiBuSW5kZXggPCBuT2xkTGVuZ3RoKSB7CisgICAgQ29weUJlZm9yZVdyaXRlKCk7CisgICAgaW50IG5CeXRlc1RvQ29weSA9IG5PbGRMZW5ndGggLSAobkluZGV4ICsgbkNvdW50KSArIDE7CisgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZyArIG5JbmRleCwKKyAgICAgICAgICAgICAgICAgIG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4ICsgbkNvdW50LAorICAgICAgICAgICAgICAgICAgbkJ5dGVzVG9Db3B5ICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5PbGRMZW5ndGggLSBuQ291bnQ7CisgIH0KKyAgcmV0dXJuIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Cit9CitGWF9TVFJTSVpFIENGWF9XaWRlU3RyaW5nOjpSZW1vdmUoRlhfV0NIQVIgY2hSZW1vdmUpIHsKKyAgaWYgKG1fcERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhfV0NIQVIqIHBzdHJTb3VyY2UgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgRlhfV0NIQVIqIHBzdHJEZXN0ID0gbV9wRGF0YS0+bV9TdHJpbmc7CisgIEZYX1dDSEFSKiBwc3RyRW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICB3aGlsZSAocHN0clNvdXJjZSA8IHBzdHJFbmQpIHsKKyAgICBpZiAoKnBzdHJTb3VyY2UgIT0gY2hSZW1vdmUpIHsKKyAgICAgICpwc3RyRGVzdCA9ICpwc3RyU291cmNlOworICAgICAgcHN0ckRlc3QrKzsKKyAgICB9CisgICAgcHN0clNvdXJjZSsrOworICB9CisgICpwc3RyRGVzdCA9IDA7CisgIEZYX1NUUlNJWkUgbkNvdW50ID0gKEZYX1NUUlNJWkUpKHBzdHJTb3VyY2UgLSBwc3RyRGVzdCk7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLT0gbkNvdW50OworICByZXR1cm4gbkNvdW50OworfQorI2RlZmluZSBGT1JDRV9BTlNJIDB4MTAwMDAKKyNkZWZpbmUgRk9SQ0VfVU5JQ09ERSAweDIwMDAwCisjZGVmaW5lIEZPUkNFX0lOVDY0IDB4NDAwMDAKK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkZvcm1hdFYoY29uc3QgRlhfV0NIQVIqIGxwc3pGb3JtYXQsIHZhX2xpc3QgYXJnTGlzdCkgeworICB2YV9saXN0IGFyZ0xpc3RTYXZlOworI2lmIGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCFkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX0ZYX0NQVV8gPT0gX0ZYX1g2NF8gfHwgX0ZYX0NQVV8gPT0gX0ZYX0lBNjRfIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRlhfQ1BVXyA9PSBfRlhfQVJNNjRfKSkgfHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCisgIHZhX2NvcHkoYXJnTGlzdFNhdmUsIGFyZ0xpc3QpOworI2Vsc2UKKyAgYXJnTGlzdFNhdmUgPSBhcmdMaXN0OworI2VuZGlmCisgIGludCBuTWF4TGVuID0gMDsKKyAgZm9yIChjb25zdCBGWF9XQ0hBUiogbHBzeiA9IGxwc3pGb3JtYXQ7ICpscHN6ICE9IDA7IGxwc3orKykgeworICAgIGlmICgqbHBzeiAhPSAnJScgfHwgKihscHN6ID0gbHBzeiArIDEpID09ICclJykgeworICAgICAgbk1heExlbiArPSBGWFNZU193Y3NsZW4obHBzeik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IG5JdGVtTGVuID0gMDsKKyAgICBpbnQgbldpZHRoID0gMDsKKyAgICBmb3IgKDsgKmxwc3ogIT0gMDsgbHBzeisrKSB7CisgICAgICBpZiAoKmxwc3ogPT0gJyMnKSB7CisgICAgICAgIG5NYXhMZW4gKz0gMjsKKyAgICAgIH0gZWxzZSBpZiAoKmxwc3ogPT0gJyonKSB7CisgICAgICAgIG5XaWR0aCA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICAgfSBlbHNlIGlmICgqbHBzeiA9PSAnLScgfHwgKmxwc3ogPT0gJysnIHx8ICpscHN6ID09ICcwJyB8fCAqbHBzeiA9PSAnICcpCisgICAgICAgIDsKKyAgICAgIGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG5XaWR0aCA9PSAwKSB7CisgICAgICBuV2lkdGggPSBGWFNZU193dG9pKGxwc3opOworICAgICAgZm9yICg7ICpscHN6ICE9IDAgJiYgKCpscHN6KSA8PSAnOScgJiYgKCpscHN6KSA+PSAnMCc7IGxwc3orKykKKyAgICAgICAgOworICAgIH0KKyAgICBpZiAobldpZHRoIDwgMCB8fCBuV2lkdGggPiAxMjggKiAxMDI0KSB7CisgICAgICBscHN6Rm9ybWF0ID0gTCJCYWQgd2lkdGgiOworICAgICAgbk1heExlbiA9IDEwOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGludCBuUHJlY2lzaW9uID0gMDsKKyAgICBpZiAoKmxwc3ogPT0gJy4nKSB7CisgICAgICBscHN6Kys7CisgICAgICBpZiAoKmxwc3ogPT0gJyonKSB7CisgICAgICAgIG5QcmVjaXNpb24gPSB2YV9hcmcoYXJnTGlzdCwgaW50KTsKKyAgICAgICAgbHBzeisrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgblByZWNpc2lvbiA9IEZYU1lTX3d0b2kobHBzeik7CisgICAgICAgIGZvciAoOyAqbHBzeiAhPSAwICYmICgqbHBzeikgPj0gJzAnICYmICgqbHBzeikgPD0gJzknOyBscHN6KyspCisgICAgICAgICAgOworICAgICAgfQorICAgIH0KKyAgICBpZiAoblByZWNpc2lvbiA8IDAgfHwgblByZWNpc2lvbiA+IDEyOCAqIDEwMjQpIHsKKyAgICAgIGxwc3pGb3JtYXQgPSBMIkJhZCBwcmVjaXNpb24iOworICAgICAgbk1heExlbiA9IDE0OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGludCBuTW9kaWZpZXIgPSAwOworICAgIGlmICgqbHBzeiA9PSBMJ0knICYmICoobHBzeiArIDEpID09IEwnNicgJiYgKihscHN6ICsgMikgPT0gTCc0JykgeworICAgICAgbHBzeiArPSAzOworICAgICAgbk1vZGlmaWVyID0gRk9SQ0VfSU5UNjQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoKmxwc3opIHsKKyAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgbk1vZGlmaWVyID0gRk9SQ0VfQU5TSTsKKyAgICAgICAgICBscHN6Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2wnOgorICAgICAgICAgIG5Nb2RpZmllciA9IEZPUkNFX1VOSUNPREU7CisgICAgICAgICAgbHBzeisrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgY2FzZSAnTic6CisgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgIGxwc3orKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoICgqbHBzeiB8IG5Nb2RpZmllcikgeworICAgICAgY2FzZSAnYyc6CisgICAgICBjYXNlICdDJzoKKyAgICAgICAgbkl0ZW1MZW4gPSAyOworICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdjJyB8IEZPUkNFX0FOU0k6CisgICAgICBjYXNlICdDJyB8IEZPUkNFX0FOU0k6CisgICAgICAgIG5JdGVtTGVuID0gMjsKKyAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnYycgfCBGT1JDRV9VTklDT0RFOgorICAgICAgY2FzZSAnQycgfCBGT1JDRV9VTklDT0RFOgorICAgICAgICBuSXRlbUxlbiA9IDI7CisgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3MnOiB7CisgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3RyTmV4dEFyZyA9IHZhX2FyZyhhcmdMaXN0LCBjb25zdCBGWF9XQ0hBUiopOworICAgICAgICBpZiAocHN0ck5leHRBcmcgPT0gTlVMTCkgeworICAgICAgICAgIG5JdGVtTGVuID0gNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3djc2xlbihwc3RyTmV4dEFyZyk7CisgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgJ1MnOiB7CisgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIGNvbnN0IEZYX0NIQVIqKTsKKyAgICAgICAgaWYgKHBzdHJOZXh0QXJnID09IE5VTEwpIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IDY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSBGWFNZU19zdHJsZW4ocHN0ck5leHRBcmcpOworICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlICdzJyB8IEZPUkNFX0FOU0k6CisgICAgICBjYXNlICdTJyB8IEZPUkNFX0FOU0k6IHsKKyAgICAgICAgY29uc3QgRlhfQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgRlhfQ0hBUiopOworICAgICAgICBpZiAocHN0ck5leHRBcmcgPT0gTlVMTCkgeworICAgICAgICAgIG5JdGVtTGVuID0gNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3RyTmV4dEFyZyk7CisgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgJ3MnIHwgRk9SQ0VfVU5JQ09ERToKKyAgICAgIGNhc2UgJ1MnIHwgRk9SQ0VfVU5JQ09ERTogeworICAgICAgICBGWF9XQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgRlhfV0NIQVIqKTsKKyAgICAgICAgaWYgKHBzdHJOZXh0QXJnID09IE5VTEwpIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IDY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSBGWFNZU193Y3NsZW4ocHN0ck5leHRBcmcpOworICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgfQorICAgIGlmIChuSXRlbUxlbiAhPSAwKSB7CisgICAgICBpZiAoblByZWNpc2lvbiAhPSAwICYmIG5JdGVtTGVuID4gblByZWNpc2lvbikgeworICAgICAgICBuSXRlbUxlbiA9IG5QcmVjaXNpb247CisgICAgICB9CisgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGgpIHsKKyAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGg7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoKmxwc3opIHsKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgIGNhc2UgJ2knOgorICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgY2FzZSAneCc6CisgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICBpZiAobk1vZGlmaWVyICYgRk9SQ0VfSU5UNjQpIHsKKyAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQ2NF90KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCk7CisgICAgICAgICAgfQorICAgICAgICAgIG5JdGVtTGVuID0gMzI7CisgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoICsgblByZWNpc2lvbikgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGggKyBuUHJlY2lzaW9uOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYSc6CisgICAgICAgIGNhc2UgJ0EnOgorICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgY2FzZSAnRSc6CisgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICBjYXNlICdHJzoKKyAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgZG91YmxlKTsKKyAgICAgICAgICBuSXRlbUxlbiA9IDEyODsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICBpZiAobldpZHRoICsgblByZWNpc2lvbiA+IDEwMCkgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSBuUHJlY2lzaW9uICsgbldpZHRoICsgMTI4OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb3VibGUgZjsKKyAgICAgICAgICAgIGNoYXIgcHN6VGVtcFsyNTZdOworICAgICAgICAgICAgZiA9IHZhX2FyZyhhcmdMaXN0LCBkb3VibGUpOworICAgICAgICAgICAgRlhTWVNfc25wcmludGYocHN6VGVtcCwgc2l6ZW9mKHBzelRlbXApLCAiJSouKmYiLCBuV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuUHJlY2lzaW9uICsgNiwgZik7CisgICAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3pUZW1wKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCB2b2lkKik7CisgICAgICAgICAgbkl0ZW1MZW4gPSAzMjsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50Kik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG5NYXhMZW4gKz0gbkl0ZW1MZW47CisgIH0KKyAgR2V0QnVmZmVyKG5NYXhMZW4pOworICBpZiAobV9wRGF0YSkgeworICAgIEZYU1lTX3Zzd3ByaW50Zigod2NoYXJfdCopbV9wRGF0YS0+bV9TdHJpbmcsIG5NYXhMZW4gKyAxLAorICAgICAgICAgICAgICAgICAgICAoY29uc3Qgd2NoYXJfdCopbHBzekZvcm1hdCwgYXJnTGlzdFNhdmUpOworICAgIFJlbGVhc2VCdWZmZXIoKTsKKyAgfQorICB2YV9lbmQoYXJnTGlzdFNhdmUpOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6Rm9ybWF0KGNvbnN0IEZYX1dDSEFSKiBscHN6Rm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdMaXN0OworICB2YV9zdGFydChhcmdMaXN0LCBscHN6Rm9ybWF0KTsKKyAgRm9ybWF0VihscHN6Rm9ybWF0LCBhcmdMaXN0KTsKKyAgdmFfZW5kKGFyZ0xpc3QpOworfQorRlhfRkxPQVQgRlhfd3RvZihjb25zdCBGWF9XQ0hBUiogc3RyLCBpbnQgbGVuKSB7CisgIGlmIChsZW4gPT0gMCkgeworICAgIHJldHVybiAwLjA7CisgIH0KKyAgaW50IGNjID0gMDsKKyAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKKyAgaWYgKHN0clswXSA9PSAnKycpIHsKKyAgICBjYysrOworICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsKKyAgICBiTmVnYXRpdmUgPSBUUlVFOworICAgIGNjKys7CisgIH0KKyAgaW50IGludGVnZXIgPSAwOworICB3aGlsZSAoY2MgPCBsZW4pIHsKKyAgICBpZiAoc3RyW2NjXSA9PSAnLicpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpbnRlZ2VyID0gaW50ZWdlciAqIDEwICsgc3RyW2NjXSAtICcwJzsKKyAgICBjYysrOworICB9CisgIEZYX0ZMT0FUIGZyYWN0aW9uID0gMDsKKyAgaWYgKHN0cltjY10gPT0gJy4nKSB7CisgICAgY2MrKzsKKyAgICBGWF9GTE9BVCBzY2FsZSA9IDAuMWY7CisgICAgd2hpbGUgKGNjIDwgbGVuKSB7CisgICAgICBmcmFjdGlvbiArPSBzY2FsZSAqIChzdHJbY2NdIC0gJzAnKTsKKyAgICAgIHNjYWxlICo9IDAuMWY7CisgICAgICBjYysrOworICAgIH0KKyAgfQorICBmcmFjdGlvbiArPSAoRlhfRkxPQVQpaW50ZWdlcjsKKyAgcmV0dXJuIGJOZWdhdGl2ZSA/IC1mcmFjdGlvbiA6IGZyYWN0aW9uOworfQoraW50IENGWF9XaWRlU3RyaW5nOjpHZXRJbnRlZ2VyKCkgY29uc3QgeworICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIEZYU1lTX3d0b2kobV9wRGF0YS0+bV9TdHJpbmcpOworfQorRlhfRkxPQVQgQ0ZYX1dpZGVTdHJpbmc6OkdldEZsb2F0KCkgY29uc3QgeworICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDAuMDsKKyAgfQorICByZXR1cm4gRlhfd3RvZihtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7Cit9CitzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgX0RlZk1hcF9HZXRCeXRlU3RyaW5nKENGWF9DaGFyTWFwKiBwQ2hhck1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdpZGVzdHIpIHsKKyAgaW50IHNyY19sZW4gPSB3aWRlc3RyLkdldExlbmd0aCgpOworICBpbnQgY29kZXBhZ2UgPSBwQ2hhck1hcC0+bV9HZXRDb2RlUGFnZSA/IHBDaGFyTWFwLT5tX0dldENvZGVQYWdlKCkgOiAwOworICBpbnQgZGVzdF9sZW4gPSBGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKGNvZGVwYWdlLCAwLCB3aWRlc3RyLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlbiwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgIGlmIChkZXN0X2xlbiA9PSAwKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZXN0cjsKKyAgRlhfQ0hBUiogZGVzdF9idWYgPSBieXRlc3RyLkdldEJ1ZmZlcihkZXN0X2xlbik7CisgIEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZXBhZ2UsIDAsIHdpZGVzdHIuY19zdHIoKSwgc3JjX2xlbiwgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9sZW4sIE5VTEwsIE5VTEwpOworICBieXRlc3RyLlJlbGVhc2VCdWZmZXIoZGVzdF9sZW4pOworICByZXR1cm4gYnl0ZXN0cjsKK30KK3N0YXRpYyBDRlhfV2lkZVN0cmluZyBfRGVmTWFwX0dldFdpZGVTdHJpbmcoQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnl0ZXN0cikgeworICBpbnQgc3JjX2xlbiA9IGJ5dGVzdHIuR2V0TGVuZ3RoKCk7CisgIGludCBjb2RlcGFnZSA9IHBDaGFyTWFwLT5tX0dldENvZGVQYWdlID8gcENoYXJNYXAtPm1fR2V0Q29kZVBhZ2UoKSA6IDA7CisgIGludCBkZXN0X2xlbiA9CisgICAgICBGWFNZU19NdWx0aUJ5dGVUb1dpZGVDaGFyKGNvZGVwYWdlLCAwLCBieXRlc3RyLCBzcmNfbGVuLCBOVUxMLCAwKTsKKyAgaWYgKGRlc3RfbGVuID09IDApIHsKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorICBDRlhfV2lkZVN0cmluZyB3aWRlc3RyOworICBGWF9XQ0hBUiogZGVzdF9idWYgPSB3aWRlc3RyLkdldEJ1ZmZlcihkZXN0X2xlbik7CisgIEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIoY29kZXBhZ2UsIDAsIGJ5dGVzdHIsIHNyY19sZW4sIGRlc3RfYnVmLCBkZXN0X2xlbik7CisgIHdpZGVzdHIuUmVsZWFzZUJ1ZmZlcihkZXN0X2xlbik7CisgIHJldHVybiB3aWRlc3RyOworfQorc3RhdGljIGludCBfRGVmTWFwX0dldEdCS0NvZGVQYWdlKCkgeworICByZXR1cm4gOTM2OworfQorc3RhdGljIGludCBfRGVmTWFwX0dldFVIQ0NvZGVQYWdlKCkgeworICByZXR1cm4gOTQ5OworfQorc3RhdGljIGludCBfRGVmTWFwX0dldEpJU0NvZGVQYWdlKCkgeworICByZXR1cm4gOTMyOworfQorc3RhdGljIGludCBfRGVmTWFwX0dldEJpZzVDb2RlUGFnZSgpIHsKKyAgcmV0dXJuIDk1MDsKK30KK3N0YXRpYyBjb25zdCBDRlhfQ2hhck1hcCBnX0RlZmF1bHRNYXBwZXIgPSB7Jl9EZWZNYXBfR2V0V2lkZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9EZWZNYXBfR2V0Qnl0ZVN0cmluZywgTlVMTH07CitzdGF0aWMgY29uc3QgQ0ZYX0NoYXJNYXAgZ19EZWZhdWx0R0JLTWFwcGVyID0geworICAgICZfRGVmTWFwX0dldFdpZGVTdHJpbmcsICZfRGVmTWFwX0dldEJ5dGVTdHJpbmcsICZfRGVmTWFwX0dldEdCS0NvZGVQYWdlfTsKK3N0YXRpYyBjb25zdCBDRlhfQ2hhck1hcCBnX0RlZmF1bHRKSVNNYXBwZXIgPSB7CisgICAgJl9EZWZNYXBfR2V0V2lkZVN0cmluZywgJl9EZWZNYXBfR2V0Qnl0ZVN0cmluZywgJl9EZWZNYXBfR2V0SklTQ29kZVBhZ2V9Oworc3RhdGljIGNvbnN0IENGWF9DaGFyTWFwIGdfRGVmYXVsdFVIQ01hcHBlciA9IHsKKyAgICAmX0RlZk1hcF9HZXRXaWRlU3RyaW5nLCAmX0RlZk1hcF9HZXRCeXRlU3RyaW5nLCAmX0RlZk1hcF9HZXRVSENDb2RlUGFnZX07CitzdGF0aWMgY29uc3QgQ0ZYX0NoYXJNYXAgZ19EZWZhdWx0QmlnNU1hcHBlciA9IHsKKyAgICAmX0RlZk1hcF9HZXRXaWRlU3RyaW5nLCAmX0RlZk1hcF9HZXRCeXRlU3RyaW5nLCAmX0RlZk1hcF9HZXRCaWc1Q29kZVBhZ2V9OworQ0ZYX0NoYXJNYXAqIENGWF9DaGFyTWFwOjpHZXREZWZhdWx0TWFwcGVyKGludDMyX3QgY29kZXBhZ2UpIHsKKyAgc3dpdGNoIChjb2RlcGFnZSkgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiAoQ0ZYX0NoYXJNYXAqKSZnX0RlZmF1bHRNYXBwZXI7CisgICAgY2FzZSA5MzI6CisgICAgICByZXR1cm4gKENGWF9DaGFyTWFwKikmZ19EZWZhdWx0SklTTWFwcGVyOworICAgIGNhc2UgOTM2OgorICAgICAgcmV0dXJuIChDRlhfQ2hhck1hcCopJmdfRGVmYXVsdEdCS01hcHBlcjsKKyAgICBjYXNlIDk0OToKKyAgICAgIHJldHVybiAoQ0ZYX0NoYXJNYXAqKSZnX0RlZmF1bHRVSENNYXBwZXI7CisgICAgY2FzZSA5NTA6CisgICAgICByZXR1cm4gKENGWF9DaGFyTWFwKikmZ19EZWZhdWx0QmlnNU1hcHBlcjsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmdfdW5pdHRlc3QuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfd3N0cmluZ191bml0dGVzdC5jcHAKaW5kZXggODQ3ZTVlOC4uYjc1YTZmYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfd3N0cmluZ191bml0dGVzdC5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfd3N0cmluZ191bml0dGVzdC5jcHAKQEAgLTcsMjczICs3LDI3MyBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKIAogVEVTVChmeGNydCwgV2lkZVN0cmluZ09wZXJhdG9yU3Vic2NyaXB0KSB7Ci0gICAgLy8gQ0ZYX1dpZGVTdHJpbmcgaW5jbHVkZXMgdGhlIE5VTCB0ZXJtaW5hdG9yIGZvciBub24tZW1wdHkgc3RyaW5ncy4KLSAgICBDRlhfV2lkZVN0cmluZyBhYmMoTCJhYmMiKTsKLSAgICBFWFBFQ1RfRVEoTCdhJywgYWJjWzBdKTsKLSAgICBFWFBFQ1RfRVEoTCdiJywgYWJjWzFdKTsKLSAgICBFWFBFQ1RfRVEoTCdjJywgYWJjWzJdKTsKLSAgICBFWFBFQ1RfRVEoTCdcMCcsIGFiY1szXSk7CisgIC8vIENGWF9XaWRlU3RyaW5nIGluY2x1ZGVzIHRoZSBOVUwgdGVybWluYXRvciBmb3Igbm9uLWVtcHR5IHN0cmluZ3MuCisgIENGWF9XaWRlU3RyaW5nIGFiYyhMImFiYyIpOworICBFWFBFQ1RfRVEoTCdhJywgYWJjWzBdKTsKKyAgRVhQRUNUX0VRKEwnYicsIGFiY1sxXSk7CisgIEVYUEVDVF9FUShMJ2MnLCBhYmNbMl0pOworICBFWFBFQ1RfRVEoTCdcMCcsIGFiY1szXSk7CiB9CiAKIFRFU1QoZnhjcnQsIFdpZGVTdHJpbmdPcGVyYXRvckxUKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgZW1wdHk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgYShMImEiKTsKLSAgICBDRlhfV2lkZVN0cmluZyBhYmMoTCJceDAxMTBxcSIpOyAgLy8gQ29tZXMgYmVmb3JlIGRlc3BpdGUgZW5kaWFubmVzcy4KLSAgICBDRlhfV2lkZVN0cmluZyBkZWYoTCJceDEwMDFxcSIpOyAgLy8gQ29tZXMgYWZ0ZXIgZGVzcGl0ZSBlbmRpYW5uZXNzLgorICBDRlhfV2lkZVN0cmluZyBlbXB0eTsKKyAgQ0ZYX1dpZGVTdHJpbmcgYShMImEiKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgYWJjKEwiXHgwMTEwcXEiKTsgIC8vIENvbWVzIGJlZm9yZSBkZXNwaXRlIGVuZGlhbm5lc3MuCisgIENGWF9XaWRlU3RyaW5nIGRlZihMIlx4MTAwMXFxIik7ICAvLyBDb21lcyBhZnRlciBkZXNwaXRlIGVuZGlhbm5lc3MuCiAKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBlbXB0eSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGEgPCBhKTsKLSAgICBFWFBFQ1RfRkFMU0UoYWJjIDwgYWJjKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgZW1wdHkpOworICBFWFBFQ1RfRkFMU0UoYSA8IGEpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGRlZik7CiAKLSAgICBFWFBFQ1RfVFJVRShlbXB0eSA8IGEpOwotICAgIEVYUEVDVF9GQUxTRShhIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGEpOworICBFWFBFQ1RfRkFMU0UoYSA8IGVtcHR5KTsKIAotICAgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYWJjKTsKLSAgICBFWFBFQ1RfRkFMU0UoYWJjIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7CiAKLSAgICBFWFBFQ1RfVFJVRShlbXB0eSA8IGRlZik7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlZiA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoZW1wdHkgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgZW1wdHkpOwogCi0gICAgRVhQRUNUX1RSVUUoYSA8IGFiYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGFiYyA8IGEpOworICBFWFBFQ1RfVFJVRShhIDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGEpOwogCi0gICAgRVhQRUNUX1RSVUUoYSA8IGRlZik7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlZiA8IGEpOworICBFWFBFQ1RfVFJVRShhIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGEpOwogCi0gICAgRVhQRUNUX1RSVUUoYWJjIDwgZGVmKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgYWJjKTsKKyAgRVhQRUNUX1RSVUUoYWJjIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGFiYyk7CiB9CiAKIFRFU1QoZnhjcnQsIFdpZGVTdHJpbmdPcGVyYXRvckVRKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgbnVsbF9zdHJpbmc7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworICBDRlhfV2lkZVN0cmluZyBudWxsX3N0cmluZzsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZW1wdHlfc3RyaW5nKEwiIik7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBDRlhfV2lkZVN0cmluZyBlbXB0eV9zdHJpbmcoTCIiKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZyBkZWxldGVkX3N0cmluZyhMImhlbGxvIik7Ci0gICAgZGVsZXRlZF9zdHJpbmcuRGVsZXRlKDAsIDUpOwotICAgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgZGVsZXRlZF9zdHJpbmcoTCJoZWxsbyIpOworICBkZWxldGVkX3N0cmluZy5EZWxldGUoMCwgNSk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZyhMImhlbGxvIik7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgPT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgPT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyA9PSB3aWRlX3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nKEwiaGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nID09IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyA9PSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyA9PSB3aWRlX3N0cmluZyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZ19zYW1lMShMImhlbGxvIik7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmdfc2FtZTEpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX3NhbWUxID09IHdpZGVfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTEoTCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX3NhbWUxID09IHdpZGVfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUyKHdpZGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19zYW1lMik7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfc2FtZTIgPT0gd2lkZV9zdHJpbmcpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZ19zYW1lMih3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX3NhbWUyKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfc2FtZTIgPT0gd2lkZV9zdHJpbmcpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcxKEwiaGUiKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzIoTCJoZWxscCIpOwotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMyhMImhlbGxvZCIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZzEpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZzIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZzMpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzEgPT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzIgPT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzMgPT0gd2lkZV9zdHJpbmcpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzEoTCJoZSIpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzIoTCJoZWxscCIpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzMoTCJoZWxsb2QiKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZzIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmczKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMSA9PSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzIgPT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmczID09IHdpZGVfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyBudWxsX3N0cmluZ19jOwotICAgIENGWF9XaWRlU3RyaW5nQyBlbXB0eV9zdHJpbmdfYyhMIiIpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBlbXB0eV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nX2MgPT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nX2MgPT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIG51bGxfc3RyaW5nX2M7CisgIENGWF9XaWRlU3RyaW5nQyBlbXB0eV9zdHJpbmdfYyhMIiIpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nX2MgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nX2MgPT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IGRlbGV0ZWRfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jX3NhbWUxKEwiaGVsbG8iKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jX3NhbWUxID09IHdpZGVfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTEoTCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfY19zYW1lMSA9PSB3aWRlX3N0cmluZyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzEoTCJoZSIpOwotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMihMImhlbGxwIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MzKEwiaGVsbG9kIik7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX2MxKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmdfYzIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19jMyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MxID09IHdpZGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYzIgPT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMyA9PSB3aWRlX3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMShMImhlIik7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMihMImhlbGxwIik7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMyhMImhlbGxvZCIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmdfYzEpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmdfYzIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmdfYzMpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYzEgPT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYzIgPT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYzMgPT0gd2lkZV9zdHJpbmcpOwogCi0gICAgY29uc3Qgd2NoYXJfdCogY19udWxsX3N0cmluZyA9IG51bGxwdHI7Ci0gICAgY29uc3Qgd2NoYXJfdCogY19lbXB0eV9zdHJpbmcgPSBMIiI7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoY19udWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoY19udWxsX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworICBjb25zdCB3Y2hhcl90KiBjX251bGxfc3RyaW5nID0gbnVsbHB0cjsKKyAgY29uc3Qgd2NoYXJfdCogY19lbXB0eV9zdHJpbmcgPSBMIiI7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19udWxsX3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19udWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwogCi0gICAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmdfc2FtZTEgPSBMImhlbGxvIjsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSBjX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmdfc2FtZTEgPT0gd2lkZV9zdHJpbmcpOworICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZ19zYW1lMSA9IEwiaGVsbG8iOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSBjX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nX3NhbWUxID09IHdpZGVfc3RyaW5nKTsKIAotICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMSA9IEwiaGUiOwotICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMiA9IEwiaGVsbHAiOwotICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMyA9IEwiaGVsbG9kIjsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gY19zdHJpbmcxKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gY19zdHJpbmcyKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gY19zdHJpbmczKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19zdHJpbmcxID09IHdpZGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19zdHJpbmcyID09IHdpZGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19zdHJpbmczID09IHdpZGVfc3RyaW5nKTsKKyAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcxID0gTCJoZSI7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMiA9IEwiaGVsbHAiOworICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzMgPSBMImhlbGxvZCI7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSBjX3N0cmluZzEpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gY19zdHJpbmcyKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IGNfc3RyaW5nMyk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzEgPT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmcyID09IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMyA9PSB3aWRlX3N0cmluZyk7CiB9CiAKIFRFU1QoZnhjcnQsIFdpZGVTdHJpbmdPcGVyYXRvck5FKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgbnVsbF9zdHJpbmc7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgbnVsbF9zdHJpbmc7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZyBlbXB0eV9zdHJpbmcoTCIiKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nIGVtcHR5X3N0cmluZyhMIiIpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIGRlbGV0ZWRfc3RyaW5nKEwiaGVsbG8iKTsKLSAgICBkZWxldGVkX3N0cmluZy5EZWxldGUoMCwgNSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nIGRlbGV0ZWRfc3RyaW5nKEwiaGVsbG8iKTsKKyAgZGVsZXRlZF9zdHJpbmcuRGVsZXRlKDAsIDUpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZyhMImhlbGxvIik7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgIT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyAhPSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgIT0gd2lkZV9zdHJpbmcpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZyhMImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nICE9IHdpZGVfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUxKEwiaGVsbG8iKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfc2FtZTEpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19zYW1lMSAhPSB3aWRlX3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUxKEwiaGVsbG8iKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUyKHdpZGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfc2FtZTIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19zYW1lMiAhPSB3aWRlX3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUyKHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX3NhbWUyKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX3NhbWUyICE9IHdpZGVfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMShMImhlIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcyKEwiaGVsbHAiKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzMoTCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZzEpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nMik7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmczKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZzEgIT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nMiAhPSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmczICE9IHdpZGVfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcxKEwiaGUiKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcyKEwiaGVsbHAiKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmczKEwiaGVsbG9kIik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nMSk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nMik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nMyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nMSAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nMiAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nMyAhPSB3aWRlX3N0cmluZyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZ0MgbnVsbF9zdHJpbmdfYzsKLSAgICBDRlhfV2lkZVN0cmluZ0MgZW1wdHlfc3RyaW5nX2MoTCIiKTsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IG51bGxfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBudWxsX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZ19jICE9IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nX2MgIT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZ19jICE9IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZ19jICE9IGVtcHR5X3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nQyBudWxsX3N0cmluZ19jOworICBDRlhfV2lkZVN0cmluZ0MgZW1wdHlfc3RyaW5nX2MoTCIiKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IG51bGxfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IG51bGxfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGVtcHR5X3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IG51bGxfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmdfYyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmdfYyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZ19jICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmdfYyAhPSBlbXB0eV9zdHJpbmcpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTEoTCJoZWxsbyIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfY19zYW1lMSAhPSB3aWRlX3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jX3NhbWUxKEwiaGVsbG8iKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX2Nfc2FtZTEpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfY19zYW1lMSAhPSB3aWRlX3N0cmluZyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzEoTCJoZSIpOwotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMihMImhlbGxwIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MzKEwiaGVsbG9kIik7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfYzEpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX2MyKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZ19jMyk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYzEgIT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MyICE9IHdpZGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMyAhPSB3aWRlX3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMShMImhlIik7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMihMImhlbGxwIik7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMyhMImhlbGxvZCIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZ19jMSk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX2MyKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfYzMpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMSAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MyICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYzMgIT0gd2lkZV9zdHJpbmcpOwogCi0gICAgY29uc3Qgd2NoYXJfdCogY19udWxsX3N0cmluZyA9IG51bGxwdHI7Ci0gICAgY29uc3Qgd2NoYXJfdCogY19lbXB0eV9zdHJpbmcgPSBMIiI7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBjX2VtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBjX251bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gY19udWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfZW1wdHlfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19lbXB0eV9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBjb25zdCB3Y2hhcl90KiBjX251bGxfc3RyaW5nID0gbnVsbHB0cjsKKyAgY29uc3Qgd2NoYXJfdCogY19lbXB0eV9zdHJpbmcgPSBMIiI7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBjX2VtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNfbnVsbF9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19lbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19lbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNfbnVsbF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19lbXB0eV9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwogCi0gICAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmdfc2FtZTEgPSBMImhlbGxvIjsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgIT0gY19zdHJpbmdfc2FtZTEpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZ19zYW1lMSAhPSB3aWRlX3N0cmluZyk7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nX3NhbWUxID0gTCJoZWxsbyI7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyAhPSBjX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZ19zYW1lMSAhPSB3aWRlX3N0cmluZyk7CiAKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzEgPSBMImhlIjsKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzIgPSBMImhlbGxwIjsKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzMgPSBMImhlbGxvZCI7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gY19zdHJpbmcxKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSBjX3N0cmluZzIpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IGNfc3RyaW5nMyk7Ci0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmcxICE9IHdpZGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShjX3N0cmluZzIgIT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMyAhPSB3aWRlX3N0cmluZyk7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMSA9IEwiaGUiOworICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzIgPSBMImhlbGxwIjsKKyAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmczID0gTCJoZWxsb2QiOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSBjX3N0cmluZzEpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSBjX3N0cmluZzIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSBjX3N0cmluZzMpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZzEgIT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZzIgIT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZzMgIT0gd2lkZV9zdHJpbmcpOwogfQogCiBURVNUKGZ4Y3J0LCBXaWRlU3RyaW5nQ29uY2F0SW5QbGFjZSkgewotICAgIENGWF9XaWRlU3RyaW5nIGZyZWQ7Ci0gICAgZnJlZC5Db25jYXRJblBsYWNlKDQsIEwiRlJFRCIpOwotICAgIEVYUEVDVF9FUShMIkZSRUQiLCBmcmVkKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgZnJlZDsKKyAgZnJlZC5Db25jYXRJblBsYWNlKDQsIEwiRlJFRCIpOworICBFWFBFQ1RfRVEoTCJGUkVEIiwgZnJlZCk7CiAKLSAgICBmcmVkLkNvbmNhdEluUGxhY2UoMiwgTCJEWSIpOwotICAgIEVYUEVDVF9FUShMIkZSRUREWSIsIGZyZWQpOworICBmcmVkLkNvbmNhdEluUGxhY2UoMiwgTCJEWSIpOworICBFWFBFQ1RfRVEoTCJGUkVERFkiLCBmcmVkKTsKIAotICAgIGZyZWQuRGVsZXRlKDMsIDMpOwotICAgIEVYUEVDVF9FUShMIkZSRSIsIGZyZWQpOworICBmcmVkLkRlbGV0ZSgzLCAzKTsKKyAgRVhQRUNUX0VRKEwiRlJFIiwgZnJlZCk7CiAKLSAgICBmcmVkLkNvbmNhdEluUGxhY2UoMSwgTCJEIik7Ci0gICAgRVhQRUNUX0VRKEwiRlJFRCIsIGZyZWQpOworICBmcmVkLkNvbmNhdEluUGxhY2UoMSwgTCJEIik7CisgIEVYUEVDVF9FUShMIkZSRUQiLCBmcmVkKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIGNvcHkgPSBmcmVkOwotICAgIGZyZWQuQ29uY2F0SW5QbGFjZSgyLCBMIkRZIik7Ci0gICAgRVhQRUNUX0VRKEwiRlJFRERZIiwgZnJlZCk7Ci0gICAgRVhQRUNUX0VRKEwiRlJFRCIsIGNvcHkpOworICBDRlhfV2lkZVN0cmluZyBjb3B5ID0gZnJlZDsKKyAgZnJlZC5Db25jYXRJblBsYWNlKDIsIEwiRFkiKTsKKyAgRVhQRUNUX0VRKEwiRlJFRERZIiwgZnJlZCk7CisgIEVYUEVDVF9FUShMIkZSRUQiLCBjb3B5KTsKIAotICAgIC8vIFRlc3QgaW52YWxpZCBhcmd1bWVudHMuCi0gICAgY29weSA9IGZyZWQ7Ci0gICAgZnJlZC5Db25jYXRJblBsYWNlKC02LCBMImZyZWRkeSIpOwotICAgIENGWF9XaWRlU3RyaW5nIG5vdF9hbGlhc2VkKEwieHh4eHh4Iik7Ci0gICAgRVhQRUNUX0VRKEwiRlJFRERZIiwgZnJlZCk7Ci0gICAgRVhQRUNUX0VRKEwieHh4eHh4Iiwgbm90X2FsaWFzZWQpOworICAvLyBUZXN0IGludmFsaWQgYXJndW1lbnRzLgorICBjb3B5ID0gZnJlZDsKKyAgZnJlZC5Db25jYXRJblBsYWNlKC02LCBMImZyZWRkeSIpOworICBDRlhfV2lkZVN0cmluZyBub3RfYWxpYXNlZChMInh4eHh4eCIpOworICBFWFBFQ1RfRVEoTCJGUkVERFkiLCBmcmVkKTsKKyAgRVhQRUNUX0VRKEwieHh4eHh4Iiwgbm90X2FsaWFzZWQpOwogfQogCiAjZGVmaW5lIEJ5dGVTdHJpbmdMaXRlcmFsKHN0cikgQ0ZYX0J5dGVTdHJpbmcoRlhfQlNUUkMoc3RyKSkKQEAgLTI4MywxNjAgKzI4MywxNjAgQEAKICAgICBDRlhfV2lkZVN0cmluZyB3czsKICAgICBDRlhfQnl0ZVN0cmluZyBiczsKICAgfSB1dGYxNmxlX2VuY29kZV9jYXNlc1tdID0gewotICAgIHsgTCIiLCBCeXRlU3RyaW5nTGl0ZXJhbCgiXDBcMCIpIH0sCi0gICAgeyBMImFiYyIsIEJ5dGVTdHJpbmdMaXRlcmFsKCJhXDBiXDBjXDBcMFwwIikgfSwKLSAgICB7IEwiYWJjZGVmIiwgQnl0ZVN0cmluZ0xpdGVyYWwoImFcMGJcMGNcMGRcMGVcMGZcMFwwXDAiKSB9LAotICAgIHsgTCJhYmNcMGRlZiIsIEJ5dGVTdHJpbmdMaXRlcmFsKCJhXDBiXDBjXDBcMFwwIikgfSwKLSAgICB7IEwiXHhhYWJiXHhjY2RkIiwgQnl0ZVN0cmluZ0xpdGVyYWwoIlx4YmJceGFhXHhkZFx4Y2NcMFwwIikgfSwKLSAgICB7IEwiXHgzMTMyXHg2MTYyIiwgQnl0ZVN0cmluZ0xpdGVyYWwoIlx4MzJceDMxXHg2Mlx4NjFcMFwwIikgfSwKKyAgICAgIHtMIiIsIEJ5dGVTdHJpbmdMaXRlcmFsKCJcMFwwIil9LAorICAgICAge0wiYWJjIiwgQnl0ZVN0cmluZ0xpdGVyYWwoImFcMGJcMGNcMFwwXDAiKX0sCisgICAgICB7TCJhYmNkZWYiLCBCeXRlU3RyaW5nTGl0ZXJhbCgiYVwwYlwwY1wwZFwwZVwwZlwwXDBcMCIpfSwKKyAgICAgIHtMImFiY1wwZGVmIiwgQnl0ZVN0cmluZ0xpdGVyYWwoImFcMGJcMGNcMFwwXDAiKX0sCisgICAgICB7TCJceGFhYmJceGNjZGQiLCBCeXRlU3RyaW5nTGl0ZXJhbCgiXHhiYlx4YWFceGRkXHhjY1wwXDAiKX0sCisgICAgICB7TCJceDMxMzJceDYxNjIiLCBCeXRlU3RyaW5nTGl0ZXJhbCgiXHgzMlx4MzFceDYyXHg2MVwwXDAiKX0sCiAgIH07CiAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodXRmMTZsZV9lbmNvZGVfY2FzZXMpOyArK2kpIHsKICAgICBFWFBFQ1RfRVEodXRmMTZsZV9lbmNvZGVfY2FzZXNbaV0uYnMsCi0gICAgICAgIHV0ZjE2bGVfZW5jb2RlX2Nhc2VzW2ldLndzLlVURjE2TEVfRW5jb2RlKCkpCisgICAgICAgICAgICAgIHV0ZjE2bGVfZW5jb2RlX2Nhc2VzW2ldLndzLlVURjE2TEVfRW5jb2RlKCkpCiAgICAgICAgIDw8ICIgZm9yIGNhc2UgbnVtYmVyICIgPDwgaTsKICAgfQogfQogCiBURVNUKGZ4Y3J0LCBXaWRlU3RyaW5nQ09wZXJhdG9yU3Vic2NyaXB0KSB7Ci0gICAgLy8gQ0ZYX1dpZGVTdHJpbmdDIGluY2x1ZGVzIHRoZSBOVUwgdGVybWluYXRvciBmb3Igbm9uLWVtcHR5IHN0cmluZ3MuCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIGFiYyhMImFiYyIpOwotICAgIEVYUEVDVF9FUShMJ2EnLCBhYmNbMF0pOwotICAgIEVYUEVDVF9FUShMJ2InLCBhYmNbMV0pOwotICAgIEVYUEVDVF9FUShMJ2MnLCBhYmNbMl0pOwotICAgIEVYUEVDVF9FUShMJ1wwJywgYWJjWzNdKTsKKyAgLy8gQ0ZYX1dpZGVTdHJpbmdDIGluY2x1ZGVzIHRoZSBOVUwgdGVybWluYXRvciBmb3Igbm9uLWVtcHR5IHN0cmluZ3MuCisgIENGWF9XaWRlU3RyaW5nQyBhYmMoTCJhYmMiKTsKKyAgRVhQRUNUX0VRKEwnYScsIGFiY1swXSk7CisgIEVYUEVDVF9FUShMJ2InLCBhYmNbMV0pOworICBFWFBFQ1RfRVEoTCdjJywgYWJjWzJdKTsKKyAgRVhQRUNUX0VRKEwnXDAnLCBhYmNbM10pOwogfQogCiBURVNUKGZ4Y3J0LCBXaWRlU3RyaW5nQ09wZXJhdG9yTFQpIHsKLSAgICBDRlhfV2lkZVN0cmluZ0MgZW1wdHk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIGEoTCJhIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIGFiYyhMIlx4MDExMHFxIik7ICAvLyBDb21lcyBiZWZvcmUgZGVzcGl0ZSBlbmRpYW5uZXNzLgotICAgIENGWF9XaWRlU3RyaW5nQyBkZWYoTCJceDEwMDFxcSIpOyAgLy8gQ29tZXMgYWZ0ZXIgZGVzcGl0ZSBlbmRpYW5uZXNzLgorICBDRlhfV2lkZVN0cmluZ0MgZW1wdHk7CisgIENGWF9XaWRlU3RyaW5nQyBhKEwiYSIpOworICBDRlhfV2lkZVN0cmluZ0MgYWJjKEwiXHgwMTEwcXEiKTsgIC8vIENvbWVzIGJlZm9yZSBkZXNwaXRlIGVuZGlhbm5lc3MuCisgIENGWF9XaWRlU3RyaW5nQyBkZWYoTCJceDEwMDFxcSIpOyAgLy8gQ29tZXMgYWZ0ZXIgZGVzcGl0ZSBlbmRpYW5uZXNzLgogCi0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgZW1wdHkpOwotICAgIEVYUEVDVF9GQUxTRShhIDwgYSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGFiYyA8IGFiYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlZiA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShlbXB0eSA8IGVtcHR5KTsKKyAgRVhQRUNUX0ZBTFNFKGEgPCBhKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBkZWYpOwogCi0gICAgRVhQRUNUX1RSVUUoZW1wdHkgPCBhKTsKLSAgICBFWFBFQ1RfRkFMU0UoYSA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoZW1wdHkgPCBhKTsKKyAgRVhQRUNUX0ZBTFNFKGEgPCBlbXB0eSk7CiAKLSAgICBFWFBFQ1RfVFJVRShlbXB0eSA8IGFiYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGFiYyA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoZW1wdHkgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgZW1wdHkpOwogCi0gICAgRVhQRUNUX1RSVUUoZW1wdHkgPCBkZWYpOwotICAgIEVYUEVDVF9GQUxTRShkZWYgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGVtcHR5KTsKIAotICAgIEVYUEVDVF9UUlVFKGEgPCBhYmMpOwotICAgIEVYUEVDVF9GQUxTRShhYmMgPCBhKTsKKyAgRVhQRUNUX1RSVUUoYSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBhKTsKIAotICAgIEVYUEVDVF9UUlVFKGEgPCBkZWYpOwotICAgIEVYUEVDVF9GQUxTRShkZWYgPCBhKTsKKyAgRVhQRUNUX1RSVUUoYSA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBhKTsKIAotICAgIEVYUEVDVF9UUlVFKGFiYyA8IGRlZik7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlZiA8IGFiYyk7CisgIEVYUEVDVF9UUlVFKGFiYyA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBhYmMpOwogfQogCiBURVNUKGZ4Y3J0LCBXaWRlU3RyaW5nQ09wZXJhdG9yRVEpIHsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYyhMImhlbGxvIik7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MoTCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTEoTCJoZWxsbyIpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfY19zYW1lMSk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfY19zYW1lMSA9PSB3aWRlX3N0cmluZ19jKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTEoTCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX2Nfc2FtZTEpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jX3NhbWUxID09IHdpZGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTIod2lkZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jX3NhbWUyKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jX3NhbWUyID09IHdpZGVfc3RyaW5nX2MpOworICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfY19zYW1lMih3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jX3NhbWUyKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfY19zYW1lMiA9PSB3aWRlX3N0cmluZ19jKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMShMImhlIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MyKEwiaGVsbHAiKTsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzMoTCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfYzIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX2MzKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYzEgPT0gd2lkZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MyID09IHdpZGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMyA9PSB3aWRlX3N0cmluZ19jKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MxKEwiaGUiKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MyKEwiaGVsbHAiKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MzKEwiaGVsbG9kIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX2MxKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfYzIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jMyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMSA9PSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MyID09IHdpZGVfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYzMgPT0gd2lkZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZ19zYW1lMShMImhlbGxvIik7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfc2FtZTEgPT0gd2lkZV9zdHJpbmdfYyk7CisgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUxKEwiaGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX3NhbWUxID09IHdpZGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcxKEwiaGUiKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzIoTCJoZWxscCIpOwotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMyhMImhlbGxvZCIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmcyKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZzMpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzEgPT0gd2lkZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMiA9PSB3aWRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmczID09IHdpZGVfc3RyaW5nX2MpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzEoTCJoZSIpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzIoTCJoZWxscCIpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzMoTCJoZWxsb2QiKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmcxKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmcyKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmczKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMSA9PSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMiA9PSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMyA9PSB3aWRlX3N0cmluZ19jKTsKIAotICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nX3NhbWUxID0gTCJoZWxsbyI7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSBjX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmdfc2FtZTEgPT0gd2lkZV9zdHJpbmdfYyk7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nX3NhbWUxID0gTCJoZWxsbyI7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgPT0gY19zdHJpbmdfc2FtZTEpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZ19zYW1lMSA9PSB3aWRlX3N0cmluZ19jKTsKIAotICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMSA9IEwiaGUiOwotICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMiA9IEwiaGVsbHAiOwotICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMyA9IEwiaGVsbG9kIjsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSBjX3N0cmluZzEpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IGNfc3RyaW5nMik7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gY19zdHJpbmczKTsKKyAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcxID0gTCJoZSI7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMiA9IEwiaGVsbHAiOworICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzMgPSBMImhlbGxvZCI7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IGNfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IGNfc3RyaW5nMik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IGNfc3RyaW5nMyk7CiAKLSAgICBFWFBFQ1RfRkFMU0UoY19zdHJpbmcxID09IHdpZGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gd2lkZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMyA9PSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMSA9PSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMiA9PSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMyA9PSB3aWRlX3N0cmluZ19jKTsKIH0KIAogVEVTVChmeGNydCwgV2lkZVN0cmluZ0NPcGVyYXRvck5FKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MoTCJoZWxsbyIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2MpOworICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYyhMImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTEoTCJoZWxsbyIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2Nfc2FtZTEpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jX3NhbWUxICE9IHdpZGVfc3RyaW5nX2MpOworICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfY19zYW1lMShMImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2Nfc2FtZTEpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfY19zYW1lMSAhPSB3aWRlX3N0cmluZ19jKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jX3NhbWUyKHdpZGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2Nfc2FtZTIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jX3NhbWUyICE9IHdpZGVfc3RyaW5nX2MpOworICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfY19zYW1lMih3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmdfY19zYW1lMik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jX3NhbWUyICE9IHdpZGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MxKEwiaGUiKTsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzIoTCJoZWxscCIpOwotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMyhMImhlbGxvZCIpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmdfYzEpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmdfYzIpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmdfYzMpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MxICE9IHdpZGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MyICE9IHdpZGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MzICE9IHdpZGVfc3RyaW5nX2MpOworICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzEoTCJoZSIpOworICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzIoTCJoZWxscCIpOworICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzMoTCJoZWxsb2QiKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19jMSk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmdfYzIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2MzKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYzEgIT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MyICE9IHdpZGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMyAhPSB3aWRlX3N0cmluZ19jKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUxKEwiaGVsbG8iKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nX2MpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZ19zYW1lMShMImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcxKEwiaGUiKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzIoTCJoZWxscCIpOwotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMyhMImhlbGxvZCIpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmcxKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nMik7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZzMpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nMSAhPSB3aWRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZzIgIT0gd2lkZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmczICE9IHdpZGVfc3RyaW5nX2MpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzEoTCJoZSIpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzIoTCJoZWxscCIpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzMoTCJoZWxsb2QiKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZzEpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nMik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmczKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcxICE9IHdpZGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZzIgIT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nMyAhPSB3aWRlX3N0cmluZ19jKTsKIAotICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nX3NhbWUxID0gTCJoZWxsbyI7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgIT0gY19zdHJpbmdfc2FtZTEpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZ19zYW1lMSAhPSB3aWRlX3N0cmluZ19jKTsKKyAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmdfc2FtZTEgPSBMImhlbGxvIjsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgIT0gY19zdHJpbmdfc2FtZTEpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmdfc2FtZTEgIT0gd2lkZV9zdHJpbmdfYyk7CiAKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzEgPSBMImhlIjsKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzIgPSBMImhlbGxwIjsKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzMgPSBMImhlbGxvZCI7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSBjX3N0cmluZzEpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gY19zdHJpbmcyKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IGNfc3RyaW5nMyk7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMSA9IEwiaGUiOworICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzIgPSBMImhlbGxwIjsKKyAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmczID0gTCJoZWxsb2QiOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IGNfc3RyaW5nMSk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gY19zdHJpbmcyKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSBjX3N0cmluZzMpOwogCi0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmcxICE9IHdpZGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMiAhPSB3aWRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShjX3N0cmluZzMgIT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMSAhPSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmcyICE9IHdpZGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZzMgIT0gd2lkZV9zdHJpbmdfYyk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9leHRlbnNpb24uY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcAppbmRleCA0NDU3MzE3Li4xZWEwNTU3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9leHRlbnNpb24uY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5jcHAKQEAgLTEzLDIwMyArMTMsMTk5IEBACiAjaW5jbHVkZSA8Y3RpbWU+CiAjZW5kaWYKIAotSUZYX0ZpbGVBY2Nlc3MqIEZYX0NyZWF0ZURlZmF1bHRGaWxlQWNjZXNzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYXRoKQotewotCWlmICh3c1BhdGguR2V0TGVuZ3RoKCkgPT0gMCkKLQkJcmV0dXJuIE5VTEw7CitJRlhfRmlsZUFjY2VzcyogRlhfQ3JlYXRlRGVmYXVsdEZpbGVBY2Nlc3MoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhdGgpIHsKKyAgaWYgKHdzUGF0aC5HZXRMZW5ndGgoKSA9PSAwKQorICAgIHJldHVybiBOVUxMOwogCi0JQ0ZYX0NSVEZpbGVBY2Nlc3MqIHBGQSA9IE5VTEw7Ci0JcEZBID0gRlhfTkVXIENGWF9DUlRGaWxlQWNjZXNzOwotCWlmIChOVUxMID09IHBGQSkgcmV0dXJuIE5VTEw7CisgIENGWF9DUlRGaWxlQWNjZXNzKiBwRkEgPSBOVUxMOworICBwRkEgPSBGWF9ORVcgQ0ZYX0NSVEZpbGVBY2Nlc3M7CisgIGlmIChOVUxMID09IHBGQSkKKyAgICByZXR1cm4gTlVMTDsKIAotCXBGQS0+SW5pdCh3c1BhdGgpOwotCXJldHVybiBwRkE7CisgIHBGQS0+SW5pdCh3c1BhdGgpOworICByZXR1cm4gcEZBOwogfQotSUZYX0ZpbGVTdHJlYW0qIEZYX0NyZWF0ZUZpbGVTdHJlYW0oY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIEZYX0RXT1JEIGR3TW9kZXMpCi17Ci0gICAgSUZYQ1JUX0ZpbGVBY2Nlc3MqIHBGQSA9IEZYQ1JUX0ZpbGVBY2Nlc3NfQ3JlYXRlKCk7Ci0gICAgaWYgKCFwRkEpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghcEZBLT5PcGVuKGZpbGVuYW1lLCBkd01vZGVzKSkgewotICAgICAgICBwRkEtPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBGWF9ORVcgQ0ZYX0NSVEZpbGVTdHJlYW0ocEZBKTsKK0lGWF9GaWxlU3RyZWFtKiBGWF9DcmVhdGVGaWxlU3RyZWFtKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBkd01vZGVzKSB7CisgIElGWENSVF9GaWxlQWNjZXNzKiBwRkEgPSBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpOworICBpZiAoIXBGQSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghcEZBLT5PcGVuKGZpbGVuYW1lLCBkd01vZGVzKSkgeworICAgIHBGQS0+UmVsZWFzZSgpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBGWF9ORVcgQ0ZYX0NSVEZpbGVTdHJlYW0ocEZBKTsKIH0KLUlGWF9GaWxlU3RyZWFtKiBGWF9DcmVhdGVGaWxlU3RyZWFtKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSwgRlhfRFdPUkQgZHdNb2RlcykKLXsKLSAgICBJRlhDUlRfRmlsZUFjY2VzcyogcEZBID0gRlhDUlRfRmlsZUFjY2Vzc19DcmVhdGUoKTsKLSAgICBpZiAoIXBGQSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFwRkEtPk9wZW4oZmlsZW5hbWUsIGR3TW9kZXMpKSB7Ci0gICAgICAgIHBGQS0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIEZYX05FVyBDRlhfQ1JURmlsZVN0cmVhbShwRkEpOworSUZYX0ZpbGVTdHJlYW0qIEZYX0NyZWF0ZUZpbGVTdHJlYW0oY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdNb2RlcykgeworICBJRlhDUlRfRmlsZUFjY2VzcyogcEZBID0gRlhDUlRfRmlsZUFjY2Vzc19DcmVhdGUoKTsKKyAgaWYgKCFwRkEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoIXBGQS0+T3BlbihmaWxlbmFtZSwgZHdNb2RlcykpIHsKKyAgICBwRkEtPlJlbGVhc2UoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gRlhfTkVXIENGWF9DUlRGaWxlU3RyZWFtKHBGQSk7CiB9Ci1JRlhfRmlsZVdyaXRlKiBGWF9DcmVhdGVGaWxlV3JpdGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIEZYX0NyZWF0ZUZpbGVTdHJlYW0oZmlsZW5hbWUsIEZYX0ZJTEVNT0RFX1RydW5jYXRlKTsKK0lGWF9GaWxlV3JpdGUqIEZYX0NyZWF0ZUZpbGVXcml0ZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSkgeworICByZXR1cm4gRlhfQ3JlYXRlRmlsZVN0cmVhbShmaWxlbmFtZSwgRlhfRklMRU1PREVfVHJ1bmNhdGUpOwogfQotSUZYX0ZpbGVXcml0ZSogRlhfQ3JlYXRlRmlsZVdyaXRlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gRlhfQ3JlYXRlRmlsZVN0cmVhbShmaWxlbmFtZSwgRlhfRklMRU1PREVfVHJ1bmNhdGUpOworSUZYX0ZpbGVXcml0ZSogRlhfQ3JlYXRlRmlsZVdyaXRlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSkgeworICByZXR1cm4gRlhfQ3JlYXRlRmlsZVN0cmVhbShmaWxlbmFtZSwgRlhfRklMRU1PREVfVHJ1bmNhdGUpOwogfQotSUZYX0ZpbGVSZWFkKiBGWF9DcmVhdGVGaWxlUmVhZChjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gRlhfQ3JlYXRlRmlsZVN0cmVhbShmaWxlbmFtZSwgRlhfRklMRU1PREVfUmVhZE9ubHkpOworSUZYX0ZpbGVSZWFkKiBGWF9DcmVhdGVGaWxlUmVhZChjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSkgeworICByZXR1cm4gRlhfQ3JlYXRlRmlsZVN0cmVhbShmaWxlbmFtZSwgRlhfRklMRU1PREVfUmVhZE9ubHkpOwogfQotSUZYX0ZpbGVSZWFkKiBGWF9DcmVhdGVGaWxlUmVhZChjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIEZYX0NyZWF0ZUZpbGVTdHJlYW0oZmlsZW5hbWUsIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KTsKK0lGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lKSB7CisgIHJldHVybiBGWF9DcmVhdGVGaWxlU3RyZWFtKGZpbGVuYW1lLCBGWF9GSUxFTU9ERV9SZWFkT25seSk7CiB9Ci1JRlhfTWVtb3J5U3RyZWFtKiBGWF9DcmVhdGVNZW1vcnlTdHJlYW0odWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IGR3U2l6ZSwgRlhfQk9PTCBiVGFrZU92ZXIpCi17Ci0gICAgcmV0dXJuIEZYX05FVyBDRlhfTWVtb3J5U3RyZWFtKHBCdWZmZXIsIGR3U2l6ZSwgYlRha2VPdmVyKTsKK0lGWF9NZW1vcnlTdHJlYW0qIEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSh1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkd1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVGFrZU92ZXIpIHsKKyAgcmV0dXJuIEZYX05FVyBDRlhfTWVtb3J5U3RyZWFtKHBCdWZmZXIsIGR3U2l6ZSwgYlRha2VPdmVyKTsKIH0KLUlGWF9NZW1vcnlTdHJlYW0qIEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShGWF9CT09MIGJDb25zZWN1dGl2ZSkKLXsKLSAgICByZXR1cm4gRlhfTkVXIENGWF9NZW1vcnlTdHJlYW0oYkNvbnNlY3V0aXZlKTsKK0lGWF9NZW1vcnlTdHJlYW0qIEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShGWF9CT09MIGJDb25zZWN1dGl2ZSkgeworICByZXR1cm4gRlhfTkVXIENGWF9NZW1vcnlTdHJlYW0oYkNvbnNlY3V0aXZlKTsKIH0KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKLUZYX0ZMT0FUIEZYU1lTX3RhbihGWF9GTE9BVCBhKQotewotICAgIHJldHVybiAoRlhfRkxPQVQpdGFuKGEpOworRlhfRkxPQVQgRlhTWVNfdGFuKEZYX0ZMT0FUIGEpIHsKKyAgcmV0dXJuIChGWF9GTE9BVCl0YW4oYSk7CiB9Ci1GWF9GTE9BVCBGWFNZU19sb2diKEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIHgpCi17Ci0gICAgcmV0dXJuIEZYU1lTX2xvZyh4KSAvIEZYU1lTX2xvZyhiKTsKK0ZYX0ZMT0FUIEZYU1lTX2xvZ2IoRlhfRkxPQVQgYiwgRlhfRkxPQVQgeCkgeworICByZXR1cm4gRlhTWVNfbG9nKHgpIC8gRlhTWVNfbG9nKGIpOwogfQotRlhfRkxPQVQgRlhTWVNfc3RydG9mKGNvbnN0IEZYX0NIQVIqIHBjc1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBpbnQzMl90ICpwVXNlZExlbikKLXsKLSAgICBGWFNZU19hc3NlcnQocGNzU3RyICE9IE5VTEwpOwotICAgIGlmIChpTGVuZ3RoIDwgMCkgewotICAgICAgICBpTGVuZ3RoID0gKGludDMyX3QpRlhTWVNfc3RybGVuKHBjc1N0cik7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHdzID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwY3NTdHIsIGlMZW5ndGgpOwotICAgIHJldHVybiBGWFNZU193Y3N0b2Yod3MuY19zdHIoKSwgaUxlbmd0aCwgcFVzZWRMZW4pOworRlhfRkxPQVQgRlhTWVNfc3RydG9mKGNvbnN0IEZYX0NIQVIqIHBjc1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFVzZWRMZW4pIHsKKyAgRlhTWVNfYXNzZXJ0KHBjc1N0ciAhPSBOVUxMKTsKKyAgaWYgKGlMZW5ndGggPCAwKSB7CisgICAgaUxlbmd0aCA9IChpbnQzMl90KUZYU1lTX3N0cmxlbihwY3NTdHIpOworICB9CisgIENGWF9XaWRlU3RyaW5nIHdzID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwY3NTdHIsIGlMZW5ndGgpOworICByZXR1cm4gRlhTWVNfd2NzdG9mKHdzLmNfc3RyKCksIGlMZW5ndGgsIHBVc2VkTGVuKTsKIH0KLUZYX0ZMT0FUIEZYU1lTX3djc3RvZihjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIGludDMyX3QgKnBVc2VkTGVuKQotewotICAgIEZYU1lTX2Fzc2VydChwd3NTdHIgIT0gTlVMTCk7Ci0gICAgaWYgKGlMZW5ndGggPCAwKSB7Ci0gICAgICAgIGlMZW5ndGggPSAoaW50MzJfdClGWFNZU193Y3NsZW4ocHdzU3RyKTsKLSAgICB9Ci0gICAgaWYgKGlMZW5ndGggPT0gMCkgewotICAgICAgICByZXR1cm4gMC4wZjsKLSAgICB9Ci0gICAgaW50MzJfdCBpVXNlZExlbiA9IDA7Ci0gICAgRlhfQk9PTCBiTmVndGl2ZSA9IEZBTFNFOwotICAgIHN3aXRjaCAocHdzU3RyW2lVc2VkTGVuXSkgewotICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgIGJOZWd0aXZlID0gVFJVRTsKLSAgICAgICAgY2FzZSAnKyc6Ci0gICAgICAgICAgICBpVXNlZExlbisrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IDAuMGY7Ci0gICAgd2hpbGUgKGlVc2VkTGVuIDwgaUxlbmd0aCkgewotICAgICAgICBGWF9XQ0hBUiB3Y2ggPSBwd3NTdHJbaVVzZWRMZW5dOwotICAgICAgICBpZiAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpIHsKLSAgICAgICAgICAgIGZWYWx1ZSA9IGZWYWx1ZSAqIDEwLjBmICsgKHdjaCAtIEwnMCcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaVVzZWRMZW4rKzsKLSAgICB9Ci0gICAgaWYgKGlVc2VkTGVuIDwgaUxlbmd0aCAmJiBwd3NTdHJbaVVzZWRMZW5dID09IEwnLicpIHsKLSAgICAgICAgRlhfRkxPQVQgZlByZWNpc2UgPSAwLjFmOwotICAgICAgICB3aGlsZSAoKytpVXNlZExlbiA8IGlMZW5ndGgpIHsKLSAgICAgICAgICAgIEZYX1dDSEFSIHdjaCA9IHB3c1N0cltpVXNlZExlbl07Ci0gICAgICAgICAgICBpZiAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpIHsKLSAgICAgICAgICAgICAgICBmVmFsdWUgKz0gKHdjaCAtIEwnMCcpICogZlByZWNpc2U7Ci0gICAgICAgICAgICAgICAgZlByZWNpc2UgKj0gMC4xZjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBVc2VkTGVuKSB7Ci0gICAgICAgICpwVXNlZExlbiA9IGlVc2VkTGVuOwotICAgIH0KLSAgICByZXR1cm4gYk5lZ3RpdmUgPyAtZlZhbHVlIDogZlZhbHVlOwotfQotRlhfV0NIQVIqIEZYU1lTX3djc25jcHkoRlhfV0NIQVIqIGRzdFN0ciwgY29uc3QgRlhfV0NIQVIqIHNyY1N0ciwgc2l6ZV90IGNvdW50KQotewotICAgIEZYU1lTX2Fzc2VydChkc3RTdHIgIT0gTlVMTCAmJiBzcmNTdHIgIT0gTlVMTCAmJiBjb3VudCA+IDApOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKLSAgICAgICAgaWYgKChkc3RTdHJbaV0gPSBzcmNTdHJbaV0pID09IEwnXDAnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIHJldHVybiBkc3RTdHI7Ci19Ci1pbnQzMl90IEZYU1lTX3djc25pY21wKGNvbnN0IEZYX1dDSEFSKiBzMSwgY29uc3QgRlhfV0NIQVIqIHMyLCBzaXplX3QgY291bnQpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KHMxICE9IE5VTEwgJiYgczIgIT0gTlVMTCAmJiBjb3VudCA+IDApOwotICAgIEZYX1dDSEFSIHdjaDEgPSAwLCB3Y2gyID0gMDsKLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICAgICAgd2NoMSA9IChGWF9XQ0hBUilGWFNZU190b2xvd2VyKCpzMSsrKTsKLSAgICAgICAgd2NoMiA9IChGWF9XQ0hBUilGWFNZU190b2xvd2VyKCpzMisrKTsKLSAgICAgICAgaWYgKHdjaDEgIT0gd2NoMikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHdjaDEgLSB3Y2gyOwotfQotaW50MzJfdCBGWFNZU19zdHJuaWNtcChjb25zdCBGWF9DSEFSKiBzMSwgY29uc3QgRlhfQ0hBUiogczIsIHNpemVfdCBjb3VudCkKLXsKLSAgICBGWFNZU19hc3NlcnQoczEgIT0gTlVMTCAmJiBzMiAhPSBOVUxMICYmIGNvdW50ID4gMCk7Ci0gICAgRlhfQ0hBUiBjaDEgPSAwLCBjaDIgPSAwOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBjaDEgPSAoRlhfQ0hBUilGWFNZU190b2xvd2VyKCpzMSsrKTsKLSAgICAgICAgY2gyID0gKEZYX0NIQVIpRlhTWVNfdG9sb3dlcigqczIrKyk7Ci0gICAgICAgIGlmIChjaDEgIT0gY2gyKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2gxIC0gY2gyOwotfQotRlhfRFdPUkQgRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoLCBGWF9CT09MIGJJZ25vcmVDYXNlKQotewotICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwpOwotICAgIGlmIChpTGVuZ3RoIDwgMCkgewotICAgICAgICBpTGVuZ3RoID0gKGludDMyX3QpRlhTWVNfc3RybGVuKHBTdHIpOwotICAgIH0KLSAgICBjb25zdCBGWF9DSEFSKiBwU3RyRW5kID0gcFN0ciArIGlMZW5ndGg7Ci0gICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IDA7Ci0gICAgaWYgKGJJZ25vcmVDYXNlKSB7Ci0gICAgICAgIHdoaWxlIChwU3RyIDwgcFN0ckVuZCkgewotICAgICAgICAgICAgZHdIYXNoQ29kZSA9IDMxICogZHdIYXNoQ29kZSArIEZYU1lTX3RvbG93ZXIoKnBTdHIrKyk7Ci0gICAgICAgIH0KK0ZYX0ZMT0FUIEZYU1lTX3djc3RvZihjb25zdCBGWF9XQ0hBUiogcHdzU3RyLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwVXNlZExlbikgeworICBGWFNZU19hc3NlcnQocHdzU3RyICE9IE5VTEwpOworICBpZiAoaUxlbmd0aCA8IDApIHsKKyAgICBpTGVuZ3RoID0gKGludDMyX3QpRlhTWVNfd2NzbGVuKHB3c1N0cik7CisgIH0KKyAgaWYgKGlMZW5ndGggPT0gMCkgeworICAgIHJldHVybiAwLjBmOworICB9CisgIGludDMyX3QgaVVzZWRMZW4gPSAwOworICBGWF9CT09MIGJOZWd0aXZlID0gRkFMU0U7CisgIHN3aXRjaCAocHdzU3RyW2lVc2VkTGVuXSkgeworICAgIGNhc2UgJy0nOgorICAgICAgYk5lZ3RpdmUgPSBUUlVFOworICAgIGNhc2UgJysnOgorICAgICAgaVVzZWRMZW4rKzsKKyAgICAgIGJyZWFrOworICB9CisgIEZYX0ZMT0FUIGZWYWx1ZSA9IDAuMGY7CisgIHdoaWxlIChpVXNlZExlbiA8IGlMZW5ndGgpIHsKKyAgICBGWF9XQ0hBUiB3Y2ggPSBwd3NTdHJbaVVzZWRMZW5dOworICAgIGlmICh3Y2ggPj0gTCcwJyAmJiB3Y2ggPD0gTCc5JykgeworICAgICAgZlZhbHVlID0gZlZhbHVlICogMTAuMGYgKyAod2NoIC0gTCcwJyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgd2hpbGUgKHBTdHIgPCBwU3RyRW5kKSB7Ci0gICAgICAgICAgICBkd0hhc2hDb2RlID0gMzEgKiBkd0hhc2hDb2RlICsgKnBTdHIgKys7Ci0gICAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gZHdIYXNoQ29kZTsKKyAgICBpVXNlZExlbisrOworICB9CisgIGlmIChpVXNlZExlbiA8IGlMZW5ndGggJiYgcHdzU3RyW2lVc2VkTGVuXSA9PSBMJy4nKSB7CisgICAgRlhfRkxPQVQgZlByZWNpc2UgPSAwLjFmOworICAgIHdoaWxlICgrK2lVc2VkTGVuIDwgaUxlbmd0aCkgeworICAgICAgRlhfV0NIQVIgd2NoID0gcHdzU3RyW2lVc2VkTGVuXTsKKyAgICAgIGlmICh3Y2ggPj0gTCcwJyAmJiB3Y2ggPD0gTCc5JykgeworICAgICAgICBmVmFsdWUgKz0gKHdjaCAtIEwnMCcpICogZlByZWNpc2U7CisgICAgICAgIGZQcmVjaXNlICo9IDAuMWY7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHBVc2VkTGVuKSB7CisgICAgKnBVc2VkTGVuID0gaVVzZWRMZW47CisgIH0KKyAgcmV0dXJuIGJOZWd0aXZlID8gLWZWYWx1ZSA6IGZWYWx1ZTsKIH0KLUZYX0RXT1JEIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgsIEZYX0JPT0wgYklnbm9yZUNhc2UpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCk7Ci0gICAgaWYgKGlMZW5ndGggPCAwKSB7Ci0gICAgICAgIGlMZW5ndGggPSAoaW50MzJfdClGWFNZU193Y3NsZW4ocFN0cik7CitGWF9XQ0hBUiogRlhTWVNfd2NzbmNweShGWF9XQ0hBUiogZHN0U3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHNyY1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCkgeworICBGWFNZU19hc3NlcnQoZHN0U3RyICE9IE5VTEwgJiYgc3JjU3RyICE9IE5VTEwgJiYgY291bnQgPiAwKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgIGlmICgoZHN0U3RyW2ldID0gc3JjU3RyW2ldKSA9PSBMJ1wwJykgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RyRW5kID0gcFN0ciArIGlMZW5ndGg7Ci0gICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IDA7Ci0gICAgaWYgKGJJZ25vcmVDYXNlKSB7Ci0gICAgICAgIHdoaWxlIChwU3RyIDwgcFN0ckVuZCkgewotICAgICAgICAgICAgZHdIYXNoQ29kZSA9IDEzMTMgKiBkd0hhc2hDb2RlICsgRlhTWVNfdG9sb3dlcigqcFN0cisrKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdoaWxlIChwU3RyIDwgcFN0ckVuZCkgewotICAgICAgICAgICAgZHdIYXNoQ29kZSA9IDEzMTMgKiBkd0hhc2hDb2RlICsgKnBTdHIgKys7Ci0gICAgICAgIH0KKyAgcmV0dXJuIGRzdFN0cjsKK30KK2ludDMyX3QgRlhTWVNfd2NzbmljbXAoY29uc3QgRlhfV0NIQVIqIHMxLCBjb25zdCBGWF9XQ0hBUiogczIsIHNpemVfdCBjb3VudCkgeworICBGWFNZU19hc3NlcnQoczEgIT0gTlVMTCAmJiBzMiAhPSBOVUxMICYmIGNvdW50ID4gMCk7CisgIEZYX1dDSEFSIHdjaDEgPSAwLCB3Y2gyID0gMDsKKyAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgd2NoMSA9IChGWF9XQ0hBUilGWFNZU190b2xvd2VyKCpzMSsrKTsKKyAgICB3Y2gyID0gKEZYX1dDSEFSKUZYU1lTX3RvbG93ZXIoKnMyKyspOworICAgIGlmICh3Y2gxICE9IHdjaDIpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gZHdIYXNoQ29kZTsKKyAgfQorICByZXR1cm4gd2NoMSAtIHdjaDI7Cit9CitpbnQzMl90IEZYU1lTX3N0cm5pY21wKGNvbnN0IEZYX0NIQVIqIHMxLCBjb25zdCBGWF9DSEFSKiBzMiwgc2l6ZV90IGNvdW50KSB7CisgIEZYU1lTX2Fzc2VydChzMSAhPSBOVUxMICYmIHMyICE9IE5VTEwgJiYgY291bnQgPiAwKTsKKyAgRlhfQ0hBUiBjaDEgPSAwLCBjaDIgPSAwOworICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICBjaDEgPSAoRlhfQ0hBUilGWFNZU190b2xvd2VyKCpzMSsrKTsKKyAgICBjaDIgPSAoRlhfQ0hBUilGWFNZU190b2xvd2VyKCpzMisrKTsKKyAgICBpZiAoY2gxICE9IGNoMikgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBjaDEgLSBjaDI7Cit9CitGWF9EV09SRCBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShjb25zdCBGWF9DSEFSKiBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSWdub3JlQ2FzZSkgeworICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMKTsKKyAgaWYgKGlMZW5ndGggPCAwKSB7CisgICAgaUxlbmd0aCA9IChpbnQzMl90KUZYU1lTX3N0cmxlbihwU3RyKTsKKyAgfQorICBjb25zdCBGWF9DSEFSKiBwU3RyRW5kID0gcFN0ciArIGlMZW5ndGg7CisgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSAwOworICBpZiAoYklnbm9yZUNhc2UpIHsKKyAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKKyAgICAgIGR3SGFzaENvZGUgPSAzMSAqIGR3SGFzaENvZGUgKyBGWFNZU190b2xvd2VyKCpwU3RyKyspOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKKyAgICAgIGR3SGFzaENvZGUgPSAzMSAqIGR3SGFzaENvZGUgKyAqcFN0cisrOworICAgIH0KKyAgfQorICByZXR1cm4gZHdIYXNoQ29kZTsKK30KK0ZYX0RXT1JEIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSWdub3JlQ2FzZSkgeworICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMKTsKKyAgaWYgKGlMZW5ndGggPCAwKSB7CisgICAgaUxlbmd0aCA9IChpbnQzMl90KUZYU1lTX3djc2xlbihwU3RyKTsKKyAgfQorICBjb25zdCBGWF9XQ0hBUiogcFN0ckVuZCA9IHBTdHIgKyBpTGVuZ3RoOworICBGWF9EV09SRCBkd0hhc2hDb2RlID0gMDsKKyAgaWYgKGJJZ25vcmVDYXNlKSB7CisgICAgd2hpbGUgKHBTdHIgPCBwU3RyRW5kKSB7CisgICAgICBkd0hhc2hDb2RlID0gMTMxMyAqIGR3SGFzaENvZGUgKyBGWFNZU190b2xvd2VyKCpwU3RyKyspOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKKyAgICAgIGR3SGFzaENvZGUgPSAxMzEzICogZHdIYXNoQ29kZSArICpwU3RyKys7CisgICAgfQorICB9CisgIHJldHVybiBkd0hhc2hDb2RlOwogfQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CkBAIC0yMTcsMTQ4ICsyMTMsMTQ2IEBACiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCi12b2lkKiBGWF9SYW5kb21fTVRfU3RhcnQoRlhfRFdPUkQgZHdTZWVkKQotewotICAgIEZYX0xQTVRSQU5ET01DT05URVhUIHBDb250ZXh0ID0gRlhfQWxsb2MoRlhfTVRSQU5ET01DT05URVhULCAxKTsKLSAgICBwQ29udGV4dC0+bXRbMF0gPSBkd1NlZWQ7Ci0gICAgRlhfRFdPUkQgJmkgPSBwQ29udGV4dC0+bXRpOwotICAgIEZYX0RXT1JEKiBwQnVmID0gcENvbnRleHQtPm10OwotICAgIGZvciAoaSA9IDE7IGkgPCBNVF9OOyBpICsrKSB7Ci0gICAgICAgIHBCdWZbaV0gPSAoMTgxMjQzMzI1M1VMICogKHBCdWZbaSAtIDFdIF4gKHBCdWZbaSAtIDFdID4+IDMwKSkgKyBpKTsKK3ZvaWQqIEZYX1JhbmRvbV9NVF9TdGFydChGWF9EV09SRCBkd1NlZWQpIHsKKyAgRlhfTFBNVFJBTkRPTUNPTlRFWFQgcENvbnRleHQgPSBGWF9BbGxvYyhGWF9NVFJBTkRPTUNPTlRFWFQsIDEpOworICBwQ29udGV4dC0+bXRbMF0gPSBkd1NlZWQ7CisgIEZYX0RXT1JEJiBpID0gcENvbnRleHQtPm10aTsKKyAgRlhfRFdPUkQqIHBCdWYgPSBwQ29udGV4dC0+bXQ7CisgIGZvciAoaSA9IDE7IGkgPCBNVF9OOyBpKyspIHsKKyAgICBwQnVmW2ldID0gKDE4MTI0MzMyNTNVTCAqIChwQnVmW2kgLSAxXSBeIChwQnVmW2kgLSAxXSA+PiAzMCkpICsgaSk7CisgIH0KKyAgcENvbnRleHQtPmJIYXZlU2VlZCA9IFRSVUU7CisgIHJldHVybiBwQ29udGV4dDsKK30KK0ZYX0RXT1JEIEZYX1JhbmRvbV9NVF9HZW5lcmF0ZSh2b2lkKiBwQ29udGV4dCkgeworICBGWFNZU19hc3NlcnQocENvbnRleHQgIT0gTlVMTCk7CisgIEZYX0xQTVRSQU5ET01DT05URVhUIHBNVEMgPSAoRlhfTFBNVFJBTkRPTUNPTlRFWFQpcENvbnRleHQ7CisgIEZYX0RXT1JEIHY7CisgIHN0YXRpYyBGWF9EV09SRCBtYWdbMl0gPSB7MCwgTVRfTWF0cml4X0F9OworICBGWF9EV09SRCYgbXRpID0gcE1UQy0+bXRpOworICBGWF9EV09SRCogcEJ1ZiA9IHBNVEMtPm10OworICBpZiAoKGludCltdGkgPCAwIHx8IG10aSA+PSBNVF9OKSB7CisgICAgaWYgKG10aSA+IE1UX04gJiYgIXBNVEMtPmJIYXZlU2VlZCkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHBDb250ZXh0LT5iSGF2ZVNlZWQgPSBUUlVFOwotICAgIHJldHVybiBwQ29udGV4dDsKLX0KLUZYX0RXT1JEIEZYX1JhbmRvbV9NVF9HZW5lcmF0ZSh2b2lkKiBwQ29udGV4dCkKLXsKLSAgICBGWFNZU19hc3NlcnQocENvbnRleHQgIT0gTlVMTCk7Ci0gICAgRlhfTFBNVFJBTkRPTUNPTlRFWFQgcE1UQyA9IChGWF9MUE1UUkFORE9NQ09OVEVYVClwQ29udGV4dDsKLSAgICBGWF9EV09SRCB2OwotICAgIHN0YXRpYyBGWF9EV09SRCBtYWdbMl0gPSB7MCwgTVRfTWF0cml4X0F9OwotICAgIEZYX0RXT1JEICZtdGkgPSBwTVRDLT5tdGk7Ci0gICAgRlhfRFdPUkQqIHBCdWYgPSBwTVRDLT5tdDsKLSAgICBpZiAoKGludCltdGkgPCAwIHx8IG10aSA+PSBNVF9OKSB7Ci0gICAgICAgIGlmIChtdGkgPiBNVF9OICYmICFwTVRDLT5iSGF2ZVNlZWQpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGtrOwotICAgICAgICBmb3IgKGtrID0gMDsga2sgPCBNVF9OIC0gTVRfTTsga2sgKyspIHsKLSAgICAgICAgICAgIHYgPSAocEJ1Zltra10gJiBNVF9VcHBlcl9NYXNrKSB8IChwQnVmW2trICsgMV0gJiBNVF9Mb3dlcl9NYXNrKTsKLSAgICAgICAgICAgIHBCdWZba2tdID0gcEJ1ZltrayArIE1UX01dIF4gKHYgPj4gMSkgXiBtYWdbdiAmIDFdOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoOyBrayA8IE1UX04gLSAxOyBrayArKykgewotICAgICAgICAgICAgdiA9IChwQnVmW2trXSAmIE1UX1VwcGVyX01hc2spIHwgKHBCdWZba2sgKyAxXSAmIE1UX0xvd2VyX01hc2spOwotICAgICAgICAgICAgcEJ1Zltra10gPSBwQnVmW2trICsgKE1UX00gLSBNVF9OKV0gXiAodiA+PiAxKSBeIG1hZ1t2ICYgMV07Ci0gICAgICAgIH0KLSAgICAgICAgdiA9IChwQnVmW01UX04gLSAxXSAmIE1UX1VwcGVyX01hc2spIHwgKHBCdWZbMF0gJiBNVF9Mb3dlcl9NYXNrKTsKLSAgICAgICAgcEJ1ZltNVF9OIC0gMV0gPSBwQnVmW01UX00gLSAxXSBeICh2ID4+IDEpIF4gbWFnW3YgJiAxXTsKLSAgICAgICAgbXRpID0gMDsKKyAgICBGWF9EV09SRCBrazsKKyAgICBmb3IgKGtrID0gMDsga2sgPCBNVF9OIC0gTVRfTTsga2srKykgeworICAgICAgdiA9IChwQnVmW2trXSAmIE1UX1VwcGVyX01hc2spIHwgKHBCdWZba2sgKyAxXSAmIE1UX0xvd2VyX01hc2spOworICAgICAgcEJ1Zltra10gPSBwQnVmW2trICsgTVRfTV0gXiAodiA+PiAxKSBeIG1hZ1t2ICYgMV07CiAgICAgfQotICAgIHYgPSBwQnVmW210aSArK107Ci0gICAgdiBePSAodiA+PiAxMSk7Ci0gICAgdiBePSAodiA8PCA3KSAmIDB4OWQyYzU2ODBVTDsKLSAgICB2IF49ICh2IDw8IDE1KSAmIDB4ZWZjNjAwMDBVTDsKLSAgICB2IF49ICh2ID4+IDE4KTsKLSAgICByZXR1cm4gdjsKKyAgICBmb3IgKDsga2sgPCBNVF9OIC0gMTsga2srKykgeworICAgICAgdiA9IChwQnVmW2trXSAmIE1UX1VwcGVyX01hc2spIHwgKHBCdWZba2sgKyAxXSAmIE1UX0xvd2VyX01hc2spOworICAgICAgcEJ1Zltra10gPSBwQnVmW2trICsgKE1UX00gLSBNVF9OKV0gXiAodiA+PiAxKSBeIG1hZ1t2ICYgMV07CisgICAgfQorICAgIHYgPSAocEJ1ZltNVF9OIC0gMV0gJiBNVF9VcHBlcl9NYXNrKSB8IChwQnVmWzBdICYgTVRfTG93ZXJfTWFzayk7CisgICAgcEJ1ZltNVF9OIC0gMV0gPSBwQnVmW01UX00gLSAxXSBeICh2ID4+IDEpIF4gbWFnW3YgJiAxXTsKKyAgICBtdGkgPSAwOworICB9CisgIHYgPSBwQnVmW210aSsrXTsKKyAgdiBePSAodiA+PiAxMSk7CisgIHYgXj0gKHYgPDwgNykgJiAweDlkMmM1NjgwVUw7CisgIHYgXj0gKHYgPDwgMTUpICYgMHhlZmM2MDAwMFVMOworICB2IF49ICh2ID4+IDE4KTsKKyAgcmV0dXJuIHY7CiB9Ci12b2lkIEZYX1JhbmRvbV9NVF9DbG9zZSh2b2lkKiBwQ29udGV4dCkKLXsKLSAgICBGWFNZU19hc3NlcnQocENvbnRleHQgIT0gTlVMTCk7Ci0gICAgRlhfRnJlZShwQ29udGV4dCk7Cit2b2lkIEZYX1JhbmRvbV9NVF9DbG9zZSh2b2lkKiBwQ29udGV4dCkgeworICBGWFNZU19hc3NlcnQocENvbnRleHQgIT0gTlVMTCk7CisgIEZYX0ZyZWUocENvbnRleHQpOwogfQotdm9pZCBGWF9SYW5kb21fR2VuZXJhdGVNVChGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpCi17Ci0gICAgRlhfRFdPUkQgZHdTZWVkOwordm9pZCBGWF9SYW5kb21fR2VuZXJhdGVNVChGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpIHsKKyAgRlhfRFdPUkQgZHdTZWVkOwogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBpZiAoIUZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKCZkd1NlZWQsIDEpKSB7Ci0gICAgICAgIEZYX1JhbmRvbV9HZW5lcmF0ZUJhc2UoJmR3U2VlZCwgMSk7Ci0gICAgfQotI2Vsc2UKKyAgaWYgKCFGWF9HZW5lcmF0ZUNyeXB0b1JhbmRvbSgmZHdTZWVkLCAxKSkgewogICAgIEZYX1JhbmRvbV9HZW5lcmF0ZUJhc2UoJmR3U2VlZCwgMSk7Ci0jZW5kaWYKLSAgICB2b2lkKiBwQ29udGV4dCA9IEZYX1JhbmRvbV9NVF9TdGFydChkd1NlZWQpOwotICAgIHdoaWxlIChpQ291bnQgLS0gPiAwKSB7Ci0gICAgICAgICpwQnVmZmVyICsrID0gRlhfUmFuZG9tX01UX0dlbmVyYXRlKHBDb250ZXh0KTsKLSAgICB9Ci0gICAgRlhfUmFuZG9tX01UX0Nsb3NlKHBDb250ZXh0KTsKLX0KLXZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlQmFzZShGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpCi17Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgIFNZU1RFTVRJTUUgc3QxLCBzdDI7Ci0gICAgOjpHZXRTeXN0ZW1UaW1lKCZzdDEpOwotICAgIGRvIHsKLSAgICAgICAgOjpHZXRTeXN0ZW1UaW1lKCZzdDIpOwotICAgIH0gd2hpbGUgKEZYU1lTX21lbWNtcCgmc3QxLCAmc3QyLCBzaXplb2YoU1lTVEVNVElNRSkpID09IDApOwotICAgIEZYX0RXT1JEIGR3SGFzaDEgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QSgoY29uc3QgRlhfQ0hBUiopJnN0MSwgc2l6ZW9mKHN0MSksIFRSVUUpOwotICAgIEZYX0RXT1JEIGR3SGFzaDIgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QSgoY29uc3QgRlhfQ0hBUiopJnN0Miwgc2l6ZW9mKHN0MiksIFRSVUUpOwotICAgIDo6c3JhbmQoKGR3SGFzaDEgPDwgMTYpIHwgKEZYX0RXT1JEKWR3SGFzaDIpOworICB9CiAjZWxzZQotICAgIHRpbWVfdCB0bUxhc3QgPSB0aW1lKE5VTEwpLCB0bUN1cjsKLSAgICB3aGlsZSAoKHRtQ3VyID0gdGltZShOVUxMKSkgPT0gdG1MYXN0KTsKLSAgICA6OnNyYW5kKCh0bUN1ciA8PCAxNikgfCAodG1MYXN0ICYgMHhGRkZGKSk7CisgIEZYX1JhbmRvbV9HZW5lcmF0ZUJhc2UoJmR3U2VlZCwgMSk7CiAjZW5kaWYKLSAgICB3aGlsZSAoaUNvdW50IC0tID4gMCkgewotICAgICAgICAqcEJ1ZmZlciArKyA9IChGWF9EV09SRCkoKDo6cmFuZCgpIDw8IDE2KSB8ICg6OnJhbmQoKSAmIDB4RkZGRikpOwotICAgIH0KKyAgdm9pZCogcENvbnRleHQgPSBGWF9SYW5kb21fTVRfU3RhcnQoZHdTZWVkKTsKKyAgd2hpbGUgKGlDb3VudC0tID4gMCkgeworICAgICpwQnVmZmVyKysgPSBGWF9SYW5kb21fTVRfR2VuZXJhdGUocENvbnRleHQpOworICB9CisgIEZYX1JhbmRvbV9NVF9DbG9zZShwQ29udGV4dCk7CiB9Cit2b2lkIEZYX1JhbmRvbV9HZW5lcmF0ZUJhc2UoRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KSB7CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotRlhfQk9PTCBGWF9HZW5lcmF0ZUNyeXB0b1JhbmRvbShGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpCi17Ci0gICAgSENSWVBUUFJPViBoQ1AgPSBOVUxMOwotICAgIGlmICghOjpDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ1AsIE5VTEwsIE5VTEwsIFBST1ZfUlNBX0ZVTEwsIDApIHx8IGhDUCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgOjpDcnlwdEdlblJhbmRvbShoQ1AsIGlDb3VudCAqIHNpemVvZihGWF9EV09SRCksICh1aW50OF90KilwQnVmZmVyKTsKLSAgICA6OkNyeXB0UmVsZWFzZUNvbnRleHQoaENQLCAwKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLSNlbmRpZgotdm9pZCBGWF9SYW5kb21fR2VuZXJhdGVDcnlwdG8oRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KQotewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBGWF9HZW5lcmF0ZUNyeXB0b1JhbmRvbShwQnVmZmVyLCBpQ291bnQpOworICBTWVNURU1USU1FIHN0MSwgc3QyOworICA6OkdldFN5c3RlbVRpbWUoJnN0MSk7CisgIGRvIHsKKyAgICA6OkdldFN5c3RlbVRpbWUoJnN0Mik7CisgIH0gd2hpbGUgKEZYU1lTX21lbWNtcCgmc3QxLCAmc3QyLCBzaXplb2YoU1lTVEVNVElNRSkpID09IDApOworICBGWF9EV09SRCBkd0hhc2gxID0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKikmc3QxLCBzaXplb2Yoc3QxKSwgVFJVRSk7CisgIEZYX0RXT1JEIGR3SGFzaDIgPQorICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKGNvbnN0IEZYX0NIQVIqKSZzdDIsIHNpemVvZihzdDIpLCBUUlVFKTsKKyAgOjpzcmFuZCgoZHdIYXNoMSA8PCAxNikgfCAoRlhfRFdPUkQpZHdIYXNoMik7CiAjZWxzZQotICAgIEZYX1JhbmRvbV9HZW5lcmF0ZUJhc2UocEJ1ZmZlciwgaUNvdW50KTsKKyAgdGltZV90IHRtTGFzdCA9IHRpbWUoTlVMTCksIHRtQ3VyOworICB3aGlsZSAoKHRtQ3VyID0gdGltZShOVUxMKSkgPT0gdG1MYXN0KQorICAgIDsKKyAgOjpzcmFuZCgodG1DdXIgPDwgMTYpIHwgKHRtTGFzdCAmIDB4RkZGRikpOworI2VuZGlmCisgIHdoaWxlIChpQ291bnQtLSA+IDApIHsKKyAgICAqcEJ1ZmZlcisrID0gKEZYX0RXT1JEKSgoOjpyYW5kKCkgPDwgMTYpIHwgKDo6cmFuZCgpICYgMHhGRkZGKSk7CisgIH0KK30KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCitGWF9CT09MIEZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCkgeworICBIQ1JZUFRQUk9WIGhDUCA9IE5VTEw7CisgIGlmICghOjpDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ1AsIE5VTEwsIE5VTEwsIFBST1ZfUlNBX0ZVTEwsIDApIHx8CisgICAgICBoQ1AgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICA6OkNyeXB0R2VuUmFuZG9tKGhDUCwgaUNvdW50ICogc2l6ZW9mKEZYX0RXT1JEKSwgKHVpbnQ4X3QqKXBCdWZmZXIpOworICA6OkNyeXB0UmVsZWFzZUNvbnRleHQoaENQLCAwKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKK3ZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlQ3J5cHRvKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCkgeworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyAgRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20ocEJ1ZmZlciwgaUNvdW50KTsKKyNlbHNlCisgIEZYX1JhbmRvbV9HZW5lcmF0ZUJhc2UocEJ1ZmZlciwgaUNvdW50KTsKICNlbmRpZgogfQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLXZvaWQgRlhfR1VJRF9DcmVhdGVWNChGWF9MUEdVSUQgcEdVSUQpDQotew0KLSNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8pDQotI2lmZGVmIF9GWF9XSU5BUElfUEFSVElUSU9OX0RFU0tUT1BfDQotICAgIGlmICghRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20oKEZYX0RXT1JEKilwR1VJRCwgNCkpIHsNCi0gICAgICAgIEZYX1JhbmRvbV9HZW5lcmF0ZU1UKChGWF9EV09SRCopcEdVSUQsIDQpOw0KLSAgICB9DQotI2Vsc2UNCi0gICAgRlhfUmFuZG9tX0dlbmVyYXRlTVQoKEZYX0RXT1JEKilwR1VJRCwgNCk7DQotI2VuZGlmDQotI2Vsc2UNCi0gICAgRlhfUmFuZG9tX0dlbmVyYXRlTVQoKEZYX0RXT1JEKilwR1VJRCwgNCk7DQotI2VuZGlmDQotICAgIHVpbnQ4X3QgJmIgPSAoKHVpbnQ4X3QqKXBHVUlEKVs2XTsNCi0gICAgYiA9IChiICYgMHgwRikgfCAweDQwOw0KLX0NCi1jb25zdCBGWF9DSEFSKiBnc19GWF9wSGV4Q2hhcnMgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7DQotdm9pZCBGWF9HVUlEX1RvU3RyaW5nKEZYX0xQQ0dVSUQgcEdVSUQsIENGWF9CeXRlU3RyaW5nICZic1N0ciwgRlhfQk9PTCBiU2VwYXJhdG9yKQ0KLXsNCi0gICAgRlhfQ0hBUiogcEJ1ZiA9IGJzU3RyLkdldEJ1ZmZlcig0MCk7DQotICAgIHVpbnQ4X3QgYjsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkgKyspIHsNCi0gICAgICAgIGIgPSAoKGNvbnN0IHVpbnQ4X3QqKXBHVUlEKVtpXTsNCi0gICAgICAgICpwQnVmICsrID0gZ3NfRlhfcEhleENoYXJzW2IgPj4gNF07DQotICAgICAgICAqcEJ1ZiArKyA9IGdzX0ZYX3BIZXhDaGFyc1tiICYgMHgwRl07DQotICAgICAgICBpZiAoYlNlcGFyYXRvciAmJiAoaSA9PSAzIHx8IGkgPT0gNSB8fCBpID09IDcgfHwgaSA9PSA5KSkgew0KLSAgICAgICAgICAgICpwQnVmICsrID0gTCctJzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBic1N0ci5SZWxlYXNlQnVmZmVyKGJTZXBhcmF0b3IgPyAzNiA6IDMyKTsNCi19DQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLSNlbmRpZg0KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK3ZvaWQgRlhfR1VJRF9DcmVhdGVWNChGWF9MUEdVSUQgcEdVSUQpIHsKKyNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBcCisgICAgIF9GWF9PU18gPT0gX0ZYX1dJTjY0XykKKyNpZmRlZiBfRlhfV0lOQVBJX1BBUlRJVElPTl9ERVNLVE9QXworICBpZiAoIUZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKChGWF9EV09SRCopcEdVSUQsIDQpKSB7CisgICAgRlhfUmFuZG9tX0dlbmVyYXRlTVQoKEZYX0RXT1JEKilwR1VJRCwgNCk7CisgIH0KKyNlbHNlCisgIEZYX1JhbmRvbV9HZW5lcmF0ZU1UKChGWF9EV09SRCopcEdVSUQsIDQpOworI2VuZGlmCisjZWxzZQorICBGWF9SYW5kb21fR2VuZXJhdGVNVCgoRlhfRFdPUkQqKXBHVUlELCA0KTsKKyNlbmRpZgorICB1aW50OF90JiBiID0gKCh1aW50OF90KilwR1VJRClbNl07CisgIGIgPSAoYiAmIDB4MEYpIHwgMHg0MDsKK30KK2NvbnN0IEZYX0NIQVIqIGdzX0ZYX3BIZXhDaGFycyA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKK3ZvaWQgRlhfR1VJRF9Ub1N0cmluZyhGWF9MUENHVUlEIHBHVUlELAorICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBic1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXBhcmF0b3IpIHsKKyAgRlhfQ0hBUiogcEJ1ZiA9IGJzU3RyLkdldEJ1ZmZlcig0MCk7CisgIHVpbnQ4X3QgYjsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIGIgPSAoKGNvbnN0IHVpbnQ4X3QqKXBHVUlEKVtpXTsKKyAgICAqcEJ1ZisrID0gZ3NfRlhfcEhleENoYXJzW2IgPj4gNF07CisgICAgKnBCdWYrKyA9IGdzX0ZYX3BIZXhDaGFyc1tiICYgMHgwRl07CisgICAgaWYgKGJTZXBhcmF0b3IgJiYgKGkgPT0gMyB8fCBpID09IDUgfHwgaSA9PSA3IHx8IGkgPT0gOSkpIHsKKyAgICAgICpwQnVmKysgPSBMJy0nOworICAgIH0KKyAgfQorICBic1N0ci5SZWxlYXNlQnVmZmVyKGJTZXBhcmF0b3IgPyAzNiA6IDMyKTsKK30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF91Y2RkYXRhLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VjZGRhdGEuY3BwCmluZGV4IGU2MzI3NjkuLjhiMzVmMzEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VjZGRhdGEuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VjZGRhdGEuY3BwCkBAIC03LDQxNDAgKzcsMTA5OTYgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCiBleHRlcm4gY29uc3QgRlhfRFdPUkQgZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1s2NTUzNl0gPSB7Ci0gICAgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOGFlNSwgMHhmZmZlOWI1YywgMHhmZmZlOWFkYSwgMHhmZmZlOWIxYSwgMHhmZmZlOWI1YiwgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywKLSAgICAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YjUzLCAweGZmZmU5YjUzLCAweGZmZmU5YjUzLCAweGZmZmU5YWQzLAotICAgIDB4ZmZmZTkzMjMsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwMDIsIDB4ZmZmZWIyNGIsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDksIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMDIsIDB4MDA3ZWIwMDAsIDB4MDBmZWIwMDEsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIyMDgsIDB4ZmZmZWIxYzcsIDB4ZmZmZWIyMGUsIDB4ZmZmZWIxYzcsIDB4ZmZmZWIxYzYsCi0gICAgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYjFjNywgMHhmZmZlYjAwNywgMHgwMTdlYjAwMCwgMHhmZmZlYjAwYiwgMHgwMWZlYjAwMSwgMHhmZmZlYjAwNSwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4MDI3ZWIwMDAsIDB4ZmZmZWIwMDgsIDB4MDJmZWIwMDEsIDB4ZmZmZWIwMGIsIDB4ZmY4MGIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweDAzN2ViMDAwLCAweGZmZmViMDBmLCAweDAzZmViMDAxLCAweGZmZmViMDBiLCAweGZmZmViMjkzLAotICAgIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIzNWQsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsCi0gICAgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywKLSAgICAweGZmZmU5MWMzLCAweGZmZmViMDAwLCAweGZmZmViMjQ5LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDYyLCAweDA0N2ViMDAwLCAweGZmZmViMDBiLCAweGZmZmViMjhmLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNDgsIDB4ZmZmZWIxMjIsIDB4ZmZmZWIxMjIsIDB4ZmZmZWIwMTAsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIxMjIsIDB4ZmZmZWIwNjIsIDB4MDRmZWIwMDEsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMDAsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDIyLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAyMiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMTAsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMTAsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjA2MiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAxMCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTgzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExODMsIDB4ZmZmZWExODMsIDB4ZmZmZWExODMsIDB4ZmZmZWExODMsCi0gICAgMHhmZmZlYTE4MywgMHhmZmZlYTE4MywgMHhmZmZlYTE4MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDA3LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDQ3LCAweGZmZmViMDBmLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDhmLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwOGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwODUsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKLSAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAotICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlZDBjYiwgMHhmZmZlZDBjYiwgMHhmZmZlZDBjYiwgMHhmZmZlZDBjYiwgMHhmZmZlZDE2NCwgMHhmZmZlZDE2NCwgMHhmZmZlZDAwYiwgMHhmZmZlZDAwYiwgMHhmZmZlZDE0YiwgMHhmZmZlZDI0OSwgMHhmZmZlZDI0OSwgMHhmZmZlZDE0OSwgMHhmZmZlZDFjNywgMHhmZmZlZDE0NywgMHhmZmZlZDAwYiwgMHhmZmZlZDAwYiwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVkMTQ1LCAweGZmZmVkMTY0LCAweGZmZmVkMTY0LCAweGZmZmVkMTQ1LCAweGZmZmVkMTQ1LAotICAgIDB4ZmZmZWQxNjQsIDB4ZmZmZWQxNGIsIDB4ZmZmZWI5NGIsIDB4ZmZmZWI5NGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWI5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWI5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWMxNGIsCi0gICAgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwKLSAgICAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWQxNjQsCi0gICAgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDI0OSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVhMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAotICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsCi0gICAgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwKLSAgICAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAotICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsCi0gICAgMHhmZmZlYzE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzE0YiwKLSAgICAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTQ1LCAweGZmZmVjMTRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVkMGNiLCAweGZmZmVkMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWQwMGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsCi0gICAgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwKLSAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmU4MTY0LCAweGZmZmViMjhiLAotICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCi0gICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgxNjQsIDB4ZmZmZTgxNjQsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCi0gICAgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwKLSAgICAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLAotICAgIDB4ZmZmZWQxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsCi0gICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKLSAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAotICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYjE0YiwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwKLSAgICAweGZmZmViMDhhLCAweGZmZmViMDhhLCAweGZmZmViMDhhLCAweGZmZmViMDhhLCAweGZmZmViMDhhLCAweGZmZmViMDhhLCAweGZmZmViMDhhLCAweGZmZmViMDhhLCAweGZmZmViMDhhLCAweGZmZmViMDhhLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAotICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCi0gICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDA3LCAweGZmZmViMDA1LCAweGZmZmViMDhiLCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAotICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCi0gICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA4YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDhiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDhiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAotICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKLSAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAotICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKLSAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAotICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKLSAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAotICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKLSAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAotICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKLSAgICAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCi0gICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OSwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0OSwgMHhmZmZlYjA0YiwgMHhmZmZlYjI0OCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLAotICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKLSAgICAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKLSAgICAweGZmZmU4MDI0LCAweGZmZmViMjQ4LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWEwNTMsCi0gICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYTA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAotICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNDksIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLAotICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIyNDgsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmU4MDI0LCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MCwgMHhmZmZlYjA1MCwgMHhmZmZlYjA1MCwgMHhmZmZlYjA1MCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MCwgMHhmZmZlYjA1MCwgMHhmZmZlYjA0MywgMHhmZmZlYjA1MCwgMHhmZmZlYjA1MCwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0MywgMHhmZmZlYjA0NSwgMHhmZmZlYjA0NSwgMHhmZmZlYjA0NSwKLSAgICAweGZmZmViMDQ1LCAweGZmZmViMDQ1LCAweGZmZmViMDQzLCAweGZmZmViMDRiLCAweGZmZmViMDQ1LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0ZiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHgwNTdlYjAwMCwgMHgwNWZlYjAwMSwgMHgwNjdlYjAwMCwgMHgwNmZlYjAwMSwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRmLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGYsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDUwLCAweGZmZmViMDUwLCAweGZmZmViMDRmLCAweGZmZmViMDUwLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwKLSAgICAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwKLSAgICAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCi0gICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKLSAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAotICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCi0gICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKLSAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAotICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCi0gICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKLSAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAotICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCi0gICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKLSAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAotICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCi0gICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKLSAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAotICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRmLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjMwZiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweDA3N2ViMDAwLCAweDA3ZmViMDAxLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCi0gICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0NCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjI0OCwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAxMCwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwYiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjMwMywgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMWUsIDB4ZmZmZWIwMWUsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywKLSAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKLSAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsCi0gICAgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRmLAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDEwLCAweGZmZmViMDBiLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMDMsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIyOTIsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTk4NTMsIDB4ZmZmZTk4OTMsCi0gICAgMHhmZmZlYjAwZiwgMHhmZmZlYjAwMywgMHhmZmZlYjAwZiwgMHhmZjgyYjAwZiwgMHhmZjg0YjAxMSwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHgwODA2YjAwMCwgMHgwODg4YjAwMiwgMHhmZmZlYjAwMCwgMHhmZmZlYjAwMiwgMHgwOTBhYjAwMCwgMHgwOThjYjAwMSwgMHhmZmZlYjAwMCwgMHhmZmZlYjAwMiwKLSAgICAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBkLCAweGZmZmViMDBkLCAweGZmZmViMDBkLCAweGZmZmViMDBmLCAweGZmZmU5YjFhLCAweGZmZmU5YjVhLCAweGZmZmU5YzUzLCAweGZmZmU5YmQzLCAweGZmZmU5YzkzLCAweGZmZmU5YzEzLCAweGZmZmU5YjkzLCAweGZmZmViMWMzLAotICAgIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNDksIDB4ZmZmZWIwMDksIDB4ZmZmZWIwMDksIDB4ZmZmZWIwMDksIDB4ZmZmZWIwMGIsIDB4MGE3ZWIwMDAsIDB4MGFmZWIwMDEsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMDQsIDB4ZmZmZWIwMDQsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjFjNywgMHgwYjdlYjAwMCwgMHgwYmZlYjAwMSwgMHhmZmZlYjAwNCwgMHhmZmZlYjAwNCwgMHhmZmZlYjAwNCwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBmLCAweGZmZmViMDBiLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBiLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMzBmLAotICAgIDB4ZmZmZWIyOTQsIDB4ZmZmZWIyOGIsIDB4ZmZmZWIyOGIsIDB4ZmZmZWIyOGIsIDB4ZmZmZWIyOGIsIDB4ZmZmZTgyYTQsIDB4ZmZmZTgyYTQsIDB4ZmZmZTgyYTQsIDB4ZmZmZTgyYTQsIDB4ZmZmZTgyYTQsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsCi0gICAgMHhmZmZlYjEwYiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjEyMiwgMHhmZmZlYjEwYiwgMHhmZmZlYjEwYiwgMHhmZmZlYjEwYiwgMHhmZmZlYjEwYiwgMHhmZmZlYjEwYiwgMHhmZmZlYjIwYiwgMHhmZmZlYjIwYiwgMHhmZmZlYjAwYiwgMHgwYzdlYjAwMCwgMHgwY2ZlYjAwMSwgMHhmZmZlYjA2MiwKLSAgICAweGZmZmViMTBiLCAweGZmZmViMTIyLCAweGZmZmViMTIyLCAweGZmZmViMTIyLCAweGZmZmViMTIyLCAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMjBiLCAweGZmZmViMjBiLCAweGZmZmViMDBiLCAweDBkN2ViMDAwLCAweDBkZmViMDAxLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwKLSAgICAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ5LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjE5MywKLSAgICAweGZmZmViMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMTkzLCAweGZmZmViMTkzLCAweGZmZmViMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwOSwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwOSwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDYyLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDA4LCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIyNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweDBlN2ViMDIyLCAweDBlZmViMDBiLCAweDBmN2ViMDBiLCAweDBmZmViMDIyLCAweDEwN2ViMDBiLCAweDEwZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIyMDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIwMGIsIDB4MTE3ZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsCi0gICAgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDExZmViMDIyLCAweDEyN2ViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MTJmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHgxMzdlYjAyMiwgMHgxM2ZlYjAwYiwgMHgxNDdlYjAwYiwgMHgxNGZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDE1N2ViMDIyLCAweDE1ZmViMDIyLCAweDE2N2ViMDIyLCAweDE2ZmViMDIyLCAweDE3N2ViMDBiLCAweDE3ZmViMDBiLCAweDE4N2ViMDIyLCAweDE4ZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDE5N2ViMDIyLCAweDE5ZmViMDIyLAotICAgIDB4MWE3ZWIwMGIsIDB4MWFmZWIwMGIsIDB4MWI3ZWIwMGIsIDB4MWJmZWIwMGIsIDB4MWM3ZWIwMGIsIDB4MWNmZWIwMGIsIDB4MWQ3ZWIwMGIsIDB4MWRmZWIwMGIsIDB4MWU3ZWIwMGIsIDB4MWVmZWIwMGIsIDB4MWY3ZWIwMGIsIDB4MWZmZWIwMGIsIDB4MjA3ZWIwMGIsIDB4MjBmZWIwMGIsIDB4MjE3ZWIwMGIsIDB4MjFmZWIwMGIsCi0gICAgMHgyMjdlYjAwYiwgMHgyMmZlYjAwYiwgMHgyMzdlYjAyMiwgMHgyM2ZlYjAyMiwgMHgyNDdlYjAwYiwgMHgyNGZlYjAwYiwgMHgyNTdlYjAyMiwgMHgyNWZlYjAyMiwgMHgyNjdlYjAwYiwgMHgyNmZlYjAwYiwgMHgyNzdlYjAwYiwgMHgyN2ZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHgyODdlYjAwYiwKLSAgICAweDI4ZmViMDBiLCAweDI5N2ViMDBiLCAweDI5ZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDJhN2ViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MmFmZWIwMGIsIDB4MmI3ZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4MmJmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MmM3ZWIwMGIsIDB4MmNmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MmQ3ZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHgyZGZlYjAwYiwgMHgyZTdlYjAwYiwgMHgyZWZlYjAwYiwgMHgyZjdlYjAwYiwgMHgyZmZlYjAwYiwgMHgzMDdlYjAwYiwgMHgzMGZlYjAwYiwgMHgzMTdlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDMxZmViMDBiLCAweDMyN2ViMDBiLCAweDMyZmViMDBiLCAweDMzN2ViMDBiLCAweDMzZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4MzQ3ZWIwMGIsIDB4MzRmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MzU3ZWIwMGIsIDB4MzVmZWIwMGIsIDB4MzY3ZWIwMGIsIDB4MzZmZWIwMGIsIDB4Mzc3ZWIwMGIsIDB4MzdmZWIwMGIsIDB4Mzg3ZWIwMGIsIDB4MzhmZWIwMGIsIDB4Mzk3ZWIwMGIsIDB4MzlmZWIwMGIsCi0gICAgMHgzYTdlYjAwYiwgMHgzYWZlYjAwYiwgMHgzYjdlYjAwYiwgMHgzYmZlYjAwYiwgMHgzYzdlYjAwYiwgMHgzY2ZlYjAwYiwgMHgzZDdlYjAwYiwgMHgzZGZlYjAwYiwgMHgzZTdlYjAwYiwgMHgzZWZlYjAwYiwgMHgzZjdlYjAwYiwgMHgzZmZlYjAwYiwgMHg0MDdlYjAwYiwgMHg0MGZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweDQxN2ViMDBiLCAweDQxZmViMDBiLCAweDQyN2ViMDBiLCAweDQyZmViMDBiLCAweDQzN2ViMDBiLCAweGZmZmViMDBiLCAweDQzZmViMDBiLCAweDQ0N2ViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDQ0ZmViMDBiLCAweDQ1N2ViMDBiLCAweDQ1ZmViMDBiLCAweDQ2N2ViMDBiLCAweDQ2ZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4NDc3ZWIwMGIsIDB4NDdmZWIwMGIsIDB4NDg3ZWIwMGIsIDB4NDhmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDQ5N2ViMDAwLCAweDQ5ZmViMDAxLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsCi0gICAgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKLSAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAotICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCi0gICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKLSAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAotICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzA0YiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUwMDI0LCAweGZmZmUzMDIyLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMDIsIDB4ZmZmZTMwMDIsIDB4ZmZmZTMwMDIsIDB4ZmZmZTMwMDIsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwNSwgMHhmZmZlMzAwNSwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg0YTdlMzAwMCwgMHg0YWZlMzAwMSwgMHg0YjdlMzAwMCwgMHg0YmZlMzAwMSwgMHg0YzdlMzAwMCwgMHg0Y2ZlMzAwMSwgMHg0ZDdlMzAwMCwgMHg0ZGZlMzAwMSwKLSAgICAweDRlN2UzMDAwLCAweDRlZmUzMDAxLCAweDRmN2UzMDAwLCAweDRmZmUzMDAxLCAweDUwN2UzMDAwLCAweDUwZmUzMDAxLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg1MTdlMzAwYiwgMHg1MWZlMzAwYiwgMHg1MjdlMzAwMCwgMHg1MmZlMzAwMSwgMHhmZmZlMzAwYiwgMHg1MzdlMzAwYiwgMHg1M2ZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDU0N2UzMDBiLCAweDU0ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDU1N2UzMDBiLCAweDU1ZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NTY3ZTMwMGIsIDB4NTZmZTMwMGIsIDB4NTc3ZTMwMGIsIDB4NTdmZTMwMGIsIDB4NTg3ZTMwMDAsIDB4NThmZTMwMDEsIDB4NTk3ZTMwMDAsIDB4NTlmZTMwMDEsIDB4NWE3ZTMwMDAsIDB4NWFmZTMwMDEsIDB4NWI3ZTMwMDAsIDB4NWJmZTMwMDEsIDB4NWM3ZTMwMDAsIDB4NWNmZTMwMDEsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDVkN2UzMDAwLCAweDVkZmUzMDAxLCAweDVlN2UzMDAwLCAweDVlZmUzMDAxLCAweDVmN2UzMDAwLCAweDVmZmUzMDAxLCAweDYwN2UzMDAwLCAweDYwZmUzMDAxLCAweDYxN2UzMDAwLCAweDYxZmUzMDAxLCAweDYyN2UzMDAwLCAweDYyZmUzMDAxLCAweDYzN2UzMDAwLAotICAgIDB4NjNmZTMwMDEsIDB4NjQ3ZTMwMDAsIDB4NjRmZTMwMDEsIDB4NjU3ZTMwMDAsIDB4NjVmZTMwMDEsIDB4NjY3ZTMwMDAsIDB4NjZmZTMwMDEsIDB4Njc3ZTMwMDAsIDB4NjdmZTMwMDEsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDY4N2UzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4NjhmZTMwMGIsIDB4Njk3ZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NjlmZTMwMGIsIDB4NmE3ZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NmFmZTMwMGIsCi0gICAgMHg2YjdlMzAwYiwgMHg2YmZlMzAwYiwgMHg2YzdlMzAwYiwgMHhmZmZlMzAwYiwgMHg2Y2ZlMzAwYiwgMHg2ZDdlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg2ZGZlMzAwMCwgMHg2ZTdlMzAwMSwgMHg2ZWZlMzAwMCwgMHg2ZjdlMzAwMSwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NzA3ZTMwMGIsIDB4NzBmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NzE3ZTMwMDAsIDB4NzFmZTMwMDEsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NzI3ZTMwMGIsIDB4NzJmZTMwMGIsIDB4NzM3ZTMwMGIsIDB4NzNmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg3NDdlMzAwYiwgMHg3NGZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg3NTdlMzAwYiwgMHg3NWZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg3NjdlMzAwYiwgMHg3NmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDc3N2UzMDBiLCAweDc3ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDc4N2UzMDBiLCAweDc4ZmUzMDBiLCAweDc5N2UzMDBiLAotICAgIDB4NzlmZTMwMGIsIDB4N2E3ZTMwMGIsIDB4N2FmZTMwMGIsIDB4N2I3ZTMwMGIsIDB4N2JmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4N2M3ZTMwMGIsIDB4N2NmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHg3ZDdlMzAwYiwgMHg3ZGZlMzAwYiwgMHg3ZTdlMzAwYiwgMHg3ZWZlMzAwYiwgMHg3ZjdlMzAwYiwgMHg3ZmZlMzAwYiwgMHg4MDdlMzAwYiwgMHg4MGZlMzAwYiwgMHg4MTdlMzAwYiwgMHg4MWZlMzAwYiwgMHg4MjdlMzAwYiwgMHg4MmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweDgzN2UzMDBiLCAweDgzZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDg0N2UzMDBiLCAweDg0ZmUzMDBiLCAweDg1N2UzMDBiLCAweDg1ZmUzMDBiLCAweDg2N2UzMDBiLCAweDg2ZmUzMDBiLCAweDg3N2UzMDBiLCAweDg3ZmUzMDBiLCAweGZmZmUzMDBiLCAweDg4N2UzMDBiLAotICAgIDB4ODhmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ODk3ZTMwMGIsIDB4ODlmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4OGE3ZTMwMGIsIDB4OGFmZTMwMGIsIDB4OGI3ZTMwMGIsIDB4OGJmZTMwMGIsIDB4OGM3ZTMwMGIsCi0gICAgMHg4Y2ZlMzAwYiwgMHg4ZDdlMzAwYiwgMHg4ZGZlMzAwYiwgMHg4ZTdlMzAwYiwgMHg4ZWZlMzAwYiwgMHg4ZjdlMzAwYiwgMHg4ZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg5MDdlMzAwYiwgMHg5MGZlMzAwYiwgMHg5MTdlMzAwYiwKLSAgICAweDkxZmUzMDBiLCAweDkyN2UzMDBiLCAweDkyZmUzMDBiLCAweDkzN2UzMDBiLCAweDkzZmUzMDBiLCAweDk0N2UzMDBiLCAweDk0ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDk1N2UzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4OTVmZTMwMGIsIDB4OTY3ZTMwMGIsIDB4OTZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4OTc3ZTMwMGIsIDB4OTdmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg5ODdlMzAwYiwgMHg5OGZlMzAwYiwgMHg5OTdlMzAwYiwgMHg5OWZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwMGYsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmViMDAxLCAweGZmZmViMDAxLCAweDlhN2ViMDAwLCAweDlhZmViMDAxLCAweDliN2ViMDAwLCAweDliZmViMDAxLCAweGZmZmViMDAyLCAweGZmZmViMDAyLCAweGZmZmViMDAyLCAweDljN2ViMDAwLCAweDljZmViMDAxLCAweGZmZmViMDAyLCAweDlkN2ViMDAwLCAweDlkZmViMDAxLCAweGZmZmViMDBmLCAweGZmZmViMDBmLAotICAgIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMDAsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4OWU3ZWIwMDAsIDB4OWVmZWIwMDEsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHg5ZjdlYjAwMCwgMHg5ZmZlYjAwMSwgMHhhMDdlYjAwMCwgMHhhMGZlYjAwMSwgMHhhMTdlYjAwMCwgMHhhMWZlYjAwMSwgMHhhMjdlYjAwMCwgMHhhMmZlYjAwMSwgMHhhMzdlYjAwMCwgMHhhM2ZlYjAwMSwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzMwYywgMHhmZmZmMzAwMSwgMHhmZmZmMzAwMSwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhhNDBlYjAwMCwgMHhhNDkwYjAwMSwgMHhhNTEyYjAwMCwgMHhhNTk0YjAwMSwgMHhhNjE2YjAwMCwgMHhhNjk4YjAwMSwgMHhhNzFhYjAwMCwgMHhhNzljYjAwMSwKLSAgICAweGE4MWViMDAwLCAweGE4YTBiMDAxLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGE5MjJiMDAwLCAweGE5YTRiMDAxLCAweGFhN2ViMDAwLCAweGFhZmViMDAxLCAweGFiN2ViMDAwLCAweGFiZmViMDAxLCAweGFjN2ViMDAwLCAweGFjZmViMDAxLCAweGZmZmUzMDA0LCAweGZmZmUzMDAwLCAweGZmZmUzMDAxLCAweGZmZmUzMDAxLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTIxOTMsIDB4ZmZmZTIxOTMsIDB4ZmZmZTIxOTMsIDB4ZmZmZTIxOTMsIDB4ZmZmZTIxOTMsIDB4ZmZmZTIxOTMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUwMDI0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZmMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZjMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZjMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZjMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMjE5MywgMHhmZmZlMjE5MywgMHhmZmZlMzAwNCwgMHhmZmZlMzAwNCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDA0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwNCwgMHhmZmZlYjA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlYjA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUwMDY0LCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMDA2NCwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGYsIDB4ZmZmZTMwNGYsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDBmLCAweGZmZmUzMDA1LCAweGZmZmUzMDBmLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWIxOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDEwLCAweGZmZmViMDEwLCAweGZmZmViMDA1LCAweGZmZmViMDA1LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCi0gICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwKLSAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LAotICAgIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKLSAgICAweGZmZmViMDUzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLAotICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRmLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAotICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCi0gICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKLSAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAotICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA4YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA4YiwKLSAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMjBiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAotICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LAotICAgIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCi0gICAgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkODAwLCAweGZmZmVkODAxLAotICAgIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LAotICAgIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsCi0gICAgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTQ5LCAweGZmZmVkODBiLCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlMzAwNywgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwNywgMHhmZmZlMzAwNywgMHhmZmZlMzAwNSwgMHhmZmZlMzAwNSwgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwZCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMDAsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDAsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDAsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDAsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDAsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDAsCi0gICAgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmE2MzAwYywKLSAgICAweGZmZmUzMWMxLCAweGZmZmUzMDBjLCAweGZmZmUzMWMxLCAweGZmZmUwMDI0LCAweGZmZmUzMDA0LCAweGZmZmUzMWM0LCAweGZmZmUzMDA1LCAweGZmZmUzMDA1LCAweGZmZmUzMDBjLCAweGFkN2UzMDAwLCAweGFkZmUzMDAxLCAweGFlN2UzMDAwLCAweGFlZmUzMDAxLCAweGFmN2UzMDAwLCAweGFmZmUzMDAxLCAweGZmZmUzMjRjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMyMGMsIDB4ZmZmZTMyMGMsIDB4YjA3ZTMwMGMsIDB4YjBmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMyNDgsIDB4ZmZmZTMyNDksIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk2NCwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZTlhOTQsCi0gICAgMHhmZmZlMDAyNCwgMHhmZmZmMzAwNSwgMHhmZmZlMzAwYywgMHhmZmZlMzI0YywgMHhmZmZlMzI0OCwgMHhmZmZlMzI0OSwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhiMTI4MzAwMCwgMHhiMWFhMzAwMSwgMHhmZmZlMzAwYywgMHhmZmZlMzIwYywgMHhmZmZmMzFjMSwgMHhmZmZlYjIwYywgMHhmZmZmMzFjMSwgMHhmZmZlMzFjYywKLSAgICAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmYzMWM0LCAweGZmZmYzMDA0LCAweGIyN2UzMDBjLCAweGZmZmUzMDBjLCAweGIyZmUzMDBjLCAweGZmZmYzMDA1LAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhiMzdlYjAwMCwgMHhmZmZlMzAwYywgMHhiM2ZlYjAwMSwgMHhmZmZlMzAwYywgMHhmZmZlYjAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4YjQyYzMwMDAsIDB4ZmZmZTMwMGMsIDB4YjRhZTMwMDEsIDB4ZmZmZWIwMGMsIDB4YjU3ZTMwMDAsCi0gICAgMHhiNWZlMzAwMSwgMHhmZmZlYjAwMSwgMHhiNjdlYjAwMCwgMHhiNmZlYjAwMSwgMHhmZmZlYjAwMSwgMHhmZmZlMzAwNCwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwKLSAgICAweGZmZmUzMDQ0LCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMyNDksIDB4ZmZmZTMyNDgsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMyNDgsIDB4ZmZmZTMyNDgsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMDJhNCwgMHhmZmZlMDJhNCwgMHhmZmZlMDJhNCwgMHhmZmZlMDJhNCwgMHhmZmZlMDJhNCwgMHhmZmZlMDJhNCwgMHhmZmZlMDJhNCwgMHhmZmZlMDJhNCwgMHhmZmZlMDJhNCwgMHhmZmZlMzAxMywgMHhmZmZlMzAxMywgMHhmZmZlMzAxMywgMHhmZmZlMzAxMSwgMHhmZmZlMzAyMiwgMHhmZmZlMWFhNCwgMHhmZmZlMWFhNCwKKyAgICAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLAorICAgIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZThhZTUsIDB4ZmZmZTliNWMsIDB4ZmZmZTlhZGEsCisgICAgMHhmZmZlOWIxYSwgMHhmZmZlOWI1YiwgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywKKyAgICAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLAorICAgIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTliNTMsIDB4ZmZmZTliNTMsCisgICAgMHhmZmZlOWI1MywgMHhmZmZlOWFkMywgMHhmZmZlOTMyMywgMHhmZmZlYjAwNSwgMHhmZmZlYjAwMiwgMHhmZmZlYjI0YiwKKyAgICAweGZmZmViMjQ4LCAweGZmZmViMjQ5LCAweGZmZmViMDBiLCAweGZmZmViMDAyLCAweDAwN2ViMDAwLCAweDAwZmViMDAxLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIyMDgsIDB4ZmZmZWIxYzcsIDB4ZmZmZWIyMGUsIDB4ZmZmZWIxYzcsIDB4ZmZmZWIxYzYsCisgICAgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwgMHhmZmZlYTkwYSwKKyAgICAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmViMWM3LCAweGZmZmViMDA3LAorICAgIDB4MDE3ZWIwMDAsIDB4ZmZmZWIwMGIsIDB4MDFmZWIwMDEsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweDAyN2ViMDAwLCAweGZmZmViMDA4LCAweDAyZmViMDAxLCAweGZmZmViMDBiLCAweGZmODBiMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHgwMzdlYjAwMCwgMHhmZmZlYjAwZiwgMHgwM2ZlYjAwMSwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLAorICAgIDB4ZmZmZWIyOTMsIDB4ZmZmZWIzNWQsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsCisgICAgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywKKyAgICAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLAorICAgIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsCisgICAgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlOTFjMywgMHhmZmZlYjAwMCwKKyAgICAweGZmZmViMjQ5LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMDBiLCAweGZmZmViMDIyLAorICAgIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNjIsIDB4MDQ3ZWIwMDAsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIyOGYsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OCwgMHhmZmZlYjEyMiwgMHhmZmZlYjEyMiwKKyAgICAweGZmZmViMDEwLCAweGZmZmViMDRiLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMTIyLAorICAgIDB4ZmZmZWIwNjIsIDB4MDRmZWIwMDEsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMDAsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAyMiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjAyMiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMTAsIDB4ZmZmZWIwMjIsCisgICAgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAxMCwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDYyLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAxMCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTgzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE4MywgMHhmZmZlYTE4MywgMHhmZmZlYTE4MywgMHhmZmZlYTE4MywKKyAgICAweGZmZmVhMTgzLCAweGZmZmVhMTgzLCAweGZmZmVhMTgzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjAwNywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0NywgMHhmZmZlYjAwZiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MGE0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYjA4ZiwgMHhmZmZlYTE5MywgMHhmZmZlYjA4YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA4YiwKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDg1LCAweGZmZmVhMTkzLCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZWQwY2IsIDB4ZmZmZWQwY2IsIDB4ZmZmZWQwY2IsIDB4ZmZmZWQwY2IsIDB4ZmZmZWQxNjQsIDB4ZmZmZWQxNjQsCisgICAgMHhmZmZlZDAwYiwgMHhmZmZlZDAwYiwgMHhmZmZlZDE0YiwgMHhmZmZlZDI0OSwgMHhmZmZlZDI0OSwgMHhmZmZlZDE0OSwKKyAgICAweGZmZmVkMWM3LCAweGZmZmVkMTQ3LCAweGZmZmVkMDBiLCAweGZmZmVkMDBiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlZDE0NSwgMHhmZmZlZDE2NCwgMHhmZmZlZDE2NCwKKyAgICAweGZmZmVkMTQ1LCAweGZmZmVkMTQ1LCAweGZmZmVkMTY0LCAweGZmZmVkMTRiLCAweGZmZmViOTRiLCAweGZmZmViOTRiLAorICAgIDB4ZmZmZWMxNGIsIDB4ZmZmZWI5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWI5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWMxNGIsCisgICAgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzE0YiwKKyAgICAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAorICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWQxNGIsCisgICAgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwKKyAgICAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAorICAgIDB4ZmZmZWMxNGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWQxNjQsCisgICAgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwgMHhmZmZlZDBjYSwKKyAgICAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMjQ5LCAweGZmZmVkMGNhLAorICAgIDB4ZmZmZWQwY2EsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWMxNGIsCisgICAgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYTE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwKKyAgICAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAorICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsCisgICAgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwKKyAgICAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLAorICAgIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsCisgICAgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwKKyAgICAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAorICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsCisgICAgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwKKyAgICAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAorICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsCisgICAgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwKKyAgICAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLAorICAgIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsCisgICAgMHhmZmZlYzk0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwKKyAgICAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTQ1LCAweGZmZmVjMTRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWQwY2IsCisgICAgMHhmZmZlZDE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVkMDBiLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsCisgICAgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwgMHhmZmZlZDEwYSwKKyAgICAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLAorICAgIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCisgICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKKyAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAorICAgIDB4ZmZmZTgxNjQsIDB4ZmZmZWIyOGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCisgICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKKyAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAorICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCisgICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKKyAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKKyAgICAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLAorICAgIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsCisgICAgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwKKyAgICAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLAorICAgIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWQxNGIsCisgICAgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYzE0YiwKKyAgICAweGZmZmVjMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLAorICAgIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsCisgICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKKyAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAorICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCisgICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKKyAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAorICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCisgICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIxNGIsIDB4ZmZmZTgxNjQsIDB4ZmZmZTgxNjQsIDB4ZmZmZTgxNjQsIDB4ZmZmZTgxNjQsCisgICAgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwKKyAgICAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmViMDhhLCAweGZmZmViMDhhLAorICAgIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsCisgICAgMHhmZmZlYjA4YSwgMHhmZmZlYjA4YSwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMDcsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDhiLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA4YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmViMDhiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNDksIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0OSwgMHhmZmZlYjA0YiwgMHhmZmZlYjI0OCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIyNDgsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMjQ4LAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDUzLCAweGZmZmVhMDUzLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYTA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNDksCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIyNDgsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmViMDVlLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmVhMTllLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTAsIDB4ZmZmZWIwNTAsIDB4ZmZmZWIwNTAsIDB4ZmZmZWIwNTAsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA1MCwgMHhmZmZlYjA1MCwgMHhmZmZlYjA0MywgMHhmZmZlYjA1MCwgMHhmZmZlYjA1MCwgMHhmZmZlYjA0ZiwKKyAgICAweGZmZmViMDQzLCAweGZmZmViMDQ1LCAweGZmZmViMDQ1LCAweGZmZmViMDQ1LCAweGZmZmViMDQ1LCAweGZmZmViMDQ1LAorICAgIDB4ZmZmZWIwNDMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNDUsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRmLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4MDU3ZWIwMDAsIDB4MDVmZWIwMDEsCisgICAgMHgwNjdlYjAwMCwgMHgwNmZlYjAwMSwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGYsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA0ZiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MCwgMHhmZmZlYjA1MCwKKyAgICAweGZmZmViMDRmLCAweGZmZmViMDUwLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwKKyAgICAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwKKyAgICAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwKKyAgICAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKKyAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAorICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCisgICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKKyAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAorICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCisgICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKKyAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAorICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCisgICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKKyAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAorICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCisgICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKKyAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAorICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCisgICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKKyAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAorICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCisgICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKKyAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAorICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCisgICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKKyAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAorICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCisgICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKKyAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAorICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCisgICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKKyAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMzBmLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4MDc3ZWIwMDAsIDB4MDdmZWIwMDEsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0ZiwKKyAgICAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwKKyAgICAweGZmZmViMDQ0LCAweGZmZmViMDVlLCAweGZmZmViMDRmLCAweGZmZmViMDRiLCAweGZmZmViMDRmLCAweGZmZmViMjQ4LAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsCisgICAgMHhmZmZlYjAxMCwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwYiwgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMzAzLCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjAxZSwgMHhmZmZlYjAxZSwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwKKyAgICAweGZmZmVhMTllLCAweGZmZmU4MDI0LCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRiLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRmLAorICAgIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsCisgICAgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRmLCAweGZmZmViMDRmLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAxMCwKKyAgICAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmViMzBmLCAweGZmZmViMzBmLCAweGZmZmViMzBmLCAweGZmZmViMzBmLAorICAgIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMDMsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsCisgICAgMHhmZmZlYjMwZiwgMHhmZmZlYjI5MiwgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOTg1MywgMHhmZmZlOTg5MywKKyAgICAweGZmZmViMDBmLCAweGZmZmViMDAzLCAweGZmZmViMDBmLCAweGZmODJiMDBmLCAweGZmODRiMDExLCAweGZmZmViMDIyLAorICAgIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4MDgwNmIwMDAsIDB4MDg4OGIwMDIsIDB4ZmZmZWIwMDAsIDB4ZmZmZWIwMDIsCisgICAgMHgwOTBhYjAwMCwgMHgwOThjYjAwMSwgMHhmZmZlYjAwMCwgMHhmZmZlYjAwMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBkLCAweGZmZmViMDBkLCAweGZmZmViMDBkLCAweGZmZmViMDBmLAorICAgIDB4ZmZmZTliMWEsIDB4ZmZmZTliNWEsIDB4ZmZmZTljNTMsIDB4ZmZmZTliZDMsIDB4ZmZmZTljOTMsIDB4ZmZmZTljMTMsCisgICAgMHhmZmZlOWI5MywgMHhmZmZlYjFjMywgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OSwKKyAgICAweGZmZmViMjQ5LCAweGZmZmViMDA5LCAweGZmZmViMDA5LCAweGZmZmViMDA5LCAweGZmZmViMDBiLCAweDBhN2ViMDAwLAorICAgIDB4MGFmZWIwMDEsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMDQsIDB4ZmZmZWIwMDQsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjFjNywgMHgwYjdlYjAwMCwKKyAgICAweDBiZmViMDAxLCAweGZmZmViMDA0LCAweGZmZmViMDA0LCAweGZmZmViMDA0LCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBiLCAweGZmZmViMDBmLAorICAgIDB4ZmZmZWIwMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIyOTQsIDB4ZmZmZWIyOGIsIDB4ZmZmZWIyOGIsIDB4ZmZmZWIyOGIsCisgICAgMHhmZmZlYjI4YiwgMHhmZmZlODJhNCwgMHhmZmZlODJhNCwgMHhmZmZlODJhNCwgMHhmZmZlODJhNCwgMHhmZmZlODJhNCwKKyAgICAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLAorICAgIDB4ZmZmZWIxMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIxMjIsIDB4ZmZmZWIxMGIsCisgICAgMHhmZmZlYjEwYiwgMHhmZmZlYjEwYiwgMHhmZmZlYjEwYiwgMHhmZmZlYjEwYiwgMHhmZmZlYjIwYiwgMHhmZmZlYjIwYiwKKyAgICAweGZmZmViMDBiLCAweDBjN2ViMDAwLCAweDBjZmViMDAxLCAweGZmZmViMDYyLCAweGZmZmViMTBiLCAweGZmZmViMTIyLAorICAgIDB4ZmZmZWIxMjIsIDB4ZmZmZWIxMjIsIDB4ZmZmZWIxMjIsIDB4ZmZmZWIxMGIsIDB4ZmZmZWIxMGIsIDB4ZmZmZWIxMGIsCisgICAgMHhmZmZlYjEwYiwgMHhmZmZlYjEwYiwgMHhmZmZlYjIwYiwgMHhmZmZlYjIwYiwgMHhmZmZlYjAwYiwgMHgwZDdlYjAwMCwKKyAgICAweDBkZmViMDAxLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LAorICAgIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsCisgICAgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwKKyAgICAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ5LCAweGZmZmViMjQ4LAorICAgIDB4ZmZmZWIyNDgsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYjE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMDksIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwOSwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMDgsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjI0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwKKyAgICAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsCisgICAgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwKKyAgICAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAyMiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsCisgICAgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwKKyAgICAweDBlN2ViMDIyLCAweDBlZmViMDBiLCAweDBmN2ViMDBiLCAweDBmZmViMDIyLCAweDEwN2ViMDBiLCAweDEwZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIyMDgsIDB4ZmZmZWIyNDgsCisgICAgMHhmZmZlYjAwYiwgMHgxMTdlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLAorICAgIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwKKyAgICAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHgxMWZlYjAyMiwgMHgxMjdlYjAyMiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDEyZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDEzN2ViMDIyLCAweDEzZmViMDBiLCAweDE0N2ViMDBiLCAweDE0ZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDE1N2ViMDIyLCAweDE1ZmViMDIyLCAweDE2N2ViMDIyLCAweDE2ZmViMDIyLAorICAgIDB4MTc3ZWIwMGIsIDB4MTdmZWIwMGIsIDB4MTg3ZWIwMjIsIDB4MThmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHgxOTdlYjAyMiwgMHgxOWZlYjAyMiwgMHgxYTdlYjAwYiwgMHgxYWZlYjAwYiwgMHgxYjdlYjAwYiwgMHgxYmZlYjAwYiwKKyAgICAweDFjN2ViMDBiLCAweDFjZmViMDBiLCAweDFkN2ViMDBiLCAweDFkZmViMDBiLCAweDFlN2ViMDBiLCAweDFlZmViMDBiLAorICAgIDB4MWY3ZWIwMGIsIDB4MWZmZWIwMGIsIDB4MjA3ZWIwMGIsIDB4MjBmZWIwMGIsIDB4MjE3ZWIwMGIsIDB4MjFmZWIwMGIsCisgICAgMHgyMjdlYjAwYiwgMHgyMmZlYjAwYiwgMHgyMzdlYjAyMiwgMHgyM2ZlYjAyMiwgMHgyNDdlYjAwYiwgMHgyNGZlYjAwYiwKKyAgICAweDI1N2ViMDIyLCAweDI1ZmViMDIyLCAweDI2N2ViMDBiLCAweDI2ZmViMDBiLCAweDI3N2ViMDBiLCAweDI3ZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4Mjg3ZWIwMGIsIDB4MjhmZWIwMGIsIDB4Mjk3ZWIwMGIsCisgICAgMHgyOWZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweDJhN2ViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MmFmZWIwMGIsIDB4MmI3ZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHgyYmZlYjAwYiwgMHhmZmZlYjAwYiwgMHgyYzdlYjAwYiwgMHgyY2ZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweDJkN2ViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4MmRmZWIwMGIsIDB4MmU3ZWIwMGIsIDB4MmVmZWIwMGIsIDB4MmY3ZWIwMGIsIDB4MmZmZWIwMGIsIDB4MzA3ZWIwMGIsCisgICAgMHgzMGZlYjAwYiwgMHgzMTdlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHgzMWZlYjAwYiwgMHgzMjdlYjAwYiwgMHgzMmZlYjAwYiwgMHgzMzdlYjAwYiwgMHgzM2ZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDM0N2ViMDBiLCAweDM0ZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MzU3ZWIwMGIsIDB4MzVmZWIwMGIsIDB4MzY3ZWIwMGIsIDB4MzZmZWIwMGIsCisgICAgMHgzNzdlYjAwYiwgMHgzN2ZlYjAwYiwgMHgzODdlYjAwYiwgMHgzOGZlYjAwYiwgMHgzOTdlYjAwYiwgMHgzOWZlYjAwYiwKKyAgICAweDNhN2ViMDBiLCAweDNhZmViMDBiLCAweDNiN2ViMDBiLCAweDNiZmViMDBiLCAweDNjN2ViMDBiLCAweDNjZmViMDBiLAorICAgIDB4M2Q3ZWIwMGIsIDB4M2RmZWIwMGIsIDB4M2U3ZWIwMGIsIDB4M2VmZWIwMGIsIDB4M2Y3ZWIwMGIsIDB4M2ZmZWIwMGIsCisgICAgMHg0MDdlYjAwYiwgMHg0MGZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHg0MTdlYjAwYiwgMHg0MWZlYjAwYiwKKyAgICAweDQyN2ViMDBiLCAweDQyZmViMDBiLCAweDQzN2ViMDBiLCAweGZmZmViMDBiLCAweDQzZmViMDBiLCAweDQ0N2ViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4NDRmZWIwMGIsIDB4NDU3ZWIwMGIsIDB4NDVmZWIwMGIsIDB4NDY3ZWIwMGIsCisgICAgMHg0NmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDQ3N2ViMDBiLCAweDQ3ZmViMDBiLAorICAgIDB4NDg3ZWIwMGIsIDB4NDhmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweDQ5N2ViMDAwLCAweDQ5ZmViMDAxLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsCisgICAgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwKKyAgICAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLAorICAgIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsCisgICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKKyAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAorICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCisgICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKKyAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAorICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCisgICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKKyAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAorICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCisgICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKKyAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAorICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCisgICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMDAyNCwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUzMDIyLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwMiwgMHhmZmZlMzAwMiwgMHhmZmZlMzAwMiwgMHhmZmZlMzAwMiwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUzMDA1LCAweGZmZmUzMDA1LCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NGE3ZTMwMDAsIDB4NGFmZTMwMDEsIDB4NGI3ZTMwMDAsIDB4NGJmZTMwMDEsCisgICAgMHg0YzdlMzAwMCwgMHg0Y2ZlMzAwMSwgMHg0ZDdlMzAwMCwgMHg0ZGZlMzAwMSwgMHg0ZTdlMzAwMCwgMHg0ZWZlMzAwMSwKKyAgICAweDRmN2UzMDAwLCAweDRmZmUzMDAxLCAweDUwN2UzMDAwLCAweDUwZmUzMDAxLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NTE3ZTMwMGIsIDB4NTFmZTMwMGIsIDB4NTI3ZTMwMDAsCisgICAgMHg1MmZlMzAwMSwgMHhmZmZlMzAwYiwgMHg1MzdlMzAwYiwgMHg1M2ZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NTQ3ZTMwMGIsIDB4NTRmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg1NTdlMzAwYiwKKyAgICAweDU1ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDU2N2UzMDBiLCAweDU2ZmUzMDBiLAorICAgIDB4NTc3ZTMwMGIsIDB4NTdmZTMwMGIsIDB4NTg3ZTMwMDAsIDB4NThmZTMwMDEsIDB4NTk3ZTMwMDAsIDB4NTlmZTMwMDEsCisgICAgMHg1YTdlMzAwMCwgMHg1YWZlMzAwMSwgMHg1YjdlMzAwMCwgMHg1YmZlMzAwMSwgMHg1YzdlMzAwMCwgMHg1Y2ZlMzAwMSwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4NWQ3ZTMwMDAsIDB4NWRmZTMwMDEsIDB4NWU3ZTMwMDAsIDB4NWVmZTMwMDEsIDB4NWY3ZTMwMDAsCisgICAgMHg1ZmZlMzAwMSwgMHg2MDdlMzAwMCwgMHg2MGZlMzAwMSwgMHg2MTdlMzAwMCwgMHg2MWZlMzAwMSwgMHg2MjdlMzAwMCwKKyAgICAweDYyZmUzMDAxLCAweDYzN2UzMDAwLCAweDYzZmUzMDAxLCAweDY0N2UzMDAwLCAweDY0ZmUzMDAxLCAweDY1N2UzMDAwLAorICAgIDB4NjVmZTMwMDEsIDB4NjY3ZTMwMDAsIDB4NjZmZTMwMDEsIDB4Njc3ZTMwMDAsIDB4NjdmZTMwMDEsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4Njg3ZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg2OGZlMzAwYiwgMHg2OTdlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweDY5ZmUzMDBiLCAweDZhN2UzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NmFmZTMwMGIsCisgICAgMHg2YjdlMzAwYiwgMHg2YmZlMzAwYiwgMHg2YzdlMzAwYiwgMHhmZmZlMzAwYiwgMHg2Y2ZlMzAwYiwgMHg2ZDdlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDZkZmUzMDAwLCAweDZlN2UzMDAxLCAweDZlZmUzMDAwLCAweDZmN2UzMDAxLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHg2ZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg3MDdlMzAwYiwgMHg3MGZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDcxN2UzMDAwLCAweDcxZmUzMDAxLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHg3MjdlMzAwYiwgMHg3MmZlMzAwYiwgMHg3MzdlMzAwYiwgMHg3M2ZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDc0N2UzMDBiLCAweDc0ZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHg3NTdlMzAwYiwgMHg3NWZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg3NjdlMzAwYiwgMHg3NmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweDc3N2UzMDBiLCAweDc3ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDc4N2UzMDBiLAorICAgIDB4NzhmZTMwMGIsIDB4Nzk3ZTMwMGIsIDB4NzlmZTMwMGIsIDB4N2E3ZTMwMGIsIDB4N2FmZTMwMGIsIDB4N2I3ZTMwMGIsCisgICAgMHg3YmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweDdjN2UzMDBiLCAweDdjZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4N2Q3ZTMwMGIsIDB4N2RmZTMwMGIsIDB4N2U3ZTMwMGIsIDB4N2VmZTMwMGIsIDB4N2Y3ZTMwMGIsCisgICAgMHg3ZmZlMzAwYiwgMHg4MDdlMzAwYiwgMHg4MGZlMzAwYiwgMHg4MTdlMzAwYiwgMHg4MWZlMzAwYiwgMHg4MjdlMzAwYiwKKyAgICAweDgyZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDgzN2UzMDBiLAorICAgIDB4ODNmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ODQ3ZTMwMGIsIDB4ODRmZTMwMGIsCisgICAgMHg4NTdlMzAwYiwgMHg4NWZlMzAwYiwgMHg4NjdlMzAwYiwgMHg4NmZlMzAwYiwgMHg4NzdlMzAwYiwgMHg4N2ZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweDg4N2UzMDBiLCAweDg4ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDg5N2UzMDBiLAorICAgIDB4ODlmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHg4YTdlMzAwYiwgMHg4YWZlMzAwYiwgMHg4YjdlMzAwYiwgMHg4YmZlMzAwYiwgMHg4YzdlMzAwYiwKKyAgICAweDhjZmUzMDBiLCAweDhkN2UzMDBiLCAweDhkZmUzMDBiLCAweDhlN2UzMDBiLCAweDhlZmUzMDBiLCAweDhmN2UzMDBiLAorICAgIDB4OGZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHg5MDdlMzAwYiwgMHg5MGZlMzAwYiwgMHg5MTdlMzAwYiwgMHg5MWZlMzAwYiwgMHg5MjdlMzAwYiwKKyAgICAweDkyZmUzMDBiLCAweDkzN2UzMDBiLCAweDkzZmUzMDBiLCAweDk0N2UzMDBiLCAweDk0ZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHg5NTdlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg5NWZlMzAwYiwKKyAgICAweDk2N2UzMDBiLCAweDk2ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4OTc3ZTMwMGIsIDB4OTdmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweDk4N2UzMDBiLCAweDk4ZmUzMDBiLCAweDk5N2UzMDBiLCAweDk5ZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMDUsCisgICAgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwZiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDAxLCAweGZmZmViMDAxLAorICAgIDB4OWE3ZWIwMDAsIDB4OWFmZWIwMDEsIDB4OWI3ZWIwMDAsIDB4OWJmZWIwMDEsIDB4ZmZmZWIwMDIsIDB4ZmZmZWIwMDIsCisgICAgMHhmZmZlYjAwMiwgMHg5YzdlYjAwMCwgMHg5Y2ZlYjAwMSwgMHhmZmZlYjAwMiwgMHg5ZDdlYjAwMCwgMHg5ZGZlYjAwMSwKKyAgICAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBmLAorICAgIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMDAsIDB4ZmZmZWIwMGYsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHg5ZTdlYjAwMCwgMHg5ZWZlYjAwMSwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweDlmN2ViMDAwLCAweDlmZmViMDAxLCAweGEwN2ViMDAwLCAweGEwZmViMDAxLCAweGExN2ViMDAwLCAweGExZmViMDAxLAorICAgIDB4YTI3ZWIwMDAsIDB4YTJmZWIwMDEsIDB4YTM3ZWIwMDAsIDB4YTNmZWIwMDEsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsCisgICAgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMzMwYywgMHhmZmZmMzAwMSwgMHhmZmZmMzAwMSwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzA0NCwKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGE0MGViMDAwLCAweGE0OTBiMDAxLCAweGE1MTJiMDAwLCAweGE1OTRiMDAxLAorICAgIDB4YTYxNmIwMDAsIDB4YTY5OGIwMDEsIDB4YTcxYWIwMDAsIDB4YTc5Y2IwMDEsIDB4YTgxZWIwMDAsIDB4YThhMGIwMDEsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhhOTIyYjAwMCwgMHhhOWE0YjAwMSwgMHhhYTdlYjAwMCwgMHhhYWZlYjAwMSwKKyAgICAweGFiN2ViMDAwLCAweGFiZmViMDAxLCAweGFjN2ViMDAwLCAweGFjZmViMDAxLCAweGZmZmUzMDA0LCAweGZmZmUzMDAwLAorICAgIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUyMTkzLCAweGZmZmUyMTkzLCAweGZmZmUyMTkzLCAweGZmZmUyMTkzLCAweGZmZmUyMTkzLCAweGZmZmUyMTkzLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwKKyAgICAweGZmZmUzMDQ0LCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUzMDQ0LAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmYzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZmMzA0NCwKKyAgICAweGZmZmUzMDRjLCAweGZmZmYzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmYzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwKKyAgICAweGZmZmUzMDQ0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUyMTkzLCAweGZmZmUyMTkzLCAweGZmZmUzMDA0LAorICAgIDB4ZmZmZTMwMDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwMDQsIDB4ZmZmZTMwNDQsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LAorICAgIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwMDQsCisgICAgMHhmZmZlYjA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmViMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMDAyNCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LAorICAgIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsCisgICAgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwKKyAgICAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAorICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUwMDY0LCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGYsIDB4ZmZmZTMwNGYsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwMGYsCisgICAgMHhmZmZlMzAwNSwgMHhmZmZlMzAwZiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwgMHhmZmZlMzA0YSwKKyAgICAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMTkzLCAweGZmZmViMTkzLCAweGZmZmViMTkzLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAxMCwgMHhmZmZlYjAxMCwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwNSwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywKKyAgICAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LAorICAgIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsCisgICAgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywKKyAgICAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LAorICAgIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsCisgICAgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0ZiwKKyAgICAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwKKyAgICAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmViMDUzLCAweGZmZmViMDRmLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCisgICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKKyAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAorICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCisgICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMDAyNCwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMDAyNCwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMDAyNCwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwOGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMjBiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmU4MGE0LCAweGZmZmViMDhiLCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwKKyAgICAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LAorICAgIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCisgICAgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwKKyAgICAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LAorICAgIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDgwMCwgMHhmZmZlZDgwMSwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwKKyAgICAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LAorICAgIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCisgICAgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwKKyAgICAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LAorICAgIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsCisgICAgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwKKyAgICAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LAorICAgIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTQ5LCAweGZmZmVkODBiLAorICAgIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZTMwMDcsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDcsIDB4ZmZmZTMwMDcsIDB4ZmZmZTMwMDUsCisgICAgMHhmZmZlMzAwNSwgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwZCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMDAsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDAsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDAsCisgICAgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwKKyAgICAweGZmZmUzMDAxLCAweGZmZmUzMDAwLCAweGZmZmUzMDAxLCAweGZmZmUzMDAwLCAweGZmZmUzMDAxLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMDAsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmE2MzAwYywgMHhmZmZlMzFjMSwgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMWMxLCAweGZmZmUwMDI0LCAweGZmZmUzMDA0LCAweGZmZmUzMWM0LCAweGZmZmUzMDA1LCAweGZmZmUzMDA1LAorICAgIDB4ZmZmZTMwMGMsIDB4YWQ3ZTMwMDAsIDB4YWRmZTMwMDEsIDB4YWU3ZTMwMDAsIDB4YWVmZTMwMDEsIDB4YWY3ZTMwMDAsCisgICAgMHhhZmZlMzAwMSwgMHhmZmZlMzI0YywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzIwYywgMHhmZmZlMzIwYywKKyAgICAweGIwN2UzMDBjLCAweGIwZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUzMDBjLCAweGZmZmUzMjQ4LAorICAgIDB4ZmZmZTMyNDksIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk2NCwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZTlhOTQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZmMzAwNSwgMHhmZmZlMzAwYywgMHhmZmZlMzI0YywgMHhmZmZlMzI0OCwgMHhmZmZlMzI0OSwKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGIxMjgzMDAwLCAweGIxYWEzMDAxLCAweGZmZmUzMDBjLCAweGZmZmUzMjBjLAorICAgIDB4ZmZmZjMxYzEsIDB4ZmZmZWIyMGMsIDB4ZmZmZjMxYzEsIDB4ZmZmZTMxY2MsIDB4ZmZmZTMxMGMsIDB4ZmZmZTMxMGMsCisgICAgMHhmZmZlMzEwYywgMHhmZmZlMzEwYywgMHhmZmZlMzEwYywgMHhmZmZlMzEwYywgMHhmZmZlMzEwYywgMHhmZmZlMzEwYywKKyAgICAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmYzMWM0LCAweGZmZmYzMDA0LCAweGIyN2UzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4YjJmZTMwMGMsIDB4ZmZmZjMwMDUsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhiMzdlYjAwMCwKKyAgICAweGZmZmUzMDBjLCAweGIzZmViMDAxLCAweGZmZmUzMDBjLCAweGZmZmViMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhiNDJjMzAwMCwgMHhmZmZlMzAwYywgMHhiNGFlMzAwMSwgMHhmZmZlYjAwYywgMHhiNTdlMzAwMCwKKyAgICAweGI1ZmUzMDAxLCAweGZmZmViMDAxLCAweGI2N2ViMDAwLCAweGI2ZmViMDAxLCAweGZmZmViMDAxLCAweGZmZmUzMDA0LAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsCisgICAgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMjQ5LCAweGZmZmUzMjQ4LCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMyNDgsIDB4ZmZmZTMyNDgsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUwMmE0LAorICAgIDB4ZmZmZTAyYTQsIDB4ZmZmZTAyYTQsIDB4ZmZmZTAyYTQsIDB4ZmZmZTMwMTMsIDB4ZmZmZTMwMTMsIDB4ZmZmZTMwMTMsCisgICAgMHhmZmZlMzAxMSwgMHhmZmZlMzAyMiwgMHhmZmZlMWFhNCwgMHhmZmZlMWFhNCwKIH07CiBleHRlcm4gY29uc3QgRlhfV0NIQVIgZ3NfRlhfVGV4dExheW91dF9WZXJ0aWNhbE1pcnJvcls2NF0gPSB7Ci0gICAgMHhGRTMzLCAweEZFMzIsIDB4RkUzMSwgMHhGRTQxLCAweEZFNDIsIDB4RkU0MywgMHhGRTQ0LCAweEZFM0YsIDB4RkU0MCwgMHhGRTNELCAweEZFM0UsIDB4RkU0MSwgMHhGRTQyLCAweEZFNDMsIDB4RkU0NCwgMHhGRTNCLAotICAgIDB4RkUzQywgMHhGRTM5LCAweEZFM0EsIDB4RkUzNCwgMHhGRTM1LCAweEZFMzYsIDB4RkUzNywgMHhGRTM4LCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKLSAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkUzMywgMHhGRTMyLCAweEZFMzEsIDB4RkU0MSwgMHhGRTQyLCAweEZFNDMsIDB4RkU0NCwgMHhGRTNGLAorICAgIDB4RkU0MCwgMHhGRTNELCAweEZFM0UsIDB4RkU0MSwgMHhGRTQyLCAweEZFNDMsIDB4RkU0NCwgMHhGRTNCLAorICAgIDB4RkUzQywgMHhGRTM5LCAweEZFM0EsIDB4RkUzNCwgMHhGRTM1LCAweEZFMzYsIDB4RkUzNywgMHhGRTM4LAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAogfTsKIGV4dGVybiBjb25zdCBGWF9XQ0hBUiBnc19GWF9UZXh0TGF5b3V0X0JpZGlNaXJyb3JbNTEyXSA9IHsKLSAgICAweDAwMjksIDB4MDAyOCwgMHgwMDNFLCAweDAwM0MsIDB4MDA1RCwgMHgwMDVCLCAweDAwN0QsIDB4MDA3QiwgMHgwMEJCLCAweDAwQUIsIDB4MEYzQiwgMHgwRjNBLCAweDBGM0QsIDB4MEYzQywgMHgxNjlDLCAweDE2OUIsCi0gICAgMHgyMDE5LCAweDIwMTgsIDB4MjAxRCwgMHgyMDFDLCAweDIwM0EsIDB4MjAzOSwgMHgyMDQ2LCAweDIwNDUsIDB4MjA3RSwgMHgyMDdELCAweDIwOEUsIDB4MjA4RCwgMHgyMjBCLCAweDIyMEMsIDB4MjIwRCwgMHgyMjA4LAotICAgIDB4MjIwOSwgMHgyMjBBLCAweDI5RjUsIDB4MjIzRCwgMHgyMjNDLCAweDIyQ0QsIDB4MjI1MywgMHgyMjUyLCAweDIyNTUsIDB4MjI1NCwgMHgyMjY1LCAweDIyNjQsIDB4MjI2NywgMHgyMjY2LCAweDIyNjksIDB4MjI2OCwKLSAgICAweDIyNkIsIDB4MjI2QSwgMHgyMjZGLCAweDIyNkUsIDB4MjI3MSwgMHgyMjcwLCAweDIyNzMsIDB4MjI3MiwgMHgyMjc1LCAweDIyNzQsIDB4MjI3NywgMHgyMjc2LCAweDIyNzksIDB4MjI3OCwgMHgyMjdCLCAweDIyN0EsCi0gICAgMHgyMjdELCAweDIyN0MsIDB4MjI3RiwgMHgyMjdFLCAweDIyODEsIDB4MjI4MCwgMHgyMjgzLCAweDIyODIsIDB4MjI4NSwgMHgyMjg0LCAweDIyODcsIDB4MjI4NiwgMHgyMjg5LCAweDIyODgsIDB4MjI4QiwgMHgyMjhBLAotICAgIDB4MjI5MCwgMHgyMjhGLCAweDIyOTIsIDB4MjI5MSwgMHgyOUI4LCAweDIyQTMsIDB4MjJBMiwgMHgyQURFLCAweDJBRTQsIDB4MkFFMywgMHgyQUU1LCAweDIyQjEsIDB4MjJCMCwgMHgyMkIzLCAweDIyQjIsIDB4MjJCNSwKLSAgICAweDIyQjQsIDB4MjJCNywgMHgyMkI2LCAweDIyQ0EsIDB4MjJDOSwgMHgyMkNDLCAweDIyQ0IsIDB4MjI0MywgMHgyMkQxLCAweDIyRDAsIDB4MjJENywgMHgyMkQ2LCAweDIyRDksIDB4MjJEOCwgMHgyMkRCLCAweDIyREEsCi0gICAgMHgyMkRELCAweDIyREMsIDB4MjJERiwgMHgyMkRFLCAweDIyRTEsIDB4MjJFMCwgMHgyMkUzLCAweDIyRTIsIDB4MjJFNSwgMHgyMkU0LCAweDIyRTcsIDB4MjJFNiwgMHgyMkU5LCAweDIyRTgsIDB4MjJFQiwgMHgyMkVBLAotICAgIDB4MjJFRCwgMHgyMkVDLCAweDIyRjEsIDB4MjJGMCwgMHgyMkZBLCAweDIyRkIsIDB4MjJGQywgMHgyMkZELCAweDIyRkUsIDB4MjJGMiwgMHgyMkYzLCAweDIyRjQsIDB4MjJGNiwgMHgyMkY3LCAweDIzMDksIDB4MjMwOCwKLSAgICAweDIzMEIsIDB4MjMwQSwgMHgyMzJBLCAweDIzMjksIDB4Mjc2OSwgMHgyNzY4LCAweDI3NkIsIDB4Mjc2QSwgMHgyNzZELCAweDI3NkMsIDB4Mjc2RiwgMHgyNzZFLCAweDI3NzEsIDB4Mjc3MCwgMHgyNzczLCAweDI3NzIsCi0gICAgMHgyNzc1LCAweDI3NzQsIDB4MjdDNCwgMHgyN0MzLCAweDI3QzYsIDB4MjdDNSwgMHgyN0M5LCAweDI3QzgsIDB4MjdENiwgMHgyN0Q1LCAweDI3REUsIDB4MjdERCwgMHgyN0UzLCAweDI3RTIsIDB4MjdFNSwgMHgyN0U0LAotICAgIDB4MjdFNywgMHgyN0U2LCAweDI3RTksIDB4MjdFOCwgMHgyN0VCLCAweDI3RUEsIDB4MjdFRCwgMHgyN0VDLCAweDI3RUYsIDB4MjdFRSwgMHgyOTg0LCAweDI5ODMsIDB4Mjk4NiwgMHgyOTg1LCAweDI5ODgsIDB4Mjk4NywKLSAgICAweDI5OEEsIDB4Mjk4OSwgMHgyOThDLCAweDI5OEIsIDB4Mjk5MCwgMHgyOThGLCAweDI5OEUsIDB4Mjk4RCwgMHgyOTkyLCAweDI5OTEsIDB4Mjk5NCwgMHgyOTkzLCAweDI5OTYsIDB4Mjk5NSwgMHgyOTk4LCAweDI5OTcsCi0gICAgMHgyMjk4LCAweDI5QzEsIDB4MjlDMCwgMHgyOUM1LCAweDI5QzQsIDB4MjlEMCwgMHgyOUNGLCAweDI5RDIsIDB4MjlEMSwgMHgyOUQ1LCAweDI5RDQsIDB4MjlEOSwgMHgyOUQ4LCAweDI5REIsIDB4MjlEQSwgMHgyMjE1LAotICAgIDB4MjlGOSwgMHgyOUY4LCAweDI5RkQsIDB4MjlGQywgMHgyQTJDLCAweDJBMkIsIDB4MkEyRSwgMHgyQTJELCAweDJBMzUsIDB4MkEzNCwgMHgyQTNELCAweDJBM0MsIDB4MkE2NSwgMHgyQTY0LCAweDJBN0EsIDB4MkE3OSwKLSAgICAweDJBN0UsIDB4MkE3RCwgMHgyQTgwLCAweDJBN0YsIDB4MkE4MiwgMHgyQTgxLCAweDJBODQsIDB4MkE4MywgMHgyQThDLCAweDJBOEIsIDB4MkE5MiwgMHgyQTkxLCAweDJBOTQsIDB4MkE5MywgMHgyQTk2LCAweDJBOTUsCi0gICAgMHgyQTk4LCAweDJBOTcsIDB4MkE5QSwgMHgyQTk5LCAweDJBOUMsIDB4MkE5QiwgMHgyQUEyLCAweDJBQTEsIDB4MkFBNywgMHgyQUE2LCAweDJBQTksIDB4MkFBOCwgMHgyQUFCLCAweDJBQUEsIDB4MkFBRCwgMHgyQUFDLAotICAgIDB4MkFCMCwgMHgyQUFGLCAweDJBQjQsIDB4MkFCMywgMHgyQUJDLCAweDJBQkIsIDB4MkFCRSwgMHgyQUJELCAweDJBQzAsIDB4MkFCRiwgMHgyQUMyLCAweDJBQzEsIDB4MkFDNCwgMHgyQUMzLCAweDJBQzYsIDB4MkFDNSwKLSAgICAweDJBQ0UsIDB4MkFDRCwgMHgyQUQwLCAweDJBQ0YsIDB4MkFEMiwgMHgyQUQxLCAweDJBRDQsIDB4MkFEMywgMHgyQUQ2LCAweDJBRDUsIDB4MjJBNiwgMHgyMkE5LCAweDIyQTgsIDB4MjJBQiwgMHgyQUVELCAweDJBRUMsCi0gICAgMHgyQUY4LCAweDJBRjcsIDB4MkFGQSwgMHgyQUY5LCAweDJFMDMsIDB4MkUwMiwgMHgyRTA1LCAweDJFMDQsIDB4MkUwQSwgMHgyRTA5LCAweDJFMEQsIDB4MkUwQywgMHgyRTFELCAweDJFMUMsIDB4MkUyMSwgMHgyRTIwLAotICAgIDB4MkUyMywgMHgyRTIyLCAweDJFMjUsIDB4MkUyNCwgMHgyRTI3LCAweDJFMjYsIDB4MkUyOSwgMHgyRTI4LCAweDMwMDksIDB4MzAwOCwgMHgzMDBCLCAweDMwMEEsIDB4MzAwRCwgMHgzMDBDLCAweDMwMEYsIDB4MzAwRSwKLSAgICAweDMwMTEsIDB4MzAxMCwgMHgzMDE1LCAweDMwMTQsIDB4MzAxNywgMHgzMDE2LCAweDMwMTksIDB4MzAxOCwgMHgzMDFCLCAweDMwMUEsIDB4RkU1QSwgMHhGRTU5LCAweEZFNUMsIDB4RkU1QiwgMHhGRTVFLCAweEZFNUQsCi0gICAgMHhGRTY1LCAweEZFNjQsIDB4RkYwOSwgMHhGRjA4LCAweEZGMUUsIDB4RkYxQywgMHhGRjNELCAweEZGM0IsIDB4RkY1RCwgMHhGRjVCLCAweEZGNjAsIDB4RkY1RiwgMHhGRjYzLCAweEZGNjIsIDB4RkZGRiwgMHhGRUZGLAotICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKLSAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAotICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKLSAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAotICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKLSAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4MDAyOSwgMHgwMDI4LCAweDAwM0UsIDB4MDAzQywgMHgwMDVELCAweDAwNUIsIDB4MDA3RCwgMHgwMDdCLCAweDAwQkIsCisgICAgMHgwMEFCLCAweDBGM0IsIDB4MEYzQSwgMHgwRjNELCAweDBGM0MsIDB4MTY5QywgMHgxNjlCLCAweDIwMTksIDB4MjAxOCwKKyAgICAweDIwMUQsIDB4MjAxQywgMHgyMDNBLCAweDIwMzksIDB4MjA0NiwgMHgyMDQ1LCAweDIwN0UsIDB4MjA3RCwgMHgyMDhFLAorICAgIDB4MjA4RCwgMHgyMjBCLCAweDIyMEMsIDB4MjIwRCwgMHgyMjA4LCAweDIyMDksIDB4MjIwQSwgMHgyOUY1LCAweDIyM0QsCisgICAgMHgyMjNDLCAweDIyQ0QsIDB4MjI1MywgMHgyMjUyLCAweDIyNTUsIDB4MjI1NCwgMHgyMjY1LCAweDIyNjQsIDB4MjI2NywKKyAgICAweDIyNjYsIDB4MjI2OSwgMHgyMjY4LCAweDIyNkIsIDB4MjI2QSwgMHgyMjZGLCAweDIyNkUsIDB4MjI3MSwgMHgyMjcwLAorICAgIDB4MjI3MywgMHgyMjcyLCAweDIyNzUsIDB4MjI3NCwgMHgyMjc3LCAweDIyNzYsIDB4MjI3OSwgMHgyMjc4LCAweDIyN0IsCisgICAgMHgyMjdBLCAweDIyN0QsIDB4MjI3QywgMHgyMjdGLCAweDIyN0UsIDB4MjI4MSwgMHgyMjgwLCAweDIyODMsIDB4MjI4MiwKKyAgICAweDIyODUsIDB4MjI4NCwgMHgyMjg3LCAweDIyODYsIDB4MjI4OSwgMHgyMjg4LCAweDIyOEIsIDB4MjI4QSwgMHgyMjkwLAorICAgIDB4MjI4RiwgMHgyMjkyLCAweDIyOTEsIDB4MjlCOCwgMHgyMkEzLCAweDIyQTIsIDB4MkFERSwgMHgyQUU0LCAweDJBRTMsCisgICAgMHgyQUU1LCAweDIyQjEsIDB4MjJCMCwgMHgyMkIzLCAweDIyQjIsIDB4MjJCNSwgMHgyMkI0LCAweDIyQjcsIDB4MjJCNiwKKyAgICAweDIyQ0EsIDB4MjJDOSwgMHgyMkNDLCAweDIyQ0IsIDB4MjI0MywgMHgyMkQxLCAweDIyRDAsIDB4MjJENywgMHgyMkQ2LAorICAgIDB4MjJEOSwgMHgyMkQ4LCAweDIyREIsIDB4MjJEQSwgMHgyMkRELCAweDIyREMsIDB4MjJERiwgMHgyMkRFLCAweDIyRTEsCisgICAgMHgyMkUwLCAweDIyRTMsIDB4MjJFMiwgMHgyMkU1LCAweDIyRTQsIDB4MjJFNywgMHgyMkU2LCAweDIyRTksIDB4MjJFOCwKKyAgICAweDIyRUIsIDB4MjJFQSwgMHgyMkVELCAweDIyRUMsIDB4MjJGMSwgMHgyMkYwLCAweDIyRkEsIDB4MjJGQiwgMHgyMkZDLAorICAgIDB4MjJGRCwgMHgyMkZFLCAweDIyRjIsIDB4MjJGMywgMHgyMkY0LCAweDIyRjYsIDB4MjJGNywgMHgyMzA5LCAweDIzMDgsCisgICAgMHgyMzBCLCAweDIzMEEsIDB4MjMyQSwgMHgyMzI5LCAweDI3NjksIDB4Mjc2OCwgMHgyNzZCLCAweDI3NkEsIDB4Mjc2RCwKKyAgICAweDI3NkMsIDB4Mjc2RiwgMHgyNzZFLCAweDI3NzEsIDB4Mjc3MCwgMHgyNzczLCAweDI3NzIsIDB4Mjc3NSwgMHgyNzc0LAorICAgIDB4MjdDNCwgMHgyN0MzLCAweDI3QzYsIDB4MjdDNSwgMHgyN0M5LCAweDI3QzgsIDB4MjdENiwgMHgyN0Q1LCAweDI3REUsCisgICAgMHgyN0RELCAweDI3RTMsIDB4MjdFMiwgMHgyN0U1LCAweDI3RTQsIDB4MjdFNywgMHgyN0U2LCAweDI3RTksIDB4MjdFOCwKKyAgICAweDI3RUIsIDB4MjdFQSwgMHgyN0VELCAweDI3RUMsIDB4MjdFRiwgMHgyN0VFLCAweDI5ODQsIDB4Mjk4MywgMHgyOTg2LAorICAgIDB4Mjk4NSwgMHgyOTg4LCAweDI5ODcsIDB4Mjk4QSwgMHgyOTg5LCAweDI5OEMsIDB4Mjk4QiwgMHgyOTkwLCAweDI5OEYsCisgICAgMHgyOThFLCAweDI5OEQsIDB4Mjk5MiwgMHgyOTkxLCAweDI5OTQsIDB4Mjk5MywgMHgyOTk2LCAweDI5OTUsIDB4Mjk5OCwKKyAgICAweDI5OTcsIDB4MjI5OCwgMHgyOUMxLCAweDI5QzAsIDB4MjlDNSwgMHgyOUM0LCAweDI5RDAsIDB4MjlDRiwgMHgyOUQyLAorICAgIDB4MjlEMSwgMHgyOUQ1LCAweDI5RDQsIDB4MjlEOSwgMHgyOUQ4LCAweDI5REIsIDB4MjlEQSwgMHgyMjE1LCAweDI5RjksCisgICAgMHgyOUY4LCAweDI5RkQsIDB4MjlGQywgMHgyQTJDLCAweDJBMkIsIDB4MkEyRSwgMHgyQTJELCAweDJBMzUsIDB4MkEzNCwKKyAgICAweDJBM0QsIDB4MkEzQywgMHgyQTY1LCAweDJBNjQsIDB4MkE3QSwgMHgyQTc5LCAweDJBN0UsIDB4MkE3RCwgMHgyQTgwLAorICAgIDB4MkE3RiwgMHgyQTgyLCAweDJBODEsIDB4MkE4NCwgMHgyQTgzLCAweDJBOEMsIDB4MkE4QiwgMHgyQTkyLCAweDJBOTEsCisgICAgMHgyQTk0LCAweDJBOTMsIDB4MkE5NiwgMHgyQTk1LCAweDJBOTgsIDB4MkE5NywgMHgyQTlBLCAweDJBOTksIDB4MkE5QywKKyAgICAweDJBOUIsIDB4MkFBMiwgMHgyQUExLCAweDJBQTcsIDB4MkFBNiwgMHgyQUE5LCAweDJBQTgsIDB4MkFBQiwgMHgyQUFBLAorICAgIDB4MkFBRCwgMHgyQUFDLCAweDJBQjAsIDB4MkFBRiwgMHgyQUI0LCAweDJBQjMsIDB4MkFCQywgMHgyQUJCLCAweDJBQkUsCisgICAgMHgyQUJELCAweDJBQzAsIDB4MkFCRiwgMHgyQUMyLCAweDJBQzEsIDB4MkFDNCwgMHgyQUMzLCAweDJBQzYsIDB4MkFDNSwKKyAgICAweDJBQ0UsIDB4MkFDRCwgMHgyQUQwLCAweDJBQ0YsIDB4MkFEMiwgMHgyQUQxLCAweDJBRDQsIDB4MkFEMywgMHgyQUQ2LAorICAgIDB4MkFENSwgMHgyMkE2LCAweDIyQTksIDB4MjJBOCwgMHgyMkFCLCAweDJBRUQsIDB4MkFFQywgMHgyQUY4LCAweDJBRjcsCisgICAgMHgyQUZBLCAweDJBRjksIDB4MkUwMywgMHgyRTAyLCAweDJFMDUsIDB4MkUwNCwgMHgyRTBBLCAweDJFMDksIDB4MkUwRCwKKyAgICAweDJFMEMsIDB4MkUxRCwgMHgyRTFDLCAweDJFMjEsIDB4MkUyMCwgMHgyRTIzLCAweDJFMjIsIDB4MkUyNSwgMHgyRTI0LAorICAgIDB4MkUyNywgMHgyRTI2LCAweDJFMjksIDB4MkUyOCwgMHgzMDA5LCAweDMwMDgsIDB4MzAwQiwgMHgzMDBBLCAweDMwMEQsCisgICAgMHgzMDBDLCAweDMwMEYsIDB4MzAwRSwgMHgzMDExLCAweDMwMTAsIDB4MzAxNSwgMHgzMDE0LCAweDMwMTcsIDB4MzAxNiwKKyAgICAweDMwMTksIDB4MzAxOCwgMHgzMDFCLCAweDMwMUEsIDB4RkU1QSwgMHhGRTU5LCAweEZFNUMsIDB4RkU1QiwgMHhGRTVFLAorICAgIDB4RkU1RCwgMHhGRTY1LCAweEZFNjQsIDB4RkYwOSwgMHhGRjA4LCAweEZGMUUsIDB4RkYxQywgMHhGRjNELCAweEZGM0IsCisgICAgMHhGRjVELCAweEZGNUIsIDB4RkY2MCwgMHhGRjVGLCAweEZGNjMsIDB4RkY2MiwgMHhGRkZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCisgICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCisgICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCisgICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCisgICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCisgICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF91bmljb2RlLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwCmluZGV4IGQ2NmE1OGEuLmYwNWFlYjUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwCkBAIC05LDU4ICs5LDU2IEBACiBleHRlcm4gY29uc3QgRlhfRFdPUkQgZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1s2NTUzNl07CiBleHRlcm4gY29uc3QgRlhfV0NIQVIgZ3NfRlhfVGV4dExheW91dF9WZXJ0aWNhbE1pcnJvcls2NF07CiBleHRlcm4gY29uc3QgRlhfV0NIQVIgZ3NfRlhfVGV4dExheW91dF9CaWRpTWlycm9yWzUxMl07Ci1GWF9EV09SRCBGWF9HZXRVbmljb2RlUHJvcGVydGllcyhGWF9XQ0hBUiB3Y2gpCi17Ci0gICAgcmV0dXJuIGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsKK0ZYX0RXT1JEIEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKEZYX1dDSEFSIHdjaCkgeworICByZXR1cm4gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOwogfQotRlhfQk9PTCBGWF9Jc0N0cmxDb2RlKEZYX1dDSEFSIGNoKQotewotICAgIEZYX0RXT1JEIGR3UmV0ID0gKGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpY2hdICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7Ci0gICAgcmV0dXJuIGR3UmV0ID09IEZYX0NIQVJUWVBFX1RhYiB8fCBkd1JldCA9PSBGWF9DSEFSVFlQRV9Db250cm9sOworRlhfQk9PTCBGWF9Jc0N0cmxDb2RlKEZYX1dDSEFSIGNoKSB7CisgIEZYX0RXT1JEIGR3UmV0ID0KKyAgICAgIChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKWNoXSAmIEZYX0NIQVJUWVBFQklUU01BU0spOworICByZXR1cm4gZHdSZXQgPT0gRlhfQ0hBUlRZUEVfVGFiIHx8IGR3UmV0ID09IEZYX0NIQVJUWVBFX0NvbnRyb2w7CiB9Ci1GWF9CT09MIEZYX0lzUm90YXRpb25Db2RlKEZYX1dDSEFSIGNoKQotewotICAgIHJldHVybiAoZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCljaF0gJiAweDgwMDApICE9IDA7CitGWF9CT09MIEZYX0lzUm90YXRpb25Db2RlKEZYX1dDSEFSIGNoKSB7CisgIHJldHVybiAoZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCljaF0gJiAweDgwMDApICE9IDA7CiB9Ci1GWF9CT09MIEZYX0lzQ29tYmluYXRpb25DaGFyKEZYX1dDSEFSIHdjaCkKLXsKLSAgICBGWF9EV09SRCBkd1Byb3BzID0gKGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXSAmIEZYX0NIQVJUWVBFQklUU01BU0spOwotICAgIHJldHVybiBkd1Byb3BzID09IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uOworRlhfQk9PTCBGWF9Jc0NvbWJpbmF0aW9uQ2hhcihGWF9XQ0hBUiB3Y2gpIHsKKyAgRlhfRFdPUkQgZHdQcm9wcyA9CisgICAgICAoZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7CisgIHJldHVybiBkd1Byb3BzID09IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uOwogfQotRlhfQk9PTAlGWF9Jc0JpZGlDaGFyKEZYX1dDSEFSIHdjaCkKLXsKLSAgICBGWF9EV09SRCBkd1Byb3BzID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOwotICAgIGludDMyX3QgaUJpZGlDbHMgPSAoZHdQcm9wcyAmIEZYX0JJRElDTEFTU0JJVFNNQVNLKSA+PiBGWF9CSURJQ0xBU1NCSVRTOwotICAgIHJldHVybiAoRlhfQklESUNMQVNTX1IgPT0gaUJpZGlDbHMgfHwgRlhfQklESUNMQVNTX0FMID09IGlCaWRpQ2xzKTsKK0ZYX0JPT0wgRlhfSXNCaWRpQ2hhcihGWF9XQ0hBUiB3Y2gpIHsKKyAgRlhfRFdPUkQgZHdQcm9wcyA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsKKyAgaW50MzJfdCBpQmlkaUNscyA9IChkd1Byb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+IEZYX0JJRElDTEFTU0JJVFM7CisgIHJldHVybiAoRlhfQklESUNMQVNTX1IgPT0gaUJpZGlDbHMgfHwgRlhfQklESUNMQVNTX0FMID09IGlCaWRpQ2xzKTsKIH0KLUZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBGWF9CT09MIGJSVEwsIEZYX0JPT0wgYlZlcnRpY2FsKQotewotICAgIEZYX0RXT1JEIGR3UHJvcHMgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07Ci0gICAgRlhfRFdPUkQgZHdUZW1wID0gKGR3UHJvcHMgJiAweEZGODAwMDAwKTsKLSAgICBpZiAoYlJUTCAmJiBkd1RlbXAgPCAweEZGODAwMDAwKSB7Ci0gICAgICAgIHdjaCA9IGdzX0ZYX1RleHRMYXlvdXRfQmlkaU1pcnJvcltkd1RlbXAgPj4gMjNdOwotICAgICAgICBkd1Byb3BzID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOworRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX0JPT0wgYlJUTCwgRlhfQk9PTCBiVmVydGljYWwpIHsKKyAgRlhfRFdPUkQgZHdQcm9wcyA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsKKyAgRlhfRFdPUkQgZHdUZW1wID0gKGR3UHJvcHMgJiAweEZGODAwMDAwKTsKKyAgaWYgKGJSVEwgJiYgZHdUZW1wIDwgMHhGRjgwMDAwMCkgeworICAgIHdjaCA9IGdzX0ZYX1RleHRMYXlvdXRfQmlkaU1pcnJvcltkd1RlbXAgPj4gMjNdOworICAgIGR3UHJvcHMgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07CisgIH0KKyAgaWYgKGJWZXJ0aWNhbCkgeworICAgIGR3VGVtcCA9IChkd1Byb3BzICYgMHgwMDdFMDAwMCk7CisgICAgaWYgKGR3VGVtcCA8IDB4MDA3RTAwMDApIHsKKyAgICAgIHdjaCA9IGdzX0ZYX1RleHRMYXlvdXRfVmVydGljYWxNaXJyb3JbZHdUZW1wID4+IDE3XTsKICAgICB9Ci0gICAgaWYgKGJWZXJ0aWNhbCkgewotICAgICAgICBkd1RlbXAgPSAoZHdQcm9wcyAmIDB4MDA3RTAwMDApOwotICAgICAgICBpZiAoZHdUZW1wIDwgMHgwMDdFMDAwMCkgewotICAgICAgICAgICAgd2NoID0gZ3NfRlhfVGV4dExheW91dF9WZXJ0aWNhbE1pcnJvcltkd1RlbXAgPj4gMTddOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB3Y2g7CisgIH0KKyAgcmV0dXJuIHdjaDsKIH0KLUZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBGWF9EV09SRCBkd1Byb3BzLCBGWF9CT09MIGJSVEwsIEZYX0JPT0wgYlZlcnRpY2FsKQotewotICAgIEZYX0RXT1JEIGR3VGVtcCA9IChkd1Byb3BzICYgMHhGRjgwMDAwMCk7Ci0gICAgaWYgKGJSVEwgJiYgZHdUZW1wIDwgMHhGRjgwMDAwMCkgewotICAgICAgICB3Y2ggPSBnc19GWF9UZXh0TGF5b3V0X0JpZGlNaXJyb3JbZHdUZW1wID4+IDIzXTsKLSAgICAgICAgZHdQcm9wcyA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsKK0ZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnRpY2FsKSB7CisgIEZYX0RXT1JEIGR3VGVtcCA9IChkd1Byb3BzICYgMHhGRjgwMDAwMCk7CisgIGlmIChiUlRMICYmIGR3VGVtcCA8IDB4RkY4MDAwMDApIHsKKyAgICB3Y2ggPSBnc19GWF9UZXh0TGF5b3V0X0JpZGlNaXJyb3JbZHdUZW1wID4+IDIzXTsKKyAgICBkd1Byb3BzID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOworICB9CisgIGlmIChiVmVydGljYWwpIHsKKyAgICBkd1RlbXAgPSAoZHdQcm9wcyAmIDB4MDA3RTAwMDApOworICAgIGlmIChkd1RlbXAgPCAweDAwN0UwMDAwKSB7CisgICAgICB3Y2ggPSBnc19GWF9UZXh0TGF5b3V0X1ZlcnRpY2FsTWlycm9yW2R3VGVtcCA+PiAxN107CiAgICAgfQotICAgIGlmIChiVmVydGljYWwpIHsKLSAgICAgICAgZHdUZW1wID0gKGR3UHJvcHMgJiAweDAwN0UwMDAwKTsKLSAgICAgICAgaWYgKGR3VGVtcCA8IDB4MDA3RTAwMDApIHsKLSAgICAgICAgICAgIHdjaCA9IGdzX0ZYX1RleHRMYXlvdXRfVmVydGljYWxNaXJyb3JbZHdUZW1wID4+IDE3XTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gd2NoOworICB9CisgIHJldHVybiB3Y2g7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF94bWxfY29tcG9zZXIuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfeG1sX2NvbXBvc2VyLmNwcAppbmRleCA5Nzk3MWFhLi5lZDIzM2ZmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF94bWxfY29tcG9zZXIuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3htbF9jb21wb3Nlci5jcHAKQEAgLTYsMzUgKzYsMzYgQEAKIAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgiCiAjaW5jbHVkZSAieG1sX2ludC5oIgotdm9pZCBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGdWxsTmFtZSwgQ0ZYX0J5dGVTdHJpbmdDICZic1NwYWNlLCBDRlhfQnl0ZVN0cmluZ0MgJmJzTmFtZSkKLXsKLSAgICBpZiAoYnNGdWxsTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGdWxsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MmIGJzU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDJiBic05hbWUpIHsKKyAgaWYgKGJzRnVsbE5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIGludDMyX3QgaVN0YXJ0ID0gMDsKKyAgZm9yICg7IGlTdGFydCA8IGJzRnVsbE5hbWUuR2V0TGVuZ3RoKCk7IGlTdGFydCsrKSB7CisgICAgaWYgKGJzRnVsbE5hbWUuR2V0QXQoaVN0YXJ0KSA9PSAnOicpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gICAgZm9yICg7IGlTdGFydCA8IGJzRnVsbE5hbWUuR2V0TGVuZ3RoKCk7IGlTdGFydCArKykgewotICAgICAgICBpZiAoYnNGdWxsTmFtZS5HZXRBdChpU3RhcnQpID09ICc6JykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGlTdGFydCA+PSBic0Z1bGxOYW1lLkdldExlbmd0aCgpKSB7Ci0gICAgICAgIGJzTmFtZSA9IGJzRnVsbE5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYnNTcGFjZSA9IENGWF9CeXRlU3RyaW5nQyhic0Z1bGxOYW1lLkdldENTdHIoKSwgaVN0YXJ0KTsKLSAgICAgICAgaVN0YXJ0ICsrOwotICAgICAgICBic05hbWUgPSBDRlhfQnl0ZVN0cmluZ0MoYnNGdWxsTmFtZS5HZXRDU3RyKCkgKyBpU3RhcnQsIGJzRnVsbE5hbWUuR2V0TGVuZ3RoKCkgLSBpU3RhcnQpOwotICAgIH0KKyAgfQorICBpZiAoaVN0YXJ0ID49IGJzRnVsbE5hbWUuR2V0TGVuZ3RoKCkpIHsKKyAgICBic05hbWUgPSBic0Z1bGxOYW1lOworICB9IGVsc2UgeworICAgIGJzU3BhY2UgPSBDRlhfQnl0ZVN0cmluZ0MoYnNGdWxsTmFtZS5HZXRDU3RyKCksIGlTdGFydCk7CisgICAgaVN0YXJ0Kys7CisgICAgYnNOYW1lID0gQ0ZYX0J5dGVTdHJpbmdDKGJzRnVsbE5hbWUuR2V0Q1N0cigpICsgaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0Z1bGxOYW1lLkdldExlbmd0aCgpIC0gaVN0YXJ0KTsKKyAgfQogfQotdm9pZCBDWE1MX0VsZW1lbnQ6OlNldFRhZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFTcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWduYW1lKQotewotICAgIG1fUVNwYWNlTmFtZSA9IHFTcGFjZTsKLSAgICBtX1RhZ05hbWUgPSB0YWduYW1lOwordm9pZCBDWE1MX0VsZW1lbnQ6OlNldFRhZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWduYW1lKSB7CisgIG1fUVNwYWNlTmFtZSA9IHFTcGFjZTsKKyAgbV9UYWdOYW1lID0gdGFnbmFtZTsKIH0KLXZvaWQgQ1hNTF9FbGVtZW50OjpTZXRUYWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxVGFnTmFtZSkKLXsKLSAgICBBU1NFUlQoIXFUYWdOYW1lLklzRW1wdHkoKSk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJzU3BhY2UsIGJzTmFtZTsKLSAgICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKHFUYWdOYW1lLCBic1NwYWNlLCBic05hbWUpOwotICAgIG1fUVNwYWNlTmFtZSA9IGJzU3BhY2U7Ci0gICAgbV9UYWdOYW1lID0gYnNOYW1lOwordm9pZCBDWE1MX0VsZW1lbnQ6OlNldFRhZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFUYWdOYW1lKSB7CisgIEFTU0VSVCghcVRhZ05hbWUuSXNFbXB0eSgpKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJzU3BhY2UsIGJzTmFtZTsKKyAgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShxVGFnTmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKKyAgbV9RU3BhY2VOYW1lID0gYnNTcGFjZTsKKyAgbV9UYWdOYW1lID0gYnNOYW1lOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfeG1sX3BhcnNlci5jcHAgYi9jb3JlL3NyYy9meGNydC9meF94bWxfcGFyc2VyLmNwcAppbmRleCBmNDFkYjBlLi42MWU2NmZiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF94bWxfcGFyc2VyLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF94bWxfcGFyc2VyLmNwcApAQCAtNiw4NTkgKzYsODQ0IEBACiAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oIgogI2luY2x1ZGUgInhtbF9pbnQuaCIKLUNYTUxfUGFyc2VyOjp+Q1hNTF9QYXJzZXIoKQotewotICAgIGlmIChtX2JPd25lZFN0cmVhbSkgewotICAgICAgICBtX3BEYXRhQWNjLT5SZWxlYXNlKCk7Ci0gICAgfQorQ1hNTF9QYXJzZXI6On5DWE1MX1BhcnNlcigpIHsKKyAgaWYgKG1fYk93bmVkU3RyZWFtKSB7CisgICAgbV9wRGF0YUFjYy0+UmVsZWFzZSgpOworICB9CiB9Ci1GWF9CT09MIENYTUxfUGFyc2VyOjpJbml0KHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKQotewotICAgIG1fcERhdGFBY2MgPSBGWF9ORVcgQ1hNTF9EYXRhQnVmQWNjKHBCdWZmZXIsIHNpemUpOwotICAgIGlmICghbV9wRGF0YUFjYykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBJbml0KFRSVUUpOworRlhfQk9PTCBDWE1MX1BhcnNlcjo6SW5pdCh1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICBtX3BEYXRhQWNjID0gRlhfTkVXIENYTUxfRGF0YUJ1ZkFjYyhwQnVmZmVyLCBzaXplKTsKKyAgaWYgKCFtX3BEYXRhQWNjKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBJbml0KFRSVUUpOwogfQotRlhfQk9PTCBDWE1MX1BhcnNlcjo6SW5pdChJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCkKLXsKLSAgICBtX3BEYXRhQWNjID0gRlhfTkVXIENYTUxfRGF0YVN0bUFjYyhwRmlsZVJlYWQpOwotICAgIGlmICghbV9wRGF0YUFjYykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBJbml0KFRSVUUpOworRlhfQk9PTCBDWE1MX1BhcnNlcjo6SW5pdChJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCkgeworICBtX3BEYXRhQWNjID0gRlhfTkVXIENYTUxfRGF0YVN0bUFjYyhwRmlsZVJlYWQpOworICBpZiAoIW1fcERhdGFBY2MpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIEluaXQoVFJVRSk7CiB9Ci1GWF9CT09MIENYTUxfUGFyc2VyOjpJbml0KElGWF9CdWZmZXJSZWFkICpwQnVmZmVyKQotewotICAgIGlmICghcEJ1ZmZlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcERhdGFBY2MgPSBwQnVmZmVyOwotICAgIHJldHVybiBJbml0KEZBTFNFKTsKK0ZYX0JPT0wgQ1hNTF9QYXJzZXI6OkluaXQoSUZYX0J1ZmZlclJlYWQqIHBCdWZmZXIpIHsKKyAgaWYgKCFwQnVmZmVyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcERhdGFBY2MgPSBwQnVmZmVyOworICByZXR1cm4gSW5pdChGQUxTRSk7CiB9Ci1GWF9CT09MIENYTUxfUGFyc2VyOjpJbml0KEZYX0JPT0wgYk93bmRlZFN0cmVhbSkKLXsKLSAgICBtX2JPd25lZFN0cmVhbSA9IGJPd25kZWRTdHJlYW07Ci0gICAgbV9uT2Zmc2V0ID0gMDsKLSAgICByZXR1cm4gUmVhZE5leHRCbG9jaygpOworRlhfQk9PTCBDWE1MX1BhcnNlcjo6SW5pdChGWF9CT09MIGJPd25kZWRTdHJlYW0pIHsKKyAgbV9iT3duZWRTdHJlYW0gPSBiT3duZGVkU3RyZWFtOworICBtX25PZmZzZXQgPSAwOworICByZXR1cm4gUmVhZE5leHRCbG9jaygpOwogfQotRlhfQk9PTCBDWE1MX1BhcnNlcjo6UmVhZE5leHRCbG9jaygpCi17Ci0gICAgaWYgKCFtX3BEYXRhQWNjLT5SZWFkTmV4dEJsb2NrKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BCdWZmZXIgPSBtX3BEYXRhQWNjLT5HZXRCbG9ja0J1ZmZlcigpOwotICAgIG1fZHdCdWZmZXJTaXplID0gbV9wRGF0YUFjYy0+R2V0QmxvY2tTaXplKCk7Ci0gICAgbV9uQnVmZmVyT2Zmc2V0ID0gbV9wRGF0YUFjYy0+R2V0QmxvY2tPZmZzZXQoKTsKLSAgICBtX2R3SW5kZXggPSAwOwotICAgIHJldHVybiBtX2R3QnVmZmVyU2l6ZSA+IDA7CitGWF9CT09MIENYTUxfUGFyc2VyOjpSZWFkTmV4dEJsb2NrKCkgeworICBpZiAoIW1fcERhdGFBY2MtPlJlYWROZXh0QmxvY2soKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BCdWZmZXIgPSBtX3BEYXRhQWNjLT5HZXRCbG9ja0J1ZmZlcigpOworICBtX2R3QnVmZmVyU2l6ZSA9IG1fcERhdGFBY2MtPkdldEJsb2NrU2l6ZSgpOworICBtX25CdWZmZXJPZmZzZXQgPSBtX3BEYXRhQWNjLT5HZXRCbG9ja09mZnNldCgpOworICBtX2R3SW5kZXggPSAwOworICByZXR1cm4gbV9kd0J1ZmZlclNpemUgPiAwOwogfQotRlhfQk9PTCBDWE1MX1BhcnNlcjo6SXNFT0YoKQotewotICAgIGlmICghbV9wRGF0YUFjYy0+SXNFT0YoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBtX2R3SW5kZXggPj0gbV9kd0J1ZmZlclNpemU7CitGWF9CT09MIENYTUxfUGFyc2VyOjpJc0VPRigpIHsKKyAgaWYgKCFtX3BEYXRhQWNjLT5Jc0VPRigpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBtX2R3SW5kZXggPj0gbV9kd0J1ZmZlclNpemU7CiB9Ci0jZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTm9ybWFsCQkJMHgwMAotI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX1NwYWNlQ2hhcgkJMHgwMQotI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0xldHRlcgkJCTB4MDIKLSNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9EaWdpdGFsCQkJMHgwNAotI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX05hbWVJbnRybwkJMHgwOAotI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX05hbWVDaGFyCQkweDEwCi0jZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4RGlnaXRhbAkJMHgyMAotI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0hleExvd2VyTGV0dGVyCTB4NDAKLSNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhVcHBlckxldHRlcgkweDYwCi0jZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4Q2hhcgkJCTB4NjAKKyNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9Ob3JtYWwgMHgwMAorI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX1NwYWNlQ2hhciAweDAxCisjZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTGV0dGVyIDB4MDIKKyNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9EaWdpdGFsIDB4MDQKKyNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9OYW1lSW50cm8gMHgwOAorI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX05hbWVDaGFyIDB4MTAKKyNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhEaWdpdGFsIDB4MjAKKyNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhMb3dlckxldHRlciAweDQwCisjZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4VXBwZXJMZXR0ZXIgMHg2MAorI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0hleENoYXIgMHg2MAogdWludDhfdCBnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbMjU2XSA9IHsKLSAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAotICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0gICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwKLSAgICAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4N0EsIDB4N0EsIDB4N0EsIDB4N0EsIDB4N0EsIDB4N0EsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCi0gICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwKLSAgICAweDAwLCAweDVBLCAweDVBLCAweDVBLCAweDVBLCAweDVBLCAweDVBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAotICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAotICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCi0gICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAotICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCi0gICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsCisgICAgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNCwgMHgwOCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDdBLCAweDdBLCAweDdBLCAweDdBLCAweDdBLCAweDdBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwKKyAgICAweDAwLCAweDVBLCAweDVBLCAweDVBLCAweDVBLCAweDVBLCAweDVBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MDEsIDB4MDEsCiB9OwotRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc1doaXRlU3BhY2UodWludDhfdCBjaCkKLXsKLSAgICByZXR1cm4gKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX1NwYWNlQ2hhcikgIT0gMDsKK0ZYX0JPT0wgZ19GWENSVF9YTUxfSXNXaGl0ZVNwYWNlKHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9TcGFjZUNoYXIpICE9IDA7CiB9Ci1GWF9CT09MIGdfRlhDUlRfWE1MX0lzTGV0dGVyKHVpbnQ4X3QgY2gpCi17Ci0gICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9MZXR0ZXIpICE9IDA7CitGWF9CT09MIGdfRlhDUlRfWE1MX0lzTGV0dGVyKHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9MZXR0ZXIpICE9IDA7CiB9Ci1GWF9CT09MIGdfRlhDUlRfWE1MX0lzRGlnaXRhbCh1aW50OF90IGNoKQotewotICAgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfRGlnaXRhbCkgIT0gMDsKK0ZYX0JPT0wgZ19GWENSVF9YTUxfSXNEaWdpdGFsKHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9EaWdpdGFsKSAhPSAwOwogfQotRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc05hbWVJbnRybyh1aW50OF90IGNoKQotewotICAgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTmFtZUludHJvKSAhPSAwOworRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc05hbWVJbnRybyh1aW50OF90IGNoKSB7CisgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTmFtZUludHJvKSAhPSAwOwogfQotRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc05hbWVDaGFyKHVpbnQ4X3QgY2gpCi17Ci0gICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9OYW1lQ2hhcikgIT0gMDsKK0ZYX0JPT0wgZ19GWENSVF9YTUxfSXNOYW1lQ2hhcih1aW50OF90IGNoKSB7CisgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTmFtZUNoYXIpICE9IDA7CiB9Ci1GWF9CT09MIGdfRlhDUlRfWE1MX0lzSGV4Q2hhcih1aW50OF90IGNoKQotewotICAgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4Q2hhcikgIT0gMDsKK0ZYX0JPT0wgZ19GWENSVF9YTUxfSXNIZXhDaGFyKHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhDaGFyKSAhPSAwOwogfQotdm9pZCBDWE1MX1BhcnNlcjo6U2tpcFdoaXRlU3BhY2VzKCkKLXsKLSAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1hNTF9QYXJzZXI6OlNraXBXaGl0ZVNwYWNlcygpIHsKKyAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKKyAgaWYgKElzRU9GKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgZG8geworICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSAmJgorICAgICAgICAgICBnX0ZYQ1JUX1hNTF9Jc1doaXRlU3BhY2UobV9wQnVmZmVyW21fZHdJbmRleF0pKSB7CisgICAgICBtX2R3SW5kZXgrKzsKICAgICB9Ci0gICAgZG8gewotICAgICAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgJiYgZ19GWENSVF9YTUxfSXNXaGl0ZVNwYWNlKG1fcEJ1ZmZlclttX2R3SW5kZXhdKSkgewotICAgICAgICAgICAgbV9kd0luZGV4ICsrOwotICAgICAgICB9Ci0gICAgICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7Ci0gICAgICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7Ci19Ci12b2lkIENYTUxfUGFyc2VyOjpHZXROYW1lKENGWF9CeXRlU3RyaW5nICZzcGFjZSwgQ0ZYX0J5dGVTdHJpbmcgJm5hbWUpCi17CiAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKLSAgICBpZiAoSXNFT0YoKSkgewotICAgICAgICByZXR1cm47CisgICAgaWYgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICAgIHVpbnQ4X3QgY2g7Ci0gICAgZG8gewotICAgICAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKLSAgICAgICAgICAgIGNoID0gbV9wQnVmZmVyW21fZHdJbmRleF07Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgc3BhY2UgPSBidWYuR2V0Qnl0ZVN0cmluZygpOwotICAgICAgICAgICAgICAgIGJ1Zi5DbGVhcigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChnX0ZYQ1JUX1hNTF9Jc05hbWVDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGNoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgIH0KLSAgICAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKLSAgICAgICAgaWYgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKLSAgICBuYW1lID0gYnVmLkdldEJ5dGVTdHJpbmcoKTsKKyAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKIH0KLXZvaWQgQ1hNTF9QYXJzZXI6OlNraXBMaXRlcmFscyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikKLXsKLSAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1hNTF9QYXJzZXI6OkdldE5hbWUoQ0ZYX0J5dGVTdHJpbmcmIHNwYWNlLCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgeworICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OworICBpZiAoSXNFT0YoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICB1aW50OF90IGNoOworICBkbyB7CisgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7CisgICAgICBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXhdOworICAgICAgaWYgKGNoID09ICc6JykgeworICAgICAgICBzcGFjZSA9IGJ1Zi5HZXRCeXRlU3RyaW5nKCk7CisgICAgICAgIGJ1Zi5DbGVhcigpOworICAgICAgfSBlbHNlIGlmIChnX0ZYQ1JUX1hNTF9Jc05hbWVDaGFyKGNoKSkgeworICAgICAgICBidWYuQXBwZW5kQ2hhcihjaCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIG1fZHdJbmRleCsrOwogICAgIH0KLSAgICBpbnQzMl90IGkgPSAwLCBpTGVuID0gc3RyLkdldExlbmd0aCgpOwotICAgIGRvIHsKLSAgICAgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICBpZiAoc3RyLkdldEF0KGkpICE9IG1fcEJ1ZmZlclttX2R3SW5kZXggKytdKSB7Ci0gICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGkgKys7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gaUxlbikgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OworICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7CisgIG5hbWUgPSBidWYuR2V0Qnl0ZVN0cmluZygpOworfQordm9pZCBDWE1MX1BhcnNlcjo6U2tpcExpdGVyYWxzKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7CisgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7CisgIGlmIChJc0VPRigpKSB7CisgICAgcmV0dXJuOworICB9CisgIGludDMyX3QgaSA9IDAsIGlMZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIGRvIHsKKyAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKKyAgICAgIGlmIChzdHIuR2V0QXQoaSkgIT0gbV9wQnVmZmVyW21fZHdJbmRleCsrXSkgeworICAgICAgICBpID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGkrKzsKICAgICAgICAgaWYgKGkgPT0gaUxlbikgewotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7Ci0gICAgd2hpbGUgKCFtX3BEYXRhQWNjLT5Jc0VPRigpKSB7Ci0gICAgICAgIFJlYWROZXh0QmxvY2soKTsKLSAgICAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdCdWZmZXJTaXplOworICAgICAgfQogICAgIH0KLSAgICBtX2R3SW5kZXggPSBtX2R3QnVmZmVyU2l6ZTsKLX0KLUZYX0RXT1JEIENYTUxfUGFyc2VyOjpHZXRDaGFyUmVmKCkKLXsKICAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChpID09IGlMZW4pIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgdWludDhfdCBjaDsKLSAgICBpbnQzMl90IGlTdGF0ZSA9IDA7Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBGWF9EV09SRCBjb2RlID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKLSAgICAgICAgICAgIHN3aXRjaCAoaVN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpU3RhdGUgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaVN0YXRlID0gMTsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIG1fZHdJbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc7JykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHJlZiA9IGJ1Zi5HZXRCeXRlU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmID09IEZYX0JTVFJDKCJndCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9ICc+JzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVmID09IEZYX0JTVFJDKCJsdCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9ICc8JzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVmID09IEZYX0JTVFJDKCJhbXAiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAnJic7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZiA9PSBGWF9CU1RSQygiYXBvcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9ICdcJyc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZiA9PSBGWF9CU1RSQygicXVvdCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9ICciJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZEJ5dGUoY2gpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAneCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdJbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpU3RhdGUgPSAzOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgbV9kd0luZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpU3RhdGUgPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnX0ZYQ1JUX1hNTF9Jc0RpZ2l0YWwoY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gY29kZSAqIDEwICsgY2ggLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuSGV4ID0gZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4Q2hhcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5IZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSGV4ID09IEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4RGlnaXRhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCA0KSArIGNoIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuSGV4ID09IEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4TG93ZXJMZXR0ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gKGNvZGUgPDwgNCkgKyBjaCAtIDg3OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gKGNvZGUgPDwgNCkgKyBjaCAtIDU1OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlTdGF0ZSA9PSAxMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7Ci0gICAgICAgIGlmIChpU3RhdGUgPT0gMTAgfHwgbV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOwotICAgIHJldHVybiBjb2RlOworICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7CisgIHdoaWxlICghbV9wRGF0YUFjYy0+SXNFT0YoKSkgeworICAgIFJlYWROZXh0QmxvY2soKTsKKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0J1ZmZlclNpemU7CisgIH0KKyAgbV9kd0luZGV4ID0gbV9kd0J1ZmZlclNpemU7CiB9Ci12b2lkIENYTUxfUGFyc2VyOjpHZXRBdHRyVmFsdWUoQ0ZYX1dpZGVTdHJpbmcgJnZhbHVlKQotewotICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7Ci0gICAgaWYgKElzRU9GKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfVVRGOERlY29kZXIgZGVjb2RlcjsKLSAgICB1aW50OF90IG1hcmsgPSAwLCBjaCA9IDA7Ci0gICAgZG8gewotICAgICAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKLSAgICAgICAgICAgIGNoID0gbV9wQnVmZmVyW21fZHdJbmRleF07Ci0gICAgICAgICAgICBpZiAobWFyayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoICE9ICdcJycgJiYgY2ggIT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFyayA9IGNoOwotICAgICAgICAgICAgICAgIG1fZHdJbmRleCArKzsKLSAgICAgICAgICAgICAgICBjaCA9IDA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CitGWF9EV09SRCBDWE1MX1BhcnNlcjo6R2V0Q2hhclJlZigpIHsKKyAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKKyAgaWYgKElzRU9GKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICB1aW50OF90IGNoOworICBpbnQzMl90IGlTdGF0ZSA9IDA7CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIEZYX0RXT1JEIGNvZGUgPSAwOworICBkbyB7CisgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7CisgICAgICBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXhdOworICAgICAgc3dpdGNoIChpU3RhdGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIGlmIChjaCA9PSAnIycpIHsKKyAgICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgICAgaVN0YXRlID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpU3RhdGUgPSAxOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgaWYgKGNoID09ICc7JykgeworICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHJlZiA9IGJ1Zi5HZXRCeXRlU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAocmVmID09IEZYX0JTVFJDKCJndCIpKSB7CisgICAgICAgICAgICAgIGNvZGUgPSAnPic7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZiA9PSBGWF9CU1RSQygibHQiKSkgeworICAgICAgICAgICAgICBjb2RlID0gJzwnOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZWYgPT0gRlhfQlNUUkMoImFtcCIpKSB7CisgICAgICAgICAgICAgIGNvZGUgPSAnJic7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZiA9PSBGWF9CU1RSQygiYXBvcyIpKSB7CisgICAgICAgICAgICAgIGNvZGUgPSAnXCcnOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZWYgPT0gRlhfQlNUUkMoInF1b3QiKSkgeworICAgICAgICAgICAgICBjb2RlID0gJyInOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9kd0luZGV4ICsrOwotICAgICAgICAgICAgaWYgKGNoID09IG1hcmspIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnJicpIHsKLSAgICAgICAgICAgICAgICBkZWNvZGVyLkFwcGVuZENoYXIoR2V0Q2hhclJlZigpKTsKLSAgICAgICAgICAgICAgICBpZiAoSXNFT0YoKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlY29kZXIuR2V0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpU3RhdGUgPSAxMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBidWYuQXBwZW5kQnl0ZShjaCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBpZiAoY2ggPT0gJ3gnKSB7CisgICAgICAgICAgICBtX2R3SW5kZXgrKzsKKyAgICAgICAgICAgIGlTdGF0ZSA9IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaVN0YXRlID0gMzsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgIGlmIChjaCA9PSAnOycpIHsKKyAgICAgICAgICAgIGlTdGF0ZSA9IDEwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChnX0ZYQ1JUX1hNTF9Jc0RpZ2l0YWwoY2gpKSB7CisgICAgICAgICAgICBjb2RlID0gY29kZSAqIDEwICsgY2ggLSAnMCc7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgaWYgKGNoID09ICc7JykgeworICAgICAgICAgICAgaVN0YXRlID0gMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCBuSGV4ID0KKyAgICAgICAgICAgICAgZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4Q2hhcjsKKyAgICAgICAgICBpZiAobkhleCkgeworICAgICAgICAgICAgaWYgKG5IZXggPT0gRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhEaWdpdGFsKSB7CisgICAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCA0KSArIGNoIC0gJzAnOworICAgICAgICAgICAgfSBlbHNlIGlmIChuSGV4ID09IEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4TG93ZXJMZXR0ZXIpIHsKKyAgICAgICAgICAgICAgY29kZSA9IChjb2RlIDw8IDQpICsgY2ggLSA4NzsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVjb2Rlci5JbnB1dChjaCk7CisgICAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCA0KSArIGNoIC0gNTU7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKLSAgICAgICAgaWYgKGNoID09IG1hcmsgfHwgbV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOwotICAgIHZhbHVlID0gZGVjb2Rlci5HZXRSZXN1bHQoKTsKLX0KLXZvaWQgQ1hNTF9QYXJzZXI6OkdldFRhZ05hbWUoQ0ZYX0J5dGVTdHJpbmcgJnNwYWNlLCBDRlhfQnl0ZVN0cmluZyAmbmFtZSwgRlhfQk9PTCAmYkVuZFRhZywgRlhfQk9PTCBiU3RhcnRUYWcpCi17CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGlTdGF0ZSA9PSAxMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CiAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKLSAgICBpZiAoSXNFT0YoKSkgewotICAgICAgICByZXR1cm47CisgICAgaWYgKGlTdGF0ZSA9PSAxMCB8fCBtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgYkVuZFRhZyA9IEZBTFNFOwotICAgIHVpbnQ4X3QgY2g7Ci0gICAgaW50MzJfdCBpU3RhdGUgPSBiU3RhcnRUYWcgPyAxIDogMDsKLSAgICBkbyB7Ci0gICAgICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKLSAgICAgICAgICAgIHN3aXRjaCAoaVN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnPCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc/JykgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0luZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgU2tpcExpdGVyYWxzKEZYX0JTVFJDKCI/PiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdJbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNraXBMaXRlcmFscyhGWF9CU1RSQygiLS0+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXRlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdJbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdldE5hbWUoc3BhY2UsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYkVuZFRhZyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZXROYW1lKHNwYWNlLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJFbmRUYWcgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKLSAgICAgICAgaWYgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKKyAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKKyAgcmV0dXJuIGNvZGU7CiB9Ci1DWE1MX0VsZW1lbnQqIENYTUxfUGFyc2VyOjpQYXJzZUVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwUGFyZW50LCBGWF9CT09MIGJTdGFydFRhZykKLXsKK3ZvaWQgQ1hNTF9QYXJzZXI6OkdldEF0dHJWYWx1ZShDRlhfV2lkZVN0cmluZyYgdmFsdWUpIHsKKyAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKKyAgaWYgKElzRU9GKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7CisgIHVpbnQ4X3QgbWFyayA9IDAsIGNoID0gMDsKKyAgZG8geworICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgeworICAgICAgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKKyAgICAgIGlmIChtYXJrID09IDApIHsKKyAgICAgICAgaWYgKGNoICE9ICdcJycgJiYgY2ggIT0gJyInKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1hcmsgPSBjaDsKKyAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgIGNoID0gMDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBtX2R3SW5kZXgrKzsKKyAgICAgIGlmIChjaCA9PSBtYXJrKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGNoID09ICcmJykgeworICAgICAgICBkZWNvZGVyLkFwcGVuZENoYXIoR2V0Q2hhclJlZigpKTsKKyAgICAgICAgaWYgKElzRU9GKCkpIHsKKyAgICAgICAgICB2YWx1ZSA9IGRlY29kZXIuR2V0UmVzdWx0KCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBkZWNvZGVyLklucHV0KGNoKTsKKyAgICAgIH0KKyAgICB9CiAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKLSAgICBpZiAoSXNFT0YoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoY2ggPT0gbWFyayB8fCBtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdGFnX25hbWUsIHRhZ19zcGFjZTsKLSAgICBGWF9CT09MIGJFbmRUYWc7Ci0gICAgR2V0VGFnTmFtZSh0YWdfc3BhY2UsIHRhZ19uYW1lLCBiRW5kVGFnLCBiU3RhcnRUYWcpOwotICAgIGlmICh0YWdfbmFtZS5Jc0VtcHR5KCkgfHwgYkVuZFRhZykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudDsKLSAgICBwRWxlbWVudCA9IEZYX05FVyBDWE1MX0VsZW1lbnQ7Ci0gICAgaWYgKHBFbGVtZW50KSB7Ci0gICAgICAgIHBFbGVtZW50LT5tX3BQYXJlbnQgPSBwUGFyZW50OwotICAgICAgICBwRWxlbWVudC0+U2V0VGFnKHRhZ19zcGFjZSwgdGFnX25hbWUpOwotICAgIH0KLSAgICBpZiAoIXBFbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBkbyB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGF0dHJfc3BhY2UsIGF0dHJfbmFtZTsKLSAgICAgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICBTa2lwV2hpdGVTcGFjZXMoKTsKLSAgICAgICAgICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWdfRlhDUlRfWE1MX0lzTmFtZUludHJvKG1fcEJ1ZmZlclttX2R3SW5kZXhdKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgR2V0TmFtZShhdHRyX3NwYWNlLCBhdHRyX25hbWUpOwotICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgICAgICAgICBpZiAoSXNFT0YoKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fcEJ1ZmZlclttX2R3SW5kZXhdICE9ICc9JykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9kd0luZGV4ICsrOwotICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgICAgICAgICBpZiAoSXNFT0YoKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgYXR0cl92YWx1ZTsKLSAgICAgICAgICAgIEdldEF0dHJWYWx1ZShhdHRyX3ZhbHVlKTsKLSAgICAgICAgICAgIHBFbGVtZW50LT5tX0F0dHJNYXAuU2V0QXQoYXR0cl9zcGFjZSwgYXR0cl9uYW1lLCBhdHRyX3ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgICAgICBpZiAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkgeworICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOworICB2YWx1ZSA9IGRlY29kZXIuR2V0UmVzdWx0KCk7Cit9Cit2b2lkIENYTUxfUGFyc2VyOjpHZXRUYWdOYW1lKENGWF9CeXRlU3RyaW5nJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFbmRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YXJ0VGFnKSB7CisgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7CisgIGlmIChJc0VPRigpKSB7CisgICAgcmV0dXJuOworICB9CisgIGJFbmRUYWcgPSBGQUxTRTsKKyAgdWludDhfdCBjaDsKKyAgaW50MzJfdCBpU3RhdGUgPSBiU3RhcnRUYWcgPyAxIDogMDsKKyAgZG8geworICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgeworICAgICAgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKKyAgICAgIHN3aXRjaCAoaVN0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBtX2R3SW5kZXgrKzsKKyAgICAgICAgICBpZiAoY2ggIT0gJzwnKSB7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7Ci0gICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgaWYgKElzRU9GKCkpIHsKLSAgICAgICAgcmV0dXJuIHBFbGVtZW50OwotICAgIH0KLSAgICB1aW50OF90IGNoID0gbV9wQnVmZmVyW21fZHdJbmRleCArK107Ci0gICAgaWYgKGNoID09ICcvJykgewotICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7Ci0gICAgICAgIHJldHVybiBwRWxlbWVudDsKLSAgICB9Ci0gICAgaWYgKGNoICE9ICc+JykgewotICAgICAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgICAgICBkZWxldGUgcEVsZW1lbnQ7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBTa2lwV2hpdGVTcGFjZXMoKTsKLSAgICBpZiAoSXNFT0YoKSkgewotICAgICAgICByZXR1cm4gcEVsZW1lbnQ7Ci0gICAgfQotICAgIENGWF9VVEY4RGVjb2RlciBkZWNvZGVyOwotICAgIENGWF9XaWRlVGV4dEJ1ZiBjb250ZW50OwotICAgIEZYX0JPT0wgYkNEQVRBID0gRkFMU0U7Ci0gICAgaW50MzJfdCBpU3RhdGUgPSAwOwotICAgIGRvIHsKLSAgICAgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXggKytdOwotICAgICAgICAgICAgc3dpdGNoIChpU3RhdGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyYnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLkNsZWFyU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLkFwcGVuZENoYXIoR2V0Q2hhclJlZigpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuSW5wdXQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICchJykgewotICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXRlID0gMjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNraXBMaXRlcmFscyhGWF9CU1RSQygiPz4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTa2lwV2hpdGVTcGFjZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzcGFjZSwgbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdldE5hbWUoc3BhY2UsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpU3RhdGUgPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPDwgZGVjb2Rlci5HZXRSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGRhdGFTdHIgPSBjb250ZW50LkdldFdpZGVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYkNEQVRBICYmICFtX2JTYXZlU3BhY2VDaGFycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHIuVHJpbVJpZ2h0KEwiIFx0XHJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0Q29udGVudFNlZ21lbnQoYkNEQVRBLCBkYXRhU3RyLCBwRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LkNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLkNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiQ0RBVEEgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWE1MX0VsZW1lbnQqIHBTdWJFbGVtZW50ID0gUGFyc2VFbGVtZW50KHBFbGVtZW50LCBUUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU3ViRWxlbWVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3ViRWxlbWVudC0+bV9wUGFyZW50ID0gcEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRWxlbWVudC0+bV9DaGlsZHJlbi5BZGQoKHZvaWQqKUNYTUxfRWxlbWVudDo6RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRWxlbWVudC0+bV9DaGlsZHJlbi5BZGQocFN1YkVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1snKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTa2lwTGl0ZXJhbHMoRlhfQlNUUkMoIl1dPiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdJbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNraXBMaXRlcmFscyhGWF9CU1RSQygiLS0+IikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU2tpcExpdGVyYWxzKEZYX0JTVFJDKCI+IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlY29kZXIuQ2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlTdGF0ZSA9PSAxMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7Ci0gICAgICAgIGlmIChpU3RhdGUgPT0gMTAgfHwgbV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkgeworICAgICAgICAgIH0KKyAgICAgICAgICBpU3RhdGUgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKGNoID09ICc/JykgeworICAgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgICBTa2lwTGl0ZXJhbHMoRlhfQlNUUkMoIj8+IikpOworICAgICAgICAgICAgaVN0YXRlID0gMDsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKLSAgICBjb250ZW50IDw8IGRlY29kZXIuR2V0UmVzdWx0KCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgZGF0YVN0ciA9IGNvbnRlbnQuR2V0V2lkZVN0cmluZygpOwotICAgIGlmICghbV9iU2F2ZVNwYWNlQ2hhcnMpIHsKLSAgICAgICAgZGF0YVN0ci5UcmltUmlnaHQoTCIgXHRcclxuIik7CisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIScpIHsKKyAgICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgICAgU2tpcExpdGVyYWxzKEZYX0JTVFJDKCItLT4iKSk7CisgICAgICAgICAgICBpU3RhdGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjaCA9PSAnLycpIHsKKyAgICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgICAgR2V0TmFtZShzcGFjZSwgbmFtZSk7CisgICAgICAgICAgICBiRW5kVGFnID0gVFJVRTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR2V0TmFtZShzcGFjZSwgbmFtZSk7CisgICAgICAgICAgICBiRW5kVGFnID0gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KICAgICB9Ci0gICAgSW5zZXJ0Q29udGVudFNlZ21lbnQoYkNEQVRBLCBkYXRhU3RyLCBwRWxlbWVudCk7Ci0gICAgY29udGVudC5DbGVhcigpOwotICAgIGRlY29kZXIuQ2xlYXIoKTsKLSAgICBiQ0RBVEEgPSBGQUxTRTsKKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OworICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7Cit9CitDWE1MX0VsZW1lbnQqIENYTUxfUGFyc2VyOjpQYXJzZUVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YXJ0VGFnKSB7CisgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7CisgIGlmIChJc0VPRigpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgdGFnX25hbWUsIHRhZ19zcGFjZTsKKyAgRlhfQk9PTCBiRW5kVGFnOworICBHZXRUYWdOYW1lKHRhZ19zcGFjZSwgdGFnX25hbWUsIGJFbmRUYWcsIGJTdGFydFRhZyk7CisgIGlmICh0YWdfbmFtZS5Jc0VtcHR5KCkgfHwgYkVuZFRhZykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENYTUxfRWxlbWVudCogcEVsZW1lbnQ7CisgIHBFbGVtZW50ID0gRlhfTkVXIENYTUxfRWxlbWVudDsKKyAgaWYgKHBFbGVtZW50KSB7CisgICAgcEVsZW1lbnQtPm1fcFBhcmVudCA9IHBQYXJlbnQ7CisgICAgcEVsZW1lbnQtPlNldFRhZyh0YWdfc3BhY2UsIHRhZ19uYW1lKTsKKyAgfQorICBpZiAoIXBFbGVtZW50KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZG8geworICAgIENGWF9CeXRlU3RyaW5nIGF0dHJfc3BhY2UsIGF0dHJfbmFtZTsKKyAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKKyAgICAgIFNraXBXaGl0ZVNwYWNlcygpOworICAgICAgaWYgKElzRU9GKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoIWdfRlhDUlRfWE1MX0lzTmFtZUludHJvKG1fcEJ1ZmZlclttX2R3SW5kZXhdKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIEdldE5hbWUoYXR0cl9zcGFjZSwgYXR0cl9uYW1lKTsKKyAgICAgIFNraXBXaGl0ZVNwYWNlcygpOworICAgICAgaWYgKElzRU9GKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAobV9wQnVmZmVyW21fZHdJbmRleF0gIT0gJz0nKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgbV9kd0luZGV4Kys7CisgICAgICBTa2lwV2hpdGVTcGFjZXMoKTsKKyAgICAgIGlmIChJc0VPRigpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgYXR0cl92YWx1ZTsKKyAgICAgIEdldEF0dHJWYWx1ZShhdHRyX3ZhbHVlKTsKKyAgICAgIHBFbGVtZW50LT5tX0F0dHJNYXAuU2V0QXQoYXR0cl9zcGFjZSwgYXR0cl9uYW1lLCBhdHRyX3ZhbHVlKTsKKyAgICB9CisgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKKyAgICBpZiAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOworICBTa2lwV2hpdGVTcGFjZXMoKTsKKyAgaWYgKElzRU9GKCkpIHsKICAgICByZXR1cm4gcEVsZW1lbnQ7Ci19Ci12b2lkIENYTUxfUGFyc2VyOjpJbnNlcnRDb250ZW50U2VnbWVudChGWF9CT09MIGJDREFUQSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50LCBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KQotewotICAgIGlmIChjb250ZW50LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENYTUxfQ29udGVudCogcENvbnRlbnQ7Ci0gICAgcENvbnRlbnQgPSBGWF9ORVcgQ1hNTF9Db250ZW50OwotICAgIGlmICghcENvbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwQ29udGVudC0+U2V0KGJDREFUQSwgY29udGVudCk7Ci0gICAgcEVsZW1lbnQtPm1fQ2hpbGRyZW4uQWRkKCh2b2lkKilDWE1MX0VsZW1lbnQ6OkNvbnRlbnQpOwotICAgIHBFbGVtZW50LT5tX0NoaWxkcmVuLkFkZChwQ29udGVudCk7Ci19Ci1zdGF0aWMgQ1hNTF9FbGVtZW50KiBYTUxfQ29udGludWVQYXJzZShDWE1MX1BhcnNlciAmcGFyc2VyLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycywgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKQotewotICAgIHBhcnNlci5tX2JTYXZlU3BhY2VDaGFycyA9IGJTYXZlU3BhY2VDaGFyczsKLSAgICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gcGFyc2VyLlBhcnNlRWxlbWVudChOVUxMLCBGQUxTRSk7Ci0gICAgaWYgKHBQYXJzZWRTaXplKSB7Ci0gICAgICAgICpwUGFyc2VkU2l6ZSA9IHBhcnNlci5tX25PZmZzZXQ7Ci0gICAgfQorICB9CisgIHVpbnQ4X3QgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4KytdOworICBpZiAoY2ggPT0gJy8nKSB7CisgICAgbV9kd0luZGV4Kys7CisgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKICAgICByZXR1cm4gcEVsZW1lbnQ7Ci19Ci1DWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHNpemUsIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCi17Ci0gICAgQ1hNTF9QYXJzZXIgcGFyc2VyOwotICAgIGlmICghcGFyc2VyLkluaXQoKHVpbnQ4X3QqKXBCdWZmZXIsIHNpemUpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChjaCAhPSAnPicpIHsKKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OworICAgIGRlbGV0ZSBwRWxlbWVudDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBTa2lwV2hpdGVTcGFjZXMoKTsKKyAgaWYgKElzRU9GKCkpIHsKKyAgICByZXR1cm4gcEVsZW1lbnQ7CisgIH0KKyAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7CisgIENGWF9XaWRlVGV4dEJ1ZiBjb250ZW50OworICBGWF9CT09MIGJDREFUQSA9IEZBTFNFOworICBpbnQzMl90IGlTdGF0ZSA9IDA7CisgIGRvIHsKKyAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKKyAgICAgIGNoID0gbV9wQnVmZmVyW21fZHdJbmRleCsrXTsKKyAgICAgIHN3aXRjaCAoaVN0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBpZiAoY2ggPT0gJzwnKSB7CisgICAgICAgICAgICBpU3RhdGUgPSAxOworICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyYnKSB7CisgICAgICAgICAgICBkZWNvZGVyLkNsZWFyU3RhdHVzKCk7CisgICAgICAgICAgICBkZWNvZGVyLkFwcGVuZENoYXIoR2V0Q2hhclJlZigpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVjb2Rlci5JbnB1dChjaCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKGNoID09ICchJykgeworICAgICAgICAgICAgaVN0YXRlID0gMjsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc/JykgeworICAgICAgICAgICAgU2tpcExpdGVyYWxzKEZYX0JTVFJDKCI/PiIpKTsKKyAgICAgICAgICAgIFNraXBXaGl0ZVNwYWNlcygpOworICAgICAgICAgICAgaVN0YXRlID0gMDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcvJykgeworICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3BhY2UsIG5hbWU7CisgICAgICAgICAgICBHZXROYW1lKHNwYWNlLCBuYW1lKTsKKyAgICAgICAgICAgIFNraXBXaGl0ZVNwYWNlcygpOworICAgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgICBpU3RhdGUgPSAxMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudCA8PCBkZWNvZGVyLkdldFJlc3VsdCgpOworICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZGF0YVN0ciA9IGNvbnRlbnQuR2V0V2lkZVN0cmluZygpOworICAgICAgICAgICAgaWYgKCFiQ0RBVEEgJiYgIW1fYlNhdmVTcGFjZUNoYXJzKSB7CisgICAgICAgICAgICAgIGRhdGFTdHIuVHJpbVJpZ2h0KEwiIFx0XHJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSW5zZXJ0Q29udGVudFNlZ21lbnQoYkNEQVRBLCBkYXRhU3RyLCBwRWxlbWVudCk7CisgICAgICAgICAgICBjb250ZW50LkNsZWFyKCk7CisgICAgICAgICAgICBkZWNvZGVyLkNsZWFyKCk7CisgICAgICAgICAgICBiQ0RBVEEgPSBGQUxTRTsKKyAgICAgICAgICAgIGlTdGF0ZSA9IDA7CisgICAgICAgICAgICBtX2R3SW5kZXgtLTsKKyAgICAgICAgICAgIENYTUxfRWxlbWVudCogcFN1YkVsZW1lbnQgPSBQYXJzZUVsZW1lbnQocEVsZW1lbnQsIFRSVUUpOworICAgICAgICAgICAgaWYgKHBTdWJFbGVtZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU3ViRWxlbWVudC0+bV9wUGFyZW50ID0gcEVsZW1lbnQ7CisgICAgICAgICAgICBwRWxlbWVudC0+bV9DaGlsZHJlbi5BZGQoKHZvaWQqKUNYTUxfRWxlbWVudDo6RWxlbWVudCk7CisgICAgICAgICAgICBwRWxlbWVudC0+bV9DaGlsZHJlbi5BZGQocFN1YkVsZW1lbnQpOworICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgaWYgKGNoID09ICdbJykgeworICAgICAgICAgICAgU2tpcExpdGVyYWxzKEZYX0JTVFJDKCJdXT4iKSk7CisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgICAgU2tpcExpdGVyYWxzKEZYX0JTVFJDKCItLT4iKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNraXBMaXRlcmFscyhGWF9CU1RSQygiPiIpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVjb2Rlci5DbGVhcigpOworICAgICAgICAgIFNraXBXaGl0ZVNwYWNlcygpOworICAgICAgICAgIGlTdGF0ZSA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoaVN0YXRlID09IDEwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gWE1MX0NvbnRpbnVlUGFyc2UocGFyc2VyLCBiU2F2ZVNwYWNlQ2hhcnMsIHBQYXJzZWRTaXplKTsKLX0KLUNYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpQYXJzZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycywgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKQotewotICAgIENYTUxfUGFyc2VyIHBhcnNlcjsKLSAgICBpZiAoIXBhcnNlci5Jbml0KHBGaWxlKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OworICAgIGlmIChpU3RhdGUgPT0gMTAgfHwgbV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBYTUxfQ29udGludWVQYXJzZShwYXJzZXIsIGJTYXZlU3BhY2VDaGFycywgcFBhcnNlZFNpemUpOworICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOworICBjb250ZW50IDw8IGRlY29kZXIuR2V0UmVzdWx0KCk7CisgIENGWF9XaWRlU3RyaW5nIGRhdGFTdHIgPSBjb250ZW50LkdldFdpZGVTdHJpbmcoKTsKKyAgaWYgKCFtX2JTYXZlU3BhY2VDaGFycykgeworICAgIGRhdGFTdHIuVHJpbVJpZ2h0KEwiIFx0XHJcbiIpOworICB9CisgIEluc2VydENvbnRlbnRTZWdtZW50KGJDREFUQSwgZGF0YVN0ciwgcEVsZW1lbnQpOworICBjb250ZW50LkNsZWFyKCk7CisgIGRlY29kZXIuQ2xlYXIoKTsKKyAgYkNEQVRBID0gRkFMU0U7CisgIHJldHVybiBwRWxlbWVudDsKIH0KLUNYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpQYXJzZShJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlciwgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSkKLXsKLSAgICBDWE1MX1BhcnNlciBwYXJzZXI7Ci0gICAgaWYgKCFwYXJzZXIuSW5pdChwQnVmZmVyKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFhNTF9Db250aW51ZVBhcnNlKHBhcnNlciwgYlNhdmVTcGFjZUNoYXJzLCBwUGFyc2VkU2l6ZSk7Cit2b2lkIENYTUxfUGFyc2VyOjpJbnNlcnRDb250ZW50U2VnbWVudChGWF9CT09MIGJDREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYTUxfRWxlbWVudCogcEVsZW1lbnQpIHsKKyAgaWYgKGNvbnRlbnQuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIENYTUxfQ29udGVudCogcENvbnRlbnQ7CisgIHBDb250ZW50ID0gRlhfTkVXIENYTUxfQ29udGVudDsKKyAgaWYgKCFwQ29udGVudCkgeworICAgIHJldHVybjsKKyAgfQorICBwQ29udGVudC0+U2V0KGJDREFUQSwgY29udGVudCk7CisgIHBFbGVtZW50LT5tX0NoaWxkcmVuLkFkZCgodm9pZCopQ1hNTF9FbGVtZW50OjpDb250ZW50KTsKKyAgcEVsZW1lbnQtPm1fQ2hpbGRyZW4uQWRkKHBDb250ZW50KTsKIH0KLUNYTUxfRWxlbWVudDo6Q1hNTF9FbGVtZW50KCkKLSAgICA6IG1fUVNwYWNlTmFtZSgpCi0gICAgLCBtX1RhZ05hbWUoKQotICAgICwgbV9BdHRyTWFwKCkKLXsKK3N0YXRpYyBDWE1MX0VsZW1lbnQqIFhNTF9Db250aW51ZVBhcnNlKENYTUxfUGFyc2VyJiBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3BhY2VDaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSkgeworICBwYXJzZXIubV9iU2F2ZVNwYWNlQ2hhcnMgPSBiU2F2ZVNwYWNlQ2hhcnM7CisgIENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSBwYXJzZXIuUGFyc2VFbGVtZW50KE5VTEwsIEZBTFNFKTsKKyAgaWYgKHBQYXJzZWRTaXplKSB7CisgICAgKnBQYXJzZWRTaXplID0gcGFyc2VyLm1fbk9mZnNldDsKKyAgfQorICByZXR1cm4gcEVsZW1lbnQ7CiB9Ci1DWE1MX0VsZW1lbnQ6OkNYTUxfRWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFTcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWdOYW1lKQotICAgIDogbV9RU3BhY2VOYW1lKCkKLSAgICAsIG1fVGFnTmFtZSgpCi0gICAgLCBtX0F0dHJNYXAoKQotewotICAgIG1fUVNwYWNlTmFtZSA9IHFTcGFjZTsKLSAgICBtX1RhZ05hbWUgPSB0YWdOYW1lOworQ1hNTF9FbGVtZW50KiBDWE1MX0VsZW1lbnQ6OlBhcnNlKGNvbnN0IHZvaWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKSB7CisgIENYTUxfUGFyc2VyIHBhcnNlcjsKKyAgaWYgKCFwYXJzZXIuSW5pdCgodWludDhfdCopcEJ1ZmZlciwgc2l6ZSkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gWE1MX0NvbnRpbnVlUGFyc2UocGFyc2VyLCBiU2F2ZVNwYWNlQ2hhcnMsIHBQYXJzZWRTaXplKTsKK30KK0NYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpQYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSkgeworICBDWE1MX1BhcnNlciBwYXJzZXI7CisgIGlmICghcGFyc2VyLkluaXQocEZpbGUpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIFhNTF9Db250aW51ZVBhcnNlKHBhcnNlciwgYlNhdmVTcGFjZUNoYXJzLCBwUGFyc2VkU2l6ZSk7Cit9CitDWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoSUZYX0J1ZmZlclJlYWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKSB7CisgIENYTUxfUGFyc2VyIHBhcnNlcjsKKyAgaWYgKCFwYXJzZXIuSW5pdChwQnVmZmVyKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBYTUxfQ29udGludWVQYXJzZShwYXJzZXIsIGJTYXZlU3BhY2VDaGFycywgcFBhcnNlZFNpemUpOworfQorQ1hNTF9FbGVtZW50OjpDWE1MX0VsZW1lbnQoKSA6IG1fUVNwYWNlTmFtZSgpLCBtX1RhZ05hbWUoKSwgbV9BdHRyTWFwKCkge30KK0NYTUxfRWxlbWVudDo6Q1hNTF9FbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWdOYW1lKQorICAgIDogbV9RU3BhY2VOYW1lKCksIG1fVGFnTmFtZSgpLCBtX0F0dHJNYXAoKSB7CisgIG1fUVNwYWNlTmFtZSA9IHFTcGFjZTsKKyAgbV9UYWdOYW1lID0gdGFnTmFtZTsKIH0KIENYTUxfRWxlbWVudDo6Q1hNTF9FbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVRhZ05hbWUpCi0gICAgOiBtX3BQYXJlbnQoTlVMTCkKLSAgICAsIG1fUVNwYWNlTmFtZSgpCi0gICAgLCBtX1RhZ05hbWUoKQotICAgICwgbV9BdHRyTWFwKCkKLXsKLSAgICBTZXRUYWcocVRhZ05hbWUpOworICAgIDogbV9wUGFyZW50KE5VTEwpLCBtX1FTcGFjZU5hbWUoKSwgbV9UYWdOYW1lKCksIG1fQXR0ck1hcCgpIHsKKyAgU2V0VGFnKHFUYWdOYW1lKTsKIH0KLUNYTUxfRWxlbWVudDo6fkNYTUxfRWxlbWVudCgpCi17Ci0gICAgRW1wdHkoKTsKK0NYTUxfRWxlbWVudDo6fkNYTUxfRWxlbWVudCgpIHsKKyAgRW1wdHkoKTsKIH0KLXZvaWQgQ1hNTF9FbGVtZW50OjpFbXB0eSgpCi17Ci0gICAgUmVtb3ZlQ2hpbGRyZW4oKTsKK3ZvaWQgQ1hNTF9FbGVtZW50OjpFbXB0eSgpIHsKKyAgUmVtb3ZlQ2hpbGRyZW4oKTsKIH0KLXZvaWQgQ1hNTF9FbGVtZW50OjpSZW1vdmVDaGlsZHJlbigpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0NoaWxkcmVuLkdldFNpemUoKTsgaSArPSAyKSB7Ci0gICAgICAgIENoaWxkVHlwZSB0eXBlID0gKENoaWxkVHlwZSkodWludHB0cl90KW1fQ2hpbGRyZW4uR2V0QXQoaSk7Ci0gICAgICAgIGlmICh0eXBlID09IENvbnRlbnQpIHsKLSAgICAgICAgICAgIENYTUxfQ29udGVudCogY29udGVudCA9IChDWE1MX0NvbnRlbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaSArIDEpOwotICAgICAgICAgICAgZGVsZXRlIGNvbnRlbnQ7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBFbGVtZW50KSB7Ci0gICAgICAgICAgICBDWE1MX0VsZW1lbnQqIGNoaWxkID0gKENYTUxfRWxlbWVudCopbV9DaGlsZHJlbi5HZXRBdChpICsgMSk7Ci0gICAgICAgICAgICBjaGlsZC0+UmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgIGRlbGV0ZSBjaGlsZDsKLSAgICAgICAgfQordm9pZCBDWE1MX0VsZW1lbnQ6OlJlbW92ZUNoaWxkcmVuKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1fQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpICs9IDIpIHsKKyAgICBDaGlsZFR5cGUgdHlwZSA9IChDaGlsZFR5cGUpKHVpbnRwdHJfdCltX0NoaWxkcmVuLkdldEF0KGkpOworICAgIGlmICh0eXBlID09IENvbnRlbnQpIHsKKyAgICAgIENYTUxfQ29udGVudCogY29udGVudCA9IChDWE1MX0NvbnRlbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaSArIDEpOworICAgICAgZGVsZXRlIGNvbnRlbnQ7CisgICAgfSBlbHNlIGlmICh0eXBlID09IEVsZW1lbnQpIHsKKyAgICAgIENYTUxfRWxlbWVudCogY2hpbGQgPSAoQ1hNTF9FbGVtZW50KiltX0NoaWxkcmVuLkdldEF0KGkgKyAxKTsKKyAgICAgIGNoaWxkLT5SZW1vdmVDaGlsZHJlbigpOworICAgICAgZGVsZXRlIGNoaWxkOwogICAgIH0KLSAgICBtX0NoaWxkcmVuLlJlbW92ZUFsbCgpOworICB9CisgIG1fQ2hpbGRyZW4uUmVtb3ZlQWxsKCk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldFRhZ05hbWUoRlhfQk9PTCBiUXVhbGlmaWVkKSBjb25zdAotewotICAgIGlmICghYlF1YWxpZmllZCB8fCBtX1FTcGFjZU5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBtX1RhZ05hbWU7CitDRlhfQnl0ZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldFRhZ05hbWUoRlhfQk9PTCBiUXVhbGlmaWVkKSBjb25zdCB7CisgIGlmICghYlF1YWxpZmllZCB8fCBtX1FTcGFjZU5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIG1fVGFnTmFtZTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBic1RhZyA9IG1fUVNwYWNlTmFtZTsKKyAgYnNUYWcgKz0gIjoiOworICBic1RhZyArPSBtX1RhZ05hbWU7CisgIHJldHVybiBic1RhZzsKK30KK0NGWF9CeXRlU3RyaW5nIENYTUxfRWxlbWVudDo6R2V0TmFtZXNwYWNlKEZYX0JPT0wgYlF1YWxpZmllZCkgY29uc3QgeworICBpZiAoYlF1YWxpZmllZCkgeworICAgIHJldHVybiBtX1FTcGFjZU5hbWU7CisgIH0KKyAgcmV0dXJuIEdldE5hbWVzcGFjZVVSSShtX1FTcGFjZU5hbWUpOworfQorQ0ZYX0J5dGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXROYW1lc3BhY2VVUkkoCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxTmFtZSkgY29uc3QgeworICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzU3BhY2U7CisgIGNvbnN0IENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSB0aGlzOworICBkbyB7CisgICAgaWYgKHFOYW1lLklzRW1wdHkoKSkgeworICAgICAgcHdzU3BhY2UgPSBwRWxlbWVudC0+bV9BdHRyTWFwLkxvb2t1cChGWF9CU1RSQygiIiksIEZYX0JTVFJDKCJ4bWxucyIpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHdzU3BhY2UgPSBwRWxlbWVudC0+bV9BdHRyTWFwLkxvb2t1cChGWF9CU1RSQygieG1sbnMiKSwgcU5hbWUpOwogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBic1RhZyA9IG1fUVNwYWNlTmFtZTsKLSAgICBic1RhZyArPSAiOiI7Ci0gICAgYnNUYWcgKz0gbV9UYWdOYW1lOwotICAgIHJldHVybiBic1RhZzsKLX0KLUNGWF9CeXRlU3RyaW5nIENYTUxfRWxlbWVudDo6R2V0TmFtZXNwYWNlKEZYX0JPT0wgYlF1YWxpZmllZCkgY29uc3QKLXsKLSAgICBpZiAoYlF1YWxpZmllZCkgewotICAgICAgICByZXR1cm4gbV9RU3BhY2VOYW1lOworICAgIGlmIChwd3NTcGFjZSkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBHZXROYW1lc3BhY2VVUkkobV9RU3BhY2VOYW1lKTsKKyAgICBwRWxlbWVudCA9IHBFbGVtZW50LT5HZXRQYXJlbnQoKTsKKyAgfSB3aGlsZSAocEVsZW1lbnQpOworICByZXR1cm4gcHdzU3BhY2UgPyBGWF9VVEY4RW5jb2RlKCpwd3NTcGFjZSkgOiBDRlhfQnl0ZVN0cmluZygpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXROYW1lc3BhY2VVUkkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxTmFtZSkgY29uc3QKLXsKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzU3BhY2U7Ci0gICAgY29uc3QgQ1hNTF9FbGVtZW50ICpwRWxlbWVudCA9IHRoaXM7Ci0gICAgZG8gewotICAgICAgICBpZiAocU5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBwd3NTcGFjZSA9IHBFbGVtZW50LT5tX0F0dHJNYXAuTG9va3VwKEZYX0JTVFJDKCIiKSwgRlhfQlNUUkMoInhtbG5zIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHdzU3BhY2UgPSBwRWxlbWVudC0+bV9BdHRyTWFwLkxvb2t1cChGWF9CU1RSQygieG1sbnMiKSwgcU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwd3NTcGFjZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcEVsZW1lbnQgPSBwRWxlbWVudC0+R2V0UGFyZW50KCk7Ci0gICAgfSB3aGlsZShwRWxlbWVudCk7Ci0gICAgcmV0dXJuIHB3c1NwYWNlID8gRlhfVVRGOEVuY29kZSgqcHdzU3BhY2UpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKK3ZvaWQgQ1hNTF9FbGVtZW50OjpHZXRBdHRyQnlJbmRleChpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB2YWx1ZSkgY29uc3QgeworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fQXR0ck1hcC5HZXRTaXplKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1hNTF9BdHRySXRlbSYgaXRlbSA9IG1fQXR0ck1hcC5HZXRBdChpbmRleCk7CisgIHNwYWNlID0gaXRlbS5tX1FTcGFjZU5hbWU7CisgIG5hbWUgPSBpdGVtLm1fQXR0ck5hbWU7CisgIHZhbHVlID0gaXRlbS5tX1ZhbHVlOwogfQotdm9pZCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJCeUluZGV4KGludCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIHNwYWNlLCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKSBjb25zdAotewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9BdHRyTWFwLkdldFNpemUoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENYTUxfQXR0ckl0ZW0mIGl0ZW0gPSBtX0F0dHJNYXAuR2V0QXQoaW5kZXgpOwotICAgIHNwYWNlID0gaXRlbS5tX1FTcGFjZU5hbWU7Ci0gICAgbmFtZSA9IGl0ZW0ubV9BdHRyTmFtZTsKLSAgICB2YWx1ZSA9IGl0ZW0ubV9WYWx1ZTsKK0ZYX0JPT0wgQ1hNTF9FbGVtZW50OjpIYXNBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QgeworICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOworICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsIGJzU3BhY2UsIGJzTmFtZSk7CisgIHJldHVybiBtX0F0dHJNYXAuTG9va3VwKGJzU3BhY2UsIGJzTmFtZSkgIT0gTlVMTDsKIH0KLUZYX0JPT0wgQ1hNTF9FbGVtZW50OjpIYXNBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QKLXsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOwotICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKLSAgICByZXR1cm4gbV9BdHRyTWFwLkxvb2t1cChic1NwYWNlLCBic05hbWUpICE9IE5VTEw7CitGWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3QgeworICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOworICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsIGJzU3BhY2UsIGJzTmFtZSk7CisgIHJldHVybiBHZXRBdHRyVmFsdWUoYnNTcGFjZSwgYnNOYW1lLCBhdHRyaWJ1dGUpOwogfQotRlhfQk9PTCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0Ci17Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJzU3BhY2UsIGJzTmFtZTsKLSAgICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsIGJzU3BhY2UsIGJzTmFtZSk7Ci0gICAgcmV0dXJuIEdldEF0dHJWYWx1ZShic1NwYWNlLCBic05hbWUsIGF0dHJpYnV0ZSk7CitGWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3QgeworICBjb25zdCBDRlhfV2lkZVN0cmluZyogcFZhbHVlID0gbV9BdHRyTWFwLkxvb2t1cChzcGFjZSwgbmFtZSk7CisgIGlmIChwVmFsdWUpIHsKKyAgICBhdHRyaWJ1dGUgPSAqcFZhbHVlOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBDRlhfV2lkZVN0cmluZyYgYXR0cmlidXRlKSBjb25zdAotewotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBwVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKHNwYWNlLCBuYW1lKTsKLSAgICBpZiAocFZhbHVlKSB7Ci0gICAgICAgIGF0dHJpYnV0ZSA9ICpwVmFsdWU7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgYXR0cmlidXRlKSBjb25zdCB7CisgIENGWF9CeXRlU3RyaW5nQyBic1NwYWNlLCBic05hbWU7CisgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHB3c1ZhbHVlID0gbV9BdHRyTWFwLkxvb2t1cChic1NwYWNlLCBic05hbWUpOworICBpZiAocHdzVmFsdWUpIHsKKyAgICBhdHRyaWJ1dGUgPSBwd3NWYWx1ZS0+R2V0SW50ZWdlcigpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCYgYXR0cmlidXRlKSBjb25zdAotewotICAgIENGWF9CeXRlU3RyaW5nQyBic1NwYWNlLCBic05hbWU7Ci0gICAgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShuYW1lLCBic1NwYWNlLCBic05hbWUpOwotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBwd3NWYWx1ZSA9IG1fQXR0ck1hcC5Mb29rdXAoYnNTcGFjZSwgYnNOYW1lKTsKLSAgICBpZiAocHdzVmFsdWUpIHsKLSAgICAgICAgYXR0cmlidXRlID0gcHdzVmFsdWUtPkdldEludGVnZXIoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGF0dHJpYnV0ZSkgY29uc3QgeworICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKHNwYWNlLCBuYW1lKTsKKyAgaWYgKHB3c1ZhbHVlKSB7CisgICAgYXR0cmlidXRlID0gcHdzVmFsdWUtPkdldEludGVnZXIoKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MCUNYTUxfRWxlbWVudDo6R2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBpbnQmIGF0dHJpYnV0ZSkgY29uc3QKLXsKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKHNwYWNlLCBuYW1lKTsKLSAgICBpZiAocHdzVmFsdWUpIHsKLSAgICAgICAgYXR0cmlidXRlID0gcHdzVmFsdWUtPkdldEludGVnZXIoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdCB7CisgIENGWF9CeXRlU3RyaW5nQyBic1NwYWNlLCBic05hbWU7CisgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKKyAgcmV0dXJuIEdldEF0dHJGbG9hdChic1NwYWNlLCBic05hbWUsIGF0dHJpYnV0ZSk7CiB9Ci1GWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3QKLXsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOwotICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKLSAgICByZXR1cm4gR2V0QXR0ckZsb2F0KGJzU3BhY2UsIGJzTmFtZSwgYXR0cmlidXRlKTsKK0ZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdCB7CisgIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBwVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKHNwYWNlLCBuYW1lKTsKKyAgaWYgKHBWYWx1ZSkgeworICAgIGF0dHJpYnV0ZSA9IHBWYWx1ZS0+R2V0RmxvYXQoKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3QKLXsKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcFZhbHVlID0gbV9BdHRyTWFwLkxvb2t1cChzcGFjZSwgbmFtZSk7Ci0gICAgaWYgKHBWYWx1ZSkgewotICAgICAgICBhdHRyaWJ1dGUgPSBwVmFsdWUtPkdldEZsb2F0KCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CitGWF9EV09SRCBDWE1MX0VsZW1lbnQ6OkNvdW50Q2hpbGRyZW4oKSBjb25zdCB7CisgIHJldHVybiBtX0NoaWxkcmVuLkdldFNpemUoKSAvIDI7CiB9Ci1GWF9EV09SRCBDWE1MX0VsZW1lbnQ6OkNvdW50Q2hpbGRyZW4oKSBjb25zdAotewotICAgIHJldHVybiBtX0NoaWxkcmVuLkdldFNpemUoKSAvIDI7CitDWE1MX0VsZW1lbnQ6OkNoaWxkVHlwZSBDWE1MX0VsZW1lbnQ6OkdldENoaWxkVHlwZShGWF9EV09SRCBpbmRleCkgY29uc3QgeworICBpbmRleCA8PD0gMTsKKyAgaWYgKGluZGV4ID49IChGWF9EV09SRCltX0NoaWxkcmVuLkdldFNpemUoKSkgeworICAgIHJldHVybiBJbnZhbGlkOworICB9CisgIHJldHVybiAoQ2hpbGRUeXBlKSh1aW50cHRyX3QpbV9DaGlsZHJlbi5HZXRBdChpbmRleCk7CiB9Ci1DWE1MX0VsZW1lbnQ6OkNoaWxkVHlwZSBDWE1MX0VsZW1lbnQ6OkdldENoaWxkVHlwZShGWF9EV09SRCBpbmRleCkgY29uc3QKLXsKLSAgICBpbmRleCA8PD0gMTsKLSAgICBpZiAoaW5kZXggPj0gKEZYX0RXT1JEKW1fQ2hpbGRyZW4uR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBJbnZhbGlkOwotICAgIH0KLSAgICByZXR1cm4gKENoaWxkVHlwZSkodWludHB0cl90KW1fQ2hpbGRyZW4uR2V0QXQoaW5kZXgpOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXRDb250ZW50KEZYX0RXT1JEIGluZGV4KSBjb25zdAotewotICAgIGluZGV4IDw8PSAxOwotICAgIGlmIChpbmRleCA+PSAoRlhfRFdPUkQpbV9DaGlsZHJlbi5HZXRTaXplKCkgfHwKLSAgICAgICAgICAgIChDaGlsZFR5cGUpKHVpbnRwdHJfdCltX0NoaWxkcmVuLkdldEF0KGluZGV4KSAhPSBDb250ZW50KSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSAgICBDWE1MX0NvbnRlbnQqIHBDb250ZW50ID0gKENYTUxfQ29udGVudCopbV9DaGlsZHJlbi5HZXRBdChpbmRleCArIDEpOwotICAgIGlmIChwQ29udGVudCkgewotICAgICAgICByZXR1cm4gcENvbnRlbnQtPm1fQ29udGVudDsKLSAgICB9CitDRlhfV2lkZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldENvbnRlbnQoRlhfRFdPUkQgaW5kZXgpIGNvbnN0IHsKKyAgaW5kZXggPDw9IDE7CisgIGlmIChpbmRleCA+PSAoRlhfRFdPUkQpbV9DaGlsZHJlbi5HZXRTaXplKCkgfHwKKyAgICAgIChDaGlsZFR5cGUpKHVpbnRwdHJfdCltX0NoaWxkcmVuLkdldEF0KGluZGV4KSAhPSBDb250ZW50KSB7CiAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgQ1hNTF9Db250ZW50KiBwQ29udGVudCA9IChDWE1MX0NvbnRlbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaW5kZXggKyAxKTsKKyAgaWYgKHBDb250ZW50KSB7CisgICAgcmV0dXJuIHBDb250ZW50LT5tX0NvbnRlbnQ7CisgIH0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CiB9Ci1DWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6R2V0RWxlbWVudChGWF9EV09SRCBpbmRleCkgY29uc3QKLXsKLSAgICBpbmRleCA8PD0gMTsKLSAgICBpZiAoaW5kZXggPj0gKEZYX0RXT1JEKW1fQ2hpbGRyZW4uR2V0U2l6ZSgpIHx8Ci0gICAgICAgICAgICAoQ2hpbGRUeXBlKSh1aW50cHRyX3QpbV9DaGlsZHJlbi5HZXRBdChpbmRleCkgIT0gRWxlbWVudCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChDWE1MX0VsZW1lbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaW5kZXggKyAxKTsKLX0KLUZYX0RXT1JEIENYTUxfRWxlbWVudDo6Q291bnRFbGVtZW50cyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZykgY29uc3QKLXsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9DaGlsZHJlbi5HZXRTaXplKCk7IGkgKz0gMikgewotICAgICAgICBDaGlsZFR5cGUgdHlwZSA9IChDaGlsZFR5cGUpKHVpbnRwdHJfdCltX0NoaWxkcmVuLkdldEF0KGkpOwotICAgICAgICBpZiAodHlwZSAhPSBFbGVtZW50KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDWE1MX0VsZW1lbnQqIHBLaWQgPSAoQ1hNTF9FbGVtZW50KiltX0NoaWxkcmVuLkdldEF0KGkgKyAxKTsKLSAgICAgICAgaWYgKChzcGFjZS5Jc0VtcHR5KCkgfHwgcEtpZC0+bV9RU3BhY2VOYW1lID09IHNwYWNlKSAmJiBwS2lkLT5tX1RhZ05hbWUgPT0gdGFnKSB7Ci0gICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY291bnQ7Ci19Ci1DWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6R2V0RWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZywgaW50IGluZGV4KSBjb25zdAotewotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9DaGlsZHJlbi5HZXRTaXplKCk7IGkgKz0gMikgewotICAgICAgICBDaGlsZFR5cGUgdHlwZSA9IChDaGlsZFR5cGUpKHVpbnRwdHJfdCltX0NoaWxkcmVuLkdldEF0KGkpOwotICAgICAgICBpZiAodHlwZSAhPSBFbGVtZW50KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDWE1MX0VsZW1lbnQqIHBLaWQgPSAoQ1hNTF9FbGVtZW50KiltX0NoaWxkcmVuLkdldEF0KGkgKyAxKTsKLSAgICAgICAgaWYgKCghc3BhY2UuSXNFbXB0eSgpICYmIHBLaWQtPm1fUVNwYWNlTmFtZSAhPSBzcGFjZSkgfHwgcEtpZC0+bV9UYWdOYW1lICE9IHRhZykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluZGV4IC0tID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBwS2lkOwotICAgICAgICB9Ci0gICAgfQorQ1hNTF9FbGVtZW50KiBDWE1MX0VsZW1lbnQ6OkdldEVsZW1lbnQoRlhfRFdPUkQgaW5kZXgpIGNvbnN0IHsKKyAgaW5kZXggPDw9IDE7CisgIGlmIChpbmRleCA+PSAoRlhfRFdPUkQpbV9DaGlsZHJlbi5HZXRTaXplKCkgfHwKKyAgICAgIChDaGlsZFR5cGUpKHVpbnRwdHJfdCltX0NoaWxkcmVuLkdldEF0KGluZGV4KSAhPSBFbGVtZW50KSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIChDWE1MX0VsZW1lbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaW5kZXggKyAxKTsKIH0KLUZYX0RXT1JEIENYTUxfRWxlbWVudDo6RmluZEVsZW1lbnQoQ1hNTF9FbGVtZW50ICpwQ2hpbGQpIGNvbnN0Ci17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0NoaWxkcmVuLkdldFNpemUoKTsgaSArPSAyKSB7Ci0gICAgICAgIGlmICgoQ2hpbGRUeXBlKSh1aW50cHRyX3QpbV9DaGlsZHJlbi5HZXRBdChpKSA9PSBFbGVtZW50ICYmCi0gICAgICAgICAgICAgICAgKENYTUxfRWxlbWVudCopbV9DaGlsZHJlbi5HZXRBdChpICsgMSkgPT0gcENoaWxkKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEZYX0RXT1JEKShpID4+IDEpOwotICAgICAgICB9CitGWF9EV09SRCBDWE1MX0VsZW1lbnQ6OkNvdW50RWxlbWVudHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZykgY29uc3QgeworICBpbnQgY291bnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpICs9IDIpIHsKKyAgICBDaGlsZFR5cGUgdHlwZSA9IChDaGlsZFR5cGUpKHVpbnRwdHJfdCltX0NoaWxkcmVuLkdldEF0KGkpOworICAgIGlmICh0eXBlICE9IEVsZW1lbnQpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7CisgICAgQ1hNTF9FbGVtZW50KiBwS2lkID0gKENYTUxfRWxlbWVudCopbV9DaGlsZHJlbi5HZXRBdChpICsgMSk7CisgICAgaWYgKChzcGFjZS5Jc0VtcHR5KCkgfHwgcEtpZC0+bV9RU3BhY2VOYW1lID09IHNwYWNlKSAmJgorICAgICAgICBwS2lkLT5tX1RhZ05hbWUgPT0gdGFnKSB7CisgICAgICBjb3VudCsrOworICAgIH0KKyAgfQorICByZXR1cm4gY291bnQ7CiB9Ci1jb25zdCBDRlhfV2lkZVN0cmluZyogQ1hNTF9BdHRyTWFwOjpMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdAotewotICAgIGlmIChtX3BNYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3BNYXAtPkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDWE1MX0F0dHJJdGVtJiBpdGVtID0gR2V0QXQoaSk7Ci0gICAgICAgIGlmICgoc3BhY2UuSXNFbXB0eSgpIHx8IGl0ZW0ubV9RU3BhY2VOYW1lID09IHNwYWNlKSAmJiBpdGVtLm1fQXR0ck5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuICZpdGVtLm1fVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9CitDWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6R2V0RWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKGluZGV4IDwgMCkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9DaGlsZHJlbi5HZXRTaXplKCk7IGkgKz0gMikgeworICAgIENoaWxkVHlwZSB0eXBlID0gKENoaWxkVHlwZSkodWludHB0cl90KW1fQ2hpbGRyZW4uR2V0QXQoaSk7CisgICAgaWYgKHR5cGUgIT0gRWxlbWVudCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENYTUxfRWxlbWVudCogcEtpZCA9IChDWE1MX0VsZW1lbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaSArIDEpOworICAgIGlmICgoIXNwYWNlLklzRW1wdHkoKSAmJiBwS2lkLT5tX1FTcGFjZU5hbWUgIT0gc3BhY2UpIHx8CisgICAgICAgIHBLaWQtPm1fVGFnTmFtZSAhPSB0YWcpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoaW5kZXgtLSA9PSAwKSB7CisgICAgICByZXR1cm4gcEtpZDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci12b2lkIENYTUxfQXR0ck1hcDo6U2V0QXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHZhbHVlKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgR2V0U2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQ1hNTF9BdHRySXRlbSYgaXRlbSA9IEdldEF0KGkpOwotICAgICAgICBpZiAoKHNwYWNlLklzRW1wdHkoKSB8fCBpdGVtLm1fUVNwYWNlTmFtZSA9PSBzcGFjZSkgJiYgaXRlbS5tX0F0dHJOYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgIGl0ZW0ubV9WYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CitGWF9EV09SRCBDWE1MX0VsZW1lbnQ6OkZpbmRFbGVtZW50KENYTUxfRWxlbWVudCogcENoaWxkKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9DaGlsZHJlbi5HZXRTaXplKCk7IGkgKz0gMikgeworICAgIGlmICgoQ2hpbGRUeXBlKSh1aW50cHRyX3QpbV9DaGlsZHJlbi5HZXRBdChpKSA9PSBFbGVtZW50ICYmCisgICAgICAgIChDWE1MX0VsZW1lbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaSArIDEpID09IHBDaGlsZCkgeworICAgICAgcmV0dXJuIChGWF9EV09SRCkoaSA+PiAxKTsKICAgICB9Ci0gICAgaWYgKCFtX3BNYXApIHsKLSAgICAgICAgbV9wTWFwID0gRlhfTkVXIENGWF9PYmplY3RBcnJheSA8IENYTUxfQXR0ckl0ZW0gPiA7Ci0gICAgfQotICAgIGlmICghbV9wTWFwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1hNTF9BdHRySXRlbSogcEl0ZW0gPSAoQ1hNTF9BdHRySXRlbSopbV9wTWFwLT5BZGRTcGFjZSgpOwotICAgIGlmICghcEl0ZW0pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwSXRlbS0+bV9RU3BhY2VOYW1lID0gc3BhY2U7Ci0gICAgcEl0ZW0tPm1fQXR0ck5hbWUgPSBuYW1lOwotICAgIHBJdGVtLT5tX1ZhbHVlID0gdmFsdWU7CisgIH0KKyAgcmV0dXJuIChGWF9EV09SRCktMTsKIH0KLXZvaWQgQ1hNTF9BdHRyTWFwOjpSZW1vdmVBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpCi17Ci0gICAgaWYgKG1fcE1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK2NvbnN0IENGWF9XaWRlU3RyaW5nKiBDWE1MX0F0dHJNYXA6Okxvb2t1cChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QgeworICBpZiAobV9wTWFwID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1fcE1hcC0+R2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDWE1MX0F0dHJJdGVtJiBpdGVtID0gR2V0QXQoaSk7CisgICAgaWYgKChzcGFjZS5Jc0VtcHR5KCkgfHwgaXRlbS5tX1FTcGFjZU5hbWUgPT0gc3BhY2UpICYmCisgICAgICAgIGl0ZW0ubV9BdHRyTmFtZSA9PSBuYW1lKSB7CisgICAgICByZXR1cm4gJml0ZW0ubV9WYWx1ZTsKICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3BNYXAtPkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDWE1MX0F0dHJJdGVtJiBpdGVtID0gR2V0QXQoaSk7Ci0gICAgICAgIGlmICgoc3BhY2UuSXNFbXB0eSgpIHx8IGl0ZW0ubV9RU3BhY2VOYW1lID09IHNwYWNlKSAmJiBpdGVtLm1fQXR0ck5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgbV9wTWFwLT5SZW1vdmVBdChpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQordm9pZCBDWE1MX0F0dHJNYXA6OlNldEF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgdmFsdWUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBHZXRTaXplKCk7IGkrKykgeworICAgIENYTUxfQXR0ckl0ZW0mIGl0ZW0gPSBHZXRBdChpKTsKKyAgICBpZiAoKHNwYWNlLklzRW1wdHkoKSB8fCBpdGVtLm1fUVNwYWNlTmFtZSA9PSBzcGFjZSkgJiYKKyAgICAgICAgaXRlbS5tX0F0dHJOYW1lID09IG5hbWUpIHsKKyAgICAgIGl0ZW0ubV9WYWx1ZSA9IHZhbHVlOworICAgICAgcmV0dXJuOwogICAgIH0KKyAgfQorICBpZiAoIW1fcE1hcCkgeworICAgIG1fcE1hcCA9IEZYX05FVyBDRlhfT2JqZWN0QXJyYXk8Q1hNTF9BdHRySXRlbT47CisgIH0KKyAgaWYgKCFtX3BNYXApIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1hNTF9BdHRySXRlbSogcEl0ZW0gPSAoQ1hNTF9BdHRySXRlbSopbV9wTWFwLT5BZGRTcGFjZSgpOworICBpZiAoIXBJdGVtKSB7CisgICAgcmV0dXJuOworICB9CisgIHBJdGVtLT5tX1FTcGFjZU5hbWUgPSBzcGFjZTsKKyAgcEl0ZW0tPm1fQXR0ck5hbWUgPSBuYW1lOworICBwSXRlbS0+bV9WYWx1ZSA9IHZhbHVlOwogfQotaW50IENYTUxfQXR0ck1hcDo6R2V0U2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcE1hcCA9PSBOVUxMID8gMCA6IG1fcE1hcC0+R2V0U2l6ZSgpOwotfQotQ1hNTF9BdHRySXRlbSYgQ1hNTF9BdHRyTWFwOjpHZXRBdChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcE1hcCAhPSBOVUxMKTsKLSAgICByZXR1cm4gKCptX3BNYXApW2luZGV4XTsKLX0KLXZvaWQgQ1hNTF9BdHRyTWFwOjpSZW1vdmVBbGwoKQotewotICAgIGlmICghbV9wTWFwKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1hNTF9BdHRyTWFwOjpSZW1vdmVBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgeworICBpZiAobV9wTWFwID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3BNYXAtPkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1hNTF9BdHRySXRlbSYgaXRlbSA9IEdldEF0KGkpOworICAgIGlmICgoc3BhY2UuSXNFbXB0eSgpIHx8IGl0ZW0ubV9RU3BhY2VOYW1lID09IHNwYWNlKSAmJgorICAgICAgICBpdGVtLm1fQXR0ck5hbWUgPT0gbmFtZSkgeworICAgICAgbV9wTWFwLT5SZW1vdmVBdChpKTsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbV9wTWFwLT5SZW1vdmVBbGwoKTsKLSAgICBkZWxldGUgbV9wTWFwOwotICAgIG1fcE1hcCA9IE5VTEw7CisgIH0KK30KK2ludCBDWE1MX0F0dHJNYXA6OkdldFNpemUoKSBjb25zdCB7CisgIHJldHVybiBtX3BNYXAgPT0gTlVMTCA/IDAgOiBtX3BNYXAtPkdldFNpemUoKTsKK30KK0NYTUxfQXR0ckl0ZW0mIENYTUxfQXR0ck1hcDo6R2V0QXQoaW50IGluZGV4KSBjb25zdCB7CisgIEFTU0VSVChtX3BNYXAgIT0gTlVMTCk7CisgIHJldHVybiAoKm1fcE1hcClbaW5kZXhdOworfQordm9pZCBDWE1MX0F0dHJNYXA6OlJlbW92ZUFsbCgpIHsKKyAgaWYgKCFtX3BNYXApIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wTWFwLT5SZW1vdmVBbGwoKTsKKyAgZGVsZXRlIG1fcE1hcDsKKyAgbV9wTWFwID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5jcHAgYi9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuY3BwCmluZGV4IDYxNzI0NGIuLjkzZjc4YzcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfcGxhdGZvcm1zLmNwcApAQCAtNywxODcgKzcsMTcyIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgImZ4Y3J0X3BsYXRmb3Jtcy5oIgogCi0jaWYgKF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18gJiYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9MSU5VWF8gJiYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8gJiYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXykKLUlGWENSVF9GaWxlQWNjZXNzKiBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpCi17Ci0gICAgcmV0dXJuIEZYX05FVyBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ7CisjaWYgKF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18gJiYgXAorICAgICBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX0xJTlVYXyAmJiAgIFwKKyAgICAgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8gJiYgICBcCisgICAgIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fQU5EUk9JRF8pCitJRlhDUlRfRmlsZUFjY2VzcyogRlhDUlRfRmlsZUFjY2Vzc19DcmVhdGUoKSB7CisgIHJldHVybiBGWF9ORVcgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOwogfQotdm9pZCBGWENSVF9HZXRGaWxlTW9kZVN0cmluZyhGWF9EV09SRCBkd01vZGVzLCBDRlhfQnl0ZVN0cmluZyAmYnNNb2RlKQotewotICAgIGlmIChkd01vZGVzICYgRlhfRklMRU1PREVfUmVhZE9ubHkpIHsKLSAgICAgICAgYnNNb2RlID0gRlhfQlNUUkMoInJiIik7Ci0gICAgfSBlbHNlIGlmIChkd01vZGVzICYgRlhfRklMRU1PREVfVHJ1bmNhdGUpIHsKLSAgICAgICAgYnNNb2RlID0gRlhfQlNUUkMoIncrYiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJzTW9kZSA9IEZYX0JTVFJDKCJhK2IiKTsKLSAgICB9Cit2b2lkIEZYQ1JUX0dldEZpbGVNb2RlU3RyaW5nKEZYX0RXT1JEIGR3TW9kZXMsIENGWF9CeXRlU3RyaW5nJiBic01vZGUpIHsKKyAgaWYgKGR3TW9kZXMgJiBGWF9GSUxFTU9ERV9SZWFkT25seSkgeworICAgIGJzTW9kZSA9IEZYX0JTVFJDKCJyYiIpOworICB9IGVsc2UgaWYgKGR3TW9kZXMgJiBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkgeworICAgIGJzTW9kZSA9IEZYX0JTVFJDKCJ3K2IiKTsKKyAgfSBlbHNlIHsKKyAgICBic01vZGUgPSBGWF9CU1RSQygiYStiIik7CisgIH0KIH0KLXZvaWQgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoRlhfRFdPUkQgZHdNb2RlcywgQ0ZYX1dpZGVTdHJpbmcgJndzTW9kZSkKLXsKLSAgICBpZiAoZHdNb2RlcyAmIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSB7Ci0gICAgICAgIHdzTW9kZSA9IEZYX1dTVFJDKEwicmIiKTsKLSAgICB9IGVsc2UgaWYgKGR3TW9kZXMgJiBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkgewotICAgICAgICB3c01vZGUgPSBGWF9XU1RSQyhMIncrYiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdzTW9kZSA9IEZYX1dTVFJDKEwiYStiIik7Ci0gICAgfQordm9pZCBGWENSVF9HZXRGaWxlTW9kZVN0cmluZyhGWF9EV09SRCBkd01vZGVzLCBDRlhfV2lkZVN0cmluZyYgd3NNb2RlKSB7CisgIGlmIChkd01vZGVzICYgRlhfRklMRU1PREVfUmVhZE9ubHkpIHsKKyAgICB3c01vZGUgPSBGWF9XU1RSQyhMInJiIik7CisgIH0gZWxzZSBpZiAoZHdNb2RlcyAmIEZYX0ZJTEVNT0RFX1RydW5jYXRlKSB7CisgICAgd3NNb2RlID0gRlhfV1NUUkMoTCJ3K2IiKTsKKyAgfSBlbHNlIHsKKyAgICB3c01vZGUgPSBGWF9XU1RSQyhMImErYiIpOworICB9CiB9Ci1DRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OkNGWENSVF9GaWxlQWNjZXNzX0NSVCgpCi0gICAgOiBtX2hGaWxlKE5VTEwpCi17CitDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OkNGWENSVF9GaWxlQWNjZXNzX0NSVCgpIDogbV9oRmlsZShOVUxMKSB7fQorQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjp+Q0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUKCkgeworICBDbG9zZSgpOwogfQotQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjp+Q0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUKCkKLXsKLSAgICBDbG9zZSgpOwotfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6Ok9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQotewotICAgIGlmIChtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyTW9kZTsKLSAgICBGWENSVF9HZXRGaWxlTW9kZVN0cmluZyhkd01vZGUsIHN0ck1vZGUpOwotICAgIG1faEZpbGUgPSBGWFNZU19mb3BlbihmaWxlTmFtZS5HZXRDU3RyKCksIHN0ck1vZGUuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1faEZpbGUgIT0gTlVMTDsKLX0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKLXsKLSAgICBpZiAobV9oRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHN0ck1vZGU7Ci0gICAgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoZHdNb2RlLCBzdHJNb2RlKTsKLSAgICBtX2hGaWxlID0gRlhTWVNfd2ZvcGVuKGZpbGVOYW1lLkdldFB0cigpLCBzdHJNb2RlLmNfc3RyKCkpOwotICAgIHJldHVybiBtX2hGaWxlICE9IE5VTEw7Ci19Ci12b2lkIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6Q2xvc2UoKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX2ZjbG9zZShtX2hGaWxlKTsKLSAgICBtX2hGaWxlID0gTlVMTDsKLX0KLXZvaWQgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpSZWxlYXNlKCkKLXsKLSAgICBkZWxldGUgdGhpczsKLX0KLUZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6R2V0U2l6ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9GSUxFU0laRSBwb3MgPSAoRlhfRklMRVNJWkUpRlhTWVNfZnRlbGwobV9oRmlsZSk7Ci0gICAgRlhTWVNfZnNlZWsobV9oRmlsZSwgMCwgRlhTWVNfU0VFS19FTkQpOwotICAgIEZYX0ZJTEVTSVpFIHNpemUgPSAoRlhfRklMRVNJWkUpRlhTWVNfZnRlbGwobV9oRmlsZSk7Ci0gICAgRlhTWVNfZnNlZWsobV9oRmlsZSwgcG9zLCBGWFNZU19TRUVLX1NFVCk7Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci1GWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OkdldFBvc2l0aW9uKCkgY29uc3QKLXsKLSAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIChGWF9GSUxFU0laRSkgLSAxOwotICAgIH0KLSAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKUZYU1lTX2Z0ZWxsKG1faEZpbGUpOwotfQotRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpCi17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpIC0gMTsKLSAgICB9Ci0gICAgRlhTWVNfZnNlZWsobV9oRmlsZSwgcG9zLCBGWFNZU19TRUVLX1NFVCk7Ci0gICAgcmV0dXJuIChGWF9GSUxFU0laRSlGWFNZU19mdGVsbChtX2hGaWxlKTsKLX0KLXNpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OlJlYWQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIEZYU1lTX2ZyZWFkKHBCdWZmZXIsIDEsIHN6QnVmZmVyLCBtX2hGaWxlKTsKLX0KLXNpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OldyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikKLXsKLSAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBGWFNZU19md3JpdGUocEJ1ZmZlciwgMSwgc3pCdWZmZXIsIG1faEZpbGUpOwotfQotc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX0NSVDo6UmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcykKLXsKLSAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIChGWF9GSUxFU0laRSkgLSAxOwotICAgIH0KLSAgICBGWFNZU19mc2VlayhtX2hGaWxlLCBwb3MsIEZYU1lTX1NFRUtfU0VUKTsKLSAgICByZXR1cm4gRlhTWVNfZnJlYWQocEJ1ZmZlciwgMSwgc3pCdWZmZXIsIG1faEZpbGUpOwotfQotc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX0NSVDo6V3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpCi17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpIC0gMTsKLSAgICB9Ci0gICAgRlhTWVNfZnNlZWsobV9oRmlsZSwgcG9zLCBGWFNZU19TRUVLX1NFVCk7Ci0gICAgcmV0dXJuIEZYU1lTX2Z3cml0ZShwQnVmZmVyLCAxLCBzekJ1ZmZlciwgbV9oRmlsZSk7Ci19Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6Rmx1c2goKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiAhRlhTWVNfZmZsdXNoKG1faEZpbGUpOwotfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkKLXsKK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd01vZGUpIHsKKyAgaWYgKG1faEZpbGUpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyTW9kZTsKKyAgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoZHdNb2RlLCBzdHJNb2RlKTsKKyAgbV9oRmlsZSA9IEZYU1lTX2ZvcGVuKGZpbGVOYW1lLkdldENTdHIoKSwgc3RyTW9kZS5jX3N0cigpKTsKKyAgcmV0dXJuIG1faEZpbGUgIT0gTlVMTDsKIH0KLUZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQotewotICAgIHJldHVybiBhY2Nlc3MoZmlsZU5hbWUuR2V0Q1N0cigpLCBGX09LKSA+IC0xOworRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6Ok9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TW9kZSkgeworICBpZiAobV9oRmlsZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfV2lkZVN0cmluZyBzdHJNb2RlOworICBGWENSVF9HZXRGaWxlTW9kZVN0cmluZyhkd01vZGUsIHN0ck1vZGUpOworICBtX2hGaWxlID0gRlhTWVNfd2ZvcGVuKGZpbGVOYW1lLkdldFB0cigpLCBzdHJNb2RlLmNfc3RyKCkpOworICByZXR1cm4gbV9oRmlsZSAhPSBOVUxMOwogfQotRlhfQk9PTCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCi17Ci0gICAgcmV0dXJuIEZYX0ZpbGVfRXhpc3QoRlhfVVRGOEVuY29kZShmaWxlTmFtZSkpOwordm9pZCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OkNsb3NlKCkgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhTWVNfZmNsb3NlKG1faEZpbGUpOworICBtX2hGaWxlID0gTlVMTDsKIH0KLUZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkKLXsKLSAgICByZXR1cm4gcmVtb3ZlKGZpbGVOYW1lLkdldENTdHIoKSkgPiAtMTsKK3ZvaWQgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpSZWxlYXNlKCkgeworICBkZWxldGUgdGhpczsKIH0KLUZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkKLXsKLSAgICByZXR1cm4gRlhfRmlsZV9EZWxldGUoRlhfVVRGOEVuY29kZShmaWxlTmFtZSkpOworRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpHZXRTaXplKCkgY29uc3QgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGWF9GSUxFU0laRSBwb3MgPSAoRlhfRklMRVNJWkUpRlhTWVNfZnRlbGwobV9oRmlsZSk7CisgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIDAsIEZYU1lTX1NFRUtfRU5EKTsKKyAgRlhfRklMRVNJWkUgc2l6ZSA9IChGWF9GSUxFU0laRSlGWFNZU19mdGVsbChtX2hGaWxlKTsKKyAgRlhTWVNfZnNlZWsobV9oRmlsZSwgcG9zLCBGWFNZU19TRUVLX1NFVCk7CisgIHJldHVybiBzaXplOwogfQotRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKLXsKLSAgICBDRlhDUlRfRmlsZUFjY2Vzc19DUlQgc3JjLCBkc3Q7Ci0gICAgaWYgKCFzcmMuT3BlbihmaWxlTmFtZVNyYywgRlhfRklMRU1PREVfUmVhZE9ubHkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6R2V0UG9zaXRpb24oKSBjb25zdCB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAoRlhfRklMRVNJWkUpLTE7CisgIH0KKyAgcmV0dXJuIChGWF9GSUxFU0laRSlGWFNZU19mdGVsbChtX2hGaWxlKTsKK30KK0ZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6U2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKSB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAoRlhfRklMRVNJWkUpLTE7CisgIH0KKyAgRlhTWVNfZnNlZWsobV9oRmlsZSwgcG9zLCBGWFNZU19TRUVLX1NFVCk7CisgIHJldHVybiAoRlhfRklMRVNJWkUpRlhTWVNfZnRlbGwobV9oRmlsZSk7Cit9CitzaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpSZWFkKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gRlhTWVNfZnJlYWQocEJ1ZmZlciwgMSwgc3pCdWZmZXIsIG1faEZpbGUpOworfQorc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX0NSVDo6V3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBGWFNZU19md3JpdGUocEJ1ZmZlciwgMSwgc3pCdWZmZXIsIG1faEZpbGUpOworfQorc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX0NSVDo6UmVhZFBvcyh2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcykgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKS0xOworICB9CisgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIHBvcywgRlhTWVNfU0VFS19TRVQpOworICByZXR1cm4gRlhTWVNfZnJlYWQocEJ1ZmZlciwgMSwgc3pCdWZmZXIsIG1faEZpbGUpOworfQorc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX0NSVDo6V3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzekJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcykgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKS0xOworICB9CisgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIHBvcywgRlhTWVNfU0VFS19TRVQpOworICByZXR1cm4gRlhTWVNfZndyaXRlKHBCdWZmZXIsIDEsIHN6QnVmZmVyLCBtX2hGaWxlKTsKK30KK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpGbHVzaCgpIHsKKyAgaWYgKCFtX2hGaWxlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiAhRlhTWVNfZmZsdXNoKG1faEZpbGUpOworfQorRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkgeworICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkgeworICByZXR1cm4gYWNjZXNzKGZpbGVOYW1lLkdldENTdHIoKSwgRl9PSykgPiAtMTsKK30KK0ZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKSB7CisgIHJldHVybiBGWF9GaWxlX0V4aXN0KEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpKTsKK30KK0ZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkgeworICByZXR1cm4gcmVtb3ZlKGZpbGVOYW1lLkdldENTdHIoKSkgPiAtMTsKK30KK0ZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkgeworICByZXR1cm4gRlhfRmlsZV9EZWxldGUoRlhfVVRGOEVuY29kZShmaWxlTmFtZSkpOworfQorRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpIHsKKyAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUIHNyYywgZHN0OworICBpZiAoIXNyYy5PcGVuKGZpbGVOYW1lU3JjLCBGWF9GSUxFTU9ERV9SZWFkT25seSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRklMRVNJWkUgc2l6ZSA9IHNyYy5HZXRTaXplKCk7CisgIGlmICghc2l6ZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIWRzdC5PcGVuKGZpbGVOYW1lRHN0LCBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRklMRVNJWkUgbnVtID0gMDsKKyAgdWludDhfdCogcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIDMyNzY4KTsKKyAgd2hpbGUgKG51bSA9IHNyYy5SZWFkKHBCdWZmZXIsIDMyNzY4KSkgeworICAgIGlmIChkc3QuV3JpdGUocEJ1ZmZlciwgbnVtKSAhPSBudW0pIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBGWF9GSUxFU0laRSBzaXplID0gc3JjLkdldFNpemUoKTsKLSAgICBpZiAoIXNpemUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIWRzdC5PcGVuKGZpbGVOYW1lRHN0LCBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9GSUxFU0laRSBudW0gPSAwOwotICAgIHVpbnQ4X3QqIHBCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCAzMjc2OCk7Ci0gICAgd2hpbGUgKG51bSA9IHNyYy5SZWFkKHBCdWZmZXIsIDMyNzY4KSkgewotICAgICAgICBpZiAoZHN0LldyaXRlKHBCdWZmZXIsIG51bSkgIT0gbnVtKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9GcmVlKHBCdWZmZXIpOwotICAgIHJldHVybiBUUlVFOworICB9CisgIEZYX0ZyZWUocEJ1ZmZlcik7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkKLXsKLSAgICByZXR1cm4gRlhfRmlsZV9Db3B5KEZYX1VURjhFbmNvZGUoZmlsZU5hbWVTcmMpLCBGWF9VVEY4RW5jb2RlKGZpbGVOYW1lRHN0KSk7CitGWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkgeworICByZXR1cm4gRlhfRmlsZV9Db3B5KEZYX1VURjhFbmNvZGUoZmlsZU5hbWVTcmMpLCBGWF9VVEY4RW5jb2RlKGZpbGVOYW1lRHN0KSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiByZW5hbWUoZmlsZU5hbWVTcmMuR2V0Q1N0cigpLCBmaWxlTmFtZURzdC5HZXRDU3RyKCkpOworRlhfQk9PTCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpIHsKKyAgcmV0dXJuIHJlbmFtZShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiBGWF9GaWxlX01vdmUoRlhfVVRGOEVuY29kZShmaWxlTmFtZVNyYyksIEZYX1VURjhFbmNvZGUoZmlsZU5hbWVEc3QpKTsKK0ZYX0JPT0wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KSB7CisgIHJldHVybiBGWF9GaWxlX01vdmUoRlhfVVRGOEVuY29kZShmaWxlTmFtZVNyYyksIEZYX1VURjhFbmNvZGUoZmlsZU5hbWVEc3QpKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfcGxhdGZvcm1zLmggYi9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuaAppbmRleCA0ZmQwNTg4Li41ODcwYzc2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuaAorKysgYi9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuaApAQCAtMTAsMjggKzEwLDMwIEBACiAjaW5jbHVkZSAiZXh0ZW5zaW9uLmgiCiAKICNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXwotdm9pZAlGWENSVF9HZXRGaWxlTW9kZVN0cmluZyhGWF9EV09SRCBkd01vZGVzLCBDRlhfQnl0ZVN0cmluZyAmYnNNb2RlKTsKLXZvaWQJRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoRlhfRFdPUkQgZHdNb2RlcywgQ0ZYX1dpZGVTdHJpbmcgJndzTW9kZSk7Ci1jbGFzcyBDRlhDUlRfRmlsZUFjY2Vzc19DUlQgOiBwdWJsaWMgSUZYQ1JUX0ZpbGVBY2Nlc3MKLXsKLXB1YmxpYzoKLSAgICBDRlhDUlRfRmlsZUFjY2Vzc19DUlQoKTsKLSAgICB2aXJ0dWFsIH5DRlhDUlRfRmlsZUFjY2Vzc19DUlQoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKTsKLSAgICB2aXJ0dWFsIHZvaWQJCUNsb3NlKCk7Ci0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCk7Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQlHZXRTaXplKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQlHZXRQb3NpdGlvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJU2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKTsKLSAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOwotICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOwotICAgIHZpcnR1YWwgc2l6ZV90CQlSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLSAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRmx1c2goKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSk7Ci1wcm90ZWN0ZWQ6Ci0gICAgRlhTWVNfRklMRSoJbV9oRmlsZTsKK3ZvaWQgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoRlhfRFdPUkQgZHdNb2RlcywgQ0ZYX0J5dGVTdHJpbmcmIGJzTW9kZSk7Cit2b2lkIEZYQ1JUX0dldEZpbGVNb2RlU3RyaW5nKEZYX0RXT1JEIGR3TW9kZXMsIENGWF9XaWRlU3RyaW5nJiB3c01vZGUpOworY2xhc3MgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUIDogcHVibGljIElGWENSVF9GaWxlQWNjZXNzIHsKKyBwdWJsaWM6CisgIENGWENSVF9GaWxlQWNjZXNzX0NSVCgpOworICB2aXJ0dWFsIH5DRlhDUlRfRmlsZUFjY2Vzc19DUlQoKTsKKyAgdmlydHVhbCBGWF9CT09MIE9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKTsKKyAgdmlydHVhbCBGWF9CT09MIE9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKTsKKyAgdmlydHVhbCB2b2lkIENsb3NlKCk7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIGNvbnN0OworICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgY29uc3Q7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgU2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKTsKKyAgdmlydHVhbCBzaXplX3QgUmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOworICB2aXJ0dWFsIHNpemVfdCBXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOworICB2aXJ0dWFsIHNpemVfdCBSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKKyAgdmlydHVhbCBzaXplX3QgV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBwb3MpOworICB2aXJ0dWFsIEZYX0JPT0wgRmx1c2goKTsKKyAgdmlydHVhbCBGWF9CT09MIFRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSk7CisKKyBwcm90ZWN0ZWQ6CisgIEZYU1lTX0ZJTEUqIG1faEZpbGU7CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmNwcAppbmRleCA3MGRmOWU4Li4wM2ZkMzQ1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfcG9zaXguY3BwCkBAIC03LDE4NSArNywxNzIgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAjaW5jbHVkZSAiZnhjcnRfcG9zaXguaCIKIAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8IF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfIHx8IF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQU5EUk9JRF8KLUlGWENSVF9GaWxlQWNjZXNzKiBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpCi17Ci0gICAgcmV0dXJuIEZYX05FVyBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0xJTlVYXyB8fCBcCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8gfHwgXAorICAgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQU5EUk9JRF8KK0lGWENSVF9GaWxlQWNjZXNzKiBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpIHsKKyAgcmV0dXJuIEZYX05FVyBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDsKIH0KLXZvaWQgRlhDUlRfUG9zaXhfR2V0RmlsZU1vZGUoRlhfRFdPUkQgZHdNb2RlcywgaW50MzJfdCAmbkZsYWdzLCBpbnQzMl90ICZuTWFza3MpCi17Ci0gICAgbkZsYWdzID0gT19CSU5BUlkgfCBPX0xBUkdFRklMRTsKLSAgICBpZiAoZHdNb2RlcyAmIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSB7Ci0gICAgICAgIG5GbGFncyB8PSBPX1JET05MWTsKLSAgICAgICAgbk1hc2tzID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBuRmxhZ3MgfD0gT19SRFdSIHwgT19DUkVBVDsKLSAgICAgICAgaWYgKGR3TW9kZXMgJiBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkgewotICAgICAgICAgICAgbkZsYWdzIHw9IE9fVFJVTkM7Ci0gICAgICAgIH0KLSAgICAgICAgbk1hc2tzID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKK3ZvaWQgRlhDUlRfUG9zaXhfR2V0RmlsZU1vZGUoRlhfRFdPUkQgZHdNb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuTWFza3MpIHsKKyAgbkZsYWdzID0gT19CSU5BUlkgfCBPX0xBUkdFRklMRTsKKyAgaWYgKGR3TW9kZXMgJiBGWF9GSUxFTU9ERV9SZWFkT25seSkgeworICAgIG5GbGFncyB8PSBPX1JET05MWTsKKyAgICBuTWFza3MgPSAwOworICB9IGVsc2UgeworICAgIG5GbGFncyB8PSBPX1JEV1IgfCBPX0NSRUFUOworICAgIGlmIChkd01vZGVzICYgRlhfRklMRU1PREVfVHJ1bmNhdGUpIHsKKyAgICAgIG5GbGFncyB8PSBPX1RSVU5DOwogICAgIH0KKyAgICBuTWFza3MgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworICB9CiB9Ci1DRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6Q0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXgoKQotICAgIDogbV9uRkQoLTEpCi17CitDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6Q0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXgoKSA6IG1fbkZEKC0xKSB7fQorQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6On5DRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeCgpIHsKKyAgQ2xvc2UoKTsKIH0KLUNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4Ojp+Q0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXgoKQotewotICAgIENsb3NlKCk7CitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TW9kZSkgeworICBpZiAobV9uRkQgPiAtMSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQzMl90IG5GbGFncywgbk1hc2tzOworICBGWENSVF9Qb3NpeF9HZXRGaWxlTW9kZShkd01vZGUsIG5GbGFncywgbk1hc2tzKTsKKyAgbV9uRkQgPSBvcGVuKGZpbGVOYW1lLkdldENTdHIoKSwgbkZsYWdzLCBuTWFza3MpOworICByZXR1cm4gbV9uRkQgPiAtMTsKIH0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6Ok9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQotewotICAgIGlmIChtX25GRCA+IC0xKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6Ok9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdNb2RlKSB7CisgIHJldHVybiBPcGVuKEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpLCBkd01vZGUpOworfQordm9pZCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6Q2xvc2UoKSB7CisgIGlmIChtX25GRCA8IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgY2xvc2UobV9uRkQpOworICBtX25GRCA9IC0xOworfQordm9pZCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6UmVsZWFzZSgpIHsKKyAgZGVsZXRlIHRoaXM7Cit9CitGWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6R2V0U2l6ZSgpIGNvbnN0IHsKKyAgaWYgKG1fbkZEIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIHN0cnVjdCBzdGF0IHM7CisgIEZYU1lTX21lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKKyAgZnN0YXQobV9uRkQsICZzKTsKKyAgcmV0dXJuIHMuc3Rfc2l6ZTsKK30KK0ZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpHZXRQb3NpdGlvbigpIGNvbnN0IHsKKyAgaWYgKG1fbkZEIDwgMCkgeworICAgIHJldHVybiAoRlhfRklMRVNJWkUpLTE7CisgIH0KKyAgcmV0dXJuIGxzZWVrKG1fbkZELCAwLCBTRUVLX0NVUik7Cit9CitGWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6U2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKSB7CisgIGlmIChtX25GRCA8IDApIHsKKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKS0xOworICB9CisgIHJldHVybiBsc2VlayhtX25GRCwgcG9zLCBTRUVLX1NFVCk7Cit9CitzaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OlJlYWQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSB7CisgIGlmIChtX25GRCA8IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gcmVhZChtX25GRCwgcEJ1ZmZlciwgc3pCdWZmZXIpOworfQorc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIHsKKyAgaWYgKG1fbkZEIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiB3cml0ZShtX25GRCwgcEJ1ZmZlciwgc3pCdWZmZXIpOworfQorc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpSZWFkUG9zKHZvaWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcykgeworICBpZiAobV9uRkQgPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHBvcyA+PSBHZXRTaXplKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoU2V0UG9zaXRpb24ocG9zKSA9PSAoRlhfRklMRVNJWkUpLTEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gUmVhZChwQnVmZmVyLCBzekJ1ZmZlcik7Cit9CitzaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OldyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzekJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zKSB7CisgIGlmIChtX25GRCA8IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoU2V0UG9zaXRpb24ocG9zKSA9PSAoRlhfRklMRVNJWkUpLTEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gV3JpdGUocEJ1ZmZlciwgc3pCdWZmZXIpOworfQorRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6Rmx1c2goKSB7CisgIGlmIChtX25GRCA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIGZzeW5jKG1fbkZEKSA+IC0xOworfQorRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6VHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKSB7CisgIGlmIChtX25GRCA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuICFmdHJ1bmNhdGUobV9uRkQsIHN6RmlsZSk7Cit9CitGWF9CT09MIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkgeworICByZXR1cm4gYWNjZXNzKGZpbGVOYW1lLkdldENTdHIoKSwgRl9PSykgPiAtMTsKK30KK0ZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKSB7CisgIHJldHVybiBGWF9GaWxlX0V4aXN0KEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpKTsKK30KK0ZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkgeworICByZXR1cm4gcmVtb3ZlKGZpbGVOYW1lLkdldENTdHIoKSkgPiAtMTsKK30KK0ZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkgeworICByZXR1cm4gRlhfRmlsZV9EZWxldGUoRlhfVVRGOEVuY29kZShmaWxlTmFtZSkpOworfQorRlhfQk9PTCBGWF9GaWxlX0NvcHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpIHsKKyAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXggc3JjLCBkc3Q7CisgIGlmICghc3JjLk9wZW4oZmlsZU5hbWVTcmMsIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9GSUxFU0laRSBzaXplID0gc3JjLkdldFNpemUoKTsKKyAgaWYgKCFzaXplKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghZHN0Lk9wZW4oZmlsZU5hbWVEc3QsIEZYX0ZJTEVNT0RFX1RydW5jYXRlKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzaXplX3QgbnVtID0gMDsKKyAgdWludDhfdCogcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIDMyNzY4KTsKKyAgbnVtID0gc3JjLlJlYWQocEJ1ZmZlciwgMzI3NjgpOworICB3aGlsZSAobnVtKSB7CisgICAgaWYgKGRzdC5Xcml0ZShwQnVmZmVyLCBudW0pICE9IG51bSkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGludDMyX3QgbkZsYWdzLCBuTWFza3M7Ci0gICAgRlhDUlRfUG9zaXhfR2V0RmlsZU1vZGUoZHdNb2RlLCBuRmxhZ3MsIG5NYXNrcyk7Ci0gICAgbV9uRkQgPSBvcGVuKGZpbGVOYW1lLkdldENTdHIoKSwgbkZsYWdzLCBuTWFza3MpOwotICAgIHJldHVybiBtX25GRCA+IC0xOwotfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6T3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCi17Ci0gICAgcmV0dXJuIE9wZW4oRlhfVVRGOEVuY29kZShmaWxlTmFtZSksIGR3TW9kZSk7Ci19Ci12b2lkIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpDbG9zZSgpCi17Ci0gICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNsb3NlKG1fbkZEKTsKLSAgICBtX25GRCA9IC0xOwotfQotdm9pZCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6UmVsZWFzZSgpCi17Ci0gICAgZGVsZXRlIHRoaXM7Ci19Ci1GWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6R2V0U2l6ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc3RydWN0IHN0YXQgczsKLSAgICBGWFNZU19tZW1zZXQoJnMsIDAsIHNpemVvZihzKSk7Ci0gICAgZnN0YXQobV9uRkQsICZzKTsKLSAgICByZXR1cm4gcy5zdF9zaXplOwotfQotRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OkdldFBvc2l0aW9uKCkgY29uc3QKLXsKLSAgICBpZiAobV9uRkQgPCAwKSB7Ci0gICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpIC0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGxzZWVrKG1fbkZELCAwLCBTRUVLX0NVUik7Ci19Ci1GWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6U2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKQotewotICAgIGlmIChtX25GRCA8IDApIHsKLSAgICAgICAgcmV0dXJuIChGWF9GSUxFU0laRSkgLSAxOwotICAgIH0KLSAgICByZXR1cm4gbHNlZWsobV9uRkQsIHBvcywgU0VFS19TRVQpOwotfQotc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpSZWFkKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikKLXsKLSAgICBpZiAobV9uRkQgPCAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcmVhZChtX25GRCwgcEJ1ZmZlciwgc3pCdWZmZXIpOwotfQotc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpCi17Ci0gICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHdyaXRlKG1fbkZELCBwQnVmZmVyLCBzekJ1ZmZlcik7Ci19Ci1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OlJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpCi17Ci0gICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHBvcyA+PSBHZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChTZXRQb3NpdGlvbihwb3MpID09IChGWF9GSUxFU0laRSkgLSAxKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gUmVhZChwQnVmZmVyLCBzekJ1ZmZlcik7Ci19Ci1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OldyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKQotewotICAgIGlmIChtX25GRCA8IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChTZXRQb3NpdGlvbihwb3MpID09IChGWF9GSUxFU0laRSkgLSAxKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gV3JpdGUocEJ1ZmZlciwgc3pCdWZmZXIpOwotfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6Rmx1c2goKQotewotICAgIGlmIChtX25GRCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gZnN5bmMobV9uRkQpID4gLTE7Ci19Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpCi17Ci0gICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiAhZnRydW5jYXRlKG1fbkZELCBzekZpbGUpOwotfQotRlhfQk9PTCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUpCi17Ci0gICAgcmV0dXJuIGFjY2VzcyhmaWxlTmFtZS5HZXRDU3RyKCksIEZfT0spID4gLTE7Ci19Ci1GWF9CT09MIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkKLXsKLSAgICByZXR1cm4gRlhfRmlsZV9FeGlzdChGWF9VVEY4RW5jb2RlKGZpbGVOYW1lKSk7Ci19Ci1GWF9CT09MIEZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUpCi17Ci0gICAgcmV0dXJuIHJlbW92ZShmaWxlTmFtZS5HZXRDU3RyKCkpID4gLTE7Ci19Ci1GWF9CT09MIEZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCi17Ci0gICAgcmV0dXJuIEZYX0ZpbGVfRGVsZXRlKEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpKTsKLX0KLUZYX0JPT0wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCi17Ci0gICAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXggc3JjLCBkc3Q7Ci0gICAgaWYgKCFzcmMuT3BlbihmaWxlTmFtZVNyYywgRlhfRklMRU1PREVfUmVhZE9ubHkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRklMRVNJWkUgc2l6ZSA9IHNyYy5HZXRTaXplKCk7Ci0gICAgaWYgKCFzaXplKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCFkc3QuT3BlbihmaWxlTmFtZURzdCwgRlhfRklMRU1PREVfVHJ1bmNhdGUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc2l6ZV90IG51bSA9IDA7Ci0gICAgdWludDhfdCogcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIDMyNzY4KTsKICAgICBudW0gPSBzcmMuUmVhZChwQnVmZmVyLCAzMjc2OCk7Ci0gICAgd2hpbGUgKG51bSkgewotICAgICAgICBpZiAoZHN0LldyaXRlKHBCdWZmZXIsIG51bSkgIT0gbnVtKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBudW0gPSBzcmMuUmVhZChwQnVmZmVyLCAzMjc2OCk7Ci0gICAgfQotICAgIEZYX0ZyZWUocEJ1ZmZlcik7Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgRlhfRnJlZShwQnVmZmVyKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiBGWF9GaWxlX0NvcHkoRlhfVVRGOEVuY29kZShmaWxlTmFtZVNyYyksIEZYX1VURjhFbmNvZGUoZmlsZU5hbWVEc3QpKTsKK0ZYX0JPT0wgRlhfRmlsZV9Db3B5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KSB7CisgIHJldHVybiBGWF9GaWxlX0NvcHkoRlhfVVRGOEVuY29kZShmaWxlTmFtZVNyYyksIEZYX1VURjhFbmNvZGUoZmlsZU5hbWVEc3QpKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCi17Ci0gICAgcmV0dXJuIHJlbmFtZShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSk7CitGWF9CT09MIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkgeworICByZXR1cm4gcmVuYW1lKGZpbGVOYW1lU3JjLkdldENTdHIoKSwgZmlsZU5hbWVEc3QuR2V0Q1N0cigpKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCi17Ci0gICAgcmV0dXJuIEZYX0ZpbGVfTW92ZShGWF9VVEY4RW5jb2RlKGZpbGVOYW1lU3JjKSwgRlhfVVRGOEVuY29kZShmaWxlTmFtZURzdCkpOworRlhfQk9PTCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZVNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpIHsKKyAgcmV0dXJuIEZYX0ZpbGVfTW92ZShGWF9VVEY4RW5jb2RlKGZpbGVOYW1lU3JjKSwgRlhfVVRGOEVuY29kZShmaWxlTmFtZURzdCkpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5oIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfcG9zaXguaAppbmRleCAzOWRmMWM4Li4xOWUxMWRhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5oCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmgKQEAgLTksMjcgKzksMzEgQEAKIAogI2luY2x1ZGUgImV4dGVuc2lvbi5oIgogCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8gfHwgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8gfHwgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXwotY2xhc3MgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXggOiBwdWJsaWMgSUZYQ1JUX0ZpbGVBY2Nlc3MKLXsKLXB1YmxpYzoKLSAgICBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeCgpOwotICAgIHZpcnR1YWwgfkNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4KCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7Ci0gICAgdmlydHVhbCB2b2lkCQlDbG9zZSgpOwotICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOwotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0U2l6ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0UG9zaXRpb24oKSBjb25zdDsKLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCVNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcyk7Ci0gICAgdmlydHVhbCBzaXplX3QJCVJlYWQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKLSAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKLSAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcyk7Ci0gICAgdmlydHVhbCBzaXplX3QJCVdyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUZsdXNoKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpOwotcHJvdGVjdGVkOgotICAgIGludDMyX3QJbV9uRkQ7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8gfHwgXAorICAgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfIHx8IFwKKyAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FORFJPSURfCitjbGFzcyBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeCA6IHB1YmxpYyBJRlhDUlRfRmlsZUFjY2VzcyB7CisgcHVibGljOgorICBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeCgpOworICB2aXJ0dWFsIH5DRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeCgpOworICB2aXJ0dWFsIEZYX0JPT0wgT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICB2aXJ0dWFsIEZYX0JPT0wgT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKTsKKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRTaXplKCkgY29uc3Q7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBjb25zdDsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpOworICB2aXJ0dWFsIHNpemVfdCBSZWFkKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcik7CisgIHZpcnR1YWwgc2l6ZV90IFdyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcik7CisgIHZpcnR1YWwgc2l6ZV90IFJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOworICB2aXJ0dWFsIHNpemVfdCBXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcyk7CisgIHZpcnR1YWwgRlhfQk9PTCBGbHVzaCgpOworICB2aXJ0dWFsIEZYX0JPT0wgVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKTsKKworIHByb3RlY3RlZDoKKyAgaW50MzJfdCBtX25GRDsKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAgYi9jb3JlL3NyYy9meGNydC9meGNydF93aW5kb3dzLmNwcAppbmRleCA0Mzc2NWE3Li45MDZlOGJkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF93aW5kb3dzLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meGNydF93aW5kb3dzLmNwcApAQCAtOCwyMDggKzgsMjAyIEBACiAjaW5jbHVkZSAiZnhjcnRfd2luZG93cy5oIgogCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotRlhfQk9PTCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUpCi17Ci0gICAgRlhfRFdPUkQgZHdBdHRyaSA9IDo6R2V0RmlsZUF0dHJpYnV0ZXNBKGZpbGVOYW1lLkdldENTdHIoKSk7Ci0gICAgaWYgKGR3QXR0cmkgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gKGR3QXR0cmkgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpID09IDA7CitGWF9CT09MIEZYX0ZpbGVfRXhpc3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSkgeworICBGWF9EV09SRCBkd0F0dHJpID0gOjpHZXRGaWxlQXR0cmlidXRlc0EoZmlsZU5hbWUuR2V0Q1N0cigpKTsKKyAgaWYgKGR3QXR0cmkgPT0gLTEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIChkd0F0dHJpICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSA9PSAwOwogfQotRlhfQk9PTCBGWF9GaWxlX0V4aXN0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCi17Ci0gICAgRlhfRFdPUkQgZHdBdHRyaSA9IDo6R2V0RmlsZUF0dHJpYnV0ZXNXKChMUENXU1RSKWZpbGVOYW1lLkdldFB0cigpKTsKLSAgICBpZiAoZHdBdHRyaSA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiAoZHdBdHRyaSAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgPT0gMDsKK0ZYX0JPT0wgRlhfRmlsZV9FeGlzdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lKSB7CisgIEZYX0RXT1JEIGR3QXR0cmkgPSA6OkdldEZpbGVBdHRyaWJ1dGVzVygoTFBDV1NUUilmaWxlTmFtZS5HZXRQdHIoKSk7CisgIGlmIChkd0F0dHJpID09IC0xKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiAoZHdBdHRyaSAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgPT0gMDsKIH0KLUlGWENSVF9GaWxlQWNjZXNzKiBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpCi17Ci0gICAgcmV0dXJuIEZYX05FVyBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDsKK0lGWENSVF9GaWxlQWNjZXNzKiBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpIHsKKyAgcmV0dXJuIEZYX05FVyBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDsKIH0KLXZvaWQgRlhDUlRfV2luZG93c19HZXRGaWxlTW9kZShGWF9EV09SRCBkd01vZGUsIEZYX0RXT1JEICZkd0FjY2VzcywgRlhfRFdPUkQgJmR3U2hhcmUsIEZYX0RXT1JEICZkd0NyZWF0aW9uKQotewotICAgIGR3QWNjZXNzID0gR0VORVJJQ19SRUFEOwotICAgIGR3U2hhcmUgPSBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFOwotICAgIGlmICghKGR3TW9kZSAmIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSkgewotICAgICAgICBkd0FjY2VzcyB8PSBHRU5FUklDX1dSSVRFOwotICAgICAgICBkd0NyZWF0aW9uID0gKGR3TW9kZSAmIEZYX0ZJTEVNT0RFX1RydW5jYXRlKSA/IENSRUFURV9BTFdBWVMgOiBPUEVOX0FMV0FZUzsKLSAgICB9IGVsc2UgewotICAgICAgICBkd0NyZWF0aW9uID0gT1BFTl9FWElTVElORzsKLSAgICB9Cit2b2lkIEZYQ1JUX1dpbmRvd3NfR2V0RmlsZU1vZGUoRlhfRFdPUkQgZHdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkd0FjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHdTaGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHdDcmVhdGlvbikgeworICBkd0FjY2VzcyA9IEdFTkVSSUNfUkVBRDsKKyAgZHdTaGFyZSA9IEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEU7CisgIGlmICghKGR3TW9kZSAmIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSkgeworICAgIGR3QWNjZXNzIHw9IEdFTkVSSUNfV1JJVEU7CisgICAgZHdDcmVhdGlvbiA9IChkd01vZGUgJiBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkgPyBDUkVBVEVfQUxXQVlTIDogT1BFTl9BTFdBWVM7CisgIH0gZWxzZSB7CisgICAgZHdDcmVhdGlvbiA9IE9QRU5fRVhJU1RJTkc7CisgIH0KIH0KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIFdJTkJBU0VBUEkgQk9PTCBXSU5BUEkgR2V0RmlsZVNpemVFeChIQU5ETEUgaEZpbGUsIFBMQVJHRV9JTlRFR0VSIGxwRmlsZVNpemUpOwotV0lOQkFTRUFQSSBCT09MIFdJTkFQSSBTZXRGaWxlUG9pbnRlckV4KEhBTkRMRSBoRmlsZSwgTEFSR0VfSU5URUdFUiBsaURpc3RhbmNlVG9Nb3ZlLCBQTEFSR0VfSU5URUdFUiBscE5ld0ZpbGVQb2ludGVyLCBEV09SRCBkd01vdmVNZXRob2QpOworV0lOQkFTRUFQSSBCT09MIFdJTkFQSSBTZXRGaWxlUG9pbnRlckV4KEhBTkRMRSBoRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVJHRV9JTlRFR0VSIGxpRGlzdGFuY2VUb01vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExBUkdFX0lOVEVHRVIgbHBOZXdGaWxlUG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd01vdmVNZXRob2QpOwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKLUNGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpDRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpCi0gICAgOiBtX2hGaWxlKE5VTEwpCi17CitDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6Q0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQoKSA6IG1faEZpbGUoTlVMTCkge30KK0NGWENSVF9GaWxlQWNjZXNzX1dpbjY0Ojp+Q0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQoKSB7CisgIENsb3NlKCk7CiB9Ci1DRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6fkNGWENSVF9GaWxlQWNjZXNzX1dpbjY0KCkKLXsKLSAgICBDbG9zZSgpOwotfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCi17Ci0gICAgaWYgKG1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9EV09SRCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbjsKLSAgICBGWENSVF9XaW5kb3dzX0dldEZpbGVNb2RlKGR3TW9kZSwgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb24pOwotICAgIG1faEZpbGUgPSA6OkNyZWF0ZUZpbGVBKGZpbGVOYW1lLkdldENTdHIoKSwgZHdBY2Nlc3MsIGR3U2hhcmUsIE5VTEwsIGR3Q3JlYXRpb24sIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7Ci0gICAgaWYgKG1faEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICAgICAgbV9oRmlsZSA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtX2hGaWxlICE9IE5VTEw7Ci19Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKLXsKLSAgICBpZiAobV9oRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0RXT1JEIGR3QWNjZXNzLCBkd1NoYXJlLCBkd0NyZWF0aW9uOwotICAgIEZYQ1JUX1dpbmRvd3NfR2V0RmlsZU1vZGUoZHdNb2RlLCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbik7Ci0gICAgbV9oRmlsZSA9IDo6Q3JlYXRlRmlsZVcoKExQQ1dTVFIpZmlsZU5hbWUuR2V0UHRyKCksIGR3QWNjZXNzLCBkd1NoYXJlLCBOVUxMLCBkd0NyZWF0aW9uLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOwotICAgIGlmIChtX2hGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgICAgIG1faEZpbGUgPSBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbV9oRmlsZSAhPSBOVUxMOwotfQotdm9pZCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6Q2xvc2UoKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIDo6Q2xvc2VIYW5kbGUobV9oRmlsZSk7CitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TW9kZSkgeworICBpZiAobV9oRmlsZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9EV09SRCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbjsKKyAgRlhDUlRfV2luZG93c19HZXRGaWxlTW9kZShkd01vZGUsIGR3QWNjZXNzLCBkd1NoYXJlLCBkd0NyZWF0aW9uKTsKKyAgbV9oRmlsZSA9IDo6Q3JlYXRlRmlsZUEoZmlsZU5hbWUuR2V0Q1N0cigpLCBkd0FjY2VzcywgZHdTaGFyZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHdDcmVhdGlvbiwgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKKyAgaWYgKG1faEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKICAgICBtX2hGaWxlID0gTlVMTDsKKyAgfQorICByZXR1cm4gbV9oRmlsZSAhPSBOVUxMOwogfQotdm9pZCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6UmVsZWFzZSgpCi17Ci0gICAgZGVsZXRlIHRoaXM7CitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TW9kZSkgeworICBpZiAobV9oRmlsZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9EV09SRCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbjsKKyAgRlhDUlRfV2luZG93c19HZXRGaWxlTW9kZShkd01vZGUsIGR3QWNjZXNzLCBkd1NoYXJlLCBkd0NyZWF0aW9uKTsKKyAgbV9oRmlsZSA9IDo6Q3JlYXRlRmlsZVcoKExQQ1dTVFIpZmlsZU5hbWUuR2V0UHRyKCksIGR3QWNjZXNzLCBkd1NoYXJlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkd0NyZWF0aW9uLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICBpZiAobV9oRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIG1faEZpbGUgPSBOVUxMOworICB9CisgIHJldHVybiBtX2hGaWxlICE9IE5VTEw7CiB9Ci1GWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6R2V0U2l6ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBMQVJHRV9JTlRFR0VSIHNpemUgPSB7fTsKLSAgICBpZiAoITo6R2V0RmlsZVNpemVFeChtX2hGaWxlLCAmc2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAoRlhfRklMRVNJWkUpc2l6ZS5RdWFkUGFydDsKK3ZvaWQgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OkNsb3NlKCkgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgOjpDbG9zZUhhbmRsZShtX2hGaWxlKTsKKyAgbV9oRmlsZSA9IE5VTEw7CiB9Ci1GWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6R2V0UG9zaXRpb24oKSBjb25zdAotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKSAtIDE7Ci0gICAgfQotICAgIExBUkdFX0lOVEVHRVIgZGlzdCA9IHt9OwotICAgIExBUkdFX0lOVEVHRVIgbmV3UG9zID0ge307Ci0gICAgaWYgKCE6OlNldEZpbGVQb2ludGVyRXgobV9oRmlsZSwgZGlzdCwgJm5ld1BvcywgRklMRV9DVVJSRU5UKSkgewotICAgICAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKSAtIDE7Ci0gICAgfQotICAgIHJldHVybiAoRlhfRklMRVNJWkUpbmV3UG9zLlF1YWRQYXJ0Owordm9pZCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6UmVsZWFzZSgpIHsKKyAgZGVsZXRlIHRoaXM7CiB9Ci1GWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6U2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKSAtIDE7Ci0gICAgfQotICAgIExBUkdFX0lOVEVHRVIgZGlzdDsKLSAgICBkaXN0LlF1YWRQYXJ0ID0gcG9zOwotICAgIExBUkdFX0lOVEVHRVIgbmV3UG9zID0ge307Ci0gICAgaWYgKCE6OlNldEZpbGVQb2ludGVyRXgobV9oRmlsZSwgZGlzdCwgJm5ld1BvcywgRklMRV9CRUdJTikpIHsKLSAgICAgICAgcmV0dXJuIChGWF9GSUxFU0laRSkgLSAxOwotICAgIH0KLSAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKW5ld1Bvcy5RdWFkUGFydDsKK0ZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpHZXRTaXplKCkgY29uc3QgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBMQVJHRV9JTlRFR0VSIHNpemUgPSB7fTsKKyAgaWYgKCE6OkdldEZpbGVTaXplRXgobV9oRmlsZSwgJnNpemUpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIChGWF9GSUxFU0laRSlzaXplLlF1YWRQYXJ0OwogfQotc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpSZWFkKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikKLXsKLSAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHNpemVfdCBzelJlYWQgPSAwOwotICAgIGlmICghOjpSZWFkRmlsZShtX2hGaWxlLCBwQnVmZmVyLCAoRFdPUkQpc3pCdWZmZXIsIChMUERXT1JEKSZzelJlYWQsIE5VTEwpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gc3pSZWFkOworRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OkdldFBvc2l0aW9uKCkgY29uc3QgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKS0xOworICB9CisgIExBUkdFX0lOVEVHRVIgZGlzdCA9IHt9OworICBMQVJHRV9JTlRFR0VSIG5ld1BvcyA9IHt9OworICBpZiAoITo6U2V0RmlsZVBvaW50ZXJFeChtX2hGaWxlLCBkaXN0LCAmbmV3UG9zLCBGSUxFX0NVUlJFTlQpKSB7CisgICAgcmV0dXJuIChGWF9GSUxFU0laRSktMTsKKyAgfQorICByZXR1cm4gKEZYX0ZJTEVTSVpFKW5ld1Bvcy5RdWFkUGFydDsKIH0KLXNpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6V3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc2l6ZV90IHN6V3JpdGUgPSAwOwotICAgIGlmICghOjpXcml0ZUZpbGUobV9oRmlsZSwgcEJ1ZmZlciwgKERXT1JEKXN6QnVmZmVyLCAoTFBEV09SRCkmc3pXcml0ZSwgTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBzeldyaXRlOworRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKS0xOworICB9CisgIExBUkdFX0lOVEVHRVIgZGlzdDsKKyAgZGlzdC5RdWFkUGFydCA9IHBvczsKKyAgTEFSR0VfSU5URUdFUiBuZXdQb3MgPSB7fTsKKyAgaWYgKCE6OlNldEZpbGVQb2ludGVyRXgobV9oRmlsZSwgZGlzdCwgJm5ld1BvcywgRklMRV9CRUdJTikpIHsKKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKS0xOworICB9CisgIHJldHVybiAoRlhfRklMRVNJWkUpbmV3UG9zLlF1YWRQYXJ0OwogfQotc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHBvcyA+PSBHZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChTZXRQb3NpdGlvbihwb3MpID09IChGWF9GSUxFU0laRSkgLSAxKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gUmVhZChwQnVmZmVyLCBzekJ1ZmZlcik7CitzaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlJlYWQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAwOworICB9CisgIHNpemVfdCBzelJlYWQgPSAwOworICBpZiAoITo6UmVhZEZpbGUobV9oRmlsZSwgcEJ1ZmZlciwgKERXT1JEKXN6QnVmZmVyLCAoTFBEV09SRCkmc3pSZWFkLCBOVUxMKSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBzelJlYWQ7CiB9Ci1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OldyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKFNldFBvc2l0aW9uKHBvcykgPT0gKEZYX0ZJTEVTSVpFKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBXcml0ZShwQnVmZmVyLCBzekJ1ZmZlcik7CitzaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OldyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzaXplX3Qgc3pXcml0ZSA9IDA7CisgIGlmICghOjpXcml0ZUZpbGUobV9oRmlsZSwgcEJ1ZmZlciwgKERXT1JEKXN6QnVmZmVyLCAoTFBEV09SRCkmc3pXcml0ZSwKKyAgICAgICAgICAgICAgICAgICBOVUxMKSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBzeldyaXRlOwogfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6Rmx1c2goKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiA6OkZsdXNoRmlsZUJ1ZmZlcnMobV9oRmlsZSk7CitzaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlJlYWRQb3Modm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zKSB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChwb3MgPj0gR2V0U2l6ZSgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKFNldFBvc2l0aW9uKHBvcykgPT0gKEZYX0ZJTEVTSVpFKS0xKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIFJlYWQocEJ1ZmZlciwgc3pCdWZmZXIpOwogfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6VHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKQotewotICAgIGlmIChTZXRQb3NpdGlvbihzekZpbGUpID09IChGWF9GSUxFU0laRSkgLSAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIDo6U2V0RW5kT2ZGaWxlKG1faEZpbGUpOworc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcykgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoU2V0UG9zaXRpb24ocG9zKSA9PSAoRlhfRklMRVNJWkUpLTEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gV3JpdGUocEJ1ZmZlciwgc3pCdWZmZXIpOwogfQotRlhfQk9PTCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKQotewotICAgIHJldHVybiA6OkRlbGV0ZUZpbGVBKGZpbGVOYW1lLkdldENTdHIoKSk7CitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpGbHVzaCgpIHsKKyAgaWYgKCFtX2hGaWxlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiA6OkZsdXNoRmlsZUJ1ZmZlcnMobV9oRmlsZSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRGVsZXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUpCi17Ci0gICAgcmV0dXJuIDo6RGVsZXRlRmlsZVcoKExQQ1dTVFIpZmlsZU5hbWUuR2V0UHRyKCkpOworRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6VHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKSB7CisgIGlmIChTZXRQb3NpdGlvbihzekZpbGUpID09IChGWF9GSUxFU0laRSktMSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gOjpTZXRFbmRPZkZpbGUobV9oRmlsZSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiA6OkNvcHlGaWxlQShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSwgRkFMU0UpOworRlhfQk9PTCBGWF9GaWxlX0RlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lKSB7CisgIHJldHVybiA6OkRlbGV0ZUZpbGVBKGZpbGVOYW1lLkdldENTdHIoKSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiA6OkNvcHlGaWxlVygoTFBDV1NUUilmaWxlTmFtZVNyYy5HZXRQdHIoKSwgKExQQ1dTVFIpZmlsZU5hbWVEc3QuR2V0UHRyKCksIEZBTFNFKTsKK0ZYX0JPT0wgRlhfRmlsZV9EZWxldGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSkgeworICByZXR1cm4gOjpEZWxldGVGaWxlVygoTFBDV1NUUilmaWxlTmFtZS5HZXRQdHIoKSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfTW92ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiA6Ok1vdmVGaWxlQShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSk7CitGWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lU3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZURzdCkgeworICByZXR1cm4gOjpDb3B5RmlsZUEoZmlsZU5hbWVTcmMuR2V0Q1N0cigpLCBmaWxlTmFtZURzdC5HZXRDU3RyKCksIEZBTFNFKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpCi17Ci0gICAgcmV0dXJuIDo6TW92ZUZpbGVXKChMUENXU1RSKWZpbGVOYW1lU3JjLkdldFB0cigpLCAoTFBDV1NUUilmaWxlTmFtZURzdC5HZXRQdHIoKSk7CitGWF9CT09MIEZYX0ZpbGVfQ29weShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lU3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZURzdCkgeworICByZXR1cm4gOjpDb3B5RmlsZVcoKExQQ1dTVFIpZmlsZU5hbWVTcmMuR2V0UHRyKCksCisgICAgICAgICAgICAgICAgICAgICAoTFBDV1NUUilmaWxlTmFtZURzdC5HZXRQdHIoKSwgRkFMU0UpOworfQorRlhfQk9PTCBGWF9GaWxlX01vdmUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZVNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWVEc3QpIHsKKyAgcmV0dXJuIDo6TW92ZUZpbGVBKGZpbGVOYW1lU3JjLkdldENTdHIoKSwgZmlsZU5hbWVEc3QuR2V0Q1N0cigpKTsKK30KK0ZYX0JPT0wgRlhfRmlsZV9Nb3ZlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWVTcmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lRHN0KSB7CisgIHJldHVybiA6Ok1vdmVGaWxlVygoTFBDV1NUUilmaWxlTmFtZVNyYy5HZXRQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgIChMUENXU1RSKWZpbGVOYW1lRHN0LkdldFB0cigpKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5oIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5oCmluZGV4IDhkZDJjZGQuLmJiMDA0MTAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuaAorKysgYi9jb3JlL3NyYy9meGNydC9meGNydF93aW5kb3dzLmgKQEAgLTEwLDI2ICsxMCwyOCBAQAogI2luY2x1ZGUgImV4dGVuc2lvbi5oIgogCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotY2xhc3MgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQgOiBwdWJsaWMgSUZYQ1JUX0ZpbGVBY2Nlc3MKLXsKLXB1YmxpYzoKLSAgICBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpOwotICAgIHZpcnR1YWwgfkNGWENSVF9GaWxlQWNjZXNzX1dpbjY0KCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7Ci0gICAgdmlydHVhbCB2b2lkCQlDbG9zZSgpOwotICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOwotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0U2l6ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0UG9zaXRpb24oKSBjb25zdDsKLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCVNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcyk7Ci0gICAgdmlydHVhbCBzaXplX3QJCVJlYWQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKLSAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKLSAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcyk7Ci0gICAgdmlydHVhbCBzaXplX3QJCVdyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUZsdXNoKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpOwotcHJvdGVjdGVkOgotICAgIHZvaWQqCW1faEZpbGU7CitjbGFzcyBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NCA6IHB1YmxpYyBJRlhDUlRfRmlsZUFjY2VzcyB7CisgcHVibGljOgorICBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpOworICB2aXJ0dWFsIH5DRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpOworICB2aXJ0dWFsIEZYX0JPT0wgT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICB2aXJ0dWFsIEZYX0JPT0wgT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOworICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKTsKKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRTaXplKCkgY29uc3Q7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBjb25zdDsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpOworICB2aXJ0dWFsIHNpemVfdCBSZWFkKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcik7CisgIHZpcnR1YWwgc2l6ZV90IFdyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcik7CisgIHZpcnR1YWwgc2l6ZV90IFJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOworICB2aXJ0dWFsIHNpemVfdCBXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcyk7CisgIHZpcnR1YWwgRlhfQk9PTCBGbHVzaCgpOworICB2aXJ0dWFsIEZYX0JPT0wgVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKTsKKworIHByb3RlY3RlZDoKKyAgdm9pZCogbV9oRmlsZTsKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvcGxleC5oIGIvY29yZS9zcmMvZnhjcnQvcGxleC5oCmluZGV4IGJhZjI3ZjUuLmQ1NjA0MDYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L3BsZXguaAorKysgYi9jb3JlL3NyYy9meGNydC9wbGV4LmgKQEAgLTksMTMgKzksMTAgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCiBzdHJ1Y3QgQ0ZYX1BsZXggewotICAgIENGWF9QbGV4KiBwTmV4dDsKLSAgICB2b2lkKiBkYXRhKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzICsgMTsKLSAgICB9Ci0gICAgc3RhdGljIENGWF9QbGV4KiBDcmVhdGUoQ0ZYX1BsZXgqJiBoZWFkLCBGWF9EV09SRCBuTWF4LCBGWF9EV09SRCBjYkVsZW1lbnQpOwotICAgIHZvaWQgRnJlZURhdGFDaGFpbigpOworICBDRlhfUGxleCogcE5leHQ7CisgIHZvaWQqIGRhdGEoKSB7IHJldHVybiB0aGlzICsgMTsgfQorICBzdGF0aWMgQ0ZYX1BsZXgqIENyZWF0ZShDRlhfUGxleComIGhlYWQsIEZYX0RXT1JEIG5NYXgsIEZYX0RXT1JEIGNiRWxlbWVudCk7CisgIHZvaWQgRnJlZURhdGFDaGFpbigpOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX1NSQ19GWENSVF9QTEVYX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC94bWxfaW50LmggYi9jb3JlL3NyYy9meGNydC94bWxfaW50LmgKaW5kZXggMTA5YzdhNC4uMTAwODQzNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQveG1sX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L3htbF9pbnQuaApAQCAtOSwxNTcgKzksMTEyIEBACiAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgogCi1jbGFzcyBDWE1MX0RhdGFCdWZBY2MgOiBwdWJsaWMgSUZYX0J1ZmZlclJlYWQKLXsKLXB1YmxpYzoKLSAgICBDWE1MX0RhdGFCdWZBY2MoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IHNpemUpCi0gICAgICAgIDogbV9wQnVmZmVyKHBCdWZmZXIpCi0gICAgICAgICwgbV9kd1NpemUoc2l6ZSkKLSAgICAgICAgLCBtX2R3Q3VyUG9zKDApCi0gICAgeworY2xhc3MgQ1hNTF9EYXRhQnVmQWNjIDogcHVibGljIElGWF9CdWZmZXJSZWFkIHsKKyBwdWJsaWM6CisgIENYTUxfRGF0YUJ1ZkFjYyhjb25zdCB1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSkKKyAgICAgIDogbV9wQnVmZmVyKHBCdWZmZXIpLCBtX2R3U2l6ZShzaXplKSwgbV9kd0N1clBvcygwKSB7fQorICB2aXJ0dWFsIH5DWE1MX0RhdGFCdWZBY2MoKSB7fQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgeyByZXR1cm4gbV9kd0N1clBvcyA+PSBtX2R3U2l6ZTsgfQorICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgeyByZXR1cm4gKEZYX0ZJTEVTSVpFKW1fZHdDdXJQb3M7IH0KKyAgdmlydHVhbCBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBGWF9CT09MIFJlYWROZXh0QmxvY2soRlhfQk9PTCBiUmVzdGFydCA9IEZBTFNFKSB7CisgICAgaWYgKGJSZXN0YXJ0KSB7CisgICAgICBtX2R3Q3VyUG9zID0gMDsKICAgICB9Ci0gICAgdmlydHVhbCB+Q1hNTF9EYXRhQnVmQWNjKCkge30KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOworICAgIGlmIChtX2R3Q3VyUG9zIDwgbV9kd1NpemUpIHsKKyAgICAgIG1fZHdDdXJQb3MgPSBtX2R3U2l6ZTsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9kd0N1clBvcyA+PSBtX2R3U2l6ZTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0UG9zaXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChGWF9GSUxFU0laRSltX2R3Q3VyUG9zOwotICAgIH0KLSAgICB2aXJ0dWFsIHNpemVfdAkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWROZXh0QmxvY2soRlhfQk9PTCBiUmVzdGFydCA9IEZBTFNFKQotICAgIHsKLSAgICAgICAgaWYgKGJSZXN0YXJ0KSB7Ci0gICAgICAgICAgICBtX2R3Q3VyUG9zID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9kd0N1clBvcyA8IG1fZHdTaXplKSB7Ci0gICAgICAgICAgICBtX2R3Q3VyUG9zID0gbV9kd1NpemU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCoJCUdldEJsb2NrQnVmZmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BCdWZmZXI7Ci0gICAgfQotICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0QmxvY2tTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2R3U2l6ZTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0QmxvY2tPZmZzZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotcHJvdGVjdGVkOgotICAgIGNvbnN0IHVpbnQ4X3QqCQltX3BCdWZmZXI7Ci0gICAgc2l6ZV90CQkJbV9kd1NpemU7Ci0gICAgc2l6ZV90CQkJbV9kd0N1clBvczsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdmlydHVhbCBjb25zdCB1aW50OF90KiBHZXRCbG9ja0J1ZmZlcigpIHsgcmV0dXJuIG1fcEJ1ZmZlcjsgfQorICB2aXJ0dWFsIHNpemVfdCBHZXRCbG9ja1NpemUoKSB7IHJldHVybiBtX2R3U2l6ZTsgfQorICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldEJsb2NrT2Zmc2V0KCkgeyByZXR1cm4gMDsgfQorCisgcHJvdGVjdGVkOgorICBjb25zdCB1aW50OF90KiBtX3BCdWZmZXI7CisgIHNpemVfdCBtX2R3U2l6ZTsKKyAgc2l6ZV90IG1fZHdDdXJQb3M7CiB9OwotI2RlZmluZSBGWF9YTUxEQVRBU1RSRUFNX0J1ZmZlclNpemUJCSgzMiAqIDEwMjQpCi1jbGFzcyBDWE1MX0RhdGFTdG1BY2MgOiBwdWJsaWMgSUZYX0J1ZmZlclJlYWQKLXsKLXB1YmxpYzoKLSAgICBDWE1MX0RhdGFTdG1BY2MoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQpCi0gICAgICAgIDogbV9wRmlsZVJlYWQocEZpbGVSZWFkKQotICAgICAgICAsIG1fcEJ1ZmZlcihOVUxMKQotICAgICAgICAsIG1fblN0YXJ0KDApCi0gICAgICAgICwgbV9kd1NpemUoMCkKLSAgICB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChtX3BGaWxlUmVhZCAhPSBOVUxMKTsKKyNkZWZpbmUgRlhfWE1MREFUQVNUUkVBTV9CdWZmZXJTaXplICgzMiAqIDEwMjQpCitjbGFzcyBDWE1MX0RhdGFTdG1BY2MgOiBwdWJsaWMgSUZYX0J1ZmZlclJlYWQgeworIHB1YmxpYzoKKyAgQ1hNTF9EYXRhU3RtQWNjKElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKQorICAgICAgOiBtX3BGaWxlUmVhZChwRmlsZVJlYWQpLCBtX3BCdWZmZXIoTlVMTCksIG1fblN0YXJ0KDApLCBtX2R3U2l6ZSgwKSB7CisgICAgRlhTWVNfYXNzZXJ0KG1fcEZpbGVSZWFkICE9IE5VTEwpOworICB9CisgIHZpcnR1YWwgfkNYTUxfRGF0YVN0bUFjYygpIHsKKyAgICBpZiAobV9wQnVmZmVyKSB7CisgICAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7CiAgICAgfQotICAgIHZpcnR1YWwgfkNYTUxfRGF0YVN0bUFjYygpCi0gICAgewotICAgICAgICBpZiAobV9wQnVmZmVyKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci0gICAgICAgIH0KKyAgfQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgeworICAgIHJldHVybiBtX25TdGFydCArIChGWF9GSUxFU0laRSltX2R3U2l6ZSA+PSBtX3BGaWxlUmVhZC0+R2V0U2l6ZSgpOworICB9CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSB7IHJldHVybiBtX25TdGFydCArIChGWF9GSUxFU0laRSltX2R3U2l6ZTsgfQorICB2aXJ0dWFsIHNpemVfdCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeyByZXR1cm4gMDsgfQorICB2aXJ0dWFsIEZYX0JPT0wgUmVhZE5leHRCbG9jayhGWF9CT09MIGJSZXN0YXJ0ID0gRkFMU0UpIHsKKyAgICBpZiAoYlJlc3RhcnQpIHsKKyAgICAgIG1fblN0YXJ0ID0gMDsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpCi0gICAgewotICAgICAgICBkZWxldGUgdGhpczsKKyAgICBGWF9GSUxFU0laRSBuTGVuZ3RoID0gbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKKyAgICBtX25TdGFydCArPSAoRlhfRklMRVNJWkUpbV9kd1NpemU7CisgICAgaWYgKG1fblN0YXJ0ID49IG5MZW5ndGgpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fblN0YXJ0ICsgKEZYX0ZJTEVTSVpFKW1fZHdTaXplID49IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7CisgICAgbV9kd1NpemUgPSAoc2l6ZV90KUZYX01JTihGWF9YTUxEQVRBU1RSRUFNX0J1ZmZlclNpemUsIG5MZW5ndGggLSBtX25TdGFydCk7CisgICAgaWYgKCFtX3BCdWZmZXIpIHsKKyAgICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fZHdTaXplKTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0UG9zaXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fblN0YXJ0ICsgKEZYX0ZJTEVTSVpFKW1fZHdTaXplOwotICAgIH0KLSAgICB2aXJ0dWFsIHNpemVfdAkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWROZXh0QmxvY2soRlhfQk9PTCBiUmVzdGFydCA9IEZBTFNFKQotICAgIHsKLSAgICAgICAgaWYgKGJSZXN0YXJ0KSB7Ci0gICAgICAgICAgICBtX25TdGFydCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRklMRVNJWkUgbkxlbmd0aCA9IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7Ci0gICAgICAgIG1fblN0YXJ0ICs9IChGWF9GSUxFU0laRSltX2R3U2l6ZTsKLSAgICAgICAgaWYgKG1fblN0YXJ0ID49IG5MZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX2R3U2l6ZSA9IChzaXplX3QpRlhfTUlOKEZYX1hNTERBVEFTVFJFQU1fQnVmZmVyU2l6ZSwgbkxlbmd0aCAtIG1fblN0YXJ0KTsKLSAgICAgICAgaWYgKCFtX3BCdWZmZXIpIHsKLSAgICAgICAgICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fZHdTaXplKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhtX3BCdWZmZXIsIG1fblN0YXJ0LCBtX2R3U2l6ZSk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCoJCUdldEJsb2NrQnVmZmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoY29uc3QgdWludDhfdCopbV9wQnVmZmVyOwotICAgIH0KLSAgICB2aXJ0dWFsIHNpemVfdAkJCUdldEJsb2NrU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9kd1NpemU7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldEJsb2NrT2Zmc2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25TdGFydDsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgSUZYX0ZpbGVSZWFkCSptX3BGaWxlUmVhZDsKLSAgICB1aW50OF90KgkJbV9wQnVmZmVyOwotICAgIEZYX0ZJTEVTSVpFCQltX25TdGFydDsKLSAgICBzaXplX3QJCQltX2R3U2l6ZTsKKyAgICByZXR1cm4gbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhtX3BCdWZmZXIsIG1fblN0YXJ0LCBtX2R3U2l6ZSk7CisgIH0KKyAgdmlydHVhbCBjb25zdCB1aW50OF90KiBHZXRCbG9ja0J1ZmZlcigpIHsgcmV0dXJuIChjb25zdCB1aW50OF90KiltX3BCdWZmZXI7IH0KKyAgdmlydHVhbCBzaXplX3QgR2V0QmxvY2tTaXplKCkgeyByZXR1cm4gbV9kd1NpemU7IH0KKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRCbG9ja09mZnNldCgpIHsgcmV0dXJuIG1fblN0YXJ0OyB9CisKKyBwcm90ZWN0ZWQ6CisgIElGWF9GaWxlUmVhZCogbV9wRmlsZVJlYWQ7CisgIHVpbnQ4X3QqIG1fcEJ1ZmZlcjsKKyAgRlhfRklMRVNJWkUgbV9uU3RhcnQ7CisgIHNpemVfdCBtX2R3U2l6ZTsKIH07Ci1jbGFzcyBDWE1MX1BhcnNlcgotewotcHVibGljOgotICAgIH5DWE1MX1BhcnNlcigpOwotICAgIElGWF9CdWZmZXJSZWFkKgltX3BEYXRhQWNjOwotICAgIEZYX0JPT0wJCQltX2JPd25lZFN0cmVhbTsKLSAgICBGWF9GSUxFU0laRQkJbV9uT2Zmc2V0OwotICAgIEZYX0JPT0wJCQltX2JTYXZlU3BhY2VDaGFyczsKLSAgICBjb25zdCB1aW50OF90KgkJbV9wQnVmZmVyOwotICAgIHNpemVfdAkJCW1fZHdCdWZmZXJTaXplOwotICAgIEZYX0ZJTEVTSVpFCQltX25CdWZmZXJPZmZzZXQ7Ci0gICAgc2l6ZV90CQkJbV9kd0luZGV4OwotICAgIEZYX0JPT0wJCQlJbml0KHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKTsKLSAgICBGWF9CT09MCQkJSW5pdChJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCk7Ci0gICAgRlhfQk9PTAkJCUluaXQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXIpOwotICAgIEZYX0JPT0wJCQlJbml0KEZYX0JPT0wgYk93bmRlZFN0cmVhbSk7Ci0gICAgRlhfQk9PTAkJCVJlYWROZXh0QmxvY2soKTsKLSAgICBGWF9CT09MCQkJSXNFT0YoKTsKLSAgICBGWF9CT09MCQkJSGF2ZUF2YWlsRGF0YSgpOwotICAgIHZvaWQJCQlTa2lwV2hpdGVTcGFjZXMoKTsKLSAgICB2b2lkCQkJR2V0TmFtZShDRlhfQnl0ZVN0cmluZyYgc3BhY2UsIENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKLSAgICB2b2lkCQkJR2V0QXR0clZhbHVlKENGWF9XaWRlU3RyaW5nICZ2YWx1ZSk7Ci0gICAgRlhfRFdPUkQJCUdldENoYXJSZWYoKTsKLSAgICB2b2lkCQkJR2V0VGFnTmFtZShDRlhfQnl0ZVN0cmluZyAmc3BhY2UsIENGWF9CeXRlU3RyaW5nICZuYW1lLCBGWF9CT09MICZiRW5kVGFnLCBGWF9CT09MIGJTdGFydFRhZyA9IEZBTFNFKTsKLSAgICB2b2lkCQkJU2tpcExpdGVyYWxzKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKLSAgICBDWE1MX0VsZW1lbnQqCVBhcnNlRWxlbWVudChDWE1MX0VsZW1lbnQqIHBQYXJlbnQsIEZYX0JPT0wgYlN0YXJ0VGFnID0gRkFMU0UpOwotICAgIHZvaWQJCQlJbnNlcnRDb250ZW50U2VnbWVudChGWF9CT09MIGJDREFUQSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50LCBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KTsKLSAgICB2b2lkCQkJSW5zZXJ0Q0RBVEFTZWdtZW50KENGWF9VVEY4RGVjb2RlciYgZGVjb2RlciwgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCk7CitjbGFzcyBDWE1MX1BhcnNlciB7CisgcHVibGljOgorICB+Q1hNTF9QYXJzZXIoKTsKKyAgSUZYX0J1ZmZlclJlYWQqIG1fcERhdGFBY2M7CisgIEZYX0JPT0wgbV9iT3duZWRTdHJlYW07CisgIEZYX0ZJTEVTSVpFIG1fbk9mZnNldDsKKyAgRlhfQk9PTCBtX2JTYXZlU3BhY2VDaGFyczsKKyAgY29uc3QgdWludDhfdCogbV9wQnVmZmVyOworICBzaXplX3QgbV9kd0J1ZmZlclNpemU7CisgIEZYX0ZJTEVTSVpFIG1fbkJ1ZmZlck9mZnNldDsKKyAgc2l6ZV90IG1fZHdJbmRleDsKKyAgRlhfQk9PTCBJbml0KHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKTsKKyAgRlhfQk9PTCBJbml0KElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKTsKKyAgRlhfQk9PTCBJbml0KElGWF9CdWZmZXJSZWFkKiBwQnVmZmVyKTsKKyAgRlhfQk9PTCBJbml0KEZYX0JPT0wgYk93bmRlZFN0cmVhbSk7CisgIEZYX0JPT0wgUmVhZE5leHRCbG9jaygpOworICBGWF9CT09MIElzRU9GKCk7CisgIEZYX0JPT0wgSGF2ZUF2YWlsRGF0YSgpOworICB2b2lkIFNraXBXaGl0ZVNwYWNlcygpOworICB2b2lkIEdldE5hbWUoQ0ZYX0J5dGVTdHJpbmcmIHNwYWNlLCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CisgIHZvaWQgR2V0QXR0clZhbHVlKENGWF9XaWRlU3RyaW5nJiB2YWx1ZSk7CisgIEZYX0RXT1JEIEdldENoYXJSZWYoKTsKKyAgdm9pZCBHZXRUYWdOYW1lKENGWF9CeXRlU3RyaW5nJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVuZFRhZywKKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YXJ0VGFnID0gRkFMU0UpOworICB2b2lkIFNraXBMaXRlcmFscyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CisgIENYTUxfRWxlbWVudCogUGFyc2VFbGVtZW50KENYTUxfRWxlbWVudCogcFBhcmVudCwgRlhfQk9PTCBiU3RhcnRUYWcgPSBGQUxTRSk7CisgIHZvaWQgSW5zZXJ0Q29udGVudFNlZ21lbnQoRlhfQk9PTCBiQ0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYTUxfRWxlbWVudCogcEVsZW1lbnQpOworICB2b2lkIEluc2VydENEQVRBU2VnbWVudChDRlhfVVRGOERlY29kZXImIGRlY29kZXIsIENYTUxfRWxlbWVudCogcEVsZW1lbnQpOwogfTsKLXZvaWQgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRnVsbE5hbWUsIENGWF9CeXRlU3RyaW5nQyAmYnNTcGFjZSwgQ0ZYX0J5dGVTdHJpbmdDICZic05hbWUpOwordm9pZCBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGdWxsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MmIGJzU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDJiBic05hbWUpOwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZYQ1JUX1hNTF9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhfYWdnX2RyaXZlci5oIGIvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meF9hZ2dfZHJpdmVyLmgKaW5kZXggMjliNTZjNy4uMjk1NDUyNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meF9hZ2dfZHJpdmVyLmgKKysrIGIvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meF9hZ2dfZHJpdmVyLmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlhfQUdHX0RSSVZFUl9IXwpAQCAtMTEsMTE1ICsxMSwxNDYgQEAKICNpbmNsdWRlICIuLi8uLi8uLi8uLi8uLi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcGF0aF9zdG9yYWdlLmgiCiAjaW5jbHVkZSAiLi4vLi4vLi4vLi4vLi4vdGhpcmRfcGFydHkvYWdnMjMvYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuaCIKIAotY2xhc3MgQ0FnZ19QYXRoRGF0YSAKLXsKLXB1YmxpYzoKLSAgICBDQWdnX1BhdGhEYXRhKCkge30KLSAgICB+Q0FnZ19QYXRoRGF0YSgpIHt9Ci0gICAgRlhfTkFNRVNQQUNFX0RFQ0xBUkUoYWdnLCBwYXRoX3N0b3JhZ2UpCW1fUGF0aERhdGE7Ci0gICAgdm9pZAkJCUJ1aWxkUGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UpOworY2xhc3MgQ0FnZ19QYXRoRGF0YSB7CisgcHVibGljOgorICBDQWdnX1BhdGhEYXRhKCkge30KKyAgfkNBZ2dfUGF0aERhdGEoKSB7fQorICBGWF9OQU1FU1BBQ0VfREVDTEFSRShhZ2csIHBhdGhfc3RvcmFnZSkgbV9QYXRoRGF0YTsKKyAgdm9pZCBCdWlsZFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlKTsKIH07Ci1jbGFzcyBDRlhfQWdnRGV2aWNlRHJpdmVyIDogcHVibGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIKLXsKLXB1YmxpYzoKLSAgICBDRlhfQWdnRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCk7Ci0gICAgdmlydHVhbCB+Q0ZYX0FnZ0RldmljZURyaXZlcigpOwotICAgIHZvaWQJCQkJSW5pdFBsYXRmb3JtKCk7Ci0gICAgdm9pZAkJCQlEZXN0cm95UGxhdGZvcm0oKTsKK2NsYXNzIENGWF9BZ2dEZXZpY2VEcml2ZXIgOiBwdWJsaWMgSUZYX1JlbmRlckRldmljZURyaXZlciB7CisgcHVibGljOgorICBDRlhfQWdnRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZGl0aGVyX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0KTsKKyAgdmlydHVhbCB+Q0ZYX0FnZ0RldmljZURyaXZlcigpOworICB2b2lkIEluaXRQbGF0Zm9ybSgpOworICB2b2lkIERlc3Ryb3lQbGF0Zm9ybSgpOwogCisgIHZpcnR1YWwgaW50IEdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOwogCi0gICAgdmlydHVhbCBpbnQJCQlHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKTsKKyAgdmlydHVhbCB2b2lkIFNhdmVTdGF0ZSgpOworICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCk7CiAKKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlKTsKIAotICAgIHZpcnR1YWwgdm9pZAkJU2F2ZVN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkCQlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKTsKKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKTsKIAorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICB2aXJ0dWFsIEZYX0JPT0wgU2V0UGl4ZWwoaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKIAorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgdmlydHVhbCBGWF9CT09MIERyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICB2aXJ0dWFsIEZYX0JPT0wgR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpOworICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogR2V0QmFja0Ryb3AoKSB7IHJldHVybiBtX3BPcmlEZXZpY2U7IH0KKworICB2aXJ0dWFsIEZYX0JPT0wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKKyAgdmlydHVhbCBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKTsKKworICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgdmlydHVhbCB2b2lkIENhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpOworCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKKyAgdmlydHVhbCBGWF9CT09MIFJlbmRlclJhc3Rlcml6ZXIoCisgICAgICBGWF9OQU1FU1BBQ0VfREVDTEFSRShhZ2csIHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEpICYgcmFzdGVyaXplciwKKyAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgRlhfQk9PTCBiRnVsbENvdmVyLAorICAgICAgRlhfQk9PTCBiR3JvdXBLbm9ja291dCwKKyAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7CisgIHZvaWQgU2V0Q2xpcE1hc2soRlhfTkFNRVNQQUNFX0RFQ0xBUkUoYWdnLCByYXN0ZXJpemVyX3NjYW5saW5lX2FhKSAmCisgICAgICAgICAgICAgICAgICAgcmFzdGVyaXplcik7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKKyAgdmlydHVhbCB1aW50OF90KiBHZXRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX3BCaXRtYXAtPkdldEJ1ZmZlcigpOyB9CisgIHZpcnR1YWwgaW50IEdldERyaXZlclR5cGUoKSB7IHJldHVybiAxOyB9CiAKLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOwotCi0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgRlhfQk9PTCBiREVkZ2UgPSBGQUxTRSk7Ci0gICAgdmlydHVhbCBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9yaURldmljZTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgdmlydHVhbCB2b2lkCQlDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKTsKLQotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVuZGVyUmFzdGVyaXplcihGWF9OQU1FU1BBQ0VfREVDTEFSRShhZ2csIHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEpJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0KLSAgICB2b2lkCQkJCVNldENsaXBNYXNrKEZYX05BTUVTUEFDRV9ERUNMQVJFKGFnZywgcmFzdGVyaXplcl9zY2FubGluZV9hYSkmIHJhc3Rlcml6ZXIpOwotCi0gICAgdmlydHVhbAl1aW50OF90KglHZXRCdWZmZXIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEJpdG1hcC0+R2V0QnVmZmVyKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50CQkJR2V0RHJpdmVyVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBDRlhfRElCaXRtYXAqCQltX3BCaXRtYXA7Ci0gICAgQ0ZYX0NsaXBSZ24qCQltX3BDbGlwUmduOwotICAgIENGWF9QdHJBcnJheQkJbV9TdGF0ZVN0YWNrOwotICAgIHZvaWQqCQkJCW1fcFBsYXRmb3JtR3JhcGhpY3M7Ci0gICAgdm9pZCoJCQkJbV9wUGxhdGZvcm1CaXRtYXA7Ci0gICAgdm9pZCoJCQkJbV9wRHdSZW5kZXJUYXJ0Z2V0OwotICAgIGludAkJCQkJbV9GaWxsRmxhZ3M7Ci0gICAgaW50CQkJCQltX0RpdGhlckJpdHM7Ci0gICAgRlhfQk9PTAkJCQltX2JSZ2JCeXRlT3JkZXI7Ci0gICAgQ0ZYX0RJQml0bWFwKiAgICAgICBtX3BPcmlEZXZpY2U7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICBtX2JHcm91cEtub2Nrb3V0OworICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKKyAgQ0ZYX0NsaXBSZ24qIG1fcENsaXBSZ247CisgIENGWF9QdHJBcnJheSBtX1N0YXRlU3RhY2s7CisgIHZvaWQqIG1fcFBsYXRmb3JtR3JhcGhpY3M7CisgIHZvaWQqIG1fcFBsYXRmb3JtQml0bWFwOworICB2b2lkKiBtX3BEd1JlbmRlclRhcnRnZXQ7CisgIGludCBtX0ZpbGxGbGFnczsKKyAgaW50IG1fRGl0aGVyQml0czsKKyAgRlhfQk9PTCBtX2JSZ2JCeXRlT3JkZXI7CisgIENGWF9ESUJpdG1hcCogbV9wT3JpRGV2aWNlOworICBGWF9CT09MIG1fYkdyb3VwS25vY2tvdXQ7CiB9OwogCiAjZW5kaWYgIC8vIEZYX0FHR19EUklWRVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meF9hZ2dfZHJpdmVyLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meF9hZ2dfZHJpdmVyLmNwcAppbmRleCA0YWZiNWI0Li42MTQ0N2JhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhfYWdnX2RyaXZlci5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4X2FnZ19kcml2ZXIuY3BwCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCkBAIC0xNywxMTE0ICsxNywxMjAwIEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vLi4vLi4vdGhpcmRfcGFydHkvYWdnMjMvYWdnX2NvbnZfc3Ryb2tlLmgiCiAjaW5jbHVkZSAiLi4vLi4vLi4vLi4vLi4vdGhpcmRfcGFydHkvYWdnMjMvYWdnX2NvbnZfZGFzaC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnhfYWdnX2RyaXZlci5oIgotdm9pZCBfSGFyZENsaXAoRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KQotewotICAgIGlmICh4ID4gNTAwMDApIHsKLSAgICAgICAgeCA9IDUwMDAwOwotICAgIH0KLSAgICBpZiAoeCA8IC01MDAwMCkgewotICAgICAgICB4ID0gLTUwMDAwOwotICAgIH0KLSAgICBpZiAoeSA+IDUwMDAwKSB7Ci0gICAgICAgIHkgPSA1MDAwMDsKLSAgICB9Ci0gICAgaWYgKHkgPCAtNTAwMDApIHsKLSAgICAgICAgeSA9IC01MDAwMDsKLSAgICB9Cit2b2lkIF9IYXJkQ2xpcChGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpIHsKKyAgaWYgKHggPiA1MDAwMCkgeworICAgIHggPSA1MDAwMDsKKyAgfQorICBpZiAoeCA8IC01MDAwMCkgeworICAgIHggPSAtNTAwMDA7CisgIH0KKyAgaWYgKHkgPiA1MDAwMCkgeworICAgIHkgPSA1MDAwMDsKKyAgfQorICBpZiAoeSA8IC01MDAwMCkgeworICAgIHkgPSAtNTAwMDA7CisgIH0KIH0KLXZvaWQgQ0FnZ19QYXRoRGF0YTo6QnVpbGRQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSkKLXsKLSAgICBpbnQgblBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOwotICAgIEZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUG9pbnRzOyBpICsrKSB7Ci0gICAgICAgIEZYX0ZMT0FUIHggPSBwUG9pbnRzW2ldLm1fUG9pbnRYLCB5ID0gcFBvaW50c1tpXS5tX1BvaW50WTsKLSAgICAgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgsIHkpOwotICAgICAgICB9Ci0gICAgICAgIF9IYXJkQ2xpcCh4LCB5KTsKLSAgICAgICAgaW50IHBvaW50X3R5cGUgPSBwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfVFlQRTsKLSAgICAgICAgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9NT1ZFVE8pIHsKLSAgICAgICAgICAgIG1fUGF0aERhdGEubW92ZV90byh4LCB5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfTElORVRPKSB7Ci0gICAgICAgICAgICBpZiAocFBvaW50c1tpIC0gMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPICYmIChpID09IG5Qb2ludHMgLSAxIHx8IHBQb2ludHNbaSArIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTykgJiYKLSAgICAgICAgICAgICAgICAgICAgcFBvaW50c1tpXS5tX1BvaW50WCA9PSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WCAmJiBwUG9pbnRzW2ldLm1fUG9pbnRZID09IHBQb2ludHNbaSAtIDFdLm1fUG9pbnRZKSB7Ci0gICAgICAgICAgICAgICAgeCArPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9QYXRoRGF0YS5saW5lX3RvKHgsIHkpOwotICAgICAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9CRVpJRVJUTykgewotICAgICAgICAgICAgRlhfRkxPQVQgeDAgPSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WCwgeTAgPSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHgyID0gcFBvaW50c1tpICsgMV0ubV9Qb2ludFgsIHkyID0gcFBvaW50c1tpICsgMV0ubV9Qb2ludFk7Ci0gICAgICAgICAgICBGWF9GTE9BVCB4MyA9IHBQb2ludHNbaSArIDJdLm1fUG9pbnRYLCB5MyA9IHBQb2ludHNbaSArIDJdLm1fUG9pbnRZOwotICAgICAgICAgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4MCwgeTApOwotICAgICAgICAgICAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeDIsIHkyKTsKLSAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgzLCB5Myk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZ2c6OmN1cnZlNCBjdXJ2ZSh4MCwgeTAsIHgsIHksIHgyLCB5MiwgeDMsIHkzKTsKLSAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgIG1fUGF0aERhdGEuYWRkX3BhdGhfY3VydmUoY3VydmUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKLSAgICAgICAgICAgIG1fUGF0aERhdGEuZW5kX3BvbHkoKTsKLSAgICAgICAgfQordm9pZCBDQWdnX1BhdGhEYXRhOjpCdWlsZFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSkgeworICBpbnQgblBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOworICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50cygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Qb2ludHM7IGkrKykgeworICAgIEZYX0ZMT0FUIHggPSBwUG9pbnRzW2ldLm1fUG9pbnRYLCB5ID0gcFBvaW50c1tpXS5tX1BvaW50WTsKKyAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeCwgeSk7CiAgICAgfQorICAgIF9IYXJkQ2xpcCh4LCB5KTsKKyAgICBpbnQgcG9pbnRfdHlwZSA9IHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFOworICAgIGlmIChwb2ludF90eXBlID09IEZYUFRfTU9WRVRPKSB7CisgICAgICBtX1BhdGhEYXRhLm1vdmVfdG8oeCwgeSk7CisgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfTElORVRPKSB7CisgICAgICBpZiAocFBvaW50c1tpIC0gMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPICYmCisgICAgICAgICAgKGkgPT0gblBvaW50cyAtIDEgfHwgcFBvaW50c1tpICsgMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSAmJgorICAgICAgICAgIHBQb2ludHNbaV0ubV9Qb2ludFggPT0gcFBvaW50c1tpIC0gMV0ubV9Qb2ludFggJiYKKyAgICAgICAgICBwUG9pbnRzW2ldLm1fUG9pbnRZID09IHBQb2ludHNbaSAtIDFdLm1fUG9pbnRZKSB7CisgICAgICAgIHggKz0gMTsKKyAgICAgIH0KKyAgICAgIG1fUGF0aERhdGEubGluZV90byh4LCB5KTsKKyAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9CRVpJRVJUTykgeworICAgICAgRlhfRkxPQVQgeDAgPSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WCwgeTAgPSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WTsKKyAgICAgIEZYX0ZMT0FUIHgyID0gcFBvaW50c1tpICsgMV0ubV9Qb2ludFgsIHkyID0gcFBvaW50c1tpICsgMV0ubV9Qb2ludFk7CisgICAgICBGWF9GTE9BVCB4MyA9IHBQb2ludHNbaSArIDJdLm1fUG9pbnRYLCB5MyA9IHBQb2ludHNbaSArIDJdLm1fUG9pbnRZOworICAgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeDAsIHkwKTsKKyAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4MiwgeTIpOworICAgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgzLCB5Myk7CisgICAgICB9CisgICAgICBhZ2c6OmN1cnZlNCBjdXJ2ZSh4MCwgeTAsIHgsIHksIHgyLCB5MiwgeDMsIHkzKTsKKyAgICAgIGkgKz0gMjsKKyAgICAgIG1fUGF0aERhdGEuYWRkX3BhdGhfY3VydmUoY3VydmUpOworICAgIH0KKyAgICBpZiAocFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSB7CisgICAgICBtX1BhdGhEYXRhLmVuZF9wb2x5KCk7CisgICAgfQorICB9CiB9Ci1uYW1lc3BhY2UgYWdnCi17Ci10ZW1wbGF0ZTxjbGFzcyBCYXNlUmVuZGVyZXI+IGNsYXNzIHJlbmRlcmVyX3NjYW5saW5lX2FhX29mZnNldAotewotcHVibGljOgotICAgIHR5cGVkZWYgQmFzZVJlbmRlcmVyIGJhc2VfcmVuX3R5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3Jlbl90eXBlOjpjb2xvcl90eXBlIGNvbG9yX3R5cGU7Ci0gICAgcmVuZGVyZXJfc2NhbmxpbmVfYWFfb2Zmc2V0KGJhc2VfcmVuX3R5cGUmIHJlbiwgdW5zaWduZWQgbGVmdCwgdW5zaWduZWQgdG9wKSA6Ci0gICAgICAgIG1fcmVuKCZyZW4pLCBtX2xlZnQobGVmdCksIG1fdG9wKHRvcCkKLSAgICB7fQotICAgIHZvaWQgY29sb3IoY29uc3QgY29sb3JfdHlwZSYgYykKLSAgICB7Ci0gICAgICAgIG1fY29sb3IgPSBjOworbmFtZXNwYWNlIGFnZyB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZVJlbmRlcmVyPgorY2xhc3MgcmVuZGVyZXJfc2NhbmxpbmVfYWFfb2Zmc2V0IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgQmFzZVJlbmRlcmVyIGJhc2VfcmVuX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV9yZW5fdHlwZTo6Y29sb3JfdHlwZSBjb2xvcl90eXBlOworICByZW5kZXJlcl9zY2FubGluZV9hYV9vZmZzZXQoYmFzZV9yZW5fdHlwZSYgcmVuLCB1bnNpZ25lZCBsZWZ0LCB1bnNpZ25lZCB0b3ApCisgICAgICA6IG1fcmVuKCZyZW4pLCBtX2xlZnQobGVmdCksIG1fdG9wKHRvcCkge30KKyAgdm9pZCBjb2xvcihjb25zdCBjb2xvcl90eXBlJiBjKSB7IG1fY29sb3IgPSBjOyB9CisgIGNvbnN0IGNvbG9yX3R5cGUmIGNvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9jb2xvcjsgfQorICB2b2lkIHByZXBhcmUodW5zaWduZWQpIHt9CisgIHRlbXBsYXRlIDxjbGFzcyBTY2FubGluZT4KKyAgdm9pZCByZW5kZXIoY29uc3QgU2NhbmxpbmUmIHNsKSB7CisgICAgaW50IHkgPSBzbC55KCk7CisgICAgdW5zaWduZWQgbnVtX3NwYW5zID0gc2wubnVtX3NwYW5zKCk7CisgICAgdHlwZW5hbWUgU2NhbmxpbmU6OmNvbnN0X2l0ZXJhdG9yIHNwYW4gPSBzbC5iZWdpbigpOworICAgIGZvciAoOzspIHsKKyAgICAgIGludCB4ID0gc3Bhbi0+eDsKKyAgICAgIGlmIChzcGFuLT5sZW4gPiAwKSB7CisgICAgICAgIG1fcmVuLT5ibGVuZF9zb2xpZF9oc3Bhbih4IC0gbV9sZWZ0LCB5IC0gbV90b3AsICh1bnNpZ25lZClzcGFuLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbG9yLCBzcGFuLT5jb3ZlcnMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9yZW4tPmJsZW5kX2hsaW5lKHggLSBtX2xlZnQsIHkgLSBtX3RvcCwgKHVuc2lnbmVkKSh4IC0gc3Bhbi0+bGVuIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbG9yLCAqKHNwYW4tPmNvdmVycykpOworICAgICAgfQorICAgICAgaWYgKC0tbnVtX3NwYW5zID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK3NwYW47CiAgICAgfQotICAgIGNvbnN0IGNvbG9yX3R5cGUmIGNvbG9yKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NvbG9yOwotICAgIH0KLSAgICB2b2lkIHByZXBhcmUodW5zaWduZWQpIHt9Ci0gICAgdGVtcGxhdGU8Y2xhc3MgU2NhbmxpbmU+IHZvaWQgcmVuZGVyKGNvbnN0IFNjYW5saW5lJiBzbCkKLSAgICB7Ci0gICAgICAgIGludCB5ID0gc2wueSgpOwotICAgICAgICB1bnNpZ25lZCBudW1fc3BhbnMgPSBzbC5udW1fc3BhbnMoKTsKLSAgICAgICAgdHlwZW5hbWUgU2NhbmxpbmU6OmNvbnN0X2l0ZXJhdG9yIHNwYW4gPSBzbC5iZWdpbigpOwotICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgIGludCB4ID0gc3Bhbi0+eDsKLSAgICAgICAgICAgIGlmKHNwYW4tPmxlbiA+IDApIHsKLSAgICAgICAgICAgICAgICBtX3Jlbi0+YmxlbmRfc29saWRfaHNwYW4oeCAtIG1fbGVmdCwgeSAtIG1fdG9wLCAodW5zaWduZWQpc3Bhbi0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLT5jb3ZlcnMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX3Jlbi0+YmxlbmRfaGxpbmUoeCAtIG1fbGVmdCwgeSAtIG1fdG9wLCAodW5zaWduZWQpKHggLSBzcGFuLT5sZW4gLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzcGFuLT5jb3ZlcnMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKC0tbnVtX3NwYW5zID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrc3BhbjsKLSAgICAgICAgfQotICAgIH0KLXByaXZhdGU6Ci0gICAgYmFzZV9yZW5fdHlwZSogbV9yZW47Ci0gICAgY29sb3JfdHlwZSBtX2NvbG9yOwotICAgIHVuc2lnbmVkIG1fbGVmdCwgbV90b3A7CisgIH0KKworIHByaXZhdGU6CisgIGJhc2VfcmVuX3R5cGUqIG1fcmVuOworICBjb2xvcl90eXBlIG1fY29sb3I7CisgIHVuc2lnbmVkIG1fbGVmdCwgbV90b3A7CiB9OwogfQotc3RhdGljIHZvaWQgUmFzdGVyaXplU3Ryb2tlKGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwgYWdnOjpwYXRoX3N0b3JhZ2UmIHBhdGhfZGF0YSwKK3N0YXRpYyB2b2lkIFJhc3Rlcml6ZVN0cm9rZShhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdnOjpwYXRoX3N0b3JhZ2UmIHBhdGhfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLCBGWF9GTE9BVCBzY2FsZSA9IDEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tlQWRqdXN0ID0gRkFMU0UsIEZYX0JPT0wgYlRleHRNb2RlID0gRkFMU0UpCi17Ci0gICAgYWdnOjpsaW5lX2NhcF9lIGNhcDsKLSAgICBzd2l0Y2ggKHBHcmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBSb3VuZDoKLSAgICAgICAgICAgIGNhcCA9IGFnZzo6cm91bmRfY2FwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwU3F1YXJlOgotICAgICAgICAgICAgY2FwID0gYWdnOjpzcXVhcmVfY2FwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBjYXAgPSBhZ2c6OmJ1dHRfY2FwOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzY2FsZSA9IDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tlQWRqdXN0ID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVGV4dE1vZGUgPSBGQUxTRSkgeworICBhZ2c6OmxpbmVfY2FwX2UgY2FwOworICBzd2l0Y2ggKHBHcmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFJvdW5kOgorICAgICAgY2FwID0gYWdnOjpyb3VuZF9jYXA7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFNxdWFyZToKKyAgICAgIGNhcCA9IGFnZzo6c3F1YXJlX2NhcDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjYXAgPSBhZ2c6OmJ1dHRfY2FwOworICAgICAgYnJlYWs7CisgIH0KKyAgYWdnOjpsaW5lX2pvaW5fZSBqb2luOworICBzd2l0Y2ggKHBHcmFwaFN0YXRlLT5tX0xpbmVKb2luKSB7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luUm91bmQ6CisgICAgICBqb2luID0gYWdnOjpyb3VuZF9qb2luOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luQmV2ZWw6CisgICAgICBqb2luID0gYWdnOjpiZXZlbF9qb2luOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpvaW4gPSBhZ2c6Om1pdGVyX2pvaW5fcmV2ZXJ0OworICAgICAgYnJlYWs7CisgIH0KKyAgRlhfRkxPQVQgd2lkdGggPSBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGggKiBzY2FsZTsKKyAgRlhfRkxPQVQgdW5pdCA9IDEuZjsKKyAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgdW5pdCA9IEZYU1lTX0RpdigKKyAgICAgICAgMS4wZiwgKHBPYmplY3QyRGV2aWNlLT5HZXRYVW5pdCgpICsgcE9iamVjdDJEZXZpY2UtPkdldFlVbml0KCkpIC8gMik7CisgIH0KKyAgaWYgKHdpZHRoIDwgdW5pdCkgeworICAgIHdpZHRoID0gdW5pdDsKKyAgfQorICBpZiAocEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5ID09IE5VTEwpIHsKKyAgICBhZ2c6OmNvbnZfc3Ryb2tlPGFnZzo6cGF0aF9zdG9yYWdlPiBzdHJva2UocGF0aF9kYXRhKTsKKyAgICBzdHJva2UubGluZV9qb2luKGpvaW4pOworICAgIHN0cm9rZS5saW5lX2NhcChjYXApOworICAgIHN0cm9rZS5taXRlcl9saW1pdChwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKKyAgICBzdHJva2Uud2lkdGgod2lkdGgpOworICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGhfdHJhbnNmb3JtZWQoc3Ryb2tlLCBwT2JqZWN0MkRldmljZSk7CisgIH0gZWxzZSB7CisgICAgdHlwZWRlZiBhZ2c6OmNvbnZfZGFzaDxhZ2c6OnBhdGhfc3RvcmFnZT4gZGFzaF9jb252ZXJ0ZXI7CisgICAgZGFzaF9jb252ZXJ0ZXIgZGFzaChwYXRoX2RhdGEpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCArIDEpIC8gMjsgaSsrKSB7CisgICAgICBGWF9GTE9BVCBvbiA9IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpICogMl07CisgICAgICBpZiAob24gPD0gMC4wMDAwMDFmKSB7CisgICAgICAgIG9uID0gMS4wZiAvIDEwOworICAgICAgfQorICAgICAgRlhfRkxPQVQgb2ZmID0gaSAqIDIgKyAxID09IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgID8gb24KKyAgICAgICAgICAgICAgICAgICAgICAgICA6IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpICogMiArIDFdOworICAgICAgaWYgKG9mZiA8IDApIHsKKyAgICAgICAgb2ZmID0gMDsKKyAgICAgIH0KKyAgICAgIGRhc2guYWRkX2Rhc2gob24gKiBzY2FsZSwgb2ZmICogc2NhbGUpOwogICAgIH0KLSAgICBhZ2c6OmxpbmVfam9pbl9lIGpvaW47Ci0gICAgc3dpdGNoIChwR3JhcGhTdGF0ZS0+bV9MaW5lSm9pbikgewotICAgICAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5Sb3VuZDoKLSAgICAgICAgICAgIGpvaW4gPSBhZ2c6OnJvdW5kX2pvaW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luQmV2ZWw6Ci0gICAgICAgICAgICBqb2luID0gYWdnOjpiZXZlbF9qb2luOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqb2luID0gYWdnOjptaXRlcl9qb2luX3JldmVydDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBGWF9GTE9BVCB3aWR0aCA9IHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCAqIHNjYWxlOwotICAgIEZYX0ZMT0FUIHVuaXQgPSAxLmY7Ci0gICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgIHVuaXQgPSBGWFNZU19EaXYoMS4wZiwgKHBPYmplY3QyRGV2aWNlLT5HZXRYVW5pdCgpICsgcE9iamVjdDJEZXZpY2UtPkdldFlVbml0KCkpIC8gMik7Ci0gICAgfQotICAgIGlmICh3aWR0aCA8IHVuaXQpIHsKLSAgICAgICAgd2lkdGggPSB1bml0OwotICAgIH0KLSAgICBpZiAocEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgYWdnOjpjb252X3N0cm9rZTxhZ2c6OnBhdGhfc3RvcmFnZT4gc3Ryb2tlKHBhdGhfZGF0YSk7Ci0gICAgICAgIHN0cm9rZS5saW5lX2pvaW4oam9pbik7Ci0gICAgICAgIHN0cm9rZS5saW5lX2NhcChjYXApOwotICAgICAgICBzdHJva2UubWl0ZXJfbGltaXQocEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7Ci0gICAgICAgIHN0cm9rZS53aWR0aCh3aWR0aCk7Ci0gICAgICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGhfdHJhbnNmb3JtZWQoc3Ryb2tlLCBwT2JqZWN0MkRldmljZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdHlwZWRlZiBhZ2c6OmNvbnZfZGFzaDxhZ2c6OnBhdGhfc3RvcmFnZT4gZGFzaF9jb252ZXJ0ZXI7Ci0gICAgICAgIGRhc2hfY29udmVydGVyIGRhc2gocGF0aF9kYXRhKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAocEdyYXBoU3RhdGUtPm1fRGFzaENvdW50ICsgMSkgLyAyOyBpICsrKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCBvbiA9IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpICogMl07Ci0gICAgICAgICAgICBpZiAob24gPD0gMC4wMDAwMDFmKSB7Ci0gICAgICAgICAgICAgICAgb24gPSAxLjBmIC8gMTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCBvZmYgPSBpICogMiArIDEgPT0gcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50ID8gb24gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2kgKiAyICsgMV07Ci0gICAgICAgICAgICBpZiAob2ZmIDwgMCkgewotICAgICAgICAgICAgICAgIG9mZiA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYXNoLmFkZF9kYXNoKG9uICogc2NhbGUsIG9mZiAqIHNjYWxlKTsKLSAgICAgICAgfQotICAgICAgICBkYXNoLmRhc2hfc3RhcnQocEdyYXBoU3RhdGUtPm1fRGFzaFBoYXNlICogc2NhbGUpOwotICAgICAgICB0eXBlZGVmIGFnZzo6Y29udl9zdHJva2U8ZGFzaF9jb252ZXJ0ZXI+IGRhc2hfc3Ryb2tlOwotICAgICAgICBkYXNoX3N0cm9rZSBzdHJva2UoZGFzaCk7Ci0gICAgICAgIHN0cm9rZS5saW5lX2pvaW4oam9pbik7Ci0gICAgICAgIHN0cm9rZS5saW5lX2NhcChjYXApOwotICAgICAgICBzdHJva2UubWl0ZXJfbGltaXQocEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7Ci0gICAgICAgIHN0cm9rZS53aWR0aCh3aWR0aCk7Ci0gICAgICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGhfdHJhbnNmb3JtZWQoc3Ryb2tlLCBwT2JqZWN0MkRldmljZSk7Ci0gICAgfQorICAgIGRhc2guZGFzaF9zdGFydChwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2UgKiBzY2FsZSk7CisgICAgdHlwZWRlZiBhZ2c6OmNvbnZfc3Ryb2tlPGRhc2hfY29udmVydGVyPiBkYXNoX3N0cm9rZTsKKyAgICBkYXNoX3N0cm9rZSBzdHJva2UoZGFzaCk7CisgICAgc3Ryb2tlLmxpbmVfam9pbihqb2luKTsKKyAgICBzdHJva2UubGluZV9jYXAoY2FwKTsKKyAgICBzdHJva2UubWl0ZXJfbGltaXQocEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7CisgICAgc3Ryb2tlLndpZHRoKHdpZHRoKTsKKyAgICByYXN0ZXJpemVyLmFkZF9wYXRoX3RyYW5zZm9ybWVkKHN0cm9rZSwgcE9iamVjdDJEZXZpY2UpOworICB9CiB9Ci1JRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOjpDcmVhdGVGeGdlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpCi17Ci0gICAgcmV0dXJuIEZYX05FVyBDRlhfQWdnRGV2aWNlRHJpdmVyKHBCaXRtYXAsIDAsIGJSZ2JCeXRlT3JkZXIsIHBPcmlEZXZpY2UsIGJHcm91cEtub2Nrb3V0KTsKK0lGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIElGWF9SZW5kZXJEZXZpY2VEcml2ZXI6OkNyZWF0ZUZ4Z2VEcml2ZXIoCisgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKKyAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsCisgICAgRlhfQk9PTCBiR3JvdXBLbm9ja291dCkgeworICByZXR1cm4gRlhfTkVXIENGWF9BZ2dEZXZpY2VEcml2ZXIocEJpdG1hcCwgMCwgYlJnYkJ5dGVPcmRlciwgcE9yaURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJHcm91cEtub2Nrb3V0KTsKIH0KLUNGWF9BZ2dEZXZpY2VEcml2ZXI6OkNGWF9BZ2dEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQotewotICAgIG1fcEJpdG1hcCA9IHBCaXRtYXA7Ci0gICAgbV9EaXRoZXJCaXRzID0gZGl0aGVyX2JpdHM7Ci0gICAgbV9wQ2xpcFJnbiA9IE5VTEw7Ci0gICAgbV9wUGxhdGZvcm1CaXRtYXAgPSBOVUxMOwotICAgIG1fcFBsYXRmb3JtR3JhcGhpY3MgPSBOVUxMOwotICAgIG1fcER3UmVuZGVyVGFydGdldCA9IE5VTEw7Ci0gICAgbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKLSAgICBtX3BPcmlEZXZpY2UgPSBwT3JpRGV2aWNlOwotICAgIG1fYkdyb3VwS25vY2tvdXQgPSBiR3JvdXBLbm9ja291dDsKLSAgICBtX0ZpbGxGbGFncyA9IDA7Ci0gICAgSW5pdFBsYXRmb3JtKCk7CitDRlhfQWdnRGV2aWNlRHJpdmVyOjpDRlhfQWdnRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpdGhlcl9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiR3JvdXBLbm9ja291dCkgeworICBtX3BCaXRtYXAgPSBwQml0bWFwOworICBtX0RpdGhlckJpdHMgPSBkaXRoZXJfYml0czsKKyAgbV9wQ2xpcFJnbiA9IE5VTEw7CisgIG1fcFBsYXRmb3JtQml0bWFwID0gTlVMTDsKKyAgbV9wUGxhdGZvcm1HcmFwaGljcyA9IE5VTEw7CisgIG1fcER3UmVuZGVyVGFydGdldCA9IE5VTEw7CisgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7CisgIG1fcE9yaURldmljZSA9IHBPcmlEZXZpY2U7CisgIG1fYkdyb3VwS25vY2tvdXQgPSBiR3JvdXBLbm9ja291dDsKKyAgbV9GaWxsRmxhZ3MgPSAwOworICBJbml0UGxhdGZvcm0oKTsKIH0KLUNGWF9BZ2dEZXZpY2VEcml2ZXI6On5DRlhfQWdnRGV2aWNlRHJpdmVyKCkKLXsKLSAgICBkZWxldGUgbV9wQ2xpcFJnbjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fU3RhdGVTdGFjay5HZXRTaXplKCk7IGkgKyspCi0gICAgICAgIGRlbGV0ZSAoQ0ZYX0NsaXBSZ24qKW1fU3RhdGVTdGFja1tpXTsKLSAgICBEZXN0cm95UGxhdGZvcm0oKTsKK0NGWF9BZ2dEZXZpY2VEcml2ZXI6On5DRlhfQWdnRGV2aWNlRHJpdmVyKCkgeworICBkZWxldGUgbV9wQ2xpcFJnbjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1N0YXRlU3RhY2suR2V0U2l6ZSgpOyBpKyspCisgICAgZGVsZXRlIChDRlhfQ2xpcFJnbiopbV9TdGF0ZVN0YWNrW2ldOworICBEZXN0cm95UGxhdGZvcm0oKTsKIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyAgIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLXZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6SW5pdFBsYXRmb3JtKCkKLXsKLX0KLXZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RGVzdHJveVBsYXRmb3JtKCkKLXsKLX0KLUZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCi0gICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIHJldHVybiBGQUxTRTsKKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX0FQUExFXwordm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpJbml0UGxhdGZvcm0oKSB7fQordm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEZXN0cm95UGxhdGZvcm0oKSB7fQorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dCgKKyAgICBpbnQgbkNoYXJzLAorICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICBDRlhfRm9udCogcEZvbnQsCisgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICBGWF9EV09SRCBjb2xvciwKKyAgICBpbnQgYWxwaGFfZmxhZywKKyAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgotaW50IENGWF9BZ2dEZXZpY2VEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpCi17Ci0gICAgc3dpdGNoIChjYXBzX2lkKSB7Ci0gICAgICAgIGNhc2UgRlhEQ19ERVZJQ0VfQ0xBU1M6Ci0gICAgICAgICAgICByZXR1cm4gRlhEQ19ESVNQTEFZOwotICAgICAgICBjYXNlIEZYRENfUElYRUxfV0lEVEg6Ci0gICAgICAgICAgICByZXR1cm4gbV9wQml0bWFwLT5HZXRXaWR0aCgpOwotICAgICAgICBjYXNlIEZYRENfUElYRUxfSEVJR0hUOgotICAgICAgICAgICAgcmV0dXJuIG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCk7Ci0gICAgICAgIGNhc2UgRlhEQ19CSVRTX1BJWEVMOgotICAgICAgICAgICAgcmV0dXJuIG1fcEJpdG1hcC0+R2V0QlBQKCk7Ci0gICAgICAgIGNhc2UgRlhEQ19IT1JaX1NJWkU6Ci0gICAgICAgIGNhc2UgRlhEQ19WRVJUX1NJWkU6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgY2FzZSBGWERDX1JFTkRFUl9DQVBTOiB7Ci0gICAgICAgICAgICAgICAgaW50IGZsYWdzID0gRlhSQ19HRVRfQklUUyB8IEZYUkNfQUxQSEFfUEFUSCB8IEZYUkNfQUxQSEFfSU1BR0UgfCBGWFJDX0JMRU5EX01PREUgfCBGWFJDX1NPRlRfQ0xJUDsKLSAgICAgICAgICAgICAgICBpZiAobV9wQml0bWFwLT5IYXNBbHBoYSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZYUkNfQUxQSEFfT1VUUFVUOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9wQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZYUkNfQklUTUFTS19PVVRQVVQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGWFJDX0JZVEVNQVNLX09VVFBVVDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9wQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZYUkNfQ01ZS19PVVRQVVQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERDX0RJVEhFUl9CSVRTOgotICAgICAgICAgICAgcmV0dXJuIG1fRGl0aGVyQml0czsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci12b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNhdmVTdGF0ZSgpCi17Ci0gICAgdm9pZCogcENsaXAgPSBOVUxMOwotICAgIGlmIChtX3BDbGlwUmduKSB7Ci0gICAgICAgIHBDbGlwID0gRlhfTkVXIENGWF9DbGlwUmduKCptX3BDbGlwUmduKTsKLSAgICAgICAgaWYgKCFwQ2xpcCkgewotICAgICAgICAgICAgcmV0dXJuOworaW50IENGWF9BZ2dEZXZpY2VEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpIHsKKyAgc3dpdGNoIChjYXBzX2lkKSB7CisgICAgY2FzZSBGWERDX0RFVklDRV9DTEFTUzoKKyAgICAgIHJldHVybiBGWERDX0RJU1BMQVk7CisgICAgY2FzZSBGWERDX1BJWEVMX1dJRFRIOgorICAgICAgcmV0dXJuIG1fcEJpdG1hcC0+R2V0V2lkdGgoKTsKKyAgICBjYXNlIEZYRENfUElYRUxfSEVJR0hUOgorICAgICAgcmV0dXJuIG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgICAgY2FzZSBGWERDX0JJVFNfUElYRUw6CisgICAgICByZXR1cm4gbV9wQml0bWFwLT5HZXRCUFAoKTsKKyAgICBjYXNlIEZYRENfSE9SWl9TSVpFOgorICAgIGNhc2UgRlhEQ19WRVJUX1NJWkU6CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEZYRENfUkVOREVSX0NBUFM6IHsKKyAgICAgIGludCBmbGFncyA9IEZYUkNfR0VUX0JJVFMgfCBGWFJDX0FMUEhBX1BBVEggfCBGWFJDX0FMUEhBX0lNQUdFIHwKKyAgICAgICAgICAgICAgICAgIEZYUkNfQkxFTkRfTU9ERSB8IEZYUkNfU09GVF9DTElQOworICAgICAgaWYgKG1fcEJpdG1hcC0+SGFzQWxwaGEoKSkgeworICAgICAgICBmbGFncyB8PSBGWFJDX0FMUEhBX09VVFBVVDsKKyAgICAgIH0gZWxzZSBpZiAobV9wQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICAgIGlmIChtX3BCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKKyAgICAgICAgICBmbGFncyB8PSBGWFJDX0JJVE1BU0tfT1VUUFVUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZsYWdzIHw9IEZYUkNfQllURU1BU0tfT1VUUFVUOwogICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobV9wQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICAgIGZsYWdzIHw9IEZYUkNfQ01ZS19PVVRQVVQ7CisgICAgICB9CisgICAgICByZXR1cm4gZmxhZ3M7CiAgICAgfQotICAgIG1fU3RhdGVTdGFjay5BZGQocENsaXApOworICAgIGNhc2UgRlhEQ19ESVRIRVJfQklUUzoKKyAgICAgIHJldHVybiBtX0RpdGhlckJpdHM7CisgIH0KKyAgcmV0dXJuIDA7CiB9Ci12b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpCi17Ci0gICAgaWYgKG1fU3RhdGVTdGFjay5HZXRTaXplKCkgPT0gMCkgewotICAgICAgICBkZWxldGUgbV9wQ2xpcFJnbjsKLSAgICAgICAgbV9wQ2xpcFJnbiA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2F2ZVN0YXRlKCkgeworICB2b2lkKiBwQ2xpcCA9IE5VTEw7CisgIGlmIChtX3BDbGlwUmduKSB7CisgICAgcENsaXAgPSBGWF9ORVcgQ0ZYX0NsaXBSZ24oKm1fcENsaXBSZ24pOworICAgIGlmICghcENsaXApIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQ0ZYX0NsaXBSZ24qIHBTYXZlZENsaXAgPSAoQ0ZYX0NsaXBSZ24qKW1fU3RhdGVTdGFja1ttX1N0YXRlU3RhY2suR2V0U2l6ZSgpIC0gMV07CisgIH0KKyAgbV9TdGF0ZVN0YWNrLkFkZChwQ2xpcCk7Cit9Cit2b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpIHsKKyAgaWYgKG1fU3RhdGVTdGFjay5HZXRTaXplKCkgPT0gMCkgewogICAgIGRlbGV0ZSBtX3BDbGlwUmduOwogICAgIG1fcENsaXBSZ24gPSBOVUxMOwotICAgIGlmIChiS2VlcFNhdmVkKSB7Ci0gICAgICAgIGlmIChwU2F2ZWRDbGlwKSB7Ci0gICAgICAgICAgICBtX3BDbGlwUmduID0gRlhfTkVXIENGWF9DbGlwUmduKCpwU2F2ZWRDbGlwKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fU3RhdGVTdGFjay5SZW1vdmVBdChtX1N0YXRlU3RhY2suR2V0U2l6ZSgpIC0gMSk7Ci0gICAgICAgIG1fcENsaXBSZ24gPSBwU2F2ZWRDbGlwOworICAgIHJldHVybjsKKyAgfQorICBDRlhfQ2xpcFJnbiogcFNhdmVkQ2xpcCA9CisgICAgICAoQ0ZYX0NsaXBSZ24qKW1fU3RhdGVTdGFja1ttX1N0YXRlU3RhY2suR2V0U2l6ZSgpIC0gMV07CisgIGRlbGV0ZSBtX3BDbGlwUmduOworICBtX3BDbGlwUmduID0gTlVMTDsKKyAgaWYgKGJLZWVwU2F2ZWQpIHsKKyAgICBpZiAocFNhdmVkQ2xpcCkgeworICAgICAgbV9wQ2xpcFJnbiA9IEZYX05FVyBDRlhfQ2xpcFJnbigqcFNhdmVkQ2xpcCk7CiAgICAgfQorICB9IGVsc2UgeworICAgIG1fU3RhdGVTdGFjay5SZW1vdmVBdChtX1N0YXRlU3RhY2suR2V0U2l6ZSgpIC0gMSk7CisgICAgbV9wQ2xpcFJnbiA9IHBTYXZlZENsaXA7CisgIH0KIH0KLXZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0Q2xpcE1hc2soYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyKQotewotICAgIEZYX1JFQ1QgcGF0aF9yZWN0KHJhc3Rlcml6ZXIubWluX3goKSwgcmFzdGVyaXplci5taW5feSgpLAotICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlcml6ZXIubWF4X3goKSArIDEsIHJhc3Rlcml6ZXIubWF4X3koKSArIDEpOwotICAgIHBhdGhfcmVjdC5JbnRlcnNlY3QobV9wQ2xpcFJnbi0+R2V0Qm94KCkpOwotICAgIENGWF9ESUJpdG1hcFJlZiBtYXNrOwotICAgIENGWF9ESUJpdG1hcCogcFRoaXNMYXllciA9IG1hc2suTmV3KCk7Ci0gICAgaWYgKCFwVGhpc0xheWVyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcFRoaXNMYXllci0+Q3JlYXRlKHBhdGhfcmVjdC5XaWR0aCgpLCBwYXRoX3JlY3QuSGVpZ2h0KCksIEZYRElCXzhicHBNYXNrKTsKLSAgICBwVGhpc0xheWVyLT5DbGVhcigwKTsKLSAgICBhZ2c6OnJlbmRlcmluZ19idWZmZXIgcmF3X2J1ZihwVGhpc0xheWVyLT5HZXRCdWZmZXIoKSwgcFRoaXNMYXllci0+R2V0V2lkdGgoKSwgcFRoaXNMYXllci0+R2V0SGVpZ2h0KCksIHBUaGlzTGF5ZXItPkdldFBpdGNoKCkpOwotICAgIGFnZzo6cGl4Zm10X2dyYXk4IHBpeGVsX2J1ZihyYXdfYnVmKTsKLSAgICBhZ2c6OnJlbmRlcmVyX2Jhc2U8YWdnOjpwaXhmbXRfZ3JheTg+IGJhc2VfYnVmKHBpeGVsX2J1Zik7Ci0gICAgYWdnOjpyZW5kZXJlcl9zY2FubGluZV9hYV9vZmZzZXQ8YWdnOjpyZW5kZXJlcl9iYXNlPGFnZzo6cGl4Zm10X2dyYXk4PiA+IGZpbmFsX3JlbmRlcihiYXNlX2J1ZiwgcGF0aF9yZWN0LmxlZnQsIHBhdGhfcmVjdC50b3ApOwotICAgIGZpbmFsX3JlbmRlci5jb2xvcihhZ2c6OmdyYXk4KDI1NSkpOwotICAgIGFnZzo6c2NhbmxpbmVfdTggc2NhbmxpbmU7Ci0gICAgYWdnOjpyZW5kZXJfc2NhbmxpbmVzKHJhc3Rlcml6ZXIsIHNjYW5saW5lLCBmaW5hbF9yZW5kZXIsIChtX0ZpbGxGbGFncyAmIEZYRklMTF9OT1BBVEhTTU9PVEgpICE9IDApOwotICAgIG1fcENsaXBSZ24tPkludGVyc2VjdE1hc2tGKHBhdGhfcmVjdC5sZWZ0LCBwYXRoX3JlY3QudG9wLCBtYXNrKTsKK3ZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0Q2xpcE1hc2soYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyKSB7CisgIEZYX1JFQ1QgcGF0aF9yZWN0KHJhc3Rlcml6ZXIubWluX3goKSwgcmFzdGVyaXplci5taW5feSgpLAorICAgICAgICAgICAgICAgICAgICByYXN0ZXJpemVyLm1heF94KCkgKyAxLCByYXN0ZXJpemVyLm1heF95KCkgKyAxKTsKKyAgcGF0aF9yZWN0LkludGVyc2VjdChtX3BDbGlwUmduLT5HZXRCb3goKSk7CisgIENGWF9ESUJpdG1hcFJlZiBtYXNrOworICBDRlhfRElCaXRtYXAqIHBUaGlzTGF5ZXIgPSBtYXNrLk5ldygpOworICBpZiAoIXBUaGlzTGF5ZXIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgcFRoaXNMYXllci0+Q3JlYXRlKHBhdGhfcmVjdC5XaWR0aCgpLCBwYXRoX3JlY3QuSGVpZ2h0KCksIEZYRElCXzhicHBNYXNrKTsKKyAgcFRoaXNMYXllci0+Q2xlYXIoMCk7CisgIGFnZzo6cmVuZGVyaW5nX2J1ZmZlciByYXdfYnVmKHBUaGlzTGF5ZXItPkdldEJ1ZmZlcigpLCBwVGhpc0xheWVyLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpc0xheWVyLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXNMYXllci0+R2V0UGl0Y2goKSk7CisgIGFnZzo6cGl4Zm10X2dyYXk4IHBpeGVsX2J1ZihyYXdfYnVmKTsKKyAgYWdnOjpyZW5kZXJlcl9iYXNlPGFnZzo6cGl4Zm10X2dyYXk4PiBiYXNlX2J1ZihwaXhlbF9idWYpOworICBhZ2c6OnJlbmRlcmVyX3NjYW5saW5lX2FhX29mZnNldDxhZ2c6OnJlbmRlcmVyX2Jhc2U8YWdnOjpwaXhmbXRfZ3JheTg+ID4KKyAgICAgIGZpbmFsX3JlbmRlcihiYXNlX2J1ZiwgcGF0aF9yZWN0LmxlZnQsIHBhdGhfcmVjdC50b3ApOworICBmaW5hbF9yZW5kZXIuY29sb3IoYWdnOjpncmF5OCgyNTUpKTsKKyAgYWdnOjpzY2FubGluZV91OCBzY2FubGluZTsKKyAgYWdnOjpyZW5kZXJfc2NhbmxpbmVzKHJhc3Rlcml6ZXIsIHNjYW5saW5lLCBmaW5hbF9yZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAobV9GaWxsRmxhZ3MgJiBGWEZJTExfTk9QQVRIU01PT1RIKSAhPSAwKTsKKyAgbV9wQ2xpcFJnbi0+SW50ZXJzZWN0TWFza0YocGF0aF9yZWN0LmxlZnQsIHBhdGhfcmVjdC50b3AsIG1hc2spOwogfQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgaW50IGZpbGxfbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIG1fRmlsbEZsYWdzID0gZmlsbF9tb2RlOwotICAgIGlmIChtX3BDbGlwUmduID09IE5VTEwpIHsKLSAgICAgICAgbV9wQ2xpcFJnbiA9IEZYX05FVyBDRlhfQ2xpcFJnbihHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLCBHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSk7Ci0gICAgICAgIGlmICghbV9wQ2xpcFJnbikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CitGWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoCisgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgaW50IGZpbGxfbW9kZSkgeworICBtX0ZpbGxGbGFncyA9IGZpbGxfbW9kZTsKKyAgaWYgKG1fcENsaXBSZ24gPT0gTlVMTCkgeworICAgIG1fcENsaXBSZ24gPSBGWF9ORVcgQ0ZYX0NsaXBSZ24oR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKTsKKyAgICBpZiAoIW1fcENsaXBSZ24pIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUgfHwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNCkgewotICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3RmOwotICAgICAgICBpZiAocFBhdGhEYXRhLT5Jc1JlY3QocE9iamVjdDJEZXZpY2UsICZyZWN0ZikpIHsKLSAgICAgICAgICAgIHJlY3RmLkludGVyc2VjdChDRlhfRmxvYXRSZWN0KDAsIDAsIChGWF9GTE9BVClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLCAoRlhfRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKLSAgICAgICAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKLSAgICAgICAgICAgIG1fcENsaXBSZ24tPkludGVyc2VjdFJlY3QocmVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQorICB9CisgIGlmIChwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSA1IHx8IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDQpIHsKKyAgICBDRlhfRmxvYXRSZWN0IHJlY3RmOworICAgIGlmIChwUGF0aERhdGEtPklzUmVjdChwT2JqZWN0MkRldmljZSwgJnJlY3RmKSkgeworICAgICAgcmVjdGYuSW50ZXJzZWN0KAorICAgICAgICAgIENGWF9GbG9hdFJlY3QoMCwgMCwgKEZYX0ZMT0FUKUdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksCisgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKKyAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKKyAgICAgIG1fcENsaXBSZ24tPkludGVyc2VjdFJlY3QocmVjdCk7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgQ0FnZ19QYXRoRGF0YSBwYXRoX2RhdGE7Ci0gICAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlKTsKLSAgICBwYXRoX2RhdGEubV9QYXRoRGF0YS5lbmRfcG9seSgpOwotICAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwotICAgIHJhc3Rlcml6ZXIuY2xpcF9ib3goMC4wZiwgMC4wZiwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOwotICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGgocGF0aF9kYXRhLm1fUGF0aERhdGEpOwotICAgIHJhc3Rlcml6ZXIuZmlsbGluZ19ydWxlKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORyA/IGFnZzo6ZmlsbF9ub25femVybyA6IGFnZzo6ZmlsbF9ldmVuX29kZCk7Ci0gICAgU2V0Q2xpcE1hc2socmFzdGVyaXplcik7Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQ0FnZ19QYXRoRGF0YSBwYXRoX2RhdGE7CisgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7CisgIHBhdGhfZGF0YS5tX1BhdGhEYXRhLmVuZF9wb2x5KCk7CisgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOworICByYXN0ZXJpemVyLmNsaXBfYm94KDAuMGYsIDAuMGYsIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSksCisgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOworICByYXN0ZXJpemVyLmFkZF9wYXRoKHBhdGhfZGF0YS5tX1BhdGhEYXRhKTsKKyAgcmFzdGVyaXplci5maWxsaW5nX3J1bGUoKGZpbGxfbW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFnZzo6ZmlsbF9ub25femVybworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhZ2c6OmZpbGxfZXZlbl9vZGQpOworICBTZXRDbGlwTWFzayhyYXN0ZXJpemVyKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIGlmIChtX3BDbGlwUmduID09IE5VTEwpIHsKLSAgICAgICAgbV9wQ2xpcFJnbiA9IEZYX05FVyBDRlhfQ2xpcFJnbihHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLCBHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSk7Ci0gICAgICAgIGlmICghbV9wQ2xpcFJnbikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CitGWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZSgKKyAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKSB7CisgIGlmIChtX3BDbGlwUmduID09IE5VTEwpIHsKKyAgICBtX3BDbGlwUmduID0gRlhfTkVXIENGWF9DbGlwUmduKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSk7CisgICAgaWYgKCFtX3BDbGlwUmduKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIENBZ2dfUGF0aERhdGEgcGF0aF9kYXRhOwotICAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBOVUxMKTsKLSAgICBhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEgcmFzdGVyaXplcjsKLSAgICByYXN0ZXJpemVyLmNsaXBfYm94KDAuMGYsIDAuMGYsIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSksIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKLSAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSk7Ci0gICAgcmFzdGVyaXplci5maWxsaW5nX3J1bGUoYWdnOjpmaWxsX25vbl96ZXJvKTsKLSAgICBTZXRDbGlwTWFzayhyYXN0ZXJpemVyKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgfQorICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKKyAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIE5VTEwpOworICBhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEgcmFzdGVyaXplcjsKKyAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLAorICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKKyAgUmFzdGVyaXplU3Ryb2tlKHJhc3Rlcml6ZXIsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgIHBHcmFwaFN0YXRlKTsKKyAgcmFzdGVyaXplci5maWxsaW5nX3J1bGUoYWdnOjpmaWxsX25vbl96ZXJvKTsKKyAgU2V0Q2xpcE1hc2socmFzdGVyaXplcik7CisgIHJldHVybiBUUlVFOwogfQotY2xhc3MgQ0ZYX1JlbmRlcmVyIAotewotcHJpdmF0ZToKLSAgICBpbnQJCQltX0FscGhhLAotICAgICAgICAgICAgICAgIG1fUmVkLAotICAgICAgICAgICAgICAgIG1fR3JlZW4sCi0gICAgICAgICAgICAgICAgbV9CbHVlLAotICAgICAgICAgICAgICAgIG1fR3JheTsKLSAgICBGWF9EV09SRAltX0NvbG9yOwotICAgIEZYX0JPT0wJCW1fYkZ1bGxDb3ZlcjsKLSAgICBGWF9CT09MICAgICBtX2JSZ2JCeXRlT3JkZXI7Ci0gICAgQ0ZYX0RJQml0bWFwKiBtX3BPcmlEZXZpY2U7Ci0gICAgRlhfUkVDVAkJbV9DbGlwQm94OwotICAgIGNvbnN0IENGWF9ESUJpdG1hcCoJbV9wQ2xpcE1hc2s7Ci0gICAgQ0ZYX0RJQml0bWFwKgltX3BEZXZpY2U7Ci0gICAgY29uc3QgQ0ZYX0NsaXBSZ24qIG1fcENsaXBSZ247Ci0gICAgdm9pZCAoQ0ZYX1JlbmRlcmVyOjoqY29tcG9zaXRlX3NwYW4pKHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCB1aW50OF90KiwgaW50LCBpbnQsIHVpbnQ4X3QqLCB1aW50OF90Kik7Ci1wdWJsaWM6Ci0gICAgdm9pZCBwcmVwYXJlKHVuc2lnbmVkKSB7fQotICAgIHZvaWQgQ29tcG9zaXRlU3Bhbih1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLCBpbnQgQnBwLCBGWF9CT09MIGJEZXN0QWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgdWludDhfdCogY292ZXJfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbikKLSAgICB7Ci0gICAgICAgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKLSAgICAgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICAgICAgaWYgKEJwcCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKLSAgICAgICAgICAgIG9yaV9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgLyA4OwotICAgICAgICAgICAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0IC8gODsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgICAgICBpZiAoQnBwID09IDQgJiYgYkRlc3RBbHBoYSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gb3JpX3NjYW5bM10gKyBzcmNfYWxwaGEgLSBvcmlfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmlfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgb3JpX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoICpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuW2NvbF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKEJwcCA9PSAzIHx8IEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIG9yaV9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSggKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCcHAgPT0gNCAmJiBiRGVzdEFscGhhKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYV9jb3ZlcmVkID0gc3JjX2FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGFfY292ZXJlZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvdmVyX3NjYW5bY29sXSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhX2NvdmVyZWQ7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gbV9SZWQ7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYV9jb3ZlcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IG1fQmx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyID0gY292ZXJfc2Nhbltjb2xdOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bM10sIHNyY19hbHBoYSwgY292ZXIpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBjb3Zlcik7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGNvdmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGNvdmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCcHAgPT0gMyB8fCBCcHAgPT0gNCkgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKLSAgICAgICAgICAgICAgICAgICAgb3JpX3NjYW4gKz0gQnBwIC0gMjsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgIGludCByID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBvcmlfc2NhbiArPSBCcHAgLSAyOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSggKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuW2NvbF0pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCcHAgPT0gMSkgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGdyYXkgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPkdldFBhbGV0dGUoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAoKHVpbnQ4X3QpbV9Db2xvciA9PSAweGZmKSA/IDEgOiAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkgKyspCi0gICAgICAgICAgICAgICAgICAgIGlmIChGWEFSR0JfVE9ESUIobV9wRGV2aWNlLT5HZXRQYWxldHRlKClbaV0pID09IG1fQ29sb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuMSA9IGRlc3Rfc2NhbjsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4xICY9IH4oMSA8PCAoNyAtIChjb2wgKyBzcGFuX2xlZnQpICUgOCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbjEgfD0gMSA8PCAoNyAtIChjb2wgKyBzcGFuX2xlZnQpICUgOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuMSA9IGRlc3Rfc2NhbiArIChzcGFuX2xlZnQgJSA4ICsgY29sIC0gY29sX3N0YXJ0ICsgMSkgLyA4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgQ29tcG9zaXRlU3BhbjFicHAodWludDhfdCogZGVzdF9zY2FuLCBpbnQgQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLSAgICB7Ci0gICAgICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICAgICAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IC8gODsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaWYgKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpID09IE5VTEwpIHsKLSAgICAgICAgICAgIGluZGV4ID0gKCh1aW50OF90KW1fQ29sb3IgPT0gMHhmZikgPyAxIDogMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSArKykKLSAgICAgICAgICAgICAgICBpZiAoRlhBUkdCX1RPRElCKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpW2ldKSA9PSBtX0NvbG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuMSA9IGRlc3Rfc2NhbjsKLSAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgIGlmICghaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbjEgJj0gfigxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbjEgfD0gMSA8PCAoNyAtIChjb2wgKyBzcGFuX2xlZnQpICUgOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuMSA9IGRlc3Rfc2NhbiArIChzcGFuX2xlZnQgJSA4ICsgY29sIC0gY29sX3N0YXJ0ICsgMSkgLyA4OwotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgQ29tcG9zaXRlU3BhbkdyYXkodWludDhfdCogZGVzdF9zY2FuLCBpbnQgQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLSAgICB7Ci0gICAgICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICAgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydDsKLSAgICAgICAgaWYgKGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fR3JheTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4gPSBtX0FscGhhOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gbV9HcmF5OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBDb21wb3NpdGVTcGFuQVJHQih1aW50OF90KiBkZXN0X3NjYW4sIGludCBCcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIHVpbnQ4X3QqIGNvdmVyX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKLSAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gbV9SZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgQ29tcG9zaXRlU3BhblJHQih1aW50OF90KiBkZXN0X3NjYW4sIGludCBCcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgdWludDhfdCogY292ZXJfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKLSAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCcHAgPT0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJwcCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9SZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCcHAgPT0gMyAmJiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fQmx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fR3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9ICh1aW50OF90KW1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9ICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSArIHNyY19hbHBoYSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQnBwID09IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCcHAgPT0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgQ29tcG9zaXRlU3BhbkNNWUsodWludDhfdCogZGVzdF9zY2FuLCBpbnQgQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLSAgICB7Ci0gICAgICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICAgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIDQ7Ci0gICAgICAgIGlmIChkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICooRlhfQ01ZSyopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4gPSAodWludDhfdCltX0FscGhhOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9DTVlLKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHRlbXBsYXRlPGNsYXNzIFNjYW5saW5lPiB2b2lkIHJlbmRlcihjb25zdCBTY2FubGluZSYgc2wpCi0gICAgewotICAgICAgICBpZiAobV9wT3JpRGV2aWNlID09IE5VTEwgJiYgY29tcG9zaXRlX3NwYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCB5ID0gc2wueSgpOwotICAgICAgICBpZiAoeSA8IG1fQ2xpcEJveC50b3AgfHwgeSA+PSBtX0NsaXBCb3guYm90dG9tKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wRGV2aWNlLT5HZXRCdWZmZXIoKSArIG1fcERldmljZS0+R2V0UGl0Y2goKSAqIHk7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSA9IE5VTEw7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcEFscGhhTWFzayA9IG1fcERldmljZS0+bV9wQWxwaGFNYXNrOwotICAgICAgICBpZiAocEFscGhhTWFzaykgewotICAgICAgICAgICAgZGVzdF9zY2FuX2V4dHJhX2FscGhhID0gcEFscGhhTWFzay0+R2V0QnVmZmVyKCkgKyBwQWxwaGFNYXNrLT5HZXRQaXRjaCgpICogeTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90KiBvcmlfc2NhbiA9IE5VTEw7Ci0gICAgICAgIGlmIChtX3BPcmlEZXZpY2UpIHsKLSAgICAgICAgICAgIG9yaV9zY2FuID0gbV9wT3JpRGV2aWNlLT5HZXRCdWZmZXIoKSArIG1fcE9yaURldmljZS0+R2V0UGl0Y2goKSAqIHk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IEJwcCA9IG1fcERldmljZS0+R2V0QlBQKCkgLyA4OwotICAgICAgICBGWF9CT09MIGJEZXN0QWxwaGEgPSBtX3BEZXZpY2UtPkhhc0FscGhhKCkgfHwgbV9wRGV2aWNlLT5Jc0FscGhhTWFzaygpOwotICAgICAgICB1bnNpZ25lZCBudW1fc3BhbnMgPSBzbC5udW1fc3BhbnMoKTsKLSAgICAgICAgdHlwZW5hbWUgU2NhbmxpbmU6OmNvbnN0X2l0ZXJhdG9yIHNwYW4gPSBzbC5iZWdpbigpOwotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaW50IHggPSBzcGFuLT54OwotICAgICAgICAgICAgQVNTRVJUKHNwYW4tPmxlbiA+IDApOwotICAgICAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSBOVUxMOwotICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9wb3MgPSBOVUxMOwotICAgICAgICAgICAgdWludDhfdCogb3JpX3BvcyA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAoQnBwKSB7Ci0gICAgICAgICAgICAgICAgb3JpX3BvcyA9IG9yaV9zY2FuID8gb3JpX3NjYW4gKyB4ICogQnBwIDogTlVMTDsKLSAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Rfc2NhbiArIHggKiBCcHA7Ci0gICAgICAgICAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9wb3MgPSBkZXN0X3NjYW5fZXh0cmFfYWxwaGEgPyBkZXN0X3NjYW5fZXh0cmFfYWxwaGEgKyB4IDogTlVMTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9wb3MgPSBkZXN0X3NjYW4gKyB4IC8gODsKLSAgICAgICAgICAgICAgICBvcmlfcG9zID0gb3JpX3NjYW4gPyBvcmlfc2NhbiArIHggLyA4IDogTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfcG9zID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChtX3BDbGlwTWFzaykgewotICAgICAgICAgICAgICAgIGNsaXBfcG9zID0gbV9wQ2xpcE1hc2stPkdldEJ1ZmZlcigpICsgKHkgLSBtX0NsaXBCb3gudG9wKSAqIG1fcENsaXBNYXNrLT5HZXRQaXRjaCgpICsgeCAtIG1fQ2xpcEJveC5sZWZ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9yaV9wb3MpIHsKLSAgICAgICAgICAgICAgICBDb21wb3NpdGVTcGFuKGRlc3RfcG9zLCBvcmlfcG9zLCBCcHAsIGJEZXN0QWxwaGEsIHgsIHNwYW4tPmxlbiwgc3Bhbi0+Y292ZXJzLCBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LCBjbGlwX3Bvcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICh0aGlzLT4qY29tcG9zaXRlX3NwYW4pKGRlc3RfcG9zLCBCcHAsIHgsIHNwYW4tPmxlbiwgc3Bhbi0+Y292ZXJzLCBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LCBjbGlwX3BvcywgZGVzdF9leHRyYV9hbHBoYV9wb3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoLS1udW1fc3BhbnMgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytzcGFuOwotICAgICAgICB9Ci0gICAgfQorY2xhc3MgQ0ZYX1JlbmRlcmVyIHsKKyBwcml2YXRlOgorICBpbnQgbV9BbHBoYSwgbV9SZWQsIG1fR3JlZW4sIG1fQmx1ZSwgbV9HcmF5OworICBGWF9EV09SRCBtX0NvbG9yOworICBGWF9CT09MIG1fYkZ1bGxDb3ZlcjsKKyAgRlhfQk9PTCBtX2JSZ2JCeXRlT3JkZXI7CisgIENGWF9ESUJpdG1hcCogbV9wT3JpRGV2aWNlOworICBGWF9SRUNUIG1fQ2xpcEJveDsKKyAgY29uc3QgQ0ZYX0RJQml0bWFwKiBtX3BDbGlwTWFzazsKKyAgQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2U7CisgIGNvbnN0IENGWF9DbGlwUmduKiBtX3BDbGlwUmduOworICB2b2lkIChDRlhfUmVuZGVyZXI6Oipjb21wb3NpdGVfc3BhbikodWludDhfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCopOwogCi0gICAgRlhfQk9PTCBJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkKLSAgICB7Ci0gICAgICAgIG1fcERldmljZSA9IHBEZXZpY2U7Ci0gICAgICAgIG1fcENsaXBSZ24gPSBwQ2xpcFJnbjsKLSAgICAgICAgY29tcG9zaXRlX3NwYW4gPSBOVUxMOwotICAgICAgICBtX2JSZ2JCeXRlT3JkZXIgPSBiUmdiQnl0ZU9yZGVyOwotICAgICAgICBtX3BPcmlEZXZpY2UgPSBwT3JpRGV2aWNlOwotICAgICAgICBpZiAobV9wQ2xpcFJnbikgewotICAgICAgICAgICAgbV9DbGlwQm94ID0gbV9wQ2xpcFJnbi0+R2V0Qm94KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0NsaXBCb3gubGVmdCA9IG1fQ2xpcEJveC50b3AgPSAwOwotICAgICAgICAgICAgbV9DbGlwQm94LnJpZ2h0ID0gbV9wRGV2aWNlLT5HZXRXaWR0aCgpOwotICAgICAgICAgICAgbV9DbGlwQm94LmJvdHRvbSA9IG1fcERldmljZS0+R2V0SGVpZ2h0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wQ2xpcE1hc2sgPSBOVUxMOwotICAgICAgICBpZiAobV9wQ2xpcFJnbiAmJiBtX3BDbGlwUmduLT5HZXRUeXBlKCkgPT0gQ0ZYX0NsaXBSZ246Ok1hc2tGKSB7Ci0gICAgICAgICAgICBtX3BDbGlwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKLSAgICAgICAgfQotICAgICAgICBtX2JGdWxsQ292ZXIgPSBiRnVsbENvdmVyOwotICAgICAgICBGWF9CT09MIGJPYmplY3RDTVlLID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTsKLSAgICAgICAgRlhfQk9PTCBiRGV2aWNlQ01ZSyA9IHBEZXZpY2UtPklzQ215a0ltYWdlKCk7Ci0gICAgICAgIG1fQWxwaGEgPSBiT2JqZWN0Q01ZSyA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gTlVMTDsKLSAgICAgICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8ICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewotICAgICAgICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gOCkgewotICAgICAgICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotICAgICAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheTsKLSAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICBtX0dyYXkgPSAyNTU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JheTsKLSAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fR3JheSA9IGdyYXk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fR3JheSA9IEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX0dyYXkgPSBGWFJHQjJHUkFZKEZYQVJHQl9SKGNvbG9yKSwgRlhBUkdCX0coY29sb3IpLCBGWEFSR0JfQihjb2xvcikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJEZXZpY2VDTVlLKSB7Ci0gICAgICAgICAgICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7Ci0gICAgICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5DTVlLOwotICAgICAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7Ci0gICAgICAgICAgICAgICAgbV9Db2xvciA9IEZYQ01ZS19UT0RJQihjb2xvcik7Ci0gICAgICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLCAoY29uc3QgdWludDhfdCopJm1fQ29sb3IsIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29sb3IgPSBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICh1aW50OF90KikmbV9Db2xvciwgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX1JlZCA9ICgodWludDhfdCopJm1fQ29sb3IpWzBdOwotICAgICAgICAgICAgbV9HcmVlbiA9ICgodWludDhfdCopJm1fQ29sb3IpWzFdOwotICAgICAgICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMl07Ci0gICAgICAgICAgICBtX0dyYXkgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gKHBEZXZpY2UtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpID8gJkNGWF9SZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0IgOiAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCOwotICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICBjb2xvciA9IGJPYmplY3RDTVlLID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLCAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKLSAgICAgICAgICAgICAgICAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXSA9IG1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgbV9SZWQgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsyXTsKLSAgICAgICAgICAgICAgICBtX0dyZWVuID0gKCh1aW50OF90KikmbV9Db2xvcilbMV07Ci0gICAgICAgICAgICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07Ci0gICAgICAgICAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICAgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKG1fQ29sb3IpOwotICAgICAgICAgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPQkdST1JERVJESUIobV9Db2xvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYk9iamVjdENNWUspIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCByLCBnLCBiOwotICAgICAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX01BS0UobV9BbHBoYSwgciwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihtX0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9ESUIobV9Db2xvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9SZWQgPSByOwotICAgICAgICAgICAgICAgICAgICBtX0dyZWVuID0gZzsKLSAgICAgICAgICAgICAgICAgICAgbV9CbHVlID0gYjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPQkdST1JERVJESUIoY29sb3IpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQXJnYkRlY29kZShjb2xvciwgbV9BbHBoYSwgbV9SZWQsIG1fR3JlZW4sIG1fQmx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9SZW5kZXJlcjo6Q29tcG9zaXRlU3BhbjFicHA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgcHVibGljOgorICB2b2lkIHByZXBhcmUodW5zaWduZWQpIHt9CisgIHZvaWQgQ29tcG9zaXRlU3Bhbih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZXN0QWxwaGEsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICAgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKKyAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgPyBzcGFuX2xlbgorICAgICAgICAgICAgICAgICAgICAgIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICAgIGlmIChCcHApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKiBCcHA7CisgICAgICBvcmlfc2NhbiArPSBjb2xfc3RhcnQgKiBCcHA7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgLyA4OworICAgICAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0IC8gODsKICAgICB9Ci19OwotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpSZW5kZXJSYXN0ZXJpemVyKGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwgRlhfRFdPUkQgY29sb3IsIEZYX0JPT0wgYkZ1bGxDb3ZlciwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCwKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgQ0ZYX0RJQml0bWFwKiBwdCA9IGJHcm91cEtub2Nrb3V0ID8gbV9wT3JpRGV2aWNlIDogTlVMTDsKLSAgICBDRlhfUmVuZGVyZXIgcmVuZGVyOwotICAgIGlmICghcmVuZGVyLkluaXQobV9wQml0bWFwLCBwdCwgbV9wQ2xpcFJnbiwgY29sb3IsIGJGdWxsQ292ZXIsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICAgIGlmIChCcHAgPT0gNCAmJiBiRGVzdEFscGhhKSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgICAgb3JpX3NjYW5bM10gKyBzcmNfYWxwaGEgLSBvcmlfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICBvcmlfc2NhbisrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgICBvcmlfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW5bY29sXSk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBnLCBjb3Zlcl9zY2FuW2NvbF0pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoQnBwID09IDMgfHwgQnBwID09IDQpIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOworICAgICAgICAgIH0KKyAgICAgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAgICAgICBpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgICAgb3JpX3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBhZ2c6OnNjYW5saW5lX3U4IHNjYW5saW5lOwotICAgIGFnZzo6cmVuZGVyX3NjYW5saW5lcyhyYXN0ZXJpemVyLCBzY2FubGluZSwgcmVuZGVyLCAobV9GaWxsRmxhZ3MgJiBGWEZJTExfTk9QQVRIU01PT1RIKSAhPSAwKTsKKyAgICBpZiAoQnBwID09IDQgJiYgYkRlc3RBbHBoYSkgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNyY19hbHBoYV9jb3ZlcmVkID0gc3JjX2FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICBpZiAoc3JjX2FscGhhX2NvdmVyZWQgPT0gMCkgeworICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjb3Zlcl9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhX2NvdmVyZWQ7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChkZXN0X3NjYW5bM10gPT0gMCkgeworICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhX2NvdmVyZWQ7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCBjb3ZlciA9IGNvdmVyX3NjYW5bY29sXTsKKyAgICAgICAgICBkZXN0X3NjYW5bM10gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bM10sIHNyY19hbHBoYSwgY292ZXIpOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGNvdmVyKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgY292ZXIpOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgY292ZXIpOworICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChCcHAgPT0gMyB8fCBCcHAgPT0gNCkgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7CisgICAgICAgICAgb3JpX3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAgIGludCByID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAgICAgb3JpX3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW5bY29sXSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuW2NvbF0pOworICAgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChCcHAgPT0gMSkgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmF5LCBzcmNfYWxwaGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludCBncmF5ID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgaWYgKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpID09IE5VTEwpIHsKKyAgICAgICAgaW5kZXggPSAoKHVpbnQ4X3QpbV9Db2xvciA9PSAweGZmKSA/IDEgOiAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgaWYgKEZYQVJHQl9UT0RJQihtX3BEZXZpY2UtPkdldFBhbGV0dGUoKVtpXSkgPT0gbV9Db2xvcikgeworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW47CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgaWYgKCFpbmRleCkgeworICAgICAgICAgICAgKmRlc3Rfc2NhbjEgJj0gfigxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4xIHw9IDEgPDwgKDcgLSAoY29sICsgc3Bhbl9sZWZ0KSAlIDgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4xID0gZGVzdF9zY2FuICsgKHNwYW5fbGVmdCAlIDggKyBjb2wgLSBjb2xfc3RhcnQgKyAxKSAvIDg7CisgICAgICB9CisgICAgfQorICB9CisgIHZvaWQgQ29tcG9zaXRlU3BhbjFicHAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgICAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOworICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICA/IHNwYW5fbGVuCisgICAgICAgICAgICAgICAgICAgICAgOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAvIDg7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICBpZiAobV9wRGV2aWNlLT5HZXRQYWxldHRlKCkgPT0gTlVMTCkgeworICAgICAgaW5kZXggPSAoKHVpbnQ4X3QpbV9Db2xvciA9PSAweGZmKSA/IDEgOiAwOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgaWYgKEZYQVJHQl9UT0RJQihtX3BEZXZpY2UtPkdldFBhbGV0dGUoKVtpXSkgPT0gbV9Db2xvcikgeworICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50OF90KiBkZXN0X3NjYW4xID0gZGVzdF9zY2FuOworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgIGlmICghaW5kZXgpIHsKKyAgICAgICAgICAqZGVzdF9zY2FuMSAmPSB+KDEgPDwgKDcgLSAoY29sICsgc3Bhbl9sZWZ0KSAlIDgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqZGVzdF9zY2FuMSB8PSAxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVzdF9zY2FuMSA9IGRlc3Rfc2NhbiArIChzcGFuX2xlZnQgJSA4ICsgY29sIC0gY29sX3N0YXJ0ICsgMSkgLyA4OworICAgIH0KKyAgfQorICB2b2lkIENvbXBvc2l0ZVNwYW5HcmF5KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOworICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICA/IHNwYW5fbGVuCisgICAgICAgICAgICAgICAgICAgICAgOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydDsKKyAgICBpZiAoZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gbV9HcmF5OworICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbiA9IG1fQWxwaGE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9ICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSArIHNyY19hbHBoYSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gbV9HcmF5OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBzcmNfYWxwaGEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdm9pZCBDb21wb3NpdGVTcGFuQVJHQih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICA/IHNwYW5fbGVuCisgICAgICAgICAgICAgICAgICAgICAgOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKKyAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAgICooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGRlc3Rfc2NhblszXSA9PSAwKSB7CisgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGE7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdICsgc3JjX2FscGhhIC0gZGVzdF9zY2FuWzNdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICB9CisgIH0KKyAgdm9pZCBDb21wb3NpdGVTcGFuUkdCKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICA/IHNwYW5fbGVuCisgICAgICAgICAgICAgICAgICAgICAgOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKKyAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAgIGlmIChCcHAgPT0gNCkgeworICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICAgICAgfSBlbHNlIGlmIChCcHAgPT0gMykgeworICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKKyAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKKyAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChCcHAgPT0gMyAmJiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgaW50IHNyY19hbHBoYTsKKyAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fQmx1ZTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fR3JlZW47CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKKyAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9ICh1aW50OF90KW1fQWxwaGE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOworICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgICBpZiAoQnBwID09IDQpIHsKKyAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQnBwID09IDMpIHsKKyAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgfQorICAgIH0KKyAgfQorICB2b2lkIENvbXBvc2l0ZVNwYW5DTVlLKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOworICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICA/IHNwYW5fbGVuCisgICAgICAgICAgICAgICAgICAgICAgOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIDQ7CisgICAgaWYgKGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAgICAgKihGWF9DTVlLKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbiA9ICh1aW50OF90KW1fQWxwaGE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9ICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSArIHNyY19hbHBoYSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgICAqKEZYX0NNWUsqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIFNjYW5saW5lPgorICB2b2lkIHJlbmRlcihjb25zdCBTY2FubGluZSYgc2wpIHsKKyAgICBpZiAobV9wT3JpRGV2aWNlID09IE5VTEwgJiYgY29tcG9zaXRlX3NwYW4gPT0gTlVMTCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgeSA9IHNsLnkoKTsKKyAgICBpZiAoeSA8IG1fQ2xpcEJveC50b3AgfHwgeSA+PSBtX0NsaXBCb3guYm90dG9tKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcERldmljZS0+R2V0QnVmZmVyKCkgKyBtX3BEZXZpY2UtPkdldFBpdGNoKCkgKiB5OworICAgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSA9IE5VTEw7CisgICAgQ0ZYX0RJQml0bWFwKiBwQWxwaGFNYXNrID0gbV9wRGV2aWNlLT5tX3BBbHBoYU1hc2s7CisgICAgaWYgKHBBbHBoYU1hc2spIHsKKyAgICAgIGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSA9CisgICAgICAgICAgcEFscGhhTWFzay0+R2V0QnVmZmVyKCkgKyBwQWxwaGFNYXNrLT5HZXRQaXRjaCgpICogeTsKKyAgICB9CisgICAgdWludDhfdCogb3JpX3NjYW4gPSBOVUxMOworICAgIGlmIChtX3BPcmlEZXZpY2UpIHsKKyAgICAgIG9yaV9zY2FuID0gbV9wT3JpRGV2aWNlLT5HZXRCdWZmZXIoKSArIG1fcE9yaURldmljZS0+R2V0UGl0Y2goKSAqIHk7CisgICAgfQorICAgIGludCBCcHAgPSBtX3BEZXZpY2UtPkdldEJQUCgpIC8gODsKKyAgICBGWF9CT09MIGJEZXN0QWxwaGEgPSBtX3BEZXZpY2UtPkhhc0FscGhhKCkgfHwgbV9wRGV2aWNlLT5Jc0FscGhhTWFzaygpOworICAgIHVuc2lnbmVkIG51bV9zcGFucyA9IHNsLm51bV9zcGFucygpOworICAgIHR5cGVuYW1lIFNjYW5saW5lOjpjb25zdF9pdGVyYXRvciBzcGFuID0gc2wuYmVnaW4oKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgaW50IHggPSBzcGFuLT54OworICAgICAgQVNTRVJUKHNwYW4tPmxlbiA+IDApOworICAgICAgdWludDhfdCogZGVzdF9wb3MgPSBOVUxMOworICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9wb3MgPSBOVUxMOworICAgICAgdWludDhfdCogb3JpX3BvcyA9IE5VTEw7CisgICAgICBpZiAoQnBwKSB7CisgICAgICAgIG9yaV9wb3MgPSBvcmlfc2NhbiA/IG9yaV9zY2FuICsgeCAqIEJwcCA6IE5VTEw7CisgICAgICAgIGRlc3RfcG9zID0gZGVzdF9zY2FuICsgeCAqIEJwcDsKKyAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9wb3MgPQorICAgICAgICAgICAgZGVzdF9zY2FuX2V4dHJhX2FscGhhID8gZGVzdF9zY2FuX2V4dHJhX2FscGhhICsgeCA6IE5VTEw7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZXN0X3BvcyA9IGRlc3Rfc2NhbiArIHggLyA4OworICAgICAgICBvcmlfcG9zID0gb3JpX3NjYW4gPyBvcmlfc2NhbiArIHggLyA4IDogTlVMTDsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3QqIGNsaXBfcG9zID0gTlVMTDsKKyAgICAgIGlmIChtX3BDbGlwTWFzaykgeworICAgICAgICBjbGlwX3BvcyA9IG1fcENsaXBNYXNrLT5HZXRCdWZmZXIoKSArCisgICAgICAgICAgICAgICAgICAgKHkgLSBtX0NsaXBCb3gudG9wKSAqIG1fcENsaXBNYXNrLT5HZXRQaXRjaCgpICsgeCAtCisgICAgICAgICAgICAgICAgICAgbV9DbGlwQm94LmxlZnQ7CisgICAgICB9CisgICAgICBpZiAob3JpX3BvcykgeworICAgICAgICBDb21wb3NpdGVTcGFuKGRlc3RfcG9zLCBvcmlfcG9zLCBCcHAsIGJEZXN0QWxwaGEsIHgsIHNwYW4tPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzcGFuLT5jb3ZlcnMsIG1fQ2xpcEJveC5sZWZ0LCBtX0NsaXBCb3gucmlnaHQsIGNsaXBfcG9zKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICh0aGlzLT4qY29tcG9zaXRlX3NwYW4pKGRlc3RfcG9zLCBCcHAsIHgsIHNwYW4tPmxlbiwgc3Bhbi0+Y292ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LCBjbGlwX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9wb3MpOworICAgICAgfQorICAgICAgaWYgKC0tbnVtX3NwYW5zID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK3NwYW47CisgICAgfQorICB9CisKKyAgRlhfQk9PTCBJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwKKyAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKKyAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKKyAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiRnVsbENvdmVyLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpIHsKKyAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOworICAgIG1fcENsaXBSZ24gPSBwQ2xpcFJnbjsKKyAgICBjb21wb3NpdGVfc3BhbiA9IE5VTEw7CisgICAgbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKKyAgICBtX3BPcmlEZXZpY2UgPSBwT3JpRGV2aWNlOworICAgIGlmIChtX3BDbGlwUmduKSB7CisgICAgICBtX0NsaXBCb3ggPSBtX3BDbGlwUmduLT5HZXRCb3goKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9DbGlwQm94LmxlZnQgPSBtX0NsaXBCb3gudG9wID0gMDsKKyAgICAgIG1fQ2xpcEJveC5yaWdodCA9IG1fcERldmljZS0+R2V0V2lkdGgoKTsKKyAgICAgIG1fQ2xpcEJveC5ib3R0b20gPSBtX3BEZXZpY2UtPkdldEhlaWdodCgpOworICAgIH0KKyAgICBtX3BDbGlwTWFzayA9IE5VTEw7CisgICAgaWYgKG1fcENsaXBSZ24gJiYgbV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRikgeworICAgICAgbV9wQ2xpcE1hc2sgPSBtX3BDbGlwUmduLT5HZXRNYXNrKCk7CisgICAgfQorICAgIG1fYkZ1bGxDb3ZlciA9IGJGdWxsQ292ZXI7CisgICAgRlhfQk9PTCBiT2JqZWN0Q01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgICAgRlhfQk9PTCBiRGV2aWNlQ01ZSyA9IHBEZXZpY2UtPklzQ215a0ltYWdlKCk7CisgICAgbV9BbHBoYSA9IGJPYmplY3RDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7CisgICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8CisgICAgICAgICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgeworICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgICB9CisgICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gOCkgeworICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOworICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheTsKKyAgICAgIGlmIChtX3BEZXZpY2UtPklzQWxwaGFNYXNrKCkpIHsKKyAgICAgICAgbV9HcmF5ID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgICB1aW50OF90IGdyYXk7CisgICAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOworICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOworICAgICAgICAgIG1fR3JheSA9IGdyYXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7CisgICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOworICAgICAgICAgICAgbV9HcmF5ID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9HcmF5ID0KKyAgICAgICAgICAgICAgICBGWFJHQjJHUkFZKEZYQVJHQl9SKGNvbG9yKSwgRlhBUkdCX0coY29sb3IpLCBGWEFSR0JfQihjb2xvcikpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGlmIChiRGV2aWNlQ01ZSykgeworICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOworICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuQ01ZSzsKKyAgICAgIGlmIChiT2JqZWN0Q01ZSykgeworICAgICAgICBtX0NvbG9yID0gRlhDTVlLX1RPRElCKGNvbG9yKTsKKyAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKSZtX0NvbG9yLCAxKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFwSWNjVHJhbnNmb3JtKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGNvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKKyAgICAgIH0KKyAgICAgIG1fUmVkID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07CisgICAgICBtX0dyZWVuID0gKCh1aW50OF90KikmbV9Db2xvcilbMV07CisgICAgICBtX0JsdWUgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsyXTsKKyAgICAgIG1fR3JheSA9ICgodWludDhfdCopJm1fQ29sb3IpWzNdOworICAgIH0gZWxzZSB7CisgICAgICBjb21wb3NpdGVfc3BhbiA9IChwRGV2aWNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCOworICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOworICAgICAgICAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXSA9IG1fQWxwaGE7CisgICAgICAgIG1fUmVkID0gKCh1aW50OF90KikmbV9Db2xvcilbMl07CisgICAgICAgIG1fR3JlZW4gPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsxXTsKKyAgICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07CisgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKG1fQ29sb3IpOworICAgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihtX0NvbG9yKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7CisgICAgICAgICAgdWludDhfdCByLCBnLCBiOworICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY29sb3IpLCBGWFNZU19HZXRNVmFsdWUoY29sb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLCByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLCBiKTsKKyAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX01BS0UobV9BbHBoYSwgciwgZywgYik7CisgICAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0JHUk9SREVSRElCKG1fQ29sb3IpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKG1fQ29sb3IpOworICAgICAgICAgIH0KKyAgICAgICAgICBtX1JlZCA9IHI7CisgICAgICAgICAgbV9HcmVlbiA9IGc7CisgICAgICAgICAgbV9CbHVlID0gYjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPQkdST1JERVJESUIoY29sb3IpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICAgICAgICB9CisgICAgICAgICAgQXJnYkRlY29kZShjb2xvciwgbV9BbHBoYSwgbV9SZWQsIG1fR3JlZW4sIG1fQmx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gMSkgeworICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcDsKKyAgICB9CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KK307CitGWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXIoCisgICAgYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLAorICAgIEZYX0RXT1JEIGNvbG9yLAorICAgIEZYX0JPT0wgYkZ1bGxDb3ZlciwKKyAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAorICAgIGludCBhbHBoYV9mbGFnLAorICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgQ0ZYX0RJQml0bWFwKiBwdCA9IGJHcm91cEtub2Nrb3V0ID8gbV9wT3JpRGV2aWNlIDogTlVMTDsKKyAgQ0ZYX1JlbmRlcmVyIHJlbmRlcjsKKyAgaWYgKCFyZW5kZXIuSW5pdChtX3BCaXRtYXAsIHB0LCBtX3BDbGlwUmduLCBjb2xvciwgYkZ1bGxDb3ZlciwKKyAgICAgICAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGFnZzo6c2NhbmxpbmVfdTggc2NhbmxpbmU7CisgIGFnZzo6cmVuZGVyX3NjYW5saW5lcyhyYXN0ZXJpemVyLCBzY2FubGluZSwgcmVuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgKG1fRmlsbEZsYWdzICYgRlhGSUxMX05PUEFUSFNNT09USCkgIT0gMCk7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLApAQCAtMTEzMiw0OTUgKzEyMTgsNTk4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChHZXRCdWZmZXIoKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgbV9GaWxsRmxhZ3MgPSBmaWxsX21vZGU7CisgIGlmICgoZmlsbF9tb2RlICYgMykgJiYgZmlsbF9jb2xvcikgeworICAgIENBZ2dfUGF0aERhdGEgcGF0aF9kYXRhOworICAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7CisgICAgYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhIHJhc3Rlcml6ZXI7CisgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOworICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGgocGF0aF9kYXRhLm1fUGF0aERhdGEpOworICAgIHJhc3Rlcml6ZXIuZmlsbGluZ19ydWxlKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFnZzo6ZmlsbF9ub25femVybworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFnZzo6ZmlsbF9ldmVuX29kZCk7CisgICAgaWYgKCFSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXIsIGZpbGxfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBpbnQgc3Ryb2tlX2FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX0Eoc3Ryb2tlX2NvbG9yKTsKKyAgaWYgKHBHcmFwaFN0YXRlICYmIHN0cm9rZV9hbHBoYSkgeworICAgIGlmIChmaWxsX21vZGUgJiBGWF9aRVJPQVJFQV9GSUxMKSB7CisgICAgICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKKyAgICAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7CisgICAgICBhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEgcmFzdGVyaXplcjsKKyAgICAgIHJhc3Rlcml6ZXIuY2xpcF9ib3goMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOworICAgICAgUmFzdGVyaXplU3Ryb2tlKHJhc3Rlcml6ZXIsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCBOVUxMLCBwR3JhcGhTdGF0ZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7CisgICAgICBpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA8PCA4IHwKKyAgICAgICAgICAgICAgICAgICAgICBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpOworICAgICAgaWYgKCFSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXIsIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBtX2JHcm91cEtub2Nrb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIGlmIChHZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4MSwgbWF0cml4MjsKKyAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICAgIG1hdHJpeDEuYSA9CisgICAgICAgICAgRlhfTUFYKEZYU1lTX2ZhYnMocE9iamVjdDJEZXZpY2UtPmEpLCBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5iKSk7CisgICAgICBtYXRyaXgxLmQgPSBtYXRyaXgxLmE7CisgICAgICBtYXRyaXgyLlNldChwT2JqZWN0MkRldmljZS0+YSAvIG1hdHJpeDEuYSwgcE9iamVjdDJEZXZpY2UtPmIgLyBtYXRyaXgxLmEsCisgICAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+YyAvIG1hdHJpeDEuZCwgcE9iamVjdDJEZXZpY2UtPmQgLyBtYXRyaXgxLmQsCisgICAgICAgICAgICAgICAgICAwLCAwKTsKKyAgICAgIENGWF9BZmZpbmVNYXRyaXggbXRSZXJ2ZXNlOworICAgICAgbXRSZXJ2ZXNlLlNldFJldmVyc2UobWF0cml4Mik7CisgICAgICBtYXRyaXgxID0gKnBPYmplY3QyRGV2aWNlOworICAgICAgbWF0cml4MS5Db25jYXQobXRSZXJ2ZXNlKTsKICAgICB9Ci0gICAgbV9GaWxsRmxhZ3MgPSBmaWxsX21vZGU7Ci0gICAgaWYgKChmaWxsX21vZGUgJiAzKSAmJiBmaWxsX2NvbG9yKSB7Ci0gICAgICAgIENBZ2dfUGF0aERhdGEgcGF0aF9kYXRhOwotICAgICAgICBwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UpOwotICAgICAgICBhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEgcmFzdGVyaXplcjsKLSAgICAgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7Ci0gICAgICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGgocGF0aF9kYXRhLm1fUGF0aERhdGEpOwotICAgICAgICByYXN0ZXJpemVyLmZpbGxpbmdfcnVsZSgoZmlsbF9tb2RlICYgMykgPT0gRlhGSUxMX1dJTkRJTkcgPyBhZ2c6OmZpbGxfbm9uX3plcm8gOiBhZ2c6OmZpbGxfZXZlbl9vZGQpOwotICAgICAgICBpZiAoIVJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplciwgZmlsbF9jb2xvciwgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgRkFMU0UsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KKyAgICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKKyAgICBwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgJm1hdHJpeDEpOworICAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOworICAgIHJhc3Rlcml6ZXIuY2xpcF9ib3goMC4wZiwgMC4wZiwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKKyAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsICZtYXRyaXgyLCBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4MS5hLCBGQUxTRSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7CisgICAgaW50IGZpbGxfZmxhZyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPDwgOCB8CisgICAgICAgICAgICAgICAgICAgIEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZyk7CisgICAgaWYgKCFSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXIsIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgbV9iR3JvdXBLbm9ja291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpbnQgc3Ryb2tlX2FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShzdHJva2VfY29sb3IpOwotICAgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYWxwaGEpIHsKLSAgICAgICAgaWYgKGZpbGxfbW9kZSAmIEZYX1pFUk9BUkVBX0ZJTEwpIHsKLSAgICAgICAgICAgIENBZ2dfUGF0aERhdGEgcGF0aF9kYXRhOwotICAgICAgICAgICAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlKTsKLSAgICAgICAgICAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwotICAgICAgICAgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7Ci0gICAgICAgICAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIE5VTEwsIHBHcmFwaFN0YXRlLCAxLCBGQUxTRSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7Ci0gICAgICAgICAgICBpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA8PCA4IHwgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKLSAgICAgICAgICAgIGlmICghUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIG1fYkdyb3VwS25vY2tvdXQsIGZpbGxfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDEsIG1hdHJpeDI7Ci0gICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICAgICAgbWF0cml4MS5hID0gRlhfTUFYKEZYU1lTX2ZhYnMocE9iamVjdDJEZXZpY2UtPmEpLCBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5iKSk7Ci0gICAgICAgICAgICBtYXRyaXgxLmQgPSBtYXRyaXgxLmE7Ci0gICAgICAgICAgICBtYXRyaXgyLlNldChwT2JqZWN0MkRldmljZS0+YSAvIG1hdHJpeDEuYSwgcE9iamVjdDJEZXZpY2UtPmIgLyBtYXRyaXgxLmEsCi0gICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+YyAvIG1hdHJpeDEuZCwgcE9iamVjdDJEZXZpY2UtPmQgLyBtYXRyaXgxLmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbXRSZXJ2ZXNlOwotICAgICAgICAgICAgbXRSZXJ2ZXNlLlNldFJldmVyc2UobWF0cml4Mik7Ci0gICAgICAgICAgICBtYXRyaXgxID0gKnBPYmplY3QyRGV2aWNlOwotICAgICAgICAgICAgbWF0cml4MS5Db25jYXQobXRSZXJ2ZXNlKTsKLSAgICAgICAgfQotICAgICAgICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKLSAgICAgICAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsICZtYXRyaXgxKTsKLSAgICAgICAgYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhIHJhc3Rlcml6ZXI7Ci0gICAgICAgIHJhc3Rlcml6ZXIuY2xpcF9ib3goMC4wZiwgMC4wZiwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOwotICAgICAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsICZtYXRyaXgyLCBwR3JhcGhTdGF0ZSwgbWF0cml4MS5hLCBGQUxTRSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7Ci0gICAgICAgIGludCBmaWxsX2ZsYWcgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpIDw8IDggfCBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpOwotICAgICAgICBpZiAoIVJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBtX2JHcm91cEtub2Nrb3V0LCBmaWxsX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIFJnYkJ5dGVPcmRlclNldFBpeGVsKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IHgsIGludCB5LCBGWF9EV09SRCBhcmdiKQotewotICAgIGlmICh4IDwgMCB8fCB4ID49IHBCaXRtYXAtPkdldFdpZHRoKCkgfHwgeSA8IDAgfHwgeSA+PSBwQml0bWFwLT5HZXRIZWlnaHQoKSkgewotICAgICAgICByZXR1cm47Cit2b2lkIFJnYkJ5dGVPcmRlclNldFBpeGVsKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IHgsIGludCB5LCBGWF9EV09SRCBhcmdiKSB7CisgIGlmICh4IDwgMCB8fCB4ID49IHBCaXRtYXAtPkdldFdpZHRoKCkgfHwgeSA8IDAgfHwgeSA+PSBwQml0bWFwLT5HZXRIZWlnaHQoKSkgeworICAgIHJldHVybjsKKyAgfQorICB1aW50OF90KiBwb3MgPSAodWludDhfdCopcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyB5ICogcEJpdG1hcC0+R2V0UGl0Y2goKSArCisgICAgICAgICAgICAgICAgIHggKiBwQml0bWFwLT5HZXRCUFAoKSAvIDg7CisgIGlmIChwQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7CisgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKHBvcywgQXJnYkdhbW1hKGFyZ2IpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgYWxwaGEgPSBGWEFSR0JfQShhcmdiKTsKKyAgICBwb3NbMF0gPSAoRlhBUkdCX1IoYXJnYikgKiBhbHBoYSArIHBvc1swXSAqICgyNTUgLSBhbHBoYSkpIC8gMjU1OworICAgIHBvc1sxXSA9IChGWEFSR0JfRyhhcmdiKSAqIGFscGhhICsgcG9zWzFdICogKDI1NSAtIGFscGhhKSkgLyAyNTU7CisgICAgcG9zWzJdID0gKEZYQVJHQl9CKGFyZ2IpICogYWxwaGEgKyBwb3NbMl0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKKyAgfQorfQordm9pZCBSZ2JCeXRlT3JkZXJDb21wb3NpdGVSZWN0KENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYikgeworICBpbnQgc3JjX2FscGhhID0gRlhBUkdCX0EoYXJnYik7CisgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCk7CisgIHJlY3QuSW50ZXJzZWN0KDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKKyAgd2lkdGggPSByZWN0LldpZHRoKCk7CisgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpLCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpLCBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOworICBpbnQgQnBwID0gcEJpdG1hcC0+R2V0QlBQKCkgLyA4OworICBGWF9CT09MIGJBbHBoYSA9IHBCaXRtYXAtPkhhc0FscGhhKCk7CisgIGludCBkaWJfYXJnYiA9IEZYQVJHQl9UT0JHUk9SREVSRElCKGFyZ2IpOworICB1aW50OF90KiBwQnVmZmVyID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7CisgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgICBwQnVmZmVyICsgcm93ICogcEJpdG1hcC0+R2V0UGl0Y2goKSArIHJlY3QubGVmdCAqIEJwcDsKKyAgICAgIGlmIChCcHAgPT0gNCkgeworICAgICAgICBGWF9EV09SRCogc2NhbiA9IChGWF9EV09SRCopZGVzdF9zY2FuOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqc2NhbisrID0gZGliX2FyZ2I7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOworICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIHVpbnQ4X3QqIHBvcyA9ICh1aW50OF90KilwQml0bWFwLT5HZXRCdWZmZXIoKSArIHkgKiBwQml0bWFwLT5HZXRQaXRjaCgpICsgeCAqIHBCaXRtYXAtPkdldEJQUCgpIC8gODsKLSAgICBpZiAocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgewotICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIocG9zLCBBcmdiR2FtbWEoYXJnYikpOworICAgIHJldHVybjsKKyAgfQorICBzcmNfciA9IEZYX0dBTU1BKHNyY19yKTsKKyAgc3JjX2cgPSBGWF9HQU1NQShzcmNfZyk7CisgIHNyY19iID0gRlhfR0FNTUEoc3JjX2IpOworICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gcEJ1ZmZlciArIHJvdyAqIHBCaXRtYXAtPkdldFBpdGNoKCkgKyByZWN0LmxlZnQgKiBCcHA7CisgICAgaWYgKGJBbHBoYSkgeworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgc3JjX3IsIHNyY19nLCBzcmNfYikpOworICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBpbnQgYWxwaGEgPSBGWEFSR0JfQShhcmdiKTsKLSAgICAgICAgcG9zWzBdID0gKEZYQVJHQl9SKGFyZ2IpICogYWxwaGEgKyBwb3NbMF0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKLSAgICAgICAgcG9zWzFdID0gKEZYQVJHQl9HKGFyZ2IpICogYWxwaGEgKyBwb3NbMV0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKLSAgICAgICAgcG9zWzJdID0gKEZYQVJHQl9CKGFyZ2IpICogYWxwaGEgKyBwb3NbMl0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKCpkZXN0X3NjYW4pLCBzcmNfciwgc3JjX2FscGhhKSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKCpkZXN0X3NjYW4pLCBzcmNfZywgc3JjX2FscGhhKSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKCpkZXN0X3NjYW4pLCBzcmNfYiwgc3JjX2FscGhhKSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBpZiAoQnBwID09IDQpIHsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KKyAgfQogfQotdm9pZCBSZ2JCeXRlT3JkZXJDb21wb3NpdGVSZWN0KENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhfQVJHQiBhcmdiKQotewotICAgIGludCBzcmNfYWxwaGEgPSBGWEFSR0JfQShhcmdiKTsKLSAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCk7Ci0gICAgcmVjdC5JbnRlcnNlY3QoMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwotICAgIHdpZHRoID0gcmVjdC5XaWR0aCgpOwotICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpLCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpLCBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOwotICAgIGludCBCcHAgPSBwQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgRlhfQk9PTCBiQWxwaGEgPSBwQml0bWFwLT5IYXNBbHBoYSgpOwotICAgIGludCBkaWJfYXJnYiA9IEZYQVJHQl9UT0JHUk9SREVSRElCKGFyZ2IpOwotICAgIHVpbnQ4X3QqIHBCdWZmZXIgPSBwQml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewotICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gcEJ1ZmZlciArIHJvdyAqIHBCaXRtYXAtPkdldFBpdGNoKCkgKyByZWN0LmxlZnQgKiBCcHA7Ci0gICAgICAgICAgICBpZiAoQnBwID09IDQpIHsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCogc2NhbiA9IChGWF9EV09SRCopZGVzdF9zY2FuOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKnNjYW4gKysgPSBkaWJfYXJnYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IHNyY19yOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX2c7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBzcmNfYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Cit2b2lkIFJnYkJ5dGVPcmRlclRyYW5zZmVyQml0bWFwKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApIHsKKyAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBwQml0bWFwLT5HZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRXaWR0aCgpLCBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHNyY190b3AsIE5VTEwpOworICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgQnBwID0gcEJpdG1hcC0+R2V0QlBQKCkgLyA4OworICBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQgPSBwQml0bWFwLT5HZXRGb3JtYXQoKTsKKyAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKTsKKyAgaW50IHBpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKKyAgdWludDhfdCogYnVmZmVyID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7CisgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0KSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gYnVmZmVyICsgKGRlc3RfdG9wICsgcm93KSAqIHBpdGNoICsgZGVzdF9sZWZ0ICogQnBwOworICAgICAgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAgICh1aW50OF90KilwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogQnBwOworICAgICAgaWYgKEJwcCA9PSA0KSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfc2NhblszXSwgc3JjX3NjYW5bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuWzFdLCBzcmNfc2NhblsyXSkpOworICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgIHNyY19zY2FuICs9IDQ7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzcmNfciA9IEZYX0dBTU1BKHNyY19yKTsKLSAgICBzcmNfZyA9IEZYX0dBTU1BKHNyY19nKTsKLSAgICBzcmNfYiA9IEZYX0dBTU1BKHNyY19iKTsKLSAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewotICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBwQnVmZmVyICsgcm93ICogcEJpdG1hcC0+R2V0UGl0Y2goKSArIHJlY3QubGVmdCAqIEJwcDsKLSAgICAgICAgaWYgKGJBbHBoYSkgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgc3JjX3IsIHNyY19nLCBzcmNfYikpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQSgqZGVzdF9zY2FuKSwgc3JjX3IsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKCpkZXN0X3NjYW4pLCBzcmNfZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoKmRlc3Rfc2NhbiksIHNyY19iLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICAgICBpZiAoQnBwID09IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMl07CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLX0KLXZvaWQgUmdiQnl0ZU9yZGVyVHJhbnNmZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCkKLXsKLSAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcEJpdG1hcC0+R2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBOVUxMKTsKLSAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBCcHAgPSBwQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0ID0gcEJpdG1hcC0+R2V0Rm9ybWF0KCk7Ci0gICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKTsKLSAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwotICAgIHVpbnQ4X3QqIGJ1ZmZlciA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0KSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBidWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogcGl0Y2ggKyBkZXN0X2xlZnQgKiBCcHA7Ci0gICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiA9ICh1aW50OF90KilwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogQnBwOwotICAgICAgICAgICAgaWYgKEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX3NjYW5bM10sIHNyY19zY2FuWzBdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMl0pKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzJdOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIHJldHVybjsKKyAgfQorICB1aW50OF90KiBkZXN0X2J1ZiA9IGJ1ZmZlciArIGRlc3RfdG9wICogcGl0Y2ggKyBkZXN0X2xlZnQgKiBCcHA7CisgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl9SZ2IpIHsKKyAgICBpZiAoc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IzMikgeworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIHBpdGNoOworICAgICAgICB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgICAodWludDhfdCopcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIDQ7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzJdOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzFdOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzBdOworICAgICAgICAgIHNyY19zY2FuICs9IDQ7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50OF90KiBkZXN0X2J1ZiA9IGJ1ZmZlciArIGRlc3RfdG9wICogcGl0Y2ggKyBkZXN0X2xlZnQgKiBCcHA7Ci0gICAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX1JnYikgewotICAgICAgICBpZiAoc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IzMikgewotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIHBpdGNoOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gKHVpbnQ4X3QqKXBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMl07Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBU1NFUlQoRkFMU0UpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl9BcmdiIHx8IGRlc3RfZm9ybWF0ID09IEZYRElCX1JnYjMyKSB7Ci0gICAgICAgIGlmIChzcmNfZm9ybWF0ID09IEZYRElCX1JnYikgewotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopKGRlc3RfYnVmICsgcm93ICogcGl0Y2gpOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gKHVpbnQ4X3QqKXBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiAzOwotICAgICAgICAgICAgICAgIGlmIChzcmNfZm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKDB4ZmYsIEZYX0dBTU1BKHNyY19zY2FuWzBdKSwgRlhfR0FNTUEoc3JjX3NjYW5bMV0pLCBGWF9HQU1NQShzcmNfc2NhblsyXSkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblswXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzJdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IzMikgewotICAgICAgICAgICAgQVNTRVJUKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IpOwotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIHBpdGNoOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gKHVpbnQ4X3QqKShwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblswXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzJdKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICArPSA0OwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgQVNTRVJUKEZBTFNFKTsKICAgICB9Ci19Ci1GWF9BUkdCIF9EZWZhdWx0Q01ZSzJBUkdCKEZYX0NNWUsgY215aywgdWludDhfdCBhbHBoYSkKLXsKLSAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjbXlrKSwgRlhTWVNfR2V0TVZhbHVlKGNteWspLCBGWFNZU19HZXRZVmFsdWUoY215ayksIEZYU1lTX0dldEtWYWx1ZShjbXlrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYik7Ci0gICAgcmV0dXJuIEFyZ2JFbmNvZGUoYWxwaGEsIHIsIGcsIGIpOwotfQotRlhfQk9PTCBfRGliU2V0UGl4ZWwoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBGWF9CT09MIGJPYmpDTVlLID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTsKLSAgICBpbnQgYWxwaGEgPSBiT2JqQ01ZSyA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgY29sb3IgPSBiT2JqQ01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJmNvbG9yLCAodWludDhfdCopJmNvbG9yLCAxKTsKLSAgICAgICAgY29sb3IgPSBiT2JqQ01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICBpZiAoIXBEZXZpY2UtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIGNvbG9yID0gKGNvbG9yICYgMHhmZmZmZmYpIHwgKGFscGhhIDw8IDI0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwRGV2aWNlLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBpZiAoIWJPYmpDTVlLKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQorICB9IGVsc2UgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IgfHwgZGVzdF9mb3JtYXQgPT0gRlhESUJfUmdiMzIpIHsKKyAgICBpZiAoc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IpIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gKHVpbnQ4X3QqKShkZXN0X2J1ZiArIHJvdyAqIHBpdGNoKTsKKyAgICAgICAgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAgICAgKHVpbnQ4X3QqKXBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiAzOworICAgICAgICBpZiAoc3JjX2Zvcm1hdCA9PSBGWERJQl9BcmdiKSB7CisgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoMHhmZiwgRlhfR0FNTUEoc3JjX3NjYW5bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0dBTU1BKHNyY19zY2FuWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9HQU1NQShzcmNfc2NhblsyXSkpKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYk9iakNNWUspIHsKLSAgICAgICAgICAgICAgICBjb2xvciA9IF9EZWZhdWx0Q01ZSzJBUkdCKGNvbG9yLCBhbHBoYSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoMHhmZiwgc3JjX3NjYW5bMF0sIHNyY19zY2FuWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuWzJdKSk7CisgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgfQogICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzcmNfZm9ybWF0ID09IEZYRElCX1JnYjMyKSB7CisgICAgICBBU1NFUlQoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYik7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogcGl0Y2g7CisgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICAgICh1aW50OF90KikocFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIDQpOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoMHhmZiwgc3JjX3NjYW5bMF0sIHNyY19zY2FuWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhblsyXSkpOworICAgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgcERldmljZS0+U2V0UGl4ZWwoeCwgeSwgY29sb3IpOwotICAgIGlmIChwRGV2aWNlLT5tX3BBbHBoYU1hc2spIHsKLSAgICAgICAgcERldmljZS0+bV9wQWxwaGFNYXNrLT5TZXRQaXhlbCh4LCB5LCBhbHBoYSA8PCAyNCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIEFTU0VSVChGQUxTRSk7CisgIH0KIH0KLUZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8ICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewotICAgICAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fcENsaXBSZ24gPT0gTlVMTCkgewotICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgICAgICBSZ2JCeXRlT3JkZXJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBfRGliU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fcENsaXBSZ24tPkdldEJveCgpLkNvbnRhaW5zKHgsIHkpKSB7Ci0gICAgICAgIGlmIChtX3BDbGlwUmduLT5HZXRUeXBlKCkgPT0gQ0ZYX0NsaXBSZ246OlJlY3RJKSB7Ci0gICAgICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgUmdiQnl0ZU9yZGVyU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCBjb2xvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBfRGliU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRikgewotICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKLSAgICAgICAgICAgIEZYX0JPT0wgYkNNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOwotICAgICAgICAgICAgaW50IG5ld19hbHBoYSA9IGJDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7Ci0gICAgICAgICAgICBuZXdfYWxwaGEgPSBuZXdfYWxwaGEgKiBwTWFzay0+R2V0U2NhbmxpbmUoeSlbeF0gLyAyNTU7Ci0gICAgICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgUmdiQnl0ZU9yZGVyU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCAoY29sb3IgJiAweGZmZmZmZikgfCAobmV3X2FscGhhIDw8IDI0KSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYkNNWUspIHsKLSAgICAgICAgICAgICAgICBGWFNFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnLCBuZXdfYWxwaGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2xvciA9IChjb2xvciAmIDB4ZmZmZmZmKSB8IChuZXdfYWxwaGEgPDwgMjQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9EaWJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKK0ZYX0FSR0IgX0RlZmF1bHRDTVlLMkFSR0IoRlhfQ01ZSyBjbXlrLCB1aW50OF90IGFscGhhKSB7CisgIHVpbnQ4X3QgciwgZywgYjsKKyAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjbXlrKSwgRlhTWVNfR2V0TVZhbHVlKGNteWspLAorICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNteWspLCBGWFNZU19HZXRLVmFsdWUoY215ayksIHIsIGcsIGIpOworICByZXR1cm4gQXJnYkVuY29kZShhbHBoYSwgciwgZywgYik7CiB9Ci1GWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCi17Ci0gICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7CitGWF9CT09MIF9EaWJTZXRQaXhlbChDRlhfRElCaXRtYXAqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgRlhfQk9PTCBiT2JqQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgIGludCBhbHBoYSA9IGJPYmpDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIGNvbG9yID0gYk9iakNNWUsgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KikmY29sb3IsIDEpOworICAgIGNvbG9yID0gYk9iakNNWUsgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICBpZiAoIXBEZXZpY2UtPklzQ215a0ltYWdlKCkpIHsKKyAgICAgIGNvbG9yID0gKGNvbG9yICYgMHhmZmZmZmYpIHwgKGFscGhhIDw8IDI0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHBEZXZpY2UtPklzQ215a0ltYWdlKCkpIHsKKyAgICAgIGlmICghYk9iakNNWUspIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBGWF9SRUNUIGNsaXBfcmVjdDsKLSAgICBHZXRDbGlwQm94KCZjbGlwX3JlY3QpOwotICAgIEZYX1JFQ1QgZHJhd19yZWN0ID0gY2xpcF9yZWN0OwotICAgIGlmIChwUmVjdCkgewotICAgICAgICBkcmF3X3JlY3QuSW50ZXJzZWN0KCpwUmVjdCk7Ci0gICAgfQotICAgIGlmIChkcmF3X3JlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAobV9wQ2xpcFJnbiA9PSBOVUxMIHx8IG1fcENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKLSAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICAgICAgUmdiQnl0ZU9yZGVyQ29tcG9zaXRlUmVjdChtX3BCaXRtYXAsIGRyYXdfcmVjdC5sZWZ0LCBkcmF3X3JlY3QudG9wLCBkcmF3X3JlY3QuV2lkdGgoKSwgZHJhd19yZWN0LkhlaWdodCgpLCBmaWxsX2NvbG9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcEJpdG1hcC0+Q29tcG9zaXRlUmVjdChkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwgZHJhd19yZWN0LldpZHRoKCksIGRyYXdfcmVjdC5IZWlnaHQoKSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIG1fcEJpdG1hcC0+Q29tcG9zaXRlTWFzayhkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwgZHJhd19yZWN0LldpZHRoKCksIGRyYXdfcmVjdC5IZWlnaHQoKSwgKGNvbnN0IENGWF9ESUJpdG1hcCopbV9wQ2xpcFJnbi0+R2V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yLCBkcmF3X3JlY3QubGVmdCAtIGNsaXBfcmVjdC5sZWZ0LCBkcmF3X3JlY3QudG9wIC0gY2xpcF9yZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KQotewotICAgIGlmIChtX3BDbGlwUmduID09IE5VTEwpIHsKLSAgICAgICAgcFJlY3QtPmxlZnQgPSBwUmVjdC0+dG9wID0gMDsKLSAgICAgICAgcFJlY3QtPnJpZ2h0ID0gR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKTsKLSAgICAgICAgcFJlY3QtPmJvdHRvbSA9IEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgKnBSZWN0ID0gbV9wQ2xpcFJnbi0+R2V0Qm94KCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBGWF9CT09MIGJERWRnZSkKLXsKLSAgICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoYkRFZGdlKSB7Ci0gICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgICAgICAgIFJnYkJ5dGVPcmRlclRyYW5zZmVyQml0bWFwKHBCaXRtYXAsIDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBtX3BCaXRtYXAsIGxlZnQsIHRvcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcEJpdG1hcC0+VHJhbnNmZXJCaXRtYXAoMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksIG1fcEJpdG1hcCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHBCaXRtYXAtPkdldFdpZHRoKCksIHRvcCArIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgICBDRlhfRElCaXRtYXAgKnBCYWNrID0gTlVMTDsKLSAgICBpZiAobV9wT3JpRGV2aWNlKSB7Ci0gICAgICAgIHBCYWNrID0gbV9wT3JpRGV2aWNlLT5DbG9uZSgmcmVjdCk7Ci0gICAgICAgIGlmICghcEJhY2spIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHBCYWNrLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcEJhY2stPkdldFdpZHRoKCksIHBCYWNrLT5HZXRIZWlnaHQoKSwgbV9wQml0bWFwLCAwLCAwKTsKKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBwQmFjayA9IG1fcEJpdG1hcC0+Q2xvbmUoJnJlY3QpOworICAgICAgaWYgKGJPYmpDTVlLKSB7CisgICAgICAgIGNvbG9yID0gX0RlZmF1bHRDTVlLMkFSR0IoY29sb3IsIGFscGhhKTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFwQmFjaykgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfQk9PTCBiUmV0ID0gVFJVRTsKLSAgICBsZWZ0ID0gbGVmdCA+PSAwID8gMCA6IGxlZnQ7Ci0gICAgdG9wID0gdG9wID49IDAgPyAwIDogdG9wOworICB9CisgIHBEZXZpY2UtPlNldFBpeGVsKHgsIHksIGNvbG9yKTsKKyAgaWYgKHBEZXZpY2UtPm1fcEFscGhhTWFzaykgeworICAgIHBEZXZpY2UtPm1fcEFscGhhTWFzay0+U2V0UGl4ZWwoeCwgeSwgYWxwaGEgPDwgMjQpOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRQaXhlbChpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8CisgICAgICAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKKyAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKKyAgfQorICBpZiAobV9wQ2xpcFJnbiA9PSBOVUxMKSB7CiAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICBSZ2JCeXRlT3JkZXJUcmFuc2ZlckJpdG1hcChwQml0bWFwLCAwLCAwLCByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIHBCYWNrLCBsZWZ0LCB0b3ApOworICAgICAgUmdiQnl0ZU9yZGVyU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCBjb2xvcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYlJldCA9IHBCaXRtYXAtPlRyYW5zZmVyQml0bWFwKDAsIDAsIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgcEJhY2ssIGxlZnQsIHRvcCwgcEljY1RyYW5zZm9ybSk7CisgICAgICByZXR1cm4gX0RpYlNldFBpeGVsKG1fcEJpdG1hcCwgeCwgeSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogICAgIH0KLSAgICBkZWxldGUgcEJhY2s7Ci0gICAgcmV0dXJuIGJSZXQ7Ci19Ci1GWF9CT09MCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgeworICB9IGVsc2UgaWYgKG1fcENsaXBSZ24tPkdldEJveCgpLkNvbnRhaW5zKHgsIHkpKSB7CisgICAgaWYgKG1fcENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKKyAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICAgICAgUmdiQnl0ZU9yZGVyU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCBjb2xvcik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gX0RpYlNldFBpeGVsKG1fcEJpdG1hcCwgeCwgeSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICAgICAgfQorICAgIH0gZWxzZSBpZiAobV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRikgeworICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKKyAgICAgIEZYX0JPT0wgYkNNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOworICAgICAgaW50IG5ld19hbHBoYSA9CisgICAgICAgICAgYkNNWUsgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKKyAgICAgIG5ld19hbHBoYSA9IG5ld19hbHBoYSAqIHBNYXNrLT5HZXRTY2FubGluZSh5KVt4XSAvIDI1NTsKKyAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICAgICAgUmdiQnl0ZU9yZGVyU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3IgJiAweGZmZmZmZikgfCAobmV3X2FscGhhIDw8IDI0KSk7CiAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgaWYgKGJDTVlLKSB7CisgICAgICAgIEZYU0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcsIG5ld19hbHBoYSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb2xvciA9IChjb2xvciAmIDB4ZmZmZmZmKSB8IChuZXdfYWxwaGEgPDwgMjQpOworICAgICAgfQorICAgICAgcmV0dXJuIF9EaWJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKICAgICB9Ci0gICAgaWYgKHBCaXRtYXAtPklzQWxwaGFNYXNrKCkpCi0gICAgICAgIHJldHVybiBtX3BCaXRtYXAtPkNvbXBvc2l0ZU1hc2sobGVmdCwgdG9wLCBwU3JjUmVjdC0+V2lkdGgoKSwgcFNyY1JlY3QtPkhlaWdodCgpLCBwQml0bWFwLCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWN0LT5sZWZ0LCBwU3JjUmVjdC0+dG9wLCBibGVuZF90eXBlLCBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgIHJldHVybiBtX3BCaXRtYXAtPkNvbXBvc2l0ZUJpdG1hcChsZWZ0LCB0b3AsIHBTcmNSZWN0LT5XaWR0aCgpLCBwU3JjUmVjdC0+SGVpZ2h0KCksIHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWN0LT5sZWZ0LCBwU3JjUmVjdC0+dG9wLCBibGVuZF90eXBlLCBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsIHBJY2NUcmFuc2Zvcm0pOworICB9CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGFyZ2IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChkZXN0X3dpZHRoID09IHBTb3VyY2UtPkdldFdpZHRoKCkgJiYgZGVzdF9oZWlnaHQgPT0gcFNvdXJjZS0+R2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgRlhfUkVDVCByZWN0KDAsIDAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIFNldERJQml0cyhwU291cmNlLCBhcmdiLCAmcmVjdCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgYmxlbmRfdHlwZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgfQotICAgIEZYX1JFQ1QgZGVzdF9yZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3RfbGVmdCArIGRlc3Rfd2lkdGgsIGRlc3RfdG9wICsgZGVzdF9oZWlnaHQpOwotICAgIGRlc3RfcmVjdC5Ob3JtYWxpemUoKTsKLSAgICBGWF9SRUNUIGRlc3RfY2xpcCA9IGRlc3RfcmVjdDsKLSAgICBkZXN0X2NsaXAuSW50ZXJzZWN0KCpwQ2xpcFJlY3QpOwotICAgIENGWF9CaXRtYXBDb21wb3NlciBjb21wb3NlcjsKLSAgICBjb21wb3Nlci5Db21wb3NlKG1fcEJpdG1hcCwgbV9wQ2xpcFJnbiwgMjU1LCBhcmdiLCBkZXN0X2NsaXAsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7Ci0gICAgZGVzdF9jbGlwLk9mZnNldCgtZGVzdF9yZWN0LmxlZnQsIC1kZXN0X3JlY3QudG9wKTsKLSAgICBDRlhfSW1hZ2VTdHJldGNoZXIgc3RyZXRjaGVyOwotICAgIGlmIChzdHJldGNoZXIuU3RhcnQoJmNvbXBvc2VyLCBwU291cmNlLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgZGVzdF9jbGlwLCBmbGFncykpIHsKLSAgICAgICAgc3RyZXRjaGVyLkNvbnRpbnVlKE5VTEwpOworRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgRlhfUkVDVCBjbGlwX3JlY3Q7CisgIEdldENsaXBCb3goJmNsaXBfcmVjdCk7CisgIEZYX1JFQ1QgZHJhd19yZWN0ID0gY2xpcF9yZWN0OworICBpZiAocFJlY3QpIHsKKyAgICBkcmF3X3JlY3QuSW50ZXJzZWN0KCpwUmVjdCk7CisgIH0KKyAgaWYgKGRyYXdfcmVjdC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAobV9wQ2xpcFJnbiA9PSBOVUxMIHx8IG1fcENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKKyAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgICBSZ2JCeXRlT3JkZXJDb21wb3NpdGVSZWN0KG1fcEJpdG1hcCwgZHJhd19yZWN0LmxlZnQsIGRyYXdfcmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdfcmVjdC5XaWR0aCgpLCBkcmF3X3JlY3QuSGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfY29sb3IpOworICAgIH0gZWxzZSB7CisgICAgICBtX3BCaXRtYXAtPkNvbXBvc2l0ZVJlY3QoZHJhd19yZWN0LmxlZnQsIGRyYXdfcmVjdC50b3AsIGRyYXdfcmVjdC5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdfcmVjdC5IZWlnaHQoKSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgbV9wQml0bWFwLT5Db21wb3NpdGVNYXNrKAorICAgICAgZHJhd19yZWN0LmxlZnQsIGRyYXdfcmVjdC50b3AsIGRyYXdfcmVjdC5XaWR0aCgpLCBkcmF3X3JlY3QuSGVpZ2h0KCksCisgICAgICAoY29uc3QgQ0ZYX0RJQml0bWFwKiltX3BDbGlwUmduLT5HZXRNYXNrKCksIGZpbGxfY29sb3IsCisgICAgICBkcmF3X3JlY3QubGVmdCAtIGNsaXBfcmVjdC5sZWZ0LCBkcmF3X3JlY3QudG9wIC0gY2xpcF9yZWN0LnRvcCwKKyAgICAgIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGFyZ2IsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENGWF9JbWFnZVJlbmRlcmVyKiBwUmVuZGVyZXIgPSBGWF9ORVcgQ0ZYX0ltYWdlUmVuZGVyZXI7Ci0gICAgaWYgKCFwUmVuZGVyZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwUmVuZGVyZXItPlN0YXJ0KG1fcEJpdG1hcCwgbV9wQ2xpcFJnbiwgcFNvdXJjZSwgYml0bWFwX2FscGhhLCBhcmdiLCBwTWF0cml4LCByZW5kZXJfZmxhZ3MsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgaGFuZGxlID0gcFJlbmRlcmVyOworRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSB7CisgIGlmIChtX3BDbGlwUmduID09IE5VTEwpIHsKKyAgICBwUmVjdC0+bGVmdCA9IHBSZWN0LT50b3AgPSAwOworICAgIHBSZWN0LT5yaWdodCA9IEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCk7CisgICAgcFJlY3QtPmJvdHRvbSA9IEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpOwogICAgIHJldHVybiBUUlVFOworICB9CisgICpwUmVjdCA9IG1fcENsaXBSZ24tPkdldEJveCgpOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6Q29udGludWVESUJpdHModm9pZCogcEhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuICgoQ0ZYX0ltYWdlUmVuZGVyZXIqKXBIYW5kbGUpLT5Db250aW51ZShwUGF1c2UpOwotfQotdm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpDYW5jZWxESUJpdHModm9pZCogcEhhbmRsZSkKLXsKLSAgICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZGVsZXRlIChDRlhfSW1hZ2VSZW5kZXJlciopcEhhbmRsZTsKLX0KLUNGWF9GeGdlRGV2aWNlOjpDRlhfRnhnZURldmljZSgpCi17Ci0gICAgbV9iT3duZWRCaXRtYXAgPSBGQUxTRTsKLX0KLUZYX0JPT0wgQ0ZYX0Z4Z2VEZXZpY2U6OkF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpCi17Ci0gICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIFNldEJpdG1hcChwQml0bWFwKTsKLSAgICBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gRlhfTkVXIENGWF9BZ2dEZXZpY2VEcml2ZXIocEJpdG1hcCwgZGl0aGVyX2JpdHMsIGJSZ2JCeXRlT3JkZXIsIHBPcmlEZXZpY2UsIGJHcm91cEtub2Nrb3V0KTsKLSAgICBpZiAoIXBEcml2ZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7CitGWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiREVkZ2UpIHsKKyAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewogICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRnhnZURldmljZTo6Q3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCwgaW50IGRpdGhlcl9iaXRzLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UpCi17Ci0gICAgbV9iT3duZWRCaXRtYXAgPSBUUlVFOwotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFwQml0bWFwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoYkRFZGdlKSB7CisgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgICAgUmdiQnl0ZU9yZGVyVHJhbnNmZXJCaXRtYXAocEJpdG1hcCwgMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEhlaWdodCgpLCBtX3BCaXRtYXAsIGxlZnQsIHRvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBwQml0bWFwLT5UcmFuc2ZlckJpdG1hcCgwLCAwLCBwQml0bWFwLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEhlaWdodCgpLCBtX3BCaXRtYXAsIGxlZnQsIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKICAgICB9Ci0gICAgaWYgKCFwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KSkgewotICAgICAgICBkZWxldGUgcEJpdG1hcDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBTZXRCaXRtYXAocEJpdG1hcCk7Ci0gICAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9IEZYX05FVyBDRlhfQWdnRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBGQUxTRSwgcE9yaURldmljZSwgRkFMU0UpOwotICAgIGlmICghcERyaXZlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKICAgICByZXR1cm4gVFJVRTsKLX0KLUNGWF9GeGdlRGV2aWNlOjp+Q0ZYX0Z4Z2VEZXZpY2UoKQotewotICAgIGlmIChtX2JPd25lZEJpdG1hcCkgewotICAgICAgICBkZWxldGUgR2V0Qml0bWFwKCk7CisgIH0KKyAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHBCaXRtYXAtPkdldFdpZHRoKCksCisgICAgICAgICAgICAgICB0b3AgKyBwQml0bWFwLT5HZXRIZWlnaHQoKSk7CisgIENGWF9ESUJpdG1hcCogcEJhY2sgPSBOVUxMOworICBpZiAobV9wT3JpRGV2aWNlKSB7CisgICAgcEJhY2sgPSBtX3BPcmlEZXZpY2UtPkNsb25lKCZyZWN0KTsKKyAgICBpZiAoIXBCYWNrKSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9CisgICAgcEJhY2stPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBwQmFjay0+R2V0V2lkdGgoKSwgcEJhY2stPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQml0bWFwLCAwLCAwKTsKKyAgfSBlbHNlIHsKKyAgICBwQmFjayA9IG1fcEJpdG1hcC0+Q2xvbmUoJnJlY3QpOworICB9CisgIGlmICghcEJhY2spIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9CT09MIGJSZXQgPSBUUlVFOworICBsZWZ0ID0gbGVmdCA+PSAwID8gMCA6IGxlZnQ7CisgIHRvcCA9IHRvcCA+PSAwID8gMCA6IHRvcDsKKyAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgIFJnYkJ5dGVPcmRlclRyYW5zZmVyQml0bWFwKHBCaXRtYXAsIDAsIDAsIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmFjaywgbGVmdCwgdG9wKTsKKyAgfSBlbHNlIHsKKyAgICBiUmV0ID0gcEJpdG1hcC0+VHJhbnNmZXJCaXRtYXAoMCwgMCwgcmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBwQmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKKyAgfQorICBkZWxldGUgcEJhY2s7CisgIHJldHVybiBiUmV0OworfQorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkKKyAgICByZXR1cm4gbV9wQml0bWFwLT5Db21wb3NpdGVNYXNrKAorICAgICAgICBsZWZ0LCB0b3AsIHBTcmNSZWN0LT5XaWR0aCgpLCBwU3JjUmVjdC0+SGVpZ2h0KCksIHBCaXRtYXAsIGFyZ2IsCisgICAgICAgIHBTcmNSZWN0LT5sZWZ0LCBwU3JjUmVjdC0+dG9wLCBibGVuZF90eXBlLCBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsCisgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICByZXR1cm4gbV9wQml0bWFwLT5Db21wb3NpdGVCaXRtYXAoCisgICAgICBsZWZ0LCB0b3AsIHBTcmNSZWN0LT5XaWR0aCgpLCBwU3JjUmVjdC0+SGVpZ2h0KCksIHBCaXRtYXAsIHBTcmNSZWN0LT5sZWZ0LAorICAgICAgcFNyY1JlY3QtPnRvcCwgYmxlbmRfdHlwZSwgbV9wQ2xpcFJnbiwgbV9iUmdiQnl0ZU9yZGVyLCBwSWNjVHJhbnNmb3JtKTsKK30KK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoZGVzdF93aWR0aCA9PSBwU291cmNlLT5HZXRXaWR0aCgpICYmCisgICAgICBkZXN0X2hlaWdodCA9PSBwU291cmNlLT5HZXRIZWlnaHQoKSkgeworICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7CisgICAgcmV0dXJuIFNldERJQml0cyhwU291cmNlLCBhcmdiLCAmcmVjdCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICB9CisgIEZYX1JFQ1QgZGVzdF9yZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3RfbGVmdCArIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGRlc3RfdG9wICsgZGVzdF9oZWlnaHQpOworICBkZXN0X3JlY3QuTm9ybWFsaXplKCk7CisgIEZYX1JFQ1QgZGVzdF9jbGlwID0gZGVzdF9yZWN0OworICBkZXN0X2NsaXAuSW50ZXJzZWN0KCpwQ2xpcFJlY3QpOworICBDRlhfQml0bWFwQ29tcG9zZXIgY29tcG9zZXI7CisgIGNvbXBvc2VyLkNvbXBvc2UobV9wQml0bWFwLCBtX3BDbGlwUmduLCAyNTUsIGFyZ2IsIGRlc3RfY2xpcCwgRkFMU0UsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgIEZBTFNFLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSk7CisgIGRlc3RfY2xpcC5PZmZzZXQoLWRlc3RfcmVjdC5sZWZ0LCAtZGVzdF9yZWN0LnRvcCk7CisgIENGWF9JbWFnZVN0cmV0Y2hlciBzdHJldGNoZXI7CisgIGlmIChzdHJldGNoZXIuU3RhcnQoJmNvbXBvc2VyLCBwU291cmNlLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgZGVzdF9jbGlwLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSkgeworICAgIHN0cmV0Y2hlci5Db250aW51ZShOVUxMKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcmVuZGVyX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIENGWF9JbWFnZVJlbmRlcmVyKiBwUmVuZGVyZXIgPSBGWF9ORVcgQ0ZYX0ltYWdlUmVuZGVyZXI7CisgIGlmICghcFJlbmRlcmVyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHBSZW5kZXJlci0+U3RhcnQobV9wQml0bWFwLCBtX3BDbGlwUmduLCBwU291cmNlLCBiaXRtYXBfYWxwaGEsIGFyZ2IsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgcmVuZGVyX2ZsYWdzLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICBoYW5kbGUgPSBwUmVuZGVyZXI7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpDb250aW51ZURJQml0cyh2b2lkKiBwSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuICgoQ0ZYX0ltYWdlUmVuZGVyZXIqKXBIYW5kbGUpLT5Db250aW51ZShwUGF1c2UpOworfQordm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpDYW5jZWxESUJpdHModm9pZCogcEhhbmRsZSkgeworICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGRlbGV0ZSAoQ0ZYX0ltYWdlUmVuZGVyZXIqKXBIYW5kbGU7Cit9CitDRlhfRnhnZURldmljZTo6Q0ZYX0Z4Z2VEZXZpY2UoKSB7CisgIG1fYk93bmVkQml0bWFwID0gRkFMU0U7Cit9CitGWF9CT09MIENGWF9GeGdlRGV2aWNlOjpBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXRoZXJfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpIHsKKyAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBTZXRCaXRtYXAocEJpdG1hcCk7CisgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBGWF9ORVcgQ0ZYX0FnZ0RldmljZURyaXZlcigKKyAgICAgIHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBiUmdiQnl0ZU9yZGVyLCBwT3JpRGV2aWNlLCBiR3JvdXBLbm9ja291dCk7CisgIGlmICghcERyaXZlcikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfRnhnZURldmljZTo6Q3JlYXRlKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpdGhlcl9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSkgeworICBtX2JPd25lZEJpdG1hcCA9IFRSVUU7CisgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7CisgIGlmICghcEJpdG1hcCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKSB7CisgICAgZGVsZXRlIHBCaXRtYXA7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIFNldEJpdG1hcChwQml0bWFwKTsKKyAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9IEZYX05FVyBDRlhfQWdnRGV2aWNlRHJpdmVyKAorICAgICAgcEJpdG1hcCwgZGl0aGVyX2JpdHMsIEZBTFNFLCBwT3JpRGV2aWNlLCBGQUxTRSk7CisgIGlmICghcERyaXZlcikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7CisgIHJldHVybiBUUlVFOworfQorQ0ZYX0Z4Z2VEZXZpY2U6On5DRlhfRnhnZURldmljZSgpIHsKKyAgaWYgKG1fYk93bmVkQml0bWFwKSB7CisgICAgZGVsZXRlIEdldEJpdG1hcCgpOworICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuY3BwCmluZGV4IDJkYWQwMTAuLmJhMjAyYWMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuY3BwCkBAIC04LDE5NyArOCwyMDMgQEAKICNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXwogI2luY2x1ZGUgImZwZl9za2lhZm9udC5oIgogI2luY2x1ZGUgImZwZl9za2lhZm9udG1nci5oIgotI2RlZmluZSBGUEZfRU1fQURKVVNUKGVtLCBhKSAoZW0gPT0gMCA/IChhKSA6IChhKSAqIDEwMDAgLyBlbSkKKyNkZWZpbmUgRlBGX0VNX0FESlVTVChlbSwgYSkgKGVtID09IDAgPyAoYSkgOiAoYSkqMTAwMCAvIGVtKQogQ0ZQRl9Ta2lhRm9udDo6Q0ZQRl9Ta2lhRm9udCgpCi0gICAgOiBtX3BGb250TWdyKE5VTEwpCi0gICAgLCBtX3BGb250RGVzKE5VTEwpCi0gICAgLCBtX0ZhY2UoTlVMTCkKLSAgICAsIG1fZHdTdHlsZSgwKQotICAgICwgbV91Q2hhcnNldCgwKQotICAgICwgbV9kd1JlZkNvdW50KDApCi17CisgICAgOiBtX3BGb250TWdyKE5VTEwpLAorICAgICAgbV9wRm9udERlcyhOVUxMKSwKKyAgICAgIG1fRmFjZShOVUxMKSwKKyAgICAgIG1fZHdTdHlsZSgwKSwKKyAgICAgIG1fdUNoYXJzZXQoMCksCisgICAgICBtX2R3UmVmQ291bnQoMCkge30KK0NGUEZfU2tpYUZvbnQ6On5DRlBGX1NraWFGb250KCkgeworICBpZiAobV9GYWNlKSB7CisgICAgRlhGVF9Eb25lX0ZhY2UobV9GYWNlKTsKKyAgfQogfQotQ0ZQRl9Ta2lhRm9udDo6fkNGUEZfU2tpYUZvbnQoKQotewotICAgIGlmIChtX0ZhY2UpIHsKLSAgICAgICAgRlhGVF9Eb25lX0ZhY2UobV9GYWNlKTsKLSAgICB9Cit2b2lkIENGUEZfU2tpYUZvbnQ6OlJlbGVhc2UoKSB7CisgIGlmICgtLW1fZHdSZWZDb3VudCA9PSAwKSB7CisgICAgZGVsZXRlIHRoaXM7CisgIH0KIH0KLXZvaWQgQ0ZQRl9Ta2lhRm9udDo6UmVsZWFzZSgpCi17Ci0gICAgaWYgKC0tbV9kd1JlZkNvdW50ID09IDApIHsKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQorSUZQRl9Gb250KiBDRlBGX1NraWFGb250OjpSZXRhaW4oKSB7CisgIG1fZHdSZWZDb3VudCsrOworICByZXR1cm4gKElGUEZfRm9udCopdGhpczsKIH0KLUlGUEZfRm9udCogQ0ZQRl9Ta2lhRm9udDo6UmV0YWluKCkKLXsKLSAgICBtX2R3UmVmQ291bnQrKzsKLSAgICByZXR1cm4gKElGUEZfRm9udCopdGhpczsKK0ZQRl9IRk9OVCBDRlBGX1NraWFGb250OjpHZXRIYW5kbGUoKSB7CisgIHJldHVybiBOVUxMOwogfQotRlBGX0hGT05UIENGUEZfU2tpYUZvbnQ6OkdldEhhbmRsZSgpCi17Ci0gICAgcmV0dXJuIE5VTEw7CitDRlhfQnl0ZVN0cmluZyBDRlBGX1NraWFGb250OjpHZXRGYW1pbHlOYW1lKCkgeworICBpZiAoIW1fRmFjZSkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhGWEZUX0dldF9GYWNlX0ZhbWlseV9OYW1lKG1fRmFjZSkpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ0ZQRl9Ta2lhRm9udDo6R2V0RmFtaWx5TmFtZSgpCi17Ci0gICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhGWEZUX0dldF9GYWNlX0ZhbWlseV9OYW1lKG1fRmFjZSkpOworQ0ZYX1dpZGVTdHJpbmcgQ0ZQRl9Ta2lhRm9udDo6R2V0UHNOYW1lKCkgeworICBpZiAoIW1fRmFjZSkgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKEZYRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShtX0ZhY2UpKTsKIH0KLUNGWF9XaWRlU3RyaW5nIENGUEZfU2tpYUZvbnQ6OkdldFBzTmFtZSgpCi17Ci0gICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKEZYRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShtX0ZhY2UpKTsKLX0KLWludDMyX3QgQ0ZQRl9Ta2lhRm9udDo6R2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSkKLXsKLSAgICBpZiAoIW1fRmFjZSkgewotICAgICAgICByZXR1cm4gd1VuaWNvZGU7Ci0gICAgfQotICAgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKG1fRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9GYWNlLCB3VW5pY29kZSk7Ci19Ci1pbnQzMl90IENGUEZfU2tpYUZvbnQ6OkdldEdseXBoV2lkdGgoaW50MzJfdCBpR2x5cGhJbmRleCkKLXsKLSAgICBpZiAoIW1fRmFjZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGlHbHlwaEluZGV4LCBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRmFjZSkpOwotfQotaW50MzJfdCBDRlBGX1NraWFGb250OjpHZXRBc2NlbnQoKSBjb25zdAotewotICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZhY2UpKTsKLX0KLWludDMyX3QgQ0ZQRl9Ta2lhRm9udDo6R2V0RGVzY2VudCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihtX0ZhY2UpKTsKLX0KLUZYX0JPT0wgQ0ZQRl9Ta2lhRm9udDo6R2V0R2x5cGhCQm94KGludDMyX3QgaUdseXBoSW5kZXgsIEZYX1JFQ1QgJnJ0QkJveCkKLXsKLSAgICBpZiAoIW1fRmFjZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChGWEZUX0lzX0ZhY2VfVHJpY2t5KG1fRmFjZSkpIHsKLSAgICAgICAgaWYgKEZYRlRfU2V0X0NoYXJfU2l6ZShtX0ZhY2UsIDAsIDEwMDAgKiA2NCwgNzIsIDcyKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBpR2x5cGhJbmRleCwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCkpIHsKLSAgICAgICAgICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYRlRfR2x5cGggZ2x5cGg7Ci0gICAgICAgIGlmIChGWEZUX0dldF9HbHlwaChtX0ZhY2UtPmdseXBoLCAmZ2x5cGgpKSB7Ci0gICAgICAgICAgICBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWEZUX0JCb3ggY2JveDsKLSAgICAgICAgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUywgJmNib3gpOwotICAgICAgICBpbnQzMl90IHhfcHBlbSA9IG1fRmFjZS0+c2l6ZS0+bWV0cmljcy54X3BwZW07Ci0gICAgICAgIGludDMyX3QgeV9wcGVtID0gbV9GYWNlLT5zaXplLT5tZXRyaWNzLnlfcHBlbTsKLSAgICAgICAgcnRCQm94LmxlZnQgPSBGUEZfRU1fQURKVVNUKHhfcHBlbSwgY2JveC54TWluKTsKLSAgICAgICAgcnRCQm94LnJpZ2h0ID0gRlBGX0VNX0FESlVTVCh4X3BwZW0sIGNib3gueE1heCk7Ci0gICAgICAgIHJ0QkJveC50b3AgPSBGUEZfRU1fQURKVVNUKHlfcHBlbSwgY2JveC55TWF4KTsKLSAgICAgICAgcnRCQm94LmJvdHRvbSA9IEZQRl9FTV9BREpVU1QoeV9wcGVtLCBjYm94LnlNaW4pOwotICAgICAgICBydEJCb3gudG9wID0gRlhfTUlOKHJ0QkJveC50b3AsIEdldEFzY2VudCgpKTsKLSAgICAgICAgcnRCQm94LmJvdHRvbSA9IEZYX01BWChydEJCb3guYm90dG9tLCBHZXREZXNjZW50KCkpOwotICAgICAgICBGWEZUX0RvbmVfR2x5cGgoZ2x5cGgpOwotICAgICAgICByZXR1cm4gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCkgPT0gMDsKLSAgICB9Ci0gICAgaWYgKEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGlHbHlwaEluZGV4LCBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJ0QkJveC5sZWZ0ID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkpOwotICAgIHJ0QkJveC5ib3R0b20gPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSk7Ci0gICAgcnRCQm94LnJpZ2h0ID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkgKyBGWEZUX0dldF9HbHlwaF9XaWR0aChtX0ZhY2UpKTsKLSAgICBydEJCb3gudG9wID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSkgLSBGWEZUX0dldF9HbHlwaF9IZWlnaHQobV9GYWNlKSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGUEZfU2tpYUZvbnQ6OkdldEJCb3goRlhfUkVDVCAmcnRCQm94KQotewotICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcnRCQm94LmxlZnQgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX3hNaW4obV9GYWNlKSk7Ci0gICAgcnRCQm94LnRvcCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfeU1pbihtX0ZhY2UpKTsKLSAgICBydEJCb3gucmlnaHQgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX3hNYXgobV9GYWNlKSk7Ci0gICAgcnRCQm94LmJvdHRvbSA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfeU1heChtX0ZhY2UpKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLWludDMyX3QgQ0ZQRl9Ta2lhRm9udDo6R2V0SGVpZ2h0KCkgY29uc3QKLXsKLSAgICBpZiAoIW1fRmFjZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuCUZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfSGVpZ2h0KG1fRmFjZSkpOwotfQotaW50MzJfdCBDRlBGX1NraWFGb250OjpHZXRJdGFsaWNBbmdsZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIFRUX1Bvc3RzY3JpcHQgKnR0SW5mbyA9IChUVF9Qb3N0c2NyaXB0KilGVF9HZXRfU2ZudF9UYWJsZShtX0ZhY2UsIGZ0X3NmbnRfcG9zdCk7Ci0gICAgaWYgKHR0SW5mbykgewotICAgICAgICByZXR1cm4gdHRJbmZvLT5pdGFsaWNBbmdsZTsKLSAgICB9CitpbnQzMl90IENGUEZfU2tpYUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUpIHsKKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gd1VuaWNvZGU7CisgIH0KKyAgaWYgKEZYRlRfU2VsZWN0X0NoYXJtYXAobV9GYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpKSB7CiAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9GYWNlLCB3VW5pY29kZSk7CiB9Ci1GWF9EV09SRCBDRlBGX1NraWFGb250OjpHZXRGb250RGF0YShGWF9EV09SRCBkd1RhYmxlLCB1aW50OF90KiBwQnVmZmVyLCBGWF9EV09SRCBkd1NpemUpCi17Ci0gICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEZUX1VMb25nIHVsU2l6ZSA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZUX1VMb25nPihkd1NpemUpOwotICAgIGlmIChGWEZUX0xvYWRfU2ZudF9UYWJsZShtX0ZhY2UsIGR3VGFibGUsIDAsIHBCdWZmZXIsICZ1bFNpemUpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KHVsU2l6ZSk7CitpbnQzMl90IENGUEZfU2tpYUZvbnQ6OkdldEdseXBoV2lkdGgoaW50MzJfdCBpR2x5cGhJbmRleCkgeworICBpZiAoIW1fRmFjZSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChGWEZUX0xvYWRfR2x5cGgoCisgICAgICAgICAgbV9GYWNlLCBpR2x5cGhJbmRleCwKKyAgICAgICAgICBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9HbHlwaF9Ib3JpQWR2YW5jZShtX0ZhY2UpKTsKIH0KLUZYX0JPT0wgQ0ZQRl9Ta2lhRm9udDo6SW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciAqcEZvbnRNZ3IsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgdWludDhfdCB1Q2hhcnNldCkKLXsKLSAgICBpZiAoIXBGb250TWdyIHx8ICFwRm9udERlcykgewotICAgICAgICByZXR1cm4gRkFMU0U7CitpbnQzMl90IENGUEZfU2tpYUZvbnQ6OkdldEFzY2VudCgpIGNvbnN0IHsKKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZhY2UpKTsKK30KK2ludDMyX3QgQ0ZQRl9Ta2lhRm9udDo6R2V0RGVzY2VudCgpIGNvbnN0IHsKKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9GYWNlKSk7Cit9CitGWF9CT09MIENGUEZfU2tpYUZvbnQ6OkdldEdseXBoQkJveChpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9SRUNUJiBydEJCb3gpIHsKKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKEZYRlRfSXNfRmFjZV9Ucmlja3kobV9GYWNlKSkgeworICAgIGlmIChGWEZUX1NldF9DaGFyX1NpemUobV9GYWNlLCAwLCAxMDAwICogNjQsIDcyLCA3MikpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgc3dpdGNoIChwRm9udERlcy0+R2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgRlBGX1NLSUFGT05UVFlQRV9QYXRoOiB7Ci0gICAgICAgICAgICAgICAgQ0ZQRl9Ta2lhUGF0aEZvbnQgKnBGb250ID0gKENGUEZfU2tpYVBhdGhGb250KilwRm9udERlczsKLSAgICAgICAgICAgICAgICBtX0ZhY2UgPSBwRm9udE1nci0+R2V0Rm9udEZhY2UocEZvbnQtPm1fcFBhdGgsIHBGb250LT5tX2lGYWNlSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlBGX1NLSUFGT05UVFlQRV9GaWxlOiB7Ci0gICAgICAgICAgICAgICAgQ0ZQRl9Ta2lhRmlsZUZvbnQgKnBGb250ID0gKENGUEZfU2tpYUZpbGVGb250KilwRm9udERlczsKLSAgICAgICAgICAgICAgICBtX0ZhY2UgPSBwRm9udE1nci0+R2V0Rm9udEZhY2UocEZvbnQtPm1fcEZpbGUsIHBGb250LT5tX2lGYWNlSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlBGX1NLSUFGT05UVFlQRV9CdWZmZXI6IHsKLSAgICAgICAgICAgICAgICBDRlBGX1NraWFCdWZmZXJGb250ICpwRm9udCA9IChDRlBGX1NraWFCdWZmZXJGb250KilwRm9udERlczsKLSAgICAgICAgICAgICAgICBtX0ZhY2UgPSBwRm9udE1nci0+R2V0Rm9udEZhY2UoKGNvbnN0IHVpbnQ4X3QqKXBGb250LT5tX3BCdWZmZXIsIHBGb250LT5tX3N6QnVmZmVyLCBwRm9udC0+bV9pRmFjZUluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBpR2x5cGhJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpKSB7CisgICAgICBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIEZYRlRfR2x5cGggZ2x5cGg7CisgICAgaWYgKEZYRlRfR2V0X0dseXBoKG1fRmFjZS0+Z2x5cGgsICZnbHlwaCkpIHsKKyAgICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpOworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBtX2R3U3R5bGUgPSBkd1N0eWxlOwotICAgIG1fdUNoYXJzZXQgPSB1Q2hhcnNldDsKLSAgICBtX3BGb250TWdyID0gcEZvbnRNZ3I7Ci0gICAgbV9wRm9udERlcyA9IHBGb250RGVzOwotICAgIG1fZHdSZWZDb3VudCA9IDE7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgRlhGVF9CQm94IGNib3g7CisgICAgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUywgJmNib3gpOworICAgIGludDMyX3QgeF9wcGVtID0gbV9GYWNlLT5zaXplLT5tZXRyaWNzLnhfcHBlbTsKKyAgICBpbnQzMl90IHlfcHBlbSA9IG1fRmFjZS0+c2l6ZS0+bWV0cmljcy55X3BwZW07CisgICAgcnRCQm94LmxlZnQgPSBGUEZfRU1fQURKVVNUKHhfcHBlbSwgY2JveC54TWluKTsKKyAgICBydEJCb3gucmlnaHQgPSBGUEZfRU1fQURKVVNUKHhfcHBlbSwgY2JveC54TWF4KTsKKyAgICBydEJCb3gudG9wID0gRlBGX0VNX0FESlVTVCh5X3BwZW0sIGNib3gueU1heCk7CisgICAgcnRCQm94LmJvdHRvbSA9IEZQRl9FTV9BREpVU1QoeV9wcGVtLCBjYm94LnlNaW4pOworICAgIHJ0QkJveC50b3AgPSBGWF9NSU4ocnRCQm94LnRvcCwgR2V0QXNjZW50KCkpOworICAgIHJ0QkJveC5ib3R0b20gPSBGWF9NQVgocnRCQm94LmJvdHRvbSwgR2V0RGVzY2VudCgpKTsKKyAgICBGWEZUX0RvbmVfR2x5cGgoZ2x5cGgpOworICAgIHJldHVybiBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KSA9PSAwOworICB9CisgIGlmIChGWEZUX0xvYWRfR2x5cGgoCisgICAgICAgICAgbV9GYWNlLCBpR2x5cGhJbmRleCwKKyAgICAgICAgICBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBydEJCb3gubGVmdCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKSk7CisgIHJ0QkJveC5ib3R0b20gPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSk7CisgIHJ0QkJveC5yaWdodCA9IEZQRl9FTV9BREpVU1QoCisgICAgICBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgIEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChtX0ZhY2UpICsgRlhGVF9HZXRfR2x5cGhfV2lkdGgobV9GYWNlKSk7CisgIHJ0QkJveC50b3AgPSBGUEZfRU1fQURKVVNUKAorICAgICAgRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSAtIEZYRlRfR2V0X0dseXBoX0hlaWdodChtX0ZhY2UpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGUEZfU2tpYUZvbnQ6OkdldEJCb3goRlhfUkVDVCYgcnRCQm94KSB7CisgIGlmICghbV9GYWNlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJ0QkJveC5sZWZ0ID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0ZhY2VfeE1pbihtX0ZhY2UpKTsKKyAgcnRCQm94LnRvcCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0ZhY2VfeU1pbihtX0ZhY2UpKTsKKyAgcnRCQm94LnJpZ2h0ID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX3hNYXgobV9GYWNlKSk7CisgIHJ0QkJveC5ib3R0b20gPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX3lNYXgobV9GYWNlKSk7CisgIHJldHVybiBUUlVFOworfQoraW50MzJfdCBDRlBGX1NraWFGb250OjpHZXRIZWlnaHQoKSBjb25zdCB7CisgIGlmICghbV9GYWNlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0ZhY2VfSGVpZ2h0KG1fRmFjZSkpOworfQoraW50MzJfdCBDRlBGX1NraWFGb250OjpHZXRJdGFsaWNBbmdsZSgpIGNvbnN0IHsKKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBUVF9Qb3N0c2NyaXB0KiB0dEluZm8gPQorICAgICAgKFRUX1Bvc3RzY3JpcHQqKUZUX0dldF9TZm50X1RhYmxlKG1fRmFjZSwgZnRfc2ZudF9wb3N0KTsKKyAgaWYgKHR0SW5mbykgeworICAgIHJldHVybiB0dEluZm8tPml0YWxpY0FuZ2xlOworICB9CisgIHJldHVybiAwOworfQorRlhfRFdPUkQgQ0ZQRl9Ta2lhRm9udDo6R2V0Rm9udERhdGEoRlhfRFdPUkQgZHdUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NpemUpIHsKKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGVF9VTG9uZyB1bFNpemUgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGVF9VTG9uZz4oZHdTaXplKTsKKyAgaWYgKEZYRlRfTG9hZF9TZm50X1RhYmxlKG1fRmFjZSwgZHdUYWJsZSwgMCwgcEJ1ZmZlciwgJnVsU2l6ZSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KHVsU2l6ZSk7Cit9CitGWF9CT09MIENGUEZfU2tpYUZvbnQ6OkluaXRGb250KENGUEZfU2tpYUZvbnRNZ3IqIHBGb250TWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlBGX1NraWFGb250RGVzY3JpcHRvciogcEZvbnREZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdUNoYXJzZXQpIHsKKyAgaWYgKCFwRm9udE1nciB8fCAhcEZvbnREZXMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgc3dpdGNoIChwRm9udERlcy0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSBGUEZfU0tJQUZPTlRUWVBFX1BhdGg6IHsKKyAgICAgIENGUEZfU2tpYVBhdGhGb250KiBwRm9udCA9IChDRlBGX1NraWFQYXRoRm9udCopcEZvbnREZXM7CisgICAgICBtX0ZhY2UgPSBwRm9udE1nci0+R2V0Rm9udEZhY2UocEZvbnQtPm1fcFBhdGgsIHBGb250LT5tX2lGYWNlSW5kZXgpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBGUEZfU0tJQUZPTlRUWVBFX0ZpbGU6IHsKKyAgICAgIENGUEZfU2tpYUZpbGVGb250KiBwRm9udCA9IChDRlBGX1NraWFGaWxlRm9udCopcEZvbnREZXM7CisgICAgICBtX0ZhY2UgPSBwRm9udE1nci0+R2V0Rm9udEZhY2UocEZvbnQtPm1fcEZpbGUsIHBGb250LT5tX2lGYWNlSW5kZXgpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBGUEZfU0tJQUZPTlRUWVBFX0J1ZmZlcjogeworICAgICAgQ0ZQRl9Ta2lhQnVmZmVyRm9udCogcEZvbnQgPSAoQ0ZQRl9Ta2lhQnVmZmVyRm9udCopcEZvbnREZXM7CisgICAgICBtX0ZhY2UgPSBwRm9udE1nci0+R2V0Rm9udEZhY2UoKGNvbnN0IHVpbnQ4X3QqKXBGb250LT5tX3BCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnQtPm1fc3pCdWZmZXIsIHBGb250LT5tX2lGYWNlSW5kZXgpOworICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIW1fRmFjZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX2R3U3R5bGUgPSBkd1N0eWxlOworICBtX3VDaGFyc2V0ID0gdUNoYXJzZXQ7CisgIG1fcEZvbnRNZ3IgPSBwRm9udE1ncjsKKyAgbV9wRm9udERlcyA9IHBGb250RGVzOworICBtX2R3UmVmQ291bnQgPSAxOworICByZXR1cm4gVFJVRTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5oIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5oCmluZGV4IDQ5ODE5ZDQuLjRhODQxOTQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuaAorKysgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmgKQEAgLTExLDQ4ICsxMSw0OCBAQAogY2xhc3MgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3I7CiBjbGFzcyBDRlBGX1NraWFGb250TWdyOwogY2xhc3MgU2tUeXBlZmFjZTsKLWNsYXNzIENGUEZfU2tpYUZvbnQgOiBwdWJsaWMgSUZQRl9Gb250Ci17Ci1wdWJsaWM6Ci0gICAgQ0ZQRl9Ta2lhRm9udCgpOwotICAgIHZpcnR1YWwgfkNGUEZfU2tpYUZvbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCk7Ci0gICAgdmlydHVhbCBJRlBGX0ZvbnQqCQlSZXRhaW4oKTsKK2NsYXNzIENGUEZfU2tpYUZvbnQgOiBwdWJsaWMgSUZQRl9Gb250IHsKKyBwdWJsaWM6CisgIENGUEZfU2tpYUZvbnQoKTsKKyAgdmlydHVhbCB+Q0ZQRl9Ta2lhRm9udCgpOworICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOworICB2aXJ0dWFsIElGUEZfRm9udCogUmV0YWluKCk7CiAKLSAgICB2aXJ0dWFsIEZQRl9IRk9OVAkJR2V0SGFuZGxlKCk7CisgIHZpcnR1YWwgRlBGX0hGT05UIEdldEhhbmRsZSgpOwogCi0gICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZwlHZXRGYW1pbHlOYW1lKCk7Ci0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlHZXRQc05hbWUoKTsKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXRGYW1pbHlOYW1lKCk7CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0UHNOYW1lKCk7CiAKLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRGb250U3R5bGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fZHdTdHlsZTsKLSAgICB9Ci0gICAgdmlydHVhbCB1aW50OF90CQkJR2V0Q2hhcnNldCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV91Q2hhcnNldDsKLSAgICB9CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Rm9udFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9kd1N0eWxlOyB9CisgIHZpcnR1YWwgdWludDhfdCBHZXRDaGFyc2V0KCkgY29uc3QgeyByZXR1cm4gbV91Q2hhcnNldDsgfQogCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlKTsKLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEdseXBoV2lkdGgoaW50MzJfdCBpR2x5cGhJbmRleCk7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlKTsKKyAgdmlydHVhbCBpbnQzMl90IEdldEdseXBoV2lkdGgoaW50MzJfdCBpR2x5cGhJbmRleCk7CiAKLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEFzY2VudCgpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0RGVzY2VudCgpIGNvbnN0OworICB2aXJ0dWFsIGludDMyX3QgR2V0QXNjZW50KCkgY29uc3Q7CisgIHZpcnR1YWwgaW50MzJfdCBHZXREZXNjZW50KCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRHbHlwaEJCb3goaW50MzJfdCBpR2x5cGhJbmRleCwgRlhfUkVDVCAmcnRCQm94KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCQm94KEZYX1JFQ1QgJnJ0QkJveCk7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRHbHlwaEJCb3goaW50MzJfdCBpR2x5cGhJbmRleCwgRlhfUkVDVCYgcnRCQm94KTsKKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goRlhfUkVDVCYgcnRCQm94KTsKIAotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0SGVpZ2h0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRJdGFsaWNBbmdsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldEZvbnREYXRhKEZYX0RXT1JEIGR3VGFibGUsIHVpbnQ4X3QqIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSk7Ci0gICAgRlhfQk9PTAkJCQkJSW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciAqcEZvbnRNZ3IsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgdWludDhfdCB1Q2hhcnNldCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgQ0ZQRl9Ta2lhRm9udE1ncgkJKm1fcEZvbnRNZ3I7Ci0gICAgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IJKm1fcEZvbnREZXM7Ci0gICAgRlhGVF9GYWNlCQkJCW1fRmFjZTsKLSAgICBGWF9EV09SRAkJCQltX2R3U3R5bGU7Ci0gICAgdWludDhfdAkJCQkJbV91Q2hhcnNldDsKLSAgICBGWF9EV09SRAkJCQltX2R3UmVmQ291bnQ7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRIZWlnaHQoKSBjb25zdDsKKyAgdmlydHVhbCBpbnQzMl90IEdldEl0YWxpY0FuZ2xlKCkgY29uc3Q7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Rm9udERhdGEoRlhfRFdPUkQgZHdUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZSk7CisgIEZYX0JPT0wgSW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciogcEZvbnRNZ3IsCisgICAgICAgICAgICAgICAgICAgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IqIHBGb250RGVzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYW1pbHksCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZSwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90IHVDaGFyc2V0KTsKKworIHByb3RlY3RlZDoKKyAgQ0ZQRl9Ta2lhRm9udE1nciogbV9wRm9udE1ncjsKKyAgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IqIG1fcEZvbnREZXM7CisgIEZYRlRfRmFjZSBtX0ZhY2U7CisgIEZYX0RXT1JEIG1fZHdTdHlsZTsKKyAgdWludDhfdCBtX3VDaGFyc2V0OworICBGWF9EV09SRCBtX2R3UmVmQ291bnQ7CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5jcHAKaW5kZXggNjIzZTJkNi4uNTlmYmNiNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5jcHAKQEAgLTYsNDgwICs2LDQ2MCBAQAogCiAjaW5jbHVkZSAiZnhfZnBmLmgiCiAjaWYgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8KLSNkZWZpbmUgRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMQk2MgotI2RlZmluZSBGUEZfU0tJQU1BVENIV0VJR0hUX05BTUUyCTYwCi0jZGVmaW5lIEZQRl9TS0lBTUFUQ0hXRUlHSFRfMQkJMTYKLSNkZWZpbmUgRlBGX1NLSUFNQVRDSFdFSUdIVF8yCQk4CisjZGVmaW5lIEZQRl9TS0lBTUFUQ0hXRUlHSFRfTkFNRTEgNjIKKyNkZWZpbmUgRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMiA2MAorI2RlZmluZSBGUEZfU0tJQU1BVENIV0VJR0hUXzEgMTYKKyNkZWZpbmUgRlBGX1NLSUFNQVRDSFdFSUdIVF8yIDgKICNpbmNsdWRlICJmcGZfc2tpYWZvbnRtZ3IuaCIKICNpbmNsdWRlICJmcGZfc2tpYWZvbnQuaCIKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKLXN0YXRpYyB1bnNpZ25lZCBsb25nIEZQRl9Ta2lhU3RyZWFtX1JlYWQoRlhGVF9TdHJlYW0gc3RyZWFtLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KQotewotICAgIElGWF9GaWxlUmVhZCAqcEZpbGVSZWFkID0gKElGWF9GaWxlUmVhZCopc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXI7Ci0gICAgaWYgKCFwRmlsZVJlYWQpIHsKLSAgICAgICAgcmV0dXJuIDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBGUEZfU2tpYVN0cmVhbV9SZWFkKEZYRlRfU3RyZWFtIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkgeworICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCA9IChJRlhfRmlsZVJlYWQqKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyOworICBpZiAoIXBGaWxlUmVhZCkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb3VudCA+IDApIHsKKyAgICBpZiAocEZpbGVSZWFkLT5SZWFkQmxvY2soYnVmZmVyLCAoRlhfRklMRVNJWkUpb2Zmc2V0LCAoc2l6ZV90KWNvdW50KSAhPQorICAgICAgICBjb3VudCkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgaWYgKHBGaWxlUmVhZC0+UmVhZEJsb2NrKGJ1ZmZlciwgKEZYX0ZJTEVTSVpFKW9mZnNldCwgKHNpemVfdCljb3VudCkgIT0gY291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjb3VudDsKKyAgfQorICByZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgdm9pZCBGUEZfU2tpYVN0cmVhbV9DbG9zZShGWEZUX1N0cmVhbSBzdHJlYW0pCi17Ci19CitzdGF0aWMgdm9pZCBGUEZfU2tpYVN0cmVhbV9DbG9zZShGWEZUX1N0cmVhbSBzdHJlYW0pIHt9CiAjaWZkZWYgX19jcGx1c3BsdXMKIH07CiAjZW5kaWYKIHR5cGVkZWYgc3RydWN0IF9GUEZfU0tJQUZPTlRNQVAgewotICAgIEZYX0RXT1JECWR3RmFtaWx5OwotICAgIEZYX0RXT1JECWR3U3ViU3Q7CisgIEZYX0RXT1JEIGR3RmFtaWx5OworICBGWF9EV09SRCBkd1N1YlN0OwogfSBGUEZfU0tJQUZPTlRNQVAsICpGUEZfTFBTS0lBRk9OVE1BUDsKLXR5cGVkZWYgRlBGX1NLSUFGT05UTUFQIGNvbnN0ICogRlBGX0xQQ1NLSUFGT05UTUFQOwordHlwZWRlZiBGUEZfU0tJQUZPTlRNQVAgY29uc3QqIEZQRl9MUENTS0lBRk9OVE1BUDsKIHN0YXRpYyBjb25zdCBGUEZfU0tJQUZPTlRNQVAgZ19Ta2lhRm9udG1hcFtdID0gewotICAgIHsweDU4YzUwODMsCQkweGM4ZDJlMzQ1fSwKLSAgICB7MHg1ZGZhZGUyLAkJMHhlMTYzMzA4MX0sCi0gICAgezB4Njg0MzE3ZCwJCTB4ZTE2MzMwODF9LAotICAgIHsweDE0ZWUyZDEzLAkweGM4ZDJlMzQ1fSwKLSAgICB7MHgzOTE4ZmUyZCwJMHhiYmVlZWM3Mn0sCi0gICAgezB4M2I5OGIzMWMsCTB4ZTE2MzMwODF9LAotICAgIHsweDNkNDlmNDBlLAkweGUxNjMzMDgxfSwKLSAgICB7MHg0MzJjNDFjNSwJMHhlMTYzMzA4MX0sCi0gICAgezB4NDkxYjZhZDAsCTB4ZTE2MzMwODF9LAotICAgIHsweDU2MTJjYWIxLAkweDU5YjlmOGYxfSwKLSAgICB7MHg3NzljZTE5ZCwJMHhjOGQyZTM0NX0sCi0gICAgezB4N2NjOTUxMGIsCTB4NTliOWY4ZjF9LAotICAgIHsweDgzNzQ2MDUzLAkweGJiZWVlYzcyfSwKLSAgICB7MHhhYWE2MGMwMywJMHhiYmVlZWM3Mn0sCi0gICAgezB4YmY4NWZmMjYsCTB4ZTE2MzMwODF9LAotICAgIHsweGMwNGZlNjAxLAkweGJiZWVlYzcyfSwKLSAgICB7MHhjYTM4MTJkNSwJMHg1OWI5ZjhmMX0sCi0gICAgezB4Y2EzODNlMTUsCTB4NTliOWY4ZjF9LAotICAgIHsweGNhZDVlYWY2LAkweDU5YjlmOGYxfSwKLSAgICB7MHhjYjdhMDRjOCwJMHhjOGQyZTM0NX0sCi0gICAgezB4ZmI0Y2UwZGUsCTB4ZTE2MzMwODF9LAorICAgIHsweDU4YzUwODMsIDB4YzhkMmUzNDV9LCAgezB4NWRmYWRlMiwgMHhlMTYzMzA4MX0sCisgICAgezB4Njg0MzE3ZCwgMHhlMTYzMzA4MX0sICB7MHgxNGVlMmQxMywgMHhjOGQyZTM0NX0sCisgICAgezB4MzkxOGZlMmQsIDB4YmJlZWVjNzJ9LCB7MHgzYjk4YjMxYywgMHhlMTYzMzA4MX0sCisgICAgezB4M2Q0OWY0MGUsIDB4ZTE2MzMwODF9LCB7MHg0MzJjNDFjNSwgMHhlMTYzMzA4MX0sCisgICAgezB4NDkxYjZhZDAsIDB4ZTE2MzMwODF9LCB7MHg1NjEyY2FiMSwgMHg1OWI5ZjhmMX0sCisgICAgezB4Nzc5Y2UxOWQsIDB4YzhkMmUzNDV9LCB7MHg3Y2M5NTEwYiwgMHg1OWI5ZjhmMX0sCisgICAgezB4ODM3NDYwNTMsIDB4YmJlZWVjNzJ9LCB7MHhhYWE2MGMwMywgMHhiYmVlZWM3Mn0sCisgICAgezB4YmY4NWZmMjYsIDB4ZTE2MzMwODF9LCB7MHhjMDRmZTYwMSwgMHhiYmVlZWM3Mn0sCisgICAgezB4Y2EzODEyZDUsIDB4NTliOWY4ZjF9LCB7MHhjYTM4M2UxNSwgMHg1OWI5ZjhmMX0sCisgICAgezB4Y2FkNWVhZjYsIDB4NTliOWY4ZjF9LCB7MHhjYjdhMDRjOCwgMHhjOGQyZTM0NX0sCisgICAgezB4ZmI0Y2UwZGUsIDB4ZTE2MzMwODF9LAogfTsKLUZYX0RXT1JEIEZQRl9Ta2lhR2V0U3Vic3RGb250KEZYX0RXT1JEIGR3SGFzaCkKLXsKLSAgICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gICAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfU2tpYUZvbnRtYXApIC8gc2l6ZW9mKEZQRl9TS0lBRk9OVE1BUCk7Ci0gICAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7Ci0gICAgICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7Ci0gICAgICAgIEZQRl9MUENTS0lBRk9OVE1BUCBwSXRlbSA9ICZnX1NraWFGb250bWFwW2lNaWRdOwotICAgICAgICBpZiAoZHdIYXNoIDwgcEl0ZW0tPmR3RmFtaWx5KSB7Ci0gICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID4gcEl0ZW0tPmR3RmFtaWx5KSB7Ci0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBwSXRlbS0+ZHdTdWJTdDsKLSAgICAgICAgfQorRlhfRFdPUkQgRlBGX1NraWFHZXRTdWJzdEZvbnQoRlhfRFdPUkQgZHdIYXNoKSB7CisgIGludDMyX3QgaVN0YXJ0ID0gMDsKKyAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfU2tpYUZvbnRtYXApIC8gc2l6ZW9mKEZQRl9TS0lBRk9OVE1BUCk7CisgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgeworICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7CisgICAgRlBGX0xQQ1NLSUFGT05UTUFQIHBJdGVtID0gJmdfU2tpYUZvbnRtYXBbaU1pZF07CisgICAgaWYgKGR3SGFzaCA8IHBJdGVtLT5kd0ZhbWlseSkgeworICAgICAgaUVuZCA9IGlNaWQgLSAxOworICAgIH0gZWxzZSBpZiAoZHdIYXNoID4gcEl0ZW0tPmR3RmFtaWx5KSB7CisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHBJdGVtLT5kd1N1YlN0OwogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMDsKIH0KIHN0YXRpYyBjb25zdCBGUEZfU0tJQUZPTlRNQVAgZ19Ta2lhU2Fuc0ZvbnRNYXBbXSA9IHsKLSAgICB7MHg1OGM1MDgzLAkJMHhkNWI4ZDEwZn0sCi0gICAgezB4MTRlZTJkMTMsCTB4ZDViOGQxMGZ9LAotICAgIHsweDc3OWNlMTlkLAkweGQ1YjhkMTBmfSwKLSAgICB7MHhjYjdhMDRjOCwJMHhkNWI4ZDEwZn0sCi0gICAgezB4ZmI0Y2UwZGUsCTB4ZDViOGQxMGZ9LAorICAgIHsweDU4YzUwODMsIDB4ZDViOGQxMGZ9LCAgezB4MTRlZTJkMTMsIDB4ZDViOGQxMGZ9LAorICAgIHsweDc3OWNlMTlkLCAweGQ1YjhkMTBmfSwgezB4Y2I3YTA0YzgsIDB4ZDViOGQxMGZ9LAorICAgIHsweGZiNGNlMGRlLCAweGQ1YjhkMTBmfSwKIH07Ci1GWF9EV09SRCBGUEZfU2tpYUdldFNhbnNGb250KEZYX0RXT1JEIGR3SGFzaCkKLXsKLSAgICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gICAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfU2tpYVNhbnNGb250TWFwKSAvIHNpemVvZihGUEZfU0tJQUZPTlRNQVApOwotICAgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgewotICAgICAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgICAgICBGUEZfTFBDU0tJQUZPTlRNQVAgcEl0ZW0gPSAmZ19Ta2lhU2Fuc0ZvbnRNYXBbaU1pZF07Ci0gICAgICAgIGlmIChkd0hhc2ggPCBwSXRlbS0+ZHdGYW1pbHkpIHsKLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPiBwSXRlbS0+ZHdGYW1pbHkpIHsKLSAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHBJdGVtLT5kd1N1YlN0OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotc3RhdGljIHVpbnQzMl90IEZQRl9HZXRIYXNoQ29kZV9TdHJpbmdBKGNvbnN0IEZYX0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCwgRlhfQk9PTCBiSWdub3JlQ2FzZSA9IEZBTFNFKQotewotICAgIGlmICghcFN0cikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGlMZW5ndGggPCAwKSB7Ci0gICAgICAgIGlMZW5ndGggPSBGWFNZU19zdHJsZW4ocFN0cik7Ci0gICAgfQotICAgIGNvbnN0IEZYX0NIQVIqIHBTdHJFbmQgPSBwU3RyICsgaUxlbmd0aDsKLSAgICB1aW50MzJfdCB1SGFzaENvZGUgPSAwOwotICAgIGlmIChiSWdub3JlQ2FzZSkgewotICAgICAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKLSAgICAgICAgICAgIHVIYXNoQ29kZSA9IDMxICogdUhhc2hDb2RlICsgRlhTWVNfdG9sb3dlcigqcFN0cisrKTsKLSAgICAgICAgfQorRlhfRFdPUkQgRlBGX1NraWFHZXRTYW5zRm9udChGWF9EV09SRCBkd0hhc2gpIHsKKyAgaW50MzJfdCBpU3RhcnQgPSAwOworICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19Ta2lhU2Fuc0ZvbnRNYXApIC8gc2l6ZW9mKEZQRl9TS0lBRk9OVE1BUCk7CisgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgeworICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7CisgICAgRlBGX0xQQ1NLSUFGT05UTUFQIHBJdGVtID0gJmdfU2tpYVNhbnNGb250TWFwW2lNaWRdOworICAgIGlmIChkd0hhc2ggPCBwSXRlbS0+ZHdGYW1pbHkpIHsKKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsKKyAgICB9IGVsc2UgaWYgKGR3SGFzaCA+IHBJdGVtLT5kd0ZhbWlseSkgeworICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgd2hpbGUgKHBTdHIgPCBwU3RyRW5kKSB7Ci0gICAgICAgICAgICB1SGFzaENvZGUgPSAzMSAqIHVIYXNoQ29kZSArICpwU3RyICsrOwotICAgICAgICB9CisgICAgICByZXR1cm4gcEl0ZW0tPmR3U3ViU3Q7CiAgICAgfQotICAgIHJldHVybiB1SGFzaENvZGU7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitzdGF0aWMgdWludDMyX3QgRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoY29uc3QgRlhfQ0hBUiogcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSWdub3JlQ2FzZSA9IEZBTFNFKSB7CisgIGlmICghcFN0cikgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChpTGVuZ3RoIDwgMCkgeworICAgIGlMZW5ndGggPSBGWFNZU19zdHJsZW4ocFN0cik7CisgIH0KKyAgY29uc3QgRlhfQ0hBUiogcFN0ckVuZCA9IHBTdHIgKyBpTGVuZ3RoOworICB1aW50MzJfdCB1SGFzaENvZGUgPSAwOworICBpZiAoYklnbm9yZUNhc2UpIHsKKyAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKKyAgICAgIHVIYXNoQ29kZSA9IDMxICogdUhhc2hDb2RlICsgRlhTWVNfdG9sb3dlcigqcFN0cisrKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKHBTdHIgPCBwU3RyRW5kKSB7CisgICAgICB1SGFzaENvZGUgPSAzMSAqIHVIYXNoQ29kZSArICpwU3RyKys7CisgICAgfQorICB9CisgIHJldHVybiB1SGFzaENvZGU7CiB9CiBlbnVtIEZQRl9TS0lBQ0hBUlNFVCB7Ci0gICAgRlBGX1NLSUFDSEFSU0VUX0Fuc2kJCQk9IDEgPDwgMCwKLSAgICBGUEZfU0tJQUNIQVJTRVRfRGVmYXVsdAkJCT0gMSA8PCAxLAotICAgIEZQRl9TS0lBQ0hBUlNFVF9TeW1ib2wJCQk9IDEgPDwgMiwKLSAgICBGUEZfU0tJQUNIQVJTRVRfU2hpZnRKSVMJCT0gMSA8PCAzLAotICAgIEZQRl9TS0lBQ0hBUlNFVF9Lb3JlYW4JCQk9IDEgPDwgNCwKLSAgICBGUEZfU0tJQUNIQVJTRVRfSm9oYWIJCQk9IDEgPDwgNSwKLSAgICBGUEZfU0tJQUNIQVJTRVRfR0IyMzEyCQkJPSAxIDw8IDYsCi0gICAgRlBGX1NLSUFDSEFSU0VUX0JJRzUJCQk9IDEgPDwgNywKLSAgICBGUEZfU0tJQUNIQVJTRVRfR3JlZWsJCQk9IDEgPDwgOCwKLSAgICBGUEZfU0tJQUNIQVJTRVRfVHVya2lzaAkJCT0gMSA8PCA5LAotICAgIEZQRl9TS0lBQ0hBUlNFVF9WaWV0bmFtZXNlCQk9IDEgPDwgMTAsCi0gICAgRlBGX1NLSUFDSEFSU0VUX0hlYnJldwkJCT0gMSA8PCAxMSwKLSAgICBGUEZfU0tJQUNIQVJTRVRfQXJhYmljCQkJPSAxIDw8IDEyLAotICAgIEZQRl9TS0lBQ0hBUlNFVF9CYWx0aWMJCQk9IDEgPDwgMTMsCi0gICAgRlBGX1NLSUFDSEFSU0VUX0N5cmlsbGljCQk9IDEgPDwgMTQsCi0gICAgRlBGX1NLSUFDSEFSU0VUX1RoYWkJCQk9IDEgPDwgMTUsCi0gICAgRlBGX1NLSUFDSEFSU0VUX0VlYXN0ZXJuRXVyb3BlYW4gPSAxIDw8IDE2LAotICAgIEZQRl9TS0lBQ0hBUlNFVF9QQwkJCQk9IDEgPDwgMTcsCi0gICAgRlBGX1NLSUFDSEFSU0VUX09FTQkJCQk9IDEgPDwgMTgsCisgIEZQRl9TS0lBQ0hBUlNFVF9BbnNpID0gMSA8PCAwLAorICBGUEZfU0tJQUNIQVJTRVRfRGVmYXVsdCA9IDEgPDwgMSwKKyAgRlBGX1NLSUFDSEFSU0VUX1N5bWJvbCA9IDEgPDwgMiwKKyAgRlBGX1NLSUFDSEFSU0VUX1NoaWZ0SklTID0gMSA8PCAzLAorICBGUEZfU0tJQUNIQVJTRVRfS29yZWFuID0gMSA8PCA0LAorICBGUEZfU0tJQUNIQVJTRVRfSm9oYWIgPSAxIDw8IDUsCisgIEZQRl9TS0lBQ0hBUlNFVF9HQjIzMTIgPSAxIDw8IDYsCisgIEZQRl9TS0lBQ0hBUlNFVF9CSUc1ID0gMSA8PCA3LAorICBGUEZfU0tJQUNIQVJTRVRfR3JlZWsgPSAxIDw8IDgsCisgIEZQRl9TS0lBQ0hBUlNFVF9UdXJraXNoID0gMSA8PCA5LAorICBGUEZfU0tJQUNIQVJTRVRfVmlldG5hbWVzZSA9IDEgPDwgMTAsCisgIEZQRl9TS0lBQ0hBUlNFVF9IZWJyZXcgPSAxIDw8IDExLAorICBGUEZfU0tJQUNIQVJTRVRfQXJhYmljID0gMSA8PCAxMiwKKyAgRlBGX1NLSUFDSEFSU0VUX0JhbHRpYyA9IDEgPDwgMTMsCisgIEZQRl9TS0lBQ0hBUlNFVF9DeXJpbGxpYyA9IDEgPDwgMTQsCisgIEZQRl9TS0lBQ0hBUlNFVF9UaGFpID0gMSA8PCAxNSwKKyAgRlBGX1NLSUFDSEFSU0VUX0VlYXN0ZXJuRXVyb3BlYW4gPSAxIDw8IDE2LAorICBGUEZfU0tJQUNIQVJTRVRfUEMgPSAxIDw8IDE3LAorICBGUEZfU0tJQUNIQVJTRVRfT0VNID0gMSA8PCAxOCwKIH07Ci1zdGF0aWMgRlhfRFdPUkQgRlBGX1NraWFHZXRDaGFyc2V0KHVpbnQ4X3QgdUNoYXJzZXQpCi17Ci0gICAgc3dpdGNoICh1Q2hhcnNldCkgewotICAgICAgICBjYXNlIEZYRk9OVF9BTlNJX0NIQVJTRVQ6Ci0gICAgICAgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0Fuc2k7Ci0gICAgICAgIGNhc2UgRlhGT05UX0RFRkFVTFRfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfRGVmYXVsdDsKLSAgICAgICAgY2FzZSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQ6Ci0gICAgICAgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX1N5bWJvbDsKLSAgICAgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfU2hpZnRKSVM7Ci0gICAgICAgIGNhc2UgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfS29yZWFuOwotICAgICAgICBjYXNlIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfR0IyMzEyOwotICAgICAgICBjYXNlIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9CSUc1OwotICAgICAgICBjYXNlIEZYRk9OVF9HUkVFS19DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9HcmVlazsKLSAgICAgICAgY2FzZSBGWEZPTlRfVFVSS0lTSF9DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9UdXJraXNoOwotICAgICAgICBjYXNlIEZYRk9OVF9IRUJSRVdfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfSGVicmV3OwotICAgICAgICBjYXNlIEZYRk9OVF9BUkFCSUNfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfQXJhYmljOwotICAgICAgICBjYXNlIEZYRk9OVF9CQUxUSUNfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfQmFsdGljOwotICAgICAgICBjYXNlIEZYRk9OVF9SVVNTSUFOX0NIQVJTRVQ6Ci0gICAgICAgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0N5cmlsbGljOwotICAgICAgICBjYXNlIEZYRk9OVF9USEFJX0NIQVJTRVQ6Ci0gICAgICAgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX1RoYWk7Ci0gICAgICAgIGNhc2UgRlhGT05UX0VBU1RFVVJPUEVfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfRWVhc3Rlcm5FdXJvcGVhbjsKLSAgICB9Ci0gICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9EZWZhdWx0Oworc3RhdGljIEZYX0RXT1JEIEZQRl9Ta2lhR2V0Q2hhcnNldCh1aW50OF90IHVDaGFyc2V0KSB7CisgIHN3aXRjaCAodUNoYXJzZXQpIHsKKyAgICBjYXNlIEZYRk9OVF9BTlNJX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0Fuc2k7CisgICAgY2FzZSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUOgorICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9EZWZhdWx0OworICAgIGNhc2UgRlhGT05UX1NZTUJPTF9DSEFSU0VUOgorICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9TeW1ib2w7CisgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKKyAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfU2hpZnRKSVM7CisgICAgY2FzZSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUOgorICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9Lb3JlYW47CisgICAgY2FzZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0dCMjMxMjsKKyAgICBjYXNlIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUOgorICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9CSUc1OworICAgIGNhc2UgRlhGT05UX0dSRUVLX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0dyZWVrOworICAgIGNhc2UgRlhGT05UX1RVUktJU0hfQ0hBUlNFVDoKKyAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfVHVya2lzaDsKKyAgICBjYXNlIEZYRk9OVF9IRUJSRVdfQ0hBUlNFVDoKKyAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfSGVicmV3OworICAgIGNhc2UgRlhGT05UX0FSQUJJQ19DSEFSU0VUOgorICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9BcmFiaWM7CisgICAgY2FzZSBGWEZPTlRfQkFMVElDX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0JhbHRpYzsKKyAgICBjYXNlIEZYRk9OVF9SVVNTSUFOX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0N5cmlsbGljOworICAgIGNhc2UgRlhGT05UX1RIQUlfQ0hBUlNFVDoKKyAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfVGhhaTsKKyAgICBjYXNlIEZYRk9OVF9FQVNURVVST1BFX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0VlYXN0ZXJuRXVyb3BlYW47CisgIH0KKyAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9EZWZhdWx0OwogfQotc3RhdGljIEZYX0RXT1JEIEZQRl9TS0lBTm9ybWFsaXplRm9udE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic2ZhbWlseSkKLXsKLSAgICBGWF9EV09SRCBkd0hhc2ggPSAwOwotICAgIGludDMyX3QgaUxlbmd0aCA9IGJzZmFtaWx5LkdldExlbmd0aCgpOwotICAgIGNvbnN0IEZYX0NIQVIqIHBCdWZmZXIgPSBic2ZhbWlseS5HZXRDU3RyKCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIEZYX0NIQVIgY2ggPSBwQnVmZmVyW2ldOwotICAgICAgICBpZiAoY2ggPT0gJyAnIHx8IGNoID09ICctJyB8fCBjaCA9PSAnLCcpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGR3SGFzaCA9IDMxICogZHdIYXNoICsgRlhTWVNfdG9sb3dlcihjaCk7CitzdGF0aWMgRlhfRFdPUkQgRlBGX1NLSUFOb3JtYWxpemVGb250TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzZmFtaWx5KSB7CisgIEZYX0RXT1JEIGR3SGFzaCA9IDA7CisgIGludDMyX3QgaUxlbmd0aCA9IGJzZmFtaWx5LkdldExlbmd0aCgpOworICBjb25zdCBGWF9DSEFSKiBwQnVmZmVyID0gYnNmYW1pbHkuR2V0Q1N0cigpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsKKyAgICBGWF9DSEFSIGNoID0gcEJ1ZmZlcltpXTsKKyAgICBpZiAoY2ggPT0gJyAnIHx8IGNoID09ICctJyB8fCBjaCA9PSAnLCcpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICByZXR1cm4gZHdIYXNoOworICAgIGR3SGFzaCA9IDMxICogZHdIYXNoICsgRlhTWVNfdG9sb3dlcihjaCk7CisgIH0KKyAgcmV0dXJuIGR3SGFzaDsKIH0KLXN0YXRpYyBGWF9EV09SRAlGUEZfU0tJQUdldEZhbWlseUhhc2goY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgdWludDhfdCB1Q2hhcnNldCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBic0ZvbnQoYnNGYW1pbHkpOwotICAgIGlmIChkd1N0eWxlICYgRlhGT05UX0JPTEQpIHsKLSAgICAgICAgYnNGb250ICs9ICJCb2xkIjsKK3N0YXRpYyBGWF9EV09SRCBGUEZfU0tJQUdldEZhbWlseUhhc2goY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1Q2hhcnNldCkgeworICBDRlhfQnl0ZVN0cmluZyBic0ZvbnQoYnNGYW1pbHkpOworICBpZiAoZHdTdHlsZSAmIEZYRk9OVF9CT0xEKSB7CisgICAgYnNGb250ICs9ICJCb2xkIjsKKyAgfQorICBpZiAoZHdTdHlsZSAmIEZYRk9OVF9JVEFMSUMpIHsKKyAgICBic0ZvbnQgKz0gIkl0YWxpYyI7CisgIH0KKyAgaWYgKGR3U3R5bGUgJiBGWEZPTlRfU0VSSUYpIHsKKyAgICBic0ZvbnQgKz0gIlNlcmlmIjsKKyAgfQorICBic0ZvbnQgKz0gdUNoYXJzZXQ7CisgIHJldHVybiBGUEZfR2V0SGFzaENvZGVfU3RyaW5nQShic0ZvbnQuY19zdHIoKSwgYnNGb250LkdldExlbmd0aCgpLCBUUlVFKTsKK30KK3N0YXRpYyBGWF9CT09MIEZQRl9Ta2lhSXNDSksodWludDhfdCB1Q2hhcnNldCkgeworICByZXR1cm4gKHVDaGFyc2V0ID09IEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCkgfHwKKyAgICAgICAgICh1Q2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCkgfHwKKyAgICAgICAgICh1Q2hhcnNldCA9PSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKSB8fAorICAgICAgICAgKHVDaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKK30KK3N0YXRpYyBGWF9CT09MIEZQRl9Ta2lhTWF5YmVTeW1ib2woY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhY2VuYW1lKSB7CisgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IGJzRmFjZW5hbWU7CisgIGJzTmFtZS5NYWtlTG93ZXIoKTsKKyAgcmV0dXJuIGJzTmFtZS5GaW5kKCJzeW1ib2wiKSA+IC0xOworfQorc3RhdGljIEZYX0JPT0wgRlBGX1NraWFNYXliZUFyYWJpYyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFjZW5hbWUpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gYnNGYWNlbmFtZTsKKyAgYnNOYW1lLk1ha2VMb3dlcigpOworICByZXR1cm4gYnNOYW1lLkZpbmQoImFyYWJpYyIpID4gLTE7Cit9CitDRlBGX1NraWFGb250TWdyOjpDRlBGX1NraWFGb250TWdyKCkgOiBtX2JMb2FkZWQoRkFMU0UpLCBtX0ZUTGlicmFyeShOVUxMKSB7fQorQ0ZQRl9Ta2lhRm9udE1ncjo6fkNGUEZfU2tpYUZvbnRNZ3IoKSB7CisgIHZvaWQqIHBrZXkgPSBOVUxMOworICBDRlBGX1NraWFGb250KiBwVmFsdWUgPSBOVUxMOworICBGWF9QT1NJVElPTiBwb3MgPSBtX0ZhbWlseUZvbnRzLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIG1fRmFtaWx5Rm9udHMuR2V0TmV4dEFzc29jKHBvcywgcGtleSwgKHZvaWQqJilwVmFsdWUpOworICAgIGlmIChwVmFsdWUpIHsKKyAgICAgIHBWYWx1ZS0+UmVsZWFzZSgpOwogICAgIH0KLSAgICBpZiAoZHdTdHlsZSAmIEZYRk9OVF9JVEFMSUMpIHsKLSAgICAgICAgYnNGb250ICs9ICJJdGFsaWMiOworICB9CisgIG1fRmFtaWx5Rm9udHMuUmVtb3ZlQWxsKCk7CisgIGZvciAoaW50MzJfdCBpID0gbV9Gb250RmFjZXMuR2V0VXBwZXJCb3VuZCgpOyBpID49IDA7IGktLSkgeworICAgIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKiBwRm9udCA9CisgICAgICAgIChDRlBGX1NraWFGb250RGVzY3JpcHRvciopbV9Gb250RmFjZXMuRWxlbWVudEF0KGkpOworICAgIGRlbGV0ZSBwRm9udDsKKyAgfQorICBtX0ZvbnRGYWNlcy5SZW1vdmVBbGwoKTsKKyAgaWYgKG1fRlRMaWJyYXJ5KSB7CisgICAgRlhGVF9Eb25lX0ZyZWVUeXBlKG1fRlRMaWJyYXJ5KTsKKyAgfQorfQorRlhfQk9PTCBDRlBGX1NraWFGb250TWdyOjpJbml0RlRMaWJyYXJ5KCkgeworICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgeworICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmbV9GVExpYnJhcnkpOworICB9CisgIHJldHVybiBtX0ZUTGlicmFyeSAhPSBOVUxMOworfQordm9pZCBDRlBGX1NraWFGb250TWdyOjpMb2FkU3lzdGVtRm9udHMoKSB7CisgIGlmIChtX2JMb2FkZWQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgU2NhblBhdGgoRlhfQlNUUkMoIi9zeXN0ZW0vZm9udHMiKSk7CisgIE91dHB1dFN5c3RlbUZvbnRzKCk7CisgIG1fYkxvYWRlZCA9IFRSVUU7Cit9Cit2b2lkIENGUEZfU2tpYUZvbnRNZ3I6OkxvYWRQcml2YXRlRm9udChJRlhfRmlsZVJlYWQqIHBGb250RmlsZSkge30KK3ZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6TG9hZFByaXZhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGaWxlTmFtZSkge30KK3ZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6TG9hZFByaXZhdGVGb250KHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikge30KK0lGUEZfRm9udCogQ0ZQRl9Ta2lhRm9udE1ncjo6Q3JlYXRlRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFtaWx5bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHVDaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdNYXRjaCkgeworICBGWF9EV09SRCBkd0hhc2ggPSBGUEZfU0tJQUdldEZhbWlseUhhc2goYnNGYW1pbHluYW1lLCBkd1N0eWxlLCB1Q2hhcnNldCk7CisgIElGUEZfRm9udCogcEZvbnQgPSBOVUxMOworICBpZiAobV9GYW1pbHlGb250cy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZComKXBGb250KSkgeworICAgIGlmIChwRm9udCkgeworICAgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsKICAgICB9Ci0gICAgaWYgKGR3U3R5bGUgJiBGWEZPTlRfU0VSSUYpCXsKLSAgICAgICAgYnNGb250ICs9ICJTZXJpZiI7CisgIH0KKyAgRlhfRFdPUkQgZHdGYWNlTmFtZSA9IEZQRl9TS0lBTm9ybWFsaXplRm9udE5hbWUoYnNGYW1pbHluYW1lKTsKKyAgRlhfRFdPUkQgZHdTdWJzdCA9IEZQRl9Ta2lhR2V0U3Vic3RGb250KGR3RmFjZU5hbWUpOworICBGWF9EV09SRCBkd1N1YnN0U2FucyA9IEZQRl9Ta2lhR2V0U2Fuc0ZvbnQoZHdGYWNlTmFtZSk7CisgIEZYX0JPT0wgYk1heWJlU3ltYm9sID0gRlBGX1NraWFNYXliZVN5bWJvbChic0ZhbWlseW5hbWUpOworICBpZiAodUNoYXJzZXQgIT0gRlhGT05UX0FSQUJJQ19DSEFSU0VUICYmIEZQRl9Ta2lhTWF5YmVBcmFiaWMoYnNGYW1pbHluYW1lKSkgeworICAgIHVDaGFyc2V0ID0gRlhGT05UX0FSQUJJQ19DSEFSU0VUOworICB9IGVsc2UgaWYgKHVDaGFyc2V0ID09IEZYRk9OVF9BTlNJX0NIQVJTRVQgJiYKKyAgICAgICAgICAgICAoZHdNYXRjaCAmIEZQRl9NQVRDSEZPTlRfUkVQTEFDRUFOU0kpKSB7CisgICAgdUNoYXJzZXQgPSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUOworICB9CisgIGludDMyX3QgbkV4cGVjdFZhbCA9IEZQRl9TS0lBTUFUQ0hXRUlHSFRfTkFNRTEgKyBGUEZfU0tJQU1BVENIV0VJR0hUXzEgKiAzICsKKyAgICAgICAgICAgICAgICAgICAgICAgRlBGX1NLSUFNQVRDSFdFSUdIVF8yICogMjsKKyAgaW50MzJfdCBuSXRlbSA9IC0xOworICBpbnQzMl90IG5NYXggPSAtMTsKKyAgaW50MzJfdCBuR2x5cGhOdW0gPSAwOworICBmb3IgKGludDMyX3QgaSA9IG1fRm9udEZhY2VzLkdldFVwcGVyQm91bmQoKTsgaSA+PSAwOyBpLS0pIHsKKyAgICBDRlBGX1NraWFQYXRoRm9udCogcEZvbnREZXMgPSAoQ0ZQRl9Ta2lhUGF0aEZvbnQqKW1fRm9udEZhY2VzLkVsZW1lbnRBdChpKTsKKyAgICBpZiAoIShwRm9udERlcy0+bV9kd0NoYXJzZXRzICYgRlBGX1NraWFHZXRDaGFyc2V0KHVDaGFyc2V0KSkpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBic0ZvbnQgKz0gdUNoYXJzZXQ7Ci0gICAgcmV0dXJuIEZQRl9HZXRIYXNoQ29kZV9TdHJpbmdBKGJzRm9udC5jX3N0cigpLCBic0ZvbnQuR2V0TGVuZ3RoKCksIFRSVUUpOwotfQotc3RhdGljIEZYX0JPT0wgRlBGX1NraWFJc0NKSyh1aW50OF90IHVDaGFyc2V0KQotewotICAgIHJldHVybiAodUNoYXJzZXQgPT0gRlhGT05UX0dCMjMxMl9DSEFSU0VUKSB8fCAodUNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpCi0gICAgICAgICAgIHx8ICh1Q2hhcnNldCA9PSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKSB8fCAodUNoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQpOwotfQotc3RhdGljIEZYX0JPT0wgRlBGX1NraWFNYXliZVN5bWJvbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFjZW5hbWUpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gYnNGYWNlbmFtZTsKLSAgICBic05hbWUuTWFrZUxvd2VyKCk7Ci0gICAgcmV0dXJuIGJzTmFtZS5GaW5kKCJzeW1ib2wiKSA+IC0xOwotfQotc3RhdGljIEZYX0JPT0wgRlBGX1NraWFNYXliZUFyYWJpYyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFjZW5hbWUpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gYnNGYWNlbmFtZTsKLSAgICBic05hbWUuTWFrZUxvd2VyKCk7Ci0gICAgcmV0dXJuIGJzTmFtZS5GaW5kKCJhcmFiaWMiKSA+IC0xOwotfQotQ0ZQRl9Ta2lhRm9udE1ncjo6Q0ZQRl9Ta2lhRm9udE1ncigpCi0gICAgOiBtX2JMb2FkZWQoRkFMU0UpLCBtX0ZUTGlicmFyeShOVUxMKQotewotfQotQ0ZQRl9Ta2lhRm9udE1ncjo6fkNGUEZfU2tpYUZvbnRNZ3IoKQotewotICAgIHZvaWQgKnBrZXkgPSBOVUxMOwotICAgIENGUEZfU2tpYUZvbnQgKnBWYWx1ZSA9IE5VTEw7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9GYW1pbHlGb250cy5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBtX0ZhbWlseUZvbnRzLkdldE5leHRBc3NvYyhwb3MsIHBrZXksICh2b2lkKiYpcFZhbHVlKTsKLSAgICAgICAgaWYgKHBWYWx1ZSkgewotICAgICAgICAgICAgcFZhbHVlLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0KKyAgICBpbnQzMl90IG5GaW5kID0gMDsKKyAgICBGWF9EV09SRCBkd1N5c0ZvbnROYW1lID0gRlBGX1NLSUFOb3JtYWxpemVGb250TmFtZShwRm9udERlcy0+bV9wRmFtaWx5KTsKKyAgICBpZiAoZHdGYWNlTmFtZSA9PSBkd1N5c0ZvbnROYW1lKSB7CisgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUX05BTUUxOwogICAgIH0KLSAgICBtX0ZhbWlseUZvbnRzLlJlbW92ZUFsbCgpOwotICAgIGZvciAoaW50MzJfdCBpID0gbV9Gb250RmFjZXMuR2V0VXBwZXJCb3VuZCgpOyBpID49IDA7IGktLSkgewotICAgICAgICBDRlBGX1NraWFGb250RGVzY3JpcHRvciAqcEZvbnQgPSAoQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IqKW1fRm9udEZhY2VzLkVsZW1lbnRBdChpKTsKLSAgICAgICAgZGVsZXRlIHBGb250OworICAgIEZYX0JPT0wgYk1hdGNoZWROYW1lID0gKG5GaW5kID09IEZQRl9TS0lBTUFUQ0hXRUlHSFRfTkFNRTEpOworICAgIGlmICgoZHdTdHlsZSAmIEZYRk9OVF9CT0xEKSA9PSAocEZvbnREZXMtPm1fZHdTdHlsZSAmIEZYRk9OVF9CT0xEKSkgeworICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8xOwogICAgIH0KLSAgICBtX0ZvbnRGYWNlcy5SZW1vdmVBbGwoKTsKLSAgICBpZiAobV9GVExpYnJhcnkpIHsKLSAgICAgICAgRlhGVF9Eb25lX0ZyZWVUeXBlKG1fRlRMaWJyYXJ5KTsKKyAgICBpZiAoKGR3U3R5bGUgJiBGWEZPTlRfSVRBTElDKSA9PSAocEZvbnREZXMtPm1fZHdTdHlsZSAmIEZYRk9OVF9JVEFMSUMpKSB7CisgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUXzE7CiAgICAgfQotfQotRlhfQk9PTCBDRlBGX1NraWFGb250TWdyOjpJbml0RlRMaWJyYXJ5KCkKLXsKLSAgICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgewotICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKKyAgICBpZiAoKGR3U3R5bGUgJiBGWEZPTlRfRklYRURfUElUQ0gpID09CisgICAgICAgIChwRm9udERlcy0+bV9kd1N0eWxlICYgRlhGT05UX0ZJWEVEX1BJVENIKSkgeworICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8yOwogICAgIH0KLSAgICByZXR1cm4gbV9GVExpYnJhcnkgIT0gTlVMTDsKLX0KLXZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6TG9hZFN5c3RlbUZvbnRzKCkKLXsKLSAgICBpZiAobV9iTG9hZGVkKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoKGR3U3R5bGUgJiBGWEZPTlRfU0VSSUYpID09IChwRm9udERlcy0+bV9kd1N0eWxlICYgRlhGT05UX1NFUklGKSkgeworICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8xOwogICAgIH0KLSAgICBTY2FuUGF0aChGWF9CU1RSQygiL3N5c3RlbS9mb250cyIpKTsKLSAgICBPdXRwdXRTeXN0ZW1Gb250cygpOwotICAgIG1fYkxvYWRlZCA9IFRSVUU7Ci19Ci12b2lkIENGUEZfU2tpYUZvbnRNZ3I6OkxvYWRQcml2YXRlRm9udChJRlhfRmlsZVJlYWQqIHBGb250RmlsZSkKLXsKLX0KLXZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6TG9hZFByaXZhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGaWxlTmFtZSkKLXsKLX0KLXZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6TG9hZFByaXZhdGVGb250KHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikKLXsKLX0KLUlGUEZfRm9udCogQ0ZQRl9Ta2lhRm9udE1ncjo6Q3JlYXRlRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFtaWx5bmFtZSwgdWludDhfdCB1Q2hhcnNldCwgRlhfRFdPUkQgZHdTdHlsZSwgRlhfRFdPUkQgZHdNYXRjaCkKLXsKLSAgICBGWF9EV09SRCBkd0hhc2ggPSBGUEZfU0tJQUdldEZhbWlseUhhc2goYnNGYW1pbHluYW1lLCBkd1N0eWxlLCB1Q2hhcnNldCk7Ci0gICAgSUZQRl9Gb250ICpwRm9udCA9IE5VTEw7Ci0gICAgaWYgKG1fRmFtaWx5Rm9udHMuTG9va3VwKCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqJilwRm9udCkpIHsKLSAgICAgICAgaWYgKHBGb250KSB7Ci0gICAgICAgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOwotICAgICAgICB9CisgICAgaWYgKChkd1N0eWxlICYgRlhGT05UX1NDUklQVCkgPT0gKHBGb250RGVzLT5tX2R3U3R5bGUgJiBGWEZPTlRfU0NSSVBUKSkgeworICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8yOwogICAgIH0KLSAgICBGWF9EV09SRCBkd0ZhY2VOYW1lID0gRlBGX1NLSUFOb3JtYWxpemVGb250TmFtZShic0ZhbWlseW5hbWUpOwotICAgIEZYX0RXT1JEIGR3U3Vic3QgPSBGUEZfU2tpYUdldFN1YnN0Rm9udChkd0ZhY2VOYW1lKTsKLSAgICBGWF9EV09SRCBkd1N1YnN0U2FucyA9IEZQRl9Ta2lhR2V0U2Fuc0ZvbnQoZHdGYWNlTmFtZSk7Ci0gICAgRlhfQk9PTCBiTWF5YmVTeW1ib2wgPSBGUEZfU2tpYU1heWJlU3ltYm9sKGJzRmFtaWx5bmFtZSk7Ci0gICAgaWYgKHVDaGFyc2V0ICE9IEZYRk9OVF9BUkFCSUNfQ0hBUlNFVCAmJiBGUEZfU2tpYU1heWJlQXJhYmljKGJzRmFtaWx5bmFtZSkpIHsKLSAgICAgICAgdUNoYXJzZXQgPSBGWEZPTlRfQVJBQklDX0NIQVJTRVQ7Ci0gICAgfSBlbHNlIGlmICh1Q2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUICYmIChkd01hdGNoICYgRlBGX01BVENIRk9OVF9SRVBMQUNFQU5TSSkpIHsKLSAgICAgICAgdUNoYXJzZXQgPSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUOworICAgIGlmIChkd1N1YnN0ID09IGR3U3lzRm9udE5hbWUgfHwgZHdTdWJzdFNhbnMgPT0gZHdTeXNGb250TmFtZSkgeworICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMjsKKyAgICAgIGJNYXRjaGVkTmFtZSA9IFRSVUU7CiAgICAgfQotICAgIGludDMyX3QgbkV4cGVjdFZhbCA9IEZQRl9TS0lBTUFUQ0hXRUlHSFRfTkFNRTEgKyBGUEZfU0tJQU1BVENIV0VJR0hUXzEgKiAzICsgRlBGX1NLSUFNQVRDSFdFSUdIVF8yICogMjsKLSAgICBpbnQzMl90IG5JdGVtID0gLTE7Ci0gICAgaW50MzJfdCBuTWF4ID0gLTE7Ci0gICAgaW50MzJfdCBuR2x5cGhOdW0gPSAwOwotICAgIGZvciAoaW50MzJfdCBpID0gbV9Gb250RmFjZXMuR2V0VXBwZXJCb3VuZCgpOyBpID49IDA7IGktLSkgewotICAgICAgICBDRlBGX1NraWFQYXRoRm9udCAqcEZvbnREZXMgPSAoQ0ZQRl9Ta2lhUGF0aEZvbnQqKW1fRm9udEZhY2VzLkVsZW1lbnRBdChpKTsKLSAgICAgICAgaWYoIShwRm9udERlcy0+bV9kd0NoYXJzZXRzICYgRlBGX1NraWFHZXRDaGFyc2V0KHVDaGFyc2V0KSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgbkZpbmQgPSAwOwotICAgICAgICBGWF9EV09SRCBkd1N5c0ZvbnROYW1lID0gRlBGX1NLSUFOb3JtYWxpemVGb250TmFtZShwRm9udERlcy0+bV9wRmFtaWx5KTsKLSAgICAgICAgaWYgKGR3RmFjZU5hbWUgPT0gZHdTeXNGb250TmFtZSkgewotICAgICAgICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMTsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJNYXRjaGVkTmFtZSA9IChuRmluZCA9PSBGUEZfU0tJQU1BVENIV0VJR0hUX05BTUUxKTsKLSAgICAgICAgaWYgKChkd1N0eWxlICYgRlhGT05UX0JPTEQpID09IChwRm9udERlcy0+bV9kd1N0eWxlICYgRlhGT05UX0JPTEQpKSB7Ci0gICAgICAgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUXzE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkd1N0eWxlICYgRlhGT05UX0lUQUxJQykgPT0gKHBGb250RGVzLT5tX2R3U3R5bGUgJiBGWEZPTlRfSVRBTElDKSkgewotICAgICAgICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZHdTdHlsZSAmIEZYRk9OVF9GSVhFRF9QSVRDSCkgPT0gKHBGb250RGVzLT5tX2R3U3R5bGUgJiBGWEZPTlRfRklYRURfUElUQ0gpKSB7Ci0gICAgICAgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUXzI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkd1N0eWxlICYgRlhGT05UX1NFUklGKSA9PSAocEZvbnREZXMtPm1fZHdTdHlsZSAmIEZYRk9OVF9TRVJJRikpIHsKLSAgICAgICAgICAgIG5GaW5kICs9IEZQRl9TS0lBTUFUQ0hXRUlHSFRfMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGR3U3R5bGUgJiBGWEZPTlRfU0NSSVBUKSA9PSAocEZvbnREZXMtPm1fZHdTdHlsZSAmIEZYRk9OVF9TQ1JJUFQpKSB7Ci0gICAgICAgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUXzI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGR3U3Vic3QgPT0gZHdTeXNGb250TmFtZSB8fCBkd1N1YnN0U2FucyA9PSBkd1N5c0ZvbnROYW1lKSB7Ci0gICAgICAgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUX05BTUUyOwotICAgICAgICAgICAgYk1hdGNoZWROYW1lID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAodUNoYXJzZXQgPT0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCB8fCBiTWF5YmVTeW1ib2wpIHsKLSAgICAgICAgICAgIGlmIChuRmluZCA+IG5NYXggJiYgYk1hdGNoZWROYW1lKSB7Ci0gICAgICAgICAgICAgICAgbk1heCA9IG5GaW5kOwotICAgICAgICAgICAgICAgIG5JdGVtID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChGUEZfU2tpYUlzQ0pLKHVDaGFyc2V0KSkgewotICAgICAgICAgICAgaWYgKGJNYXRjaGVkTmFtZSB8fCBwRm9udERlcy0+bV9pR2x5cGhOdW0gPiBuR2x5cGhOdW0pIHsKLSAgICAgICAgICAgICAgICBuSXRlbSA9IGk7Ci0gICAgICAgICAgICAgICAgbkdseXBoTnVtID0gcEZvbnREZXMtPm1faUdseXBoTnVtOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG5GaW5kID4gbk1heCkgewotICAgICAgICAgICAgbk1heCA9IG5GaW5kOwotICAgICAgICAgICAgbkl0ZW0gPSBpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuRXhwZWN0VmFsIDw9IG5GaW5kKSB7Ci0gICAgICAgICAgICBuSXRlbSA9IGk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgIGlmICh1Q2hhcnNldCA9PSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUIHx8IGJNYXliZVN5bWJvbCkgeworICAgICAgaWYgKG5GaW5kID4gbk1heCAmJiBiTWF0Y2hlZE5hbWUpIHsKKyAgICAgICAgbk1heCA9IG5GaW5kOworICAgICAgICBuSXRlbSA9IGk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChGUEZfU2tpYUlzQ0pLKHVDaGFyc2V0KSkgeworICAgICAgaWYgKGJNYXRjaGVkTmFtZSB8fCBwRm9udERlcy0+bV9pR2x5cGhOdW0gPiBuR2x5cGhOdW0pIHsKKyAgICAgICAgbkl0ZW0gPSBpOworICAgICAgICBuR2x5cGhOdW0gPSBwRm9udERlcy0+bV9pR2x5cGhOdW07CisgICAgICB9CisgICAgfSBlbHNlIGlmIChuRmluZCA+IG5NYXgpIHsKKyAgICAgIG5NYXggPSBuRmluZDsKKyAgICAgIG5JdGVtID0gaTsKICAgICB9Ci0gICAgaWYgKG5JdGVtID4gLTEpIHsKLSAgICAgICAgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgKnBGb250RGVzID0gKENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKiltX0ZvbnRGYWNlcy5FbGVtZW50QXQobkl0ZW0pOworICAgIGlmIChuRXhwZWN0VmFsIDw9IG5GaW5kKSB7CisgICAgICBuSXRlbSA9IGk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKG5JdGVtID4gLTEpIHsKKyAgICBDRlBGX1NraWFGb250RGVzY3JpcHRvciogcEZvbnREZXMgPQorICAgICAgICAoQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IqKW1fRm9udEZhY2VzLkVsZW1lbnRBdChuSXRlbSk7CiA8PDw8PDw8IEhFQUQKLSAgICAgICAgQ0ZQRl9Ta2lhRm9udCAqcEZvbnQgPSBGWF9ORVcgQ0ZQRl9Ta2lhRm9udDsKLSAgICAgICAgaWYgKHBGb250KSB7Ci0gICAgICAgICAgICBpZiAocEZvbnQtPkluaXRGb250KHRoaXMsIHBGb250RGVzLCBic0ZhbWlseW5hbWUsIGR3U3R5bGUsIHVDaGFyc2V0KSkgewotICAgICAgICAgICAgICAgIG1fRmFtaWx5Rm9udHMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZCopcEZvbnQpOwotICAgICAgICAgICAgICAgIHJldHVybiBwRm9udC0+UmV0YWluKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRm9udC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgcEZvbnQgPSBOVUxMOworICAgIENGUEZfU2tpYUZvbnQqIHBGb250ID0gRlhfTkVXIENGUEZfU2tpYUZvbnQ7CisgICAgaWYgKHBGb250KSB7CisgICAgICBpZiAocEZvbnQtPkluaXRGb250KHRoaXMsIHBGb250RGVzLCBic0ZhbWlseW5hbWUsIGR3U3R5bGUsIHVDaGFyc2V0KSkgeworICAgICAgICBtX0ZhbWlseUZvbnRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqKXBGb250KTsKKyAgICAgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsKKyAgICAgIH0KKyAgICAgIHBGb250LT5SZWxlYXNlKCk7CisgICAgICBwRm9udCA9IE5VTEw7CiA9PT09PT09Ci0gICAgICAgIENGUEZfU2tpYUZvbnQgKnBGb250ID0gbmV3IENGUEZfU2tpYUZvbnQ7Ci0gICAgICAgIGlmIChwRm9udC0+SW5pdEZvbnQodGhpcywgcEZvbnREZXMsIGJzRmFtaWx5bmFtZSwgZHdTdHlsZSwgdUNoYXJzZXQpKSB7Ci0gICAgICAgICAgICBtX0ZhbWlseUZvbnRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqKXBGb250KTsKLSAgICAgICAgICAgIHJldHVybiBwRm9udC0+UmV0YWluKCk7CisgICAgQ0ZQRl9Ta2lhRm9udCogcEZvbnQgPSBuZXcgQ0ZQRl9Ta2lhRm9udDsKKyAgICBpZiAocEZvbnQtPkluaXRGb250KHRoaXMsIHBGb250RGVzLCBic0ZhbWlseW5hbWUsIGR3U3R5bGUsIHVDaGFyc2V0KSkgeworICAgICAgbV9GYW1pbHlGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7CisgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOwogPj4+Pj4+PiBiYjE3ODY4Li4uIFVzZSBzdGRpbnQuaCB0eXBlcyB0aHJvdWdob3V0IFBERml1bS4KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcEZvbnQ7CiAgICAgfQorICAgIHJldHVybiBwRm9udDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KK0ZYRlRfRmFjZSBDRlBGX1NraWFGb250TWdyOjpHZXRGb250RmFjZShJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGYWNlSW5kZXgpIHsKKyAgaWYgKCFwRmlsZVJlYWQpIHsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAocEZpbGVSZWFkLT5HZXRTaXplKCkgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChpRmFjZUluZGV4IDwgMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYRlRfU3RyZWFtUmVjIHN0cmVhbVJlYzsKKyAgRlhTWVNfbWVtc2V0KCZzdHJlYW1SZWMsIDAsIHNpemVvZihGWEZUX1N0cmVhbVJlYykpOworICBzdHJlYW1SZWMuc2l6ZSA9IHBGaWxlUmVhZC0+R2V0U2l6ZSgpOworICBzdHJlYW1SZWMuZGVzY3JpcHRvci5wb2ludGVyID0gcEZpbGVSZWFkOworICBzdHJlYW1SZWMucmVhZCA9IEZQRl9Ta2lhU3RyZWFtX1JlYWQ7CisgIHN0cmVhbVJlYy5jbG9zZSA9IEZQRl9Ta2lhU3RyZWFtX0Nsb3NlOworICBGWEZUX09wZW5fQXJncyBhcmdzOworICBhcmdzLmZsYWdzID0gRlRfT1BFTl9TVFJFQU07CisgIGFyZ3Muc3RyZWFtID0gJnN0cmVhbVJlYzsKKyAgRlhGVF9GYWNlIGZhY2U7CisgIGlmIChGWEZUX09wZW5fRmFjZShtX0ZUTGlicmFyeSwgJmFyZ3MsIGlGYWNlSW5kZXgsICZmYWNlKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDAsIDY0KTsKKyAgcmV0dXJuIGZhY2U7CiB9Ci1GWEZUX0ZhY2UgQ0ZQRl9Ta2lhRm9udE1ncjo6R2V0Rm9udEZhY2UoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQsIGludDMyX3QgaUZhY2VJbmRleCkKLXsKLSAgICBpZiAoIXBGaWxlUmVhZCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBGaWxlUmVhZC0+R2V0U2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChpRmFjZUluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhGVF9TdHJlYW1SZWMgc3RyZWFtUmVjOwotICAgIEZYU1lTX21lbXNldCgmc3RyZWFtUmVjLCAwLCBzaXplb2YoRlhGVF9TdHJlYW1SZWMpKTsKLSAgICBzdHJlYW1SZWMuc2l6ZSA9IHBGaWxlUmVhZC0+R2V0U2l6ZSgpOwotICAgIHN0cmVhbVJlYy5kZXNjcmlwdG9yLnBvaW50ZXIgPSBwRmlsZVJlYWQ7Ci0gICAgc3RyZWFtUmVjLnJlYWQgPSBGUEZfU2tpYVN0cmVhbV9SZWFkOwotICAgIHN0cmVhbVJlYy5jbG9zZSA9IEZQRl9Ta2lhU3RyZWFtX0Nsb3NlOwotICAgIEZYRlRfT3Blbl9BcmdzIGFyZ3M7Ci0gICAgYXJncy5mbGFncyA9IEZUX09QRU5fU1RSRUFNOwotICAgIGFyZ3Muc3RyZWFtID0gJnN0cmVhbVJlYzsKLSAgICBGWEZUX0ZhY2UgZmFjZTsKLSAgICBpZiAoRlhGVF9PcGVuX0ZhY2UobV9GVExpYnJhcnksICZhcmdzLCBpRmFjZUluZGV4LCAmZmFjZSkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDAsIDY0KTsKLSAgICByZXR1cm4gZmFjZTsKK0ZYRlRfRmFjZSBDRlBGX1NraWFGb250TWdyOjpHZXRGb250RmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGYWNlSW5kZXgpIHsKKyAgaWYgKGJzRmlsZS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoaUZhY2VJbmRleCA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWEZUX09wZW5fQXJncyBhcmdzOworICBhcmdzLmZsYWdzID0gRlRfT1BFTl9QQVRITkFNRTsKKyAgYXJncy5wYXRobmFtZSA9IChGVF9TdHJpbmcqKWJzRmlsZS5HZXRDU3RyKCk7CisgIEZYRlRfRmFjZSBmYWNlOworICBpZiAoRlhGVF9PcGVuX0ZhY2UobV9GVExpYnJhcnksICZhcmdzLCBpRmFjZUluZGV4LCAmZmFjZSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMoZmFjZSwgMCwgNjQpOworICByZXR1cm4gZmFjZTsKIH0KLUZYRlRfRmFjZSBDRlBGX1NraWFGb250TWdyOjpHZXRGb250RmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmlsZSwgaW50MzJfdCBpRmFjZUluZGV4ICkKLXsKLSAgICBpZiAoYnNGaWxlLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGlGYWNlSW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWEZUX09wZW5fQXJncyBhcmdzOwotICAgIGFyZ3MuZmxhZ3MgPSBGVF9PUEVOX1BBVEhOQU1FOwotICAgIGFyZ3MucGF0aG5hbWUgPSAoRlRfU3RyaW5nKilic0ZpbGUuR2V0Q1N0cigpOwotICAgIEZYRlRfRmFjZSBmYWNlOwotICAgIGlmIChGWEZUX09wZW5fRmFjZShtX0ZUTGlicmFyeSwgJmFyZ3MsIGlGYWNlSW5kZXgsICZmYWNlKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDAsIDY0KTsKLSAgICByZXR1cm4gZmFjZTsKK0ZYRlRfRmFjZSBDRlBGX1NraWFGb250TWdyOjpHZXRGb250RmFjZShjb25zdCB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzekJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGYWNlSW5kZXgpIHsKKyAgaWYgKCFwQnVmZmVyIHx8IHN6QnVmZmVyIDwgMSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChpRmFjZUluZGV4IDwgMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYRlRfT3Blbl9BcmdzIGFyZ3M7CisgIGFyZ3MuZmxhZ3MgPSBGVF9PUEVOX01FTU9SWTsKKyAgYXJncy5tZW1vcnlfYmFzZSA9IHBCdWZmZXI7CisgIGFyZ3MubWVtb3J5X3NpemUgPSBzekJ1ZmZlcjsKKyAgRlhGVF9GYWNlIGZhY2U7CisgIGlmIChGWEZUX09wZW5fRmFjZShtX0ZUTGlicmFyeSwgJmFyZ3MsIGlGYWNlSW5kZXgsICZmYWNlKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWEZUX1NldF9QaXhlbF9TaXplcyhmYWNlLCAwLCA2NCk7CisgIHJldHVybiBmYWNlOwogfQotRlhGVF9GYWNlIENGUEZfU2tpYUZvbnRNZ3I6OkdldEZvbnRGYWNlKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgaW50MzJfdCBpRmFjZUluZGV4ICkKLXsKLSAgICBpZiAoIXBCdWZmZXIgfHwgc3pCdWZmZXIgPCAxKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwordm9pZCBDRlBGX1NraWFGb250TWdyOjpTY2FuUGF0aChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHBhdGgpIHsKKyAgdm9pZCogaGFuZGxlID0gRlhfT3BlbkZvbGRlcihwYXRoLkdldENTdHIoKSk7CisgIGlmICghaGFuZGxlKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9CeXRlU3RyaW5nIGZpbGVuYW1lOworICBGWF9CT09MIGJGb2xkZXIgPSBGQUxTRTsKKyAgd2hpbGUgKEZYX0dldE5leHRGaWxlKGhhbmRsZSwgZmlsZW5hbWUsIGJGb2xkZXIpKSB7CisgICAgaWYgKGJGb2xkZXIpIHsKKyAgICAgIGlmIChmaWxlbmFtZSA9PSBGWF9CU1RSQygiLiIpIHx8IGZpbGVuYW1lID09IEZYX0JTVFJDKCIuLiIpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBleHQgPSBmaWxlbmFtZS5SaWdodCg0KTsKKyAgICAgIGV4dC5NYWtlTG93ZXIoKTsKKyAgICAgIGlmIChleHQgIT0gRlhfQlNUUkMoIi50dGYiKSAmJiBleHQgIT0gRlhfQlNUUkMoIi50dGMiKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKGlGYWNlSW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIENGWF9CeXRlU3RyaW5nIGZ1bGxwYXRoID0gcGF0aDsKKyAgICBmdWxscGF0aCArPSAiLyI7CisgICAgZnVsbHBhdGggKz0gZmlsZW5hbWU7CisgICAgaWYgKGJGb2xkZXIpIHsKKyAgICAgIFNjYW5QYXRoKGZ1bGxwYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgU2NhbkZpbGUoZnVsbHBhdGgpOwogICAgIH0KLSAgICBGWEZUX09wZW5fQXJncyBhcmdzOwotICAgIGFyZ3MuZmxhZ3MgPSBGVF9PUEVOX01FTU9SWTsKLSAgICBhcmdzLm1lbW9yeV9iYXNlID0gcEJ1ZmZlcjsKLSAgICBhcmdzLm1lbW9yeV9zaXplID0gc3pCdWZmZXI7Ci0gICAgRlhGVF9GYWNlIGZhY2U7Ci0gICAgaWYgKEZYRlRfT3Blbl9GYWNlKG1fRlRMaWJyYXJ5LCAmYXJncywgaUZhY2VJbmRleCwgJmZhY2UpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMoZmFjZSwgMCwgNjQpOwotICAgIHJldHVybiBmYWNlOworICB9CisgIEZYX0Nsb3NlRm9sZGVyKGhhbmRsZSk7CiB9Ci12b2lkIENGUEZfU2tpYUZvbnRNZ3I6OlNjYW5QYXRoKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcGF0aCkKLXsKLSAgICB2b2lkICpoYW5kbGUgPSBGWF9PcGVuRm9sZGVyKHBhdGguR2V0Q1N0cigpKTsKLSAgICBpZiAoIWhhbmRsZSkgewotICAgICAgICByZXR1cm47Cit2b2lkIENGUEZfU2tpYUZvbnRNZ3I6OlNjYW5GaWxlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZSkgeworICBGWEZUX0ZhY2UgZmFjZSA9IEdldEZvbnRGYWNlKGZpbGUpOworICBpZiAoZmFjZSkgeworICAgIENGUEZfU2tpYVBhdGhGb250KiBwRm9udERlc2MgPSBGWF9ORVcgQ0ZQRl9Ta2lhUGF0aEZvbnQ7CisgICAgaWYgKCFwRm9udERlc2MpIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZmlsZW5hbWU7Ci0gICAgRlhfQk9PTAliRm9sZGVyID0gRkFMU0U7Ci0gICAgd2hpbGUgKEZYX0dldE5leHRGaWxlKGhhbmRsZSwgZmlsZW5hbWUsIGJGb2xkZXIpKSB7Ci0gICAgICAgIGlmIChiRm9sZGVyKSB7Ci0gICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT0gRlhfQlNUUkMoIi4iKSB8fCBmaWxlbmFtZSA9PSBGWF9CU1RSQygiLi4iKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZXh0ID0gZmlsZW5hbWUuUmlnaHQoNCk7Ci0gICAgICAgICAgICBleHQuTWFrZUxvd2VyKCk7Ci0gICAgICAgICAgICBpZiAoZXh0ICE9IEZYX0JTVFJDKCIudHRmIikgJiYgZXh0ICE9IEZYX0JTVFJDKCIudHRjIikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBmdWxscGF0aCA9IHBhdGg7Ci0gICAgICAgIGZ1bGxwYXRoICs9ICIvIjsKLSAgICAgICAgZnVsbHBhdGggKz0gZmlsZW5hbWU7Ci0gICAgICAgIGlmIChiRm9sZGVyKSB7Ci0gICAgICAgICAgICBTY2FuUGF0aChmdWxscGF0aCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTY2FuRmlsZShmdWxscGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfQ2xvc2VGb2xkZXIoaGFuZGxlKTsKKyAgICBwRm9udERlc2MtPlNldFBhdGgoZmlsZS5HZXRDU3RyKCkpOworICAgIFJlcG9ydEZhY2UoZmFjZSwgcEZvbnREZXNjKTsKKyAgICBtX0ZvbnRGYWNlcy5BZGQocEZvbnREZXNjKTsKKyAgICBGWEZUX0RvbmVfRmFjZShmYWNlKTsKKyAgfQogfQotdm9pZCBDRlBGX1NraWFGb250TWdyOjpTY2FuRmlsZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGUpCi17Ci0gICAgRlhGVF9GYWNlIGZhY2UgPSBHZXRGb250RmFjZShmaWxlKTsKLSAgICBpZiAoZmFjZSkgewotICAgICAgICBDRlBGX1NraWFQYXRoRm9udCAqcEZvbnREZXNjID0gRlhfTkVXIENGUEZfU2tpYVBhdGhGb250OwotICAgICAgICBpZiAoIXBGb250RGVzYykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBGb250RGVzYy0+U2V0UGF0aChmaWxlLkdldENTdHIoKSk7Ci0gICAgICAgIFJlcG9ydEZhY2UoZmFjZSwgcEZvbnREZXNjKTsKLSAgICAgICAgbV9Gb250RmFjZXMuQWRkKHBGb250RGVzYyk7Ci0gICAgICAgIEZYRlRfRG9uZV9GYWNlKGZhY2UpOwotICAgIH0KLX0KLXN0YXRpYyBjb25zdCBGWF9EV09SRCBnX0ZQRlNraWFGb250Q2hhcnNldHMgW10gPSB7CitzdGF0aWMgY29uc3QgRlhfRFdPUkQgZ19GUEZTa2lhRm9udENoYXJzZXRzW10gPSB7CiAgICAgRlBGX1NLSUFDSEFSU0VUX0Fuc2ksCiAgICAgRlBGX1NLSUFDSEFSU0VUX0VlYXN0ZXJuRXVyb3BlYW4sCiAgICAgRlBGX1NLSUFDSEFSU0VUX0N5cmlsbGljLApAQCAtNTEzLDU0ICs0OTMsNTEgQEAKICAgICBGUEZfU0tJQUNIQVJTRVRfT0VNLAogICAgIEZQRl9TS0lBQ0hBUlNFVF9TeW1ib2wsCiB9Owotc3RhdGljIEZYX0RXT1JEIEZQRl9Ta2lhR2V0RmFjZUNoYXJzZXQoVFRfT1MyICpwT1MyKQotewotICAgIEZYX0RXT1JEIGR3Q2hhcnNldCA9IDA7Ci0gICAgaWYgKHBPUzIpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzI7IGkrKykgewotICAgICAgICAgICAgaWYgKHBPUzItPnVsQ29kZVBhZ2VSYW5nZTEgJiAoMSA8PCBpKSkgewotICAgICAgICAgICAgICAgIGR3Q2hhcnNldCB8PSBnX0ZQRlNraWFGb250Q2hhcnNldHNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK3N0YXRpYyBGWF9EV09SRCBGUEZfU2tpYUdldEZhY2VDaGFyc2V0KFRUX09TMiogcE9TMikgeworICBGWF9EV09SRCBkd0NoYXJzZXQgPSAwOworICBpZiAocE9TMikgeworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgIGlmIChwT1MyLT51bENvZGVQYWdlUmFuZ2UxICYgKDEgPDwgaSkpIHsKKyAgICAgICAgZHdDaGFyc2V0IHw9IGdfRlBGU2tpYUZvbnRDaGFyc2V0c1tpXTsKKyAgICAgIH0KICAgICB9Ci0gICAgZHdDaGFyc2V0IHw9IEZQRl9TS0lBQ0hBUlNFVF9EZWZhdWx0OwotICAgIHJldHVybiBkd0NoYXJzZXQ7CisgIH0KKyAgZHdDaGFyc2V0IHw9IEZQRl9TS0lBQ0hBUlNFVF9EZWZhdWx0OworICByZXR1cm4gZHdDaGFyc2V0OwogfQotdm9pZCBDRlBGX1NraWFGb250TWdyOjpSZXBvcnRGYWNlKEZYRlRfRmFjZSBmYWNlLCBDRlBGX1NraWFGb250RGVzY3JpcHRvciAqcEZvbnREZXNjKQotewotICAgIGlmICghZmFjZSB8fCAhcEZvbnREZXNjKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6UmVwb3J0RmFjZShGWEZUX0ZhY2UgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlBGX1NraWFGb250RGVzY3JpcHRvciogcEZvbnREZXNjKSB7CisgIGlmICghZmFjZSB8fCAhcEZvbnREZXNjKSB7CisgICAgcmV0dXJuOworICB9CisgIHBGb250RGVzYy0+U2V0RmFtaWx5KEZYRlRfR2V0X0ZhY2VfRmFtaWx5X05hbWUoZmFjZSkpOworICBpZiAoRlhGVF9Jc19GYWNlX0JvbGQoZmFjZSkpIHsKKyAgICBwRm9udERlc2MtPm1fZHdTdHlsZSB8PSBGWEZPTlRfQk9MRDsKKyAgfQorICBpZiAoRlhGVF9Jc19GYWNlX0l0YWxpYyhmYWNlKSkgeworICAgIHBGb250RGVzYy0+bV9kd1N0eWxlIHw9IEZYRk9OVF9JVEFMSUM7CisgIH0KKyAgaWYgKEZUX0lTX0ZJWEVEX1dJRFRIKGZhY2UpKSB7CisgICAgcEZvbnREZXNjLT5tX2R3U3R5bGUgfD0gRlhGT05UX0ZJWEVEX1BJVENIOworICB9CisgIFRUX09TMiogcE9TMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKGZhY2UsIGZ0X3NmbnRfb3MyKTsKKyAgaWYgKHBPUzIpIHsKKyAgICBpZiAocE9TMi0+dWxDb2RlUGFnZVJhbmdlMSAmICgxIDw8IDMxKSkgeworICAgICAgcEZvbnREZXNjLT5tX2R3U3R5bGUgfD0gRlhGT05UX1NZTUJPTElDOwogICAgIH0KLSAgICBwRm9udERlc2MtPlNldEZhbWlseShGWEZUX0dldF9GYWNlX0ZhbWlseV9OYW1lKGZhY2UpKTsKLSAgICBpZiAoRlhGVF9Jc19GYWNlX0JvbGQoZmFjZSkpCXsKLSAgICAgICAgcEZvbnREZXNjLT5tX2R3U3R5bGUgfD0gRlhGT05UX0JPTEQ7CisgICAgaWYgKHBPUzItPnBhbm9zZVswXSA9PSAyKSB7CisgICAgICB1aW50OF90IHVTZXJpZiA9IHBPUzItPnBhbm9zZVsxXTsKKyAgICAgIGlmICgodVNlcmlmID4gMSAmJiB1U2VyaWYgPCAxMCkgfHwgdVNlcmlmID4gMTMpIHsKKyAgICAgICAgcEZvbnREZXNjLT5tX2R3U3R5bGUgfD0gRlhGT05UX1NFUklGOworICAgICAgfQogICAgIH0KLSAgICBpZiAoRlhGVF9Jc19GYWNlX0l0YWxpYyhmYWNlKSkJewotICAgICAgICBwRm9udERlc2MtPm1fZHdTdHlsZSB8PSBGWEZPTlRfSVRBTElDOwotICAgIH0KLSAgICBpZiAoRlRfSVNfRklYRURfV0lEVEgoZmFjZSkpCXsKLSAgICAgICAgcEZvbnREZXNjLT5tX2R3U3R5bGUgfD0gRlhGT05UX0ZJWEVEX1BJVENIOwotICAgIH0KLSAgICBUVF9PUzIgKnBPUzIgPSAoVFRfT1MyKilGVF9HZXRfU2ZudF9UYWJsZShmYWNlLCBmdF9zZm50X29zMik7Ci0gICAgaWYgKHBPUzIpIHsKLSAgICAgICAgaWYgKHBPUzItPnVsQ29kZVBhZ2VSYW5nZTEgJiAoMSA8PCAzMSkpIHsKLSAgICAgICAgICAgIHBGb250RGVzYy0+bV9kd1N0eWxlIHw9IEZYRk9OVF9TWU1CT0xJQzsKLSAgICAgICAgfQotICAgICAgICBpZiAocE9TMi0+cGFub3NlWzBdID09IDIpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgdVNlcmlmID0gcE9TMi0+cGFub3NlWzFdOwotICAgICAgICAgICAgaWYgKCh1U2VyaWYgPiAxICYmIHVTZXJpZiA8IDEwKSB8fCB1U2VyaWYgPiAxMykgewotICAgICAgICAgICAgICAgIHBGb250RGVzYy0+bV9kd1N0eWxlIHw9IEZYRk9OVF9TRVJJRjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocE9TMiAmJiAocE9TMi0+dWxDb2RlUGFnZVJhbmdlMSAmICgxIDw8IDMxKSkpIHsKLSAgICAgICAgcEZvbnREZXNjLT5tX2R3U3R5bGUgfD0gRlhGT05UX1NZTUJPTElDOwotICAgIH0KLSAgICBwRm9udERlc2MtPm1fZHdDaGFyc2V0cyA9IEZQRl9Ta2lhR2V0RmFjZUNoYXJzZXQocE9TMik7Ci0gICAgcEZvbnREZXNjLT5tX2lGYWNlSW5kZXggPSBmYWNlLT5mYWNlX2luZGV4OwotICAgIHBGb250RGVzYy0+bV9pR2x5cGhOdW0gPSBmYWNlLT5udW1fZ2x5cGhzOworICB9CisgIGlmIChwT1MyICYmIChwT1MyLT51bENvZGVQYWdlUmFuZ2UxICYgKDEgPDwgMzEpKSkgeworICAgIHBGb250RGVzYy0+bV9kd1N0eWxlIHw9IEZYRk9OVF9TWU1CT0xJQzsKKyAgfQorICBwRm9udERlc2MtPm1fZHdDaGFyc2V0cyA9IEZQRl9Ta2lhR2V0RmFjZUNoYXJzZXQocE9TMik7CisgIHBGb250RGVzYy0+bV9pRmFjZUluZGV4ID0gZmFjZS0+ZmFjZV9pbmRleDsKKyAgcEZvbnREZXNjLT5tX2lHbHlwaE51bSA9IGZhY2UtPm51bV9nbHlwaHM7CiB9Ci12b2lkIENGUEZfU2tpYUZvbnRNZ3I6Ok91dHB1dFN5c3RlbUZvbnRzKCkKLXsKLX0KK3ZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6T3V0cHV0U3lzdGVtRm9udHMoKSB7fQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250bWdyLmggYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250bWdyLmgKaW5kZXggOGM3MjFmZi4uYzVkZDhmZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuaApAQCAtOCwxMTEgKzgsMTAxIEBACiAjZGVmaW5lIENPUkVfU1JDX0ZYR0VfQU5EUk9JRF9GUEZfU0tJQUZPTlRNR1JfSF8KIAogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCi0jZGVmaW5lIEZQRl9TS0lBRk9OVFRZUEVfVW5rbm93bgkwCi0jZGVmaW5lCUZQRl9TS0lBRk9OVFRZUEVfUGF0aAkJMQotI2RlZmluZSBGUEZfU0tJQUZPTlRUWVBFX0ZpbGUJCTIKLSNkZWZpbmUgRlBGX1NLSUFGT05UVFlQRV9CdWZmZXIJCTMKLWNsYXNzIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yCi17Ci1wdWJsaWM6Ci0gICAgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IoKSA6IG1fcEZhbWlseShOVUxMKSwgbV9kd1N0eWxlKDApLCBtX2lGYWNlSW5kZXgoMCksIG1fZHdDaGFyc2V0cygwKSwgbV9pR2x5cGhOdW0oMCkge30KLSAgICB2aXJ0dWFsIH5DRlBGX1NraWFGb250RGVzY3JpcHRvcigpCi0gICAgewotICAgICAgICBpZiAobV9wRmFtaWx5KSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcEZhbWlseSk7Ci0gICAgICAgIH0KKyNkZWZpbmUgRlBGX1NLSUFGT05UVFlQRV9Vbmtub3duIDAKKyNkZWZpbmUgRlBGX1NLSUFGT05UVFlQRV9QYXRoIDEKKyNkZWZpbmUgRlBGX1NLSUFGT05UVFlQRV9GaWxlIDIKKyNkZWZpbmUgRlBGX1NLSUFGT05UVFlQRV9CdWZmZXIgMworY2xhc3MgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgeworIHB1YmxpYzoKKyAgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IoKQorICAgICAgOiBtX3BGYW1pbHkoTlVMTCksCisgICAgICAgIG1fZHdTdHlsZSgwKSwKKyAgICAgICAgbV9pRmFjZUluZGV4KDApLAorICAgICAgICBtX2R3Q2hhcnNldHMoMCksCisgICAgICAgIG1faUdseXBoTnVtKDApIHt9CisgIHZpcnR1YWwgfkNGUEZfU2tpYUZvbnREZXNjcmlwdG9yKCkgeworICAgIGlmIChtX3BGYW1pbHkpIHsKKyAgICAgIEZYX0ZyZWUobV9wRmFtaWx5KTsKICAgICB9Ci0gICAgdmlydHVhbAlpbnQzMl90CUdldFR5cGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEZQRl9TS0lBRk9OVFRZUEVfVW5rbm93bjsKKyAgfQorICB2aXJ0dWFsIGludDMyX3QgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZQRl9TS0lBRk9OVFRZUEVfVW5rbm93bjsgfQorICB2b2lkIFNldEZhbWlseShjb25zdCBGWF9DSEFSKiBwRmFtaWx5KSB7CisgICAgaWYgKG1fcEZhbWlseSkgeworICAgICAgRlhfRnJlZShtX3BGYW1pbHkpOwogICAgIH0KLSAgICB2b2lkCQkJCVNldEZhbWlseShjb25zdCBGWF9DSEFSKiBwRmFtaWx5KQotICAgIHsKLSAgICAgICAgaWYgKG1fcEZhbWlseSkgewotICAgICAgICAgICAgRlhfRnJlZShtX3BGYW1pbHkpOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgaVNpemUgPSBGWFNZU19zdHJsZW4ocEZhbWlseSk7Ci0gICAgICAgIG1fcEZhbWlseSA9IEZYX0FsbG9jKEZYX0NIQVIsIGlTaXplICsgMSk7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BGYW1pbHksIHBGYW1pbHksIGlTaXplICogc2l6ZW9mKEZYX0NIQVIpKTsKLSAgICAgICAgbV9wRmFtaWx5W2lTaXplXSA9IDA7Ci0gICAgfQotICAgIEZYX0NIQVIqCQltX3BGYW1pbHk7Ci0gICAgRlhfRFdPUkQJCW1fZHdTdHlsZTsKLSAgICBpbnQzMl90CQltX2lGYWNlSW5kZXg7Ci0gICAgRlhfRFdPUkQJCW1fZHdDaGFyc2V0czsKLSAgICBpbnQzMl90CQltX2lHbHlwaE51bTsKKyAgICBpbnQzMl90IGlTaXplID0gRlhTWVNfc3RybGVuKHBGYW1pbHkpOworICAgIG1fcEZhbWlseSA9IEZYX0FsbG9jKEZYX0NIQVIsIGlTaXplICsgMSk7CisgICAgRlhTWVNfbWVtY3B5KG1fcEZhbWlseSwgcEZhbWlseSwgaVNpemUgKiBzaXplb2YoRlhfQ0hBUikpOworICAgIG1fcEZhbWlseVtpU2l6ZV0gPSAwOworICB9CisgIEZYX0NIQVIqIG1fcEZhbWlseTsKKyAgRlhfRFdPUkQgbV9kd1N0eWxlOworICBpbnQzMl90IG1faUZhY2VJbmRleDsKKyAgRlhfRFdPUkQgbV9kd0NoYXJzZXRzOworICBpbnQzMl90IG1faUdseXBoTnVtOwogfTsKLWNsYXNzIENGUEZfU2tpYVBhdGhGb250IDogcHVibGljIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yCi17Ci1wdWJsaWM6Ci0gICAgQ0ZQRl9Ta2lhUGF0aEZvbnQoKSA6IG1fcFBhdGgoTlVMTCkge30KLSAgICB2aXJ0dWFsIH5DRlBGX1NraWFQYXRoRm9udCgpCi0gICAgewotICAgICAgICBpZiAobV9wUGF0aCkgewotICAgICAgICAgICAgRlhfRnJlZShtX3BQYXRoKTsKLSAgICAgICAgfQorY2xhc3MgQ0ZQRl9Ta2lhUGF0aEZvbnQgOiBwdWJsaWMgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgeworIHB1YmxpYzoKKyAgQ0ZQRl9Ta2lhUGF0aEZvbnQoKSA6IG1fcFBhdGgoTlVMTCkge30KKyAgdmlydHVhbCB+Q0ZQRl9Ta2lhUGF0aEZvbnQoKSB7CisgICAgaWYgKG1fcFBhdGgpIHsKKyAgICAgIEZYX0ZyZWUobV9wUGF0aCk7CiAgICAgfQotICAgIHZpcnR1YWwJaW50MzJfdAlHZXRUeXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGUEZfU0tJQUZPTlRUWVBFX1BhdGg7CisgIH0KKyAgdmlydHVhbCBpbnQzMl90IEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGUEZfU0tJQUZPTlRUWVBFX1BhdGg7IH0KKyAgdm9pZCBTZXRQYXRoKGNvbnN0IEZYX0NIQVIqIHBQYXRoKSB7CisgICAgaWYgKG1fcFBhdGgpIHsKKyAgICAgIEZYX0ZyZWUobV9wUGF0aCk7CiAgICAgfQotICAgIHZvaWQJCQkJU2V0UGF0aChjb25zdCBGWF9DSEFSKiBwUGF0aCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BQYXRoKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcFBhdGgpOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgaVNpemUgPSBGWFNZU19zdHJsZW4ocFBhdGgpOwotICAgICAgICBtX3BQYXRoID0gRlhfQWxsb2MoRlhfQ0hBUiwgaVNpemUgKyAxKTsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFBhdGgsIHBQYXRoLCBpU2l6ZSAqIHNpemVvZihGWF9DSEFSKSk7Ci0gICAgICAgIG1fcFBhdGhbaVNpemVdID0gMDsKLSAgICB9Ci0gICAgRlhfQ0hBUioJCW1fcFBhdGg7CisgICAgaW50MzJfdCBpU2l6ZSA9IEZYU1lTX3N0cmxlbihwUGF0aCk7CisgICAgbV9wUGF0aCA9IEZYX0FsbG9jKEZYX0NIQVIsIGlTaXplICsgMSk7CisgICAgRlhTWVNfbWVtY3B5KG1fcFBhdGgsIHBQYXRoLCBpU2l6ZSAqIHNpemVvZihGWF9DSEFSKSk7CisgICAgbV9wUGF0aFtpU2l6ZV0gPSAwOworICB9CisgIEZYX0NIQVIqIG1fcFBhdGg7CiB9OwotY2xhc3MgQ0ZQRl9Ta2lhRmlsZUZvbnQgOiBwdWJsaWMgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IKLXsKLXB1YmxpYzoKLSAgICBDRlBGX1NraWFGaWxlRm9udCgpIDogbV9wRmlsZShOVUxMKSB7fQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRUeXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGUEZfU0tJQUZPTlRUWVBFX0ZpbGU7Ci0gICAgfQotICAgIElGWF9GaWxlUmVhZAkJKm1fcEZpbGU7CitjbGFzcyBDRlBGX1NraWFGaWxlRm9udCA6IHB1YmxpYyBDRlBGX1NraWFGb250RGVzY3JpcHRvciB7CisgcHVibGljOgorICBDRlBGX1NraWFGaWxlRm9udCgpIDogbV9wRmlsZShOVUxMKSB7fQorICB2aXJ0dWFsIGludDMyX3QgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZQRl9TS0lBRk9OVFRZUEVfRmlsZTsgfQorICBJRlhfRmlsZVJlYWQqIG1fcEZpbGU7CiB9OwotY2xhc3MgQ0ZQRl9Ta2lhQnVmZmVyRm9udCA6IHB1YmxpYyBDRlBGX1NraWFGb250RGVzY3JpcHRvcgotewotcHVibGljOgotICAgIENGUEZfU2tpYUJ1ZmZlckZvbnQoKSA6IG1fcEJ1ZmZlcihOVUxMKSwgbV9zekJ1ZmZlcigwKSB7fQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRUeXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGUEZfU0tJQUZPTlRUWVBFX0J1ZmZlcjsKLSAgICB9Ci0gICAgdm9pZCoJCQltX3BCdWZmZXI7Ci0gICAgc2l6ZV90CQkJCW1fc3pCdWZmZXI7CitjbGFzcyBDRlBGX1NraWFCdWZmZXJGb250IDogcHVibGljIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yIHsKKyBwdWJsaWM6CisgIENGUEZfU2tpYUJ1ZmZlckZvbnQoKSA6IG1fcEJ1ZmZlcihOVUxMKSwgbV9zekJ1ZmZlcigwKSB7fQorICB2aXJ0dWFsIGludDMyX3QgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZQRl9TS0lBRk9OVFRZUEVfQnVmZmVyOyB9CisgIHZvaWQqIG1fcEJ1ZmZlcjsKKyAgc2l6ZV90IG1fc3pCdWZmZXI7CiB9OwotY2xhc3MgQ0ZQRl9Ta2lhRm9udE1nciA6IHB1YmxpYyBJRlBGX0ZvbnRNZ3IKLXsKLXB1YmxpYzoKLSAgICBDRlBGX1NraWFGb250TWdyKCk7Ci0gICAgdmlydHVhbCB+Q0ZQRl9Ta2lhRm9udE1ncigpOwotICAgIEZYX0JPT0wJCQkJCUluaXRGVExpYnJhcnkoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCQlMb2FkU3lzdGVtRm9udHMoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCQlMb2FkUHJpdmF0ZUZvbnQoSUZYX0ZpbGVSZWFkKiBwRm9udEZpbGUpOwotICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRQcml2YXRlRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmlsZU5hbWUpOwotICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRQcml2YXRlRm9udCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOworY2xhc3MgQ0ZQRl9Ta2lhRm9udE1nciA6IHB1YmxpYyBJRlBGX0ZvbnRNZ3IgeworIHB1YmxpYzoKKyAgQ0ZQRl9Ta2lhRm9udE1ncigpOworICB2aXJ0dWFsIH5DRlBGX1NraWFGb250TWdyKCk7CisgIEZYX0JPT0wgSW5pdEZUTGlicmFyeSgpOworICB2aXJ0dWFsIHZvaWQgTG9hZFN5c3RlbUZvbnRzKCk7CisgIHZpcnR1YWwgdm9pZCBMb2FkUHJpdmF0ZUZvbnQoSUZYX0ZpbGVSZWFkKiBwRm9udEZpbGUpOworICB2aXJ0dWFsIHZvaWQgTG9hZFByaXZhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGaWxlTmFtZSk7CisgIHZpcnR1YWwgdm9pZCBMb2FkUHJpdmF0ZUZvbnQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKIAotICAgIHZpcnR1YWwgSUZQRl9Gb250KgkJQ3JlYXRlRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFtaWx5bmFtZSwgdWludDhfdCB1Q2hhcnNldCwgRlhfRFdPUkQgZHdTdHlsZSwgRlhfRFdPUkQgZHdNYXRjaCA9IDApOwotICAgIEZYRlRfRmFjZQkJCQlHZXRGb250RmFjZShJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCwgaW50MzJfdCBpRmFjZUluZGV4ID0gMCk7Ci0gICAgRlhGVF9GYWNlCQkJCUdldEZvbnRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGaWxlLCBpbnQzMl90IGlGYWNlSW5kZXggPSAwKTsKLSAgICBGWEZUX0ZhY2UJCQkJR2V0Rm9udEZhY2UoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBpbnQzMl90IGlGYWNlSW5kZXggPSAwKTsKLXByb3RlY3RlZDoKLSAgICB2b2lkCQkJCVNjYW5QYXRoKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcGF0aCk7Ci0gICAgdm9pZAkJCQlTY2FuRmlsZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGUpOwotICAgIHZvaWQJCQkJUmVwb3J0RmFjZShGWEZUX0ZhY2UgZmFjZSwgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgKnBGb250RGVzYyk7Ci0gICAgdm9pZAkJCQlPdXRwdXRTeXN0ZW1Gb250cygpOwotICAgIEZYX0JPT0wJCQkJbV9iTG9hZGVkOwotICAgIENGWF9QdHJBcnJheQkJbV9Gb250RmFjZXM7Ci0gICAgRlhGVF9MaWJyYXJ5CQltX0ZUTGlicmFyeTsKLSAgICBDRlhfTWFwUHRyVG9QdHIJCW1fRmFtaWx5Rm9udHM7CisgIHZpcnR1YWwgSUZQRl9Gb250KiBDcmVhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYW1pbHluYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHVDaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd01hdGNoID0gMCk7CisgIEZYRlRfRmFjZSBHZXRGb250RmFjZShJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCwgaW50MzJfdCBpRmFjZUluZGV4ID0gMCk7CisgIEZYRlRfRmFjZSBHZXRGb250RmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmlsZSwgaW50MzJfdCBpRmFjZUluZGV4ID0gMCk7CisgIEZYRlRfRmFjZSBHZXRGb250RmFjZShjb25zdCB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4ID0gMCk7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2NhblBhdGgoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBwYXRoKTsKKyAgdm9pZCBTY2FuRmlsZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGUpOworICB2b2lkIFJlcG9ydEZhY2UoRlhGVF9GYWNlIGZhY2UsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKiBwRm9udERlc2MpOworICB2b2lkIE91dHB1dFN5c3RlbUZvbnRzKCk7CisgIEZYX0JPT0wgbV9iTG9hZGVkOworICBDRlhfUHRyQXJyYXkgbV9Gb250RmFjZXM7CisgIEZYRlRfTGlicmFyeSBtX0ZUTGlicmFyeTsKKyAgQ0ZYX01hcFB0clRvUHRyIG1fRmFtaWx5Rm9udHM7CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYW1vZHVsZS5jcHAgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFtb2R1bGUuY3BwCmluZGV4IGJlODRmY2YuLjk4MDM2YTEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYW1vZHVsZS5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhbW9kdWxlLmNwcApAQCAtOCwzNSArOCwzMSBAQAogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCiAjaW5jbHVkZSAiZnBmX3NraWFtb2R1bGUuaCIKICNpbmNsdWRlICJmcGZfc2tpYWZvbnRtZ3IuaCIKLXN0YXRpYyBJRlBGX0RldmljZU1vZHVsZSAqZ3NfcFBGTW9kdWxlID0gTlVMTDsKLUlGUEZfRGV2aWNlTW9kdWxlKiBGUEZfR2V0RGV2aWNlTW9kdWxlKCkKLXsKLSAgICBpZiAoIWdzX3BQRk1vZHVsZSkgewotICAgICAgICBnc19wUEZNb2R1bGUgPSBGWF9ORVcgQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlOwotICAgIH0KLSAgICByZXR1cm4gZ3NfcFBGTW9kdWxlOworc3RhdGljIElGUEZfRGV2aWNlTW9kdWxlKiBnc19wUEZNb2R1bGUgPSBOVUxMOworSUZQRl9EZXZpY2VNb2R1bGUqIEZQRl9HZXREZXZpY2VNb2R1bGUoKSB7CisgIGlmICghZ3NfcFBGTW9kdWxlKSB7CisgICAgZ3NfcFBGTW9kdWxlID0gRlhfTkVXIENGUEZfU2tpYURldmljZU1vZHVsZTsKKyAgfQorICByZXR1cm4gZ3NfcFBGTW9kdWxlOwogfQotQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlOjp+Q0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKCkKLXsKLSAgICBkZWxldGUgbV9wRm9udE1ncjsKK0NGUEZfU2tpYURldmljZU1vZHVsZTo6fkNGUEZfU2tpYURldmljZU1vZHVsZSgpIHsKKyAgZGVsZXRlIG1fcEZvbnRNZ3I7CiB9Ci12b2lkIENGUEZfU2tpYURldmljZU1vZHVsZTo6RGVzdHJveSgpCi17Ci0gICAgZGVsZXRlIChDRlBGX1NraWFEZXZpY2VNb2R1bGUqKWdzX3BQRk1vZHVsZTsKLSAgICBnc19wUEZNb2R1bGUgPSBOVUxMOwordm9pZCBDRlBGX1NraWFEZXZpY2VNb2R1bGU6OkRlc3Ryb3koKSB7CisgIGRlbGV0ZSAoQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKilnc19wUEZNb2R1bGU7CisgIGdzX3BQRk1vZHVsZSA9IE5VTEw7CiB9Ci1JRlBGX0ZvbnRNZ3IqIENGUEZfU2tpYURldmljZU1vZHVsZTo6R2V0Rm9udE1ncigpCi17CitJRlBGX0ZvbnRNZ3IqIENGUEZfU2tpYURldmljZU1vZHVsZTo6R2V0Rm9udE1ncigpIHsKKyAgaWYgKCFtX3BGb250TWdyKSB7CisgICAgbV9wRm9udE1nciA9IEZYX05FVyBDRlBGX1NraWFGb250TWdyOwogICAgIGlmICghbV9wRm9udE1ncikgewotICAgICAgICBtX3BGb250TWdyID0gRlhfTkVXIENGUEZfU2tpYUZvbnRNZ3I7Ci0gICAgICAgIGlmICghbV9wRm9udE1ncikgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX3BGb250TWdyLT5Jbml0RlRMaWJyYXJ5KCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BGb250TWdyOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gKElGUEZfRm9udE1nciopbV9wRm9udE1ncjsKKyAgICBpZiAoIW1fcEZvbnRNZ3ItPkluaXRGVExpYnJhcnkoKSkgeworICAgICAgZGVsZXRlIG1fcEZvbnRNZ3I7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChJRlBGX0ZvbnRNZ3IqKW1fcEZvbnRNZ3I7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYW1vZHVsZS5oIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhbW9kdWxlLmgKaW5kZXggNGYwYjE2Yy4uNGYxYzExOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhbW9kdWxlLmgKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhbW9kdWxlLmgKQEAgLTksMTUgKzksMTUgQEAKIAogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCiBjbGFzcyBDRlBGX1NraWFGb250TWdyOwotY2xhc3MgQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlIDogcHVibGljIElGUEZfRGV2aWNlTW9kdWxlCi17Ci1wdWJsaWM6Ci0gICAgQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKCkgOiBtX3BGb250TWdyKE5VTEwpIHt9Ci0gICAgdmlydHVhbCB+Q0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKCk7Ci0gICAgdmlydHVhbCB2b2lkCQkJCURlc3Ryb3koKTsKLSAgICB2aXJ0dWFsIElGUEZfRm9udE1ncioJCUdldEZvbnRNZ3IoKTsKLXByb3RlY3RlZDoKLSAgICBDRlBGX1NraWFGb250TWdyCSptX3BGb250TWdyOworY2xhc3MgQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlIDogcHVibGljIElGUEZfRGV2aWNlTW9kdWxlIHsKKyBwdWJsaWM6CisgIENGUEZfU2tpYURldmljZU1vZHVsZSgpIDogbV9wRm9udE1ncihOVUxMKSB7fQorICB2aXJ0dWFsIH5DRlBGX1NraWFEZXZpY2VNb2R1bGUoKTsKKyAgdmlydHVhbCB2b2lkIERlc3Ryb3koKTsKKyAgdmlydHVhbCBJRlBGX0ZvbnRNZ3IqIEdldEZvbnRNZ3IoKTsKKworIHByb3RlY3RlZDoKKyAgQ0ZQRl9Ta2lhRm9udE1nciogbV9wRm9udE1ncjsKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5jcHAgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmNwcAppbmRleCBmZDcyZTQ3Li5mNGRmYzI5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmNwcApAQCAtNiw4MiArNiw3OSBAQAogCiAjaW5jbHVkZSAiZnhfZnBmLmgiCiAjaWYgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8KLUNGWF9BbmRyb2lkRm9udEluZm86OkNGWF9BbmRyb2lkRm9udEluZm8oKQotICAgIDogbV9wRm9udE1ncihOVUxMKQotewotfQotRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpJbml0KElGUEZfRm9udE1nciAqcEZvbnRNZ3IpCi17Ci0gICAgaWYgKCFwRm9udE1ncikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBGb250TWdyLT5Mb2FkU3lzdGVtRm9udHMoKTsKLSAgICBtX3BGb250TWdyID0gcEZvbnRNZ3I7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9BbmRyb2lkRm9udEluZm86OkVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikKLXsKK0NGWF9BbmRyb2lkRm9udEluZm86OkNGWF9BbmRyb2lkRm9udEluZm8oKSA6IG1fcEZvbnRNZ3IoTlVMTCkge30KK0ZYX0JPT0wgQ0ZYX0FuZHJvaWRGb250SW5mbzo6SW5pdChJRlBGX0ZvbnRNZ3IqIHBGb250TWdyKSB7CisgIGlmICghcEZvbnRNZ3IpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcEZvbnRNZ3ItPkxvYWRTeXN0ZW1Gb250cygpOworICBtX3BGb250TWdyID0gcEZvbnRNZ3I7CisgIHJldHVybiBUUlVFOwogfQotdm9pZCogQ0ZYX0FuZHJvaWRGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYWNlLCBpbnQmIGlFeGFjdCkKLXsKLSAgICBpZiAoIW1fcEZvbnRNZ3IpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOwotICAgIGlmICh3ZWlnaHQgPj0gNzAwKSB7Ci0gICAgICAgIGR3U3R5bGUgfD0gRlhGT05UX0JPTEQ7Ci0gICAgfQotICAgIGlmIChiSXRhbGljKSB7Ci0gICAgICAgIGR3U3R5bGUgfD0gRlhGT05UX0lUQUxJQzsKLSAgICB9Ci0gICAgaWYgKHBpdGNoX2ZhbWlseSAmIEZYRk9OVF9GRl9GSVhFRFBJVENIKSB7Ci0gICAgICAgIGR3U3R5bGUgfD0gRlhGT05UX0ZJWEVEX1BJVENIOwotICAgIH0KLSAgICBpZiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX1NDUklQVCkgewotICAgICAgICBkd1N0eWxlIHw9IEZYRk9OVF9TQ1JJUFQ7Ci0gICAgfQotICAgIGlmIChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pIHsKLSAgICAgICAgZHdTdHlsZSB8PSBGWEZPTlRfU0VSSUY7Ci0gICAgfQotICAgIHJldHVybiBtX3BGb250TWdyLT5DcmVhdGVGb250KGZhY2UsIGNoYXJzZXQsIGR3U3R5bGUsIEZQRl9NQVRDSEZPTlRfUkVQTEFDRUFOU0kpOworRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQotdm9pZCogQ0ZYX0FuZHJvaWRGb250SW5mbzo6R2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYWNlKQotewordm9pZCogQ0ZYX0FuZHJvaWRGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGlFeGFjdCkgeworICBpZiAoIW1fcEZvbnRNZ3IpIHsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWF9EV09SRCBkd1N0eWxlID0gMDsKKyAgaWYgKHdlaWdodCA+PSA3MDApIHsKKyAgICBkd1N0eWxlIHw9IEZYRk9OVF9CT0xEOworICB9CisgIGlmIChiSXRhbGljKSB7CisgICAgZHdTdHlsZSB8PSBGWEZPTlRfSVRBTElDOworICB9CisgIGlmIChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfRklYRURQSVRDSCkgeworICAgIGR3U3R5bGUgfD0gRlhGT05UX0ZJWEVEX1BJVENIOworICB9CisgIGlmIChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfU0NSSVBUKSB7CisgICAgZHdTdHlsZSB8PSBGWEZPTlRfU0NSSVBUOworICB9CisgIGlmIChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pIHsKKyAgICBkd1N0eWxlIHw9IEZYRk9OVF9TRVJJRjsKKyAgfQorICByZXR1cm4gbV9wRm9udE1nci0+Q3JlYXRlRm9udChmYWNlLCBjaGFyc2V0LCBkd1N0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUEZfTUFUQ0hGT05UX1JFUExBQ0VBTlNJKTsKIH0KLUZYX0RXT1JEIENGWF9BbmRyb2lkRm9udEluZm86OkdldEZvbnREYXRhKHZvaWQqIGhGb250LCBGWF9EV09SRCB0YWJsZSwgdWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBzaXplKQotewotICAgIGlmICghaEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAoKElGUEZfRm9udCopaEZvbnQpLT5HZXRGb250RGF0YSh0YWJsZSwgYnVmZmVyLCBzaXplKTsKK3ZvaWQqIENGWF9BbmRyb2lkRm9udEluZm86OkdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSkgeworICByZXR1cm4gTlVMTDsKIH0KLUZYX0JPT0wgQ0ZYX0FuZHJvaWRGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKQotewotICAgIGlmICghaEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBuYW1lID0gKChJRlBGX0ZvbnQqKWhGb250KS0+R2V0RmFtaWx5TmFtZSgpOwotICAgIHJldHVybiBUUlVFOworRlhfRFdPUkQgQ0ZYX0FuZHJvaWRGb250SW5mbzo6R2V0Rm9udERhdGEodm9pZCogaEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUpIHsKKyAgaWYgKCFoRm9udCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAoKElGUEZfRm9udCopaEZvbnQpLT5HZXRGb250RGF0YSh0YWJsZSwgYnVmZmVyLCBzaXplKTsKIH0KLUZYX0JPT0wgQ0ZYX0FuZHJvaWRGb250SW5mbzo6R2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkKLXsKLSAgICBpZiAoIWhGb250KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgY2hhcnNldCA9ICgoSUZQRl9Gb250KiloRm9udCktPkdldENoYXJzZXQoKTsKK0ZYX0JPT0wgQ0ZYX0FuZHJvaWRGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7CisgIGlmICghaEZvbnQpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbmFtZSA9ICgoSUZQRl9Gb250KiloRm9udCktPkdldEZhbWlseU5hbWUoKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENGWF9BbmRyb2lkRm9udEluZm86OkRlbGV0ZUZvbnQodm9pZCogaEZvbnQpCi17Ci0gICAgaWYgKCFoRm9udCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICgoSUZQRl9Gb250KiloRm9udCktPlJlbGVhc2UoKTsKK0ZYX0JPT0wgQ0ZYX0FuZHJvaWRGb250SW5mbzo6R2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkgeworICBpZiAoIWhGb250KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNoYXJzZXQgPSAoKElGUEZfRm9udCopaEZvbnQpLT5HZXRDaGFyc2V0KCk7CisgIHJldHVybiBGQUxTRTsKIH0KLXZvaWQqIENGWF9BbmRyb2lkRm9udEluZm86OlJldGFpbkZvbnQodm9pZCogaEZvbnQpCi17Ci0gICAgcmV0dXJuIE5VTEw7Cit2b2lkIENGWF9BbmRyb2lkRm9udEluZm86OkRlbGV0ZUZvbnQodm9pZCogaEZvbnQpIHsKKyAgaWYgKCFoRm9udCkgeworICAgIHJldHVybjsKKyAgfQorICAoKElGUEZfRm9udCopaEZvbnQpLT5SZWxlYXNlKCk7Cit9Cit2b2lkKiBDRlhfQW5kcm9pZEZvbnRJbmZvOjpSZXRhaW5Gb250KHZvaWQqIGhGb250KSB7CisgIHJldHVybiBOVUxMOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmggYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmgKaW5kZXggZTAxMDFiMy4uNTY3NWUxYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuaApAQCAtOSwyOSArOSwzNCBAQAogCiAjaWYgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8KIGNsYXNzIElGUEZfRm9udE1ncjsKLWNsYXNzIENGWF9BbmRyb2lkRm9udEluZm8gOiBwdWJsaWMgSUZYX1N5c3RlbUZvbnRJbmZvCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0FuZHJvaWRGb250SW5mbygpOwotICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpCi0gICAgewotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9CitjbGFzcyBDRlhfQW5kcm9pZEZvbnRJbmZvIDogcHVibGljIElGWF9TeXN0ZW1Gb250SW5mbyB7CisgcHVibGljOgorICBDRlhfQW5kcm9pZEZvbnRJbmZvKCk7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQogCi0gICAgdmlydHVhbAlGWF9CT09MCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpOworICB2aXJ0dWFsIEZYX0JPT0wgRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKTsKIAotICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFjZSwgaW50JiBiRXhhY3QpOworICB2aXJ0dWFsIHZvaWQqIE1hcEZvbnQoaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGJFeGFjdCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQqCQlHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpOworICB2aXJ0dWFsIHZvaWQqIEdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSk7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Rm9udERhdGEodm9pZCogaEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUpOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKKyAgdmlydHVhbCBGWF9CT09MIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpOwogCi0gICAgdmlydHVhbCB2b2lkCQlEZWxldGVGb250KHZvaWQqIGhGb250KTsKLSAgICB2aXJ0dWFsIHZvaWQqICAgICAgIFJldGFpbkZvbnQodm9pZCogaEZvbnQpOwotICAgIEZYX0JPT0wJCQkJSW5pdChJRlBGX0ZvbnRNZ3IgKnBGb250TWdyKTsKLXByb3RlY3RlZDoKLSAgICBJRlBGX0ZvbnRNZ3IJCSptX3BGb250TWdyOworICB2aXJ0dWFsIHZvaWQgRGVsZXRlRm9udCh2b2lkKiBoRm9udCk7CisgIHZpcnR1YWwgdm9pZCogUmV0YWluRm9udCh2b2lkKiBoRm9udCk7CisgIEZYX0JPT0wgSW5pdChJRlBGX0ZvbnRNZ3IqIHBGb250TWdyKTsKKworIHByb3RlY3RlZDoKKyAgSUZQRl9Gb250TWdyKiBtX3BGb250TWdyOwogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9pbXAuY3BwIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfaW1wLmNwcAppbmRleCBjMmI1NDYwLi4xOTI3MzU4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9pbXAuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ltcC5jcHAKQEAgLTYsMjcgKzYsMjUgQEAKIAogI2luY2x1ZGUgImZ4X2ZwZi5oIgogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCi12b2lkIENGWF9HRU1vZHVsZTo6SW5pdFBsYXRmb3JtKCkKLXsKLSAgICBJRlBGX0RldmljZU1vZHVsZSAqcERldmljZU1vZHVsZSA9IEZQRl9HZXREZXZpY2VNb2R1bGUoKTsKLSAgICBpZiAoIXBEZXZpY2VNb2R1bGUpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDRlhfR0VNb2R1bGU6OkluaXRQbGF0Zm9ybSgpIHsKKyAgSUZQRl9EZXZpY2VNb2R1bGUqIHBEZXZpY2VNb2R1bGUgPSBGUEZfR2V0RGV2aWNlTW9kdWxlKCk7CisgIGlmICghcERldmljZU1vZHVsZSkgeworICAgIHJldHVybjsKKyAgfQorICBJRlBGX0ZvbnRNZ3IqIHBGb250TWdyID0gcERldmljZU1vZHVsZS0+R2V0Rm9udE1ncigpOworICBpZiAocEZvbnRNZ3IpIHsKKyAgICBDRlhfQW5kcm9pZEZvbnRJbmZvKiBwRm9udEluZm8gPSBGWF9ORVcgQ0ZYX0FuZHJvaWRGb250SW5mbzsKKyAgICBpZiAoIXBGb250SW5mbykgeworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBJRlBGX0ZvbnRNZ3IgKnBGb250TWdyID0gcERldmljZU1vZHVsZS0+R2V0Rm9udE1ncigpOwotICAgIGlmIChwRm9udE1ncikgewotICAgICAgICBDRlhfQW5kcm9pZEZvbnRJbmZvICpwRm9udEluZm8gPSBGWF9ORVcgQ0ZYX0FuZHJvaWRGb250SW5mbzsKLSAgICAgICAgaWYgKCFwRm9udEluZm8pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwRm9udEluZm8tPkluaXQocEZvbnRNZ3IpOwotICAgICAgICBtX3BGb250TWdyLT5TZXRTeXN0ZW1Gb250SW5mbyhwRm9udEluZm8pOwotICAgIH0KLSAgICBtX3BQbGF0Zm9ybURhdGEgPSBwRGV2aWNlTW9kdWxlOworICAgIHBGb250SW5mby0+SW5pdChwRm9udE1ncik7CisgICAgbV9wRm9udE1nci0+U2V0U3lzdGVtRm9udEluZm8ocEZvbnRJbmZvKTsKKyAgfQorICBtX3BQbGF0Zm9ybURhdGEgPSBwRGV2aWNlTW9kdWxlOwogfQotdm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3lQbGF0Zm9ybSgpCi17Ci0gICAgaWYgKG1fcFBsYXRmb3JtRGF0YSkgewotICAgICAgICAoKElGUEZfRGV2aWNlTW9kdWxlKiltX3BQbGF0Zm9ybURhdGEpLT5EZXN0cm95KCk7Ci0gICAgfQordm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3lQbGF0Zm9ybSgpIHsKKyAgaWYgKG1fcFBsYXRmb3JtRGF0YSkgeworICAgICgoSUZQRl9EZXZpY2VNb2R1bGUqKW1fcFBsYXRmb3JtRGF0YSktPkRlc3Ryb3koKTsKKyAgfQogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FwcGxlL2FwcGxlX2ludC5oIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9hcHBsZV9pbnQuaAppbmRleCAwOTBhYzA5Li5iYTNkMGE4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FwcGxlL2FwcGxlX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvYXBwbGVfaW50LmgKQEAgLTcsMjM0ICs3LDI1NyBAQAogI2lmbmRlZiBDT1JFX1NSQ19GWEdFX0FQUExFX0FQUExFX0lOVF9IXwogI2RlZmluZSBDT1JFX1NSQ19GWEdFX0FQUExFX0FQUExFX0lOVF9IXwogCi0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KICNpZiBfRlhfT1NfID09IF9GWF9NQUNPU1hfCiAjaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5oPgogI2VuZGlmCiB0eXBlZGVmIGVudW0gZUZYSU9TRk9OVENIQVJTRVQgewotICAgIGVGWEZvbnRDaGFyc2V0REVGQVVMVCAgICAgICA9ICAgMCwKLSAgICBlRlhGb250Q2hhcnNldEFOU0kgICAgICAgICAgPSAgIDEsCi0gICAgZUZYRm9udENoYXJzZXRTWU1CT0wgICAgICAgID0gICAxIDw8IDEsCi0gICAgZUZYRm9udENoYXJzZXRTSElGVEpJUyAgICAgID0gICAxIDw8IDIsCi0gICAgZUZYRm9udENoYXJzZXRIQU5HRVVMICAgICAgID0gICAxIDw8IDMsCi0gICAgZUZYRm9udENoYXJzZXRHQjIzMTIgICAgICAgID0gICAxIDw8IDQsCi0gICAgZUZYRm9udENoYXJzZXRDSElORVNFQklHNSAgID0gICAxIDw8IDUsCi0gICAgZUZYRm9udENoYXJzZXRUSEFJICAgICAgICAgID0gICAxIDw8IDYsCi0gICAgZUZYRm9udENoYXJzZXRFQVNURVVST1BFICAgID0gICAxIDw8IDcsCi0gICAgZUZYRm9udENoYXJzZXRSVVNTSUFOICAgICAgID0gICAxIDw8IDgsCi0gICAgZUZYRm9udENoYXJzZXRHUkVFSyAgICAgICAgID0gICAxIDw8IDksCi0gICAgZUZYRm9udENoYXJzZXRUVVJLSVNIICAgICAgID0gICAxIDw8IDEwLAotICAgIGVGWEZvbnRDaGFyc2V0SEVCUkVXICAgICAgICA9ICAgMSA8PCAxMSwKLSAgICBlRlhGb250Q2hhcnNldEFSQUJJQyAgICAgICAgPSAgIDEgPDwgMTIsCi0gICAgZUZYRm9udENoYXJzZXRCQUxUSUMgICAgICAgID0gICAxIDw8IDEzLAorICBlRlhGb250Q2hhcnNldERFRkFVTFQgPSAwLAorICBlRlhGb250Q2hhcnNldEFOU0kgPSAxLAorICBlRlhGb250Q2hhcnNldFNZTUJPTCA9IDEgPDwgMSwKKyAgZUZYRm9udENoYXJzZXRTSElGVEpJUyA9IDEgPDwgMiwKKyAgZUZYRm9udENoYXJzZXRIQU5HRVVMID0gMSA8PCAzLAorICBlRlhGb250Q2hhcnNldEdCMjMxMiA9IDEgPDwgNCwKKyAgZUZYRm9udENoYXJzZXRDSElORVNFQklHNSA9IDEgPDwgNSwKKyAgZUZYRm9udENoYXJzZXRUSEFJID0gMSA8PCA2LAorICBlRlhGb250Q2hhcnNldEVBU1RFVVJPUEUgPSAxIDw8IDcsCisgIGVGWEZvbnRDaGFyc2V0UlVTU0lBTiA9IDEgPDwgOCwKKyAgZUZYRm9udENoYXJzZXRHUkVFSyA9IDEgPDwgOSwKKyAgZUZYRm9udENoYXJzZXRUVVJLSVNIID0gMSA8PCAxMCwKKyAgZUZYRm9udENoYXJzZXRIRUJSRVcgPSAxIDw8IDExLAorICBlRlhGb250Q2hhcnNldEFSQUJJQyA9IDEgPDwgMTIsCisgIGVGWEZvbnRDaGFyc2V0QkFMVElDID0gMSA8PCAxMywKIH0gRlhfSU9TQ0hBUlNFVDsKIEZYX0lPU0NIQVJTRVQgRlhfR2V0aU9TQ2hhcnNldChpbnQgY2hhcnNldCk7CiB0eXBlZGVmIGVudW0gZUZYSU9TRk9OVEZMQUcgewotICAgIGVGWEZvbnRGbGFnQm9sZCAgICAgICAgID0gIDEsCi0gICAgZUZYRm9udEZsYWdJdGFsaWMgICAgICAgPSAgMSA8PCAxLAotICAgIGVGWEZvbnRGbGFnRml4ZWRQaXRjaCAgID0gIDEgPDwgMiwKLSAgICBlRlhGb250RmxhZ1NlcmlmICAgICAgICA9ICAxIDw8IDMsCi0gICAgZUZYRm9udEZsYWdTY3JpcHQgICAgICAgPSAgMSA8PCA0LAorICBlRlhGb250RmxhZ0JvbGQgPSAxLAorICBlRlhGb250RmxhZ0l0YWxpYyA9IDEgPDwgMSwKKyAgZUZYRm9udEZsYWdGaXhlZFBpdGNoID0gMSA8PCAyLAorICBlRlhGb250RmxhZ1NlcmlmID0gMSA8PCAzLAorICBlRlhGb250RmxhZ1NjcmlwdCA9IDEgPDwgNCwKIH0gRlhfSU9TRk9OVEZMQUc7CiB0eXBlZGVmIHN0cnVjdCBfSU9TX0ZPTlREQVRBIHsKLSAgICBGWF9EV09SRCAgICAgICAgbkhhc2hDb2RlOwotICAgIGNvbnN0IGNoYXIqICAgICAgIHBzTmFtZTsKLSAgICBGWF9EV09SRCAgICAgICAgY2hhcnNldHM7Ci0gICAgRlhfRFdPUkQgICAgICAgIHN0eWxlczsKKyAgRlhfRFdPUkQgbkhhc2hDb2RlOworICBjb25zdCBjaGFyKiBwc05hbWU7CisgIEZYX0RXT1JEIGNoYXJzZXRzOworICBGWF9EV09SRCBzdHlsZXM7CiB9IElPU19GT05UREFUQTsKLWNsYXNzIENRdWFydHoyRAotewotcHVibGljOgotICAgIHZvaWQqCWNyZWF0ZUdyYXBoaWNzKENGWF9ESUJpdG1hcCogYml0bWFwKTsKLSAgICB2b2lkCWRlc3Ryb3lHcmFwaGljcyh2b2lkKiBncmFwaGljcyk7CitjbGFzcyBDUXVhcnR6MkQgeworIHB1YmxpYzoKKyAgdm9pZCogY3JlYXRlR3JhcGhpY3MoQ0ZYX0RJQml0bWFwKiBiaXRtYXApOworICB2b2lkIGRlc3Ryb3lHcmFwaGljcyh2b2lkKiBncmFwaGljcyk7CiAKLSAgICB2b2lkKglDcmVhdGVGb250KGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSwgRlhfRFdPUkQgZHdGb250U2l6ZSk7Ci0gICAgdm9pZAlEZXN0cm95Rm9udCh2b2lkKiBwRm9udCk7Ci0gICAgdm9pZAlzZXRHcmFwaGljc1RleHRNYXRyaXgodm9pZCogZ3JhcGhpY3MsIENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCk7Ci0gICAgRlhfQk9PTAlkcmF3R3JhcGhpY3NTdHJpbmcodm9pZCogICAgICAgICAgICAgICAgZ3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICBmb250U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEKiAgICAgICAgICAgICBnbHlwaEluZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludCogICAgICAgICAgZ2x5cGhQb3NpdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBjaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCICAgICAgICAgICAgICBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqICAgIG1hdHJpeCA9IE5VTEwpOwotICAgIHZvaWQgc2F2ZUdyYXBoaWNzU3RhdGUodm9pZCogZ3JhcGhpY3MpOwotICAgIHZvaWQgcmVzdG9yZUdyYXBoaWNzU3RhdGUodm9pZCogZ3JhcGhpY3MpOworICB2b2lkKiBDcmVhdGVGb250KGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSwgRlhfRFdPUkQgZHdGb250U2l6ZSk7CisgIHZvaWQgRGVzdHJveUZvbnQodm9pZCogcEZvbnQpOworICB2b2lkIHNldEdyYXBoaWNzVGV4dE1hdHJpeCh2b2lkKiBncmFwaGljcywgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4KTsKKyAgRlhfQk9PTCBkcmF3R3JhcGhpY3NTdHJpbmcodm9pZCogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEKiBnbHlwaEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHUG9pbnQqIGdseXBoUG9zaXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCA9IE5VTEwpOworICB2b2lkIHNhdmVHcmFwaGljc1N0YXRlKHZvaWQqIGdyYXBoaWNzKTsKKyAgdm9pZCByZXN0b3JlR3JhcGhpY3NTdGF0ZSh2b2lkKiBncmFwaGljcyk7CiB9OwotY2xhc3MgQ0FwcGxlUGxhdGZvcm0KLXsKLXB1YmxpYzoKLSAgICBDQXBwbGVQbGF0Zm9ybSgpIHt9Ci0gICAgfkNBcHBsZVBsYXRmb3JtKCkge30KK2NsYXNzIENBcHBsZVBsYXRmb3JtIHsKKyBwdWJsaWM6CisgIENBcHBsZVBsYXRmb3JtKCkge30KKyAgfkNBcHBsZVBsYXRmb3JtKCkge30KIAotICAgIENRdWFydHoyRAlfcXVhcnR6MmQ7CisgIENRdWFydHoyRCBfcXVhcnR6MmQ7CiB9OwotY2xhc3MgQ0ZYX1F1YXJ0ekRldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcihDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBkZXZpY2VDbGFzcyk7Ci0gICAgdmlydHVhbCB+Q0ZYX1F1YXJ0ekRldmljZURyaXZlcigpOworY2xhc3MgQ0ZYX1F1YXJ0ekRldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyIHsKKyBwdWJsaWM6CisgIENGWF9RdWFydHpEZXZpY2VEcml2ZXIoQ0dDb250ZXh0UmVmIGNvbnRleHQsIGludDMyX3QgZGV2aWNlQ2xhc3MpOworICB2aXJ0dWFsIH5DRlhfUXVhcnR6RGV2aWNlRHJpdmVyKCk7CiAKLSAgICB2aXJ0dWFsIGludAkJR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCk7Ci0gICAgdmlydHVhbCBDRlhfTWF0cml4CUdldENUTSgpIGNvbnN0OwotICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiAgIEdldEJhY2tEcm9wKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQqCUdldFBsYXRmb3JtU3VyZmFjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MIElzUFNQcmludERyaXZlcigpCi0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydFJlbmRlcmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkCUVuZFJlbmRlcmluZygpIHt9Ci0gICAgdmlydHVhbCB2b2lkCVNhdmVTdGF0ZSgpOwotICAgIHZpcnR1YWwgdm9pZAlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgdmlydHVhbCBpbnQgR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCk7CisgIHZpcnR1YWwgQ0ZYX01hdHJpeCBHZXRDVE0oKSBjb25zdDsKKyAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEJhY2tEcm9wKCkgeyByZXR1cm4gTlVMTDsgfQorICB2aXJ0dWFsIHZvaWQqIEdldFBsYXRmb3JtU3VyZmFjZSgpIHsgcmV0dXJuIE5VTEw7IH0KKyAgdmlydHVhbCBGWF9CT09MIElzUFNQcmludERyaXZlcigpIHsgcmV0dXJuIEZBTFNFOyB9CisgIHZpcnR1YWwgRlhfQk9PTCBTdGFydFJlbmRlcmluZygpIHsgcmV0dXJuIFRSVUU7IH0KKyAgdmlydHVhbCB2b2lkIEVuZFJlbmRlcmluZygpIHt9CisgIHZpcnR1YWwgdm9pZCBTYXZlU3RhdGUoKTsKKyAgdmlydHVhbCB2b2lkIFJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpOworICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpOworICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBGWF9CT09MIGJERWRnZSA9IEZBTFNFKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkCUNhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgQ2xlYXJEcml2ZXIoKTsKLXByb3RlY3RlZDoKLSAgICB2b2lkIHNldFN0cm9rZUluZm8oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhICogZ3JhcGhTdGF0ZSwgRlhfQVJHQiBhcmdiLCBGWF9GTE9BVCBsaW5lV2lkdGgpOwotICAgIHZvaWQgc2V0RmlsbEluZm8oRlhfQVJHQiBhcmdiKTsKLSAgICB2b2lkIHNldFBhdGhUb0NvbnRleHQoY29uc3QgQ0ZYX1BhdGhEYXRhICogcGF0aERhdGEpOwotICAgIEZYX0ZMT0FUIGdldExpbmVXaWR0aChjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEgKiBncmFwaFN0YXRlLCBDR0FmZmluZVRyYW5zZm9ybSBjdG0pOwotICAgIEZYX0JPT0wgQ0dfRHJhd0dseXBSdW4oaW50ICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqICAgICAgcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogICAgICAgICAgICAgICAgICBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqICAgICAgICAgICAgIHBDYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqICAgIHBHbHlwaE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqICAgIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgICAgICAgICAgICAgICAgICAgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKLSAgICB2b2lkICAgIENHX1NldEltYWdlVHJhbnNmb3JtKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgQ0dSZWN0KiByZWN0ID0gTlVMTCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgQ0dDb250ZXh0UmVmCV9jb250ZXh0OwotICAgIENHQWZmaW5lVHJhbnNmb3JtIF9mb3hpdERldmljZTJVc2VyOwotICAgIENHQWZmaW5lVHJhbnNmb3JtIF91c2VyMkZveGl0RGV2aWNlOwotICAgIGludDMyX3QgICAgICAgIG1fc2F2ZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpOworICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworICB2aXJ0dWFsIEZYX0JPT0wgU2V0UGl4ZWwoaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgdmlydHVhbCBGWF9CT09MIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpOworICB2aXJ0dWFsIEZYX0JPT0wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgdmlydHVhbCBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHZpcnR1YWwgRlhfQk9PTCBDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHZpcnR1YWwgdm9pZCBDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIHZpcnR1YWwgdm9pZCBDbGVhckRyaXZlcigpOwogCi0gICAgaW50MzJfdAkJX3dpZHRoOwotICAgIGludDMyX3QJCV9oZWlnaHQ7Ci0gICAgaW50MzJfdAkJX2JpdHNQZXJQaXhlbDsKLSAgICBpbnQzMl90CQlfZGV2aWNlQ2xhc3M7Ci0gICAgaW50MzJfdAkJX3JlbmRlckNhcHM7Ci0gICAgaW50MzJfdAlfaG9yelNpemU7Ci0gICAgaW50MzJfdAlfdmVydFNpemU7Ci19OwotY2xhc3MgQ0ZYX0ZvbnRQcm92aWRlciBmaW5hbCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRTaXplKCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpX3RvdGFsU2l6ZTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgcHJvdGVjdGVkOgorICB2b2lkIHNldFN0cm9rZUluZm8oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBncmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbGluZVdpZHRoKTsKKyAgdm9pZCBzZXRGaWxsSW5mbyhGWF9BUkdCIGFyZ2IpOworICB2b2lkIHNldFBhdGhUb0NvbnRleHQoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwYXRoRGF0YSk7CisgIEZYX0ZMT0FUIGdldExpbmVXaWR0aChjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIGdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybSBjdG0pOworICBGWF9CT09MIENHX0RyYXdHbHlwUnVuKGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEdseXBoTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOworICB2b2lkIENHX1NldEltYWdlVHJhbnNmb3JtKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3QqIHJlY3QgPSBOVUxMKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiBfb2ZmU2V0ID09IF90b3RhbFNpemU7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFBvc2l0aW9uKCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpX29mZlNldDsKLSAgICB9Ci0gICAgdmlydHVhbCBzaXplX3QJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci1wdWJsaWM6Ci0gICAgQ0ZYX0ZvbnRQcm92aWRlcihDR0ZvbnRSZWYgY2dGb250KTsKLSAgICB+Q0ZYX0ZvbnRQcm92aWRlcigpOwotICAgIHZvaWQgICAgICAgICAgICBJbml0VGFibGVPZmZzZXQoKTsKLSAgICB1bnNpZ25lZCBsb25nICAgUmVhZCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLXByb3RlY3RlZDoKLSAgICB1aW50MzJfdCBDYWxjVGFibGVDaGVja1N1bShjb25zdCB1aW50MzJfdCAqdGFibGUsIHVpbnQzMl90IG51bWJlck9mQnl0ZXNJblRhYmxlKTsKLSAgICB1aW50MzJfdCBDYWxjVGFibGVEYXRhUmVmQ2hlY2tTdW0oQ0ZEYXRhUmVmIGRhdGFSZWYpOwotcHJpdmF0ZToKLSAgICBDR0ZvbnRSZWYgICBtX2NnRm9udDsKLSAgICBVSW50MzIgICAgICBtX2lUYWJsZVNpemU7Ci0gICAgc2l6ZV90ICAgICAgX29mZlNldDsKLSAgICB0eXBlZGVmIHN0cnVjdCBGb250SGVhZGVyIHsKLSAgICAgICAgaW50MzJfdCBmVmVyc2lvbjsKLSAgICAgICAgdWludDE2X3QgZk51bVRhYmxlczsKLSAgICAgICAgdWludDE2X3QgZlNlYXJjaFJhbmdlOwotICAgICAgICB1aW50MTZfdCBmRW50cnlTZWxlY3RvcjsKLSAgICAgICAgdWludDE2X3QgZlJhbmdlU2hpZnQ7Ci0gICAgfSBGb250SGVhZGVyOwotICAgIHR5cGVkZWYgc3RydWN0IFRhYmxlRW50cnkgewotICAgICAgICB1aW50MzJfdCBmVGFnOwotICAgICAgICB1aW50MzJfdCBmQ2hlY2tTdW07Ci0gICAgICAgIHVpbnQzMl90IGZPZmZzZXQ7Ci0gICAgICAgIHVpbnQzMl90IGZMZW5ndGg7Ci0gICAgfSBUYWJsZUVudHJ5OwotICAgIEZvbnRIZWFkZXIgX2ZvbnRIZWFkZXI7Ci0gICAgdW5zaWduZWQgY2hhciAqIF90YWJsZUVudHJpZXM7Ci0gICAgc2l6ZV90ICogX3RhYmxlT2Zmc2V0czsKLSAgICBpbnQgX3RhYmxlQ291bnQ7Ci0gICAgaW50IF90b3RhbFNpemU7CisgcHJvdGVjdGVkOgorICBDR0NvbnRleHRSZWYgX2NvbnRleHQ7CisgIENHQWZmaW5lVHJhbnNmb3JtIF9mb3hpdERldmljZTJVc2VyOworICBDR0FmZmluZVRyYW5zZm9ybSBfdXNlcjJGb3hpdERldmljZTsKKyAgaW50MzJfdCBtX3NhdmVDb3VudDsKKworICBpbnQzMl90IF93aWR0aDsKKyAgaW50MzJfdCBfaGVpZ2h0OworICBpbnQzMl90IF9iaXRzUGVyUGl4ZWw7CisgIGludDMyX3QgX2RldmljZUNsYXNzOworICBpbnQzMl90IF9yZW5kZXJDYXBzOworICBpbnQzMl90IF9ob3J6U2l6ZTsKKyAgaW50MzJfdCBfdmVydFNpemU7CiB9OwotdWludDMyX3QgRlhfR2V0SGFzaENvZGUoIGNvbnN0IEZYX0NIQVIqIHBTdHIpOwotRlhfRFdPUkQgIEZYX0lPU0dldE1hdGNoRmFtaWx5TmFtZUhhc2hjb2RlKGNvbnN0IEZYX0NIQVIqIHBGb250TmFtZSk7CitjbGFzcyBDRlhfRm9udFByb3ZpZGVyIGZpbmFsIDogcHVibGljIElGWF9GaWxlUmVhZCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlIHsgZGVsZXRlIHRoaXM7IH0KKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRTaXplKCkgb3ZlcnJpZGUgeyByZXR1cm4gKEZYX0ZJTEVTSVpFKV90b3RhbFNpemU7IH0KKyAgdmlydHVhbCBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKSBvdmVycmlkZSB7IHJldHVybiBfb2ZmU2V0ID09IF90b3RhbFNpemU7IH0KKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpIG92ZXJyaWRlIHsgcmV0dXJuIChGWF9GSUxFU0laRSlfb2ZmU2V0OyB9CisgIHZpcnR1YWwgc2l6ZV90IFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworIHB1YmxpYzoKKyAgQ0ZYX0ZvbnRQcm92aWRlcihDR0ZvbnRSZWYgY2dGb250KTsKKyAgfkNGWF9Gb250UHJvdmlkZXIoKTsKKyAgdm9pZCBJbml0VGFibGVPZmZzZXQoKTsKKyAgdW5zaWduZWQgbG9uZyBSZWFkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCk7CisKKyBwcm90ZWN0ZWQ6CisgIHVpbnQzMl90IENhbGNUYWJsZUNoZWNrU3VtKGNvbnN0IHVpbnQzMl90KiB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtYmVyT2ZCeXRlc0luVGFibGUpOworICB1aW50MzJfdCBDYWxjVGFibGVEYXRhUmVmQ2hlY2tTdW0oQ0ZEYXRhUmVmIGRhdGFSZWYpOworCisgcHJpdmF0ZToKKyAgQ0dGb250UmVmIG1fY2dGb250OworICBVSW50MzIgbV9pVGFibGVTaXplOworICBzaXplX3QgX29mZlNldDsKKyAgdHlwZWRlZiBzdHJ1Y3QgRm9udEhlYWRlciB7CisgICAgaW50MzJfdCBmVmVyc2lvbjsKKyAgICB1aW50MTZfdCBmTnVtVGFibGVzOworICAgIHVpbnQxNl90IGZTZWFyY2hSYW5nZTsKKyAgICB1aW50MTZfdCBmRW50cnlTZWxlY3RvcjsKKyAgICB1aW50MTZfdCBmUmFuZ2VTaGlmdDsKKyAgfSBGb250SGVhZGVyOworICB0eXBlZGVmIHN0cnVjdCBUYWJsZUVudHJ5IHsKKyAgICB1aW50MzJfdCBmVGFnOworICAgIHVpbnQzMl90IGZDaGVja1N1bTsKKyAgICB1aW50MzJfdCBmT2Zmc2V0OworICAgIHVpbnQzMl90IGZMZW5ndGg7CisgIH0gVGFibGVFbnRyeTsKKyAgRm9udEhlYWRlciBfZm9udEhlYWRlcjsKKyAgdW5zaWduZWQgY2hhciogX3RhYmxlRW50cmllczsKKyAgc2l6ZV90KiBfdGFibGVPZmZzZXRzOworICBpbnQgX3RhYmxlQ291bnQ7CisgIGludCBfdG90YWxTaXplOworfTsKK3VpbnQzMl90IEZYX0dldEhhc2hDb2RlKGNvbnN0IEZYX0NIQVIqIHBTdHIpOworRlhfRFdPUkQgRlhfSU9TR2V0TWF0Y2hGYW1pbHlOYW1lSGFzaGNvZGUoY29uc3QgRlhfQ0hBUiogcEZvbnROYW1lKTsKIHVpbnQzMl90IEZYX0lPU0dldEZhbWlseU5hbWVzQ291bnQoKTsKLWNvbnN0IEZYX0NIQVIqIEZYX0lPU0dldEZhbWlseU5hbWUoIHVpbnQzMl90IHVJbmRleCk7Citjb25zdCBGWF9DSEFSKiBGWF9JT1NHZXRGYW1pbHlOYW1lKHVpbnQzMl90IHVJbmRleCk7CiAjZW5kaWYKIAogI2VuZGlmICAvLyBDT1JFX1NSQ19GWEdFX0FQUExFX0FQUExFX0lOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9hcHBsZV9wbGF0Zm9ybS5jcHAgYi9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X2FwcGxlX3BsYXRmb3JtLmNwcAppbmRleCA5ZGI4MDdjLi45NWNkMWExIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X2FwcGxlX3BsYXRmb3JtLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X2FwcGxlX3BsYXRmb3JtLmNwcApAQCAtNyw3ICs3LDcgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZS5oIgogCi0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KIAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oIgogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZV9hcHBsZS5oIgpAQCAtMTYsMTU5ICsxNiwxNTkgQEAKICNpbmNsdWRlICIuLi9nZS90ZXh0X2ludC5oIgogI2luY2x1ZGUgImFwcGxlX2ludC5oIgogCi12b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkluaXRQbGF0Zm9ybSgpCi17Ci0gICAgQ1F1YXJ0ejJEICYgcXVhcnR6MmQgPSAoKENBcHBsZVBsYXRmb3JtICopIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOwotICAgIG1fcFBsYXRmb3JtR3JhcGhpY3MgPSBxdWFydHoyZC5jcmVhdGVHcmFwaGljcyhtX3BCaXRtYXApOwordm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpJbml0UGxhdGZvcm0oKSB7CisgIENRdWFydHoyRCYgcXVhcnR6MmQgPQorICAgICAgKChDQXBwbGVQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5fcXVhcnR6MmQ7CisgIG1fcFBsYXRmb3JtR3JhcGhpY3MgPSBxdWFydHoyZC5jcmVhdGVHcmFwaGljcyhtX3BCaXRtYXApOwogfQotdm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEZXN0cm95UGxhdGZvcm0oKQotewotICAgIENRdWFydHoyRCAmIHF1YXJ0ejJkID0gKChDQXBwbGVQbGF0Zm9ybSAqKSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPl9xdWFydHoyZDsKLSAgICBpZiAobV9wUGxhdGZvcm1HcmFwaGljcykgewotICAgICAgICBxdWFydHoyZC5kZXN0cm95R3JhcGhpY3MobV9wUGxhdGZvcm1HcmFwaGljcyk7Ci0gICAgICAgIG1fcFBsYXRmb3JtR3JhcGhpY3MgPSBOVUxMOwotICAgIH0KK3ZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RGVzdHJveVBsYXRmb3JtKCkgeworICBDUXVhcnR6MkQmIHF1YXJ0ejJkID0KKyAgICAgICgoQ0FwcGxlUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOworICBpZiAobV9wUGxhdGZvcm1HcmFwaGljcykgeworICAgIHF1YXJ0ejJkLmRlc3Ryb3lHcmFwaGljcyhtX3BQbGF0Zm9ybUdyYXBoaWNzKTsKKyAgICBtX3BQbGF0Zm9ybUdyYXBoaWNzID0gTlVMTDsKKyAgfQogfQogdm9pZCBDRlhfRmFjZUNhY2hlOjpJbml0UGxhdGZvcm0oKSB7fQogdm9pZCBDRlhfRmFjZUNhY2hlOjpEZXN0cm95UGxhdGZvcm0oKSB7fQotQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpSZW5kZXJHbHlwaF9OYXRpdmV0ZXh0KENGWF9Gb250ICoJCQkJcEZvbnQsCi0gICAgICAgIEZYX0RXT1JECQkJCQlnbHlwaF9pbmRleCwKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCAqCXBNYXRyaXgsCi0gICAgICAgIGludAkJCQkJCWRlc3Rfd2lkdGgsCi0gICAgICAgIGludAkJCQkJCWFudGlfYWxpYXMpCi17Ci0gICAgcmV0dXJuIE5VTEw7CitDRlhfR2x5cGhCaXRtYXAqIENGWF9GYWNlQ2FjaGU6OlJlbmRlckdseXBoX05hdGl2ZXRleHQoCisgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgIEZYX0RXT1JEIGdseXBoX2luZGV4LAorICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgaW50IGFudGlfYWxpYXMpIHsKKyAgcmV0dXJuIE5VTEw7CiB9Ci1zdGF0aWMgRlhfQk9PTCBfQ0dEcmF3R2x5cGhSdW4oQ0dDb250ZXh0UmVmICAgICAgICAgICAgICAgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiAgICAgIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiAgICAgICAgICAgICAgICAgIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqICAgICAgICAgICAgIHBDYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiAgICBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICAgICAgICBmb250X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG5DaGFycyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworc3RhdGljIEZYX0JPT0wgX0NHRHJhd0dseXBoUnVuKENHQ29udGV4dFJlZiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKG5DaGFycyA9PSAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQ0ZYX0FmZmluZU1hdHJpeCBuZXdfbWF0cml4OworICBGWF9CT09MIGJOZWdTaXplID0gZm9udF9zaXplIDwgMDsKKyAgaWYgKGJOZWdTaXplKSB7CisgICAgZm9udF9zaXplID0gLWZvbnRfc2l6ZTsKKyAgfQorICBGWF9GTE9BVCBvcmlfeCA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWCwgb3JpX3kgPSBwQ2hhclBvc1swXS5tX09yaWdpblk7CisgIG5ld19tYXRyaXguVHJhbnNmb3JtKG9yaV94LCBvcmlfeSk7CisgIGlmIChwT2JqZWN0MkRldmljZSkgeworICAgIG5ld19tYXRyaXguQ29uY2F0KCpwT2JqZWN0MkRldmljZSk7CisgIH0KKyAgQ1F1YXJ0ejJEJiBxdWFydHoyZCA9CisgICAgICAoKENBcHBsZVBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPl9xdWFydHoyZDsKKyAgaWYgKCFwRm9udC0+bV9wUGxhdGZvcm1Gb250KSB7CisgICAgaWYgKHBGb250LT5HZXRQc05hbWUoKSA9PSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKCJERkhlaVN0ZC1XNSIpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbmV3X21hdHJpeDsKLSAgICBGWF9CT09MIGJOZWdTaXplID0gZm9udF9zaXplIDwgMDsKKyAgICBwRm9udC0+bV9wUGxhdGZvcm1Gb250ID0KKyAgICAgICAgcXVhcnR6MmQuQ3JlYXRlRm9udChwRm9udC0+bV9wRm9udERhdGEsIHBGb250LT5tX2R3U2l6ZSk7CisgICAgaWYgKE5VTEwgPT0gcEZvbnQtPm1fcFBsYXRmb3JtRm9udCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBDRlhfRml4ZWRCdWZHcm93PEZYX1dPUkQsIDMyPiBnbHlwaF9pbmRpY2VzKG5DaGFycyk7CisgIENGWF9GaXhlZEJ1Zkdyb3c8Q0dQb2ludCwgMzI+IGdseXBoX3Bvc2l0aW9ucyhuQ2hhcnMpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGFyczsgaSsrKSB7CisgICAgZ2x5cGhfaW5kaWNlc1tpXSA9IHBDaGFyUG9zW2ldLm1fRXh0R0lEOwogICAgIGlmIChiTmVnU2l6ZSkgewotICAgICAgICBmb250X3NpemUgPSAtZm9udF9zaXplOwotICAgIH0KLSAgICBGWF9GTE9BVCBvcmlfeCA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWCwgb3JpX3kgPSBwQ2hhclBvc1swXS5tX09yaWdpblk7Ci0gICAgbmV3X21hdHJpeC5UcmFuc2Zvcm0ob3JpX3gsIG9yaV95KTsKLSAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKLSAgICAgICAgbmV3X21hdHJpeC5Db25jYXQoKnBPYmplY3QyRGV2aWNlKTsKLSAgICB9Ci0gICAgQ1F1YXJ0ejJEJiBxdWFydHoyZCA9ICgoQ0FwcGxlUGxhdGZvcm0gKikgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5fcXVhcnR6MmQ7Ci0gICAgaWYgKCFwRm9udC0+bV9wUGxhdGZvcm1Gb250KSB7Ci0gICAgICAgIGlmIChwRm9udC0+R2V0UHNOYW1lKCkgPT0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbCgiREZIZWlTdGQtVzUiKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHBGb250LT5tX3BQbGF0Zm9ybUZvbnQgPSBxdWFydHoyZC5DcmVhdGVGb250KHBGb250LT5tX3BGb250RGF0YSwgcEZvbnQtPm1fZHdTaXplKTsKLSAgICAgICAgaWYgKE5VTEwgPT0gcEZvbnQtPm1fcFBsYXRmb3JtRm9udCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfV09SRCwgMzI+IGdseXBoX2luZGljZXMobkNoYXJzKTsKLSAgICBDRlhfRml4ZWRCdWZHcm93PENHUG9pbnQsIDMyPiBnbHlwaF9wb3NpdGlvbnMobkNoYXJzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGFyczsgaSsrICkgewotICAgICAgICBnbHlwaF9pbmRpY2VzW2ldID0gcENoYXJQb3NbaV0ubV9FeHRHSUQ7Ci0gICAgICAgIGlmIChiTmVnU2l6ZSkgewotICAgICAgICAgICAgZ2x5cGhfcG9zaXRpb25zW2ldLnggPSAtcENoYXJQb3NbaV0ubV9PcmlnaW5YOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2x5cGhfcG9zaXRpb25zW2ldLnggPSBwQ2hhclBvc1tpXS5tX09yaWdpblg7Ci0gICAgICAgIH0KLSAgICAgICAgZ2x5cGhfcG9zaXRpb25zW2ldLnkgPSBwQ2hhclBvc1tpXS5tX09yaWdpblk7Ci0gICAgfQotICAgIGlmIChiTmVnU2l6ZSkgewotICAgICAgICBuZXdfbWF0cml4LmEgPSAtbmV3X21hdHJpeC5hOworICAgICAgZ2x5cGhfcG9zaXRpb25zW2ldLnggPSAtcENoYXJQb3NbaV0ubV9PcmlnaW5YOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG5ld19tYXRyaXguYiA9IC1uZXdfbWF0cml4LmI7Ci0gICAgICAgIG5ld19tYXRyaXguZCA9IC1uZXdfbWF0cml4LmQ7CisgICAgICBnbHlwaF9wb3NpdGlvbnNbaV0ueCA9IHBDaGFyUG9zW2ldLm1fT3JpZ2luWDsKICAgICB9Ci0gICAgcXVhcnR6MmQuc2V0R3JhcGhpY3NUZXh0TWF0cml4KHBDb250ZXh0LCAmbmV3X21hdHJpeCk7Ci0gICAgcmV0dXJuIHF1YXJ0ejJkLmRyYXdHcmFwaGljc1N0cmluZyhwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5tX3BQbGF0Zm9ybUZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfcG9zaXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGdseXBoX3Bvc2l0aW9uc1tpXS55ID0gcENoYXJQb3NbaV0ubV9PcmlnaW5ZOworICB9CisgIGlmIChiTmVnU2l6ZSkgeworICAgIG5ld19tYXRyaXguYSA9IC1uZXdfbWF0cml4LmE7CisgIH0gZWxzZSB7CisgICAgbmV3X21hdHJpeC5iID0gLW5ld19tYXRyaXguYjsKKyAgICBuZXdfbWF0cml4LmQgPSAtbmV3X21hdHJpeC5kOworICB9CisgIHF1YXJ0ejJkLnNldEdyYXBoaWNzVGV4dE1hdHJpeChwQ29udGV4dCwgJm5ld19tYXRyaXgpOworICByZXR1cm4gcXVhcnR6MmQuZHJhd0dyYXBoaWNzU3RyaW5nKHBDb250ZXh0LCBwRm9udC0+bV9wUGxhdGZvcm1Gb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSwgZ2x5cGhfaW5kaWNlcywgZ2x5cGhfcG9zaXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywgYXJnYiwgTlVMTCk7CiB9Ci1zdGF0aWMgdm9pZCBfRG9Ob3RoaW5nKHZvaWQgKmluZm8sIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7fQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQJCQkJCQkgbkNoYXJzLAotICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyAqCSBwQ2hhclBvcywKLSAgICAgICAgQ0ZYX0ZvbnQgKgkJCQkgcEZvbnQsCi0gICAgICAgIENGWF9Gb250Q2FjaGUgKgkJCSBwQ2FjaGUsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXggKiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgRlhfRkxPQVQJCQkJIGZvbnRfc2l6ZSwKLSAgICAgICAgRlhfRFdPUkQJCQkJIGFyZ2IsCi0gICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmICghcEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworc3RhdGljIHZvaWQgX0RvTm90aGluZyh2b2lkKiBpbmZvLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkge30KK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoCisgICAgaW50IG5DaGFycywKKyAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgRlhfRFdPUkQgYXJnYiwKKyAgICBpbnQgYWxwaGFfZmxhZywKKyAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmICghcEZvbnQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfQk9PTCBiQm9sZCA9IHBGb250LT5Jc0JvbGQoKTsKKyAgaWYgKCFiQm9sZCAmJiBwRm9udC0+R2V0U3Vic3RGb250KCkgJiYKKyAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPj0gNTAwICYmCisgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0IDw9IDYwMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGFyczsgaSsrKSB7CisgICAgaWYgKHBDaGFyUG9zW2ldLm1fYkdseXBoQWRqdXN0KSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIEZYX0JPT0wgYkJvbGQgPSBwRm9udC0+SXNCb2xkKCk7Ci0gICAgaWYgKCFiQm9sZCAmJiBwRm9udC0+R2V0U3Vic3RGb250KCkgJiYKLSAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPj0gNTAwICYmCi0gICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0IDw9IDYwMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0dDb250ZXh0UmVmIGN0eCA9IENHQ29udGV4dFJlZihtX3BQbGF0Zm9ybUdyYXBoaWNzKTsKKyAgaWYgKE5VTEwgPT0gY3R4KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENHQ29udGV4dFNhdmVHU3RhdGUoY3R4KTsKKyAgQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlKGN0eCwga0NHVGV4dEZpbGxDbGlwKTsKKyAgQ0dSZWN0IHJlY3RfY2c7CisgIENHSW1hZ2VSZWYgcEltYWdlQ0cgPSBOVUxMOworICBpZiAobV9wQ2xpcFJnbikgeworICAgIHJlY3RfY2cgPQorICAgICAgICBDR1JlY3RNYWtlKG1fcENsaXBSZ24tPkdldEJveCgpLmxlZnQsIG1fcENsaXBSZ24tPkdldEJveCgpLnRvcCwKKyAgICAgICAgICAgICAgICAgICBtX3BDbGlwUmduLT5HZXRCb3goKS5XaWR0aCgpLCBtX3BDbGlwUmduLT5HZXRCb3goKS5IZWlnaHQoKSk7CisgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQ2xpcE1hc2sgPSBtX3BDbGlwUmduLT5HZXRNYXNrKCk7CisgICAgaWYgKHBDbGlwTWFzaykgeworICAgICAgQ0dEYXRhUHJvdmlkZXJSZWYgcENsaXBNYXNrRGF0YVByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YSgKKyAgICAgICAgICBOVUxMLCBwQ2xpcE1hc2stPkdldEJ1ZmZlcigpLAorICAgICAgICAgIHBDbGlwTWFzay0+R2V0UGl0Y2goKSAqIHBDbGlwTWFzay0+R2V0SGVpZ2h0KCksIF9Eb05vdGhpbmcpOworICAgICAgQ0dGbG9hdCBkZWNvZGVfZlsyXSA9IHsyNTUuZiwgMC5mfTsKKyAgICAgIHBJbWFnZUNHID0gQ0dJbWFnZU1hc2tDcmVhdGUoCisgICAgICAgICAgcENsaXBNYXNrLT5HZXRXaWR0aCgpLCBwQ2xpcE1hc2stPkdldEhlaWdodCgpLCA4LCA4LAorICAgICAgICAgIHBDbGlwTWFzay0+R2V0UGl0Y2goKSwgcENsaXBNYXNrRGF0YVByb3ZpZGVyLCBkZWNvZGVfZiwgRkFMU0UpOworICAgICAgQ0dEYXRhUHJvdmlkZXJSZWxlYXNlKHBDbGlwTWFza0RhdGFQcm92aWRlcik7CiAgICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNoYXJzOyBpICsrKSB7Ci0gICAgICAgIGlmIChwQ2hhclBvc1tpXS5tX2JHbHlwaEFkanVzdCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIENHQ29udGV4dFJlZiBjdHggPSBDR0NvbnRleHRSZWYobV9wUGxhdGZvcm1HcmFwaGljcyk7Ci0gICAgaWYgKE5VTEwgPT0gY3R4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjdHgpOwotICAgIENHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZShjdHgsIGtDR1RleHRGaWxsQ2xpcCk7Ci0gICAgQ0dSZWN0IHJlY3RfY2c7Ci0gICAgQ0dJbWFnZVJlZiBwSW1hZ2VDRyA9IE5VTEw7Ci0gICAgaWYgKG1fcENsaXBSZ24pIHsKLSAgICAgICAgcmVjdF9jZyA9IENHUmVjdE1ha2UobV9wQ2xpcFJnbi0+R2V0Qm94KCkubGVmdCwgbV9wQ2xpcFJnbi0+R2V0Qm94KCkudG9wLCBtX3BDbGlwUmduLT5HZXRCb3goKS5XaWR0aCgpLCBtX3BDbGlwUmduLT5HZXRCb3goKS5IZWlnaHQoKSk7Ci0gICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCoJcENsaXBNYXNrID0gbV9wQ2xpcFJnbi0+R2V0TWFzaygpOwotICAgICAgICBpZiAocENsaXBNYXNrKSB7Ci0gICAgICAgICAgICBDR0RhdGFQcm92aWRlclJlZiBwQ2xpcE1hc2tEYXRhUHJvdmlkZXIgPSBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwTWFzay0+R2V0QnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwTWFzay0+R2V0UGl0Y2goKSAqIHBDbGlwTWFzay0+R2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgIF9Eb05vdGhpbmcpOwotICAgICAgICAgICAgQ0dGbG9hdCBkZWNvZGVfZlsyXSA9IHsyNTUuZiwgMC5mfTsKLSAgICAgICAgICAgIHBJbWFnZUNHID0gQ0dJbWFnZU1hc2tDcmVhdGUocENsaXBNYXNrLT5HZXRXaWR0aCgpLCBwQ2xpcE1hc2stPkdldEhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCA4LCBwQ2xpcE1hc2stPkdldFBpdGNoKCksIHBDbGlwTWFza0RhdGFQcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2YsIEZBTFNFKTsKLSAgICAgICAgICAgIENHRGF0YVByb3ZpZGVyUmVsZWFzZShwQ2xpcE1hc2tEYXRhUHJvdmlkZXIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVjdF9jZyA9IENHUmVjdE1ha2UoMCwgMCwgbV9wQml0bWFwLT5HZXRXaWR0aCgpLCBtX3BCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgICB9Ci0gICAgcmVjdF9jZyA9IENHQ29udGV4dENvbnZlcnRSZWN0VG9EZXZpY2VTcGFjZShjdHgsIHJlY3RfY2cpOwotICAgIGlmIChwSW1hZ2VDRykgewotICAgICAgICBDR0NvbnRleHRDbGlwVG9NYXNrKGN0eCwgcmVjdF9jZywgcEltYWdlQ0cpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENHQ29udGV4dENsaXBUb1JlY3QoY3R4LCByZWN0X2NnKTsKLSAgICB9Ci0gICAgRlhfQk9PTCByZXQgPSBfQ0dEcmF3R2x5cGhSdW4oY3R4LCBuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBwT2JqZWN0MkRldmljZSwgZm9udF9zaXplLCBhcmdiLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKLSAgICBpZiAocEltYWdlQ0cpIHsKLSAgICAgICAgQ0dJbWFnZVJlbGVhc2UocEltYWdlQ0cpOwotICAgIH0KLSAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGN0eCk7Ci0gICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHsKKyAgICByZWN0X2NnID0gQ0dSZWN0TWFrZSgwLCAwLCBtX3BCaXRtYXAtPkdldFdpZHRoKCksIG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOworICB9CisgIHJlY3RfY2cgPSBDR0NvbnRleHRDb252ZXJ0UmVjdFRvRGV2aWNlU3BhY2UoY3R4LCByZWN0X2NnKTsKKyAgaWYgKHBJbWFnZUNHKSB7CisgICAgQ0dDb250ZXh0Q2xpcFRvTWFzayhjdHgsIHJlY3RfY2csIHBJbWFnZUNHKTsKKyAgfSBlbHNlIHsKKyAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGN0eCwgcmVjdF9jZyk7CisgIH0KKyAgRlhfQk9PTCByZXQgPQorICAgICAgX0NHRHJhd0dseXBoUnVuKGN0eCwgbkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgZm9udF9zaXplLCBhcmdiLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKKyAgaWYgKHBJbWFnZUNHKSB7CisgICAgQ0dJbWFnZVJlbGVhc2UocEltYWdlQ0cpOworICB9CisgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY3R4KTsKKyAgcmV0dXJuIHJldDsKIH0KLXZvaWQgQ0ZYX0ZvbnQ6OlJlbGVhc2VQbGF0Zm9ybVJlc291cmNlKCkKLXsKLSAgICBpZiAobV9wUGxhdGZvcm1Gb250KSB7Ci0gICAgICAgIENRdWFydHoyRCAmIHF1YXJ0ejJkID0gKChDQXBwbGVQbGF0Zm9ybSAqKSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPl9xdWFydHoyZDsKLSAgICAgICAgcXVhcnR6MmQuRGVzdHJveUZvbnQobV9wUGxhdGZvcm1Gb250KTsKLSAgICAgICAgbV9wUGxhdGZvcm1Gb250ID0gTlVMTDsKLSAgICB9Cit2b2lkIENGWF9Gb250OjpSZWxlYXNlUGxhdGZvcm1SZXNvdXJjZSgpIHsKKyAgaWYgKG1fcFBsYXRmb3JtRm9udCkgeworICAgIENRdWFydHoyRCYgcXVhcnR6MmQgPQorICAgICAgICAoKENBcHBsZVBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPl9xdWFydHoyZDsKKyAgICBxdWFydHoyZC5EZXN0cm95Rm9udChtX3BQbGF0Zm9ybUZvbnQpOworICAgIG1fcFBsYXRmb3JtRm9udCA9IE5VTEw7CisgIH0KIH0KIAogI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfbWFjX2ltcC5jcHAgYi9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X21hY19pbXAuY3BwCmluZGV4IGIzMmE5YTguLjlhZjg4MDQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfbWFjX2ltcC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9tYWNfaW1wLmNwcApAQCAtOCwxMCArOCw5IEBACiAjaW5jbHVkZSAiYXBwbGVfaW50LmgiCiAjaWYgX0ZYX09TXyA9PSBfRlhfTUFDT1NYXwogc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0gICAgY29uc3QgRlhfQ0hBUioJbV9wTmFtZTsKLSAgICBjb25zdCBGWF9DSEFSKgltX3BTdWJzdE5hbWU7Ci19Ci1CYXNlMTRTdWJzdHNbXSA9IHsKKyAgY29uc3QgRlhfQ0hBUiogbV9wTmFtZTsKKyAgY29uc3QgRlhfQ0hBUiogbV9wU3Vic3ROYW1lOworfSBCYXNlMTRTdWJzdHNbXSA9IHsKICAgICB7IkNvdXJpZXIiLCAiQ291cmllciBOZXcifSwKICAgICB7IkNvdXJpZXItQm9sZCIsICJDb3VyaWVyIE5ldyBCb2xkIn0sCiAgICAgeyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgIkNvdXJpZXIgTmV3IEJvbGQgSXRhbGljIn0sCkBAIC0yNSw4NSArMjQsOTEgQEAKICAgICB7IlRpbWVzLUJvbGRJdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIEJvbGQgSXRhbGljIn0sCiAgICAgeyJUaW1lcy1JdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIEl0YWxpYyJ9LAogfTsKLWNsYXNzIENGWF9NYWNGb250SW5mbyA6IHB1YmxpYyBDRlhfRm9sZGVyRm9udEluZm8KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgaW50JiBpRXhhY3QpOworY2xhc3MgQ0ZYX01hY0ZvbnRJbmZvIDogcHVibGljIENGWF9Gb2xkZXJGb250SW5mbyB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQqIE1hcEZvbnQoaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUV4YWN0KTsKIH07CiAjZGVmaW5lIEpBUEFOX0dPVEhJQyAiSGlyYWdpbm8gS2FrdSBHb3RoaWMgUHJvIFc2IgogI2RlZmluZSBKQVBBTl9NSU5DSE8gIkhpcmFnaW5vIE1pbmNobyBQcm8gVzYiCi1zdGF0aWMgdm9pZCBHZXRKYXBhbmVzZVByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsIGludCB3ZWlnaHQsIGludCBwaWN0aF9mYW1pbHkpCi17Ci0gICAgaWYgKGZhY2UuRmluZCgiR290aGljIikgPj0gMCkgewotICAgICAgICBmYWNlID0gSkFQQU5fR09USElDOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghKHBpY3RoX2ZhbWlseSAmIEZYRk9OVF9GRl9ST01BTikgJiYgd2VpZ2h0ID4gNDAwKSB7Ci0gICAgICAgIGZhY2UgPSBKQVBBTl9HT1RISUM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZmFjZSA9IEpBUEFOX01JTkNITzsKLSAgICB9CitzdGF0aWMgdm9pZCBHZXRKYXBhbmVzZVByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljdGhfZmFtaWx5KSB7CisgIGlmIChmYWNlLkZpbmQoIkdvdGhpYyIpID49IDApIHsKKyAgICBmYWNlID0gSkFQQU5fR09USElDOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIShwaWN0aF9mYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pICYmIHdlaWdodCA+IDQwMCkgeworICAgIGZhY2UgPSBKQVBBTl9HT1RISUM7CisgIH0gZWxzZSB7CisgICAgZmFjZSA9IEpBUEFOX01JTkNITzsKKyAgfQogfQotdm9pZCogQ0ZYX01hY0ZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGNzdHJfZmFjZSwgaW50JiBpRXhhY3QpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGNzdHJfZmFjZTsKLSAgICBpbnQgaUJhc2VGb250OwotICAgIGZvciAoaUJhc2VGb250ID0gMDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCArKykKLSAgICAgICAgaWYgKGZhY2UgPT0gQ0ZYX0J5dGVTdHJpbmdDKEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcE5hbWUpKSB7Ci0gICAgICAgICAgICBmYWNlID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wU3Vic3ROYW1lOwotICAgICAgICAgICAgaUV4YWN0ID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgaWYgKGlCYXNlRm9udCA8IDEyKSB7Ci0gICAgICAgIHJldHVybiBHZXRGb250KGZhY2UpOwordm9pZCogQ0ZYX01hY0ZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogY3N0cl9mYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUV4YWN0KSB7CisgIENGWF9CeXRlU3RyaW5nIGZhY2UgPSBjc3RyX2ZhY2U7CisgIGludCBpQmFzZUZvbnQ7CisgIGZvciAoaUJhc2VGb250ID0gMDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCsrKQorICAgIGlmIChmYWNlID09IENGWF9CeXRlU3RyaW5nQyhCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX3BOYW1lKSkgeworICAgICAgZmFjZSA9IEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcFN1YnN0TmFtZTsKKyAgICAgIGlFeGFjdCA9IFRSVUU7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgdm9pZCogcDsKLSAgICBpZiAobV9Gb250TGlzdC5Mb29rdXAoZmFjZSwgcCkpIHsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9BTlNJX0NIQVJTRVQgJiYgKHBpdGNoX2ZhbWlseSAmIEZYRk9OVF9GRl9GSVhFRFBJVENIKSkgewotICAgICAgICByZXR1cm4gR2V0Rm9udCgiQ291cmllciBOZXciKTsKLSAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCB8fCBjaGFyc2V0ID09IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgc3dpdGNoIChjaGFyc2V0KSB7Ci0gICAgICAgIGNhc2UgRlhGT05UX1NISUZUSklTX0NIQVJTRVQ6Ci0gICAgICAgICAgICBHZXRKYXBhbmVzZVByZWZlcmVuY2UoZmFjZSwgd2VpZ2h0LCBwaXRjaF9mYW1pbHkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhGT05UX0dCMjMxMl9DSEFSU0VUOgotICAgICAgICAgICAgZmFjZSA9ICJTVFNvbmciOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVDoKLSAgICAgICAgICAgIGZhY2UgPSAiQXBwbGVNeXVuZ2pvIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUOgotICAgICAgICAgICAgZmFjZSA9ICJMaVNvbmcgUHJvIExpZ2h0IjsKLSAgICB9Ci0gICAgaWYgKG1fRm9udExpc3QuTG9va3VwKGZhY2UsIHApKSB7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KKyAgaWYgKGlCYXNlRm9udCA8IDEyKSB7CisgICAgcmV0dXJuIEdldEZvbnQoZmFjZSk7CisgIH0KKyAgdm9pZCogcDsKKyAgaWYgKG1fRm9udExpc3QuTG9va3VwKGZhY2UsIHApKSB7CisgICAgcmV0dXJuIHA7CisgIH0KKyAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCAmJiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpKSB7CisgICAgcmV0dXJuIEdldEZvbnQoIkNvdXJpZXIgTmV3Iik7CisgIH0KKyAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCB8fCBjaGFyc2V0ID09IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVCkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIHN3aXRjaCAoY2hhcnNldCkgeworICAgIGNhc2UgRlhGT05UX1NISUZUSklTX0NIQVJTRVQ6CisgICAgICBHZXRKYXBhbmVzZVByZWZlcmVuY2UoZmFjZSwgd2VpZ2h0LCBwaXRjaF9mYW1pbHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQ6CisgICAgICBmYWNlID0gIlNUU29uZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQ6CisgICAgICBmYWNlID0gIkFwcGxlTXl1bmdqbyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUOgorICAgICAgZmFjZSA9ICJMaVNvbmcgUHJvIExpZ2h0IjsKKyAgfQorICBpZiAobV9Gb250TGlzdC5Mb29rdXAoZmFjZSwgcCkpIHsKKyAgICByZXR1cm4gcDsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLUlGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkKLXsKLSAgICBDRlhfTWFjRm9udEluZm8qIHBJbmZvID0gRlhfTkVXIENGWF9NYWNGb250SW5mbzsKLSAgICBpZiAoIXBJbmZvKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwSW5mby0+QWRkUGF0aCgifi9MaWJyYXJ5L0ZvbnRzIik7Ci0gICAgcEluZm8tPkFkZFBhdGgoIi9MaWJyYXJ5L0ZvbnRzIik7Ci0gICAgcEluZm8tPkFkZFBhdGgoIi9TeXN0ZW0vTGlicmFyeS9Gb250cyIpOwotICAgIHJldHVybiBwSW5mbzsKK0lGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkgeworICBDRlhfTWFjRm9udEluZm8qIHBJbmZvID0gRlhfTkVXIENGWF9NYWNGb250SW5mbzsKKyAgaWYgKCFwSW5mbykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHBJbmZvLT5BZGRQYXRoKCJ+L0xpYnJhcnkvRm9udHMiKTsKKyAgcEluZm8tPkFkZFBhdGgoIi9MaWJyYXJ5L0ZvbnRzIik7CisgIHBJbmZvLT5BZGRQYXRoKCIvU3lzdGVtL0xpYnJhcnkvRm9udHMiKTsKKyAgcmV0dXJuIHBJbmZvOwogfQotdm9pZCBDRlhfR0VNb2R1bGU6OkluaXRQbGF0Zm9ybSgpCi17Ci0gICAgbV9wUGxhdGZvcm1EYXRhID0gRlhfTkVXIENBcHBsZVBsYXRmb3JtOwotICAgIG1fcEZvbnRNZ3ItPlNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgpKTsKK3ZvaWQgQ0ZYX0dFTW9kdWxlOjpJbml0UGxhdGZvcm0oKSB7CisgIG1fcFBsYXRmb3JtRGF0YSA9IEZYX05FVyBDQXBwbGVQbGF0Zm9ybTsKKyAgbV9wRm9udE1nci0+U2V0U3lzdGVtRm9udEluZm8oSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkpOwogfQotdm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3lQbGF0Zm9ybSgpCi17Ci0gICAgZGVsZXRlIChDQXBwbGVQbGF0Zm9ybSAqKW1fcFBsYXRmb3JtRGF0YTsKLSAgICBtX3BQbGF0Zm9ybURhdGEgPSBOVUxMOwordm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3lQbGF0Zm9ybSgpIHsKKyAgZGVsZXRlIChDQXBwbGVQbGF0Zm9ybSopbV9wUGxhdGZvcm1EYXRhOworICBtX3BQbGF0Zm9ybURhdGEgPSBOVUxMOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X3F1YXJ0el9kZXZpY2UuY3BwIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9xdWFydHpfZGV2aWNlLmNwcAppbmRleCBjMTAwNGQ2Li44MGI5NTE3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X3F1YXJ0el9kZXZpY2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfcXVhcnR6X2RldmljZS5jcHAKQEAgLTExLDExMjcgKzExLDEwNTUgQEAKICNpbmNsdWRlICIuLi9kaWIvZGliX2ludC5oIgogI2luY2x1ZGUgIi4uL2dlL3RleHRfaW50LmgiCiAKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwogI2luY2x1ZGUgImFwcGxlX2ludC5oIgogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZV9hcHBsZS5oIgogI2lmbmRlZiBDR0ZMT0FUX0lTX0RPVUJMRQogI2Vycm9yIEV4cGVjdGVkIENHRkxPQVRfSVNfRE9VQkxFIHRvIGJlIGRlZmluZWQgYnkgQ29yZUdyYXBoaWNzIGhlYWRlcnMKICNlbmRpZgotdm9pZCogQ1F1YXJ0ejJEOjpjcmVhdGVHcmFwaGljcyhDRlhfRElCaXRtYXAqIHBCaXRtYXApCi17Ci0gICAgaWYgKCFwQml0bWFwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDR0JpdG1hcEluZm8gYm1wSW5mbyA9IGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlOwotICAgIHN3aXRjaCAocEJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsKLSAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjoKLSAgICAgICAgICAgIGJtcEluZm8gfD0ga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3Q7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9BcmdiOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENHQ29sb3JTcGFjZVJlZiBjb2xvclNwYWNlID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUocEJpdG1hcC0+R2V0QnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcC0+R2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcC0+R2V0UGl0Y2goKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBibXBJbmZvKTsKLSAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGNvbG9yU3BhY2UpOwotICAgIHJldHVybiBjb250ZXh0Owordm9pZCogQ1F1YXJ0ejJEOjpjcmVhdGVHcmFwaGljcyhDRlhfRElCaXRtYXAqIHBCaXRtYXApIHsKKyAgaWYgKCFwQml0bWFwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0dCaXRtYXBJbmZvIGJtcEluZm8gPSBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZTsKKyAgc3dpdGNoIChwQml0bWFwLT5HZXRGb3JtYXQoKSkgeworICAgIGNhc2UgRlhESUJfUmdiMzI6CisgICAgICBibXBJbmZvIHw9IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9BcmdiOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDR0NvbG9yU3BhY2VSZWYgY29sb3JTcGFjZSA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOworICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZSgKKyAgICAgIHBCaXRtYXAtPkdldEJ1ZmZlcigpLCBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSwgOCwKKyAgICAgIHBCaXRtYXAtPkdldFBpdGNoKCksIGNvbG9yU3BhY2UsIGJtcEluZm8pOworICBDR0NvbG9yU3BhY2VSZWxlYXNlKGNvbG9yU3BhY2UpOworICByZXR1cm4gY29udGV4dDsKIH0KLXZvaWQgQ1F1YXJ0ejJEOjpkZXN0cm95R3JhcGhpY3Modm9pZCogZ3JhcGhpY3MpCi17Ci0gICAgaWYgKGdyYXBoaWNzKSB7Ci0gICAgICAgIENHQ29udGV4dFJlbGVhc2UoKENHQ29udGV4dFJlZikgZ3JhcGhpY3MpOwotICAgIH0KK3ZvaWQgQ1F1YXJ0ejJEOjpkZXN0cm95R3JhcGhpY3Modm9pZCogZ3JhcGhpY3MpIHsKKyAgaWYgKGdyYXBoaWNzKSB7CisgICAgQ0dDb250ZXh0UmVsZWFzZSgoQ0dDb250ZXh0UmVmKWdyYXBoaWNzKTsKKyAgfQogfQotdm9pZCogQ1F1YXJ0ejJEOjpDcmVhdGVGb250KGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSwgRlhfRFdPUkQgZHdGb250U2l6ZSkKLXsKLSAgICBDR0RhdGFQcm92aWRlclJlZiBwRGF0YVByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YShOVUxMLCBwRm9udERhdGEsIChzaXplX3QpZHdGb250U2l6ZSwgTlVMTCk7Ci0gICAgaWYgKE5VTEwgPT0gcERhdGFQcm92aWRlcikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0dGb250UmVmIHBDR0ZvbnQgPSBDR0ZvbnRDcmVhdGVXaXRoRGF0YVByb3ZpZGVyKHBEYXRhUHJvdmlkZXIpOwotICAgIENHRGF0YVByb3ZpZGVyUmVsZWFzZShwRGF0YVByb3ZpZGVyKTsKLSAgICByZXR1cm4gcENHRm9udDsKK3ZvaWQqIENRdWFydHoyRDo6Q3JlYXRlRm9udChjb25zdCB1aW50OF90KiBwRm9udERhdGEsIEZYX0RXT1JEIGR3Rm9udFNpemUpIHsKKyAgQ0dEYXRhUHJvdmlkZXJSZWYgcERhdGFQcm92aWRlciA9CisgICAgICBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhKE5VTEwsIHBGb250RGF0YSwgKHNpemVfdClkd0ZvbnRTaXplLCBOVUxMKTsKKyAgaWYgKE5VTEwgPT0gcERhdGFQcm92aWRlcikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENHRm9udFJlZiBwQ0dGb250ID0gQ0dGb250Q3JlYXRlV2l0aERhdGFQcm92aWRlcihwRGF0YVByb3ZpZGVyKTsKKyAgQ0dEYXRhUHJvdmlkZXJSZWxlYXNlKHBEYXRhUHJvdmlkZXIpOworICByZXR1cm4gcENHRm9udDsKIH0KLXZvaWQgQ1F1YXJ0ejJEOjpEZXN0cm95Rm9udCh2b2lkKiBwRm9udCkKLXsKLSAgICBDR0ZvbnRSZWxlYXNlKChDR0ZvbnRSZWYpcEZvbnQpOwordm9pZCBDUXVhcnR6MkQ6OkRlc3Ryb3lGb250KHZvaWQqIHBGb250KSB7CisgIENHRm9udFJlbGVhc2UoKENHRm9udFJlZilwRm9udCk7CiB9Ci12b2lkIENRdWFydHoyRDo6c2V0R3JhcGhpY3NUZXh0TWF0cml4KHZvaWQqIGdyYXBoaWNzLCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpCi17Ci0gICAgaWYgKCFncmFwaGljcyB8fCAhbWF0cml4KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSAoQ0dDb250ZXh0UmVmKSBncmFwaGljczsKLSAgICBDR0Zsb2F0IHR5ID0gQ0dCaXRtYXBDb250ZXh0R2V0SGVpZ2h0KGNvbnRleHQpIC0gbWF0cml4LT5mOwotICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY29udGV4dCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKG1hdHJpeC0+YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5KSk7Cit2b2lkIENRdWFydHoyRDo6c2V0R3JhcGhpY3NUZXh0TWF0cml4KHZvaWQqIGdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpIHsKKyAgaWYgKCFncmFwaGljcyB8fCAhbWF0cml4KSB7CisgICAgcmV0dXJuOworICB9CisgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gKENHQ29udGV4dFJlZilncmFwaGljczsKKyAgQ0dGbG9hdCB0eSA9IENHQml0bWFwQ29udGV4dEdldEhlaWdodChjb250ZXh0KSAtIG1hdHJpeC0+ZjsKKyAgQ0dDb250ZXh0U2V0VGV4dE1hdHJpeCgKKyAgICAgIGNvbnRleHQsIENHQWZmaW5lVHJhbnNmb3JtTWFrZShtYXRyaXgtPmEsIG1hdHJpeC0+YiwgbWF0cml4LT5jLCBtYXRyaXgtPmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LT5lLCB0eSkpOwogfQotRlhfQk9PTCBDUXVhcnR6MkQ6OmRyYXdHcmFwaGljc1N0cmluZyh2b2lkKiAgICAgICAgICAgICAgICAgZ3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICAgZm9udFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQqICAgICAgICAgICAgICBnbHlwaEluZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHUG9pbnQqICAgICAgICAgICBnbHlwaFBvc2l0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgY2hhcnNDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiAgICAgICAgICAgICAgIGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqICAgICBtYXRyaXggKQotewotICAgIGlmICghZ3JhcGhpY3MpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IChDR0NvbnRleHRSZWYpIGdyYXBoaWNzOwotICAgIENHQ29udGV4dFNldEZvbnQoY29udGV4dCwgKENHRm9udFJlZilmb250KTsKLSAgICBDR0NvbnRleHRTZXRGb250U2l6ZShjb250ZXh0LCBmb250U2l6ZSk7Ci0gICAgaWYgKG1hdHJpeCkgewotICAgICAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dDb250ZXh0R2V0VGV4dE1hdHJpeChjb250ZXh0KTsKLSAgICAgICAgbSA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybU1ha2UobWF0cml4LT5hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgtPmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LT5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgtPmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+ZikpOwotICAgICAgICBDR0NvbnRleHRTZXRUZXh0TWF0cml4KGNvbnRleHQsIG0pOwotICAgIH0KLSAgICBpbnQzMl90IGEsIHIsIGcsIGI7Ci0gICAgQXJnYkRlY29kZShhcmdiLCBhLCByLCBnLCBiKTsKLSAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAvIDI1NS5mKTsKLSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOworRlhfQk9PTCBDUXVhcnR6MkQ6OmRyYXdHcmFwaGljc1N0cmluZyh2b2lkKiBncmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQqIGdseXBoSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludCogZ2x5cGhQb3NpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpIHsKKyAgaWYgKCFncmFwaGljcykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDR0NvbnRleHRSZWYgY29udGV4dCA9IChDR0NvbnRleHRSZWYpZ3JhcGhpY3M7CisgIENHQ29udGV4dFNldEZvbnQoY29udGV4dCwgKENHRm9udFJlZilmb250KTsKKyAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY29udGV4dCwgZm9udFNpemUpOworICBpZiAobWF0cml4KSB7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQ29udGV4dEdldFRleHRNYXRyaXgoY29udGV4dCk7CisgICAgbSA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KAorICAgICAgICBtLCBDR0FmZmluZVRyYW5zZm9ybU1ha2UobWF0cml4LT5hLCBtYXRyaXgtPmIsIG1hdHJpeC0+YywgbWF0cml4LT5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LT5lLCBtYXRyaXgtPmYpKTsKKyAgICBDR0NvbnRleHRTZXRUZXh0TWF0cml4KGNvbnRleHQsIG0pOworICB9CisgIGludDMyX3QgYSwgciwgZywgYjsKKyAgQXJnYkRlY29kZShhcmdiLCBhLCByLCBnLCBiKTsKKyAgQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKGNvbnRleHQsIHIgLyAyNTUuZiwgZyAvIDI1NS5mLCBiIC8gMjU1LmYsIGEgLyAyNTUuZik7CisgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CiAjaWYgQ0dGTE9BVF9JU19ET1VCTEUKLSAgICBDR1BvaW50KiBnbHlwaFBvc2l0aW9uc0NHID0gbmV3IENHUG9pbnRbY2hhcnNDb3VudF07Ci0gICAgaWYgKCFnbHlwaFBvc2l0aW9uc0NHKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoYXJzQ291bnQ7ICsraW5kZXgpIHsKLSAgICAgICAgZ2x5cGhQb3NpdGlvbnNDR1tpbmRleF0ueCA9IGdseXBoUG9zaXRpb25zW2luZGV4XS54OwotICAgICAgICBnbHlwaFBvc2l0aW9uc0NHW2luZGV4XS55ID0gZ2x5cGhQb3NpdGlvbnNbaW5kZXhdLnk7Ci0gICAgfQorICBDR1BvaW50KiBnbHlwaFBvc2l0aW9uc0NHID0gbmV3IENHUG9pbnRbY2hhcnNDb3VudF07CisgIGlmICghZ2x5cGhQb3NpdGlvbnNDRykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hhcnNDb3VudDsgKytpbmRleCkgeworICAgIGdseXBoUG9zaXRpb25zQ0dbaW5kZXhdLnggPSBnbHlwaFBvc2l0aW9uc1tpbmRleF0ueDsKKyAgICBnbHlwaFBvc2l0aW9uc0NHW2luZGV4XS55ID0gZ2x5cGhQb3NpdGlvbnNbaW5kZXhdLnk7CisgIH0KICNlbHNlCi0gICAgQ0dQb2ludCogZ2x5cGhQb3NpdGlvbnNDRyA9IChDR1BvaW50KilnbHlwaFBvc2l0aW9uczsKKyAgQ0dQb2ludCogZ2x5cGhQb3NpdGlvbnNDRyA9IChDR1BvaW50KilnbHlwaFBvc2l0aW9uczsKICNlbmRpZgotICAgIENHQ29udGV4dFNob3dHbHlwaHNBdFBvc2l0aW9ucyhjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0dHbHlwaCAqKSBnbHlwaEluZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25zQ0csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzQ291bnQpOworICBDR0NvbnRleHRTaG93R2x5cGhzQXRQb3NpdGlvbnMoY29udGV4dCwgKENHR2x5cGgqKWdseXBoSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25zQ0csIGNoYXJzQ291bnQpOwogI2lmIENHRkxPQVRfSVNfRE9VQkxFCi0gICAgZGVsZXRlW10gZ2x5cGhQb3NpdGlvbnNDRzsKKyAgZGVsZXRlW10gZ2x5cGhQb3NpdGlvbnNDRzsKICNlbmRpZgotICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDUXVhcnR6MkQ6OnNhdmVHcmFwaGljc1N0YXRlKHZvaWQgKiBncmFwaGljcykKLXsKLSAgICBpZiAoZ3JhcGhpY3MpIHsKLSAgICAgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZSgoQ0dDb250ZXh0UmVmKSBncmFwaGljcyk7Ci0gICAgfQordm9pZCBDUXVhcnR6MkQ6OnNhdmVHcmFwaGljc1N0YXRlKHZvaWQqIGdyYXBoaWNzKSB7CisgIGlmIChncmFwaGljcykgeworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoKENHQ29udGV4dFJlZilncmFwaGljcyk7CisgIH0KIH0KLXZvaWQgQ1F1YXJ0ejJEOjpyZXN0b3JlR3JhcGhpY3NTdGF0ZSh2b2lkICogZ3JhcGhpY3MpCi17Ci0gICAgaWYgKGdyYXBoaWNzKSB7Ci0gICAgICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoKENHQ29udGV4dFJlZikgZ3JhcGhpY3MpOwotICAgIH0KK3ZvaWQgQ1F1YXJ0ejJEOjpyZXN0b3JlR3JhcGhpY3NTdGF0ZSh2b2lkKiBncmFwaGljcykgeworICBpZiAoZ3JhcGhpY3MpIHsKKyAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKChDR0NvbnRleHRSZWYpZ3JhcGhpY3MpOworICB9CiB9Ci1zdGF0aWMgQ0dDb250ZXh0UmVmIGNyZWF0ZUNvbnRleHRXaXRoQml0bWFwKENGWF9ESUJpdG1hcCogcEJpdG1hcCkKLXsKLSAgICBpZiAoIXBCaXRtYXAgfHwgcEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSB8fCBwQml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDR0JpdG1hcEluZm8gYml0bWFwSW5mbyA9IGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlOwotICAgIGlmIChwQml0bWFwLT5IYXNBbHBoYSgpKSB7Ci0gICAgICAgIGJpdG1hcEluZm8gfD0ga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdDsKLSAgICB9IGVsc2UgewotICAgICAgICBiaXRtYXBJbmZvIHw9IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0OwotICAgIH0KLSAgICBDR0NvbG9yU3BhY2VSZWYgY29sb3JTcGFjZSA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKHBCaXRtYXAtPkdldEJ1ZmZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcC0+R2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldFBpdGNoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwSW5mbyk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShjb2xvclNwYWNlKTsKLSAgICByZXR1cm4gY29udGV4dDsKK3N0YXRpYyBDR0NvbnRleHRSZWYgY3JlYXRlQ29udGV4dFdpdGhCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSB7CisgIGlmICghcEJpdG1hcCB8fCBwQml0bWFwLT5Jc0NteWtJbWFnZSgpIHx8IHBCaXRtYXAtPkdldEJQUCgpIDwgMzIpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDR0JpdG1hcEluZm8gYml0bWFwSW5mbyA9IGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlOworICBpZiAocEJpdG1hcC0+SGFzQWxwaGEoKSkgeworICAgIGJpdG1hcEluZm8gfD0ga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdDsKKyAgfSBlbHNlIHsKKyAgICBiaXRtYXBJbmZvIHw9IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0OworICB9CisgIENHQ29sb3JTcGFjZVJlZiBjb2xvclNwYWNlID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKAorICAgICAgcEJpdG1hcC0+R2V0QnVmZmVyKCksIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCA4LAorICAgICAgcEJpdG1hcC0+R2V0UGl0Y2goKSwgY29sb3JTcGFjZSwgYml0bWFwSW5mbyk7CisgIENHQ29sb3JTcGFjZVJlbGVhc2UoY29sb3JTcGFjZSk7CisgIHJldHVybiBjb250ZXh0OwogfQotQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6Q0ZYX1F1YXJ0ekRldmljZURyaXZlcihDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBkZXZpY2VDbGFzcykKLXsKLSAgICBtX3NhdmVDb3VudCA9IDA7Ci0gICAgX2NvbnRleHQJCT0gY29udGV4dDsKLSAgICBfZGV2aWNlQ2xhc3MJPSBkZXZpY2VDbGFzczsKLSAgICBDR0NvbnRleHRSZXRhaW4oX2NvbnRleHQpOwotICAgIENHUmVjdCByID0gQ0dDb250ZXh0R2V0Q2xpcEJvdW5kaW5nQm94KGNvbnRleHQpOwotICAgIF93aWR0aAk9IEZYU1lTX3JvdW5kKHIuc2l6ZS53aWR0aCk7Ci0gICAgX2hlaWdodAk9IEZYU1lTX3JvdW5kKHIuc2l6ZS5oZWlnaHQpOwotICAgIF9yZW5kZXJDYXBzID0gRlhSQ19TT0ZUX0NMSVAgfCBGWFJDX0JMRU5EX01PREUgfAotICAgICAgICAgICAgICAgICAgRlhSQ19BTFBIQV9QQVRIIHwgRlhSQ19BTFBIQV9JTUFHRSB8Ci0gICAgICAgICAgICAgICAgICBGWFJDX0JJVF9NQVNLIHwgRlhSQ19BTFBIQV9NQVNLOwotICAgIGlmIChfZGV2aWNlQ2xhc3MgIT0gRlhEQ19ESVNQTEFZKSB7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKF9jb250ZXh0KTsKLSAgICAgICAgaWYgKGltYWdlKSB7Ci0gICAgICAgICAgICBfcmVuZGVyQ2FwcyB8PSBGWFJDX0dFVF9CSVRTOwotICAgICAgICAgICAgX3dpZHRoID0gQ0dJbWFnZUdldFdpZHRoKGltYWdlKTsKLSAgICAgICAgICAgIF9oZWlnaHQgPSBDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKTsKLSAgICAgICAgICAgIENHSW1hZ2VBbHBoYUluZm8gYWxwaGFJbmZvID0gQ0dJbWFnZUdldEFscGhhSW5mbyhpbWFnZSk7Ci0gICAgICAgICAgICBpZiAoa0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCA9PSBhbHBoYUluZm8gfHwKLSAgICAgICAgICAgICAgICAgICAga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRMYXN0ID09IGFscGhhSW5mbyB8fAotICAgICAgICAgICAgICAgICAgICBrQ0dJbWFnZUFscGhhT25seSA9PSBhbHBoYUluZm8pIHsKLSAgICAgICAgICAgICAgICBfcmVuZGVyQ2FwcyB8PSBGWFJDX0FMUEhBX09VVFBVVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7Ci0gICAgfQotICAgIENHQWZmaW5lVHJhbnNmb3JtIGN0bSA9IENHQ29udGV4dEdldENUTShfY29udGV4dCk7Ci0gICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShfY29udGV4dCk7Ci0gICAgbV9zYXZlQ291bnQrKzsKLSAgICBpZiAoY3RtLmQgPj0gMCkgewotICAgICAgICBDR0Zsb2F0IG9mZnNldF94LCBvZmZzZXRfeTsKLSAgICAgICAgb2Zmc2V0X3ggPSBjdG0udHg7Ci0gICAgICAgIG9mZnNldF95ID0gY3RtLnR5OwotICAgICAgICBDR0NvbnRleHRUcmFuc2xhdGVDVE0oX2NvbnRleHQsIC1vZmZzZXRfeCwgLW9mZnNldF95KTsKLSAgICAgICAgQ0dDb250ZXh0Q29uY2F0Q1RNKF9jb250ZXh0LCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwgMCwgLTEsIG9mZnNldF94LCBfaGVpZ2h0ICsgb2Zmc2V0X3kpKTsKLSAgICB9Ci0gICAgX2ZveGl0RGV2aWNlMlVzZXIgPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50aXR5OwotICAgIF91c2VyMkZveGl0RGV2aWNlID0gQ0dBZmZpbmVUcmFuc2Zvcm1JbnZlcnQoX2ZveGl0RGV2aWNlMlVzZXIpOwotfQotQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6fkNGWF9RdWFydHpEZXZpY2VEcml2ZXIoKQotewotICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoX2NvbnRleHQpOwotICAgIG1fc2F2ZUNvdW50LS07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3NhdmVDb3VudDsgKytpKSB7Ci0gICAgICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoX2NvbnRleHQpOwotICAgIH0KLSAgICBpZiAoX2NvbnRleHQpIHsKLSAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShfY29udGV4dCk7Ci0gICAgfQotfQotaW50IENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNJRCkKLXsKLSAgICBzd2l0Y2ggKGNhcHNJRCkgewotICAgICAgICBjYXNlIEZYRENfREVWSUNFX0NMQVNTOiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9kZXZpY2VDbGFzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERDX1BJWEVMX1dJRFRIOiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF93aWR0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERDX1BJWEVMX0hFSUdIVDogewotICAgICAgICAgICAgICAgIHJldHVybiBfaGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRENfQklUU19QSVhFTDogewotICAgICAgICAgICAgICAgIHJldHVybiAzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERDX1JFTkRFUl9DQVBTOiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9yZW5kZXJDYXBzOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgfQotfQotQ0ZYX01hdHJpeCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpHZXRDVE0oKSBjb25zdAotewotICAgIENHQWZmaW5lVHJhbnNmb3JtIGN0bSA9IENHQ29udGV4dEdldENUTShfY29udGV4dCk7Ci0gICAgcmV0dXJuIENGWF9NYXRyaXgoY3RtLmEsIGN0bS5iLCBjdG0uYywgY3RtLmQsIGN0bS50eCwgY3RtLnR5KTsKLX0KLXZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6U2F2ZVN0YXRlKCkKLXsKLSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKF9jb250ZXh0KTsKLSAgICBtX3NhdmVDb3VudCsrOwotfQotdm9pZCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBpc0tlZXBTYXZlZCApCi17Ci0gICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShfY29udGV4dCk7Ci0gICAgaWYgKGlzS2VlcFNhdmVkKSB7Ci0gICAgICAgIENHQ29udGV4dFNhdmVHU3RhdGUoX2NvbnRleHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fc2F2ZUNvdW50LS07Ci0gICAgfQotfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogICAgcGF0aERhdGEsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqICAgbWF0cml4LAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGZpbGxNb2RlICkKLXsKLSAgICBTYXZlU3RhdGUoKTsKLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKLSAgICBpZiAobWF0cml4KSB7Ci0gICAgICAgIG0gPSBDR0FmZmluZVRyYW5zZm9ybU1ha2UobWF0cml4LT5HZXRBKCksIG1hdHJpeC0+R2V0QigpLCBtYXRyaXgtPkdldEMoKSwgbWF0cml4LT5HZXREKCksIG1hdHJpeC0+R2V0RSgpLCBtYXRyaXgtPkdldEYoKSk7Ci0gICAgfQotICAgIG0gPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdChtLCBfZm94aXREZXZpY2UyVXNlcik7Ci0gICAgQ0dDb250ZXh0Q29uY2F0Q1RNKF9jb250ZXh0LCBtKTsKLSAgICBzZXRQYXRoVG9Db250ZXh0KHBhdGhEYXRhKTsKLSAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgIGlmICgoZmlsbE1vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORykgewotICAgICAgICBDR0NvbnRleHRDbGlwKF9jb250ZXh0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBDR0NvbnRleHRFT0NsaXAoX2NvbnRleHQpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0ZMT0FUIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OmdldExpbmVXaWR0aChjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEgKiBncmFwaFN0YXRlLCBDR0FmZmluZVRyYW5zZm9ybSBjdG0pCi17Ci0gICAgRlhfRkxPQVQgbGluZVdpZHRoID0gZ3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGg7Ci0gICAgaWYgKGdyYXBoU3RhdGUtPm1fTGluZVdpZHRoIDw9IDAuZikgewotICAgICAgICBDR1NpemUgc2l6ZTsKLSAgICAgICAgc2l6ZS53aWR0aCA9IDE7Ci0gICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKLSAgICAgICAgQ0dTaXplIHRlbXAgPSBDR1NpemVBcHBseUFmZmluZVRyYW5zZm9ybShzaXplLCBjdG0pOwotICAgICAgICBDR0Zsb2F0IHggPSAxIC8gdGVtcC53aWR0aDsKLSAgICAgICAgQ0dGbG9hdCB5ID0gMSAvIHRlbXAuaGVpZ2h0OwotICAgICAgICBsaW5lV2lkdGggPSB4ID4geSA/IHggOiB5OwotICAgIH0KLSAgICByZXR1cm4gbGluZVdpZHRoOwotfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiAgICAgIHBhdGhEYXRhLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiAgICAgbWF0cml4LAotICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqICAgZ3JhcGhTdGF0ZSApCi17Ci0gICAgU2F2ZVN0YXRlKCk7Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtSWRlbnRpdHk7Ci0gICAgaWYgKG1hdHJpeCkgewotICAgICAgICBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKG1hdHJpeC0+R2V0QSgpLCBtYXRyaXgtPkdldEIoKSwgbWF0cml4LT5HZXRDKCksIG1hdHJpeC0+R2V0RCgpLCBtYXRyaXgtPkdldEUoKSwgbWF0cml4LT5HZXRGKCkpOwotICAgIH0KLSAgICBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQobSwgX2ZveGl0RGV2aWNlMlVzZXIpOwotICAgIENHQ29udGV4dENvbmNhdENUTShfY29udGV4dCwgbSk7Ci0gICAgRlhfRkxPQVQgbGluZVdpZHRoID0gZ2V0TGluZVdpZHRoKGdyYXBoU3RhdGUsIG0pOwotICAgIHNldFN0cm9rZUluZm8oZ3JhcGhTdGF0ZSwgMHhGRjAwMDAwMCwgbGluZVdpZHRoKTsKLSAgICBzZXRQYXRoVG9Db250ZXh0KHBhdGhEYXRhKTsKLSAgICBDR0NvbnRleHRSZXBsYWNlUGF0aFdpdGhTdHJva2VkUGF0aChfY29udGV4dCk7Ci0gICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICBDR0NvbnRleHRDbGlwKF9jb250ZXh0KTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXN0YXRpYyBDR0JsZW5kTW9kZSBHZXRDR0JsZW5kTW9kZShpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBDR0JsZW5kTW9kZSBtb2RlID0ga0NHQmxlbmRNb2RlTm9ybWFsOwotICAgIHN3aXRjaCAoYmxlbmRfdHlwZSkgewotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX05PUk1BTDoKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVOb3JtYWw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9NVUxUSVBMWToKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVNdWx0aXBseTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX1NDUkVFTjoKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVTY3JlZW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9PVkVSTEFZOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZU92ZXJsYXk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9EQVJLRU46Ci0gICAgICAgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlRGFya2VuOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfTElHSFRFTjoKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVMaWdodGVuOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfQ09MT1JET0RHRToKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVDb2xvckRvZGdlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfQ09MT1JCVVJOOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZUNvbG9yQnVybjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0hBUkRMSUdIVDoKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVIYXJkTGlnaHQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9TT0ZUTElHSFQ6Ci0gICAgICAgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlU29mdExpZ2h0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfRElGRkVSRU5DRToKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVEaWZmZXJlbmNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfRVhDTFVTSU9OOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZUV4Y2x1c2lvbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0hVRToKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVIdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9TQVRVUkFUSU9OOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZVNhdHVyYXRpb247Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUjoKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVDb2xvcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0xVTUlOT1NJVFk6Ci0gICAgICAgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlTHVtaW5vc2l0eTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZU5vcm1hbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gbW9kZTsKLX0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiAgICAgICAgcGF0aERhdGEsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqICAgICAgIG1hdHJpeCwKLSAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiAgICAgZ3JhcGhTdGF0ZSwKLSAgICAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgZmlsbEFyZ2IsCi0gICAgICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZUFyZ2IsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxNb2RlLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLAotICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtLAotICAgICAgICBpbnQJCQkJCQkJYmxlbmRfdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBTYXZlU3RhdGUoKTsKLSAgICBDR0JsZW5kTW9kZSBtb2RlID0gR2V0Q0dCbGVuZE1vZGUoYmxlbmRfdHlwZSk7Ci0gICAgaWYgKG1vZGUgIT0ga0NHQmxlbmRNb2RlTm9ybWFsKSB7Ci0gICAgICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShfY29udGV4dCwgbW9kZSk7Ci0gICAgfQotICAgIENHQWZmaW5lVHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50aXR5OwotICAgIGlmIChtYXRyaXgpIHsKLSAgICAgICAgbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZShtYXRyaXgtPkdldEEoKSwgbWF0cml4LT5HZXRCKCksIG1hdHJpeC0+R2V0QygpLCBtYXRyaXgtPkdldEQoKSwgbWF0cml4LT5HZXRFKCksIG1hdHJpeC0+R2V0RigpKTsKLSAgICB9Ci0gICAgbSA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG0sIF9mb3hpdERldmljZTJVc2VyKTsKLSAgICBDR0NvbnRleHRDb25jYXRDVE0oX2NvbnRleHQsIG0pOwotICAgIGludCBwYXRoTW9kZSA9IDA7Ci0gICAgaWYgKGdyYXBoU3RhdGUgJiYgc3Ryb2tlQXJnYikgewotICAgICAgICBDR0NvbnRleHRTZXRNaXRlckxpbWl0KF9jb250ZXh0LCBncmFwaFN0YXRlLT5tX01pdGVyTGltaXQpOwotICAgICAgICBGWF9GTE9BVCBsaW5lV2lkdGggPSBnZXRMaW5lV2lkdGgoZ3JhcGhTdGF0ZSwgbSk7Ci0gICAgICAgIHNldFN0cm9rZUluZm8oZ3JhcGhTdGF0ZSwgc3Ryb2tlQXJnYiwgbGluZVdpZHRoKTsKLSAgICAgICAgcGF0aE1vZGUgfD0gNDsKLSAgICB9Ci0gICAgaWYgKGZpbGxNb2RlICYmIGZpbGxBcmdiKSB7Ci0gICAgICAgIHNldEZpbGxJbmZvKGZpbGxBcmdiKTsKLSAgICAgICAgaWYgKChmaWxsTW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HKSB7Ci0gICAgICAgICAgICBwYXRoTW9kZSB8PSAxOwotICAgICAgICB9IGVsc2UgaWYgKChmaWxsTW9kZSAmIDMpID09IEZYRklMTF9BTFRFUk5BVEUpIHsKLSAgICAgICAgICAgIHBhdGhNb2RlIHw9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2V0UGF0aFRvQ29udGV4dChwYXRoRGF0YSk7Ci0gICAgaWYgKGZpbGxNb2RlICYgRlhGSUxMX0ZVTExDT1ZFUikgewotICAgICAgICBDR0NvbnRleHRTZXRTaG91bGRBbnRpYWxpYXMoX2NvbnRleHQsIGZhbHNlKTsKLSAgICB9Ci0gICAgaWYgKHBhdGhNb2RlID09IDQpIHsKLSAgICAgICAgQ0dDb250ZXh0U3Ryb2tlUGF0aChfY29udGV4dCk7Ci0gICAgfSBlbHNlIGlmIChwYXRoTW9kZSA9PSAxKSB7Ci0gICAgICAgIENHQ29udGV4dEZpbGxQYXRoKF9jb250ZXh0KTsKLSAgICB9IGVsc2UgaWYgKHBhdGhNb2RlID09IDIpIHsKLSAgICAgICAgQ0dDb250ZXh0RU9GaWxsUGF0aChfY29udGV4dCk7Ci0gICAgfSBlbHNlIGlmIChwYXRoTW9kZSA9PSA1KSB7Ci0gICAgICAgIENHQ29udGV4dERyYXdQYXRoKF9jb250ZXh0LCBrQ0dQYXRoRmlsbFN0cm9rZSk7Ci0gICAgfSBlbHNlIGlmIChwYXRoTW9kZSA9PSA2KSB7Ci0gICAgICAgIENHQ29udGV4dERyYXdQYXRoKF9jb250ZXh0LCBrQ0dQYXRoRU9GaWxsU3Ryb2tlKTsKLSAgICB9Ci0gICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogICAgICAgICByZWN0LAotICAgICAgICBGWF9BUkdCICAgICAgICAgICAgICAgICAgIGZpbGxBcmdiLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGFscGhhRmxhZwkgICAsCi0gICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgaWNjVHJhbnNmb3JtICwKLSAgICAgICAgaW50CQkJCQkJYmxlbmRfdHlwZSApCi17Ci0gICAgQ0dCbGVuZE1vZGUgbW9kZSA9IEdldENHQmxlbmRNb2RlKGJsZW5kX3R5cGUpOwotICAgIGlmIChtb2RlICE9IGtDR0JsZW5kTW9kZU5vcm1hbCkgewotICAgICAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoX2NvbnRleHQsIG1vZGUpOwotICAgIH0KLSAgICBDR1JlY3QgcmVjdF9meCA9IENHUmVjdE1ha2UocmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5XaWR0aCgpLCByZWN0LT5IZWlnaHQoKSk7Ci0gICAgQ0dSZWN0IHJlY3RfdXNyID0gQ0dSZWN0QXBwbHlBZmZpbmVUcmFuc2Zvcm0ocmVjdF9meCwgX2ZveGl0RGV2aWNlMlVzZXIpOwotICAgIGludDMyX3QgYSwgciwgZywgYjsKLSAgICBBcmdiRGVjb2RlKGZpbGxBcmdiLCBhLCByLCBnLCBiKTsKLSAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgLyAyNTUuZik7Ci0gICAgQ0dDb250ZXh0RmlsbFJlY3QoX2NvbnRleHQsIHJlY3RfdXNyKTsKLSAgICBpZiAobW9kZSAhPSBrQ0dCbGVuZE1vZGVOb3JtYWwpIHsKLSAgICAgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKF9jb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCAgICAgICAgICAgeDEsCi0gICAgICAgIEZYX0ZMT0FUICAgICAgICAgICAgICB5MSwKLSAgICAgICAgRlhfRkxPQVQgICAgICAgICAgICAgIHgyLAotICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICAgeTIsCi0gICAgICAgIEZYX0RXT1JEICAgICAgICAgICAgICBhcmdiLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYWxwaGFGbGFnICAgICAgICwKLSAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgIGljY1RyYW5zZm9ybSAgICAsCi0gICAgICAgIGludAkJCQkJYmxlbmRfdHlwZSApCi17Ci0gICAgQ0dCbGVuZE1vZGUgbW9kZSA9IEdldENHQmxlbmRNb2RlKGJsZW5kX3R5cGUpOwotICAgIGlmIChtb2RlICE9IGtDR0JsZW5kTW9kZU5vcm1hbCkgewotICAgICAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoX2NvbnRleHQsIG1vZGUpOwotICAgIH0KLSAgICBDR1BvaW50IHB0ID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtKENHUG9pbnRNYWtlKHgxLCB5MSksIF9mb3hpdERldmljZTJVc2VyKTsKLSAgICB4MSA9IHB0Lng7Ci0gICAgeTEgPSBwdC55OwotICAgIHB0ID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtKENHUG9pbnRNYWtlKHgyLCB5MiksIF9mb3hpdERldmljZTJVc2VyKTsKLSAgICB4MiA9IHB0Lng7Ci0gICAgeTIgPSBwdC55OwotICAgIGludDMyX3QgYSwgciwgZywgYjsKLSAgICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOwotICAgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKF9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgLyAyNTUuZik7Ci0gICAgQ0dDb250ZXh0TW92ZVRvUG9pbnQoX2NvbnRleHQsIHgxLCB5MSk7Ci0gICAgQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQoX2NvbnRleHQsIHgyLCB5Mik7Ci0gICAgQ0dDb250ZXh0U3Ryb2tlUGF0aChfY29udGV4dCk7Ci0gICAgaWYgKG1vZGUgIT0ga0NHQmxlbmRNb2RlTm9ybWFsKSB7Ci0gICAgICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShfY29udGV4dCwga0NHQmxlbmRNb2RlTm9ybWFsKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcmVjdCkKLXsKLSAgICBDR1JlY3QgciA9IENHQ29udGV4dEdldENsaXBCb3VuZGluZ0JveChfY29udGV4dCk7Ci0gICAgciA9IENHUmVjdEFwcGx5QWZmaW5lVHJhbnNmb3JtKHIsIF91c2VyMkZveGl0RGV2aWNlKTsKLSAgICByZWN0LT5sZWZ0CQk9IEZYU1lTX2Zsb29yKHIub3JpZ2luLngpOwotICAgIHJlY3QtPnRvcAkJPSBGWFNZU19mbG9vcihyLm9yaWdpbi55KTsKLSAgICByZWN0LT5yaWdodAkJPSBGWFNZU19jZWlsKHIub3JpZ2luLnggKyByLnNpemUud2lkdGgpOwotICAgIHJlY3QtPmJvdHRvbQk9IEZYU1lTX2NlaWwoci5vcmlnaW4ueSArIHIuc2l6ZS5oZWlnaHQpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiAgICAgYml0bWFwLAotICAgICAgICBpbnQzMl90ICAgICAgICAgICAgbGVmdCwKLSAgICAgICAgaW50MzJfdCAgICAgICAgICAgIHRvcCwKLSAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKLSAgICAgICAgRlhfQk9PTCBiREVkZ2UpCi17Ci0gICAgaWYgKEZYRENfUFJJTlRFUiA9PSBfZGV2aWNlQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoYml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCEoX3JlbmRlckNhcHMgfCBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENHUG9pbnQgcHQgPSBDR1BvaW50TWFrZShsZWZ0LCB0b3ApOwotICAgIHB0ID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtKHB0LCBfZm94aXREZXZpY2UyVXNlcik7Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gY3RtID0gQ0dDb250ZXh0R2V0Q1RNKF9jb250ZXh0KTsKLSAgICBwdC54ICo9IEZYU1lTX2ZhYnMoY3RtLmEpOwotICAgIHB0LnkgKj0gRlhTWVNfZmFicyhjdG0uZCk7CitDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpDRlhfUXVhcnR6RGV2aWNlRHJpdmVyKENHQ29udGV4dFJlZiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZUNsYXNzKSB7CisgIG1fc2F2ZUNvdW50ID0gMDsKKyAgX2NvbnRleHQgPSBjb250ZXh0OworICBfZGV2aWNlQ2xhc3MgPSBkZXZpY2VDbGFzczsKKyAgQ0dDb250ZXh0UmV0YWluKF9jb250ZXh0KTsKKyAgQ0dSZWN0IHIgPSBDR0NvbnRleHRHZXRDbGlwQm91bmRpbmdCb3goY29udGV4dCk7CisgIF93aWR0aCA9IEZYU1lTX3JvdW5kKHIuc2l6ZS53aWR0aCk7CisgIF9oZWlnaHQgPSBGWFNZU19yb3VuZChyLnNpemUuaGVpZ2h0KTsKKyAgX3JlbmRlckNhcHMgPSBGWFJDX1NPRlRfQ0xJUCB8IEZYUkNfQkxFTkRfTU9ERSB8IEZYUkNfQUxQSEFfUEFUSCB8CisgICAgICAgICAgICAgICAgRlhSQ19BTFBIQV9JTUFHRSB8IEZYUkNfQklUX01BU0sgfCBGWFJDX0FMUEhBX01BU0s7CisgIGlmIChfZGV2aWNlQ2xhc3MgIT0gRlhEQ19ESVNQTEFZKSB7CisgIH0gZWxzZSB7CiAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKF9jb250ZXh0KTsKLSAgICBpZiAoTlVMTCA9PSBpbWFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKGltYWdlKSB7CisgICAgICBfcmVuZGVyQ2FwcyB8PSBGWFJDX0dFVF9CSVRTOworICAgICAgX3dpZHRoID0gQ0dJbWFnZUdldFdpZHRoKGltYWdlKTsKKyAgICAgIF9oZWlnaHQgPSBDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKTsKKyAgICAgIENHSW1hZ2VBbHBoYUluZm8gYWxwaGFJbmZvID0gQ0dJbWFnZUdldEFscGhhSW5mbyhpbWFnZSk7CisgICAgICBpZiAoa0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCA9PSBhbHBoYUluZm8gfHwKKyAgICAgICAgICBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZExhc3QgPT0gYWxwaGFJbmZvIHx8CisgICAgICAgICAga0NHSW1hZ2VBbHBoYU9ubHkgPT0gYWxwaGFJbmZvKSB7CisgICAgICAgIF9yZW5kZXJDYXBzIHw9IEZYUkNfQUxQSEFfT1VUUFVUOworICAgICAgfQogICAgIH0KLSAgICBDR0Zsb2F0IHdpZHRoCT0gKENHRmxvYXQpIGJpdG1hcC0+R2V0V2lkdGgoKTsKLSAgICBDR0Zsb2F0IGhlaWdodAk9IChDR0Zsb2F0KSBiaXRtYXAtPkdldEhlaWdodCgpOwotICAgIGlmICh3aWR0aCArIHB0LnggPiBfd2lkdGgpIHsKLSAgICAgICAgd2lkdGggLT0gKHdpZHRoICsgcHQueCAtIF93aWR0aCk7Ci0gICAgfQotICAgIGlmIChoZWlnaHQgKyBwdC55ID4gX2hlaWdodCkgewotICAgICAgICBoZWlnaHQgLT0gKGhlaWdodCArIHB0LnkgLSBfaGVpZ2h0KTsKLSAgICB9Ci0gICAgQ0dJbWFnZVJlZiBzdWJJbWFnZSA9IENHSW1hZ2VDcmVhdGVXaXRoSW1hZ2VJblJlY3QoaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENHUmVjdE1ha2UocHQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdC55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCkpOwotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gY3JlYXRlQ29udGV4dFdpdGhCaXRtYXAoYml0bWFwKTsKLSAgICBDR1JlY3QgcmVjdCA9IENHQ29udGV4dEdldENsaXBCb3VuZGluZ0JveChjb250ZXh0KTsKLSAgICBDR0NvbnRleHRDbGVhclJlY3QoY29udGV4dCwgcmVjdCk7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKGNvbnRleHQsIHJlY3QsIHN1YkltYWdlKTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOwotICAgIENHSW1hZ2VSZWxlYXNlKHN1YkltYWdlKTsKICAgICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7Ci0gICAgaWYgKGJpdG1hcC0+SGFzQWxwaGEoKSkgewotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBiaXRtYXAtPkdldEhlaWdodCgpOyByb3cgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHBTY2FubGluZSA9ICh1aW50OF90KiliaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBiaXRtYXAtPkdldFdpZHRoKCk7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGlmIChwU2NhbmxpbmVbM10gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9IChwU2NhbmxpbmVbMF0gKiAyNTUuZiAvIHBTY2FubGluZVszXSArIC41Zik7Ci0gICAgICAgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IChwU2NhbmxpbmVbMV0gKiAyNTUuZiAvIHBTY2FubGluZVszXSArIC41Zik7Ci0gICAgICAgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IChwU2NhbmxpbmVbMl0gKiAyNTUuZiAvIHBTY2FubGluZVszXSArIC41Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBTY2FubGluZSArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworICB9CisgIENHQWZmaW5lVHJhbnNmb3JtIGN0bSA9IENHQ29udGV4dEdldENUTShfY29udGV4dCk7CisgIENHQ29udGV4dFNhdmVHU3RhdGUoX2NvbnRleHQpOworICBtX3NhdmVDb3VudCsrOworICBpZiAoY3RtLmQgPj0gMCkgeworICAgIENHRmxvYXQgb2Zmc2V0X3gsIG9mZnNldF95OworICAgIG9mZnNldF94ID0gY3RtLnR4OworICAgIG9mZnNldF95ID0gY3RtLnR5OworICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShfY29udGV4dCwgLW9mZnNldF94LCAtb2Zmc2V0X3kpOworICAgIENHQ29udGV4dENvbmNhdENUTShfY29udGV4dCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKDEsIDAsIDAsIC0xLCBvZmZzZXRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaGVpZ2h0ICsgb2Zmc2V0X3kpKTsKKyAgfQorICBfZm94aXREZXZpY2UyVXNlciA9IENHQWZmaW5lVHJhbnNmb3JtSWRlbnRpdHk7CisgIF91c2VyMkZveGl0RGV2aWNlID0gQ0dBZmZpbmVUcmFuc2Zvcm1JbnZlcnQoX2ZveGl0RGV2aWNlMlVzZXIpOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogICAgICBwQml0bWFwLAotICAgICAgICBGWF9BUkdCICAgICAgICAgICAgICAgICAgICAgYXJnYiwKLSAgICAgICAgY29uc3QgRlhfUkVDVCogICAgICAgICAgICAgIHNyY1JlY3QsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2xlZnQsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3RvcCwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kVHlwZSwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhRmxhZyAgICAgICAsCi0gICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBpY2NUcmFuc2Zvcm0gICAgKQotewotICAgIFNhdmVTdGF0ZSgpOwotICAgIENHRmxvYXQgc3JjX2xlZnQsIHNyY190b3AsIHNyY193aWR0aCwgc3JjX2hlaWdodDsKLSAgICBpZiAoc3JjUmVjdCkgewotICAgICAgICBzcmNfbGVmdCA9IHNyY1JlY3QtPmxlZnQ7Ci0gICAgICAgIHNyY190b3AgPSBzcmNSZWN0LT50b3A7Ci0gICAgICAgIHNyY193aWR0aCA9IHNyY1JlY3QtPldpZHRoKCk7Ci0gICAgICAgIHNyY19oZWlnaHQgPSBzcmNSZWN0LT5IZWlnaHQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzcmNfbGVmdCA9IHNyY190b3AgPSAwOwotICAgICAgICBzcmNfd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwotICAgICAgICBzcmNfaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CitDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjp+Q0ZYX1F1YXJ0ekRldmljZURyaXZlcigpIHsKKyAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShfY29udGV4dCk7CisgIG1fc2F2ZUNvdW50LS07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9zYXZlQ291bnQ7ICsraSkgeworICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoX2NvbnRleHQpOworICB9CisgIGlmIChfY29udGV4dCkgeworICAgIENHQ29udGV4dFJlbGVhc2UoX2NvbnRleHQpOworICB9Cit9CitpbnQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc0lEKSB7CisgIHN3aXRjaCAoY2Fwc0lEKSB7CisgICAgY2FzZSBGWERDX0RFVklDRV9DTEFTUzogeworICAgICAgcmV0dXJuIF9kZXZpY2VDbGFzczsKICAgICB9Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gY3RtID0gQ0dDb250ZXh0R2V0Q1RNKF9jb250ZXh0KTsKLSAgICBDR0Zsb2F0IHNjYWxlX3ggPSBGWFNZU19mYWJzKGN0bS5hKTsKLSAgICBDR0Zsb2F0IHNjYWxlX3kgPSBGWFNZU19mYWJzKGN0bS5kKTsKLSAgICBzcmNfbGVmdCAvPSBzY2FsZV94OwotICAgIHNyY190b3AgLz0gc2NhbGVfeTsKLSAgICBzcmNfd2lkdGggLz0gc2NhbGVfeDsKLSAgICBzcmNfaGVpZ2h0IC89IHNjYWxlX3k7Ci0gICAgQ0dSZWN0IHJlY3RfZnggPSBDR1JlY3RNYWtlKGRlc3RfbGVmdCwgZGVzdF90b3AsIHNyY193aWR0aCwgc3JjX2hlaWdodCk7Ci0gICAgQ0dSZWN0IHJlY3RfdXNyID0gQ0dSZWN0QXBwbHlBZmZpbmVUcmFuc2Zvcm0ocmVjdF9meCwgX2ZveGl0RGV2aWNlMlVzZXIpOwotICAgIENHQ29udGV4dEJlZ2luUGF0aChfY29udGV4dCk7Ci0gICAgQ0dDb250ZXh0QWRkUmVjdChfY29udGV4dCwgcmVjdF91c3IpOworICAgIGNhc2UgRlhEQ19QSVhFTF9XSURUSDogeworICAgICAgcmV0dXJuIF93aWR0aDsKKyAgICB9CisgICAgY2FzZSBGWERDX1BJWEVMX0hFSUdIVDogeworICAgICAgcmV0dXJuIF9oZWlnaHQ7CisgICAgfQorICAgIGNhc2UgRlhEQ19CSVRTX1BJWEVMOiB7CisgICAgICByZXR1cm4gMzI7CisgICAgfQorICAgIGNhc2UgRlhEQ19SRU5ERVJfQ0FQUzogeworICAgICAgcmV0dXJuIF9yZW5kZXJDYXBzOworICAgIH0KKyAgICBkZWZhdWx0OiB7IHJldHVybiAwOyB9CisgIH0KK30KK0NGWF9NYXRyaXggQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0Q1RNKCkgY29uc3QgeworICBDR0FmZmluZVRyYW5zZm9ybSBjdG0gPSBDR0NvbnRleHRHZXRDVE0oX2NvbnRleHQpOworICByZXR1cm4gQ0ZYX01hdHJpeChjdG0uYSwgY3RtLmIsIGN0bS5jLCBjdG0uZCwgY3RtLnR4LCBjdG0udHkpOworfQordm9pZCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTYXZlU3RhdGUoKSB7CisgIENHQ29udGV4dFNhdmVHU3RhdGUoX2NvbnRleHQpOworICBtX3NhdmVDb3VudCsrOworfQordm9pZCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBpc0tlZXBTYXZlZCkgeworICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKF9jb250ZXh0KTsKKyAgaWYgKGlzS2VlcFNhdmVkKSB7CisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShfY29udGV4dCk7CisgIH0gZWxzZSB7CisgICAgbV9zYXZlQ291bnQtLTsKKyAgfQorfQorRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsTW9kZSkgeworICBTYXZlU3RhdGUoKTsKKyAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtSWRlbnRpdHk7CisgIGlmIChtYXRyaXgpIHsKKyAgICBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKG1hdHJpeC0+R2V0QSgpLCBtYXRyaXgtPkdldEIoKSwgbWF0cml4LT5HZXRDKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgtPkdldEQoKSwgbWF0cml4LT5HZXRFKCksIG1hdHJpeC0+R2V0RigpKTsKKyAgfQorICBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQobSwgX2ZveGl0RGV2aWNlMlVzZXIpOworICBDR0NvbnRleHRDb25jYXRDVE0oX2NvbnRleHQsIG0pOworICBzZXRQYXRoVG9Db250ZXh0KHBhdGhEYXRhKTsKKyAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgaWYgKChmaWxsTW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HKSB7CiAgICAgQ0dDb250ZXh0Q2xpcChfY29udGV4dCk7Ci0gICAgcmVjdF91c3Iuc2l6ZSA9IENHU2l6ZU1ha2UocEJpdG1hcC0+R2V0V2lkdGgoKSAvIHNjYWxlX3gsIHBCaXRtYXAtPkdldEhlaWdodCgpIC8gc2NhbGVfeSk7Ci0gICAgcmVjdF91c3IgPSBDR1JlY3RPZmZzZXQocmVjdF91c3IsIC1zcmNfbGVmdCwgLXNyY190b3ApOwotICAgIENHX1NldEltYWdlVHJhbnNmb3JtKGRlc3RfbGVmdCwgZGVzdF90b3AsIHNyY193aWR0aCwgc3JjX2hlaWdodCwgJnJlY3RfdXNyKTsKLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAxID0gTlVMTDsKLSAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkpIHsKLSAgICAgICAgICAgIHBCaXRtYXAxID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgewotICAgICAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBDR0RhdGFQcm92aWRlclJlZiBwQml0bWFwUHJvdmlkZXIgPSBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRCdWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcDEtPkdldFBpdGNoKCkgKiBwQml0bWFwMS0+R2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICBDR0NvbG9yU3BhY2VSZWYgcENvbG9yU3BhY2UgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VHcmF5KCk7Ci0gICAgICAgIENHQml0bWFwSW5mbyBiaXRtYXBJbmZvID0ga0NHSW1hZ2VBbHBoYU5vbmUgfCBrQ0dCaXRtYXBCeXRlT3JkZXJEZWZhdWx0OwotICAgICAgICBDR0ltYWdlUmVmIHBJbWFnZSA9IENHSW1hZ2VDcmVhdGUocEJpdG1hcDEtPkdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0QlBQKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0QlBQKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0UGl0Y2goKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2xvclNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXBQcm92aWRlciwgTlVMTCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDR1JlbmRlcmluZ0ludGVudERlZmF1bHQpOwotICAgICAgICBDR0NvbnRleHRDbGlwVG9NYXNrKF9jb250ZXh0LCByZWN0X3VzciwgcEltYWdlKTsKLSAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKF9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX1IoYXJnYikgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9HKGFyZ2IpIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfQihhcmdiKSAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0EoYXJnYikgLyAyNTUuZik7Ci0gICAgICAgIENHQ29udGV4dEZpbGxSZWN0KF9jb250ZXh0LCByZWN0X3Vzcik7Ci0gICAgICAgIENHSW1hZ2VSZWxlYXNlKHBJbWFnZSk7Ci0gICAgICAgIENHQ29sb3JTcGFjZVJlbGVhc2UocENvbG9yU3BhY2UpOwotICAgICAgICBDR0RhdGFQcm92aWRlclJlbGVhc2UocEJpdG1hcFByb3ZpZGVyKTsKLSAgICAgICAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQml0bWFwMTsKLSAgICAgICAgfQotICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBDR0NvbnRleHRFT0NsaXAoX2NvbnRleHQpOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfRkxPQVQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6Z2V0TGluZVdpZHRoKAorICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogZ3JhcGhTdGF0ZSwKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBjdG0pIHsKKyAgRlhfRkxPQVQgbGluZVdpZHRoID0gZ3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGg7CisgIGlmIChncmFwaFN0YXRlLT5tX0xpbmVXaWR0aCA8PSAwLmYpIHsKKyAgICBDR1NpemUgc2l6ZTsKKyAgICBzaXplLndpZHRoID0gMTsKKyAgICBzaXplLmhlaWdodCA9IDE7CisgICAgQ0dTaXplIHRlbXAgPSBDR1NpemVBcHBseUFmZmluZVRyYW5zZm9ybShzaXplLCBjdG0pOworICAgIENHRmxvYXQgeCA9IDEgLyB0ZW1wLndpZHRoOworICAgIENHRmxvYXQgeSA9IDEgLyB0ZW1wLmhlaWdodDsKKyAgICBsaW5lV2lkdGggPSB4ID4geSA/IHggOiB5OworICB9CisgIHJldHVybiBsaW5lV2lkdGg7Cit9CitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZSgKKyAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBhdGhEYXRhLAorICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCwKKyAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIGdyYXBoU3RhdGUpIHsKKyAgU2F2ZVN0YXRlKCk7CisgIENHQWZmaW5lVHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50aXR5OworICBpZiAobWF0cml4KSB7CisgICAgbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZShtYXRyaXgtPkdldEEoKSwgbWF0cml4LT5HZXRCKCksIG1hdHJpeC0+R2V0QygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LT5HZXREKCksIG1hdHJpeC0+R2V0RSgpLCBtYXRyaXgtPkdldEYoKSk7CisgIH0KKyAgbSA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG0sIF9mb3hpdERldmljZTJVc2VyKTsKKyAgQ0dDb250ZXh0Q29uY2F0Q1RNKF9jb250ZXh0LCBtKTsKKyAgRlhfRkxPQVQgbGluZVdpZHRoID0gZ2V0TGluZVdpZHRoKGdyYXBoU3RhdGUsIG0pOworICBzZXRTdHJva2VJbmZvKGdyYXBoU3RhdGUsIDB4RkYwMDAwMDAsIGxpbmVXaWR0aCk7CisgIHNldFBhdGhUb0NvbnRleHQocGF0aERhdGEpOworICBDR0NvbnRleHRSZXBsYWNlUGF0aFdpdGhTdHJva2VkUGF0aChfY29udGV4dCk7CisgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgIENHQ29udGV4dENsaXAoX2NvbnRleHQpOworICByZXR1cm4gVFJVRTsKK30KK3N0YXRpYyBDR0JsZW5kTW9kZSBHZXRDR0JsZW5kTW9kZShpbnQgYmxlbmRfdHlwZSkgeworICBDR0JsZW5kTW9kZSBtb2RlID0ga0NHQmxlbmRNb2RlTm9ybWFsOworICBzd2l0Y2ggKGJsZW5kX3R5cGUpIHsKKyAgICBjYXNlIEZYRElCX0JMRU5EX05PUk1BTDoKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVOb3JtYWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX01VTFRJUExZOgorICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZU11bHRpcGx5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9TQ1JFRU46CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlU2NyZWVuOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9PVkVSTEFZOgorICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZU92ZXJsYXk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0RBUktFTjoKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVEYXJrZW47CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0xJR0hURU46CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlTGlnaHRlbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQkxFTkRfQ09MT1JET0RHRToKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVDb2xvckRvZGdlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUkJVUk46CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlQ29sb3JCdXJuOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9IQVJETElHSFQ6CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlSGFyZExpZ2h0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9TT0ZUTElHSFQ6CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlU29mdExpZ2h0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9ESUZGRVJFTkNFOgorICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZURpZmZlcmVuY2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0VYQ0xVU0lPTjoKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVFeGNsdXNpb247CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0hVRToKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVIdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX1NBVFVSQVRJT046CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlU2F0dXJhdGlvbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQkxFTkRfQ09MT1I6CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlQ29sb3I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0xVTUlOT1NJVFk6CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlTHVtaW5vc2l0eTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlTm9ybWFsOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG1vZGU7Cit9CitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBncmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsQXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3Ryb2tlQXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgU2F2ZVN0YXRlKCk7CisgIENHQmxlbmRNb2RlIG1vZGUgPSBHZXRDR0JsZW5kTW9kZShibGVuZF90eXBlKTsKKyAgaWYgKG1vZGUgIT0ga0NHQmxlbmRNb2RlTm9ybWFsKSB7CisgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKF9jb250ZXh0LCBtb2RlKTsKKyAgfQorICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKKyAgaWYgKG1hdHJpeCkgeworICAgIG0gPSBDR0FmZmluZVRyYW5zZm9ybU1ha2UobWF0cml4LT5HZXRBKCksIG1hdHJpeC0+R2V0QigpLCBtYXRyaXgtPkdldEMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+R2V0RCgpLCBtYXRyaXgtPkdldEUoKSwgbWF0cml4LT5HZXRGKCkpOworICB9CisgIG0gPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdChtLCBfZm94aXREZXZpY2UyVXNlcik7CisgIENHQ29udGV4dENvbmNhdENUTShfY29udGV4dCwgbSk7CisgIGludCBwYXRoTW9kZSA9IDA7CisgIGlmIChncmFwaFN0YXRlICYmIHN0cm9rZUFyZ2IpIHsKKyAgICBDR0NvbnRleHRTZXRNaXRlckxpbWl0KF9jb250ZXh0LCBncmFwaFN0YXRlLT5tX01pdGVyTGltaXQpOworICAgIEZYX0ZMT0FUIGxpbmVXaWR0aCA9IGdldExpbmVXaWR0aChncmFwaFN0YXRlLCBtKTsKKyAgICBzZXRTdHJva2VJbmZvKGdyYXBoU3RhdGUsIHN0cm9rZUFyZ2IsIGxpbmVXaWR0aCk7CisgICAgcGF0aE1vZGUgfD0gNDsKKyAgfQorICBpZiAoZmlsbE1vZGUgJiYgZmlsbEFyZ2IpIHsKKyAgICBzZXRGaWxsSW5mbyhmaWxsQXJnYik7CisgICAgaWYgKChmaWxsTW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HKSB7CisgICAgICBwYXRoTW9kZSB8PSAxOworICAgIH0gZWxzZSBpZiAoKGZpbGxNb2RlICYgMykgPT0gRlhGSUxMX0FMVEVSTkFURSkgeworICAgICAgcGF0aE1vZGUgfD0gMjsKICAgICB9Ci0gICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpIDwgMzIpIHsKLSAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiMzIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwQml0bWFwLT5HZXRCdWZmZXIoKSkgewotICAgICAgICAgICAgcEJpdG1hcDEgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOworICB9CisgIHNldFBhdGhUb0NvbnRleHQocGF0aERhdGEpOworICBpZiAoZmlsbE1vZGUgJiBGWEZJTExfRlVMTENPVkVSKSB7CisgICAgQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzKF9jb250ZXh0LCBmYWxzZSk7CisgIH0KKyAgaWYgKHBhdGhNb2RlID09IDQpIHsKKyAgICBDR0NvbnRleHRTdHJva2VQYXRoKF9jb250ZXh0KTsKKyAgfSBlbHNlIGlmIChwYXRoTW9kZSA9PSAxKSB7CisgICAgQ0dDb250ZXh0RmlsbFBhdGgoX2NvbnRleHQpOworICB9IGVsc2UgaWYgKHBhdGhNb2RlID09IDIpIHsKKyAgICBDR0NvbnRleHRFT0ZpbGxQYXRoKF9jb250ZXh0KTsKKyAgfSBlbHNlIGlmIChwYXRoTW9kZSA9PSA1KSB7CisgICAgQ0dDb250ZXh0RHJhd1BhdGgoX2NvbnRleHQsIGtDR1BhdGhGaWxsU3Ryb2tlKTsKKyAgfSBlbHNlIGlmIChwYXRoTW9kZSA9PSA2KSB7CisgICAgQ0dDb250ZXh0RHJhd1BhdGgoX2NvbnRleHQsIGtDR1BhdGhFT0ZpbGxTdHJva2UpOworICB9CisgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxBcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBpY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIENHQmxlbmRNb2RlIG1vZGUgPSBHZXRDR0JsZW5kTW9kZShibGVuZF90eXBlKTsKKyAgaWYgKG1vZGUgIT0ga0NHQmxlbmRNb2RlTm9ybWFsKSB7CisgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKF9jb250ZXh0LCBtb2RlKTsKKyAgfQorICBDR1JlY3QgcmVjdF9meCA9CisgICAgICBDR1JlY3RNYWtlKHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+V2lkdGgoKSwgcmVjdC0+SGVpZ2h0KCkpOworICBDR1JlY3QgcmVjdF91c3IgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyZWN0X2Z4LCBfZm94aXREZXZpY2UyVXNlcik7CisgIGludDMyX3QgYSwgciwgZywgYjsKKyAgQXJnYkRlY29kZShmaWxsQXJnYiwgYSwgciwgZywgYik7CisgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihfY29udGV4dCwgciAvIDI1NS5mLCBnIC8gMjU1LmYsIGIgLyAyNTUuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgLyAyNTUuZik7CisgIENHQ29udGV4dEZpbGxSZWN0KF9jb250ZXh0LCByZWN0X3Vzcik7CisgIGlmIChtb2RlICE9IGtDR0JsZW5kTW9kZU5vcm1hbCkgeworICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShfY29udGV4dCwga0NHQmxlbmRNb2RlTm9ybWFsKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogaWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIENHQmxlbmRNb2RlIG1vZGUgPSBHZXRDR0JsZW5kTW9kZShibGVuZF90eXBlKTsKKyAgaWYgKG1vZGUgIT0ga0NHQmxlbmRNb2RlTm9ybWFsKSB7CisgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKF9jb250ZXh0LCBtb2RlKTsKKyAgfQorICBDR1BvaW50IHB0ID0KKyAgICAgIENHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybShDR1BvaW50TWFrZSh4MSwgeTEpLCBfZm94aXREZXZpY2UyVXNlcik7CisgIHgxID0gcHQueDsKKyAgeTEgPSBwdC55OworICBwdCA9IENHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybShDR1BvaW50TWFrZSh4MiwgeTIpLCBfZm94aXREZXZpY2UyVXNlcik7CisgIHgyID0gcHQueDsKKyAgeTIgPSBwdC55OworICBpbnQzMl90IGEsIHIsIGcsIGI7CisgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7CisgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKF9jb250ZXh0LCByIC8gMjU1LmYsIGcgLyAyNTUuZiwgYiAvIDI1NS5mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIC8gMjU1LmYpOworICBDR0NvbnRleHRNb3ZlVG9Qb2ludChfY29udGV4dCwgeDEsIHkxKTsKKyAgQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQoX2NvbnRleHQsIHgyLCB5Mik7CisgIENHQ29udGV4dFN0cm9rZVBhdGgoX2NvbnRleHQpOworICBpZiAobW9kZSAhPSBrQ0dCbGVuZE1vZGVOb3JtYWwpIHsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoX2NvbnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcmVjdCkgeworICBDR1JlY3QgciA9IENHQ29udGV4dEdldENsaXBCb3VuZGluZ0JveChfY29udGV4dCk7CisgIHIgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyLCBfdXNlcjJGb3hpdERldmljZSk7CisgIHJlY3QtPmxlZnQgPSBGWFNZU19mbG9vcihyLm9yaWdpbi54KTsKKyAgcmVjdC0+dG9wID0gRlhTWVNfZmxvb3Ioci5vcmlnaW4ueSk7CisgIHJlY3QtPnJpZ2h0ID0gRlhTWVNfY2VpbChyLm9yaWdpbi54ICsgci5zaXplLndpZHRoKTsKKyAgcmVjdC0+Ym90dG9tID0gRlhTWVNfY2VpbChyLm9yaWdpbi55ICsgci5zaXplLmhlaWdodCk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJERWRnZSkgeworICBpZiAoRlhEQ19QUklOVEVSID09IF9kZXZpY2VDbGFzcykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoYml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghKF9yZW5kZXJDYXBzIHwgRlhSQ19HRVRfQklUUykpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0dQb2ludCBwdCA9IENHUG9pbnRNYWtlKGxlZnQsIHRvcCk7CisgIHB0ID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtKHB0LCBfZm94aXREZXZpY2UyVXNlcik7CisgIENHQWZmaW5lVHJhbnNmb3JtIGN0bSA9IENHQ29udGV4dEdldENUTShfY29udGV4dCk7CisgIHB0LnggKj0gRlhTWVNfZmFicyhjdG0uYSk7CisgIHB0LnkgKj0gRlhTWVNfZmFicyhjdG0uZCk7CisgIENHSW1hZ2VSZWYgaW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShfY29udGV4dCk7CisgIGlmIChOVUxMID09IGltYWdlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENHRmxvYXQgd2lkdGggPSAoQ0dGbG9hdCliaXRtYXAtPkdldFdpZHRoKCk7CisgIENHRmxvYXQgaGVpZ2h0ID0gKENHRmxvYXQpYml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgaWYgKHdpZHRoICsgcHQueCA+IF93aWR0aCkgeworICAgIHdpZHRoIC09ICh3aWR0aCArIHB0LnggLSBfd2lkdGgpOworICB9CisgIGlmIChoZWlnaHQgKyBwdC55ID4gX2hlaWdodCkgeworICAgIGhlaWdodCAtPSAoaGVpZ2h0ICsgcHQueSAtIF9oZWlnaHQpOworICB9CisgIENHSW1hZ2VSZWYgc3ViSW1hZ2UgPSBDR0ltYWdlQ3JlYXRlV2l0aEltYWdlSW5SZWN0KAorICAgICAgaW1hZ2UsIENHUmVjdE1ha2UocHQueCwgcHQueSwgd2lkdGgsIGhlaWdodCkpOworICBDR0NvbnRleHRSZWYgY29udGV4dCA9IGNyZWF0ZUNvbnRleHRXaXRoQml0bWFwKGJpdG1hcCk7CisgIENHUmVjdCByZWN0ID0gQ0dDb250ZXh0R2V0Q2xpcEJvdW5kaW5nQm94KGNvbnRleHQpOworICBDR0NvbnRleHRDbGVhclJlY3QoY29udGV4dCwgcmVjdCk7CisgIENHQ29udGV4dERyYXdJbWFnZShjb250ZXh0LCByZWN0LCBzdWJJbWFnZSk7CisgIENHQ29udGV4dFJlbGVhc2UoY29udGV4dCk7CisgIENHSW1hZ2VSZWxlYXNlKHN1YkltYWdlKTsKKyAgQ0dJbWFnZVJlbGVhc2UoaW1hZ2UpOworICBpZiAoYml0bWFwLT5IYXNBbHBoYSgpKSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgYml0bWFwLT5HZXRIZWlnaHQoKTsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIHBTY2FubGluZSA9ICh1aW50OF90KiliaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBiaXRtYXAtPkdldFdpZHRoKCk7IGNvbCsrKSB7CisgICAgICAgIGlmIChwU2NhbmxpbmVbM10gPiAwKSB7CisgICAgICAgICAgcFNjYW5saW5lWzBdID0gKHBTY2FubGluZVswXSAqIDI1NS5mIC8gcFNjYW5saW5lWzNdICsgLjVmKTsKKyAgICAgICAgICBwU2NhbmxpbmVbMV0gPSAocFNjYW5saW5lWzFdICogMjU1LmYgLyBwU2NhbmxpbmVbM10gKyAuNWYpOworICAgICAgICAgIHBTY2FubGluZVsyXSA9IChwU2NhbmxpbmVbMl0gKiAyNTUuZiAvIHBTY2FubGluZVszXSArIC41Zik7CiAgICAgICAgIH0KKyAgICAgICAgcFNjYW5saW5lICs9IDQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBpY2NUcmFuc2Zvcm0pIHsKKyAgU2F2ZVN0YXRlKCk7CisgIENHRmxvYXQgc3JjX2xlZnQsIHNyY190b3AsIHNyY193aWR0aCwgc3JjX2hlaWdodDsKKyAgaWYgKHNyY1JlY3QpIHsKKyAgICBzcmNfbGVmdCA9IHNyY1JlY3QtPmxlZnQ7CisgICAgc3JjX3RvcCA9IHNyY1JlY3QtPnRvcDsKKyAgICBzcmNfd2lkdGggPSBzcmNSZWN0LT5XaWR0aCgpOworICAgIHNyY19oZWlnaHQgPSBzcmNSZWN0LT5IZWlnaHQoKTsKKyAgfSBlbHNlIHsKKyAgICBzcmNfbGVmdCA9IHNyY190b3AgPSAwOworICAgIHNyY193aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CisgICAgc3JjX2hlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOworICB9CisgIENHQWZmaW5lVHJhbnNmb3JtIGN0bSA9IENHQ29udGV4dEdldENUTShfY29udGV4dCk7CisgIENHRmxvYXQgc2NhbGVfeCA9IEZYU1lTX2ZhYnMoY3RtLmEpOworICBDR0Zsb2F0IHNjYWxlX3kgPSBGWFNZU19mYWJzKGN0bS5kKTsKKyAgc3JjX2xlZnQgLz0gc2NhbGVfeDsKKyAgc3JjX3RvcCAvPSBzY2FsZV95OworICBzcmNfd2lkdGggLz0gc2NhbGVfeDsKKyAgc3JjX2hlaWdodCAvPSBzY2FsZV95OworICBDR1JlY3QgcmVjdF9meCA9IENHUmVjdE1ha2UoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0KTsKKyAgQ0dSZWN0IHJlY3RfdXNyID0gQ0dSZWN0QXBwbHlBZmZpbmVUcmFuc2Zvcm0ocmVjdF9meCwgX2ZveGl0RGV2aWNlMlVzZXIpOworICBDR0NvbnRleHRCZWdpblBhdGgoX2NvbnRleHQpOworICBDR0NvbnRleHRBZGRSZWN0KF9jb250ZXh0LCByZWN0X3Vzcik7CisgIENHQ29udGV4dENsaXAoX2NvbnRleHQpOworICByZWN0X3Vzci5zaXplID0KKyAgICAgIENHU2l6ZU1ha2UocEJpdG1hcC0+R2V0V2lkdGgoKSAvIHNjYWxlX3gsIHBCaXRtYXAtPkdldEhlaWdodCgpIC8gc2NhbGVfeSk7CisgIHJlY3RfdXNyID0gQ0dSZWN0T2Zmc2V0KHJlY3RfdXNyLCAtc3JjX2xlZnQsIC1zcmNfdG9wKTsKKyAgQ0dfU2V0SW1hZ2VUcmFuc2Zvcm0oZGVzdF9sZWZ0LCBkZXN0X3RvcCwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCAmcmVjdF91c3IpOworICBDRlhfRElCaXRtYXAqIHBCaXRtYXAxID0gTlVMTDsKKyAgaWYgKHBCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkpIHsKKyAgICAgIHBCaXRtYXAxID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDsKKyAgICB9IGVsc2UgeworICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwogICAgIH0KICAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgewotICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZiAocEJpdG1hcDEtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgaWYgKHBCaXRtYXAxID09IHBCaXRtYXApIHsKLSAgICAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKLSAgICAgICAgICAgIGlmICghcEJpdG1hcDEpIHsKLSAgICAgICAgICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwQml0bWFwMS0+R2V0SGVpZ2h0KCk7IHJvdyArKykgewotICAgICAgICAgICAgdWludDhfdCogcFNjYW5saW5lID0gKHVpbnQ4X3QqKXBCaXRtYXAxLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcEJpdG1hcDEtPkdldFdpZHRoKCk7IGNvbCArKykgewotICAgICAgICAgICAgICAgIHBTY2FubGluZVswXSA9ICh1aW50OF90KShwU2NhbmxpbmVbMF0gKiBwU2NhbmxpbmVbM10gLyAyNTUuZiArIC41Zik7Ci0gICAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gKHVpbnQ4X3QpKHBTY2FubGluZVsxXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKLSAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMl0gPSAodWludDhfdCkocFNjYW5saW5lWzJdICogcFNjYW5saW5lWzNdIC8gMjU1LmYgKyAuNWYpOwotICAgICAgICAgICAgICAgIHBTY2FubGluZSArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIENHQ29udGV4dFJlZiBjdHggPSBjcmVhdGVDb250ZXh0V2l0aEJpdG1hcChwQml0bWFwMSk7Ci0gICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKGN0eCk7Ci0gICAgaW50IGJsZW5kX21vZGUgPSBibGVuZFR5cGU7Ci0gICAgaWYgKEZYRElCX0JMRU5EX0hBUkRMSUdIVCA9PSBibGVuZFR5cGUpIHsKLSAgICAgICAgYmxlbmRfbW9kZSA9IGtDR0JsZW5kTW9kZVNvZnRMaWdodDsKLSAgICB9IGVsc2UgaWYgKEZYRElCX0JMRU5EX1NPRlRMSUdIVCA9PSBibGVuZFR5cGUpIHsKLSAgICAgICAgYmxlbmRfbW9kZSA9IGtDR0JsZW5kTW9kZUhhcmRMaWdodDsKLSAgICB9IGVsc2UgaWYgKGJsZW5kVHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUgJiYgYmxlbmRUeXBlIDw9IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkpIHsKLSAgICAgICAgYmxlbmRfbW9kZSA9IGJsZW5kVHlwZSAtIDk7Ci0gICAgfSBlbHNlIGlmIChibGVuZFR5cGUgPiBGWERJQl9CTEVORF9MVU1JTk9TSVRZIHx8IGJsZW5kVHlwZSA8IDApIHsKLSAgICAgICAgYmxlbmRfbW9kZSA9IGtDR0JsZW5kTW9kZU5vcm1hbDsKLSAgICB9Ci0gICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKF9jb250ZXh0LCAoQ0dCbGVuZE1vZGUpYmxlbmRfbW9kZSk7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKF9jb250ZXh0LCByZWN0X3VzciwgaW1hZ2UpOwotICAgIENHSW1hZ2VSZWxlYXNlKGltYWdlKTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKGN0eCk7CisgICAgQ0dEYXRhUHJvdmlkZXJSZWYgcEJpdG1hcFByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YSgKKyAgICAgICAgTlVMTCwgcEJpdG1hcDEtPkdldEJ1ZmZlcigpLAorICAgICAgICBwQml0bWFwMS0+R2V0UGl0Y2goKSAqIHBCaXRtYXAxLT5HZXRIZWlnaHQoKSwgTlVMTCk7CisgICAgQ0dDb2xvclNwYWNlUmVmIHBDb2xvclNwYWNlID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlR3JheSgpOworICAgIENHQml0bWFwSW5mbyBiaXRtYXBJbmZvID0ga0NHSW1hZ2VBbHBoYU5vbmUgfCBrQ0dCaXRtYXBCeXRlT3JkZXJEZWZhdWx0OworICAgIENHSW1hZ2VSZWYgcEltYWdlID0gQ0dJbWFnZUNyZWF0ZSgKKyAgICAgICAgcEJpdG1hcDEtPkdldFdpZHRoKCksIHBCaXRtYXAxLT5HZXRIZWlnaHQoKSwgcEJpdG1hcDEtPkdldEJQUCgpLAorICAgICAgICBwQml0bWFwMS0+R2V0QlBQKCksIHBCaXRtYXAxLT5HZXRQaXRjaCgpLCBwQ29sb3JTcGFjZSwgYml0bWFwSW5mbywKKyAgICAgICAgcEJpdG1hcFByb3ZpZGVyLCBOVUxMLCB0cnVlLCBrQ0dSZW5kZXJpbmdJbnRlbnREZWZhdWx0KTsKKyAgICBDR0NvbnRleHRDbGlwVG9NYXNrKF9jb250ZXh0LCByZWN0X3VzciwgcEltYWdlKTsKKyAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX2NvbnRleHQsIEZYQVJHQl9SKGFyZ2IpIC8gMjU1LmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9HKGFyZ2IpIC8gMjU1LmYsIEZYQVJHQl9CKGFyZ2IpIC8gMjU1LmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9BKGFyZ2IpIC8gMjU1LmYpOworICAgIENHQ29udGV4dEZpbGxSZWN0KF9jb250ZXh0LCByZWN0X3Vzcik7CisgICAgQ0dJbWFnZVJlbGVhc2UocEltYWdlKTsKKyAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKHBDb2xvclNwYWNlKTsKKyAgICBDR0RhdGFQcm92aWRlclJlbGVhc2UocEJpdG1hcFByb3ZpZGVyKTsKICAgICBpZiAocEJpdG1hcDEgIT0gcEJpdG1hcCkgewotICAgICAgICBkZWxldGUgcEJpdG1hcDE7CisgICAgICBkZWxldGUgcEJpdG1hcDE7CiAgICAgfQogICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogICAgICBwQml0bWFwLAotICAgICAgICBGWF9BUkdCICAgICAgICAgICAgICAgICAgICAgYXJnYiwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfbGVmdCwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfdG9wLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0LAotICAgICAgICBjb25zdCBGWF9SRUNUKiAgICAgICAgICAgICAgY2xpcFJlY3QsCi0gICAgICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhRmxhZwkgICAsCi0gICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBpY2NUcmFuc2Zvcm0gLAotICAgICAgICBpbnQJCQkJCQkJYmxlbmRfdHlwZSkKLXsKLSAgICBTYXZlU3RhdGUoKTsKLSAgICBpZiAoY2xpcFJlY3QpIHsKLSAgICAgICAgQ0dDb250ZXh0QmVnaW5QYXRoKF9jb250ZXh0KTsKLSAgICAgICAgQ0dSZWN0IHJlY3RfY2xpcCA9IENHUmVjdE1ha2UoY2xpcFJlY3QtPmxlZnQsIGNsaXBSZWN0LT50b3AsIGNsaXBSZWN0LT5XaWR0aCgpLCBjbGlwUmVjdC0+SGVpZ2h0KCkpOwotICAgICAgICByZWN0X2NsaXAgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyZWN0X2NsaXAsIF9mb3hpdERldmljZTJVc2VyKTsKLSAgICAgICAgQ0dDb250ZXh0QWRkUmVjdChfY29udGV4dCwgcmVjdF9jbGlwKTsKLSAgICAgICAgQ0dDb250ZXh0Q2xpcChfY29udGV4dCk7Ci0gICAgfQotICAgIENHUmVjdCByZWN0ID0gQ0dSZWN0TWFrZShkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7Ci0gICAgcmVjdCA9IENHUmVjdEFwcGx5QWZmaW5lVHJhbnNmb3JtKHJlY3QsIF9mb3hpdERldmljZTJVc2VyKTsKLSAgICBpZiAoRlhESUJfQklDVUJJQ19JTlRFUlBPTCA9PSBmbGFncykgewotICAgICAgICBDR0NvbnRleHRTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShfY29udGV4dCwga0NHSW50ZXJwb2xhdGlvbkhpZ2gpOwotICAgIH0gZWxzZSBpZiAoRlhESUJfRE9XTlNBTVBMRSA9PSBmbGFncykgewotICAgICAgICBDR0NvbnRleHRTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShfY29udGV4dCwga0NHSW50ZXJwb2xhdGlvbk5vbmUpOworICB9CisgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7CisgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiMzIpOworICB9IGVsc2UgeworICAgIGlmIChwQml0bWFwLT5HZXRCdWZmZXIoKSkgeworICAgICAgcEJpdG1hcDEgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIENHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5KF9jb250ZXh0LCBrQ0dJbnRlcnBvbGF0aW9uTWVkaXVtKTsKKyAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKICAgICB9Ci0gICAgQ0dfU2V0SW1hZ2VUcmFuc2Zvcm0oZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOwotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcDEgPSBOVUxMOwotICAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIGlmIChwQml0bWFwLT5HZXRCdWZmZXIoKSkgewotICAgICAgICAgICAgcEJpdG1hcDEgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChOVUxMID09IHBCaXRtYXAxKSB7Ci0gICAgICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIENHRGF0YVByb3ZpZGVyUmVmIHBCaXRtYXBQcm92aWRlciA9IENHRGF0YVByb3ZpZGVyQ3JlYXRlV2l0aERhdGEoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcDEtPkdldEJ1ZmZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0UGl0Y2goKSAqIHBCaXRtYXAxLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgIENHQ29sb3JTcGFjZVJlZiBwQ29sb3JTcGFjZSA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZUdyYXkoKTsKLSAgICAgICAgQ0dCaXRtYXBJbmZvIGJpdG1hcEluZm8gPSBrQ0dJbWFnZUFscGhhTm9uZSB8IGtDR0JpdG1hcEJ5dGVPcmRlckRlZmF1bHQ7Ci0gICAgICAgIENHSW1hZ2VSZWYgcEltYWdlID0gQ0dJbWFnZUNyZWF0ZShwQml0bWFwMS0+R2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRCUFAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRCUFAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRQaXRjaCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbG9yU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcFByb3ZpZGVyLCBOVUxMLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NHUmVuZGVyaW5nSW50ZW50RGVmYXVsdCk7Ci0gICAgICAgIENHQ29udGV4dENsaXBUb01hc2soX2NvbnRleHQsIHJlY3QsIHBJbWFnZSk7Ci0gICAgICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9SKGFyZ2IpIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfRyhhcmdiKSAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0IoYXJnYikgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9BKGFyZ2IpIC8gMjU1LmYpOwotICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChfY29udGV4dCwgcmVjdCk7Ci0gICAgICAgIENHSW1hZ2VSZWxlYXNlKHBJbWFnZSk7Ci0gICAgICAgIENHQ29sb3JTcGFjZVJlbGVhc2UocENvbG9yU3BhY2UpOwotICAgICAgICBDR0RhdGFQcm92aWRlclJlbGVhc2UocEJpdG1hcFByb3ZpZGVyKTsKLSAgICAgICAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQml0bWFwMTsKLSAgICAgICAgfQotICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpIDwgMzIpIHsKLSAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiMzIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwQml0bWFwLT5HZXRCdWZmZXIoKSkgewotICAgICAgICAgICAgcEJpdG1hcDEgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChOVUxMID09IHBCaXRtYXAxKSB7CisgIH0KKyAgaWYgKE5VTEwgPT0gcEJpdG1hcDEpIHsKKyAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocEJpdG1hcDEtPkhhc0FscGhhKCkpIHsKKyAgICBpZiAocEJpdG1hcDEgPT0gcEJpdG1hcCkgeworICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOworICAgICAgaWYgKCFwQml0bWFwMSkgewogICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwogICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CiAgICAgfQotICAgIGlmIChwQml0bWFwMS0+SGFzQWxwaGEoKSkgewotICAgICAgICBpZiAocEJpdG1hcDEgPT0gcEJpdG1hcCkgewotICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwotICAgICAgICAgICAgaWYgKCFwQml0bWFwMSkgewotICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHBCaXRtYXAxLT5HZXRIZWlnaHQoKTsgcm93ICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBwU2NhbmxpbmUgPSAodWludDhfdCopcEJpdG1hcDEtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwQml0bWFwMS0+R2V0V2lkdGgoKTsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gKHVpbnQ4X3QpKHBTY2FubGluZVswXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKLSAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSAodWludDhfdCkocFNjYW5saW5lWzFdICogcFNjYW5saW5lWzNdIC8gMjU1LmYgKyAuNWYpOwotICAgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9ICh1aW50OF90KShwU2NhbmxpbmVbMl0gKiBwU2NhbmxpbmVbM10gLyAyNTUuZiArIC41Zik7Ci0gICAgICAgICAgICAgICAgcFNjYW5saW5lICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwQml0bWFwMS0+R2V0SGVpZ2h0KCk7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBwU2NhbmxpbmUgPSAodWludDhfdCopcEJpdG1hcDEtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwQml0bWFwMS0+R2V0V2lkdGgoKTsgY29sKyspIHsKKyAgICAgICAgcFNjYW5saW5lWzBdID0gKHVpbnQ4X3QpKHBTY2FubGluZVswXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKKyAgICAgICAgcFNjYW5saW5lWzFdID0gKHVpbnQ4X3QpKHBTY2FubGluZVsxXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKKyAgICAgICAgcFNjYW5saW5lWzJdID0gKHVpbnQ4X3QpKHBTY2FubGluZVsyXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKKyAgICAgICAgcFNjYW5saW5lICs9IDQ7CisgICAgICB9CiAgICAgfQotICAgIENHQ29udGV4dFJlZiBjdHggPSBjcmVhdGVDb250ZXh0V2l0aEJpdG1hcChwQml0bWFwMSk7Ci0gICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKGN0eCk7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKF9jb250ZXh0LCByZWN0LCBpbWFnZSk7Ci0gICAgQ0dJbWFnZVJlbGVhc2UoaW1hZ2UpOwotICAgIENHQ29udGV4dFJlbGVhc2UoY3R4KTsKLSAgICBpZiAocEJpdG1hcDEgIT0gcEJpdG1hcCkgewotICAgICAgICBkZWxldGUgcEJpdG1hcDE7Ci0gICAgfQotICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQ0dDb250ZXh0UmVmIGN0eCA9IGNyZWF0ZUNvbnRleHRXaXRoQml0bWFwKHBCaXRtYXAxKTsKKyAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKGN0eCk7CisgIGludCBibGVuZF9tb2RlID0gYmxlbmRUeXBlOworICBpZiAoRlhESUJfQkxFTkRfSEFSRExJR0hUID09IGJsZW5kVHlwZSkgeworICAgIGJsZW5kX21vZGUgPSBrQ0dCbGVuZE1vZGVTb2Z0TGlnaHQ7CisgIH0gZWxzZSBpZiAoRlhESUJfQkxFTkRfU09GVExJR0hUID09IGJsZW5kVHlwZSkgeworICAgIGJsZW5kX21vZGUgPSBrQ0dCbGVuZE1vZGVIYXJkTGlnaHQ7CisgIH0gZWxzZSBpZiAoYmxlbmRUeXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSAmJgorICAgICAgICAgICAgIGJsZW5kVHlwZSA8PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZKSB7CisgICAgYmxlbmRfbW9kZSA9IGJsZW5kVHlwZSAtIDk7CisgIH0gZWxzZSBpZiAoYmxlbmRUeXBlID4gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSB8fCBibGVuZFR5cGUgPCAwKSB7CisgICAgYmxlbmRfbW9kZSA9IGtDR0JsZW5kTW9kZU5vcm1hbDsKKyAgfQorICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoX2NvbnRleHQsIChDR0JsZW5kTW9kZSlibGVuZF9tb2RlKTsKKyAgQ0dDb250ZXh0RHJhd0ltYWdlKF9jb250ZXh0LCByZWN0X3VzciwgaW1hZ2UpOworICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7CisgIENHQ29udGV4dFJlbGVhc2UoY3R4KTsKKyAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKKyAgICBkZWxldGUgcEJpdG1hcDE7CisgIH0KKyAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkNHX0RyYXdHbHlwUnVuKGludCAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKLSAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqICAgICAgcENoYXJQb3MsCi0gICAgICAgIENGWF9Gb250KiAgICAgICAgICAgICAgICAgIHBGb250LAotICAgICAgICBDRlhfRm9udENhY2hlKiAgICAgICAgICAgICBwQ2FjaGUsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqICAgIHBHbHlwaE1hdHJpeCwKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogICAgcE9iamVjdDJEZXZpY2UsCi0gICAgICAgIEZYX0ZMT0FUICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSwKLSAgICAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgYXJnYiwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywKLSAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAobkNoYXJzID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENRdWFydHoyRCYgcXVhcnR6MmQgPSAoKENBcHBsZVBsYXRmb3JtICopIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOwotICAgIGlmICghcEZvbnQtPm1fcFBsYXRmb3JtRm9udCkgewotICAgICAgICBpZiAocEZvbnQtPkdldFBzTmFtZSgpID09IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkRGSGVpU3RkLVc1IikpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBwRm9udC0+bV9wUGxhdGZvcm1Gb250ID0gcXVhcnR6MmQuQ3JlYXRlRm9udChwRm9udC0+bV9wRm9udERhdGEsIHBGb250LT5tX2R3U2l6ZSk7Ci0gICAgICAgIGlmIChOVUxMID09IHBGb250LT5tX3BQbGF0Zm9ybUZvbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfRml4ZWRCdWZHcm93PEZYX1dPUkQsIDMyPiBnbHlwaF9pbmRpY2VzKG5DaGFycyk7Ci0gICAgQ0ZYX0ZpeGVkQnVmR3JvdzxDR1BvaW50LCAzMj4gZ2x5cGhfcG9zaXRpb25zKG5DaGFycyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkrKyApIHsKLSAgICAgICAgZ2x5cGhfaW5kaWNlc1tpXSA9IHBDaGFyUG9zW2ldLm1fRXh0R0lEOwotICAgICAgICBnbHlwaF9wb3NpdGlvbnNbaV0ueCA9IHBDaGFyUG9zW2ldLm1fT3JpZ2luWDsKLSAgICAgICAgZ2x5cGhfcG9zaXRpb25zW2ldLnkgPSBwQ2hhclBvc1tpXS5tX09yaWdpblk7Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggdGV4dF9tYXRyaXg7Ci0gICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgIHRleHRfbWF0cml4LkNvbmNhdCgqcE9iamVjdDJEZXZpY2UpOwotICAgIH0KLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXhfY2cgPSBDR0FmZmluZVRyYW5zZm9ybU1ha2UodGV4dF9tYXRyaXguYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X21hdHJpeC5iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfbWF0cml4LmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9tYXRyaXguZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X21hdHJpeC5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfbWF0cml4LmYpOwotICAgIG1hdHJpeF9jZyA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeF9jZywgX2ZveGl0RGV2aWNlMlVzZXIpOwotICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoX2NvbnRleHQsIG1hdHJpeF9jZyk7Ci0gICAgQ0dDb250ZXh0U2V0Rm9udChfY29udGV4dCwgKENHRm9udFJlZilwRm9udC0+bV9wUGxhdGZvcm1Gb250KTsKLSAgICBDR0NvbnRleHRTZXRGb250U2l6ZShfY29udGV4dCwgRlhTWVNfZmFicyhmb250X3NpemUpKTsKLSAgICBpbnQzMl90IGEsIHIsIGcsIGI7Ci0gICAgQXJnYkRlY29kZShhcmdiLCBhLCByLCBnLCBiKTsKLSAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgLyAyNTUuZik7Ci0gICAgU2F2ZVN0YXRlKCk7Ci0gICAgaWYgKHBHbHlwaE1hdHJpeCkgewotICAgICAgICBDR1BvaW50IG9yaWdpbiA9IENHUG9pbnRNYWtlKCBnbHlwaF9wb3NpdGlvbnNbMF0ueCwgIGdseXBoX3Bvc2l0aW9uc1swXS55KTsKLSAgICAgICAgb3JpZ2luID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtKG9yaWdpbiwgbWF0cml4X2NnKTsKLSAgICAgICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKF9jb250ZXh0LCBvcmlnaW4ueCwgb3JpZ2luLnkpOwotICAgICAgICBDR0FmZmluZVRyYW5zZm9ybSBnbHlwaF9tYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybU1ha2UocEdseXBoTWF0cml4LT5hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR2x5cGhNYXRyaXgtPmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHbHlwaE1hdHJpeC0+YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdseXBoTWF0cml4LT5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR2x5cGhNYXRyaXgtPmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHbHlwaE1hdHJpeC0+Zik7Ci0gICAgICAgIGlmIChfZm94aXREZXZpY2UyVXNlci5kIDwgMCkgewotICAgICAgICAgICAgZ2x5cGhfbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1JbnZlcnQoZ2x5cGhfbWF0cml4KTsKLSAgICAgICAgfQotICAgICAgICBDR0NvbnRleHRDb25jYXRDVE0oX2NvbnRleHQsIGdseXBoX21hdHJpeCk7Ci0gICAgICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShfY29udGV4dCwgLW9yaWdpbi54LCAtb3JpZ2luLnkpOwotICAgIH0KLSAgICBDR0NvbnRleHRTaG93R2x5cGhzQXRQb3NpdGlvbnMoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDR0dseXBoKilnbHlwaF9pbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9wb3NpdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycyk7Ci0gICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50ICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKLSAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqICAgIHBDaGFyUG9zLAotICAgICAgICBDRlhfRm9udCogICAgICAgICAgICAgICAgcEZvbnQsCi0gICAgICAgIENGWF9Gb250Q2FjaGUqICAgICAgICAgICBwQ2FjaGUsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqICBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgRlhfRkxPQVQgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSwKLSAgICAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgIGNvbG9yLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZyAgICAgICAsCi0gICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmIChOVUxMID09IHBGb250IHx8IE5VTEwgPT0gX2NvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9CT09MIGJCb2xkID0gcEZvbnQtPklzQm9sZCgpOwotICAgIGlmICghYkJvbGQgJiYgcEZvbnQtPkdldFN1YnN0Rm9udCgpICYmCi0gICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0ID49IDUwMCAmJgotICAgICAgICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCA8PSA2MDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBTYXZlU3RhdGUoKTsKLSAgICBDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoX2NvbnRleHQsIGtDR1RleHRGaWxsQ2xpcCk7Ci0gICAgRlhfQk9PTCByZXQgPSBGQUxTRTsKLSAgICBpbnQzMl90IGkgPSAwOwotICAgIHdoaWxlIChpIDwgbkNoYXJzKSB7Ci0gICAgICAgIGlmIChwQ2hhclBvc1tpXS5tX2JHbHlwaEFkanVzdCB8fCBmb250X3NpemUgPCAwKSB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXQgPSBDR19EcmF3R2x5cFJ1bihpLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgTlVMTCwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIGlmICghcmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIGNoYXJfcG9zID0gcENoYXJQb3MgKyBpOwotICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBnbHBoeV9tYXRyaXg7Ci0gICAgICAgICAgICBpZiAoZm9udF9zaXplIDwgMCkgewotICAgICAgICAgICAgICAgIGdscGh5X21hdHJpeC5Db25jYXQoLTEsIDAsIDAsIC0xLCAwLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaGFyX3Bvcy0+bV9iR2x5cGhBZGp1c3QpIHsKLSAgICAgICAgICAgICAgICBnbHBoeV9tYXRyaXguQ29uY2F0KGNoYXJfcG9zLT5tX0FkanVzdE1hdHJpeFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfcG9zLT5tX0FkanVzdE1hdHJpeFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfcG9zLT5tX0FkanVzdE1hdHJpeFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfcG9zLT5tX0FkanVzdE1hdHJpeFszXSwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXQgPSBDR19EcmF3R2x5cFJ1bigxLCBjaGFyX3BvcywgcEZvbnQsIHBDYWNoZSwgJmdscGh5X21hdHJpeCwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICAgICAgcENoYXJQb3MgKz0gaTsKLSAgICAgICAgICAgIG5DaGFycyAtPSBpOwotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpID4gMCkgewotICAgICAgICByZXQgPSBDR19EcmF3R2x5cFJ1bihpLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgTlVMTCwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgIH0KLSAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgIHJldHVybiByZXQ7Ci19Ci12b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OnNldFN0cm9rZUluZm8oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBncmFwaFN0YXRlLCBGWF9BUkdCIGFyZ2IsIEZYX0ZMT0FUIGxpbmVXaWR0aCkKLXsKLSAgICBpZiAoTlVMTCA9PSBncmFwaFN0YXRlKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0dDb250ZXh0U2V0TGluZVdpZHRoKF9jb250ZXh0LCBsaW5lV2lkdGgpOwotICAgIENHTGluZUNhcCBjYXA7Ci0gICAgc3dpdGNoIChncmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBSb3VuZDogewotICAgICAgICAgICAgICAgIGNhcCA9IGtDR0xpbmVDYXBSb3VuZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBTcXVhcmU6IHsKLSAgICAgICAgICAgICAgICBjYXAgPSBrQ0dMaW5lQ2FwU3F1YXJlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcEJ1dHQ6Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBjYXAgPSBrQ0dMaW5lQ2FwQnV0dDsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgQ0dDb250ZXh0U2V0TGluZUNhcChfY29udGV4dCwgY2FwKTsKLSAgICBDR0xpbmVKb2luIGpvaW47Ci0gICAgc3dpdGNoIChncmFwaFN0YXRlLT5tX0xpbmVKb2luKSB7Ci0gICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pblJvdW5kOiB7Ci0gICAgICAgICAgICAgICAgam9pbiA9IGtDR0xpbmVKb2luUm91bmQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbkJldmVsOiB7Ci0gICAgICAgICAgICAgICAgam9pbiA9IGtDR0xpbmVKb2luQmV2ZWw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbk1pdGVyOgotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgam9pbiA9IGtDR0xpbmVKb2luTWl0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIENHQ29udGV4dFNldExpbmVKb2luKF9jb250ZXh0LCBqb2luKTsKLSAgICBpZiAoZ3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQpIHsKLSNpZiBDR0ZMT0FUX0lTX0RPVUJMRQotICAgICAgICBDR0Zsb2F0KiBkYXNoQXJyYXkgPSBuZXcgQ0dGbG9hdFtncmFwaFN0YXRlLT5tX0Rhc2hDb3VudF07Ci0gICAgICAgIGlmICghZGFzaEFycmF5KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGdyYXBoU3RhdGUtPm1fRGFzaENvdW50OyArK2luZGV4KSB7Ci0gICAgICAgICAgICBkYXNoQXJyYXlbaW5kZXhdID0gZ3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaW5kZXhdOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBDR0Zsb2F0KiBkYXNoQXJyYXkgPSAoQ0dGbG9hdCopZ3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXk7Ci0jZW5kaWYKLSAgICAgICAgQ0dDb250ZXh0U2V0TGluZURhc2goX2NvbnRleHQsIGdyYXBoU3RhdGUtPm1fRGFzaFBoYXNlLCBkYXNoQXJyYXksIGdyYXBoU3RhdGUtPm1fRGFzaENvdW50KTsKLSNpZiBDR0ZMT0FUX0lTX0RPVUJMRQotICAgICAgICBkZWxldGVbXSBkYXNoQXJyYXk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgaW50MzJfdCBhLCByLCBnLCBiOwotICAgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7Ci0gICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAvIDI1NS5mKTsKLX0KLXZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6c2V0RmlsbEluZm8oRlhfQVJHQiBhcmdiKQotewotICAgIGludDMyX3QgYSwgciwgZywgYjsKLSAgICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOwotICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAvIDI1NS5mKTsKLX0KLXZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6c2V0UGF0aFRvQ29udGV4dChjb25zdCBDRlhfUGF0aERhdGEqIHBhdGhEYXRhKQotewotICAgIGludDMyX3QgY291bnQgPSBwYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOwotICAgIEZYX1BBVEhQT0lOVCogcG9pbnRzID0gcGF0aERhdGEtPkdldFBvaW50cygpOworRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBjbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBTYXZlU3RhdGUoKTsKKyAgaWYgKGNsaXBSZWN0KSB7CiAgICAgQ0dDb250ZXh0QmVnaW5QYXRoKF9jb250ZXh0KTsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBzd2l0Y2ggKHBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEUpIHsKLSAgICAgICAgICAgIGNhc2UgRlhQVF9NT1ZFVE86Ci0gICAgICAgICAgICAgICAgQ0dDb250ZXh0TW92ZVRvUG9pbnQoX2NvbnRleHQsIHBvaW50c1tpXS5tX1BvaW50WCwgcG9pbnRzW2ldLm1fUG9pbnRZKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhQVF9MSU5FVE86Ci0gICAgICAgICAgICAgICAgQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQoX2NvbnRleHQsIHBvaW50c1tpXS5tX1BvaW50WCwgcG9pbnRzW2ldLm1fUG9pbnRZKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhQVF9CRVpJRVJUTzogewotICAgICAgICAgICAgICAgICAgICBDR0NvbnRleHRBZGRDdXJ2ZVRvUG9pbnQoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbaV0ubV9Qb2ludFgsIHBvaW50c1tpXS5tX1BvaW50WSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c1tpICsgMV0ubV9Qb2ludFgsIHBvaW50c1tpICsgMV0ubV9Qb2ludFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbaSArIDJdLm1fUG9pbnRYLCBwb2ludHNbaSArIDJdLm1fUG9pbnRZKTsKLSAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKLSAgICAgICAgICAgIENHQ29udGV4dENsb3NlUGF0aChfY29udGV4dCk7Ci0gICAgICAgIH0KKyAgICBDR1JlY3QgcmVjdF9jbGlwID0gQ0dSZWN0TWFrZShjbGlwUmVjdC0+bGVmdCwgY2xpcFJlY3QtPnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUmVjdC0+V2lkdGgoKSwgY2xpcFJlY3QtPkhlaWdodCgpKTsKKyAgICByZWN0X2NsaXAgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyZWN0X2NsaXAsIF9mb3hpdERldmljZTJVc2VyKTsKKyAgICBDR0NvbnRleHRBZGRSZWN0KF9jb250ZXh0LCByZWN0X2NsaXApOworICAgIENHQ29udGV4dENsaXAoX2NvbnRleHQpOworICB9CisgIENHUmVjdCByZWN0ID0gQ0dSZWN0TWFrZShkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7CisgIHJlY3QgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyZWN0LCBfZm94aXREZXZpY2UyVXNlcik7CisgIGlmIChGWERJQl9CSUNVQklDX0lOVEVSUE9MID09IGZsYWdzKSB7CisgICAgQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX2NvbnRleHQsIGtDR0ludGVycG9sYXRpb25IaWdoKTsKKyAgfSBlbHNlIGlmIChGWERJQl9ET1dOU0FNUExFID09IGZsYWdzKSB7CisgICAgQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX2NvbnRleHQsIGtDR0ludGVycG9sYXRpb25Ob25lKTsKKyAgfSBlbHNlIHsKKyAgICBDR0NvbnRleHRTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShfY29udGV4dCwga0NHSW50ZXJwb2xhdGlvbk1lZGl1bSk7CisgIH0KKyAgQ0dfU2V0SW1hZ2VUcmFuc2Zvcm0oZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOworICBDRlhfRElCaXRtYXAqIHBCaXRtYXAxID0gTlVMTDsKKyAgaWYgKHBCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkpIHsKKyAgICAgIHBCaXRtYXAxID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDsKKyAgICB9IGVsc2UgeworICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwogICAgIH0KLX0KLXZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6Q0dfU2V0SW1hZ2VUcmFuc2Zvcm0oaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LAotICAgICAgICBDR1JlY3QqIHJlY3QgKQotewotICAgIGludCBmbGlwX3kgPSBfZm94aXREZXZpY2UyVXNlci5kICogZGVzdF9oZWlnaHQgPCAwID8gMSA6IC0xOwotICAgIGludCBmbGlwX3ggPSBfZm94aXREZXZpY2UyVXNlci5hICogZGVzdF93aWR0aCA+IDAgPyAxIDogLTE7Ci0gICAgaWYgKGZsaXBfeSA8IDAgfHwgZmxpcF94IDwgMCkgewotICAgICAgICBpZiAoZGVzdF9oZWlnaHQgPCAwKSB7Ci0gICAgICAgICAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKLSAgICAgICAgICAgIGRlc3RfdG9wIC09IGRlc3RfaGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIENHUmVjdCBydCA9IENHUmVjdEFwcGx5QWZmaW5lVHJhbnNmb3JtKENHUmVjdE1ha2UoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpLCBfZm94aXREZXZpY2UyVXNlcik7Ci0gICAgICAgIENHRmxvYXQgb2Zmc2V0X3ggPSAocnQub3JpZ2luLngpICsgcnQuc2l6ZS53aWR0aCAvIDIuZiwKLSAgICAgICAgICAgICAgICBvZmZzZXRfeSA9IChydC5vcmlnaW4ueSkgKyBydC5zaXplLmhlaWdodCAvIDIuZjsKLSAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gQ0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKLSAgICAgICAgdHJhbnNmb3JtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQodHJhbnNmb3JtLCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwgMCwgMSwgLW9mZnNldF94LCAtb2Zmc2V0X3kpKTsKLSAgICAgICAgdHJhbnNmb3JtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQodHJhbnNmb3JtLCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoZmxpcF94LCAwLCAwLCBmbGlwX3ksIDAsIDApKTsKLSAgICAgICAgdHJhbnNmb3JtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQodHJhbnNmb3JtLCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwgMCwgMSwgb2Zmc2V0X3gsIG9mZnNldF95KSk7Ci0gICAgICAgIENHQ29udGV4dENvbmNhdENUTShfY29udGV4dCwgdHJhbnNmb3JtKTsKLSAgICAgICAgaWYgKHJlY3QpIHsKLSAgICAgICAgICAgICpyZWN0ID0gQ0dSZWN0QXBwbHlBZmZpbmVUcmFuc2Zvcm0oKnJlY3QsIHRyYW5zZm9ybSk7Ci0gICAgICAgIH0KKyAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgeworICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci19Ci12b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkNsZWFyRHJpdmVyKCkKLXsKLSAgICBpZiAoTlVMTCA9PSBfY29udGV4dCkgewotICAgICAgICByZXR1cm47CisgICAgQ0dEYXRhUHJvdmlkZXJSZWYgcEJpdG1hcFByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YSgKKyAgICAgICAgTlVMTCwgcEJpdG1hcDEtPkdldEJ1ZmZlcigpLAorICAgICAgICBwQml0bWFwMS0+R2V0UGl0Y2goKSAqIHBCaXRtYXAxLT5HZXRIZWlnaHQoKSwgTlVMTCk7CisgICAgQ0dDb2xvclNwYWNlUmVmIHBDb2xvclNwYWNlID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlR3JheSgpOworICAgIENHQml0bWFwSW5mbyBiaXRtYXBJbmZvID0ga0NHSW1hZ2VBbHBoYU5vbmUgfCBrQ0dCaXRtYXBCeXRlT3JkZXJEZWZhdWx0OworICAgIENHSW1hZ2VSZWYgcEltYWdlID0gQ0dJbWFnZUNyZWF0ZSgKKyAgICAgICAgcEJpdG1hcDEtPkdldFdpZHRoKCksIHBCaXRtYXAxLT5HZXRIZWlnaHQoKSwgcEJpdG1hcDEtPkdldEJQUCgpLAorICAgICAgICBwQml0bWFwMS0+R2V0QlBQKCksIHBCaXRtYXAxLT5HZXRQaXRjaCgpLCBwQ29sb3JTcGFjZSwgYml0bWFwSW5mbywKKyAgICAgICAgcEJpdG1hcFByb3ZpZGVyLCBOVUxMLCB0cnVlLCBrQ0dSZW5kZXJpbmdJbnRlbnREZWZhdWx0KTsKKyAgICBDR0NvbnRleHRDbGlwVG9NYXNrKF9jb250ZXh0LCByZWN0LCBwSW1hZ2UpOworICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihfY29udGV4dCwgRlhBUkdCX1IoYXJnYikgLyAyNTUuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0coYXJnYikgLyAyNTUuZiwgRlhBUkdCX0IoYXJnYikgLyAyNTUuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0EoYXJnYikgLyAyNTUuZik7CisgICAgQ0dDb250ZXh0RmlsbFJlY3QoX2NvbnRleHQsIHJlY3QpOworICAgIENHSW1hZ2VSZWxlYXNlKHBJbWFnZSk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShwQ29sb3JTcGFjZSk7CisgICAgQ0dEYXRhUHJvdmlkZXJSZWxlYXNlKHBCaXRtYXBQcm92aWRlcik7CisgICAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKKyAgICAgIGRlbGV0ZSBwQml0bWFwMTsKICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3NhdmVDb3VudDsgKytpKSB7Ci0gICAgICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoX2NvbnRleHQpOwotICAgIH0KLSAgICBtX3NhdmVDb3VudCA9IDA7Ci0gICAgaWYgKF9jb250ZXh0KSB7Ci0gICAgICAgIENHQ29udGV4dFJlbGVhc2UoX2NvbnRleHQpOwotICAgIH0KLX0KLUNGWF9RdWFydHpEZXZpY2U6OkNGWF9RdWFydHpEZXZpY2UoKQotewotICAgIG1fYk93bmVkQml0bWFwID0gRkFMU0U7Ci0gICAgbV9wQ29udGV4dCA9IE5VTEw7Ci19Ci1DRlhfUXVhcnR6RGV2aWNlOjp+Q0ZYX1F1YXJ0ekRldmljZSgpCi17Ci0gICAgaWYgKG1fcENvbnRleHQpIHsKLSAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShtX3BDb250ZXh0KTsKLSAgICB9Ci0gICAgaWYgKG1fYk93bmVkQml0bWFwKSB7Ci0gICAgICAgIGRlbGV0ZSBHZXRCaXRtYXAoKTsKLSAgICB9Ci19Ci1DR0NvbnRleHRSZWYgQ0ZYX1F1YXJ0ekRldmljZTo6R2V0Q29udGV4dCgpCi17Ci0gICAgcmV0dXJuIG1fcENvbnRleHQ7Ci19Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2U6OkF0dGFjaChDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBuRGV2aWNlQ2xhc3MpCi17Ci0gICAgaWYgKG1fcENvbnRleHQpIHsKLSAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShtX3BDb250ZXh0KTsKLSAgICB9Ci0gICAgbV9wQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgQ0dDb250ZXh0UmV0YWluKG1fcENvbnRleHQpOwotICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBGWF9ORVcgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcihtX3BDb250ZXh0LCBuRGV2aWNlQ2xhc3MpOwotICAgIGlmICghcERyaXZlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKKyAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwogICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7CisgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiMzIpOworICB9IGVsc2UgeworICAgIGlmIChwQml0bWFwLT5HZXRCdWZmZXIoKSkgeworICAgICAgcEJpdG1hcDEgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwOworICAgIH0gZWxzZSB7CisgICAgICBwQml0bWFwMSA9IHBCaXRtYXAtPkNsb25lKCk7CisgICAgfQorICB9CisgIGlmIChOVUxMID09IHBCaXRtYXAxKSB7CisgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBCaXRtYXAxLT5IYXNBbHBoYSgpKSB7CisgICAgaWYgKHBCaXRtYXAxID09IHBCaXRtYXApIHsKKyAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKKyAgICAgIGlmICghcEJpdG1hcDEpIHsKKyAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwQml0bWFwMS0+R2V0SGVpZ2h0KCk7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBwU2NhbmxpbmUgPSAodWludDhfdCopcEJpdG1hcDEtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwQml0bWFwMS0+R2V0V2lkdGgoKTsgY29sKyspIHsKKyAgICAgICAgcFNjYW5saW5lWzBdID0gKHVpbnQ4X3QpKHBTY2FubGluZVswXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKKyAgICAgICAgcFNjYW5saW5lWzFdID0gKHVpbnQ4X3QpKHBTY2FubGluZVsxXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKKyAgICAgICAgcFNjYW5saW5lWzJdID0gKHVpbnQ4X3QpKHBTY2FubGluZVsyXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKKyAgICAgICAgcFNjYW5saW5lICs9IDQ7CisgICAgICB9CisgICAgfQorICB9CisgIENHQ29udGV4dFJlZiBjdHggPSBjcmVhdGVDb250ZXh0V2l0aEJpdG1hcChwQml0bWFwMSk7CisgIENHSW1hZ2VSZWYgaW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShjdHgpOworICBDR0NvbnRleHREcmF3SW1hZ2UoX2NvbnRleHQsIHJlY3QsIGltYWdlKTsKKyAgQ0dJbWFnZVJlbGVhc2UoaW1hZ2UpOworICBDR0NvbnRleHRSZWxlYXNlKGN0eCk7CisgIGlmIChwQml0bWFwMSAhPSBwQml0bWFwKSB7CisgICAgZGVsZXRlIHBCaXRtYXAxOworICB9CisgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlOjpBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwKQotewotICAgIFNldEJpdG1hcChwQml0bWFwKTsKLSAgICBtX3BDb250ZXh0ID0gY3JlYXRlQ29udGV4dFdpdGhCaXRtYXAocEJpdG1hcCk7Ci0gICAgaWYgKE5VTEwgPT0gbV9wQ29udGV4dCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBGWF9ORVcgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcihtX3BDb250ZXh0LCBGWERDX0RJU1BMQVkpOwotICAgIGlmICghcERyaXZlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6Q0dfRHJhd0dseXBSdW4oCisgICAgaW50IG5DaGFycywKKyAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwR2x5cGhNYXRyaXgsCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgaW50IGFscGhhX2ZsYWcsCisgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAobkNoYXJzID09IDApIHsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBDUXVhcnR6MkQmIHF1YXJ0ejJkID0KKyAgICAgICgoQ0FwcGxlUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOworICBpZiAoIXBGb250LT5tX3BQbGF0Zm9ybUZvbnQpIHsKKyAgICBpZiAocEZvbnQtPkdldFBzTmFtZSgpID09IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkRGSGVpU3RkLVc1IikpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEZvbnQtPm1fcFBsYXRmb3JtRm9udCA9CisgICAgICAgIHF1YXJ0ejJkLkNyZWF0ZUZvbnQocEZvbnQtPm1fcEZvbnREYXRhLCBwRm9udC0+bV9kd1NpemUpOworICAgIGlmIChOVUxMID09IHBGb250LT5tX3BQbGF0Zm9ybUZvbnQpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9XT1JELCAzMj4gZ2x5cGhfaW5kaWNlcyhuQ2hhcnMpOworICBDRlhfRml4ZWRCdWZHcm93PENHUG9pbnQsIDMyPiBnbHlwaF9wb3NpdGlvbnMobkNoYXJzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkrKykgeworICAgIGdseXBoX2luZGljZXNbaV0gPSBwQ2hhclBvc1tpXS5tX0V4dEdJRDsKKyAgICBnbHlwaF9wb3NpdGlvbnNbaV0ueCA9IHBDaGFyUG9zW2ldLm1fT3JpZ2luWDsKKyAgICBnbHlwaF9wb3NpdGlvbnNbaV0ueSA9IHBDaGFyUG9zW2ldLm1fT3JpZ2luWTsKKyAgfQorICBDRlhfQWZmaW5lTWF0cml4IHRleHRfbWF0cml4OworICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICB0ZXh0X21hdHJpeC5Db25jYXQoKnBPYmplY3QyRGV2aWNlKTsKKyAgfQorICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXhfY2cgPQorICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKHRleHRfbWF0cml4LmEsIHRleHRfbWF0cml4LmIsIHRleHRfbWF0cml4LmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9tYXRyaXguZCwgdGV4dF9tYXRyaXguZSwgdGV4dF9tYXRyaXguZik7CisgIG1hdHJpeF9jZyA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeF9jZywgX2ZveGl0RGV2aWNlMlVzZXIpOworICBDR0NvbnRleHRTZXRUZXh0TWF0cml4KF9jb250ZXh0LCBtYXRyaXhfY2cpOworICBDR0NvbnRleHRTZXRGb250KF9jb250ZXh0LCAoQ0dGb250UmVmKXBGb250LT5tX3BQbGF0Zm9ybUZvbnQpOworICBDR0NvbnRleHRTZXRGb250U2l6ZShfY29udGV4dCwgRlhTWVNfZmFicyhmb250X3NpemUpKTsKKyAgaW50MzJfdCBhLCByLCBnLCBiOworICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOworICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX2NvbnRleHQsIHIgLyAyNTUuZiwgZyAvIDI1NS5mLCBiIC8gMjU1LmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhIC8gMjU1LmYpOworICBTYXZlU3RhdGUoKTsKKyAgaWYgKHBHbHlwaE1hdHJpeCkgeworICAgIENHUG9pbnQgb3JpZ2luID0gQ0dQb2ludE1ha2UoZ2x5cGhfcG9zaXRpb25zWzBdLngsIGdseXBoX3Bvc2l0aW9uc1swXS55KTsKKyAgICBvcmlnaW4gPSBDR1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm0ob3JpZ2luLCBtYXRyaXhfY2cpOworICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShfY29udGV4dCwgb3JpZ2luLngsIG9yaWdpbi55KTsKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBnbHlwaF9tYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybU1ha2UoCisgICAgICAgIHBHbHlwaE1hdHJpeC0+YSwgcEdseXBoTWF0cml4LT5iLCBwR2x5cGhNYXRyaXgtPmMsIHBHbHlwaE1hdHJpeC0+ZCwKKyAgICAgICAgcEdseXBoTWF0cml4LT5lLCBwR2x5cGhNYXRyaXgtPmYpOworICAgIGlmIChfZm94aXREZXZpY2UyVXNlci5kIDwgMCkgeworICAgICAgZ2x5cGhfbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1JbnZlcnQoZ2x5cGhfbWF0cml4KTsKKyAgICB9CisgICAgQ0dDb250ZXh0Q29uY2F0Q1RNKF9jb250ZXh0LCBnbHlwaF9tYXRyaXgpOworICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShfY29udGV4dCwgLW9yaWdpbi54LCAtb3JpZ2luLnkpOworICB9CisgIENHQ29udGV4dFNob3dHbHlwaHNBdFBvc2l0aW9ucyhfY29udGV4dCwgKENHR2x5cGgqKWdseXBoX2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9wb3NpdGlvbnMsIG5DaGFycyk7CisgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlOjpDcmVhdGUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpCi17Ci0gICAgaWYgKCh1aW50OF90KWZvcm1hdCA8IDMyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoCisgICAgaW50IG5DaGFycywKKyAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgRlhfRFdPUkQgY29sb3IsCisgICAgaW50IGFscGhhX2ZsYWcsCisgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAoTlVMTCA9PSBwRm9udCB8fCBOVUxMID09IF9jb250ZXh0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0JPT0wgYkJvbGQgPSBwRm9udC0+SXNCb2xkKCk7CisgIGlmICghYkJvbGQgJiYgcEZvbnQtPkdldFN1YnN0Rm9udCgpICYmCisgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0ID49IDUwMCAmJgorICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCA8PSA2MDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgU2F2ZVN0YXRlKCk7CisgIENHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZShfY29udGV4dCwga0NHVGV4dEZpbGxDbGlwKTsKKyAgRlhfQk9PTCByZXQgPSBGQUxTRTsKKyAgaW50MzJfdCBpID0gMDsKKyAgd2hpbGUgKGkgPCBuQ2hhcnMpIHsKKyAgICBpZiAocENoYXJQb3NbaV0ubV9iR2x5cGhBZGp1c3QgfHwgZm9udF9zaXplIDwgMCkgeworICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgIHJldCA9IENHX0RyYXdHbHlwUnVuKGksIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBOVUxMLCBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9zaXplLCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICB9CisgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogY2hhcl9wb3MgPSBwQ2hhclBvcyArIGk7CisgICAgICBDRlhfQWZmaW5lTWF0cml4IGdscGh5X21hdHJpeDsKKyAgICAgIGlmIChmb250X3NpemUgPCAwKSB7CisgICAgICAgIGdscGh5X21hdHJpeC5Db25jYXQoLTEsIDAsIDAsIC0xLCAwLCAwKTsKKyAgICAgIH0KKyAgICAgIGlmIChjaGFyX3Bvcy0+bV9iR2x5cGhBZGp1c3QpIHsKKyAgICAgICAgZ2xwaHlfbWF0cml4LkNvbmNhdCgKKyAgICAgICAgICAgIGNoYXJfcG9zLT5tX0FkanVzdE1hdHJpeFswXSwgY2hhcl9wb3MtPm1fQWRqdXN0TWF0cml4WzFdLAorICAgICAgICAgICAgY2hhcl9wb3MtPm1fQWRqdXN0TWF0cml4WzJdLCBjaGFyX3Bvcy0+bV9BZGp1c3RNYXRyaXhbM10sIDAsIDApOworICAgICAgfQorICAgICAgcmV0ID0gQ0dfRHJhd0dseXBSdW4oMSwgY2hhcl9wb3MsIHBGb250LCBwQ2FjaGUsICZnbHBoeV9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZSwgZm9udF9zaXplLCBjb2xvciwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pOworICAgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICAgIGkrKzsKKyAgICAgIHBDaGFyUG9zICs9IGk7CisgICAgICBuQ2hhcnMgLT0gaTsKKyAgICAgIGkgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpKys7CiAgICAgfQotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFwQml0bWFwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoaSA+IDApIHsKKyAgICByZXQgPSBDR19EcmF3R2x5cFJ1bihpLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgTlVMTCwgcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9zaXplLCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgIH0KKyAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgcmV0dXJuIHJldDsKK30KK3ZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6c2V0U3Ryb2tlSW5mbyhjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIGdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxpbmVXaWR0aCkgeworICBpZiAoTlVMTCA9PSBncmFwaFN0YXRlKSB7CisgICAgcmV0dXJuOworICB9CisgIENHQ29udGV4dFNldExpbmVXaWR0aChfY29udGV4dCwgbGluZVdpZHRoKTsKKyAgQ0dMaW5lQ2FwIGNhcDsKKyAgc3dpdGNoIChncmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFJvdW5kOiB7CisgICAgICBjYXAgPSBrQ0dMaW5lQ2FwUm91bmQ7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgaWYgKCFwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KSkgewotICAgICAgICBkZWxldGUgcEJpdG1hcDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwU3F1YXJlOiB7CisgICAgICBjYXAgPSBrQ0dMaW5lQ2FwU3F1YXJlOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1fYk93bmVkQml0bWFwID0gVFJVRTsKLSAgICByZXR1cm4gQXR0YWNoKHBCaXRtYXApOworICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwQnV0dDoKKyAgICBkZWZhdWx0OiB7IGNhcCA9IGtDR0xpbmVDYXBCdXR0OyB9CisgIH0KKyAgQ0dDb250ZXh0U2V0TGluZUNhcChfY29udGV4dCwgY2FwKTsKKyAgQ0dMaW5lSm9pbiBqb2luOworICBzd2l0Y2ggKGdyYXBoU3RhdGUtPm1fTGluZUpvaW4pIHsKKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5Sb3VuZDogeworICAgICAgam9pbiA9IGtDR0xpbmVKb2luUm91bmQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luQmV2ZWw6IHsKKyAgICAgIGpvaW4gPSBrQ0dMaW5lSm9pbkJldmVsOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbk1pdGVyOgorICAgIGRlZmF1bHQ6IHsgam9pbiA9IGtDR0xpbmVKb2luTWl0ZXI7IH0KKyAgfQorICBDR0NvbnRleHRTZXRMaW5lSm9pbihfY29udGV4dCwgam9pbik7CisgIGlmIChncmFwaFN0YXRlLT5tX0Rhc2hDb3VudCkgeworI2lmIENHRkxPQVRfSVNfRE9VQkxFCisgICAgQ0dGbG9hdCogZGFzaEFycmF5ID0gbmV3IENHRmxvYXRbZ3JhcGhTdGF0ZS0+bV9EYXNoQ291bnRdOworICAgIGlmICghZGFzaEFycmF5KSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBncmFwaFN0YXRlLT5tX0Rhc2hDb3VudDsgKytpbmRleCkgeworICAgICAgZGFzaEFycmF5W2luZGV4XSA9IGdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2luZGV4XTsKKyAgICB9CisjZWxzZQorICAgIENHRmxvYXQqIGRhc2hBcnJheSA9IChDR0Zsb2F0KilncmFwaFN0YXRlLT5tX0Rhc2hBcnJheTsKKyNlbmRpZgorICAgIENHQ29udGV4dFNldExpbmVEYXNoKF9jb250ZXh0LCBncmFwaFN0YXRlLT5tX0Rhc2hQaGFzZSwgZGFzaEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoU3RhdGUtPm1fRGFzaENvdW50KTsKKyNpZiBDR0ZMT0FUX0lTX0RPVUJMRQorICAgIGRlbGV0ZVtdIGRhc2hBcnJheTsKKyNlbmRpZgorICB9CisgIGludDMyX3QgYSwgciwgZywgYjsKKyAgQXJnYkRlY29kZShhcmdiLCBhLCByLCBnLCBiKTsKKyAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoX2NvbnRleHQsIHIgLyAyNTUuZiwgZyAvIDI1NS5mLCBiIC8gMjU1LmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgLyAyNTUuZik7Cit9Cit2b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OnNldEZpbGxJbmZvKEZYX0FSR0IgYXJnYikgeworICBpbnQzMl90IGEsIHIsIGcsIGI7CisgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7CisgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihfY29udGV4dCwgciAvIDI1NS5mLCBnIC8gMjU1LmYsIGIgLyAyNTUuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgLyAyNTUuZik7Cit9Cit2b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OnNldFBhdGhUb0NvbnRleHQoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwYXRoRGF0YSkgeworICBpbnQzMl90IGNvdW50ID0gcGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsKKyAgRlhfUEFUSFBPSU5UKiBwb2ludHMgPSBwYXRoRGF0YS0+R2V0UG9pbnRzKCk7CisgIENHQ29udGV4dEJlZ2luUGF0aChfY29udGV4dCk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBzd2l0Y2ggKHBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEUpIHsKKyAgICAgIGNhc2UgRlhQVF9NT1ZFVE86CisgICAgICAgIENHQ29udGV4dE1vdmVUb1BvaW50KF9jb250ZXh0LCBwb2ludHNbaV0ubV9Qb2ludFgsIHBvaW50c1tpXS5tX1BvaW50WSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWFBUX0xJTkVUTzoKKyAgICAgICAgQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQoX2NvbnRleHQsIHBvaW50c1tpXS5tX1BvaW50WCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzW2ldLm1fUG9pbnRZKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYUFRfQkVaSUVSVE86IHsKKyAgICAgICAgQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50KF9jb250ZXh0LCBwb2ludHNbaV0ubV9Qb2ludFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbaV0ubV9Qb2ludFksIHBvaW50c1tpICsgMV0ubV9Qb2ludFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbaSArIDFdLm1fUG9pbnRZLCBwb2ludHNbaSArIDJdLm1fUG9pbnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzW2kgKyAyXS5tX1BvaW50WSk7CisgICAgICAgIGkgKz0gMjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSB7CisgICAgICBDR0NvbnRleHRDbG9zZVBhdGgoX2NvbnRleHQpOworICAgIH0KKyAgfQorfQordm9pZCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpDR19TZXRJbWFnZVRyYW5zZm9ybShpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHUmVjdCogcmVjdCkgeworICBpbnQgZmxpcF95ID0gX2ZveGl0RGV2aWNlMlVzZXIuZCAqIGRlc3RfaGVpZ2h0IDwgMCA/IDEgOiAtMTsKKyAgaW50IGZsaXBfeCA9IF9mb3hpdERldmljZTJVc2VyLmEgKiBkZXN0X3dpZHRoID4gMCA/IDEgOiAtMTsKKyAgaWYgKGZsaXBfeSA8IDAgfHwgZmxpcF94IDwgMCkgeworICAgIGlmIChkZXN0X2hlaWdodCA8IDApIHsKKyAgICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0OworICAgICAgZGVzdF90b3AgLT0gZGVzdF9oZWlnaHQ7CisgICAgfQorICAgIENHUmVjdCBydCA9IENHUmVjdEFwcGx5QWZmaW5lVHJhbnNmb3JtKAorICAgICAgICBDR1JlY3RNYWtlKGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KSwKKyAgICAgICAgX2ZveGl0RGV2aWNlMlVzZXIpOworICAgIENHRmxvYXQgb2Zmc2V0X3ggPSAocnQub3JpZ2luLngpICsgcnQuc2l6ZS53aWR0aCAvIDIuZiwKKyAgICAgICAgICAgIG9mZnNldF95ID0gKHJ0Lm9yaWdpbi55KSArIHJ0LnNpemUuaGVpZ2h0IC8gMi5mOworICAgIENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IENHQWZmaW5lVHJhbnNmb3JtSWRlbnRpdHk7CisgICAgdHJhbnNmb3JtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQoCisgICAgICAgIHRyYW5zZm9ybSwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKDEsIDAsIDAsIDEsIC1vZmZzZXRfeCwgLW9mZnNldF95KSk7CisgICAgdHJhbnNmb3JtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQoCisgICAgICAgIHRyYW5zZm9ybSwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKGZsaXBfeCwgMCwgMCwgZmxpcF95LCAwLCAwKSk7CisgICAgdHJhbnNmb3JtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQoCisgICAgICAgIHRyYW5zZm9ybSwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKDEsIDAsIDAsIDEsIG9mZnNldF94LCBvZmZzZXRfeSkpOworICAgIENHQ29udGV4dENvbmNhdENUTShfY29udGV4dCwgdHJhbnNmb3JtKTsKKyAgICBpZiAocmVjdCkgeworICAgICAgKnJlY3QgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybSgqcmVjdCwgdHJhbnNmb3JtKTsKKyAgICB9CisgIH0KK30KK3ZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6Q2xlYXJEcml2ZXIoKSB7CisgIGlmIChOVUxMID09IF9jb250ZXh0KSB7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9zYXZlQ291bnQ7ICsraSkgeworICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoX2NvbnRleHQpOworICB9CisgIG1fc2F2ZUNvdW50ID0gMDsKKyAgaWYgKF9jb250ZXh0KSB7CisgICAgQ0dDb250ZXh0UmVsZWFzZShfY29udGV4dCk7CisgIH0KK30KK0NGWF9RdWFydHpEZXZpY2U6OkNGWF9RdWFydHpEZXZpY2UoKSB7CisgIG1fYk93bmVkQml0bWFwID0gRkFMU0U7CisgIG1fcENvbnRleHQgPSBOVUxMOworfQorQ0ZYX1F1YXJ0ekRldmljZTo6fkNGWF9RdWFydHpEZXZpY2UoKSB7CisgIGlmIChtX3BDb250ZXh0KSB7CisgICAgQ0dDb250ZXh0UmVsZWFzZShtX3BDb250ZXh0KTsKKyAgfQorICBpZiAobV9iT3duZWRCaXRtYXApIHsKKyAgICBkZWxldGUgR2V0Qml0bWFwKCk7CisgIH0KK30KK0NHQ29udGV4dFJlZiBDRlhfUXVhcnR6RGV2aWNlOjpHZXRDb250ZXh0KCkgeworICByZXR1cm4gbV9wQ29udGV4dDsKK30KK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZTo6QXR0YWNoKENHQ29udGV4dFJlZiBjb250ZXh0LCBpbnQzMl90IG5EZXZpY2VDbGFzcykgeworICBpZiAobV9wQ29udGV4dCkgeworICAgIENHQ29udGV4dFJlbGVhc2UobV9wQ29udGV4dCk7CisgIH0KKyAgbV9wQ29udGV4dCA9IGNvbnRleHQ7CisgIENHQ29udGV4dFJldGFpbihtX3BDb250ZXh0KTsKKyAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9CisgICAgICBGWF9ORVcgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcihtX3BDb250ZXh0LCBuRGV2aWNlQ2xhc3MpOworICBpZiAoIXBEcml2ZXIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCkgeworICBTZXRCaXRtYXAocEJpdG1hcCk7CisgIG1fcENvbnRleHQgPSBjcmVhdGVDb250ZXh0V2l0aEJpdG1hcChwQml0bWFwKTsKKyAgaWYgKE5VTEwgPT0gbV9wQ29udGV4dCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0KKyAgICAgIEZYX05FVyBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyKG1fcENvbnRleHQsIEZYRENfRElTUExBWSk7CisgIGlmICghcERyaXZlcikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlOjpDcmVhdGUoaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGZvcm1hdCkgeworICBpZiAoKHVpbnQ4X3QpZm9ybWF0IDwgMzIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKKyAgaWYgKCFwQml0bWFwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpIHsKKyAgICBkZWxldGUgcEJpdG1hcDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9iT3duZWRCaXRtYXAgPSBUUlVFOworICByZXR1cm4gQXR0YWNoKHBCaXRtYXApOwogfQogI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZGliL2RpYl9pbnQuaCBiL2NvcmUvc3JjL2Z4Z2UvZGliL2RpYl9pbnQuaAppbmRleCA4MjVjYWJlLi43NGU3N2Q0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2RpYi9kaWJfaW50LmgKKysrIGIvY29yZS9zcmMvZnhnZS9kaWIvZGliX2ludC5oCkBAIC03LDg3ICs3LDg4IEBACiAjaWZuZGVmIENPUkVfU1JDX0ZYR0VfRElCX0RJQl9JTlRfSF8KICNkZWZpbmUgQ09SRV9TUkNfRlhHRV9ESUJfRElCX0lOVF9IXwogCi1jbGFzcyBDUERGX0ZpeGVkTWF0cml4Ci17Ci1wdWJsaWM6Ci0gICAgQ1BERl9GaXhlZE1hdHJpeChjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBzcmMsIGludCBiaXRzKQotICAgIHsKLSAgICAgICAgYmFzZSA9IDEgPDwgYml0czsKLSAgICAgICAgYSA9IEZYU1lTX3JvdW5kKHNyYy5hICogYmFzZSk7Ci0gICAgICAgIGIgPSBGWFNZU19yb3VuZChzcmMuYiAqIGJhc2UpOwotICAgICAgICBjID0gRlhTWVNfcm91bmQoc3JjLmMgKiBiYXNlKTsKLSAgICAgICAgZCA9IEZYU1lTX3JvdW5kKHNyYy5kICogYmFzZSk7Ci0gICAgICAgIGUgPSBGWFNZU19yb3VuZChzcmMuZSAqIGJhc2UpOwotICAgICAgICBmID0gRlhTWVNfcm91bmQoc3JjLmYgKiBiYXNlKTsKLSAgICB9Ci0gICAgaW5saW5lIHZvaWQJVHJhbnNmb3JtKGludCB4LCBpbnQgeSwgaW50JiB4MSwgaW50JiB5MSkKLSAgICB7Ci0gICAgICAgIHgxID0gKGEgKiB4ICsgYyAqIHkgKyBlICsgYmFzZSAvIDIpIC8gYmFzZTsKLSAgICAgICAgeTEgPSAoYiAqIHggKyBkICogeSArIGYgKyBiYXNlIC8gMikgLyBiYXNlOwotICAgIH0KLSAgICBpbnQJCWEsIGIsIGMsIGQsIGUsIGY7Ci0gICAgaW50CQliYXNlOworY2xhc3MgQ1BERl9GaXhlZE1hdHJpeCB7CisgcHVibGljOgorICBDUERGX0ZpeGVkTWF0cml4KGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIHNyYywgaW50IGJpdHMpIHsKKyAgICBiYXNlID0gMSA8PCBiaXRzOworICAgIGEgPSBGWFNZU19yb3VuZChzcmMuYSAqIGJhc2UpOworICAgIGIgPSBGWFNZU19yb3VuZChzcmMuYiAqIGJhc2UpOworICAgIGMgPSBGWFNZU19yb3VuZChzcmMuYyAqIGJhc2UpOworICAgIGQgPSBGWFNZU19yb3VuZChzcmMuZCAqIGJhc2UpOworICAgIGUgPSBGWFNZU19yb3VuZChzcmMuZSAqIGJhc2UpOworICAgIGYgPSBGWFNZU19yb3VuZChzcmMuZiAqIGJhc2UpOworICB9CisgIGlubGluZSB2b2lkIFRyYW5zZm9ybShpbnQgeCwgaW50IHksIGludCYgeDEsIGludCYgeTEpIHsKKyAgICB4MSA9IChhICogeCArIGMgKiB5ICsgZSArIGJhc2UgLyAyKSAvIGJhc2U7CisgICAgeTEgPSAoYiAqIHggKyBkICogeSArIGYgKyBiYXNlIC8gMikgLyBiYXNlOworICB9CisgIGludCBhLCBiLCBjLCBkLCBlLCBmOworICBpbnQgYmFzZTsKIH07Ci0jZGVmaW5lIEZQREZfSFVHRV9JTUFHRV9TSVpFCTYwMDAwMDAwCisjZGVmaW5lIEZQREZfSFVHRV9JTUFHRV9TSVpFIDYwMDAwMDAwCiBzdHJ1Y3QgUGl4ZWxXZWlnaHQgewotICAgIGludAkJbV9TcmNTdGFydDsKLSAgICBpbnQJCW1fU3JjRW5kOwotICAgIGludAkJbV9XZWlnaHRzWzFdOworICBpbnQgbV9TcmNTdGFydDsKKyAgaW50IG1fU3JjRW5kOworICBpbnQgbV9XZWlnaHRzWzFdOwogfTsKLWNsYXNzIENXZWlnaHRUYWJsZQotewotcHVibGljOgotICAgIENXZWlnaHRUYWJsZSgpCi0gICAgewotICAgICAgICBtX3BXZWlnaHRUYWJsZXMgPSBOVUxMOworY2xhc3MgQ1dlaWdodFRhYmxlIHsKKyBwdWJsaWM6CisgIENXZWlnaHRUYWJsZSgpIHsgbV9wV2VpZ2h0VGFibGVzID0gTlVMTDsgfQorICB+Q1dlaWdodFRhYmxlKCkgeworICAgIGlmIChtX3BXZWlnaHRUYWJsZXMpIHsKKyAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsKICAgICB9Ci0gICAgfkNXZWlnaHRUYWJsZSgpCi0gICAgewotICAgICAgICBpZihtX3BXZWlnaHRUYWJsZXMpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsKLSAgICAgICAgfQotICAgICAgICBtX3BXZWlnaHRUYWJsZXMgPSBOVUxMOwotICAgIH0KLSAgICB2b2lkCQkJQ2FsYyhpbnQgZGVzdF9sZW4sIGludCBkZXN0X21pbiwgaW50IGRlc3RfbWF4LCBpbnQgc3JjX2xlbiwgaW50IHNyY19taW4sIGludCBzcmNfbWF4LCBpbnQgZmxhZ3MpOwotICAgIFBpeGVsV2VpZ2h0KglHZXRQaXhlbFdlaWdodChpbnQgcGl4ZWwpCi0gICAgewotICAgICAgICByZXR1cm4gKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgKHBpeGVsIC0gbV9EZXN0TWluKSAqIG1fSXRlbVNpemUpOwotICAgIH0KLSAgICBpbnQJCQkJbV9EZXN0TWluLCBtX0l0ZW1TaXplOwotICAgIHVpbnQ4X3QqCQltX3BXZWlnaHRUYWJsZXM7CisgICAgbV9wV2VpZ2h0VGFibGVzID0gTlVMTDsKKyAgfQorICB2b2lkIENhbGMoaW50IGRlc3RfbGVuLAorICAgICAgICAgICAgaW50IGRlc3RfbWluLAorICAgICAgICAgICAgaW50IGRlc3RfbWF4LAorICAgICAgICAgICAgaW50IHNyY19sZW4sCisgICAgICAgICAgICBpbnQgc3JjX21pbiwKKyAgICAgICAgICAgIGludCBzcmNfbWF4LAorICAgICAgICAgICAgaW50IGZsYWdzKTsKKyAgUGl4ZWxXZWlnaHQqIEdldFBpeGVsV2VpZ2h0KGludCBwaXhlbCkgeworICAgIHJldHVybiAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyAocGl4ZWwgLSBtX0Rlc3RNaW4pICogbV9JdGVtU2l6ZSk7CisgIH0KKyAgaW50IG1fRGVzdE1pbiwgbV9JdGVtU2l6ZTsKKyAgdWludDhfdCogbV9wV2VpZ2h0VGFibGVzOwogfTsKLWNsYXNzIENTdHJldGNoRW5naW5lCi17Ci1wdWJsaWM6Ci0gICAgQ1N0cmV0Y2hFbmdpbmUoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0Qml0bWFwLCBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCYgY2xpcF9yZWN0LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBmbGFncyk7Ci0gICAgfkNTdHJldGNoRW5naW5lKCk7Ci0gICAgRlhfQk9PTAkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwotcHVibGljOgotICAgIEZYRElCX0Zvcm1hdCBtX0Rlc3RGb3JtYXQ7Ci0gICAgaW50CQltX0Rlc3RCcHAsIG1fU3JjQnBwLCBtX2JIYXNBbHBoYTsKLSAgICBJRlhfU2NhbmxpbmVDb21wb3NlcioJbV9wRGVzdEJpdG1hcDsKLSAgICBpbnQJCW1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQ7Ci0gICAgRlhfUkVDVAltX0Rlc3RDbGlwOwotICAgIHVpbnQ4X3QqCW1fcERlc3RTY2FubGluZTsKLSAgICB1aW50OF90KiAgIG1fcERlc3RNYXNrU2NhbmxpbmU7Ci0gICAgRlhfUkVDVAltX1NyY0NsaXA7Ci0gICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSoJbV9wU291cmNlOwotICAgIEZYX0RXT1JEKgltX3BTcmNQYWxldHRlOwotICAgIGludAkJbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQ7Ci0gICAgaW50CQltX1NyY1BpdGNoLCBtX0ludGVyUGl0Y2g7Ci0gICAgaW50IG1fRXh0cmFNYXNrUGl0Y2g7Ci0gICAgdW5zaWduZWQgY2hhcioJbV9wSW50ZXJCdWY7Ci0gICAgdW5zaWduZWQgY2hhcioJbV9wRXh0cmFBbHBoYUJ1ZjsKLSAgICBpbnQJCW1fVHJhbnNNZXRob2Q7Ci0gICAgaW50IAltX0ZsYWdzOwotICAgIENXZWlnaHRUYWJsZQltX1dlaWdodFRhYmxlOwotICAgIGludAkJbV9DdXJSb3c7Ci0gICAgRlhfQk9PTAlTdGFydFN0cmV0Y2hIb3J6KCk7Ci0gICAgRlhfQk9PTAlDb250aW51ZVN0cmV0Y2hIb3J6KElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICB2b2lkCVN0cmV0Y2hWZXJ0KCk7Ci0gICAgaW50CQltX1N0YXRlOworY2xhc3MgQ1N0cmV0Y2hFbmdpbmUgeworIHB1YmxpYzoKKyAgQ1N0cmV0Y2hFbmdpbmUoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0Qml0bWFwLAorICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIGNsaXBfcmVjdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKyAgfkNTdHJldGNoRW5naW5lKCk7CisgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworCisgcHVibGljOgorICBGWERJQl9Gb3JtYXQgbV9EZXN0Rm9ybWF0OworICBpbnQgbV9EZXN0QnBwLCBtX1NyY0JwcCwgbV9iSGFzQWxwaGE7CisgIElGWF9TY2FubGluZUNvbXBvc2VyKiBtX3BEZXN0Qml0bWFwOworICBpbnQgbV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodDsKKyAgRlhfUkVDVCBtX0Rlc3RDbGlwOworICB1aW50OF90KiBtX3BEZXN0U2NhbmxpbmU7CisgIHVpbnQ4X3QqIG1fcERlc3RNYXNrU2NhbmxpbmU7CisgIEZYX1JFQ1QgbV9TcmNDbGlwOworICBjb25zdCBDRlhfRElCU291cmNlKiBtX3BTb3VyY2U7CisgIEZYX0RXT1JEKiBtX3BTcmNQYWxldHRlOworICBpbnQgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQ7CisgIGludCBtX1NyY1BpdGNoLCBtX0ludGVyUGl0Y2g7CisgIGludCBtX0V4dHJhTWFza1BpdGNoOworICB1bnNpZ25lZCBjaGFyKiBtX3BJbnRlckJ1ZjsKKyAgdW5zaWduZWQgY2hhciogbV9wRXh0cmFBbHBoYUJ1ZjsKKyAgaW50IG1fVHJhbnNNZXRob2Q7CisgIGludCBtX0ZsYWdzOworICBDV2VpZ2h0VGFibGUgbV9XZWlnaHRUYWJsZTsKKyAgaW50IG1fQ3VyUm93OworICBGWF9CT09MIFN0YXJ0U3RyZXRjaEhvcnooKTsKKyAgRlhfQk9PTCBDb250aW51ZVN0cmV0Y2hIb3J6KElGWF9QYXVzZSogcFBhdXNlKTsKKyAgdm9pZCBTdHJldGNoVmVydCgpOworICBpbnQgbV9TdGF0ZTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlhHRV9ESUJfRElCX0lOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbXBvc2l0ZS5jcHAgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29tcG9zaXRlLmNwcAppbmRleCBjYjk5YTM3Li44NDA2MmQ4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29tcG9zaXRlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29tcG9zaXRlLmNwcApAQCAtOCw0NTE3ICs4LDUyMDMgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKICNpbmNsdWRlICJkaWJfaW50LmgiCiBjb25zdCB1aW50OF90IF9jb2xvcl9zcXJ0WzI1Nl0gPSB7Ci0gICAgMHgwMCwgMHgwMywgMHgwNywgMHgwQiwgMHgwRiwgMHgxMiwgMHgxNiwgMHgxOSwgMHgxRCwgMHgyMCwgMHgyMywgMHgyNiwgMHgyOSwgMHgyQywgMHgyRiwgMHgzMiwKLSAgICAweDM1LCAweDM3LCAweDNBLCAweDNDLCAweDNGLCAweDQxLCAweDQzLCAweDQ2LCAweDQ4LCAweDRBLCAweDRDLCAweDRFLCAweDUwLCAweDUyLCAweDU0LCAweDU2LAotICAgIDB4NTcsIDB4NTksIDB4NUIsIDB4NUMsIDB4NUUsIDB4NjAsIDB4NjEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjcsIDB4NjgsIDB4NjksIDB4NkIsIDB4NkMsIDB4NkQsCi0gICAgMHg2RSwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3QSwgMHg3QiwgMHg3QywgMHg3RCwgMHg3RSwKLSAgICAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg3LCAweDg4LCAweDg5LCAweDhBLCAweDhCLCAweDhDLCAweDhELCAweDhFLAotICAgIDB4OEYsIDB4OTAsIDB4OTEsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTgsIDB4OTksIDB4OUEsIDB4OUIsIDB4OUMsCi0gICAgMHg5QywgMHg5RCwgMHg5RSwgMHg5RiwgMHhBMCwgMHhBMCwgMHhBMSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNCwgMHhBNSwgMHhBNiwgMHhBNywgMHhBNywgMHhBOCwKLSAgICAweEE5LCAweEFBLCAweEFBLCAweEFCLCAweEFDLCAweEFELCAweEFELCAweEFFLCAweEFGLCAweEIwLCAweEIwLCAweEIxLCAweEIyLCAweEIzLCAweEIzLCAweEI0LAotICAgIDB4QjUsIDB4QjUsIDB4QjYsIDB4QjcsIDB4QjcsIDB4QjgsIDB4QjksIDB4QkEsIDB4QkEsIDB4QkIsIDB4QkMsIDB4QkMsIDB4QkQsIDB4QkUsIDB4QkUsIDB4QkYsCi0gICAgMHhDMCwgMHhDMCwgMHhDMSwgMHhDMiwgMHhDMiwgMHhDMywgMHhDNCwgMHhDNCwgMHhDNSwgMHhDNiwgMHhDNiwgMHhDNywgMHhDNywgMHhDOCwgMHhDOSwgMHhDOSwKLSAgICAweENBLCAweENCLCAweENCLCAweENDLCAweENDLCAweENELCAweENFLCAweENFLCAweENGLCAweEQwLCAweEQwLCAweEQxLCAweEQxLCAweEQyLCAweEQzLCAweEQzLAotICAgIDB4RDQsIDB4RDQsIDB4RDUsIDB4RDYsIDB4RDYsIDB4RDcsIDB4RDcsIDB4RDgsIDB4RDksIDB4RDksIDB4REEsIDB4REEsIDB4REIsIDB4REMsIDB4REMsIDB4REQsCi0gICAgMHhERCwgMHhERSwgMHhERSwgMHhERiwgMHhFMCwgMHhFMCwgMHhFMSwgMHhFMSwgMHhFMiwgMHhFMiwgMHhFMywgMHhFNCwgMHhFNCwgMHhFNSwgMHhFNSwgMHhFNiwKLSAgICAweEU2LCAweEU3LCAweEU3LCAweEU4LCAweEU5LCAweEU5LCAweEVBLCAweEVBLCAweEVCLCAweEVCLCAweEVDLCAweEVDLCAweEVELCAweEVELCAweEVFLCAweEVFLAotICAgIDB4RUYsIDB4RjAsIDB4RjAsIDB4RjEsIDB4RjEsIDB4RjIsIDB4RjIsIDB4RjMsIDB4RjMsIDB4RjQsIDB4RjQsIDB4RjUsIDB4RjUsIDB4RjYsIDB4RjYsIDB4RjcsCi0gICAgMHhGNywgMHhGOCwgMHhGOCwgMHhGOSwgMHhGOSwgMHhGQSwgMHhGQSwgMHhGQiwgMHhGQiwgMHhGQywgMHhGQywgMHhGRCwgMHhGRCwgMHhGRSwgMHhGRSwgMHhGRgotfTsKLWludCBfQkxFTkQoaW50IGJsZW5kX21vZGUsIGludCBiYWNrX2NvbG9yLCBpbnQgc3JjX2NvbG9yKQotewotICAgIHN3aXRjaCAoYmxlbmRfbW9kZSkgewotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX05PUk1BTDoKLSAgICAgICAgICAgIHJldHVybiBzcmNfY29sb3I7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfTVVMVElQTFk6Ci0gICAgICAgICAgICByZXR1cm4gc3JjX2NvbG9yICogYmFja19jb2xvciAvIDI1NTsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9TQ1JFRU46Ci0gICAgICAgICAgICByZXR1cm4gc3JjX2NvbG9yICsgYmFja19jb2xvciAtIHNyY19jb2xvciAqIGJhY2tfY29sb3IgLyAyNTU7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfT1ZFUkxBWToKLSAgICAgICAgICAgIHJldHVybiBfQkxFTkQoRlhESUJfQkxFTkRfSEFSRExJR0hULCBzcmNfY29sb3IsIGJhY2tfY29sb3IpOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0RBUktFTjoKLSAgICAgICAgICAgIHJldHVybiBzcmNfY29sb3IgPCBiYWNrX2NvbG9yID8gc3JjX2NvbG9yIDogYmFja19jb2xvcjsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9MSUdIVEVOOgotICAgICAgICAgICAgcmV0dXJuIHNyY19jb2xvciA+IGJhY2tfY29sb3IgPyBzcmNfY29sb3IgOiBiYWNrX2NvbG9yOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0NPTE9SRE9ER0U6IHsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbG9yID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3JjX2NvbG9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gYmFja19jb2xvciAqIDI1NSAvICgyNTUgLSBzcmNfY29sb3IpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUkJVUk46IHsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbG9yID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNyY19jb2xvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9ICgyNTUgLSBiYWNrX2NvbG9yKSAqIDI1NSAvIHNyY19jb2xvcjsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI1NSAtIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9IQVJETElHSFQ6Ci0gICAgICAgICAgICBpZiAoc3JjX2NvbG9yIDwgMTI4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChzcmNfY29sb3IgKiBiYWNrX2NvbG9yICogMikgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX0JMRU5EKEZYRElCX0JMRU5EX1NDUkVFTiwgYmFja19jb2xvciwgMiAqIHNyY19jb2xvciAtIDI1NSk7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfU09GVExJR0hUOiB7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19jb2xvciA8IDEyOCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFja19jb2xvciAtICgyNTUgLSAyICogc3JjX2NvbG9yKSAqIGJhY2tfY29sb3IgKiAoMjU1IC0gYmFja19jb2xvcikgLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBiYWNrX2NvbG9yICsgKDIgKiBzcmNfY29sb3IgLSAyNTUpICogKF9jb2xvcl9zcXJ0W2JhY2tfY29sb3JdIC0gYmFja19jb2xvcikgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfRElGRkVSRU5DRToKLSAgICAgICAgICAgIHJldHVybiBiYWNrX2NvbG9yIDwgc3JjX2NvbG9yID8gc3JjX2NvbG9yIC0gYmFja19jb2xvciA6IGJhY2tfY29sb3IgLSBzcmNfY29sb3I7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfRVhDTFVTSU9OOgotICAgICAgICAgICAgcmV0dXJuIGJhY2tfY29sb3IgKyBzcmNfY29sb3IgLSAyICogYmFja19jb2xvciAqIHNyY19jb2xvciAvIDI1NTsKKyAgICAweDAwLCAweDAzLCAweDA3LCAweDBCLCAweDBGLCAweDEyLCAweDE2LCAweDE5LCAweDFELCAweDIwLCAweDIzLCAweDI2LAorICAgIDB4MjksIDB4MkMsIDB4MkYsIDB4MzIsIDB4MzUsIDB4MzcsIDB4M0EsIDB4M0MsIDB4M0YsIDB4NDEsIDB4NDMsIDB4NDYsCisgICAgMHg0OCwgMHg0QSwgMHg0QywgMHg0RSwgMHg1MCwgMHg1MiwgMHg1NCwgMHg1NiwgMHg1NywgMHg1OSwgMHg1QiwgMHg1QywKKyAgICAweDVFLCAweDYwLCAweDYxLCAweDYzLCAweDY0LCAweDY1LCAweDY3LCAweDY4LCAweDY5LCAweDZCLCAweDZDLCAweDZELAorICAgIDB4NkUsIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N0EsCisgICAgMHg3QiwgMHg3QywgMHg3RCwgMHg3RSwgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKKyAgICAweDg3LCAweDg4LCAweDg5LCAweDhBLCAweDhCLCAweDhDLCAweDhELCAweDhFLCAweDhGLCAweDkwLCAweDkxLCAweDkxLAorICAgIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTgsIDB4OTksIDB4OUEsIDB4OUIsIDB4OUMsCisgICAgMHg5QywgMHg5RCwgMHg5RSwgMHg5RiwgMHhBMCwgMHhBMCwgMHhBMSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNCwgMHhBNSwKKyAgICAweEE2LCAweEE3LCAweEE3LCAweEE4LCAweEE5LCAweEFBLCAweEFBLCAweEFCLCAweEFDLCAweEFELCAweEFELCAweEFFLAorICAgIDB4QUYsIDB4QjAsIDB4QjAsIDB4QjEsIDB4QjIsIDB4QjMsIDB4QjMsIDB4QjQsIDB4QjUsIDB4QjUsIDB4QjYsIDB4QjcsCisgICAgMHhCNywgMHhCOCwgMHhCOSwgMHhCQSwgMHhCQSwgMHhCQiwgMHhCQywgMHhCQywgMHhCRCwgMHhCRSwgMHhCRSwgMHhCRiwKKyAgICAweEMwLCAweEMwLCAweEMxLCAweEMyLCAweEMyLCAweEMzLCAweEM0LCAweEM0LCAweEM1LCAweEM2LCAweEM2LCAweEM3LAorICAgIDB4QzcsIDB4QzgsIDB4QzksIDB4QzksIDB4Q0EsIDB4Q0IsIDB4Q0IsIDB4Q0MsIDB4Q0MsIDB4Q0QsIDB4Q0UsIDB4Q0UsCisgICAgMHhDRiwgMHhEMCwgMHhEMCwgMHhEMSwgMHhEMSwgMHhEMiwgMHhEMywgMHhEMywgMHhENCwgMHhENCwgMHhENSwgMHhENiwKKyAgICAweEQ2LCAweEQ3LCAweEQ3LCAweEQ4LCAweEQ5LCAweEQ5LCAweERBLCAweERBLCAweERCLCAweERDLCAweERDLCAweERELAorICAgIDB4REQsIDB4REUsIDB4REUsIDB4REYsIDB4RTAsIDB4RTAsIDB4RTEsIDB4RTEsIDB4RTIsIDB4RTIsIDB4RTMsIDB4RTQsCisgICAgMHhFNCwgMHhFNSwgMHhFNSwgMHhFNiwgMHhFNiwgMHhFNywgMHhFNywgMHhFOCwgMHhFOSwgMHhFOSwgMHhFQSwgMHhFQSwKKyAgICAweEVCLCAweEVCLCAweEVDLCAweEVDLCAweEVELCAweEVELCAweEVFLCAweEVFLCAweEVGLCAweEYwLCAweEYwLCAweEYxLAorICAgIDB4RjEsIDB4RjIsIDB4RjIsIDB4RjMsIDB4RjMsIDB4RjQsIDB4RjQsIDB4RjUsIDB4RjUsIDB4RjYsIDB4RjYsIDB4RjcsCisgICAgMHhGNywgMHhGOCwgMHhGOCwgMHhGOSwgMHhGOSwgMHhGQSwgMHhGQSwgMHhGQiwgMHhGQiwgMHhGQywgMHhGQywgMHhGRCwKKyAgICAweEZELCAweEZFLCAweEZFLCAweEZGfTsKK2ludCBfQkxFTkQoaW50IGJsZW5kX21vZGUsIGludCBiYWNrX2NvbG9yLCBpbnQgc3JjX2NvbG9yKSB7CisgIHN3aXRjaCAoYmxlbmRfbW9kZSkgeworICAgIGNhc2UgRlhESUJfQkxFTkRfTk9STUFMOgorICAgICAgcmV0dXJuIHNyY19jb2xvcjsKKyAgICBjYXNlIEZYRElCX0JMRU5EX01VTFRJUExZOgorICAgICAgcmV0dXJuIHNyY19jb2xvciAqIGJhY2tfY29sb3IgLyAyNTU7CisgICAgY2FzZSBGWERJQl9CTEVORF9TQ1JFRU46CisgICAgICByZXR1cm4gc3JjX2NvbG9yICsgYmFja19jb2xvciAtIHNyY19jb2xvciAqIGJhY2tfY29sb3IgLyAyNTU7CisgICAgY2FzZSBGWERJQl9CTEVORF9PVkVSTEFZOgorICAgICAgcmV0dXJuIF9CTEVORChGWERJQl9CTEVORF9IQVJETElHSFQsIHNyY19jb2xvciwgYmFja19jb2xvcik7CisgICAgY2FzZSBGWERJQl9CTEVORF9EQVJLRU46CisgICAgICByZXR1cm4gc3JjX2NvbG9yIDwgYmFja19jb2xvciA/IHNyY19jb2xvciA6IGJhY2tfY29sb3I7CisgICAgY2FzZSBGWERJQl9CTEVORF9MSUdIVEVOOgorICAgICAgcmV0dXJuIHNyY19jb2xvciA+IGJhY2tfY29sb3IgPyBzcmNfY29sb3IgOiBiYWNrX2NvbG9yOworICAgIGNhc2UgRlhESUJfQkxFTkRfQ09MT1JET0RHRTogeworICAgICAgaWYgKHNyY19jb2xvciA9PSAyNTUpIHsKKyAgICAgICAgcmV0dXJuIHNyY19jb2xvcjsKKyAgICAgIH0KKyAgICAgIGludCByZXN1bHQgPSBiYWNrX2NvbG9yICogMjU1IC8gKDI1NSAtIHNyY19jb2xvcik7CisgICAgICBpZiAocmVzdWx0ID4gMjU1KSB7CisgICAgICAgIHJldHVybiAyNTU7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLSAgICByZXR1cm4gc3JjX2NvbG9yOworICAgIGNhc2UgRlhESUJfQkxFTkRfQ09MT1JCVVJOOiB7CisgICAgICBpZiAoc3JjX2NvbG9yID09IDApIHsKKyAgICAgICAgcmV0dXJuIHNyY19jb2xvcjsKKyAgICAgIH0KKyAgICAgIGludCByZXN1bHQgPSAoMjU1IC0gYmFja19jb2xvcikgKiAyNTUgLyBzcmNfY29sb3I7CisgICAgICBpZiAocmVzdWx0ID4gMjU1KSB7CisgICAgICAgIHJlc3VsdCA9IDI1NTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAyNTUgLSByZXN1bHQ7CisgICAgfQorICAgIGNhc2UgRlhESUJfQkxFTkRfSEFSRExJR0hUOgorICAgICAgaWYgKHNyY19jb2xvciA8IDEyOCkgeworICAgICAgICByZXR1cm4gKHNyY19jb2xvciAqIGJhY2tfY29sb3IgKiAyKSAvIDI1NTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfQkxFTkQoRlhESUJfQkxFTkRfU0NSRUVOLCBiYWNrX2NvbG9yLCAyICogc3JjX2NvbG9yIC0gMjU1KTsKKyAgICBjYXNlIEZYRElCX0JMRU5EX1NPRlRMSUdIVDogeworICAgICAgaWYgKHNyY19jb2xvciA8IDEyOCkgeworICAgICAgICByZXR1cm4gYmFja19jb2xvciAtCisgICAgICAgICAgICAgICAoMjU1IC0gMiAqIHNyY19jb2xvcikgKiBiYWNrX2NvbG9yICogKDI1NSAtIGJhY2tfY29sb3IpIC8gMjU1IC8KKyAgICAgICAgICAgICAgICAgICAyNTU7CisgICAgICB9CisgICAgICByZXR1cm4gYmFja19jb2xvciArCisgICAgICAgICAgICAgKDIgKiBzcmNfY29sb3IgLSAyNTUpICogKF9jb2xvcl9zcXJ0W2JhY2tfY29sb3JdIC0gYmFja19jb2xvcikgLworICAgICAgICAgICAgICAgICAyNTU7CisgICAgfQorICAgIGNhc2UgRlhESUJfQkxFTkRfRElGRkVSRU5DRToKKyAgICAgIHJldHVybiBiYWNrX2NvbG9yIDwgc3JjX2NvbG9yID8gc3JjX2NvbG9yIC0gYmFja19jb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiYWNrX2NvbG9yIC0gc3JjX2NvbG9yOworICAgIGNhc2UgRlhESUJfQkxFTkRfRVhDTFVTSU9OOgorICAgICAgcmV0dXJuIGJhY2tfY29sb3IgKyBzcmNfY29sb3IgLSAyICogYmFja19jb2xvciAqIHNyY19jb2xvciAvIDI1NTsKKyAgfQorICByZXR1cm4gc3JjX2NvbG9yOwogfQogc3RydWN0IF9SR0IgewotICAgIGludCByZWQ7Ci0gICAgaW50IGdyZWVuOwotICAgIGludCBibHVlOworICBpbnQgcmVkOworICBpbnQgZ3JlZW47CisgIGludCBibHVlOwogfTsKLXN0YXRpYyBpbmxpbmUgaW50IF9MdW0oX1JHQiBjb2xvcikKLXsKLSAgICByZXR1cm4gKGNvbG9yLnJlZCAqIDMwICsgY29sb3IuZ3JlZW4gKiA1OSArIGNvbG9yLmJsdWUgKiAxMSkgLyAxMDA7CitzdGF0aWMgaW5saW5lIGludCBfTHVtKF9SR0IgY29sb3IpIHsKKyAgcmV0dXJuIChjb2xvci5yZWQgKiAzMCArIGNvbG9yLmdyZWVuICogNTkgKyBjb2xvci5ibHVlICogMTEpIC8gMTAwOwogfQotc3RhdGljIF9SR0IgX0NsaXBDb2xvcihfUkdCIGNvbG9yKQotewotICAgIGludCBsID0gX0x1bShjb2xvcik7Ci0gICAgaW50IG4gPSBjb2xvci5yZWQ7Ci0gICAgaWYgKGNvbG9yLmdyZWVuIDwgbikgewotICAgICAgICBuID0gY29sb3IuZ3JlZW47Ci0gICAgfQotICAgIGlmIChjb2xvci5ibHVlIDwgbikgewotICAgICAgICBuID0gY29sb3IuYmx1ZTsKLSAgICB9Ci0gICAgaW50IHggPSBjb2xvci5yZWQ7Ci0gICAgaWYgKGNvbG9yLmdyZWVuID4geCkgewotICAgICAgICB4ID0gY29sb3IuZ3JlZW47Ci0gICAgfQotICAgIGlmIChjb2xvci5ibHVlID4geCkgewotICAgICAgICB4ID0gY29sb3IuYmx1ZTsKLSAgICB9Ci0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIGNvbG9yLnJlZCA9IGwgKyAoKGNvbG9yLnJlZCAtIGwpICogbCAvIChsIC0gbikpOwotICAgICAgICBjb2xvci5ncmVlbiA9IGwgKyAoKGNvbG9yLmdyZWVuIC0gbCkgKiBsIC8gKGwgLSBuKSk7Ci0gICAgICAgIGNvbG9yLmJsdWUgPSBsICsgKChjb2xvci5ibHVlIC0gbCkgKiBsIC8gKGwgLSBuKSk7Ci0gICAgfQotICAgIGlmICh4ID4gMjU1KSB7Ci0gICAgICAgIGNvbG9yLnJlZCA9IGwgKyAoKGNvbG9yLnJlZCAtIGwpICogKDI1NSAtIGwpIC8gKHggLSBsKSk7Ci0gICAgICAgIGNvbG9yLmdyZWVuID0gbCArICgoY29sb3IuZ3JlZW4gLSBsKSAqICgyNTUgLSBsKSAvICh4IC0gbCkpOwotICAgICAgICBjb2xvci5ibHVlID0gbCArICgoY29sb3IuYmx1ZSAtIGwpICogKDI1NSAtIGwpIC8gKHggLSBsKSk7Ci0gICAgfQorc3RhdGljIF9SR0IgX0NsaXBDb2xvcihfUkdCIGNvbG9yKSB7CisgIGludCBsID0gX0x1bShjb2xvcik7CisgIGludCBuID0gY29sb3IucmVkOworICBpZiAoY29sb3IuZ3JlZW4gPCBuKSB7CisgICAgbiA9IGNvbG9yLmdyZWVuOworICB9CisgIGlmIChjb2xvci5ibHVlIDwgbikgeworICAgIG4gPSBjb2xvci5ibHVlOworICB9CisgIGludCB4ID0gY29sb3IucmVkOworICBpZiAoY29sb3IuZ3JlZW4gPiB4KSB7CisgICAgeCA9IGNvbG9yLmdyZWVuOworICB9CisgIGlmIChjb2xvci5ibHVlID4geCkgeworICAgIHggPSBjb2xvci5ibHVlOworICB9CisgIGlmIChuIDwgMCkgeworICAgIGNvbG9yLnJlZCA9IGwgKyAoKGNvbG9yLnJlZCAtIGwpICogbCAvIChsIC0gbikpOworICAgIGNvbG9yLmdyZWVuID0gbCArICgoY29sb3IuZ3JlZW4gLSBsKSAqIGwgLyAobCAtIG4pKTsKKyAgICBjb2xvci5ibHVlID0gbCArICgoY29sb3IuYmx1ZSAtIGwpICogbCAvIChsIC0gbikpOworICB9CisgIGlmICh4ID4gMjU1KSB7CisgICAgY29sb3IucmVkID0gbCArICgoY29sb3IucmVkIC0gbCkgKiAoMjU1IC0gbCkgLyAoeCAtIGwpKTsKKyAgICBjb2xvci5ncmVlbiA9IGwgKyAoKGNvbG9yLmdyZWVuIC0gbCkgKiAoMjU1IC0gbCkgLyAoeCAtIGwpKTsKKyAgICBjb2xvci5ibHVlID0gbCArICgoY29sb3IuYmx1ZSAtIGwpICogKDI1NSAtIGwpIC8gKHggLSBsKSk7CisgIH0KKyAgcmV0dXJuIGNvbG9yOworfQorc3RhdGljIF9SR0IgX1NldEx1bShfUkdCIGNvbG9yLCBpbnQgbCkgeworICBpbnQgZCA9IGwgLSBfTHVtKGNvbG9yKTsKKyAgY29sb3IucmVkICs9IGQ7CisgIGNvbG9yLmdyZWVuICs9IGQ7CisgIGNvbG9yLmJsdWUgKz0gZDsKKyAgcmV0dXJuIF9DbGlwQ29sb3IoY29sb3IpOworfQorc3RhdGljIGludCBfU2F0KF9SR0IgY29sb3IpIHsKKyAgaW50IG4gPSBjb2xvci5yZWQ7CisgIGlmIChjb2xvci5ncmVlbiA8IG4pIHsKKyAgICBuID0gY29sb3IuZ3JlZW47CisgIH0KKyAgaWYgKGNvbG9yLmJsdWUgPCBuKSB7CisgICAgbiA9IGNvbG9yLmJsdWU7CisgIH0KKyAgaW50IHggPSBjb2xvci5yZWQ7CisgIGlmIChjb2xvci5ncmVlbiA+IHgpIHsKKyAgICB4ID0gY29sb3IuZ3JlZW47CisgIH0KKyAgaWYgKGNvbG9yLmJsdWUgPiB4KSB7CisgICAgeCA9IGNvbG9yLmJsdWU7CisgIH0KKyAgcmV0dXJuIHggLSBuOworfQorc3RhdGljIF9SR0IgX1NldFNhdChfUkdCIGNvbG9yLCBpbnQgcykgeworICBpbnQqIG1heCA9ICZjb2xvci5yZWQ7CisgIGludCogbWlkID0gJmNvbG9yLnJlZDsKKyAgaW50KiBtaW4gPSAmY29sb3IucmVkOworICBpZiAoY29sb3IuZ3JlZW4gPiAqbWF4KSB7CisgICAgbWF4ID0gJmNvbG9yLmdyZWVuOworICB9CisgIGlmIChjb2xvci5ibHVlID4gKm1heCkgeworICAgIG1heCA9ICZjb2xvci5ibHVlOworICB9CisgIGlmIChjb2xvci5ncmVlbiA8ICptaW4pIHsKKyAgICBtaW4gPSAmY29sb3IuZ3JlZW47CisgIH0KKyAgaWYgKGNvbG9yLmJsdWUgPCAqbWluKSB7CisgICAgbWluID0gJmNvbG9yLmJsdWU7CisgIH0KKyAgaWYgKCptYXggPT0gKm1pbikgeworICAgIGNvbG9yLnJlZCA9IDA7CisgICAgY29sb3IuZ3JlZW4gPSAwOworICAgIGNvbG9yLmJsdWUgPSAwOwogICAgIHJldHVybiBjb2xvcjsKLX0KLXN0YXRpYyBfUkdCIF9TZXRMdW0oX1JHQiBjb2xvciwgaW50IGwpCi17Ci0gICAgaW50IGQgPSBsIC0gX0x1bShjb2xvcik7Ci0gICAgY29sb3IucmVkICs9IGQ7Ci0gICAgY29sb3IuZ3JlZW4gKz0gZDsKLSAgICBjb2xvci5ibHVlICs9IGQ7Ci0gICAgcmV0dXJuIF9DbGlwQ29sb3IoY29sb3IpOwotfQotc3RhdGljIGludCBfU2F0KF9SR0IgY29sb3IpCi17Ci0gICAgaW50IG4gPSBjb2xvci5yZWQ7Ci0gICAgaWYgKGNvbG9yLmdyZWVuIDwgbikgewotICAgICAgICBuID0gY29sb3IuZ3JlZW47Ci0gICAgfQotICAgIGlmIChjb2xvci5ibHVlIDwgbikgewotICAgICAgICBuID0gY29sb3IuYmx1ZTsKLSAgICB9Ci0gICAgaW50IHggPSBjb2xvci5yZWQ7Ci0gICAgaWYgKGNvbG9yLmdyZWVuID4geCkgewotICAgICAgICB4ID0gY29sb3IuZ3JlZW47Ci0gICAgfQotICAgIGlmIChjb2xvci5ibHVlID4geCkgewotICAgICAgICB4ID0gY29sb3IuYmx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHggLSBuOwotfQotc3RhdGljIF9SR0IgX1NldFNhdChfUkdCIGNvbG9yLCBpbnQgcykKLXsKLSAgICBpbnQqIG1heCA9ICZjb2xvci5yZWQ7Ci0gICAgaW50KiBtaWQgPSAmY29sb3IucmVkOwotICAgIGludCogbWluID0gJmNvbG9yLnJlZDsKLSAgICBpZiAoY29sb3IuZ3JlZW4gPiAqbWF4KSB7Ci0gICAgICAgIG1heCA9ICZjb2xvci5ncmVlbjsKLSAgICB9Ci0gICAgaWYgKGNvbG9yLmJsdWUgPiAqbWF4KSB7Ci0gICAgICAgIG1heCA9ICZjb2xvci5ibHVlOwotICAgIH0KLSAgICBpZiAoY29sb3IuZ3JlZW4gPCAqbWluKSB7Ci0gICAgICAgIG1pbiA9ICZjb2xvci5ncmVlbjsKLSAgICB9Ci0gICAgaWYgKGNvbG9yLmJsdWUgPCAqbWluKSB7Ci0gICAgICAgIG1pbiA9ICZjb2xvci5ibHVlOwotICAgIH0KLSAgICBpZiAoKm1heCA9PSAqbWluKSB7Ci0gICAgICAgIGNvbG9yLnJlZCA9IDA7Ci0gICAgICAgIGNvbG9yLmdyZWVuID0gMDsKLSAgICAgICAgY29sb3IuYmx1ZSA9IDA7Ci0gICAgICAgIHJldHVybiBjb2xvcjsKLSAgICB9Ci0gICAgaWYgKG1heCA9PSAmY29sb3IucmVkKSB7Ci0gICAgICAgIGlmIChtaW4gPT0gJmNvbG9yLmdyZWVuKSB7Ci0gICAgICAgICAgICBtaWQgPSAmY29sb3IuYmx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1pZCA9ICZjb2xvci5ncmVlbjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobWF4ID09ICZjb2xvci5ncmVlbikgewotICAgICAgICBpZiAobWluID09ICZjb2xvci5yZWQpIHsKLSAgICAgICAgICAgIG1pZCA9ICZjb2xvci5ibHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWlkID0gJmNvbG9yLnJlZDsKLSAgICAgICAgfQorICB9CisgIGlmIChtYXggPT0gJmNvbG9yLnJlZCkgeworICAgIGlmIChtaW4gPT0gJmNvbG9yLmdyZWVuKSB7CisgICAgICBtaWQgPSAmY29sb3IuYmx1ZTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAobWluID09ICZjb2xvci5ncmVlbikgewotICAgICAgICAgICAgbWlkID0gJmNvbG9yLnJlZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1pZCA9ICZjb2xvci5ncmVlbjsKLSAgICAgICAgfQorICAgICAgbWlkID0gJmNvbG9yLmdyZWVuOwogICAgIH0KLSAgICBpZiAoKm1heCA+ICptaW4pIHsKLSAgICAgICAgKm1pZCA9ICgqbWlkIC0gKm1pbikgKiBzIC8gKCptYXggLSAqbWluKTsKLSAgICAgICAgKm1heCA9IHM7Ci0gICAgICAgICptaW4gPSAwOworICB9IGVsc2UgaWYgKG1heCA9PSAmY29sb3IuZ3JlZW4pIHsKKyAgICBpZiAobWluID09ICZjb2xvci5yZWQpIHsKKyAgICAgIG1pZCA9ICZjb2xvci5ibHVlOworICAgIH0gZWxzZSB7CisgICAgICBtaWQgPSAmY29sb3IucmVkOwogICAgIH0KLSAgICByZXR1cm4gY29sb3I7CisgIH0gZWxzZSB7CisgICAgaWYgKG1pbiA9PSAmY29sb3IuZ3JlZW4pIHsKKyAgICAgIG1pZCA9ICZjb2xvci5yZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIG1pZCA9ICZjb2xvci5ncmVlbjsKKyAgICB9CisgIH0KKyAgaWYgKCptYXggPiAqbWluKSB7CisgICAgKm1pZCA9ICgqbWlkIC0gKm1pbikgKiBzIC8gKCptYXggLSAqbWluKTsKKyAgICAqbWF4ID0gczsKKyAgICAqbWluID0gMDsKKyAgfQorICByZXR1cm4gY29sb3I7CiB9Ci12b2lkIF9SR0JfQmxlbmQoaW50IGJsZW5kX21vZGUsIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCByZXN1bHRzWzNdKQotewotICAgIF9SR0Igc3JjLCBiYWNrLCByZXN1bHQ7Ci0gICAgc3JjLnJlZCA9IHNyY19zY2FuWzJdOwotICAgIHNyYy5ncmVlbiA9IHNyY19zY2FuWzFdOwotICAgIHNyYy5ibHVlID0gc3JjX3NjYW5bMF07Ci0gICAgYmFjay5yZWQgPSBkZXN0X3NjYW5bMl07Ci0gICAgYmFjay5ncmVlbiA9IGRlc3Rfc2NhblsxXTsKLSAgICBiYWNrLmJsdWUgPSBkZXN0X3NjYW5bMF07Ci0gICAgc3dpdGNoIChibGVuZF9tb2RlKSB7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfSFVFOgotICAgICAgICAgICAgcmVzdWx0ID0gX1NldEx1bShfU2V0U2F0KHNyYywgX1NhdChiYWNrKSksIF9MdW0oYmFjaykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfU0FUVVJBVElPTjoKLSAgICAgICAgICAgIHJlc3VsdCA9IF9TZXRMdW0oX1NldFNhdChiYWNrLCBfU2F0KHNyYykpLCBfTHVtKGJhY2spKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0NPTE9SOgotICAgICAgICAgICAgcmVzdWx0ID0gX1NldEx1bShzcmMsIF9MdW0oYmFjaykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfTFVNSU5PU0lUWToKLSAgICAgICAgICAgIHJlc3VsdCA9IF9TZXRMdW0oYmFjaywgX0x1bShzcmMpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXN1bHRzWzBdID0gcmVzdWx0LmJsdWU7Ci0gICAgcmVzdWx0c1sxXSA9IHJlc3VsdC5ncmVlbjsKLSAgICByZXN1bHRzWzJdID0gcmVzdWx0LnJlZDsKK3ZvaWQgX1JHQl9CbGVuZChpbnQgYmxlbmRfbW9kZSwKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgaW50IHJlc3VsdHNbM10pIHsKKyAgX1JHQiBzcmMsIGJhY2ssIHJlc3VsdDsKKyAgc3JjLnJlZCA9IHNyY19zY2FuWzJdOworICBzcmMuZ3JlZW4gPSBzcmNfc2NhblsxXTsKKyAgc3JjLmJsdWUgPSBzcmNfc2NhblswXTsKKyAgYmFjay5yZWQgPSBkZXN0X3NjYW5bMl07CisgIGJhY2suZ3JlZW4gPSBkZXN0X3NjYW5bMV07CisgIGJhY2suYmx1ZSA9IGRlc3Rfc2NhblswXTsKKyAgc3dpdGNoIChibGVuZF9tb2RlKSB7CisgICAgY2FzZSBGWERJQl9CTEVORF9IVUU6CisgICAgICByZXN1bHQgPSBfU2V0THVtKF9TZXRTYXQoc3JjLCBfU2F0KGJhY2spKSwgX0x1bShiYWNrKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX1NBVFVSQVRJT046CisgICAgICByZXN1bHQgPSBfU2V0THVtKF9TZXRTYXQoYmFjaywgX1NhdChzcmMpKSwgX0x1bShiYWNrKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0NPTE9SOgorICAgICAgcmVzdWx0ID0gX1NldEx1bShzcmMsIF9MdW0oYmFjaykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9MVU1JTk9TSVRZOgorICAgICAgcmVzdWx0ID0gX1NldEx1bShiYWNrLCBfTHVtKHNyYykpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmVzdWx0c1swXSA9IHJlc3VsdC5ibHVlOworICByZXN1bHRzWzFdID0gcmVzdWx0LmdyZWVuOworICByZXN1bHRzWzJdID0gcmVzdWx0LnJlZDsKIH0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJNYXNrKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBwaXhlbF9jb3VudCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQotewotICAgIHNyY19zY2FuICs9IDM7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19zY2FuOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuOwotICAgICAgICBpZiAoIWJhY2tfYWxwaGEpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19SZ2JhMk1hc2sodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbiwgaW50IHBpeGVsX2NvdW50LCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X3NjYW47Ci0gICAgICAgIGlmICghYmFja19hbHBoYSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgfSBlbHNlIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJNYXNrKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQoteworaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMk1hc2sodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgc3JjX3NjYW4gKz0gMzsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfc2NhbjsKICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9VTklPTigqZGVzdF9zY2FuLCAqY2xpcF9zY2FuKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGNsaXBfc2NhbiArKzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIDB4ZmYsIHdpZHRoKTsKKyAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwogICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuOworICAgIGlmICghYmFja19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IHNyY19hbHBoYTsKKyAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIH0KKyAgICBkZXN0X3NjYW4rKzsKKyAgICBzcmNfc2NhbiArPSA0OworICB9CiB9Ci12b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJHcmF5YSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgcGl4ZWxfY291bnQsIGludCBibGVuZF90eXBlLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbiwgdWludDhfdCogZHN0X2FscGhhX3NjYW4sIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwordm9pZCBfQ29tcG9zaXRlUm93X1JnYmEyTWFzayh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7CiAgICAgfQotICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgICAgIGludCBibGVuZGVkX2NvbG9yOwotICAgICAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZHN0X2FscGhhX3NjYW47Ci0gICAgICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSAgRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBkc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgZHN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqZHN0X2FscGhhX3NjYW4gPSBGWERJQl9BTFBIQV9VTklPTihiYWNrX2FscGhhLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvICgqZHN0X2FscGhhX3NjYW4pOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JheTsKLSAgICAgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgICAgICBibGVuZGVkX2NvbG9yID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIGRzdF9hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gIEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgZHN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50OF90IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGRzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gRlhESUJfQUxQSEFfVU5JT04oYmFja19hbHBoYSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRzdF9hbHBoYV9zY2FuKTsKLSAgICAgICAgICAgICAgICB1aW50OF90IGdyYXk7Ci0gICAgICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIGRzdF9hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOworICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X3NjYW47CisgICAgaWYgKCFiYWNrX2FscGhhKSB7CisgICAgICAqZGVzdF9zY2FuID0gc3JjX2FscGhhOworICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7CisgICAgICAqZGVzdF9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CiAgICAgfQorICAgIGRlc3Rfc2NhbisrOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfUmdiMk1hc2sodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaWYgKGNsaXBfc2NhbikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX1VOSU9OKCpkZXN0X3NjYW4sICpjbGlwX3NjYW4pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBjbGlwX3NjYW4rKzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgMHhmZiwgd2lkdGgpOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJHcmF5YSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfYWxwaGFfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICB9CisgIGlmIChibGVuZF90eXBlKSB7CisgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBpbnQgYmxlbmRlZF9jb2xvcjsKICAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSAgRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgZHN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgZHN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IEZYRElCX0FMUEhBX1VOSU9OKGJhY2tfYWxwaGEsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRzdF9hbHBoYV9zY2FuKTsKLSAgICAgICAgICAgIHVpbnQ4X3QgZ3JheTsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZHN0X2FscGhhX3NjYW47CisgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKKyAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGRzdF9hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICBkc3RfYWxwaGFfc2NhbisrOworICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSAgRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgZHN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgZHN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IEZYRElCX0FMUEhBX1VOSU9OKGJhY2tfYWxwaGEsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRzdF9hbHBoYV9zY2FuKTsKLSAgICAgICAgICAgIHVpbnQ4X3QgZ3JheTsKLSAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGRzdF9hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyR3JheSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4sIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7Ci0gICAgdWludDhfdCBncmF5OwotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICB9Ci0gICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICAgICAgaW50IGJsZW5kZWRfY29sb3I7Ci0gICAgICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kZWRfY29sb3IgPSBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvciA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibGVuZGVkX2NvbG9yID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkdyYXkodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHNyY19CcHAsIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gTlVMTDsKLSAgICB1aW50OF90IGdyYXk7Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgIH0KLSAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgYmxlbmRlZF9jb2xvciA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyR3JheWEodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHNyY19CcHAsIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBOVUxMOwotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICB9Ci0gICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgaW50IGJsZW5kZWRfY29sb3I7Ci0gICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IDI1NTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICB1aW50OF90IGdyYXk7Ci0gICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICBibGVuZGVkX2NvbG9yID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvciA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhID0gMjU1OworICAgICAgICB1aW50OF90IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwogICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwogICAgICAgICB9CiAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIGRzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOwotICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAqZHN0X2FscGhhX3NjYW4gPSBGWERJQl9BTFBIQV9VTklPTihiYWNrX2FscGhhLCBzcmNfYWxwaGEpOworICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRzdF9hbHBoYV9zY2FuKTsKICAgICAgICAgdWludDhfdCBncmF5OwogICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOworICAgICAgICB9CisgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgICBibGVuZGVkX2NvbG9yID0KKyAgICAgICAgICAgICAgYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CisgICAgICAgIH0KKyAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIGRzdF9hbHBoYV9zY2FuKys7CisgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRzdF9hbHBoYV9zY2FuOworICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgZHN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICBkc3RfYWxwaGFfc2NhbisrOworICAgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gRlhESUJfQUxQSEFfVU5JT04oYmFja19hbHBoYSwgc3JjX2FscGhhKTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gKCpkc3RfYWxwaGFfc2Nhbik7CisgICAgICAgIHVpbnQ4X3QgZ3JheTsKKyAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgICAgfQorICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgZHN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZHN0X2FscGhhX3NjYW47CisgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICB9CisgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CisgICAgICAgICAgfQorICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKKyAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgZHN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB1aW50OF90IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgZHN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAqZHN0X2FscGhhX3NjYW4gPSBGWERJQl9BTFBIQV9VTklPTihiYWNrX2FscGhhLCBzcmNfYWxwaGEpOworICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gKCpkc3RfYWxwaGFfc2Nhbik7CisgICAgICB1aW50OF90IGdyYXk7CisgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOworICAgICAgfQorICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgZHN0X2FscGhhX3NjYW4rKzsKKyAgICAgIHNyY19zY2FuICs9IDM7CisgICAgfQorICB9IGVsc2UKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkc3RfYWxwaGFfc2NhbjsKKyAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOworICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBkc3RfYWxwaGFfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBkc3RfYWxwaGFfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgICpkc3RfYWxwaGFfc2NhbiA9IEZYRElCX0FMUEhBX1VOSU9OKGJhY2tfYWxwaGEsIHNyY19hbHBoYSk7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRzdF9hbHBoYV9zY2FuKTsKKyAgICAgIHVpbnQ4X3QgZ3JheTsKKyAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CisgICAgICB9CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBkc3RfYWxwaGFfc2NhbisrOworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyR3JheSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBOVUxMOworICB1aW50OF90IGdyYXk7CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICB9CisgIGlmIChibGVuZF90eXBlKSB7CisgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBpbnQgYmxlbmRlZF9jb2xvcjsKKyAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICAgICAgYmxlbmRlZF9jb2xvciA9CisgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CisgICAgICAgICAgfQorICAgICAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKICAgICAgICAgfQotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyQXJnYih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgcGl4ZWxfY291bnQsIGludCBibGVuZF90eXBlLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pCi17Ci0gICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgaWYgKGRlc3RfYWxwaGFfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChzcmNfYWxwaGFfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCAoRlhBUkdCX0dFVERJQihzcmNfc2NhbikgJiAweGZmZmZmZikgfCAoc3JjX2FscGhhIDw8IDI0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfQ09QWShkZXN0X3NjYW4sIHNyY19zY2FuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuKSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgoc3JjX2FscGhhIDw8IDI0KSwgc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgoKnNyY19hbHBoYV9zY2FuIDw8IDI0KSwgc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogKCpzcmNfYWxwaGFfc2NhbiArKykgLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0UoKnNyY19zY2FuLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4pIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSAqc3JjX2FscGhhX3NjYW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuICsrKSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvciArKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgKnNyY19zY2FuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRSgqc3JjX3NjYW4sIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgc3JjX0JwcCwKLSAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKQotewotICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7Ci0gICAgaWYgKGRlc3RfYWxwaGFfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX0JwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzBdKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAweGZmOwotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKLSAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAweGZmOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAweGZmOwotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKLSAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICB9Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBzcmNfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikKLXsKLSAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICAgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gKmNsaXBfc2NhbiArKzsKLSAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKLSAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gKmNsaXBfc2NhbiArKzsKLSAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKLSAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBzcmNfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikKLXsKLSAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICAgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IDI1NTsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvciArKykgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICAgICAgfQotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXAodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgc3JjX0JwcCwKLSAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKQotewotICAgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpZiAoc3JjX0JwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIDB4ZmYwMDAwMDAgfCBGWEFSR0JfR0VURElCKHNyY19zY2FuKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzBdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAweGZmOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICAgICAgfQotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfQmxlbmQodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKQotewotICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGludCBkZXN0X2dhcCA9IGRlc3RfQnBwIC0gMzsKLSAgICBpZiAoc3JjX2FscGhhX3NjYW4gPT0gTlVMTCkgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGJhY2tfY29sb3IgPSAqZGVzdF9zY2FuOwotICAgICAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgdWludDhfdCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gKCpzcmNfYWxwaGFfc2NhbisrKSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGJhY2tfY29sb3IgPSAqZGVzdF9zY2FuOwotICAgICAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKLSAgICAgICAgfQotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBkZXN0X0JwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbikKLXsKLSAgICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7Ci0gICAgaWYgKHNyY19hbHBoYV9zY2FuID09IE5VTEwpIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgdWludDhfdCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9ICgqc3JjX2FscGhhX3NjYW4rKykgKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHApCi17Ci0gICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwotICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKLSAgICAgICAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfY29sb3IpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IGJsZW5kZWQ7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXAodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQotewotICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGludCBkZXN0X2dhcCA9IGRlc3RfQnBwIC0gMzsKLSAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgdWludDhfdCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuICsrOwotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47Ci0gICAgICAgICAgICBpbnQgYmFja19jb2xvciA9ICpkZXN0X3NjYW47Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfY29sb3IpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCkKLXsKLSAgICBpZiAoZGVzdF9CcHAgPT0gc3JjX0JwcCkgewotICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGggKiBkZXN0X0JwcCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblswXTsKLSAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07Ci0gICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzJdOwotICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHAsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblsyXTsKLSAgICAgICAgfSBlbHNlIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHAgLSAyOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcCAtIDI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyQXJnYl9UcmFuc2Zvcm0odWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHBpeGVsX2NvdW50LCBpbnQgYmxlbmRfdHlwZSwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbiwgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgdWludDhfdCogZHAgPSBzcmNfY2FjaGVfc2NhbjsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgICAgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgZHBbM10gPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGRwICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfYWxwaGFfc2NhbiA9IE5VTEw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIHBpeGVsX2NvdW50KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgZHBbM10gPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIGRwICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19jYWNoZV9zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gKysgPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19jYWNoZV9zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCAqc3JjX2NhY2hlX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfY2FjaGVfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfY2FjaGVfc2NhbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2NhY2hlX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHBpeGVsX2NvdW50LCBibGVuZF90eXBlLCBjbGlwX3NjYW4sIGRlc3RfYWxwaGFfc2Nhbiwgc3JjX2FscGhhX3NjYW4pOwotfQotdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0odWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IHNyY19CcHAsCi0gICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgIGlmIChzcmNfQnBwID09IDMpIHsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdWludDhfdCogZHAgPSBzcmNfY2FjaGVfc2NhbjsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICBkcCArPSAzOwotICAgICAgICB9Ci0gICAgfQotICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBibGVuZF90eXBlLCAzLCBkZXN0X2FscGhhX3NjYW4pOwotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgc3JjX0JwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sIHVpbnQ4X3QqIHNyY19jYWNoZV9zY2FuLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICBpZiAoc3JjX0JwcCA9PSAzKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgZHAgKz0gMzsKLSAgICAgICAgfQotICAgIH0KLSAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIGJsZW5kX3R5cGUsIDMsIGNsaXBfc2NhbiwgZGVzdF9hbHBoYV9zY2FuKTsKLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBzcmNfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgIGlmIChzcmNfQnBwID09IDMpIHsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdWludDhfdCogZHAgPSBzcmNfY2FjaGVfc2NhbjsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICBkcCArPSAzOwotICAgICAgICB9Ci0gICAgfQotICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCAzLCBjbGlwX3NjYW4sIGRlc3RfYWxwaGFfc2Nhbik7Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBzcmNfQnBwLAotICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sIHVpbnQ4X3QqIHNyY19jYWNoZV9zY2FuLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICBpZiAoc3JjX0JwcCA9PSAzKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgZHAgKz0gMzsKLSAgICAgICAgfQotICAgIH0KLSAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCAzLCBkZXN0X2FscGhhX3NjYW4pOwotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZF9UcmFuc2Zvcm0odWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuLCB1aW50OF90KiBzcmNfY2FjaGVfc2Nhbiwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICAgICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgdWludDhfdCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICAgICAgICAgIHNyY19jYWNoZV9zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfY2FjaGVfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgYmFja19jb2xvciA9ICpkZXN0X3NjYW47Ci0gICAgICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsICpzcmNfY2FjaGVfc2Nhbik7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19jYWNoZV9zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZChkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCB3aWR0aCwgYmxlbmRfdHlwZSwgZGVzdF9CcHAsIGNsaXBfc2Nhbiwgc3JjX2FscGhhX3NjYW4pOwotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBkZXN0X0JwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbiwgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgICAgICBzcmNfY2FjaGVfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfY2FjaGVfc2Nhbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX2NhY2hlX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBjbGlwX3NjYW4sIHNyY19hbHBoYV9zY2FuKTsKLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXBfVHJhbnNmb3JtKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHAsCi0gICAgICAgIHVpbnQ4X3QqIHNyY19jYWNoZV9zY2FuLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICBpZiAoc3JjX0JwcCA9PSAzKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgZHAgKz0gMzsKLSAgICAgICAgfQotICAgIH0KLSAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBibGVuZF90eXBlLCBkZXN0X0JwcCwgMyk7Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcF9UcmFuc2Zvcm0odWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICB1aW50OF90KiBzcmNfY2FjaGVfc2Nhbiwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgaWYgKHNyY19CcHAgPT0gMykgewotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGRwICs9IDM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIGJsZW5kX3R5cGUsIGRlc3RfQnBwLCAzLCBjbGlwX3NjYW4pOwotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHAsCi0gICAgICAgIHVpbnQ4X3QqIHNyY19jYWNoZV9zY2FuLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICBpZiAoc3JjX0JwcCA9PSAzKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgZHAgKz0gMzsKLSAgICAgICAgfQotICAgIH0KLSAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCAzKTsKLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXBfVHJhbnNmb3JtKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICB1aW50OF90KiBzcmNfY2FjaGVfc2Nhbiwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgaWYgKHNyY19CcHAgPT0gMykgewotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGRwICs9IDM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcChkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIDMsIGNsaXBfc2Nhbik7Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzhicHBQYWwyR3JheSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBjb25zdCB1aW50OF90KiBwUGFsZXR0ZSwgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKQotewotICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgYmxlbmRlZF9jb2xvciA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvciA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3I7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJsZW5kZWRfY29sb3IgPSBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICB9Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd184YnBwUGFsMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHBQYWxldHRlLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKQotewotICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvICgqZGVzdF9hbHBoYV9zY2FuKTsKLSAgICAgICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJsZW5kZWRfY29sb3IgPSBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDhfdCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRlc3RfYWxwaGFfc2Nhbik7Ci0gICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gZ3JheTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgYmxlbmRlZF9jb2xvciA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvciA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gZ3JheTsKLSAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICB9Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd18xYnBwUGFsMkdyYXkodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFBhbGV0dGUsIGludCBwaXhlbF9jb3VudCwgaW50IGJsZW5kX3R5cGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKLXsKLSAgICBpbnQgcmVzZXRfZ3JheSA9IHBQYWxldHRlWzBdOwotICAgIGludCBzZXRfZ3JheSA9IHBQYWxldHRlWzFdOwotICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgICAgIGludCBibGVuZGVkX2NvbG9yOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90IGdyYXkgPSAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSA/IHNldF9ncmF5IDogcmVzZXRfZ3JheTsKLSAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICBibGVuZGVkX2NvbG9yID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvciA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgdWludDhfdCBncmF5ID0gKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgPyBzZXRfZ3JheSA6IHJlc2V0X2dyYXk7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd18xYnBwUGFsMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwUGFsZXR0ZSwgaW50IHBpeGVsX2NvdW50LCBpbnQgYmxlbmRfdHlwZSwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikKLXsKLSAgICBpbnQgcmVzZXRfZ3JheSA9IHBQYWxldHRlWzBdOwotICAgIGludCBzZXRfZ3JheSA9IHBQYWxldHRlWzFdOwotICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgICAgIGludCBibGVuZGVkX2NvbG9yOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90IGdyYXkgPSAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSA/IHNldF9ncmF5IDogcmVzZXRfZ3JheTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OwotICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gKysgPSAyNTU7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgYmxlbmRlZF9jb2xvciA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICB1aW50OF90IGdyYXkgPSAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSA/IHNldF9ncmF5IDogcmVzZXRfZ3JheTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gZ3JheTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gKysgPSAyNTU7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgRlhfRFdPUkQqIHBQYWxldHRlLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgIGludCBEZXN0QnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKQotewotICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgICAgICBpbnQgZGVzdF9nYXAgPSBEZXN0QnBwIC0gMzsKLSAgICAgICAgRlhfQVJHQiBhcmdiID0gMDsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgYXJnYiA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKLSAgICAgICAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gMDsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSAoKnNyY19hbHBoYV9zY2FuKyspICogKCpjbGlwX3NjYW4rKykgLyAyNTU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYX0FSR0IgYXJnYiA9IDA7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgICAgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICAgICAgICBpbnQgc3JjX2cgPSBGWEFSR0JfRyhhcmdiKTsKLSAgICAgICAgICAgIGludCBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGNsaXBfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChEZXN0QnBwID09IDQpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICB9Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYl9Ob0JsZW5kKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBzcmNfbGVmdCwKLSAgICAgICAgRlhfRFdPUkQqIHBQYWxldHRlLCBpbnQgcGl4ZWxfY291bnQsIGludCBEZXN0QnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgaW50IHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2I7Ci0gICAgaW50IHNldF9yLCBzZXRfZywgc2V0X2I7Ci0gICAgcmVzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzBdKTsKLSAgICByZXNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMF0pOwotICAgIHJlc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVswXSk7Ci0gICAgc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVsxXSk7Ci0gICAgc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVsxXSk7Ci0gICAgc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVsxXSk7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX3IsIHNyY19nLCBzcmNfYjsKLSAgICAgICAgaWYgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgewotICAgICAgICAgICAgc3JjX3IgPSBzZXRfcjsKLSAgICAgICAgICAgIHNyY19nID0gc2V0X2c7Ci0gICAgICAgICAgICBzcmNfYiA9IHNldF9iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX3IgPSByZXNldF9yOwotICAgICAgICAgICAgc3JjX2cgPSByZXNldF9nOwotICAgICAgICAgICAgc3JjX2IgPSByZXNldF9iOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGNsaXBfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoRGVzdEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgfQotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJBcmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLAotICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pCi17Ci0gICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOwotICAgICAgICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7Ci0gICAgICAgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKLSAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4pIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhLCBzcmNfciwgc3JjX2csIHNyY19iKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKCpzcmNfYWxwaGFfc2Nhbiwgc3JjX3IsIHNyY19nLCBzcmNfYikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4rKykgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICB9CiAgICAgfSBlbHNlCi0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKLSAgICAgICAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gMjU1OwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiYV9Ob0JsZW5kKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKQotewotICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBGWF9BUkdCIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKLSAgICAgICAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogKCpzcmNfYWxwaGFfc2NhbikgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gKysgPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9ICpzcmNfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IHNyY19iOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBzcmNfZzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX3I7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4rKykgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gKysgPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBGWF9BUkdCIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgICAgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICAgICAgICBpbnQgc3JjX2cgPSBGWEFSR0JfRyhhcmdiKTsKLSAgICAgICAgICAgIGludCBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOwotICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDI1NTsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJBcmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHNyY19sZWZ0LCBpbnQgd2lkdGgsCi0gICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQotewotICAgIGludCByZXNldF9yLCByZXNldF9nLCByZXNldF9iOwotICAgIGludCBzZXRfciwgc2V0X2csIHNldF9iOwotICAgIHJlc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVswXSk7Ci0gICAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKLSAgICByZXNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMF0pOwotICAgIHNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMV0pOwotICAgIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOwotICAgIHNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMV0pOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7Ci0gICAgICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKLSAgICAgICAgICAgIHNyY19yID0gc2V0X3I7Ci0gICAgICAgICAgICBzcmNfZyA9IHNldF9nOwotICAgICAgICAgICAgc3JjX2IgPSBzZXRfYjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19yID0gcmVzZXRfcjsKLSAgICAgICAgICAgIHNyY19nID0gcmVzZXRfZzsKLSAgICAgICAgICAgIHNyY19iID0gcmVzZXRfYjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAyNTU7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JhX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHNyY19sZWZ0LCBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBQYWxldHRlLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKQotewotICAgIGludCByZXNldF9yLCByZXNldF9nLCByZXNldF9iOwotICAgIGludCBzZXRfciwgc2V0X2csIHNldF9iOwotICAgIHJlc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVswXSk7Ci0gICAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKLSAgICByZXNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMF0pOwotICAgIHNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMV0pOwotICAgIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOwotICAgIHNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMV0pOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7Ci0gICAgICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKLSAgICAgICAgICAgIHNyY19yID0gc2V0X3I7Ci0gICAgICAgICAgICBzcmNfZyA9IHNldF9nOwotICAgICAgICAgICAgc3JjX2IgPSBzZXRfYjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19yID0gcmVzZXRfcjsKLSAgICAgICAgICAgIHNyY19nID0gcmVzZXRfZzsKLSAgICAgICAgICAgIHNyY19iID0gcmVzZXRfYjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syQXJnYih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgbWFza19hbHBoYSwgaW50IHNyY19yLCBpbnQgc3JjX2csIGludCBzcmNfYiwgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwogICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhLCBzcmNfciwgc3JjX2csIHNyY19iKSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgICAgICAgICB1aW50OF90IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKLSAgICAgICAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7Ci0gICAgICAgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOwotICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19nKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiYSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgbWFza19hbHBoYSwgaW50IHNyY19yLCBpbnQgc3JjX2csIGludCBzcmNfYiwgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX2I7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX2c7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX3I7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gc3JjX2FscGhhOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgICAgICAgICB1aW50OF90IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKLSAgICAgICAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7Ci0gICAgICAgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOwotICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19nKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2IodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IG1hc2tfYWxwaGEsIGludCBzcmNfciwgaW50IHNyY19nLCBpbnQgc3JjX2IsIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIGludCBCcHAsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX3NjYW5bM107Ci0gICAgICAgICAgICBzcmNfc2NhblswXSA9IHNyY19iOwotICAgICAgICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgc3JjX2FscGhhKTsKLSAgICAgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfYik7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2cpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBzcmNfYWxwaGEpOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJNYXNrKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3Rfc2NhbjsKLSAgICAgICAgaWYgKCFiYWNrX2FscGhhKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syR3JheSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgbWFza19hbHBoYSwgaW50IHNyY19ncmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19ncmF5LCBzcmNfYWxwaGEpOworICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgICAgIGJsZW5kZWRfY29sb3IgPQorICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOworICAgICAgICAgIH0KKyAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIHNyY19hbHBoYSk7CiAgICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICsrOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOworICAgICAgICB9CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBzcmNfYWxwaGEpOworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbiArPSAzOworICAgIH0KKyAgfSBlbHNlCisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOworICAgICAgICB9CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBzcmNfYWxwaGEpOworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbiArPSA0OwogICAgIH0KIH0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJHcmF5YSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgbWFza19hbHBoYSwgaW50IHNyY19ncmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX2dyYXk7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gc3JjX2FscGhhOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19ncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQml0TWFzazJBcmdiKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgc3JjX3IsIGludCBzcmNfZywgaW50IHNyY19iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsIGludCBwaXhlbF9jb3VudCwgaW50IGJsZW5kX3R5cGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKLXsKLSAgICBpZiAoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwgJiYgY2xpcF9zY2FuID09IE5VTEwgJiYgbWFza19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgRlhfQVJHQiBhcmdiID0gRlhBUkdCX01BS0UoMHhmZiwgc3JjX3IsIHNyY19nLCBzcmNfYik7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgYXJnYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgc3JjX3IsIHNyY19nLCBzcmNfYikpOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgICAgICAgICB1aW50OF90IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKLSAgICAgICAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7Ci0gICAgICAgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOwotICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19nKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQml0TWFzazJSZ2JhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgc3JjX3IsIGludCBzcmNfZywgaW50IHNyY19iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsIGludCBwaXhlbF9jb3VudCwgaW50IGJsZW5kX3R5cGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKQotewotICAgIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJiBjbGlwX3NjYW4gPT0gTlVMTCAmJiBtYXNrX2FscGhhID09IDI1NSkgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpZiAoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX2I7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX2c7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX3I7Ci0gICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IG1hc2tfYWxwaGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IHNyY19iOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IHNyY19nOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IHNyY19yOwotICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IG1hc2tfYWxwaGE7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKLSAgICAgICAgICAgIHNyY19zY2FuWzBdID0gc3JjX2I7Ci0gICAgICAgICAgICBzcmNfc2NhblsxXSA9IHNyY19nOwotICAgICAgICAgICAgc3JjX3NjYW5bMl0gPSBzcmNfcjsKLSAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX3IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQml0TWFzazJSZ2IodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IG1hc2tfYWxwaGEsIGludCBzcmNfciwgaW50IHNyY19nLCBpbnQgc3JjX2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LCBpbnQgcGl4ZWxfY291bnQsIGludCBibGVuZF90eXBlLCBpbnQgQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmIGNsaXBfc2NhbiA9PSBOVUxMICYmIG1hc2tfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfcjsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIGlmICghKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkpIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKLSAgICAgICAgICAgIHNyY19zY2FuWzBdID0gc3JjX2I7Ci0gICAgICAgICAgICBzcmNfc2NhblsxXSA9IHNyY19nOwotICAgICAgICAgICAgc3JjX3NjYW5bMl0gPSBzcmNfcjsKLSAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzFdLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBzcmNfYWxwaGEpOwotICAgICAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19nKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBzcmNfYWxwaGEpOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMk1hc2sodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IG1hc2tfYWxwaGEsIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X3NjYW47Ci0gICAgICAgIGlmICghYmFja19hbHBoYSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgfSBlbHNlIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X0JpdE1hc2syR3JheSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgbWFza19hbHBoYSwgaW50IHNyY19ncmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsIGludCBwaXhlbF9jb3VudCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQotewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgewotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2dyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICsrOwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgc3JjX2dyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsIGludCBwaXhlbF9jb3VudCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKQotewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgewotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX2dyYXk7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gc3JjX2FscGhhOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19ncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgcGl4ZWxfY291bnQsIGludCBibGVuZF90eXBlLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyR3JheSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBOVUxMOworICB1aW50OF90IGdyYXk7CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICB9CisgIGlmIChibGVuZF90eXBlKSB7CiAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICBpbnQgYmxlbmRlZF9jb2xvcjsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CisgICAgICB9CisgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgIGJsZW5kZWRfY29sb3IgPQorICAgICAgICAgICAgYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CisgICAgICB9CisgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKKyAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICB9CisgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKKyAgICB9IGVsc2UgeworICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7CisgICAgfQorICAgIGRlc3Rfc2NhbisrOworICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyR3JheWEodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBOVUxMOworICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgfQorICBpZiAoYmxlbmRfdHlwZSkgeworICAgIGludCBibGVuZGVkX2NvbG9yOworICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOworICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgc3JjX2FscGhhID0gMjU1OworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgdWludDhfdCBncmF5OworICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgIH0KKyAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgYmxlbmRlZF9jb2xvciA9CisgICAgICAgICAgICBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKKyAgICAgIH0KKyAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGEgPSAyNTU7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgdWludDhfdCBncmF5OworICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOworICAgIH0gZWxzZSB7CisgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CisgICAgfQorICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgfQorfQordm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyQXJnYih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKKyAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBpZiAoZGVzdF9hbHBoYV9zY2FuID09IE5VTEwpIHsKKyAgICBpZiAoc3JjX2FscGhhX3NjYW4gPT0gTlVMTCkgeworICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gMDsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgICBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwogICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzJdOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGWEFSR0JfUkdCT1JERVJDT1BZKGRlc3Rfc2Nhbiwgc3JjX3NjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7CisgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgKEZYQVJHQl9HRVRESUIoc3JjX3NjYW4pICYgMHhmZmZmZmYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNyY19hbHBoYSA8PCAyNCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGWEFSR0JfQ09QWShkZXN0X3NjYW4sIHNyY19zY2FuKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKICAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7CisgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKICAgICAgICAgfQogICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKLSAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7Ci0gICAgICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5baW5kZXhdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRSgqc3JjX3NjYW4sIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5baW5kZXhdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5baW5kZXhdLCAqc3JjX3NjYW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY19zY2FuICsrOworICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICAgIGlmIChibGVuZF90eXBlKSB7CisgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sICpzcmNfc2Nhbik7CisgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0UoKnNyY19zY2FuLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgc3JjX3NjYW4rKzsKICAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4pIC8gMjU1OworICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKChzcmNfYWxwaGEgPDwgMjQpLCBzcmNfc2NhblsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhblsxXSwgKnNyY19zY2FuKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfTUFLRSgoKnNyY19hbHBoYV9zY2FuIDw8IDI0KSwgc3JjX3NjYW5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICBzcmNfYWxwaGFfc2NhbisrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwpIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4rKykgLyAyNTU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICAgIGlmIChibGVuZF90eXBlKSB7CisgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sICpzcmNfc2Nhbik7CisgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0UoKnNyY19zY2FuLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4pIC8gMjU1OworICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9ICpzcmNfYWxwaGFfc2NhbjsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuKyspIC8gMjU1OworICAgICAgICB9CisgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOworICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgICBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCAqc3JjX3NjYW4pOworICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIHNyY19zY2FuKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKKyAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfc2NhblszXTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgKnNyY19zY2FuKTsKKyAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRSgqc3JjX3NjYW4sIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICBzcmNfc2NhbisrOworICAgICAgICB9CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgfQorICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKKyAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICBpZiAoZGVzdF9hbHBoYV9zY2FuID09IE5VTEwpIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgaWYgKHNyY19CcHAgPT0gNCkgeworICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuWzBdKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZGVzdF9zY2FuWzNdID0gMHhmZjsKKyAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICB9CisgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICBpbnQgc3JjX2NvbG9yID0gKnNyY19zY2FuOworICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfY29sb3IpOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMHhmZjsKKyAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAweGZmOworICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47CisgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19jb2xvcik7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfY29sb3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgfQorICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKKyAgaWYgKGRlc3RfYWxwaGFfc2NhbiA9PSBOVUxMKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gKmNsaXBfc2NhbisrOworICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47CisgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19jb2xvcik7CisgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfY29sb3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gKmNsaXBfc2NhbisrOworICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSAzOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKKyAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19jb2xvciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICB9CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKKyAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKKyAgaWYgKGRlc3RfYWxwaGFfc2NhbiA9PSBOVUxMKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAyNTU7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSAzOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICB9CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7CisgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgaWYgKHNyY19CcHAgPT0gNCkgeworICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgMHhmZjAwMDAwMCB8IEZYQVJHQl9HRVRESUIoc3JjX3NjYW4pKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMF0pKTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDB4ZmY7CisgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgIH0KKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKKyAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7CisgIGlmIChzcmNfYWxwaGFfc2NhbiA9PSBOVUxMKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgaW50IGJhY2tfY29sb3IgPSAqZGVzdF9zY2FuOworICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCAqc3JjX3NjYW4pOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSAoKnNyY19hbHBoYV9zY2FuKyspICogKCpjbGlwX3NjYW4rKykgLyAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKKyAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgKnNyY19zY2FuKTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgIH0KKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbikgeworICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7CisgIGlmIChzcmNfYWxwaGFfc2NhbiA9PSBOVUxMKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSAoKnNyY19hbHBoYV9zY2FuKyspICogKCpjbGlwX3NjYW4rKykgLyAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgIH0KKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOworICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICB9CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKKyAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47CisgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19jb2xvcik7CisgICAgICAqZGVzdF9zY2FuID0gYmxlbmRlZDsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgIGludCBkZXN0X2dhcCA9IGRlc3RfQnBwIC0gMzsKKyAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgdWludDhfdCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuKys7CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgIH0KKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKKyAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2NvbG9yKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwKSB7CisgIGlmIChkZXN0X0JwcCA9PSBzcmNfQnBwKSB7CisgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoICogZGVzdF9CcHApOworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblswXTsKKyAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKKyAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblsyXTsKKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzBdOworICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07CisgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblsyXTsKKyAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwIC0gMjsKKyAgICAgIHNyY19zY2FuICs9IHNyY19CcHAgLSAyOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgdWludDhfdCogZHAgPSBzcmNfY2FjaGVfc2NhbjsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgaWYgKGRlc3RfYWxwaGFfc2NhbiA9PSBOVUxMKSB7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKKyAgICAgICAgZHBbM10gPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgZHAgKz0gNDsKKyAgICAgIH0KKyAgICAgIHNyY19hbHBoYV9zY2FuID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCBwaXhlbF9jb3VudCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgeworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7CisgICAgICAgIGRwWzNdID0gc3JjX3NjYW5bM107CisgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgIGRwICs9IDQ7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OworICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19zY2FuWzNdOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwpIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OworICAgICAgICB9CisgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOworICAgICAgICAgIHNyY19jYWNoZV9zY2FuICs9IDM7CisgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfY2FjaGVfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgICBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCAqc3JjX2NhY2hlX3NjYW4pOworICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfY2FjaGVfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX2NhY2hlX3NjYW4sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgc3JjX2NhY2hlX3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBfQ29tcG9zaXRlUm93X0FyZ2IyQXJnYihkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCBwaXhlbF9jb3VudCwgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBkZXN0X2FscGhhX3NjYW4sIHNyY19hbHBoYV9zY2FuKTsKK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9Ob0NsaXBfVHJhbnNmb3JtKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19jYWNoZV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICBpZiAoc3JjX0JwcCA9PSAzKSB7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICBkcCArPSAzOworICAgIH0KKyAgfQorICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcChkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSwgMywgZGVzdF9hbHBoYV9zY2FuKTsKK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfQ2xpcF9UcmFuc2Zvcm0oCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICBpbnQgc3JjX0JwcCwKKyAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAorICAgIHVpbnQ4X3QqIHNyY19jYWNoZV9zY2FuLAorICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgaWYgKHNyY19CcHAgPT0gMykgeworICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogZHAgPSBzcmNfY2FjaGVfc2NhbjsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7CisgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgZHAgKz0gMzsKKyAgICB9CisgIH0KKyAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSwgMywgY2xpcF9zY2FuLCBkZXN0X2FscGhhX3NjYW4pOworfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXBfVHJhbnNmb3JtKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IHNyY19CcHAsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwKKyAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgIGlmIChzcmNfQnBwID09IDMpIHsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGRwICs9IDM7CisgICAgfQorICB9CisgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIGRlc3RfYWxwaGFfc2Nhbik7Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSgKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBzcmNfQnBwLAorICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwKKyAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgIGlmIChzcmNfQnBwID09IDMpIHsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGRwICs9IDM7CisgICAgfQorICB9CisgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKTsKK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfQmxlbmRfVHJhbnNmb3JtKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGJsZW5kX3R5cGUsCisgICAgaW50IGRlc3RfQnBwLAorICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbiwKKyAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgIGlmIChzcmNfYWxwaGFfc2NhbikgeworICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCAxKTsKKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgICB9CisgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICAgICAgc3JjX2NhY2hlX3NjYW4gKz0gMzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX2NhY2hlX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgaW50IGJhY2tfY29sb3IgPSAqZGVzdF9zY2FuOworICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCAqc3JjX2NhY2hlX3NjYW4pOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19jYWNoZV9zY2FuKys7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfQnBwLCBjbGlwX3NjYW4sIHNyY19hbHBoYV9zY2FuKTsKK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZF9UcmFuc2Zvcm0oCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgZGVzdF9CcHAsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuLAorICAgIHVpbnQ4X3QqIHNyY19jYWNoZV9zY2FuLAorICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIDEpOworICAgICAgdWludDhfdCBzcmNfYWxwaGE7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdICogKCpjbGlwX3NjYW4rKykgLyAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKKyAgICAgIH0KKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICAgICAgc3JjX2NhY2hlX3NjYW4gKz0gMzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19jYWNoZV9zY2FuLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgc3JjX2NhY2hlX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCB3aWR0aCwgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIHNyY19hbHBoYV9zY2FuKTsKK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXBfVHJhbnNmb3JtKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGJsZW5kX3R5cGUsCisgICAgaW50IGRlc3RfQnBwLAorICAgIGludCBzcmNfQnBwLAorICAgIHVpbnQ4X3QqIHNyY19jYWNoZV9zY2FuLAorICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgaWYgKHNyY19CcHAgPT0gMykgeworICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogZHAgPSBzcmNfY2FjaGVfc2NhbjsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7CisgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgZHAgKz0gMzsKKyAgICB9CisgIH0KKyAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcChkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF90eXBlLCBkZXN0X0JwcCwgMyk7Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcF9UcmFuc2Zvcm0odWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19jYWNoZV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgaWYgKHNyY19CcHAgPT0gMykgeworICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogZHAgPSBzcmNfY2FjaGVfc2NhbjsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7CisgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgZHAgKz0gMzsKKyAgICB9CisgIH0KKyAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfQnBwLCAzLCBjbGlwX3NjYW4pOworfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSgKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBkZXN0X0JwcCwKKyAgICBpbnQgc3JjX0JwcCwKKyAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgIGlmIChzcmNfQnBwID09IDMpIHsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGRwICs9IDM7CisgICAgfQorICB9CisgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcChkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfQnBwLCAzKTsKK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXBfVHJhbnNmb3JtKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGRlc3RfQnBwLAorICAgIGludCBzcmNfQnBwLAorICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgIGlmIChzcmNfQnBwID09IDMpIHsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGRwICs9IDM7CisgICAgfQorICB9CisgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIGNsaXBfc2Nhbik7Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzhicHBQYWwyR3JheSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbikgeworICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKKyAgICBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICB9CisgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgICBibGVuZGVkX2NvbG9yID0KKyAgICAgICAgICAgICAgYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CisgICAgICAgIH0KKyAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKKyAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBzcmNfYWxwaGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgICBibGVuZGVkX2NvbG9yID0KKyAgICAgICAgICAgICAgYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CisgICAgICAgIH0KKyAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKKyAgICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgeworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjbGlwX3NjYW5bY29sXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd184YnBwUGFsMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbikgeworICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKKyAgICBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICB9CisgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPQorICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvICgqZGVzdF9hbHBoYV9zY2FuKTsKKyAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICAgIGJsZW5kZWRfY29sb3IgPQorICAgICAgICAgICAgICBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKKyAgICAgICAgfQorICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7CisgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKKyAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdWludDhfdCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvICgqZGVzdF9hbHBoYV9zY2FuKTsKKyAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OworICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDI1NTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgICAgYmxlbmRlZF9jb2xvciA9CisgICAgICAgICAgICAgIGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOworICAgICAgICB9CisgICAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICBzcmNfc2NhbisrOworICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OworICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzFicHBQYWwyR3JheSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaW50IHJlc2V0X2dyYXkgPSBwUGFsZXR0ZVswXTsKKyAgaW50IHNldF9ncmF5ID0gcFBhbGV0dGVbMV07CisgIGlmIChibGVuZF90eXBlKSB7CisgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBpbnQgYmxlbmRlZF9jb2xvcjsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QgZ3JheSA9CisgICAgICAgICAgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkKKyAgICAgICAgICAgICAgPyBzZXRfZ3JheQorICAgICAgICAgICAgICA6IHJlc2V0X2dyYXk7CisgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgIGJsZW5kZWRfY29sb3IgPQorICAgICAgICAgICAgYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CisgICAgICB9CisgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKKyAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICB1aW50OF90IGdyYXkgPQorICAgICAgICAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKQorICAgICAgICAgICAgPyBzZXRfZ3JheQorICAgICAgICAgICAgOiByZXNldF9ncmF5OworICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjbGlwX3NjYW5bY29sXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgIH0KKyAgICBkZXN0X3NjYW4rKzsKKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd18xYnBwUGFsMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKKyAgaW50IHJlc2V0X2dyYXkgPSBwUGFsZXR0ZVswXTsKKyAgaW50IHNldF9ncmF5ID0gcFBhbGV0dGVbMV07CisgIGlmIChibGVuZF90eXBlKSB7CisgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBpbnQgYmxlbmRlZF9jb2xvcjsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QgZ3JheSA9CisgICAgICAgICAgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkKKyAgICAgICAgICAgICAgPyBzZXRfZ3JheQorICAgICAgICAgICAgICA6IHJlc2V0X2dyYXk7CisgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IGdyYXk7CisgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDI1NTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgYmxlbmRlZF9jb2xvciA9CisgICAgICAgICAgICBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKKyAgICAgIH0KKyAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgdWludDhfdCBncmF5ID0KKyAgICAgICAgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkKKyAgICAgICAgICAgID8gc2V0X2dyYXkKKyAgICAgICAgICAgIDogcmVzZXRfZ3JheTsKKyAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IERlc3RCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7CisgIGlmIChzcmNfYWxwaGFfc2NhbikgeworICAgIGludCBkZXN0X2dhcCA9IERlc3RCcHAgLSAzOworICAgIEZYX0FSR0IgYXJnYiA9IDA7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7CisgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICB1aW50OF90IHNyY19hbHBoYSA9IDA7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9ICgqc3JjX2FscGhhX3NjYW4rKykgKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKKyAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgfQorICB9IGVsc2UgeworICAgIEZYX0FSR0IgYXJnYiA9IDA7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7CisgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBjbGlwX3NjYW5bY29sXSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgY2xpcF9zY2FuW2NvbF0pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7CisgICAgICB9CisgICAgICBpZiAoRGVzdEJwcCA9PSA0KSB7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JfTm9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IERlc3RCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGludCByZXNldF9yLCByZXNldF9nLCByZXNldF9iOworICBpbnQgc2V0X3IsIHNldF9nLCBzZXRfYjsKKyAgcmVzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzBdKTsKKyAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKKyAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKKyAgc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVsxXSk7CisgIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOworICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7CisgICAgaWYgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgeworICAgICAgc3JjX3IgPSBzZXRfcjsKKyAgICAgIHNyY19nID0gc2V0X2c7CisgICAgICBzcmNfYiA9IHNldF9iOworICAgIH0gZWxzZSB7CisgICAgICBzcmNfciA9IHJlc2V0X3I7CisgICAgICBzcmNfZyA9IHJlc2V0X2c7CisgICAgICBzcmNfYiA9IHJlc2V0X2I7CisgICAgfQorICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgY2xpcF9zY2FuW2NvbF0pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBjbGlwX3NjYW5bY29sXSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9IGVsc2UgeworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOworICAgIH0KKyAgICBpZiAoRGVzdEJwcCA9PSA0KSB7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJBcmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBGWF9BUkdCIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7CisgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4pIC8gMjU1OworICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKCpzcmNfYWxwaGFfc2Nhbiwgc3JjX3IsIHNyY19nLCBzcmNfYikpOworICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBzcmNfYWxwaGFfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMKSB7CisgICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuKyspIC8gMjU1OworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgfSBlbHNlCisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBGWF9BUkdCIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYik7CisgICAgICBpbnQgc3JjX2cgPSBGWEFSR0JfRyhhcmdiKTsKKyAgICAgIGludCBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOworICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOworICAgICAgICAqZGVzdF9zY2FuKysgPSAyNTU7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CiAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwogICAgICAgICBzcmNfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbisrOwogICAgIH0KIH0KLXZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBzcmNfQnBwKQotewotICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGlmIChzcmNfQnBwID09IDQpIHsKLSAgICAgICAgICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzBdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW5bM10gPSAweGZmOwotICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKQl7Ci0gICAgICAgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOwotICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKLSAgICAgICAgICAgIGludCBzcmNfY29sb3IgPSBGWF9HQU1NQSgqc3JjX3NjYW4pOwotICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuW2luZGV4XSwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfY29sb3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKK3ZvaWQgX0NvbXBvc2l0ZVJvd184YnBwUmdiMlJnYmFfTm9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7CisgIGlmIChzcmNfYWxwaGFfc2NhbikgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgRlhfQVJHQiBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKKyAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOworICAgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7CisgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewogICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OworICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4pIC8gMjU1OworICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IHNyY19hbHBoYTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOworICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9ICpzcmNfYWxwaGFfc2NhbjsKICAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOwotICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKLSAgICAgICAgICAgIGludCBiYWNrX2NvbG9yID0gRlhfR0FNTUEoZGVzdF9zY2FuW2luZGV4XSk7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuW2luZGV4XSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgIHNyY19zY2FuICsrOworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOworICAgICAgICBzcmNfYWxwaGFfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMKSB7CisgICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuKyspIC8gMjU1OworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSAzOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICB9IGVsc2UKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIEZYX0FSR0IgYXJnYiA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKKyAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOworICAgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7CisgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7CisgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDI1NTsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIHNyY19zY2FuKys7CiAgICAgfQogfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgc3JjX0JwcCkKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIGlmIChzcmNfQnBwID09IDQpIHsKLSAgICAgICAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sIDB4ZmYwMDAwMDAgfCBGWEFSR0JfR0VURElCKHNyY19zY2FuKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzBdKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzFicHBSZ2IyQXJnYl9Ob0JsZW5kKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYjsKKyAgaW50IHNldF9yLCBzZXRfZywgc2V0X2I7CisgIHJlc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVswXSk7CisgIHJlc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVswXSk7CisgIHJlc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVswXSk7CisgIHNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMV0pOworICBzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzFdKTsKKyAgc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVsxXSk7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOworICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKKyAgICAgIHNyY19yID0gc2V0X3I7CisgICAgICBzcmNfZyA9IHNldF9nOworICAgICAgc3JjX2IgPSBzZXRfYjsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX3IgPSByZXNldF9yOworICAgICAgc3JjX2cgPSByZXNldF9nOworICAgICAgc3JjX2IgPSByZXNldF9iOwogICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHApCi17Ci0gICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvciArKykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOwotICAgICAgICAgICAgaW50IGJhY2tfY29sb3IgPSBGWF9HQU1NQShkZXN0X3NjYW5baW5kZXhdKTsKLSAgICAgICAgICAgIGludCBzcmNfY29sb3IgPSBGWF9HQU1NQSgqc3JjX3NjYW4pOwotICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWF9HQU1NQV9JTlZFUlNFKGJsZW5kZWQpOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKKyAgICAgICpkZXN0X3NjYW4rKyA9IDI1NTsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgZGVzdF9CcHAsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoKnNyY19zY2FuKyspOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgqc3JjX3NjYW4rKyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKCpzcmNfc2NhbisrKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7Ci0gICAgICAgICAgICBkZXN0X3NjYW5baW5kZXhdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5baW5kZXhdKSwgKnNyY19zY2FuLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgc3JjX3NjYW4gKys7CisgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKICAgICB9CisgICAgaW50IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgIGRlc3Rfc2NhbisrOworICB9CiB9Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCkKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzBdOwotICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKK3ZvaWQgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYmFfTm9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgeworICBpbnQgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYjsKKyAgaW50IHNldF9yLCBzZXRfZywgc2V0X2I7CisgIHJlc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVswXSk7CisgIHJlc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVswXSk7CisgIHJlc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVswXSk7CisgIHNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMV0pOworICBzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzFdKTsKKyAgc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVsxXSk7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOworICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKKyAgICAgIHNyY19yID0gc2V0X3I7CisgICAgICBzcmNfZyA9IHNldF9nOworICAgICAgc3JjX2IgPSBzZXRfYjsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX3IgPSByZXNldF9yOworICAgICAgc3JjX2cgPSByZXNldF9nOworICAgICAgc3JjX2IgPSByZXNldF9iOworICAgIH0KKyAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syQXJnYih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgeworICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKKyAgICAgIHNyY19zY2FuWzBdID0gc3JjX2I7CisgICAgICBzcmNfc2NhblsxXSA9IHNyY19nOworICAgICAgc3JjX3NjYW5bMl0gPSBzcmNfcjsKKyAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKKyAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19nKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgIH0gZWxzZSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gMjsKKyAgfQorfQordm9pZCBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMlJnYmEodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7CisgICAgfQorICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gc3JjX2FscGhhOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgICAgICB1aW50OF90IHNyY19zY2FuWzNdOworICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKKyAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7CisgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7CisgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfYik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0gZWxzZSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgeworICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKKyAgICAgIHNyY19zY2FuWzBdID0gc3JjX2I7CisgICAgICBzcmNfc2NhblsxXSA9IHNyY19nOworICAgICAgc3JjX3NjYW5bMl0gPSBzcmNfcjsKKyAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMV0sIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgc3JjX2FscGhhKTsKKyAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19nKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgIH0gZWxzZSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBzcmNfYWxwaGEpOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKKyAgfQorfQordm9pZCBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMk1hc2sodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OworICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuOworICAgIGlmICghYmFja19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IHNyY19hbHBoYTsKKyAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIH0KKyAgICBkZXN0X3NjYW4rKzsKKyAgfQorfQordm9pZCBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMkdyYXkodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZ3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2dyYXksIHNyY19hbHBoYSk7CisgICAgfQorICAgIGRlc3Rfc2NhbisrOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syR3JheWEodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZ3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OworICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19ncmF5OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gc3JjX2FscGhhOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19ncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkFyZ2IodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJiBjbGlwX3NjYW4gPT0gTlVMTCAmJgorICAgICAgbWFza19hbHBoYSA9PSAyNTUpIHsKKyAgICBGWF9BUkdCIGFyZ2IgPSBGWEFSR0JfTUFLRSgweGZmLCBzcmNfciwgc3JjX2csIHNyY19iKTsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKKyAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIGFyZ2IpOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICAgIHVpbnQ4X3Qgc3JjX3NjYW5bM107CisgICAgICBzcmNfc2NhblswXSA9IHNyY19iOworICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzFdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBhbHBoYV9yYXRpbyk7CisgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7CisgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfYik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICB9IGVsc2UgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IDI7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYmEodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKKyAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmIGNsaXBfc2NhbiA9PSBOVUxMICYmCisgICAgICBtYXNrX2FscGhhID09IDI1NSkgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgaWYgKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkgeworICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfYjsKKyAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX2c7CisgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19yOworICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gbWFza19hbHBoYTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSAzOworICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOworICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gbWFza19hbHBoYTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgICAgICB1aW50OF90IHNyY19zY2FuWzNdOworICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKKyAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7CisgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7CisgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfYik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0gZWxzZSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQml0TWFzazJSZ2IodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmIGNsaXBfc2NhbiA9PSBOVUxMICYmCisgICAgICBtYXNrX2FscGhhID09IDI1NSkgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgaWYgKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkgeworICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfcjsKKyAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX2c7CisgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19iOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGlmICghKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkpIHsKKyAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGE7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICAgIHVpbnQ4X3Qgc3JjX3NjYW5bM107CisgICAgICBzcmNfc2NhblswXSA9IHNyY19iOworICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzFdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMl0sIHNyY19hbHBoYSk7CisgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7CisgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfYik7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICB9IGVsc2UgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgc3JjX2FscGhhKTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMk1hc2sodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgeworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGE7CisgICAgfQorICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X3NjYW47CisgICAgaWYgKCFiYWNrX2FscGhhKSB7CisgICAgICAqZGVzdF9zY2FuID0gc3JjX2FscGhhOworICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7CisgICAgICAqZGVzdF9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgfQorICAgIGRlc3Rfc2NhbisrOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQml0TWFzazJHcmF5KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2dyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgeworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGE7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZ3JheSwgc3JjX2FscGhhKTsKKyAgICB9CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2dyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgeworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZ3JheTsKKyAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IHNyY19hbHBoYTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZ3JheSwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7CisgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTsKICAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3NjYW5bMl07Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07CisgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzBdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRlhBUkdCX1JHQk9SREVSQ09QWShkZXN0X3NjYW4sIHNyY19zY2FuKTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IHNyY19CcHAsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKLXsKLSAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYSA9ICpjbGlwX3NjYW4gKys7Ci0gICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKLSAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7Ci0gICAgICAgICAgICBpbnQgc3JjX2NvbG9yID0gRlhfR0FNTUEoKnNyY19zY2FuKTsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhbltpbmRleF0sIHNyY19jb2xvcik7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5baW5kZXhdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQotewotICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICB1aW50OF90IHNyY19hbHBoYSA9ICpjbGlwX3NjYW4gKys7Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvciArKykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOwotICAgICAgICAgICAgaW50IHNyY19jb2xvciA9IEZYX0dBTU1BKCpzcmNfc2Nhbik7Ci0gICAgICAgICAgICBpbnQgYmFja19jb2xvciA9IEZYX0dBTU1BKGRlc3Rfc2NhbltpbmRleF0pOwotICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBzcmNfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgc3JjX3NjYW4gICs9IHNyY19nYXA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7Ci0gICAgICAgICAgICBkZXN0X3NjYW5baW5kZXhdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuW2luZGV4XSwgRlhfR0FNTUEoKnNyY19zY2FuKSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgZGVzdF9CcHAsIGludCBzcmNfQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3NjYW5bMl07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIEZYX0dBTU1BKCpzcmNfc2NhbiksIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIEZYX0dBTU1BKCpzcmNfc2NhbiksIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIEZYX0dBTU1BKCpzcmNfc2NhbiksIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcCAtIDI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd184YnBwUmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBGWF9BUkdCKiBwUGFsZXR0ZSwgaW50IHBpeGVsX2NvdW50LAotICAgICAgICBpbnQgRGVzdEJwcCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQotewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgRlhfQVJHQiBhcmdiID0gcFBhbGV0dGUgPyBwUGFsZXR0ZVsqc3JjX3NjYW5dIDogKCpzcmNfc2NhbikgKiAweDAxMDEwMTsKLSAgICAgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX2I7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19yOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOwotICAgICAgICBzcmNfc2NhbiArKzsKLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBzcmNfbGVmdCwKLSAgICAgICAgRlhfQVJHQiogcFBhbGV0dGUsIGludCBwaXhlbF9jb3VudCwgaW50IERlc3RCcHAsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKLXsKLSAgICBpbnQgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYjsKLSAgICBpbnQgc2V0X3IsIHNldF9nLCBzZXRfYjsKLSAgICBpZiAocFBhbGV0dGUpIHsKLSAgICAgICAgcmVzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzBdKTsKLSAgICAgICAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKLSAgICAgICAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKLSAgICAgICAgc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVsxXSk7Ci0gICAgICAgIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOwotICAgICAgICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKKyAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwpIHsKKyAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc2V0X3IgPSByZXNldF9nID0gcmVzZXRfYiA9IDA7Ci0gICAgICAgIHNldF9yID0gc2V0X2cgPSBzZXRfYiA9IDI1NTsKKyAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7CiAgICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7Ci0gICAgICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKLSAgICAgICAgICAgIHNyY19yID0gc2V0X3I7Ci0gICAgICAgICAgICBzcmNfZyA9IHNldF9nOwotICAgICAgICAgICAgc3JjX2IgPSBzZXRfYjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19yID0gcmVzZXRfcjsKLSAgICAgICAgICAgIHNyY19nID0gcmVzZXRfZzsKLSAgICAgICAgICAgIHNyY19iID0gcmVzZXRfYjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIHNyY19iLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIHNyY19nLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfYjsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19nOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3I7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd184YnBwUmdiMkFyZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHdpZHRoLAotICAgICAgICBGWF9BUkdCKiBwUGFsZXR0ZSwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKQotewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7Ci0gICAgICAgIGlmIChwUGFsZXR0ZSkgewotICAgICAgICAgICAgRlhfQVJHQiBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgICAgICAgIHNyY19yID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICAgICAgICBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19yID0gc3JjX2cgPSBzcmNfYiA9ICpzcmNfc2NhbjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQShzcmNfYik7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQShzcmNfZyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQShzcmNfcik7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgRlhfR0FNTUEoc3JjX2IpLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgRlhfR0FNTUEoc3JjX2cpLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgRlhfR0FNTUEoc3JjX3IpLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICBzcmNfc2NhbiArKzsKLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzFicHBSZ2IyQXJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgc3JjX2xlZnQsIGludCB3aWR0aCwKLSAgICAgICAgRlhfQVJHQiogcFBhbGV0dGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKLXsKLSAgICBpbnQgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYjsKLSAgICBpbnQgc2V0X3IsIHNldF9nLCBzZXRfYjsKLSAgICBpZiAocFBhbGV0dGUpIHsKLSAgICAgICAgcmVzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzBdKTsKLSAgICAgICAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKLSAgICAgICAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKLSAgICAgICAgc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVsxXSk7Ci0gICAgICAgIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOwotICAgICAgICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXNldF9yID0gcmVzZXRfZyA9IHJlc2V0X2IgPSAwOwotICAgICAgICBzZXRfciA9IHNldF9nID0gc2V0X2IgPSAyNTU7Ci0gICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7Ci0gICAgICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKLSAgICAgICAgICAgIHNyY19yID0gc2V0X3I7Ci0gICAgICAgICAgICBzcmNfZyA9IHNldF9nOwotICAgICAgICAgICAgc3JjX2IgPSBzZXRfYjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19yID0gcmVzZXRfcjsKLSAgICAgICAgICAgIHNyY19nID0gcmVzZXRfZzsKLSAgICAgICAgICAgIHNyY19iID0gcmVzZXRfYjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQShzcmNfYik7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQShzcmNfZyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQShzcmNfcik7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBGWF9HQU1NQShzcmNfYiksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBGWF9HQU1NQShzcmNfZyksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBGWF9HQU1NQShzcmNfciksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMkFyZ2JfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgc3JjX3IsIGludCBzcmNfZywgaW50IHNyY19iLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgIGludCBibGVuZF90eXBlLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX3NjYW5bM107Ci0gICAgICAgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOwotICAgICAgICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKLSAgICAgICAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7Ci0gICAgICAgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOwotICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMl0sIHNyY19iKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzFdLCBzcmNfZyk7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblswXSwgc3JjX3IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2JfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgc3JjX3IsIGludCBzcmNfZywgaW50IHNyY19iLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgIGludCBibGVuZF90eXBlLCBpbnQgQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgICAgICAgICB1aW50OF90IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKLSAgICAgICAgICAgIHNyY19zY2FuWzBdID0gc3JjX2I7Ci0gICAgICAgICAgICBzcmNfc2NhblsxXSA9IHNyY19nOwotICAgICAgICAgICAgc3JjX3NjYW5bMl0gPSBzcmNfcjsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKLSAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWRfY29sb3JzWzBdLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkX2NvbG9yc1sxXSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZF9jb2xvcnNbMl0sIHNyY19hbHBoYSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzJdLCBzcmNfYik7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblsxXSwgc3JjX2cpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMF0sIHNyY19yKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgc3JjX2IsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIHNyY19nLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgc3JjX2FscGhhKTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkFyZ2JfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgY29uc3QgdWludDhfdCogc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgc3JjX3IsIGludCBzcmNfZywgaW50IHNyY19iLAotICAgICAgICBpbnQgc3JjX2xlZnQsIGludCBwaXhlbF9jb3VudCwgaW50IGJsZW5kX3R5cGUsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikKLXsKLSAgICBpZiAoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwgJiYgY2xpcF9zY2FuID09IE5VTEwgJiYgbWFza19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgRlhfQVJHQiBhcmdiID0gRlhBUkdCX01BS0UoMHhmZiwgc3JjX3IsIHNyY19nLCBzcmNfYik7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCBhcmdiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGE7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKLSAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107Ci0gICAgICAgICAgICBzcmNfc2NhblswXSA9IHNyY19iOwotICAgICAgICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkX2NvbG9yc1swXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkX2NvbG9yc1sxXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblsyXSwgc3JjX2IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMV0sIHNyY19nKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzBdLCBzcmNfcik7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIHNyY19iLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIHNyY19nLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X0JpdE1hc2syUmdiX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgbWFza19hbHBoYSwgaW50IHNyY19yLCBpbnQgc3JjX2csIGludCBzcmNfYiwKLSAgICAgICAgaW50IHNyY19sZWZ0LCBpbnQgcGl4ZWxfY291bnQsIGludCBibGVuZF90eXBlLCBpbnQgQnBwLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pCi17Ci0gICAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmIGNsaXBfc2NhbiA9PSBOVUxMICYmIG1hc2tfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfYjsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIGlmICghKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkpIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKLSAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107Ci0gICAgICAgICAgICBzcmNfc2NhblswXSA9IHNyY19iOwotICAgICAgICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkX2NvbG9yc1swXSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgYmxlbmRlZF9jb2xvcnNbMV0sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWRfY29sb3JzWzJdLCBzcmNfYWxwaGEpOwotICAgICAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGludCBiYWNrX2NvbG9yID0gRlhfR0FNTUEoZGVzdF9zY2FuWzJdKTsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19iKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICBiYWNrX2NvbG9yID0gRlhfR0FNTUEoZGVzdF9zY2FuWzFdKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2cpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgIGJhY2tfY29sb3IgPSBGWF9HQU1NQShkZXN0X3NjYW5bMF0pOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfcik7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCBzcmNfYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIHNyY19nLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgc3JjX3IsIHNyY19hbHBoYSkpOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgfQotfQotaW5saW5lIEZYX0JPT0wgX1NjYW5saW5lQ29tcG9zaXRvcl9Jbml0U291cmNlTWFzayhGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIGludCBhbHBoYV9mbGFnLCBGWF9EV09SRCBtYXNrX2NvbG9yLCBpbnQmIG1hc2tfYWxwaGEsCi0gICAgICAgIGludCYgbWFza19yZWQsIGludCYgbWFza19ncmVlbiwgaW50JiBtYXNrX2JsdWUsIGludCYgbWFza19ibGFjaywKLSAgICAgICAgdm9pZCogaWNjX21vZHVsZSwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gKElDb2RlY19JY2NNb2R1bGUqKWljY19tb2R1bGU7Ci0gICAgaWYgKGFscGhhX2ZsYWcgPj4gOCkgewotICAgICAgICBtYXNrX2FscGhhID0gYWxwaGFfZmxhZyAmIDB4ZmY7Ci0gICAgICAgIG1hc2tfcmVkID0gRlhTWVNfR2V0Q1ZhbHVlKG1hc2tfY29sb3IpOwotICAgICAgICBtYXNrX2dyZWVuID0gRlhTWVNfR2V0TVZhbHVlKG1hc2tfY29sb3IpOwotICAgICAgICBtYXNrX2JsdWUgPSBGWFNZU19HZXRZVmFsdWUobWFza19jb2xvcik7Ci0gICAgICAgIG1hc2tfYmxhY2sgPSBGWFNZU19HZXRLVmFsdWUobWFza19jb2xvcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWFza19hbHBoYSA9IEZYQVJHQl9BKG1hc2tfY29sb3IpOwotICAgICAgICBtYXNrX3JlZCA9IEZYQVJHQl9SKG1hc2tfY29sb3IpOwotICAgICAgICBtYXNrX2dyZWVuID0gRlhBUkdCX0cobWFza19jb2xvcik7Ci0gICAgICAgIG1hc2tfYmx1ZSA9IEZYQVJHQl9CKG1hc2tfY29sb3IpOwotICAgIH0KLSAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICBtYXNrX2NvbG9yID0gKGFscGhhX2ZsYWcgPj4gOCkgPyBGWENNWUtfVE9ESUIobWFza19jb2xvcikgOiBGWEFSR0JfVE9ESUIobWFza19jb2xvcik7Ci0gICAgICAgICAgICB1aW50OF90KiBncmF5X3AgPSAodWludDhfdCopJm1hc2tfY29sb3I7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBncmF5X3AsIGdyYXlfcCwgMSk7Ci0gICAgICAgICAgICBtYXNrX3JlZCA9IGRlc3RfZm9ybWF0ICYgMHgwNDAwID8gRlhfQ0NPTE9SKGdyYXlfcFswXSkgOiBncmF5X3BbMF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCByLCBnLCBiOwotICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShtYXNrX3JlZCwgbWFza19ncmVlbiwgbWFza19ibHVlLCBtYXNrX2JsYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICBtYXNrX3JlZCA9IEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1hc2tfcmVkID0gRlhSR0IyR1JBWShtYXNrX3JlZCwgbWFza19ncmVlbiwgbWFza19ibHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXN0X2Zvcm1hdCAmIDB4MDQwMCkgewotICAgICAgICAgICAgICAgIG1hc2tfcmVkID0gRlhfQ0NPTE9SKG1hc2tfcmVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQ4X3QqIG1hc2tfY29sb3JfcCA9ICh1aW50OF90KikmbWFza19jb2xvcjsKLSAgICAgICAgbWFza19jb2xvciA9IChhbHBoYV9mbGFnID4+IDgpID8gRlhDTVlLX1RPRElCKG1hc2tfY29sb3IpIDogRlhBUkdCX1RPRElCKG1hc2tfY29sb3IpOwotICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgbWFza19jb2xvcl9wLCBtYXNrX2NvbG9yX3AsIDEpOwotICAgICAgICAgICAgbWFza19yZWQgPSBtYXNrX2NvbG9yX3BbMl07Ci0gICAgICAgICAgICBtYXNrX2dyZWVuID0gbWFza19jb2xvcl9wWzFdOwotICAgICAgICAgICAgbWFza19ibHVlID0gbWFza19jb2xvcl9wWzBdOwotICAgICAgICB9IGVsc2UgaWYgKGFscGhhX2ZsYWcgPj4gOCkgewotICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKG1hc2tfY29sb3JfcFswXSwgbWFza19jb2xvcl9wWzFdLCBtYXNrX2NvbG9yX3BbMl0sIG1hc2tfY29sb3JfcFszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX2NvbG9yX3BbMl0sIG1hc2tfY29sb3JfcFsxXSwgbWFza19jb2xvcl9wWzBdKTsKLSAgICAgICAgICAgIG1hc2tfcmVkID0gbWFza19jb2xvcl9wWzJdOwotICAgICAgICAgICAgbWFza19ncmVlbiA9IG1hc2tfY29sb3JfcFsxXTsKLSAgICAgICAgICAgIG1hc2tfYmx1ZSA9IG1hc2tfY29sb3JfcFswXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLWlubGluZSB2b2lkIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZVBhbGV0dGUoRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKLSAgICAgICAgRlhfRFdPUkQqJiBwRGVzdFBhbGV0dGUsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKLSAgICAgICAgdm9pZCogaWNjX21vZHVsZSwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gKElDb2RlY19JY2NNb2R1bGUqKWljY19tb2R1bGU7Ci0gICAgRlhfQk9PTCBpc1NyY0NteWsgPSBzcmNfZm9ybWF0ICYgMHgwNDAwID8gVFJVRSA6IEZBTFNFOwotICAgIEZYX0JPT0wgaXNEc3RDbXlrID0gZGVzdF9mb3JtYXQgJiAweDA0MDAgPyBUUlVFIDogRkFMU0U7Ci0gICAgcERlc3RQYWxldHRlID0gTlVMTDsKLSAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBpZiAocFNyY1BhbGV0dGUpIHsKLSAgICAgICAgICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgICAgICAgICAgaW50IHBhbF9jb3VudCA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBncmF5X3BhbCA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBhbF9jb3VudCk7Ci0gICAgICAgICAgICAgICAgcERlc3RQYWxldHRlID0gKEZYX0RXT1JEKilncmF5X3BhbDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbF9jb3VudDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciA9IGlzU3JjQ215ayA/IEZYQ01ZS19UT0RJQihwU3JjUGFsZXR0ZVtpXSkgOiBGWEFSR0JfVE9ESUIocFNyY1BhbGV0dGVbaV0pOwotICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBncmF5X3BhbCwgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGdyYXlfcGFsICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHBhbHNpemUgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgcERlc3RQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIHBhbHNpemUpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsc2l6ZTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciA9IGlzU3JjQ215ayA/IEZYQ01ZS19UT0RJQihwU3JjUGFsZXR0ZVtpXSkgOiBGWEFSR0JfVE9ESUIocFNyY1BhbGV0dGVbaV0pOwotICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJmNvbG9yLCAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgcERlc3RQYWxldHRlW2ldID0gaXNEc3RDbXlrID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHBhbF9jb3VudCA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGdyYXlfcGFsID0gRlhfQWxsb2ModWludDhfdCwgcGFsX2NvdW50KTsKLSAgICAgICAgICAgIGlmIChwYWxfY291bnQgPT0gMikgewotICAgICAgICAgICAgICAgIGdyYXlfcGFsWzBdID0gMDsKLSAgICAgICAgICAgICAgICBncmF5X3BhbFsxXSA9IDI1NTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBncmF5X3BhbFtpXSA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChkZXN0X2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKLSAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBncmF5X3BhbCwgZ3JheV9wYWwsIHBhbF9jb3VudCk7Ci0gICAgICAgICAgICAgICAgcERlc3RQYWxldHRlID0gKEZYX0RXT1JEKilncmF5X3BhbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcERlc3RQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIHBhbF9jb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZwRGVzdFBhbGV0dGVbaV0sICZncmF5X3BhbFtpXSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZXN0UGFsZXR0ZVtpXSA9IGlzRHN0Q215ayA/IEZYQ01ZS19UT0RJQihwRGVzdFBhbGV0dGVbaV0pIDogRlhBUkdCX1RPRElCKHBEZXN0UGFsZXR0ZVtpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ3JheV9wYWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBTcmNQYWxldHRlKSB7Ci0gICAgICAgICAgICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICAgICAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgdWludDhfdCogZ3JheV9wYWwgPSBGWF9BbGxvYyh1aW50OF90LCBwYWxfY291bnQpOwotICAgICAgICAgICAgICAgIHBEZXN0UGFsZXR0ZSA9IChGWF9EV09SRCopZ3JheV9wYWw7Ci0gICAgICAgICAgICAgICAgaWYgKGlzU3JjQ215aykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbF9jb3VudDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ01ZSyBjbXlrID0gcFNyY1BhbGV0dGVbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNteWspLCBGWFNZU19HZXRNVmFsdWUoY215ayksIEZYU1lTX0dldFlWYWx1ZShjbXlrKSwgRlhTWVNfR2V0S1ZhbHVlKGNteWspLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmdyYXlfcGFsICsrID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbF9jb3VudDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiID0gcFNyY1BhbGV0dGVbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZ3JheV9wYWwgKysgPSBGWFJHQjJHUkFZKEZYQVJHQl9SKGFyZ2IpLCBGWEFSR0JfRyhhcmdiKSwgRlhBUkdCX0IoYXJnYikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBwYWxzaXplID0gMSA8PCAoc3JjX2Zvcm1hdCAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIHBEZXN0UGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0RXT1JELCBwYWxzaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNEc3RDbXlrID09IGlzU3JjQ215aykgewotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkocERlc3RQYWxldHRlLCBwU3JjUGFsZXR0ZSwgcGFsc2l6ZSAqIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsc2l6ZTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ01ZSyBjbXlrID0gcFNyY1BhbGV0dGVbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNteWspLCBGWFNZU19HZXRNVmFsdWUoY215ayksIEZYU1lTX0dldFlWYWx1ZShjbXlrKSwgRlhTWVNfR2V0S1ZhbHVlKGNteWspLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3RQYWxldHRlW2ldID0gRlhBUkdCX01BS0UoMHhmZiwgciwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICAgICAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgdWludDhfdCogZ3JheV9wYWwgPSBGWF9BbGxvYyh1aW50OF90LCBwYWxfY291bnQpOwotICAgICAgICAgICAgICAgIGlmIChwYWxfY291bnQgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBncmF5X3BhbFswXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGdyYXlfcGFsWzFdID0gMjU1OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyYXlfcGFsW2ldID0gaTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRGVzdFBhbGV0dGUgPSAoRlhfRFdPUkQqKWdyYXlfcGFsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgcGFsc2l6ZSA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKLSAgICAgICAgICAgICAgICBwRGVzdFBhbGV0dGUgPSBGWF9BbGxvYyhGWF9EV09SRCwgcGFsc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhbHNpemUgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBwRGVzdFBhbGV0dGVbMF0gPSBpc1NyY0NteWsgPyAyNTUgOiAweGZmMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBwRGVzdFBhbGV0dGVbMV0gPSBpc1NyY0NteWsgPyAwIDogMHhmZmZmZmZmZjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3RQYWxldHRlW2ldID0gaXNTcmNDbXlrID8gRlhfQ0NPTE9SKGkpIDogKGkgKiAweDEwMTAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaXNTcmNDbXlrICE9IGlzRHN0Q215aykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbHNpemU7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NNWUsgY215ayA9IHBEZXN0UGFsZXR0ZVtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY215ayksIEZYU1lTX0dldE1WYWx1ZShjbXlrKSwgRlhTWVNfR2V0WVZhbHVlKGNteWspLCBGWFNZU19HZXRLVmFsdWUoY215ayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVzdFBhbGV0dGVbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLUNGWF9TY2FubGluZUNvbXBvc2l0b3I6OkNGWF9TY2FubGluZUNvbXBvc2l0b3IoKQotewotICAgIG1fcFNyY1BhbGV0dGUgPSBOVUxMOwotICAgIG1fcENhY2hlU2NhbmxpbmUgPSBOVUxMOwotICAgIG1fQ2FjaGVTaXplID0gMDsKLSAgICBtX2JSZ2JCeXRlT3JkZXIgPSBGQUxTRTsKLSAgICBtX0JsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTDsKLX0KLUNGWF9TY2FubGluZUNvbXBvc2l0b3I6On5DRlhfU2NhbmxpbmVDb21wb3NpdG9yKCkKLXsKLSAgICBpZiAobV9wU3JjUGFsZXR0ZSkgewotICAgICAgICBGWF9GcmVlKG1fcFNyY1BhbGV0dGUpOwotICAgIH0KLSAgICBpZiAobV9wQ2FjaGVTY2FubGluZSkgewotICAgICAgICBGWF9GcmVlKG1fcENhY2hlU2NhbmxpbmUpOwotICAgIH0KLX0KLUZYX0JPT0wgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6SW5pdChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBpbnQzMl90IHdpZHRoLCBGWF9EV09SRCogcFNyY1BhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgaW50IGJsZW5kX3R5cGUsIEZYX0JPT0wgYkNsaXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgbV9TcmNGb3JtYXQgPSBzcmNfZm9ybWF0OwotICAgIG1fRGVzdEZvcm1hdCA9IGRlc3RfZm9ybWF0OwotICAgIG1fQmxlbmRUeXBlID0gYmxlbmRfdHlwZTsKLSAgICBtX2JSZ2JCeXRlT3JkZXIgPSBiUmdiQnl0ZU9yZGVyOwotICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBOVUxMOwotICAgIGlmIChDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICB9Ci0gICAgaWYgKHBJY2NNb2R1bGUgPT0gTlVMTCkgewotICAgICAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKLSAgICB9Ci0gICAgbV9wSWNjVHJhbnNmb3JtID0gcEljY1RyYW5zZm9ybTsKLSAgICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX1NyY0Zvcm1hdCA9PSBGWERJQl8xYnBwTWFzayB8fCBtX1NyY0Zvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgewotICAgICAgICByZXR1cm4gX1NjYW5saW5lQ29tcG9zaXRvcl9Jbml0U291cmNlTWFzayhkZXN0X2Zvcm1hdCwgYWxwaGFfZmxhZywgbWFza19jb2xvciwKLSAgICAgICAgICAgICAgICBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwgbV9NYXNrQmxhY2ssCi0gICAgICAgICAgICAgICAgcEljY01vZHVsZSwgcEljY1RyYW5zZm9ybSk7Ci0gICAgfQotICAgIGlmIChwSWNjVHJhbnNmb3JtID09IE5VTEwgJiYgKH5zcmNfZm9ybWF0ICYgMHgwNDAwKSAmJiAoZGVzdF9mb3JtYXQgJiAweDA0MDApKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKChtX1NyY0Zvcm1hdCAmIDB4ZmYpIDw9IDgpIHsKLSAgICAgICAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBfU2NhbmxpbmVDb21wb3NpdG9yX0luaXRTb3VyY2VQYWxldHRlKHNyY19mb3JtYXQsIGRlc3RfZm9ybWF0LCBtX3BTcmNQYWxldHRlLCBwU3JjUGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgbV9UcmFuc3BhcmVuY3kgPSAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYiA/IDEgOiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRlc3RfZm9ybWF0ICYgMHgwMjAwID8gMiA6IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAoZGVzdF9mb3JtYXQgJiAweDA0MDAgPyA0IDogMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICArICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEgPyA4IDogMCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX1RyYW5zcGFyZW5jeSA9IChzcmNfZm9ybWF0ICYgMHgwMjAwID8gMCA6IDEpCi0gICAgICAgICAgICAgICAgICAgICArIChkZXN0X2Zvcm1hdCAmIDB4MDIwMCA/IDAgOiAyKQotICAgICAgICAgICAgICAgICAgICAgKyAoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwgPyA0IDogMCkKLSAgICAgICAgICAgICAgICAgICAgICsgKGJDbGlwID8gOCA6IDApCi0gICAgICAgICAgICAgICAgICAgICArIChzcmNfZm9ybWF0ICYgMHgwNDAwID8gMTYgOiAwKQotICAgICAgICAgICAgICAgICAgICAgKyAoZGVzdF9mb3JtYXQgJiAweDA0MDAgPyAzMiA6IDApCi0gICAgICAgICAgICAgICAgICAgICArIChwSWNjVHJhbnNmb3JtID8gNjQgOiAwKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q29tcG9zaXRlUmdiQml0bWFwTGluZSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhLCB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpCi17Ci0gICAgaW50IHNyY19CcHAgPSAobV9TcmNGb3JtYXQgJiAweGZmKSA+PiAzOwotICAgIGludCBkZXN0X0JwcCA9IChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzOwotICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgICAgc3dpdGNoIChtX1RyYW5zcGFyZW5jeSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyQXJnYl9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIHNyY19CcHApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBzcmNfQnBwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIGNsaXBfc2Nhbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIHNyY19CcHApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBzcmNfQnBwLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBzcmNfQnBwLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIHNyY19CcHAsIGNsaXBfc2Nhbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgICAgIGlmIChtX1NyY0Zvcm1hdCAmIDB4MDIwMCkgewotICAgICAgICAgICAgaWYgKG1fU3JjRm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyTWFzayhkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2JhMk1hc2soZGVzdF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEsIHdpZHRoLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyTWFzayhkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgY2xpcF9zY2FuKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID09IDgpIHsKLSAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDQwMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSArKykgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSB+KmRlc3Rfc2NhbjsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobV9TcmNGb3JtYXQgJiAweDAyMDApIHsKLSAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDAyMDApIHsKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyR3JheWEoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSwgZHN0X2V4dHJhX2FscGhhLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDIwMCkgewotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkdyYXlhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19CcHAsIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX0JwcCwgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDQwMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSArKykgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSB+KmRlc3Rfc2NhbjsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBkZXN0X1NpemUgPSB3aWR0aCAqIGRlc3RfQnBwICsgNDsKLSAgICAgICAgaWYgKGRlc3RfU2l6ZSA+IG1fQ2FjaGVTaXplKSB7Ci0gICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BDYWNoZVNjYW5saW5lLCBkZXN0X1NpemUpOwotICAgICAgICAgICAgaWYgKCFtX3BDYWNoZVNjYW5saW5lKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9DYWNoZVNpemUgPSBkZXN0X1NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoIChtX1RyYW5zcGFyZW5jeSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgY2FzZSA0Kzg6IHsKLSAgICAgICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMkFyZ2IoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSwgc3JjX2V4dHJhX2FscGhhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDY0OgotICAgICAgICAgICAgY2FzZSA0KzY0OgotICAgICAgICAgICAgY2FzZSA4KzY0OgotICAgICAgICAgICAgY2FzZSA0KzgrNjQ6IHsKLSAgICAgICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMkFyZ2JfVHJhbnNmb3JtKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhLCBzcmNfZXh0cmFfYWxwaGEsIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzY0OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwX1RyYW5zZm9ybShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEsIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDErODoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBzcmNfQnBwLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDErOCs2NDoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXBfVHJhbnNmb3JtKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhLCBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzQ6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX05vQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgc3JjX0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDErNCs2NDoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwX1RyYW5zZm9ybShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgc3JjX0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSwgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMSs0Kzg6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIHNyY19CcHAsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzQrOCs2NDoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfQ2xpcF9UcmFuc2Zvcm0oZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIHNyY19CcHAsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSwgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGNhc2UgMis4OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2V4dHJhX2FscGhhKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMis2NDoKLSAgICAgICAgICAgIGNhc2UgMis4KzY0OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfQmxlbmRfVHJhbnNmb3JtKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZXh0cmFfYWxwaGEsIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIrNDoKLSAgICAgICAgICAgIGNhc2UgMis0Kzg6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZXh0cmFfYWxwaGEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyKzQrNjQ6Ci0gICAgICAgICAgICBjYXNlIDIrNCs4KzY0OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZF9UcmFuc2Zvcm0oZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfZXh0cmFfYWxwaGEsIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDErMjoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzIrNjQ6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0oZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgc3JjX0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDErMis4OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHAsIGNsaXBfc2Nhbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDErMis4KzY0OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwX1RyYW5zZm9ybShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLCBzcmNfQnBwLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzIrNDoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMSsyKzQrNjQ6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwX1RyYW5zZm9ybShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzIrNCs4OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzIrNCs4KzY0OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXBfVHJhbnNmb3JtKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwgc3JjX0JwcCwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q29tcG9zaXRlUGFsQml0bWFwTGluZSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgc3JjX2xlZnQsIGludCB3aWR0aCwgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEsIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSkKLXsKLSAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgIGlmIChtX1NyY0Zvcm1hdCA9PSBGWERJQl8xYnBwUmdiKSB7Ci0gICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBSZ2IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJBcmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCB3aWR0aCwgbV9wU3JjUGFsZXR0ZSwgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgbV9wU3JjUGFsZXR0ZSwgd2lkdGgsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl84YnBwUmdiKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd184YnBwUmdiMkFyZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fcFNyY1BhbGV0dGUsIGNsaXBfc2Nhbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJSZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9wU3JjUGFsZXR0ZSwgd2lkdGgsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgewotICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJNYXNrKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBjbGlwX3NjYW4pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgobV9EZXN0Rm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICBpZiAobV9UcmFuc3BhcmVuY3kgJiA4KSB7Ci0gICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd18xYnBwUGFsMkdyYXlhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCAoY29uc3QgdWludDhfdCopbV9wU3JjUGFsZXR0ZSwgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfMWJwcFBhbDJHcmF5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCAoY29uc3QgdWludDhfdCopbV9wU3JjUGFsZXR0ZSwgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDIwMCkKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBQYWwyR3JheWEoZGVzdF9zY2FuLCBzcmNfc2NhbiwgKGNvbnN0IHVpbnQ4X3QqKW1fcFNyY1BhbGV0dGUsIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEsIHNyY19leHRyYV9hbHBoYSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd184YnBwUGFsMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2NhbiwgKGNvbnN0IHVpbnQ4X3QqKW1fcFNyY1BhbGV0dGUsIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19leHRyYV9hbHBoYSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKG1fVHJhbnNwYXJlbmN5KSB7Ci0gICAgICAgICAgICBjYXNlIDErMjoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBSZ2IyQXJnYl9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX3BTcmNQYWxldHRlLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZXh0cmFfYWxwaGEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzIrODoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzFicHBSZ2IyQXJnYl9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCB3aWR0aCwgbV9wU3JjUGFsZXR0ZSwgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9wU3JjUGFsZXR0ZSwgd2lkdGgsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19leHRyYV9hbHBoYSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDArODoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIG1fcFNyY1BhbGV0dGUsIHdpZHRoLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMCsyOgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJSZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCBtX3BTcmNQYWxldHRlLCB3aWR0aCwgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2V4dHJhX2FscGhhKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMCsyKzg6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYmFfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgd2lkdGgsIG1fcFNyY1BhbGV0dGUsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkNvbXBvc2l0ZUJ5dGVNYXNrTGluZSh1aW50OF90KiBkZXN0X3NjYW4sIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLCBpbnQgd2lkdGgsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKQotewotICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICAgICAgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJNYXNrKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCB3aWR0aCwgY2xpcF9zY2FuKTsKLSAgICB9IGVsc2UgaWYgKChtX0Rlc3RGb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDAyMDApIHsKLSAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syR3JheWEoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgd2lkdGgsIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCB3aWR0aCwgY2xpcF9zY2FuKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikKLSAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syQXJnYl9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2JfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBtX0JsZW5kVHlwZSwgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKQotICAgICAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMkFyZ2IoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbik7Ci0gICAgZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYiB8fCBtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiMzIpCi0gICAgICAgIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgbV9CbGVuZFR5cGUsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOwotICAgIGVsc2UgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2JhKQotICAgICAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMlJnYmEoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhKTsKLX0KLXZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q29tcG9zaXRlQml0TWFza0xpbmUodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IHNyY19sZWZ0LCBpbnQgd2lkdGgsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKQotewotICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICAgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMk1hc2soZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIHNyY19sZWZ0LCB3aWR0aCwgY2xpcF9zY2FuKTsKLSAgICB9IGVsc2UgaWYgKChtX0Rlc3RGb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDAyMDApCi0gICAgICAgICAgICBfQ29tcG9zaXRlUm93X0JpdE1hc2syR3JheWEoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgc3JjX2xlZnQsIHdpZHRoLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBfQ29tcG9zaXRlUm93X0JpdE1hc2syR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBzcmNfbGVmdCwgd2lkdGgsIGNsaXBfc2Nhbik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpCi0gICAgICAgICAgICBfQ29tcG9zaXRlUm93X0JpdE1hc2syQXJnYl9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYl9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbGVmdCwgd2lkdGgsIG1fQmxlbmRUeXBlLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpCi0gICAgICAgIF9Db21wb3NpdGVSb3dfQml0TWFzazJBcmdiKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbGVmdCwgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4pOwotICAgIGVsc2UgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2IgfHwgbV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYjMyKQotICAgICAgICBfQ29tcG9zaXRlUm93X0JpdE1hc2syUmdiKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19sZWZ0LCB3aWR0aCwgbV9CbGVuZFR5cGUsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOwotfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbXBvc2l0ZUJpdG1hcChpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEFTU0VSVCghcFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSk7Ci0gICAgQVNTRVJUKG1fYnBwID49IDgpOwotICAgIGlmIChwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpIHx8IG1fYnBwIDwgOCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEdldE92ZXJsYXBSZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAtPkdldFdpZHRoKCksIHBTcmNCaXRtYXAtPkdldEhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgIHNyY19sZWZ0LCBzcmNfdG9wLCBwQ2xpcFJnbik7Ci0gICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcENsaXBNYXNrID0gTlVMTDsKLSAgICBGWF9SRUNUIGNsaXBfYm94OwotICAgIGlmIChwQ2xpcFJnbiAmJiBwQ2xpcFJnbi0+R2V0VHlwZSgpICE9IENGWF9DbGlwUmduOjpSZWN0SSkgewotICAgICAgICBBU1NFUlQocENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6TWFza0YpOwotICAgICAgICBwQ2xpcE1hc2sgPSBwQ2xpcFJnbi0+R2V0TWFzaygpOwotICAgICAgICBjbGlwX2JveCA9IHBDbGlwUmduLT5HZXRCb3goKTsKLSAgICB9Ci0gICAgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvciBjb21wb3NpdG9yOwotICAgIGlmICghY29tcG9zaXRvci5Jbml0KEdldEZvcm1hdCgpLCBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSwgd2lkdGgsIHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSwgMCwgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcE1hc2sgIT0gTlVMTCwgYlJnYkJ5dGVPcmRlciwgMCwgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgZGVzdF9CcHAgPSBtX2JwcCAvIDg7Ci0gICAgaW50IHNyY19CcHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgRlhfQk9PTCBiUmdiID0gc3JjX0JwcCA+IDEgJiYgIXBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwU3JjQWxwaGFNYXNrID0gcFNyY0JpdG1hcC0+bV9wQWxwaGFNYXNrOwotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogZGVzdF9CcHA7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIHNyY19CcHA7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuX2V4dHJhX2FscGhhID0gcFNyY0FscGhhTWFzayA/IHBTcmNBbHBoYU1hc2stPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgOiBOVUxMOwotICAgICAgICB1aW50OF90KiBkc3Rfc2Nhbl9leHRyYV9hbHBoYSA9IG1fcEFscGhhTWFzayA/ICh1aW50OF90KiltX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGRlc3RfdG9wICsgcm93KSArIGRlc3RfbGVmdCA6IE5VTEw7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiA9IE5VTEw7Ci0gICAgICAgIGlmIChwQ2xpcE1hc2spIHsKLSAgICAgICAgICAgIGNsaXBfc2NhbiA9IHBDbGlwTWFzay0+bV9wQnVmZmVyICsgKGRlc3RfdG9wICsgcm93IC0gY2xpcF9ib3gudG9wKSAqIHBDbGlwTWFzay0+bV9QaXRjaCArIChkZXN0X2xlZnQgLSBjbGlwX2JveC5sZWZ0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYlJnYikgewotICAgICAgICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVSZ2JCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBjbGlwX3NjYW4sIHNyY19zY2FuX2V4dHJhX2FscGhhLCBkc3Rfc2Nhbl9leHRyYV9hbHBoYSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb21wb3NpdG9yLkNvbXBvc2l0ZVBhbEJpdG1hcExpbmUoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLCBjbGlwX3NjYW4sIHNyY19zY2FuX2V4dHJhX2FscGhhLCBkc3Rfc2Nhbl9leHRyYV9hbHBoYSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlTWFzayhpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLCBGWF9EV09SRCBjb2xvciwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQVNTRVJUKHBNYXNrLT5Jc0FscGhhTWFzaygpKTsKLSAgICBBU1NFUlQobV9icHAgPj0gOCk7Ci0gICAgaWYgKCFwTWFzay0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwTWFzay0+R2V0V2lkdGgoKSwgcE1hc2stPkdldEhlaWdodCgpLCBzcmNfbGVmdCwgc3JjX3RvcCwgcENsaXBSZ24pOwotICAgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpbnQgc3JjX2FscGhhID0gKHVpbnQ4X3QpKGFscGhhX2ZsYWcgPj4gOCkgPyAoYWxwaGFfZmxhZyAmIDB4ZmYpIDogRlhBUkdCX0EoY29sb3IpOwogICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBDbGlwTWFzayA9IE5VTEw7Ci0gICAgRlhfUkVDVCBjbGlwX2JveDsKLSAgICBpZiAocENsaXBSZ24gJiYgcENsaXBSZ24tPkdldFR5cGUoKSAhPSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKLSAgICAgICAgQVNTRVJUKHBDbGlwUmduLT5HZXRUeXBlKCkgPT0gQ0ZYX0NsaXBSZ246Ok1hc2tGKTsKLSAgICAgICAgcENsaXBNYXNrID0gcENsaXBSZ24tPkdldE1hc2soKTsKLSAgICAgICAgY2xpcF9ib3ggPSBwQ2xpcFJnbi0+R2V0Qm94KCk7CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107CisgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOworICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwogICAgIH0KLSAgICBpbnQgc3JjX2JwcCA9IHBNYXNrLT5HZXRCUFAoKTsKLSAgICBpbnQgQnBwID0gR2V0QlBQKCkgLyA4OwotICAgIENGWF9TY2FubGluZUNvbXBvc2l0b3IgY29tcG9zaXRvcjsKLSAgICBpZiAoIWNvbXBvc2l0b3IuSW5pdChHZXRGb3JtYXQoKSwgcE1hc2stPkdldEZvcm1hdCgpLCB3aWR0aCwgTlVMTCwgY29sb3IsIGJsZW5kX3R5cGUsIHBDbGlwTWFzayAhPSBOVUxMLCBiUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKKyAgICAgIGlmIChibGVuZF90eXBlKSB7CisgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhbltpbmRleF0sICpzcmNfc2Nhbik7CisgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRSgqc3JjX3NjYW4sIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW5baW5kZXhdID0KKyAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhbltpbmRleF0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3Rfc2NhbltpbmRleF0gPQorICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuW2luZGV4XSwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7CisgICAgICB9CisgICAgICBzcmNfc2NhbisrOwogICAgIH0KLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIEJwcDsKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwTWFzay0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7Ci0gICAgICAgIHVpbnQ4X3QqIGRzdF9zY2FuX2V4dHJhX2FscGhhID0gbV9wQWxwaGFNYXNrID8gKHVpbnQ4X3QqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUoZGVzdF90b3AgKyByb3cpICsgZGVzdF9sZWZ0IDogTlVMTDsKLSAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuID0gTlVMTDsKLSAgICAgICAgaWYgKHBDbGlwTWFzaykgewotICAgICAgICAgICAgY2xpcF9zY2FuID0gcENsaXBNYXNrLT5tX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cgLSBjbGlwX2JveC50b3ApICogcENsaXBNYXNrLT5tX1BpdGNoICsgKGRlc3RfbGVmdCAtIGNsaXBfYm94LmxlZnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYnBwID09IDEpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0b3IuQ29tcG9zaXRlQml0TWFza0xpbmUoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLCBjbGlwX3NjYW4sIGRzdF9zY2FuX2V4dHJhX2FscGhhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbXBvc2l0b3IuQ29tcG9zaXRlQnl0ZU1hc2tMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4gKyBzcmNfbGVmdCwgd2lkdGgsIGNsaXBfc2NhbiwgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworICAgIGRlc3Rfc2NhbiArPSA0OworICAgIHNyY19zY2FuKys7CisgIH0KIH0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVSZWN0KGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwordm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIGlmIChzcmNfQnBwID09IDQpIHsKKyAgICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKGRlc3Rfc2NhbiwgMHhmZjAwMDAwMCB8IEZYQVJHQl9HRVRESUIoc3JjX3NjYW4pKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMF0pKTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpbnQgc3JjX2FscGhhID0gKGFscGhhX2ZsYWcgPj4gOCkgPyAoYWxwaGFfZmxhZyAmIDB4ZmYpIDogRlhBUkdCX0EoY29sb3IpOworICAgIGRlc3Rfc2NhblszXSA9IDB4ZmY7CisgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOworICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07CisgICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKKyAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7CisgICAgfQorICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7CisgICAgICBpbnQgc3JjX2NvbG9yID0gRlhfR0FNTUEoKnNyY19zY2FuKTsKKyAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuW2luZGV4XSwgc3JjX2NvbG9yKTsKKyAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfY29sb3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZF9SZ2JCeXRlT3JkZXIoCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICBpbnQgZGVzdF9CcHAsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgdWludDhfdCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgfQogICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoLCB0b3AgKyBoZWlnaHQpOwotICAgIHJlY3QuSW50ZXJzZWN0KDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKLSAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOworICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07CisgICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKKyAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7CiAgICAgfQotICAgIHdpZHRoID0gcmVjdC5XaWR0aCgpOwotICAgIEZYX0RXT1JEIGRzdF9jb2xvcjsKLSAgICBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7Ci0gICAgICAgIGRzdF9jb2xvciA9IEZYQ01ZS19UT0RJQihjb2xvcik7CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKKyAgICAgIGludCBiYWNrX2NvbG9yID0gRlhfR0FNTUEoZGVzdF9zY2FuW2luZGV4XSk7CisgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsICpzcmNfc2Nhbik7CisgICAgICBkZXN0X3NjYW5baW5kZXhdID0KKyAgICAgICAgICBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSkpOworICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgIHNyY19zY2FuKys7CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IHNyY19CcHApIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgaWYgKHNyY19CcHAgPT0gNCkgeworICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKGRlc3Rfc2NhbiwgMHhmZjAwMDAwMCB8IEZYQVJHQl9HRVRESUIoc3JjX3NjYW4pKTsKICAgICB9IGVsc2UgewotICAgICAgICBkc3RfY29sb3IgPSBGWEFSR0JfVE9ESUIoY29sb3IpOworICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKAorICAgICAgICAgIGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoMHhmZiwgc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCBzcmNfc2NhblswXSkpOwogICAgIH0KLSAgICB1aW50OF90KiBjb2xvcl9wID0gKHVpbnQ4X3QqKSZkc3RfY29sb3I7Ci0gICAgaWYgKG1fYnBwID09IDgpIHsKLSAgICAgICAgdWludDhfdCBncmF5ID0gMjU1OwotICAgICAgICBpZiAoIUlzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtICYmIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkgJiYgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKLSAgICAgICAgICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIGNvbG9yX3AsIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKLSAgICAgICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKGNvbG9yX3BbMF0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMl0sIGNvbG9yX3BbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JheSA9ICh1aW50OF90KUZYUkdCMkdSQVkoKGludCljb2xvcl9wWzJdLCBjb2xvcl9wWzFdLCBjb2xvcl9wWzBdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoSXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgICAgIGdyYXkgPSB+Z3JheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewotICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIHJlY3QubGVmdDsKLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgZ3JheSwgd2lkdGgpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcigKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBibGVuZF90eXBlLAorICAgIGludCBkZXN0X0JwcCwKKyAgICBpbnQgc3JjX0JwcCkgeworICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107CisgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOworICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwogICAgIH0KLSAgICBpZiAobV9icHAgPT0gMSkgewotICAgICAgICBBU1NFUlQoIUlzQ215a0ltYWdlKCkgJiYgKHVpbnQ4X3QpKGFscGhhX2ZsYWcgPj4gOCkgPT0gMCk7Ci0gICAgICAgIGludCBsZWZ0X3NoaWZ0ID0gcmVjdC5sZWZ0ICUgODsKLSAgICAgICAgaW50IHJpZ2h0X3NoaWZ0ID0gcmVjdC5yaWdodCAlIDg7Ci0gICAgICAgIGludCB3aWR0aCA9IHJlY3QucmlnaHQgLyA4IC0gcmVjdC5sZWZ0IC8gODsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaWYgKG1fcFBhbGV0dGUgPT0gTlVMTCkgewotICAgICAgICAgICAgaW5kZXggPSAoKHVpbnQ4X3QpY29sb3IgPT0gMHhmZikgPyAxIDogMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSArKykKLSAgICAgICAgICAgICAgICBpZiAobV9wUGFsZXR0ZVtpXSA9PSBjb2xvcikgewotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93ICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW5fdG9wID0gKHVpbnQ4X3QqKUdldFNjYW5saW5lKHJvdykgKyByZWN0LmxlZnQgLyA4OwotICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuX3RvcF9yID0gKHVpbnQ4X3QqKUdldFNjYW5saW5lKHJvdykgKyByZWN0LnJpZ2h0IC8gODsKLSAgICAgICAgICAgIHVpbnQ4X3QgbGVmdF9mbGFnID0gICpkZXN0X3NjYW5fdG9wICYgKDI1NSA8PCAoOCAtIGxlZnRfc2hpZnQpKTsKLSAgICAgICAgICAgIHVpbnQ4X3QgcmlnaHRfZmxhZyA9ICpkZXN0X3NjYW5fdG9wX3IgJiAoMjU1ID4+IHJpZ2h0X3NoaWZ0KTsKLSAgICAgICAgICAgIGlmICh3aWR0aCkgewotICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW5fdG9wICsgMSwgaW5kZXggPyAyNTUgOiAwLCB3aWR0aCAtIDEpOwotICAgICAgICAgICAgICAgIGlmICghaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2Nhbl90b3AgJj0gbGVmdF9mbGFnOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuX3RvcF9yICY9IHJpZ2h0X2ZsYWc7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2Nhbl90b3AgfD0gfmxlZnRfZmxhZzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2Nhbl90b3BfciB8PSB+cmlnaHRfZmxhZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2Nhbl90b3AgJj0gbGVmdF9mbGFnIHwgcmlnaHRfZmxhZzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuX3RvcCB8PSB+KGxlZnRfZmxhZyB8IHJpZ2h0X2ZsYWcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOworICAgICAgaW50IGJhY2tfY29sb3IgPSBGWF9HQU1NQShkZXN0X3NjYW5baW5kZXhdKTsKKyAgICAgIGludCBzcmNfY29sb3IgPSBGWF9HQU1NQSgqc3JjX3NjYW4pOworICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfY29sb3IpOworICAgICAgZGVzdF9zY2FuW2luZGV4XSA9IEZYX0dBTU1BX0lOVkVSU0UoYmxlbmRlZCk7CisgICAgICBzcmNfc2NhbisrOwogICAgIH0KLSAgICBBU1NFUlQobV9icHAgPj0gMjQpOwotICAgIGlmIChtX2JwcCA8IDI0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0gJiYgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSkgewotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGNvbG9yX3AsIGNvbG9yX3AsIDEpOworICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGRlc3RfQnBwLAorICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhbHBoYV9mbGFnID4+IDggJiYgIUlzQ215a0ltYWdlKCkpCi0gICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9wWzJdLCBjb2xvcl9wWzFdLCBjb2xvcl9wWzBdKTsKLSAgICAgICAgZWxzZSBpZiAoIShhbHBoYV9mbGFnID4+IDgpICYmIElzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQorICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CiAgICAgfQotICAgIGlmKCFJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgIGNvbG9yX3BbM10gPSAodWludDhfdClzcmNfYWxwaGE7Ci0gICAgfQotICAgIGludCBCcHAgPSBtX2JwcCAvIDg7Ci0gICAgRlhfQk9PTCBiQWxwaGEgPSBIYXNBbHBoYSgpOwotICAgIEZYX0JPT0wgYkFyZ2IgPSBHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiID8gVFJVRSA6IEZBTFNFOwogICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93ICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgcmVjdC5sZWZ0ICogQnBwOwotICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuX2FscGhhID0gbV9wQWxwaGFNYXNrID8gKHVpbnQ4X3QqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdCA6IE5VTEw7Ci0gICAgICAgICAgICBpZiAoZGVzdF9zY2FuX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2Nhbl9hbHBoYSwgMHhmZiwgd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQqIHNjYW4gPSAoRlhfRFdPUkQqKWRlc3Rfc2NhbjsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzY2FuICsrID0gZHN0X2NvbG9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gY29sb3JfcFswXTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IGNvbG9yX3BbMV07Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBjb2xvcl9wWzJdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoKnNyY19zY2FuKyspOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgqc3JjX3NjYW4rKyk7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKCpzcmNfc2NhbisrKTsKKyAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3cgKyspIHsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIHJlY3QubGVmdCAqIEJwcDsKLSAgICAgICAgaWYgKGJBbHBoYSkgewotICAgICAgICAgICAgaWYgKGJBcmdiKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIGNvbG9yX3BbMl0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMF0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBjb2xvcl9wWzBdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGNvbG9yX3BbMV0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFsyXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW5fYWxwaGEgPSAodWludDhfdCopbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpICsgcmVjdC5sZWZ0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3Rfc2Nhbl9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2Nhbl9hbHBoYSsrID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2NhbiwgY29sb3JfcCwgQnBwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2Nhbl9hbHBoYSArKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQgY29tcHMgPSAwOyBjb21wcyA8IEJwcDsgY29tcHMgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBjb2xvcl9wW2NvbXBzXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGZvcihpbnQgY29tcHMgPSAwOyBjb21wcyA8IEJwcDsgY29tcHMgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBzID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFtjb21wc10sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKKyAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhbltpbmRleF0pLCAqc3JjX3NjYW4sIHNyY19hbHBoYSkpOworICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgIHNyY19zY2FuKys7CisgIH0KIH0KLUNGWF9CaXRtYXBDb21wb3Nlcjo6Q0ZYX0JpdG1hcENvbXBvc2VyKCkKLXsKLSAgICBtX3BTY2FubGluZVYgPSBOVUxMOwotICAgIG1fcFNjYW5saW5lQWxwaGFWID0gTlVMTDsKLSAgICBtX3BDbGlwU2NhblYgPSBOVUxMOwotICAgIG1fcEFkZENsaXBTY2FuID0gTlVMTDsKLSAgICBtX2JSZ2JCeXRlT3JkZXIgPSBGQUxTRTsKLSAgICBtX0JsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTDsKK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIoCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgZGVzdF9CcHAsCisgICAgaW50IHNyY19CcHApIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgZGVzdF9zY2FuWzJdID0gc3JjX3NjYW5bMF07CisgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07CisgICAgZGVzdF9zY2FuWzBdID0gc3JjX3NjYW5bMl07CisgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgIH0KIH0KLUNGWF9CaXRtYXBDb21wb3Nlcjo6fkNGWF9CaXRtYXBDb21wb3NlcigpCi17Ci0gICAgaWYgKG1fcFNjYW5saW5lVikgewotICAgICAgICBGWF9GcmVlKG1fcFNjYW5saW5lVik7CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGJsZW5kX3R5cGUsCisgICAgaW50IHNyY19CcHAsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYSA9ICpjbGlwX3NjYW4rKzsKKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOworICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChtX3BTY2FubGluZUFscGhhVikgewotICAgICAgICBGWF9GcmVlKG1fcFNjYW5saW5lQWxwaGFWKTsKKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAobV9wQ2xpcFNjYW5WKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQ2xpcFNjYW5WKTsKKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOworICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07CisgICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKKyAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7CiAgICAgfQotICAgIGlmIChtX3BBZGRDbGlwU2NhbikgewotICAgICAgICBGWF9GcmVlKG1fcEFkZENsaXBTY2FuKTsKKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOworICAgICAgaW50IHNyY19jb2xvciA9IEZYX0dBTU1BKCpzcmNfc2Nhbik7CisgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhbltpbmRleF0sIHNyY19jb2xvcik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbltpbmRleF0gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhbltpbmRleF0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIHNyY19zY2FuKys7CiAgICAgfQorICAgIGRlc3Rfc2NhbiArPSA0OworICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgIH0KIH0KLXZvaWQgQ0ZYX0JpdG1hcENvbXBvc2VyOjpDb21wb3NlKENGWF9ESUJpdG1hcCogcERlc3QsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgaW50IGJpdG1hcF9hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsIEZYX1JFQ1QmIGRlc3RfcmVjdCwgRlhfQk9PTCBiVmVydGljYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwgRlhfQk9PTCBiRmxpcFksIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBtX3BCaXRtYXAgPSBwRGVzdDsKLSAgICBtX3BDbGlwUmduID0gcENsaXBSZ247Ci0gICAgbV9EZXN0TGVmdCA9IGRlc3RfcmVjdC5sZWZ0OwotICAgIG1fRGVzdFRvcCA9IGRlc3RfcmVjdC50b3A7Ci0gICAgbV9EZXN0V2lkdGggPSBkZXN0X3JlY3QuV2lkdGgoKTsKLSAgICBtX0Rlc3RIZWlnaHQgPSBkZXN0X3JlY3QuSGVpZ2h0KCk7Ci0gICAgbV9CaXRtYXBBbHBoYSA9IGJpdG1hcF9hbHBoYTsKLSAgICBtX01hc2tDb2xvciA9IG1hc2tfY29sb3I7Ci0gICAgbV9wQ2xpcE1hc2sgPSBOVUxMOwotICAgIGlmIChwQ2xpcFJnbiAmJiBwQ2xpcFJnbi0+R2V0VHlwZSgpICE9IENGWF9DbGlwUmduOjpSZWN0SSkgewotICAgICAgICBtX3BDbGlwTWFzayA9IHBDbGlwUmduLT5HZXRNYXNrKCk7CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIoCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICBpbnQgZGVzdF9CcHAsCisgICAgaW50IHNyY19CcHAsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgdWludDhfdCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuKys7CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgY29udGludWU7CiAgICAgfQotICAgIG1fYlZlcnRpY2FsID0gYlZlcnRpY2FsOwotICAgIG1fYkZsaXBYID0gYkZsaXBYOwotICAgIG1fYkZsaXBZID0gYkZsaXBZOwotICAgIG1fQWxwaGFGbGFnID0gYWxwaGFfZmxhZzsKLSAgICBtX3BJY2NUcmFuc2Zvcm0gPSBwSWNjVHJhbnNmb3JtOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7Ci0gICAgbV9CbGVuZFR5cGUgPSBibGVuZF90eXBlOworICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107CisgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOworICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgIH0KKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOworICAgICAgaW50IHNyY19jb2xvciA9IEZYX0dBTU1BKCpzcmNfc2Nhbik7CisgICAgICBpbnQgYmFja19jb2xvciA9IEZYX0dBTU1BKGRlc3Rfc2NhbltpbmRleF0pOworICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfY29sb3IpOworICAgICAgZGVzdF9zY2FuW2luZGV4XSA9CisgICAgICAgICAgRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpKTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICB9CiB9Ci1GWF9CT09MIENGWF9CaXRtYXBDb21wb3Nlcjo6U2V0SW5mbyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBGWF9EV09SRCogcFNyY1BhbGV0dGUpCi17Ci0gICAgbV9TcmNGb3JtYXQgPSBzcmNfZm9ybWF0OwotICAgIGlmICghbV9Db21wb3NpdG9yLkluaXQobV9wQml0bWFwLT5HZXRGb3JtYXQoKSwgc3JjX2Zvcm1hdCwgd2lkdGgsIHBTcmNQYWxldHRlLCBtX01hc2tDb2xvciwgRlhESUJfQkxFTkRfTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2xpcE1hc2sgIT0gTlVMTCB8fCAobV9CaXRtYXBBbHBoYSA8IDI1NSksIG1fYlJnYkJ5dGVPcmRlciwgbV9BbHBoYUZsYWcsIG1fcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IHNyY19CcHAsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOworICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChtX2JWZXJ0aWNhbCkgewotICAgICAgICBtX3BTY2FubGluZVYgPSBGWF9BbGxvYyh1aW50OF90LCBtX3BCaXRtYXAtPkdldEJQUCgpIC8gOCAqIHdpZHRoICsgNCk7Ci0gICAgICAgIG1fcENsaXBTY2FuViA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwotICAgICAgICBpZiAobV9wQml0bWFwLT5tX3BBbHBoYU1hc2spIHsKLSAgICAgICAgICAgIG1fcFNjYW5saW5lQWxwaGFWID0gRlhfQWxsb2ModWludDhfdCwgd2lkdGggKyA0KTsKLSAgICAgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChtX0JpdG1hcEFscGhhIDwgMjU1KSB7Ci0gICAgICAgIG1fcEFkZENsaXBTY2FuID0gRlhfQWxsb2ModWludDhfdCwgbV9iVmVydGljYWwgPyBtX3BCaXRtYXAtPkdldEhlaWdodCgpIDogbV9wQml0bWFwLT5HZXRXaWR0aCgpKTsKKyAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKKyAgICAgIGRlc3Rfc2NhbltpbmRleF0gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhbltpbmRleF0sIEZYX0dBTU1BKCpzcmNfc2NhbiksIGFscGhhX3JhdGlvKTsKKyAgICAgIHNyY19zY2FuKys7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIGRlc3Rfc2NhbiArPSA0OworICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgIH0KIH0KLXZvaWQgQ0ZYX0JpdG1hcENvbXBvc2VyOjpEb0NvbXBvc2UodWludDhfdCogZGVzdF9zY2FuLCBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwgaW50IGRlc3Rfd2lkdGgsIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhLCB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpCi17Ci0gICAgaWYgKG1fQml0bWFwQWxwaGEgPCAyNTUpIHsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXN0X3dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9wQWRkQ2xpcFNjYW5baV0gPSBjbGlwX3NjYW5baV0gKiBtX0JpdG1hcEFscGhhIC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcEFkZENsaXBTY2FuLCBtX0JpdG1hcEFscGhhLCBkZXN0X3dpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBjbGlwX3NjYW4gPSBtX3BBZGRDbGlwU2NhbjsKK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGRlc3RfQnBwLAorICAgIGludCBzcmNfQnBwLAorICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzBdOworICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07CisgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblsyXTsKKyAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRSgKKyAgICAgICAgICBGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCBGWF9HQU1NQSgqc3JjX3NjYW4pLCBzcmNfYWxwaGEpKTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKAorICAgICAgICAgIEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIEZYX0dBTU1BKCpzcmNfc2NhbiksIHNyY19hbHBoYSkpOworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoCisgICAgICAgICAgRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgRlhfR0FNTUEoKnNyY19zY2FuKSwgc3JjX2FscGhhKSk7CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwIC0gMjsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAobV9TcmNGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICAgICAgbV9Db21wb3NpdG9yLkNvbXBvc2l0ZUJ5dGVNYXNrTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCBkZXN0X3dpZHRoLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7Ci0gICAgfSBlbHNlIGlmICgobV9TcmNGb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgIG1fQ29tcG9zaXRvci5Db21wb3NpdGVQYWxCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIDAsIGRlc3Rfd2lkdGgsIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLCBkc3RfZXh0cmFfYWxwaGEpOworICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBGWF9BUkdCKiBwUGFsZXR0ZSwKKyAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgaW50IERlc3RCcHAsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIEZYX0FSR0IgYXJnYiA9IHBQYWxldHRlID8gcFBhbGV0dGVbKnNyY19zY2FuXSA6ICgqc3JjX3NjYW4pICogMHgwMTAxMDE7CisgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYik7CisgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7CisgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7CisgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgY2xpcF9zY2FuW2NvbF0pOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgY2xpcF9zY2FuW2NvbF0pOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgY2xpcF9zY2FuW2NvbF0pOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fQ29tcG9zaXRvci5Db21wb3NpdGVSZ2JCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGRlc3Rfd2lkdGgsIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLCBkc3RfZXh0cmFfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX2I7CisgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19yOwogICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKKyAgICBzcmNfc2NhbisrOworICB9CiB9Ci12b2lkIENGWF9CaXRtYXBDb21wb3Nlcjo6Q29tcG9zZVNjYW5saW5lKGludCBsaW5lLCBjb25zdCB1aW50OF90KiBzY2FubGluZSwgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSkKLXsKLSAgICBpZiAobV9iVmVydGljYWwpIHsKLSAgICAgICAgQ29tcG9zZVNjYW5saW5lVihsaW5lLCBzY2FubGluZSwgc2Nhbl9leHRyYV9hbHBoYSk7CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgc3JjX2xlZnQsCisgICAgRlhfQVJHQiogcFBhbGV0dGUsCisgICAgaW50IHBpeGVsX2NvdW50LAorICAgIGludCBEZXN0QnBwLAorICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYjsKKyAgaW50IHNldF9yLCBzZXRfZywgc2V0X2I7CisgIGlmIChwUGFsZXR0ZSkgeworICAgIHJlc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVswXSk7CisgICAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKKyAgICByZXNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMF0pOworICAgIHNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMV0pOworICAgIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOworICAgIHNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMV0pOworICB9IGVsc2UgeworICAgIHJlc2V0X3IgPSByZXNldF9nID0gcmVzZXRfYiA9IDA7CisgICAgc2V0X3IgPSBzZXRfZyA9IHNldF9iID0gMjU1OworICB9CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOworICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKKyAgICAgIHNyY19yID0gc2V0X3I7CisgICAgICBzcmNfZyA9IHNldF9nOworICAgICAgc3JjX2IgPSBzZXRfYjsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX3IgPSByZXNldF9yOworICAgICAgc3JjX2cgPSByZXNldF9nOworICAgICAgc3JjX2IgPSByZXNldF9iOworICAgIH0KKyAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7CisgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIHNyY19iLCBjbGlwX3NjYW5bY29sXSk7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIHNyY19nLCBjbGlwX3NjYW5bY29sXSk7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBjbGlwX3NjYW5bY29sXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19iOworICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX2c7CisgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfcjsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJBcmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgRlhfQVJHQiogcFBhbGV0dGUsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOworICAgIGlmIChwUGFsZXR0ZSkgeworICAgICAgRlhfQVJHQiBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIHNyY19yID0gRlhBUkdCX1IoYXJnYik7CisgICAgICBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOworICAgICAgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX3IgPSBzcmNfZyA9IHNyY19iID0gKnNyY19zY2FuOworICAgIH0KKyAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQShzcmNfYik7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQShzcmNfZyk7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQShzcmNfcik7CisgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7CisgICAgICBzcmNfc2NhbisrOworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBzcmNfc2NhbisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBkZXN0X3NjYW5bMl0gPQorICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIEZYX0dBTU1BKHNyY19iKSwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhblsxXSA9CisgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgRlhfR0FNTUEoc3JjX2cpLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuWzBdID0KKyAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBGWF9HQU1NQShzcmNfciksIGFscGhhX3JhdGlvKTsKKyAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICBzcmNfc2NhbisrOworICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzFicHBSZ2IyQXJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcigKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHNyY19sZWZ0LAorICAgIGludCB3aWR0aCwKKyAgICBGWF9BUkdCKiBwUGFsZXR0ZSwKKyAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaW50IHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2I7CisgIGludCBzZXRfciwgc2V0X2csIHNldF9iOworICBpZiAocFBhbGV0dGUpIHsKKyAgICByZXNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMF0pOworICAgIHJlc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVswXSk7CisgICAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKKyAgICBzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzFdKTsKKyAgICBzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzFdKTsKKyAgICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKKyAgfSBlbHNlIHsKKyAgICByZXNldF9yID0gcmVzZXRfZyA9IHJlc2V0X2IgPSAwOworICAgIHNldF9yID0gc2V0X2cgPSBzZXRfYiA9IDI1NTsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpbnQgc3JjX3IsIHNyY19nLCBzcmNfYjsKKyAgICBpZiAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSB7CisgICAgICBzcmNfciA9IHNldF9yOworICAgICAgc3JjX2cgPSBzZXRfZzsKKyAgICAgIHNyY19iID0gc2V0X2I7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19yID0gcmVzZXRfcjsKKyAgICAgIHNyY19nID0gcmVzZXRfZzsKKyAgICAgIHNyY19iID0gcmVzZXRfYjsKKyAgICB9CisgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUEoc3JjX2IpOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUEoc3JjX2cpOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUEoc3JjX3IpOworICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgIGRlc3Rfc2NhblsyXSA9CisgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgRlhfR0FNTUEoc3JjX2IpLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuWzFdID0KKyAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBGWF9HQU1NQShzcmNfZyksIGFscGhhX3JhdGlvKTsKKyAgICBkZXN0X3NjYW5bMF0gPQorICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIEZYX0dBTU1BKHNyY19yKSwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbiArPSA0OworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syQXJnYl9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0Uoc3JjX2FscGhhLCBzcmNfciwgc3JjX2csIHNyY19iKSk7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICAgIHVpbnQ4X3Qgc3JjX3NjYW5bM107CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOworICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKKyAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7CisgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOworICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07CisgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkX2NvbG9yc1swXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuWzFdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWRfY29sb3JzWzFdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW5bMF0gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKKyAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblsyXSwgc3JjX2IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMV0sIHNyY19nKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzBdLCBzcmNfcik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IDQ7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2JfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgeworICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKKyAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107CisgICAgICBzcmNfc2NhblswXSA9IHNyY19iOworICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7CisgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOworICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgICAgZGVzdF9zY2FuWzJdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWRfY29sb3JzWzBdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzFdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWRfY29sb3JzWzFdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzBdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWRfY29sb3JzWzJdLCBzcmNfYWxwaGEpOworICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzJdLCBzcmNfYik7CisgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblsxXSwgc3JjX2cpOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMF0sIHNyY19yKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBzcmNfYWxwaGEpOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gQnBwOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQml0TWFzazJBcmdiX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmIGNsaXBfc2NhbiA9PSBOVUxMICYmCisgICAgICBtYXNrX2FscGhhID09IDI1NSkgeworICAgIEZYX0FSR0IgYXJnYiA9IEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19yLCBzcmNfZywgc3JjX2IpOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgaWYgKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkgeworICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCBhcmdiKTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGE7CisgICAgfQorICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgc3JjX3IsIHNyY19nLCBzcmNfYikpOworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgeworICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKKyAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107CisgICAgICBzcmNfc2NhblswXSA9IHNyY19iOworICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7CisgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOworICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgICAgZGVzdF9zY2FuWzJdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWRfY29sb3JzWzBdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW5bMV0gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOworICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzJdLCBzcmNfYik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblsxXSwgc3JjX2cpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19nLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMF0sIHNyY19yKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gNDsKKyAgfQorfQordm9pZCBfQ29tcG9zaXRlUm93X0JpdE1hc2syUmdiX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmIGNsaXBfc2NhbiA9PSBOVUxMICYmCisgICAgICBtYXNrX2FscGhhID09IDI1NSkgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgaWYgKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkgeworICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfYjsKKyAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX2c7CisgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19yOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGlmICghKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkpIHsKKyAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGE7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICAgIHVpbnQ4X3Qgc3JjX3NjYW5bM107CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOworICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKKyAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7CisgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOworICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07CisgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkX2NvbG9yc1swXSwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkX2NvbG9yc1sxXSwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkX2NvbG9yc1syXSwgc3JjX2FscGhhKTsKKyAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGludCBiYWNrX2NvbG9yID0gRlhfR0FNTUEoZGVzdF9zY2FuWzJdKTsKKyAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19iKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9CisgICAgICAgICAgRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpKTsKKyAgICAgIGJhY2tfY29sb3IgPSBGWF9HQU1NQShkZXN0X3NjYW5bMV0pOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfZyk7CisgICAgICBkZXN0X3NjYW5bMV0gPQorICAgICAgICAgIEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKSk7CisgICAgICBiYWNrX2NvbG9yID0gRlhfR0FNTUEoZGVzdF9zY2FuWzBdKTsKKyAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX3IpOworICAgICAgZGVzdF9zY2FuWzBdID0KKyAgICAgICAgICBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSkpOworICAgIH0gZWxzZSB7CisgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHNyY19iLCBzcmNfYWxwaGEpKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgc3JjX2csIHNyY19hbHBoYSkpOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBzcmNfciwgc3JjX2FscGhhKSk7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgIH0KK30KK2lubGluZSBGWF9CT09MIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZU1hc2soRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG1hc2tfcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG1hc2tfZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbWFza19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG1hc2tfYmxhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGljY19tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IChJQ29kZWNfSWNjTW9kdWxlKilpY2NfbW9kdWxlOworICBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7CisgICAgbWFza19hbHBoYSA9IGFscGhhX2ZsYWcgJiAweGZmOworICAgIG1hc2tfcmVkID0gRlhTWVNfR2V0Q1ZhbHVlKG1hc2tfY29sb3IpOworICAgIG1hc2tfZ3JlZW4gPSBGWFNZU19HZXRNVmFsdWUobWFza19jb2xvcik7CisgICAgbWFza19ibHVlID0gRlhTWVNfR2V0WVZhbHVlKG1hc2tfY29sb3IpOworICAgIG1hc2tfYmxhY2sgPSBGWFNZU19HZXRLVmFsdWUobWFza19jb2xvcik7CisgIH0gZWxzZSB7CisgICAgbWFza19hbHBoYSA9IEZYQVJHQl9BKG1hc2tfY29sb3IpOworICAgIG1hc2tfcmVkID0gRlhBUkdCX1IobWFza19jb2xvcik7CisgICAgbWFza19ncmVlbiA9IEZYQVJHQl9HKG1hc2tfY29sb3IpOworICAgIG1hc2tfYmx1ZSA9IEZYQVJHQl9CKG1hc2tfY29sb3IpOworICB9CisgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgIG1hc2tfY29sb3IgPSAoYWxwaGFfZmxhZyA+PiA4KSA/IEZYQ01ZS19UT0RJQihtYXNrX2NvbG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX1RPRElCKG1hc2tfY29sb3IpOworICAgICAgdWludDhfdCogZ3JheV9wID0gKHVpbnQ4X3QqKSZtYXNrX2NvbG9yOworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZ3JheV9wLCBncmF5X3AsIDEpOworICAgICAgbWFza19yZWQgPSBkZXN0X2Zvcm1hdCAmIDB4MDQwMCA/IEZYX0NDT0xPUihncmF5X3BbMF0pIDogZ3JheV9wWzBdOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7CisgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKG1hc2tfcmVkLCBtYXNrX2dyZWVuLCBtYXNrX2JsdWUsIG1hc2tfYmxhY2ssIHIsIGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiKTsKKyAgICAgICAgbWFza19yZWQgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWFza19yZWQgPSBGWFJHQjJHUkFZKG1hc2tfcmVkLCBtYXNrX2dyZWVuLCBtYXNrX2JsdWUpOworICAgICAgfQorICAgICAgaWYgKGRlc3RfZm9ybWF0ICYgMHgwNDAwKSB7CisgICAgICAgIG1hc2tfcmVkID0gRlhfQ0NPTE9SKG1hc2tfcmVkKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogbWFza19jb2xvcl9wID0gKHVpbnQ4X3QqKSZtYXNrX2NvbG9yOworICAgIG1hc2tfY29sb3IgPQorICAgICAgICAoYWxwaGFfZmxhZyA+PiA4KSA/IEZYQ01ZS19UT0RJQihtYXNrX2NvbG9yKSA6IEZYQVJHQl9UT0RJQihtYXNrX2NvbG9yKTsKKyAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgbWFza19jb2xvcl9wLCBtYXNrX2NvbG9yX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgIG1hc2tfcmVkID0gbWFza19jb2xvcl9wWzJdOworICAgICAgbWFza19ncmVlbiA9IG1hc2tfY29sb3JfcFsxXTsKKyAgICAgIG1hc2tfYmx1ZSA9IG1hc2tfY29sb3JfcFswXTsKKyAgICB9IGVsc2UgaWYgKGFscGhhX2ZsYWcgPj4gOCkgeworICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKG1hc2tfY29sb3JfcFswXSwgbWFza19jb2xvcl9wWzFdLCBtYXNrX2NvbG9yX3BbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19jb2xvcl9wWzNdLCBtYXNrX2NvbG9yX3BbMl0sIG1hc2tfY29sb3JfcFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX2NvbG9yX3BbMF0pOworICAgICAgbWFza19yZWQgPSBtYXNrX2NvbG9yX3BbMl07CisgICAgICBtYXNrX2dyZWVuID0gbWFza19jb2xvcl9wWzFdOworICAgICAgbWFza19ibHVlID0gbWFza19jb2xvcl9wWzBdOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK2lubGluZSB2b2lkIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZVBhbGV0dGUoRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqJiBwRGVzdFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogaWNjX21vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gKElDb2RlY19JY2NNb2R1bGUqKWljY19tb2R1bGU7CisgIEZYX0JPT0wgaXNTcmNDbXlrID0gc3JjX2Zvcm1hdCAmIDB4MDQwMCA/IFRSVUUgOiBGQUxTRTsKKyAgRlhfQk9PTCBpc0RzdENteWsgPSBkZXN0X2Zvcm1hdCAmIDB4MDQwMCA/IFRSVUUgOiBGQUxTRTsKKyAgcERlc3RQYWxldHRlID0gTlVMTDsKKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBpZiAocFNyY1BhbGV0dGUpIHsKKyAgICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7CisgICAgICAgIHVpbnQ4X3QqIGdyYXlfcGFsID0gRlhfQWxsb2ModWludDhfdCwgcGFsX2NvdW50KTsKKyAgICAgICAgcERlc3RQYWxldHRlID0gKEZYX0RXT1JEKilncmF5X3BhbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfY291bnQ7IGkrKykgeworICAgICAgICAgIEZYX0RXT1JEIGNvbG9yID0gaXNTcmNDbXlrID8gRlhDTVlLX1RPRElCKHBTcmNQYWxldHRlW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX1RPRElCKHBTcmNQYWxldHRlW2ldKTsKKyAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBncmF5X3BhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKKyAgICAgICAgICBncmF5X3BhbCsrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgcGFsc2l6ZSA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKKyAgICAgICAgcERlc3RQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIHBhbHNpemUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbHNpemU7IGkrKykgeworICAgICAgICAgIEZYX0RXT1JEIGNvbG9yID0gaXNTcmNDbXlrID8gRlhDTVlLX1RPRElCKHBTcmNQYWxldHRlW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX1RPRElCKHBTcmNQYWxldHRlW2ldKTsKKyAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOworICAgICAgICAgIHBEZXN0UGFsZXR0ZVtpXSA9CisgICAgICAgICAgICAgIGlzRHN0Q215ayA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7CisgICAgICB1aW50OF90KiBncmF5X3BhbCA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBhbF9jb3VudCk7CisgICAgICBpZiAocGFsX2NvdW50ID09IDIpIHsKKyAgICAgICAgZ3JheV9wYWxbMF0gPSAwOworICAgICAgICBncmF5X3BhbFsxXSA9IDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyBpKyspIHsKKyAgICAgICAgICBncmF5X3BhbFtpXSA9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGdyYXlfcGFsLCBncmF5X3BhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsX2NvdW50KTsKKyAgICAgICAgcERlc3RQYWxldHRlID0gKEZYX0RXT1JEKilncmF5X3BhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBEZXN0UGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0RXT1JELCBwYWxfY291bnQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUoCisgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0sICh1aW50OF90KikmcERlc3RQYWxldHRlW2ldLCAmZ3JheV9wYWxbaV0sIDEpOworICAgICAgICAgIHBEZXN0UGFsZXR0ZVtpXSA9IGlzRHN0Q215ayA/IEZYQ01ZS19UT0RJQihwRGVzdFBhbGV0dGVbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX1RPRElCKHBEZXN0UGFsZXR0ZVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgRlhfRnJlZShncmF5X3BhbCk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChwU3JjUGFsZXR0ZSkgeworICAgICAgaWYgKChkZXN0X2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICAgICAgaW50IHBhbF9jb3VudCA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKKyAgICAgICAgdWludDhfdCogZ3JheV9wYWwgPSBGWF9BbGxvYyh1aW50OF90LCBwYWxfY291bnQpOworICAgICAgICBwRGVzdFBhbGV0dGUgPSAoRlhfRFdPUkQqKWdyYXlfcGFsOworICAgICAgICBpZiAoaXNTcmNDbXlrKSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfY291bnQ7IGkrKykgeworICAgICAgICAgICAgRlhfQ01ZSyBjbXlrID0gcFNyY1BhbGV0dGVbaV07CisgICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNteWspLCBGWFNZU19HZXRNVmFsdWUoY215ayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNteWspLCBGWFNZU19HZXRLVmFsdWUoY215ayksIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZywgYik7CisgICAgICAgICAgICAqZ3JheV9wYWwrKyA9IEZYUkdCMkdSQVkociwgZywgYik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBGWF9BUkdCIGFyZ2IgPSBwU3JjUGFsZXR0ZVtpXTsKKyAgICAgICAgICAgICpncmF5X3BhbCsrID0KKyAgICAgICAgICAgICAgICBGWFJHQjJHUkFZKEZYQVJHQl9SKGFyZ2IpLCBGWEFSR0JfRyhhcmdiKSwgRlhBUkdCX0IoYXJnYikpOworICAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwYWxzaXplID0gMSA8PCAoc3JjX2Zvcm1hdCAmIDB4ZmYpOworICAgICAgICBwRGVzdFBhbGV0dGUgPSBGWF9BbGxvYyhGWF9EV09SRCwgcGFsc2l6ZSk7CisgICAgICAgIGlmIChpc0RzdENteWsgPT0gaXNTcmNDbXlrKSB7CisgICAgICAgICAgRlhTWVNfbWVtY3B5KHBEZXN0UGFsZXR0ZSwgcFNyY1BhbGV0dGUsIHBhbHNpemUgKiBzaXplb2YoRlhfRFdPUkQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbHNpemU7IGkrKykgeworICAgICAgICAgICAgRlhfQ01ZSyBjbXlrID0gcFNyY1BhbGV0dGVbaV07CisgICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNteWspLCBGWFNZU19HZXRNVmFsdWUoY215ayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNteWspLCBGWFNZU19HZXRLVmFsdWUoY215ayksIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZywgYik7CisgICAgICAgICAgICBwRGVzdFBhbGV0dGVbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCByLCBnLCBiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKChkZXN0X2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICAgICAgaW50IHBhbF9jb3VudCA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKKyAgICAgICAgdWludDhfdCogZ3JheV9wYWwgPSBGWF9BbGxvYyh1aW50OF90LCBwYWxfY291bnQpOworICAgICAgICBpZiAocGFsX2NvdW50ID09IDIpIHsKKyAgICAgICAgICBncmF5X3BhbFswXSA9IDA7CisgICAgICAgICAgZ3JheV9wYWxbMV0gPSAyNTU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfY291bnQ7IGkrKykgeworICAgICAgICAgICAgZ3JheV9wYWxbaV0gPSBpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwRGVzdFBhbGV0dGUgPSAoRlhfRFdPUkQqKWdyYXlfcGFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHBhbHNpemUgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7CisgICAgICAgIHBEZXN0UGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0RXT1JELCBwYWxzaXplKTsKKyAgICAgICAgaWYgKHBhbHNpemUgPT0gMikgeworICAgICAgICAgIHBEZXN0UGFsZXR0ZVswXSA9IGlzU3JjQ215ayA/IDI1NSA6IDB4ZmYwMDAwMDA7CisgICAgICAgICAgcERlc3RQYWxldHRlWzFdID0gaXNTcmNDbXlrID8gMCA6IDB4ZmZmZmZmZmY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHBEZXN0UGFsZXR0ZVtpXSA9IGlzU3JjQ215ayA/IEZYX0NDT0xPUihpKSA6IChpICogMHgxMDEwMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc1NyY0NteWsgIT0gaXNEc3RDbXlrKSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxzaXplOyBpKyspIHsKKyAgICAgICAgICAgIEZYX0NNWUsgY215ayA9IHBEZXN0UGFsZXR0ZVtpXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY215ayksIEZYU1lTX0dldE1WYWx1ZShjbXlrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY215ayksIEZYU1lTX0dldEtWYWx1ZShjbXlrKSwgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLCBiKTsKKyAgICAgICAgICAgIHBEZXN0UGFsZXR0ZVtpXSA9IEZYQVJHQl9NQUtFKDB4ZmYsIHIsIGcsIGIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpIHsKKyAgbV9wU3JjUGFsZXR0ZSA9IE5VTEw7CisgIG1fcENhY2hlU2NhbmxpbmUgPSBOVUxMOworICBtX0NhY2hlU2l6ZSA9IDA7CisgIG1fYlJnYkJ5dGVPcmRlciA9IEZBTFNFOworICBtX0JsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTDsKK30KK0NGWF9TY2FubGluZUNvbXBvc2l0b3I6On5DRlhfU2NhbmxpbmVDb21wb3NpdG9yKCkgeworICBpZiAobV9wU3JjUGFsZXR0ZSkgeworICAgIEZYX0ZyZWUobV9wU3JjUGFsZXR0ZSk7CisgIH0KKyAgaWYgKG1fcENhY2hlU2NhbmxpbmUpIHsKKyAgICBGWF9GcmVlKG1fcENhY2hlU2NhbmxpbmUpOworICB9Cit9CitGWF9CT09MIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkluaXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBTcmNQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBtX1NyY0Zvcm1hdCA9IHNyY19mb3JtYXQ7CisgIG1fRGVzdEZvcm1hdCA9IGRlc3RfZm9ybWF0OworICBtX0JsZW5kVHlwZSA9IGJsZW5kX3R5cGU7CisgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBOVUxMOworICBpZiAoQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSkgeworICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgfQorICBpZiAocEljY01vZHVsZSA9PSBOVUxMKSB7CisgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CisgIH0KKyAgbV9wSWNjVHJhbnNmb3JtID0gcEljY1RyYW5zZm9ybTsKKyAgaWYgKChkZXN0X2Zvcm1hdCAmIDB4ZmYpID09IDEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fU3JjRm9ybWF0ID09IEZYRElCXzFicHBNYXNrIHx8IG1fU3JjRm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7CisgICAgcmV0dXJuIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZU1hc2soCisgICAgICAgIGRlc3RfZm9ybWF0LCBhbHBoYV9mbGFnLCBtYXNrX2NvbG9yLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAorICAgICAgICBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwgbV9NYXNrQmxhY2ssIHBJY2NNb2R1bGUsIHBJY2NUcmFuc2Zvcm0pOworICB9CisgIGlmIChwSWNjVHJhbnNmb3JtID09IE5VTEwgJiYgKH5zcmNfZm9ybWF0ICYgMHgwNDAwKSAmJgorICAgICAgKGRlc3RfZm9ybWF0ICYgMHgwNDAwKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoKG1fU3JjRm9ybWF0ICYgMHhmZikgPD0gOCkgeworICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZVBhbGV0dGUoc3JjX2Zvcm1hdCwgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTcmNQYWxldHRlLCBwU3JjUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUsIHBJY2NUcmFuc2Zvcm0pOworICAgIG1fVHJhbnNwYXJlbmN5ID0KKyAgICAgICAgKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IgPyAxIDogMCkgKyAoZGVzdF9mb3JtYXQgJiAweDAyMDAgPyAyIDogMCkgKworICAgICAgICAoZGVzdF9mb3JtYXQgJiAweDA0MDAgPyA0IDogMCkgKyAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxID8gOCA6IDApOworICAgIHJldHVybiBUUlVFOworICB9CisgIG1fVHJhbnNwYXJlbmN5ID0gKHNyY19mb3JtYXQgJiAweDAyMDAgPyAwIDogMSkgKworICAgICAgICAgICAgICAgICAgIChkZXN0X2Zvcm1hdCAmIDB4MDIwMCA/IDAgOiAyKSArCisgICAgICAgICAgICAgICAgICAgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMID8gNCA6IDApICsKKyAgICAgICAgICAgICAgICAgICAoYkNsaXAgPyA4IDogMCkgKyAoc3JjX2Zvcm1hdCAmIDB4MDQwMCA/IDE2IDogMCkgKworICAgICAgICAgICAgICAgICAgIChkZXN0X2Zvcm1hdCAmIDB4MDQwMCA/IDMyIDogMCkgKyAocEljY1RyYW5zZm9ybSA/IDY0IDogMCk7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpDb21wb3NpdGVSZ2JCaXRtYXBMaW5lKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19leHRyYV9hbHBoYSwKKyAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpIHsKKyAgaW50IHNyY19CcHAgPSAobV9TcmNGb3JtYXQgJiAweGZmKSA+PiAzOworICBpbnQgZGVzdF9CcHAgPSAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMzsKKyAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgIHN3aXRjaCAobV9UcmFuc3BhcmVuY3kpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgNDoKKyAgICAgIGNhc2UgODoKKyAgICAgIGNhc2UgMTI6CisgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBzcmNfQnBwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICBjYXNlIDEwOgorICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIHNyY19CcHApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjoKKyAgICAgIGNhc2UgMTQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9CcHAsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA3OgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDk6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIHNyY19CcHAsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMToKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgc3JjX0JwcCwKKyAgICAgICAgICAgIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMzoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIHNyY19CcHAsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNToKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIHNyY19CcHAsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgeworICAgIGlmIChtX1NyY0Zvcm1hdCAmIDB4MDIwMCkgeworICAgICAgaWYgKG1fU3JjRm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMk1hc2soZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGNsaXBfc2Nhbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBfQ29tcG9zaXRlUm93X1JnYmEyTWFzayhkZXN0X3NjYW4sIHNyY19leHRyYV9hbHBoYSwgd2lkdGgsIGNsaXBfc2Nhbik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIF9Db21wb3NpdGVSb3dfUmdiMk1hc2soZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGNsaXBfc2Nhbik7CisgICAgfQorICB9IGVsc2UgaWYgKChtX0Rlc3RGb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDQwMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgICpkZXN0X3NjYW4gPSB+KmRlc3Rfc2NhbjsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICB9CisgICAgfQorICAgIGlmIChtX1NyY0Zvcm1hdCAmIDB4MDIwMCkgeworICAgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDIwMCkgeworICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyR3JheWEoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEsIGRzdF9leHRyYV9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEljY1RyYW5zZm9ybSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLCBtX3BJY2NUcmFuc2Zvcm0pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkdyYXlhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19CcHAsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEljY1RyYW5zZm9ybSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJHcmF5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19CcHAsIHdpZHRoLCBtX0JsZW5kVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIG1fcEljY1RyYW5zZm9ybSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDA0MDApIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAqZGVzdF9zY2FuID0gfipkZXN0X3NjYW47CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgZGVzdF9TaXplID0gd2lkdGggKiBkZXN0X0JwcCArIDQ7CisgICAgaWYgKGRlc3RfU2l6ZSA+IG1fQ2FjaGVTaXplKSB7CisgICAgICBtX3BDYWNoZVNjYW5saW5lID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BDYWNoZVNjYW5saW5lLCBkZXN0X1NpemUpOworICAgICAgaWYgKCFtX3BDYWNoZVNjYW5saW5lKSB7CiAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG1fQ2FjaGVTaXplID0gZGVzdF9TaXplOwogICAgIH0KLSAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4gPSBOVUxMOwotICAgIGlmIChtX3BDbGlwTWFzaykKLSAgICAgICAgY2xpcF9zY2FuID0gbV9wQ2xpcE1hc2stPkdldEJ1ZmZlcigpICsgKG1fRGVzdFRvcCArIGxpbmUgLSBtX3BDbGlwUmduLT5HZXRCb3goKS50b3ApICoKLSAgICAgICAgICAgICAgICAgICAgbV9wQ2xpcE1hc2stPkdldFBpdGNoKCkgKyAobV9EZXN0TGVmdCAtIG1fcENsaXBSZ24tPkdldEJveCgpLmxlZnQpOwotICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BCaXRtYXAtPkdldFNjYW5saW5lKGxpbmUgKyBtX0Rlc3RUb3ApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9EZXN0TGVmdCAqIG1fcEJpdG1hcC0+R2V0QlBQKCkgLyA4OwotICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiA9IG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKW1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShsaW5lICsgbV9EZXN0VG9wKSArIG1fRGVzdExlZnQgOiBOVUxMOwotICAgIERvQ29tcG9zZShkZXN0X3NjYW4sIHNjYW5saW5lLCBtX0Rlc3RXaWR0aCwgY2xpcF9zY2FuLCBzY2FuX2V4dHJhX2FscGhhLCBkZXN0X2FscGhhX3NjYW4pOworICAgIHN3aXRjaCAobV9UcmFuc3BhcmVuY3kpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgNDoKKyAgICAgIGNhc2UgODoKKyAgICAgIGNhc2UgNCArIDg6IHsKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMkFyZ2IoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSwgc3JjX2V4dHJhX2FscGhhKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIDY0OgorICAgICAgY2FzZSA0ICsgNjQ6CisgICAgICBjYXNlIDggKyA2NDoKKyAgICAgIGNhc2UgNCArIDggKyA2NDogeworICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyQXJnYl9UcmFuc2Zvcm0oCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhLAorICAgICAgICAgICAgc3JjX2V4dHJhX2FscGhhLCBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9Ob0NsaXAoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIHNyY19CcHAsIGRzdF9leHRyYV9hbHBoYSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxICsgNjQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgZHN0X2V4dHJhX2FscGhhLAorICAgICAgICAgICAgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyA4OgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyA4ICsgNjQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfQ2xpcF9UcmFuc2Zvcm0oCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIHNyY19CcHAsIGNsaXBfc2NhbiwKKyAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSwgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyA0OgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19CcHAsIGRzdF9leHRyYV9hbHBoYSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxICsgNCArIDY0OgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBzcmNfQnBwLCBkc3RfZXh0cmFfYWxwaGEsCisgICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDQgKyA4OgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDQgKyA4ICsgNjQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwX1RyYW5zZm9ybSgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBzcmNfQnBwLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSwKKyAgICAgICAgICAgIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgY2FzZSAyICsgODoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9CcHAsIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgKyA2NDoKKyAgICAgIGNhc2UgMiArIDggKyA2NDoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZF9UcmFuc2Zvcm0oCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLCBjbGlwX3NjYW4sCisgICAgICAgICAgICBzcmNfZXh0cmFfYWxwaGEsIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyICsgNDoKKyAgICAgIGNhc2UgMiArIDQgKyA4OgorICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiArIDQgKyA2NDoKKyAgICAgIGNhc2UgMiArIDQgKyA4ICsgNjQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZF9UcmFuc2Zvcm0oCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLAorICAgICAgICAgICAgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyAyOgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgc3JjX0JwcCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxICsgMiArIDY0OgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHAsCisgICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDIgKyA4OgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLCBzcmNfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDIgKyA4ICsgNjQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwX1RyYW5zZm9ybSgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHAsCisgICAgICAgICAgICBjbGlwX3NjYW4sIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxICsgMiArIDQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfQnBwLCBzcmNfQnBwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyAyICsgNCArIDY0OgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXBfVHJhbnNmb3JtKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwLCBtX3BDYWNoZVNjYW5saW5lLAorICAgICAgICAgICAgbV9wSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyAyICsgNCArIDg6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19CcHAsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxICsgMiArIDQgKyA4ICsgNjQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXBfVHJhbnNmb3JtKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwLCBjbGlwX3NjYW4sCisgICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIH0KLXZvaWQgQ0ZYX0JpdG1hcENvbXBvc2VyOjpDb21wb3NlU2NhbmxpbmVWKGludCBsaW5lLCBjb25zdCB1aW50OF90KiBzY2FubGluZSwgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgQnBwID0gbV9wQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgaW50IGRlc3RfcGl0Y2ggPSBtX3BCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgaW50IGRlc3RfYWxwaGFfcGl0Y2ggPSBtX3BCaXRtYXAtPm1fcEFscGhhTWFzayA/IG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpIDogMDsKLSAgICBpbnQgZGVzdF94ID0gbV9EZXN0TGVmdCArIChtX2JGbGlwWCA/IChtX0Rlc3RXaWR0aCAtIGxpbmUgLSAxKSA6IGxpbmUpOwotICAgIHVpbnQ4X3QqIGRlc3RfYnVmID0gbV9wQml0bWFwLT5HZXRCdWZmZXIoKSArIGRlc3RfeCAqIEJwcCArIG1fRGVzdFRvcCAqIGRlc3RfcGl0Y2g7Ci0gICAgdWludDhfdCogZGVzdF9hbHBoYV9idWYgPSBtX3BCaXRtYXAtPm1fcEFscGhhTWFzayA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpICsgZGVzdF94ICsgbV9EZXN0VG9wICogZGVzdF9hbHBoYV9waXRjaCA6IE5VTEw7Cit2b2lkIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkNvbXBvc2l0ZVBhbEJpdG1hcExpbmUoCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCBzcmNfbGVmdCwKKyAgICBpbnQgd2lkdGgsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19leHRyYV9hbHBoYSwKKyAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpIHsKKyAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgIGlmIChtX1NyY0Zvcm1hdCA9PSBGWERJQl8xYnBwUmdiKSB7CisgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBSZ2IpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7CisgICAgICAgIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJBcmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLCBtX3BTcmNQYWxldHRlLCBjbGlwX3NjYW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCBtX3BTcmNQYWxldHRlLCB3aWR0aCwKKyAgICAgICAgICAgIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBSZ2IpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7CisgICAgICAgIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJBcmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fcFNyY1BhbGV0dGUsIGNsaXBfc2Nhbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9wU3JjUGFsZXR0ZSwgd2lkdGgsCisgICAgICAgICAgICAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKKyAgICBfQ29tcG9zaXRlUm93X1JnYjJNYXNrKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBjbGlwX3NjYW4pOworICAgIHJldHVybjsKKyAgfQorICBpZiAoKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICBpZiAobV9UcmFuc3BhcmVuY3kgJiA4KSB7CisgICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7CisgICAgICAgIF9Db21wb3NpdGVSb3dfMWJwcFBhbDJHcmF5YShkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KiltX3BTcmNQYWxldHRlLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfQ29tcG9zaXRlUm93XzFicHBQYWwyR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKW1fcFNyY1BhbGV0dGUsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDIwMCkKKyAgICAgICAgX0NvbXBvc2l0ZVJvd184YnBwUGFsMkdyYXlhKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgKGNvbnN0IHVpbnQ4X3QqKW1fcFNyY1BhbGV0dGUsIHdpZHRoLAorICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhLCBzcmNfZXh0cmFfYWxwaGEpOworICAgICAgZWxzZQorICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBQYWwyR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopbV9wU3JjUGFsZXR0ZSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaCAobV9UcmFuc3BhcmVuY3kpIHsKKyAgICAgIGNhc2UgMSArIDI6CisgICAgICAgIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJBcmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3JjUGFsZXR0ZSwgY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19leHRyYV9hbHBoYSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxICsgMiArIDg6CisgICAgICAgIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJBcmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFNyY1BhbGV0dGUsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAwOgorICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9wU3JjUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDAgKyA4OgorICAgICAgICBfQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiX05vQmxlbmQoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgbV9wU3JjUGFsZXR0ZSwgd2lkdGgsCisgICAgICAgICAgICAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDAgKyAyOgorICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9wU3JjUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDAgKyAyICsgODoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYmFfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3JjUGFsZXR0ZSwgY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSk7CisgICAgICAgIGJyZWFrOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KK3ZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q29tcG9zaXRlQnl0ZU1hc2tMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKSB7CisgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKKyAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMk1hc2soZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4pOworICB9IGVsc2UgaWYgKChtX0Rlc3RGb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDIwMCkgeworICAgICAgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJHcmF5YShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEpOworICAgIH0gZWxzZSB7CisgICAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgY2xpcF9zY2FuKTsKKyAgICB9CisgIH0gZWxzZSBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKQorICAgICAgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJBcmdiX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwKKyAgICAgICAgICB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbik7CisgICAgZWxzZQorICAgICAgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2JfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAorICAgICAgICAgIHdpZHRoLCBtX0JsZW5kVHlwZSwgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKQorICAgIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syQXJnYihkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4pOworICBlbHNlIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiIHx8IG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2IzMikKKyAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMlJnYihkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLCB3aWR0aCwgbV9CbGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7CisgIGVsc2UgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2JhKQorICAgIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiYShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7Cit9Cit2b2lkIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkNvbXBvc2l0ZUJpdE1hc2tMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSkgeworICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7CisgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMk1hc2soZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBjbGlwX3NjYW4pOworICB9IGVsc2UgaWYgKChtX0Rlc3RGb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDIwMCkKKyAgICAgIF9Db21wb3NpdGVSb3dfQml0TWFzazJHcmF5YShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19sZWZ0LCB3aWR0aCwgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEpOworICAgIGVsc2UgeworICAgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19sZWZ0LCB3aWR0aCwgY2xpcF9zY2FuKTsKKyAgICB9CisgIH0gZWxzZSBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKQorICAgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkFyZ2JfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAorICAgICAgICAgIHNyY19sZWZ0LCB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbik7CisgICAgZWxzZQorICAgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYl9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCisgICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBtX0JsZW5kVHlwZSwgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKQorICAgIF9Db21wb3NpdGVSb3dfQml0TWFzazJBcmdiKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsIHNyY19sZWZ0LCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuKTsKKyAgZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYiB8fCBtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiMzIpCisgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYigKKyAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCisgICAgICAgIHNyY19sZWZ0LCB3aWR0aCwgbV9CbGVuZFR5cGUsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOworfQorRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbXBvc2l0ZUJpdG1hcChpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBBU1NFUlQoIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpOworICBBU1NFUlQobV9icHAgPj0gOCk7CisgIGlmIChwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpIHx8IG1fYnBwIDwgOCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKSwgc3JjX2xlZnQsIHNyY190b3AsIHBDbGlwUmduKTsKKyAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBjb25zdCBDRlhfRElCaXRtYXAqIHBDbGlwTWFzayA9IE5VTEw7CisgIEZYX1JFQ1QgY2xpcF9ib3g7CisgIGlmIChwQ2xpcFJnbiAmJiBwQ2xpcFJnbi0+R2V0VHlwZSgpICE9IENGWF9DbGlwUmduOjpSZWN0SSkgeworICAgIEFTU0VSVChwQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRik7CisgICAgcENsaXBNYXNrID0gcENsaXBSZ24tPkdldE1hc2soKTsKKyAgICBjbGlwX2JveCA9IHBDbGlwUmduLT5HZXRCb3goKTsKKyAgfQorICBDRlhfU2NhbmxpbmVDb21wb3NpdG9yIGNvbXBvc2l0b3I7CisgIGlmICghY29tcG9zaXRvci5Jbml0KEdldEZvcm1hdCgpLCBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSwgMCwgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcENsaXBNYXNrICE9IE5VTEwsIGJSZ2JCeXRlT3JkZXIsIDAsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBkZXN0X0JwcCA9IG1fYnBwIC8gODsKKyAgaW50IHNyY19CcHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7CisgIEZYX0JPT0wgYlJnYiA9IHNyY19CcHAgPiAxICYmICFwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpOworICBDRlhfRElCaXRtYXAqIHBTcmNBbHBoYU1hc2sgPSBwU3JjQml0bWFwLT5tX3BBbHBoYU1hc2s7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPQorICAgICAgICBtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIGRlc3RfQnBwOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIHNyY19CcHA7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW5fZXh0cmFfYWxwaGEgPQorICAgICAgICBwU3JjQWxwaGFNYXNrID8gcFNyY0FscGhhTWFzay0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdAorICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICB1aW50OF90KiBkc3Rfc2Nhbl9leHRyYV9hbHBoYSA9CisgICAgICAgIG1fcEFscGhhTWFzaworICAgICAgICAgICAgPyAodWludDhfdCopbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShkZXN0X3RvcCArIHJvdykgKyBkZXN0X2xlZnQKKyAgICAgICAgICAgIDogTlVMTDsKKyAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4gPSBOVUxMOworICAgIGlmIChwQ2xpcE1hc2spIHsKKyAgICAgIGNsaXBfc2NhbiA9IHBDbGlwTWFzay0+bV9wQnVmZmVyICsKKyAgICAgICAgICAgICAgICAgIChkZXN0X3RvcCArIHJvdyAtIGNsaXBfYm94LnRvcCkgKiBwQ2xpcE1hc2stPm1fUGl0Y2ggKworICAgICAgICAgICAgICAgICAgKGRlc3RfbGVmdCAtIGNsaXBfYm94LmxlZnQpOworICAgIH0KKyAgICBpZiAoYlJnYikgeworICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVSZ2JCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW5fZXh0cmFfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOworICAgIH0gZWxzZSB7CisgICAgICBjb21wb3NpdG9yLkNvbXBvc2l0ZVBhbEJpdG1hcExpbmUoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX3NjYW5fZXh0cmFfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVNYXNrKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEFTU0VSVChwTWFzay0+SXNBbHBoYU1hc2soKSk7CisgIEFTU0VSVChtX2JwcCA+PSA4KTsKKyAgaWYgKCFwTWFzay0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDgpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcE1hc2stPkdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgIHBNYXNrLT5HZXRIZWlnaHQoKSwgc3JjX2xlZnQsIHNyY190b3AsIHBDbGlwUmduKTsKKyAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpbnQgc3JjX2FscGhhID0KKyAgICAgICh1aW50OF90KShhbHBoYV9mbGFnID4+IDgpID8gKGFscGhhX2ZsYWcgJiAweGZmKSA6IEZYQVJHQl9BKGNvbG9yKTsKKyAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQ2xpcE1hc2sgPSBOVUxMOworICBGWF9SRUNUIGNsaXBfYm94OworICBpZiAocENsaXBSZ24gJiYgcENsaXBSZ24tPkdldFR5cGUoKSAhPSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKKyAgICBBU1NFUlQocENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6TWFza0YpOworICAgIHBDbGlwTWFzayA9IHBDbGlwUmduLT5HZXRNYXNrKCk7CisgICAgY2xpcF9ib3ggPSBwQ2xpcFJnbi0+R2V0Qm94KCk7CisgIH0KKyAgaW50IHNyY19icHAgPSBwTWFzay0+R2V0QlBQKCk7CisgIGludCBCcHAgPSBHZXRCUFAoKSAvIDg7CisgIENGWF9TY2FubGluZUNvbXBvc2l0b3IgY29tcG9zaXRvcjsKKyAgaWYgKCFjb21wb3NpdG9yLkluaXQoR2V0Rm9ybWF0KCksIHBNYXNrLT5HZXRGb3JtYXQoKSwgd2lkdGgsIE5VTEwsIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICBibGVuZF90eXBlLCBwQ2xpcE1hc2sgIT0gTlVMTCwgYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgIG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogQnBwOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcE1hc2stPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOworICAgIHVpbnQ4X3QqIGRzdF9zY2FuX2V4dHJhX2FscGhhID0KKyAgICAgICAgbV9wQWxwaGFNYXNrCisgICAgICAgICAgICA/ICh1aW50OF90KiltX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGRlc3RfdG9wICsgcm93KSArIGRlc3RfbGVmdAorICAgICAgICAgICAgOiBOVUxMOworICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiA9IE5VTEw7CisgICAgaWYgKHBDbGlwTWFzaykgeworICAgICAgY2xpcF9zY2FuID0gcENsaXBNYXNrLT5tX3BCdWZmZXIgKworICAgICAgICAgICAgICAgICAgKGRlc3RfdG9wICsgcm93IC0gY2xpcF9ib3gudG9wKSAqIHBDbGlwTWFzay0+bV9QaXRjaCArCisgICAgICAgICAgICAgICAgICAoZGVzdF9sZWZ0IC0gY2xpcF9ib3gubGVmdCk7CisgICAgfQorICAgIGlmIChzcmNfYnBwID09IDEpIHsKKyAgICAgIGNvbXBvc2l0b3IuQ29tcG9zaXRlQml0TWFza0xpbmUoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIGRzdF9zY2FuX2V4dHJhX2FscGhhKTsKKyAgICB9IGVsc2UgeworICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVCeXRlTWFza0xpbmUoZGVzdF9zY2FuLCBzcmNfc2NhbiArIHNyY19sZWZ0LCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVSZWN0KGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IHNyY19hbHBoYSA9IChhbHBoYV9mbGFnID4+IDgpID8gKGFscGhhX2ZsYWcgJiAweGZmKSA6IEZYQVJHQl9BKGNvbG9yKTsKKyAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoLCB0b3AgKyBoZWlnaHQpOworICByZWN0LkludGVyc2VjdCgwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCk7CisgIGlmIChyZWN0LklzRW1wdHkoKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHdpZHRoID0gcmVjdC5XaWR0aCgpOworICBGWF9EV09SRCBkc3RfY29sb3I7CisgIGlmIChhbHBoYV9mbGFnID4+IDgpIHsKKyAgICBkc3RfY29sb3IgPSBGWENNWUtfVE9ESUIoY29sb3IpOworICB9IGVsc2UgeworICAgIGRzdF9jb2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7CisgIH0KKyAgdWludDhfdCogY29sb3JfcCA9ICh1aW50OF90KikmZHN0X2NvbG9yOworICBpZiAobV9icHAgPT0gOCkgeworICAgIHVpbnQ4X3QgZ3JheSA9IDI1NTsKKyAgICBpZiAoIUlzQWxwaGFNYXNrKCkpIHsKKyAgICAgIGlmIChwSWNjVHJhbnNmb3JtICYmIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkgJiYKKyAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgeworICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgY29sb3JfcCwgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7CisgICAgICAgICAgdWludDhfdCByLCBnLCBiOworICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShjb2xvcl9wWzBdLCBjb2xvcl9wWzFdLCBjb2xvcl9wWzJdLCBjb2xvcl9wWzNdLCByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLCBiKTsKKyAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBncmF5ID0gKHVpbnQ4X3QpRlhSR0IyR1JBWSgoaW50KWNvbG9yX3BbMl0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMF0pOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoSXNDbXlrSW1hZ2UoKSkgeworICAgICAgICBncmF5ID0gfmdyYXk7CisgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2ggKyByZWN0LmxlZnQ7CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICBGWFNZU19tZW1zZXQoZGVzdF9zY2FuLCBncmF5LCB3aWR0aCk7CisgICAgICB9IGVsc2UKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIHNyY19hbHBoYSk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKG1fYnBwID09IDEpIHsKKyAgICBBU1NFUlQoIUlzQ215a0ltYWdlKCkgJiYgKHVpbnQ4X3QpKGFscGhhX2ZsYWcgPj4gOCkgPT0gMCk7CisgICAgaW50IGxlZnRfc2hpZnQgPSByZWN0LmxlZnQgJSA4OworICAgIGludCByaWdodF9zaGlmdCA9IHJlY3QucmlnaHQgJSA4OworICAgIGludCB3aWR0aCA9IHJlY3QucmlnaHQgLyA4IC0gcmVjdC5sZWZ0IC8gODsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGlmIChtX3BQYWxldHRlID09IE5VTEwpIHsKKyAgICAgIGluZGV4ID0gKCh1aW50OF90KWNvbG9yID09IDB4ZmYpID8gMSA6IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICBpZiAobV9wUGFsZXR0ZVtpXSA9PSBjb2xvcikgeworICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdysrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW5fdG9wID0gKHVpbnQ4X3QqKUdldFNjYW5saW5lKHJvdykgKyByZWN0LmxlZnQgLyA4OworICAgICAgdWludDhfdCogZGVzdF9zY2FuX3RvcF9yID0gKHVpbnQ4X3QqKUdldFNjYW5saW5lKHJvdykgKyByZWN0LnJpZ2h0IC8gODsKKyAgICAgIHVpbnQ4X3QgbGVmdF9mbGFnID0gKmRlc3Rfc2Nhbl90b3AgJiAoMjU1IDw8ICg4IC0gbGVmdF9zaGlmdCkpOworICAgICAgdWludDhfdCByaWdodF9mbGFnID0gKmRlc3Rfc2Nhbl90b3BfciAmICgyNTUgPj4gcmlnaHRfc2hpZnQpOworICAgICAgaWYgKHdpZHRoKSB7CisgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW5fdG9wICsgMSwgaW5kZXggPyAyNTUgOiAwLCB3aWR0aCAtIDEpOworICAgICAgICBpZiAoIWluZGV4KSB7CisgICAgICAgICAgKmRlc3Rfc2Nhbl90b3AgJj0gbGVmdF9mbGFnOworICAgICAgICAgICpkZXN0X3NjYW5fdG9wX3IgJj0gcmlnaHRfZmxhZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqZGVzdF9zY2FuX3RvcCB8PSB+bGVmdF9mbGFnOworICAgICAgICAgICpkZXN0X3NjYW5fdG9wX3IgfD0gfnJpZ2h0X2ZsYWc7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghaW5kZXgpIHsKKyAgICAgICAgICAqZGVzdF9zY2FuX3RvcCAmPSBsZWZ0X2ZsYWcgfCByaWdodF9mbGFnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpkZXN0X3NjYW5fdG9wIHw9IH4obGVmdF9mbGFnIHwgcmlnaHRfZmxhZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQVNTRVJUKG1fYnBwID49IDI0KTsKKyAgaWYgKG1fYnBwIDwgMjQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBJY2NUcmFuc2Zvcm0gJiYgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSkgeworICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBjb2xvcl9wLCBjb2xvcl9wLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoYWxwaGFfZmxhZyA+PiA4ICYmICFJc0NteWtJbWFnZSgpKQorICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9wWzJdLCBjb2xvcl9wWzFdLCBjb2xvcl9wWzBdKTsKKyAgICBlbHNlIGlmICghKGFscGhhX2ZsYWcgPj4gOCkgJiYgSXNDbXlrSW1hZ2UoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBpZiAoIUlzQ215a0ltYWdlKCkpIHsKKyAgICBjb2xvcl9wWzNdID0gKHVpbnQ4X3Qpc3JjX2FscGhhOworICB9CisgIGludCBCcHAgPSBtX2JwcCAvIDg7CisgIEZYX0JPT0wgYkFscGhhID0gSGFzQWxwaGEoKTsKKyAgRlhfQk9PTCBiQXJnYiA9IEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IgPyBUUlVFIDogRkFMU0U7CisgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIHJlY3QubGVmdCAqIEJwcDsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl9hbHBoYSA9CisgICAgICAgICAgbV9wQWxwaGFNYXNrID8gKHVpbnQ4X3QqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdAorICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICBpZiAoZGVzdF9zY2FuX2FscGhhKSB7CisgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW5fYWxwaGEsIDB4ZmYsIHdpZHRoKTsKKyAgICAgIH0KKyAgICAgIGlmIChCcHAgPT0gNCkgeworICAgICAgICBGWF9EV09SRCogc2NhbiA9IChGWF9EV09SRCopZGVzdF9zY2FuOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqc2NhbisrID0gZHN0X2NvbG9yOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBjb2xvcl9wWzBdOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGNvbG9yX3BbMV07CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gY29sb3JfcFsyXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIHJlY3QubGVmdCAqIEJwcDsKKyAgICBpZiAoYkFscGhhKSB7CisgICAgICBpZiAoYkFyZ2IpIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIGNvbG9yX3BbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfcFsxXSwgY29sb3JfcFswXSkpOworICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFswXSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBjb2xvcl9wWzFdLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGNvbG9yX3BbMl0sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW5fYWxwaGEgPQorICAgICAgICAgICAgKHVpbnQ4X3QqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3Rfc2Nhbl9hbHBoYTsKKyAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuX2FscGhhKysgPSBzcmNfYWxwaGE7CisgICAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBjb2xvcl9wLCBCcHApOworICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICAqZGVzdF9zY2FuX2FscGhhKysgPSBkZXN0X2FscGhhOworICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgZm9yIChpbnQgY29tcHMgPSAwOyBjb21wcyA8IEJwcDsgY29tcHMrKykgeworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFtjb21wc10sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgZm9yIChpbnQgY29tcHMgPSAwOyBjb21wcyA8IEJwcDsgY29tcHMrKykgeworICAgICAgICAgIGlmIChjb21wcyA9PSAzKSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAyNTU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGNvbG9yX3BbY29tcHNdLCBzcmNfYWxwaGEpOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorQ0ZYX0JpdG1hcENvbXBvc2VyOjpDRlhfQml0bWFwQ29tcG9zZXIoKSB7CisgIG1fcFNjYW5saW5lViA9IE5VTEw7CisgIG1fcFNjYW5saW5lQWxwaGFWID0gTlVMTDsKKyAgbV9wQ2xpcFNjYW5WID0gTlVMTDsKKyAgbV9wQWRkQ2xpcFNjYW4gPSBOVUxMOworICBtX2JSZ2JCeXRlT3JkZXIgPSBGQUxTRTsKKyAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7Cit9CitDRlhfQml0bWFwQ29tcG9zZXI6On5DRlhfQml0bWFwQ29tcG9zZXIoKSB7CisgIGlmIChtX3BTY2FubGluZVYpIHsKKyAgICBGWF9GcmVlKG1fcFNjYW5saW5lVik7CisgIH0KKyAgaWYgKG1fcFNjYW5saW5lQWxwaGFWKSB7CisgICAgRlhfRnJlZShtX3BTY2FubGluZUFscGhhVik7CisgIH0KKyAgaWYgKG1fcENsaXBTY2FuVikgeworICAgIEZYX0ZyZWUobV9wQ2xpcFNjYW5WKTsKKyAgfQorICBpZiAobV9wQWRkQ2xpcFNjYW4pIHsKKyAgICBGWF9GcmVlKG1fcEFkZENsaXBTY2FuKTsKKyAgfQorfQordm9pZCBDRlhfQml0bWFwQ29tcG9zZXI6OkNvbXBvc2UoQ0ZYX0RJQml0bWFwKiBwRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCYgZGVzdF9yZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgbV9wQml0bWFwID0gcERlc3Q7CisgIG1fcENsaXBSZ24gPSBwQ2xpcFJnbjsKKyAgbV9EZXN0TGVmdCA9IGRlc3RfcmVjdC5sZWZ0OworICBtX0Rlc3RUb3AgPSBkZXN0X3JlY3QudG9wOworICBtX0Rlc3RXaWR0aCA9IGRlc3RfcmVjdC5XaWR0aCgpOworICBtX0Rlc3RIZWlnaHQgPSBkZXN0X3JlY3QuSGVpZ2h0KCk7CisgIG1fQml0bWFwQWxwaGEgPSBiaXRtYXBfYWxwaGE7CisgIG1fTWFza0NvbG9yID0gbWFza19jb2xvcjsKKyAgbV9wQ2xpcE1hc2sgPSBOVUxMOworICBpZiAocENsaXBSZ24gJiYgcENsaXBSZ24tPkdldFR5cGUoKSAhPSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKKyAgICBtX3BDbGlwTWFzayA9IHBDbGlwUmduLT5HZXRNYXNrKCk7CisgIH0KKyAgbV9iVmVydGljYWwgPSBiVmVydGljYWw7CisgIG1fYkZsaXBYID0gYkZsaXBYOworICBtX2JGbGlwWSA9IGJGbGlwWTsKKyAgbV9BbHBoYUZsYWcgPSBhbHBoYV9mbGFnOworICBtX3BJY2NUcmFuc2Zvcm0gPSBwSWNjVHJhbnNmb3JtOworICBtX2JSZ2JCeXRlT3JkZXIgPSBiUmdiQnl0ZU9yZGVyOworICBtX0JsZW5kVHlwZSA9IGJsZW5kX3R5cGU7Cit9CitGWF9CT09MIENGWF9CaXRtYXBDb21wb3Nlcjo6U2V0SW5mbyhpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFNyY1BhbGV0dGUpIHsKKyAgbV9TcmNGb3JtYXQgPSBzcmNfZm9ybWF0OworICBpZiAoIW1fQ29tcG9zaXRvci5Jbml0KG1fcEJpdG1hcC0+R2V0Rm9ybWF0KCksIHNyY19mb3JtYXQsIHdpZHRoLCBwU3JjUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX01hc2tDb2xvciwgRlhESUJfQkxFTkRfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENsaXBNYXNrICE9IE5VTEwgfHwgKG1fQml0bWFwQWxwaGEgPCAyNTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlJnYkJ5dGVPcmRlciwgbV9BbHBoYUZsYWcsIG1fcEljY1RyYW5zZm9ybSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fYlZlcnRpY2FsKSB7CisgICAgbV9wU2NhbmxpbmVWID0gRlhfQWxsb2ModWludDhfdCwgbV9wQml0bWFwLT5HZXRCUFAoKSAvIDggKiB3aWR0aCArIDQpOworICAgIG1fcENsaXBTY2FuViA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOworICAgIGlmIChtX3BCaXRtYXAtPm1fcEFscGhhTWFzaykgeworICAgICAgbV9wU2NhbmxpbmVBbHBoYVYgPSBGWF9BbGxvYyh1aW50OF90LCB3aWR0aCArIDQpOworICAgIH0KKyAgfQorICBpZiAobV9CaXRtYXBBbHBoYSA8IDI1NSkgeworICAgIG1fcEFkZENsaXBTY2FuID0gRlhfQWxsb2MoCisgICAgICAgIHVpbnQ4X3QsIG1fYlZlcnRpY2FsID8gbV9wQml0bWFwLT5HZXRIZWlnaHQoKSA6IG1fcEJpdG1hcC0+R2V0V2lkdGgoKSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENGWF9CaXRtYXBDb21wb3Nlcjo6RG9Db21wb3NlKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19leHRyYV9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKSB7CisgIGlmIChtX0JpdG1hcEFscGhhIDwgMjU1KSB7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXN0X3dpZHRoOyBpKyspIHsKKyAgICAgICAgbV9wQWRkQ2xpcFNjYW5baV0gPSBjbGlwX3NjYW5baV0gKiBtX0JpdG1hcEFscGhhIC8gMjU1OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBGWFNZU19tZW1zZXQobV9wQWRkQ2xpcFNjYW4sIG1fQml0bWFwQWxwaGEsIGRlc3Rfd2lkdGgpOworICAgIH0KKyAgICBjbGlwX3NjYW4gPSBtX3BBZGRDbGlwU2NhbjsKKyAgfQorICBpZiAobV9TcmNGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKKyAgICBtX0NvbXBvc2l0b3IuQ29tcG9zaXRlQnl0ZU1hc2tMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7CisgIH0gZWxzZSBpZiAoKG1fU3JjRm9ybWF0ICYgMHhmZikgPT0gOCkgeworICAgIG1fQ29tcG9zaXRvci5Db21wb3NpdGVQYWxCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIDAsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhKTsKKyAgfSBlbHNlIHsKKyAgICBtX0NvbXBvc2l0b3IuQ29tcG9zaXRlUmdiQml0bWFwTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSk7CisgIH0KK30KK3ZvaWQgQ0ZYX0JpdG1hcENvbXBvc2VyOjpDb21wb3NlU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhKSB7CisgIGlmIChtX2JWZXJ0aWNhbCkgeworICAgIENvbXBvc2VTY2FubGluZVYobGluZSwgc2NhbmxpbmUsIHNjYW5fZXh0cmFfYWxwaGEpOworICAgIHJldHVybjsKKyAgfQorICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4gPSBOVUxMOworICBpZiAobV9wQ2xpcE1hc2spCisgICAgY2xpcF9zY2FuID0gbV9wQ2xpcE1hc2stPkdldEJ1ZmZlcigpICsKKyAgICAgICAgICAgICAgICAobV9EZXN0VG9wICsgbGluZSAtIG1fcENsaXBSZ24tPkdldEJveCgpLnRvcCkgKgorICAgICAgICAgICAgICAgICAgICBtX3BDbGlwTWFzay0+R2V0UGl0Y2goKSArCisgICAgICAgICAgICAgICAgKG1fRGVzdExlZnQgLSBtX3BDbGlwUmduLT5HZXRCb3goKS5sZWZ0KTsKKyAgdWludDhfdCogZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcEJpdG1hcC0+R2V0U2NhbmxpbmUobGluZSArIG1fRGVzdFRvcCkgKworICAgICAgICAgICAgICAgICAgICAgICBtX0Rlc3RMZWZ0ICogbV9wQml0bWFwLT5HZXRCUFAoKSAvIDg7CisgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiA9CisgICAgICBtX3BCaXRtYXAtPm1fcEFscGhhTWFzaworICAgICAgICAgID8gKHVpbnQ4X3QqKW1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShsaW5lICsgbV9EZXN0VG9wKSArCisgICAgICAgICAgICAgICAgbV9EZXN0TGVmdAorICAgICAgICAgIDogTlVMTDsKKyAgRG9Db21wb3NlKGRlc3Rfc2Nhbiwgc2NhbmxpbmUsIG1fRGVzdFdpZHRoLCBjbGlwX3NjYW4sIHNjYW5fZXh0cmFfYWxwaGEsCisgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4pOworfQordm9pZCBDRlhfQml0bWFwQ29tcG9zZXI6OkNvbXBvc2VTY2FubGluZVYoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEpIHsKKyAgaW50IGk7CisgIGludCBCcHAgPSBtX3BCaXRtYXAtPkdldEJQUCgpIC8gODsKKyAgaW50IGRlc3RfcGl0Y2ggPSBtX3BCaXRtYXAtPkdldFBpdGNoKCk7CisgIGludCBkZXN0X2FscGhhX3BpdGNoID0KKyAgICAgIG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrID8gbV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFBpdGNoKCkgOiAwOworICBpbnQgZGVzdF94ID0gbV9EZXN0TGVmdCArIChtX2JGbGlwWCA/IChtX0Rlc3RXaWR0aCAtIGxpbmUgLSAxKSA6IGxpbmUpOworICB1aW50OF90KiBkZXN0X2J1ZiA9CisgICAgICBtX3BCaXRtYXAtPkdldEJ1ZmZlcigpICsgZGVzdF94ICogQnBwICsgbV9EZXN0VG9wICogZGVzdF9waXRjaDsKKyAgdWludDhfdCogZGVzdF9hbHBoYV9idWYgPSBtX3BCaXRtYXAtPm1fcEFscGhhTWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfeCArIG1fRGVzdFRvcCAqIGRlc3RfYWxwaGFfcGl0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICBpZiAobV9iRmxpcFkpIHsKKyAgICBkZXN0X2J1ZiArPSBkZXN0X3BpdGNoICogKG1fRGVzdEhlaWdodCAtIDEpOworICAgIGRlc3RfYWxwaGFfYnVmICs9IGRlc3RfYWxwaGFfcGl0Y2ggKiAobV9EZXN0SGVpZ2h0IC0gMSk7CisgIH0KKyAgaW50IHlfc3RlcCA9IGRlc3RfcGl0Y2g7CisgIGludCB5X2FscGhhX3N0ZXAgPSBkZXN0X2FscGhhX3BpdGNoOworICBpZiAobV9iRmxpcFkpIHsKKyAgICB5X3N0ZXAgPSAteV9zdGVwOworICAgIHlfYWxwaGFfc3RlcCA9IC15X2FscGhhX3N0ZXA7CisgIH0KKyAgdWludDhfdCogc3JjX3NjYW4gPSBtX3BTY2FubGluZVY7CisgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmOworICBmb3IgKGkgPSAwOyBpIDwgbV9EZXN0SGVpZ2h0OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IEJwcDsgaisrKSB7CisgICAgICAqc3JjX3NjYW4rKyA9IGRlc3Rfc2NhbltqXTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IHlfc3RlcDsKKyAgfQorICB1aW50OF90KiBzcmNfYWxwaGFfc2NhbiA9IG1fcFNjYW5saW5lQWxwaGFWOworICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4gPSBkZXN0X2FscGhhX2J1ZjsKKyAgaWYgKGRlc3RfYWxwaGFfc2NhbikgeworICAgIGZvciAoaSA9IDA7IGkgPCBtX0Rlc3RIZWlnaHQ7IGkrKykgeworICAgICAgKnNyY19hbHBoYV9zY2FuKysgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgICAgZGVzdF9hbHBoYV9zY2FuICs9IHlfYWxwaGFfc3RlcDsKKyAgICB9CisgIH0KKyAgdWludDhfdCogY2xpcF9zY2FuID0gTlVMTDsKKyAgaWYgKG1fcENsaXBNYXNrKSB7CisgICAgY2xpcF9zY2FuID0gbV9wQ2xpcFNjYW5WOworICAgIGludCBjbGlwX3BpdGNoID0gbV9wQ2xpcE1hc2stPkdldFBpdGNoKCk7CisgICAgY29uc3QgdWludDhfdCogc3JjX2NsaXAgPQorICAgICAgICBtX3BDbGlwTWFzay0+R2V0QnVmZmVyKCkgKworICAgICAgICAobV9EZXN0VG9wIC0gbV9wQ2xpcFJnbi0+R2V0Qm94KCkudG9wKSAqIGNsaXBfcGl0Y2ggKworICAgICAgICAoZGVzdF94IC0gbV9wQ2xpcFJnbi0+R2V0Qm94KCkubGVmdCk7CiAgICAgaWYgKG1fYkZsaXBZKSB7Ci0gICAgICAgIGRlc3RfYnVmICs9IGRlc3RfcGl0Y2ggKiAobV9EZXN0SGVpZ2h0IC0gMSk7Ci0gICAgICAgIGRlc3RfYWxwaGFfYnVmICs9IGRlc3RfYWxwaGFfcGl0Y2ggKiAobV9EZXN0SGVpZ2h0IC0gMSk7CisgICAgICBzcmNfY2xpcCArPSBjbGlwX3BpdGNoICogKG1fRGVzdEhlaWdodCAtIDEpOworICAgICAgY2xpcF9waXRjaCA9IC1jbGlwX3BpdGNoOwogICAgIH0KLSAgICBpbnQgeV9zdGVwID0gZGVzdF9waXRjaDsKLSAgICBpbnQgeV9hbHBoYV9zdGVwID0gZGVzdF9hbHBoYV9waXRjaDsKLSAgICBpZiAobV9iRmxpcFkpIHsKLSAgICAgICAgeV9zdGVwID0gLXlfc3RlcDsKLSAgICAgICAgeV9hbHBoYV9zdGVwID0gLXlfYWxwaGFfc3RlcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbV9EZXN0SGVpZ2h0OyBpKyspIHsKKyAgICAgIGNsaXBfc2NhbltpXSA9ICpzcmNfY2xpcDsKKyAgICAgIHNyY19jbGlwICs9IGNsaXBfcGl0Y2g7CiAgICAgfQotICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gbV9wU2NhbmxpbmVWOwotICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX0Rlc3RIZWlnaHQ7IGkgKyspIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBCcHA7IGogKyspIHsKLSAgICAgICAgICAgICpzcmNfc2NhbisrID0gZGVzdF9zY2FuW2pdOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSB5X3N0ZXA7CisgIH0KKyAgRG9Db21wb3NlKG1fcFNjYW5saW5lViwgc2NhbmxpbmUsIG1fRGVzdEhlaWdodCwgY2xpcF9zY2FuLCBzY2FuX2V4dHJhX2FscGhhLAorICAgICAgICAgICAgbV9wU2NhbmxpbmVBbHBoYVYpOworICBzcmNfc2NhbiA9IG1fcFNjYW5saW5lVjsKKyAgZGVzdF9zY2FuID0gZGVzdF9idWY7CisgIGZvciAoaSA9IDA7IGkgPCBtX0Rlc3RIZWlnaHQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgQnBwOyBqKyspIHsKKyAgICAgIGRlc3Rfc2NhbltqXSA9ICpzcmNfc2NhbisrOwogICAgIH0KLSAgICB1aW50OF90KiBzcmNfYWxwaGFfc2NhbiA9IG1fcFNjYW5saW5lQWxwaGFWOwotICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiA9IGRlc3RfYWxwaGFfYnVmOwotICAgIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fRGVzdEhlaWdodDsgaSArKykgewotICAgICAgICAgICAgKnNyY19hbHBoYV9zY2FuKysgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICs9IHlfYWxwaGFfc3RlcDsKLSAgICAgICAgfQorICAgIGRlc3Rfc2NhbiArPSB5X3N0ZXA7CisgIH0KKyAgc3JjX2FscGhhX3NjYW4gPSBtX3BTY2FubGluZUFscGhhVjsKKyAgZGVzdF9hbHBoYV9zY2FuID0gZGVzdF9hbHBoYV9idWY7CisgIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbV9EZXN0SGVpZ2h0OyBpKyspIHsKKyAgICAgICpkZXN0X2FscGhhX3NjYW4gPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgIGRlc3RfYWxwaGFfc2NhbiArPSB5X2FscGhhX3N0ZXA7CiAgICAgfQotICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiA9IE5VTEw7Ci0gICAgaWYgKG1fcENsaXBNYXNrKSB7Ci0gICAgICAgIGNsaXBfc2NhbiA9IG1fcENsaXBTY2FuVjsKLSAgICAgICAgaW50IGNsaXBfcGl0Y2ggPSBtX3BDbGlwTWFzay0+R2V0UGl0Y2goKTsKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2NsaXAgPSBtX3BDbGlwTWFzay0+R2V0QnVmZmVyKCkgKyAobV9EZXN0VG9wIC0gbV9wQ2xpcFJnbi0+R2V0Qm94KCkudG9wKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3BpdGNoICsgKGRlc3RfeCAtIG1fcENsaXBSZ24tPkdldEJveCgpLmxlZnQpOwotICAgICAgICBpZiAobV9iRmxpcFkpIHsKLSAgICAgICAgICAgIHNyY19jbGlwICs9IGNsaXBfcGl0Y2ggKiAobV9EZXN0SGVpZ2h0IC0gMSk7Ci0gICAgICAgICAgICBjbGlwX3BpdGNoID0gLWNsaXBfcGl0Y2g7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fRGVzdEhlaWdodDsgaSArKykgewotICAgICAgICAgICAgY2xpcF9zY2FuW2ldID0gKnNyY19jbGlwOwotICAgICAgICAgICAgc3JjX2NsaXAgKz0gY2xpcF9waXRjaDsKLSAgICAgICAgfQotICAgIH0KLSAgICBEb0NvbXBvc2UobV9wU2NhbmxpbmVWLCBzY2FubGluZSwgbV9EZXN0SGVpZ2h0LCBjbGlwX3NjYW4sIHNjYW5fZXh0cmFfYWxwaGEsIG1fcFNjYW5saW5lQWxwaGFWKTsKLSAgICBzcmNfc2NhbiA9IG1fcFNjYW5saW5lVjsKLSAgICBkZXN0X3NjYW4gPSBkZXN0X2J1ZjsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9EZXN0SGVpZ2h0OyBpICsrKSB7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQnBwOyBqICsrKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bal0gPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0geV9zdGVwOwotICAgIH0KLSAgICBzcmNfYWxwaGFfc2NhbiA9IG1fcFNjYW5saW5lQWxwaGFWOwotICAgIGRlc3RfYWxwaGFfc2NhbiA9IGRlc3RfYWxwaGFfYnVmOwotICAgIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fRGVzdEhlaWdodDsgaSArKykgewotICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICs9IHlfYWxwaGFfc3RlcDsKLSAgICAgICAgfQotICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbnZlcnQuY3BwIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbnZlcnQuY3BwCmluZGV4IDllNmNiZWUuLjUyMTY5YjkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb252ZXJ0LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29udmVydC5jcHAKQEAgLTUwLDggKzUwLDcgQEAKICAgICAweGZmMDBGRjU1LCAweGZmMDBGRkFBLCAweGZmMkEwMDAwLCAweGZmMkEwMDU1LCAweGZmMkEwMEFBLCAweGZmMkEwMEZGLAogICAgIDB4ZmYyQTFGMDAsIDB4ZmYyQTFGNTUsIDB4ZmYyQTFGQUEsIDB4ZmYyQTFGRkYsIDB4ZmYyQTNGMDAsIDB4ZmYyQTNGNTUsCiAgICAgMHhmZkZGRkJGMCwgMHhmZkEwQTBBNCwgMHhmZjgwODA4MCwgMHhmZkZGMDAwMCwgMHhmZjAwRkYwMCwgMHhmZkZGMDAwMCwKLSAgICAweGZmMDAwMEZGLCAweGZmRkYwMEZGLCAweGZmMDBGRkZGLCAweGZmRkZGRkZGCi19OworICAgIDB4ZmYwMDAwRkYsIDB4ZmZGRjAwRkYsIDB4ZmYwMEZGRkYsIDB4ZmZGRkZGRkZ9OwogY29uc3QgRlhfRFdPUkQgZ19kd01hY1BhbGV0dGVbMjU2XSA9IHsKICAgICAweGZmRkZGRkZGLCAweGZmRkZGRkNDLCAweGZmRkZGRjk5LCAweGZmRkZGRjY2LCAweGZmRkZGRjMzLCAweGZmRkZGRjAwLAogICAgIDB4ZmZGRkNDRkYsIDB4ZmZGRkNDQ0MsIDB4ZmZGRkNDOTksIDB4ZmZGRkNDNjYsIDB4ZmZGRkNDMzMsIDB4ZmZGRkNDMDAsCkBAIC04OCw5OTYgKzg3LDExNjcgQEAKICAgICAweGZmMDA5OUZGLCAweGZmMDA5OUNDLCAweGZmMDA5OTk5LCAweGZmMDA5OTY2LCAweGZmMDA5OTMzLCAweGZmMDA5OTAwLAogICAgIDB4ZmYwMDY2RkYsIDB4ZmYwMDY2Q0MsIDB4ZmYwMDY2OTksIDB4ZmYwMDY2NjYsIDB4ZmYwMDY2MzMsIDB4ZmYwMDY2MDAsCiAgICAgMHhmZjAwMzNGRiwgMHhmZjAwMzNDQywgMHhmZjAwMzM5OSwgMHhmZjAwMzM2NiwgMHhmZjAwMzMzMywgMHhmZjAwMzMwMCwKLSAgICAweGZmMDAwMEZGLCAweGZmMDAwMENDLCAweGZmMDAwMDk5LCAweGZmMDAwMDY2LCAweGZmMDAwMDMzLAotICAgIDB4ZmZFRTAwMDAsIDB4ZmZERDAwMDAsIDB4ZmZCQjAwMDAsIDB4ZmZBQTAwMDAsIDB4ZmY4ODAwMDAsIDB4ZmY3NzAwMDAsCi0gICAgMHhmZjU1MDAwMCwgMHhmZjQ0MDAwMCwgMHhmZjIyMDAwMCwgMHhmZjExMDAwMCwgMHhmZjAwRUUwMCwgMHhmZjAwREQwMCwKLSAgICAweGZmMDBCQjAwLCAweGZmMDBBQTAwLCAweGZmMDA4ODAwLCAweGZmMDA3NzAwLCAweGZmMDA1NTAwLCAweGZmMDA0NDAwLAotICAgIDB4ZmYwMDIyMDAsIDB4ZmYwMDExMDAsIDB4ZmYwMDAwRUUsIDB4ZmYwMDAwREQsIDB4ZmYwMDAwQkIsIDB4ZmYwMDAwQUEsCi0gICAgMHhmZjAwMDA4OCwgMHhmZjAwMDA3NywgMHhmZjAwMDA1NSwgMHhmZjAwMDA0NCwgMHhmZjAwMDAyMiwgMHhmZjAwMDAxMSwKLSAgICAweGZmRUVFRUVFLCAweGZmRERERERELCAweGZmQkJCQkJCLCAweGZmQUFBQUFBLCAweGZmODg4ODg4LCAweGZmNzc3Nzc3LAotICAgIDB4ZmY1NTU1NTUsIDB4ZmY0NDQ0NDQsIDB4ZmYyMjIyMjIsIDB4ZmYxMTExMTEsIDB4ZmYwMDAwMDAKLX07Ci1jbGFzcyBDRlhfUGFsZXR0ZQotewotcHVibGljOgotICAgIENGWF9QYWxldHRlKCk7Ci0gICAgfkNGWF9QYWxldHRlKCk7Ci1wdWJsaWM6Ci0gICAgRlhfQk9PTCAgICAgIEJ1aWxkUGFsZXR0ZShjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgZHdQYWxldHRlVHlwZSk7Ci0gICAgRlhfRFdPUkQqICAgIEdldFBhbGV0dGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFBhbGV0dGU7Ci0gICAgfQorICAgIDB4ZmYwMDAwRkYsIDB4ZmYwMDAwQ0MsIDB4ZmYwMDAwOTksIDB4ZmYwMDAwNjYsIDB4ZmYwMDAwMzMsIDB4ZmZFRTAwMDAsCisgICAgMHhmZkREMDAwMCwgMHhmZkJCMDAwMCwgMHhmZkFBMDAwMCwgMHhmZjg4MDAwMCwgMHhmZjc3MDAwMCwgMHhmZjU1MDAwMCwKKyAgICAweGZmNDQwMDAwLCAweGZmMjIwMDAwLCAweGZmMTEwMDAwLCAweGZmMDBFRTAwLCAweGZmMDBERDAwLCAweGZmMDBCQjAwLAorICAgIDB4ZmYwMEFBMDAsIDB4ZmYwMDg4MDAsIDB4ZmYwMDc3MDAsIDB4ZmYwMDU1MDAsIDB4ZmYwMDQ0MDAsIDB4ZmYwMDIyMDAsCisgICAgMHhmZjAwMTEwMCwgMHhmZjAwMDBFRSwgMHhmZjAwMDBERCwgMHhmZjAwMDBCQiwgMHhmZjAwMDBBQSwgMHhmZjAwMDA4OCwKKyAgICAweGZmMDAwMDc3LCAweGZmMDAwMDU1LCAweGZmMDAwMDQ0LCAweGZmMDAwMDIyLCAweGZmMDAwMDExLCAweGZmRUVFRUVFLAorICAgIDB4ZmZEREREREQsIDB4ZmZCQkJCQkIsIDB4ZmZBQUFBQUEsIDB4ZmY4ODg4ODgsIDB4ZmY3Nzc3NzcsIDB4ZmY1NTU1NTUsCisgICAgMHhmZjQ0NDQ0NCwgMHhmZjIyMjIyMiwgMHhmZjExMTExMSwgMHhmZjAwMDAwMH07CitjbGFzcyBDRlhfUGFsZXR0ZSB7CisgcHVibGljOgorICBDRlhfUGFsZXR0ZSgpOworICB+Q0ZYX1BhbGV0dGUoKTsKIAotICAgIEZYX0RXT1JEKiAgICBHZXRDb2xvckx1dCgpY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NMdXQ7Ci0gICAgfQotICAgIEZYX0RXT1JEKiAgICBHZXRBbW91bnRMdXQoKWNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9hTHV0OwotICAgIH0KLSAgICBpbnQzMl90ICAgICBHZXRsdXQoKWNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9sdXQ7Ci0gICAgfQotcHJvdGVjdGVkOgotICAgIEZYX0RXT1JEKiAgICBtX3BQYWxldHRlOwotICAgIEZYX0RXT1JEKiAgICBtX2NMdXQ7Ci0gICAgRlhfRFdPUkQqICAgIG1fYUx1dDsKLSAgICBpbnQgICAgICAgICAgbV9sdXQ7CisgcHVibGljOgorICBGWF9CT09MIEJ1aWxkUGFsZXR0ZShjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgZHdQYWxldHRlVHlwZSk7CisgIEZYX0RXT1JEKiBHZXRQYWxldHRlKCkgY29uc3QgeyByZXR1cm4gbV9wUGFsZXR0ZTsgfQorCisgIEZYX0RXT1JEKiBHZXRDb2xvckx1dCgpIGNvbnN0IHsgcmV0dXJuIG1fY0x1dDsgfQorICBGWF9EV09SRCogR2V0QW1vdW50THV0KCkgY29uc3QgeyByZXR1cm4gbV9hTHV0OyB9CisgIGludDMyX3QgR2V0bHV0KCkgY29uc3QgeyByZXR1cm4gbV9sdXQ7IH0KKworIHByb3RlY3RlZDoKKyAgRlhfRFdPUkQqIG1fcFBhbGV0dGU7CisgIEZYX0RXT1JEKiBtX2NMdXQ7CisgIEZYX0RXT1JEKiBtX2FMdXQ7CisgIGludCBtX2x1dDsKIH07Ci1pbnQgX1BhcnRpdGlvbihGWF9EV09SRCogYWx1dCwgRlhfRFdPUkQqIGNsdXQsIGludCBsLCBpbnQgcikKLXsKLSAgICBGWF9EV09SRCBwX2EgPSBhbHV0W2xdOwotICAgIEZYX0RXT1JEIHBfYyA9IGNsdXRbbF07Ci0gICAgd2hpbGUobCA8IHIpIHsKLSAgICAgICAgd2hpbGUobCA8IHIgJiYgYWx1dFtyXSA+PSBwX2EpIHsKLSAgICAgICAgICAgIHItLTsKLSAgICAgICAgfQotICAgICAgICBpZiAobCA8IHIpIHsKLSAgICAgICAgICAgIGFsdXRbbF0gPSBhbHV0W3JdOwotICAgICAgICAgICAgY2x1dFtsKytdID0gY2x1dFtyXTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZShsIDwgciAmJiBhbHV0W2xdIDw9IHBfYSkgewotICAgICAgICAgICAgbCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsIDwgcikgewotICAgICAgICAgICAgYWx1dFtyXSA9IGFsdXRbbF07Ci0gICAgICAgICAgICBjbHV0W3ItLV0gPSBjbHV0W2xdOwotICAgICAgICB9CitpbnQgX1BhcnRpdGlvbihGWF9EV09SRCogYWx1dCwgRlhfRFdPUkQqIGNsdXQsIGludCBsLCBpbnQgcikgeworICBGWF9EV09SRCBwX2EgPSBhbHV0W2xdOworICBGWF9EV09SRCBwX2MgPSBjbHV0W2xdOworICB3aGlsZSAobCA8IHIpIHsKKyAgICB3aGlsZSAobCA8IHIgJiYgYWx1dFtyXSA+PSBwX2EpIHsKKyAgICAgIHItLTsKICAgICB9Ci0gICAgYWx1dFtsXSA9IHBfYTsKLSAgICBjbHV0W2xdID0gcF9jOwotICAgIHJldHVybiBsOwotfQotdm9pZCBfUXNvcnQoRlhfRFdPUkQqIGFsdXQsIEZYX0RXT1JEKiBjbHV0LCBpbnQgbCwgaW50IHIpCi17Ci0gICAgaWYobCA8IHIpIHsKLSAgICAgICAgaW50IHBJID0gX1BhcnRpdGlvbihhbHV0LCBjbHV0LCBsLCByKTsKLSAgICAgICAgX1Fzb3J0KGFsdXQsIGNsdXQsIGwsIHBJIC0gMSk7Ci0gICAgICAgIF9Rc29ydChhbHV0LCBjbHV0LCBwSSArIDEsIHIpOworICAgIGlmIChsIDwgcikgeworICAgICAgYWx1dFtsXSA9IGFsdXRbcl07CisgICAgICBjbHV0W2wrK10gPSBjbHV0W3JdOwogICAgIH0KLX0KLXZvaWQgX0NvbG9yRGVjb2RlKEZYX0RXT1JEIHBhbF92LCB1aW50OF90JiByLCB1aW50OF90JiBnLCB1aW50OF90JiBiKQotewotICAgIHIgPSAodWludDhfdCkoKHBhbF92ICYgMHhmMDApID4+IDQpOwotICAgIGcgPSAodWludDhfdCkocGFsX3YgJiAweDBmMCk7Ci0gICAgYiA9ICh1aW50OF90KSgocGFsX3YgJiAweDAwZikgPDwgNCk7Ci19Ci12b2lkIF9PYnRhaW5fUGFsKEZYX0RXT1JEKiBhTHV0LCBGWF9EV09SRCpjTHV0LCBGWF9EV09SRCogZGVzdF9wYWwsIGludCBwYWxfdHlwZSwgRlhfRFdPUkQqIHdpbl9tYWNfcGFsLCBGWF9EV09SRCBsdXQpCi17Ci0gICAgaW50IHJvdywgY29sOwotICAgIEZYX0RXT1JEIGx1dF8xID0gbHV0IC0gMTsKLSAgICBpZiAocGFsX3R5cGUgPT0gRlhESUJfUEFMRVRURV9MT0MpIHsKLSAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCAyNTY7IHJvdysrKSB7Ci0gICAgICAgICAgICBpbnQgbHV0X29mZnNldCA9IGx1dF8xIC0gcm93OwotICAgICAgICAgICAgaWYgKGx1dF9vZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbHV0X29mZnNldCArPSAyNTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9EV09SRCBjb2xvciA9IGNMdXRbbHV0X29mZnNldF07Ci0gICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgICAgICAgICBfQ29sb3JEZWNvZGUoY29sb3IsIHIsIGcsIGIpOwotICAgICAgICAgICAgZGVzdF9wYWxbcm93XSA9ICgoRlhfRFdPUkQpciA8PCAxNikgfCAoKEZYX0RXT1JEKWcgPDwgOCkgfCBiIHwgMHhmZjAwMDAwMDsKLSAgICAgICAgICAgIGFMdXRbbHV0X29mZnNldF0gPSByb3c7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IDI1Njsgcm93KyspIHsKLSAgICAgICAgICAgIGludCBsdXRfb2Zmc2V0ID0gbHV0XzEgLSByb3c7Ci0gICAgICAgICAgICBpZiAobHV0X29mZnNldCA8IDApIHsKLSAgICAgICAgICAgICAgICBsdXRfb2Zmc2V0ICs9IDI1NjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKLSAgICAgICAgICAgIF9Db2xvckRlY29kZShjTHV0W2x1dF9vZmZzZXRdLCByLCBnLCBiKTsKLSAgICAgICAgICAgIGludCBlcnJvciwgbWluX2Vycm9yID0gMTAwMDAwMDsKLSAgICAgICAgICAgIGludCBjX2luZGV4ID0gMDsKLSAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgMjU2OyBjb2wrKykgewotICAgICAgICAgICAgICAgIEZYX0RXT1JEIHBfY29sb3IgPSB3aW5fbWFjX3BhbFtjb2xdOwotICAgICAgICAgICAgICAgIGludCBkX3IgPSByIC0gKHVpbnQ4X3QpKHBfY29sb3IgPj4gMTYpOwotICAgICAgICAgICAgICAgIGludCBkX2cgPSBnIC0gKHVpbnQ4X3QpKHBfY29sb3IgPj4gOCk7Ci0gICAgICAgICAgICAgICAgaW50IGRfYiA9IGIgLSAodWludDhfdClwX2NvbG9yOwotICAgICAgICAgICAgICAgIGVycm9yID0gZF9yICogZF9yICsgZF9nICogZF9nICsgZF9iICogZF9iOwotICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IG1pbl9lcnJvcikgewotICAgICAgICAgICAgICAgICAgICBtaW5fZXJyb3IgPSBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgY19pbmRleCA9IGNvbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3BhbFtyb3ddID0gIHdpbl9tYWNfcGFsW2NfaW5kZXhdOwotICAgICAgICAgICAgYUx1dFtsdXRfb2Zmc2V0XSA9IHJvdzsKLSAgICAgICAgfQorICAgIHdoaWxlIChsIDwgciAmJiBhbHV0W2xdIDw9IHBfYSkgeworICAgICAgbCsrOwogICAgIH0KKyAgICBpZiAobCA8IHIpIHsKKyAgICAgIGFsdXRbcl0gPSBhbHV0W2xdOworICAgICAgY2x1dFtyLS1dID0gY2x1dFtsXTsKKyAgICB9CisgIH0KKyAgYWx1dFtsXSA9IHBfYTsKKyAgY2x1dFtsXSA9IHBfYzsKKyAgcmV0dXJuIGw7CiB9Ci1DRlhfUGFsZXR0ZTo6Q0ZYX1BhbGV0dGUoKQotewotICAgIG1fcFBhbGV0dGUgPSBOVUxMOwordm9pZCBfUXNvcnQoRlhfRFdPUkQqIGFsdXQsIEZYX0RXT1JEKiBjbHV0LCBpbnQgbCwgaW50IHIpIHsKKyAgaWYgKGwgPCByKSB7CisgICAgaW50IHBJID0gX1BhcnRpdGlvbihhbHV0LCBjbHV0LCBsLCByKTsKKyAgICBfUXNvcnQoYWx1dCwgY2x1dCwgbCwgcEkgLSAxKTsKKyAgICBfUXNvcnQoYWx1dCwgY2x1dCwgcEkgKyAxLCByKTsKKyAgfQorfQordm9pZCBfQ29sb3JEZWNvZGUoRlhfRFdPUkQgcGFsX3YsIHVpbnQ4X3QmIHIsIHVpbnQ4X3QmIGcsIHVpbnQ4X3QmIGIpIHsKKyAgciA9ICh1aW50OF90KSgocGFsX3YgJiAweGYwMCkgPj4gNCk7CisgIGcgPSAodWludDhfdCkocGFsX3YgJiAweDBmMCk7CisgIGIgPSAodWludDhfdCkoKHBhbF92ICYgMHgwMGYpIDw8IDQpOworfQordm9pZCBfT2J0YWluX1BhbChGWF9EV09SRCogYUx1dCwKKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGNMdXQsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBkZXN0X3BhbCwKKyAgICAgICAgICAgICAgICAgaW50IHBhbF90eXBlLAorICAgICAgICAgICAgICAgICBGWF9EV09SRCogd2luX21hY19wYWwsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGx1dCkgeworICBpbnQgcm93LCBjb2w7CisgIEZYX0RXT1JEIGx1dF8xID0gbHV0IC0gMTsKKyAgaWYgKHBhbF90eXBlID09IEZYRElCX1BBTEVUVEVfTE9DKSB7CisgICAgZm9yIChyb3cgPSAwOyByb3cgPCAyNTY7IHJvdysrKSB7CisgICAgICBpbnQgbHV0X29mZnNldCA9IGx1dF8xIC0gcm93OworICAgICAgaWYgKGx1dF9vZmZzZXQgPCAwKSB7CisgICAgICAgIGx1dF9vZmZzZXQgKz0gMjU2OworICAgICAgfQorICAgICAgRlhfRFdPUkQgY29sb3IgPSBjTHV0W2x1dF9vZmZzZXRdOworICAgICAgdWludDhfdCByLCBnLCBiOworICAgICAgX0NvbG9yRGVjb2RlKGNvbG9yLCByLCBnLCBiKTsKKyAgICAgIGRlc3RfcGFsW3Jvd10gPSAoKEZYX0RXT1JEKXIgPDwgMTYpIHwgKChGWF9EV09SRClnIDw8IDgpIHwgYiB8IDB4ZmYwMDAwMDA7CisgICAgICBhTHV0W2x1dF9vZmZzZXRdID0gcm93OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IDI1Njsgcm93KyspIHsKKyAgICAgIGludCBsdXRfb2Zmc2V0ID0gbHV0XzEgLSByb3c7CisgICAgICBpZiAobHV0X29mZnNldCA8IDApIHsKKyAgICAgICAgbHV0X29mZnNldCArPSAyNTY7CisgICAgICB9CisgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICBfQ29sb3JEZWNvZGUoY0x1dFtsdXRfb2Zmc2V0XSwgciwgZywgYik7CisgICAgICBpbnQgZXJyb3IsIG1pbl9lcnJvciA9IDEwMDAwMDA7CisgICAgICBpbnQgY19pbmRleCA9IDA7CisgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IDI1NjsgY29sKyspIHsKKyAgICAgICAgRlhfRFdPUkQgcF9jb2xvciA9IHdpbl9tYWNfcGFsW2NvbF07CisgICAgICAgIGludCBkX3IgPSByIC0gKHVpbnQ4X3QpKHBfY29sb3IgPj4gMTYpOworICAgICAgICBpbnQgZF9nID0gZyAtICh1aW50OF90KShwX2NvbG9yID4+IDgpOworICAgICAgICBpbnQgZF9iID0gYiAtICh1aW50OF90KXBfY29sb3I7CisgICAgICAgIGVycm9yID0gZF9yICogZF9yICsgZF9nICogZF9nICsgZF9iICogZF9iOworICAgICAgICBpZiAoZXJyb3IgPCBtaW5fZXJyb3IpIHsKKyAgICAgICAgICBtaW5fZXJyb3IgPSBlcnJvcjsKKyAgICAgICAgICBjX2luZGV4ID0gY29sOworICAgICAgICB9CisgICAgICB9CisgICAgICBkZXN0X3BhbFtyb3ddID0gd2luX21hY19wYWxbY19pbmRleF07CisgICAgICBhTHV0W2x1dF9vZmZzZXRdID0gcm93OworICAgIH0KKyAgfQorfQorQ0ZYX1BhbGV0dGU6OkNGWF9QYWxldHRlKCkgeworICBtX3BQYWxldHRlID0gTlVMTDsKKyAgbV9jTHV0ID0gTlVMTDsKKyAgbV9hTHV0ID0gTlVMTDsKKyAgbV9sdXQgPSAwOworfQorQ0ZYX1BhbGV0dGU6On5DRlhfUGFsZXR0ZSgpIHsKKyAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICBGWF9GcmVlKG1fcFBhbGV0dGUpOworICB9CisgIGlmIChtX2NMdXQpIHsKKyAgICBGWF9GcmVlKG1fY0x1dCk7CisgIH0KKyAgaWYgKG1fYUx1dCkgeworICAgIEZYX0ZyZWUobV9hTHV0KTsKKyAgfQorICBtX2x1dCA9IDA7Cit9CitGWF9CT09MIENGWF9QYWxldHRlOjpCdWlsZFBhbGV0dGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IHBhbF90eXBlKSB7CisgIGlmIChwQml0bWFwID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcFBhbGV0dGUgIT0gTlVMTCkgeworICAgIEZYX0ZyZWUobV9wUGFsZXR0ZSk7CisgIH0KKyAgbV9wUGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0RXT1JELCAyNTYpOworICBpbnQgYnBwID0gcEJpdG1hcC0+R2V0QlBQKCkgLyA4OworICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOworICBpbnQgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIGlmIChtX2NMdXQpIHsKKyAgICBGWF9GcmVlKG1fY0x1dCk7CiAgICAgbV9jTHV0ID0gTlVMTDsKKyAgfQorICBpZiAobV9hTHV0KSB7CisgICAgRlhfRnJlZShtX2FMdXQpOwogICAgIG1fYUx1dCA9IE5VTEw7Ci0gICAgbV9sdXQgPSAwOworICB9CisgIG1fY0x1dCA9IEZYX0FsbG9jKEZYX0RXT1JELCA0MDk2KTsKKyAgbV9hTHV0ID0gRlhfQWxsb2MoRlhfRFdPUkQsIDQwOTYpOworICBpbnQgcm93LCBjb2w7CisgIG1fbHV0ID0gMDsKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogc2Nhbl9saW5lID0gKHVpbnQ4X3QqKXBCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QqIHNyY19wb3J0ID0gc2Nhbl9saW5lICsgY29sICogYnBwOworICAgICAgRlhfRFdPUkQgYiA9IHNyY19wb3J0WzBdICYgMHhmMDsKKyAgICAgIEZYX0RXT1JEIGcgPSBzcmNfcG9ydFsxXSAmIDB4ZjA7CisgICAgICBGWF9EV09SRCByID0gc3JjX3BvcnRbMl0gJiAweGYwOworICAgICAgRlhfRFdPUkQgaW5kZXggPSAociA8PCA0KSArIGcgKyAoYiA+PiA0KTsKKyAgICAgIG1fYUx1dFtpbmRleF0rKzsKKyAgICB9CisgIH0KKyAgZm9yIChyb3cgPSAwOyByb3cgPCA0MDk2OyByb3crKykgeworICAgIGlmIChtX2FMdXRbcm93XSAhPSAwKSB7CisgICAgICBtX2FMdXRbbV9sdXRdID0gbV9hTHV0W3Jvd107CisgICAgICBtX2NMdXRbbV9sdXRdID0gcm93OworICAgICAgbV9sdXQrKzsKKyAgICB9CisgIH0KKyAgX1Fzb3J0KG1fYUx1dCwgbV9jTHV0LCAwLCBtX2x1dCAtIDEpOworICBGWF9EV09SRCogd2luX21hY19wYWwgPSBOVUxMOworICBpZiAocGFsX3R5cGUgPT0gRlhESUJfUEFMRVRURV9XSU4pIHsKKyAgICB3aW5fbWFjX3BhbCA9IChGWF9EV09SRCopZ19kd1dpblBhbGV0dGU7CisgIH0gZWxzZSBpZiAocGFsX3R5cGUgPT0gRlhESUJfUEFMRVRURV9NQUMpIHsKKyAgICB3aW5fbWFjX3BhbCA9IChGWF9EV09SRCopZ19kd01hY1BhbGV0dGU7CisgIH0KKyAgX09idGFpbl9QYWwobV9hTHV0LCBtX2NMdXQsIG1fcFBhbGV0dGUsIHBhbF90eXBlLCB3aW5fbWFjX3BhbCwgbV9sdXQpOworICByZXR1cm4gVFJVRTsKIH0KLUNGWF9QYWxldHRlOjp+Q0ZYX1BhbGV0dGUoKQotewotICAgIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wUGFsZXR0ZSk7CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzFicHBNYXNrMkdyYXkodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApIHsKKyAgdWludDhfdCBzZXRfZ3JheSwgcmVzZXRfZ3JheTsKKyAgc2V0X2dyYXkgPSAweGZmOworICByZXNldF9ncmF5ID0gMHgwMDsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICBGWFNZU19tZW1zZXQoZGVzdF9zY2FuLCByZXNldF9ncmF5LCB3aWR0aCk7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KTsKKyAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sKyspIHsKKyAgICAgIGlmIChzcmNfc2Nhbltjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBzZXRfZ3JheTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbisrOwogICAgIH0KLSAgICBpZiAobV9jTHV0KSB7Ci0gICAgICAgIEZYX0ZyZWUobV9jTHV0KTsKLSAgICB9Ci0gICAgaWYgKG1fYUx1dCkgewotICAgICAgICBGWF9GcmVlKG1fYUx1dCk7Ci0gICAgfQotICAgIG1fbHV0ID0gMDsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0ZYX1BhbGV0dGU6OkJ1aWxkUGFsZXR0ZShjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgcGFsX3R5cGUpCi17Ci0gICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3BQYWxldHRlICE9IE5VTEwpIHsKLSAgICAgICAgRlhfRnJlZShtX3BQYWxldHRlKTsKLSAgICB9Ci0gICAgbV9wUGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0RXT1JELCAyNTYpOwotICAgIGludCBicHAgICAgPSBwQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgaW50IHdpZHRoICA9IHBCaXRtYXAtPkdldFdpZHRoKCk7Ci0gICAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOwotICAgIGlmIChtX2NMdXQpIHsKLSAgICAgICAgRlhfRnJlZShtX2NMdXQpOwotICAgICAgICBtX2NMdXQgPSBOVUxMOwotICAgIH0KLSAgICBpZiAobV9hTHV0KSB7Ci0gICAgICAgIEZYX0ZyZWUobV9hTHV0KTsKLSAgICAgICAgbV9hTHV0ID0gTlVMTDsKLSAgICB9Ci0gICAgbV9jTHV0ID0gRlhfQWxsb2MoRlhfRFdPUkQsIDQwOTYpOwotICAgIG1fYUx1dCA9IEZYX0FsbG9jKEZYX0RXT1JELCA0MDk2KTsKLSAgICBpbnQgcm93LCBjb2w7Ci0gICAgbV9sdXQgPSAwOwotICAgIGZvciAocm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgICAgICB1aW50OF90KiBzY2FuX2xpbmUgPSAodWludDhfdCopcEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19wb3J0ID0gc2Nhbl9saW5lICsgY29sICogYnBwOwotICAgICAgICAgICAgRlhfRFdPUkQgYiA9IHNyY19wb3J0WzBdICYgMHhmMDsKLSAgICAgICAgICAgIEZYX0RXT1JEIGcgPSBzcmNfcG9ydFsxXSAmIDB4ZjA7Ci0gICAgICAgICAgICBGWF9EV09SRCByID0gc3JjX3BvcnRbMl0gJiAweGYwOwotICAgICAgICAgICAgRlhfRFdPUkQgaW5kZXggPSAociA8PCA0KSArIGcgKyAoYiA+PiA0KTsKLSAgICAgICAgICAgIG1fYUx1dFtpbmRleF0rKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IDQwOTY7IHJvdysrKSB7Ci0gICAgICAgIGlmIChtX2FMdXRbcm93XSAhPSAwKSB7Ci0gICAgICAgICAgICBtX2FMdXRbbV9sdXRdID0gbV9hTHV0W3Jvd107Ci0gICAgICAgICAgICBtX2NMdXRbbV9sdXRdID0gcm93OwotICAgICAgICAgICAgbV9sdXQrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBfUXNvcnQobV9hTHV0LCBtX2NMdXQsIDAsIG1fbHV0IC0gMSk7Ci0gICAgRlhfRFdPUkQqIHdpbl9tYWNfcGFsID0gTlVMTDsKLSAgICBpZiAocGFsX3R5cGUgPT0gRlhESUJfUEFMRVRURV9XSU4pIHsKLSAgICAgICAgd2luX21hY19wYWwgPSAoRlhfRFdPUkQqKWdfZHdXaW5QYWxldHRlOwotICAgIH0gZWxzZSBpZiAocGFsX3R5cGUgPT0gRlhESUJfUEFMRVRURV9NQUMpIHsKLSAgICAgICAgd2luX21hY19wYWwgPSAoRlhfRFdPUkQqKWdfZHdNYWNQYWxldHRlOwotICAgIH0KLSAgICBfT2J0YWluX1BhbChtX2FMdXQsIG1fY0x1dCwgbV9wUGFsZXR0ZSwgcGFsX3R5cGUsIHdpbl9tYWNfcGFsLCBtX2x1dCk7Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBNYXNrMkdyYXkodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApIHsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7CisgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMWJwcE1hc2syR3JheSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wKQotewotICAgIHVpbnQ4X3Qgc2V0X2dyYXksIHJlc2V0X2dyYXk7Ci0gICAgc2V0X2dyYXkgPSAweGZmOwotICAgIHJlc2V0X2dyYXkgPSAweDAwOwotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgcmVzZXRfZ3JheSwgd2lkdGgpOwotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOwotICAgICAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBzZXRfZ3JheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syR3JheSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wKQotewotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0OwotICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMWJwcFBsdDJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBGWF9EV09SRCogc3JjX3BsdCA9IHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKTsKLSAgICB1aW50OF90IGdyYXlbMl07Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgRlhfRFdPUkQgcGx0WzJdOwotICAgICAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgcGx0WzBdID0gRlhDTVlLX1RPRElCKHNyY19wbHRbMF0pOwotICAgICAgICAgICAgcGx0WzFdID0gRlhDTVlLX1RPRElCKHNyY19wbHRbMV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWludDhfdCogYmdyX3B0ciA9ICh1aW50OF90KilwbHQ7Ci0gICAgICAgICAgICBiZ3JfcHRyWzBdID0gRlhBUkdCX0Ioc3JjX3BsdFswXSk7Ci0gICAgICAgICAgICBiZ3JfcHRyWzFdID0gRlhBUkdCX0coc3JjX3BsdFswXSk7Ci0gICAgICAgICAgICBiZ3JfcHRyWzJdID0gRlhBUkdCX1Ioc3JjX3BsdFswXSk7Ci0gICAgICAgICAgICBiZ3JfcHRyWzNdID0gRlhBUkdCX0Ioc3JjX3BsdFsxXSk7Ci0gICAgICAgICAgICBiZ3JfcHRyWzRdID0gRlhBUkdCX0coc3JjX3BsdFsxXSk7Ci0gICAgICAgICAgICBiZ3JfcHRyWzVdID0gRlhBUkdCX1Ioc3JjX3BsdFsxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBncmF5LCAoY29uc3QgdWludDhfdCopcGx0LCAyKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50OF90IHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2IsCi0gICAgICAgICAgICAgICAgc2V0X3IsIHNldF9nLCBzZXRfYjsKLSAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFswXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbMF0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYik7Ci0gICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbMV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFsxXSksIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzFdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9yLCBzZXRfZywgc2V0X2IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzZXRfciA9IEZYQVJHQl9SKHNyY19wbHRbMF0pOwotICAgICAgICAgICAgcmVzZXRfZyA9IEZYQVJHQl9HKHNyY19wbHRbMF0pOwotICAgICAgICAgICAgcmVzZXRfYiA9IEZYQVJHQl9CKHNyY19wbHRbMF0pOwotICAgICAgICAgICAgc2V0X3IgPSBGWEFSR0JfUihzcmNfcGx0WzFdKTsKLSAgICAgICAgICAgIHNldF9nID0gRlhBUkdCX0coc3JjX3BsdFsxXSk7Ci0gICAgICAgICAgICBzZXRfYiA9IEZYQVJHQl9CKHNyY19wbHRbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGdyYXlbMF0gPSBGWFJHQjJHUkFZKHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2IpOwotICAgICAgICBncmF5WzFdID0gRlhSR0IyR1JBWShzZXRfciwgc2V0X2csIHNldF9iKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICBGWFNZU19tZW1zZXQoZGVzdF9zY2FuLCBncmF5WzBdLCB3aWR0aCk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IHNyY19sZWZ0OyBjb2wgPCBzcmNfbGVmdCArIHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIGlmIChzcmNfc2Nhbltjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXlbMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7Ci0gICAgdWludDhfdCBncmF5WzI1Nl07Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgRlhfRFdPUkQgcGx0WzI1Nl07Ci0gICAgICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgICAgIHBsdFtpXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0W2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGJncl9wdHIgPSAodWludDhfdCopcGx0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX0Ioc3JjX3BsdFtpXSk7Ci0gICAgICAgICAgICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9HKHNyY19wbHRbaV0pOwotICAgICAgICAgICAgICAgICpiZ3JfcHRyKysgPSBGWEFSR0JfUihzcmNfcGx0W2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGdyYXksIChjb25zdCB1aW50OF90KilwbHQsIDI1Nik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShzcmNfcGx0W2ldKSwgRlhTWVNfR2V0TVZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRZVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldEtWYWx1ZShzcmNfcGx0W2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYik7Ci0gICAgICAgICAgICAgICAgZ3JheVtpXSA9IEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBncmF5W2ldID0gRlhSR0IyR1JBWShGWEFSR0JfUihzcmNfcGx0W2ldKSwgRlhBUkdCX0coc3JjX3BsdFtpXSksIEZYQVJHQl9CKHNyY19wbHRbaV0pKTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGdyYXlbKnNyY19zY2FuKytdOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2JPckNteWsyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpbnQgQnBwID0gcFNyY0JpdG1hcC0+R2V0QlBQKCkgLyA4OwotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgaWYgKEJwcCA9PSAzIHx8IHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIEJwcDsKLSAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCByLCBnLCBiOwotICAgICAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKChGWF9EV09SRClzcmNfc2NhblswXSksIEZYU1lTX0dldE1WYWx1ZSgoRlhfRFdPUkQpc3JjX3NjYW5bMV0pLCBGWFNZU19HZXRZVmFsdWUoKEZYX0RXT1JEKXNyY19zY2FuWzJdKSwgRlhTWVNfR2V0S1ZhbHVlKChGWF9EV09SRClzcmNfc2NhblszXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBCcHA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotaW5saW5lIHZvaWQgX0NvbnZlcnRCdWZmZXJfSW5kZXhDb3B5KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCi17Ci0gICAgaWYgKHBTcmNCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIDAsIHdpZHRoKTsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwotICAgICAgICB9Ci0gICAgfQotfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9QbHQyUGx0UmdiOCh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqIGRzdF9wbHQsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgX0NvbnZlcnRCdWZmZXJfSW5kZXhDb3B5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7Ci0gICAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7Ci0gICAgaW50IHBsdF9zaXplID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZVNpemUoKTsKLSAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBGWF9EV09SRCBwbHRbMjU2XTsKLSAgICAgICAgdWludDhfdCogYmdyX3B0ciA9ICh1aW50OF90KilwbHQ7Ci0gICAgICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsdF9zaXplOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgcGx0W2ldID0gRlhDTVlLX1RPRElCKHNyY19wbHRbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbHRfc2l6ZTsgaSArKykgewotICAgICAgICAgICAgICAgICpiZ3JfcHRyKysgPSBGWEFSR0JfQihzcmNfcGx0W2ldKTsKLSAgICAgICAgICAgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX0coc3JjX3BsdFtpXSk7Ci0gICAgICAgICAgICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9SKHNyY19wbHRbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmdyX3B0ciA9ICh1aW50OF90KilwbHQ7Ci0gICAgICAgIH0KLSAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopcGx0LCAoY29uc3QgdWludDhfdCopcGx0LCBwbHRfc2l6ZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGx0X3NpemU7IGkgKyspIHsKLSAgICAgICAgICAgIGRzdF9wbHRbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCBiZ3JfcHRyWzJdLCBiZ3JfcHRyWzFdLCBiZ3JfcHRyWzBdKTsKLSAgICAgICAgICAgIGJncl9wdHIgKz0gMzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsdF9zaXplOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCByLCBnLCBiOwotICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0W2ldKSwgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFtpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgIGRzdF9wbHRbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCByLCBnLCBiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShkc3RfcGx0LCBzcmNfcGx0LCBwbHRfc2l6ZSAqIDQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotaW5saW5lIEZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjhfTm9UcmFuc2Zvcm0odWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIEZYX0RXT1JEKiBkc3RfcGx0KQotewotICAgIGludCBicHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgaW50IHJvdywgY29sOwotICAgIENGWF9QYWxldHRlIHBhbGV0dGU7Ci0gICAgcGFsZXR0ZS5CdWlsZFBhbGV0dGUocFNyY0JpdG1hcCwgRlhESUJfUEFMRVRURV9MT0MpOwotICAgIEZYX0RXT1JEKiBjTHV0ID0gcGFsZXR0ZS5HZXRDb2xvckx1dCgpOwotICAgIEZYX0RXT1JEKiBhTHV0ID0gcGFsZXR0ZS5HZXRBbW91bnRMdXQoKTsKLSAgICBpZiAoY0x1dCA9PSBOVUxMIHx8IGFMdXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBsdXQgPSBwYWxldHRlLkdldGx1dCgpOwotICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSA9IHBhbGV0dGUuR2V0UGFsZXR0ZSgpOwotICAgIGlmIChsdXQgPiAyNTYpIHsKLSAgICAgICAgaW50IGVyciwgbWluX2VycjsKLSAgICAgICAgaW50IGx1dF8yNTYgPSBsdXQgLSAyNTY7Ci0gICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgbHV0XzI1Njsgcm93KyspIHsKLSAgICAgICAgICAgIG1pbl9lcnIgPSAxMDAwMDAwOwotICAgICAgICAgICAgdWludDhfdCByLCBnLCBiOwotICAgICAgICAgICAgX0NvbG9yRGVjb2RlKGNMdXRbcm93XSwgciwgZywgYik7Ci0gICAgICAgICAgICBpbnQgY2xyaW5kZXggPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgMjU2OyBjb2wrKykgewotICAgICAgICAgICAgICAgIEZYX0RXT1JEIHBfY29sb3IgPSAqKHBQYWxldHRlICsgY29sKTsKLSAgICAgICAgICAgICAgICBpbnQgZF9yID0gciAtICh1aW50OF90KShwX2NvbG9yID4+IDE2KTsKLSAgICAgICAgICAgICAgICBpbnQgZF9nID0gZyAtICh1aW50OF90KShwX2NvbG9yID4+IDgpOwotICAgICAgICAgICAgICAgIGludCBkX2IgPSBiIC0gKHVpbnQ4X3QpKHBfY29sb3IpOwotICAgICAgICAgICAgICAgIGVyciA9IGRfciAqIGRfciArIGRfZyAqIGRfZyArIGRfYiAqIGRfYjsKLSAgICAgICAgICAgICAgICBpZiAoZXJyIDwgbWluX2VycikgewotICAgICAgICAgICAgICAgICAgICBtaW5fZXJyID0gZXJyOwotICAgICAgICAgICAgICAgICAgICBjbHJpbmRleCA9IGNvbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhTHV0W3Jvd10gPSBjbHJpbmRleDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQzMl90IGx1dF8xID0gbHV0IC0gMTsKLSAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gKHVpbnQ4X3QqKXBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19wb3J0ID0gc3JjX3NjYW4gKyBjb2wgKiBicHA7Ci0gICAgICAgICAgICBpbnQgciA9IHNyY19wb3J0WzJdICYgMHhmMDsKLSAgICAgICAgICAgIGludCBnID0gc3JjX3BvcnRbMV0gJiAweGYwOwotICAgICAgICAgICAgaW50IGIgPSBzcmNfcG9ydFswXSAmIDB4ZjA7Ci0gICAgICAgICAgICBGWF9EV09SRCBjbHJpbmRleCA9IChyIDw8IDQpICsgZyArIChiID4+IDQpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGx1dF8xOyBpID49IDA7IGktLSkKLSAgICAgICAgICAgICAgICBpZiAoY2xyaW5kZXggPT0gY0x1dFtpXSkgewotICAgICAgICAgICAgICAgICAgICAqKGRlc3Rfc2NhbiArIGNvbCkgPSAodWludDhfdCkoYUx1dFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBGWFNZU19tZW1jcHkoZHN0X3BsdCwgcFBhbGV0dGUsIHNpemVvZihGWF9EV09SRCkgKiAyNTYpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOCh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqIGRzdF9wbHQsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgIH0KLSAgICBGWF9CT09MIHJldCA9IF9Db252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4X05vVHJhbnNmb3JtKGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgZHN0X3BsdCk7Ci0gICAgaWYgKHJldCAmJiBwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICAgICAgRlhfQVJHQiogcGx0ID0gZHN0X3BsdCArIGk7Ci0gICAgICAgICAgICBGWF9BUkdCIHBsdF9lbnRyeSA9IEZYQVJHQl9UT0RJQigqcGx0KTsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICh1aW50OF90KikmcGx0X2VudHJ5LCAoY29uc3QgdWludDhfdCopJnBsdF9lbnRyeSwgMSk7Ci0gICAgICAgICAgICAqcGx0ID0gRlhBUkdCX1RPRElCKHBsdF9lbnRyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMWJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCi17Ci0gICAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7Ci0gICAgdWludDhfdCBzZXRfZ3JheSwgcmVzZXRfZ3JheTsKLSAgICBzZXRfZ3JheSA9IDB4ZmY7Ci0gICAgcmVzZXRfZ3JheSA9IDB4MDA7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOwotICAgICAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNldF9ncmF5OwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNldF9ncmF5OwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNldF9ncmF5OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSByZXNldF9ncmF5OwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHJlc2V0X2dyYXk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gcmVzZXRfZ3JheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBjb21wczsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCi17Ci0gICAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7Ci0gICAgICAgIHVpbnQ4X3Qgc3JjX3BpeGVsOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBzcmNfcGl4ZWwgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19waXhlbDsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19waXhlbDsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gICA9IHNyY19waXhlbDsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBjb21wcyAtIDI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzFicHBQbHQyUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCB1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpbnQgY29tcHMgPSAoZHN0X2Zvcm1hdCAmIDB4ZmYpIC8gODsKLSAgICBGWF9EV09SRCogc3JjX3BsdCA9IHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKTsKK0ZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMWJwcFBsdDJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBGWF9EV09SRCogc3JjX3BsdCA9IHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKTsKKyAgdWludDhfdCBncmF5WzJdOworICBpZiAocEljY1RyYW5zZm9ybSkgewogICAgIEZYX0RXT1JEIHBsdFsyXTsKLSAgICB1aW50OF90KiBiZ3JfcHRyID0gKHVpbnQ4X3QqKXBsdDsKICAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgewotICAgICAgICBwbHRbMF0gPSBGWENNWUtfVE9ESUIoc3JjX3BsdFswXSk7Ci0gICAgICAgIHBsdFsxXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0WzFdKTsKKyAgICAgIHBsdFswXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0WzBdKTsKKyAgICAgIHBsdFsxXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0WzFdKTsKICAgICB9IGVsc2UgewotICAgICAgICBiZ3JfcHRyWzBdID0gRlhBUkdCX0Ioc3JjX3BsdFswXSk7Ci0gICAgICAgIGJncl9wdHJbMV0gPSBGWEFSR0JfRyhzcmNfcGx0WzBdKTsKLSAgICAgICAgYmdyX3B0clsyXSA9IEZYQVJHQl9SKHNyY19wbHRbMF0pOwotICAgICAgICBiZ3JfcHRyWzNdID0gRlhBUkdCX0Ioc3JjX3BsdFsxXSk7Ci0gICAgICAgIGJncl9wdHJbNF0gPSBGWEFSR0JfRyhzcmNfcGx0WzFdKTsKLSAgICAgICAgYmdyX3B0cls1XSA9IEZYQVJHQl9SKHNyY19wbHRbMV0pOworICAgICAgdWludDhfdCogYmdyX3B0ciA9ICh1aW50OF90KilwbHQ7CisgICAgICBiZ3JfcHRyWzBdID0gRlhBUkdCX0Ioc3JjX3BsdFswXSk7CisgICAgICBiZ3JfcHRyWzFdID0gRlhBUkdCX0coc3JjX3BsdFswXSk7CisgICAgICBiZ3JfcHRyWzJdID0gRlhBUkdCX1Ioc3JjX3BsdFswXSk7CisgICAgICBiZ3JfcHRyWzNdID0gRlhBUkdCX0Ioc3JjX3BsdFsxXSk7CisgICAgICBiZ3JfcHRyWzRdID0gRlhBUkdCX0coc3JjX3BsdFsxXSk7CisgICAgICBiZ3JfcHRyWzVdID0gRlhBUkdCX1Ioc3JjX3BsdFsxXSk7CiAgICAgfQotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKXBsdCwgKGNvbnN0IHVpbnQ4X3QqKXBsdCwgMik7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGdyYXksIChjb25zdCB1aW50OF90KilwbHQsIDIpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYiwgc2V0X3IsIHNldF9nLCBzZXRfYjsKKyAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICAgIEZYU1lTX0dldENWYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0TVZhbHVlKHNyY19wbHRbMF0pLAorICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMF0pLCByZXNldF9yLAorICAgICAgICAgIHJlc2V0X2csIHJlc2V0X2IpOworICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShzcmNfcGx0WzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldEtWYWx1ZShzcmNfcGx0WzFdKSwgc2V0X3IsIHNldF9nLCBzZXRfYik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFswXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbMF0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdyX3B0clsyXSwgYmdyX3B0clsxXSwgYmdyX3B0clswXSk7Ci0gICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbMV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFsxXSksIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzFdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJncl9wdHJbNV0sIGJncl9wdHJbNF0sIGJncl9wdHJbM10pOwotICAgICAgICB9CisgICAgICByZXNldF9yID0gRlhBUkdCX1Ioc3JjX3BsdFswXSk7CisgICAgICByZXNldF9nID0gRlhBUkdCX0coc3JjX3BsdFswXSk7CisgICAgICByZXNldF9iID0gRlhBUkdCX0Ioc3JjX3BsdFswXSk7CisgICAgICBzZXRfciA9IEZYQVJHQl9SKHNyY19wbHRbMV0pOworICAgICAgc2V0X2cgPSBGWEFSR0JfRyhzcmNfcGx0WzFdKTsKKyAgICAgIHNldF9iID0gRlhBUkdCX0Ioc3JjX3BsdFsxXSk7CiAgICAgfQotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gc3JjX2xlZnQ7IGNvbCA8IHNyY19sZWZ0ICsgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBiZ3JfcHRyWzNdOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGJncl9wdHJbNF07Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiAgID0gYmdyX3B0cls1XTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gYmdyX3B0clswXTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBiZ3JfcHRyWzFdOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gICA9IGJncl9wdHJbMl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gY29tcHMgLSAyOwotICAgICAgICB9CisgICAgZ3JheVswXSA9IEZYUkdCMkdSQVkocmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYik7CisgICAgZ3JheVsxXSA9IEZYUkdCMkdSQVkoc2V0X3IsIHNldF9nLCBzZXRfYik7CisgIH0KKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICBGWFNZU19tZW1zZXQoZGVzdF9zY2FuLCBncmF5WzBdLCB3aWR0aCk7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KTsKKyAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sKyspIHsKKyAgICAgIGlmIChzcmNfc2Nhbltjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBncmF5WzFdOworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl84YnBwUGx0MlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwgdWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7Ci0gICAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7CisgIHVpbnQ4X3QgZ3JheVsyNTZdOworICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgIEZYX0RXT1JEIHBsdFsyNTZdOworICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIHBsdFtpXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0W2ldKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdWludDhfdCogYmdyX3B0ciA9ICh1aW50OF90KilwbHQ7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICpiZ3JfcHRyKysgPSBGWEFSR0JfQihzcmNfcGx0W2ldKTsKKyAgICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9HKHNyY19wbHRbaV0pOworICAgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX1Ioc3JjX3BsdFtpXSk7CisgICAgICB9CisgICAgfQorICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBncmF5LCAoY29uc3QgdWludDhfdCopcGx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1Nik7CisgIH0gZWxzZSB7CisgICAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKKyAgICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICAgICAgRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFtpXSksCisgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldEtWYWx1ZShzcmNfcGx0W2ldKSwgciwgZywgYik7CisgICAgICAgIGdyYXlbaV0gPSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgfQorICAgIH0gZWxzZQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBncmF5W2ldID0gRlhSR0IyR1JBWShGWEFSR0JfUihzcmNfcGx0W2ldKSwgRlhBUkdCX0coc3JjX3BsdFtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9CKHNyY19wbHRbaV0pKTsKKyAgICAgIH0KKyAgfQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IGdyYXlbKnNyY19zY2FuKytdOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfUmdiT3JDbXlrMkdyYXkodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaW50IEJwcCA9IHBTcmNCaXRtYXAtPkdldEJQUCgpIC8gODsKKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgaWYgKEJwcCA9PSAzIHx8IHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogQnBwOworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwgMSk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZSgoRlhfRFdPUkQpc3JjX3NjYW5bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRNVmFsdWUoKEZYX0RXT1JEKXNyY19zY2FuWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKChGWF9EV09SRClzcmNfc2NhblsyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldEtWYWx1ZSgoRlhfRFdPUkQpc3JjX3NjYW5bM10pLCByLCBnLCBiKTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBCcHA7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCBzcmNfc2NhblswXSk7CisgICAgICAgICAgc3JjX3NjYW4gKz0gQnBwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQoraW5saW5lIHZvaWQgX0NvbnZlcnRCdWZmZXJfSW5kZXhDb3B5KHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIGlmIChwU3JjQml0bWFwLT5HZXRCUFAoKSA9PSAxKSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgMCwgd2lkdGgpOworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KTsKKyAgICAgIGZvciAoaW50IGNvbCA9IHNyY19sZWZ0OyBjb2wgPCBzcmNfbGVmdCArIHdpZHRoOyBjb2wrKykgeworICAgICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgeworICAgICAgICAgICpkZXN0X3NjYW4gPSAxOworICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKKyAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7CisgICAgfQorICB9Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyX1BsdDJQbHRSZ2I4KHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogZHN0X3BsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBfQ29udmVydEJ1ZmZlcl9JbmRleENvcHkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbGVmdCwgc3JjX3RvcCk7CisgIEZYX0RXT1JEKiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOworICBpbnQgcGx0X3NpemUgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlU2l6ZSgpOworICBpZiAocEljY1RyYW5zZm9ybSkgewogICAgIEZYX0RXT1JEIHBsdFsyNTZdOwogICAgIHVpbnQ4X3QqIGJncl9wdHIgPSAodWludDhfdCopcGx0OwotICAgIGlmICghcFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICAgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX0Ioc3JjX3BsdFtpXSk7Ci0gICAgICAgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX0coc3JjX3BsdFtpXSk7Ci0gICAgICAgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX1Ioc3JjX3BsdFtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgYmdyX3B0ciA9ICh1aW50OF90KilwbHQ7Ci0gICAgfQotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcGx0W2ldID0gRlhDTVlLX1RPRElCKHNyY19wbHRbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKXBsdCwgKGNvbnN0IHVpbnQ4X3QqKXBsdCwgMjU2KTsKKyAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbHRfc2l6ZTsgaSsrKSB7CisgICAgICAgIHBsdFtpXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0W2ldKTsKKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0W2ldKSwgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFtpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJncl9wdHJbMl0sIGJncl9wdHJbMV0sIGJncl9wdHJbMF0pOwotICAgICAgICAgICAgICAgIGJncl9wdHIgKz0gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJncl9wdHIgPSAodWludDhfdCopcGx0OwotICAgICAgICB9CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsdF9zaXplOyBpKyspIHsKKyAgICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9CKHNyY19wbHRbaV0pOworICAgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX0coc3JjX3BsdFtpXSk7CisgICAgICAgICpiZ3JfcHRyKysgPSBGWEFSR0JfUihzcmNfcGx0W2ldKTsKKyAgICAgIH0KKyAgICAgIGJncl9wdHIgPSAodWludDhfdCopcGx0OwogICAgIH0KLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgdWludDhfdCogc3JjX3BpeGVsID0gYmdyX3B0ciArIDMgKiAoKnNyY19zY2FuKyspOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19waXhlbCsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19waXhlbCsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiAgID0gKnNyY19waXhlbCsrOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGNvbXBzIC0gMjsKLSAgICAgICAgfQorICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopcGx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KilwbHQsIHBsdF9zaXplKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsdF9zaXplOyBpKyspIHsKKyAgICAgIGRzdF9wbHRbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCBiZ3JfcHRyWzJdLCBiZ3JfcHRyWzFdLCBiZ3JfcHRyWzBdKTsKKyAgICAgIGJncl9wdHIgKz0gMzsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzI0YnBwUmdiMlJnYjI0KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIDM7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gICAgICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbHRfc2l6ZTsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICAgICAgRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFtpXSksCisgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldEtWYWx1ZShzcmNfcGx0W2ldKSwgciwgZywgYik7CisgICAgICAgIGRzdF9wbHRbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCByLCBnLCBiKTsKKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogMzsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCAqIDMpOwotICAgICAgICB9CisgICAgICBGWFNZU19tZW1jcHkoZHN0X3BsdCwgc3JjX3BsdCwgcGx0X3NpemUgKiA0KTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzMyYnBwUmdiMlJnYjI0KHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgc3JjX3NjYW4rKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIGRlc3Rfc2Nhbiwgd2lkdGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIodWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGludCBjb21wcyA9IHBTcmNCaXRtYXAtPkdldEJQUCgpIC8gODsKLSAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBjb21wczsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBjb21wczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBjb21wczsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBjb21wcyAtIDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzMyYnBwQ215azJSZ2IzMih1aW50OF90KiBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIDQ7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKHNyY19zY2FuWzBdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMl0sIHNyY19zY2FuWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0sIGRlc3Rfc2NhblsxXSwgZGVzdF9zY2FuWzBdKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDb252ZXJ0QnVmZmVyKEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwgdWludDhfdCogZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqJiBkX3BhbCwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpOwotICAgIGlmICghQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSB8fCAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKLSAgICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7Ci0gICAgfQotICAgIHN3aXRjaCAoZGVzdF9mb3JtYXQpIHsKLSAgICAgICAgY2FzZSBGWERJQl9JbnZhbGlkOgotICAgICAgICBjYXNlIEZYRElCXzFicHBDbXlrOgotICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOgotICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6Ci0gICAgICAgICAgICBBU1NFUlQoRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOiB7Ci0gICAgICAgICAgICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMWJwcFBsdDJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzFicHBNYXNrMkdyYXkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfOGJwcFBsdDJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzhicHBNYXNrMkdyYXkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPj0gMjQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyX1JnYk9yQ215azJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOgotICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2JhOiB7Ci0gICAgICAgICAgICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gOCAmJiBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydEJ1ZmZlcihGWERJQl84YnBwTWFzaywgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBkX3BhbCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRfcGFsID0gRlhfQWxsb2MoRlhfRFdPUkQsIDI1Nik7Ci0gICAgICAgICAgICAgICAgaWYgKCgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEgfHwgKHNyY19mb3JtYXQgJiAweGZmKSA9PSA4KSAmJiBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyX1BsdDJQbHRSZ2I4KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgZF9wYWwsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA+PSAyNCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjgoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBkX3BhbCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl9SZ2I6Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiYTogewotICAgICAgICAgICAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzFicHBQbHQyUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl84YnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDI0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl8yNGJwcFJnYjJSZ2IyNChkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAzMikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMzJicHBSZ2IyUmdiMjQoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCX0FyZ2I6Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsKLSAgICAgICAgICAgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMWJwcE1hc2syUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl84YnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA+PSAyNCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2Zvcm1hdCAmIDB4MDQwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzMyYnBwQ215azJSZ2IzMihkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KK2lubGluZSBGWF9CT09MIF9Db252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4X05vVHJhbnNmb3JtKAorICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgIGludCBkZXN0X3BpdGNoLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0LAorICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgaW50IHNyY19sZWZ0LAorICAgIGludCBzcmNfdG9wLAorICAgIEZYX0RXT1JEKiBkc3RfcGx0KSB7CisgIGludCBicHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7CisgIGludCByb3csIGNvbDsKKyAgQ0ZYX1BhbGV0dGUgcGFsZXR0ZTsKKyAgcGFsZXR0ZS5CdWlsZFBhbGV0dGUocFNyY0JpdG1hcCwgRlhESUJfUEFMRVRURV9MT0MpOworICBGWF9EV09SRCogY0x1dCA9IHBhbGV0dGUuR2V0Q29sb3JMdXQoKTsKKyAgRlhfRFdPUkQqIGFMdXQgPSBwYWxldHRlLkdldEFtb3VudEx1dCgpOworICBpZiAoY0x1dCA9PSBOVUxMIHx8IGFMdXQgPT0gTlVMTCkgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgbHV0ID0gcGFsZXR0ZS5HZXRsdXQoKTsKKyAgRlhfRFdPUkQqIHBQYWxldHRlID0gcGFsZXR0ZS5HZXRQYWxldHRlKCk7CisgIGlmIChsdXQgPiAyNTYpIHsKKyAgICBpbnQgZXJyLCBtaW5fZXJyOworICAgIGludCBsdXRfMjU2ID0gbHV0IC0gMjU2OworICAgIGZvciAocm93ID0gMDsgcm93IDwgbHV0XzI1Njsgcm93KyspIHsKKyAgICAgIG1pbl9lcnIgPSAxMDAwMDAwOworICAgICAgdWludDhfdCByLCBnLCBiOworICAgICAgX0NvbG9yRGVjb2RlKGNMdXRbcm93XSwgciwgZywgYik7CisgICAgICBpbnQgY2xyaW5kZXggPSAwOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgMjU2OyBjb2wrKykgeworICAgICAgICBGWF9EV09SRCBwX2NvbG9yID0gKihwUGFsZXR0ZSArIGNvbCk7CisgICAgICAgIGludCBkX3IgPSByIC0gKHVpbnQ4X3QpKHBfY29sb3IgPj4gMTYpOworICAgICAgICBpbnQgZF9nID0gZyAtICh1aW50OF90KShwX2NvbG9yID4+IDgpOworICAgICAgICBpbnQgZF9iID0gYiAtICh1aW50OF90KShwX2NvbG9yKTsKKyAgICAgICAgZXJyID0gZF9yICogZF9yICsgZF9nICogZF9nICsgZF9iICogZF9iOworICAgICAgICBpZiAoZXJyIDwgbWluX2VycikgeworICAgICAgICAgIG1pbl9lcnIgPSBlcnI7CisgICAgICAgICAgY2xyaW5kZXggPSBjb2w7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGFMdXRbcm93XSA9IGNscmluZGV4OworICAgIH0KKyAgfQorICBpbnQzMl90IGx1dF8xID0gbHV0IC0gMTsKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAodWludDhfdCopcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QqIHNyY19wb3J0ID0gc3JjX3NjYW4gKyBjb2wgKiBicHA7CisgICAgICBpbnQgciA9IHNyY19wb3J0WzJdICYgMHhmMDsKKyAgICAgIGludCBnID0gc3JjX3BvcnRbMV0gJiAweGYwOworICAgICAgaW50IGIgPSBzcmNfcG9ydFswXSAmIDB4ZjA7CisgICAgICBGWF9EV09SRCBjbHJpbmRleCA9IChyIDw8IDQpICsgZyArIChiID4+IDQpOworICAgICAgZm9yIChpbnQgaSA9IGx1dF8xOyBpID49IDA7IGktLSkKKyAgICAgICAgaWYgKGNscmluZGV4ID09IGNMdXRbaV0pIHsKKyAgICAgICAgICAqKGRlc3Rfc2NhbiArIGNvbCkgPSAodWludDhfdCkoYUx1dFtpXSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgIH0KKyAgRlhTWVNfbWVtY3B5KGRzdF9wbHQsIHBQYWxldHRlLCBzaXplb2YoRlhfRFdPUkQpICogMjU2KTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1DRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkNsb25lQ29udmVydChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwLCB2b2lkKiBwSWNjVHJhbnNmb3JtKSBjb25zdAotewotICAgIGlmKGRlc3RfZm9ybWF0ID09IEdldEZvcm1hdCgpICYmIHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ2xvbmUocENsaXApOworRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOCh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGRzdF9wbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICB9CisgIEZYX0JPT0wgcmV0ID0gX0NvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjhfTm9UcmFuc2Zvcm0oCisgICAgICBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsCisgICAgICBkc3RfcGx0KTsKKyAgaWYgKHJldCAmJiBwSWNjVHJhbnNmb3JtKSB7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIEZYX0FSR0IqIHBsdCA9IGRzdF9wbHQgKyBpOworICAgICAgRlhfQVJHQiBwbHRfZW50cnkgPSBGWEFSR0JfVE9ESUIoKnBsdCk7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJnBsdF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmcGx0X2VudHJ5LCAxKTsKKyAgICAgICpwbHQgPSBGWEFSR0JfVE9ESUIocGx0X2VudHJ5KTsKICAgICB9Ci0gICAgaWYgKHBDbGlwKSB7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcENsb25lID0gQ2xvbmUocENsaXApOwotICAgICAgICBpZiAocENsb25lID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiByZXQ7Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzFicHBNYXNrMlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OworICB1aW50OF90IHNldF9ncmF5LCByZXNldF9ncmF5OworICBzZXRfZ3JheSA9IDB4ZmY7CisgIHJlc2V0X2dyYXkgPSAweDAwOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7CisgICAgZm9yIChpbnQgY29sID0gc3JjX2xlZnQ7IGNvbCA8IHNyY19sZWZ0ICsgd2lkdGg7IGNvbCsrKSB7CisgICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgeworICAgICAgICBkZXN0X3NjYW5bMF0gPSBzZXRfZ3JheTsKKyAgICAgICAgZGVzdF9zY2FuWzFdID0gc2V0X2dyYXk7CisgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNldF9ncmF5OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzdF9zY2FuWzBdID0gcmVzZXRfZ3JheTsKKyAgICAgICAgZGVzdF9zY2FuWzFdID0gcmVzZXRfZ3JheTsKKyAgICAgICAgZGVzdF9zY2FuWzJdID0gcmVzZXRfZ3JheTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSBjb21wczsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBNYXNrMlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKKyAgICB1aW50OF90IHNyY19waXhlbDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHNyY19waXhlbCA9ICpzcmNfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3BpeGVsOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3BpeGVsOworICAgICAgKmRlc3Rfc2NhbiA9IHNyY19waXhlbDsKKyAgICAgIGRlc3Rfc2NhbiArPSBjb21wcyAtIDI7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7CisgIEZYX0RXT1JEKiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOworICBGWF9EV09SRCBwbHRbMl07CisgIHVpbnQ4X3QqIGJncl9wdHIgPSAodWludDhfdCopcGx0OworICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgIHBsdFswXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0WzBdKTsKKyAgICBwbHRbMV0gPSBGWENNWUtfVE9ESUIoc3JjX3BsdFsxXSk7CisgIH0gZWxzZSB7CisgICAgYmdyX3B0clswXSA9IEZYQVJHQl9CKHNyY19wbHRbMF0pOworICAgIGJncl9wdHJbMV0gPSBGWEFSR0JfRyhzcmNfcGx0WzBdKTsKKyAgICBiZ3JfcHRyWzJdID0gRlhBUkdCX1Ioc3JjX3BsdFswXSk7CisgICAgYmdyX3B0clszXSA9IEZYQVJHQl9CKHNyY19wbHRbMV0pOworICAgIGJncl9wdHJbNF0gPSBGWEFSR0JfRyhzcmNfcGx0WzFdKTsKKyAgICBiZ3JfcHRyWzVdID0gRlhBUkdCX1Ioc3JjX3BsdFsxXSk7CisgIH0KKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKXBsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcGx0LCAyKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICAgIEZYU1lTX0dldENWYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0TVZhbHVlKHNyY19wbHRbMF0pLAorICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMF0pLCBiZ3JfcHRyWzJdLAorICAgICAgICAgIGJncl9wdHJbMV0sIGJncl9wdHJbMF0pOworICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICAgIEZYU1lTX0dldENWYWx1ZShzcmNfcGx0WzFdKSwgRlhTWVNfR2V0TVZhbHVlKHNyY19wbHRbMV0pLAorICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzFdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMV0pLCBiZ3JfcHRyWzVdLAorICAgICAgICAgIGJncl9wdHJbNF0sIGJncl9wdHJbM10pOworICAgIH0KKyAgfQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7CisgICAgZm9yIChpbnQgY29sID0gc3JjX2xlZnQ7IGNvbCA8IHNyY19sZWZ0ICsgd2lkdGg7IGNvbCsrKSB7CisgICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBiZ3JfcHRyWzNdOworICAgICAgICAqZGVzdF9zY2FuKysgPSBiZ3JfcHRyWzRdOworICAgICAgICAqZGVzdF9zY2FuID0gYmdyX3B0cls1XTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IGJncl9wdHJbMF07CisgICAgICAgICpkZXN0X3NjYW4rKyA9IGJncl9wdHJbMV07CisgICAgICAgICpkZXN0X3NjYW4gPSBiZ3JfcHRyWzJdOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IGNvbXBzIC0gMjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpbnQgY29tcHMgPSAoZHN0X2Zvcm1hdCAmIDB4ZmYpIC8gODsKKyAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7CisgIEZYX0RXT1JEIHBsdFsyNTZdOworICB1aW50OF90KiBiZ3JfcHRyID0gKHVpbnQ4X3QqKXBsdDsKKyAgaWYgKCFwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9CKHNyY19wbHRbaV0pOworICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9HKHNyY19wbHRbaV0pOworICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9SKHNyY19wbHRbaV0pOworICAgIH0KKyAgICBiZ3JfcHRyID0gKHVpbnQ4X3QqKXBsdDsKKyAgfQorICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIHBsdFtpXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0W2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICh1aW50OF90KilwbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXBsdCwgMjU2KTsKKyAgfSBlbHNlIHsKKyAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoCisgICAgICAgICAgICBGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0W2ldKSwKKyAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0W2ldKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbaV0pLAorICAgICAgICAgICAgYmdyX3B0clsyXSwgYmdyX3B0clsxXSwgYmdyX3B0clswXSk7CisgICAgICAgIGJncl9wdHIgKz0gMzsKKyAgICAgIH0KKyAgICAgIGJncl9wdHIgPSAodWludDhfdCopcGx0OworICAgIH0KKyAgfQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QqIHNyY19waXhlbCA9IGJncl9wdHIgKyAzICogKCpzcmNfc2NhbisrKTsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfcGl4ZWwrKzsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfcGl4ZWwrKzsKKyAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3BpeGVsKys7CisgICAgICBkZXN0X3NjYW4gKz0gY29tcHMgLSAyOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMjRicHBSZ2IyUmdiMjQodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiAzOworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIDM7CisgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGggKiAzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzMyYnBwUmdiMlJnYjI0KHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgIHNyY19zY2FuKys7CisgICAgfQorICB9CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRlc3Rfc2NhbiwgZGVzdF9zY2FuLCB3aWR0aCk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGludCBjb21wcyA9IHBTcmNCaXRtYXAtPkdldEJQUCgpIC8gODsKKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBjb21wczsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIHNyY19zY2FuICs9IGNvbXBzOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIGNvbXBzOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSBjb21wcyAtIDM7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8zMmJwcENteWsyUmdiMzIodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoc3JjX3NjYW5bMF0sIHNyY19zY2FuWzFdLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0sIGRlc3Rfc2NhblsxXSwgZGVzdF9zY2FuWzBdKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDb252ZXJ0QnVmZmVyKEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRComIGRfcGFsLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKTsKKyAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8CisgICAgICAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKKyAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKKyAgfQorICBzd2l0Y2ggKGRlc3RfZm9ybWF0KSB7CisgICAgY2FzZSBGWERJQl9JbnZhbGlkOgorICAgIGNhc2UgRlhESUJfMWJwcENteWs6CisgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKKyAgICBjYXNlIEZYRElCXzFicHBSZ2I6CisgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6IHsKKyAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEpIHsKKyAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgeworICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MkdyYXkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICB9Ci0gICAgICAgIGlmKCFwQ2xvbmUtPkNvbnZlcnRGb3JtYXQoZGVzdF9mb3JtYXQsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICBkZWxldGUgcENsb25lOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICB9CisgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKKyAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfOGJwcFBsdDJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcENsb25lOworICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syR3JheShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPj0gMjQpIHsKKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyX1JnYk9yQ215azJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmUgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghcENsb25lKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgRlhESUJfOGJwcFJnYjoKKyAgICBjYXNlIEZYRElCXzhicHBSZ2JhOiB7CisgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSA4ICYmIHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBDb252ZXJ0QnVmZmVyKEZYRElCXzhicHBNYXNrLCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIGRfcGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKKyAgICAgIH0KKyAgICAgIGRfcGFsID0gRlhfQWxsb2MoRlhfRFdPUkQsIDI1Nik7CisgICAgICBpZiAoKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMSB8fCAoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDgpICYmCisgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl9QbHQyUGx0UmdiOChkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBkX3BhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPj0gMjQpIHsKKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIGRfcGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSk7CisgICAgICB9CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmKCFwQ2xvbmUtPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgZGVzdF9mb3JtYXQpKSB7Ci0gICAgICAgIGRlbGV0ZSBwQ2xvbmU7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9CT09MIHJldCA9IFRSVUU7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwU3JjQWxwaGEgPSBOVUxMOwotICAgIGlmIChtX0FscGhhRmxhZyAmIDIpIHsKLSAgICAgICAgcFNyY0FscGhhID0gKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpID8gR2V0QWxwaGFNYXNrKCkgOiBtX3BBbHBoYU1hc2s7Ci0gICAgICAgIGlmIChwU3JjQWxwaGEgPT0gTlVMTCkgewotICAgICAgICAgICAgZGVsZXRlIHBDbG9uZTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgRlhESUJfUmdiOgorICAgIGNhc2UgRlhESUJfUmdiYTogeworICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMSkgeworICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzFicHBQbHQyUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICB9Ci0gICAgfQotICAgIGlmIChkZXN0X2Zvcm1hdCAmIDB4MDIwMCkgewotICAgICAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYikKLSAgICAgICAgICAgIHJldCA9IHBTcmNBbHBoYSA/Ci0gICAgICAgICAgICAgICAgICBwQ2xvbmUtPkxvYWRDaGFubmVsKEZYRElCX0FscGhhLCBwU3JjQWxwaGEsIEZYRElCX0FscGhhKSA6Ci0gICAgICAgICAgICAgICAgICBwQ2xvbmUtPkxvYWRDaGFubmVsKEZYRElCX0FscGhhLCAweGZmKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBwQ2xvbmUtPkNvcHlBbHBoYU1hc2socFNyY0FscGhhKTsKKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzFicHBNYXNrMlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCk7CisgICAgICB9CisgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKKyAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfOGJwcFBsdDJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzhicHBNYXNrMlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCk7CisgICAgICB9CisgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAyNCkgeworICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMjRicHBSZ2IyUmdiMjQoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMzIpIHsKKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzMyYnBwUmdiMlJnYjI0KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKHBTcmNBbHBoYSAmJiBwU3JjQWxwaGEgIT0gbV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIGRlbGV0ZSBwU3JjQWxwaGE7Ci0gICAgICAgIHBTcmNBbHBoYSA9IE5VTEw7Ci0gICAgfQotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIGRlbGV0ZSBwQ2xvbmU7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9EV09SRCogcGFsXzhicHAgPSBOVUxMOwotICAgIHJldCA9IENvbnZlcnRCdWZmZXIoZGVzdF9mb3JtYXQsIHBDbG9uZS0+R2V0QnVmZmVyKCksIHBDbG9uZS0+R2V0UGl0Y2goKSwgbV9XaWR0aCwgbV9IZWlnaHQsIHRoaXMsIDAsIDAsIHBhbF84YnBwLCBwSWNjVHJhbnNmb3JtKTsKLSAgICBpZiAoIXJldCkgewotICAgICAgICBpZiAocGFsXzhicHApIHsKLSAgICAgICAgICAgIEZYX0ZyZWUocGFsXzhicHApOworICAgIGNhc2UgRlhESUJfQXJnYjoKKyAgICBjYXNlIEZYRElCX1JnYjMyOiB7CisgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxKSB7CisgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKKyAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMWJwcFBsdDJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7CiAgICAgICAgIH0KLSAgICAgICAgZGVsZXRlIHBDbG9uZTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY190b3ApOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gOCkgeworICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl84YnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY190b3ApOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPj0gMjQpIHsKKyAgICAgICAgaWYgKHNyY19mb3JtYXQgJiAweDA0MDApIHsKKyAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMzJicHBDbXlrMlJnYjMyKGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfUmdiMlJnYjMyKGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pOworICAgICAgfQorICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZiAocGFsXzhicHApIHsKLSAgICAgICAgcENsb25lLT5Db3B5UGFsZXR0ZShwYWxfOGJwcCk7Ci0gICAgICAgIEZYX0ZyZWUocGFsXzhicHApOwotICAgICAgICBwYWxfOGJwcCA9IE5VTEw7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitDRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkNsb25lQ29udmVydChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIGNvbnN0IHsKKyAgaWYgKGRlc3RfZm9ybWF0ID09IEdldEZvcm1hdCgpICYmIHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCkgeworICAgIHJldHVybiBDbG9uZShwQ2xpcCk7CisgIH0KKyAgaWYgKHBDbGlwKSB7CisgICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmUgPSBDbG9uZShwQ2xpcCk7CisgICAgaWYgKHBDbG9uZSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFwQ2xvbmUtPkNvbnZlcnRGb3JtYXQoZGVzdF9mb3JtYXQsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICBkZWxldGUgcENsb25lOworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBwQ2xvbmU7CisgIH0KKyAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmUgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOworICBpZiAoIXBDbG9uZSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghcENsb25lLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIGRlc3RfZm9ybWF0KSkgeworICAgIGRlbGV0ZSBwQ2xvbmU7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfQk9PTCByZXQgPSBUUlVFOworICBDRlhfRElCaXRtYXAqIHBTcmNBbHBoYSA9IE5VTEw7CisgIGlmIChtX0FscGhhRmxhZyAmIDIpIHsKKyAgICBwU3JjQWxwaGEgPSAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgPyBHZXRBbHBoYU1hc2soKSA6IG1fcEFscGhhTWFzazsKKyAgICBpZiAocFNyY0FscGhhID09IE5VTEwpIHsKKyAgICAgIGRlbGV0ZSBwQ2xvbmU7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgaWYgKGRlc3RfZm9ybWF0ICYgMHgwMjAwKSB7CisgICAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IpCisgICAgICByZXQgPSBwU3JjQWxwaGEgPyBwQ2xvbmUtPkxvYWRDaGFubmVsKEZYRElCX0FscGhhLCBwU3JjQWxwaGEsIEZYRElCX0FscGhhKQorICAgICAgICAgICAgICAgICAgICAgIDogcENsb25lLT5Mb2FkQ2hhbm5lbChGWERJQl9BbHBoYSwgMHhmZik7CisgICAgZWxzZSB7CisgICAgICByZXQgPSBwQ2xvbmUtPkNvcHlBbHBoYU1hc2socFNyY0FscGhhKTsKKyAgICB9CisgIH0KKyAgaWYgKHBTcmNBbHBoYSAmJiBwU3JjQWxwaGEgIT0gbV9wQWxwaGFNYXNrKSB7CisgICAgZGVsZXRlIHBTcmNBbHBoYTsKKyAgICBwU3JjQWxwaGEgPSBOVUxMOworICB9CisgIGlmICghcmV0KSB7CisgICAgZGVsZXRlIHBDbG9uZTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWF9EV09SRCogcGFsXzhicHAgPSBOVUxMOworICByZXQgPSBDb252ZXJ0QnVmZmVyKGRlc3RfZm9ybWF0LCBwQ2xvbmUtPkdldEJ1ZmZlcigpLCBwQ2xvbmUtPkdldFBpdGNoKCksCisgICAgICAgICAgICAgICAgICAgICAgbV9XaWR0aCwgbV9IZWlnaHQsIHRoaXMsIDAsIDAsIHBhbF84YnBwLCBwSWNjVHJhbnNmb3JtKTsKKyAgaWYgKCFyZXQpIHsKKyAgICBpZiAocGFsXzhicHApIHsKKyAgICAgIEZYX0ZyZWUocGFsXzhicHApOworICAgIH0KKyAgICBkZWxldGUgcENsb25lOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChwYWxfOGJwcCkgeworICAgIHBDbG9uZS0+Q29weVBhbGV0dGUocGFsXzhicHApOworICAgIEZYX0ZyZWUocGFsXzhicHApOworICAgIHBhbF84YnBwID0gTlVMTDsKKyAgfQorICByZXR1cm4gcENsb25lOwogfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbnZlcnRGb3JtYXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0ID0gR2V0Rm9ybWF0KCk7Ci0gICAgaWYgKGRlc3RfZm9ybWF0ID09IHNyY19mb3JtYXQgJiYgcEljY1RyYW5zZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfOGJwcE1hc2sgJiYgc3JjX2Zvcm1hdCA9PSBGWERJQl84YnBwUmdiICYmIG1fcFBhbGV0dGUgPT0gTlVMTCkgewotICAgICAgICBtX0FscGhhRmxhZyA9IDE7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYiAmJiBzcmNfZm9ybWF0ID09IEZYRElCX1JnYjMyICYmIHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICBtX0FscGhhRmxhZyA9IDI7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHNjYW5saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIDM7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAqc2NhbmxpbmUgPSAweGZmOwotICAgICAgICAgICAgICAgIHNjYW5saW5lICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGludCBkZXN0X2JwcCA9IGRlc3RfZm9ybWF0ICYgMHhmZjsKLSAgICBpbnQgZGVzdF9waXRjaCA9IChkZXN0X2JwcCAqIG1fV2lkdGggKyAzMSkgLyAzMiAqIDQ7Ci0gICAgdWludDhfdCogZGVzdF9idWYgPSBGWF9UcnlBbGxvYyh1aW50OF90LCBkZXN0X3BpdGNoICogbV9IZWlnaHQgKyA0KTsKLSAgICBpZiAoZGVzdF9idWYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9ESUJpdG1hcCogcEFscGhhTWFzayA9IE5VTEw7Ci0gICAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAweGZmLCBkZXN0X3BpdGNoICogbV9IZWlnaHQgKyA0KTsKLSAgICAgICAgaWYgKG1fcEFscGhhTWFzaykgewotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBEc3RTY2FubGluZSA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaCArIDM7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY1NjYW5saW5lID0gbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAqcERzdFNjYW5saW5lID0gKnBTcmNTY2FubGluZSsrOwotICAgICAgICAgICAgICAgICAgICBwRHN0U2NhbmxpbmUgKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGRlc3RfZm9ybWF0ICYgMHgwMjAwKSB7Ci0gICAgICAgIGlmIChzcmNfZm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgIHBBbHBoYU1hc2sgPSBHZXRBbHBoYU1hc2soKTsKLSAgICAgICAgICAgIGlmIChwQWxwaGFNYXNrID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBGWF9GcmVlKGRlc3RfYnVmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9wQWxwaGFNYXNrID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIUJ1aWxkQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShkZXN0X2J1Zik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEFscGhhTWFzayA9IG1fcEFscGhhTWFzazsKLSAgICAgICAgICAgICAgICBtX3BBbHBoYU1hc2sgPSBOVUxMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwQWxwaGFNYXNrID0gbV9wQWxwaGFNYXNrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEZYX0JPT0wgcmV0ID0gRkFMU0U7Ci0gICAgRlhfRFdPUkQqIHBhbF84YnBwID0gTlVMTDsKLSAgICByZXQgPSBDb252ZXJ0QnVmZmVyKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgbV9XaWR0aCwgbV9IZWlnaHQsIHRoaXMsIDAsIDAsIHBhbF84YnBwLCBwSWNjVHJhbnNmb3JtKTsKLSAgICBpZiAoIXJldCkgewotICAgICAgICBpZiAocGFsXzhicHApIHsKLSAgICAgICAgICAgIEZYX0ZyZWUocGFsXzhicHApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQWxwaGFNYXNrICE9IG1fcEFscGhhTWFzaykgewotICAgICAgICAgICAgZGVsZXRlIHBBbHBoYU1hc2s7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlc3RfYnVmKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKGRlc3RfYnVmKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3BBbHBoYU1hc2sgJiYgcEFscGhhTWFzayAhPSBtX3BBbHBoYU1hc2spIHsKLSAgICAgICAgZGVsZXRlIG1fcEFscGhhTWFzazsKLSAgICB9Ci0gICAgbV9wQWxwaGFNYXNrID0gcEFscGhhTWFzazsKLSAgICBpZiAobV9wUGFsZXR0ZSkgewotICAgICAgICBGWF9GcmVlKG1fcFBhbGV0dGUpOwotICAgIH0KLSAgICBtX3BQYWxldHRlID0gcGFsXzhicHA7Ci0gICAgaWYgKCFtX2JFeHRCdWYpIHsKLSAgICAgICAgRlhfRnJlZShtX3BCdWZmZXIpOwotICAgIH0KLSAgICBtX2JFeHRCdWYgPSBGQUxTRTsKLSAgICBtX3BCdWZmZXIgPSBkZXN0X2J1ZjsKLSAgICBtX2JwcCA9ICh1aW50OF90KWRlc3RfZm9ybWF0OwotICAgIG1fQWxwaGFGbGFnID0gKHVpbnQ4X3QpKGRlc3RfZm9ybWF0ID4+IDgpOwotICAgIG1fUGl0Y2ggPSBkZXN0X3BpdGNoOworRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbnZlcnRGb3JtYXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCA9IEdldEZvcm1hdCgpOworICBpZiAoZGVzdF9mb3JtYXQgPT0gc3JjX2Zvcm1hdCAmJiBwSWNjVHJhbnNmb3JtID09IE5VTEwpIHsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfOGJwcE1hc2sgJiYgc3JjX2Zvcm1hdCA9PSBGWERJQl84YnBwUmdiICYmCisgICAgICBtX3BQYWxldHRlID09IE5VTEwpIHsKKyAgICBtX0FscGhhRmxhZyA9IDE7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IgJiYgc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IzMiAmJgorICAgICAgcEljY1RyYW5zZm9ybSA9PSBOVUxMKSB7CisgICAgbV9BbHBoYUZsYWcgPSAyOworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogc2NhbmxpbmUgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgMzsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICpzY2FubGluZSA9IDB4ZmY7CisgICAgICAgIHNjYW5saW5lICs9IDQ7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisgIGludCBkZXN0X2JwcCA9IGRlc3RfZm9ybWF0ICYgMHhmZjsKKyAgaW50IGRlc3RfcGl0Y2ggPSAoZGVzdF9icHAgKiBtX1dpZHRoICsgMzEpIC8gMzIgKiA0OworICB1aW50OF90KiBkZXN0X2J1ZiA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIGRlc3RfcGl0Y2ggKiBtX0hlaWdodCArIDQpOworICBpZiAoZGVzdF9idWYgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfRElCaXRtYXAqIHBBbHBoYU1hc2sgPSBOVUxMOworICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgMHhmZiwgZGVzdF9waXRjaCAqIG1fSGVpZ2h0ICsgNCk7CisgICAgaWYgKG1fcEFscGhhTWFzaykgeworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIHBEc3RTY2FubGluZSA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaCArIDM7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNTY2FubGluZSA9IG1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqcERzdFNjYW5saW5lID0gKnBTcmNTY2FubGluZSsrOworICAgICAgICAgIHBEc3RTY2FubGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKGRlc3RfZm9ybWF0ICYgMHgwMjAwKSB7CisgICAgaWYgKHNyY19mb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgICAgcEFscGhhTWFzayA9IEdldEFscGhhTWFzaygpOworICAgICAgaWYgKHBBbHBoYU1hc2sgPT0gTlVMTCkgeworICAgICAgICBGWF9GcmVlKGRlc3RfYnVmKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9wQWxwaGFNYXNrID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFCdWlsZEFscGhhTWFzaygpKSB7CisgICAgICAgICAgRlhfRnJlZShkZXN0X2J1Zik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIHBBbHBoYU1hc2sgPSBtX3BBbHBoYU1hc2s7CisgICAgICAgIG1fcEFscGhhTWFzayA9IE5VTEw7CisgICAgICB9IGVsc2UgeworICAgICAgICBwQWxwaGFNYXNrID0gbV9wQWxwaGFNYXNrOworICAgICAgfQorICAgIH0KKyAgfQorICBGWF9CT09MIHJldCA9IEZBTFNFOworICBGWF9EV09SRCogcGFsXzhicHAgPSBOVUxMOworICByZXQgPSBDb252ZXJ0QnVmZmVyKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgbV9XaWR0aCwgbV9IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgdGhpcywgMCwgMCwgcGFsXzhicHAsIHBJY2NUcmFuc2Zvcm0pOworICBpZiAoIXJldCkgeworICAgIGlmIChwYWxfOGJwcCkgeworICAgICAgRlhfRnJlZShwYWxfOGJwcCk7CisgICAgfQorICAgIGlmIChwQWxwaGFNYXNrICE9IG1fcEFscGhhTWFzaykgeworICAgICAgZGVsZXRlIHBBbHBoYU1hc2s7CisgICAgfQorICAgIGlmIChkZXN0X2J1ZikgeworICAgICAgRlhfRnJlZShkZXN0X2J1Zik7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9wQWxwaGFNYXNrICYmIHBBbHBoYU1hc2sgIT0gbV9wQWxwaGFNYXNrKSB7CisgICAgZGVsZXRlIG1fcEFscGhhTWFzazsKKyAgfQorICBtX3BBbHBoYU1hc2sgPSBwQWxwaGFNYXNrOworICBpZiAobV9wUGFsZXR0ZSkgeworICAgIEZYX0ZyZWUobV9wUGFsZXR0ZSk7CisgIH0KKyAgbV9wUGFsZXR0ZSA9IHBhbF84YnBwOworICBpZiAoIW1fYkV4dEJ1ZikgeworICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKKyAgfQorICBtX2JFeHRCdWYgPSBGQUxTRTsKKyAgbV9wQnVmZmVyID0gZGVzdF9idWY7CisgIG1fYnBwID0gKHVpbnQ4X3QpZGVzdF9mb3JtYXQ7CisgIG1fQWxwaGFGbGFnID0gKHVpbnQ4X3QpKGRlc3RfZm9ybWF0ID4+IDgpOworICBtX1BpdGNoID0gZGVzdF9waXRjaDsKKyAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9lbmdpbmUuY3BwCmluZGV4IGZlY2M2ZjEuLjAyZTRkYmMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9lbmdpbmUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9lbmdpbmUuY3BwCkBAIC05LDgzMCArOSw5MjggQEAKICNpbmNsdWRlICJkaWJfaW50LmgiCiAjaW5jbHVkZSA8bGltaXRzLmg+CiBleHRlcm4gaW50IFNEUF9UYWJsZVs1MTNdOwotdm9pZCBDV2VpZ2h0VGFibGU6OkNhbGMoaW50IGRlc3RfbGVuLCBpbnQgZGVzdF9taW4sIGludCBkZXN0X21heCwgaW50IHNyY19sZW4sIGludCBzcmNfbWluLCBpbnQgc3JjX21heCwgaW50IGZsYWdzKQotewotICAgIGlmIChtX3BXZWlnaHRUYWJsZXMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BXZWlnaHRUYWJsZXMpOwotICAgICAgICBtX3BXZWlnaHRUYWJsZXMgPSBOVUxMOwotICAgIH0KLSAgICBkb3VibGUgc2NhbGUsIGJhc2U7Ci0gICAgc2NhbGUgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShzcmNfbGVuKSwgKEZYX0ZMT0FUKShkZXN0X2xlbikpOwotICAgIGlmIChkZXN0X2xlbiA8IDApIHsKLSAgICAgICAgYmFzZSA9IChGWF9GTE9BVCkoc3JjX2xlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYmFzZSA9IDA7Ci0gICAgfQotICAgIGludCBleHRfc2l6ZSA9IGZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCA/IDMgOiAxOwotICAgIG1fSXRlbVNpemUgPSBzaXplb2YoaW50KSAqIDIgKyAoaW50KShzaXplb2YoaW50KSAqIChGWFNZU19jZWlsKEZYU1lTX2ZhYnMoKEZYX0ZMT0FUKXNjYWxlKSkgKyBleHRfc2l6ZSkpOwotICAgIG1fRGVzdE1pbiA9IGRlc3RfbWluOwotICAgIGlmICgoZGVzdF9tYXggLSBkZXN0X21pbikgPiAoaW50KSgoMVUgPDwgMzApIC0gNCkgLyBtX0l0ZW1TaXplKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wV2VpZ2h0VGFibGVzID0gRlhfVHJ5QWxsb2ModWludDhfdCwgKGRlc3RfbWF4IC0gZGVzdF9taW4pICogbV9JdGVtU2l6ZSArIDQpOwotICAgIGlmIChtX3BXZWlnaHRUYWJsZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgoZmxhZ3MgJiBGWERJQl9OT1NNT09USCkgIT0gMCB8fCBGWFNZU19mYWJzKChGWF9GTE9BVClzY2FsZSkgPCAxLjBmKSB7Ci0gICAgICAgIGZvciAoaW50IGRlc3RfcGl4ZWwgPSBkZXN0X21pbjsgZGVzdF9waXhlbCA8IGRlc3RfbWF4OyBkZXN0X3BpeGVsICsrKSB7Ci0gICAgICAgICAgICBQaXhlbFdlaWdodCYgcGl4ZWxfd2VpZ2h0cyA9ICpHZXRQaXhlbFdlaWdodChkZXN0X3BpeGVsKTsKLSAgICAgICAgICAgIGRvdWJsZSBzcmNfcG9zID0gZGVzdF9waXhlbCAqIHNjYWxlICsgc2NhbGUgLyAyICsgYmFzZTsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIEZYRElCX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3BvcyAtIDEuMGYgLyAyKTsKLSAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3BvcyArIDEuMGYgLyAyKTsKLSAgICAgICAgICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IDwgc3JjX21pbikgewotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzcmNfbWluOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzcmNfbWF4IC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpKHNyY19wb3MgLSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgLSAxLjBmIC8gMikgKiA2NTUzNik7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzYgLSBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgewotICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgLSAxLjBmIC8gMik7Ci0gICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgKyAxLjBmIC8gMik7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IC0gMTsKLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCArIDE7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgc3JjX21pbikgewotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHNyY19taW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbmQgPj0gc3JjX21heCkgewotICAgICAgICAgICAgICAgICAgICBlbmQgPSBzcmNfbWF4IC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA8IHNyY19taW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3BvcyArPSBzcmNfbWluIC0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0OwotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzcmNfbWluOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzcmNfbWF4IC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHdlaWdodDsKLSAgICAgICAgICAgICAgICB3ZWlnaHQgPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpKHNyY19wb3MgLSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgLSAxLjBmIC8gMikgKiAyNTYpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSAoU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gKyBTRFBfVGFibGVbd2VpZ2h0XSArIFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdICsgU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0pIDw8IDg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoc3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ICYmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kKSAmJiBzdGFydCA8IGVuZCkgfHwgKHN0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ICYmIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kICYmIGVuZCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gKFNEUF9UYWJsZVt3ZWlnaHRdICsgU0RQX1RhYmxlWzI1NiAtIHdlaWdodF0gKyBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gKFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdICsgU0RQX1RhYmxlW3dlaWdodF0gKyBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9IFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gKFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdICsgU0RQX1RhYmxlW3dlaWdodF0pIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSAoU0RQX1RhYmxlWzI1NiAtIHdlaWdodF0gKyBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID09IHBpeGVsX3dlaWdodHMubV9TcmNFbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA8IHBpeGVsX3dlaWdodHMubV9TcmNFbmQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPCBlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSAoU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gKyBTRFBfVGFibGVbd2VpZ2h0XSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSA8PCA4OwotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1syXSA9IFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBlbmQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydCA8IHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9PSBlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSBTRFBfVGFibGVbMjU2ICsgd2VpZ2h0XSA8PCA4OwotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9IFNEUF9UYWJsZVt3ZWlnaHRdIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzJdID0gKFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdICsgU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0pIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gPDwgODsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBTRFBfVGFibGVbd2VpZ2h0XSA8PCA4OwotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1syXSA9IFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzNdID0gU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0gPDwgODsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBlbmQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3Bvcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA8IHNyY19taW4pIHsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3JjX21pbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPj0gc3JjX21heCkgewotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gc3JjX21heCAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzY7Ci0gICAgICAgICAgICB9Cit2b2lkIENXZWlnaHRUYWJsZTo6Q2FsYyhpbnQgZGVzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKKyAgaWYgKG1fcFdlaWdodFRhYmxlcykgeworICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsKKyAgICBtX3BXZWlnaHRUYWJsZXMgPSBOVUxMOworICB9CisgIGRvdWJsZSBzY2FsZSwgYmFzZTsKKyAgc2NhbGUgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShzcmNfbGVuKSwgKEZYX0ZMT0FUKShkZXN0X2xlbikpOworICBpZiAoZGVzdF9sZW4gPCAwKSB7CisgICAgYmFzZSA9IChGWF9GTE9BVCkoc3JjX2xlbik7CisgIH0gZWxzZSB7CisgICAgYmFzZSA9IDA7CisgIH0KKyAgaW50IGV4dF9zaXplID0gZmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MID8gMyA6IDE7CisgIG1fSXRlbVNpemUgPQorICAgICAgc2l6ZW9mKGludCkgKiAyICsKKyAgICAgIChpbnQpKHNpemVvZihpbnQpICogKEZYU1lTX2NlaWwoRlhTWVNfZmFicygoRlhfRkxPQVQpc2NhbGUpKSArIGV4dF9zaXplKSk7CisgIG1fRGVzdE1pbiA9IGRlc3RfbWluOworICBpZiAoKGRlc3RfbWF4IC0gZGVzdF9taW4pID4gKGludCkoKDFVIDw8IDMwKSAtIDQpIC8gbV9JdGVtU2l6ZSkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BXZWlnaHRUYWJsZXMgPQorICAgICAgRlhfVHJ5QWxsb2ModWludDhfdCwgKGRlc3RfbWF4IC0gZGVzdF9taW4pICogbV9JdGVtU2l6ZSArIDQpOworICBpZiAobV9wV2VpZ2h0VGFibGVzID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKChmbGFncyAmIEZYRElCX05PU01PT1RIKSAhPSAwIHx8IEZYU1lTX2ZhYnMoKEZYX0ZMT0FUKXNjYWxlKSA8IDEuMGYpIHsKKyAgICBmb3IgKGludCBkZXN0X3BpeGVsID0gZGVzdF9taW47IGRlc3RfcGl4ZWwgPCBkZXN0X21heDsgZGVzdF9waXhlbCsrKSB7CisgICAgICBQaXhlbFdlaWdodCYgcGl4ZWxfd2VpZ2h0cyA9ICpHZXRQaXhlbFdlaWdodChkZXN0X3BpeGVsKTsKKyAgICAgIGRvdWJsZSBzcmNfcG9zID0gZGVzdF9waXhlbCAqIHNjYWxlICsgc2NhbGUgLyAyICsgYmFzZTsKKyAgICAgIGlmIChmbGFncyAmIEZYRElCX0lOVEVSUE9MKSB7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9CisgICAgICAgICAgICAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfcG9zIC0gMS4wZiAvIDIpOworICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3BvcyArIDEuMGYgLyAyKTsKKyAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA8IHNyY19taW4pIHsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzcmNfbWluOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgZGVzdF9waXhlbCA9IGRlc3RfbWluOyBkZXN0X3BpeGVsIDwgZGVzdF9tYXg7IGRlc3RfcGl4ZWwgKyspIHsKLSAgICAgICAgUGl4ZWxXZWlnaHQmIHBpeGVsX3dlaWdodHMgPSAqR2V0UGl4ZWxXZWlnaHQoZGVzdF9waXhlbCk7Ci0gICAgICAgIGRvdWJsZSBzcmNfc3RhcnQgPSBkZXN0X3BpeGVsICogc2NhbGUgKyBiYXNlOwotICAgICAgICBkb3VibGUgc3JjX2VuZCA9IHNyY19zdGFydCArIHNjYWxlOwotICAgICAgICBpbnQgc3RhcnRfaSwgZW5kX2k7Ci0gICAgICAgIGlmIChzcmNfc3RhcnQgPCBzcmNfZW5kKSB7Ci0gICAgICAgICAgICBzdGFydF9pID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3N0YXJ0KTsKLSAgICAgICAgICAgIGVuZF9pID0gKGludClGWFNZU19jZWlsKChGWF9GTE9BVClzcmNfZW5kKTsKKyAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPj0gc3JjX21heCkgeworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzcmNfbWF4IC0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID09IHBpeGVsX3dlaWdodHMubV9TcmNFbmQpIHsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RhcnRfaSA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19lbmQpOwotICAgICAgICAgICAgZW5kX2kgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19zdGFydCk7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBGWFNZU19yb3VuZCgKKyAgICAgICAgICAgICAgKEZYX0ZMT0FUKShzcmNfcG9zIC0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IC0gMS4wZiAvIDIpICoKKyAgICAgICAgICAgICAgNjU1MzYpOworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzYgLSBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXTsKICAgICAgICAgfQotICAgICAgICBpZiAoc3RhcnRfaSA8IHNyY19taW4pIHsKLSAgICAgICAgICAgIHN0YXJ0X2kgPSBzcmNfbWluOworICAgICAgfSBlbHNlIGlmIChmbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKKyAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0KKyAgICAgICAgICAgIChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgLSAxLjBmIC8gMik7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfcG9zICsgMS4wZiAvIDIpOworICAgICAgICBpbnQgc3RhcnQgPSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgLSAxOworICAgICAgICBpbnQgZW5kID0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCArIDE7CisgICAgICAgIGlmIChzdGFydCA8IHNyY19taW4pIHsKKyAgICAgICAgICBzdGFydCA9IHNyY19taW47CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGVuZF9pID49IHNyY19tYXgpIHsKLSAgICAgICAgICAgIGVuZF9pID0gc3JjX21heCAtIDE7CisgICAgICAgIGlmIChlbmQgPj0gc3JjX21heCkgeworICAgICAgICAgIGVuZCA9IHNyY19tYXggLSAxOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGFydF9pID4gZW5kX2kpIHsKLSAgICAgICAgICAgIGlmIChzdGFydF9pID49IHNyY19tYXgpIHsKLSAgICAgICAgICAgICAgICBzdGFydF9pID0gc3JjX21heCAtIDE7CisgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPCBzcmNfbWluKSB7CisgICAgICAgICAgc3JjX3BvcyArPSBzcmNfbWluIC0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHNyY19taW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPj0gc3JjX21heCkgeworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzcmNfbWF4IC0gMTsKKyAgICAgICAgfQorICAgICAgICBpbnQgd2VpZ2h0OworICAgICAgICB3ZWlnaHQgPSBGWFNZU19yb3VuZCgKKyAgICAgICAgICAgIChGWF9GTE9BVCkoc3JjX3BvcyAtIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAtIDEuMGYgLyAyKSAqIDI1Nik7CisgICAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9CisgICAgICAgICAgICAgIChTRFBfVGFibGVbMjU2ICsgd2VpZ2h0XSArIFNEUF9UYWJsZVt3ZWlnaHRdICsKKyAgICAgICAgICAgICAgIFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdICsgU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0pCisgICAgICAgICAgICAgIDw8IDg7CisgICAgICAgIH0gZWxzZSBpZiAoKHN0YXJ0ID09IHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAmJgorICAgICAgICAgICAgICAgICAgICAocGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID09IHBpeGVsX3dlaWdodHMubV9TcmNFbmQgfHwKKyAgICAgICAgICAgICAgICAgICAgIGVuZCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kKSAmJgorICAgICAgICAgICAgICAgICAgICBzdGFydCA8IGVuZCkgfHwKKyAgICAgICAgICAgICAgICAgICAoc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgJiYKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID09IHBpeGVsX3dlaWdodHMubV9TcmNFbmQgJiYKKyAgICAgICAgICAgICAgICAgICAgZW5kID09IHBpeGVsX3dlaWdodHMubV9TcmNFbmQpKSB7CisgICAgICAgICAgaWYgKHN0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0KSB7CisgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdIDw8IDg7CisgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9CisgICAgICAgICAgICAgICAgKFNEUF9UYWJsZVt3ZWlnaHRdICsgU0RQX1RhYmxlWzI1NiAtIHdlaWdodF0gKworICAgICAgICAgICAgICAgICBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSkKKyAgICAgICAgICAgICAgICA8PCA4OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID09IHBpeGVsX3dlaWdodHMubV9TcmNFbmQpIHsKKyAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPQorICAgICAgICAgICAgICAgICAgKFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdICsgU0RQX1RhYmxlW3dlaWdodF0gKworICAgICAgICAgICAgICAgICAgIFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdKQorICAgICAgICAgICAgICAgICAgPDwgODsKKyAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSA8PCA4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPQorICAgICAgICAgICAgICAgICAgKFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdICsgU0RQX1RhYmxlW3dlaWdodF0pIDw8IDg7CisgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0KKyAgICAgICAgICAgICAgICAgIChTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSArIFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdKSA8PCA4OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnRfaTsKLSAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzdGFydF9pOwotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgeworICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IGVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0KSB7CisgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ICYmCisgICAgICAgICAgICAgICAgICAgc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kICYmCisgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA8IGVuZCkgeworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0KKyAgICAgICAgICAgICAgKFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdICsgU0RQX1RhYmxlW3dlaWdodF0pIDw8IDg7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzJdID0gU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0gPDwgODsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ICYmCisgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCAmJgorICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPT0gZW5kKSB7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSBTRFBfVGFibGVbMjU2ICsgd2VpZ2h0XSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gU0RQX1RhYmxlW3dlaWdodF0gPDwgODsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1syXSA9CisgICAgICAgICAgICAgIChTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSArIFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdKSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHN0YXJ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gPDwgODsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9IFNEUF9UYWJsZVt3ZWlnaHRdIDw8IDg7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMl0gPSBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzNdID0gU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0gPDwgODsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydDsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kOwogICAgICAgICB9Ci0gICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHN0YXJ0X2k7Ci0gICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBlbmRfaTsKLSAgICAgICAgZm9yIChpbnQgaiA9IHN0YXJ0X2k7IGogPD0gZW5kX2k7IGogKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSBkZXN0X3N0YXJ0ID0gRlhTWVNfRGl2KChGWF9GTE9BVCkoaikgLSBiYXNlLCBzY2FsZSk7Ci0gICAgICAgICAgICBkb3VibGUgZGVzdF9lbmQgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShqICsgMSkgLSBiYXNlLCBzY2FsZSk7Ci0gICAgICAgICAgICBpZiAoZGVzdF9zdGFydCA+IGRlc3RfZW5kKSB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHRlbXAgPSBkZXN0X3N0YXJ0OwotICAgICAgICAgICAgICAgIGRlc3Rfc3RhcnQgPSBkZXN0X2VuZDsKLSAgICAgICAgICAgICAgICBkZXN0X2VuZCA9IHRlbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkb3VibGUgYXJlYV9zdGFydCA9IGRlc3Rfc3RhcnQgPiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwpID8gZGVzdF9zdGFydCA6IChGWF9GTE9BVCkoZGVzdF9waXhlbCk7Ci0gICAgICAgICAgICBkb3VibGUgYXJlYV9lbmQgPSBkZXN0X2VuZCA+IChGWF9GTE9BVCkoZGVzdF9waXhlbCArIDEpID8gKEZYX0ZMT0FUKShkZXN0X3BpeGVsICsgMSkgOiBkZXN0X2VuZDsKLSAgICAgICAgICAgIGRvdWJsZSB3ZWlnaHQgPSBhcmVhX3N0YXJ0ID49IGFyZWFfZW5kID8gMC4wZiA6IGFyZWFfZW5kIC0gYXJlYV9zdGFydDsKLSAgICAgICAgICAgIGlmICh3ZWlnaHQgPT0gMCAmJiBqID09IGVuZF9pKSB7Ci0gICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCAtLTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzW2ogLSBzdGFydF9pXSA9IEZYU1lTX3JvdW5kKChGWF9GTE9BVCkod2VpZ2h0ICogNjU1MzYpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPQorICAgICAgICAgICAgKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3Bvcyk7CisgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPCBzcmNfbWluKSB7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3JjX21pbjsKICAgICAgICAgfQorICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHNyY19tYXggLSAxOworICAgICAgICB9CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzY7CisgICAgICB9CiAgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBkZXN0X3BpeGVsID0gZGVzdF9taW47IGRlc3RfcGl4ZWwgPCBkZXN0X21heDsgZGVzdF9waXhlbCsrKSB7CisgICAgUGl4ZWxXZWlnaHQmIHBpeGVsX3dlaWdodHMgPSAqR2V0UGl4ZWxXZWlnaHQoZGVzdF9waXhlbCk7CisgICAgZG91YmxlIHNyY19zdGFydCA9IGRlc3RfcGl4ZWwgKiBzY2FsZSArIGJhc2U7CisgICAgZG91YmxlIHNyY19lbmQgPSBzcmNfc3RhcnQgKyBzY2FsZTsKKyAgICBpbnQgc3RhcnRfaSwgZW5kX2k7CisgICAgaWYgKHNyY19zdGFydCA8IHNyY19lbmQpIHsKKyAgICAgIHN0YXJ0X2kgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfc3RhcnQpOworICAgICAgZW5kX2kgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19lbmQpOworICAgIH0gZWxzZSB7CisgICAgICBzdGFydF9pID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX2VuZCk7CisgICAgICBlbmRfaSA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX3N0YXJ0KTsKKyAgICB9CisgICAgaWYgKHN0YXJ0X2kgPCBzcmNfbWluKSB7CisgICAgICBzdGFydF9pID0gc3JjX21pbjsKKyAgICB9CisgICAgaWYgKGVuZF9pID49IHNyY19tYXgpIHsKKyAgICAgIGVuZF9pID0gc3JjX21heCAtIDE7CisgICAgfQorICAgIGlmIChzdGFydF9pID4gZW5kX2kpIHsKKyAgICAgIGlmIChzdGFydF9pID49IHNyY19tYXgpIHsKKyAgICAgICAgc3RhcnRfaSA9IHNyY19tYXggLSAxOworICAgICAgfQorICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnRfaTsKKyAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzdGFydF9pOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHN0YXJ0X2k7CisgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IGVuZF9pOworICAgIGZvciAoaW50IGogPSBzdGFydF9pOyBqIDw9IGVuZF9pOyBqKyspIHsKKyAgICAgIGRvdWJsZSBkZXN0X3N0YXJ0ID0gRlhTWVNfRGl2KChGWF9GTE9BVCkoaiktYmFzZSwgc2NhbGUpOworICAgICAgZG91YmxlIGRlc3RfZW5kID0gRlhTWVNfRGl2KChGWF9GTE9BVCkoaiArIDEpIC0gYmFzZSwgc2NhbGUpOworICAgICAgaWYgKGRlc3Rfc3RhcnQgPiBkZXN0X2VuZCkgeworICAgICAgICBkb3VibGUgdGVtcCA9IGRlc3Rfc3RhcnQ7CisgICAgICAgIGRlc3Rfc3RhcnQgPSBkZXN0X2VuZDsKKyAgICAgICAgZGVzdF9lbmQgPSB0ZW1wOworICAgICAgfQorICAgICAgZG91YmxlIGFyZWFfc3RhcnQgPSBkZXN0X3N0YXJ0ID4gKEZYX0ZMT0FUKShkZXN0X3BpeGVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXN0X3N0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVCkoZGVzdF9waXhlbCk7CisgICAgICBkb3VibGUgYXJlYV9lbmQgPSBkZXN0X2VuZCA+IChGWF9GTE9BVCkoZGVzdF9waXhlbCArIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVzdF9lbmQ7CisgICAgICBkb3VibGUgd2VpZ2h0ID0gYXJlYV9zdGFydCA+PSBhcmVhX2VuZCA/IDAuMGYgOiBhcmVhX2VuZCAtIGFyZWFfc3RhcnQ7CisgICAgICBpZiAod2VpZ2h0ID09IDAgJiYgaiA9PSBlbmRfaSkgeworICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kLS07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbaiAtIHN0YXJ0X2ldID0KKyAgICAgICAgICBGWFNZU19yb3VuZCgoRlhfRkxPQVQpKHdlaWdodCAqIDY1NTM2KSk7CisgICAgfQorICB9CiB9Ci1DU3RyZXRjaEVuZ2luZTo6Q1N0cmV0Y2hFbmdpbmUoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0Qml0bWFwLCBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCYgY2xpcF9yZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBmbGFncykKLXsKLSAgICBtX1N0YXRlID0gMDsKLSAgICBtX0Rlc3RGb3JtYXQgPSBkZXN0X2Zvcm1hdDsKLSAgICBtX0Rlc3RCcHAgPSBkZXN0X2Zvcm1hdCAmIDB4ZmY7Ci0gICAgbV9TcmNCcHAgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4ZmY7Ci0gICAgbV9iSGFzQWxwaGEgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4MjAwOwotICAgIG1fcFNyY1BhbGV0dGUgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7Ci0gICAgbV9wRGVzdEJpdG1hcCA9IHBEZXN0Qml0bWFwOwotICAgIG1fRGVzdFdpZHRoID0gZGVzdF93aWR0aDsKLSAgICBtX0Rlc3RIZWlnaHQgPSBkZXN0X2hlaWdodDsKLSAgICBtX3BJbnRlckJ1ZiA9IE5VTEw7Ci0gICAgbV9wRXh0cmFBbHBoYUJ1ZiA9IE5VTEw7Ci0gICAgbV9wRGVzdE1hc2tTY2FubGluZSA9IE5VTEw7Ci0gICAgbV9EZXN0Q2xpcCA9IGNsaXBfcmVjdDsKLSAgICBGWF9EV09SRCBzaXplID0gY2xpcF9yZWN0LldpZHRoKCk7Ci0gICAgaWYgKHNpemUgJiYgbV9EZXN0QnBwID4gKGludCkoSU5UX01BWCAvIHNpemUpKSB7Ci0gICAgICAgIHJldHVybjsKK0NTdHJldGNoRW5naW5lOjpDU3RyZXRjaEVuZ2luZShJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3RCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBjbGlwX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKKyAgbV9TdGF0ZSA9IDA7CisgIG1fRGVzdEZvcm1hdCA9IGRlc3RfZm9ybWF0OworICBtX0Rlc3RCcHAgPSBkZXN0X2Zvcm1hdCAmIDB4ZmY7CisgIG1fU3JjQnBwID0gcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCkgJiAweGZmOworICBtX2JIYXNBbHBoYSA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpICYgMHgyMDA7CisgIG1fcFNyY1BhbGV0dGUgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7CisgIG1fcERlc3RCaXRtYXAgPSBwRGVzdEJpdG1hcDsKKyAgbV9EZXN0V2lkdGggPSBkZXN0X3dpZHRoOworICBtX0Rlc3RIZWlnaHQgPSBkZXN0X2hlaWdodDsKKyAgbV9wSW50ZXJCdWYgPSBOVUxMOworICBtX3BFeHRyYUFscGhhQnVmID0gTlVMTDsKKyAgbV9wRGVzdE1hc2tTY2FubGluZSA9IE5VTEw7CisgIG1fRGVzdENsaXAgPSBjbGlwX3JlY3Q7CisgIEZYX0RXT1JEIHNpemUgPSBjbGlwX3JlY3QuV2lkdGgoKTsKKyAgaWYgKHNpemUgJiYgbV9EZXN0QnBwID4gKGludCkoSU5UX01BWCAvIHNpemUpKSB7CisgICAgcmV0dXJuOworICB9CisgIHNpemUgKj0gbV9EZXN0QnBwOworICBpZiAoc2l6ZSA+IElOVF9NQVggLSAzMSkgeworICAgIHJldHVybjsKKyAgfQorICBzaXplICs9IDMxOworICBzaXplID0gc2l6ZSAvIDMyICogNDsKKyAgbV9wRGVzdFNjYW5saW5lID0gRlhfVHJ5QWxsb2ModWludDhfdCwgc2l6ZSk7CisgIGlmIChtX3BEZXN0U2NhbmxpbmUgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfUmdiMzIpIHsKKyAgICBGWFNZU19tZW1zZXQobV9wRGVzdFNjYW5saW5lLCAyNTUsIHNpemUpOworICB9CisgIG1fSW50ZXJQaXRjaCA9IChtX0Rlc3RDbGlwLldpZHRoKCkgKiBtX0Rlc3RCcHAgKyAzMSkgLyAzMiAqIDQ7CisgIG1fRXh0cmFNYXNrUGl0Y2ggPSAobV9EZXN0Q2xpcC5XaWR0aCgpICogOCArIDMxKSAvIDMyICogNDsKKyAgbV9wSW50ZXJCdWYgPSBOVUxMOworICBtX3BTb3VyY2UgPSBwU3JjQml0bWFwOworICBtX1NyY1dpZHRoID0gcFNyY0JpdG1hcC0+R2V0V2lkdGgoKTsKKyAgbV9TcmNIZWlnaHQgPSBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgbV9TcmNQaXRjaCA9IChtX1NyY1dpZHRoICogbV9TcmNCcHAgKyAzMSkgLyAzMiAqIDQ7CisgIGlmICgoZmxhZ3MgJiBGWERJQl9OT1NNT09USCkgPT0gMCkgeworICAgIEZYX0JPT0wgYkludGVycG9sID0KKyAgICAgICAgZmxhZ3MgJiBGWERJQl9JTlRFUlBPTCB8fCBmbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0w7CisgICAgaWYgKCFiSW50ZXJwb2wgJiYgRlhTWVNfYWJzKGRlc3Rfd2lkdGgpICE9IDAgJiYKKyAgICAgICAgRlhTWVNfYWJzKGRlc3RfaGVpZ2h0KSA8CisgICAgICAgICAgICBtX1NyY1dpZHRoICogbV9TcmNIZWlnaHQgKiA4IC8gRlhTWVNfYWJzKGRlc3Rfd2lkdGgpKSB7CisgICAgICBmbGFncyA9IEZYRElCX0lOVEVSUE9MOwogICAgIH0KLSAgICBzaXplICo9IG1fRGVzdEJwcDsKLSAgICBpZiAoc2l6ZSA+IElOVF9NQVggLSAzMSkgewotICAgICAgICByZXR1cm47CisgICAgbV9GbGFncyA9IGZsYWdzOworICB9IGVsc2UgeworICAgIG1fRmxhZ3MgPSBGWERJQl9OT1NNT09USDsKKyAgICBpZiAoZmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSB7CisgICAgICBtX0ZsYWdzIHw9IEZYRElCX0RPV05TQU1QTEU7CiAgICAgfQotICAgIHNpemUgKz0gMzE7Ci0gICAgc2l6ZSA9IHNpemUgLyAzMiAqIDQ7Ci0gICAgbV9wRGVzdFNjYW5saW5lID0gRlhfVHJ5QWxsb2ModWludDhfdCwgc2l6ZSk7Ci0gICAgaWYgKG1fcERlc3RTY2FubGluZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX1JnYjMyKSB7Ci0gICAgICAgIEZYU1lTX21lbXNldChtX3BEZXN0U2NhbmxpbmUsIDI1NSwgc2l6ZSk7Ci0gICAgfQotICAgIG1fSW50ZXJQaXRjaCA9IChtX0Rlc3RDbGlwLldpZHRoKCkgKiBtX0Rlc3RCcHAgKyAzMSkgLyAzMiAqIDQ7Ci0gICAgbV9FeHRyYU1hc2tQaXRjaCA9IChtX0Rlc3RDbGlwLldpZHRoKCkgKiA4ICsgMzEpIC8gMzIgKiA0OwotICAgIG1fcEludGVyQnVmID0gTlVMTDsKLSAgICBtX3BTb3VyY2UgPSBwU3JjQml0bWFwOwotICAgIG1fU3JjV2lkdGggPSBwU3JjQml0bWFwLT5HZXRXaWR0aCgpOwotICAgIG1fU3JjSGVpZ2h0ID0gcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCk7Ci0gICAgbV9TcmNQaXRjaCA9IChtX1NyY1dpZHRoICogbV9TcmNCcHAgKyAzMSkgLyAzMiAqIDQ7Ci0gICAgaWYgKChmbGFncyAmIEZYRElCX05PU01PT1RIKSA9PSAwKSB7Ci0gICAgICAgIEZYX0JPT0wgYkludGVycG9sID0gZmxhZ3MgJiBGWERJQl9JTlRFUlBPTCB8fCBmbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0w7Ci0gICAgICAgIGlmICghYkludGVycG9sICYmIEZYU1lTX2FicyhkZXN0X3dpZHRoKSAhPSAwICYmIEZYU1lTX2FicyhkZXN0X2hlaWdodCkgPCBtX1NyY1dpZHRoICogbV9TcmNIZWlnaHQgKiA4IC8gRlhTWVNfYWJzKGRlc3Rfd2lkdGgpKSB7Ci0gICAgICAgICAgICBmbGFncyA9IEZYRElCX0lOVEVSUE9MOwotICAgICAgICB9Ci0gICAgICAgIG1fRmxhZ3MgPSBmbGFnczsKKyAgfQorICBkb3VibGUgc2NhbGVfeCA9IEZYU1lTX0RpdigoRlhfRkxPQVQpKG1fU3JjV2lkdGgpLCAoRlhfRkxPQVQpKG1fRGVzdFdpZHRoKSk7CisgIGRvdWJsZSBzY2FsZV95ID0gRlhTWVNfRGl2KChGWF9GTE9BVCkobV9TcmNIZWlnaHQpLCAoRlhfRkxPQVQpKG1fRGVzdEhlaWdodCkpOworICBkb3VibGUgYmFzZV94ID0gbV9EZXN0V2lkdGggPiAwID8gMC4wZiA6IChGWF9GTE9BVCkobV9EZXN0V2lkdGgpOworICBkb3VibGUgYmFzZV95ID0gbV9EZXN0SGVpZ2h0ID4gMCA/IDAuMGYgOiAoRlhfRkxPQVQpKG1fRGVzdEhlaWdodCk7CisgIGRvdWJsZSBzcmNfbGVmdCA9IEZYU1lTX011bChzY2FsZV94LCAoRlhfRkxPQVQpKGNsaXBfcmVjdC5sZWZ0KSArIGJhc2VfeCk7CisgIGRvdWJsZSBzcmNfcmlnaHQgPSBGWFNZU19NdWwoc2NhbGVfeCwgKEZYX0ZMT0FUKShjbGlwX3JlY3QucmlnaHQpICsgYmFzZV94KTsKKyAgZG91YmxlIHNyY190b3AgPSBGWFNZU19NdWwoc2NhbGVfeSwgKEZYX0ZMT0FUKShjbGlwX3JlY3QudG9wKSArIGJhc2VfeSk7CisgIGRvdWJsZSBzcmNfYm90dG9tID0gRlhTWVNfTXVsKHNjYWxlX3ksIChGWF9GTE9BVCkoY2xpcF9yZWN0LmJvdHRvbSkgKyBiYXNlX3kpOworICBpZiAoc3JjX2xlZnQgPiBzcmNfcmlnaHQpIHsKKyAgICBkb3VibGUgdGVtcCA9IHNyY19sZWZ0OworICAgIHNyY19sZWZ0ID0gc3JjX3JpZ2h0OworICAgIHNyY19yaWdodCA9IHRlbXA7CisgIH0KKyAgaWYgKHNyY190b3AgPiBzcmNfYm90dG9tKSB7CisgICAgZG91YmxlIHRlbXAgPSBzcmNfdG9wOworICAgIHNyY190b3AgPSBzcmNfYm90dG9tOworICAgIHNyY19ib3R0b20gPSB0ZW1wOworICB9CisgIG1fU3JjQ2xpcC5sZWZ0ID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX2xlZnQpOworICBtX1NyY0NsaXAucmlnaHQgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19yaWdodCk7CisgIG1fU3JjQ2xpcC50b3AgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfdG9wKTsKKyAgbV9TcmNDbGlwLmJvdHRvbSA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX2JvdHRvbSk7CisgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQpOworICBtX1NyY0NsaXAuSW50ZXJzZWN0KHNyY19yZWN0KTsKKyAgaWYgKG1fU3JjQnBwID09IDEpIHsKKyAgICBpZiAobV9EZXN0QnBwID09IDgpIHsKKyAgICAgIG1fVHJhbnNNZXRob2QgPSAxOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fRmxhZ3MgPSBGWERJQl9OT1NNT09USDsKLSAgICAgICAgaWYgKGZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgewotICAgICAgICAgICAgbV9GbGFncyB8PSBGWERJQl9ET1dOU0FNUExFOwotICAgICAgICB9CisgICAgICBtX1RyYW5zTWV0aG9kID0gMjsKICAgICB9Ci0gICAgZG91YmxlIHNjYWxlX3ggPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShtX1NyY1dpZHRoKSwgKEZYX0ZMT0FUKShtX0Rlc3RXaWR0aCkpOwotICAgIGRvdWJsZSBzY2FsZV95ID0gRlhTWVNfRGl2KChGWF9GTE9BVCkobV9TcmNIZWlnaHQpLCAoRlhfRkxPQVQpKG1fRGVzdEhlaWdodCkpOwotICAgIGRvdWJsZSBiYXNlX3ggPSBtX0Rlc3RXaWR0aCA+IDAgPyAwLjBmIDogKEZYX0ZMT0FUKShtX0Rlc3RXaWR0aCk7Ci0gICAgZG91YmxlIGJhc2VfeSA9IG1fRGVzdEhlaWdodCA+IDAgPyAwLjBmIDogKEZYX0ZMT0FUKShtX0Rlc3RIZWlnaHQpOwotICAgIGRvdWJsZSBzcmNfbGVmdCA9IEZYU1lTX011bChzY2FsZV94LCAoRlhfRkxPQVQpKGNsaXBfcmVjdC5sZWZ0KSArIGJhc2VfeCk7Ci0gICAgZG91YmxlIHNyY19yaWdodCA9IEZYU1lTX011bChzY2FsZV94LCAoRlhfRkxPQVQpKGNsaXBfcmVjdC5yaWdodCkgKyBiYXNlX3gpOwotICAgIGRvdWJsZSBzcmNfdG9wID0gRlhTWVNfTXVsKHNjYWxlX3ksIChGWF9GTE9BVCkoY2xpcF9yZWN0LnRvcCkgKyBiYXNlX3kpOwotICAgIGRvdWJsZSBzcmNfYm90dG9tID0gRlhTWVNfTXVsKHNjYWxlX3ksIChGWF9GTE9BVCkoY2xpcF9yZWN0LmJvdHRvbSkgKyBiYXNlX3kpOwotICAgIGlmIChzcmNfbGVmdCA+IHNyY19yaWdodCkgewotICAgICAgICBkb3VibGUgdGVtcCA9IHNyY19sZWZ0OwotICAgICAgICBzcmNfbGVmdCA9IHNyY19yaWdodDsKLSAgICAgICAgc3JjX3JpZ2h0ID0gdGVtcDsKLSAgICB9Ci0gICAgaWYgKHNyY190b3AgPiBzcmNfYm90dG9tKSB7Ci0gICAgICAgIGRvdWJsZSB0ZW1wID0gc3JjX3RvcDsKLSAgICAgICAgc3JjX3RvcCA9IHNyY19ib3R0b207Ci0gICAgICAgIHNyY19ib3R0b20gPSB0ZW1wOwotICAgIH0KLSAgICBtX1NyY0NsaXAubGVmdCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19sZWZ0KTsKLSAgICBtX1NyY0NsaXAucmlnaHQgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19yaWdodCk7Ci0gICAgbV9TcmNDbGlwLnRvcCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY190b3ApOwotICAgIG1fU3JjQ2xpcC5ib3R0b20gPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19ib3R0b20pOwotICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQpOwotICAgIG1fU3JjQ2xpcC5JbnRlcnNlY3Qoc3JjX3JlY3QpOwotICAgIGlmIChtX1NyY0JwcCA9PSAxKSB7Ci0gICAgICAgIGlmIChtX0Rlc3RCcHAgPT0gOCkgewotICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9TcmNCcHAgPT0gOCkgewotICAgICAgICBpZiAobV9EZXN0QnBwID09IDgpIHsKLSAgICAgICAgICAgIGlmICghbV9iSGFzQWxwaGEpIHsKLSAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIW1fYkhhc0FscGhhKSB7Ci0gICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA2OwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIH0gZWxzZSBpZiAobV9TcmNCcHAgPT0gOCkgeworICAgIGlmIChtX0Rlc3RCcHAgPT0gOCkgeworICAgICAgaWYgKCFtX2JIYXNBbHBoYSkgeworICAgICAgICBtX1RyYW5zTWV0aG9kID0gMzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fVHJhbnNNZXRob2QgPSA0OworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghbV9iSGFzQWxwaGEpIHsKLSAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA3OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDg7Ci0gICAgICAgIH0KKyAgICAgIGlmICghbV9iSGFzQWxwaGEpIHsKKyAgICAgICAgbV9UcmFuc01ldGhvZCA9IDU7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX1RyYW5zTWV0aG9kID0gNjsKKyAgICAgIH0KICAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFtX2JIYXNBbHBoYSkgeworICAgICAgbV9UcmFuc01ldGhvZCA9IDc7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fVHJhbnNNZXRob2QgPSA4OworICAgIH0KKyAgfQogfQotRlhfQk9PTCBDU3RyZXRjaEVuZ2luZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgd2hpbGUgKG1fU3RhdGUgPT0gMSkgewotICAgICAgICBpZiAoQ29udGludWVTdHJldGNoSG9yeihwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBtX1N0YXRlID0gMjsKLSAgICAgICAgU3RyZXRjaFZlcnQoKTsKK0ZYX0JPT0wgQ1N0cmV0Y2hFbmdpbmU6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIHdoaWxlIChtX1N0YXRlID09IDEpIHsKKyAgICBpZiAoQ29udGludWVTdHJldGNoSG9yeihwUGF1c2UpKSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9CisgICAgbV9TdGF0ZSA9IDI7CisgICAgU3RyZXRjaFZlcnQoKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitDU3RyZXRjaEVuZ2luZTo6fkNTdHJldGNoRW5naW5lKCkgeworICBpZiAobV9wRGVzdFNjYW5saW5lKSB7CisgICAgRlhfRnJlZShtX3BEZXN0U2NhbmxpbmUpOworICB9CisgIGlmIChtX3BJbnRlckJ1ZikgeworICAgIEZYX0ZyZWUobV9wSW50ZXJCdWYpOworICB9CisgIGlmIChtX3BFeHRyYUFscGhhQnVmKSB7CisgICAgRlhfRnJlZShtX3BFeHRyYUFscGhhQnVmKTsKKyAgfQorICBpZiAobV9wRGVzdE1hc2tTY2FubGluZSkgeworICAgIEZYX0ZyZWUobV9wRGVzdE1hc2tTY2FubGluZSk7CisgIH0KK30KK0ZYX0JPT0wgQ1N0cmV0Y2hFbmdpbmU6OlN0YXJ0U3RyZXRjaEhvcnooKSB7CisgIGlmIChtX0Rlc3RXaWR0aCA9PSAwIHx8IG1fcERlc3RTY2FubGluZSA9PSBOVUxMIHx8CisgICAgICBtX1NyY0NsaXAuSGVpZ2h0KCkgPiAoaW50KSgoMVUgPDwgMjkpIC8gbV9JbnRlclBpdGNoKSB8fAorICAgICAgbV9TcmNDbGlwLkhlaWdodCgpID09IDApIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wSW50ZXJCdWYgPSBGWF9UcnlBbGxvYyh1bnNpZ25lZCBjaGFyLCBtX1NyY0NsaXAuSGVpZ2h0KCkgKiBtX0ludGVyUGl0Y2gpOworICBpZiAobV9wSW50ZXJCdWYgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9wU291cmNlICYmIG1fYkhhc0FscGhhICYmIG1fcFNvdXJjZS0+bV9wQWxwaGFNYXNrKSB7CisgICAgbV9wRXh0cmFBbHBoYUJ1ZiA9CisgICAgICAgIEZYX0FsbG9jMkQodW5zaWduZWQgY2hhciwgbV9TcmNDbGlwLkhlaWdodCgpLCBtX0V4dHJhTWFza1BpdGNoKTsKKyAgICBGWF9EV09SRCBzaXplID0gKG1fRGVzdENsaXAuV2lkdGgoKSAqIDggKyAzMSkgLyAzMiAqIDQ7CisgICAgbV9wRGVzdE1hc2tTY2FubGluZSA9IEZYX1RyeUFsbG9jKHVuc2lnbmVkIGNoYXIsIHNpemUpOworICAgIGlmICghbV9wRGVzdE1hc2tTY2FubGluZSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBtX1dlaWdodFRhYmxlLkNhbGMobV9EZXN0V2lkdGgsIG1fRGVzdENsaXAubGVmdCwgbV9EZXN0Q2xpcC5yaWdodCwgbV9TcmNXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIG1fU3JjQ2xpcC5sZWZ0LCBtX1NyY0NsaXAucmlnaHQsIG1fRmxhZ3MpOworICBpZiAobV9XZWlnaHRUYWJsZS5tX3BXZWlnaHRUYWJsZXMgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX0N1clJvdyA9IG1fU3JjQ2xpcC50b3A7CisgIG1fU3RhdGUgPSAxOworICByZXR1cm4gVFJVRTsKIH0KLUNTdHJldGNoRW5naW5lOjp+Q1N0cmV0Y2hFbmdpbmUoKQotewotICAgIGlmIChtX3BEZXN0U2NhbmxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BEZXN0U2NhbmxpbmUpOwotICAgIH0KLSAgICBpZiAobV9wSW50ZXJCdWYpIHsKLSAgICAgICAgRlhfRnJlZShtX3BJbnRlckJ1Zik7Ci0gICAgfQotICAgIGlmIChtX3BFeHRyYUFscGhhQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRXh0cmFBbHBoYUJ1Zik7Ci0gICAgfQotICAgIGlmIChtX3BEZXN0TWFza1NjYW5saW5lKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRGVzdE1hc2tTY2FubGluZSk7Ci0gICAgfQotfQotRlhfQk9PTCBDU3RyZXRjaEVuZ2luZTo6U3RhcnRTdHJldGNoSG9yeigpCi17Ci0gICAgaWYgKG1fRGVzdFdpZHRoID09IDAgfHwgbV9wRGVzdFNjYW5saW5lID09IE5VTEwgfHwgbV9TcmNDbGlwLkhlaWdodCgpID4gKGludCkoKDFVIDw8IDI5KSAvIG1fSW50ZXJQaXRjaCkgfHwgbV9TcmNDbGlwLkhlaWdodCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BJbnRlckJ1ZiA9IEZYX1RyeUFsbG9jKHVuc2lnbmVkIGNoYXIsIG1fU3JjQ2xpcC5IZWlnaHQoKSAqIG1fSW50ZXJQaXRjaCk7Ci0gICAgaWYgKG1fcEludGVyQnVmID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wU291cmNlICYmIG1fYkhhc0FscGhhICYmIG1fcFNvdXJjZS0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIG1fcEV4dHJhQWxwaGFCdWYgPSBGWF9BbGxvYzJEKHVuc2lnbmVkIGNoYXIsIG1fU3JjQ2xpcC5IZWlnaHQoKSwgbV9FeHRyYU1hc2tQaXRjaCk7Ci0gICAgICAgIEZYX0RXT1JEIHNpemUgPSAobV9EZXN0Q2xpcC5XaWR0aCgpICogOCArIDMxKSAvIDMyICogNDsKLSAgICAgICAgbV9wRGVzdE1hc2tTY2FubGluZSA9IEZYX1RyeUFsbG9jKHVuc2lnbmVkIGNoYXIsIHNpemUpOwotICAgICAgICBpZiAoIW1fcERlc3RNYXNrU2NhbmxpbmUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX1dlaWdodFRhYmxlLkNhbGMobV9EZXN0V2lkdGgsIG1fRGVzdENsaXAubGVmdCwgbV9EZXN0Q2xpcC5yaWdodCwgbV9TcmNXaWR0aCwgbV9TcmNDbGlwLmxlZnQsIG1fU3JjQ2xpcC5yaWdodCwgbV9GbGFncyk7Ci0gICAgaWYgKG1fV2VpZ2h0VGFibGUubV9wV2VpZ2h0VGFibGVzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX0N1clJvdyA9IG1fU3JjQ2xpcC50b3A7Ci0gICAgbV9TdGF0ZSA9IDE7CisjZGVmaW5lIEZYX1NUUkVDSF9QQVVTRV9ST1dTIDEwCitGWF9CT09MIENTdHJldGNoRW5naW5lOjpDb250aW51ZVN0cmV0Y2hIb3J6KElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGlmICghbV9EZXN0V2lkdGgpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobV9wU291cmNlLT5Ta2lwVG9TY2FubGluZShtX0N1clJvdywgcFBhdXNlKSkgewogICAgIHJldHVybiBUUlVFOwotfQotI2RlZmluZSBGWF9TVFJFQ0hfUEFVU0VfUk9XUwkxMAotRlhfQk9PTCBDU3RyZXRjaEVuZ2luZTo6Q29udGludWVTdHJldGNoSG9yeihJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZiAoIW1fRGVzdFdpZHRoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobV9wU291cmNlLT5Ta2lwVG9TY2FubGluZShtX0N1clJvdywgcFBhdXNlKSkgeworICB9CisgIGludCBCcHAgPSBtX0Rlc3RCcHAgLyA4OworICBpbnQgcm93c190b19nbyA9IEZYX1NUUkVDSF9QQVVTRV9ST1dTOworICBmb3IgKDsgbV9DdXJSb3cgPCBtX1NyY0NsaXAuYm90dG9tOyBtX0N1clJvdysrKSB7CisgICAgaWYgKHJvd3NfdG9fZ28gPT0gMCkgeworICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgICByb3dzX3RvX2dvID0gRlhfU1RSRUNIX1BBVVNFX1JPV1M7CiAgICAgfQotICAgIGludCBCcHAgPSBtX0Rlc3RCcHAgLyA4OwotICAgIGludCByb3dzX3RvX2dvID0gRlhfU1RSRUNIX1BBVVNFX1JPV1M7Ci0gICAgZm9yICg7IG1fQ3VyUm93IDwgbV9TcmNDbGlwLmJvdHRvbTsgbV9DdXJSb3cgKyspIHsKLSAgICAgICAgaWYgKHJvd3NfdG9fZ28gPT0gMCkgewotICAgICAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IG1fcFNvdXJjZS0+R2V0U2NhbmxpbmUobV9DdXJSb3cpOworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgIG1fcEludGVyQnVmICsgKG1fQ3VyUm93IC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2g7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW5fbWFzayA9IE5VTEw7CisgICAgdWludDhfdCogZGVzdF9zY2FuX21hc2sgPSBOVUxMOworICAgIGlmIChtX3BFeHRyYUFscGhhQnVmKSB7CisgICAgICBzcmNfc2Nhbl9tYXNrID0gbV9wU291cmNlLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKG1fQ3VyUm93KTsKKyAgICAgIGRlc3Rfc2Nhbl9tYXNrID0KKyAgICAgICAgICBtX3BFeHRyYUFscGhhQnVmICsgKG1fQ3VyUm93IC0gbV9TcmNDbGlwLnRvcCkgKiBtX0V4dHJhTWFza1BpdGNoOworICAgIH0KKyAgICBzd2l0Y2ggKG1fVHJhbnNNZXRob2QpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgMjogeworICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCsrKSB7CisgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPSBtX1dlaWdodFRhYmxlLkdldFBpeGVsV2VpZ2h0KGNvbCk7CisgICAgICAgICAgaW50IGRlc3RfYSA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7CisgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQorICAgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07CisgICAgICAgICAgICBpZiAoc3JjX3NjYW5baiAvIDhdICYgKDEgPDwgKDcgLSBqICUgOCkpKSB7CisgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiAyNTU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3dzX3RvX2dvID0gRlhfU1RSRUNIX1BBVVNFX1JPV1M7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9hOworICAgICAgICAgIH0KKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9hID4+IDE2KTsKICAgICAgICAgfQotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IG1fcFNvdXJjZS0+R2V0U2NhbmxpbmUobV9DdXJSb3cpOwotICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BJbnRlckJ1ZiArIChtX0N1clJvdyAtIG1fU3JjQ2xpcC50b3ApICogbV9JbnRlclBpdGNoOwotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2Nhbl9tYXNrID0gTlVMTDsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuX21hc2sgPSBOVUxMOwotICAgICAgICBpZiAobV9wRXh0cmFBbHBoYUJ1ZikgewotICAgICAgICAgICAgc3JjX3NjYW5fbWFzayA9IG1fcFNvdXJjZS0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShtX0N1clJvdyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5fbWFzayA9IG1fcEV4dHJhQWxwaGFCdWYgKyAobV9DdXJSb3cgLSBtX1NyY0NsaXAudG9wKSAqIG1fRXh0cmFNYXNrUGl0Y2g7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAzOiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKKyAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKKyAgICAgICAgICBpbnQgZGVzdF9hID0gMDsKKyAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKKyAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9CisgICAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKKyAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiBzcmNfc2NhbltqXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2E7CisgICAgICAgICAgfQorICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X2EgPj4gMTYpOwogICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAobV9UcmFuc01ldGhvZCkgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY2FzZSAyOiB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2EgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3NjYW5baiAvIDhdICYgKDEgPDwgKDcgLSBqICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9hOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3RfYSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAzOiB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2EgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bal07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2E7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9hID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDQ6IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfYSA9IDAsIGRlc3RfciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodCA9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuX21hc2tbal0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yICs9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuW2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3IgPSBkZXN0X3IgPCAwID8gMCA6IGRlc3RfciA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiA2NTUzNiA/IDY1NTM2IDogZGVzdF9hOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3RfciA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuX21hc2srKyA9ICh1aW50OF90KSgoZGVzdF9hICogMjU1KSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSA1OiB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ2JfY215ayA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdClhcmdiX2NteWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfcl95ID0gZGVzdF9yX3kgPCAwID8gMCA6IGRlc3Rfcl95ID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3Rfcl95OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZ19tID0gZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYl9jID0gZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3RfYl9jID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X2dfbSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9yX3kgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgNjogewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPSBtX1dlaWdodFRhYmxlLkdldFBpeGVsV2VpZ2h0KGNvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9hID0gMCwgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ID0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5fbWFza1tqXSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ2JfY215ayA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpYXJnYl9jbXlrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYl9jID0gZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZ19tID0gZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfcl95ID0gZGVzdF9yX3kgPCAwID8gMCA6IGRlc3Rfcl95ID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3Rfcl95OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYSA9IGRlc3RfYSA8IDAgPyAwIDogZGVzdF9hID4gNjU1MzYgPyA2NTUzNiA6IGRlc3RfYTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X2JfYyA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9nX20gPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3Rfcl95ID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW5fbWFzaysrID0gKHVpbnQ4X3QpKChkZXN0X2EgKiAyNTUpID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDc6IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfcl95ID0gMCwgZGVzdF9nX20gPSAwLCBkZXN0X2JfYyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2JfYyA9IGRlc3RfYl9jIDwgMCA/IDAgOiBkZXN0X2JfYyA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2JfYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2dfbSA9IGRlc3RfZ19tIDwgMCA/IDAgOiBkZXN0X2dfbSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2dfbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JfeSA9IGRlc3Rfcl95IDwgMCA/IDAgOiBkZXN0X3JfeSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X3JfeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KSgoZGVzdF9iX2MpID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KSgoZGVzdF9nX20pID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KSgoZGVzdF9yX3kpID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPSBtX1dlaWdodFRhYmxlLkdldFBpeGVsV2VpZ2h0KGNvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9hID0gMCwgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHQgPSBwaXhlbF93ZWlnaHQgKiBzcmNfcGl4ZWxbM10gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ID0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5fbWFza1tqXSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JfeSA9IGRlc3Rfcl95IDwgMCA/IDAgOiBkZXN0X3JfeSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X3JfeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2dfbSA9IGRlc3RfZ19tIDwgMCA/IDAgOiBkZXN0X2dfbSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2dfbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2JfYyA9IGRlc3RfYl9jIDwgMCA/IDAgOiBkZXN0X2JfYyA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2JfYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDY1NTM2ID8gNjU1MzYgOiBkZXN0X2E7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoKGRlc3RfYl9jKSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoKGRlc3RfZ19tKSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoKGRlc3Rfcl95KSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gKHVpbnQ4X3QpKChkZXN0X2EgKiAyNTUpID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXN0X3NjYW5fbWFzaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW5fbWFzaysrID0gKHVpbnQ4X3QpKChkZXN0X2EgKiAyNTUpID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgeworICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOworICAgICAgICAgIGludCBkZXN0X2EgPSAwLCBkZXN0X3IgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0KKyAgICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOworICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ID0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5fbWFza1tqXSAvIDI1NTsKKyAgICAgICAgICAgIGRlc3RfciArPSBwaXhlbF93ZWlnaHQgKiBzcmNfc2NhbltqXTsKKyAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9yID0gZGVzdF9yIDwgMCA/IDAgOiBkZXN0X3IgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yOworICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiA2NTUzNiA/IDY1NTM2IDogZGVzdF9hOworICAgICAgICAgIH0KKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9yID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuX21hc2srKyA9ICh1aW50OF90KSgoZGVzdF9hICogMjU1KSA+PiAxNik7CiAgICAgICAgIH0KLSAgICAgICAgcm93c190b19nbyAtLTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDU6IHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgeworICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOworICAgICAgICAgIGludCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0KKyAgICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdiX2NteWsgPSBtX3BTcmNQYWxldHRlW3NyY19zY2FuW2pdXTsKKyAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiKSB7CisgICAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gMTYpOworICAgICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDgpOworICAgICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdClhcmdiX2NteWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDI0KTsKKyAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiAxNik7CisgICAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9yX3kgPQorICAgICAgICAgICAgICAgIGRlc3Rfcl95IDwgMCA/IDAgOiBkZXN0X3JfeSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X3JfeTsKKyAgICAgICAgICAgIGRlc3RfZ19tID0KKyAgICAgICAgICAgICAgICBkZXN0X2dfbSA8IDAgPyAwIDogZGVzdF9nX20gPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9nX207CisgICAgICAgICAgICBkZXN0X2JfYyA9CisgICAgICAgICAgICAgICAgZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOworICAgICAgICAgIH0KKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9iX2MgPj4gMTYpOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X2dfbSA+PiAxNik7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3Rfcl95ID4+IDE2KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgNjogeworICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCsrKSB7CisgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPSBtX1dlaWdodFRhYmxlLkdldFBpeGVsV2VpZ2h0KGNvbCk7CisgICAgICAgICAgaW50IGRlc3RfYSA9IDAsIGRlc3Rfcl95ID0gMCwgZGVzdF9nX20gPSAwLCBkZXN0X2JfYyA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7CisgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQorICAgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07CisgICAgICAgICAgICBwaXhlbF93ZWlnaHQgPSBwaXhlbF93ZWlnaHQgKiBzcmNfc2Nhbl9tYXNrW2pdIC8gMjU1OworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdiX2NteWsgPSBtX3BTcmNQYWxldHRlW3NyY19zY2FuW2pdXTsKKyAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiYSkgeworICAgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDE2KTsKKyAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiA4KTsKKyAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpYXJnYl9jbXlrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiAyNCk7CisgICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gMTYpOworICAgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgICAgICBkZXN0X2JfYyA9CisgICAgICAgICAgICAgICAgZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOworICAgICAgICAgICAgZGVzdF9nX20gPQorICAgICAgICAgICAgICAgIGRlc3RfZ19tIDwgMCA/IDAgOiBkZXN0X2dfbSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2dfbTsKKyAgICAgICAgICAgIGRlc3Rfcl95ID0KKyAgICAgICAgICAgICAgICBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7CisgICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDY1NTM2ID8gNjU1MzYgOiBkZXN0X2E7CisgICAgICAgICAgfQorICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X2JfYyA+PiAxNik7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3RfZ19tID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9yX3kgPj4gMTYpOworICAgICAgICAgICpkZXN0X3NjYW5fbWFzaysrID0gKHVpbnQ4X3QpKChkZXN0X2EgKiAyNTUpID4+IDE2KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgNzogeworICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCsrKSB7CisgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPSBtX1dlaWdodFRhYmxlLkdldFBpeGVsV2VpZ2h0KGNvbCk7CisgICAgICAgICAgaW50IGRlc3Rfcl95ID0gMCwgZGVzdF9nX20gPSAwLCBkZXN0X2JfYyA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7CisgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQorICAgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWwgPSBzcmNfc2NhbiArIGogKiBCcHA7CisgICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKKyAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOworICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKKyAgICAgICAgICAgIGRlc3RfYl9jID0KKyAgICAgICAgICAgICAgICBkZXN0X2JfYyA8IDAgPyAwIDogZGVzdF9iX2MgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9iX2M7CisgICAgICAgICAgICBkZXN0X2dfbSA9CisgICAgICAgICAgICAgICAgZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOworICAgICAgICAgICAgZGVzdF9yX3kgPQorICAgICAgICAgICAgICAgIGRlc3Rfcl95IDwgMCA/IDAgOiBkZXN0X3JfeSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X3JfeTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKChkZXN0X2JfYykgPj4gMTYpOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KSgoZGVzdF9nX20pID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoKGRlc3Rfcl95KSA+PiAxNik7CisgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDg6IHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgeworICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOworICAgICAgICAgIGludCBkZXN0X2EgPSAwLCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0KKyAgICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOworICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogQnBwOworICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7CisgICAgICAgICAgICAgIHBpeGVsX3dlaWdodCA9IHBpeGVsX3dlaWdodCAqIHNyY19waXhlbFszXSAvIDI1NTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHBpeGVsX3dlaWdodCA9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuX21hc2tbal0gLyAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKKyAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOworICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOworICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgICAgICBkZXN0X3JfeSA9CisgICAgICAgICAgICAgICAgZGVzdF9yX3kgPCAwID8gMCA6IGRlc3Rfcl95ID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3Rfcl95OworICAgICAgICAgICAgZGVzdF9nX20gPQorICAgICAgICAgICAgICAgIGRlc3RfZ19tIDwgMCA/IDAgOiBkZXN0X2dfbSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2dfbTsKKyAgICAgICAgICAgIGRlc3RfYl9jID0KKyAgICAgICAgICAgICAgICBkZXN0X2JfYyA8IDAgPyAwIDogZGVzdF9iX2MgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9iX2M7CisgICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDY1NTM2ID8gNjU1MzYgOiBkZXN0X2E7CisgICAgICAgICAgfQorICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KSgoZGVzdF9iX2MpID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoKGRlc3RfZ19tKSA+PiAxNik7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKChkZXN0X3JfeSkgPj4gMTYpOworICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICh1aW50OF90KSgoZGVzdF9hICogMjU1KSA+PiAxNik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChkZXN0X3NjYW5fbWFzaykgeworICAgICAgICAgICAgKmRlc3Rfc2Nhbl9tYXNrKysgPSAodWludDhfdCkoKGRlc3RfYSAqIDI1NSkgPj4gMTYpOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJvd3NfdG9fZ28tLTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci12b2lkIENTdHJldGNoRW5naW5lOjpTdHJldGNoVmVydCgpCi17Ci0gICAgaWYgKG1fRGVzdEhlaWdodCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1dlaWdodFRhYmxlIHRhYmxlOwotICAgIHRhYmxlLkNhbGMobV9EZXN0SGVpZ2h0LCBtX0Rlc3RDbGlwLnRvcCwgbV9EZXN0Q2xpcC5ib3R0b20sIG1fU3JjSGVpZ2h0LCBtX1NyY0NsaXAudG9wLCBtX1NyY0NsaXAuYm90dG9tLCBtX0ZsYWdzKTsKLSAgICBpZiAodGFibGUubV9wV2VpZ2h0VGFibGVzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgRGVzdEJwcCA9IG1fRGVzdEJwcCAvIDg7Ci0gICAgZm9yIChpbnQgcm93ID0gbV9EZXN0Q2xpcC50b3A7IHJvdyA8IG1fRGVzdENsaXAuYm90dG9tOyByb3cgKyspIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciogZGVzdF9zY2FuID0gbV9wRGVzdFNjYW5saW5lOwotICAgICAgICB1bnNpZ25lZCBjaGFyKiBkZXN0X3NhY25fbWFzayA9IG1fcERlc3RNYXNrU2NhbmxpbmU7Ci0gICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gdGFibGUuR2V0UGl4ZWxXZWlnaHQocm93KTsKLSAgICAgICAgc3dpdGNoKG1fVHJhbnNNZXRob2QpIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGNhc2UgMzogewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogc3JjX3NjYW4gPSBtX3BJbnRlckJ1ZiArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpICogRGVzdEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2EgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bKGogLSBtX1NyY0NsaXAudG9wKSAqIG1fSW50ZXJQaXRjaF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2E7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gKHVpbnQ4X3QpKGRlc3RfYSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDQ6IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuID0gbV9wSW50ZXJCdWYgKyAoY29sIC0gbV9EZXN0Q2xpcC5sZWZ0KSAqIERlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2Nhbl9tYXNrID0gbV9wRXh0cmFBbHBoYUJ1ZiArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfYSA9IDAsIGRlc3RfayA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfayArPSBwaXhlbF93ZWlnaHQgKiBzcmNfc2NhblsoaiAtIG1fU3JjQ2xpcC50b3ApICogbV9JbnRlclBpdGNoXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5fbWFza1soaiAtIG1fU3JjQ2xpcC50b3ApICogbV9FeHRyYU1hc2tQaXRjaF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2sgPSBkZXN0X2sgPCAwID8gMCA6IGRlc3RfayA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9hOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICh1aW50OF90KShkZXN0X2sgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zYWNuX21hc2srKyA9ICh1aW50OF90KShkZXN0X2EgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGNhc2UgNzogewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogc3JjX3NjYW4gPSBtX3BJbnRlckJ1ZiArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpICogRGVzdEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWwgPSBzcmNfc2NhbiArIChqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yX3kgPSBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9nX20gPSBkZXN0X2dfbSA8IDAgPyAwIDogZGVzdF9nX20gPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9nX207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgPSBkZXN0X2JfYyA8IDAgPyAwIDogZGVzdF9iX2MgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9iX2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSAodWludDhfdCkoKGRlc3RfYl9jKSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSAodWludDhfdCkoKGRlc3RfZ19tKSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSAodWludDhfdCkoKGRlc3Rfcl95KSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuID0gbV9wSW50ZXJCdWYgKyAoY29sIC0gbV9EZXN0Q2xpcC5sZWZ0KSAqIERlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2Nhbl9tYXNrID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgIT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuX21hc2sgPSBtX3BFeHRyYUFscGhhQnVmICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9hID0gMCwgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyAoaiAtIG1fU3JjQ2xpcC50b3ApICogbV9JbnRlclBpdGNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX3YgPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19zY2FuX21hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza192ID0gc3JjX3NjYW5fbWFza1soaiAtIG1fU3JjQ2xpcC50b3ApICogbV9FeHRyYU1hc2tQaXRjaF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodCAqICgqKHNyY19waXhlbCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICogbWFza192OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfcl95ID0gZGVzdF9yX3kgPCAwID8gMCA6IGRlc3Rfcl95ID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3Rfcl95OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZ19tID0gZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYl9jID0gZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYSA9IGRlc3RfYSA8IDAgPyAwIDogZGVzdF9hID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXN0X2EpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgciA9ICgoRlhfRFdPUkQpZGVzdF9yX3kpICogMjU1IC8gZGVzdF9hOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnID0gKChGWF9EV09SRClkZXN0X2dfbSkgKiAyNTUgLyBkZXN0X2E7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGIgPSAoKEZYX0RXT1JEKWRlc3RfYl9jKSAqIDI1NSAvIGRlc3RfYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBiID4gMjU1ID8gMjU1IDogYiA8IDAgPyAwIDogYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBnID4gMjU1ID8gMjU1IDogZyA8IDAgPyAwIDogZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSByID4gMjU1ID8gMjU1IDogciA8IDAgPyAwIDogcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9ICh1aW50OF90KSgoZGVzdF9hKSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NhY25fbWFzayA9ICh1aW50OF90KSgoZGVzdF9hKSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXN0X3NhY25fbWFzaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2Fjbl9tYXNrKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQordm9pZCBDU3RyZXRjaEVuZ2luZTo6U3RyZXRjaFZlcnQoKSB7CisgIGlmIChtX0Rlc3RIZWlnaHQgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBDV2VpZ2h0VGFibGUgdGFibGU7CisgIHRhYmxlLkNhbGMobV9EZXN0SGVpZ2h0LCBtX0Rlc3RDbGlwLnRvcCwgbV9EZXN0Q2xpcC5ib3R0b20sIG1fU3JjSGVpZ2h0LAorICAgICAgICAgICAgIG1fU3JjQ2xpcC50b3AsIG1fU3JjQ2xpcC5ib3R0b20sIG1fRmxhZ3MpOworICBpZiAodGFibGUubV9wV2VpZ2h0VGFibGVzID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IERlc3RCcHAgPSBtX0Rlc3RCcHAgLyA4OworICBmb3IgKGludCByb3cgPSBtX0Rlc3RDbGlwLnRvcDsgcm93IDwgbV9EZXN0Q2xpcC5ib3R0b207IHJvdysrKSB7CisgICAgdW5zaWduZWQgY2hhciogZGVzdF9zY2FuID0gbV9wRGVzdFNjYW5saW5lOworICAgIHVuc2lnbmVkIGNoYXIqIGRlc3Rfc2Fjbl9tYXNrID0gbV9wRGVzdE1hc2tTY2FubGluZTsKKyAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IHRhYmxlLkdldFBpeGVsV2VpZ2h0KHJvdyk7CisgICAgc3dpdGNoIChtX1RyYW5zTWV0aG9kKSB7CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDI6CisgICAgICBjYXNlIDM6IHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgeworICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuID0KKyAgICAgICAgICAgICAgbV9wSW50ZXJCdWYgKyAoY29sIC0gbV9EZXN0Q2xpcC5sZWZ0KSAqIERlc3RCcHA7CisgICAgICAgICAgaW50IGRlc3RfYSA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7CisgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQorICAgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07CisgICAgICAgICAgICBkZXN0X2EgKz0KKyAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHQgKiBzcmNfc2NhblsoaiAtIG1fU3JjQ2xpcC50b3ApICogbV9JbnRlclBpdGNoXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2E7CisgICAgICAgICAgfQorICAgICAgICAgICpkZXN0X3NjYW4gPSAodWludDhfdCkoZGVzdF9hID4+IDE2KTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKICAgICAgICAgfQotICAgICAgICBtX3BEZXN0Qml0bWFwLT5Db21wb3NlU2NhbmxpbmUocm93IC0gbV9EZXN0Q2xpcC50b3AsIG1fcERlc3RTY2FubGluZSwgbV9wRGVzdE1hc2tTY2FubGluZSk7Ci0gICAgfQotfQotQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDRlhfSW1hZ2VTdHJldGNoZXIoKQotewotICAgIG1fcFNjYW5saW5lID0gTlVMTDsKLSAgICBtX3BTdHJldGNoRW5naW5lID0gTlVMTDsKLSAgICBtX3BNYXNrU2NhbmxpbmUgPSBOVUxMOwotfQotQ0ZYX0ltYWdlU3RyZXRjaGVyOjp+Q0ZYX0ltYWdlU3RyZXRjaGVyKCkKLXsKLSAgICBpZiAobV9wU2NhbmxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTY2FubGluZSk7Ci0gICAgfQotICAgIGRlbGV0ZSBtX3BTdHJldGNoRW5naW5lOwotICAgIGlmIChtX3BNYXNrU2NhbmxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BNYXNrU2NhbmxpbmUpOwotICAgIH0KLX0KLUZYRElCX0Zvcm1hdCBfR2V0U3RyZXRjaGVkRm9ybWF0KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpCi17Ci0gICAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IHBTcmMtPkdldEZvcm1hdCgpOwotICAgIGlmIChmb3JtYXQgPT0gRlhESUJfMWJwcE1hc2spIHsKLSAgICAgICAgZm9ybWF0ID0gRlhESUJfOGJwcE1hc2s7Ci0gICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gRlhESUJfMWJwcFJnYikgewotICAgICAgICBmb3JtYXQgPSBGWERJQl84YnBwUmdiOwotICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEZYRElCXzhicHBSZ2IpIHsKLSAgICAgICAgaWYgKHBTcmMtPkdldFBhbGV0dGUoKSkgewotICAgICAgICAgICAgZm9ybWF0ID0gRlhESUJfUmdiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgNDogeworICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCsrKSB7CisgICAgICAgICAgdW5zaWduZWQgY2hhciogc3JjX3NjYW4gPQorICAgICAgICAgICAgICBtX3BJbnRlckJ1ZiArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpICogRGVzdEJwcDsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2Nhbl9tYXNrID0KKyAgICAgICAgICAgICAgbV9wRXh0cmFBbHBoYUJ1ZiArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpOworICAgICAgICAgIGludCBkZXN0X2EgPSAwLCBkZXN0X2sgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0KKyAgICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOworICAgICAgICAgICAgZGVzdF9rICs9CisgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bKGogLSBtX1NyY0NsaXAudG9wKSAqIG1fSW50ZXJQaXRjaF07CisgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICoKKyAgICAgICAgICAgICAgICAgICAgICBzcmNfc2Nhbl9tYXNrWyhqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0V4dHJhTWFza1BpdGNoXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgICAgICBkZXN0X2sgPSBkZXN0X2sgPCAwID8gMCA6IGRlc3RfayA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2s7CisgICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2E7CisgICAgICAgICAgfQorICAgICAgICAgICpkZXN0X3NjYW4gPSAodWludDhfdCkoZGVzdF9rID4+IDE2KTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKKyAgICAgICAgICAqZGVzdF9zYWNuX21hc2srKyA9ICh1aW50OF90KShkZXN0X2EgPj4gMTYpOwogICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA1OgorICAgICAgY2FzZSA3OiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2NhbiA9CisgICAgICAgICAgICAgIG1fcEludGVyQnVmICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCkgKiBEZXN0QnBwOworICAgICAgICAgIGludCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0KKyAgICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOworICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0KKyAgICAgICAgICAgICAgICBzcmNfc2NhbiArIChqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2g7CisgICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKKyAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOworICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKKyAgICAgICAgICAgIGRlc3Rfcl95ID0KKyAgICAgICAgICAgICAgICBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7CisgICAgICAgICAgICBkZXN0X2dfbSA9CisgICAgICAgICAgICAgICAgZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOworICAgICAgICAgICAgZGVzdF9iX2MgPQorICAgICAgICAgICAgICAgIGRlc3RfYl9jIDwgMCA/IDAgOiBkZXN0X2JfYyA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2JfYzsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuWzBdID0gKHVpbnQ4X3QpKChkZXN0X2JfYykgPj4gMTYpOworICAgICAgICAgIGRlc3Rfc2NhblsxXSA9ICh1aW50OF90KSgoZGVzdF9nX20pID4+IDE2KTsKKyAgICAgICAgICBkZXN0X3NjYW5bMl0gPSAodWludDhfdCkoKGRlc3Rfcl95KSA+PiAxNik7CisgICAgICAgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDY6CisgICAgICBjYXNlIDg6IHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgeworICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuID0KKyAgICAgICAgICAgICAgbV9wSW50ZXJCdWYgKyAoY29sIC0gbV9EZXN0Q2xpcC5sZWZ0KSAqIERlc3RCcHA7CisgICAgICAgICAgdW5zaWduZWQgY2hhciogc3JjX3NjYW5fbWFzayA9IE5VTEw7CisgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCAhPSBGWERJQl9BcmdiKSB7CisgICAgICAgICAgICBzcmNfc2Nhbl9tYXNrID0gbV9wRXh0cmFBbHBoYUJ1ZiArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpOworICAgICAgICAgIH0KKyAgICAgICAgICBpbnQgZGVzdF9hID0gMCwgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKKyAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKKyAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9CisgICAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9CisgICAgICAgICAgICAgICAgc3JjX3NjYW4gKyAoaiAtIG1fU3JjQ2xpcC50b3ApICogbV9JbnRlclBpdGNoOworICAgICAgICAgICAgaW50IG1hc2tfdiA9IDI1NTsKKyAgICAgICAgICAgIGlmIChzcmNfc2Nhbl9tYXNrKSB7CisgICAgICAgICAgICAgIG1hc2tfdiA9IHNyY19zY2FuX21hc2tbKGogLSBtX1NyY0NsaXAudG9wKSAqIG1fRXh0cmFNYXNrUGl0Y2hdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7CisgICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKKyAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsKKyAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICogKCooc3JjX3BpeGVsICsgMSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodCAqIG1hc2tfdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgICAgICBkZXN0X3JfeSA9CisgICAgICAgICAgICAgICAgZGVzdF9yX3kgPCAwID8gMCA6IGRlc3Rfcl95ID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3Rfcl95OworICAgICAgICAgICAgZGVzdF9nX20gPQorICAgICAgICAgICAgICAgIGRlc3RfZ19tIDwgMCA/IDAgOiBkZXN0X2dfbSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2dfbTsKKyAgICAgICAgICAgIGRlc3RfYl9jID0KKyAgICAgICAgICAgICAgICBkZXN0X2JfYyA8IDAgPyAwIDogZGVzdF9iX2MgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9iX2M7CisgICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2E7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChkZXN0X2EpIHsKKyAgICAgICAgICAgIGludCByID0gKChGWF9EV09SRClkZXN0X3JfeSkgKiAyNTUgLyBkZXN0X2E7CisgICAgICAgICAgICBpbnQgZyA9ICgoRlhfRFdPUkQpZGVzdF9nX20pICogMjU1IC8gZGVzdF9hOworICAgICAgICAgICAgaW50IGIgPSAoKEZYX0RXT1JEKWRlc3RfYl9jKSAqIDI1NSAvIGRlc3RfYTsKKyAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IGIgPiAyNTUgPyAyNTUgOiBiIDwgMCA/IDAgOiBiOworICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gZyA+IDI1NSA/IDI1NSA6IGcgPCAwID8gMCA6IGc7CisgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSByID4gMjU1ID8gMjU1IDogciA8IDAgPyAwIDogcjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7CisgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAodWludDhfdCkoKGRlc3RfYSkgPj4gMTYpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdF9zYWNuX21hc2sgPSAodWludDhfdCkoKGRlc3RfYSkgPj4gMTYpOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKKyAgICAgICAgICBpZiAoZGVzdF9zYWNuX21hc2spIHsKKyAgICAgICAgICAgIGRlc3Rfc2Fjbl9tYXNrKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZm9ybWF0OworICAgIG1fcERlc3RCaXRtYXAtPkNvbXBvc2VTY2FubGluZShyb3cgLSBtX0Rlc3RDbGlwLnRvcCwgbV9wRGVzdFNjYW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXN0TWFza1NjYW5saW5lKTsKKyAgfQorfQorQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDRlhfSW1hZ2VTdHJldGNoZXIoKSB7CisgIG1fcFNjYW5saW5lID0gTlVMTDsKKyAgbV9wU3RyZXRjaEVuZ2luZSA9IE5VTEw7CisgIG1fcE1hc2tTY2FubGluZSA9IE5VTEw7Cit9CitDRlhfSW1hZ2VTdHJldGNoZXI6On5DRlhfSW1hZ2VTdHJldGNoZXIoKSB7CisgIGlmIChtX3BTY2FubGluZSkgeworICAgIEZYX0ZyZWUobV9wU2NhbmxpbmUpOworICB9CisgIGRlbGV0ZSBtX3BTdHJldGNoRW5naW5lOworICBpZiAobV9wTWFza1NjYW5saW5lKSB7CisgICAgRlhfRnJlZShtX3BNYXNrU2NhbmxpbmUpOworICB9Cit9CitGWERJQl9Gb3JtYXQgX0dldFN0cmV0Y2hlZEZvcm1hdChjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKSB7CisgIEZYRElCX0Zvcm1hdCBmb3JtYXQgPSBwU3JjLT5HZXRGb3JtYXQoKTsKKyAgaWYgKGZvcm1hdCA9PSBGWERJQl8xYnBwTWFzaykgeworICAgIGZvcm1hdCA9IEZYRElCXzhicHBNYXNrOworICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBGWERJQl8xYnBwUmdiKSB7CisgICAgZm9ybWF0ID0gRlhESUJfOGJwcFJnYjsKKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gRlhESUJfOGJwcFJnYikgeworICAgIGlmIChwU3JjLT5HZXRQYWxldHRlKCkpIHsKKyAgICAgIGZvcm1hdCA9IEZYRElCX1JnYjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZvcm1hdDsKIH0KIEZYX0JPT0wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpTdGFydChJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiByZWN0LCBGWF9EV09SRCBmbGFncykKLXsKLSAgICBtX0Rlc3RGb3JtYXQgPSBfR2V0U3RyZXRjaGVkRm9ybWF0KHBTb3VyY2UpOwotICAgIG1fRGVzdEJQUCA9IG1fRGVzdEZvcm1hdCAmIDB4ZmY7Ci0gICAgbV9wRGVzdCA9IHBEZXN0OwotICAgIG1fcFNvdXJjZSA9IHBTb3VyY2U7Ci0gICAgbV9EZXN0V2lkdGggPSBkZXN0X3dpZHRoOwotICAgIG1fRGVzdEhlaWdodCA9IGRlc3RfaGVpZ2h0OwotICAgIG1fQ2xpcFJlY3QgPSByZWN0OwotICAgIG1fRmxhZ3MgPSBmbGFnczsKLSAgICBpZiAocFNvdXJjZS0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfMWJwcFJnYiAmJiBwU291cmNlLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgRlhfQVJHQiBwYWxbMjU2XTsKLSAgICAgICAgaW50IGEwLCByMCwgZzAsIGIwLCBhMSwgcjEsIGcxLCBiMTsKLSAgICAgICAgQXJnYkRlY29kZShwU291cmNlLT5HZXRQYWxldHRlRW50cnkoMCksIGEwLCByMCwgZzAsIGIwKTsKLSAgICAgICAgQXJnYkRlY29kZShwU291cmNlLT5HZXRQYWxldHRlRW50cnkoMSksIGExLCByMSwgZzEsIGIxKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgIGludCBhID0gYTAgKyAoYTEgLSBhMCkgKiBpIC8gMjU1OwotICAgICAgICAgICAgaW50IHIgPSByMCArIChyMSAtIHIwKSAqIGkgLyAyNTU7Ci0gICAgICAgICAgICBpbnQgZyA9IGcwICsgKGcxIC0gZzApICogaSAvIDI1NTsKLSAgICAgICAgICAgIGludCBiID0gYjAgKyAoYjEgLSBiMCkgKiBpIC8gMjU1OwotICAgICAgICAgICAgcGFsW2ldID0gQXJnYkVuY29kZShhLCByLCBnLCBiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXBEZXN0LT5TZXRJbmZvKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgbV9EZXN0Rm9ybWF0LCBwYWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBTb3VyY2UtPkdldEZvcm1hdCgpID09IEZYRElCXzFicHBDbXlrICYmIHBTb3VyY2UtPkdldFBhbGV0dGUoKSkgewotICAgICAgICBGWF9DTVlLIHBhbFsyNTZdOwotICAgICAgICBpbnQgYzAsIG0wLCB5MCwgazAsIGMxLCBtMSwgeTEsIGsxOwotICAgICAgICBDbXlrRGVjb2RlKHBTb3VyY2UtPkdldFBhbGV0dGVFbnRyeSgwKSwgYzAsIG0wLCB5MCwgazApOwotICAgICAgICBDbXlrRGVjb2RlKHBTb3VyY2UtPkdldFBhbGV0dGVFbnRyeSgxKSwgYzEsIG0xLCB5MSwgazEpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgaW50IGMgPSBjMCArIChjMSAtIGMwKSAqIGkgLyAyNTU7Ci0gICAgICAgICAgICBpbnQgbSA9IG0wICsgKG0xIC0gbTApICogaSAvIDI1NTsKLSAgICAgICAgICAgIGludCB5ID0geTAgKyAoeTEgLSB5MCkgKiBpIC8gMjU1OwotICAgICAgICAgICAgaW50IGsgPSBrMCArIChrMSAtIGswKSAqIGkgLyAyNTU7Ci0gICAgICAgICAgICBwYWxbaV0gPSBDbXlrRW5jb2RlKGMsIG0sIHksIGspOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcERlc3QtPlNldEluZm8ocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBtX0Rlc3RGb3JtYXQsIHBhbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXBEZXN0LT5TZXRJbmZvKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgbV9EZXN0Rm9ybWF0LCBOVUxMKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncykgeworICBtX0Rlc3RGb3JtYXQgPSBfR2V0U3RyZXRjaGVkRm9ybWF0KHBTb3VyY2UpOworICBtX0Rlc3RCUFAgPSBtX0Rlc3RGb3JtYXQgJiAweGZmOworICBtX3BEZXN0ID0gcERlc3Q7CisgIG1fcFNvdXJjZSA9IHBTb3VyY2U7CisgIG1fRGVzdFdpZHRoID0gZGVzdF93aWR0aDsKKyAgbV9EZXN0SGVpZ2h0ID0gZGVzdF9oZWlnaHQ7CisgIG1fQ2xpcFJlY3QgPSByZWN0OworICBtX0ZsYWdzID0gZmxhZ3M7CisgIGlmIChwU291cmNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwUmdiICYmIHBTb3VyY2UtPkdldFBhbGV0dGUoKSkgeworICAgIEZYX0FSR0IgcGFsWzI1Nl07CisgICAgaW50IGEwLCByMCwgZzAsIGIwLCBhMSwgcjEsIGcxLCBiMTsKKyAgICBBcmdiRGVjb2RlKHBTb3VyY2UtPkdldFBhbGV0dGVFbnRyeSgwKSwgYTAsIHIwLCBnMCwgYjApOworICAgIEFyZ2JEZWNvZGUocFNvdXJjZS0+R2V0UGFsZXR0ZUVudHJ5KDEpLCBhMSwgcjEsIGcxLCBiMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgaW50IGEgPSBhMCArIChhMSAtIGEwKSAqIGkgLyAyNTU7CisgICAgICBpbnQgciA9IHIwICsgKHIxIC0gcjApICogaSAvIDI1NTsKKyAgICAgIGludCBnID0gZzAgKyAoZzEgLSBnMCkgKiBpIC8gMjU1OworICAgICAgaW50IGIgPSBiMCArIChiMSAtIGIwKSAqIGkgLyAyNTU7CisgICAgICBwYWxbaV0gPSBBcmdiRW5jb2RlKGEsIHIsIGcsIGIpOwogICAgIH0KLSAgICBpZiAoZmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSB7Ci0gICAgICAgIHJldHVybiBTdGFydFF1aWNrU3RyZXRjaCgpOworICAgIGlmICghcERlc3QtPlNldEluZm8ocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBtX0Rlc3RGb3JtYXQsIHBhbCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIFN0YXJ0U3RyZXRjaCgpOwotfQotRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmIChtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgewotICAgICAgICByZXR1cm4gQ29udGludWVRdWlja1N0cmV0Y2gocFBhdXNlKTsKKyAgfSBlbHNlIGlmIChwU291cmNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwQ215ayAmJiBwU291cmNlLT5HZXRQYWxldHRlKCkpIHsKKyAgICBGWF9DTVlLIHBhbFsyNTZdOworICAgIGludCBjMCwgbTAsIHkwLCBrMCwgYzEsIG0xLCB5MSwgazE7CisgICAgQ215a0RlY29kZShwU291cmNlLT5HZXRQYWxldHRlRW50cnkoMCksIGMwLCBtMCwgeTAsIGswKTsKKyAgICBDbXlrRGVjb2RlKHBTb3VyY2UtPkdldFBhbGV0dGVFbnRyeSgxKSwgYzEsIG0xLCB5MSwgazEpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIGludCBjID0gYzAgKyAoYzEgLSBjMCkgKiBpIC8gMjU1OworICAgICAgaW50IG0gPSBtMCArIChtMSAtIG0wKSAqIGkgLyAyNTU7CisgICAgICBpbnQgeSA9IHkwICsgKHkxIC0geTApICogaSAvIDI1NTsKKyAgICAgIGludCBrID0gazAgKyAoazEgLSBrMCkgKiBpIC8gMjU1OworICAgICAgcGFsW2ldID0gQ215a0VuY29kZShjLCBtLCB5LCBrKTsKICAgICB9Ci0gICAgcmV0dXJuIENvbnRpbnVlU3RyZXRjaChwUGF1c2UpOwotfQotI2RlZmluZSBNQVhfUFJPR1JFU1NJVkVfU1RSRVRDSF9QSVhFTFMJMTAwMDAwMAotRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0U3RyZXRjaCgpCi17Ci0gICAgbV9wU3RyZXRjaEVuZ2luZSA9IEZYX05FVyBDU3RyZXRjaEVuZ2luZShtX3BEZXN0LCBtX0Rlc3RGb3JtYXQsIG1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQsIG1fQ2xpcFJlY3QsIG1fcFNvdXJjZSwgbV9GbGFncyk7Ci0gICAgaWYgKCFtX3BTdHJldGNoRW5naW5lKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIXBEZXN0LT5TZXRJbmZvKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgbV9EZXN0Rm9ybWF0LCBwYWwpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIG1fcFN0cmV0Y2hFbmdpbmUtPlN0YXJ0U3RyZXRjaEhvcnooKTsKLSAgICBpZiAobV9wU291cmNlLT5HZXRXaWR0aCgpICogbV9wU291cmNlLT5HZXRIZWlnaHQoKSA8IE1BWF9QUk9HUkVTU0lWRV9TVFJFVENIX1BJWEVMUykgewotICAgICAgICBtX3BTdHJldGNoRW5naW5lLT5Db250aW51ZShOVUxMKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZVN0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKG1fcFN0cmV0Y2hFbmdpbmUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBtX3BTdHJldGNoRW5naW5lLT5Db250aW51ZShwUGF1c2UpOwotfQotRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0UXVpY2tTdHJldGNoKCkKLXsKLSAgICBtX2JGbGlwWCA9IEZBTFNFOwotICAgIG1fYkZsaXBZID0gRkFMU0U7Ci0gICAgaWYgKG1fRGVzdFdpZHRoIDwgMCkgewotICAgICAgICBtX2JGbGlwWCA9IFRSVUU7Ci0gICAgICAgIG1fRGVzdFdpZHRoID0gLW1fRGVzdFdpZHRoOwotICAgIH0KLSAgICBpZiAobV9EZXN0SGVpZ2h0IDwgMCkgewotICAgICAgICBtX2JGbGlwWSA9IFRSVUU7Ci0gICAgICAgIG1fRGVzdEhlaWdodCA9IC1tX0Rlc3RIZWlnaHQ7Ci0gICAgfQotICAgIG1fTGluZUluZGV4ID0gMDsKLSAgICBGWF9EV09SRCBzaXplID0gbV9DbGlwUmVjdC5XaWR0aCgpOwotICAgIGlmIChzaXplICYmIG1fRGVzdEJQUCA+IChpbnQpKElOVF9NQVggLyBzaXplKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHNpemUgKj0gbV9EZXN0QlBQOwotICAgIG1fcFNjYW5saW5lID0gRlhfQWxsb2ModWludDhfdCwgKHNpemUgLyA4ICsgMykgLyA0ICogNCk7Ci0gICAgaWYgKG1fcFNvdXJjZS0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIG1fcE1hc2tTY2FubGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIChtX0NsaXBSZWN0LldpZHRoKCkgKyAzKSAvIDQgKiA0KTsKLSAgICB9Ci0gICAgaWYgKG1fcFNvdXJjZS0+R2V0V2lkdGgoKSAqIG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCkgPCBNQVhfUFJPR1JFU1NJVkVfU1RSRVRDSF9QSVhFTFMpIHsKLSAgICAgICAgQ29udGludWVRdWlja1N0cmV0Y2goTlVMTCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKG1fcFNjYW5saW5lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgcmVzdWx0X3dpZHRoID0gbV9DbGlwUmVjdC5XaWR0aCgpLCByZXN1bHRfaGVpZ2h0ID0gbV9DbGlwUmVjdC5IZWlnaHQoKTsKLSAgICBpbnQgc3JjX2hlaWdodCA9IG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCk7Ci0gICAgZm9yICg7IG1fTGluZUluZGV4IDwgcmVzdWx0X2hlaWdodDsgbV9MaW5lSW5kZXggKyspIHsKLSAgICAgICAgaW50IGRlc3RfeSwgc3JjX3k7Ci0gICAgICAgIGlmIChtX2JGbGlwWSkgewotICAgICAgICAgICAgZGVzdF95ID0gcmVzdWx0X2hlaWdodCAtIG1fTGluZUluZGV4IC0gMTsKLSAgICAgICAgICAgIHNyY195ID0gKG1fRGVzdEhlaWdodCAtIChkZXN0X3kgKyBtX0NsaXBSZWN0LnRvcCkgLSAxKSAqIHNyY19oZWlnaHQgLyBtX0Rlc3RIZWlnaHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXN0X3kgPSBtX0xpbmVJbmRleDsKLSAgICAgICAgICAgIHNyY195ID0gKGRlc3RfeSArIG1fQ2xpcFJlY3QudG9wKSAqIHNyY19oZWlnaHQgLyBtX0Rlc3RIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY195ID49IHNyY19oZWlnaHQpIHsKLSAgICAgICAgICAgIHNyY195ID0gc3JjX2hlaWdodCAtIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY195IDwgMCkgewotICAgICAgICAgICAgc3JjX3kgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BTb3VyY2UtPlNraXBUb1NjYW5saW5lKHNyY195LCBwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBtX3BTb3VyY2UtPkRvd25TYW1wbGVTY2FubGluZShzcmNfeSwgbV9wU2NhbmxpbmUsIG1fRGVzdEJQUCwgbV9EZXN0V2lkdGgsIG1fYkZsaXBYLCBtX0NsaXBSZWN0LmxlZnQsIHJlc3VsdF93aWR0aCk7Ci0gICAgICAgIGlmIChtX3BNYXNrU2NhbmxpbmUpIHsKLSAgICAgICAgICAgIG1fcFNvdXJjZS0+bV9wQWxwaGFNYXNrLT5Eb3duU2FtcGxlU2NhbmxpbmUoc3JjX3ksIG1fcE1hc2tTY2FubGluZSwgMSwgbV9EZXN0V2lkdGgsIG1fYkZsaXBYLCBtX0NsaXBSZWN0LmxlZnQsIHJlc3VsdF93aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGVzdC0+Q29tcG9zZVNjYW5saW5lKGRlc3RfeSwgbV9wU2NhbmxpbmUsIG1fcE1hc2tTY2FubGluZSk7Ci0gICAgfQorICB9IGVsc2UgaWYgKCFwRGVzdC0+U2V0SW5mbyhyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIG1fRGVzdEZvcm1hdCwgTlVMTCkpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKGZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgeworICAgIHJldHVybiBTdGFydFF1aWNrU3RyZXRjaCgpOworICB9CisgIHJldHVybiBTdGFydFN0cmV0Y2goKTsKK30KK0ZYX0JPT0wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpIHsKKyAgICByZXR1cm4gQ29udGludWVRdWlja1N0cmV0Y2gocFBhdXNlKTsKKyAgfQorICByZXR1cm4gQ29udGludWVTdHJldGNoKHBQYXVzZSk7Cit9CisjZGVmaW5lIE1BWF9QUk9HUkVTU0lWRV9TVFJFVENIX1BJWEVMUyAxMDAwMDAwCitGWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6U3RhcnRTdHJldGNoKCkgeworICBtX3BTdHJldGNoRW5naW5lID0KKyAgICAgIEZYX05FVyBDU3RyZXRjaEVuZ2luZShtX3BEZXN0LCBtX0Rlc3RGb3JtYXQsIG1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DbGlwUmVjdCwgbV9wU291cmNlLCBtX0ZsYWdzKTsKKyAgaWYgKCFtX3BTdHJldGNoRW5naW5lKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcFN0cmV0Y2hFbmdpbmUtPlN0YXJ0U3RyZXRjaEhvcnooKTsKKyAgaWYgKG1fcFNvdXJjZS0+R2V0V2lkdGgoKSAqIG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCkgPAorICAgICAgTUFYX1BST0dSRVNTSVZFX1NUUkVUQ0hfUElYRUxTKSB7CisgICAgbV9wU3RyZXRjaEVuZ2luZS0+Q29udGludWUoTlVMTCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OkNvbnRpbnVlU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAobV9wU3RyZXRjaEVuZ2luZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBtX3BTdHJldGNoRW5naW5lLT5Db250aW51ZShwUGF1c2UpOworfQorRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0UXVpY2tTdHJldGNoKCkgeworICBtX2JGbGlwWCA9IEZBTFNFOworICBtX2JGbGlwWSA9IEZBTFNFOworICBpZiAobV9EZXN0V2lkdGggPCAwKSB7CisgICAgbV9iRmxpcFggPSBUUlVFOworICAgIG1fRGVzdFdpZHRoID0gLW1fRGVzdFdpZHRoOworICB9CisgIGlmIChtX0Rlc3RIZWlnaHQgPCAwKSB7CisgICAgbV9iRmxpcFkgPSBUUlVFOworICAgIG1fRGVzdEhlaWdodCA9IC1tX0Rlc3RIZWlnaHQ7CisgIH0KKyAgbV9MaW5lSW5kZXggPSAwOworICBGWF9EV09SRCBzaXplID0gbV9DbGlwUmVjdC5XaWR0aCgpOworICBpZiAoc2l6ZSAmJiBtX0Rlc3RCUFAgPiAoaW50KShJTlRfTUFYIC8gc2l6ZSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgc2l6ZSAqPSBtX0Rlc3RCUFA7CisgIG1fcFNjYW5saW5lID0gRlhfQWxsb2ModWludDhfdCwgKHNpemUgLyA4ICsgMykgLyA0ICogNCk7CisgIGlmIChtX3BTb3VyY2UtPm1fcEFscGhhTWFzaykgeworICAgIG1fcE1hc2tTY2FubGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIChtX0NsaXBSZWN0LldpZHRoKCkgKyAzKSAvIDQgKiA0KTsKKyAgfQorICBpZiAobV9wU291cmNlLT5HZXRXaWR0aCgpICogbV9wU291cmNlLT5HZXRIZWlnaHQoKSA8CisgICAgICBNQVhfUFJPR1JFU1NJVkVfU1RSRVRDSF9QSVhFTFMpIHsKKyAgICBDb250aW51ZVF1aWNrU3RyZXRjaChOVUxMKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaWYgKG1fcFNjYW5saW5lID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IHJlc3VsdF93aWR0aCA9IG1fQ2xpcFJlY3QuV2lkdGgoKSwgcmVzdWx0X2hlaWdodCA9IG1fQ2xpcFJlY3QuSGVpZ2h0KCk7CisgIGludCBzcmNfaGVpZ2h0ID0gbV9wU291cmNlLT5HZXRIZWlnaHQoKTsKKyAgZm9yICg7IG1fTGluZUluZGV4IDwgcmVzdWx0X2hlaWdodDsgbV9MaW5lSW5kZXgrKykgeworICAgIGludCBkZXN0X3ksIHNyY195OworICAgIGlmIChtX2JGbGlwWSkgeworICAgICAgZGVzdF95ID0gcmVzdWx0X2hlaWdodCAtIG1fTGluZUluZGV4IC0gMTsKKyAgICAgIHNyY195ID0gKG1fRGVzdEhlaWdodCAtIChkZXN0X3kgKyBtX0NsaXBSZWN0LnRvcCkgLSAxKSAqIHNyY19oZWlnaHQgLworICAgICAgICAgICAgICBtX0Rlc3RIZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3RfeSA9IG1fTGluZUluZGV4OworICAgICAgc3JjX3kgPSAoZGVzdF95ICsgbV9DbGlwUmVjdC50b3ApICogc3JjX2hlaWdodCAvIG1fRGVzdEhlaWdodDsKKyAgICB9CisgICAgaWYgKHNyY195ID49IHNyY19oZWlnaHQpIHsKKyAgICAgIHNyY195ID0gc3JjX2hlaWdodCAtIDE7CisgICAgfQorICAgIGlmIChzcmNfeSA8IDApIHsKKyAgICAgIHNyY195ID0gMDsKKyAgICB9CisgICAgaWYgKG1fcFNvdXJjZS0+U2tpcFRvU2NhbmxpbmUoc3JjX3ksIHBQYXVzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBtX3BTb3VyY2UtPkRvd25TYW1wbGVTY2FubGluZShzcmNfeSwgbV9wU2NhbmxpbmUsIG1fRGVzdEJQUCwgbV9EZXN0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iRmxpcFgsIG1fQ2xpcFJlY3QubGVmdCwgcmVzdWx0X3dpZHRoKTsKKyAgICBpZiAobV9wTWFza1NjYW5saW5lKSB7CisgICAgICBtX3BTb3VyY2UtPm1fcEFscGhhTWFzay0+RG93blNhbXBsZVNjYW5saW5lKAorICAgICAgICAgIHNyY195LCBtX3BNYXNrU2NhbmxpbmUsIDEsIG1fRGVzdFdpZHRoLCBtX2JGbGlwWCwgbV9DbGlwUmVjdC5sZWZ0LAorICAgICAgICAgIHJlc3VsdF93aWR0aCk7CisgICAgfQorICAgIG1fcERlc3QtPkNvbXBvc2VTY2FubGluZShkZXN0X3ksIG1fcFNjYW5saW5lLCBtX3BNYXNrU2NhbmxpbmUpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcAppbmRleCA2NWE0Zjg5Li4yZDZkMjE3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfbWFpbi5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX21haW4uY3BwCkBAIC05LDE2OTMgKzksMTc2MCBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgogI2luY2x1ZGUgImRpYl9pbnQuaCIKICNpbmNsdWRlIDxsaW1pdHMuaD4KLUZYX0JPT0wgQ29udmVydEJ1ZmZlcihGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIEZYX0RXT1JEKiYgcGFsLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLXZvaWQgQ215a0RlY29kZShGWF9EV09SRCBjbXlrLCBpbnQmIGMsIGludCYgbSwgaW50JiB5LCBpbnQmIGspCi17Ci0gICAgYyA9IEZYU1lTX0dldENWYWx1ZShjbXlrKTsKLSAgICBtID0gRlhTWVNfR2V0TVZhbHVlKGNteWspOwotICAgIHkgPSBGWFNZU19HZXRZVmFsdWUoY215ayk7Ci0gICAgayA9IEZYU1lTX0dldEtWYWx1ZShjbXlrKTsKK0ZYX0JPT0wgQ29udmVydEJ1ZmZlcihGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqJiBwYWwsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7Cit2b2lkIENteWtEZWNvZGUoRlhfRFdPUkQgY215aywgaW50JiBjLCBpbnQmIG0sIGludCYgeSwgaW50JiBrKSB7CisgIGMgPSBGWFNZU19HZXRDVmFsdWUoY215ayk7CisgIG0gPSBGWFNZU19HZXRNVmFsdWUoY215ayk7CisgIHkgPSBGWFNZU19HZXRZVmFsdWUoY215ayk7CisgIGsgPSBGWFNZU19HZXRLVmFsdWUoY215ayk7CiB9Ci12b2lkIEFyZ2JEZWNvZGUoRlhfRFdPUkQgYXJnYiwgaW50JiBhLCBpbnQmIHIsIGludCYgZywgaW50JiBiKQotewotICAgIGEgPSBGWEFSR0JfQShhcmdiKTsKLSAgICByID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgZyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgIGIgPSBGWEFSR0JfQihhcmdiKTsKK3ZvaWQgQXJnYkRlY29kZShGWF9EV09SRCBhcmdiLCBpbnQmIGEsIGludCYgciwgaW50JiBnLCBpbnQmIGIpIHsKKyAgYSA9IEZYQVJHQl9BKGFyZ2IpOworICByID0gRlhBUkdCX1IoYXJnYik7CisgIGcgPSBGWEFSR0JfRyhhcmdiKTsKKyAgYiA9IEZYQVJHQl9CKGFyZ2IpOwogfQotdm9pZCBBcmdiRGVjb2RlKEZYX0RXT1JEIGFyZ2IsIGludCYgYSwgRlhfQ09MT1JSRUYmIHJnYikKLXsKLSAgICBhID0gRlhBUkdCX0EoYXJnYik7Ci0gICAgcmdiID0gRlhTWVNfUkdCKEZYQVJHQl9SKGFyZ2IpLCBGWEFSR0JfRyhhcmdiKSwgRlhBUkdCX0IoYXJnYikpOwordm9pZCBBcmdiRGVjb2RlKEZYX0RXT1JEIGFyZ2IsIGludCYgYSwgRlhfQ09MT1JSRUYmIHJnYikgeworICBhID0gRlhBUkdCX0EoYXJnYik7CisgIHJnYiA9IEZYU1lTX1JHQihGWEFSR0JfUihhcmdiKSwgRlhBUkdCX0coYXJnYiksIEZYQVJHQl9CKGFyZ2IpKTsKIH0KLUZYX0RXT1JEIEFyZ2JFbmNvZGUoaW50IGEsIEZYX0NPTE9SUkVGIHJnYikKLXsKLSAgICByZXR1cm4gRlhBUkdCX01BS0UoYSwgRlhTWVNfR2V0UlZhbHVlKHJnYiksIEZYU1lTX0dldEdWYWx1ZShyZ2IpLCBGWFNZU19HZXRCVmFsdWUocmdiKSk7CitGWF9EV09SRCBBcmdiRW5jb2RlKGludCBhLCBGWF9DT0xPUlJFRiByZ2IpIHsKKyAgcmV0dXJuIEZYQVJHQl9NQUtFKGEsIEZYU1lTX0dldFJWYWx1ZShyZ2IpLCBGWFNZU19HZXRHVmFsdWUocmdiKSwKKyAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldEJWYWx1ZShyZ2IpKTsKIH0KLUNGWF9ESUJTb3VyY2U6OkNGWF9ESUJTb3VyY2UoKQotewotICAgIG1fYnBwID0gMDsKLSAgICBtX0FscGhhRmxhZyA9IDA7Ci0gICAgbV9XaWR0aCA9IG1fSGVpZ2h0ID0gMDsKLSAgICBtX1BpdGNoID0gMDsKLSAgICBtX3BQYWxldHRlID0gTlVMTDsKLSAgICBtX3BBbHBoYU1hc2sgPSBOVUxMOworQ0ZYX0RJQlNvdXJjZTo6Q0ZYX0RJQlNvdXJjZSgpIHsKKyAgbV9icHAgPSAwOworICBtX0FscGhhRmxhZyA9IDA7CisgIG1fV2lkdGggPSBtX0hlaWdodCA9IDA7CisgIG1fUGl0Y2ggPSAwOworICBtX3BQYWxldHRlID0gTlVMTDsKKyAgbV9wQWxwaGFNYXNrID0gTlVMTDsKIH0KLUNGWF9ESUJTb3VyY2U6On5DRlhfRElCU291cmNlKCkKLXsKLSAgICBpZiAobV9wUGFsZXR0ZSkgewotICAgICAgICBGWF9GcmVlKG1fcFBhbGV0dGUpOwotICAgIH0KLSAgICBkZWxldGUgbV9wQWxwaGFNYXNrOworQ0ZYX0RJQlNvdXJjZTo6fkNGWF9ESUJTb3VyY2UoKSB7CisgIGlmIChtX3BQYWxldHRlKSB7CisgICAgRlhfRnJlZShtX3BQYWxldHRlKTsKKyAgfQorICBkZWxldGUgbV9wQWxwaGFNYXNrOwogfQotQ0ZYX0RJQml0bWFwOjpDRlhfRElCaXRtYXAoKQotewotICAgIG1fYkV4dEJ1ZiA9IEZBTFNFOwotICAgIG1fcEJ1ZmZlciA9IE5VTEw7Ci0gICAgbV9wUGFsZXR0ZSA9IE5VTEw7CitDRlhfRElCaXRtYXA6OkNGWF9ESUJpdG1hcCgpIHsKKyAgbV9iRXh0QnVmID0gRkFMU0U7CisgIG1fcEJ1ZmZlciA9IE5VTEw7CisgIG1fcFBhbGV0dGUgPSBOVUxMOwogfQotI2RlZmluZSBfTUFYX09PTV9MSU1JVF8JMTIwMDAwMDAKLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCB1aW50OF90KiBwQnVmZmVyLCBpbnQgcGl0Y2gpCi17Ci0gICAgbV9wQnVmZmVyID0gTlVMTDsKLSAgICBtX2JwcCA9ICh1aW50OF90KWZvcm1hdDsKLSAgICBtX0FscGhhRmxhZyA9ICh1aW50OF90KShmb3JtYXQgPj4gOCk7Ci0gICAgbV9XaWR0aCA9IG1fSGVpZ2h0ID0gbV9QaXRjaCA9IDA7Ci0gICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgcGl0Y2ggPCAwKSB7CisjZGVmaW5lIF9NQVhfT09NX0xJTUlUXyAxMjAwMDAwMAorRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNyZWF0ZShpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCkgeworICBtX3BCdWZmZXIgPSBOVUxMOworICBtX2JwcCA9ICh1aW50OF90KWZvcm1hdDsKKyAgbV9BbHBoYUZsYWcgPSAodWludDhfdCkoZm9ybWF0ID4+IDgpOworICBtX1dpZHRoID0gbV9IZWlnaHQgPSBtX1BpdGNoID0gMDsKKyAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgcGl0Y2ggPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICgoSU5UX01BWCAtIDMxKSAvIHdpZHRoIDwgKGZvcm1hdCAmIDB4ZmYpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcGl0Y2gpIHsKKyAgICBwaXRjaCA9ICh3aWR0aCAqIChmb3JtYXQgJiAweGZmKSArIDMxKSAvIDMyICogNDsKKyAgfQorICBpZiAoKDEgPDwgMzApIC8gcGl0Y2ggPCBoZWlnaHQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBCdWZmZXIpIHsKKyAgICBtX3BCdWZmZXIgPSBwQnVmZmVyOworICAgIG1fYkV4dEJ1ZiA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgaW50IHNpemUgPSBwaXRjaCAqIGhlaWdodCArIDQ7CisgICAgaW50IG9vbWxpbWl0ID0gX01BWF9PT01fTElNSVRfOworICAgIGlmIChvb21saW1pdCA+PSAwICYmIHNpemUgPj0gb29tbGltaXQpIHsKKyAgICAgIG1fcEJ1ZmZlciA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIHNpemUpOworICAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKChJTlRfTUFYIC0gMzEpIC8gd2lkdGggPCAoZm9ybWF0ICYgMHhmZikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIXBpdGNoKSB7Ci0gICAgICAgIHBpdGNoID0gKHdpZHRoICogKGZvcm1hdCAmIDB4ZmYpICsgMzEpIC8gMzIgKiA0OwotICAgIH0KLSAgICBpZiAoKDEgPDwgMzApIC8gcGl0Y2ggPCBoZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocEJ1ZmZlcikgewotICAgICAgICBtX3BCdWZmZXIgPSBwQnVmZmVyOwotICAgICAgICBtX2JFeHRCdWYgPSBUUlVFOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBzaXplID0gcGl0Y2ggKiBoZWlnaHQgKyA0OwotICAgICAgICBpbnQgb29tbGltaXQgPSBfTUFYX09PTV9MSU1JVF87Ci0gICAgICAgIGlmIChvb21saW1pdCA+PSAwICYmIHNpemUgPj0gb29tbGltaXQpIHsKLSAgICAgICAgICAgIG1fcEJ1ZmZlciA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIHNpemUpOwotICAgICAgICAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7Ci0gICAgICAgIH0KKyAgICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOwogICAgIH0KLSAgICBtX1dpZHRoID0gd2lkdGg7Ci0gICAgbV9IZWlnaHQgPSBoZWlnaHQ7Ci0gICAgbV9QaXRjaCA9IHBpdGNoOwotICAgIGlmIChIYXNBbHBoYSgpICYmIGZvcm1hdCAhPSBGWERJQl9BcmdiKSB7Ci0gICAgICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKLSAgICAgICAgcmV0ID0gQnVpbGRBbHBoYU1hc2soKTsKLSAgICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgICAgIGlmICghbV9iRXh0QnVmICYmIG1fcEJ1ZmZlcikgewotICAgICAgICAgICAgICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBtX3BCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IG1fUGl0Y2ggPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb3B5KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpCi17Ci0gICAgaWYgKG1fcEJ1ZmZlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICghQ3JlYXRlKHBTcmMtPkdldFdpZHRoKCksIHBTcmMtPkdldEhlaWdodCgpLCBwU3JjLT5HZXRGb3JtYXQoKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDb3B5UGFsZXR0ZShwU3JjLT5HZXRQYWxldHRlKCkpOwotICAgIENvcHlBbHBoYU1hc2socFNyYy0+bV9wQWxwaGFNYXNrKTsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwU3JjLT5HZXRIZWlnaHQoKTsgcm93ICsrKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoLCBwU3JjLT5HZXRTY2FubGluZShyb3cpLCBtX1BpdGNoKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1DRlhfRElCaXRtYXA6On5DRlhfRElCaXRtYXAoKQotewotICAgIGlmIChtX3BCdWZmZXIgJiYgIW1fYkV4dEJ1ZikgeworICB9CisgIG1fV2lkdGggPSB3aWR0aDsKKyAgbV9IZWlnaHQgPSBoZWlnaHQ7CisgIG1fUGl0Y2ggPSBwaXRjaDsKKyAgaWYgKEhhc0FscGhhKCkgJiYgZm9ybWF0ICE9IEZYRElCX0FyZ2IpIHsKKyAgICBGWF9CT09MIHJldCA9IFRSVUU7CisgICAgcmV0ID0gQnVpbGRBbHBoYU1hc2soKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgaWYgKCFtX2JFeHRCdWYgJiYgbV9wQnVmZmVyKSB7CiAgICAgICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKLSAgICB9Ci0gICAgbV9wQnVmZmVyID0gTlVMTDsKLX0KLXZvaWQgQ0ZYX0RJQml0bWFwOjpUYWtlT3ZlcihDRlhfRElCaXRtYXAqIHBTcmNCaXRtYXApCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciAmJiAhbV9iRXh0QnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKLSAgICB9Ci0gICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BQYWxldHRlKTsKLSAgICB9Ci0gICAgZGVsZXRlIG1fcEFscGhhTWFzazsKLSAgICBtX3BCdWZmZXIgPSBwU3JjQml0bWFwLT5tX3BCdWZmZXI7Ci0gICAgbV9wUGFsZXR0ZSA9IHBTcmNCaXRtYXAtPm1fcFBhbGV0dGU7Ci0gICAgbV9wQWxwaGFNYXNrID0gcFNyY0JpdG1hcC0+bV9wQWxwaGFNYXNrOwotICAgIHBTcmNCaXRtYXAtPm1fcEJ1ZmZlciA9IE5VTEw7Ci0gICAgcFNyY0JpdG1hcC0+bV9wUGFsZXR0ZSA9IE5VTEw7Ci0gICAgcFNyY0JpdG1hcC0+bV9wQWxwaGFNYXNrID0gTlVMTDsKLSAgICBtX2JwcCA9IHBTcmNCaXRtYXAtPm1fYnBwOwotICAgIG1fYkV4dEJ1ZiA9IHBTcmNCaXRtYXAtPm1fYkV4dEJ1ZjsKLSAgICBtX0FscGhhRmxhZyA9IHBTcmNCaXRtYXAtPm1fQWxwaGFGbGFnOwotICAgIG1fV2lkdGggPSBwU3JjQml0bWFwLT5tX1dpZHRoOwotICAgIG1fSGVpZ2h0ID0gcFNyY0JpdG1hcC0+bV9IZWlnaHQ7Ci0gICAgbV9QaXRjaCA9IHBTcmNCaXRtYXAtPm1fUGl0Y2g7Ci19Ci1DRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkNsb25lKGNvbnN0IEZYX1JFQ1QqIHBDbGlwKSBjb25zdAotewotICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCk7Ci0gICAgaWYgKHBDbGlwKSB7Ci0gICAgICAgIHJlY3QuSW50ZXJzZWN0KCpwQ2xpcCk7Ci0gICAgICAgIGlmIChyZWN0LklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ0ZYX0RJQml0bWFwKiBwTmV3Qml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKLSAgICBpZiAoIXBOZXdCaXRtYXApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghcE5ld0JpdG1hcC0+Q3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgR2V0Rm9ybWF0KCkpKSB7Ci0gICAgICAgIGRlbGV0ZSBwTmV3Qml0bWFwOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcE5ld0JpdG1hcC0+Q29weVBhbGV0dGUobV9wUGFsZXR0ZSk7Ci0gICAgcE5ld0JpdG1hcC0+Q29weUFscGhhTWFzayhtX3BBbHBoYU1hc2ssIHBDbGlwKTsKLSAgICBpZiAoR2V0QlBQKCkgPT0gMSAmJiByZWN0LmxlZnQgJSA4ICE9IDApIHsKLSAgICAgICAgaW50IGxlZnRfc2hpZnQgPSByZWN0LmxlZnQgJSAzMjsKLSAgICAgICAgaW50IHJpZ2h0X3NoaWZ0ID0gMzIgLSBsZWZ0X3NoaWZ0OwotICAgICAgICBpbnQgZHdvcmRfY291bnQgPSBwTmV3Qml0bWFwLT5tX1BpdGNoIC8gNDsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3cgKyspIHsKLSAgICAgICAgICAgIEZYX0RXT1JEKiBzcmNfc2NhbiA9IChGWF9EV09SRCopR2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdCAvIDMyOwotICAgICAgICAgICAgRlhfRFdPUkQqIGRlc3Rfc2NhbiA9IChGWF9EV09SRCopcE5ld0JpdG1hcC0+R2V0U2NhbmxpbmUocm93IC0gcmVjdC50b3ApOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkd29yZF9jb3VudDsgaSArKykgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltpXSA9IChzcmNfc2NhbltpXSA8PCBsZWZ0X3NoaWZ0KSB8IChzcmNfc2NhbltpICsgMV0gPj4gcmlnaHRfc2hpZnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGNvcHlfbGVuID0gKHBOZXdCaXRtYXAtPkdldFdpZHRoKCkgKiBwTmV3Qml0bWFwLT5HZXRCUFAoKSArIDcpIC8gODsKLSAgICAgICAgaWYgKG1fUGl0Y2ggPCAoRlhfRFdPUkQpY29weV9sZW4pIHsKLSAgICAgICAgICAgIGNvcHlfbGVuID0gbV9QaXRjaDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewotICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBHZXRTY2FubGluZShyb3cpICsgcmVjdC5sZWZ0ICogbV9icHAgLyA4OwotICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gKHVpbnQ4X3QqKXBOZXdCaXRtYXAtPkdldFNjYW5saW5lKHJvdyAtIHJlY3QudG9wKTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBjb3B5X2xlbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBOZXdCaXRtYXA7Ci19Ci12b2lkIENGWF9ESUJTb3VyY2U6OkJ1aWxkUGFsZXR0ZSgpCi17Ci0gICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoR2V0QlBQKCkgPT0gMSkgewotICAgICAgICBtX3BQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIDIpOwotICAgICAgICBpZihJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBtX3BQYWxldHRlWzBdID0gMHhmZjsKLSAgICAgICAgICAgIG1fcFBhbGV0dGVbMV0gPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wUGFsZXR0ZVswXSA9IDB4ZmYwMDAwMDA7Ci0gICAgICAgICAgICBtX3BQYWxldHRlWzFdID0gMHhmZmZmZmZmZjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoR2V0QlBQKCkgPT0gOCkgewotICAgICAgICBtX3BQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIDI1Nik7Ci0gICAgICAgIGlmKElzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9wUGFsZXR0ZVtpXSA9IDB4ZmYgLSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBtX3BQYWxldHRlW2ldID0gMHhmZjAwMDAwMCB8IChpICogMHgxMDEwMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1GWF9CT09MIENGWF9ESUJTb3VyY2U6OkJ1aWxkQWxwaGFNYXNrKCkKLXsKLSAgICBpZiAobV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX3BBbHBoYU1hc2sgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghbV9wQWxwaGFNYXNrKSB7CisgICAgICAgIG1fcEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IG1fUGl0Y2ggPSAwOwogICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CiAgICAgfQotICAgIGlmICghbV9wQWxwaGFNYXNrLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICBkZWxldGUgbV9wQWxwaGFNYXNrOwotICAgICAgICBtX3BBbHBoYU1hc2sgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYU1lTX21lbXNldChtX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpLCAweGZmLCBtX3BBbHBoYU1hc2stPkdldEhlaWdodCgpKm1fcEFscGhhTWFzay0+R2V0UGl0Y2goKSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9EV09SRCBDRlhfRElCU291cmNlOjpHZXRQYWxldHRlRW50cnkoaW50IGluZGV4KSBjb25zdAotewotICAgIEFTU0VSVCgoR2V0QlBQKCkgPT0gMSB8fCBHZXRCUFAoKSA9PSA4KSAmJiAhSXNBbHBoYU1hc2soKSk7Ci0gICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgcmV0dXJuIG1fcFBhbGV0dGVbaW5kZXhdOworRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvcHkoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYykgeworICBpZiAobV9wQnVmZmVyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghQ3JlYXRlKHBTcmMtPkdldFdpZHRoKCksIHBTcmMtPkdldEhlaWdodCgpLCBwU3JjLT5HZXRGb3JtYXQoKSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ29weVBhbGV0dGUocFNyYy0+R2V0UGFsZXR0ZSgpKTsKKyAgQ29weUFscGhhTWFzayhwU3JjLT5tX3BBbHBoYU1hc2spOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwU3JjLT5HZXRIZWlnaHQoKTsgcm93KyspIHsKKyAgICBGWFNZU19tZW1jcHkobV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCwgcFNyYy0+R2V0U2NhbmxpbmUocm93KSwgbV9QaXRjaCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitDRlhfRElCaXRtYXA6On5DRlhfRElCaXRtYXAoKSB7CisgIGlmIChtX3BCdWZmZXIgJiYgIW1fYkV4dEJ1ZikgeworICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKKyAgfQorICBtX3BCdWZmZXIgPSBOVUxMOworfQordm9pZCBDRlhfRElCaXRtYXA6OlRha2VPdmVyKENGWF9ESUJpdG1hcCogcFNyY0JpdG1hcCkgeworICBpZiAobV9wQnVmZmVyICYmICFtX2JFeHRCdWYpIHsKKyAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7CisgIH0KKyAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICBGWF9GcmVlKG1fcFBhbGV0dGUpOworICB9CisgIGRlbGV0ZSBtX3BBbHBoYU1hc2s7CisgIG1fcEJ1ZmZlciA9IHBTcmNCaXRtYXAtPm1fcEJ1ZmZlcjsKKyAgbV9wUGFsZXR0ZSA9IHBTcmNCaXRtYXAtPm1fcFBhbGV0dGU7CisgIG1fcEFscGhhTWFzayA9IHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzazsKKyAgcFNyY0JpdG1hcC0+bV9wQnVmZmVyID0gTlVMTDsKKyAgcFNyY0JpdG1hcC0+bV9wUGFsZXR0ZSA9IE5VTEw7CisgIHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzayA9IE5VTEw7CisgIG1fYnBwID0gcFNyY0JpdG1hcC0+bV9icHA7CisgIG1fYkV4dEJ1ZiA9IHBTcmNCaXRtYXAtPm1fYkV4dEJ1ZjsKKyAgbV9BbHBoYUZsYWcgPSBwU3JjQml0bWFwLT5tX0FscGhhRmxhZzsKKyAgbV9XaWR0aCA9IHBTcmNCaXRtYXAtPm1fV2lkdGg7CisgIG1fSGVpZ2h0ID0gcFNyY0JpdG1hcC0+bV9IZWlnaHQ7CisgIG1fUGl0Y2ggPSBwU3JjQml0bWFwLT5tX1BpdGNoOworfQorQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpDbG9uZShjb25zdCBGWF9SRUNUKiBwQ2xpcCkgY29uc3QgeworICBGWF9SRUNUIHJlY3QoMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQpOworICBpZiAocENsaXApIHsKKyAgICByZWN0LkludGVyc2VjdCgqcENsaXApOworICAgIGlmIChyZWN0LklzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICB9CisgIENGWF9ESUJpdG1hcCogcE5ld0JpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7CisgIGlmICghcE5ld0JpdG1hcCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghcE5ld0JpdG1hcC0+Q3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgR2V0Rm9ybWF0KCkpKSB7CisgICAgZGVsZXRlIHBOZXdCaXRtYXA7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcE5ld0JpdG1hcC0+Q29weVBhbGV0dGUobV9wUGFsZXR0ZSk7CisgIHBOZXdCaXRtYXAtPkNvcHlBbHBoYU1hc2sobV9wQWxwaGFNYXNrLCBwQ2xpcCk7CisgIGlmIChHZXRCUFAoKSA9PSAxICYmIHJlY3QubGVmdCAlIDggIT0gMCkgeworICAgIGludCBsZWZ0X3NoaWZ0ID0gcmVjdC5sZWZ0ICUgMzI7CisgICAgaW50IHJpZ2h0X3NoaWZ0ID0gMzIgLSBsZWZ0X3NoaWZ0OworICAgIGludCBkd29yZF9jb3VudCA9IHBOZXdCaXRtYXAtPm1fUGl0Y2ggLyA0OworICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKKyAgICAgIEZYX0RXT1JEKiBzcmNfc2NhbiA9IChGWF9EV09SRCopR2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdCAvIDMyOworICAgICAgRlhfRFdPUkQqIGRlc3Rfc2NhbiA9IChGWF9EV09SRCopcE5ld0JpdG1hcC0+R2V0U2NhbmxpbmUocm93IC0gcmVjdC50b3ApOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkd29yZF9jb3VudDsgaSsrKSB7CisgICAgICAgIGRlc3Rfc2NhbltpXSA9CisgICAgICAgICAgICAoc3JjX3NjYW5baV0gPDwgbGVmdF9zaGlmdCkgfCAoc3JjX3NjYW5baSArIDFdID4+IHJpZ2h0X3NoaWZ0KTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IGNvcHlfbGVuID0gKHBOZXdCaXRtYXAtPkdldFdpZHRoKCkgKiBwTmV3Qml0bWFwLT5HZXRCUFAoKSArIDcpIC8gODsKKyAgICBpZiAobV9QaXRjaCA8IChGWF9EV09SRCljb3B5X2xlbikgeworICAgICAgY29weV9sZW4gPSBtX1BpdGNoOworICAgIH0KKyAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdysrKSB7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IEdldFNjYW5saW5lKHJvdykgKyByZWN0LmxlZnQgKiBtX2JwcCAvIDg7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopcE5ld0JpdG1hcC0+R2V0U2NhbmxpbmUocm93IC0gcmVjdC50b3ApOworICAgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGNvcHlfbGVuKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBOZXdCaXRtYXA7Cit9Cit2b2lkIENGWF9ESUJTb3VyY2U6OkJ1aWxkUGFsZXR0ZSgpIHsKKyAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKEdldEJQUCgpID09IDEpIHsKKyAgICBtX3BQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIDIpOwogICAgIGlmIChJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgIGlmIChHZXRCUFAoKSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXggPyAwIDogMHhmZjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMHhmZiAtIGluZGV4OworICAgICAgbV9wUGFsZXR0ZVswXSA9IDB4ZmY7CisgICAgICBtX3BQYWxldHRlWzFdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgbV9wUGFsZXR0ZVswXSA9IDB4ZmYwMDAwMDA7CisgICAgICBtX3BQYWxldHRlWzFdID0gMHhmZmZmZmZmZjsKKyAgICB9CisgIH0gZWxzZSBpZiAoR2V0QlBQKCkgPT0gOCkgeworICAgIG1fcFBhbGV0dGUgPSBGWF9BbGxvYyhGWF9EV09SRCwgMjU2KTsKKyAgICBpZiAoSXNDbXlrSW1hZ2UoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBtX3BQYWxldHRlW2ldID0gMHhmZiAtIGk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgbV9wUGFsZXR0ZVtpXSA9IDB4ZmYwMDAwMDAgfCAoaSAqIDB4MTAxMDEpOworICAgICAgfQorICAgIH0KKyAgfQorfQorRlhfQk9PTCBDRlhfRElCU291cmNlOjpCdWlsZEFscGhhTWFzaygpIHsKKyAgaWYgKG1fcEFscGhhTWFzaykgeworICAgIHJldHVybiBUUlVFOworICB9CisgIG1fcEFscGhhTWFzayA9IEZYX05FVyBDRlhfRElCaXRtYXA7CisgIGlmICghbV9wQWxwaGFNYXNrKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghbV9wQWxwaGFNYXNrLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgeworICAgIGRlbGV0ZSBtX3BBbHBoYU1hc2s7CisgICAgbV9wQWxwaGFNYXNrID0gTlVMTDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhTWVNfbWVtc2V0KG1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCksIDB4ZmYsCisgICAgICAgICAgICAgICBtX3BBbHBoYU1hc2stPkdldEhlaWdodCgpICogbV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9EV09SRCBDRlhfRElCU291cmNlOjpHZXRQYWxldHRlRW50cnkoaW50IGluZGV4KSBjb25zdCB7CisgIEFTU0VSVCgoR2V0QlBQKCkgPT0gMSB8fCBHZXRCUFAoKSA9PSA4KSAmJiAhSXNBbHBoYU1hc2soKSk7CisgIGlmIChtX3BQYWxldHRlKSB7CisgICAgcmV0dXJuIG1fcFBhbGV0dGVbaW5kZXhdOworICB9CisgIGlmIChJc0NteWtJbWFnZSgpKSB7CisgICAgaWYgKEdldEJQUCgpID09IDEpIHsKKyAgICAgIHJldHVybiBpbmRleCA/IDAgOiAweGZmOworICAgIH0KKyAgICByZXR1cm4gMHhmZiAtIGluZGV4OworICB9CisgIGlmIChHZXRCUFAoKSA9PSAxKSB7CisgICAgcmV0dXJuIGluZGV4ID8gMHhmZmZmZmZmZiA6IDB4ZmYwMDAwMDA7CisgIH0KKyAgcmV0dXJuIGluZGV4ICogMHgxMDEwMSB8IDB4ZmYwMDAwMDA7Cit9Cit2b2lkIENGWF9ESUJTb3VyY2U6OlNldFBhbGV0dGVFbnRyeShpbnQgaW5kZXgsIEZYX0RXT1JEIGNvbG9yKSB7CisgIEFTU0VSVCgoR2V0QlBQKCkgPT0gMSB8fCBHZXRCUFAoKSA9PSA4KSAmJiAhSXNBbHBoYU1hc2soKSk7CisgIGlmIChtX3BQYWxldHRlID09IE5VTEwpIHsKKyAgICBCdWlsZFBhbGV0dGUoKTsKKyAgfQorICBtX3BQYWxldHRlW2luZGV4XSA9IGNvbG9yOworfQoraW50IENGWF9ESUJTb3VyY2U6OkZpbmRQYWxldHRlKEZYX0RXT1JEIGNvbG9yKSBjb25zdCB7CisgIEFTU0VSVCgoR2V0QlBQKCkgPT0gMSB8fCBHZXRCUFAoKSA9PSA4KSAmJiAhSXNBbHBoYU1hc2soKSk7CisgIGlmIChtX3BQYWxldHRlID09IE5VTEwpIHsKKyAgICBpZiAoSXNDbXlrSW1hZ2UoKSkgeworICAgICAgaWYgKEdldEJQUCgpID09IDEpIHsKKyAgICAgICAgcmV0dXJuICgodWludDhfdCljb2xvciA9PSAweGZmKSA/IDAgOiAxOworICAgICAgfQorICAgICAgcmV0dXJuIDB4ZmYgLSAodWludDhfdCljb2xvcjsKICAgICB9CiAgICAgaWYgKEdldEJQUCgpID09IDEpIHsKLSAgICAgICAgcmV0dXJuIGluZGV4ID8gMHhmZmZmZmZmZiA6IDB4ZmYwMDAwMDA7CisgICAgICByZXR1cm4gKCh1aW50OF90KWNvbG9yID09IDB4ZmYpID8gMSA6IDA7CiAgICAgfQotICAgIHJldHVybiBpbmRleCAqIDB4MTAxMDEgfCAweGZmMDAwMDAwOworICAgIHJldHVybiAodWludDhfdCljb2xvcjsKKyAgfQorICBpbnQgcGFsc2l6ZSA9ICgxIDw8IEdldEJQUCgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxzaXplOyBpKyspCisgICAgaWYgKG1fcFBhbGV0dGVbaV0gPT0gY29sb3IpIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgcmV0dXJuIC0xOwogfQotdm9pZCBDRlhfRElCU291cmNlOjpTZXRQYWxldHRlRW50cnkoaW50IGluZGV4LCBGWF9EV09SRCBjb2xvcikKLXsKLSAgICBBU1NFUlQoKEdldEJQUCgpID09IDEgfHwgR2V0QlBQKCkgPT0gOCkgJiYgIUlzQWxwaGFNYXNrKCkpOwotICAgIGlmIChtX3BQYWxldHRlID09IE5VTEwpIHsKLSAgICAgICAgQnVpbGRQYWxldHRlKCk7Cit2b2lkIENGWF9ESUJpdG1hcDo6Q2xlYXIoRlhfRFdPUkQgY29sb3IpIHsKKyAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCXzFicHBNYXNrOgorICAgICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgKGNvbG9yICYgMHhmZjAwMDAwMCkgPyAweGZmIDogMCwKKyAgICAgICAgICAgICAgICAgICBtX1BpdGNoICogbV9IZWlnaHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7CisgICAgICBpbnQgaW5kZXggPSBGaW5kUGFsZXR0ZShjb2xvcik7CisgICAgICBGWFNZU19tZW1zZXQobV9wQnVmZmVyLCBpbmRleCA/IDB4ZmYgOiAwLCBtX1BpdGNoICogbV9IZWlnaHQpOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1fcFBhbGV0dGVbaW5kZXhdID0gY29sb3I7CisgICAgY2FzZSBGWERJQl84YnBwTWFzazoKKyAgICAgIEZYU1lTX21lbXNldChtX3BCdWZmZXIsIGNvbG9yID4+IDI0LCBtX1BpdGNoICogbV9IZWlnaHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7CisgICAgICBpbnQgaW5kZXggPSBGaW5kUGFsZXR0ZShjb2xvcik7CisgICAgICBGWFNZU19tZW1zZXQobV9wQnVmZmVyLCBpbmRleCwgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYRElCX1JnYjoKKyAgICBjYXNlIEZYRElCX1JnYmE6IHsKKyAgICAgIGludCBhLCByLCBnLCBiOworICAgICAgQXJnYkRlY29kZShjb2xvciwgYSwgciwgZywgYik7CisgICAgICBpZiAociA9PSBnICYmIGcgPT0gYikgeworICAgICAgICBGWFNZU19tZW1zZXQobV9wQnVmZmVyLCByLCBtX1BpdGNoICogbV9IZWlnaHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGJ5dGVfcG9zID0gMDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICBtX3BCdWZmZXJbYnl0ZV9wb3MrK10gPSBiOworICAgICAgICAgIG1fcEJ1ZmZlcltieXRlX3BvcysrXSA9IGc7CisgICAgICAgICAgbV9wQnVmZmVyW2J5dGVfcG9zKytdID0gcjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgICBGWFNZU19tZW1jcHkobV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCwgbV9wQnVmZmVyLCBtX1BpdGNoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhESUJfUmdiMzI6CisgICAgY2FzZSBGWERJQl9BcmdiOiB7CisgICAgICBjb2xvciA9IElzQ215a0ltYWdlKCkgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9XaWR0aDsgaSsrKSB7CisgICAgICAgICgoRlhfRFdPUkQqKW1fcEJ1ZmZlcilbaV0gPSBjb2xvcjsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgICBGWFNZU19tZW1jcHkobV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCwgbV9wQnVmZmVyLCBtX1BpdGNoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIH0KLWludCBDRlhfRElCU291cmNlOjpGaW5kUGFsZXR0ZShGWF9EV09SRCBjb2xvcikgY29uc3QKLXsKLSAgICBBU1NFUlQoKEdldEJQUCgpID09IDEgfHwgR2V0QlBQKCkgPT0gOCkgJiYgIUlzQWxwaGFNYXNrKCkpOwotICAgIGlmIChtX3BQYWxldHRlID09IE5VTEwpIHsKLSAgICAgICAgaWYgKElzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIGlmIChHZXRCUFAoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgodWludDhfdCljb2xvciA9PSAweGZmKSA/IDAgOiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDB4ZmYgLSAodWludDhfdCljb2xvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoR2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuICgodWludDhfdCljb2xvciA9PSAweGZmKSA/IDEgOiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAodWludDhfdCljb2xvcjsKLSAgICB9Ci0gICAgaW50IHBhbHNpemUgPSAoMSA8PCBHZXRCUFAoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxzaXplOyBpICsrKQotICAgICAgICBpZiAobV9wUGFsZXR0ZVtpXSA9PSBjb2xvcikgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gLTE7Cit2b2lkIENGWF9ESUJTb3VyY2U6OkdldE92ZXJsYXBSZWN0KGludCYgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduKSB7CisgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIEFTU0VSVCh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCk7CisgIGlmIChkZXN0X2xlZnQgPiBtX1dpZHRoIHx8IGRlc3RfdG9wID4gbV9IZWlnaHQpIHsKKyAgICB3aWR0aCA9IDA7CisgICAgaGVpZ2h0ID0gMDsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IHhfb2Zmc2V0ID0gZGVzdF9sZWZ0IC0gc3JjX2xlZnQ7CisgIGludCB5X29mZnNldCA9IGRlc3RfdG9wIC0gc3JjX3RvcDsKKyAgRlhfUkVDVCBzcmNfcmVjdChzcmNfbGVmdCwgc3JjX3RvcCwgc3JjX2xlZnQgKyB3aWR0aCwgc3JjX3RvcCArIGhlaWdodCk7CisgIEZYX1JFQ1Qgc3JjX2JvdW5kKDAsIDAsIHNyY193aWR0aCwgc3JjX2hlaWdodCk7CisgIHNyY19yZWN0LkludGVyc2VjdChzcmNfYm91bmQpOworICBGWF9SRUNUIGRlc3RfcmVjdChzcmNfcmVjdC5sZWZ0ICsgeF9vZmZzZXQsIHNyY19yZWN0LnRvcCArIHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBzcmNfcmVjdC5yaWdodCArIHhfb2Zmc2V0LCBzcmNfcmVjdC5ib3R0b20gKyB5X29mZnNldCk7CisgIEZYX1JFQ1QgZGVzdF9ib3VuZCgwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCk7CisgIGRlc3RfcmVjdC5JbnRlcnNlY3QoZGVzdF9ib3VuZCk7CisgIGlmIChwQ2xpcFJnbikgeworICAgIGRlc3RfcmVjdC5JbnRlcnNlY3QocENsaXBSZ24tPkdldEJveCgpKTsKKyAgfQorICBkZXN0X2xlZnQgPSBkZXN0X3JlY3QubGVmdDsKKyAgZGVzdF90b3AgPSBkZXN0X3JlY3QudG9wOworICBzcmNfbGVmdCA9IGRlc3RfbGVmdCAtIHhfb2Zmc2V0OworICBzcmNfdG9wID0gZGVzdF90b3AgLSB5X29mZnNldDsKKyAgd2lkdGggPSBkZXN0X3JlY3QucmlnaHQgLSBkZXN0X3JlY3QubGVmdDsKKyAgaGVpZ2h0ID0gZGVzdF9yZWN0LmJvdHRvbSAtIGRlc3RfcmVjdC50b3A7CiB9Ci12b2lkIENGWF9ESUJpdG1hcDo6Q2xlYXIoRlhfRFdPUkQgY29sb3IpCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3dpdGNoIChHZXRGb3JtYXQoKSkgewotICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOgotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgKGNvbG9yICYgMHhmZjAwMDAwMCkgPyAweGZmIDogMCwgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBGaW5kUGFsZXR0ZShjb2xvcik7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgaW5kZXggPyAweGZmIDogMCwgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChtX3BCdWZmZXIsIGNvbG9yID4+IDI0LCBtX1BpdGNoICogbV9IZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IEZpbmRQYWxldHRlKGNvbG9yKTsKLSAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQobV9wQnVmZmVyLCBpbmRleCwgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl9SZ2I6Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiYTogewotICAgICAgICAgICAgICAgIGludCBhLCByLCBnLCBiOwotICAgICAgICAgICAgICAgIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgIGlmIChyID09IGcgJiYgZyA9PSBiKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldChtX3BCdWZmZXIsIHIsIG1fUGl0Y2ggKiBtX0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVfcG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BCdWZmZXJbYnl0ZV9wb3MrK10gPSBiOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9wQnVmZmVyW2J5dGVfcG9zKytdID0gZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEJ1ZmZlcltieXRlX3BvcysrXSA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMTsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2gsIG1fcEJ1ZmZlciwgbV9QaXRjaCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiMzI6Ci0gICAgICAgIGNhc2UgRlhESUJfQXJnYjogewotICAgICAgICAgICAgICAgIGNvbG9yID0gSXNDbXlrSW1hZ2UoKSA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9XaWR0aDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAoKEZYX0RXT1JEKiltX3BCdWZmZXIpW2ldID0gY29sb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2gsIG1fcEJ1ZmZlciwgbV9QaXRjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotdm9pZCBDRlhfRElCU291cmNlOjpHZXRPdmVybGFwUmVjdChpbnQmIGRlc3RfbGVmdCwgaW50JiBkZXN0X3RvcCwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LCBpbnQmIHNyY19sZWZ0LCBpbnQmIHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbikKLXsKLSAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFTU0VSVCh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCk7Ci0gICAgaWYgKGRlc3RfbGVmdCA+IG1fV2lkdGggfHwgZGVzdF90b3AgPiBtX0hlaWdodCkgewotICAgICAgICB3aWR0aCA9IDA7Ci0gICAgICAgIGhlaWdodCA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IHhfb2Zmc2V0ID0gZGVzdF9sZWZ0IC0gc3JjX2xlZnQ7Ci0gICAgaW50IHlfb2Zmc2V0ID0gZGVzdF90b3AgLSBzcmNfdG9wOwotICAgIEZYX1JFQ1Qgc3JjX3JlY3Qoc3JjX2xlZnQsIHNyY190b3AsIHNyY19sZWZ0ICsgd2lkdGgsIHNyY190b3AgKyBoZWlnaHQpOwotICAgIEZYX1JFQ1Qgc3JjX2JvdW5kKDAsIDAsIHNyY193aWR0aCwgc3JjX2hlaWdodCk7Ci0gICAgc3JjX3JlY3QuSW50ZXJzZWN0KHNyY19ib3VuZCk7Ci0gICAgRlhfUkVDVCBkZXN0X3JlY3Qoc3JjX3JlY3QubGVmdCArIHhfb2Zmc2V0LCBzcmNfcmVjdC50b3AgKyB5X29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBzcmNfcmVjdC5yaWdodCArIHhfb2Zmc2V0LCBzcmNfcmVjdC5ib3R0b20gKyB5X29mZnNldCk7Ci0gICAgRlhfUkVDVCBkZXN0X2JvdW5kKDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKLSAgICBkZXN0X3JlY3QuSW50ZXJzZWN0KGRlc3RfYm91bmQpOwotICAgIGlmIChwQ2xpcFJnbikgewotICAgICAgICBkZXN0X3JlY3QuSW50ZXJzZWN0KHBDbGlwUmduLT5HZXRCb3goKSk7Ci0gICAgfQotICAgIGRlc3RfbGVmdCA9IGRlc3RfcmVjdC5sZWZ0OwotICAgIGRlc3RfdG9wID0gZGVzdF9yZWN0LnRvcDsKLSAgICBzcmNfbGVmdCA9IGRlc3RfbGVmdCAtIHhfb2Zmc2V0OwotICAgIHNyY190b3AgPSBkZXN0X3RvcCAtIHlfb2Zmc2V0OwotICAgIHdpZHRoID0gZGVzdF9yZWN0LnJpZ2h0IC0gZGVzdF9yZWN0LmxlZnQ7Ci0gICAgaGVpZ2h0ID0gZGVzdF9yZWN0LmJvdHRvbSAtIGRlc3RfcmVjdC50b3A7Ci19Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6VHJhbnNmZXJCaXRtYXAoaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLT5HZXRXaWR0aCgpLCBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKSwgc3JjX2xlZnQsIHNyY190b3AsIE5VTEwpOwotICAgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQgPSBHZXRGb3JtYXQoKTsKLSAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpOwotICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0ICYmIHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICBpZiAoR2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaDsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWyhkZXN0X2xlZnQgKyBjb2wpIC8gOF0gfD0gMSA8PCAoNyAtIChkZXN0X2xlZnQgKyBjb2wpICUgOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bKGRlc3RfbGVmdCArIGNvbCkgLyA4XSAmPSB+KDEgPDwgKDcgLSAoZGVzdF9sZWZ0ICsgY29sKSAlIDgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBCcHAgPSBHZXRCUFAoKSAvIDg7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogQnBwOwotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIEJwcDsKLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGggKiBCcHApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9icHAgPT0gOCkgewotICAgICAgICAgICAgZGVzdF9mb3JtYXQgPSBGWERJQl84YnBwTWFzazsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiA9IG1fcEJ1ZmZlciArIGRlc3RfdG9wICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIEdldEJQUCgpIC8gODsKLSAgICAgICAgRlhfRFdPUkQqIGRfcGx0ID0gTlVMTDsKLSAgICAgICAgaWYoIUNvbnZlcnRCdWZmZXIoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBtX1BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgZF9wbHQsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9CitGWF9CT09MIENGWF9ESUJpdG1hcDo6VHJhbnNmZXJCaXRtYXAoaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBOVUxMKTsKKyAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKICAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpUcmFuc2Zlck1hc2soaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLCBGWF9EV09SRCBjb2xvciwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQVNTRVJUKEhhc0FscGhhKCkgJiYgKG1fYnBwID49IDI0KSk7Ci0gICAgQVNTRVJUKHBNYXNrLT5Jc0FscGhhTWFzaygpKTsKLSAgICBpZiAoIUhhc0FscGhhKCkgfHwgIXBNYXNrLT5Jc0FscGhhTWFzaygpIHx8IG1fYnBwIDwgMjQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwTWFzay0+R2V0V2lkdGgoKSwgcE1hc2stPkdldEhlaWdodCgpLCBzcmNfbGVmdCwgc3JjX3RvcCwgTlVMTCk7Ci0gICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGludCBzcmNfYnBwID0gcE1hc2stPkdldEJQUCgpOwotICAgIGludCBhbHBoYTsKLSAgICBGWF9EV09SRCBkc3RfY29sb3I7Ci0gICAgaWYgKGFscGhhX2ZsYWcgPj4gOCkgewotICAgICAgICBhbHBoYSA9IGFscGhhX2ZsYWcgJiAweGZmOwotICAgICAgICBkc3RfY29sb3IgPSBGWENNWUtfVE9ESUIoY29sb3IpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFscGhhID0gRlhBUkdCX0EoY29sb3IpOwotICAgICAgICBkc3RfY29sb3IgPSBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgIH0KLSAgICB1aW50OF90KiBjb2xvcl9wID0gKHVpbnQ4X3QqKSZkc3RfY29sb3I7Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0gJiYgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSAmJiBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGNvbG9yX3AsIGNvbG9yX3AsIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhbHBoYV9mbGFnID4+IDggJiYgIUlzQ215a0ltYWdlKCkpCi0gICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9wWzJdLCBjb2xvcl9wWzFdLCBjb2xvcl9wWzBdKTsKLSAgICAgICAgZWxzZSBpZiAoIShhbHBoYV9mbGFnID4+IDgpICYmIElzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZighSXNDbXlrSW1hZ2UoKSkgewotICAgICAgICBjb2xvcl9wWzNdID0gKHVpbnQ4X3QpYWxwaGE7Ci0gICAgfQotICAgIGlmIChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9EV09SRCogZGVzdF9wb3MgPSAoRlhfRFdPUkQqKShtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIDQpOwotICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwTWFzay0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7Ci0gICAgICAgICAgICBpZiAoc3JjX2JwcCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2JpdHBvcyA9IHNyY19sZWZ0ICsgY29sOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3NjYW5bc3JjX2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBzcmNfYml0cG9zICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9wb3MgPSBkc3RfY29sb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9wb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2xlZnQ7Ci0gICAgICAgICAgICAgICAgZHN0X2NvbG9yID0gRlhBUkdCX1RPRElCKGRzdF9jb2xvcik7Ci0gICAgICAgICAgICAgICAgZHN0X2NvbG9yICY9IDB4ZmZmZmZmOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3BvcysrLCBkc3RfY29sb3IgfCAoKGFscGhhICogKCpzcmNfc2NhbisrKSAvIDI1NSkgPDwgMjQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgY29tcHMgPSBtX2JwcCAvIDg7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0X2NvbG9yX3BvcyA9IG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogY29tcHM7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3BvcyA9ICh1aW50OF90KiltX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGRlc3RfdG9wICsgcm93KSArIGRlc3RfbGVmdDsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcE1hc2stPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOwotICAgICAgICAgICAgaWYgKHNyY19icHAgPT0gMSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iaXRwb3MgPSBzcmNfbGVmdCArIGNvbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19zY2FuW3NyY19iaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gc3JjX2JpdHBvcyAlIDgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfY29sb3JfcG9zLCBjb2xvcl9wLCBjb21wcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9wb3MgPSAweGZmOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfY29sb3JfcG9zLCAwLCBjb21wcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9wb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfY29sb3JfcG9zICs9IGNvbXBzOwotICAgICAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3BvcyArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19sZWZ0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfY29sb3JfcG9zLCBjb2xvcl9wLCBjb21wcyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfY29sb3JfcG9zICs9IGNvbXBzOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9wb3MrKyA9IChhbHBoYSAqICgqc3JjX3NjYW4rKykgLyAyNTUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ0ZYX0RJQlNvdXJjZTo6Q29weVBhbGV0dGUoY29uc3QgRlhfRFdPUkQqIHBTcmMsIEZYX0RXT1JEIHNpemUpCi17Ci0gICAgaWYgKHBTcmMgPT0gTlVMTCB8fCBHZXRCUFAoKSA+IDgpIHsKLSAgICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9wUGFsZXR0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wUGFsZXR0ZSA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhfRFdPUkQgcGFsX3NpemUgPSAxIDw8IEdldEJQUCgpOwotICAgICAgICBpZiAobV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtX3BQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIHBhbF9zaXplKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFsX3NpemUgPiBzaXplKSB7Ci0gICAgICAgICAgICBwYWxfc2l6ZSA9IHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFBhbGV0dGUsIHBTcmMsIHBhbF9zaXplICogc2l6ZW9mKEZYX0RXT1JEKSk7Ci0gICAgfQotfQotdm9pZCBDRlhfRElCU291cmNlOjpHZXRQYWxldHRlKEZYX0RXT1JEKiBwYWwsIGludCBhbHBoYSkgY29uc3QKLXsKLSAgICBBU1NFUlQoR2V0QlBQKCkgPD0gOCAmJiAhSXNDbXlrSW1hZ2UoKSk7CisgIH0KKyAgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0ID0gR2V0Rm9ybWF0KCk7CisgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0ID0gcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCk7CisgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0ICYmIHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCkgewogICAgIGlmIChHZXRCUFAoKSA9PSAxKSB7Ci0gICAgICAgIHBhbFswXSA9ICgobV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbMF0gOiAweGZmMDAwMDAwKSAmIDB4ZmZmZmZmKSB8IChhbHBoYSA8PCAyNCk7Ci0gICAgICAgIHBhbFsxXSA9ICgobV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbMV0gOiAweGZmZmZmZmZmKSAmIDB4ZmZmZmZmKSB8IChhbHBoYSA8PCAyNCk7Ci0gICAgICAgIHJldHVybjsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgKGRlc3RfdG9wICsgcm93KSAqIG1fUGl0Y2g7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJgorICAgICAgICAgICAgICAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKKyAgICAgICAgICAgIGRlc3Rfc2NhblsoZGVzdF9sZWZ0ICsgY29sKSAvIDhdIHw9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICg3IC0gKGRlc3RfbGVmdCArIGNvbCkgJSA4KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdF9zY2FuWyhkZXN0X2xlZnQgKyBjb2wpIC8gOF0gJj0KKyAgICAgICAgICAgICAgICB+KDEgPDwgKDcgLSAoZGVzdF9sZWZ0ICsgY29sKSAlIDgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW50IEJwcCA9IEdldEJQUCgpIC8gODsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgICAgIG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogQnBwOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogQnBwOworICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGggKiBCcHApOworICAgICAgfQogICAgIH0KKyAgfSBlbHNlIHsKICAgICBpZiAobV9wUGFsZXR0ZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgcGFsW2ldID0gKG1fcFBhbGV0dGVbaV0gJiAweDAwZmZmZmZmKSB8IChhbHBoYSA8PCAyNCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgcGFsW2ldID0gKGkgKiAweDEwMTAxKSB8IChhbHBoYSA8PCAyNCk7Ci0gICAgICAgIH0KKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgICAgaWYgKG1fYnBwID09IDgpIHsKKyAgICAgIGRlc3RfZm9ybWF0ID0gRlhESUJfOGJwcE1hc2s7CisgICAgfQorICAgIHVpbnQ4X3QqIGRlc3RfYnVmID0KKyAgICAgICAgbV9wQnVmZmVyICsgZGVzdF90b3AgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogR2V0QlBQKCkgLyA4OworICAgIEZYX0RXT1JEKiBkX3BsdCA9IE5VTEw7CisgICAgaWYgKCFDb252ZXJ0QnVmZmVyKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgbV9QaXRjaCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIGRfcGx0LCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUNGWF9ESUJpdG1hcCogQ0ZYX0RJQlNvdXJjZTo6R2V0QWxwaGFNYXNrKGNvbnN0IEZYX1JFQ1QqIHBDbGlwKSBjb25zdAotewotICAgIEFTU0VSVChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKTsKLSAgICBGWF9SRUNUIHJlY3QoMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQpOwotICAgIGlmIChwQ2xpcCkgewotICAgICAgICByZWN0LkludGVyc2VjdCgqcENsaXApOwotICAgICAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9ESUJpdG1hcCogcE1hc2sgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghcE1hc2spIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghcE1hc2stPkNyZWF0ZShyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IEdldFNjYW5saW5lKHJvdykgKyByZWN0LmxlZnQgKiA0ICsgMzsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gKHVpbnQ4X3QqKXBNYXNrLT5HZXRTY2FubGluZShyb3cgLSByZWN0LnRvcCk7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IHJlY3QubGVmdDsgY29sIDwgcmVjdC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gKnNyY19zY2FuOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcE1hc2s7Ci19Ci1GWF9CT09MIENGWF9ESUJTb3VyY2U6OkNvcHlBbHBoYU1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzaywgY29uc3QgRlhfUkVDVCogcENsaXApCi17Ci0gICAgaWYgKCFIYXNBbHBoYSgpIHx8IEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocEFscGhhTWFzaykgewotICAgICAgICBGWF9SRUNUIHJlY3QoMCwgMCwgcEFscGhhTWFzay0+bV9XaWR0aCwgcEFscGhhTWFzay0+bV9IZWlnaHQpOwotICAgICAgICBpZiAocENsaXApIHsKLSAgICAgICAgICAgIHJlY3QuSW50ZXJzZWN0KCpwQ2xpcCk7Ci0gICAgICAgICAgICBpZiAocmVjdC5Jc0VtcHR5KCkgfHwgcmVjdC5XaWR0aCgpICE9IG1fV2lkdGggfHwgcmVjdC5IZWlnaHQoKSAhPSBtX0hlaWdodCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwQWxwaGFNYXNrLT5tX1dpZHRoICE9IG1fV2lkdGggfHwgcEFscGhhTWFzay0+bV9IZWlnaHQgIT0gbV9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykKLSAgICAgICAgICAgIEZYU1lTX21lbWNweSgodm9pZCopbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93ICsgcmVjdC50b3ApICsgcmVjdC5sZWZ0LCBtX3BBbHBoYU1hc2stPm1fUGl0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcEFscGhhTWFzay0+Q2xlYXIoMHhmZjAwMDAwMCk7Ci0gICAgfQorRlhfQk9PTCBDRlhfRElCaXRtYXA6OlRyYW5zZmVyTWFzayhpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQVNTRVJUKEhhc0FscGhhKCkgJiYgKG1fYnBwID49IDI0KSk7CisgIEFTU0VSVChwTWFzay0+SXNBbHBoYU1hc2soKSk7CisgIGlmICghSGFzQWxwaGEoKSB8fCAhcE1hc2stPklzQWxwaGFNYXNrKCkgfHwgbV9icHAgPCAyNCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwTWFzay0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgcE1hc2stPkdldEhlaWdodCgpLCBzcmNfbGVmdCwgc3JjX3RvcCwgTlVMTCk7CisgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaW50IHNyY19icHAgPSBwTWFzay0+R2V0QlBQKCk7CisgIGludCBhbHBoYTsKKyAgRlhfRFdPUkQgZHN0X2NvbG9yOworICBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7CisgICAgYWxwaGEgPSBhbHBoYV9mbGFnICYgMHhmZjsKKyAgICBkc3RfY29sb3IgPSBGWENNWUtfVE9ESUIoY29sb3IpOworICB9IGVsc2UgeworICAgIGFscGhhID0gRlhBUkdCX0EoY29sb3IpOworICAgIGRzdF9jb2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7CisgIH0KKyAgdWludDhfdCogY29sb3JfcCA9ICh1aW50OF90KikmZHN0X2NvbG9yOworICBpZiAocEljY1RyYW5zZm9ybSAmJiBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpICYmCisgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgeworICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBjb2xvcl9wLCBjb2xvcl9wLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoYWxwaGFfZmxhZyA+PiA4ICYmICFJc0NteWtJbWFnZSgpKQorICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9wWzJdLCBjb2xvcl9wWzFdLCBjb2xvcl9wWzBdKTsKKyAgICBlbHNlIGlmICghKGFscGhhX2ZsYWcgPj4gOCkgJiYgSXNDbXlrSW1hZ2UoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBpZiAoIUlzQ215a0ltYWdlKCkpIHsKKyAgICBjb2xvcl9wWzNdID0gKHVpbnQ4X3QpYWxwaGE7CisgIH0KKyAgaWYgKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICBGWF9EV09SRCogZGVzdF9wb3MgPQorICAgICAgICAgIChGWF9EV09SRCopKG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogNCk7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBNYXNrLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KTsKKyAgICAgIGlmIChzcmNfYnBwID09IDEpIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgaW50IHNyY19iaXRwb3MgPSBzcmNfbGVmdCArIGNvbDsKKyAgICAgICAgICBpZiAoc3JjX3NjYW5bc3JjX2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBzcmNfYml0cG9zICUgOCkpKSB7CisgICAgICAgICAgICAqZGVzdF9wb3MgPSBkc3RfY29sb3I7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3BvcyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3RfcG9zKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19sZWZ0OworICAgICAgICBkc3RfY29sb3IgPSBGWEFSR0JfVE9ESUIoZHN0X2NvbG9yKTsKKyAgICAgICAgZHN0X2NvbG9yICY9IDB4ZmZmZmZmOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3RfcG9zKyssCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RfY29sb3IgfCAoKGFscGhhICogKCpzcmNfc2NhbisrKSAvIDI1NSkgPDwgMjQpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgY29tcHMgPSBtX2JwcCAvIDg7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9jb2xvcl9wb3MgPQorICAgICAgICAgIG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogY29tcHM7CisgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3BvcyA9CisgICAgICAgICAgKHVpbnQ4X3QqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUoZGVzdF90b3AgKyByb3cpICsgZGVzdF9sZWZ0OworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwTWFzay0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7CisgICAgICBpZiAoc3JjX2JwcCA9PSAxKSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgIGludCBzcmNfYml0cG9zID0gc3JjX2xlZnQgKyBjb2w7CisgICAgICAgICAgaWYgKHNyY19zY2FuW3NyY19iaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gc3JjX2JpdHBvcyAlIDgpKSkgeworICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfY29sb3JfcG9zLCBjb2xvcl9wLCBjb21wcyk7CisgICAgICAgICAgICAqZGVzdF9hbHBoYV9wb3MgPSAweGZmOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGWFNZU19tZW1zZXQoZGVzdF9jb2xvcl9wb3MsIDAsIGNvbXBzKTsKKyAgICAgICAgICAgICpkZXN0X2FscGhhX3BvcyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3RfY29sb3JfcG9zICs9IGNvbXBzOworICAgICAgICAgIGRlc3RfYWxwaGFfcG9zKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19sZWZ0OworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9jb2xvcl9wb3MsIGNvbG9yX3AsIGNvbXBzKTsKKyAgICAgICAgICBkZXN0X2NvbG9yX3BvcyArPSBjb21wczsKKyAgICAgICAgICAqZGVzdF9hbHBoYV9wb3MrKyA9IChhbHBoYSAqICgqc3JjX3NjYW4rKykgLyAyNTUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQordm9pZCBDRlhfRElCU291cmNlOjpDb3B5UGFsZXR0ZShjb25zdCBGWF9EV09SRCogcFNyYywgRlhfRFdPUkQgc2l6ZSkgeworICBpZiAocFNyYyA9PSBOVUxMIHx8IEdldEJQUCgpID4gOCkgeworICAgIGlmIChtX3BQYWxldHRlKSB7CisgICAgICBGWF9GcmVlKG1fcFBhbGV0dGUpOworICAgIH0KKyAgICBtX3BQYWxldHRlID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBGWF9EV09SRCBwYWxfc2l6ZSA9IDEgPDwgR2V0QlBQKCk7CisgICAgaWYgKG1fcFBhbGV0dGUgPT0gTlVMTCkgeworICAgICAgbV9wUGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0RXT1JELCBwYWxfc2l6ZSk7CisgICAgfQorICAgIGlmIChwYWxfc2l6ZSA+IHNpemUpIHsKKyAgICAgIHBhbF9zaXplID0gc2l6ZTsKKyAgICB9CisgICAgRlhTWVNfbWVtY3B5KG1fcFBhbGV0dGUsIHBTcmMsIHBhbF9zaXplICogc2l6ZW9mKEZYX0RXT1JEKSk7CisgIH0KK30KK3ZvaWQgQ0ZYX0RJQlNvdXJjZTo6R2V0UGFsZXR0ZShGWF9EV09SRCogcGFsLCBpbnQgYWxwaGEpIGNvbnN0IHsKKyAgQVNTRVJUKEdldEJQUCgpIDw9IDggJiYgIUlzQ215a0ltYWdlKCkpOworICBpZiAoR2V0QlBQKCkgPT0gMSkgeworICAgIHBhbFswXSA9CisgICAgICAgICgobV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbMF0gOiAweGZmMDAwMDAwKSAmIDB4ZmZmZmZmKSB8IChhbHBoYSA8PCAyNCk7CisgICAgcGFsWzFdID0KKyAgICAgICAgKChtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVsxXSA6IDB4ZmZmZmZmZmYpICYgMHhmZmZmZmYpIHwgKGFscGhhIDw8IDI0KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBwYWxbaV0gPSAobV9wUGFsZXR0ZVtpXSAmIDB4MDBmZmZmZmYpIHwgKGFscGhhIDw8IDI0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgcGFsW2ldID0gKGkgKiAweDEwMTAxKSB8IChhbHBoYSA8PCAyNCk7CisgICAgfQorICB9Cit9CitDRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkdldEFscGhhTWFzayhjb25zdCBGWF9SRUNUKiBwQ2xpcCkgY29uc3QgeworICBBU1NFUlQoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7CisgIEZYX1JFQ1QgcmVjdCgwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCk7CisgIGlmIChwQ2xpcCkgeworICAgIHJlY3QuSW50ZXJzZWN0KCpwQ2xpcCk7CisgICAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IEZYX05FVyBDRlhfRElCaXRtYXA7CisgIGlmICghcE1hc2spIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoIXBNYXNrLT5DcmVhdGUocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBGWERJQl84YnBwTWFzaykpIHsKKyAgICBkZWxldGUgcE1hc2s7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgeworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gR2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdCAqIDQgKyAzOworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9ICh1aW50OF90KilwTWFzay0+R2V0U2NhbmxpbmUocm93IC0gcmVjdC50b3ApOworICAgIGZvciAoaW50IGNvbCA9IHJlY3QubGVmdDsgY29sIDwgcmVjdC5yaWdodDsgY29sKyspIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbjsKKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgfQorICB9CisgIHJldHVybiBwTWFzazsKK30KK0ZYX0JPT0wgQ0ZYX0RJQlNvdXJjZTo6Q29weUFscGhhTWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwKSB7CisgIGlmICghSGFzQWxwaGEoKSB8fCBHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChwQWxwaGFNYXNrKSB7CisgICAgRlhfUkVDVCByZWN0KDAsIDAsIHBBbHBoYU1hc2stPm1fV2lkdGgsIHBBbHBoYU1hc2stPm1fSGVpZ2h0KTsKKyAgICBpZiAocENsaXApIHsKKyAgICAgIHJlY3QuSW50ZXJzZWN0KCpwQ2xpcCk7CisgICAgICBpZiAocmVjdC5Jc0VtcHR5KCkgfHwgcmVjdC5XaWR0aCgpICE9IG1fV2lkdGggfHwKKyAgICAgICAgICByZWN0LkhlaWdodCgpICE9IG1fSGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHBBbHBoYU1hc2stPm1fV2lkdGggIT0gbV9XaWR0aCB8fCBwQWxwaGFNYXNrLT5tX0hlaWdodCAhPSBtX0hlaWdodCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykKKyAgICAgIEZYU1lTX21lbWNweSgodm9pZCopbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpLAorICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyArIHJlY3QudG9wKSArIHJlY3QubGVmdCwKKyAgICAgICAgICAgICAgICAgICBtX3BBbHBoYU1hc2stPm1fUGl0Y2gpOworICB9IGVsc2UgeworICAgIG1fcEFscGhhTWFzay0+Q2xlYXIoMHhmZjAwMDAwMCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiBjb25zdCBpbnQgZ19DaGFubmVsT2Zmc2V0W10gPSB7MCwgMiwgMSwgMCwgMCwgMSwgMiwgMywgM307Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6TG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgRlhESUJfQ2hhbm5lbCBzcmNDaGFubmVsKQotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGWF9ESUJpdG1hcDo6TG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0NoYW5uZWwgc3JjQ2hhbm5lbCkgeworICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0RJQlNvdXJjZSogcFNyY0Nsb25lID0gKENGWF9ESUJTb3VyY2UqKXBTcmNCaXRtYXA7CisgIENGWF9ESUJpdG1hcCogcERzdCA9IHRoaXM7CisgIGludCBkZXN0T2Zmc2V0LCBzcmNPZmZzZXQ7CisgIGlmIChzcmNDaGFubmVsID09IEZYRElCX0FscGhhKSB7CisgICAgaWYgKCFwU3JjQml0bWFwLT5IYXNBbHBoYSgpICYmICFwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIENGWF9ESUJTb3VyY2UqIHBTcmNDbG9uZSA9IChDRlhfRElCU291cmNlKilwU3JjQml0bWFwOwotICAgIENGWF9ESUJpdG1hcCogcERzdCA9IHRoaXM7Ci0gICAgaW50IGRlc3RPZmZzZXQsIHNyY09mZnNldDsKLSAgICBpZiAoc3JjQ2hhbm5lbCA9PSBGWERJQl9BbHBoYSkgewotICAgICAgICBpZiAoIXBTcmNCaXRtYXAtPkhhc0FscGhhKCkgJiYgIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgcFNyY0Nsb25lID0gcFNyY0JpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCXzhicHBNYXNrKTsKLSAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgICAgICBzcmNPZmZzZXQgPSAzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgfQorICAgIGlmIChwU3JjQml0bWFwLT5HZXRCUFAoKSA9PSAxKSB7CisgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfOGJwcE1hc2spOworICAgICAgaWYgKHBTcmNDbG9uZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKKyAgICAgIHNyY09mZnNldCA9IDM7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0QlBQKCkgPCAyNCkgewotICAgICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5DbG9uZUNvbnZlcnQoKEZYRElCX0Zvcm1hdCkoKHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpICYgMHhmZjAwKSB8IDB4MjApKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFNyY0Nsb25lID0gcFNyY0JpdG1hcC0+Q2xvbmVDb252ZXJ0KChGWERJQl9Gb3JtYXQpKChwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4ZmYwMCkgfCAweDE4KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocFNyY0Nsb25lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3JjT2Zmc2V0ID0gZ19DaGFubmVsT2Zmc2V0W3NyY0NoYW5uZWxdOworICAgICAgc3JjT2Zmc2V0ID0gMDsKICAgICB9Ci0gICAgaWYgKGRlc3RDaGFubmVsID09IEZYRElCX0FscGhhKSB7Ci0gICAgICAgIGlmIChJc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICBpZighQ29udmVydEZvcm1hdChGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdE9mZnNldCA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXN0T2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIGlmKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrYSA6IEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgICAgICAgICAgZGVzdE9mZnNldCA9IDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoSXNBbHBoYU1hc2soKSkgewotICAgICAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoR2V0QlBQKCkgPCAyNCkgewotICAgICAgICAgICAgaWYgKEhhc0FscGhhKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2IzMikpIHsKLSNlbHNlCi0gICAgICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiKSkgewotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlc3RPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbZGVzdENoYW5uZWxdOworICB9IGVsc2UgeworICAgIGlmIChwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmIChzcmNDaGFubmVsID09IEZYRElCX0FscGhhICYmIHBTcmNDbG9uZS0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcEFscGhhTWFzayA9IHBTcmNDbG9uZS0+bV9wQWxwaGFNYXNrOwotICAgICAgICBpZiAocFNyY0Nsb25lLT5HZXRXaWR0aCgpICE9IG1fV2lkdGggfHwgcFNyY0Nsb25lLT5HZXRIZWlnaHQoKSAhPSBtX0hlaWdodCkgewotICAgICAgICAgICAgaWYgKHBBbHBoYU1hc2spIHsKLSAgICAgICAgICAgICAgICBwQWxwaGFNYXNrID0gcEFscGhhTWFzay0+U3RyZXRjaFRvKG1fV2lkdGgsIG1fSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpZiAocEFscGhhTWFzayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewotICAgICAgICAgICAgcFNyY0Nsb25lLT5tX3BBbHBoYU1hc2sgPSBOVUxMOwotICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKLSAgICAgICAgfQotICAgICAgICBwU3JjQ2xvbmUgPSBwQWxwaGFNYXNrOwotICAgICAgICBzcmNPZmZzZXQgPSAwOwotICAgIH0gZWxzZSBpZiAocFNyY0Nsb25lLT5HZXRXaWR0aCgpICE9IG1fV2lkdGggfHwgcFNyY0Nsb25lLT5HZXRIZWlnaHQoKSAhPSBtX0hlaWdodCkgewotICAgICAgICBDRlhfRElCaXRtYXAqIHBTcmNNYXRjaGVkID0gcFNyY0Nsb25lLT5TdHJldGNoVG8obV9XaWR0aCwgbV9IZWlnaHQpOwotICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBTcmNNYXRjaGVkID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjTWF0Y2hlZDsKLSAgICB9Ci0gICAgaWYgKGRlc3RDaGFubmVsID09IEZYRElCX0FscGhhICYmIG1fcEFscGhhTWFzaykgewotICAgICAgICBwRHN0ID0gbV9wQWxwaGFNYXNrOwotICAgICAgICBkZXN0T2Zmc2V0ID0gMDsKLSAgICB9Ci0gICAgaW50IHNyY0J5dGVzID0gcFNyY0Nsb25lLT5HZXRCUFAoKSAvIDg7Ci0gICAgaW50IGRlc3RCeXRlcyA9IHBEc3QtPkdldEJQUCgpIC8gODsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBEc3QtPkdldFNjYW5saW5lKHJvdykgKyBkZXN0T2Zmc2V0OwotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcG9zID0gcFNyY0Nsb25lLT5HZXRTY2FubGluZShyb3cpICsgc3JjT2Zmc2V0OwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICpkZXN0X3BvcyA9ICpzcmNfcG9zOwotICAgICAgICAgICAgZGVzdF9wb3MgKz0gZGVzdEJ5dGVzOwotICAgICAgICAgICAgc3JjX3BvcyArPSBzcmNCeXRlczsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXAgJiYgcFNyY0Nsb25lICE9IHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzaykgewotICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBpbnQgdmFsdWUpCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgaWYgKHBTcmNCaXRtYXAtPkdldEJQUCgpIDwgMjQpIHsKKyAgICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPkNsb25lQ29udmVydCgKKyAgICAgICAgICAgIChGWERJQl9Gb3JtYXQpKChwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4ZmYwMCkgfCAweDIwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5DbG9uZUNvbnZlcnQoCisgICAgICAgICAgICAoRlhESUJfRm9ybWF0KSgocFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCkgJiAweGZmMDApIHwgMHgxOCkpOworICAgICAgfQorICAgICAgaWYgKHBTcmNDbG9uZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KICAgICB9Ci0gICAgaW50IGRlc3RPZmZzZXQ7Ci0gICAgaWYgKGRlc3RDaGFubmVsID09IEZYRElCX0FscGhhKSB7Ci0gICAgICAgIGlmIChJc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICBpZighQ29udmVydEZvcm1hdChGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0T2Zmc2V0ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAwOwotICAgICAgICAgICAgaWYoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKElzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoR2V0QlBQKCkgPCAyNCkgewotICAgICAgICAgICAgaWYgKEhhc0FscGhhKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZQotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiMzIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBkZXN0T2Zmc2V0ID0gZ19DaGFubmVsT2Zmc2V0W2Rlc3RDaGFubmVsXTsKLSAgICB9Ci0gICAgaW50IEJwcCA9IEdldEJQUCgpIC8gODsKLSAgICBpZiAoQnBwID09IDEpIHsKLSAgICAgICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgdmFsdWUsIG1fSGVpZ2h0ICogbV9QaXRjaCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEgJiYgbV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIEZYU1lTX21lbXNldChtX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpLCB2YWx1ZSwgbV9wQWxwaGFNYXNrLT5HZXRIZWlnaHQoKSptX3BBbHBoYU1hc2stPkdldFBpdGNoKCkpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICB1aW50OF90KiBzY2FuX2xpbmUgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgZGVzdE9mZnNldDsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAqc2Nhbl9saW5lID0gdmFsdWU7Ci0gICAgICAgICAgICBzY2FuX2xpbmUgKz0gQnBwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6Ok11bHRpcGx5QWxwaGEoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCkKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBBU1NFUlQocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSk7Ci0gICAgaWYgKCFwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCFJc0FscGhhTWFzaygpICYmICFIYXNBbHBoYSgpKSB7Ci0gICAgICAgIHJldHVybiBMb2FkQ2hhbm5lbChGWERJQl9BbHBoYSwgcFNyY0JpdG1hcCwgRlhESUJfQWxwaGEpOwotICAgIH0KLSAgICBDRlhfRElCaXRtYXAqIHBTcmNDbG9uZSA9IChDRlhfRElCaXRtYXAqKXBTcmNCaXRtYXA7Ci0gICAgaWYgKHBTcmNCaXRtYXAtPkdldFdpZHRoKCkgIT0gbV9XaWR0aCB8fCBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKSAhPSBtX0hlaWdodCkgewotICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5TdHJldGNoVG8obV9XaWR0aCwgbV9IZWlnaHQpOwotICAgICAgICBBU1NFUlQocFNyY0Nsb25lICE9IE5VTEwpOwotICAgICAgICBpZiAocFNyY0Nsb25lID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KKyAgICBzcmNPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbc3JjQ2hhbm5lbF07CisgIH0KKyAgaWYgKGRlc3RDaGFubmVsID09IEZYRElCX0FscGhhKSB7CiAgICAgaWYgKElzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgaWYoIUNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKSkgeworICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKKyAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIG1fUGl0Y2ggKiByb3c7Ci0gICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNDbG9uZS0+bV9wQnVmZmVyICsgcFNyY0Nsb25lLT5tX1BpdGNoICogcm93OwotICAgICAgICAgICAgaWYgKHBTcmNDbG9uZS0+R2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoISgoMSA8PCAoNyAtIGNvbCAlIDgpKSAmIHNyY19zY2FuW2NvbCAvIDhdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2NvbF0gPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICgqZGVzdF9zY2FuKSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgZGVzdE9mZnNldCA9IDA7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgaWYgKHBTcmNDbG9uZS0+R2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgbV9QaXRjaCAqIHJvdyArIDM7Ci0gICAgICAgICAgICAgICAgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQ2xvbmUtPm1fcEJ1ZmZlciArIHBTcmNDbG9uZS0+bV9QaXRjaCAqIHJvdzsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICgqZGVzdF9zY2FuKSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcEFscGhhTWFzay0+TXVsdGlwbHlBbHBoYShwU3JjQ2xvbmUpOworICAgICAgZGVzdE9mZnNldCA9IDA7CisgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpIHsKKyAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CisgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgeworICAgICAgICBkZXN0T2Zmc2V0ID0gMzsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKElzQWxwaGFNYXNrKCkpIHsKKyAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgeworICAgICAgICBkZWxldGUgcFNyY0Nsb25lOworICAgICAgfQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoR2V0QlBQKCkgPCAyNCkgeworICAgICAgaWYgKEhhc0FscGhhKCkpIHsKKyAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrYSA6IEZYRElCX0FyZ2IpKSB7CisgICAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CisgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiMzIpKSB7CisjZWxzZQorICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYikpIHsKKyNlbmRpZgorICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKKyAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgZGVzdE9mZnNldCA9IGdfQ2hhbm5lbE9mZnNldFtkZXN0Q2hhbm5lbF07CisgIH0KKyAgaWYgKHNyY0NoYW5uZWwgPT0gRlhESUJfQWxwaGEgJiYgcFNyY0Nsb25lLT5tX3BBbHBoYU1hc2spIHsKKyAgICBDRlhfRElCaXRtYXAqIHBBbHBoYU1hc2sgPSBwU3JjQ2xvbmUtPm1fcEFscGhhTWFzazsKKyAgICBpZiAocFNyY0Nsb25lLT5HZXRXaWR0aCgpICE9IG1fV2lkdGggfHwKKyAgICAgICAgcFNyY0Nsb25lLT5HZXRIZWlnaHQoKSAhPSBtX0hlaWdodCkgeworICAgICAgaWYgKHBBbHBoYU1hc2spIHsKKyAgICAgICAgcEFscGhhTWFzayA9IHBBbHBoYU1hc2stPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7CisgICAgICAgIGlmIChwQWxwaGFNYXNrID09IE5VTEwpIHsKKyAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKKyAgICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKLSAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKKyAgICAgIHBTcmNDbG9uZS0+bV9wQWxwaGFNYXNrID0gTlVMTDsKKyAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHBTcmNDbG9uZSA9IHBBbHBoYU1hc2s7CisgICAgc3JjT2Zmc2V0ID0gMDsKKyAgfSBlbHNlIGlmIChwU3JjQ2xvbmUtPkdldFdpZHRoKCkgIT0gbV9XaWR0aCB8fAorICAgICAgICAgICAgIHBTcmNDbG9uZS0+R2V0SGVpZ2h0KCkgIT0gbV9IZWlnaHQpIHsKKyAgICBDRlhfRElCaXRtYXAqIHBTcmNNYXRjaGVkID0gcFNyY0Nsb25lLT5TdHJldGNoVG8obV9XaWR0aCwgbV9IZWlnaHQpOworICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgeworICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKKyAgICB9CisgICAgaWYgKHBTcmNNYXRjaGVkID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcFNyY0Nsb25lID0gcFNyY01hdGNoZWQ7CisgIH0KKyAgaWYgKGRlc3RDaGFubmVsID09IEZYRElCX0FscGhhICYmIG1fcEFscGhhTWFzaykgeworICAgIHBEc3QgPSBtX3BBbHBoYU1hc2s7CisgICAgZGVzdE9mZnNldCA9IDA7CisgIH0KKyAgaW50IHNyY0J5dGVzID0gcFNyY0Nsb25lLT5HZXRCUFAoKSAvIDg7CisgIGludCBkZXN0Qnl0ZXMgPSBwRHN0LT5HZXRCUFAoKSAvIDg7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBEc3QtPkdldFNjYW5saW5lKHJvdykgKyBkZXN0T2Zmc2V0OworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MgPSBwU3JjQ2xvbmUtPkdldFNjYW5saW5lKHJvdykgKyBzcmNPZmZzZXQ7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICpkZXN0X3BvcyA9ICpzcmNfcG9zOworICAgICAgZGVzdF9wb3MgKz0gZGVzdEJ5dGVzOworICAgICAgc3JjX3BvcyArPSBzcmNCeXRlczsKKyAgICB9CisgIH0KKyAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwICYmIHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwLT5tX3BBbHBoYU1hc2spIHsKKyAgICBkZWxldGUgcFNyY0Nsb25lOworICB9CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkdldEdyYXlEYXRhKHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc3dpdGNoIChHZXRGb3JtYXQoKSkgewotICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsKLSAgICAgICAgICAgICAgICBpZiAobV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdWludDhfdCBncmF5WzJdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgciA9ICh1aW50OF90KShtX3BQYWxldHRlW2ldID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGcgPSAodWludDhfdCkobV9wUGFsZXR0ZVtpXSA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIgPSAodWludDhfdCltX3BQYWxldHRlW2ldOwotICAgICAgICAgICAgICAgICAgICBncmF5W2ldID0gKHVpbnQ4X3QpRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0gICAgICAgICAgICAgICAgaWYgKCFwTWFzaykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQocE1hc2stPkdldEJ1ZmZlcigpLCBncmF5WzBdLCBwTWFzay0+R2V0UGl0Y2goKSAqIG1fSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19wb3MgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOwotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9ICh1aW50OF90KilwTWFzay0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3Bvc1tjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfcG9zID0gZ3JheVsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zICsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRha2VPdmVyKHBNYXNrKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogewotICAgICAgICAgICAgICAgIGlmIChtX3BQYWxldHRlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50OF90IGdyYXlbMjU2XTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgciA9ICh1aW50OF90KShtX3BQYWxldHRlW2ldID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGcgPSAodWludDhfdCkobV9wUGFsZXR0ZVtpXSA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIgPSAodWludDhfdCltX3BQYWxldHRlW2ldOwotICAgICAgICAgICAgICAgICAgICBncmF5W2ldID0gKHVpbnQ4X3QpRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0gICAgICAgICAgICAgICAgaWYgKCFwTWFzaykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gcE1hc2stPkdldEJ1ZmZlcigpICsgcm93ICogcE1hc2stPkdldFBpdGNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19wb3MgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3BvcyArKyA9IGdyYXlbKnNyY19wb3MgKytdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRha2VPdmVyKHBNYXNrKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiOiB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0gICAgICAgICAgICAgICAgaWYgKCFwTWFzaykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19wb3MgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOwotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9IHBNYXNrLT5HZXRCdWZmZXIoKSArIHJvdyAqIHBNYXNrLT5HZXRQaXRjaCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3BvcyArKyA9IEZYUkdCMkdSQVkoc3JjX3Bvc1syXSwgc3JjX3Bvc1sxXSwgKnNyY19wb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BvcyArPSAzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRha2VPdmVyKHBNYXNrKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsKLSAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKLSAgICAgICAgICAgICAgICBpZiAoIXBNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFwTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBNYXNrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gcE1hc2stPkdldEJ1ZmZlcigpICsgcm93ICogcE1hc2stPkdldFBpdGNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfcG9zICsrID0gRlhSR0IyR1JBWShzcmNfcG9zWzJdLCBzcmNfcG9zWzFdLCAqc3JjX3Bvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfcG9zICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVGFrZU92ZXIocE1hc2spOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6TXVsdGlwbHlBbHBoYShpbnQgYWxwaGEpCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc3dpdGNoIChHZXRGb3JtYXQoKSkgewotICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOgotICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE11bHRpcGx5QWxwaGEoYWxwaGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6IHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9saW5lW2NvbF0gPSBzY2FuX2xpbmVbY29sXSAqIGFscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCX0FyZ2I6IHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2ggKyAzOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2xpbmUgPSAoKnNjYW5fbGluZSkgKiBhbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fbGluZSArPSA0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKEhhc0FscGhhKCkpIHsKLSAgICAgICAgICAgICAgICBtX3BBbHBoYU1hc2stPk11bHRpcGx5QWxwaGEoYWxwaGEpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KChGWERJQl9Gb3JtYXQpKEdldEZvcm1hdCgpIHwgMHgwMjAwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BBbHBoYU1hc2stPk11bHRpcGx5QWxwaGEoYWxwaGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoRlhESUJfQXJnYikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNdWx0aXBseUFscGhhKGFscGhhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0RXT1JEIENGWF9ESUJpdG1hcDo6R2V0UGl4ZWwoaW50IHgsIGludCB5KSBjb25zdAotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgdWludDhfdCogcG9zID0gbV9wQnVmZmVyICsgeSAqIG1fUGl0Y2ggKyB4ICogR2V0QlBQKCkgLyA4OwotICAgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKLSAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazogewotICAgICAgICAgICAgICAgIGlmICgoKnBvcykgJiAoMSA8PCAoNyAtIHggJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmYwMDAwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsKLSAgICAgICAgICAgICAgICBpZiAoKCpwb3MpICYgKDEgPDwgKDcgLSB4ICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVsxXSA6IDB4ZmZmZmZmZmY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVswXSA6IDB4ZmYwMDAwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6Ci0gICAgICAgICAgICByZXR1cm4gKCpwb3MpIDw8IDI0OwotICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6Ci0gICAgICAgICAgICByZXR1cm4gbV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbKnBvc10gOiAoMHhmZjAwMDAwMCB8ICgoKnBvcykgKiAweDEwMTAxKSk7Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiOgotICAgICAgICBjYXNlIEZYRElCX1JnYmE6Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiMzI6Ci0gICAgICAgICAgICByZXR1cm4gRlhBUkdCX0dFVERJQihwb3MpIHwgMHhmZjAwMDAwMDsKLSAgICAgICAgY2FzZSBGWERJQl9BcmdiOgotICAgICAgICAgICAgcmV0dXJuIEZYQVJHQl9HRVRESUIocG9zKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLXZvaWQgQ0ZYX0RJQml0bWFwOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yKQotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh4IDwgMCB8fCB4ID49IG1fV2lkdGggfHwgeSA8IDAgfHwgeSA+PSBtX0hlaWdodCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHVpbnQ4X3QqIHBvcyA9IG1fcEJ1ZmZlciArIHkgKiBtX1BpdGNoICsgeCAqIEdldEJQUCgpIC8gODsKLSAgICBzd2l0Y2ggKEdldEZvcm1hdCgpKSB7Ci0gICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6Ci0gICAgICAgICAgICBpZiAoY29sb3IgPj4gMjQpIHsKLSAgICAgICAgICAgICAgICAqcG9zIHw9IDEgPDwgKDcgLSB4ICUgOCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpwb3MgJj0gfigxIDw8ICg3IC0geCAlIDgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6Ci0gICAgICAgICAgICBpZiAobV9wUGFsZXR0ZSkgewotICAgICAgICAgICAgICAgIGlmIChjb2xvciA9PSBtX3BQYWxldHRlWzFdKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwb3MgfD0gMSA8PCAoNyAtIHggJSA4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqcG9zICY9IH4oMSA8PCAoNyAtIHggJSA4KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY29sb3IgPT0gMHhmZmZmZmZmZikgewotICAgICAgICAgICAgICAgICAgICAqcG9zIHw9IDEgPDwgKDcgLSB4ICUgOCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKnBvcyAmPSB+KDEgPDwgKDcgLSB4ICUgOCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOgotICAgICAgICAgICAgKnBvcyA9ICh1aW50OF90KShjb2xvciA+PiAyNCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BQYWxldHRlW2ldID09IGNvbG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvcyA9ICh1aW50OF90KWk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICpwb3MgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICpwb3MgPSBGWFJHQjJHUkFZKEZYQVJHQl9SKGNvbG9yKSwgRlhBUkdCX0coY29sb3IpLCBGWEFSR0JfQihjb2xvcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl9SZ2I6Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsKLSAgICAgICAgICAgICAgICBpbnQgYWxwaGEgPSBGWEFSR0JfQShjb2xvcik7Ci0gICAgICAgICAgICAgICAgcG9zWzBdID0gKEZYQVJHQl9CKGNvbG9yKSAqIGFscGhhICsgcG9zWzBdICogKDI1NSAtIGFscGhhKSkgLyAyNTU7Ci0gICAgICAgICAgICAgICAgcG9zWzFdID0gKEZYQVJHQl9HKGNvbG9yKSAqIGFscGhhICsgcG9zWzFdICogKDI1NSAtIGFscGhhKSkgLyAyNTU7Ci0gICAgICAgICAgICAgICAgcG9zWzJdID0gKEZYQVJHQl9SKGNvbG9yKSAqIGFscGhhICsgcG9zWzJdICogKDI1NSAtIGFscGhhKSkgLyAyNTU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiYTogewotICAgICAgICAgICAgICAgIHBvc1swXSA9IEZYQVJHQl9CKGNvbG9yKTsKLSAgICAgICAgICAgICAgICBwb3NbMV0gPSBGWEFSR0JfRyhjb2xvcik7Ci0gICAgICAgICAgICAgICAgcG9zWzJdID0gRlhBUkdCX1IoY29sb3IpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCX0FyZ2I6Ci0gICAgICAgICAgICBGWEFSR0JfU0VURElCKHBvcywgY29sb3IpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci12b2lkIENGWF9ESUJpdG1hcDo6RG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCB1aW50OF90KiBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIEZYX0JPT0wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgc3JjX0JwcCA9IG1fYnBwIC8gODsKLSAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIGxpbmUgKiBtX1BpdGNoOwotICAgIGlmIChzcmNfQnBwID09IDApIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICBGWF9EV09SRCBkZXN0X3ggPSBjbGlwX2xlZnQgKyBpOwotICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3ggPSBkZXN0X3ggKiBtX1dpZHRoIC8gZGVzdF93aWR0aDsKLSAgICAgICAgICAgIGlmIChiRmxpcFgpIHsKLSAgICAgICAgICAgICAgICBzcmNfeCA9IG1fV2lkdGggLSBzcmNfeCAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfeCAlPSBtX1dpZHRoOwotICAgICAgICAgICAgZGVzdF9zY2FuW2ldID0gKHNjYW5saW5lW3NyY194IC8gOF0gJiAoMSA8PCAoNyAtIHNyY194ICUgOCkpKSA/IDI1NSA6IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHNyY19CcHAgPT0gMSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaXBfd2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGRlc3RfeCA9IGNsaXBfbGVmdCArIGk7Ci0gICAgICAgICAgICBGWF9EV09SRCBzcmNfeCA9IGRlc3RfeCAqIG1fV2lkdGggLyBkZXN0X3dpZHRoOwotICAgICAgICAgICAgaWYgKGJGbGlwWCkgewotICAgICAgICAgICAgICAgIHNyY194ID0gbV9XaWR0aCAtIHNyY194IC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY194ICU9IG1fV2lkdGg7Ci0gICAgICAgICAgICBpbnQgZGVzdF9wb3MgPSBpOwotICAgICAgICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIUlzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3MgKj0gMzsKLSAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiID0gbV9wUGFsZXR0ZVtzY2FubGluZVtzcmNfeF1dOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3NdID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDFdID0gRlhBUkdCX0coYXJnYik7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDJdID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3MgKj0gNDsKLSAgICAgICAgICAgICAgICAgICAgRlhfQ01ZSyBjbXlrID0gbV9wUGFsZXR0ZVtzY2FubGluZVtzcmNfeF1dOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3NdID0gRlhTWVNfR2V0Q1ZhbHVlKGNteWspOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAxXSA9IEZYU1lTX0dldE1WYWx1ZShjbXlrKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMl0gPSBGWFNZU19HZXRZVmFsdWUoY215ayk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDNdID0gRlhTWVNfR2V0S1ZhbHVlKGNteWspOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9IHNjYW5saW5lW3NyY194XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSArKykgewotICAgICAgICAgICAgRlhfRFdPUkQgZGVzdF94ID0gY2xpcF9sZWZ0ICsgaTsKLSAgICAgICAgICAgIEZYX0RXT1JEIHNyY194ID0gYkZsaXBYID8gKG1fV2lkdGggLSBkZXN0X3ggKiBtX1dpZHRoIC8gZGVzdF93aWR0aCAtIDEpICogc3JjX0JwcCA6IChkZXN0X3ggKiBtX1dpZHRoIC8gZGVzdF93aWR0aCkgKiBzcmNfQnBwOwotICAgICAgICAgICAgc3JjX3ggJT0gbV9XaWR0aCAqIHNyY19CcHA7Ci0gICAgICAgICAgICBpbnQgZGVzdF9wb3MgPSBpICogc3JjX0JwcDsKLSAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgc3JjX0JwcDsgYiArKykgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIGJdID0gc2NhbmxpbmVbc3JjX3ggKyBiXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb252ZXJ0Q29sb3JTY2FsZShGWF9EV09SRCBmb3JlY29sb3IsIEZYX0RXT1JEIGJhY2tjb2xvcikKLXsKLSAgICBBU1NFUlQoIUlzQWxwaGFNYXNrKCkpOwotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCB8fCBJc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50IGZjLCBmbSwgZnksIGZrLCBiYywgYm0sIGJ5LCBiazsKLSAgICBpbnQgZnIsIGZnLCBmYiwgYnIsIGJnLCBiYjsKLSAgICBGWF9CT09MIGlzQ215a0ltYWdlID0gSXNDbXlrSW1hZ2UoKTsKLSAgICBpZiAoaXNDbXlrSW1hZ2UpIHsKLSAgICAgICAgZmMgPSBGWFNZU19HZXRDVmFsdWUoZm9yZWNvbG9yKTsKLSAgICAgICAgZm0gPSBGWFNZU19HZXRNVmFsdWUoZm9yZWNvbG9yKTsKLSAgICAgICAgZnkgPSBGWFNZU19HZXRZVmFsdWUoZm9yZWNvbG9yKTsKLSAgICAgICAgZmsgPSBGWFNZU19HZXRLVmFsdWUoZm9yZWNvbG9yKTsKLSAgICAgICAgYmMgPSBGWFNZU19HZXRDVmFsdWUoYmFja2NvbG9yKTsKLSAgICAgICAgYm0gPSBGWFNZU19HZXRNVmFsdWUoYmFja2NvbG9yKTsKLSAgICAgICAgYnkgPSBGWFNZU19HZXRZVmFsdWUoYmFja2NvbG9yKTsKLSAgICAgICAgYmsgPSBGWFNZU19HZXRLVmFsdWUoYmFja2NvbG9yKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmciA9IEZYU1lTX0dldFJWYWx1ZShmb3JlY29sb3IpOwotICAgICAgICBmZyA9IEZYU1lTX0dldEdWYWx1ZShmb3JlY29sb3IpOwotICAgICAgICBmYiA9IEZYU1lTX0dldEJWYWx1ZShmb3JlY29sb3IpOwotICAgICAgICBiciA9IEZYU1lTX0dldFJWYWx1ZShiYWNrY29sb3IpOwotICAgICAgICBiZyA9IEZYU1lTX0dldEdWYWx1ZShiYWNrY29sb3IpOwotICAgICAgICBiYiA9IEZYU1lTX0dldEJWYWx1ZShiYWNrY29sb3IpOwotICAgIH0KLSAgICBpZiAobV9icHAgPD0gOCkgewotICAgICAgICBpZiAoaXNDbXlrSW1hZ2UpIHsKLSAgICAgICAgICAgIGlmIChmb3JlY29sb3IgPT0gMHhmZiAmJiBiYWNrY29sb3IgPT0gMCAmJiBtX3BQYWxldHRlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChmb3JlY29sb3IgPT0gMCAmJiBiYWNrY29sb3IgPT0gMHhmZmZmZmYgJiYgbV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBCdWlsZFBhbGV0dGUoKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc2l6ZSA9IDEgPDwgbV9icHA7Ci0gICAgICAgIGlmIChpc0NteWtJbWFnZSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBiLCBnLCByOwotICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUobV9wUGFsZXR0ZVtpXSksIEZYU1lTX0dldE1WYWx1ZShtX3BQYWxldHRlW2ldKSwgRlhTWVNfR2V0WVZhbHVlKG1fcFBhbGV0dGVbaV0pLCBGWFNZU19HZXRLVmFsdWUobV9wUGFsZXR0ZVtpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgIGludCBncmF5ID0gMjU1IC0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICBtX3BQYWxldHRlW2ldID0gQ215a0VuY29kZShiYyArIChmYyAtIGJjKSAqIGdyYXkgLyAyNTUsIGJtICsgKGZtIC0gYm0pICogZ3JheSAvIDI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSArIChmeSAtIGJ5KSAqIGdyYXkgLyAyNTUsIGJrICsgKGZrIC0gYmspICogZ3JheSAvIDI1NSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGdyYXkgPSBGWFJHQjJHUkFZKEZYQVJHQl9SKG1fcFBhbGV0dGVbaV0pLCBGWEFSR0JfRyhtX3BQYWxldHRlW2ldKSwgRlhBUkdCX0IobV9wUGFsZXR0ZVtpXSkpOwotICAgICAgICAgICAgICAgIG1fcFBhbGV0dGVbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCBiciArIChmciAtIGJyKSAqIGdyYXkgLyAyNTUsIGJnICsgKGZnIC0gYmcpICogZ3JheSAvIDI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIgKyAoZmIgLSBiYikgKiBncmF5IC8gMjU1KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChpc0NteWtJbWFnZSkgewotICAgICAgICBpZiAoZm9yZWNvbG9yID09IDB4ZmYgJiYgYmFja2NvbG9yID09IDB4MDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYiwgZywgcjsKLSAgICAgICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKHNjYW5saW5lWzBdLCBzY2FubGluZVsxXSwgc2NhbmxpbmVbMl0sIHNjYW5saW5lWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IDI1NSAtIEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGZvcmVjb2xvciA9PSAwICYmIGJhY2tjb2xvciA9PSAweGZmZmZmZikgewotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgICAgICBpbnQgZ2FwID0gbV9icHAgLyA4IC0gMjsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBncmF5ID0gRlhSR0IyR1JBWShzY2FubGluZVsyXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzBdKTsKLSAgICAgICAgICAgICAgICAqc2NhbmxpbmUgKysgPSBncmF5OwotICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IGdyYXk7Ci0gICAgICAgICAgICAgICAgKnNjYW5saW5lICAgID0gZ3JheTsKLSAgICAgICAgICAgICAgICBzY2FubGluZSArPSBnYXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChpc0NteWtJbWFnZSkgewotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90IGIsIGcsIHI7Ci0gICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKHNjYW5saW5lWzBdLCBzY2FubGluZVsxXSwgc2NhbmxpbmVbMl0sIHNjYW5saW5lWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICBpbnQgZ3JheSA9IDI1NSAtIEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICAgICAgICAgKnNjYW5saW5lICsrID0gYmMgKyAoZmMgLSBiYykgKiBncmF5IC8gMjU1OwotICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IGJtICsgKGZtIC0gYm0pICogZ3JheSAvIDI1NTsKLSAgICAgICAgICAgICAgICAqc2NhbmxpbmUgKysgPSBieSArIChmeSAtIGJ5KSAqIGdyYXkgLyAyNTU7Ci0gICAgICAgICAgICAgICAgKnNjYW5saW5lICsrID0gYmsgKyAoZmsgLSBiaykgKiBncmF5IC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgdWludDhfdCogc2NhbmxpbmUgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOwotICAgICAgICAgICAgaW50IGdhcCA9IG1fYnBwIC8gOCAtIDI7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgZ3JheSA9IEZYUkdCMkdSQVkoc2NhbmxpbmVbMl0sIHNjYW5saW5lWzFdLCBzY2FubGluZVswXSk7Ci0gICAgICAgICAgICAgICAgKnNjYW5saW5lICsrID0gYmIgKyAoZmIgLSBiYikgKiBncmF5IC8gMjU1OwotICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IGJnICsgKGZnIC0gYmcpICogZ3JheSAvIDI1NTsKLSAgICAgICAgICAgICAgICAqc2NhbmxpbmUgICAgPSBiciArIChmciAtIGJyKSAqIGdyYXkgLyAyNTU7Ci0gICAgICAgICAgICAgICAgc2NhbmxpbmUgKz0gZ2FwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkRpdGhlckZTKGNvbnN0IEZYX0RXT1JEKiBwUGFsZXR0ZSwgaW50IHBhbF9zaXplLCBjb25zdCBGWF9SRUNUKiBwUmVjdCkKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9icHAgIT0gOCAmJiBtX3BQYWxldHRlICE9IE5VTEwgJiYgbV9BbHBoYUZsYWcgIT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX1dpZHRoIDwgNCAmJiBtX0hlaWdodCA8IDQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9SRUNUIHJlY3QoMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQpOwotICAgIGlmIChwUmVjdCkgewotICAgICAgICByZWN0LkludGVyc2VjdCgqcFJlY3QpOwotICAgIH0KLSAgICB1aW50OF90IHRyYW5zbGF0ZVsyNTZdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgIGludCBlcnIyID0gNjU1MzY7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFsX3NpemU7IGogKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgZW50cnkgPSAodWludDhfdClwUGFsZXR0ZVtqXTsKLSAgICAgICAgICAgIGludCBlcnIgPSAoaW50KWVudHJ5IC0gaTsKLSAgICAgICAgICAgIGlmIChlcnIgKiBlcnIgPCBlcnIyKSB7Ci0gICAgICAgICAgICAgICAgZXJyMiA9IGVyciAqIGVycjsKLSAgICAgICAgICAgICAgICB0cmFuc2xhdGVbaV0gPSBlbnRyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewotICAgICAgICB1aW50OF90KiBzY2FuID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKLSAgICAgICAgdWludDhfdCogbmV4dF9zY2FuID0gbV9wQnVmZmVyICsgKHJvdyArIDEpICogbV9QaXRjaDsKLSAgICAgICAgZm9yIChpbnQgY29sID0gcmVjdC5sZWZ0OyBjb2wgPCByZWN0LnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgIGludCBzcmNfcGl4ZWwgPSBzY2FuW2NvbF07Ci0gICAgICAgICAgICBpbnQgZGVzdF9waXhlbCA9IHRyYW5zbGF0ZVtzcmNfcGl4ZWxdOwotICAgICAgICAgICAgc2Nhbltjb2xdID0gKHVpbnQ4X3QpZGVzdF9waXhlbDsKLSAgICAgICAgICAgIGludCBlcnJvciA9IC1kZXN0X3BpeGVsICsgc3JjX3BpeGVsOwotICAgICAgICAgICAgaWYgKGNvbCA8IHJlY3QucmlnaHQgLSAxKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyYyA9IHNjYW5bY29sICsgMV07Ci0gICAgICAgICAgICAgICAgc3JjICs9IGVycm9yICogNyAvIDE2OwotICAgICAgICAgICAgICAgIGlmIChzcmMgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Nhbltjb2wgKyAxXSA9IDI1NTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2Nhbltjb2wgKyAxXSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2Nhbltjb2wgKyAxXSA9IHNyYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29sIDwgcmVjdC5yaWdodCAtIDEgJiYgcm93IDwgcmVjdC5ib3R0b20gLSAxKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyYyA9IG5leHRfc2Nhbltjb2wgKyAxXTsKLSAgICAgICAgICAgICAgICBzcmMgKz0gZXJyb3IgKiAxIC8gMTY7Ci0gICAgICAgICAgICAgICAgaWYgKHNyYyA+IDI1NSkgewotICAgICAgICAgICAgICAgICAgICBuZXh0X3NjYW5bY29sICsgMV0gPSAyNTU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzcmMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRfc2Nhbltjb2wgKyAxXSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dF9zY2FuW2NvbCArIDFdID0gc3JjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyb3cgPCByZWN0LmJvdHRvbSAtIDEpIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjID0gbmV4dF9zY2FuW2NvbF07Ci0gICAgICAgICAgICAgICAgc3JjICs9IGVycm9yICogNSAvIDE2OwotICAgICAgICAgICAgICAgIGlmIChzcmMgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dF9zY2FuW2NvbF0gPSAyNTU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzcmMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRfc2Nhbltjb2xdID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuZXh0X3NjYW5bY29sXSA9IHNyYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29sID4gcmVjdC5sZWZ0ICYmIHJvdyA8IHJlY3QuYm90dG9tIC0gMSkgewotICAgICAgICAgICAgICAgIGludCBzcmMgPSBuZXh0X3NjYW5bY29sIC0gMV07Ci0gICAgICAgICAgICAgICAgc3JjICs9IGVycm9yICogMyAvIDE2OwotICAgICAgICAgICAgICAgIGlmIChzcmMgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dF9zY2FuW2NvbCAtIDFdID0gMjU1OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBuZXh0X3NjYW5bY29sIC0gMV0gPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRfc2Nhbltjb2wgLSAxXSA9IHNyYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1DRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkZsaXBJbWFnZShGWF9CT09MIGJYRmxpcCwgRlhfQk9PTCBiWUZsaXApIGNvbnN0Ci17Ci0gICAgQ0ZYX0RJQml0bWFwKiBwRmxpcHBlZCA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFwRmxpcHBlZCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFwRmxpcHBlZC0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBHZXRGb3JtYXQoKSkpIHsKLSAgICAgICAgZGVsZXRlIHBGbGlwcGVkOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcEZsaXBwZWQtPkNvcHlQYWxldHRlKG1fcFBhbGV0dGUpOwotICAgIHVpbnQ4X3QqIHBEZXN0QnVmZmVyID0gcEZsaXBwZWQtPkdldEJ1ZmZlcigpOwotICAgIGludCBCcHAgPSBtX2JwcCAvIDg7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IEdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IHBEZXN0QnVmZmVyICsgbV9QaXRjaCAqIChiWUZsaXAgPyAobV9IZWlnaHQgLSByb3cgLSAxKSA6IHJvdyk7Ci0gICAgICAgIGlmICghYlhGbGlwKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9QaXRjaCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9icHAgPT0gMSkgewotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgMCwgbV9QaXRjaCk7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspCi0gICAgICAgICAgICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfY29sID0gbV9XaWR0aCAtIGNvbCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2NvbCAvIDhdIHw9ICgxIDw8ICg3IC0gZGVzdF9jb2wgJSA4KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IChtX1dpZHRoIC0gMSkgKiBCcHA7Ci0gICAgICAgICAgICBpZiAoQnBwID09IDEpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbjsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuIC0tOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJwcCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX3NjYW5bMl07Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiAtPSAzOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKEJwcCA9PSA0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gKihGWF9EV09SRCopc3JjX3NjYW47Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiAtPSA0OwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIHBEZXN0QnVmZmVyID0gcEZsaXBwZWQtPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCk7Ci0gICAgICAgIEZYX0RXT1JEIGRlc3RfcGl0Y2ggPSBwRmxpcHBlZC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpOwotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IG1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IHBEZXN0QnVmZmVyICsgZGVzdF9waXRjaCAqIChiWUZsaXAgPyAobV9IZWlnaHQgLSByb3cgLSAxKSA6IHJvdyk7Ci0gICAgICAgICAgICBpZiAoIWJYRmxpcCkgewotICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBkZXN0X3BpdGNoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAobV9XaWR0aCAtIDEpOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbjsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gLS07Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBGbGlwcGVkOwotfQotQ0ZYX0RJQkV4dHJhY3Rvcjo6Q0ZYX0RJQkV4dHJhY3Rvcihjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKQotewotICAgIG1fcEJpdG1hcCA9IE5VTEw7Ci0gICAgaWYgKHBTcmMtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgbV9wQml0bWFwID0gcFNyYy0+Q2xvbmUoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BCaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOwotICAgICAgICBpZiAoIW1fcEJpdG1hcCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbV9wQml0bWFwLT5DcmVhdGUocFNyYy0+R2V0V2lkdGgoKSwgcFNyYy0+R2V0SGVpZ2h0KCksIHBTcmMtPkdldEZvcm1hdCgpLCBwU3JjLT5HZXRCdWZmZXIoKSkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BCaXRtYXA7Ci0gICAgICAgICAgICBtX3BCaXRtYXAgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fcEJpdG1hcC0+Q29weVBhbGV0dGUocFNyYy0+R2V0UGFsZXR0ZSgpKTsKLSAgICAgICAgbV9wQml0bWFwLT5Db3B5QWxwaGFNYXNrKHBTcmMtPm1fcEFscGhhTWFzayk7Ci0gICAgfQotfQotQ0ZYX0RJQkV4dHJhY3Rvcjo6fkNGWF9ESUJFeHRyYWN0b3IoKQotewotICAgIGRlbGV0ZSBtX3BCaXRtYXA7Ci19Ci1DRlhfRmlsdGVyZWRESUI6OkNGWF9GaWx0ZXJlZERJQigpCi17Ci0gICAgbV9wU2NhbmxpbmUgPSBOVUxMOwotICAgIG1fcFNyYyA9IE5VTEw7Ci19Ci1DRlhfRmlsdGVyZWRESUI6On5DRlhfRmlsdGVyZWRESUIoKQotewotICAgIGlmIChtX2JBdXRvRHJvcFNyYykgewotICAgICAgICBkZWxldGUgbV9wU3JjOwotICAgIH0KLSAgICBpZiAobV9wU2NhbmxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTY2FubGluZSk7Ci0gICAgfQotfQotdm9pZCBDRlhfRmlsdGVyZWRESUI6OkxvYWRTcmMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgRlhfQk9PTCBiQXV0b0Ryb3BTcmMpCi17Ci0gICAgbV9wU3JjID0gcFNyYzsKLSAgICBtX2JBdXRvRHJvcFNyYyA9IGJBdXRvRHJvcFNyYzsKLSAgICBtX1dpZHRoID0gcFNyYy0+R2V0V2lkdGgoKTsKLSAgICBtX0hlaWdodCA9IHBTcmMtPkdldEhlaWdodCgpOwotICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQgPSBHZXREZXN0Rm9ybWF0KCk7Ci0gICAgbV9icHAgPSAodWludDhfdClmb3JtYXQ7Ci0gICAgbV9BbHBoYUZsYWcgPSAodWludDhfdCkoZm9ybWF0ID4+IDgpOwotICAgIG1fUGl0Y2ggPSAobV9XaWR0aCAqIChmb3JtYXQgJiAweGZmKSArIDMxKSAvIDMyICogNDsKLSAgICBtX3BQYWxldHRlID0gR2V0RGVzdFBhbGV0dGUoKTsKLSAgICBtX3BTY2FubGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOwotfQotY29uc3QgdWludDhfdCogQ0ZYX0ZpbHRlcmVkRElCOjpHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3QKLXsKLSAgICBUcmFuc2xhdGVTY2FubGluZShtX3BTY2FubGluZSwgbV9wU3JjLT5HZXRTY2FubGluZShsaW5lKSk7Ci0gICAgcmV0dXJuIG1fcFNjYW5saW5lOwotfQotdm9pZCBDRlhfRmlsdGVyZWRESUI6OkRvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwgdWludDhfdCogZGVzdF9zY2FuLCBpbnQgZGVzdF9icHAsCi0gICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0Ci17Ci0gICAgbV9wU3JjLT5Eb3duU2FtcGxlU2NhbmxpbmUobGluZSwgZGVzdF9zY2FuLCBkZXN0X2JwcCwgZGVzdF93aWR0aCwgYkZsaXBYLCBjbGlwX2xlZnQsIGNsaXBfd2lkdGgpOwotICAgIFRyYW5zbGF0ZURvd25TYW1wbGVzKGRlc3Rfc2NhbiwgZGVzdF9zY2FuLCBjbGlwX3dpZHRoLCBkZXN0X2JwcCk7Ci19Ci1DRlhfSW1hZ2VSZW5kZXJlcjo6Q0ZYX0ltYWdlUmVuZGVyZXIoKQotewotICAgIG1fU3RhdHVzID0gMDsKLSAgICBtX3BUcmFuc2Zvcm1lciA9IE5VTEw7Ci0gICAgbV9iUmdiQnl0ZU9yZGVyID0gRkFMU0U7Ci0gICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7Ci19Ci1DRlhfSW1hZ2VSZW5kZXJlcjo6fkNGWF9JbWFnZVJlbmRlcmVyKCkKLXsKLSAgICBkZWxldGUgbV9wVHJhbnNmb3JtZXI7Ci19Ci1leHRlcm4gRlhfUkVDVCBfRlhESUJfU3dhcENsaXBCb3goRlhfUkVDVCYgY2xpcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9CT09MIGJGbGlwWCwgRlhfQk9PTCBiRmxpcFkpOwotRlhfQk9PTCBDRlhfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRpYl9mbGFncywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIG1fTWF0cml4ID0gKnBNYXRyaXg7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBtX01hdHJpeC5HZXRVbml0UmVjdCgpOwotICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgbV9DbGlwQm94ID0gcENsaXBSZ24gPyBwQ2xpcFJnbi0+R2V0Qm94KCkgOiBGWF9SRUNUKDAsIDAsIHBEZXZpY2UtPkdldFdpZHRoKCksIHBEZXZpY2UtPkdldEhlaWdodCgpKTsKLSAgICBtX0NsaXBCb3guSW50ZXJzZWN0KGltYWdlX3JlY3QpOwotICAgIGlmIChtX0NsaXBCb3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wRGV2aWNlID0gcERldmljZTsKLSAgICBtX3BDbGlwUmduID0gcENsaXBSZ247Ci0gICAgbV9NYXNrQ29sb3IgPSBtYXNrX2NvbG9yOwotICAgIG1fQml0bWFwQWxwaGEgPSBiaXRtYXBfYWxwaGE7Ci0gICAgbV9NYXRyaXggPSAqcE1hdHJpeDsKLSAgICBtX0ZsYWdzID0gZGliX2ZsYWdzOwotICAgIG1fQWxwaGFGbGFnID0gYWxwaGFfZmxhZzsKLSAgICBtX3BJY2NUcmFuc2Zvcm0gPSBwSWNjVHJhbnNmb3JtOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7Ci0gICAgbV9CbGVuZFR5cGUgPSBibGVuZF90eXBlOwotICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKLSAgICBpZiAoKEZYU1lTX2ZhYnMobV9NYXRyaXguYikgPj0gMC41ZiB8fCBtX01hdHJpeC5hID09IDApIHx8Ci0gICAgICAgICAgICAoRlhTWVNfZmFicyhtX01hdHJpeC5jKSA+PSAwLjVmIHx8IG1fTWF0cml4LmQgPT0gMCkgKSB7Ci0gICAgICAgIGlmIChGWFNZU19mYWJzKG1fTWF0cml4LmEpIDwgRlhTWVNfZmFicyhtX01hdHJpeC5iKSAvIDIwICYmIEZYU1lTX2ZhYnMobV9NYXRyaXguZCkgPCBGWFNZU19mYWJzKG1fTWF0cml4LmMpIC8gMjAgJiYKLSAgICAgICAgICAgICAgICBGWFNZU19mYWJzKG1fTWF0cml4LmEpIDwgMC41ZiAmJiBGWFNZU19mYWJzKG1fTWF0cml4LmQpIDwgMC41ZikgewotICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQgPSBpbWFnZV9yZWN0LkhlaWdodCgpOwotICAgICAgICAgICAgRlhfUkVDVCBiaXRtYXBfY2xpcCA9IG1fQ2xpcEJveDsKLSAgICAgICAgICAgIGJpdG1hcF9jbGlwLk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOwotICAgICAgICAgICAgYml0bWFwX2NsaXAgPSBfRlhESUJfU3dhcENsaXBCb3goYml0bWFwX2NsaXAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX01hdHJpeC5jID4gMCwgbV9NYXRyaXguYiA8IDApOwotICAgICAgICAgICAgbV9Db21wb3Nlci5Db21wb3NlKHBEZXZpY2UsIHBDbGlwUmduLCBiaXRtYXBfYWxwaGEsIG1hc2tfY29sb3IsIG1fQ2xpcEJveCwgVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hdHJpeC5jID4gMCwgbV9NYXRyaXguYiA8IDAsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgbV9CbGVuZFR5cGUpOwotICAgICAgICAgICAgaWYgKCFtX1N0cmV0Y2hlci5TdGFydCgmbV9Db21wb3NlciwgcFNvdXJjZSwgZGVzdF9oZWlnaHQsIGRlc3Rfd2lkdGgsIGJpdG1hcF9jbGlwLCBkaWJfZmxhZ3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9TdGF0dXMgPSAxOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgbV9TdGF0dXMgPSAyOwotICAgICAgICBtX3BUcmFuc2Zvcm1lciA9IEZYX05FVyBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjsKLSAgICAgICAgaWYgKCFtX3BUcmFuc2Zvcm1lcikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1fcFRyYW5zZm9ybWVyLT5TdGFydChwU291cmNlLCAmbV9NYXRyaXgsIGRpYl9mbGFncywgJm1fQ2xpcEJveCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpbnQgZGVzdF93aWR0aCA9IGltYWdlX3JlY3QuV2lkdGgoKTsKLSAgICBpZiAobV9NYXRyaXguYSA8IDApIHsKLSAgICAgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOwotICAgIH0KLSAgICBpbnQgZGVzdF9oZWlnaHQgPSBpbWFnZV9yZWN0LkhlaWdodCgpOwotICAgIGlmIChtX01hdHJpeC5kID4gMCkgewotICAgICAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKLSAgICB9Ci0gICAgaWYgKGRlc3Rfd2lkdGggPT0gMCB8fCBkZXN0X2hlaWdodCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfUkVDVCBiaXRtYXBfY2xpcCA9IG1fQ2xpcEJveDsKLSAgICBiaXRtYXBfY2xpcC5PZmZzZXQoLWltYWdlX3JlY3QubGVmdCwgLWltYWdlX3JlY3QudG9wKTsKLSAgICBtX0NvbXBvc2VyLkNvbXBvc2UocERldmljZSwgcENsaXBSZ24sIGJpdG1hcF9hbHBoYSwgbWFza19jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgbV9DbGlwQm94LCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIG1fQmxlbmRUeXBlKTsKLSAgICBtX1N0YXR1cyA9IDE7Ci0gICAgcmV0ID0gbV9TdHJldGNoZXIuU3RhcnQoJm1fQ29tcG9zZXIsIHBTb3VyY2UsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBiaXRtYXBfY2xpcCwgZGliX2ZsYWdzKTsKLSAgICByZXR1cm4gcmV0OwotfQotRlhfQk9PTCBDRlhfSW1hZ2VSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKG1fU3RhdHVzID09IDEpIHsKLSAgICAgICAgcmV0dXJuIG1fU3RyZXRjaGVyLkNvbnRpbnVlKHBQYXVzZSk7Ci0gICAgfQotICAgIGlmIChtX1N0YXR1cyA9PSAyKSB7Ci0gICAgICAgIGlmIChtX3BUcmFuc2Zvcm1lci0+Q29udGludWUocFBhdXNlKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbV9wVHJhbnNmb3JtZXItPm1fU3RvcmVyLkRldGFjaCgpOwotICAgICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQml0bWFwOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9BbHBoYUZsYWcgPj4gOCkgewotICAgICAgICAgICAgICAgICAgICBtX0FscGhhRmxhZyA9ICgoKHVpbnQ4X3QpKChtX0FscGhhRmxhZyAmIDB4ZmYpICogbV9CaXRtYXBBbHBoYSAvIDI1NSkpIHwgKChtX0FscGhhRmxhZyA+PiA4KSA8PCA4KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9NYXNrQ29sb3IgPSBGWEFSR0JfTVVMX0FMUEhBKG1fTWFza0NvbG9yLCBtX0JpdG1hcEFscGhhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BEZXZpY2UtPkNvbXBvc2l0ZU1hc2sobV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0TGVmdCwgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0VG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQml0bWFwLCBtX01hc2tDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBtX0JsZW5kVHlwZSwgbV9wQ2xpcFJnbiwgbV9iUmdiQnl0ZU9yZGVyLCBtX0FscGhhRmxhZywgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgewotICAgICAgICAgICAgICAgIHBCaXRtYXAtPk11bHRpcGx5QWxwaGEobV9CaXRtYXBBbHBoYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BEZXZpY2UtPkNvbXBvc2l0ZUJpdG1hcChtX3BUcmFuc2Zvcm1lci0+bV9SZXN1bHRMZWZ0LCBtX3BUcmFuc2Zvcm1lci0+bV9SZXN1bHRUb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSwgcEJpdG1hcCwgMCwgMCwgbV9CbGVuZFR5cGUsIG1fcENsaXBSZ24sIG1fYlJnYkJ5dGVPcmRlciwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgfQotICAgICAgICBkZWxldGUgcEJpdG1hcDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBpbnQgdmFsdWUpIHsKKyAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotQ0ZYX0JpdG1hcFN0b3Jlcjo6Q0ZYX0JpdG1hcFN0b3JlcigpCi17Ci0gICAgbV9wQml0bWFwID0gTlVMTDsKLX0KLUNGWF9CaXRtYXBTdG9yZXI6On5DRlhfQml0bWFwU3RvcmVyKCkKLXsKLSAgICBkZWxldGUgbV9wQml0bWFwOwotfQotQ0ZYX0RJQml0bWFwKiBDRlhfQml0bWFwU3RvcmVyOjpEZXRhY2goKQotewotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG1fcEJpdG1hcDsKLSAgICBtX3BCaXRtYXAgPSBOVUxMOwotICAgIHJldHVybiBwQml0bWFwOwotfQotdm9pZCBDRlhfQml0bWFwU3RvcmVyOjpSZXBsYWNlKENGWF9ESUJpdG1hcCogcEJpdG1hcCkKLXsKLSAgICBkZWxldGUgbV9wQml0bWFwOwotICAgIG1fcEJpdG1hcCA9IHBCaXRtYXA7Ci19Ci12b2lkIENGWF9CaXRtYXBTdG9yZXI6OkNvbXBvc2VTY2FubGluZShpbnQgbGluZSwgY29uc3QgdWludDhfdCogc2NhbmxpbmUsIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEpCi17Ci0gICAgdWludDhfdCogZGVzdF9idWYgPSAodWludDhfdCopbV9wQml0bWFwLT5HZXRTY2FubGluZShsaW5lKTsKLSAgICB1aW50OF90KiBkZXN0X2FscGhhX2J1ZiA9IG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopbV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGxpbmUpIDogTlVMTDsKLSAgICBpZiAoZGVzdF9idWYpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfYnVmLCBzY2FubGluZSwgbV9wQml0bWFwLT5HZXRQaXRjaCgpKTsKKyAgfQorICBpbnQgZGVzdE9mZnNldDsKKyAgaWYgKGRlc3RDaGFubmVsID09IEZYRElCX0FscGhhKSB7CisgICAgaWYgKElzQWxwaGFNYXNrKCkpIHsKKyAgICAgIGlmICghQ29udmVydEZvcm1hdChGWERJQl84YnBwTWFzaykpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgZGVzdE9mZnNldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3RPZmZzZXQgPSAwOworICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrYSA6IEZYRElCX0FyZ2IpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7CisgICAgICAgIGRlc3RPZmZzZXQgPSAzOworICAgICAgfQogICAgIH0KLSAgICBpZiAoZGVzdF9hbHBoYV9idWYpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfYWxwaGFfYnVmLCBzY2FuX2V4dHJhX2FscGhhLCBtX3BCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0UGl0Y2goKSk7CisgIH0gZWxzZSB7CisgICAgaWYgKElzQWxwaGFNYXNrKCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgICAgaWYgKEdldEJQUCgpIDwgMjQpIHsKKyAgICAgIGlmIChIYXNBbHBoYSgpKSB7CisgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215a2EgOiBGWERJQl9BcmdiKSkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2IpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyNlbHNlCisgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiMzIpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBkZXN0T2Zmc2V0ID0gZ19DaGFubmVsT2Zmc2V0W2Rlc3RDaGFubmVsXTsKKyAgfQorICBpbnQgQnBwID0gR2V0QlBQKCkgLyA4OworICBpZiAoQnBwID09IDEpIHsKKyAgICBGWFNZU19tZW1zZXQobV9wQnVmZmVyLCB2YWx1ZSwgbV9IZWlnaHQgKiBtX1BpdGNoKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEgJiYgbV9wQWxwaGFNYXNrKSB7CisgICAgRlhTWVNfbWVtc2V0KG1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCksIHZhbHVlLAorICAgICAgICAgICAgICAgICBtX3BBbHBoYU1hc2stPkdldEhlaWdodCgpICogbV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICB1aW50OF90KiBzY2FuX2xpbmUgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgZGVzdE9mZnNldDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgKnNjYW5fbGluZSA9IHZhbHVlOworICAgICAgc2Nhbl9saW5lICs9IEJwcDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENGWF9CaXRtYXBTdG9yZXI6OlNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKQoteworRlhfQk9PTCBDRlhfRElCaXRtYXA6Ok11bHRpcGx5QWxwaGEoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCkgeworICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQVNTRVJUKHBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpOworICBpZiAoIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFJc0FscGhhTWFzaygpICYmICFIYXNBbHBoYSgpKSB7CisgICAgcmV0dXJuIExvYWRDaGFubmVsKEZYRElCX0FscGhhLCBwU3JjQml0bWFwLCBGWERJQl9BbHBoYSk7CisgIH0KKyAgQ0ZYX0RJQml0bWFwKiBwU3JjQ2xvbmUgPSAoQ0ZYX0RJQml0bWFwKilwU3JjQml0bWFwOworICBpZiAocFNyY0JpdG1hcC0+R2V0V2lkdGgoKSAhPSBtX1dpZHRoIHx8CisgICAgICBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKSAhPSBtX0hlaWdodCkgeworICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7CisgICAgQVNTRVJUKHBTcmNDbG9uZSAhPSBOVUxMKTsKKyAgICBpZiAocFNyY0Nsb25lID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgaWYgKElzQWxwaGFNYXNrKCkpIHsKKyAgICBpZiAoIUNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spKSB7CisgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKKyAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyBtX1BpdGNoICogcm93OworICAgICAgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQ2xvbmUtPm1fcEJ1ZmZlciArIHBTcmNDbG9uZS0+bV9QaXRjaCAqIHJvdzsKKyAgICAgIGlmIChwU3JjQ2xvbmUtPkdldEJQUCgpID09IDEpIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICBpZiAoISgoMSA8PCAoNyAtIGNvbCAlIDgpKSAmIHNyY19zY2FuW2NvbCAvIDhdKSkgeworICAgICAgICAgICAgZGVzdF9zY2FuW2NvbF0gPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gKCpkZXN0X3NjYW4pICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgeworICAgICAgaWYgKHBTcmNDbG9uZS0+R2V0QlBQKCkgPT0gMSkgeworICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKKyAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyBtX1BpdGNoICogcm93ICsgMzsKKyAgICAgICAgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQ2xvbmUtPm1fcEJ1ZmZlciArIHBTcmNDbG9uZS0+bV9QaXRjaCAqIHJvdzsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gKCpkZXN0X3NjYW4pICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBtX3BBbHBoYU1hc2stPk11bHRpcGx5QWxwaGEocFNyY0Nsb25lKTsKKyAgICB9CisgIH0KKyAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CisgICAgZGVsZXRlIHBTcmNDbG9uZTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpHZXRHcmF5RGF0YSh2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzd2l0Y2ggKEdldEZvcm1hdCgpKSB7CisgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7CisgICAgICBpZiAobV9wUGFsZXR0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3QgZ3JheVsyXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGludCByID0gKHVpbnQ4X3QpKG1fcFBhbGV0dGVbaV0gPj4gMTYpOworICAgICAgICBpbnQgZyA9ICh1aW50OF90KShtX3BQYWxldHRlW2ldID4+IDgpOworICAgICAgICBpbnQgYiA9ICh1aW50OF90KW1fcFBhbGV0dGVbaV07CisgICAgICAgIGdyYXlbaV0gPSAodWludDhfdClGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgfQorICAgICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IEZYX05FVyBDRlhfRElCaXRtYXA7CisgICAgICBpZiAoIXBNYXNrKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7CisgICAgICAgIGRlbGV0ZSBwTWFzazsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgRlhTWVNfbWVtc2V0KHBNYXNrLT5HZXRCdWZmZXIoKSwgZ3JheVswXSwgcE1hc2stPkdldFBpdGNoKCkgKiBtX0hlaWdodCk7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7CisgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBNYXNrLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICAgIGlmIChzcmNfcG9zW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKKyAgICAgICAgICAgICpkZXN0X3BvcyA9IGdyYXlbMV07CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3RfcG9zKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFRha2VPdmVyKHBNYXNrKTsKKyAgICAgIGRlbGV0ZSBwTWFzazsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKKyAgICAgIGlmIChtX3BQYWxldHRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgdWludDhfdCBncmF5WzI1Nl07CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGludCByID0gKHVpbnQ4X3QpKG1fcFBhbGV0dGVbaV0gPj4gMTYpOworICAgICAgICBpbnQgZyA9ICh1aW50OF90KShtX3BQYWxldHRlW2ldID4+IDgpOworICAgICAgICBpbnQgYiA9ICh1aW50OF90KW1fcFBhbGV0dGVbaV07CisgICAgICAgIGdyYXlbaV0gPSAodWludDhfdClGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgfQorICAgICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IEZYX05FVyBDRlhfRElCaXRtYXA7CisgICAgICBpZiAoIXBNYXNrKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7CisgICAgICAgIGRlbGV0ZSBwTWFzazsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gcE1hc2stPkdldEJ1ZmZlcigpICsgcm93ICogcE1hc2stPkdldFBpdGNoKCk7CisgICAgICAgIHVpbnQ4X3QqIHNyY19wb3MgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICAgICpkZXN0X3BvcysrID0gZ3JheVsqc3JjX3BvcysrXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgVGFrZU92ZXIocE1hc2spOworICAgICAgZGVsZXRlIHBNYXNrOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhESUJfUmdiOiB7CisgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKKyAgICAgIGlmICghcE1hc2spIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaWYgKCFwTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKKyAgICAgICAgZGVsZXRlIHBNYXNrOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7CisgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gcE1hc2stPkdldEJ1ZmZlcigpICsgcm93ICogcE1hc2stPkdldFBpdGNoKCk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKmRlc3RfcG9zKysgPSBGWFJHQjJHUkFZKHNyY19wb3NbMl0sIHNyY19wb3NbMV0sICpzcmNfcG9zKTsKKyAgICAgICAgICBzcmNfcG9zICs9IDM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFRha2VPdmVyKHBNYXNrKTsKKyAgICAgIGRlbGV0ZSBwTWFzazsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYRElCX1JnYjMyOiB7CisgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKKyAgICAgIGlmICghcE1hc2spIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaWYgKCFwTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKKyAgICAgICAgZGVsZXRlIHBNYXNrOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7CisgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gcE1hc2stPkdldEJ1ZmZlcigpICsgcm93ICogcE1hc2stPkdldFBpdGNoKCk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKmRlc3RfcG9zKysgPSBGWFJHQjJHUkFZKHNyY19wb3NbMl0sIHNyY19wb3NbMV0sICpzcmNfcG9zKTsKKyAgICAgICAgICBzcmNfcG9zICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFRha2VPdmVyKHBNYXNrKTsKKyAgICAgIGRlbGV0ZSBwTWFzazsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfRElCaXRtYXA6Ok11bHRpcGx5QWxwaGEoaW50IGFscGhhKSB7CisgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzd2l0Y2ggKEdldEZvcm1hdCgpKSB7CisgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKKyAgICAgIGlmICghQ29udmVydEZvcm1hdChGWERJQl84YnBwTWFzaykpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgTXVsdGlwbHlBbHBoYShhbHBoYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCXzhicHBNYXNrOiB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogc2Nhbl9saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICBzY2FuX2xpbmVbY29sXSA9IHNjYW5fbGluZVtjb2xdICogYWxwaGEgLyAyNTU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYRElCX0FyZ2I6IHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBzY2FuX2xpbmUgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgMzsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqc2Nhbl9saW5lID0gKCpzY2FuX2xpbmUpICogYWxwaGEgLyAyNTU7CisgICAgICAgICAgc2Nhbl9saW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKEhhc0FscGhhKCkpIHsKKyAgICAgICAgbV9wQWxwaGFNYXNrLT5NdWx0aXBseUFscGhhKGFscGhhKTsKKyAgICAgIH0gZWxzZSBpZiAoSXNDbXlrSW1hZ2UoKSkgeworICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoKEZYRElCX0Zvcm1hdCkoR2V0Rm9ybWF0KCkgfCAweDAyMDApKSkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBtX3BBbHBoYU1hc2stPk11bHRpcGx5QWxwaGEoYWxwaGEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCX0FyZ2IpKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIE11bHRpcGx5QWxwaGEoYWxwaGEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9EV09SRCBDRlhfRElCaXRtYXA6OkdldFBpeGVsKGludCB4LCBpbnQgeSkgY29uc3QgeworICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICB1aW50OF90KiBwb3MgPSBtX3BCdWZmZXIgKyB5ICogbV9QaXRjaCArIHggKiBHZXRCUFAoKSAvIDg7CisgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCXzFicHBNYXNrOiB7CisgICAgICBpZiAoKCpwb3MpICYgKDEgPDwgKDcgLSB4ICUgOCkpKSB7CisgICAgICAgIHJldHVybiAweGZmMDAwMDAwOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNhc2UgRlhESUJfMWJwcFJnYjogeworICAgICAgaWYgKCgqcG9zKSAmICgxIDw8ICg3IC0geCAlIDgpKSkgeworICAgICAgICByZXR1cm4gbV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbMV0gOiAweGZmZmZmZmZmOworICAgICAgfQorICAgICAgcmV0dXJuIG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlWzBdIDogMHhmZjAwMDAwMDsKKyAgICB9CisgICAgY2FzZSBGWERJQl84YnBwTWFzazoKKyAgICAgIHJldHVybiAoKnBvcykgPDwgMjQ7CisgICAgY2FzZSBGWERJQl84YnBwUmdiOgorICAgICAgcmV0dXJuIG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlWypwb3NdIDogKDB4ZmYwMDAwMDAgfCAoKCpwb3MpICogMHgxMDEwMSkpOworICAgIGNhc2UgRlhESUJfUmdiOgorICAgIGNhc2UgRlhESUJfUmdiYToKKyAgICBjYXNlIEZYRElCX1JnYjMyOgorICAgICAgcmV0dXJuIEZYQVJHQl9HRVRESUIocG9zKSB8IDB4ZmYwMDAwMDA7CisgICAgY2FzZSBGWERJQl9BcmdiOgorICAgICAgcmV0dXJuIEZYQVJHQl9HRVRESUIocG9zKTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9Cit2b2lkIENGWF9ESUJpdG1hcDo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvcikgeworICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHggPCAwIHx8IHggPj0gbV9XaWR0aCB8fCB5IDwgMCB8fCB5ID49IG1fSGVpZ2h0KSB7CisgICAgcmV0dXJuOworICB9CisgIHVpbnQ4X3QqIHBvcyA9IG1fcEJ1ZmZlciArIHkgKiBtX1BpdGNoICsgeCAqIEdldEJQUCgpIC8gODsKKyAgc3dpdGNoIChHZXRGb3JtYXQoKSkgeworICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6CisgICAgICBpZiAoY29sb3IgPj4gMjQpIHsKKyAgICAgICAgKnBvcyB8PSAxIDw8ICg3IC0geCAlIDgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKnBvcyAmPSB+KDEgPDwgKDcgLSB4ICUgOCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl8xYnBwUmdiOgorICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICAgICAgaWYgKGNvbG9yID09IG1fcFBhbGV0dGVbMV0pIHsKKyAgICAgICAgICAqcG9zIHw9IDEgPDwgKDcgLSB4ICUgOCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKnBvcyAmPSB+KDEgPDwgKDcgLSB4ICUgOCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY29sb3IgPT0gMHhmZmZmZmZmZikgeworICAgICAgICAgICpwb3MgfD0gMSA8PCAoNyAtIHggJSA4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqcG9zICY9IH4oMSA8PCAoNyAtIHggJSA4KSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6CisgICAgICAqcG9zID0gKHVpbnQ4X3QpKGNvbG9yID4+IDI0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfOGJwcFJnYjogeworICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgIGlmIChtX3BQYWxldHRlW2ldID09IGNvbG9yKSB7CisgICAgICAgICAgICAqcG9zID0gKHVpbnQ4X3QpaTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKnBvcyA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICAqcG9zID0gRlhSR0IyR1JBWShGWEFSR0JfUihjb2xvciksIEZYQVJHQl9HKGNvbG9yKSwgRlhBUkdCX0IoY29sb3IpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYRElCX1JnYjoKKyAgICBjYXNlIEZYRElCX1JnYjMyOiB7CisgICAgICBpbnQgYWxwaGEgPSBGWEFSR0JfQShjb2xvcik7CisgICAgICBwb3NbMF0gPSAoRlhBUkdCX0IoY29sb3IpICogYWxwaGEgKyBwb3NbMF0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKKyAgICAgIHBvc1sxXSA9IChGWEFSR0JfRyhjb2xvcikgKiBhbHBoYSArIHBvc1sxXSAqICgyNTUgLSBhbHBoYSkpIC8gMjU1OworICAgICAgcG9zWzJdID0gKEZYQVJHQl9SKGNvbG9yKSAqIGFscGhhICsgcG9zWzJdICogKDI1NSAtIGFscGhhKSkgLyAyNTU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWERJQl9SZ2JhOiB7CisgICAgICBwb3NbMF0gPSBGWEFSR0JfQihjb2xvcik7CisgICAgICBwb3NbMV0gPSBGWEFSR0JfRyhjb2xvcik7CisgICAgICBwb3NbMl0gPSBGWEFSR0JfUihjb2xvcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWERJQl9BcmdiOgorICAgICAgRlhBUkdCX1NFVERJQihwb3MsIGNvbG9yKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQordm9pZCBDRlhfRElCaXRtYXA6OkRvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9icHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfd2lkdGgpIGNvbnN0IHsKKyAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBzcmNfQnBwID0gbV9icHAgLyA4OworICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIGxpbmUgKiBtX1BpdGNoOworICBpZiAoc3JjX0JwcCA9PSAwKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpKyspIHsKKyAgICAgIEZYX0RXT1JEIGRlc3RfeCA9IGNsaXBfbGVmdCArIGk7CisgICAgICBGWF9EV09SRCBzcmNfeCA9IGRlc3RfeCAqIG1fV2lkdGggLyBkZXN0X3dpZHRoOworICAgICAgaWYgKGJGbGlwWCkgeworICAgICAgICBzcmNfeCA9IG1fV2lkdGggLSBzcmNfeCAtIDE7CisgICAgICB9CisgICAgICBzcmNfeCAlPSBtX1dpZHRoOworICAgICAgZGVzdF9zY2FuW2ldID0gKHNjYW5saW5lW3NyY194IC8gOF0gJiAoMSA8PCAoNyAtIHNyY194ICUgOCkpKSA/IDI1NSA6IDA7CisgICAgfQorICB9IGVsc2UgaWYgKHNyY19CcHAgPT0gMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSsrKSB7CisgICAgICBGWF9EV09SRCBkZXN0X3ggPSBjbGlwX2xlZnQgKyBpOworICAgICAgRlhfRFdPUkQgc3JjX3ggPSBkZXN0X3ggKiBtX1dpZHRoIC8gZGVzdF93aWR0aDsKKyAgICAgIGlmIChiRmxpcFgpIHsKKyAgICAgICAgc3JjX3ggPSBtX1dpZHRoIC0gc3JjX3ggLSAxOworICAgICAgfQorICAgICAgc3JjX3ggJT0gbV9XaWR0aDsKKyAgICAgIGludCBkZXN0X3BvcyA9IGk7CisgICAgICBpZiAobV9wUGFsZXR0ZSkgeworICAgICAgICBpZiAoIUlzQ215a0ltYWdlKCkpIHsKKyAgICAgICAgICBkZXN0X3BvcyAqPSAzOworICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IG1fcFBhbGV0dGVbc2NhbmxpbmVbc3JjX3hdXTsKKyAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3NdID0gRlhBUkdCX0IoYXJnYik7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMV0gPSBGWEFSR0JfRyhhcmdiKTsKKyAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAyXSA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlc3RfcG9zICo9IDQ7CisgICAgICAgICAgRlhfQ01ZSyBjbXlrID0gbV9wUGFsZXR0ZVtzY2FubGluZVtzcmNfeF1dOworICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBGWFNZU19HZXRDVmFsdWUoY215ayk7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMV0gPSBGWFNZU19HZXRNVmFsdWUoY215ayk7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMl0gPSBGWFNZU19HZXRZVmFsdWUoY215ayk7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgM10gPSBGWFNZU19HZXRLVmFsdWUoY215ayk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBzY2FubGluZVtzcmNfeF07CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSsrKSB7CisgICAgICBGWF9EV09SRCBkZXN0X3ggPSBjbGlwX2xlZnQgKyBpOworICAgICAgRlhfRFdPUkQgc3JjX3ggPQorICAgICAgICAgIGJGbGlwWCA/IChtX1dpZHRoIC0gZGVzdF94ICogbV9XaWR0aCAvIGRlc3Rfd2lkdGggLSAxKSAqIHNyY19CcHAKKyAgICAgICAgICAgICAgICAgOiAoZGVzdF94ICogbV9XaWR0aCAvIGRlc3Rfd2lkdGgpICogc3JjX0JwcDsKKyAgICAgIHNyY194ICU9IG1fV2lkdGggKiBzcmNfQnBwOworICAgICAgaW50IGRlc3RfcG9zID0gaSAqIHNyY19CcHA7CisgICAgICBmb3IgKGludCBiID0gMDsgYiA8IHNyY19CcHA7IGIrKykgeworICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyBiXSA9IHNjYW5saW5lW3NyY194ICsgYl07CisgICAgICB9CisgICAgfQorICB9Cit9CitGWF9CT09MIENGWF9ESUJpdG1hcDo6Q29udmVydENvbG9yU2NhbGUoRlhfRFdPUkQgZm9yZWNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJhY2tjb2xvcikgeworICBBU1NFUlQoIUlzQWxwaGFNYXNrKCkpOworICBpZiAobV9wQnVmZmVyID09IE5VTEwgfHwgSXNBbHBoYU1hc2soKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgZmMsIGZtLCBmeSwgZmssIGJjLCBibSwgYnksIGJrOworICBpbnQgZnIsIGZnLCBmYiwgYnIsIGJnLCBiYjsKKyAgRlhfQk9PTCBpc0NteWtJbWFnZSA9IElzQ215a0ltYWdlKCk7CisgIGlmIChpc0NteWtJbWFnZSkgeworICAgIGZjID0gRlhTWVNfR2V0Q1ZhbHVlKGZvcmVjb2xvcik7CisgICAgZm0gPSBGWFNZU19HZXRNVmFsdWUoZm9yZWNvbG9yKTsKKyAgICBmeSA9IEZYU1lTX0dldFlWYWx1ZShmb3JlY29sb3IpOworICAgIGZrID0gRlhTWVNfR2V0S1ZhbHVlKGZvcmVjb2xvcik7CisgICAgYmMgPSBGWFNZU19HZXRDVmFsdWUoYmFja2NvbG9yKTsKKyAgICBibSA9IEZYU1lTX0dldE1WYWx1ZShiYWNrY29sb3IpOworICAgIGJ5ID0gRlhTWVNfR2V0WVZhbHVlKGJhY2tjb2xvcik7CisgICAgYmsgPSBGWFNZU19HZXRLVmFsdWUoYmFja2NvbG9yKTsKKyAgfSBlbHNlIHsKKyAgICBmciA9IEZYU1lTX0dldFJWYWx1ZShmb3JlY29sb3IpOworICAgIGZnID0gRlhTWVNfR2V0R1ZhbHVlKGZvcmVjb2xvcik7CisgICAgZmIgPSBGWFNZU19HZXRCVmFsdWUoZm9yZWNvbG9yKTsKKyAgICBiciA9IEZYU1lTX0dldFJWYWx1ZShiYWNrY29sb3IpOworICAgIGJnID0gRlhTWVNfR2V0R1ZhbHVlKGJhY2tjb2xvcik7CisgICAgYmIgPSBGWFNZU19HZXRCVmFsdWUoYmFja2NvbG9yKTsKKyAgfQorICBpZiAobV9icHAgPD0gOCkgeworICAgIGlmIChpc0NteWtJbWFnZSkgeworICAgICAgaWYgKGZvcmVjb2xvciA9PSAweGZmICYmIGJhY2tjb2xvciA9PSAwICYmIG1fcFBhbGV0dGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZvcmVjb2xvciA9PSAwICYmIGJhY2tjb2xvciA9PSAweGZmZmZmZiAmJiBtX3BQYWxldHRlID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAobV9wUGFsZXR0ZSA9PSBOVUxMKSB7CisgICAgICBCdWlsZFBhbGV0dGUoKTsKKyAgICB9CisgICAgaW50IHNpemUgPSAxIDw8IG1fYnBwOworICAgIGlmIChpc0NteWtJbWFnZSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgdWludDhfdCBiLCBnLCByOworICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKG1fcFBhbGV0dGVbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0TVZhbHVlKG1fcFBhbGV0dGVbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKG1fcFBhbGV0dGVbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0S1ZhbHVlKG1fcFBhbGV0dGVbaV0pLCByLCBnLCBiKTsKKyAgICAgICAgaW50IGdyYXkgPSAyNTUgLSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgICBtX3BQYWxldHRlW2ldID0gQ215a0VuY29kZSgKKyAgICAgICAgICAgIGJjICsgKGZjIC0gYmMpICogZ3JheSAvIDI1NSwgYm0gKyAoZm0gLSBibSkgKiBncmF5IC8gMjU1LAorICAgICAgICAgICAgYnkgKyAoZnkgLSBieSkgKiBncmF5IC8gMjU1LCBiayArIChmayAtIGJrKSAqIGdyYXkgLyAyNTUpOworICAgICAgfQorICAgIH0gZWxzZQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaW50IGdyYXkgPSBGWFJHQjJHUkFZKEZYQVJHQl9SKG1fcFBhbGV0dGVbaV0pLCBGWEFSR0JfRyhtX3BQYWxldHRlW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9CKG1fcFBhbGV0dGVbaV0pKTsKKyAgICAgICAgbV9wUGFsZXR0ZVtpXSA9IEZYQVJHQl9NQUtFKDB4ZmYsIGJyICsgKGZyIC0gYnIpICogZ3JheSAvIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnICsgKGZnIC0gYmcpICogZ3JheSAvIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiICsgKGZiIC0gYmIpICogZ3JheSAvIDI1NSk7CisgICAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGlzQ215a0ltYWdlKSB7CisgICAgaWYgKGZvcmVjb2xvciA9PSAweGZmICYmIGJhY2tjb2xvciA9PSAweDAwKSB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogc2NhbmxpbmUgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICAgIHVpbnQ4X3QgYiwgZywgcjsKKyAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoc2NhbmxpbmVbMF0sIHNjYW5saW5lWzFdLCBzY2FubGluZVsyXSwgc2NhbmxpbmVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOworICAgICAgICAgICpzY2FubGluZSsrID0gMDsKKyAgICAgICAgICAqc2NhbmxpbmUrKyA9IDA7CisgICAgICAgICAgKnNjYW5saW5lKysgPSAwOworICAgICAgICAgICpzY2FubGluZSsrID0gMjU1IC0gRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9IGVsc2UgaWYgKGZvcmVjb2xvciA9PSAwICYmIGJhY2tjb2xvciA9PSAweGZmZmZmZikgeworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogc2NhbmxpbmUgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOworICAgICAgaW50IGdhcCA9IG1fYnBwIC8gOCAtIDI7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICBpbnQgZ3JheSA9IEZYUkdCMkdSQVkoc2NhbmxpbmVbMl0sIHNjYW5saW5lWzFdLCBzY2FubGluZVswXSk7CisgICAgICAgICpzY2FubGluZSsrID0gZ3JheTsKKyAgICAgICAgKnNjYW5saW5lKysgPSBncmF5OworICAgICAgICAqc2NhbmxpbmUgPSBncmF5OworICAgICAgICBzY2FubGluZSArPSBnYXA7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChpc0NteWtJbWFnZSkgeworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogc2NhbmxpbmUgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgdWludDhfdCBiLCBnLCByOworICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoc2NhbmxpbmVbMF0sIHNjYW5saW5lWzFdLCBzY2FubGluZVsyXSwgc2NhbmxpbmVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKKyAgICAgICAgaW50IGdyYXkgPSAyNTUgLSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgICAqc2NhbmxpbmUrKyA9IGJjICsgKGZjIC0gYmMpICogZ3JheSAvIDI1NTsKKyAgICAgICAgKnNjYW5saW5lKysgPSBibSArIChmbSAtIGJtKSAqIGdyYXkgLyAyNTU7CisgICAgICAgICpzY2FubGluZSsrID0gYnkgKyAoZnkgLSBieSkgKiBncmF5IC8gMjU1OworICAgICAgICAqc2NhbmxpbmUrKyA9IGJrICsgKGZrIC0gYmspICogZ3JheSAvIDI1NTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7CisgICAgICBpbnQgZ2FwID0gbV9icHAgLyA4IC0gMjsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgIGludCBncmF5ID0gRlhSR0IyR1JBWShzY2FubGluZVsyXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzBdKTsKKyAgICAgICAgKnNjYW5saW5lKysgPSBiYiArIChmYiAtIGJiKSAqIGdyYXkgLyAyNTU7CisgICAgICAgICpzY2FubGluZSsrID0gYmcgKyAoZmcgLSBiZykgKiBncmF5IC8gMjU1OworICAgICAgICAqc2NhbmxpbmUgPSBiciArIChmciAtIGJyKSAqIGdyYXkgLyAyNTU7CisgICAgICAgIHNjYW5saW5lICs9IGdhcDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9ESUJpdG1hcDo6RGl0aGVyRlMoY29uc3QgRlhfRFdPUkQqIHBQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwUmVjdCkgeworICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fYnBwICE9IDggJiYgbV9wUGFsZXR0ZSAhPSBOVUxMICYmIG1fQWxwaGFGbGFnICE9IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fV2lkdGggPCA0ICYmIG1fSGVpZ2h0IDwgNCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9SRUNUIHJlY3QoMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQpOworICBpZiAocFJlY3QpIHsKKyAgICByZWN0LkludGVyc2VjdCgqcFJlY3QpOworICB9CisgIHVpbnQ4X3QgdHJhbnNsYXRlWzI1Nl07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICBpbnQgZXJyMiA9IDY1NTM2OworICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFsX3NpemU7IGorKykgeworICAgICAgdWludDhfdCBlbnRyeSA9ICh1aW50OF90KXBQYWxldHRlW2pdOworICAgICAgaW50IGVyciA9IChpbnQpZW50cnkgLSBpOworICAgICAgaWYgKGVyciAqIGVyciA8IGVycjIpIHsKKyAgICAgICAgZXJyMiA9IGVyciAqIGVycjsKKyAgICAgICAgdHJhbnNsYXRlW2ldID0gZW50cnk7CisgICAgICB9CisgICAgfQorICB9CisgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKKyAgICB1aW50OF90KiBzY2FuID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKKyAgICB1aW50OF90KiBuZXh0X3NjYW4gPSBtX3BCdWZmZXIgKyAocm93ICsgMSkgKiBtX1BpdGNoOworICAgIGZvciAoaW50IGNvbCA9IHJlY3QubGVmdDsgY29sIDwgcmVjdC5yaWdodDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfcGl4ZWwgPSBzY2FuW2NvbF07CisgICAgICBpbnQgZGVzdF9waXhlbCA9IHRyYW5zbGF0ZVtzcmNfcGl4ZWxdOworICAgICAgc2Nhbltjb2xdID0gKHVpbnQ4X3QpZGVzdF9waXhlbDsKKyAgICAgIGludCBlcnJvciA9IC1kZXN0X3BpeGVsICsgc3JjX3BpeGVsOworICAgICAgaWYgKGNvbCA8IHJlY3QucmlnaHQgLSAxKSB7CisgICAgICAgIGludCBzcmMgPSBzY2FuW2NvbCArIDFdOworICAgICAgICBzcmMgKz0gZXJyb3IgKiA3IC8gMTY7CisgICAgICAgIGlmIChzcmMgPiAyNTUpIHsKKyAgICAgICAgICBzY2FuW2NvbCArIDFdID0gMjU1OworICAgICAgICB9IGVsc2UgaWYgKHNyYyA8IDApIHsKKyAgICAgICAgICBzY2FuW2NvbCArIDFdID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzY2FuW2NvbCArIDFdID0gc3JjOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoY29sIDwgcmVjdC5yaWdodCAtIDEgJiYgcm93IDwgcmVjdC5ib3R0b20gLSAxKSB7CisgICAgICAgIGludCBzcmMgPSBuZXh0X3NjYW5bY29sICsgMV07CisgICAgICAgIHNyYyArPSBlcnJvciAqIDEgLyAxNjsKKyAgICAgICAgaWYgKHNyYyA+IDI1NSkgeworICAgICAgICAgIG5leHRfc2Nhbltjb2wgKyAxXSA9IDI1NTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmMgPCAwKSB7CisgICAgICAgICAgbmV4dF9zY2FuW2NvbCArIDFdID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuZXh0X3NjYW5bY29sICsgMV0gPSBzcmM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChyb3cgPCByZWN0LmJvdHRvbSAtIDEpIHsKKyAgICAgICAgaW50IHNyYyA9IG5leHRfc2Nhbltjb2xdOworICAgICAgICBzcmMgKz0gZXJyb3IgKiA1IC8gMTY7CisgICAgICAgIGlmIChzcmMgPiAyNTUpIHsKKyAgICAgICAgICBuZXh0X3NjYW5bY29sXSA9IDI1NTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmMgPCAwKSB7CisgICAgICAgICAgbmV4dF9zY2FuW2NvbF0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5leHRfc2Nhbltjb2xdID0gc3JjOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoY29sID4gcmVjdC5sZWZ0ICYmIHJvdyA8IHJlY3QuYm90dG9tIC0gMSkgeworICAgICAgICBpbnQgc3JjID0gbmV4dF9zY2FuW2NvbCAtIDFdOworICAgICAgICBzcmMgKz0gZXJyb3IgKiAzIC8gMTY7CisgICAgICAgIGlmIChzcmMgPiAyNTUpIHsKKyAgICAgICAgICBuZXh0X3NjYW5bY29sIC0gMV0gPSAyNTU7CisgICAgICAgIH0gZWxzZSBpZiAoc3JjIDwgMCkgeworICAgICAgICAgIG5leHRfc2Nhbltjb2wgLSAxXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmV4dF9zY2FuW2NvbCAtIDFdID0gc3JjOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpGbGlwSW1hZ2UoRlhfQk9PTCBiWEZsaXAsIEZYX0JPT0wgYllGbGlwKSBjb25zdCB7CisgIENGWF9ESUJpdG1hcCogcEZsaXBwZWQgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOworICBpZiAoIXBGbGlwcGVkKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCFwRmxpcHBlZC0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBHZXRGb3JtYXQoKSkpIHsKKyAgICBkZWxldGUgcEZsaXBwZWQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcEZsaXBwZWQtPkNvcHlQYWxldHRlKG1fcFBhbGV0dGUpOworICB1aW50OF90KiBwRGVzdEJ1ZmZlciA9IHBGbGlwcGVkLT5HZXRCdWZmZXIoKTsKKyAgaW50IEJwcCA9IG1fYnBwIC8gODsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBHZXRTY2FubGluZShyb3cpOworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgIHBEZXN0QnVmZmVyICsgbV9QaXRjaCAqIChiWUZsaXAgPyAobV9IZWlnaHQgLSByb3cgLSAxKSA6IHJvdyk7CisgICAgaWYgKCFiWEZsaXApIHsKKyAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX1BpdGNoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAobV9icHAgPT0gMSkgeworICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgMCwgbV9QaXRjaCk7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykKKyAgICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKKyAgICAgICAgICBpbnQgZGVzdF9jb2wgPSBtX1dpZHRoIC0gY29sIC0gMTsKKyAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9jb2wgLyA4XSB8PSAoMSA8PCAoNyAtIGRlc3RfY29sICUgOCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3Rfc2NhbiArPSAobV9XaWR0aCAtIDEpICogQnBwOworICAgICAgaWYgKEJwcCA9PSAxKSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbjsKKyAgICAgICAgICBkZXN0X3NjYW4tLTsKKyAgICAgICAgICBzcmNfc2NhbisrOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKEJwcCA9PSAzKSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX3NjYW5bMl07CisgICAgICAgICAgZGVzdF9zY2FuIC09IDM7CisgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKEJwcCA9PSA0KTsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSAqKEZYX0RXT1JEKilzcmNfc2NhbjsKKyAgICAgICAgICBkZXN0X3NjYW4gLT0gNDsKKyAgICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChtX3BBbHBoYU1hc2spIHsKKyAgICBwRGVzdEJ1ZmZlciA9IHBGbGlwcGVkLT5tX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpOworICAgIEZYX0RXT1JEIGRlc3RfcGl0Y2ggPSBwRmxpcHBlZC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpOworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBtX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyk7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPQorICAgICAgICAgIHBEZXN0QnVmZmVyICsgZGVzdF9waXRjaCAqIChiWUZsaXAgPyAobV9IZWlnaHQgLSByb3cgLSAxKSA6IHJvdyk7CisgICAgICBpZiAoIWJYRmxpcCkgeworICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2NhbiwgZGVzdF9waXRjaCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IChtX1dpZHRoIC0gMSk7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19zY2FuOworICAgICAgICBkZXN0X3NjYW4tLTsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHBGbGlwcGVkOworfQorQ0ZYX0RJQkV4dHJhY3Rvcjo6Q0ZYX0RJQkV4dHJhY3Rvcihjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKSB7CisgIG1fcEJpdG1hcCA9IE5VTEw7CisgIGlmIChwU3JjLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7CisgICAgbV9wQml0bWFwID0gcFNyYy0+Q2xvbmUoKTsKKyAgfSBlbHNlIHsKICAgICBtX3BCaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOwogICAgIGlmICghbV9wQml0bWFwKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghbV9wQml0bWFwLT5DcmVhdGUocFNyYy0+R2V0V2lkdGgoKSwgcFNyYy0+R2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjLT5HZXRGb3JtYXQoKSwgcFNyYy0+R2V0QnVmZmVyKCkpKSB7CisgICAgICBkZWxldGUgbV9wQml0bWFwOworICAgICAgbV9wQml0bWFwID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV9wQml0bWFwLT5Db3B5UGFsZXR0ZShwU3JjLT5HZXRQYWxldHRlKCkpOworICAgIG1fcEJpdG1hcC0+Q29weUFscGhhTWFzayhwU3JjLT5tX3BBbHBoYU1hc2spOworICB9Cit9CitDRlhfRElCRXh0cmFjdG9yOjp+Q0ZYX0RJQkV4dHJhY3RvcigpIHsKKyAgZGVsZXRlIG1fcEJpdG1hcDsKK30KK0NGWF9GaWx0ZXJlZERJQjo6Q0ZYX0ZpbHRlcmVkRElCKCkgeworICBtX3BTY2FubGluZSA9IE5VTEw7CisgIG1fcFNyYyA9IE5VTEw7Cit9CitDRlhfRmlsdGVyZWRESUI6On5DRlhfRmlsdGVyZWRESUIoKSB7CisgIGlmIChtX2JBdXRvRHJvcFNyYykgeworICAgIGRlbGV0ZSBtX3BTcmM7CisgIH0KKyAgaWYgKG1fcFNjYW5saW5lKSB7CisgICAgRlhfRnJlZShtX3BTY2FubGluZSk7CisgIH0KK30KK3ZvaWQgQ0ZYX0ZpbHRlcmVkRElCOjpMb2FkU3JjKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIEZYX0JPT0wgYkF1dG9Ecm9wU3JjKSB7CisgIG1fcFNyYyA9IHBTcmM7CisgIG1fYkF1dG9Ecm9wU3JjID0gYkF1dG9Ecm9wU3JjOworICBtX1dpZHRoID0gcFNyYy0+R2V0V2lkdGgoKTsKKyAgbV9IZWlnaHQgPSBwU3JjLT5HZXRIZWlnaHQoKTsKKyAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IEdldERlc3RGb3JtYXQoKTsKKyAgbV9icHAgPSAodWludDhfdClmb3JtYXQ7CisgIG1fQWxwaGFGbGFnID0gKHVpbnQ4X3QpKGZvcm1hdCA+PiA4KTsKKyAgbV9QaXRjaCA9IChtX1dpZHRoICogKGZvcm1hdCAmIDB4ZmYpICsgMzEpIC8gMzIgKiA0OworICBtX3BQYWxldHRlID0gR2V0RGVzdFBhbGV0dGUoKTsKKyAgbV9wU2NhbmxpbmUgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKK30KK2NvbnN0IHVpbnQ4X3QqIENGWF9GaWx0ZXJlZERJQjo6R2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0IHsKKyAgVHJhbnNsYXRlU2NhbmxpbmUobV9wU2NhbmxpbmUsIG1fcFNyYy0+R2V0U2NhbmxpbmUobGluZSkpOworICByZXR1cm4gbV9wU2NhbmxpbmU7Cit9Cit2b2lkIENGWF9GaWx0ZXJlZERJQjo6RG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF93aWR0aCkgY29uc3QgeworICBtX3BTcmMtPkRvd25TYW1wbGVTY2FubGluZShsaW5lLCBkZXN0X3NjYW4sIGRlc3RfYnBwLCBkZXN0X3dpZHRoLCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfbGVmdCwgY2xpcF93aWR0aCk7CisgIFRyYW5zbGF0ZURvd25TYW1wbGVzKGRlc3Rfc2NhbiwgZGVzdF9zY2FuLCBjbGlwX3dpZHRoLCBkZXN0X2JwcCk7Cit9CitDRlhfSW1hZ2VSZW5kZXJlcjo6Q0ZYX0ltYWdlUmVuZGVyZXIoKSB7CisgIG1fU3RhdHVzID0gMDsKKyAgbV9wVHJhbnNmb3JtZXIgPSBOVUxMOworICBtX2JSZ2JCeXRlT3JkZXIgPSBGQUxTRTsKKyAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7Cit9CitDRlhfSW1hZ2VSZW5kZXJlcjo6fkNGWF9JbWFnZVJlbmRlcmVyKCkgeworICBkZWxldGUgbV9wVHJhbnNmb3JtZXI7Cit9CitleHRlcm4gRlhfUkVDVCBfRlhESUJfU3dhcENsaXBCb3goRlhfUkVDVCYgY2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWSk7CitGWF9CT09MIENGWF9JbWFnZVJlbmRlcmVyOjpTdGFydChDRlhfRElCaXRtYXAqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGliX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgbV9NYXRyaXggPSAqcE1hdHJpeDsKKyAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBtX01hdHJpeC5HZXRVbml0UmVjdCgpOworICBGWF9SRUNUIGltYWdlX3JlY3QgPSBpbWFnZV9yZWN0X2YuR2V0T3V0dGVyUmVjdCgpOworICBtX0NsaXBCb3ggPSBwQ2xpcFJnbiA/IHBDbGlwUmduLT5HZXRCb3goKSA6IEZYX1JFQ1QoMCwgMCwgcERldmljZS0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPkdldEhlaWdodCgpKTsKKyAgbV9DbGlwQm94LkludGVyc2VjdChpbWFnZV9yZWN0KTsKKyAgaWYgKG1fQ2xpcEJveC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wRGV2aWNlID0gcERldmljZTsKKyAgbV9wQ2xpcFJnbiA9IHBDbGlwUmduOworICBtX01hc2tDb2xvciA9IG1hc2tfY29sb3I7CisgIG1fQml0bWFwQWxwaGEgPSBiaXRtYXBfYWxwaGE7CisgIG1fTWF0cml4ID0gKnBNYXRyaXg7CisgIG1fRmxhZ3MgPSBkaWJfZmxhZ3M7CisgIG1fQWxwaGFGbGFnID0gYWxwaGFfZmxhZzsKKyAgbV9wSWNjVHJhbnNmb3JtID0gcEljY1RyYW5zZm9ybTsKKyAgbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKKyAgbV9CbGVuZFR5cGUgPSBibGVuZF90eXBlOworICBGWF9CT09MIHJldCA9IFRSVUU7CisgIGlmICgoRlhTWVNfZmFicyhtX01hdHJpeC5iKSA+PSAwLjVmIHx8IG1fTWF0cml4LmEgPT0gMCkgfHwKKyAgICAgIChGWFNZU19mYWJzKG1fTWF0cml4LmMpID49IDAuNWYgfHwgbV9NYXRyaXguZCA9PSAwKSkgeworICAgIGlmIChGWFNZU19mYWJzKG1fTWF0cml4LmEpIDwgRlhTWVNfZmFicyhtX01hdHJpeC5iKSAvIDIwICYmCisgICAgICAgIEZYU1lTX2ZhYnMobV9NYXRyaXguZCkgPCBGWFNZU19mYWJzKG1fTWF0cml4LmMpIC8gMjAgJiYKKyAgICAgICAgRlhTWVNfZmFicyhtX01hdHJpeC5hKSA8IDAuNWYgJiYgRlhTWVNfZmFicyhtX01hdHJpeC5kKSA8IDAuNWYpIHsKKyAgICAgIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOworICAgICAgaW50IGRlc3RfaGVpZ2h0ID0gaW1hZ2VfcmVjdC5IZWlnaHQoKTsKKyAgICAgIEZYX1JFQ1QgYml0bWFwX2NsaXAgPSBtX0NsaXBCb3g7CisgICAgICBiaXRtYXBfY2xpcC5PZmZzZXQoLWltYWdlX3JlY3QubGVmdCwgLWltYWdlX3JlY3QudG9wKTsKKyAgICAgIGJpdG1hcF9jbGlwID0gX0ZYRElCX1N3YXBDbGlwQm94KGJpdG1hcF9jbGlwLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWF0cml4LmMgPiAwLCBtX01hdHJpeC5iIDwgMCk7CisgICAgICBtX0NvbXBvc2VyLkNvbXBvc2UocERldmljZSwgcENsaXBSZ24sIGJpdG1hcF9hbHBoYSwgbWFza19jb2xvciwgbV9DbGlwQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIG1fTWF0cml4LmMgPiAwLCBtX01hdHJpeC5iIDwgMCwgbV9iUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIG1fQmxlbmRUeXBlKTsKKyAgICAgIGlmICghbV9TdHJldGNoZXIuU3RhcnQoJm1fQ29tcG9zZXIsIHBTb3VyY2UsIGRlc3RfaGVpZ2h0LCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBfY2xpcCwgZGliX2ZsYWdzKSkgewogICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBtX1N0YXR1cyA9IDE7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgaWYgKCFtX3BCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBzcmNfZm9ybWF0KSkgewotICAgICAgICBkZWxldGUgbV9wQml0bWFwOwotICAgICAgICBtX3BCaXRtYXAgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgbV9TdGF0dXMgPSAyOworICAgIG1fcFRyYW5zZm9ybWVyID0gRlhfTkVXIENGWF9JbWFnZVRyYW5zZm9ybWVyOworICAgIGlmICghbV9wVHJhbnNmb3JtZXIpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKHBTcmNQYWxldHRlKSB7Ci0gICAgICAgIG1fcEJpdG1hcC0+Q29weVBhbGV0dGUocFNyY1BhbGV0dGUpOwotICAgIH0KKyAgICBtX3BUcmFuc2Zvcm1lci0+U3RhcnQocFNvdXJjZSwgJm1fTWF0cml4LCBkaWJfZmxhZ3MsICZtX0NsaXBCb3gpOwogICAgIHJldHVybiBUUlVFOworICB9CisgIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOworICBpZiAobV9NYXRyaXguYSA8IDApIHsKKyAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7CisgIH0KKyAgaW50IGRlc3RfaGVpZ2h0ID0gaW1hZ2VfcmVjdC5IZWlnaHQoKTsKKyAgaWYgKG1fTWF0cml4LmQgPiAwKSB7CisgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7CisgIH0KKyAgaWYgKGRlc3Rfd2lkdGggPT0gMCB8fCBkZXN0X2hlaWdodCA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX1JFQ1QgYml0bWFwX2NsaXAgPSBtX0NsaXBCb3g7CisgIGJpdG1hcF9jbGlwLk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOworICBtX0NvbXBvc2VyLkNvbXBvc2UocERldmljZSwgcENsaXBSZ24sIGJpdG1hcF9hbHBoYSwgbWFza19jb2xvciwgbV9DbGlwQm94LAorICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSwgbV9CbGVuZFR5cGUpOworICBtX1N0YXR1cyA9IDE7CisgIHJldCA9IG1fU3RyZXRjaGVyLlN0YXJ0KCZtX0NvbXBvc2VyLCBwU291cmNlLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwX2NsaXAsIGRpYl9mbGFncyk7CisgIHJldHVybiByZXQ7Cit9CitGWF9CT09MIENGWF9JbWFnZVJlbmRlcmVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAobV9TdGF0dXMgPT0gMSkgeworICAgIHJldHVybiBtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpOworICB9CisgIGlmIChtX1N0YXR1cyA9PSAyKSB7CisgICAgaWYgKG1fcFRyYW5zZm9ybWVyLT5Db250aW51ZShwUGF1c2UpKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbV9wVHJhbnNmb3JtZXItPm1fU3RvcmVyLkRldGFjaCgpOworICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKHBCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKKyAgICAgIGRlbGV0ZSBwQml0bWFwOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgeworICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7CisgICAgICAgIGlmIChtX0FscGhhRmxhZyA+PiA4KSB7CisgICAgICAgICAgbV9BbHBoYUZsYWcgPQorICAgICAgICAgICAgICAoKCh1aW50OF90KSgobV9BbHBoYUZsYWcgJiAweGZmKSAqIG1fQml0bWFwQWxwaGEgLyAyNTUpKSB8CisgICAgICAgICAgICAgICAoKG1fQWxwaGFGbGFnID4+IDgpIDw8IDgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX01hc2tDb2xvciA9IEZYQVJHQl9NVUxfQUxQSEEobV9NYXNrQ29sb3IsIG1fQml0bWFwQWxwaGEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBtX3BEZXZpY2UtPkNvbXBvc2l0ZU1hc2sobV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0TGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFuc2Zvcm1lci0+bV9SZXN1bHRUb3AsIHBCaXRtYXAtPkdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcC0+R2V0SGVpZ2h0KCksIHBCaXRtYXAsIG1fTWFza0NvbG9yLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9BbHBoYUZsYWcsIG1fcEljY1RyYW5zZm9ybSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgeworICAgICAgICBwQml0bWFwLT5NdWx0aXBseUFscGhhKG1fQml0bWFwQWxwaGEpOworICAgICAgfQorICAgICAgbV9wRGV2aWNlLT5Db21wb3NpdGVCaXRtYXAoCisgICAgICAgICAgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0TGVmdCwgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0VG9wLAorICAgICAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQml0bWFwLCAwLCAwLCBtX0JsZW5kVHlwZSwKKyAgICAgICAgICBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsIG1fcEljY1RyYW5zZm9ybSk7CisgICAgfQorICAgIGRlbGV0ZSBwQml0bWFwOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitDRlhfQml0bWFwU3RvcmVyOjpDRlhfQml0bWFwU3RvcmVyKCkgeworICBtX3BCaXRtYXAgPSBOVUxMOworfQorQ0ZYX0JpdG1hcFN0b3Jlcjo6fkNGWF9CaXRtYXBTdG9yZXIoKSB7CisgIGRlbGV0ZSBtX3BCaXRtYXA7Cit9CitDRlhfRElCaXRtYXAqIENGWF9CaXRtYXBTdG9yZXI6OkRldGFjaCgpIHsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbV9wQml0bWFwOworICBtX3BCaXRtYXAgPSBOVUxMOworICByZXR1cm4gcEJpdG1hcDsKK30KK3ZvaWQgQ0ZYX0JpdG1hcFN0b3Jlcjo6UmVwbGFjZShDRlhfRElCaXRtYXAqIHBCaXRtYXApIHsKKyAgZGVsZXRlIG1fcEJpdG1hcDsKKyAgbV9wQml0bWFwID0gcEJpdG1hcDsKK30KK3ZvaWQgQ0ZYX0JpdG1hcFN0b3Jlcjo6Q29tcG9zZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2NhbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhKSB7CisgIHVpbnQ4X3QqIGRlc3RfYnVmID0gKHVpbnQ4X3QqKW1fcEJpdG1hcC0+R2V0U2NhbmxpbmUobGluZSk7CisgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfYnVmID0KKyAgICAgIG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrCisgICAgICAgICAgPyAodWludDhfdCopbV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGxpbmUpCisgICAgICAgICAgOiBOVUxMOworICBpZiAoZGVzdF9idWYpIHsKKyAgICBGWFNZU19tZW1jcHkoZGVzdF9idWYsIHNjYW5saW5lLCBtX3BCaXRtYXAtPkdldFBpdGNoKCkpOworICB9CisgIGlmIChkZXN0X2FscGhhX2J1ZikgeworICAgIEZYU1lTX21lbWNweShkZXN0X2FscGhhX2J1Ziwgc2Nhbl9leHRyYV9hbHBoYSwKKyAgICAgICAgICAgICAgICAgbV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFBpdGNoKCkpOworICB9Cit9CitGWF9CT09MIENGWF9CaXRtYXBTdG9yZXI6OlNldEluZm8oaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBTcmNQYWxldHRlKSB7CisgIG1fcEJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7CisgIGlmICghbV9wQml0bWFwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghbV9wQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgc3JjX2Zvcm1hdCkpIHsKKyAgICBkZWxldGUgbV9wQml0bWFwOworICAgIG1fcEJpdG1hcCA9IE5VTEw7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChwU3JjUGFsZXR0ZSkgeworICAgIG1fcEJpdG1hcC0+Q29weVBhbGV0dGUocFNyY1BhbGV0dGUpOworICB9CisgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX3RyYW5zZm9ybS5jcHAgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfdHJhbnNmb3JtLmNwcAppbmRleCBhZDBhM2QzLi4zNWY4YmZlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfdHJhbnNmb3JtLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfdHJhbnNmb3JtLmNwcApAQCAtNyw3OTAgKzcsOTM4IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2RpYi5oIgogI2luY2x1ZGUgImRpYl9pbnQuaCIKIGludCBTRFBfVGFibGVbNTEzXSA9IHsKLSAgICAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTQsIDI1NCwgMjU0LCAyNTQsCi0gICAgMjUzLCAyNTMsIDI1MywgMjUyLCAyNTIsIDI1MiwgMjUxLCAyNTEsIDI1MSwgMjUwLCAyNTAsIDI0OSwgMjQ5LCAyNDksIDI0OCwgMjQ4LCAyNDcsIDI0NywgMjQ2LAotICAgIDI0NiwgMjQ1LCAyNDQsIDI0NCwgMjQzLCAyNDMsIDI0MiwgMjQyLCAyNDEsIDI0MCwgMjQwLCAyMzksIDIzOCwgMjM4LCAyMzcsIDIzNiwgMjM2LCAyMzUsIDIzNCwKLSAgICAyMzMsIDIzMywgMjMyLCAyMzEsIDIzMCwgMjMwLCAyMjksIDIyOCwgMjI3LCAyMjYsIDIyNiwgMjI1LCAyMjQsIDIyMywgMjIyLCAyMjEsIDIyMCwgMjE5LCAyMTgsCi0gICAgMjE4LCAyMTcsIDIxNiwgMjE1LCAyMTQsIDIxMywgMjEyLCAyMTEsIDIxMCwgMjA5LCAyMDgsIDIwNywgMjA2LCAyMDUsIDIwNCwgMjAzLCAyMDIsIDIwMSwgMjAwLAotICAgIDE5OSwgMTk4LCAxOTYsIDE5NSwgMTk0LCAxOTMsIDE5MiwgMTkxLCAxOTAsIDE4OSwgMTg4LCAxODYsIDE4NSwgMTg0LCAxODMsIDE4MiwgMTgxLCAxNzksIDE3OCwKLSAgICAxNzcsIDE3NiwgMTc1LCAxNzMsIDE3MiwgMTcxLCAxNzAsIDE2OSwgMTY3LCAxNjYsIDE2NSwgMTY0LCAxNjIsIDE2MSwgMTYwLCAxNTksIDE1NywgMTU2LCAxNTUsCi0gICAgMTU0LCAxNTIsIDE1MSwgMTUwLCAxNDksIDE0NywgMTQ2LCAxNDUsIDE0MywgMTQyLCAxNDEsIDE0MCwgMTM4LCAxMzcsIDEzNiwgMTM0LCAxMzMsIDEzMiwgMTMwLAotICAgIDEyOSwgMTI4LCAxMjYsIDEyNSwgMTI0LCAxMjIsIDEyMSwgMTIwLCAxMTksIDExNywgMTE2LCAxMTUsIDExMywgMTEyLCAxMTEsIDEwOSwgMTA4LCAxMDcsIDEwNSwKLSAgICAxMDQsIDEwMywgMTAxLCAxMDAsIDk5LCA5NywgOTYsIDk1LCA5MywgOTIsIDkxLCA4OSwgODgsIDg3LCA4NSwgODQsIDgzLCA4MSwgODAsIDc5LCA3NywgNzYsIDc1LAotICAgIDczLCA3MiwgNzEsIDY5LCA2OCwgNjcsIDY2LCA2NCwgNjMsIDYyLCA2MCwgNTksIDU4LCA1NywgNTUsIDU0LCA1MywgNTIsIDUwLCA0OSwgNDgsIDQ3LCA0NSwgNDQsCi0gICAgNDMsIDQyLCA0MCwgMzksIDM4LCAzNywgMzYsIDM0LCAzMywgMzIsIDMxLCAzMCwgMjgsIDI3LCAyNiwgMjUsIDI0LCAyMywgMjEsIDIwLCAxOSwgMTgsIDE3LCAxNiwKLSAgICAxNSwgMTQsIDEzLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAsIDAsIC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtNywgLTgsIC05LCAtMTAsCi0gICAgLTExLCAtMTIsIC0xMiwgLTEzLCAtMTQsIC0xNSwgLTE1LCAtMTYsIC0xNywgLTE3LCAtMTgsIC0xOSwgLTE5LCAtMjAsIC0yMSwgLTIxLCAtMjIsIC0yMiwgLTIzLCAtMjQsCi0gICAgLTI0LCAtMjUsIC0yNSwgLTI2LCAtMjYsIC0yNywgLTI3LCAtMjcsIC0yOCwgLTI4LCAtMjksIC0yOSwgLTMwLCAtMzAsIC0zMCwgLTMxLCAtMzEsIC0zMSwgLTMyLCAtMzIsCi0gICAgLTMyLCAtMzMsIC0zMywgLTMzLCAtMzMsIC0zNCwgLTM0LCAtMzQsIC0zNCwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzUsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsCi0gICAgLTM2LCAtMzYsIC0zNiwgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsCi0gICAgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzUsIC0zNSwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzQsCi0gICAgLTM0LCAtMzQsIC0zNCwgLTM0LCAtMzMsIC0zMywgLTMzLCAtMzMsIC0zMywgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzEsIC0zMSwgLTMxLCAtMzEsIC0zMCwgLTMwLCAtMzAsCi0gICAgLTMwLCAtMjksIC0yOSwgLTI5LCAtMjksIC0yOCwgLTI4LCAtMjgsIC0yNywgLTI3LCAtMjcsIC0yNywgLTI2LCAtMjYsIC0yNiwgLTI1LCAtMjUsIC0yNSwgLTI0LCAtMjQsCi0gICAgLTI0LCAtMjMsIC0yMywgLTIzLCAtMjIsIC0yMiwgLTIyLCAtMjIsIC0yMSwgLTIxLCAtMjEsIC0yMCwgLTIwLCAtMjAsIC0xOSwgLTE5LCAtMTksIC0xOCwgLTE4LCAtMTgsCi0gICAgLTE3LCAtMTcsIC0xNywgLTE2LCAtMTYsIC0xNiwgLTE1LCAtMTUsIC0xNSwgLTE0LCAtMTQsIC0xNCwgLTEzLCAtMTMsIC0xMywgLTEyLCAtMTIsIC0xMiwgLTExLCAtMTEsCi0gICAgLTExLCAtMTAsIC0xMCwgLTEwLCAtOSwgLTksIC05LCAtOSwgLTgsIC04LCAtOCwgLTcsIC03LCAtNywgLTcsIC02LCAtNiwgLTYsIC02LCAtNSwgLTUsIC01LCAtNSwgLTQsCi0gICAgLTQsIC00LCAtNCwgLTMsIC0zLCAtMywgLTMsIC0zLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjUzLCAyNTMsIDI1MywgMjUyLCAyNTIsIDI1MiwgMjUxLCAyNTEsIDI1MSwgMjUwLCAyNTAsCisgICAgMjQ5LCAyNDksIDI0OSwgMjQ4LCAyNDgsIDI0NywgMjQ3LCAyNDYsIDI0NiwgMjQ1LCAyNDQsIDI0NCwgMjQzLCAyNDMsIDI0MiwKKyAgICAyNDIsIDI0MSwgMjQwLCAyNDAsIDIzOSwgMjM4LCAyMzgsIDIzNywgMjM2LCAyMzYsIDIzNSwgMjM0LCAyMzMsIDIzMywgMjMyLAorICAgIDIzMSwgMjMwLCAyMzAsIDIyOSwgMjI4LCAyMjcsIDIyNiwgMjI2LCAyMjUsIDIyNCwgMjIzLCAyMjIsIDIyMSwgMjIwLCAyMTksCisgICAgMjE4LCAyMTgsIDIxNywgMjE2LCAyMTUsIDIxNCwgMjEzLCAyMTIsIDIxMSwgMjEwLCAyMDksIDIwOCwgMjA3LCAyMDYsIDIwNSwKKyAgICAyMDQsIDIwMywgMjAyLCAyMDEsIDIwMCwgMTk5LCAxOTgsIDE5NiwgMTk1LCAxOTQsIDE5MywgMTkyLCAxOTEsIDE5MCwgMTg5LAorICAgIDE4OCwgMTg2LCAxODUsIDE4NCwgMTgzLCAxODIsIDE4MSwgMTc5LCAxNzgsIDE3NywgMTc2LCAxNzUsIDE3MywgMTcyLCAxNzEsCisgICAgMTcwLCAxNjksIDE2NywgMTY2LCAxNjUsIDE2NCwgMTYyLCAxNjEsIDE2MCwgMTU5LCAxNTcsIDE1NiwgMTU1LCAxNTQsIDE1MiwKKyAgICAxNTEsIDE1MCwgMTQ5LCAxNDcsIDE0NiwgMTQ1LCAxNDMsIDE0MiwgMTQxLCAxNDAsIDEzOCwgMTM3LCAxMzYsIDEzNCwgMTMzLAorICAgIDEzMiwgMTMwLCAxMjksIDEyOCwgMTI2LCAxMjUsIDEyNCwgMTIyLCAxMjEsIDEyMCwgMTE5LCAxMTcsIDExNiwgMTE1LCAxMTMsCisgICAgMTEyLCAxMTEsIDEwOSwgMTA4LCAxMDcsIDEwNSwgMTA0LCAxMDMsIDEwMSwgMTAwLCA5OSwgIDk3LCAgOTYsICA5NSwgIDkzLAorICAgIDkyLCAgOTEsICA4OSwgIDg4LCAgODcsICA4NSwgIDg0LCAgODMsICA4MSwgIDgwLCAgNzksICA3NywgIDc2LCAgNzUsICA3MywKKyAgICA3MiwgIDcxLCAgNjksICA2OCwgIDY3LCAgNjYsICA2NCwgIDYzLCAgNjIsICA2MCwgIDU5LCAgNTgsICA1NywgIDU1LCAgNTQsCisgICAgNTMsICA1MiwgIDUwLCAgNDksICA0OCwgIDQ3LCAgNDUsICA0NCwgIDQzLCAgNDIsICA0MCwgIDM5LCAgMzgsICAzNywgIDM2LAorICAgIDM0LCAgMzMsICAzMiwgIDMxLCAgMzAsICAyOCwgIDI3LCAgMjYsICAyNSwgIDI0LCAgMjMsICAyMSwgIDIwLCAgMTksICAxOCwKKyAgICAxNywgIDE2LCAgMTUsICAxNCwgIDEzLCAgMTEsICAxMCwgIDksICAgOCwgICA3LCAgIDYsICAgNSwgICA0LCAgIDMsICAgMiwKKyAgICAxLCAgIDAsICAgMCwgICAtMSwgIC0yLCAgLTMsICAtNCwgIC01LCAgLTYsICAtNywgIC03LCAgLTgsICAtOSwgIC0xMCwgLTExLAorICAgIC0xMiwgLTEyLCAtMTMsIC0xNCwgLTE1LCAtMTUsIC0xNiwgLTE3LCAtMTcsIC0xOCwgLTE5LCAtMTksIC0yMCwgLTIxLCAtMjEsCisgICAgLTIyLCAtMjIsIC0yMywgLTI0LCAtMjQsIC0yNSwgLTI1LCAtMjYsIC0yNiwgLTI3LCAtMjcsIC0yNywgLTI4LCAtMjgsIC0yOSwKKyAgICAtMjksIC0zMCwgLTMwLCAtMzAsIC0zMSwgLTMxLCAtMzEsIC0zMiwgLTMyLCAtMzIsIC0zMywgLTMzLCAtMzMsIC0zMywgLTM0LAorICAgIC0zNCwgLTM0LCAtMzQsIC0zNSwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsCisgICAgLTM2LCAtMzYsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywKKyAgICAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LAorICAgIC0zNiwgLTM2LCAtMzUsIC0zNSwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzQsIC0zNCwgLTM0LCAtMzQsIC0zNCwgLTMzLCAtMzMsCisgICAgLTMzLCAtMzMsIC0zMywgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzEsIC0zMSwgLTMxLCAtMzEsIC0zMCwgLTMwLCAtMzAsIC0zMCwKKyAgICAtMjksIC0yOSwgLTI5LCAtMjksIC0yOCwgLTI4LCAtMjgsIC0yNywgLTI3LCAtMjcsIC0yNywgLTI2LCAtMjYsIC0yNiwgLTI1LAorICAgIC0yNSwgLTI1LCAtMjQsIC0yNCwgLTI0LCAtMjMsIC0yMywgLTIzLCAtMjIsIC0yMiwgLTIyLCAtMjIsIC0yMSwgLTIxLCAtMjEsCisgICAgLTIwLCAtMjAsIC0yMCwgLTE5LCAtMTksIC0xOSwgLTE4LCAtMTgsIC0xOCwgLTE3LCAtMTcsIC0xNywgLTE2LCAtMTYsIC0xNiwKKyAgICAtMTUsIC0xNSwgLTE1LCAtMTQsIC0xNCwgLTE0LCAtMTMsIC0xMywgLTEzLCAtMTIsIC0xMiwgLTEyLCAtMTEsIC0xMSwgLTExLAorICAgIC0xMCwgLTEwLCAtMTAsIC05LCAgLTksICAtOSwgIC05LCAgLTgsICAtOCwgIC04LCAgLTcsICAtNywgIC03LCAgLTcsICAtNiwKKyAgICAtNiwgIC02LCAgLTYsICAtNSwgIC01LCAgLTUsICAtNSwgIC00LCAgLTQsICAtNCwgIC00LCAgLTMsICAtMywgIC0zLCAgLTMsCisgICAgLTMsICAtMiwgIC0yLCAgLTIsICAtMiwgIC0yLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsCiB9OwotY2xhc3MgQ0ZYX0JpbGluZWFyTWF0cml4IDogcHVibGljIENQREZfRml4ZWRNYXRyaXgKLXsKLXB1YmxpYzoKLSAgICBDRlhfQmlsaW5lYXJNYXRyaXgoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgc3JjLCBpbnQgYml0cyk6IENQREZfRml4ZWRNYXRyaXgoc3JjLCBiaXRzKQotICAgIHt9Ci0gICAgaW5saW5lIHZvaWQJVHJhbnNmb3JtKGludCB4LCBpbnQgeSwgaW50JiB4MSwgaW50JiB5MSwgaW50JnJlc194LCBpbnQmcmVzX3kpCi0gICAgewotICAgICAgICB4MSA9IGEgKiB4ICsgYyAqIHkgKyBlICsgYmFzZSAvIDI7Ci0gICAgICAgIHkxID0gYiAqIHggKyBkICogeSArIGYgKyBiYXNlIC8gMjsKLSAgICAgICAgcmVzX3ggPSB4MSAlIGJhc2U7Ci0gICAgICAgIHJlc195ID0geTEgJSBiYXNlOwotICAgICAgICBpZiAocmVzX3ggPCAwICYmIHJlc194ID4gLWJhc2UpIHsKLSAgICAgICAgICAgIHJlc194ID0gYmFzZSArIHJlc194OwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNfeSA8IDAgJiYgcmVzX3ggPiAtYmFzZSkgewotICAgICAgICAgICAgcmVzX3kgPSBiYXNlICsgcmVzX3k7Ci0gICAgICAgIH0KLSAgICAgICAgeDEgLz0gYmFzZTsKLSAgICAgICAgeTEgLz0gYmFzZTsKK2NsYXNzIENGWF9CaWxpbmVhck1hdHJpeCA6IHB1YmxpYyBDUERGX0ZpeGVkTWF0cml4IHsKKyBwdWJsaWM6CisgIENGWF9CaWxpbmVhck1hdHJpeChjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBzcmMsIGludCBiaXRzKQorICAgICAgOiBDUERGX0ZpeGVkTWF0cml4KHNyYywgYml0cykge30KKyAgaW5saW5lIHZvaWQgVHJhbnNmb3JtKGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCYgcmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHJlc195KSB7CisgICAgeDEgPSBhICogeCArIGMgKiB5ICsgZSArIGJhc2UgLyAyOworICAgIHkxID0gYiAqIHggKyBkICogeSArIGYgKyBiYXNlIC8gMjsKKyAgICByZXNfeCA9IHgxICUgYmFzZTsKKyAgICByZXNfeSA9IHkxICUgYmFzZTsKKyAgICBpZiAocmVzX3ggPCAwICYmIHJlc194ID4gLWJhc2UpIHsKKyAgICAgIHJlc194ID0gYmFzZSArIHJlc194OwogICAgIH0KKyAgICBpZiAocmVzX3kgPCAwICYmIHJlc194ID4gLWJhc2UpIHsKKyAgICAgIHJlc195ID0gYmFzZSArIHJlc195OworICAgIH0KKyAgICB4MSAvPSBiYXNlOworICAgIHkxIC89IGJhc2U7CisgIH0KIH07Ci1DRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OlN3YXBYWShGWF9CT09MIGJYRmxpcCwgRlhfQk9PTCBiWUZsaXAsIGNvbnN0IEZYX1JFQ1QqIHBEZXN0Q2xpcCkgY29uc3QKLXsKLSAgICBGWF9SRUNUIGRlc3RfY2xpcCgwLCAwLCBtX0hlaWdodCwgbV9XaWR0aCk7Ci0gICAgaWYgKHBEZXN0Q2xpcCkgewotICAgICAgICBkZXN0X2NsaXAuSW50ZXJzZWN0KCpwRGVzdENsaXApOwotICAgIH0KLSAgICBpZiAoZGVzdF9jbGlwLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNCaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghcFRyYW5zQml0bWFwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpbnQgcmVzdWx0X2hlaWdodCA9IGRlc3RfY2xpcC5IZWlnaHQoKSwgcmVzdWx0X3dpZHRoID0gZGVzdF9jbGlwLldpZHRoKCk7Ci0gICAgaWYgKCFwVHJhbnNCaXRtYXAtPkNyZWF0ZShyZXN1bHRfd2lkdGgsIHJlc3VsdF9oZWlnaHQsIEdldEZvcm1hdCgpKSkgewotICAgICAgICBkZWxldGUgcFRyYW5zQml0bWFwOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcFRyYW5zQml0bWFwLT5Db3B5UGFsZXR0ZShtX3BQYWxldHRlKTsKLSAgICBpbnQgZGVzdF9waXRjaCA9IHBUcmFuc0JpdG1hcC0+R2V0UGl0Y2goKTsKLSAgICB1aW50OF90KiBkZXN0X2J1ZiA9IHBUcmFuc0JpdG1hcC0+R2V0QnVmZmVyKCk7Ci0gICAgaW50IHJvd19zdGFydCA9IGJYRmxpcCA/IG1fSGVpZ2h0IC0gZGVzdF9jbGlwLnJpZ2h0IDogZGVzdF9jbGlwLmxlZnQ7Ci0gICAgaW50IHJvd19lbmQgPSBiWEZsaXAgPyBtX0hlaWdodCAtIGRlc3RfY2xpcC5sZWZ0IDogZGVzdF9jbGlwLnJpZ2h0OwotICAgIGludCBjb2xfc3RhcnQgPSBiWUZsaXAgPyBtX1dpZHRoIC0gZGVzdF9jbGlwLmJvdHRvbSA6IGRlc3RfY2xpcC50b3A7Ci0gICAgaW50IGNvbF9lbmQgPSBiWUZsaXAgPyBtX1dpZHRoIC0gZGVzdF9jbGlwLnRvcCA6IGRlc3RfY2xpcC5ib3R0b207Ci0gICAgaWYgKEdldEJQUCgpID09IDEpIHsKLSAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAweGZmLCBkZXN0X3BpdGNoICogcmVzdWx0X2hlaWdodCk7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IHJvd19zdGFydDsgcm93IDwgcm93X2VuZDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IEdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICBpbnQgZGVzdF9jb2wgPSAoYlhGbGlwID8gZGVzdF9jbGlwLnJpZ2h0IC0gKHJvdyAtIHJvd19zdGFydCkgLSAxIDogcm93KSAtIGRlc3RfY2xpcC5sZWZ0OwotICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWY7Ci0gICAgICAgICAgICBpZiAoYllGbGlwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IChyZXN1bHRfaGVpZ2h0IC0gMSkgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGRlc3Rfc3RlcCA9IGJZRmxpcCA/IC1kZXN0X3BpdGNoIDogZGVzdF9waXRjaDsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfY29sIC8gOF0gJj0gfigxIDw8ICg3IC0gZGVzdF9jb2wgJSA4KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7Ci0gICAgICAgICAgICB9CitDRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OlN3YXBYWShGWF9CT09MIGJYRmxpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYllGbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcERlc3RDbGlwKSBjb25zdCB7CisgIEZYX1JFQ1QgZGVzdF9jbGlwKDAsIDAsIG1fSGVpZ2h0LCBtX1dpZHRoKTsKKyAgaWYgKHBEZXN0Q2xpcCkgeworICAgIGRlc3RfY2xpcC5JbnRlcnNlY3QoKnBEZXN0Q2xpcCk7CisgIH0KKyAgaWYgKGRlc3RfY2xpcC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfRElCaXRtYXAqIHBUcmFuc0JpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7CisgIGlmICghcFRyYW5zQml0bWFwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IHJlc3VsdF9oZWlnaHQgPSBkZXN0X2NsaXAuSGVpZ2h0KCksIHJlc3VsdF93aWR0aCA9IGRlc3RfY2xpcC5XaWR0aCgpOworICBpZiAoIXBUcmFuc0JpdG1hcC0+Q3JlYXRlKHJlc3VsdF93aWR0aCwgcmVzdWx0X2hlaWdodCwgR2V0Rm9ybWF0KCkpKSB7CisgICAgZGVsZXRlIHBUcmFuc0JpdG1hcDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwVHJhbnNCaXRtYXAtPkNvcHlQYWxldHRlKG1fcFBhbGV0dGUpOworICBpbnQgZGVzdF9waXRjaCA9IHBUcmFuc0JpdG1hcC0+R2V0UGl0Y2goKTsKKyAgdWludDhfdCogZGVzdF9idWYgPSBwVHJhbnNCaXRtYXAtPkdldEJ1ZmZlcigpOworICBpbnQgcm93X3N0YXJ0ID0gYlhGbGlwID8gbV9IZWlnaHQgLSBkZXN0X2NsaXAucmlnaHQgOiBkZXN0X2NsaXAubGVmdDsKKyAgaW50IHJvd19lbmQgPSBiWEZsaXAgPyBtX0hlaWdodCAtIGRlc3RfY2xpcC5sZWZ0IDogZGVzdF9jbGlwLnJpZ2h0OworICBpbnQgY29sX3N0YXJ0ID0gYllGbGlwID8gbV9XaWR0aCAtIGRlc3RfY2xpcC5ib3R0b20gOiBkZXN0X2NsaXAudG9wOworICBpbnQgY29sX2VuZCA9IGJZRmxpcCA/IG1fV2lkdGggLSBkZXN0X2NsaXAudG9wIDogZGVzdF9jbGlwLmJvdHRvbTsKKyAgaWYgKEdldEJQUCgpID09IDEpIHsKKyAgICBGWFNZU19tZW1zZXQoZGVzdF9idWYsIDB4ZmYsIGRlc3RfcGl0Y2ggKiByZXN1bHRfaGVpZ2h0KTsKKyAgICBmb3IgKGludCByb3cgPSByb3dfc3RhcnQ7IHJvdyA8IHJvd19lbmQ7IHJvdysrKSB7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IEdldFNjYW5saW5lKHJvdyk7CisgICAgICBpbnQgZGVzdF9jb2wgPSAoYlhGbGlwID8gZGVzdF9jbGlwLnJpZ2h0IC0gKHJvdyAtIHJvd19zdGFydCkgLSAxIDogcm93KSAtCisgICAgICAgICAgICAgICAgICAgICBkZXN0X2NsaXAubGVmdDsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmOworICAgICAgaWYgKGJZRmxpcCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gKHJlc3VsdF9oZWlnaHQgLSAxKSAqIGRlc3RfcGl0Y2g7CisgICAgICB9CisgICAgICBpbnQgZGVzdF9zdGVwID0gYllGbGlwID8gLWRlc3RfcGl0Y2ggOiBkZXN0X3BpdGNoOworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpZiAoIShzcmNfc2Nhbltjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKSkgeworICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2NvbCAvIDhdICY9IH4oMSA8PCAoNyAtIGRlc3RfY29sICUgOCkpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IG5CeXRlcyA9IEdldEJQUCgpIC8gODsKLSAgICAgICAgaW50IGRlc3Rfc3RlcCA9IGJZRmxpcCA/IC1kZXN0X3BpdGNoIDogZGVzdF9waXRjaDsKLSAgICAgICAgaWYgKG5CeXRlcyA9PSAzKSB7Ci0gICAgICAgICAgICBkZXN0X3N0ZXAgLT0gMjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCByb3cgPSByb3dfc3RhcnQ7IHJvdyA8IHJvd19lbmQ7IHJvdyArKykgewotICAgICAgICAgICAgaW50IGRlc3RfY29sID0gKGJYRmxpcCA/IGRlc3RfY2xpcC5yaWdodCAtIChyb3cgLSByb3dfc3RhcnQpIC0gMSA6IHJvdykgLSBkZXN0X2NsaXAubGVmdDsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF9jb2wgKiBuQnl0ZXM7Ci0gICAgICAgICAgICBpZiAoYllGbGlwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IChyZXN1bHRfaGVpZ2h0IC0gMSkgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5CeXRlcyA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQqIHNyY19zY2FuID0gKEZYX0RXT1JEKilHZXRTY2FubGluZShyb3cpICsgY29sX3N0YXJ0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9zdGVwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBHZXRTY2FubGluZShyb3cpICsgY29sX3N0YXJ0ICogbkJ5dGVzOwotICAgICAgICAgICAgICAgIGlmIChuQnl0ZXMgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3Rfc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7CisgICAgICB9CiAgICAgfQotICAgIGlmIChtX3BBbHBoYU1hc2spIHsKLSAgICAgICAgZGVzdF9waXRjaCA9IHBUcmFuc0JpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpOwotICAgICAgICBkZXN0X2J1ZiA9IHBUcmFuc0JpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKTsKLSAgICAgICAgaW50IGRlc3Rfc3RlcCA9IGJZRmxpcCA/IC1kZXN0X3BpdGNoIDogZGVzdF9waXRjaDsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gcm93X3N0YXJ0OyByb3cgPCByb3dfZW5kOyByb3cgKyspIHsKLSAgICAgICAgICAgIGludCBkZXN0X2NvbCA9IChiWEZsaXAgPyBkZXN0X2NsaXAucmlnaHQgLSAocm93IC0gcm93X3N0YXJ0KSAtIDEgOiByb3cpIC0gZGVzdF9jbGlwLmxlZnQ7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIGRlc3RfY29sOwotICAgICAgICAgICAgaWYgKGJZRmxpcCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAocmVzdWx0X2hlaWdodCAtIDEpICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpICsgY29sX3N0YXJ0OwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3Rfc3RlcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICB9IGVsc2UgeworICAgIGludCBuQnl0ZXMgPSBHZXRCUFAoKSAvIDg7CisgICAgaW50IGRlc3Rfc3RlcCA9IGJZRmxpcCA/IC1kZXN0X3BpdGNoIDogZGVzdF9waXRjaDsKKyAgICBpZiAobkJ5dGVzID09IDMpIHsKKyAgICAgIGRlc3Rfc3RlcCAtPSAyOwogICAgIH0KLSAgICByZXR1cm4gcFRyYW5zQml0bWFwOworICAgIGZvciAoaW50IHJvdyA9IHJvd19zdGFydDsgcm93IDwgcm93X2VuZDsgcm93KyspIHsKKyAgICAgIGludCBkZXN0X2NvbCA9IChiWEZsaXAgPyBkZXN0X2NsaXAucmlnaHQgLSAocm93IC0gcm93X3N0YXJ0KSAtIDEgOiByb3cpIC0KKyAgICAgICAgICAgICAgICAgICAgIGRlc3RfY2xpcC5sZWZ0OworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X2NvbCAqIG5CeXRlczsKKyAgICAgIGlmIChiWUZsaXApIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IChyZXN1bHRfaGVpZ2h0IC0gMSkgKiBkZXN0X3BpdGNoOworICAgICAgfQorICAgICAgaWYgKG5CeXRlcyA9PSA0KSB7CisgICAgICAgIEZYX0RXT1JEKiBzcmNfc2NhbiA9IChGWF9EV09SRCopR2V0U2NhbmxpbmUocm93KSArIGNvbF9zdGFydDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICAgICooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9ICpzcmNfc2NhbisrOworICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gR2V0U2NhbmxpbmUocm93KSArIGNvbF9zdGFydCAqIG5CeXRlczsKKyAgICAgICAgaWYgKG5CeXRlcyA9PSAxKQorICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7CisgICAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobV9wQWxwaGFNYXNrKSB7CisgICAgZGVzdF9waXRjaCA9IHBUcmFuc0JpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpOworICAgIGRlc3RfYnVmID0gcFRyYW5zQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpOworICAgIGludCBkZXN0X3N0ZXAgPSBiWUZsaXAgPyAtZGVzdF9waXRjaCA6IGRlc3RfcGl0Y2g7CisgICAgZm9yIChpbnQgcm93ID0gcm93X3N0YXJ0OyByb3cgPCByb3dfZW5kOyByb3crKykgeworICAgICAgaW50IGRlc3RfY29sID0gKGJYRmxpcCA/IGRlc3RfY2xpcC5yaWdodCAtIChyb3cgLSByb3dfc3RhcnQpIC0gMSA6IHJvdykgLQorICAgICAgICAgICAgICAgICAgICAgZGVzdF9jbGlwLmxlZnQ7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIGRlc3RfY29sOworICAgICAgaWYgKGJZRmxpcCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gKHJlc3VsdF9oZWlnaHQgLSAxKSAqIGRlc3RfcGl0Y2g7CisgICAgICB9CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IG1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSArIGNvbF9zdGFydDsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbisrOworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9zdGVwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcFRyYW5zQml0bWFwOwogfQogI2RlZmluZSBGSVgxNl8wMDUgMC4wNWYKLUZYX1JFQ1QgX0ZYRElCX1N3YXBDbGlwQm94KEZYX1JFQ1QmIGNsaXAsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhfQk9PTCBiRmxpcFgsIEZYX0JPT0wgYkZsaXBZKQotewotICAgIEZYX1JFQ1QgcmVjdDsKLSAgICBpZiAoYkZsaXBZKSB7Ci0gICAgICAgIHJlY3QubGVmdCA9IGhlaWdodCAtIGNsaXAudG9wOwotICAgICAgICByZWN0LnJpZ2h0ID0gaGVpZ2h0IC0gY2xpcC5ib3R0b207Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVjdC5sZWZ0ID0gY2xpcC50b3A7Ci0gICAgICAgIHJlY3QucmlnaHQgPSBjbGlwLmJvdHRvbTsKLSAgICB9Ci0gICAgaWYgKGJGbGlwWCkgewotICAgICAgICByZWN0LnRvcCA9IHdpZHRoIC0gY2xpcC5sZWZ0OwotICAgICAgICByZWN0LmJvdHRvbSA9IHdpZHRoIC0gY2xpcC5yaWdodDsKLSAgICB9IGVsc2UgewotICAgICAgICByZWN0LnRvcCA9IGNsaXAubGVmdDsKLSAgICAgICAgcmVjdC5ib3R0b20gPSBjbGlwLnJpZ2h0OwotICAgIH0KLSAgICByZWN0Lk5vcm1hbGl6ZSgpOwotICAgIHJldHVybiByZWN0OworRlhfUkVDVCBfRlhESUJfU3dhcENsaXBCb3goRlhfUkVDVCYgY2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBZKSB7CisgIEZYX1JFQ1QgcmVjdDsKKyAgaWYgKGJGbGlwWSkgeworICAgIHJlY3QubGVmdCA9IGhlaWdodCAtIGNsaXAudG9wOworICAgIHJlY3QucmlnaHQgPSBoZWlnaHQgLSBjbGlwLmJvdHRvbTsKKyAgfSBlbHNlIHsKKyAgICByZWN0LmxlZnQgPSBjbGlwLnRvcDsKKyAgICByZWN0LnJpZ2h0ID0gY2xpcC5ib3R0b207CisgIH0KKyAgaWYgKGJGbGlwWCkgeworICAgIHJlY3QudG9wID0gd2lkdGggLSBjbGlwLmxlZnQ7CisgICAgcmVjdC5ib3R0b20gPSB3aWR0aCAtIGNsaXAucmlnaHQ7CisgIH0gZWxzZSB7CisgICAgcmVjdC50b3AgPSBjbGlwLmxlZnQ7CisgICAgcmVjdC5ib3R0b20gPSBjbGlwLnJpZ2h0OworICB9CisgIHJlY3QuTm9ybWFsaXplKCk7CisgIHJldHVybiByZWN0OwogfQotQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpUcmFuc2Zvcm1Ubyhjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRGVzdE1hdHJpeCwgaW50JiByZXN1bHRfbGVmdCwgaW50JiByZXN1bHRfdG9wLAotICAgICAgICBGWF9EV09SRCBmbGFncywgY29uc3QgRlhfUkVDVCogcERlc3RDbGlwKSBjb25zdAotewotICAgIENGWF9JbWFnZVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyOwotICAgIHRyYW5zZm9ybWVyLlN0YXJ0KHRoaXMsIHBEZXN0TWF0cml4LCBmbGFncywgcERlc3RDbGlwKTsKLSAgICB0cmFuc2Zvcm1lci5Db250aW51ZShOVUxMKTsKLSAgICByZXN1bHRfbGVmdCA9IHRyYW5zZm9ybWVyLm1fUmVzdWx0TGVmdDsKLSAgICByZXN1bHRfdG9wID0gdHJhbnNmb3JtZXIubV9SZXN1bHRUb3A7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSB0cmFuc2Zvcm1lci5tX1N0b3Jlci5EZXRhY2goKTsKLSAgICByZXR1cm4gcFRyYW5zZm9ybWVkOworQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpUcmFuc2Zvcm1Ubyhjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRGVzdE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiByZXN1bHRfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiByZXN1bHRfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcERlc3RDbGlwKSBjb25zdCB7CisgIENGWF9JbWFnZVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyOworICB0cmFuc2Zvcm1lci5TdGFydCh0aGlzLCBwRGVzdE1hdHJpeCwgZmxhZ3MsIHBEZXN0Q2xpcCk7CisgIHRyYW5zZm9ybWVyLkNvbnRpbnVlKE5VTEwpOworICByZXN1bHRfbGVmdCA9IHRyYW5zZm9ybWVyLm1fUmVzdWx0TGVmdDsKKyAgcmVzdWx0X3RvcCA9IHRyYW5zZm9ybWVyLm1fUmVzdWx0VG9wOworICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9IHRyYW5zZm9ybWVyLm1fU3RvcmVyLkRldGFjaCgpOworICByZXR1cm4gcFRyYW5zZm9ybWVkOwogfQotQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpTdHJldGNoVG8oaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwKSBjb25zdAotewotICAgIEZYX1JFQ1QgY2xpcF9yZWN0KDAsIDAsIEZYU1lTX2FicyhkZXN0X3dpZHRoKSwgRlhTWVNfYWJzKGRlc3RfaGVpZ2h0KSk7Ci0gICAgaWYgKHBDbGlwKSB7Ci0gICAgICAgIGNsaXBfcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKLSAgICB9Ci0gICAgaWYgKGNsaXBfcmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChkZXN0X3dpZHRoID09IG1fV2lkdGggJiYgZGVzdF9oZWlnaHQgPT0gbV9IZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuIENsb25lKCZjbGlwX3JlY3QpOwotICAgIH0KLSAgICBDRlhfSW1hZ2VTdHJldGNoZXIgc3RyZXRjaGVyOwotICAgIENGWF9CaXRtYXBTdG9yZXIgc3RvcmVyOwotICAgIGlmIChzdHJldGNoZXIuU3RhcnQoJnN0b3JlciwgdGhpcywgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGNsaXBfcmVjdCwgZmxhZ3MpKSB7Ci0gICAgICAgIHN0cmV0Y2hlci5Db250aW51ZShOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0b3Jlci5EZXRhY2goKTsKK0NGWF9ESUJpdG1hcCogQ0ZYX0RJQlNvdXJjZTo6U3RyZXRjaFRvKGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCkgY29uc3QgeworICBGWF9SRUNUIGNsaXBfcmVjdCgwLCAwLCBGWFNZU19hYnMoZGVzdF93aWR0aCksIEZYU1lTX2FicyhkZXN0X2hlaWdodCkpOworICBpZiAocENsaXApIHsKKyAgICBjbGlwX3JlY3QuSW50ZXJzZWN0KCpwQ2xpcCk7CisgIH0KKyAgaWYgKGNsaXBfcmVjdC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoZGVzdF93aWR0aCA9PSBtX1dpZHRoICYmIGRlc3RfaGVpZ2h0ID09IG1fSGVpZ2h0KSB7CisgICAgcmV0dXJuIENsb25lKCZjbGlwX3JlY3QpOworICB9CisgIENGWF9JbWFnZVN0cmV0Y2hlciBzdHJldGNoZXI7CisgIENGWF9CaXRtYXBTdG9yZXIgc3RvcmVyOworICBpZiAoc3RyZXRjaGVyLlN0YXJ0KCZzdG9yZXIsIHRoaXMsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBjbGlwX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpKSB7CisgICAgc3RyZXRjaGVyLkNvbnRpbnVlKE5VTEwpOworICB9CisgIHJldHVybiBzdG9yZXIuRGV0YWNoKCk7CiB9Ci1DRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6Q0ZYX0ltYWdlVHJhbnNmb3JtZXIoKQotewotICAgIG1fU3RhdHVzID0gMDsKLSAgICBtX3BNYXRyaXggPSBOVUxMOworQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OkNGWF9JbWFnZVRyYW5zZm9ybWVyKCkgeworICBtX1N0YXR1cyA9IDA7CisgIG1fcE1hdHJpeCA9IE5VTEw7CiB9Ci1DRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6fkNGWF9JbWFnZVRyYW5zZm9ybWVyKCkKLXsKLX0KLUZYX0JPT0wgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OlN0YXJ0KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXN0TWF0cml4LCBpbnQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBEZXN0Q2xpcCkKLXsKLSAgICBtX3BNYXRyaXggPSAoQ0ZYX0FmZmluZU1hdHJpeCopcERlc3RNYXRyaXg7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCB1bml0X3JlY3QgPSBwRGVzdE1hdHJpeC0+R2V0VW5pdFJlY3QoKTsKLSAgICBGWF9SRUNUIHJlc3VsdF9yZWN0ID0gdW5pdF9yZWN0LkdldENsb3Nlc3RSZWN0KCk7Ci0gICAgRlhfUkVDVCByZXN1bHRfY2xpcCA9IHJlc3VsdF9yZWN0OwotICAgIGlmIChwRGVzdENsaXApIHsKLSAgICAgICAgcmVzdWx0X2NsaXAuSW50ZXJzZWN0KCpwRGVzdENsaXApOwotICAgIH0KLSAgICBpZiAocmVzdWx0X2NsaXAuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9SZXN1bHRMZWZ0ID0gcmVzdWx0X2NsaXAubGVmdDsKLSAgICBtX1Jlc3VsdFRvcCA9IHJlc3VsdF9jbGlwLnRvcDsKLSAgICBtX1Jlc3VsdFdpZHRoID0gcmVzdWx0X2NsaXAuV2lkdGgoKTsKLSAgICBtX1Jlc3VsdEhlaWdodCA9IHJlc3VsdF9jbGlwLkhlaWdodCgpOwotICAgIG1fRmxhZ3MgPSBmbGFnczsKLSAgICBpZiAoRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YSkgPCBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5iKSAvIDIwICYmCi0gICAgICAgICAgICBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5kKSA8IEZYU1lTX2ZhYnMocERlc3RNYXRyaXgtPmMpIC8gMjAgJiYKLSAgICAgICAgICAgIEZYU1lTX2ZhYnMocERlc3RNYXRyaXgtPmEpIDwgMC41ZiAmJiBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5kKSA8IDAuNWYpIHsKLSAgICAgICAgaW50IGRlc3Rfd2lkdGggPSByZXN1bHRfcmVjdC5XaWR0aCgpOwotICAgICAgICBpbnQgZGVzdF9oZWlnaHQgPSByZXN1bHRfcmVjdC5IZWlnaHQoKTsKLSAgICAgICAgcmVzdWx0X2NsaXAuT2Zmc2V0KC1yZXN1bHRfcmVjdC5sZWZ0LCAtcmVzdWx0X3JlY3QudG9wKTsKLSAgICAgICAgcmVzdWx0X2NsaXAgPSBfRlhESUJfU3dhcENsaXBCb3gocmVzdWx0X2NsaXAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBwRGVzdE1hdHJpeC0+YyA+IDAsIHBEZXN0TWF0cml4LT5iIDwgMCk7Ci0gICAgICAgIG1fU3RyZXRjaGVyLlN0YXJ0KCZtX1N0b3JlciwgcFNyYywgZGVzdF9oZWlnaHQsIGRlc3Rfd2lkdGgsIHJlc3VsdF9jbGlwLCBmbGFncyk7Ci0gICAgICAgIG1fU3RhdHVzID0gMTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5iKSA8IEZJWDE2XzAwNSAmJiBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5jKSA8IEZJWDE2XzAwNSkgewotICAgICAgICBpbnQgZGVzdF93aWR0aCA9IHBEZXN0TWF0cml4LT5hID4gMCA/IChpbnQpRlhTWVNfY2VpbChwRGVzdE1hdHJpeC0+YSkgOiAoaW50KUZYU1lTX2Zsb29yKHBEZXN0TWF0cml4LT5hKTsKLSAgICAgICAgaW50IGRlc3RfaGVpZ2h0ID0gcERlc3RNYXRyaXgtPmQgPiAwID8gKGludCkgLSBGWFNZU19jZWlsKHBEZXN0TWF0cml4LT5kKSA6IChpbnQpIC0gRlhTWVNfZmxvb3IocERlc3RNYXRyaXgtPmQpOwotICAgICAgICByZXN1bHRfY2xpcC5PZmZzZXQoLXJlc3VsdF9yZWN0LmxlZnQsIC1yZXN1bHRfcmVjdC50b3ApOwotICAgICAgICBtX1N0cmV0Y2hlci5TdGFydCgmbV9TdG9yZXIsIHBTcmMsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCByZXN1bHRfY2xpcCwgZmxhZ3MpOwotICAgICAgICBtX1N0YXR1cyA9IDI7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpbnQgc3RyZXRjaF93aWR0aCA9IChpbnQpRlhTWVNfY2VpbChGWFNZU19zcXJ0MihwRGVzdE1hdHJpeC0+YSwgcERlc3RNYXRyaXgtPmIpKTsKLSAgICBpbnQgc3RyZXRjaF9oZWlnaHQgPSAoaW50KUZYU1lTX2NlaWwoRlhTWVNfc3FydDIocERlc3RNYXRyaXgtPmMsIHBEZXN0TWF0cml4LT5kKSk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBzdHJldGNoMmRlc3QoMS4wZiwgMC4wZiwgMC4wZiwgLTEuMGYsIDAuMGYsIChGWF9GTE9BVCkoc3RyZXRjaF9oZWlnaHQpKTsKLSAgICBzdHJldGNoMmRlc3QuQ29uY2F0KHBEZXN0TWF0cml4LT5hIC8gc3RyZXRjaF93aWR0aCwgcERlc3RNYXRyaXgtPmIgLyBzdHJldGNoX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3RNYXRyaXgtPmMgLyBzdHJldGNoX2hlaWdodCwgcERlc3RNYXRyaXgtPmQgLyBzdHJldGNoX2hlaWdodCwgcERlc3RNYXRyaXgtPmUsIHBEZXN0TWF0cml4LT5mKTsKLSAgICBtX2Rlc3Qyc3RyZXRjaC5TZXRSZXZlcnNlKHN0cmV0Y2gyZGVzdCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBjbGlwX3JlY3RfZihyZXN1bHRfY2xpcCk7Ci0gICAgY2xpcF9yZWN0X2YuVHJhbnNmb3JtKCZtX2Rlc3Qyc3RyZXRjaCk7Ci0gICAgbV9TdHJldGNoQ2xpcCA9IGNsaXBfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKLSAgICBtX1N0cmV0Y2hDbGlwLkludGVyc2VjdCgwLCAwLCBzdHJldGNoX3dpZHRoLCBzdHJldGNoX2hlaWdodCk7Ci0gICAgbV9TdHJldGNoZXIuU3RhcnQoJm1fU3RvcmVyLCBwU3JjLCBzdHJldGNoX3dpZHRoLCBzdHJldGNoX2hlaWdodCwgbV9TdHJldGNoQ2xpcCwgZmxhZ3MpOwotICAgIG1fU3RhdHVzID0gMzsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXVpbnQ4X3QgX2JpbGluZWFyX2ludGVycG9sKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50IHJvd19vZmZzZXRfbCwgaW50IHJvd19vZmZzZXRfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX2wsIGludCBzcmNfY29sX3IsIGludCByZXNfeCwgaW50IHJlc195LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwcCwgaW50IGNfb2Zmc2V0KQotewotICAgIGludCBpX3Jlc3ggPSAyNTUgLSByZXNfeDsKLSAgICBpbnQgY29sX2JwcF9sID0gc3JjX2NvbF9sICogYnBwOwotICAgIGludCBjb2xfYnBwX3IgPSBzcmNfY29sX3IgKiBicHA7Ci0gICAgY29uc3QgdWludDhfdCogYnVmX3UgPSBidWYgKyByb3dfb2Zmc2V0X2wgKyBjX29mZnNldDsKLSAgICBjb25zdCB1aW50OF90KiBidWZfZCA9IGJ1ZiArIHJvd19vZmZzZXRfciArIGNfb2Zmc2V0OwotICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MwID0gYnVmX3UgKyBjb2xfYnBwX2w7Ci0gICAgY29uc3QgdWludDhfdCogc3JjX3BvczEgPSBidWZfdSArIGNvbF9icHBfcjsKLSAgICBjb25zdCB1aW50OF90KiBzcmNfcG9zMiA9IGJ1Zl9kICsgY29sX2JwcF9sOwotICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MzID0gYnVmX2QgKyBjb2xfYnBwX3I7Ci0gICAgdWludDhfdCByX3Bvc18wID0gKCpzcmNfcG9zMCAqIGlfcmVzeCArICpzcmNfcG9zMSAqIHJlc194KSA+PiA4OwotICAgIHVpbnQ4X3Qgcl9wb3NfMSA9ICgqc3JjX3BvczIgKiBpX3Jlc3ggKyAqc3JjX3BvczMgKiByZXNfeCkgPj4gODsKLSAgICByZXR1cm4gKHJfcG9zXzAgKiAoMjU1IC0gcmVzX3kpICsgcl9wb3NfMSAqIHJlc195KSA+PiA4OwotfQotdWludDhfdCBfYmljdWJpY19pbnRlcnBvbChjb25zdCB1aW50OF90KiBidWYsIGludCBwaXRjaCwgaW50IHBvc19waXhlbFtdLCBpbnQgdV93W10sIGludCB2X3dbXSwgaW50IHJlc194LCBpbnQgcmVzX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicHAsIGludCBjX29mZnNldCkKLXsKLSAgICBpbnQgc19yZXN1bHQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICBpbnQgYV9yZXN1bHQgPSAwOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGogKyspIHsKLSAgICAgICAgICAgIGFfcmVzdWx0ICs9IHVfd1tqXSAqICgqKHVpbnQ4X3QqKShidWYgKyBwb3NfcGl4ZWxbaSArIDRdICogcGl0Y2ggKyBwb3NfcGl4ZWxbal0gKiBicHAgKyBjX29mZnNldCkpOwotICAgICAgICB9Ci0gICAgICAgIHNfcmVzdWx0ICs9IGFfcmVzdWx0ICogdl93W2ldOwotICAgIH0KLSAgICBzX3Jlc3VsdCA+Pj0gMTY7Ci0gICAgcmV0dXJuICh1aW50OF90KShzX3Jlc3VsdCA8IDAgPyAwIDogc19yZXN1bHQgPiAyNTUgPyAyNTUgOiBzX3Jlc3VsdCk7Ci19Ci12b2lkIF9iaWN1YmljX2dldF9wb3Nfd2VpZ2h0KGludCBwb3NfcGl4ZWxbXSwgaW50IHVfd1tdLCBpbnQgdl93W10sIGludCBzcmNfY29sX2wsIGludCBzcmNfcm93X2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXNfeCwgaW50IHJlc195LCBpbnQgc3RyZXRjaF93aWR0aCwgaW50IHN0cmV0Y2hfaGVpZ2h0KQotewotICAgIHBvc19waXhlbFswXSA9IHNyY19jb2xfbCAtIDE7Ci0gICAgcG9zX3BpeGVsWzFdID0gc3JjX2NvbF9sOwotICAgIHBvc19waXhlbFsyXSA9IHNyY19jb2xfbCArIDE7Ci0gICAgcG9zX3BpeGVsWzNdID0gc3JjX2NvbF9sICsgMjsKLSAgICBwb3NfcGl4ZWxbNF0gPSBzcmNfcm93X2wgLSAxOwotICAgIHBvc19waXhlbFs1XSA9IHNyY19yb3dfbDsKLSAgICBwb3NfcGl4ZWxbNl0gPSBzcmNfcm93X2wgKyAxOwotICAgIHBvc19waXhlbFs3XSA9IHNyY19yb3dfbCArIDI7Ci0gICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgNDsgaSArKykgewotICAgICAgICBpZiAocG9zX3BpeGVsW2ldIDwgMCkgewotICAgICAgICAgICAgcG9zX3BpeGVsW2ldID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zX3BpeGVsW2ldID49IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgIHBvc19waXhlbFtpXSA9IHN0cmV0Y2hfd2lkdGggLSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3NfcGl4ZWxbaSArIDRdIDwgMCkgewotICAgICAgICAgICAgcG9zX3BpeGVsW2kgKyA0XSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvc19waXhlbFtpICsgNF0gPj0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgIHBvc19waXhlbFtpICsgNF0gPSBzdHJldGNoX2hlaWdodCAtIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdV93WzBdID0gU0RQX1RhYmxlWzI1NiArIHJlc194XTsKLSAgICB1X3dbMV0gPSBTRFBfVGFibGVbcmVzX3hdOwotICAgIHVfd1syXSA9IFNEUF9UYWJsZVsyNTYgLSByZXNfeF07Ci0gICAgdV93WzNdID0gU0RQX1RhYmxlWzUxMiAtIHJlc194XTsKLSAgICB2X3dbMF0gPSBTRFBfVGFibGVbMjU2ICsgcmVzX3ldOwotICAgIHZfd1sxXSA9IFNEUF9UYWJsZVtyZXNfeV07Ci0gICAgdl93WzJdID0gU0RQX1RhYmxlWzI1NiAtIHJlc195XTsKLSAgICB2X3dbM10gPSBTRFBfVGFibGVbNTEyIC0gcmVzX3ldOwotfQotRlhESUJfRm9ybWF0IF9HZXRUcmFuc2Zvcm1lZEZvcm1hdChjb25zdCBDRlhfRElCU291cmNlKiBwRHJjKQotewotICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQgPSBwRHJjLT5HZXRGb3JtYXQoKTsKLSAgICBpZiAocERyYy0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICBmb3JtYXQgPSBGWERJQl84YnBwTWFzazsKLSAgICB9IGVsc2UgaWYgKGZvcm1hdCA+PSAxMDI1KSB7Ci0gICAgICAgIGZvcm1hdCA9IEZYRElCX0NteWthOwotICAgIH0gZWxzZSBpZiAoZm9ybWF0IDw9IDMyIHx8IGZvcm1hdCA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgIGZvcm1hdCA9IEZYRElCX0FyZ2I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9ybWF0ID0gRlhESUJfUmdiYTsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1hdDsKLX0KLUZYX0JPT0wgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmIChtX1N0YXR1cyA9PSAxKSB7Ci0gICAgICAgIGlmIChtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCkpIHsKLSAgICAgICAgICAgIG1fU3RvcmVyLlJlcGxhY2UobV9TdG9yZXIuR2V0Qml0bWFwKCktPlN3YXBYWShtX3BNYXRyaXgtPmMgPiAwLCBtX3BNYXRyaXgtPmIgPCAwKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9TdGF0dXMgPT0gMikgewotICAgICAgICByZXR1cm4gbV9TdHJldGNoZXIuQ29udGludWUocFBhdXNlKTsKLSAgICB9Ci0gICAgaWYgKG1fU3RhdHVzICE9IDMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9TdHJldGNoZXIuQ29udGludWUocFBhdXNlKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaW50IHN0cmV0Y2hfd2lkdGggPSBtX1N0cmV0Y2hDbGlwLldpZHRoKCk7Ci0gICAgaW50IHN0cmV0Y2hfaGVpZ2h0ID0gbV9TdHJldGNoQ2xpcC5IZWlnaHQoKTsKLSAgICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGNvbnN0IHVpbnQ4X3QqIHN0cmV0Y2hfYnVmID0gbV9TdG9yZXIuR2V0Qml0bWFwKCktPkdldEJ1ZmZlcigpOwotICAgIGNvbnN0IHVpbnQ4X3QqIHN0cmV0Y2hfYnVmX21hc2sgPSBOVUxMOwotICAgIGlmIChtX1N0b3Jlci5HZXRCaXRtYXAoKS0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIHN0cmV0Y2hfYnVmX21hc2sgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+bV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKTsKLSAgICB9Ci0gICAgaW50IHN0cmV0Y2hfcGl0Y2ggPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+R2V0UGl0Y2goKTsKLSAgICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFwVHJhbnNmb3JtZWQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWERJQl9Gb3JtYXQgdHJhbnNmb3JtRiA9IF9HZXRUcmFuc2Zvcm1lZEZvcm1hdChtX1N0cmV0Y2hlci5tX3BTb3VyY2UpOwotICAgIGlmICghcFRyYW5zZm9ybWVkLT5DcmVhdGUobV9SZXN1bHRXaWR0aCwgbV9SZXN1bHRIZWlnaHQsIHRyYW5zZm9ybUYpKSB7Ci0gICAgICAgIGRlbGV0ZSBwVHJhbnNmb3JtZWQ7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcFRyYW5zZm9ybWVkLT5DbGVhcigwKTsKLSAgICBpZiAocFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2spIHsKLSAgICAgICAgcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2stPkNsZWFyKDApOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IHJlc3VsdDJzdHJldGNoKDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIChGWF9GTE9BVCkobV9SZXN1bHRMZWZ0KSwgKEZYX0ZMT0FUKShtX1Jlc3VsdFRvcCkpOwotICAgIHJlc3VsdDJzdHJldGNoLkNvbmNhdChtX2Rlc3Qyc3RyZXRjaCk7Ci0gICAgcmVzdWx0MnN0cmV0Y2guVHJhbnNsYXRlSSgtbV9TdHJldGNoQ2xpcC5sZWZ0LCAtbV9TdHJldGNoQ2xpcC50b3ApOwotICAgIGlmIChzdHJldGNoX2J1Zl9tYXNrID09IE5VTEwgJiYgcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2spIHsKLSAgICAgICAgcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2stPkNsZWFyKDB4ZmYwMDAwMDApOwotICAgIH0gZWxzZSBpZiAocFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2spIHsKLSAgICAgICAgaW50IHN0cmV0Y2hfcGl0Y2hfbWFzayA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5tX3BBbHBoYU1hc2stPkdldFBpdGNoKCk7Ci0gICAgICAgIGlmICghKG1fRmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSAmJiAhKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSkgewotICAgICAgICAgICAgQ0ZYX0JpbGluZWFyTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9wb3NfbWFzayA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1Jlc3VsdFdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3k7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3kpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID49IDAgJiYgc3JjX2NvbF9sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3Jvd19sID49IDAgJiYgc3JjX3Jvd19sIDw9IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX3IgPSBzcmNfY29sX2wgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yb3dfciA9IHNyY19yb3dfbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9yID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX3ItLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfcm93X3IgPT0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93X3ItLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X2wgPSBzcmNfcm93X2wgKiBzdHJldGNoX3BpdGNoX21hc2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9yID0gc3JjX3Jvd19yICogc3RyZXRjaF9waXRjaF9tYXNrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfcG9zX21hc2sgPSBfYmlsaW5lYXJfaW50ZXJwb2woc3RyZXRjaF9idWZfbWFzaywgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsIHNyY19jb2xfbCwgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIDEsIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zX21hc2srKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgIENGWF9CaWxpbmVhck1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOwotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zX21hc2sgPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195OwotICAgICAgICAgICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc19waXhlbFs4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB1X3dbNF0sIHZfd1s0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfbC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3dfbC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgX2JpY3ViaWNfZ2V0X3Bvc193ZWlnaHQocG9zX3BpeGVsLCB1X3csIHZfdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSwgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfcG9zX21hc2sgPSBfYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Zl9tYXNrLCBzdHJldGNoX3BpdGNoX21hc2ssIHBvc19waXhlbCwgdV93LCB2X3csIHJlc194LCByZXNfeSwgMSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NfbWFzaysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENQREZfRml4ZWRNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3Bvc19tYXNrID0gKHVpbnQ4X3QqKXBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbCwgc3JjX3JvdzsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbCwgc3JjX3Jvdyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sID49IDAgJiYgc3JjX2NvbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3cgPj0gMCAmJiBzcmNfcm93IDw9IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbCA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbCAtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfcm93ID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3JvdyAtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3Bvc19tYXNrID0gc3RyZXRjaF9idWZfbWFza1tzcmNfcm93ICogc3RyZXRjaF9waXRjaF9tYXNrICsgc3JjX2NvbF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NfbWFzaysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCktPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgaWYgKCEobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpICYmICEobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpKSB7Ci0gICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93X2wgPj0gMCAmJiBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfbC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3dfbC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfciA9IHNyY19jb2xfbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3Jvd19yID0gc3JjX3Jvd19sICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX3IgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfciA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3dfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19vZmZzZXRfbCA9IHNyY19yb3dfbCAqIHN0cmV0Y2hfcGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9yID0gc3JjX3Jvd19yICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBfYmlsaW5lYXJfaW50ZXJwb2woc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLCBzcmNfY29sX2wsIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCAxLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93X2wgPj0gMCAmJiBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NfcGl4ZWxbOF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdV93WzRdLCB2X3dbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIF9iaWN1YmljX2dldF9wb3Nfd2VpZ2h0KHBvc19waXhlbCwgdV93LCB2X3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3ksIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBfYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLCB1X3csIHZfdywgcmVzX3gsIHJlc195LCAxLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1BERl9GaXhlZE1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOwotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sLCBzcmNfcm93OwotICAgICAgICAgICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sLCBzcmNfcm93KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2wgPj0gMCAmJiBzcmNfY29sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3JvdyA+PSAwICYmIHNyY19yb3cgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sIC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3cgPT0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93IC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3RyZXRjaF9idWYgKyBzdHJldGNoX3BpdGNoICogc3JjX3JvdyArIHNyY19jb2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19waXhlbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IEJwcCA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRCUFAoKSAvIDg7Ci0gICAgICAgIGludCBkZXN0QnBwID0gcFRyYW5zZm9ybWVkLT5HZXRCUFAoKSAvIDg7Ci0gICAgICAgIGlmIChCcHAgPT0gMSkgewotICAgICAgICAgICAgRlhfRFdPUkQgYXJnYlsyNTZdOwotICAgICAgICAgICAgRlhfQVJHQiogcFBhbCA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRQYWxldHRlKCk7Ci0gICAgICAgICAgICBpZiAocFBhbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ2JbaV0gPSBwUGFsW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fU3RvcmVyLkdldEJpdG1hcCgpLT5Jc0NteWtJbWFnZSgpKQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYXJnYltpXSA9IDI1NSAtIGk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmdiW2ldID0gMHhmZjAwMDAwMCB8IChpICogMHgwMTAxMDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIShtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgJiYgIShtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkpIHsKLSAgICAgICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3kpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfciA9IHNyY19jb2xfbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yb3dfciA9IHNyY19yb3dfbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfciA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19yID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3dfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9sID0gc3JjX3Jvd19sICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9yID0gc3JjX3Jvd19yICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByX2JncmFfY215ayA9IGFyZ2JbX2JpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLCBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgMSwgMCldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMF0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1sxXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gcl9iZ3JhX2NteWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3MgKz0gZGVzdEJwcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3kpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NfcGl4ZWxbOF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVfd1s0XSwgdl93WzRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JpY3ViaWNfZ2V0X3Bvc193ZWlnaHQocG9zX3BpeGVsLCB1X3csIHZfdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSwgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJfYmdyYV9jbXlrID0gYXJnYltfYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLCB1X3csIHZfdywgcmVzX3gsIHJlc195LCAxLCAwKV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfUmdiYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMl0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSByX2JncmFfY215azsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BvcyArPSBkZXN0QnBwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDUERGX0ZpeGVkTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2wsIHNyY19yb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sLCBzcmNfcm93KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sID49IDAgJiYgc3JjX2NvbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3cgPj0gMCAmJiBzcmNfcm93IDw9IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sIC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3JvdyA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93IC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByX2JncmFfY215ayA9IGFyZ2Jbc3RyZXRjaF9idWZbc3JjX3JvdyAqIHN0cmV0Y2hfcGl0Y2ggKyBzcmNfY29sXV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfUmdiYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMl0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSByX2JncmFfY215azsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BvcyArPSBkZXN0QnBwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhfQk9PTCBiSGFzQWxwaGEgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+SGFzQWxwaGEoKTsKLSAgICAgICAgICAgIGludCBkZXN0QnBwID0gcFRyYW5zZm9ybWVkLT5HZXRCUFAoKSAvIDg7Ci0gICAgICAgICAgICBpZiAoIShtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgJiYgIShtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkpIHsKLSAgICAgICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSwgcl9wb3Nfa19yID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3kpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfciA9IHNyY19jb2xfbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yb3dfciA9IHNyY19yb3dfbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfciA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19yID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3dfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9sID0gc3JjX3Jvd19sICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9yID0gc3JjX3Jvd19yICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX3JlZF95X3IgICA9IF9iaWxpbmVhcl9pbnRlcnBvbChzdHJldGNoX2J1Ziwgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsIHNyY19jb2xfbCwgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIEJwcCwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByX3Bvc19ncmVlbl9tX3IgPSBfYmlsaW5lYXJfaW50ZXJwb2woc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLCBzcmNfY29sX2wsIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCBCcHAsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcl9wb3NfYmx1ZV9jX3IgID0gX2JpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLCBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkhhc0FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GICE9IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9IHJfcG9zX2JsdWVfY19yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gcl9wb3NfZ3JlZW5fbV9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gcl9wb3NfcmVkX3lfcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3Nfa19yID0gX2JpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLCBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKHJfcG9zX2JsdWVfY19yLCByX3Bvc19ncmVlbl9tX3IsIHJfcG9zX3JlZF95X3IsIHJfcG9zX2tfcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByX3Bvc19hX3IgPSBfYmlsaW5lYXJfaW50ZXJwb2woc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLCBzcmNfY29sX2wsIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCBCcHAsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSBGWEFSR0JfVE9ESUIoRlhBUkdCX01BS0Uocl9wb3NfYV9yLCByX3Bvc19yZWRfeV9yLCByX3Bvc19ncmVlbl9tX3IsIHJfcG9zX2JsdWVfY19yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19rX3IgPSAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9DbXlrYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3Nfa19yID0gX2JpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLCBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhDTVlLX1RPRElCKENteWtFbmNvZGUocl9wb3NfYmx1ZV9jX3IsIHJfcG9zX2dyZWVuX21fciwgcl9wb3NfcmVkX3lfciwgcl9wb3Nfa19yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRShyX3Bvc19rX3IsIHJfcG9zX3JlZF95X3IsIHJfcG9zX2dyZWVuX21fciwgcl9wb3NfYmx1ZV9jX3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0JpbGluZWFyTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3ksIHJfcG9zX2tfciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93X2wgPj0gMCAmJiBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zX3BpeGVsWzhdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1X3dbNF0sIHZfd1s0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbF9sLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Jvd19sLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iaWN1YmljX2dldF9wb3Nfd2VpZ2h0KHBvc19waXhlbCwgdV93LCB2X3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3ksIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX3JlZF95X3IgICA9IF9iaWN1YmljX2ludGVycG9sKHN0cmV0Y2hfYnVmLCBzdHJldGNoX3BpdGNoLCBwb3NfcGl4ZWwsIHVfdywgdl93LCByZXNfeCwgcmVzX3ksIEJwcCwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByX3Bvc19ncmVlbl9tX3IgPSBfYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLCB1X3csIHZfdywgcmVzX3gsIHJlc195LCBCcHAsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcl9wb3NfYmx1ZV9jX3IgID0gX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwgdV93LCB2X3csIHJlc194LCByZXNfeSwgQnBwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkhhc0FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GICE9IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9IHJfcG9zX2JsdWVfY19yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gcl9wb3NfZ3JlZW5fbV9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gcl9wb3NfcmVkX3lfcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3Nfa19yID0gX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwgdV93LCB2X3csIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKHJfcG9zX2JsdWVfY19yLCByX3Bvc19ncmVlbl9tX3IsIHJfcG9zX3JlZF95X3IsIHJfcG9zX2tfcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByX3Bvc19hX3IgPSBfYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLCB1X3csIHZfdywgcmVzX3gsIHJlc195LCBCcHAsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSBGWEFSR0JfVE9ESUIoRlhBUkdCX01BS0Uocl9wb3NfYV9yLCByX3Bvc19yZWRfeV9yLCByX3Bvc19ncmVlbl9tX3IsIHJfcG9zX2JsdWVfY19yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19rX3IgPSAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9DbXlrYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3Nfa19yID0gX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwgdV93LCB2X3csIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhDTVlLX1RPRElCKENteWtFbmNvZGUocl9wb3NfYmx1ZV9jX3IsIHJfcG9zX2dyZWVuX21fciwgcl9wb3NfcmVkX3lfciwgcl9wb3Nfa19yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRShyX3Bvc19rX3IsIHJfcG9zX3JlZF95X3IsIHJfcG9zX2dyZWVuX21fciwgcl9wb3NfYmx1ZV9jX3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENQREZfRml4ZWRNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbCwgc3JjX3JvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2wsIHNyY19yb3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2wgPj0gMCAmJiBzcmNfY29sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3JvdyA+PSAwICYmIHNyY19yb3cgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbCA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2wgLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfcm93ID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3cgLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MgPSBzdHJldGNoX2J1ZiArIHNyY19yb3cgKiBzdHJldGNoX3BpdGNoICsgc3JjX2NvbCAqIEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkhhc0FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GICE9IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9IHNyY19wb3NbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMV0gPSBzcmNfcG9zWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gc3JjX3Bvc1syXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSBGWENNWUtfVE9ESUIoQ215a0VuY29kZShzcmNfcG9zWzBdLCBzcmNfcG9zWzFdLCBzcmNfcG9zWzJdLCBzcmNfcG9zWzNdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRShzcmNfcG9zWzNdLCBzcmNfcG9zWzJdLCBzcmNfcG9zWzFdLCBzcmNfcG9zWzBdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9DbXlrYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSBGWENNWUtfVE9ESUIoQ215a0VuY29kZShzcmNfcG9zWzBdLCBzcmNfcG9zWzFdLCBzcmNfcG9zWzJdLCBzcmNfcG9zWzNdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRSgweGZmLCBzcmNfcG9zWzJdLCBzcmNfcG9zWzFdLCBzcmNfcG9zWzBdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BvcyArPSBkZXN0QnBwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1fU3RvcmVyLlJlcGxhY2UocFRyYW5zZm9ybWVkKTsKK0NGWF9JbWFnZVRyYW5zZm9ybWVyOjp+Q0ZYX0ltYWdlVHJhbnNmb3JtZXIoKSB7fQorRlhfQk9PTCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6U3RhcnQoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXN0TWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcERlc3RDbGlwKSB7CisgIG1fcE1hdHJpeCA9IChDRlhfQWZmaW5lTWF0cml4KilwRGVzdE1hdHJpeDsKKyAgQ0ZYX0Zsb2F0UmVjdCB1bml0X3JlY3QgPSBwRGVzdE1hdHJpeC0+R2V0VW5pdFJlY3QoKTsKKyAgRlhfUkVDVCByZXN1bHRfcmVjdCA9IHVuaXRfcmVjdC5HZXRDbG9zZXN0UmVjdCgpOworICBGWF9SRUNUIHJlc3VsdF9jbGlwID0gcmVzdWx0X3JlY3Q7CisgIGlmIChwRGVzdENsaXApIHsKKyAgICByZXN1bHRfY2xpcC5JbnRlcnNlY3QoKnBEZXN0Q2xpcCk7CisgIH0KKyAgaWYgKHJlc3VsdF9jbGlwLklzRW1wdHkoKSkgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX1Jlc3VsdExlZnQgPSByZXN1bHRfY2xpcC5sZWZ0OworICBtX1Jlc3VsdFRvcCA9IHJlc3VsdF9jbGlwLnRvcDsKKyAgbV9SZXN1bHRXaWR0aCA9IHJlc3VsdF9jbGlwLldpZHRoKCk7CisgIG1fUmVzdWx0SGVpZ2h0ID0gcmVzdWx0X2NsaXAuSGVpZ2h0KCk7CisgIG1fRmxhZ3MgPSBmbGFnczsKKyAgaWYgKEZYU1lTX2ZhYnMocERlc3RNYXRyaXgtPmEpIDwgRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YikgLyAyMCAmJgorICAgICAgRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+ZCkgPCBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5jKSAvIDIwICYmCisgICAgICBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5hKSA8IDAuNWYgJiYgRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+ZCkgPCAwLjVmKSB7CisgICAgaW50IGRlc3Rfd2lkdGggPSByZXN1bHRfcmVjdC5XaWR0aCgpOworICAgIGludCBkZXN0X2hlaWdodCA9IHJlc3VsdF9yZWN0LkhlaWdodCgpOworICAgIHJlc3VsdF9jbGlwLk9mZnNldCgtcmVzdWx0X3JlY3QubGVmdCwgLXJlc3VsdF9yZWN0LnRvcCk7CisgICAgcmVzdWx0X2NsaXAgPSBfRlhESUJfU3dhcENsaXBCb3gocmVzdWx0X2NsaXAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0TWF0cml4LT5jID4gMCwgcERlc3RNYXRyaXgtPmIgPCAwKTsKKyAgICBtX1N0cmV0Y2hlci5TdGFydCgmbV9TdG9yZXIsIHBTcmMsIGRlc3RfaGVpZ2h0LCBkZXN0X3dpZHRoLCByZXN1bHRfY2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgbV9TdGF0dXMgPSAxOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5iKSA8IEZJWDE2XzAwNSAmJgorICAgICAgRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YykgPCBGSVgxNl8wMDUpIHsKKyAgICBpbnQgZGVzdF93aWR0aCA9IHBEZXN0TWF0cml4LT5hID4gMCA/IChpbnQpRlhTWVNfY2VpbChwRGVzdE1hdHJpeC0+YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQpRlhTWVNfZmxvb3IocERlc3RNYXRyaXgtPmEpOworICAgIGludCBkZXN0X2hlaWdodCA9IHBEZXN0TWF0cml4LT5kID4gMCA/IChpbnQpLUZYU1lTX2NlaWwocERlc3RNYXRyaXgtPmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGludCktRlhTWVNfZmxvb3IocERlc3RNYXRyaXgtPmQpOworICAgIHJlc3VsdF9jbGlwLk9mZnNldCgtcmVzdWx0X3JlY3QubGVmdCwgLXJlc3VsdF9yZWN0LnRvcCk7CisgICAgbV9TdHJldGNoZXIuU3RhcnQoJm1fU3RvcmVyLCBwU3JjLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcmVzdWx0X2NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIG1fU3RhdHVzID0gMjsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpbnQgc3RyZXRjaF93aWR0aCA9CisgICAgICAoaW50KUZYU1lTX2NlaWwoRlhTWVNfc3FydDIocERlc3RNYXRyaXgtPmEsIHBEZXN0TWF0cml4LT5iKSk7CisgIGludCBzdHJldGNoX2hlaWdodCA9CisgICAgICAoaW50KUZYU1lTX2NlaWwoRlhTWVNfc3FydDIocERlc3RNYXRyaXgtPmMsIHBEZXN0TWF0cml4LT5kKSk7CisgIENGWF9BZmZpbmVNYXRyaXggc3RyZXRjaDJkZXN0KDEuMGYsIDAuMGYsIDAuMGYsIC0xLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKHN0cmV0Y2hfaGVpZ2h0KSk7CisgIHN0cmV0Y2gyZGVzdC5Db25jYXQoCisgICAgICBwRGVzdE1hdHJpeC0+YSAvIHN0cmV0Y2hfd2lkdGgsIHBEZXN0TWF0cml4LT5iIC8gc3RyZXRjaF93aWR0aCwKKyAgICAgIHBEZXN0TWF0cml4LT5jIC8gc3RyZXRjaF9oZWlnaHQsIHBEZXN0TWF0cml4LT5kIC8gc3RyZXRjaF9oZWlnaHQsCisgICAgICBwRGVzdE1hdHJpeC0+ZSwgcERlc3RNYXRyaXgtPmYpOworICBtX2Rlc3Qyc3RyZXRjaC5TZXRSZXZlcnNlKHN0cmV0Y2gyZGVzdCk7CisgIENGWF9GbG9hdFJlY3QgY2xpcF9yZWN0X2YocmVzdWx0X2NsaXApOworICBjbGlwX3JlY3RfZi5UcmFuc2Zvcm0oJm1fZGVzdDJzdHJldGNoKTsKKyAgbV9TdHJldGNoQ2xpcCA9IGNsaXBfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKKyAgbV9TdHJldGNoQ2xpcC5JbnRlcnNlY3QoMCwgMCwgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQpOworICBtX1N0cmV0Y2hlci5TdGFydCgmbV9TdG9yZXIsIHBTcmMsIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBtX1N0cmV0Y2hDbGlwLCBmbGFncyk7CisgIG1fU3RhdHVzID0gMzsKKyAgcmV0dXJuIFRSVUU7Cit9Cit1aW50OF90IF9iaWxpbmVhcl9pbnRlcnBvbChjb25zdCB1aW50OF90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19vZmZzZXRfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjX29mZnNldCkgeworICBpbnQgaV9yZXN4ID0gMjU1IC0gcmVzX3g7CisgIGludCBjb2xfYnBwX2wgPSBzcmNfY29sX2wgKiBicHA7CisgIGludCBjb2xfYnBwX3IgPSBzcmNfY29sX3IgKiBicHA7CisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl91ID0gYnVmICsgcm93X29mZnNldF9sICsgY19vZmZzZXQ7CisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl9kID0gYnVmICsgcm93X29mZnNldF9yICsgY19vZmZzZXQ7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MwID0gYnVmX3UgKyBjb2xfYnBwX2w7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MxID0gYnVmX3UgKyBjb2xfYnBwX3I7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MyID0gYnVmX2QgKyBjb2xfYnBwX2w7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MzID0gYnVmX2QgKyBjb2xfYnBwX3I7CisgIHVpbnQ4X3Qgcl9wb3NfMCA9ICgqc3JjX3BvczAgKiBpX3Jlc3ggKyAqc3JjX3BvczEgKiByZXNfeCkgPj4gODsKKyAgdWludDhfdCByX3Bvc18xID0gKCpzcmNfcG9zMiAqIGlfcmVzeCArICpzcmNfcG9zMyAqIHJlc194KSA+PiA4OworICByZXR1cm4gKHJfcG9zXzAgKiAoMjU1IC0gcmVzX3kpICsgcl9wb3NfMSAqIHJlc195KSA+PiA4OworfQordWludDhfdCBfYmljdWJpY19pbnRlcnBvbChjb25zdCB1aW50OF90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc19waXhlbFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdV93W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2X3dbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc194LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjX29mZnNldCkgeworICBpbnQgc19yZXN1bHQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGludCBhX3Jlc3VsdCA9IDA7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgIGFfcmVzdWx0ICs9IHVfd1tqXSAqICgqKHVpbnQ4X3QqKShidWYgKyBwb3NfcGl4ZWxbaSArIDRdICogcGl0Y2ggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc19waXhlbFtqXSAqIGJwcCArIGNfb2Zmc2V0KSk7CisgICAgfQorICAgIHNfcmVzdWx0ICs9IGFfcmVzdWx0ICogdl93W2ldOworICB9CisgIHNfcmVzdWx0ID4+PSAxNjsKKyAgcmV0dXJuICh1aW50OF90KShzX3Jlc3VsdCA8IDAgPyAwIDogc19yZXN1bHQgPiAyNTUgPyAyNTUgOiBzX3Jlc3VsdCk7Cit9Cit2b2lkIF9iaWN1YmljX2dldF9wb3Nfd2VpZ2h0KGludCBwb3NfcGl4ZWxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVfd1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdl93W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfcm93X2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZXRjaF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmV0Y2hfaGVpZ2h0KSB7CisgIHBvc19waXhlbFswXSA9IHNyY19jb2xfbCAtIDE7CisgIHBvc19waXhlbFsxXSA9IHNyY19jb2xfbDsKKyAgcG9zX3BpeGVsWzJdID0gc3JjX2NvbF9sICsgMTsKKyAgcG9zX3BpeGVsWzNdID0gc3JjX2NvbF9sICsgMjsKKyAgcG9zX3BpeGVsWzRdID0gc3JjX3Jvd19sIC0gMTsKKyAgcG9zX3BpeGVsWzVdID0gc3JjX3Jvd19sOworICBwb3NfcGl4ZWxbNl0gPSBzcmNfcm93X2wgKyAxOworICBwb3NfcGl4ZWxbN10gPSBzcmNfcm93X2wgKyAyOworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGlmIChwb3NfcGl4ZWxbaV0gPCAwKSB7CisgICAgICBwb3NfcGl4ZWxbaV0gPSAwOworICAgIH0KKyAgICBpZiAocG9zX3BpeGVsW2ldID49IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgIHBvc19waXhlbFtpXSA9IHN0cmV0Y2hfd2lkdGggLSAxOworICAgIH0KKyAgICBpZiAocG9zX3BpeGVsW2kgKyA0XSA8IDApIHsKKyAgICAgIHBvc19waXhlbFtpICsgNF0gPSAwOworICAgIH0KKyAgICBpZiAocG9zX3BpeGVsW2kgKyA0XSA+PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgcG9zX3BpeGVsW2kgKyA0XSA9IHN0cmV0Y2hfaGVpZ2h0IC0gMTsKKyAgICB9CisgIH0KKyAgdV93WzBdID0gU0RQX1RhYmxlWzI1NiArIHJlc194XTsKKyAgdV93WzFdID0gU0RQX1RhYmxlW3Jlc194XTsKKyAgdV93WzJdID0gU0RQX1RhYmxlWzI1NiAtIHJlc194XTsKKyAgdV93WzNdID0gU0RQX1RhYmxlWzUxMiAtIHJlc194XTsKKyAgdl93WzBdID0gU0RQX1RhYmxlWzI1NiArIHJlc195XTsKKyAgdl93WzFdID0gU0RQX1RhYmxlW3Jlc195XTsKKyAgdl93WzJdID0gU0RQX1RhYmxlWzI1NiAtIHJlc195XTsKKyAgdl93WzNdID0gU0RQX1RhYmxlWzUxMiAtIHJlc195XTsKK30KK0ZYRElCX0Zvcm1hdCBfR2V0VHJhbnNmb3JtZWRGb3JtYXQoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcERyYykgeworICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gcERyYy0+R2V0Rm9ybWF0KCk7CisgIGlmIChwRHJjLT5Jc0FscGhhTWFzaygpKSB7CisgICAgZm9ybWF0ID0gRlhESUJfOGJwcE1hc2s7CisgIH0gZWxzZSBpZiAoZm9ybWF0ID49IDEwMjUpIHsKKyAgICBmb3JtYXQgPSBGWERJQl9DbXlrYTsKKyAgfSBlbHNlIGlmIChmb3JtYXQgPD0gMzIgfHwgZm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKKyAgICBmb3JtYXQgPSBGWERJQl9BcmdiOworICB9IGVsc2UgeworICAgIGZvcm1hdCA9IEZYRElCX1JnYmE7CisgIH0KKyAgcmV0dXJuIGZvcm1hdDsKK30KK0ZYX0JPT0wgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGlmIChtX1N0YXR1cyA9PSAxKSB7CisgICAgaWYgKG1fU3RyZXRjaGVyLkNvbnRpbnVlKHBQYXVzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCkpIHsKKyAgICAgIG1fU3RvcmVyLlJlcGxhY2UoCisgICAgICAgICAgbV9TdG9yZXIuR2V0Qml0bWFwKCktPlN3YXBYWShtX3BNYXRyaXgtPmMgPiAwLCBtX3BNYXRyaXgtPmIgPCAwKSk7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9TdGF0dXMgPT0gMikgeworICAgIHJldHVybiBtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpOworICB9CisgIGlmIChtX1N0YXR1cyAhPSAzKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaW50IHN0cmV0Y2hfd2lkdGggPSBtX1N0cmV0Y2hDbGlwLldpZHRoKCk7CisgIGludCBzdHJldGNoX2hlaWdodCA9IG1fU3RyZXRjaENsaXAuSGVpZ2h0KCk7CisgIGlmIChtX1N0b3Jlci5HZXRCaXRtYXAoKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IHVpbnQ4X3QqIHN0cmV0Y2hfYnVmID0gbV9TdG9yZXIuR2V0Qml0bWFwKCktPkdldEJ1ZmZlcigpOworICBjb25zdCB1aW50OF90KiBzdHJldGNoX2J1Zl9tYXNrID0gTlVMTDsKKyAgaWYgKG1fU3RvcmVyLkdldEJpdG1hcCgpLT5tX3BBbHBoYU1hc2spIHsKKyAgICBzdHJldGNoX2J1Zl9tYXNrID0gbV9TdG9yZXIuR2V0Qml0bWFwKCktPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCk7CisgIH0KKyAgaW50IHN0cmV0Y2hfcGl0Y2ggPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+R2V0UGl0Y2goKTsKKyAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOworICBpZiAoIXBUcmFuc2Zvcm1lZCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWERJQl9Gb3JtYXQgdHJhbnNmb3JtRiA9IF9HZXRUcmFuc2Zvcm1lZEZvcm1hdChtX1N0cmV0Y2hlci5tX3BTb3VyY2UpOworICBpZiAoIXBUcmFuc2Zvcm1lZC0+Q3JlYXRlKG1fUmVzdWx0V2lkdGgsIG1fUmVzdWx0SGVpZ2h0LCB0cmFuc2Zvcm1GKSkgeworICAgIGRlbGV0ZSBwVHJhbnNmb3JtZWQ7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHBUcmFuc2Zvcm1lZC0+Q2xlYXIoMCk7CisgIGlmIChwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzaykgeworICAgIHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrLT5DbGVhcigwKTsKKyAgfQorICBDRlhfQWZmaW5lTWF0cml4IHJlc3VsdDJzdHJldGNoKDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShtX1Jlc3VsdExlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkobV9SZXN1bHRUb3ApKTsKKyAgcmVzdWx0MnN0cmV0Y2guQ29uY2F0KG1fZGVzdDJzdHJldGNoKTsKKyAgcmVzdWx0MnN0cmV0Y2guVHJhbnNsYXRlSSgtbV9TdHJldGNoQ2xpcC5sZWZ0LCAtbV9TdHJldGNoQ2xpcC50b3ApOworICBpZiAoc3RyZXRjaF9idWZfbWFzayA9PSBOVUxMICYmIHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrKSB7CisgICAgcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2stPkNsZWFyKDB4ZmYwMDAwMDApOworICB9IGVsc2UgaWYgKHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrKSB7CisgICAgaW50IHN0cmV0Y2hfcGl0Y2hfbWFzayA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5tX3BBbHBoYU1hc2stPkdldFBpdGNoKCk7CisgICAgaWYgKCEobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpICYmICEobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpKSB7CisgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3Bvc19tYXNrID0KKyAgICAgICAgICAgICh1aW50OF90KilwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sKyspIHsKKyAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKKyAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeSk7CisgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmCisgICAgICAgICAgICAgIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA9PSBzdHJldGNoX3dpZHRoKSB7CisgICAgICAgICAgICAgIHNyY19jb2xfbC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzcmNfY29sX3IgPSBzcmNfY29sX2wgKyAxOworICAgICAgICAgICAgaW50IHNyY19yb3dfciA9IHNyY19yb3dfbCArIDE7CisgICAgICAgICAgICBpZiAoc3JjX2NvbF9yID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgc3JjX2NvbF9yLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3JjX3Jvd19yID09IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIHNyY19yb3dfci0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHJvd19vZmZzZXRfbCA9IHNyY19yb3dfbCAqIHN0cmV0Y2hfcGl0Y2hfbWFzazsKKyAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X3IgPSBzcmNfcm93X3IgKiBzdHJldGNoX3BpdGNoX21hc2s7CisgICAgICAgICAgICAqZGVzdF9wb3NfbWFzayA9CisgICAgICAgICAgICAgICAgX2JpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmX21hc2ssIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wsIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCAxLCAwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9wb3NfbWFzaysrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgQ0ZYX0JpbGluZWFyTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9wb3NfbWFzayA9CisgICAgICAgICAgICAodWludDhfdCopcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgaW50IHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3k7CisgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3kpOworICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93X2wgPj0gMCAmJgorICAgICAgICAgICAgICBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgIGludCBwb3NfcGl4ZWxbOF07CisgICAgICAgICAgICBpbnQgdV93WzRdLCB2X3dbNF07CisgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgc3JjX2NvbF9sLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIHNyY19yb3dfbC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2JpY3ViaWNfZ2V0X3Bvc193ZWlnaHQocG9zX3BpeGVsLCB1X3csIHZfdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeCwgcmVzX3ksIHN0cmV0Y2hfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJldGNoX2hlaWdodCk7CisgICAgICAgICAgICAqZGVzdF9wb3NfbWFzayA9CisgICAgICAgICAgICAgICAgX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWZfbWFzaywgc3RyZXRjaF9waXRjaF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc19waXhlbCwgdV93LCB2X3csIHJlc194LCByZXNfeSwgMSwgMCk7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3RfcG9zX21hc2srKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBDUERGX0ZpeGVkTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9wb3NfbWFzayA9CisgICAgICAgICAgICAodWludDhfdCopcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgaW50IHNyY19jb2wsIHNyY19yb3c7CisgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbCwgc3JjX3Jvdyk7CisgICAgICAgICAgaWYgKHNyY19jb2wgPj0gMCAmJiBzcmNfY29sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3JvdyA+PSAwICYmCisgICAgICAgICAgICAgIHNyY19yb3cgPD0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgIGlmIChzcmNfY29sID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgc3JjX2NvbC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNyY19yb3cgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgc3JjX3Jvdy0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3RfcG9zX21hc2sgPQorICAgICAgICAgICAgICAgIHN0cmV0Y2hfYnVmX21hc2tbc3JjX3JvdyAqIHN0cmV0Y2hfcGl0Y2hfbWFzayArIHNyY19jb2xdOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3Bvc19tYXNrKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKG1fU3RvcmVyLkdldEJpdG1hcCgpLT5Jc0FscGhhTWFzaygpKSB7CisgICAgaWYgKCEobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpICYmICEobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpKSB7CisgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1Jlc3VsdFdpZHRoOyBjb2wrKykgeworICAgICAgICAgIGludCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195OworICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc195KTsKKyAgICAgICAgICBpZiAoc3JjX2NvbF9sID49IDAgJiYgc3JjX2NvbF9sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3Jvd19sID49IDAgJiYKKyAgICAgICAgICAgICAgc3JjX3Jvd19sIDw9IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgc3JjX2NvbF9sLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIHNyY19yb3dfbC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNyY19jb2xfciA9IHNyY19jb2xfbCArIDE7CisgICAgICAgICAgICBpbnQgc3JjX3Jvd19yID0gc3JjX3Jvd19sICsgMTsKKyAgICAgICAgICAgIGlmIChzcmNfY29sX3IgPT0gc3RyZXRjaF93aWR0aCkgeworICAgICAgICAgICAgICBzcmNfY29sX3ItLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcmNfcm93X3IgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgc3JjX3Jvd19yLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcm93X29mZnNldF9sID0gc3JjX3Jvd19sICogc3RyZXRjaF9waXRjaDsKKyAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X3IgPSBzcmNfcm93X3IgKiBzdHJldGNoX3BpdGNoOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgICAgICAgX2JpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbF9sLCBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgMSwgMCk7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgQ0ZYX0JpbGluZWFyTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gKHVpbnQ4X3QqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sKyspIHsKKyAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKKyAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeSk7CisgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmCisgICAgICAgICAgICAgIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgaW50IHBvc19waXhlbFs4XTsKKyAgICAgICAgICAgIGludCB1X3dbNF0sIHZfd1s0XTsKKyAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgeworICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgc3JjX3Jvd19sLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYmljdWJpY19nZXRfcG9zX3dlaWdodChwb3NfcGl4ZWwsIHVfdywgdl93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc194LCByZXNfeSwgc3RyZXRjaF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hfaGVpZ2h0KTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgICAgICAgIF9iaWN1YmljX2ludGVycG9sKHN0cmV0Y2hfYnVmLCBzdHJldGNoX3BpdGNoLCBwb3NfcGl4ZWwsIHVfdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X3csIHJlc194LCByZXNfeSwgMSwgMCk7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIENQREZfRml4ZWRNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1Jlc3VsdFdpZHRoOyBjb2wrKykgeworICAgICAgICAgIGludCBzcmNfY29sLCBzcmNfcm93OworICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2wsIHNyY19yb3cpOworICAgICAgICAgIGlmIChzcmNfY29sID49IDAgJiYgc3JjX2NvbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3cgPj0gMCAmJgorICAgICAgICAgICAgICBzcmNfcm93IDw9IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoc3JjX2NvbCA9PSBzdHJldGNoX3dpZHRoKSB7CisgICAgICAgICAgICAgIHNyY19jb2wtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcmNfcm93ID09IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIHNyY19yb3ctLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9CisgICAgICAgICAgICAgICAgc3RyZXRjaF9idWYgKyBzdHJldGNoX3BpdGNoICogc3JjX3JvdyArIHNyY19jb2w7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19waXhlbDsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IEJwcCA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRCUFAoKSAvIDg7CisgICAgaW50IGRlc3RCcHAgPSBwVHJhbnNmb3JtZWQtPkdldEJQUCgpIC8gODsKKyAgICBpZiAoQnBwID09IDEpIHsKKyAgICAgIEZYX0RXT1JEIGFyZ2JbMjU2XTsKKyAgICAgIEZYX0FSR0IqIHBQYWwgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+R2V0UGFsZXR0ZSgpOworICAgICAgaWYgKHBQYWwpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgIGFyZ2JbaV0gPSBwUGFsW2ldOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCktPklzQ215a0ltYWdlKCkpCisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgICAgYXJnYltpXSA9IDI1NSAtIGk7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgICAgYXJnYltpXSA9IDB4ZmYwMDAwMDAgfCAoaSAqIDB4MDEwMTAxKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIShtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgJiYKKyAgICAgICAgICAhKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSkgeworICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKKyAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdysrKSB7CisgICAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKKyAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3kpOworICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmCisgICAgICAgICAgICAgICAgc3JjX3Jvd19sID49IDAgJiYgc3JjX3Jvd19sIDw9IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgeworICAgICAgICAgICAgICAgIHNyY19jb2xfbC0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9yID0gc3JjX2NvbF9sICsgMTsKKyAgICAgICAgICAgICAgaW50IHNyY19yb3dfciA9IHNyY19yb3dfbCArIDE7CisgICAgICAgICAgICAgIGlmIChzcmNfY29sX3IgPT0gc3RyZXRjaF93aWR0aCkgeworICAgICAgICAgICAgICAgIHNyY19jb2xfci0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzcmNfcm93X3IgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBzcmNfcm93X3ItLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9sID0gc3JjX3Jvd19sICogc3RyZXRjaF9waXRjaDsKKyAgICAgICAgICAgICAgaW50IHJvd19vZmZzZXRfciA9IHNyY19yb3dfciAqIHN0cmV0Y2hfcGl0Y2g7CisgICAgICAgICAgICAgIEZYX0RXT1JEIHJfYmdyYV9jbXlrID0gYXJnYltfYmlsaW5lYXJfaW50ZXJwb2woCisgICAgICAgICAgICAgICAgICBzdHJldGNoX2J1Ziwgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsIHNyY19jb2xfbCwgc3JjX2NvbF9yLAorICAgICAgICAgICAgICAgICAgcmVzX3gsIHJlc195LCAxLCAwKV07CisgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKKyAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiAyNCk7CisgICAgICAgICAgICAgICAgZGVzdF9wb3NbMV0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gMTYpOworICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDgpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gcl9iZ3JhX2NteWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgIENGWF9CaWxpbmVhck1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOworICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93KyspIHsKKyAgICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAgIGludCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195OworICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeSk7CisgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID49IDAgJiYgc3JjX2NvbF9sIDw9IHN0cmV0Y2hfd2lkdGggJiYKKyAgICAgICAgICAgICAgICBzcmNfcm93X2wgPj0gMCAmJiBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgaW50IHBvc19waXhlbFs4XTsKKyAgICAgICAgICAgICAgaW50IHVfd1s0XSwgdl93WzRdOworICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgc3JjX3Jvd19sLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgX2JpY3ViaWNfZ2V0X3Bvc193ZWlnaHQocG9zX3BpeGVsLCB1X3csIHZfdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc194LCByZXNfeSwgc3RyZXRjaF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXRjaF9oZWlnaHQpOworICAgICAgICAgICAgICBGWF9EV09SRCByX2JncmFfY215ayA9CisgICAgICAgICAgICAgICAgICBhcmdiW19iaWN1YmljX2ludGVycG9sKHN0cmV0Y2hfYnVmLCBzdHJldGNoX3BpdGNoLCBwb3NfcGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfdywgdl93LCByZXNfeCwgcmVzX3ksIDEsIDApXTsKKyAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfUmdiYSkgeworICAgICAgICAgICAgICAgIGRlc3RfcG9zWzBdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDI0KTsKKyAgICAgICAgICAgICAgICBkZXN0X3Bvc1sxXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiAxNik7CisgICAgICAgICAgICAgICAgZGVzdF9wb3NbMl0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gOCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSByX2JncmFfY215azsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdF9wb3MgKz0gZGVzdEJwcDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENQREZfRml4ZWRNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKKyAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdysrKSB7CisgICAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgICBpbnQgc3JjX2NvbCwgc3JjX3JvdzsKKyAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2wsIHNyY19yb3cpOworICAgICAgICAgICAgaWYgKHNyY19jb2wgPj0gMCAmJiBzcmNfY29sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3JvdyA+PSAwICYmCisgICAgICAgICAgICAgICAgc3JjX3JvdyA8PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgICBpZiAoc3JjX2NvbCA9PSBzdHJldGNoX3dpZHRoKSB7CisgICAgICAgICAgICAgICAgc3JjX2NvbC0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzcmNfcm93ID09IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgc3JjX3Jvdy0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIEZYX0RXT1JEIHJfYmdyYV9jbXlrID0KKyAgICAgICAgICAgICAgICAgIGFyZ2Jbc3RyZXRjaF9idWZbc3JjX3JvdyAqIHN0cmV0Y2hfcGl0Y2ggKyBzcmNfY29sXV07CisgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKKyAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiAyNCk7CisgICAgICAgICAgICAgICAgZGVzdF9wb3NbMV0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gMTYpOworICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDgpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gcl9iZ3JhX2NteWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEZYX0JPT0wgYkhhc0FscGhhID0gbV9TdG9yZXIuR2V0Qml0bWFwKCktPkhhc0FscGhhKCk7CisgICAgICBpbnQgZGVzdEJwcCA9IHBUcmFuc2Zvcm1lZC0+R2V0QlBQKCkgLyA4OworICAgICAgaWYgKCEobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpICYmCisgICAgICAgICAgIShtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkpIHsKKyAgICAgICAgQ0ZYX0JpbGluZWFyTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7CisgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3crKykgeworICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1Jlc3VsdFdpZHRoOyBjb2wrKykgeworICAgICAgICAgICAgaW50IHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3ksIHJfcG9zX2tfciA9IDA7CisgICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc195KTsKKyAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJgorICAgICAgICAgICAgICAgIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgc3JjX3Jvd19sLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaW50IHNyY19jb2xfciA9IHNyY19jb2xfbCArIDE7CisgICAgICAgICAgICAgIGludCBzcmNfcm93X3IgPSBzcmNfcm93X2wgKyAxOworICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9yID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBzcmNfY29sX3ItLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19yID09IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgc3JjX3Jvd19yLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaW50IHJvd19vZmZzZXRfbCA9IHNyY19yb3dfbCAqIHN0cmV0Y2hfcGl0Y2g7CisgICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X3IgPSBzcmNfcm93X3IgKiBzdHJldGNoX3BpdGNoOworICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX3JlZF95X3IgPSBfYmlsaW5lYXJfaW50ZXJwb2woCisgICAgICAgICAgICAgICAgICBzdHJldGNoX2J1Ziwgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsIHNyY19jb2xfbCwgc3JjX2NvbF9yLAorICAgICAgICAgICAgICAgICAgcmVzX3gsIHJlc195LCBCcHAsIDIpOworICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX2dyZWVuX21fciA9IF9iaWxpbmVhcl9pbnRlcnBvbCgKKyAgICAgICAgICAgICAgICAgIHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLCBzcmNfY29sX3IsCisgICAgICAgICAgICAgICAgICByZXNfeCwgcmVzX3ksIEJwcCwgMSk7CisgICAgICAgICAgICAgIHVpbnQ4X3Qgcl9wb3NfYmx1ZV9jX3IgPSBfYmlsaW5lYXJfaW50ZXJwb2woCisgICAgICAgICAgICAgICAgICBzdHJldGNoX2J1Ziwgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsIHNyY19jb2xfbCwgc3JjX2NvbF9yLAorICAgICAgICAgICAgICAgICAgcmVzX3gsIHJlc195LCBCcHAsIDApOworICAgICAgICAgICAgICBpZiAoYkhhc0FscGhhKSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgIT0gRlhESUJfQXJnYikgeworICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfUmdiYSkgeworICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9IHJfcG9zX2JsdWVfY19yOworICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1sxXSA9IHJfcG9zX2dyZWVuX21fcjsKKyAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMl0gPSByX3Bvc19yZWRfeV9yOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcl9wb3Nfa19yID0gX2JpbGluZWFyX2ludGVycG9sKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLCBzcmNfY29sX2wsCisgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgRlhDTVlLX1RPRElCKENteWtFbmNvZGUocl9wb3NfYmx1ZV9jX3IsIHJfcG9zX2dyZWVuX21fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcG9zX3JlZF95X3IsIHJfcG9zX2tfcikpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX2FfciA9IF9iaWxpbmVhcl9pbnRlcnBvbCgKKyAgICAgICAgICAgICAgICAgICAgICBzdHJldGNoX2J1Ziwgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsIHNyY19jb2xfbCwKKyAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAzKTsKKyAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhBUkdCX1RPRElCKAorICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKHJfcG9zX2Ffciwgcl9wb3NfcmVkX3lfciwgcl9wb3NfZ3JlZW5fbV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcG9zX2JsdWVfY19yKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJfcG9zX2tfciA9IDB4ZmY7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfQ215a2EpIHsKKyAgICAgICAgICAgICAgICAgIHJfcG9zX2tfciA9IF9iaWxpbmVhcl9pbnRlcnBvbCgKKyAgICAgICAgICAgICAgICAgICAgICBzdHJldGNoX2J1Ziwgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsIHNyY19jb2xfbCwKKyAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAzKTsKKyAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0KKyAgICAgICAgICAgICAgICAgICAgICBGWENNWUtfVE9ESUIoQ215a0VuY29kZShyX3Bvc19ibHVlX2Nfciwgcl9wb3NfZ3JlZW5fbV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcG9zX3JlZF95X3IsIHJfcG9zX2tfcikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQVJHQl9UT0RJQigKKyAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfTUFLRShyX3Bvc19rX3IsIHJfcG9zX3JlZF95X3IsIHJfcG9zX2dyZWVuX21fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19ibHVlX2NfcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdF9wb3MgKz0gZGVzdEJwcDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKKyAgICAgICAgQ0ZYX0JpbGluZWFyTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7CisgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3crKykgeworICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1Jlc3VsdFdpZHRoOyBjb2wrKykgeworICAgICAgICAgICAgaW50IHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3ksIHJfcG9zX2tfciA9IDA7CisgICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc195KTsKKyAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJgorICAgICAgICAgICAgICAgIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgICBpbnQgcG9zX3BpeGVsWzhdOworICAgICAgICAgICAgICBpbnQgdV93WzRdLCB2X3dbNF07CisgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgeworICAgICAgICAgICAgICAgIHNyY19jb2xfbC0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBfYmljdWJpY19nZXRfcG9zX3dlaWdodChwb3NfcGl4ZWwsIHVfdywgdl93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3gsIHJlc195LCBzdHJldGNoX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJldGNoX2hlaWdodCk7CisgICAgICAgICAgICAgIHVpbnQ4X3Qgcl9wb3NfcmVkX3lfciA9CisgICAgICAgICAgICAgICAgICBfYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLCB1X3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X3csIHJlc194LCByZXNfeSwgQnBwLCAyKTsKKyAgICAgICAgICAgICAgdWludDhfdCByX3Bvc19ncmVlbl9tX3IgPQorICAgICAgICAgICAgICAgICAgX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwgdV93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl93LCByZXNfeCwgcmVzX3ksIEJwcCwgMSk7CisgICAgICAgICAgICAgIHVpbnQ4X3Qgcl9wb3NfYmx1ZV9jX3IgPQorICAgICAgICAgICAgICAgICAgX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwgdV93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl93LCByZXNfeCwgcmVzX3ksIEJwcCwgMCk7CisgICAgICAgICAgICAgIGlmIChiSGFzQWxwaGEpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiAhPSBGWERJQl9BcmdiKSB7CisgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9SZ2JhKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzBdID0gcl9wb3NfYmx1ZV9jX3I7CisgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gcl9wb3NfZ3JlZW5fbV9yOworICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1syXSA9IHJfcG9zX3JlZF95X3I7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByX3Bvc19rX3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfdywgdl93LCByZXNfeCwgcmVzX3ksIEJwcCwgMyk7CisgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKHJfcG9zX2JsdWVfY19yLCByX3Bvc19ncmVlbl9tX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19yZWRfeV9yLCByX3Bvc19rX3IpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgdWludDhfdCByX3Bvc19hX3IgPQorICAgICAgICAgICAgICAgICAgICAgIF9iaWN1YmljX2ludGVycG9sKHN0cmV0Y2hfYnVmLCBzdHJldGNoX3BpdGNoLCBwb3NfcGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV93LCB2X3csIHJlc194LCByZXNfeSwgQnBwLCAzKTsKKyAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhBUkdCX1RPRElCKAorICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKHJfcG9zX2Ffciwgcl9wb3NfcmVkX3lfciwgcl9wb3NfZ3JlZW5fbV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcG9zX2JsdWVfY19yKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJfcG9zX2tfciA9IDB4ZmY7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfQ215a2EpIHsKKyAgICAgICAgICAgICAgICAgIHJfcG9zX2tfciA9CisgICAgICAgICAgICAgICAgICAgICAgX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X3csIHZfdywgcmVzX3gsIHJlc195LCBCcHAsIDMpOworICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPQorICAgICAgICAgICAgICAgICAgICAgIEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKHJfcG9zX2JsdWVfY19yLCByX3Bvc19ncmVlbl9tX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3NfcmVkX3lfciwgcl9wb3Nfa19yKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhBUkdCX1RPRElCKAorICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKHJfcG9zX2tfciwgcl9wb3NfcmVkX3lfciwgcl9wb3NfZ3JlZW5fbV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcG9zX2JsdWVfY19yKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0X3BvcyArPSBkZXN0QnBwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1BERl9GaXhlZE1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOworICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93KyspIHsKKyAgICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAgIGludCBzcmNfY29sLCBzcmNfcm93OworICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbCwgc3JjX3Jvdyk7CisgICAgICAgICAgICBpZiAoc3JjX2NvbCA+PSAwICYmIHNyY19jb2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93ID49IDAgJiYKKyAgICAgICAgICAgICAgICBzcmNfcm93IDw9IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIGlmIChzcmNfY29sID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBzcmNfY29sLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHNyY19yb3cgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBzcmNfcm93LS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BvcyA9CisgICAgICAgICAgICAgICAgICBzdHJldGNoX2J1ZiArIHNyY19yb3cgKiBzdHJldGNoX3BpdGNoICsgc3JjX2NvbCAqIEJwcDsKKyAgICAgICAgICAgICAgaWYgKGJIYXNBbHBoYSkgeworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GICE9IEZYRElCX0FyZ2IpIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMF0gPSBzcmNfcG9zWzBdOworICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1sxXSA9IHNyY19wb3NbMV07CisgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gc3JjX3Bvc1syXTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhDTVlLX1RPRElCKENteWtFbmNvZGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcG9zWzBdLCBzcmNfcG9zWzFdLCBzcmNfcG9zWzJdLCBzcmNfcG9zWzNdKSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKAorICAgICAgICAgICAgICAgICAgICAgIHNyY19wb3NbM10sIHNyY19wb3NbMl0sIHNyY19wb3NbMV0sIHNyY19wb3NbMF0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfQ215a2EpIHsKKyAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhDTVlLX1RPRElCKENteWtFbmNvZGUoCisgICAgICAgICAgICAgICAgICAgICAgc3JjX3Bvc1swXSwgc3JjX3Bvc1sxXSwgc3JjX3Bvc1syXSwgc3JjX3Bvc1szXSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQVJHQl9UT0RJQigKKyAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfTUFLRSgweGZmLCBzcmNfcG9zWzJdLCBzcmNfcG9zWzFdLCBzcmNfcG9zWzBdKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0X3BvcyArPSBkZXN0QnBwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBtX1N0b3Jlci5SZXBsYWNlKHBUcmFuc2Zvcm1lZCk7CisgIHJldHVybiBGQUxTRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2UuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZS5jcHAKaW5kZXggODE2N2E5MS4uYjkyZTFiYSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZS5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZS5jcHAKQEAgLTcsNjIgKzcsNTQgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKICNpbmNsdWRlICJ0ZXh0X2ludC5oIgogc3RhdGljIENGWF9HRU1vZHVsZSogZ19wR0VNb2R1bGUgPSBOVUxMOwotQ0ZYX0dFTW9kdWxlOjpDRlhfR0VNb2R1bGUoKQotewotICAgIG1fcEZvbnRDYWNoZSA9IE5VTEw7Ci0gICAgbV9wRm9udE1nciA9IE5VTEw7Ci0gICAgbV9GVExpYnJhcnkgPSBOVUxMOwotICAgIG1fcENvZGVjTW9kdWxlID0gTlVMTDsKLSAgICBtX3BQbGF0Zm9ybURhdGEgPSBOVUxMOworQ0ZYX0dFTW9kdWxlOjpDRlhfR0VNb2R1bGUoKSB7CisgIG1fcEZvbnRDYWNoZSA9IE5VTEw7CisgIG1fcEZvbnRNZ3IgPSBOVUxMOworICBtX0ZUTGlicmFyeSA9IE5VTEw7CisgIG1fcENvZGVjTW9kdWxlID0gTlVMTDsKKyAgbV9wUGxhdGZvcm1EYXRhID0gTlVMTDsKIH0KLUNGWF9HRU1vZHVsZTo6fkNGWF9HRU1vZHVsZSgpCi17Ci0gICAgZGVsZXRlIG1fcEZvbnRDYWNoZTsKLSAgICBtX3BGb250Q2FjaGUgPSBOVUxMOwotICAgIGRlbGV0ZSBtX3BGb250TWdyOwotICAgIG1fcEZvbnRNZ3IgPSBOVUxMOwotICAgIERlc3Ryb3lQbGF0Zm9ybSgpOworQ0ZYX0dFTW9kdWxlOjp+Q0ZYX0dFTW9kdWxlKCkgeworICBkZWxldGUgbV9wRm9udENhY2hlOworICBtX3BGb250Q2FjaGUgPSBOVUxMOworICBkZWxldGUgbV9wRm9udE1ncjsKKyAgbV9wRm9udE1nciA9IE5VTEw7CisgIERlc3Ryb3lQbGF0Zm9ybSgpOwogfQotQ0ZYX0dFTW9kdWxlKiBDRlhfR0VNb2R1bGU6OkdldCgpCi17Ci0gICAgcmV0dXJuIGdfcEdFTW9kdWxlOworQ0ZYX0dFTW9kdWxlKiBDRlhfR0VNb2R1bGU6OkdldCgpIHsKKyAgcmV0dXJuIGdfcEdFTW9kdWxlOwogfQotdm9pZCBDRlhfR0VNb2R1bGU6OkNyZWF0ZSgpCi17Ci0gICAgZ19wR0VNb2R1bGUgPSBGWF9ORVcgQ0ZYX0dFTW9kdWxlOwotICAgIGlmICghZ19wR0VNb2R1bGUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBnX3BHRU1vZHVsZS0+bV9wRm9udE1nciA9IEZYX05FVyBDRlhfRm9udE1ncjsKLSAgICBnX3BHRU1vZHVsZS0+SW5pdFBsYXRmb3JtKCk7Ci0gICAgZ19wR0VNb2R1bGUtPlNldFRleHRHYW1tYSgyLjJmKTsKK3ZvaWQgQ0ZYX0dFTW9kdWxlOjpDcmVhdGUoKSB7CisgIGdfcEdFTW9kdWxlID0gRlhfTkVXIENGWF9HRU1vZHVsZTsKKyAgaWYgKCFnX3BHRU1vZHVsZSkgeworICAgIHJldHVybjsKKyAgfQorICBnX3BHRU1vZHVsZS0+bV9wRm9udE1nciA9IEZYX05FVyBDRlhfRm9udE1ncjsKKyAgZ19wR0VNb2R1bGUtPkluaXRQbGF0Zm9ybSgpOworICBnX3BHRU1vZHVsZS0+U2V0VGV4dEdhbW1hKDIuMmYpOwogfQotdm9pZCBDRlhfR0VNb2R1bGU6OlVzZShDRlhfR0VNb2R1bGUqIHBNb2R1bGUpCi17Ci0gICAgZ19wR0VNb2R1bGUgPSBwTW9kdWxlOwordm9pZCBDRlhfR0VNb2R1bGU6OlVzZShDRlhfR0VNb2R1bGUqIHBNb2R1bGUpIHsKKyAgZ19wR0VNb2R1bGUgPSBwTW9kdWxlOwogfQotdm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3koKQotewotICAgIGRlbGV0ZSBnX3BHRU1vZHVsZTsKLSAgICBnX3BHRU1vZHVsZSA9IE5VTEw7Cit2b2lkIENGWF9HRU1vZHVsZTo6RGVzdHJveSgpIHsKKyAgZGVsZXRlIGdfcEdFTW9kdWxlOworICBnX3BHRU1vZHVsZSA9IE5VTEw7CiB9Ci1DRlhfRm9udENhY2hlKiBDRlhfR0VNb2R1bGU6OkdldEZvbnRDYWNoZSgpCi17Ci0gICAgaWYgKG1fcEZvbnRDYWNoZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcEZvbnRDYWNoZSA9IEZYX05FVyBDRlhfRm9udENhY2hlKCk7Ci0gICAgfQotICAgIHJldHVybiBtX3BGb250Q2FjaGU7CitDRlhfRm9udENhY2hlKiBDRlhfR0VNb2R1bGU6OkdldEZvbnRDYWNoZSgpIHsKKyAgaWYgKG1fcEZvbnRDYWNoZSA9PSBOVUxMKSB7CisgICAgbV9wRm9udENhY2hlID0gRlhfTkVXIENGWF9Gb250Q2FjaGUoKTsKKyAgfQorICByZXR1cm4gbV9wRm9udENhY2hlOwogfQotdm9pZCBDRlhfR0VNb2R1bGU6OlNldFRleHRHYW1tYShGWF9GTE9BVCBnYW1tYVZhbHVlKQotewotICAgIGdhbW1hVmFsdWUgLz0gMi4yZjsKLSAgICBpbnQgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCAyNTYpIHsKLSAgICAgICAgbV9HYW1tYVZhbHVlW2ldID0gKHVpbnQ4X3QpKEZYU1lTX3BvdygoRlhfRkxPQVQpaSAvIDI1NSwgZ2FtbWFWYWx1ZSkgKiAyNTUuMGYgKyAwLjVmKTsKLSAgICAgICAgaSsrOwotICAgIH0KK3ZvaWQgQ0ZYX0dFTW9kdWxlOjpTZXRUZXh0R2FtbWEoRlhfRkxPQVQgZ2FtbWFWYWx1ZSkgeworICBnYW1tYVZhbHVlIC89IDIuMmY7CisgIGludCBpID0gMDsKKyAgd2hpbGUgKGkgPCAyNTYpIHsKKyAgICBtX0dhbW1hVmFsdWVbaV0gPQorICAgICAgICAodWludDhfdCkoRlhTWVNfcG93KChGWF9GTE9BVClpIC8gMjU1LCBnYW1tYVZhbHVlKSAqIDI1NS4wZiArIDAuNWYpOworICAgIGkrKzsKKyAgfQogfQotY29uc3QgdWludDhfdCogQ0ZYX0dFTW9kdWxlOjpHZXRUZXh0R2FtbWFUYWJsZSgpCi17Ci0gICAgcmV0dXJuIG1fR2FtbWFWYWx1ZTsKK2NvbnN0IHVpbnQ4X3QqIENGWF9HRU1vZHVsZTo6R2V0VGV4dEdhbW1hVGFibGUoKSB7CisgIHJldHVybiBtX0dhbW1hVmFsdWU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2RldmljZS5jcHAgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2RldmljZS5jcHAKaW5kZXggMGJhYTk5Yy4uN2FiMzk5YSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9kZXZpY2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZGV2aWNlLmNwcApAQCAtNSwzOTggKzUsNDcxIEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCi1DRlhfUmVuZGVyRGV2aWNlOjpDRlhfUmVuZGVyRGV2aWNlKCkKLXsKLSAgICBtX3BEZXZpY2VEcml2ZXIgPSBOVUxMOwotICAgIG1fcEJpdG1hcCA9IE5VTEw7CitDRlhfUmVuZGVyRGV2aWNlOjpDRlhfUmVuZGVyRGV2aWNlKCkgeworICBtX3BEZXZpY2VEcml2ZXIgPSBOVUxMOworICBtX3BCaXRtYXAgPSBOVUxMOwogfQotQ0ZYX1JlbmRlckRldmljZTo6fkNGWF9SZW5kZXJEZXZpY2UoKQotewotICAgIGRlbGV0ZSBtX3BEZXZpY2VEcml2ZXI7CitDRlhfUmVuZGVyRGV2aWNlOjp+Q0ZYX1JlbmRlckRldmljZSgpIHsKKyAgZGVsZXRlIG1fcERldmljZURyaXZlcjsKIH0KLXZvaWQgQ0ZYX1JlbmRlckRldmljZTo6U2V0RGV2aWNlRHJpdmVyKElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIpCi17Ci0gICAgZGVsZXRlIG1fcERldmljZURyaXZlcjsKLSAgICBtX3BEZXZpY2VEcml2ZXIgPSBwRHJpdmVyOwotICAgIEluaXREZXZpY2VJbmZvKCk7Cit2b2lkIENGWF9SZW5kZXJEZXZpY2U6OlNldERldmljZURyaXZlcihJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyKSB7CisgIGRlbGV0ZSBtX3BEZXZpY2VEcml2ZXI7CisgIG1fcERldmljZURyaXZlciA9IHBEcml2ZXI7CisgIEluaXREZXZpY2VJbmZvKCk7CiB9Ci12b2lkIENGWF9SZW5kZXJEZXZpY2U6OkluaXREZXZpY2VJbmZvKCkKLXsKLSAgICBBU1NFUlQobV9wRGV2aWNlRHJpdmVyICE9IE5VTEwpOwotICAgIG1fV2lkdGggPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCk7Ci0gICAgbV9IZWlnaHQgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpOwotICAgIG1fYnBwID0gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKEZYRENfQklUU19QSVhFTCk7Ci0gICAgbV9SZW5kZXJDYXBzID0gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKEZYRENfUkVOREVSX0NBUFMpOwotICAgIG1fRGV2aWNlQ2xhc3MgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19ERVZJQ0VfQ0xBU1MpOwotICAgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5HZXRDbGlwQm94KCZtX0NsaXBCb3gpKSB7Ci0gICAgICAgIG1fQ2xpcEJveC5sZWZ0ID0gMDsKLSAgICAgICAgbV9DbGlwQm94LnRvcCA9IDA7Ci0gICAgICAgIG1fQ2xpcEJveC5yaWdodCA9IG1fV2lkdGg7Ci0gICAgICAgIG1fQ2xpcEJveC5ib3R0b20gPSBtX0hlaWdodDsKLSAgICB9Ci19Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlN0YXJ0UmVuZGVyaW5nKCkKLXsKLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdGFydFJlbmRlcmluZygpOwotfQotdm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpFbmRSZW5kZXJpbmcoKQotewotICAgIG1fcERldmljZURyaXZlci0+RW5kUmVuZGVyaW5nKCk7Ci19Ci12b2lkIENGWF9SZW5kZXJEZXZpY2U6OlNhdmVTdGF0ZSgpCi17Ci0gICAgbV9wRGV2aWNlRHJpdmVyLT5TYXZlU3RhdGUoKTsKLX0KLXZvaWQgQ0ZYX1JlbmRlckRldmljZTo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCkKLXsKLSAgICBtX3BEZXZpY2VEcml2ZXItPlJlc3RvcmVTdGF0ZShiS2VlcFNhdmVkKTsKLSAgICBVcGRhdGVDbGlwQm94KCk7Ci19Ci1pbnQgQ0ZYX1JlbmRlckRldmljZTo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKGNhcHNfaWQpOwotfQotQ0ZYX01hdHJpeCBDRlhfUmVuZGVyRGV2aWNlOjpHZXRDVE0oKSBjb25zdAotewotICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldENUTSgpOwotfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpDcmVhdGVDb21wYXRpYmxlQml0bWFwKENGWF9ESUJpdG1hcCogcERJQiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSBjb25zdAotewotICAgIGlmIChtX1JlbmRlckNhcHMgJiBGWFJDX0NNWUtfT1VUUFVUKSB7Ci0gICAgICAgIHJldHVybiBwRElCLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQgPyBGWERJQl9DbXlrYSA6IEZYRElCX0NteWspOwotICAgIH0KLSAgICBpZiAobV9SZW5kZXJDYXBzICYgRlhSQ19CWVRFTUFTS19PVVRQVVQpIHsKLSAgICAgICAgcmV0dXJuIHBESUItPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwTWFzayk7Ci0gICAgfQotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgIHJldHVybiBwRElCLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQgPyBGWERJQl9BcmdiIDogRlhESUJfUmdiMzIpOwotI2Vsc2UKLSAgICByZXR1cm4gcERJQi0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIG1fUmVuZGVyQ2FwcyAmIEZYUkNfQUxQSEFfT1VUUFVUID8gRlhESUJfQXJnYiA6IEZYRElCX1JnYik7Ci0jZW5kaWYKLX0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBpZiAoIW1fcERldmljZURyaXZlci0+U2V0Q2xpcF9QYXRoRmlsbChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBmaWxsX21vZGUpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgVXBkYXRlQ2xpcEJveCgpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBpZiAoIW1fcERldmljZURyaXZlci0+U2V0Q2xpcF9QYXRoU3Ryb2tlKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIFVwZGF0ZUNsaXBCb3goKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Q2xpcF9SZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0KQotewotICAgIENGWF9QYXRoRGF0YSBwYXRoOwotICAgIHBhdGguQXBwZW5kUmVjdCgoRlhfRkxPQVQpKHBSZWN0LT5sZWZ0KSwgKEZYX0ZMT0FUKShwUmVjdC0+Ym90dG9tKSwgKEZYX0ZMT0FUKShwUmVjdC0+cmlnaHQpLCAoRlhfRkxPQVQpKHBSZWN0LT50b3ApKTsKLSAgICBpZiAoIVNldENsaXBfUGF0aEZpbGwoJnBhdGgsIE5VTEwsIEZYRklMTF9XSU5ESU5HKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIFVwZGF0ZUNsaXBCb3goKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ0ZYX1JlbmRlckRldmljZTo6VXBkYXRlQ2xpcEJveCgpCi17Ci0gICAgaWYgKG1fcERldmljZURyaXZlci0+R2V0Q2xpcEJveCgmbV9DbGlwQm94KSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQordm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpJbml0RGV2aWNlSW5mbygpIHsKKyAgQVNTRVJUKG1fcERldmljZURyaXZlciAhPSBOVUxMKTsKKyAgbV9XaWR0aCA9IG1fcERldmljZURyaXZlci0+R2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKTsKKyAgbV9IZWlnaHQgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpOworICBtX2JwcCA9IG1fcERldmljZURyaXZlci0+R2V0RGV2aWNlQ2FwcyhGWERDX0JJVFNfUElYRUwpOworICBtX1JlbmRlckNhcHMgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUyk7CisgIG1fRGV2aWNlQ2xhc3MgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19ERVZJQ0VfQ0xBU1MpOworICBpZiAoIW1fcERldmljZURyaXZlci0+R2V0Q2xpcEJveCgmbV9DbGlwQm94KSkgewogICAgIG1fQ2xpcEJveC5sZWZ0ID0gMDsKICAgICBtX0NsaXBCb3gudG9wID0gMDsKICAgICBtX0NsaXBCb3gucmlnaHQgPSBtX1dpZHRoOwogICAgIG1fQ2xpcEJveC5ib3R0b20gPSBtX0hlaWdodDsKKyAgfQorfQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTdGFydFJlbmRlcmluZygpIHsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RhcnRSZW5kZXJpbmcoKTsKK30KK3ZvaWQgQ0ZYX1JlbmRlckRldmljZTo6RW5kUmVuZGVyaW5nKCkgeworICBtX3BEZXZpY2VEcml2ZXItPkVuZFJlbmRlcmluZygpOworfQordm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpTYXZlU3RhdGUoKSB7CisgIG1fcERldmljZURyaXZlci0+U2F2ZVN0YXRlKCk7Cit9Cit2b2lkIENGWF9SZW5kZXJEZXZpY2U6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpIHsKKyAgbV9wRGV2aWNlRHJpdmVyLT5SZXN0b3JlU3RhdGUoYktlZXBTYXZlZCk7CisgIFVwZGF0ZUNsaXBCb3goKTsKK30KK2ludCBDRlhfUmVuZGVyRGV2aWNlOjpHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKSBjb25zdCB7CisgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoY2Fwc19pZCk7Cit9CitDRlhfTWF0cml4IENGWF9SZW5kZXJEZXZpY2U6OkdldENUTSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+R2V0Q1RNKCk7Cit9CitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSBjb25zdCB7CisgIGlmIChtX1JlbmRlckNhcHMgJiBGWFJDX0NNWUtfT1VUUFVUKSB7CisgICAgcmV0dXJuIHBESUItPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBtX1JlbmRlckNhcHMgJiBGWFJDX0FMUEhBX09VVFBVVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRlhESUJfQ215a2EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYRElCX0NteWspOworICB9CisgIGlmIChtX1JlbmRlckNhcHMgJiBGWFJDX0JZVEVNQVNLX09VVFBVVCkgeworICAgIHJldHVybiBwRElCLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfOGJwcE1hc2spOworICB9CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgcmV0dXJuIHBESUItPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBtX1JlbmRlckNhcHMgJiBGWFJDX0FMUEhBX09VVFBVVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZYRElCX0FyZ2IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWERJQl9SZ2IzMik7CisjZWxzZQorICByZXR1cm4gcERJQi0+Q3JlYXRlKAorICAgICAgd2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQgPyBGWERJQl9BcmdiIDogRlhESUJfUmdiKTsKKyNlbmRpZgorfQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1BhdGhGaWxsKAorICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgIGludCBmaWxsX21vZGUpIHsKKyAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPlNldENsaXBfUGF0aEZpbGwocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBVcGRhdGVDbGlwQm94KCk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1BhdGhTdHJva2UoCisgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSkgeworICBpZiAoIW1fcERldmljZURyaXZlci0+U2V0Q2xpcF9QYXRoU3Ryb2tlKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIFVwZGF0ZUNsaXBCb3goKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCkgeworICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgcGF0aC5BcHBlbmRSZWN0KChGWF9GTE9BVCkocFJlY3QtPmxlZnQpLCAoRlhfRkxPQVQpKHBSZWN0LT5ib3R0b20pLAorICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShwUmVjdC0+cmlnaHQpLCAoRlhfRkxPQVQpKHBSZWN0LT50b3ApKTsKKyAgaWYgKCFTZXRDbGlwX1BhdGhGaWxsKCZwYXRoLCBOVUxMLCBGWEZJTExfV0lORElORykpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgVXBkYXRlQ2xpcEJveCgpOworICByZXR1cm4gVFJVRTsKK30KK3ZvaWQgQ0ZYX1JlbmRlckRldmljZTo6VXBkYXRlQ2xpcEJveCgpIHsKKyAgaWYgKG1fcERldmljZURyaXZlci0+R2V0Q2xpcEJveCgmbV9DbGlwQm94KSkgeworICAgIHJldHVybjsKKyAgfQorICBtX0NsaXBCb3gubGVmdCA9IDA7CisgIG1fQ2xpcEJveC50b3AgPSAwOworICBtX0NsaXBCb3gucmlnaHQgPSBtX1dpZHRoOworICBtX0NsaXBCb3guYm90dG9tID0gbV9IZWlnaHQ7CiB9CiBGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwgRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLCBpbnQgZmlsbF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCi17Ci0gICAgdWludDhfdCBmaWxsX2FscGhhLCBzdHJva2VfYWxwaGE7Ci0gICAgaWYgKEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykpIHsKLSAgICAgICAgZmlsbF9hbHBoYSA9IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpOwotICAgICAgICBzdHJva2VfYWxwaGEgPSBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICB1aW50OF90IGZpbGxfYWxwaGEsIHN0cm9rZV9hbHBoYTsKKyAgaWYgKEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykpIHsKKyAgICBmaWxsX2FscGhhID0gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZyk7CisgICAgc3Ryb2tlX2FscGhhID0gRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKKyAgfSBlbHNlIHsKKyAgICBmaWxsX2FscGhhID0gRlhBUkdCX0EoZmlsbF9jb2xvcik7CisgICAgc3Ryb2tlX2FscGhhID0gRlhBUkdCX0Eoc3Ryb2tlX2NvbG9yKTsKKyAgfQorICBpZiAoKGZpbGxfbW9kZSAmIDMpID09IDApIHsKKyAgICBmaWxsX2FscGhhID0gMDsKKyAgfQorICBpZiAocEdyYXBoU3RhdGUgPT0gTlVMTCkgeworICAgIHN0cm9rZV9hbHBoYSA9IDA7CisgIH0KKyAgaWYgKHN0cm9rZV9hbHBoYSA9PSAwICYmIHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDIpIHsKKyAgICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50cygpOworICAgIEZYX0ZMT0FUIHgxLCB4MiwgeTEsIHkyOworICAgIGlmIChwT2JqZWN0MkRldmljZSkgeworICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybShwUG9pbnRzWzBdLm1fUG9pbnRYLCBwUG9pbnRzWzBdLm1fUG9pbnRZLCB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEpOworICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybShwUG9pbnRzWzFdLm1fUG9pbnRYLCBwUG9pbnRzWzFdLm1fUG9pbnRZLCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpbGxfYWxwaGEgPSBGWEFSR0JfQShmaWxsX2NvbG9yKTsKLSAgICAgICAgc3Ryb2tlX2FscGhhID0gRlhBUkdCX0Eoc3Ryb2tlX2NvbG9yKTsKKyAgICAgIHgxID0gcFBvaW50c1swXS5tX1BvaW50WDsKKyAgICAgIHkxID0gcFBvaW50c1swXS5tX1BvaW50WTsKKyAgICAgIHgyID0gcFBvaW50c1sxXS5tX1BvaW50WDsKKyAgICAgIHkyID0gcFBvaW50c1sxXS5tX1BvaW50WTsKICAgICB9Ci0gICAgaWYgKChmaWxsX21vZGUgJiAzKSA9PSAwKSB7Ci0gICAgICAgIGZpbGxfYWxwaGEgPSAwOwotICAgIH0KLSAgICBpZiAocEdyYXBoU3RhdGUgPT0gTlVMTCkgewotICAgICAgICBzdHJva2VfYWxwaGEgPSAwOwotICAgIH0KLSAgICBpZiAoc3Ryb2tlX2FscGhhID09IDAgJiYgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gMikgewotICAgICAgICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50cygpOwotICAgICAgICBGWF9GTE9BVCB4MSwgeDIsIHkxLCB5MjsKLSAgICAgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHBQb2ludHNbMF0ubV9Qb2ludFgsIHBQb2ludHNbMF0ubV9Qb2ludFksIHgxLCB5MSk7Ci0gICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHBQb2ludHNbMV0ubV9Qb2ludFgsIHBQb2ludHNbMV0ubV9Qb2ludFksIHgyLCB5Mik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4MSA9IHBQb2ludHNbMF0ubV9Qb2ludFg7Ci0gICAgICAgICAgICB5MSA9IHBQb2ludHNbMF0ubV9Qb2ludFk7Ci0gICAgICAgICAgICB4MiA9IHBQb2ludHNbMV0ubV9Qb2ludFg7Ci0gICAgICAgICAgICB5MiA9IHBQb2ludHNbMV0ubV9Qb2ludFk7Ci0gICAgICAgIH0KLSAgICAgICAgRHJhd0Nvc21ldGljTGluZSh4MSwgeTEsIHgyLCB5MiwgZmlsbF9jb2xvciwgZmlsbF9tb2RlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmICgocFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNSB8fCBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSA0KSAmJiBzdHJva2VfYWxwaGEgPT0gMCkgewotICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3RfZjsKLSAgICAgICAgaWYgKCEoZmlsbF9tb2RlICYgRlhGSUxMX1JFQ1RfQUEpICYmIHBQYXRoRGF0YS0+SXNSZWN0KHBPYmplY3QyRGV2aWNlLCAmcmVjdF9mKSkgewotICAgICAgICAgICAgRlhfUkVDVCByZWN0X2kgPSByZWN0X2YuR2V0T3V0dGVyUmVjdCgpOwotICAgICAgICAgICAgaW50IHdpZHRoID0gKGludClGWFNZU19jZWlsKHJlY3RfZi5yaWdodCAtIHJlY3RfZi5sZWZ0KTsKLSAgICAgICAgICAgIGlmICh3aWR0aCA8IDEpIHsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IDE7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3RfaS5sZWZ0ID09IHJlY3RfaS5yaWdodCkgewotICAgICAgICAgICAgICAgICAgICByZWN0X2kucmlnaHQgKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGhlaWdodCA9IChpbnQpRlhTWVNfY2VpbChyZWN0X2YudG9wIC0gcmVjdF9mLmJvdHRvbSk7Ci0gICAgICAgICAgICBpZiAoaGVpZ2h0IDwgMSkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IDE7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3RfaS5ib3R0b20gPT0gcmVjdF9pLnRvcCkgewotICAgICAgICAgICAgICAgICAgICByZWN0X2kuYm90dG9tICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWN0X2kuV2lkdGgoKSA+PSB3aWR0aCArIDEpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVjdF9mLmxlZnQgLSAoRlhfRkxPQVQpKHJlY3RfaS5sZWZ0KSA+IChGWF9GTE9BVCkocmVjdF9pLnJpZ2h0KSAtIHJlY3RfZi5yaWdodCkgewotICAgICAgICAgICAgICAgICAgICByZWN0X2kubGVmdCArKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWN0X2kucmlnaHQgLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlY3RfaS5IZWlnaHQoKSA+PSBoZWlnaHQgKyAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3RfZi50b3AgLSAoRlhfRkxPQVQpKHJlY3RfaS50b3ApID4gKEZYX0ZMT0FUKShyZWN0X2kuYm90dG9tKSAtIHJlY3RfZi5ib3R0b20pIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdF9pLnRvcCArKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWN0X2kuYm90dG9tIC0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChGaWxsUmVjdCgmcmVjdF9pLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKChmaWxsX21vZGUgJiAzKSAmJiBzdHJva2VfYWxwaGEgPT0gMCAmJiAhKGZpbGxfbW9kZSAmIEZYX0ZJTExfU1RST0tFKSAmJiAhKGZpbGxfbW9kZSAmIEZYX0ZJTExfVEVYVF9NT0RFKSkgewotICAgICAgICBDRlhfUGF0aERhdGEgbmV3UGF0aDsKLSAgICAgICAgRlhfQk9PTCBiVGhpbiA9IEZBTFNFOwotICAgICAgICBpZiAocFBhdGhEYXRhLT5HZXRaZXJvQXJlYVBhdGgobmV3UGF0aCwgKENGWF9NYXRyaXgqKXBPYmplY3QyRGV2aWNlLCBiVGhpbiwgbV9wRGV2aWNlRHJpdmVyLT5HZXREcml2ZXJUeXBlKCkpKSB7Ci0gICAgICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3JhcGhTdGF0ZTsKLSAgICAgICAgICAgIGdyYXBoU3RhdGUubV9MaW5lV2lkdGggPSAwLjBmOwotICAgICAgICAgICAgRlhfRFdPUkQgc3Ryb2tlY29sb3IgPSBmaWxsX2NvbG9yOwotICAgICAgICAgICAgaWYgKGJUaGluKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhTRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnLCBmaWxsX2FscGhhID4+IDIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm9rZWNvbG9yID0gKCgoZmlsbF9hbHBoYSA+PiAyKSA8PCAyNCkgfCAoc3Ryb2tlY29sb3IgJiAweDAwZmZmZmZmKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAocE9iamVjdDJEZXZpY2UgJiYgIXBPYmplY3QyRGV2aWNlLT5Jc0lkZW50aXR5KCkpIHsKLSAgICAgICAgICAgICAgICBwTWF0cml4ID0gKENGWF9BZmZpbmVNYXRyaXgqKXBPYmplY3QyRGV2aWNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNtb290aF9wYXRoID0gRlhfWkVST0FSRUFfRklMTDsKLSAgICAgICAgICAgIGlmIChmaWxsX21vZGUgJiBGWEZJTExfTk9QQVRIU01PT1RIKSB7Ci0gICAgICAgICAgICAgICAgc21vb3RoX3BhdGggfD0gRlhGSUxMX05PUEFUSFNNT09USDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcERldmljZURyaXZlci0+RHJhd1BhdGgoJm5ld1BhdGgsIHBNYXRyaXgsICZncmFwaFN0YXRlLCAwLCBzdHJva2Vjb2xvciwgc21vb3RoX3BhdGgsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICgoZmlsbF9tb2RlICYgMykgJiYgZmlsbF9hbHBoYSAmJiBzdHJva2VfYWxwaGEgPCAweGZmICYmIChmaWxsX21vZGUgJiBGWF9GSUxMX1NUUk9LRSkpIHsKLSAgICAgICAgaWYgKCEobV9SZW5kZXJDYXBzICYgRlhSQ19HRVRfQklUUykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBDRlhfRmxvYXRSZWN0IGJib3g7Ci0gICAgICAgIGlmIChwR3JhcGhTdGF0ZSkgewotICAgICAgICAgICAgYmJveCA9IHBQYXRoRGF0YS0+R2V0Qm91bmRpbmdCb3gocEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoLCBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJib3ggPSBwUGF0aERhdGEtPkdldEJvdW5kaW5nQm94KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgICAgICBiYm94LlRyYW5zZm9ybShwT2JqZWN0MkRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX01hdHJpeCBjdG0gPSBHZXRDVE0oKTsKLSAgICAgICAgRlhfRkxPQVQgZlNjYWxlWCA9IEZYU1lTX2ZhYnMoY3RtLmEpOwotICAgICAgICBGWF9GTE9BVCBmU2NhbGVZID0gRlhTWVNfZmFicyhjdG0uZCk7Ci0gICAgICAgIEZYX1JFQ1QgcmVjdCA9IGJib3guR2V0T3V0dGVyUmVjdCgpOwotICAgICAgICBDRlhfRElCaXRtYXAgYml0bWFwLCBCYWNrZHJvcDsKLSAgICAgICAgaWYgKCFDcmVhdGVDb21wYXRpYmxlQml0bWFwKCZiaXRtYXAsIEZYU1lTX3JvdW5kKHJlY3QuV2lkdGgoKSAqIGZTY2FsZVgpLCBGWFNZU19yb3VuZChyZWN0LkhlaWdodCgpICogZlNjYWxlWSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpdG1hcC5IYXNBbHBoYSgpKSB7Ci0gICAgICAgICAgICBiaXRtYXAuQ2xlYXIoMCk7Ci0gICAgICAgICAgICBCYWNrZHJvcC5Db3B5KCZiaXRtYXApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wLCBOVUxMKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJhY2tkcm9wLkNvcHkoJmJpdG1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTsKLSAgICAgICAgYml0bWFwX2RldmljZS5BdHRhY2goJmJpdG1hcCwgMCwgRkFMU0UsICZCYWNrZHJvcCwgVFJVRSk7Ci0gICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgICAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKLSAgICAgICAgICAgIG1hdHJpeCA9ICpwT2JqZWN0MkRldmljZTsKLSAgICAgICAgfQotICAgICAgICBtYXRyaXguVHJhbnNsYXRlSSgtcmVjdC5sZWZ0LCAtcmVjdC50b3ApOwotICAgICAgICBtYXRyaXguQ29uY2F0KGZTY2FsZVgsIDAsIDAsIGZTY2FsZVksIDAsIDApOwotICAgICAgICBpZiAoIWJpdG1hcF9kZXZpY2UuR2V0RGV2aWNlRHJpdmVyKCktPkRyYXdQYXRoKHBQYXRoRGF0YSwgJm1hdHJpeCwgcEdyYXBoU3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgRlhTWVNfcm91bmQocmVjdC5XaWR0aCgpICogZlNjYWxlWCksIEZYU1lTX3JvdW5kKHJlY3QuSGVpZ2h0KCkgKiBmU2NhbGVZKSk7Ci0gICAgICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cygmYml0bWFwLCAwLCAmc3JjX3JlY3QsIHJlY3QubGVmdCwgcmVjdC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCk7Ci0gICAgfQotICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkRyYXdQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7Ci19Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPlNldFBpeGVsKHgsIHksIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfUkVDVCByZWN0KHgsIHksIHggKyAxLCB5ICsgMSk7Ci0gICAgcmV0dXJuIEZpbGxSZWN0KCZyZWN0LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci19Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCi17Ci0gICAgaWYgKG1fcERldmljZURyaXZlci0+RmlsbFJlY3QocFJlY3QsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7Ci0gICAgaWYgKCFDcmVhdGVDb21wYXRpYmxlQml0bWFwKCZiaXRtYXAsIHBSZWN0LT5XaWR0aCgpLCBwUmVjdC0+SGVpZ2h0KCkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYml0bWFwLCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIWJpdG1hcC5Db21wb3NpdGVSZWN0KDAsIDAsIHBSZWN0LT5XaWR0aCgpLCBwUmVjdC0+SGVpZ2h0KCksIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpKTsKLSAgICBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cygmYml0bWFwLCAwLCAmc3JjX3JlY3QsIHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBGWERJQl9CTEVORF9OT1JNQUwpOworICAgIERyYXdDb3NtZXRpY0xpbmUoeDEsIHkxLCB4MiwgeTIsIGZpbGxfY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOwogICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgaW50IGZpbGxfbW9kZSwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIGlmICgoKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQUxQSEFfUEFUSCkgJiYKLSAgICAgICAgICAgIChGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpICYmIEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpID09IDB4ZmYpKSB8fAotICAgICAgICAgICAgY29sb3IgPj0gMHhmZjAwMDAwMCkKLSAgICAgICAgaWYgKG1fcERldmljZURyaXZlci0+RHJhd0Nvc21ldGljTGluZSh4MSwgeTEsIHgyLCB5MiwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUgfHwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNCkgJiYKKyAgICAgIHN0cm9rZV9hbHBoYSA9PSAwKSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0X2Y7CisgICAgaWYgKCEoZmlsbF9tb2RlICYgRlhGSUxMX1JFQ1RfQUEpICYmCisgICAgICAgIHBQYXRoRGF0YS0+SXNSZWN0KHBPYmplY3QyRGV2aWNlLCAmcmVjdF9mKSkgeworICAgICAgRlhfUkVDVCByZWN0X2kgPSByZWN0X2YuR2V0T3V0dGVyUmVjdCgpOworICAgICAgaW50IHdpZHRoID0gKGludClGWFNZU19jZWlsKHJlY3RfZi5yaWdodCAtIHJlY3RfZi5sZWZ0KTsKKyAgICAgIGlmICh3aWR0aCA8IDEpIHsKKyAgICAgICAgd2lkdGggPSAxOworICAgICAgICBpZiAocmVjdF9pLmxlZnQgPT0gcmVjdF9pLnJpZ2h0KSB7CisgICAgICAgICAgcmVjdF9pLnJpZ2h0Kys7CiAgICAgICAgIH0KLSAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3JhcGhfc3RhdGU7Ci0gICAgQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0gICAgcGF0aC5TZXRQb2ludENvdW50KDIpOwotICAgIHBhdGguU2V0UG9pbnQoMCwgeDEsIHkxLCBGWFBUX01PVkVUTyk7Ci0gICAgcGF0aC5TZXRQb2ludCgxLCB4MiwgeTIsIEZYUFRfTElORVRPKTsKLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5EcmF3UGF0aCgmcGF0aCwgTlVMTCwgJmdyYXBoX3N0YXRlLCAwLCBjb2xvciwgZmlsbF9tb2RlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKLX0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKCEobV9SZW5kZXJDYXBzICYgRlhSQ19HRVRfQklUUykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaW50IGhlaWdodCA9IChpbnQpRlhTWVNfY2VpbChyZWN0X2YudG9wIC0gcmVjdF9mLmJvdHRvbSk7CisgICAgICBpZiAoaGVpZ2h0IDwgMSkgeworICAgICAgICBoZWlnaHQgPSAxOworICAgICAgICBpZiAocmVjdF9pLmJvdHRvbSA9PSByZWN0X2kudG9wKSB7CisgICAgICAgICAgcmVjdF9pLmJvdHRvbSsrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAocmVjdF9pLldpZHRoKCkgPj0gd2lkdGggKyAxKSB7CisgICAgICAgIGlmIChyZWN0X2YubGVmdCAtIChGWF9GTE9BVCkocmVjdF9pLmxlZnQpID4KKyAgICAgICAgICAgIChGWF9GTE9BVCkocmVjdF9pLnJpZ2h0KSAtIHJlY3RfZi5yaWdodCkgeworICAgICAgICAgIHJlY3RfaS5sZWZ0Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVjdF9pLnJpZ2h0LS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChyZWN0X2kuSGVpZ2h0KCkgPj0gaGVpZ2h0ICsgMSkgeworICAgICAgICBpZiAocmVjdF9mLnRvcCAtIChGWF9GTE9BVCkocmVjdF9pLnRvcCkgPgorICAgICAgICAgICAgKEZYX0ZMT0FUKShyZWN0X2kuYm90dG9tKSAtIHJlY3RfZi5ib3R0b20pIHsKKyAgICAgICAgICByZWN0X2kudG9wKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVjdF9pLmJvdHRvbS0tOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoRmlsbFJlY3QoJnJlY3RfaSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICBibGVuZF90eXBlKSkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+R2V0RElCaXRzKHBCaXRtYXAsIGxlZnQsIHRvcCwgcEljY1RyYW5zZm9ybSk7Ci19Ci1DRlhfRElCaXRtYXAqIENGWF9SZW5kZXJEZXZpY2U6OkdldEJhY2tEcm9wKCkKLXsKLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXRCYWNrRHJvcCgpOwotfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBBU1NFUlQoIXBCaXRtYXAtPklzQWxwaGFNYXNrKCkpOwotICAgIENGWF9BZmZpbmVNYXRyaXggY3RtID0gR2V0Q1RNKCk7CisgIH0KKyAgaWYgKChmaWxsX21vZGUgJiAzKSAmJiBzdHJva2VfYWxwaGEgPT0gMCAmJiAhKGZpbGxfbW9kZSAmIEZYX0ZJTExfU1RST0tFKSAmJgorICAgICAgIShmaWxsX21vZGUgJiBGWF9GSUxMX1RFWFRfTU9ERSkpIHsKKyAgICBDRlhfUGF0aERhdGEgbmV3UGF0aDsKKyAgICBGWF9CT09MIGJUaGluID0gRkFMU0U7CisgICAgaWYgKHBQYXRoRGF0YS0+R2V0WmVyb0FyZWFQYXRoKG5ld1BhdGgsIChDRlhfTWF0cml4KilwT2JqZWN0MkRldmljZSwgYlRoaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZURyaXZlci0+R2V0RHJpdmVyVHlwZSgpKSkgeworICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdyYXBoU3RhdGU7CisgICAgICBncmFwaFN0YXRlLm1fTGluZVdpZHRoID0gMC4wZjsKKyAgICAgIEZYX0RXT1JEIHN0cm9rZWNvbG9yID0gZmlsbF9jb2xvcjsKKyAgICAgIGlmIChiVGhpbikgeworICAgICAgICBpZiAoRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSkgeworICAgICAgICAgIEZYU0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZywgZmlsbF9hbHBoYSA+PiAyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdHJva2Vjb2xvciA9CisgICAgICAgICAgICAgICgoKGZpbGxfYWxwaGEgPj4gMikgPDwgMjQpIHwgKHN0cm9rZWNvbG9yICYgMHgwMGZmZmZmZikpOworICAgICAgICB9CisgICAgICB9CisgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4ID0gTlVMTDsKKyAgICAgIGlmIChwT2JqZWN0MkRldmljZSAmJiAhcE9iamVjdDJEZXZpY2UtPklzSWRlbnRpdHkoKSkgeworICAgICAgICBwTWF0cml4ID0gKENGWF9BZmZpbmVNYXRyaXgqKXBPYmplY3QyRGV2aWNlOworICAgICAgfQorICAgICAgaW50IHNtb290aF9wYXRoID0gRlhfWkVST0FSRUFfRklMTDsKKyAgICAgIGlmIChmaWxsX21vZGUgJiBGWEZJTExfTk9QQVRIU01PT1RIKSB7CisgICAgICAgIHNtb290aF9wYXRoIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7CisgICAgICB9CisgICAgICBtX3BEZXZpY2VEcml2ZXItPkRyYXdQYXRoKCZuZXdQYXRoLCBwTWF0cml4LCAmZ3JhcGhTdGF0ZSwgMCwgc3Ryb2tlY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtb290aF9wYXRoLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF90eXBlKTsKKyAgICB9CisgIH0KKyAgaWYgKChmaWxsX21vZGUgJiAzKSAmJiBmaWxsX2FscGhhICYmIHN0cm9rZV9hbHBoYSA8IDB4ZmYgJiYKKyAgICAgIChmaWxsX21vZGUgJiBGWF9GSUxMX1NUUk9LRSkpIHsKKyAgICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBDRlhfRmxvYXRSZWN0IGJib3g7CisgICAgaWYgKHBHcmFwaFN0YXRlKSB7CisgICAgICBiYm94ID0gcFBhdGhEYXRhLT5HZXRCb3VuZGluZ0JveChwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKKyAgICB9IGVsc2UgeworICAgICAgYmJveCA9IHBQYXRoRGF0YS0+R2V0Qm91bmRpbmdCb3goKTsKKyAgICB9CisgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICBiYm94LlRyYW5zZm9ybShwT2JqZWN0MkRldmljZSk7CisgICAgfQorICAgIENGWF9NYXRyaXggY3RtID0gR2V0Q1RNKCk7CiAgICAgRlhfRkxPQVQgZlNjYWxlWCA9IEZYU1lTX2ZhYnMoY3RtLmEpOwogICAgIEZYX0ZMT0FUIGZTY2FsZVkgPSBGWFNZU19mYWJzKGN0bS5kKTsKLSAgICBGWF9SRUNUIGRlc3RfcmVjdChsZWZ0LCB0b3AsIEZYU1lTX3JvdW5kKGxlZnQgKyBwQml0bWFwLT5HZXRXaWR0aCgpIC8gZlNjYWxlWCksIEZYU1lTX3JvdW5kKHRvcCArIHBCaXRtYXAtPkdldEhlaWdodCgpIC8gZlNjYWxlWSkpOwotICAgIGRlc3RfcmVjdC5JbnRlcnNlY3QobV9DbGlwQm94KTsKLSAgICBpZiAoZGVzdF9yZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBGWF9SRUNUIHJlY3QgPSBiYm94LkdldE91dHRlclJlY3QoKTsKKyAgICBDRlhfRElCaXRtYXAgYml0bWFwLCBCYWNrZHJvcDsKKyAgICBpZiAoIUNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoJmJpdG1hcCwgRlhTWVNfcm91bmQocmVjdC5XaWR0aCgpICogZlNjYWxlWCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHJlY3QuSGVpZ2h0KCkgKiBmU2NhbGVZKSkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgRlhfUkVDVCBzcmNfcmVjdChkZXN0X3JlY3QubGVmdCAtIGxlZnQsIGRlc3RfcmVjdC50b3AgLSB0b3AsCi0gICAgICAgICAgICAgICAgICAgICBkZXN0X3JlY3QubGVmdCAtIGxlZnQgKyBkZXN0X3JlY3QuV2lkdGgoKSwgZGVzdF9yZWN0LnRvcCAtIHRvcCArIGRlc3RfcmVjdC5IZWlnaHQoKSk7Ci0gICAgc3JjX3JlY3QubGVmdCA9IEZYU1lTX3JvdW5kKHNyY19yZWN0LmxlZnQgKiBmU2NhbGVYKTsKLSAgICBzcmNfcmVjdC50b3AgPSBGWFNZU19yb3VuZChzcmNfcmVjdC50b3AgKiBmU2NhbGVZKTsKLSAgICBzcmNfcmVjdC5yaWdodCA9IEZYU1lTX3JvdW5kKHNyY19yZWN0LnJpZ2h0ICogZlNjYWxlWCk7Ci0gICAgc3JjX3JlY3QuYm90dG9tID0gRlhTWVNfcm91bmQoc3JjX3JlY3QuYm90dG9tICogZlNjYWxlWSk7Ci0gICAgaWYgKChibGVuZF9tb2RlICE9IEZYRElCX0JMRU5EX05PUk1BTCAmJiAhKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQkxFTkRfTU9ERSkpIHx8Ci0gICAgICAgICAgICAocEJpdG1hcC0+SGFzQWxwaGEoKSAmJiAhKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQUxQSEFfSU1BR0UpKSkgewotICAgICAgICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGludCBiZ19waXhlbF93aWR0aCA9IEZYU1lTX3JvdW5kKGRlc3RfcmVjdC5XaWR0aCgpICogZlNjYWxlWCk7Ci0gICAgICAgIGludCBiZ19waXhlbF9oZWlnaHQgPSBGWFNZU19yb3VuZChkZXN0X3JlY3QuSGVpZ2h0KCkgKiBmU2NhbGVZKTsKLSAgICAgICAgQ0ZYX0RJQml0bWFwIGJhY2tncm91bmQ7Ci0gICAgICAgIGlmICghYmFja2dyb3VuZC5DcmVhdGUoYmdfcGl4ZWxfd2lkdGgsIGJnX3BpeGVsX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9SZW5kZXJDYXBzICYgRlhSQ19DTVlLX09VVFBVVCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiMzIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYmFja2dyb3VuZCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3ApKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiYWNrZ3JvdW5kLkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBiZ19waXhlbF93aWR0aCwgYmdfcGl4ZWxfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAsIHNyY19yZWN0LmxlZnQsIHNyY19yZWN0LnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF9tb2RlLCBOVUxMLCBGQUxTRSwgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIGJnX3BpeGVsX3dpZHRoLCBiZ19waXhlbF9oZWlnaHQpOwotICAgICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCk7CisgICAgaWYgKGJpdG1hcC5IYXNBbHBoYSgpKSB7CisgICAgICBiaXRtYXAuQ2xlYXIoMCk7CisgICAgICBCYWNrZHJvcC5Db3B5KCZiaXRtYXApOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIW1fcERldmljZURyaXZlci0+R2V0RElCaXRzKCZiaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIE5VTEwpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIEJhY2tkcm9wLkNvcHkoJmJpdG1hcCk7CiAgICAgfQotICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cyhwQml0bWFwLCAwLCAmc3JjX3JlY3QsIGRlc3RfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wLCBibGVuZF9tb2RlLCAwLCBwSWNjVHJhbnNmb3JtKTsKLX0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfbW9kZSkKLXsKLSAgICBGWF9SRUNUIGRlc3RfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBkZXN0X3dpZHRoLCB0b3AgKyBkZXN0X2hlaWdodCk7Ci0gICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fQ2xpcEJveDsKLSAgICBjbGlwX2JveC5JbnRlcnNlY3QoZGVzdF9yZWN0KTsKLSAgICBpZiAoY2xpcF9ib3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7CisgICAgYml0bWFwX2RldmljZS5BdHRhY2goJmJpdG1hcCwgMCwgRkFMU0UsICZCYWNrZHJvcCwgVFJVRSk7CisgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7CisgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICBtYXRyaXggPSAqcE9iamVjdDJEZXZpY2U7CiAgICAgfQotICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlN0cmV0Y2hESUJpdHMocEJpdG1hcCwgMCwgbGVmdCwgdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgJmNsaXBfYm94LCBmbGFncywgMCwgcEljY1RyYW5zZm9ybSwgYmxlbmRfbW9kZSk7CisgICAgbWF0cml4LlRyYW5zbGF0ZUkoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsKKyAgICBtYXRyaXguQ29uY2F0KGZTY2FsZVgsIDAsIDAsIGZTY2FsZVksIDAsIDApOworICAgIGlmICghYml0bWFwX2RldmljZS5HZXREZXZpY2VEcml2ZXIoKS0+RHJhd1BhdGgoCisgICAgICAgICAgICBwUGF0aERhdGEsICZtYXRyaXgsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsCisgICAgICAgICAgICBmaWxsX21vZGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgRlhTWVNfcm91bmQocmVjdC5XaWR0aCgpICogZlNjYWxlWCksCisgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0LkhlaWdodCgpICogZlNjYWxlWSkpOworICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cygmYml0bWFwLCAwLCAmc3JjX3JlY3QsIHJlY3QubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCk7CisgIH0KKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+RHJhd1BhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Qml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfRFdPUkQgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMocEJpdG1hcCwgYXJnYiwgJnNyY19yZWN0LCBsZWZ0LCB0b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldFBpeGVsKGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmIChtX3BEZXZpY2VEcml2ZXItPlNldFBpeGVsKHgsIHksIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIEZYX1JFQ1QgcmVjdCh4LCB5LCB4ICsgMSwgeSArIDEpOworICByZXR1cm4gRmlsbFJlY3QoJnJlY3QsIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U3RyZXRjaEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsCi0gICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGFyZ2IsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBGWF9SRUNUIGRlc3RfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBkZXN0X3dpZHRoLCB0b3AgKyBkZXN0X2hlaWdodCk7Ci0gICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fQ2xpcEJveDsKLSAgICBjbGlwX2JveC5JbnRlcnNlY3QoZGVzdF9yZWN0KTsKLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdHJldGNoRElCaXRzKHBCaXRtYXAsIGFyZ2IsIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsICZjbGlwX2JveCwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmIChtX3BEZXZpY2VEcml2ZXItPkZpbGxSZWN0KHBSZWN0LCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF90eXBlKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9ESUJpdG1hcCBiaXRtYXA7CisgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIW1fcERldmljZURyaXZlci0+R2V0RElCaXRzKCZiaXRtYXAsIHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIWJpdG1hcC5Db21wb3NpdGVSZWN0KDAsIDAsIHBSZWN0LT5XaWR0aCgpLCBwUmVjdC0+SGVpZ2h0KCksIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpKTsKKyAgbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJpdG1hcCwgMCwgJnNyY19yZWN0LCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGZsYWdzLCB2b2lkKiYgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX21vZGUpCi17Ci0gICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RhcnRESUJpdHMocEJpdG1hcCwgYml0bWFwX2FscGhhLCBhcmdiLCBwTWF0cml4LCBmbGFncywgaGFuZGxlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF9tb2RlKTsKK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKCgobV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9QQVRIKSAmJgorICAgICAgIChGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpICYmCisgICAgICAgIEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpID09IDB4ZmYpKSB8fAorICAgICAgY29sb3IgPj0gMHhmZjAwMDAwMCkKKyAgICBpZiAobV9wRGV2aWNlRHJpdmVyLT5EcmF3Q29zbWV0aWNMaW5lKHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIENGWF9HcmFwaFN0YXRlRGF0YSBncmFwaF9zdGF0ZTsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIHBhdGguU2V0UG9pbnRDb3VudCgyKTsKKyAgcGF0aC5TZXRQb2ludCgwLCB4MSwgeTEsIEZYUFRfTU9WRVRPKTsKKyAgcGF0aC5TZXRQb2ludCgxLCB4MiwgeTIsIEZYUFRfTElORVRPKTsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+RHJhd1BhdGgoJnBhdGgsIE5VTEwsICZncmFwaF9zdGF0ZSwgMCwgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSk7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+Q29udGludWVESUJpdHMoaGFuZGxlLCBwUGF1c2UpOworRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXRESUJpdHMocEJpdG1hcCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKIH0KLXZvaWQgQ0ZYX1JlbmRlckRldmljZTo6Q2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSkKLXsKLSAgICBtX3BEZXZpY2VEcml2ZXItPkNhbmNlbERJQml0cyhoYW5kbGUpOworQ0ZYX0RJQml0bWFwKiBDRlhfUmVuZGVyRGV2aWNlOjpHZXRCYWNrRHJvcCgpIHsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+R2V0QmFja0Ryb3AoKTsKK30KK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgQVNTRVJUKCFwQml0bWFwLT5Jc0FscGhhTWFzaygpKTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBjdG0gPSBHZXRDVE0oKTsKKyAgRlhfRkxPQVQgZlNjYWxlWCA9IEZYU1lTX2ZhYnMoY3RtLmEpOworICBGWF9GTE9BVCBmU2NhbGVZID0gRlhTWVNfZmFicyhjdG0uZCk7CisgIEZYX1JFQ1QgZGVzdF9yZWN0KGxlZnQsIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQobGVmdCArIHBCaXRtYXAtPkdldFdpZHRoKCkgLyBmU2NhbGVYKSwKKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQodG9wICsgcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLyBmU2NhbGVZKSk7CisgIGRlc3RfcmVjdC5JbnRlcnNlY3QobV9DbGlwQm94KTsKKyAgaWYgKGRlc3RfcmVjdC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9SRUNUIHNyY19yZWN0KGRlc3RfcmVjdC5sZWZ0IC0gbGVmdCwgZGVzdF9yZWN0LnRvcCAtIHRvcCwKKyAgICAgICAgICAgICAgICAgICBkZXN0X3JlY3QubGVmdCAtIGxlZnQgKyBkZXN0X3JlY3QuV2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICBkZXN0X3JlY3QudG9wIC0gdG9wICsgZGVzdF9yZWN0LkhlaWdodCgpKTsKKyAgc3JjX3JlY3QubGVmdCA9IEZYU1lTX3JvdW5kKHNyY19yZWN0LmxlZnQgKiBmU2NhbGVYKTsKKyAgc3JjX3JlY3QudG9wID0gRlhTWVNfcm91bmQoc3JjX3JlY3QudG9wICogZlNjYWxlWSk7CisgIHNyY19yZWN0LnJpZ2h0ID0gRlhTWVNfcm91bmQoc3JjX3JlY3QucmlnaHQgKiBmU2NhbGVYKTsKKyAgc3JjX3JlY3QuYm90dG9tID0gRlhTWVNfcm91bmQoc3JjX3JlY3QuYm90dG9tICogZlNjYWxlWSk7CisgIGlmICgoYmxlbmRfbW9kZSAhPSBGWERJQl9CTEVORF9OT1JNQUwgJiYgIShtX1JlbmRlckNhcHMgJiBGWFJDX0JMRU5EX01PREUpKSB8fAorICAgICAgKHBCaXRtYXAtPkhhc0FscGhhKCkgJiYgIShtX1JlbmRlckNhcHMgJiBGWFJDX0FMUEhBX0lNQUdFKSkpIHsKKyAgICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpbnQgYmdfcGl4ZWxfd2lkdGggPSBGWFNZU19yb3VuZChkZXN0X3JlY3QuV2lkdGgoKSAqIGZTY2FsZVgpOworICAgIGludCBiZ19waXhlbF9oZWlnaHQgPSBGWFNZU19yb3VuZChkZXN0X3JlY3QuSGVpZ2h0KCkgKiBmU2NhbGVZKTsKKyAgICBDRlhfRElCaXRtYXAgYmFja2dyb3VuZDsKKyAgICBpZiAoIWJhY2tncm91bmQuQ3JlYXRlKAorICAgICAgICAgICAgYmdfcGl4ZWxfd2lkdGgsIGJnX3BpeGVsX2hlaWdodCwKKyAgICAgICAgICAgIChtX1JlbmRlckNhcHMgJiBGWFJDX0NNWUtfT1VUUFVUKSA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2IzMikpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYmFja2dyb3VuZCwgZGVzdF9yZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JlY3QudG9wKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoIWJhY2tncm91bmQuQ29tcG9zaXRlQml0bWFwKDAsIDAsIGJnX3BpeGVsX3dpZHRoLCBiZ19waXhlbF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLCBzcmNfcmVjdC5sZWZ0LCBzcmNfcmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF9tb2RlLCBOVUxMLCBGQUxTRSwgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBiZ19waXhlbF93aWR0aCwgYmdfcGl4ZWxfaGVpZ2h0KTsKKyAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgZGVzdF9yZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCk7CisgIH0KKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKHBCaXRtYXAsIDAsICZzcmNfcmVjdCwgZGVzdF9yZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JlY3QudG9wLCBibGVuZF9tb2RlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSk7Cit9CitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF9tb2RlKSB7CisgIEZYX1JFQ1QgZGVzdF9yZWN0KGxlZnQsIHRvcCwgbGVmdCArIGRlc3Rfd2lkdGgsIHRvcCArIGRlc3RfaGVpZ2h0KTsKKyAgRlhfUkVDVCBjbGlwX2JveCA9IG1fQ2xpcEJveDsKKyAgY2xpcF9ib3guSW50ZXJzZWN0KGRlc3RfcmVjdCk7CisgIGlmIChjbGlwX2JveC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdHJldGNoRElCaXRzKHBCaXRtYXAsIDAsIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2hlaWdodCwgJmNsaXBfYm94LCBmbGFncywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtLCBibGVuZF9tb2RlKTsKK30KK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Qml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOworICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMocEJpdG1hcCwgYXJnYiwgJnNyY19yZWN0LCBsZWZ0LCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwsIGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKK30KK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U3RyZXRjaEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBGWF9SRUNUIGRlc3RfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBkZXN0X3dpZHRoLCB0b3AgKyBkZXN0X2hlaWdodCk7CisgIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX0NsaXBCb3g7CisgIGNsaXBfYm94LkludGVyc2VjdChkZXN0X3JlY3QpOworICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdHJldGNoRElCaXRzKHBCaXRtYXAsIGFyZ2IsIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2hlaWdodCwgJmNsaXBfYm94LCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKK30KK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfbW9kZSkgeworICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdGFydERJQml0cyhwQml0bWFwLCBiaXRtYXBfYWxwaGEsIGFyZ2IsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBoYW5kbGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX21vZGUpOworfQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkNvbnRpbnVlRElCaXRzKGhhbmRsZSwgcFBhdXNlKTsKK30KK3ZvaWQgQ0ZYX1JlbmRlckRldmljZTo6Q2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSkgeworICBtX3BEZXZpY2VEcml2ZXItPkNhbmNlbERJQml0cyhoYW5kbGUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udC5jcHAKaW5kZXggNjZjNGUwOC4uMzZiYmVjMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnQuY3BwCkBAIC03LDYyOSArNyw2MjQgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKICNpbmNsdWRlICJ0ZXh0X2ludC5oIgotI2RlZmluZSBFTV9BREpVU1QoZW0sIGEpIChlbSA9PSAwPyhhKTogKGEpKjEwMDAvZW0pCi1leHRlcm4gdm9pZCBfRlBERkFQSV9HZXRJbnRlcm5hbEZvbnREYXRhKGludCBpZDEsIGNvbnN0IHVpbnQ4X3QqJiBkYXRhLCBGWF9EV09SRCYgc2l6ZSk7Ci1DRlhfRm9udDo6Q0ZYX0ZvbnQoKQotewotICAgIG1fcFN1YnN0Rm9udCA9IE5VTEw7Ci0gICAgbV9GYWNlID0gTlVMTDsKLSAgICBtX2JFbWJlZGRlZCA9IEZBTFNFOwotICAgIG1fYlZlcnRpY2FsID0gRkFMU0U7Ci0gICAgbV9wRm9udERhdGEgPSBOVUxMOwotICAgIG1fcEZvbnREYXRhQWxsb2NhdGlvbiA9IE5VTEw7Ci0gICAgbV9kd1NpemUgPSAwOwotICAgIG1fcE93bmVkU3RyZWFtID0gTlVMTDsKLSAgICBtX3BHc3ViRGF0YSA9IE5VTEw7Ci0gICAgbV9wUGxhdGZvcm1Gb250ID0gTlVMTDsKLSAgICBtX3BQbGF0Zm9ybUZvbnRDb2xsZWN0aW9uID0gTlVMTDsKLSAgICBtX3BEd0ZvbnQgPSBOVUxMOwotICAgIG1faEhhbmRsZSA9IE5VTEw7Ci0gICAgbV9iRHdMb2FkZWQgPSBGQUxTRTsKLSAgICBtX2JMb2dpYyA9IEZBTFNFOworI2RlZmluZSBFTV9BREpVU1QoZW0sIGEpIChlbSA9PSAwID8gKGEpIDogKGEpKjEwMDAgLyBlbSkKK2V4dGVybiB2b2lkIF9GUERGQVBJX0dldEludGVybmFsRm9udERhdGEoaW50IGlkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdComIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBzaXplKTsKK0NGWF9Gb250OjpDRlhfRm9udCgpIHsKKyAgbV9wU3Vic3RGb250ID0gTlVMTDsKKyAgbV9GYWNlID0gTlVMTDsKKyAgbV9iRW1iZWRkZWQgPSBGQUxTRTsKKyAgbV9iVmVydGljYWwgPSBGQUxTRTsKKyAgbV9wRm9udERhdGEgPSBOVUxMOworICBtX3BGb250RGF0YUFsbG9jYXRpb24gPSBOVUxMOworICBtX2R3U2l6ZSA9IDA7CisgIG1fcE93bmVkU3RyZWFtID0gTlVMTDsKKyAgbV9wR3N1YkRhdGEgPSBOVUxMOworICBtX3BQbGF0Zm9ybUZvbnQgPSBOVUxMOworICBtX3BQbGF0Zm9ybUZvbnRDb2xsZWN0aW9uID0gTlVMTDsKKyAgbV9wRHdGb250ID0gTlVMTDsKKyAgbV9oSGFuZGxlID0gTlVMTDsKKyAgbV9iRHdMb2FkZWQgPSBGQUxTRTsKKyAgbV9iTG9naWMgPSBGQUxTRTsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OkxvYWRDbG9uZShjb25zdCBDRlhfRm9udCogcEZvbnQpCi17Ci0gICAgaWYgKHBGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX2JMb2dpYyA9IFRSVUU7Ci0gICAgaWYgKHBGb250LT5tX3BTdWJzdEZvbnQpIHsKLSAgICAgICAgbV9wU3Vic3RGb250ID0gRlhfTkVXIENGWF9TdWJzdEZvbnQ7Ci0gICAgICAgIGlmICghbV9wU3Vic3RGb250KSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wU3Vic3RGb250LT5tX0NoYXJzZXQgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX0NoYXJzZXQ7Ci0gICAgICAgIG1fcFN1YnN0Rm9udC0+bV9FeHRIYW5kbGUgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX0V4dEhhbmRsZTsKLSAgICAgICAgbV9wU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX1N1YnN0RmxhZ3M7Ci0gICAgICAgIG1fcFN1YnN0Rm9udC0+bV9XZWlnaHQgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX1dlaWdodDsKLSAgICAgICAgbV9wU3Vic3RGb250LT5tX0ZhbWlseSA9IHBGb250LT5tX3BTdWJzdEZvbnQtPm1fRmFtaWx5OwotICAgICAgICBtX3BTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGUgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlOwotICAgIH0KLSAgICBpZiAocEZvbnQtPm1fT3RmRm9udERhdGEuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIG1fT3RmRm9udERhdGEuQXR0YWNoRGF0YShwRm9udC0+bV9PdGZGb250RGF0YS5HZXRCdWZmZXIoKSwgcEZvbnQtPm1fT3RmRm9udERhdGEuR2V0U2l6ZSgpKTsKLSAgICB9Ci0gICAgbV9GYWNlID0gcEZvbnQtPm1fRmFjZTsKLSAgICBtX2JFbWJlZGRlZCA9IHBGb250LT5tX2JFbWJlZGRlZDsKLSAgICBtX2JWZXJ0aWNhbCA9IHBGb250LT5tX2JWZXJ0aWNhbDsKLSAgICBtX2R3U2l6ZSA9IHBGb250LT5tX2R3U2l6ZTsKLSAgICBtX3BGb250RGF0YSA9IHBGb250LT5tX3BGb250RGF0YTsKLSAgICBtX3BHc3ViRGF0YSA9IHBGb250LT5tX3BHc3ViRGF0YTsKLSAgICBtX3BQbGF0Zm9ybUZvbnQgPSBwRm9udC0+bV9wUGxhdGZvcm1Gb250OwotICAgIG1fcFBsYXRmb3JtRm9udENvbGxlY3Rpb24gPSBwRm9udC0+bV9wUGxhdGZvcm1Gb250Q29sbGVjdGlvbjsKLSAgICBtX3BEd0ZvbnQgPSBwRm9udC0+bV9wRHdGb250OwotICAgIG1faEhhbmRsZSA9IHBGb250LT5tX2hIYW5kbGU7Ci0gICAgbV9iRHdMb2FkZWQgPSBwRm9udC0+bV9iRHdMb2FkZWQ7Ci0gICAgbV9wT3duZWRTdHJlYW0gPSBwRm9udC0+bV9wT3duZWRTdHJlYW07Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1DRlhfRm9udDo6fkNGWF9Gb250KCkKLXsKLSAgICBkZWxldGUgbV9wU3Vic3RGb250OwotICAgIG1fcFN1YnN0Rm9udCA9IE5VTEw7Ci0gICAgaWYgKG1fYkxvZ2ljKSB7Ci0gICAgICAgIG1fT3RmRm9udERhdGEuRGV0YWNoQnVmZmVyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fRmFjZSkgewotICAgICAgICBpZihtX2JFbWJlZGRlZCkgewotICAgICAgICAgICAgRGVsZXRlRmFjZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5SZWxlYXNlRmFjZShtX0ZhY2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX3BPd25lZFN0cmVhbSkgewotICAgICAgICBGWF9GcmVlKG1fcE93bmVkU3RyZWFtKTsKLSAgICAgICAgbV9wT3duZWRTdHJlYW0gPSBOVUxMOwotICAgIH0KLSAgICBpZiAobV9wR3N1YkRhdGEpIHsKLSAgICAgICAgRlhfRnJlZShtX3BHc3ViRGF0YSk7Ci0gICAgICAgIG1fcEdzdWJEYXRhID0gTlVMTDsKLSAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgUmVsZWFzZVBsYXRmb3JtUmVzb3VyY2UoKTsKLSNlbmRpZgotfQotdm9pZCBDRlhfRm9udDo6RGVsZXRlRmFjZSgpCi17Ci0gICAgRlhGVF9Eb25lX0ZhY2UobV9GYWNlKTsKLSAgICBtX0ZhY2UgPSBOVUxMOwotfQotRlhfQk9PTCBDRlhfRm9udDo6TG9hZFN1YnN0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgQ2hhcnNldENQLCBGWF9CT09MIGJWZXJ0aWNhbCkKLXsKLSAgICBtX2JFbWJlZGRlZCA9IEZBTFNFOwotICAgIG1fYlZlcnRpY2FsID0gYlZlcnRpY2FsOworRlhfQk9PTCBDRlhfRm9udDo6TG9hZENsb25lKGNvbnN0IENGWF9Gb250KiBwRm9udCkgeworICBpZiAocEZvbnQgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX2JMb2dpYyA9IFRSVUU7CisgIGlmIChwRm9udC0+bV9wU3Vic3RGb250KSB7CiAgICAgbV9wU3Vic3RGb250ID0gRlhfTkVXIENGWF9TdWJzdEZvbnQ7CiAgICAgaWYgKCFtX3BTdWJzdEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBtX0ZhY2UgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPkZpbmRTdWJzdEZvbnQoZmFjZV9uYW1lLCBiVHJ1ZVR5cGUsIGZsYWdzLCB3ZWlnaHQsIGl0YWxpY19hbmdsZSwKLSAgICAgICAgICAgICBDaGFyc2V0Q1AsIG1fcFN1YnN0Rm9udCk7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgaWYobV9wU3Vic3RGb250LT5tX0V4dEhhbmRsZSkgewotICAgICAgICBtX3BQbGF0Zm9ybUZvbnQgPSBtX3BTdWJzdEZvbnQtPm1fRXh0SGFuZGxlOwotICAgICAgICBtX3BTdWJzdEZvbnQtPm1fRXh0SGFuZGxlID0gTlVMTDsKKyAgICBtX3BTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IHBGb250LT5tX3BTdWJzdEZvbnQtPm1fQ2hhcnNldDsKKyAgICBtX3BTdWJzdEZvbnQtPm1fRXh0SGFuZGxlID0gcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9FeHRIYW5kbGU7CisgICAgbV9wU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX1N1YnN0RmxhZ3M7CisgICAgbV9wU3Vic3RGb250LT5tX1dlaWdodCA9IHBGb250LT5tX3BTdWJzdEZvbnQtPm1fV2VpZ2h0OworICAgIG1fcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX0ZhbWlseTsKKyAgICBtX3BTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGUgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlOworICB9CisgIGlmIChwRm9udC0+bV9PdGZGb250RGF0YS5HZXRTaXplKCkpIHsKKyAgICBtX090ZkZvbnREYXRhLkF0dGFjaERhdGEocEZvbnQtPm1fT3RmRm9udERhdGEuR2V0QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5tX090ZkZvbnREYXRhLkdldFNpemUoKSk7CisgIH0KKyAgbV9GYWNlID0gcEZvbnQtPm1fRmFjZTsKKyAgbV9iRW1iZWRkZWQgPSBwRm9udC0+bV9iRW1iZWRkZWQ7CisgIG1fYlZlcnRpY2FsID0gcEZvbnQtPm1fYlZlcnRpY2FsOworICBtX2R3U2l6ZSA9IHBGb250LT5tX2R3U2l6ZTsKKyAgbV9wRm9udERhdGEgPSBwRm9udC0+bV9wRm9udERhdGE7CisgIG1fcEdzdWJEYXRhID0gcEZvbnQtPm1fcEdzdWJEYXRhOworICBtX3BQbGF0Zm9ybUZvbnQgPSBwRm9udC0+bV9wUGxhdGZvcm1Gb250OworICBtX3BQbGF0Zm9ybUZvbnRDb2xsZWN0aW9uID0gcEZvbnQtPm1fcFBsYXRmb3JtRm9udENvbGxlY3Rpb247CisgIG1fcER3Rm9udCA9IHBGb250LT5tX3BEd0ZvbnQ7CisgIG1faEhhbmRsZSA9IHBGb250LT5tX2hIYW5kbGU7CisgIG1fYkR3TG9hZGVkID0gcEZvbnQtPm1fYkR3TG9hZGVkOworICBtX3BPd25lZFN0cmVhbSA9IHBGb250LT5tX3BPd25lZFN0cmVhbTsKKyAgcmV0dXJuIFRSVUU7Cit9CitDRlhfRm9udDo6fkNGWF9Gb250KCkgeworICBkZWxldGUgbV9wU3Vic3RGb250OworICBtX3BTdWJzdEZvbnQgPSBOVUxMOworICBpZiAobV9iTG9naWMpIHsKKyAgICBtX090ZkZvbnREYXRhLkRldGFjaEJ1ZmZlcigpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9GYWNlKSB7CisgICAgaWYgKG1fYkVtYmVkZGVkKSB7CisgICAgICBEZWxldGVGYWNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+UmVsZWFzZUZhY2UobV9GYWNlKTsKICAgICB9CisgIH0KKyAgaWYgKG1fcE93bmVkU3RyZWFtKSB7CisgICAgRlhfRnJlZShtX3BPd25lZFN0cmVhbSk7CisgICAgbV9wT3duZWRTdHJlYW0gPSBOVUxMOworICB9CisgIGlmIChtX3BHc3ViRGF0YSkgeworICAgIEZYX0ZyZWUobV9wR3N1YkRhdGEpOworICAgIG1fcEdzdWJEYXRhID0gTlVMTDsKKyAgfQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgIFJlbGVhc2VQbGF0Zm9ybVJlc291cmNlKCk7CiAjZW5kaWYKLSAgICBpZiAobV9GYWNlKSB7Ci0gICAgICAgIG1fcEZvbnREYXRhID0gRlhGVF9HZXRfRmFjZV9TdHJlYW1fQmFzZShtX0ZhY2UpOwotICAgICAgICBtX2R3U2l6ZSA9IEZYRlRfR2V0X0ZhY2VfU3RyZWFtX1NpemUobV9GYWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENGWF9Gb250OjpEZWxldGVGYWNlKCkgeworICBGWEZUX0RvbmVfRmFjZShtX0ZhY2UpOworICBtX0ZhY2UgPSBOVUxMOworfQorRlhfQk9PTCBDRlhfRm9udDo6TG9hZFN1YnN0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJ1ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDaGFyc2V0Q1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydGljYWwpIHsKKyAgbV9iRW1iZWRkZWQgPSBGQUxTRTsKKyAgbV9iVmVydGljYWwgPSBiVmVydGljYWw7CisgIG1fcFN1YnN0Rm9udCA9IEZYX05FVyBDRlhfU3Vic3RGb250OworICBpZiAoIW1fcFN1YnN0Rm9udCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX0ZhY2UgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPkZpbmRTdWJzdEZvbnQoCisgICAgICBmYWNlX25hbWUsIGJUcnVlVHlwZSwgZmxhZ3MsIHdlaWdodCwgaXRhbGljX2FuZ2xlLCBDaGFyc2V0Q1AsCisgICAgICBtX3BTdWJzdEZvbnQpOworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgIGlmIChtX3BTdWJzdEZvbnQtPm1fRXh0SGFuZGxlKSB7CisgICAgbV9wUGxhdGZvcm1Gb250ID0gbV9wU3Vic3RGb250LT5tX0V4dEhhbmRsZTsKKyAgICBtX3BTdWJzdEZvbnQtPm1fRXh0SGFuZGxlID0gTlVMTDsKKyAgfQorI2VuZGlmCisgIGlmIChtX0ZhY2UpIHsKKyAgICBtX3BGb250RGF0YSA9IEZYRlRfR2V0X0ZhY2VfU3RyZWFtX0Jhc2UobV9GYWNlKTsKKyAgICBtX2R3U2l6ZSA9IEZYRlRfR2V0X0ZhY2VfU3RyZWFtX1NpemUobV9GYWNlKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIGV4dGVybiAiQyIgewotICAgIHVuc2lnbmVkIGxvbmcgX0ZUU3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpCi0gICAgewotICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZSA9IChJRlhfRmlsZVJlYWQqKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyOwotICAgICAgICBpbnQgcmVzID0gcEZpbGUtPlJlYWRCbG9jayhidWZmZXIsIG9mZnNldCwgY291bnQpOwotICAgICAgICBpZiAocmVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHZvaWQgX0ZUU3RyZWFtQ2xvc2UoRlhGVF9TdHJlYW0gc3RyZWFtKQotICAgIHsKLSAgICB9Ci19OwotRlhfQk9PTCBfTG9hZEZpbGUoRlhGVF9MaWJyYXJ5IGxpYnJhcnksIEZYRlRfRmFjZSogRmFjZSwgSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhGVF9TdHJlYW0qIHN0cmVhbSwgaW50MzJfdCBmYWNlSW5kZXggPSAwKQotewotICAgIEZYRlRfU3RyZWFtIHN0cmVhbTEgPSAoRlhGVF9TdHJlYW0pRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mIChGWEZUX1N0cmVhbVJlYykpOwotICAgIHN0cmVhbTEtPmJhc2UgPSBOVUxMOwotICAgIHN0cmVhbTEtPnNpemUgPSAodW5zaWduZWQgbG9uZylwRmlsZS0+R2V0U2l6ZSgpOwotICAgIHN0cmVhbTEtPnBvcyA9IDA7Ci0gICAgc3RyZWFtMS0+ZGVzY3JpcHRvci5wb2ludGVyID0gcEZpbGU7Ci0gICAgc3RyZWFtMS0+Y2xvc2UgPSBfRlRTdHJlYW1DbG9zZTsKLSAgICBzdHJlYW0xLT5yZWFkID0gX0ZUU3RyZWFtUmVhZDsKLSAgICBGWEZUX09wZW5fQXJncyBhcmdzOwotICAgIGFyZ3MuZmxhZ3MgPSBGVF9PUEVOX1NUUkVBTTsKLSAgICBhcmdzLnN0cmVhbSA9IHN0cmVhbTE7Ci0gICAgaWYgKEZYRlRfT3Blbl9GYWNlKGxpYnJhcnksICZhcmdzLCBmYWNlSW5kZXgsIEZhY2UpKSB7Ci0gICAgICAgIEZYX0ZyZWUoc3RyZWFtMSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHN0cmVhbSkgewotICAgICAgICAqc3RyZWFtID0gc3RyZWFtMTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9Gb250OjpMb2FkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlLCBpbnQgbkZhY2VJbmRleCwgaW50KiBwRmFjZUNvdW50KQotewotICAgIG1fYkVtYmVkZGVkID0gRkFMU0U7Ci0gICAgRlhGVF9MaWJyYXJ5IGxpYnJhcnk7Ci0gICAgaWYgKENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnkgPT0gTlVMTCkKLSAgICAgICAgRlhGVF9Jbml0X0ZyZWVUeXBlKCZDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5KTsKLSAgICBsaWJyYXJ5ID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeTsKLSAgICBGWEZUX1N0cmVhbSBzdHJlYW0gPSBOVUxMOwotICAgIGlmICghX0xvYWRGaWxlKGxpYnJhcnksICZtX0ZhY2UsIHBGaWxlLCAmc3RyZWFtLCBuRmFjZUluZGV4KSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIGlmIChwRmFjZUNvdW50KQotICAgICAgICAqcEZhY2VDb3VudCA9IChpbnQpbV9GYWNlLT5udW1fZmFjZXM7Ci0gICAgbV9wT3duZWRTdHJlYW0gPSBzdHJlYW07Ci0gICAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1pbnQgQ0ZYX0ZvbnQ6OkdldEdseXBoV2lkdGgoRlhfRFdPUkQgZ2x5cGhfaW5kZXgpCi17Ci0gICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChtX3BTdWJzdEZvbnQgJiYgKG1fcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSkgewotICAgICAgICBBZGp1c3RNTVBhcmFtcyhnbHlwaF9pbmRleCwgMCwgMCk7Ci0gICAgfQotICAgIGludCBlcnIgPSBGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBnbHlwaF9pbmRleCwgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7Ci0gICAgaWYgKGVycikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IHdpZHRoID0gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9HbHlwaF9Ib3JpQWR2YW5jZShtX0ZhY2UpKTsKLSAgICByZXR1cm4gd2lkdGg7Ci19Ci1zdGF0aWMgRlhGVF9GYWNlIEZUX0xvYWRGb250KHVpbnQ4X3QqIHBEYXRhLCBpbnQgc2l6ZSkKLXsKLSAgICBGWEZUX0xpYnJhcnkgbGlicmFyeTsKLSAgICBpZiAoQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeSA9PSBOVUxMKSB7Ci0gICAgICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeSk7Ci0gICAgfQotICAgIGxpYnJhcnkgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5OwotICAgIEZYRlRfRmFjZSBmYWNlID0gTlVMTDsKLSAgICBpbnQgZXJyb3IgPSBGWEZUX05ld19NZW1vcnlfRmFjZShsaWJyYXJ5LCBwRGF0YSwgc2l6ZSwgMCwgJmZhY2UpOwotICAgIGlmIChlcnJvcikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZXJyb3IgPSBGWEZUX1NldF9QaXhlbF9TaXplcyhmYWNlLCA2NCwgNjQpOwotICAgIGlmIChlcnJvcikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGZhY2U7Ci19Ci1GWF9CT09MIENGWF9Gb250OjpMb2FkRW1iZWRkZWQoY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSkKLXsKLSAgICBtX3BGb250RGF0YUFsbG9jYXRpb24gPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKLSAgICBGWFNZU19tZW1jcHkobV9wRm9udERhdGFBbGxvY2F0aW9uLCBkYXRhLCBzaXplKTsKLSAgICBtX0ZhY2UgPSBGVF9Mb2FkRm9udCgodWludDhfdCopbV9wRm9udERhdGFBbGxvY2F0aW9uLCBzaXplKTsKLSAgICBtX3BGb250RGF0YSA9ICh1aW50OF90KiltX3BGb250RGF0YUFsbG9jYXRpb247Ci0gICAgbV9iRW1iZWRkZWQgPSBUUlVFOwotICAgIG1fZHdTaXplID0gc2l6ZTsKLSAgICByZXR1cm4gbV9GYWNlICE9IE5VTEw7Ci19Ci1GWF9CT09MIENGWF9Gb250OjpJc1RURm9udCgpCi17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYRlRfSXNfRmFjZV9UVF9PVChtX0ZhY2UpID09IEZYRlRfRkFDRV9GTEFHX1NGTlQ7Ci19Ci1pbnQgQ0ZYX0ZvbnQ6OkdldEFzY2VudCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQgYXNjZW50ID0gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX0FzY2VuZGVyKG1fRmFjZSkpOwotICAgIHJldHVybiBhc2NlbnQ7Ci19Ci1pbnQgQ0ZYX0ZvbnQ6OkdldERlc2NlbnQoKSBjb25zdAotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IGRlc2NlbnQgPSBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKG1fRmFjZSkpOwotICAgIHJldHVybiBkZXNjZW50OwotfQotRlhfQk9PTCBDRlhfRm9udDo6R2V0R2x5cGhCQm94KEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9SRUNUICZiYm94KQotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChGWEZUX0lzX0ZhY2VfVHJpY2t5KG1fRmFjZSkpIHsKLSAgICAgICAgaW50IGVycm9yID0gRlhGVF9TZXRfQ2hhcl9TaXplKG1fRmFjZSwgMCwgMTAwMCAqIDY0LCA3MiwgNzIpOwotICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKLSAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhGVF9CQm94IGNib3g7Ci0gICAgICAgIEZUX0dseXBoIGdseXBoOwotICAgICAgICBlcnJvciA9IEZYRlRfR2V0X0dseXBoKCgoRlhGVF9GYWNlKW1fRmFjZSktPmdseXBoLCAmZ2x5cGgpOwotICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBGWEZUX0dMWVBIX0JCT1hfUElYRUxTLCAmY2JveCk7Ci0gICAgICAgIGludCBwaXhlbF9zaXplX3ggPSAoKEZYRlRfRmFjZSltX0ZhY2UpLT5zaXplLT5tZXRyaWNzLnhfcHBlbSwKLSAgICAgICAgICAgIHBpeGVsX3NpemVfeSA9ICgoRlhGVF9GYWNlKW1fRmFjZSktPnNpemUtPm1ldHJpY3MueV9wcGVtOwotICAgICAgICBpZiAocGl4ZWxfc2l6ZV94ID09IDAgfHwgcGl4ZWxfc2l6ZV95ID09IDApIHsKLSAgICAgICAgICAgIGJib3gubGVmdCA9IGNib3gueE1pbjsKLSAgICAgICAgICAgIGJib3gucmlnaHQgPSBjYm94LnhNYXg7Ci0gICAgICAgICAgICBiYm94LnRvcCA9IGNib3gueU1heDsKLSAgICAgICAgICAgIGJib3guYm90dG9tID0gY2JveC55TWluOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYmJveC5sZWZ0ID0gY2JveC54TWluICogMTAwMCAvIHBpeGVsX3NpemVfeDsKLSAgICAgICAgICAgIGJib3gucmlnaHQgPSBjYm94LnhNYXggKiAxMDAwIC8gcGl4ZWxfc2l6ZV94OwotICAgICAgICAgICAgYmJveC50b3AgPSBjYm94LnlNYXggKiAxMDAwIC8gcGl4ZWxfc2l6ZV95OwotICAgICAgICAgICAgYmJveC5ib3R0b20gPSBjYm94LnlNaW4gKiAxMDAwIC8gcGl4ZWxfc2l6ZV95OwotICAgICAgICB9Ci0gICAgICAgIGlmIChiYm94LnRvcCA+IEZYRlRfR2V0X0ZhY2VfQXNjZW5kZXIobV9GYWNlKSkgewotICAgICAgICAgICAgYmJveC50b3AgPSBGWEZUX0dldF9GYWNlX0FzY2VuZGVyKG1fRmFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJib3guYm90dG9tIDwgRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9GYWNlKSkgewotICAgICAgICAgICAgYmJveC5ib3R0b20gPSBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihtX0ZhY2UpOwotICAgICAgICB9Ci0gICAgICAgIEZUX0RvbmVfR2x5cGgoZ2x5cGgpOwotICAgICAgICByZXR1cm4gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCkgPT0gMDsKLSAgICB9Ci0gICAgaWYgKEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBlbSA9IEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpOwotICAgIGlmIChlbSA9PSAwKSB7Ci0gICAgICAgIGJib3gubGVmdCA9IEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChtX0ZhY2UpOwotICAgICAgICBiYm94LmJvdHRvbSA9IEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZhY2UpOwotICAgICAgICBiYm94LnRvcCA9IGJib3guYm90dG9tIC0gRlhGVF9HZXRfR2x5cGhfSGVpZ2h0KG1fRmFjZSk7Ci0gICAgICAgIGJib3gucmlnaHQgPSBiYm94LmxlZnQgKyBGWEZUX0dldF9HbHlwaF9XaWR0aChtX0ZhY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJib3gubGVmdCA9IEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChtX0ZhY2UpICogMTAwMCAvIGVtOwotICAgICAgICBiYm94LnRvcCA9IChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSAtIEZYRlRfR2V0X0dseXBoX0hlaWdodChtX0ZhY2UpKSAqIDEwMDAgLyBlbTsKLSAgICAgICAgYmJveC5yaWdodCA9IChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKSArIEZYRlRfR2V0X0dseXBoX1dpZHRoKG1fRmFjZSkpICogMTAwMCAvIGVtOwotICAgICAgICBiYm94LmJvdHRvbSA9IChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSkgKiAxMDAwIC8gZW07Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRm9udDo6SXNJdGFsaWMoKQotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0JPT0wgcmV0ID0gRlhGVF9Jc19GYWNlX0l0YWxpYyhtX0ZhY2UpID09IEZYRlRfU1RZTEVfRkxBR19JVEFMSUM7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyKEZYRlRfR2V0X0ZhY2VfU3R5bGVfTmFtZShtX0ZhY2UpKTsKLSAgICAgICAgc3RyLk1ha2VMb3dlcigpOwotICAgICAgICBpZiAoc3RyLkZpbmQoIml0YWxpYyIpICE9IC0xKSB7Ci0gICAgICAgICAgICByZXQgPSBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci1GWF9CT09MIENGWF9Gb250OjpJc0JvbGQoKQotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBGWEZUX0lzX0ZhY2VfQm9sZChtX0ZhY2UpID09IEZYRlRfU1RZTEVfRkxBR19CT0xEOwotfQotRlhfQk9PTCBDRlhfRm9udDo6SXNGaXhlZFdpZHRoKCkKLXsKLSAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gRlhGVF9Jc19GYWNlX2ZpeGVkd2lkdGgobV9GYWNlKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENGWF9Gb250OjpHZXRQc05hbWUoKSBjb25zdAotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgcHNOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChGWEZUX0dldF9Qb3N0c2NyaXB0X05hbWUobV9GYWNlKSk7Ci0gICAgaWYgKHBzTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcHNOYW1lID0gIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIlVudGl0bGVkIik7Ci0gICAgfQotICAgIHJldHVybiBwc05hbWU7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDRlhfRm9udDo6R2V0RmFtaWx5TmFtZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMICYmIG1fcFN1YnN0Rm9udCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotICAgIH0KLSAgICBpZiAobV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhGWEZUX0dldF9GYWNlX0ZhbWlseV9OYW1lKG1fRmFjZSkpOwotICAgIH0KLSAgICByZXR1cm4gbV9wU3Vic3RGb250LT5tX0ZhbWlseTsKLX0KLUNGWF9CeXRlU3RyaW5nIENGWF9Gb250OjpHZXRGYWNlTmFtZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMICYmIG1fcFN1YnN0Rm9udCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotICAgIH0KLSAgICBpZiAobV9GYWNlKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGZhY2VuYW1lOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHlsZSA9IENGWF9CeXRlU3RyaW5nKEZYRlRfR2V0X0ZhY2VfU3R5bGVfTmFtZShtX0ZhY2UpKTsKLSAgICAgICAgZmFjZW5hbWUgPSBHZXRGYW1pbHlOYW1lKCk7Ci0gICAgICAgIGlmIChmYWNlbmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZhY2VuYW1lID0gIlVudGl0bGVkIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0eWxlLklzRW1wdHkoKSAmJiBzdHlsZSAhPSAiUmVndWxhciIpIHsKLSAgICAgICAgICAgIGZhY2VuYW1lICs9ICIgIiArIHN0eWxlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWNlbmFtZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcFN1YnN0Rm9udC0+bV9GYW1pbHk7Ci19Ci1GWF9CT09MIENGWF9Gb250OjpHZXRCQm94KEZYX1JFQ1QgJmJib3gpCi17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50IGVtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7Ci0gICAgaWYgKGVtID09IDApIHsKLSAgICAgICAgYmJveC5sZWZ0ID0gRlhGVF9HZXRfRmFjZV94TWluKG1fRmFjZSk7Ci0gICAgICAgIGJib3guYm90dG9tID0gRlhGVF9HZXRfRmFjZV95TWF4KG1fRmFjZSk7Ci0gICAgICAgIGJib3gudG9wID0gRlhGVF9HZXRfRmFjZV95TWluKG1fRmFjZSk7Ci0gICAgICAgIGJib3gucmlnaHQgPSBGWEZUX0dldF9GYWNlX3hNYXgobV9GYWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBiYm94LmxlZnQgPSBGWEZUX0dldF9GYWNlX3hNaW4obV9GYWNlKSAqIDEwMDAgLyBlbTsKLSAgICAgICAgYmJveC50b3AgPSBGWEZUX0dldF9GYWNlX3lNaW4obV9GYWNlKSAqIDEwMDAgLyBlbTsKLSAgICAgICAgYmJveC5yaWdodCA9IEZYRlRfR2V0X0ZhY2VfeE1heChtX0ZhY2UpICogMTAwMCAvIGVtOwotICAgICAgICBiYm94LmJvdHRvbSA9IEZYRlRfR2V0X0ZhY2VfeU1heChtX0ZhY2UpICogMTAwMCAvIGVtOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLWludCBDRlhfRm9udDo6R2V0SGVpZ2h0KCkKLXsKLSAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfSGVpZ2h0KG1fRmFjZSkpOwotICAgIHJldHVybiBoZWlnaHQ7Ci19Ci1pbnQgQ0ZYX0ZvbnQ6OkdldE1heEFkdmFuY2VXaWR0aCgpCi17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQgd2lkdGggPSBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfTWF4QWR2YW5jZVdpZHRoKG1fRmFjZSkpOwotICAgIHJldHVybiB3aWR0aDsKLX0KLWludCBDRlhfRm9udDo6R2V0VUxQb3MoKQotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IHBvcyA9IEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV9VbmRlckxpbmVQb3NpdGlvbihtX0ZhY2UpKTsKLSAgICByZXR1cm4gcG9zOwotfQotaW50IENGWF9Gb250OjpHZXRVTHRoaWNrbmVzcygpCi17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQgdGhpY2tuZXNzID0gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX1VuZGVyTGluZVRoaWNrbmVzcyhtX0ZhY2UpKTsKLSAgICByZXR1cm4gdGhpY2tuZXNzOwotfQotQ0ZYX1VuaWNvZGVFbmNvZGluZzo6Q0ZYX1VuaWNvZGVFbmNvZGluZyhDRlhfRm9udCogcEZvbnQpCi17Ci0gICAgbV9wRm9udCA9IHBGb250OwotfQotRlhfRFdPUkQgQ0ZYX1VuaWNvZGVFbmNvZGluZzo6R2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpCi17Ci0gICAgRlhGVF9GYWNlIGZhY2UgPSAgbV9wRm9udC0+R2V0RmFjZSgpOwotICAgIGlmICghZmFjZSkgewotICAgICAgICByZXR1cm4gY2hhcmNvZGU7Ci0gICAgfQotICAgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgPT0gMCkgewotICAgICAgICByZXR1cm4gRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjaGFyY29kZSk7Ci0gICAgfQotICAgIGlmIChtX3BGb250LT5tX3BTdWJzdEZvbnQgJiYgbV9wRm9udC0+bV9wU3Vic3RGb250LT5tX0NoYXJzZXQgPT0gMikgewotICAgICAgICBGWF9EV09SRCBpbmRleCA9IDA7Ci0gICAgICAgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIEZYRlRfRU5DT0RJTkdfTVNfU1lNQk9MKSA9PSAwKSB7Ci0gICAgICAgICAgICBpbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaW5kZXggJiYgIUZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTikpIHsKLSAgICAgICAgICAgIHJldHVybiBGWEZUX0dldF9DaGFyX0luZGV4KGZhY2UsIGNoYXJjb2RlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2hhcmNvZGU7Ci19Ci1GWF9EV09SRCBDRlhfVW5pY29kZUVuY29kaW5nOjpHbHlwaEZyb21DaGFyQ29kZUV4KEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgZW5jb2RpbmcpCi17Ci0gICAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5HZXRGYWNlKCk7Ci0gICAgaWYgKCFmYWNlKSB7Ci0gICAgICAgIHJldHVybiBjaGFyY29kZTsKLSAgICB9Ci0gICAgaWYgKGVuY29kaW5nID09IEVOQ09ESU5HX1VOSUNPREUpIHsKLSAgICAgICAgcmV0dXJuIEdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICB9Ci0gICAgaW50IG5tYXBzID0gRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQobV9wRm9udC0+bV9GYWNlKTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBubWFwcykgewotICAgICAgICBpbnQgZW5jb2RpbmcgPSBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaSsrXSk7Ci0gICAgICAgIGlmIChlbmNvZGluZyAhPSBGWEZUX0VOQ09ESU5HX1VOSUNPREUpIHsKLSAgICAgICAgICAgIEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgZW5jb2RpbmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOwotfQotSUZYX0ZvbnRFbmNvZGluZyogRlhHRV9DcmVhdGVVbmljb2RlRW5jb2RpbmcoQ0ZYX0ZvbnQqIHBGb250KQotewotICAgIENGWF9Vbmljb2RlRW5jb2RpbmcqIHBFbmNvZGluZyA9IE5VTEw7Ci0gICAgcEVuY29kaW5nID0gRlhfTkVXIENGWF9Vbmljb2RlRW5jb2RpbmcocEZvbnQpOwotICAgIHJldHVybiBwRW5jb2Rpbmc7Ci19Ci1DRlhfRm9udEVuY29kaW5nRVg6OkNGWF9Gb250RW5jb2RpbmdFWCgpCi17Ci0gICAgbV9wRm9udCA9IE5VTEw7Ci0gICAgbV9uRW5jb2RpbmdJRCA9IEZYRk1fRU5DT0RJTkdfTk9ORTsKLX0KLUZYX0JPT0wgQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpJbml0KENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgRW5jb2RpbmdJRCkKLXsKLSAgICBpZiAoIXBGb250KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wRm9udCA9IHBGb250OwotICAgIG1fbkVuY29kaW5nSUQgPSBFbmNvZGluZ0lEOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfRFdPUkQgQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkKLXsKLSAgICBGWEZUX0ZhY2UgZmFjZSA9IG1fcEZvbnQtPm1fRmFjZTsKLSAgICBGVF9VSW50IG5JbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOwotICAgIGlmIChuSW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBuSW5kZXg7Ci0gICAgfQotICAgIGludCBubWFwcyA9IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KGZhY2UpOwotICAgIGludCBtID0gMDsKLSAgICB3aGlsZSAobSA8IG5tYXBzKSB7Ci0gICAgICAgIGludCBuRW5jb2RpbmdJRCA9IEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVttKytdKTsKLSAgICAgICAgaWYgKG1fbkVuY29kaW5nSUQgPT0gbkVuY29kaW5nSUQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBlcnJvciA9IEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgbkVuY29kaW5nSUQpOwotICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIG5JbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOwotICAgICAgICBpZiAobkluZGV4ID4gMCkgewotICAgICAgICAgICAgbV9uRW5jb2RpbmdJRCA9IG5FbmNvZGluZ0lEOwotICAgICAgICAgICAgcmV0dXJuIG5JbmRleDsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIG1fbkVuY29kaW5nSUQpOwordW5zaWduZWQgbG9uZyBfRlRTdHJlYW1SZWFkKEZYRlRfU3RyZWFtIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkgeworICBpZiAoY291bnQgPT0gMCkgewogICAgIHJldHVybiAwOworICB9CisgIElGWF9GaWxlUmVhZCogcEZpbGUgPSAoSUZYX0ZpbGVSZWFkKilzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlcjsKKyAgaW50IHJlcyA9IHBGaWxlLT5SZWFkQmxvY2soYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyAgaWYgKHJlcykgeworICAgIHJldHVybiBjb3VudDsKKyAgfQorICByZXR1cm4gMDsKIH0KLUNGWF9XaWRlU3RyaW5nIENGWF9Gb250RW5jb2RpbmdFWDo6VW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKLXsKLSAgICBpZiAobV9uRW5jb2RpbmdJRCA9PSBGWEZNX0VOQ09ESU5HX1VOSUNPREUpIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKChGWF9XQ0hBUiljaGFyY29kZSk7Cit2b2lkIF9GVFN0cmVhbUNsb3NlKEZYRlRfU3RyZWFtIHN0cmVhbSkge30KK307CitGWF9CT09MIF9Mb2FkRmlsZShGWEZUX0xpYnJhcnkgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgIEZYRlRfRmFjZSogRmFjZSwKKyAgICAgICAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcEZpbGUsCisgICAgICAgICAgICAgICAgICBGWEZUX1N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBmYWNlSW5kZXggPSAwKSB7CisgIEZYRlRfU3RyZWFtIHN0cmVhbTEgPSAoRlhGVF9TdHJlYW0pRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEZYRlRfU3RyZWFtUmVjKSk7CisgIHN0cmVhbTEtPmJhc2UgPSBOVUxMOworICBzdHJlYW0xLT5zaXplID0gKHVuc2lnbmVkIGxvbmcpcEZpbGUtPkdldFNpemUoKTsKKyAgc3RyZWFtMS0+cG9zID0gMDsKKyAgc3RyZWFtMS0+ZGVzY3JpcHRvci5wb2ludGVyID0gcEZpbGU7CisgIHN0cmVhbTEtPmNsb3NlID0gX0ZUU3RyZWFtQ2xvc2U7CisgIHN0cmVhbTEtPnJlYWQgPSBfRlRTdHJlYW1SZWFkOworICBGWEZUX09wZW5fQXJncyBhcmdzOworICBhcmdzLmZsYWdzID0gRlRfT1BFTl9TVFJFQU07CisgIGFyZ3Muc3RyZWFtID0gc3RyZWFtMTsKKyAgaWYgKEZYRlRfT3Blbl9GYWNlKGxpYnJhcnksICZhcmdzLCBmYWNlSW5kZXgsIEZhY2UpKSB7CisgICAgRlhfRnJlZShzdHJlYW0xKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHN0cmVhbSkgeworICAgICpzdHJlYW0gPSBzdHJlYW0xOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfRm9udDo6TG9hZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRmFjZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwRmFjZUNvdW50KSB7CisgIG1fYkVtYmVkZGVkID0gRkFMU0U7CisgIEZYRlRfTGlicmFyeSBsaWJyYXJ5OworICBpZiAoQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeSA9PSBOVUxMKQorICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeSk7CisgIGxpYnJhcnkgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5OworICBGWEZUX1N0cmVhbSBzdHJlYW0gPSBOVUxMOworICBpZiAoIV9Mb2FkRmlsZShsaWJyYXJ5LCAmbV9GYWNlLCBwRmlsZSwgJnN0cmVhbSwgbkZhY2VJbmRleCkpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAocEZhY2VDb3VudCkKKyAgICAqcEZhY2VDb3VudCA9IChpbnQpbV9GYWNlLT5udW1fZmFjZXM7CisgIG1fcE93bmVkU3RyZWFtID0gc3RyZWFtOworICBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CitpbnQgQ0ZYX0ZvbnQ6OkdldEdseXBoV2lkdGgoRlhfRFdPUkQgZ2x5cGhfaW5kZXgpIHsKKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobV9wU3Vic3RGb250ICYmIChtX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9NTSkpIHsKKyAgICBBZGp1c3RNTVBhcmFtcyhnbHlwaF9pbmRleCwgMCwgMCk7CisgIH0KKyAgaW50IGVyciA9IEZYRlRfTG9hZF9HbHlwaCgKKyAgICAgIG1fRmFjZSwgZ2x5cGhfaW5kZXgsCisgICAgICBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKKyAgaWYgKGVycikgeworICAgIHJldHVybiAwOworICB9CisgIGludCB3aWR0aCA9IEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRmFjZSkpOworICByZXR1cm4gd2lkdGg7Cit9CitzdGF0aWMgRlhGVF9GYWNlIEZUX0xvYWRGb250KHVpbnQ4X3QqIHBEYXRhLCBpbnQgc2l6ZSkgeworICBGWEZUX0xpYnJhcnkgbGlicmFyeTsKKyAgaWYgKENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnkgPT0gTlVMTCkgeworICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeSk7CisgIH0KKyAgbGlicmFyeSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnk7CisgIEZYRlRfRmFjZSBmYWNlID0gTlVMTDsKKyAgaW50IGVycm9yID0gRlhGVF9OZXdfTWVtb3J5X0ZhY2UobGlicmFyeSwgcERhdGEsIHNpemUsIDAsICZmYWNlKTsKKyAgaWYgKGVycm9yKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZXJyb3IgPSBGWEZUX1NldF9QaXhlbF9TaXplcyhmYWNlLCA2NCwgNjQpOworICBpZiAoZXJyb3IpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gZmFjZTsKK30KK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OkxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKSB7CisgIG1fcEZvbnREYXRhQWxsb2NhdGlvbiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOworICBGWFNZU19tZW1jcHkobV9wRm9udERhdGFBbGxvY2F0aW9uLCBkYXRhLCBzaXplKTsKKyAgbV9GYWNlID0gRlRfTG9hZEZvbnQoKHVpbnQ4X3QqKW1fcEZvbnREYXRhQWxsb2NhdGlvbiwgc2l6ZSk7CisgIG1fcEZvbnREYXRhID0gKHVpbnQ4X3QqKW1fcEZvbnREYXRhQWxsb2NhdGlvbjsKKyAgbV9iRW1iZWRkZWQgPSBUUlVFOworICBtX2R3U2l6ZSA9IHNpemU7CisgIHJldHVybiBtX0ZhY2UgIT0gTlVMTDsKK30KK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OklzVFRGb250KCkgeworICBpZiAobV9GYWNlID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIEZYRlRfSXNfRmFjZV9UVF9PVChtX0ZhY2UpID09IEZYRlRfRkFDRV9GTEFHX1NGTlQ7Cit9CitpbnQgQ0ZYX0ZvbnQ6OkdldEFzY2VudCgpIGNvbnN0IHsKKyAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IGFzY2VudCA9IEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX0FzY2VuZGVyKG1fRmFjZSkpOworICByZXR1cm4gYXNjZW50OworfQoraW50IENGWF9Gb250OjpHZXREZXNjZW50KCkgY29uc3QgeworICBpZiAobV9GYWNlID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgZGVzY2VudCA9IEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9GYWNlKSk7CisgIHJldHVybiBkZXNjZW50OworfQorRlhfQk9PTCBDRlhfRm9udDo6R2V0R2x5cGhCQm94KEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9SRUNUJiBiYm94KSB7CisgIGlmIChtX0ZhY2UgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoRlhGVF9Jc19GYWNlX1RyaWNreShtX0ZhY2UpKSB7CisgICAgaW50IGVycm9yID0gRlhGVF9TZXRfQ2hhcl9TaXplKG1fRmFjZSwgMCwgMTAwMCAqIDY0LCA3MiwgNzIpOworICAgIGlmIChlcnJvcikgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKEZYX1dDSEFSKTApOwotfQotRlhfRFdPUkQgQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpDaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIFVuaWNvZGUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fbkVuY29kaW5nSUQgPT0gRlhGTV9FTkNPRElOR19VTklDT0RFIHx8IG1fbkVuY29kaW5nSUQgPT0gRlhGTV9FTkNPRElOR19NU19TWU1CT0wpIHsKLSAgICAgICAgcmV0dXJuIFVuaWNvZGU7CisgICAgZXJyb3IgPSBGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5tX0ZhY2U7Ci0gICAgaW50IG5tYXBzID0gRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBubWFwczsgaSsrKSB7Ci0gICAgICAgIGludCBuRW5jb2RpbmdJRCA9IEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVtpXSk7Ci0gICAgICAgIGlmIChuRW5jb2RpbmdJRCA9PSBGWEZNX0VOQ09ESU5HX1VOSUNPREUgfHwgbkVuY29kaW5nSUQgPT0gRlhGTV9FTkNPRElOR19NU19TWU1CT0wpIHsKLSAgICAgICAgICAgIHJldHVybiBVbmljb2RlOwotICAgICAgICB9CisgICAgRlhGVF9CQm94IGNib3g7CisgICAgRlRfR2x5cGggZ2x5cGg7CisgICAgZXJyb3IgPSBGWEZUX0dldF9HbHlwaCgoKEZYRlRfRmFjZSltX0ZhY2UpLT5nbHlwaCwgJmdseXBoKTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotRlhfQk9PTCBDRlhfRm9udEVuY29kaW5nRVg6OklzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdAotewotICAgIHJldHVybiBtX25FbmNvZGluZ0lEID09IEZYRk1fRU5DT0RJTkdfVU5JQ09ERTsKLX0KLUZYX0RXT1JEIENGWF9Gb250RW5jb2RpbmdFWDo6R2x5cGhJbmRleEZyb21OYW1lKGNvbnN0IEZYX0NIQVIqIHBTdHJOYW1lKQotewotICAgIEZYRlRfRmFjZSBmYWNlID0gbV9wRm9udC0+bV9GYWNlOwotICAgIHJldHVybiBGVF9HZXRfTmFtZV9JbmRleChmYWNlLCAoRlRfU3RyaW5nKilwU3RyTmFtZSk7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDRlhfRm9udEVuY29kaW5nRVg6Ok5hbWVGcm9tR2x5cGhJbmRleChGWF9EV09SRCBkd0dseXBoSW5kZXgpCi17Ci0gICAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5tX0ZhY2U7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZ2x5cGhOYW1lKCIgICAgICAgICAgICAgICAgIik7Ci0gICAgaWYgKEZUX0hBU19HTFlQSF9OQU1FUygoKEZUX0ZhY2UpZmFjZSkpKSB7Ci0gICAgICAgIGlmIChGVF9HZXRfR2x5cGhfTmFtZSgoRlRfRmFjZSlmYWNlLCBkd0dseXBoSW5kZXgsIChGVF9Qb2ludGVyKShjb25zdCBGWF9DSEFSKilnbHlwaE5hbWUsIDE2KSkgewotICAgICAgICAgICAgZ2x5cGhOYW1lLkVtcHR5KCk7Ci0gICAgICAgICAgICByZXR1cm4gZ2x5cGhOYW1lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnbHlwaE5hbWU7CisgICAgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUywgJmNib3gpOworICAgIGludCBwaXhlbF9zaXplX3ggPSAoKEZYRlRfRmFjZSltX0ZhY2UpLT5zaXplLT5tZXRyaWNzLnhfcHBlbSwKKyAgICAgICAgcGl4ZWxfc2l6ZV95ID0gKChGWEZUX0ZhY2UpbV9GYWNlKS0+c2l6ZS0+bWV0cmljcy55X3BwZW07CisgICAgaWYgKHBpeGVsX3NpemVfeCA9PSAwIHx8IHBpeGVsX3NpemVfeSA9PSAwKSB7CisgICAgICBiYm94LmxlZnQgPSBjYm94LnhNaW47CisgICAgICBiYm94LnJpZ2h0ID0gY2JveC54TWF4OworICAgICAgYmJveC50b3AgPSBjYm94LnlNYXg7CisgICAgICBiYm94LmJvdHRvbSA9IGNib3gueU1pbjsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZ2x5cGhOYW1lOworICAgICAgYmJveC5sZWZ0ID0gY2JveC54TWluICogMTAwMCAvIHBpeGVsX3NpemVfeDsKKyAgICAgIGJib3gucmlnaHQgPSBjYm94LnhNYXggKiAxMDAwIC8gcGl4ZWxfc2l6ZV94OworICAgICAgYmJveC50b3AgPSBjYm94LnlNYXggKiAxMDAwIC8gcGl4ZWxfc2l6ZV95OworICAgICAgYmJveC5ib3R0b20gPSBjYm94LnlNaW4gKiAxMDAwIC8gcGl4ZWxfc2l6ZV95OwogICAgIH0KKyAgICBpZiAoYmJveC50b3AgPiBGWEZUX0dldF9GYWNlX0FzY2VuZGVyKG1fRmFjZSkpIHsKKyAgICAgIGJib3gudG9wID0gRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZhY2UpOworICAgIH0KKyAgICBpZiAoYmJveC5ib3R0b20gPCBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihtX0ZhY2UpKSB7CisgICAgICBiYm94LmJvdHRvbSA9IEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKG1fRmFjZSk7CisgICAgfQorICAgIEZUX0RvbmVfR2x5cGgoZ2x5cGgpOworICAgIHJldHVybiBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KSA9PSAwOworICB9CisgIGlmIChGWEZUX0xvYWRfR2x5cGgoCisgICAgICAgICAgbV9GYWNlLCBnbHlwaF9pbmRleCwKKyAgICAgICAgICBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgZW0gPSBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKTsKKyAgaWYgKGVtID09IDApIHsKKyAgICBiYm94LmxlZnQgPSBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKTsKKyAgICBiYm94LmJvdHRvbSA9IEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZhY2UpOworICAgIGJib3gudG9wID0gYmJveC5ib3R0b20gLSBGWEZUX0dldF9HbHlwaF9IZWlnaHQobV9GYWNlKTsKKyAgICBiYm94LnJpZ2h0ID0gYmJveC5sZWZ0ICsgRlhGVF9HZXRfR2x5cGhfV2lkdGgobV9GYWNlKTsKKyAgfSBlbHNlIHsKKyAgICBiYm94LmxlZnQgPSBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKSAqIDEwMDAgLyBlbTsKKyAgICBiYm94LnRvcCA9CisgICAgICAgIChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSAtIEZYRlRfR2V0X0dseXBoX0hlaWdodChtX0ZhY2UpKSAqCisgICAgICAgIDEwMDAgLyBlbTsKKyAgICBiYm94LnJpZ2h0ID0KKyAgICAgICAgKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChtX0ZhY2UpICsgRlhGVF9HZXRfR2x5cGhfV2lkdGgobV9GYWNlKSkgKgorICAgICAgICAxMDAwIC8gZW07CisgICAgYmJveC5ib3R0b20gPSAoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSkpICogMTAwMCAvIGVtOworICB9CisgIHJldHVybiBUUlVFOwogfQotRlhfRFdPUkQgQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpDaGFyQ29kZUZyb21HbHlwaEluZGV4KEZYX0RXT1JEIGR3R2x5cGhJbmRleCkKLXsKLSAgICBGWEZUX0ZhY2UgZmFjZSA9IG1fcEZvbnQtPkdldEZhY2UoKTsKLSAgICBGWF9EV09SRCAgY2hhcmNvZGU7Ci0gICAgRlRfVUludCAgZ2lkOworRlhfQk9PTCBDRlhfRm9udDo6SXNJdGFsaWMoKSB7CisgIGlmIChtX0ZhY2UgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9CT09MIHJldCA9IEZYRlRfSXNfRmFjZV9JdGFsaWMobV9GYWNlKSA9PSBGWEZUX1NUWUxFX0ZMQUdfSVRBTElDOworICBpZiAoIXJldCkgeworICAgIENGWF9CeXRlU3RyaW5nIHN0cihGWEZUX0dldF9GYWNlX1N0eWxlX05hbWUobV9GYWNlKSk7CisgICAgc3RyLk1ha2VMb3dlcigpOworICAgIGlmIChzdHIuRmluZCgiaXRhbGljIikgIT0gLTEpIHsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiByZXQ7Cit9CitGWF9CT09MIENGWF9Gb250OjpJc0JvbGQoKSB7CisgIGlmIChtX0ZhY2UgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gRlhGVF9Jc19GYWNlX0JvbGQobV9GYWNlKSA9PSBGWEZUX1NUWUxFX0ZMQUdfQk9MRDsKK30KK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OklzRml4ZWRXaWR0aCgpIHsKKyAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGWEZUX0lzX0ZhY2VfZml4ZWR3aWR0aChtX0ZhY2UpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0ZvbnQ6OkdldFBzTmFtZSgpIGNvbnN0IHsKKyAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgcHNOYW1lID0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoRlhGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKG1fRmFjZSkpOworICBpZiAocHNOYW1lLklzRW1wdHkoKSkgeworICAgIHBzTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIlVudGl0bGVkIik7CisgIH0KKyAgcmV0dXJuIHBzTmFtZTsKK30KK0NGWF9CeXRlU3RyaW5nIENGWF9Gb250OjpHZXRGYW1pbHlOYW1lKCkgY29uc3QgeworICBpZiAobV9GYWNlID09IE5VTEwgJiYgbV9wU3Vic3RGb250ID09IE5VTEwpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgfQorICBpZiAobV9GYWNlKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKEZYRlRfR2V0X0ZhY2VfRmFtaWx5X05hbWUobV9GYWNlKSk7CisgIH0KKyAgcmV0dXJuIG1fcFN1YnN0Rm9udC0+bV9GYW1pbHk7Cit9CitDRlhfQnl0ZVN0cmluZyBDRlhfRm9udDo6R2V0RmFjZU5hbWUoKSBjb25zdCB7CisgIGlmIChtX0ZhY2UgPT0gTlVMTCAmJiBtX3BTdWJzdEZvbnQgPT0gTlVMTCkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICB9CisgIGlmIChtX0ZhY2UpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBmYWNlbmFtZTsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHlsZSA9IENGWF9CeXRlU3RyaW5nKEZYRlRfR2V0X0ZhY2VfU3R5bGVfTmFtZShtX0ZhY2UpKTsKKyAgICBmYWNlbmFtZSA9IEdldEZhbWlseU5hbWUoKTsKKyAgICBpZiAoZmFjZW5hbWUuSXNFbXB0eSgpKSB7CisgICAgICBmYWNlbmFtZSA9ICJVbnRpdGxlZCI7CisgICAgfQorICAgIGlmICghc3R5bGUuSXNFbXB0eSgpICYmIHN0eWxlICE9ICJSZWd1bGFyIikgeworICAgICAgZmFjZW5hbWUgKz0gIiAiICsgc3R5bGU7CisgICAgfQorICAgIHJldHVybiBmYWNlbmFtZTsKKyAgfQorICByZXR1cm4gbV9wU3Vic3RGb250LT5tX0ZhbWlseTsKK30KK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OkdldEJCb3goRlhfUkVDVCYgYmJveCkgeworICBpZiAobV9GYWNlID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IGVtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7CisgIGlmIChlbSA9PSAwKSB7CisgICAgYmJveC5sZWZ0ID0gRlhGVF9HZXRfRmFjZV94TWluKG1fRmFjZSk7CisgICAgYmJveC5ib3R0b20gPSBGWEZUX0dldF9GYWNlX3lNYXgobV9GYWNlKTsKKyAgICBiYm94LnRvcCA9IEZYRlRfR2V0X0ZhY2VfeU1pbihtX0ZhY2UpOworICAgIGJib3gucmlnaHQgPSBGWEZUX0dldF9GYWNlX3hNYXgobV9GYWNlKTsKKyAgfSBlbHNlIHsKKyAgICBiYm94LmxlZnQgPSBGWEZUX0dldF9GYWNlX3hNaW4obV9GYWNlKSAqIDEwMDAgLyBlbTsKKyAgICBiYm94LnRvcCA9IEZYRlRfR2V0X0ZhY2VfeU1pbihtX0ZhY2UpICogMTAwMCAvIGVtOworICAgIGJib3gucmlnaHQgPSBGWEZUX0dldF9GYWNlX3hNYXgobV9GYWNlKSAqIDEwMDAgLyBlbTsKKyAgICBiYm94LmJvdHRvbSA9IEZYRlRfR2V0X0ZhY2VfeU1heChtX0ZhY2UpICogMTAwMCAvIGVtOworICB9CisgIHJldHVybiBUUlVFOworfQoraW50IENGWF9Gb250OjpHZXRIZWlnaHQoKSB7CisgIGlmIChtX0ZhY2UgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGludCBoZWlnaHQgPQorICAgICAgRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX0hlaWdodChtX0ZhY2UpKTsKKyAgcmV0dXJuIGhlaWdodDsKK30KK2ludCBDRlhfRm9udDo6R2V0TWF4QWR2YW5jZVdpZHRoKCkgeworICBpZiAobV9GYWNlID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgd2lkdGggPSBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX01heEFkdmFuY2VXaWR0aChtX0ZhY2UpKTsKKyAgcmV0dXJuIHdpZHRoOworfQoraW50IENGWF9Gb250OjpHZXRVTFBvcygpIHsKKyAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IHBvcyA9IEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX1VuZGVyTGluZVBvc2l0aW9uKG1fRmFjZSkpOworICByZXR1cm4gcG9zOworfQoraW50IENGWF9Gb250OjpHZXRVTHRoaWNrbmVzcygpIHsKKyAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IHRoaWNrbmVzcyA9IEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX1VuZGVyTGluZVRoaWNrbmVzcyhtX0ZhY2UpKTsKKyAgcmV0dXJuIHRoaWNrbmVzczsKK30KK0NGWF9Vbmljb2RlRW5jb2Rpbmc6OkNGWF9Vbmljb2RlRW5jb2RpbmcoQ0ZYX0ZvbnQqIHBGb250KSB7CisgIG1fcEZvbnQgPSBwRm9udDsKK30KK0ZYX0RXT1JEIENGWF9Vbmljb2RlRW5jb2Rpbmc6OkdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSB7CisgIEZYRlRfRmFjZSBmYWNlID0gbV9wRm9udC0+R2V0RmFjZSgpOworICBpZiAoIWZhY2UpIHsKKyAgICByZXR1cm4gY2hhcmNvZGU7CisgIH0KKyAgaWYgKEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSA9PSAwKSB7CisgICAgcmV0dXJuIEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOworICB9CisgIGlmIChtX3BGb250LT5tX3BTdWJzdEZvbnQgJiYgbV9wRm9udC0+bV9wU3Vic3RGb250LT5tX0NoYXJzZXQgPT0gMikgeworICAgIEZYX0RXT1JEIGluZGV4ID0gMDsKKyAgICBpZiAoRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBGWEZUX0VOQ09ESU5HX01TX1NZTUJPTCkgPT0gMCkgeworICAgICAgaW5kZXggPSBGWEZUX0dldF9DaGFyX0luZGV4KGZhY2UsIGNoYXJjb2RlKTsKKyAgICB9CisgICAgaWYgKCFpbmRleCAmJiAhRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBGWEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOKSkgeworICAgICAgcmV0dXJuIEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOworICAgIH0KKyAgfQorICByZXR1cm4gY2hhcmNvZGU7Cit9CitGWF9EV09SRCBDRlhfVW5pY29kZUVuY29kaW5nOjpHbHlwaEZyb21DaGFyQ29kZUV4KEZYX0RXT1JEIGNoYXJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5jb2RpbmcpIHsKKyAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5HZXRGYWNlKCk7CisgIGlmICghZmFjZSkgeworICAgIHJldHVybiBjaGFyY29kZTsKKyAgfQorICBpZiAoZW5jb2RpbmcgPT0gRU5DT0RJTkdfVU5JQ09ERSkgeworICAgIHJldHVybiBHbHlwaEZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgIH0KKyAgaW50IG5tYXBzID0gRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQobV9wRm9udC0+bV9GYWNlKTsKKyAgaW50IGkgPSAwOworICB3aGlsZSAoaSA8IG5tYXBzKSB7CisgICAgaW50IGVuY29kaW5nID0gRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW2krK10pOworICAgIGlmIChlbmNvZGluZyAhPSBGWEZUX0VOQ09ESU5HX1VOSUNPREUpIHsKKyAgICAgIEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgZW5jb2RpbmcpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBGWEZUX0dldF9DaGFyX0luZGV4KGZhY2UsIGNoYXJjb2RlKTsKK30KK0lGWF9Gb250RW5jb2RpbmcqIEZYR0VfQ3JlYXRlVW5pY29kZUVuY29kaW5nKENGWF9Gb250KiBwRm9udCkgeworICBDRlhfVW5pY29kZUVuY29kaW5nKiBwRW5jb2RpbmcgPSBOVUxMOworICBwRW5jb2RpbmcgPSBGWF9ORVcgQ0ZYX1VuaWNvZGVFbmNvZGluZyhwRm9udCk7CisgIHJldHVybiBwRW5jb2Rpbmc7Cit9CitDRlhfRm9udEVuY29kaW5nRVg6OkNGWF9Gb250RW5jb2RpbmdFWCgpIHsKKyAgbV9wRm9udCA9IE5VTEw7CisgIG1fbkVuY29kaW5nSUQgPSBGWEZNX0VOQ09ESU5HX05PTkU7Cit9CitGWF9CT09MIENGWF9Gb250RW5jb2RpbmdFWDo6SW5pdChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIEVuY29kaW5nSUQpIHsKKyAgaWYgKCFwRm9udCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BGb250ID0gcEZvbnQ7CisgIG1fbkVuY29kaW5nSUQgPSBFbmNvZGluZ0lEOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0RXT1JEIENGWF9Gb250RW5jb2RpbmdFWDo6R2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIHsKKyAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5tX0ZhY2U7CisgIEZUX1VJbnQgbkluZGV4ID0gRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjaGFyY29kZSk7CisgIGlmIChuSW5kZXggPiAwKSB7CisgICAgcmV0dXJuIG5JbmRleDsKKyAgfQorICBpbnQgbm1hcHMgPSBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsKKyAgaW50IG0gPSAwOworICB3aGlsZSAobSA8IG5tYXBzKSB7CisgICAgaW50IG5FbmNvZGluZ0lEID0KKyAgICAgICAgRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW20rK10pOworICAgIGlmIChtX25FbmNvZGluZ0lEID09IG5FbmNvZGluZ0lEKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IGVycm9yID0gRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBuRW5jb2RpbmdJRCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgbkluZGV4ID0gRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjaGFyY29kZSk7CisgICAgaWYgKG5JbmRleCA+IDApIHsKKyAgICAgIG1fbkVuY29kaW5nSUQgPSBuRW5jb2RpbmdJRDsKKyAgICAgIHJldHVybiBuSW5kZXg7CisgICAgfQorICB9CisgIEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgbV9uRW5jb2RpbmdJRCk7CisgIHJldHVybiAwOworfQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpVbmljb2RlRnJvbUNoYXJDb2RlKAorICAgIEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCB7CisgIGlmIChtX25FbmNvZGluZ0lEID09IEZYRk1fRU5DT0RJTkdfVU5JQ09ERSkgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygoRlhfV0NIQVIpY2hhcmNvZGUpOworICB9CisgIHJldHVybiBDRlhfV2lkZVN0cmluZygoRlhfV0NIQVIpMCk7Cit9CitGWF9EV09SRCBDRlhfRm9udEVuY29kaW5nRVg6OkNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3QgeworICBpZiAobV9uRW5jb2RpbmdJRCA9PSBGWEZNX0VOQ09ESU5HX1VOSUNPREUgfHwKKyAgICAgIG1fbkVuY29kaW5nSUQgPT0gRlhGTV9FTkNPRElOR19NU19TWU1CT0wpIHsKKyAgICByZXR1cm4gVW5pY29kZTsKKyAgfQorICBGWEZUX0ZhY2UgZmFjZSA9IG1fcEZvbnQtPm1fRmFjZTsKKyAgaW50IG5tYXBzID0gRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbm1hcHM7IGkrKykgeworICAgIGludCBuRW5jb2RpbmdJRCA9CisgICAgICAgIEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVtpXSk7CisgICAgaWYgKG5FbmNvZGluZ0lEID09IEZYRk1fRU5DT0RJTkdfVU5JQ09ERSB8fAorICAgICAgICBuRW5jb2RpbmdJRCA9PSBGWEZNX0VOQ09ESU5HX01TX1NZTUJPTCkgeworICAgICAgcmV0dXJuIFVuaWNvZGU7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KK0ZYX0JPT0wgQ0ZYX0ZvbnRFbmNvZGluZ0VYOjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QgeworICByZXR1cm4gbV9uRW5jb2RpbmdJRCA9PSBGWEZNX0VOQ09ESU5HX1VOSUNPREU7Cit9CitGWF9EV09SRCBDRlhfRm9udEVuY29kaW5nRVg6OkdseXBoSW5kZXhGcm9tTmFtZShjb25zdCBGWF9DSEFSKiBwU3RyTmFtZSkgeworICBGWEZUX0ZhY2UgZmFjZSA9IG1fcEZvbnQtPm1fRmFjZTsKKyAgcmV0dXJuIEZUX0dldF9OYW1lX0luZGV4KGZhY2UsIChGVF9TdHJpbmcqKXBTdHJOYW1lKTsKK30KK0NGWF9CeXRlU3RyaW5nIENGWF9Gb250RW5jb2RpbmdFWDo6TmFtZUZyb21HbHlwaEluZGV4KEZYX0RXT1JEIGR3R2x5cGhJbmRleCkgeworICBGWEZUX0ZhY2UgZmFjZSA9IG1fcEZvbnQtPm1fRmFjZTsKKyAgQ0ZYX0J5dGVTdHJpbmcgZ2x5cGhOYW1lKCIgICAgICAgICAgICAgICAgIik7CisgIGlmIChGVF9IQVNfR0xZUEhfTkFNRVMoKChGVF9GYWNlKWZhY2UpKSkgeworICAgIGlmIChGVF9HZXRfR2x5cGhfTmFtZSgoRlRfRmFjZSlmYWNlLCBkd0dseXBoSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Qb2ludGVyKShjb25zdCBGWF9DSEFSKilnbHlwaE5hbWUsIDE2KSkgeworICAgICAgZ2x5cGhOYW1lLkVtcHR5KCk7CisgICAgICByZXR1cm4gZ2x5cGhOYW1lOworICAgIH0KKyAgICByZXR1cm4gZ2x5cGhOYW1lOworICB9IGVsc2UgeworICAgIHJldHVybiBnbHlwaE5hbWU7CisgIH0KK30KK0ZYX0RXT1JEIENGWF9Gb250RW5jb2RpbmdFWDo6Q2hhckNvZGVGcm9tR2x5cGhJbmRleChGWF9EV09SRCBkd0dseXBoSW5kZXgpIHsKKyAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5HZXRGYWNlKCk7CisgIEZYX0RXT1JEIGNoYXJjb2RlOworICBGVF9VSW50IGdpZDsKKyAgY2hhcmNvZGUgPSBGVF9HZXRfRmlyc3RfQ2hhcigoRlRfRmFjZSlmYWNlLCAmZ2lkKTsKKyAgd2hpbGUgKGdpZCAhPSAwKSB7CisgICAgaWYgKGR3R2x5cGhJbmRleCA9PSBnaWQpIHsKKyAgICAgIHJldHVybiBjaGFyY29kZTsKKyAgICB9CisgICAgY2hhcmNvZGUgPSBGVF9HZXRfTmV4dF9DaGFyKChGVF9GYWNlKWZhY2UsIGNoYXJjb2RlLCAmZ2lkKTsKKyAgfQorICBpbnQgbm1hcHMgPSBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsKKyAgaW50IG0gPSAwOworICB3aGlsZSAobSA8IG5tYXBzKSB7CisgICAgaW50IG5FbmNvZGluZ0lEID0KKyAgICAgICAgRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW20rK10pOworICAgIGlmIChtX25FbmNvZGluZ0lEID09IG5FbmNvZGluZ0lEKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IGVycm9yID0gRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBuRW5jb2RpbmdJRCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CiAgICAgY2hhcmNvZGUgPSBGVF9HZXRfRmlyc3RfQ2hhcigoRlRfRmFjZSlmYWNlLCAmZ2lkKTsKICAgICB3aGlsZSAoZ2lkICE9IDApIHsKLSAgICAgICAgaWYgKGR3R2x5cGhJbmRleCA9PSBnaWQpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGFyY29kZTsKLSAgICAgICAgfQotICAgICAgICBjaGFyY29kZSA9IEZUX0dldF9OZXh0X0NoYXIoKEZUX0ZhY2UpZmFjZSwgY2hhcmNvZGUsICZnaWQpOworICAgICAgaWYgKGR3R2x5cGhJbmRleCA9PSBnaWQpIHsKKyAgICAgICAgbV9uRW5jb2RpbmdJRCA9IG5FbmNvZGluZ0lEOworICAgICAgICByZXR1cm4gY2hhcmNvZGU7CisgICAgICB9CisgICAgICBjaGFyY29kZSA9IEZUX0dldF9OZXh0X0NoYXIoKEZUX0ZhY2UpZmFjZSwgY2hhcmNvZGUsICZnaWQpOwogICAgIH0KLSAgICBpbnQgbm1hcHMgPSBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsKLSAgICBpbnQgbSA9IDA7Ci0gICAgd2hpbGUgKG0gPCBubWFwcykgewotICAgICAgICBpbnQgbkVuY29kaW5nSUQgPSBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbbSsrXSk7Ci0gICAgICAgIGlmIChtX25FbmNvZGluZ0lEID09IG5FbmNvZGluZ0lEKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZXJyb3IgPSBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIG5FbmNvZGluZ0lEKTsKLSAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjaGFyY29kZSA9IEZUX0dldF9GaXJzdF9DaGFyKChGVF9GYWNlKWZhY2UsICZnaWQpOwotICAgICAgICB3aGlsZSAoZ2lkICE9IDApIHsKLSAgICAgICAgICAgIGlmIChkd0dseXBoSW5kZXggPT0gZ2lkKSB7Ci0gICAgICAgICAgICAgICAgbV9uRW5jb2RpbmdJRCA9IG5FbmNvZGluZ0lEOwotICAgICAgICAgICAgICAgIHJldHVybiBjaGFyY29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoYXJjb2RlID0gRlRfR2V0X05leHRfQ2hhcigoRlRfRmFjZSlmYWNlLCBjaGFyY29kZSwgJmdpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChGWF9EV09SRCkgLSAxOworICB9CisgIHJldHVybiAoRlhfRFdPUkQpLTE7CiB9CiBzdGF0aWMgY29uc3QgRlhfRFdPUkQgZ3NfRW5jb2RpbmdJRFtdID0gewotICAgIEZYRk1fRU5DT0RJTkdfTVNfU1lNQk9MLAotICAgIEZYRk1fRU5DT0RJTkdfVU5JQ09ERSwKLSAgICBGWEZNX0VOQ09ESU5HX01TX1NKSVMsCi0gICAgRlhGTV9FTkNPRElOR19NU19HQjIzMTIsCi0gICAgRlhGTV9FTkNPRElOR19NU19CSUc1LAotICAgIEZYRk1fRU5DT0RJTkdfTVNfV0FOU1VORywKLSAgICBGWEZNX0VOQ09ESU5HX01TX0pPSEFCLAotICAgIEZYRk1fRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQsCi0gICAgRlhGTV9FTkNPRElOR19BRE9CRV9FWFBFUlQsCi0gICAgRlhGTV9FTkNPRElOR19BRE9CRV9DVVNUT00sCi0gICAgRlhGTV9FTkNPRElOR19BRE9CRV9MQVRJTl8xLAotICAgIEZYRk1fRU5DT0RJTkdfT0xEX0xBVElOXzIsCi0gICAgRlhGTV9FTkNPRElOR19BUFBMRV9ST01BTgotfTsKLXN0YXRpYyBJRlhfRm9udEVuY29kaW5nRXgqIF9GWEZNX0NyZWF0ZUZvbnRFbmNvZGluZyhDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIG5FbmNvZGluZ0lEKQotewotICAgIGludCBlcnJvciA9IEZYRlRfU2VsZWN0X0NoYXJtYXAocEZvbnQtPm1fRmFjZSwgbkVuY29kaW5nSUQpOwotICAgIGlmIChlcnJvcikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0ZvbnRFbmNvZGluZ0VYKiBwRm9udEVuY29kaW5nID0gRlhfTkVXIENGWF9Gb250RW5jb2RpbmdFWDsKLSAgICBpZiAocEZvbnRFbmNvZGluZyAmJiAhcEZvbnRFbmNvZGluZy0+SW5pdChwRm9udCwgbkVuY29kaW5nSUQpKSB7Ci0gICAgICAgIGRlbGV0ZSBwRm9udEVuY29kaW5nOwotICAgICAgICBwRm9udEVuY29kaW5nID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHBGb250RW5jb2Rpbmc7Ci19Ci1JRlhfRm9udEVuY29kaW5nRXgqIEZYX0NyZWF0ZUZvbnRFbmNvZGluZ0V4KENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgbkVuY29kaW5nSUQpCi17Ci0gICAgaWYgKCFwRm9udCB8fCAhcEZvbnQtPm1fRmFjZSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG5FbmNvZGluZ0lEICE9IEZYRk1fRU5DT0RJTkdfTk9ORSkgewotICAgICAgICByZXR1cm4gX0ZYRk1fQ3JlYXRlRm9udEVuY29kaW5nKHBGb250LCBuRW5jb2RpbmdJRCk7Ci0gICAgfQotICAgIHN0YXRpYyBpbnQgc19jb3VudCA9IHNpemVvZihnc19FbmNvZGluZ0lEKSAvIHNpemVvZihGWF9EV09SRCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzX2NvdW50OyBpKyspIHsKLSAgICAgICAgSUZYX0ZvbnRFbmNvZGluZ0V4KiBwRm9udEVuY29kaW5nID0gX0ZYRk1fQ3JlYXRlRm9udEVuY29kaW5nKHBGb250LCBnc19FbmNvZGluZ0lEW2ldKTsKLSAgICAgICAgaWYgKHBGb250RW5jb2RpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBwRm9udEVuY29kaW5nOwotICAgICAgICB9Ci0gICAgfQorICAgIEZYRk1fRU5DT0RJTkdfTVNfU1lNQk9MLCAgICAgRlhGTV9FTkNPRElOR19VTklDT0RFLAorICAgIEZYRk1fRU5DT0RJTkdfTVNfU0pJUywgICAgICAgRlhGTV9FTkNPRElOR19NU19HQjIzMTIsCisgICAgRlhGTV9FTkNPRElOR19NU19CSUc1LCAgICAgICBGWEZNX0VOQ09ESU5HX01TX1dBTlNVTkcsCisgICAgRlhGTV9FTkNPRElOR19NU19KT0hBQiwgICAgICBGWEZNX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJELAorICAgIEZYRk1fRU5DT0RJTkdfQURPQkVfRVhQRVJULCAgRlhGTV9FTkNPRElOR19BRE9CRV9DVVNUT00sCisgICAgRlhGTV9FTkNPRElOR19BRE9CRV9MQVRJTl8xLCBGWEZNX0VOQ09ESU5HX09MRF9MQVRJTl8yLAorICAgIEZYRk1fRU5DT0RJTkdfQVBQTEVfUk9NQU59Oworc3RhdGljIElGWF9Gb250RW5jb2RpbmdFeCogX0ZYRk1fQ3JlYXRlRm9udEVuY29kaW5nKENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRW5jb2RpbmdJRCkgeworICBpbnQgZXJyb3IgPSBGWEZUX1NlbGVjdF9DaGFybWFwKHBGb250LT5tX0ZhY2UsIG5FbmNvZGluZ0lEKTsKKyAgaWYgKGVycm9yKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZYX0ZvbnRFbmNvZGluZ0VYKiBwRm9udEVuY29kaW5nID0gRlhfTkVXIENGWF9Gb250RW5jb2RpbmdFWDsKKyAgaWYgKHBGb250RW5jb2RpbmcgJiYgIXBGb250RW5jb2RpbmctPkluaXQocEZvbnQsIG5FbmNvZGluZ0lEKSkgeworICAgIGRlbGV0ZSBwRm9udEVuY29kaW5nOworICAgIHBGb250RW5jb2RpbmcgPSBOVUxMOworICB9CisgIHJldHVybiBwRm9udEVuY29kaW5nOworfQorSUZYX0ZvbnRFbmNvZGluZ0V4KiBGWF9DcmVhdGVGb250RW5jb2RpbmdFeChDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5FbmNvZGluZ0lEKSB7CisgIGlmICghcEZvbnQgfHwgIXBGb250LT5tX0ZhY2UpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAobkVuY29kaW5nSUQgIT0gRlhGTV9FTkNPRElOR19OT05FKSB7CisgICAgcmV0dXJuIF9GWEZNX0NyZWF0ZUZvbnRFbmNvZGluZyhwRm9udCwgbkVuY29kaW5nSUQpOworICB9CisgIHN0YXRpYyBpbnQgc19jb3VudCA9IHNpemVvZihnc19FbmNvZGluZ0lEKSAvIHNpemVvZihGWF9EV09SRCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc19jb3VudDsgaSsrKSB7CisgICAgSUZYX0ZvbnRFbmNvZGluZ0V4KiBwRm9udEVuY29kaW5nID0KKyAgICAgICAgX0ZYRk1fQ3JlYXRlRm9udEVuY29kaW5nKHBGb250LCBnc19FbmNvZGluZ0lEW2ldKTsKKyAgICBpZiAocEZvbnRFbmNvZGluZykgeworICAgICAgcmV0dXJuIHBGb250RW5jb2Rpbmc7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udG1hcC5jcHAKaW5kZXggODk5ODgxOC4uYjNmNmI3ZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnRtYXAuY3BwCkBAIC05LDE1MCArOSwxNTMgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKICNpbmNsdWRlICJ0ZXh0X2ludC5oIgotI2RlZmluZSBHRVRfVFRfU0hPUlQodykgIChGWF9XT1JEKSgoKHcpWzBdIDw8IDgpIHwgKHcpWzFdKQotI2RlZmluZSBHRVRfVFRfTE9ORyh3KSAoRlhfRFdPUkQpKCgodylbMF0gPDwgMjQpIHwgKCh3KVsxXSA8PCAxNikgfCAoKHcpWzJdIDw8IDgpIHwgKHcpWzNdKQotQ0ZYX1N1YnN0Rm9udDo6Q0ZYX1N1YnN0Rm9udCgpCi17Ci0gICAgbV9FeHRIYW5kbGUgPSBOVUxMOwotICAgIG1fQ2hhcnNldCA9IDA7Ci0gICAgbV9TdWJzdEZsYWdzID0gMDsKLSAgICBtX1dlaWdodCA9IDA7Ci0gICAgbV9JdGFsaWNBbmdsZSA9IDA7Ci0gICAgbV9iU3Vic3RPZkNKSyA9IEZBTFNFOwotICAgIG1fV2VpZ2h0Q0pLID0gMDsKLSAgICBtX2JJdGxpY0NKSyA9IEZBTFNFOworI2RlZmluZSBHRVRfVFRfU0hPUlQodykgKEZYX1dPUkQpKCgodylbMF0gPDwgOCkgfCAodylbMV0pCisjZGVmaW5lIEdFVF9UVF9MT05HKHcpIFwKKyAgKEZYX0RXT1JEKSgoKHcpWzBdIDw8IDI0KSB8ICgodylbMV0gPDwgMTYpIHwgKCh3KVsyXSA8PCA4KSB8ICh3KVszXSkKK0NGWF9TdWJzdEZvbnQ6OkNGWF9TdWJzdEZvbnQoKSB7CisgIG1fRXh0SGFuZGxlID0gTlVMTDsKKyAgbV9DaGFyc2V0ID0gMDsKKyAgbV9TdWJzdEZsYWdzID0gMDsKKyAgbV9XZWlnaHQgPSAwOworICBtX0l0YWxpY0FuZ2xlID0gMDsKKyAgbV9iU3Vic3RPZkNKSyA9IEZBTFNFOworICBtX1dlaWdodENKSyA9IDA7CisgIG1fYkl0bGljQ0pLID0gRkFMU0U7CiB9Ci1DVFRGb250RGVzYzo6fkNUVEZvbnREZXNjKCkKLXsKLSAgICBpZiAobV9UeXBlID09IDEpIHsKLSAgICAgICAgaWYgKG1fU2luZ2xlRmFjZS5tX3BGYWNlKSB7Ci0gICAgICAgICAgICBGWEZUX0RvbmVfRmFjZShtX1NpbmdsZUZhY2UubV9wRmFjZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fVHlwZSA9PSAyKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkgKyspCi0gICAgICAgICAgICBpZiAobV9UVENGYWNlLm1fcEZhY2VzW2ldKSB7Ci0gICAgICAgICAgICAgICAgRlhGVF9Eb25lX0ZhY2UobV9UVENGYWNlLm1fcEZhY2VzW2ldKTsKLSAgICAgICAgICAgIH0KK0NUVEZvbnREZXNjOjp+Q1RURm9udERlc2MoKSB7CisgIGlmIChtX1R5cGUgPT0gMSkgeworICAgIGlmIChtX1NpbmdsZUZhY2UubV9wRmFjZSkgeworICAgICAgRlhGVF9Eb25lX0ZhY2UobV9TaW5nbGVGYWNlLm1fcEZhY2UpOwogICAgIH0KLSAgICBpZiAobV9wRm9udERhdGEpIHsKLSAgICAgICAgRlhfRnJlZShtX3BGb250RGF0YSk7Ci0gICAgfQorICB9IGVsc2UgaWYgKG1fVHlwZSA9PSAyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgaWYgKG1fVFRDRmFjZS5tX3BGYWNlc1tpXSkgeworICAgICAgICBGWEZUX0RvbmVfRmFjZShtX1RUQ0ZhY2UubV9wRmFjZXNbaV0pOworICAgICAgfQorICB9CisgIGlmIChtX3BGb250RGF0YSkgeworICAgIEZYX0ZyZWUobV9wRm9udERhdGEpOworICB9CiB9Ci1pbnQzMl90IENUVEZvbnREZXNjOjpSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSkKLXsKLSAgICBpZiAobV9UeXBlID09IDEpIHsKLSAgICAgICAgaWYgKG1fU2luZ2xlRmFjZS5tX3BGYWNlICE9IGZhY2UpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9UeXBlID09IDIpIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArKykKLSAgICAgICAgICAgIGlmIChtX1RUQ0ZhY2UubV9wRmFjZXNbaV0gPT0gZmFjZSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSAxNikgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CitpbnQzMl90IENUVEZvbnREZXNjOjpSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSkgeworICBpZiAobV9UeXBlID09IDEpIHsKKyAgICBpZiAobV9TaW5nbGVGYWNlLm1fcEZhY2UgIT0gZmFjZSkgeworICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBtX1JlZkNvdW50IC0tOwotICAgIGlmIChtX1JlZkNvdW50KSB7Ci0gICAgICAgIHJldHVybiBtX1JlZkNvdW50OworICB9IGVsc2UgaWYgKG1fVHlwZSA9PSAyKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICBpZiAobV9UVENGYWNlLm1fcEZhY2VzW2ldID09IGZhY2UpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgaWYgKGkgPT0gMTYpIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgZGVsZXRlIHRoaXM7Ci0gICAgcmV0dXJuIDA7CisgIH0KKyAgbV9SZWZDb3VudC0tOworICBpZiAobV9SZWZDb3VudCkgeworICAgIHJldHVybiBtX1JlZkNvdW50OworICB9CisgIGRlbGV0ZSB0aGlzOworICByZXR1cm4gMDsKIH0KLUNGWF9Gb250TWdyOjpDRlhfRm9udE1ncigpIDogbV9GVExpYnJhcnkobnVsbHB0cikKLXsKLSAgICBtX3BCdWlsdGluTWFwcGVyID0gbmV3IENGWF9Gb250TWFwcGVyKHRoaXMpOwotICAgIEZYU1lTX21lbXNldChtX0V4dGVybmFsRm9udHMsIDAsIHNpemVvZiBtX0V4dGVybmFsRm9udHMpOworQ0ZYX0ZvbnRNZ3I6OkNGWF9Gb250TWdyKCkgOiBtX0ZUTGlicmFyeShudWxscHRyKSB7CisgIG1fcEJ1aWx0aW5NYXBwZXIgPSBuZXcgQ0ZYX0ZvbnRNYXBwZXIodGhpcyk7CisgIEZYU1lTX21lbXNldChtX0V4dGVybmFsRm9udHMsIDAsIHNpemVvZiBtX0V4dGVybmFsRm9udHMpOwogfQotQ0ZYX0ZvbnRNZ3I6On5DRlhfRm9udE1ncigpCi17Ci0gICAgZGVsZXRlIG1fcEJ1aWx0aW5NYXBwZXI7Ci0gICAgRnJlZUNhY2hlKCk7Ci0gICAgaWYgKG1fRlRMaWJyYXJ5KSB7Ci0gICAgICAgIEZYRlRfRG9uZV9GcmVlVHlwZShtX0ZUTGlicmFyeSk7Ci0gICAgfQorQ0ZYX0ZvbnRNZ3I6On5DRlhfRm9udE1ncigpIHsKKyAgZGVsZXRlIG1fcEJ1aWx0aW5NYXBwZXI7CisgIEZyZWVDYWNoZSgpOworICBpZiAobV9GVExpYnJhcnkpIHsKKyAgICBGWEZUX0RvbmVfRnJlZVR5cGUobV9GVExpYnJhcnkpOworICB9CiB9Ci12b2lkIENGWF9Gb250TWdyOjpJbml0RlRMaWJyYXJ5KCkKLXsKLSAgICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgewotICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKLSAgICB9Cit2b2lkIENGWF9Gb250TWdyOjpJbml0RlRMaWJyYXJ5KCkgeworICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgeworICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmbV9GVExpYnJhcnkpOworICB9CiB9Ci12b2lkIENGWF9Gb250TWdyOjpGcmVlQ2FjaGUoKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fRmFjZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUocG9zKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIEtleTsKLSAgICAgICAgQ1RURm9udERlc2MqIGZhY2U7Ci0gICAgICAgIG1fRmFjZU1hcC5HZXROZXh0QXNzb2MocG9zLCBLZXksICh2b2lkKiYpZmFjZSk7Ci0gICAgICAgIGRlbGV0ZSBmYWNlOwotICAgIH0KLSAgICBtX0ZhY2VNYXAuUmVtb3ZlQWxsKCk7Cit2b2lkIENGWF9Gb250TWdyOjpGcmVlQ2FjaGUoKSB7CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fRmFjZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBLZXk7CisgICAgQ1RURm9udERlc2MqIGZhY2U7CisgICAgbV9GYWNlTWFwLkdldE5leHRBc3NvYyhwb3MsIEtleSwgKHZvaWQqJilmYWNlKTsKKyAgICBkZWxldGUgZmFjZTsKKyAgfQorICBtX0ZhY2VNYXAuUmVtb3ZlQWxsKCk7CiB9Ci12b2lkIENGWF9Gb250TWdyOjpTZXRTeXN0ZW1Gb250SW5mbyhJRlhfU3lzdGVtRm9udEluZm8qIHBGb250SW5mbykKLXsKLSAgICBtX3BCdWlsdGluTWFwcGVyLT5TZXRTeXN0ZW1Gb250SW5mbyhwRm9udEluZm8pOwordm9pZCBDRlhfRm9udE1ncjo6U2V0U3lzdGVtRm9udEluZm8oSUZYX1N5c3RlbUZvbnRJbmZvKiBwRm9udEluZm8pIHsKKyAgbV9wQnVpbHRpbk1hcHBlci0+U2V0U3lzdGVtRm9udEluZm8ocEZvbnRJbmZvKTsKIH0KLUZYRlRfRmFjZSBDRlhfRm9udE1ncjo6RmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkKLXsKLSAgICBpZiAoIW1fRlRMaWJyYXJ5KSB7Ci0gICAgICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmbV9GVExpYnJhcnkpOwotICAgIH0KLSAgICByZXR1cm4gbV9wQnVpbHRpbk1hcHBlci0+RmluZFN1YnN0Rm9udChmYWNlX25hbWUsIGJUcnVlVHlwZSwgZmxhZ3MsIHdlaWdodCwgaXRhbGljX2FuZ2xlLCBDaGFyc2V0Q1AsIHBTdWJzdEZvbnQpOworRlhGVF9GYWNlIENGWF9Gb250TWdyOjpGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJ1ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDaGFyc2V0Q1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkgeworICBpZiAoIW1fRlRMaWJyYXJ5KSB7CisgICAgRlhGVF9Jbml0X0ZyZWVUeXBlKCZtX0ZUTGlicmFyeSk7CisgIH0KKyAgcmV0dXJuIG1fcEJ1aWx0aW5NYXBwZXItPkZpbmRTdWJzdEZvbnQoZmFjZV9uYW1lLCBiVHJ1ZVR5cGUsIGZsYWdzLCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0YWxpY19hbmdsZSwgQ2hhcnNldENQLCBwU3Vic3RGb250KTsKIH0KIEZYRlRfRmFjZSBDRlhfRm9udE1ncjo6R2V0Q2FjaGVkRmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgdWludDhfdComIHBGb250RGF0YSkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBrZXkoZmFjZV9uYW1lKTsKLSAgICBrZXkgKz0gJywnOwotICAgIGtleSArPSBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcih3ZWlnaHQpOwotICAgIGtleSArPSBiSXRhbGljID8gJ0knIDogJ04nOwotICAgIENUVEZvbnREZXNjKiBwRm9udERlc2MgPSBOVUxMOwotICAgIG1fRmFjZU1hcC5Mb29rdXAoa2V5LCAodm9pZComKXBGb250RGVzYyk7Ci0gICAgaWYocEZvbnREZXNjKSB7Ci0gICAgICAgIHBGb250RGF0YSA9IHBGb250RGVzYy0+bV9wRm9udERhdGE7Ci0gICAgICAgIHBGb250RGVzYy0+bV9SZWZDb3VudCArKzsKLSAgICAgICAgcmV0dXJuIHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2U7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBwRm9udERhdGEpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcga2V5KGZhY2VfbmFtZSk7CisgIGtleSArPSAnLCc7CisgIGtleSArPSBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcih3ZWlnaHQpOworICBrZXkgKz0gYkl0YWxpYyA/ICdJJyA6ICdOJzsKKyAgQ1RURm9udERlc2MqIHBGb250RGVzYyA9IE5VTEw7CisgIG1fRmFjZU1hcC5Mb29rdXAoa2V5LCAodm9pZComKXBGb250RGVzYyk7CisgIGlmIChwRm9udERlc2MpIHsKKyAgICBwRm9udERhdGEgPSBwRm9udERlc2MtPm1fcEZvbnREYXRhOworICAgIHBGb250RGVzYy0+bV9SZWZDb3VudCsrOworICAgIHJldHVybiBwRm9udERlc2MtPm1fU2luZ2xlRmFjZS5tX3BGYWNlOworICB9CisgIHJldHVybiBOVUxMOwogfQogRlhGVF9GYWNlIENGWF9Gb250TWdyOjpBZGRDYWNoZWRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IGZhY2VfaW5kZXgpCi17Ci0gICAgQ1RURm9udERlc2MqIHBGb250RGVzYyA9IEZYX05FVyBDVFRGb250RGVzYzsKLSAgICBpZiAoIXBGb250RGVzYykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcEZvbnREZXNjLT5tX1R5cGUgPSAxOwotICAgIHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2UgPSBOVUxMOwotICAgIHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fYkJvbGQgPSB3ZWlnaHQ7Ci0gICAgcEZvbnREZXNjLT5tX1NpbmdsZUZhY2UubV9iSXRhbGljID0gYkl0YWxpYzsKLSAgICBwRm9udERlc2MtPm1fcEZvbnREYXRhID0gcERhdGE7Ci0gICAgcEZvbnREZXNjLT5tX1JlZkNvdW50ID0gMTsKLSAgICBGWEZUX0xpYnJhcnkgbGlicmFyeTsKLSAgICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgewotICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKLSAgICB9Ci0gICAgbGlicmFyeSA9IG1fRlRMaWJyYXJ5OwotICAgIGludCByZXQgPSBGWEZUX05ld19NZW1vcnlfRmFjZShsaWJyYXJ5LCBwRGF0YSwgc2l6ZSwgZmFjZV9pbmRleCwgJnBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2UpOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgZGVsZXRlIHBGb250RGVzYzsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldCA9IEZYRlRfU2V0X1BpeGVsX1NpemVzKHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2UsIDY0LCA2NCk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICBkZWxldGUgcEZvbnREZXNjOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcga2V5KGZhY2VfbmFtZSk7Ci0gICAga2V5ICs9ICcsJzsKLSAgICBrZXkgKz0gQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIod2VpZ2h0KTsKLSAgICBrZXkgKz0gYkl0YWxpYyA/ICdJJyA6ICdOJzsKLSAgICBtX0ZhY2VNYXAuU2V0QXQoa2V5LCBwRm9udERlc2MpOwotICAgIHJldHVybiBwRm9udERlc2MtPm1fU2luZ2xlRmFjZS5tX3BGYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZhY2VfaW5kZXgpIHsKKyAgQ1RURm9udERlc2MqIHBGb250RGVzYyA9IEZYX05FVyBDVFRGb250RGVzYzsKKyAgaWYgKCFwRm9udERlc2MpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwRm9udERlc2MtPm1fVHlwZSA9IDE7CisgIHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2UgPSBOVUxMOworICBwRm9udERlc2MtPm1fU2luZ2xlRmFjZS5tX2JCb2xkID0gd2VpZ2h0OworICBwRm9udERlc2MtPm1fU2luZ2xlRmFjZS5tX2JJdGFsaWMgPSBiSXRhbGljOworICBwRm9udERlc2MtPm1fcEZvbnREYXRhID0gcERhdGE7CisgIHBGb250RGVzYy0+bV9SZWZDb3VudCA9IDE7CisgIEZYRlRfTGlicmFyeSBsaWJyYXJ5OworICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgeworICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmbV9GVExpYnJhcnkpOworICB9CisgIGxpYnJhcnkgPSBtX0ZUTGlicmFyeTsKKyAgaW50IHJldCA9IEZYRlRfTmV3X01lbW9yeV9GYWNlKGxpYnJhcnksIHBEYXRhLCBzaXplLCBmYWNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2UpOworICBpZiAocmV0KSB7CisgICAgZGVsZXRlIHBGb250RGVzYzsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXQgPSBGWEZUX1NldF9QaXhlbF9TaXplcyhwRm9udERlc2MtPm1fU2luZ2xlRmFjZS5tX3BGYWNlLCA2NCwgNjQpOworICBpZiAocmV0KSB7CisgICAgZGVsZXRlIHBGb250RGVzYzsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBrZXkoZmFjZV9uYW1lKTsKKyAga2V5ICs9ICcsJzsKKyAga2V5ICs9IENGWF9CeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKHdlaWdodCk7CisgIGtleSArPSBiSXRhbGljID8gJ0knIDogJ04nOworICBtX0ZhY2VNYXAuU2V0QXQoa2V5LCBwRm9udERlc2MpOworICByZXR1cm4gcEZvbnREZXNjLT5tX1NpbmdsZUZhY2UubV9wRmFjZTsKIH0KIGNvbnN0IEZYX0NIQVIqIGNvbnN0IGdfQmFzZTE0Rm9udE5hbWVzWzE0XSA9IHsKICAgICAiQ291cmllciIsCkBAIC0xNzEsMTAgKzE3NCw5IEBACiAgICAgIlphcGZEaW5nYmF0cyIsCiB9OwogY29uc3Qgc3RydWN0IF9BbHRGb250TmFtZSB7Ci0gICAgY29uc3QgRlhfQ0hBUioJbV9wTmFtZTsKLSAgICBpbnQJCW1fSW5kZXg7Ci19Ci1nX0FsdEZvbnROYW1lc1tdID0geworICBjb25zdCBGWF9DSEFSKiBtX3BOYW1lOworICBpbnQgbV9JbmRleDsKK30gZ19BbHRGb250TmFtZXNbXSA9IHsKICAgICB7IkFyaWFsIiwgNH0sCiAgICAgeyJBcmlhbCxCb2xkIiwgNX0sCiAgICAgeyJBcmlhbCxCb2xkSXRhbGljIiwgNn0sCkBAIC0yNjYsMTU1ICsyNjgsMTYwIEBACiAgICAgeyJaYXBmRGluZ2JhdHMiLCAxM30sCiB9OwogZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIGludCBjb21wYXJlU3RyaW5nKGNvbnN0IHZvaWQqIGtleSwgY29uc3Qgdm9pZCogZWxlbWVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGWFNZU19zdHJpY21wKChjb25zdCBGWF9DSEFSKilrZXksICgoX0FsdEZvbnROYW1lKillbGVtZW50KS0+bV9wTmFtZSk7Ci0gICAgfQorc3RhdGljIGludCBjb21wYXJlU3RyaW5nKGNvbnN0IHZvaWQqIGtleSwgY29uc3Qgdm9pZCogZWxlbWVudCkgeworICByZXR1cm4gRlhTWVNfc3RyaWNtcCgoY29uc3QgRlhfQ0hBUiopa2V5LCAoKF9BbHRGb250TmFtZSopZWxlbWVudCktPm1fcE5hbWUpOwogfQotaW50IF9QREZfR2V0U3RhbmRhcmRGb250TmFtZShDRlhfQnl0ZVN0cmluZyYgbmFtZSkKLXsKLSAgICBfQWx0Rm9udE5hbWUqIGZvdW5kID0gKF9BbHRGb250TmFtZSopRlhTWVNfYnNlYXJjaChuYW1lLmNfc3RyKCksIGdfQWx0Rm9udE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgZ19BbHRGb250TmFtZXMgLyBzaXplb2YgKF9BbHRGb250TmFtZSksIHNpemVvZiAoX0FsdEZvbnROYW1lKSwgY29tcGFyZVN0cmluZyk7Ci0gICAgaWYgKGZvdW5kID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBuYW1lID0gZ19CYXNlMTRGb250TmFtZXNbZm91bmQtPm1fSW5kZXhdOwotICAgIHJldHVybiBmb3VuZC0+bV9JbmRleDsKIH0KLWludCBHZXRUVENJbmRleChjb25zdCB1aW50OF90KiBwRm9udERhdGEsIEZYX0RXT1JEIHR0Y19zaXplLCBGWF9EV09SRCBmb250X29mZnNldCkKLXsKLSAgICBpbnQgZmFjZV9pbmRleCA9IDA7Ci0gICAgY29uc3QgdWludDhfdCogcCA9IHBGb250RGF0YSArIDg7Ci0gICAgRlhfRFdPUkQgbmZvbnQgPSBHRVRfVFRfTE9ORyhwKTsKLSAgICBGWF9EV09SRCBpbmRleDsKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuZm9udDsgaW5kZXggKyspIHsKLSAgICAgICAgcCA9IHBGb250RGF0YSArIDEyICsgaW5kZXggKiA0OwotICAgICAgICBpZiAoR0VUX1RUX0xPTkcocCkgPT0gZm9udF9vZmZzZXQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKGluZGV4ID49IG5mb250KSB7Ci0gICAgICAgIGZhY2VfaW5kZXggPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZhY2VfaW5kZXggPSBpbmRleDsKLSAgICB9Ci0gICAgcmV0dXJuIGZhY2VfaW5kZXg7CitpbnQgX1BERl9HZXRTdGFuZGFyZEZvbnROYW1lKENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7CisgIF9BbHRGb250TmFtZSogZm91bmQgPQorICAgICAgKF9BbHRGb250TmFtZSopRlhTWVNfYnNlYXJjaChuYW1lLmNfc3RyKCksIGdfQWx0Rm9udE5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgZ19BbHRGb250TmFtZXMgLyBzaXplb2YoX0FsdEZvbnROYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKF9BbHRGb250TmFtZSksIGNvbXBhcmVTdHJpbmcpOworICBpZiAoZm91bmQgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBuYW1lID0gZ19CYXNlMTRGb250TmFtZXNbZm91bmQtPm1fSW5kZXhdOworICByZXR1cm4gZm91bmQtPm1fSW5kZXg7CiB9Ci1GWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkdldENhY2hlZFRUQ0ZhY2UoaW50IHR0Y19zaXplLCBGWF9EV09SRCBjaGVja3N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9udF9vZmZzZXQsIHVpbnQ4X3QqJiBwRm9udERhdGEpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcga2V5OwotICAgIGtleS5Gb3JtYXQoIiVkOiVkIiwgdHRjX3NpemUsIGNoZWNrc3VtKTsKLSAgICBDVFRGb250RGVzYyogcEZvbnREZXNjID0gTlVMTDsKLSAgICBtX0ZhY2VNYXAuTG9va3VwKGtleSwgKHZvaWQqJilwRm9udERlc2MpOwotICAgIGlmIChwRm9udERlc2MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKK2ludCBHZXRUVENJbmRleChjb25zdCB1aW50OF90KiBwRm9udERhdGEsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgdHRjX3NpemUsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZm9udF9vZmZzZXQpIHsKKyAgaW50IGZhY2VfaW5kZXggPSAwOworICBjb25zdCB1aW50OF90KiBwID0gcEZvbnREYXRhICsgODsKKyAgRlhfRFdPUkQgbmZvbnQgPSBHRVRfVFRfTE9ORyhwKTsKKyAgRlhfRFdPUkQgaW5kZXg7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5mb250OyBpbmRleCsrKSB7CisgICAgcCA9IHBGb250RGF0YSArIDEyICsgaW5kZXggKiA0OworICAgIGlmIChHRVRfVFRfTE9ORyhwKSA9PSBmb250X29mZnNldCkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIHBGb250RGF0YSA9IHBGb250RGVzYy0+bV9wRm9udERhdGE7Ci0gICAgcEZvbnREZXNjLT5tX1JlZkNvdW50ICsrOwotICAgIGludCBmYWNlX2luZGV4ID0gR2V0VFRDSW5kZXgocEZvbnREZXNjLT5tX3BGb250RGF0YSwgdHRjX3NpemUsIGZvbnRfb2Zmc2V0KTsKLSAgICBpZiAocEZvbnREZXNjLT5tX1RUQ0ZhY2UubV9wRmFjZXNbZmFjZV9pbmRleF0gPT0gTlVMTCkgewotICAgICAgICBwRm9udERlc2MtPm1fVFRDRmFjZS5tX3BGYWNlc1tmYWNlX2luZGV4XSA9IEdldEZpeGVkRmFjZShwRm9udERlc2MtPm1fcEZvbnREYXRhLCB0dGNfc2l6ZSwgZmFjZV9pbmRleCk7Ci0gICAgfQotICAgIHJldHVybiBwRm9udERlc2MtPm1fVFRDRmFjZS5tX3BGYWNlc1tmYWNlX2luZGV4XTsKKyAgfQorICBpZiAoaW5kZXggPj0gbmZvbnQpIHsKKyAgICBmYWNlX2luZGV4ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBmYWNlX2luZGV4ID0gaW5kZXg7CisgIH0KKyAgcmV0dXJuIGZhY2VfaW5kZXg7CiB9Ci1GWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkFkZENhY2hlZFRUQ0ZhY2UoaW50IHR0Y19zaXplLCBGWF9EV09SRCBjaGVja3N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IGZvbnRfb2Zmc2V0KQotewotICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICBrZXkuRm9ybWF0KCIlZDolZCIsIHR0Y19zaXplLCBjaGVja3N1bSk7Ci0gICAgQ1RURm9udERlc2MqIHBGb250RGVzYyA9IEZYX05FVyBDVFRGb250RGVzYzsKLSAgICBpZiAoIXBGb250RGVzYykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcEZvbnREZXNjLT5tX1R5cGUgPSAyOwotICAgIHBGb250RGVzYy0+bV9wRm9udERhdGEgPSBwRGF0YTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpICsrKSB7Ci0gICAgICAgIHBGb250RGVzYy0+bV9UVENGYWNlLm1fcEZhY2VzW2ldID0gTlVMTDsKLSAgICB9Ci0gICAgcEZvbnREZXNjLT5tX1JlZkNvdW50ICsrOwotICAgIGtleS5Gb3JtYXQoIiVkOiVkIiwgdHRjX3NpemUsIGNoZWNrc3VtKTsKLSAgICBtX0ZhY2VNYXAuU2V0QXQoa2V5LCBwRm9udERlc2MpOwotICAgIGludCBmYWNlX2luZGV4ID0gR2V0VFRDSW5kZXgocEZvbnREZXNjLT5tX3BGb250RGF0YSwgdHRjX3NpemUsIGZvbnRfb2Zmc2V0KTsKLSAgICBwRm9udERlc2MtPm1fVFRDRmFjZS5tX3BGYWNlc1tmYWNlX2luZGV4XSA9IEdldEZpeGVkRmFjZShwRm9udERlc2MtPm1fcEZvbnREYXRhLCB0dGNfc2l6ZSwgZmFjZV9pbmRleCk7Ci0gICAgcmV0dXJuIHBGb250RGVzYy0+bV9UVENGYWNlLm1fcEZhY2VzW2ZhY2VfaW5kZXhdOworRlhGVF9GYWNlIENGWF9Gb250TWdyOjpHZXRDYWNoZWRUVENGYWNlKGludCB0dGNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9udF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHBGb250RGF0YSkgeworICBDRlhfQnl0ZVN0cmluZyBrZXk7CisgIGtleS5Gb3JtYXQoIiVkOiVkIiwgdHRjX3NpemUsIGNoZWNrc3VtKTsKKyAgQ1RURm9udERlc2MqIHBGb250RGVzYyA9IE5VTEw7CisgIG1fRmFjZU1hcC5Mb29rdXAoa2V5LCAodm9pZComKXBGb250RGVzYyk7CisgIGlmIChwRm9udERlc2MgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHBGb250RGF0YSA9IHBGb250RGVzYy0+bV9wRm9udERhdGE7CisgIHBGb250RGVzYy0+bV9SZWZDb3VudCsrOworICBpbnQgZmFjZV9pbmRleCA9IEdldFRUQ0luZGV4KHBGb250RGVzYy0+bV9wRm9udERhdGEsIHR0Y19zaXplLCBmb250X29mZnNldCk7CisgIGlmIChwRm9udERlc2MtPm1fVFRDRmFjZS5tX3BGYWNlc1tmYWNlX2luZGV4XSA9PSBOVUxMKSB7CisgICAgcEZvbnREZXNjLT5tX1RUQ0ZhY2UubV9wRmFjZXNbZmFjZV9pbmRleF0gPQorICAgICAgICBHZXRGaXhlZEZhY2UocEZvbnREZXNjLT5tX3BGb250RGF0YSwgdHRjX3NpemUsIGZhY2VfaW5kZXgpOworICB9CisgIHJldHVybiBwRm9udERlc2MtPm1fVFRDRmFjZS5tX3BGYWNlc1tmYWNlX2luZGV4XTsKIH0KLUZYRlRfRmFjZSBDRlhfRm9udE1ncjo6R2V0Rml4ZWRGYWNlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZmFjZV9pbmRleCkKLXsKLSAgICBGWEZUX0xpYnJhcnkgbGlicmFyeTsKLSAgICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgewotICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKLSAgICB9Ci0gICAgbGlicmFyeSA9IG1fRlRMaWJyYXJ5OwotICAgIEZYRlRfRmFjZSBmYWNlID0gTlVMTDsKLSAgICBpbnQgcmV0ID0gRlhGVF9OZXdfTWVtb3J5X0ZhY2UobGlicmFyeSwgcERhdGEsIHNpemUsIGZhY2VfaW5kZXgsICZmYWNlKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXQgPSBGWEZUX1NldF9QaXhlbF9TaXplcyhmYWNlLCA2NCwgNjQpOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBmYWNlOworRlhGVF9GYWNlIENGWF9Gb250TWdyOjpBZGRDYWNoZWRUVENGYWNlKGludCB0dGNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250X29mZnNldCkgeworICBDRlhfQnl0ZVN0cmluZyBrZXk7CisgIGtleS5Gb3JtYXQoIiVkOiVkIiwgdHRjX3NpemUsIGNoZWNrc3VtKTsKKyAgQ1RURm9udERlc2MqIHBGb250RGVzYyA9IEZYX05FVyBDVFRGb250RGVzYzsKKyAgaWYgKCFwRm9udERlc2MpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwRm9udERlc2MtPm1fVHlwZSA9IDI7CisgIHBGb250RGVzYy0+bV9wRm9udERhdGEgPSBwRGF0YTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgcEZvbnREZXNjLT5tX1RUQ0ZhY2UubV9wRmFjZXNbaV0gPSBOVUxMOworICB9CisgIHBGb250RGVzYy0+bV9SZWZDb3VudCsrOworICBrZXkuRm9ybWF0KCIlZDolZCIsIHR0Y19zaXplLCBjaGVja3N1bSk7CisgIG1fRmFjZU1hcC5TZXRBdChrZXksIHBGb250RGVzYyk7CisgIGludCBmYWNlX2luZGV4ID0gR2V0VFRDSW5kZXgocEZvbnREZXNjLT5tX3BGb250RGF0YSwgdHRjX3NpemUsIGZvbnRfb2Zmc2V0KTsKKyAgcEZvbnREZXNjLT5tX1RUQ0ZhY2UubV9wRmFjZXNbZmFjZV9pbmRleF0gPQorICAgICAgR2V0Rml4ZWRGYWNlKHBGb250RGVzYy0+bV9wRm9udERhdGEsIHR0Y19zaXplLCBmYWNlX2luZGV4KTsKKyAgcmV0dXJuIHBGb250RGVzYy0+bV9UVENGYWNlLm1fcEZhY2VzW2ZhY2VfaW5kZXhdOwogfQotRlhGVF9GYWNlIENGWF9Gb250TWdyOjpHZXRGaWxlRmFjZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwgaW50IGZhY2VfaW5kZXgpCi17Ci0gICAgRlhGVF9MaWJyYXJ5IGxpYnJhcnk7Ci0gICAgaWYgKG1fRlRMaWJyYXJ5ID09IE5VTEwpIHsKLSAgICAgICAgRlhGVF9Jbml0X0ZyZWVUeXBlKCZtX0ZUTGlicmFyeSk7Ci0gICAgfQotICAgIGxpYnJhcnkgPSBtX0ZUTGlicmFyeTsKLSAgICBGWEZUX0ZhY2UgZmFjZSA9IE5VTEw7Ci0gICAgaW50IHJldCA9IEZYRlRfTmV3X0ZhY2UobGlicmFyeSwgZmlsZW5hbWUsIGZhY2VfaW5kZXgsICZmYWNlKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXQgPSBGWEZUX1NldF9QaXhlbF9TaXplcyhmYWNlLCA2NCwgNjQpOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBmYWNlOworRlhGVF9GYWNlIENGWF9Gb250TWdyOjpHZXRGaXhlZEZhY2UoY29uc3QgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZhY2VfaW5kZXgpIHsKKyAgRlhGVF9MaWJyYXJ5IGxpYnJhcnk7CisgIGlmIChtX0ZUTGlicmFyeSA9PSBOVUxMKSB7CisgICAgRlhGVF9Jbml0X0ZyZWVUeXBlKCZtX0ZUTGlicmFyeSk7CisgIH0KKyAgbGlicmFyeSA9IG1fRlRMaWJyYXJ5OworICBGWEZUX0ZhY2UgZmFjZSA9IE5VTEw7CisgIGludCByZXQgPSBGWEZUX05ld19NZW1vcnlfRmFjZShsaWJyYXJ5LCBwRGF0YSwgc2l6ZSwgZmFjZV9pbmRleCwgJmZhY2UpOworICBpZiAocmV0KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0ID0gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMoZmFjZSwgNjQsIDY0KTsKKyAgaWYgKHJldCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBmYWNlOwogfQotdm9pZCBDRlhfRm9udE1ncjo6UmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpCi17Ci0gICAgaWYgKGZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkdldEZpbGVGYWNlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBpbnQgZmFjZV9pbmRleCkgeworICBGWEZUX0xpYnJhcnkgbGlicmFyeTsKKyAgaWYgKG1fRlRMaWJyYXJ5ID09IE5VTEwpIHsKKyAgICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKKyAgfQorICBsaWJyYXJ5ID0gbV9GVExpYnJhcnk7CisgIEZYRlRfRmFjZSBmYWNlID0gTlVMTDsKKyAgaW50IHJldCA9IEZYRlRfTmV3X0ZhY2UobGlicmFyeSwgZmlsZW5hbWUsIGZhY2VfaW5kZXgsICZmYWNlKTsKKyAgaWYgKHJldCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldCA9IEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDY0LCA2NCk7CisgIGlmIChyZXQpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gZmFjZTsKK30KK3ZvaWQgQ0ZYX0ZvbnRNZ3I6OlJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKSB7CisgIGlmIChmYWNlID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfUE9TSVRJT04gcG9zID0gbV9GYWNlTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgRlhfQk9PTCBiTmVlZEZhY2VEb25lID0gVFJVRTsKKyAgd2hpbGUgKHBvcykgeworICAgIENGWF9CeXRlU3RyaW5nIEtleTsKKyAgICBDVFRGb250RGVzYyogdHRmYWNlOworICAgIG1fRmFjZU1hcC5HZXROZXh0QXNzb2MocG9zLCBLZXksICh2b2lkKiYpdHRmYWNlKTsKKyAgICBpbnQgblJldCA9IHR0ZmFjZS0+UmVsZWFzZUZhY2UoZmFjZSk7CisgICAgaWYgKG5SZXQgPT0gMCkgeworICAgICAgbV9GYWNlTWFwLlJlbW92ZUtleShLZXkpOworICAgICAgYk5lZWRGYWNlRG9uZSA9IEZBTFNFOworICAgIH0gZWxzZSBpZiAoblJldCA+IDApIHsKKyAgICAgIGJOZWVkRmFjZURvbmUgPSBGQUxTRTsKICAgICB9Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9GYWNlTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICBGWF9CT09MIGJOZWVkRmFjZURvbmUgPSBUUlVFOwotICAgIHdoaWxlKHBvcykgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBLZXk7Ci0gICAgICAgIENUVEZvbnREZXNjKiB0dGZhY2U7Ci0gICAgICAgIG1fRmFjZU1hcC5HZXROZXh0QXNzb2MocG9zLCBLZXksICh2b2lkKiYpdHRmYWNlKTsKLSAgICAgICAgaW50IG5SZXQgPSB0dGZhY2UtPlJlbGVhc2VGYWNlKGZhY2UpOwotICAgICAgICBpZiAoblJldCA9PSAwKSB7Ci0gICAgICAgICAgICBtX0ZhY2VNYXAuUmVtb3ZlS2V5KEtleSk7Ci0gICAgICAgICAgICBiTmVlZEZhY2VEb25lID0gRkFMU0U7Ci0gICAgICAgIH0gZWxzZSBpZiAoblJldCA+IDApIHsKLSAgICAgICAgICAgIGJOZWVkRmFjZURvbmUgPSBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYk5lZWRGYWNlRG9uZSAmJiAhbV9wQnVpbHRpbk1hcHBlci0+SXNCdWlsdGluRmFjZShmYWNlKSkgewotICAgICAgICBGWEZUX0RvbmVfRmFjZShmYWNlKTsKLSAgICB9CisgIH0KKyAgaWYgKGJOZWVkRmFjZURvbmUgJiYgIW1fcEJ1aWx0aW5NYXBwZXItPklzQnVpbHRpbkZhY2UoZmFjZSkpIHsKKyAgICBGWEZUX0RvbmVfRmFjZShmYWNlKTsKKyAgfQogfQogZXh0ZXJuICJDIiB7Ci0gICAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdEZpeGVkSXRhbGljRm9udERhdGEgWzE4NzQ2XTsKLSAgICBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0Rml4ZWRGb250RGF0YSBbMTc1OTddOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zSXRhbGljRm9udERhdGEgWzE2MzM5XTsKLSAgICBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2Fuc0ZvbnREYXRhIFsxNTAyNV07Ci0gICAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFNlcmlmSXRhbGljRm9udERhdGEgWzIxMjI3XTsKLSAgICBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZGb250RGF0YSBbMTk0NjldOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRGaXhlZEJvbGRJdGFsaWNGb250RGF0YSBbMTkxNTFdOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRGaXhlZEJvbGRGb250RGF0YSBbMTgwNTVdOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zQm9sZEl0YWxpY0ZvbnREYXRhIFsxNjQxOF07Ci0gICAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFNhbnNCb2xkRm9udERhdGEgWzE2MzQ0XTsKLSAgICBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZCb2xkSXRhbGljRm9udERhdGEgWzIwNzMzXTsKLSAgICBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZCb2xkRm9udERhdGEgWzE5Mzk1XTsKLSAgICBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U3ltYm9sRm9udERhdGFbMTY3MjldOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXREaW5nYmF0c0ZvbnREYXRhWzI5NTEzXTsKLSAgICBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZNTUZvbnREYXRhWzExMzQxN107Ci0gICAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFNhbnNNTUZvbnREYXRhWzY2OTE5XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRGaXhlZEl0YWxpY0ZvbnREYXRhWzE4NzQ2XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRGaXhlZEZvbnREYXRhWzE3NTk3XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zSXRhbGljRm9udERhdGFbMTYzMzldOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFNhbnNGb250RGF0YVsxNTAyNV07CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZJdGFsaWNGb250RGF0YVsyMTIyN107CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZGb250RGF0YVsxOTQ2OV07CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0Rml4ZWRCb2xkSXRhbGljRm9udERhdGFbMTkxNTFdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdEZpeGVkQm9sZEZvbnREYXRhWzE4MDU1XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zQm9sZEl0YWxpY0ZvbnREYXRhWzE2NDE4XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zQm9sZEZvbnREYXRhWzE2MzQ0XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTZXJpZkJvbGRJdGFsaWNGb250RGF0YVsyMDczM107CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZCb2xkRm9udERhdGFbMTkzOTVdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFN5bWJvbEZvbnREYXRhWzE2NzI5XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXREaW5nYmF0c0ZvbnREYXRhWzI5NTEzXTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTZXJpZk1NRm9udERhdGFbMTEzNDE3XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zTU1Gb250RGF0YVs2NjkxOV07CiB9OwogY29uc3QgRm94aXRGb250cyBnX0ZveGl0Rm9udHNbMTRdID0gewogICAgIHtnX0ZveGl0Rml4ZWRGb250RGF0YSwgMTc1OTd9LApAQCAtNDMyLDExODEgKzQzOSwxMTgzIEBACiAgICAge2dfRm94aXRTeW1ib2xGb250RGF0YSwgMTY3Mjl9LAogICAgIHtnX0ZveGl0RGluZ2JhdHNGb250RGF0YSwgMjk1MTN9LAogfTsKLXZvaWQgX0ZQREZBUElfR2V0SW50ZXJuYWxGb250RGF0YShpbnQgaWQsIGNvbnN0IHVpbnQ4X3QqJiBkYXRhLCBGWF9EV09SRCYgc2l6ZSkKLXsKLSAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPkdldFN0YW5kYXJkRm9udChkYXRhLCBzaXplLCBpZCk7Cit2b2lkIF9GUERGQVBJX0dldEludGVybmFsRm9udERhdGEoaW50IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBzaXplKSB7CisgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+R2V0U3RhbmRhcmRGb250KGRhdGEsIHNpemUsIGlkKTsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbnRNZ3I6OkdldFN0YW5kYXJkRm9udChjb25zdCB1aW50OF90KiYgcEZvbnREYXRhLCBGWF9EV09SRCYgc2l6ZSwgaW50IGluZGV4KQotewotICAgIGlmIChpbmRleCA+IDE1IHx8IGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGWF9Gb250TWdyOjpHZXRTdGFuZGFyZEZvbnQoY29uc3QgdWludDhfdComIHBGb250RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgaWYgKGluZGV4ID4gMTUgfHwgaW5kZXggPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHsKKyAgICBpZiAoaW5kZXggPj0gMTQpIHsKKyAgICAgIGlmIChpbmRleCA9PSAxNCkgeworICAgICAgICBwRm9udERhdGEgPSBnX0ZveGl0U2VyaWZNTUZvbnREYXRhOworICAgICAgICBzaXplID0gMTEzNDE3OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcEZvbnREYXRhID0gZ19Gb3hpdFNhbnNNTUZvbnREYXRhOworICAgICAgICBzaXplID0gNjY5MTk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHBGb250RGF0YSA9IGdfRm94aXRGb250c1tpbmRleF0ubV9wRm9udERhdGE7CisgICAgICBzaXplID0gZ19Gb3hpdEZvbnRzW2luZGV4XS5tX2R3U2l6ZTsKICAgICB9Ci0gICAgewotICAgICAgICBpZiAoaW5kZXggPj0gMTQpIHsKLSAgICAgICAgICAgIGlmIChpbmRleCA9PSAxNCkgewotICAgICAgICAgICAgICAgIHBGb250RGF0YSA9IGdfRm94aXRTZXJpZk1NRm9udERhdGE7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IDExMzQxNzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEZvbnREYXRhID0gZ19Gb3hpdFNhbnNNTUZvbnREYXRhOwotICAgICAgICAgICAgICAgIHNpemUgPSA2NjkxOTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBGb250RGF0YSA9IGdfRm94aXRGb250c1tpbmRleF0ubV9wRm9udERhdGE7Ci0gICAgICAgICAgICBzaXplID0gZ19Gb3hpdEZvbnRzW2luZGV4XS5tX2R3U2l6ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIENGWF9Gb250TWFwcGVyOjpDRlhfRm9udE1hcHBlcihDRlhfRm9udE1nciogbWdyKQotICAgICAgICA6IG1fcEZvbnRJbmZvKG51bGxwdHIpLAotICAgICAgICAgIG1fYkxpc3RMb2FkZWQoRkFMU0UpLAotICAgICAgICAgIG1fcEZvbnRFbnVtZXJhdG9yKG51bGxwdHIpLAotICAgICAgICAgIG1fcEZvbnRNZ3IobWdyKQotewotICAgIEZYU1lTX21lbXNldChtX0ZveGl0RmFjZXMsIDAsIHNpemVvZiBtX0ZveGl0RmFjZXMpOwotICAgIG1fTU1GYWNlc1swXSA9IG1fTU1GYWNlc1sxXSA9IE5VTEw7CisgICAgOiBtX3BGb250SW5mbyhudWxscHRyKSwKKyAgICAgIG1fYkxpc3RMb2FkZWQoRkFMU0UpLAorICAgICAgbV9wRm9udEVudW1lcmF0b3IobnVsbHB0ciksCisgICAgICBtX3BGb250TWdyKG1ncikgeworICBGWFNZU19tZW1zZXQobV9Gb3hpdEZhY2VzLCAwLCBzaXplb2YgbV9Gb3hpdEZhY2VzKTsKKyAgbV9NTUZhY2VzWzBdID0gbV9NTUZhY2VzWzFdID0gTlVMTDsKIH0KLUNGWF9Gb250TWFwcGVyOjp+Q0ZYX0ZvbnRNYXBwZXIoKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTQ7IGkgKyspCi0gICAgICAgIGlmIChtX0ZveGl0RmFjZXNbaV0pIHsKLSAgICAgICAgICAgIEZYRlRfRG9uZV9GYWNlKG1fRm94aXRGYWNlc1tpXSk7Ci0gICAgICAgIH0KLSAgICBpZiAobV9NTUZhY2VzWzBdKSB7Ci0gICAgICAgIEZYRlRfRG9uZV9GYWNlKG1fTU1GYWNlc1swXSk7CitDRlhfRm9udE1hcHBlcjo6fkNGWF9Gb250TWFwcGVyKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDE0OyBpKyspCisgICAgaWYgKG1fRm94aXRGYWNlc1tpXSkgeworICAgICAgRlhGVF9Eb25lX0ZhY2UobV9Gb3hpdEZhY2VzW2ldKTsKICAgICB9Ci0gICAgaWYgKG1fTU1GYWNlc1sxXSkgewotICAgICAgICBGWEZUX0RvbmVfRmFjZShtX01NRmFjZXNbMV0pOwotICAgIH0KLSAgICBpZiAobV9wRm9udEluZm8pIHsKLSAgICAgICAgbV9wRm9udEluZm8tPlJlbGVhc2UoKTsKLSAgICB9CisgIGlmIChtX01NRmFjZXNbMF0pIHsKKyAgICBGWEZUX0RvbmVfRmFjZShtX01NRmFjZXNbMF0pOworICB9CisgIGlmIChtX01NRmFjZXNbMV0pIHsKKyAgICBGWEZUX0RvbmVfRmFjZShtX01NRmFjZXNbMV0pOworICB9CisgIGlmIChtX3BGb250SW5mbykgeworICAgIG1fcEZvbnRJbmZvLT5SZWxlYXNlKCk7CisgIH0KIH0KLXZvaWQgQ0ZYX0ZvbnRNYXBwZXI6OlNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbyogcEZvbnRJbmZvKQotewotICAgIGlmIChwRm9udEluZm8gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX3BGb250SW5mbykgewotICAgICAgICBtX3BGb250SW5mby0+UmVsZWFzZSgpOwotICAgIH0KLSAgICBtX3BGb250SW5mbyA9IHBGb250SW5mbzsKK3ZvaWQgQ0ZYX0ZvbnRNYXBwZXI6OlNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbyogcEZvbnRJbmZvKSB7CisgIGlmIChwRm9udEluZm8gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9wRm9udEluZm8pIHsKKyAgICBtX3BGb250SW5mby0+UmVsZWFzZSgpOworICB9CisgIG1fcEZvbnRJbmZvID0gcEZvbnRJbmZvOwogfQotc3RhdGljIENGWF9CeXRlU3RyaW5nIF9UVF9Ob3JtYWxpemVOYW1lKGNvbnN0IEZYX0NIQVIqIGZhbWlseSkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBub3JtKGZhbWlseSwgLTEpOwotICAgIG5vcm0uUmVtb3ZlKCcgJyk7Ci0gICAgbm9ybS5SZW1vdmUoJy0nKTsKLSAgICBub3JtLlJlbW92ZSgnLCcpOwotICAgIGludCBwb3MgPSBub3JtLkZpbmQoJysnKTsKLSAgICBpZiAocG9zID4gMCkgewotICAgICAgICBub3JtID0gbm9ybS5MZWZ0KHBvcyk7Ci0gICAgfQotICAgIG5vcm0uTWFrZUxvd2VyKCk7Ci0gICAgcmV0dXJuIG5vcm07CitzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgX1RUX05vcm1hbGl6ZU5hbWUoY29uc3QgRlhfQ0hBUiogZmFtaWx5KSB7CisgIENGWF9CeXRlU3RyaW5nIG5vcm0oZmFtaWx5LCAtMSk7CisgIG5vcm0uUmVtb3ZlKCcgJyk7CisgIG5vcm0uUmVtb3ZlKCctJyk7CisgIG5vcm0uUmVtb3ZlKCcsJyk7CisgIGludCBwb3MgPSBub3JtLkZpbmQoJysnKTsKKyAgaWYgKHBvcyA+IDApIHsKKyAgICBub3JtID0gbm9ybS5MZWZ0KHBvcyk7CisgIH0KKyAgbm9ybS5NYWtlTG93ZXIoKTsKKyAgcmV0dXJuIG5vcm07CiB9Ci1DRlhfQnl0ZVN0cmluZyBfRlBERl9HZXROYW1lRnJvbVRUKGNvbnN0IHVpbnQ4X3QqIG5hbWVfdGFibGUsIEZYX0RXT1JEIG5hbWVfaWQpCi17Ci0gICAgY29uc3QgdWludDhfdCogcHRyID0gbmFtZV90YWJsZSArIDI7Ci0gICAgaW50IG5hbWVfY291bnQgPSBHRVRfVFRfU0hPUlQocHRyKTsKLSAgICBpbnQgc3RyaW5nX29mZnNldCA9IEdFVF9UVF9TSE9SVChwdHIgKyAyKTsKLSAgICBjb25zdCB1aW50OF90KiBzdHJpbmdfcHRyID0gbmFtZV90YWJsZSArIHN0cmluZ19vZmZzZXQ7Ci0gICAgcHRyICs9IDQ7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lX2NvdW50OyBpICsrKSB7Ci0gICAgICAgIGlmIChHRVRfVFRfU0hPUlQocHRyICsgNikgPT0gbmFtZV9pZCAmJiBHRVRfVFRfU0hPUlQocHRyKSA9PSAxICYmIEdFVF9UVF9TSE9SVChwdHIgKyAyKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKHN0cmluZ19wdHIgKyBHRVRfVFRfU0hPUlQocHRyICsgMTApLCBHRVRfVFRfU0hPUlQocHRyICsgOCkpOwotICAgICAgICB9Ci0gICAgICAgIHB0ciArPSAxMjsKK0NGWF9CeXRlU3RyaW5nIF9GUERGX0dldE5hbWVGcm9tVFQoY29uc3QgdWludDhfdCogbmFtZV90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbmFtZV9pZCkgeworICBjb25zdCB1aW50OF90KiBwdHIgPSBuYW1lX3RhYmxlICsgMjsKKyAgaW50IG5hbWVfY291bnQgPSBHRVRfVFRfU0hPUlQocHRyKTsKKyAgaW50IHN0cmluZ19vZmZzZXQgPSBHRVRfVFRfU0hPUlQocHRyICsgMik7CisgIGNvbnN0IHVpbnQ4X3QqIHN0cmluZ19wdHIgPSBuYW1lX3RhYmxlICsgc3RyaW5nX29mZnNldDsKKyAgcHRyICs9IDQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZV9jb3VudDsgaSsrKSB7CisgICAgaWYgKEdFVF9UVF9TSE9SVChwdHIgKyA2KSA9PSBuYW1lX2lkICYmIEdFVF9UVF9TSE9SVChwdHIpID09IDEgJiYKKyAgICAgICAgR0VUX1RUX1NIT1JUKHB0ciArIDIpID09IDApIHsKKyAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0Moc3RyaW5nX3B0ciArIEdFVF9UVF9TSE9SVChwdHIgKyAxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9UVF9TSE9SVChwdHIgKyA4KSk7CiAgICAgfQorICAgIHB0ciArPSAxMjsKKyAgfQorICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKK30KK3N0YXRpYyBDRlhfQnl0ZVN0cmluZyBfRlBERl9SZWFkU3RyaW5nRnJvbUZpbGUoRlhTWVNfRklMRSogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyOworICBpZiAoIUZYU1lTX2ZyZWFkKGJ1ZmZlci5HZXRCdWZmZXIoc2l6ZSksIHNpemUsIDEsIHBGaWxlKSkgewogICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICB9CisgIGJ1ZmZlci5SZWxlYXNlQnVmZmVyKHNpemUpOworICByZXR1cm4gYnVmZmVyOwogfQotc3RhdGljIENGWF9CeXRlU3RyaW5nIF9GUERGX1JlYWRTdHJpbmdGcm9tRmlsZShGWFNZU19GSUxFKiBwRmlsZSwgRlhfRFdPUkQgc2l6ZSkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBidWZmZXI7Ci0gICAgaWYgKCFGWFNZU19mcmVhZChidWZmZXIuR2V0QnVmZmVyKHNpemUpLCBzaXplLCAxLCBwRmlsZSkpIHsKK0NGWF9CeXRlU3RyaW5nIF9GUERGX0xvYWRUYWJsZUZyb21UVChGWFNZU19GSUxFKiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwVGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5UYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdGFnKSB7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuVGFibGVzOyBpKyspIHsKKyAgICBjb25zdCB1aW50OF90KiBwID0gcFRhYmxlcyArIGkgKiAxNjsKKyAgICBpZiAoR0VUX1RUX0xPTkcocCkgPT0gdGFnKSB7CisgICAgICBGWF9EV09SRCBvZmZzZXQgPSBHRVRfVFRfTE9ORyhwICsgOCk7CisgICAgICBGWF9EV09SRCBzaXplID0gR0VUX1RUX0xPTkcocCArIDEyKTsKKyAgICAgIEZYU1lTX2ZzZWVrKHBGaWxlLCBvZmZzZXQsIEZYU1lTX1NFRUtfU0VUKTsKKyAgICAgIHJldHVybiBfRlBERl9SZWFkU3RyaW5nRnJvbUZpbGUocEZpbGUsIHNpemUpOworICAgIH0KKyAgfQorICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKK30KK0NGWF9CeXRlU3RyaW5nIF9GUERGX0xvYWRUYWJsZUZyb21UVFN0cmVhbUZpbGUoSUZYX0ZpbGVTdHJlYW0qIHBGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwVGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuVGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0YWcpIHsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5UYWJsZXM7IGkrKykgeworICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBwVGFibGVzICsgaSAqIDE2OworICAgIGlmIChHRVRfVFRfTE9ORyhwKSA9PSB0YWcpIHsKKyAgICAgIEZYX0RXT1JEIG9mZnNldCA9IEdFVF9UVF9MT05HKHAgKyA4KTsKKyAgICAgIEZYX0RXT1JEIHNpemUgPSBHRVRfVFRfTE9ORyhwICsgMTIpOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyOworICAgICAgaWYgKCFwRmlsZS0+UmVhZEJsb2NrKGJ1ZmZlci5HZXRCdWZmZXIoc2l6ZSksIG9mZnNldCwgc2l6ZSkpIHsKICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgICAgICB9CisgICAgICBidWZmZXIuUmVsZWFzZUJ1ZmZlcihzaXplKTsKKyAgICAgIHJldHVybiBidWZmZXI7CiAgICAgfQotICAgIGJ1ZmZlci5SZWxlYXNlQnVmZmVyKHNpemUpOwotICAgIHJldHVybiBidWZmZXI7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBfRlBERl9Mb2FkVGFibGVGcm9tVFQoRlhTWVNfRklMRSogcEZpbGUsIGNvbnN0IHVpbnQ4X3QqIHBUYWJsZXMsIEZYX0RXT1JEIG5UYWJsZXMsIEZYX0RXT1JEIHRhZykKLXsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgblRhYmxlczsgaSArKykgewotICAgICAgICBjb25zdCB1aW50OF90KiBwID0gcFRhYmxlcyArIGkgKiAxNjsKLSAgICAgICAgaWYgKEdFVF9UVF9MT05HKHApID09IHRhZykgewotICAgICAgICAgICAgRlhfRFdPUkQgb2Zmc2V0ID0gR0VUX1RUX0xPTkcocCArIDgpOwotICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IEdFVF9UVF9MT05HKHAgKyAxMik7Ci0gICAgICAgICAgICBGWFNZU19mc2VlayhwRmlsZSwgb2Zmc2V0LCBGWFNZU19TRUVLX1NFVCk7Ci0gICAgICAgICAgICByZXR1cm4gX0ZQREZfUmVhZFN0cmluZ0Zyb21GaWxlKHBGaWxlLCBzaXplKTsKLSAgICAgICAgfQorQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0ZvbnRNYXBwZXI6OkdldFBTTmFtZUZyb21UVCh2b2lkKiBoRm9udCkgeworICBpZiAobV9wRm9udEluZm8gPT0gTlVMTCkgeworICAgIENGWF9CeXRlU3RyaW5nKCk7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OworICBGWF9EV09SRCBzaXplID0gbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAweDZlNjE2ZDY1LCBOVUxMLCAwKTsKKyAgaWYgKHNpemUpIHsKKyAgICB1aW50OF90KiBidWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKKyAgICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDB4NmU2MTZkNjUsIGJ1ZmZlciwgc2l6ZSk7CisgICAgcmVzdWx0ID0gX0ZQREZfR2V0TmFtZUZyb21UVChidWZmZXIsIDYpOworICAgIEZYX0ZyZWUoYnVmZmVyKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQordm9pZCBDRlhfRm9udE1hcHBlcjo6QWRkSW5zdGFsbGVkRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgaW50IGNoYXJzZXQpIHsKKyAgaWYgKG1fcEZvbnRJbmZvID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fQ2hhcnNldEFycmF5LkZpbmQoKEZYX0RXT1JEKWNoYXJzZXQpID09IC0xKSB7CisgICAgbV9DaGFyc2V0QXJyYXkuQWRkKChGWF9EV09SRCljaGFyc2V0KTsKKyAgICBtX0ZhY2VBcnJheS5BZGQobmFtZSk7CisgIH0KKyAgaWYgKG5hbWUgPT0gbV9MYXN0RmFtaWx5KSB7CisgICAgcmV0dXJuOworICB9CisgIGNvbnN0IHVpbnQ4X3QqIHB0ciA9IG5hbWU7CisgIEZYX0JPT0wgYkxvY2FsaXplZCA9IEZBTFNFOworICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUuR2V0TGVuZ3RoKCk7IGkrKykKKyAgICBpZiAocHRyW2ldID4gMHg4MCkgeworICAgICAgYkxvY2FsaXplZCA9IFRSVUU7CisgICAgICBicmVhazsKICAgICB9CisgIGlmIChiTG9jYWxpemVkKSB7CisgICAgdm9pZCogaEZvbnQgPSBtX3BGb250SW5mby0+R2V0Rm9udChuYW1lKTsKKyAgICBpZiAoaEZvbnQgPT0gTlVMTCkgeworICAgICAgaW50IGlFeGFjdDsKKyAgICAgIGhGb250ID0KKyAgICAgICAgICBtX3BGb250SW5mby0+TWFwRm9udCgwLCAwLCBGWEZPTlRfREVGQVVMVF9DSEFSU0VULCAwLCBuYW1lLCBpRXhhY3QpOworICAgICAgaWYgKGhGb250ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBDRlhfQnl0ZVN0cmluZyBuZXdfbmFtZSA9IEdldFBTTmFtZUZyb21UVChoRm9udCk7CisgICAgaWYgKCFuZXdfbmFtZS5Jc0VtcHR5KCkpIHsKKyAgICAgIG5ld19uYW1lLkluc2VydCgwLCAnICcpOworICAgICAgbV9JbnN0YWxsZWRUVEZvbnRzLkFkZChuZXdfbmFtZSk7CisgICAgfQorICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKKyAgfQorICBtX0luc3RhbGxlZFRURm9udHMuQWRkKG5hbWUpOworICBtX0xhc3RGYW1pbHkgPSBuYW1lOworfQordm9pZCBDRlhfRm9udE1hcHBlcjo6TG9hZEluc3RhbGxlZEZvbnRzKCkgeworICBpZiAobV9wRm9udEluZm8gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9iTGlzdExvYWRlZCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9iTGlzdExvYWRlZCkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BGb250SW5mby0+RW51bUZvbnRMaXN0KHRoaXMpOworICBtX2JMaXN0TG9hZGVkID0gVFJVRTsKK30KK0NGWF9CeXRlU3RyaW5nIENGWF9Gb250TWFwcGVyOjpNYXRjaEluc3RhbGxlZEZvbnRzKAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBub3JtX25hbWUpIHsKKyAgTG9hZEluc3RhbGxlZEZvbnRzKCk7CisgIGludCBpOworICBmb3IgKGkgPSBtX0luc3RhbGxlZFRURm9udHMuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBub3JtMSA9IF9UVF9Ob3JtYWxpemVOYW1lKG1fSW5zdGFsbGVkVFRGb250c1tpXSk7CisgICAgaWYgKG5vcm0xID09IG5vcm1fbmFtZSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChpIDwgMCkgewogICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotfQotQ0ZYX0J5dGVTdHJpbmcgX0ZQREZfTG9hZFRhYmxlRnJvbVRUU3RyZWFtRmlsZShJRlhfRmlsZVN0cmVhbSogcEZpbGUsIGNvbnN0IHVpbnQ4X3QqIHBUYWJsZXMsIEZYX0RXT1JEIG5UYWJsZXMsIEZYX0RXT1JEIHRhZykKLXsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgblRhYmxlczsgaSArKykgewotICAgICAgICBjb25zdCB1aW50OF90KiBwID0gcFRhYmxlcyArIGkgKiAxNjsKLSAgICAgICAgaWYgKEdFVF9UVF9MT05HKHApID09IHRhZykgewotICAgICAgICAgICAgRlhfRFdPUkQgb2Zmc2V0ID0gR0VUX1RUX0xPTkcocCArIDgpOwotICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IEdFVF9UVF9MT05HKHAgKyAxMik7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBidWZmZXI7Ci0gICAgICAgICAgICBpZiAoIXBGaWxlLT5SZWFkQmxvY2soYnVmZmVyLkdldEJ1ZmZlcihzaXplKSwgb2Zmc2V0LCBzaXplKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyLlJlbGVhc2VCdWZmZXIoc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gYnVmZmVyOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0ZvbnRNYXBwZXI6OkdldFBTTmFtZUZyb21UVCh2b2lkKiBoRm9udCkKLXsKLSAgICBpZiAobV9wRm9udEluZm8gPT0gTlVMTCkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZygpOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7Ci0gICAgRlhfRFdPUkQgc2l6ZSA9IG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMHg2ZTYxNmQ2NSwgTlVMTCwgMCk7Ci0gICAgaWYgKHNpemUpIHsKLSAgICAgICAgdWludDhfdCogYnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7Ci0gICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMHg2ZTYxNmQ2NSwgYnVmZmVyLCBzaXplKTsKLSAgICAgICAgcmVzdWx0ID0gX0ZQREZfR2V0TmFtZUZyb21UVChidWZmZXIsIDYpOwotICAgICAgICBGWF9GcmVlKGJ1ZmZlcik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci12b2lkIENGWF9Gb250TWFwcGVyOjpBZGRJbnN0YWxsZWRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBpbnQgY2hhcnNldCkKLXsKLSAgICBpZiAobV9wRm9udEluZm8gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX0NoYXJzZXRBcnJheS5GaW5kKChGWF9EV09SRCljaGFyc2V0KSA9PSAtMSkgewotICAgICAgICBtX0NoYXJzZXRBcnJheS5BZGQoKEZYX0RXT1JEKWNoYXJzZXQpOwotICAgICAgICBtX0ZhY2VBcnJheS5BZGQobmFtZSk7Ci0gICAgfQotICAgIGlmIChuYW1lID09IG1fTGFzdEZhbWlseSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNvbnN0IHVpbnQ4X3QqIHB0ciA9IG5hbWU7Ci0gICAgRlhfQk9PTCBiTG9jYWxpemVkID0gRkFMU0U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLkdldExlbmd0aCgpOyBpICsrKQotICAgICAgICBpZiAocHRyW2ldID4gMHg4MCkgewotICAgICAgICAgICAgYkxvY2FsaXplZCA9IFRSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGlmIChiTG9jYWxpemVkKSB7Ci0gICAgICAgIHZvaWQqIGhGb250ID0gbV9wRm9udEluZm8tPkdldEZvbnQobmFtZSk7Ci0gICAgICAgIGlmIChoRm9udCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQgaUV4YWN0OwotICAgICAgICAgICAgaEZvbnQgPSBtX3BGb250SW5mby0+TWFwRm9udCgwLCAwLCBGWEZPTlRfREVGQVVMVF9DSEFSU0VULCAwLCBuYW1lLCBpRXhhY3QpOwotICAgICAgICAgICAgaWYgKGhGb250ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV3X25hbWUgPSBHZXRQU05hbWVGcm9tVFQoaEZvbnQpOwotICAgICAgICBpZiAoIW5ld19uYW1lLklzRW1wdHkoKSkgewotICAgICAgICAgICAgbmV3X25hbWUuSW5zZXJ0KDAsICcgJyk7Ci0gICAgICAgICAgICBtX0luc3RhbGxlZFRURm9udHMuQWRkKG5ld19uYW1lKTsKLSAgICAgICAgfQotICAgICAgICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7Ci0gICAgfQotICAgIG1fSW5zdGFsbGVkVFRGb250cy5BZGQobmFtZSk7Ci0gICAgbV9MYXN0RmFtaWx5ID0gbmFtZTsKLX0KLXZvaWQgQ0ZYX0ZvbnRNYXBwZXI6OkxvYWRJbnN0YWxsZWRGb250cygpCi17Ci0gICAgaWYgKG1fcEZvbnRJbmZvID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9iTGlzdExvYWRlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX2JMaXN0TG9hZGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wRm9udEluZm8tPkVudW1Gb250TGlzdCh0aGlzKTsKLSAgICBtX2JMaXN0TG9hZGVkID0gVFJVRTsKLX0KLUNGWF9CeXRlU3RyaW5nIENGWF9Gb250TWFwcGVyOjpNYXRjaEluc3RhbGxlZEZvbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBub3JtX25hbWUpCi17Ci0gICAgTG9hZEluc3RhbGxlZEZvbnRzKCk7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gbV9JbnN0YWxsZWRUVEZvbnRzLkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaSAtLSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBub3JtMSA9IF9UVF9Ob3JtYWxpemVOYW1lKG1fSW5zdGFsbGVkVFRGb250c1tpXSk7Ci0gICAgICAgIGlmIChub3JtMSA9PSBub3JtX25hbWUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpIDwgMCkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbWF0Y2ggPSBtX0luc3RhbGxlZFRURm9udHNbaV07Ci0gICAgaWYgKG1hdGNoWzBdID09ICcgJykgewotICAgICAgICBtYXRjaCA9IG1fSW5zdGFsbGVkVFRGb250c1tpICsgMV07Ci0gICAgfQotICAgIHJldHVybiBtYXRjaDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBtYXRjaCA9IG1fSW5zdGFsbGVkVFRGb250c1tpXTsKKyAgaWYgKG1hdGNoWzBdID09ICcgJykgeworICAgIG1hdGNoID0gbV9JbnN0YWxsZWRUVEZvbnRzW2kgKyAxXTsKKyAgfQorICByZXR1cm4gbWF0Y2g7CiB9CiB0eXBlZGVmIHN0cnVjdCBfQ0hBUlNFVF9NQVBfIHsKLSAgICB1aW50OF90IGNoYXJzZXQ7Ci0gICAgRlhfV09SRCBjb2RlcGFnZTsKKyAgdWludDhfdCBjaGFyc2V0OworICBGWF9XT1JEIGNvZGVwYWdlOwogfSBDSEFSU0VUX01BUDsKIHN0YXRpYyBjb25zdCBDSEFSU0VUX01BUCBnX0NvZGVwYWdlMkNoYXJzZXRUYWJsZVtdID0gewotICAgIHsgMQkgLCAwCX0sCi0gICAgeyAyCSAsIDQyCX0sCi0gICAgeyAyNTQsIDQzNwl9LAotICAgIHsgMjU1LCA4NTAJfSwKLSAgICB7IDIyMiwgODc0CX0sCi0gICAgeyAxMjgsIDkzMgl9LAotICAgIHsgMTM0LCA5MzYJfSwKLSAgICB7IDEyOSwgOTQ5CX0sCi0gICAgeyAxMzYsIDk1MAl9LAotICAgIHsgMjM4LCAxMjUwCX0sCi0gICAgeyAyMDQsIDEyNTEJfSwKLSAgICB7IDAsICAgMTI1Mgl9LAotICAgIHsgMTYxLCAxMjUzCX0sCi0gICAgeyAxNjIsIDEyNTQJfSwKLSAgICB7IDE3NywgMTI1NQl9LAotICAgIHsgMTc4LCAxMjU2CX0sCi0gICAgeyAxODYsIDEyNTcJfSwKLSAgICB7IDE2MywgMTI1OCB9LAotICAgIHsgMTMwLCAxMzYxIH0sCi0gICAgeyA3NywgMTAwMDAgfSwKLSAgICB7IDc4LCAxMDAwMSB9LAotICAgIHsgNzksIDEwMDAzIH0sCi0gICAgeyA4MCwgMTAwMDggfSwKLSAgICB7IDgxLCAxMDAwMiB9LAotICAgIHsgODMsIDEwMDA1IH0sCi0gICAgeyA4NCwgMTAwMDQgfSwKLSAgICB7IDg1LCAxMDAwNiB9LAotICAgIHsgODYsIDEwMDgxIH0sCi0gICAgeyA4NywgMTAwMjEgfSwKLSAgICB7IDg4LCAxMDAyOSB9LAotICAgIHsgODksIDEwMDA3IH0sCisgICAgezEsIDB9LCAgICAgIHsyLCA0Mn0sICAgICB7MjU0LCA0Mzd9LCAgezI1NSwgODUwfSwgIHsyMjIsIDg3NH0sCisgICAgezEyOCwgOTMyfSwgIHsxMzQsIDkzNn0sICB7MTI5LCA5NDl9LCAgezEzNiwgOTUwfSwgIHsyMzgsIDEyNTB9LAorICAgIHsyMDQsIDEyNTF9LCB7MCwgMTI1Mn0sICAgezE2MSwgMTI1M30sIHsxNjIsIDEyNTR9LCB7MTc3LCAxMjU1fSwKKyAgICB7MTc4LCAxMjU2fSwgezE4NiwgMTI1N30sIHsxNjMsIDEyNTh9LCB7MTMwLCAxMzYxfSwgezc3LCAxMDAwMH0sCisgICAgezc4LCAxMDAwMX0sIHs3OSwgMTAwMDN9LCB7ODAsIDEwMDA4fSwgezgxLCAxMDAwMn0sIHs4MywgMTAwMDV9LAorICAgIHs4NCwgMTAwMDR9LCB7ODUsIDEwMDA2fSwgezg2LCAxMDA4MX0sIHs4NywgMTAwMjF9LCB7ODgsIDEwMDI5fSwKKyAgICB7ODksIDEwMDA3fSwKIH07Ci11aW50OF90IF9HZXRDaGFyc2V0RnJvbUNvZGVQYWdlKEZYX1dPUkQgY29kZXBhZ2UpCi17Ci0gICAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfQ29kZXBhZ2UyQ2hhcnNldFRhYmxlKSAvIHNpemVvZihDSEFSU0VUX01BUCkgLSAxOwotICAgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOwotICAgIGludDMyX3QgaVN0YXJ0ID0gMCwgaU1pZDsKLSAgICBkbyB7Ci0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgICAgICBjb25zdCBDSEFSU0VUX01BUCAmIGNwID0gZ19Db2RlcGFnZTJDaGFyc2V0VGFibGVbaU1pZF07Ci0gICAgICAgIGlmIChjb2RlcGFnZSA9PSBjcC5jb2RlcGFnZSkgewotICAgICAgICAgICAgcmV0dXJuIGNwLmNoYXJzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvZGVwYWdlIDwgY3AuY29kZXBhZ2UpIHsKLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOwotICAgIHJldHVybiAxOwordWludDhfdCBfR2V0Q2hhcnNldEZyb21Db2RlUGFnZShGWF9XT1JEIGNvZGVwYWdlKSB7CisgIGludDMyX3QgaUVuZCA9IHNpemVvZihnX0NvZGVwYWdlMkNoYXJzZXRUYWJsZSkgLyBzaXplb2YoQ0hBUlNFVF9NQVApIC0gMTsKKyAgRlhTWVNfYXNzZXJ0KGlFbmQgPj0gMCk7CisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaU1pZDsKKyAgZG8geworICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOworICAgIGNvbnN0IENIQVJTRVRfTUFQJiBjcCA9IGdfQ29kZXBhZ2UyQ2hhcnNldFRhYmxlW2lNaWRdOworICAgIGlmIChjb2RlcGFnZSA9PSBjcC5jb2RlcGFnZSkgeworICAgICAgcmV0dXJuIGNwLmNoYXJzZXQ7CisgICAgfQorICAgIGlmIChjb2RlcGFnZSA8IGNwLmNvZGVwYWdlKSB7CisgICAgICBpRW5kID0gaU1pZCAtIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOworICAgIH0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOworICByZXR1cm4gMTsKIH0KLUZYX0RXT1JEIF9HZXRDb2RlUGFnZVJhbmdlRnJvbUNoYXJzZXQoaW50IGNoYXJzZXQpCi17Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0VBU1RFVVJPUEVfQ0hBUlNFVCkgewotICAgICAgICByZXR1cm4gMSA8PCAxOwotICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfR1JFRUtfQ0hBUlNFVCkgewotICAgICAgICByZXR1cm4gMSA8PCAzOwotICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfVFVSS0lTSF9DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiAxIDw8IDQ7Ci0gICAgfQotICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9IRUJSRVdfQ0hBUlNFVCkgewotICAgICAgICByZXR1cm4gMSA8PCA1OwotICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfQVJBQklDX0NIQVJTRVQpIHsKLSAgICAgICAgcmV0dXJuIDEgPDwgNjsKLSAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0JBTFRJQ19DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiAxIDw8IDc7Ci0gICAgfQotICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9USEFJX0NIQVJTRVQpIHsKLSAgICAgICAgcmV0dXJuIDEgPDwgMTY7Ci0gICAgfQotICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiAxIDw8IDE3OwotICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQpIHsKLSAgICAgICAgcmV0dXJuIDEgPDwgMTg7Ci0gICAgfQotICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiAxIDw8IDIwOwotICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiAxIDw8IDE5OwotICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQpIHsKLSAgICAgICAgcmV0dXJuIDEgPDwgMzE7Ci0gICAgfQotICAgIHJldHVybiAxIDw8IDIxOworRlhfRFdPUkQgX0dldENvZGVQYWdlUmFuZ2VGcm9tQ2hhcnNldChpbnQgY2hhcnNldCkgeworICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfRUFTVEVVUk9QRV9DSEFSU0VUKSB7CisgICAgcmV0dXJuIDEgPDwgMTsKKyAgfQorICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfR1JFRUtfQ0hBUlNFVCkgeworICAgIHJldHVybiAxIDw8IDM7CisgIH0KKyAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX1RVUktJU0hfQ0hBUlNFVCkgeworICAgIHJldHVybiAxIDw8IDQ7CisgIH0KKyAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0hFQlJFV19DSEFSU0VUKSB7CisgICAgcmV0dXJuIDEgPDwgNTsKKyAgfQorICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfQVJBQklDX0NIQVJTRVQpIHsKKyAgICByZXR1cm4gMSA8PCA2OworICB9CisgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9CQUxUSUNfQ0hBUlNFVCkgeworICAgIHJldHVybiAxIDw8IDc7CisgIH0KKyAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX1RIQUlfQ0hBUlNFVCkgeworICAgIHJldHVybiAxIDw8IDE2OworICB9CisgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKSB7CisgICAgcmV0dXJuIDEgPDwgMTc7CisgIH0KKyAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0dCMjMxMl9DSEFSU0VUKSB7CisgICAgcmV0dXJuIDEgPDwgMTg7CisgIH0KKyAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpIHsKKyAgICByZXR1cm4gMSA8PCAyMDsKKyAgfQorICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKSB7CisgICAgcmV0dXJuIDEgPDwgMTk7CisgIH0KKyAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX1NZTUJPTF9DSEFSU0VUKSB7CisgICAgcmV0dXJuIDEgPDwgMzE7CisgIH0KKyAgcmV0dXJuIDEgPDwgMjE7CiB9Ci1GWEZUX0ZhY2UgQ0ZYX0ZvbnRNYXBwZXI6OlVzZUludGVybmFsU3Vic3QoQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCwgaW50IGlCYXNlRm9udCwgaW50IGl0YWxpY19hbmdsZSwgaW50IHdlaWdodCwgaW50IHBpY3RoZmFtaWx5KQotewotICAgIGlmIChpQmFzZUZvbnQgPCAxMikgewotICAgICAgICBpZiAobV9Gb3hpdEZhY2VzW2lCYXNlRm9udF0pIHsKLSAgICAgICAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbaUJhc2VGb250XTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCB1aW50OF90KiBwRm9udERhdGEgPSBOVUxMOwotICAgICAgICBGWF9EV09SRCBzaXplID0gMDsKLSAgICAgICAgaWYgKG1fcEZvbnRNZ3ItPkdldFN0YW5kYXJkRm9udChwRm9udERhdGEsIHNpemUsIGlCYXNlRm9udCkpIHsKLSAgICAgICAgICAgIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdID0gbV9wRm9udE1nci0+R2V0Rml4ZWRGYWNlKHBGb250RGF0YSwgc2l6ZSwgMCk7Ci0gICAgICAgICAgICByZXR1cm4gbV9Gb3hpdEZhY2VzW2lCYXNlRm9udF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9NTTsKLSAgICBwU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlID0gaXRhbGljX2FuZ2xlOwotICAgIGlmICh3ZWlnaHQpIHsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHQgPSB3ZWlnaHQ7Ci0gICAgfQotICAgIGlmIChwaWN0aGZhbWlseSAmIEZYRk9OVF9GRl9ST01BTikgewotICAgICAgICBwU3Vic3RGb250LT5tX1dlaWdodCA9IHBTdWJzdEZvbnQtPm1fV2VpZ2h0ICogNCAvIDU7Ci0gICAgICAgIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gIkNocm9tZSBTZXJpZiI7Ci0gICAgICAgIGlmIChtX01NRmFjZXNbMV0pIHsKLSAgICAgICAgICAgIHJldHVybiBtX01NRmFjZXNbMV07Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgdWludDhfdCogcEZvbnREYXRhID0gTlVMTDsKLSAgICAgICAgRlhfRFdPUkQgc2l6ZTsKLSAgICAgICAgbV9wRm9udE1nci0+R2V0U3RhbmRhcmRGb250KHBGb250RGF0YSwgc2l6ZSwgMTQpOwotICAgICAgICBtX01NRmFjZXNbMV0gPSBtX3BGb250TWdyLT5HZXRGaXhlZEZhY2UocEZvbnREYXRhLCBzaXplLCAwKTsKLSAgICAgICAgcmV0dXJuIG1fTU1GYWNlc1sxXTsKLSAgICB9Ci0gICAgcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSAiQ2hyb21lIFNhbnMiOwotICAgIGlmIChtX01NRmFjZXNbMF0pIHsKLSAgICAgICAgcmV0dXJuIG1fTU1GYWNlc1swXTsKK0ZYRlRfRmFjZSBDRlhfRm9udE1hcHBlcjo6VXNlSW50ZXJuYWxTdWJzdChDRlhfU3Vic3RGb250KiBwU3Vic3RGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpQmFzZUZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0YWxpY19hbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWN0aGZhbWlseSkgeworICBpZiAoaUJhc2VGb250IDwgMTIpIHsKKyAgICBpZiAobV9Gb3hpdEZhY2VzW2lCYXNlRm9udF0pIHsKKyAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbaUJhc2VGb250XTsKICAgICB9CiAgICAgY29uc3QgdWludDhfdCogcEZvbnREYXRhID0gTlVMTDsKICAgICBGWF9EV09SRCBzaXplID0gMDsKLSAgICBtX3BGb250TWdyLT5HZXRTdGFuZGFyZEZvbnQocEZvbnREYXRhLCBzaXplLCAxNSk7Ci0gICAgbV9NTUZhY2VzWzBdID0gbV9wRm9udE1nci0+R2V0Rml4ZWRGYWNlKHBGb250RGF0YSwgc2l6ZSwgMCk7CisgICAgaWYgKG1fcEZvbnRNZ3ItPkdldFN0YW5kYXJkRm9udChwRm9udERhdGEsIHNpemUsIGlCYXNlRm9udCkpIHsKKyAgICAgIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdID0gbV9wRm9udE1nci0+R2V0Rml4ZWRGYWNlKHBGb250RGF0YSwgc2l6ZSwgMCk7CisgICAgICByZXR1cm4gbV9Gb3hpdEZhY2VzW2lCYXNlRm9udF07CisgICAgfQorICB9CisgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfTU07CisgIHBTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGUgPSBpdGFsaWNfYW5nbGU7CisgIGlmICh3ZWlnaHQpIHsKKyAgICBwU3Vic3RGb250LT5tX1dlaWdodCA9IHdlaWdodDsKKyAgfQorICBpZiAocGljdGhmYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pIHsKKyAgICBwU3Vic3RGb250LT5tX1dlaWdodCA9IHBTdWJzdEZvbnQtPm1fV2VpZ2h0ICogNCAvIDU7CisgICAgcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSAiQ2hyb21lIFNlcmlmIjsKKyAgICBpZiAobV9NTUZhY2VzWzFdKSB7CisgICAgICByZXR1cm4gbV9NTUZhY2VzWzFdOworICAgIH0KKyAgICBjb25zdCB1aW50OF90KiBwRm9udERhdGEgPSBOVUxMOworICAgIEZYX0RXT1JEIHNpemU7CisgICAgbV9wRm9udE1nci0+R2V0U3RhbmRhcmRGb250KHBGb250RGF0YSwgc2l6ZSwgMTQpOworICAgIG1fTU1GYWNlc1sxXSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOworICAgIHJldHVybiBtX01NRmFjZXNbMV07CisgIH0KKyAgcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSAiQ2hyb21lIFNhbnMiOworICBpZiAobV9NTUZhY2VzWzBdKSB7CiAgICAgcmV0dXJuIG1fTU1GYWNlc1swXTsKKyAgfQorICBjb25zdCB1aW50OF90KiBwRm9udERhdGEgPSBOVUxMOworICBGWF9EV09SRCBzaXplID0gMDsKKyAgbV9wRm9udE1nci0+R2V0U3RhbmRhcmRGb250KHBGb250RGF0YSwgc2l6ZSwgMTUpOworICBtX01NRmFjZXNbMF0gPSBtX3BGb250TWdyLT5HZXRGaXhlZEZhY2UocEZvbnREYXRhLCBzaXplLCAwKTsKKyAgcmV0dXJuIG1fTU1GYWNlc1swXTsKIH0KIGNvbnN0IHN0cnVjdCBfQWx0Rm9udEZhbWlseSB7Ci0gICAgY29uc3QgRlhfQ0hBUiogbV9wRm9udE5hbWU7Ci0gICAgY29uc3QgRlhfQ0hBUiogbV9wRm9udEZhbWlseTsKLX0KLWdfQWx0Rm9udEZhbWlsaWVzW10gPSB7CisgIGNvbnN0IEZYX0NIQVIqIG1fcEZvbnROYW1lOworICBjb25zdCBGWF9DSEFSKiBtX3BGb250RmFtaWx5OworfSBnX0FsdEZvbnRGYW1pbGllc1tdID0gewogICAgIHsiQUdhcmFtb25kUHJvIiwgIkFkb2JlIEdhcmFtb25kIFBybyJ9LAogICAgIHsiQmFua0dvdGhpY0JULU1lZGl1bSIsICJCYW5rR290aGljIE1kIEJUIn0sCiAgICAgeyJGb3J0ZU1UIiwgIkZvcnRlIn0sCiB9OwogZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIGludCBjb21wYXJlRm9udEZhbWlseVN0cmluZyhjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpCi0gICAgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHJfa2V5KChjb25zdCBGWF9DSEFSKilrZXkpOwotICAgICAgICBpZiAoc3RyX2tleS5GaW5kKCgoX0FsdEZvbnRGYW1pbHkqKWVsZW1lbnQpLT5tX3BGb250TmFtZSkgIT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGWFNZU19zdHJpY21wKChjb25zdCBGWF9DSEFSKilrZXksICgoX0FsdEZvbnRGYW1pbHkqKWVsZW1lbnQpLT5tX3BGb250TmFtZSk7Ci0gICAgfQorc3RhdGljIGludCBjb21wYXJlRm9udEZhbWlseVN0cmluZyhjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyX2tleSgoY29uc3QgRlhfQ0hBUiopa2V5KTsKKyAgaWYgKHN0cl9rZXkuRmluZCgoKF9BbHRGb250RmFtaWx5KillbGVtZW50KS0+bV9wRm9udE5hbWUpICE9IC0xKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIEZYU1lTX3N0cmljbXAoKGNvbnN0IEZYX0NIQVIqKWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChfQWx0Rm9udEZhbWlseSopZWxlbWVudCktPm1fcEZvbnROYW1lKTsKIH0KLSNkZWZpbmUgRlhfRk9OVF9TVFlMRV9Ob25lCQkweDAwCi0jZGVmaW5lIEZYX0ZPTlRfU1RZTEVfQm9sZAkJMHgwMQotI2RlZmluZSBGWF9GT05UX1NUWUxFX0l0YWxpYwkweDAyCi0jZGVmaW5lIEZYX0ZPTlRfU1RZTEVfQm9sZEJvbGQJMHgwNAotc3RhdGljIENGWF9CeXRlU3RyaW5nIF9HZXRGb250RmFtaWx5KENGWF9CeXRlU3RyaW5nIGZvbnROYW1lLCBpbnQgblN0eWxlKQotewotICAgIGlmIChmb250TmFtZS5GaW5kKCJTY3JpcHQiKSA+PSAwKSB7Ci0gICAgICAgIGlmICgoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkKSA9PSBGWF9GT05UX1NUWUxFX0JvbGQpIHsKLSAgICAgICAgICAgIGZvbnROYW1lID0gIlNjcmlwdE1UQm9sZCI7Ci0gICAgICAgIH0gZWxzZSBpZiAoZm9udE5hbWUuRmluZCgiUGFsYWNlIikgPj0gMCkgewotICAgICAgICAgICAgZm9udE5hbWUgPSAiUGFsYWNlU2NyaXB0TVQiOwotICAgICAgICB9IGVsc2UgaWYgKGZvbnROYW1lLkZpbmQoIkZyZW5jaCIpID49IDApIHsKLSAgICAgICAgICAgIGZvbnROYW1lID0gIkZyZW5jaFNjcmlwdE1UIjsKLSAgICAgICAgfSBlbHNlIGlmIChmb250TmFtZS5GaW5kKCJGcmVlU3R5bGUiKSA+PSAwKSB7Ci0gICAgICAgICAgICBmb250TmFtZSA9ICJGcmVlU3R5bGVTY3JpcHQiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmb250TmFtZTsKK30KKyNkZWZpbmUgRlhfRk9OVF9TVFlMRV9Ob25lIDB4MDAKKyNkZWZpbmUgRlhfRk9OVF9TVFlMRV9Cb2xkIDB4MDEKKyNkZWZpbmUgRlhfRk9OVF9TVFlMRV9JdGFsaWMgMHgwMgorI2RlZmluZSBGWF9GT05UX1NUWUxFX0JvbGRCb2xkIDB4MDQKK3N0YXRpYyBDRlhfQnl0ZVN0cmluZyBfR2V0Rm9udEZhbWlseShDRlhfQnl0ZVN0cmluZyBmb250TmFtZSwgaW50IG5TdHlsZSkgeworICBpZiAoZm9udE5hbWUuRmluZCgiU2NyaXB0IikgPj0gMCkgeworICAgIGlmICgoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkKSA9PSBGWF9GT05UX1NUWUxFX0JvbGQpIHsKKyAgICAgIGZvbnROYW1lID0gIlNjcmlwdE1UQm9sZCI7CisgICAgfSBlbHNlIGlmIChmb250TmFtZS5GaW5kKCJQYWxhY2UiKSA+PSAwKSB7CisgICAgICBmb250TmFtZSA9ICJQYWxhY2VTY3JpcHRNVCI7CisgICAgfSBlbHNlIGlmIChmb250TmFtZS5GaW5kKCJGcmVuY2giKSA+PSAwKSB7CisgICAgICBmb250TmFtZSA9ICJGcmVuY2hTY3JpcHRNVCI7CisgICAgfSBlbHNlIGlmIChmb250TmFtZS5GaW5kKCJGcmVlU3R5bGUiKSA+PSAwKSB7CisgICAgICBmb250TmFtZSA9ICJGcmVlU3R5bGVTY3JpcHQiOwogICAgIH0KLSAgICBfQWx0Rm9udEZhbWlseSogZm91bmQgPSAoX0FsdEZvbnRGYW1pbHkqKUZYU1lTX2JzZWFyY2goZm9udE5hbWUuY19zdHIoKSwgZ19BbHRGb250RmFtaWxpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIGdfQWx0Rm9udEZhbWlsaWVzIC8gc2l6ZW9mIChfQWx0Rm9udEZhbWlseSksIHNpemVvZiAoX0FsdEZvbnRGYW1pbHkpLCBjb21wYXJlRm9udEZhbWlseVN0cmluZyk7Ci0gICAgaWYgKGZvdW5kID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZvbnROYW1lOwotICAgIH0KLSAgICByZXR1cm4gZm91bmQtPm1fcEZvbnRGYW1pbHk7CisgICAgcmV0dXJuIGZvbnROYW1lOworICB9CisgIF9BbHRGb250RmFtaWx5KiBmb3VuZCA9IChfQWx0Rm9udEZhbWlseSopRlhTWVNfYnNlYXJjaCgKKyAgICAgIGZvbnROYW1lLmNfc3RyKCksIGdfQWx0Rm9udEZhbWlsaWVzLAorICAgICAgc2l6ZW9mIGdfQWx0Rm9udEZhbWlsaWVzIC8gc2l6ZW9mKF9BbHRGb250RmFtaWx5KSwgc2l6ZW9mKF9BbHRGb250RmFtaWx5KSwKKyAgICAgIGNvbXBhcmVGb250RmFtaWx5U3RyaW5nKTsKKyAgaWYgKGZvdW5kID09IE5VTEwpIHsKKyAgICByZXR1cm4gZm9udE5hbWU7CisgIH0KKyAgcmV0dXJuIGZvdW5kLT5tX3BGb250RmFtaWx5OwogfTsKIHR5cGVkZWYgc3RydWN0IF9GWF9Gb250U3R5bGUgewotICAgIGNvbnN0IEZYX0NIQVIqIHN0eWxlOwotICAgIGludDMyX3QgbGVuOworICBjb25zdCBGWF9DSEFSKiBzdHlsZTsKKyAgaW50MzJfdCBsZW47CiB9IEZYX0ZvbnRTdHlsZTsKIGNvbnN0IEZYX0ZvbnRTdHlsZSBnX0ZvbnRTdHlsZXNbXSA9IHsKLSAgeyAiQm9sZCIsIDQgfSwKLSAgeyAiSXRhbGljIiwgNiB9LAotICB7ICJCb2xkSXRhbGljIiwgMTAgfSwKLSAgeyAiUmVnIiwgMyB9LAotICB7ICJSZWd1bGFyIiwgNyB9LAorICAgIHsiQm9sZCIsIDR9LCB7Ikl0YWxpYyIsIDZ9LCB7IkJvbGRJdGFsaWMiLCAxMH0sIHsiUmVnIiwgM30sIHsiUmVndWxhciIsIDd9LAogfTsKLUNGWF9CeXRlU3RyaW5nIFBhcnNlU3R5bGUoY29uc3QgRlhfQ0hBUiogcFN0eWxlLCBpbnQgaUxlbiwgaW50IGlJbmRleCkKLXsKLSAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICAgIGlmICghaUxlbiB8fCBpTGVuIDw9IGlJbmRleCkgewotICAgICAgICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgd2hpbGUgKGlJbmRleCA8IGlMZW4pIHsKLSAgICAgICAgaWYgKHBTdHlsZVtpSW5kZXhdID09ICcsJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmLkFwcGVuZENoYXIocFN0eWxlW2lJbmRleF0pOwotICAgICAgICArK2lJbmRleDsKLSAgICB9CitDRlhfQnl0ZVN0cmluZyBQYXJzZVN0eWxlKGNvbnN0IEZYX0NIQVIqIHBTdHlsZSwgaW50IGlMZW4sIGludCBpSW5kZXgpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgaWYgKCFpTGVuIHx8IGlMZW4gPD0gaUluZGV4KSB7CiAgICAgcmV0dXJuIGJ1Zi5HZXRCeXRlU3RyaW5nKCk7CisgIH0KKyAgd2hpbGUgKGlJbmRleCA8IGlMZW4pIHsKKyAgICBpZiAocFN0eWxlW2lJbmRleF0gPT0gJywnKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnVmLkFwcGVuZENoYXIocFN0eWxlW2lJbmRleF0pOworICAgICsraUluZGV4OworICB9CisgIHJldHVybiBidWYuR2V0Qnl0ZVN0cmluZygpOwogfQotaW50MzJfdCBHZXRTdHlsZVR5cGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmJzU3R5bGUsIEZYX0JPT0wgYlJldmVydCkKLXsKLSAgICBpbnQzMl90IGlMZW4gPSBic1N0eWxlLkdldExlbmd0aCgpOwotICAgIGlmICghaUxlbikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBpU2l6ZSA9IHNpemVvZihnX0ZvbnRTdHlsZXMpIC8gc2l6ZW9mKEZYX0ZvbnRTdHlsZSk7Ci0gICAgY29uc3QgRlhfRm9udFN0eWxlICpwU3R5bGUgPSBOVUxMOwotICAgIGZvciAoaW50IGkgPSBpU2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgIHBTdHlsZSA9IGdfRm9udFN0eWxlcyArIGk7Ci0gICAgICAgIGlmICghcFN0eWxlIHx8IHBTdHlsZS0+bGVuID4gaUxlbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiUmV2ZXJ0KSB7Ci0gICAgICAgICAgICBpZiAoYnNTdHlsZS5MZWZ0KHBTdHlsZS0+bGVuKS5Db21wYXJlKHBTdHlsZS0+c3R5bGUpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChic1N0eWxlLlJpZ2h0KHBTdHlsZS0+bGVuKS5Db21wYXJlKHBTdHlsZS0+c3R5bGUpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KK2ludDMyX3QgR2V0U3R5bGVUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic1N0eWxlLCBGWF9CT09MIGJSZXZlcnQpIHsKKyAgaW50MzJfdCBpTGVuID0gYnNTdHlsZS5HZXRMZW5ndGgoKTsKKyAgaWYgKCFpTGVuKSB7CiAgICAgcmV0dXJuIC0xOwotfQotRlhfQk9PTCBDaGVja1N1cHBvcnRUaGlyZFBhcnRGb250KENGWF9CeXRlU3RyaW5nIG5hbWUsIGludCAmUGl0Y2hGYW1pbHkpCi17Ci0gICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIk15cmlhZFBybyIpKSB7Ci0gICAgICAgIFBpdGNoRmFtaWx5ICY9IH5GWEZPTlRfRkZfUk9NQU47Ci0gICAgICAgIHJldHVybiBUUlVFOworICB9CisgIGludCBpU2l6ZSA9IHNpemVvZihnX0ZvbnRTdHlsZXMpIC8gc2l6ZW9mKEZYX0ZvbnRTdHlsZSk7CisgIGNvbnN0IEZYX0ZvbnRTdHlsZSogcFN0eWxlID0gTlVMTDsKKyAgZm9yIChpbnQgaSA9IGlTaXplIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICBwU3R5bGUgPSBnX0ZvbnRTdHlsZXMgKyBpOworICAgIGlmICghcFN0eWxlIHx8IHBTdHlsZS0+bGVuID4gaUxlbikgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYRlRfRmFjZSBDRlhfRm9udE1hcHBlcjo6RmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgRlhfQk9PTCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBXaW5kb3dDUCwgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkKLXsKLSAgICBpZiAoIShmbGFncyAmIEZYRk9OVF9VU0VFWFRFUk5BVFRSKSkgewotICAgICAgICB3ZWlnaHQgPSBGWEZPTlRfRldfTk9STUFMOwotICAgICAgICBpdGFsaWNfYW5nbGUgPSAwOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBTdWJzdE5hbWUgPSBuYW1lOwotICAgIFN1YnN0TmFtZS5SZW1vdmUoMHgyMCk7Ci0gICAgaWYgKGJUcnVlVHlwZSkgewotICAgICAgICBpZiAobmFtZVswXSA9PSAnQCcpIHsKLSAgICAgICAgICAgIFN1YnN0TmFtZSA9IG5hbWUuTWlkKDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIF9QREZfR2V0U3RhbmRhcmRGb250TmFtZShTdWJzdE5hbWUpOwotICAgIGlmIChTdWJzdE5hbWUgPT0gRlhfQlNUUkMoIlN5bWJvbCIpICYmICFiVHJ1ZVR5cGUpIHsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSAiQ2hyb21lIFN5bWJvbCI7Ci0gICAgICAgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVDsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKLSAgICAgICAgaWYgKG1fRm94aXRGYWNlc1sxMl0pIHsKLSAgICAgICAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbMTJdOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSA9IE5VTEw7Ci0gICAgICAgIEZYX0RXT1JEIHNpemUgPSAwOwotICAgICAgICBtX3BGb250TWdyLT5HZXRTdGFuZGFyZEZvbnQocEZvbnREYXRhLCBzaXplLCAxMik7Ci0gICAgICAgIG1fRm94aXRGYWNlc1sxMl0gPSBtX3BGb250TWdyLT5HZXRGaXhlZEZhY2UocEZvbnREYXRhLCBzaXplLCAwKTsKLSAgICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1sxMl07Ci0gICAgfQotICAgIGlmIChTdWJzdE5hbWUgPT0gRlhfQlNUUkMoIlphcGZEaW5nYmF0cyIpKSB7Ci0gICAgICAgIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gIkNocm9tZSBEaW5nYmF0cyI7Ci0gICAgICAgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVDsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKLSAgICAgICAgaWYgKG1fRm94aXRGYWNlc1sxM10pIHsKLSAgICAgICAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbMTNdOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSA9IE5VTEw7Ci0gICAgICAgIEZYX0RXT1JEIHNpemUgPSAwOwotICAgICAgICBtX3BGb250TWdyLT5HZXRTdGFuZGFyZEZvbnQocEZvbnREYXRhLCBzaXplLCAxMyk7Ci0gICAgICAgIG1fRm94aXRGYWNlc1sxM10gPSBtX3BGb250TWdyLT5HZXRGaXhlZEZhY2UocEZvbnREYXRhLCBzaXplLCAwKTsKLSAgICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1sxM107Ci0gICAgfQotICAgIGludCBpQmFzZUZvbnQgPSAwOwotICAgIENGWF9CeXRlU3RyaW5nIGZhbWlseSwgc3R5bGU7Ci0gICAgRlhfQk9PTAliSGFzQ29tbWEgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJIYXNIeXBlbiA9IEZBTFNFOwotICAgIGludCBmaW5kID0gU3Vic3ROYW1lLkZpbmQoRlhfQlNUUkMoIiwiKSwgMCk7Ci0gICAgaWYgKGZpbmQgPj0gMCkgewotICAgICAgICBmYW1pbHkgPSBTdWJzdE5hbWUuTGVmdChmaW5kKTsKLSAgICAgICAgX1BERl9HZXRTdGFuZGFyZEZvbnROYW1lKGZhbWlseSk7Ci0gICAgICAgIHN0eWxlID0gU3Vic3ROYW1lLk1pZChmaW5kICsgMSk7Ci0gICAgICAgIGJIYXNDb21tYSA9IFRSVUU7CisgICAgaWYgKCFiUmV2ZXJ0KSB7CisgICAgICBpZiAoYnNTdHlsZS5MZWZ0KHBTdHlsZS0+bGVuKS5Db21wYXJlKHBTdHlsZS0+c3R5bGUpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CiAgICAgfSBlbHNlIHsKKyAgICAgIGlmIChic1N0eWxlLlJpZ2h0KHBTdHlsZS0+bGVuKS5Db21wYXJlKHBTdHlsZS0+c3R5bGUpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KK0ZYX0JPT0wgQ2hlY2tTdXBwb3J0VGhpcmRQYXJ0Rm9udChDRlhfQnl0ZVN0cmluZyBuYW1lLCBpbnQmIFBpdGNoRmFtaWx5KSB7CisgIGlmIChuYW1lID09IEZYX0JTVFJDKCJNeXJpYWRQcm8iKSkgeworICAgIFBpdGNoRmFtaWx5ICY9IH5GWEZPTlRfRkZfUk9NQU47CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhGVF9GYWNlIENGWF9Gb250TWFwcGVyOjpGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRydWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0YWxpY19hbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgV2luZG93Q1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkgeworICBpZiAoIShmbGFncyAmIEZYRk9OVF9VU0VFWFRFUk5BVFRSKSkgeworICAgIHdlaWdodCA9IEZYRk9OVF9GV19OT1JNQUw7CisgICAgaXRhbGljX2FuZ2xlID0gMDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBTdWJzdE5hbWUgPSBuYW1lOworICBTdWJzdE5hbWUuUmVtb3ZlKDB4MjApOworICBpZiAoYlRydWVUeXBlKSB7CisgICAgaWYgKG5hbWVbMF0gPT0gJ0AnKSB7CisgICAgICBTdWJzdE5hbWUgPSBuYW1lLk1pZCgxKTsKKyAgICB9CisgIH0KKyAgX1BERl9HZXRTdGFuZGFyZEZvbnROYW1lKFN1YnN0TmFtZSk7CisgIGlmIChTdWJzdE5hbWUgPT0gRlhfQlNUUkMoIlN5bWJvbCIpICYmICFiVHJ1ZVR5cGUpIHsKKyAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9ICJDaHJvbWUgU3ltYm9sIjsKKyAgICBwU3Vic3RGb250LT5tX0NoYXJzZXQgPSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQ7CisgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKKyAgICBpZiAobV9Gb3hpdEZhY2VzWzEyXSkgeworICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1sxMl07CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSA9IE5VTEw7CisgICAgRlhfRFdPUkQgc2l6ZSA9IDA7CisgICAgbV9wRm9udE1nci0+R2V0U3RhbmRhcmRGb250KHBGb250RGF0YSwgc2l6ZSwgMTIpOworICAgIG1fRm94aXRGYWNlc1sxMl0gPSBtX3BGb250TWdyLT5HZXRGaXhlZEZhY2UocEZvbnREYXRhLCBzaXplLCAwKTsKKyAgICByZXR1cm4gbV9Gb3hpdEZhY2VzWzEyXTsKKyAgfQorICBpZiAoU3Vic3ROYW1lID09IEZYX0JTVFJDKCJaYXBmRGluZ2JhdHMiKSkgeworICAgIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gIkNocm9tZSBEaW5nYmF0cyI7CisgICAgcFN1YnN0Rm9udC0+bV9DaGFyc2V0ID0gRlhGT05UX1NZTUJPTF9DSEFSU0VUOworICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQ7CisgICAgaWYgKG1fRm94aXRGYWNlc1sxM10pIHsKKyAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbMTNdOworICAgIH0KKyAgICBjb25zdCB1aW50OF90KiBwRm9udERhdGEgPSBOVUxMOworICAgIEZYX0RXT1JEIHNpemUgPSAwOworICAgIG1fcEZvbnRNZ3ItPkdldFN0YW5kYXJkRm9udChwRm9udERhdGEsIHNpemUsIDEzKTsKKyAgICBtX0ZveGl0RmFjZXNbMTNdID0gbV9wRm9udE1nci0+R2V0Rml4ZWRGYWNlKHBGb250RGF0YSwgc2l6ZSwgMCk7CisgICAgcmV0dXJuIG1fRm94aXRGYWNlc1sxM107CisgIH0KKyAgaW50IGlCYXNlRm9udCA9IDA7CisgIENGWF9CeXRlU3RyaW5nIGZhbWlseSwgc3R5bGU7CisgIEZYX0JPT0wgYkhhc0NvbW1hID0gRkFMU0U7CisgIEZYX0JPT0wgYkhhc0h5cGVuID0gRkFMU0U7CisgIGludCBmaW5kID0gU3Vic3ROYW1lLkZpbmQoRlhfQlNUUkMoIiwiKSwgMCk7CisgIGlmIChmaW5kID49IDApIHsKKyAgICBmYW1pbHkgPSBTdWJzdE5hbWUuTGVmdChmaW5kKTsKKyAgICBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUoZmFtaWx5KTsKKyAgICBzdHlsZSA9IFN1YnN0TmFtZS5NaWQoZmluZCArIDEpOworICAgIGJIYXNDb21tYSA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgZmFtaWx5ID0gU3Vic3ROYW1lOworICB9CisgIGZvciAoOyBpQmFzZUZvbnQgPCAxMjsgaUJhc2VGb250KyspCisgICAgaWYgKGZhbWlseSA9PSBDRlhfQnl0ZVN0cmluZ0MoZ19CYXNlMTRGb250TmFtZXNbaUJhc2VGb250XSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgaW50IFBpdGNoRmFtaWx5ID0gMDsKKyAgRlhfQk9PTCBiSXRhbGljID0gRkFMU0U7CisgIEZYX0RXT1JEIG5TdHlsZSA9IDA7CisgIEZYX0JPT0wgYlN0eWxlQXZhaWwgPSBGQUxTRTsKKyAgaWYgKGlCYXNlRm9udCA8IDEyKSB7CisgICAgZmFtaWx5ID0gZ19CYXNlMTRGb250TmFtZXNbaUJhc2VGb250XTsKKyAgICBpZiAoKGlCYXNlRm9udCAlIDQpID09IDEgfHwgKGlCYXNlRm9udCAlIDQpID09IDIpIHsKKyAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0JvbGQ7CisgICAgfQorICAgIGlmICgoaUJhc2VGb250ICUgNCkgLyAyKSB7CisgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9JdGFsaWM7CisgICAgfQorICAgIGlmIChpQmFzZUZvbnQgPCA0KSB7CisgICAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfRklYRURQSVRDSDsKKyAgICB9CisgICAgaWYgKGlCYXNlRm9udCA+PSA4KSB7CisgICAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfUk9NQU47CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghYkhhc0NvbW1hKSB7CisgICAgICBmaW5kID0gZmFtaWx5LlJldmVyc2VGaW5kKCctJyk7CisgICAgICBpZiAoZmluZCA+PSAwKSB7CisgICAgICAgIHN0eWxlID0gZmFtaWx5Lk1pZChmaW5kICsgMSk7CisgICAgICAgIGZhbWlseSA9IGZhbWlseS5MZWZ0KGZpbmQpOworICAgICAgICBiSGFzSHlwZW4gPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWJIYXNIeXBlbikgeworICAgICAgaW50IG5MZW4gPSBmYW1pbHkuR2V0TGVuZ3RoKCk7CisgICAgICBpbnQzMl90IG5SZXQgPSBHZXRTdHlsZVR5cGUoZmFtaWx5LCBUUlVFKTsKKyAgICAgIGlmIChuUmV0ID4gLTEpIHsKKyAgICAgICAgZmFtaWx5ID0gZmFtaWx5LkxlZnQobkxlbiAtIGdfRm9udFN0eWxlc1tuUmV0XS5sZW4pOworICAgICAgICBpZiAoblJldCA9PSAwKSB7CisgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoblJldCA9PSAxKSB7CisgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfSXRhbGljOworICAgICAgICB9CisgICAgICAgIGlmIChuUmV0ID09IDIpIHsKKyAgICAgICAgICBuU3R5bGUgfD0gKEZYX0ZPTlRfU1RZTEVfQm9sZCB8IEZYX0ZPTlRfU1RZTEVfSXRhbGljKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBGWEZPTlRfU0VSSUYpIHsKKyAgICAgIFBpdGNoRmFtaWx5IHw9IEZYRk9OVF9GRl9ST01BTjsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgRlhGT05UX1NDUklQVCkgeworICAgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1NDUklQVDsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgRlhGT05UX0ZJWEVEX1BJVENIKSB7CisgICAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfRklYRURQSVRDSDsKKyAgICB9CisgIH0KKyAgaWYgKCFzdHlsZS5Jc0VtcHR5KCkpIHsKKyAgICBpbnQgbkxlbiA9IHN0eWxlLkdldExlbmd0aCgpOworICAgIGNvbnN0IEZYX0NIQVIqIHBTdHlsZSA9IHN0eWxlOworICAgIGludCBpID0gMDsKKyAgICBGWF9CT09MIGJGaXJzdEl0ZW0gPSBUUlVFOworICAgIENGWF9CeXRlU3RyaW5nIGJ1ZjsKKyAgICB3aGlsZSAoaSA8IG5MZW4pIHsKKyAgICAgIGJ1ZiA9IFBhcnNlU3R5bGUocFN0eWxlLCBuTGVuLCBpKTsKKyAgICAgIGludDMyX3QgblJldCA9IEdldFN0eWxlVHlwZShidWYsIEZBTFNFKTsKKyAgICAgIGlmICgoaSAmJiAhYlN0eWxlQXZhaWwpIHx8ICghaSAmJiBuUmV0IDwgMCkpIHsKICAgICAgICAgZmFtaWx5ID0gU3Vic3ROYW1lOwotICAgIH0KLSAgICBmb3IgKDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCArKykKLSAgICAgICAgaWYgKGZhbWlseSA9PSBDRlhfQnl0ZVN0cmluZ0MoZ19CYXNlMTRGb250TmFtZXNbaUJhc2VGb250XSkpIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpQmFzZUZvbnQgPSAxMjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgaWYgKG5SZXQgPj0gMCkgeworICAgICAgICBiU3R5bGVBdmFpbCA9IFRSVUU7CisgICAgICB9CisgICAgICBpZiAoblJldCA9PSAwKSB7CisgICAgICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGQpIHsKKyAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9Cb2xkQm9sZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9Cb2xkOwogICAgICAgICB9Ci0gICAgaW50IFBpdGNoRmFtaWx5ID0gMDsKLSAgICBGWF9CT09MIGJJdGFsaWMgPSBGQUxTRTsKLSAgICBGWF9EV09SRCBuU3R5bGUgPSAwOwotICAgIEZYX0JPT0wgYlN0eWxlQXZhaWwgPSBGQUxTRTsKKyAgICAgICAgYkZpcnN0SXRlbSA9IEZBTFNFOworICAgICAgfQorICAgICAgaWYgKG5SZXQgPT0gMSkgeworICAgICAgICBpZiAoYkZpcnN0SXRlbSkgeworICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0l0YWxpYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmYW1pbHkgPSBTdWJzdE5hbWU7CisgICAgICAgICAgaUJhc2VGb250ID0gMTI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoblJldCA9PSAyKSB7CisgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0l0YWxpYzsKKyAgICAgICAgaWYgKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZCkgeworICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0JvbGRCb2xkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0JvbGQ7CisgICAgICAgIH0KKyAgICAgICAgYkZpcnN0SXRlbSA9IEZBTFNFOworICAgICAgfQorICAgICAgaSArPSBidWYuR2V0TGVuZ3RoKCkgKyAxOworICAgIH0KKyAgfQorICB3ZWlnaHQgPSB3ZWlnaHQgPyB3ZWlnaHQgOiBGWEZPTlRfRldfTk9STUFMOworICBpbnQgb2xkX3dlaWdodCA9IHdlaWdodDsKKyAgaWYgKG5TdHlsZSkgeworICAgIHdlaWdodCA9CisgICAgICAgIG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZEJvbGQKKyAgICAgICAgICAgID8gOTAwCisgICAgICAgICAgICA6IChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGQgPyBGWEZPTlRfRldfQk9MRCA6IEZYRk9OVF9GV19OT1JNQUwpOworICB9CisgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0l0YWxpYykgeworICAgIGJJdGFsaWMgPSBUUlVFOworICB9CisgIEZYX0JPT0wgYkNKSyA9IEZBTFNFOworICBpbnQgaUV4YWN0ID0gMDsKKyAgaW50IENoYXJzZXQgPSBGWEZPTlRfQU5TSV9DSEFSU0VUOworICBpZiAoV2luZG93Q1ApIHsKKyAgICBDaGFyc2V0ID0gX0dldENoYXJzZXRGcm9tQ29kZVBhZ2UoV2luZG93Q1ApOworICB9IGVsc2UgaWYgKGlCYXNlRm9udCA9PSAxMiAmJiAoZmxhZ3MgJiBGWEZPTlRfU1lNQk9MSUMpKSB7CisgICAgQ2hhcnNldCA9IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVDsKKyAgfQorICBpZiAoQ2hhcnNldCA9PSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCB8fCBDaGFyc2V0ID09IEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCB8fAorICAgICAgQ2hhcnNldCA9PSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUIHx8CisgICAgICBDaGFyc2V0ID09IEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUKSB7CisgICAgYkNKSyA9IFRSVUU7CisgIH0KKyAgaWYgKG1fcEZvbnRJbmZvID09IE5VTEwpIHsKKyAgICBwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX1NUQU5EQVJEOworICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpdGNoRmFtaWx5KTsKKyAgfQorICBmYW1pbHkgPSBfR2V0Rm9udEZhbWlseShmYW1pbHksIG5TdHlsZSk7CisgIENGWF9CeXRlU3RyaW5nIG1hdGNoID0gTWF0Y2hJbnN0YWxsZWRGb250cyhfVFRfTm9ybWFsaXplTmFtZShmYW1pbHkpKTsKKyAgaWYgKG1hdGNoLklzRW1wdHkoKSAmJiBmYW1pbHkgIT0gU3Vic3ROYW1lICYmCisgICAgICAoIWJIYXNDb21tYSAmJiAoIWJIYXNIeXBlbiB8fCAoYkhhc0h5cGVuICYmICFiU3R5bGVBdmFpbCkpKSkgeworICAgIG1hdGNoID0gTWF0Y2hJbnN0YWxsZWRGb250cyhfVFRfTm9ybWFsaXplTmFtZShTdWJzdE5hbWUpKTsKKyAgfQorICBpZiAobWF0Y2guSXNFbXB0eSgpICYmIGlCYXNlRm9udCA+PSAxMikgeworICAgIGlmICghYkNKSykgeworICAgICAgaWYgKCFDaGVja1N1cHBvcnRUaGlyZFBhcnRGb250KGZhbWlseSwgUGl0Y2hGYW1pbHkpKSB7CisgICAgICAgIGlmIChpdGFsaWNfYW5nbGUgIT0gMCkgeworICAgICAgICAgIGJJdGFsaWMgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJJdGFsaWMgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICB3ZWlnaHQgPSBvbGRfd2VpZ2h0OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwU3Vic3RGb250LT5tX2JTdWJzdE9mQ0pLID0gVFJVRTsKKyAgICAgIGlmIChuU3R5bGUpIHsKKyAgICAgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHRDSksgPSB3ZWlnaHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBwU3Vic3RGb250LT5tX1dlaWdodENKSyA9IEZYRk9OVF9GV19OT1JNQUw7CisgICAgICB9CisgICAgICBpZiAoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9JdGFsaWMpIHsKKyAgICAgICAgcFN1YnN0Rm9udC0+bV9iSXRsaWNDSksgPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpdGFsaWNfYW5nbGUgPSAwOworICAgIHdlaWdodCA9CisgICAgICAgIG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZEJvbGQKKyAgICAgICAgICAgID8gOTAwCisgICAgICAgICAgICA6IChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGQgPyBGWEZPTlRfRldfQk9MRCA6IEZYRk9OVF9GV19OT1JNQUwpOworICB9CisgIGlmICghbWF0Y2guSXNFbXB0eSgpIHx8IGlCYXNlRm9udCA8IDEyKSB7CisgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9FWEFDVDsKKyAgICBpZiAoIW1hdGNoLklzRW1wdHkoKSkgeworICAgICAgZmFtaWx5ID0gbWF0Y2g7CisgICAgfQogICAgIGlmIChpQmFzZUZvbnQgPCAxMikgeworICAgICAgaWYgKG5TdHlsZSAmJiAhKGlCYXNlRm9udCAlIDQpKSB7CisgICAgICAgIGlmICgoblN0eWxlICYgMHgzKSA9PSAxKSB7CisgICAgICAgICAgaUJhc2VGb250ICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChuU3R5bGUgJiAweDMpID09IDIpIHsKKyAgICAgICAgICBpQmFzZUZvbnQgKz0gMzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG5TdHlsZSAmIDB4MykgPT0gMykgeworICAgICAgICAgIGlCYXNlRm9udCArPSAyOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobV9wRm9udE1nci0+bV9FeHRlcm5hbEZvbnRzW2lCYXNlRm9udF0ubV9wRm9udERhdGEpIHsKKyAgICAgICAgaWYgKG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdKSB7CisgICAgICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdOworICAgICAgICB9CisgICAgICAgIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdID0gbV9wRm9udE1nci0+R2V0Rml4ZWRGYWNlKAorICAgICAgICAgICAgbV9wRm9udE1nci0+bV9FeHRlcm5hbEZvbnRzW2lCYXNlRm9udF0ubV9wRm9udERhdGEsCisgICAgICAgICAgICBtX3BGb250TWdyLT5tX0V4dGVybmFsRm9udHNbaUJhc2VGb250XS5tX2R3U2l6ZSwgMCk7CisgICAgICAgIGlmIChtX0ZveGl0RmFjZXNbaUJhc2VGb250XSkgeworICAgICAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbaUJhc2VGb250XTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKICAgICAgICAgZmFtaWx5ID0gZ19CYXNlMTRGb250TmFtZXNbaUJhc2VGb250XTsKLSAgICAgICAgaWYgKChpQmFzZUZvbnQgJSA0KSA9PSAxIHx8IChpQmFzZUZvbnQgJSA0KSA9PSAyKSB7Ci0gICAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9Cb2xkOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoaUJhc2VGb250ICUgNCkgLyAyKSB7Ci0gICAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9JdGFsaWM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlCYXNlRm9udCA8IDQpIHsKLSAgICAgICAgICAgIFBpdGNoRmFtaWx5IHw9IEZYRk9OVF9GRl9GSVhFRFBJVENIOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpQmFzZUZvbnQgPj0gOCkgewotICAgICAgICAgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1JPTUFOOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFiSGFzQ29tbWEpIHsKLSAgICAgICAgICAgIGZpbmQgPSBmYW1pbHkuUmV2ZXJzZUZpbmQoJy0nKTsKLSAgICAgICAgICAgIGlmIChmaW5kID49IDApIHsKLSAgICAgICAgICAgICAgICBzdHlsZSA9IGZhbWlseS5NaWQoZmluZCArIDEpOwotICAgICAgICAgICAgICAgIGZhbWlseSA9IGZhbWlseS5MZWZ0KGZpbmQpOwotICAgICAgICAgICAgICAgIGJIYXNIeXBlbiA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiSGFzSHlwZW4pIHsKLSAgICAgICAgICAgIGludCBuTGVuID0gZmFtaWx5LkdldExlbmd0aCgpOwotICAgICAgICAgICAgaW50MzJfdCBuUmV0ID0gR2V0U3R5bGVUeXBlKGZhbWlseSwgVFJVRSk7Ci0gICAgICAgICAgICBpZiAoblJldCA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgZmFtaWx5ID0gZmFtaWx5LkxlZnQobkxlbiAtIGdfRm9udFN0eWxlc1tuUmV0XS5sZW4pOwotICAgICAgICAgICAgICAgIGlmIChuUmV0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG5SZXQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9JdGFsaWM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuUmV0ID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgblN0eWxlIHw9IChGWF9GT05UX1NUWUxFX0JvbGQgfCBGWF9GT05UX1NUWUxFX0l0YWxpYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmbGFncyAmIEZYRk9OVF9TRVJJRikgewotICAgICAgICAgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1JPTUFOOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmbGFncyAmIEZYRk9OVF9TQ1JJUFQpIHsKLSAgICAgICAgICAgIFBpdGNoRmFtaWx5IHw9IEZYRk9OVF9GRl9TQ1JJUFQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZsYWdzICYgRlhGT05UX0ZJWEVEX1BJVENIKSB7Ci0gICAgICAgICAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfRklYRURQSVRDSDsKLSAgICAgICAgfQorICAgICAgfQorICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKICAgICB9Ci0gICAgaWYgKCFzdHlsZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgaW50IG5MZW4gPSBzdHlsZS5HZXRMZW5ndGgoKTsKLSAgICAgICAgY29uc3QgRlhfQ0hBUiogcFN0eWxlID0gc3R5bGU7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgRlhfQk9PTCBiRmlyc3RJdGVtID0gVFJVRTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnVmOwotICAgICAgICB3aGlsZSAoaSA8IG5MZW4pIHsKLSAgICAgICAgICAgIGJ1ZiA9IFBhcnNlU3R5bGUocFN0eWxlLCBuTGVuLCBpKTsKLSAgICAgICAgICAgIGludDMyX3QgblJldCA9IEdldFN0eWxlVHlwZShidWYsIEZBTFNFKTsKLSAgICAgICAgICAgIGlmICgoaSAmJiAhYlN0eWxlQXZhaWwpIHx8ICghaSAmJiBuUmV0IDwgMCkpIHsKLSAgICAgICAgICAgICAgICBmYW1pbHkgPSBTdWJzdE5hbWU7Ci0gICAgICAgICAgICAgICAgaUJhc2VGb250ID0gMTI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5SZXQgPj0gMCkgewotICAgICAgICAgICAgICAgIGJTdHlsZUF2YWlsID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuUmV0ID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0JvbGRCb2xkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0JvbGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJGaXJzdEl0ZW0gPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuUmV0ID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoYkZpcnN0SXRlbSkgewotICAgICAgICAgICAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9JdGFsaWM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gU3Vic3ROYW1lOwotICAgICAgICAgICAgICAgICAgICBpQmFzZUZvbnQgPSAxMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoblJldCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfSXRhbGljOwotICAgICAgICAgICAgICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZEJvbGQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYkZpcnN0SXRlbSA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSArPSBidWYuR2V0TGVuZ3RoKCkgKyAxOwotICAgICAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGZsYWdzICYgRlhGT05UX0lUQUxJQykgeworICAgICAgYkl0YWxpYyA9IFRSVUU7CiAgICAgfQotICAgIHdlaWdodCA9IHdlaWdodCA/IHdlaWdodCA6IEZYRk9OVF9GV19OT1JNQUw7Ci0gICAgaW50IG9sZF93ZWlnaHQgPSB3ZWlnaHQ7Ci0gICAgaWYgKG5TdHlsZSkgewotICAgICAgICB3ZWlnaHQgPSBuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGRCb2xkID8gOTAwIDogKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZCA/IEZYRk9OVF9GV19CT0xEIDogRlhGT05UX0ZXX05PUk1BTCk7CisgIH0KKyAgaUV4YWN0ID0gIW1hdGNoLklzRW1wdHkoKTsKKyAgdm9pZCogaEZvbnQgPSBtX3BGb250SW5mby0+TWFwRm9udCh3ZWlnaHQsIGJJdGFsaWMsIENoYXJzZXQsIFBpdGNoRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSwgaUV4YWN0KTsKKyAgaWYgKGlFeGFjdCkgeworICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfRVhBQ1Q7CisgIH0KKyAgaWYgKGhGb250ID09IE5VTEwpIHsKKyAgICBpZiAoZmxhZ3MgJiBGWEZPTlRfRVhBQ1RNQVRDSCkgeworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0l0YWxpYykgeworICAgIGlmIChiQ0pLKSB7CisgICAgICBpZiAoaXRhbGljX2FuZ2xlICE9IDApIHsKICAgICAgICAgYkl0YWxpYyA9IFRSVUU7CisgICAgICB9IGVsc2UgeworICAgICAgICBiSXRhbGljID0gRkFMU0U7CisgICAgICB9CisgICAgICB3ZWlnaHQgPSBvbGRfd2VpZ2h0OwogICAgIH0KLSAgICBGWF9CT09MIGJDSksgPSBGQUxTRTsKLSAgICBpbnQgaUV4YWN0ID0gMDsKLSAgICBpbnQgQ2hhcnNldCA9IEZYRk9OVF9BTlNJX0NIQVJTRVQ7Ci0gICAgaWYgKFdpbmRvd0NQKSB7Ci0gICAgICAgIENoYXJzZXQgPSBfR2V0Q2hhcnNldEZyb21Db2RlUGFnZShXaW5kb3dDUCk7Ci0gICAgfSBlbHNlIGlmIChpQmFzZUZvbnQgPT0gMTIgJiYgKGZsYWdzICYgRlhGT05UX1NZTUJPTElDKSkgewotICAgICAgICBDaGFyc2V0ID0gRlhGT05UX1NZTUJPTF9DSEFSU0VUOwotICAgIH0KLSAgICBpZiAoQ2hhcnNldCA9PSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCB8fCBDaGFyc2V0ID09IEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCB8fAotICAgICAgICAgICAgQ2hhcnNldCA9PSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUIHx8IENoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpIHsKLSAgICAgICAgYkNKSyA9IFRSVUU7Ci0gICAgfQotICAgIGlmIChtX3BGb250SW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQ7Ci0gICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LCBQaXRjaEZhbWlseSk7Ci0gICAgfQotICAgIGZhbWlseSA9IF9HZXRGb250RmFtaWx5KGZhbWlseSwgblN0eWxlKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBtYXRjaCA9IE1hdGNoSW5zdGFsbGVkRm9udHMoX1RUX05vcm1hbGl6ZU5hbWUoZmFtaWx5KSk7Ci0gICAgaWYgKG1hdGNoLklzRW1wdHkoKSAmJiBmYW1pbHkgIT0gU3Vic3ROYW1lICYmICghYkhhc0NvbW1hICYmICghYkhhc0h5cGVuIHx8IChiSGFzSHlwZW4gJiYgIWJTdHlsZUF2YWlsKSkpKSB7Ci0gICAgICAgIG1hdGNoID0gTWF0Y2hJbnN0YWxsZWRGb250cyhfVFRfTm9ybWFsaXplTmFtZShTdWJzdE5hbWUpKTsKLSAgICB9Ci0gICAgaWYgKG1hdGNoLklzRW1wdHkoKSAmJiBpQmFzZUZvbnQgPj0gMTIpIHsKLSAgICAgICAgaWYgKCFiQ0pLKSB7Ci0gICAgICAgICAgICBpZiAoIUNoZWNrU3VwcG9ydFRoaXJkUGFydEZvbnQoZmFtaWx5LCBQaXRjaEZhbWlseSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXRhbGljX2FuZ2xlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYkl0YWxpYyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYkl0YWxpYyA9IEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3ZWlnaHQgPSBvbGRfd2VpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9iU3Vic3RPZkNKSyA9IFRSVUU7Ci0gICAgICAgICAgICBpZiAoblN0eWxlKSB7Ci0gICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHRDSksgPSB3ZWlnaHQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fV2VpZ2h0Q0pLID0gRlhGT05UX0ZXX05PUk1BTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0l0YWxpYykgewotICAgICAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fYkl0bGljQ0pLID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIGlmICghbWF0Y2guSXNFbXB0eSgpKSB7CisgICAgICBoRm9udCA9IG1fcEZvbnRJbmZvLT5HZXRGb250KG1hdGNoKTsKKyAgICAgIGlmIChoRm9udCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXRjaEZhbWlseSk7CisgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaXRhbGljX2FuZ2xlID0gMDsKLSAgICAgICAgd2VpZ2h0ID0gblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkQm9sZCA/IDkwMCA6IChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGQgPyBGWEZPTlRfRldfQk9MRCA6IEZYRk9OVF9GV19OT1JNQUwpOwotICAgIH0KLSAgICBpZiAoIW1hdGNoLklzRW1wdHkoKSB8fCBpQmFzZUZvbnQgPCAxMikgewotICAgICAgICBwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX0VYQUNUOwotICAgICAgICBpZiAoIW1hdGNoLklzRW1wdHkoKSkgewotICAgICAgICAgICAgZmFtaWx5ID0gbWF0Y2g7CisgICAgICBpZiAoQ2hhcnNldCA9PSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQpIHsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCBcCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXworICAgICAgICBpZiAoU3Vic3ROYW1lID09IEZYX0JTVFJDKCJTeW1ib2wiKSkgeworICAgICAgICAgIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gIkNocm9tZSBTeW1ib2wiOworICAgICAgICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQ7CisgICAgICAgICAgcFN1YnN0Rm9udC0+bV9DaGFyc2V0ID0gRlhGT05UX1NZTUJPTF9DSEFSU0VUOworICAgICAgICAgIGlmIChtX0ZveGl0RmFjZXNbMTJdKSB7CisgICAgICAgICAgICByZXR1cm4gbV9Gb3hpdEZhY2VzWzEyXTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29uc3QgdWludDhfdCogcEZvbnREYXRhID0gTlVMTDsKKyAgICAgICAgICBGWF9EV09SRCBzaXplID0gMDsKKyAgICAgICAgICBtX3BGb250TWdyLT5HZXRTdGFuZGFyZEZvbnQocEZvbnREYXRhLCBzaXplLCAxMik7CisgICAgICAgICAgbV9Gb3hpdEZhY2VzWzEyXSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOworICAgICAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbMTJdOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpQmFzZUZvbnQgPCAxMikgewotICAgICAgICAgICAgaWYgKG5TdHlsZSAmJiAhKGlCYXNlRm9udCAlIDQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChuU3R5bGUgJiAweDMpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaUJhc2VGb250ICs9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoblN0eWxlICYgMHgzKSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlCYXNlRm9udCArPSAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKG5TdHlsZSAmIDB4MykgPT0gMykgewotICAgICAgICAgICAgICAgICAgICBpQmFzZUZvbnQgKz0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wRm9udE1nci0+bV9FeHRlcm5hbEZvbnRzW2lCYXNlRm9udF0ubV9wRm9udERhdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9Gb3hpdEZhY2VzW2lCYXNlRm9udF0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX0ZveGl0RmFjZXNbaUJhc2VGb250XSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShtX3BGb250TWdyLT5tX0V4dGVybmFsRm9udHNbaUJhc2VGb250XS5tX3BGb250RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnRNZ3ItPm1fRXh0ZXJuYWxGb250c1tpQmFzZUZvbnRdLm1fZHdTaXplLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAobV9Gb3hpdEZhY2VzW2lCYXNlRm9udF0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFtaWx5ID0gZ19CYXNlMTRGb250TmFtZXNbaUJhc2VGb250XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoZmxhZ3MgJiBGWEZPTlRfSVRBTElDKSB7Ci0gICAgICAgICAgICBiSXRhbGljID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpRXhhY3QgPSAhbWF0Y2guSXNFbXB0eSgpOwotICAgIHZvaWQqIGhGb250ID0gbV9wRm9udEluZm8tPk1hcEZvbnQod2VpZ2h0LCBiSXRhbGljLCBDaGFyc2V0LCBQaXRjaEZhbWlseSwgZmFtaWx5LCBpRXhhY3QpOwotICAgIGlmIChpRXhhY3QpIHsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9FWEFDVDsKLSAgICB9Ci0gICAgaWYgKGhGb250ID09IE5VTEwpIHsKLSAgICAgICAgaWYgKGZsYWdzICYgRlhGT05UX0VYQUNUTUFUQ0gpIHsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiQ0pLKSB7Ci0gICAgICAgICAgICBpZiAoaXRhbGljX2FuZ2xlICE9IDApIHsKLSAgICAgICAgICAgICAgICBiSXRhbGljID0gVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYkl0YWxpYyA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2VpZ2h0ID0gb2xkX3dlaWdodDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1hdGNoLklzRW1wdHkoKSkgewotICAgICAgICAgICAgaEZvbnQgPSBtX3BGb250SW5mby0+R2V0Rm9udChtYXRjaCk7Ci0gICAgICAgICAgICBpZiAoaEZvbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LCBQaXRjaEZhbWlseSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoQ2hhcnNldCA9PSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQpIHsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8gfHwgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQU5EUk9JRF8KLSAgICAgICAgICAgICAgICBpZiAoU3Vic3ROYW1lID09IEZYX0JTVFJDKCJTeW1ib2wiKSkgewotICAgICAgICAgICAgICAgICAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9ICJDaHJvbWUgU3ltYm9sIjsKLSAgICAgICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKLSAgICAgICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9DaGFyc2V0ID0gRlhGT05UX1NZTUJPTF9DSEFSU0VUOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9Gb3hpdEZhY2VzWzEyXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1sxMl07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcEZvbnREYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG1fcEZvbnRNZ3ItPkdldFN0YW5kYXJkRm9udChwRm9udERhdGEsIHNpemUsIDEyKTsKLSAgICAgICAgICAgICAgICAgICAgbV9Gb3hpdEZhY2VzWzEyXSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9Gb3hpdEZhY2VzWzEyXTsKLSAgICAgICAgICAgICAgICB9CiAjZW5kaWYKLSAgICAgICAgICAgICAgICBwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX05PTlNZTUJPTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gRmluZFN1YnN0Rm9udChmYW1pbHksIGJUcnVlVHlwZSwgZmxhZ3MgJiB+RlhGT05UX1NZTUJPTElDLCB3ZWlnaHQsIGl0YWxpY19hbmdsZSwgMCwgcFN1YnN0Rm9udCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoQ2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUKSB7Ci0gICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKLSAgICAgICAgICAgICAgICByZXR1cm4gVXNlSW50ZXJuYWxTdWJzdChwU3Vic3RGb250LCBpQmFzZUZvbnQsIGl0YWxpY19hbmdsZSwgb2xkX3dlaWdodCwgUGl0Y2hGYW1pbHkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGluZGV4ID0gbV9DaGFyc2V0QXJyYXkuRmluZChDaGFyc2V0KTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVXNlSW50ZXJuYWxTdWJzdChwU3Vic3RGb250LCBpQmFzZUZvbnQsIGl0YWxpY19hbmdsZSwgb2xkX3dlaWdodCwgUGl0Y2hGYW1pbHkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaEZvbnQgPSBtX3BGb250SW5mby0+R2V0Rm9udChtX0ZhY2VBcnJheVtpbmRleF0pOwotICAgICAgICB9CisgICAgICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfTk9OU1lNQk9MOworICAgICAgICByZXR1cm4gRmluZFN1YnN0Rm9udChmYW1pbHksIGJUcnVlVHlwZSwgZmxhZ3MgJiB+RlhGT05UX1NZTUJPTElDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQsIGl0YWxpY19hbmdsZSwgMCwgcFN1YnN0Rm9udCk7CisgICAgICB9CisgICAgICBpZiAoQ2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUKSB7CisgICAgICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQ7CisgICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXRjaEZhbWlseSk7CisgICAgICB9CisgICAgICBpbnQgaW5kZXggPSBtX0NoYXJzZXRBcnJheS5GaW5kKENoYXJzZXQpOworICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gVXNlSW50ZXJuYWxTdWJzdChwU3Vic3RGb250LCBpQmFzZUZvbnQsIGl0YWxpY19hbmdsZSwgb2xkX3dlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl0Y2hGYW1pbHkpOworICAgICAgfQorICAgICAgaEZvbnQgPSBtX3BGb250SW5mby0+R2V0Rm9udChtX0ZhY2VBcnJheVtpbmRleF0pOwogICAgIH0KLSAgICBwU3Vic3RGb250LT5tX0V4dEhhbmRsZSA9IG1fcEZvbnRJbmZvLT5SZXRhaW5Gb250KGhGb250KTsKLSAgICBpZiAoaEZvbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbV9wRm9udEluZm8tPkdldEZhY2VOYW1lKGhGb250LCBTdWJzdE5hbWUpOwotICAgIGlmIChDaGFyc2V0ID09IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQpIHsKLSAgICAgICAgbV9wRm9udEluZm8tPkdldEZvbnRDaGFyc2V0KGhGb250LCBDaGFyc2V0KTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgdHRjX3NpemUgPSBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDB4NzQ3NDYzNjYsIE5VTEwsIDApOwotICAgIEZYX0RXT1JEIGZvbnRfc2l6ZSA9IG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMCwgTlVMTCwgMCk7Ci0gICAgaWYoZm9udF9zaXplID09IDAgJiYgdHRjX3NpemUgPT0gMCkgewotICAgICAgICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWEZUX0ZhY2UgZmFjZSA9IE5VTEw7Ci0gICAgaWYgKHR0Y19zaXplKSB7Ci0gICAgICAgIHVpbnQ4X3QgdGVtcFsxMDI0XTsKLSAgICAgICAgbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAweDc0NzQ2MzY2LCB0ZW1wLCAxMDI0KTsKLSAgICAgICAgRlhfRFdPUkQgY2hlY2tzdW0gPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgY2hlY2tzdW0gKz0gKChGWF9EV09SRCopdGVtcClbaV07Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCogcEZvbnREYXRhOwotICAgICAgICBmYWNlID0gbV9wRm9udE1nci0+R2V0Q2FjaGVkVFRDRmFjZSh0dGNfc2l6ZSwgY2hlY2tzdW0sIHR0Y19zaXplIC0gZm9udF9zaXplLCBwRm9udERhdGEpOwotICAgICAgICBpZiAoZmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBwRm9udERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCB0dGNfc2l6ZSk7Ci0gICAgICAgICAgICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDB4NzQ3NDYzNjYsIHBGb250RGF0YSwgdHRjX3NpemUpOwotICAgICAgICAgICAgZmFjZSA9IG1fcEZvbnRNZ3ItPkFkZENhY2hlZFRUQ0ZhY2UodHRjX3NpemUsIGNoZWNrc3VtLCBwRm9udERhdGEsIHR0Y19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRjX3NpemUgLSBmb250X3NpemUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdWludDhfdCogcEZvbnREYXRhOwotICAgICAgICBmYWNlID0gbV9wRm9udE1nci0+R2V0Q2FjaGVkRmFjZShTdWJzdE5hbWUsIHdlaWdodCwgYkl0YWxpYywgcEZvbnREYXRhKTsKLSAgICAgICAgaWYgKGZhY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgcEZvbnREYXRhID0gRlhfQWxsb2ModWludDhfdCwgZm9udF9zaXplKTsKLSAgICAgICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMCwgcEZvbnREYXRhLCBmb250X3NpemUpOwotICAgICAgICAgICAgZmFjZSA9IG1fcEZvbnRNZ3ItPkFkZENhY2hlZEZhY2UoU3Vic3ROYW1lLCB3ZWlnaHQsIGJJdGFsaWMsIHBGb250RGF0YSwgZm9udF9zaXplLCBtX3BGb250SW5mby0+R2V0RmFjZUluZGV4KGhGb250KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZhY2UgPT0gTlVMTCkgewotICAgICAgICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9IFN1YnN0TmFtZTsKLSAgICBwU3Vic3RGb250LT5tX0NoYXJzZXQgPSBDaGFyc2V0OwotICAgIEZYX0JPT0wgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKLSAgICBpZiAoRlhGVF9Jc19GYWNlX0JvbGQoZmFjZSkpIHsKLSAgICAgICAgaWYgKHdlaWdodCA9PSBGWEZPTlRfRldfQk9MRCkgewotICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICh3ZWlnaHQgPT0gRlhGT05UX0ZXX05PUk1BTCkgewotICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYk5lZWRVcGRhdGVXZWlnaHQpIHsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHQgPSB3ZWlnaHQ7Ci0gICAgfQotICAgIGlmIChiSXRhbGljICYmICFGWEZUX0lzX0ZhY2VfSXRhbGljKGZhY2UpKSB7Ci0gICAgICAgIGlmIChpdGFsaWNfYW5nbGUgPT0gMCkgewotICAgICAgICAgICAgaXRhbGljX2FuZ2xlID0gLTEyOwotICAgICAgICB9IGVsc2UgaWYgKEZYU1lTX2FicyhpdGFsaWNfYW5nbGUpIDwgNSkgewotICAgICAgICAgICAgaXRhbGljX2FuZ2xlID0gMDsKLSAgICAgICAgfQotICAgICAgICBwU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlID0gaXRhbGljX2FuZ2xlOwotICAgIH0KKyAgfQorICBwU3Vic3RGb250LT5tX0V4dEhhbmRsZSA9IG1fcEZvbnRJbmZvLT5SZXRhaW5Gb250KGhGb250KTsKKyAgaWYgKGhGb250ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBtX3BGb250SW5mby0+R2V0RmFjZU5hbWUoaEZvbnQsIFN1YnN0TmFtZSk7CisgIGlmIChDaGFyc2V0ID09IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQpIHsKKyAgICBtX3BGb250SW5mby0+R2V0Rm9udENoYXJzZXQoaEZvbnQsIENoYXJzZXQpOworICB9CisgIEZYX0RXT1JEIHR0Y19zaXplID0gbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAweDc0NzQ2MzY2LCBOVUxMLCAwKTsKKyAgRlhfRFdPUkQgZm9udF9zaXplID0gbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAwLCBOVUxMLCAwKTsKKyAgaWYgKGZvbnRfc2l6ZSA9PSAwICYmIHR0Y19zaXplID09IDApIHsKICAgICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7Ci0gICAgcmV0dXJuIGZhY2U7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhGVF9GYWNlIGZhY2UgPSBOVUxMOworICBpZiAodHRjX3NpemUpIHsKKyAgICB1aW50OF90IHRlbXBbMTAyNF07CisgICAgbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAweDc0NzQ2MzY2LCB0ZW1wLCAxMDI0KTsKKyAgICBGWF9EV09SRCBjaGVja3N1bSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgY2hlY2tzdW0gKz0gKChGWF9EV09SRCopdGVtcClbaV07CisgICAgfQorICAgIHVpbnQ4X3QqIHBGb250RGF0YTsKKyAgICBmYWNlID0gbV9wRm9udE1nci0+R2V0Q2FjaGVkVFRDRmFjZSh0dGNfc2l6ZSwgY2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRjX3NpemUgLSBmb250X3NpemUsIHBGb250RGF0YSk7CisgICAgaWYgKGZhY2UgPT0gTlVMTCkgeworICAgICAgcEZvbnREYXRhID0gRlhfQWxsb2ModWludDhfdCwgdHRjX3NpemUpOworICAgICAgbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAweDc0NzQ2MzY2LCBwRm9udERhdGEsIHR0Y19zaXplKTsKKyAgICAgIGZhY2UgPSBtX3BGb250TWdyLT5BZGRDYWNoZWRUVENGYWNlKHR0Y19zaXplLCBjaGVja3N1bSwgcEZvbnREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRjX3NpemUsIHR0Y19zaXplIC0gZm9udF9zaXplKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogcEZvbnREYXRhOworICAgIGZhY2UgPSBtX3BGb250TWdyLT5HZXRDYWNoZWRGYWNlKFN1YnN0TmFtZSwgd2VpZ2h0LCBiSXRhbGljLCBwRm9udERhdGEpOworICAgIGlmIChmYWNlID09IE5VTEwpIHsKKyAgICAgIHBGb250RGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIGZvbnRfc2l6ZSk7CisgICAgICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDAsIHBGb250RGF0YSwgZm9udF9zaXplKTsKKyAgICAgIGZhY2UgPSBtX3BGb250TWdyLT5BZGRDYWNoZWRGYWNlKFN1YnN0TmFtZSwgd2VpZ2h0LCBiSXRhbGljLCBwRm9udERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250SW5mby0+R2V0RmFjZUluZGV4KGhGb250KSk7CisgICAgfQorICB9CisgIGlmIChmYWNlID09IE5VTEwpIHsKKyAgICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSBTdWJzdE5hbWU7CisgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IENoYXJzZXQ7CisgIEZYX0JPT0wgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKKyAgaWYgKEZYRlRfSXNfRmFjZV9Cb2xkKGZhY2UpKSB7CisgICAgaWYgKHdlaWdodCA9PSBGWEZPTlRfRldfQk9MRCkgeworICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBUUlVFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAod2VpZ2h0ID09IEZYRk9OVF9GV19OT1JNQUwpIHsKKyAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gVFJVRTsKKyAgICB9CisgIH0KKyAgaWYgKGJOZWVkVXBkYXRlV2VpZ2h0KSB7CisgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHQgPSB3ZWlnaHQ7CisgIH0KKyAgaWYgKGJJdGFsaWMgJiYgIUZYRlRfSXNfRmFjZV9JdGFsaWMoZmFjZSkpIHsKKyAgICBpZiAoaXRhbGljX2FuZ2xlID09IDApIHsKKyAgICAgIGl0YWxpY19hbmdsZSA9IC0xMjsKKyAgICB9IGVsc2UgaWYgKEZYU1lTX2FicyhpdGFsaWNfYW5nbGUpIDwgNSkgeworICAgICAgaXRhbGljX2FuZ2xlID0gMDsKKyAgICB9CisgICAgcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZSA9IGl0YWxpY19hbmdsZTsKKyAgfQorICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7CisgIHJldHVybiBmYWNlOwogfQotRlhGVF9GYWNlIENGWF9Gb250TWFwcGVyOjpGaW5kU3Vic3RGb250QnlVbmljb2RlKEZYX0RXT1JEIGR3VW5pY29kZSwgRlhfRFdPUkQgZmxhZ3MsIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUpDQotew0KLSAgICBpZiAobV9wRm9udEluZm8gPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiSXRhbGljID0gKGZsYWdzICYgRlhGT05UX0lUQUxJQykgIT0gMDsNCi0gICAgaW50IFBpdGNoRmFtaWx5ID0gMDsNCi0gICAgaWYgKGZsYWdzICYgRlhGT05UX1NFUklGKSB7DQotICAgICAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfUk9NQU47DQotICAgIH0NCi0gICAgaWYgKGZsYWdzICYgRlhGT05UX1NDUklQVCkgew0KLSAgICAgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1NDUklQVDsNCi0gICAgfQ0KLSAgICBpZiAoZmxhZ3MgJiBGWEZPTlRfRklYRURfUElUQ0gpIHsNCi0gICAgICAgIFBpdGNoRmFtaWx5IHw9IEZYRk9OVF9GRl9GSVhFRFBJVENIOw0KLSAgICB9DQotICAgIHZvaWQqIGhGb250ID0gbV9wRm9udEluZm8tPk1hcEZvbnRCeVVuaWNvZGUoZHdVbmljb2RlLCB3ZWlnaHQsIGJJdGFsaWMsIFBpdGNoRmFtaWx5KTsNCi0gICAgaWYgKGhGb250ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIHR0Y19zaXplID0gbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAweDc0NzQ2MzY2LCBOVUxMLCAwKTsNCi0gICAgRlhfRFdPUkQgZm9udF9zaXplID0gbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAwLCBOVUxMLCAwKTsNCi0gICAgaWYoZm9udF9zaXplID09IDAgJiYgdHRjX3NpemUgPT0gMCkgew0KLSAgICAgICAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgRlhGVF9GYWNlIGZhY2UgPSBOVUxMOw0KLSAgICBpZiAodHRjX3NpemUpIHsNCi0gICAgICAgIHVpbnQ4X3QgdGVtcFsxMDI0XTsNCi0gICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMHg3NDc0NjM2NiwgdGVtcCwgMTAyNCk7DQotICAgICAgICBGWF9EV09SRCBjaGVja3N1bSA9IDA7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgew0KLSAgICAgICAgICAgIGNoZWNrc3VtICs9ICgoRlhfRFdPUkQqKXRlbXApW2ldOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdWludDhfdCogcEZvbnREYXRhOw0KLSAgICAgICAgZmFjZSA9IG1fcEZvbnRNZ3ItPkdldENhY2hlZFRUQ0ZhY2UodHRjX3NpemUsIGNoZWNrc3VtLCB0dGNfc2l6ZSAtIGZvbnRfc2l6ZSwgcEZvbnREYXRhKTsNCi0gICAgICAgIGlmIChmYWNlID09IE5VTEwpIHsNCi0gICAgICAgICAgICBwRm9udERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCB0dGNfc2l6ZSk7DQotICAgICAgICAgICAgaWYgKHBGb250RGF0YSkgew0KLSAgICAgICAgICAgICAgICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDB4NzQ3NDYzNjYsIHBGb250RGF0YSwgdHRjX3NpemUpOw0KLSAgICAgICAgICAgICAgICBmYWNlID0gbV9wRm9udE1nci0+QWRkQ2FjaGVkVFRDRmFjZSh0dGNfc2l6ZSwgY2hlY2tzdW0sIHBGb250RGF0YSwgdHRjX3NpemUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0Y19zaXplIC0gZm9udF9zaXplKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBTdWJzdE5hbWU7DQotICAgICAgICBtX3BGb250SW5mby0+R2V0RmFjZU5hbWUoaEZvbnQsIFN1YnN0TmFtZSk7DQotICAgICAgICB1aW50OF90KiBwRm9udERhdGE7DQotICAgICAgICBmYWNlID0gbV9wRm9udE1nci0+R2V0Q2FjaGVkRmFjZShTdWJzdE5hbWUsIHdlaWdodCwgYkl0YWxpYywgcEZvbnREYXRhKTsNCi0gICAgICAgIGlmIChmYWNlID09IE5VTEwpIHsNCi0gICAgICAgICAgICBwRm9udERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBmb250X3NpemUpOw0KLSAgICAgICAgICAgIGlmICghcEZvbnREYXRhKSB7DQotICAgICAgICAgICAgICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMCwgcEZvbnREYXRhLCBmb250X3NpemUpOw0KLSAgICAgICAgICAgIGZhY2UgPSBtX3BGb250TWdyLT5BZGRDYWNoZWRGYWNlKFN1YnN0TmFtZSwgd2VpZ2h0LCBiSXRhbGljLCBwRm9udERhdGEsIGZvbnRfc2l6ZSwgbV9wRm9udEluZm8tPkdldEZhY2VJbmRleChoRm9udCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsNCi0gICAgcmV0dXJuIGZhY2U7DQotfQ0KK0ZYRlRfRmFjZSBDRlhfRm9udE1hcHBlcjo6RmluZFN1YnN0Rm9udEJ5VW5pY29kZShGWF9EV09SRCBkd1VuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlKSB7CisgIGlmIChtX3BGb250SW5mbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfQk9PTCBiSXRhbGljID0gKGZsYWdzICYgRlhGT05UX0lUQUxJQykgIT0gMDsKKyAgaW50IFBpdGNoRmFtaWx5ID0gMDsKKyAgaWYgKGZsYWdzICYgRlhGT05UX1NFUklGKSB7CisgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1JPTUFOOworICB9CisgIGlmIChmbGFncyAmIEZYRk9OVF9TQ1JJUFQpIHsKKyAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfU0NSSVBUOworICB9CisgIGlmIChmbGFncyAmIEZYRk9OVF9GSVhFRF9QSVRDSCkgeworICAgIFBpdGNoRmFtaWx5IHw9IEZYRk9OVF9GRl9GSVhFRFBJVENIOworICB9CisgIHZvaWQqIGhGb250ID0KKyAgICAgIG1fcEZvbnRJbmZvLT5NYXBGb250QnlVbmljb2RlKGR3VW5pY29kZSwgd2VpZ2h0LCBiSXRhbGljLCBQaXRjaEZhbWlseSk7CisgIGlmIChoRm9udCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfRFdPUkQgdHRjX3NpemUgPSBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDB4NzQ3NDYzNjYsIE5VTEwsIDApOworICBGWF9EV09SRCBmb250X3NpemUgPSBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDAsIE5VTEwsIDApOworICBpZiAoZm9udF9zaXplID09IDAgJiYgdHRjX3NpemUgPT0gMCkgeworICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWEZUX0ZhY2UgZmFjZSA9IE5VTEw7CisgIGlmICh0dGNfc2l6ZSkgeworICAgIHVpbnQ4X3QgdGVtcFsxMDI0XTsKKyAgICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDB4NzQ3NDYzNjYsIHRlbXAsIDEwMjQpOworICAgIEZYX0RXT1JEIGNoZWNrc3VtID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBjaGVja3N1bSArPSAoKEZYX0RXT1JEKil0ZW1wKVtpXTsKKyAgICB9CisgICAgdWludDhfdCogcEZvbnREYXRhOworICAgIGZhY2UgPSBtX3BGb250TWdyLT5HZXRDYWNoZWRUVENGYWNlKHR0Y19zaXplLCBjaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGNfc2l6ZSAtIGZvbnRfc2l6ZSwgcEZvbnREYXRhKTsKKyAgICBpZiAoZmFjZSA9PSBOVUxMKSB7CisgICAgICBwRm9udERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCB0dGNfc2l6ZSk7CisgICAgICBpZiAocEZvbnREYXRhKSB7CisgICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMHg3NDc0NjM2NiwgcEZvbnREYXRhLCB0dGNfc2l6ZSk7CisgICAgICAgIGZhY2UgPSBtX3BGb250TWdyLT5BZGRDYWNoZWRUVENGYWNlKHR0Y19zaXplLCBjaGVja3N1bSwgcEZvbnREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGNfc2l6ZSwgdHRjX3NpemUgLSBmb250X3NpemUpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBTdWJzdE5hbWU7CisgICAgbV9wRm9udEluZm8tPkdldEZhY2VOYW1lKGhGb250LCBTdWJzdE5hbWUpOworICAgIHVpbnQ4X3QqIHBGb250RGF0YTsKKyAgICBmYWNlID0gbV9wRm9udE1nci0+R2V0Q2FjaGVkRmFjZShTdWJzdE5hbWUsIHdlaWdodCwgYkl0YWxpYywgcEZvbnREYXRhKTsKKyAgICBpZiAoZmFjZSA9PSBOVUxMKSB7CisgICAgICBwRm9udERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBmb250X3NpemUpOworICAgICAgaWYgKCFwRm9udERhdGEpIHsKKyAgICAgICAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMCwgcEZvbnREYXRhLCBmb250X3NpemUpOworICAgICAgZmFjZSA9IG1fcEZvbnRNZ3ItPkFkZENhY2hlZEZhY2UoU3Vic3ROYW1lLCB3ZWlnaHQsIGJJdGFsaWMsIHBGb250RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGYWNlSW5kZXgoaEZvbnQpKTsKKyAgICB9CisgIH0KKyAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOworICByZXR1cm4gZmFjZTsKK30KIAotRlhfQk9PTCBDRlhfRm9udE1hcHBlcjo6SXNCdWlsdGluRmFjZShjb25zdCBGWEZUX0ZhY2UgZmFjZSkgY29uc3QKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1NX0ZBQ0VfQ09VTlQ7ICsraSkgewotICAgICAgICBpZiAobV9NTUZhY2VzW2ldID09IGZhY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9CitGWF9CT09MIENGWF9Gb250TWFwcGVyOjpJc0J1aWx0aW5GYWNlKGNvbnN0IEZYRlRfRmFjZSBmYWNlKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTU1fRkFDRV9DT1VOVDsgKytpKSB7CisgICAgaWYgKG1fTU1GYWNlc1tpXSA9PSBmYWNlKSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGT1hJVF9GQUNFX0NPVU5UOyArK2kpIHsKLSAgICAgICAgaWYgKG1fRm94aXRGYWNlc1tpXSA9PSBmYWNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgRk9YSVRfRkFDRV9DT1VOVDsgKytpKSB7CisgICAgaWYgKG1fRm94aXRGYWNlc1tpXSA9PSBmYWNlKSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIGV4dGVybiAiQyIgewotICAgIHVuc2lnbmVkIGxvbmcgX0ZUU3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotICAgIHZvaWQgX0ZUU3RyZWFtQ2xvc2UoRlhGVF9TdHJlYW0gc3RyZWFtKTsKK3Vuc2lnbmVkIGxvbmcgX0ZUU3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpOwordm9pZCBfRlRTdHJlYW1DbG9zZShGWEZUX1N0cmVhbSBzdHJlYW0pOwogfTsKLUNGb250RmlsZUZhY2VJbmZvOjpDRm9udEZpbGVGYWNlSW5mbygpCi17Ci0gICAgbV9wRmlsZSA9IE5VTEw7Ci0gICAgbV9GYWNlID0gTlVMTDsKLSAgICBtX0NoYXJzZXRzID0gMDsKLSAgICBtX0ZpbGVTaXplID0gMDsKLSAgICBtX0ZvbnRPZmZzZXQgPSAwOwotICAgIG1fV2VpZ2h0ID0gMDsKLSAgICBtX2JJdGFsaWMgPSBGQUxTRTsKLSAgICBtX1BpdGNoRmFtaWx5ID0gMDsKK0NGb250RmlsZUZhY2VJbmZvOjpDRm9udEZpbGVGYWNlSW5mbygpIHsKKyAgbV9wRmlsZSA9IE5VTEw7CisgIG1fRmFjZSA9IE5VTEw7CisgIG1fQ2hhcnNldHMgPSAwOworICBtX0ZpbGVTaXplID0gMDsKKyAgbV9Gb250T2Zmc2V0ID0gMDsKKyAgbV9XZWlnaHQgPSAwOworICBtX2JJdGFsaWMgPSBGQUxTRTsKKyAgbV9QaXRjaEZhbWlseSA9IDA7CiB9Ci1DRm9udEZpbGVGYWNlSW5mbzo6fkNGb250RmlsZUZhY2VJbmZvKCkKLXsKLSAgICBpZiAobV9GYWNlKSB7Ci0gICAgICAgIEZYRlRfRG9uZV9GYWNlKG1fRmFjZSk7Ci0gICAgfQotICAgIG1fRmFjZSA9IE5VTEw7CitDRm9udEZpbGVGYWNlSW5mbzo6fkNGb250RmlsZUZhY2VJbmZvKCkgeworICBpZiAobV9GYWNlKSB7CisgICAgRlhGVF9Eb25lX0ZhY2UobV9GYWNlKTsKKyAgfQorICBtX0ZhY2UgPSBOVUxMOwogfQotZXh0ZXJuIEZYX0JPT0wgX0xvYWRGaWxlKEZYRlRfTGlicmFyeSBsaWJyYXJ5LCBGWEZUX0ZhY2UqIEZhY2UsIElGWF9GaWxlUmVhZCogcEZpbGUsIEZYRlRfU3RyZWFtKiBzdHJlYW0pOworZXh0ZXJuIEZYX0JPT0wgX0xvYWRGaWxlKEZYRlRfTGlicmFyeSBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfRmFjZSogRmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfU3RyZWFtKiBzdHJlYW0pOwogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCi1JRlhfU3lzdGVtRm9udEluZm8qIElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgpCi17Ci0gICAgcmV0dXJuIE5VTEw7CitJRlhfU3lzdGVtRm9udEluZm8qIElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgpIHsKKyAgcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYKLUNGWF9Gb2xkZXJGb250SW5mbzo6Q0ZYX0ZvbGRlckZvbnRJbmZvKCkKLXsKK0NGWF9Gb2xkZXJGb250SW5mbzo6Q0ZYX0ZvbGRlckZvbnRJbmZvKCkge30KK0NGWF9Gb2xkZXJGb250SW5mbzo6fkNGWF9Gb2xkZXJGb250SW5mbygpIHsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9Gb250TGlzdC5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBrZXk7CisgICAgdm9pZCogdmFsdWU7CisgICAgbV9Gb250TGlzdC5HZXROZXh0QXNzb2MocG9zLCBrZXksIHZhbHVlKTsKKyAgICBkZWxldGUgKENGb250RmFjZUluZm8qKXZhbHVlOworICB9CiB9Ci1DRlhfRm9sZGVyRm9udEluZm86On5DRlhfRm9sZGVyRm9udEluZm8oKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fRm9udExpc3QuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OwotICAgICAgICB2b2lkKiB2YWx1ZTsKLSAgICAgICAgbV9Gb250TGlzdC5HZXROZXh0QXNzb2MocG9zLCBrZXksIHZhbHVlKTsKLSAgICAgICAgZGVsZXRlIChDRm9udEZhY2VJbmZvKil2YWx1ZTsKK3ZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpBZGRQYXRoKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcGF0aCkgeworICBtX1BhdGhMaXN0LkFkZChwYXRoKTsKK30KK3ZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpSZWxlYXNlKCkgeworICBkZWxldGUgdGhpczsKK30KK0ZYX0JPT0wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIHsKKyAgbV9wTWFwcGVyID0gcE1hcHBlcjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BhdGhMaXN0LkdldFNpemUoKTsgaSsrKSB7CisgICAgU2NhblBhdGgobV9QYXRoTGlzdFtpXSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6U2NhblBhdGgoQ0ZYX0J5dGVTdHJpbmcmIHBhdGgpIHsKKyAgdm9pZCogaGFuZGxlID0gRlhfT3BlbkZvbGRlcihwYXRoKTsKKyAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9CeXRlU3RyaW5nIGZpbGVuYW1lOworICBGWF9CT09MIGJGb2xkZXI7CisgIHdoaWxlIChGWF9HZXROZXh0RmlsZShoYW5kbGUsIGZpbGVuYW1lLCBiRm9sZGVyKSkgeworICAgIGlmIChiRm9sZGVyKSB7CisgICAgICBpZiAoZmlsZW5hbWUgPT0gIi4iIHx8IGZpbGVuYW1lID09ICIuLiIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGV4dCA9IGZpbGVuYW1lLlJpZ2h0KDQpOworICAgICAgZXh0Lk1ha2VVcHBlcigpOworICAgICAgaWYgKGV4dCAhPSAiLlRURiIgJiYgZXh0ICE9ICIuT1RGIiAmJiBleHQgIT0gIi5UVEMiKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQogICAgIH0KLX0KLXZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpBZGRQYXRoKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcGF0aCkKLXsKLSAgICBtX1BhdGhMaXN0LkFkZChwYXRoKTsKLX0KLXZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpSZWxlYXNlKCkKLXsKLSAgICBkZWxldGUgdGhpczsKLX0KLUZYX0JPT0wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCi17Ci0gICAgbV9wTWFwcGVyID0gcE1hcHBlcjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fUGF0aExpc3QuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIFNjYW5QYXRoKG1fUGF0aExpc3RbaV0pOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpTY2FuUGF0aChDRlhfQnl0ZVN0cmluZyYgcGF0aCkKLXsKLSAgICB2b2lkKiBoYW5kbGUgPSBGWF9PcGVuRm9sZGVyKHBhdGgpOwotICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGZpbGVuYW1lOwotICAgIEZYX0JPT0wgYkZvbGRlcjsKLSAgICB3aGlsZSAoRlhfR2V0TmV4dEZpbGUoaGFuZGxlLCBmaWxlbmFtZSwgYkZvbGRlcikpIHsKLSAgICAgICAgaWYgKGJGb2xkZXIpIHsKLSAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PSAiLiIgfHwgZmlsZW5hbWUgPT0gIi4uIikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZXh0ID0gZmlsZW5hbWUuUmlnaHQoNCk7Ci0gICAgICAgICAgICBleHQuTWFrZVVwcGVyKCk7Ci0gICAgICAgICAgICBpZiAoZXh0ICE9ICIuVFRGIiAmJiBleHQgIT0gIi5PVEYiICYmIGV4dCAhPSAiLlRUQyIpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBmdWxscGF0aCA9IHBhdGg7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICAgICAgZnVsbHBhdGggKz0gIlxcIjsKKyAgICBDRlhfQnl0ZVN0cmluZyBmdWxscGF0aCA9IHBhdGg7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworICAgIGZ1bGxwYXRoICs9ICJcXCI7CiAjZWxzZQotICAgICAgICBmdWxscGF0aCArPSAiLyI7CisgICAgZnVsbHBhdGggKz0gIi8iOwogI2VuZGlmCi0gICAgICAgIGZ1bGxwYXRoICs9IGZpbGVuYW1lOwotICAgICAgICBpZiAoYkZvbGRlcikgewotICAgICAgICAgICAgU2NhblBhdGgoZnVsbHBhdGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU2NhbkZpbGUoZnVsbHBhdGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYX0Nsb3NlRm9sZGVyKGhhbmRsZSk7Ci19Ci12b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6U2NhbkZpbGUoQ0ZYX0J5dGVTdHJpbmcmIHBhdGgpCi17Ci0gICAgRlhTWVNfRklMRSogcEZpbGUgPSBGWFNZU19mb3BlbihwYXRoLCAicmIiKTsKLSAgICBpZiAocEZpbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX2ZzZWVrKHBGaWxlLCAwLCBGWFNZU19TRUVLX0VORCk7Ci0gICAgRlhfRFdPUkQgZmlsZXNpemUgPSBGWFNZU19mdGVsbChwRmlsZSk7Ci0gICAgdWludDhfdCBidWZmZXJbMTZdOwotICAgIEZYU1lTX2ZzZWVrKHBGaWxlLCAwLCBGWFNZU19TRUVLX1NFVCk7Ci0gICAgc2l6ZV90IHJlYWRDbnQgPSBGWFNZU19mcmVhZChidWZmZXIsIDEyLCAxLCBwRmlsZSk7Ci0gICAgaWYgKHJlYWRDbnQgIT0gMSkgewotICAgICAgICBGWFNZU19mY2xvc2UocEZpbGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKEdFVF9UVF9MT05HKGJ1ZmZlcikgPT0gMHg3NDc0NjM2NikgewotICAgICAgICBGWF9EV09SRCBuRmFjZXMgPSBHRVRfVFRfTE9ORyhidWZmZXIgKyA4KTsKLSAgICAgICAgaWYgKG5GYWNlcyA+IHN0ZDo6bnVtZXJpY19saW1pdHM8RlhfRFdPUkQ+OjptYXgoKSAvIDQpIHsKLSAgICAgICAgICAgIEZYU1lTX2ZjbG9zZShwRmlsZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgZmFjZV9ieXRlcyA9IG5GYWNlcyAqIDQ7Ci0gICAgICAgIHVpbnQ4X3QqIG9mZnNldHMgPSBGWF9BbGxvYyh1aW50OF90LCBmYWNlX2J5dGVzKTsKLSAgICAgICAgcmVhZENudCA9IEZYU1lTX2ZyZWFkKG9mZnNldHMsIDEsIGZhY2VfYnl0ZXMsIHBGaWxlKTsKLSAgICAgICAgaWYgKHJlYWRDbnQgIT0gZmFjZV9ieXRlcykgewotICAgICAgICAgICAgRlhfRnJlZShvZmZzZXRzKTsKLSAgICAgICAgICAgIEZYU1lTX2ZjbG9zZShwRmlsZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5GYWNlczsgaSArKykgewotICAgICAgICAgICAgdWludDhfdCogcCA9IG9mZnNldHMgKyBpICogNDsKLSAgICAgICAgICAgIFJlcG9ydEZhY2UocGF0aCwgcEZpbGUsIGZpbGVzaXplLCBHRVRfVFRfTE9ORyhwKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRnJlZShvZmZzZXRzKTsKKyAgICBmdWxscGF0aCArPSBmaWxlbmFtZTsKKyAgICBpZiAoYkZvbGRlcikgeworICAgICAgU2NhblBhdGgoZnVsbHBhdGgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlcG9ydEZhY2UocGF0aCwgcEZpbGUsIGZpbGVzaXplLCAwKTsKKyAgICAgIFNjYW5GaWxlKGZ1bGxwYXRoKTsKICAgICB9CisgIH0KKyAgRlhfQ2xvc2VGb2xkZXIoaGFuZGxlKTsKK30KK3ZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpTY2FuRmlsZShDRlhfQnl0ZVN0cmluZyYgcGF0aCkgeworICBGWFNZU19GSUxFKiBwRmlsZSA9IEZYU1lTX2ZvcGVuKHBhdGgsICJyYiIpOworICBpZiAocEZpbGUgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBGWFNZU19mc2VlayhwRmlsZSwgMCwgRlhTWVNfU0VFS19FTkQpOworICBGWF9EV09SRCBmaWxlc2l6ZSA9IEZYU1lTX2Z0ZWxsKHBGaWxlKTsKKyAgdWludDhfdCBidWZmZXJbMTZdOworICBGWFNZU19mc2VlayhwRmlsZSwgMCwgRlhTWVNfU0VFS19TRVQpOworICBzaXplX3QgcmVhZENudCA9IEZYU1lTX2ZyZWFkKGJ1ZmZlciwgMTIsIDEsIHBGaWxlKTsKKyAgaWYgKHJlYWRDbnQgIT0gMSkgewogICAgIEZYU1lTX2ZjbG9zZShwRmlsZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKEdFVF9UVF9MT05HKGJ1ZmZlcikgPT0gMHg3NDc0NjM2NikgeworICAgIEZYX0RXT1JEIG5GYWNlcyA9IEdFVF9UVF9MT05HKGJ1ZmZlciArIDgpOworICAgIGlmIChuRmFjZXMgPiBzdGQ6Om51bWVyaWNfbGltaXRzPEZYX0RXT1JEPjo6bWF4KCkgLyA0KSB7CisgICAgICBGWFNZU19mY2xvc2UocEZpbGUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBGWF9EV09SRCBmYWNlX2J5dGVzID0gbkZhY2VzICogNDsKKyAgICB1aW50OF90KiBvZmZzZXRzID0gRlhfQWxsb2ModWludDhfdCwgZmFjZV9ieXRlcyk7CisgICAgcmVhZENudCA9IEZYU1lTX2ZyZWFkKG9mZnNldHMsIDEsIGZhY2VfYnl0ZXMsIHBGaWxlKTsKKyAgICBpZiAocmVhZENudCAhPSBmYWNlX2J5dGVzKSB7CisgICAgICBGWF9GcmVlKG9mZnNldHMpOworICAgICAgRlhTWVNfZmNsb3NlKHBGaWxlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5GYWNlczsgaSsrKSB7CisgICAgICB1aW50OF90KiBwID0gb2Zmc2V0cyArIGkgKiA0OworICAgICAgUmVwb3J0RmFjZShwYXRoLCBwRmlsZSwgZmlsZXNpemUsIEdFVF9UVF9MT05HKHApKTsKKyAgICB9CisgICAgRlhfRnJlZShvZmZzZXRzKTsKKyAgfSBlbHNlIHsKKyAgICBSZXBvcnRGYWNlKHBhdGgsIHBGaWxlLCBmaWxlc2l6ZSwgMCk7CisgIH0KKyAgRlhTWVNfZmNsb3NlKHBGaWxlKTsKIH0KLXZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpSZXBvcnRGYWNlKENGWF9CeXRlU3RyaW5nJiBwYXRoLCBGWFNZU19GSUxFKiBwRmlsZSwgRlhfRFdPUkQgZmlsZXNpemUsIEZYX0RXT1JEIG9mZnNldCkKLXsKK3ZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpSZXBvcnRGYWNlKENGWF9CeXRlU3RyaW5nJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfRklMRSogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9mZnNldCkgeworICBGWFNZU19mc2VlayhwRmlsZSwgb2Zmc2V0LCBGWFNZU19TRUVLX1NFVCk7CisgIGNoYXIgYnVmZmVyWzE2XTsKKyAgaWYgKCFGWFNZU19mcmVhZChidWZmZXIsIDEyLCAxLCBwRmlsZSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRFdPUkQgblRhYmxlcyA9IEdFVF9UVF9TSE9SVChidWZmZXIgKyA0KTsKKyAgQ0ZYX0J5dGVTdHJpbmcgdGFibGVzID0gX0ZQREZfUmVhZFN0cmluZ0Zyb21GaWxlKHBGaWxlLCBuVGFibGVzICogMTYpOworICBpZiAodGFibGVzLklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBuYW1lcyA9CisgICAgICBfRlBERl9Mb2FkVGFibGVGcm9tVFQocEZpbGUsIHRhYmxlcywgblRhYmxlcywgMHg2ZTYxNmQ2NSk7CisgIENGWF9CeXRlU3RyaW5nIGZhY2VuYW1lID0gX0ZQREZfR2V0TmFtZUZyb21UVChuYW1lcywgMSk7CisgIENGWF9CeXRlU3RyaW5nIHN0eWxlID0gX0ZQREZfR2V0TmFtZUZyb21UVChuYW1lcywgMik7CisgIGlmIChzdHlsZSAhPSAiUmVndWxhciIpIHsKKyAgICBmYWNlbmFtZSArPSAiICIgKyBzdHlsZTsKKyAgfQorICB2b2lkKiBwOworICBpZiAobV9Gb250TGlzdC5Mb29rdXAoZmFjZW5hbWUsIHApKSB7CisgICAgcmV0dXJuOworICB9CisgIENGb250RmFjZUluZm8qIHBJbmZvID0gRlhfTkVXIENGb250RmFjZUluZm87CisgIGlmICghcEluZm8pIHsKKyAgICByZXR1cm47CisgIH0KKyAgcEluZm8tPm1fRmlsZVBhdGggPSBwYXRoOworICBwSW5mby0+bV9GYWNlTmFtZSA9IGZhY2VuYW1lOworICBwSW5mby0+bV9Gb250VGFibGVzID0gdGFibGVzOworICBwSW5mby0+bV9Gb250T2Zmc2V0ID0gb2Zmc2V0OworICBwSW5mby0+bV9GaWxlU2l6ZSA9IGZpbGVzaXplOworICBwSW5mby0+bV9DaGFyc2V0cyA9IDA7CisgIENGWF9CeXRlU3RyaW5nIG9zMiA9CisgICAgICBfRlBERl9Mb2FkVGFibGVGcm9tVFQocEZpbGUsIHRhYmxlcywgblRhYmxlcywgMHg0ZjUzMmYzMik7CisgIGlmIChvczIuR2V0TGVuZ3RoKCkgPj0gODYpIHsKKyAgICBjb25zdCB1aW50OF90KiBwID0gKGNvbnN0IHVpbnQ4X3QqKW9zMiArIDc4OworICAgIEZYX0RXT1JEIGNvZGVwYWdlcyA9IEdFVF9UVF9MT05HKHApOworICAgIGlmIChjb2RlcGFnZXMgJiAoMSA8PCAxNykpIHsKKyAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX1NISUZUSklTX0NIQVJTRVQpOworICAgICAgcEluZm8tPm1fQ2hhcnNldHMgfD0gQ0hBUlNFVF9GTEFHX1NISUZUSklTOworICAgIH0KKyAgICBpZiAoY29kZXBhZ2VzICYgKDEgPDwgMTgpKSB7CisgICAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCk7CisgICAgICBwSW5mby0+bV9DaGFyc2V0cyB8PSBDSEFSU0VUX0ZMQUdfR0I7CisgICAgfQorICAgIGlmIChjb2RlcGFnZXMgJiAoMSA8PCAyMCkpIHsKKyAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpOworICAgICAgcEluZm8tPm1fQ2hhcnNldHMgfD0gQ0hBUlNFVF9GTEFHX0JJRzU7CisgICAgfQorICAgIGlmICgoY29kZXBhZ2VzICYgKDEgPDwgMTkpKSB8fCAoY29kZXBhZ2VzICYgKDEgPDwgMjEpKSkgeworICAgICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KGZhY2VuYW1lLCBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKTsKKyAgICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19LT1JFQU47CisgICAgfQorICAgIGlmIChjb2RlcGFnZXMgJiAoMSA8PCAzMSkpIHsKKyAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX1NZTUJPTF9DSEFSU0VUKTsKKyAgICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19TWU1CT0w7CisgICAgfQorICB9CisgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX0FOU0lfQ0hBUlNFVCk7CisgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19BTlNJOworICBwSW5mby0+bV9TdHlsZXMgPSAwOworICBpZiAoc3R5bGUuRmluZChGWF9CU1RSQygiQm9sZCIpKSA+IC0xKSB7CisgICAgcEluZm8tPm1fU3R5bGVzIHw9IEZYRk9OVF9CT0xEOworICB9CisgIGlmIChzdHlsZS5GaW5kKEZYX0JTVFJDKCJJdGFsaWMiKSkgPiAtMSB8fAorICAgICAgc3R5bGUuRmluZChGWF9CU1RSQygiT2JsaXF1ZSIpKSA+IC0xKSB7CisgICAgcEluZm8tPm1fU3R5bGVzIHw9IEZYRk9OVF9JVEFMSUM7CisgIH0KKyAgaWYgKGZhY2VuYW1lLkZpbmQoRlhfQlNUUkMoIlNlcmlmIikpID4gLTEpIHsKKyAgICBwSW5mby0+bV9TdHlsZXMgfD0gRlhGT05UX1NFUklGOworICB9CisgIG1fRm9udExpc3QuU2V0QXQoZmFjZW5hbWUsIHBJbmZvKTsKK30KK3ZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGlFeGFjdCkgeworICByZXR1cm4gTlVMTDsKK30KK3ZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6TWFwRm9udEJ5VW5pY29kZShGWF9EV09SRCBkd1VuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSkgeworICByZXR1cm4gTlVMTDsKK30KK3ZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6R2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYWNlKSB7CisgIHZvaWQqIHA7CisgIGlmICghbV9Gb250TGlzdC5Mb29rdXAoZmFjZSwgcCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcDsKK30KK0ZYX0RXT1JEIENGWF9Gb2xkZXJGb250SW5mbzo6R2V0Rm9udERhdGEodm9pZCogaEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUpIHsKKyAgaWYgKGhGb250ID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDRm9udEZhY2VJbmZvKiBwRm9udCA9IChDRm9udEZhY2VJbmZvKiloRm9udDsKKyAgRlhTWVNfRklMRSogcEZpbGUgPSBOVUxMOworICBpZiAoc2l6ZSA+IDApIHsKKyAgICBwRmlsZSA9IEZYU1lTX2ZvcGVuKHBGb250LT5tX0ZpbGVQYXRoLCAicmIiKTsKKyAgICBpZiAocEZpbGUgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIEZYX0RXT1JEIGRhdGFzaXplID0gMDsKKyAgRlhfRFdPUkQgb2Zmc2V0OworICBpZiAodGFibGUgPT0gMCkgeworICAgIGRhdGFzaXplID0gcEZvbnQtPm1fRm9udE9mZnNldCA/IDAgOiBwRm9udC0+bV9GaWxlU2l6ZTsKKyAgICBvZmZzZXQgPSAwOworICB9IGVsc2UgaWYgKHRhYmxlID09IDB4NzQ3NDYzNjYpIHsKKyAgICBkYXRhc2l6ZSA9IHBGb250LT5tX0ZvbnRPZmZzZXQgPyBwRm9udC0+bV9GaWxlU2l6ZSA6IDA7CisgICAgb2Zmc2V0ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBGWF9EV09SRCBuVGFibGVzID0gcEZvbnQtPm1fRm9udFRhYmxlcy5HZXRMZW5ndGgoKSAvIDE2OworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuVGFibGVzOyBpKyspIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSAoY29uc3QgdWludDhfdCopcEZvbnQtPm1fRm9udFRhYmxlcyArIGkgKiAxNjsKKyAgICAgIGlmIChHRVRfVFRfTE9ORyhwKSA9PSB0YWJsZSkgeworICAgICAgICBvZmZzZXQgPSBHRVRfVFRfTE9ORyhwICsgOCk7CisgICAgICAgIGRhdGFzaXplID0gR0VUX1RUX0xPTkcocCArIDEyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGRhdGFzaXplICYmIHNpemUgPj0gZGF0YXNpemUgJiYgcEZpbGUpIHsKICAgICBGWFNZU19mc2VlayhwRmlsZSwgb2Zmc2V0LCBGWFNZU19TRUVLX1NFVCk7Ci0gICAgY2hhciBidWZmZXJbMTZdOwotICAgIGlmICghRlhTWVNfZnJlYWQoYnVmZmVyLCAxMiwgMSwgcEZpbGUpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfRFdPUkQgblRhYmxlcyA9IEdFVF9UVF9TSE9SVChidWZmZXIgKyA0KTsKLSAgICBDRlhfQnl0ZVN0cmluZyB0YWJsZXMgPSBfRlBERl9SZWFkU3RyaW5nRnJvbUZpbGUocEZpbGUsIG5UYWJsZXMgKiAxNik7Ci0gICAgaWYgKHRhYmxlcy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBuYW1lcyA9IF9GUERGX0xvYWRUYWJsZUZyb21UVChwRmlsZSwgdGFibGVzLCBuVGFibGVzLCAweDZlNjE2ZDY1KTsKLSAgICBDRlhfQnl0ZVN0cmluZyBmYWNlbmFtZSA9IF9GUERGX0dldE5hbWVGcm9tVFQobmFtZXMsIDEpOwotICAgIENGWF9CeXRlU3RyaW5nIHN0eWxlID0gX0ZQREZfR2V0TmFtZUZyb21UVChuYW1lcywgMik7Ci0gICAgaWYgKHN0eWxlICE9ICJSZWd1bGFyIikgewotICAgICAgICBmYWNlbmFtZSArPSAiICIgKyBzdHlsZTsKLSAgICB9Ci0gICAgdm9pZCogcDsKLSAgICBpZiAobV9Gb250TGlzdC5Mb29rdXAoZmFjZW5hbWUsIHApKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZvbnRGYWNlSW5mbyogcEluZm8gPSBGWF9ORVcgQ0ZvbnRGYWNlSW5mbzsKLSAgICBpZiAoIXBJbmZvKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcEluZm8tPm1fRmlsZVBhdGggPSBwYXRoOwotICAgIHBJbmZvLT5tX0ZhY2VOYW1lID0gZmFjZW5hbWU7Ci0gICAgcEluZm8tPm1fRm9udFRhYmxlcyA9IHRhYmxlczsKLSAgICBwSW5mby0+bV9Gb250T2Zmc2V0ID0gb2Zmc2V0OwotICAgIHBJbmZvLT5tX0ZpbGVTaXplID0gZmlsZXNpemU7Ci0gICAgcEluZm8tPm1fQ2hhcnNldHMgPSAwOwotICAgIENGWF9CeXRlU3RyaW5nIG9zMiA9IF9GUERGX0xvYWRUYWJsZUZyb21UVChwRmlsZSwgdGFibGVzLCBuVGFibGVzLCAweDRmNTMyZjMyKTsKLSAgICBpZiAob3MyLkdldExlbmd0aCgpID49IDg2KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSAoY29uc3QgdWludDhfdCopb3MyICsgNzg7Ci0gICAgICAgIEZYX0RXT1JEIGNvZGVwYWdlcyA9IEdFVF9UVF9MT05HKHApOwotICAgICAgICBpZiAoY29kZXBhZ2VzICYgKDEgPDwgMTcpKSB7Ci0gICAgICAgICAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKLSAgICAgICAgICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19TSElGVEpJUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29kZXBhZ2VzICYgKDEgPDwgMTgpKSB7Ci0gICAgICAgICAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCk7Ci0gICAgICAgICAgICBwSW5mby0+bV9DaGFyc2V0cyB8PSBDSEFSU0VUX0ZMQUdfR0I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvZGVwYWdlcyAmICgxIDw8IDIwKSkgewotICAgICAgICAgICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KGZhY2VuYW1lLCBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCk7Ci0gICAgICAgICAgICBwSW5mby0+bV9DaGFyc2V0cyB8PSBDSEFSU0VUX0ZMQUdfQklHNTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGNvZGVwYWdlcyAmICgxIDw8IDE5KSkgfHwgKGNvZGVwYWdlcyAmICgxIDw8IDIxKSkpIHsKLSAgICAgICAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCk7Ci0gICAgICAgICAgICBwSW5mby0+bV9DaGFyc2V0cyB8PSBDSEFSU0VUX0ZMQUdfS09SRUFOOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb2RlcGFnZXMgJiAoMSA8PCAzMSkpIHsKLSAgICAgICAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX1NZTUJPTF9DSEFSU0VUKTsKLSAgICAgICAgICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19TWU1CT0w7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KGZhY2VuYW1lLCBGWEZPTlRfQU5TSV9DSEFSU0VUKTsKLSAgICBwSW5mby0+bV9DaGFyc2V0cyB8PSBDSEFSU0VUX0ZMQUdfQU5TSTsKLSAgICBwSW5mby0+bV9TdHlsZXMgPSAwOwotICAgIGlmIChzdHlsZS5GaW5kKEZYX0JTVFJDKCJCb2xkIikpID4gLTEpIHsKLSAgICAgICAgcEluZm8tPm1fU3R5bGVzIHw9IEZYRk9OVF9CT0xEOwotICAgIH0KLSAgICBpZiAoc3R5bGUuRmluZChGWF9CU1RSQygiSXRhbGljIikpID4gLTEgfHwgc3R5bGUuRmluZChGWF9CU1RSQygiT2JsaXF1ZSIpKSA+IC0xKSB7Ci0gICAgICAgIHBJbmZvLT5tX1N0eWxlcyB8PSBGWEZPTlRfSVRBTElDOwotICAgIH0KLSAgICBpZiAoZmFjZW5hbWUuRmluZChGWF9CU1RSQygiU2VyaWYiKSkgPiAtMSkgewotICAgICAgICBwSW5mby0+bV9TdHlsZXMgfD0gRlhGT05UX1NFUklGOwotICAgIH0KLSAgICBtX0ZvbnRMaXN0LlNldEF0KGZhY2VuYW1lLCBwSW5mbyk7CisgICAgRlhTWVNfZnJlYWQoYnVmZmVyLCBkYXRhc2l6ZSwgMSwgcEZpbGUpOworICB9CisgIGlmIChwRmlsZSkgeworICAgIEZYU1lTX2ZjbG9zZShwRmlsZSk7CisgIH0KKyAgcmV0dXJuIGRhdGFzaXplOwogfQotdm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgaW50JiBpRXhhY3QpCi17Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci12b2lkKiBDRlhfRm9sZGVyRm9udEluZm86Ok1hcEZvbnRCeVVuaWNvZGUoRlhfRFdPUkQgZHdVbmljb2RlLCBpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBwaXRjaF9mYW1pbHkpDQotewotICAgIHJldHVybiBOVUxMOwotfQotdm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpCi17Ci0gICAgdm9pZCogcDsKLSAgICBpZiAoIW1fRm9udExpc3QuTG9va3VwKGZhY2UsIHApKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gcDsKLX0KLUZYX0RXT1JEIENGWF9Gb2xkZXJGb250SW5mbzo6R2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpCi17Ci0gICAgaWYgKGhGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENGb250RmFjZUluZm8qIHBGb250ID0gKENGb250RmFjZUluZm8qKWhGb250OwotICAgIEZYU1lTX0ZJTEUqIHBGaWxlID0gTlVMTDsKLSAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgcEZpbGUgPSBGWFNZU19mb3BlbihwRm9udC0+bV9GaWxlUGF0aCwgInJiIik7Ci0gICAgICAgIGlmIChwRmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9EV09SRCBkYXRhc2l6ZSA9IDA7Ci0gICAgRlhfRFdPUkQgb2Zmc2V0OwotICAgIGlmICh0YWJsZSA9PSAwKQl7Ci0gICAgICAgIGRhdGFzaXplID0gcEZvbnQtPm1fRm9udE9mZnNldCA/IDAgOiBwRm9udC0+bV9GaWxlU2l6ZTsKLSAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICB9IGVsc2UgaWYgKHRhYmxlID09IDB4NzQ3NDYzNjYpCXsKLSAgICAgICAgZGF0YXNpemUgPSBwRm9udC0+bV9Gb250T2Zmc2V0ID8gcEZvbnQtPm1fRmlsZVNpemUgOiAwOwotICAgICAgICBvZmZzZXQgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYX0RXT1JEIG5UYWJsZXMgPSBwRm9udC0+bV9Gb250VGFibGVzLkdldExlbmd0aCgpIC8gMTY7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuVGFibGVzOyBpICsrKSB7Ci0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBwID0gKGNvbnN0IHVpbnQ4X3QqKXBGb250LT5tX0ZvbnRUYWJsZXMgKyBpICogMTY7Ci0gICAgICAgICAgICBpZiAoR0VUX1RUX0xPTkcocCkgPT0gdGFibGUpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBHRVRfVFRfTE9ORyhwICsgOCk7Ci0gICAgICAgICAgICAgICAgZGF0YXNpemUgPSBHRVRfVFRfTE9ORyhwICsgMTIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChkYXRhc2l6ZSAmJiBzaXplID49IGRhdGFzaXplICYmIHBGaWxlKSB7Ci0gICAgICAgIEZYU1lTX2ZzZWVrKHBGaWxlLCBvZmZzZXQsIEZYU1lTX1NFRUtfU0VUKTsKLSAgICAgICAgRlhTWVNfZnJlYWQoYnVmZmVyLCBkYXRhc2l6ZSwgMSwgcEZpbGUpOwotICAgIH0KLSAgICBpZiAocEZpbGUpIHsKLSAgICAgICAgRlhTWVNfZmNsb3NlKHBGaWxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRhdGFzaXplOwotfQotdm9pZCBDRlhfRm9sZGVyRm9udEluZm86OkRlbGV0ZUZvbnQodm9pZCogaEZvbnQpCi17Ci19Ci1GWF9CT09MIENGWF9Gb2xkZXJGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKQotewotICAgIGlmIChoRm9udCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0ZvbnRGYWNlSW5mbyogcEZvbnQgPSAoQ0ZvbnRGYWNlSW5mbyopaEZvbnQ7Ci0gICAgbmFtZSA9IHBGb250LT5tX0ZhY2VOYW1lOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRm9sZGVyRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpCi17Cit2b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6RGVsZXRlRm9udCh2b2lkKiBoRm9udCkge30KK0ZYX0JPT0wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsKKyAgaWYgKGhGb250ID09IE5VTEwpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZvbnRGYWNlSW5mbyogcEZvbnQgPSAoQ0ZvbnRGYWNlSW5mbyopaEZvbnQ7CisgIG5hbWUgPSBwRm9udC0+bV9GYWNlTmFtZTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9Gb2xkZXJGb250SW5mbzo6R2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkgeworICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2xpbnV4LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwCmluZGV4IDI1YWQ0OWMuLmMxOTRhZGYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwCkBAIC0xMCwxMCArMTAsOSBAQAogCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgIGNvbnN0IEZYX0NIQVIqCW1fcE5hbWU7Ci0gICAgY29uc3QgRlhfQ0hBUioJbV9wU3Vic3ROYW1lOwotfQotQmFzZTE0U3Vic3RzW10gPSB7CisgIGNvbnN0IEZYX0NIQVIqIG1fcE5hbWU7CisgIGNvbnN0IEZYX0NIQVIqIG1fcFN1YnN0TmFtZTsKK30gQmFzZTE0U3Vic3RzW10gPSB7CiAgICAgeyJDb3VyaWVyIiwgIkNvdXJpZXIgTmV3In0sCiAgICAgeyJDb3VyaWVyLUJvbGQiLCAiQ291cmllciBOZXcgQm9sZCJ9LAogICAgIHsiQ291cmllci1Cb2xkT2JsaXF1ZSIsICJDb3VyaWVyIE5ldyBCb2xkIEl0YWxpYyJ9LApAQCAtMjcsMjA4ICsyNiwyMjUgQEAKICAgICB7IlRpbWVzLUJvbGRJdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIEJvbGQgSXRhbGljIn0sCiAgICAgeyJUaW1lcy1JdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIEl0YWxpYyJ9LAogfTsKLWNsYXNzIENGWF9MaW51eEZvbnRJbmZvIDogcHVibGljIENGWF9Gb2xkZXJGb250SW5mbwotewotcHVibGljOgotICAgIHZvaWQqIE1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBpbnQmIGlFeGFjdCkgb3ZlcnJpZGU7Ci0gICAgRlhfQk9PTAkJCQlQYXJzZUZvbnRDZmcoKTsKLSAgICB2b2lkKgkJCQlGaW5kRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIEZYX0JPT0wgYk1hdGNoTmFtZSk7CitjbGFzcyBDRlhfTGludXhGb250SW5mbyA6IHB1YmxpYyBDRlhfRm9sZGVyRm9udEluZm8geworIHB1YmxpYzoKKyAgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwKKyAgICAgICAgICAgICAgICBpbnQmIGlFeGFjdCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgUGFyc2VGb250Q2ZnKCk7CisgIHZvaWQqIEZpbmRGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTWF0Y2hOYW1lKTsKIH07Ci0jZGVmaW5lIExJTlVYX0dQTkFNRVNJWkUJNgorI2RlZmluZSBMSU5VWF9HUE5BTUVTSVpFIDYKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgIGNvbnN0IEZYX0NIQVIqIE5hbWVBcnJbTElOVVhfR1BOQU1FU0laRV07Ci19Ci1MaW51eEdwRm9udExpc3RbXSA9IHsKLSAgICB7eyJUYWthb1BHb3RoaWMiLCAiVkwgUEdvdGhpYyIsICJJUEFQR290aGljIiwgIlZMIEdvdGhpYyIsICJLb2NoaSBHb3RoaWMiLCAiVkwgR290aGljIHJlZ3VsYXIifX0sCi0gICAge3siVGFrYW9Hb3RoaWMiLCAiVkwgR290aGljIiwgIklQQUdvdGhpYyIsICJLb2NoaSBHb3RoaWMiLCBOVUxMLCAiVkwgR290aGljIHJlZ3VsYXIifX0sCi0gICAge3siVGFrYW9QTWluY2hvIiwgIklQQVBNaW5jaG8iLCAiVkwgR290aGljIiwgIktvY2hpIE1pbmNobyIsIE5VTEwsICJWTCBHb3RoaWMgcmVndWxhciJ9fSwKLSAgICB7eyJUYWthb01pbmNobyIsICJJUEFNaW5jaG8iLCAiVkwgR290aGljIiwgIktvY2hpIE1pbmNobyIsIE5VTEwsICJWTCBHb3RoaWMgcmVndWxhciJ9fSwKKyAgY29uc3QgRlhfQ0hBUiogTmFtZUFycltMSU5VWF9HUE5BTUVTSVpFXTsKK30gTGludXhHcEZvbnRMaXN0W10gPSB7CisgICAge3siVGFrYW9QR290aGljIiwgIlZMIFBHb3RoaWMiLCAiSVBBUEdvdGhpYyIsICJWTCBHb3RoaWMiLCAiS29jaGkgR290aGljIiwKKyAgICAgICJWTCBHb3RoaWMgcmVndWxhciJ9fSwKKyAgICB7eyJUYWthb0dvdGhpYyIsICJWTCBHb3RoaWMiLCAiSVBBR290aGljIiwgIktvY2hpIEdvdGhpYyIsIE5VTEwsCisgICAgICAiVkwgR290aGljIHJlZ3VsYXIifX0sCisgICAge3siVGFrYW9QTWluY2hvIiwgIklQQVBNaW5jaG8iLCAiVkwgR290aGljIiwgIktvY2hpIE1pbmNobyIsIE5VTEwsCisgICAgICAiVkwgR290aGljIHJlZ3VsYXIifX0sCisgICAge3siVGFrYW9NaW5jaG8iLCAiSVBBTWluY2hvIiwgIlZMIEdvdGhpYyIsICJLb2NoaSBNaW5jaG8iLCBOVUxMLAorICAgICAgIlZMIEdvdGhpYyByZWd1bGFyIn19LAogfTsKIHN0YXRpYyBjb25zdCBGWF9DSEFSKiBjb25zdCBnX0xpbnV4R2JGb250TGlzdFtdID0gewotICAgICJBUiBQTCBVTWluZyBDTiBMaWdodCIsCi0gICAgIldlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICJBUiBQTCBVS2FpIENOIiwKKyAgICAiQVIgUEwgVU1pbmcgQ04gTGlnaHQiLCAiV2VuUXVhbllpIE1pY3JvIEhlaSIsICJBUiBQTCBVS2FpIENOIiwKIH07CiBzdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgZ19MaW51eEI1Rm9udExpc3RbXSA9IHsKLSAgICAiQVIgUEwgVU1pbmcgVFcgTGlnaHQiLAotICAgICJXZW5RdWFuWWkgTWljcm8gSGVpIiwKLSAgICAiQVIgUEwgVUthaSBUVyIsCisgICAgIkFSIFBMIFVNaW5nIFRXIExpZ2h0IiwgIldlblF1YW5ZaSBNaWNybyBIZWkiLCAiQVIgUEwgVUthaSBUVyIsCiB9Owogc3RhdGljIGNvbnN0IEZYX0NIQVIqIGNvbnN0IGdfTGludXhIR0ZvbnRMaXN0W10gPSB7CiAgICAgIlVuRG90dW0iLAogfTsKLXN0YXRpYyBpbnQzMl90IEdldEphcGFuZXNlUHJlZmVyZW5jZShjb25zdCBGWF9DSEFSKiBmYWNlYXJyLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhfZmFtaWx5KQotewotICAgIENGWF9CeXRlU3RyaW5nIGZhY2UgPSBmYWNlYXJyOwotICAgIGlmIChmYWNlLkZpbmQoIkdvdGhpYyIpID49IDAgfHwgZmFjZS5GaW5kKCJceDgzXHg1M1x4ODNceDU2XHg4M1x4NjJceDgzXHg0ZSIpID49IDApIHsKLSAgICAgICAgaWYgKGZhY2UuRmluZCgiUEdvdGhpYyIpID49IDAgfHwgZmFjZS5GaW5kKCJceDgyXHg2Zlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRlIikgPj0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7CitzdGF0aWMgaW50MzJfdCBHZXRKYXBhbmVzZVByZWZlcmVuY2UoY29uc3QgRlhfQ0hBUiogZmFjZWFyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWN0aF9mYW1pbHkpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGZhY2VhcnI7CisgIGlmIChmYWNlLkZpbmQoIkdvdGhpYyIpID49IDAgfHwKKyAgICAgIGZhY2UuRmluZCgiXHg4M1x4NTNceDgzXHg1Nlx4ODNceDYyXHg4M1x4NGUiKSA+PSAwKSB7CisgICAgaWYgKGZhY2UuRmluZCgiUEdvdGhpYyIpID49IDAgfHwKKyAgICAgICAgZmFjZS5GaW5kKCJceDgyXHg2Zlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRlIikgPj0gMCkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChmYWNlLkZpbmQoIk1pbmNobyIpID49IDAgfHwgZmFjZS5GaW5kKCJceDk2XHhiZVx4OTJceGE5IikgPj0gMCkgewotICAgICAgICBpZiAoZmFjZS5GaW5kKCJQTWluY2hvIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4ODJceDZmXHg5Nlx4YmVceDkyXHhhOSIpID49IDApIHsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAzOworICAgIHJldHVybiAxOworICB9CisgIGlmIChmYWNlLkZpbmQoIk1pbmNobyIpID49IDAgfHwgZmFjZS5GaW5kKCJceDk2XHhiZVx4OTJceGE5IikgPj0gMCkgeworICAgIGlmIChmYWNlLkZpbmQoIlBNaW5jaG8iKSA+PSAwIHx8CisgICAgICAgIGZhY2UuRmluZCgiXHg4Mlx4NmZceDk2XHhiZVx4OTJceGE5IikgPj0gMCkgeworICAgICAgcmV0dXJuIDI7CiAgICAgfQotICAgIGlmICghKHBpY3RoX2ZhbWlseSAmIEZYRk9OVF9GRl9ST01BTikgJiYgd2VpZ2h0ID4gNDAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMjsKLX0KLXZvaWQqIENGWF9MaW51eEZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGNzdHJfZmFjZSwgaW50JiBpRXhhY3QpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGNzdHJfZmFjZTsKLSAgICBpbnQgaUJhc2VGb250OwotICAgIGZvciAoaUJhc2VGb250ID0gMDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCArKykKLSAgICAgICAgaWYgKGZhY2UgPT0gQ0ZYX0J5dGVTdHJpbmdDKEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcE5hbWUpKSB7Ci0gICAgICAgICAgICBmYWNlID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wU3Vic3ROYW1lOwotICAgICAgICAgICAgaUV4YWN0ID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgaWYgKGlCYXNlRm9udCA8IDEyKSB7Ci0gICAgICAgIHJldHVybiBHZXRGb250KGZhY2UpOwotICAgIH0KLSAgICB2b2lkKiBwID0gTlVMTDsKLSAgICBGWF9CT09MIGJDSksgPSBUUlVFOwotICAgIHN3aXRjaCAoY2hhcnNldCkgewotICAgICAgICBjYXNlIEZYRk9OVF9TSElGVEpJU19DSEFSU0VUOiB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleCA9IEdldEphcGFuZXNlUHJlZmVyZW5jZShjc3RyX2ZhY2UsIHdlaWdodCwgcGl0Y2hfZmFtaWx5KTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBMSU5VWF9HUE5BTUVTSVpFOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZvbnRMaXN0Lkxvb2t1cChMaW51eEdwRm9udExpc3RbaW5kZXhdLk5hbWVBcnJbaV0sIHApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhGT05UX0dCMjMxMl9DSEFSU0VUOiB7Ci0gICAgICAgICAgICAgICAgc3RhdGljIGludDMyX3Qgc19nYkNvdW50ID0gc2l6ZW9mKGdfTGludXhHYkZvbnRMaXN0KSAvIHNpemVvZihjb25zdCBGWF9DSEFSKik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc19nYkNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZvbnRMaXN0Lkxvb2t1cChnX0xpbnV4R2JGb250TGlzdFtpXSwgcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDogewotICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQzMl90IHNfYjVDb3VudCA9IHNpemVvZihnX0xpbnV4QjVGb250TGlzdCkgLyBzaXplb2YoY29uc3QgRlhfQ0hBUiopOwotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNfYjVDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBpZiAobV9Gb250TGlzdC5Mb29rdXAoZ19MaW51eEI1Rm9udExpc3RbaV0sIHApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVDogewotICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQzMl90IHNfaGdDb3VudCA9IHNpemVvZihnX0xpbnV4SEdGb250TGlzdCkgLyBzaXplb2YoY29uc3QgRlhfQ0hBUiopOwotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNfaGdDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBpZiAobV9Gb250TGlzdC5Mb29rdXAoZ19MaW51eEhHRm9udExpc3RbaV0sIHApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBiQ0pLID0gRkFMU0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCAmJiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpKSB7Ci0gICAgICAgIHJldHVybiBHZXRGb250KCJDb3VyaWVyIE5ldyIpOwotICAgIH0KLSAgICByZXR1cm4gRmluZEZvbnQod2VpZ2h0LCBiSXRhbGljLCBjaGFyc2V0LCBwaXRjaF9mYW1pbHksIGNzdHJfZmFjZSwgIWJDSkspOwotfQotc3RhdGljIEZYX0RXT1JEIF9MaW51eEdldENoYXJzZXQoaW50IGNoYXJzZXQpCi17Ci0gICAgc3dpdGNoKGNoYXJzZXQpIHsKLSAgICAgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfU0hJRlRKSVM7Ci0gICAgICAgIGNhc2UgRlhGT05UX0dCMjMxMl9DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19HQjsKLSAgICAgICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfQklHNTsKLSAgICAgICAgY2FzZSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19LT1JFQU47Ci0gICAgICAgIGNhc2UgRlhGT05UX1NZTUJPTF9DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19TWU1CT0w7Ci0gICAgICAgIGNhc2UgRlhGT05UX0FOU0lfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfQU5TSTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KKyAgICByZXR1cm4gMzsKKyAgfQorICBpZiAoIShwaWN0aF9mYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pICYmIHdlaWdodCA+IDQwMCkgewogICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAyOwogfQotc3RhdGljIGludDMyX3QgX0xpbnV4R2V0U2ltaWxhclZhbHVlKGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IHBpdGNoX2ZhbWlseSwgRlhfRFdPUkQgc3R5bGUpCi17Cit2b2lkKiBDRlhfTGludXhGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogY3N0cl9mYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGNzdHJfZmFjZTsKKyAgaW50IGlCYXNlRm9udDsKKyAgZm9yIChpQmFzZUZvbnQgPSAwOyBpQmFzZUZvbnQgPCAxMjsgaUJhc2VGb250KyspCisgICAgaWYgKGZhY2UgPT0gQ0ZYX0J5dGVTdHJpbmdDKEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcE5hbWUpKSB7CisgICAgICBmYWNlID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wU3Vic3ROYW1lOworICAgICAgaUV4YWN0ID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgaWYgKGlCYXNlRm9udCA8IDEyKSB7CisgICAgcmV0dXJuIEdldEZvbnQoZmFjZSk7CisgIH0KKyAgdm9pZCogcCA9IE5VTEw7CisgIEZYX0JPT0wgYkNKSyA9IFRSVUU7CisgIHN3aXRjaCAoY2hhcnNldCkgeworICAgIGNhc2UgRlhGT05UX1NISUZUSklTX0NIQVJTRVQ6IHsKKyAgICAgIGludDMyX3QgaW5kZXggPSBHZXRKYXBhbmVzZVByZWZlcmVuY2UoY3N0cl9mYWNlLCB3ZWlnaHQsIHBpdGNoX2ZhbWlseSk7CisgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgTElOVVhfR1BOQU1FU0laRTsgaSsrKQorICAgICAgICBpZiAobV9Gb250TGlzdC5Mb29rdXAoTGludXhHcEZvbnRMaXN0W2luZGV4XS5OYW1lQXJyW2ldLCBwKSkgeworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDogeworICAgICAgc3RhdGljIGludDMyX3Qgc19nYkNvdW50ID0KKyAgICAgICAgICBzaXplb2YoZ19MaW51eEdiRm9udExpc3QpIC8gc2l6ZW9mKGNvbnN0IEZYX0NIQVIqKTsKKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNfZ2JDb3VudDsgaSsrKQorICAgICAgICBpZiAobV9Gb250TGlzdC5Mb29rdXAoZ19MaW51eEdiRm9udExpc3RbaV0sIHApKSB7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQ6IHsKKyAgICAgIHN0YXRpYyBpbnQzMl90IHNfYjVDb3VudCA9CisgICAgICAgICAgc2l6ZW9mKGdfTGludXhCNUZvbnRMaXN0KSAvIHNpemVvZihjb25zdCBGWF9DSEFSKik7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzX2I1Q291bnQ7IGkrKykKKyAgICAgICAgaWYgKG1fRm9udExpc3QuTG9va3VwKGdfTGludXhCNUZvbnRMaXN0W2ldLCBwKSkgeworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQ6IHsKKyAgICAgIHN0YXRpYyBpbnQzMl90IHNfaGdDb3VudCA9CisgICAgICAgICAgc2l6ZW9mKGdfTGludXhIR0ZvbnRMaXN0KSAvIHNpemVvZihjb25zdCBGWF9DSEFSKik7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzX2hnQ291bnQ7IGkrKykKKyAgICAgICAgaWYgKG1fRm9udExpc3QuTG9va3VwKGdfTGludXhIR0ZvbnRMaXN0W2ldLCBwKSkgeworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYkNKSyA9IEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCAmJiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpKSB7CisgICAgcmV0dXJuIEdldEZvbnQoIkNvdXJpZXIgTmV3Iik7CisgIH0KKyAgcmV0dXJuIEZpbmRGb250KHdlaWdodCwgYkl0YWxpYywgY2hhcnNldCwgcGl0Y2hfZmFtaWx5LCBjc3RyX2ZhY2UsICFiQ0pLKTsKK30KK3N0YXRpYyBGWF9EV09SRCBfTGludXhHZXRDaGFyc2V0KGludCBjaGFyc2V0KSB7CisgIHN3aXRjaCAoY2hhcnNldCkgeworICAgIGNhc2UgRlhGT05UX1NISUZUSklTX0NIQVJTRVQ6CisgICAgICByZXR1cm4gQ0hBUlNFVF9GTEFHX1NISUZUSklTOworICAgIGNhc2UgRlhGT05UX0dCMjMxMl9DSEFSU0VUOgorICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19HQjsKKyAgICBjYXNlIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUOgorICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19CSUc1OworICAgIGNhc2UgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVDoKKyAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfS09SRUFOOworICAgIGNhc2UgRlhGT05UX1NZTUJPTF9DSEFSU0VUOgorICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19TWU1CT0w7CisgICAgY2FzZSBGWEZPTlRfQU5TSV9DSEFSU0VUOgorICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19BTlNJOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQzMl90IF9MaW51eEdldFNpbWlsYXJWYWx1ZShpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0eWxlKSB7CisgIGludDMyX3QgaVNpbWlsYXJWYWx1ZSA9IDA7CisgIGlmICgoc3R5bGUgJiBGWEZPTlRfQk9MRCkgPT0gKHdlaWdodCA+IDQwMCkpIHsKKyAgICBpU2ltaWxhclZhbHVlICs9IDE2OworICB9CisgIGlmICgoc3R5bGUgJiBGWEZPTlRfSVRBTElDKSA9PSBiSXRhbGljKSB7CisgICAgaVNpbWlsYXJWYWx1ZSArPSAxNjsKKyAgfQorICBpZiAoKHN0eWxlICYgRlhGT05UX1NFUklGKSA9PSAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX1JPTUFOKSkgeworICAgIGlTaW1pbGFyVmFsdWUgKz0gMTY7CisgIH0KKyAgaWYgKChzdHlsZSAmIEZYRk9OVF9TQ1JJUFQpID09IChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfU0NSSVBUKSkgeworICAgIGlTaW1pbGFyVmFsdWUgKz0gODsKKyAgfQorICBpZiAoKHN0eWxlICYgRlhGT05UX0ZJWEVEX1BJVENIKSA9PSAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpKSB7CisgICAgaVNpbWlsYXJWYWx1ZSArPSA4OworICB9CisgIHJldHVybiBpU2ltaWxhclZhbHVlOworfQordm9pZCogQ0ZYX0xpbnV4Rm9udEluZm86OkZpbmRGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1hdGNoTmFtZSkgeworICBDRm9udEZhY2VJbmZvKiBwRmluZCA9IE5VTEw7CisgIEZYX0RXT1JEIGNoYXJzZXRfZmxhZyA9IF9MaW51eEdldENoYXJzZXQoY2hhcnNldCk7CisgIGludDMyX3QgaUJlc3RTaW1pbGFyID0gMDsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9Gb250TGlzdC5HZXRTdGFydFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBic05hbWU7CisgICAgQ0ZvbnRGYWNlSW5mbyogcEZvbnQgPSBOVUxMOworICAgIG1fRm9udExpc3QuR2V0TmV4dEFzc29jKHBvcywgYnNOYW1lLCAodm9pZComKXBGb250KTsKKyAgICBpZiAoIShwRm9udC0+bV9DaGFyc2V0cyAmIGNoYXJzZXRfZmxhZykgJiYKKyAgICAgICAgY2hhcnNldCAhPSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CiAgICAgaW50MzJfdCBpU2ltaWxhclZhbHVlID0gMDsKLSAgICBpZiAoKHN0eWxlICYgRlhGT05UX0JPTEQpID09ICh3ZWlnaHQgPiA0MDApKSB7Ci0gICAgICAgIGlTaW1pbGFyVmFsdWUgKz0gMTY7CisgICAgaW50MzJfdCBpbmRleCA9IGJzTmFtZS5GaW5kKGZhbWlseSk7CisgICAgaWYgKGJNYXRjaE5hbWUgJiYgaW5kZXggPCAwKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKChzdHlsZSAmIEZYRk9OVF9JVEFMSUMpID09IGJJdGFsaWMpIHsKLSAgICAgICAgaVNpbWlsYXJWYWx1ZSArPSAxNjsKKyAgICBpZiAoIWJNYXRjaE5hbWUgJiYgaW5kZXggPiAwKSB7CisgICAgICBpU2ltaWxhclZhbHVlICs9IDY0OwogICAgIH0KLSAgICBpZiAoKHN0eWxlICYgRlhGT05UX1NFUklGKSA9PSAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX1JPTUFOKSkgewotICAgICAgICBpU2ltaWxhclZhbHVlICs9IDE2OworICAgIGlTaW1pbGFyVmFsdWUgPQorICAgICAgICBfTGludXhHZXRTaW1pbGFyVmFsdWUod2VpZ2h0LCBiSXRhbGljLCBwaXRjaF9mYW1pbHksIHBGb250LT5tX1N0eWxlcyk7CisgICAgaWYgKGlTaW1pbGFyVmFsdWUgPiBpQmVzdFNpbWlsYXIpIHsKKyAgICAgIGlCZXN0U2ltaWxhciA9IGlTaW1pbGFyVmFsdWU7CisgICAgICBwRmluZCA9IHBGb250OwogICAgIH0KLSAgICBpZiAoKHN0eWxlICYgRlhGT05UX1NDUklQVCkgPT0gKHBpdGNoX2ZhbWlseSAmIEZYRk9OVF9GRl9TQ1JJUFQpKSB7Ci0gICAgICAgIGlTaW1pbGFyVmFsdWUgKz0gODsKLSAgICB9Ci0gICAgaWYgKChzdHlsZSAmIEZYRk9OVF9GSVhFRF9QSVRDSCkgPT0gKHBpdGNoX2ZhbWlseSAmIEZYRk9OVF9GRl9GSVhFRFBJVENIKSkgewotICAgICAgICBpU2ltaWxhclZhbHVlICs9IDg7Ci0gICAgfQotICAgIHJldHVybiBpU2ltaWxhclZhbHVlOworICB9CisgIHJldHVybiBwRmluZDsKIH0KLXZvaWQqIENGWF9MaW51eEZvbnRJbmZvOjpGaW5kRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIEZYX0JPT0wgYk1hdGNoTmFtZSkKLXsKLSAgICBDRm9udEZhY2VJbmZvKiBwRmluZCA9IE5VTEw7Ci0gICAgRlhfRFdPUkQgY2hhcnNldF9mbGFnID0gX0xpbnV4R2V0Q2hhcnNldChjaGFyc2V0KTsKLSAgICBpbnQzMl90IGlCZXN0U2ltaWxhciA9IDA7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9Gb250TGlzdC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic05hbWU7Ci0gICAgICAgIENGb250RmFjZUluZm8qIHBGb250ID0gTlVMTDsKLSAgICAgICAgbV9Gb250TGlzdC5HZXROZXh0QXNzb2MocG9zLCBic05hbWUsICh2b2lkKiYpcEZvbnQpOwotICAgICAgICBpZiAoIShwRm9udC0+bV9DaGFyc2V0cyAmIGNoYXJzZXRfZmxhZykgJiYgY2hhcnNldCAhPSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IGlTaW1pbGFyVmFsdWUgPSAwOwotICAgICAgICBpbnQzMl90IGluZGV4ID0gYnNOYW1lLkZpbmQoZmFtaWx5KTsKLSAgICAgICAgaWYgKGJNYXRjaE5hbWUgJiYgaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWJNYXRjaE5hbWUgJiYgaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICBpU2ltaWxhclZhbHVlICs9IDY0OwotICAgICAgICB9Ci0gICAgICAgIGlTaW1pbGFyVmFsdWUgPSBfTGludXhHZXRTaW1pbGFyVmFsdWUod2VpZ2h0LCBiSXRhbGljLCBwaXRjaF9mYW1pbHksIHBGb250LT5tX1N0eWxlcyk7Ci0gICAgICAgIGlmIChpU2ltaWxhclZhbHVlID4gaUJlc3RTaW1pbGFyKSB7Ci0gICAgICAgICAgICBpQmVzdFNpbWlsYXIgPSBpU2ltaWxhclZhbHVlOwotICAgICAgICAgICAgcEZpbmQgPSBwRm9udDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcEZpbmQ7CitJRlhfU3lzdGVtRm9udEluZm8qIElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgpIHsKKyAgQ0ZYX0xpbnV4Rm9udEluZm8qIHBJbmZvID0gRlhfTkVXIENGWF9MaW51eEZvbnRJbmZvOworICBpZiAoIXBJbmZvKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCFwSW5mby0+UGFyc2VGb250Q2ZnKCkpIHsKKyAgICBwSW5mby0+QWRkUGF0aCgiL3Vzci9zaGFyZS9mb250cyIpOworICAgIHBJbmZvLT5BZGRQYXRoKCIvdXNyL3NoYXJlL1gxMS9mb250cy9UeXBlMSIpOworICAgIHBJbmZvLT5BZGRQYXRoKCIvdXNyL3NoYXJlL1gxMS9mb250cy9UVEYiKTsKKyAgICBwSW5mby0+QWRkUGF0aCgiL3Vzci9sb2NhbC9zaGFyZS9mb250cyIpOworICB9CisgIHJldHVybiBwSW5mbzsKIH0KLUlGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkKLXsKLSAgICBDRlhfTGludXhGb250SW5mbyogcEluZm8gPSBGWF9ORVcgQ0ZYX0xpbnV4Rm9udEluZm87Ci0gICAgaWYgKCFwSW5mbykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFwSW5mby0+UGFyc2VGb250Q2ZnKCkpIHsKLSAgICAgICAgcEluZm8tPkFkZFBhdGgoIi91c3Ivc2hhcmUvZm9udHMiKTsKLSAgICAgICAgcEluZm8tPkFkZFBhdGgoIi91c3Ivc2hhcmUvWDExL2ZvbnRzL1R5cGUxIik7Ci0gICAgICAgIHBJbmZvLT5BZGRQYXRoKCIvdXNyL3NoYXJlL1gxMS9mb250cy9UVEYiKTsKLSAgICAgICAgcEluZm8tPkFkZFBhdGgoIi91c3IvbG9jYWwvc2hhcmUvZm9udHMiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBJbmZvOworRlhfQk9PTCBDRlhfTGludXhGb250SW5mbzo6UGFyc2VGb250Q2ZnKCkgeworICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENGWF9MaW51eEZvbnRJbmZvOjpQYXJzZUZvbnRDZmcoKQotewotICAgIHJldHVybiBGQUxTRTsKK3ZvaWQgQ0ZYX0dFTW9kdWxlOjpJbml0UGxhdGZvcm0oKSB7CisgIG1fcEZvbnRNZ3ItPlNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgpKTsKIH0KLXZvaWQgQ0ZYX0dFTW9kdWxlOjpJbml0UGxhdGZvcm0oKQotewotICAgIG1fcEZvbnRNZ3ItPlNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgpKTsKLX0KLXZvaWQgQ0ZYX0dFTW9kdWxlOjpEZXN0cm95UGxhdGZvcm0oKQotewotfQordm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3lQbGF0Zm9ybSgpIHt9CiAjZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BhdGguY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wYXRoLmNwcAppbmRleCBiMTQxMGIzLi5iNTBjMjcxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BhdGguY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfcGF0aC5jcHAKQEAgLTgsNjI0ICs4LDY2NCBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCiAKLUNGWF9DbGlwUmduOjpDRlhfQ2xpcFJnbihpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17CitDRlhfQ2xpcFJnbjo6Q0ZYX0NsaXBSZ24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIG1fVHlwZSA9IFJlY3RJOworICBtX0JveC5sZWZ0ID0gbV9Cb3gudG9wID0gMDsKKyAgbV9Cb3gucmlnaHQgPSB3aWR0aDsKKyAgbV9Cb3guYm90dG9tID0gaGVpZ2h0OworfQorQ0ZYX0NsaXBSZ246OkNGWF9DbGlwUmduKGNvbnN0IEZYX1JFQ1QmIHJlY3QpIHsKKyAgbV9UeXBlID0gUmVjdEk7CisgIG1fQm94ID0gcmVjdDsKK30KK0NGWF9DbGlwUmduOjpDRlhfQ2xpcFJnbihjb25zdCBDRlhfQ2xpcFJnbiYgc3JjKSB7CisgIG1fVHlwZSA9IHNyYy5tX1R5cGU7CisgIG1fQm94ID0gc3JjLm1fQm94OworICBtX01hc2sgPSBzcmMubV9NYXNrOworfQorQ0ZYX0NsaXBSZ246On5DRlhfQ2xpcFJnbigpIHt9Cit2b2lkIENGWF9DbGlwUmduOjpSZXNldChjb25zdCBGWF9SRUNUJiByZWN0KSB7CisgIG1fVHlwZSA9IFJlY3RJOworICBtX0JveCA9IHJlY3Q7CisgIG1fTWFzay5TZXROdWxsKCk7Cit9Cit2b2lkIENGWF9DbGlwUmduOjpJbnRlcnNlY3RSZWN0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpIHsKKyAgaWYgKG1fVHlwZSA9PSBSZWN0SSkgeworICAgIG1fQm94LkludGVyc2VjdChyZWN0KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fVHlwZSA9PSBNYXNrRikgeworICAgIEludGVyc2VjdE1hc2tSZWN0KHJlY3QsIG1fQm94LCBtX01hc2spOworICAgIHJldHVybjsKKyAgfQorfQordm9pZCBDRlhfQ2xpcFJnbjo6SW50ZXJzZWN0TWFza1JlY3QoRlhfUkVDVCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCBtYXNrX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXBSZWYgTWFzaykgeworICBjb25zdCBDRlhfRElCaXRtYXAqIG1hc2tfZGliID0gTWFzazsKKyAgbV9UeXBlID0gTWFza0Y7CisgIG1fQm94ID0gcmVjdDsKKyAgbV9Cb3guSW50ZXJzZWN0KG1hc2tfcmVjdCk7CisgIGlmIChtX0JveC5Jc0VtcHR5KCkpIHsKICAgICBtX1R5cGUgPSBSZWN0STsKLSAgICBtX0JveC5sZWZ0ID0gbV9Cb3gudG9wID0gMDsKLSAgICBtX0JveC5yaWdodCA9IHdpZHRoOwotICAgIG1fQm94LmJvdHRvbSA9IGhlaWdodDsKLX0KLUNGWF9DbGlwUmduOjpDRlhfQ2xpcFJnbihjb25zdCBGWF9SRUNUJiByZWN0KQotewotICAgIG1fVHlwZSA9IFJlY3RJOwotICAgIG1fQm94ID0gcmVjdDsKLX0KLUNGWF9DbGlwUmduOjpDRlhfQ2xpcFJnbihjb25zdCBDRlhfQ2xpcFJnbiYgc3JjKQotewotICAgIG1fVHlwZSA9IHNyYy5tX1R5cGU7Ci0gICAgbV9Cb3ggPSBzcmMubV9Cb3g7Ci0gICAgbV9NYXNrID0gc3JjLm1fTWFzazsKLX0KLUNGWF9DbGlwUmduOjp+Q0ZYX0NsaXBSZ24oKQotewotfQotdm9pZCBDRlhfQ2xpcFJnbjo6UmVzZXQoY29uc3QgRlhfUkVDVCYgcmVjdCkKLXsKLSAgICBtX1R5cGUgPSBSZWN0STsKLSAgICBtX0JveCA9IHJlY3Q7Ci0gICAgbV9NYXNrLlNldE51bGwoKTsKLX0KLXZvaWQgQ0ZYX0NsaXBSZ246OkludGVyc2VjdFJlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCkKLXsKLSAgICBpZiAobV9UeXBlID09IFJlY3RJKSB7Ci0gICAgICAgIG1fQm94LkludGVyc2VjdChyZWN0KTsKLSAgICAgICAgcmV0dXJuOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9Cb3ggPT0gbWFza19yZWN0KSB7CisgICAgbV9NYXNrID0gTWFzazsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0RJQml0bWFwKiBuZXdfZGliID0gbV9NYXNrLk5ldygpOworICBpZiAoIW5ld19kaWIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbmV3X2RpYi0+Q3JlYXRlKG1fQm94LldpZHRoKCksIG1fQm94LkhlaWdodCgpLCBGWERJQl84YnBwTWFzayk7CisgIGZvciAoaW50IHJvdyA9IG1fQm94LnRvcDsgcm93IDwgbV9Cb3guYm90dG9tOyByb3crKykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgIG5ld19kaWItPkdldEJ1ZmZlcigpICsgbmV3X2RpYi0+R2V0UGl0Y2goKSAqIChyb3cgLSBtX0JveC50b3ApOworICAgIHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgbWFza19kaWItPkdldEJ1ZmZlcigpICsgbWFza19kaWItPkdldFBpdGNoKCkgKiAocm93IC0gbWFza19yZWN0LnRvcCk7CisgICAgZm9yIChpbnQgY29sID0gbV9Cb3gubGVmdDsgY29sIDwgbV9Cb3gucmlnaHQ7IGNvbCsrKSB7CisgICAgICBkZXN0X3NjYW5bY29sIC0gbV9Cb3gubGVmdF0gPSBzcmNfc2Nhbltjb2wgLSBtYXNrX3JlY3QubGVmdF07CiAgICAgfQotICAgIGlmIChtX1R5cGUgPT0gTWFza0YpIHsKLSAgICAgICAgSW50ZXJzZWN0TWFza1JlY3QocmVjdCwgbV9Cb3gsIG1fTWFzayk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgIH0KIH0KLXZvaWQgQ0ZYX0NsaXBSZ246OkludGVyc2VjdE1hc2tSZWN0KEZYX1JFQ1QgcmVjdCwgRlhfUkVDVCBtYXNrX3JlY3QsIENGWF9ESUJpdG1hcFJlZiBNYXNrKQotewotICAgIGNvbnN0IENGWF9ESUJpdG1hcCogbWFza19kaWIgPSBNYXNrOwotICAgIG1fVHlwZSA9IE1hc2tGOwotICAgIG1fQm94ID0gcmVjdDsKLSAgICBtX0JveC5JbnRlcnNlY3QobWFza19yZWN0KTsKLSAgICBpZiAobV9Cb3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIG1fVHlwZSA9IFJlY3RJOwotICAgICAgICByZXR1cm47Cit2b2lkIENGWF9DbGlwUmduOjpJbnRlcnNlY3RNYXNrRihpbnQgbGVmdCwgaW50IHRvcCwgQ0ZYX0RJQml0bWFwUmVmIE1hc2spIHsKKyAgY29uc3QgQ0ZYX0RJQml0bWFwKiBtYXNrX2RpYiA9IE1hc2s7CisgIEFTU0VSVChtYXNrX2RpYi0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfOGJwcE1hc2spOworICBGWF9SRUNUIG1hc2tfYm94KGxlZnQsIHRvcCwgbGVmdCArIG1hc2tfZGliLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgIHRvcCArIG1hc2tfZGliLT5HZXRIZWlnaHQoKSk7CisgIGlmIChtX1R5cGUgPT0gUmVjdEkpIHsKKyAgICBJbnRlcnNlY3RNYXNrUmVjdChtX0JveCwgbWFza19ib3gsIE1hc2spOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9UeXBlID09IE1hc2tGKSB7CisgICAgRlhfUkVDVCBuZXdfYm94ID0gbV9Cb3g7CisgICAgbmV3X2JveC5JbnRlcnNlY3QobWFza19ib3gpOworICAgIGlmIChuZXdfYm94LklzRW1wdHkoKSkgeworICAgICAgbV9UeXBlID0gUmVjdEk7CisgICAgICBtX01hc2suU2V0TnVsbCgpOworICAgICAgbV9Cb3ggPSBuZXdfYm94OworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAobV9Cb3ggPT0gbWFza19yZWN0KSB7Ci0gICAgICAgIG1fTWFzayA9IE1hc2s7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0RJQml0bWFwKiBuZXdfZGliID0gbV9NYXNrLk5ldygpOworICAgIENGWF9ESUJpdG1hcFJlZiBuZXdfbWFzazsKKyAgICBDRlhfRElCaXRtYXAqIG5ld19kaWIgPSBuZXdfbWFzay5OZXcoKTsKICAgICBpZiAoIW5ld19kaWIpIHsKLSAgICAgICAgcmV0dXJuOworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBuZXdfZGliLT5DcmVhdGUobV9Cb3guV2lkdGgoKSwgbV9Cb3guSGVpZ2h0KCksIEZYRElCXzhicHBNYXNrKTsKLSAgICBmb3IgKGludCByb3cgPSBtX0JveC50b3A7IHJvdyA8IG1fQm94LmJvdHRvbTsgcm93ICsrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG5ld19kaWItPkdldEJ1ZmZlcigpICsgbmV3X2RpYi0+R2V0UGl0Y2goKSAqIChyb3cgLSBtX0JveC50b3ApOwotICAgICAgICB1aW50OF90KiBzcmNfc2NhbiA9IG1hc2tfZGliLT5HZXRCdWZmZXIoKSArIG1hc2tfZGliLT5HZXRQaXRjaCgpICogKHJvdyAtIG1hc2tfcmVjdC50b3ApOwotICAgICAgICBmb3IgKGludCBjb2wgPSBtX0JveC5sZWZ0OyBjb2wgPCBtX0JveC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bY29sIC0gbV9Cb3gubGVmdF0gPSBzcmNfc2Nhbltjb2wgLSBtYXNrX3JlY3QubGVmdF07Ci0gICAgICAgIH0KKyAgICBuZXdfZGliLT5DcmVhdGUobmV3X2JveC5XaWR0aCgpLCBuZXdfYm94LkhlaWdodCgpLCBGWERJQl84YnBwTWFzayk7CisgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBvbGRfZGliID0gbV9NYXNrOworICAgIGZvciAoaW50IHJvdyA9IG5ld19ib3gudG9wOyByb3cgPCBuZXdfYm94LmJvdHRvbTsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIG9sZF9zY2FuID0KKyAgICAgICAgICBvbGRfZGliLT5HZXRCdWZmZXIoKSArIChyb3cgLSBtX0JveC50b3ApICogb2xkX2RpYi0+R2V0UGl0Y2goKTsKKyAgICAgIHVpbnQ4X3QqIG1hc2tfc2NhbiA9CisgICAgICAgICAgbWFza19kaWItPkdldEJ1ZmZlcigpICsgKHJvdyAtIHRvcCkgKiBtYXNrX2RpYi0+R2V0UGl0Y2goKTsKKyAgICAgIHVpbnQ4X3QqIG5ld19zY2FuID0KKyAgICAgICAgICBuZXdfZGliLT5HZXRCdWZmZXIoKSArIChyb3cgLSBuZXdfYm94LnRvcCkgKiBuZXdfZGliLT5HZXRQaXRjaCgpOworICAgICAgZm9yIChpbnQgY29sID0gbmV3X2JveC5sZWZ0OyBjb2wgPCBuZXdfYm94LnJpZ2h0OyBjb2wrKykgeworICAgICAgICBuZXdfc2Nhbltjb2wgLSBuZXdfYm94LmxlZnRdID0KKyAgICAgICAgICAgIG9sZF9zY2FuW2NvbCAtIG1fQm94LmxlZnRdICogbWFza19zY2FuW2NvbCAtIGxlZnRdIC8gMjU1OworICAgICAgfQogICAgIH0KKyAgICBtX0JveCA9IG5ld19ib3g7CisgICAgbV9NYXNrID0gbmV3X21hc2s7CisgICAgcmV0dXJuOworICB9CisgIEFTU0VSVChGQUxTRSk7CiB9Ci12b2lkIENGWF9DbGlwUmduOjpJbnRlcnNlY3RNYXNrRihpbnQgbGVmdCwgaW50IHRvcCwgQ0ZYX0RJQml0bWFwUmVmIE1hc2spCi17Ci0gICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBtYXNrX2RpYiA9IE1hc2s7Ci0gICAgQVNTRVJUKG1hc2tfZGliLT5HZXRGb3JtYXQoKSA9PSBGWERJQl84YnBwTWFzayk7Ci0gICAgRlhfUkVDVCBtYXNrX2JveChsZWZ0LCB0b3AsIGxlZnQgKyBtYXNrX2RpYi0+R2V0V2lkdGgoKSwgdG9wICsgbWFza19kaWItPkdldEhlaWdodCgpKTsKLSAgICBpZiAobV9UeXBlID09IFJlY3RJKSB7Ci0gICAgICAgIEludGVyc2VjdE1hc2tSZWN0KG1fQm94LCBtYXNrX2JveCwgTWFzayk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fVHlwZSA9PSBNYXNrRikgewotICAgICAgICBGWF9SRUNUIG5ld19ib3ggPSBtX0JveDsKLSAgICAgICAgbmV3X2JveC5JbnRlcnNlY3QobWFza19ib3gpOwotICAgICAgICBpZiAobmV3X2JveC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1fVHlwZSA9IFJlY3RJOwotICAgICAgICAgICAgbV9NYXNrLlNldE51bGwoKTsKLSAgICAgICAgICAgIG1fQm94ID0gbmV3X2JveDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBDRlhfRElCaXRtYXBSZWYgbmV3X21hc2s7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogbmV3X2RpYiA9IG5ld19tYXNrLk5ldygpOwotICAgICAgICBpZiAoIW5ld19kaWIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBuZXdfZGliLT5DcmVhdGUobmV3X2JveC5XaWR0aCgpLCBuZXdfYm94LkhlaWdodCgpLCBGWERJQl84YnBwTWFzayk7Ci0gICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogb2xkX2RpYiA9IG1fTWFzazsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gbmV3X2JveC50b3A7IHJvdyA8IG5ld19ib3guYm90dG9tOyByb3cgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIG9sZF9zY2FuID0gb2xkX2RpYi0+R2V0QnVmZmVyKCkgKyAocm93IC0gbV9Cb3gudG9wKSAqIG9sZF9kaWItPkdldFBpdGNoKCk7Ci0gICAgICAgICAgICB1aW50OF90KiBtYXNrX3NjYW4gPSBtYXNrX2RpYi0+R2V0QnVmZmVyKCkgKyAocm93IC0gdG9wKSAqIG1hc2tfZGliLT5HZXRQaXRjaCgpOwotICAgICAgICAgICAgdWludDhfdCogbmV3X3NjYW4gPSBuZXdfZGliLT5HZXRCdWZmZXIoKSArIChyb3cgLSBuZXdfYm94LnRvcCkgKiBuZXdfZGliLT5HZXRQaXRjaCgpOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gbmV3X2JveC5sZWZ0OyBjb2wgPCBuZXdfYm94LnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBuZXdfc2Nhbltjb2wgLSBuZXdfYm94LmxlZnRdID0gb2xkX3NjYW5bY29sIC0gbV9Cb3gubGVmdF0gKiBtYXNrX3NjYW5bY29sIC0gbGVmdF0gLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9Cb3ggPSBuZXdfYm94OwotICAgICAgICBtX01hc2sgPSBuZXdfbWFzazsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBU1NFUlQoRkFMU0UpOworQ0ZYX1BhdGhEYXRhOjpDRlhfUGF0aERhdGEoKSB7CisgIG1fUG9pbnRDb3VudCA9IG1fQWxsb2NDb3VudCA9IDA7CisgIG1fcFBvaW50cyA9IE5VTEw7CiB9Ci1DRlhfUGF0aERhdGE6OkNGWF9QYXRoRGF0YSgpCi17Ci0gICAgbV9Qb2ludENvdW50ID0gbV9BbGxvY0NvdW50ID0gMDsKLSAgICBtX3BQb2ludHMgPSBOVUxMOworQ0ZYX1BhdGhEYXRhOjp+Q0ZYX1BhdGhEYXRhKCkgeworICBpZiAobV9wUG9pbnRzKSB7CisgICAgRlhfRnJlZShtX3BQb2ludHMpOworICB9CiB9Ci1DRlhfUGF0aERhdGE6On5DRlhfUGF0aERhdGEoKQotewordm9pZCBDRlhfUGF0aERhdGE6OlNldFBvaW50Q291bnQoaW50IG5Qb2ludHMpIHsKKyAgbV9Qb2ludENvdW50ID0gblBvaW50czsKKyAgaWYgKG1fQWxsb2NDb3VudCA8IG5Qb2ludHMpIHsKICAgICBpZiAobV9wUG9pbnRzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wUG9pbnRzKTsKKyAgICAgIEZYX0ZyZWUobV9wUG9pbnRzKTsKKyAgICAgIG1fcFBvaW50cyA9IE5VTEw7CiAgICAgfQorICAgIG1fcFBvaW50cyA9IEZYX0FsbG9jKEZYX1BBVEhQT0lOVCwgblBvaW50cyk7CisgICAgbV9BbGxvY0NvdW50ID0gblBvaW50czsKKyAgfQogfQotdm9pZCBDRlhfUGF0aERhdGE6OlNldFBvaW50Q291bnQoaW50IG5Qb2ludHMpCi17Ci0gICAgbV9Qb2ludENvdW50ID0gblBvaW50czsKLSAgICBpZiAobV9BbGxvY0NvdW50IDwgblBvaW50cykgewotICAgICAgICBpZiAobV9wUG9pbnRzKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcFBvaW50cyk7Ci0gICAgICAgICAgICBtX3BQb2ludHMgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIG1fcFBvaW50cyA9IEZYX0FsbG9jKEZYX1BBVEhQT0lOVCwgblBvaW50cyk7Ci0gICAgICAgIG1fQWxsb2NDb3VudCA9IG5Qb2ludHM7Ci0gICAgfQotfQotdm9pZCBDRlhfUGF0aERhdGE6OkFsbG9jUG9pbnRDb3VudChpbnQgblBvaW50cykKLXsKLSAgICBpZiAobV9BbGxvY0NvdW50IDwgblBvaW50cykgewotICAgICAgICBGWF9QQVRIUE9JTlQqIHBOZXdCdWYgPSBGWF9BbGxvYyhGWF9QQVRIUE9JTlQsIG5Qb2ludHMpOwotICAgICAgICBpZiAobV9Qb2ludENvdW50KSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkocE5ld0J1ZiwgbV9wUG9pbnRzLCBtX1BvaW50Q291bnQgKiBzaXplb2YoRlhfUEFUSFBPSU5UKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFBvaW50cykgewotICAgICAgICAgICAgRlhfRnJlZShtX3BQb2ludHMpOwotICAgICAgICB9Ci0gICAgICAgIG1fcFBvaW50cyA9IHBOZXdCdWY7Ci0gICAgICAgIG1fQWxsb2NDb3VudCA9IG5Qb2ludHM7Ci0gICAgfQotfQotQ0ZYX1BhdGhEYXRhOjpDRlhfUGF0aERhdGEoY29uc3QgQ0ZYX1BhdGhEYXRhJiBzcmMpCi17Ci0gICAgbV9Qb2ludENvdW50ID0gbV9BbGxvY0NvdW50ID0gc3JjLm1fUG9pbnRDb3VudDsKLSAgICBtX3BQb2ludHMgPSBGWF9BbGxvYyhGWF9QQVRIUE9JTlQsIHNyYy5tX1BvaW50Q291bnQpOwotICAgIEZYU1lTX21lbWNweShtX3BQb2ludHMsIHNyYy5tX3BQb2ludHMsIHNpemVvZihGWF9QQVRIUE9JTlQpICogbV9Qb2ludENvdW50KTsKLX0KLXZvaWQgQ0ZYX1BhdGhEYXRhOjpUcmltUG9pbnRzKGludCBuUG9pbnRzKQotewotICAgIGlmIChtX1BvaW50Q291bnQgPD0gblBvaW50cykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFNldFBvaW50Q291bnQoblBvaW50cyk7Ci19Ci12b2lkIENGWF9QYXRoRGF0YTo6QWRkUG9pbnRDb3VudChpbnQgYWRkUG9pbnRzKQotewotICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiBzYWZlX25ld19jb3VudCA9IG1fUG9pbnRDb3VudDsKLSAgICBzYWZlX25ld19jb3VudCArPSBhZGRQb2ludHM7Ci0gICAgaW50IG5ld19jb3VudCA9IHNhZmVfbmV3X2NvdW50LlZhbHVlT3JEaWUoKTsKLSAgICBBbGxvY1BvaW50Q291bnQobmV3X2NvdW50KTsKLSAgICBtX1BvaW50Q291bnQgPSBuZXdfY291bnQ7Ci19Ci12b2lkIENGWF9QYXRoRGF0YTo6QXBwZW5kKGNvbnN0IENGWF9QYXRoRGF0YSogcFNyYywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkKLXsKLSAgICBpbnQgb2xkX2NvdW50ID0gbV9Qb2ludENvdW50OwotICAgIEFkZFBvaW50Q291bnQocFNyYy0+bV9Qb2ludENvdW50KTsKLSAgICBGWFNZU19tZW1jcHkobV9wUG9pbnRzICsgb2xkX2NvdW50LCBwU3JjLT5tX3BQb2ludHMsIHBTcmMtPm1fUG9pbnRDb3VudCAqIHNpemVvZihGWF9QQVRIUE9JTlQpKTsKLSAgICBpZiAocE1hdHJpeCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBTcmMtPm1fUG9pbnRDb3VudDsgaSArKykgewotICAgICAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtKG1fcFBvaW50c1tvbGRfY291bnQgKyBpXS5tX1BvaW50WCwgbV9wUG9pbnRzW29sZF9jb3VudCArIGldLm1fUG9pbnRZKTsKLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgQ0ZYX1BhdGhEYXRhOjpTZXRQb2ludChpbnQgaW5kZXgsIEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGludCBmbGFnKQotewotICAgIEFTU0VSVChpbmRleCA8IG1fUG9pbnRDb3VudCk7Ci0gICAgbV9wUG9pbnRzW2luZGV4XS5tX1BvaW50WCA9IHg7Ci0gICAgbV9wUG9pbnRzW2luZGV4XS5tX1BvaW50WSA9IHk7Ci0gICAgbV9wUG9pbnRzW2luZGV4XS5tX0ZsYWcgPSBmbGFnOwotfQotdm9pZCBDRlhfUGF0aERhdGE6OkFwcGVuZFJlY3QoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgYm90dG9tLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgdG9wKQotewotICAgIGludCBvbGRfY291bnQgPSBtX1BvaW50Q291bnQ7Ci0gICAgQWRkUG9pbnRDb3VudCg1KTsKLSAgICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBtX3BQb2ludHMgKyBvbGRfY291bnQ7Ci0gICAgcFBvaW50c1swXS5tX1BvaW50WCA9IHBQb2ludHNbMV0ubV9Qb2ludFggPSBwUG9pbnRzWzRdLm1fUG9pbnRYID0gbGVmdDsKLSAgICBwUG9pbnRzWzJdLm1fUG9pbnRYID0gcFBvaW50c1szXS5tX1BvaW50WCA9IHJpZ2h0OwotICAgIHBQb2ludHNbMF0ubV9Qb2ludFkgPSBwUG9pbnRzWzNdLm1fUG9pbnRZID0gcFBvaW50c1s0XS5tX1BvaW50WSA9IGJvdHRvbTsKLSAgICBwUG9pbnRzWzFdLm1fUG9pbnRZID0gcFBvaW50c1syXS5tX1BvaW50WSA9IHRvcDsKLSAgICBwUG9pbnRzWzBdLm1fRmxhZyA9IEZYUFRfTU9WRVRPOwotICAgIHBQb2ludHNbMV0ubV9GbGFnID0gcFBvaW50c1syXS5tX0ZsYWcgPSBwUG9pbnRzWzNdLm1fRmxhZyA9IEZYUFRfTElORVRPOwotICAgIHBQb2ludHNbNF0ubV9GbGFnID0gRlhQVF9MSU5FVE8gfCBGWFBUX0NMT1NFRklHVVJFOwotfQotQ0ZYX0Zsb2F0UmVjdCBDRlhfUGF0aERhdGE6OkdldEJvdW5kaW5nQm94KCkgY29uc3QKLXsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3Q7Cit2b2lkIENGWF9QYXRoRGF0YTo6QWxsb2NQb2ludENvdW50KGludCBuUG9pbnRzKSB7CisgIGlmIChtX0FsbG9jQ291bnQgPCBuUG9pbnRzKSB7CisgICAgRlhfUEFUSFBPSU5UKiBwTmV3QnVmID0gRlhfQWxsb2MoRlhfUEFUSFBPSU5ULCBuUG9pbnRzKTsKICAgICBpZiAobV9Qb2ludENvdW50KSB7Ci0gICAgICAgIHJlY3QuSW5pdFJlY3QobV9wUG9pbnRzWzBdLm1fUG9pbnRYLCBtX3BQb2ludHNbMF0ubV9Qb2ludFkpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1fUG9pbnRDb3VudDsgaSArKykgewotICAgICAgICAgICAgcmVjdC5VcGRhdGVSZWN0KG1fcFBvaW50c1tpXS5tX1BvaW50WCwgbV9wUG9pbnRzW2ldLm1fUG9pbnRZKTsKLSAgICAgICAgfQorICAgICAgRlhTWVNfbWVtY3B5KHBOZXdCdWYsIG1fcFBvaW50cywgbV9Qb2ludENvdW50ICogc2l6ZW9mKEZYX1BBVEhQT0lOVCkpOwogICAgIH0KLSAgICByZXR1cm4gcmVjdDsKKyAgICBpZiAobV9wUG9pbnRzKSB7CisgICAgICBGWF9GcmVlKG1fcFBvaW50cyk7CisgICAgfQorICAgIG1fcFBvaW50cyA9IHBOZXdCdWY7CisgICAgbV9BbGxvY0NvdW50ID0gblBvaW50czsKKyAgfQogfQotc3RhdGljIHZvaWQgX1VwZGF0ZUxpbmVFbmRQb2ludHMoQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwgRlhfRkxPQVQgc3RhcnRfeCwgRlhfRkxPQVQgc3RhcnRfeSwgRlhfRkxPQVQgZW5kX3gsIEZYX0ZMT0FUIGVuZF95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaHcpCi17Ci0gICAgaWYgKHN0YXJ0X3ggPT0gZW5kX3gpIHsKLSAgICAgICAgaWYgKHN0YXJ0X3kgPT0gZW5kX3kpIHsKLSAgICAgICAgICAgIHJlY3QuVXBkYXRlUmVjdChlbmRfeCArIGh3LCBlbmRfeSArIGh3KTsKLSAgICAgICAgICAgIHJlY3QuVXBkYXRlUmVjdChlbmRfeCAtIGh3LCBlbmRfeSAtIGh3KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBwb2ludF95OwotICAgICAgICBpZiAoZW5kX3kgPCBzdGFydF95KSB7Ci0gICAgICAgICAgICBwb2ludF95ID0gZW5kX3kgLSBodzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBvaW50X3kgPSBlbmRfeSArIGh3OwotICAgICAgICB9Ci0gICAgICAgIHJlY3QuVXBkYXRlUmVjdChlbmRfeCArIGh3LCBwb2ludF95KTsKLSAgICAgICAgcmVjdC5VcGRhdGVSZWN0KGVuZF94IC0gaHcsIHBvaW50X3kpOwotICAgICAgICByZXR1cm47CitDRlhfUGF0aERhdGE6OkNGWF9QYXRoRGF0YShjb25zdCBDRlhfUGF0aERhdGEmIHNyYykgeworICBtX1BvaW50Q291bnQgPSBtX0FsbG9jQ291bnQgPSBzcmMubV9Qb2ludENvdW50OworICBtX3BQb2ludHMgPSBGWF9BbGxvYyhGWF9QQVRIUE9JTlQsIHNyYy5tX1BvaW50Q291bnQpOworICBGWFNZU19tZW1jcHkobV9wUG9pbnRzLCBzcmMubV9wUG9pbnRzLCBzaXplb2YoRlhfUEFUSFBPSU5UKSAqIG1fUG9pbnRDb3VudCk7Cit9Cit2b2lkIENGWF9QYXRoRGF0YTo6VHJpbVBvaW50cyhpbnQgblBvaW50cykgeworICBpZiAobV9Qb2ludENvdW50IDw9IG5Qb2ludHMpIHsKKyAgICByZXR1cm47CisgIH0KKyAgU2V0UG9pbnRDb3VudChuUG9pbnRzKTsKK30KK3ZvaWQgQ0ZYX1BhdGhEYXRhOjpBZGRQb2ludENvdW50KGludCBhZGRQb2ludHMpIHsKKyAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IHNhZmVfbmV3X2NvdW50ID0gbV9Qb2ludENvdW50OworICBzYWZlX25ld19jb3VudCArPSBhZGRQb2ludHM7CisgIGludCBuZXdfY291bnQgPSBzYWZlX25ld19jb3VudC5WYWx1ZU9yRGllKCk7CisgIEFsbG9jUG9pbnRDb3VudChuZXdfY291bnQpOworICBtX1BvaW50Q291bnQgPSBuZXdfY291bnQ7Cit9Cit2b2lkIENGWF9QYXRoRGF0YTo6QXBwZW5kKGNvbnN0IENGWF9QYXRoRGF0YSogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkgeworICBpbnQgb2xkX2NvdW50ID0gbV9Qb2ludENvdW50OworICBBZGRQb2ludENvdW50KHBTcmMtPm1fUG9pbnRDb3VudCk7CisgIEZYU1lTX21lbWNweShtX3BQb2ludHMgKyBvbGRfY291bnQsIHBTcmMtPm1fcFBvaW50cywKKyAgICAgICAgICAgICAgIHBTcmMtPm1fUG9pbnRDb3VudCAqIHNpemVvZihGWF9QQVRIUE9JTlQpKTsKKyAgaWYgKHBNYXRyaXgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBTcmMtPm1fUG9pbnRDb3VudDsgaSsrKSB7CisgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0obV9wUG9pbnRzW29sZF9jb3VudCArIGldLm1fUG9pbnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFBvaW50c1tvbGRfY291bnQgKyBpXS5tX1BvaW50WSk7CiAgICAgfQorICB9Cit9Cit2b2lkIENGWF9QYXRoRGF0YTo6U2V0UG9pbnQoaW50IGluZGV4LCBGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBpbnQgZmxhZykgeworICBBU1NFUlQoaW5kZXggPCBtX1BvaW50Q291bnQpOworICBtX3BQb2ludHNbaW5kZXhdLm1fUG9pbnRYID0geDsKKyAgbV9wUG9pbnRzW2luZGV4XS5tX1BvaW50WSA9IHk7CisgIG1fcFBvaW50c1tpbmRleF0ubV9GbGFnID0gZmxhZzsKK30KK3ZvaWQgQ0ZYX1BhdGhEYXRhOjpBcHBlbmRSZWN0KEZYX0ZMT0FUIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCkgeworICBpbnQgb2xkX2NvdW50ID0gbV9Qb2ludENvdW50OworICBBZGRQb2ludENvdW50KDUpOworICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBtX3BQb2ludHMgKyBvbGRfY291bnQ7CisgIHBQb2ludHNbMF0ubV9Qb2ludFggPSBwUG9pbnRzWzFdLm1fUG9pbnRYID0gcFBvaW50c1s0XS5tX1BvaW50WCA9IGxlZnQ7CisgIHBQb2ludHNbMl0ubV9Qb2ludFggPSBwUG9pbnRzWzNdLm1fUG9pbnRYID0gcmlnaHQ7CisgIHBQb2ludHNbMF0ubV9Qb2ludFkgPSBwUG9pbnRzWzNdLm1fUG9pbnRZID0gcFBvaW50c1s0XS5tX1BvaW50WSA9IGJvdHRvbTsKKyAgcFBvaW50c1sxXS5tX1BvaW50WSA9IHBQb2ludHNbMl0ubV9Qb2ludFkgPSB0b3A7CisgIHBQb2ludHNbMF0ubV9GbGFnID0gRlhQVF9NT1ZFVE87CisgIHBQb2ludHNbMV0ubV9GbGFnID0gcFBvaW50c1syXS5tX0ZsYWcgPSBwUG9pbnRzWzNdLm1fRmxhZyA9IEZYUFRfTElORVRPOworICBwUG9pbnRzWzRdLm1fRmxhZyA9IEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRTsKK30KK0NGWF9GbG9hdFJlY3QgQ0ZYX1BhdGhEYXRhOjpHZXRCb3VuZGluZ0JveCgpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICBpZiAobV9Qb2ludENvdW50KSB7CisgICAgcmVjdC5Jbml0UmVjdChtX3BQb2ludHNbMF0ubV9Qb2ludFgsIG1fcFBvaW50c1swXS5tX1BvaW50WSk7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtX1BvaW50Q291bnQ7IGkrKykgeworICAgICAgcmVjdC5VcGRhdGVSZWN0KG1fcFBvaW50c1tpXS5tX1BvaW50WCwgbV9wUG9pbnRzW2ldLm1fUG9pbnRZKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlY3Q7Cit9CitzdGF0aWMgdm9pZCBfVXBkYXRlTGluZUVuZFBvaW50cyhDRlhfRmxvYXRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaHcpIHsKKyAgaWYgKHN0YXJ0X3ggPT0gZW5kX3gpIHsKICAgICBpZiAoc3RhcnRfeSA9PSBlbmRfeSkgewotICAgICAgICBGWF9GTE9BVCBwb2ludF94OwotICAgICAgICBpZiAoZW5kX3ggPCBzdGFydF94KSB7Ci0gICAgICAgICAgICBwb2ludF94ID0gZW5kX3ggLSBodzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBvaW50X3ggPSBlbmRfeCArIGh3OwotICAgICAgICB9Ci0gICAgICAgIHJlY3QuVXBkYXRlUmVjdChwb2ludF94LCBlbmRfeSArIGh3KTsKLSAgICAgICAgcmVjdC5VcGRhdGVSZWN0KHBvaW50X3gsIGVuZF95IC0gaHcpOwotICAgICAgICByZXR1cm47CisgICAgICByZWN0LlVwZGF0ZVJlY3QoZW5kX3ggKyBodywgZW5kX3kgKyBodyk7CisgICAgICByZWN0LlVwZGF0ZVJlY3QoZW5kX3ggLSBodywgZW5kX3kgLSBodyk7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIEZYX0ZMT0FUIGR4ID0gZW5kX3ggLSBzdGFydF94OwotICAgIEZYX0ZMT0FUIGR5ID0gZW5kX3kgLSBzdGFydF95OwotICAgIEZYX0ZMT0FUIGxsID0gRlhTWVNfc3FydDIoZHgsIGR5KTsKLSAgICBGWF9GTE9BVCBteCA9IGVuZF94ICsgaHcgKiBkeCAvIGxsOwotICAgIEZYX0ZMT0FUIG15ID0gZW5kX3kgKyBodyAqIGR5IC8gbGw7Ci0gICAgRlhfRkxPQVQgZHgxID0gaHcgKiBkeSAvIGxsOwotICAgIEZYX0ZMT0FUIGR5MSA9IGh3ICogZHggLyBsbDsKLSAgICByZWN0LlVwZGF0ZVJlY3QobXggLSBkeDEsIG15ICsgZHkxKTsKLSAgICByZWN0LlVwZGF0ZVJlY3QobXggKyBkeDEsIG15IC0gZHkxKTsKLX0KLXN0YXRpYyB2b2lkIF9VcGRhdGVMaW5lSm9pblBvaW50cyhDRlhfRmxvYXRSZWN0JiByZWN0LCBGWF9GTE9BVCBzdGFydF94LCBGWF9GTE9BVCBzdGFydF95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1pZGRsZV94LCBGWF9GTE9BVCBtaWRkbGVfeSwgRlhfRkxPQVQgZW5kX3gsIEZYX0ZMT0FUIGVuZF95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhhbGZfd2lkdGgsIEZYX0ZMT0FUIG1pdGVyX2xpbWl0KQotewotICAgIEZYX0ZMT0FUIHN0YXJ0X2sgPSAwLCBzdGFydF9jID0gMCwgZW5kX2sgPSAwLCBlbmRfYyA9IDAsIHN0YXJ0X2xlbiA9IDAsIHN0YXJ0X2RjID0gMCwgZW5kX2xlbiA9IDAsIGVuZF9kYyA9IDA7Ci0gICAgRlhfQk9PTCBiU3RhcnRWZXJ0ID0gRlhTWVNfZmFicyhzdGFydF94IC0gbWlkZGxlX3gpIDwgMS4wZiAvIDIwOwotICAgIEZYX0JPT0wgYkVuZFZlcnQgPSBGWFNZU19mYWJzKG1pZGRsZV94IC0gZW5kX3gpIDwgMS4wZiAvIDIwOwotICAgIGlmIChiU3RhcnRWZXJ0ICYmIGJFbmRWZXJ0KSB7Ci0gICAgICAgIGludCBzdGFydF9kaXIgPSBtaWRkbGVfeSA+IHN0YXJ0X3kgPyAxIDogLTE7Ci0gICAgICAgIEZYX0ZMT0FUIHBvaW50X3kgPSBtaWRkbGVfeSArIGhhbGZfd2lkdGggKiBzdGFydF9kaXI7Ci0gICAgICAgIHJlY3QuVXBkYXRlUmVjdChtaWRkbGVfeCArIGhhbGZfd2lkdGgsIHBvaW50X3kpOwotICAgICAgICByZWN0LlVwZGF0ZVJlY3QobWlkZGxlX3ggLSBoYWxmX3dpZHRoLCBwb2ludF95KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIWJTdGFydFZlcnQpIHsKLSAgICAgICAgc3RhcnRfayA9IEZYU1lTX0RpdihtaWRkbGVfeSAtIHN0YXJ0X3ksIG1pZGRsZV94IC0gc3RhcnRfeCk7Ci0gICAgICAgIHN0YXJ0X2MgPSBtaWRkbGVfeSAtIEZYU1lTX011bChzdGFydF9rLCBtaWRkbGVfeCk7Ci0gICAgICAgIHN0YXJ0X2xlbiA9IEZYU1lTX3NxcnQyKHN0YXJ0X3ggLSBtaWRkbGVfeCwgc3RhcnRfeSAtIG1pZGRsZV95KTsKLSAgICAgICAgc3RhcnRfZGMgPSAoRlhfRkxPQVQpRlhTWVNfZmFicyhGWFNZU19NdWxEaXYoaGFsZl93aWR0aCwgc3RhcnRfbGVuLCBzdGFydF94IC0gbWlkZGxlX3gpKTsKLSAgICB9Ci0gICAgaWYgKCFiRW5kVmVydCkgewotICAgICAgICBlbmRfayA9IEZYU1lTX0RpdihlbmRfeSAtIG1pZGRsZV95LCBlbmRfeCAtIG1pZGRsZV94KTsKLSAgICAgICAgZW5kX2MgPSBtaWRkbGVfeSAtIEZYU1lTX011bChlbmRfaywgbWlkZGxlX3gpOwotICAgICAgICBlbmRfbGVuID0gRlhTWVNfc3FydDIoZW5kX3ggLSBtaWRkbGVfeCwgZW5kX3kgLSBtaWRkbGVfeSk7Ci0gICAgICAgIGVuZF9kYyA9IChGWF9GTE9BVClGWFNZU19mYWJzKEZYU1lTX011bERpdihoYWxmX3dpZHRoLCBlbmRfbGVuLCBlbmRfeCAtIG1pZGRsZV94KSk7Ci0gICAgfQotICAgIGlmIChiU3RhcnRWZXJ0KSB7Ci0gICAgICAgIEZYX0ZMT0FUIG91dHNpZGVfeCA9IHN0YXJ0X3g7Ci0gICAgICAgIGlmIChlbmRfeCA8IHN0YXJ0X3gpIHsKLSAgICAgICAgICAgIG91dHNpZGVfeCArPSBoYWxmX3dpZHRoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0c2lkZV94IC09IGhhbGZfd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRkxPQVQgb3V0c2lkZV95OwotICAgICAgICBpZiAoc3RhcnRfeSA8IEZYU1lTX011bChlbmRfaywgc3RhcnRfeCkgKyBlbmRfYykgewotICAgICAgICAgICAgb3V0c2lkZV95ID0gRlhTWVNfTXVsKGVuZF9rLCBvdXRzaWRlX3gpICsgZW5kX2MgKyBlbmRfZGM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXRzaWRlX3kgPSBGWFNZU19NdWwoZW5kX2ssIG91dHNpZGVfeCkgKyBlbmRfYyAtIGVuZF9kYzsKLSAgICAgICAgfQotICAgICAgICByZWN0LlVwZGF0ZVJlY3Qob3V0c2lkZV94LCBvdXRzaWRlX3kpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChiRW5kVmVydCkgewotICAgICAgICBGWF9GTE9BVCBvdXRzaWRlX3ggPSBlbmRfeDsKLSAgICAgICAgaWYgKHN0YXJ0X3ggPCBlbmRfeCkgewotICAgICAgICAgICAgb3V0c2lkZV94ICs9IGhhbGZfd2lkdGg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXRzaWRlX3ggLT0gaGFsZl93aWR0aDsKLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBvdXRzaWRlX3k7Ci0gICAgICAgIGlmIChlbmRfeSA8IEZYU1lTX011bChzdGFydF9rLCBlbmRfeCkgKyBzdGFydF9jKSB7Ci0gICAgICAgICAgICBvdXRzaWRlX3kgPSBGWFNZU19NdWwoc3RhcnRfaywgb3V0c2lkZV94KSArIHN0YXJ0X2MgKyBzdGFydF9kYzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dHNpZGVfeSA9IEZYU1lTX011bChzdGFydF9rLCBvdXRzaWRlX3gpICsgc3RhcnRfYyAtIHN0YXJ0X2RjOwotICAgICAgICB9Ci0gICAgICAgIHJlY3QuVXBkYXRlUmVjdChvdXRzaWRlX3gsIG91dHNpZGVfeSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKEZYU1lTX2ZhYnMoc3RhcnRfayAtIGVuZF9rKSA8IDEuMGYgLyAyMCkgewotICAgICAgICBpbnQgc3RhcnRfZGlyID0gbWlkZGxlX3ggPiBzdGFydF94ID8gMSA6IC0xOwotICAgICAgICBpbnQgZW5kX2RpciA9IGVuZF94ID4gbWlkZGxlX3ggPyAxIDogLTE7Ci0gICAgICAgIGlmIChzdGFydF9kaXIgPT0gZW5kX2RpcikgewotICAgICAgICAgICAgX1VwZGF0ZUxpbmVFbmRQb2ludHMocmVjdCwgbWlkZGxlX3gsIG1pZGRsZV95LCBlbmRfeCwgZW5kX3ksIGhhbGZfd2lkdGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX1VwZGF0ZUxpbmVFbmRQb2ludHMocmVjdCwgc3RhcnRfeCwgc3RhcnRfeSwgbWlkZGxlX3gsIG1pZGRsZV95LCBoYWxmX3dpZHRoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0ZMT0FUIHN0YXJ0X291dHNpZGVfYyA9IHN0YXJ0X2M7Ci0gICAgaWYgKGVuZF95IDwgRlhTWVNfTXVsKHN0YXJ0X2ssIGVuZF94KSArIHN0YXJ0X2MpIHsKLSAgICAgICAgc3RhcnRfb3V0c2lkZV9jICs9IHN0YXJ0X2RjOworICAgIEZYX0ZMT0FUIHBvaW50X3k7CisgICAgaWYgKGVuZF95IDwgc3RhcnRfeSkgeworICAgICAgcG9pbnRfeSA9IGVuZF95IC0gaHc7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhcnRfb3V0c2lkZV9jIC09IHN0YXJ0X2RjOworICAgICAgcG9pbnRfeSA9IGVuZF95ICsgaHc7CiAgICAgfQotICAgIEZYX0ZMT0FUIGVuZF9vdXRzaWRlX2MgPSBlbmRfYzsKKyAgICByZWN0LlVwZGF0ZVJlY3QoZW5kX3ggKyBodywgcG9pbnRfeSk7CisgICAgcmVjdC5VcGRhdGVSZWN0KGVuZF94IC0gaHcsIHBvaW50X3kpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoc3RhcnRfeSA9PSBlbmRfeSkgeworICAgIEZYX0ZMT0FUIHBvaW50X3g7CisgICAgaWYgKGVuZF94IDwgc3RhcnRfeCkgeworICAgICAgcG9pbnRfeCA9IGVuZF94IC0gaHc7CisgICAgfSBlbHNlIHsKKyAgICAgIHBvaW50X3ggPSBlbmRfeCArIGh3OworICAgIH0KKyAgICByZWN0LlVwZGF0ZVJlY3QocG9pbnRfeCwgZW5kX3kgKyBodyk7CisgICAgcmVjdC5VcGRhdGVSZWN0KHBvaW50X3gsIGVuZF95IC0gaHcpOworICAgIHJldHVybjsKKyAgfQorICBGWF9GTE9BVCBkeCA9IGVuZF94IC0gc3RhcnRfeDsKKyAgRlhfRkxPQVQgZHkgPSBlbmRfeSAtIHN0YXJ0X3k7CisgIEZYX0ZMT0FUIGxsID0gRlhTWVNfc3FydDIoZHgsIGR5KTsKKyAgRlhfRkxPQVQgbXggPSBlbmRfeCArIGh3ICogZHggLyBsbDsKKyAgRlhfRkxPQVQgbXkgPSBlbmRfeSArIGh3ICogZHkgLyBsbDsKKyAgRlhfRkxPQVQgZHgxID0gaHcgKiBkeSAvIGxsOworICBGWF9GTE9BVCBkeTEgPSBodyAqIGR4IC8gbGw7CisgIHJlY3QuVXBkYXRlUmVjdChteCAtIGR4MSwgbXkgKyBkeTEpOworICByZWN0LlVwZGF0ZVJlY3QobXggKyBkeDEsIG15IC0gZHkxKTsKK30KK3N0YXRpYyB2b2lkIF9VcGRhdGVMaW5lSm9pblBvaW50cyhDRlhfRmxvYXRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtaWRkbGVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtaWRkbGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoYWxmX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1pdGVyX2xpbWl0KSB7CisgIEZYX0ZMT0FUIHN0YXJ0X2sgPSAwLCBzdGFydF9jID0gMCwgZW5kX2sgPSAwLCBlbmRfYyA9IDAsIHN0YXJ0X2xlbiA9IDAsCisgICAgICAgICAgIHN0YXJ0X2RjID0gMCwgZW5kX2xlbiA9IDAsIGVuZF9kYyA9IDA7CisgIEZYX0JPT0wgYlN0YXJ0VmVydCA9IEZYU1lTX2ZhYnMoc3RhcnRfeCAtIG1pZGRsZV94KSA8IDEuMGYgLyAyMDsKKyAgRlhfQk9PTCBiRW5kVmVydCA9IEZYU1lTX2ZhYnMobWlkZGxlX3ggLSBlbmRfeCkgPCAxLjBmIC8gMjA7CisgIGlmIChiU3RhcnRWZXJ0ICYmIGJFbmRWZXJ0KSB7CisgICAgaW50IHN0YXJ0X2RpciA9IG1pZGRsZV95ID4gc3RhcnRfeSA/IDEgOiAtMTsKKyAgICBGWF9GTE9BVCBwb2ludF95ID0gbWlkZGxlX3kgKyBoYWxmX3dpZHRoICogc3RhcnRfZGlyOworICAgIHJlY3QuVXBkYXRlUmVjdChtaWRkbGVfeCArIGhhbGZfd2lkdGgsIHBvaW50X3kpOworICAgIHJlY3QuVXBkYXRlUmVjdChtaWRkbGVfeCAtIGhhbGZfd2lkdGgsIHBvaW50X3kpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIWJTdGFydFZlcnQpIHsKKyAgICBzdGFydF9rID0gRlhTWVNfRGl2KG1pZGRsZV95IC0gc3RhcnRfeSwgbWlkZGxlX3ggLSBzdGFydF94KTsKKyAgICBzdGFydF9jID0gbWlkZGxlX3kgLSBGWFNZU19NdWwoc3RhcnRfaywgbWlkZGxlX3gpOworICAgIHN0YXJ0X2xlbiA9IEZYU1lTX3NxcnQyKHN0YXJ0X3ggLSBtaWRkbGVfeCwgc3RhcnRfeSAtIG1pZGRsZV95KTsKKyAgICBzdGFydF9kYyA9IChGWF9GTE9BVClGWFNZU19mYWJzKAorICAgICAgICBGWFNZU19NdWxEaXYoaGFsZl93aWR0aCwgc3RhcnRfbGVuLCBzdGFydF94IC0gbWlkZGxlX3gpKTsKKyAgfQorICBpZiAoIWJFbmRWZXJ0KSB7CisgICAgZW5kX2sgPSBGWFNZU19EaXYoZW5kX3kgLSBtaWRkbGVfeSwgZW5kX3ggLSBtaWRkbGVfeCk7CisgICAgZW5kX2MgPSBtaWRkbGVfeSAtIEZYU1lTX011bChlbmRfaywgbWlkZGxlX3gpOworICAgIGVuZF9sZW4gPSBGWFNZU19zcXJ0MihlbmRfeCAtIG1pZGRsZV94LCBlbmRfeSAtIG1pZGRsZV95KTsKKyAgICBlbmRfZGMgPSAoRlhfRkxPQVQpRlhTWVNfZmFicygKKyAgICAgICAgRlhTWVNfTXVsRGl2KGhhbGZfd2lkdGgsIGVuZF9sZW4sIGVuZF94IC0gbWlkZGxlX3gpKTsKKyAgfQorICBpZiAoYlN0YXJ0VmVydCkgeworICAgIEZYX0ZMT0FUIG91dHNpZGVfeCA9IHN0YXJ0X3g7CisgICAgaWYgKGVuZF94IDwgc3RhcnRfeCkgeworICAgICAgb3V0c2lkZV94ICs9IGhhbGZfd2lkdGg7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHNpZGVfeCAtPSBoYWxmX3dpZHRoOworICAgIH0KKyAgICBGWF9GTE9BVCBvdXRzaWRlX3k7CiAgICAgaWYgKHN0YXJ0X3kgPCBGWFNZU19NdWwoZW5kX2ssIHN0YXJ0X3gpICsgZW5kX2MpIHsKLSAgICAgICAgZW5kX291dHNpZGVfYyArPSBlbmRfZGM7CisgICAgICBvdXRzaWRlX3kgPSBGWFNZU19NdWwoZW5kX2ssIG91dHNpZGVfeCkgKyBlbmRfYyArIGVuZF9kYzsKICAgICB9IGVsc2UgewotICAgICAgICBlbmRfb3V0c2lkZV9jIC09IGVuZF9kYzsKKyAgICAgIG91dHNpZGVfeSA9IEZYU1lTX011bChlbmRfaywgb3V0c2lkZV94KSArIGVuZF9jIC0gZW5kX2RjOwogICAgIH0KLSAgICBGWF9GTE9BVCBqb2luX3ggPSBGWFNZU19EaXYoZW5kX291dHNpZGVfYyAtIHN0YXJ0X291dHNpZGVfYywgc3RhcnRfayAtIGVuZF9rKTsKLSAgICBGWF9GTE9BVCBqb2luX3kgPSBGWFNZU19NdWwoc3RhcnRfaywgam9pbl94KSArIHN0YXJ0X291dHNpZGVfYzsKLSAgICByZWN0LlVwZGF0ZVJlY3Qoam9pbl94LCBqb2luX3kpOworICAgIHJlY3QuVXBkYXRlUmVjdChvdXRzaWRlX3gsIG91dHNpZGVfeSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChiRW5kVmVydCkgeworICAgIEZYX0ZMT0FUIG91dHNpZGVfeCA9IGVuZF94OworICAgIGlmIChzdGFydF94IDwgZW5kX3gpIHsKKyAgICAgIG91dHNpZGVfeCArPSBoYWxmX3dpZHRoOworICAgIH0gZWxzZSB7CisgICAgICBvdXRzaWRlX3ggLT0gaGFsZl93aWR0aDsKKyAgICB9CisgICAgRlhfRkxPQVQgb3V0c2lkZV95OworICAgIGlmIChlbmRfeSA8IEZYU1lTX011bChzdGFydF9rLCBlbmRfeCkgKyBzdGFydF9jKSB7CisgICAgICBvdXRzaWRlX3kgPSBGWFNZU19NdWwoc3RhcnRfaywgb3V0c2lkZV94KSArIHN0YXJ0X2MgKyBzdGFydF9kYzsKKyAgICB9IGVsc2UgeworICAgICAgb3V0c2lkZV95ID0gRlhTWVNfTXVsKHN0YXJ0X2ssIG91dHNpZGVfeCkgKyBzdGFydF9jIC0gc3RhcnRfZGM7CisgICAgfQorICAgIHJlY3QuVXBkYXRlUmVjdChvdXRzaWRlX3gsIG91dHNpZGVfeSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChGWFNZU19mYWJzKHN0YXJ0X2sgLSBlbmRfaykgPCAxLjBmIC8gMjApIHsKKyAgICBpbnQgc3RhcnRfZGlyID0gbWlkZGxlX3ggPiBzdGFydF94ID8gMSA6IC0xOworICAgIGludCBlbmRfZGlyID0gZW5kX3ggPiBtaWRkbGVfeCA/IDEgOiAtMTsKKyAgICBpZiAoc3RhcnRfZGlyID09IGVuZF9kaXIpIHsKKyAgICAgIF9VcGRhdGVMaW5lRW5kUG9pbnRzKHJlY3QsIG1pZGRsZV94LCBtaWRkbGVfeSwgZW5kX3gsIGVuZF95LCBoYWxmX3dpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgX1VwZGF0ZUxpbmVFbmRQb2ludHMocmVjdCwgc3RhcnRfeCwgc3RhcnRfeSwgbWlkZGxlX3gsIG1pZGRsZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsZl93aWR0aCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBGWF9GTE9BVCBzdGFydF9vdXRzaWRlX2MgPSBzdGFydF9jOworICBpZiAoZW5kX3kgPCBGWFNZU19NdWwoc3RhcnRfaywgZW5kX3gpICsgc3RhcnRfYykgeworICAgIHN0YXJ0X291dHNpZGVfYyArPSBzdGFydF9kYzsKKyAgfSBlbHNlIHsKKyAgICBzdGFydF9vdXRzaWRlX2MgLT0gc3RhcnRfZGM7CisgIH0KKyAgRlhfRkxPQVQgZW5kX291dHNpZGVfYyA9IGVuZF9jOworICBpZiAoc3RhcnRfeSA8IEZYU1lTX011bChlbmRfaywgc3RhcnRfeCkgKyBlbmRfYykgeworICAgIGVuZF9vdXRzaWRlX2MgKz0gZW5kX2RjOworICB9IGVsc2UgeworICAgIGVuZF9vdXRzaWRlX2MgLT0gZW5kX2RjOworICB9CisgIEZYX0ZMT0FUIGpvaW5feCA9IEZYU1lTX0RpdihlbmRfb3V0c2lkZV9jIC0gc3RhcnRfb3V0c2lkZV9jLCBzdGFydF9rIC0gZW5kX2spOworICBGWF9GTE9BVCBqb2luX3kgPSBGWFNZU19NdWwoc3RhcnRfaywgam9pbl94KSArIHN0YXJ0X291dHNpZGVfYzsKKyAgcmVjdC5VcGRhdGVSZWN0KGpvaW5feCwgam9pbl95KTsKIH0KLUNGWF9GbG9hdFJlY3QgQ0ZYX1BhdGhEYXRhOjpHZXRCb3VuZGluZ0JveChGWF9GTE9BVCBsaW5lX3dpZHRoLCBGWF9GTE9BVCBtaXRlcl9saW1pdCkgY29uc3QKLXsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QoMTAwMDAwICogMS4wZiwgMTAwMDAwICogMS4wZiwgLTEwMDAwMCAqIDEuMGYsIC0xMDAwMDAgKiAxLjBmKTsKLSAgICBpbnQgaVBvaW50ID0gMDsKLSAgICBGWF9GTE9BVCBoYWxmX3dpZHRoID0gbGluZV93aWR0aDsKLSAgICBpbnQgaVN0YXJ0UG9pbnQsIGlFbmRQb2ludCwgaU1pZGRsZVBvaW50OwotICAgIEZYX0JPT0wgYkpvaW47Ci0gICAgd2hpbGUgKGlQb2ludCA8IG1fUG9pbnRDb3VudCkgewotICAgICAgICBpZiAobV9wUG9pbnRzW2lQb2ludF0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSB7Ci0gICAgICAgICAgICBpU3RhcnRQb2ludCA9IGlQb2ludCArIDE7Ci0gICAgICAgICAgICBpRW5kUG9pbnQgPSBpUG9pbnQ7Ci0gICAgICAgICAgICBiSm9pbiA9IEZBTFNFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fcFBvaW50c1tpUG9pbnRdLm1fRmxhZyA9PSBGWFBUX0JFWklFUlRPKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5VcGRhdGVSZWN0KG1fcFBvaW50c1tpUG9pbnRdLm1fUG9pbnRYLCBtX3BQb2ludHNbaVBvaW50XS5tX1BvaW50WSk7Ci0gICAgICAgICAgICAgICAgcmVjdC5VcGRhdGVSZWN0KG1fcFBvaW50c1tpUG9pbnQgKyAxXS5tX1BvaW50WCwgbV9wUG9pbnRzW2lQb2ludCArIDFdLm1fUG9pbnRZKTsKLSAgICAgICAgICAgICAgICBpUG9pbnQgKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpUG9pbnQgPT0gbV9Qb2ludENvdW50IC0gMSB8fCBtX3BQb2ludHNbaVBvaW50ICsgMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSB7Ci0gICAgICAgICAgICAgICAgaVN0YXJ0UG9pbnQgPSBpUG9pbnQgLSAxOwotICAgICAgICAgICAgICAgIGlFbmRQb2ludCA9IGlQb2ludDsKLSAgICAgICAgICAgICAgICBiSm9pbiA9IEZBTFNFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpU3RhcnRQb2ludCA9IGlQb2ludCAtIDE7Ci0gICAgICAgICAgICAgICAgaU1pZGRsZVBvaW50ID0gaVBvaW50OwotICAgICAgICAgICAgICAgIGlFbmRQb2ludCA9IGlQb2ludCArIDE7Ci0gICAgICAgICAgICAgICAgYkpvaW4gPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIHN0YXJ0X3ggPSBtX3BQb2ludHNbaVN0YXJ0UG9pbnRdLm1fUG9pbnRYOwotICAgICAgICBGWF9GTE9BVCBzdGFydF95ID0gbV9wUG9pbnRzW2lTdGFydFBvaW50XS5tX1BvaW50WTsKLSAgICAgICAgRlhfRkxPQVQgZW5kX3ggPSBtX3BQb2ludHNbaUVuZFBvaW50XS5tX1BvaW50WDsKLSAgICAgICAgRlhfRkxPQVQgZW5kX3kgPSBtX3BQb2ludHNbaUVuZFBvaW50XS5tX1BvaW50WTsKLSAgICAgICAgaWYgKGJKb2luKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCBtaWRkbGVfeCA9IG1fcFBvaW50c1tpTWlkZGxlUG9pbnRdLm1fUG9pbnRYOwotICAgICAgICAgICAgRlhfRkxPQVQgbWlkZGxlX3kgPSBtX3BQb2ludHNbaU1pZGRsZVBvaW50XS5tX1BvaW50WTsKLSAgICAgICAgICAgIF9VcGRhdGVMaW5lSm9pblBvaW50cyhyZWN0LCBzdGFydF94LCBzdGFydF95LCBtaWRkbGVfeCwgbWlkZGxlX3ksIGVuZF94LCBlbmRfeSwgaGFsZl93aWR0aCwgbWl0ZXJfbGltaXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX1VwZGF0ZUxpbmVFbmRQb2ludHMocmVjdCwgc3RhcnRfeCwgc3RhcnRfeSwgZW5kX3gsIGVuZF95LCBoYWxmX3dpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBpUG9pbnQgKys7CitDRlhfRmxvYXRSZWN0IENGWF9QYXRoRGF0YTo6R2V0Qm91bmRpbmdCb3goRlhfRkxPQVQgbGluZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtaXRlcl9saW1pdCkgY29uc3QgeworICBDRlhfRmxvYXRSZWN0IHJlY3QoMTAwMDAwICogMS4wZiwgMTAwMDAwICogMS4wZiwgLTEwMDAwMCAqIDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAtMTAwMDAwICogMS4wZik7CisgIGludCBpUG9pbnQgPSAwOworICBGWF9GTE9BVCBoYWxmX3dpZHRoID0gbGluZV93aWR0aDsKKyAgaW50IGlTdGFydFBvaW50LCBpRW5kUG9pbnQsIGlNaWRkbGVQb2ludDsKKyAgRlhfQk9PTCBiSm9pbjsKKyAgd2hpbGUgKGlQb2ludCA8IG1fUG9pbnRDb3VudCkgeworICAgIGlmIChtX3BQb2ludHNbaVBvaW50XS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8pIHsKKyAgICAgIGlTdGFydFBvaW50ID0gaVBvaW50ICsgMTsKKyAgICAgIGlFbmRQb2ludCA9IGlQb2ludDsKKyAgICAgIGJKb2luID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX3BQb2ludHNbaVBvaW50XS5tX0ZsYWcgPT0gRlhQVF9CRVpJRVJUTykgeworICAgICAgICByZWN0LlVwZGF0ZVJlY3QobV9wUG9pbnRzW2lQb2ludF0ubV9Qb2ludFgsIG1fcFBvaW50c1tpUG9pbnRdLm1fUG9pbnRZKTsKKyAgICAgICAgcmVjdC5VcGRhdGVSZWN0KG1fcFBvaW50c1tpUG9pbnQgKyAxXS5tX1BvaW50WCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFBvaW50c1tpUG9pbnQgKyAxXS5tX1BvaW50WSk7CisgICAgICAgIGlQb2ludCArPSAyOworICAgICAgfQorICAgICAgaWYgKGlQb2ludCA9PSBtX1BvaW50Q291bnQgLSAxIHx8CisgICAgICAgICAgbV9wUG9pbnRzW2lQb2ludCArIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTykgeworICAgICAgICBpU3RhcnRQb2ludCA9IGlQb2ludCAtIDE7CisgICAgICAgIGlFbmRQb2ludCA9IGlQb2ludDsKKyAgICAgICAgYkpvaW4gPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlTdGFydFBvaW50ID0gaVBvaW50IC0gMTsKKyAgICAgICAgaU1pZGRsZVBvaW50ID0gaVBvaW50OworICAgICAgICBpRW5kUG9pbnQgPSBpUG9pbnQgKyAxOworICAgICAgICBiSm9pbiA9IFRSVUU7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiByZWN0OworICAgIEZYX0ZMT0FUIHN0YXJ0X3ggPSBtX3BQb2ludHNbaVN0YXJ0UG9pbnRdLm1fUG9pbnRYOworICAgIEZYX0ZMT0FUIHN0YXJ0X3kgPSBtX3BQb2ludHNbaVN0YXJ0UG9pbnRdLm1fUG9pbnRZOworICAgIEZYX0ZMT0FUIGVuZF94ID0gbV9wUG9pbnRzW2lFbmRQb2ludF0ubV9Qb2ludFg7CisgICAgRlhfRkxPQVQgZW5kX3kgPSBtX3BQb2ludHNbaUVuZFBvaW50XS5tX1BvaW50WTsKKyAgICBpZiAoYkpvaW4pIHsKKyAgICAgIEZYX0ZMT0FUIG1pZGRsZV94ID0gbV9wUG9pbnRzW2lNaWRkbGVQb2ludF0ubV9Qb2ludFg7CisgICAgICBGWF9GTE9BVCBtaWRkbGVfeSA9IG1fcFBvaW50c1tpTWlkZGxlUG9pbnRdLm1fUG9pbnRZOworICAgICAgX1VwZGF0ZUxpbmVKb2luUG9pbnRzKHJlY3QsIHN0YXJ0X3gsIHN0YXJ0X3ksIG1pZGRsZV94LCBtaWRkbGVfeSwgZW5kX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3ksIGhhbGZfd2lkdGgsIG1pdGVyX2xpbWl0KTsKKyAgICB9IGVsc2UgeworICAgICAgX1VwZGF0ZUxpbmVFbmRQb2ludHMocmVjdCwgc3RhcnRfeCwgc3RhcnRfeSwgZW5kX3gsIGVuZF95LCBoYWxmX3dpZHRoKTsKKyAgICB9CisgICAgaVBvaW50Kys7CisgIH0KKyAgcmV0dXJuIHJlY3Q7CiB9Ci12b2lkIENGWF9QYXRoRGF0YTo6VHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpCi17Ci0gICAgaWYgKHBNYXRyaXggPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9Qb2ludENvdW50OyBpICsrKSB7Ci0gICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybShtX3BQb2ludHNbaV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpXS5tX1BvaW50WSk7Ci0gICAgfQordm9pZCBDRlhfUGF0aERhdGE6OlRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KSB7CisgIGlmIChwTWF0cml4ID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BvaW50Q291bnQ7IGkrKykgeworICAgIHBNYXRyaXgtPlRyYW5zZm9ybShtX3BQb2ludHNbaV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpXS5tX1BvaW50WSk7CisgIH0KIH0KLUZYX0JPT0wgQ0ZYX1BhdGhEYXRhOjpHZXRaZXJvQXJlYVBhdGgoQ0ZYX1BhdGhEYXRhJiBOZXdQYXRoLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9CT09MJmJUaGluLCBGWF9CT09MIGJBZGp1c3QpIGNvbnN0Ci17Ci0gICAgaWYgKG1fUG9pbnRDb3VudCA8IDMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDRlhfUGF0aERhdGE6OkdldFplcm9BcmVhUGF0aChDRlhfUGF0aERhdGEmIE5ld1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJUaGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGp1c3QpIGNvbnN0IHsKKyAgaWYgKG1fUG9pbnRDb3VudCA8IDMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fUG9pbnRDb3VudCA9PSAzICYmIChtX3BQb2ludHNbMF0ubV9GbGFnICYgRlhQVF9UWVBFKSA9PSBGWFBUX01PVkVUTyAmJgorICAgICAgKG1fcFBvaW50c1sxXS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTElORVRPICYmCisgICAgICAobV9wUG9pbnRzWzJdLm1fRmxhZyAmIEZYUFRfVFlQRSkgPT0gRlhQVF9MSU5FVE8gJiYKKyAgICAgIG1fcFBvaW50c1swXS5tX1BvaW50WCA9PSBtX3BQb2ludHNbMl0ubV9Qb2ludFggJiYKKyAgICAgIG1fcFBvaW50c1swXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbMl0ubV9Qb2ludFkpIHsKKyAgICBOZXdQYXRoLkFkZFBvaW50Q291bnQoMik7CisgICAgaWYgKGJBZGp1c3QpIHsKKyAgICAgIGlmIChwTWF0cml4KSB7CisgICAgICAgIEZYX0ZMT0FUIHggPSBtX3BQb2ludHNbMF0ubV9Qb2ludFgsIHkgPSBtX3BQb2ludHNbMF0ubV9Qb2ludFk7CisgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybVBvaW50KHgsIHkpOworICAgICAgICB4ID0gKGludCl4ICsgMC41ZjsKKyAgICAgICAgeSA9IChpbnQpeSArIDAuNWY7CisgICAgICAgIE5ld1BhdGguU2V0UG9pbnQoMCwgeCwgeSwgRlhQVF9NT1ZFVE8pOworICAgICAgICB4ID0gbV9wUG9pbnRzWzFdLm1fUG9pbnRYLCB5ID0gbV9wUG9pbnRzWzFdLm1fUG9pbnRZOworICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm1Qb2ludCh4LCB5KTsKKyAgICAgICAgeCA9IChpbnQpeCArIDAuNWY7CisgICAgICAgIHkgPSAoaW50KXkgKyAwLjVmOworICAgICAgICBOZXdQYXRoLlNldFBvaW50KDEsIHgsIHksIEZYUFRfTElORVRPKTsKKyAgICAgICAgcE1hdHJpeC0+U2V0SWRlbnRpdHkoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYX0ZMT0FUIHggPSAoaW50KW1fcFBvaW50c1swXS5tX1BvaW50WCArIDAuNWYsCisgICAgICAgICAgICAgICAgIHkgPSAoaW50KW1fcFBvaW50c1swXS5tX1BvaW50WSArIDAuNWY7CisgICAgICAgIE5ld1BhdGguU2V0UG9pbnQoMCwgeCwgeSwgRlhQVF9NT1ZFVE8pOworICAgICAgICB4ID0gKGludCltX3BQb2ludHNbMV0ubV9Qb2ludFggKyAwLjVmLAorICAgICAgICB5ID0gKGludCltX3BQb2ludHNbMV0ubV9Qb2ludFkgKyAwLjVmOworICAgICAgICBOZXdQYXRoLlNldFBvaW50KDEsIHgsIHksIEZYUFRfTElORVRPKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgTmV3UGF0aC5TZXRQb2ludCgwLCBtX3BQb2ludHNbMF0ubV9Qb2ludFgsIG1fcFBvaW50c1swXS5tX1BvaW50WSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9NT1ZFVE8pOworICAgICAgTmV3UGF0aC5TZXRQb2ludCgxLCBtX3BQb2ludHNbMV0ubV9Qb2ludFgsIG1fcFBvaW50c1sxXS5tX1BvaW50WSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9MSU5FVE8pOwogICAgIH0KLSAgICBpZiAobV9Qb2ludENvdW50ID09IDMgJiYgKG1fcFBvaW50c1swXS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTU9WRVRPICYmCi0gICAgICAgICAgICAobV9wUG9pbnRzWzFdLm1fRmxhZyAmIEZYUFRfVFlQRSkgPT0gRlhQVF9MSU5FVE8gJiYgKG1fcFBvaW50c1syXS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTElORVRPCi0gICAgICAgICAgICAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFggPT0gbV9wUG9pbnRzWzJdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbMl0ubV9Qb2ludFkpIHsKLSAgICAgICAgTmV3UGF0aC5BZGRQb2ludENvdW50KDIpOwotICAgICAgICBpZiAoYkFkanVzdCkgewotICAgICAgICAgICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCB4ID0gbV9wUG9pbnRzWzBdLm1fUG9pbnRYLCB5ID0gbV9wUG9pbnRzWzBdLm1fUG9pbnRZOwotICAgICAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybVBvaW50KHgsIHkpOwotICAgICAgICAgICAgICAgIHggPSAoaW50KXggKyAwLjVmOwotICAgICAgICAgICAgICAgIHkgPSAoaW50KXkgKyAwLjVmOwotICAgICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQoMCwgeCwgeSwgRlhQVF9NT1ZFVE8pOwotICAgICAgICAgICAgICAgIHggPSBtX3BQb2ludHNbMV0ubV9Qb2ludFgsIHkgPSBtX3BQb2ludHNbMV0ubV9Qb2ludFk7Ci0gICAgICAgICAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtUG9pbnQoeCwgeSk7Ci0gICAgICAgICAgICAgICAgeCA9IChpbnQpeCArIDAuNWY7Ci0gICAgICAgICAgICAgICAgeSA9IChpbnQpeSArIDAuNWY7Ci0gICAgICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludCgxLCB4LCB5LCBGWFBUX0xJTkVUTyk7Ci0gICAgICAgICAgICAgICAgcE1hdHJpeC0+U2V0SWRlbnRpdHkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgeCA9IChpbnQpbV9wUG9pbnRzWzBdLm1fUG9pbnRYICsgMC41ZiwgeSA9IChpbnQpbV9wUG9pbnRzWzBdLm1fUG9pbnRZICsgMC41ZjsKLSAgICAgICAgICAgICAgICBOZXdQYXRoLlNldFBvaW50KDAsIHgsIHksIEZYUFRfTU9WRVRPKTsKLSAgICAgICAgICAgICAgICB4ID0gKGludCltX3BQb2ludHNbMV0ubV9Qb2ludFggKyAwLjVmLCB5ID0gKGludCltX3BQb2ludHNbMV0ubV9Qb2ludFkgKyAwLjVmOwotICAgICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQoMSwgeCwgeSwgRlhQVF9MSU5FVE8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludCgwLCBtX3BQb2ludHNbMF0ubV9Qb2ludFgsIG1fcFBvaW50c1swXS5tX1BvaW50WSwgRlhQVF9NT1ZFVE8pOwotICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludCgxLCBtX3BQb2ludHNbMV0ubV9Qb2ludFgsIG1fcFBvaW50c1sxXS5tX1BvaW50WSwgRlhQVF9MSU5FVE8pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzFdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbMV0ubV9Qb2ludFkpIHsKLSAgICAgICAgICAgIGJUaGluID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCgobV9Qb2ludENvdW50ID4gMykgJiYgKG1fUG9pbnRDb3VudCAlIDIpKSkgewotICAgICAgICBpbnQgbWlkID0gbV9Qb2ludENvdW50IC8gMjsKLSAgICAgICAgRlhfQk9PTCBiWmVyb0FyZWEgPSBGQUxTRTsKLSAgICAgICAgQ0ZYX1BhdGhEYXRhIHRfcGF0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWQ7IGkrKykgewotICAgICAgICAgICAgaWYgKCEobV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX1BvaW50WCA9PSBtX3BQb2ludHNbbWlkICsgaSArIDFdLm1fUG9pbnRYCi0gICAgICAgICAgICAgICAgICAgICYmIG1fcFBvaW50c1ttaWQgLSBpIC0gMV0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzW21pZCArIGkgKyAxXS5tX1BvaW50WSAmJgotICAgICAgICAgICAgICAgICAgICAoKG1fcFBvaW50c1ttaWQgLSBpIC0gMV0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX0JFWklFUlRPICYmIChtX3BQb2ludHNbbWlkICsgaSArIDFdLm1fRmxhZyAmIEZYUFRfVFlQRSkgIT0gRlhQVF9CRVpJRVJUTykpKSB7Ci0gICAgICAgICAgICAgICAgYlplcm9BcmVhID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBuZXdfY291bnQgPSB0X3BhdGguR2V0UG9pbnRDb3VudCgpOwotICAgICAgICAgICAgdF9wYXRoLkFkZFBvaW50Q291bnQoMik7Ci0gICAgICAgICAgICB0X3BhdGguU2V0UG9pbnQobmV3X2NvdW50LCBtX3BQb2ludHNbbWlkIC0gaV0ubV9Qb2ludFgsIG1fcFBvaW50c1ttaWQgLSBpXS5tX1BvaW50WSwgRlhQVF9NT1ZFVE8pOwotICAgICAgICAgICAgdF9wYXRoLlNldFBvaW50KG5ld19jb3VudCArIDEsIG1fcFBvaW50c1ttaWQgLSBpIC0gMV0ubV9Qb2ludFgsIG1fcFBvaW50c1ttaWQgLSBpIC0gMV0ubV9Qb2ludFksIEZYUFRfTElORVRPKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWJaZXJvQXJlYSkgewotICAgICAgICAgICAgTmV3UGF0aC5BcHBlbmQoJnRfcGF0aCwgTlVMTCk7Ci0gICAgICAgICAgICBiVGhpbiA9IFRSVUU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgc3RyYXRQb2ludCA9IDA7Ci0gICAgaW50IG5leHQgPSAwLCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX1BvaW50Q291bnQ7IGkrKykgewotICAgICAgICBpbnQgcG9pbnRfdHlwZSA9IG1fcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEU7Ci0gICAgICAgIGlmIChwb2ludF90eXBlID09IEZYUFRfTU9WRVRPKSB7Ci0gICAgICAgICAgICBzdHJhdFBvaW50ID0gaTsKLSAgICAgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfTElORVRPKSB7Ci0gICAgICAgICAgICBuZXh0ID0gKGkgKyAxIC0gc3RyYXRQb2ludCkgJSAobV9Qb2ludENvdW50IC0gc3RyYXRQb2ludCkgKyBzdHJhdFBvaW50OwotICAgICAgICAgICAgaWYgKChtX3BQb2ludHNbbmV4dF0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX0JFWklFUlRPICYmIChtX3BQb2ludHNbbmV4dF0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX01PVkVUTykgewotICAgICAgICAgICAgICAgIGlmKChtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYID09IG1fcFBvaW50c1tpXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbaV0ubV9Qb2ludFggPT0gbV9wUG9pbnRzW25leHRdLm1fUG9pbnRYKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChtX3BQb2ludHNbaV0ubV9Qb2ludFkgLSBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRZKSAqIChtX3BQb2ludHNbaV0ubV9Qb2ludFkgLSBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFkpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHByZSA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChGWFNZU19mYWJzKG1fcFBvaW50c1tpXS5tX1BvaW50WSAtIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBGWFNZU19mYWJzKG1fcFBvaW50c1tpXS5tX1BvaW50WSAtIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZSAtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHQtLTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X2NvdW50ID0gTmV3UGF0aC5HZXRQb2ludENvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIE5ld1BhdGguQWRkUG9pbnRDb3VudCgyKTsKLSAgICAgICAgICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludChuZXdfY291bnQsIG1fcFBvaW50c1twcmVdLm1fUG9pbnRYLCBtX3BQb2ludHNbcHJlXS5tX1BvaW50WSwgRlhQVF9NT1ZFVE8pOwotICAgICAgICAgICAgICAgICAgICBOZXdQYXRoLlNldFBvaW50KG5ld19jb3VudCArIDEsIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WCwgbV9wUG9pbnRzW25leHRdLm1fUG9pbnRZLCBGWFBUX0xJTkVUTyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKChtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRZID09IG1fcFBvaW50c1tpXS5tX1BvaW50WSAmJiBtX3BQb2ludHNbaV0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzW25leHRdLm1fUG9pbnRZKQotICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKG1fcFBvaW50c1tpXS5tX1BvaW50WCAtIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFgpICogKG1fcFBvaW50c1tpXS5tX1BvaW50WCAtIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgcHJlID0gaTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEZYU1lTX2ZhYnMobV9wUG9pbnRzW2ldLm1fUG9pbnRYIC0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IEZYU1lTX2ZhYnMobV9wUG9pbnRzW2ldLm1fUG9pbnRYIC0gbV9wUG9pbnRzW25leHRdLm1fUG9pbnRYKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlIC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCBuZXdfY291bnQgPSBOZXdQYXRoLkdldFBvaW50Q291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgTmV3UGF0aC5BZGRQb2ludENvdW50KDIpOwotICAgICAgICAgICAgICAgICAgICBOZXdQYXRoLlNldFBvaW50KG5ld19jb3VudCwgbV9wUG9pbnRzW3ByZV0ubV9Qb2ludFgsIG1fcFBvaW50c1twcmVdLm1fUG9pbnRZLCBGWFBUX01PVkVUTyk7Ci0gICAgICAgICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50ICsgMSwgbV9wUG9pbnRzW25leHRdLm1fUG9pbnRYLCBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFksIEZYUFRfTElORVRPKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChtX3BQb2ludHNbaSAtIDFdLm1fRmxhZyAmIEZYUFRfVFlQRSkgPT0gRlhQVF9NT1ZFVE8gJiYgKG1fcFBvaW50c1tuZXh0XS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTElORVRPICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYID09IG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WCAmJiBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRZID09IG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WQotICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbV9wUG9pbnRzW25leHRdLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5ld19jb3VudCA9IE5ld1BhdGguR2V0UG9pbnRDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICBOZXdQYXRoLkFkZFBvaW50Q291bnQoMik7Ci0gICAgICAgICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50LCBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYLCBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRZLCBGWFBUX01PVkVUTyk7Ci0gICAgICAgICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50ICsgMSwgbV9wUG9pbnRzW2ldLm1fUG9pbnRYLCBtX3BQb2ludHNbaV0ubV9Qb2ludFksIEZYUFRfTElORVRPKTsKLSAgICAgICAgICAgICAgICAgICAgYlRoaW4gPSBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfQkVaSUVSVE8pIHsKLSAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX1BvaW50Q291bnQgPiAzICYmIE5ld1BhdGguR2V0UG9pbnRDb3VudCgpKSB7Ci0gICAgICAgIGJUaGluID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKE5ld1BhdGguR2V0UG9pbnRDb3VudCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzFdLm1fUG9pbnRYICYmCisgICAgICAgIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbMV0ubV9Qb2ludFkpIHsKKyAgICAgIGJUaGluID0gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCgobV9Qb2ludENvdW50ID4gMykgJiYgKG1fUG9pbnRDb3VudCAlIDIpKSkgeworICAgIGludCBtaWQgPSBtX1BvaW50Q291bnQgLyAyOworICAgIEZYX0JPT0wgYlplcm9BcmVhID0gRkFMU0U7CisgICAgQ0ZYX1BhdGhEYXRhIHRfcGF0aDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pZDsgaSsrKSB7CisgICAgICBpZiAoIShtX3BQb2ludHNbbWlkIC0gaSAtIDFdLm1fUG9pbnRYID09CisgICAgICAgICAgICAgICAgbV9wUG9pbnRzW21pZCArIGkgKyAxXS5tX1BvaW50WCAmJgorICAgICAgICAgICAgbV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX1BvaW50WSA9PQorICAgICAgICAgICAgICAgIG1fcFBvaW50c1ttaWQgKyBpICsgMV0ubV9Qb2ludFkgJiYKKyAgICAgICAgICAgICgobV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfQkVaSUVSVE8gJiYKKyAgICAgICAgICAgICAobV9wUG9pbnRzW21pZCArIGkgKyAxXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfQkVaSUVSVE8pKSkgeworICAgICAgICBiWmVyb0FyZWEgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGludCBuZXdfY291bnQgPSB0X3BhdGguR2V0UG9pbnRDb3VudCgpOworICAgICAgdF9wYXRoLkFkZFBvaW50Q291bnQoMik7CisgICAgICB0X3BhdGguU2V0UG9pbnQobmV3X2NvdW50LCBtX3BQb2ludHNbbWlkIC0gaV0ubV9Qb2ludFgsCisgICAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW21pZCAtIGldLm1fUG9pbnRZLCBGWFBUX01PVkVUTyk7CisgICAgICB0X3BhdGguU2V0UG9pbnQobmV3X2NvdW50ICsgMSwgbV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX1BvaW50WCwKKyAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbbWlkIC0gaSAtIDFdLm1fUG9pbnRZLCBGWFBUX0xJTkVUTyk7CisgICAgfQorICAgIGlmICghYlplcm9BcmVhKSB7CisgICAgICBOZXdQYXRoLkFwcGVuZCgmdF9wYXRoLCBOVUxMKTsKKyAgICAgIGJUaGluID0gVFJVRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBpbnQgc3RyYXRQb2ludCA9IDA7CisgIGludCBuZXh0ID0gMCwgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1fUG9pbnRDb3VudDsgaSsrKSB7CisgICAgaW50IHBvaW50X3R5cGUgPSBtX3BQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFOworICAgIGlmIChwb2ludF90eXBlID09IEZYUFRfTU9WRVRPKSB7CisgICAgICBzdHJhdFBvaW50ID0gaTsKKyAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9MSU5FVE8pIHsKKyAgICAgIG5leHQgPSAoaSArIDEgLSBzdHJhdFBvaW50KSAlIChtX1BvaW50Q291bnQgLSBzdHJhdFBvaW50KSArIHN0cmF0UG9pbnQ7CisgICAgICBpZiAoKG1fcFBvaW50c1tuZXh0XS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfQkVaSUVSVE8gJiYKKyAgICAgICAgICAobV9wUG9pbnRzW25leHRdLm1fRmxhZyAmIEZYUFRfVFlQRSkgIT0gRlhQVF9NT1ZFVE8pIHsKKyAgICAgICAgaWYgKChtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYID09IG1fcFBvaW50c1tpXS5tX1BvaW50WCAmJgorICAgICAgICAgICAgIG1fcFBvaW50c1tpXS5tX1BvaW50WCA9PSBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFgpICYmCisgICAgICAgICAgICAoKG1fcFBvaW50c1tpXS5tX1BvaW50WSAtIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFkpICoKKyAgICAgICAgICAgICAgICAgKG1fcFBvaW50c1tpXS5tX1BvaW50WSAtIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WSkgPgorICAgICAgICAgICAgIDApKSB7CisgICAgICAgICAgaW50IHByZSA9IGk7CisgICAgICAgICAgaWYgKEZYU1lTX2ZhYnMobV9wUG9pbnRzW2ldLm1fUG9pbnRZIC0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WSkgPAorICAgICAgICAgICAgICBGWFNZU19mYWJzKG1fcFBvaW50c1tpXS5tX1BvaW50WSAtIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WSkpIHsKKyAgICAgICAgICAgIHByZS0tOworICAgICAgICAgICAgbmV4dC0tOworICAgICAgICAgIH0KKyAgICAgICAgICBpbnQgbmV3X2NvdW50ID0gTmV3UGF0aC5HZXRQb2ludENvdW50KCk7CisgICAgICAgICAgTmV3UGF0aC5BZGRQb2ludENvdW50KDIpOworICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50LCBtX3BQb2ludHNbcHJlXS5tX1BvaW50WCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFBvaW50c1twcmVdLm1fUG9pbnRZLCBGWFBUX01PVkVUTyk7CisgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludChuZXdfY291bnQgKyAxLCBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFksIEZYUFRfTElORVRPKTsKKyAgICAgICAgfSBlbHNlIGlmICgobV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbaV0ubV9Qb2ludFkgJiYKKyAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW2ldLm1fUG9pbnRZID09IG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WSkgJiYKKyAgICAgICAgICAgICAgICAgICAoKG1fcFBvaW50c1tpXS5tX1BvaW50WCAtIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIChtX3BQb2ludHNbaV0ubV9Qb2ludFggLSBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFgpID4KKyAgICAgICAgICAgICAgICAgICAgMCkpIHsKKyAgICAgICAgICBpbnQgcHJlID0gaTsKKyAgICAgICAgICBpZiAoRlhTWVNfZmFicyhtX3BQb2ludHNbaV0ubV9Qb2ludFggLSBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYKSA8CisgICAgICAgICAgICAgIEZYU1lTX2ZhYnMobV9wUG9pbnRzW2ldLm1fUG9pbnRYIC0gbV9wUG9pbnRzW25leHRdLm1fUG9pbnRYKSkgeworICAgICAgICAgICAgcHJlLS07CisgICAgICAgICAgICBuZXh0LS07CisgICAgICAgICAgfQorICAgICAgICAgIGludCBuZXdfY291bnQgPSBOZXdQYXRoLkdldFBvaW50Q291bnQoKTsKKyAgICAgICAgICBOZXdQYXRoLkFkZFBvaW50Q291bnQoMik7CisgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludChuZXdfY291bnQsIG1fcFBvaW50c1twcmVdLm1fUG9pbnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW3ByZV0ubV9Qb2ludFksIEZYUFRfTU9WRVRPKTsKKyAgICAgICAgICBOZXdQYXRoLlNldFBvaW50KG5ld19jb3VudCArIDEsIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WSwgRlhQVF9MSU5FVE8pOworICAgICAgICB9IGVsc2UgaWYgKChtX3BQb2ludHNbaSAtIDFdLm1fRmxhZyAmIEZYUFRfVFlQRSkgPT0gRlhQVF9NT1ZFVE8gJiYKKyAgICAgICAgICAgICAgICAgICAobV9wUG9pbnRzW25leHRdLm1fRmxhZyAmIEZYUFRfVFlQRSkgPT0gRlhQVF9MSU5FVE8gJiYKKyAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYID09IG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WCAmJgorICAgICAgICAgICAgICAgICAgIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzW25leHRdLm1fUG9pbnRZICYmCisgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW25leHRdLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKKyAgICAgICAgICBpbnQgbmV3X2NvdW50ID0gTmV3UGF0aC5HZXRQb2ludENvdW50KCk7CisgICAgICAgICAgTmV3UGF0aC5BZGRQb2ludENvdW50KDIpOworICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50LCBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WSwgRlhQVF9NT1ZFVE8pOworICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50ICsgMSwgbV9wUG9pbnRzW2ldLm1fUG9pbnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW2ldLm1fUG9pbnRZLCBGWFBUX0xJTkVUTyk7CisgICAgICAgICAgYlRoaW4gPSBUUlVFOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfQkVaSUVSVE8pIHsKKyAgICAgIGkgKz0gMjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgfQorICBpZiAobV9Qb2ludENvdW50ID4gMyAmJiBOZXdQYXRoLkdldFBvaW50Q291bnQoKSkgeworICAgIGJUaGluID0gVFJVRTsKKyAgfQorICBpZiAoTmV3UGF0aC5HZXRQb2ludENvdW50KCkgPT0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0ZYX1BhdGhEYXRhOjpJc1JlY3QoKSBjb25zdAotewotICAgIGlmIChtX1BvaW50Q291bnQgIT0gNSAmJiBtX1BvaW50Q291bnQgIT0gNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGWF9QYXRoRGF0YTo6SXNSZWN0KCkgY29uc3QgeworICBpZiAobV9Qb2ludENvdW50ICE9IDUgJiYgbV9Qb2ludENvdW50ICE9IDQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKChtX1BvaW50Q291bnQgPT0gNSAmJiAobV9wUG9pbnRzWzBdLm1fUG9pbnRYICE9IG1fcFBvaW50c1s0XS5tX1BvaW50WCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbMF0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzWzRdLm1fUG9pbnRZKSkgfHwKKyAgICAgIChtX3BQb2ludHNbMF0ubV9Qb2ludFggPT0gbV9wUG9pbnRzWzJdLm1fUG9pbnRYICYmCisgICAgICAgbV9wUG9pbnRzWzBdLm1fUG9pbnRZID09IG1fcFBvaW50c1syXS5tX1BvaW50WSkgfHwKKyAgICAgIChtX3BQb2ludHNbMV0ubV9Qb2ludFggPT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmCisgICAgICAgbV9wUG9pbnRzWzFdLm1fUG9pbnRZID09IG1fcFBvaW50c1szXS5tX1BvaW50WSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcFBvaW50c1swXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFggJiYKKyAgICAgIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICBpZiAoKG1fcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfTElORVRPKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmICgobV9Qb2ludENvdW50ID09IDUgJiYgKG1fcFBvaW50c1swXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbNF0ubV9Qb2ludFggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbMF0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzWzRdLm1fUG9pbnRZKSkgfHwKLSAgICAgICAgICAgIChtX3BQb2ludHNbMF0ubV9Qb2ludFggPT0gbV9wUG9pbnRzWzJdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbMl0ubV9Qb2ludFkpIHx8Ci0gICAgICAgICAgICAobV9wUG9pbnRzWzFdLm1fUG9pbnRYID09IG1fcFBvaW50c1szXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbMV0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRZKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKG1fcFBvaW50c1tpXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYICYmCisgICAgICAgIG1fcFBvaW50c1tpXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRZKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmIChtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgaWYgKChtX3BQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX0xJTkVUTykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BQb2ludHNbaV0ubV9Qb2ludFggIT0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbaV0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX1BvaW50Q291bnQgPT0gNSB8fCAobV9wUG9pbnRzWzNdLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpOworICB9CisgIHJldHVybiBtX1BvaW50Q291bnQgPT0gNSB8fCAobV9wUG9pbnRzWzNdLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpOwogfQotRlhfQk9PTCBDRlhfUGF0aERhdGE6OklzUmVjdChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBDRlhfRmxvYXRSZWN0KiBwUmVjdCkgY29uc3QKLXsKLSAgICBpZiAocE1hdHJpeCA9PSBOVUxMKSB7Ci0gICAgICAgIGlmICghSXNSZWN0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFJlY3QpIHsKLSAgICAgICAgICAgIHBSZWN0LT5sZWZ0ID0gbV9wUG9pbnRzWzBdLm1fUG9pbnRYOwotICAgICAgICAgICAgcFJlY3QtPnJpZ2h0ID0gbV9wUG9pbnRzWzJdLm1fUG9pbnRYOwotICAgICAgICAgICAgcFJlY3QtPmJvdHRvbSA9IG1fcFBvaW50c1swXS5tX1BvaW50WTsKLSAgICAgICAgICAgIHBSZWN0LT50b3AgPSBtX3BQb2ludHNbMl0ubV9Qb2ludFk7Ci0gICAgICAgICAgICBwUmVjdC0+Tm9ybWFsaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChtX1BvaW50Q291bnQgIT0gNSAmJiBtX1BvaW50Q291bnQgIT0gNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICgobV9Qb2ludENvdW50ID09IDUgJiYgKG1fcFBvaW50c1swXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbNF0ubV9Qb2ludFggfHwgbV9wUG9pbnRzWzBdLm1fUG9pbnRZICE9IG1fcFBvaW50c1s0XS5tX1BvaW50WSkpIHx8Ci0gICAgICAgICAgICAobV9wUG9pbnRzWzFdLm1fUG9pbnRYID09IG1fcFBvaW50c1szXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbMV0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRZKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX1BvaW50Q291bnQgPT0gNCAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9GTE9BVCB4WzVdLCB5WzVdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9Qb2ludENvdW50OyBpICsrKSB7Ci0gICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybShtX3BQb2ludHNbaV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpXS5tX1BvaW50WSwgeFtpXSwgeVtpXSk7Ci0gICAgICAgIGlmIChpKSB7Ci0gICAgICAgICAgICBpZiAoKG1fcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfTElORVRPKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHhbaV0gIT0geFtpIC0gMV0gJiYgeVtpXSAhPSB5W2kgLSAxXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorRlhfQk9PTCBDRlhfUGF0aERhdGE6OklzUmVjdChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0KiBwUmVjdCkgY29uc3QgeworICBpZiAocE1hdHJpeCA9PSBOVUxMKSB7CisgICAgaWYgKCFJc1JlY3QoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAocFJlY3QpIHsKLSAgICAgICAgcFJlY3QtPmxlZnQgPSB4WzBdOwotICAgICAgICBwUmVjdC0+cmlnaHQgPSB4WzJdOwotICAgICAgICBwUmVjdC0+Ym90dG9tID0geVswXTsKLSAgICAgICAgcFJlY3QtPnRvcCA9IHlbMl07Ci0gICAgICAgIHBSZWN0LT5Ob3JtYWxpemUoKTsKKyAgICAgIHBSZWN0LT5sZWZ0ID0gbV9wUG9pbnRzWzBdLm1fUG9pbnRYOworICAgICAgcFJlY3QtPnJpZ2h0ID0gbV9wUG9pbnRzWzJdLm1fUG9pbnRYOworICAgICAgcFJlY3QtPmJvdHRvbSA9IG1fcFBvaW50c1swXS5tX1BvaW50WTsKKyAgICAgIHBSZWN0LT50b3AgPSBtX3BQb2ludHNbMl0ubV9Qb2ludFk7CisgICAgICBwUmVjdC0+Tm9ybWFsaXplKCk7CiAgICAgfQogICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDRlhfUGF0aERhdGE6OkNvcHkoY29uc3QgQ0ZYX1BhdGhEYXRhICZzcmMpCi17Ci0gICAgU2V0UG9pbnRDb3VudChzcmMubV9Qb2ludENvdW50KTsKLSAgICBGWFNZU19tZW1jcHkobV9wUG9pbnRzLCBzcmMubV9wUG9pbnRzLCBzaXplb2YoRlhfUEFUSFBPSU5UKSAqIG1fUG9pbnRDb3VudCk7Ci19Ci1DRlhfR3JhcGhTdGF0ZURhdGE6OkNGWF9HcmFwaFN0YXRlRGF0YSgpCi17Ci0gICAgbV9MaW5lQ2FwID0gTGluZUNhcEJ1dHQ7Ci0gICAgbV9EYXNoQ291bnQgPSAwOwotICAgIG1fRGFzaEFycmF5ID0gTlVMTDsKLSAgICBtX0Rhc2hQaGFzZSA9IDA7Ci0gICAgbV9MaW5lSm9pbiA9IExpbmVKb2luTWl0ZXI7Ci0gICAgbV9NaXRlckxpbWl0ID0gMTAgKiAxLjBmOwotICAgIG1fTGluZVdpZHRoID0gMS4wZjsKLX0KLUNGWF9HcmFwaFN0YXRlRGF0YTo6Q0ZYX0dyYXBoU3RhdGVEYXRhKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSYgc3JjKQotewotICAgIG1fRGFzaEFycmF5ID0gTlVMTDsKLSAgICBDb3B5KHNyYyk7Ci19Ci12b2lkIENGWF9HcmFwaFN0YXRlRGF0YTo6Q29weShjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEmIHNyYykKLXsKLSAgICBtX0xpbmVDYXAgPSBzcmMubV9MaW5lQ2FwOwotICAgIG1fRGFzaENvdW50ID0gc3JjLm1fRGFzaENvdW50OwotICAgIGlmIChtX0Rhc2hBcnJheSkgewotICAgICAgICBGWF9GcmVlKG1fRGFzaEFycmF5KTsKKyAgfQorICBpZiAobV9Qb2ludENvdW50ICE9IDUgJiYgbV9Qb2ludENvdW50ICE9IDQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKChtX1BvaW50Q291bnQgPT0gNSAmJiAobV9wUG9pbnRzWzBdLm1fUG9pbnRYICE9IG1fcFBvaW50c1s0XS5tX1BvaW50WCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbMF0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzWzRdLm1fUG9pbnRZKSkgfHwKKyAgICAgIChtX3BQb2ludHNbMV0ubV9Qb2ludFggPT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmCisgICAgICAgbV9wUG9pbnRzWzFdLm1fUG9pbnRZID09IG1fcFBvaW50c1szXS5tX1BvaW50WSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fUG9pbnRDb3VudCA9PSA0ICYmIG1fcFBvaW50c1swXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFggJiYKKyAgICAgIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRkxPQVQgeFs1XSwgeVs1XTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BvaW50Q291bnQ7IGkrKykgeworICAgIHBNYXRyaXgtPlRyYW5zZm9ybShtX3BQb2ludHNbaV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpXS5tX1BvaW50WSwgeFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgeVtpXSk7CisgICAgaWYgKGkpIHsKKyAgICAgIGlmICgobV9wUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfVFlQRSkgIT0gRlhQVF9MSU5FVE8pIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaWYgKHhbaV0gIT0geFtpIC0gMV0gJiYgeVtpXSAhPSB5W2kgLSAxXSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CiAgICAgfQotICAgIG1fRGFzaEFycmF5ID0gTlVMTDsKLSAgICBtX0Rhc2hQaGFzZSA9IHNyYy5tX0Rhc2hQaGFzZTsKLSAgICBtX0xpbmVKb2luID0gc3JjLm1fTGluZUpvaW47Ci0gICAgbV9NaXRlckxpbWl0ID0gc3JjLm1fTWl0ZXJMaW1pdDsKLSAgICBtX0xpbmVXaWR0aCA9IHNyYy5tX0xpbmVXaWR0aDsKLSAgICBpZiAobV9EYXNoQ291bnQpIHsKLSAgICAgICAgbV9EYXNoQXJyYXkgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbV9EYXNoQ291bnQpOwotICAgICAgICBGWFNZU19tZW1jcHkobV9EYXNoQXJyYXksIHNyYy5tX0Rhc2hBcnJheSwgbV9EYXNoQ291bnQgKiBzaXplb2YoRlhfRkxPQVQpKTsKLSAgICB9CisgIH0KKyAgaWYgKHBSZWN0KSB7CisgICAgcFJlY3QtPmxlZnQgPSB4WzBdOworICAgIHBSZWN0LT5yaWdodCA9IHhbMl07CisgICAgcFJlY3QtPmJvdHRvbSA9IHlbMF07CisgICAgcFJlY3QtPnRvcCA9IHlbMl07CisgICAgcFJlY3QtPk5vcm1hbGl6ZSgpOworICB9CisgIHJldHVybiBUUlVFOwogfQotQ0ZYX0dyYXBoU3RhdGVEYXRhOjp+Q0ZYX0dyYXBoU3RhdGVEYXRhKCkKLXsKLSAgICBpZiAobV9EYXNoQXJyYXkpIHsKLSAgICAgICAgRlhfRnJlZShtX0Rhc2hBcnJheSk7Ci0gICAgfQordm9pZCBDRlhfUGF0aERhdGE6OkNvcHkoY29uc3QgQ0ZYX1BhdGhEYXRhJiBzcmMpIHsKKyAgU2V0UG9pbnRDb3VudChzcmMubV9Qb2ludENvdW50KTsKKyAgRlhTWVNfbWVtY3B5KG1fcFBvaW50cywgc3JjLm1fcFBvaW50cywgc2l6ZW9mKEZYX1BBVEhQT0lOVCkgKiBtX1BvaW50Q291bnQpOwogfQotdm9pZCBDRlhfR3JhcGhTdGF0ZURhdGE6OlNldERhc2hDb3VudChpbnQgY291bnQpCi17Ci0gICAgaWYgKG1fRGFzaEFycmF5KSB7Ci0gICAgICAgIEZYX0ZyZWUobV9EYXNoQXJyYXkpOwotICAgIH0KLSAgICBtX0Rhc2hBcnJheSA9IE5VTEw7Ci0gICAgbV9EYXNoQ291bnQgPSBjb3VudDsKLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fRGFzaEFycmF5ID0gRlhfQWxsb2MoRlhfRkxPQVQsIGNvdW50KTsKK0NGWF9HcmFwaFN0YXRlRGF0YTo6Q0ZYX0dyYXBoU3RhdGVEYXRhKCkgeworICBtX0xpbmVDYXAgPSBMaW5lQ2FwQnV0dDsKKyAgbV9EYXNoQ291bnQgPSAwOworICBtX0Rhc2hBcnJheSA9IE5VTEw7CisgIG1fRGFzaFBoYXNlID0gMDsKKyAgbV9MaW5lSm9pbiA9IExpbmVKb2luTWl0ZXI7CisgIG1fTWl0ZXJMaW1pdCA9IDEwICogMS4wZjsKKyAgbV9MaW5lV2lkdGggPSAxLjBmOworfQorQ0ZYX0dyYXBoU3RhdGVEYXRhOjpDRlhfR3JhcGhTdGF0ZURhdGEoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBzcmMpIHsKKyAgbV9EYXNoQXJyYXkgPSBOVUxMOworICBDb3B5KHNyYyk7Cit9Cit2b2lkIENGWF9HcmFwaFN0YXRlRGF0YTo6Q29weShjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEmIHNyYykgeworICBtX0xpbmVDYXAgPSBzcmMubV9MaW5lQ2FwOworICBtX0Rhc2hDb3VudCA9IHNyYy5tX0Rhc2hDb3VudDsKKyAgaWYgKG1fRGFzaEFycmF5KSB7CisgICAgRlhfRnJlZShtX0Rhc2hBcnJheSk7CisgIH0KKyAgbV9EYXNoQXJyYXkgPSBOVUxMOworICBtX0Rhc2hQaGFzZSA9IHNyYy5tX0Rhc2hQaGFzZTsKKyAgbV9MaW5lSm9pbiA9IHNyYy5tX0xpbmVKb2luOworICBtX01pdGVyTGltaXQgPSBzcmMubV9NaXRlckxpbWl0OworICBtX0xpbmVXaWR0aCA9IHNyYy5tX0xpbmVXaWR0aDsKKyAgaWYgKG1fRGFzaENvdW50KSB7CisgICAgbV9EYXNoQXJyYXkgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbV9EYXNoQ291bnQpOworICAgIEZYU1lTX21lbWNweShtX0Rhc2hBcnJheSwgc3JjLm1fRGFzaEFycmF5LCBtX0Rhc2hDb3VudCAqIHNpemVvZihGWF9GTE9BVCkpOworICB9Cit9CitDRlhfR3JhcGhTdGF0ZURhdGE6On5DRlhfR3JhcGhTdGF0ZURhdGEoKSB7CisgIGlmIChtX0Rhc2hBcnJheSkgeworICAgIEZYX0ZyZWUobV9EYXNoQXJyYXkpOworICB9Cit9Cit2b2lkIENGWF9HcmFwaFN0YXRlRGF0YTo6U2V0RGFzaENvdW50KGludCBjb3VudCkgeworICBpZiAobV9EYXNoQXJyYXkpIHsKKyAgICBGWF9GcmVlKG1fRGFzaEFycmF5KTsKKyAgfQorICBtX0Rhc2hBcnJheSA9IE5VTEw7CisgIG1fRGFzaENvdW50ID0gY291bnQ7CisgIGlmIChjb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fRGFzaEFycmF5ID0gRlhfQWxsb2MoRlhfRkxPQVQsIGNvdW50KTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfcHMuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKaW5kZXggNzUzNDljYS4uMmUzYWYzNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKQEAgLTgsMTcyICs4LDE3MyBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgogI2luY2x1ZGUgInRleHRfaW50LmgiCiBzdHJ1Y3QgUFNHbHlwaCB7Ci0gICAgQ0ZYX0ZvbnQqCQltX3BGb250OwotICAgIEZYX0RXT1JECQltX0dseXBoSW5kZXg7Ci0gICAgRlhfQk9PTAkJCW1fYkdseXBoQWRqdXN0OwotICAgIEZYX0ZMT0FUCQltX0FkanVzdE1hdHJpeFs0XTsKKyAgQ0ZYX0ZvbnQqIG1fcEZvbnQ7CisgIEZYX0RXT1JEIG1fR2x5cGhJbmRleDsKKyAgRlhfQk9PTCBtX2JHbHlwaEFkanVzdDsKKyAgRlhfRkxPQVQgbV9BZGp1c3RNYXRyaXhbNF07CiB9OwotY2xhc3MgQ1BTRm9udAotewotcHVibGljOgotICAgIFBTR2x5cGgJCQltX0dseXBoc1syNTZdOwotICAgIGludAkJCQltX25HbHlwaHM7CitjbGFzcyBDUFNGb250IHsKKyBwdWJsaWM6CisgIFBTR2x5cGggbV9HbHlwaHNbMjU2XTsKKyAgaW50IG1fbkdseXBoczsKIH07Ci1DRlhfUFNSZW5kZXJlcjo6Q0ZYX1BTUmVuZGVyZXIoKQotewotICAgIG1fcE91dHB1dCA9IE5VTEw7Ci0gICAgbV9iQ29sb3JTZXQgPSBtX2JHcmFwaFN0YXRlU2V0ID0gRkFMU0U7Ci0gICAgbV9iSW5pdGVkID0gRkFMU0U7CitDRlhfUFNSZW5kZXJlcjo6Q0ZYX1BTUmVuZGVyZXIoKSB7CisgIG1fcE91dHB1dCA9IE5VTEw7CisgIG1fYkNvbG9yU2V0ID0gbV9iR3JhcGhTdGF0ZVNldCA9IEZBTFNFOworICBtX2JJbml0ZWQgPSBGQUxTRTsKIH0KLUNGWF9QU1JlbmRlcmVyOjp+Q0ZYX1BTUmVuZGVyZXIoKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCltX1BTRm9udExpc3QuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENQU0ZvbnQqIHBGb250ID0gbV9QU0ZvbnRMaXN0W2ldOwotICAgICAgICBkZWxldGUgcEZvbnQ7Ci0gICAgfQorQ0ZYX1BTUmVuZGVyZXI6On5DRlhfUFNSZW5kZXJlcigpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KW1fUFNGb250TGlzdC5HZXRTaXplKCk7IGkrKykgeworICAgIENQU0ZvbnQqIHBGb250ID0gbV9QU0ZvbnRMaXN0W2ldOworICAgIGRlbGV0ZSBwRm9udDsKKyAgfQogfQotI2RlZmluZSBPVVRQVVRfUFMoc3RyKSBtX3BPdXRwdXQtPk91dHB1dFBTKHN0ciwgc2l6ZW9mIHN0ci0xKQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6SW5pdChJRlhfUFNPdXRwdXQqIHBPdXRwdXQsIGludCBwc2xldmVsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0JPT0wgYkNteWtPdXRwdXQpCi17Ci0gICAgbV9QU0xldmVsID0gcHNsZXZlbDsKLSAgICBtX3BPdXRwdXQgPSBwT3V0cHV0OwotICAgIG1fQ2xpcEJveC5sZWZ0ID0gbV9DbGlwQm94LnRvcCA9IDA7Ci0gICAgbV9DbGlwQm94LnJpZ2h0ID0gd2lkdGg7Ci0gICAgbV9DbGlwQm94LmJvdHRvbSA9IGhlaWdodDsKLSAgICBtX2JDbXlrT3V0cHV0ID0gYkNteWtPdXRwdXQ7CisjZGVmaW5lIE9VVFBVVF9QUyhzdHIpIG1fcE91dHB1dC0+T3V0cHV0UFMoc3RyLCBzaXplb2Ygc3RyIC0gMSkKK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkluaXQoSUZYX1BTT3V0cHV0KiBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHNsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbXlrT3V0cHV0KSB7CisgIG1fUFNMZXZlbCA9IHBzbGV2ZWw7CisgIG1fcE91dHB1dCA9IHBPdXRwdXQ7CisgIG1fQ2xpcEJveC5sZWZ0ID0gbV9DbGlwQm94LnRvcCA9IDA7CisgIG1fQ2xpcEJveC5yaWdodCA9IHdpZHRoOworICBtX0NsaXBCb3guYm90dG9tID0gaGVpZ2h0OworICBtX2JDbXlrT3V0cHV0ID0gYkNteWtPdXRwdXQ7CiB9Ci1GWF9CT09MIENGWF9QU1JlbmRlcmVyOjpTdGFydFJlbmRlcmluZygpCi17Ci0gICAgaWYgKG1fYkluaXRlZCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgaW5pdF9zdHJbXSA9ICJcbnNhdmVcbi9pbS9pbml0bWF0cml4IGxvYWQgZGVmXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbi9uZXdwYXRoIGxvYWQgZGVmL20vbW92ZXRvIGxvYWQgZGVmL2wvbGluZXRvIGxvYWQgZGVmL2MvY3VydmV0byBsb2FkIGRlZi9oL2Nsb3NlcGF0aCBsb2FkIGRlZlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2YvZmlsbCBsb2FkIGRlZi9GL2VvZmlsbCBsb2FkIGRlZi9zL3N0cm9rZSBsb2FkIGRlZi9XL2NsaXAgbG9hZCBkZWYvVyovZW9jbGlwIGxvYWQgZGVmXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvcmcvc2V0cmdiY29sb3IgbG9hZCBkZWYvay9zZXRjbXlrY29sb3IgbG9hZCBkZWZcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9KL3NldGxpbmVjYXAgbG9hZCBkZWYvai9zZXRsaW5lam9pbiBsb2FkIGRlZi93L3NldGxpbmV3aWR0aCBsb2FkIGRlZi9NL3NldG1pdGVybGltaXQgbG9hZCBkZWYvZC9zZXRkYXNoIGxvYWQgZGVmXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvcS9nc2F2ZSBsb2FkIGRlZi9RL2dyZXN0b3JlIGxvYWQgZGVmL2lNL2ltYWdlbWFzayBsb2FkIGRlZlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL1RqL3Nob3cgbG9hZCBkZWYvRmYvZmluZGZvbnQgbG9hZCBkZWYvRnMvc2NhbGVmb250IGxvYWQgZGVmL1NmL3NldGZvbnQgbG9hZCBkZWZcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9jbS9jb25jYXQgbG9hZCBkZWYvQ20vY3VycmVudG1hdHJpeCBsb2FkIGRlZi9teC9tYXRyaXggbG9hZCBkZWYvc20vc2V0bWF0cml4IGxvYWQgZGVmXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKLSAgICBPVVRQVVRfUFMoaW5pdF9zdHIpOwotICAgIG1fYkluaXRlZCA9IFRSVUU7CitGWF9CT09MIENGWF9QU1JlbmRlcmVyOjpTdGFydFJlbmRlcmluZygpIHsKKyAgaWYgKG1fYkluaXRlZCkgewogICAgIHJldHVybiBUUlVFOworICB9CisgIHN0YXRpYyBjb25zdCBjaGFyIGluaXRfc3RyW10gPQorICAgICAgIlxuc2F2ZVxuL2ltL2luaXRtYXRyaXggbG9hZCBkZWZcbiIKKyAgICAgICIvbi9uZXdwYXRoIGxvYWQgZGVmL20vbW92ZXRvIGxvYWQgZGVmL2wvbGluZXRvIGxvYWQgZGVmL2MvY3VydmV0byBsb2FkICIKKyAgICAgICJkZWYvaC9jbG9zZXBhdGggbG9hZCBkZWZcbiIKKyAgICAgICIvZi9maWxsIGxvYWQgZGVmL0YvZW9maWxsIGxvYWQgZGVmL3Mvc3Ryb2tlIGxvYWQgZGVmL1cvY2xpcCBsb2FkICIKKyAgICAgICJkZWYvVyovZW9jbGlwIGxvYWQgZGVmXG4iCisgICAgICAiL3JnL3NldHJnYmNvbG9yIGxvYWQgZGVmL2svc2V0Y215a2NvbG9yIGxvYWQgZGVmXG4iCisgICAgICAiL0ovc2V0bGluZWNhcCBsb2FkIGRlZi9qL3NldGxpbmVqb2luIGxvYWQgZGVmL3cvc2V0bGluZXdpZHRoIGxvYWQgIgorICAgICAgImRlZi9NL3NldG1pdGVybGltaXQgbG9hZCBkZWYvZC9zZXRkYXNoIGxvYWQgZGVmXG4iCisgICAgICAiL3EvZ3NhdmUgbG9hZCBkZWYvUS9ncmVzdG9yZSBsb2FkIGRlZi9pTS9pbWFnZW1hc2sgbG9hZCBkZWZcbiIKKyAgICAgICIvVGovc2hvdyBsb2FkIGRlZi9GZi9maW5kZm9udCBsb2FkIGRlZi9Gcy9zY2FsZWZvbnQgbG9hZCBkZWYvU2Yvc2V0Zm9udCAiCisgICAgICAibG9hZCBkZWZcbiIKKyAgICAgICIvY20vY29uY2F0IGxvYWQgZGVmL0NtL2N1cnJlbnRtYXRyaXggbG9hZCBkZWYvbXgvbWF0cml4IGxvYWQgIgorICAgICAgImRlZi9zbS9zZXRtYXRyaXggbG9hZCBkZWZcbiI7CisgIE9VVFBVVF9QUyhpbml0X3N0cik7CisgIG1fYkluaXRlZCA9IFRSVUU7CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6RW5kUmVuZGVyaW5nKCkKLXsKLSAgICBpZiAobV9iSW5pdGVkKSB7Ci0gICAgICAgIE9VVFBVVF9QUygiXG5yZXN0b3JlXG4iKTsKK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkVuZFJlbmRlcmluZygpIHsKKyAgaWYgKG1fYkluaXRlZCkgeworICAgIE9VVFBVVF9QUygiXG5yZXN0b3JlXG4iKTsKKyAgfQorICBtX2JJbml0ZWQgPSBGQUxTRTsKK30KK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNhdmVTdGF0ZSgpIHsKKyAgU3RhcnRSZW5kZXJpbmcoKTsKKyAgT1VUUFVUX1BTKCJxXG4iKTsKKyAgbV9DbGlwQm94U3RhY2suQWRkKG1fQ2xpcEJveCk7Cit9Cit2b2lkIENGWF9QU1JlbmRlcmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKSB7CisgIFN0YXJ0UmVuZGVyaW5nKCk7CisgIGlmIChiS2VlcFNhdmVkKSB7CisgICAgT1VUUFVUX1BTKCJRXG5xXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBPVVRQVVRfUFMoIlFcbiIpOworICB9CisgIG1fYkNvbG9yU2V0ID0gbV9iR3JhcGhTdGF0ZVNldCA9IEZBTFNFOworICBtX0NsaXBCb3ggPSBtX0NsaXBCb3hTdGFjay5HZXRBdChtX0NsaXBCb3hTdGFjay5HZXRTaXplKCkgLSAxKTsKKyAgaWYgKCFiS2VlcFNhdmVkKSB7CisgICAgbV9DbGlwQm94U3RhY2suUmVtb3ZlQXQobV9DbGlwQm94U3RhY2suR2V0U2l6ZSgpIC0gMSk7CisgIH0KK30KK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6Ok91dHB1dFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlKSB7CisgIGludCBuUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIGJ1Zi5Fc3RpbWF0ZVNpemUoblBvaW50cyAqIDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHsKKyAgICB1aW50OF90IGZsYWcgPSBwUGF0aERhdGEtPkdldEZsYWcoaSk7CisgICAgRlhfRkxPQVQgeCA9IHBQYXRoRGF0YS0+R2V0UG9pbnRYKGkpOworICAgIEZYX0ZMT0FUIHkgPSBwUGF0aERhdGEtPkdldFBvaW50WShpKTsKKyAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeCwgeSk7CiAgICAgfQotICAgIG1fYkluaXRlZCA9IEZBTFNFOwotfQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6U2F2ZVN0YXRlKCkKLXsKLSAgICBTdGFydFJlbmRlcmluZygpOwotICAgIE9VVFBVVF9QUygicVxuIik7Ci0gICAgbV9DbGlwQm94U3RhY2suQWRkKG1fQ2xpcEJveCk7Ci19Ci12b2lkIENGWF9QU1JlbmRlcmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQotewotICAgIFN0YXJ0UmVuZGVyaW5nKCk7Ci0gICAgaWYgKGJLZWVwU2F2ZWQpIHsKLSAgICAgICAgT1VUUFVUX1BTKCJRXG5xXG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBPVVRQVVRfUFMoIlFcbiIpOwotICAgIH0KLSAgICBtX2JDb2xvclNldCA9IG1fYkdyYXBoU3RhdGVTZXQgPSBGQUxTRTsKLSAgICBtX0NsaXBCb3ggPSBtX0NsaXBCb3hTdGFjay5HZXRBdChtX0NsaXBCb3hTdGFjay5HZXRTaXplKCkgLSAxKTsKLSAgICBpZiAoIWJLZWVwU2F2ZWQpIHsKLSAgICAgICAgbV9DbGlwQm94U3RhY2suUmVtb3ZlQXQobV9DbGlwQm94U3RhY2suR2V0U2l6ZSgpIC0gMSk7Ci0gICAgfQotfQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6T3V0cHV0UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UpCi17Ci0gICAgaW50IG5Qb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsKLSAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICAgIGJ1Zi5Fc3RpbWF0ZVNpemUoblBvaW50cyAqIDEwKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Qb2ludHM7IGkgKyspIHsKLSAgICAgICAgdWludDhfdCBmbGFnID0gcFBhdGhEYXRhLT5HZXRGbGFnKGkpOwotICAgICAgICBGWF9GTE9BVCB4ID0gcFBhdGhEYXRhLT5HZXRQb2ludFgoaSk7Ci0gICAgICAgIEZYX0ZMT0FUIHkgPSBwUGF0aERhdGEtPkdldFBvaW50WShpKTsKKyAgICBidWYgPDwgeCA8PCBGWF9CU1RSQygiICIpIDw8IHk7CisgICAgc3dpdGNoIChmbGFnICYgRlhQVF9UWVBFKSB7CisgICAgICBjYXNlIEZYUFRfTU9WRVRPOgorICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiBtICIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhQVF9MSU5FVE86CisgICAgICAgIGlmIChmbGFnICYgRlhQVF9DTE9TRUZJR1VSRSkgeworICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIGwgaCAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiBsICIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWFBUX0JFWklFUlRPOiB7CisgICAgICAgIEZYX0ZMT0FUIHgxID0gcFBhdGhEYXRhLT5HZXRQb2ludFgoaSArIDEpOworICAgICAgICBGWF9GTE9BVCB4MiA9IHBQYXRoRGF0YS0+R2V0UG9pbnRYKGkgKyAyKTsKKyAgICAgICAgRlhfRkxPQVQgeTEgPSBwUGF0aERhdGEtPkdldFBvaW50WShpICsgMSk7CisgICAgICAgIEZYX0ZMT0FUIHkyID0gcFBhdGhEYXRhLT5HZXRQb2ludFkoaSArIDIpOwogICAgICAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKLSAgICAgICAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeCwgeSk7CisgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4MSwgeTEpOworICAgICAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeDIsIHkyKTsKICAgICAgICAgfQotICAgICAgICBidWYgPDwgeCA8PCBGWF9CU1RSQygiICIpIDw8IHk7Ci0gICAgICAgIHN3aXRjaCAoZmxhZyAmIEZYUFRfVFlQRSkgewotICAgICAgICAgICAgY2FzZSBGWFBUX01PVkVUTzoKLSAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiBtICIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWFBUX0xJTkVUTzoKLSAgICAgICAgICAgICAgICBpZiAoZmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIgbCBoICIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIGwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWFBUX0JFWklFUlRPOiB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgxID0gcFBhdGhEYXRhLT5HZXRQb2ludFgoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiA9IHBQYXRoRGF0YS0+R2V0UG9pbnRYKGkgKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEgPSBwUGF0aERhdGEtPkdldFBvaW50WShpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyID0gcFBhdGhEYXRhLT5HZXRQb2ludFkoaSArIDIpOwotICAgICAgICAgICAgICAgICAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeDEsIHkxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeDIsIHkyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiAiKSA8PCB4MSA8PCBGWF9CU1RSQygiICIpIDw8IHkxIDw8IEZYX0JTVFJDKCIgIikgPDwgeDIgPDwgRlhfQlNUUkMoIiAiKSA8PCB5MjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiBjIGhcbiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIgY1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiICIpIDw8IHgxIDw8IEZYX0JTVFJDKCIgIikgPDwgeTEgPDwgRlhfQlNUUkMoIiAiKSA8PCB4MgorICAgICAgICAgICAgPDwgRlhfQlNUUkMoIiAiKSA8PCB5MjsKKyAgICAgICAgaWYgKGZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSB7CisgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIgYyBoXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiBjXG4iKTsKICAgICAgICAgfQorICAgICAgICBpICs9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOworICB9CisgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CiB9CiB2b2lkIENGWF9QU1JlbmRlcmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBTdGFydFJlbmRlcmluZygpOwotICAgIE91dHB1dFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gcFBhdGhEYXRhLT5HZXRCb3VuZGluZ0JveCgpOwotICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICByZWN0LlRyYW5zZm9ybShwT2JqZWN0MkRldmljZSk7Ci0gICAgfQotICAgIG1fQ2xpcEJveC5JbnRlcnNlY3QocmVjdC5HZXRPdXR0ZXJSZWN0KCkpOwotICAgIGlmICgoZmlsbF9tb2RlICYgMykgPT0gRlhGSUxMX1dJTkRJTkcpIHsKLSAgICAgICAgT1VUUFVUX1BTKCJXIG5cbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE9VVFBVVF9QUygiVyogblxuIik7Ci0gICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlKSB7CisgIFN0YXJ0UmVuZGVyaW5nKCk7CisgIE91dHB1dFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7CisgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBQYXRoRGF0YS0+R2V0Qm91bmRpbmdCb3goKTsKKyAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgcmVjdC5UcmFuc2Zvcm0ocE9iamVjdDJEZXZpY2UpOworICB9CisgIG1fQ2xpcEJveC5JbnRlcnNlY3QocmVjdC5HZXRPdXR0ZXJSZWN0KCkpOworICBpZiAoKGZpbGxfbW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HKSB7CisgICAgT1VUUFVUX1BTKCJXIG5cbiIpOworICB9IGVsc2UgeworICAgIE9VVFBVVF9QUygiVyogblxuIik7CisgIH0KIH0KIHZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgU3RhcnRSZW5kZXJpbmcoKTsKLSAgICBTZXRHcmFwaFN0YXRlKHBHcmFwaFN0YXRlKTsKLSAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKLSAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCJteCBDbSBbIikgPDwgcE9iamVjdDJEZXZpY2UtPmEgPDwgRlhfQlNUUkMoIiAiKSA8PCBwT2JqZWN0MkRldmljZS0+YiA8PCBGWF9CU1RSQygiICIpIDw8Ci0gICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+YyA8PCBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5kIDw8IEZYX0JTVFJDKCIgIikgPDwgcE9iamVjdDJEZXZpY2UtPmUgPDwKLSAgICAgICAgICAgIEZYX0JTVFJDKCIgIikgPDwgcE9iamVjdDJEZXZpY2UtPmYgPDwgRlhfQlNUUkMoIl1jbSAiKTsKLSAgICAgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKLSAgICB9Ci0gICAgT3V0cHV0UGF0aChwUGF0aERhdGEsIE5VTEwpOwotICAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBQYXRoRGF0YS0+R2V0Qm91bmRpbmdCb3gocEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoLCBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKLSAgICByZWN0LlRyYW5zZm9ybShwT2JqZWN0MkRldmljZSk7Ci0gICAgbV9DbGlwQm94LkludGVyc2VjdChyZWN0LkdldE91dHRlclJlY3QoKSk7Ci0gICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgIE9VVFBVVF9QUygic3Ryb2tlcGF0aCBXIG4gc21cbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE9VVFBVVF9QUygic3Ryb2tlcGF0aCBXIG5cbiIpOwotICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKSB7CisgIFN0YXJ0UmVuZGVyaW5nKCk7CisgIFNldEdyYXBoU3RhdGUocEdyYXBoU3RhdGUpOworICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICAgIGJ1ZiA8PCBGWF9CU1RSQygibXggQ20gWyIpIDw8IHBPYmplY3QyRGV2aWNlLT5hIDw8IEZYX0JTVFJDKCIgIikKKyAgICAgICAgPDwgcE9iamVjdDJEZXZpY2UtPmIgPDwgRlhfQlNUUkMoIiAiKSA8PCBwT2JqZWN0MkRldmljZS0+YworICAgICAgICA8PCBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5kIDw8IEZYX0JTVFJDKCIgIikKKyAgICAgICAgPDwgcE9iamVjdDJEZXZpY2UtPmUgPDwgRlhfQlNUUkMoIiAiKSA8PCBwT2JqZWN0MkRldmljZS0+ZgorICAgICAgICA8PCBGWF9CU1RSQygiXWNtICIpOworICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgIH0KKyAgT3V0cHV0UGF0aChwUGF0aERhdGEsIE5VTEwpOworICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwUGF0aERhdGEtPkdldEJvdW5kaW5nQm94KHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKKyAgcmVjdC5UcmFuc2Zvcm0ocE9iamVjdDJEZXZpY2UpOworICBtX0NsaXBCb3guSW50ZXJzZWN0KHJlY3QuR2V0T3V0dGVyUmVjdCgpKTsKKyAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgT1VUUFVUX1BTKCJzdHJva2VwYXRoIFcgbiBzbVxuIik7CisgIH0gZWxzZSB7CisgICAgT1VUUFVUX1BTKCJzdHJva2VwYXRoIFcgblxuIik7CisgIH0KIH0KIEZYX0JPT0wgQ0ZYX1BTUmVuZGVyZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCkBAIC0xODIsNDY2ICsxODMsNTM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBTdGFydFJlbmRlcmluZygpOwotICAgIGludCBmaWxsX2FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoZmlsbF9jb2xvcik7Ci0gICAgaW50IHN0cm9rZV9hbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpIDogRlhBUkdCX0Eoc3Ryb2tlX2NvbG9yKTsKLSAgICBpZiAoZmlsbF9hbHBoYSAmJiBmaWxsX2FscGhhIDwgMjU1KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgU3RhcnRSZW5kZXJpbmcoKTsKKyAgaW50IGZpbGxfYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICAgOiBGWEFSR0JfQShmaWxsX2NvbG9yKTsKKyAgaW50IHN0cm9rZV9hbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9BKHN0cm9rZV9jb2xvcik7CisgIGlmIChmaWxsX2FscGhhICYmIGZpbGxfYWxwaGEgPCAyNTUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHN0cm9rZV9hbHBoYSAmJiBzdHJva2VfYWxwaGEgPCAyNTUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKGZpbGxfYWxwaGEgPT0gMCAmJiBzdHJva2VfYWxwaGEgPT0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoc3Ryb2tlX2FscGhhKSB7CisgICAgU2V0R3JhcGhTdGF0ZShwR3JhcGhTdGF0ZSk7CisgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICAgICAgYnVmIDw8IEZYX0JTVFJDKCJteCBDbSBbIikgPDwgcE9iamVjdDJEZXZpY2UtPmEgPDwgRlhfQlNUUkMoIiAiKQorICAgICAgICAgIDw8IHBPYmplY3QyRGV2aWNlLT5iIDw8IEZYX0JTVFJDKCIgIikgPDwgcE9iamVjdDJEZXZpY2UtPmMKKyAgICAgICAgICA8PCBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5kIDw8IEZYX0JTVFJDKCIgIikKKyAgICAgICAgICA8PCBwT2JqZWN0MkRldmljZS0+ZSA8PCBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5mCisgICAgICAgICAgPDwgRlhfQlNUUkMoIl1jbSAiKTsKKyAgICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CiAgICAgfQotICAgIGlmIChzdHJva2VfYWxwaGEgJiYgc3Ryb2tlX2FscGhhIDwgMjU1KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBPdXRwdXRQYXRoKHBQYXRoRGF0YSwgc3Ryb2tlX2FscGhhID8gTlVMTCA6IHBPYmplY3QyRGV2aWNlKTsKKyAgaWYgKGZpbGxfbW9kZSAmJiBmaWxsX2FscGhhKSB7CisgICAgU2V0Q29sb3IoZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgaWYgKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORykgeworICAgICAgaWYgKHN0cm9rZV9hbHBoYSkgeworICAgICAgICBPVVRQVVRfUFMoInEgZiBRICIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgT1VUUFVUX1BTKCJmIik7CisgICAgICB9CisgICAgfSBlbHNlIGlmICgoZmlsbF9tb2RlICYgMykgPT0gRlhGSUxMX0FMVEVSTkFURSkgeworICAgICAgaWYgKHN0cm9rZV9hbHBoYSkgeworICAgICAgICBPVVRQVVRfUFMoInEgRiBRICIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgT1VUUFVUX1BTKCJGIik7CisgICAgICB9CiAgICAgfQotICAgIGlmIChmaWxsX2FscGhhID09IDAgJiYgc3Ryb2tlX2FscGhhID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChzdHJva2VfYWxwaGEpIHsKKyAgICBTZXRDb2xvcihzdHJva2VfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICAgIGlmIChwT2JqZWN0MkRldmljZSkgeworICAgICAgT1VUUFVUX1BTKCJzIHNtIik7CisgICAgfSBlbHNlIHsKKyAgICAgIE9VVFBVVF9QUygicyIpOwogICAgIH0KLSAgICBpZiAoc3Ryb2tlX2FscGhhKSB7Ci0gICAgICAgIFNldEdyYXBoU3RhdGUocEdyYXBoU3RhdGUpOwotICAgICAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKLSAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIm14IENtIFsiKSA8PCBwT2JqZWN0MkRldmljZS0+YSA8PCBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5iIDw8IEZYX0JTVFJDKCIgIikgPDwKLSAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+YyA8PCBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5kIDw8IEZYX0JTVFJDKCIgIikgPDwgcE9iamVjdDJEZXZpY2UtPmUgPDwKLSAgICAgICAgICAgICAgICBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5mIDw8IEZYX0JTVFJDKCJdY20gIik7Ci0gICAgICAgICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgICAgICB9CisgIH0KKyAgT1VUUFVUX1BTKCJcbiIpOworICByZXR1cm4gVFJVRTsKK30KK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNldEdyYXBoU3RhdGUoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSkgeworICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBpZiAoIW1fYkdyYXBoU3RhdGVTZXQgfHwKKyAgICAgIG1fQ3VyR3JhcGhTdGF0ZS5tX0xpbmVDYXAgIT0gcEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgeworICAgIGJ1ZiA8PCBwR3JhcGhTdGF0ZS0+bV9MaW5lQ2FwIDw8IEZYX0JTVFJDKCIgSlxuIik7CisgIH0KKyAgaWYgKCFtX2JHcmFwaFN0YXRlU2V0IHx8CisgICAgICBtX0N1ckdyYXBoU3RhdGUubV9EYXNoQ291bnQgIT0gcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50IHx8CisgICAgICBGWFNZU19tZW1jbXAobV9DdXJHcmFwaFN0YXRlLm1fRGFzaEFycmF5LCBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXksCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0ZMT0FUKSAqIG1fQ3VyR3JhcGhTdGF0ZS5tX0Rhc2hDb3VudCkpIHsKKyAgICBidWYgPDwgRlhfQlNUUkMoIlsiKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudDsgaSsrKSB7CisgICAgICBidWYgPDwgcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2ldIDw8IEZYX0JTVFJDKCIgIik7CiAgICAgfQotICAgIE91dHB1dFBhdGgocFBhdGhEYXRhLCBzdHJva2VfYWxwaGEgPyBOVUxMIDogcE9iamVjdDJEZXZpY2UpOwotICAgIGlmIChmaWxsX21vZGUgJiYgZmlsbF9hbHBoYSkgewotICAgICAgICBTZXRDb2xvcihmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgaWYgKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORykgewotICAgICAgICAgICAgaWYgKHN0cm9rZV9hbHBoYSkgewotICAgICAgICAgICAgICAgIE9VVFBVVF9QUygicSBmIFEgIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE9VVFBVVF9QUygiZiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfQUxURVJOQVRFKSB7Ci0gICAgICAgICAgICBpZiAoc3Ryb2tlX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgT1VUUFVUX1BTKCJxIEYgUSAiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgT1VUUFVUX1BTKCJGIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBidWYgPDwgRlhfQlNUUkMoIl0iKSA8PCBwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2UgPDwgRlhfQlNUUkMoIiBkXG4iKTsKKyAgfQorICBpZiAoIW1fYkdyYXBoU3RhdGVTZXQgfHwKKyAgICAgIG1fQ3VyR3JhcGhTdGF0ZS5tX0xpbmVKb2luICE9IHBHcmFwaFN0YXRlLT5tX0xpbmVKb2luKSB7CisgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX0xpbmVKb2luIDw8IEZYX0JTVFJDKCIgalxuIik7CisgIH0KKyAgaWYgKCFtX2JHcmFwaFN0YXRlU2V0IHx8CisgICAgICBtX0N1ckdyYXBoU3RhdGUubV9MaW5lV2lkdGggIT0gcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoKSB7CisgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCA8PCBGWF9CU1RSQygiIHdcbiIpOworICB9CisgIGlmICghbV9iR3JhcGhTdGF0ZVNldCB8fAorICAgICAgbV9DdXJHcmFwaFN0YXRlLm1fTWl0ZXJMaW1pdCAhPSBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KSB7CisgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQgPDwgRlhfQlNUUkMoIiBNXG4iKTsKKyAgfQorICBtX0N1ckdyYXBoU3RhdGUuQ29weSgqcEdyYXBoU3RhdGUpOworICBtX2JHcmFwaFN0YXRlU2V0ID0gVFJVRTsKKyAgaWYgKGJ1Zi5HZXRTaXplKCkpIHsKKyAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOworICB9Cit9CitzdGF0aWMgdm9pZCBGYXhDb21wcmVzc0RhdGEodWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOworICBpZiAod2lkdGggKiBoZWlnaHQgPiAxMjggJiYgcEVuY29kZXJzICYmCisgICAgICBwRW5jb2RlcnMtPkdldEZheE1vZHVsZSgpLT5FbmNvZGUoc3JjX2J1Ziwgd2lkdGgsIGhlaWdodCwgKHdpZHRoICsgNykgLyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmLCBkZXN0X3NpemUpKSB7CisgICAgRlhfRnJlZShzcmNfYnVmKTsKKyAgfSBlbHNlIHsKKyAgICBkZXN0X2J1ZiA9IHNyY19idWY7CisgICAgZGVzdF9zaXplID0gKHdpZHRoICsgNykgLyA4ICogaGVpZ2h0OworICB9Cit9CitzdGF0aWMgdm9pZCBQU0NvbXByZXNzRGF0YShpbnQgUFNMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIG91dHB1dF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiomIGZpbHRlcikgeworICBvdXRwdXRfYnVmID0gc3JjX2J1ZjsKKyAgb3V0cHV0X3NpemUgPSBzcmNfc2l6ZTsKKyAgZmlsdGVyID0gIiI7CisgIGlmIChzcmNfc2l6ZSA8IDEwMjQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKTsKKyAgdWludDhfdCogZGVzdF9idWYgPSBOVUxMOworICBGWF9EV09SRCBkZXN0X3NpemUgPSBzcmNfc2l6ZTsKKyAgaWYgKFBTTGV2ZWwgPj0gMykgeworICAgIGlmIChwRW5jb2RlcnMgJiYKKyAgICAgICAgcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5FbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NpemUpKSB7CisgICAgICBmaWx0ZXIgPSAiL0ZsYXRlRGVjb2RlIGZpbHRlciAiOwogICAgIH0KLSAgICBpZiAoc3Ryb2tlX2FscGhhKSB7Ci0gICAgICAgIFNldENvbG9yKHN0cm9rZV9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICAgICAgT1VUUFVUX1BTKCJzIHNtIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBPVVRQVVRfUFMoInMiKTsKLSAgICAgICAgfQorICB9IGVsc2UgeworICAgIGlmIChwRW5jb2RlcnMgJiYKKyAgICAgICAgcEVuY29kZXJzLT5HZXRCYXNpY01vZHVsZSgpLT5SdW5MZW5ndGhFbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmLCBkZXN0X3NpemUpKSB7CisgICAgICBmaWx0ZXIgPSAiL1J1bkxlbmd0aERlY29kZSBmaWx0ZXIgIjsKICAgICB9Ci0gICAgT1VUUFVUX1BTKCJcbiIpOworICB9CisgIGlmIChkZXN0X3NpemUgPCBzcmNfc2l6ZSkgeworICAgIG91dHB1dF9idWYgPSBkZXN0X2J1ZjsKKyAgICBvdXRwdXRfc2l6ZSA9IGRlc3Rfc2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBmaWx0ZXIgPSBOVUxMOworICAgIGlmIChkZXN0X2J1ZikgeworICAgICAgRlhfRnJlZShkZXN0X2J1Zik7CisgICAgfQorICB9Cit9CitGWF9CT09MIENGWF9QU1JlbmRlcmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgU3RhcnRSZW5kZXJpbmcoKTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgoKEZYX0ZMT0FUKShwU291cmNlLT5HZXRXaWR0aCgpKSwgMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLShGWF9GTE9BVCkocFNvdXJjZS0+R2V0SGVpZ2h0KCkpLCAoRlhfRkxPQVQpKGxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKHRvcCArIHBTb3VyY2UtPkdldEhlaWdodCgpKSk7CisgIHJldHVybiBEcmF3RElCaXRzKHBTb3VyY2UsIGNvbG9yLCAmbWF0cml4LCAwLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKK30KK0ZYX0JPT0wgQ0ZYX1BTUmVuZGVyZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIFN0YXJ0UmVuZGVyaW5nKCk7CisgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KChGWF9GTE9BVCkoZGVzdF93aWR0aCksIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoLWRlc3RfaGVpZ2h0KSwgKEZYX0ZMT0FUKShkZXN0X2xlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGRlc3RfdG9wICsgZGVzdF9oZWlnaHQpKTsKKyAgcmV0dXJuIERyYXdESUJpdHMocFNvdXJjZSwgY29sb3IsICZtYXRyaXgsIGZsYWdzLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKK30KK0ZYX0JPT0wgQ0ZYX1BTUmVuZGVyZXI6OkRyYXdESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBTdGFydFJlbmRlcmluZygpOworICBpZiAoKHBNYXRyaXgtPmEgPT0gMCAmJiBwTWF0cml4LT5iID09IDApIHx8CisgICAgICAocE1hdHJpeC0+YyA9PSAwICYmIHBNYXRyaXgtPmQgPT0gMCkpIHsKICAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNldEdyYXBoU3RhdGUoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSkKLXsKLSAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICAgIGlmICghbV9iR3JhcGhTdGF0ZVNldCB8fCBtX0N1ckdyYXBoU3RhdGUubV9MaW5lQ2FwICE9IHBHcmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKLSAgICAgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX0xpbmVDYXAgPDwgRlhfQlNUUkMoIiBKXG4iKTsKKyAgfQorICBpZiAocFNvdXJjZS0+SGFzQWxwaGEoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoY29sb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWEFSR0JfQShjb2xvcik7CisgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpICYmIChhbHBoYSA8IDI1NSB8fCBwU291cmNlLT5HZXRCUFAoKSAhPSAxKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBPVVRQVVRfUFMoInFcbiIpOworICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBidWYgPDwgRlhfQlNUUkMoIlsiKSA8PCBwTWF0cml4LT5hIDw8IEZYX0JTVFJDKCIgIikgPDwgcE1hdHJpeC0+YgorICAgICAgPDwgRlhfQlNUUkMoIiAiKSA8PCBwTWF0cml4LT5jIDw8IEZYX0JTVFJDKCIgIikgPDwgcE1hdHJpeC0+ZAorICAgICAgPDwgRlhfQlNUUkMoIiAiKSA8PCBwTWF0cml4LT5lIDw8IEZYX0JTVFJDKCIgIikgPDwgcE1hdHJpeC0+ZgorICAgICAgPDwgRlhfQlNUUkMoIl1jbSAiKTsKKyAgaW50IHdpZHRoID0gcFNvdXJjZS0+R2V0V2lkdGgoKTsKKyAgaW50IGhlaWdodCA9IHBTb3VyY2UtPkdldEhlaWdodCgpOworICBidWYgPDwgd2lkdGggPDwgRlhfQlNUUkMoIiAiKSA8PCBoZWlnaHQ7CisgIGlmIChwU291cmNlLT5HZXRCUFAoKSA9PSAxICYmIHBTb3VyY2UtPkdldFBhbGV0dGUoKSA9PSBOVUxMKSB7CisgICAgaW50IHBpdGNoID0gKHdpZHRoICsgNykgLyA4OworICAgIEZYX0RXT1JEIHNyY19zaXplID0gaGVpZ2h0ICogcGl0Y2g7CisgICAgdWludDhfdCogc3JjX2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNyY19zaXplKTsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTb3VyY2UtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICBGWFNZU19tZW1jcHkoc3JjX2J1ZiArIHJvdyAqIHBpdGNoLCBzcmNfc2NhbiwgcGl0Y2gpOwogICAgIH0KLSAgICBpZiAoIW1fYkdyYXBoU3RhdGVTZXQgfHwgbV9DdXJHcmFwaFN0YXRlLm1fRGFzaENvdW50ICE9IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCB8fAotICAgICAgICAgICAgRlhTWVNfbWVtY21wKG1fQ3VyR3JhcGhTdGF0ZS5tX0Rhc2hBcnJheSwgcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5LCBzaXplb2YoRlhfRkxPQVQpKm1fQ3VyR3JhcGhTdGF0ZS5tX0Rhc2hDb3VudCkpIHsKLSAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCJbIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBidWYgPDwgcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2ldIDw8IEZYX0JTVFJDKCIgIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCJdIikgPDwgcEdyYXBoU3RhdGUtPm1fRGFzaFBoYXNlIDw8IEZYX0JTVFJDKCIgZFxuIik7Ci0gICAgfQotICAgIGlmICghbV9iR3JhcGhTdGF0ZVNldCB8fCBtX0N1ckdyYXBoU3RhdGUubV9MaW5lSm9pbiAhPSBwR3JhcGhTdGF0ZS0+bV9MaW5lSm9pbikgewotICAgICAgICBidWYgPDwgcEdyYXBoU3RhdGUtPm1fTGluZUpvaW4gPDwgRlhfQlNUUkMoIiBqXG4iKTsKLSAgICB9Ci0gICAgaWYgKCFtX2JHcmFwaFN0YXRlU2V0IHx8IG1fQ3VyR3JhcGhTdGF0ZS5tX0xpbmVXaWR0aCAhPSBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGgpIHsKLSAgICAgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCA8PCBGWF9CU1RSQygiIHdcbiIpOwotICAgIH0KLSAgICBpZiAoIW1fYkdyYXBoU3RhdGVTZXQgfHwgbV9DdXJHcmFwaFN0YXRlLm1fTWl0ZXJMaW1pdCAhPSBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KSB7Ci0gICAgICAgIGJ1ZiA8PCBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0IDw8IEZYX0JTVFJDKCIgTVxuIik7Ci0gICAgfQotICAgIG1fQ3VyR3JhcGhTdGF0ZS5Db3B5KCpwR3JhcGhTdGF0ZSk7Ci0gICAgbV9iR3JhcGhTdGF0ZVNldCA9IFRSVUU7Ci0gICAgaWYgKGJ1Zi5HZXRTaXplKCkpIHsKLSAgICAgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKLSAgICB9Ci19Ci1zdGF0aWMgdm9pZCBGYXhDb21wcmVzc0RhdGEodWludDhfdCogc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCB1aW50OF90KiYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKTsKLSAgICBpZiAod2lkdGggKiBoZWlnaHQgPiAxMjggJiYgcEVuY29kZXJzICYmIHBFbmNvZGVycy0+R2V0RmF4TW9kdWxlKCktPkVuY29kZShzcmNfYnVmLCB3aWR0aCwgaGVpZ2h0LCAod2lkdGggKyA3KSAvIDgsIGRlc3RfYnVmLCBkZXN0X3NpemUpKSB7Ci0gICAgICAgIEZYX0ZyZWUoc3JjX2J1Zik7CisgICAgdWludDhfdCogb3V0cHV0X2J1ZjsKKyAgICBGWF9EV09SRCBvdXRwdXRfc2l6ZTsKKyAgICBGYXhDb21wcmVzc0RhdGEoc3JjX2J1Ziwgd2lkdGgsIGhlaWdodCwgb3V0cHV0X2J1Ziwgb3V0cHV0X3NpemUpOworICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICBTZXRDb2xvcihjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgICBtX2JDb2xvclNldCA9IEZBTFNFOworICAgICAgYnVmIDw8IEZYX0JTVFJDKCIgdHJ1ZVsiKTsKICAgICB9IGVsc2UgewotICAgICAgICBkZXN0X2J1ZiA9IHNyY19idWY7Ci0gICAgICAgIGRlc3Rfc2l6ZSA9ICh3aWR0aCArIDcpIC8gOCAqIGhlaWdodDsKKyAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIDFbIik7CiAgICAgfQotfQotc3RhdGljIHZvaWQgUFNDb21wcmVzc0RhdGEoaW50IFBTTGV2ZWwsIHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIG91dHB1dF9idWYsIEZYX0RXT1JEJiBvdXRwdXRfc2l6ZSwgY29uc3QgRlhfQ0hBUiomIGZpbHRlcikKLXsKLSAgICBvdXRwdXRfYnVmID0gc3JjX2J1ZjsKLSAgICBvdXRwdXRfc2l6ZSA9IHNyY19zaXplOwotICAgIGZpbHRlciA9ICIiOwotICAgIGlmIChzcmNfc2l6ZSA8IDEwMjQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOwotICAgIHVpbnQ4X3QqIGRlc3RfYnVmID0gTlVMTDsKLSAgICBGWF9EV09SRCBkZXN0X3NpemUgPSBzcmNfc2l6ZTsKLSAgICBpZiAoUFNMZXZlbCA+PSAzKSB7Ci0gICAgICAgIGlmIChwRW5jb2RlcnMgJiYgcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5FbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpKSB7Ci0gICAgICAgICAgICBmaWx0ZXIgPSAiL0ZsYXRlRGVjb2RlIGZpbHRlciAiOwotICAgICAgICB9CisgICAgYnVmIDw8IHdpZHRoIDw8IEZYX0JTVFJDKCIgMCAwIC0iKSA8PCBoZWlnaHQgPDwgRlhfQlNUUkMoIiAwICIpIDw8IGhlaWdodAorICAgICAgICA8PCBGWF9CU1RSQygiXWN1cnJlbnRmaWxlL0FTQ0lJODVEZWNvZGUgZmlsdGVyICIpOworICAgIGlmIChvdXRwdXRfYnVmICE9IHNyY19idWYpCisgICAgICBidWYgPDwgRlhfQlNUUkMoIjw8L0sgLTEvRW5kT2ZCbG9jayBmYWxzZS9Db2x1bW5zICIpIDw8IHdpZHRoCisgICAgICAgICAgPDwgRlhfQlNUUkMoIi9Sb3dzICIpIDw8IGhlaWdodAorICAgICAgICAgIDw8IEZYX0JTVFJDKCI+Pi9DQ0lUVEZheERlY29kZSBmaWx0ZXIgIik7CisgICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKKyAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiaU1cbiIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwRW5jb2RlcnMgJiYgcEVuY29kZXJzLT5HZXRCYXNpY01vZHVsZSgpLT5SdW5MZW5ndGhFbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpKSB7Ci0gICAgICAgICAgICBmaWx0ZXIgPSAiL1J1bkxlbmd0aERlY29kZSBmaWx0ZXIgIjsKLSAgICAgICAgfQorICAgICAgYnVmIDw8IEZYX0JTVFJDKCJmYWxzZSAxIGNvbG9yaW1hZ2VcbiIpOwogICAgIH0KLSAgICBpZiAoZGVzdF9zaXplIDwgc3JjX3NpemUpIHsKLSAgICAgICAgb3V0cHV0X2J1ZiA9IGRlc3RfYnVmOwotICAgICAgICBvdXRwdXRfc2l6ZSA9IGRlc3Rfc2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBmaWx0ZXIgPSBOVUxMOwotICAgICAgICBpZiAoZGVzdF9idWYpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOwotICAgICAgICB9Ci0gICAgfQotfQotRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgbGVmdCwgaW50IHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBTdGFydFJlbmRlcmluZygpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KChGWF9GTE9BVCkocFNvdXJjZS0+R2V0V2lkdGgoKSksIDAuMGYsIDAuMGYsIC0oRlhfRkxPQVQpKHBTb3VyY2UtPkdldEhlaWdodCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGxlZnQpLCAoRlhfRkxPQVQpKHRvcCArIHBTb3VyY2UtPkdldEhlaWdodCgpKSk7Ci0gICAgcmV0dXJuIERyYXdESUJpdHMocFNvdXJjZSwgY29sb3IsICZtYXRyaXgsIDAsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotfQotRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgU3RhcnRSZW5kZXJpbmcoKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCgoRlhfRkxPQVQpKGRlc3Rfd2lkdGgpLCAwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKC1kZXN0X2hlaWdodCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShkZXN0X2xlZnQpLCAoRlhfRkxPQVQpKGRlc3RfdG9wICsgZGVzdF9oZWlnaHQpKTsKLSAgICByZXR1cm4gRHJhd0RJQml0cyhwU291cmNlLCBjb2xvciwgJm1hdHJpeCwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotfQotRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6RHJhd0RJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIFN0YXJ0UmVuZGVyaW5nKCk7Ci0gICAgaWYgKChwTWF0cml4LT5hID09IDAgJiYgcE1hdHJpeC0+YiA9PSAwKSB8fCAocE1hdHJpeC0+YyA9PSAwICYmIHBNYXRyaXgtPmQgPT0gMCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChwU291cmNlLT5IYXNBbHBoYSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGNvbG9yKSA6IEZYQVJHQl9BKGNvbG9yKTsKLSAgICBpZiAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSAmJiAoYWxwaGEgPCAyNTUgfHwgcFNvdXJjZS0+R2V0QlBQKCkgIT0gMSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBPVVRQVVRfUFMoInFcbiIpOwotICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgYnVmIDw8IEZYX0JTVFJDKCJbIikgPDwgcE1hdHJpeC0+YSA8PCBGWF9CU1RSQygiICIpIDw8IHBNYXRyaXgtPmIgPDwgRlhfQlNUUkMoIiAiKSA8PAotICAgICAgICBwTWF0cml4LT5jIDw8IEZYX0JTVFJDKCIgIikgPDwgcE1hdHJpeC0+ZCA8PCBGWF9CU1RSQygiICIpIDw8IHBNYXRyaXgtPmUgPDwKLSAgICAgICAgRlhfQlNUUkMoIiAiKSA8PCBwTWF0cml4LT5mIDw8IEZYX0JTVFJDKCJdY20gIik7Ci0gICAgaW50IHdpZHRoID0gcFNvdXJjZS0+R2V0V2lkdGgoKTsKLSAgICBpbnQgaGVpZ2h0ID0gcFNvdXJjZS0+R2V0SGVpZ2h0KCk7Ci0gICAgYnVmIDw8IHdpZHRoIDw8IEZYX0JTVFJDKCIgIikgPDwgaGVpZ2h0OwotICAgIGlmIChwU291cmNlLT5HZXRCUFAoKSA9PSAxICYmIHBTb3VyY2UtPkdldFBhbGV0dGUoKSA9PSBOVUxMKSB7Ci0gICAgICAgIGludCBwaXRjaCA9ICh3aWR0aCArIDcpIC8gODsKLSAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUgPSBoZWlnaHQgKiBwaXRjaDsKLSAgICAgICAgdWludDhfdCogc3JjX2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNyY19zaXplKTsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNvdXJjZS0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShzcmNfYnVmICsgcm93ICogcGl0Y2gsIHNyY19zY2FuLCBwaXRjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCogb3V0cHV0X2J1ZjsKLSAgICAgICAgRlhfRFdPUkQgb3V0cHV0X3NpemU7Ci0gICAgICAgIEZheENvbXByZXNzRGF0YShzcmNfYnVmLCB3aWR0aCwgaGVpZ2h0LCBvdXRwdXRfYnVmLCBvdXRwdXRfc2l6ZSk7Ci0gICAgICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICBTZXRDb2xvcihjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICBtX2JDb2xvclNldCA9IEZBTFNFOwotICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIgdHJ1ZVsiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIDFbIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmIDw8IHdpZHRoIDw8IEZYX0JTVFJDKCIgMCAwIC0iKSA8PCBoZWlnaHQgPDwgRlhfQlNUUkMoIiAwICIpIDw8IGhlaWdodCA8PAotICAgICAgICAgICAgRlhfQlNUUkMoIl1jdXJyZW50ZmlsZS9BU0NJSTg1RGVjb2RlIGZpbHRlciAiKTsKLSAgICAgICAgaWYgKG91dHB1dF9idWYgIT0gc3JjX2J1ZikKLSAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiPDwvSyAtMS9FbmRPZkJsb2NrIGZhbHNlL0NvbHVtbnMgIikgPDwgd2lkdGggPDwgRlhfQlNUUkMoIi9Sb3dzICIpIDw8IGhlaWdodCA8PAotICAgICAgICAgICAgICAgIEZYX0JTVFJDKCI+Pi9DQ0lUVEZheERlY29kZSBmaWx0ZXIgIik7Ci0gICAgICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoImlNXG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiZmFsc2UgMSBjb2xvcmltYWdlXG4iKTsKLSAgICAgICAgfQotICAgICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgICAgICBXcml0ZVBTQmluYXJ5KG91dHB1dF9idWYsIG91dHB1dF9zaXplKTsKLSAgICAgICAgRlhfRnJlZShvdXRwdXRfYnVmKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDRlhfRElCU291cmNlKiBwQ29udmVydGVkID0gKENGWF9ESUJTb3VyY2UqKXBTb3VyY2U7Ci0gICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gbV9iQ215a091dHB1dCA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2I7Ci0gICAgICAgICAgICBwQ29udmVydGVkID0gcFNvdXJjZS0+Q2xvbmVDb252ZXJ0KGZvcm1hdCwgTlVMTCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHBTb3VyY2UtPkdldEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOgotICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6Ci0gICAgICAgICAgICAgICAgICAgIHBDb252ZXJ0ZWQgPSBwU291cmNlLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOgotICAgICAgICAgICAgICAgICAgICBpZiAocFNvdXJjZS0+R2V0UGFsZXR0ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb252ZXJ0ZWQgPSBwU291cmNlLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzFicHBDbXlrOgotICAgICAgICAgICAgICAgICAgICBwQ29udmVydGVkID0gcFNvdXJjZS0+Q2xvbmVDb252ZXJ0KEZYRElCX0NteWspOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzhicHBDbXlrOgotICAgICAgICAgICAgICAgICAgICBpZiAocFNvdXJjZS0+R2V0UGFsZXR0ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb252ZXJ0ZWQgPSBwU291cmNlLT5DbG9uZUNvbnZlcnQoRlhESUJfQ215ayk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDb252ZXJ0ZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgT1VUUFVUX1BTKCJcblFcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGludCBCcHAgPSBwQ29udmVydGVkLT5HZXRCUFAoKSAvIDg7Ci0gICAgICAgIHVpbnQ4X3QqIG91dHB1dF9idWYgPSBOVUxMOwotICAgICAgICBGWF9TVFJTSVpFIG91dHB1dF9zaXplID0gMDsKLSAgICAgICAgY29uc3QgRlhfQ0hBUiogZmlsdGVyID0gTlVMTDsKLSAgICAgICAgaWYgKGZsYWdzICYgRlhSRU5ERVJfSU1BR0VfTE9TU1kpIHsKLSAgICAgICAgICAgIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7Ci0gICAgICAgICAgICBpZiAocEVuY29kZXJzICYmIHBFbmNvZGVycy0+R2V0SnBlZ01vZHVsZSgpLT5FbmNvZGUocENvbnZlcnRlZCwgb3V0cHV0X2J1Ziwgb3V0cHV0X3NpemUpKSB7Ci0gICAgICAgICAgICAgICAgZmlsdGVyID0gIi9EQ1REZWNvZGUgZmlsdGVyICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbHRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX3BpdGNoID0gd2lkdGggKiBCcHA7Ci0gICAgICAgICAgICBvdXRwdXRfc2l6ZSA9IGhlaWdodCAqIHNyY19waXRjaDsKLSAgICAgICAgICAgIG91dHB1dF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBvdXRwdXRfc2l6ZSk7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcENvbnZlcnRlZC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBvdXRwdXRfYnVmICsgcm93ICogc3JjX3BpdGNoOwotICAgICAgICAgICAgICAgIGlmIChCcHAgPT0gMykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfc2NhblsyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfcGl0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQ4X3QqIGNvbXByZXNzZWRfYnVmOwotICAgICAgICAgICAgRlhfRFdPUkQgY29tcHJlc3NlZF9zaXplOwotICAgICAgICAgICAgUFNDb21wcmVzc0RhdGEobV9QU0xldmVsLCBvdXRwdXRfYnVmLCBvdXRwdXRfc2l6ZSwgY29tcHJlc3NlZF9idWYsIGNvbXByZXNzZWRfc2l6ZSwgZmlsdGVyKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXRfYnVmICE9IGNvbXByZXNzZWRfYnVmKSB7Ci0gICAgICAgICAgICAgICAgRlhfRnJlZShvdXRwdXRfYnVmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dF9idWYgPSBjb21wcmVzc2VkX2J1ZjsKLSAgICAgICAgICAgIG91dHB1dF9zaXplID0gY29tcHJlc3NlZF9zaXplOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ29udmVydGVkICE9IHBTb3VyY2UpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQ29udmVydGVkOwotICAgICAgICAgICAgcENvbnZlcnRlZCA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIgOFsiKTsKLSAgICAgICAgYnVmIDw8IHdpZHRoIDw8IEZYX0JTVFJDKCIgMCAwIC0iKSA8PCBoZWlnaHQgPDwgRlhfQlNUUkMoIiAwICIpIDw8IGhlaWdodCA8PCBGWF9CU1RSQygiXSIpOwotICAgICAgICBidWYgPDwgRlhfQlNUUkMoImN1cnJlbnRmaWxlL0FTQ0lJODVEZWNvZGUgZmlsdGVyICIpOwotICAgICAgICBpZiAoZmlsdGVyKSB7Ci0gICAgICAgICAgICBidWYgPDwgZmlsdGVyOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiZmFsc2UgIikgPDwgQnBwOwotICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiBjb2xvcmltYWdlXG4iKTsKLSAgICAgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKLSAgICAgICAgV3JpdGVQU0JpbmFyeShvdXRwdXRfYnVmLCBvdXRwdXRfc2l6ZSk7Ci0gICAgICAgIEZYX0ZyZWUob3V0cHV0X2J1Zik7Ci0gICAgfQotICAgIE9VVFBVVF9QUygiXG5RXG4iKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNldENvbG9yKEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAoIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkgfHwgIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSB7Ci0gICAgICAgIHBJY2NUcmFuc2Zvcm0gPSBOVUxMOwotICAgIH0KLSAgICBGWF9CT09MIGJDTVlLID0gRkFMU0U7CisgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKKyAgICBXcml0ZVBTQmluYXJ5KG91dHB1dF9idWYsIG91dHB1dF9zaXplKTsKKyAgICBGWF9GcmVlKG91dHB1dF9idWYpOworICB9IGVsc2UgeworICAgIENGWF9ESUJTb3VyY2UqIHBDb252ZXJ0ZWQgPSAoQ0ZYX0RJQlNvdXJjZSopcFNvdXJjZTsKICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIGNvbG9yID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICB1aW50OF90KiBwQ29sb3IgPSAodWludDhfdCopJmNvbG9yOwotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBwQ29sb3IsIHBDb2xvciwgMSk7Ci0gICAgICAgIGNvbG9yID0gbV9iQ215a091dHB1dCA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICBiQ01ZSyA9IG1fYkNteWtPdXRwdXQ7CisgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gbV9iQ215a091dHB1dCA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2I7CisgICAgICBwQ29udmVydGVkID0gcFNvdXJjZS0+Q2xvbmVDb252ZXJ0KGZvcm1hdCwgTlVMTCwgcEljY1RyYW5zZm9ybSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYkNNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOworICAgICAgc3dpdGNoIChwU291cmNlLT5HZXRGb3JtYXQoKSkgeworICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6CisgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6CisgICAgICAgICAgcENvbnZlcnRlZCA9IHBTb3VyY2UtPkNsb25lQ29udmVydChGWERJQl9SZ2IpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6CisgICAgICAgICAgaWYgKHBTb3VyY2UtPkdldFBhbGV0dGUoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBwQ29udmVydGVkID0gcFNvdXJjZS0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZYRElCXzFicHBDbXlrOgorICAgICAgICAgIHBDb252ZXJ0ZWQgPSBwU291cmNlLT5DbG9uZUNvbnZlcnQoRlhESUJfQ215ayk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlhESUJfOGJwcENteWs6CisgICAgICAgICAgaWYgKHBTb3VyY2UtPkdldFBhbGV0dGUoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBwQ29udmVydGVkID0gcFNvdXJjZS0+Q2xvbmVDb252ZXJ0KEZYRElCX0NteWspOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKGJDTVlLICE9IG1fYkNteWtPdXRwdXQgfHwgIW1fYkNvbG9yU2V0IHx8IG1fTGFzdENvbG9yICE9IGNvbG9yKSB7Ci0gICAgICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgICAgIGlmIChiQ01ZSykgewotICAgICAgICAgICAgYnVmIDw8IEZYU1lTX0dldENWYWx1ZShjb2xvcikgLyAyNTUuMCA8PCBGWF9CU1RSQygiICIpIDw8IEZYU1lTX0dldE1WYWx1ZShjb2xvcikgLyAyNTUuMCA8PCBGWF9CU1RSQygiICIpCi0gICAgICAgICAgICAgICAgPDwgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSAvIDI1NS4wIDw8IEZYX0JTVFJDKCIgIikgPDwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSAvIDI1NS4wIDw8IEZYX0JTVFJDKCIga1xuIik7CisgICAgaWYgKHBDb252ZXJ0ZWQgPT0gTlVMTCkgeworICAgICAgT1VUUFVUX1BTKCJcblFcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpbnQgQnBwID0gcENvbnZlcnRlZC0+R2V0QlBQKCkgLyA4OworICAgIHVpbnQ4X3QqIG91dHB1dF9idWYgPSBOVUxMOworICAgIEZYX1NUUlNJWkUgb3V0cHV0X3NpemUgPSAwOworICAgIGNvbnN0IEZYX0NIQVIqIGZpbHRlciA9IE5VTEw7CisgICAgaWYgKGZsYWdzICYgRlhSRU5ERVJfSU1BR0VfTE9TU1kpIHsKKyAgICAgIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7CisgICAgICBpZiAocEVuY29kZXJzICYmCisgICAgICAgICAgcEVuY29kZXJzLT5HZXRKcGVnTW9kdWxlKCktPkVuY29kZShwQ29udmVydGVkLCBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3NpemUpKSB7CisgICAgICAgIGZpbHRlciA9ICIvRENURGVjb2RlIGZpbHRlciAiOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZmlsdGVyID09IE5VTEwpIHsKKyAgICAgIGludCBzcmNfcGl0Y2ggPSB3aWR0aCAqIEJwcDsKKyAgICAgIG91dHB1dF9zaXplID0gaGVpZ2h0ICogc3JjX3BpdGNoOworICAgICAgb3V0cHV0X2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG91dHB1dF9zaXplKTsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwQ29udmVydGVkLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBvdXRwdXRfYnVmICsgcm93ICogc3JjX3BpdGNoOworICAgICAgICBpZiAoQnBwID09IDMpIHsKKyAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzJdOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW47CisgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZiA8PCBGWEFSR0JfUihjb2xvcikgLyAyNTUuMCA8PCBGWF9CU1RSQygiICIpIDw8IEZYQVJHQl9HKGNvbG9yKSAvIDI1NS4wIDw8IEZYX0JTVFJDKCIgIikKLSAgICAgICAgICAgICAgICA8PCBGWEFSR0JfQihjb2xvcikgLyAyNTUuMCA8PCBGWF9CU1RSQygiIHJnXG4iKTsKKyAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX3BpdGNoKTsKICAgICAgICAgfQotICAgICAgICBpZiAoYkNNWUsgPT0gbV9iQ215a091dHB1dCkgewotICAgICAgICAgICAgbV9iQ29sb3JTZXQgPSBUUlVFOwotICAgICAgICAgICAgbV9MYXN0Q29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotICAgICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOworICAgICAgfQorICAgICAgdWludDhfdCogY29tcHJlc3NlZF9idWY7CisgICAgICBGWF9EV09SRCBjb21wcmVzc2VkX3NpemU7CisgICAgICBQU0NvbXByZXNzRGF0YShtX1BTTGV2ZWwsIG91dHB1dF9idWYsIG91dHB1dF9zaXplLCBjb21wcmVzc2VkX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRfc2l6ZSwgZmlsdGVyKTsKKyAgICAgIGlmIChvdXRwdXRfYnVmICE9IGNvbXByZXNzZWRfYnVmKSB7CisgICAgICAgIEZYX0ZyZWUob3V0cHV0X2J1Zik7CisgICAgICB9CisgICAgICBvdXRwdXRfYnVmID0gY29tcHJlc3NlZF9idWY7CisgICAgICBvdXRwdXRfc2l6ZSA9IGNvbXByZXNzZWRfc2l6ZTsKICAgICB9Ci19Ci12b2lkIENGWF9QU1JlbmRlcmVyOjpGaW5kUFNGb250R2x5cGgoQ0ZYX0ZhY2VDYWNoZSogcEZhY2VDYWNoZSwgQ0ZYX0ZvbnQqIHBGb250LCBjb25zdCBGWFRFWFRfQ0hBUlBPUyYgY2hhcnBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHBzX2ZvbnRudW0sIGludCAmcHNfZ2x5cGhpbmRleCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpbV9QU0ZvbnRMaXN0LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDUFNGb250KiBwUFNGb250ID0gbV9QU0ZvbnRMaXN0W2ldOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBQU0ZvbnQtPm1fbkdseXBoczsgaiArKykKLSAgICAgICAgICAgIGlmIChwUFNGb250LT5tX0dseXBoc1tqXS5tX3BGb250ID09IHBGb250ICYmIHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fR2x5cGhJbmRleCA9PSBjaGFycG9zLm1fR2x5cGhJbmRleCkgewotICAgICAgICAgICAgICAgIGlmICgoIXBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fYkdseXBoQWRqdXN0ICYmICFjaGFycG9zLm1fYkdseXBoQWRqdXN0KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fYkdseXBoQWRqdXN0ICYmIGNoYXJwb3MubV9iR2x5cGhBZGp1c3QgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAoRlhTWVNfZmFicyhwUFNGb250LT5tX0dseXBoc1tqXS5tX0FkanVzdE1hdHJpeFswXSAtIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0pIDwgMC4wMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fQWRqdXN0TWF0cml4WzFdIC0gY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsxXSkgPCAwLjAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2ZhYnMocFBTRm9udC0+bV9HbHlwaHNbal0ubV9BZGp1c3RNYXRyaXhbMl0gLSBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdKSA8IDAuMDEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyhwUFNGb250LT5tX0dseXBoc1tqXS5tX0FkanVzdE1hdHJpeFszXSAtIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10pIDwgMC4wMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBzX2ZvbnRudW0gPSBpOwotICAgICAgICAgICAgICAgICAgICBwc19nbHlwaGluZGV4ID0gajsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICBpZiAocENvbnZlcnRlZCAhPSBwU291cmNlKSB7CisgICAgICBkZWxldGUgcENvbnZlcnRlZDsKKyAgICAgIHBDb252ZXJ0ZWQgPSBOVUxMOwogICAgIH0KLSAgICBpZiAobV9QU0ZvbnRMaXN0LkdldFNpemUoKSA9PSAwIHx8IG1fUFNGb250TGlzdFttX1BTRm9udExpc3QuR2V0U2l6ZSgpIC0gMV0tPm1fbkdseXBocyA9PSAyNTYpIHsKLSAgICAgICAgQ1BTRm9udCogcFBTRm9udCA9IEZYX05FVyBDUFNGb250OwotICAgICAgICBpZiAoIXBQU0ZvbnQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwUFNGb250LT5tX25HbHlwaHMgPSAwOwotICAgICAgICBtX1BTRm9udExpc3QuQWRkKHBQU0ZvbnQpOwotICAgICAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICAgICAgICBidWYgPDwgRlhfQlNUUkMoIjggZGljdCBiZWdpbi9Gb250VHlwZSAzIGRlZi9Gb250TWF0cml4WzEgMCAwIDEgMCAwXWRlZlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIi9Gb250QkJveFswIDAgMCAwXWRlZi9FbmNvZGluZyAyNTYgYXJyYXkgZGVmIDAgMSAyNTV7RW5jb2RpbmcgZXhjaC8ubm90ZGVmIHB1dH1mb3JcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIvQ2hhclByb2NzIDEgZGljdCBkZWYgQ2hhclByb2NzIGJlZ2luLy5ub3RkZWYge30gZGVmIGVuZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIi9CdWlsZEdseXBoezEgMCAtMTAgLTEwIDEwIDEwIHNldGNhY2hlZGV2aWNlIGV4Y2gvQ2hhclByb2NzIGdldCBleGNoIDIgY29weSBrbm93biBub3R7cG9wLy5ub3RkZWZ9aWYgZ2V0IGV4ZWN9YmluZCBkZWZcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIvQnVpbGRDaGFyezEgaW5kZXgvRW5jb2RpbmcgZ2V0IGV4Y2ggZ2V0IDEgaW5kZXgvQnVpbGRHbHlwaCBnZXQgZXhlY31iaW5kIGRlZlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgImN1cnJlbnRkaWN0IGVuZFxuIik7Ci0gICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiL1giKSA8PCBtX1BTRm9udExpc3QuR2V0U2l6ZSgpIC0gMSA8PCBGWF9CU1RSQygiIGV4Y2ggZGVmaW5lZm9udCBwb3BcbiIpOwotICAgICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgICAgICBidWYuQ2xlYXIoKTsKKyAgICBidWYgPDwgRlhfQlNUUkMoIiA4WyIpOworICAgIGJ1ZiA8PCB3aWR0aCA8PCBGWF9CU1RSQygiIDAgMCAtIikgPDwgaGVpZ2h0IDw8IEZYX0JTVFJDKCIgMCAiKSA8PCBoZWlnaHQKKyAgICAgICAgPDwgRlhfQlNUUkMoIl0iKTsKKyAgICBidWYgPDwgRlhfQlNUUkMoImN1cnJlbnRmaWxlL0FTQ0lJODVEZWNvZGUgZmlsdGVyICIpOworICAgIGlmIChmaWx0ZXIpIHsKKyAgICAgIGJ1ZiA8PCBmaWx0ZXI7CiAgICAgfQotICAgIHBzX2ZvbnRudW0gPSBtX1BTRm9udExpc3QuR2V0U2l6ZSgpIC0gMTsKLSAgICBDUFNGb250KiBwUFNGb250ID0gbV9QU0ZvbnRMaXN0W3BzX2ZvbnRudW1dOwotICAgIHBzX2dseXBoaW5kZXggPSBwUFNGb250LT5tX25HbHlwaHM7Ci0gICAgcFBTRm9udC0+bV9HbHlwaHNbcHNfZ2x5cGhpbmRleF0ubV9HbHlwaEluZGV4ID0gY2hhcnBvcy5tX0dseXBoSW5kZXg7Ci0gICAgcFBTRm9udC0+bV9HbHlwaHNbcHNfZ2x5cGhpbmRleF0ubV9wRm9udCA9IHBGb250OwotICAgIHBQU0ZvbnQtPm1fR2x5cGhzW3BzX2dseXBoaW5kZXhdLm1fYkdseXBoQWRqdXN0ID0gY2hhcnBvcy5tX2JHbHlwaEFkanVzdDsKLSAgICBpZiAoY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkgewotICAgICAgICBwUFNGb250LT5tX0dseXBoc1twc19nbHlwaGluZGV4XS5tX0FkanVzdE1hdHJpeFswXSA9IGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF07Ci0gICAgICAgIHBQU0ZvbnQtPm1fR2x5cGhzW3BzX2dseXBoaW5kZXhdLm1fQWRqdXN0TWF0cml4WzFdID0gY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsxXTsKLSAgICAgICAgcFBTRm9udC0+bV9HbHlwaHNbcHNfZ2x5cGhpbmRleF0ubV9BZGp1c3RNYXRyaXhbMl0gPSBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdOwotICAgICAgICBwUFNGb250LT5tX0dseXBoc1twc19nbHlwaGluZGV4XS5tX0FkanVzdE1hdHJpeFszXSA9IGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM107Ci0gICAgfQotICAgIHBQU0ZvbnQtPm1fbkdseXBocyArKzsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICBpZiAoY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkKLSAgICAgICAgbWF0cml4LlNldChjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdLAotICAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10sIDAsIDApOwotICAgIG1hdHJpeC5Db25jYXQoMS4wZiwgMCwgMCwgMS4wZiwgMCwgMCk7Ci0gICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEgPSBwRmFjZUNhY2hlLT5Mb2FkR2x5cGhQYXRoKHBGb250LCBjaGFycG9zLm1fR2x5cGhJbmRleCwgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGgpOwotICAgIGlmIChwUGF0aERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9QYXRoRGF0YSBUcmFuc2Zvcm1lZFBhdGgoKnBQYXRoRGF0YSk7Ci0gICAgaWYgKGNoYXJwb3MubV9iR2x5cGhBZGp1c3QpIHsKLSAgICAgICAgVHJhbnNmb3JtZWRQYXRoLlRyYW5zZm9ybSgmbWF0cml4KTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBidWYgPDwgRlhfQlNUUkMoIi9YIikgPDwgcHNfZm9udG51bSA8PCBGWF9CU1RSQygiIEZmL0NoYXJQcm9jcyBnZXQgYmVnaW4vIikKLSAgICAgICAgPDwgcHNfZ2x5cGhpbmRleCA8PCBGWF9CU1RSQygieyIpOwotICAgIGJ1ZiA8PCBGWF9CU1RSQygibiAiKTsKLSAgICBmb3IgKGludCBwID0gMDsgcCA8IFRyYW5zZm9ybWVkUGF0aC5HZXRQb2ludENvdW50KCk7IHAgKyspIHsKLSAgICAgICAgRlhfRkxPQVQgeCA9IFRyYW5zZm9ybWVkUGF0aC5HZXRQb2ludFgocCksIHkgPSBUcmFuc2Zvcm1lZFBhdGguR2V0UG9pbnRZKHApOwotICAgICAgICBzd2l0Y2ggKFRyYW5zZm9ybWVkUGF0aC5HZXRGbGFnKHApICYgRlhQVF9UWVBFKSB7Ci0gICAgICAgICAgICBjYXNlIEZYUFRfTU9WRVRPOiB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCB4IDw8IEZYX0JTVFJDKCIgIikgPDwgeSA8PCBGWF9CU1RSQygiIG1cbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZYUFRfTElORVRPOiB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCB4IDw8IEZYX0JTVFJDKCIgIikgPDwgeSA8PCBGWF9CU1RSQygiIGxcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZYUFRfQkVaSUVSVE86IHsKLSAgICAgICAgICAgICAgICAgICAgYnVmIDw8IHggPDwgRlhfQlNUUkMoIiAiKSA8PCB5IDw8IEZYX0JTVFJDKCIgIikKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRyYW5zZm9ybWVkUGF0aC5HZXRQb2ludFgocCArIDEpIDw8IEZYX0JTVFJDKCIgIikKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRyYW5zZm9ybWVkUGF0aC5HZXRQb2ludFkocCArIDEpIDw8IEZYX0JTVFJDKCIgIikKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRyYW5zZm9ybWVkUGF0aC5HZXRQb2ludFgocCArIDIpIDw8IEZYX0JTVFJDKCIgIikKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRyYW5zZm9ybWVkUGF0aC5HZXRQb2ludFkocCArIDIpIDw8IEZYX0JTVFJDKCIgY1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIHAgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGJ1ZiA8PCBGWF9CU1RSQygiZiIpOwotICAgIGJ1ZiA8PCBGWF9CU1RSQygifWJpbmQgZGVmIGVuZFxuIik7Ci0gICAgYnVmIDw8IEZYX0JTVFJDKCIvWCIpIDw8IHBzX2ZvbnRudW0gPDwgRlhfQlNUUkMoIiBGZi9FbmNvZGluZyBnZXQgIikgPDwgcHNfZ2x5cGhpbmRleAotICAgICAgICA8PCBGWF9CU1RSQygiLyIpIDw8IHBzX2dseXBoaW5kZXggPDwgRlhfQlNUUkMoIiBwdXRcbiIpOworICAgIGJ1ZiA8PCBGWF9CU1RSQygiZmFsc2UgIikgPDwgQnBwOworICAgIGJ1ZiA8PCBGWF9CU1RSQygiIGNvbG9yaW1hZ2VcbiIpOwogICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgICAgV3JpdGVQU0JpbmFyeShvdXRwdXRfYnVmLCBvdXRwdXRfc2l6ZSk7CisgICAgRlhfRnJlZShvdXRwdXRfYnVmKTsKKyAgfQorICBPVVRQVVRfUFMoIlxuUVxuIik7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6RHJhd1RleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIFN0YXJ0UmVuZGVyaW5nKCk7Ci0gICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwotICAgIGlmIChhbHBoYSA8IDI1NSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICgocE9iamVjdDJEZXZpY2UtPmEgPT0gMCAmJiBwT2JqZWN0MkRldmljZS0+YiA9PSAwKSB8fCAocE9iamVjdDJEZXZpY2UtPmMgPT0gMCAmJiBwT2JqZWN0MkRldmljZS0+ZCA9PSAwKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgU2V0Q29sb3IoY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwordm9pZCBDRlhfUFNSZW5kZXJlcjo6U2V0Q29sb3IoRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8CisgICAgICAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKKyAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKKyAgfQorICBGWF9CT09MIGJDTVlLID0gRkFMU0U7CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIGNvbG9yID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYQ01ZS19UT0RJQihjb2xvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWEFSR0JfVE9ESUIoY29sb3IpOworICAgIHVpbnQ4X3QqIHBDb2xvciA9ICh1aW50OF90KikmY29sb3I7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgcENvbG9yLCBwQ29sb3IsIDEpOworICAgIGNvbG9yID0gbV9iQ215a091dHB1dCA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOworICAgIGJDTVlLID0gbV9iQ215a091dHB1dDsKKyAgfSBlbHNlIHsKKyAgICBiQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgIH0KKyAgaWYgKGJDTVlLICE9IG1fYkNteWtPdXRwdXQgfHwgIW1fYkNvbG9yU2V0IHx8IG1fTGFzdENvbG9yICE9IGNvbG9yKSB7CiAgICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBidWYgPDwgRlhfQlNUUkMoInFbIikgPDwgcE9iamVjdDJEZXZpY2UtPmEgPDwgRlhfQlNUUkMoIiAiKSA8PCBwT2JqZWN0MkRldmljZS0+YiA8PCBGWF9CU1RSQygiICIpCi0gICAgICAgIDw8IHBPYmplY3QyRGV2aWNlLT5jIDw8IEZYX0JTVFJDKCIgIikgPDwgcE9iamVjdDJEZXZpY2UtPmQ7Ci0gICAgYnVmIDw8IEZYX0JTVFJDKCIgIikgPDwgcE9iamVjdDJEZXZpY2UtPmUgPDwgRlhfQlNUUkMoIiAiKSA8PCBwT2JqZWN0MkRldmljZS0+ZiA8PCAiXWNtXG4iOwotICAgIGlmIChwQ2FjaGUgPT0gTlVMTCkgewotICAgICAgICBwQ2FjaGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKTsKLSAgICB9Ci0gICAgQ0ZYX0ZhY2VDYWNoZSogcEZhY2VDYWNoZSA9IHBDYWNoZS0+R2V0Q2FjaGVkRmFjZShwRm9udCk7Ci0gICAgRlhfRk9OVENBQ0hFX0RFRklORShwQ2FjaGUsIHBGb250KTsKLSAgICBpbnQgbGFzdF9mb250bnVtID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkgKyspIHsKLSAgICAgICAgaW50IHBzX2ZvbnRudW0sIHBzX2dseXBoaW5kZXg7Ci0gICAgICAgIEZpbmRQU0ZvbnRHbHlwaChwRmFjZUNhY2hlLCBwRm9udCwgcENoYXJQb3NbaV0sIHBzX2ZvbnRudW0sIHBzX2dseXBoaW5kZXgpOwotICAgICAgICBpZiAobGFzdF9mb250bnVtICE9IHBzX2ZvbnRudW0pIHsKLSAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiL1giKSA8PCBwc19mb250bnVtIDw8IEZYX0JTVFJDKCIgRmYgIikgPDwgZm9udF9zaXplCi0gICAgICAgICAgICAgICAgPDwgRlhfQlNUUkMoIiBGcyBTZiAiKTsKLSAgICAgICAgICAgIGxhc3RfZm9udG51bSA9IHBzX2ZvbnRudW07Ci0gICAgICAgIH0KLSAgICAgICAgYnVmIDw8IHBDaGFyUG9zW2ldLm1fT3JpZ2luWCA8PCBGWF9CU1RSQygiICIpCi0gICAgICAgICAgICA8PCBwQ2hhclBvc1tpXS5tX09yaWdpblkgPDwgRlhfQlNUUkMoIiBtIik7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGhleDsKLSAgICAgICAgaGV4LkZvcm1hdCgiPCUwMlg+IiwgcHNfZ2x5cGhpbmRleCk7Ci0gICAgICAgIGJ1ZiA8PCBoZXggPDwgRlhfQlNUUkMoIlRqXG4iKTsKLSAgICB9Ci0gICAgYnVmIDw8IEZYX0JTVFJDKCJRXG4iKTsKLSAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6V3JpdGVQU0JpbmFyeShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgbGVuKQotewotICAgIHVpbnQ4X3QqIGRlc3RfYnVmOwotICAgIEZYX0RXT1JEIGRlc3Rfc2l6ZTsKLSAgICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOwotICAgIGlmIChwRW5jb2RlcnMgJiYgcEVuY29kZXJzLT5HZXRCYXNpY01vZHVsZSgpLT5BODVFbmNvZGUoZGF0YSwgbGVuLCBkZXN0X2J1ZiwgZGVzdF9zaXplKSkgewotICAgICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICAgICAgRlhfRnJlZShkZXN0X2J1Zik7CisgICAgaWYgKGJDTVlLKSB7CisgICAgICBidWYgPDwgRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSAvIDI1NS4wIDw8IEZYX0JTVFJDKCIgIikKKyAgICAgICAgICA8PCBGWFNZU19HZXRNVmFsdWUoY29sb3IpIC8gMjU1LjAgPDwgRlhfQlNUUkMoIiAiKQorICAgICAgICAgIDw8IEZYU1lTX0dldFlWYWx1ZShjb2xvcikgLyAyNTUuMCA8PCBGWF9CU1RSQygiICIpCisgICAgICAgICAgPDwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSAvIDI1NS4wIDw8IEZYX0JTVFJDKCIga1xuIik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopZGF0YSwgbGVuKTsKKyAgICAgIGJ1ZiA8PCBGWEFSR0JfUihjb2xvcikgLyAyNTUuMCA8PCBGWF9CU1RSQygiICIpIDw8IEZYQVJHQl9HKGNvbG9yKSAvIDI1NS4wCisgICAgICAgICAgPDwgRlhfQlNUUkMoIiAiKSA8PCBGWEFSR0JfQihjb2xvcikgLyAyNTUuMCA8PCBGWF9CU1RSQygiIHJnXG4iKTsKICAgICB9CisgICAgaWYgKGJDTVlLID09IG1fYkNteWtPdXRwdXQpIHsKKyAgICAgIG1fYkNvbG9yU2V0ID0gVFJVRTsKKyAgICAgIG1fTGFzdENvbG9yID0gY29sb3I7CisgICAgfQorICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgIH0KK30KK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkZpbmRQU0ZvbnRHbHlwaChDRlhfRmFjZUNhY2hlKiBwRmFjZUNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyYgY2hhcnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHBzX2ZvbnRudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBwc19nbHlwaGluZGV4KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCltX1BTRm9udExpc3QuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDUFNGb250KiBwUFNGb250ID0gbV9QU0ZvbnRMaXN0W2ldOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgcFBTRm9udC0+bV9uR2x5cGhzOyBqKyspCisgICAgICBpZiAocFBTRm9udC0+bV9HbHlwaHNbal0ubV9wRm9udCA9PSBwRm9udCAmJgorICAgICAgICAgIHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fR2x5cGhJbmRleCA9PSBjaGFycG9zLm1fR2x5cGhJbmRleCkgeworICAgICAgICBpZiAoKCFwUFNGb250LT5tX0dseXBoc1tqXS5tX2JHbHlwaEFkanVzdCAmJiAhY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkgfHwKKyAgICAgICAgICAgIChwUFNGb250LT5tX0dseXBoc1tqXS5tX2JHbHlwaEFkanVzdCAmJiBjaGFycG9zLm1fYkdseXBoQWRqdXN0ICYmCisgICAgICAgICAgICAgKEZYU1lTX2ZhYnMocFBTRm9udC0+bV9HbHlwaHNbal0ubV9BZGp1c3RNYXRyaXhbMF0gLQorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0pIDwgMC4wMSAmJgorICAgICAgICAgICAgICBGWFNZU19mYWJzKHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fQWRqdXN0TWF0cml4WzFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdKSA8IDAuMDEgJiYKKyAgICAgICAgICAgICAgRlhTWVNfZmFicyhwUFNGb250LT5tX0dseXBoc1tqXS5tX0FkanVzdE1hdHJpeFsyXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXSkgPCAwLjAxICYmCisgICAgICAgICAgICAgIEZYU1lTX2ZhYnMocFBTRm9udC0+bV9HbHlwaHNbal0ubV9BZGp1c3RNYXRyaXhbM10gLQorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10pIDwgMC4wMSkpKSB7CisgICAgICAgICAgcHNfZm9udG51bSA9IGk7CisgICAgICAgICAgcHNfZ2x5cGhpbmRleCA9IGo7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgIH0KKyAgaWYgKG1fUFNGb250TGlzdC5HZXRTaXplKCkgPT0gMCB8fAorICAgICAgbV9QU0ZvbnRMaXN0W21fUFNGb250TGlzdC5HZXRTaXplKCkgLSAxXS0+bV9uR2x5cGhzID09IDI1NikgeworICAgIENQU0ZvbnQqIHBQU0ZvbnQgPSBGWF9ORVcgQ1BTRm9udDsKKyAgICBpZiAoIXBQU0ZvbnQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcFBTRm9udC0+bV9uR2x5cGhzID0gMDsKKyAgICBtX1BTRm9udExpc3QuQWRkKHBQU0ZvbnQpOworICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgICAgYnVmIDw8IEZYX0JTVFJDKAorICAgICAgICAiOCBkaWN0IGJlZ2luL0ZvbnRUeXBlIDMgZGVmL0ZvbnRNYXRyaXhbMSAwIDAgMSAwIDBdZGVmXG4iCisgICAgICAgICIvRm9udEJCb3hbMCAwIDAgMF1kZWYvRW5jb2RpbmcgMjU2IGFycmF5IGRlZiAwIDEgMjU1e0VuY29kaW5nICIKKyAgICAgICAgImV4Y2gvLm5vdGRlZiBwdXR9Zm9yXG4iCisgICAgICAgICIvQ2hhclByb2NzIDEgZGljdCBkZWYgQ2hhclByb2NzIGJlZ2luLy5ub3RkZWYge30gZGVmIGVuZFxuIgorICAgICAgICAiL0J1aWxkR2x5cGh7MSAwIC0xMCAtMTAgMTAgMTAgc2V0Y2FjaGVkZXZpY2UgZXhjaC9DaGFyUHJvY3MgZ2V0IGV4Y2ggIgorICAgICAgICAiMiBjb3B5IGtub3duIG5vdHtwb3AvLm5vdGRlZn1pZiBnZXQgZXhlY31iaW5kIGRlZlxuIgorICAgICAgICAiL0J1aWxkQ2hhcnsxIGluZGV4L0VuY29kaW5nIGdldCBleGNoIGdldCAxIGluZGV4L0J1aWxkR2x5cGggZ2V0ICIKKyAgICAgICAgImV4ZWN9YmluZCBkZWZcbiIKKyAgICAgICAgImN1cnJlbnRkaWN0IGVuZFxuIik7CisgICAgYnVmIDw8IEZYX0JTVFJDKCIvWCIpIDw8IG1fUFNGb250TGlzdC5HZXRTaXplKCkgLSAxCisgICAgICAgIDw8IEZYX0JTVFJDKCIgZXhjaCBkZWZpbmVmb250IHBvcFxuIik7CisgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKKyAgICBidWYuQ2xlYXIoKTsKKyAgfQorICBwc19mb250bnVtID0gbV9QU0ZvbnRMaXN0LkdldFNpemUoKSAtIDE7CisgIENQU0ZvbnQqIHBQU0ZvbnQgPSBtX1BTRm9udExpc3RbcHNfZm9udG51bV07CisgIHBzX2dseXBoaW5kZXggPSBwUFNGb250LT5tX25HbHlwaHM7CisgIHBQU0ZvbnQtPm1fR2x5cGhzW3BzX2dseXBoaW5kZXhdLm1fR2x5cGhJbmRleCA9IGNoYXJwb3MubV9HbHlwaEluZGV4OworICBwUFNGb250LT5tX0dseXBoc1twc19nbHlwaGluZGV4XS5tX3BGb250ID0gcEZvbnQ7CisgIHBQU0ZvbnQtPm1fR2x5cGhzW3BzX2dseXBoaW5kZXhdLm1fYkdseXBoQWRqdXN0ID0gY2hhcnBvcy5tX2JHbHlwaEFkanVzdDsKKyAgaWYgKGNoYXJwb3MubV9iR2x5cGhBZGp1c3QpIHsKKyAgICBwUFNGb250LT5tX0dseXBoc1twc19nbHlwaGluZGV4XS5tX0FkanVzdE1hdHJpeFswXSA9CisgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF07CisgICAgcFBTRm9udC0+bV9HbHlwaHNbcHNfZ2x5cGhpbmRleF0ubV9BZGp1c3RNYXRyaXhbMV0gPQorICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdOworICAgIHBQU0ZvbnQtPm1fR2x5cGhzW3BzX2dseXBoaW5kZXhdLm1fQWRqdXN0TWF0cml4WzJdID0KKyAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXTsKKyAgICBwUFNGb250LT5tX0dseXBoc1twc19nbHlwaGluZGV4XS5tX0FkanVzdE1hdHJpeFszXSA9CisgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM107CisgIH0KKyAgcFBTRm9udC0+bV9uR2x5cGhzKys7CisgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OworICBpZiAoY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkKKyAgICBtYXRyaXguU2V0KGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0sCisgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdLCAwLCAwKTsKKyAgbWF0cml4LkNvbmNhdCgxLjBmLCAwLCAwLCAxLjBmLCAwLCAwKTsKKyAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEgPSBwRmFjZUNhY2hlLT5Mb2FkR2x5cGhQYXRoKAorICAgICAgcEZvbnQsIGNoYXJwb3MubV9HbHlwaEluZGV4LCBjaGFycG9zLm1fRm9udENoYXJXaWR0aCk7CisgIGlmIChwUGF0aERhdGEgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfUGF0aERhdGEgVHJhbnNmb3JtZWRQYXRoKCpwUGF0aERhdGEpOworICBpZiAoY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkgeworICAgIFRyYW5zZm9ybWVkUGF0aC5UcmFuc2Zvcm0oJm1hdHJpeCk7CisgIH0KKyAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgYnVmIDw8IEZYX0JTVFJDKCIvWCIpIDw8IHBzX2ZvbnRudW0gPDwgRlhfQlNUUkMoIiBGZi9DaGFyUHJvY3MgZ2V0IGJlZ2luLyIpCisgICAgICA8PCBwc19nbHlwaGluZGV4IDw8IEZYX0JTVFJDKCJ7Iik7CisgIGJ1ZiA8PCBGWF9CU1RSQygibiAiKTsKKyAgZm9yIChpbnQgcCA9IDA7IHAgPCBUcmFuc2Zvcm1lZFBhdGguR2V0UG9pbnRDb3VudCgpOyBwKyspIHsKKyAgICBGWF9GTE9BVCB4ID0gVHJhbnNmb3JtZWRQYXRoLkdldFBvaW50WChwKSwgeSA9IFRyYW5zZm9ybWVkUGF0aC5HZXRQb2ludFkocCk7CisgICAgc3dpdGNoIChUcmFuc2Zvcm1lZFBhdGguR2V0RmxhZyhwKSAmIEZYUFRfVFlQRSkgeworICAgICAgY2FzZSBGWFBUX01PVkVUTzogeworICAgICAgICBidWYgPDwgeCA8PCBGWF9CU1RSQygiICIpIDw8IHkgPDwgRlhfQlNUUkMoIiBtXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEZYUFRfTElORVRPOiB7CisgICAgICAgIGJ1ZiA8PCB4IDw8IEZYX0JTVFJDKCIgIikgPDwgeSA8PCBGWF9CU1RSQygiIGxcbiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRlhQVF9CRVpJRVJUTzogeworICAgICAgICBidWYgPDwgeCA8PCBGWF9CU1RSQygiICIpIDw8IHkgPDwgRlhfQlNUUkMoIiAiKQorICAgICAgICAgICAgPDwgVHJhbnNmb3JtZWRQYXRoLkdldFBvaW50WChwICsgMSkgPDwgRlhfQlNUUkMoIiAiKQorICAgICAgICAgICAgPDwgVHJhbnNmb3JtZWRQYXRoLkdldFBvaW50WShwICsgMSkgPDwgRlhfQlNUUkMoIiAiKQorICAgICAgICAgICAgPDwgVHJhbnNmb3JtZWRQYXRoLkdldFBvaW50WChwICsgMikgPDwgRlhfQlNUUkMoIiAiKQorICAgICAgICAgICAgPDwgVHJhbnNmb3JtZWRQYXRoLkdldFBvaW50WShwICsgMikgPDwgRlhfQlNUUkMoIiBjXG4iKTsKKyAgICAgICAgcCArPSAyOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgYnVmIDw8IEZYX0JTVFJDKCJmIik7CisgIGJ1ZiA8PCBGWF9CU1RSQygifWJpbmQgZGVmIGVuZFxuIik7CisgIGJ1ZiA8PCBGWF9CU1RSQygiL1giKSA8PCBwc19mb250bnVtIDw8IEZYX0JTVFJDKCIgRmYvRW5jb2RpbmcgZ2V0ICIpCisgICAgICA8PCBwc19nbHlwaGluZGV4IDw8IEZYX0JTVFJDKCIvIikgPDwgcHNfZ2x5cGhpbmRleCA8PCBGWF9CU1RSQygiIHB1dFxuIik7CisgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7Cit9CitGWF9CT09MIENGWF9QU1JlbmRlcmVyOjpEcmF3VGV4dChpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBTdGFydFJlbmRlcmluZygpOworICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9BKGNvbG9yKTsKKyAgaWYgKGFscGhhIDwgMjU1KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICgocE9iamVjdDJEZXZpY2UtPmEgPT0gMCAmJiBwT2JqZWN0MkRldmljZS0+YiA9PSAwKSB8fAorICAgICAgKHBPYmplY3QyRGV2aWNlLT5jID09IDAgJiYgcE9iamVjdDJEZXZpY2UtPmQgPT0gMCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBTZXRDb2xvcihjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIGJ1ZiA8PCBGWF9CU1RSQygicVsiKSA8PCBwT2JqZWN0MkRldmljZS0+YSA8PCBGWF9CU1RSQygiICIpCisgICAgICA8PCBwT2JqZWN0MkRldmljZS0+YiA8PCBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5jCisgICAgICA8PCBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5kOworICBidWYgPDwgRlhfQlNUUkMoIiAiKSA8PCBwT2JqZWN0MkRldmljZS0+ZSA8PCBGWF9CU1RSQygiICIpCisgICAgICA8PCBwT2JqZWN0MkRldmljZS0+ZiA8PCAiXWNtXG4iOworICBpZiAocENhY2hlID09IE5VTEwpIHsKKyAgICBwQ2FjaGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKTsKKyAgfQorICBDRlhfRmFjZUNhY2hlKiBwRmFjZUNhY2hlID0gcENhY2hlLT5HZXRDYWNoZWRGYWNlKHBGb250KTsKKyAgRlhfRk9OVENBQ0hFX0RFRklORShwQ2FjaGUsIHBGb250KTsKKyAgaW50IGxhc3RfZm9udG51bSA9IC0xOworICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGFyczsgaSsrKSB7CisgICAgaW50IHBzX2ZvbnRudW0sIHBzX2dseXBoaW5kZXg7CisgICAgRmluZFBTRm9udEdseXBoKHBGYWNlQ2FjaGUsIHBGb250LCBwQ2hhclBvc1tpXSwgcHNfZm9udG51bSwgcHNfZ2x5cGhpbmRleCk7CisgICAgaWYgKGxhc3RfZm9udG51bSAhPSBwc19mb250bnVtKSB7CisgICAgICBidWYgPDwgRlhfQlNUUkMoIi9YIikgPDwgcHNfZm9udG51bSA8PCBGWF9CU1RSQygiIEZmICIpIDw8IGZvbnRfc2l6ZQorICAgICAgICAgIDw8IEZYX0JTVFJDKCIgRnMgU2YgIik7CisgICAgICBsYXN0X2ZvbnRudW0gPSBwc19mb250bnVtOworICAgIH0KKyAgICBidWYgPDwgcENoYXJQb3NbaV0ubV9PcmlnaW5YIDw8IEZYX0JTVFJDKCIgIikgPDwgcENoYXJQb3NbaV0ubV9PcmlnaW5ZCisgICAgICAgIDw8IEZYX0JTVFJDKCIgbSIpOworICAgIENGWF9CeXRlU3RyaW5nIGhleDsKKyAgICBoZXguRm9ybWF0KCI8JTAyWD4iLCBwc19nbHlwaGluZGV4KTsKKyAgICBidWYgPDwgaGV4IDw8IEZYX0JTVFJDKCJUalxuIik7CisgIH0KKyAgYnVmIDw8IEZYX0JTVFJDKCJRXG4iKTsKKyAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENGWF9QU1JlbmRlcmVyOjpXcml0ZVBTQmluYXJ5KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCBsZW4pIHsKKyAgdWludDhfdCogZGVzdF9idWY7CisgIEZYX0RXT1JEIGRlc3Rfc2l6ZTsKKyAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKTsKKyAgaWYgKHBFbmNvZGVycyAmJgorICAgICAgcEVuY29kZXJzLT5HZXRCYXNpY01vZHVsZSgpLT5BODVFbmNvZGUoZGF0YSwgbGVuLCBkZXN0X2J1ZiwgZGVzdF9zaXplKSkgeworICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWRlc3RfYnVmLCBkZXN0X3NpemUpOworICAgIEZYX0ZyZWUoZGVzdF9idWYpOworICB9IGVsc2UgeworICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWRhdGEsIGxlbik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfdGV4dC5jcHAgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3RleHQuY3BwCmluZGV4IGVlM2Q4NjEuLjU1MzVlYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfdGV4dC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV90ZXh0LmNwcApAQCAtMTAsMTY4MCArMTAsMTk0NCBAQAogI2luY2x1ZGUgInRleHRfaW50LmgiCiAjdW5kZWYgRlhfR0FNTUEKICN1bmRlZiBGWF9HQU1NQV9JTlZFUlNFCi0jZGVmaW5lIEZYX0dBTU1BKHZhbHVlKQkJCSh2YWx1ZSkKLSNkZWZpbmUgRlhfR0FNTUFfSU5WRVJTRSh2YWx1ZSkJKHZhbHVlKQotRlhfUkVDVCBGWEdFX0dldEdseXBoc0JCb3goRlhURVhUX0dMWVBIUE9TKiBwR2x5cGhBbmRQb3MsIGludCBuQ2hhcnMsIGludCBhbnRpX2FsaWFzLCBGWF9GTE9BVCByZXRpbmFTY2FsZVgsIEZYX0ZMT0FUIHJldGluYVNjYWxlWSkKLXsKLSAgICBGWF9SRUNUIHJlY3QoMCwgMCwgMCwgMCk7Ci0gICAgRlhfQk9PTCBiU3RhcnRlZCA9IEZBTFNFOwotICAgIGZvciAoaW50IGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7IGlDaGFyICsrKSB7Ci0gICAgICAgIEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggPSBwR2x5cGhBbmRQb3NbaUNoYXJdOwotICAgICAgICBjb25zdCBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaCA9IGdseXBoLm1fcEdseXBoOwotICAgICAgICBpZiAocEdseXBoID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBjaGFyX2xlZnQgPSBnbHlwaC5tX09yaWdpblggKyBwR2x5cGgtPm1fTGVmdDsKLSAgICAgICAgaW50IGNoYXJfd2lkdGggPSAoaW50KShwR2x5cGgtPm1fQml0bWFwLkdldFdpZHRoKCkgLyByZXRpbmFTY2FsZVgpOwotICAgICAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX0xDRCkgewotICAgICAgICAgICAgY2hhcl93aWR0aCAvPSAzOwotICAgICAgICB9Ci0gICAgICAgIGludCBjaGFyX3JpZ2h0ID0gY2hhcl9sZWZ0ICsgY2hhcl93aWR0aDsKLSAgICAgICAgaW50IGNoYXJfdG9wID0gZ2x5cGgubV9PcmlnaW5ZIC0gcEdseXBoLT5tX1RvcDsKLSAgICAgICAgaW50IGNoYXJfYm90dG9tID0gY2hhcl90b3AgKyAoaW50KShwR2x5cGgtPm1fQml0bWFwLkdldEhlaWdodCgpIC8gcmV0aW5hU2NhbGVZKTsKLSAgICAgICAgaWYgKCFiU3RhcnRlZCkgewotICAgICAgICAgICAgcmVjdC5sZWZ0ID0gY2hhcl9sZWZ0OwotICAgICAgICAgICAgcmVjdC5yaWdodCA9IGNoYXJfcmlnaHQ7Ci0gICAgICAgICAgICByZWN0LnRvcCA9IGNoYXJfdG9wOwotICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBjaGFyX2JvdHRvbTsKLSAgICAgICAgICAgIGJTdGFydGVkID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgPiBjaGFyX2xlZnQpIHsKLSAgICAgICAgICAgICAgICByZWN0LmxlZnQgPSBjaGFyX2xlZnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVjdC5yaWdodCA8IGNoYXJfcmlnaHQpIHsKLSAgICAgICAgICAgICAgICByZWN0LnJpZ2h0ID0gY2hhcl9yaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWN0LnRvcCA+IGNoYXJfdG9wKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC50b3AgPSBjaGFyX3RvcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWN0LmJvdHRvbSA8IGNoYXJfYm90dG9tKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBjaGFyX2JvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorI2RlZmluZSBGWF9HQU1NQSh2YWx1ZSkgKHZhbHVlKQorI2RlZmluZSBGWF9HQU1NQV9JTlZFUlNFKHZhbHVlKSAodmFsdWUpCitGWF9SRUNUIEZYR0VfR2V0R2x5cGhzQkJveChGWFRFWFRfR0xZUEhQT1MqIHBHbHlwaEFuZFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWSkgeworICBGWF9SRUNUIHJlY3QoMCwgMCwgMCwgMCk7CisgIEZYX0JPT0wgYlN0YXJ0ZWQgPSBGQUxTRTsKKyAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIrKykgeworICAgIEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggPSBwR2x5cGhBbmRQb3NbaUNoYXJdOworICAgIGNvbnN0IENGWF9HbHlwaEJpdG1hcCogcEdseXBoID0gZ2x5cGgubV9wR2x5cGg7CisgICAgaWYgKHBHbHlwaCA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgcmV0dXJuIHJlY3Q7CisgICAgaW50IGNoYXJfbGVmdCA9IGdseXBoLm1fT3JpZ2luWCArIHBHbHlwaC0+bV9MZWZ0OworICAgIGludCBjaGFyX3dpZHRoID0gKGludCkocEdseXBoLT5tX0JpdG1hcC5HZXRXaWR0aCgpIC8gcmV0aW5hU2NhbGVYKTsKKyAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX0xDRCkgeworICAgICAgY2hhcl93aWR0aCAvPSAzOworICAgIH0KKyAgICBpbnQgY2hhcl9yaWdodCA9IGNoYXJfbGVmdCArIGNoYXJfd2lkdGg7CisgICAgaW50IGNoYXJfdG9wID0gZ2x5cGgubV9PcmlnaW5ZIC0gcEdseXBoLT5tX1RvcDsKKyAgICBpbnQgY2hhcl9ib3R0b20gPQorICAgICAgICBjaGFyX3RvcCArIChpbnQpKHBHbHlwaC0+bV9CaXRtYXAuR2V0SGVpZ2h0KCkgLyByZXRpbmFTY2FsZVkpOworICAgIGlmICghYlN0YXJ0ZWQpIHsKKyAgICAgIHJlY3QubGVmdCA9IGNoYXJfbGVmdDsKKyAgICAgIHJlY3QucmlnaHQgPSBjaGFyX3JpZ2h0OworICAgICAgcmVjdC50b3AgPSBjaGFyX3RvcDsKKyAgICAgIHJlY3QuYm90dG9tID0gY2hhcl9ib3R0b207CisgICAgICBiU3RhcnRlZCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyZWN0LmxlZnQgPiBjaGFyX2xlZnQpIHsKKyAgICAgICAgcmVjdC5sZWZ0ID0gY2hhcl9sZWZ0OworICAgICAgfQorICAgICAgaWYgKHJlY3QucmlnaHQgPCBjaGFyX3JpZ2h0KSB7CisgICAgICAgIHJlY3QucmlnaHQgPSBjaGFyX3JpZ2h0OworICAgICAgfQorICAgICAgaWYgKHJlY3QudG9wID4gY2hhcl90b3ApIHsKKyAgICAgICAgcmVjdC50b3AgPSBjaGFyX3RvcDsKKyAgICAgIH0KKyAgICAgIGlmIChyZWN0LmJvdHRvbSA8IGNoYXJfYm90dG9tKSB7CisgICAgICAgIHJlY3QuYm90dG9tID0gY2hhcl9ib3R0b207CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZWN0OwogfQotc3RhdGljIHZvaWQgX0FkanVzdEdseXBoU3BhY2UoRlhURVhUX0dMWVBIUE9TKiBwR2x5cGhBbmRQb3MsIGludCBuQ2hhcnMpCi17Ci0gICAgQVNTRVJUKG5DaGFycyA+IDEpOwotICAgIEZYX0JPT0wgYlZlcnRpY2FsID0gRkFMU0U7Ci0gICAgaWYgKHBHbHlwaEFuZFBvc1tuQ2hhcnMgLSAxXS5tX09yaWdpblggPT0gcEdseXBoQW5kUG9zWzBdLm1fT3JpZ2luWCkgewotICAgICAgICBiVmVydGljYWwgPSBUUlVFOwotICAgIH0gZWxzZSBpZiAocEdseXBoQW5kUG9zW25DaGFycyAtIDFdLm1fT3JpZ2luWSAhPSBwR2x5cGhBbmRQb3NbMF0ubV9PcmlnaW5ZKSB7Ci0gICAgICAgIHJldHVybjsKK3N0YXRpYyB2b2lkIF9BZGp1c3RHbHlwaFNwYWNlKEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zLCBpbnQgbkNoYXJzKSB7CisgIEFTU0VSVChuQ2hhcnMgPiAxKTsKKyAgRlhfQk9PTCBiVmVydGljYWwgPSBGQUxTRTsKKyAgaWYgKHBHbHlwaEFuZFBvc1tuQ2hhcnMgLSAxXS5tX09yaWdpblggPT0gcEdseXBoQW5kUG9zWzBdLm1fT3JpZ2luWCkgeworICAgIGJWZXJ0aWNhbCA9IFRSVUU7CisgIH0gZWxzZSBpZiAocEdseXBoQW5kUG9zW25DaGFycyAtIDFdLm1fT3JpZ2luWSAhPSBwR2x5cGhBbmRQb3NbMF0ubV9PcmlnaW5ZKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBpID0gbkNoYXJzIC0gMTsKKyAgaW50KiBuZXh0X29yaWdpbiA9CisgICAgICBiVmVydGljYWwgPyAmcEdseXBoQW5kUG9zW2ldLm1fT3JpZ2luWSA6ICZwR2x5cGhBbmRQb3NbaV0ubV9PcmlnaW5YOworICBGWF9GTE9BVCBuZXh0X29yaWdpbl9mID0KKyAgICAgIGJWZXJ0aWNhbCA/IHBHbHlwaEFuZFBvc1tpXS5tX2ZPcmlnaW5ZIDogcEdseXBoQW5kUG9zW2ldLm1fZk9yaWdpblg7CisgIGZvciAoaS0tOyBpID4gMDsgaS0tKSB7CisgICAgaW50KiB0aGlzX29yaWdpbiA9CisgICAgICAgIGJWZXJ0aWNhbCA/ICZwR2x5cGhBbmRQb3NbaV0ubV9PcmlnaW5ZIDogJnBHbHlwaEFuZFBvc1tpXS5tX09yaWdpblg7CisgICAgRlhfRkxPQVQgdGhpc19vcmlnaW5fZiA9CisgICAgICAgIGJWZXJ0aWNhbCA/IHBHbHlwaEFuZFBvc1tpXS5tX2ZPcmlnaW5ZIDogcEdseXBoQW5kUG9zW2ldLm1fZk9yaWdpblg7CisgICAgaW50IHNwYWNlID0gKCpuZXh0X29yaWdpbikgLSAoKnRoaXNfb3JpZ2luKTsKKyAgICBGWF9GTE9BVCBzcGFjZV9mID0gbmV4dF9vcmlnaW5fZiAtIHRoaXNfb3JpZ2luX2Y7CisgICAgRlhfRkxPQVQgZXJyb3IgPQorICAgICAgICAoRlhfRkxPQVQpKEZYU1lTX2ZhYnMoc3BhY2VfZikgLSBGWFNZU19mYWJzKChGWF9GTE9BVCkoc3BhY2UpKSk7CisgICAgaWYgKGVycm9yID4gMC41ZikgeworICAgICAgKnRoaXNfb3JpZ2luICs9IHNwYWNlID4gMCA/IC0xIDogMTsKICAgICB9Ci0gICAgaW50IGkgPSBuQ2hhcnMgLSAxOwotICAgIGludCogbmV4dF9vcmlnaW4gPSBiVmVydGljYWwgPyAmcEdseXBoQW5kUG9zW2ldLm1fT3JpZ2luWSA6ICZwR2x5cGhBbmRQb3NbaV0ubV9PcmlnaW5YOwotICAgIEZYX0ZMT0FUIG5leHRfb3JpZ2luX2YgPSBiVmVydGljYWwgPyBwR2x5cGhBbmRQb3NbaV0ubV9mT3JpZ2luWSA6IHBHbHlwaEFuZFBvc1tpXS5tX2ZPcmlnaW5YOwotICAgIGZvciAoaSAtLTsgaSA+IDA7IGkgLS0pIHsKLSAgICAgICAgaW50KiB0aGlzX29yaWdpbiA9IGJWZXJ0aWNhbCA/ICZwR2x5cGhBbmRQb3NbaV0ubV9PcmlnaW5ZIDogJnBHbHlwaEFuZFBvc1tpXS5tX09yaWdpblg7Ci0gICAgICAgIEZYX0ZMT0FUIHRoaXNfb3JpZ2luX2YgPSBiVmVydGljYWwgPyBwR2x5cGhBbmRQb3NbaV0ubV9mT3JpZ2luWSA6IHBHbHlwaEFuZFBvc1tpXS5tX2ZPcmlnaW5YOwotICAgICAgICBpbnQgc3BhY2UgPSAoKm5leHRfb3JpZ2luKSAtICgqdGhpc19vcmlnaW4pOwotICAgICAgICBGWF9GTE9BVCBzcGFjZV9mID0gbmV4dF9vcmlnaW5fZiAtIHRoaXNfb3JpZ2luX2Y7Ci0gICAgICAgIEZYX0ZMT0FUIGVycm9yID0gKEZYX0ZMT0FUKShGWFNZU19mYWJzKHNwYWNlX2YpIC0gRlhTWVNfZmFicygoRlhfRkxPQVQpKHNwYWNlKSkpOwotICAgICAgICBpZiAoZXJyb3IgPiAwLjVmKSB7Ci0gICAgICAgICAgICAqdGhpc19vcmlnaW4gKz0gc3BhY2UgPiAwID8gLTEgOiAxOwotICAgICAgICB9Ci0gICAgICAgIG5leHRfb3JpZ2luID0gdGhpc19vcmlnaW47Ci0gICAgICAgIG5leHRfb3JpZ2luX2YgPSB0aGlzX29yaWdpbl9mOwotICAgIH0KKyAgICBuZXh0X29yaWdpbiA9IHRoaXNfb3JpZ2luOworICAgIG5leHRfb3JpZ2luX2YgPSB0aGlzX29yaWdpbl9mOworICB9CiB9CiBzdGF0aWMgY29uc3QgdWludDhfdCBnX1RleHRHYW1tYUFkanVzdFsyNTZdID0gewotICAgIDAsIDIsIDMsIDQsIDYsIDcsIDgsIDEwLCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE3LCAxOCwgMTksCi0gICAgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzgsCi0gICAgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MSwgNTIsIDUzLCA1NCwgNTUsCi0gICAgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MSwgNzIsCi0gICAgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsCi0gICAgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwKLSAgICAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsCi0gICAgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LAotICAgIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLCAxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwKLSAgICAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU2LCAxNTcsIDE1OCwgMTU5LCAxNjAsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsCi0gICAgMTY3LCAxNjgsIDE2OSwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzQsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLAotICAgIDE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5LCAxOTAsIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwKLSAgICAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA0LCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsCi0gICAgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LAotICAgIDIyNywgMjI4LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyMzksIDI0MCwKLSAgICAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsCisgICAgMCwgICAyLCAgIDMsICAgNCwgICA2LCAgIDcsICAgOCwgICAxMCwgIDExLCAgMTIsICAxMywgIDE1LCAgMTYsICAxNywgIDE4LAorICAgIDE5LCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOSwgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwKKyAgICAzNiwgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUxLCAgNTIsCisgICAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywgIDY0LCAgNjUsICA2NiwgIDY3LAorICAgIDY4LCAgNjksICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksICA4MCwgIDgxLCAgODIsICA4MywKKyAgICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsICA5NiwgIDk3LCAgOTgsCisgICAgOTksICAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywKKyAgICAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LAorICAgIDEyOSwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsCisgICAgMTQzLCAxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NiwKKyAgICAxNTcsIDE1OCwgMTU5LCAxNjAsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLAorICAgIDE3MiwgMTczLCAxNzQsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsCisgICAgMTg2LCAxODcsIDE4OCwgMTg5LCAxOTAsIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwKKyAgICAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA0LCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLAorICAgIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsCisgICAgMjI4LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyMzksIDI0MCwKKyAgICAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LAorICAgIDI1NSwKIH07CiAjZGVmaW5lIEFESlVTVF9BTFBIQShiYWNrZ3JvdW5kLCBmb3JlZ3JvdW5kLCBzcmNfYWxwaGEsIHRleHRfZmxhZ3MsIGEpIFwKLSAgICBzcmNfYWxwaGEgPSBnX1RleHRHYW1tYUFkanVzdFsodWludDhfdClzcmNfYWxwaGFdOwotdm9pZCBfQ29sb3IyQXJnYihGWF9BUkdCJiBhcmdiLCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCAmJiAhRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSkgewotICAgICAgICBhcmdiID0gY29sb3I7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8ICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewotICAgICAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKLSAgICB9Ci0gICAgdWludDhfdCBiZ3JhWzRdOwotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgY29sb3IgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGJncmEsIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOwotICAgICAgICBiZ3JhWzNdID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/Ci0gICAgICAgICAgICAgICAgICAoYWxwaGFfZmxhZyA+PiAyNCkgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykgOgotICAgICAgICAgICAgICAgICAgRlhBUkdCX0EoY29sb3IpOwotICAgICAgICBhcmdiID0gRlhBUkdCX01BS0UoYmdyYVszXSwgYmdyYVsyXSwgYmdyYVsxXSwgYmdyYVswXSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShjb2xvciksIEZYU1lTX0dldEtWYWx1ZShjb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgIGJncmFbMl0sIGJncmFbMV0sIGJncmFbMF0pOwotICAgIGJncmFbM10gPSAoYWxwaGFfZmxhZyA+PiAyNCkgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZyk7CisgIHNyY19hbHBoYSA9IGdfVGV4dEdhbW1hQWRqdXN0Wyh1aW50OF90KXNyY19hbHBoYV07Cit2b2lkIF9Db2xvcjJBcmdiKEZYX0FSR0ImIGFyZ2IsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAocEljY1RyYW5zZm9ybSA9PSBOVUxMICYmICFGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpKSB7CisgICAgYXJnYiA9IGNvbG9yOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkgfHwKKyAgICAgICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgeworICAgIHBJY2NUcmFuc2Zvcm0gPSBOVUxMOworICB9CisgIHVpbnQ4X3QgYmdyYVs0XTsKKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgY29sb3IgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhDTVlLX1RPRElCKGNvbG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9UT0RJQihjb2xvcik7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgYmdyYSwgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBiZ3JhWzNdID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgPyAoYWxwaGFfZmxhZyA+PiAyNCkgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9BKGNvbG9yKTsKICAgICBhcmdiID0gRlhBUkdCX01BS0UoYmdyYVszXSwgYmdyYVsyXSwgYmdyYVsxXSwgYmdyYVswXSk7CisgICAgcmV0dXJuOworICB9CisgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY29sb3IpLCBGWFNZU19HZXRNVmFsdWUoY29sb3IpLAorICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSwgYmdyYVsyXSwKKyAgICAgICAgICAgICAgICAgICAgIGJncmFbMV0sIGJncmFbMF0pOworICBiZ3JhWzNdID0gKGFscGhhX2ZsYWcgPj4gMjQpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZyk7CisgIGFyZ2IgPSBGWEFSR0JfTUFLRShiZ3JhWzNdLCBiZ3JhWzJdLCBiZ3JhWzFdLCBiZ3JhWzBdKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd05vcm1hbFRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICBDRlhfRm9udCogcEZvbnQsIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKLSAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCi0gICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsIEZYX0RXT1JEIHRleHRfZmxhZ3MsCi0gICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGludCBuYXRpdmV0ZXh0X2ZsYWdzID0gdGV4dF9mbGFnczsKLSAgICBpZiAobV9EZXZpY2VDbGFzcyAhPSBGWERDX0RJU1BMQVkpIHsKLSAgICAgICAgaWYgKCEodGV4dF9mbGFncyAmIEZYVEVYVF9QUklOVEdSQVBISUNURVhUKSkgewotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICAgICAgaWYgKCEodGV4dF9mbGFncyAmIEZYRk9OVF9DSURGT05UKSAmJiBwRm9udC0+R2V0UHNOYW1lKCkuRmluZChDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKCIrWkpITCIpKSA9PSAtMSkKLSAgICAgICAgICAgICAgICBpZiAocEZvbnQtPkdldFBzTmFtZSgpICE9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkNOQUFKSStjbWV4MTAiKSkKK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd05vcm1hbFRleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRleHRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGludCBuYXRpdmV0ZXh0X2ZsYWdzID0gdGV4dF9mbGFnczsKKyAgaWYgKG1fRGV2aWNlQ2xhc3MgIT0gRlhEQ19ESVNQTEFZKSB7CisgICAgaWYgKCEodGV4dF9mbGFncyAmIEZYVEVYVF9QUklOVEdSQVBISUNURVhUKSkgeworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICBpZiAoISh0ZXh0X2ZsYWdzICYgRlhGT05UX0NJREZPTlQpICYmCisgICAgICAgICAgcEZvbnQtPkdldFBzTmFtZSgpLkZpbmQoQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbCgiK1pKSEwiKSkgPT0gLTEpCisgICAgICAgIGlmIChwRm9udC0+R2V0UHNOYW1lKCkgIT0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbCgiQ05BQUpJK2NtZXgxMCIpKQogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkRyYXdEZXZpY2VUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIHBUZXh0MkRldmljZSwgZm9udF9zaXplLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShmaWxsX2NvbG9yKTsKLSAgICAgICAgaWYgKGFscGhhIDwgMjU1KSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCEodGV4dF9mbGFncyAmIEZYVEVYVF9OT19OQVRJVkVURVhUKSkgewotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICBpZiAoISh0ZXh0X2ZsYWdzICYgRlhGT05UX0NJREZPTlQpKQotICAgICAgICAgICAgaWYgKHBGb250LT5HZXRQc05hbWUoKSAhPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKCJDTkFBSkkrY21leDEwIikpCisgICAgICAgICAgaWYgKG1fcERldmljZURyaXZlci0+RHJhd0RldmljZVRleHQoCisgICAgICAgICAgICAgICAgICBuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBwVGV4dDJEZXZpY2UsIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICB9CisgICAgfQorICAgIGludCBhbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9BKGZpbGxfY29sb3IpOworICAgIGlmIChhbHBoYSA8IDI1NSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIGlmICghKHRleHRfZmxhZ3MgJiBGWFRFWFRfTk9fTkFUSVZFVEVYVCkpIHsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgIGlmICghKHRleHRfZmxhZ3MgJiBGWEZPTlRfQ0lERk9OVCkpCisgICAgICBpZiAocEZvbnQtPkdldFBzTmFtZSgpICE9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkNOQUFKSStjbWV4MTAiKSkKICNlbmRpZgotICAgICAgICAgICAgICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkRyYXdEZXZpY2VUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIHBUZXh0MkRldmljZSwgZm9udF9zaXplLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggY2hhcjJkZXZpY2UsIGRldmljZUN0bSwgdGV4dDJEZXZpY2U7Ci0gICAgaWYgKHBUZXh0MkRldmljZSkgewotICAgICAgICBjaGFyMmRldmljZSA9ICpwVGV4dDJEZXZpY2U7Ci0gICAgICAgIHRleHQyRGV2aWNlID0gKnBUZXh0MkRldmljZTsKLSAgICB9Ci0gICAgY2hhcjJkZXZpY2UuU2NhbGUoZm9udF9zaXplLCAtZm9udF9zaXplKTsKLSAgICBpZiAoRlhTWVNfZmFicyhjaGFyMmRldmljZS5hKSArIEZYU1lTX2ZhYnMoY2hhcjJkZXZpY2UuYikgPiA1MCAqIDEuMGYgfHwKLSAgICAgICAgICAgICgobV9EZXZpY2VDbGFzcyA9PSBGWERDX1BSSU5URVIgJiYgIW1fcERldmljZURyaXZlci0+SXNQU1ByaW50RHJpdmVyKCkpCi0gICAgICAgICAgICAgJiYgISh0ZXh0X2ZsYWdzICYgRlhURVhUX1BSSU5USU1BR0VURVhUKSkpIHsKLSAgICAgICAgaWYgKHBGb250LT5HZXRGYWNlKCkgIT0gTlVMTCB8fCAocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfR0xZUEhQQVRIKSkgewotICAgICAgICAgICAgaW50IG5QYXRoRmxhZ3MgPSAodGV4dF9mbGFncyAmIEZYVEVYVF9OT1NNT09USCkgPT0gMCA/IDAgOiBGWEZJTExfTk9QQVRIU01PT1RIOwotICAgICAgICAgICAgcmV0dXJuIERyYXdUZXh0UGF0aChuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBmb250X3NpemUsIHBUZXh0MkRldmljZSwgTlVMTCwgTlVMTCwgZmlsbF9jb2xvciwgMCwgTlVMTCwgblBhdGhGbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkRyYXdEZXZpY2VUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZXh0MkRldmljZSwgZm9udF9zaXplLCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CisgIH0KKyAgQ0ZYX0FmZmluZU1hdHJpeCBjaGFyMmRldmljZSwgZGV2aWNlQ3RtLCB0ZXh0MkRldmljZTsKKyAgaWYgKHBUZXh0MkRldmljZSkgeworICAgIGNoYXIyZGV2aWNlID0gKnBUZXh0MkRldmljZTsKKyAgICB0ZXh0MkRldmljZSA9ICpwVGV4dDJEZXZpY2U7CisgIH0KKyAgY2hhcjJkZXZpY2UuU2NhbGUoZm9udF9zaXplLCAtZm9udF9zaXplKTsKKyAgaWYgKEZYU1lTX2ZhYnMoY2hhcjJkZXZpY2UuYSkgKyBGWFNZU19mYWJzKGNoYXIyZGV2aWNlLmIpID4gNTAgKiAxLjBmIHx8CisgICAgICAoKG1fRGV2aWNlQ2xhc3MgPT0gRlhEQ19QUklOVEVSICYmICFtX3BEZXZpY2VEcml2ZXItPklzUFNQcmludERyaXZlcigpKSAmJgorICAgICAgICEodGV4dF9mbGFncyAmIEZYVEVYVF9QUklOVElNQUdFVEVYVCkpKSB7CisgICAgaWYgKHBGb250LT5HZXRGYWNlKCkgIT0gTlVMTCB8fAorICAgICAgICAocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfR0xZUEhQQVRIKSkgeworICAgICAgaW50IG5QYXRoRmxhZ3MgPQorICAgICAgICAgICh0ZXh0X2ZsYWdzICYgRlhURVhUX05PU01PT1RIKSA9PSAwID8gMCA6IEZYRklMTF9OT1BBVEhTTU9PVEg7CisgICAgICByZXR1cm4gRHJhd1RleHRQYXRoKG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFRleHQyRGV2aWNlLCBOVUxMLCBOVUxMLCBmaWxsX2NvbG9yLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF0aEZsYWdzLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKICAgICB9Ci0gICAgaW50IGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX01PTk87Ci0gICAgRlhfQk9PTCBiTm9ybWFsID0gRkFMU0U7Ci0gICAgaWYgKCh0ZXh0X2ZsYWdzICYgRlhURVhUX05PU01PT1RIKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX0RldmljZUNsYXNzID09IEZYRENfRElTUExBWSAmJiBtX2JwcCA+IDEpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkNsZWFyVHlwZTsKLSAgICAgICAgICAgIGlmIChwRm9udC0+R2V0RmFjZSgpID09IE5VTEwgJiYgIShwRm9udC0+R2V0U3Vic3RGb250KCktPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9DTEVBUlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgYkNsZWFyVHlwZSA9IEZBTFNFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiQ2xlYXJUeXBlID0gdGV4dF9mbGFncyAmIEZYVEVYVF9DTEVBUlRZUEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1fUmVuZGVyQ2FwcyAmIChGWFJDX0FMUEhBX09VVFBVVCB8IEZYUkNfQ01ZS19PVVRQVVQpKSkgewotICAgICAgICAgICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX0xDRDsKLSAgICAgICAgICAgICAgICBiTm9ybWFsID0gVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9icHAgPCAxNikgewotICAgICAgICAgICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJDbGVhclR5cGUgPT0gRkFMU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTENEOwotICAgICAgICAgICAgICAgICAgICBiTm9ybWFsID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9MQ0Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwQ2FjaGUgPT0gTlVMTCkgewotICAgICAgICBwQ2FjaGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKTsKLSAgICB9Ci0gICAgQ0ZYX0ZhY2VDYWNoZSogcEZhY2VDYWNoZSA9IHBDYWNoZS0+R2V0Q2FjaGVkRmFjZShwRm9udCk7Ci0gICAgRlhfRk9OVENBQ0hFX0RFRklORShwQ2FjaGUsIHBGb250KTsKLSAgICBGWFRFWFRfR0xZUEhQT1MqIHBHbHlwaEFuZFBvcyA9IEZYX0FsbG9jKEZYVEVYVF9HTFlQSFBPUywgbkNoYXJzKTsKLSAgICBpbnQgaUNoYXI7Ci0gICAgZGV2aWNlQ3RtID0gY2hhcjJkZXZpY2U7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXhDVE0gPSBHZXRDVE0oKTsKLSAgICBGWF9GTE9BVCBzY2FsZV94ID0gRlhTWVNfZmFicyhtYXRyaXhDVE0uYSk7Ci0gICAgRlhfRkxPQVQgc2NhbGVfeSA9IEZYU1lTX2ZhYnMobWF0cml4Q1RNLmQpOwotICAgIGRldmljZUN0bS5Db25jYXQoc2NhbGVfeCwgMCwgMCwgc2NhbGVfeSwgMCwgMCk7Ci0gICAgdGV4dDJEZXZpY2UuQ29uY2F0KHNjYWxlX3gsIDAsIDAsIHNjYWxlX3ksIDAsIDApOwotICAgIGZvciAoaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIgKyspIHsKLSAgICAgICAgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA9IHBHbHlwaEFuZFBvc1tpQ2hhcl07Ci0gICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gcENoYXJQb3NbaUNoYXJdOwotICAgICAgICBnbHlwaC5tX2ZPcmlnaW5YID0gY2hhcnBvcy5tX09yaWdpblg7Ci0gICAgICAgIGdseXBoLm1fZk9yaWdpblkgPSBjaGFycG9zLm1fT3JpZ2luWTsKLSAgICAgICAgdGV4dDJEZXZpY2UuVHJhbnNmb3JtKGdseXBoLm1fZk9yaWdpblgsIGdseXBoLm1fZk9yaWdpblkpOwotICAgICAgICBpZiAoYW50aV9hbGlhcyA8IEZYRlRfUkVOREVSX01PREVfTENEKSB7Ci0gICAgICAgICAgICBnbHlwaC5tX09yaWdpblggPSBGWFNZU19yb3VuZChnbHlwaC5tX2ZPcmlnaW5YKTsKKyAgfQorICBpbnQgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTU9OTzsKKyAgRlhfQk9PTCBiTm9ybWFsID0gRkFMU0U7CisgIGlmICgodGV4dF9mbGFncyAmIEZYVEVYVF9OT1NNT09USCkgPT0gMCkgeworICAgIGlmIChtX0RldmljZUNsYXNzID09IEZYRENfRElTUExBWSAmJiBtX2JwcCA+IDEpIHsKKyAgICAgIEZYX0JPT0wgYkNsZWFyVHlwZTsKKyAgICAgIGlmIChwRm9udC0+R2V0RmFjZSgpID09IE5VTEwgJiYKKyAgICAgICAgICAhKHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX0NMRUFSVFlQRSkpIHsKKyAgICAgICAgYkNsZWFyVHlwZSA9IEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYkNsZWFyVHlwZSA9IHRleHRfZmxhZ3MgJiBGWFRFWFRfQ0xFQVJUWVBFOworICAgICAgfQorICAgICAgaWYgKChtX1JlbmRlckNhcHMgJiAoRlhSQ19BTFBIQV9PVVRQVVQgfCBGWFJDX0NNWUtfT1VUUFVUKSkpIHsKKyAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTENEOworICAgICAgICBiTm9ybWFsID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAobV9icHAgPCAxNikgeworICAgICAgICBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9OT1JNQUw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYkNsZWFyVHlwZSA9PSBGQUxTRSkgeworICAgICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX0xDRDsKKyAgICAgICAgICBiTm9ybWFsID0gVFJVRTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdseXBoLm1fT3JpZ2luWCA9IChpbnQpRlhTWVNfZmxvb3IoZ2x5cGgubV9mT3JpZ2luWCk7CisgICAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTENEOwogICAgICAgICB9Ci0gICAgICAgIGdseXBoLm1fT3JpZ2luWSA9IEZYU1lTX3JvdW5kKGdseXBoLm1fZk9yaWdpblkpOwotICAgICAgICBpZiAoY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkgewotICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBuZXdfbWF0cml4KGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXSwgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFszXSwgMCwgMCk7Ci0gICAgICAgICAgICBuZXdfbWF0cml4LkNvbmNhdChkZXZpY2VDdG0pOwotICAgICAgICAgICAgZ2x5cGgubV9wR2x5cGggPSBwRmFjZUNhY2hlLT5Mb2FkR2x5cGhCaXRtYXAocEZvbnQsIGNoYXJwb3MubV9HbHlwaEluZGV4LCBjaGFycG9zLm1fYkZvbnRTdHlsZSwgJm5ld19tYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoLCBhbnRpX2FsaWFzLCBuYXRpdmV0ZXh0X2ZsYWdzKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBnbHlwaC5tX3BHbHlwaCA9IHBGYWNlQ2FjaGUtPkxvYWRHbHlwaEJpdG1hcChwRm9udCwgY2hhcnBvcy5tX0dseXBoSW5kZXgsIGNoYXJwb3MubV9iRm9udFN0eWxlLCAmZGV2aWNlQ3RtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycG9zLm1fRm9udENoYXJXaWR0aCwgYW50aV9hbGlhcywgbmF0aXZldGV4dF9mbGFncyk7CisgICAgICB9CiAgICAgfQotICAgIGlmIChhbnRpX2FsaWFzIDwgRlhGVF9SRU5ERVJfTU9ERV9MQ0QgJiYgbkNoYXJzID4gMSkgewotICAgICAgICBfQWRqdXN0R2x5cGhTcGFjZShwR2x5cGhBbmRQb3MsIG5DaGFycyk7Ci0gICAgfQotICAgIEZYX1JFQ1QgYm1wX3JlY3QxID0gRlhHRV9HZXRHbHlwaHNCQm94KHBHbHlwaEFuZFBvcywgbkNoYXJzLCBhbnRpX2FsaWFzKTsKLSAgICBpZiAoc2NhbGVfeCA+IDEgJiYgc2NhbGVfeSA+IDEpIHsKLSAgICAgICAgYm1wX3JlY3QxLmxlZnQtLTsKLSAgICAgICAgYm1wX3JlY3QxLnRvcCAtLTsKLSAgICAgICAgYm1wX3JlY3QxLnJpZ2h0ICsrOwotICAgICAgICBibXBfcmVjdDEuYm90dG9tICsrOwotICAgIH0KLSAgICBGWF9SRUNUIGJtcF9yZWN0KEZYU1lTX3JvdW5kKChGWF9GTE9BVCkoYm1wX3JlY3QxLmxlZnQpIC8gc2NhbGVfeCksIEZYU1lTX3JvdW5kKChGWF9GTE9BVCkoYm1wX3JlY3QxLnRvcCkgLyBzY2FsZV95KSwKLSAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKChGWF9GTE9BVClibXBfcmVjdDEucmlnaHQgLyBzY2FsZV94KSwgRlhTWVNfcm91bmQoKEZYX0ZMT0FUKWJtcF9yZWN0MS5ib3R0b20gLyBzY2FsZV95KSk7Ci0gICAgYm1wX3JlY3QuSW50ZXJzZWN0KG1fQ2xpcEJveCk7Ci0gICAgaWYgKGJtcF9yZWN0LklzRW1wdHkoKSkgewotICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpbnQgcGl4ZWxfd2lkdGggPSBGWFNZU19yb3VuZChibXBfcmVjdC5XaWR0aCgpICogc2NhbGVfeCk7Ci0gICAgaW50IHBpeGVsX2hlaWdodCA9IEZYU1lTX3JvdW5kKGJtcF9yZWN0LkhlaWdodCgpICogc2NhbGVfeSk7Ci0gICAgaW50IHBpeGVsX2xlZnQgPSBGWFNZU19yb3VuZChibXBfcmVjdC5sZWZ0ICogc2NhbGVfeCk7Ci0gICAgaW50IHBpeGVsX3RvcCA9IEZYU1lTX3JvdW5kKGJtcF9yZWN0LnRvcCAqIHNjYWxlX3kpOwotICAgIGlmIChhbnRpX2FsaWFzID09IEZYRlRfUkVOREVSX01PREVfTU9OTykgewotICAgICAgICBDRlhfRElCaXRtYXAgYml0bWFwOwotICAgICAgICBpZiAoIWJpdG1hcC5DcmVhdGUocGl4ZWxfd2lkdGgsIHBpeGVsX2hlaWdodCwgRlhESUJfMWJwcE1hc2spKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgYml0bWFwLkNsZWFyKDApOwotICAgICAgICBmb3IgKGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7IGlDaGFyICsrKSB7Ci0gICAgICAgICAgICBGWFRFWFRfR0xZUEhQT1MmIGdseXBoID0gcEdseXBoQW5kUG9zW2lDaGFyXTsKLSAgICAgICAgICAgIGlmIChnbHlwaC5tX3BHbHlwaCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBHbHlwaCA9ICZnbHlwaC5tX3BHbHlwaC0+bV9CaXRtYXA7Ci0gICAgICAgICAgICBiaXRtYXAuVHJhbnNmZXJCaXRtYXAoZ2x5cGgubV9PcmlnaW5YICsgZ2x5cGgubV9wR2x5cGgtPm1fTGVmdCAtIHBpeGVsX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgubV9PcmlnaW5ZIC0gZ2x5cGgubV9wR2x5cGgtPm1fVG9wIC0gcGl4ZWxfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHbHlwaC0+R2V0V2lkdGgoKSwgcEdseXBoLT5HZXRIZWlnaHQoKSwgcEdseXBoLCAwLCAwKTsKLSAgICAgICAgfQotICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgIHJldHVybiBTZXRCaXRNYXNrKCZiaXRtYXAsIGJtcF9yZWN0LmxlZnQsIGJtcF9yZWN0LnRvcCwgZmlsbF9jb2xvcik7Ci0gICAgfQotICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7Ci0gICAgaWYgKG1fYnBwID09IDgpIHsKLSAgICAgICAgaWYgKCFiaXRtYXAuQ3JlYXRlKHBpeGVsX3dpZHRoLCBwaXhlbF9oZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CisgIH0KKyAgaWYgKHBDYWNoZSA9PSBOVUxMKSB7CisgICAgcENhY2hlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCk7CisgIH0KKyAgQ0ZYX0ZhY2VDYWNoZSogcEZhY2VDYWNoZSA9IHBDYWNoZS0+R2V0Q2FjaGVkRmFjZShwRm9udCk7CisgIEZYX0ZPTlRDQUNIRV9ERUZJTkUocENhY2hlLCBwRm9udCk7CisgIEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zID0gRlhfQWxsb2MoRlhURVhUX0dMWVBIUE9TLCBuQ2hhcnMpOworICBpbnQgaUNoYXI7CisgIGRldmljZUN0bSA9IGNoYXIyZGV2aWNlOworICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeENUTSA9IEdldENUTSgpOworICBGWF9GTE9BVCBzY2FsZV94ID0gRlhTWVNfZmFicyhtYXRyaXhDVE0uYSk7CisgIEZYX0ZMT0FUIHNjYWxlX3kgPSBGWFNZU19mYWJzKG1hdHJpeENUTS5kKTsKKyAgZGV2aWNlQ3RtLkNvbmNhdChzY2FsZV94LCAwLCAwLCBzY2FsZV95LCAwLCAwKTsKKyAgdGV4dDJEZXZpY2UuQ29uY2F0KHNjYWxlX3gsIDAsIDAsIHNjYWxlX3ksIDAsIDApOworICBmb3IgKGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7IGlDaGFyKyspIHsKKyAgICBGWFRFWFRfR0xZUEhQT1MmIGdseXBoID0gcEdseXBoQW5kUG9zW2lDaGFyXTsKKyAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyYgY2hhcnBvcyA9IHBDaGFyUG9zW2lDaGFyXTsKKyAgICBnbHlwaC5tX2ZPcmlnaW5YID0gY2hhcnBvcy5tX09yaWdpblg7CisgICAgZ2x5cGgubV9mT3JpZ2luWSA9IGNoYXJwb3MubV9PcmlnaW5ZOworICAgIHRleHQyRGV2aWNlLlRyYW5zZm9ybShnbHlwaC5tX2ZPcmlnaW5YLCBnbHlwaC5tX2ZPcmlnaW5ZKTsKKyAgICBpZiAoYW50aV9hbGlhcyA8IEZYRlRfUkVOREVSX01PREVfTENEKSB7CisgICAgICBnbHlwaC5tX09yaWdpblggPSBGWFNZU19yb3VuZChnbHlwaC5tX2ZPcmlnaW5YKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIUNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoJmJpdG1hcCwgcGl4ZWxfd2lkdGgsIHBpeGVsX2hlaWdodCkpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQorICAgICAgZ2x5cGgubV9PcmlnaW5YID0gKGludClGWFNZU19mbG9vcihnbHlwaC5tX2ZPcmlnaW5YKTsKICAgICB9Ci0gICAgaWYgKCFiaXRtYXAuSGFzQWxwaGEoKSAmJiAhYml0bWFwLklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgYml0bWFwLkNsZWFyKDB4RkZGRkZGRkYpOwotICAgICAgICBpZiAoIUdldERJQml0cygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3ApKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBiaXRtYXAuQ2xlYXIoMCk7Ci0gICAgICAgIGlmIChiaXRtYXAubV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgICAgICBiaXRtYXAubV9wQWxwaGFNYXNrLT5DbGVhcigwKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgZGVzdF93aWR0aCA9IHBpeGVsX3dpZHRoOwotICAgIHVpbnQ4X3QqIGRlc3RfYnVmID0gYml0bWFwLkdldEJ1ZmZlcigpOwotICAgIGludCBkZXN0X3BpdGNoID0gYml0bWFwLkdldFBpdGNoKCk7Ci0gICAgaW50IEJwcCA9IGJpdG1hcC5HZXRCUFAoKSAvIDg7Ci0gICAgaW50IGEsIHIsIGcsIGI7Ci0gICAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9MQ0QpIHsKLSAgICAgICAgX0NvbG9yMkFyZ2IoZmlsbF9jb2xvciwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZyB8ICgxIDw8IDI0KSwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIEFyZ2JEZWNvZGUoZmlsbF9jb2xvciwgYSwgciwgZywgYik7Ci0gICAgICAgIHIgPSBGWF9HQU1NQShyKTsKLSAgICAgICAgZyA9IEZYX0dBTU1BKGcpOwotICAgICAgICBiID0gRlhfR0FNTUEoYik7Ci0gICAgfQotICAgIGZvciAoaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIgKyspIHsKLSAgICAgICAgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA9IHBHbHlwaEFuZFBvc1tpQ2hhcl07Ci0gICAgICAgIGlmIChnbHlwaC5tX3BHbHlwaCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBHbHlwaCA9ICZnbHlwaC5tX3BHbHlwaC0+bV9CaXRtYXA7Ci0gICAgICAgIGludCBsZWZ0ID0gZ2x5cGgubV9PcmlnaW5YICsgZ2x5cGgubV9wR2x5cGgtPm1fTGVmdCAtIHBpeGVsX2xlZnQ7Ci0gICAgICAgIGludCB0b3AgPSBnbHlwaC5tX09yaWdpblkgLSBnbHlwaC5tX3BHbHlwaC0+bV9Ub3AgLSBwaXhlbF90b3A7Ci0gICAgICAgIGludCBuY29scyA9IHBHbHlwaC0+R2V0V2lkdGgoKTsKLSAgICAgICAgaW50IG5yb3dzID0gcEdseXBoLT5HZXRIZWlnaHQoKTsKLSAgICAgICAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9OT1JNQUwpIHsKLSAgICAgICAgICAgIGlmICghYml0bWFwLkNvbXBvc2l0ZU1hc2sobGVmdCwgdG9wLCBuY29scywgbnJvd3MsIHBHbHlwaCwgZmlsbF9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiQkdSU3RyaXBlID0gdGV4dF9mbGFncyAmIEZYVEVYVF9CR1JfU1RSSVBFOwotICAgICAgICBuY29scyAvPSAzOwotICAgICAgICBpbnQgeF9zdWJwaXhlbCA9IChpbnQpKGdseXBoLm1fZk9yaWdpblggKiAzKSAlIDM7Ci0gICAgICAgIHVpbnQ4X3QqIHNyY19idWYgPSBwR2x5cGgtPkdldEJ1ZmZlcigpOwotICAgICAgICBpbnQgc3JjX3BpdGNoID0gcEdseXBoLT5HZXRQaXRjaCgpOwotICAgICAgICBpbnQgc3RhcnRfY29sID0gbGVmdDsKLSAgICAgICAgaWYgKHN0YXJ0X2NvbCA8IDApIHsKLSAgICAgICAgICAgIHN0YXJ0X2NvbCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGVuZF9jb2wgPSBsZWZ0ICsgbmNvbHM7Ci0gICAgICAgIGlmIChlbmRfY29sID4gZGVzdF93aWR0aCkgewotICAgICAgICAgICAgZW5kX2NvbCA9IGRlc3Rfd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXJ0X2NvbCA+PSBlbmRfY29sKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYml0bWFwLkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG5yb3dzOyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgZGVzdF9yb3cgPSByb3cgKyB0b3A7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc3Rfcm93IDwgMCB8fCBkZXN0X3JvdyA+PSBiaXRtYXAuR2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gc3JjX2J1ZiArIHJvdyAqIHNyY19waXRjaCArIChzdGFydF9jb2wgLSBsZWZ0KSAqIDM7Ci0gICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X3JvdyAqIGRlc3RfcGl0Y2ggKyAoc3RhcnRfY29sIDw8IDIpOwotICAgICAgICAgICAgICAgIGlmIChiQkdSU3RyaXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4X3N1YnBpeGVsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHhfc3VicGl4ZWwgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2wgLSAxOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbCAtIDE7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhfc3VicGl4ZWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sOyBjb2wgPCBlbmRfY29sOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IChzcmNfc2NhblswXSArIHNyY19zY2FuWzFdICsgc3JjX3NjYW5bMl0pIC8gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhMSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhMSwgciwgZywgYikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYTEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhMSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIGFscGhhX3JhdGlvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHhfc3VicGl4ZWwgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IHN0YXJ0X2NvbCA+IGxlZnQgPyAoKHNyY19zY2FuWy0xXSArIHNyY19zY2FuWzBdICsgc3JjX3NjYW5bMV0pIC8gMykgOiAoKHNyY19zY2FuWzBdICsgc3JjX3NjYW5bMV0pIC8gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhMSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhMSwgciwgZywgYikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYTEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhMSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2w7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiTm9ybWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0gKHNyY19zY2FuWy0xXSArIHNyY19zY2FuWzBdICsgc3JjX3NjYW5bMV0pIC8gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhMSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhMSwgciwgZywgYikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYTEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhMSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIGFscGhhX3JhdGlvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiTm9ybWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPSBzdGFydF9jb2wgPiBsZWZ0ID8gKChzcmNfc2NhblstMl0gKyBzcmNfc2NhblstMV0gKyBzcmNfc2NhblswXSkgLyAzKSA6ICgoc3JjX3NjYW5bMF0pIC8gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhMSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhMSwgciwgZywgYikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYTEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhMSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblstMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPSAoc3JjX3NjYW5bLTJdICsgc3JjX3NjYW5bLTFdICsgc3JjX3NjYW5bMF0pIC8gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhMSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhMSwgciwgZywgYikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYTEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhMSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIGFscGhhX3JhdGlvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWy0yXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBucm93czsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGRlc3Rfcm93ID0gcm93ICsgdG9wOwotICAgICAgICAgICAgICAgIGlmIChkZXN0X3JvdyA8IDAgfHwgZGVzdF9yb3cgPj0gYml0bWFwLkdldEhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiA9IHNyY19idWYgKyByb3cgKiBzcmNfcGl0Y2ggKyAoc3RhcnRfY29sIC0gbGVmdCkgKiAzOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF9yb3cgKiBkZXN0X3BpdGNoICsgc3RhcnRfY29sICogQnBwOwotICAgICAgICAgICAgICAgIGlmIChiQkdSU3RyaXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4X3N1YnBpeGVsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4X3N1YnBpeGVsID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2wgLSAxOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0yXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbCAtIDE7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4X3N1YnBpeGVsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPSAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSArIHNyY19zY2FuWzJdKSAvIDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeF9zdWJwaXhlbCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0gc3RhcnRfY29sID4gbGVmdCA/IChzcmNfc2NhblswXSArIHNyY19zY2FuWzFdICsgc3JjX3NjYW5bLTFdKSAvIDMgOiAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSkgLyAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2wgKyAxOyBjb2wgPCBlbmRfY29sOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IChzcmNfc2NhblswXSArIHNyY19zY2FuWzFdICsgc3JjX3NjYW5bLTFdKSAvIDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IHN0YXJ0X2NvbCA+IGxlZnQgPyAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblstMl0gKyBzcmNfc2NhblstMV0pIC8gMyA6IHNyY19zY2FuWzBdIC8gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2wgKyAxOyBjb2wgPCBlbmRfY29sOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9ICgoaW50KShzcmNfc2NhblswXSkgKyAoaW50KShzcmNfc2NhblstMl0pICsgKGludCkoc3JjX3NjYW5bLTFdKSkgLyAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGJpdG1hcC5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIFNldEJpdE1hc2soJmJpdG1hcCwgYm1wX3JlY3QubGVmdCwgYm1wX3JlY3QudG9wLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKLSAgICB9IGVsc2UgewotICAgICAgICBTZXRESUJpdHMoJmJpdG1hcCwgYm1wX3JlY3QubGVmdCwgYm1wX3JlY3QudG9wKTsKLSAgICB9CisgICAgZ2x5cGgubV9PcmlnaW5ZID0gRlhTWVNfcm91bmQoZ2x5cGgubV9mT3JpZ2luWSk7CisgICAgaWYgKGNoYXJwb3MubV9iR2x5cGhBZGp1c3QpIHsKKyAgICAgIENGWF9BZmZpbmVNYXRyaXggbmV3X21hdHJpeCgKKyAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdLAorICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10sIDAsIDApOworICAgICAgbmV3X21hdHJpeC5Db25jYXQoZGV2aWNlQ3RtKTsKKyAgICAgIGdseXBoLm1fcEdseXBoID0gcEZhY2VDYWNoZS0+TG9hZEdseXBoQml0bWFwKAorICAgICAgICAgIHBGb250LCBjaGFycG9zLm1fR2x5cGhJbmRleCwgY2hhcnBvcy5tX2JGb250U3R5bGUsICZuZXdfbWF0cml4LAorICAgICAgICAgIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoLCBhbnRpX2FsaWFzLCBuYXRpdmV0ZXh0X2ZsYWdzKTsKKyAgICB9IGVsc2UKKyAgICAgIGdseXBoLm1fcEdseXBoID0gcEZhY2VDYWNoZS0+TG9hZEdseXBoQml0bWFwKAorICAgICAgICAgIHBGb250LCBjaGFycG9zLm1fR2x5cGhJbmRleCwgY2hhcnBvcy5tX2JGb250U3R5bGUsICZkZXZpY2VDdG0sCisgICAgICAgICAgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGgsIGFudGlfYWxpYXMsIG5hdGl2ZXRleHRfZmxhZ3MpOworICB9CisgIGlmIChhbnRpX2FsaWFzIDwgRlhGVF9SRU5ERVJfTU9ERV9MQ0QgJiYgbkNoYXJzID4gMSkgeworICAgIF9BZGp1c3RHbHlwaFNwYWNlKHBHbHlwaEFuZFBvcywgbkNoYXJzKTsKKyAgfQorICBGWF9SRUNUIGJtcF9yZWN0MSA9IEZYR0VfR2V0R2x5cGhzQkJveChwR2x5cGhBbmRQb3MsIG5DaGFycywgYW50aV9hbGlhcyk7CisgIGlmIChzY2FsZV94ID4gMSAmJiBzY2FsZV95ID4gMSkgeworICAgIGJtcF9yZWN0MS5sZWZ0LS07CisgICAgYm1wX3JlY3QxLnRvcC0tOworICAgIGJtcF9yZWN0MS5yaWdodCsrOworICAgIGJtcF9yZWN0MS5ib3R0b20rKzsKKyAgfQorICBGWF9SRUNUIGJtcF9yZWN0KEZYU1lTX3JvdW5kKChGWF9GTE9BVCkoYm1wX3JlY3QxLmxlZnQpIC8gc2NhbGVfeCksCisgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoKEZYX0ZMT0FUKShibXBfcmVjdDEudG9wKSAvIHNjYWxlX3kpLAorICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKChGWF9GTE9BVClibXBfcmVjdDEucmlnaHQgLyBzY2FsZV94KSwKKyAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZCgoRlhfRkxPQVQpYm1wX3JlY3QxLmJvdHRvbSAvIHNjYWxlX3kpKTsKKyAgYm1wX3JlY3QuSW50ZXJzZWN0KG1fQ2xpcEJveCk7CisgIGlmIChibXBfcmVjdC5Jc0VtcHR5KCkpIHsKICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdUZXh0UGF0aChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyVXNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsIEZYX0FSR0Igc3Ryb2tlX2NvbG9yLCBDRlhfUGF0aERhdGEqIHBDbGlwcGluZ1BhdGgsIGludCBuRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBpZiAocENhY2hlID09IE5VTEwpIHsKLSAgICAgICAgcENhY2hlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCk7CisgIH0KKyAgaW50IHBpeGVsX3dpZHRoID0gRlhTWVNfcm91bmQoYm1wX3JlY3QuV2lkdGgoKSAqIHNjYWxlX3gpOworICBpbnQgcGl4ZWxfaGVpZ2h0ID0gRlhTWVNfcm91bmQoYm1wX3JlY3QuSGVpZ2h0KCkgKiBzY2FsZV95KTsKKyAgaW50IHBpeGVsX2xlZnQgPSBGWFNZU19yb3VuZChibXBfcmVjdC5sZWZ0ICogc2NhbGVfeCk7CisgIGludCBwaXhlbF90b3AgPSBGWFNZU19yb3VuZChibXBfcmVjdC50b3AgKiBzY2FsZV95KTsKKyAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9NT05PKSB7CisgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKKyAgICBpZiAoIWJpdG1hcC5DcmVhdGUocGl4ZWxfd2lkdGgsIHBpeGVsX2hlaWdodCwgRlhESUJfMWJwcE1hc2spKSB7CisgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIENGWF9GYWNlQ2FjaGUqIHBGYWNlQ2FjaGUgPSBwQ2FjaGUtPkdldENhY2hlZEZhY2UocEZvbnQpOwotICAgIEZYX0ZPTlRDQUNIRV9ERUZJTkUocENhY2hlLCBwRm9udCk7Ci0gICAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIgKyspIHsKLSAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MgPSBwQ2hhclBvc1tpQ2hhcl07Ci0gICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgICAgICBpZiAoY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkKLSAgICAgICAgICAgIG1hdHJpeC5TZXQoY2hhcnBvcy5tX0FkanVzdE1hdHJpeFswXSwgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXSwgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFszXSwgMCwgMCk7Ci0gICAgICAgIG1hdHJpeC5Db25jYXQoZm9udF9zaXplLCAwLCAwLCBmb250X3NpemUsIGNoYXJwb3MubV9PcmlnaW5YLCBjaGFycG9zLm1fT3JpZ2luWSk7Ci0gICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGggPSBwRmFjZUNhY2hlLT5Mb2FkR2x5cGhQYXRoKHBGb250LCBjaGFycG9zLm1fR2x5cGhJbmRleCwgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGgpOwotICAgICAgICBpZiAocFBhdGggPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgYml0bWFwLkNsZWFyKDApOworICAgIGZvciAoaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIrKykgeworICAgICAgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA9IHBHbHlwaEFuZFBvc1tpQ2hhcl07CisgICAgICBpZiAoZ2x5cGgubV9wR2x5cGggPT0gTlVMTCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEdseXBoID0gJmdseXBoLm1fcEdseXBoLT5tX0JpdG1hcDsKKyAgICAgIGJpdG1hcC5UcmFuc2ZlckJpdG1hcCgKKyAgICAgICAgICBnbHlwaC5tX09yaWdpblggKyBnbHlwaC5tX3BHbHlwaC0+bV9MZWZ0IC0gcGl4ZWxfbGVmdCwKKyAgICAgICAgICBnbHlwaC5tX09yaWdpblkgLSBnbHlwaC5tX3BHbHlwaC0+bV9Ub3AgLSBwaXhlbF90b3AsCisgICAgICAgICAgcEdseXBoLT5HZXRXaWR0aCgpLCBwR2x5cGgtPkdldEhlaWdodCgpLCBwR2x5cGgsIDAsIDApOworICAgIH0KKyAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7CisgICAgcmV0dXJuIFNldEJpdE1hc2soJmJpdG1hcCwgYm1wX3JlY3QubGVmdCwgYm1wX3JlY3QudG9wLCBmaWxsX2NvbG9yKTsKKyAgfQorICBDRlhfRElCaXRtYXAgYml0bWFwOworICBpZiAobV9icHAgPT0gOCkgeworICAgIGlmICghYml0bWFwLkNyZWF0ZShwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKKyAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFDcmVhdGVDb21wYXRpYmxlQml0bWFwKCZiaXRtYXAsIHBpeGVsX3dpZHRoLCBwaXhlbF9oZWlnaHQpKSB7CisgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIGlmICghYml0bWFwLkhhc0FscGhhKCkgJiYgIWJpdG1hcC5Jc0FscGhhTWFzaygpKSB7CisgICAgYml0bWFwLkNsZWFyKDB4RkZGRkZGRkYpOworICAgIGlmICghR2V0RElCaXRzKCZiaXRtYXAsIGJtcF9yZWN0LmxlZnQsIGJtcF9yZWN0LnRvcCkpIHsKKyAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYml0bWFwLkNsZWFyKDApOworICAgIGlmIChiaXRtYXAubV9wQWxwaGFNYXNrKSB7CisgICAgICBiaXRtYXAubV9wQWxwaGFNYXNrLT5DbGVhcigwKTsKKyAgICB9CisgIH0KKyAgaW50IGRlc3Rfd2lkdGggPSBwaXhlbF93aWR0aDsKKyAgdWludDhfdCogZGVzdF9idWYgPSBiaXRtYXAuR2V0QnVmZmVyKCk7CisgIGludCBkZXN0X3BpdGNoID0gYml0bWFwLkdldFBpdGNoKCk7CisgIGludCBCcHAgPSBiaXRtYXAuR2V0QlBQKCkgLyA4OworICBpbnQgYSwgciwgZywgYjsKKyAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9MQ0QpIHsKKyAgICBfQ29sb3IyQXJnYihmaWxsX2NvbG9yLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnIHwgKDEgPDwgMjQpLCBwSWNjVHJhbnNmb3JtKTsKKyAgICBBcmdiRGVjb2RlKGZpbGxfY29sb3IsIGEsIHIsIGcsIGIpOworICAgIHIgPSBGWF9HQU1NQShyKTsKKyAgICBnID0gRlhfR0FNTUEoZyk7CisgICAgYiA9IEZYX0dBTU1BKGIpOworICB9CisgIGZvciAoaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIrKykgeworICAgIEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggPSBwR2x5cGhBbmRQb3NbaUNoYXJdOworICAgIGlmIChnbHlwaC5tX3BHbHlwaCA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwR2x5cGggPSAmZ2x5cGgubV9wR2x5cGgtPm1fQml0bWFwOworICAgIGludCBsZWZ0ID0gZ2x5cGgubV9PcmlnaW5YICsgZ2x5cGgubV9wR2x5cGgtPm1fTGVmdCAtIHBpeGVsX2xlZnQ7CisgICAgaW50IHRvcCA9IGdseXBoLm1fT3JpZ2luWSAtIGdseXBoLm1fcEdseXBoLT5tX1RvcCAtIHBpeGVsX3RvcDsKKyAgICBpbnQgbmNvbHMgPSBwR2x5cGgtPkdldFdpZHRoKCk7CisgICAgaW50IG5yb3dzID0gcEdseXBoLT5HZXRIZWlnaHQoKTsKKyAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTCkgeworICAgICAgaWYgKCFiaXRtYXAuQ29tcG9zaXRlTWFzayhsZWZ0LCB0b3AsIG5jb2xzLCBucm93cywgcEdseXBoLCBmaWxsX2NvbG9yLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIEZBTFNFLCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBGWF9CT09MIGJCR1JTdHJpcGUgPSB0ZXh0X2ZsYWdzICYgRlhURVhUX0JHUl9TVFJJUEU7CisgICAgbmNvbHMgLz0gMzsKKyAgICBpbnQgeF9zdWJwaXhlbCA9IChpbnQpKGdseXBoLm1fZk9yaWdpblggKiAzKSAlIDM7CisgICAgdWludDhfdCogc3JjX2J1ZiA9IHBHbHlwaC0+R2V0QnVmZmVyKCk7CisgICAgaW50IHNyY19waXRjaCA9IHBHbHlwaC0+R2V0UGl0Y2goKTsKKyAgICBpbnQgc3RhcnRfY29sID0gbGVmdDsKKyAgICBpZiAoc3RhcnRfY29sIDwgMCkgeworICAgICAgc3RhcnRfY29sID0gMDsKKyAgICB9CisgICAgaW50IGVuZF9jb2wgPSBsZWZ0ICsgbmNvbHM7CisgICAgaWYgKGVuZF9jb2wgPiBkZXN0X3dpZHRoKSB7CisgICAgICBlbmRfY29sID0gZGVzdF93aWR0aDsKKyAgICB9CisgICAgaWYgKHN0YXJ0X2NvbCA+PSBlbmRfY29sKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGJpdG1hcC5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBucm93czsgcm93KyspIHsKKyAgICAgICAgaW50IGRlc3Rfcm93ID0gcm93ICsgdG9wOworICAgICAgICBpZiAoZGVzdF9yb3cgPCAwIHx8IGRlc3Rfcm93ID49IGJpdG1hcC5HZXRIZWlnaHQoKSkgeworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIG1hdHJpeC5Db25jYXQoKnBUZXh0MlVzZXIpOwotICAgICAgICBDRlhfUGF0aERhdGEgVHJhbnNmb3JtZWRQYXRoKCpwUGF0aCk7Ci0gICAgICAgIFRyYW5zZm9ybWVkUGF0aC5UcmFuc2Zvcm0oJm1hdHJpeCk7Ci0gICAgICAgIEZYX0JPT0wgYkhhc0FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIHx8IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsbF9jb2xvciB8fCBzdHJva2VfY29sb3IpOwotICAgICAgICBpZiAoYkhhc0FscGhhKSB7Ci0gICAgICAgICAgICBpbnQgZmlsbF9tb2RlID0gbkZsYWc7Ci0gICAgICAgICAgICBpZiAoRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSkgewotICAgICAgICAgICAgICAgIGlmIChGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSkgewotICAgICAgICAgICAgICAgICAgICBmaWxsX21vZGUgfD0gRlhGSUxMX1dJTkRJTkc7CisgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gc3JjX2J1ZiArIHJvdyAqIHNyY19waXRjaCArIChzdGFydF9jb2wgLSBsZWZ0KSAqIDM7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgICAgICBkZXN0X2J1ZiArIGRlc3Rfcm93ICogZGVzdF9waXRjaCArIChzdGFydF9jb2wgPDwgMik7CisgICAgICAgIGlmIChiQkdSU3RyaXBlKSB7CisgICAgICAgICAgaWYgKHhfc3VicGl4ZWwgPT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sOyBjb2wgPCBlbmRfY29sOyBjb2wrKykgeworICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMl07CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKHhfc3VicGl4ZWwgPT0gMSkgeworICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOworICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7CisgICAgICAgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkgeworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2wgLSAxOyBjb2wrKykgeworICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KSB7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMl07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2wgLSAxOyBjb2wrKykgeworICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0yXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoeF9zdWJwaXhlbCA9PSAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2w7IGNvbCA8IGVuZF9jb2w7IGNvbCsrKSB7CisgICAgICAgICAgICAgIGlmIChiTm9ybWFsKSB7CisgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPSAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSArIHNyY19zY2FuWzJdKSAvIDM7CisgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhMSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhMSwgciwgZywgYikpOworICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDApIHsKKyAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhMSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGExIC8gMjU1OworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgYWxwaGFfcmF0aW8pKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBhbHBoYV9yYXRpbykpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMl07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKHhfc3VicGl4ZWwgPT0gMSkgeworICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPQorICAgICAgICAgICAgICAgICAgc3RhcnRfY29sID4gbGVmdAorICAgICAgICAgICAgICAgICAgICAgID8gKChzcmNfc2NhblstMV0gKyBzcmNfc2NhblswXSArIHNyY19zY2FuWzFdKSAvIDMpCisgICAgICAgICAgICAgICAgICAgICAgOiAoKHNyY19zY2FuWzBdICsgc3JjX3NjYW5bMV0pIC8gMyk7CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDApIHsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhMSwgciwgZywgYikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGExIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYTEgLyAyNTU7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKAorICAgICAgICAgICAgICAgICAgICAgIEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKAorICAgICAgICAgICAgICAgICAgICAgIEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKAorICAgICAgICAgICAgICAgICAgICAgIEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGxfY29sb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlIHw9IEZYRklMTF9XSU5ESU5HOworICAgICAgICAgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkgeworICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07CisgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKKyAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IChzcmNfc2NhblstMV0gKyBzcmNfc2NhblswXSArIHNyY19zY2FuWzFdKSAvIDM7CisgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhMSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhMSwgciwgZywgYikpOworICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDApIHsKKyAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhMSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGExIC8gMjU1OworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgYWxwaGFfcmF0aW8pKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBhbHBoYV9yYXRpbykpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaWxsX21vZGUgfD0gRlhfRklMTF9URVhUX01PREU7Ci0gICAgICAgICAgICBpZiAoIURyYXdQYXRoKCZUcmFuc2Zvcm1lZFBhdGgsIHBVc2VyMkRldmljZSwgcEdyYXBoU3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPQorICAgICAgICAgICAgICAgICAgc3RhcnRfY29sID4gbGVmdAorICAgICAgICAgICAgICAgICAgICAgID8gKChzcmNfc2NhblstMl0gKyBzcmNfc2NhblstMV0gKyBzcmNfc2NhblswXSkgLyAzKQorICAgICAgICAgICAgICAgICAgICAgIDogKChzcmNfc2NhblswXSkgLyAzKTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhMSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMCkgeworICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGExLCByLCBnLCBiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYTEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhMSAvIDI1NTsKKyAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoCisgICAgICAgICAgICAgICAgICAgICAgRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgYWxwaGFfcmF0aW8pKTsKKyAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoCisgICAgICAgICAgICAgICAgICAgICAgRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgYWxwaGFfcmF0aW8pKTsKKyAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoCisgICAgICAgICAgICAgICAgICAgICAgRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgYWxwaGFfcmF0aW8pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07CisgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKKyAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9CisgICAgICAgICAgICAgICAgICAgIChzcmNfc2NhblstMl0gKyBzcmNfc2NhblstMV0gKyBzcmNfc2NhblswXSkgLyAzOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYTEsIHIsIGcsIGIpKTsKKyAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYTEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhMSAvIDI1NTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYTEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgYWxwaGFfcmF0aW8pKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBhbHBoYV9yYXRpbykpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWy0yXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBDbGlwcGluZ1BhdGgpIHsKLSAgICAgICAgICAgIHBDbGlwcGluZ1BhdGgtPkFwcGVuZCgmVHJhbnNmb3JtZWRQYXRoLCBwVXNlcjJEZXZpY2UpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBucm93czsgcm93KyspIHsKKyAgICAgICAgaW50IGRlc3Rfcm93ID0gcm93ICsgdG9wOworICAgICAgICBpZiAoZGVzdF9yb3cgPCAwIHx8IGRlc3Rfcm93ID49IGJpdG1hcC5HZXRIZWlnaHQoKSkgeworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gc3JjX2J1ZiArIHJvdyAqIHNyY19waXRjaCArIChzdGFydF9jb2wgLSBsZWZ0KSAqIDM7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF9yb3cgKiBkZXN0X3BpdGNoICsgc3RhcnRfY29sICogQnBwOworICAgICAgICBpZiAoYkJHUlN0cmlwZSkgeworICAgICAgICAgIGlmICh4X3N1YnBpeGVsID09IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKKyAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzJdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmICh4X3N1YnBpeGVsID09IDEpIHsKKyAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOworICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2wgLSAxOyBjb2wrKykgeworICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KSB7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMl07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbCAtIDE7IGNvbCsrKSB7CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICh4X3N1YnBpeGVsID09IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKKyAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IChzcmNfc2NhblswXSArIHNyY19zY2FuWzFdICsgc3JjX3NjYW5bMl0pIC8gMzsKKyAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYTEpKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGExKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsyXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoeF9zdWJwaXhlbCA9PSAxKSB7CisgICAgICAgICAgICBpZiAoYk5vcm1hbCkgeworICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9CisgICAgICAgICAgICAgICAgICBzdGFydF9jb2wgPiBsZWZ0CisgICAgICAgICAgICAgICAgICAgICAgPyAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSArIHNyY19zY2FuWy0xXSkgLyAzCisgICAgICAgICAgICAgICAgICAgICAgOiAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSkgLyAzOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2w7IGNvbCsrKSB7CisgICAgICAgICAgICAgIGlmIChiTm9ybWFsKSB7CisgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPSAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSArIHNyY19zY2FuWy0xXSkgLyAzOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGExKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYTEpKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYk5vcm1hbCkgeworICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9CisgICAgICAgICAgICAgICAgICBzdGFydF9jb2wgPiBsZWZ0CisgICAgICAgICAgICAgICAgICAgICAgPyAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblstMl0gKyBzcmNfc2NhblstMV0pIC8gMworICAgICAgICAgICAgICAgICAgICAgIDogc3JjX3NjYW5bMF0gLyAzOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07CisgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKKyAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9ICgoaW50KShzcmNfc2NhblswXSkgKyAoaW50KShzcmNfc2NhblstMl0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShzcmNfc2NhblstMV0pKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGExKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYTEpKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWy0yXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGJpdG1hcC5Jc0FscGhhTWFzaygpKSB7CisgICAgU2V0Qml0TWFzaygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3AsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKKyAgfSBlbHNlIHsKKyAgICBTZXRESUJpdHMoJmJpdG1hcCwgYm1wX3JlY3QubGVmdCwgYm1wX3JlY3QudG9wKTsKKyAgfQorICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7CisgIHJldHVybiBUUlVFOwogfQotQ0ZYX0ZvbnRDYWNoZTo6fkNGWF9Gb250Q2FjaGUoKQotewotICAgIEZyZWVDYWNoZShUUlVFKTsKLX0KLQotQ0ZYX0ZhY2VDYWNoZSogQ0ZYX0ZvbnRDYWNoZTo6R2V0Q2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpCi17Ci0gICAgRlhGVF9GYWNlIGludGVybmFsX2ZhY2UgPSBwRm9udC0+R2V0RmFjZSgpOwotICAgIGNvbnN0IEZYX0JPT0wgYkV4dGVybmFsID0gaW50ZXJuYWxfZmFjZSA9PSBudWxscHRyOwotICAgIEZYRlRfRmFjZSBmYWNlID0gYkV4dGVybmFsID8KLSAgICAgICAgKEZYRlRfRmFjZSlwRm9udC0+R2V0U3Vic3RGb250KCktPm1fRXh0SGFuZGxlIDogaW50ZXJuYWxfZmFjZTsKLSAgICBDRlhfRlRDYWNoZU1hcCYgbWFwID0gYkV4dGVybmFsID8gbV9FeHRGYWNlTWFwIDogbV9GVEZhY2VNYXA7Ci0gICAgYXV0byBpdCA9IG1hcC5maW5kKGZhY2UpOwotICAgIGlmIChpdCAhPSBtYXAuZW5kKCkpIHsKLSAgICAgICAgQ0ZYX0NvdW50ZWRGYWNlQ2FjaGUqIGNvdW50ZWRfZmFjZV9jYWNoZSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9uQ291bnQrKzsKLSAgICAgICAgcmV0dXJuIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9PYmo7CitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdUZXh0UGF0aChpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyVXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBzdHJva2VfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEqIHBDbGlwcGluZ1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBpZiAocENhY2hlID09IE5VTEwpIHsKKyAgICBwQ2FjaGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKTsKKyAgfQorICBDRlhfRmFjZUNhY2hlKiBwRmFjZUNhY2hlID0gcENhY2hlLT5HZXRDYWNoZWRGYWNlKHBGb250KTsKKyAgRlhfRk9OVENBQ0hFX0RFRklORShwQ2FjaGUsIHBGb250KTsKKyAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIrKykgeworICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gcENoYXJQb3NbaUNoYXJdOworICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OworICAgIGlmIChjaGFycG9zLm1fYkdseXBoQWRqdXN0KQorICAgICAgbWF0cml4LlNldChjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdLAorICAgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdLCAwLCAwKTsKKyAgICBtYXRyaXguQ29uY2F0KGZvbnRfc2l6ZSwgMCwgMCwgZm9udF9zaXplLCBjaGFycG9zLm1fT3JpZ2luWCwKKyAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9PcmlnaW5ZKTsKKyAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoID0gcEZhY2VDYWNoZS0+TG9hZEdseXBoUGF0aCgKKyAgICAgICAgcEZvbnQsIGNoYXJwb3MubV9HbHlwaEluZGV4LCBjaGFycG9zLm1fRm9udENoYXJXaWR0aCk7CisgICAgaWYgKHBQYXRoID09IE5VTEwpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBDRlhfRmFjZUNhY2hlKiBmYWNlX2NhY2hlID0gbmV3IENGWF9GYWNlQ2FjaGUoYkV4dGVybmFsID8gbnVsbHB0ciA6IGZhY2UpOwotICAgIENGWF9Db3VudGVkRmFjZUNhY2hlKiBjb3VudGVkX2ZhY2VfY2FjaGUgPSBuZXcgQ0ZYX0NvdW50ZWRGYWNlQ2FjaGU7Ci0gICAgY291bnRlZF9mYWNlX2NhY2hlLT5tX25Db3VudCA9IDI7Ci0gICAgY291bnRlZF9mYWNlX2NhY2hlLT5tX09iaiA9IGZhY2VfY2FjaGU7Ci0gICAgbWFwW2ZhY2VdID0gY291bnRlZF9mYWNlX2NhY2hlOwotICAgIHJldHVybiBmYWNlX2NhY2hlOworICAgIG1hdHJpeC5Db25jYXQoKnBUZXh0MlVzZXIpOworICAgIENGWF9QYXRoRGF0YSBUcmFuc2Zvcm1lZFBhdGgoKnBQYXRoKTsKKyAgICBUcmFuc2Zvcm1lZFBhdGguVHJhbnNmb3JtKCZtYXRyaXgpOworICAgIEZYX0JPT0wgYkhhc0FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChmaWxsX2NvbG9yIHx8IHN0cm9rZV9jb2xvcik7CisgICAgaWYgKGJIYXNBbHBoYSkgeworICAgICAgaW50IGZpbGxfbW9kZSA9IG5GbGFnOworICAgICAgaWYgKEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykpIHsKKyAgICAgICAgaWYgKEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpKSB7CisgICAgICAgICAgZmlsbF9tb2RlIHw9IEZYRklMTF9XSU5ESU5HOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZmlsbF9jb2xvcikgeworICAgICAgICAgIGZpbGxfbW9kZSB8PSBGWEZJTExfV0lORElORzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZmlsbF9tb2RlIHw9IEZYX0ZJTExfVEVYVF9NT0RFOworICAgICAgaWYgKCFEcmF3UGF0aCgmVHJhbnNmb3JtZWRQYXRoLCBwVXNlcjJEZXZpY2UsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICBpZiAocENsaXBwaW5nUGF0aCkgeworICAgICAgcENsaXBwaW5nUGF0aC0+QXBwZW5kKCZUcmFuc2Zvcm1lZFBhdGgsIHBVc2VyMkRldmljZSk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorQ0ZYX0ZvbnRDYWNoZTo6fkNGWF9Gb250Q2FjaGUoKSB7CisgIEZyZWVDYWNoZShUUlVFKTsKIH0KIAotdm9pZCBDRlhfRm9udENhY2hlOjpSZWxlYXNlQ2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpCi17Ci0gICAgRlhGVF9GYWNlIGludGVybmFsX2ZhY2UgPSBwRm9udC0+R2V0RmFjZSgpOwotICAgIGNvbnN0IEZYX0JPT0wgYkV4dGVybmFsID0gaW50ZXJuYWxfZmFjZSA9PSBudWxscHRyOwotICAgIEZYRlRfRmFjZSBmYWNlID0gYkV4dGVybmFsID8KLSAgICAgICAgKEZYRlRfRmFjZSlwRm9udC0+R2V0U3Vic3RGb250KCktPm1fRXh0SGFuZGxlIDogaW50ZXJuYWxfZmFjZTsKLSAgICBDRlhfRlRDYWNoZU1hcCYgbWFwID0gIGJFeHRlcm5hbCA/IG1fRXh0RmFjZU1hcCA6IG1fRlRGYWNlTWFwOwotCi0gICAgYXV0byBpdCA9IG1hcC5maW5kKGZhY2UpOwotICAgIGlmIChpdCA9PSBtYXAuZW5kKCkpCi0gICAgICAgIHJldHVybjsKLQorQ0ZYX0ZhY2VDYWNoZSogQ0ZYX0ZvbnRDYWNoZTo6R2V0Q2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpIHsKKyAgRlhGVF9GYWNlIGludGVybmFsX2ZhY2UgPSBwRm9udC0+R2V0RmFjZSgpOworICBjb25zdCBGWF9CT09MIGJFeHRlcm5hbCA9IGludGVybmFsX2ZhY2UgPT0gbnVsbHB0cjsKKyAgRlhGVF9GYWNlIGZhY2UgPQorICAgICAgYkV4dGVybmFsID8gKEZYRlRfRmFjZSlwRm9udC0+R2V0U3Vic3RGb250KCktPm1fRXh0SGFuZGxlIDogaW50ZXJuYWxfZmFjZTsKKyAgQ0ZYX0ZUQ2FjaGVNYXAmIG1hcCA9IGJFeHRlcm5hbCA/IG1fRXh0RmFjZU1hcCA6IG1fRlRGYWNlTWFwOworICBhdXRvIGl0ID0gbWFwLmZpbmQoZmFjZSk7CisgIGlmIChpdCAhPSBtYXAuZW5kKCkpIHsKICAgICBDRlhfQ291bnRlZEZhY2VDYWNoZSogY291bnRlZF9mYWNlX2NhY2hlID0gaXQtPnNlY29uZDsKLSAgICBpZiAoY291bnRlZF9mYWNlX2NhY2hlLT5tX25Db3VudCA+IDEpIHsKLSAgICAgICAgY291bnRlZF9mYWNlX2NhY2hlLT5tX25Db3VudC0tOwotICAgIH0KKyAgICBjb3VudGVkX2ZhY2VfY2FjaGUtPm1fbkNvdW50Kys7CisgICAgcmV0dXJuIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9PYmo7CisgIH0KKyAgQ0ZYX0ZhY2VDYWNoZSogZmFjZV9jYWNoZSA9IG5ldyBDRlhfRmFjZUNhY2hlKGJFeHRlcm5hbCA/IG51bGxwdHIgOiBmYWNlKTsKKyAgQ0ZYX0NvdW50ZWRGYWNlQ2FjaGUqIGNvdW50ZWRfZmFjZV9jYWNoZSA9IG5ldyBDRlhfQ291bnRlZEZhY2VDYWNoZTsKKyAgY291bnRlZF9mYWNlX2NhY2hlLT5tX25Db3VudCA9IDI7CisgIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9PYmogPSBmYWNlX2NhY2hlOworICBtYXBbZmFjZV0gPSBjb3VudGVkX2ZhY2VfY2FjaGU7CisgIHJldHVybiBmYWNlX2NhY2hlOwogfQogCi12b2lkIENGWF9Gb250Q2FjaGU6OkZyZWVDYWNoZShGWF9CT09MIGJSZWxlYXNlKQotewotICAgIGZvciAoYXV0byBpdCA9IG1fRlRGYWNlTWFwLmJlZ2luKCk7IGl0ICE9IG1fRlRGYWNlTWFwLmVuZCgpOykgewotICAgICAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOwotICAgICAgICBDRlhfQ291bnRlZEZhY2VDYWNoZSogY2FjaGUgPSBjdXJyX2l0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChiUmVsZWFzZSB8fCBjYWNoZS0+bV9uQ291bnQgPCAyKSB7Ci0gICAgICAgICAgICBkZWxldGUgY2FjaGUtPm1fT2JqOwotICAgICAgICAgICAgZGVsZXRlIGNhY2hlOwotICAgICAgICAgICAgbV9GVEZhY2VNYXAuZXJhc2UoY3Vycl9pdCk7Ci0gICAgICAgIH0KLSAgICB9Cit2b2lkIENGWF9Gb250Q2FjaGU6OlJlbGVhc2VDYWNoZWRGYWNlKENGWF9Gb250KiBwRm9udCkgeworICBGWEZUX0ZhY2UgaW50ZXJuYWxfZmFjZSA9IHBGb250LT5HZXRGYWNlKCk7CisgIGNvbnN0IEZYX0JPT0wgYkV4dGVybmFsID0gaW50ZXJuYWxfZmFjZSA9PSBudWxscHRyOworICBGWEZUX0ZhY2UgZmFjZSA9CisgICAgICBiRXh0ZXJuYWwgPyAoRlhGVF9GYWNlKXBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9FeHRIYW5kbGUgOiBpbnRlcm5hbF9mYWNlOworICBDRlhfRlRDYWNoZU1hcCYgbWFwID0gYkV4dGVybmFsID8gbV9FeHRGYWNlTWFwIDogbV9GVEZhY2VNYXA7CiAKLSAgICBmb3IgKGF1dG8gaXQgPSBtX0V4dEZhY2VNYXAuYmVnaW4oKTsgaXQgIT0gbV9FeHRGYWNlTWFwLmVuZCgpOykgewotICAgICAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOwotICAgICAgICBDRlhfQ291bnRlZEZhY2VDYWNoZSogY2FjaGUgPSBjdXJyX2l0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChiUmVsZWFzZSB8fCBjYWNoZS0+bV9uQ291bnQgPCAyKSB7Ci0gICAgICAgICAgICBkZWxldGUgY2FjaGUtPm1fT2JqOwotICAgICAgICAgICAgZGVsZXRlIGNhY2hlOwotICAgICAgICAgICAgbV9FeHRGYWNlTWFwLmVyYXNlKGN1cnJfaXQpOwotICAgICAgICB9Ci0gICAgfQorICBhdXRvIGl0ID0gbWFwLmZpbmQoZmFjZSk7CisgIGlmIChpdCA9PSBtYXAuZW5kKCkpCisgICAgcmV0dXJuOworCisgIENGWF9Db3VudGVkRmFjZUNhY2hlKiBjb3VudGVkX2ZhY2VfY2FjaGUgPSBpdC0+c2Vjb25kOworICBpZiAoY291bnRlZF9mYWNlX2NhY2hlLT5tX25Db3VudCA+IDEpIHsKKyAgICBjb3VudGVkX2ZhY2VfY2FjaGUtPm1fbkNvdW50LS07CisgIH0KIH0KIAotQ0ZYX0ZhY2VDYWNoZTo6Q0ZYX0ZhY2VDYWNoZShGWEZUX0ZhY2UgZmFjZSkKLXsKLSAgICBtX0ZhY2UgPSBmYWNlOwotfQotQ0ZYX0ZhY2VDYWNoZTo6fkNGWF9GYWNlQ2FjaGUoKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fU2l6ZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgS2V5OwotICAgIENGWF9TaXplR2x5cGhDYWNoZSogcFNpemVDYWNoZSA9IE5VTEw7Ci0gICAgd2hpbGUocG9zKSB7Ci0gICAgICAgIG1fU2l6ZU1hcC5HZXROZXh0QXNzb2MoIHBvcywgS2V5LCAodm9pZComKXBTaXplQ2FjaGUpOwotICAgICAgICBkZWxldGUgcFNpemVDYWNoZTsKK3ZvaWQgQ0ZYX0ZvbnRDYWNoZTo6RnJlZUNhY2hlKEZYX0JPT0wgYlJlbGVhc2UpIHsKKyAgZm9yIChhdXRvIGl0ID0gbV9GVEZhY2VNYXAuYmVnaW4oKTsgaXQgIT0gbV9GVEZhY2VNYXAuZW5kKCk7KSB7CisgICAgYXV0byBjdXJyX2l0ID0gaXQrKzsKKyAgICBDRlhfQ291bnRlZEZhY2VDYWNoZSogY2FjaGUgPSBjdXJyX2l0LT5zZWNvbmQ7CisgICAgaWYgKGJSZWxlYXNlIHx8IGNhY2hlLT5tX25Db3VudCA8IDIpIHsKKyAgICAgIGRlbGV0ZSBjYWNoZS0+bV9PYmo7CisgICAgICBkZWxldGUgY2FjaGU7CisgICAgICBtX0ZURmFjZU1hcC5lcmFzZShjdXJyX2l0KTsKICAgICB9Ci0gICAgbV9TaXplTWFwLlJlbW92ZUFsbCgpOwotICAgIHBvcyA9IG1fUGF0aE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgdm9pZCoga2V5MTsKLSAgICBDRlhfUGF0aERhdGEqIHBQYXRoOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgbV9QYXRoTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleTEsICh2b2lkKiYpcFBhdGgpOwotICAgICAgICBkZWxldGUgcFBhdGg7CisgIH0KKworICBmb3IgKGF1dG8gaXQgPSBtX0V4dEZhY2VNYXAuYmVnaW4oKTsgaXQgIT0gbV9FeHRGYWNlTWFwLmVuZCgpOykgeworICAgIGF1dG8gY3Vycl9pdCA9IGl0Kys7CisgICAgQ0ZYX0NvdW50ZWRGYWNlQ2FjaGUqIGNhY2hlID0gY3Vycl9pdC0+c2Vjb25kOworICAgIGlmIChiUmVsZWFzZSB8fCBjYWNoZS0+bV9uQ291bnQgPCAyKSB7CisgICAgICBkZWxldGUgY2FjaGUtPm1fT2JqOworICAgICAgZGVsZXRlIGNhY2hlOworICAgICAgbV9FeHRGYWNlTWFwLmVyYXNlKGN1cnJfaXQpOwogICAgIH0KLSAgICBtX1BhdGhNYXAuUmVtb3ZlQWxsKCk7CisgIH0KIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyAgIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLXZvaWQgQ0ZYX0ZhY2VDYWNoZTo6SW5pdFBsYXRmb3JtKCkKLXsKKworQ0ZYX0ZhY2VDYWNoZTo6Q0ZYX0ZhY2VDYWNoZShGWEZUX0ZhY2UgZmFjZSkgeworICBtX0ZhY2UgPSBmYWNlOwogfQorQ0ZYX0ZhY2VDYWNoZTo6fkNGWF9GYWNlQ2FjaGUoKSB7CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fU2l6ZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7CisgIENGWF9CeXRlU3RyaW5nIEtleTsKKyAgQ0ZYX1NpemVHbHlwaENhY2hlKiBwU2l6ZUNhY2hlID0gTlVMTDsKKyAgd2hpbGUgKHBvcykgeworICAgIG1fU2l6ZU1hcC5HZXROZXh0QXNzb2MocG9zLCBLZXksICh2b2lkKiYpcFNpemVDYWNoZSk7CisgICAgZGVsZXRlIHBTaXplQ2FjaGU7CisgIH0KKyAgbV9TaXplTWFwLlJlbW92ZUFsbCgpOworICBwb3MgPSBtX1BhdGhNYXAuR2V0U3RhcnRQb3NpdGlvbigpOworICB2b2lkKiBrZXkxOworICBDRlhfUGF0aERhdGEqIHBQYXRoOworICB3aGlsZSAocG9zKSB7CisgICAgbV9QYXRoTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleTEsICh2b2lkKiYpcFBhdGgpOworICAgIGRlbGV0ZSBwUGF0aDsKKyAgfQorICBtX1BhdGhNYXAuUmVtb3ZlQWxsKCk7Cit9CisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KK3ZvaWQgQ0ZYX0ZhY2VDYWNoZTo6SW5pdFBsYXRmb3JtKCkge30KICNlbmRpZgotQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpMb29rVXBHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgIENGWF9CeXRlU3RyaW5nQyYgRmFjZUdseXBoc0tleSwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX0JPT0wgYkZvbnRTdHlsZSwKLSAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBhbnRpX2FsaWFzKQotewotICAgIENGWF9TaXplR2x5cGhDYWNoZSogcFNpemVDYWNoZSA9IE5VTEw7Ci0gICAgaWYgKCFtX1NpemVNYXAuTG9va3VwKEZhY2VHbHlwaHNLZXksICh2b2lkKiYpcFNpemVDYWNoZSkpIHsKLSAgICAgICAgcFNpemVDYWNoZSA9IEZYX05FVyBDRlhfU2l6ZUdseXBoQ2FjaGU7Ci0gICAgICAgIGlmIChwU2l6ZUNhY2hlID09IE5VTEwpCXsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIG1fU2l6ZU1hcC5TZXRBdChGYWNlR2x5cGhzS2V5LCBwU2l6ZUNhY2hlKTsKK0NGWF9HbHlwaEJpdG1hcCogQ0ZYX0ZhY2VDYWNoZTo6TG9va1VwR2x5cGhCaXRtYXAoCisgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgQ0ZYX0J5dGVTdHJpbmdDJiBGYWNlR2x5cGhzS2V5LAorICAgIEZYX0RXT1JEIGdseXBoX2luZGV4LAorICAgIEZYX0JPT0wgYkZvbnRTdHlsZSwKKyAgICBpbnQgZGVzdF93aWR0aCwKKyAgICBpbnQgYW50aV9hbGlhcykgeworICBDRlhfU2l6ZUdseXBoQ2FjaGUqIHBTaXplQ2FjaGUgPSBOVUxMOworICBpZiAoIW1fU2l6ZU1hcC5Mb29rdXAoRmFjZUdseXBoc0tleSwgKHZvaWQqJilwU2l6ZUNhY2hlKSkgeworICAgIHBTaXplQ2FjaGUgPSBGWF9ORVcgQ0ZYX1NpemVHbHlwaENhY2hlOworICAgIGlmIChwU2l6ZUNhY2hlID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcCA9IE5VTEw7Ci0gICAgaWYgKHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuTG9va3VwKCh2b2lkKikodWludHB0cl90KWdseXBoX2luZGV4LCAodm9pZComKXBHbHlwaEJpdG1hcCkpIHsKLSAgICAgICAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKLSAgICB9Ci0gICAgcEdseXBoQml0bWFwID0gUmVuZGVyR2x5cGgocEZvbnQsIGdseXBoX2luZGV4LCBiRm9udFN0eWxlLCBwTWF0cml4LCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKLSAgICBpZiAocEdseXBoQml0bWFwID09IE5VTEwpCXsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZ2x5cGhfaW5kZXgsIHBHbHlwaEJpdG1hcCk7CisgICAgbV9TaXplTWFwLlNldEF0KEZhY2VHbHlwaHNLZXksIHBTaXplQ2FjaGUpOworICB9CisgIENGWF9HbHlwaEJpdG1hcCogcEdseXBoQml0bWFwID0gTlVMTDsKKyAgaWYgKHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuTG9va3VwKCh2b2lkKikodWludHB0cl90KWdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqJilwR2x5cGhCaXRtYXApKSB7CiAgICAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKKyAgfQorICBwR2x5cGhCaXRtYXAgPSBSZW5kZXJHbHlwaChwRm9udCwgZ2x5cGhfaW5kZXgsIGJGb250U3R5bGUsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOworICBpZiAocEdseXBoQml0bWFwID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLlNldEF0KCh2b2lkKikodWludHB0cl90KWdseXBoX2luZGV4LCBwR2x5cGhCaXRtYXApOworICByZXR1cm4gcEdseXBoQml0bWFwOwogfQotY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpMb2FkR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMsIGludCYgdGV4dF9mbGFncykKLXsKLSAgICBpZiAoZ2x5cGhfaW5kZXggPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIF9DRlhfVW5pcXVlS2V5R2VuIGtleWdlbjsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKQotICAgICAgICBrZXlnZW4uR2VuZXJhdGUoOSwgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHBNYXRyaXgtPmMgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmQgKiAxMDAwMCksIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fSXRhbGljQW5nbGUsIHBGb250LT5Jc1ZlcnRpY2FsKCkpOwotICAgIGVsc2UKLSAgICAgICAga2V5Z2VuLkdlbmVyYXRlKDYsIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKK2NvbnN0IENGWF9HbHlwaEJpdG1hcCogQ0ZYX0ZhY2VDYWNoZTo6TG9hZEdseXBoQml0bWFwKAorICAgIENGWF9Gb250KiBwRm9udCwKKyAgICBGWF9EV09SRCBnbHlwaF9pbmRleCwKKyAgICBGWF9CT09MIGJGb250U3R5bGUsCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICBpbnQgZGVzdF93aWR0aCwKKyAgICBpbnQgYW50aV9hbGlhcywKKyAgICBpbnQmIHRleHRfZmxhZ3MpIHsKKyAgaWYgKGdseXBoX2luZGV4ID09IChGWF9EV09SRCktMSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIF9DRlhfVW5pcXVlS2V5R2VuIGtleWdlbjsKKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX0FQUExFXworICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKQorICAgIGtleWdlbi5HZW5lcmF0ZSg5LCAoaW50KShwTWF0cml4LT5hICogMTAwMDApLCAoaW50KShwTWF0cml4LT5iICogMTAwMDApLAorICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLAorICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzLCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fSXRhbGljQW5nbGUsIHBGb250LT5Jc1ZlcnRpY2FsKCkpOworICBlbHNlCisgICAga2V5Z2VuLkdlbmVyYXRlKDYsIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCisgICAgICAgICAgICAgICAgICAgIChpbnQpKHBNYXRyaXgtPmMgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmQgKiAxMDAwMCksCisgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwogI2Vsc2UKLSAgICBpZiAodGV4dF9mbGFncyAmIEZYVEVYVF9OT19OQVRJVkVURVhUKSB7Ci0gICAgICAgIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpCi0gICAgICAgICAgICBrZXlnZW4uR2VuZXJhdGUoOSwgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQsIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwgcEZvbnQtPklzVmVydGljYWwoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGtleWdlbi5HZW5lcmF0ZSg2LCAoaW50KShwTWF0cml4LT5hICogMTAwMDApLCAoaW50KShwTWF0cml4LT5iICogMTAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHBNYXRyaXgtPmMgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmQgKiAxMDAwMCksIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpCi0gICAgICAgICAgICBrZXlnZW4uR2VuZXJhdGUoMTAsIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkocE1hdHJpeC0+YyAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+ZCAqIDEwMDAwKSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fSXRhbGljQW5nbGUsIHBGb250LT5Jc1ZlcnRpY2FsKCksIDMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBrZXlnZW4uR2VuZXJhdGUoNywgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzLCAzKTsKLSAgICB9CisgIGlmICh0ZXh0X2ZsYWdzICYgRlhURVhUX05PX05BVElWRVRFWFQpIHsKKyAgICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKQorICAgICAga2V5Z2VuLkdlbmVyYXRlKDksIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgKGludCkocE1hdHJpeC0+YyAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+ZCAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzLCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+SXNWZXJ0aWNhbCgpKTsKKyAgICBlbHNlCisgICAgICBrZXlnZW4uR2VuZXJhdGUoNiwgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOworICB9IGVsc2UgeworICAgIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpCisgICAgICBrZXlnZW4uR2VuZXJhdGUoMTAsIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgKGludCkocE1hdHJpeC0+YyAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+ZCAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzLCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwgcEZvbnQtPklzVmVydGljYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAzKTsKKyAgICBlbHNlCisgICAgICBrZXlnZW4uR2VuZXJhdGUoNywgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMsIDMpOworICB9CiAjZW5kaWYKLSAgICBDRlhfQnl0ZVN0cmluZ0MgRmFjZUdseXBoc0tleShrZXlnZW4ubV9LZXksIGtleWdlbi5tX0tleUxlbik7Ci0jaWYgX0ZYTV9QTEFURk9STV8gICE9IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgcmV0dXJuIExvb2tVcEdseXBoQml0bWFwKHBGb250LCBwTWF0cml4LCBGYWNlR2x5cGhzS2V5LCBnbHlwaF9pbmRleCwgYkZvbnRTdHlsZSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7CisgIENGWF9CeXRlU3RyaW5nQyBGYWNlR2x5cGhzS2V5KGtleWdlbi5tX0tleSwga2V5Z2VuLm1fS2V5TGVuKTsKKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX0FQUExFXworICByZXR1cm4gTG9va1VwR2x5cGhCaXRtYXAocEZvbnQsIHBNYXRyaXgsIEZhY2VHbHlwaHNLZXksIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZvbnRTdHlsZSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7CiAjZWxzZQotICAgIGlmICh0ZXh0X2ZsYWdzICYgRlhURVhUX05PX05BVElWRVRFWFQpIHsKLSAgICAgICAgcmV0dXJuIExvb2tVcEdseXBoQml0bWFwKHBGb250LCBwTWF0cml4LCBGYWNlR2x5cGhzS2V5LCBnbHlwaF9pbmRleCwgYkZvbnRTdHlsZSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7CisgIGlmICh0ZXh0X2ZsYWdzICYgRlhURVhUX05PX05BVElWRVRFWFQpIHsKKyAgICByZXR1cm4gTG9va1VwR2x5cGhCaXRtYXAocEZvbnQsIHBNYXRyaXgsIEZhY2VHbHlwaHNLZXksIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRm9udFN0eWxlLCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKKyAgfQorICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcDsKKyAgQ0ZYX1NpemVHbHlwaENhY2hlKiBwU2l6ZUNhY2hlID0gTlVMTDsKKyAgaWYgKG1fU2l6ZU1hcC5Mb29rdXAoRmFjZUdseXBoc0tleSwgKHZvaWQqJilwU2l6ZUNhY2hlKSkgeworICAgIGlmIChwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqJilwR2x5cGhCaXRtYXApKSB7CisgICAgICByZXR1cm4gcEdseXBoQml0bWFwOwogICAgIH0KLSAgICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcDsKLSAgICBDRlhfU2l6ZUdseXBoQ2FjaGUqIHBTaXplQ2FjaGUgPSBOVUxMOwotICAgIGlmIChtX1NpemVNYXAuTG9va3VwKEZhY2VHbHlwaHNLZXksICh2b2lkKiYpcFNpemVDYWNoZSkpIHsKLSAgICAgICAgaWYgKHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuTG9va3VwKCh2b2lkKikodWludHB0cl90KWdseXBoX2luZGV4LCAodm9pZComKXBHbHlwaEJpdG1hcCkpIHsKLSAgICAgICAgICAgIHJldHVybiBwR2x5cGhCaXRtYXA7Ci0gICAgICAgIH0KLSAgICAgICAgcEdseXBoQml0bWFwID0gUmVuZGVyR2x5cGhfTmF0aXZldGV4dChwRm9udCwgZ2x5cGhfaW5kZXgsIHBNYXRyaXgsIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwotICAgICAgICBpZiAocEdseXBoQml0bWFwKSB7Ci0gICAgICAgICAgICBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLlNldEF0KCh2b2lkKikodWludHB0cl90KWdseXBoX2luZGV4LCBwR2x5cGhCaXRtYXApOwotICAgICAgICAgICAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBHbHlwaEJpdG1hcCA9IFJlbmRlckdseXBoX05hdGl2ZXRleHQocEZvbnQsIGdseXBoX2luZGV4LCBwTWF0cml4LCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKLSAgICAgICAgaWYgKHBHbHlwaEJpdG1hcCkgewotICAgICAgICAgICAgcFNpemVDYWNoZSA9IG5ldyBDRlhfU2l6ZUdseXBoQ2FjaGU7Ci0gICAgICAgICAgICBtX1NpemVNYXAuU2V0QXQoRmFjZUdseXBoc0tleSwgcFNpemVDYWNoZSk7Ci0gICAgICAgICAgICBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLlNldEF0KCh2b2lkKikodWludHB0cl90KWdseXBoX2luZGV4LCBwR2x5cGhCaXRtYXApOwotICAgICAgICAgICAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKLSAgICAgICAgfQorICAgIHBHbHlwaEJpdG1hcCA9IFJlbmRlckdseXBoX05hdGl2ZXRleHQocEZvbnQsIGdseXBoX2luZGV4LCBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7CisgICAgaWYgKHBHbHlwaEJpdG1hcCkgeworICAgICAgcFNpemVDYWNoZS0+bV9HbHlwaE1hcC5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClnbHlwaF9pbmRleCwgcEdseXBoQml0bWFwKTsKKyAgICAgIHJldHVybiBwR2x5cGhCaXRtYXA7CiAgICAgfQotICAgIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpCi0gICAgICAgIGtleWdlbi5HZW5lcmF0ZSg5LCAoaW50KShwTWF0cml4LT5hICogMTAwMDApLCAoaW50KShwTWF0cml4LT5iICogMTAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkocE1hdHJpeC0+YyAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+ZCAqIDEwMDAwKSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQsIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwgcEZvbnQtPklzVmVydGljYWwoKSk7Ci0gICAgZWxzZQotICAgICAgICBrZXlnZW4uR2VuZXJhdGUoNiwgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHBNYXRyaXgtPmMgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmQgKiAxMDAwMCksIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwotICAgIENGWF9CeXRlU3RyaW5nQyBGYWNlR2x5cGhzS2V5MihrZXlnZW4ubV9LZXksIGtleWdlbi5tX0tleUxlbik7Ci0gICAgdGV4dF9mbGFncyB8PSBGWFRFWFRfTk9fTkFUSVZFVEVYVDsKLSAgICByZXR1cm4gTG9va1VwR2x5cGhCaXRtYXAocEZvbnQsIHBNYXRyaXgsIEZhY2VHbHlwaHNLZXkyLCBnbHlwaF9pbmRleCwgYkZvbnRTdHlsZSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7CisgIH0gZWxzZSB7CisgICAgcEdseXBoQml0bWFwID0gUmVuZGVyR2x5cGhfTmF0aXZldGV4dChwRm9udCwgZ2x5cGhfaW5kZXgsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKKyAgICBpZiAocEdseXBoQml0bWFwKSB7CisgICAgICBwU2l6ZUNhY2hlID0gbmV3IENGWF9TaXplR2x5cGhDYWNoZTsKKyAgICAgIG1fU2l6ZU1hcC5TZXRBdChGYWNlR2x5cGhzS2V5LCBwU2l6ZUNhY2hlKTsKKyAgICAgIHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZ2x5cGhfaW5kZXgsIHBHbHlwaEJpdG1hcCk7CisgICAgICByZXR1cm4gcEdseXBoQml0bWFwOworICAgIH0KKyAgfQorICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKQorICAgIGtleWdlbi5HZW5lcmF0ZSg5LCAoaW50KShwTWF0cml4LT5hICogMTAwMDApLCAoaW50KShwTWF0cml4LT5iICogMTAwMDApLAorICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLAorICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzLCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fSXRhbGljQW5nbGUsIHBGb250LT5Jc1ZlcnRpY2FsKCkpOworICBlbHNlCisgICAga2V5Z2VuLkdlbmVyYXRlKDYsIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCisgICAgICAgICAgICAgICAgICAgIChpbnQpKHBNYXRyaXgtPmMgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmQgKiAxMDAwMCksCisgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOworICBDRlhfQnl0ZVN0cmluZ0MgRmFjZUdseXBoc0tleTIoa2V5Z2VuLm1fS2V5LCBrZXlnZW4ubV9LZXlMZW4pOworICB0ZXh0X2ZsYWdzIHw9IEZYVEVYVF9OT19OQVRJVkVURVhUOworICByZXR1cm4gTG9va1VwR2x5cGhCaXRtYXAocEZvbnQsIHBNYXRyaXgsIEZhY2VHbHlwaHNLZXkyLCBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGb250U3R5bGUsIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwogI2VuZGlmCiB9Ci1DRlhfU2l6ZUdseXBoQ2FjaGU6On5DRlhfU2l6ZUdseXBoQ2FjaGUoKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fR2x5cGhNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHZvaWQqIEtleTsKLSAgICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcCA9IE5VTEw7Ci0gICAgd2hpbGUocG9zKSB7Ci0gICAgICAgIG1fR2x5cGhNYXAuR2V0TmV4dEFzc29jKHBvcywgS2V5LCAodm9pZComKXBHbHlwaEJpdG1hcCk7Ci0gICAgICAgIGRlbGV0ZSBwR2x5cGhCaXRtYXA7Ci0gICAgfQotICAgIG1fR2x5cGhNYXAuUmVtb3ZlQWxsKCk7CitDRlhfU2l6ZUdseXBoQ2FjaGU6On5DRlhfU2l6ZUdseXBoQ2FjaGUoKSB7CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fR2x5cGhNYXAuR2V0U3RhcnRQb3NpdGlvbigpOworICB2b2lkKiBLZXk7CisgIENGWF9HbHlwaEJpdG1hcCogcEdseXBoQml0bWFwID0gTlVMTDsKKyAgd2hpbGUgKHBvcykgeworICAgIG1fR2x5cGhNYXAuR2V0TmV4dEFzc29jKHBvcywgS2V5LCAodm9pZComKXBHbHlwaEJpdG1hcCk7CisgICAgZGVsZXRlIHBHbHlwaEJpdG1hcDsKKyAgfQorICBtX0dseXBoTWFwLlJlbW92ZUFsbCgpOwogfQotI2RlZmluZSBDT05UUkFTVF9SQU1QX1NURVAJMQotdm9pZCBDRlhfRm9udDo6QWRqdXN0TU1QYXJhbXMoaW50IGdseXBoX2luZGV4LCBpbnQgZGVzdF93aWR0aCwgaW50IHdlaWdodCkKLXsKLSAgICBGWEZUX01NX1ZhciBwTWFzdGVycyA9IE5VTEw7Ci0gICAgRlhGVF9HZXRfTU1fVmFyKG1fRmFjZSwgJnBNYXN0ZXJzKTsKLSAgICBpZiAocE1hc3RlcnMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CisjZGVmaW5lIENPTlRSQVNUX1JBTVBfU1RFUCAxCit2b2lkIENGWF9Gb250OjpBZGp1c3RNTVBhcmFtcyhpbnQgZ2x5cGhfaW5kZXgsIGludCBkZXN0X3dpZHRoLCBpbnQgd2VpZ2h0KSB7CisgIEZYRlRfTU1fVmFyIHBNYXN0ZXJzID0gTlVMTDsKKyAgRlhGVF9HZXRfTU1fVmFyKG1fRmFjZSwgJnBNYXN0ZXJzKTsKKyAgaWYgKHBNYXN0ZXJzID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbG9uZyBjb29yZHNbMl07CisgIGlmICh3ZWlnaHQgPT0gMCkgeworICAgIGNvb3Jkc1swXSA9IEZYRlRfR2V0X01NX0F4aXNfRGVmKEZYRlRfR2V0X01NX0F4aXMocE1hc3RlcnMsIDApKSAvIDY1NTM2OworICB9IGVsc2UgeworICAgIGNvb3Jkc1swXSA9IHdlaWdodDsKKyAgfQorICBpZiAoZGVzdF93aWR0aCA9PSAwKSB7CisgICAgY29vcmRzWzFdID0gRlhGVF9HZXRfTU1fQXhpc19EZWYoRlhGVF9HZXRfTU1fQXhpcyhwTWFzdGVycywgMSkpIC8gNjU1MzY7CisgIH0gZWxzZSB7CisgICAgaW50IG1pbl9wYXJhbSA9IEZYRlRfR2V0X01NX0F4aXNfTWluKEZYRlRfR2V0X01NX0F4aXMocE1hc3RlcnMsIDEpKSAvIDY1NTM2OworICAgIGludCBtYXhfcGFyYW0gPSBGWEZUX0dldF9NTV9BeGlzX01heChGWEZUX0dldF9NTV9BeGlzKHBNYXN0ZXJzLCAxKSkgLyA2NTUzNjsKKyAgICBjb29yZHNbMV0gPSBtaW5fcGFyYW07CisgICAgaW50IGVycm9yID0gRlhGVF9TZXRfTU1fRGVzaWduX0Nvb3JkaW5hdGVzKG1fRmFjZSwgMiwgY29vcmRzKTsKKyAgICBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaCgKKyAgICAgICAgbV9GYWNlLCBnbHlwaF9pbmRleCwKKyAgICAgICAgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7CisgICAgaW50IG1pbl93aWR0aCA9IEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRmFjZSkgKiAxMDAwIC8KKyAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7CisgICAgY29vcmRzWzFdID0gbWF4X3BhcmFtOworICAgIGVycm9yID0gRlhGVF9TZXRfTU1fRGVzaWduX0Nvb3JkaW5hdGVzKG1fRmFjZSwgMiwgY29vcmRzKTsKKyAgICBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaCgKKyAgICAgICAgbV9GYWNlLCBnbHlwaF9pbmRleCwKKyAgICAgICAgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7CisgICAgaW50IG1heF93aWR0aCA9IEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRmFjZSkgKiAxMDAwIC8KKyAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7CisgICAgaWYgKG1heF93aWR0aCA9PSBtaW5fd2lkdGgpIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbG9uZyBjb29yZHNbMl07Ci0gICAgaWYgKHdlaWdodCA9PSAwKSB7Ci0gICAgICAgIGNvb3Jkc1swXSA9IEZYRlRfR2V0X01NX0F4aXNfRGVmKEZYRlRfR2V0X01NX0F4aXMocE1hc3RlcnMsIDApKSAvIDY1NTM2OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvb3Jkc1swXSA9IHdlaWdodDsKLSAgICB9Ci0gICAgaWYgKGRlc3Rfd2lkdGggPT0gMCkgewotICAgICAgICBjb29yZHNbMV0gPSBGWEZUX0dldF9NTV9BeGlzX0RlZihGWEZUX0dldF9NTV9BeGlzKHBNYXN0ZXJzLCAxKSkgLyA2NTUzNjsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgbWluX3BhcmFtID0gRlhGVF9HZXRfTU1fQXhpc19NaW4oRlhGVF9HZXRfTU1fQXhpcyhwTWFzdGVycywgMSkpIC8gNjU1MzY7Ci0gICAgICAgIGludCBtYXhfcGFyYW0gPSBGWEZUX0dldF9NTV9BeGlzX01heChGWEZUX0dldF9NTV9BeGlzKHBNYXN0ZXJzLCAxKSkgLyA2NTUzNjsKLSAgICAgICAgY29vcmRzWzFdID0gbWluX3BhcmFtOwotICAgICAgICBpbnQgZXJyb3IgPSBGWEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMobV9GYWNlLCAyLCBjb29yZHMpOwotICAgICAgICBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKLSAgICAgICAgaW50IG1pbl93aWR0aCA9IEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRmFjZSkgKiAxMDAwIC8gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7Ci0gICAgICAgIGNvb3Jkc1sxXSA9IG1heF9wYXJhbTsKLSAgICAgICAgZXJyb3IgPSBGWEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMobV9GYWNlLCAyLCBjb29yZHMpOwotICAgICAgICBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKLSAgICAgICAgaW50IG1heF93aWR0aCA9IEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRmFjZSkgKiAxMDAwIC8gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7Ci0gICAgICAgIGlmIChtYXhfd2lkdGggPT0gbWluX3dpZHRoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHBhcmFtID0gbWluX3BhcmFtICsgKG1heF9wYXJhbSAtIG1pbl9wYXJhbSkgKiAoZGVzdF93aWR0aCAtIG1pbl93aWR0aCkgLyAobWF4X3dpZHRoIC0gbWluX3dpZHRoKTsKLSAgICAgICAgY29vcmRzWzFdID0gcGFyYW07Ci0gICAgfQotICAgIEZYRlRfRnJlZShtX0ZhY2UsIHBNYXN0ZXJzKTsKLSAgICBGWEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMobV9GYWNlLCAyLCBjb29yZHMpOworICAgIGludCBwYXJhbSA9IG1pbl9wYXJhbSArCisgICAgICAgICAgICAgICAgKG1heF9wYXJhbSAtIG1pbl9wYXJhbSkgKiAoZGVzdF93aWR0aCAtIG1pbl93aWR0aCkgLworICAgICAgICAgICAgICAgICAgICAobWF4X3dpZHRoIC0gbWluX3dpZHRoKTsKKyAgICBjb29yZHNbMV0gPSBwYXJhbTsKKyAgfQorICBGWEZUX0ZyZWUobV9GYWNlLCBwTWFzdGVycyk7CisgIEZYRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyhtX0ZhY2UsIDIsIGNvb3Jkcyk7CiB9CiBzdGF0aWMgY29uc3Qgc2l6ZV90IEFOR0xFU0tFV19BUlJBWV9TSVpFID0gMzA7CiBzdGF0aWMgY29uc3QgY2hhciBnX0FuZ2xlU2tld1tBTkdMRVNLRVdfQVJSQVlfU0laRV0gPSB7Ci0gICAgMCwgMiwgMywgNSwgNywgOSwgMTEsIDEyLCAxNCwgMTYsCi0gICAgMTgsIDE5LCAyMSwgMjMsIDI1LCAyNywgMjksIDMxLCAzMiwgMzQsCi0gICAgMzYsIDM4LCA0MCwgNDIsIDQ1LCA0NywgNDksIDUxLCA1MywgNTUsCisgICAgMCwgIDIsICAzLCAgNSwgIDcsICA5LCAgMTEsIDEyLCAxNCwgMTYsIDE4LCAxOSwgMjEsIDIzLCAyNSwKKyAgICAyNywgMjksIDMxLCAzMiwgMzQsIDM2LCAzOCwgNDAsIDQyLCA0NSwgNDcsIDQ5LCA1MSwgNTMsIDU1LAogfTsKIHN0YXRpYyBjb25zdCBzaXplX3QgV0VJR0hUUE9XX0FSUkFZX1NJWkUgPSAxMDA7CiBzdGF0aWMgY29uc3QgdWludDhfdCBnX1dlaWdodFBvd1tXRUlHSFRQT1dfQVJSQVlfU0laRV0gPSB7Ci0gICAgMCwgMywgNiwgNywgOCwgOSwgMTEsIDEyLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwKLSAgICAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNSwgMzYsIDM2LAotICAgIDM3LCAzNywgMzcsIDM4LCAzOCwgMzgsIDM5LCAzOSwgMzksIDQwLCA0MCwgNDAsIDQxLCA0MSwgNDEsIDQyLCA0MiwgNDIsCi0gICAgNDIsIDQzLCA0MywgNDMsIDQ0LCA0NCwgNDQsIDQ0LCA0NSwgNDUsIDQ1LCA0NSwgNDYsIDQ2LCA0NiwgNDYsIDQ3LCA0NywKLSAgICA0NywgNDcsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDksIDQ5LCA0OSwgNDksIDUwLCA1MCwgNTAsIDUwLCA1MCwgNTEsIDUxLAotICAgIDUxLCA1MSwgNTEsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTMsIDUzLCA1MywgNTMsIDUzLAorICAgIDAsICAzLCAgNiwgIDcsICA4LCAgOSwgIDExLCAxMiwgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwKKyAgICAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzUsIDM2LCAzNiwgMzcsCisgICAgMzcsIDM3LCAzOCwgMzgsIDM4LCAzOSwgMzksIDM5LCA0MCwgNDAsIDQwLCA0MSwgNDEsIDQxLCA0MiwgNDIsIDQyLAorICAgIDQyLCA0MywgNDMsIDQzLCA0NCwgNDQsIDQ0LCA0NCwgNDUsIDQ1LCA0NSwgNDUsIDQ2LCA0NiwgNDYsIDQ2LCA0NywKKyAgICA0NywgNDcsIDQ3LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ5LCA0OSwgNDksIDQ5LCA1MCwgNTAsIDUwLCA1MCwgNTAsCisgICAgNTEsIDUxLCA1MSwgNTEsIDUxLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUzLCA1MywgNTMsIDUzLCA1MywKIH07CiBzdGF0aWMgY29uc3QgdWludDhfdCBnX1dlaWdodFBvd18xMVtXRUlHSFRQT1dfQVJSQVlfU0laRV0gPSB7Ci0gICAgMCwgNCwgNywgOCwgOSwgMTAsIDEyLCAxMywgMTUsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsCi0gICAgMjMsIDI0LCAyNSwgMjYsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOSwgMzksIDQwLCA0MCwKLSAgICA0MSwgNDEsIDQxLCA0MiwgNDIsIDQyLCA0MywgNDMsIDQzLCA0NCwgNDQsIDQ0LCA0NSwgNDUsIDQ1LCA0NiwgNDYsIDQ2LAotICAgIDQ2LCA0MywgNDcsIDQ3LCA0OCwgNDgsIDQ4LCA0OCwgNDUsIDUwLCA1MCwgNTAsIDQ2LCA1MSwgNTEsIDUxLCA1MiwgNTIsCi0gICAgNTIsIDUyLCA1MywgNTMsIDUzLCA1MywgNTMsIDU0LCA1NCwgNTQsIDU0LCA1NSwgNTUsIDU1LCA1NSwgNTUsIDU2LCA1NiwKLSAgICA1NiwgNTYsIDU2LCA1NywgNTcsIDU3LCA1NywgNTcsIDU4LCA1OCwgNTgsIDU4LCA1OCwKKyAgICAwLCAgNCwgIDcsICA4LCAgOSwgIDEwLCAxMiwgMTMsIDE1LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisgICAgMjUsIDI2LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzksIDM5LCA0MCwgNDAsIDQxLAorICAgIDQxLCA0MSwgNDIsIDQyLCA0MiwgNDMsIDQzLCA0MywgNDQsIDQ0LCA0NCwgNDUsIDQ1LCA0NSwgNDYsIDQ2LCA0NiwKKyAgICA0NiwgNDMsIDQ3LCA0NywgNDgsIDQ4LCA0OCwgNDgsIDQ1LCA1MCwgNTAsIDUwLCA0NiwgNTEsIDUxLCA1MSwgNTIsCisgICAgNTIsIDUyLCA1MiwgNTMsIDUzLCA1MywgNTMsIDUzLCA1NCwgNTQsIDU0LCA1NCwgNTUsIDU1LCA1NSwgNTUsIDU1LAorICAgIDU2LCA1NiwgNTYsIDU2LCA1NiwgNTcsIDU3LCA1NywgNTcsIDU3LCA1OCwgNTgsIDU4LCA1OCwgNTgsCiB9Owogc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ19XZWlnaHRQb3dfU0hJRlRKSVNbV0VJR0hUUE9XX0FSUkFZX1NJWkVdID0gewotICAgIDAsIDAsIDEsIDIsIDMsIDQsIDUsIDcsIDgsIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTcsIDE5LCAyMSwgMjIsIDI0LCAyNiwgMjgsCi0gICAgMzAsIDMyLCAzMywgMzUsIDM3LCAzOSwgNDEsIDQzLCA0NSwgNDgsIDQ4LCA0OCwgNDgsIDQ5LCA0OSwgNDksIDUwLCA1MCwgNTAsIDUwLAotICAgIDUxLCA1MSwgNTEsIDUxLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUzLCA1MywgNTMsIDUzLCA1MywgNTQsIDU0LCA1NCwgNTQsIDU0LCA1NSwgNTUsCi0gICAgNTUsIDU1LCA1NSwgNTYsIDU2LCA1NiwgNTYsIDU2ICwgNTYsIDU3LCA1NywgNTcgLCA1NyAsIDU3LCA1NywgNTcsIDU4LCA1OCwgNTgsIDU4LCA1OCwKLSAgICA1OCwgNTgsIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsCisgICAgMCwgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDcsICA4LCAgMTAsIDExLCAxMywgMTQsIDE2LCAxNywgMTksIDIxLAorICAgIDIyLCAyNCwgMjYsIDI4LCAzMCwgMzIsIDMzLCAzNSwgMzcsIDM5LCA0MSwgNDMsIDQ1LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OSwgNDksIDQ5LCA1MCwgNTAsIDUwLCA1MCwgNTEsIDUxLCA1MSwgNTEsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTMsCisgICAgNTMsIDUzLCA1MywgNTMsIDU0LCA1NCwgNTQsIDU0LCA1NCwgNTUsIDU1LCA1NSwgNTUsIDU1LCA1NiwgNTYsIDU2LAorICAgIDU2LCA1NiwgNTYsIDU3LCA1NywgNTcsIDU3LCA1NywgNTcsIDU3LCA1OCwgNTgsIDU4LCA1OCwgNTgsIDU4LCA1OCwKKyAgICA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLAogfTsKLXN0YXRpYyB2b2lkIF9HYW1tYUFkanVzdCh1aW50OF90KiBwRGF0YSwgaW50IG5XaWQsIGludCBuSGVpLCBpbnQgc3JjX3BpdGNoLCBjb25zdCB1aW50OF90KiBnYW1tYVRhYmxlKQotewotICAgIGludCBjb3VudCA9IG5IZWkgKiBzcmNfcGl0Y2g7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgcERhdGFbaV0gPSBnYW1tYVRhYmxlW3BEYXRhW2ldXTsKLSAgICB9CitzdGF0aWMgdm9pZCBfR2FtbWFBZGp1c3QodWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5XaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5IZWksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnYW1tYVRhYmxlKSB7CisgIGludCBjb3VudCA9IG5IZWkgKiBzcmNfcGl0Y2g7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIHBEYXRhW2ldID0gZ2FtbWFUYWJsZVtwRGF0YVtpXV07CisgIH0KIH0KLXN0YXRpYyB2b2lkIF9Db250cmFzdEFkanVzdCh1aW50OF90KiBwRGF0YUluLCB1aW50OF90KiBwRGF0YU91dCwgaW50IG5XaWQsIGludCBuSGVpLCBpbnQgblNyY1Jvd0J5dGVzLCBpbnQgbkRzdFJvd0J5dGVzKQotewotICAgIGludCBjb2wsIHJvdywgdGVtcDsKLSAgICBpbnQgbWF4ID0gMCwgbWluID0gMjU1OwotICAgIEZYX0ZMT0FUIHJhdGU7Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBuSGVpOyByb3cgKyspIHsKLSAgICAgICAgdWludDhfdCogcFJvdyA9IHBEYXRhSW4gKyByb3cgKiBuU3JjUm93Qnl0ZXM7Ci0gICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgbldpZDsgY29sKyspIHsKLSAgICAgICAgICAgIHRlbXAgPSAqcFJvdyArKzsKLSAgICAgICAgICAgIGlmICh0ZW1wID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgbWF4ID0gdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0ZW1wIDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgbWluID0gdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorc3RhdGljIHZvaWQgX0NvbnRyYXN0QWRqdXN0KHVpbnQ4X3QqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5XaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5IZWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TcmNSb3dCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkRzdFJvd0J5dGVzKSB7CisgIGludCBjb2wsIHJvdywgdGVtcDsKKyAgaW50IG1heCA9IDAsIG1pbiA9IDI1NTsKKyAgRlhfRkxPQVQgcmF0ZTsKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBuSGVpOyByb3crKykgeworICAgIHVpbnQ4X3QqIHBSb3cgPSBwRGF0YUluICsgcm93ICogblNyY1Jvd0J5dGVzOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbldpZDsgY29sKyspIHsKKyAgICAgIHRlbXAgPSAqcFJvdysrOworICAgICAgaWYgKHRlbXAgPiBtYXgpIHsKKyAgICAgICAgbWF4ID0gdGVtcDsKKyAgICAgIH0KKyAgICAgIGlmICh0ZW1wIDwgbWluKSB7CisgICAgICAgIG1pbiA9IHRlbXA7CisgICAgICB9CiAgICAgfQotICAgIHRlbXAgPSBtYXggLSBtaW47Ci0gICAgaWYgKDAgPT0gdGVtcCB8fCAyNTUgPT0gdGVtcCkgewotICAgICAgICBpbnQgcm93Ynl0ZXMgPSBGWFNZU19hYnMoblNyY1Jvd0J5dGVzKSA+IG5Ec3RSb3dCeXRlcyA/IG5Ec3RSb3dCeXRlcyA6IEZYU1lTX2FicyhuU3JjUm93Qnl0ZXMpOwotICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IG5IZWk7IHJvdyArKykgewotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHBEYXRhT3V0ICsgcm93ICogbkRzdFJvd0J5dGVzLCBwRGF0YUluICsgcm93ICogblNyY1Jvd0J5dGVzLCByb3dieXRlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOworICB9CisgIHRlbXAgPSBtYXggLSBtaW47CisgIGlmICgwID09IHRlbXAgfHwgMjU1ID09IHRlbXApIHsKKyAgICBpbnQgcm93Ynl0ZXMgPSBGWFNZU19hYnMoblNyY1Jvd0J5dGVzKSA+IG5Ec3RSb3dCeXRlcworICAgICAgICAgICAgICAgICAgICAgICA/IG5Ec3RSb3dCeXRlcworICAgICAgICAgICAgICAgICAgICAgICA6IEZYU1lTX2FicyhuU3JjUm93Qnl0ZXMpOworICAgIGZvciAocm93ID0gMDsgcm93IDwgbkhlaTsgcm93KyspIHsKKyAgICAgIEZYU1lTX21lbWNweShwRGF0YU91dCArIHJvdyAqIG5Ec3RSb3dCeXRlcywgcERhdGFJbiArIHJvdyAqIG5TcmNSb3dCeXRlcywKKyAgICAgICAgICAgICAgICAgICByb3dieXRlcyk7CiAgICAgfQotICAgIHJhdGUgPSAyNTUuZiAvIHRlbXA7Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBuSGVpOyByb3cgKyspIHsKLSAgICAgICAgdWludDhfdCogcFNyY1JvdyA9IHBEYXRhSW4gKyByb3cgKiBuU3JjUm93Qnl0ZXM7Ci0gICAgICAgIHVpbnQ4X3QqIHBEc3RSb3cgPSBwRGF0YU91dCArIHJvdyAqIG5Ec3RSb3dCeXRlczsKLSAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBuV2lkOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHRlbXAgPSAoaW50KSgoKihwU3JjUm93KyspIC0gbWluKSAqIHJhdGUgKyAwLjUpOwotICAgICAgICAgICAgaWYgKHRlbXAgPiAyNTUpCXsKLSAgICAgICAgICAgICAgICB0ZW1wID0gMjU1OwotICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wIDwgMCkgewotICAgICAgICAgICAgICAgIHRlbXAgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnBEc3RSb3cgKysgPSAodWludDhfdCl0ZW1wOwotICAgICAgICB9CisgICAgcmV0dXJuOworICB9CisgIHJhdGUgPSAyNTUuZiAvIHRlbXA7CisgIGZvciAocm93ID0gMDsgcm93IDwgbkhlaTsgcm93KyspIHsKKyAgICB1aW50OF90KiBwU3JjUm93ID0gcERhdGFJbiArIHJvdyAqIG5TcmNSb3dCeXRlczsKKyAgICB1aW50OF90KiBwRHN0Um93ID0gcERhdGFPdXQgKyByb3cgKiBuRHN0Um93Qnl0ZXM7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBuV2lkOyBjb2wrKykgeworICAgICAgdGVtcCA9IChpbnQpKCgqKHBTcmNSb3crKykgLSBtaW4pICogcmF0ZSArIDAuNSk7CisgICAgICBpZiAodGVtcCA+IDI1NSkgeworICAgICAgICB0ZW1wID0gMjU1OworICAgICAgfSBlbHNlIGlmICh0ZW1wIDwgMCkgeworICAgICAgICB0ZW1wID0gMDsKKyAgICAgIH0KKyAgICAgICpwRHN0Um93KysgPSAodWludDhfdCl0ZW1wOwogICAgIH0KKyAgfQogfQotQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpSZW5kZXJHbHlwaChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9CT09MIGJGb250U3R5bGUsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcykKLXsKLSAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYRlRfTWF0cml4ICBmdF9tYXRyaXg7Ci0gICAgZnRfbWF0cml4Lnh4ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5HZXRBKCkgLyA2NCAqIDY1NTM2KTsKLSAgICBmdF9tYXRyaXgueHkgPSAoc2lnbmVkIGxvbmcpKHBNYXRyaXgtPkdldEMoKSAvIDY0ICogNjU1MzYpOwotICAgIGZ0X21hdHJpeC55eCA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0QigpIC8gNjQgKiA2NTUzNik7Ci0gICAgZnRfbWF0cml4Lnl5ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5HZXREKCkgLyA2NCAqIDY1NTM2KTsKLSAgICBGWF9CT09MIGJVc2VDSktTdWJGb250ID0gRkFMU0U7Ci0gICAgY29uc3QgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCA9IHBGb250LT5HZXRTdWJzdEZvbnQoKTsKLSAgICBpZiAocFN1YnN0Rm9udCkgewotICAgICAgICBiVXNlQ0pLU3ViRm9udCA9IHBTdWJzdEZvbnQtPm1fYlN1YnN0T2ZDSksgJiYgYkZvbnRTdHlsZTsKLSAgICAgICAgaW50IHNrZXcgPSAwOwotICAgICAgICBpZiAoYlVzZUNKS1N1YkZvbnQpIHsKLSAgICAgICAgICAgIHNrZXcgPSBwU3Vic3RGb250LT5tX2JJdGxpY0NKSyA/IC0xNSA6IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBza2V3ID0gcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2tldykgewotICAgICAgICAgICAgc2tldyA9IHNrZXcgPD0gLUFOR0xFU0tFV19BUlJBWV9TSVpFID8gLTU4IDogLWdfQW5nbGVTa2V3Wy1za2V3XTsKLSAgICAgICAgICAgIGlmIChwRm9udC0+SXNWZXJ0aWNhbCgpKSB7Ci0gICAgICAgICAgICAgICAgZnRfbWF0cml4Lnl4ICs9IGZ0X21hdHJpeC55eSAqIHNrZXcgLyAxMDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZ0X21hdHJpeC54eSArPSAtZnRfbWF0cml4Lnh4ICogc2tldyAvIDEwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSB7Ci0gICAgICAgICAgICBwRm9udC0+QWRqdXN0TU1QYXJhbXMoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgsIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYRlRfU2V0X1RyYW5zZm9ybShtX0ZhY2UsICZmdF9tYXRyaXgsIDApOwotICAgIGludCBsb2FkX2ZsYWdzID0gKG1fRmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UKSA/IEZYRlRfTE9BRF9OT19CSVRNQVAgOiAoRlhGVF9MT0FEX05PX0JJVE1BUCB8IEZUX0xPQURfTk9fSElOVElORyk7Ci0gICAgaW50IGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MpOwotICAgIGlmIChlcnJvcikgewotICAgICAgICAvL2lmIGFuIGVycm9yIGlzIHJldHVybmVkLCB0cnkgdG8gcmVsb2FkIGdseXBocyB3aXRob3V0IGhpbnRpbmcuCi0gICAgICAgIGlmIChsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19ISU5USU5HIHx8IGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19ISU5USU5HOwotICAgICAgICBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzKTsKLQotICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCB3ZWlnaHQgPSAwOworQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpSZW5kZXJHbHlwaChDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb250U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcykgeworICBpZiAobV9GYWNlID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWEZUX01hdHJpeCBmdF9tYXRyaXg7CisgIGZ0X21hdHJpeC54eCA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0QSgpIC8gNjQgKiA2NTUzNik7CisgIGZ0X21hdHJpeC54eSA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0QygpIC8gNjQgKiA2NTUzNik7CisgIGZ0X21hdHJpeC55eCA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0QigpIC8gNjQgKiA2NTUzNik7CisgIGZ0X21hdHJpeC55eSA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0RCgpIC8gNjQgKiA2NTUzNik7CisgIEZYX0JPT0wgYlVzZUNKS1N1YkZvbnQgPSBGQUxTRTsKKyAgY29uc3QgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCA9IHBGb250LT5HZXRTdWJzdEZvbnQoKTsKKyAgaWYgKHBTdWJzdEZvbnQpIHsKKyAgICBiVXNlQ0pLU3ViRm9udCA9IHBTdWJzdEZvbnQtPm1fYlN1YnN0T2ZDSksgJiYgYkZvbnRTdHlsZTsKKyAgICBpbnQgc2tldyA9IDA7CiAgICAgaWYgKGJVc2VDSktTdWJGb250KSB7Ci0gICAgICAgIHdlaWdodCA9IHBTdWJzdEZvbnQtPm1fV2VpZ2h0Q0pLOworICAgICAgc2tldyA9IHBTdWJzdEZvbnQtPm1fYkl0bGljQ0pLID8gLTE1IDogMDsKICAgICB9IGVsc2UgewotICAgICAgICB3ZWlnaHQgPSBwU3Vic3RGb250ID8gcFN1YnN0Rm9udC0+bV9XZWlnaHQgOiAwOworICAgICAgc2tldyA9IHBTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGU7CiAgICAgfQotICAgIGlmIChwU3Vic3RGb250ICYmICEocFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSAmJiB3ZWlnaHQgPiA0MDApIHsKLSAgICAgICAgaW50IGluZGV4ID0gKHdlaWdodCAtIDQwMCkgLyAxMDsKLSAgICAgICAgaWYgKGluZGV4ID49IFdFSUdIVFBPV19BUlJBWV9TSVpFKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpbnQgbGV2ZWwgPSAwOwotICAgICAgICBpZiAocFN1YnN0Rm9udC0+bV9DaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKSB7Ci0gICAgICAgICAgICBsZXZlbCA9IGdfV2VpZ2h0UG93X1NISUZUSklTW2luZGV4XSAqIDIgKiAoRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eCkpICsgRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eSkpKSAvIDM2NjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGV2ZWwgPSBnX1dlaWdodFBvd18xMVtpbmRleF0gKiAoRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eCkpICsgRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eSkpKSAvIDM2NjU1OwotICAgICAgICB9Ci0gICAgICAgIEZYRlRfT3V0bGluZV9FbWJvbGRlbihGWEZUX0dldF9HbHlwaF9PdXRsaW5lKG1fRmFjZSksIGxldmVsKTsKKyAgICBpZiAoc2tldykgeworICAgICAgc2tldyA9IHNrZXcgPD0gLUFOR0xFU0tFV19BUlJBWV9TSVpFID8gLTU4IDogLWdfQW5nbGVTa2V3Wy1za2V3XTsKKyAgICAgIGlmIChwRm9udC0+SXNWZXJ0aWNhbCgpKSB7CisgICAgICAgIGZ0X21hdHJpeC55eCArPSBmdF9tYXRyaXgueXkgKiBza2V3IC8gMTAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnRfbWF0cml4Lnh5ICs9IC1mdF9tYXRyaXgueHggKiBza2V3IC8gMTAwOworICAgICAgfQogICAgIH0KLSAgICBGWEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnksIEZUX0xDRF9GSUxURVJfREVGQVVMVCk7Ci0gICAgZXJyb3IgPSBGWEZUX1JlbmRlcl9HbHlwaChtX0ZhY2UsIGFudGlfYWxpYXMpOworICAgIGlmIChwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfTU0pIHsKKyAgICAgIHBGb250LT5BZGp1c3RNTVBhcmFtcyhnbHlwaF9pbmRleCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0KTsKKyAgICB9CisgIH0KKyAgRlhGVF9TZXRfVHJhbnNmb3JtKG1fRmFjZSwgJmZ0X21hdHJpeCwgMCk7CisgIGludCBsb2FkX2ZsYWdzID0gKG1fRmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UKQorICAgICAgICAgICAgICAgICAgICAgICA/IEZYRlRfTE9BRF9OT19CSVRNQVAKKyAgICAgICAgICAgICAgICAgICAgICAgOiAoRlhGVF9MT0FEX05PX0JJVE1BUCB8IEZUX0xPQURfTk9fSElOVElORyk7CisgIGludCBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzKTsKKyAgaWYgKGVycm9yKSB7CisgICAgLy8gaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIHRyeSB0byByZWxvYWQgZ2x5cGhzIHdpdGhvdXQgaGludGluZy4KKyAgICBpZiAobG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyB8fCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0hJTlRJTkc7CisgICAgZXJyb3IgPSBGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyk7CisKICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaW50IGJtd2lkdGggPSBGWEZUX0dldF9CaXRtYXBfV2lkdGgoRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpOwotICAgIGludCBibWhlaWdodCA9IEZYRlRfR2V0X0JpdG1hcF9Sb3dzKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKTsKLSAgICBpZiAoYm13aWR0aCA+IDIwNDggfHwgYm1oZWlnaHQgPiAyMDQ4KSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICB9CisgIGludCB3ZWlnaHQgPSAwOworICBpZiAoYlVzZUNKS1N1YkZvbnQpIHsKKyAgICB3ZWlnaHQgPSBwU3Vic3RGb250LT5tX1dlaWdodENKSzsKKyAgfSBlbHNlIHsKKyAgICB3ZWlnaHQgPSBwU3Vic3RGb250ID8gcFN1YnN0Rm9udC0+bV9XZWlnaHQgOiAwOworICB9CisgIGlmIChwU3Vic3RGb250ICYmICEocFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSAmJgorICAgICAgd2VpZ2h0ID4gNDAwKSB7CisgICAgaW50IGluZGV4ID0gKHdlaWdodCAtIDQwMCkgLyAxMDsKKyAgICBpZiAoaW5kZXggPj0gV0VJR0hUUE9XX0FSUkFZX1NJWkUpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpbnQgZGliX3dpZHRoID0gYm13aWR0aDsKLSAgICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcCA9IEZYX05FVyBDRlhfR2x5cGhCaXRtYXA7Ci0gICAgaWYgKCFwR2x5cGhCaXRtYXApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBHbHlwaEJpdG1hcC0+bV9CaXRtYXAuQ3JlYXRlKGRpYl93aWR0aCwgYm1oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX01PTk8gPyBGWERJQl8xYnBwTWFzayA6IEZYRElCXzhicHBNYXNrKTsKLSAgICBwR2x5cGhCaXRtYXAtPm1fTGVmdCA9IEZYRlRfR2V0X0dseXBoX0JpdG1hcExlZnQobV9GYWNlKTsKLSAgICBwR2x5cGhCaXRtYXAtPm1fVG9wID0gRlhGVF9HZXRfR2x5cGhfQml0bWFwVG9wKG1fRmFjZSk7Ci0gICAgaW50IGRlc3RfcGl0Y2ggPSBwR2x5cGhCaXRtYXAtPm1fQml0bWFwLkdldFBpdGNoKCk7Ci0gICAgaW50IHNyY19waXRjaCA9IEZYRlRfR2V0X0JpdG1hcF9QaXRjaChGWEZUX0dldF9HbHlwaF9CaXRtYXAobV9GYWNlKSk7Ci0gICAgdWludDhfdCogcERlc3RCdWYgPSBwR2x5cGhCaXRtYXAtPm1fQml0bWFwLkdldEJ1ZmZlcigpOwotICAgIHVpbnQ4X3QqIHBTcmNCdWYgPSAodWludDhfdCopRlhGVF9HZXRfQml0bWFwX0J1ZmZlcihGWEZUX0dldF9HbHlwaF9CaXRtYXAobV9GYWNlKSk7Ci0gICAgaWYgKGFudGlfYWxpYXMgIT0gRlhGVF9SRU5ERVJfTU9ERV9NT05PICYmIEZYRlRfR2V0X0JpdG1hcF9QaXhlbE1vZGUoRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpID09IEZYRlRfUElYRUxfTU9ERV9NT05PKSB7Ci0gICAgICAgIGludCBieXRlcyA9IGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9MQ0QgPyAzIDogMTsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGJtaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICBmb3IoaW50IG4gPSAwOyBuIDwgYm13aWR0aDsgbisrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBkYXRhID0gKHBTcmNCdWZbaSAqIHNyY19waXRjaCArIG4gLyA4XSAmICgweDgwID4+IChuICUgOCkpKSA/IDI1NSA6IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBieXRlczsgYiArKykgewotICAgICAgICAgICAgICAgICAgICBwRGVzdEJ1ZltpICogZGVzdF9waXRjaCArIG4gKiBieXRlcyArIGJdID0gZGF0YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgaW50IGxldmVsID0gMDsKKyAgICBpZiAocFN1YnN0Rm9udC0+bV9DaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKSB7CisgICAgICBsZXZlbCA9CisgICAgICAgICAgZ19XZWlnaHRQb3dfU0hJRlRKSVNbaW5kZXhdICogMiAqCisgICAgICAgICAgKEZYU1lTX2FicygoaW50KShmdF9tYXRyaXgueHgpKSArIEZYU1lTX2FicygoaW50KShmdF9tYXRyaXgueHkpKSkgLworICAgICAgICAgIDM2NjU1OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYU1lTX21lbXNldChwRGVzdEJ1ZiwgMCwgZGVzdF9waXRjaCAqIGJtaGVpZ2h0KTsKLSAgICAgICAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9NT05PICYmIEZYRlRfR2V0X0JpdG1hcF9QaXhlbE1vZGUoRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpID09IEZYRlRfUElYRUxfTU9ERV9NT05PKSB7Ci0gICAgICAgICAgICBpbnQgcm93Ynl0ZXMgPSBGWFNZU19hYnMoc3JjX3BpdGNoKSA+IGRlc3RfcGl0Y2ggPyBkZXN0X3BpdGNoIDogRlhTWVNfYWJzKHNyY19waXRjaCk7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBibWhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHBEZXN0QnVmICsgcm93ICogZGVzdF9waXRjaCwgcFNyY0J1ZiArIHJvdyAqIHNyY19waXRjaCwgcm93Ynl0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX0NvbnRyYXN0QWRqdXN0KHBTcmNCdWYsIHBEZXN0QnVmLCBibXdpZHRoLCBibWhlaWdodCwgc3JjX3BpdGNoLCBkZXN0X3BpdGNoKTsKLSAgICAgICAgICAgIF9HYW1tYUFkanVzdChwRGVzdEJ1ZiwgYm13aWR0aCwgYm1oZWlnaHQsIGRlc3RfcGl0Y2gsIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFRleHRHYW1tYVRhYmxlKCkpOworICAgICAgbGV2ZWwgPSBnX1dlaWdodFBvd18xMVtpbmRleF0gKiAoRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2FicygoaW50KShmdF9tYXRyaXgueHkpKSkgLworICAgICAgICAgICAgICAzNjY1NTsKKyAgICB9CisgICAgRlhGVF9PdXRsaW5lX0VtYm9sZGVuKEZYRlRfR2V0X0dseXBoX091dGxpbmUobV9GYWNlKSwgbGV2ZWwpOworICB9CisgIEZYRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIoQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MQ0RfRklMVEVSX0RFRkFVTFQpOworICBlcnJvciA9IEZYRlRfUmVuZGVyX0dseXBoKG1fRmFjZSwgYW50aV9hbGlhcyk7CisgIGlmIChlcnJvcikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGludCBibXdpZHRoID0gRlhGVF9HZXRfQml0bWFwX1dpZHRoKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKTsKKyAgaW50IGJtaGVpZ2h0ID0gRlhGVF9HZXRfQml0bWFwX1Jvd3MoRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpOworICBpZiAoYm13aWR0aCA+IDIwNDggfHwgYm1oZWlnaHQgPiAyMDQ4KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IGRpYl93aWR0aCA9IGJtd2lkdGg7CisgIENGWF9HbHlwaEJpdG1hcCogcEdseXBoQml0bWFwID0gRlhfTkVXIENGWF9HbHlwaEJpdG1hcDsKKyAgaWYgKCFwR2x5cGhCaXRtYXApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwR2x5cGhCaXRtYXAtPm1fQml0bWFwLkNyZWF0ZSgKKyAgICAgIGRpYl93aWR0aCwgYm1oZWlnaHQsCisgICAgICBhbnRpX2FsaWFzID09IEZYRlRfUkVOREVSX01PREVfTU9OTyA/IEZYRElCXzFicHBNYXNrIDogRlhESUJfOGJwcE1hc2spOworICBwR2x5cGhCaXRtYXAtPm1fTGVmdCA9IEZYRlRfR2V0X0dseXBoX0JpdG1hcExlZnQobV9GYWNlKTsKKyAgcEdseXBoQml0bWFwLT5tX1RvcCA9IEZYRlRfR2V0X0dseXBoX0JpdG1hcFRvcChtX0ZhY2UpOworICBpbnQgZGVzdF9waXRjaCA9IHBHbHlwaEJpdG1hcC0+bV9CaXRtYXAuR2V0UGl0Y2goKTsKKyAgaW50IHNyY19waXRjaCA9IEZYRlRfR2V0X0JpdG1hcF9QaXRjaChGWEZUX0dldF9HbHlwaF9CaXRtYXAobV9GYWNlKSk7CisgIHVpbnQ4X3QqIHBEZXN0QnVmID0gcEdseXBoQml0bWFwLT5tX0JpdG1hcC5HZXRCdWZmZXIoKTsKKyAgdWludDhfdCogcFNyY0J1ZiA9CisgICAgICAodWludDhfdCopRlhGVF9HZXRfQml0bWFwX0J1ZmZlcihGWEZUX0dldF9HbHlwaF9CaXRtYXAobV9GYWNlKSk7CisgIGlmIChhbnRpX2FsaWFzICE9IEZYRlRfUkVOREVSX01PREVfTU9OTyAmJgorICAgICAgRlhGVF9HZXRfQml0bWFwX1BpeGVsTW9kZShGWEZUX0dldF9HbHlwaF9CaXRtYXAobV9GYWNlKSkgPT0KKyAgICAgICAgICBGWEZUX1BJWEVMX01PREVfTU9OTykgeworICAgIGludCBieXRlcyA9IGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9MQ0QgPyAzIDogMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJtaGVpZ2h0OyBpKyspCisgICAgICBmb3IgKGludCBuID0gMDsgbiA8IGJtd2lkdGg7IG4rKykgeworICAgICAgICB1aW50OF90IGRhdGEgPQorICAgICAgICAgICAgKHBTcmNCdWZbaSAqIHNyY19waXRjaCArIG4gLyA4XSAmICgweDgwID4+IChuICUgOCkpKSA/IDI1NSA6IDA7CisgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgYnl0ZXM7IGIrKykgeworICAgICAgICAgIHBEZXN0QnVmW2kgKiBkZXN0X3BpdGNoICsgbiAqIGJ5dGVzICsgYl0gPSBkYXRhOwogICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwR2x5cGhCaXRtYXA7Ci19Ci1GWF9CT09MIF9PdXRwdXRHbHlwaCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgaW50IGdseXBoX2luZGV4LCBGWF9BUkdCIGFyZ2IpCi17Ci0gICAgQ0ZYX0RJQml0bWFwKiBwRGliID0gKENGWF9ESUJpdG1hcCopZGliOwotICAgIEZYRlRfRmFjZSBmYWNlID0gcEZvbnQtPkdldEZhY2UoKTsKLSAgICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfR2x5cGgoZmFjZSwgZ2x5cGhfaW5kZXgsIEZYRlRfTE9BRF9OT19CSVRNQVApOwotICAgIGlmIChlcnJvcikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGVycm9yID0gRlhGVF9SZW5kZXJfR2x5cGgoZmFjZSwgRlhGVF9SRU5ERVJfTU9ERV9OT1JNQUwpOwotICAgIGlmIChlcnJvcikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBibXdpZHRoID0gRlhGVF9HZXRfQml0bWFwX1dpZHRoKEZYRlRfR2V0X0dseXBoX0JpdG1hcChmYWNlKSk7Ci0gICAgaW50IGJtaGVpZ2h0ID0gRlhGVF9HZXRfQml0bWFwX1Jvd3MoRlhGVF9HZXRfR2x5cGhfQml0bWFwKGZhY2UpKTsKLSAgICBpbnQgbGVmdCA9IEZYRlRfR2V0X0dseXBoX0JpdG1hcExlZnQoZmFjZSk7Ci0gICAgaW50IHRvcCA9IEZYRlRfR2V0X0dseXBoX0JpdG1hcFRvcChmYWNlKTsKLSAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmID0gKGNvbnN0IHVpbnQ4X3QqKUZYRlRfR2V0X0JpdG1hcF9CdWZmZXIoRlhGVF9HZXRfR2x5cGhfQml0bWFwKGZhY2UpKTsKLSAgICBpbnQgc3JjX3BpdGNoID0gRlhGVF9HZXRfQml0bWFwX1BpdGNoKEZYRlRfR2V0X0dseXBoX0JpdG1hcChmYWNlKSk7Ci0gICAgQ0ZYX0RJQml0bWFwIG1hc2s7Ci0gICAgbWFzay5DcmVhdGUoYm13aWR0aCwgYm1oZWlnaHQsIEZYRElCXzhicHBNYXNrKTsKLSAgICB1aW50OF90KiBkZXN0X2J1ZiA9IG1hc2suR2V0QnVmZmVyKCk7Ci0gICAgaW50IGRlc3RfcGl0Y2ggPSBtYXNrLkdldFBpdGNoKCk7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgYm1oZWlnaHQ7IHJvdyArKykgewotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHNyY19idWYgKyByb3cgKiBzcmNfcGl0Y2g7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGRlc3RfcGl0Y2gpOwotICAgIH0KLSAgICBwRGliLT5Db21wb3NpdGVNYXNrKHggKyBsZWZ0LCB5IC0gdG9wLCBibXdpZHRoLCBibWhlaWdodCwgJm1hc2ssIGFyZ2IsIDAsIDApOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBPdXRwdXRUZXh0KHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsIGRvdWJsZSBmb250X3NpemUsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRfbWF0cml4LCB1bnNpZ25lZCBzaG9ydCBjb25zdCogdGV4dCwgdW5zaWduZWQgbG9uZyBhcmdiKQotewotICAgIGlmICghcEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWEZUX0ZhY2UgZmFjZSA9IHBGb250LT5HZXRGYWNlKCk7Ci0gICAgRlhGVF9TZWxlY3RfQ2hhcm1hcChwRm9udC0+bV9GYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpOwotICAgIGlmIChwVGV4dF9tYXRyaXgpIHsKLSAgICAgICAgRlhGVF9NYXRyaXggIGZ0X21hdHJpeDsKLSAgICAgICAgZnRfbWF0cml4Lnh4ID0gKHNpZ25lZCBsb25nKShwVGV4dF9tYXRyaXgtPmEgLyA2NCAqIDY1NTM2KTsKLSAgICAgICAgZnRfbWF0cml4Lnh5ID0gKHNpZ25lZCBsb25nKShwVGV4dF9tYXRyaXgtPmMgLyA2NCAqIDY1NTM2KTsKLSAgICAgICAgZnRfbWF0cml4Lnl4ID0gKHNpZ25lZCBsb25nKShwVGV4dF9tYXRyaXgtPmIgLyA2NCAqIDY1NTM2KTsKLSAgICAgICAgZnRfbWF0cml4Lnl5ID0gKHNpZ25lZCBsb25nKShwVGV4dF9tYXRyaXgtPmQgLyA2NCAqIDY1NTM2KTsKLSAgICAgICAgRlhGVF9TZXRfVHJhbnNmb3JtKGZhY2UsICZmdF9tYXRyaXgsIDApOwotICAgIH0KLSAgICBGWF9GTE9BVCB4X3BvcyA9IDA7Ci0gICAgZm9yICg7ICp0ZXh0ICE9IDA7IHRleHQgKyspIHsKLSAgICAgICAgRlhfV0NIQVIgdW5pY29kZSA9ICp0ZXh0OwotICAgICAgICBpbnQgZ2x5cGhfaW5kZXggPSBGWEZUX0dldF9DaGFyX0luZGV4KHBGb250LT5tX0ZhY2UsIHVuaWNvZGUpOwotICAgICAgICBpZiAoZ2x5cGhfaW5kZXggPD0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGVyciA9IEZYRlRfTG9hZF9HbHlwaChwRm9udC0+bV9GYWNlLCBnbHlwaF9pbmRleCwgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7Ci0gICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCB3ID0gRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UocEZvbnQtPm1fRmFjZSk7Ci0gICAgICAgIGludCBlbSA9IEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShwRm9udC0+bV9GYWNlKTsKLSAgICAgICAgRlhfRkxPQVQgeDEsIHkxOwotICAgICAgICBwVGV4dF9tYXRyaXgtPlRyYW5zZm9ybSh4X3BvcywgMCwgeDEsIHkxKTsKLSAgICAgICAgX091dHB1dEdseXBoKGRpYiwgKGludCl4MSArIHgsIChpbnQpIC0geTEgKyB5LCBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBhcmdiKTsKLSAgICAgICAgeF9wb3MgKz0gKEZYX0ZMT0FUKXcgLyBlbTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIE91dHB1dEdseXBoKHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsIGRvdWJsZSBmb250X3NpemUsCi0gICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIHVuc2lnbmVkIGxvbmcgZ2x5cGhfaW5kZXgsIHVuc2lnbmVkIGxvbmcgYXJnYikKLXsKLSAgICBGWEZUX01hdHJpeCAgZnRfbWF0cml4OwotICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgIGZ0X21hdHJpeC54eCA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+YSAqIGZvbnRfc2l6ZSAvIDY0ICogNjU1MzYpOwotICAgICAgICBmdF9tYXRyaXgueHkgPSAoc2lnbmVkIGxvbmcpKHBNYXRyaXgtPmMgKiBmb250X3NpemUgLyA2NCAqIDY1NTM2KTsKLSAgICAgICAgZnRfbWF0cml4Lnl4ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5iICogZm9udF9zaXplIC8gNjQgKiA2NTUzNik7Ci0gICAgICAgIGZ0X21hdHJpeC55eSA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+ZCAqIGZvbnRfc2l6ZSAvIDY0ICogNjU1MzYpOworICAgICAgfQorICB9IGVsc2UgeworICAgIEZYU1lTX21lbXNldChwRGVzdEJ1ZiwgMCwgZGVzdF9waXRjaCAqIGJtaGVpZ2h0KTsKKyAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX01PTk8gJiYKKyAgICAgICAgRlhGVF9HZXRfQml0bWFwX1BpeGVsTW9kZShGWEZUX0dldF9HbHlwaF9CaXRtYXAobV9GYWNlKSkgPT0KKyAgICAgICAgICAgIEZYRlRfUElYRUxfTU9ERV9NT05PKSB7CisgICAgICBpbnQgcm93Ynl0ZXMgPQorICAgICAgICAgIEZYU1lTX2FicyhzcmNfcGl0Y2gpID4gZGVzdF9waXRjaCA/IGRlc3RfcGl0Y2ggOiBGWFNZU19hYnMoc3JjX3BpdGNoKTsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGJtaGVpZ2h0OyByb3crKykgeworICAgICAgICBGWFNZU19tZW1jcHkocERlc3RCdWYgKyByb3cgKiBkZXN0X3BpdGNoLCBwU3JjQnVmICsgcm93ICogc3JjX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgcm93Ynl0ZXMpOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZ0X21hdHJpeC54eCA9IChzaWduZWQgbG9uZykoZm9udF9zaXplIC8gNjQgKiA2NTUzNik7Ci0gICAgICAgIGZ0X21hdHJpeC54eSA9IGZ0X21hdHJpeC55eCA9IDA7Ci0gICAgICAgIGZ0X21hdHJpeC55eSA9IChzaWduZWQgbG9uZykoZm9udF9zaXplIC8gNjQgKiA2NTUzNik7CisgICAgICBfQ29udHJhc3RBZGp1c3QocFNyY0J1ZiwgcERlc3RCdWYsIGJtd2lkdGgsIGJtaGVpZ2h0LCBzcmNfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdF9waXRjaCk7CisgICAgICBfR2FtbWFBZGp1c3QocERlc3RCdWYsIGJtd2lkdGgsIGJtaGVpZ2h0LCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFRleHRHYW1tYVRhYmxlKCkpOwogICAgIH0KLSAgICBGWEZUX1NldF9UcmFuc2Zvcm0ocEZvbnQtPm1fRmFjZSwgJmZ0X21hdHJpeCwgMCk7Ci0gICAgRlhfQk9PTCByZXQgPSBfT3V0cHV0R2x5cGgoZGliLCB4LCB5LCBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgYXJnYik7Ci0gICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gcEdseXBoQml0bWFwOwogfQotY29uc3QgQ0ZYX1BhdGhEYXRhKiBDRlhfRmFjZUNhY2hlOjpMb2FkR2x5cGhQYXRoKENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIGludCBkZXN0X3dpZHRoKQotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCB8fCBnbHlwaF9pbmRleCA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICByZXR1cm4gTlVMTDsKK0ZYX0JPT0wgX091dHB1dEdseXBoKHZvaWQqIGRpYiwKKyAgICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IpIHsKKyAgQ0ZYX0RJQml0bWFwKiBwRGliID0gKENGWF9ESUJpdG1hcCopZGliOworICBGWEZUX0ZhY2UgZmFjZSA9IHBGb250LT5HZXRGYWNlKCk7CisgIGludCBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChmYWNlLCBnbHlwaF9pbmRleCwgRlhGVF9MT0FEX05PX0JJVE1BUCk7CisgIGlmIChlcnJvcikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBlcnJvciA9IEZYRlRfUmVuZGVyX0dseXBoKGZhY2UsIEZYRlRfUkVOREVSX01PREVfTk9STUFMKTsKKyAgaWYgKGVycm9yKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBibXdpZHRoID0gRlhGVF9HZXRfQml0bWFwX1dpZHRoKEZYRlRfR2V0X0dseXBoX0JpdG1hcChmYWNlKSk7CisgIGludCBibWhlaWdodCA9IEZYRlRfR2V0X0JpdG1hcF9Sb3dzKEZYRlRfR2V0X0dseXBoX0JpdG1hcChmYWNlKSk7CisgIGludCBsZWZ0ID0gRlhGVF9HZXRfR2x5cGhfQml0bWFwTGVmdChmYWNlKTsKKyAgaW50IHRvcCA9IEZYRlRfR2V0X0dseXBoX0JpdG1hcFRvcChmYWNlKTsKKyAgY29uc3QgdWludDhfdCogc3JjX2J1ZiA9CisgICAgICAoY29uc3QgdWludDhfdCopRlhGVF9HZXRfQml0bWFwX0J1ZmZlcihGWEZUX0dldF9HbHlwaF9CaXRtYXAoZmFjZSkpOworICBpbnQgc3JjX3BpdGNoID0gRlhGVF9HZXRfQml0bWFwX1BpdGNoKEZYRlRfR2V0X0dseXBoX0JpdG1hcChmYWNlKSk7CisgIENGWF9ESUJpdG1hcCBtYXNrOworICBtYXNrLkNyZWF0ZShibXdpZHRoLCBibWhlaWdodCwgRlhESUJfOGJwcE1hc2spOworICB1aW50OF90KiBkZXN0X2J1ZiA9IG1hc2suR2V0QnVmZmVyKCk7CisgIGludCBkZXN0X3BpdGNoID0gbWFzay5HZXRQaXRjaCgpOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBibWhlaWdodDsgcm93KyspIHsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHNyY19idWYgKyByb3cgKiBzcmNfcGl0Y2g7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBkZXN0X3BpdGNoKTsKKyAgfQorICBwRGliLT5Db21wb3NpdGVNYXNrKHggKyBsZWZ0LCB5IC0gdG9wLCBibXdpZHRoLCBibWhlaWdodCwgJm1hc2ssIGFyZ2IsIDAsIDApOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgT3V0cHV0VGV4dCh2b2lkKiBkaWIsCisgICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRfbWF0cml4LAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGNvbnN0KiB0ZXh0LAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYikgeworICBpZiAoIXBGb250KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYRlRfRmFjZSBmYWNlID0gcEZvbnQtPkdldEZhY2UoKTsKKyAgRlhGVF9TZWxlY3RfQ2hhcm1hcChwRm9udC0+bV9GYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpOworICBpZiAocFRleHRfbWF0cml4KSB7CisgICAgRlhGVF9NYXRyaXggZnRfbWF0cml4OworICAgIGZ0X21hdHJpeC54eCA9IChzaWduZWQgbG9uZykocFRleHRfbWF0cml4LT5hIC8gNjQgKiA2NTUzNik7CisgICAgZnRfbWF0cml4Lnh5ID0gKHNpZ25lZCBsb25nKShwVGV4dF9tYXRyaXgtPmMgLyA2NCAqIDY1NTM2KTsKKyAgICBmdF9tYXRyaXgueXggPSAoc2lnbmVkIGxvbmcpKHBUZXh0X21hdHJpeC0+YiAvIDY0ICogNjU1MzYpOworICAgIGZ0X21hdHJpeC55eSA9IChzaWduZWQgbG9uZykocFRleHRfbWF0cml4LT5kIC8gNjQgKiA2NTUzNik7CisgICAgRlhGVF9TZXRfVHJhbnNmb3JtKGZhY2UsICZmdF9tYXRyaXgsIDApOworICB9CisgIEZYX0ZMT0FUIHhfcG9zID0gMDsKKyAgZm9yICg7ICp0ZXh0ICE9IDA7IHRleHQrKykgeworICAgIEZYX1dDSEFSIHVuaWNvZGUgPSAqdGV4dDsKKyAgICBpbnQgZ2x5cGhfaW5kZXggPSBGWEZUX0dldF9DaGFyX0luZGV4KHBGb250LT5tX0ZhY2UsIHVuaWNvZGUpOworICAgIGlmIChnbHlwaF9pbmRleCA8PSAwKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgQ0ZYX1BhdGhEYXRhKiBwR2x5cGhQYXRoID0gTlVMTDsKLSAgICB2b2lkKiBrZXk7Ci0gICAgaWYgKHBGb250LT5HZXRTdWJzdEZvbnQoKSkKLSAgICAgICAga2V5ID0gKHZvaWQqKSh1aW50cHRyX3QpKGdseXBoX2luZGV4ICsgKChwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0IC8gMTYpIDw8IDE1KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0l0YWxpY0FuZ2xlIC8gMikgPDwgMjEpICsgKChkZXN0X3dpZHRoIC8gMTYpIDw8IDI1KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRm9udC0+SXNWZXJ0aWNhbCgpIDw8IDMxKSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGtleSA9ICh2b2lkKikodWludHB0cl90KWdseXBoX2luZGV4OworICAgIGludCBlcnIgPSBGWEZUX0xvYWRfR2x5cGgoCisgICAgICAgIHBGb250LT5tX0ZhY2UsIGdseXBoX2luZGV4LAorICAgICAgICBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKG1fUGF0aE1hcC5Mb29rdXAoa2V5LCAodm9pZComKXBHbHlwaFBhdGgpKSB7Ci0gICAgICAgIHJldHVybiBwR2x5cGhQYXRoOwotICAgIH0KLSAgICBwR2x5cGhQYXRoID0gcEZvbnQtPkxvYWRHbHlwaFBhdGgoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgpOwotICAgIG1fUGF0aE1hcC5TZXRBdChrZXksIHBHbHlwaFBhdGgpOworICAgIGludCB3ID0gRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UocEZvbnQtPm1fRmFjZSk7CisgICAgaW50IGVtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKHBGb250LT5tX0ZhY2UpOworICAgIEZYX0ZMT0FUIHgxLCB5MTsKKyAgICBwVGV4dF9tYXRyaXgtPlRyYW5zZm9ybSh4X3BvcywgMCwgeDEsIHkxKTsKKyAgICBfT3V0cHV0R2x5cGgoZGliLCAoaW50KXgxICsgeCwgKGludCkteTEgKyB5LCBwRm9udCwgZ2x5cGhfaW5kZXgsIGFyZ2IpOworICAgIHhfcG9zICs9IChGWF9GTE9BVCl3IC8gZW07CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIE91dHB1dEdseXBoKHZvaWQqIGRpYiwKKyAgICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYikgeworICBGWEZUX01hdHJpeCBmdF9tYXRyaXg7CisgIGlmIChwTWF0cml4KSB7CisgICAgZnRfbWF0cml4Lnh4ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5hICogZm9udF9zaXplIC8gNjQgKiA2NTUzNik7CisgICAgZnRfbWF0cml4Lnh5ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5jICogZm9udF9zaXplIC8gNjQgKiA2NTUzNik7CisgICAgZnRfbWF0cml4Lnl4ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5iICogZm9udF9zaXplIC8gNjQgKiA2NTUzNik7CisgICAgZnRfbWF0cml4Lnl5ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5kICogZm9udF9zaXplIC8gNjQgKiA2NTUzNik7CisgIH0gZWxzZSB7CisgICAgZnRfbWF0cml4Lnh4ID0gKHNpZ25lZCBsb25nKShmb250X3NpemUgLyA2NCAqIDY1NTM2KTsKKyAgICBmdF9tYXRyaXgueHkgPSBmdF9tYXRyaXgueXggPSAwOworICAgIGZ0X21hdHJpeC55eSA9IChzaWduZWQgbG9uZykoZm9udF9zaXplIC8gNjQgKiA2NTUzNik7CisgIH0KKyAgRlhGVF9TZXRfVHJhbnNmb3JtKHBGb250LT5tX0ZhY2UsICZmdF9tYXRyaXgsIDApOworICBGWF9CT09MIHJldCA9IF9PdXRwdXRHbHlwaChkaWIsIHgsIHksIHBGb250LCBnbHlwaF9pbmRleCwgYXJnYik7CisgIHJldHVybiByZXQ7Cit9Citjb25zdCBDRlhfUGF0aERhdGEqIENGWF9GYWNlQ2FjaGU6OkxvYWRHbHlwaFBhdGgoQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoKSB7CisgIGlmIChtX0ZhY2UgPT0gTlVMTCB8fCBnbHlwaF9pbmRleCA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfUGF0aERhdGEqIHBHbHlwaFBhdGggPSBOVUxMOworICB2b2lkKiBrZXk7CisgIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpCisgICAga2V5ID0gKHZvaWQqKSh1aW50cHRyX3QpKAorICAgICAgICBnbHlwaF9pbmRleCArICgocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCAvIDE2KSA8PCAxNSkgKworICAgICAgICAoKHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSAvIDIpIDw8IDIxKSArCisgICAgICAgICgoZGVzdF93aWR0aCAvIDE2KSA8PCAyNSkgKyAocEZvbnQtPklzVmVydGljYWwoKSA8PCAzMSkpOworICBlbHNlIHsKKyAgICBrZXkgPSAodm9pZCopKHVpbnRwdHJfdClnbHlwaF9pbmRleDsKKyAgfQorICBpZiAobV9QYXRoTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcEdseXBoUGF0aCkpIHsKICAgICByZXR1cm4gcEdseXBoUGF0aDsKKyAgfQorICBwR2x5cGhQYXRoID0gcEZvbnQtPkxvYWRHbHlwaFBhdGgoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgpOworICBtX1BhdGhNYXAuU2V0QXQoa2V5LCBwR2x5cGhQYXRoKTsKKyAgcmV0dXJuIHBHbHlwaFBhdGg7CiB9CiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgRlhfQk9PTAkJCW1fYkNvdW50OwotICAgIGludAkJCQltX1BvaW50Q291bnQ7Ci0gICAgRlhfUEFUSFBPSU5UKgltX3BQb2ludHM7Ci0gICAgaW50CQkJCW1fQ3VyWDsKLSAgICBpbnQJCQkJbV9DdXJZOwotICAgIEZYX0ZMT0FUCQltX0Nvb3JkVW5pdDsKKyAgRlhfQk9PTCBtX2JDb3VudDsKKyAgaW50IG1fUG9pbnRDb3VudDsKKyAgRlhfUEFUSFBPSU5UKiBtX3BQb2ludHM7CisgIGludCBtX0N1clg7CisgIGludCBtX0N1clk7CisgIEZYX0ZMT0FUIG1fQ29vcmRVbml0OwogfSBPVVRMSU5FX1BBUkFNUzsKLXZvaWQgX091dGxpbmVfQ2hlY2tFbXB0eUNvbnRvdXIoT1VUTElORV9QQVJBTVMqIHBhcmFtKQotewotICAgIGlmIChwYXJhbS0+bV9Qb2ludENvdW50ID49IDIgJiYgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gMl0ubV9GbGFnID09IEZYUFRfTU9WRVRPICYmCi0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAyXS5tX1BvaW50WCA9PSBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAxXS5tX1BvaW50WCAmJgotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gMl0ubV9Qb2ludFkgPT0gcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gMV0ubV9Qb2ludFkpIHsKLSAgICAgICAgcGFyYW0tPm1fUG9pbnRDb3VudCAtPSAyOwotICAgIH0KLSAgICBpZiAocGFyYW0tPm1fUG9pbnRDb3VudCA+PSA0ICYmIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fRmxhZyA9PSBGWFBUX01PVkVUTyAmJgotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gM10ubV9GbGFnID09IEZYUFRfQkVaSUVSVE8gJiYKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDNdLm1fUG9pbnRYID09IHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fUG9pbnRYICYmCi0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAzXS5tX1BvaW50WSA9PSBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSA0XS5tX1BvaW50WSAmJgotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gMl0ubV9Qb2ludFggPT0gcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gNF0ubV9Qb2ludFggJiYKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDJdLm1fUG9pbnRZID09IHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fUG9pbnRZICYmCi0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAxXS5tX1BvaW50WCA9PSBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSA0XS5tX1BvaW50WCAmJgotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gMV0ubV9Qb2ludFkgPT0gcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gNF0ubV9Qb2ludFkpIHsKLSAgICAgICAgcGFyYW0tPm1fUG9pbnRDb3VudCAtPSA0OwotICAgIH0KK3ZvaWQgX091dGxpbmVfQ2hlY2tFbXB0eUNvbnRvdXIoT1VUTElORV9QQVJBTVMqIHBhcmFtKSB7CisgIGlmIChwYXJhbS0+bV9Qb2ludENvdW50ID49IDIgJiYKKyAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDJdLm1fRmxhZyA9PSBGWFBUX01PVkVUTyAmJgorICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gMl0ubV9Qb2ludFggPT0KKyAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAxXS5tX1BvaW50WCAmJgorICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gMl0ubV9Qb2ludFkgPT0KKyAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAxXS5tX1BvaW50WSkgeworICAgIHBhcmFtLT5tX1BvaW50Q291bnQgLT0gMjsKKyAgfQorICBpZiAocGFyYW0tPm1fUG9pbnRDb3VudCA+PSA0ICYmCisgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSA0XS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8gJiYKKyAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDNdLm1fRmxhZyA9PSBGWFBUX0JFWklFUlRPICYmCisgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAzXS5tX1BvaW50WCA9PQorICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fUG9pbnRYICYmCisgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAzXS5tX1BvaW50WSA9PQorICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fUG9pbnRZICYmCisgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAyXS5tX1BvaW50WCA9PQorICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fUG9pbnRYICYmCisgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAyXS5tX1BvaW50WSA9PQorICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fUG9pbnRZICYmCisgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAxXS5tX1BvaW50WCA9PQorICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fUG9pbnRYICYmCisgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAxXS5tX1BvaW50WSA9PQorICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fUG9pbnRZKSB7CisgICAgcGFyYW0tPm1fUG9pbnRDb3VudCAtPSA0OworICB9CiB9CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IF9PdXRsaW5lX01vdmVUbyhjb25zdCBGWEZUX1ZlY3RvciogdG8sIHZvaWQqIHVzZXIpCi0gICAgewotICAgICAgICBPVVRMSU5FX1BBUkFNUyogcGFyYW0gPSAoT1VUTElORV9QQVJBTVMqKXVzZXI7Ci0gICAgICAgIGlmICghcGFyYW0tPm1fYkNvdW50KSB7Ci0gICAgICAgICAgICBfT3V0bGluZV9DaGVja0VtcHR5Q29udG91cihwYXJhbSk7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRYID0gdG8tPnggLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRZID0gdG8tPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fRmxhZyA9IEZYUFRfTU9WRVRPOwotICAgICAgICAgICAgcGFyYW0tPm1fQ3VyWCA9IHRvLT54OwotICAgICAgICAgICAgcGFyYW0tPm1fQ3VyWSA9IHRvLT55OwotICAgICAgICAgICAgaWYgKHBhcmFtLT5tX1BvaW50Q291bnQpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAxXS5tX0ZsYWcgfD0gRlhQVF9DTE9TRUZJR1VSRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwYXJhbS0+bV9Qb2ludENvdW50ICsrOwotICAgICAgICByZXR1cm4gMDsKK3N0YXRpYyBpbnQgX091dGxpbmVfTW92ZVRvKGNvbnN0IEZYRlRfVmVjdG9yKiB0bywgdm9pZCogdXNlcikgeworICBPVVRMSU5FX1BBUkFNUyogcGFyYW0gPSAoT1VUTElORV9QQVJBTVMqKXVzZXI7CisgIGlmICghcGFyYW0tPm1fYkNvdW50KSB7CisgICAgX091dGxpbmVfQ2hlY2tFbXB0eUNvbnRvdXIocGFyYW0pOworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9Qb2ludFggPSB0by0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRZID0gdG8tPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQ7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX0ZsYWcgPSBGWFBUX01PVkVUTzsKKyAgICBwYXJhbS0+bV9DdXJYID0gdG8tPng7CisgICAgcGFyYW0tPm1fQ3VyWSA9IHRvLT55OworICAgIGlmIChwYXJhbS0+bV9Qb2ludENvdW50KSB7CisgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAxXS5tX0ZsYWcgfD0gRlhQVF9DTE9TRUZJR1VSRTsKICAgICB9Ci19OwotZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIGludCBfT3V0bGluZV9MaW5lVG8oY29uc3QgRlhGVF9WZWN0b3IqIHRvLCB2b2lkKiB1c2VyKQotICAgIHsKLSAgICAgICAgT1VUTElORV9QQVJBTVMqIHBhcmFtID0gKE9VVExJTkVfUEFSQU1TKil1c2VyOwotICAgICAgICBpZiAoIXBhcmFtLT5tX2JDb3VudCkgewotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX1BvaW50WCA9IHRvLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0OwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX1BvaW50WSA9IHRvLT55IC8gcGFyYW0tPm1fQ29vcmRVbml0OwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX0ZsYWcgPSBGWFBUX0xJTkVUTzsKLSAgICAgICAgICAgIHBhcmFtLT5tX0N1clggPSB0by0+eDsKLSAgICAgICAgICAgIHBhcmFtLT5tX0N1clkgPSB0by0+eTsKLSAgICAgICAgfQotICAgICAgICBwYXJhbS0+bV9Qb2ludENvdW50ICsrOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19OwotZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIGludCBfT3V0bGluZV9Db25pY1RvKGNvbnN0IEZYRlRfVmVjdG9yKiBjb250cm9sLCBjb25zdCBGWEZUX1ZlY3RvciogdG8sIHZvaWQqIHVzZXIpCi0gICAgewotICAgICAgICBPVVRMSU5FX1BBUkFNUyogcGFyYW0gPSAoT1VUTElORV9QQVJBTVMqKXVzZXI7Ci0gICAgICAgIGlmICghcGFyYW0tPm1fYkNvdW50KSB7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRYID0gKHBhcmFtLT5tX0N1clggKyAoY29udHJvbC0+eCAtIHBhcmFtLT5tX0N1clgpICogMiAvIDMpIC8gcGFyYW0tPm1fQ29vcmRVbml0OwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX1BvaW50WSA9IChwYXJhbS0+bV9DdXJZICsgKGNvbnRyb2wtPnkgLSBwYXJhbS0+bV9DdXJZKSAqIDIgLyAzKSAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9GbGFnID0gRlhQVF9CRVpJRVJUTzsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDFdLm1fUG9pbnRYID0gKGNvbnRyb2wtPnggKyAodG8tPnggLSBjb250cm9sLT54KSAvIDMpIC8gcGFyYW0tPm1fQ29vcmRVbml0OwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMV0ubV9Qb2ludFkgPSAoY29udHJvbC0+eSArICh0by0+eSAtIGNvbnRyb2wtPnkpIC8gMykgLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAxXS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMl0ubV9Qb2ludFggPSB0by0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDJdLm1fUG9pbnRZID0gdG8tPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAyXS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOwotICAgICAgICAgICAgcGFyYW0tPm1fQ3VyWCA9IHRvLT54OwotICAgICAgICAgICAgcGFyYW0tPm1fQ3VyWSA9IHRvLT55OwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtLT5tX1BvaW50Q291bnQgKz0gMzsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfTsKLWV4dGVybiAiQyIgewotICAgIHN0YXRpYyBpbnQgX091dGxpbmVfQ3ViaWNUbyhjb25zdCBGWEZUX1ZlY3RvciogY29udHJvbDEsIGNvbnN0IEZYRlRfVmVjdG9yKiBjb250cm9sMiwgY29uc3QgRlhGVF9WZWN0b3IqIHRvLCB2b2lkKiB1c2VyKQotICAgIHsKLSAgICAgICAgT1VUTElORV9QQVJBTVMqIHBhcmFtID0gKE9VVExJTkVfUEFSQU1TKil1c2VyOwotICAgICAgICBpZiAoIXBhcmFtLT5tX2JDb3VudCkgewotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX1BvaW50WCA9IGNvbnRyb2wxLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0OwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX1BvaW50WSA9IGNvbnRyb2wxLT55IC8gcGFyYW0tPm1fQ29vcmRVbml0OwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMV0ubV9Qb2ludFggPSBjb250cm9sMi0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDFdLm1fUG9pbnRZID0gY29udHJvbDItPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAxXS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMl0ubV9Qb2ludFggPSB0by0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDJdLm1fUG9pbnRZID0gdG8tPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAyXS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOwotICAgICAgICAgICAgcGFyYW0tPm1fQ3VyWCA9IHRvLT54OwotICAgICAgICAgICAgcGFyYW0tPm1fQ3VyWSA9IHRvLT55OwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtLT5tX1BvaW50Q291bnQgKz0gMzsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfTsKLUNGWF9QYXRoRGF0YSogQ0ZYX0ZvbnQ6OkxvYWRHbHlwaFBhdGgoRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIGludCBkZXN0X3dpZHRoKQotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCk7Ci0gICAgRlhGVF9NYXRyaXggIGZ0X21hdHJpeCA9IHs2NTUzNiwgMCwgMCwgNjU1MzZ9OwotICAgIGlmIChtX3BTdWJzdEZvbnQpIHsKLSAgICAgICAgaWYgKG1fcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZSkgewotICAgICAgICAgICAgaW50IHNrZXcgPSBtX3BTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGU7Ci0gICAgICAgICAgICBza2V3ID0gc2tldyA8PSAtQU5HTEVTS0VXX0FSUkFZX1NJWkUgPyAtNTggOiAtZ19BbmdsZVNrZXdbLXNrZXddOwotICAgICAgICAgICAgaWYgKG1fYlZlcnRpY2FsKSB7Ci0gICAgICAgICAgICAgICAgZnRfbWF0cml4Lnl4ICs9IGZ0X21hdHJpeC55eSAqIHNrZXcgLyAxMDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZ0X21hdHJpeC54eSArPSAtZnRfbWF0cml4Lnh4ICogc2tldyAvIDEwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobV9wU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfTU0pIHsKLSAgICAgICAgICAgIEFkanVzdE1NUGFyYW1zKGdseXBoX2luZGV4LCBkZXN0X3dpZHRoLCBtX3BTdWJzdEZvbnQtPm1fV2VpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWEZUX1NldF9UcmFuc2Zvcm0obV9GYWNlLCAmZnRfbWF0cml4LCAwKTsKLSAgICBpbnQgbG9hZF9mbGFncyA9IEZYRlRfTE9BRF9OT19CSVRNQVA7Ci0gICAgaWYgKCEobV9GYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NGTlQpIHx8ICFGVF9JU19UUklDS1kobV9GYWNlKSkgewotICAgICAgICBsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fSElOVElORzsKLSAgICB9Ci0gICAgaW50IGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MpOwotICAgIGlmIChlcnJvcikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fcFN1YnN0Rm9udCAmJiAhKG1fcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSAmJiBtX3BTdWJzdEZvbnQtPm1fV2VpZ2h0ID4gNDAwKSB7Ci0gICAgICAgIGludCBpbmRleCA9IChtX3BTdWJzdEZvbnQtPm1fV2VpZ2h0IC0gNDAwKSAvIDEwOwotICAgICAgICBpZiAoaW5kZXggPj0gV0VJR0hUUE9XX0FSUkFZX1NJWkUpCi0gICAgICAgICAgICBpbmRleCA9IFdFSUdIVFBPV19BUlJBWV9TSVpFIC0gMTsKLSAgICAgICAgaW50IGxldmVsID0gMDsKLSAgICAgICAgaWYgKG1fcFN1YnN0Rm9udC0+bV9DaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKSB7Ci0gICAgICAgICAgICBsZXZlbCA9IGdfV2VpZ2h0UG93X1NISUZUSklTW2luZGV4XSAqIDIgKiA2NTUzNiAvIDM2NjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGV2ZWwgPSBnX1dlaWdodFBvd1tpbmRleF0gKiAyOwotICAgICAgICB9Ci0gICAgICAgIEZYRlRfT3V0bGluZV9FbWJvbGRlbihGWEZUX0dldF9HbHlwaF9PdXRsaW5lKG1fRmFjZSksIGxldmVsKTsKLSAgICB9Ci0gICAgRlhGVF9PdXRsaW5lX0Z1bmNzIGZ1bmNzOwotICAgIGZ1bmNzLm1vdmVfdG8gPSBfT3V0bGluZV9Nb3ZlVG87Ci0gICAgZnVuY3MubGluZV90byA9IF9PdXRsaW5lX0xpbmVUbzsKLSAgICBmdW5jcy5jb25pY190byA9IF9PdXRsaW5lX0NvbmljVG87Ci0gICAgZnVuY3MuY3ViaWNfdG8gPSBfT3V0bGluZV9DdWJpY1RvOwotICAgIGZ1bmNzLnNoaWZ0ID0gMDsKLSAgICBmdW5jcy5kZWx0YSA9IDA7Ci0gICAgT1VUTElORV9QQVJBTVMgcGFyYW1zOwotICAgIHBhcmFtcy5tX2JDb3VudCA9IFRSVUU7Ci0gICAgcGFyYW1zLm1fUG9pbnRDb3VudCA9IDA7Ci0gICAgRlhGVF9PdXRsaW5lX0RlY29tcG9zZShGWEZUX0dldF9HbHlwaF9PdXRsaW5lKG1fRmFjZSksICZmdW5jcywgJnBhcmFtcyk7Ci0gICAgaWYgKHBhcmFtcy5tX1BvaW50Q291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX1BhdGhEYXRhKiBwUGF0aCA9IEZYX05FVyBDRlhfUGF0aERhdGE7Ci0gICAgaWYgKCFwUGF0aCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcFBhdGgtPlNldFBvaW50Q291bnQocGFyYW1zLm1fUG9pbnRDb3VudCk7Ci0gICAgcGFyYW1zLm1fYkNvdW50ID0gRkFMU0U7Ci0gICAgcGFyYW1zLm1fUG9pbnRDb3VudCA9IDA7Ci0gICAgcGFyYW1zLm1fcFBvaW50cyA9IHBQYXRoLT5HZXRQb2ludHMoKTsKLSAgICBwYXJhbXMubV9DdXJYID0gcGFyYW1zLm1fQ3VyWSA9IDA7Ci0gICAgcGFyYW1zLm1fQ29vcmRVbml0ID0gNjQgKiA2NC4wOwotICAgIEZYRlRfT3V0bGluZV9EZWNvbXBvc2UoRlhGVF9HZXRfR2x5cGhfT3V0bGluZShtX0ZhY2UpLCAmZnVuY3MsICZwYXJhbXMpOwotICAgIF9PdXRsaW5lX0NoZWNrRW1wdHlDb250b3VyKCZwYXJhbXMpOwotICAgIHBQYXRoLT5UcmltUG9pbnRzKHBhcmFtcy5tX1BvaW50Q291bnQpOwotICAgIGlmIChwYXJhbXMubV9Qb2ludENvdW50KSB7Ci0gICAgICAgIHBQYXRoLT5HZXRQb2ludHMoKVtwYXJhbXMubV9Qb2ludENvdW50IC0gMV0ubV9GbGFnIHw9IEZYUFRfQ0xPU0VGSUdVUkU7Ci0gICAgfQotICAgIHJldHVybiBwUGF0aDsKKyAgfQorICBwYXJhbS0+bV9Qb2ludENvdW50Kys7CisgIHJldHVybiAwOwogfQotdm9pZCBfQ0ZYX1VuaXF1ZUtleUdlbjo6R2VuZXJhdGUoaW50IGNvdW50LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdMaXN0OwotICAgIHZhX3N0YXJ0KGFyZ0xpc3QsIGNvdW50KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7Ci0gICAgICAgIGludCBwID0gdmFfYXJnKGFyZ0xpc3QsIGludCk7Ci0gICAgICAgICgoRlhfRFdPUkQqKW1fS2V5KVtpXSA9IHA7Cit9OworZXh0ZXJuICJDIiB7CitzdGF0aWMgaW50IF9PdXRsaW5lX0xpbmVUbyhjb25zdCBGWEZUX1ZlY3RvciogdG8sIHZvaWQqIHVzZXIpIHsKKyAgT1VUTElORV9QQVJBTVMqIHBhcmFtID0gKE9VVExJTkVfUEFSQU1TKil1c2VyOworICBpZiAoIXBhcmFtLT5tX2JDb3VudCkgeworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9Qb2ludFggPSB0by0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRZID0gdG8tPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQ7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX0ZsYWcgPSBGWFBUX0xJTkVUTzsKKyAgICBwYXJhbS0+bV9DdXJYID0gdG8tPng7CisgICAgcGFyYW0tPm1fQ3VyWSA9IHRvLT55OworICB9CisgIHBhcmFtLT5tX1BvaW50Q291bnQrKzsKKyAgcmV0dXJuIDA7Cit9Cit9OworZXh0ZXJuICJDIiB7CitzdGF0aWMgaW50IF9PdXRsaW5lX0NvbmljVG8oY29uc3QgRlhGVF9WZWN0b3IqIGNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhGVF9WZWN0b3IqIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIpIHsKKyAgT1VUTElORV9QQVJBTVMqIHBhcmFtID0gKE9VVExJTkVfUEFSQU1TKil1c2VyOworICBpZiAoIXBhcmFtLT5tX2JDb3VudCkgeworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9Qb2ludFggPQorICAgICAgICAocGFyYW0tPm1fQ3VyWCArIChjb250cm9sLT54IC0gcGFyYW0tPm1fQ3VyWCkgKiAyIC8gMykgLworICAgICAgICBwYXJhbS0+bV9Db29yZFVuaXQ7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX1BvaW50WSA9CisgICAgICAgIChwYXJhbS0+bV9DdXJZICsgKGNvbnRyb2wtPnkgLSBwYXJhbS0+bV9DdXJZKSAqIDIgLyAzKSAvCisgICAgICAgIHBhcmFtLT5tX0Nvb3JkVW5pdDsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMV0ubV9Qb2ludFggPQorICAgICAgICAoY29udHJvbC0+eCArICh0by0+eCAtIGNvbnRyb2wtPngpIC8gMykgLyBwYXJhbS0+bV9Db29yZFVuaXQ7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMV0ubV9Qb2ludFkgPQorICAgICAgICAoY29udHJvbC0+eSArICh0by0+eSAtIGNvbnRyb2wtPnkpIC8gMykgLyBwYXJhbS0+bV9Db29yZFVuaXQ7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMV0ubV9GbGFnID0gRlhQVF9CRVpJRVJUTzsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAyXS5tX1BvaW50WCA9CisgICAgICAgIHRvLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0OworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDJdLm1fUG9pbnRZID0KKyAgICAgICAgdG8tPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQ7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMl0ubV9GbGFnID0gRlhQVF9CRVpJRVJUTzsKKyAgICBwYXJhbS0+bV9DdXJYID0gdG8tPng7CisgICAgcGFyYW0tPm1fQ3VyWSA9IHRvLT55OworICB9CisgIHBhcmFtLT5tX1BvaW50Q291bnQgKz0gMzsKKyAgcmV0dXJuIDA7Cit9Cit9OworZXh0ZXJuICJDIiB7CitzdGF0aWMgaW50IF9PdXRsaW5lX0N1YmljVG8oY29uc3QgRlhGVF9WZWN0b3IqIGNvbnRyb2wxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYRlRfVmVjdG9yKiBjb250cm9sMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWEZUX1ZlY3RvciogdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcikgeworICBPVVRMSU5FX1BBUkFNUyogcGFyYW0gPSAoT1VUTElORV9QQVJBTVMqKXVzZXI7CisgIGlmICghcGFyYW0tPm1fYkNvdW50KSB7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX1BvaW50WCA9CisgICAgICAgIGNvbnRyb2wxLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0OworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9Qb2ludFkgPQorICAgICAgICBjb250cm9sMS0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMV0ubV9Qb2ludFggPQorICAgICAgICBjb250cm9sMi0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAxXS5tX1BvaW50WSA9CisgICAgICAgIGNvbnRyb2wyLT55IC8gcGFyYW0tPm1fQ29vcmRVbml0OworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDFdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMl0ubV9Qb2ludFggPQorICAgICAgICB0by0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAyXS5tX1BvaW50WSA9CisgICAgICAgIHRvLT55IC8gcGFyYW0tPm1fQ29vcmRVbml0OworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDJdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87CisgICAgcGFyYW0tPm1fQ3VyWCA9IHRvLT54OworICAgIHBhcmFtLT5tX0N1clkgPSB0by0+eTsKKyAgfQorICBwYXJhbS0+bV9Qb2ludENvdW50ICs9IDM7CisgIHJldHVybiAwOworfQorfTsKK0NGWF9QYXRoRGF0YSogQ0ZYX0ZvbnQ6OkxvYWRHbHlwaFBhdGgoRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIGludCBkZXN0X3dpZHRoKSB7CisgIGlmIChtX0ZhY2UgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpOworICBGWEZUX01hdHJpeCBmdF9tYXRyaXggPSB7NjU1MzYsIDAsIDAsIDY1NTM2fTsKKyAgaWYgKG1fcFN1YnN0Rm9udCkgeworICAgIGlmIChtX3BTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGUpIHsKKyAgICAgIGludCBza2V3ID0gbV9wU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlOworICAgICAgc2tldyA9IHNrZXcgPD0gLUFOR0xFU0tFV19BUlJBWV9TSVpFID8gLTU4IDogLWdfQW5nbGVTa2V3Wy1za2V3XTsKKyAgICAgIGlmIChtX2JWZXJ0aWNhbCkgeworICAgICAgICBmdF9tYXRyaXgueXggKz0gZnRfbWF0cml4Lnl5ICogc2tldyAvIDEwMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZ0X21hdHJpeC54eSArPSAtZnRfbWF0cml4Lnh4ICogc2tldyAvIDEwMDsKKyAgICAgIH0KICAgICB9Ci0gICAgdmFfZW5kKGFyZ0xpc3QpOwotICAgIG1fS2V5TGVuID0gY291bnQgKiBzaXplb2YoRlhfRFdPUkQpOworICAgIGlmIChtX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9NTSkgeworICAgICAgQWRqdXN0TU1QYXJhbXMoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgsIG1fcFN1YnN0Rm9udC0+bV9XZWlnaHQpOworICAgIH0KKyAgfQorICBGWEZUX1NldF9UcmFuc2Zvcm0obV9GYWNlLCAmZnRfbWF0cml4LCAwKTsKKyAgaW50IGxvYWRfZmxhZ3MgPSBGWEZUX0xPQURfTk9fQklUTUFQOworICBpZiAoIShtX0ZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0ZOVCkgfHwgIUZUX0lTX1RSSUNLWShtX0ZhY2UpKSB7CisgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0hJTlRJTkc7CisgIH0KKyAgaW50IGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MpOworICBpZiAoZXJyb3IpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAobV9wU3Vic3RGb250ICYmICEobV9wU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfTU0pICYmCisgICAgICBtX3BTdWJzdEZvbnQtPm1fV2VpZ2h0ID4gNDAwKSB7CisgICAgaW50IGluZGV4ID0gKG1fcFN1YnN0Rm9udC0+bV9XZWlnaHQgLSA0MDApIC8gMTA7CisgICAgaWYgKGluZGV4ID49IFdFSUdIVFBPV19BUlJBWV9TSVpFKQorICAgICAgaW5kZXggPSBXRUlHSFRQT1dfQVJSQVlfU0laRSAtIDE7CisgICAgaW50IGxldmVsID0gMDsKKyAgICBpZiAobV9wU3Vic3RGb250LT5tX0NoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQpIHsKKyAgICAgIGxldmVsID0gZ19XZWlnaHRQb3dfU0hJRlRKSVNbaW5kZXhdICogMiAqIDY1NTM2IC8gMzY2NTU7CisgICAgfSBlbHNlIHsKKyAgICAgIGxldmVsID0gZ19XZWlnaHRQb3dbaW5kZXhdICogMjsKKyAgICB9CisgICAgRlhGVF9PdXRsaW5lX0VtYm9sZGVuKEZYRlRfR2V0X0dseXBoX091dGxpbmUobV9GYWNlKSwgbGV2ZWwpOworICB9CisgIEZYRlRfT3V0bGluZV9GdW5jcyBmdW5jczsKKyAgZnVuY3MubW92ZV90byA9IF9PdXRsaW5lX01vdmVUbzsKKyAgZnVuY3MubGluZV90byA9IF9PdXRsaW5lX0xpbmVUbzsKKyAgZnVuY3MuY29uaWNfdG8gPSBfT3V0bGluZV9Db25pY1RvOworICBmdW5jcy5jdWJpY190byA9IF9PdXRsaW5lX0N1YmljVG87CisgIGZ1bmNzLnNoaWZ0ID0gMDsKKyAgZnVuY3MuZGVsdGEgPSAwOworICBPVVRMSU5FX1BBUkFNUyBwYXJhbXM7CisgIHBhcmFtcy5tX2JDb3VudCA9IFRSVUU7CisgIHBhcmFtcy5tX1BvaW50Q291bnQgPSAwOworICBGWEZUX091dGxpbmVfRGVjb21wb3NlKEZYRlRfR2V0X0dseXBoX091dGxpbmUobV9GYWNlKSwgJmZ1bmNzLCAmcGFyYW1zKTsKKyAgaWYgKHBhcmFtcy5tX1BvaW50Q291bnQgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENGWF9QYXRoRGF0YSogcFBhdGggPSBGWF9ORVcgQ0ZYX1BhdGhEYXRhOworICBpZiAoIXBQYXRoKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcFBhdGgtPlNldFBvaW50Q291bnQocGFyYW1zLm1fUG9pbnRDb3VudCk7CisgIHBhcmFtcy5tX2JDb3VudCA9IEZBTFNFOworICBwYXJhbXMubV9Qb2ludENvdW50ID0gMDsKKyAgcGFyYW1zLm1fcFBvaW50cyA9IHBQYXRoLT5HZXRQb2ludHMoKTsKKyAgcGFyYW1zLm1fQ3VyWCA9IHBhcmFtcy5tX0N1clkgPSAwOworICBwYXJhbXMubV9Db29yZFVuaXQgPSA2NCAqIDY0LjA7CisgIEZYRlRfT3V0bGluZV9EZWNvbXBvc2UoRlhGVF9HZXRfR2x5cGhfT3V0bGluZShtX0ZhY2UpLCAmZnVuY3MsICZwYXJhbXMpOworICBfT3V0bGluZV9DaGVja0VtcHR5Q29udG91cigmcGFyYW1zKTsKKyAgcFBhdGgtPlRyaW1Qb2ludHMocGFyYW1zLm1fUG9pbnRDb3VudCk7CisgIGlmIChwYXJhbXMubV9Qb2ludENvdW50KSB7CisgICAgcFBhdGgtPkdldFBvaW50cygpW3BhcmFtcy5tX1BvaW50Q291bnQgLSAxXS5tX0ZsYWcgfD0gRlhQVF9DTE9TRUZJR1VSRTsKKyAgfQorICByZXR1cm4gcFBhdGg7Cit9Cit2b2lkIF9DRlhfVW5pcXVlS2V5R2VuOjpHZW5lcmF0ZShpbnQgY291bnQsIC4uLikgeworICB2YV9saXN0IGFyZ0xpc3Q7CisgIHZhX3N0YXJ0KGFyZ0xpc3QsIGNvdW50KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaW50IHAgPSB2YV9hcmcoYXJnTGlzdCwgaW50KTsKKyAgICAoKEZYX0RXT1JEKiltX0tleSlbaV0gPSBwOworICB9CisgIHZhX2VuZChhcmdMaXN0KTsKKyAgbV9LZXlMZW4gPSBjb3VudCAqIHNpemVvZihGWF9EV09SRCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmggYi9jb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgKaW5kZXggMjlkOWUxYy4uN2NjMzFmZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS90ZXh0X2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvdGV4dF9pbnQuaApAQCAtOCwxMTggKzgsMTA2IEBACiAjZGVmaW5lIENPUkVfU1JDX0ZYR0VfR0VfVEVYVF9JTlRfSF8KIAogc3RydWN0IF9DRlhfVW5pcXVlS2V5R2VuIHsKLSAgICB2b2lkCQlHZW5lcmF0ZShpbnQgY291bnQsIC4uLik7Ci0gICAgRlhfQ0hBUgkJbV9LZXlbMTI4XTsKLSAgICBpbnQJCQltX0tleUxlbjsKKyAgdm9pZCBHZW5lcmF0ZShpbnQgY291bnQsIC4uLik7CisgIEZYX0NIQVIgbV9LZXlbMTI4XTsKKyAgaW50IG1fS2V5TGVuOwogfTsKLWNsYXNzIENGWF9TaXplR2x5cGhDYWNoZQotewotcHVibGljOgotICAgIENGWF9TaXplR2x5cGhDYWNoZSgpCi0gICAgewotICAgICAgICBtX0dseXBoTWFwLkluaXRIYXNoVGFibGUoMjUzKTsKLSAgICB9Ci0gICAgfkNGWF9TaXplR2x5cGhDYWNoZSgpOwotICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fR2x5cGhNYXA7CitjbGFzcyBDRlhfU2l6ZUdseXBoQ2FjaGUgeworIHB1YmxpYzoKKyAgQ0ZYX1NpemVHbHlwaENhY2hlKCkgeyBtX0dseXBoTWFwLkluaXRIYXNoVGFibGUoMjUzKTsgfQorICB+Q0ZYX1NpemVHbHlwaENhY2hlKCk7CisgIENGWF9NYXBQdHJUb1B0ciBtX0dseXBoTWFwOwogfTsKLWNsYXNzIENUVEZvbnREZXNjCi17Ci1wdWJsaWM6Ci0gICAgQ1RURm9udERlc2MoKQotICAgIHsKLSAgICAgICAgbV9UeXBlID0gMDsKLSAgICAgICAgbV9wRm9udERhdGEgPSBOVUxMOwotICAgICAgICBtX1JlZkNvdW50ID0gMDsKLSAgICB9Ci0gICAgfkNUVEZvbnREZXNjKCk7Ci0gICAgaW50MzJfdAkJCVJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKTsKLSAgICBpbnQJCQkJbV9UeXBlOwotICAgIHVuaW9uIHsKLSAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIEZYX0JPT0wJCW1fYkl0YWxpYzsKLSAgICAgICAgICAgIEZYX0JPT0wJCW1fYkJvbGQ7Ci0gICAgICAgICAgICBGWEZUX0ZhY2UJbV9wRmFjZTsKLSAgICAgICAgfSBtX1NpbmdsZUZhY2U7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICBGWEZUX0ZhY2UJbV9wRmFjZXNbMTZdOwotICAgICAgICB9IG1fVFRDRmFjZTsKLSAgICB9OwotICAgIHVpbnQ4X3QqCQltX3BGb250RGF0YTsKLSAgICBpbnQJCQkJbV9SZWZDb3VudDsKK2NsYXNzIENUVEZvbnREZXNjIHsKKyBwdWJsaWM6CisgIENUVEZvbnREZXNjKCkgeworICAgIG1fVHlwZSA9IDA7CisgICAgbV9wRm9udERhdGEgPSBOVUxMOworICAgIG1fUmVmQ291bnQgPSAwOworICB9CisgIH5DVFRGb250RGVzYygpOworICBpbnQzMl90IFJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKTsKKyAgaW50IG1fVHlwZTsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBGWF9CT09MIG1fYkl0YWxpYzsKKyAgICAgIEZYX0JPT0wgbV9iQm9sZDsKKyAgICAgIEZYRlRfRmFjZSBtX3BGYWNlOworICAgIH0gbV9TaW5nbGVGYWNlOworICAgIHN0cnVjdCB7CisgICAgICBGWEZUX0ZhY2UgbV9wRmFjZXNbMTZdOworICAgIH0gbV9UVENGYWNlOworICB9OworICB1aW50OF90KiBtX3BGb250RGF0YTsKKyAgaW50IG1fUmVmQ291bnQ7CiB9OwotY2xhc3MgQ0ZYX1VuaWNvZGVFbmNvZGluZyA6IHB1YmxpYyBJRlhfRm9udEVuY29kaW5nCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX1VuaWNvZGVFbmNvZGluZyhDRlhfRm9udCogcEZvbnQpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdseXBoRnJvbUNoYXJDb2RlRXgoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBlbmNvZGluZyA9IEVOQ09ESU5HX1VOSUNPREUpOwotcHJpdmF0ZToKLSAgICBDRlhfRm9udCoJCQltX3BGb250OwotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKTsKLSAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCVVuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKEZYX1dDSEFSKWNoYXJjb2RlKTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9EV09SRAkJQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIFVuaWNvZGU7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQorY2xhc3MgQ0ZYX1VuaWNvZGVFbmNvZGluZyA6IHB1YmxpYyBJRlhfRm9udEVuY29kaW5nIHsKKyBwdWJsaWM6CisgIENGWF9Vbmljb2RlRW5jb2RpbmcoQ0ZYX0ZvbnQqIHBGb250KTsKKyAgdmlydHVhbCBGWF9EV09SRCBHbHlwaEZyb21DaGFyQ29kZUV4KEZYX0RXT1JEIGNoYXJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuY29kaW5nID0gRU5DT0RJTkdfVU5JQ09ERSk7CisKKyBwcml2YXRlOgorICBDRlhfRm9udCogbV9wRm9udDsKKyAgdmlydHVhbCBGWF9EV09SRCBHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSk7CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgVW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygoRlhfV0NIQVIpY2hhcmNvZGUpOworICB9CisgIHZpcnR1YWwgRlhfRFdPUkQgQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdCB7CisgICAgcmV0dXJuIFVuaWNvZGU7CisgIH0KKyAgdmlydHVhbCBGWF9CT09MIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCB7IHJldHVybiBUUlVFOyB9CiB9OwotI2RlZmluZSBDSEFSU0VUX0ZMQUdfQU5TSQkJMQotI2RlZmluZSBDSEFSU0VUX0ZMQUdfU1lNQk9MCQkyCi0jZGVmaW5lIENIQVJTRVRfRkxBR19TSElGVEpJUwk0Ci0jZGVmaW5lIENIQVJTRVRfRkxBR19CSUc1CQk4Ci0jZGVmaW5lIENIQVJTRVRfRkxBR19HQgkJCTE2Ci0jZGVmaW5lIENIQVJTRVRfRkxBR19LT1JFQU4JCTMyCi1jbGFzcyBDRm9udEZhY2VJbmZvCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCW1fRmlsZVBhdGg7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCW1fRmFjZU5hbWU7Ci0gICAgRlhfRFdPUkQJCQltX1N0eWxlczsKLSAgICBGWF9EV09SRAkJCW1fQ2hhcnNldHM7Ci0gICAgRlhfRFdPUkQJCQltX0ZvbnRPZmZzZXQ7Ci0gICAgRlhfRFdPUkQJCQltX0ZpbGVTaXplOwotICAgIENGWF9CeXRlU3RyaW5nCQltX0ZvbnRUYWJsZXM7CisjZGVmaW5lIENIQVJTRVRfRkxBR19BTlNJIDEKKyNkZWZpbmUgQ0hBUlNFVF9GTEFHX1NZTUJPTCAyCisjZGVmaW5lIENIQVJTRVRfRkxBR19TSElGVEpJUyA0CisjZGVmaW5lIENIQVJTRVRfRkxBR19CSUc1IDgKKyNkZWZpbmUgQ0hBUlNFVF9GTEFHX0dCIDE2CisjZGVmaW5lIENIQVJTRVRfRkxBR19LT1JFQU4gMzIKK2NsYXNzIENGb250RmFjZUluZm8geworIHB1YmxpYzoKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9GaWxlUGF0aDsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9GYWNlTmFtZTsKKyAgRlhfRFdPUkQgbV9TdHlsZXM7CisgIEZYX0RXT1JEIG1fQ2hhcnNldHM7CisgIEZYX0RXT1JEIG1fRm9udE9mZnNldDsKKyAgRlhfRFdPUkQgbV9GaWxlU2l6ZTsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9Gb250VGFibGVzOwogfTsKLWNsYXNzIENGb250RmlsZUZhY2VJbmZvCi17Ci1wdWJsaWM6Ci0gICAgQ0ZvbnRGaWxlRmFjZUluZm8oKTsKLSAgICB+Q0ZvbnRGaWxlRmFjZUluZm8oKTsKLSAgICBJRlhfRmlsZVN0cmVhbSoJCW1fcEZpbGU7Ci0gICAgRlhGVF9GYWNlCQkJbV9GYWNlOwotICAgIENGWF9CeXRlU3RyaW5nCQltX0ZhY2VOYW1lOwotICAgIEZYX0RXT1JECQkJbV9DaGFyc2V0czsKLSAgICBGWF9EV09SRAkJCW1fRmlsZVNpemU7Ci0gICAgRlhfRFdPUkQJCQltX0ZvbnRPZmZzZXQ7Ci0gICAgaW50CQkJCQltX1dlaWdodDsKLSAgICBGWF9CT09MCQkJCW1fYkl0YWxpYzsKLSAgICBpbnQJCQkJCW1fUGl0Y2hGYW1pbHk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCW1fRm9udFRhYmxlczsKK2NsYXNzIENGb250RmlsZUZhY2VJbmZvIHsKKyBwdWJsaWM6CisgIENGb250RmlsZUZhY2VJbmZvKCk7CisgIH5DRm9udEZpbGVGYWNlSW5mbygpOworICBJRlhfRmlsZVN0cmVhbSogbV9wRmlsZTsKKyAgRlhGVF9GYWNlIG1fRmFjZTsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9GYWNlTmFtZTsKKyAgRlhfRFdPUkQgbV9DaGFyc2V0czsKKyAgRlhfRFdPUkQgbV9GaWxlU2l6ZTsKKyAgRlhfRFdPUkQgbV9Gb250T2Zmc2V0OworICBpbnQgbV9XZWlnaHQ7CisgIEZYX0JPT0wgbV9iSXRhbGljOworICBpbnQgbV9QaXRjaEZhbWlseTsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9Gb250VGFibGVzOwogfTsKLWNsYXNzIENGWF9Gb250RW5jb2RpbmdFWCA6IHB1YmxpYyBJRlhfRm9udEVuY29kaW5nRXgNCi17DQotcHVibGljOg0KLSAgICBDRlhfRm9udEVuY29kaW5nRVgoKTsNCi0gICAgRlhfQk9PTAkJCUluaXQoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBFbmNvZGluZ0lEKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2x5cGhJbmRleEZyb21OYW1lKGNvbnN0IEZYX0NIQVIqIHBTdHJOYW1lKTsNCi0gICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZwlOYW1lRnJvbUdseXBoSW5kZXgoRlhfRFdPUkQgZHdHbHlwaEluZGV4KTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJQ2hhckNvZGVGcm9tR2x5cGhJbmRleChGWF9EV09SRCBkd0dseXBoSW5kZXgpOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSk7DQotICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJVW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2x5cGhGcm9tQ2hhckNvZGVFeChGWF9EV09SRCBjaGFyY29kZSwgaW50IGVuY29kaW5nID0gRU5DT0RJTkdfVU5JQ09ERSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsNCi0gICAgfQ0KLXByaXZhdGU6DQotICAgIENGWF9Gb250KiBtX3BGb250Ow0KLSAgICBGWF9EV09SRCBtX25FbmNvZGluZ0lEOw0KLX07DQorY2xhc3MgQ0ZYX0ZvbnRFbmNvZGluZ0VYIDogcHVibGljIElGWF9Gb250RW5jb2RpbmdFeCB7CisgcHVibGljOgorICBDRlhfRm9udEVuY29kaW5nRVgoKTsKKyAgRlhfQk9PTCBJbml0KENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgRW5jb2RpbmdJRCk7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2x5cGhJbmRleEZyb21OYW1lKGNvbnN0IEZYX0NIQVIqIHBTdHJOYW1lKTsKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBOYW1lRnJvbUdseXBoSW5kZXgoRlhfRFdPUkQgZHdHbHlwaEluZGV4KTsKKyAgdmlydHVhbCBGWF9EV09SRCBDaGFyQ29kZUZyb21HbHlwaEluZGV4KEZYX0RXT1JEIGR3R2x5cGhJbmRleCk7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpOworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIFVuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OworICB2aXJ0dWFsIEZYX0RXT1JEIENoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3Q7CisgIHZpcnR1YWwgRlhfQk9PTCBJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3Q7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2x5cGhGcm9tQ2hhckNvZGVFeChGWF9EV09SRCBjaGFyY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmNvZGluZyA9IEVOQ09ESU5HX1VOSUNPREUpIHsKKyAgICByZXR1cm4gR2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICB9CisKKyBwcml2YXRlOgorICBDRlhfRm9udCogbV9wRm9udDsKKyAgRlhfRFdPUkQgbV9uRW5jb2RpbmdJRDsKK307CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlhHRV9HRV9URVhUX0lOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuY3BwIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuY3BwCmluZGV4IDM0MzdlYjQuLmEzZWQ3NWIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5jcHAKQEAgLTgsMzA4ICs4LDM4NSBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgogI2luY2x1ZGUgIlNrQmxpdHRlci5oIgogI2luY2x1ZGUgImZ4X3NraWFfYmxpdHRlcl9uZXcuaCIKLSAgICAvLyBXZSB1c2Ugb3VyIG93biByZW5kZXJlciBoZXJlIHRvIG1ha2UgaXQgc2ltcGxlCi0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpibGl0QW50aUgoaW50IHgsIGludCB5LCBjb25zdCBTa0FscGhhIGFudGlhbGlhc1tdLCBjb25zdCBpbnQxNl90IHJ1bnNbXSkKLSAgICB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChtX0FscGhhKTsKLSAgICAgICAgaWYgKG1fcE9yaURldmljZSA9PSBOVUxMICYmIGNvbXBvc2l0ZV9zcGFuID09IE5VTEwpIHJldHVybjsKLSAgICAgICAgaWYgKHkgPCBtX0NsaXBCb3gudG9wIHx8IHkgPj0gbV9DbGlwQm94LmJvdHRvbSkgcmV0dXJuOwotICAgICAgICB3aGlsZSAoMSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHdpZHRoID0gcnVuc1swXTsKLSAgICAgICAgICAgIFNrQVNTRVJUKHdpZHRoID49IDApOwotICAgICAgICAgICAgaWYgKHdpZHRoIDw9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgdW5zaWduZWQgYWEgPSBhbnRpYWxpYXNbMF07Ci0gICAgICAgICAgICBpZiAoYWEpCi0gICAgICAgICAgICAgICAgKCpjb21wb3NpdGVfc3BhbikobV9wRGVzdFNjYW4sIG1fcE9yaVNjYW4sIDAsIHgsIHdpZHRoLCB5LCBhYSwgbV9DbGlwQm94LnRvcCwgbV9DbGlwQm94LmxlZnQsIG1fQ2xpcEJveC5yaWdodCwgbV9wQ2xpcFNjYW4sIG1fcERlc3RFeHRyYUFscGhhU2Nhbik7Ci0gICAgICAgICAgICBydW5zICs9IHdpZHRoOwotICAgICAgICAgICAgYW50aWFsaWFzICs9IHdpZHRoOwotICAgICAgICAgICAgeCArPSB3aWR0aDsKLSAgICAgICAgfQotICAgIH0KKy8vIFdlIHVzZSBvdXIgb3duIHJlbmRlcmVyIGhlcmUgdG8gbWFrZSBpdCBzaW1wbGUKK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6YmxpdEFudGlIKGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa0FscGhhIGFudGlhbGlhc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBydW5zW10pIHsKKyAgRlhTWVNfYXNzZXJ0KG1fQWxwaGEpOworICBpZiAobV9wT3JpRGV2aWNlID09IE5VTEwgJiYgY29tcG9zaXRlX3NwYW4gPT0gTlVMTCkKKyAgICByZXR1cm47CisgIGlmICh5IDwgbV9DbGlwQm94LnRvcCB8fCB5ID49IG1fQ2xpcEJveC5ib3R0b20pCisgICAgcmV0dXJuOworICB3aGlsZSAoMSkgeworICAgIGludCB3aWR0aCA9IHJ1bnNbMF07CisgICAgU2tBU1NFUlQod2lkdGggPj0gMCk7CisgICAgaWYgKHdpZHRoIDw9IDApCisgICAgICByZXR1cm47CisgICAgdW5zaWduZWQgYWEgPSBhbnRpYWxpYXNbMF07CisgICAgaWYgKGFhKQorICAgICAgKCpjb21wb3NpdGVfc3BhbikobV9wRGVzdFNjYW4sIG1fcE9yaVNjYW4sIDAsIHgsIHdpZHRoLCB5LCBhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQ2xpcEJveC50b3AsIG1fQ2xpcEJveC5sZWZ0LCBtX0NsaXBCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BDbGlwU2NhbiwgbV9wRGVzdEV4dHJhQWxwaGFTY2FuKTsKKyAgICBydW5zICs9IHdpZHRoOworICAgIGFudGlhbGlhcyArPSB3aWR0aDsKKyAgICB4ICs9IHdpZHRoOworICB9Cit9CiAKLSAgICB2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OmJsaXRIKGludCB4LCBpbnQgeSwgaW50IHdpZHRoKQotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fQWxwaGEgJiYgd2lkdGgpOwotICAgICAgICBpZiAoeSA8IG1fQ2xpcEJveC50b3AgfHwgeSA+PSBtX0NsaXBCb3guYm90dG9tKSByZXR1cm47Ci0gICAgICAgICgqY29tcG9zaXRlX3NwYW4pKG1fcERlc3RTY2FuLCBtX3BPcmlTY2FuLCAwLCB4LCB3aWR0aCwgeSwgMjU1LCBtX0NsaXBCb3gudG9wLCBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LCBtX3BDbGlwU2NhbiwgbV9wRGVzdEV4dHJhQWxwaGFTY2FuKTsKLSAgICB9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OmJsaXRIKGludCB4LCBpbnQgeSwgaW50IHdpZHRoKSB7CisgIEZYU1lTX2Fzc2VydChtX0FscGhhICYmIHdpZHRoKTsKKyAgaWYgKHkgPCBtX0NsaXBCb3gudG9wIHx8IHkgPj0gbV9DbGlwQm94LmJvdHRvbSkKKyAgICByZXR1cm47CisgICgqY29tcG9zaXRlX3NwYW4pKG1fcERlc3RTY2FuLCBtX3BPcmlTY2FuLCAwLCB4LCB3aWR0aCwgeSwgMjU1LCBtX0NsaXBCb3gudG9wLAorICAgICAgICAgICAgICAgICAgICBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LCBtX3BDbGlwU2NhbiwKKyAgICAgICAgICAgICAgICAgICAgbV9wRGVzdEV4dHJhQWxwaGFTY2FuKTsKK30KIAotICAgIHZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6YmxpdFYoaW50IHgsIGludCB5LCBpbnQgaGVpZ2h0LCBTa0FscGhhIGFscGhhKQotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fQWxwaGEgJiYgYWxwaGEpOwotICAgICAgICBpZiAoYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICBibGl0UmVjdCh4LCB5LCAxLCBoZWlnaHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50MTZfdCBydW5zWzJdOwotICAgICAgICAgICAgcnVuc1swXSA9IDE7Ci0gICAgICAgICAgICBydW5zWzFdID0gMDsKLSAgICAgICAgICAgIHdoaWxlICgtLWhlaWdodCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHkgPj0gbV9DbGlwQm94LmJvdHRvbSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGJsaXRBbnRpSCh4LCB5ICsrLCAmYWxwaGEsIHJ1bnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OmJsaXRWKGludCB4LCBpbnQgeSwgaW50IGhlaWdodCwgU2tBbHBoYSBhbHBoYSkgeworICBGWFNZU19hc3NlcnQobV9BbHBoYSAmJiBhbHBoYSk7CisgIGlmIChhbHBoYSA9PSAyNTUpIHsKKyAgICBibGl0UmVjdCh4LCB5LCAxLCBoZWlnaHQpOworICB9IGVsc2UgeworICAgIGludDE2X3QgcnVuc1syXTsKKyAgICBydW5zWzBdID0gMTsKKyAgICBydW5zWzFdID0gMDsKKyAgICB3aGlsZSAoLS1oZWlnaHQgPj0gMCkgeworICAgICAgaWYgKHkgPj0gbV9DbGlwQm94LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuOworICAgICAgYmxpdEFudGlIKHgsIHkrKywgJmFscGhhLCBydW5zKTsKICAgICB9Ci0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpibGl0UmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChtX0FscGhhICYmIHdpZHRoKTsKLSAgICAgICAgd2hpbGUgKC0taGVpZ2h0ID49IDApewotICAgICAgICAgICAgaWYgKHkgPj0gbV9DbGlwQm94LmJvdHRvbSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBibGl0SCh4LCB5ICsrLCB3aWR0aCk7Ci0gICAgICAgIH0KLSAgICB9CisgIH0KK30KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6YmxpdFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgRlhTWVNfYXNzZXJ0KG1fQWxwaGEgJiYgd2lkdGgpOworICB3aGlsZSAoLS1oZWlnaHQgPj0gMCkgeworICAgIGlmICh5ID49IG1fQ2xpcEJveC5ib3R0b20pCisgICAgICByZXR1cm47CisgICAgYmxpdEgoeCwgeSsrLCB3aWR0aCk7CisgIH0KK30KIAotICAgIHZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6YmxpdEFudGlSZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0FscGhhIGxlZnRBbHBoYSwgU2tBbHBoYSByaWdodEFscGhhKQotICAgIHsKLSAgICAgICAgYmxpdFYoeCsrLCB5LCBoZWlnaHQsIGxlZnRBbHBoYSk7Ci0gICAgICAgIGlmICh3aWR0aCA+IDApIHsKLSAgICAgICAgICAgIGJsaXRSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgeCArPSB3aWR0aDsKLSAgICAgICAgfQotICAgICAgICBibGl0Vih4LCB5LCBoZWlnaHQsIHJpZ2h0QWxwaGEpOwotICAgIH0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcF8wKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLSAgICAgICAgICAgIGludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0gICAgICAgICAgICBpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pCi0gICAgewotICAgICAgICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7Ci0gICAgICAgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKLSAgICAgICAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0Lzg7Ci0gICAgICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgICAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgICAgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0gICAgICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQvODsKK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6YmxpdEFudGlSZWN0KGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tBbHBoYSBsZWZ0QWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0FscGhhIHJpZ2h0QWxwaGEpIHsKKyAgYmxpdFYoeCsrLCB5LCBoZWlnaHQsIGxlZnRBbHBoYSk7CisgIGlmICh3aWR0aCA+IDApIHsKKyAgICBibGl0UmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB4ICs9IHdpZHRoOworICB9CisgIGJsaXRWKHgsIHksIGhlaWdodCwgcmlnaHRBbHBoYSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW4xYnBwXzAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKKyAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOworICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQgLyA4OworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAvIDg7CiAKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaWYgKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpID09IE5VTEwpCi0gICAgICAgICAgICBpbmRleCA9ICgodWludDhfdCltX0NvbG9yID09IDB4ZmYpID8gMSA6IDA7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpICsrKQotICAgICAgICAgICAgICAgIGlmIChGWEFSR0JfVE9ESUIobV9wRGV2aWNlLT5HZXRQYWxldHRlKClbaV0pID09IG1fQ29sb3IpCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4xID0gZGVzdF9zY2FuOwotICAgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbjEgJj0gfigxIDw8ICg3IC0gKGNvbCtzcGFuX2xlZnQpJTgpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4xfD0gMSA8PCAoNyAtIChjb2wrc3Bhbl9sZWZ0KSU4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW4rKHNwYW5fbGVmdCU4K2NvbC1jb2xfc3RhcnQrMSkvODsKLSAgICAgICAgfQorICBpbnQgaW5kZXggPSAwOworICBpZiAobV9wRGV2aWNlLT5HZXRQYWxldHRlKCkgPT0gTlVMTCkKKyAgICBpbmRleCA9ICgodWludDhfdCltX0NvbG9yID09IDB4ZmYpID8gMSA6IDA7CisgIGVsc2UgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgaWYgKEZYQVJHQl9UT0RJQihtX3BEZXZpY2UtPkdldFBhbGV0dGUoKVtpXSkgPT0gbV9Db2xvcikKKyAgICAgICAgaW5kZXggPSBpOworICB9CisgIHVpbnQ4X3QqIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW47CisgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgIGlmICghaW5kZXgpCisgICAgICAgICpkZXN0X3NjYW4xICY9IH4oMSA8PCAoNyAtIChjb2wgKyBzcGFuX2xlZnQpICUgOCkpOworICAgICAgZWxzZQorICAgICAgICAqZGVzdF9zY2FuMSB8PSAxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KTsKICAgICB9Ci0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcF80KHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLSAgICAgICAgICAgIGludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0gICAgICAgICAgICBpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pCi0gICAgewotICAgICAgICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7Ci0gICAgICAgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKLSAgICAgICAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0Lzg7Ci0gICAgICAgIGNsaXBfc2NhbiA9ICh1aW50OF90KiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AtY2xpcF90b3ApIC0gY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0Lzg7CisgICAgZGVzdF9zY2FuMSA9IGRlc3Rfc2NhbiArIChzcGFuX2xlZnQgJSA4ICsgY29sIC0gY29sX3N0YXJ0ICsgMSkgLyA4OworICB9Cit9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW4xYnBwXzQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKKyAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOworICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQgLyA4OworICBjbGlwX3NjYW4gPSAodWludDhfdCopbV9wQ2xpcE1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wIC0gY2xpcF90b3ApIC0KKyAgICAgICAgICAgICAgY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAvIDg7CiAKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaWYgKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpID09IE5VTEwpCi0gICAgICAgICAgICBpbmRleCA9ICgodWludDhfdCltX0NvbG9yID09IDB4ZmYpID8gMSA6IDA7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpICsrKQotICAgICAgICAgICAgICAgIGlmIChGWEFSR0JfVE9ESUIobV9wRGV2aWNlLT5HZXRQYWxldHRlKClbaV0pID09IG1fQ29sb3IpCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4xID0gZGVzdF9zY2FuOwotICAgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWluZGV4KQotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuMSAmPSB+KDEgPDwgKDcgLSAoY29sK3NwYW5fbGVmdCklOCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbjF8PSAxIDw8ICg3IC0gKGNvbCtzcGFuX2xlZnQpJTgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuMSA9IGRlc3Rfc2Nhbisoc3Bhbl9sZWZ0JTgrY29sLWNvbF9zdGFydCsxKS84OwotICAgICAgICB9CisgIGludCBpbmRleCA9IDA7CisgIGlmIChtX3BEZXZpY2UtPkdldFBhbGV0dGUoKSA9PSBOVUxMKQorICAgIGluZGV4ID0gKCh1aW50OF90KW1fQ29sb3IgPT0gMHhmZikgPyAxIDogMDsKKyAgZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICBpZiAoRlhBUkdCX1RPRElCKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpW2ldKSA9PSBtX0NvbG9yKQorICAgICAgICBpbmRleCA9IGk7CisgIH0KKyAgdWludDhfdCogZGVzdF9zY2FuMSA9IGRlc3Rfc2NhbjsKKyAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTEgPSBzcmNfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICBpZiAoc3JjX2FscGhhMSkgeworICAgICAgaWYgKCFpbmRleCkKKyAgICAgICAgKmRlc3Rfc2NhbjEgJj0gfigxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KSk7CisgICAgICBlbHNlCisgICAgICAgICpkZXN0X3NjYW4xIHw9IDEgPDwgKDcgLSAoY29sICsgc3Bhbl9sZWZ0KSAlIDgpOwogICAgIH0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICB2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5HcmF5XzIodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLSAgICAgICAgICAgIGludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLSAgICB7Ci0gICAgICAgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKLSAgICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotICAgICAgICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQ7Ci0gICAgICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgICAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgICAgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0gICAgICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQ7Ci0gICAgICAgIGlmIChjb3Zlcl9zY2FuID09IDI1NSAmJiBtX0FscGhhID09IDI1NSkgewotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UobV9HcmF5LCBtX0dyYXksIG1fR3JheSwgbV9HcmF5KSwgY29sX2VuZCAtIGNvbF9zdGFydCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkdyYXlfMyh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0gICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotICAgICAgICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7Ci0gICAgICAgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKLSAgICAgICAgb3JpX3NjYW4gID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0OwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0OwotICAgICAgICBvcmlfc2NhbiArPSBjb2xfc3RhcnQ7Ci0gICAgICAgIGlmIChtX0FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgewotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UobV9HcmF5LCBtX0dyYXksIG1fR3JheSwgbV9HcmF5KSwgY29sX2VuZCAtIGNvbF9zdGFydCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYTsKKyAgICBkZXN0X3NjYW4xID0gZGVzdF9zY2FuICsgKHNwYW5fbGVmdCAlIDggKyBjb2wgLSBjb2xfc3RhcnQgKyAxKSAvIDg7CisgIH0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV8yKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7CisgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKKyAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0OworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydDsKKyAgaWYgKGNvdmVyX3NjYW4gPT0gMjU1ICYmIG1fQWxwaGEgPT0gMjU1KSB7CisgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UobV9HcmF5LCBtX0dyYXksIG1fR3JheSwgbV9HcmF5KSwKKyAgICAgICAgICAgICAgICAgY29sX2VuZCAtIGNvbF9zdGFydCk7CisgICAgcmV0dXJuOworICB9CisgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkdyYXlfMyh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOworICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKKyAgb3JpX3NjYW4gPSAodWludDhfdCopbV9wT3JpRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQ7CisgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICBpbnQgY29sX2VuZCA9CisgICAgICAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkKKyAgICByZXR1cm47ICAvLyBkbyBub3RoaW5nLgorICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0OworICBvcmlfc2NhbiArPSBjb2xfc3RhcnQ7CisgIGlmIChtX0FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKG1fR3JheSwgbV9HcmF5LCBtX0dyYXksIG1fR3JheSksCisgICAgICAgICAgICAgICAgIGNvbF9lbmQgLSBjb2xfc3RhcnQpOworICB9IGVsc2UgeworICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhOwogI2lmIDEKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGdyYXkgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjb3Zlcl9zY2FuKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICB9CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IGdyYXkgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmF5LCBzcmNfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNvdmVyX3NjYW4pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQogI2Vsc2UKLSAgICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShtX0dyYXksIG1fR3JheSwgbV9HcmF5LCBtX0dyYXkpLCBjb2xfZW5kIC0gY29sX3N0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBncmF5ID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UobV9HcmF5LCBtX0dyYXksIG1fR3JheSwgbV9HcmF5KSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbF9lbmQgLSBjb2xfc3RhcnQpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKQorICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgZ3JheSA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjb3Zlcl9zY2FuKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICB9CisgICAgfQogI2VuZGlmCi0gICAgICAgIH0KLSAgICB9CisgIH0KK30KIAotICAgIHZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkdyYXlfNih1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0gICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotICAgICAgICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQ7Ci0gICAgICAgIGNsaXBfc2NhbiA9ICh1aW50OF90KiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AtY2xpcF90b3ApIC0gY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0OwotICAgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgaWYgKCFzcmNfYWxwaGExKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMjU1KQotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JheTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIHNyY19hbHBoYTEpOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV82KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKKyAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCAtIGNsaXBfdG9wKSAtCisgICAgICAgICAgICAgIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQ7CisgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgaWYgKCFzcmNfYWxwaGExKSB7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KKyAgICBpZiAoc3JjX2FscGhhMSA9PSAyNTUpCisgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyYXk7CisgICAgZWxzZSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBzcmNfYWxwaGExKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgfQorfQogCi0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV83KHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLSAgICAgICAgICAgIGludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0gICAgICAgICAgICBpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pCi0gICAgewotICAgICAgICBBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7Ci0gICAgICAgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKLSAgICAgICAgb3JpX3NjYW4gID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0OwotICAgICAgICBjbGlwX3NjYW4gPSAodWludDhfdCopbV9wQ2xpcE1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wLWNsaXBfdG9wKSAtIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKLSAgICAgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICAgICAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpIHJldHVybjsgLy8gZG8gbm90aGluZy4KLSAgICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydDsKLSAgICAgICAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0Owordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV83KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKKyAgb3JpX3NjYW4gPSAodWludDhfdCopbV9wT3JpRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQ7CisgIGNsaXBfc2NhbiA9ICh1aW50OF90KiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AgLSBjbGlwX3RvcCkgLQorICAgICAgICAgICAgICBjbGlwX2xlZnQgKyBzcGFuX2xlZnQ7CisgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICBpbnQgY29sX2VuZCA9CisgICAgICAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkKKyAgICByZXR1cm47ICAvLyBkbyBub3RoaW5nLgorICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0OworICBvcmlfc2NhbiArPSBjb2xfc3RhcnQ7CiAjaWYgMQotICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmF5OwotICAgICAgICAgICAgICAgIG9yaV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgZ3JheSA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY292ZXJfc2Nhbik7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgfQorICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICBpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmF5OworICAgICAgb3JpX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgZ3JheSA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbisrOworICB9CiAKICNlbHNlCi0gICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICBpZiAoIXNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgb3JpX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KXsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmF5OwotICAgICAgICAgICAgICAgICAgICBvcmlfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyYXk7Ci0gICAgICAgICAgICAgICAgICAgIG9yaV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgZ3JheSA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKKyAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoIXNyY19hbHBoYSkgeworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgb3JpX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyYXk7CisgICAgICAgIG9yaV9zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKICAgICB9Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JheTsKKyAgICAgICAgb3JpX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgZ3JheSA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY292ZXJfc2Nhbik7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICB2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5BUkdCXzIodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLSAgICAgICAgICAgIGludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLSAgICB7Ci0gICAgICAgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIChzcGFuX2xlZnQ8PDIpOwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0PDwyOwotICAgICAgICBpZiAobV9BbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIG1fQ29sb3IsIChjb2xfZW5kIC0gY29sX3N0YXJ0KTw8Mik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNyY19hbHBoYTsKK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfMih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdCA8PCAyKTsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKKyAgaWYgKG1fQWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgbV9Db2xvciwgKGNvbF9lbmQgLSBjb2xfc3RhcnQpIDw8IDIpOworICAgIHJldHVybjsKKyAgfQorICBpbnQgc3JjX2FscGhhOwogI2lmIDAKICAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewogICAgICAgICAgICAgaWYgKG1fQWxwaGEgPT0gMjU1KSB7CkBAIC0zMTksMjkzICszOTYsMzQxIEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZQogI2VuZGlmCi0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgIC8vIERlc3QgZm9ybWF0OiBBcmdiCi0gICAgICAgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotICAgICAgICAgICAgaWYgKGRlc3Rfc2NhblszXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBtX1JlZDsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEqMjU1L2Rlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgfQorICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIC8vIERlc3QgZm9ybWF0OiBBcmdiCisgICAgLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKKyAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKKyAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAqZGVzdF9zY2FuID0gbV9SZWQ7CisgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICBkZXN0X3NjYW5bM10gKyBzcmNfYWxwaGEgLSBkZXN0X3NjYW5bM10gKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbiArPSAyOworICB9Cit9CiAKLSAgICB2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5BUkdCXzModWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLSAgICAgICAgICAgIGludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLSAgICB7Ci0gICAgICAgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKLSAgICAgICAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0gICAgICAgIC8vb3JpX3NjYW4gID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0gICAgICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgICAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgICAgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0gICAgICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKLSAgICAgICAgLy9vcmlfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfMyh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOworICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0IDw8IDIpOworICAvLyBvcmlfc2NhbiAgPSAodWludDhfdCopbV9wT3JpRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0PDwyKTsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKKyAgLy8gb3JpX3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7CiAKLSAgICAgICAgaWYgKG1fQWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KXsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIG1fQ29sb3IsIChjb2xfZW5kIC0gY29sX3N0YXJ0KTw8Mik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvdmVyX3NjYW4gPT0gMjU1KSB7Ci0gICAgICAgICAgICBpbnQgZHN0X2NvbG9yID0gKDB4MDBmZmZmZmYmbV9Db2xvcil8KG1fQWxwaGE8PDI0KTsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIGRzdF9jb2xvciwgKGNvbF9lbmQgLSBjb2xfc3RhcnQpPDwyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBEbyBub3QgbmVlZCBvcmlnaW4gYml0bWFwLCBiZWNhdXNlIG9mIG1lcmdlIGluIHB1cmUgdHJhbnNwYXJlbnQgYmFja2dyb3VuZAotICAgICAgICBpbnQgc3JjX2FscGhhX2NvdmVyZWQgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNob3J0Y3V0Ci0gICAgICAgICAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGFfY292ZXJlZDsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gbV9CbHVlOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBtX1JlZDsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFdlIHNob3VsZCBkbyBhbHBoYSB0cmFuc2l0aW9uIGFuZCBjb2xvciB0cmFuc2l0aW9uCi0gICAgICAgICAgICAvLyBhbHBoYSBmZyAgICAgICAgICBjb2xvciBmZwotICAgICAgICAgICAgLy8gYWxwaGEgYmcgICAgICAgICAgY29sb3IgYmcKLSAgICAgICAgICAgIC8vIGFscGhhIGNvdmVyICAgICAgIGNvbG9yIGNvdmVyCi0gICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bM10sIG1fQWxwaGEsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgY292ZXJfc2Nhbik7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgY292ZXJfc2Nhbik7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgIH0KKyAgaWYgKG1fQWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgbV9Db2xvciwgKGNvbF9lbmQgLSBjb2xfc3RhcnQpIDw8IDIpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoY292ZXJfc2NhbiA9PSAyNTUpIHsKKyAgICBpbnQgZHN0X2NvbG9yID0gKDB4MDBmZmZmZmYgJiBtX0NvbG9yKSB8IChtX0FscGhhIDw8IDI0KTsKKyAgICBGWFNZU19tZW1zZXQoZGVzdF9zY2FuLCBkc3RfY29sb3IsIChjb2xfZW5kIC0gY29sX3N0YXJ0KSA8PCAyKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gRG8gbm90IG5lZWQgb3JpZ2luIGJpdG1hcCwgYmVjYXVzZSBvZiBtZXJnZSBpbiBwdXJlIHRyYW5zcGFyZW50IGJhY2tncm91bmQKKyAgaW50IHNyY19hbHBoYV9jb3ZlcmVkID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAvLyBzaG9ydGN1dAorICAgIGlmIChkZXN0X3NjYW5bM10gPT0gMCkgeworICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhX2NvdmVyZWQ7CisgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQl82KHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLSAgICAgICAgICAgIGludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0gICAgICAgICAgICBpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pCi0gICAgewotICAgICAgICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0PDwyKTsKLSAgICAgICAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcC1jbGlwX3RvcCkgLSBjbGlwX2xlZnQgKyBzcGFuX2xlZnQ7Ci0gICAgICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgICAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgICAgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0gICAgICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKKyAgICAvLyBXZSBzaG91bGQgZG8gYWxwaGEgdHJhbnNpdGlvbiBhbmQgY29sb3IgdHJhbnNpdGlvbgorICAgIC8vIGFscGhhIGZnICAgICAgICAgIGNvbG9yIGZnCisgICAgLy8gYWxwaGEgYmcgICAgICAgICAgY29sb3IgYmcKKyAgICAvLyBhbHBoYSBjb3ZlciAgICAgICBjb2xvciBjb3ZlcgorICAgIGRlc3Rfc2NhblszXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblszXSwgbV9BbHBoYSwgY292ZXJfc2Nhbik7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuICs9IDI7CisgIH0KK30KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfNih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdCA8PCAyKTsKKyAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCAtIGNsaXBfdG9wKSAtCisgICAgICAgICAgICAgIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKICNpZiAxCi0gICAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0gc3JjX2FscGhhKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgIGlmICghc3JjX2FscGhhMSkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVzdCBmb3JtYXQ6IEFyZ2IKLSAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotICAgICAgICAgICAgICAgIGlmIChkZXN0X3NjYW5bM10gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGExOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBtX1JlZDsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBkZXN0X3NjYW5bM10gKyBzcmNfYWxwaGExIC0gZGVzdF9zY2FuWzNdICogc3JjX2FscGhhMSAvIDI1NTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYTEqMjU1L2Rlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIGlmICghc3JjX2FscGhhMSkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYTEgPT0gMjU1KSB7CisgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIERlc3QgZm9ybWF0OiBBcmdiCisgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQorICAgICAgaWYgKGRlc3Rfc2NhblszXSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTE7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGRlc3Rfc2NhblszXSArIHNyY19hbHBoYTEgLSBkZXN0X3NjYW5bM10gKiBzcmNfYWxwaGExIC8gMjU1OworICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYTEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgIH0KKyAgfQogI2Vsc2UKLSAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIGlmICghc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpewotICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVzdCBmb3JtYXQ6IEFyZ2IKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3Rfc2NhblszXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBkZXN0X3NjYW5bM10gKyBzcmNfYWxwaGEgLSBkZXN0X3NjYW5bM10gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSoyNTUvZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPSBzcmNfYWxwaGEqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIGlmICghc3JjX2FscGhhMSkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBEZXN0IGZvcm1hdDogQXJnYgotICAgICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBkZXN0X3NjYW5bM10gKyBzcmNfYWxwaGExIC0gZGVzdF9zY2FuWzNdICogc3JjX2FscGhhMSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSoyNTUvZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoIXNyY19hbHBoYSkgeworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBEZXN0IGZvcm1hdDogQXJnYgorICAgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQorICAgICAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKKyAgICAgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGE7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICBkZXN0X3NjYW5bM10gKyBzcmNfYWxwaGEgLSBkZXN0X3NjYW5bM10gKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgaWYgKCFzcmNfYWxwaGExKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgeworICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlc3QgZm9ybWF0OiBBcmdiCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiBhbHBoYSAoaXQncyB1bmlvbiBvZiBzb3VyY2UgYW5kIGRlc3QgYWxwaGEpCisgICAgICAgIGlmIChkZXN0X3NjYW5bM10gPT0gMCkgeworICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTE7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICBkZXN0X3NjYW5bM10gKyBzcmNfYWxwaGExIC0gZGVzdF9zY2FuWzNdICogc3JjX2FscGhhMSAvIDI1NTsKKyAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICB9CisgICAgfQorICB9CiAjZW5kaWYKLSAgICB9Cit9CiAKLSAgICB2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5BUkdCXzcodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLSAgICAgICAgICAgIGludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLSAgICB7Ci0gICAgICAgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKLSAgICAgICAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0gICAgICAgIC8vb3JpX3NjYW4gID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0gICAgICAgIGNsaXBfc2NhbiA9ICh1aW50OF90KiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AtY2xpcF90b3ApIC0gY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7Ci0gICAgICAgIC8vb3JpX3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7Ci0gICAgICAgIC8vIERvIG5vdCBuZWVkIG9yaWdpbiBiaXRtYXAsIGJlY2F1c2Ugb2YgbWVyZ2UgaW4gcHVyZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kCi0gICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgaW50IHNyY19hbHBoYV9jb3ZlcmVkID0gc3JjX2FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLSAgICAgICAgICAgIC8vIHNob3J0Y3V0Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhX2NvdmVyZWQgPT0gMCl7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzaG9ydGN1dAotICAgICAgICAgICAgaWYgKGNvdmVyX3NjYW4gPT0gMjU1IHx8IGRlc3Rfc2NhblszXSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG9yaWdpbiBhbHBoYSBhbHdheXMgemVybywganVzdCBnZXQgc3JjIGFscGhhCi0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhX2NvdmVyZWQ7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IG1fQmx1ZTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gbV9HcmVlbjsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gbV9SZWQ7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBXZSBzaG91bGQgZG8gYWxwaGEgdHJhbnNpdGlvbiBhbmQgY29sb3IgdHJhbnNpdGlvbgotICAgICAgICAgICAgLy8gYWxwaGEgZmcgICAgICAgICAgY29sb3IgZmcKLSAgICAgICAgICAgIC8vIGFscGhhIGJnICAgICAgICAgIGNvbG9yIGJnCi0gICAgICAgICAgICAvLyBhbHBoYSBjb3ZlciAgICAgICBjb2xvciBjb3ZlcgotICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzNdLCBzcmNfYWxwaGEsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgY292ZXJfc2Nhbik7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgY292ZXJfc2Nhbik7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgIH0KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfNyh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOworICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0IDw8IDIpOworICAvLyBvcmlfc2NhbiAgPSAodWludDhfdCopbV9wT3JpRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0PDwyKTsKKyAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCAtIGNsaXBfdG9wKSAtCisgICAgICAgICAgICAgIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKKyAgLy8gb3JpX3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7CisgIC8vIERvIG5vdCBuZWVkIG9yaWdpbiBiaXRtYXAsIGJlY2F1c2Ugb2YgbWVyZ2UgaW4gcHVyZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kCisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIGludCBzcmNfYWxwaGFfY292ZXJlZCA9IHNyY19hbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgICAgLy8gc2hvcnRjdXQKKyAgICBpZiAoc3JjX2FscGhhX2NvdmVyZWQgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKICAgICB9CisgICAgLy8gc2hvcnRjdXQKKyAgICBpZiAoY292ZXJfc2NhbiA9PSAyNTUgfHwgZGVzdF9zY2FuWzNdID09IDApIHsKKyAgICAgIC8vIG9yaWdpbiBhbHBoYSBhbHdheXMgemVybywganVzdCBnZXQgc3JjIGFscGhhCisgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGFfY292ZXJlZDsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAqZGVzdF9zY2FuID0gbV9SZWQ7CisgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvLyBXZSBzaG91bGQgZG8gYWxwaGEgdHJhbnNpdGlvbiBhbmQgY29sb3IgdHJhbnNpdGlvbgorICAgIC8vIGFscGhhIGZnICAgICAgICAgIGNvbG9yIGZnCisgICAgLy8gYWxwaGEgYmcgICAgICAgICAgY29sb3IgYmcKKyAgICAvLyBhbHBoYSBjb3ZlciAgICAgICBjb2xvciBjb3ZlcgorICAgIGRlc3Rfc2NhblszXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblszXSwgc3JjX2FscGhhLCBjb3Zlcl9zY2FuKTsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4gKz0gMjsKKyAgfQorfQogCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfMih1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0gICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0gICAgICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgICAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgICAgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0gICAgICAgIGRlc3Rfc2NhbiArPSAoY29sX3N0YXJ0IDw8IDIpOwotICAgICAgICBpZiAobV9BbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIG1fQ29sb3IsIChjb2xfZW5kIC0gY29sX3N0YXJ0KTw8Mik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNyY19hbHBoYTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfMih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0IDw8IDIpOworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IChjb2xfc3RhcnQgPDwgMik7CisgIGlmIChtX0FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIG1fQ29sb3IsIChjb2xfZW5kIC0gY29sX3N0YXJ0KSA8PCAyKTsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IHNyY19hbHBoYTsKICNpZiAwCiAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpCiAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwogICAgICAgICBlbHNlCiAjZW5kaWYKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgLy8gRGVzdCBmb3JtYXQ6ICBSZ2IzMgotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfMyh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0gICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0gICAgICAgIG9yaV9zY2FuICA9ICh1aW50OF90KiltX3BPcmlEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIChzcGFuX2xlZnQ8PDIpOwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7Ci0gICAgICAgIG9yaV9zY2FuICs9IGNvbF9zdGFydCA8PCAyOwotICAgICAgICBpZiAobV9BbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIG1fQ29sb3IsIChjb2xfZW5kIC0gY29sX3N0YXJ0KTw8Mik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7CisgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgLy8gRGVzdCBmb3JtYXQ6ICBSZ2IzMgorICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgIGRlc3Rfc2NhbiArPSAyOworICB9Cit9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IzMl8zKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIChzcGFuX2xlZnQgPDwgMik7CisgIG9yaV9zY2FuID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdCA8PCAyKTsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKKyAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7CisgIGlmIChtX0FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIG1fQ29sb3IsIChjb2xfZW5kIC0gY29sX3N0YXJ0KSA8PCAyKTsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGE7CisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKICNpZiAwCiAgICAgICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7CiAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKQEAgLTYxNSwyMzEgKzc0MCwyNzMgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICNlbmRpZgotICAgICAgICAgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGludCByID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIG9yaV9zY2FuICs9IDI7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoICpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfNih1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0gICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0gICAgICAgIGNsaXBfc2NhbiA9ICh1aW50OF90KiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AtY2xpcF90b3ApIC0gY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7CisgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOworICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgIG9yaV9zY2FuICs9IDI7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBnLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuICs9IDI7CisgIH0KK30KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjMyXzYodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdCA8PCAyKTsKKyAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCAtIGNsaXBfdG9wKSAtCisgICAgICAgICAgICAgIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKICNpZiAxCi0gICAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICBpZiAoIXNyY19hbHBoYTEpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgewotICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2Igb3IgUmdiMzIKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGExKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYTEpOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYTEpOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgaWYgKCFzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiIG9yIFJnYjMyCi0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBSZ2IzMgotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIGlmICghc3JjX2FscGhhMSkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiIG9yIFJnYjMyCi0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYTEpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGExKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYTEpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgorICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIGlmICghc3JjX2FscGhhMSkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfNyh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0gICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotICAgICAgICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0PDwyKTsKLSAgICAgICAgb3JpX3NjYW4gID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0gICAgICAgIGNsaXBfc2NhbiA9ICh1aW50OF90KiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AtY2xpcF90b3ApIC0gY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7Ci0gICAgICAgIG9yaV9zY2FuICs9IGNvbF9zdGFydCA8PCAyOworICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgeworICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgIH0gZWxzZSB7CisgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiIG9yIFJnYjMyCisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGExKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYTEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYTEpOworICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgfQorICB9CisjZWxzZQorICBpZiAobV9iRnVsbENvdmVyKSB7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgIGlmICghc3JjX2FscGhhKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRGVzdCBmb3JtYXQ6IFJnYiBvciBSZ2IzMgorICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBSZ2IzMgorICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgaWYgKCFzcmNfYWxwaGExKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgeworICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2Igb3IgUmdiMzIKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhMSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhMSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYTEpOworICAgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorfQordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfNyh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIChzcGFuX2xlZnQgPDwgMik7CisgIG9yaV9zY2FuID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdCA8PCAyKTsKKyAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCAtIGNsaXBfdG9wKSAtCisgICAgICAgICAgICAgIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKKyAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7CiAjaWYgMQotICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICBvcmlfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGludCByID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIG9yaV9zY2FuICs9IDI7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoICpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICBpZiAoIXNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSAqKEZYX0RXT1JEKilvcmlfc2NhbjsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIG9yaV9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgb3JpX3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7IG9yaV9zY2FuICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIG9yaV9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgb3JpX3NjYW4gKz0gMjsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoICpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbik7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBvcmlfc2NhbiArPSA0OworICAgICAgY29udGludWU7CiAgICAgfQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzIodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLSAgICAgICAgICAgIGludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLSAgICB7Ci0gICAgICAgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCArIChzcGFuX2xlZnQ8PDEpOwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotICAgICAgICBkZXN0X3NjYW4gKz0gKGNvbF9zdGFydDw8MSkrY29sX3N0YXJ0OwotICAgICAgICBpbnQgc3JjX2FscGhhOworICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICBpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgIGludCByID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICBvcmlfc2NhbiArPSAyOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbiArPSAyOworICB9CisjZWxzZQorICBpZiAobV9iRnVsbENvdmVyKSB7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgIGlmICghc3JjX2FscGhhKSB7CisgICAgICAgICooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9ICooRlhfRFdPUkQqKW9yaV9zY2FuOworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgb3JpX3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgb3JpX3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgb3JpX3NjYW4gKz0gMjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgICAgICooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBvcmlfc2NhbiArPSA0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgICBvcmlfc2NhbiArPSAyOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW4pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbik7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuKTsKKyAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgIH0KKyAgfQorI2VuZGlmCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgZGVzdF9zY2FuID0KKyAgICAgICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCArIChzcGFuX2xlZnQgPDwgMSk7CisgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICBpbnQgY29sX2VuZCA9CisgICAgICAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkKKyAgICByZXR1cm47ICAvLyBkbyBub3RoaW5nLgorICBkZXN0X3NjYW4gKz0gKGNvbF9zdGFydCA8PCAxKSArIGNvbF9zdGFydDsKKyAgaW50IHNyY19hbHBoYTsKICNpZiAwCiAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpCiAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwogICAgICAgICBlbHNlCiAjZW5kaWYKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICB9CisgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKICAgICB9Ci0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMjRfMyh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0gICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotICAgICAgICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQgKyAoc3Bhbl9sZWZ0PDwxKTsKLSAgICAgICAgb3JpX3NjYW4gID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0ICsgKHNwYW5fbGVmdDw8MSk7Ci0gICAgICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgICAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgICAgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0gICAgICAgIGRlc3Rfc2NhbiArPSAoY29sX3N0YXJ0PDwxKSArIGNvbF9zdGFydDsKLSAgICAgICAgb3JpX3NjYW4gKz0gKGNvbF9zdGFydDw8MSkgKyBjb2xfc3RhcnQ7Ci0gICAgICAgIGlmIChtX0FscGhhID09IDI1NSYmY292ZXJfc2NhbiA9PSAyNTUpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IG1fQmx1ZTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gbV9HcmVlbjsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gbV9SZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgIGRlc3Rfc2NhbisrOworICB9Cit9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8zKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKKyAgZGVzdF9zY2FuID0KKyAgICAgICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCArIChzcGFuX2xlZnQgPDwgMSk7CisgIG9yaV9zY2FuID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0ICsKKyAgICAgICAgICAgICAoc3Bhbl9sZWZ0IDw8IDEpOworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IChjb2xfc3RhcnQgPDwgMSkgKyBjb2xfc3RhcnQ7CisgIG9yaV9zY2FuICs9IChjb2xfc3RhcnQgPDwgMSkgKyBjb2xfc3RhcnQ7CisgIGlmIChtX0FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKICNpZiAwCiAgICAgICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7CiAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgbV9BbHBoYSk7CkBAIC04NDgsNzYyICsxMDE1LDgzNCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgICAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIG1fQWxwaGEpOwotICAgICAgICAgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgbV9BbHBoYSk7Ci0gICAgICAgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgbV9BbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoICpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzYodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLSAgICAgICAgICAgIGludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLSAgICB7Ci0gICAgICAgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCsoc3Bhbl9sZWZ0PDwxKTsKLSAgICAgICAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcC1jbGlwX3RvcCkgLSBjbGlwX2xlZnQgKyBzcGFuX2xlZnQ7Ci0gICAgICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgICAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgICAgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0gICAgICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKyAoY29sX3N0YXJ0IDw8IDEpOworICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgbV9BbHBoYSk7CisgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgbV9BbHBoYSk7CisgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIG1fQWxwaGEpOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbisrOworICB9Cit9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF82KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIGRlc3Rfc2NhbiA9CisgICAgICAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQgKyAoc3Bhbl9sZWZ0IDw8IDEpOworICBjbGlwX3NjYW4gPSAodWludDhfdCopbV9wQ2xpcE1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wIC0gY2xpcF90b3ApIC0KKyAgICAgICAgICAgICAgY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCArIChjb2xfc3RhcnQgPDwgMSk7CiAjaWYgMQotICAgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLzI1NTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICBpZiAoIXNyY19hbHBoYTEpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiCi0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhMSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGExKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGExKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICBpZiAoIXNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9SZWQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVzdCBmb3JtYXQ6IFJnYgotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvMjU1OwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIGlmICghc3JjX2FscGhhMSkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2IKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhMSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYTEpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhMSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgorICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIGlmICghc3JjX2FscGhhMSkgeworICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMjRfNyh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0gICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotICAgICAgICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQrKHNwYW5fbGVmdDw8MSk7Ci0gICAgICAgIG9yaV9zY2FuICA9ICh1aW50OF90KiltX3BPcmlEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCsoc3Bhbl9sZWZ0PDwxKTsKLSAgICAgICAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcC1jbGlwX3RvcCkgLSBjbGlwX2xlZnQgKyBzcGFuX2xlZnQ7Ci0gICAgICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgICAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgICAgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0gICAgICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKyAoY29sX3N0YXJ0PDwxKTsKLSAgICAgICAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0ICsgKGNvbF9zdGFydDw8MSk7CisgICAgaWYgKHNyY19hbHBoYTEgPT0gMjU1KSB7CisgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgKmRlc3Rfc2NhbisrID0gbV9SZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2IKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYTEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhMSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhMSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0KKyNlbHNlCisgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgaWYgKCFzcmNfYWxwaGEpIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2IKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoIXNyY19hbHBoYTEpIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9SZWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiCisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYTEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYTEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGExKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKK30KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzcodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOworICBkZXN0X3NjYW4gPQorICAgICAgKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0ICsgKHNwYW5fbGVmdCA8PCAxKTsKKyAgb3JpX3NjYW4gPSAodWludDhfdCopbV9wT3JpRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQgKworICAgICAgICAgICAgIChzcGFuX2xlZnQgPDwgMSk7CisgIGNsaXBfc2NhbiA9ICh1aW50OF90KiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AgLSBjbGlwX3RvcCkgLQorICAgICAgICAgICAgICBjbGlwX2xlZnQgKyBzcGFuX2xlZnQ7CisgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICBpbnQgY29sX2VuZCA9CisgICAgICAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkKKyAgICByZXR1cm47ICAvLyBkbyBub3RoaW5nLgorICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICsgKGNvbF9zdGFydCA8PCAxKTsKKyAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0ICsgKGNvbF9zdGFydCA8PCAxKTsKICNpZiAxCi0gICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKLSAgICAgICAgICAgICAgICBvcmlfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGludCByID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCAqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBnLCBjb3Zlcl9zY2FuKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIGlmICghc3JjX2FscGhhKXsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKm9yaV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpvcmlfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqb3JpX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KXsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKLSAgICAgICAgICAgICAgICAgICAgb3JpX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9SZWQ7Ci0gICAgICAgICAgICAgICAgICAgIG9yaV9zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoICpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW4pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbik7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgorICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICBpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOworICAgICAgb3JpX3NjYW4gKz0gMzsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICB2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8xMCh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0gICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0KyhzcGFuX2xlZnQ8PDEpOwotICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4gPSAgKHVpbnQ4X3QqKW1fcERldmljZS0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCkrc3Bhbl9sZWZ0OwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0Kyhjb2xfc3RhcnQ8PDEpOworICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICBpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgIGludCByID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fUmVkLCBzcmNfYWxwaGEpOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbisrOworICB9CisjZWxzZQorICBpZiAobV9iRnVsbENvdmVyKSB7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgIGlmICghc3JjX2FscGhhKSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpvcmlfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqb3JpX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKm9yaV9zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKKyAgICAgICAgb3JpX3NjYW4gKz0gMzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOworICAgICAgICBvcmlfc2NhbiArPSAzOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW4pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbik7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0KKyNlbmRpZgorfQordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMjRfMTAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBkZXN0X3NjYW4gPQorICAgICAgKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0ICsgKHNwYW5fbGVmdCA8PCAxKTsKKyAgZGVzdF9leHRyYV9hbHBoYV9zY2FuID0KKyAgICAgICh1aW50OF90KiltX3BEZXZpY2UtPm1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0OworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCArIChjb2xfc3RhcnQgPDwgMSk7CiAjaWYgMQotICAgICAgICBpZiAobV9BbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fR3JlZW47Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9SZWQ7Ci0gICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2JhCi0gICAgICAgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSoyNTUvZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgICAgaWYgKG1fQWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2JhCi0gICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKLSAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBtX0FscGhhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIG1fQWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBtX0FscGhhKjI1NS9kZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fQWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2JhCi0gICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKLSAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhKjI1NS9kZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKKyAgaWYgKG1fQWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOworICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9HcmVlbjsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fUmVkOworICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gMjU1OwogICAgIH0KLSAgICB2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8xNCh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0gICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0KyhzcGFuX2xlZnQ8PDEpOwotICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4gPSAgKHVpbnQ4X3QqKW1fcERldmljZS0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCkrc3Bhbl9sZWZ0OwotICAgICAgICBjbGlwX3NjYW4gPSAodWludDhfdCopbV9wQ2xpcE1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wLWNsaXBfdG9wKSAtIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKLSAgICAgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICAgICAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpIHJldHVybjsgLy8gZG8gbm90aGluZy4KLSAgICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCArIChjb2xfc3RhcnQgPDwgMSk7CisgICAgcmV0dXJuOworICB9CisgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIC8vIERlc3QgZm9ybWF0OiBSZ2JhCisgICAgLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgIH0KKyNlbHNlCisgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICBpZiAobV9BbHBoYSA9PSAyNTUpIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOworICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX0dyZWVuOworICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKKyAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gMjU1OworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiYQorICAgICAgLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKKyAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9ICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSArIG1fQWxwaGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogbV9BbHBoYSAvIDI1NTsKKyAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBtX0FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG1fQWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fQmx1ZTsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9HcmVlbjsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9SZWQ7CisgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IDI1NTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2JhCisgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQorICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgfQorI2VuZGlmCit9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8xNCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIGRlc3Rfc2NhbiA9CisgICAgICAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQgKyAoc3Bhbl9sZWZ0IDw8IDEpOworICBkZXN0X2V4dHJhX2FscGhhX3NjYW4gPQorICAgICAgKHVpbnQ4X3QqKW1fcERldmljZS0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQ7CisgIGNsaXBfc2NhbiA9ICh1aW50OF90KiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AgLSBjbGlwX3RvcCkgLQorICAgICAgICAgICAgICBjbGlwX2xlZnQgKyBzcGFuX2xlZnQ7CisgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICBpbnQgY29sX2VuZCA9CisgICAgICAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkKKyAgICByZXR1cm47ICAvLyBkbyBub3RoaW5nLgorICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICsgKGNvbF9zdGFydCA8PCAxKTsKICNpZiAxCi0gICAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICBpZiAoIXNyY19hbHBoYTEpIHsKLSAgICAgICAgICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fQmx1ZTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX0dyZWVuOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fUmVkOwotICAgICAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9ICh1aW50OF90KW1fQWxwaGE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2JhCi0gICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKLSAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGExIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYTEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExKjI1NS9kZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgaWYgKCFzcmNfYWxwaGExKSB7CisgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKKyAgICAgIGRlc3Rfc2NhbiArPSAzOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgeworICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOworICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9HcmVlbjsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fUmVkOworICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gKHVpbnQ4X3QpbV9BbHBoYTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRGVzdCBmb3JtYXQ6IFJnYmEKKyAgICAgIC8vIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiBhbHBoYSAoaXQncyB1bmlvbiBvZiBzb3VyY2UgYW5kIGRlc3QgYWxwaGEpCisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGExIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYTEgLyAyNTU7CisgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICB9CiAjZWxzZQotICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgaWYgKCFzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gKHVpbnQ4X3QpbV9BbHBoYTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiYQotICAgICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhKjI1NS9kZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPSBtX0FscGhhICogY292ZXJfc2NhbiAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIGlmICghc3JjX2FscGhhMSkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gKHVpbnQ4X3QpbV9BbHBoYTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiYQotICAgICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGExIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKiBzcmNfYWxwaGExIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExKjI1NS9kZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBpZiAobV9iRnVsbENvdmVyKSB7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgIGlmICghc3JjX2FscGhhKSB7CisgICAgICAgIGRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOworICAgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX0JsdWU7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fR3JlZW47CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fUmVkOworICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSAodWludDhfdCltX0FscGhhOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRGVzdCBmb3JtYXQ6IFJnYmEKKyAgICAgICAgLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKKyAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYTEgPSBtX0FscGhhICogY292ZXJfc2NhbiAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgaWYgKCFzcmNfYWxwaGExKSB7CisgICAgICAgIGRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOworICAgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhMSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOworICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX0dyZWVuOworICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKKyAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gKHVpbnQ4X3QpbV9BbHBoYTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2JhCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiBhbHBoYSAoaXQncyB1bmlvbiBvZiBzb3VyY2UgYW5kIGRlc3QgYWxwaGEpCisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9ICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSArIHNyY19hbHBoYTEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKiBzcmNfYWxwaGExIC8gMjU1OworICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KKyAgICB9CisgIH0KICNlbmRpZgotICAgIH0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgLy8gQSBnZW5lcmFsIGFscGhhIG1lcmdlIGZ1bmN0aW9uICh3aXRoIGNsaXBwaW5nIG1hc2spLiBDbXlrYS9DbXlrIGRldmljZS4KLSAgICB2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5DTVlLKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLSAgICAgICAgICAgIGludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0gICAgICAgICAgICBpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pCi0gICAgewotICAgICAgICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7Ci0gICAgICAgIC8vIENteWsoYSkKLSAgICAgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICAgICAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpIHJldHVybjsgLy8gZG8gbm90aGluZy4KLSAgICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIDQ7Ci0gICAgICAgIEJwcDsgLy8gZm9yIGF2b2lkIGNvbXBpbGUgd2FybmluZy4KKy8vIEEgZ2VuZXJhbCBhbHBoYSBtZXJnZSBmdW5jdGlvbiAod2l0aCBjbGlwcGluZyBtYXNrKS4gQ215a2EvQ215ayBkZXZpY2UuCit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5DTVlLKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKKyAgLy8gQ215ayhhKQorICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIDQ7CisgIEJwcDsgIC8vIGZvciBhdm9pZCBjb21waWxlIHdhcm5pbmcuCiAKLSAgICAgICAgaWYgKGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgICAgICAgICAgLy8gQ01ZS2EKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICooRlhfQ01ZSyopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4gPSAodWludDhfdCltX0FscGhhOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVzdCBmb3JtYXQ6IENteWthCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhKjI1NS9kZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDTVlLCi0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotCi0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9DTVlLKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVzdCBmb3JtYXQ6IGNteWsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgRlhfQk9PTCBDRlhfU2tpYVJlbmRlcmVyOjpJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIC8vVGhlIGFscGhhIGZsYWcgbXVzdCBiZSBmaWxsX2ZsYWcgaWYgZXhpc3QuCi0gICAgewotICAgICAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwotICAgICAgICBtX3BDbGlwUmduID0gcENsaXBSZ247Ci0gICAgICAgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7Ci0gICAgICAgIG1fcE9yaURldmljZSA9IHBPcmlEZXZpY2U7Ci0gICAgICAgIG1fcERlc3RTY2FuID0gTlVMTDsKLSAgICAgICAgbV9wRGVzdEV4dHJhQWxwaGFTY2FuID0gTlVMTDsKLSAgICAgICAgbV9wT3JpU2NhbiA9IE5VTEw7Ci0gICAgICAgIG1fcENsaXBTY2FuID0gTlVMTDsKLSAgICAgICAgY29tcG9zaXRlX3NwYW4gPSBOVUxMOwotICAgICAgICBpZiAobV9wQ2xpcFJnbikKLSAgICAgICAgICAgIG1fQ2xpcEJveCA9IG1fcENsaXBSZ24tPkdldEJveCgpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG1fQ2xpcEJveC5sZWZ0ID0gbV9DbGlwQm94LnRvcCA9IDA7Ci0gICAgICAgICAgICBtX0NsaXBCb3gucmlnaHQgPSBtX3BEZXZpY2UtPkdldFdpZHRoKCk7Ci0gICAgICAgICAgICBtX0NsaXBCb3guYm90dG9tID0gbV9wRGV2aWNlLT5HZXRIZWlnaHQoKTsKLSAgICAgICAgfQotICAgICAgICBtX3BDbGlwTWFzayA9IE5VTEw7Ci0gICAgICAgIGlmIChtX3BDbGlwUmduICYmIG1fcENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6TWFza0YpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcENsaXBNYXNrID0gbV9wQ2xpcFJnbi0+R2V0TWFzaygpOwotICAgICAgICAgICAgbV9wQ2xpcFNjYW4gPSBtX3BDbGlwTWFzay0+R2V0QnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcERldmljZS0+bV9wQWxwaGFNYXNrKQotICAgICAgICAgICAgbV9wRGVzdEV4dHJhQWxwaGFTY2FuID0gbV9wRGV2aWNlLT5tX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpOwotICAgICAgICBpZiAobV9wT3JpRGV2aWNlKQotICAgICAgICAgICAgbV9wT3JpU2NhbiA9IG1fcE9yaURldmljZS0+R2V0QnVmZmVyKCk7Ci0gICAgICAgIG1fcERlc3RTY2FuID0gbV9wRGV2aWNlLT5HZXRCdWZmZXIoKTsKLQotICAgICAgICBtX2JGdWxsQ292ZXIgPSBiRnVsbENvdmVyOwotCi0gICAgICAgIEZYX0JPT0wgYk9iamVjdENNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOwotICAgICAgICBGWF9CT09MIGJEZXZpY2VDTVlLID0gcERldmljZS0+SXNDbXlrSW1hZ2UoKTsKLQotICAgICAgICBtX0FscGhhID0gYk9iamVjdENNWUsgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKLQotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gTlVMTDsKLSAgICAgICAgLy8gTm8gbGNtcyBlbmdpbmUsIHdlIHNraXAgdGhlIHRyYW5zZm9ybQotICAgICAgICBpZiAoIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkgfHwgIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKQotICAgICAgICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CisgIGlmIChkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgICAvLyBDTVlLYQorICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICBpZiAobV9iRnVsbENvdmVyKSB7CisgICAgICAgIGlmIChjbGlwX3NjYW4pCisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjbGlwX3NjYW4pCisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICAgICAgfQogCi0gICAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDgpIHsgLy8gR3JheShhKSBkZXZpY2UKLSAgICAgICAgICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICAvL0FscGhhIE1hc2sKLSAgICAgICAgICAgICAgICBtX0dyYXkgPSAyNTU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vR3JheShhKSBkZXZpY2UKLSAgICAgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGdyYXk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYk9iamVjdENNWUsgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOwotICAgICAgICAgICAgICAgICAgICBtX0dyYXkgPSBncmF5OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiT2JqZWN0Q01ZSykgewotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByLCBnLCBiOwotICAgICAgICAgICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksIEZYU1lTX0dldFlWYWx1ZShjb2xvciksIEZYU1lTX0dldEtWYWx1ZShjb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX0dyYXkgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9HcmF5ID0gRlhSR0IyR1JBWShGWEFSR0JfUihjb2xvciksIEZYQVJHQl9HKGNvbG9yKSwgRlhBUkdCX0IoY29sb3IpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAqKEZYX0NNWUsqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7CisgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbiA9ICh1aW50OF90KW1fQWxwaGE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYkRldmljZUNNWUspIHsgLy8gQ215ayhhKSBEZXZpY2UKLSAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7Ci0gICAgICAgICAgICAgICAgLy9UT0RPLi4uIG9wdCBmb3IgY215awotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5DTVlLOwotICAgICAgICAgICAgICAgIGlmIChiT2JqZWN0Q01ZSykgewotICAgICAgICAgICAgICAgICAgICBtX0NvbG9yID0gRlhDTVlLX1RPRElCKGNvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pCi0gICAgICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsIChjb25zdCB1aW50OF90KikmbV9Db2xvciwgMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gT2JqZWN0IFJHQgotICAgICAgICAgICAgICAgICAgICBpZiAoIXBJY2NUcmFuc2Zvcm0pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGNvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLCAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9SZWQgICA9ICgodWludDhfdCopJm1fQ29sb3IpWzBdOwotICAgICAgICAgICAgICAgIG1fR3JlZW4gPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsxXTsKLSAgICAgICAgICAgICAgICBtX0JsdWUgID0gKCh1aW50OF90KikmbV9Db2xvcilbMl07Ci0gICAgICAgICAgICAgICAgbV9HcmF5ICA9ICgodWludDhfdCopJm1fQ29sb3IpWzNdOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICBjb2xvciA9IGJPYmplY3RDTVlLID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLCAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKLSAgICAgICAgICAgICAgICAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXSA9IG1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgbV9SZWQgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsyXTsKLSAgICAgICAgICAgICAgICBtX0dyZWVuID0gKCh1aW50OF90KikmbV9Db2xvcilbMV07Ci0gICAgICAgICAgICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07Ci0gICAgICAgICAgICAgICAgLy8gTmVlZCBKb2huc29uIHRvIGltcHJvdmVtZW50IGl0LgotICAgICAgICAgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc3dhcAotICAgICAgICAgICAgICAgICAgICBtX1JlZCA9ICgodWludDhfdCopJm1fQ29sb3IpWzBdOwotICAgICAgICAgICAgICAgICAgICBtX0JsdWUgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsyXTsKLSAgICAgICAgICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0RJQihtX0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0JHUk9SREVSRElCKG1fQ29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKLSAgICAgICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksIEZYU1lTX0dldFlWYWx1ZShjb2xvciksIEZYU1lTX0dldEtWYWx1ZShjb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9NQUtFKG1fQWxwaGEsIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihtX0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fUmVkID0gYjsgbV9HcmVlbiA9IGc7IG1fQmx1ZSA9IHI7Ly8KLSAgICAgICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0RJQihtX0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fUmVkID0gcjsgbV9HcmVlbiA9IGc7IG1fQmx1ZSA9IGI7Ly8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpewotICAgICAgICAgICAgICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0JHUk9SREVSRElCKGNvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JEZWNvZGUoY29sb3IsIG1fQWxwaGEsIG1fQmx1ZSwgbV9HcmVlbiwgbV9SZWQpOyAvLwotICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JEZWNvZGUoY29sb3IsIG1fQWxwaGEsIG1fUmVkLCBtX0dyZWVuLCBtX0JsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgIC8vIERlc3QgZm9ybWF0OiBDbXlrYQorICAgICAgICAgIC8vIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiBhbHBoYSAoaXQncyB1bmlvbiBvZiBzb3VyY2UgYW5kIGRlc3QgYWxwaGEpCisgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICAvLyBHZXQgcGFsZXR0ZSB0cmFuc3BhcmVuY3kgc2VsZWN0b3IKLSAgICAgICAgbV9Qcm9jZXNzRmlsdGVyID0gKG1fcE9yaURldmljZT8gMSA6IDApIC8qIGhhcyBPcmkgRGV2aWNlIGZsYWcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICsgKG1fcERldmljZS0+R2V0QlBQKCkgPj0gOCA/IDIgOiAwKSAgICAvKiBicHAgZmxhZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKyAobV9wQ2xpcE1hc2s/IDQgOiAwKSAgICAgICAgICAgICAgICAgIC8qIGhhcyBjbGlwIHJlZ2lvbiBmbGFnICovCi0gICAgICAgICAgICAgICAgICAgICAgICArIChtX3BEZXZpY2UtPm1fcEFscGhhTWFzaz8gOCA6IDApOyAgICAgLyogaGFzIEFscGhhIE1hc2sgY2hhbmVsIGZsYWcgKi8KLSAgICAgICAgc3dpdGNoKG1fUHJvY2Vzc0ZpbHRlcikgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW4xYnBwXzA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSA4KQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkdyYXlfMjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSAyNCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8yOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVfc3BhbiA9IG1fcERldmljZS0+SGFzQWxwaGEoKT8mQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfMiA6ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSA4KQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkdyYXlfMzsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSAyNCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8zOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVfc3BhbiA9IG1fcERldmljZS0+SGFzQWxwaGEoKT8mQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfMyA6ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfMzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbjFicHBfNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDgpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV82OwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDI0KQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzY7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpPyZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQl82IDogJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IzMl82OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDgpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV83OwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDI0KQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0Xzc7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpPyZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQl83IDogJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IzMl83OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgLy9UT0RPLi4uCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8xMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzE0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wb3NpdGVfc3BhbiA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAgIGRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOworICAgICAgZGVzdF9zY2FuICs9IDQ7CiAgICAgfQorICB9IGVsc2UgeworICAgIC8vIENNWUsKKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgaWYgKGNsaXBfc2NhbikKKyAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CiAKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHZvaWQgQ0ZYX1NraWFBOFJlbmRlcmVyOjpibGl0QW50aUgoaW50IHgsIGludCB5LCBjb25zdCBTa0FscGhhIGFudGlhbGlhc1tdLCBjb25zdCBpbnQxNl90IHJ1bnNbXSkKLSAgICB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChtX3BEZXZpY2UpOwotICAgICAgICBpbnQgZHN0X3kgPSB5IC0gbV9Ub3A7Ci0gICAgICAgIGlmIChkc3RfeSA8IDAgfHwgZHN0X3kgPj0gIG1fcERldmljZS0+R2V0SGVpZ2h0KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wRGV2aWNlLT5HZXRCdWZmZXIoKSArIG1fcERldmljZS0+R2V0UGl0Y2goKSAqIGRzdF95OwotICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9IGRlc3Rfc2NhbjsKLSAgICAgICAgd2hpbGUgKDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4ID49IG1fZHN0V2lkdGgpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaW50IHdpZHRoID0gcnVuc1swXTsKLSAgICAgICAgICAgIFNrQVNTRVJUKHdpZHRoID49IDApOwotICAgICAgICAgICAgaWYgKHdpZHRoIDw9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgdW5zaWduZWQgYWEgPSBhbnRpYWxpYXNbMF07Ci0gICAgICAgICAgICBpZiAoYWEpIHsKLSAgICAgICAgICAgICAgICBpbnQgY29sX3N0YXJ0ID0geCA8IG1fTGVmdCA/IDAgOiB4IC0gbV9MZWZ0OwotICAgICAgICAgICAgICAgIGludCBjb2xfZW5kID0geCArIHdpZHRoOwotICAgICAgICAgICAgICAgIGNvbF9lbmQgPSBjb2xfZW5kIDwgbV9kc3RXaWR0aCA/IGNvbF9lbmQgLSBtX0xlZnQ6IG1fcERldmljZS0+R2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gY29sX2VuZCAtIGNvbF9zdGFydDsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Rfc2NhbiArIGNvbF9zdGFydDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA+PSA0KQotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfcG9zLCBGWEFSR0JfTUFLRShhYSwgYWEsIGFhLCBhYSkscmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfcG9zLGFhLHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVucyArPSB3aWR0aDsKLSAgICAgICAgICAgIGFudGlhbGlhcyArPSB3aWR0aDsKLSAgICAgICAgICAgIHggKz0gd2lkdGg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBDRlhfU2tpYUE4UmVuZGVyZXI6OmJsaXRIKGludCB4LCBpbnQgeSwgaW50IHdpZHRoKQotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fcERldmljZSk7Ci0gICAgICAgIGludCBkc3RfeSA9IHkgLSBtX1RvcDsKLSAgICAgICAgaWYgKGRzdF95IDwgMCB8fCBkc3RfeSA+PSAgbV9wRGV2aWNlLT5HZXRIZWlnaHQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHggPj0gbV9kc3RXaWR0aCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wRGV2aWNlLT5HZXRCdWZmZXIoKSArIG1fcERldmljZS0+R2V0UGl0Y2goKSAqIGRzdF95OwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0geCA8IG1fTGVmdCA/IDAgOiB4IC0gbV9MZWZ0OwotICAgICAgICBpbnQgY29sX2VuZCA9IHggKyB3aWR0aDsKLSAgICAgICAgY29sX2VuZCA9IGNvbF9lbmQgPCBtX2RzdFdpZHRoID8gY29sX2VuZCAtIG1fTGVmdDogbV9wRGV2aWNlLT5HZXRXaWR0aCgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gY29sX2VuZCAtIGNvbF9zdGFydDsKLSAgICAgICAgaWYgKHJlc3VsdCA+IDApIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gZGVzdF9zY2FuICsgY29sX3N0YXJ0OwotICAgICAgICAgICAgaWYgKHJlc3VsdCA+PSA0KQotICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3BvcywgMHhmZmZmZmZmZixyZXN1bHQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3BvcywyNTUscmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIENGWF9Ta2lhQThSZW5kZXJlcjo6YmxpdFYoaW50IHgsIGludCB5LCBpbnQgaGVpZ2h0LCBTa0FscGhhIGFscGhhKQotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KGFscGhhKTsKLSAgICAgICAgaWYgKGFscGhhID09IDI1NSkgewotICAgICAgICAgICAgYmxpdFJlY3QoeCwgeSwgMSwgaGVpZ2h0KTsKKyAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAqKEZYX0NNWUsqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQxNl90IHJ1bnNbMl07Ci0gICAgICAgICAgICBydW5zWzBdID0gMTsKLSAgICAgICAgICAgIHJ1bnNbMV0gPSAwOwotICAgICAgICAgICAgd2hpbGUgKC0taGVpZ2h0ID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoeSA+PSBtX2RzdEhlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGJsaXRBbnRpSCh4LCB5ICsrLCAmYWxwaGEsIHJ1bnMpOwotICAgICAgICAgICAgfQorICAgICAgICAgIC8vIERlc3QgZm9ybWF0OiBjbXlrCisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgc3JjX2FscGhhKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IDQ7CiAgICAgfQotICAgIHZvaWQgQ0ZYX1NraWFBOFJlbmRlcmVyOjpibGl0UmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChtX3BEZXZpY2UpOwotICAgICAgICB3aGlsZSAoLS1oZWlnaHQgPj0gMCkgewotICAgICAgICAgICAgaWYgKHkgPj0gbV9kc3RIZWlnaHQpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgYmxpdEgoeCAsIHkgKyssIHdpZHRoKTsKLSAgICAgICAgfQotICAgIH0KKyAgfQorfQogCi0gICAgdm9pZCBDRlhfU2tpYUE4UmVuZGVyZXI6OmJsaXRBbnRpUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tBbHBoYSBsZWZ0QWxwaGEsIFNrQWxwaGEgcmlnaHRBbHBoYSkKLSAgICB7Ci0gICAgICAgIGJsaXRWKHgrKywgeSwgaGVpZ2h0LCBsZWZ0QWxwaGEpOwotICAgICAgICBpZiAod2lkdGggPiAwKSB7Ci0gICAgICAgICAgICBibGl0UmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIHggKz0gd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgYmxpdFYoeCwgeSwgaGVpZ2h0LCByaWdodEFscGhhKTsKLSAgICB9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGWF9CT09MIENGWF9Ta2lhUmVuZGVyZXI6OkluaXQoCisgICAgQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLAorICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKKyAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgRlhfRFdPUkQgY29sb3IsCisgICAgRlhfQk9PTCBiRnVsbENvdmVyLAorICAgIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKKyAgICBpbnQgYWxwaGFfZmxhZywKKyAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSAgLy8gVGhlIGFscGhhIGZsYWcgbXVzdCBiZSBmaWxsX2ZsYWcgaWYgZXhpc3QuCit7CisgIG1fcERldmljZSA9IHBEZXZpY2U7CisgIG1fcENsaXBSZ24gPSBwQ2xpcFJnbjsKKyAgbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKKyAgbV9wT3JpRGV2aWNlID0gcE9yaURldmljZTsKKyAgbV9wRGVzdFNjYW4gPSBOVUxMOworICBtX3BEZXN0RXh0cmFBbHBoYVNjYW4gPSBOVUxMOworICBtX3BPcmlTY2FuID0gTlVMTDsKKyAgbV9wQ2xpcFNjYW4gPSBOVUxMOworICBjb21wb3NpdGVfc3BhbiA9IE5VTEw7CisgIGlmIChtX3BDbGlwUmduKQorICAgIG1fQ2xpcEJveCA9IG1fcENsaXBSZ24tPkdldEJveCgpOworICBlbHNlIHsKKyAgICBtX0NsaXBCb3gubGVmdCA9IG1fQ2xpcEJveC50b3AgPSAwOworICAgIG1fQ2xpcEJveC5yaWdodCA9IG1fcERldmljZS0+R2V0V2lkdGgoKTsKKyAgICBtX0NsaXBCb3guYm90dG9tID0gbV9wRGV2aWNlLT5HZXRIZWlnaHQoKTsKKyAgfQorICBtX3BDbGlwTWFzayA9IE5VTEw7CisgIGlmIChtX3BDbGlwUmduICYmIG1fcENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6TWFza0YpIHsKKyAgICBtX3BDbGlwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKKyAgICBtX3BDbGlwU2NhbiA9IG1fcENsaXBNYXNrLT5HZXRCdWZmZXIoKTsKKyAgfQorICBpZiAobV9wRGV2aWNlLT5tX3BBbHBoYU1hc2spCisgICAgbV9wRGVzdEV4dHJhQWxwaGFTY2FuID0gbV9wRGV2aWNlLT5tX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpOworICBpZiAobV9wT3JpRGV2aWNlKQorICAgIG1fcE9yaVNjYW4gPSBtX3BPcmlEZXZpY2UtPkdldEJ1ZmZlcigpOworICBtX3BEZXN0U2NhbiA9IG1fcERldmljZS0+R2V0QnVmZmVyKCk7CiAKLSAgICBGWF9CT09MIENGWF9Ta2lhQThSZW5kZXJlcjo6SW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGludCBMZWZ0LCBpbnQgVG9wKQotICAgIHsKLSAgICAgICAgbV9wRGV2aWNlID0gcERldmljZTsKLSAgICAgICAgbV9MZWZ0ID0gTGVmdDsKLSAgICAgICAgbV9Ub3AgPSBUb3A7Ci0gICAgICAgIGlmIChwRGV2aWNlKXsKLSAgICAgICAgICAgIG1fZHN0V2lkdGggPSBtX0xlZnQgKyBwRGV2aWNlLT5HZXRXaWR0aCgpOwotICAgICAgICAgICAgbV9kc3RIZWlnaHQgPSBtX1RvcCArIHBEZXZpY2UtPkdldEhlaWdodCgpOworICBtX2JGdWxsQ292ZXIgPSBiRnVsbENvdmVyOworCisgIEZYX0JPT0wgYk9iamVjdENNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOworICBGWF9CT09MIGJEZXZpY2VDTVlLID0gcERldmljZS0+SXNDbXlrSW1hZ2UoKTsKKworICBtX0FscGhhID0gYk9iamVjdENNWUsgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKKworICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gTlVMTDsKKyAgLy8gTm8gbGNtcyBlbmdpbmUsIHdlIHNraXAgdGhlIHRyYW5zZm9ybQorICBpZiAoIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkgfHwKKyAgICAgICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkKKyAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKKyAgZWxzZQorICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKworICBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSA4KSB7ICAvLyBHcmF5KGEpIGRldmljZQorICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKKyAgICBpZiAobV9wRGV2aWNlLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICAvLyBBbHBoYSBNYXNrCisgICAgICBtX0dyYXkgPSAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEdyYXkoYSkgZGV2aWNlCisgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICB1aW50OF90IGdyYXk7CisgICAgICAgIGNvbG9yID0gYk9iamVjdENNWUsgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOworICAgICAgICBtX0dyYXkgPSBncmF5OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7CisgICAgICAgICAgdWludDhfdCByLCBnLCBiOworICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY29sb3IpLCBGWFNZU19HZXRNVmFsdWUoY29sb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLCByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLCBiKTsKKyAgICAgICAgICBtX0dyYXkgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fR3JheSA9CisgICAgICAgICAgICAgIEZYUkdCMkdSQVkoRlhBUkdCX1IoY29sb3IpLCBGWEFSR0JfRyhjb2xvciksIEZYQVJHQl9CKGNvbG9yKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CiAgICAgfQorICB9IGVsc2UgeworICAgIGlmIChiRGV2aWNlQ01ZSykgeyAgLy8gQ215ayhhKSBEZXZpY2UKKyAgICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKKyAgICAgIC8vIFRPRE8uLi4gb3B0IGZvciBjbXlrCisgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuQ01ZSzsKKyAgICAgIGlmIChiT2JqZWN0Q01ZSykgeworICAgICAgICBtX0NvbG9yID0gRlhDTVlLX1RPRElCKGNvbG9yKTsKKyAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pCisgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmbV9Db2xvciwgMSk7CisgICAgICB9IGVsc2UgeyAgLy8gT2JqZWN0IFJHQgorICAgICAgICBpZiAoIXBJY2NUcmFuc2Zvcm0pCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBjb2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7CisgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICh1aW50OF90KikmbV9Db2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwgMSk7CisgICAgICB9CisgICAgICBtX1JlZCA9ICgodWludDhfdCopJm1fQ29sb3IpWzBdOworICAgICAgbV9HcmVlbiA9ICgodWludDhfdCopJm1fQ29sb3IpWzFdOworICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMl07CisgICAgICBtX0dyYXkgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwgMSk7CisgICAgICAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXSA9IG1fQWxwaGE7CisgICAgICBtX1JlZCA9ICgodWludDhfdCopJm1fQ29sb3IpWzJdOworICAgICAgbV9HcmVlbiA9ICgodWludDhfdCopJm1fQ29sb3IpWzFdOworICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07CisgICAgICAvLyBOZWVkIEpvaG5zb24gdG8gaW1wcm92ZW1lbnQgaXQuCisgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgICAgIC8vIHN3YXAKKyAgICAgICAgbV9SZWQgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVswXTsKKyAgICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMl07CisgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9ESUIobV9Db2xvcik7CisgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihtX0NvbG9yKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGJPYmplY3RDTVlLKSB7CisgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLCByLCBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYik7CisgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfTUFLRShtX0FscGhhLCByLCBnLCBiKTsKKyAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihtX0NvbG9yKTsKKyAgICAgICAgICBtX1JlZCA9IGI7CisgICAgICAgICAgbV9HcmVlbiA9IGc7CisgICAgICAgICAgbV9CbHVlID0gcjsgIC8vCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0RJQihtX0NvbG9yKTsKKyAgICAgICAgICBtX1JlZCA9IHI7CisgICAgICAgICAgbV9HcmVlbiA9IGc7CisgICAgICAgICAgbV9CbHVlID0gYjsgIC8vCisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPQkdST1JERVJESUIoY29sb3IpOworICAgICAgICAgIEFyZ2JEZWNvZGUoY29sb3IsIG1fQWxwaGEsIG1fQmx1ZSwgbV9HcmVlbiwgbV9SZWQpOyAgLy8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICAgICAgICBBcmdiRGVjb2RlKGNvbG9yLCBtX0FscGhhLCBtX1JlZCwgbV9HcmVlbiwgbV9CbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvLyBHZXQgcGFsZXR0ZSB0cmFuc3BhcmVuY3kgc2VsZWN0b3IKKyAgbV9Qcm9jZXNzRmlsdGVyID0KKyAgICAgIChtX3BPcmlEZXZpY2UgPyAxIDogMCkgICAgICAgICAgICAgICAvKiBoYXMgT3JpIERldmljZSBmbGFnICovCisgICAgICArIChtX3BEZXZpY2UtPkdldEJQUCgpID49IDggPyAyIDogMCkgLyogYnBwIGZsYWcgKi8KKyAgICAgICsgKG1fcENsaXBNYXNrID8gNCA6IDApICAgICAgICAgICAgICAvKiBoYXMgY2xpcCByZWdpb24gZmxhZyAqLworICAgICAgKyAobV9wRGV2aWNlLT5tX3BBbHBoYU1hc2sgPyA4IDogMCk7IC8qIGhhcyBBbHBoYSBNYXNrIGNoYW5lbCBmbGFnICovCisgIHN3aXRjaCAobV9Qcm9jZXNzRmlsdGVyKSB7CisgICAgY2FzZSAwOgorICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbjFicHBfMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjogeworICAgICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gOCkKKyAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkdyYXlfMjsKKyAgICAgIGVsc2UgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gMjQpCisgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8yOworICAgICAgZWxzZQorICAgICAgICBjb21wb3NpdGVfc3BhbiA9IG1fcERldmljZS0+SGFzQWxwaGEoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQl8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IzMl8yOworICAgIH0gYnJlYWs7CisgICAgY2FzZSAzOiB7CisgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSA4KQorICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV8zOworICAgICAgZWxzZSBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSAyNCkKKyAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzM7CisgICAgICBlbHNlCisgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5BUkdCXzMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjMyXzM7CisgICAgfSBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcF80OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiB7CisgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSA4KQorICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV82OworICAgICAgZWxzZSBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSAyNCkKKyAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzY7CisgICAgICBlbHNlCisgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5BUkdCXzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjMyXzY7CisgICAgfSBicmVhazsKKyAgICBjYXNlIDc6IHsKKyAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDgpCisgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5HcmF5Xzc7CisgICAgICBlbHNlIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDI0KQorICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMjRfNzsKKyAgICAgIGVsc2UKKyAgICAgICAgY29tcG9zaXRlX3NwYW4gPSBtX3BEZXZpY2UtPkhhc0FscGhhKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfNzsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgMToKKyAgICBjYXNlIDU6CisgICAgY2FzZSA4OgorICAgIGNhc2UgOToKKyAgICBjYXNlIDExOgorICAgIGNhc2UgMTI6CisgICAgY2FzZSAxMzoKKyAgICBjYXNlIDE1OgorICAgICAgLy8gVE9ETy4uLgorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8xMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTQ6CisgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMjRfMTQ7CisgICAgICBicmVhazsKKyAgfQorICBpZiAoY29tcG9zaXRlX3NwYW4gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIHJldHVybiBUUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBDRlhfU2tpYUE4UmVuZGVyZXI6OmJsaXRBbnRpSChpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrQWxwaGEgYW50aWFsaWFzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgcnVuc1tdKSB7CisgIEZYU1lTX2Fzc2VydChtX3BEZXZpY2UpOworICBpbnQgZHN0X3kgPSB5IC0gbV9Ub3A7CisgIGlmIChkc3RfeSA8IDAgfHwgZHN0X3kgPj0gbV9wRGV2aWNlLT5HZXRIZWlnaHQoKSkKKyAgICByZXR1cm47CisKKyAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wRGV2aWNlLT5HZXRCdWZmZXIoKSArIG1fcERldmljZS0+R2V0UGl0Y2goKSAqIGRzdF95OworICB1aW50OF90KiBkZXN0X3BvcyA9IGRlc3Rfc2NhbjsKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoeCA+PSBtX2RzdFdpZHRoKQorICAgICAgcmV0dXJuOworICAgIGludCB3aWR0aCA9IHJ1bnNbMF07CisgICAgU2tBU1NFUlQod2lkdGggPj0gMCk7CisgICAgaWYgKHdpZHRoIDw9IDApCisgICAgICByZXR1cm47CisgICAgdW5zaWduZWQgYWEgPSBhbnRpYWxpYXNbMF07CisgICAgaWYgKGFhKSB7CisgICAgICBpbnQgY29sX3N0YXJ0ID0geCA8IG1fTGVmdCA/IDAgOiB4IC0gbV9MZWZ0OworICAgICAgaW50IGNvbF9lbmQgPSB4ICsgd2lkdGg7CisgICAgICBjb2xfZW5kID0gY29sX2VuZCA8IG1fZHN0V2lkdGggPyBjb2xfZW5kIC0gbV9MZWZ0IDogbV9wRGV2aWNlLT5HZXRXaWR0aCgpOworICAgICAgaW50IHJlc3VsdCA9IGNvbF9lbmQgLSBjb2xfc3RhcnQ7CisgICAgICBpZiAocmVzdWx0ID4gMCkgeworICAgICAgICBkZXN0X3BvcyA9IGRlc3Rfc2NhbiArIGNvbF9zdGFydDsKKyAgICAgICAgaWYgKHJlc3VsdCA+PSA0KQorICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3BvcywgRlhBUkdCX01BS0UoYWEsIGFhLCBhYSwgYWEpLCByZXN1bHQpOworICAgICAgICBlbHNlCisgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfcG9zLCBhYSwgcmVzdWx0KTsKKyAgICAgIH0KKyAgICB9CisgICAgcnVucyArPSB3aWR0aDsKKyAgICBhbnRpYWxpYXMgKz0gd2lkdGg7CisgICAgeCArPSB3aWR0aDsKKyAgfQorfQordm9pZCBDRlhfU2tpYUE4UmVuZGVyZXI6OmJsaXRIKGludCB4LCBpbnQgeSwgaW50IHdpZHRoKSB7CisgIEZYU1lTX2Fzc2VydChtX3BEZXZpY2UpOworICBpbnQgZHN0X3kgPSB5IC0gbV9Ub3A7CisgIGlmIChkc3RfeSA8IDAgfHwgZHN0X3kgPj0gbV9wRGV2aWNlLT5HZXRIZWlnaHQoKSkKKyAgICByZXR1cm47CisgIGlmICh4ID49IG1fZHN0V2lkdGgpCisgICAgcmV0dXJuOworICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BEZXZpY2UtPkdldEJ1ZmZlcigpICsgbV9wRGV2aWNlLT5HZXRQaXRjaCgpICogZHN0X3k7CisgIGludCBjb2xfc3RhcnQgPSB4IDwgbV9MZWZ0ID8gMCA6IHggLSBtX0xlZnQ7CisgIGludCBjb2xfZW5kID0geCArIHdpZHRoOworICBjb2xfZW5kID0gY29sX2VuZCA8IG1fZHN0V2lkdGggPyBjb2xfZW5kIC0gbV9MZWZ0IDogbV9wRGV2aWNlLT5HZXRXaWR0aCgpOworICBpbnQgcmVzdWx0ID0gY29sX2VuZCAtIGNvbF9zdGFydDsKKyAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICB1aW50OF90KiBkZXN0X3BvcyA9IGRlc3Rfc2NhbiArIGNvbF9zdGFydDsKKyAgICBpZiAocmVzdWx0ID49IDQpCisgICAgICBGWFNZU19tZW1zZXQoZGVzdF9wb3MsIDB4ZmZmZmZmZmYsIHJlc3VsdCk7CisgICAgZWxzZQorICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfcG9zLCAyNTUsIHJlc3VsdCk7CisgIH0KK30KK3ZvaWQgQ0ZYX1NraWFBOFJlbmRlcmVyOjpibGl0VihpbnQgeCwgaW50IHksIGludCBoZWlnaHQsIFNrQWxwaGEgYWxwaGEpIHsKKyAgRlhTWVNfYXNzZXJ0KGFscGhhKTsKKyAgaWYgKGFscGhhID09IDI1NSkgeworICAgIGJsaXRSZWN0KHgsIHksIDEsIGhlaWdodCk7CisgIH0gZWxzZSB7CisgICAgaW50MTZfdCBydW5zWzJdOworICAgIHJ1bnNbMF0gPSAxOworICAgIHJ1bnNbMV0gPSAwOworICAgIHdoaWxlICgtLWhlaWdodCA+PSAwKSB7CisgICAgICBpZiAoeSA+PSBtX2RzdEhlaWdodCkKKyAgICAgICAgcmV0dXJuOworICAgICAgYmxpdEFudGlIKHgsIHkrKywgJmFscGhhLCBydW5zKTsKKyAgICB9CisgIH0KK30KK3ZvaWQgQ0ZYX1NraWFBOFJlbmRlcmVyOjpibGl0UmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBGWFNZU19hc3NlcnQobV9wRGV2aWNlKTsKKyAgd2hpbGUgKC0taGVpZ2h0ID49IDApIHsKKyAgICBpZiAoeSA+PSBtX2RzdEhlaWdodCkKKyAgICAgIHJldHVybjsKKyAgICBibGl0SCh4LCB5KyssIHdpZHRoKTsKKyAgfQorfQorCit2b2lkIENGWF9Ta2lhQThSZW5kZXJlcjo6YmxpdEFudGlSZWN0KGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0FscGhhIGxlZnRBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tBbHBoYSByaWdodEFscGhhKSB7CisgIGJsaXRWKHgrKywgeSwgaGVpZ2h0LCBsZWZ0QWxwaGEpOworICBpZiAod2lkdGggPiAwKSB7CisgICAgYmxpdFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgeCArPSB3aWR0aDsKKyAgfQorICBibGl0Vih4LCB5LCBoZWlnaHQsIHJpZ2h0QWxwaGEpOworfQorCitGWF9CT09MIENGWF9Ta2lhQThSZW5kZXJlcjo6SW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGludCBMZWZ0LCBpbnQgVG9wKSB7CisgIG1fcERldmljZSA9IHBEZXZpY2U7CisgIG1fTGVmdCA9IExlZnQ7CisgIG1fVG9wID0gVG9wOworICBpZiAocERldmljZSkgeworICAgIG1fZHN0V2lkdGggPSBtX0xlZnQgKyBwRGV2aWNlLT5HZXRXaWR0aCgpOworICAgIG1fZHN0SGVpZ2h0ID0gbV9Ub3AgKyBwRGV2aWNlLT5HZXRIZWlnaHQoKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuaCBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmgKaW5kZXggZTYwYzYzOS4uMzZhNmI0MyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuaAorKysgYi9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5oCkBAIC02LDIyNCArNiw1MTYgQEAKICNkZWZpbmUgQ09SRV9TUkNfRlhHRV9TS0lBX0ZYX1NLSUFfQkxJVFRFUl9ORVdfSF8KIAogI2lmIGRlZmluZWQoX1NLSUFfU1VQUE9SVF8pCi1jbGFzcyBDRlhfU2tpYVJlbmRlcmVyIDogcHVibGljIFNrQmxpdHRlcgotewotcHJvdGVjdGVkOgotCWludAkJCW1fQWxwaGEsCi0JCQkJbV9SZWQsCQkvLyBPciB0aGUgY29tcGxlbWVudGFyeS1jb2xvciwgQ3lhbgotCQkJCW1fR3JlZW4sCS8vIE1hZ2VudGEKLQkJCQltX0JsdWUsCQkvLyBZZWxsb3cKLQkJCQltX0dyYXk7CQkvLyBCbGFjawotCUZYX0RXT1JECW1fQ29sb3I7CS8vIEZYX0FSR0Igb3IgRlhfQ01ZSwotCUZYX0JPT0wJCW1fYkZ1bGxDb3ZlcjsKLQlpbnQJCQltX1Byb2Nlc3NGaWx0ZXI7Ci0JRlhfQk9PTCAgICAgbV9iUmdiQnl0ZU9yZGVyOworY2xhc3MgQ0ZYX1NraWFSZW5kZXJlciA6IHB1YmxpYyBTa0JsaXR0ZXIgeworIHByb3RlY3RlZDoKKyAgaW50IG1fQWxwaGEsCisgICAgICBtX1JlZCwgICAgICAgICAvLyBPciB0aGUgY29tcGxlbWVudGFyeS1jb2xvciwgQ3lhbgorICAgICAgbV9HcmVlbiwgICAgICAgLy8gTWFnZW50YQorICAgICAgbV9CbHVlLCAgICAgICAgLy8gWWVsbG93CisgICAgICBtX0dyYXk7ICAgICAgICAvLyBCbGFjaworICBGWF9EV09SRCBtX0NvbG9yOyAgLy8gRlhfQVJHQiBvciBGWF9DTVlLCisgIEZYX0JPT0wgbV9iRnVsbENvdmVyOworICBpbnQgbV9Qcm9jZXNzRmlsdGVyOworICBGWF9CT09MIG1fYlJnYkJ5dGVPcmRlcjsKIAotCUZYX1JFQ1QJCQkJbV9DbGlwQm94OwotCUNGWF9ESUJpdG1hcCoJCW1fcERldmljZTsKLQlDRlhfRElCaXRtYXAqCQltX3BPcmlEZXZpY2U7Ci0JY29uc3QgQ0ZYX0NsaXBSZ24qCW1fcENsaXBSZ247Ci0JY29uc3QgQ0ZYX0RJQml0bWFwKgltX3BDbGlwTWFzazsKKyAgRlhfUkVDVCBtX0NsaXBCb3g7CisgIENGWF9ESUJpdG1hcCogbV9wRGV2aWNlOworICBDRlhfRElCaXRtYXAqIG1fcE9yaURldmljZTsKKyAgY29uc3QgQ0ZYX0NsaXBSZ24qIG1fcENsaXBSZ247CisgIGNvbnN0IENGWF9ESUJpdG1hcCogbV9wQ2xpcE1hc2s7CiAKLQl1aW50OF90KiBtX3BEZXN0U2NhbjsKLQl1aW50OF90KiBtX3BEZXN0RXh0cmFBbHBoYVNjYW47Ci0JdWludDhfdCogbV9wT3JpU2NhbjsKLQl1aW50OF90KiBtX3BDbGlwU2NhbjsKKyAgdWludDhfdCogbV9wRGVzdFNjYW47CisgIHVpbnQ4X3QqIG1fcERlc3RFeHRyYUFscGhhU2NhbjsKKyAgdWludDhfdCogbV9wT3JpU2NhbjsKKyAgdWludDhfdCogbV9wQ2xpcFNjYW47CiAKLQl2b2lkIChDRlhfU2tpYVJlbmRlcmVyOjoqY29tcG9zaXRlX3NwYW4pKHVpbnQ4X3QqLHVpbnQ4X3QqLGludCxpbnQsaW50LGludCx1aW50OF90LGludCxpbnQsaW50LHVpbnQ4X3QqLHVpbnQ4X3QqKTsKLXB1YmxpYzoKKyAgdm9pZCAoQ0ZYX1NraWFSZW5kZXJlcjo6KmNvbXBvc2l0ZV9zcGFuKSh1aW50OF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kik7CiAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgdmlydHVhbCB2b2lkIGJsaXRBbnRpSChpbnQgeCwgaW50IHksIGNvbnN0IFNrQWxwaGEgYW50aWFsaWFzW10sIGNvbnN0IGludDE2X3QgcnVuc1tdKTsKLQl2aXJ0dWFsIHZvaWQgYmxpdEgoaW50IHgsIGludCB5LCBpbnQgd2lkdGgpOwotCXZpcnR1YWwgdm9pZCBibGl0VihpbnQgeCwgaW50IHksIGludCBoZWlnaHQsIFNrQWxwaGEgYWxwaGEpOwotCXZpcnR1YWwgdm9pZCBibGl0UmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0JdmlydHVhbAl2b2lkIGJsaXRBbnRpUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgU2tBbHBoYSBsZWZ0QWxwaGEsIFNrQWxwaGEgcmlnaHRBbHBoYSk7CisgcHVibGljOgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZpcnR1YWwgdm9pZCBibGl0QW50aUgoaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tBbHBoYSBhbnRpYWxpYXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IHJ1bnNbXSk7CisgIHZpcnR1YWwgdm9pZCBibGl0SChpbnQgeCwgaW50IHksIGludCB3aWR0aCk7CisgIHZpcnR1YWwgdm9pZCBibGl0VihpbnQgeCwgaW50IHksIGludCBoZWlnaHQsIFNrQWxwaGEgYWxwaGEpOworICB2aXJ0dWFsIHZvaWQgYmxpdFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICB2aXJ0dWFsIHZvaWQgYmxpdEFudGlSZWN0KGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQWxwaGEgbGVmdEFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQWxwaGEgcmlnaHRBbHBoYSk7CiAKLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JLy8gQSBnZW5lcmFsIGFscGhhIG1lcmdlIGZ1bmN0aW9uICh3aXRoIGNsaXBwaW5nIG1hc2spLiBHcmF5IGRldmljZS4KLQl2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzAodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLQkJCXVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7Ci0Jdm9pZCBDb21wb3NpdGVTcGFuMWJwcF8xKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhbjFicHBfNCh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotCQkJdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKLQl2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzUodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLQkJCXVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7Ci0Jdm9pZCBDb21wb3NpdGVTcGFuMWJwcF84KHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhbjFicHBfOSh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotCQkJdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKLQl2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzEyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhbjFicHBfMTModWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLQkJCXVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLy8gQSBnZW5lcmFsIGFscGhhIG1lcmdlIGZ1bmN0aW9uICh3aXRoIGNsaXBwaW5nIG1hc2spLiBHcmF5IGRldmljZS4KKyAgdm9pZCBDb21wb3NpdGVTcGFuMWJwcF8wKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzEodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhbjFicHBfNCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuMWJwcF81KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzgodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhbjFicHBfOSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuMWJwcF8xMih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzEzKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CiAKLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLQkvLyBBIGdlbmVyYWwgYWxwaGEgbWVyZ2UgZnVuY3Rpb24gKHdpdGggY2xpcHBpbmcgbWFzaykuIEdyYXkgZGV2aWNlLgotCXZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfMih1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotCQkJdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgLy8gQSBnZW5lcmFsIGFscGhhIG1lcmdlIGZ1bmN0aW9uICh3aXRoIGNsaXBwaW5nIG1hc2spLiBHcmF5IGRldmljZS4KKyAgdm9pZCBDb21wb3NpdGVTcGFuR3JheV8yKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwogCi0Jdm9pZCBDb21wb3NpdGVTcGFuR3JheV8zKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW5HcmF5XzModWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CiAKLQl2b2lkIENvbXBvc2l0ZVNwYW5HcmF5XzYodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLQkJCXVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfNih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKIAotCXZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfNyh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotCQkJdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuR3JheV83KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwogCi0Jdm9pZCBDb21wb3NpdGVTcGFuR3JheV8xMCh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotCQkJdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuR3JheV8xMCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwogCisgIHZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfMTEodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKIAotCXZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfMTEodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLQkJCXVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfMTQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKIAotCXZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfMTQodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLQkJCXVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfMTUodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKIAotCXZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfMTUodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLQkJCXVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b2lkIENvbXBvc2l0ZVNwYW5BUkdCXzIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CiAKLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQl2b2lkIENvbXBvc2l0ZVNwYW5BUkdCXzIodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLQkJCXVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhbkFSR0JfMyh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKIAotCXZvaWQgQ29tcG9zaXRlU3BhbkFSR0JfMyh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotCQkJdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuQVJHQl82KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwogCisgIHZvaWQgQ29tcG9zaXRlU3BhbkFSR0JfNyh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgLy8gLi4uCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IzMl8yKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhblJHQjMyXzModWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuUkdCMzJfNih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IzMl83KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CiAKLQl2b2lkIENvbXBvc2l0ZVNwYW5BUkdCXzYodWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLQkJCXVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IyNF8yKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzModWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuUkdCMjRfNih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IyNF83KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzEwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuUkdCMjRfMTEodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IyNF8xNCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzE1KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKIAotCXZvaWQgQ29tcG9zaXRlU3BhbkFSR0JfNyh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotCQkJdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKLQkvLyAuLi4KLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQl2b2lkIENvbXBvc2l0ZVNwYW5SR0IzMl8yKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjMyXzModWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLQkJCXVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7Ci0Jdm9pZCBDb21wb3NpdGVTcGFuUkdCMzJfNih1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotCQkJdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKLQl2b2lkIENvbXBvc2l0ZVNwYW5SR0IzMl83KHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvLyBBIGdlbmVyYWwgYWxwaGEgbWVyZ2UgZnVuY3Rpb24gKHdpdGggY2xpcHBpbmcgbWFzaykuIENteWthL0NteWsgZGV2aWNlLgorICB2b2lkIENvbXBvc2l0ZVNwYW5DTVlLKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CiAKLQl2b2lkIENvbXBvc2l0ZVNwYW5SR0IyNF8yKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzModWludDhfdCogZGVzdF9zY2FuLCB1aW50OF90KiBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIHVpbnQ4X3QgY292ZXJfc2NhbiwKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIHVpbnQ4X3QqIGNsaXBfc2NhbiwKLQkJCXVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7Ci0Jdm9pZCBDb21wb3NpdGVTcGFuUkdCMjRfNih1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotCQkJdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKLQl2b2lkIENvbXBvc2l0ZVNwYW5SR0IyNF83KHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzEwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzExKHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzE0KHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzE1KHVpbnQ4X3QqIGRlc3Rfc2NhbiwgdWludDhfdCogb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCB1aW50OF90IGNvdmVyX3NjYW4sCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCB1aW50OF90KiBjbGlwX3NjYW4sCi0JCQl1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCS8vIEEgZ2VuZXJhbCBhbHBoYSBtZXJnZSBmdW5jdGlvbiAod2l0aCBjbGlwcGluZyBtYXNrKS4gQ215a2EvQ215ayBkZXZpY2UuCi0Jdm9pZCBDb21wb3NpdGVTcGFuQ01ZSyh1aW50OF90KiBkZXN0X3NjYW4sIHVpbnQ4X3QqIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgdWludDhfdCBjb3Zlcl9zY2FuLAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgdWludDhfdCogY2xpcF9zY2FuLAotCQkJdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKLQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUZYX0JPT0wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCi0JCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOyAvL1RoZSBhbHBoYSBmbGFnIG11c3QgYmUgZmlsbF9mbGFnIGlmIGV4aXN0LgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEZYX0JPT0wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsCisgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsCisgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYkZ1bGxDb3ZlciwKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKKyAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPQorICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgLy8gVGhlIGFscGhhIGZsYWcgbXVzdCBiZSBmaWxsX2ZsYWcgaWYgZXhpc3QuCiB9OwotY2xhc3MgQ0ZYX1NraWFBOFJlbmRlcmVyIDogcHVibGljIFNrQmxpdHRlcgotewotcHVibGljOgotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB2aXJ0dWFsIHZvaWQgYmxpdEFudGlIKGludCB4LCBpbnQgeSwgY29uc3QgU2tBbHBoYSBhbnRpYWxpYXNbXSwgY29uc3QgaW50MTZfdCBydW5zW10pOwotCXZpcnR1YWwgdm9pZCBibGl0SChpbnQgeCwgaW50IHksIGludCB3aWR0aCk7Ci0JdmlydHVhbCB2b2lkIGJsaXRWKGludCB4LCBpbnQgeSwgaW50IGhlaWdodCwgU2tBbHBoYSBhbHBoYSk7Ci0JdmlydHVhbCB2b2lkIGJsaXRSZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQl2aXJ0dWFsCXZvaWQgYmxpdEFudGlSZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBTa0FscGhhIGxlZnRBbHBoYSwgU2tBbHBoYSByaWdodEFscGhhKTsKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JRlhfQk9PTCBJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgaW50IExlZnQsIGludCBUb3ApOwotCUNGWF9ESUJpdG1hcCogbV9wRGV2aWNlOwotCWludCBtX0xlZnQ7Ci0JaW50IG1fVG9wOwotCWludCBtX2RzdFdpZHRoOwotCWludCBtX2RzdEhlaWdodDsKK2NsYXNzIENGWF9Ta2lhQThSZW5kZXJlciA6IHB1YmxpYyBTa0JsaXR0ZXIgeworIHB1YmxpYzoKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2aXJ0dWFsIHZvaWQgYmxpdEFudGlIKGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrQWxwaGEgYW50aWFsaWFzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBydW5zW10pOworICB2aXJ0dWFsIHZvaWQgYmxpdEgoaW50IHgsIGludCB5LCBpbnQgd2lkdGgpOworICB2aXJ0dWFsIHZvaWQgYmxpdFYoaW50IHgsIGludCB5LCBpbnQgaGVpZ2h0LCBTa0FscGhhIGFscGhhKTsKKyAgdmlydHVhbCB2b2lkIGJsaXRSZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgdmlydHVhbCB2b2lkIGJsaXRBbnRpUmVjdChpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0FscGhhIGxlZnRBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0FscGhhIHJpZ2h0QWxwaGEpOworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEZYX0JPT0wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGludCBMZWZ0LCBpbnQgVG9wKTsKKyAgQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2U7CisgIGludCBtX0xlZnQ7CisgIGludCBtX1RvcDsKKyAgaW50IG1fZHN0V2lkdGg7CisgIGludCBtX2RzdEhlaWdodDsKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmNwcCBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5jcHAKaW5kZXggYWU2Yjc5Yi4uOGY5ODI5MyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuY3BwCkBAIC03LDI3ICs3LDI4IEBACiAjaWYgZGVmaW5lZChfU0tJQV9TVVBQT1JUXykKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKIAotCiAvLyNkZWZpbmUgX0ZPWElUX0RFQlVHXwogLy8jZGVmaW5lIF9GT1hJVF9CRU5DSE1BUktfCiAKIGV4dGVybiAiQyIgewotCWV4dGVybiB2b2lkIEZYX09VVFBVVF9MT0dfRlVOQyhjb25zdCBjaGFyKiwgLi4uKTsKLQlleHRlcm4gaW50IEZYX0dFVF9USUNLX0ZVTkMoKTsKK2V4dGVybiB2b2lkIEZYX09VVFBVVF9MT0dfRlVOQyhjb25zdCBjaGFyKiwgLi4uKTsKK2V4dGVybiBpbnQgRlhfR0VUX1RJQ0tfRlVOQygpOwogfTsKIAogI2lmZGVmIF9GT1hJVF9ERUJVR18KICNkZWZpbmUgRk9YSVRfREVCVUcxKG1zZykgRlhfT1VUUFVUX0xPR19GVU5DKG1zZykKLSNkZWZpbmUgRk9YSVRfREVCVUcyKG1zZyxwYXJhKSBGWF9PVVRQVVRfTE9HX0ZVTkMobXNnLHBhcmEpCi0jZGVmaW5lIEZPWElUX0RFQlVHMyhtc2cscGFyYTEscGFyYTIpIEZYX09VVFBVVF9MT0dfRlVOQyhtc2cscGFyYTEscGFyYTIpCi0jZGVmaW5lIEZPWElUX0RFQlVHNChtc2cscGFyYTEscGFyYTIscGFyYTMpIEZYX09VVFBVVF9MT0dfRlVOQyhtc2cscGFyYTEscGFyYTIscGFyYTMpCi0jZGVmaW5lIEZPWElUX0RFQlVHNShtc2cscGFyYTEscGFyYTIscGFyYTMscGFyYW00KSBGWF9PVVRQVVRfTE9HX0ZVTkMobXNnLHBhcmExLHBhcmEyLHBhcmEzLHBhcmFtNCkKKyNkZWZpbmUgRk9YSVRfREVCVUcyKG1zZywgcGFyYSkgRlhfT1VUUFVUX0xPR19GVU5DKG1zZywgcGFyYSkKKyNkZWZpbmUgRk9YSVRfREVCVUczKG1zZywgcGFyYTEsIHBhcmEyKSBGWF9PVVRQVVRfTE9HX0ZVTkMobXNnLCBwYXJhMSwgcGFyYTIpCisjZGVmaW5lIEZPWElUX0RFQlVHNChtc2csIHBhcmExLCBwYXJhMiwgcGFyYTMpIFwKKyAgRlhfT1VUUFVUX0xPR19GVU5DKG1zZywgcGFyYTEsIHBhcmEyLCBwYXJhMykKKyNkZWZpbmUgRk9YSVRfREVCVUc1KG1zZywgcGFyYTEsIHBhcmEyLCBwYXJhMywgcGFyYW00KSBcCisgIEZYX09VVFBVVF9MT0dfRlVOQyhtc2csIHBhcmExLCBwYXJhMiwgcGFyYTMsIHBhcmFtNCkKICNlbHNlCiAjZGVmaW5lIEZPWElUX0RFQlVHMShtc2cpCi0jZGVmaW5lIEZPWElUX0RFQlVHMihtc2cscGFyYSkKLSNkZWZpbmUgRk9YSVRfREVCVUczKG1zZyxwYXJhMSxwYXJhMikKLSNkZWZpbmUgRk9YSVRfREVCVUc0KG1zZyxwYXJhMSxwYXJhMixwYXJhMykKLSNkZWZpbmUgRk9YSVRfREVCVUc1KG1zZyxwYXJhMSxwYXJhMixwYXJhMyxwYXJhbTQpCisjZGVmaW5lIEZPWElUX0RFQlVHMihtc2csIHBhcmEpCisjZGVmaW5lIEZPWElUX0RFQlVHMyhtc2csIHBhcmExLCBwYXJhMikKKyNkZWZpbmUgRk9YSVRfREVCVUc0KG1zZywgcGFyYTEsIHBhcmEyLCBwYXJhMykKKyNkZWZpbmUgRk9YSVRfREVCVUc1KG1zZywgcGFyYTEsIHBhcmEyLCBwYXJhMywgcGFyYW00KQogI2VuZGlmCiAKICNpbmNsdWRlICJTa0Rhc2hQYXRoRWZmZWN0LmgiCkBAIC0zNiw0OTYgKzM3LDU5MyBAQAogI2luY2x1ZGUgIlNrUmFzdGVyQ2xpcC5oIgogI2luY2x1ZGUgIlNrU3Ryb2tlLmgiCiAKLQogI2luY2x1ZGUgImZ4X3NraWFfYmxpdHRlcl9uZXcuaCIKICNpbmNsdWRlICIuLi9hZ2cvZnhfYWdnX2RyaXZlci5oIgogI2luY2x1ZGUgImZ4X3NraWFfZGV2aWNlLmgiCiAvLy8gUnVuLWxlbmd0aC1lbmNvZGVkIHN1cGVyc2FtcGxpbmcgYW50aWFsaWFzZWQgYmxpdHRlci4KLWNsYXNzIFN1cGVyQmxpdHRlcl9za2lhCi17Ci1wdWJsaWM6Ci0Jc3RhdGljIHZvaWQgRHJhd1BhdGgoY29uc3QgU2tQYXRoJiBzcmNQYXRoLCBTa0JsaXR0ZXIqIGJsaXR0ZXIsICBjb25zdCBTa1Jhc3RlckNsaXAmIHJlY3QsIGNvbnN0IFNrUGFpbnQmIG9yaWdQYWludCk7CitjbGFzcyBTdXBlckJsaXR0ZXJfc2tpYSB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBEcmF3UGF0aChjb25zdCBTa1BhdGgmIHNyY1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIFNrQmxpdHRlciogYmxpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tSYXN0ZXJDbGlwJiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQpOwogfTsKIEZYX0JPT0wgRnhTa0RyYXdUcmVhdEFzSGFpcmxpbmUoY29uc3QgU2tQYWludCYgcGFpbnQsIFNrU2NhbGFyKiBjb3ZlcmFnZSkgewotCWlmIChTa1BhaW50OjprU3Ryb2tlX1N0eWxlICE9IHBhaW50LmdldFN0eWxlKCkpCi0JCXJldHVybiBGQUxTRTsKLQlGWFNZU19hc3NlcnQoY292ZXJhZ2UpOwotCVNrU2NhbGFyIHN0cm9rZVdpZHRoID0gcGFpbnQuZ2V0U3Ryb2tlV2lkdGgoKTsKLQlpZiAoMCA9PSBzdHJva2VXaWR0aCkgewotCQkqY292ZXJhZ2UgPSBTS19TY2FsYXIxOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JLy8gaWYgd2UgZ2V0IGhlcmUsIHdlIG5lZWQgdG8gdHJ5IHRvIGZha2UgYSB0aGljay1zdHJva2Ugd2l0aCBhIG1vZHVsYXRlZAotCS8vIGhhaXJsaW5lCi0JaWYgKCFwYWludC5pc0FudGlBbGlhcygpKQotCQlyZXR1cm4gRkFMU0U7Ci0JaWYgKHN0cm9rZVdpZHRoIDw9IFNLX1NjYWxhcjEpIHsKLQkJKmNvdmVyYWdlID0gc3Ryb2tlV2lkdGg7Ci0JCXJldHVybiBUUlVFOwotCX0KLQlyZXR1cm4gRkFMU0U7CisgIGlmIChTa1BhaW50OjprU3Ryb2tlX1N0eWxlICE9IHBhaW50LmdldFN0eWxlKCkpCisgICAgcmV0dXJuIEZBTFNFOworICBGWFNZU19hc3NlcnQoY292ZXJhZ2UpOworICBTa1NjYWxhciBzdHJva2VXaWR0aCA9IHBhaW50LmdldFN0cm9rZVdpZHRoKCk7CisgIGlmICgwID09IHN0cm9rZVdpZHRoKSB7CisgICAgKmNvdmVyYWdlID0gU0tfU2NhbGFyMTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICAvLyBpZiB3ZSBnZXQgaGVyZSwgd2UgbmVlZCB0byB0cnkgdG8gZmFrZSBhIHRoaWNrLXN0cm9rZSB3aXRoIGEgbW9kdWxhdGVkCisgIC8vIGhhaXJsaW5lCisgIGlmICghcGFpbnQuaXNBbnRpQWxpYXMoKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChzdHJva2VXaWR0aCA8PSBTS19TY2FsYXIxKSB7CisgICAgKmNvdmVyYWdlID0gc3Ryb2tlV2lkdGg7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIFN1cGVyQmxpdHRlcl9za2lhOjpEcmF3UGF0aChjb25zdCBTa1BhdGgmIHNyY1BhdGgsIFNrQmxpdHRlciogYmxpdHRlciwgY29uc3QgU2tSYXN0ZXJDbGlwJiByZWN0LCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQpCi17Ci0JU2tQYXRoKgkJcGF0aFB0ciA9IChTa1BhdGgqKSZzcmNQYXRoOwotCWJvb2wJCWRvRmlsbCA9IHRydWU7Ci0JU2tQYXRoCQl0bXBQYXRoOwotCVNrVENvcHlPbkZpcnN0V3JpdGU8U2tQYWludD4gcGFpbnQob3JpZ1BhaW50KTsKLQl7Ci0JCVNrU2NhbGFyIGNvdmVyYWdlOwotCQlpZiAoRnhTa0RyYXdUcmVhdEFzSGFpcmxpbmUob3JpZ1BhaW50LCAmY292ZXJhZ2UpKSB7Ci0JCQlpZiAoU0tfU2NhbGFyMSA9PSBjb3ZlcmFnZSkgewotCQkJCXBhaW50LndyaXRhYmxlKCktPnNldFN0cm9rZVdpZHRoKDApOwotCQkJfSBlbHNlIGlmICgxKSB7Ly94ZmVybW9kZVN1cHBvcnRzQ292ZXJhZ2VBc0FscGhhKHhmZXIpLCB3ZSBub3QgdXNlIGJsZW5kIG1vZGUgaGVyZSwgeGZlciBhd2F5cyBOVUxMLgotCQkJCVU4Q1BVIG5ld0FscGhhOwotCQkJCS8vIHRoaXMgaXMgdGhlIG9sZCB0ZWNobmlxdWUsIHdoaWNoIHdlIHByZXNlcnZlIGZvciBub3cgc28KLQkJCQkvLyB3ZSBkb24ndCBjaGFuZ2UgcHJldmlvdXMgcmVzdWx0cyAodGVzdGluZykKLQkJCQkvLyB0aGUgbmV3IHdheSBzZWVtcyBmaW5lLCBpdHMganVzdCAoYSB0aW55IGJpdCkgZGlmZmVyZW50Ci0JCQkJaW50IHNjYWxlID0gKGludClTa1NjYWxhck11bChjb3ZlcmFnZSwgMjU2KTsKLQkJCQluZXdBbHBoYSA9IG9yaWdQYWludC5nZXRBbHBoYSgpICogc2NhbGUgPj4gODsKLQkJCQlTa1BhaW50KiB3cml0YWJsZVBhaW50ID0gcGFpbnQud3JpdGFibGUoKTsKLQkJCQl3cml0YWJsZVBhaW50LT5zZXRTdHJva2VXaWR0aCgwKTsKLQkJCQl3cml0YWJsZVBhaW50LT5zZXRBbHBoYShuZXdBbHBoYSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHBhaW50LT5nZXRQYXRoRWZmZWN0KCkgfHwgcGFpbnQtPmdldFN0eWxlKCkgIT0gU2tQYWludDo6a0ZpbGxfU3R5bGUpIHsKLQkJU2tJUmVjdCBkZXZCb3VuZHMgPSByZWN0LmdldEJvdW5kcygpOwotCQkvLyBvdXRzZXQgdG8gaGF2ZSBzbG9wIGZvciBhbnRpYWxhc2luZyBhbmQgaGFpcmxpbmVzCi0JCWRldkJvdW5kcy5vdXRzZXQoMSwgMSk7Ci0JCVNrUmVjdCBjdWxsUmVjdCA9IFNrUmVjdDo6TWFrZShkZXZCb3VuZHMpOwotCQlkb0ZpbGwgPSBwYWludC0+Z2V0RmlsbFBhdGgoKnBhdGhQdHIsICZ0bXBQYXRoLCAmY3VsbFJlY3QpOwotCQlwYXRoUHRyID0gJnRtcFBhdGg7Ci0JfQotCS8vIGF2b2lkIHBvc3NpYmx5IGFsbG9jYXRpbmcgYSBuZXcgcGF0aCBpbiB0cmFuc2Zvcm0gaWYgd2UgY2FuCi0JU2tQYXRoKiBkZXZQYXRoUHRyID0gcGF0aFB0cjsKLQl2b2lkICgqcHJvYykoY29uc3QgU2tQYXRoJiwgY29uc3QgU2tSYXN0ZXJDbGlwJiwgU2tCbGl0dGVyKik7Ci0JaWYgKGRvRmlsbCkgewotCQlpZiAocGFpbnQtPmlzQW50aUFsaWFzKCkpIHsKLQkJCXByb2MgPSBTa1NjYW46OkFudGlGaWxsUGF0aDsKLQkJfSBlbHNlIHsKLQkJCXByb2MgPSBTa1NjYW46OkZpbGxQYXRoOwotCQl9Ci0JfSBlbHNlIHsJLy8gaGFpcmxpbmUKLQkJaWYgKHBhaW50LT5pc0FudGlBbGlhcygpKSB7Ci0JCQlwcm9jID0gU2tTY2FuOjpBbnRpSGFpclBhdGg7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9jID0gU2tTY2FuOjpIYWlyUGF0aDsKLQkJfQotCX0KLQlwcm9jKCpkZXZQYXRoUHRyLCByZWN0LCBibGl0dGVyKTsKK3ZvaWQgU3VwZXJCbGl0dGVyX3NraWE6OkRyYXdQYXRoKGNvbnN0IFNrUGF0aCYgc3JjUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQmxpdHRlciogYmxpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrUmFzdGVyQ2xpcCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrUGFpbnQmIG9yaWdQYWludCkgeworICBTa1BhdGgqIHBhdGhQdHIgPSAoU2tQYXRoKikmc3JjUGF0aDsKKyAgYm9vbCBkb0ZpbGwgPSB0cnVlOworICBTa1BhdGggdG1wUGF0aDsKKyAgU2tUQ29weU9uRmlyc3RXcml0ZTxTa1BhaW50PiBwYWludChvcmlnUGFpbnQpOworICB7CisgICAgU2tTY2FsYXIgY292ZXJhZ2U7CisgICAgaWYgKEZ4U2tEcmF3VHJlYXRBc0hhaXJsaW5lKG9yaWdQYWludCwgJmNvdmVyYWdlKSkgeworICAgICAgaWYgKFNLX1NjYWxhcjEgPT0gY292ZXJhZ2UpIHsKKyAgICAgICAgcGFpbnQud3JpdGFibGUoKS0+c2V0U3Ryb2tlV2lkdGgoMCk7CisgICAgICB9IGVsc2UgaWYgKDEpIHsgIC8vIHhmZXJtb2RlU3VwcG9ydHNDb3ZlcmFnZUFzQWxwaGEoeGZlciksIHdlIG5vdCB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gYmxlbmQgbW9kZSBoZXJlLCB4ZmVyIGF3YXlzIE5VTEwuCisgICAgICAgIFU4Q1BVIG5ld0FscGhhOworICAgICAgICAvLyB0aGlzIGlzIHRoZSBvbGQgdGVjaG5pcXVlLCB3aGljaCB3ZSBwcmVzZXJ2ZSBmb3Igbm93IHNvCisgICAgICAgIC8vIHdlIGRvbid0IGNoYW5nZSBwcmV2aW91cyByZXN1bHRzICh0ZXN0aW5nKQorICAgICAgICAvLyB0aGUgbmV3IHdheSBzZWVtcyBmaW5lLCBpdHMganVzdCAoYSB0aW55IGJpdCkgZGlmZmVyZW50CisgICAgICAgIGludCBzY2FsZSA9IChpbnQpU2tTY2FsYXJNdWwoY292ZXJhZ2UsIDI1Nik7CisgICAgICAgIG5ld0FscGhhID0gb3JpZ1BhaW50LmdldEFscGhhKCkgKiBzY2FsZSA+PiA4OworICAgICAgICBTa1BhaW50KiB3cml0YWJsZVBhaW50ID0gcGFpbnQud3JpdGFibGUoKTsKKyAgICAgICAgd3JpdGFibGVQYWludC0+c2V0U3Ryb2tlV2lkdGgoMCk7CisgICAgICAgIHdyaXRhYmxlUGFpbnQtPnNldEFscGhhKG5ld0FscGhhKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHBhaW50LT5nZXRQYXRoRWZmZWN0KCkgfHwgcGFpbnQtPmdldFN0eWxlKCkgIT0gU2tQYWludDo6a0ZpbGxfU3R5bGUpIHsKKyAgICBTa0lSZWN0IGRldkJvdW5kcyA9IHJlY3QuZ2V0Qm91bmRzKCk7CisgICAgLy8gb3V0c2V0IHRvIGhhdmUgc2xvcCBmb3IgYW50aWFsYXNpbmcgYW5kIGhhaXJsaW5lcworICAgIGRldkJvdW5kcy5vdXRzZXQoMSwgMSk7CisgICAgU2tSZWN0IGN1bGxSZWN0ID0gU2tSZWN0OjpNYWtlKGRldkJvdW5kcyk7CisgICAgZG9GaWxsID0gcGFpbnQtPmdldEZpbGxQYXRoKCpwYXRoUHRyLCAmdG1wUGF0aCwgJmN1bGxSZWN0KTsKKyAgICBwYXRoUHRyID0gJnRtcFBhdGg7CisgIH0KKyAgLy8gYXZvaWQgcG9zc2libHkgYWxsb2NhdGluZyBhIG5ldyBwYXRoIGluIHRyYW5zZm9ybSBpZiB3ZSBjYW4KKyAgU2tQYXRoKiBkZXZQYXRoUHRyID0gcGF0aFB0cjsKKyAgdm9pZCAoKnByb2MpKGNvbnN0IFNrUGF0aCYsIGNvbnN0IFNrUmFzdGVyQ2xpcCYsIFNrQmxpdHRlciopOworICBpZiAoZG9GaWxsKSB7CisgICAgaWYgKHBhaW50LT5pc0FudGlBbGlhcygpKSB7CisgICAgICBwcm9jID0gU2tTY2FuOjpBbnRpRmlsbFBhdGg7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb2MgPSBTa1NjYW46OkZpbGxQYXRoOworICAgIH0KKyAgfSBlbHNlIHsgIC8vIGhhaXJsaW5lCisgICAgaWYgKHBhaW50LT5pc0FudGlBbGlhcygpKSB7CisgICAgICBwcm9jID0gU2tTY2FuOjpBbnRpSGFpclBhdGg7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb2MgPSBTa1NjYW46OkhhaXJQYXRoOworICAgIH0KKyAgfQorICBwcm9jKCpkZXZQYXRoUHRyLCByZWN0LCBibGl0dGVyKTsKIH0KIAotY2xhc3MgQ1NraWFfUGF0aERhdGEKLXsKLXB1YmxpYzoKLQlDU2tpYV9QYXRoRGF0YSgpIHt9Ci0JfkNTa2lhX1BhdGhEYXRhKCkge30KLQlTa1BhdGgJCQltX1BhdGhEYXRhOworY2xhc3MgQ1NraWFfUGF0aERhdGEgeworIHB1YmxpYzoKKyAgQ1NraWFfUGF0aERhdGEoKSB7fQorICB+Q1NraWFfUGF0aERhdGEoKSB7fQorICBTa1BhdGggbV9QYXRoRGF0YTsKIAotCXZvaWQJCQlCdWlsZFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlKTsKKyAgdm9pZCBCdWlsZFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlKTsKIH07CiAKLXZvaWQgQ1NraWFfUGF0aERhdGE6OkJ1aWxkUGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UpCi17Ci0JY29uc3QgQ0ZYX1BhdGhEYXRhKiBwRlBhdGggPSBwUGF0aERhdGE7Ci0JaW50IG5Qb2ludHMgPSBwRlBhdGgtPkdldFBvaW50Q291bnQoKTsKLQlGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwRlBhdGgtPkdldFBvaW50cygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgblBvaW50czsgaSArKykgewotCQlGWF9GSVhGTE9BVCB4ID0gcFBvaW50c1tpXS5tX1BvaW50WCwgeSA9IHBQb2ludHNbaV0ubV9Qb2ludFk7Ci0JCWlmIChwT2JqZWN0MkRldmljZSkgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4LCB5KTsKLQkJaW50IHBvaW50X3R5cGUgPSBwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfVFlQRTsKLQkJaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9NT1ZFVE8pIHsKLQkJCW1fUGF0aERhdGEubW92ZVRvKHgsIHkpOwotCQl9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9MSU5FVE8pIHsKLQkJCWlmIChwUG9pbnRzW2ktMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPICYmIChpID09IG5Qb2ludHMtMSB8fCBwUG9pbnRzW2krMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSAmJgotCQkJCQlGWFNZU19hYnMocFBvaW50c1tpXS5tX1BvaW50WCAtIHBQb2ludHNbaS0xXS5tX1BvaW50WCkgPCAwLjRmICYmIEZYU1lTX2FicyhwUG9pbnRzW2ldLm1fUG9pbnRZIC0gcFBvaW50c1tpLTFdLm1fUG9pbnRZKTwgMC40ZikKLQkJCQkvLyBQREYgbGluZSBpbmNsdWRlcyB0aGUgZGVzdGluYXRpb24gcG9pbnQsIHVubGlrZSBXaW5kb3dzIGxpbmUuCi0JCQkJLy8gV2UgcmVjZWl2ZWQgc29tZSBQREYgd2hpY2ggYWN0dWFsbHkgZHJhd3MgemVybyBsZW5ndGggbGluZXMuIFRFU1RET0M6IHN1bW1lciBjaGEgc2hvdy5wZGYKLQkJCQkvLyBUaGVyZWZvcmUsIHdlIGhhdmUgdG8gZXh0ZW5kIHRoZSBsaW5lIGJ5IDAuNCBwaXhlbCBoZXJlLgotCQkJCS8vIEJ1dCBvbmx5IGZvciBzdGFuZGFsb25lIHNlZ21lbnQuIFRFU1RET0M6IGJ1ZyAjMTQzNCAtIG1hemUucGRmOyBURVNURE9DOiBidWcjMTUwOCBkaTcwNFBfUUlHXzExMS5wZGYKLQkJCQl4ICs9IDAuNDsKLQkJCS8vIFRPRE86IHdlIHNob3VsZCBhY3R1YWxseSB0ZWxsIHNraWEgdmVydGV4IGdlbmVyYXRvciB0byBwcm9jZXNzIHplcm8gbGVuZ3RoIHN0cm9rZWQgbGluZQotCQkJLy8gKG9ubHkgYnV0dHMgYXJlIGRyYXduKQotCQkJbV9QYXRoRGF0YS5saW5lVG8oeCwgeSk7Ci0JCX0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0JFWklFUlRPKSB7Ci0JCQlGWF9GSVhGTE9BVCB4MiA9IHBQb2ludHNbaSsxXS5tX1BvaW50WCwgeTIgPSBwUG9pbnRzW2krMV0ubV9Qb2ludFk7Ci0JCQlGWF9GSVhGTE9BVCB4MyA9IHBQb2ludHNbaSsyXS5tX1BvaW50WCwgeTMgPSBwUG9pbnRzW2krMl0ubV9Qb2ludFk7Ci0JCQlpZiAocE9iamVjdDJEZXZpY2UpewotCQkJCXBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeDIsIHkyKTsKLQkJCQlwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgzLCB5Myk7Ci0JCQl9Ci0JCQltX1BhdGhEYXRhLmN1YmljVG8oeCwgeSwgeDIsIHkyLCB4MywgeTMpOwotCQkJaSArPSAyOwotCQl9Ci0JCWlmIChwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIG1fUGF0aERhdGEuY2xvc2UoKTsKLQl9Cit2b2lkIENTa2lhX1BhdGhEYXRhOjpCdWlsZFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UpIHsKKyAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwRlBhdGggPSBwUGF0aERhdGE7CisgIGludCBuUG9pbnRzID0gcEZQYXRoLT5HZXRQb2ludENvdW50KCk7CisgIEZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBGUGF0aC0+R2V0UG9pbnRzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgblBvaW50czsgaSsrKSB7CisgICAgRlhfRklYRkxPQVQgeCA9IHBQb2ludHNbaV0ubV9Qb2ludFgsIHkgPSBwUG9pbnRzW2ldLm1fUG9pbnRZOworICAgIGlmIChwT2JqZWN0MkRldmljZSkKKyAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeCwgeSk7CisgICAgaW50IHBvaW50X3R5cGUgPSBwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfVFlQRTsKKyAgICBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX01PVkVUTykgeworICAgICAgbV9QYXRoRGF0YS5tb3ZlVG8oeCwgeSk7CisgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfTElORVRPKSB7CisgICAgICBpZiAocFBvaW50c1tpIC0gMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPICYmCisgICAgICAgICAgKGkgPT0gblBvaW50cyAtIDEgfHwgcFBvaW50c1tpICsgMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSAmJgorICAgICAgICAgIEZYU1lTX2FicyhwUG9pbnRzW2ldLm1fUG9pbnRYIC0gcFBvaW50c1tpIC0gMV0ubV9Qb2ludFgpIDwgMC40ZiAmJgorICAgICAgICAgIEZYU1lTX2FicyhwUG9pbnRzW2ldLm1fUG9pbnRZIC0gcFBvaW50c1tpIC0gMV0ubV9Qb2ludFkpIDwgMC40ZikKKyAgICAgICAgLy8gUERGIGxpbmUgaW5jbHVkZXMgdGhlIGRlc3RpbmF0aW9uIHBvaW50LCB1bmxpa2UgV2luZG93cyBsaW5lLgorICAgICAgICAvLyBXZSByZWNlaXZlZCBzb21lIFBERiB3aGljaCBhY3R1YWxseSBkcmF3cyB6ZXJvIGxlbmd0aCBsaW5lcy4gVEVTVERPQzoKKyAgICAgICAgLy8gc3VtbWVyIGNoYSBzaG93LnBkZgorICAgICAgICAvLyBUaGVyZWZvcmUsIHdlIGhhdmUgdG8gZXh0ZW5kIHRoZSBsaW5lIGJ5IDAuNCBwaXhlbCBoZXJlLgorICAgICAgICAvLyBCdXQgb25seSBmb3Igc3RhbmRhbG9uZSBzZWdtZW50LiBURVNURE9DOiBidWcgIzE0MzQgLSBtYXplLnBkZjsKKyAgICAgICAgLy8gVEVTVERPQzogYnVnIzE1MDggZGk3MDRQX1FJR18xMTEucGRmCisgICAgICAgIHggKz0gMC40OworICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGFjdHVhbGx5IHRlbGwgc2tpYSB2ZXJ0ZXggZ2VuZXJhdG9yIHRvIHByb2Nlc3MgemVybworICAgICAgLy8gbGVuZ3RoIHN0cm9rZWQgbGluZQorICAgICAgLy8gKG9ubHkgYnV0dHMgYXJlIGRyYXduKQorICAgICAgbV9QYXRoRGF0YS5saW5lVG8oeCwgeSk7CisgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfQkVaSUVSVE8pIHsKKyAgICAgIEZYX0ZJWEZMT0FUIHgyID0gcFBvaW50c1tpICsgMV0ubV9Qb2ludFgsIHkyID0gcFBvaW50c1tpICsgMV0ubV9Qb2ludFk7CisgICAgICBGWF9GSVhGTE9BVCB4MyA9IHBQb2ludHNbaSArIDJdLm1fUG9pbnRYLCB5MyA9IHBQb2ludHNbaSArIDJdLm1fUG9pbnRZOworICAgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeDIsIHkyKTsKKyAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4MywgeTMpOworICAgICAgfQorICAgICAgbV9QYXRoRGF0YS5jdWJpY1RvKHgsIHksIHgyLCB5MiwgeDMsIHkzKTsKKyAgICAgIGkgKz0gMjsKKyAgICB9CisgICAgaWYgKHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9DTE9TRUZJR1VSRSkKKyAgICAgIG1fUGF0aERhdGEuY2xvc2UoKTsKKyAgfQogfQogCiAvLyBjb252ZXJ0IGEgc3Ryb2tpbmcgcGF0aCB0byBzY2FubGluZXMKLXN0YXRpYyB2b2lkIFNrUmFzdGVyaXplU3Ryb2tlKFNrUGFpbnQmIHNwYWludCwgU2tQYXRoKiBkc3RQYXRoRGF0YSwgU2tQYXRoJiBwYXRoX2RhdGEsCi0JCQkJCSBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLQkJCQkJIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIEZYX0ZJWEZMT0FUIHNjYWxlID0gRklYOF9PTkUsCi0JCQkJCSBGWF9CT09MIGJTdHJva2VBZGp1c3QgPSBGQUxTRSwgRlhfQk9PTCBiVGV4dE1vZGUgPSBGQUxTRSkKLXsKLQlTa1BhaW50OjpDYXAgY2FwOwotCXN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgewotCQljYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFJvdW5kOgotCQkJY2FwID0gU2tQYWludDo6a1JvdW5kX0NhcDsKLQkJCWJyZWFrOwotCQljYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFNxdWFyZToKLQkJCWNhcCA9IFNrUGFpbnQ6OmtTcXVhcmVfQ2FwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQljYXAgPSBTa1BhaW50OjprQnV0dF9DYXA7Ci0JCQlicmVhazsKLQl9Ci0JU2tQYWludDo6Sm9pbiBqb2luOwotCXN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUpvaW4pIHsKLQkJY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luUm91bmQ6Ci0JCQlqb2luID0gU2tQYWludDo6a1JvdW5kX0pvaW47Ci0JCQlicmVhazsKLQkJY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luQmV2ZWw6Ci0JCQlqb2luID0gU2tQYWludDo6a0JldmVsX0pvaW47Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWpvaW4gPSBTa1BhaW50OjprTWl0ZXJfSm9pbjsKLQkJCWJyZWFrOwotCX0KLQlGWF9GSVhGTE9BVCB3aWR0aCA9IHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCpzY2FsZTsKLQlGWF9GSVhGTE9BVCB1bml0ID0gZml4MzJfdG9fOChmaXhkaXZfOF84X3RvXzMyKEZJWDhfT05FLCAocE9iamVjdDJEZXZpY2UtPkdldFhVbml0KCkgKyBwT2JqZWN0MkRldmljZS0+R2V0WVVuaXQoKSkgLyAyKSk7Ci0JaWYgKHdpZHRoIDw9IHVuaXQpIHdpZHRoID0gdW5pdDsKK3N0YXRpYyB2b2lkIFNrUmFzdGVyaXplU3Ryb2tlKFNrUGFpbnQmIHNwYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGF0aCogZHN0UGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BhdGgmIHBhdGhfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJWEZMT0FUIHNjYWxlID0gRklYOF9PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2VBZGp1c3QgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRleHRNb2RlID0gRkFMU0UpIHsKKyAgU2tQYWludDo6Q2FwIGNhcDsKKyAgc3dpdGNoIChwR3JhcGhTdGF0ZS0+bV9MaW5lQ2FwKSB7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBSb3VuZDoKKyAgICAgIGNhcCA9IFNrUGFpbnQ6OmtSb3VuZF9DYXA7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFNxdWFyZToKKyAgICAgIGNhcCA9IFNrUGFpbnQ6OmtTcXVhcmVfQ2FwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGNhcCA9IFNrUGFpbnQ6OmtCdXR0X0NhcDsKKyAgICAgIGJyZWFrOworICB9CisgIFNrUGFpbnQ6OkpvaW4gam9pbjsKKyAgc3dpdGNoIChwR3JhcGhTdGF0ZS0+bV9MaW5lSm9pbikgeworICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pblJvdW5kOgorICAgICAgam9pbiA9IFNrUGFpbnQ6OmtSb3VuZF9Kb2luOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luQmV2ZWw6CisgICAgICBqb2luID0gU2tQYWludDo6a0JldmVsX0pvaW47CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgam9pbiA9IFNrUGFpbnQ6OmtNaXRlcl9Kb2luOworICAgICAgYnJlYWs7CisgIH0KKyAgRlhfRklYRkxPQVQgd2lkdGggPSBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGggKiBzY2FsZTsKKyAgRlhfRklYRkxPQVQgdW5pdCA9IGZpeDMyX3RvXzgoZml4ZGl2XzhfOF90b18zMigKKyAgICAgIEZJWDhfT05FLCAocE9iamVjdDJEZXZpY2UtPkdldFhVbml0KCkgKyBwT2JqZWN0MkRldmljZS0+R2V0WVVuaXQoKSkgLyAyKSk7CisgIGlmICh3aWR0aCA8PSB1bml0KQorICAgIHdpZHRoID0gdW5pdDsKIAotCWlmIChwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXkgPT0gTlVMTCkgewotCQlTa1N0cm9rZSBzdHJva2VyOwotCQlzdHJva2VyLnNldENhcChjYXApOwotCQlzdHJva2VyLnNldEpvaW4oam9pbik7Ci0JCXN0cm9rZXIuc2V0TWl0ZXJMaW1pdChwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKLQkJc3Ryb2tlci5zZXRXaWR0aCh3aWR0aCk7Ci0JCXN0cm9rZXIuc2V0RG9GaWxsKEZBTFNFKTsKLQkJc3Ryb2tlci5zdHJva2VQYXRoKHBhdGhfZGF0YSwgZHN0UGF0aERhdGEpOwotCQlTa01hdHJpeCBzbWF0cml4OwotCQlzbWF0cml4LnNldEFsbChwT2JqZWN0MkRldmljZS0+YSwgcE9iamVjdDJEZXZpY2UtPmMsIHBPYmplY3QyRGV2aWNlLT5lLCBwT2JqZWN0MkRldmljZS0+YiwgcE9iamVjdDJEZXZpY2UtPmQsIHBPYmplY3QyRGV2aWNlLT5mLCAwLCAwLCAxKTsKLQkJZHN0UGF0aERhdGEtPnRyYW5zZm9ybShzbWF0cml4KTsKLQl9IGVsc2UgewotCQlpbnQgY291bnQgPSAocEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KzEpLzI7Ci0JCVNrU2NhbGFyKiBpbnRlcnZhbHMgPSBGWF9BbGxvYzJEKFNrU2NhbGFyLCBjb3VudCwgc2l6ZW9mKFNrU2NhbGFyKSk7Ci0JCS8vIFNldCBkYXNoIHBhdHRlcm4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotCQkJRlhfRklYRkxPQVQgb24gPSBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaSoyXTsKLQkJCWlmIChvbiA8PSAwLjAwMDAwMWYpIG9uID0gRklYOF9PTkUvMTA7Ci0JCQlGWF9GSVhGTE9BVCBvZmYgPSBpKjIrMSA9PSBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgPyBvbiA6Ci0JCQkJCXBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpKjIrMV07Ci0JCQlpZiAob2ZmIDwgMCkgb2ZmID0gMDsKLQkJCWludGVydmFsc1tpKjJdPW9uKnNjYWxlOwotCQkJaW50ZXJ2YWxzW2kqMisxXT1vZmYqc2NhbGU7Ci0JCX0KLQkJU2tEYXNoUGF0aEVmZmVjdCogcEVmZmVjdCA9IG5ldyBTa0Rhc2hQYXRoRWZmZWN0KGludGVydmFscyxjb3VudCoyLCBwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2Uqc2NhbGUpOwotCQlzcGFpbnQuc2V0UGF0aEVmZmVjdChwRWZmZWN0KS0+dW5yZWYoKTsKLQkJc3BhaW50LnNldFN0cm9rZVdpZHRoKHdpZHRoKTsKLQkJc3BhaW50LnNldFN0cm9rZU1pdGVyKHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQpOwotCQlzcGFpbnQuc2V0U3Ryb2tlQ2FwKGNhcCk7Ci0JCXNwYWludC5zZXRTdHJva2VKb2luKGpvaW4pOwotCQlzcGFpbnQuZ2V0RmlsbFBhdGgocGF0aF9kYXRhLCBkc3RQYXRoRGF0YSk7Ci0JCVNrTWF0cml4IHNtYXRyaXg7Ci0JCXNtYXRyaXguc2V0QWxsKHBPYmplY3QyRGV2aWNlLT5hLCBwT2JqZWN0MkRldmljZS0+YywgcE9iamVjdDJEZXZpY2UtPmUsIHBPYmplY3QyRGV2aWNlLT5iLCBwT2JqZWN0MkRldmljZS0+ZCwgcE9iamVjdDJEZXZpY2UtPmYsIDAsIDAsIDEpOwotCQlkc3RQYXRoRGF0YS0+dHJhbnNmb3JtKHNtYXRyaXgpOwotCQlGWF9GcmVlKGludGVydmFscyk7Ci0JfQorICBpZiAocEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5ID09IE5VTEwpIHsKKyAgICBTa1N0cm9rZSBzdHJva2VyOworICAgIHN0cm9rZXIuc2V0Q2FwKGNhcCk7CisgICAgc3Ryb2tlci5zZXRKb2luKGpvaW4pOworICAgIHN0cm9rZXIuc2V0TWl0ZXJMaW1pdChwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKKyAgICBzdHJva2VyLnNldFdpZHRoKHdpZHRoKTsKKyAgICBzdHJva2VyLnNldERvRmlsbChGQUxTRSk7CisgICAgc3Ryb2tlci5zdHJva2VQYXRoKHBhdGhfZGF0YSwgZHN0UGF0aERhdGEpOworICAgIFNrTWF0cml4IHNtYXRyaXg7CisgICAgc21hdHJpeC5zZXRBbGwocE9iamVjdDJEZXZpY2UtPmEsIHBPYmplY3QyRGV2aWNlLT5jLCBwT2JqZWN0MkRldmljZS0+ZSwKKyAgICAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+YiwgcE9iamVjdDJEZXZpY2UtPmQsIHBPYmplY3QyRGV2aWNlLT5mLCAwLAorICAgICAgICAgICAgICAgICAgIDAsIDEpOworICAgIGRzdFBhdGhEYXRhLT50cmFuc2Zvcm0oc21hdHJpeCk7CisgIH0gZWxzZSB7CisgICAgaW50IGNvdW50ID0gKHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCArIDEpIC8gMjsKKyAgICBTa1NjYWxhciogaW50ZXJ2YWxzID0gRlhfQWxsb2MyRChTa1NjYWxhciwgY291bnQsIHNpemVvZihTa1NjYWxhcikpOworICAgIC8vIFNldCBkYXNoIHBhdHRlcm4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIEZYX0ZJWEZMT0FUIG9uID0gcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2kgKiAyXTsKKyAgICAgIGlmIChvbiA8PSAwLjAwMDAwMWYpCisgICAgICAgIG9uID0gRklYOF9PTkUgLyAxMDsKKyAgICAgIEZYX0ZJWEZMT0FUIG9mZiA9IGkgKiAyICsgMSA9PSBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaSAqIDIgKyAxXTsKKyAgICAgIGlmIChvZmYgPCAwKQorICAgICAgICBvZmYgPSAwOworICAgICAgaW50ZXJ2YWxzW2kgKiAyXSA9IG9uICogc2NhbGU7CisgICAgICBpbnRlcnZhbHNbaSAqIDIgKyAxXSA9IG9mZiAqIHNjYWxlOworICAgIH0KKyAgICBTa0Rhc2hQYXRoRWZmZWN0KiBwRWZmZWN0ID0gbmV3IFNrRGFzaFBhdGhFZmZlY3QoCisgICAgICAgIGludGVydmFscywgY291bnQgKiAyLCBwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2UgKiBzY2FsZSk7CisgICAgc3BhaW50LnNldFBhdGhFZmZlY3QocEVmZmVjdCktPnVucmVmKCk7CisgICAgc3BhaW50LnNldFN0cm9rZVdpZHRoKHdpZHRoKTsKKyAgICBzcGFpbnQuc2V0U3Ryb2tlTWl0ZXIocEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7CisgICAgc3BhaW50LnNldFN0cm9rZUNhcChjYXApOworICAgIHNwYWludC5zZXRTdHJva2VKb2luKGpvaW4pOworICAgIHNwYWludC5nZXRGaWxsUGF0aChwYXRoX2RhdGEsIGRzdFBhdGhEYXRhKTsKKyAgICBTa01hdHJpeCBzbWF0cml4OworICAgIHNtYXRyaXguc2V0QWxsKHBPYmplY3QyRGV2aWNlLT5hLCBwT2JqZWN0MkRldmljZS0+YywgcE9iamVjdDJEZXZpY2UtPmUsCisgICAgICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPmIsIHBPYmplY3QyRGV2aWNlLT5kLCBwT2JqZWN0MkRldmljZS0+ZiwgMCwKKyAgICAgICAgICAgICAgICAgICAwLCAxKTsKKyAgICBkc3RQYXRoRGF0YS0+dHJhbnNmb3JtKHNtYXRyaXgpOworICAgIEZYX0ZyZWUoaW50ZXJ2YWxzKTsKKyAgfQogfQogCi1DRlhfU2tpYURldmljZURyaXZlcjo6Q0ZYX1NraWFEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQotewotCW1fcEFnZ0RyaXZlciA9IEZYX05FVyBDRlhfQWdnRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBiUmdiQnl0ZU9yZGVyLCBwT3JpRGV2aWNlLCBiR3JvdXBLbm9ja291dCk7CitDRlhfU2tpYURldmljZURyaXZlcjo6Q0ZYX1NraWFEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXRoZXJfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpIHsKKyAgbV9wQWdnRHJpdmVyID0gRlhfTkVXIENGWF9BZ2dEZXZpY2VEcml2ZXIocEJpdG1hcCwgZGl0aGVyX2JpdHMsIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPcmlEZXZpY2UsIGJHcm91cEtub2Nrb3V0KTsKIH0KLUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjp+Q0ZYX1NraWFEZXZpY2VEcml2ZXIoKQotewotICAgIGRlbGV0ZSBtX3BBZ2dEcml2ZXI7CitDRlhfU2tpYURldmljZURyaXZlcjo6fkNGWF9Ta2lhRGV2aWNlRHJpdmVyKCkgeworICBkZWxldGUgbV9wQWdnRHJpdmVyOwogfQotRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCi0JCUNGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZJWEZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCi0JCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotCXJldHVybiBtX3BBZ2dEcml2ZXItPkRyYXdEZXZpY2VUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LHBDYWNoZSwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgY29sb3IsCi0JCWFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoCisgICAgaW50IG5DaGFycywKKyAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICBGWF9GSVhGTE9BVCBmb250X3NpemUsCisgICAgRlhfRFdPUkQgY29sb3IsCisgICAgaW50IGFscGhhX2ZsYWcsCisgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICByZXR1cm4gbV9wQWdnRHJpdmVyLT5EcmF3RGV2aWNlVGV4dChuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZSwgZm9udF9zaXplLCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1pbnQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpCi17Ci0JcmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0RGV2aWNlQ2FwcyhjYXBzX2lkKTsKK2ludCBDRlhfU2tpYURldmljZURyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgeworICByZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXREZXZpY2VDYXBzKGNhcHNfaWQpOwogfQotdm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6U2F2ZVN0YXRlKCkKLXsKLQltX3BBZ2dEcml2ZXItPlNhdmVTdGF0ZSgpOwordm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6U2F2ZVN0YXRlKCkgeworICBtX3BBZ2dEcml2ZXItPlNhdmVTdGF0ZSgpOwogfQogCi12b2lkIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQotewotCW1fcEFnZ0RyaXZlci0+UmVzdG9yZVN0YXRlKGJLZWVwU2F2ZWQpOwordm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCkgeworICBtX3BBZ2dEcml2ZXItPlJlc3RvcmVTdGF0ZShiS2VlcFNhdmVkKTsKIH0KLXZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldENsaXBNYXNrKHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIpCi17Ci0JbV9wQWdnRHJpdmVyLT5TZXRDbGlwTWFzayhyYXN0ZXJpemVyKTsKK3ZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldENsaXBNYXNrKHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIpIHsKKyAgbV9wQWdnRHJpdmVyLT5TZXRDbGlwTWFzayhyYXN0ZXJpemVyKTsKIH0KLXZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldENsaXBNYXNrKFNrUGF0aCYgc2tQYXRoLCBTa1BhaW50KiBzcGFpbnQpCi17Ci0JU2tJUmVjdCBjbGlwX2JveDsKLQljbGlwX2JveC5zZXQoMCwgMCwgZml4MF90b184KEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLCBmaXgwX3RvXzgoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKLQljbGlwX2JveC5pbnRlcnNlY3QobV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLT5HZXRCb3goKS5sZWZ0LCBtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24tPkdldEJveCgpLnRvcCwKLQkJbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLT5HZXRCb3goKS5yaWdodCwgbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLT5HZXRCb3goKS5ib3R0b20pOwordm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0Q2xpcE1hc2soU2tQYXRoJiBza1BhdGgsIFNrUGFpbnQqIHNwYWludCkgeworICBTa0lSZWN0IGNsaXBfYm94OworICBjbGlwX2JveC5zZXQoMCwgMCwgZml4MF90b184KEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLAorICAgICAgICAgICAgICAgZml4MF90b184KEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7CisgIGNsaXBfYm94LmludGVyc2VjdChtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24tPkdldEJveCgpLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICBtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24tPkdldEJveCgpLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgIG1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbi0+R2V0Qm94KCkucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICBtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24tPkdldEJveCgpLmJvdHRvbSk7CiAKLQlTa1BhdGgqIHBhdGhQdHIgPSAmc2tQYXRoOworICBTa1BhdGgqIHBhdGhQdHIgPSAmc2tQYXRoOwogCi0JU2tSZWN0IHBhdGhfcmVjdCA9IHNrUGF0aC5nZXRCb3VuZHMoKTsKKyAgU2tSZWN0IHBhdGhfcmVjdCA9IHNrUGF0aC5nZXRCb3VuZHMoKTsKIAotCWNsaXBfYm94LmludGVyc2VjdChGWFNZU19mbG9vcihwYXRoX3JlY3QuZkxlZnQpLCBGWFNZU19mbG9vcihwYXRoX3JlY3QuZlRvcCksIEZYU1lTX2Zsb29yKHBhdGhfcmVjdC5mUmlnaHQpKzEsIEZYU1lTX2Zsb29yKHBhdGhfcmVjdC5mQm90dG9tKSsxKTsKLQlDRlhfRElCaXRtYXBSZWYgbWFzazsKLQlDRlhfRElCaXRtYXAqIHBUaGlzTGF5ZXIgPSBtYXNrLk5ldygpOwotCXBUaGlzTGF5ZXItPkNyZWF0ZShjbGlwX2JveC53aWR0aCgpLCBjbGlwX2JveC5oZWlnaHQoKSwgRlhESUJfOGJwcE1hc2spOwotCXBUaGlzTGF5ZXItPkNsZWFyKDApOworICBjbGlwX2JveC5pbnRlcnNlY3QoRlhTWVNfZmxvb3IocGF0aF9yZWN0LmZMZWZ0KSwgRlhTWVNfZmxvb3IocGF0aF9yZWN0LmZUb3ApLAorICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmxvb3IocGF0aF9yZWN0LmZSaWdodCkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmxvb3IocGF0aF9yZWN0LmZCb3R0b20pICsgMSk7CisgIENGWF9ESUJpdG1hcFJlZiBtYXNrOworICBDRlhfRElCaXRtYXAqIHBUaGlzTGF5ZXIgPSBtYXNrLk5ldygpOworICBwVGhpc0xheWVyLT5DcmVhdGUoY2xpcF9ib3gud2lkdGgoKSwgY2xpcF9ib3guaGVpZ2h0KCksIEZYRElCXzhicHBNYXNrKTsKKyAgcFRoaXNMYXllci0+Q2xlYXIoMCk7CiAKLQlDRlhfU2tpYUE4UmVuZGVyZXIgcmVuZGVyOwotCXJlbmRlci5Jbml0KHBUaGlzTGF5ZXIsIGNsaXBfYm94LmZMZWZ0LCBjbGlwX2JveC5mVG9wKTsKKyAgQ0ZYX1NraWFBOFJlbmRlcmVyIHJlbmRlcjsKKyAgcmVuZGVyLkluaXQocFRoaXNMYXllciwgY2xpcF9ib3guZkxlZnQsIGNsaXBfYm94LmZUb3ApOwogCi0JU2tSYXN0ZXJDbGlwIHJhc3RlckNsaXAoY2xpcF9ib3gpOwotCVN1cGVyQmxpdHRlcl9za2lhOjpEcmF3UGF0aChza1BhdGgsIChTa0JsaXR0ZXIqKSZyZW5kZXIsIHJhc3RlckNsaXAsICpzcGFpbnQpOworICBTa1Jhc3RlckNsaXAgcmFzdGVyQ2xpcChjbGlwX2JveCk7CisgIFN1cGVyQmxpdHRlcl9za2lhOjpEcmF3UGF0aChza1BhdGgsIChTa0JsaXR0ZXIqKSZyZW5kZXIsIHJhc3RlckNsaXAsICpzcGFpbnQpOwogCi0JLy8gRmluYWxseSwgd2UgaGF2ZSBnb3QgdGhlIG1hc2sgdGhhdCB3ZSBuZWVkLCBpbnRlcnNlY3Qgd2l0aCBjdXJyZW50IGNsaXAgcmVnaW9uCi0JbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLT5JbnRlcnNlY3RNYXNrRihjbGlwX2JveC5mTGVmdCwgY2xpcF9ib3guZlRvcCwgbWFzayk7Ci0KKyAgLy8gRmluYWxseSwgd2UgaGF2ZSBnb3QgdGhlIG1hc2sgdGhhdCB3ZSBuZWVkLCBpbnRlcnNlY3Qgd2l0aCBjdXJyZW50IGNsaXAKKyAgLy8gcmVnaW9uCisgIG1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbi0+SW50ZXJzZWN0TWFza0YoY2xpcF9ib3guZkxlZnQsIGNsaXBfYm94LmZUb3AsIG1hc2spOwogfQotRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCi0JCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwJLy8gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24KLQkJCQkJCWludCBmaWxsX21vZGUJLy8gZmlsbCBtb2RlLCBXSU5ESU5HIG9yIEFMVEVSTkFURQotCQkJCQkJKQotewotCWlmIChtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24gPT0gTlVMTCkKLQkJbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduID0gRlhfTkVXIENGWF9DbGlwUmduKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKTsKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoCisgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsICAgICAgICAgICAvLyBwYXRoIGluZm8KKyAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgIC8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCisgICAgaW50IGZpbGxfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxsIG1vZGUsIFdJTkRJTkcgb3IgQUxURVJOQVRFCisgICAgKSB7CisgIGlmIChtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24gPT0gTlVMTCkKKyAgICBtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24gPSBGWF9ORVcgQ0ZYX0NsaXBSZ24oCisgICAgICAgIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKTsKIAotCWlmIChwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSA1IHx8IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDQpIHsKLQkJQ0ZYX0Zsb2F0UmVjdCByZWN0ZjsKLQkJaWYgKHBQYXRoRGF0YS0+SXNSZWN0KHBPYmplY3QyRGV2aWNlLCAmcmVjdGYpKSB7Ci0JCQlyZWN0Zi5JbnRlcnNlY3QoQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAoRlhfRklYRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwgKEZYX0ZJWEZMT0FUKUdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7Ci0JCQlGWF9SRUNUIHJlY3QgPSByZWN0Zi5HZXRPdXR0ZXJSZWN0KCk7Ci0JCQltX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24tPkludGVyc2VjdFJlY3QocmVjdCk7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KLQlDU2tpYV9QYXRoRGF0YSBwYXRoX2RhdGE7Ci0JcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlKTsKLQlwYXRoX2RhdGEubV9QYXRoRGF0YS5jbG9zZSgpOwotCXBhdGhfZGF0YS5tX1BhdGhEYXRhLnNldEZpbGxUeXBlKChmaWxsX21vZGUmMykgPT0gRlhGSUxMX1dJTkRJTkc/IFNrUGF0aDo6a1dpbmRpbmdfRmlsbFR5cGU6U2tQYXRoOjprRXZlbk9kZF9GaWxsVHlwZSk7CisgIGlmIChwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSA1IHx8IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDQpIHsKKyAgICBDRlhfRmxvYXRSZWN0IHJlY3RmOworICAgIGlmIChwUGF0aERhdGEtPklzUmVjdChwT2JqZWN0MkRldmljZSwgJnJlY3RmKSkgeworICAgICAgcmVjdGYuSW50ZXJzZWN0KAorICAgICAgICAgIENGWF9GbG9hdFJlY3QoMCwgMCwgKEZYX0ZJWEZMT0FUKUdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksCisgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRklYRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKKyAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKKyAgICAgIG1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbi0+SW50ZXJzZWN0UmVjdChyZWN0KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBDU2tpYV9QYXRoRGF0YSBwYXRoX2RhdGE7CisgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7CisgIHBhdGhfZGF0YS5tX1BhdGhEYXRhLmNsb3NlKCk7CisgIHBhdGhfZGF0YS5tX1BhdGhEYXRhLnNldEZpbGxUeXBlKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTa1BhdGg6OmtXaW5kaW5nX0ZpbGxUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNrUGF0aDo6a0V2ZW5PZGRfRmlsbFR5cGUpOwogCi0JU2tQYWludCBzcGFpbnQ7Ci0Jc3BhaW50LnNldENvbG9yKDB4ZmZmZmZmZmYpOwotCXNwYWludC5zZXRBbnRpQWxpYXMoVFJVRSk7Ci0Jc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKKyAgU2tQYWludCBzcGFpbnQ7CisgIHNwYWludC5zZXRDb2xvcigweGZmZmZmZmZmKTsKKyAgc3BhaW50LnNldEFudGlBbGlhcyhUUlVFKTsKKyAgc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKIAotCVNldENsaXBNYXNrKHBhdGhfZGF0YS5tX1BhdGhEYXRhLCAmc3BhaW50KTsKKyAgU2V0Q2xpcE1hc2socGF0aF9kYXRhLm1fUGF0aERhdGEsICZzcGFpbnQpOwogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbwotCQkJCQkJY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCS8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCi0JCQkJCQljb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCS8vIGdyYXBoaWMgc3RhdGUsIGZvciBwZW4gYXR0cmlidXRlcwotCQkJCQkpCi17Ci0JaWYgKG1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbiA9PSBOVUxMKQotCQltX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24gPSBGWF9ORVcgQ0ZYX0NsaXBSZ24oR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKAorICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCAgICAgICAgICAgLy8gcGF0aCBpbmZvCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsICAvLyBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbgorICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUgIC8vIGdyYXBoaWMgc3RhdGUsIGZvciBwZW4gYXR0cmlidXRlcworICAgICkgeworICBpZiAobV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduID09IE5VTEwpCisgICAgbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduID0gRlhfTkVXIENGWF9DbGlwUmduKAorICAgICAgICBHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLCBHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSk7CiAKLQkvLyBidWlsZCBwYXRoIGRhdGEKLQlDU2tpYV9QYXRoRGF0YSBwYXRoX2RhdGE7Ci0JcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIE5VTEwpOwotCXBhdGhfZGF0YS5tX1BhdGhEYXRhLnNldEZpbGxUeXBlKFNrUGF0aDo6a1dpbmRpbmdfRmlsbFR5cGUpOworICAvLyBidWlsZCBwYXRoIGRhdGEKKyAgQ1NraWFfUGF0aERhdGEgcGF0aF9kYXRhOworICBwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgTlVMTCk7CisgIHBhdGhfZGF0YS5tX1BhdGhEYXRhLnNldEZpbGxUeXBlKFNrUGF0aDo6a1dpbmRpbmdfRmlsbFR5cGUpOwogCi0JU2tQYWludCBzcGFpbnQ7Ci0Jc3BhaW50LnNldENvbG9yKDB4ZmZmZmZmZmYpOwotCXNwYWludC5zZXRTdHlsZShTa1BhaW50OjprU3Ryb2tlX1N0eWxlKTsKLQlzcGFpbnQuc2V0QW50aUFsaWFzKFRSVUUpOworICBTa1BhaW50IHNwYWludDsKKyAgc3BhaW50LnNldENvbG9yKDB4ZmZmZmZmZmYpOworICBzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a1N0cm9rZV9TdHlsZSk7CisgIHNwYWludC5zZXRBbnRpQWxpYXMoVFJVRSk7CiAKLQlTa1BhdGggZHN0X3BhdGg7Ci0JU2tSYXN0ZXJpemVTdHJva2Uoc3BhaW50LCAmZHN0X3BhdGgsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUsIDEsIEZBTFNFLCAwKTsKLQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOwotCVNldENsaXBNYXNrKGRzdF9wYXRoLCAmc3BhaW50KTsKKyAgU2tQYXRoIGRzdF9wYXRoOworICBTa1Jhc3Rlcml6ZVN0cm9rZShzcGFpbnQsICZkc3RfcGF0aCwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBwR3JhcGhTdGF0ZSwgMSwgRkFMU0UsIDApOworICBzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOworICBTZXRDbGlwTWFzayhkc3RfcGF0aCwgJnNwYWludCk7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCi0JCQkJCQkJCQkJCSAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0JcmV0dXJuIG1fcEFnZ0RyaXZlci0+UmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyLCBjb2xvciwgYkZ1bGxDb3ZlciwgYkdyb3VwS25vY2tvdXQsYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CitGWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpSZW5kZXJSYXN0ZXJpemVyKAorICAgIHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsCisgICAgRlhfRFdPUkQgY29sb3IsCisgICAgRlhfQk9PTCBiRnVsbENvdmVyLAorICAgIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCisgICAgaW50IGFscGhhX2ZsYWcsCisgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICByZXR1cm4gbV9wQWdnRHJpdmVyLT5SZW5kZXJSYXN0ZXJpemVyKAorICAgICAgcmFzdGVyaXplciwgY29sb3IsIGJGdWxsQ292ZXIsIGJHcm91cEtub2Nrb3V0LCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KLUZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXJTa2lhKFNrUGF0aCYgc2tQYXRoLCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQsIFNrSVJlY3QmIHJlY3QsIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCi0JCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIEZYX0JPT0wgYkZpbGwpCi17Ci0JQ0ZYX0RJQml0bWFwKiBwdCA9IGJHcm91cEtub2Nrb3V0P21fcEFnZ0RyaXZlci0+R2V0QmFja0Ryb3AoKTpOVUxMOwotCUNGWF9Ta2lhUmVuZGVyZXIgcmVuZGVyOwotCWlmICghcmVuZGVyLkluaXQobV9wQWdnRHJpdmVyLT5tX3BCaXRtYXAsIHB0LCBtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24sIGNvbG9yLCBiRnVsbENvdmVyLCBtX3BBZ2dEcml2ZXItPm1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpCi0JCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXJTa2lhKFNrUGF0aCYgc2tQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tQYWludCYgb3JpZ1BhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tJUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRnVsbENvdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiR3JvdXBLbm9ja291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbGwpIHsKKyAgQ0ZYX0RJQml0bWFwKiBwdCA9IGJHcm91cEtub2Nrb3V0ID8gbV9wQWdnRHJpdmVyLT5HZXRCYWNrRHJvcCgpIDogTlVMTDsKKyAgQ0ZYX1NraWFSZW5kZXJlciByZW5kZXI7CisgIGlmICghcmVuZGVyLkluaXQobV9wQWdnRHJpdmVyLT5tX3BCaXRtYXAsIHB0LCBtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24sIGNvbG9yLAorICAgICAgICAgICAgICAgICAgIGJGdWxsQ292ZXIsIG1fcEFnZ0RyaXZlci0+bV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pKQorICAgIHJldHVybiBGQUxTRTsKIAotCVNrUmFzdGVyQ2xpcCByYXN0ZXJDbGlwKHJlY3QpOwotCVN1cGVyQmxpdHRlcl9za2lhOjpEcmF3UGF0aChza1BhdGgsIChTa0JsaXR0ZXIqKSZyZW5kZXIsICByYXN0ZXJDbGlwLCBvcmlnUGFpbnQpOworICBTa1Jhc3RlckNsaXAgcmFzdGVyQ2xpcChyZWN0KTsKKyAgU3VwZXJCbGl0dGVyX3NraWE6OkRyYXdQYXRoKHNrUGF0aCwgKFNrQmxpdHRlciopJnJlbmRlciwgcmFzdGVyQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdQYWludCk7CiAKLQlyZXR1cm4gVFJVRTsKLQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbwotCQkJCQkJY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCS8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCi0JCQkJCQljb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAkvLyBncmFwaGljIHN0YXRlLCBmb3IgcGVuIGF0dHJpYnV0ZXMKLQkJCQkJCUZYX0RXT1JEIGZpbGxfY29sb3IsCQkJLy8gZmlsbCBjb2xvcgotCQkJCQkJRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLAkJCS8vIHN0cm9rZSBjb2xvcgotCQkJCQkJaW50IGZpbGxfbW9kZSwJCQkJCS8vIGZpbGwgbW9kZSwgV0lORElORyBvciBBTFRFUk5BVEUuIDAgZm9yIG5vdCBmaWxsZWQKLQkJCQkJCWludCBhbHBoYV9mbGFnLAotCQkJCQkJdm9pZCogcEljY1RyYW5zZm9ybQotCQkJCQkJKQotewotCWlmIChHZXRCdWZmZXIoKSA9PSBOVUxMKSByZXR1cm4gVFJVRTsKLQlGT1hJVF9ERUJVRzEoIkNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpEcmF3UGF0aDogZW50ZXJpbmciKTsKLQlTa0lSZWN0IHJlY3Q7Ci0JcmVjdC5zZXQoMCwgMCwgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpOwotCWlmICgoZmlsbF9tb2RlICYgMykgJiYgZmlsbF9jb2xvcikgewotCQkvLyBXZSBoYXZlIHRvIHRyYW5zZm9ybSBiZWZvcmUgYnVpbGRpbmcgcGF0aCBkYXRhLCBvdGhlcndpc2Ugd2UnbGwgaGF2ZSBmbGF0dGluZyBwcm9ibGVtCi0JCS8vIHdoZW4gd2UgZW5sYXJnZSBhIHNtYWxsIHBhdGggKGZsYXR0ZW4gYmVmb3JlIHRyYW5zZm9ybWVkKQotCQkvLyBURVNURE9DOiBCdWcgIzUxMTUgLSBEU19TMURpbXBhY3RfbHIucGRmCi0JCS8vIGJ1aWxkIHBhdGggZGF0YQotCQlDU2tpYV9QYXRoRGF0YSBwYXRoX2RhdGE7Ci0JCXBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7Ci0JCS8vcGF0aF9kYXRhLm1fUGF0aERhdGEuY2xvc2UoKTsKLQkJcGF0aF9kYXRhLm1fUGF0aERhdGEuc2V0RmlsbFR5cGUoKGZpbGxfbW9kZSYzKSA9PSBGWEZJTExfV0lORElORz8gU2tQYXRoOjprV2luZGluZ19GaWxsVHlwZTpTa1BhdGg6OmtFdmVuT2RkX0ZpbGxUeXBlKTsKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkRyYXdQYXRoKAorICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCAgICAgICAgICAgLy8gcGF0aCBpbmZvCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsICAvLyBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbgorICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsICAvLyBncmFwaGljIHN0YXRlLCBmb3IgcGVuIGF0dHJpYnV0ZXMKKyAgICBGWF9EV09SRCBmaWxsX2NvbG9yLCAgICAgICAgICAgICAgICAgICAgLy8gZmlsbCBjb2xvcgorICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwgICAgICAgICAgICAgICAgICAvLyBzdHJva2UgY29sb3IKKyAgICBpbnQgZmlsbF9tb2RlLCAgLy8gZmlsbCBtb2RlLCBXSU5ESU5HIG9yIEFMVEVSTkFURS4gMCBmb3Igbm90IGZpbGxlZAorICAgIGludCBhbHBoYV9mbGFnLAorICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKEdldEJ1ZmZlcigpID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisgIEZPWElUX0RFQlVHMSgiQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkRyYXdQYXRoOiBlbnRlcmluZyIpOworICBTa0lSZWN0IHJlY3Q7CisgIHJlY3Quc2V0KDAsIDAsIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksCisgICAgICAgICAgIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKTsKKyAgaWYgKChmaWxsX21vZGUgJiAzKSAmJiBmaWxsX2NvbG9yKSB7CisgICAgLy8gV2UgaGF2ZSB0byB0cmFuc2Zvcm0gYmVmb3JlIGJ1aWxkaW5nIHBhdGggZGF0YSwgb3RoZXJ3aXNlIHdlJ2xsIGhhdmUKKyAgICAvLyBmbGF0dGluZyBwcm9ibGVtCisgICAgLy8gd2hlbiB3ZSBlbmxhcmdlIGEgc21hbGwgcGF0aCAoZmxhdHRlbiBiZWZvcmUgdHJhbnNmb3JtZWQpCisgICAgLy8gVEVTVERPQzogQnVnICM1MTE1IC0gRFNfUzFEaW1wYWN0X2xyLnBkZgorICAgIC8vIGJ1aWxkIHBhdGggZGF0YQorICAgIENTa2lhX1BhdGhEYXRhIHBhdGhfZGF0YTsKKyAgICBwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UpOworICAgIC8vIHBhdGhfZGF0YS5tX1BhdGhEYXRhLmNsb3NlKCk7CisgICAgcGF0aF9kYXRhLm1fUGF0aERhdGEuc2V0RmlsbFR5cGUoKGZpbGxfbW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU2tQYXRoOjprV2luZGluZ19GaWxsVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNrUGF0aDo6a0V2ZW5PZGRfRmlsbFR5cGUpOwogCi0JCVNrUGFpbnQgc3BhaW50OwotCQlzcGFpbnQuc2V0QW50aUFsaWFzKFRSVUUpOwotCQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOwotCQlzcGFpbnQuc2V0Q29sb3IoZmlsbF9jb2xvcik7Ci0JCWlmICghUmVuZGVyUmFzdGVyaXplclNraWEocGF0aF9kYXRhLm1fUGF0aERhdGEsIHNwYWludCwgcmVjdCwgZmlsbF9jb2xvciwgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgRkFMU0UsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKQotCQkJcmV0dXJuIEZBTFNFOwotCX0KKyAgICBTa1BhaW50IHNwYWludDsKKyAgICBzcGFpbnQuc2V0QW50aUFsaWFzKFRSVUUpOworICAgIHNwYWludC5zZXRTdHlsZShTa1BhaW50OjprRmlsbF9TdHlsZSk7CisgICAgc3BhaW50LnNldENvbG9yKGZpbGxfY29sb3IpOworICAgIGlmICghUmVuZGVyUmFzdGVyaXplclNraWEocGF0aF9kYXRhLm1fUGF0aERhdGEsIHNwYWludCwgcmVjdCwgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIEZBTFNFLCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCWludCBzdHJva2VfYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKHN0cm9rZV9jb2xvcik7CisgIGludCBzdHJva2VfYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWEFSR0JfQShzdHJva2VfY29sb3IpOwogCi0JaWYgKHBHcmFwaFN0YXRlICYmIHN0cm9rZV9hbHBoYSkgewotCQkvLyBXZSBzcGxpdCB0aGUgbWF0cml4IGludG8gdHdvIHBhcnRzOiBmaXJzdCBwYXJ0IGRvaW5nIHRoZSBzY2FsaW5nLCBzbyB3ZSB3b24ndCBoYXZlIHRoZQotCQkvLyBmbGF0bmVzcyBwcm9ibGVtLCBzZWNvbmQgcGFydCBkb2luZyB0aGUgdHJhbnNmb3JtYXRpb24sIHNvIHdlIGRvbid0IGhhdmUgc3Ryb2tpbmcgZ2VvIHByb2JsZW0uCi0JCS8vIFRFU1RET0M6IEJ1ZyAjNTI1MyAtIHRlc3RbMV0ucGRmCi0JCUNGWF9BZmZpbmVNYXRyaXggbWF0cml4MSwgbWF0cml4MjsKLQkJaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0JCQltYXRyaXgxLmEgPSBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5hKSA+IEZYU1lTX2ZhYnMocE9iamVjdDJEZXZpY2UtPmIpID8KLQkJCQkJRlhTWVNfZmFicyhwT2JqZWN0MkRldmljZS0+YSkgOiBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5iKTsKLQkJCW1hdHJpeDEuZCA9IG1hdHJpeDEuYTsvL0ZYU1lTX2ZhYnMocE9iamVjdDJEZXZpY2UtPmMpID4gRlhTWVNfZmFicyhwT2JqZWN0MkRldmljZS0+ZCkgPwotCQkJCQkvL3BPYmplY3QyRGV2aWNlLT5jIDogcE9iamVjdDJEZXZpY2UtPmQ7Ci0JCQltYXRyaXgyLlNldChwT2JqZWN0MkRldmljZS0+YS9tYXRyaXgxLmEsIHBPYmplY3QyRGV2aWNlLT5iL21hdHJpeDEuYSwKLQkJCQkJcE9iamVjdDJEZXZpY2UtPmMvbWF0cml4MS5kLCBwT2JqZWN0MkRldmljZS0+ZC9tYXRyaXgxLmQsCi0JCQkJCXBPYmplY3QyRGV2aWNlLT5lLCBwT2JqZWN0MkRldmljZS0+Zik7Ci0JCX0KLQkJLy8gYnVpbGQgcGF0aCBkYXRhCi0JCUNTa2lhX1BhdGhEYXRhIHBhdGhfZGF0YTsKLQkJcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsICZtYXRyaXgxKTsKLQkJcGF0aF9kYXRhLm1fUGF0aERhdGEuc2V0RmlsbFR5cGUoU2tQYXRoOjprV2luZGluZ19GaWxsVHlwZSk7CisgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYWxwaGEpIHsKKyAgICAvLyBXZSBzcGxpdCB0aGUgbWF0cml4IGludG8gdHdvIHBhcnRzOiBmaXJzdCBwYXJ0IGRvaW5nIHRoZSBzY2FsaW5nLCBzbyB3ZQorICAgIC8vIHdvbid0IGhhdmUgdGhlCisgICAgLy8gZmxhdG5lc3MgcHJvYmxlbSwgc2Vjb25kIHBhcnQgZG9pbmcgdGhlIHRyYW5zZm9ybWF0aW9uLCBzbyB3ZSBkb24ndCBoYXZlCisgICAgLy8gc3Ryb2tpbmcgZ2VvIHByb2JsZW0uCisgICAgLy8gVEVTVERPQzogQnVnICM1MjUzIC0gdGVzdFsxXS5wZGYKKyAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDEsIG1hdHJpeDI7CisgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICBtYXRyaXgxLmEgPSBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5hKSA+IEZYU1lTX2ZhYnMocE9iamVjdDJEZXZpY2UtPmIpCisgICAgICAgICAgICAgICAgICAgICAgPyBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5hKQorICAgICAgICAgICAgICAgICAgICAgIDogRlhTWVNfZmFicyhwT2JqZWN0MkRldmljZS0+Yik7CisgICAgICBtYXRyaXgxLmQgPSBtYXRyaXgxLmE7ICAvLyBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5jKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5kKSA/CisgICAgICAvLyBwT2JqZWN0MkRldmljZS0+YyA6IHBPYmplY3QyRGV2aWNlLT5kOworICAgICAgbWF0cml4Mi5TZXQocE9iamVjdDJEZXZpY2UtPmEgLyBtYXRyaXgxLmEsIHBPYmplY3QyRGV2aWNlLT5iIC8gbWF0cml4MS5hLAorICAgICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPmMgLyBtYXRyaXgxLmQsIHBPYmplY3QyRGV2aWNlLT5kIC8gbWF0cml4MS5kLAorICAgICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPmUsIHBPYmplY3QyRGV2aWNlLT5mKTsKKyAgICB9CisgICAgLy8gYnVpbGQgcGF0aCBkYXRhCisgICAgQ1NraWFfUGF0aERhdGEgcGF0aF9kYXRhOworICAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCAmbWF0cml4MSk7CisgICAgcGF0aF9kYXRhLm1fUGF0aERhdGEuc2V0RmlsbFR5cGUoU2tQYXRoOjprV2luZGluZ19GaWxsVHlwZSk7CiAKLQkJU2tQYWludCBzcGFpbnQ7Ci0JCXNwYWludC5zZXRDb2xvcihzdHJva2VfY29sb3IpOwotCQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a1N0cm9rZV9TdHlsZSk7Ci0JCXNwYWludC5zZXRBbnRpQWxpYXMoVFJVRSk7Ci0JCVNrUGF0aCBkc3RfcGF0aDsKLQkJU2tSYXN0ZXJpemVTdHJva2Uoc3BhaW50LCAmZHN0X3BhdGgsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCAmbWF0cml4MiwgcEdyYXBoU3RhdGUsIG1hdHJpeDEuYSwgRkFMU0UsIDApOwotCQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOwotCQlpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTw8OCB8IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZyk7CisgICAgU2tQYWludCBzcGFpbnQ7CisgICAgc3BhaW50LnNldENvbG9yKHN0cm9rZV9jb2xvcik7CisgICAgc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtTdHJva2VfU3R5bGUpOworICAgIHNwYWludC5zZXRBbnRpQWxpYXMoVFJVRSk7CisgICAgU2tQYXRoIGRzdF9wYXRoOworICAgIFNrUmFzdGVyaXplU3Ryb2tlKHNwYWludCwgJmRzdF9wYXRoLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgJm1hdHJpeDIsCisgICAgICAgICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUsIG1hdHJpeDEuYSwgRkFMU0UsIDApOworICAgIHNwYWludC5zZXRTdHlsZShTa1BhaW50OjprRmlsbF9TdHlsZSk7CisgICAgaW50IGZpbGxfZmxhZyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPDwgOCB8CisgICAgICAgICAgICAgICAgICAgIEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZyk7CiAKLQkJaWYgKCFSZW5kZXJSYXN0ZXJpemVyU2tpYShkc3RfcGF0aCwgc3BhaW50LCByZWN0LCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIEZBTFNFLCBmaWxsX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIEZBTFNFKSkKLQkJCXJldHVybiBGQUxTRTsKKyAgICBpZiAoIVJlbmRlclJhc3Rlcml6ZXJTa2lhKGRzdF9wYXRoLCBzcGFpbnQsIHJlY3QsIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIEZBTFNFLCBmaWxsX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtLCBGQUxTRSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCX0KLQotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKLQkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotCXJldHVybiBtX3BBZ2dEcml2ZXItPlNldFBpeGVsKHgsIHksIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldFBpeGVsKGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICByZXR1cm4gbV9wQWdnRHJpdmVyLT5TZXRQaXhlbCh4LCB5LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9CiAKLUZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLQlyZXR1cm4gbV9wQWdnRHJpdmVyLT5GaWxsUmVjdChwUmVjdCwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CitGWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgcmV0dXJuIG1fcEFnZ0RyaXZlci0+RmlsbFJlY3QocFJlY3QsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KQotewotCXJldHVybiBtX3BBZ2dEcml2ZXItPkdldENsaXBCb3gocFJlY3QpOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkgeworICByZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXRDbGlwQm94KHBSZWN0KTsKIH0KIAotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIEZYX0JPT0wgYkRFZGdlKQotewotCXJldHVybiBtX3BBZ2dEcml2ZXItPkdldERJQml0cyhwQml0bWFwLCBsZWZ0LCB0b3AsIHBJY2NUcmFuc2Zvcm0sIGJERWRnZSk7CitGWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJERWRnZSkgeworICByZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXRESUJpdHMocEJpdG1hcCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtLCBiREVkZ2UpOwogfQogCi1GWF9CT09MCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgYXJnYiwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKLQkJCQkJCQkJCSAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotCXJldHVybiBtX3BBZ2dEcml2ZXItPlNldERJQml0cyhwQml0bWFwLCBhcmdiLCBwU3JjUmVjdCwgbGVmdCwgdG9wLCBibGVuZF90eXBlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIHJldHVybiBtX3BBZ2dEcml2ZXItPlNldERJQml0cyhwQml0bWFwLCBhcmdiLCBwU3JjUmVjdCwgbGVmdCwgdG9wLCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9CiAKLUZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgYXJnYiwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotCQkJCQkJCWludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCi0JCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0JcmV0dXJuIG1fcEFnZ0RyaXZlci0+U3RyZXRjaERJQml0cyhwU291cmNlLCBhcmdiLCBkZXN0X2xlZnQsIGRlc3RfdG9wLAotCQkJCQkJCWRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBwQ2xpcFJlY3QsIGZsYWdzLAotCQkJCQkJCWFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIHJldHVybiBtX3BBZ2dEcml2ZXItPlN0cmV0Y2hESUJpdHMocFNvdXJjZSwgYXJnYiwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcENsaXBSZWN0LCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KIAotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgYXJnYiwKLQkJCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgdm9pZComIGhhbmRsZSwKLQkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotCXJldHVybiBtX3BBZ2dEcml2ZXItPlN0YXJ0RElCaXRzKHBTb3VyY2UsIGJpdG1hcF9hbHBoYSwgYXJnYiwKLQkJCQkJCXBNYXRyaXgsIHJlbmRlcl9mbGFncywgaGFuZGxlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByZW5kZXJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIHJldHVybiBtX3BBZ2dEcml2ZXItPlN0YXJ0RElCaXRzKHBTb3VyY2UsIGJpdG1hcF9hbHBoYSwgYXJnYiwgcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyX2ZsYWdzLCBoYW5kbGUsIGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pOwogfQogCi1GWF9CT09MCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpDb250aW51ZURJQml0cyh2b2lkKiBwSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLQlyZXR1cm4gbV9wQWdnRHJpdmVyLT5Db250aW51ZURJQml0cyhwSGFuZGxlLCBwUGF1c2UpOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6Q29udGludWVESUJpdHModm9pZCogcEhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgcmV0dXJuIG1fcEFnZ0RyaXZlci0+Q29udGludWVESUJpdHMocEhhbmRsZSwgcFBhdXNlKTsKIH0KIAotdm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6Q2FuY2VsRElCaXRzKHZvaWQqIHBIYW5kbGUpCi17Ci0JbV9wQWdnRHJpdmVyLT5DYW5jZWxESUJpdHMocEhhbmRsZSk7Cit2b2lkIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpDYW5jZWxESUJpdHModm9pZCogcEhhbmRsZSkgeworICBtX3BBZ2dEcml2ZXItPkNhbmNlbERJQml0cyhwSGFuZGxlKTsKIH0KIAotQ0ZYX1NraWFEZXZpY2U6OkNGWF9Ta2lhRGV2aWNlKCkKLXsKLQltX2JPd25lZEJpdG1hcCA9IEZBTFNFOworQ0ZYX1NraWFEZXZpY2U6OkNGWF9Ta2lhRGV2aWNlKCkgeworICBtX2JPd25lZEJpdG1hcCA9IEZBTFNFOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlOjpBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQotewotCWlmIChwQml0bWFwID09IE5VTEwpCi0JCXJldHVybiBGQUxTRTsKLQlTZXRCaXRtYXAocEJpdG1hcCk7Ci0JQ0ZYX1NraWFEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBGWF9ORVcgQ0ZYX1NraWFEZXZpY2VEcml2ZXIocEJpdG1hcCwgZGl0aGVyX2JpdHMsIGJSZ2JCeXRlT3JkZXIsIHBPcmlEZXZpY2UsIGJHcm91cEtub2Nrb3V0KTsKLQlTZXREZXZpY2VEcml2ZXIocERyaXZlcik7Ci0JcmV0dXJuIFRSVUU7CitGWF9CT09MIENGWF9Ta2lhRGV2aWNlOjpBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXRoZXJfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpIHsKKyAgaWYgKHBCaXRtYXAgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIFNldEJpdG1hcChwQml0bWFwKTsKKyAgQ0ZYX1NraWFEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBGWF9ORVcgQ0ZYX1NraWFEZXZpY2VEcml2ZXIoCisgICAgICBwQml0bWFwLCBkaXRoZXJfYml0cywgYlJnYkJ5dGVPcmRlciwgcE9yaURldmljZSwgYkdyb3VwS25vY2tvdXQpOworICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlOjpDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBpbnQgZGl0aGVyX2JpdHMsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSkKLXsKLQltX2JPd25lZEJpdG1hcCA9IFRSVUU7Ci0JQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKLQlpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKSB7Ci0JCWRlbGV0ZSBwQml0bWFwOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCVNldEJpdG1hcChwQml0bWFwKTsKLQlDRlhfU2tpYURldmljZURyaXZlciogcERyaXZlciA9ICBGWF9ORVcgQ0ZYX1NraWFEZXZpY2VEcml2ZXIocEJpdG1hcCwgZGl0aGVyX2JpdHMsIEZBTFNFLCBwT3JpRGV2aWNlLCBGQUxTRSk7Ci0JU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOwotCXJldHVybiBUUlVFOworRlhfQk9PTCBDRlhfU2tpYURldmljZTo6Q3JlYXRlKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpdGhlcl9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSkgeworICBtX2JPd25lZEJpdG1hcCA9IFRSVUU7CisgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7CisgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpIHsKKyAgICBkZWxldGUgcEJpdG1hcDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgU2V0Qml0bWFwKHBCaXRtYXApOworICBDRlhfU2tpYURldmljZURyaXZlciogcERyaXZlciA9IEZYX05FVyBDRlhfU2tpYURldmljZURyaXZlcigKKyAgICAgIHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBGQUxTRSwgcE9yaURldmljZSwgRkFMU0UpOworICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7CisgIHJldHVybiBUUlVFOwogfQotQ0ZYX1NraWFEZXZpY2U6On5DRlhfU2tpYURldmljZSgpCi17Ci0JaWYgKG1fYk93bmVkQml0bWFwICYmIEdldEJpdG1hcCgpKSBkZWxldGUgR2V0Qml0bWFwKCk7CitDRlhfU2tpYURldmljZTo6fkNGWF9Ta2lhRGV2aWNlKCkgeworICBpZiAobV9iT3duZWRCaXRtYXAgJiYgR2V0Qml0bWFwKCkpCisgICAgZGVsZXRlIEdldEJpdG1hcCgpOwogfQogCiAjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuaCBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oCmluZGV4IGFiNTFlNTEuLjFkZTgyOWIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oCkBAIC02LDg1ICs2LDE0MSBAQAogI2RlZmluZSBDT1JFX1NSQ19GWEdFX1NLSUFfRlhfU0tJQV9ERVZJQ0VfSF8KIAogI2lmIGRlZmluZWQoX1NLSUFfU1VQUE9SVF8pCi1jbGFzcyBDRlhfU2tpYURldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyCi17Ci1wdWJsaWM6Ci0JQ0ZYX1NraWFEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KTsKLQl2aXJ0dWFsIH5DRlhfU2tpYURldmljZURyaXZlcigpOworY2xhc3MgQ0ZYX1NraWFEZXZpY2VEcml2ZXIgOiBwdWJsaWMgSUZYX1JlbmRlckRldmljZURyaXZlciB7CisgcHVibGljOgorICBDRlhfU2tpYURldmljZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXRoZXJfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpOworICB2aXJ0dWFsIH5DRlhfU2tpYURldmljZURyaXZlcigpOwogCi0JLyoqIE9wdGlvbnMgKi8KLQl2aXJ0dWFsIGludAkJCUdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOworICAvKiogT3B0aW9ucyAqLworICB2aXJ0dWFsIGludCBHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKTsKIAotCS8qKiBTYXZlIGFuZCByZXN0b3JlIGFsbCBncmFwaGljIHN0YXRlcyAqLwotCXZpcnR1YWwgdm9pZAkJU2F2ZVN0YXRlKCk7Ci0JdmlydHVhbCB2b2lkCQlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKTsKKyAgLyoqIFNhdmUgYW5kIHJlc3RvcmUgYWxsIGdyYXBoaWMgc3RhdGVzICovCisgIHZpcnR1YWwgdm9pZCBTYXZlU3RhdGUoKTsKKyAgdmlydHVhbCB2b2lkIFJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpOwogCi0JLyoqIFNldCBjbGlwcGluZyBwYXRoIHVzaW5nIGZpbGxlZCByZWdpb24gKi8KLQl2aXJ0dWFsIEZYX0JPT0wJCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbwotCQkJCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAkvLyBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbgotCQkJCQkJCWludCBmaWxsX21vZGUJLy8gZmlsbCBtb2RlLCBXSU5ESU5HIG9yIEFMVEVSTkFURQotCQkJCQkJCSk7CisgIC8qKiBTZXQgY2xpcHBpbmcgcGF0aCB1c2luZyBmaWxsZWQgcmVnaW9uICovCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwX1BhdGhGaWxsKAorICAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsICAgICAgICAgICAvLyBwYXRoIGluZm8KKyAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCAgLy8gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24KKyAgICAgIGludCBmaWxsX21vZGUgIC8vIGZpbGwgbW9kZSwgV0lORElORyBvciBBTFRFUk5BVEUKKyAgICAgICk7CiAKLQkvKiogU2V0IGNsaXBwaW5nIHBhdGggdXNpbmcgc3Ryb2tlZCByZWdpb24gKi8KLQl2aXJ0dWFsIEZYX0JPT0wJCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCi0JCQkJCQkJY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCS8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCi0JCQkJCQkJY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQkvLyBncmFwaGljIHN0YXRlLCBmb3IgcGVuIGF0dHJpYnV0ZXMKLQkJCQkJCQkpOworICAvKiogU2V0IGNsaXBwaW5nIHBhdGggdXNpbmcgc3Ryb2tlZCByZWdpb24gKi8KKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBfUGF0aFN0cm9rZSgKKyAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCAgICAgICAgICAgLy8gcGF0aCBpbmZvCisgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgIC8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCisgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqCisgICAgICAgICAgcEdyYXBoU3RhdGUgIC8vIGdyYXBoaWMgc3RhdGUsIGZvciBwZW4gYXR0cmlidXRlcworICAgICAgKTsKIAotCS8qKiBEcmF3IGEgcGF0aCAqLwotCXZpcnR1YWwgRlhfQk9PTAkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0JCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLQkJCQkJCWNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0JCQkJCQlGWF9EV09SRCBmaWxsX2NvbG9yLAotCQkJCQkJRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLAotCQkJCQkJaW50IGZpbGxfbW9kZSwKLQkJCQkJCWludCBhbHBoYV9mbGFnID0gMCwKLQkJCQkJCXZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMCi0JCQkJCQkJKTsKKyAgLyoqIERyYXcgYSBwYXRoICovCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0JdmlydHVhbCBGWF9CT09MCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAotCQkJCQkJaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIHZpcnR1YWwgRlhfQk9PTCBTZXRQaXhlbChpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCUZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LCBGWF9EV09SRCBmaWxsX2NvbG9yLAotCQkJCQkJaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLQkvKiogRHJhdyBhIHNpbmdsZSBwaXhlbCAoZGV2aWNlIGRlcGVuZGFudCkgbGluZSAqLwotCXZpcnR1YWwgRlhfQk9PTAkJRHJhd0Nvc21ldGljTGluZShGWF9GSVhGTE9BVCB4MSwgRlhfRklYRkxPQVQgeTEsIEZYX0ZJWEZMT0FUIHgyLCBGWF9GSVhGTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCi0JCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKSB7IHJldHVybiBGQUxTRTsgfQorICAvKiogRHJhdyBhIHNpbmdsZSBwaXhlbCAoZGV2aWNlIGRlcGVuZGFudCkgbGluZSAqLworICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0Nvc21ldGljTGluZShGWF9GSVhGTE9BVCB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklYRkxPQVQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJWEZMT0FUIHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSVhGTE9BVCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JdmlydHVhbCBGWF9CT09MCQlHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKKyAgdmlydHVhbCBGWF9CT09MIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOwogCi0JLyoqIExvYWQgZGV2aWNlIGJ1ZmZlciBpbnRvIGEgRElCICovCi0JdmlydHVhbCBGWF9CT09MCQlHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpOworICAvKiogTG9hZCBkZXZpY2UgYnVmZmVyIGludG8gYSBESUIgKi8KKyAgdmlydHVhbCBGWF9CT09MIEdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJERWRnZSA9IEZBTFNFKTsKIAotCXZpcnR1YWwgQ0ZYX0RJQml0bWFwKiAgIEdldEJhY2tEcm9wKCkgeyByZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXRCYWNrRHJvcCgpOyB9CisgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRCYWNrRHJvcCgpIHsgcmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0QmFja0Ryb3AoKTsgfQogCi0JdmlydHVhbCBGWF9CT09MCQlTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAotCQkJCQkJaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgYmxlbmRfdHlwZSwKLQkJCQkJCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwotCXZpcnR1YWwgRlhfQk9PTAkJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotCQkJCWludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCi0JCQkJaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIHZpcnR1YWwgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICB2aXJ0dWFsIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCi0JCQkJY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCi0JCQkJaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7Ci0JdmlydHVhbCBGWF9CT09MCQlDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKLQl2aXJ0dWFsIHZvaWQJCUNhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpOworICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIHZpcnR1YWwgRlhfQk9PTCBDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgdmlydHVhbCB2b2lkIENhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpOwogCi0JdmlydHVhbCBGWF9CT09MICAgICBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKLQkJCQkJCUNGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZJWEZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCi0JCQkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgdmlydHVhbCBGWF9CT09MIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJWEZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0JdmlydHVhbCBGWF9CT09MCQlSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCi0JCQkJCQkJaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwotCXZpcnR1YWwgRlhfQk9PTAkJUmVuZGVyUmFzdGVyaXplclNraWEoU2tQYXRoJiBza1BhdGgsIGNvbnN0IFNrUGFpbnQmIG9yaWdQYWludCwgU2tJUmVjdCYgcmVjdCwgRlhfRFdPUkQgY29sb3IsIEZYX0JPT0wgYkZ1bGxDb3ZlciwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCwKLQkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgRlhfQk9PTCBiRmlsbCA9IFRSVUUpOwotCXZvaWQJCQkJU2V0Q2xpcE1hc2socmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplcik7Ci0Jdm9pZAkJCQlTZXRDbGlwTWFzayhTa1BhdGgmIHNrUGF0aCwgU2tQYWludCogc3BhaW50KTsKLQl2aXJ0dWFsCXVpbnQ4X3QqCUdldEJ1ZmZlcigpIGNvbnN0IHtyZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXRCdWZmZXIoKTt9CisgIHZpcnR1YWwgRlhfQk9PTCBSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGdWxsQ292ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKKyAgdmlydHVhbCBGWF9CT09MIFJlbmRlclJhc3Rlcml6ZXJTa2lhKFNrUGF0aCYgc2tQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tQYWludCYgb3JpZ1BhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tJUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRnVsbENvdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiR3JvdXBLbm9ja291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbGwgPSBUUlVFKTsKKyAgdm9pZCBTZXRDbGlwTWFzayhyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyKTsKKyAgdm9pZCBTZXRDbGlwTWFzayhTa1BhdGgmIHNrUGF0aCwgU2tQYWludCogc3BhaW50KTsKKyAgdmlydHVhbCB1aW50OF90KiBHZXRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX3BBZ2dEcml2ZXItPkdldEJ1ZmZlcigpOyB9CiAKLQlDRlhfQWdnRGV2aWNlRHJpdmVyKiBtX3BBZ2dEcml2ZXI7CisgIENGWF9BZ2dEZXZpY2VEcml2ZXIqIG1fcEFnZ0RyaXZlcjsKIH07CiAjZW5kaWYgIC8vIGRlZmluZWQoX1NLSUFfU1VQUE9SVF8pCiAKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZHdyaXRlX2ludC5oIGIvY29yZS9zcmMvZnhnZS93aW4zMi9kd3JpdGVfaW50LmgKaW5kZXggZGMyYTMzOC4uYTJjOTFjZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS93aW4zMi9kd3JpdGVfaW50LmgKKysrIGIvY29yZS9zcmMvZnhnZS93aW4zMi9kd3JpdGVfaW50LmgKQEAgLTgsNTQgKzgsNTkgQEAKICNkZWZpbmUgQ09SRV9TUkNfRlhHRV9XSU4zMl9EV1JJVEVfSU5UX0hfCiAKICNpZm5kZWYgREVDTFNQRUNfVVVJRAotI2lmIChfTVNDX1ZFUiA+PSAxMTAwKSAmJiBkZWZpbmVkIChfX2NwbHVzcGx1cykKLSNkZWZpbmUgREVDTFNQRUNfVVVJRCh4KSAgICBfX2RlY2xzcGVjKHV1aWQoeCkpCisjaWYgKF9NU0NfVkVSID49IDExMDApICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIERFQ0xTUEVDX1VVSUQoeCkgX19kZWNsc3BlYyh1dWlkKHgpKQogI2Vsc2UKICNkZWZpbmUgREVDTFNQRUNfVVVJRCh4KQogI2VuZGlmCiAjZW5kaWYKICNpZm5kZWYgREVDTFNQRUNfTk9WVEFCTEUKICNpZiAoX01TQ19WRVIgPj0gMTEwMCkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSNkZWZpbmUgREVDTFNQRUNfTk9WVEFCTEUgICBfX2RlY2xzcGVjKG5vdnRhYmxlKQorI2RlZmluZSBERUNMU1BFQ19OT1ZUQUJMRSBfX2RlY2xzcGVjKG5vdnRhYmxlKQogI2Vsc2UKICNkZWZpbmUgREVDTFNQRUNfTk9WVEFCTEUKICNlbmRpZgogI2VuZGlmCi0jaWYoV0lOVkVSIDwgMHgwNTAwKQorI2lmIChXSU5WRVIgPCAweDA1MDApCiAjaWZuZGVmIF9NQUMKIERFQ0xBUkVfSEFORExFKEhNT05JVE9SKTsKICNlbmRpZgogI2VuZGlmCi1jbGFzcyBDRFdyaXRlRXh0Ci17Ci1wdWJsaWM6Ci0gICAgQ0RXcml0ZUV4dCgpOwotICAgIH5DRFdyaXRlRXh0KCk7CitjbGFzcyBDRFdyaXRlRXh0IHsKKyBwdWJsaWM6CisgIENEV3JpdGVFeHQoKTsKKyAgfkNEV3JpdGVFeHQoKTsKIAotICAgIHZvaWQJCQlMb2FkKCk7Ci0gICAgdm9pZCAgICAgICAgICAgIFVubG9hZCgpOworICB2b2lkIExvYWQoKTsKKyAgdm9pZCBVbmxvYWQoKTsKIAotICAgIEZYX0JPT0wJCQlJc0F2YWlsYWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRFdyaXRlRmFjdG9yeSAhPSBOVUxMOwotICAgIH0KKyAgRlhfQk9PTCBJc0F2YWlsYWJsZSgpIHsgcmV0dXJuIG1fcERXcml0ZUZhY3RvcnkgIT0gTlVMTDsgfQogCi0gICAgdm9pZCoJCQlEd0NyZWF0ZUZvbnRGYWNlRnJvbVN0cmVhbSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IHNpbXVsYXRpb25fc3R5bGUpOwotICAgIEZYX0JPT0wgICAgICAgICBEd0NyZWF0ZVJlbmRlcmluZ1RhcmdldChDRlhfRElCaXRtYXAqIHBTcmMsIHZvaWQqKiByZW5kZXJUYXJnZXQpOwotICAgIHZvaWQgICAgICAgICAgICBEd0RlbGV0ZVJlbmRlcmluZ1RhcmdldCh2b2lkKiByZW5kZXJUYXJnZXQpOwotICAgIEZYX0JPT0wJCQlEd1JlbmRpbmdTdHJpbmcodm9pZCogcmVuZGVyVGFyZ2V0LCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX1JFQ1QmIHN0cmluZ1JlY3QsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpmb250LCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0FSR0IgdGV4dF9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnbHlwaF9jb3VudCwgdW5zaWduZWQgc2hvcnQqIGdseXBoX2luZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiYXNlbGluZU9yaWdpblgsIEZYX0ZMT0FUIGJhc2VsaW5lT3JpZ2luWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGdseXBoX29mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogZ2x5cGhfYWR2YW5jZXMpOwotICAgIHZvaWQJCQlEd0RlbGV0ZUZvbnQodm9pZCogcEZvbnQpOworICB2b2lkKiBEd0NyZWF0ZUZvbnRGYWNlRnJvbVN0cmVhbSh1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpbXVsYXRpb25fc3R5bGUpOworICBGWF9CT09MIER3Q3JlYXRlUmVuZGVyaW5nVGFyZ2V0KENGWF9ESUJpdG1hcCogcFNyYywgdm9pZCoqIHJlbmRlclRhcmdldCk7CisgIHZvaWQgRHdEZWxldGVSZW5kZXJpbmdUYXJnZXQodm9pZCogcmVuZGVyVGFyZ2V0KTsKKyAgRlhfQk9PTCBEd1JlbmRpbmdTdHJpbmcodm9pZCogcmVuZGVyVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIHN0cmluZ1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiB0ZXh0X2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ2x5cGhfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0KiBnbHlwaF9pbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiYXNlbGluZU9yaWdpblgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJhc2VsaW5lT3JpZ2luWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZ2x5cGhfb2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIGdseXBoX2FkdmFuY2VzKTsKKyAgdm9pZCBEd0RlbGV0ZUZvbnQodm9pZCogcEZvbnQpOwogCi1wcm90ZWN0ZWQ6Ci0gICAgdm9pZCoJCQltX2hNb2R1bGU7Ci0gICAgdm9pZCoJCQltX3BEV3JpdGVGYWN0b3J5OwotICAgIHZvaWQqCQkgICAgbV9wRHdGb250Q29udGV4dDsKLSAgICB2b2lkKgkgICAgICAgIG1fcER3VGV4dFJlbmRlcmVyOworIHByb3RlY3RlZDoKKyAgdm9pZCogbV9oTW9kdWxlOworICB2b2lkKiBtX3BEV3JpdGVGYWN0b3J5OworICB2b2lkKiBtX3BEd0ZvbnRDb250ZXh0OworICB2b2lkKiBtX3BEd1RleHRSZW5kZXJlcjsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlhHRV9XSU4zMl9EV1JJVEVfSU5UX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2RldmljZS5jcHAgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2RldmljZS5jcHAKaW5kZXggMzVjYjVlZi4uZDBkMTNiMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kZXZpY2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGV2aWNlLmNwcApAQCAtMTgsMTU1ICsxOCwxNTMgQEAKICNpbmNsdWRlICJkd3JpdGVfaW50LmgiCiAjaW5jbHVkZSAid2luMzJfaW50LmgiCiAKLWNsYXNzIENGWF9XaW4zMkZvbnRJbmZvIGZpbmFsIDogcHVibGljIElGWF9TeXN0ZW1Gb250SW5mbwotewotcHVibGljOgotICAgIENGWF9XaW4zMkZvbnRJbmZvKCk7Ci0gICAgfkNGWF9XaW4zMkZvbnRJbmZvKCk7Ci0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCk7Ci0gICAgdmlydHVhbAlGWF9CT09MCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpOwotICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFjZSwgaW50JiBpRXhhY3QpOwotICAgIHZpcnR1YWwgdm9pZCoJCUdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEZvbnREYXRhKHZvaWQqIGhGb250LCBGWF9EV09SRCB0YWJsZSwgdWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBzaXplKTsKLSAgICB2aXJ0dWFsIHZvaWQJCURlbGV0ZUZvbnQodm9pZCogaEZvbnQpOwotICAgIHZpcnR1YWwJRlhfQk9PTAkJR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpOwotICAgIEZYX0JPT0wJCQkJSXNPcGVuVHlwZUZyb21EaXYoY29uc3QgTE9HRk9OVEEgKnBsZik7Ci0gICAgRlhfQk9PTAkJCQlJc1N1cHBvcnRGb250Rm9ybURpdihjb25zdCBMT0dGT05UQSogcGxmKTsKLSAgICB2b2lkCQkJCUFkZEluc3RhbGxlZEZvbnQoY29uc3QgTE9HRk9OVEEgKnBsZiwgRlhfRFdPUkQgRm9udFR5cGUpOwotICAgIHZvaWQJCQkJR2V0R0JQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhfZmFtaWx5KTsKLSAgICB2b2lkCQkJCUdldEphcGFuZXNlUHJlZmVyZW5jZShDRlhfQnl0ZVN0cmluZyYgZmFjZSwgaW50IHdlaWdodCwgaW50IHBpY3RoX2ZhbWlseSk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCUZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKLSAgICBIREMJCQkJCW1faERDOwotICAgIENGWF9Gb250TWFwcGVyKgkJbV9wTWFwcGVyOwotICAgIENGWF9CeXRlU3RyaW5nCQltX0xhc3RGYW1pbHk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCW1fS2FpVGksIG1fRmFuZ1Nvbmc7CitjbGFzcyBDRlhfV2luMzJGb250SW5mbyBmaW5hbCA6IHB1YmxpYyBJRlhfU3lzdGVtRm9udEluZm8geworIHB1YmxpYzoKKyAgQ0ZYX1dpbjMyRm9udEluZm8oKTsKKyAgfkNGWF9XaW4zMkZvbnRJbmZvKCk7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7CisgIHZpcnR1YWwgRlhfQk9PTCBFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpOworICB2aXJ0dWFsIHZvaWQqIE1hcEZvbnQoaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGlFeGFjdCk7CisgIHZpcnR1YWwgdm9pZCogR2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYWNlKSB7IHJldHVybiBOVUxMOyB9CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Rm9udERhdGEodm9pZCogaEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUpOworICB2aXJ0dWFsIHZvaWQgRGVsZXRlRm9udCh2b2lkKiBoRm9udCk7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCk7CisgIEZYX0JPT0wgSXNPcGVuVHlwZUZyb21EaXYoY29uc3QgTE9HRk9OVEEqIHBsZik7CisgIEZYX0JPT0wgSXNTdXBwb3J0Rm9udEZvcm1EaXYoY29uc3QgTE9HRk9OVEEqIHBsZik7CisgIHZvaWQgQWRkSW5zdGFsbGVkRm9udChjb25zdCBMT0dGT05UQSogcGxmLCBGWF9EV09SRCBGb250VHlwZSk7CisgIHZvaWQgR2V0R0JQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhfZmFtaWx5KTsKKyAgdm9pZCBHZXRKYXBhbmVzZVByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWN0aF9mYW1pbHkpOworICBDRlhfQnl0ZVN0cmluZyBGaW5kRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CisgIEhEQyBtX2hEQzsKKyAgQ0ZYX0ZvbnRNYXBwZXIqIG1fcE1hcHBlcjsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9MYXN0RmFtaWx5OworICBDRlhfQnl0ZVN0cmluZyBtX0thaVRpLCBtX0ZhbmdTb25nOwogfTsKLUNGWF9XaW4zMkZvbnRJbmZvOjpDRlhfV2luMzJGb250SW5mbygpCi17Ci0gICAgbV9oREMgPSBDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7CitDRlhfV2luMzJGb250SW5mbzo6Q0ZYX1dpbjMyRm9udEluZm8oKSB7CisgIG1faERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOwogfQotQ0ZYX1dpbjMyRm9udEluZm86On5DRlhfV2luMzJGb250SW5mbygpCi17Ci0gICAgbV9wTWFwcGVyID0gTlVMTDsKK0NGWF9XaW4zMkZvbnRJbmZvOjp+Q0ZYX1dpbjMyRm9udEluZm8oKSB7CisgIG1fcE1hcHBlciA9IE5VTEw7CiB9Ci12b2lkIENGWF9XaW4zMkZvbnRJbmZvOjpSZWxlYXNlKCkKLXsKLSAgICBEZWxldGVEQyhtX2hEQyk7Ci0gICAgZGVsZXRlIHRoaXM7Cit2b2lkIENGWF9XaW4zMkZvbnRJbmZvOjpSZWxlYXNlKCkgeworICBEZWxldGVEQyhtX2hEQyk7CisgIGRlbGV0ZSB0aGlzOwogfQotI2RlZmluZSBUVF9NQUtFX1RBRyh4MSwgeDIsIHgzLCB4NCkgKCgoRlhfRFdPUkQpeDE8PDI0KXwoKEZYX0RXT1JEKXgyPDwxNil8KChGWF9EV09SRCl4Mzw8OCl8KEZYX0RXT1JEKXg0KQotRlhfQk9PTCBDRlhfV2luMzJGb250SW5mbzo6SXNPcGVuVHlwZUZyb21EaXYoY29uc3QgTE9HRk9OVEEgKnBsZikKLXsKLSAgICBIRk9OVCBoRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdEEocGxmKTsKLSAgICBGWF9CT09MIHJldCA9IEZBTFNFOwotICAgIEZYX0RXT1JEIGZvbnRfc2l6ZSAgPSBHZXRGb250RGF0YShoRm9udCwgMCwgTlVMTCwgMCk7Ci0gICAgaWYgKGZvbnRfc2l6ZSAhPSBHRElfRVJST1IgJiYgZm9udF9zaXplID49IHNpemVvZihGWF9EV09SRCkpIHsKLSAgICAgICAgRlhfRFdPUkQgbFZlcnNpb24gPSAwOwotICAgICAgICBHZXRGb250RGF0YShoRm9udCwgMCwgKHVpbnQ4X3QqKSgmbFZlcnNpb24pLCBzaXplb2YoRlhfRFdPUkQpKTsKLSAgICAgICAgbFZlcnNpb24gPSAoKChGWF9EV09SRCkodWludDhfdCkobFZlcnNpb24pKSA8PCAyNCkgfCAoKEZYX0RXT1JEKSgodWludDhfdCkobFZlcnNpb24gPj4gOCkpKSA8PCAxNiB8Ci0gICAgICAgICAgICAgICAgICAgKChGWF9EV09SRCkoKHVpbnQ4X3QpKGxWZXJzaW9uID4+IDE2KSkpIDw8IDggfCAoKHVpbnQ4X3QpKGxWZXJzaW9uID4+IDI0KSk7Ci0gICAgICAgIGlmIChsVmVyc2lvbiA9PSBUVF9NQUtFX1RBRygnTycsICdUJywgJ1QnLCAnTycpIHx8Ci0gICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gMHgwMDAxMDAwMCB8fAotICAgICAgICAgICAgICAgIGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCd0JywgJ3QnLCAnYycsICdmJykgfHwKLSAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSBUVF9NQUtFX1RBRygndCcsICdyJywgJ3UnLCAnZScpIHx8Ci0gICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gMHgwMDAyMDAwMCkgewotICAgICAgICAgICAgcmV0ID0gVFJVRTsKLSAgICAgICAgfQorI2RlZmluZSBUVF9NQUtFX1RBRyh4MSwgeDIsIHgzLCB4NCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKEZYX0RXT1JEKXgxIDw8IDI0KSB8ICgoRlhfRFdPUkQpeDIgPDwgMTYpIHwgKChGWF9EV09SRCl4MyA8PCA4KSB8IFwKKyAgIChGWF9EV09SRCl4NCkKK0ZYX0JPT0wgQ0ZYX1dpbjMyRm9udEluZm86OklzT3BlblR5cGVGcm9tRGl2KGNvbnN0IExPR0ZPTlRBKiBwbGYpIHsKKyAgSEZPTlQgaEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3RBKHBsZik7CisgIEZYX0JPT0wgcmV0ID0gRkFMU0U7CisgIEZYX0RXT1JEIGZvbnRfc2l6ZSA9IEdldEZvbnREYXRhKGhGb250LCAwLCBOVUxMLCAwKTsKKyAgaWYgKGZvbnRfc2l6ZSAhPSBHRElfRVJST1IgJiYgZm9udF9zaXplID49IHNpemVvZihGWF9EV09SRCkpIHsKKyAgICBGWF9EV09SRCBsVmVyc2lvbiA9IDA7CisgICAgR2V0Rm9udERhdGEoaEZvbnQsIDAsICh1aW50OF90KikoJmxWZXJzaW9uKSwgc2l6ZW9mKEZYX0RXT1JEKSk7CisgICAgbFZlcnNpb24gPSAoKChGWF9EV09SRCkodWludDhfdCkobFZlcnNpb24pKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgKChGWF9EV09SRCkoKHVpbnQ4X3QpKGxWZXJzaW9uID4+IDgpKSkgPDwgMTYgfAorICAgICAgICAgICAgICAgKChGWF9EV09SRCkoKHVpbnQ4X3QpKGxWZXJzaW9uID4+IDE2KSkpIDw8IDggfAorICAgICAgICAgICAgICAgKCh1aW50OF90KShsVmVyc2lvbiA+PiAyNCkpOworICAgIGlmIChsVmVyc2lvbiA9PSBUVF9NQUtFX1RBRygnTycsICdUJywgJ1QnLCAnTycpIHx8IGxWZXJzaW9uID09IDB4MDAwMTAwMDAgfHwKKyAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAndCcsICdjJywgJ2YnKSB8fAorICAgICAgICBsVmVyc2lvbiA9PSBUVF9NQUtFX1RBRygndCcsICdyJywgJ3UnLCAnZScpIHx8IGxWZXJzaW9uID09IDB4MDAwMjAwMDApIHsKKyAgICAgIHJldCA9IFRSVUU7CiAgICAgfQotICAgIERlbGV0ZUZvbnQoaEZvbnQpOwotICAgIHJldHVybiByZXQ7CisgIH0KKyAgRGVsZXRlRm9udChoRm9udCk7CisgIHJldHVybiByZXQ7CiB9Ci1GWF9CT09MIENGWF9XaW4zMkZvbnRJbmZvOjpJc1N1cHBvcnRGb250Rm9ybURpdihjb25zdCBMT0dGT05UQSogcGxmKQotewotICAgIEhGT05UIGhGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0QShwbGYpOwotICAgIEZYX0JPT0wgcmV0ID0gRkFMU0U7Ci0gICAgRlhfRFdPUkQgZm9udF9zaXplICA9IEdldEZvbnREYXRhKGhGb250LCAwLCBOVUxMLCAwKTsKLSAgICBpZiAoZm9udF9zaXplICE9IEdESV9FUlJPUiAmJiBmb250X3NpemUgPj0gc2l6ZW9mKEZYX0RXT1JEKSkgewotICAgICAgICBGWF9EV09SRCBsVmVyc2lvbiA9IDA7Ci0gICAgICAgIEdldEZvbnREYXRhKGhGb250LCAwLCAodWludDhfdCopKCZsVmVyc2lvbiksIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICBsVmVyc2lvbiA9ICgoKEZYX0RXT1JEKSh1aW50OF90KShsVmVyc2lvbikpIDw8IDI0KSB8ICgoRlhfRFdPUkQpKCh1aW50OF90KShsVmVyc2lvbiA+PiA4KSkpIDw8IDE2IHwKLSAgICAgICAgICAgICAgICAgICAoKEZYX0RXT1JEKSgodWludDhfdCkobFZlcnNpb24gPj4gMTYpKSkgPDwgOCB8ICgodWludDhfdCkobFZlcnNpb24gPj4gMjQpKTsKLSAgICAgICAgaWYgKGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCdPJywgJ1QnLCAnVCcsICdPJykgfHwKLSAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSAweDAwMDEwMDAwIHx8Ci0gICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAndCcsICdjJywgJ2YnKSB8fAotICAgICAgICAgICAgICAgIGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCd0JywgJ3InLCAndScsICdlJykgfHwKLSAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSAweDAwMDIwMDAwKSB7Ci0gICAgICAgICAgICByZXQgPSBUUlVFOwotICAgICAgICB9IGVsc2UgaWYgKChsVmVyc2lvbiAmIDB4RkZGRjAwMDApID09IFRUX01BS0VfVEFHKDB4ODAsIDB4MDEsIDB4MDAsIDB4MDApIHx8Ci0gICAgICAgICAgICAgICAgICAgKGxWZXJzaW9uICYgMHhGRkZGMDAwMCkgPT0gVFRfTUFLRV9UQUcoJyUnLCAnIScsIDAsIDApKSB7Ci0gICAgICAgICAgICByZXQgPSBUUlVFOwotICAgICAgICB9CitGWF9CT09MIENGWF9XaW4zMkZvbnRJbmZvOjpJc1N1cHBvcnRGb250Rm9ybURpdihjb25zdCBMT0dGT05UQSogcGxmKSB7CisgIEhGT05UIGhGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0QShwbGYpOworICBGWF9CT09MIHJldCA9IEZBTFNFOworICBGWF9EV09SRCBmb250X3NpemUgPSBHZXRGb250RGF0YShoRm9udCwgMCwgTlVMTCwgMCk7CisgIGlmIChmb250X3NpemUgIT0gR0RJX0VSUk9SICYmIGZvbnRfc2l6ZSA+PSBzaXplb2YoRlhfRFdPUkQpKSB7CisgICAgRlhfRFdPUkQgbFZlcnNpb24gPSAwOworICAgIEdldEZvbnREYXRhKGhGb250LCAwLCAodWludDhfdCopKCZsVmVyc2lvbiksIHNpemVvZihGWF9EV09SRCkpOworICAgIGxWZXJzaW9uID0gKCgoRlhfRFdPUkQpKHVpbnQ4X3QpKGxWZXJzaW9uKSkgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICgoRlhfRFdPUkQpKCh1aW50OF90KShsVmVyc2lvbiA+PiA4KSkpIDw8IDE2IHwKKyAgICAgICAgICAgICAgICgoRlhfRFdPUkQpKCh1aW50OF90KShsVmVyc2lvbiA+PiAxNikpKSA8PCA4IHwKKyAgICAgICAgICAgICAgICgodWludDhfdCkobFZlcnNpb24gPj4gMjQpKTsKKyAgICBpZiAobFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ08nLCAnVCcsICdUJywgJ08nKSB8fCBsVmVyc2lvbiA9PSAweDAwMDEwMDAwIHx8CisgICAgICAgIGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCd0JywgJ3QnLCAnYycsICdmJykgfHwKKyAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAncicsICd1JywgJ2UnKSB8fCBsVmVyc2lvbiA9PSAweDAwMDIwMDAwKSB7CisgICAgICByZXQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoKGxWZXJzaW9uICYgMHhGRkZGMDAwMCkgPT0gVFRfTUFLRV9UQUcoMHg4MCwgMHgwMSwgMHgwMCwgMHgwMCkgfHwKKyAgICAgICAgICAgICAgIChsVmVyc2lvbiAmIDB4RkZGRjAwMDApID09IFRUX01BS0VfVEFHKCclJywgJyEnLCAwLCAwKSkgeworICAgICAgcmV0ID0gVFJVRTsKICAgICB9Ci0gICAgRGVsZXRlRm9udChoRm9udCk7Ci0gICAgcmV0dXJuIHJldDsKKyAgfQorICBEZWxldGVGb250KGhGb250KTsKKyAgcmV0dXJuIHJldDsKIH0KLXZvaWQgQ0ZYX1dpbjMyRm9udEluZm86OkFkZEluc3RhbGxlZEZvbnQoY29uc3QgTE9HRk9OVEEgKnBsZiwgRlhfRFdPUkQgRm9udFR5cGUpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZShwbGYtPmxmRmFjZU5hbWUsIC0xKTsKLSAgICBpZiAobmFtZVswXSA9PSAnQCcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobmFtZSA9PSBtX0xhc3RGYW1pbHkpIHsKLSAgICAgICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KG5hbWUsIHBsZi0+bGZDaGFyU2V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIShGb250VHlwZSAmIFRSVUVUWVBFX0ZPTlRUWVBFKSAmJiAhKEZvbnRUeXBlICYgREVWSUNFX0ZPTlRUWVBFKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghKEZvbnRUeXBlICYgVFJVRVRZUEVfRk9OVFRZUEUpKSB7Ci0gICAgICAgIGlmICghSXNTdXBwb3J0Rm9udEZvcm1EaXYocGxmKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQordm9pZCBDRlhfV2luMzJGb250SW5mbzo6QWRkSW5zdGFsbGVkRm9udChjb25zdCBMT0dGT05UQSogcGxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBGb250VHlwZSkgeworICBDRlhfQnl0ZVN0cmluZyBuYW1lKHBsZi0+bGZGYWNlTmFtZSwgLTEpOworICBpZiAobmFtZVswXSA9PSAnQCcpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG5hbWUgPT0gbV9MYXN0RmFtaWx5KSB7CiAgICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KG5hbWUsIHBsZi0+bGZDaGFyU2V0KTsKLSAgICBtX0xhc3RGYW1pbHkgPSBuYW1lOwotfQotc3RhdGljIGludCBDQUxMQkFDSyBGb250RW51bVByb2MoCi0gICAgY29uc3QgTE9HRk9OVEEgKnBsZiwKLSAgICBjb25zdCBURVhUTUVUUklDQSAqbHBudG1lLAotICAgIEZYX0RXT1JEIEZvbnRUeXBlLAotICAgIExQQVJBTSBsUGFyYW0KLSkKLXsKLSAgICBDRlhfV2luMzJGb250SW5mbyogcEZvbnRJbmZvID0gKENGWF9XaW4zMkZvbnRJbmZvKilsUGFyYW07Ci0gICAgaWYgKHBGb250SW5mby0+bV9wTWFwcGVyLT5HZXRGb250RW51bWVyYXRvcigpKSB7Ci0gICAgICAgIHBGb250SW5mby0+bV9wTWFwcGVyLT5HZXRGb250RW51bWVyYXRvcigpLT5IaXRGb250KCk7CisgICAgcmV0dXJuOworICB9CisgIGlmICghKEZvbnRUeXBlICYgVFJVRVRZUEVfRk9OVFRZUEUpICYmICEoRm9udFR5cGUgJiBERVZJQ0VfRk9OVFRZUEUpKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghKEZvbnRUeXBlICYgVFJVRVRZUEVfRk9OVFRZUEUpKSB7CisgICAgaWYgKCFJc1N1cHBvcnRGb250Rm9ybURpdihwbGYpKSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIHBGb250SW5mby0+QWRkSW5zdGFsbGVkRm9udChwbGYsIEZvbnRUeXBlKTsKLSAgICByZXR1cm4gMTsKKyAgfQorICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQobmFtZSwgcGxmLT5sZkNoYXJTZXQpOworICBtX0xhc3RGYW1pbHkgPSBuYW1lOwogfQotRlhfQk9PTCBDRlhfV2luMzJGb250SW5mbzo6RW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKQotewotICAgIG1fcE1hcHBlciA9IHBNYXBwZXI7Ci0gICAgTE9HRk9OVEEgbGY7Ci0gICAgRlhTWVNfbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKExPR0ZPTlRBKSk7Ci0gICAgbGYubGZDaGFyU2V0ID0gREVGQVVMVF9DSEFSU0VUOwotICAgIGxmLmxmRmFjZU5hbWVbMF0gPSAwOwotICAgIGxmLmxmUGl0Y2hBbmRGYW1pbHkgPSAwOwotICAgIEVudW1Gb250RmFtaWxpZXNFeEEobV9oREMsICZsZiwgKEZPTlRFTlVNUFJPQ0EpRm9udEVudW1Qcm9jLCAodWludHB0cl90KXRoaXMsIDApOwotICAgIGlmIChwTWFwcGVyLT5HZXRGb250RW51bWVyYXRvcigpKSB7Ci0gICAgICAgIHBNYXBwZXItPkdldEZvbnRFbnVtZXJhdG9yKCktPkZpbmlzaCgpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKK3N0YXRpYyBpbnQgQ0FMTEJBQ0sgRm9udEVudW1Qcm9jKGNvbnN0IExPR0ZPTlRBKiBwbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBURVhUTUVUUklDQSogbHBudG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgRm9udFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtKSB7CisgIENGWF9XaW4zMkZvbnRJbmZvKiBwRm9udEluZm8gPSAoQ0ZYX1dpbjMyRm9udEluZm8qKWxQYXJhbTsKKyAgaWYgKHBGb250SW5mby0+bV9wTWFwcGVyLT5HZXRGb250RW51bWVyYXRvcigpKSB7CisgICAgcEZvbnRJbmZvLT5tX3BNYXBwZXItPkdldEZvbnRFbnVtZXJhdG9yKCktPkhpdEZvbnQoKTsKKyAgfQorICBwRm9udEluZm8tPkFkZEluc3RhbGxlZEZvbnQocGxmLCBGb250VHlwZSk7CisgIHJldHVybiAxOworfQorRlhfQk9PTCBDRlhfV2luMzJGb250SW5mbzo6RW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSB7CisgIG1fcE1hcHBlciA9IHBNYXBwZXI7CisgIExPR0ZPTlRBIGxmOworICBGWFNZU19tZW1zZXQoJmxmLCAwLCBzaXplb2YoTE9HRk9OVEEpKTsKKyAgbGYubGZDaGFyU2V0ID0gREVGQVVMVF9DSEFSU0VUOworICBsZi5sZkZhY2VOYW1lWzBdID0gMDsKKyAgbGYubGZQaXRjaEFuZEZhbWlseSA9IDA7CisgIEVudW1Gb250RmFtaWxpZXNFeEEobV9oREMsICZsZiwgKEZPTlRFTlVNUFJPQ0EpRm9udEVudW1Qcm9jLCAodWludHB0cl90KSB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgIDApOworICBpZiAocE1hcHBlci0+R2V0Rm9udEVudW1lcmF0b3IoKSkgeworICAgIHBNYXBwZXItPkdldEZvbnRFbnVtZXJhdG9yKCktPkZpbmlzaCgpOworICB9CisgIHJldHVybiBUUlVFOwogfQogc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0gICAgY29uc3QgRlhfQ0hBUioJbV9wRmFjZU5hbWU7Ci0gICAgY29uc3QgRlhfQ0hBUioJbV9wVmFyaWFudE5hbWU7Ci19Ci1WYXJpYW50TmFtZXNbXSA9IHsKKyAgY29uc3QgRlhfQ0hBUiogbV9wRmFjZU5hbWU7CisgIGNvbnN0IEZYX0NIQVIqIG1fcFZhcmlhbnROYW1lOworfSBWYXJpYW50TmFtZXNbXSA9IHsKICAgICB7IkRGS2FpLVNCIiwgIlx4MTlceDZBXHg3N1x4NjlceEQ0XHg5QSJ9LAogfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgIGNvbnN0IEZYX0NIQVIqCW1fcE5hbWU7Ci0gICAgY29uc3QgRlhfQ0hBUioJbV9wV2luTmFtZTsKLSAgICBGWF9CT09MCQltX2JCb2xkOwotICAgIEZYX0JPT0wJCW1fYkl0YWxpYzsKLX0KLUJhc2UxNFN1YnN0c1tdID0geworICBjb25zdCBGWF9DSEFSKiBtX3BOYW1lOworICBjb25zdCBGWF9DSEFSKiBtX3BXaW5OYW1lOworICBGWF9CT09MIG1fYkJvbGQ7CisgIEZYX0JPT0wgbV9iSXRhbGljOworfSBCYXNlMTRTdWJzdHNbXSA9IHsKICAgICB7IkNvdXJpZXIiLCAiQ291cmllciBOZXciLCBGQUxTRSwgRkFMU0V9LAogICAgIHsiQ291cmllci1Cb2xkIiwgIkNvdXJpZXIgTmV3IiwgVFJVRSwgRkFMU0V9LAogICAgIHsiQ291cmllci1Cb2xkT2JsaXF1ZSIsICJDb3VyaWVyIE5ldyIsIFRSVUUsIFRSVUV9LApAQCAtMTgwLDU4MSArMTc4LDYyMCBAQAogICAgIHsiVGltZXMtQm9sZEl0YWxpYyIsICJUaW1lcyBOZXcgUm9tYW4iLCBUUlVFLCBUUlVFfSwKICAgICB7IlRpbWVzLUl0YWxpYyIsICJUaW1lcyBOZXcgUm9tYW4iLCBGQUxTRSwgVFJVRX0sCiB9OwotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX1dpbjMyRm9udEluZm86OkZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKQotewotICAgIGlmIChtX3BNYXBwZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gbmFtZTsKK0NGWF9CeXRlU3RyaW5nIENGWF9XaW4zMkZvbnRJbmZvOjpGaW5kRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgeworICBpZiAobV9wTWFwcGVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorICBpbnQgbkZvbnRzID0gbV9wTWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHMuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Gb250czsgaSsrKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgdGhpc25hbWUgPSBtX3BNYXBwZXItPm1fSW5zdGFsbGVkVFRGb250c1tpXTsKKyAgICBpZiAodGhpc25hbWVbMF0gPT0gJyAnKSB7CisgICAgICBpZiAodGhpc25hbWUuTWlkKDEsIG5hbWUuR2V0TGVuZ3RoKCkpID09IG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG1fcE1hcHBlci0+bV9JbnN0YWxsZWRUVEZvbnRzW2kgKyAxXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRoaXNuYW1lLkxlZnQobmFtZS5HZXRMZW5ndGgoKSkgPT0gbmFtZSkgeworICAgICAgcmV0dXJuIG1fcE1hcHBlci0+bV9JbnN0YWxsZWRUVEZvbnRzW2ldOwogICAgIH0KLSAgICBpbnQgbkZvbnRzID0gbV9wTWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHMuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkZvbnRzOyBpICsrKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHRoaXNuYW1lID0gbV9wTWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHNbaV07Ci0gICAgICAgIGlmICh0aGlzbmFtZVswXSA9PSAnICcpIHsKLSAgICAgICAgICAgIGlmICh0aGlzbmFtZS5NaWQoMSwgbmFtZS5HZXRMZW5ndGgoKSkgPT0gbmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtX3BNYXBwZXItPm1fSW5zdGFsbGVkVFRGb250c1tpICsgMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpc25hbWUuTGVmdChuYW1lLkdldExlbmd0aCgpKSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gbV9wTWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHNbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CiB9CiBzdHJ1Y3QgX0ZvbnROYW1lTWFwIHsKLSAgICBjb25zdCBGWF9DSEFSKgltX3BTdWJGb250TmFtZTsKLSAgICBjb25zdCBGWF9DSEFSKgltX3BTcmNGb250TmFtZTsKKyAgY29uc3QgRlhfQ0hBUiogbV9wU3ViRm9udE5hbWU7CisgIGNvbnN0IEZYX0NIQVIqIG1fcFNyY0ZvbnROYW1lOwogfTsKIGNvbnN0IF9Gb250TmFtZU1hcCBnX0pwRm9udE5hbWVNYXBbXSA9IHsKICAgICB7Ik1TIE1pbmNobyIsICJIZWlzZWltaW4tVzMifSwKICAgICB7Ik1TIEdvdGhpYyIsICJKdW4xMDEtTGlnaHQifSwKIH07CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IGNvbXBhcmVTdHJpbmcoY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiBlbGVtZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYU1lTX3N0cmljbXAoKGNvbnN0IEZYX0NIQVIqKWtleSwgKChfRm9udE5hbWVNYXAqKWVsZW1lbnQpLT5tX3BTcmNGb250TmFtZSk7Ci0gICAgfQorc3RhdGljIGludCBjb21wYXJlU3RyaW5nKGNvbnN0IHZvaWQqIGtleSwgY29uc3Qgdm9pZCogZWxlbWVudCkgeworICByZXR1cm4gRlhTWVNfc3RyaWNtcCgoY29uc3QgRlhfQ0hBUiopa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAoKF9Gb250TmFtZU1hcCopZWxlbWVudCktPm1fcFNyY0ZvbnROYW1lKTsKIH0KLUZYX0JPT0wgX0dldFN1YkZvbnROYW1lKENGWF9CeXRlU3RyaW5nJiBuYW1lKQotewotICAgIGludCBzaXplID0gc2l6ZW9mIGdfSnBGb250TmFtZU1hcDsKLSAgICB2b2lkKiBwRm9udG5hbWVNYXAgPSAodm9pZCopZ19KcEZvbnROYW1lTWFwOwotICAgIF9Gb250TmFtZU1hcCogZm91bmQgPSAoX0ZvbnROYW1lTWFwKilGWFNZU19ic2VhcmNoKG5hbWUuY19zdHIoKSwgcEZvbnRuYW1lTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC8gc2l6ZW9mIChfRm9udE5hbWVNYXApLCBzaXplb2YgKF9Gb250TmFtZU1hcCksIGNvbXBhcmVTdHJpbmcpOwotICAgIGlmIChmb3VuZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbmFtZSA9IGZvdW5kLT5tX3BTdWJGb250TmFtZTsKLSAgICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ0ZYX1dpbjMyRm9udEluZm86OkdldEdCUHJlZmVyZW5jZShDRlhfQnl0ZVN0cmluZyYgZmFjZSwgaW50IHdlaWdodCwgaW50IHBpY3RoX2ZhbWlseSkKLXsKLSAgICBpZiAoZmFjZS5GaW5kKCJLYWlUaSIpID49IDAgfHwgZmFjZS5GaW5kKCJceGJmXHhhYyIpID49IDApIHsKLSAgICAgICAgaWYgKG1fS2FpVGkuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtX0thaVRpID0gRmluZEZvbnQoIkthaVRpIik7Ci0gICAgICAgICAgICBpZiAobV9LYWlUaS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtX0thaVRpID0gIlNpbVN1biI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmFjZSA9IG1fS2FpVGk7Ci0gICAgfSBlbHNlIGlmIChmYWNlLkZpbmQoIkZhbmdTb25nIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4YjdceGMyXHhjYlx4Y2UiKSA+PSAwKSB7Ci0gICAgICAgIGlmIChtX0ZhbmdTb25nLklzRW1wdHkoKSkgewotICAgICAgICAgICAgbV9GYW5nU29uZyA9IEZpbmRGb250KCJGYW5nU29uZyIpOwotICAgICAgICAgICAgaWYgKG1fRmFuZ1NvbmcuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbV9GYW5nU29uZyA9ICJTaW1TdW4iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZhY2UgPSBtX0ZhbmdTb25nOwotICAgIH0gZWxzZSBpZiAoZmFjZS5GaW5kKCJTaW1TdW4iKSA+PSAwIHx8IGZhY2UuRmluZCgiXHhjYlx4Y2UiKSA+PSAwKSB7Ci0gICAgICAgIGZhY2UgPSAiU2ltU3VuIjsKLSAgICB9IGVsc2UgaWYgKGZhY2UuRmluZCgiU2ltSGVpIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4YmFceGRhIikgPj0gMCkgewotICAgICAgICBmYWNlID0gIlNpbUhlaSI7Ci0gICAgfSBlbHNlIGlmICghKHBpY3RoX2ZhbWlseSAmIEZGX1JPTUFOKSAmJiB3ZWlnaHQgPiA1NTApIHsKLSAgICAgICAgZmFjZSA9ICJTaW1IZWkiOworRlhfQk9PTCBfR2V0U3ViRm9udE5hbWUoQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsKKyAgaW50IHNpemUgPSBzaXplb2YgZ19KcEZvbnROYW1lTWFwOworICB2b2lkKiBwRm9udG5hbWVNYXAgPSAodm9pZCopZ19KcEZvbnROYW1lTWFwOworICBfRm9udE5hbWVNYXAqIGZvdW5kID0gKF9Gb250TmFtZU1hcCopRlhTWVNfYnNlYXJjaCgKKyAgICAgIG5hbWUuY19zdHIoKSwgcEZvbnRuYW1lTWFwLCBzaXplIC8gc2l6ZW9mKF9Gb250TmFtZU1hcCksCisgICAgICBzaXplb2YoX0ZvbnROYW1lTWFwKSwgY29tcGFyZVN0cmluZyk7CisgIGlmIChmb3VuZCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG5hbWUgPSBmb3VuZC0+bV9wU3ViRm9udE5hbWU7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDRlhfV2luMzJGb250SW5mbzo6R2V0R0JQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpY3RoX2ZhbWlseSkgeworICBpZiAoZmFjZS5GaW5kKCJLYWlUaSIpID49IDAgfHwgZmFjZS5GaW5kKCJceGJmXHhhYyIpID49IDApIHsKKyAgICBpZiAobV9LYWlUaS5Jc0VtcHR5KCkpIHsKKyAgICAgIG1fS2FpVGkgPSBGaW5kRm9udCgiS2FpVGkiKTsKKyAgICAgIGlmIChtX0thaVRpLklzRW1wdHkoKSkgeworICAgICAgICBtX0thaVRpID0gIlNpbVN1biI7CisgICAgICB9CisgICAgfQorICAgIGZhY2UgPSBtX0thaVRpOworICB9IGVsc2UgaWYgKGZhY2UuRmluZCgiRmFuZ1NvbmciKSA+PSAwIHx8IGZhY2UuRmluZCgiXHhiN1x4YzJceGNiXHhjZSIpID49IDApIHsKKyAgICBpZiAobV9GYW5nU29uZy5Jc0VtcHR5KCkpIHsKKyAgICAgIG1fRmFuZ1NvbmcgPSBGaW5kRm9udCgiRmFuZ1NvbmciKTsKKyAgICAgIGlmIChtX0ZhbmdTb25nLklzRW1wdHkoKSkgeworICAgICAgICBtX0ZhbmdTb25nID0gIlNpbVN1biI7CisgICAgICB9CisgICAgfQorICAgIGZhY2UgPSBtX0ZhbmdTb25nOworICB9IGVsc2UgaWYgKGZhY2UuRmluZCgiU2ltU3VuIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4Y2JceGNlIikgPj0gMCkgeworICAgIGZhY2UgPSAiU2ltU3VuIjsKKyAgfSBlbHNlIGlmIChmYWNlLkZpbmQoIlNpbUhlaSIpID49IDAgfHwgZmFjZS5GaW5kKCJceGJhXHhkYSIpID49IDApIHsKKyAgICBmYWNlID0gIlNpbUhlaSI7CisgIH0gZWxzZSBpZiAoIShwaWN0aF9mYW1pbHkgJiBGRl9ST01BTikgJiYgd2VpZ2h0ID4gNTUwKSB7CisgICAgZmFjZSA9ICJTaW1IZWkiOworICB9IGVsc2UgeworICAgIGZhY2UgPSAiU2ltU3VuIjsKKyAgfQorfQordm9pZCBDRlhfV2luMzJGb250SW5mbzo6R2V0SmFwYW5lc2VQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpY3RoX2ZhbWlseSkgeworICBpZiAoZmFjZS5GaW5kKCJHb3RoaWMiKSA+PSAwIHx8CisgICAgICBmYWNlLkZpbmQoIlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRlIikgPj0gMCkgeworICAgIGlmIChmYWNlLkZpbmQoIlBHb3RoaWMiKSA+PSAwIHx8CisgICAgICAgIGZhY2UuRmluZCgiXHg4Mlx4NmZceDgzXHg1M1x4ODNceDU2XHg4M1x4NjJceDgzXHg0ZSIpID49IDApIHsKKyAgICAgIGZhY2UgPSAiTVMgUEdvdGhpYyI7CisgICAgfSBlbHNlIGlmIChmYWNlLkZpbmQoIlVJIEdvdGhpYyIpID49IDApIHsKKyAgICAgIGZhY2UgPSAiTVMgVUkgR290aGljIjsKICAgICB9IGVsc2UgewotICAgICAgICBmYWNlID0gIlNpbVN1biI7Ci0gICAgfQotfQotdm9pZCBDRlhfV2luMzJGb250SW5mbzo6R2V0SmFwYW5lc2VQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhfZmFtaWx5KQotewotICAgIGlmIChmYWNlLkZpbmQoIkdvdGhpYyIpID49IDAgfHwgZmFjZS5GaW5kKCJceDgzXHg1M1x4ODNceDU2XHg4M1x4NjJceDgzXHg0ZSIpID49IDApIHsKLSAgICAgICAgaWYgKGZhY2UuRmluZCgiUEdvdGhpYyIpID49IDAgfHwgZmFjZS5GaW5kKCJceDgyXHg2Zlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRlIikgPj0gMCkgewotICAgICAgICAgICAgZmFjZSA9ICJNUyBQR290aGljIjsKLSAgICAgICAgfSBlbHNlIGlmIChmYWNlLkZpbmQoIlVJIEdvdGhpYyIpID49IDApIHsKLSAgICAgICAgICAgIGZhY2UgPSAiTVMgVUkgR290aGljIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmYWNlLkZpbmQoIkhHU0dvdGhpY00iKSA+PSAwIHx8IGZhY2UuRmluZCgiSEdNYXJ1R290aGljTVBSTyIpID49IDApIHsKLSAgICAgICAgICAgICAgICBmYWNlID0gIk1TIFBHb3RoaWMiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYWNlID0gIk1TIEdvdGhpYyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZmFjZS5GaW5kKCJNaW5jaG8iKSA+PSAwIHx8IGZhY2UuRmluZCgiXHg5Nlx4YmVceDkyXHhhOSIpID49IDApIHsKLSAgICAgICAgaWYgKGZhY2UuRmluZCgiUE1pbmNobyIpID49IDAgfHwgZmFjZS5GaW5kKCJceDgyXHg2Zlx4OTZceGJlXHg5Mlx4YTkiKSA+PSAwKSB7Ci0gICAgICAgICAgICBmYWNlID0gIk1TIFBNaW5jaG8iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmFjZSA9ICJNUyBNaW5jaG8iOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKF9HZXRTdWJGb250TmFtZShmYWNlKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghKHBpY3RoX2ZhbWlseSAmIEZGX1JPTUFOKSAmJiB3ZWlnaHQgPiA0MDApIHsKKyAgICAgIGlmIChmYWNlLkZpbmQoIkhHU0dvdGhpY00iKSA+PSAwIHx8IGZhY2UuRmluZCgiSEdNYXJ1R290aGljTVBSTyIpID49IDApIHsKICAgICAgICAgZmFjZSA9ICJNUyBQR290aGljIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZhY2UgPSAiTVMgR290aGljIjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChmYWNlLkZpbmQoIk1pbmNobyIpID49IDAgfHwgZmFjZS5GaW5kKCJceDk2XHhiZVx4OTJceGE5IikgPj0gMCkgeworICAgIGlmIChmYWNlLkZpbmQoIlBNaW5jaG8iKSA+PSAwIHx8CisgICAgICAgIGZhY2UuRmluZCgiXHg4Mlx4NmZceDk2XHhiZVx4OTJceGE5IikgPj0gMCkgeworICAgICAgZmFjZSA9ICJNUyBQTWluY2hvIjsKICAgICB9IGVsc2UgewotICAgICAgICBmYWNlID0gIk1TIFBNaW5jaG8iOworICAgICAgZmFjZSA9ICJNUyBNaW5jaG8iOwogICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKF9HZXRTdWJGb250TmFtZShmYWNlKSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIShwaWN0aF9mYW1pbHkgJiBGRl9ST01BTikgJiYgd2VpZ2h0ID4gNDAwKSB7CisgICAgZmFjZSA9ICJNUyBQR290aGljIjsKKyAgfSBlbHNlIHsKKyAgICBmYWNlID0gIk1TIFBNaW5jaG8iOworICB9CiB9Ci12b2lkKiBDRlhfV2luMzJGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsIGludCYgaUV4YWN0KQotewotICAgIENGWF9CeXRlU3RyaW5nIGZhY2UgPSBjc3RyX2ZhY2U7Ci0gICAgaW50IGlCYXNlRm9udDsKLSAgICBmb3IgKGlCYXNlRm9udCA9IDA7IGlCYXNlRm9udCA8IDEyOyBpQmFzZUZvbnQgKyspCi0gICAgICAgIGlmIChmYWNlID09IENGWF9CeXRlU3RyaW5nQyhCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX3BOYW1lKSkgewotICAgICAgICAgICAgZmFjZSA9IEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcFdpbk5hbWU7Ci0gICAgICAgICAgICB3ZWlnaHQgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX2JCb2xkID8gRldfQk9MRCA6IEZXX05PUk1BTDsKLSAgICAgICAgICAgIGJJdGFsaWMgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX2JJdGFsaWM7Ci0gICAgICAgICAgICBpRXhhY3QgPSBUUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBBTlNJX0NIQVJTRVQgfHwgY2hhcnNldCA9PSBTWU1CT0xfQ0hBUlNFVCkgewotICAgICAgICBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VUOwordm9pZCogQ0ZYX1dpbjMyRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGNzdHJfZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUV4YWN0KSB7CisgIENGWF9CeXRlU3RyaW5nIGZhY2UgPSBjc3RyX2ZhY2U7CisgIGludCBpQmFzZUZvbnQ7CisgIGZvciAoaUJhc2VGb250ID0gMDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCsrKQorICAgIGlmIChmYWNlID09IENGWF9CeXRlU3RyaW5nQyhCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX3BOYW1lKSkgeworICAgICAgZmFjZSA9IEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcFdpbk5hbWU7CisgICAgICB3ZWlnaHQgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX2JCb2xkID8gRldfQk9MRCA6IEZXX05PUk1BTDsKKyAgICAgIGJJdGFsaWMgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX2JJdGFsaWM7CisgICAgICBpRXhhY3QgPSBUUlVFOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGludCBzdWJzdF9waXRjaF9mYW1pbHkgPSBwaXRjaF9mYW1pbHk7Ci0gICAgc3dpdGNoIChjaGFyc2V0KSB7Ci0gICAgICAgIGNhc2UgU0hJRlRKSVNfQ0hBUlNFVDoKLSAgICAgICAgICAgIHN1YnN0X3BpdGNoX2ZhbWlseSA9IEZGX1JPTUFOOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKLSAgICAgICAgY2FzZSBIQU5HVUxfQ0hBUlNFVDoKLSAgICAgICAgY2FzZSBHQjIzMTJfQ0hBUlNFVDoKLSAgICAgICAgICAgIHN1YnN0X3BpdGNoX2ZhbWlseSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgSEZPTlQgaEZvbnQgPSA6OkNyZWF0ZUZvbnRBKC0xMCwgMCwgMCwgMCwgd2VpZ2h0LCBiSXRhbGljLCAwLCAwLCBjaGFyc2V0LCBPVVRfVFRfT05MWV9QUkVDSVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIHN1YnN0X3BpdGNoX2ZhbWlseSwgZmFjZSk7Ci0gICAgY2hhciBmYWNlYnVmWzEwMF07Ci0gICAgSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIGhGb250KTsKLSAgICBpbnQgcmV0ID0gOjpHZXRUZXh0RmFjZUEobV9oREMsIDEwMCwgZmFjZWJ1Zik7Ci0gICAgOjpTZWxlY3RPYmplY3QobV9oREMsIGhPbGRGb250KTsKLSAgICBpZiAoZmFjZS5FcXVhbE5vQ2FzZShmYWNlYnVmKSkgewotICAgICAgICByZXR1cm4gaEZvbnQ7Ci0gICAgfQotICAgIGludCBpQ291bnQgPSBzaXplb2YoVmFyaWFudE5hbWVzKSAvIHNpemVvZihWYXJpYW50TmFtZXNbMF0pOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKGZhY2UgPT0gVmFyaWFudE5hbWVzW2ldLm1fcEZhY2VOYW1lKSB7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZhY2UgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGZhY2VidWYpOwotICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIHBOYW1lID0gKGNvbnN0IHVuc2lnbmVkIHNob3J0KilWYXJpYW50TmFtZXNbaV0ubV9wVmFyaWFudE5hbWU7Ci0gICAgICAgICAgICBGWF9TVFJTSVpFIGxlbiA9IENGWF9XaWRlU3RyaW5nOjpXU3RyaW5nTGVuZ3RoKHBOYW1lKTsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShwTmFtZSwgbGVuKTsKLSAgICAgICAgICAgIGlmICh3c0ZhY2UgPT0gd3NOYW1lKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhGb250OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIDo6RGVsZXRlT2JqZWN0KGhGb250KTsKLSAgICBpZiAoY2hhcnNldCA9PSBERUZBVUxUX0NIQVJTRVQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHN3aXRjaCAoY2hhcnNldCkgewotICAgICAgICBjYXNlIFNISUZUSklTX0NIQVJTRVQ6Ci0gICAgICAgICAgICBHZXRKYXBhbmVzZVByZWZlcmVuY2UoZmFjZSwgd2VpZ2h0LCBwaXRjaF9mYW1pbHkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0IyMzEyX0NIQVJTRVQ6Ci0gICAgICAgICAgICBHZXRHQlByZWZlcmVuY2UoZmFjZSwgd2VpZ2h0LCBwaXRjaF9mYW1pbHkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSEFOR1VMX0NIQVJTRVQ6Ci0gICAgICAgICAgICBmYWNlID0gIkd1bGltIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENISU5FU0VCSUc1X0NIQVJTRVQ6Ci0gICAgICAgICAgICBpZiAoZmFjZS5GaW5kKCJNU3VuZyIpID49IDApIHsKLSAgICAgICAgICAgICAgICBmYWNlID0gIk1pbmdMaVUiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYWNlID0gIlBNaW5nTGlVIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBoRm9udCA9IDo6Q3JlYXRlRm9udEEoLTEwLCAwLCAwLCAwLCB3ZWlnaHQsIGJJdGFsaWMsIDAsIDAsIGNoYXJzZXQsIE9VVF9UVF9PTkxZX1BSRUNJUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgc3Vic3RfcGl0Y2hfZmFtaWx5LCBmYWNlKTsKKyAgaWYgKGNoYXJzZXQgPT0gQU5TSV9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gU1lNQk9MX0NIQVJTRVQpIHsKKyAgICBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VUOworICB9CisgIGludCBzdWJzdF9waXRjaF9mYW1pbHkgPSBwaXRjaF9mYW1pbHk7CisgIHN3aXRjaCAoY2hhcnNldCkgeworICAgIGNhc2UgU0hJRlRKSVNfQ0hBUlNFVDoKKyAgICAgIHN1YnN0X3BpdGNoX2ZhbWlseSA9IEZGX1JPTUFOOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSElORVNFQklHNV9DSEFSU0VUOgorICAgIGNhc2UgSEFOR1VMX0NIQVJTRVQ6CisgICAgY2FzZSBHQjIzMTJfQ0hBUlNFVDoKKyAgICAgIHN1YnN0X3BpdGNoX2ZhbWlseSA9IDA7CisgICAgICBicmVhazsKKyAgfQorICBIRk9OVCBoRm9udCA9CisgICAgICA6OkNyZWF0ZUZvbnRBKC0xMCwgMCwgMCwgMCwgd2VpZ2h0LCBiSXRhbGljLCAwLCAwLCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICBPVVRfVFRfT05MWV9QUkVDSVMsIDAsIDAsIHN1YnN0X3BpdGNoX2ZhbWlseSwgZmFjZSk7CisgIGNoYXIgZmFjZWJ1ZlsxMDBdOworICBIRk9OVCBoT2xkRm9udCA9IChIRk9OVCk6OlNlbGVjdE9iamVjdChtX2hEQywgaEZvbnQpOworICBpbnQgcmV0ID0gOjpHZXRUZXh0RmFjZUEobV9oREMsIDEwMCwgZmFjZWJ1Zik7CisgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBoT2xkRm9udCk7CisgIGlmIChmYWNlLkVxdWFsTm9DYXNlKGZhY2VidWYpKSB7CiAgICAgcmV0dXJuIGhGb250OwotfQotdm9pZCBDRlhfV2luMzJGb250SW5mbzo6RGVsZXRlRm9udCh2b2lkKiBoRm9udCkKLXsKLSAgICA6OkRlbGV0ZU9iamVjdChoRm9udCk7Ci19Ci1GWF9EV09SRCBDRlhfV2luMzJGb250SW5mbzo6R2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpCi17Ci0gICAgSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIChIRk9OVCloRm9udCk7Ci0gICAgdGFibGUgPSBGWERXT1JEX0ZST01fTVNCRklSU1QodGFibGUpOwotICAgIHNpemUgPSA6OkdldEZvbnREYXRhKG1faERDLCB0YWJsZSwgMCwgYnVmZmVyLCBzaXplKTsKLSAgICA6OlNlbGVjdE9iamVjdChtX2hEQywgaE9sZEZvbnQpOwotICAgIGlmIChzaXplID09IEdESV9FUlJPUikgewotICAgICAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgaUNvdW50ID0gc2l6ZW9mKFZhcmlhbnROYW1lcykgLyBzaXplb2YoVmFyaWFudE5hbWVzWzBdKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgeworICAgIGlmIChmYWNlID09IFZhcmlhbnROYW1lc1tpXS5tX3BGYWNlTmFtZSkgeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGYWNlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChmYWNlYnVmKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBwTmFtZSA9CisgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIHNob3J0KilWYXJpYW50TmFtZXNbaV0ubV9wVmFyaWFudE5hbWU7CisgICAgICBGWF9TVFJTSVpFIGxlbiA9IENGWF9XaWRlU3RyaW5nOjpXU3RyaW5nTGVuZ3RoKHBOYW1lKTsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShwTmFtZSwgbGVuKTsKKyAgICAgIGlmICh3c0ZhY2UgPT0gd3NOYW1lKSB7CisgICAgICAgIHJldHVybiBoRm9udDsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHNpemU7CisgIH0KKyAgOjpEZWxldGVPYmplY3QoaEZvbnQpOworICBpZiAoY2hhcnNldCA9PSBERUZBVUxUX0NIQVJTRVQpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBzd2l0Y2ggKGNoYXJzZXQpIHsKKyAgICBjYXNlIFNISUZUSklTX0NIQVJTRVQ6CisgICAgICBHZXRKYXBhbmVzZVByZWZlcmVuY2UoZmFjZSwgd2VpZ2h0LCBwaXRjaF9mYW1pbHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHQjIzMTJfQ0hBUlNFVDoKKyAgICAgIEdldEdCUHJlZmVyZW5jZShmYWNlLCB3ZWlnaHQsIHBpdGNoX2ZhbWlseSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTkdVTF9DSEFSU0VUOgorICAgICAgZmFjZSA9ICJHdWxpbSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIENISU5FU0VCSUc1X0NIQVJTRVQ6CisgICAgICBpZiAoZmFjZS5GaW5kKCJNU3VuZyIpID49IDApIHsKKyAgICAgICAgZmFjZSA9ICJNaW5nTGlVIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZhY2UgPSAiUE1pbmdMaVUiOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgaEZvbnQgPSA6OkNyZWF0ZUZvbnRBKC0xMCwgMCwgMCwgMCwgd2VpZ2h0LCBiSXRhbGljLCAwLCAwLCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgT1VUX1RUX09OTFlfUFJFQ0lTLCAwLCAwLCBzdWJzdF9waXRjaF9mYW1pbHksIGZhY2UpOworICByZXR1cm4gaEZvbnQ7CiB9Ci1GWF9CT09MIENGWF9XaW4zMkZvbnRJbmZvOjpHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCi17Ci0gICAgY2hhciBmYWNlYnVmWzEwMF07Ci0gICAgSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIChIRk9OVCloRm9udCk7Ci0gICAgaW50IHJldCA9IDo6R2V0VGV4dEZhY2VBKG1faERDLCAxMDAsIGZhY2VidWYpOwotICAgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBoT2xkRm9udCk7Ci0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbmFtZSA9IGZhY2VidWY7Ci0gICAgcmV0dXJuIFRSVUU7Cit2b2lkIENGWF9XaW4zMkZvbnRJbmZvOjpEZWxldGVGb250KHZvaWQqIGhGb250KSB7CisgIDo6RGVsZXRlT2JqZWN0KGhGb250KTsKIH0KLUZYX0JPT0wgQ0ZYX1dpbjMyRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpCi17Ci0gICAgVEVYVE1FVFJJQyB0bTsKLSAgICBIRk9OVCBoT2xkRm9udCA9IChIRk9OVCk6OlNlbGVjdE9iamVjdChtX2hEQywgKEhGT05UKWhGb250KTsKLSAgICA6OkdldFRleHRNZXRyaWNzKG1faERDLCAmdG0pOwotICAgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBoT2xkRm9udCk7Ci0gICAgY2hhcnNldCA9IHRtLnRtQ2hhclNldDsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUlGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkKLXsKLSAgICByZXR1cm4gbmV3IENGWF9XaW4zMkZvbnRJbmZvOwotfQotdm9pZCBDRlhfR0VNb2R1bGU6OkluaXRQbGF0Zm9ybSgpCi17Ci0gICAgQ1dpbjMyUGxhdGZvcm0qIHBQbGF0Zm9ybURhdGEgPSBGWF9ORVcgQ1dpbjMyUGxhdGZvcm07Ci0gICAgaWYgKCFwUGxhdGZvcm1EYXRhKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgT1NWRVJTSU9OSU5GTyB2ZXI7Ci0gICAgdmVyLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YodmVyKTsKLSAgICBHZXRWZXJzaW9uRXgoJnZlcik7Ci0gICAgcFBsYXRmb3JtRGF0YS0+bV9iSGFsZlRvbmUgPSB2ZXIuZHdNYWpvclZlcnNpb24gPj0gNTsKLSAgICBwUGxhdGZvcm1EYXRhLT5tX0dkaXBsdXNFeHQuTG9hZCgpOwotICAgIG1fcFBsYXRmb3JtRGF0YSA9IHBQbGF0Zm9ybURhdGE7Ci0gICAgbV9wRm9udE1nci0+U2V0U3lzdGVtRm9udEluZm8oSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkpOwotfQotdm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3lQbGF0Zm9ybSgpCi17Ci0gICAgZGVsZXRlIChDV2luMzJQbGF0Zm9ybSopbV9wUGxhdGZvcm1EYXRhOwotICAgIG1fcFBsYXRmb3JtRGF0YSA9IE5VTEw7Ci19Ci1DR2RpRGV2aWNlRHJpdmVyOjpDR2RpRGV2aWNlRHJpdmVyKEhEQyBoREMsIGludCBkZXZpY2VfY2xhc3MpCi17Ci0gICAgbV9oREMgPSBoREM7Ci0gICAgbV9EZXZpY2VDbGFzcyA9IGRldmljZV9jbGFzczsKLSAgICBDV2luMzJQbGF0Zm9ybSogcFBsYXRmb3JtID0gKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKTsKLSAgICBTZXRTdHJldGNoQmx0TW9kZShoREMsIHBQbGF0Zm9ybS0+bV9iSGFsZlRvbmUgPyBIQUxGVE9ORSA6IENPTE9ST05DT0xPUik7Ci0gICAgaWYgKEdldE9iamVjdFR5cGUobV9oREMpID09IE9CSl9NRU1EQykgewotICAgICAgICBIQklUTUFQIGhCaXRtYXAgPSBDcmVhdGVCaXRtYXAoMSwgMSwgMSwgMSwgTlVMTCk7Ci0gICAgICAgIGhCaXRtYXAgPSAoSEJJVE1BUClTZWxlY3RPYmplY3QobV9oREMsIGhCaXRtYXApOwotICAgICAgICBCSVRNQVAgYml0bWFwOwotICAgICAgICBHZXRPYmplY3QoaEJpdG1hcCwgc2l6ZW9mIGJpdG1hcCwgJmJpdG1hcCk7Ci0gICAgICAgIG1fbkJpdHNQZXJQaXhlbCA9IGJpdG1hcC5ibUJpdHNQaXhlbDsKLSAgICAgICAgbV9XaWR0aCA9IGJpdG1hcC5ibVdpZHRoOwotICAgICAgICBtX0hlaWdodCA9IGFicyhiaXRtYXAuYm1IZWlnaHQpOwotICAgICAgICBoQml0bWFwID0gKEhCSVRNQVApU2VsZWN0T2JqZWN0KG1faERDLCBoQml0bWFwKTsKLSAgICAgICAgRGVsZXRlT2JqZWN0KGhCaXRtYXApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fbkJpdHNQZXJQaXhlbCA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgQklUU1BJWEVMKTsKLSAgICAgICAgbV9XaWR0aCA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgSE9SWlJFUyk7Ci0gICAgICAgIG1fSGVpZ2h0ID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBWRVJUUkVTKTsKLSAgICB9Ci0gICAgaWYgKG1fRGV2aWNlQ2xhc3MgIT0gRlhEQ19ESVNQTEFZKSB7Ci0gICAgICAgIG1fUmVuZGVyQ2FwcyA9IEZYUkNfQklUX01BU0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9SZW5kZXJDYXBzID0gRlhSQ19HRVRfQklUUyB8IEZYUkNfQklUX01BU0s7Ci0gICAgfQotfQotaW50IENHZGlEZXZpY2VEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpCi17Ci0gICAgc3dpdGNoIChjYXBzX2lkKSB7Ci0gICAgICAgIGNhc2UgRlhEQ19ERVZJQ0VfQ0xBU1M6Ci0gICAgICAgICAgICByZXR1cm4gbV9EZXZpY2VDbGFzczsKLSAgICAgICAgY2FzZSBGWERDX1BJWEVMX1dJRFRIOgotICAgICAgICAgICAgcmV0dXJuIG1fV2lkdGg7Ci0gICAgICAgIGNhc2UgRlhEQ19QSVhFTF9IRUlHSFQ6Ci0gICAgICAgICAgICByZXR1cm4gbV9IZWlnaHQ7Ci0gICAgICAgIGNhc2UgRlhEQ19CSVRTX1BJWEVMOgotICAgICAgICAgICAgcmV0dXJuIG1fbkJpdHNQZXJQaXhlbDsKLSAgICAgICAgY2FzZSBGWERDX1JFTkRFUl9DQVBTOgotICAgICAgICAgICAgcmV0dXJuIG1fUmVuZGVyQ2FwczsKLSAgICB9CitGWF9EV09SRCBDRlhfV2luMzJGb250SW5mbzo6R2V0Rm9udERhdGEodm9pZCogaEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUpIHsKKyAgSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIChIRk9OVCloRm9udCk7CisgIHRhYmxlID0gRlhEV09SRF9GUk9NX01TQkZJUlNUKHRhYmxlKTsKKyAgc2l6ZSA9IDo6R2V0Rm9udERhdGEobV9oREMsIHRhYmxlLCAwLCBidWZmZXIsIHNpemUpOworICA6OlNlbGVjdE9iamVjdChtX2hEQywgaE9sZEZvbnQpOworICBpZiAoc2l6ZSA9PSBHRElfRVJST1IpIHsKICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gc2l6ZTsKIH0KLXZvaWQqIENHZGlEZXZpY2VEcml2ZXI6OkdldENsaXBSZ24oKQotewotICAgIEhSR04gaENsaXBSZ24gPSBDcmVhdGVSZWN0UmduKDAsIDAsIDEsIDEpOwotICAgIGlmICg6OkdldENsaXBSZ24obV9oREMsIGhDbGlwUmduKSA9PSAwKSB7Ci0gICAgICAgIERlbGV0ZU9iamVjdChoQ2xpcFJnbik7Ci0gICAgICAgIGhDbGlwUmduID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuICh2b2lkKiloQ2xpcFJnbjsKK0ZYX0JPT0wgQ0ZYX1dpbjMyRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgeworICBjaGFyIGZhY2VidWZbMTAwXTsKKyAgSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIChIRk9OVCloRm9udCk7CisgIGludCByZXQgPSA6OkdldFRleHRGYWNlQShtX2hEQywgMTAwLCBmYWNlYnVmKTsKKyAgOjpTZWxlY3RPYmplY3QobV9oREMsIGhPbGRGb250KTsKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG5hbWUgPSBmYWNlYnVmOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6R0RJX1NldERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG1fRGV2aWNlQ2xhc3MgPT0gRlhEQ19QUklOVEVSKSB7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHBCaXRtYXAxLT5GbGlwSW1hZ2UoRkFMU0UsIFRSVUUpOwotICAgICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChwQml0bWFwLT5Jc0NteWtJbWFnZSgpIHx8IHBJY2NUcmFuc2Zvcm0pICYmCi0gICAgICAgICAgICAgICAgIXBCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfUmdiLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGludCB3aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBoZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7Ci0gICAgICAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgICAgIExQQllURSBwQnVmZmVyID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGluZm8gPSBDRlhfV2luZG93c0RJQjo6R2V0Qml0bWFwSW5mbyhwQml0bWFwKTsKLSAgICAgICAgKChCSVRNQVBJTkZPSEVBREVSKilpbmZvLmNfc3RyKCkpLT5iaUhlaWdodCAqPSAtMTsKLSAgICAgICAgRlhfUkVDVCBkc3RfcmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgZHN0X3JlY3QuSW50ZXJzZWN0KDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgICAgICAgaW50IGRzdF93aWR0aCA9IGRzdF9yZWN0LldpZHRoKCk7Ci0gICAgICAgIGludCBkc3RfaGVpZ2h0ID0gZHN0X3JlY3QuSGVpZ2h0KCk7Ci0gICAgICAgIDo6U3RyZXRjaERJQml0cyhtX2hEQywgbGVmdCwgdG9wLCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsCi0gICAgICAgICAgICAwLCAwLCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsIHBCdWZmZXIsIChCSVRNQVBJTkZPKilpbmZvLmNfc3RyKCksIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKLSAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDE7Ci0gICAgICAgIGlmICgocEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSB8fCBwSWNjVHJhbnNmb3JtKSAmJgotICAgICAgICAgICAgICAgIChwQml0bWFwID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYiwgTlVMTCwgcEljY1RyYW5zZm9ybSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpbnQgd2lkdGggPSBwU3JjUmVjdC0+V2lkdGgoKSwgaGVpZ2h0ID0gcFNyY1JlY3QtPkhlaWdodCgpOwotICAgICAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwotICAgICAgICBMUEJZVEUgcEJ1ZmZlciA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gQ0ZYX1dpbmRvd3NESUI6OkdldEJpdG1hcEluZm8ocEJpdG1hcCk7Ci0gICAgICAgIDo6U2V0RElCaXRzVG9EZXZpY2UobV9oREMsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcFNyY1JlY3QtPmxlZnQsIHBCaXRtYXAtPkdldEhlaWdodCgpIC0gcFNyY1JlY3QtPmJvdHRvbSwKLSAgICAgICAgICAgIDAsIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQnVmZmVyLCAoQklUTUFQSU5GTyopaW5mby5jX3N0cigpLCBESUJfUkdCX0NPTE9SUyk7Ci0gICAgICAgIGlmIChwQml0bWFwICE9IHBCaXRtYXAxKSB7Ci0gICAgICAgICAgICBkZWxldGUgcEJpdG1hcDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ0ZYX1dpbjMyRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIHsKKyAgVEVYVE1FVFJJQyB0bTsKKyAgSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIChIRk9OVCloRm9udCk7CisgIDo6R2V0VGV4dE1ldHJpY3MobV9oREMsICZ0bSk7CisgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBoT2xkRm9udCk7CisgIGNoYXJzZXQgPSB0bS50bUNoYXJTZXQ7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpHRElfU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGZsYWdzLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IChDRlhfRElCaXRtYXAqKXBCaXRtYXAxOwotICAgIGlmIChwQml0bWFwID09IE5VTEwgfHwgZGVzdF93aWR0aCA9PSAwICB8fCBkZXN0X2hlaWdodCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0lGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkgeworICByZXR1cm4gbmV3IENGWF9XaW4zMkZvbnRJbmZvOworfQordm9pZCBDRlhfR0VNb2R1bGU6OkluaXRQbGF0Zm9ybSgpIHsKKyAgQ1dpbjMyUGxhdGZvcm0qIHBQbGF0Zm9ybURhdGEgPSBGWF9ORVcgQ1dpbjMyUGxhdGZvcm07CisgIGlmICghcFBsYXRmb3JtRGF0YSkgeworICAgIHJldHVybjsKKyAgfQorICBPU1ZFUlNJT05JTkZPIHZlcjsKKyAgdmVyLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YodmVyKTsKKyAgR2V0VmVyc2lvbkV4KCZ2ZXIpOworICBwUGxhdGZvcm1EYXRhLT5tX2JIYWxmVG9uZSA9IHZlci5kd01ham9yVmVyc2lvbiA+PSA1OworICBwUGxhdGZvcm1EYXRhLT5tX0dkaXBsdXNFeHQuTG9hZCgpOworICBtX3BQbGF0Zm9ybURhdGEgPSBwUGxhdGZvcm1EYXRhOworICBtX3BGb250TWdyLT5TZXRTeXN0ZW1Gb250SW5mbyhJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQoKSk7Cit9Cit2b2lkIENGWF9HRU1vZHVsZTo6RGVzdHJveVBsYXRmb3JtKCkgeworICBkZWxldGUgKENXaW4zMlBsYXRmb3JtKiltX3BQbGF0Zm9ybURhdGE7CisgIG1fcFBsYXRmb3JtRGF0YSA9IE5VTEw7Cit9CitDR2RpRGV2aWNlRHJpdmVyOjpDR2RpRGV2aWNlRHJpdmVyKEhEQyBoREMsIGludCBkZXZpY2VfY2xhc3MpIHsKKyAgbV9oREMgPSBoREM7CisgIG1fRGV2aWNlQ2xhc3MgPSBkZXZpY2VfY2xhc3M7CisgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPQorICAgICAgKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKTsKKyAgU2V0U3RyZXRjaEJsdE1vZGUoaERDLCBwUGxhdGZvcm0tPm1fYkhhbGZUb25lID8gSEFMRlRPTkUgOiBDT0xPUk9OQ09MT1IpOworICBpZiAoR2V0T2JqZWN0VHlwZShtX2hEQykgPT0gT0JKX01FTURDKSB7CisgICAgSEJJVE1BUCBoQml0bWFwID0gQ3JlYXRlQml0bWFwKDEsIDEsIDEsIDEsIE5VTEwpOworICAgIGhCaXRtYXAgPSAoSEJJVE1BUClTZWxlY3RPYmplY3QobV9oREMsIGhCaXRtYXApOworICAgIEJJVE1BUCBiaXRtYXA7CisgICAgR2V0T2JqZWN0KGhCaXRtYXAsIHNpemVvZiBiaXRtYXAsICZiaXRtYXApOworICAgIG1fbkJpdHNQZXJQaXhlbCA9IGJpdG1hcC5ibUJpdHNQaXhlbDsKKyAgICBtX1dpZHRoID0gYml0bWFwLmJtV2lkdGg7CisgICAgbV9IZWlnaHQgPSBhYnMoYml0bWFwLmJtSGVpZ2h0KTsKKyAgICBoQml0bWFwID0gKEhCSVRNQVApU2VsZWN0T2JqZWN0KG1faERDLCBoQml0bWFwKTsKKyAgICBEZWxldGVPYmplY3QoaEJpdG1hcCk7CisgIH0gZWxzZSB7CisgICAgbV9uQml0c1BlclBpeGVsID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBCSVRTUElYRUwpOworICAgIG1fV2lkdGggPSA6OkdldERldmljZUNhcHMobV9oREMsIEhPUlpSRVMpOworICAgIG1fSGVpZ2h0ID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBWRVJUUkVTKTsKKyAgfQorICBpZiAobV9EZXZpY2VDbGFzcyAhPSBGWERDX0RJU1BMQVkpIHsKKyAgICBtX1JlbmRlckNhcHMgPSBGWFJDX0JJVF9NQVNLOworICB9IGVsc2UgeworICAgIG1fUmVuZGVyQ2FwcyA9IEZYUkNfR0VUX0JJVFMgfCBGWFJDX0JJVF9NQVNLOworICB9Cit9CitpbnQgQ0dkaURldmljZURyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgeworICBzd2l0Y2ggKGNhcHNfaWQpIHsKKyAgICBjYXNlIEZYRENfREVWSUNFX0NMQVNTOgorICAgICAgcmV0dXJuIG1fRGV2aWNlQ2xhc3M7CisgICAgY2FzZSBGWERDX1BJWEVMX1dJRFRIOgorICAgICAgcmV0dXJuIG1fV2lkdGg7CisgICAgY2FzZSBGWERDX1BJWEVMX0hFSUdIVDoKKyAgICAgIHJldHVybiBtX0hlaWdodDsKKyAgICBjYXNlIEZYRENfQklUU19QSVhFTDoKKyAgICAgIHJldHVybiBtX25CaXRzUGVyUGl4ZWw7CisgICAgY2FzZSBGWERDX1JFTkRFUl9DQVBTOgorICAgICAgcmV0dXJuIG1fUmVuZGVyQ2FwczsKKyAgfQorICByZXR1cm4gMDsKK30KK3ZvaWQqIENHZGlEZXZpY2VEcml2ZXI6OkdldENsaXBSZ24oKSB7CisgIEhSR04gaENsaXBSZ24gPSBDcmVhdGVSZWN0UmduKDAsIDAsIDEsIDEpOworICBpZiAoOjpHZXRDbGlwUmduKG1faERDLCBoQ2xpcFJnbikgPT0gMCkgeworICAgIERlbGV0ZU9iamVjdChoQ2xpcFJnbik7CisgICAgaENsaXBSZ24gPSBOVUxMOworICB9CisgIHJldHVybiAodm9pZCopaENsaXBSZ247Cit9CitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TZXRESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKG1fRGV2aWNlQ2xhc3MgPT0gRlhEQ19QUklOVEVSKSB7CisgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gcEJpdG1hcDEtPkZsaXBJbWFnZShGQUxTRSwgVFJVRSk7CisgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoKHBCaXRtYXAtPklzQ215a0ltYWdlKCkgfHwgcEljY1RyYW5zZm9ybSkgJiYKLSAgICAgICAgICAgICFwQml0bWFwLT5Db252ZXJ0Rm9ybWF0KEZYRElCX1JnYiwgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAhcEJpdG1hcC0+Q29udmVydEZvcm1hdChGWERJQl9SZ2IsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQorICAgIGludCB3aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBoZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7CisgICAgaW50IHBpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKKyAgICBMUEJZVEUgcEJ1ZmZlciA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwogICAgIENGWF9CeXRlU3RyaW5nIGluZm8gPSBDRlhfV2luZG93c0RJQjo6R2V0Qml0bWFwSW5mbyhwQml0bWFwKTsKLSAgICBpZiAoKGludDY0X3QpYWJzKGRlc3Rfd2lkdGgpICogYWJzKGRlc3RfaGVpZ2h0KSA8IChpbnQ2NF90KXBCaXRtYXAxLT5HZXRXaWR0aCgpICogcEJpdG1hcDEtPkdldEhlaWdodCgpICogNCB8fAotICAgICAgICAgICAgKGZsYWdzICYgRlhESUJfSU5URVJQT0wpIHx8IChmbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpKSB7Ci0gICAgICAgIFNldFN0cmV0Y2hCbHRNb2RlKG1faERDLCBIQUxGVE9ORSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU2V0U3RyZXRjaEJsdE1vZGUobV9oREMsIENPTE9ST05DT0xPUik7Ci0gICAgfQotICAgIENGWF9ESUJpdG1hcCogcFRvU3RyZWNoQml0bWFwID0gcEJpdG1hcDsKLSAgICBib29sIGRlbCA9IGZhbHNlOwotICAgIGlmIChtX0RldmljZUNsYXNzID09IEZYRENfUFJJTlRFUiAmJiAoKGludDY0X3QpcEJpdG1hcC0+R2V0V2lkdGgoKSAqIHBCaXRtYXAtPkdldEhlaWdodCgpID4gKGludDY0X3QpYWJzKGRlc3Rfd2lkdGgpICogYWJzKGRlc3RfaGVpZ2h0KSkpIHsKLSAgICAgICAgcFRvU3RyZWNoQml0bWFwID0gcEJpdG1hcC0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKLSAgICAgICAgZGVsID0gdHJ1ZTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdG9TdHJlY2hCaXRtYXBJbmZvID0gQ0ZYX1dpbmRvd3NESUI6OkdldEJpdG1hcEluZm8ocFRvU3RyZWNoQml0bWFwKTsKLSAgICA6OlN0cmV0Y2hESUJpdHMobV9oREMsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAwLCAwLCBwVG9TdHJlY2hCaXRtYXAtPkdldFdpZHRoKCksIHBUb1N0cmVjaEJpdG1hcC0+R2V0SGVpZ2h0KCksIHBUb1N0cmVjaEJpdG1hcC0+R2V0QnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgIChCSVRNQVBJTkZPKil0b1N0cmVjaEJpdG1hcEluZm8uY19zdHIoKSwgRElCX1JHQl9DT0xPUlMsIFNSQ0NPUFkpOwotICAgIGlmIChkZWwpIHsKLSAgICAgICAgZGVsZXRlIHBUb1N0cmVjaEJpdG1hcDsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGJpdG1hcF9jb2xvciwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQoteworICAgICgoQklUTUFQSU5GT0hFQURFUiopaW5mby5jX3N0cigpKS0+YmlIZWlnaHQgKj0gLTE7CisgICAgRlhfUkVDVCBkc3RfcmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBkc3RfcmVjdC5JbnRlcnNlY3QoMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOworICAgIGludCBkc3Rfd2lkdGggPSBkc3RfcmVjdC5XaWR0aCgpOworICAgIGludCBkc3RfaGVpZ2h0ID0gZHN0X3JlY3QuSGVpZ2h0KCk7CisgICAgOjpTdHJldGNoRElCaXRzKG1faERDLCBsZWZ0LCB0b3AsIGRzdF93aWR0aCwgZHN0X2hlaWdodCwgMCwgMCwgZHN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICBkc3RfaGVpZ2h0LCBwQnVmZmVyLCAoQklUTUFQSU5GTyopaW5mby5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisgICAgZGVsZXRlIHBCaXRtYXA7CisgIH0gZWxzZSB7CiAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDE7Ci0gICAgaWYgKHBCaXRtYXAgPT0gTlVMTCB8fCBkZXN0X3dpZHRoID09IDAgIHx8IGRlc3RfaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICgocEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSB8fCBwSWNjVHJhbnNmb3JtKSAmJgorICAgICAgICAocEJpdG1hcCA9IHBCaXRtYXAtPkNsb25lQ29udmVydChGWERJQl9SZ2IsIE5VTEwsIHBJY2NUcmFuc2Zvcm0pKSA9PQorICAgICAgICAgICAgTlVMTCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBfQ29sb3IyQXJnYihiaXRtYXBfY29sb3IsIGJpdG1hcF9jb2xvciwgYWxwaGFfZmxhZyB8ICgxIDw8IDI0KSwgcEljY1RyYW5zZm9ybSk7Ci0gICAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKSwgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgQklUTUFQSU5GT0hFQURFUglibWlIZWFkZXI7Ci0gICAgICAgIEZYX0RXT1JECQkJYm1pQ29sb3JzWzJdOwotICAgIH0gYm1pOwotICAgIEZYU1lTX21lbXNldCgmYm1pLmJtaUhlYWRlciwgMCwgc2l6ZW9mIChCSVRNQVBJTkZPSEVBREVSKSk7Ci0gICAgYm1pLmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gICAgYm1pLmJtaUhlYWRlci5iaUJpdENvdW50ID0gMTsKLSAgICBibWkuYm1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7Ci0gICAgYm1pLmJtaUhlYWRlci5iaUhlaWdodCA9IC1oZWlnaHQ7Ci0gICAgYm1pLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7Ci0gICAgYm1pLmJtaUhlYWRlci5iaVdpZHRoID0gd2lkdGg7Ci0gICAgaWYgKG1fbkJpdHNQZXJQaXhlbCAhPSAxKSB7Ci0gICAgICAgIFNldFN0cmV0Y2hCbHRNb2RlKG1faERDLCBIQUxGVE9ORSk7CisgICAgaW50IHdpZHRoID0gcFNyY1JlY3QtPldpZHRoKCksIGhlaWdodCA9IHBTcmNSZWN0LT5IZWlnaHQoKTsKKyAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOworICAgIExQQllURSBwQnVmZmVyID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgaW5mbyA9IENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKHBCaXRtYXApOworICAgIDo6U2V0RElCaXRzVG9EZXZpY2UobV9oREMsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcFNyY1JlY3QtPmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRIZWlnaHQoKSAtIHBTcmNSZWN0LT5ib3R0b20sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRIZWlnaHQoKSwgcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChCSVRNQVBJTkZPKilpbmZvLmNfc3RyKCksIERJQl9SR0JfQ09MT1JTKTsKKyAgICBpZiAocEJpdG1hcCAhPSBwQml0bWFwMSkgeworICAgICAgZGVsZXRlIHBCaXRtYXA7CiAgICAgfQotICAgIGJtaS5ibWlDb2xvcnNbMF0gPSAweGZmZmZmZjsKLSAgICBibWkuYm1pQ29sb3JzWzFdID0gMDsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6R0RJX1N0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwMTsKKyAgaWYgKHBCaXRtYXAgPT0gTlVMTCB8fCBkZXN0X3dpZHRoID09IDAgfHwgZGVzdF9oZWlnaHQgPT0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoKHBCaXRtYXAtPklzQ215a0ltYWdlKCkgfHwgcEljY1RyYW5zZm9ybSkgJiYKKyAgICAgICFwQml0bWFwLT5Db252ZXJ0Rm9ybWF0KEZYRElCX1JnYiwgcEljY1RyYW5zZm9ybSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgaW5mbyA9IENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKHBCaXRtYXApOworICBpZiAoKGludDY0X3QpYWJzKGRlc3Rfd2lkdGgpICogYWJzKGRlc3RfaGVpZ2h0KSA8CisgICAgICAgICAgKGludDY0X3QpcEJpdG1hcDEtPkdldFdpZHRoKCkgKiBwQml0bWFwMS0+R2V0SGVpZ2h0KCkgKiA0IHx8CisgICAgICAoZmxhZ3MgJiBGWERJQl9JTlRFUlBPTCkgfHwgKGZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkpIHsKKyAgICBTZXRTdHJldGNoQmx0TW9kZShtX2hEQywgSEFMRlRPTkUpOworICB9IGVsc2UgeworICAgIFNldFN0cmV0Y2hCbHRNb2RlKG1faERDLCBDT0xPUk9OQ09MT1IpOworICB9CisgIENGWF9ESUJpdG1hcCogcFRvU3RyZWNoQml0bWFwID0gcEJpdG1hcDsKKyAgYm9vbCBkZWwgPSBmYWxzZTsKKyAgaWYgKG1fRGV2aWNlQ2xhc3MgPT0gRlhEQ19QUklOVEVSICYmCisgICAgICAoKGludDY0X3QpcEJpdG1hcC0+R2V0V2lkdGgoKSAqIHBCaXRtYXAtPkdldEhlaWdodCgpID4KKyAgICAgICAoaW50NjRfdClhYnMoZGVzdF93aWR0aCkgKiBhYnMoZGVzdF9oZWlnaHQpKSkgeworICAgIHBUb1N0cmVjaEJpdG1hcCA9IHBCaXRtYXAtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7CisgICAgZGVsID0gdHJ1ZTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyB0b1N0cmVjaEJpdG1hcEluZm8gPQorICAgICAgQ0ZYX1dpbmRvd3NESUI6OkdldEJpdG1hcEluZm8ocFRvU3RyZWNoQml0bWFwKTsKKyAgOjpTdHJldGNoRElCaXRzKG1faERDLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgIHBUb1N0cmVjaEJpdG1hcC0+R2V0V2lkdGgoKSwgcFRvU3RyZWNoQml0bWFwLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgIHBUb1N0cmVjaEJpdG1hcC0+R2V0QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAoQklUTUFQSU5GTyopdG9TdHJlY2hCaXRtYXBJbmZvLmNfc3RyKCksIERJQl9SR0JfQ09MT1JTLAorICAgICAgICAgICAgICAgICAgU1JDQ09QWSk7CisgIGlmIChkZWwpIHsKKyAgICBkZWxldGUgcFRvU3RyZWNoQml0bWFwOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpHRElfU3RyZXRjaEJpdE1hc2soY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJpdG1hcF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IChDRlhfRElCaXRtYXAqKXBCaXRtYXAxOworICBpZiAocEJpdG1hcCA9PSBOVUxMIHx8IGRlc3Rfd2lkdGggPT0gMCB8fCBkZXN0X2hlaWdodCA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIF9Db2xvcjJBcmdiKGJpdG1hcF9jb2xvciwgYml0bWFwX2NvbG9yLCBhbHBoYV9mbGFnIHwgKDEgPDwgMjQpLAorICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKKyAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKSwgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIHN0cnVjdCB7CisgICAgQklUTUFQSU5GT0hFQURFUiBibWlIZWFkZXI7CisgICAgRlhfRFdPUkQgYm1pQ29sb3JzWzJdOworICB9IGJtaTsKKyAgRlhTWVNfbWVtc2V0KCZibWkuYm1pSGVhZGVyLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOworICBibWkuYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgYm1pLmJtaUhlYWRlci5iaUJpdENvdW50ID0gMTsKKyAgYm1pLmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOworICBibWkuYm1pSGVhZGVyLmJpSGVpZ2h0ID0gLWhlaWdodDsKKyAgYm1pLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7CisgIGJtaS5ibWlIZWFkZXIuYmlXaWR0aCA9IHdpZHRoOworICBpZiAobV9uQml0c1BlclBpeGVsICE9IDEpIHsKKyAgICBTZXRTdHJldGNoQmx0TW9kZShtX2hEQywgSEFMRlRPTkUpOworICB9CisgIGJtaS5ibWlDb2xvcnNbMF0gPSAweGZmZmZmZjsKKyAgYm1pLmJtaUNvbG9yc1sxXSA9IDA7CiAKLSAgICBIQlJVU0ggaFBhdHRlcm4gPSBDcmVhdGVTb2xpZEJydXNoKGJpdG1hcF9jb2xvciAmIDB4ZmZmZmZmKTsNCi0gICAgSEJSVVNIIGhPbGQgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChtX2hEQywgaFBhdHRlcm4pOw0KLQ0KLSAgICANCi0gICAgLy8gSW4gUERGLCB3aGVuIGltYWdlIG1hc2sgaXMgMSwgdXNlIGRldmljZSBiaXRtYXA7IHdoZW4gbWFzayBpcyAwLCB1c2UgYnJ1c2ggYml0bWFwLg0KLSAgICAvLyBBIGNvbXBsZXRlIGxpc3Qgb2YgdGhlIGJvb2xlbiBvcGVyYXRpb25zIGlzIGFzIGZvbGxvd3M6DQotDQotICAgIC8qIFAoYml0bWFwX2NvbG9yKSAgICBTKEltYWdlTWFzaykgICAgRChEZXZpY2VCaXRtYXApICAgIFJlc3VsdA0KLSAgICAgKiAgICAgICAgMCAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAwDQotICAgICAqICAgICAgICAwICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgIDANCi0gICAgICogICAgICAgIDAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMA0KLSAgICAgKiAgICAgICAgMCAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAxDQotICAgICAqICAgICAgICAxICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgIDENCi0gICAgICogICAgICAgIDEgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMQ0KLSAgICAgKiAgICAgICAgMSAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAwDQotICAgICAqICAgICAgICAxICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgIDENCi0gICAgICovDQotICAgIC8vIFRoZSBib29sZW4gY29kZXMgaXMgQjguIEJhc2VkIG9uIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9hYTkzMjEwNi5hc3B4LCB0aGUgUk9QMyBjb2RlIGlzIDB4QjgwNzRBDQotDQotICAgIDo6U3RyZXRjaERJQml0cyhtX2hEQywgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsDQotICAgICAgICAgICAgICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBwQml0bWFwLT5HZXRCdWZmZXIoKSwgKEJJVE1BUElORk8qKSZibWksIERJQl9SR0JfQ09MT1JTLCAweEI4MDc0QSk7DQotDQotICAgIFNlbGVjdE9iamVjdChtX2hEQywgaE9sZCk7DQotICAgIERlbGV0ZU9iamVjdChoUGF0dGVybik7CisgIEhCUlVTSCBoUGF0dGVybiA9IENyZWF0ZVNvbGlkQnJ1c2goYml0bWFwX2NvbG9yICYgMHhmZmZmZmYpOworICBIQlJVU0ggaE9sZCA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KG1faERDLCBoUGF0dGVybik7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgLy8gSW4gUERGLCB3aGVuIGltYWdlIG1hc2sgaXMgMSwgdXNlIGRldmljZSBiaXRtYXA7IHdoZW4gbWFzayBpcyAwLCB1c2UgYnJ1c2gKKyAgLy8gYml0bWFwLgorICAvLyBBIGNvbXBsZXRlIGxpc3Qgb2YgdGhlIGJvb2xlbiBvcGVyYXRpb25zIGlzIGFzIGZvbGxvd3M6CisKKyAgLyogUChiaXRtYXBfY29sb3IpICAgIFMoSW1hZ2VNYXNrKSAgICBEKERldmljZUJpdG1hcCkgICAgUmVzdWx0CisgICAqICAgICAgICAwICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgIDAKKyAgICogICAgICAgIDAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMAorICAgKiAgICAgICAgMCAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAwCisgICAqICAgICAgICAwICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgIDEKKyAgICogICAgICAgIDEgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMQorICAgKiAgICAgICAgMSAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAxCisgICAqICAgICAgICAxICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgIDAKKyAgICogICAgICAgIDEgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMQorICAgKi8KKyAgLy8gVGhlIGJvb2xlbiBjb2RlcyBpcyBCOC4gQmFzZWQgb24KKyAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2FhOTMyMTA2LmFzcHgsIHRoZSBST1AzIGNvZGUgaXMKKyAgLy8gMHhCODA3NEEKKworICA6OlN0cmV0Y2hESUJpdHMobV9oREMsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCAwLCAwLAorICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcEJpdG1hcC0+R2V0QnVmZmVyKCksIChCSVRNQVBJTkZPKikmYm1pLAorICAgICAgICAgICAgICAgICAgRElCX1JHQl9DT0xPUlMsIDB4QjgwNzRBKTsKKworICBTZWxlY3RPYmplY3QobV9oREMsIGhPbGQpOworICBEZWxldGVPYmplY3QoaFBhdHRlcm4pOworCisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KQotewotICAgIHJldHVybiA6OkdldENsaXBCb3gobV9oREMsIChSRUNUKilwUmVjdCk7CitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpIHsKKyAgcmV0dXJuIDo6R2V0Q2xpcEJveChtX2hEQywgKFJFQ1QqKXBSZWN0KTsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6U2V0Q2xpcFJnbih2b2lkKiBoUmduKQotewotICAgIDo6U2VsZWN0Q2xpcFJnbihtX2hEQywgKEhSR04paFJnbik7Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OlNldENsaXBSZ24odm9pZCogaFJnbikgeworICA6OlNlbGVjdENsaXBSZ24obV9oREMsIChIUkdOKWhSZ24pOworICByZXR1cm4gVFJVRTsKIH0KLXN0YXRpYyBIUEVOIF9DcmVhdGVQZW4oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgYXJnYikKLXsKLSAgICBGWF9GTE9BVCB3aWR0aDsKLSAgICBGWF9GTE9BVCBzY2FsZSA9IDEuZjsKLSAgICBpZiAocE1hdHJpeCkKLSAgICAgICAgc2NhbGUgPSBGWFNZU19mYWJzKHBNYXRyaXgtPmEpID4gRlhTWVNfZmFicyhwTWF0cml4LT5iKSA/Ci0gICAgICAgICAgICAgICAgRlhTWVNfZmFicyhwTWF0cml4LT5hKSA6IEZYU1lTX2ZhYnMocE1hdHJpeC0+Yik7Ci0gICAgaWYgKHBHcmFwaFN0YXRlKSB7Ci0gICAgICAgIHdpZHRoID0gc2NhbGUgKiBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGg7CitzdGF0aWMgSFBFTiBfQ3JlYXRlUGVuKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IpIHsKKyAgRlhfRkxPQVQgd2lkdGg7CisgIEZYX0ZMT0FUIHNjYWxlID0gMS5mOworICBpZiAocE1hdHJpeCkKKyAgICBzY2FsZSA9IEZYU1lTX2ZhYnMocE1hdHJpeC0+YSkgPiBGWFNZU19mYWJzKHBNYXRyaXgtPmIpCisgICAgICAgICAgICAgICAgPyBGWFNZU19mYWJzKHBNYXRyaXgtPmEpCisgICAgICAgICAgICAgICAgOiBGWFNZU19mYWJzKHBNYXRyaXgtPmIpOworICBpZiAocEdyYXBoU3RhdGUpIHsKKyAgICB3aWR0aCA9IHNjYWxlICogcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoOworICB9IGVsc2UgeworICAgIHdpZHRoID0gMS4wZjsKKyAgfQorICBGWF9EV09SRCBQZW5TdHlsZSA9IFBTX0dFT01FVFJJQzsKKyAgaWYgKHdpZHRoIDwgMSkgeworICAgIHdpZHRoID0gMTsKKyAgfQorICBpZiAocEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KSB7CisgICAgUGVuU3R5bGUgfD0gUFNfVVNFUlNUWUxFOworICB9IGVsc2UgeworICAgIFBlblN0eWxlIHw9IFBTX1NPTElEOworICB9CisgIHN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgeworICAgIGNhc2UgMDoKKyAgICAgIFBlblN0eWxlIHw9IFBTX0VORENBUF9GTEFUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgUGVuU3R5bGUgfD0gUFNfRU5EQ0FQX1JPVU5EOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgUGVuU3R5bGUgfD0gUFNfRU5EQ0FQX1NRVUFSRTsKKyAgICAgIGJyZWFrOworICB9CisgIHN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUpvaW4pIHsKKyAgICBjYXNlIDA6CisgICAgICBQZW5TdHlsZSB8PSBQU19KT0lOX01JVEVSOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgUGVuU3R5bGUgfD0gUFNfSk9JTl9ST1VORDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIFBlblN0eWxlIHw9IFBTX0pPSU5fQkVWRUw7CisgICAgICBicmVhazsKKyAgfQorICBpbnQgYTsKKyAgRlhfQ09MT1JSRUYgcmdiOworICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHJnYik7CisgIExPR0JSVVNIIGxiOworICBsYi5sYkNvbG9yID0gcmdiOworICBsYi5sYlN0eWxlID0gQlNfU09MSUQ7CisgIGxiLmxiSGF0Y2ggPSAwOworICBGWF9EV09SRCogcERhc2ggPSBOVUxMOworICBpZiAocEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KSB7CisgICAgcERhc2ggPSBGWF9BbGxvYyhGWF9EV09SRCwgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudDsgaSsrKSB7CisgICAgICBwRGFzaFtpXSA9IEZYU1lTX3JvdW5kKAorICAgICAgICAgIHBNYXRyaXggPyBwTWF0cml4LT5UcmFuc2Zvcm1EaXN0YW5jZShwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaV0pCisgICAgICAgICAgICAgICAgICA6IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpXSk7CisgICAgICBpZiAocERhc2hbaV0gPCAxKSB7CisgICAgICAgIHBEYXNoW2ldID0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgSFBFTiBoUGVuID0gRXh0Q3JlYXRlUGVuKFBlblN0eWxlLCAoRFdPUkQpRlhTWVNfY2VpbCh3aWR0aCksICZsYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCwgKGNvbnN0IERXT1JEKilwRGFzaCk7CisgIGlmIChwRGFzaCkgeworICAgIEZYX0ZyZWUocERhc2gpOworICB9CisgIHJldHVybiBoUGVuOworfQorc3RhdGljIEhCUlVTSCBfQ3JlYXRlQnJ1c2goRlhfRFdPUkQgYXJnYikgeworICBpbnQgYTsKKyAgRlhfQ09MT1JSRUYgcmdiOworICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHJnYik7CisgIHJldHVybiBDcmVhdGVTb2xpZEJydXNoKHJnYik7Cit9CitzdGF0aWMgdm9pZCBfU2V0UGF0aFRvREMoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KSB7CisgIEJlZ2luUGF0aChoREMpOworICBpbnQgblBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOworICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50cygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Qb2ludHM7IGkrKykgeworICAgIEZYX0ZMT0FUIHBvc3ggPSBwUG9pbnRzW2ldLm1fUG9pbnRYLCBwb3N5ID0gcFBvaW50c1tpXS5tX1BvaW50WTsKKyAgICBpZiAocE1hdHJpeCkgeworICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtKHBvc3gsIHBvc3kpOworICAgIH0KKyAgICBpbnQgc2NyZWVuX3ggPSBGWFNZU19yb3VuZChwb3N4KSwgc2NyZWVuX3kgPSBGWFNZU19yb3VuZChwb3N5KTsKKyAgICBpbnQgcG9pbnRfdHlwZSA9IHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFOworICAgIGlmIChwb2ludF90eXBlID09IFBUX01PVkVUTykgeworICAgICAgTW92ZVRvRXgoaERDLCBzY3JlZW5feCwgc2NyZWVuX3ksIE5VTEwpOworICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBQVF9MSU5FVE8pIHsKKyAgICAgIGlmIChwUG9pbnRzW2ldLm1fUG9pbnRZID09IHBQb2ludHNbaSAtIDFdLm1fUG9pbnRZICYmCisgICAgICAgICAgcFBvaW50c1tpXS5tX1BvaW50WCA9PSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WCkgeworICAgICAgICBzY3JlZW5feCsrOworICAgICAgfQorICAgICAgTGluZVRvKGhEQywgc2NyZWVuX3gsIHNjcmVlbl95KTsKKyAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gUFRfQkVaSUVSVE8pIHsKKyAgICAgIFBPSU5UIGxwcHRbM107CisgICAgICBscHB0WzBdLnggPSBzY3JlZW5feDsKKyAgICAgIGxwcHRbMF0ueSA9IHNjcmVlbl95OworICAgICAgcG9zeCA9IHBQb2ludHNbaSArIDFdLm1fUG9pbnRYOworICAgICAgcG9zeSA9IHBQb2ludHNbaSArIDFdLm1fUG9pbnRZOworICAgICAgaWYgKHBNYXRyaXgpIHsKKyAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtKHBvc3gsIHBvc3kpOworICAgICAgfQorICAgICAgbHBwdFsxXS54ID0gRlhTWVNfcm91bmQocG9zeCk7CisgICAgICBscHB0WzFdLnkgPSBGWFNZU19yb3VuZChwb3N5KTsKKyAgICAgIHBvc3ggPSBwUG9pbnRzW2kgKyAyXS5tX1BvaW50WDsKKyAgICAgIHBvc3kgPSBwUG9pbnRzW2kgKyAyXS5tX1BvaW50WTsKKyAgICAgIGlmIChwTWF0cml4KSB7CisgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybShwb3N4LCBwb3N5KTsKKyAgICAgIH0KKyAgICAgIGxwcHRbMl0ueCA9IEZYU1lTX3JvdW5kKHBvc3gpOworICAgICAgbHBwdFsyXS55ID0gRlhTWVNfcm91bmQocG9zeSk7CisgICAgICBQb2x5QmV6aWVyVG8oaERDLCBscHB0LCAzKTsKKyAgICAgIGkgKz0gMjsKKyAgICB9CisgICAgaWYgKHBQb2ludHNbaV0ubV9GbGFnICYgUFRfQ0xPU0VGSUdVUkUpIHsKKyAgICAgIENsb3NlRmlndXJlKGhEQyk7CisgICAgfQorICB9CisgIEVuZFBhdGgoaERDKTsKK30KK3ZvaWQgQ0dkaURldmljZURyaXZlcjo6RHJhd0xpbmUoRlhfRkxPQVQgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIpIHsKKyAgaW50IGZsYWcxID0gKHgxIDwgMCkgfCAoKHgxID4gbV9XaWR0aCkgPDwgMSkgfCAoKHkxIDwgMCkgPDwgMikgfAorICAgICAgICAgICAgICAoKHkxID4gbV9IZWlnaHQpIDw8IDMpOworICBpbnQgZmxhZzIgPSAoeDIgPCAwKSB8ICgoeDIgPiBtX1dpZHRoKSA8PCAxKSB8ICgoeTIgPCAwKSA8PCAyKSB8CisgICAgICAgICAgICAgICgoeTIgPiBtX0hlaWdodCkgPDwgMyk7CisgIGlmIChmbGFnMSAmIGZsYWcyKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChmbGFnMSB8fCBmbGFnMikgeworICAgIGFnZzo6cmVjdF9iYXNlPEZYX0ZMT0FUPiByZWN0KDAuMGYsIDAuMGYsIChGWF9GTE9BVCkobV9XaWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCkpOworICAgIEZYX0ZMT0FUIHhbMl0sIHlbMl07CisgICAgaW50IG5wID0gYWdnOjpjbGlwX2xpYW5nX2JhcnNreTxGWF9GTE9BVD4oeDEsIHkxLCB4MiwgeTIsIHJlY3QsIHgsIHkpOworICAgIGlmIChucCA9PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChucCA9PSAxKSB7CisgICAgICB4MiA9IHhbMF07CisgICAgICB5MiA9IHlbMF07CiAgICAgfSBlbHNlIHsKLSAgICAgICAgd2lkdGggPSAxLjBmOworICAgICAgeDEgPSB4WzBdOworICAgICAgeTEgPSB5WzBdOworICAgICAgeDIgPSB4W25wIC0gMV07CisgICAgICB5MiA9IHlbbnAgLSAxXTsKICAgICB9Ci0gICAgRlhfRFdPUkQgUGVuU3R5bGUgPSBQU19HRU9NRVRSSUM7Ci0gICAgaWYgKHdpZHRoIDwgMSkgewotICAgICAgICB3aWR0aCA9IDE7Ci0gICAgfQotICAgIGlmKHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCkgewotICAgICAgICBQZW5TdHlsZSB8PSBQU19VU0VSU1RZTEU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUGVuU3R5bGUgfD0gUFNfU09MSUQ7Ci0gICAgfQotICAgIHN3aXRjaChwR3JhcGhTdGF0ZS0+bV9MaW5lQ2FwKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIFBlblN0eWxlIHw9IFBTX0VORENBUF9GTEFUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIFBlblN0eWxlIHw9IFBTX0VORENBUF9ST1VORDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBQZW5TdHlsZSB8PSBQU19FTkRDQVBfU1FVQVJFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN3aXRjaChwR3JhcGhTdGF0ZS0+bV9MaW5lSm9pbikgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBQZW5TdHlsZSB8PSBQU19KT0lOX01JVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIFBlblN0eWxlIHw9IFBTX0pPSU5fUk9VTkQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgUGVuU3R5bGUgfD0gUFNfSk9JTl9CRVZFTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpbnQgYTsKLSAgICBGWF9DT0xPUlJFRiByZ2I7Ci0gICAgQXJnYkRlY29kZShhcmdiLCBhLCByZ2IpOwotICAgIExPR0JSVVNIIGxiOwotICAgIGxiLmxiQ29sb3IgPSByZ2I7Ci0gICAgbGIubGJTdHlsZSA9IEJTX1NPTElEOwotICAgIGxiLmxiSGF0Y2ggPSAwOwotICAgIEZYX0RXT1JEKiBwRGFzaCA9IE5VTEw7Ci0gICAgaWYgKHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCkgewotICAgICAgICBwRGFzaCA9IEZYX0FsbG9jKEZYX0RXT1JELCBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudDsgaSArKykgewotICAgICAgICAgICAgcERhc2hbaV0gPSBGWFNZU19yb3VuZChwTWF0cml4ID8gcE1hdHJpeC0+VHJhbnNmb3JtRGlzdGFuY2UocEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2ldKSA6IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpXSk7Ci0gICAgICAgICAgICBpZiAocERhc2hbaV0gPCAxKSB7Ci0gICAgICAgICAgICAgICAgcERhc2hbaV0gPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEhQRU4gaFBlbiA9IEV4dENyZWF0ZVBlbihQZW5TdHlsZSwgKERXT1JEKUZYU1lTX2NlaWwod2lkdGgpLCAmbGIsIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCwgKGNvbnN0IERXT1JEKilwRGFzaCk7Ci0gICAgaWYgKHBEYXNoKSB7Ci0gICAgICAgIEZYX0ZyZWUocERhc2gpOwotICAgIH0KLSAgICByZXR1cm4gaFBlbjsKKyAgfQorICBNb3ZlVG9FeChtX2hEQywgRlhTWVNfcm91bmQoeDEpLCBGWFNZU19yb3VuZCh5MSksIE5VTEwpOworICBMaW5lVG8obV9oREMsIEZYU1lTX3JvdW5kKHgyKSwgRlhTWVNfcm91bmQoeTIpKTsKIH0KLXN0YXRpYyBIQlJVU0ggX0NyZWF0ZUJydXNoKEZYX0RXT1JEIGFyZ2IpCi17Ci0gICAgaW50IGE7Ci0gICAgRlhfQ09MT1JSRUYgcmdiOwotICAgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgcmdiKTsKLSAgICByZXR1cm4gQ3JlYXRlU29saWRCcnVzaChyZ2IpOwotfQotc3RhdGljIHZvaWQgX1NldFBhdGhUb0RDKEhEQyBoREMsIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KQotewotICAgIEJlZ2luUGF0aChoREMpOwotICAgIGludCBuUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7Ci0gICAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgblBvaW50czsgaSsrKSB7Ci0gICAgICAgIEZYX0ZMT0FUIHBvc3ggPSBwUG9pbnRzW2ldLm1fUG9pbnRYLCBwb3N5ID0gcFBvaW50c1tpXS5tX1BvaW50WTsKLSAgICAgICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybShwb3N4LCBwb3N5KTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc2NyZWVuX3ggPSBGWFNZU19yb3VuZChwb3N4KSwgc2NyZWVuX3kgPSBGWFNZU19yb3VuZChwb3N5KTsKLSAgICAgICAgaW50IHBvaW50X3R5cGUgPSBwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfVFlQRTsKLSAgICAgICAgaWYocG9pbnRfdHlwZSA9PSBQVF9NT1ZFVE8pIHsKLSAgICAgICAgICAgIE1vdmVUb0V4KGhEQywgc2NyZWVuX3gsIHNjcmVlbl95LCBOVUxMKTsKLSAgICAgICAgfSBlbHNlIGlmKHBvaW50X3R5cGUgPT0gUFRfTElORVRPKSB7Ci0gICAgICAgICAgICBpZiAocFBvaW50c1tpXS5tX1BvaW50WSA9PSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WSAmJiBwUG9pbnRzW2ldLm1fUG9pbnRYID09IHBQb2ludHNbaSAtIDFdLm1fUG9pbnRYKSB7Ci0gICAgICAgICAgICAgICAgc2NyZWVuX3ggKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaW5lVG8oaERDLCBzY3JlZW5feCwgc2NyZWVuX3kpOwotICAgICAgICB9IGVsc2UgaWYocG9pbnRfdHlwZSA9PSBQVF9CRVpJRVJUTykgewotICAgICAgICAgICAgUE9JTlQgbHBwdFszXTsKLSAgICAgICAgICAgIGxwcHRbMF0ueCA9IHNjcmVlbl94OwotICAgICAgICAgICAgbHBwdFswXS55ID0gc2NyZWVuX3k7Ci0gICAgICAgICAgICBwb3N4ID0gcFBvaW50c1tpICsgMV0ubV9Qb2ludFg7Ci0gICAgICAgICAgICBwb3N5ID0gcFBvaW50c1tpICsgMV0ubV9Qb2ludFk7Ci0gICAgICAgICAgICBpZiAocE1hdHJpeCkgewotICAgICAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybShwb3N4LCBwb3N5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxwcHRbMV0ueCA9IEZYU1lTX3JvdW5kKHBvc3gpOwotICAgICAgICAgICAgbHBwdFsxXS55ID0gRlhTWVNfcm91bmQocG9zeSk7Ci0gICAgICAgICAgICBwb3N4ID0gcFBvaW50c1tpICsgMl0ubV9Qb2ludFg7Ci0gICAgICAgICAgICBwb3N5ID0gcFBvaW50c1tpICsgMl0ubV9Qb2ludFk7Ci0gICAgICAgICAgICBpZiAocE1hdHJpeCkgewotICAgICAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybShwb3N4LCBwb3N5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxwcHRbMl0ueCA9IEZYU1lTX3JvdW5kKHBvc3gpOwotICAgICAgICAgICAgbHBwdFsyXS55ID0gRlhTWVNfcm91bmQocG9zeSk7Ci0gICAgICAgICAgICBQb2x5QmV6aWVyVG8oaERDLCBscHB0LCAzKTsKLSAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgfQotICAgICAgICBpZiAocFBvaW50c1tpXS5tX0ZsYWcgJiBQVF9DTE9TRUZJR1VSRSkgewotICAgICAgICAgICAgQ2xvc2VGaWd1cmUoaERDKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBFbmRQYXRoKGhEQyk7Ci19Ci12b2lkIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyKQotewotICAgIGludCBmbGFnMSA9ICh4MSA8IDApIHwgKCh4MSA+IG1fV2lkdGgpIDw8IDEpIHwgKCh5MSA8IDApIDw8IDIpIHwgKCh5MSA+IG1fSGVpZ2h0KSA8PCAzKTsKLSAgICBpbnQgZmxhZzIgPSAoeDIgPCAwKSB8ICgoeDIgPiBtX1dpZHRoKSA8PCAxKSB8ICgoeTIgPCAwKSA8PCAyKSB8ICgoeTIgPiBtX0hlaWdodCkgPDwgMyk7Ci0gICAgaWYgKGZsYWcxICYgZmxhZzIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZmxhZzEgfHwgZmxhZzIpIHsKLSAgICAgICAgYWdnOjpyZWN0X2Jhc2U8RlhfRkxPQVQ+IHJlY3QoMC4wZiwgMC4wZiwgKEZYX0ZMT0FUKShtX1dpZHRoKSwgKEZYX0ZMT0FUKShtX0hlaWdodCkpOwotICAgICAgICBGWF9GTE9BVCB4WzJdLCB5WzJdOwotICAgICAgICBpbnQgbnAgPSBhZ2c6OmNsaXBfbGlhbmdfYmFyc2t5PEZYX0ZMT0FUPih4MSwgeTEsIHgyLCB5MiwgcmVjdCwgeCwgeSk7Ci0gICAgICAgIGlmIChucCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5wID09IDEpIHsKLSAgICAgICAgICAgIHgyID0geFswXTsKLSAgICAgICAgICAgIHkyID0geVswXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHgxID0geFswXTsKLSAgICAgICAgICAgIHkxID0geVswXTsKLSAgICAgICAgICAgIHgyID0geFtucCAtIDFdOwotICAgICAgICAgICAgeTIgPSB5W25wIC0gMV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgTW92ZVRvRXgobV9oREMsIEZYU1lTX3JvdW5kKHgxKSwgRlhTWVNfcm91bmQoeTEpLCBOVUxMKTsKLSAgICBMaW5lVG8obV9oREMsIEZYU1lTX3JvdW5kKHgyKSwgRlhTWVNfcm91bmQoeTIpKTsKLX0KLXN0YXRpYyBGWF9CT09MIF9NYXRyaXhOb1NjYWxlZChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KQotewotICAgIHJldHVybiBwTWF0cml4LT5HZXRBKCkgPT0gMS4wZiAmJiBwTWF0cml4LT5HZXRCKCkgPT0gMCAmJiBwTWF0cml4LT5HZXRDKCkgPT0gMCAmJiBwTWF0cml4LT5HZXREKCkgPT0gMS4wZjsKK3N0YXRpYyBGWF9CT09MIF9NYXRyaXhOb1NjYWxlZChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KSB7CisgIHJldHVybiBwTWF0cml4LT5HZXRBKCkgPT0gMS4wZiAmJiBwTWF0cml4LT5HZXRCKCkgPT0gMCAmJgorICAgICAgICAgcE1hdHJpeC0+R2V0QygpID09IDAgJiYgcE1hdHJpeC0+R2V0RCgpID09IDEuMGY7CiB9CiBGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LApAQCAtNzY0LDQ1NSArODAxLDUyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50CWJsZW5kX3R5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIF9Db2xvcjJBcmdiKGZpbGxfY29sb3IsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOworICBfQ29sb3IyQXJnYihzdHJva2VfY29sb3IsIHN0cm9rZV9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPQorICAgICAgKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKTsKKyAgaWYgKChwR3JhcGhTdGF0ZSA9PSBOVUxMIHx8IHN0cm9rZV9jb2xvciA9PSAwKSAmJgorICAgICAgIXBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKKyAgICBDRlhfRmxvYXRSZWN0IGJib3hfZiA9IHBQYXRoRGF0YS0+R2V0Qm91bmRpbmdCb3goKTsKKyAgICBpZiAocE1hdHJpeCkgeworICAgICAgYmJveF9mLlRyYW5zZm9ybShwTWF0cml4KTsKICAgICB9Ci0gICAgX0NvbG9yMkFyZ2IoZmlsbF9jb2xvciwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZyB8ICgxIDw8IDI0KSwgcEljY1RyYW5zZm9ybSk7Ci0gICAgX0NvbG9yMkFyZ2Ioc3Ryb2tlX2NvbG9yLCBzdHJva2VfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPSAoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpOwotICAgIGlmICgocEdyYXBoU3RhdGUgPT0gTlVMTCB8fCBzdHJva2VfY29sb3IgPT0gMCkgJiYgIXBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCBiYm94X2YgPSBwUGF0aERhdGEtPkdldEJvdW5kaW5nQm94KCk7Ci0gICAgICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgICAgICBiYm94X2YuVHJhbnNmb3JtKHBNYXRyaXgpOworICAgIEZYX1JFQ1QgYmJveCA9IGJib3hfZi5HZXRJbm5lclJlY3QoKTsKKyAgICBpZiAoYmJveC5XaWR0aCgpIDw9IDApIHsKKyAgICAgIHJldHVybiBEcmF3Q29zbWV0aWNMaW5lKChGWF9GTE9BVCkoYmJveC5sZWZ0KSwgKEZYX0ZMT0FUKShiYm94LnRvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGJib3gubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGJib3guYm90dG9tICsgMSksIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBGWERJQl9CTEVORF9OT1JNQUwpOworICAgIH0gZWxzZSBpZiAoYmJveC5IZWlnaHQoKSA8PSAwKSB7CisgICAgICByZXR1cm4gRHJhd0Nvc21ldGljTGluZSgoRlhfRkxPQVQpKGJib3gubGVmdCksIChGWF9GTE9BVCkoYmJveC50b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShiYm94LnJpZ2h0ICsgMSksIChGWF9GTE9BVCkoYmJveC50b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCk7CisgICAgfQorICB9CisgIGludCBmaWxsX2FscGhhID0gRlhBUkdCX0EoZmlsbF9jb2xvcik7CisgIGludCBzdHJva2VfYWxwaGEgPSBGWEFSR0JfQShzdHJva2VfY29sb3IpOworICBGWF9CT09MIGJEcmF3QWxwaGEgPSAoZmlsbF9hbHBoYSA+IDAgJiYgZmlsbF9hbHBoYSA8IDI1NSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0cm9rZV9hbHBoYSA+IDAgJiYgc3Ryb2tlX2FscGhhIDwgMjU1ICYmIHBHcmFwaFN0YXRlKTsKKyAgaWYgKCFwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpICYmIGJEcmF3QWxwaGEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKKyAgICBpZiAoYkRyYXdBbHBoYSB8fAorICAgICAgICAoKG1fRGV2aWNlQ2xhc3MgIT0gRlhEQ19QUklOVEVSICYmICEoZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUikpIHx8CisgICAgICAgICAocEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KSkpIHsKKyAgICAgIGlmICghKChOVUxMID09IHBNYXRyaXggfHwgX01hdHJpeE5vU2NhbGVkKHBNYXRyaXgpKSAmJiBwR3JhcGhTdGF0ZSAmJgorICAgICAgICAgICAgcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoID09IDEuZiAmJgorICAgICAgICAgICAgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUgfHwKKyAgICAgICAgICAgICBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSA0KSAmJgorICAgICAgICAgICAgcFBhdGhEYXRhLT5Jc1JlY3QoKSkpIHsKKyAgICAgICAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LkRyYXdQYXRoKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhcGhTdGF0ZSwgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlKSkgeworICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9Ci0gICAgICAgIEZYX1JFQ1QgYmJveCA9IGJib3hfZi5HZXRJbm5lclJlY3QoKTsKLSAgICAgICAgaWYgKGJib3guV2lkdGgoKSA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRHJhd0Nvc21ldGljTGluZSgoRlhfRkxPQVQpKGJib3gubGVmdCksIChGWF9GTE9BVCkoYmJveC50b3ApLCAoRlhfRkxPQVQpKGJib3gubGVmdCksIChGWF9GTE9BVCkoYmJveC5ib3R0b20gKyAxKSwgZmlsbF9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIEZYRElCX0JMRU5EX05PUk1BTCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmJveC5IZWlnaHQoKSA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRHJhd0Nvc21ldGljTGluZSgoRlhfRkxPQVQpKGJib3gubGVmdCksIChGWF9GTE9BVCkoYmJveC50b3ApLCAoRlhfRkxPQVQpKGJib3gucmlnaHQgKyAxKSwgKEZYX0ZMT0FUKShiYm94LnRvcCksIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIGludCBmaWxsX2FscGhhID0gRlhBUkdCX0EoZmlsbF9jb2xvcik7Ci0gICAgaW50IHN0cm9rZV9hbHBoYSA9IEZYQVJHQl9BKHN0cm9rZV9jb2xvcik7Ci0gICAgRlhfQk9PTCBiRHJhd0FscGhhID0gKGZpbGxfYWxwaGEgPiAwICYmIGZpbGxfYWxwaGEgPCAyNTUpIHx8IChzdHJva2VfYWxwaGEgPiAwICYmIHN0cm9rZV9hbHBoYSA8IDI1NSAmJiBwR3JhcGhTdGF0ZSk7Ci0gICAgaWYgKCFwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpICYmIGJEcmF3QWxwaGEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBvbGRfZmlsbF9tb2RlID0gZmlsbF9tb2RlOworICBmaWxsX21vZGUgJj0gMzsKKyAgSFBFTiBoUGVuID0gTlVMTDsKKyAgSEJSVVNIIGhCcnVzaCA9IE5VTEw7CisgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYWxwaGEpIHsKKyAgICBTZXRNaXRlckxpbWl0KG1faERDLCBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0LCBOVUxMKTsKKyAgICBoUGVuID0gX0NyZWF0ZVBlbihwR3JhcGhTdGF0ZSwgcE1hdHJpeCwgc3Ryb2tlX2NvbG9yKTsKKyAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKKyAgfQorICBpZiAoZmlsbF9tb2RlICYmIGZpbGxfYWxwaGEpIHsKKyAgICBTZXRQb2x5RmlsbE1vZGUobV9oREMsIGZpbGxfbW9kZSk7CisgICAgaEJydXNoID0gX0NyZWF0ZUJydXNoKGZpbGxfY29sb3IpOworICAgIGhCcnVzaCA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KG1faERDLCBoQnJ1c2gpOworICB9CisgIGlmIChwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSAyICYmIHBHcmFwaFN0YXRlICYmCisgICAgICBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQpIHsKKyAgICBGWF9GTE9BVCB4MSA9IHBQYXRoRGF0YS0+R2V0UG9pbnRYKDApLCB5MSA9IHBQYXRoRGF0YS0+R2V0UG9pbnRZKDApOworICAgIGlmIChwTWF0cml4KSB7CisgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0oeDEsIHkxKTsKICAgICB9Ci0gICAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgaWYgKGJEcmF3QWxwaGEgfHwgKChtX0RldmljZUNsYXNzICE9IEZYRENfUFJJTlRFUiAmJiAhKGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIpKSB8fCAocEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KSkpIHsKLSAgICAgICAgICAgIGlmICggISgoTlVMTCA9PSBwTWF0cml4IHx8IF9NYXRyaXhOb1NjYWxlZChwTWF0cml4KSkgJiYKLSAgICAgICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoID09IDEuZiAmJgotICAgICAgICAgICAgICAgICAgICAocFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNSB8fCBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSA0KSAmJgotICAgICAgICAgICAgICAgICAgICBwUGF0aERhdGEtPklzUmVjdCgpKSApIHsKLSAgICAgICAgICAgICAgICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuRHJhd1BhdGgobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCwgcEdyYXBoU3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBGWF9GTE9BVCB4MiA9IHBQYXRoRGF0YS0+R2V0UG9pbnRYKDEpLCB5MiA9IHBQYXRoRGF0YS0+R2V0UG9pbnRZKDEpOworICAgIGlmIChwTWF0cml4KSB7CisgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0oeDIsIHkyKTsKICAgICB9Ci0gICAgaW50IG9sZF9maWxsX21vZGUgPSBmaWxsX21vZGU7Ci0gICAgZmlsbF9tb2RlICY9IDM7Ci0gICAgSFBFTiBoUGVuID0gTlVMTDsKLSAgICBIQlJVU0ggaEJydXNoID0gTlVMTDsKKyAgICBEcmF3TGluZSh4MSwgeTEsIHgyLCB5Mik7CisgIH0gZWxzZSB7CisgICAgX1NldFBhdGhUb0RDKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgpOwogICAgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYWxwaGEpIHsKLSAgICAgICAgU2V0TWl0ZXJMaW1pdChtX2hEQywgcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCwgTlVMTCk7Ci0gICAgICAgIGhQZW4gPSBfQ3JlYXRlUGVuKHBHcmFwaFN0YXRlLCBwTWF0cml4LCBzdHJva2VfY29sb3IpOwotICAgICAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKLSAgICB9Ci0gICAgaWYgKGZpbGxfbW9kZSAmJiBmaWxsX2FscGhhKSB7Ci0gICAgICAgIFNldFBvbHlGaWxsTW9kZShtX2hEQywgZmlsbF9tb2RlKTsKLSAgICAgICAgaEJydXNoID0gX0NyZWF0ZUJydXNoKGZpbGxfY29sb3IpOwotICAgICAgICBoQnJ1c2ggPSAoSEJSVVNIKVNlbGVjdE9iamVjdChtX2hEQywgaEJydXNoKTsKLSAgICB9Ci0gICAgaWYgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDIgJiYgcEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KSB7Ci0gICAgICAgIEZYX0ZMT0FUIHgxID0gcFBhdGhEYXRhLT5HZXRQb2ludFgoMCksIHkxID0gcFBhdGhEYXRhLT5HZXRQb2ludFkoMCk7Ci0gICAgICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0oeDEsIHkxKTsKKyAgICAgIGlmIChmaWxsX21vZGUgJiYgZmlsbF9hbHBoYSkgeworICAgICAgICBpZiAob2xkX2ZpbGxfbW9kZSAmIEZYX0ZJTExfVEVYVF9NT0RFKSB7CisgICAgICAgICAgU3Ryb2tlQW5kRmlsbFBhdGgobV9oREMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEZpbGxQYXRoKG1faERDKTsKKyAgICAgICAgICBfU2V0UGF0aFRvREMobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCk7CisgICAgICAgICAgU3Ryb2tlUGF0aChtX2hEQyk7CiAgICAgICAgIH0KLSAgICAgICAgRlhfRkxPQVQgeDIgPSBwUGF0aERhdGEtPkdldFBvaW50WCgxKSwgeTIgPSBwUGF0aERhdGEtPkdldFBvaW50WSgxKTsKLSAgICAgICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybSh4MiwgeTIpOwotICAgICAgICB9Ci0gICAgICAgIERyYXdMaW5lKHgxLCB5MSwgeDIsIHkyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBfU2V0UGF0aFRvREMobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCk7Ci0gICAgICAgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYWxwaGEpIHsKLSAgICAgICAgICAgIGlmIChmaWxsX21vZGUgJiYgZmlsbF9hbHBoYSkgewotICAgICAgICAgICAgICAgIGlmIChvbGRfZmlsbF9tb2RlICYgRlhfRklMTF9URVhUX01PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3Ryb2tlQW5kRmlsbFBhdGgobV9oREMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGxQYXRoKG1faERDKTsKLSAgICAgICAgICAgICAgICAgICAgX1NldFBhdGhUb0RDKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgpOwotICAgICAgICAgICAgICAgICAgICBTdHJva2VQYXRoKG1faERDKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cm9rZVBhdGgobV9oREMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGZpbGxfbW9kZSAmJiBmaWxsX2FscGhhKSB7Ci0gICAgICAgICAgICBGaWxsUGF0aChtX2hEQyk7Ci0gICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFN0cm9rZVBhdGgobV9oREMpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmlsbF9tb2RlICYmIGZpbGxfYWxwaGEpIHsKKyAgICAgIEZpbGxQYXRoKG1faERDKTsKICAgICB9Ci0gICAgaWYgKGhQZW4pIHsKLSAgICAgICAgaFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChtX2hEQywgaFBlbik7Ci0gICAgICAgIERlbGV0ZU9iamVjdChoUGVuKTsKLSAgICB9Ci0gICAgaWYgKGhCcnVzaCkgewotICAgICAgICBoQnJ1c2ggPSAoSEJSVVNIKVNlbGVjdE9iamVjdChtX2hEQywgaEJydXNoKTsKLSAgICAgICAgRGVsZXRlT2JqZWN0KGhCcnVzaCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIF9Db2xvcjJBcmdiKGZpbGxfY29sb3IsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOwotICAgIGludCBhbHBoYTsKLSAgICBGWF9DT0xPUlJFRiByZ2I7Ci0gICAgQXJnYkRlY29kZShmaWxsX2NvbG9yLCBhbHBoYSwgcmdiKTsKLSAgICBpZiAoYWxwaGEgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKGFscGhhIDwgMjU1KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgSEJSVVNIIGhCcnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2gocmdiKTsKLSAgICA6OkZpbGxSZWN0KG1faERDLCAoUkVDVCopcFJlY3QsIGhCcnVzaCk7CisgIH0KKyAgaWYgKGhQZW4pIHsKKyAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKKyAgICBEZWxldGVPYmplY3QoaFBlbik7CisgIH0KKyAgaWYgKGhCcnVzaCkgeworICAgIGhCcnVzaCA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KG1faERDLCBoQnJ1c2gpOwogICAgIERlbGV0ZU9iamVjdChoQnJ1c2gpOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBfQ29sb3IyQXJnYihmaWxsX2NvbG9yLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnIHwgKDEgPDwgMjQpLCBwSWNjVHJhbnNmb3JtKTsKKyAgaW50IGFscGhhOworICBGWF9DT0xPUlJFRiByZ2I7CisgIEFyZ2JEZWNvZGUoZmlsbF9jb2xvciwgYWxwaGEsIHJnYik7CisgIGlmIChhbHBoYSA9PSAwKSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGFscGhhIDwgMjU1KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEhCUlVTSCBoQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKHJnYik7CisgIDo6RmlsbFJlY3QobV9oREMsIChSRUNUKilwUmVjdCwgaEJydXNoKTsKKyAgRGVsZXRlT2JqZWN0KGhCcnVzaCk7CisgIHJldHVybiBUUlVFOwogfQogRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICBpbnQgZmlsbF9tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgaWYgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUpIHsKLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ZjsKLSAgICAgICAgaWYgKHBQYXRoRGF0YS0+SXNSZWN0KHBNYXRyaXgsICZyZWN0ZikpIHsKLSAgICAgICAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKLSAgICAgICAgICAgIEludGVyc2VjdENsaXBSZWN0KG1faERDLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSkgeworICBpZiAocFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNSkgeworICAgIENGWF9GbG9hdFJlY3QgcmVjdGY7CisgICAgaWYgKHBQYXRoRGF0YS0+SXNSZWN0KHBNYXRyaXgsICZyZWN0ZikpIHsKKyAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKKyAgICAgIEludGVyc2VjdENsaXBSZWN0KG1faERDLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgX1NldFBhdGhUb0RDKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgpOwotICAgIFNldFBvbHlGaWxsTW9kZShtX2hEQywgZmlsbF9tb2RlICYgMyk7Ci0gICAgU2VsZWN0Q2xpcFBhdGgobV9oREMsIFJHTl9BTkQpOwotICAgIHJldHVybiBUUlVFOworICB9CisgIF9TZXRQYXRoVG9EQyhtX2hEQywgcFBhdGhEYXRhLCBwTWF0cml4KTsKKyAgU2V0UG9seUZpbGxNb2RlKG1faERDLCBmaWxsX21vZGUgJiAzKTsKKyAgU2VsZWN0Q2xpcFBhdGgobV9oREMsIFJHTl9BTkQpOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBIUEVOIGhQZW4gPSBfQ3JlYXRlUGVuKHBHcmFwaFN0YXRlLCBwTWF0cml4LCAweGZmMDAwMDAwKTsKLSAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKLSAgICBfU2V0UGF0aFRvREMobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCk7Ci0gICAgV2lkZW5QYXRoKG1faERDKTsKLSAgICBTZXRQb2x5RmlsbE1vZGUobV9oREMsIFdJTkRJTkcpOwotICAgIEZYX0JPT0wgcmV0ID0gU2VsZWN0Q2xpcFBhdGgobV9oREMsIFJHTl9BTkQpOwotICAgIGhQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QobV9oREMsIGhQZW4pOwotICAgIERlbGV0ZU9iamVjdChoUGVuKTsKLSAgICByZXR1cm4gcmV0OworRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoCisgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKSB7CisgIEhQRU4gaFBlbiA9IF9DcmVhdGVQZW4ocEdyYXBoU3RhdGUsIHBNYXRyaXgsIDB4ZmYwMDAwMDApOworICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKKyAgX1NldFBhdGhUb0RDKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgpOworICBXaWRlblBhdGgobV9oREMpOworICBTZXRQb2x5RmlsbE1vZGUobV9oREMsIFdJTkRJTkcpOworICBGWF9CT09MIHJldCA9IFNlbGVjdENsaXBQYXRoKG1faERDLCBSR05fQU5EKTsKKyAgaFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChtX2hEQywgaFBlbik7CisgIERlbGV0ZU9iamVjdChoUGVuKTsKKyAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQJYmxlbmRfdHlwZSkKLXsKLSAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBfQ29sb3IyQXJnYihjb2xvciwgY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOwotICAgIGludCBhOwotICAgIEZYX0NPTE9SUkVGIHJnYjsKLSAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByZ2IpOwotICAgIGlmIChhID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIEhQRU4gaFBlbiA9IENyZWF0ZVBlbihQU19TT0xJRCwgMSwgcmdiKTsKLSAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKLSAgICBNb3ZlVG9FeChtX2hEQywgRlhTWVNfcm91bmQoeDEpLCBGWFNZU19yb3VuZCh5MSksIE5VTEwpOwotICAgIExpbmVUbyhtX2hEQywgRlhTWVNfcm91bmQoeDIpLCBGWFNZU19yb3VuZCh5MikpOwotICAgIGhQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QobV9oREMsIGhQZW4pOwotICAgIERlbGV0ZU9iamVjdChoUGVuKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6RGVsZXRlRGV2aWNlUmduKHZvaWQqIHBSZ24pCi17Ci0gICAgRGVsZXRlT2JqZWN0KChIR0RJT0JKKXBSZ24pOwotICAgIHJldHVybiBUUlVFOwotfQotQ0dkaURpc3BsYXlEcml2ZXI6OkNHZGlEaXNwbGF5RHJpdmVyKEhEQyBoREMpIDogQ0dkaURldmljZURyaXZlcihoREMsIEZYRENfRElTUExBWSkKLXsKLSAgICBDV2luMzJQbGF0Zm9ybSogcFBsYXRmb3JtID0gKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKTsKLSAgICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuSXNBdmFpbGFibGUoKSkgewotICAgICAgICBtX1JlbmRlckNhcHMgfD0gRlhSQ19BTFBIQV9QQVRIIHwgRlhSQ19BTFBIQV9JTUFHRTsKLSAgICB9Ci19Ci1GWF9CT09MIENHZGlEaXNwbGF5RHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSwgRlhfQk9PTCBiREVkZ2UpCi17Ci0gICAgRlhfQk9PTCByZXQgPSBGQUxTRTsKLSAgICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwotICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICBIQklUTUFQIGhibXAgPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwKG1faERDLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBIREMgaERDTWVtb3J5ID0gQ3JlYXRlQ29tcGF0aWJsZURDKG1faERDKTsKLSAgICBIQklUTUFQIGhvbGRibXAgID0gKEhCSVRNQVApU2VsZWN0T2JqZWN0KGhEQ01lbW9yeSwgaGJtcCk7Ci0gICAgQml0Qmx0KGhEQ01lbW9yeSwgMCwgMCwgd2lkdGgsIGhlaWdodCwgbV9oREMsIGxlZnQsIHRvcCwgU1JDQ09QWSk7Ci0gICAgU2VsZWN0T2JqZWN0KGhEQ01lbW9yeSwgaG9sZGJtcCk7Ci0gICAgQklUTUFQSU5GTyBibWk7Ci0gICAgRlhTWVNfbWVtc2V0KCZibWksIDAsIHNpemVvZiBibWkpOwotICAgIGJtaS5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mIGJtaS5ibWlIZWFkZXI7Ci0gICAgYm1pLmJtaUhlYWRlci5iaUJpdENvdW50ID0gcEJpdG1hcC0+R2V0QlBQKCk7Ci0gICAgYm1pLmJtaUhlYWRlci5iaUhlaWdodCA9IC1oZWlnaHQ7Ci0gICAgYm1pLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7Ci0gICAgYm1pLmJtaUhlYWRlci5iaVdpZHRoID0gd2lkdGg7Ci0gICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8ICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewotICAgICAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID4gOCAmJiAhcEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSAmJiBwSWNjVHJhbnNmb3JtID09IE5VTEwpIHsKLSAgICAgICAgcmV0ID0gOjpHZXRESUJpdHMoaERDTWVtb3J5LCBoYm1wLCAwLCBoZWlnaHQsIHBCaXRtYXAtPkdldEJ1ZmZlcigpLCAmYm1pLCBESUJfUkdCX0NPTE9SUykgPT0gaGVpZ2h0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7Ci0gICAgICAgIGlmIChiaXRtYXAuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYikpIHsKLSAgICAgICAgICAgIGJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IDI0OwotICAgICAgICAgICAgOjpHZXRESUJpdHMoaERDTWVtb3J5LCBoYm1wLCAwLCBoZWlnaHQsIGJpdG1hcC5HZXRCdWZmZXIoKSwgJmJtaSwgRElCX1JHQl9DT0xPUlMpOwotICAgICAgICAgICAgcmV0ID0gcEJpdG1hcC0+VHJhbnNmZXJCaXRtYXAoMCwgMCwgd2lkdGgsIGhlaWdodCwgJmJpdG1hcCwgMCwgMCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocEJpdG1hcC0+SGFzQWxwaGEoKSAmJiByZXQpIHsKLSAgICAgICAgcEJpdG1hcC0+TG9hZENoYW5uZWwoRlhESUJfQWxwaGEsIDB4ZmYpOwotICAgIH0KLSAgICBEZWxldGVPYmplY3QoaGJtcCk7Ci0gICAgRGVsZXRlT2JqZWN0KGhEQ01lbW9yeSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLUZYX0JPT0wgQ0dkaURpc3BsYXlEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBBU1NFUlQoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIGludCB3aWR0aCA9IHBTb3VyY2UtPkdldFdpZHRoKCksIGhlaWdodCA9IHBTb3VyY2UtPkdldEhlaWdodCgpOwotICAgICAgICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7Ci0gICAgICAgIEZYX0JPT0wgYkdESSA9IHBTb3VyY2UtPkdldEJQUCgpID09IDEgJiYgYWxwaGEgPT0gMjU1OwotICAgICAgICBpZiAoIWJHREkpIHsKLSAgICAgICAgICAgIENGWF9ESUJpdG1hcCBiYWNrZ3JvdW5kOwotICAgICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IzMikgfHwKLSAgICAgICAgICAgICAgICAhR2V0RElCaXRzKCZiYWNrZ3JvdW5kLCBsZWZ0LCB0b3AsIE5VTEwpIHx8Ci0gICAgICAgICAgICAgICAgIWJhY2tncm91bmQuQ29tcG9zaXRlTWFzaygwLCAwLCB3aWR0aCwgaGVpZ2h0LCBwU291cmNlLCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICByZXR1cm4gU2V0RElCaXRzKCZiYWNrZ3JvdW5kLCAwLCAmc3JjX3JlY3QsIGxlZnQsIHRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCAwLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBGWF9SRUNUIGNsaXBfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwU3JjUmVjdC0+V2lkdGgoKSwgdG9wICsgcFNyY1JlY3QtPkhlaWdodCgpKTsKLSAgICAgICAgcmV0dXJuIFN0cmV0Y2hESUJpdHMocFNvdXJjZSwgY29sb3IsIGxlZnQgLSBwU3JjUmVjdC0+bGVmdCwgdG9wIC0gcFNyY1JlY3QtPnRvcCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaXBfcmVjdCwgMCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB9Ci0gICAgaW50IHdpZHRoID0gcFNyY1JlY3QtPldpZHRoKCksIGhlaWdodCA9IHBTcmNSZWN0LT5IZWlnaHQoKTsKLSAgICBpZiAocFNvdXJjZS0+SGFzQWxwaGEoKSkgewotICAgICAgICBDRlhfRElCaXRtYXAgYml0bWFwOwotICAgICAgICBpZiAoIWJpdG1hcC5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiKSB8fAotICAgICAgICAgICAgIUdldERJQml0cygmYml0bWFwLCBsZWZ0LCB0b3AsIE5VTEwpIHx8Ci0gICAgICAgICAgICAhYml0bWFwLkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCBwU291cmNlLCBwU3JjUmVjdC0+bGVmdCwgcFNyY1JlY3QtPnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICByZXR1cm4gU2V0RElCaXRzKCZiaXRtYXAsIDAsICZzcmNfcmVjdCwgbGVmdCwgdG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIDAsIE5VTEwpOwotICAgIH0KLSAgICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKLSAgICBpZiAocEJpdG1hcCkgewotICAgICAgICByZXR1cm4gR0RJX1NldERJQml0cyhwQml0bWFwLCBwU3JjUmVjdCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICB9CitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgX0NvbG9yMkFyZ2IoY29sb3IsIGNvbG9yLCBhbHBoYV9mbGFnIHwgKDEgPDwgMjQpLCBwSWNjVHJhbnNmb3JtKTsKKyAgaW50IGE7CisgIEZYX0NPTE9SUkVGIHJnYjsKKyAgQXJnYkRlY29kZShjb2xvciwgYSwgcmdiKTsKKyAgaWYgKGEgPT0gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIEhQRU4gaFBlbiA9IENyZWF0ZVBlbihQU19TT0xJRCwgMSwgcmdiKTsKKyAgaFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChtX2hEQywgaFBlbik7CisgIE1vdmVUb0V4KG1faERDLCBGWFNZU19yb3VuZCh4MSksIEZYU1lTX3JvdW5kKHkxKSwgTlVMTCk7CisgIExpbmVUbyhtX2hEQywgRlhTWVNfcm91bmQoeDIpLCBGWFNZU19yb3VuZCh5MikpOworICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKKyAgRGVsZXRlT2JqZWN0KGhQZW4pOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0dkaURpc3BsYXlEcml2ZXI6OlVzZUZveGl0U3RyZXRjaEVuZ2luZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGludCByZW5kZXJfZmxhZ3MsCi0gICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBGWF9SRUNUIGJpdG1hcF9jbGlwID0gKnBDbGlwUmVjdDsKLSAgICBpZiAoZGVzdF93aWR0aCA8IDApIHsKLSAgICAgICAgZGVzdF9sZWZ0ICs9IGRlc3Rfd2lkdGg7CitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkRlbGV0ZURldmljZVJnbih2b2lkKiBwUmduKSB7CisgIERlbGV0ZU9iamVjdCgoSEdESU9CSilwUmduKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitDR2RpRGlzcGxheURyaXZlcjo6Q0dkaURpc3BsYXlEcml2ZXIoSERDIGhEQykKKyAgICA6IENHZGlEZXZpY2VEcml2ZXIoaERDLCBGWERDX0RJU1BMQVkpIHsKKyAgQ1dpbjMyUGxhdGZvcm0qIHBQbGF0Zm9ybSA9CisgICAgICAoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpOworICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuSXNBdmFpbGFibGUoKSkgeworICAgIG1fUmVuZGVyQ2FwcyB8PSBGWFJDX0FMUEhBX1BBVEggfCBGWFJDX0FMUEhBX0lNQUdFOworICB9Cit9CitGWF9CT09MIENHZGlEaXNwbGF5RHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJERWRnZSkgeworICBGWF9CT09MIHJldCA9IEZBTFNFOworICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOworICBpbnQgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAobV9oREMsIHdpZHRoLCBoZWlnaHQpOworICBIREMgaERDTWVtb3J5ID0gQ3JlYXRlQ29tcGF0aWJsZURDKG1faERDKTsKKyAgSEJJVE1BUCBob2xkYm1wID0gKEhCSVRNQVApU2VsZWN0T2JqZWN0KGhEQ01lbW9yeSwgaGJtcCk7CisgIEJpdEJsdChoRENNZW1vcnksIDAsIDAsIHdpZHRoLCBoZWlnaHQsIG1faERDLCBsZWZ0LCB0b3AsIFNSQ0NPUFkpOworICBTZWxlY3RPYmplY3QoaERDTWVtb3J5LCBob2xkYm1wKTsKKyAgQklUTUFQSU5GTyBibWk7CisgIEZYU1lTX21lbXNldCgmYm1pLCAwLCBzaXplb2YgYm1pKTsKKyAgYm1pLmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YgYm1pLmJtaUhlYWRlcjsKKyAgYm1pLmJtaUhlYWRlci5iaUJpdENvdW50ID0gcEJpdG1hcC0+R2V0QlBQKCk7CisgIGJtaS5ibWlIZWFkZXIuYmlIZWlnaHQgPSAtaGVpZ2h0OworICBibWkuYm1pSGVhZGVyLmJpUGxhbmVzID0gMTsKKyAgYm1pLmJtaUhlYWRlci5iaVdpZHRoID0gd2lkdGg7CisgIGlmICghQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSB8fAorICAgICAgIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSB7CisgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CisgIH0KKyAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID4gOCAmJiAhcEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSAmJgorICAgICAgcEljY1RyYW5zZm9ybSA9PSBOVUxMKSB7CisgICAgcmV0ID0gOjpHZXRESUJpdHMoaERDTWVtb3J5LCBoYm1wLCAwLCBoZWlnaHQsIHBCaXRtYXAtPkdldEJ1ZmZlcigpLCAmYm1pLAorICAgICAgICAgICAgICAgICAgICAgIERJQl9SR0JfQ09MT1JTKSA9PSBoZWlnaHQ7CisgIH0gZWxzZSB7CisgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKKyAgICBpZiAoYml0bWFwLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IpKSB7CisgICAgICBibWkuYm1pSGVhZGVyLmJpQml0Q291bnQgPSAyNDsKKyAgICAgIDo6R2V0RElCaXRzKGhEQ01lbW9yeSwgaGJtcCwgMCwgaGVpZ2h0LCBiaXRtYXAuR2V0QnVmZmVyKCksICZibWksCisgICAgICAgICAgICAgICAgICBESUJfUkdCX0NPTE9SUyk7CisgICAgICByZXQgPSBwQml0bWFwLT5UcmFuc2ZlckJpdG1hcCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCAmYml0bWFwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IEZBTFNFOwogICAgIH0KLSAgICBpZiAoZGVzdF9oZWlnaHQgPCAwKSB7Ci0gICAgICAgIGRlc3RfdG9wICs9IGRlc3RfaGVpZ2h0OworICB9CisgIGlmIChwQml0bWFwLT5IYXNBbHBoYSgpICYmIHJldCkgeworICAgIHBCaXRtYXAtPkxvYWRDaGFubmVsKEZYRElCX0FscGhhLCAweGZmKTsKKyAgfQorICBEZWxldGVPYmplY3QoaGJtcCk7CisgIERlbGV0ZU9iamVjdChoRENNZW1vcnkpOworICByZXR1cm4gcmV0OworfQorRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIEFTU0VSVChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCk7CisgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7CisgICAgaW50IHdpZHRoID0gcFNvdXJjZS0+R2V0V2lkdGgoKSwgaGVpZ2h0ID0gcFNvdXJjZS0+R2V0SGVpZ2h0KCk7CisgICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX0EoY29sb3IpOworICAgIEZYX0JPT0wgYkdESSA9IHBTb3VyY2UtPkdldEJQUCgpID09IDEgJiYgYWxwaGEgPT0gMjU1OworICAgIGlmICghYkdESSkgeworICAgICAgQ0ZYX0RJQml0bWFwIGJhY2tncm91bmQ7CisgICAgICBpZiAoIWJhY2tncm91bmQuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYjMyKSB8fAorICAgICAgICAgICFHZXRESUJpdHMoJmJhY2tncm91bmQsIGxlZnQsIHRvcCwgTlVMTCkgfHwKKyAgICAgICAgICAhYmFja2dyb3VuZC5Db21wb3NpdGVNYXNrKDAsIDAsIHdpZHRoLCBoZWlnaHQsIHBTb3VyY2UsIGNvbG9yLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICByZXR1cm4gU2V0RElCaXRzKCZiYWNrZ3JvdW5kLCAwLCAmc3JjX3JlY3QsIGxlZnQsIHRvcCwgRlhESUJfQkxFTkRfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMKTsKICAgICB9Ci0gICAgYml0bWFwX2NsaXAuT2Zmc2V0KC1kZXN0X2xlZnQsIC1kZXN0X3RvcCk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gcFNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCByZW5kZXJfZmxhZ3MsICZiaXRtYXBfY2xpcCk7CisgICAgRlhfUkVDVCBjbGlwX3JlY3QobGVmdCwgdG9wLCBsZWZ0ICsgcFNyY1JlY3QtPldpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgdG9wICsgcFNyY1JlY3QtPkhlaWdodCgpKTsKKyAgICByZXR1cm4gU3RyZXRjaERJQml0cyhwU291cmNlLCBjb2xvciwgbGVmdCAtIHBTcmNSZWN0LT5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCAtIHBTcmNSZWN0LT50b3AsIHdpZHRoLCBoZWlnaHQsICZjbGlwX3JlY3QsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgfQorICBpbnQgd2lkdGggPSBwU3JjUmVjdC0+V2lkdGgoKSwgaGVpZ2h0ID0gcFNyY1JlY3QtPkhlaWdodCgpOworICBpZiAocFNvdXJjZS0+SGFzQWxwaGEoKSkgeworICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7CisgICAgaWYgKCFiaXRtYXAuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYikgfHwKKyAgICAgICAgIUdldERJQml0cygmYml0bWFwLCBsZWZ0LCB0b3AsIE5VTEwpIHx8CisgICAgICAgICFiaXRtYXAuQ29tcG9zaXRlQml0bWFwKDAsIDAsIHdpZHRoLCBoZWlnaHQsIHBTb3VyY2UsIHBTcmNSZWN0LT5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVjdC0+dG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgIHJldHVybiBTZXRESUJpdHMoJmJpdG1hcCwgMCwgJnNyY19yZWN0LCBsZWZ0LCB0b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB9CisgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKKyAgaWYgKHBCaXRtYXApIHsKKyAgICByZXR1cm4gR0RJX1NldERJQml0cyhwQml0bWFwLCBwU3JjUmVjdCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENHZGlEaXNwbGF5RHJpdmVyOjpVc2VGb3hpdFN0cmV0Y2hFbmdpbmUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZW5kZXJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBGWF9SRUNUIGJpdG1hcF9jbGlwID0gKnBDbGlwUmVjdDsKKyAgaWYgKGRlc3Rfd2lkdGggPCAwKSB7CisgICAgZGVzdF9sZWZ0ICs9IGRlc3Rfd2lkdGg7CisgIH0KKyAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkgeworICAgIGRlc3RfdG9wICs9IGRlc3RfaGVpZ2h0OworICB9CisgIGJpdG1hcF9jbGlwLk9mZnNldCgtZGVzdF9sZWZ0LCAtZGVzdF90b3ApOworICBDRlhfRElCaXRtYXAqIHBTdHJldGNoZWQgPQorICAgICAgcFNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCByZW5kZXJfZmxhZ3MsICZiaXRtYXBfY2xpcCk7CisgIGlmIChwU3RyZXRjaGVkID09IE5VTEwpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBTdHJldGNoZWQtPkdldFdpZHRoKCksIHBTdHJldGNoZWQtPkdldEhlaWdodCgpKTsKKyAgRlhfQk9PTCByZXQgPQorICAgICAgU2V0RElCaXRzKHBTdHJldGNoZWQsIGNvbG9yLCAmc3JjX3JlY3QsIHBDbGlwUmVjdC0+bGVmdCwgcENsaXBSZWN0LT50b3AsCisgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKKyAgZGVsZXRlIHBTdHJldGNoZWQ7CisgIHJldHVybiByZXQ7Cit9CitGWF9CT09MIENHZGlEaXNwbGF5RHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBBU1NFUlQocFNvdXJjZSAhPSBOVUxMICYmIHBDbGlwUmVjdCAhPSBOVUxMKTsKKyAgaWYgKGZsYWdzIHx8IGRlc3Rfd2lkdGggPiAxMDAwMCB8fCBkZXN0X3dpZHRoIDwgLTEwMDAwIHx8CisgICAgICBkZXN0X2hlaWdodCA+IDEwMDAwIHx8IGRlc3RfaGVpZ2h0IDwgLTEwMDAwKSB7CisgICAgcmV0dXJuIFVzZUZveGl0U3RyZXRjaEVuZ2luZShwU291cmNlLCBjb2xvciwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBwQ2xpcFJlY3QsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7CisgIH0KKyAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKKyAgICBGWF9SRUNUIGltYWdlX3JlY3Q7CisgICAgaW1hZ2VfcmVjdC5sZWZ0ID0gZGVzdF93aWR0aCA+IDAgPyBkZXN0X2xlZnQgOiBkZXN0X2xlZnQgKyBkZXN0X3dpZHRoOworICAgIGltYWdlX3JlY3QucmlnaHQgPSBkZXN0X3dpZHRoID4gMCA/IGRlc3RfbGVmdCArIGRlc3Rfd2lkdGggOiBkZXN0X2xlZnQ7CisgICAgaW1hZ2VfcmVjdC50b3AgPSBkZXN0X2hlaWdodCA+IDAgPyBkZXN0X3RvcCA6IGRlc3RfdG9wICsgZGVzdF9oZWlnaHQ7CisgICAgaW1hZ2VfcmVjdC5ib3R0b20gPSBkZXN0X2hlaWdodCA+IDAgPyBkZXN0X3RvcCArIGRlc3RfaGVpZ2h0IDogZGVzdF90b3A7CisgICAgRlhfUkVDVCBjbGlwX3JlY3QgPSBpbWFnZV9yZWN0OworICAgIGNsaXBfcmVjdC5JbnRlcnNlY3QoKnBDbGlwUmVjdCk7CisgICAgY2xpcF9yZWN0Lk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOworICAgIGludCBjbGlwX3dpZHRoID0gY2xpcF9yZWN0LldpZHRoKCksIGNsaXBfaGVpZ2h0ID0gY2xpcF9yZWN0LkhlaWdodCgpOworICAgIENGWF9ESUJpdG1hcCogcFN0cmV0Y2hlZCA9CisgICAgICAgIHBTb3VyY2UtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgZmxhZ3MsICZjbGlwX3JlY3QpOwogICAgIGlmIChwU3RyZXRjaGVkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBwU3RyZXRjaGVkLT5HZXRXaWR0aCgpLCBwU3RyZXRjaGVkLT5HZXRIZWlnaHQoKSk7Ci0gICAgRlhfQk9PTCByZXQgPSBTZXRESUJpdHMocFN0cmV0Y2hlZCwgY29sb3IsICZzcmNfcmVjdCwgcENsaXBSZWN0LT5sZWZ0LCBwQ2xpcFJlY3QtPnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKKyAgICBDRlhfRElCaXRtYXAgYmFja2dyb3VuZDsKKyAgICBpZiAoIWJhY2tncm91bmQuQ3JlYXRlKGNsaXBfd2lkdGgsIGNsaXBfaGVpZ2h0LCBGWERJQl9SZ2IzMikgfHwKKyAgICAgICAgIUdldERJQml0cygmYmFja2dyb3VuZCwgaW1hZ2VfcmVjdC5sZWZ0ICsgY2xpcF9yZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgaW1hZ2VfcmVjdC50b3AgKyBjbGlwX3JlY3QudG9wLCBOVUxMKSB8fAorICAgICAgICAhYmFja2dyb3VuZC5Db21wb3NpdGVNYXNrKDAsIDAsIGNsaXBfd2lkdGgsIGNsaXBfaGVpZ2h0LCBwU3RyZXRjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLCAwLCAwLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICBkZWxldGUgcFN0cmV0Y2hlZDsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCk7CisgICAgRlhfQk9PTCByZXQgPQorICAgICAgICBTZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgaW1hZ2VfcmVjdC5sZWZ0ICsgY2xpcF9yZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICBpbWFnZV9yZWN0LnRvcCArIGNsaXBfcmVjdC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgMCwgTlVMTCk7CiAgICAgZGVsZXRlIHBTdHJldGNoZWQ7CiAgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZiAocFNvdXJjZS0+SGFzQWxwaGEoKSkgeworICAgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPQorICAgICAgICAoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpOworICAgIGlmIChwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpICYmIHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCAmJgorICAgICAgICAhcFNvdXJjZS0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOworICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKKyAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgcmV0dXJuIHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LlN0cmV0Y2hESUJpdHMoCisgICAgICAgICAgbV9oREMsIHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LAorICAgICAgICAgIHBDbGlwUmVjdCwgZmxhZ3MpOworICAgIH0KKyAgICByZXR1cm4gVXNlRm94aXRTdHJldGNoRW5naW5lKHBTb3VyY2UsIGNvbG9yLCBkZXN0X2xlZnQsIGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIHBDbGlwUmVjdCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKKyAgfQorICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7CisgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7CisgIGlmIChwQml0bWFwKSB7CisgICAgcmV0dXJuIEdESV9TdHJldGNoRElCaXRzKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0LCBmbGFncywgcEljY1RyYW5zZm9ybSk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCi17Ci0gICAgQVNTRVJUKHBTb3VyY2UgIT0gTlVMTCAmJiBwQ2xpcFJlY3QgIT0gTlVMTCk7Ci0gICAgaWYgKGZsYWdzIHx8IGRlc3Rfd2lkdGggPiAxMDAwMCB8fCBkZXN0X3dpZHRoIDwgLTEwMDAwIHx8IGRlc3RfaGVpZ2h0ID4gMTAwMDAgfHwgZGVzdF9oZWlnaHQgPCAtMTAwMDApIHsKLSAgICAgICAgcmV0dXJuIFVzZUZveGl0U3RyZXRjaEVuZ2luZShwU291cmNlLCBjb2xvciwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBSZWN0LCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7CisjZGVmaW5lIEdFVF9QU19GRUFUVVJFU0VUVElORyA0MTIxCisjZGVmaW5lIEZFQVRVUkVTRVRUSU5HX1BTTEVWRUwgMgoraW50IEdldFBTTGV2ZWwoSERDIGhEQykgeworICBpbnQgZGV2aWNlX3R5cGUgPSA6OkdldERldmljZUNhcHMoaERDLCBURUNITk9MT0dZKTsKKyAgaWYgKGRldmljZV90eXBlICE9IERUX1JBU1BSSU5URVIpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGWF9EV09SRCBlc2MgPSBHRVRfUFNfRkVBVFVSRVNFVFRJTkc7CisgIGlmIChFeHRFc2NhcGUoaERDLCBRVUVSWUVTQ1NVUFBPUlQsIHNpemVvZiBlc2MsIChjaGFyKikmZXNjLCAwLCBOVUxMKSkgeworICAgIGludCBwYXJhbSA9IEZFQVRVUkVTRVRUSU5HX1BTTEVWRUw7CisgICAgaWYgKEV4dEVzY2FwZShoREMsIEdFVF9QU19GRUFUVVJFU0VUVElORywgc2l6ZW9mKGludCksIChjaGFyKikmcGFyYW0sCisgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSwgKGNoYXIqKSZwYXJhbSkgPiAwKSB7CisgICAgICByZXR1cm4gcGFyYW07CiAgICAgfQotICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdDsKLSAgICAgICAgaW1hZ2VfcmVjdC5sZWZ0ID0gZGVzdF93aWR0aCA+IDAgPyBkZXN0X2xlZnQgOiBkZXN0X2xlZnQgKyBkZXN0X3dpZHRoOwotICAgICAgICBpbWFnZV9yZWN0LnJpZ2h0ID0gZGVzdF93aWR0aCA+IDAgPyBkZXN0X2xlZnQgKyBkZXN0X3dpZHRoIDogZGVzdF9sZWZ0OwotICAgICAgICBpbWFnZV9yZWN0LnRvcCA9IGRlc3RfaGVpZ2h0ID4gMCA/IGRlc3RfdG9wIDogZGVzdF90b3AgKyBkZXN0X2hlaWdodDsKLSAgICAgICAgaW1hZ2VfcmVjdC5ib3R0b20gPSBkZXN0X2hlaWdodCA+IDAgPyBkZXN0X3RvcCArIGRlc3RfaGVpZ2h0IDogZGVzdF90b3A7Ci0gICAgICAgIEZYX1JFQ1QgY2xpcF9yZWN0ID0gaW1hZ2VfcmVjdDsKLSAgICAgICAgY2xpcF9yZWN0LkludGVyc2VjdCgqcENsaXBSZWN0KTsKLSAgICAgICAgY2xpcF9yZWN0Lk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOwotICAgICAgICBpbnQgY2xpcF93aWR0aCA9IGNsaXBfcmVjdC5XaWR0aCgpLCBjbGlwX2hlaWdodCA9IGNsaXBfcmVjdC5IZWlnaHQoKTsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gcFNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgJmNsaXBfcmVjdCk7Ci0gICAgICAgIGlmIChwU3RyZXRjaGVkID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIENGWF9ESUJpdG1hcCBiYWNrZ3JvdW5kOwotICAgICAgICBpZiAoIWJhY2tncm91bmQuQ3JlYXRlKGNsaXBfd2lkdGgsIGNsaXBfaGVpZ2h0LCBGWERJQl9SZ2IzMikgfHwKLSAgICAgICAgICAgICFHZXRESUJpdHMoJmJhY2tncm91bmQsIGltYWdlX3JlY3QubGVmdCArIGNsaXBfcmVjdC5sZWZ0LCBpbWFnZV9yZWN0LnRvcCArIGNsaXBfcmVjdC50b3AsIE5VTEwpIHx8Ci0gICAgICAgICAgICAhYmFja2dyb3VuZC5Db21wb3NpdGVNYXNrKDAsIDAsIGNsaXBfd2lkdGgsIGNsaXBfaGVpZ2h0LCBwU3RyZXRjaGVkLCBjb2xvciwgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwU3RyZXRjaGVkOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQpOwotICAgICAgICBGWF9CT09MIHJldCA9IFNldERJQml0cygmYmFja2dyb3VuZCwgMCwgJnNyY19yZWN0LCBpbWFnZV9yZWN0LmxlZnQgKyBjbGlwX3JlY3QubGVmdCwgaW1hZ2VfcmVjdC50b3AgKyBjbGlwX3JlY3QudG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIDAsIE5VTEwpOwotICAgICAgICBkZWxldGUgcFN0cmV0Y2hlZDsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgQ1dpbjMyUGxhdGZvcm0qIHBQbGF0Zm9ybSA9IChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCk7Ci0gICAgICAgIGlmIChwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpICYmIHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCAmJiAhcFNvdXJjZS0+SXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOwotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKLSAgICAgICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuU3RyZXRjaERJQml0cyhtX2hEQywgcEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIHBDbGlwUmVjdCwgZmxhZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBVc2VGb3hpdFN0cmV0Y2hFbmdpbmUocFNvdXJjZSwgY29sb3IsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwUmVjdCwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOwotICAgIH0KLSAgICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKLSAgICBpZiAocEJpdG1hcCkgewotICAgICAgICByZXR1cm4gR0RJX1N0cmV0Y2hESUJpdHMocEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGZsYWdzLCBwSWNjVHJhbnNmb3JtKTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotI2RlZmluZSBHRVRfUFNfRkVBVFVSRVNFVFRJTkcgICAgICAgIDQxMjEKLSNkZWZpbmUgRkVBVFVSRVNFVFRJTkdfUFNMRVZFTCAgICAgICAyCi1pbnQgR2V0UFNMZXZlbChIREMgaERDKQotewotICAgIGludCBkZXZpY2VfdHlwZSA9IDo6R2V0RGV2aWNlQ2FwcyhoREMsIFRFQ0hOT0xPR1kpOwotICAgIGlmIChkZXZpY2VfdHlwZSAhPSBEVF9SQVNQUklOVEVSKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9EV09SRCBlc2MgPSBHRVRfUFNfRkVBVFVSRVNFVFRJTkc7CisgIH0KKyAgZXNjID0gUE9TVFNDUklQVF9JREVOVElGWTsKKyAgaWYgKEV4dEVzY2FwZShoREMsIFFVRVJZRVNDU1VQUE9SVCwgc2l6ZW9mIGVzYywgKGNoYXIqKSZlc2MsIDAsIE5VTEwpID09IDApIHsKKyAgICBlc2MgPSBQT1NUU0NSSVBUX0RBVEE7CiAgICAgaWYgKEV4dEVzY2FwZShoREMsIFFVRVJZRVNDU1VQUE9SVCwgc2l6ZW9mIGVzYywgKGNoYXIqKSZlc2MsIDAsIE5VTEwpKSB7Ci0gICAgICAgIGludCBwYXJhbSA9IEZFQVRVUkVTRVRUSU5HX1BTTEVWRUw7Ci0gICAgICAgIGlmIChFeHRFc2NhcGUoaERDLCBHRVRfUFNfRkVBVFVSRVNFVFRJTkcsIHNpemVvZihpbnQpLCAoY2hhciopJnBhcmFtLCBzaXplb2YoaW50KSwgKGNoYXIqKSZwYXJhbSkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW07Ci0gICAgICAgIH0KKyAgICAgIHJldHVybiAyOwogICAgIH0KLSAgICBlc2MgPSBQT1NUU0NSSVBUX0lERU5USUZZOwotICAgIGlmIChFeHRFc2NhcGUoaERDLCBRVUVSWUVTQ1NVUFBPUlQsIHNpemVvZiBlc2MsIChjaGFyKikmZXNjLCAwLCBOVUxMKSA9PSAwKSB7Ci0gICAgICAgIGVzYyA9IFBPU1RTQ1JJUFRfREFUQTsKLSAgICAgICAgaWYgKEV4dEVzY2FwZShoREMsIFFVRVJZRVNDU1VQUE9SVCwgc2l6ZW9mIGVzYywgKGNoYXIqKSZlc2MsIDAsIE5VTEwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZXNjID0gUFNJREVOVF9HRElDRU5UUklDOwotICAgIGlmIChFeHRFc2NhcGUoaERDLCBQT1NUU0NSSVBUX0lERU5USUZZLCBzaXplb2YoRlhfRFdPUkQpLCAoY2hhciopJmVzYywgMCwgTlVMTCkgPD0gMCkgewotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgZXNjID0gR0VUX1BTX0ZFQVRVUkVTRVRUSU5HOwotICAgIGlmIChFeHRFc2NhcGUoaERDLCBRVUVSWUVTQ1NVUFBPUlQsIHNpemVvZiBlc2MsIChjaGFyKikmZXNjLCAwLCBOVUxMKSkgewotICAgICAgICBpbnQgcGFyYW0gPSBGRUFUVVJFU0VUVElOR19QU0xFVkVMOwotICAgICAgICBpZiAoRXh0RXNjYXBlKGhEQywgR0VUX1BTX0ZFQVRVUkVTRVRUSU5HLCBzaXplb2YoaW50KSwgKGNoYXIqKSZwYXJhbSwgc2l6ZW9mKGludCksIChjaGFyKikmcGFyYW0pID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgICAgICB9Ci0gICAgfQorICAgIHJldHVybiAwOworICB9CisgIGVzYyA9IFBTSURFTlRfR0RJQ0VOVFJJQzsKKyAgaWYgKEV4dEVzY2FwZShoREMsIFBPU1RTQ1JJUFRfSURFTlRJRlksIHNpemVvZihGWF9EV09SRCksIChjaGFyKikmZXNjLCAwLAorICAgICAgICAgICAgICAgIE5VTEwpIDw9IDApIHsKICAgICByZXR1cm4gMjsKKyAgfQorICBlc2MgPSBHRVRfUFNfRkVBVFVSRVNFVFRJTkc7CisgIGlmIChFeHRFc2NhcGUoaERDLCBRVUVSWUVTQ1NVUFBPUlQsIHNpemVvZiBlc2MsIChjaGFyKikmZXNjLCAwLCBOVUxMKSkgeworICAgIGludCBwYXJhbSA9IEZFQVRVUkVTRVRUSU5HX1BTTEVWRUw7CisgICAgaWYgKEV4dEVzY2FwZShoREMsIEdFVF9QU19GRUFUVVJFU0VUVElORywgc2l6ZW9mKGludCksIChjaGFyKikmcGFyYW0sCisgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSwgKGNoYXIqKSZwYXJhbSkgPiAwKSB7CisgICAgICByZXR1cm4gcGFyYW07CisgICAgfQorICB9CisgIHJldHVybiAyOwogfQogaW50IENGWF9XaW5kb3dzRGV2aWNlOjptX3BzTGV2ZWwgPSAyOwotQ0ZYX1dpbmRvd3NEZXZpY2U6OkNGWF9XaW5kb3dzRGV2aWNlKEhEQyBoREMsIEZYX0JPT0wgYkNteWtPdXRwdXQsIEZYX0JPT0wgYkZvcmNlUFNPdXRwdXQsIGludCBwc0xldmVsKQotewotICAgIG1fYkZvcmNlUFNPdXRwdXQgPSBiRm9yY2VQU091dHB1dDsKLSAgICBtX3BzTGV2ZWwgPSBwc0xldmVsOwotICAgIGlmIChiRm9yY2VQU091dHB1dCkgewotICAgICAgICBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gRlhfTkVXIENQU1ByaW50ZXJEcml2ZXI7Ci0gICAgICAgIGlmICghcERyaXZlcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgICgoQ1BTUHJpbnRlckRyaXZlciopcERyaXZlciktPkluaXQoaERDLCBwc0xldmVsLCBiQ215a091dHB1dCk7Ci0gICAgICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBTZXREZXZpY2VEcml2ZXIoQ3JlYXRlRHJpdmVyKGhEQywgYkNteWtPdXRwdXQpKTsKLX0KLUhEQyBDRlhfV2luZG93c0RldmljZTo6R2V0REMoKSBjb25zdAotewotICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIgKnBSREQgPSBHZXREZXZpY2VEcml2ZXIoKTsKLSAgICBpZiAoIXBSREQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiAoSERDKXBSREQtPkdldFBsYXRmb3JtU3VyZmFjZSgpOwotfQotSUZYX1JlbmRlckRldmljZURyaXZlciogQ0ZYX1dpbmRvd3NEZXZpY2U6OkNyZWF0ZURyaXZlcihIREMgaERDLCBGWF9CT09MIGJDbXlrT3V0cHV0KQotewotICAgIGludCBkZXZpY2VfdHlwZSA9IDo6R2V0RGV2aWNlQ2FwcyhoREMsIFRFQ0hOT0xPR1kpOwotICAgIGludCBvYmpfdHlwZSA9IDo6R2V0T2JqZWN0VHlwZShoREMpOwotICAgIGludCBkZXZpY2VfY2xhc3M7Ci0gICAgaWYgKGRldmljZV90eXBlID09IERUX1JBU1BSSU5URVIgfHwgZGV2aWNlX3R5cGUgPT0gRFRfUExPVFRFUiB8fCBvYmpfdHlwZSA9PSBPQkpfRU5ITUVUQURDKSB7Ci0gICAgICAgIGRldmljZV9jbGFzcyA9IEZYRENfUFJJTlRFUjsKLSAgICB9IGVsc2UgewotICAgICAgICBkZXZpY2VfY2xhc3MgPSBGWERDX0RJU1BMQVk7Ci0gICAgfQotICAgIGlmIChkZXZpY2VfY2xhc3MgPT0gRlhEQ19QUklOVEVSKSB7Ci0gICAgICAgIHJldHVybiBGWF9ORVcgQ0dkaVByaW50ZXJEcml2ZXIoaERDKTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYX05FVyBDR2RpRGlzcGxheURyaXZlcihoREMpOwotfQotQ0ZYX1dpbkJpdG1hcERldmljZTo6Q0ZYX1dpbkJpdG1hcERldmljZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpCi17Ci0gICAgQklUTUFQSU5GT0hFQURFUiBibWloOwotICAgIEZYU1lTX21lbXNldCgmYm1paCwgMCwgc2l6ZW9mIChCSVRNQVBJTkZPSEVBREVSKSk7Ci0gICAgYm1paC5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gICAgYm1paC5iaUJpdENvdW50ID0gZm9ybWF0ICYgMHhmZjsKLSAgICBibWloLmJpSGVpZ2h0ID0gLWhlaWdodDsKLSAgICBibWloLmJpUGxhbmVzID0gMTsKLSAgICBibWloLmJpV2lkdGggPSB3aWR0aDsKLSAgICB1aW50OF90KiBwQnVmZmVyOwotICAgIG1faEJpdG1hcCA9IENyZWF0ZURJQlNlY3Rpb24oTlVMTCwgKEJJVE1BUElORk8qKSZibWloLCBESUJfUkdCX0NPTE9SUywgKHZvaWQqKikmcEJ1ZmZlciwgTlVMTCwgMCk7Ci0gICAgaWYgKG1faEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKLSAgICBpZiAoIXBCaXRtYXApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0LCBwQnVmZmVyKTsKLSAgICBTZXRCaXRtYXAocEJpdG1hcCk7Ci0gICAgbV9oREMgPSA6OkNyZWF0ZUNvbXBhdGlibGVEQyhOVUxMKTsKLSAgICBtX2hPbGRCaXRtYXAgPSAoSEJJVE1BUClTZWxlY3RPYmplY3QobV9oREMsIG1faEJpdG1hcCk7Ci0gICAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9IEZYX05FVyBDR2RpRGlzcGxheURyaXZlcihtX2hEQyk7CitDRlhfV2luZG93c0RldmljZTo6Q0ZYX1dpbmRvd3NEZXZpY2UoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbXlrT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvcmNlUFNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBzTGV2ZWwpIHsKKyAgbV9iRm9yY2VQU091dHB1dCA9IGJGb3JjZVBTT3V0cHV0OworICBtX3BzTGV2ZWwgPSBwc0xldmVsOworICBpZiAoYkZvcmNlUFNPdXRwdXQpIHsKKyAgICBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gRlhfTkVXIENQU1ByaW50ZXJEcml2ZXI7CiAgICAgaWYgKCFwRHJpdmVyKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgIHJldHVybjsKICAgICB9CisgICAgKChDUFNQcmludGVyRHJpdmVyKilwRHJpdmVyKS0+SW5pdChoREMsIHBzTGV2ZWwsIGJDbXlrT3V0cHV0KTsKICAgICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7CisgICAgcmV0dXJuOworICB9CisgIFNldERldmljZURyaXZlcihDcmVhdGVEcml2ZXIoaERDLCBiQ215a091dHB1dCkpOwogfQotQ0ZYX1dpbkJpdG1hcERldmljZTo6fkNGWF9XaW5CaXRtYXBEZXZpY2UoKQotewotICAgIGlmIChtX2hEQykgewotICAgICAgICBTZWxlY3RPYmplY3QobV9oREMsIG1faE9sZEJpdG1hcCk7Ci0gICAgICAgIERlbGV0ZURDKG1faERDKTsKLSAgICB9Ci0gICAgaWYgKG1faEJpdG1hcCkgewotICAgICAgICBEZWxldGVPYmplY3QobV9oQml0bWFwKTsKLSAgICB9Ci0gICAgZGVsZXRlIEdldEJpdG1hcCgpOworSERDIENGWF9XaW5kb3dzRGV2aWNlOjpHZXREQygpIGNvbnN0IHsKKyAgSUZYX1JlbmRlckRldmljZURyaXZlciogcFJERCA9IEdldERldmljZURyaXZlcigpOworICBpZiAoIXBSREQpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gKEhEQylwUkRELT5HZXRQbGF0Zm9ybVN1cmZhY2UoKTsKK30KK0lGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIENGWF9XaW5kb3dzRGV2aWNlOjpDcmVhdGVEcml2ZXIoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ215a091dHB1dCkgeworICBpbnQgZGV2aWNlX3R5cGUgPSA6OkdldERldmljZUNhcHMoaERDLCBURUNITk9MT0dZKTsKKyAgaW50IG9ial90eXBlID0gOjpHZXRPYmplY3RUeXBlKGhEQyk7CisgIGludCBkZXZpY2VfY2xhc3M7CisgIGlmIChkZXZpY2VfdHlwZSA9PSBEVF9SQVNQUklOVEVSIHx8IGRldmljZV90eXBlID09IERUX1BMT1RURVIgfHwKKyAgICAgIG9ial90eXBlID09IE9CSl9FTkhNRVRBREMpIHsKKyAgICBkZXZpY2VfY2xhc3MgPSBGWERDX1BSSU5URVI7CisgIH0gZWxzZSB7CisgICAgZGV2aWNlX2NsYXNzID0gRlhEQ19ESVNQTEFZOworICB9CisgIGlmIChkZXZpY2VfY2xhc3MgPT0gRlhEQ19QUklOVEVSKSB7CisgICAgcmV0dXJuIEZYX05FVyBDR2RpUHJpbnRlckRyaXZlcihoREMpOworICB9CisgIHJldHVybiBGWF9ORVcgQ0dkaURpc3BsYXlEcml2ZXIoaERDKTsKK30KK0NGWF9XaW5CaXRtYXBEZXZpY2U6OkNGWF9XaW5CaXRtYXBEZXZpY2UoaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0KSB7CisgIEJJVE1BUElORk9IRUFERVIgYm1paDsKKyAgRlhTWVNfbWVtc2V0KCZibWloLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOworICBibWloLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgYm1paC5iaUJpdENvdW50ID0gZm9ybWF0ICYgMHhmZjsKKyAgYm1paC5iaUhlaWdodCA9IC1oZWlnaHQ7CisgIGJtaWguYmlQbGFuZXMgPSAxOworICBibWloLmJpV2lkdGggPSB3aWR0aDsKKyAgdWludDhfdCogcEJ1ZmZlcjsKKyAgbV9oQml0bWFwID0gQ3JlYXRlRElCU2VjdGlvbihOVUxMLCAoQklUTUFQSU5GTyopJmJtaWgsIERJQl9SR0JfQ09MT1JTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiopJnBCdWZmZXIsIE5VTEwsIDApOworICBpZiAobV9oQml0bWFwID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKKyAgaWYgKCFwQml0bWFwKSB7CisgICAgcmV0dXJuOworICB9CisgIHBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHBCdWZmZXIpOworICBTZXRCaXRtYXAocEJpdG1hcCk7CisgIG1faERDID0gOjpDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7CisgIG1faE9sZEJpdG1hcCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChtX2hEQywgbV9oQml0bWFwKTsKKyAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9IEZYX05FVyBDR2RpRGlzcGxheURyaXZlcihtX2hEQyk7CisgIGlmICghcERyaXZlcikgeworICAgIHJldHVybjsKKyAgfQorICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7Cit9CitDRlhfV2luQml0bWFwRGV2aWNlOjp+Q0ZYX1dpbkJpdG1hcERldmljZSgpIHsKKyAgaWYgKG1faERDKSB7CisgICAgU2VsZWN0T2JqZWN0KG1faERDLCBtX2hPbGRCaXRtYXApOworICAgIERlbGV0ZURDKG1faERDKTsKKyAgfQorICBpZiAobV9oQml0bWFwKSB7CisgICAgRGVsZXRlT2JqZWN0KG1faEJpdG1hcCk7CisgIH0KKyAgZGVsZXRlIEdldEJpdG1hcCgpOwogfQogCiAjZW5kaWYgIC8vIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0XwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwCmluZGV4IGRhNmEyYzNlLi5kN2RkOTEyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2RpYi5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwCkBAIC01LDI4NyArNSwyOTYgQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLSNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCAgX0ZYX09TXyA9PSBfRlhfV0lONjRfREVTS1RPUF8KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF9ERVNLVE9QXwogI2luY2x1ZGUgPHdpbmRvd3MuaD4KICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaCIKICNpbmNsdWRlICJ3aW4zMl9pbnQuaCIKLUNGWF9CeXRlU3RyaW5nIENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7Ci0gICAgaW50IGxlbiA9IHNpemVvZiAoQklUTUFQSU5GT0hFQURFUik7Ci0gICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID09IDEgfHwgcEJpdG1hcC0+R2V0QlBQKCkgPT0gOCkgewotICAgICAgICBsZW4gKz0gc2l6ZW9mIChEV09SRCkgKiAoaW50KSgxIDw8IHBCaXRtYXAtPkdldEJQUCgpKTsKLSAgICB9Ci0gICAgQklUTUFQSU5GT0hFQURFUiogcGJtaWggPSAoQklUTUFQSU5GT0hFQURFUiopcmVzdWx0LkdldEJ1ZmZlcihsZW4pOwotICAgIEZYU1lTX21lbXNldChwYm1paCwgMCwgc2l6ZW9mIChCSVRNQVBJTkZPSEVBREVSKSk7Ci0gICAgcGJtaWgtPmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgICBwYm1paC0+YmlCaXRDb3VudCA9IHBCaXRtYXAtPkdldEJQUCgpOwotICAgIHBibWloLT5iaUNvbXByZXNzaW9uID0gQklfUkdCOwotICAgIHBibWloLT5iaUhlaWdodCA9IC0oaW50KXBCaXRtYXAtPkdldEhlaWdodCgpOwotICAgIHBibWloLT5iaVBsYW5lcyA9IDE7Ci0gICAgcGJtaWgtPmJpV2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwotICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA9PSA4KSB7Ci0gICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSA9IChGWF9EV09SRCopKHBibWloICsgMSk7Ci0gICAgICAgIGlmIChwQml0bWFwLT5HZXRQYWxldHRlKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBwUGFsZXR0ZVtpXSA9IGkgKiAweDAxMDEwMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgcFBhbGV0dGVbaV0gPSBwQml0bWFwLT5HZXRQYWxldHRlKClbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgRlhfRFdPUkQqIHBQYWxldHRlID0gKEZYX0RXT1JEKikocGJtaWggKyAxKTsKLSAgICAgICAgaWYgKHBCaXRtYXAtPkdldFBhbGV0dGUoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBwUGFsZXR0ZVswXSA9IDA7Ci0gICAgICAgICAgICBwUGFsZXR0ZVsxXSA9IDB4ZmZmZmZmOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFBhbGV0dGVbMF0gPSBwQml0bWFwLT5HZXRQYWxldHRlKClbMF07Ci0gICAgICAgICAgICBwUGFsZXR0ZVsxXSA9IHBCaXRtYXAtPkdldFBhbGV0dGUoKVsxXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihsZW4pOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci1DRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSwgRlhfQk9PTCBiQWxwaGEpCi17Ci0gICAgaW50IHdpZHRoID0gcGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGg7Ci0gICAgaW50IGhlaWdodCA9IHBibWktPmJtaUhlYWRlci5iaUhlaWdodDsKLSAgICBCT09MIGJCb3R0b21VcCA9IFRSVUU7Ci0gICAgaWYgKGhlaWdodCA8IDApIHsKLSAgICAgICAgaGVpZ2h0ID0gLWhlaWdodDsKLSAgICAgICAgYkJvdHRvbVVwID0gRkFMU0U7Ci0gICAgfQotICAgIGludCBwaXRjaCA9ICh3aWR0aCAqIHBibWktPmJtaUhlYWRlci5iaUJpdENvdW50ICsgMzEpIC8gMzIgKiA0OwotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFwQml0bWFwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gYkFscGhhID8gKEZYRElCX0Zvcm1hdCkocGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKyAweDIwMCkgOiAoRlhESUJfRm9ybWF0KXBibWktPmJtaUhlYWRlci5iaUJpdENvdW50OwotICAgIEZYX0JPT0wgcmV0ID0gcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWFNZU19tZW1jcHkocEJpdG1hcC0+R2V0QnVmZmVyKCksIHBEYXRhLCBwaXRjaCAqIGhlaWdodCk7Ci0gICAgaWYgKGJCb3R0b21VcCkgewotICAgICAgICB1aW50OF90KiB0ZW1wX2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBpdGNoKTsKLSAgICAgICAgaW50IHRvcCA9IDAsIGJvdHRvbSA9IGhlaWdodCAtIDE7Ci0gICAgICAgIHdoaWxlICh0b3AgPCBib3R0b20pIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweSh0ZW1wX2J1ZiwgcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyB0b3AgKiBwaXRjaCwgcGl0Y2gpOwotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgdG9wICogcGl0Y2gsIHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgYm90dG9tICogcGl0Y2gsIHBpdGNoKTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShwQml0bWFwLT5HZXRCdWZmZXIoKSArIGJvdHRvbSAqIHBpdGNoLCB0ZW1wX2J1ZiwgcGl0Y2gpOwotICAgICAgICAgICAgdG9wICsrOwotICAgICAgICAgICAgYm90dG9tIC0tOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZyZWUodGVtcF9idWYpOwotICAgICAgICB0ZW1wX2J1ZiA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCA9PSAxKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSArKykgewotICAgICAgICAgICAgcEJpdG1hcC0+U2V0UGFsZXR0ZUVudHJ5KGksICgoRlhfRFdPUkQqKXBibWktPmJtaUNvbG9ycylbaV0gfCAweGZmMDAwMDAwKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gOCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgcEJpdG1hcC0+U2V0UGFsZXR0ZUVudHJ5KGksICgoRlhfRFdPUkQqKXBibWktPmJtaUNvbG9ycylbaV0gfCAweGZmMDAwMDAwKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcEJpdG1hcDsKLX0KLUNGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSkKLXsKLSAgICByZXR1cm4gX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYocGJtaSwgcERhdGEsIEZBTFNFKTsKLX0KLUhCSVRNQVAJQ0ZYX1dpbmRvd3NESUI6OkdldEREQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgSERDIGhEQykKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gR2V0Qml0bWFwSW5mbyhwQml0bWFwKTsKLSAgICBIQklUTUFQIGhCaXRtYXAgPSBOVUxMOwotICAgIGhCaXRtYXAgPSBDcmVhdGVESUJpdG1hcChoREMsIChCSVRNQVBJTkZPSEVBREVSKilpbmZvLmNfc3RyKCksIENCTV9JTklULAotICAgICAgICBwQml0bWFwLT5HZXRCdWZmZXIoKSwgKEJJVE1BUElORk8qKWluZm8uY19zdHIoKSwgRElCX1JHQl9DT0xPUlMpOwotICAgIHJldHVybiBoQml0bWFwOwotfQotdm9pZCBHZXRCaXRtYXBTaXplKEhCSVRNQVAgaEJpdG1hcCwgaW50JiB3LCBpbnQmIGgpCi17Ci0gICAgQklUTUFQIGJtcDsKLSAgICBHZXRPYmplY3QoaEJpdG1hcCwgc2l6ZW9mIGJtcCwgJmJtcCk7Ci0gICAgdyA9IGJtcC5ibVdpZHRoOwotICAgIGggPSBibXAuYm1IZWlnaHQ7Ci19Ci1DRlhfRElCaXRtYXAqIENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbUZpbGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lKQotewotICAgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPSAoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpOwotICAgIGlmIChwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpKSB7Ci0gICAgICAgIFdJTkRJQl9PcGVuX0FyZ3NfIGFyZ3M7Ci0gICAgICAgIGFyZ3MuZmxhZ3MgPSBXSU5ESUJfT1BFTl9QQVRITkFNRTsKLSAgICAgICAgYXJncy5wYXRoX25hbWUgPSBmaWxlbmFtZTsKLSAgICAgICAgcmV0dXJuIHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LkxvYWRESUJpdG1hcChhcmdzKTsKLSAgICB9Ci0gICAgSEJJVE1BUCBoQml0bWFwID0gKEhCSVRNQVApTG9hZEltYWdlVyhOVUxMLCAod2NoYXJfdCopZmlsZW5hbWUsIElNQUdFX0JJVE1BUCwgMCwgMCwgTFJfTE9BREZST01GSUxFKTsKLSAgICBpZiAoaEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBIREMgaERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOwotICAgIGludCB3aWR0aCwgaGVpZ2h0OwotICAgIEdldEJpdG1hcFNpemUoaEJpdG1hcCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghcERJQml0bWFwKSB7Ci0gICAgICAgIERlbGV0ZURDKGhEQyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoIXBESUJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYikpIHsKLSAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsKLSAgICAgICAgRGVsZXRlREMoaERDKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGluZm8gPSBHZXRCaXRtYXBJbmZvKHBESUJpdG1hcCk7Ci0gICAgaW50IHJldCA9IEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIGhlaWdodCwgcERJQml0bWFwLT5HZXRCdWZmZXIoKSwgKEJJVE1BUElORk8qKWluZm8uY19zdHIoKSwgRElCX1JHQl9DT0xPUlMpOwotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIGRlbGV0ZSBwRElCaXRtYXA7Ci0gICAgICAgIHBESUJpdG1hcCA9IE5VTEw7Ci0gICAgfQotICAgIERlbGV0ZURDKGhEQyk7Ci0gICAgcmV0dXJuIHBESUJpdG1hcDsKLX0KLUNGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRESUJpdG1hcChXSU5ESUJfT3Blbl9BcmdzXyBhcmdzKQotewotICAgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPSAoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpOwotICAgIGlmIChwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpKSB7Ci0gICAgICAgIHJldHVybiBwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Mb2FkRElCaXRtYXAoYXJncyk7Ci0gICAgfQotICAgIGlmIChhcmdzLmZsYWdzID09IFdJTkRJQl9PUEVOX01FTU9SWSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgSEJJVE1BUCBoQml0bWFwID0gKEhCSVRNQVApTG9hZEltYWdlVyhOVUxMLCAod2NoYXJfdCopYXJncy5wYXRoX25hbWUsIElNQUdFX0JJVE1BUCwgMCwgMCwgTFJfTE9BREZST01GSUxFKTsKLSAgICBpZiAoaEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBIREMgaERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOwotICAgIGludCB3aWR0aCwgaGVpZ2h0OwotICAgIEdldEJpdG1hcFNpemUoaEJpdG1hcCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghcERJQml0bWFwKSB7Ci0gICAgICAgIERlbGV0ZURDKGhEQyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoIXBESUJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYikpIHsKLSAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsKLSAgICAgICAgRGVsZXRlREMoaERDKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGluZm8gPSBHZXRCaXRtYXBJbmZvKHBESUJpdG1hcCk7Ci0gICAgaW50IHJldCA9IEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIGhlaWdodCwgcERJQml0bWFwLT5HZXRCdWZmZXIoKSwgKEJJVE1BUElORk8qKWluZm8uY19zdHIoKSwgRElCX1JHQl9DT0xPUlMpOwotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIGRlbGV0ZSBwRElCaXRtYXA7Ci0gICAgICAgIHBESUJpdG1hcCA9IE5VTEw7Ci0gICAgfQotICAgIERlbGV0ZURDKGhEQyk7Ci0gICAgcmV0dXJuIHBESUJpdG1hcDsKLX0KLUNGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRGcm9tRERCKEhEQyBoREMsIEhCSVRNQVAgaEJpdG1hcCwgRlhfRFdPUkQqIHBQYWxldHRlLCBGWF9EV09SRCBwYWxzaXplKQotewotICAgIEZYX0JPT0wgYkNyZWF0ZWREQyA9IGhEQyA9PSBOVUxMOwotICAgIGlmIChoREMgPT0gTlVMTCkgewotICAgICAgICBoREMgPSBDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7Ci0gICAgfQotICAgIEJJVE1BUElORk9IRUFERVIgYm1paDsKLSAgICBGWFNZU19tZW1zZXQoJmJtaWgsIDAsIHNpemVvZiBibWloKTsKLSAgICBibWloLmJpU2l6ZSA9IHNpemVvZiBibWloOwotICAgIEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIDAsIE5VTEwsIChCSVRNQVBJTkZPKikmYm1paCwgRElCX1JHQl9DT0xPUlMpOwotICAgIGludCB3aWR0aCA9IGJtaWguYmlXaWR0aDsKLSAgICBpbnQgaGVpZ2h0ID0gYWJzKGJtaWguYmlIZWlnaHQpOwotICAgIGJtaWguYmlIZWlnaHQgPSAtaGVpZ2h0OwotICAgIGJtaWguYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKLSAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFwRElCaXRtYXApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGludCByZXQgPSAwOwotICAgIGlmIChibWloLmJpQml0Q291bnQgPT0gMSB8fCBibWloLmJpQml0Q291bnQgPT0gOCkgewotICAgICAgICBpbnQgc2l6ZSA9IHNpemVvZiAoQklUTUFQSU5GT0hFQURFUikgKyA4OwotICAgICAgICBpZiAoYm1paC5iaUJpdENvdW50ID09IDgpIHsKLSAgICAgICAgICAgIHNpemUgKz0gc2l6ZW9mIChGWF9EV09SRCkgKiAyNTQ7Ci0gICAgICAgIH0KLSAgICAgICAgQklUTUFQSU5GTyogcGJtaWggPSAoQklUTUFQSU5GTyopRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7Ci0gICAgICAgIHBibWloLT5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgICAgICBwYm1paC0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPSBibWloLmJpQml0Q291bnQ7Ci0gICAgICAgIHBibWloLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKLSAgICAgICAgcGJtaWgtPmJtaUhlYWRlci5iaUhlaWdodCA9IC1oZWlnaHQ7Ci0gICAgICAgIHBibWloLT5ibWlIZWFkZXIuYmlQbGFuZXMgPSAxOwotICAgICAgICBwYm1paC0+Ym1pSGVhZGVyLmJpV2lkdGggPSBibWloLmJpV2lkdGg7Ci0gICAgICAgIGlmICghcERJQml0bWFwLT5DcmVhdGUoYm1paC5iaVdpZHRoLCBoZWlnaHQsIGJtaWguYmlCaXRDb3VudCA9PSAxID8gRlhESUJfMWJwcFJnYiA6IEZYRElCXzhicHBSZ2IpKSB7Ci0gICAgICAgICAgICBkZWxldGUgcERJQml0bWFwOwotICAgICAgICAgICAgRlhfRnJlZShwYm1paCk7Ci0gICAgICAgICAgICBpZiAoYkNyZWF0ZWREQykgewotICAgICAgICAgICAgICAgIERlbGV0ZURDKGhEQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXQgPSBHZXRESUJpdHMoaERDLCBoQml0bWFwLCAwLCBoZWlnaHQsIHBESUJpdG1hcC0+R2V0QnVmZmVyKCksIChCSVRNQVBJTkZPKilwYm1paCwgRElCX1JHQl9DT0xPUlMpOwotICAgICAgICBGWF9GcmVlKHBibWloKTsKLSAgICAgICAgcGJtaWggPSBOVUxMOwotICAgICAgICBwRElCaXRtYXAtPkNvcHlQYWxldHRlKHBQYWxldHRlLCBwYWxzaXplKTsKK0NGWF9CeXRlU3RyaW5nIENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCkgeworICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7CisgIGludCBsZW4gPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CisgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA9PSAxIHx8IHBCaXRtYXAtPkdldEJQUCgpID09IDgpIHsKKyAgICBsZW4gKz0gc2l6ZW9mKERXT1JEKSAqIChpbnQpKDEgPDwgcEJpdG1hcC0+R2V0QlBQKCkpOworICB9CisgIEJJVE1BUElORk9IRUFERVIqIHBibWloID0gKEJJVE1BUElORk9IRUFERVIqKXJlc3VsdC5HZXRCdWZmZXIobGVuKTsKKyAgRlhTWVNfbWVtc2V0KHBibWloLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOworICBwYm1paC0+YmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworICBwYm1paC0+YmlCaXRDb3VudCA9IHBCaXRtYXAtPkdldEJQUCgpOworICBwYm1paC0+YmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKKyAgcGJtaWgtPmJpSGVpZ2h0ID0gLShpbnQpcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIHBibWloLT5iaVBsYW5lcyA9IDE7CisgIHBibWloLT5iaVdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKKyAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID09IDgpIHsKKyAgICBGWF9EV09SRCogcFBhbGV0dGUgPSAoRlhfRFdPUkQqKShwYm1paCArIDEpOworICAgIGlmIChwQml0bWFwLT5HZXRQYWxldHRlKCkgPT0gTlVMTCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBwUGFsZXR0ZVtpXSA9IGkgKiAweDAxMDEwMTsKKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYm1paC5iaUJpdENvdW50IDw9IDI0KSB7Ci0gICAgICAgICAgICBibWloLmJpQml0Q291bnQgPSAyNDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJtaWguYmlCaXRDb3VudCA9IDMyOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcERJQml0bWFwLT5DcmVhdGUoYm1paC5iaVdpZHRoLCBoZWlnaHQsIGJtaWguYmlCaXRDb3VudCA9PSAyNCA/IEZYRElCX1JnYiA6IEZYRElCX1JnYjMyKSkgewotICAgICAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsKLSAgICAgICAgICAgIGlmIChiQ3JlYXRlZERDKSB7Ci0gICAgICAgICAgICAgICAgRGVsZXRlREMoaERDKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldCA9IEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIGhlaWdodCwgcERJQml0bWFwLT5HZXRCdWZmZXIoKSwgKEJJVE1BUElORk8qKSZibWloLCBESUJfUkdCX0NPTE9SUyk7Ci0gICAgICAgIGlmIChyZXQgIT0gMCAmJiBibWloLmJpQml0Q291bnQgPT0gMzIpIHsKLSAgICAgICAgICAgIGludCBwaXRjaCA9IHBESUJpdG1hcC0+R2V0UGl0Y2goKTsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gKHVpbnQ4X3QqKShwRElCaXRtYXAtPkdldEJ1ZmZlcigpICsgcm93ICogcGl0Y2gpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBwUGFsZXR0ZVtpXSA9IHBCaXRtYXAtPkdldFBhbGV0dGUoKVtpXTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgIGRlbGV0ZSBwRElCaXRtYXA7Ci0gICAgICAgIHBESUJpdG1hcCA9IE5VTEw7CisgIH0KKyAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKKyAgICBGWF9EV09SRCogcFBhbGV0dGUgPSAoRlhfRFdPUkQqKShwYm1paCArIDEpOworICAgIGlmIChwQml0bWFwLT5HZXRQYWxldHRlKCkgPT0gTlVMTCkgeworICAgICAgcFBhbGV0dGVbMF0gPSAwOworICAgICAgcFBhbGV0dGVbMV0gPSAweGZmZmZmZjsKKyAgICB9IGVsc2UgeworICAgICAgcFBhbGV0dGVbMF0gPSBwQml0bWFwLT5HZXRQYWxldHRlKClbMF07CisgICAgICBwUGFsZXR0ZVsxXSA9IHBCaXRtYXAtPkdldFBhbGV0dGUoKVsxXTsKICAgICB9Ci0gICAgaWYgKGJDcmVhdGVkREMpIHsKKyAgfQorICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihsZW4pOworICByZXR1cm4gcmVzdWx0OworfQorQ0ZYX0RJQml0bWFwKiBfRlhfV2luZG93c0RJQl9Mb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFscGhhKSB7CisgIGludCB3aWR0aCA9IHBibWktPmJtaUhlYWRlci5iaVdpZHRoOworICBpbnQgaGVpZ2h0ID0gcGJtaS0+Ym1pSGVhZGVyLmJpSGVpZ2h0OworICBCT09MIGJCb3R0b21VcCA9IFRSVUU7CisgIGlmIChoZWlnaHQgPCAwKSB7CisgICAgaGVpZ2h0ID0gLWhlaWdodDsKKyAgICBiQm90dG9tVXAgPSBGQUxTRTsKKyAgfQorICBpbnQgcGl0Y2ggPSAod2lkdGggKiBwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCArIDMxKSAvIDMyICogNDsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKKyAgaWYgKCFwQml0bWFwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IGJBbHBoYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKEZYRElCX0Zvcm1hdCkocGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKyAweDIwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChGWERJQl9Gb3JtYXQpcGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQ7CisgIEZYX0JPT0wgcmV0ID0gcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisgIGlmICghcmV0KSB7CisgICAgZGVsZXRlIHBCaXRtYXA7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhTWVNfbWVtY3B5KHBCaXRtYXAtPkdldEJ1ZmZlcigpLCBwRGF0YSwgcGl0Y2ggKiBoZWlnaHQpOworICBpZiAoYkJvdHRvbVVwKSB7CisgICAgdWludDhfdCogdGVtcF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBwaXRjaCk7CisgICAgaW50IHRvcCA9IDAsIGJvdHRvbSA9IGhlaWdodCAtIDE7CisgICAgd2hpbGUgKHRvcCA8IGJvdHRvbSkgeworICAgICAgRlhTWVNfbWVtY3B5KHRlbXBfYnVmLCBwQml0bWFwLT5HZXRCdWZmZXIoKSArIHRvcCAqIHBpdGNoLCBwaXRjaCk7CisgICAgICBGWFNZU19tZW1jcHkocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyB0b3AgKiBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRCdWZmZXIoKSArIGJvdHRvbSAqIHBpdGNoLCBwaXRjaCk7CisgICAgICBGWFNZU19tZW1jcHkocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyBib3R0b20gKiBwaXRjaCwgdGVtcF9idWYsIHBpdGNoKTsKKyAgICAgIHRvcCsrOworICAgICAgYm90dG9tLS07CisgICAgfQorICAgIEZYX0ZyZWUodGVtcF9idWYpOworICAgIHRlbXBfYnVmID0gTlVMTDsKKyAgfQorICBpZiAocGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBwQml0bWFwLT5TZXRQYWxldHRlRW50cnkoaSwgKChGWF9EV09SRCopcGJtaS0+Ym1pQ29sb3JzKVtpXSB8IDB4ZmYwMDAwMDApOworICAgIH0KKyAgfSBlbHNlIGlmIChwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCA9PSA4KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgcEJpdG1hcC0+U2V0UGFsZXR0ZUVudHJ5KGksICgoRlhfRFdPUkQqKXBibWktPmJtaUNvbG9ycylbaV0gfCAweGZmMDAwMDAwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBCaXRtYXA7Cit9CitDRlhfRElCaXRtYXAqIENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLCBMUFZPSUQgcERhdGEpIHsKKyAgcmV0dXJuIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKHBibWksIHBEYXRhLCBGQUxTRSk7Cit9CitIQklUTUFQIENGWF9XaW5kb3dzRElCOjpHZXREREJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEhEQyBoREMpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgaW5mbyA9IEdldEJpdG1hcEluZm8ocEJpdG1hcCk7CisgIEhCSVRNQVAgaEJpdG1hcCA9IE5VTEw7CisgIGhCaXRtYXAgPSBDcmVhdGVESUJpdG1hcChoREMsIChCSVRNQVBJTkZPSEVBREVSKilpbmZvLmNfc3RyKCksIENCTV9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcC0+R2V0QnVmZmVyKCksIChCSVRNQVBJTkZPKilpbmZvLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBESUJfUkdCX0NPTE9SUyk7CisgIHJldHVybiBoQml0bWFwOworfQordm9pZCBHZXRCaXRtYXBTaXplKEhCSVRNQVAgaEJpdG1hcCwgaW50JiB3LCBpbnQmIGgpIHsKKyAgQklUTUFQIGJtcDsKKyAgR2V0T2JqZWN0KGhCaXRtYXAsIHNpemVvZiBibXAsICZibXApOworICB3ID0gYm1wLmJtV2lkdGg7CisgIGggPSBibXAuYm1IZWlnaHQ7Cit9CitDRlhfRElCaXRtYXAqIENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbUZpbGUoY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lKSB7CisgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPQorICAgICAgKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKTsKKyAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKKyAgICBXSU5ESUJfT3Blbl9BcmdzXyBhcmdzOworICAgIGFyZ3MuZmxhZ3MgPSBXSU5ESUJfT1BFTl9QQVRITkFNRTsKKyAgICBhcmdzLnBhdGhfbmFtZSA9IGZpbGVuYW1lOworICAgIHJldHVybiBwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Mb2FkRElCaXRtYXAoYXJncyk7CisgIH0KKyAgSEJJVE1BUCBoQml0bWFwID0gKEhCSVRNQVApTG9hZEltYWdlVyhOVUxMLCAod2NoYXJfdCopZmlsZW5hbWUsIElNQUdFX0JJVE1BUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBMUl9MT0FERlJPTUZJTEUpOworICBpZiAoaEJpdG1hcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgSERDIGhEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhOVUxMKTsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisgIEdldEJpdG1hcFNpemUoaEJpdG1hcCwgd2lkdGgsIGhlaWdodCk7CisgIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKKyAgaWYgKCFwRElCaXRtYXApIHsKKyAgICBEZWxldGVEQyhoREMpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghcERJQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiKSkgeworICAgIGRlbGV0ZSBwRElCaXRtYXA7CisgICAgRGVsZXRlREMoaERDKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gR2V0Qml0bWFwSW5mbyhwRElCaXRtYXApOworICBpbnQgcmV0ID0gR2V0RElCaXRzKGhEQywgaEJpdG1hcCwgMCwgaGVpZ2h0LCBwRElCaXRtYXAtPkdldEJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgIChCSVRNQVBJTkZPKilpbmZvLmNfc3RyKCksIERJQl9SR0JfQ09MT1JTKTsKKyAgaWYgKCFyZXQpIHsKKyAgICBkZWxldGUgcERJQml0bWFwOworICAgIHBESUJpdG1hcCA9IE5VTEw7CisgIH0KKyAgRGVsZXRlREMoaERDKTsKKyAgcmV0dXJuIHBESUJpdG1hcDsKK30KK0NGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRESUJpdG1hcChXSU5ESUJfT3Blbl9BcmdzXyBhcmdzKSB7CisgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPQorICAgICAgKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKTsKKyAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKKyAgICByZXR1cm4gcFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuTG9hZERJQml0bWFwKGFyZ3MpOworICB9CisgIGlmIChhcmdzLmZsYWdzID09IFdJTkRJQl9PUEVOX01FTU9SWSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEhCSVRNQVAgaEJpdG1hcCA9IChIQklUTUFQKUxvYWRJbWFnZVcoTlVMTCwgKHdjaGFyX3QqKWFyZ3MucGF0aF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX0JJVE1BUCwgMCwgMCwgTFJfTE9BREZST01GSUxFKTsKKyAgaWYgKGhCaXRtYXAgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEhEQyBoREMgPSBDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7CisgIGludCB3aWR0aCwgaGVpZ2h0OworICBHZXRCaXRtYXBTaXplKGhCaXRtYXAsIHdpZHRoLCBoZWlnaHQpOworICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7CisgIGlmICghcERJQml0bWFwKSB7CisgICAgRGVsZXRlREMoaERDKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoIXBESUJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYikpIHsKKyAgICBkZWxldGUgcERJQml0bWFwOworICAgIERlbGV0ZURDKGhEQyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgaW5mbyA9IEdldEJpdG1hcEluZm8ocERJQml0bWFwKTsKKyAgaW50IHJldCA9IEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIGhlaWdodCwgcERJQml0bWFwLT5HZXRCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoQklUTUFQSU5GTyopaW5mby5jX3N0cigpLCBESUJfUkdCX0NPTE9SUyk7CisgIGlmICghcmV0KSB7CisgICAgZGVsZXRlIHBESUJpdG1hcDsKKyAgICBwRElCaXRtYXAgPSBOVUxMOworICB9CisgIERlbGV0ZURDKGhEQyk7CisgIHJldHVybiBwRElCaXRtYXA7Cit9CitDRlhfRElCaXRtYXAqIENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbUREQihIREMgaERDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJJVE1BUCBoQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcGFsc2l6ZSkgeworICBGWF9CT09MIGJDcmVhdGVkREMgPSBoREMgPT0gTlVMTDsKKyAgaWYgKGhEQyA9PSBOVUxMKSB7CisgICAgaERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOworICB9CisgIEJJVE1BUElORk9IRUFERVIgYm1paDsKKyAgRlhTWVNfbWVtc2V0KCZibWloLCAwLCBzaXplb2YgYm1paCk7CisgIGJtaWguYmlTaXplID0gc2l6ZW9mIGJtaWg7CisgIEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIDAsIE5VTEwsIChCSVRNQVBJTkZPKikmYm1paCwgRElCX1JHQl9DT0xPUlMpOworICBpbnQgd2lkdGggPSBibWloLmJpV2lkdGg7CisgIGludCBoZWlnaHQgPSBhYnMoYm1paC5iaUhlaWdodCk7CisgIGJtaWguYmlIZWlnaHQgPSAtaGVpZ2h0OworICBibWloLmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7CisgIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKKyAgaWYgKCFwRElCaXRtYXApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbnQgcmV0ID0gMDsKKyAgaWYgKGJtaWguYmlCaXRDb3VudCA9PSAxIHx8IGJtaWguYmlCaXRDb3VudCA9PSA4KSB7CisgICAgaW50IHNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyA4OworICAgIGlmIChibWloLmJpQml0Q291bnQgPT0gOCkgeworICAgICAgc2l6ZSArPSBzaXplb2YoRlhfRFdPUkQpICogMjU0OworICAgIH0KKyAgICBCSVRNQVBJTkZPKiBwYm1paCA9IChCSVRNQVBJTkZPKilGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKKyAgICBwYm1paC0+Ym1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICBwYm1paC0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPSBibWloLmJpQml0Q291bnQ7CisgICAgcGJtaWgtPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOworICAgIHBibWloLT5ibWlIZWFkZXIuYmlIZWlnaHQgPSAtaGVpZ2h0OworICAgIHBibWloLT5ibWlIZWFkZXIuYmlQbGFuZXMgPSAxOworICAgIHBibWloLT5ibWlIZWFkZXIuYmlXaWR0aCA9IGJtaWguYmlXaWR0aDsKKyAgICBpZiAoIXBESUJpdG1hcC0+Q3JlYXRlKGJtaWguYmlXaWR0aCwgaGVpZ2h0LCBibWloLmJpQml0Q291bnQgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZYRElCXzFicHBSZ2IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWERJQl84YnBwUmdiKSkgeworICAgICAgZGVsZXRlIHBESUJpdG1hcDsKKyAgICAgIEZYX0ZyZWUocGJtaWgpOworICAgICAgaWYgKGJDcmVhdGVkREMpIHsKICAgICAgICAgRGVsZXRlREMoaERDKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gcERJQml0bWFwOworICAgIHJldCA9IEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIGhlaWdodCwgcERJQml0bWFwLT5HZXRCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgKEJJVE1BUElORk8qKXBibWloLCBESUJfUkdCX0NPTE9SUyk7CisgICAgRlhfRnJlZShwYm1paCk7CisgICAgcGJtaWggPSBOVUxMOworICAgIHBESUJpdG1hcC0+Q29weVBhbGV0dGUocFBhbGV0dGUsIHBhbHNpemUpOworICB9IGVsc2UgeworICAgIGlmIChibWloLmJpQml0Q291bnQgPD0gMjQpIHsKKyAgICAgIGJtaWguYmlCaXRDb3VudCA9IDI0OworICAgIH0gZWxzZSB7CisgICAgICBibWloLmJpQml0Q291bnQgPSAzMjsKKyAgICB9CisgICAgaWYgKCFwRElCaXRtYXAtPkNyZWF0ZShibWloLmJpV2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtaWguYmlCaXRDb3VudCA9PSAyNCA/IEZYRElCX1JnYiA6IEZYRElCX1JnYjMyKSkgeworICAgICAgZGVsZXRlIHBESUJpdG1hcDsKKyAgICAgIGlmIChiQ3JlYXRlZERDKSB7CisgICAgICAgIERlbGV0ZURDKGhEQyk7CisgICAgICB9CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0ID0gR2V0RElCaXRzKGhEQywgaEJpdG1hcCwgMCwgaGVpZ2h0LCBwRElCaXRtYXAtPkdldEJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAoQklUTUFQSU5GTyopJmJtaWgsIERJQl9SR0JfQ09MT1JTKTsKKyAgICBpZiAocmV0ICE9IDAgJiYgYm1paC5iaUJpdENvdW50ID09IDMyKSB7CisgICAgICBpbnQgcGl0Y2ggPSBwRElCaXRtYXAtPkdldFBpdGNoKCk7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9ICh1aW50OF90KikocERJQml0bWFwLT5HZXRCdWZmZXIoKSArIHJvdyAqIHBpdGNoKTsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OworICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChyZXQgPT0gMCkgeworICAgIGRlbGV0ZSBwRElCaXRtYXA7CisgICAgcERJQml0bWFwID0gTlVMTDsKKyAgfQorICBpZiAoYkNyZWF0ZWREQykgeworICAgIERlbGV0ZURDKGhEQyk7CisgIH0KKyAgcmV0dXJuIHBESUJpdG1hcDsKIH0KLUNGWF9XaW5kb3dzRElCOjpDRlhfV2luZG93c0RJQihIREMgaERDLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0gICAgQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYiwgKHVpbnQ4X3QqKTEpOwotICAgIEJJVE1BUElORk9IRUFERVIgYm1paDsKLSAgICBGWFNZU19tZW1zZXQoJmJtaWgsIDAsIHNpemVvZiBibWloKTsKLSAgICBibWloLmJpU2l6ZSA9IHNpemVvZiBibWloOwotICAgIGJtaWguYmlCaXRDb3VudCA9IDI0OwotICAgIGJtaWguYmlIZWlnaHQgPSAtaGVpZ2h0OwotICAgIGJtaWguYmlQbGFuZXMgPSAxOwotICAgIGJtaWguYmlXaWR0aCA9IHdpZHRoOwotICAgIG1faEJpdG1hcCA9IENyZWF0ZURJQlNlY3Rpb24oaERDLCAoQklUTUFQSU5GTyopJmJtaWgsIERJQl9SR0JfQ09MT1JTLCAoTFBWT0lEKikmbV9wQnVmZmVyLCBOVUxMLCAwKTsKLSAgICBtX2hNZW1EQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoREMpOwotICAgIG1faE9sZEJpdG1hcCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChtX2hNZW1EQywgbV9oQml0bWFwKTsKK0NGWF9XaW5kb3dzRElCOjpDRlhfV2luZG93c0RJQihIREMgaERDLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYiwgKHVpbnQ4X3QqKTEpOworICBCSVRNQVBJTkZPSEVBREVSIGJtaWg7CisgIEZYU1lTX21lbXNldCgmYm1paCwgMCwgc2l6ZW9mIGJtaWgpOworICBibWloLmJpU2l6ZSA9IHNpemVvZiBibWloOworICBibWloLmJpQml0Q291bnQgPSAyNDsKKyAgYm1paC5iaUhlaWdodCA9IC1oZWlnaHQ7CisgIGJtaWguYmlQbGFuZXMgPSAxOworICBibWloLmJpV2lkdGggPSB3aWR0aDsKKyAgbV9oQml0bWFwID0gQ3JlYXRlRElCU2VjdGlvbihoREMsIChCSVRNQVBJTkZPKikmYm1paCwgRElCX1JHQl9DT0xPUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCopJm1fcEJ1ZmZlciwgTlVMTCwgMCk7CisgIG1faE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGhEQyk7CisgIG1faE9sZEJpdG1hcCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChtX2hNZW1EQywgbV9oQml0bWFwKTsKIH0KLUNGWF9XaW5kb3dzRElCOjp+Q0ZYX1dpbmRvd3NESUIoKQotewotICAgIFNlbGVjdE9iamVjdChtX2hNZW1EQywgbV9oT2xkQml0bWFwKTsKLSAgICBEZWxldGVEQyhtX2hNZW1EQyk7Ci0gICAgRGVsZXRlT2JqZWN0KG1faEJpdG1hcCk7CitDRlhfV2luZG93c0RJQjo6fkNGWF9XaW5kb3dzRElCKCkgeworICBTZWxlY3RPYmplY3QobV9oTWVtREMsIG1faE9sZEJpdG1hcCk7CisgIERlbGV0ZURDKG1faE1lbURDKTsKKyAgRGVsZXRlT2JqZWN0KG1faEJpdG1hcCk7CiB9Ci12b2lkIENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbURldmljZShIREMgaERDLCBpbnQgbGVmdCwgaW50IHRvcCkKLXsKLSAgICA6OkJpdEJsdChtX2hNZW1EQywgMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQsIGhEQywgbGVmdCwgdG9wLCBTUkNDT1BZKTsKK3ZvaWQgQ0ZYX1dpbmRvd3NESUI6OkxvYWRGcm9tRGV2aWNlKEhEQyBoREMsIGludCBsZWZ0LCBpbnQgdG9wKSB7CisgIDo6Qml0Qmx0KG1faE1lbURDLCAwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCwgaERDLCBsZWZ0LCB0b3AsIFNSQ0NPUFkpOwogfQotdm9pZCBDRlhfV2luZG93c0RJQjo6U2V0VG9EZXZpY2UoSERDIGhEQywgaW50IGxlZnQsIGludCB0b3ApCi17Ci0gICAgOjpCaXRCbHQoaERDLCBsZWZ0LCB0b3AsIG1fV2lkdGgsIG1fSGVpZ2h0LCBtX2hNZW1EQywgMCwgMCwgU1JDQ09QWSk7Cit2b2lkIENGWF9XaW5kb3dzRElCOjpTZXRUb0RldmljZShIREMgaERDLCBpbnQgbGVmdCwgaW50IHRvcCkgeworICA6OkJpdEJsdChoREMsIGxlZnQsIHRvcCwgbV9XaWR0aCwgbV9IZWlnaHQsIG1faE1lbURDLCAwLCAwLCBTUkNDT1BZKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwCmluZGV4IGU1ZGI3NmQuLmNmNTRlMGMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZHdyaXRlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2R3cml0ZS5jcHAKQEAgLTksNDAzICs5LDM2OSBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oIgogI2luY2x1ZGUgImR3cml0ZV9pbnQuaCIKICNpbmNsdWRlIDxkd3JpdGUuaD4KLXR5cGVkZWYgSFJFU1VMVCAgKF9fc3RkY2FsbCAqRnVuY1R5cGVfRFdyaXRlQ3JlYXRlRmFjdG9yeSkoX19pbiBEV1JJVEVfRkFDVE9SWV9UWVBFLCBfX2luIFJFRklJRCwgX19vdXQgSVVua25vd24gKiopOwordHlwZWRlZiBIUkVTVUxUKF9fc3RkY2FsbCogRnVuY1R5cGVfRFdyaXRlQ3JlYXRlRmFjdG9yeSkoCisgICAgX19pbiBEV1JJVEVfRkFDVE9SWV9UWVBFLAorICAgIF9faW4gUkVGSUlELAorICAgIF9fb3V0IElVbmtub3duKiopOwogdGVtcGxhdGUgPHR5cGVuYW1lIEludGVyZmFjZVR5cGU+Ci1pbmxpbmUgdm9pZCBTYWZlUmVsZWFzZShJbnRlcmZhY2VUeXBlKiogY3VycmVudE9iamVjdCkKLXsKLSAgICBpZiAoKmN1cnJlbnRPYmplY3QgIT0gTlVMTCkgewotICAgICAgICAoKmN1cnJlbnRPYmplY3QpLT5SZWxlYXNlKCk7Ci0gICAgICAgICpjdXJyZW50T2JqZWN0ID0gTlVMTDsKLSAgICB9CitpbmxpbmUgdm9pZCBTYWZlUmVsZWFzZShJbnRlcmZhY2VUeXBlKiogY3VycmVudE9iamVjdCkgeworICBpZiAoKmN1cnJlbnRPYmplY3QgIT0gTlVMTCkgeworICAgICgqY3VycmVudE9iamVjdCktPlJlbGVhc2UoKTsKKyAgICAqY3VycmVudE9iamVjdCA9IE5VTEw7CisgIH0KIH0KIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnRlcmZhY2VUeXBlPgotaW5saW5lIEludGVyZmFjZVR5cGUqIFNhZmVBY3F1aXJlKEludGVyZmFjZVR5cGUqIG5ld09iamVjdCkKLXsKLSAgICBpZiAobmV3T2JqZWN0ICE9IE5VTEwpIHsKLSAgICAgICAgbmV3T2JqZWN0LT5BZGRSZWYoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld09iamVjdDsKK2lubGluZSBJbnRlcmZhY2VUeXBlKiBTYWZlQWNxdWlyZShJbnRlcmZhY2VUeXBlKiBuZXdPYmplY3QpIHsKKyAgaWYgKG5ld09iamVjdCAhPSBOVUxMKSB7CisgICAgbmV3T2JqZWN0LT5BZGRSZWYoKTsKKyAgfQorICByZXR1cm4gbmV3T2JqZWN0OwogfQotY2xhc3MgQ0R3Rm9udEZpbGVTdHJlYW0gZmluYWwgOiBwdWJsaWMgSURXcml0ZUZvbnRGaWxlU3RyZWFtCi17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQ0R3Rm9udEZpbGVTdHJlYW0odm9pZCBjb25zdCogZm9udEZpbGVSZWZlcmVuY2VLZXksIFVJTlQzMiBmb250RmlsZVJlZmVyZW5jZUtleVNpemUpOwotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBRdWVyeUludGVyZmFjZShSRUZJSUQgaWlkLCB2b2lkKiogcHB2T2JqZWN0KTsKLSAgICB2aXJ0dWFsIFVMT05HICAgU1RETUVUSE9EQ0FMTFRZUEUgQWRkUmVmKCk7Ci0gICAgdmlydHVhbCBVTE9ORyAgIFNURE1FVEhPRENBTExUWVBFIFJlbGVhc2UoKTsKLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUmVhZEZpbGVGcmFnbWVudCh2b2lkIGNvbnN0KiogZnJhZ21lbnRTdGFydCwgVUlOVDY0IGZpbGVPZmZzZXQsIFVJTlQ2NCBmcmFnbWVudFNpemUsIE9VVCB2b2lkKiogZnJhZ21lbnRDb250ZXh0KTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgU1RETUVUSE9EQ0FMTFRZUEUgUmVsZWFzZUZpbGVGcmFnbWVudCh2b2lkKiBmcmFnbWVudENvbnRleHQpOwotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBHZXRGaWxlU2l6ZShPVVQgVUlOVDY0KiBmaWxlU2l6ZSk7Ci0gICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIEdldExhc3RXcml0ZVRpbWUoT1VUIFVJTlQ2NCogbGFzdFdyaXRlVGltZSk7Ci0gICAgYm9vbCBJc0luaXRpYWxpemVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZVB0cl8gIT0gTlVMTDsKLSAgICB9Ci1wcml2YXRlOgotICAgIFVMT05HIHJlZkNvdW50XzsKLSAgICB2b2lkIGNvbnN0KiByZXNvdXJjZVB0cl87Ci0gICAgRFdPUkQgcmVzb3VyY2VTaXplXzsKLX07Ci1jbGFzcyBDRHdGb250RmlsZUxvYWRlciBmaW5hbCA6IHB1YmxpYyBJRFdyaXRlRm9udEZpbGVMb2FkZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUXVlcnlJbnRlcmZhY2UoUkVGSUlEIGlpZCwgdm9pZCoqIHBwdk9iamVjdCk7Ci0gICAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBBZGRSZWYoKTsKLSAgICB2aXJ0dWFsIFVMT05HIFNURE1FVEhPRENBTExUWVBFIFJlbGVhc2UoKTsKLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgQ3JlYXRlU3RyZWFtRnJvbUtleSh2b2lkIGNvbnN0KiBmb250RmlsZVJlZmVyZW5jZUtleSwgVUlOVDMyIGZvbnRGaWxlUmVmZXJlbmNlS2V5U2l6ZSwgT1VUIElEV3JpdGVGb250RmlsZVN0cmVhbSoqIGZvbnRGaWxlU3RyZWFtKTsKK2NsYXNzIENEd0ZvbnRGaWxlU3RyZWFtIGZpbmFsIDogcHVibGljIElEV3JpdGVGb250RmlsZVN0cmVhbSB7CisgcHVibGljOgorICBleHBsaWNpdCBDRHdGb250RmlsZVN0cmVhbSh2b2lkIGNvbnN0KiBmb250RmlsZVJlZmVyZW5jZUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGZvbnRGaWxlUmVmZXJlbmNlS2V5U2l6ZSk7CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBRdWVyeUludGVyZmFjZShSRUZJSUQgaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBwdk9iamVjdCk7CisgIHZpcnR1YWwgVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgQWRkUmVmKCk7CisgIHZpcnR1YWwgVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgUmVsZWFzZSgpOworICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUKKyAgUmVhZEZpbGVGcmFnbWVudCh2b2lkIGNvbnN0KiogZnJhZ21lbnRTdGFydCwKKyAgICAgICAgICAgICAgICAgICBVSU5UNjQgZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBVSU5UNjQgZnJhZ21lbnRTaXplLAorICAgICAgICAgICAgICAgICAgIE9VVCB2b2lkKiogZnJhZ21lbnRDb250ZXh0KTsKKyAgdmlydHVhbCB2b2lkIFNURE1FVEhPRENBTExUWVBFIFJlbGVhc2VGaWxlRnJhZ21lbnQodm9pZCogZnJhZ21lbnRDb250ZXh0KTsKKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIEdldEZpbGVTaXplKE9VVCBVSU5UNjQqIGZpbGVTaXplKTsKKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIEdldExhc3RXcml0ZVRpbWUoT1VUIFVJTlQ2NCogbGFzdFdyaXRlVGltZSk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIHsgcmV0dXJuIHJlc291cmNlUHRyXyAhPSBOVUxMOyB9CiAKLSAgICBzdGF0aWMgSURXcml0ZUZvbnRGaWxlTG9hZGVyKiBHZXRMb2FkZXIoKQotICAgIHsKLSAgICAgICAgaWYgKGluc3RhbmNlXyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnN0YW5jZV8gPSBGWF9ORVcgQ0R3Rm9udEZpbGVMb2FkZXIoKTsKLSAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZV87Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc3RhbmNlXzsKKyBwcml2YXRlOgorICBVTE9ORyByZWZDb3VudF87CisgIHZvaWQgY29uc3QqIHJlc291cmNlUHRyXzsKKyAgRFdPUkQgcmVzb3VyY2VTaXplXzsKK307CitjbGFzcyBDRHdGb250RmlsZUxvYWRlciBmaW5hbCA6IHB1YmxpYyBJRFdyaXRlRm9udEZpbGVMb2FkZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFF1ZXJ5SW50ZXJmYWNlKFJFRklJRCBpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcHB2T2JqZWN0KTsKKyAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBBZGRSZWYoKTsKKyAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBSZWxlYXNlKCk7CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRQorICBDcmVhdGVTdHJlYW1Gcm9tS2V5KHZvaWQgY29uc3QqIGZvbnRGaWxlUmVmZXJlbmNlS2V5LAorICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBmb250RmlsZVJlZmVyZW5jZUtleVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgT1VUIElEV3JpdGVGb250RmlsZVN0cmVhbSoqIGZvbnRGaWxlU3RyZWFtKTsKKworICBzdGF0aWMgSURXcml0ZUZvbnRGaWxlTG9hZGVyKiBHZXRMb2FkZXIoKSB7CisgICAgaWYgKGluc3RhbmNlXyA9PSBOVUxMKSB7CisgICAgICBpbnN0YW5jZV8gPSBGWF9ORVcgQ0R3Rm9udEZpbGVMb2FkZXIoKTsKKyAgICAgIHJldHVybiBpbnN0YW5jZV87CiAgICAgfQotICAgIHN0YXRpYyBib29sIElzTG9hZGVySW5pdGlhbGl6ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlXyAhPSBOVUxMOwotICAgIH0KLXByaXZhdGU6Ci0gICAgQ0R3Rm9udEZpbGVMb2FkZXIoKTsKLSAgICBVTE9ORyByZWZDb3VudF87Ci0gICAgc3RhdGljIElEV3JpdGVGb250RmlsZUxvYWRlciogaW5zdGFuY2VfOworICAgIHJldHVybiBpbnN0YW5jZV87CisgIH0KKyAgc3RhdGljIGJvb2wgSXNMb2FkZXJJbml0aWFsaXplZCgpIHsgcmV0dXJuIGluc3RhbmNlXyAhPSBOVUxMOyB9CisKKyBwcml2YXRlOgorICBDRHdGb250RmlsZUxvYWRlcigpOworICBVTE9ORyByZWZDb3VudF87CisgIHN0YXRpYyBJRFdyaXRlRm9udEZpbGVMb2FkZXIqIGluc3RhbmNlXzsKIH07Ci1jbGFzcyBDRHdGb250Q29udGV4dAotewotcHVibGljOgotICAgIENEd0ZvbnRDb250ZXh0KElEV3JpdGVGYWN0b3J5KiBkd3JpdGVGYWN0b3J5KTsKLSAgICB+Q0R3Rm9udENvbnRleHQoKTsKLSAgICBIUkVTVUxUIEluaXRpYWxpemUoKTsKLXByaXZhdGU6Ci0gICAgQ0R3Rm9udENvbnRleHQoQ0R3Rm9udENvbnRleHQgY29uc3QmKTsKLSAgICB2b2lkIG9wZXJhdG9yPShDRHdGb250Q29udGV4dCBjb25zdCYpOwotICAgIEhSRVNVTFQgaHJfOwotICAgIElEV3JpdGVGYWN0b3J5KiBkd3JpdGVGYWN0b3J5XzsKK2NsYXNzIENEd0ZvbnRDb250ZXh0IHsKKyBwdWJsaWM6CisgIENEd0ZvbnRDb250ZXh0KElEV3JpdGVGYWN0b3J5KiBkd3JpdGVGYWN0b3J5KTsKKyAgfkNEd0ZvbnRDb250ZXh0KCk7CisgIEhSRVNVTFQgSW5pdGlhbGl6ZSgpOworCisgcHJpdmF0ZToKKyAgQ0R3Rm9udENvbnRleHQoQ0R3Rm9udENvbnRleHQgY29uc3QmKTsKKyAgdm9pZCBvcGVyYXRvcj0oQ0R3Rm9udENvbnRleHQgY29uc3QmKTsKKyAgSFJFU1VMVCBocl87CisgIElEV3JpdGVGYWN0b3J5KiBkd3JpdGVGYWN0b3J5XzsKIH07Ci1jbGFzcyBDRHdHZGlUZXh0UmVuZGVyZXIKLXsKLXB1YmxpYzoKLSAgICBDRHdHZGlUZXh0UmVuZGVyZXIoCi0gICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCwKLSAgICAgICAgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCogYml0bWFwUmVuZGVyVGFyZ2V0LAotICAgICAgICBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zKiByZW5kZXJpbmdQYXJhbXMKLSAgICApOwotICAgIH5DRHdHZGlUZXh0UmVuZGVyZXIoKTsKLSAgICBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIERyYXdHbHlwaFJ1bigKLSAgICAgICAgY29uc3QgRlhfUkVDVCYgdGV4dF9iYm94LAotICAgICAgICBfX2luX29wdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCi0gICAgICAgIF9faW5fb3B0IERXUklURV9NQVRSSVggY29uc3QqIHBNYXRyaXgsCi0gICAgICAgIEZMT0FUIGJhc2VsaW5lT3JpZ2luWCwKLSAgICAgICAgRkxPQVQgYmFzZWxpbmVPcmlnaW5ZLAotICAgICAgICBEV1JJVEVfTUVBU1VSSU5HX01PREUgbWVhc3VyaW5nTW9kZSwKLSAgICAgICAgX19pbiBEV1JJVEVfR0xZUEhfUlVOIGNvbnN0KiBnbHlwaFJ1biwKLSAgICAgICAgY29uc3QgQ09MT1JSRUYmIHRleHRDb2xvcgotICAgICk7Ci1wcml2YXRlOgotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcF87Ci0gICAgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCogcFJlbmRlclRhcmdldF87Ci0gICAgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyogcFJlbmRlcmluZ1BhcmFtc187CitjbGFzcyBDRHdHZGlUZXh0UmVuZGVyZXIgeworIHB1YmxpYzoKKyAgQ0R3R2RpVGV4dFJlbmRlcmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQqIGJpdG1hcFJlbmRlclRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMqIHJlbmRlcmluZ1BhcmFtcyk7CisgIH5DRHdHZGlUZXh0UmVuZGVyZXIoKTsKKyAgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBEcmF3R2x5cGhSdW4oY29uc3QgRlhfUkVDVCYgdGV4dF9iYm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2luX29wdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW5fb3B0IERXUklURV9NQVRSSVggY29uc3QqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUIGJhc2VsaW5lT3JpZ2luWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVQgYmFzZWxpbmVPcmlnaW5ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV1JJVEVfTUVBU1VSSU5HX01PREUgbWVhc3VyaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbiBEV1JJVEVfR0xZUEhfUlVOIGNvbnN0KiBnbHlwaFJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09MT1JSRUYmIHRleHRDb2xvcik7CisKKyBwcml2YXRlOgorICBDRlhfRElCaXRtYXAqIHBCaXRtYXBfOworICBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0KiBwUmVuZGVyVGFyZ2V0XzsKKyAgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyogcFJlbmRlcmluZ1BhcmFtc187CiB9OwotQ0RXcml0ZUV4dDo6Q0RXcml0ZUV4dCgpCi17Ci0gICAgbV9oTW9kdWxlID0gTlVMTDsKLSAgICBtX3BEV3JpdGVGYWN0b3J5ID0gTlVMTDsKK0NEV3JpdGVFeHQ6OkNEV3JpdGVFeHQoKSB7CisgIG1faE1vZHVsZSA9IE5VTEw7CisgIG1fcERXcml0ZUZhY3RvcnkgPSBOVUxMOworICBtX3BEd0ZvbnRDb250ZXh0ID0gTlVMTDsKKyAgbV9wRHdUZXh0UmVuZGVyZXIgPSBOVUxMOworfQordm9pZCBDRFdyaXRlRXh0OjpMb2FkKCkge30KK3ZvaWQgQ0RXcml0ZUV4dDo6VW5sb2FkKCkgeworICBpZiAobV9wRHdGb250Q29udGV4dCkgeworICAgIGRlbGV0ZSAoQ0R3Rm9udENvbnRleHQqKW1fcER3Rm9udENvbnRleHQ7CiAgICAgbV9wRHdGb250Q29udGV4dCA9IE5VTEw7Ci0gICAgbV9wRHdUZXh0UmVuZGVyZXIgPSBOVUxMOworICB9CisgIFNhZmVSZWxlYXNlKChJRFdyaXRlRmFjdG9yeSoqKSZtX3BEV3JpdGVGYWN0b3J5KTsKIH0KLXZvaWQgQ0RXcml0ZUV4dDo6TG9hZCgpCi17CitDRFdyaXRlRXh0Ojp+Q0RXcml0ZUV4dCgpIHsKKyAgVW5sb2FkKCk7CiB9Ci12b2lkIENEV3JpdGVFeHQ6OlVubG9hZCgpCi17Ci0gICAgaWYgKG1fcER3Rm9udENvbnRleHQpIHsKLSAgICAgICAgZGVsZXRlIChDRHdGb250Q29udGV4dCopbV9wRHdGb250Q29udGV4dDsKLSAgICAgICAgbV9wRHdGb250Q29udGV4dCA9IE5VTEw7Ci0gICAgfQotICAgIFNhZmVSZWxlYXNlKChJRFdyaXRlRmFjdG9yeSoqKSZtX3BEV3JpdGVGYWN0b3J5KTsKLX0KLUNEV3JpdGVFeHQ6On5DRFdyaXRlRXh0KCkKLXsKLSAgICBVbmxvYWQoKTsKLX0KLUxQVk9JRAlDRFdyaXRlRXh0OjpEd0NyZWF0ZUZvbnRGYWNlRnJvbVN0cmVhbSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IHNpbXVsYXRpb25fc3R5bGUpCi17Ci0gICAgSURXcml0ZUZhY3RvcnkqIHBEd0ZhY3RvcnkgPSAoSURXcml0ZUZhY3RvcnkqKW1fcERXcml0ZUZhY3Rvcnk7Ci0gICAgSURXcml0ZUZvbnRGaWxlKiBwRHdGb250RmlsZSA9IE5VTEw7Ci0gICAgSURXcml0ZUZvbnRGYWNlKiBwRHdGb250RmFjZSA9IE5VTEw7Ci0gICAgQk9PTCBpc1N1cHBvcnRlZEZvbnRUeXBlID0gRkFMU0U7Ci0gICAgRFdSSVRFX0ZPTlRfRklMRV9UWVBFIGZvbnRGaWxlVHlwZTsKLSAgICBEV1JJVEVfRk9OVF9GQUNFX1RZUEUgZm9udEZhY2VUeXBlOwotICAgIFVJTlQzMiBudW1iZXJPZkZhY2VzOwotICAgIERXUklURV9GT05UX1NJTVVMQVRJT05TIGZvbnRTdHlsZSA9IChEV1JJVEVfRk9OVF9TSU1VTEFUSU9OUykoc2ltdWxhdGlvbl9zdHlsZSAmIDMpOwotICAgIEhSRVNVTFQgaHIgPSBTX09LOwotICAgIGhyID0gcER3RmFjdG9yeS0+Q3JlYXRlQ3VzdG9tRm9udEZpbGVSZWZlcmVuY2UoCi0gICAgICAgICAgICAgKHZvaWQgY29uc3QqKXBEYXRhLAotICAgICAgICAgICAgIChVSU5UMzIpc2l6ZSwKLSAgICAgICAgICAgICBDRHdGb250RmlsZUxvYWRlcjo6R2V0TG9hZGVyKCksCi0gICAgICAgICAgICAgJnBEd0ZvbnRGaWxlCi0gICAgICAgICApOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBociA9IHBEd0ZvbnRGaWxlLT5BbmFseXplKAotICAgICAgICAgICAgICZpc1N1cHBvcnRlZEZvbnRUeXBlLAotICAgICAgICAgICAgICZmb250RmlsZVR5cGUsCi0gICAgICAgICAgICAgJmZvbnRGYWNlVHlwZSwKLSAgICAgICAgICAgICAmbnVtYmVyT2ZGYWNlcwotICAgICAgICAgKTsKLSAgICBpZiAoRkFJTEVEKGhyKSB8fCAhaXNTdXBwb3J0ZWRGb250VHlwZSB8fCBmb250RmFjZVR5cGUgPT0gRFdSSVRFX0ZPTlRfRkFDRV9UWVBFX1VOS05PV04pIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIGhyID0gcER3RmFjdG9yeS0+Q3JlYXRlRm9udEZhY2UoCi0gICAgICAgICAgICAgZm9udEZhY2VUeXBlLAotICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgJnBEd0ZvbnRGaWxlLAotICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgZm9udFN0eWxlLAotICAgICAgICAgICAgICZwRHdGb250RmFjZQotICAgICAgICAgKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgU2FmZVJlbGVhc2UoJnBEd0ZvbnRGaWxlKTsKLSAgICByZXR1cm4gcER3Rm9udEZhY2U7CitMUFZPSUQgQ0RXcml0ZUV4dDo6RHdDcmVhdGVGb250RmFjZUZyb21TdHJlYW0odWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2ltdWxhdGlvbl9zdHlsZSkgeworICBJRFdyaXRlRmFjdG9yeSogcER3RmFjdG9yeSA9IChJRFdyaXRlRmFjdG9yeSopbV9wRFdyaXRlRmFjdG9yeTsKKyAgSURXcml0ZUZvbnRGaWxlKiBwRHdGb250RmlsZSA9IE5VTEw7CisgIElEV3JpdGVGb250RmFjZSogcER3Rm9udEZhY2UgPSBOVUxMOworICBCT09MIGlzU3VwcG9ydGVkRm9udFR5cGUgPSBGQUxTRTsKKyAgRFdSSVRFX0ZPTlRfRklMRV9UWVBFIGZvbnRGaWxlVHlwZTsKKyAgRFdSSVRFX0ZPTlRfRkFDRV9UWVBFIGZvbnRGYWNlVHlwZTsKKyAgVUlOVDMyIG51bWJlck9mRmFjZXM7CisgIERXUklURV9GT05UX1NJTVVMQVRJT05TIGZvbnRTdHlsZSA9CisgICAgICAoRFdSSVRFX0ZPTlRfU0lNVUxBVElPTlMpKHNpbXVsYXRpb25fc3R5bGUgJiAzKTsKKyAgSFJFU1VMVCBociA9IFNfT0s7CisgIGhyID0gcER3RmFjdG9yeS0+Q3JlYXRlQ3VzdG9tRm9udEZpbGVSZWZlcmVuY2UoCisgICAgICAodm9pZCBjb25zdCopcERhdGEsIChVSU5UMzIpc2l6ZSwgQ0R3Rm9udEZpbGVMb2FkZXI6OkdldExvYWRlcigpLAorICAgICAgJnBEd0ZvbnRGaWxlKTsKKyAgaWYgKEZBSUxFRChocikpIHsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBociA9IHBEd0ZvbnRGaWxlLT5BbmFseXplKCZpc1N1cHBvcnRlZEZvbnRUeXBlLCAmZm9udEZpbGVUeXBlLCAmZm9udEZhY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZkZhY2VzKTsKKyAgaWYgKEZBSUxFRChocikgfHwgIWlzU3VwcG9ydGVkRm9udFR5cGUgfHwKKyAgICAgIGZvbnRGYWNlVHlwZSA9PSBEV1JJVEVfRk9OVF9GQUNFX1RZUEVfVU5LTk9XTikgeworICAgIGdvdG8gZmFpbGVkOworICB9CisgIGhyID0gcER3RmFjdG9yeS0+Q3JlYXRlRm9udEZhY2UoZm9udEZhY2VUeXBlLCAxLCAmcER3Rm9udEZpbGUsIDAsIGZvbnRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcER3Rm9udEZhY2UpOworICBpZiAoRkFJTEVEKGhyKSkgeworICAgIGdvdG8gZmFpbGVkOworICB9CisgIFNhZmVSZWxlYXNlKCZwRHdGb250RmlsZSk7CisgIHJldHVybiBwRHdGb250RmFjZTsKIGZhaWxlZDoKLSAgICBTYWZlUmVsZWFzZSgmcER3Rm9udEZpbGUpOwotICAgIHJldHVybiBOVUxMOworICBTYWZlUmVsZWFzZSgmcER3Rm9udEZpbGUpOworICByZXR1cm4gTlVMTDsKIH0KLUZYX0JPT0wgQ0RXcml0ZUV4dDo6RHdDcmVhdGVSZW5kZXJpbmdUYXJnZXQoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKiogcmVuZGVyVGFyZ2V0KQotewotICAgIGlmIChwQml0bWFwLT5HZXRGb3JtYXQoKSA+IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBJRFdyaXRlRmFjdG9yeSogcER3RmFjdG9yeSA9IChJRFdyaXRlRmFjdG9yeSopbV9wRFdyaXRlRmFjdG9yeTsKLSAgICBJRFdyaXRlR2RpSW50ZXJvcCogcEdkaUludGVyb3AgPSBOVUxMOwotICAgIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQqIHBCaXRtYXBSZW5kZXJUYXJnZXQgPSBOVUxMOwotICAgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMqIHBSZW5kZXJpbmdQYXJhbXMgPSBOVUxMOwotICAgIEhSRVNVTFQgaHIgPSBTX09LOwotICAgIGhyID0gcER3RmFjdG9yeS0+R2V0R2RpSW50ZXJvcCgmcEdkaUludGVyb3ApOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBociA9IHBHZGlJbnRlcm9wLT5DcmVhdGVCaXRtYXBSZW5kZXJUYXJnZXQoTlVMTCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAmcEJpdG1hcFJlbmRlclRhcmdldCk7Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIGhyID0gcER3RmFjdG9yeS0+Q3JlYXRlQ3VzdG9tUmVuZGVyaW5nUGFyYW1zKAotICAgICAgICAgICAgIDEuMGYsCi0gICAgICAgICAgICAgMC4wZiwKLSAgICAgICAgICAgICAxLjBmLAotICAgICAgICAgICAgIERXUklURV9QSVhFTF9HRU9NRVRSWV9SR0IsCi0gICAgICAgICAgICAgRFdSSVRFX1JFTkRFUklOR19NT0RFX0RFRkFVTFQsCi0gICAgICAgICAgICAgJnBSZW5kZXJpbmdQYXJhbXMKLSAgICAgICAgICk7Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIGhyID0gcEJpdG1hcFJlbmRlclRhcmdldC0+U2V0UGl4ZWxzUGVyRGlwKDEuMGYpOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICAqKENEd0dkaVRleHRSZW5kZXJlcioqKXJlbmRlclRhcmdldCA9IEZYX05FVyBDRHdHZGlUZXh0UmVuZGVyZXIocEJpdG1hcCwgcEJpdG1hcFJlbmRlclRhcmdldCwgcFJlbmRlcmluZ1BhcmFtcyk7Ci0gICAgaWYgKCooQ0R3R2RpVGV4dFJlbmRlcmVyKiopcmVuZGVyVGFyZ2V0ID09IE5VTEwpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIFNhZmVSZWxlYXNlKCZwR2RpSW50ZXJvcCk7Ci0gICAgU2FmZVJlbGVhc2UoJnBCaXRtYXBSZW5kZXJUYXJnZXQpOwotICAgIFNhZmVSZWxlYXNlKCZwUmVuZGVyaW5nUGFyYW1zKTsKLSAgICByZXR1cm4gVFJVRTsKLWZhaWxlZDoKLSAgICBTYWZlUmVsZWFzZSgmcEdkaUludGVyb3ApOwotICAgIFNhZmVSZWxlYXNlKCZwQml0bWFwUmVuZGVyVGFyZ2V0KTsKLSAgICBTYWZlUmVsZWFzZSgmcFJlbmRlcmluZ1BhcmFtcyk7CitGWF9CT09MIENEV3JpdGVFeHQ6OkR3Q3JlYXRlUmVuZGVyaW5nVGFyZ2V0KENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHJlbmRlclRhcmdldCkgeworICBpZiAocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPiBGWERJQl9BcmdiKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIElEV3JpdGVGYWN0b3J5KiBwRHdGYWN0b3J5ID0gKElEV3JpdGVGYWN0b3J5KiltX3BEV3JpdGVGYWN0b3J5OworICBJRFdyaXRlR2RpSW50ZXJvcCogcEdkaUludGVyb3AgPSBOVUxMOworICBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0KiBwQml0bWFwUmVuZGVyVGFyZ2V0ID0gTlVMTDsKKyAgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyogcFJlbmRlcmluZ1BhcmFtcyA9IE5VTEw7CisgIEhSRVNVTFQgaHIgPSBTX09LOworICBociA9IHBEd0ZhY3RvcnktPkdldEdkaUludGVyb3AoJnBHZGlJbnRlcm9wKTsKKyAgaWYgKEZBSUxFRChocikpIHsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBociA9IHBHZGlJbnRlcm9wLT5DcmVhdGVCaXRtYXBSZW5kZXJUYXJnZXQoCisgICAgICBOVUxMLCBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSwgJnBCaXRtYXBSZW5kZXJUYXJnZXQpOworICBpZiAoRkFJTEVEKGhyKSkgeworICAgIGdvdG8gZmFpbGVkOworICB9CisgIGhyID0gcER3RmFjdG9yeS0+Q3JlYXRlQ3VzdG9tUmVuZGVyaW5nUGFyYW1zKAorICAgICAgMS4wZiwgMC4wZiwgMS4wZiwgRFdSSVRFX1BJWEVMX0dFT01FVFJZX1JHQiwKKyAgICAgIERXUklURV9SRU5ERVJJTkdfTU9ERV9ERUZBVUxULCAmcFJlbmRlcmluZ1BhcmFtcyk7CisgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgaHIgPSBwQml0bWFwUmVuZGVyVGFyZ2V0LT5TZXRQaXhlbHNQZXJEaXAoMS4wZik7CisgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgKihDRHdHZGlUZXh0UmVuZGVyZXIqKilyZW5kZXJUYXJnZXQgPQorICAgICAgRlhfTkVXIENEd0dkaVRleHRSZW5kZXJlcihwQml0bWFwLCBwQml0bWFwUmVuZGVyVGFyZ2V0LCBwUmVuZGVyaW5nUGFyYW1zKTsKKyAgaWYgKCooQ0R3R2RpVGV4dFJlbmRlcmVyKiopcmVuZGVyVGFyZ2V0ID09IE5VTEwpIHsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBTYWZlUmVsZWFzZSgmcEdkaUludGVyb3ApOworICBTYWZlUmVsZWFzZSgmcEJpdG1hcFJlbmRlclRhcmdldCk7CisgIFNhZmVSZWxlYXNlKCZwUmVuZGVyaW5nUGFyYW1zKTsKKyAgcmV0dXJuIFRSVUU7CitmYWlsZWQ6CisgIFNhZmVSZWxlYXNlKCZwR2RpSW50ZXJvcCk7CisgIFNhZmVSZWxlYXNlKCZwQml0bWFwUmVuZGVyVGFyZ2V0KTsKKyAgU2FmZVJlbGVhc2UoJnBSZW5kZXJpbmdQYXJhbXMpOworICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MCUNEV3JpdGVFeHQ6OkR3UmVuZGluZ1N0cmluZyh2b2lkKiByZW5kZXJUYXJnZXQsIENGWF9DbGlwUmduKiBwQ2xpcFJnbiwgRlhfUkVDVCYgc3RyaW5nUmVjdCwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfQVJHQiB0ZXh0X2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdseXBoX2NvdW50LCB1bnNpZ25lZCBzaG9ydCogZ2x5cGhfaW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJhc2VsaW5lT3JpZ2luWCwgRlhfRkxPQVQgYmFzZWxpbmVPcmlnaW5ZLAorRlhfQk9PTCBDRFdyaXRlRXh0OjpEd1JlbmRpbmdTdHJpbmcodm9pZCogcmVuZGVyVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCYgc3RyaW5nUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiB0ZXh0X2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdseXBoX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIGdseXBoX2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiYXNlbGluZU9yaWdpblgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiYXNlbGluZU9yaWdpblksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBnbHlwaF9vZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIGdseXBoX2FkdmFuY2VzKQotewotICAgIGlmIChyZW5kZXJUYXJnZXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgQ0R3R2RpVGV4dFJlbmRlcmVyKiBwVGV4dFJlbmRlcmVyID0gKENEd0dkaVRleHRSZW5kZXJlciopcmVuZGVyVGFyZ2V0OwotICAgIERXUklURV9NQVRSSVggdHJhbnNmb3JtOwotICAgIERXUklURV9HTFlQSF9SVU4gZ2x5cGhSdW47Ci0gICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgdHJhbnNmb3JtLm0xMSA9IHBNYXRyaXgtPmE7Ci0gICAgICAgIHRyYW5zZm9ybS5tMTIgPSBwTWF0cml4LT5iOwotICAgICAgICB0cmFuc2Zvcm0ubTIxID0gcE1hdHJpeC0+YzsKLSAgICAgICAgdHJhbnNmb3JtLm0yMiA9IHBNYXRyaXgtPmQ7Ci0gICAgICAgIHRyYW5zZm9ybS5keCA9IHBNYXRyaXgtPmU7Ci0gICAgICAgIHRyYW5zZm9ybS5keSA9IHBNYXRyaXgtPmY7Ci0gICAgfQotICAgIGdseXBoUnVuLmZvbnRGYWNlID0gKElEV3JpdGVGb250RmFjZSopZm9udDsKLSAgICBnbHlwaFJ1bi5mb250RW1TaXplID0gZm9udF9zaXplOwotICAgIGdseXBoUnVuLmdseXBoQ291bnQgPSBnbHlwaF9jb3VudDsKLSAgICBnbHlwaFJ1bi5nbHlwaEluZGljZXMgPSBnbHlwaF9pbmRpY2VzOwotICAgIGdseXBoUnVuLmdseXBoQWR2YW5jZXMgPSBnbHlwaF9hZHZhbmNlczsKLSAgICBnbHlwaFJ1bi5nbHlwaE9mZnNldHMgPSAoRFdSSVRFX0dMWVBIX09GRlNFVCopZ2x5cGhfb2Zmc2V0czsKLSAgICBnbHlwaFJ1bi5pc1NpZGV3YXlzID0gRkFMU0U7Ci0gICAgZ2x5cGhSdW4uYmlkaUxldmVsID0gMDsKLSAgICBociA9IHBUZXh0UmVuZGVyZXItPkRyYXdHbHlwaFJ1bigKLSAgICAgICAgICAgICBzdHJpbmdSZWN0LAotICAgICAgICAgICAgIHBDbGlwUmduLAotICAgICAgICAgICAgIHBNYXRyaXggPyAmdHJhbnNmb3JtIDogTlVMTCwKLSAgICAgICAgICAgICBiYXNlbGluZU9yaWdpblgsIGJhc2VsaW5lT3JpZ2luWSwKLSAgICAgICAgICAgICBEV1JJVEVfTUVBU1VSSU5HX01PREVfTkFUVVJBTCwKLSAgICAgICAgICAgICAmZ2x5cGhSdW4sCi0gICAgICAgICAgICAgUkdCKEZYQVJHQl9SKHRleHRfY29sb3IpLCBGWEFSR0JfRyh0ZXh0X2NvbG9yKSwgRlhBUkdCX0IodGV4dF9jb2xvcikpCi0gICAgICAgICApOwotICAgIHJldHVybiBTVUNDRUVERUQoaHIpID8gVFJVRSA6IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIGdseXBoX2FkdmFuY2VzKSB7CisgIGlmIChyZW5kZXJUYXJnZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIENEd0dkaVRleHRSZW5kZXJlciogcFRleHRSZW5kZXJlciA9IChDRHdHZGlUZXh0UmVuZGVyZXIqKXJlbmRlclRhcmdldDsKKyAgRFdSSVRFX01BVFJJWCB0cmFuc2Zvcm07CisgIERXUklURV9HTFlQSF9SVU4gZ2x5cGhSdW47CisgIEhSRVNVTFQgaHIgPSBTX09LOworICBpZiAocE1hdHJpeCkgeworICAgIHRyYW5zZm9ybS5tMTEgPSBwTWF0cml4LT5hOworICAgIHRyYW5zZm9ybS5tMTIgPSBwTWF0cml4LT5iOworICAgIHRyYW5zZm9ybS5tMjEgPSBwTWF0cml4LT5jOworICAgIHRyYW5zZm9ybS5tMjIgPSBwTWF0cml4LT5kOworICAgIHRyYW5zZm9ybS5keCA9IHBNYXRyaXgtPmU7CisgICAgdHJhbnNmb3JtLmR5ID0gcE1hdHJpeC0+ZjsKKyAgfQorICBnbHlwaFJ1bi5mb250RmFjZSA9IChJRFdyaXRlRm9udEZhY2UqKWZvbnQ7CisgIGdseXBoUnVuLmZvbnRFbVNpemUgPSBmb250X3NpemU7CisgIGdseXBoUnVuLmdseXBoQ291bnQgPSBnbHlwaF9jb3VudDsKKyAgZ2x5cGhSdW4uZ2x5cGhJbmRpY2VzID0gZ2x5cGhfaW5kaWNlczsKKyAgZ2x5cGhSdW4uZ2x5cGhBZHZhbmNlcyA9IGdseXBoX2FkdmFuY2VzOworICBnbHlwaFJ1bi5nbHlwaE9mZnNldHMgPSAoRFdSSVRFX0dMWVBIX09GRlNFVCopZ2x5cGhfb2Zmc2V0czsKKyAgZ2x5cGhSdW4uaXNTaWRld2F5cyA9IEZBTFNFOworICBnbHlwaFJ1bi5iaWRpTGV2ZWwgPSAwOworICBociA9IHBUZXh0UmVuZGVyZXItPkRyYXdHbHlwaFJ1bigKKyAgICAgIHN0cmluZ1JlY3QsIHBDbGlwUmduLCBwTWF0cml4ID8gJnRyYW5zZm9ybSA6IE5VTEwsIGJhc2VsaW5lT3JpZ2luWCwKKyAgICAgIGJhc2VsaW5lT3JpZ2luWSwgRFdSSVRFX01FQVNVUklOR19NT0RFX05BVFVSQUwsICZnbHlwaFJ1biwKKyAgICAgIFJHQihGWEFSR0JfUih0ZXh0X2NvbG9yKSwgRlhBUkdCX0codGV4dF9jb2xvciksIEZYQVJHQl9CKHRleHRfY29sb3IpKSk7CisgIHJldHVybiBTVUNDRUVERUQoaHIpID8gVFJVRSA6IEZBTFNFOwogfQotdm9pZCBDRFdyaXRlRXh0OjpEd0RlbGV0ZVJlbmRlcmluZ1RhcmdldCh2b2lkKiByZW5kZXJUYXJnZXQpCi17Ci0gICAgZGVsZXRlIChDRHdHZGlUZXh0UmVuZGVyZXIqKXJlbmRlclRhcmdldDsKK3ZvaWQgQ0RXcml0ZUV4dDo6RHdEZWxldGVSZW5kZXJpbmdUYXJnZXQodm9pZCogcmVuZGVyVGFyZ2V0KSB7CisgIGRlbGV0ZSAoQ0R3R2RpVGV4dFJlbmRlcmVyKilyZW5kZXJUYXJnZXQ7CiB9Ci12b2lkIENEV3JpdGVFeHQ6OkR3RGVsZXRlRm9udCh2b2lkKiBwRm9udCkKLXsKLSAgICBpZiAocEZvbnQpIHsKLSAgICAgICAgU2FmZVJlbGVhc2UoKElEV3JpdGVGb250RmFjZSoqKSZwRm9udCk7Ci0gICAgfQordm9pZCBDRFdyaXRlRXh0OjpEd0RlbGV0ZUZvbnQodm9pZCogcEZvbnQpIHsKKyAgaWYgKHBGb250KSB7CisgICAgU2FmZVJlbGVhc2UoKElEV3JpdGVGb250RmFjZSoqKSZwRm9udCk7CisgIH0KIH0KLUNEd0ZvbnRGaWxlU3RyZWFtOjpDRHdGb250RmlsZVN0cmVhbSh2b2lkIGNvbnN0KiBmb250RmlsZVJlZmVyZW5jZUtleSwgVUlOVDMyIGZvbnRGaWxlUmVmZXJlbmNlS2V5U2l6ZSkKLXsKLSAgICByZWZDb3VudF8gPSAwOwotICAgIHJlc291cmNlUHRyXyA9IGZvbnRGaWxlUmVmZXJlbmNlS2V5OwotICAgIHJlc291cmNlU2l6ZV8gPSBmb250RmlsZVJlZmVyZW5jZUtleVNpemU7CitDRHdGb250RmlsZVN0cmVhbTo6Q0R3Rm9udEZpbGVTdHJlYW0odm9pZCBjb25zdCogZm9udEZpbGVSZWZlcmVuY2VLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGZvbnRGaWxlUmVmZXJlbmNlS2V5U2l6ZSkgeworICByZWZDb3VudF8gPSAwOworICByZXNvdXJjZVB0cl8gPSBmb250RmlsZVJlZmVyZW5jZUtleTsKKyAgcmVzb3VyY2VTaXplXyA9IGZvbnRGaWxlUmVmZXJlbmNlS2V5U2l6ZTsKIH0KLUhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVTdHJlYW06OlF1ZXJ5SW50ZXJmYWNlKFJFRklJRCBpaWQsIHZvaWQqKiBwcHZPYmplY3QpCi17Ci0gICAgaWYgKGlpZCA9PSBJSURfSVVua25vd24gfHwgaWlkID09IF9fdXVpZG9mKElEV3JpdGVGb250RmlsZVN0cmVhbSkpIHsKLSAgICAgICAgKnBwdk9iamVjdCA9IHRoaXM7Ci0gICAgICAgIEFkZFJlZigpOwotICAgICAgICByZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgKnBwdk9iamVjdCA9IE5VTEw7Ci0gICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Ci19Ci1VTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZVN0cmVhbTo6QWRkUmVmKCkKLXsKLSAgICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQoKGxvbmcqKSgmcmVmQ291bnRfKSk7Ci19Ci1VTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZVN0cmVhbTo6UmVsZWFzZSgpCi17Ci0gICAgVUxPTkcgbmV3Q291bnQgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgobG9uZyopKCZyZWZDb3VudF8pKTsKLSAgICBpZiAobmV3Q291bnQgPT0gMCkgewotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld0NvdW50OwotfQotSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZVN0cmVhbTo6UmVhZEZpbGVGcmFnbWVudCgKLSAgICB2b2lkIGNvbnN0KiogZnJhZ21lbnRTdGFydCwKLSAgICBVSU5UNjQgZmlsZU9mZnNldCwKLSAgICBVSU5UNjQgZnJhZ21lbnRTaXplLAotICAgIE9VVCB2b2lkKiogZnJhZ21lbnRDb250ZXh0Ci0pCi17Ci0gICAgaWYgKGZpbGVPZmZzZXQgPD0gcmVzb3VyY2VTaXplXyAmJiBmcmFnbWVudFNpemUgPD0gcmVzb3VyY2VTaXplXyAtIGZpbGVPZmZzZXQpIHsKLSAgICAgICAgKmZyYWdtZW50U3RhcnQgPSBzdGF0aWNfY2FzdDx1aW50OF90IGNvbnN0Kj4ocmVzb3VyY2VQdHJfKSArIHN0YXRpY19jYXN0PHNpemVfdD4oZmlsZU9mZnNldCk7Ci0gICAgICAgICpmcmFnbWVudENvbnRleHQgPSBOVUxMOwotICAgICAgICByZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgKmZyYWdtZW50U3RhcnQgPSBOVUxMOwotICAgICpmcmFnbWVudENvbnRleHQgPSBOVUxMOwotICAgIHJldHVybiBFX0ZBSUw7Ci19Ci12b2lkIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlU3RyZWFtOjpSZWxlYXNlRmlsZUZyYWdtZW50KHZvaWQqIGZyYWdtZW50Q29udGV4dCkKLXsKLX0KLUhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVTdHJlYW06OkdldEZpbGVTaXplKE9VVCBVSU5UNjQqIGZpbGVTaXplKQotewotICAgICpmaWxlU2l6ZSA9IHJlc291cmNlU2l6ZV87CitIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlU3RyZWFtOjpRdWVyeUludGVyZmFjZShSRUZJSUQgaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBwdk9iamVjdCkgeworICBpZiAoaWlkID09IElJRF9JVW5rbm93biB8fCBpaWQgPT0gX191dWlkb2YoSURXcml0ZUZvbnRGaWxlU3RyZWFtKSkgeworICAgICpwcHZPYmplY3QgPSB0aGlzOworICAgIEFkZFJlZigpOwogICAgIHJldHVybiBTX09LOworICB9CisgICpwcHZPYmplY3QgPSBOVUxMOworICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKIH0KLUhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVTdHJlYW06OkdldExhc3RXcml0ZVRpbWUoT1VUIFVJTlQ2NCogbGFzdFdyaXRlVGltZSkKLXsKLSAgICAqbGFzdFdyaXRlVGltZSA9IDA7Ci0gICAgcmV0dXJuIEVfTk9USU1QTDsKK1VMT05HIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlU3RyZWFtOjpBZGRSZWYoKSB7CisgIHJldHVybiBJbnRlcmxvY2tlZEluY3JlbWVudCgobG9uZyopKCZyZWZDb3VudF8pKTsKK30KK1VMT05HIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlU3RyZWFtOjpSZWxlYXNlKCkgeworICBVTE9ORyBuZXdDb3VudCA9IEludGVybG9ja2VkRGVjcmVtZW50KChsb25nKikoJnJlZkNvdW50XykpOworICBpZiAobmV3Q291bnQgPT0gMCkgeworICAgIGRlbGV0ZSB0aGlzOworICB9CisgIHJldHVybiBuZXdDb3VudDsKK30KK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUKK0NEd0ZvbnRGaWxlU3RyZWFtOjpSZWFkRmlsZUZyYWdtZW50KHZvaWQgY29uc3QqKiBmcmFnbWVudFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDY0IGZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UNjQgZnJhZ21lbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUIHZvaWQqKiBmcmFnbWVudENvbnRleHQpIHsKKyAgaWYgKGZpbGVPZmZzZXQgPD0gcmVzb3VyY2VTaXplXyAmJgorICAgICAgZnJhZ21lbnRTaXplIDw9IHJlc291cmNlU2l6ZV8gLSBmaWxlT2Zmc2V0KSB7CisgICAgKmZyYWdtZW50U3RhcnQgPSBzdGF0aWNfY2FzdDx1aW50OF90IGNvbnN0Kj4ocmVzb3VyY2VQdHJfKSArCisgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KGZpbGVPZmZzZXQpOworICAgICpmcmFnbWVudENvbnRleHQgPSBOVUxMOworICAgIHJldHVybiBTX09LOworICB9CisgICpmcmFnbWVudFN0YXJ0ID0gTlVMTDsKKyAgKmZyYWdtZW50Q29udGV4dCA9IE5VTEw7CisgIHJldHVybiBFX0ZBSUw7Cit9Cit2b2lkIFNURE1FVEhPRENBTExUWVBFCitDRHdGb250RmlsZVN0cmVhbTo6UmVsZWFzZUZpbGVGcmFnbWVudCh2b2lkKiBmcmFnbWVudENvbnRleHQpIHt9CitIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlU3RyZWFtOjpHZXRGaWxlU2l6ZShPVVQgVUlOVDY0KiBmaWxlU2l6ZSkgeworICAqZmlsZVNpemUgPSByZXNvdXJjZVNpemVfOworICByZXR1cm4gU19PSzsKK30KK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUKK0NEd0ZvbnRGaWxlU3RyZWFtOjpHZXRMYXN0V3JpdGVUaW1lKE9VVCBVSU5UNjQqIGxhc3RXcml0ZVRpbWUpIHsKKyAgKmxhc3RXcml0ZVRpbWUgPSAwOworICByZXR1cm4gRV9OT1RJTVBMOwogfQogSURXcml0ZUZvbnRGaWxlTG9hZGVyKiBDRHdGb250RmlsZUxvYWRlcjo6aW5zdGFuY2VfID0gTlVMTDsKLUNEd0ZvbnRGaWxlTG9hZGVyOjpDRHdGb250RmlsZUxvYWRlcigpIDoKLSAgICByZWZDb3VudF8oMCkKLXsKK0NEd0ZvbnRGaWxlTG9hZGVyOjpDRHdGb250RmlsZUxvYWRlcigpIDogcmVmQ291bnRfKDApIHt9CitIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlTG9hZGVyOjpRdWVyeUludGVyZmFjZShSRUZJSUQgaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBwdk9iamVjdCkgeworICBpZiAoaWlkID09IElJRF9JVW5rbm93biB8fCBpaWQgPT0gX191dWlkb2YoSURXcml0ZUZvbnRGaWxlTG9hZGVyKSkgeworICAgICpwcHZPYmplY3QgPSB0aGlzOworICAgIEFkZFJlZigpOworICAgIHJldHVybiBTX09LOworICB9CisgICpwcHZPYmplY3QgPSBOVUxMOworICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKIH0KLUhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVMb2FkZXI6OlF1ZXJ5SW50ZXJmYWNlKFJFRklJRCBpaWQsIHZvaWQqKiBwcHZPYmplY3QpCi17Ci0gICAgaWYgKGlpZCA9PSBJSURfSVVua25vd24gfHwgaWlkID09IF9fdXVpZG9mKElEV3JpdGVGb250RmlsZUxvYWRlcikpIHsKLSAgICAgICAgKnBwdk9iamVjdCA9IHRoaXM7Ci0gICAgICAgIEFkZFJlZigpOwotICAgICAgICByZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgKnBwdk9iamVjdCA9IE5VTEw7Ci0gICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CitVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZUxvYWRlcjo6QWRkUmVmKCkgeworICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQoKGxvbmcqKSgmcmVmQ291bnRfKSk7CiB9Ci1VTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZUxvYWRlcjo6QWRkUmVmKCkKLXsKLSAgICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQoKGxvbmcqKSgmcmVmQ291bnRfKSk7Ci19Ci1VTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZUxvYWRlcjo6UmVsZWFzZSgpCi17Ci0gICAgVUxPTkcgbmV3Q291bnQgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgobG9uZyopKCZyZWZDb3VudF8pKTsKLSAgICBpZiAobmV3Q291bnQgPT0gMCkgewotICAgICAgICBpbnN0YW5jZV8gPSBOVUxMOwotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld0NvdW50OworVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVMb2FkZXI6OlJlbGVhc2UoKSB7CisgIFVMT05HIG5ld0NvdW50ID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoKGxvbmcqKSgmcmVmQ291bnRfKSk7CisgIGlmIChuZXdDb3VudCA9PSAwKSB7CisgICAgaW5zdGFuY2VfID0gTlVMTDsKKyAgICBkZWxldGUgdGhpczsKKyAgfQorICByZXR1cm4gbmV3Q291bnQ7CiB9CiBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlTG9hZGVyOjpDcmVhdGVTdHJlYW1Gcm9tS2V5KAogICAgIHZvaWQgY29uc3QqIGZvbnRGaWxlUmVmZXJlbmNlS2V5LAogICAgIFVJTlQzMiBmb250RmlsZVJlZmVyZW5jZUtleVNpemUsCi0gICAgT1VUIElEV3JpdGVGb250RmlsZVN0cmVhbSoqIGZvbnRGaWxlU3RyZWFtCi0pCi17Ci0gICAgKmZvbnRGaWxlU3RyZWFtID0gTlVMTDsKLSAgICBDRHdGb250RmlsZVN0cmVhbSogc3RyZWFtID0gRlhfTkVXIENEd0ZvbnRGaWxlU3RyZWFtKGZvbnRGaWxlUmVmZXJlbmNlS2V5LCBmb250RmlsZVJlZmVyZW5jZUtleVNpemUpOwotICAgIGlmIChzdHJlYW0gPT0gTlVMTCkJewotICAgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLSAgICB9Ci0gICAgaWYgKCFzdHJlYW0tPklzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICBkZWxldGUgc3RyZWFtOwotICAgICAgICByZXR1cm4gRV9GQUlMOwotICAgIH0KLSAgICAqZm9udEZpbGVTdHJlYW0gPSBTYWZlQWNxdWlyZShzdHJlYW0pOwotICAgIHJldHVybiBTX09LOworICAgIE9VVCBJRFdyaXRlRm9udEZpbGVTdHJlYW0qKiBmb250RmlsZVN0cmVhbSkgeworICAqZm9udEZpbGVTdHJlYW0gPSBOVUxMOworICBDRHdGb250RmlsZVN0cmVhbSogc3RyZWFtID0KKyAgICAgIEZYX05FVyBDRHdGb250RmlsZVN0cmVhbShmb250RmlsZVJlZmVyZW5jZUtleSwgZm9udEZpbGVSZWZlcmVuY2VLZXlTaXplKTsKKyAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisgIH0KKyAgaWYgKCFzdHJlYW0tPklzSW5pdGlhbGl6ZWQoKSkgeworICAgIGRlbGV0ZSBzdHJlYW07CisgICAgcmV0dXJuIEVfRkFJTDsKKyAgfQorICAqZm9udEZpbGVTdHJlYW0gPSBTYWZlQWNxdWlyZShzdHJlYW0pOworICByZXR1cm4gU19PSzsKIH0KLUNEd0ZvbnRDb250ZXh0OjpDRHdGb250Q29udGV4dChJRFdyaXRlRmFjdG9yeSogZHdyaXRlRmFjdG9yeSkgOgotICAgIGhyXyhTX0ZBTFNFKSwKLSAgICBkd3JpdGVGYWN0b3J5XyhTYWZlQWNxdWlyZShkd3JpdGVGYWN0b3J5KSkKLXsKK0NEd0ZvbnRDb250ZXh0OjpDRHdGb250Q29udGV4dChJRFdyaXRlRmFjdG9yeSogZHdyaXRlRmFjdG9yeSkKKyAgICA6IGhyXyhTX0ZBTFNFKSwgZHdyaXRlRmFjdG9yeV8oU2FmZUFjcXVpcmUoZHdyaXRlRmFjdG9yeSkpIHt9CitDRHdGb250Q29udGV4dDo6fkNEd0ZvbnRDb250ZXh0KCkgeworICBpZiAoZHdyaXRlRmFjdG9yeV8gJiYgaHJfID09IFNfT0spIHsKKyAgICBkd3JpdGVGYWN0b3J5Xy0+VW5yZWdpc3RlckZvbnRGaWxlTG9hZGVyKENEd0ZvbnRGaWxlTG9hZGVyOjpHZXRMb2FkZXIoKSk7CisgIH0KKyAgU2FmZVJlbGVhc2UoJmR3cml0ZUZhY3RvcnlfKTsKIH0KLUNEd0ZvbnRDb250ZXh0Ojp+Q0R3Rm9udENvbnRleHQoKQotewotICAgIGlmKGR3cml0ZUZhY3RvcnlfICYmIGhyXyA9PSBTX09LKSB7Ci0gICAgICAgIGR3cml0ZUZhY3RvcnlfLT5VbnJlZ2lzdGVyRm9udEZpbGVMb2FkZXIoQ0R3Rm9udEZpbGVMb2FkZXI6OkdldExvYWRlcigpKTsKLSAgICB9Ci0gICAgU2FmZVJlbGVhc2UoJmR3cml0ZUZhY3RvcnlfKTsKK0hSRVNVTFQgQ0R3Rm9udENvbnRleHQ6OkluaXRpYWxpemUoKSB7CisgIGlmIChocl8gPT0gU19GQUxTRSkgeworICAgIHJldHVybiBocl8gPSBkd3JpdGVGYWN0b3J5Xy0+UmVnaXN0ZXJGb250RmlsZUxvYWRlcigKKyAgICAgICAgICAgICAgIENEd0ZvbnRGaWxlTG9hZGVyOjpHZXRMb2FkZXIoKSk7CisgIH0KKyAgcmV0dXJuIGhyXzsKIH0KLUhSRVNVTFQgQ0R3Rm9udENvbnRleHQ6OkluaXRpYWxpemUoKQotewotICAgIGlmIChocl8gPT0gU19GQUxTRSkgewotICAgICAgICByZXR1cm4gaHJfID0gZHdyaXRlRmFjdG9yeV8tPlJlZ2lzdGVyRm9udEZpbGVMb2FkZXIoQ0R3Rm9udEZpbGVMb2FkZXI6OkdldExvYWRlcigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhyXzsKLX0KLUNEd0dkaVRleHRSZW5kZXJlcjo6Q0R3R2RpVGV4dFJlbmRlcmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCogYml0bWFwUmVuZGVyVGFyZ2V0LCBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zKiByZW5kZXJpbmdQYXJhbXMpOgotICAgIHBCaXRtYXBfKHBCaXRtYXApLAotICAgIHBSZW5kZXJUYXJnZXRfKFNhZmVBY3F1aXJlKGJpdG1hcFJlbmRlclRhcmdldCkpLAotICAgIHBSZW5kZXJpbmdQYXJhbXNfKFNhZmVBY3F1aXJlKHJlbmRlcmluZ1BhcmFtcykpCi17Ci19Ci1DRHdHZGlUZXh0UmVuZGVyZXI6On5DRHdHZGlUZXh0UmVuZGVyZXIoKQotewotICAgIFNhZmVSZWxlYXNlKCZwUmVuZGVyVGFyZ2V0Xyk7Ci0gICAgU2FmZVJlbGVhc2UoJnBSZW5kZXJpbmdQYXJhbXNfKTsKK0NEd0dkaVRleHRSZW5kZXJlcjo6Q0R3R2RpVGV4dFJlbmRlcmVyKAorICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0KiBiaXRtYXBSZW5kZXJUYXJnZXQsCisgICAgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyogcmVuZGVyaW5nUGFyYW1zKQorICAgIDogcEJpdG1hcF8ocEJpdG1hcCksCisgICAgICBwUmVuZGVyVGFyZ2V0XyhTYWZlQWNxdWlyZShiaXRtYXBSZW5kZXJUYXJnZXQpKSwKKyAgICAgIHBSZW5kZXJpbmdQYXJhbXNfKFNhZmVBY3F1aXJlKHJlbmRlcmluZ1BhcmFtcykpIHt9CitDRHdHZGlUZXh0UmVuZGVyZXI6On5DRHdHZGlUZXh0UmVuZGVyZXIoKSB7CisgIFNhZmVSZWxlYXNlKCZwUmVuZGVyVGFyZ2V0Xyk7CisgIFNhZmVSZWxlYXNlKCZwUmVuZGVyaW5nUGFyYW1zXyk7CiB9CiBTVERNRVRIT0RJTVAgQ0R3R2RpVGV4dFJlbmRlcmVyOjpEcmF3R2x5cGhSdW4oCiAgICAgY29uc3QgRlhfUkVDVCYgdGV4dF9iYm94LApAQCAtNDE1LDYwICszODEsMzQgQEAKICAgICBGTE9BVCBiYXNlbGluZU9yaWdpblksCiAgICAgRFdSSVRFX01FQVNVUklOR19NT0RFIG1lYXN1cmluZ01vZGUsCiAgICAgX19pbiBEV1JJVEVfR0xZUEhfUlVOIGNvbnN0KiBnbHlwaFJ1biwKLSAgICBjb25zdCBDT0xPUlJFRiYgdGV4dENvbG9yCi0pCi17Ci0gICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgaHIgPSBwUmVuZGVyVGFyZ2V0Xy0+U2V0Q3VycmVudFRyYW5zZm9ybShwTWF0cml4KTsKLSAgICAgICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgICAgIHJldHVybiBocjsKLSAgICAgICAgfQotICAgIH0KLSAgICBIREMgaERDID0gcFJlbmRlclRhcmdldF8tPkdldE1lbW9yeURDKCk7Ci0gICAgSEJJVE1BUCBoQml0bWFwID0gKEhCSVRNQVApOjpHZXRDdXJyZW50T2JqZWN0KGhEQywgT0JKX0JJVE1BUCk7Ci0gICAgQklUTUFQIGJpdG1hcDsKLSAgICBHZXRPYmplY3QoaEJpdG1hcCwgc2l6ZW9mIGJpdG1hcCwgJmJpdG1hcCk7Ci0gICAgQ0ZYX0RJQml0bWFwIGRpYjsKLSAgICBkaWIuQ3JlYXRlKAotICAgICAgICBiaXRtYXAuYm1XaWR0aCwKLSAgICAgICAgYml0bWFwLmJtSGVpZ2h0LAotICAgICAgICBiaXRtYXAuYm1CaXRzUGl4ZWwgPT0gMjQgPyBGWERJQl9SZ2IgOiBGWERJQl9SZ2IzMiwKLSAgICAgICAgKHVpbnQ4X3QqKWJpdG1hcC5ibUJpdHMKLSAgICApOwotICAgIGRpYi5Db21wb3NpdGVCaXRtYXAoCi0gICAgICAgIHRleHRfYmJveC5sZWZ0LAotICAgICAgICB0ZXh0X2Jib3gudG9wLAotICAgICAgICB0ZXh0X2Jib3guV2lkdGgoKSwKLSAgICAgICAgdGV4dF9iYm94LkhlaWdodCgpLAotICAgICAgICBwQml0bWFwXywKLSAgICAgICAgdGV4dF9iYm94LmxlZnQsCi0gICAgICAgIHRleHRfYmJveC50b3AsCi0gICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCwKLSAgICAgICAgTlVMTAotICAgICk7Ci0gICAgaHIgPSBwUmVuZGVyVGFyZ2V0Xy0+RHJhd0dseXBoUnVuKAotICAgICAgICAgICAgIGJhc2VsaW5lT3JpZ2luWCwKLSAgICAgICAgICAgICBiYXNlbGluZU9yaWdpblksCi0gICAgICAgICAgICAgbWVhc3VyaW5nTW9kZSwKLSAgICAgICAgICAgICBnbHlwaFJ1biwKLSAgICAgICAgICAgICBwUmVuZGVyaW5nUGFyYW1zXywKLSAgICAgICAgICAgICB0ZXh0Q29sb3IKLSAgICAgICAgICk7CisgICAgY29uc3QgQ09MT1JSRUYmIHRleHRDb2xvcikgeworICBIUkVTVUxUIGhyID0gU19PSzsKKyAgaWYgKHBNYXRyaXgpIHsKKyAgICBociA9IHBSZW5kZXJUYXJnZXRfLT5TZXRDdXJyZW50VHJhbnNmb3JtKHBNYXRyaXgpOwogICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgIHJldHVybiBocjsKKyAgICAgIHJldHVybiBocjsKICAgICB9Ci0gICAgcEJpdG1hcF8tPkNvbXBvc2l0ZUJpdG1hcCgKLSAgICAgICAgdGV4dF9iYm94LmxlZnQsCi0gICAgICAgIHRleHRfYmJveC50b3AsCi0gICAgICAgIHRleHRfYmJveC5XaWR0aCgpLAotICAgICAgICB0ZXh0X2Jib3guSGVpZ2h0KCksCi0gICAgICAgICZkaWIsCi0gICAgICAgIHRleHRfYmJveC5sZWZ0LAotICAgICAgICB0ZXh0X2Jib3gudG9wLAotICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwsCi0gICAgICAgIHBDbGlwUmduCi0gICAgKTsKKyAgfQorICBIREMgaERDID0gcFJlbmRlclRhcmdldF8tPkdldE1lbW9yeURDKCk7CisgIEhCSVRNQVAgaEJpdG1hcCA9IChIQklUTUFQKTo6R2V0Q3VycmVudE9iamVjdChoREMsIE9CSl9CSVRNQVApOworICBCSVRNQVAgYml0bWFwOworICBHZXRPYmplY3QoaEJpdG1hcCwgc2l6ZW9mIGJpdG1hcCwgJmJpdG1hcCk7CisgIENGWF9ESUJpdG1hcCBkaWI7CisgIGRpYi5DcmVhdGUoYml0bWFwLmJtV2lkdGgsIGJpdG1hcC5ibUhlaWdodCwKKyAgICAgICAgICAgICBiaXRtYXAuYm1CaXRzUGl4ZWwgPT0gMjQgPyBGWERJQl9SZ2IgOiBGWERJQl9SZ2IzMiwKKyAgICAgICAgICAgICAodWludDhfdCopYml0bWFwLmJtQml0cyk7CisgIGRpYi5Db21wb3NpdGVCaXRtYXAodGV4dF9iYm94LmxlZnQsIHRleHRfYmJveC50b3AsIHRleHRfYmJveC5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgIHRleHRfYmJveC5IZWlnaHQoKSwgcEJpdG1hcF8sIHRleHRfYmJveC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIHRleHRfYmJveC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCk7CisgIGhyID0gcFJlbmRlclRhcmdldF8tPkRyYXdHbHlwaFJ1bihiYXNlbGluZU9yaWdpblgsIGJhc2VsaW5lT3JpZ2luWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmluZ01vZGUsIGdseXBoUnVuLCBwUmVuZGVyaW5nUGFyYW1zXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcik7CisgIGlmIChGQUlMRUQoaHIpKSB7CiAgICAgcmV0dXJuIGhyOworICB9CisgIHBCaXRtYXBfLT5Db21wb3NpdGVCaXRtYXAodGV4dF9iYm94LmxlZnQsIHRleHRfYmJveC50b3AsIHRleHRfYmJveC5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfYmJveC5IZWlnaHQoKSwgJmRpYiwgdGV4dF9iYm94LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9iYm94LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBwQ2xpcFJnbik7CisgIHJldHVybiBocjsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9nZGlwZXh0LmNwcCBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZ2RpcGV4dC5jcHAKaW5kZXggYTExNTBkNS4uYmZhY2NjNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9nZGlwZXh0LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2dkaXBleHQuY3BwCkBAIC05LDEwMiArOSwxMDIgQEAKICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogbmFtZXNwYWNlIEdkaXBsdXMgewotICB1c2luZyBzdGQ6Om1pbjsKLSAgdXNpbmcgc3RkOjptYXg7Cit1c2luZyBzdGQ6Om1pbjsKK3VzaW5nIHN0ZDo6bWF4OwogfSAgLy8gbmFtZXNwYWNlIEdkaXBsdXMKICNpbmNsdWRlIDxnZGlwbHVzLmg+CiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmgiCiAjaW5jbHVkZSAid2luMzJfaW50LmgiCiB1c2luZyBuYW1lc3BhY2UgR2RpcGx1czsKIHVzaW5nIG5hbWVzcGFjZSBHZGlwbHVzOjpEbGxFeHBvcnRzOwotI2RlZmluZSBHZGlGaWxsVHlwZTJHZGlwKGZpbGxfdHlwZSkgKGZpbGxfdHlwZSA9PSBBTFRFUk5BVEUgPyBGaWxsTW9kZUFsdGVybmF0ZSA6IEZpbGxNb2RlV2luZGluZykKLXN0YXRpYyBDb21iaW5lTW9kZSBHZGlDb21iaW5lTW9kZTJHZGlwKGludCBtb2RlKQotewotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIFJHTl9BTkQ6Ci0gICAgICAgICAgICByZXR1cm4gQ29tYmluZU1vZGVJbnRlcnNlY3Q7Ci0gICAgfQotICAgIHJldHVybiBDb21iaW5lTW9kZUludGVyc2VjdDsKKyNkZWZpbmUgR2RpRmlsbFR5cGUyR2RpcChmaWxsX3R5cGUpIFwKKyAgKGZpbGxfdHlwZSA9PSBBTFRFUk5BVEUgPyBGaWxsTW9kZUFsdGVybmF0ZSA6IEZpbGxNb2RlV2luZGluZykKK3N0YXRpYyBDb21iaW5lTW9kZSBHZGlDb21iaW5lTW9kZTJHZGlwKGludCBtb2RlKSB7CisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgUkdOX0FORDoKKyAgICAgIHJldHVybiBDb21iaW5lTW9kZUludGVyc2VjdDsKKyAgfQorICByZXR1cm4gQ29tYmluZU1vZGVJbnRlcnNlY3Q7CiB9CiBlbnVtIHsKLSAgICBGdW5jSWRfR2RpcENyZWF0ZVBhdGgyLAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuRGFzaFN0eWxlLAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuRGFzaEFycmF5LAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuRGFzaENhcDE5NzgxOSwKLSAgICBGdW5jSWRfR2RpcFNldFBlbkxpbmVKb2luLAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuV2lkdGgsCi0gICAgRnVuY0lkX0dkaXBDcmVhdGVGcm9tSERDLAotICAgIEZ1bmNJZF9HZGlwU2V0UGFnZVVuaXQsCi0gICAgRnVuY0lkX0dkaXBTZXRTbW9vdGhpbmdNb2RlLAotICAgIEZ1bmNJZF9HZGlwQ3JlYXRlU29saWRGaWxsLAotICAgIEZ1bmNJZF9HZGlwRmlsbFBhdGgsCi0gICAgRnVuY0lkX0dkaXBEZWxldGVCcnVzaCwKLSAgICBGdW5jSWRfR2RpcENyZWF0ZVBlbjEsCi0gICAgRnVuY0lkX0dkaXBTZXRQZW5NaXRlckxpbWl0LAotICAgIEZ1bmNJZF9HZGlwRHJhd1BhdGgsCi0gICAgRnVuY0lkX0dkaXBEZWxldGVQZW4sCi0gICAgRnVuY0lkX0dkaXBEZWxldGVQYXRoLAotICAgIEZ1bmNJZF9HZGlwRGVsZXRlR3JhcGhpY3MsCi0gICAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tRmlsZUlDTSwKLSAgICBGdW5jSWRfR2RpcENyZWF0ZUJpdG1hcEZyb21TdHJlYW1JQ00sCi0gICAgRnVuY0lkX0dkaXBHZXRJbWFnZUhlaWdodCwKLSAgICBGdW5jSWRfR2RpcEdldEltYWdlV2lkdGgsCi0gICAgRnVuY0lkX0dkaXBHZXRJbWFnZVBpeGVsRm9ybWF0LAotICAgIEZ1bmNJZF9HZGlwQml0bWFwTG9ja0JpdHMsCi0gICAgRnVuY0lkX0dkaXBHZXRJbWFnZVBhbGV0dGVTaXplLAotICAgIEZ1bmNJZF9HZGlwR2V0SW1hZ2VQYWxldHRlLAotICAgIEZ1bmNJZF9HZGlwQml0bWFwVW5sb2NrQml0cywKLSAgICBGdW5jSWRfR2RpcERpc3Bvc2VJbWFnZSwKLSAgICBGdW5jSWRfR2RpcEZpbGxSZWN0YW5nbGUsCi0gICAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjAsCi0gICAgRnVuY0lkX0dkaXBTZXRJbWFnZVBhbGV0dGUsCi0gICAgRnVuY0lkX0dkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSwKLSAgICBGdW5jSWRfR2RpcERyYXdJbWFnZVBvaW50c0ksCi0gICAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tR2RpRGliLAotICAgIEZ1bmNJZF9HZGlwbHVzU3RhcnR1cCwKLSAgICBGdW5jSWRfR2RpcERyYXdMaW5lSSwKLSAgICBGdW5jSWRfR2RpcFJlc2V0Q2xpcCwKLSAgICBGdW5jSWRfR2RpcENyZWF0ZVBhdGgsCi0gICAgRnVuY0lkX0dkaXBBZGRQYXRoUGF0aCwKLSAgICBGdW5jSWRfR2RpcFNldFBhdGhGaWxsTW9kZSwKLSAgICBGdW5jSWRfR2RpcFNldENsaXBQYXRoLAotICAgIEZ1bmNJZF9HZGlwR2V0Q2xpcCwKLSAgICBGdW5jSWRfR2RpcENyZWF0ZVJlZ2lvbiwKLSAgICBGdW5jSWRfR2RpcEdldENsaXBCb3VuZHNJLAotICAgIEZ1bmNJZF9HZGlwU2V0Q2xpcFJlZ2lvbiwKLSAgICBGdW5jSWRfR2RpcFdpZGVuUGF0aCwKLSAgICBGdW5jSWRfR2RpcEFkZFBhdGhMaW5lLAotICAgIEZ1bmNJZF9HZGlwQWRkUGF0aFJlY3RhbmdsZSwKLSAgICBGdW5jSWRfR2RpcERlbGV0ZVJlZ2lvbiwKLSAgICBGdW5jSWRfR2RpcEdldERDLAotICAgIEZ1bmNJZF9HZGlwUmVsZWFzZURDLAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuTGluZUNhcDE5NzgxOSwKLSAgICBGdW5jSWRfR2RpcFNldFBlbkRhc2hPZmZzZXQsCi0gICAgRnVuY0lkX0dkaXBSZXNldFBhdGgsCi0gICAgRnVuY0lkX0dkaXBDcmVhdGVSZWdpb25QYXRoLAotICAgIEZ1bmNJZF9HZGlwQ3JlYXRlRm9udCwKLSAgICBGdW5jSWRfR2RpcEdldEZvbnRTaXplLAotICAgIEZ1bmNJZF9HZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lLAotICAgIEZ1bmNJZF9HZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQsCi0gICAgRnVuY0lkX0dkaXBEcmF3RHJpdmVyU3RyaW5nLAotICAgIEZ1bmNJZF9HZGlwQ3JlYXRlTWF0cml4MiwKLSAgICBGdW5jSWRfR2RpcERlbGV0ZU1hdHJpeCwKLSAgICBGdW5jSWRfR2RpcFNldFdvcmxkVHJhbnNmb3JtLAotICAgIEZ1bmNJZF9HZGlwUmVzZXRXb3JsZFRyYW5zZm9ybSwKLSAgICBGdW5jSWRfR2RpcERlbGV0ZUZvbnRGYW1pbHksCi0gICAgRnVuY0lkX0dkaXBEZWxldGVGb250LAotICAgIEZ1bmNJZF9HZGlwTmV3UHJpdmF0ZUZvbnRDb2xsZWN0aW9uLAotICAgIEZ1bmNJZF9HZGlwRGVsZXRlUHJpdmF0ZUZvbnRDb2xsZWN0aW9uLAotICAgIEZ1bmNJZF9HZGlwUHJpdmF0ZUFkZE1lbW9yeUZvbnQsCi0gICAgRnVuY0lkX0dkaXBHZXRGb250Q29sbGVjdGlvbkZhbWlseUxpc3QsCi0gICAgRnVuY0lkX0dkaXBHZXRGb250Q29sbGVjdGlvbkZhbWlseUNvdW50LAotICAgIEZ1bmNJZF9HZGlwU2V0VGV4dENvbnRyYXN0LAotICAgIEZ1bmNJZF9HZGlwU2V0UGl4ZWxPZmZzZXRNb2RlLAotICAgIEZ1bmNJZF9HZGlwR2V0SW1hZ2VHcmFwaGljc0NvbnRleHQsCi0gICAgRnVuY0lkX0dkaXBEcmF3SW1hZ2VJLAotICAgIEZ1bmNJZF9HZGlwRHJhd0ltYWdlUmVjdEksCi0gICAgRnVuY0lkX0dkaXBEcmF3U3RyaW5nLAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuVHJhbnNmb3JtLAorICBGdW5jSWRfR2RpcENyZWF0ZVBhdGgyLAorICBGdW5jSWRfR2RpcFNldFBlbkRhc2hTdHlsZSwKKyAgRnVuY0lkX0dkaXBTZXRQZW5EYXNoQXJyYXksCisgIEZ1bmNJZF9HZGlwU2V0UGVuRGFzaENhcDE5NzgxOSwKKyAgRnVuY0lkX0dkaXBTZXRQZW5MaW5lSm9pbiwKKyAgRnVuY0lkX0dkaXBTZXRQZW5XaWR0aCwKKyAgRnVuY0lkX0dkaXBDcmVhdGVGcm9tSERDLAorICBGdW5jSWRfR2RpcFNldFBhZ2VVbml0LAorICBGdW5jSWRfR2RpcFNldFNtb290aGluZ01vZGUsCisgIEZ1bmNJZF9HZGlwQ3JlYXRlU29saWRGaWxsLAorICBGdW5jSWRfR2RpcEZpbGxQYXRoLAorICBGdW5jSWRfR2RpcERlbGV0ZUJydXNoLAorICBGdW5jSWRfR2RpcENyZWF0ZVBlbjEsCisgIEZ1bmNJZF9HZGlwU2V0UGVuTWl0ZXJMaW1pdCwKKyAgRnVuY0lkX0dkaXBEcmF3UGF0aCwKKyAgRnVuY0lkX0dkaXBEZWxldGVQZW4sCisgIEZ1bmNJZF9HZGlwRGVsZXRlUGF0aCwKKyAgRnVuY0lkX0dkaXBEZWxldGVHcmFwaGljcywKKyAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tRmlsZUlDTSwKKyAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tU3RyZWFtSUNNLAorICBGdW5jSWRfR2RpcEdldEltYWdlSGVpZ2h0LAorICBGdW5jSWRfR2RpcEdldEltYWdlV2lkdGgsCisgIEZ1bmNJZF9HZGlwR2V0SW1hZ2VQaXhlbEZvcm1hdCwKKyAgRnVuY0lkX0dkaXBCaXRtYXBMb2NrQml0cywKKyAgRnVuY0lkX0dkaXBHZXRJbWFnZVBhbGV0dGVTaXplLAorICBGdW5jSWRfR2RpcEdldEltYWdlUGFsZXR0ZSwKKyAgRnVuY0lkX0dkaXBCaXRtYXBVbmxvY2tCaXRzLAorICBGdW5jSWRfR2RpcERpc3Bvc2VJbWFnZSwKKyAgRnVuY0lkX0dkaXBGaWxsUmVjdGFuZ2xlLAorICBGdW5jSWRfR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCwKKyAgRnVuY0lkX0dkaXBTZXRJbWFnZVBhbGV0dGUsCisgIEZ1bmNJZF9HZGlwU2V0SW50ZXJwb2xhdGlvbk1vZGUsCisgIEZ1bmNJZF9HZGlwRHJhd0ltYWdlUG9pbnRzSSwKKyAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tR2RpRGliLAorICBGdW5jSWRfR2RpcGx1c1N0YXJ0dXAsCisgIEZ1bmNJZF9HZGlwRHJhd0xpbmVJLAorICBGdW5jSWRfR2RpcFJlc2V0Q2xpcCwKKyAgRnVuY0lkX0dkaXBDcmVhdGVQYXRoLAorICBGdW5jSWRfR2RpcEFkZFBhdGhQYXRoLAorICBGdW5jSWRfR2RpcFNldFBhdGhGaWxsTW9kZSwKKyAgRnVuY0lkX0dkaXBTZXRDbGlwUGF0aCwKKyAgRnVuY0lkX0dkaXBHZXRDbGlwLAorICBGdW5jSWRfR2RpcENyZWF0ZVJlZ2lvbiwKKyAgRnVuY0lkX0dkaXBHZXRDbGlwQm91bmRzSSwKKyAgRnVuY0lkX0dkaXBTZXRDbGlwUmVnaW9uLAorICBGdW5jSWRfR2RpcFdpZGVuUGF0aCwKKyAgRnVuY0lkX0dkaXBBZGRQYXRoTGluZSwKKyAgRnVuY0lkX0dkaXBBZGRQYXRoUmVjdGFuZ2xlLAorICBGdW5jSWRfR2RpcERlbGV0ZVJlZ2lvbiwKKyAgRnVuY0lkX0dkaXBHZXREQywKKyAgRnVuY0lkX0dkaXBSZWxlYXNlREMsCisgIEZ1bmNJZF9HZGlwU2V0UGVuTGluZUNhcDE5NzgxOSwKKyAgRnVuY0lkX0dkaXBTZXRQZW5EYXNoT2Zmc2V0LAorICBGdW5jSWRfR2RpcFJlc2V0UGF0aCwKKyAgRnVuY0lkX0dkaXBDcmVhdGVSZWdpb25QYXRoLAorICBGdW5jSWRfR2RpcENyZWF0ZUZvbnQsCisgIEZ1bmNJZF9HZGlwR2V0Rm9udFNpemUsCisgIEZ1bmNJZF9HZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lLAorICBGdW5jSWRfR2RpcFNldFRleHRSZW5kZXJpbmdIaW50LAorICBGdW5jSWRfR2RpcERyYXdEcml2ZXJTdHJpbmcsCisgIEZ1bmNJZF9HZGlwQ3JlYXRlTWF0cml4MiwKKyAgRnVuY0lkX0dkaXBEZWxldGVNYXRyaXgsCisgIEZ1bmNJZF9HZGlwU2V0V29ybGRUcmFuc2Zvcm0sCisgIEZ1bmNJZF9HZGlwUmVzZXRXb3JsZFRyYW5zZm9ybSwKKyAgRnVuY0lkX0dkaXBEZWxldGVGb250RmFtaWx5LAorICBGdW5jSWRfR2RpcERlbGV0ZUZvbnQsCisgIEZ1bmNJZF9HZGlwTmV3UHJpdmF0ZUZvbnRDb2xsZWN0aW9uLAorICBGdW5jSWRfR2RpcERlbGV0ZVByaXZhdGVGb250Q29sbGVjdGlvbiwKKyAgRnVuY0lkX0dkaXBQcml2YXRlQWRkTWVtb3J5Rm9udCwKKyAgRnVuY0lkX0dkaXBHZXRGb250Q29sbGVjdGlvbkZhbWlseUxpc3QsCisgIEZ1bmNJZF9HZGlwR2V0Rm9udENvbGxlY3Rpb25GYW1pbHlDb3VudCwKKyAgRnVuY0lkX0dkaXBTZXRUZXh0Q29udHJhc3QsCisgIEZ1bmNJZF9HZGlwU2V0UGl4ZWxPZmZzZXRNb2RlLAorICBGdW5jSWRfR2RpcEdldEltYWdlR3JhcGhpY3NDb250ZXh0LAorICBGdW5jSWRfR2RpcERyYXdJbWFnZUksCisgIEZ1bmNJZF9HZGlwRHJhd0ltYWdlUmVjdEksCisgIEZ1bmNJZF9HZGlwRHJhd1N0cmluZywKKyAgRnVuY0lkX0dkaXBTZXRQZW5UcmFuc2Zvcm0sCiB9Owogc3RhdGljIExQQ1NUUiBnX0dkaXBGdW5jTmFtZXNbXSA9IHsKICAgICAiR2RpcENyZWF0ZVBhdGgyIiwKQEAgLTE4NiwxMDc2ICsxODYsMTM0MSBAQAogICAgICJHZGlwRHJhd1N0cmluZyIsCiAgICAgIkdkaXBTZXRQZW5UcmFuc2Zvcm0iLAogfTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBDcmVhdGVQYXRoMikoR0RJUENPTlNUIEdwUG9pbnRGKiwgR0RJUENPTlNUIEJZVEUqLCBJTlQsIEdwRmlsbE1vZGUsIEdwUGF0aCAqKnBhdGgpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldFBlbkRhc2hTdHlsZSkoR3BQZW4gKnBlbiwgR3BEYXNoU3R5bGUgZGFzaHN0eWxlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRQZW5EYXNoQXJyYXkpKEdwUGVuICpwZW4sIEdESVBDT05TVCBSRUFMICpkYXNoLCBJTlQgY291bnQpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldFBlbkRhc2hDYXAxOTc4MTkpKEdwUGVuICpwZW4sIEdwRGFzaENhcCBkYXNoQ2FwKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRQZW5MaW5lSm9pbikoR3BQZW4gKnBlbiwgR3BMaW5lSm9pbiBsaW5lSm9pbik7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwU2V0UGVuV2lkdGgpKEdwUGVuICpwZW4sIFJFQUwgd2lkdGgpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcENyZWF0ZUZyb21IREMpKEhEQyBoZGMsIEdwR3JhcGhpY3MgKipncmFwaGljcyk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwU2V0UGFnZVVuaXQpKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBHcFVuaXQgdW5pdCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwU2V0U21vb3RoaW5nTW9kZSkoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIFNtb290aGluZ01vZGUgc21vb3RoaW5nTW9kZSk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlU29saWRGaWxsKShBUkdCIGNvbG9yLCBHcFNvbGlkRmlsbCAqKmJydXNoKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBGaWxsUGF0aCkoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIEdwQnJ1c2ggKmJydXNoLCBHcFBhdGggKnBhdGgpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERlbGV0ZUJydXNoKShHcEJydXNoICpicnVzaCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlUGVuMSkoQVJHQiBjb2xvciwgUkVBTCB3aWR0aCwgR3BVbml0IHVuaXQsIEdwUGVuICoqcGVuKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRQZW5NaXRlckxpbWl0KShHcFBlbiAqcGVuLCBSRUFMIG1pdGVyTGltaXQpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERyYXdQYXRoKShHcEdyYXBoaWNzICpncmFwaGljcywgR3BQZW4gKnBlbiwgR3BQYXRoICpwYXRoKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEZWxldGVQZW4pKEdwUGVuICpwZW4pOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERlbGV0ZVBhdGgpKEdwUGF0aCogcGF0aCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwRGVsZXRlR3JhcGhpY3MpKEdwR3JhcGhpY3MgKmdyYXBoaWNzKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBDcmVhdGVCaXRtYXBGcm9tRmlsZUlDTSkoR0RJUENPTlNUIFdDSEFSKiBmaWxlbmFtZSwgR3BCaXRtYXAgKipiaXRtYXApOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcENyZWF0ZUJpdG1hcEZyb21TdHJlYW1JQ00pKElTdHJlYW0qIHN0cmVhbSwgR3BCaXRtYXAgKipiaXRtYXApOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcEdldEltYWdlV2lkdGgpKEdwSW1hZ2UgKmltYWdlLCBVSU5UICp3aWR0aCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwR2V0SW1hZ2VIZWlnaHQpKEdwSW1hZ2UgKmltYWdlLCBVSU5UICpoZWlnaHQpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcEdldEltYWdlUGl4ZWxGb3JtYXQpKEdwSW1hZ2UgKmltYWdlLCBQaXhlbEZvcm1hdCAqZm9ybWF0KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBCaXRtYXBMb2NrQml0cykoR3BCaXRtYXAqIGJpdG1hcCwgR0RJUENPTlNUIEdwUmVjdCogcmVjdCwgVUlOVCBmbGFncywgUGl4ZWxGb3JtYXQgZm9ybWF0LCBCaXRtYXBEYXRhKiBsb2NrZWRCaXRtYXBEYXRhKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBHZXRJbWFnZVBhbGV0dGUpKEdwSW1hZ2UgKmltYWdlLCBDb2xvclBhbGV0dGUgKnBhbGV0dGUsIElOVCBzaXplKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBHZXRJbWFnZVBhbGV0dGVTaXplKShHcEltYWdlICppbWFnZSwgSU5UICpzaXplKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBCaXRtYXBVbmxvY2tCaXRzKShHcEJpdG1hcCogYml0bWFwLCBCaXRtYXBEYXRhKiBsb2NrZWRCaXRtYXBEYXRhKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEaXNwb3NlSW1hZ2UpKEdwSW1hZ2UgKmltYWdlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBGaWxsUmVjdGFuZ2xlKShHcEdyYXBoaWNzICpncmFwaGljcywgR3BCcnVzaCAqYnJ1c2gsIFJFQUwgeCwgUkVBTCB5LCBSRUFMIHdpZHRoLCBSRUFMIGhlaWdodCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKShJTlQgd2lkdGgsIElOVCBoZWlnaHQsIElOVCBzdHJpZGUsIFBpeGVsRm9ybWF0IGZvcm1hdCwgQllURSogc2NhbjAsIEdwQml0bWFwKiogYml0bWFwKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRJbWFnZVBhbGV0dGUpKEdwSW1hZ2UgKmltYWdlLCBHRElQQ09OU1QgQ29sb3JQYWxldHRlICpwYWxldHRlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSkoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIEludGVycG9sYXRpb25Nb2RlIGludGVycG9sYXRpb25Nb2RlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEcmF3SW1hZ2VQb2ludHNJKShHcEdyYXBoaWNzICpncmFwaGljcywgR3BJbWFnZSAqaW1hZ2UsIEdESVBDT05TVCBHcFBvaW50ICpkc3Rwb2ludHMsIElOVCBjb3VudCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlQml0bWFwRnJvbUdkaURpYikoR0RJUENPTlNUIEJJVE1BUElORk8qIGdkaUJpdG1hcEluZm8sIFZPSUQqIGdkaUJpdG1hcERhdGEsIEdwQml0bWFwKiogYml0bWFwKTsKLXR5cGVkZWYgU3RhdHVzIChXSU5BUEkgKkZ1bmNUeXBlX0dkaXBsdXNTdGFydHVwKShPVVQgdWludHB0cl90ICp0b2tlbiwgY29uc3QgR2RpcGx1c1N0YXJ0dXBJbnB1dCAqaW5wdXQsIE9VVCBHZGlwbHVzU3RhcnR1cE91dHB1dCAqb3V0cHV0KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEcmF3TGluZUkpKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBHcFBlbiAqcGVuLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFJlc2V0Q2xpcCkoR3BHcmFwaGljcyAqZ3JhcGhpY3MpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcENyZWF0ZVBhdGgpKEdwRmlsbE1vZGUgYnJ1c2hNb2RlLCBHcFBhdGggKipwYXRoKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBBZGRQYXRoUGF0aCkoR3BQYXRoICpwYXRoLCBHRElQQ09OU1QgR3BQYXRoKiBhZGRpbmdQYXRoLCBCT09MIGNvbm5lY3QpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldFBhdGhGaWxsTW9kZSkoR3BQYXRoICpwYXRoLCBHcEZpbGxNb2RlIGZpbGxtb2RlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRDbGlwUGF0aCkoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIEdwUGF0aCAqcGF0aCwgQ29tYmluZU1vZGUgY29tYmluZU1vZGUpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcEdldENsaXApKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBHcFJlZ2lvbiAqcmVnaW9uKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBDcmVhdGVSZWdpb24pKEdwUmVnaW9uICoqcmVnaW9uKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBHZXRDbGlwQm91bmRzSSkoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIEdwUmVjdCAqcmVjdCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwU2V0Q2xpcFJlZ2lvbikoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIEdwUmVnaW9uICpyZWdpb24sIENvbWJpbmVNb2RlIGNvbWJpbmVNb2RlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBXaWRlblBhdGgpKEdwUGF0aCAqbmF0aXZlUGF0aCwgR3BQZW4gKnBlbiwgR3BNYXRyaXggKm1hdHJpeCwgUkVBTCBmbGF0bmVzcyk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQWRkUGF0aExpbmUpKEdwUGF0aCAqcGF0aCwgUkVBTCB4MSwgUkVBTCB5MSwgUkVBTCB4MiwgUkVBTCB5Mik7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQWRkUGF0aFJlY3RhbmdsZSkoR3BQYXRoICpwYXRoLCBSRUFMIHgsIFJFQUwgeSwgUkVBTCB3aWR0aCwgUkVBTCBoZWlnaHQpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERlbGV0ZVJlZ2lvbikoR3BSZWdpb24gKnJlZ2lvbik7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwR2V0REMpKEdwR3JhcGhpY3MqIGdyYXBoaWNzLCBIREMgKiBoZGMpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFJlbGVhc2VEQykoR3BHcmFwaGljcyogZ3JhcGhpY3MsIEhEQyBoZGMpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldFBlbkxpbmVDYXAxOTc4MTkpKEdwUGVuICpwZW4sIEdwTGluZUNhcCBzdGFydENhcCwgR3BMaW5lQ2FwIGVuZENhcCwgR3BEYXNoQ2FwIGRhc2hDYXApOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldFBlbkRhc2hPZmZzZXQpKEdwUGVuICpwZW4sIFJFQUwgb2Zmc2V0KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBSZXNldFBhdGgpKEdwUGF0aCAqcGF0aCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlUmVnaW9uUGF0aCkoR3BQYXRoICpwYXRoLCBHcFJlZ2lvbiAqKnJlZ2lvbik7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlRm9udCkoR0RJUENPTlNUIEdwRm9udEZhbWlseSAqZm9udEZhbWlseSwgUkVBTCBlbVNpemUsIElOVCBzdHlsZSwgVW5pdCB1bml0LCBHcEZvbnQgKipmb250KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBHZXRGb250U2l6ZSkoR3BGb250ICpmb250LCBSRUFMICpzaXplKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBDcmVhdGVGb250RmFtaWx5RnJvbU5hbWUpKEdESVBDT05TVCBXQ0hBUiAqbmFtZSwgR3BGb250Q29sbGVjdGlvbiAqZm9udENvbGxlY3Rpb24sIEdwRm9udEZhbWlseSAqKkZvbnRGYW1pbHkpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldFRleHRSZW5kZXJpbmdIaW50KShHcEdyYXBoaWNzICpncmFwaGljcywgVGV4dFJlbmRlcmluZ0hpbnQgbW9kZSk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwRHJhd0RyaXZlclN0cmluZykoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIEdESVBDT05TVCBVSU5UMTYgKnRleHQsIElOVCBsZW5ndGgsIEdESVBDT05TVCBHcEZvbnQgKmZvbnQsIEdESVBDT05TVCBHcEJydXNoICpicnVzaCwgR0RJUENPTlNUIFBvaW50RiAqcG9zaXRpb25zLCBJTlQgZmxhZ3MsIEdESVBDT05TVCBHcE1hdHJpeCAqbWF0cml4KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBDcmVhdGVNYXRyaXgyKShSRUFMIG0xMSwgUkVBTCBtMTIsIFJFQUwgbTIxLCBSRUFMIG0yMiwgUkVBTCBkeCwgUkVBTCBkeSwgR3BNYXRyaXggKiptYXRyaXgpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERlbGV0ZU1hdHJpeCkoR3BNYXRyaXggKm1hdHJpeCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwU2V0V29ybGRUcmFuc2Zvcm0pKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBHcE1hdHJpeCAqbWF0cml4KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBSZXNldFdvcmxkVHJhbnNmb3JtKShHcEdyYXBoaWNzICpncmFwaGljcyk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwRGVsZXRlRm9udEZhbWlseSkoR3BGb250RmFtaWx5ICpGb250RmFtaWx5KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEZWxldGVGb250KShHcEZvbnQqIGZvbnQpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcE5ld1ByaXZhdGVGb250Q29sbGVjdGlvbikoR3BGb250Q29sbGVjdGlvbioqIGZvbnRDb2xsZWN0aW9uKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEZWxldGVQcml2YXRlRm9udENvbGxlY3Rpb24pKEdwRm9udENvbGxlY3Rpb24qKiBmb250Q29sbGVjdGlvbik7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwUHJpdmF0ZUFkZE1lbW9yeUZvbnQpKEdwRm9udENvbGxlY3Rpb24qIGZvbnRDb2xsZWN0aW9uLCBHRElQQ09OU1Qgdm9pZCogbWVtb3J5LCBJTlQgbGVuZ3RoKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBHZXRGb250Q29sbGVjdGlvbkZhbWlseUxpc3QpKEdwRm9udENvbGxlY3Rpb24qIGZvbnRDb2xsZWN0aW9uLCBJTlQgbnVtU291Z2h0LCBHcEZvbnRGYW1pbHkqIGdwZmFtaWxpZXNbXSwgSU5UKiBudW1Gb3VuZCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwR2V0Rm9udENvbGxlY3Rpb25GYW1pbHlDb3VudCkoR3BGb250Q29sbGVjdGlvbiogZm9udENvbGxlY3Rpb24sIElOVCogbnVtRm91bmQpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldFRleHRDb250cmFzdCkoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIFVJTlQgY29udHJhc3QpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldFBpeGVsT2Zmc2V0TW9kZSkoR3BHcmFwaGljcyogZ3JhcGhpY3MsIFBpeGVsT2Zmc2V0TW9kZSBwaXhlbE9mZnNldE1vZGUpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcEdldEltYWdlR3JhcGhpY3NDb250ZXh0KShHcEltYWdlICppbWFnZSwgR3BHcmFwaGljcyAqKmdyYXBoaWNzKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEcmF3SW1hZ2VJKShHcEdyYXBoaWNzICpncmFwaGljcywgR3BJbWFnZSAqaW1hZ2UsIElOVCB4LCBJTlQgeSk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwRHJhd0ltYWdlUmVjdEkpKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBHcEltYWdlICppbWFnZSwgSU5UIHgsIElOVCB5LCBJTlQgd2lkdGgsIElOVCBoZWlnaHQpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERyYXdTdHJpbmcpKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBHRElQQ09OU1QgV0NIQVIgKnN0cmluZywgSU5UIGxlbmd0aCwgR0RJUENPTlNUIEdwRm9udCAqZm9udCwgR0RJUENPTlNUIFJlY3RGICpsYXlvdXRSZWN0LCBHRElQQ09OU1QgR3BTdHJpbmdGb3JtYXQgKnN0cmluZ0Zvcm1hdCwgR0RJUENPTlNUIEdwQnJ1c2ggKmJydXNoKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRQZW5UcmFuc2Zvcm0pKEdwUGVuICpwZW4sIEdwTWF0cml4ICptYXRyaXgpOwotI2RlZmluZSBDYWxsRnVuYyhmdW5jbmFtZSkgKChGdW5jVHlwZV8jI2Z1bmNuYW1lKUdkaXBsdXNFeHQubV9GdW5jdGlvbnNbRnVuY0lkXyMjZnVuY25hbWVdKQotdHlwZWRlZiBIQU5ETEUgICAoX19zdGRjYWxsICpGdW5jVHlwZV9HZGlBZGRGb250TWVtUmVzb3VyY2VFeCkoUFZPSUQgcGJGb250LCBEV09SRCBjYkZvbnQsIFBWT0lEIHBkdiwgRFdPUkQgKnBjRm9udHMpOwotdHlwZWRlZiBCT09MICAgICAoX19zdGRjYWxsICpGdW5jVHlwZV9HZGlSZW1vdmVGb250TWVtUmVzb3VyY2VFeCkoSEFORExFIGhhbmRsZSk7Ci12b2lkKiBDR2RpcGx1c0V4dDo6R2RpQWRkRm9udE1lbVJlc291cmNlRXgodm9pZCAqcEZvbnRkYXRhLCBGWF9EV09SRCBzaXplLCB2b2lkKiBwZHYsIEZYX0RXT1JEKiBudW1fZmFjZSkKLXsKLSAgICBpZiAobV9wR2RpQWRkRm9udE1lbVJlc291cmNlRXgpIHsKLSAgICAgICAgcmV0dXJuICgoRnVuY1R5cGVfR2RpQWRkRm9udE1lbVJlc291cmNlRXgpbV9wR2RpQWRkRm9udE1lbVJlc291cmNlRXgpKChQVk9JRClwRm9udGRhdGEsIChEV09SRClzaXplLCAoUFZPSUQpcGR2LCAoRFdPUkQqKW51bV9mYWNlKTsKLSAgICB9Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVQYXRoMikoR0RJUENPTlNUIEdwUG9pbnRGKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRElQQ09OU1QgQllURSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwRmlsbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BQYXRoKiogcGF0aCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRQZW5EYXNoU3R5bGUpKAorICAgIEdwUGVuKiBwZW4sCisgICAgR3BEYXNoU3R5bGUgZGFzaHN0eWxlKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFBlbkRhc2hBcnJheSkoR3BQZW4qIHBlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RJUENPTlNUIFJFQUwqIGRhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjb3VudCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRQZW5EYXNoQ2FwMTk3ODE5KSgKKyAgICBHcFBlbiogcGVuLAorICAgIEdwRGFzaENhcCBkYXNoQ2FwKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFBlbkxpbmVKb2luKShHcFBlbiogcGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwTGluZUpvaW4gbGluZUpvaW4pOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0UGVuV2lkdGgpKEdwUGVuKiBwZW4sIFJFQUwgd2lkdGgpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQ3JlYXRlRnJvbUhEQykoSERDIGhkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwR3JhcGhpY3MqKiBncmFwaGljcyk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRQYWdlVW5pdCkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BVbml0IHVuaXQpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0U21vb3RoaW5nTW9kZSkoCisgICAgR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgU21vb3RoaW5nTW9kZSBzbW9vdGhpbmdNb2RlKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZVNvbGlkRmlsbCkoQVJHQiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BTb2xpZEZpbGwqKiBicnVzaCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBGaWxsUGF0aCkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BCcnVzaCogYnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BQYXRoKiBwYXRoKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERlbGV0ZUJydXNoKShHcEJydXNoKiBicnVzaCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVQZW4xKShBUkdCIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwVW5pdCB1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BQZW4qKiBwZW4pOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0UGVuTWl0ZXJMaW1pdCkoR3BQZW4qIHBlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgbWl0ZXJMaW1pdCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEcmF3UGF0aCkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BQZW4qIHBlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcFBhdGgqIHBhdGgpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRGVsZXRlUGVuKShHcFBlbiogcGVuKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERlbGV0ZVBhdGgpKEdwUGF0aCogcGF0aCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEZWxldGVHcmFwaGljcykoR3BHcmFwaGljcyogZ3JhcGhpY3MpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQ3JlYXRlQml0bWFwRnJvbUZpbGVJQ00pKAorICAgIEdESVBDT05TVCBXQ0hBUiogZmlsZW5hbWUsCisgICAgR3BCaXRtYXAqKiBiaXRtYXApOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQ3JlYXRlQml0bWFwRnJvbVN0cmVhbUlDTSkoCisgICAgSVN0cmVhbSogc3RyZWFtLAorICAgIEdwQml0bWFwKiogYml0bWFwKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEdldEltYWdlV2lkdGgpKEdwSW1hZ2UqIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCogd2lkdGgpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwR2V0SW1hZ2VIZWlnaHQpKEdwSW1hZ2UqIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQqIGhlaWdodCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBHZXRJbWFnZVBpeGVsRm9ybWF0KSgKKyAgICBHcEltYWdlKiBpbWFnZSwKKyAgICBQaXhlbEZvcm1hdCogZm9ybWF0KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEJpdG1hcExvY2tCaXRzKSgKKyAgICBHcEJpdG1hcCogYml0bWFwLAorICAgIEdESVBDT05TVCBHcFJlY3QqIHJlY3QsCisgICAgVUlOVCBmbGFncywKKyAgICBQaXhlbEZvcm1hdCBmb3JtYXQsCisgICAgQml0bWFwRGF0YSogbG9ja2VkQml0bWFwRGF0YSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBHZXRJbWFnZVBhbGV0dGUpKAorICAgIEdwSW1hZ2UqIGltYWdlLAorICAgIENvbG9yUGFsZXR0ZSogcGFsZXR0ZSwKKyAgICBJTlQgc2l6ZSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBHZXRJbWFnZVBhbGV0dGVTaXplKShHcEltYWdlKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogc2l6ZSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBCaXRtYXBVbmxvY2tCaXRzKSgKKyAgICBHcEJpdG1hcCogYml0bWFwLAorICAgIEJpdG1hcERhdGEqIGxvY2tlZEJpdG1hcERhdGEpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRGlzcG9zZUltYWdlKShHcEltYWdlKiBpbWFnZSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBGaWxsUmVjdGFuZ2xlKShHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwQnJ1c2gqIGJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgaGVpZ2h0KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoCisgICAgSU5UIHdpZHRoLAorICAgIElOVCBoZWlnaHQsCisgICAgSU5UIHN0cmlkZSwKKyAgICBQaXhlbEZvcm1hdCBmb3JtYXQsCisgICAgQllURSogc2NhbjAsCisgICAgR3BCaXRtYXAqKiBiaXRtYXApOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0SW1hZ2VQYWxldHRlKSgKKyAgICBHcEltYWdlKiBpbWFnZSwKKyAgICBHRElQQ09OU1QgQ29sb3JQYWxldHRlKiBwYWxldHRlKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldEludGVycG9sYXRpb25Nb2RlKSgKKyAgICBHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICBJbnRlcnBvbGF0aW9uTW9kZSBpbnRlcnBvbGF0aW9uTW9kZSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEcmF3SW1hZ2VQb2ludHNJKSgKKyAgICBHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICBHcEltYWdlKiBpbWFnZSwKKyAgICBHRElQQ09OU1QgR3BQb2ludCogZHN0cG9pbnRzLAorICAgIElOVCBjb3VudCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVCaXRtYXBGcm9tR2RpRGliKSgKKyAgICBHRElQQ09OU1QgQklUTUFQSU5GTyogZ2RpQml0bWFwSW5mbywKKyAgICBWT0lEKiBnZGlCaXRtYXBEYXRhLAorICAgIEdwQml0bWFwKiogYml0bWFwKTsKK3R5cGVkZWYgU3RhdHVzKFdJTkFQSSogRnVuY1R5cGVfR2RpcGx1c1N0YXJ0dXApKAorICAgIE9VVCB1aW50cHRyX3QqIHRva2VuLAorICAgIGNvbnN0IEdkaXBsdXNTdGFydHVwSW5wdXQqIGlucHV0LAorICAgIE9VVCBHZGlwbHVzU3RhcnR1cE91dHB1dCogb3V0cHV0KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERyYXdMaW5lSSkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwUGVuKiBwZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5Mik7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBSZXNldENsaXApKEdwR3JhcGhpY3MqIGdyYXBoaWNzKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZVBhdGgpKEdwRmlsbE1vZGUgYnJ1c2hNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BQYXRoKiogcGF0aCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBBZGRQYXRoUGF0aCkoCisgICAgR3BQYXRoKiBwYXRoLAorICAgIEdESVBDT05TVCBHcFBhdGgqIGFkZGluZ1BhdGgsCisgICAgQk9PTCBjb25uZWN0KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFBhdGhGaWxsTW9kZSkoR3BQYXRoKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcEZpbGxNb2RlIGZpbGxtb2RlKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldENsaXBQYXRoKShHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcFBhdGgqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZU1vZGUgY29tYmluZU1vZGUpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwR2V0Q2xpcCkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcFJlZ2lvbiogcmVnaW9uKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZVJlZ2lvbikoR3BSZWdpb24qKiByZWdpb24pOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwR2V0Q2xpcEJvdW5kc0kpKEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwUmVjdCogcmVjdCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRDbGlwUmVnaW9uKSgKKyAgICBHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICBHcFJlZ2lvbiogcmVnaW9uLAorICAgIENvbWJpbmVNb2RlIGNvbWJpbmVNb2RlKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFdpZGVuUGF0aCkoR3BQYXRoKiBuYXRpdmVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcFBlbiogcGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcE1hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIGZsYXRuZXNzKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEFkZFBhdGhMaW5lKShHcFBhdGgqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCB5Mik7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBBZGRQYXRoUmVjdGFuZ2xlKShHcFBhdGgqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCBoZWlnaHQpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRGVsZXRlUmVnaW9uKShHcFJlZ2lvbiogcmVnaW9uKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEdldERDKShHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIREMqIGhkYyk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBSZWxlYXNlREMpKEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIREMgaGRjKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFBlbkxpbmVDYXAxOTc4MTkpKAorICAgIEdwUGVuKiBwZW4sCisgICAgR3BMaW5lQ2FwIHN0YXJ0Q2FwLAorICAgIEdwTGluZUNhcCBlbmRDYXAsCisgICAgR3BEYXNoQ2FwIGRhc2hDYXApOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0UGVuRGFzaE9mZnNldCkoR3BQZW4qIHBlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgb2Zmc2V0KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFJlc2V0UGF0aCkoR3BQYXRoKiBwYXRoKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZVJlZ2lvblBhdGgpKEdwUGF0aCogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwUmVnaW9uKiogcmVnaW9uKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZUZvbnQpKAorICAgIEdESVBDT05TVCBHcEZvbnRGYW1pbHkqIGZvbnRGYW1pbHksCisgICAgUkVBTCBlbVNpemUsCisgICAgSU5UIHN0eWxlLAorICAgIFVuaXQgdW5pdCwKKyAgICBHcEZvbnQqKiBmb250KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEdldEZvbnRTaXplKShHcEZvbnQqIGZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCogc2l6ZSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVGb250RmFtaWx5RnJvbU5hbWUpKAorICAgIEdESVBDT05TVCBXQ0hBUiogbmFtZSwKKyAgICBHcEZvbnRDb2xsZWN0aW9uKiBmb250Q29sbGVjdGlvbiwKKyAgICBHcEZvbnRGYW1pbHkqKiBGb250RmFtaWx5KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFRleHRSZW5kZXJpbmdIaW50KSgKKyAgICBHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICBUZXh0UmVuZGVyaW5nSGludCBtb2RlKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERyYXdEcml2ZXJTdHJpbmcpKAorICAgIEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgIEdESVBDT05TVCBVSU5UMTYqIHRleHQsCisgICAgSU5UIGxlbmd0aCwKKyAgICBHRElQQ09OU1QgR3BGb250KiBmb250LAorICAgIEdESVBDT05TVCBHcEJydXNoKiBicnVzaCwKKyAgICBHRElQQ09OU1QgUG9pbnRGKiBwb3NpdGlvbnMsCisgICAgSU5UIGZsYWdzLAorICAgIEdESVBDT05TVCBHcE1hdHJpeCogbWF0cml4KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZU1hdHJpeDIpKFJFQUwgbTExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCBtMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIG0yMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgbTIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCBkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcE1hdHJpeCoqIG1hdHJpeCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEZWxldGVNYXRyaXgpKEdwTWF0cml4KiBtYXRyaXgpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0V29ybGRUcmFuc2Zvcm0pKAorICAgIEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgIEdwTWF0cml4KiBtYXRyaXgpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwUmVzZXRXb3JsZFRyYW5zZm9ybSkoCisgICAgR3BHcmFwaGljcyogZ3JhcGhpY3MpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRGVsZXRlRm9udEZhbWlseSkoCisgICAgR3BGb250RmFtaWx5KiBGb250RmFtaWx5KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERlbGV0ZUZvbnQpKEdwRm9udCogZm9udCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBOZXdQcml2YXRlRm9udENvbGxlY3Rpb24pKAorICAgIEdwRm9udENvbGxlY3Rpb24qKiBmb250Q29sbGVjdGlvbik7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEZWxldGVQcml2YXRlRm9udENvbGxlY3Rpb24pKAorICAgIEdwRm9udENvbGxlY3Rpb24qKiBmb250Q29sbGVjdGlvbik7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBQcml2YXRlQWRkTWVtb3J5Rm9udCkoCisgICAgR3BGb250Q29sbGVjdGlvbiogZm9udENvbGxlY3Rpb24sCisgICAgR0RJUENPTlNUIHZvaWQqIG1lbW9yeSwKKyAgICBJTlQgbGVuZ3RoKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEdldEZvbnRDb2xsZWN0aW9uRmFtaWx5TGlzdCkoCisgICAgR3BGb250Q29sbGVjdGlvbiogZm9udENvbGxlY3Rpb24sCisgICAgSU5UIG51bVNvdWdodCwKKyAgICBHcEZvbnRGYW1pbHkqIGdwZmFtaWxpZXNbXSwKKyAgICBJTlQqIG51bUZvdW5kKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEdldEZvbnRDb2xsZWN0aW9uRmFtaWx5Q291bnQpKAorICAgIEdwRm9udENvbGxlY3Rpb24qIGZvbnRDb2xsZWN0aW9uLAorICAgIElOVCogbnVtRm91bmQpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0VGV4dENvbnRyYXN0KShHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBjb250cmFzdCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRQaXhlbE9mZnNldE1vZGUpKAorICAgIEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgIFBpeGVsT2Zmc2V0TW9kZSBwaXhlbE9mZnNldE1vZGUpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwR2V0SW1hZ2VHcmFwaGljc0NvbnRleHQpKAorICAgIEdwSW1hZ2UqIGltYWdlLAorICAgIEdwR3JhcGhpY3MqKiBncmFwaGljcyk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEcmF3SW1hZ2VJKShHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwSW1hZ2UqIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgeSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEcmF3SW1hZ2VSZWN0SSkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BJbWFnZSogaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBoZWlnaHQpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRHJhd1N0cmluZykoCisgICAgR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgR0RJUENPTlNUIFdDSEFSKiBzdHJpbmcsCisgICAgSU5UIGxlbmd0aCwKKyAgICBHRElQQ09OU1QgR3BGb250KiBmb250LAorICAgIEdESVBDT05TVCBSZWN0RiogbGF5b3V0UmVjdCwKKyAgICBHRElQQ09OU1QgR3BTdHJpbmdGb3JtYXQqIHN0cmluZ0Zvcm1hdCwKKyAgICBHRElQQ09OU1QgR3BCcnVzaCogYnJ1c2gpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0UGVuVHJhbnNmb3JtKShHcFBlbiogcGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcE1hdHJpeCogbWF0cml4KTsKKyNkZWZpbmUgQ2FsbEZ1bmMoZnVuY25hbWUpIFwKKyAgKChGdW5jVHlwZV8jI2Z1bmNuYW1lKUdkaXBsdXNFeHQubV9GdW5jdGlvbnNbRnVuY0lkXyMjZnVuY25hbWVdKQordHlwZWRlZiBIQU5ETEUoX19zdGRjYWxsKiBGdW5jVHlwZV9HZGlBZGRGb250TWVtUmVzb3VyY2VFeCkoUFZPSUQgcGJGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY2JGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZPSUQgcGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQqIHBjRm9udHMpOwordHlwZWRlZiBCT09MKF9fc3RkY2FsbCogRnVuY1R5cGVfR2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgpKEhBTkRMRSBoYW5kbGUpOwordm9pZCogQ0dkaXBsdXNFeHQ6OkdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KHZvaWQqIHBGb250ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogbnVtX2ZhY2UpIHsKKyAgaWYgKG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KSB7CisgICAgcmV0dXJuICgoRnVuY1R5cGVfR2RpQWRkRm9udE1lbVJlc291cmNlRXgpbV9wR2RpQWRkRm9udE1lbVJlc291cmNlRXgpKAorICAgICAgICAoUFZPSUQpcEZvbnRkYXRhLCAoRFdPUkQpc2l6ZSwgKFBWT0lEKXBkdiwgKERXT1JEKiludW1fZmFjZSk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitGWF9CT09MIENHZGlwbHVzRXh0OjpHZGlSZW1vdmVGb250TWVtUmVzb3VyY2VFeCh2b2lkKiBoYW5kbGUpIHsKKyAgaWYgKG1fcEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJzZUV4KSB7CisgICAgcmV0dXJuICgoRnVuY1R5cGVfR2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgpbV9wR2RpUmVtb3ZlRm9udE1lbVJlc291cnNlRXgpKAorICAgICAgICAoSEFORExFKWhhbmRsZSk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorc3RhdGljIEdwQnJ1c2gqIF9HZGlwQ3JlYXRlQnJ1c2goRFdPUkQgYXJnYikgeworICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CisgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKKyAgR3BTb2xpZEZpbGwqIHNvbGlkQnJ1c2ggPSBOVUxMOworICBDYWxsRnVuYyhHZGlwQ3JlYXRlU29saWRGaWxsKSgoQVJHQilhcmdiLCAmc29saWRCcnVzaCk7CisgIHJldHVybiBzb2xpZEJydXNoOworfQorc3RhdGljIENGWF9ESUJpdG1hcCogX1N0cmV0Y2hNb25vVG9HcmF5KGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCogcENsaXBSZWN0KSB7CisgIEZYX0JPT0wgYkZsaXBYID0gZGVzdF93aWR0aCA8IDA7CisgIGlmIChiRmxpcFgpIHsKKyAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7CisgIH0KKyAgRlhfQk9PTCBiRmxpcFkgPSBkZXN0X2hlaWdodCA8IDA7CisgIGlmIChiRmxpcFkpIHsKKyAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKKyAgfQorICBpbnQgcmVzdWx0X3dpZHRoID0gcENsaXBSZWN0LT5XaWR0aCgpOworICBpbnQgcmVzdWx0X2hlaWdodCA9IHBDbGlwUmVjdC0+SGVpZ2h0KCk7CisgIGludCByZXN1bHRfcGl0Y2ggPSAocmVzdWx0X3dpZHRoICsgMykgLyA0ICogNDsKKyAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKKyAgaWYgKCFwU3RyZXRjaGVkKSB7CiAgICAgcmV0dXJuIE5VTEw7Ci19Ci1GWF9CT09MIENHZGlwbHVzRXh0OjpHZGlSZW1vdmVGb250TWVtUmVzb3VyY2VFeCh2b2lkKiBoYW5kbGUpCi17Ci0gICAgaWYgKG1fcEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJzZUV4KSB7Ci0gICAgICAgIHJldHVybiAoKEZ1bmNUeXBlX0dkaVJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KW1fcEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJzZUV4KSgoSEFORExFKWhhbmRsZSk7CisgIH0KKyAgaWYgKCFwU3RyZXRjaGVkLT5DcmVhdGUocmVzdWx0X3dpZHRoLCByZXN1bHRfaGVpZ2h0LCBGWERJQl84YnBwUmdiKSkgeworICAgIGRlbGV0ZSBwU3RyZXRjaGVkOworICAgIHJldHVybiBOVUxMOworICB9CisgIExQQllURSBkZXN0X2J1ZiA9IHBTdHJldGNoZWQtPkdldEJ1ZmZlcigpOworICBpbnQgc3JjX3dpZHRoID0gcFNvdXJjZS0+R2V0V2lkdGgoKTsKKyAgaW50IHNyY19oZWlnaHQgPSBwU291cmNlLT5HZXRIZWlnaHQoKTsKKyAgaW50IHNyY19jb3VudCA9IHNyY193aWR0aCAqIHNyY19oZWlnaHQ7CisgIGludCBkZXN0X2NvdW50ID0gZGVzdF93aWR0aCAqIGRlc3RfaGVpZ2h0OworICBpbnQgcmF0aW8gPSAyNTUgKiBkZXN0X2NvdW50IC8gc3JjX2NvdW50OworICBpbnQgeV91bml0ID0gc3JjX2hlaWdodCAvIGRlc3RfaGVpZ2h0OworICBpbnQgeF91bml0ID0gc3JjX3dpZHRoIC8gZGVzdF93aWR0aDsKKyAgaW50IGFyZWFfdW5pdCA9IHlfdW5pdCAqIHhfdW5pdDsKKyAgTFBCWVRFIHNyY19idWYgPSBwU291cmNlLT5HZXRCdWZmZXIoKTsKKyAgaW50IHNyY19waXRjaCA9IHBTb3VyY2UtPkdldFBpdGNoKCk7CisgIGZvciAoaW50IGRlc3RfeSA9IDA7IGRlc3RfeSA8IHJlc3VsdF9oZWlnaHQ7IGRlc3RfeSsrKSB7CisgICAgTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF95ICogcmVzdWx0X3BpdGNoOworICAgIGludCBzcmNfeV9zdGFydCA9IGJGbGlwWSA/IChkZXN0X2hlaWdodCAtIDEgLSBkZXN0X3kgLSBwQ2xpcFJlY3QtPnRvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZGVzdF95ICsgcENsaXBSZWN0LT50b3ApOworICAgIHNyY195X3N0YXJ0ID0gc3JjX3lfc3RhcnQgKiBzcmNfaGVpZ2h0IC8gZGVzdF9oZWlnaHQ7CisgICAgTFBCWVRFIHNyY19zY2FuID0gc3JjX2J1ZiArIHNyY195X3N0YXJ0ICogc3JjX3BpdGNoOworICAgIGZvciAoaW50IGRlc3RfeCA9IDA7IGRlc3RfeCA8IHJlc3VsdF93aWR0aDsgZGVzdF94KyspIHsKKyAgICAgIGludCBzdW0gPSAwOworICAgICAgaW50IHNyY194X3N0YXJ0ID0gYkZsaXBYID8gKGRlc3Rfd2lkdGggLSAxIC0gZGVzdF94IC0gcENsaXBSZWN0LT5sZWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGRlc3RfeCArIHBDbGlwUmVjdC0+bGVmdCk7CisgICAgICBzcmNfeF9zdGFydCA9IHNyY194X3N0YXJ0ICogc3JjX3dpZHRoIC8gZGVzdF93aWR0aDsKKyAgICAgIGludCBzcmNfeF9lbmQgPSBzcmNfeF9zdGFydCArIHhfdW5pdDsKKyAgICAgIExQQllURSBzcmNfbGluZSA9IHNyY19zY2FuOworICAgICAgZm9yIChpbnQgc3JjX3kgPSAwOyBzcmNfeSA8IHlfdW5pdDsgc3JjX3krKykgeworICAgICAgICBmb3IgKGludCBzcmNfeCA9IHNyY194X3N0YXJ0OyBzcmNfeCA8IHNyY194X2VuZDsgc3JjX3grKykgeworICAgICAgICAgIGlmICghKHNyY19saW5lW3NyY194IC8gOF0gJiAoMSA8PCAoNyAtIHNyY194ICUgOCkpKSkgeworICAgICAgICAgICAgc3VtICs9IDI1NTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3JjX2xpbmUgKz0gc3JjX3BpdGNoOworICAgICAgfQorICAgICAgZGVzdF9zY2FuW2Rlc3RfeF0gPSAyNTUgLSBzdW0gLyBhcmVhX3VuaXQ7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gcFN0cmV0Y2hlZDsKIH0KLXN0YXRpYyBHcEJydXNoKiBfR2RpcENyZWF0ZUJydXNoKERXT1JEIGFyZ2IpCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBHcFNvbGlkRmlsbCogc29saWRCcnVzaCA9IE5VTEw7CitzdGF0aWMgdm9pZCBPdXRwdXRJbWFnZU1hc2soR3BHcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgYk1vbm9EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0KSB7CisgIEFTU0VSVChwQml0bWFwLT5HZXRCUFAoKSA9PSAxKTsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIGludCBzcmNfd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpLCBzcmNfaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIGludCBzcmNfcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOworICB1aW50OF90KiBzY2FuMCA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOworICBpZiAoc3JjX3dpZHRoID09IDEgJiYgc3JjX2hlaWdodCA9PSAxKSB7CisgICAgaWYgKChzY2FuMFswXSAmIDB4ODApID09IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgR3BTb2xpZEZpbGwqIHNvbGlkQnJ1c2g7CiAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVNvbGlkRmlsbCkoKEFSR0IpYXJnYiwgJnNvbGlkQnJ1c2gpOwotICAgIHJldHVybiBzb2xpZEJydXNoOwotfQotc3RhdGljIENGWF9ESUJpdG1hcCogX1N0cmV0Y2hNb25vVG9HcmF5KGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwU291cmNlLCBGWF9SRUNUKiBwQ2xpcFJlY3QpCi17Ci0gICAgRlhfQk9PTCBiRmxpcFggPSBkZXN0X3dpZHRoIDwgMDsKLSAgICBpZiAoYkZsaXBYKSB7Ci0gICAgICAgIGRlc3Rfd2lkdGggPSAtZGVzdF93aWR0aDsKLSAgICB9Ci0gICAgRlhfQk9PTCBiRmxpcFkgPSBkZXN0X2hlaWdodCA8IDA7Ci0gICAgaWYgKGJGbGlwWSkgewotICAgICAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKLSAgICB9Ci0gICAgaW50IHJlc3VsdF93aWR0aCA9IHBDbGlwUmVjdC0+V2lkdGgoKTsKLSAgICBpbnQgcmVzdWx0X2hlaWdodCA9IHBDbGlwUmVjdC0+SGVpZ2h0KCk7Ci0gICAgaW50IHJlc3VsdF9waXRjaCA9IChyZXN1bHRfd2lkdGggKyAzKSAvIDQgKiA0OwotICAgIENGWF9ESUJpdG1hcCogcFN0cmV0Y2hlZCA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFwU3RyZXRjaGVkKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoIXBTdHJldGNoZWQtPkNyZWF0ZShyZXN1bHRfd2lkdGgsIHJlc3VsdF9oZWlnaHQsIEZYRElCXzhicHBSZ2IpKSB7Ci0gICAgICAgIGRlbGV0ZSBwU3RyZXRjaGVkOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgTFBCWVRFIGRlc3RfYnVmID0gcFN0cmV0Y2hlZC0+R2V0QnVmZmVyKCk7Ci0gICAgaW50IHNyY193aWR0aCA9IHBTb3VyY2UtPkdldFdpZHRoKCk7Ci0gICAgaW50IHNyY19oZWlnaHQgPSBwU291cmNlLT5HZXRIZWlnaHQoKTsKLSAgICBpbnQgc3JjX2NvdW50ID0gc3JjX3dpZHRoICogc3JjX2hlaWdodDsKLSAgICBpbnQgZGVzdF9jb3VudCA9IGRlc3Rfd2lkdGggKiBkZXN0X2hlaWdodDsKLSAgICBpbnQgcmF0aW8gPSAyNTUgKiBkZXN0X2NvdW50IC8gc3JjX2NvdW50OwotICAgIGludCB5X3VuaXQgPSBzcmNfaGVpZ2h0IC8gZGVzdF9oZWlnaHQ7Ci0gICAgaW50IHhfdW5pdCA9IHNyY193aWR0aCAvIGRlc3Rfd2lkdGg7Ci0gICAgaW50IGFyZWFfdW5pdCA9IHlfdW5pdCAqIHhfdW5pdDsKLSAgICBMUEJZVEUgc3JjX2J1ZiA9IHBTb3VyY2UtPkdldEJ1ZmZlcigpOwotICAgIGludCBzcmNfcGl0Y2ggPSBwU291cmNlLT5HZXRQaXRjaCgpOwotICAgIGZvciAoaW50IGRlc3RfeSA9IDA7IGRlc3RfeSA8IHJlc3VsdF9oZWlnaHQ7IGRlc3RfeSArKykgewotICAgICAgICBMUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X3kgKiByZXN1bHRfcGl0Y2g7Ci0gICAgICAgIGludCBzcmNfeV9zdGFydCA9IGJGbGlwWSA/IChkZXN0X2hlaWdodCAtIDEgLSBkZXN0X3kgLSBwQ2xpcFJlY3QtPnRvcCkgOiAoZGVzdF95ICsgcENsaXBSZWN0LT50b3ApOwotICAgICAgICBzcmNfeV9zdGFydCA9IHNyY195X3N0YXJ0ICogc3JjX2hlaWdodCAvIGRlc3RfaGVpZ2h0OwotICAgICAgICBMUEJZVEUgc3JjX3NjYW4gPSBzcmNfYnVmICsgc3JjX3lfc3RhcnQgKiBzcmNfcGl0Y2g7Ci0gICAgICAgIGZvciAoaW50IGRlc3RfeCA9IDA7IGRlc3RfeCA8IHJlc3VsdF93aWR0aDsgZGVzdF94ICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3VtID0gMDsKLSAgICAgICAgICAgIGludCBzcmNfeF9zdGFydCA9IGJGbGlwWCA/IChkZXN0X3dpZHRoIC0gMSAtIGRlc3RfeCAtIHBDbGlwUmVjdC0+bGVmdCkgOiAoZGVzdF94ICsgcENsaXBSZWN0LT5sZWZ0KTsKLSAgICAgICAgICAgIHNyY194X3N0YXJ0ID0gc3JjX3hfc3RhcnQgKiBzcmNfd2lkdGggLyBkZXN0X3dpZHRoOwotICAgICAgICAgICAgaW50IHNyY194X2VuZCA9IHNyY194X3N0YXJ0ICsgeF91bml0OwotICAgICAgICAgICAgTFBCWVRFIHNyY19saW5lID0gc3JjX3NjYW47Ci0gICAgICAgICAgICBmb3IgKGludCBzcmNfeSA9IDA7IHNyY195IDwgeV91bml0OyBzcmNfeSArKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IHNyY194ID0gc3JjX3hfc3RhcnQ7IHNyY194IDwgc3JjX3hfZW5kOyBzcmNfeCArKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIShzcmNfbGluZVtzcmNfeCAvIDhdICYgKDEgPDwgKDcgLSBzcmNfeCAlIDgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3JjX2xpbmUgKz0gc3JjX3BpdGNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfeF0gPSAyNTUgLSBzdW0gLyBhcmVhX3VuaXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBTdHJldGNoZWQ7Ci19Ci1zdGF0aWMgdm9pZCBPdXRwdXRJbWFnZU1hc2soR3BHcmFwaGljcyogcEdyYXBoaWNzLCBCT09MIGJNb25vRGV2aWNlLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9BUkdCIGFyZ2IsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCkKLXsKLSAgICBBU1NFUlQocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSk7Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBpbnQgc3JjX3dpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKSwgc3JjX2hlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOwotICAgIGludCBzcmNfcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwotICAgIHVpbnQ4X3QqIHNjYW4wID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7Ci0gICAgaWYgKHNyY193aWR0aCA9PSAxICYmIHNyY19oZWlnaHQgPT0gMSkgewotICAgICAgICBpZiAoKHNjYW4wWzBdICYgMHg4MCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEdwU29saWRGaWxsKiBzb2xpZEJydXNoOwotICAgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlU29saWRGaWxsKSgoQVJHQilhcmdiLCAmc29saWRCcnVzaCk7Ci0gICAgICAgIGlmIChkZXN0X3dpZHRoIDwgMCkgewotICAgICAgICAgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOwotICAgICAgICAgICAgZGVzdF9sZWZ0IC09IGRlc3Rfd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkgewotICAgICAgICAgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7Ci0gICAgICAgICAgICBkZXN0X3RvcCAtPSBkZXN0X2hlaWdodDsKLSAgICAgICAgfQotICAgICAgICBDYWxsRnVuYyhHZGlwRmlsbFJlY3RhbmdsZSkocEdyYXBoaWNzLCBzb2xpZEJydXNoLCAoZmxvYXQpZGVzdF9sZWZ0LCAoZmxvYXQpZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpZGVzdF93aWR0aCwgKGZsb2F0KWRlc3RfaGVpZ2h0KTsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUJydXNoKShzb2xpZEJydXNoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIWJNb25vRGV2aWNlICYmIGFicyhkZXN0X3dpZHRoKSA8IHNyY193aWR0aCAmJiBhYnMoZGVzdF9oZWlnaHQpIDwgc3JjX2hlaWdodCkgewotICAgICAgICBGWF9SRUNUIGltYWdlX3JlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF9sZWZ0ICsgZGVzdF93aWR0aCwgZGVzdF90b3AgKyBkZXN0X2hlaWdodCk7Ci0gICAgICAgIGltYWdlX3JlY3QuTm9ybWFsaXplKCk7Ci0gICAgICAgIEZYX1JFQ1QgaW1hZ2VfY2xpcCA9IGltYWdlX3JlY3Q7Ci0gICAgICAgIGltYWdlX2NsaXAuSW50ZXJzZWN0KCpwQ2xpcFJlY3QpOwotICAgICAgICBpZiAoaW1hZ2VfY2xpcC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbWFnZV9jbGlwLk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOwotICAgICAgICBDRlhfRElCaXRtYXAqIHBTdHJldGNoZWQgPSBOVUxMOwotICAgICAgICBpZiAoc3JjX3dpZHRoICogc3JjX2hlaWdodCA+IDEwMDAwKSB7Ci0gICAgICAgICAgICBwU3RyZXRjaGVkID0gX1N0cmV0Y2hNb25vVG9HcmF5KGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBwQml0bWFwLCAmaW1hZ2VfY2xpcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwU3RyZXRjaGVkID0gcEJpdG1hcC0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBGQUxTRSwgJmltYWdlX2NsaXApOwotICAgICAgICB9Ci0gICAgICAgIEdwQml0bWFwKiBiaXRtYXA7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKGltYWdlX2NsaXAuV2lkdGgoKSwgaW1hZ2VfY2xpcC5IZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltYWdlX2NsaXAuV2lkdGgoKSArIDMpIC8gNCAqIDQsIFBpeGVsRm9ybWF0OGJwcEluZGV4ZWQsIHBTdHJldGNoZWQtPkdldEJ1ZmZlcigpLCAmYml0bWFwKTsKLSAgICAgICAgaW50IGEsIHIsIGcsIGI7Ci0gICAgICAgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7Ci0gICAgICAgIFVJTlQgcGFsWzI1OF07Ci0gICAgICAgIHBhbFswXSA9IDA7Ci0gICAgICAgIHBhbFsxXSA9IDI1NjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgIHBhbFtpICsgMl0gPSBBcmdiRW5jb2RlKGkgKiBhIC8gMjU1LCByLCBnLCBiKTsKLSAgICAgICAgfQotICAgICAgICBDYWxsRnVuYyhHZGlwU2V0SW1hZ2VQYWxldHRlKShiaXRtYXAsIChDb2xvclBhbGV0dGUqKXBhbCk7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBEcmF3SW1hZ2VJKShwR3JhcGhpY3MsIGJpdG1hcCwgaW1hZ2VfcmVjdC5sZWZ0ICsgaW1hZ2VfY2xpcC5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfcmVjdC50b3AgKyBpbWFnZV9jbGlwLnRvcCk7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBEaXNwb3NlSW1hZ2UpKGJpdG1hcCk7Ci0gICAgICAgIGRlbGV0ZSBwU3RyZXRjaGVkOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEdwQml0bWFwKiBiaXRtYXA7Ci0gICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBzcmNfcGl0Y2gsIFBpeGVsRm9ybWF0MWJwcEluZGV4ZWQsIHNjYW4wLCAmYml0bWFwKTsKLSAgICBVSU5UIHBhbGV0dGVbNF0gPSB7IFBhbGV0dGVGbGFnc0hhc0FscGhhLCAyLCAwLCBhcmdiIH07Ci0gICAgQ2FsbEZ1bmMoR2RpcFNldEltYWdlUGFsZXR0ZSkoYml0bWFwLCAoQ29sb3JQYWxldHRlKilwYWxldHRlKTsKLSAgICBQb2ludCBkZXN0aW5hdGlvblBvaW50c1tdID0gewotICAgICAgICBQb2ludChkZXN0X2xlZnQsIGRlc3RfdG9wKSwKLSAgICAgICAgUG9pbnQoZGVzdF9sZWZ0ICsgZGVzdF93aWR0aCwgZGVzdF90b3ApLAotICAgICAgICBQb2ludChkZXN0X2xlZnQsIGRlc3RfdG9wICsgZGVzdF9oZWlnaHQpCi0gICAgfTsKLSAgICBDYWxsRnVuYyhHZGlwRHJhd0ltYWdlUG9pbnRzSSkocEdyYXBoaWNzLCBiaXRtYXAsIGRlc3RpbmF0aW9uUG9pbnRzLCAzKTsKLSAgICBDYWxsRnVuYyhHZGlwRGlzcG9zZUltYWdlKShiaXRtYXApOwotfQotc3RhdGljIHZvaWQgT3V0cHV0SW1hZ2UoR3BHcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KQotewotICAgIGludCBzcmNfd2lkdGggPSBwU3JjUmVjdC0+V2lkdGgoKSwgc3JjX2hlaWdodCA9IHBTcmNSZWN0LT5IZWlnaHQoKTsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA9PSAxICYmIChwU3JjUmVjdC0+bGVmdCAlIDgpKSB7Ci0gICAgICAgIEZYX1JFQ1QgbmV3X3JlY3QoMCwgMCwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0KTsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmVkID0gcEJpdG1hcC0+Q2xvbmUocFNyY1JlY3QpOwotICAgICAgICBpZiAoIXBDbG9uZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBPdXRwdXRJbWFnZShwR3JhcGhpY3MsIHBDbG9uZWQsICZuZXdfcmVjdCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOwotICAgICAgICBkZWxldGUgcENsb25lZDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgc3JjX3BpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKLSAgICB1aW50OF90KiBzY2FuMCA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgcFNyY1JlY3QtPnRvcCAqIHNyY19waXRjaCArIHBCaXRtYXAtPkdldEJQUCgpICogcFNyY1JlY3QtPmxlZnQgLyA4OwotICAgIEdwQml0bWFwKiBiaXRtYXAgPSBOVUxMOwotICAgIHN3aXRjaCAocEJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsKLSAgICAgICAgY2FzZSBGWERJQl9BcmdiOgotICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBzcmNfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdDMyYnBwQVJHQiwgc2NhbjAsICZiaXRtYXApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiMzI6Ci0gICAgICAgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKShzcmNfd2lkdGgsIHNyY19oZWlnaHQsIHNyY19waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0MzJicHBSR0IsIHNjYW4wLCAmYml0bWFwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX1JnYjoKLSAgICAgICAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKHNyY193aWR0aCwgc3JjX2hlaWdodCwgc3JjX3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQyNGJwcFJHQiwgc2NhbjAsICZiaXRtYXApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogewotICAgICAgICAgICAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKHNyY193aWR0aCwgc3JjX2hlaWdodCwgc3JjX3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0OGJwcEluZGV4ZWQsIHNjYW4wLCAmYml0bWFwKTsKLSAgICAgICAgICAgICAgICBVSU5UIHBhbFsyNThdOwotICAgICAgICAgICAgICAgIHBhbFswXSA9IDA7Ci0gICAgICAgICAgICAgICAgcGFsWzFdID0gMjU2OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhbFtpICsgMl0gPSBwQml0bWFwLT5HZXRQYWxldHRlRW50cnkoaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENhbGxGdW5jKEdkaXBTZXRJbWFnZVBhbGV0dGUpKGJpdG1hcCwgKENvbG9yUGFsZXR0ZSopcGFsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7Ci0gICAgICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBzcmNfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQxYnBwSW5kZXhlZCwgc2NhbjAsICZiaXRtYXApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgIGlmIChkZXN0X3dpZHRoIDwgMCkgeworICAgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOworICAgICAgZGVzdF9sZWZ0IC09IGRlc3Rfd2lkdGg7CiAgICAgfQogICAgIGlmIChkZXN0X2hlaWdodCA8IDApIHsKLSAgICAgICAgZGVzdF9oZWlnaHQgLS07CisgICAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKKyAgICAgIGRlc3RfdG9wIC09IGRlc3RfaGVpZ2h0OwogICAgIH0KLSAgICBpZiAoZGVzdF93aWR0aCA8IDApIHsKLSAgICAgICAgZGVzdF93aWR0aCAtLTsKKyAgICBDYWxsRnVuYyhHZGlwRmlsbFJlY3RhbmdsZSkocEdyYXBoaWNzLCBzb2xpZEJydXNoLCAoZmxvYXQpZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpZGVzdF90b3AsIChmbG9hdClkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpZGVzdF9oZWlnaHQpOworICAgIENhbGxGdW5jKEdkaXBEZWxldGVCcnVzaCkoc29saWRCcnVzaCk7CisgICAgcmV0dXJuOworICB9CisgIGlmICghYk1vbm9EZXZpY2UgJiYgYWJzKGRlc3Rfd2lkdGgpIDwgc3JjX3dpZHRoICYmCisgICAgICBhYnMoZGVzdF9oZWlnaHQpIDwgc3JjX2hlaWdodCkgeworICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X2xlZnQgKyBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3RvcCArIGRlc3RfaGVpZ2h0KTsKKyAgICBpbWFnZV9yZWN0Lk5vcm1hbGl6ZSgpOworICAgIEZYX1JFQ1QgaW1hZ2VfY2xpcCA9IGltYWdlX3JlY3Q7CisgICAgaW1hZ2VfY2xpcC5JbnRlcnNlY3QoKnBDbGlwUmVjdCk7CisgICAgaWYgKGltYWdlX2NsaXAuSXNFbXB0eSgpKSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIFBvaW50IGRlc3RpbmF0aW9uUG9pbnRzW10gPSB7Ci0gICAgICAgIFBvaW50KGRlc3RfbGVmdCwgZGVzdF90b3ApLAotICAgICAgICBQb2ludChkZXN0X2xlZnQgKyBkZXN0X3dpZHRoLCBkZXN0X3RvcCksCi0gICAgICAgIFBvaW50KGRlc3RfbGVmdCwgZGVzdF90b3AgKyBkZXN0X2hlaWdodCkKLSAgICB9OwotICAgIENhbGxGdW5jKEdkaXBEcmF3SW1hZ2VQb2ludHNJKShwR3JhcGhpY3MsIGJpdG1hcCwgZGVzdGluYXRpb25Qb2ludHMsIDMpOworICAgIGltYWdlX2NsaXAuT2Zmc2V0KC1pbWFnZV9yZWN0LmxlZnQsIC1pbWFnZV9yZWN0LnRvcCk7CisgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gTlVMTDsKKyAgICBpZiAoc3JjX3dpZHRoICogc3JjX2hlaWdodCA+IDEwMDAwKSB7CisgICAgICBwU3RyZXRjaGVkID0KKyAgICAgICAgICBfU3RyZXRjaE1vbm9Ub0dyYXkoZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIHBCaXRtYXAsICZpbWFnZV9jbGlwKTsKKyAgICB9IGVsc2UgeworICAgICAgcFN0cmV0Y2hlZCA9CisgICAgICAgICAgcEJpdG1hcC0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBGQUxTRSwgJmltYWdlX2NsaXApOworICAgIH0KKyAgICBHcEJpdG1hcCogYml0bWFwOworICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKGltYWdlX2NsaXAuV2lkdGgoKSwgaW1hZ2VfY2xpcC5IZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1hZ2VfY2xpcC5XaWR0aCgpICsgMykgLyA0ICogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdDhicHBJbmRleGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJldGNoZWQtPkdldEJ1ZmZlcigpLCAmYml0bWFwKTsKKyAgICBpbnQgYSwgciwgZywgYjsKKyAgICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOworICAgIFVJTlQgcGFsWzI1OF07CisgICAgcGFsWzBdID0gMDsKKyAgICBwYWxbMV0gPSAyNTY7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgcGFsW2kgKyAyXSA9IEFyZ2JFbmNvZGUoaSAqIGEgLyAyNTUsIHIsIGcsIGIpOworICAgIH0KKyAgICBDYWxsRnVuYyhHZGlwU2V0SW1hZ2VQYWxldHRlKShiaXRtYXAsIChDb2xvclBhbGV0dGUqKXBhbCk7CisgICAgQ2FsbEZ1bmMoR2RpcERyYXdJbWFnZUkpKHBHcmFwaGljcywgYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9yZWN0LmxlZnQgKyBpbWFnZV9jbGlwLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3JlY3QudG9wICsgaW1hZ2VfY2xpcC50b3ApOwogICAgIENhbGxGdW5jKEdkaXBEaXNwb3NlSW1hZ2UpKGJpdG1hcCk7CisgICAgZGVsZXRlIHBTdHJldGNoZWQ7CisgICAgcmV0dXJuOworICB9CisgIEdwQml0bWFwKiBiaXRtYXA7CisgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKHNyY193aWR0aCwgc3JjX2hlaWdodCwgc3JjX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdDFicHBJbmRleGVkLCBzY2FuMCwgJmJpdG1hcCk7CisgIFVJTlQgcGFsZXR0ZVs0XSA9IHtQYWxldHRlRmxhZ3NIYXNBbHBoYSwgMiwgMCwgYXJnYn07CisgIENhbGxGdW5jKEdkaXBTZXRJbWFnZVBhbGV0dGUpKGJpdG1hcCwgKENvbG9yUGFsZXR0ZSopcGFsZXR0ZSk7CisgIFBvaW50IGRlc3RpbmF0aW9uUG9pbnRzW10gPSB7UG9pbnQoZGVzdF9sZWZ0LCBkZXN0X3RvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQoZGVzdF9sZWZ0ICsgZGVzdF93aWR0aCwgZGVzdF90b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50KGRlc3RfbGVmdCwgZGVzdF90b3AgKyBkZXN0X2hlaWdodCl9OworICBDYWxsRnVuYyhHZGlwRHJhd0ltYWdlUG9pbnRzSSkocEdyYXBoaWNzLCBiaXRtYXAsIGRlc3RpbmF0aW9uUG9pbnRzLCAzKTsKKyAgQ2FsbEZ1bmMoR2RpcERpc3Bvc2VJbWFnZSkoYml0bWFwKTsKIH0KLUNHZGlwbHVzRXh0OjpDR2RpcGx1c0V4dCgpCi17Ci0gICAgbV9oTW9kdWxlID0gTlVMTDsKLSAgICBtX0dkaU1vZHVsZSA9IE5VTEw7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YgZ19HZGlwRnVuY05hbWVzIC8gc2l6ZW9mKExQQ1NUUik7IGkgKyspIHsKLSAgICAgICAgbV9GdW5jdGlvbnNbaV0gPSBOVUxMOworc3RhdGljIHZvaWQgT3V0cHV0SW1hZ2UoR3BHcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQpIHsKKyAgaW50IHNyY193aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBzcmNfaGVpZ2h0ID0gcFNyY1JlY3QtPkhlaWdodCgpOworICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CisgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKKyAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID09IDEgJiYgKHBTcmNSZWN0LT5sZWZ0ICUgOCkpIHsKKyAgICBGWF9SRUNUIG5ld19yZWN0KDAsIDAsIHNyY193aWR0aCwgc3JjX2hlaWdodCk7CisgICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmVkID0gcEJpdG1hcC0+Q2xvbmUocFNyY1JlY3QpOworICAgIGlmICghcENsb25lZCkgeworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtX3BHZGlBZGRGb250TWVtUmVzb3VyY2VFeCA9IE5VTEw7Ci0gICAgbV9wR2RpUmVtb3ZlRm9udE1lbVJlc291cnNlRXggPSBOVUxMOworICAgIE91dHB1dEltYWdlKHBHcmFwaGljcywgcENsb25lZCwgJm5ld19yZWN0LCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0KTsKKyAgICBkZWxldGUgcENsb25lZDsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IHNyY19waXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CisgIHVpbnQ4X3QqIHNjYW4wID0gcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyBwU3JjUmVjdC0+dG9wICogc3JjX3BpdGNoICsKKyAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRCUFAoKSAqIHBTcmNSZWN0LT5sZWZ0IC8gODsKKyAgR3BCaXRtYXAqIGJpdG1hcCA9IE5VTEw7CisgIHN3aXRjaCAocEJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCX0FyZ2I6CisgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKShzcmNfd2lkdGgsIHNyY19oZWlnaHQsIHNyY19waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0MzJicHBBUkdCLCBzY2FuMCwgJmJpdG1hcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX1JnYjMyOgorICAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBzcmNfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdDMyYnBwUkdCLCBzY2FuMCwgJmJpdG1hcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX1JnYjoKKyAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKHNyY193aWR0aCwgc3JjX2hlaWdodCwgc3JjX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQyNGJwcFJHQiwgc2NhbjAsICZiaXRtYXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7CisgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKShzcmNfd2lkdGgsIHNyY19oZWlnaHQsIHNyY19waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0OGJwcEluZGV4ZWQsIHNjYW4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJpdG1hcCk7CisgICAgICBVSU5UIHBhbFsyNThdOworICAgICAgcGFsWzBdID0gMDsKKyAgICAgIHBhbFsxXSA9IDI1NjsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgcGFsW2kgKyAyXSA9IHBCaXRtYXAtPkdldFBhbGV0dGVFbnRyeShpKTsKKyAgICAgIH0KKyAgICAgIENhbGxGdW5jKEdkaXBTZXRJbWFnZVBhbGV0dGUpKGJpdG1hcCwgKENvbG9yUGFsZXR0ZSopcGFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsKKyAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKHNyY193aWR0aCwgc3JjX2hlaWdodCwgc3JjX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQxYnBwSW5kZXhlZCwgc2NhbjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYml0bWFwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoZGVzdF9oZWlnaHQgPCAwKSB7CisgICAgZGVzdF9oZWlnaHQtLTsKKyAgfQorICBpZiAoZGVzdF93aWR0aCA8IDApIHsKKyAgICBkZXN0X3dpZHRoLS07CisgIH0KKyAgUG9pbnQgZGVzdGluYXRpb25Qb2ludHNbXSA9IHtQb2ludChkZXN0X2xlZnQsIGRlc3RfdG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludChkZXN0X2xlZnQgKyBkZXN0X3dpZHRoLCBkZXN0X3RvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQoZGVzdF9sZWZ0LCBkZXN0X3RvcCArIGRlc3RfaGVpZ2h0KX07CisgIENhbGxGdW5jKEdkaXBEcmF3SW1hZ2VQb2ludHNJKShwR3JhcGhpY3MsIGJpdG1hcCwgZGVzdGluYXRpb25Qb2ludHMsIDMpOworICBDYWxsRnVuYyhHZGlwRGlzcG9zZUltYWdlKShiaXRtYXApOwogfQotdm9pZCBDR2RpcGx1c0V4dDo6TG9hZCgpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyUGx1c1BhdGggPSAiIjsKLSAgICBGWF9DSEFSIGJ1ZltNQVhfUEFUSF07Ci0gICAgR2V0U3lzdGVtRGlyZWN0b3J5QShidWYsIE1BWF9QQVRIKTsKLSAgICBzdHJQbHVzUGF0aCArPSBidWY7Ci0gICAgc3RyUGx1c1BhdGggKz0gIlxcIjsKLSAgICBzdHJQbHVzUGF0aCArPSAiR0RJUExVUy5ETEwiOwotICAgIG1faE1vZHVsZSA9IExvYWRMaWJyYXJ5QShzdHJQbHVzUGF0aCk7Ci0gICAgaWYgKG1faE1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YgZ19HZGlwRnVuY05hbWVzIC8gc2l6ZW9mKExQQ1NUUik7IGkgKyspIHsKLSAgICAgICAgbV9GdW5jdGlvbnNbaV0gPSBHZXRQcm9jQWRkcmVzcyhtX2hNb2R1bGUsIGdfR2RpcEZ1bmNOYW1lc1tpXSk7Ci0gICAgICAgIGlmIChtX0Z1bmN0aW9uc1tpXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtX2hNb2R1bGUgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIHVpbnRwdHJfdCBnZGlwbHVzVG9rZW47Ci0gICAgR2RpcGx1c1N0YXJ0dXBJbnB1dCBnZGlwbHVzU3RhcnR1cElucHV0OwotICAgICgoRnVuY1R5cGVfR2RpcGx1c1N0YXJ0dXApbV9GdW5jdGlvbnNbRnVuY0lkX0dkaXBsdXNTdGFydHVwXSkoJmdkaXBsdXNUb2tlbiwgJmdkaXBsdXNTdGFydHVwSW5wdXQsIE5VTEwpOwotICAgIG1fR2RpTW9kdWxlID0gTG9hZExpYnJhcnlBKCJHREkzMi5ETEwiKTsKLSAgICBpZiAobV9HZGlNb2R1bGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4ID0gR2V0UHJvY0FkZHJlc3MobV9HZGlNb2R1bGUsICJBZGRGb250TWVtUmVzb3VyY2VFeCIpOwotICAgIG1fcEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJzZUV4ID0gR2V0UHJvY0FkZHJlc3MobV9HZGlNb2R1bGUsICJSZW1vdmVGb250TWVtUmVzb3VyY2VFeCIpOworQ0dkaXBsdXNFeHQ6OkNHZGlwbHVzRXh0KCkgeworICBtX2hNb2R1bGUgPSBOVUxMOworICBtX0dkaU1vZHVsZSA9IE5VTEw7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mIGdfR2RpcEZ1bmNOYW1lcyAvIHNpemVvZihMUENTVFIpOyBpKyspIHsKKyAgICBtX0Z1bmN0aW9uc1tpXSA9IE5VTEw7CisgIH0KKyAgbV9wR2RpQWRkRm9udE1lbVJlc291cmNlRXggPSBOVUxMOworICBtX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeCA9IE5VTEw7CiB9Ci1DR2RpcGx1c0V4dDo6fkNHZGlwbHVzRXh0KCkKLXsKLX0KLUxQVk9JRCBDR2RpcGx1c0V4dDo6TG9hZE1lbUZvbnQoTFBCWVRFIHBEYXRhLCBGWF9EV09SRCBzaXplKQotewotICAgIEdwRm9udENvbGxlY3Rpb24qIHBDb2xsZWN0aW9uID0gTlVMTDsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBOZXdQcml2YXRlRm9udENvbGxlY3Rpb24pKCZwQ29sbGVjdGlvbik7Ci0gICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcFByaXZhdGVBZGRNZW1vcnlGb250KShwQ29sbGVjdGlvbiwgcERhdGEsIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT2spIHsKLSAgICAgICAgcmV0dXJuIHBDb2xsZWN0aW9uOwordm9pZCBDR2RpcGx1c0V4dDo6TG9hZCgpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyUGx1c1BhdGggPSAiIjsKKyAgRlhfQ0hBUiBidWZbTUFYX1BBVEhdOworICBHZXRTeXN0ZW1EaXJlY3RvcnlBKGJ1ZiwgTUFYX1BBVEgpOworICBzdHJQbHVzUGF0aCArPSBidWY7CisgIHN0clBsdXNQYXRoICs9ICJcXCI7CisgIHN0clBsdXNQYXRoICs9ICJHRElQTFVTLkRMTCI7CisgIG1faE1vZHVsZSA9IExvYWRMaWJyYXJ5QShzdHJQbHVzUGF0aCk7CisgIGlmIChtX2hNb2R1bGUgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZiBnX0dkaXBGdW5jTmFtZXMgLyBzaXplb2YoTFBDU1RSKTsgaSsrKSB7CisgICAgbV9GdW5jdGlvbnNbaV0gPSBHZXRQcm9jQWRkcmVzcyhtX2hNb2R1bGUsIGdfR2RpcEZ1bmNOYW1lc1tpXSk7CisgICAgaWYgKG1fRnVuY3Rpb25zW2ldID09IE5VTEwpIHsKKyAgICAgIG1faE1vZHVsZSA9IE5VTEw7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIENhbGxGdW5jKEdkaXBEZWxldGVQcml2YXRlRm9udENvbGxlY3Rpb24pKCZwQ29sbGVjdGlvbik7CisgIH0KKyAgdWludHB0cl90IGdkaXBsdXNUb2tlbjsKKyAgR2RpcGx1c1N0YXJ0dXBJbnB1dCBnZGlwbHVzU3RhcnR1cElucHV0OworICAoKEZ1bmNUeXBlX0dkaXBsdXNTdGFydHVwKW1fRnVuY3Rpb25zW0Z1bmNJZF9HZGlwbHVzU3RhcnR1cF0pKAorICAgICAgJmdkaXBsdXNUb2tlbiwgJmdkaXBsdXNTdGFydHVwSW5wdXQsIE5VTEwpOworICBtX0dkaU1vZHVsZSA9IExvYWRMaWJyYXJ5QSgiR0RJMzIuRExMIik7CisgIGlmIChtX0dkaU1vZHVsZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4ID0KKyAgICAgIEdldFByb2NBZGRyZXNzKG1fR2RpTW9kdWxlLCAiQWRkRm9udE1lbVJlc291cmNlRXgiKTsKKyAgbV9wR2RpUmVtb3ZlRm9udE1lbVJlc291cnNlRXggPQorICAgICAgR2V0UHJvY0FkZHJlc3MobV9HZGlNb2R1bGUsICJSZW1vdmVGb250TWVtUmVzb3VyY2VFeCIpOworfQorQ0dkaXBsdXNFeHQ6On5DR2RpcGx1c0V4dCgpIHt9CitMUFZPSUQgQ0dkaXBsdXNFeHQ6OkxvYWRNZW1Gb250KExQQllURSBwRGF0YSwgRlhfRFdPUkQgc2l6ZSkgeworICBHcEZvbnRDb2xsZWN0aW9uKiBwQ29sbGVjdGlvbiA9IE5VTEw7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwTmV3UHJpdmF0ZUZvbnRDb2xsZWN0aW9uKSgmcENvbGxlY3Rpb24pOworICBHcFN0YXR1cyBzdGF0dXMgPQorICAgICAgQ2FsbEZ1bmMoR2RpcFByaXZhdGVBZGRNZW1vcnlGb250KShwQ29sbGVjdGlvbiwgcERhdGEsIHNpemUpOworICBpZiAoc3RhdHVzID09IE9rKSB7CisgICAgcmV0dXJuIHBDb2xsZWN0aW9uOworICB9CisgIENhbGxGdW5jKEdkaXBEZWxldGVQcml2YXRlRm9udENvbGxlY3Rpb24pKCZwQ29sbGVjdGlvbik7CisgIHJldHVybiBOVUxMOworfQordm9pZCBDR2RpcGx1c0V4dDo6RGVsZXRlTWVtRm9udChMUFZPSUQgcENvbGxlY3Rpb24pIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBEZWxldGVQcml2YXRlRm9udENvbGxlY3Rpb24pKChHcEZvbnRDb2xsZWN0aW9uKiopJnBDb2xsZWN0aW9uKTsKK30KK0ZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKiogYml0bWFwKSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBQaXhlbEZvcm1hdCBmb3JtYXQ7CisgIHN3aXRjaCAocEJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCX1JnYjoKKyAgICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0MjRicHBSR0I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX1JnYjMyOgorICAgICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQzMmJwcFJHQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQXJnYjoKKyAgICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0MzJicHBBUkdCOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKSgKKyAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQml0bWFwLT5HZXRQaXRjaCgpLCBmb3JtYXQsCisgICAgICBwQml0bWFwLT5HZXRCdWZmZXIoKSwgKEdwQml0bWFwKiopYml0bWFwKTsKKyAgaWYgKHN0YXR1cyA9PSBPaykgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGcm9tSW1hZ2Uodm9pZCogYml0bWFwLCB2b2lkKiogZ3JhcGhpY3MpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBHZXRJbWFnZUdyYXBoaWNzQ29udGV4dCkoCisgICAgICAoR3BCaXRtYXAqKWJpdG1hcCwgKEdwR3JhcGhpY3MqKilncmFwaGljcyk7CisgIGlmIChzdGF0dXMgPT0gT2spIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKGNvbnN0IEZYX1dDSEFSKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRm9udENvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwRmFtaWx5KSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKSgKKyAgICAgIChHRElQQ09OU1QgV0NIQVIqKW5hbWUsIChHcEZvbnRDb2xsZWN0aW9uKilwRm9udENvbGxlY3Rpb24sCisgICAgICAoR3BGb250RmFtaWx5KiopcEZhbWlseSk7CisgIGlmIChzdGF0dXMgPT0gT2spIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZyb21GYW1pbHkodm9pZCogcEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcEZvbnQpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIEdwU3RhdHVzIHN0YXR1cyA9CisgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlRm9udCkoKEdwRm9udEZhbWlseSopcEZhbWlseSwgZm9udF9zaXplLCBmb250c3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdChmbGFnKSwgKEdwRm9udCoqKXBGb250KTsKKyAgaWYgKHN0YXR1cyA9PSBPaykgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK3ZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBHZXRGb250U2l6ZSh2b2lkKiBwRm9udCwgRlhfRkxPQVQqIHNpemUpIHsKKyAgUkVBTCBnZXRfc2l6ZTsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBHZXRGb250U2l6ZSkoKEdwRm9udCopcEZvbnQsIChSRUFMKikmZ2V0X3NpemUpOworICBpZiAoc3RhdHVzID09IE9rKSB7CisgICAgKnNpemUgPSAoRlhfRkxPQVQpZ2V0X3NpemU7CisgIH0gZWxzZSB7CisgICAgKnNpemUgPSAwOworICB9Cit9Cit2b2lkIENHZGlwbHVzRXh0OjpHZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQodm9pZCogZ3JhcGhpY3MsIGludCBtb2RlKSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQpKChHcEdyYXBoaWNzKilncmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGV4dFJlbmRlcmluZ0hpbnQpbW9kZSk7Cit9Cit2b2lkIENHZGlwbHVzRXh0OjpHZGlwU2V0UGFnZVVuaXQodm9pZCogZ3JhcGhpY3MsIEZYX0RXT1JEIHVuaXQpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBTZXRQYWdlVW5pdCkoKEdwR3JhcGhpY3MqKWdyYXBoaWNzLCAoR3BVbml0KXVuaXQpOworfQorRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwb3NpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBtYXRyaXgpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBEcmF3RHJpdmVyU3RyaW5nKSgKKyAgICAgIChHcEdyYXBoaWNzKilncmFwaGljcywgKEdESVBDT05TVCBVSU5UMTYqKXRleHQsIChJTlQpbGVuZ3RoLAorICAgICAgKEdESVBDT05TVCBHcEZvbnQqKWZvbnQsIChHRElQQ09OU1QgR3BCcnVzaCopYnJ1c2gsCisgICAgICAoR0RJUENPTlNUIFBvaW50RiopcG9zaXRpb25zLCAoSU5UKWZsYWdzLCAoR0RJUENPTlNUIEdwTWF0cml4KiltYXRyaXgpOworICBpZiAoc3RhdHVzID09IE9rKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQordm9pZCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUJydXNoKEZYX0RXT1JEIGZpbGxfYXJnYiwgdm9pZCoqIHBCcnVzaCkgeworICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CisgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKKyAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVNvbGlkRmlsbCkoKEFSR0IpZmlsbF9hcmdiLCAoR3BTb2xpZEZpbGwqKilwQnJ1c2gpOworfQordm9pZCBDR2RpcGx1c0V4dDo6R2RpcERlbGV0ZUJydXNoKHZvaWQqIHBCcnVzaCkgeworICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CisgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKKyAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUJydXNoKSgoR3BTb2xpZEZpbGwqKXBCcnVzaCk7Cit9Cit2b2lkKiBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUZvbnRGcm9tQ29sbGVjdGlvbih2b2lkKiBwRm9udENvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9udHN0eWxlKSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBpbnQgbnVtRmFtaWxpZXMgPSAwOworICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwR2V0Rm9udENvbGxlY3Rpb25GYW1pbHlDb3VudCkoCisgICAgICAoR3BGb250Q29sbGVjdGlvbiopcEZvbnRDb2xsZWN0aW9uLCAmbnVtRmFtaWxpZXMpOworICBpZiAoc3RhdHVzICE9IE9rKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgR3BGb250RmFtaWx5KiBmYW1pbHlfbGlzdFsxXTsKKyAgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcEdldEZvbnRDb2xsZWN0aW9uRmFtaWx5TGlzdCkoCisgICAgICAoR3BGb250Q29sbGVjdGlvbiopcEZvbnRDb2xsZWN0aW9uLCAxLCBmYW1pbHlfbGlzdCwgJm51bUZhbWlsaWVzKTsKKyAgaWYgKHN0YXR1cyAhPSBPaykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEdwRm9udCogcEZvbnQgPSBOVUxMOworICBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlRm9udCkoZmFtaWx5X2xpc3RbMF0sIGZvbnRfc2l6ZSwgZm9udHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdFBpeGVsLCAmcEZvbnQpOworICBpZiAoc3RhdHVzICE9IE9rKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHBGb250OwogfQotdm9pZCBDR2RpcGx1c0V4dDo6RGVsZXRlTWVtRm9udChMUFZPSUQgcENvbGxlY3Rpb24pCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUHJpdmF0ZUZvbnRDb2xsZWN0aW9uKSgoR3BGb250Q29sbGVjdGlvbioqKSZwQ29sbGVjdGlvbik7Cit2b2lkIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlTWF0cml4KEZYX0ZMT0FUIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBtYXRyaXgpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBDcmVhdGVNYXRyaXgyKShhLCBiLCBjLCBkLCBlLCBmLCAoR3BNYXRyaXgqKiltYXRyaXgpOwogfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKmJpdG1hcCkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIFBpeGVsRm9ybWF0IGZvcm1hdDsKLSAgICBzd2l0Y2ggKHBCaXRtYXAtPkdldEZvcm1hdCgpKSB7Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiOgotICAgICAgICAgICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQyNGJwcFJHQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX1JnYjMyOgotICAgICAgICAgICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQzMmJwcFJHQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0FyZ2I6Ci0gICAgICAgICAgICBmb3JtYXQgPSBQaXhlbEZvcm1hdDMyYnBwQVJHQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwordm9pZCBDR2RpcGx1c0V4dDo6R2RpcERlbGV0ZU1hdHJpeCh2b2lkKiBtYXRyaXgpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBEZWxldGVNYXRyaXgpKChHcE1hdHJpeCopbWF0cml4KTsKK30KK3ZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBEZWxldGVGb250RmFtaWx5KHZvaWQqIHBGYW1pbHkpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBEZWxldGVGb250RmFtaWx5KSgoR3BGb250RmFtaWx5KilwRmFtaWx5KTsKK30KK3ZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBEZWxldGVGb250KHZvaWQqIHBGb250KSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwRGVsZXRlRm9udCkoKEdwRm9udCopcEZvbnQpOworfQordm9pZCBDR2RpcGx1c0V4dDo6R2RpcFNldFdvcmxkVHJhbnNmb3JtKHZvaWQqIGdyYXBoaWNzLCB2b2lkKiBwTWF0cml4KSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwU2V0V29ybGRUcmFuc2Zvcm0pKChHcEdyYXBoaWNzKilncmFwaGljcywgKEdwTWF0cml4KilwTWF0cml4KTsKK30KK3ZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBEaXNwb3NlSW1hZ2Uodm9pZCogYml0bWFwKSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwRGlzcG9zZUltYWdlKSgoR3BCaXRtYXAqKWJpdG1hcCk7Cit9Cit2b2lkIENHZGlwbHVzRXh0OjpHZGlwRGVsZXRlR3JhcGhpY3Modm9pZCogZ3JhcGhpY3MpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykoKEdwR3JhcGhpY3MqKWdyYXBoaWNzKTsKK30KK0ZYX0JPT0wgQ0dkaXBsdXNFeHQ6OlN0cmV0Y2hCaXRNYXNrKEhEQyBoREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIGJNb25vRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgeworICBBU1NFUlQocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSk7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBHcEdyYXBoaWNzKiBwR3JhcGhpY3MgPSBOVUxMOworICBDYWxsRnVuYyhHZGlwQ3JlYXRlRnJvbUhEQykoaERDLCAmcEdyYXBoaWNzKTsKKyAgQ2FsbEZ1bmMoR2RpcFNldFBhZ2VVbml0KShwR3JhcGhpY3MsIFVuaXRQaXhlbCk7CisgIGlmIChmbGFncyAmIEZYRElCX05PU01PT1RIKSB7CisgICAgQ2FsbEZ1bmMoR2RpcFNldEludGVycG9sYXRpb25Nb2RlKShwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uTW9kZU5lYXJlc3ROZWlnaGJvcik7CisgIH0gZWxzZSB7CisgICAgQ2FsbEZ1bmMoR2RpcFNldEludGVycG9sYXRpb25Nb2RlKShwR3JhcGhpY3MsIEludGVycG9sYXRpb25Nb2RlSGlnaFF1YWxpdHkpOworICB9CisgIE91dHB1dEltYWdlTWFzayhwR3JhcGhpY3MsIGJNb25vRGV2aWNlLCBwQml0bWFwLCBkZXN0X2xlZnQsIGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGFyZ2IsIHBDbGlwUmVjdCk7CisgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENHZGlwbHVzRXh0OjpTdHJldGNoRElCaXRzKEhEQyBoREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgeworICBHcEdyYXBoaWNzKiBwR3JhcGhpY3M7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwQ3JlYXRlRnJvbUhEQykoaERDLCAmcEdyYXBoaWNzKTsKKyAgQ2FsbEZ1bmMoR2RpcFNldFBhZ2VVbml0KShwR3JhcGhpY3MsIFVuaXRQaXhlbCk7CisgIGlmIChmbGFncyAmIEZYRElCX05PU01PT1RIKSB7CisgICAgQ2FsbEZ1bmMoR2RpcFNldEludGVycG9sYXRpb25Nb2RlKShwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uTW9kZU5lYXJlc3ROZWlnaGJvcik7CisgIH0gZWxzZSBpZiAocEJpdG1hcC0+R2V0V2lkdGgoKSA+IGFicyhkZXN0X3dpZHRoKSAvIDIgfHwKKyAgICAgICAgICAgICBwQml0bWFwLT5HZXRIZWlnaHQoKSA+IGFicyhkZXN0X2hlaWdodCkgLyAyKSB7CisgICAgQ2FsbEZ1bmMoR2RpcFNldEludGVycG9sYXRpb25Nb2RlKShwR3JhcGhpY3MsIEludGVycG9sYXRpb25Nb2RlSGlnaFF1YWxpdHkpOworICB9IGVsc2UgeworICAgIENhbGxGdW5jKEdkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSkocEdyYXBoaWNzLCBJbnRlcnBvbGF0aW9uTW9kZUJpbGluZWFyKTsKKyAgfQorICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKKyAgT3V0cHV0SW1hZ2UocEdyYXBoaWNzLCBwQml0bWFwLCAmc3JjX3JlY3QsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0KTsKKyAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKShwR3JhcGhpY3MpOworICBDYWxsRnVuYyhHZGlwRGVsZXRlR3JhcGhpY3MpKHBHcmFwaGljcyk7CisgIHJldHVybiBUUlVFOworfQorc3RhdGljIEdwUGVuKiBfR2RpcENyZWF0ZVBlbihjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUZXh0TW9kZSA9IEZBTFNFKSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBGWF9GTE9BVCB3aWR0aCA9IHBHcmFwaFN0YXRlID8gcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoIDogMS4wZjsKKyAgaWYgKCFiVGV4dE1vZGUpIHsKKyAgICBGWF9GTE9BVCB1bml0ID0KKyAgICAgICAgcE1hdHJpeCA9PSBOVUxMCisgICAgICAgICAgICA/IDEuMGYKKyAgICAgICAgICAgIDogRlhTWVNfRGl2KDEuMGYsIChwTWF0cml4LT5HZXRYVW5pdCgpICsgcE1hdHJpeC0+R2V0WVVuaXQoKSkgLyAyKTsKKyAgICBpZiAod2lkdGggPCB1bml0KSB7CisgICAgICB3aWR0aCA9IHVuaXQ7CiAgICAgfQotICAgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldFBpdGNoKCksIGZvcm1hdCwgcEJpdG1hcC0+R2V0QnVmZmVyKCksIChHcEJpdG1hcCoqKWJpdG1hcCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPaykgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUZyb21JbWFnZSh2b2lkKiBiaXRtYXAsIHZvaWQqKiBncmFwaGljcykKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBHZXRJbWFnZUdyYXBoaWNzQ29udGV4dCkoKEdwQml0bWFwKiliaXRtYXAsIChHcEdyYXBoaWNzKiopZ3JhcGhpY3MpOwotICAgIGlmIChzdGF0dXMgPT0gT2spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGb250RmFtaWx5RnJvbU5hbWUoY29uc3QgRlhfV0NIQVIqIG5hbWUsIHZvaWQqIHBGb250Q29sbGVjdGlvbiwgdm9pZCoqcEZhbWlseSkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBDcmVhdGVGb250RmFtaWx5RnJvbU5hbWUpKChHRElQQ09OU1QgV0NIQVIgKiluYW1lLCAoR3BGb250Q29sbGVjdGlvbiopcEZvbnRDb2xsZWN0aW9uLCAoR3BGb250RmFtaWx5KiopcEZhbWlseSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPaykgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUZvbnRGcm9tRmFtaWx5KHZvaWQqIHBGYW1pbHksIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgaW50IGZvbnRzdHlsZSwgaW50IGZsYWcsIHZvaWQqKiBwRm9udCkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBDcmVhdGVGb250KSgoR3BGb250RmFtaWx5KilwRmFtaWx5LCBmb250X3NpemUsIGZvbnRzdHlsZSwgVW5pdChmbGFnKSwgKEdwRm9udCoqKXBGb250KTsKLSAgICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci12b2lkIENHZGlwbHVzRXh0OjpHZGlwR2V0Rm9udFNpemUodm9pZCAqcEZvbnQsIEZYX0ZMT0FUICpzaXplKQotewotICAgIFJFQUwgZ2V0X3NpemU7Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwR2V0Rm9udFNpemUpKChHcEZvbnQgKilwRm9udCwgKFJFQUwqKSZnZXRfc2l6ZSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPaykgewotICAgICAgICAqc2l6ZSA9IChGWF9GTE9BVClnZXRfc2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICAqc2l6ZSA9IDA7Ci0gICAgfQotfQotdm9pZCBDR2RpcGx1c0V4dDo6R2RpcFNldFRleHRSZW5kZXJpbmdIaW50KHZvaWQqIGdyYXBoaWNzLCBpbnQgbW9kZSkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBTZXRUZXh0UmVuZGVyaW5nSGludCkoKEdwR3JhcGhpY3MqKWdyYXBoaWNzLCAoVGV4dFJlbmRlcmluZ0hpbnQpbW9kZSk7Ci19Ci12b2lkIENHZGlwbHVzRXh0OjpHZGlwU2V0UGFnZVVuaXQodm9pZCogZ3JhcGhpY3MsIEZYX0RXT1JEIHVuaXQpCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBDYWxsRnVuYyhHZGlwU2V0UGFnZVVuaXQpKChHcEdyYXBoaWNzKilncmFwaGljcywgKEdwVW5pdCl1bml0KTsKLX0KLUZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBEcmF3RHJpdmVyU3RyaW5nKHZvaWQgKmdyYXBoaWNzLCAgdW5zaWduZWQgc2hvcnQgKnRleHQsIGludCBsZW5ndGgsCi0gICAgICAgIHZvaWQgKmZvbnQsIHZvaWQqIGJydXNoLCB2b2lkICpwb3NpdGlvbnMsIGludCBmbGFncywgY29uc3Qgdm9pZCAqbWF0cml4KQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcERyYXdEcml2ZXJTdHJpbmcpKChHcEdyYXBoaWNzKilncmFwaGljcywgKEdESVBDT05TVCBVSU5UMTYgKil0ZXh0LCAoSU5UKWxlbmd0aCwgKEdESVBDT05TVCBHcEZvbnQgKilmb250LCAoR0RJUENPTlNUIEdwQnJ1c2gqKWJydXNoLAotICAgICAgICAgICAgICAgICAgICAgIChHRElQQ09OU1QgUG9pbnRGICopcG9zaXRpb25zLCAoSU5UKWZsYWdzLCAoR0RJUENPTlNUIEdwTWF0cml4ICopbWF0cml4KTsKLSAgICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci12b2lkIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlQnJ1c2goRlhfRFdPUkQgZmlsbF9hcmdiLCB2b2lkKiogcEJydXNoKQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVNvbGlkRmlsbCkoKEFSR0IpZmlsbF9hcmdiLCAoR3BTb2xpZEZpbGwqKilwQnJ1c2gpOwotfQotdm9pZCBDR2RpcGx1c0V4dDo6R2RpcERlbGV0ZUJydXNoKHZvaWQqIHBCcnVzaCkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBEZWxldGVCcnVzaCkoKEdwU29saWRGaWxsKilwQnJ1c2gpOwotfQotdm9pZCogQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGb250RnJvbUNvbGxlY3Rpb24odm9pZCogcEZvbnRDb2xsZWN0aW9uLCBGWF9GTE9BVCBmb250X3NpemUsIGludCBmb250c3R5bGUpCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBpbnQgbnVtRmFtaWxpZXMgPSAwOwotICAgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBHZXRGb250Q29sbGVjdGlvbkZhbWlseUNvdW50KSgoR3BGb250Q29sbGVjdGlvbiopcEZvbnRDb2xsZWN0aW9uLCAmbnVtRmFtaWxpZXMpOwotICAgIGlmIChzdGF0dXMgIT0gT2spIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEdwRm9udEZhbWlseSogZmFtaWx5X2xpc3RbMV07Ci0gICAgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcEdldEZvbnRDb2xsZWN0aW9uRmFtaWx5TGlzdCkoKEdwRm9udENvbGxlY3Rpb24qKXBGb250Q29sbGVjdGlvbiwgMSwgZmFtaWx5X2xpc3QsICZudW1GYW1pbGllcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPaykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgR3BGb250KiBwRm9udCA9IE5VTEw7Ci0gICAgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcENyZWF0ZUZvbnQpKGZhbWlseV9saXN0WzBdLCBmb250X3NpemUsIGZvbnRzdHlsZSwgVW5pdFBpeGVsLCAmcEZvbnQpOwotICAgIGlmIChzdGF0dXMgIT0gT2spIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwRm9udDsKLX0KLXZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVNYXRyaXgoRlhfRkxPQVQgYSwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgZCwgRlhfRkxPQVQgZSwgRlhfRkxPQVQgZiwgdm9pZCoqIG1hdHJpeCkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBDcmVhdGVNYXRyaXgyKShhLCBiLCBjLCBkLCBlLCBmLCAoR3BNYXRyaXgqKiltYXRyaXgpOwotfQotdm9pZCBDR2RpcGx1c0V4dDo6R2RpcERlbGV0ZU1hdHJpeCh2b2lkKiBtYXRyaXgpCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBDYWxsRnVuYyhHZGlwRGVsZXRlTWF0cml4KSgoR3BNYXRyaXgqKW1hdHJpeCk7Ci19Ci12b2lkIENHZGlwbHVzRXh0OjpHZGlwRGVsZXRlRm9udEZhbWlseSh2b2lkKiBwRmFtaWx5KQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUZvbnRGYW1pbHkpKChHcEZvbnRGYW1pbHkqKXBGYW1pbHkpOwotfQotdm9pZCBDR2RpcGx1c0V4dDo6R2RpcERlbGV0ZUZvbnQodm9pZCogcEZvbnQpCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBDYWxsRnVuYyhHZGlwRGVsZXRlRm9udCkoKEdwRm9udCopcEZvbnQpOwotfQotdm9pZCBDR2RpcGx1c0V4dDo6R2RpcFNldFdvcmxkVHJhbnNmb3JtKHZvaWQqIGdyYXBoaWNzLCB2b2lkKiBwTWF0cml4KQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgQ2FsbEZ1bmMoR2RpcFNldFdvcmxkVHJhbnNmb3JtKSgoR3BHcmFwaGljcyopZ3JhcGhpY3MsIChHcE1hdHJpeCopcE1hdHJpeCk7Ci19Ci12b2lkIENHZGlwbHVzRXh0OjpHZGlwRGlzcG9zZUltYWdlKHZvaWQqIGJpdG1hcCkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBEaXNwb3NlSW1hZ2UpKChHcEJpdG1hcCopYml0bWFwKTsKLX0KLXZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBEZWxldGVHcmFwaGljcyh2b2lkKiBncmFwaGljcykKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykoKEdwR3JhcGhpY3MqKWdyYXBoaWNzKTsKLX0KLUZYX0JPT0wgQ0dkaXBsdXNFeHQ6OlN0cmV0Y2hCaXRNYXNrKEhEQyBoREMsIEJPT0wgYk1vbm9EZXZpY2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgYXJnYiwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBpbnQgZmxhZ3MpCi17Ci0gICAgQVNTRVJUKHBCaXRtYXAtPkdldEJQUCgpID09IDEpOwotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgR3BHcmFwaGljcyogcEdyYXBoaWNzID0gTlVMTDsKLSAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlRnJvbUhEQykoaERDLCAmcEdyYXBoaWNzKTsKLSAgICBDYWxsRnVuYyhHZGlwU2V0UGFnZVVuaXQpKHBHcmFwaGljcywgVW5pdFBpeGVsKTsKLSAgICBpZiAoZmxhZ3MgJiBGWERJQl9OT1NNT09USCkgewotICAgICAgICBDYWxsRnVuYyhHZGlwU2V0SW50ZXJwb2xhdGlvbk1vZGUpKHBHcmFwaGljcywgSW50ZXJwb2xhdGlvbk1vZGVOZWFyZXN0TmVpZ2hib3IpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSkocEdyYXBoaWNzLCBJbnRlcnBvbGF0aW9uTW9kZUhpZ2hRdWFsaXR5KTsKLSAgICB9Ci0gICAgT3V0cHV0SW1hZ2VNYXNrKHBHcmFwaGljcywgYk1vbm9EZXZpY2UsIHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBhcmdiLCBwQ2xpcFJlY3QpOwotICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0dkaXBsdXNFeHQ6OlN0cmV0Y2hESUJpdHMoSERDIGhEQywgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgaW50IGZsYWdzKQotewotICAgIEdwR3JhcGhpY3MqIHBHcmFwaGljczsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBDcmVhdGVGcm9tSERDKShoREMsICZwR3JhcGhpY3MpOwotICAgIENhbGxGdW5jKEdkaXBTZXRQYWdlVW5pdCkocEdyYXBoaWNzLCBVbml0UGl4ZWwpOwotICAgIGlmIChmbGFncyAmIEZYRElCX05PU01PT1RIKSB7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSkocEdyYXBoaWNzLCBJbnRlcnBvbGF0aW9uTW9kZU5lYXJlc3ROZWlnaGJvcik7Ci0gICAgfSBlbHNlIGlmIChwQml0bWFwLT5HZXRXaWR0aCgpID4gYWJzKGRlc3Rfd2lkdGgpIC8gMiB8fCBwQml0bWFwLT5HZXRIZWlnaHQoKSA+IGFicyhkZXN0X2hlaWdodCkgLyAyKSB7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSkocEdyYXBoaWNzLCBJbnRlcnBvbGF0aW9uTW9kZUhpZ2hRdWFsaXR5KTsKLSAgICB9IGVsc2UgewotICAgICAgICBDYWxsRnVuYyhHZGlwU2V0SW50ZXJwb2xhdGlvbk1vZGUpKHBHcmFwaGljcywgSW50ZXJwb2xhdGlvbk1vZGVCaWxpbmVhcik7Ci0gICAgfQotICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwotICAgIE91dHB1dEltYWdlKHBHcmFwaGljcywgcEJpdG1hcCwgJnNyY19yZWN0LCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7Ci0gICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKShwR3JhcGhpY3MpOwotICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXN0YXRpYyBHcFBlbiogX0dkaXBDcmVhdGVQZW4oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRFdPUkQgYXJnYiwgRlhfQk9PTCBiVGV4dE1vZGUgPSBGQUxTRSkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIEZYX0ZMT0FUIHdpZHRoID0gcEdyYXBoU3RhdGUgPyBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGggOiAxLjBmOwotICAgIGlmICghYlRleHRNb2RlKSB7Ci0gICAgICAgIEZYX0ZMT0FUIHVuaXQgPSBwTWF0cml4ID09IE5VTEwgPyAxLjBmIDogRlhTWVNfRGl2KDEuMGYsIChwTWF0cml4LT5HZXRYVW5pdCgpICsgcE1hdHJpeC0+R2V0WVVuaXQoKSkgLyAyKTsKLSAgICAgICAgaWYgKHdpZHRoIDwgdW5pdCkgewotICAgICAgICAgICAgd2lkdGggPSB1bml0OwotICAgICAgICB9Ci0gICAgfQotICAgIEdwUGVuKiBwUGVuID0gTlVMTDsKLSAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlUGVuMSkoKEFSR0IpYXJnYiwgd2lkdGgsIFVuaXRXb3JsZCwgJnBQZW4pOwotICAgIExpbmVDYXAgbGluZUNhcDsKLSAgICBEYXNoQ2FwIGRhc2hDYXAgPSBEYXNoQ2FwRmxhdDsKLSAgICBGWF9CT09MIGJEYXNoRXh0ZW5kID0gRkFMU0U7Ci0gICAgc3dpdGNoKHBHcmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0OgotICAgICAgICAgICAgbGluZUNhcCA9IExpbmVDYXBGbGF0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwUm91bmQ6Ci0gICAgICAgICAgICBsaW5lQ2FwID0gTGluZUNhcFJvdW5kOwotICAgICAgICAgICAgZGFzaENhcCA9IERhc2hDYXBSb3VuZDsKLSAgICAgICAgICAgIGJEYXNoRXh0ZW5kID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFNxdWFyZToKLSAgICAgICAgICAgIGxpbmVDYXAgPSBMaW5lQ2FwU3F1YXJlOwotICAgICAgICAgICAgYkRhc2hFeHRlbmQgPSBUUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIENhbGxGdW5jKEdkaXBTZXRQZW5MaW5lQ2FwMTk3ODE5KShwUGVuLCBsaW5lQ2FwLCBsaW5lQ2FwLCBkYXNoQ2FwKTsKLSAgICBMaW5lSm9pbiBsaW5lSm9pbjsKLSAgICBzd2l0Y2gocEdyYXBoU3RhdGUtPm1fTGluZUpvaW4pIHsKLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luTWl0ZXI6Ci0gICAgICAgICAgICBsaW5lSm9pbiA9IExpbmVKb2luTWl0ZXJDbGlwcGVkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pblJvdW5kOgotICAgICAgICAgICAgbGluZUpvaW4gPSBMaW5lSm9pblJvdW5kOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbkJldmVsOgotICAgICAgICAgICAgbGluZUpvaW4gPSBMaW5lSm9pbkJldmVsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIENhbGxGdW5jKEdkaXBTZXRQZW5MaW5lSm9pbikocFBlbiwgbGluZUpvaW4pOwotICAgIGlmKHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCkgewotICAgICAgICBGWF9GTE9BVCogcERhc2hBcnJheSA9IEZYX0FsbG9jKEZYX0ZMT0FULCBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgKyBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgJSAyKTsKLSAgICAgICAgaW50IG5Db3VudCA9IDA7Ci0gICAgICAgIEZYX0ZMT0FUIG9uX2xlZnRvdmVyID0gMCwgb2ZmX2xlZnRvdmVyID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQ7IGkgKz0gMikgewotICAgICAgICAgICAgRlhfRkxPQVQgb25fcGhhc2UgPSBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaV07Ci0gICAgICAgICAgICBGWF9GTE9BVCBvZmZfcGhhc2U7Ci0gICAgICAgICAgICBpZiAoaSA9PSBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgLSAxKSB7Ci0gICAgICAgICAgICAgICAgb2ZmX3BoYXNlID0gb25fcGhhc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9mZl9waGFzZSA9IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpICsgMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbl9waGFzZSAvPSB3aWR0aDsKLSAgICAgICAgICAgIG9mZl9waGFzZSAvPSB3aWR0aDsKLSAgICAgICAgICAgIGlmIChvbl9waGFzZSArIG9mZl9waGFzZSA8PSAwLjAwMDAyZikgewotICAgICAgICAgICAgICAgIG9uX3BoYXNlID0gMS4wZiAvIDEwOwotICAgICAgICAgICAgICAgIG9mZl9waGFzZSA9IDEuMGYgLyAxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiRGFzaEV4dGVuZCkgewotICAgICAgICAgICAgICAgIGlmIChvZmZfcGhhc2UgPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9mZl9waGFzZSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb2ZmX3BoYXNlIC09IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9uX3BoYXNlICs9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob25fcGhhc2UgPT0gMCB8fCBvZmZfcGhhc2UgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChuQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBvbl9sZWZ0b3ZlciArPSBvbl9waGFzZTsKLSAgICAgICAgICAgICAgICAgICAgb2ZmX2xlZnRvdmVyICs9IG9mZl9waGFzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRGFzaEFycmF5W25Db3VudCAtIDJdICs9IG9uX3BoYXNlOwotICAgICAgICAgICAgICAgICAgICBwRGFzaEFycmF5W25Db3VudCAtIDFdICs9IG9mZl9waGFzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBEYXNoQXJyYXlbbkNvdW50KytdID0gb25fcGhhc2UgKyBvbl9sZWZ0b3ZlcjsKLSAgICAgICAgICAgICAgICBvbl9sZWZ0b3ZlciA9IDA7Ci0gICAgICAgICAgICAgICAgcERhc2hBcnJheVtuQ291bnQrK10gPSBvZmZfcGhhc2UgKyBvZmZfbGVmdG92ZXI7Ci0gICAgICAgICAgICAgICAgb2ZmX2xlZnRvdmVyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDYWxsRnVuYyhHZGlwU2V0UGVuRGFzaEFycmF5KShwUGVuLCBwRGFzaEFycmF5LCBuQ291bnQpOwotICAgICAgICBGWF9GTE9BVCBwaGFzZSA9IHBHcmFwaFN0YXRlLT5tX0Rhc2hQaGFzZTsKLSAgICAgICAgaWYgKGJEYXNoRXh0ZW5kKSB7Ci0gICAgICAgICAgICBpZiAocGhhc2UgPCAwLjVmKSB7Ci0gICAgICAgICAgICAgICAgcGhhc2UgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwaGFzZSAtPSAwLjVmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENhbGxGdW5jKEdkaXBTZXRQZW5EYXNoT2Zmc2V0KShwUGVuLCBwaGFzZSk7Ci0gICAgICAgIEZYX0ZyZWUocERhc2hBcnJheSk7Ci0gICAgICAgIHBEYXNoQXJyYXkgPSBOVUxMOwotICAgIH0KLSAgICBDYWxsRnVuYyhHZGlwU2V0UGVuTWl0ZXJMaW1pdCkocFBlbiwgcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7Ci0gICAgcmV0dXJuIHBQZW47Ci19Ci1zdGF0aWMgRlhfQk9PTCBJc1NtYWxsVHJpYW5nbGUoUG9pbnRGKiBwb2ludHMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGludCYgdjEsIGludCYgdjIpCi17Ci0gICAgaW50IHBhaXJzW10gPSB7MSwgMiwgMCwgMiwgMCwgMX07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpICsrKSB7Ci0gICAgICAgIGludCBwYWlyMSA9IHBhaXJzW2kgKiAyXTsKLSAgICAgICAgaW50IHBhaXIyID0gcGFpcnNbaSAqIDIgKyAxXTsKLSAgICAgICAgRlhfRkxPQVQgeDEgPSBwb2ludHNbcGFpcjFdLlgsIHgyID0gcG9pbnRzW3BhaXIyXS5YOwotICAgICAgICBGWF9GTE9BVCB5MSA9IHBvaW50c1twYWlyMV0uWSwgeTIgPSBwb2ludHNbcGFpcjJdLlk7Ci0gICAgICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0oeDEsIHkxKTsKLSAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybSh4MiwgeTIpOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIGR4ID0geDEgLSB4MjsKLSAgICAgICAgRlhfRkxPQVQgZHkgPSB5MSAtIHkyOwotICAgICAgICBGWF9GTE9BVCBkaXN0YW5jZV9zcXVhcmUgPSBGWFNZU19NdWwoZHgsIGR4KSArIEZYU1lTX011bChkeSwgZHkpOwotICAgICAgICBpZiAoZGlzdGFuY2Vfc3F1YXJlIDwgKDEuMGYgKiAyICsgMS4wZiAvIDQpKSB7Ci0gICAgICAgICAgICB2MSA9IGk7Ci0gICAgICAgICAgICB2MiA9IHBhaXIxOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6RHJhd1BhdGgoSERDIGhEQywgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIGludCBuUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7Ci0gICAgaWYgKG5Qb2ludHMgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsKLSAgICBHcEdyYXBoaWNzKiBwR3JhcGhpY3MgPSBOVUxMOwotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUZyb21IREMpKGhEQywgJnBHcmFwaGljcyk7Ci0gICAgQ2FsbEZ1bmMoR2RpcFNldFBhZ2VVbml0KShwR3JhcGhpY3MsIFVuaXRQaXhlbCk7Ci0gICAgQ2FsbEZ1bmMoR2RpcFNldFBpeGVsT2Zmc2V0TW9kZSkocEdyYXBoaWNzLCBQaXhlbE9mZnNldE1vZGVIYWxmKTsKLSAgICBHcE1hdHJpeCogcE1hdHJpeCA9IE5VTEw7Ci0gICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVNYXRyaXgyKShwT2JqZWN0MkRldmljZS0+YSwgcE9iamVjdDJEZXZpY2UtPmIsIHBPYmplY3QyRGV2aWNlLT5jLCBwT2JqZWN0MkRldmljZS0+ZCwgcE9iamVjdDJEZXZpY2UtPmUsIHBPYmplY3QyRGV2aWNlLT5mLCAmcE1hdHJpeCk7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBTZXRXb3JsZFRyYW5zZm9ybSkocEdyYXBoaWNzLCBwTWF0cml4KTsKLSAgICB9Ci0gICAgUG9pbnRGICpwb2ludHMgPSBGWF9BbGxvYyhQb2ludEYsIG5Qb2ludHMpOwotICAgIEJZVEUgKiB0eXBlcyAgPSBGWF9BbGxvYyhCWVRFLCBuUG9pbnRzKTsKLSAgICBpbnQgblN1YlBhdGhlcyA9IDA7Ci0gICAgRlhfQk9PTCBiU3ViQ2xvc2UgPSBGQUxTRTsKLSAgICBpbnQgcG9zX3N1YmNsb3NlID0gMDsKLSAgICBGWF9CT09MIGJTbW9vdGggPSBGQUxTRTsKLSAgICBpbnQgc3RhcnRwb2ludCA9IDA7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IG5Qb2ludHM7IGkrKykgewotICAgICAgICBwb2ludHNbaV0uWCA9IHBQb2ludHNbaV0ubV9Qb2ludFg7Ci0gICAgICAgIHBvaW50c1tpXS5ZID0gcFBvaW50c1tpXS5tX1BvaW50WTsKLSAgICAgICAgRlhfRkxPQVQgeCwgeTsKLSAgICAgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHBQb2ludHNbaV0ubV9Qb2ludFgsIHBQb2ludHNbaV0ubV9Qb2ludFksIHgsIHkpOworICB9CisgIEdwUGVuKiBwUGVuID0gTlVMTDsKKyAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVBlbjEpKChBUkdCKWFyZ2IsIHdpZHRoLCBVbml0V29ybGQsICZwUGVuKTsKKyAgTGluZUNhcCBsaW5lQ2FwOworICBEYXNoQ2FwIGRhc2hDYXAgPSBEYXNoQ2FwRmxhdDsKKyAgRlhfQk9PTCBiRGFzaEV4dGVuZCA9IEZBTFNFOworICBzd2l0Y2ggKHBHcmFwaFN0YXRlLT5tX0xpbmVDYXApIHsKKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcEJ1dHQ6CisgICAgICBsaW5lQ2FwID0gTGluZUNhcEZsYXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFJvdW5kOgorICAgICAgbGluZUNhcCA9IExpbmVDYXBSb3VuZDsKKyAgICAgIGRhc2hDYXAgPSBEYXNoQ2FwUm91bmQ7CisgICAgICBiRGFzaEV4dGVuZCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFNxdWFyZToKKyAgICAgIGxpbmVDYXAgPSBMaW5lQ2FwU3F1YXJlOworICAgICAgYkRhc2hFeHRlbmQgPSBUUlVFOworICAgICAgYnJlYWs7CisgIH0KKyAgQ2FsbEZ1bmMoR2RpcFNldFBlbkxpbmVDYXAxOTc4MTkpKHBQZW4sIGxpbmVDYXAsIGxpbmVDYXAsIGRhc2hDYXApOworICBMaW5lSm9pbiBsaW5lSm9pbjsKKyAgc3dpdGNoIChwR3JhcGhTdGF0ZS0+bV9MaW5lSm9pbikgeworICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbk1pdGVyOgorICAgICAgbGluZUpvaW4gPSBMaW5lSm9pbk1pdGVyQ2xpcHBlZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pblJvdW5kOgorICAgICAgbGluZUpvaW4gPSBMaW5lSm9pblJvdW5kOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luQmV2ZWw6CisgICAgICBsaW5lSm9pbiA9IExpbmVKb2luQmV2ZWw7CisgICAgICBicmVhazsKKyAgfQorICBDYWxsRnVuYyhHZGlwU2V0UGVuTGluZUpvaW4pKHBQZW4sIGxpbmVKb2luKTsKKyAgaWYgKHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCkgeworICAgIEZYX0ZMT0FUKiBwRGFzaEFycmF5ID0gRlhfQWxsb2MoCisgICAgICAgIEZYX0ZMT0FULCBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgKyBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgJSAyKTsKKyAgICBpbnQgbkNvdW50ID0gMDsKKyAgICBGWF9GTE9BVCBvbl9sZWZ0b3ZlciA9IDAsIG9mZl9sZWZ0b3ZlciA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQ7IGkgKz0gMikgeworICAgICAgRlhfRkxPQVQgb25fcGhhc2UgPSBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaV07CisgICAgICBGWF9GTE9BVCBvZmZfcGhhc2U7CisgICAgICBpZiAoaSA9PSBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgLSAxKSB7CisgICAgICAgIG9mZl9waGFzZSA9IG9uX3BoYXNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb2ZmX3BoYXNlID0gcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2kgKyAxXTsKKyAgICAgIH0KKyAgICAgIG9uX3BoYXNlIC89IHdpZHRoOworICAgICAgb2ZmX3BoYXNlIC89IHdpZHRoOworICAgICAgaWYgKG9uX3BoYXNlICsgb2ZmX3BoYXNlIDw9IDAuMDAwMDJmKSB7CisgICAgICAgIG9uX3BoYXNlID0gMS4wZiAvIDEwOworICAgICAgICBvZmZfcGhhc2UgPSAxLjBmIC8gMTA7CisgICAgICB9CisgICAgICBpZiAoYkRhc2hFeHRlbmQpIHsKKyAgICAgICAgaWYgKG9mZl9waGFzZSA8IDEpIHsKKyAgICAgICAgICBvZmZfcGhhc2UgPSAwOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeCA9IHBQb2ludHNbaV0ubV9Qb2ludFg7Ci0gICAgICAgICAgICB5ID0gcFBvaW50c1tpXS5tX1BvaW50WTsKKyAgICAgICAgICBvZmZfcGhhc2UgLT0gMTsKICAgICAgICAgfQotICAgICAgICBpZiAoeCA+IDUwMDAwICogMS4wZikgewotICAgICAgICAgICAgcG9pbnRzW2ldLlggPSA1MDAwMCAqIDEuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHggPCAtNTAwMDAgKiAxLjBmKSB7Ci0gICAgICAgICAgICBwb2ludHNbaV0uWCA9IC01MDAwMCAqIDEuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHkgPiA1MDAwMCAqIDEuMGYpIHsKLSAgICAgICAgICAgIHBvaW50c1tpXS5ZID0gNTAwMDAgKiAxLjBmOwotICAgICAgICB9Ci0gICAgICAgIGlmICh5IDwgLTUwMDAwICogMS4wZikgewotICAgICAgICAgICAgcG9pbnRzW2ldLlkgPSAtNTAwMDAgKiAxLjBmOwotICAgICAgICB9Ci0gICAgICAgIGludCBwb2ludF90eXBlID0gcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEU7Ci0gICAgICAgIGlmKHBvaW50X3R5cGUgPT0gRlhQVF9NT1ZFVE8pIHsKLSAgICAgICAgICAgIHR5cGVzW2ldID0gUGF0aFBvaW50VHlwZVN0YXJ0OwotICAgICAgICAgICAgblN1YlBhdGhlcyArKzsKLSAgICAgICAgICAgIGJTdWJDbG9zZSA9IEZBTFNFOwotICAgICAgICAgICAgc3RhcnRwb2ludCA9IGk7Ci0gICAgICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0xJTkVUTykgewotICAgICAgICAgICAgdHlwZXNbaV0gPSBQYXRoUG9pbnRUeXBlTGluZTsKLSAgICAgICAgICAgIGlmIChwUG9pbnRzW2kgLSAxXS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8gJiYgKGkgPT0gblBvaW50cyAtIDEgfHwgcFBvaW50c1tpICsgMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSAmJgotICAgICAgICAgICAgICAgICAgICBwb2ludHNbaV0uWSA9PSBwb2ludHNbaSAtIDFdLlkgJiYgcG9pbnRzW2ldLlggPT0gcG9pbnRzW2kgLSAxXS5YKSB7Ci0gICAgICAgICAgICAgICAgcG9pbnRzW2ldLlggKz0gMC4wMWY7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWJTbW9vdGggJiYgcG9pbnRzW2ldLlggIT0gcG9pbnRzW2kgLSAxXS5YICYmIHBvaW50c1tpXS5ZICE9IHBvaW50c1tpIC0gMV0uWSkgewotICAgICAgICAgICAgICAgIGJTbW9vdGggPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9CRVpJRVJUTykJewotICAgICAgICAgICAgdHlwZXNbaV0gPSBQYXRoUG9pbnRUeXBlQmV6aWVyOwotICAgICAgICAgICAgYlNtb290aCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9DTE9TRUZJR1VSRSkgewotICAgICAgICAgICAgaWYgKGJTdWJDbG9zZSkgewotICAgICAgICAgICAgICAgIHR5cGVzW3Bvc19zdWJjbG9zZV0gJj0gflBhdGhQb2ludFR5cGVDbG9zZVN1YnBhdGg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJTdWJDbG9zZSA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3Nfc3ViY2xvc2UgPSBpOwotICAgICAgICAgICAgdHlwZXNbaV0gfD0gUGF0aFBvaW50VHlwZUNsb3NlU3VicGF0aDsKLSAgICAgICAgICAgIGlmICghYlNtb290aCAmJiBwb2ludHNbaV0uWCAhPSBwb2ludHNbc3RhcnRwb2ludF0uWCAmJiBwb2ludHNbaV0uWSAhPSBwb2ludHNbc3RhcnRwb2ludF0uWSkgewotICAgICAgICAgICAgICAgIGJTbW9vdGggPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChmaWxsX21vZGUgJiBGWEZJTExfTk9QQVRIU01PT1RIKSB7Ci0gICAgICAgIGJTbW9vdGggPSBGQUxTRTsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcFNldFNtb290aGluZ01vZGUpKHBHcmFwaGljcywgU21vb3RoaW5nTW9kZU5vbmUpOwotICAgIH0gZWxzZSBpZiAoIShmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSKSkgewotICAgICAgICBpZiAoIWJTbW9vdGggJiYgKGZpbGxfbW9kZSAmIDMpKSB7Ci0gICAgICAgICAgICBiU21vb3RoID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYlNtb290aCB8fCAocEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoID4gMikpIHsKLSAgICAgICAgICAgIENhbGxGdW5jKEdkaXBTZXRTbW9vdGhpbmdNb2RlKShwR3JhcGhpY3MsIFNtb290aGluZ01vZGVBbnRpQWxpYXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBuZXdfZmlsbF9tb2RlID0gZmlsbF9tb2RlICYgMzsKLSAgICBpZiAoblBvaW50cyA9PSA0ICYmIHBHcmFwaFN0YXRlID09IE5VTEwpIHsKLSAgICAgICAgaW50IHYxLCB2MjsKLSAgICAgICAgaWYgKElzU21hbGxUcmlhbmdsZShwb2ludHMsIHBPYmplY3QyRGV2aWNlLCB2MSwgdjIpKSB7Ci0gICAgICAgICAgICBHcFBlbiogcFBlbiA9IE5VTEw7Ci0gICAgICAgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlUGVuMSkoZmlsbF9hcmdiLCAxLjBmLCBVbml0UGl4ZWwsICZwUGVuKTsKLSAgICAgICAgICAgIENhbGxGdW5jKEdkaXBEcmF3TGluZUkpKHBHcmFwaGljcywgcFBlbiwgRlhTWVNfcm91bmQocG9pbnRzW3YxXS5YKSwgRlhTWVNfcm91bmQocG9pbnRzW3YxXS5ZKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHBvaW50c1t2Ml0uWCksIEZYU1lTX3JvdW5kKHBvaW50c1t2Ml0uWSkpOwotICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZVBlbikocFBlbik7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBHcFBhdGgqIHBHcFBhdGggPSBOVUxMOwotICAgIENhbGxGdW5jKEdkaXBDcmVhdGVQYXRoMikocG9pbnRzLCB0eXBlcywgblBvaW50cywgR2RpRmlsbFR5cGUyR2RpcChuZXdfZmlsbF9tb2RlKSwgJnBHcFBhdGgpOwotICAgIGlmICghcEdwUGF0aCkgewotICAgICAgICBpZiAocE1hdHJpeCkgewotICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZU1hdHJpeCkocE1hdHJpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRnJlZShwb2ludHMpOwotICAgICAgICBGWF9GcmVlKHR5cGVzKTsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKShwR3JhcGhpY3MpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChuZXdfZmlsbF9tb2RlKSB7Ci0gICAgICAgIEdwQnJ1c2gqIHBCcnVzaCA9IF9HZGlwQ3JlYXRlQnJ1c2goZmlsbF9hcmdiKTsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcFNldFBhdGhGaWxsTW9kZSkocEdwUGF0aCwgR2RpRmlsbFR5cGUyR2RpcChuZXdfZmlsbF9tb2RlKSk7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBGaWxsUGF0aCkocEdyYXBoaWNzLCBwQnJ1c2gsIHBHcFBhdGgpOwotICAgICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlQnJ1c2gpKHBCcnVzaCk7Ci0gICAgfQotICAgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYXJnYikgewotICAgICAgICBHcFBlbiogcFBlbiA9IF9HZGlwQ3JlYXRlUGVuKHBHcmFwaFN0YXRlLCBwT2JqZWN0MkRldmljZSwgc3Ryb2tlX2FyZ2IsIGZpbGxfbW9kZSAmIEZYX1NUUk9LRV9URVhUX01PREUpOwotICAgICAgICBpZiAoblN1YlBhdGhlcyA9PSAxKSB7Ci0gICAgICAgICAgICBDYWxsRnVuYyhHZGlwRHJhd1BhdGgpKHBHcmFwaGljcywgcFBlbiwgcEdwUGF0aCk7CisgICAgICAgIG9uX3BoYXNlICs9IDE7CisgICAgICB9CisgICAgICBpZiAob25fcGhhc2UgPT0gMCB8fCBvZmZfcGhhc2UgPT0gMCkgeworICAgICAgICBpZiAobkNvdW50ID09IDApIHsKKyAgICAgICAgICBvbl9sZWZ0b3ZlciArPSBvbl9waGFzZTsKKyAgICAgICAgICBvZmZfbGVmdG92ZXIgKz0gb2ZmX3BoYXNlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGlTdGFydCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Qb2ludHM7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBuUG9pbnRzIC0gMSB8fCB0eXBlc1tpICsgMV0gPT0gUGF0aFBvaW50VHlwZVN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEdwUGF0aCogcFN1YlBhdGg7Ci0gICAgICAgICAgICAgICAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVQYXRoMikocG9pbnRzICsgaVN0YXJ0LCB0eXBlcyArIGlTdGFydCwgaSAtIGlTdGFydCArIDEsIEdkaUZpbGxUeXBlMkdkaXAobmV3X2ZpbGxfbW9kZSksICZwU3ViUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlTdGFydCA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICBDYWxsRnVuYyhHZGlwRHJhd1BhdGgpKHBHcmFwaGljcywgcFBlbiwgcFN1YlBhdGgpOwotICAgICAgICAgICAgICAgICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUGF0aCkocFN1YlBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICBwRGFzaEFycmF5W25Db3VudCAtIDJdICs9IG9uX3BoYXNlOworICAgICAgICAgIHBEYXNoQXJyYXlbbkNvdW50IC0gMV0gKz0gb2ZmX3BoYXNlOwogICAgICAgICB9Ci0gICAgICAgIENhbGxGdW5jKEdkaXBEZWxldGVQZW4pKHBQZW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcERhc2hBcnJheVtuQ291bnQrK10gPSBvbl9waGFzZSArIG9uX2xlZnRvdmVyOworICAgICAgICBvbl9sZWZ0b3ZlciA9IDA7CisgICAgICAgIHBEYXNoQXJyYXlbbkNvdW50KytdID0gb2ZmX3BoYXNlICsgb2ZmX2xlZnRvdmVyOworICAgICAgICBvZmZfbGVmdG92ZXIgPSAwOworICAgICAgfQogICAgIH0KKyAgICBDYWxsRnVuYyhHZGlwU2V0UGVuRGFzaEFycmF5KShwUGVuLCBwRGFzaEFycmF5LCBuQ291bnQpOworICAgIEZYX0ZMT0FUIHBoYXNlID0gcEdyYXBoU3RhdGUtPm1fRGFzaFBoYXNlOworICAgIGlmIChiRGFzaEV4dGVuZCkgeworICAgICAgaWYgKHBoYXNlIDwgMC41ZikgeworICAgICAgICBwaGFzZSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBwaGFzZSAtPSAwLjVmOworICAgICAgfQorICAgIH0KKyAgICBDYWxsRnVuYyhHZGlwU2V0UGVuRGFzaE9mZnNldCkocFBlbiwgcGhhc2UpOworICAgIEZYX0ZyZWUocERhc2hBcnJheSk7CisgICAgcERhc2hBcnJheSA9IE5VTEw7CisgIH0KKyAgQ2FsbEZ1bmMoR2RpcFNldFBlbk1pdGVyTGltaXQpKHBQZW4sIHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQpOworICByZXR1cm4gcFBlbjsKK30KK3N0YXRpYyBGWF9CT09MIElzU21hbGxUcmlhbmdsZShQb2ludEYqIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB2MikgeworICBpbnQgcGFpcnNbXSA9IHsxLCAyLCAwLCAyLCAwLCAxfTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBpbnQgcGFpcjEgPSBwYWlyc1tpICogMl07CisgICAgaW50IHBhaXIyID0gcGFpcnNbaSAqIDIgKyAxXTsKKyAgICBGWF9GTE9BVCB4MSA9IHBvaW50c1twYWlyMV0uWCwgeDIgPSBwb2ludHNbcGFpcjJdLlg7CisgICAgRlhfRkxPQVQgeTEgPSBwb2ludHNbcGFpcjFdLlksIHkyID0gcG9pbnRzW3BhaXIyXS5ZOwogICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBEZWxldGVNYXRyaXgpKHBNYXRyaXgpOworICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtKHgxLCB5MSk7CisgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0oeDIsIHkyKTsKKyAgICB9CisgICAgRlhfRkxPQVQgZHggPSB4MSAtIHgyOworICAgIEZYX0ZMT0FUIGR5ID0geTEgLSB5MjsKKyAgICBGWF9GTE9BVCBkaXN0YW5jZV9zcXVhcmUgPSBGWFNZU19NdWwoZHgsIGR4KSArIEZYU1lTX011bChkeSwgZHkpOworICAgIGlmIChkaXN0YW5jZV9zcXVhcmUgPCAoMS4wZiAqIDIgKyAxLjBmIC8gNCkpIHsKKyAgICAgIHYxID0gaTsKKyAgICAgIHYyID0gcGFpcjE7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDR2RpcGx1c0V4dDo6RHJhd1BhdGgoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3Ryb2tlX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlKSB7CisgIGludCBuUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7CisgIGlmIChuUG9pbnRzID09IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50cygpOworICBHcEdyYXBoaWNzKiBwR3JhcGhpY3MgPSBOVUxMOworICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CisgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKKyAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUZyb21IREMpKGhEQywgJnBHcmFwaGljcyk7CisgIENhbGxGdW5jKEdkaXBTZXRQYWdlVW5pdCkocEdyYXBoaWNzLCBVbml0UGl4ZWwpOworICBDYWxsRnVuYyhHZGlwU2V0UGl4ZWxPZmZzZXRNb2RlKShwR3JhcGhpY3MsIFBpeGVsT2Zmc2V0TW9kZUhhbGYpOworICBHcE1hdHJpeCogcE1hdHJpeCA9IE5VTEw7CisgIGlmIChwT2JqZWN0MkRldmljZSkgeworICAgIENhbGxGdW5jKEdkaXBDcmVhdGVNYXRyaXgyKShwT2JqZWN0MkRldmljZS0+YSwgcE9iamVjdDJEZXZpY2UtPmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3QyRGV2aWNlLT5jLCBwT2JqZWN0MkRldmljZS0+ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPmUsIHBPYmplY3QyRGV2aWNlLT5mLCAmcE1hdHJpeCk7CisgICAgQ2FsbEZ1bmMoR2RpcFNldFdvcmxkVHJhbnNmb3JtKShwR3JhcGhpY3MsIHBNYXRyaXgpOworICB9CisgIFBvaW50RiogcG9pbnRzID0gRlhfQWxsb2MoUG9pbnRGLCBuUG9pbnRzKTsKKyAgQllURSogdHlwZXMgPSBGWF9BbGxvYyhCWVRFLCBuUG9pbnRzKTsKKyAgaW50IG5TdWJQYXRoZXMgPSAwOworICBGWF9CT09MIGJTdWJDbG9zZSA9IEZBTFNFOworICBpbnQgcG9zX3N1YmNsb3NlID0gMDsKKyAgRlhfQk9PTCBiU21vb3RoID0gRkFMU0U7CisgIGludCBzdGFydHBvaW50ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHsKKyAgICBwb2ludHNbaV0uWCA9IHBQb2ludHNbaV0ubV9Qb2ludFg7CisgICAgcG9pbnRzW2ldLlkgPSBwUG9pbnRzW2ldLm1fUG9pbnRZOworICAgIEZYX0ZMT0FUIHgsIHk7CisgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHBQb2ludHNbaV0ubV9Qb2ludFgsIHBQb2ludHNbaV0ubV9Qb2ludFksIHgsIHkpOworICAgIH0gZWxzZSB7CisgICAgICB4ID0gcFBvaW50c1tpXS5tX1BvaW50WDsKKyAgICAgIHkgPSBwUG9pbnRzW2ldLm1fUG9pbnRZOworICAgIH0KKyAgICBpZiAoeCA+IDUwMDAwICogMS4wZikgeworICAgICAgcG9pbnRzW2ldLlggPSA1MDAwMCAqIDEuMGY7CisgICAgfQorICAgIGlmICh4IDwgLTUwMDAwICogMS4wZikgeworICAgICAgcG9pbnRzW2ldLlggPSAtNTAwMDAgKiAxLjBmOworICAgIH0KKyAgICBpZiAoeSA+IDUwMDAwICogMS4wZikgeworICAgICAgcG9pbnRzW2ldLlkgPSA1MDAwMCAqIDEuMGY7CisgICAgfQorICAgIGlmICh5IDwgLTUwMDAwICogMS4wZikgeworICAgICAgcG9pbnRzW2ldLlkgPSAtNTAwMDAgKiAxLjBmOworICAgIH0KKyAgICBpbnQgcG9pbnRfdHlwZSA9IHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFOworICAgIGlmIChwb2ludF90eXBlID09IEZYUFRfTU9WRVRPKSB7CisgICAgICB0eXBlc1tpXSA9IFBhdGhQb2ludFR5cGVTdGFydDsKKyAgICAgIG5TdWJQYXRoZXMrKzsKKyAgICAgIGJTdWJDbG9zZSA9IEZBTFNFOworICAgICAgc3RhcnRwb2ludCA9IGk7CisgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfTElORVRPKSB7CisgICAgICB0eXBlc1tpXSA9IFBhdGhQb2ludFR5cGVMaW5lOworICAgICAgaWYgKHBQb2ludHNbaSAtIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTyAmJgorICAgICAgICAgIChpID09IG5Qb2ludHMgLSAxIHx8IHBQb2ludHNbaSArIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTykgJiYKKyAgICAgICAgICBwb2ludHNbaV0uWSA9PSBwb2ludHNbaSAtIDFdLlkgJiYgcG9pbnRzW2ldLlggPT0gcG9pbnRzW2kgLSAxXS5YKSB7CisgICAgICAgIHBvaW50c1tpXS5YICs9IDAuMDFmOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICghYlNtb290aCAmJiBwb2ludHNbaV0uWCAhPSBwb2ludHNbaSAtIDFdLlggJiYKKyAgICAgICAgICBwb2ludHNbaV0uWSAhPSBwb2ludHNbaSAtIDFdLlkpIHsKKyAgICAgICAgYlNtb290aCA9IFRSVUU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfQkVaSUVSVE8pIHsKKyAgICAgIHR5cGVzW2ldID0gUGF0aFBvaW50VHlwZUJlemllcjsKKyAgICAgIGJTbW9vdGggPSBUUlVFOworICAgIH0KKyAgICBpZiAocFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSB7CisgICAgICBpZiAoYlN1YkNsb3NlKSB7CisgICAgICAgIHR5cGVzW3Bvc19zdWJjbG9zZV0gJj0gflBhdGhQb2ludFR5cGVDbG9zZVN1YnBhdGg7CisgICAgICB9IGVsc2UgeworICAgICAgICBiU3ViQ2xvc2UgPSBUUlVFOworICAgICAgfQorICAgICAgcG9zX3N1YmNsb3NlID0gaTsKKyAgICAgIHR5cGVzW2ldIHw9IFBhdGhQb2ludFR5cGVDbG9zZVN1YnBhdGg7CisgICAgICBpZiAoIWJTbW9vdGggJiYgcG9pbnRzW2ldLlggIT0gcG9pbnRzW3N0YXJ0cG9pbnRdLlggJiYKKyAgICAgICAgICBwb2ludHNbaV0uWSAhPSBwb2ludHNbc3RhcnRwb2ludF0uWSkgeworICAgICAgICBiU21vb3RoID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGZpbGxfbW9kZSAmIEZYRklMTF9OT1BBVEhTTU9PVEgpIHsKKyAgICBiU21vb3RoID0gRkFMU0U7CisgICAgQ2FsbEZ1bmMoR2RpcFNldFNtb290aGluZ01vZGUpKHBHcmFwaGljcywgU21vb3RoaW5nTW9kZU5vbmUpOworICB9IGVsc2UgaWYgKCEoZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUikpIHsKKyAgICBpZiAoIWJTbW9vdGggJiYgKGZpbGxfbW9kZSAmIDMpKSB7CisgICAgICBiU21vb3RoID0gVFJVRTsKKyAgICB9CisgICAgaWYgKGJTbW9vdGggfHwgKHBHcmFwaFN0YXRlICYmIHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCA+IDIpKSB7CisgICAgICBDYWxsRnVuYyhHZGlwU2V0U21vb3RoaW5nTW9kZSkocEdyYXBoaWNzLCBTbW9vdGhpbmdNb2RlQW50aUFsaWFzKTsKKyAgICB9CisgIH0KKyAgaW50IG5ld19maWxsX21vZGUgPSBmaWxsX21vZGUgJiAzOworICBpZiAoblBvaW50cyA9PSA0ICYmIHBHcmFwaFN0YXRlID09IE5VTEwpIHsKKyAgICBpbnQgdjEsIHYyOworICAgIGlmIChJc1NtYWxsVHJpYW5nbGUocG9pbnRzLCBwT2JqZWN0MkRldmljZSwgdjEsIHYyKSkgeworICAgICAgR3BQZW4qIHBQZW4gPSBOVUxMOworICAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVBlbjEpKGZpbGxfYXJnYiwgMS4wZiwgVW5pdFBpeGVsLCAmcFBlbik7CisgICAgICBDYWxsRnVuYyhHZGlwRHJhd0xpbmVJKSgKKyAgICAgICAgICBwR3JhcGhpY3MsIHBQZW4sIEZYU1lTX3JvdW5kKHBvaW50c1t2MV0uWCksIEZYU1lTX3JvdW5kKHBvaW50c1t2MV0uWSksCisgICAgICAgICAgRlhTWVNfcm91bmQocG9pbnRzW3YyXS5YKSwgRlhTWVNfcm91bmQocG9pbnRzW3YyXS5ZKSk7CisgICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUGVuKShwUGVuKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBHcFBhdGgqIHBHcFBhdGggPSBOVUxMOworICBDYWxsRnVuYyhHZGlwQ3JlYXRlUGF0aDIpKHBvaW50cywgdHlwZXMsIG5Qb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2RpRmlsbFR5cGUyR2RpcChuZXdfZmlsbF9tb2RlKSwgJnBHcFBhdGgpOworICBpZiAoIXBHcFBhdGgpIHsKKyAgICBpZiAocE1hdHJpeCkgeworICAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZU1hdHJpeCkocE1hdHJpeCk7CiAgICAgfQogICAgIEZYX0ZyZWUocG9pbnRzKTsKICAgICBGWF9GcmVlKHR5cGVzKTsKLSAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUGF0aCkocEdwUGF0aCk7CiAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKShwR3JhcGhpY3MpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobmV3X2ZpbGxfbW9kZSkgeworICAgIEdwQnJ1c2gqIHBCcnVzaCA9IF9HZGlwQ3JlYXRlQnJ1c2goZmlsbF9hcmdiKTsKKyAgICBDYWxsRnVuYyhHZGlwU2V0UGF0aEZpbGxNb2RlKShwR3BQYXRoLCBHZGlGaWxsVHlwZTJHZGlwKG5ld19maWxsX21vZGUpKTsKKyAgICBDYWxsRnVuYyhHZGlwRmlsbFBhdGgpKHBHcmFwaGljcywgcEJydXNoLCBwR3BQYXRoKTsKKyAgICBDYWxsRnVuYyhHZGlwRGVsZXRlQnJ1c2gpKHBCcnVzaCk7CisgIH0KKyAgaWYgKHBHcmFwaFN0YXRlICYmIHN0cm9rZV9hcmdiKSB7CisgICAgR3BQZW4qIHBQZW4gPSBfR2RpcENyZWF0ZVBlbihwR3JhcGhTdGF0ZSwgcE9iamVjdDJEZXZpY2UsIHN0cm9rZV9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7CisgICAgaWYgKG5TdWJQYXRoZXMgPT0gMSkgeworICAgICAgQ2FsbEZ1bmMoR2RpcERyYXdQYXRoKShwR3JhcGhpY3MsIHBQZW4sIHBHcFBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgaVN0YXJ0ID0gMDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblBvaW50czsgaSsrKSB7CisgICAgICAgIGlmIChpID09IG5Qb2ludHMgLSAxIHx8IHR5cGVzW2kgKyAxXSA9PSBQYXRoUG9pbnRUeXBlU3RhcnQpIHsKKyAgICAgICAgICBHcFBhdGgqIHBTdWJQYXRoOworICAgICAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVQYXRoMikocG9pbnRzICsgaVN0YXJ0LCB0eXBlcyArIGlTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgLSBpU3RhcnQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2RpRmlsbFR5cGUyR2RpcChuZXdfZmlsbF9tb2RlKSwgJnBTdWJQYXRoKTsKKyAgICAgICAgICBpU3RhcnQgPSBpICsgMTsKKyAgICAgICAgICBDYWxsRnVuYyhHZGlwRHJhd1BhdGgpKHBHcmFwaGljcywgcFBlbiwgcFN1YlBhdGgpOworICAgICAgICAgIENhbGxGdW5jKEdkaXBEZWxldGVQYXRoKShwU3ViUGF0aCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZVBlbikocFBlbik7CisgIH0KKyAgaWYgKHBNYXRyaXgpIHsKKyAgICBDYWxsRnVuYyhHZGlwRGVsZXRlTWF0cml4KShwTWF0cml4KTsKKyAgfQorICBGWF9GcmVlKHBvaW50cyk7CisgIEZYX0ZyZWUodHlwZXMpOworICBDYWxsRnVuYyhHZGlwRGVsZXRlUGF0aCkocEdwUGF0aCk7CisgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1jbGFzcyBHcFN0cmVhbSBmaW5hbCA6IHB1YmxpYyBJU3RyZWFtCi17Ci0gICAgTE9ORwltX1JlZkNvdW50OwotICAgIGludCAgICAgbV9SZWFkUG9zOwotICAgIENGWF9CeXRlVGV4dEJ1ZgltX0ludGVyU3RyZWFtOwotcHVibGljOgotICAgIEdwU3RyZWFtKCkKLSAgICB7Ci0gICAgICAgIG1fUmVmQ291bnQgPSAxOwotICAgICAgICBtX1JlYWRQb3MgPSAwOworY2xhc3MgR3BTdHJlYW0gZmluYWwgOiBwdWJsaWMgSVN0cmVhbSB7CisgIExPTkcgbV9SZWZDb3VudDsKKyAgaW50IG1fUmVhZFBvczsKKyAgQ0ZYX0J5dGVUZXh0QnVmIG1fSW50ZXJTdHJlYW07CisKKyBwdWJsaWM6CisgIEdwU3RyZWFtKCkgeworICAgIG1fUmVmQ291bnQgPSAxOworICAgIG1fUmVhZFBvcyA9IDA7CisgIH0KKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFF1ZXJ5SW50ZXJmYWNlKFJFRklJRCBpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcHB2T2JqZWN0KSB7CisgICAgaWYgKGlpZCA9PSBfX3V1aWRvZihJVW5rbm93bikgfHwgaWlkID09IF9fdXVpZG9mKElTdHJlYW0pIHx8CisgICAgICAgIGlpZCA9PSBfX3V1aWRvZihJU2VxdWVudGlhbFN0cmVhbSkpIHsKKyAgICAgICpwcHZPYmplY3QgPSBzdGF0aWNfY2FzdDxJU3RyZWFtKj4odGhpcyk7CisgICAgICBBZGRSZWYoKTsKKyAgICAgIHJldHVybiBTX09LOwogICAgIH0KLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUKLSAgICBRdWVyeUludGVyZmFjZShSRUZJSUQgaWlkLCB2b2lkICoqIHBwdk9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmIChpaWQgPT0gX191dWlkb2YoSVVua25vd24pIHx8Ci0gICAgICAgICAgICBpaWQgPT0gX191dWlkb2YoSVN0cmVhbSkgfHwKLSAgICAgICAgICAgIGlpZCA9PSBfX3V1aWRvZihJU2VxdWVudGlhbFN0cmVhbSkpCXsKLSAgICAgICAgICAgICpwcHZPYmplY3QgPSBzdGF0aWNfY2FzdDxJU3RyZWFtKj4odGhpcyk7Ci0gICAgICAgICAgICBBZGRSZWYoKTsKLSAgICAgICAgICAgIHJldHVybiBTX09LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBFX05PSU5URVJGQUNFOworICAgIHJldHVybiBFX05PSU5URVJGQUNFOworICB9CisgIHZpcnR1YWwgVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgQWRkUmVmKHZvaWQpIHsKKyAgICByZXR1cm4gKFVMT05HKUludGVybG9ja2VkSW5jcmVtZW50KCZtX1JlZkNvdW50KTsKKyAgfQorICB2aXJ0dWFsIFVMT05HIFNURE1FVEhPRENBTExUWVBFIFJlbGVhc2Uodm9pZCkgeworICAgIFVMT05HIHJlcyA9IChVTE9ORylJbnRlcmxvY2tlZERlY3JlbWVudCgmbV9SZWZDb3VudCk7CisgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICBkZWxldGUgdGhpczsKICAgICB9Ci0gICAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBBZGRSZWYodm9pZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVUxPTkcpSW50ZXJsb2NrZWRJbmNyZW1lbnQoJm1fUmVmQ291bnQpOworICAgIHJldHVybiByZXM7CisgIH0KKworIHB1YmxpYzoKKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFJlYWQodm9pZCogT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcqIHBjYlJlYWQpIHsKKyAgICBzaXplX3QgYnl0ZXNfbGVmdDsKKyAgICBzaXplX3QgYnl0ZXNfb3V0OworICAgIGlmIChwY2JSZWFkICE9IE5VTEwpIHsKKyAgICAgICpwY2JSZWFkID0gMDsKICAgICB9Ci0gICAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBSZWxlYXNlKHZvaWQpCi0gICAgewotICAgICAgICBVTE9ORyByZXMgPSAoVUxPTkcpIEludGVybG9ja2VkRGVjcmVtZW50KCZtX1JlZkNvdW50KTsKLSAgICAgICAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAgICAgICBkZWxldGUgdGhpczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOworICAgIGlmIChtX1JlYWRQb3MgPT0gbV9JbnRlclN0cmVhbS5HZXRMZW5ndGgoKSkgeworICAgICAgcmV0dXJuIEhSRVNVTFRfRlJPTV9XSU4zMihFUlJPUl9FTkRfT0ZfTUVESUEpOwogICAgIH0KLXB1YmxpYzoKLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUmVhZCh2b2lkKiBPdXRwdXQsIFVMT05HIGNiLCBVTE9ORyogcGNiUmVhZCkKLSAgICB7Ci0gICAgICAgIHNpemVfdAlieXRlc19sZWZ0OwotICAgICAgICBzaXplX3QJYnl0ZXNfb3V0OwotICAgICAgICBpZiAocGNiUmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcGNiUmVhZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fUmVhZFBvcyA9PSBtX0ludGVyU3RyZWFtLkdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSFJFU1VMVF9GUk9NX1dJTjMyKEVSUk9SX0VORF9PRl9NRURJQSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZXNfbGVmdCA9IG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCkgLSBtX1JlYWRQb3M7Ci0gICAgICAgIGJ5dGVzX291dCA9IEZYX01JTihjYiwgYnl0ZXNfbGVmdCk7Ci0gICAgICAgIEZYU1lTX21lbWNweShPdXRwdXQsIG1fSW50ZXJTdHJlYW0uR2V0QnVmZmVyKCkgKyBtX1JlYWRQb3MsIGJ5dGVzX291dCk7Ci0gICAgICAgIG1fUmVhZFBvcyArPSAoaW50MzJfdClieXRlc19vdXQ7Ci0gICAgICAgIGlmIChwY2JSZWFkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwY2JSZWFkID0gKFVMT05HKWJ5dGVzX291dDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU19PSzsKKyAgICBieXRlc19sZWZ0ID0gbV9JbnRlclN0cmVhbS5HZXRMZW5ndGgoKSAtIG1fUmVhZFBvczsKKyAgICBieXRlc19vdXQgPSBGWF9NSU4oY2IsIGJ5dGVzX2xlZnQpOworICAgIEZYU1lTX21lbWNweShPdXRwdXQsIG1fSW50ZXJTdHJlYW0uR2V0QnVmZmVyKCkgKyBtX1JlYWRQb3MsIGJ5dGVzX291dCk7CisgICAgbV9SZWFkUG9zICs9IChpbnQzMl90KWJ5dGVzX291dDsKKyAgICBpZiAocGNiUmVhZCAhPSBOVUxMKSB7CisgICAgICAqcGNiUmVhZCA9IChVTE9ORylieXRlc19vdXQ7CiAgICAgfQotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXcml0ZSh2b2lkIGNvbnN0KiBJbnB1dCwgVUxPTkcgY2IsIFVMT05HKiBwY2JXcml0dGVuKQotICAgIHsKLSAgICAgICAgaWYgKGNiIDw9IDApIHsKLSAgICAgICAgICAgIGlmIChwY2JXcml0dGVuICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqcGNiV3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU19PSzsKLSAgICAgICAgfQotICAgICAgICBtX0ludGVyU3RyZWFtLkluc2VydEJsb2NrKG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCksIElucHV0LCBjYik7Ci0gICAgICAgIGlmIChwY2JXcml0dGVuICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwY2JXcml0dGVuID0gY2I7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFNfT0s7CisgICAgcmV0dXJuIFNfT0s7CisgIH0KKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFdyaXRlKHZvaWQgY29uc3QqIElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyogcGNiV3JpdHRlbikgeworICAgIGlmIChjYiA8PSAwKSB7CisgICAgICBpZiAocGNiV3JpdHRlbiAhPSBOVUxMKSB7CisgICAgICAgICpwY2JXcml0dGVuID0gMDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBTX09LOwogICAgIH0KLXB1YmxpYzoKLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgU2V0U2l6ZShVTEFSR0VfSU5URUdFUikKLSAgICB7Ci0gICAgICAgIHJldHVybiBFX05PVElNUEw7CisgICAgbV9JbnRlclN0cmVhbS5JbnNlcnRCbG9jayhtX0ludGVyU3RyZWFtLkdldExlbmd0aCgpLCBJbnB1dCwgY2IpOworICAgIGlmIChwY2JXcml0dGVuICE9IE5VTEwpIHsKKyAgICAgICpwY2JXcml0dGVuID0gY2I7CiAgICAgfQotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDb3B5VG8oSVN0cmVhbSosIFVMQVJHRV9JTlRFR0VSLCBVTEFSR0VfSU5URUdFUiosIFVMQVJHRV9JTlRFR0VSKikKLSAgICB7Ci0gICAgICAgIHJldHVybiBFX05PVElNUEw7CisgICAgcmV0dXJuIFNfT0s7CisgIH0KKworIHB1YmxpYzoKKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFNldFNpemUoVUxBUkdFX0lOVEVHRVIpIHsKKyAgICByZXR1cm4gRV9OT1RJTVBMOworICB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDb3B5VG8oSVN0cmVhbSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxBUkdFX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxBUkdFX0lOVEVHRVIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMQVJHRV9JTlRFR0VSKikgeworICAgIHJldHVybiBFX05PVElNUEw7CisgIH0KKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENvbW1pdChEV09SRCkgeyByZXR1cm4gRV9OT1RJTVBMOyB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBSZXZlcnQodm9pZCkgeyByZXR1cm4gRV9OT1RJTVBMOyB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBMb2NrUmVnaW9uKFVMQVJHRV9JTlRFR0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTEFSR0VfSU5URUdFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQpIHsKKyAgICByZXR1cm4gRV9OT1RJTVBMOworICB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBVbmxvY2tSZWdpb24oVUxBUkdFX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxBUkdFX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQpIHsKKyAgICByZXR1cm4gRV9OT1RJTVBMOworICB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDbG9uZShJU3RyZWFtKiopIHsgcmV0dXJuIEVfTk9USU1QTDsgfQorICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgU2VlayhMQVJHRV9JTlRFR0VSIGxpRGlzdGFuY2VUb01vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3T3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTEFSR0VfSU5URUdFUiogbHBOZXdGaWxlUG9pbnRlcikgeworICAgIGxvbmcgc3RhcnQgPSAwOworICAgIGxvbmcgbmV3X3JlYWRfcG9zaXRpb247CisgICAgc3dpdGNoIChkd09yaWdpbikgeworICAgICAgY2FzZSBTVFJFQU1fU0VFS19TRVQ6CisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNUUkVBTV9TRUVLX0NVUjoKKyAgICAgICAgc3RhcnQgPSBtX1JlYWRQb3M7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTVFJFQU1fU0VFS19FTkQ6CisgICAgICAgIHN0YXJ0ID0gbV9JbnRlclN0cmVhbS5HZXRMZW5ndGgoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOworICAgICAgICBicmVhazsKICAgICB9Ci0gICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENvbW1pdChEV09SRCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFX05PVElNUEw7CisgICAgbmV3X3JlYWRfcG9zaXRpb24gPSBzdGFydCArIChsb25nKWxpRGlzdGFuY2VUb01vdmUuUXVhZFBhcnQ7CisgICAgaWYgKG5ld19yZWFkX3Bvc2l0aW9uIDwgMCB8fAorICAgICAgICBuZXdfcmVhZF9wb3NpdGlvbiA+IG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCkpIHsKKyAgICAgIHJldHVybiBTVEdfRV9TRUVLRVJST1I7CiAgICAgfQotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBSZXZlcnQodm9pZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFX05PVElNUEw7CisgICAgbV9SZWFkUG9zID0gbmV3X3JlYWRfcG9zaXRpb247CisgICAgaWYgKGxwTmV3RmlsZVBvaW50ZXIgIT0gTlVMTCkgeworICAgICAgbHBOZXdGaWxlUG9pbnRlci0+UXVhZFBhcnQgPSBtX1JlYWRQb3M7CiAgICAgfQotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBMb2NrUmVnaW9uKFVMQVJHRV9JTlRFR0VSLCBVTEFSR0VfSU5URUdFUiwgRFdPUkQpCi0gICAgewotICAgICAgICByZXR1cm4gRV9OT1RJTVBMOworICAgIHJldHVybiBTX09LOworICB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBTdGF0KFNUQVRTVEcqIHBTdGF0c3RnLCBEV09SRCBncmZTdGF0RmxhZykgeworICAgIGlmIChwU3RhdHN0ZyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOwogICAgIH0KLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgVW5sb2NrUmVnaW9uKFVMQVJHRV9JTlRFR0VSLCBVTEFSR0VfSU5URUdFUiwgRFdPUkQpCi0gICAgewotICAgICAgICByZXR1cm4gRV9OT1RJTVBMOwotICAgIH0KLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgQ2xvbmUoSVN0cmVhbSAqKikKLSAgICB7Ci0gICAgICAgIHJldHVybiBFX05PVElNUEw7Ci0gICAgfQotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBTZWVrKExBUkdFX0lOVEVHRVIgbGlEaXN0YW5jZVRvTW92ZSwgRFdPUkQgZHdPcmlnaW4sIFVMQVJHRV9JTlRFR0VSKiBscE5ld0ZpbGVQb2ludGVyKQotICAgIHsKLSAgICAgICAgbG9uZwlzdGFydCA9IDA7Ci0gICAgICAgIGxvbmcJbmV3X3JlYWRfcG9zaXRpb247Ci0gICAgICAgIHN3aXRjaChkd09yaWdpbikgewotICAgICAgICAgICAgY2FzZSBTVFJFQU1fU0VFS19TRVQ6Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVFJFQU1fU0VFS19DVVI6Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBtX1JlYWRQb3M7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNUUkVBTV9TRUVLX0VORDoKLSAgICAgICAgICAgICAgICBzdGFydCA9IG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBTVEdfRV9JTlZBTElERlVOQ1RJT047Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbmV3X3JlYWRfcG9zaXRpb24gPSBzdGFydCArIChsb25nKWxpRGlzdGFuY2VUb01vdmUuUXVhZFBhcnQ7Ci0gICAgICAgIGlmIChuZXdfcmVhZF9wb3NpdGlvbiA8IDAgfHwgbmV3X3JlYWRfcG9zaXRpb24gPiBtX0ludGVyU3RyZWFtLkdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gU1RHX0VfU0VFS0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIG1fUmVhZFBvcyA9IG5ld19yZWFkX3Bvc2l0aW9uOwotICAgICAgICBpZiAobHBOZXdGaWxlUG9pbnRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBscE5ld0ZpbGVQb2ludGVyLT5RdWFkUGFydCA9IG1fUmVhZFBvczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFN0YXQoU1RBVFNURyogcFN0YXRzdGcsIERXT1JEIGdyZlN0YXRGbGFnKQotICAgIHsKLSAgICAgICAgaWYgKHBTdGF0c3RnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBTVEdfRV9JTlZBTElERlVOQ1RJT047Ci0gICAgICAgIH0KLSAgICAgICAgWmVyb01lbW9yeShwU3RhdHN0Zywgc2l6ZW9mKFNUQVRTVEcpKTsKLSAgICAgICAgcFN0YXRzdGctPmNiU2l6ZS5RdWFkUGFydCA9IG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCk7Ci0gICAgICAgIHJldHVybiBTX09LOwotICAgIH0KKyAgICBaZXJvTWVtb3J5KHBTdGF0c3RnLCBzaXplb2YoU1RBVFNURykpOworICAgIHBTdGF0c3RnLT5jYlNpemUuUXVhZFBhcnQgPSBtX0ludGVyU3RyZWFtLkdldExlbmd0aCgpOworICAgIHJldHVybiBTX09LOworICB9CiB9OwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIEJJVE1BUElORk8qCQlwYm1pOwotICAgIGludAkJCQlTdHJpZGU7Ci0gICAgTFBCWVRFCQkJcFNjYW4wOwotICAgIEdwQml0bWFwKgkJcEJpdG1hcDsKLSAgICBCaXRtYXBEYXRhKgkJcEJpdG1hcERhdGE7Ci0gICAgR3BTdHJlYW0qICAgICAgIHBTdHJlYW07CisgIEJJVE1BUElORk8qIHBibWk7CisgIGludCBTdHJpZGU7CisgIExQQllURSBwU2NhbjA7CisgIEdwQml0bWFwKiBwQml0bWFwOworICBCaXRtYXBEYXRhKiBwQml0bWFwRGF0YTsKKyAgR3BTdHJlYW0qIHBTdHJlYW07CiB9IFBSRVZJRVczX0RJQklUTUFQOwotc3RhdGljIFBSRVZJRVczX0RJQklUTUFQKiBMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncykKLXsKLSAgICBHcEJpdG1hcCogcEJpdG1hcDsKLSAgICBHcFN0cmVhbSogcFN0cmVhbSA9IE5VTEw7Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBTdGF0dXMgc3RhdHVzID0gT2s7Ci0gICAgaWYgKGFyZ3MuZmxhZ3MgPT0gV0lORElCX09QRU5fUEFUSE5BTUUpIHsKLSAgICAgICAgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21GaWxlSUNNKSgod2NoYXJfdCopYXJncy5wYXRoX25hbWUsICZwQml0bWFwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYXJncy5tZW1vcnlfc2l6ZSA9PSAwIHx8ICFhcmdzLm1lbW9yeV9iYXNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBwU3RyZWFtID0gRlhfTkVXIEdwU3RyZWFtOwotICAgICAgICBpZiAoIXBTdHJlYW0pIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHBTdHJlYW0tPldyaXRlKGFyZ3MubWVtb3J5X2Jhc2UsIChVTE9ORylhcmdzLm1lbW9yeV9zaXplLCBOVUxMKTsKLSAgICAgICAgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TdHJlYW1JQ00pKHBTdHJlYW0sICZwQml0bWFwKTsKK3N0YXRpYyBQUkVWSUVXM19ESUJJVE1BUCogTG9hZERJQml0bWFwKFdJTkRJQl9PcGVuX0FyZ3NfIGFyZ3MpIHsKKyAgR3BCaXRtYXAqIHBCaXRtYXA7CisgIEdwU3RyZWFtKiBwU3RyZWFtID0gTlVMTDsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIFN0YXR1cyBzdGF0dXMgPSBPazsKKyAgaWYgKGFyZ3MuZmxhZ3MgPT0gV0lORElCX09QRU5fUEFUSE5BTUUpIHsKKyAgICBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbUZpbGVJQ00pKCh3Y2hhcl90KilhcmdzLnBhdGhfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQml0bWFwKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoYXJncy5tZW1vcnlfc2l6ZSA9PSAwIHx8ICFhcmdzLm1lbW9yeV9iYXNlKSB7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBPaykgewotICAgICAgICBpZiAocFN0cmVhbSkgewotICAgICAgICAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIHBTdHJlYW0gPSBGWF9ORVcgR3BTdHJlYW07CisgICAgaWYgKCFwU3RyZWFtKSB7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgVUlOVCBoZWlnaHQsIHdpZHRoOwotICAgIENhbGxGdW5jKEdkaXBHZXRJbWFnZUhlaWdodCkocEJpdG1hcCwgJmhlaWdodCk7Ci0gICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlV2lkdGgpKHBCaXRtYXAsICZ3aWR0aCk7Ci0gICAgUGl4ZWxGb3JtYXQgcGl4ZWxfZm9ybWF0OwotICAgIENhbGxGdW5jKEdkaXBHZXRJbWFnZVBpeGVsRm9ybWF0KShwQml0bWFwLCAmcGl4ZWxfZm9ybWF0KTsKLSAgICBpbnQgaW5mb19zaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgIGludCBicHAgPSAyNDsKLSAgICBpbnQgZGVzdF9waXhlbF9mb3JtYXQgPSBQaXhlbEZvcm1hdDI0YnBwUkdCOwotICAgIGlmIChwaXhlbF9mb3JtYXQgPT0gUGl4ZWxGb3JtYXQxYnBwSW5kZXhlZCkgewotICAgICAgICBpbmZvX3NpemUgKz0gODsKLSAgICAgICAgYnBwID0gMTsKLSAgICAgICAgZGVzdF9waXhlbF9mb3JtYXQgPSBQaXhlbEZvcm1hdDFicHBJbmRleGVkOwotICAgIH0gZWxzZSBpZiAocGl4ZWxfZm9ybWF0ID09IFBpeGVsRm9ybWF0OGJwcEluZGV4ZWQpIHsKLSAgICAgICAgaW5mb19zaXplICs9IDEwMjQ7Ci0gICAgICAgIGJwcCA9IDg7Ci0gICAgICAgIGRlc3RfcGl4ZWxfZm9ybWF0ID0gUGl4ZWxGb3JtYXQ4YnBwSW5kZXhlZDsKLSAgICB9IGVsc2UgaWYgKHBpeGVsX2Zvcm1hdCA9PSBQaXhlbEZvcm1hdDMyYnBwQVJHQikgewotICAgICAgICBicHAgPSAzMjsKLSAgICAgICAgZGVzdF9waXhlbF9mb3JtYXQgPSBQaXhlbEZvcm1hdDMyYnBwQVJHQjsKKyAgICBwU3RyZWFtLT5Xcml0ZShhcmdzLm1lbW9yeV9iYXNlLCAoVUxPTkcpYXJncy5tZW1vcnlfc2l6ZSwgTlVMTCk7CisgICAgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TdHJlYW1JQ00pKHBTdHJlYW0sICZwQml0bWFwKTsKKyAgfQorICBpZiAoc3RhdHVzICE9IE9rKSB7CisgICAgaWYgKHBTdHJlYW0pIHsKKyAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKICAgICB9Ci0gICAgTFBCWVRFIGJ1ZiA9IEZYX0FsbG9jKEJZVEUsIGluZm9fc2l6ZSk7Ci0gICAgQklUTUFQSU5GT0hFQURFUiogcGJtaWggPSAoQklUTUFQSU5GT0hFQURFUiopYnVmOwotICAgIHBibWloLT5iaUJpdENvdW50ID0gYnBwOwotICAgIHBibWloLT5iaUNvbXByZXNzaW9uID0gQklfUkdCOwotICAgIHBibWloLT5iaUhlaWdodCA9IC0oaW50KWhlaWdodDsKLSAgICBwYm1paC0+YmlQbGFuZXMgPSAxOwotICAgIHBibWloLT5iaVdpZHRoID0gd2lkdGg7Ci0gICAgUmVjdCByZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgIEJpdG1hcERhdGEqIHBCaXRtYXBEYXRhID0gRlhfQWxsb2MoQml0bWFwRGF0YSwgMSk7Ci0gICAgQ2FsbEZ1bmMoR2RpcEJpdG1hcExvY2tCaXRzKShwQml0bWFwLCAmcmVjdCwgSW1hZ2VMb2NrTW9kZVJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BpeGVsX2Zvcm1hdCwgcEJpdG1hcERhdGEpOwotICAgIGlmIChwaXhlbF9mb3JtYXQgPT0gUGl4ZWxGb3JtYXQxYnBwSW5kZXhlZCB8fCBwaXhlbF9mb3JtYXQgPT0gUGl4ZWxGb3JtYXQ4YnBwSW5kZXhlZCkgewotICAgICAgICBEV09SRCogcHBhbCA9IChEV09SRCopKGJ1ZiArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICBVSU5UIGZsYWdzOwotICAgICAgICAgICAgVUlOVCBDb3VudDsKLSAgICAgICAgICAgIERXT1JEIEVudHJpZXNbMjU2XTsKLSAgICAgICAgfSBwYWw7Ci0gICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlUGFsZXR0ZVNpemUpKHBCaXRtYXAsICZzaXplKTsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlUGFsZXR0ZSkocEJpdG1hcCwgKENvbG9yUGFsZXR0ZSopJnBhbCwgc2l6ZSk7Ci0gICAgICAgIGludCBlbnRyaWVzID0gcGl4ZWxfZm9ybWF0ID09IFBpeGVsRm9ybWF0MWJwcEluZGV4ZWQgPyAyIDogMjU2OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXM7IGkgKyspIHsKLSAgICAgICAgICAgIHBwYWxbaV0gPSBwYWwuRW50cmllc1tpXSAmIDB4MDBmZmZmZmY7Ci0gICAgICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBVSU5UIGhlaWdodCwgd2lkdGg7CisgIENhbGxGdW5jKEdkaXBHZXRJbWFnZUhlaWdodCkocEJpdG1hcCwgJmhlaWdodCk7CisgIENhbGxGdW5jKEdkaXBHZXRJbWFnZVdpZHRoKShwQml0bWFwLCAmd2lkdGgpOworICBQaXhlbEZvcm1hdCBwaXhlbF9mb3JtYXQ7CisgIENhbGxGdW5jKEdkaXBHZXRJbWFnZVBpeGVsRm9ybWF0KShwQml0bWFwLCAmcGl4ZWxfZm9ybWF0KTsKKyAgaW50IGluZm9fc2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgaW50IGJwcCA9IDI0OworICBpbnQgZGVzdF9waXhlbF9mb3JtYXQgPSBQaXhlbEZvcm1hdDI0YnBwUkdCOworICBpZiAocGl4ZWxfZm9ybWF0ID09IFBpeGVsRm9ybWF0MWJwcEluZGV4ZWQpIHsKKyAgICBpbmZvX3NpemUgKz0gODsKKyAgICBicHAgPSAxOworICAgIGRlc3RfcGl4ZWxfZm9ybWF0ID0gUGl4ZWxGb3JtYXQxYnBwSW5kZXhlZDsKKyAgfSBlbHNlIGlmIChwaXhlbF9mb3JtYXQgPT0gUGl4ZWxGb3JtYXQ4YnBwSW5kZXhlZCkgeworICAgIGluZm9fc2l6ZSArPSAxMDI0OworICAgIGJwcCA9IDg7CisgICAgZGVzdF9waXhlbF9mb3JtYXQgPSBQaXhlbEZvcm1hdDhicHBJbmRleGVkOworICB9IGVsc2UgaWYgKHBpeGVsX2Zvcm1hdCA9PSBQaXhlbEZvcm1hdDMyYnBwQVJHQikgeworICAgIGJwcCA9IDMyOworICAgIGRlc3RfcGl4ZWxfZm9ybWF0ID0gUGl4ZWxGb3JtYXQzMmJwcEFSR0I7CisgIH0KKyAgTFBCWVRFIGJ1ZiA9IEZYX0FsbG9jKEJZVEUsIGluZm9fc2l6ZSk7CisgIEJJVE1BUElORk9IRUFERVIqIHBibWloID0gKEJJVE1BUElORk9IRUFERVIqKWJ1ZjsKKyAgcGJtaWgtPmJpQml0Q291bnQgPSBicHA7CisgIHBibWloLT5iaUNvbXByZXNzaW9uID0gQklfUkdCOworICBwYm1paC0+YmlIZWlnaHQgPSAtKGludCloZWlnaHQ7CisgIHBibWloLT5iaVBsYW5lcyA9IDE7CisgIHBibWloLT5iaVdpZHRoID0gd2lkdGg7CisgIFJlY3QgcmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgQml0bWFwRGF0YSogcEJpdG1hcERhdGEgPSBGWF9BbGxvYyhCaXRtYXBEYXRhLCAxKTsKKyAgQ2FsbEZ1bmMoR2RpcEJpdG1hcExvY2tCaXRzKShwQml0bWFwLCAmcmVjdCwgSW1hZ2VMb2NrTW9kZVJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9waXhlbF9mb3JtYXQsIHBCaXRtYXBEYXRhKTsKKyAgaWYgKHBpeGVsX2Zvcm1hdCA9PSBQaXhlbEZvcm1hdDFicHBJbmRleGVkIHx8CisgICAgICBwaXhlbF9mb3JtYXQgPT0gUGl4ZWxGb3JtYXQ4YnBwSW5kZXhlZCkgeworICAgIERXT1JEKiBwcGFsID0gKERXT1JEKikoYnVmICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKKyAgICBzdHJ1Y3QgeworICAgICAgVUlOVCBmbGFnczsKKyAgICAgIFVJTlQgQ291bnQ7CisgICAgICBEV09SRCBFbnRyaWVzWzI1Nl07CisgICAgfSBwYWw7CisgICAgaW50IHNpemUgPSAwOworICAgIENhbGxGdW5jKEdkaXBHZXRJbWFnZVBhbGV0dGVTaXplKShwQml0bWFwLCAmc2l6ZSk7CisgICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlUGFsZXR0ZSkocEJpdG1hcCwgKENvbG9yUGFsZXR0ZSopJnBhbCwgc2l6ZSk7CisgICAgaW50IGVudHJpZXMgPSBwaXhlbF9mb3JtYXQgPT0gUGl4ZWxGb3JtYXQxYnBwSW5kZXhlZCA/IDIgOiAyNTY7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKyAgICAgIHBwYWxbaV0gPSBwYWwuRW50cmllc1tpXSAmIDB4MDBmZmZmZmY7CiAgICAgfQotICAgIFBSRVZJRVczX0RJQklUTUFQKiBwSW5mbyA9IEZYX0FsbG9jKFBSRVZJRVczX0RJQklUTUFQLCAxKTsKLSAgICBwSW5mby0+cGJtaSA9IChCSVRNQVBJTkZPKilidWY7Ci0gICAgcEluZm8tPnBTY2FuMCA9IChMUEJZVEUpcEJpdG1hcERhdGEtPlNjYW4wOwotICAgIHBJbmZvLT5TdHJpZGUgPSBwQml0bWFwRGF0YS0+U3RyaWRlOwotICAgIHBJbmZvLT5wQml0bWFwID0gcEJpdG1hcDsKLSAgICBwSW5mby0+cEJpdG1hcERhdGEgPSBwQml0bWFwRGF0YTsKLSAgICBwSW5mby0+cFN0cmVhbSA9IHBTdHJlYW07Ci0gICAgcmV0dXJuIHBJbmZvOworICB9CisgIFBSRVZJRVczX0RJQklUTUFQKiBwSW5mbyA9IEZYX0FsbG9jKFBSRVZJRVczX0RJQklUTUFQLCAxKTsKKyAgcEluZm8tPnBibWkgPSAoQklUTUFQSU5GTyopYnVmOworICBwSW5mby0+cFNjYW4wID0gKExQQllURSlwQml0bWFwRGF0YS0+U2NhbjA7CisgIHBJbmZvLT5TdHJpZGUgPSBwQml0bWFwRGF0YS0+U3RyaWRlOworICBwSW5mby0+cEJpdG1hcCA9IHBCaXRtYXA7CisgIHBJbmZvLT5wQml0bWFwRGF0YSA9IHBCaXRtYXBEYXRhOworICBwSW5mby0+cFN0cmVhbSA9IHBTdHJlYW07CisgIHJldHVybiBwSW5mbzsKIH0KLXN0YXRpYyB2b2lkIEZyZWVESUJpdG1hcChQUkVWSUVXM19ESUJJVE1BUCogcEluZm8pCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBDYWxsRnVuYyhHZGlwQml0bWFwVW5sb2NrQml0cykocEluZm8tPnBCaXRtYXAsIHBJbmZvLT5wQml0bWFwRGF0YSk7Ci0gICAgQ2FsbEZ1bmMoR2RpcERpc3Bvc2VJbWFnZSkocEluZm8tPnBCaXRtYXApOwotICAgIEZYX0ZyZWUocEluZm8tPnBCaXRtYXBEYXRhKTsKLSAgICBGWF9GcmVlKChMUEJZVEUpcEluZm8tPnBibWkpOwotICAgIGlmIChwSW5mby0+cFN0cmVhbSkgewotICAgICAgICBwSW5mby0+cFN0cmVhbS0+UmVsZWFzZSgpOwotICAgIH0KLSAgICBGWF9GcmVlKHBJbmZvKTsKK3N0YXRpYyB2b2lkIEZyZWVESUJpdG1hcChQUkVWSUVXM19ESUJJVE1BUCogcEluZm8pIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBCaXRtYXBVbmxvY2tCaXRzKShwSW5mby0+cEJpdG1hcCwgcEluZm8tPnBCaXRtYXBEYXRhKTsKKyAgQ2FsbEZ1bmMoR2RpcERpc3Bvc2VJbWFnZSkocEluZm8tPnBCaXRtYXApOworICBGWF9GcmVlKHBJbmZvLT5wQml0bWFwRGF0YSk7CisgIEZYX0ZyZWUoKExQQllURSlwSW5mby0+cGJtaSk7CisgIGlmIChwSW5mby0+cFN0cmVhbSkgeworICAgIHBJbmZvLT5wU3RyZWFtLT5SZWxlYXNlKCk7CisgIH0KKyAgRlhfRnJlZShwSW5mbyk7CiB9Ci1DRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSwgRlhfQk9PTCBiQWxwaGEpOwotQ0ZYX0RJQml0bWFwKiBDR2RpcGx1c0V4dDo6TG9hZERJQml0bWFwKFdJTkRJQl9PcGVuX0FyZ3NfIGFyZ3MpCi17Ci0gICAgUFJFVklFVzNfRElCSVRNQVAqIHBJbmZvID0gOjpMb2FkRElCaXRtYXAoYXJncyk7Ci0gICAgaWYgKHBJbmZvID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitDRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWxwaGEpOworQ0ZYX0RJQml0bWFwKiBDR2RpcGx1c0V4dDo6TG9hZERJQml0bWFwKFdJTkRJQl9PcGVuX0FyZ3NfIGFyZ3MpIHsKKyAgUFJFVklFVzNfRElCSVRNQVAqIHBJbmZvID0gOjpMb2FkRElCaXRtYXAoYXJncyk7CisgIGlmIChwSW5mbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IGhlaWdodCA9IGFicyhwSW5mby0+cGJtaS0+Ym1pSGVhZGVyLmJpSGVpZ2h0KTsKKyAgaW50IHdpZHRoID0gcEluZm8tPnBibWktPmJtaUhlYWRlci5iaVdpZHRoOworICBpbnQgZGVzdF9waXRjaCA9ICh3aWR0aCAqIHBJbmZvLT5wYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCArIDMxKSAvIDMyICogNDsKKyAgTFBCWVRFIHBEYXRhID0gRlhfQWxsb2MyRChCWVRFLCBkZXN0X3BpdGNoLCBoZWlnaHQpOworICBpZiAoZGVzdF9waXRjaCA9PSBwSW5mby0+U3RyaWRlKSB7CisgICAgRlhTWVNfbWVtY3B5KHBEYXRhLCBwSW5mby0+cFNjYW4wLCBkZXN0X3BpdGNoICogaGVpZ2h0KTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBGWFNZU19tZW1jcHkocERhdGEgKyBkZXN0X3BpdGNoICogaSwgcEluZm8tPnBTY2FuMCArIHBJbmZvLT5TdHJpZGUgKiBpLAorICAgICAgICAgICAgICAgICAgIGRlc3RfcGl0Y2gpOwogICAgIH0KLSAgICBpbnQgaGVpZ2h0ID0gYWJzKHBJbmZvLT5wYm1pLT5ibWlIZWFkZXIuYmlIZWlnaHQpOwotICAgIGludCB3aWR0aCA9IHBJbmZvLT5wYm1pLT5ibWlIZWFkZXIuYmlXaWR0aDsKLSAgICBpbnQgZGVzdF9waXRjaCA9ICh3aWR0aCAqIHBJbmZvLT5wYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCArIDMxKSAvIDMyICogNDsKLSAgICBMUEJZVEUgcERhdGEgPSBGWF9BbGxvYzJEKEJZVEUsIGRlc3RfcGl0Y2gsIGhlaWdodCk7Ci0gICAgaWYgKGRlc3RfcGl0Y2ggPT0gcEluZm8tPlN0cmlkZSkgewotICAgICAgICBGWFNZU19tZW1jcHkocERhdGEsIHBJbmZvLT5wU2NhbjAsIGRlc3RfcGl0Y2ggKiBoZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0OyBpICsrKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkocERhdGEgKyBkZXN0X3BpdGNoICogaSwgcEluZm8tPnBTY2FuMCArIHBJbmZvLT5TdHJpZGUgKiBpLCBkZXN0X3BpdGNoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKHBJbmZvLT5wYm1pLCBwRGF0YSwgcEluZm8tPnBibWktPmJtaUhlYWRlci5iaUJpdENvdW50ID09IDMyKTsKLSAgICBGWF9GcmVlKHBEYXRhKTsKLSAgICBGcmVlRElCaXRtYXAocEluZm8pOwotICAgIHJldHVybiBwRElCaXRtYXA7CisgIH0KKyAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBfRlhfV2luZG93c0RJQl9Mb2FkRnJvbUJ1ZigKKyAgICAgIHBJbmZvLT5wYm1pLCBwRGF0YSwgcEluZm8tPnBibWktPmJtaUhlYWRlci5iaUJpdENvdW50ID09IDMyKTsKKyAgRlhfRnJlZShwRGF0YSk7CisgIEZyZWVESUJpdG1hcChwSW5mbyk7CisgIHJldHVybiBwRElCaXRtYXA7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfcHJpbnQuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9wcmludC5jcHAKaW5kZXggMmJlOGEzMC4uMWIzYmE0ZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9wcmludC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9wcmludC5jcHAKQEAgLTE0LDQwNiArMTQsNDczIEBACiAjaW5jbHVkZSAiLi4vZGliL2RpYl9pbnQuaCIKICNkZWZpbmUgU0laRVRIUkVTSE9MRCAxMDAwCiAjZGVmaW5lIE9VVFBVVFBTTEVOIDQwOTYKLUNHZGlQcmludGVyRHJpdmVyOjpDR2RpUHJpbnRlckRyaXZlcihIREMgaERDKSA6IENHZGlEZXZpY2VEcml2ZXIoaERDLCBGWERDX1BSSU5URVIpCi17Ci0gICAgbV9Ib3J6U2l6ZSA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgSE9SWlNJWkUpOwotICAgIG1fVmVydFNpemUgPSA6OkdldERldmljZUNhcHMobV9oREMsIFZFUlRTSVpFKTsKLSAgICBtX2JTdXBwb3J0Uk9QID0gVFJVRTsKK0NHZGlQcmludGVyRHJpdmVyOjpDR2RpUHJpbnRlckRyaXZlcihIREMgaERDKQorICAgIDogQ0dkaURldmljZURyaXZlcihoREMsIEZYRENfUFJJTlRFUikgeworICBtX0hvcnpTaXplID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBIT1JaU0laRSk7CisgIG1fVmVydFNpemUgPSA6OkdldERldmljZUNhcHMobV9oREMsIFZFUlRTSVpFKTsKKyAgbV9iU3VwcG9ydFJPUCA9IFRSVUU7CiB9Ci1pbnQgQ0dkaVByaW50ZXJEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpCi17Ci0gICAgaWYgKGNhcHNfaWQgPT0gRlhEQ19IT1JaX1NJWkUpIHsKLSAgICAgICAgcmV0dXJuIG1fSG9yelNpemU7Ci0gICAgfQotICAgIGlmIChjYXBzX2lkID09IEZYRENfVkVSVF9TSVpFKSB7Ci0gICAgICAgIHJldHVybiBtX1ZlcnRTaXplOwotICAgIH0KLSAgICByZXR1cm4gQ0dkaURldmljZURyaXZlcjo6R2V0RGV2aWNlQ2FwcyhjYXBzX2lkKTsKK2ludCBDR2RpUHJpbnRlckRyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgeworICBpZiAoY2Fwc19pZCA9PSBGWERDX0hPUlpfU0laRSkgeworICAgIHJldHVybiBtX0hvcnpTaXplOworICB9CisgIGlmIChjYXBzX2lkID09IEZYRENfVkVSVF9TSVpFKSB7CisgICAgcmV0dXJuIG1fVmVydFNpemU7CisgIH0KKyAgcmV0dXJuIENHZGlEZXZpY2VEcml2ZXI6OkdldERldmljZUNhcHMoY2Fwc19pZCk7CiB9Ci1GWF9CT09MIENHZGlQcmludGVyRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgRlhfUkVDVCBjbGlwX3JlY3QobGVmdCwgdG9wLCBsZWZ0ICsgcFNyY1JlY3QtPldpZHRoKCksIHRvcCArIHBTcmNSZWN0LT5IZWlnaHQoKSk7Ci0gICAgICAgIHJldHVybiBTdHJldGNoRElCaXRzKHBTb3VyY2UsIGNvbG9yLCBsZWZ0IC0gcFNyY1JlY3QtPmxlZnQsIHRvcCAtIHBTcmNSZWN0LT50b3AsIHBTb3VyY2UtPkdldFdpZHRoKCksIHBTb3VyY2UtPkdldEhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpcF9yZWN0LCAwLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIH0KLSAgICBBU1NFUlQocFNvdXJjZSAhPSBOVUxMICYmICFwU291cmNlLT5Jc0FscGhhTWFzaygpICYmIHBTcmNSZWN0ICE9IE5VTEwpOwotICAgIEFTU0VSVChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCk7Ci0gICAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKLSAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEdESV9TZXRESUJpdHMocEJpdG1hcCwgcFNyY1JlY3QsIGxlZnQsIHRvcCwgcEljY1RyYW5zZm9ybSk7CitGWF9CT09MIENHZGlQcmludGVyRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKKyAgICBGWF9SRUNUIGNsaXBfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwU3JjUmVjdC0+V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBwU3JjUmVjdC0+SGVpZ2h0KCkpOworICAgIHJldHVybiBTdHJldGNoRElCaXRzKHBTb3VyY2UsIGNvbG9yLCBsZWZ0IC0gcFNyY1JlY3QtPmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9wIC0gcFNyY1JlY3QtPnRvcCwgcFNvdXJjZS0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU291cmNlLT5HZXRIZWlnaHQoKSwgJmNsaXBfcmVjdCwgMCwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtLCBGWERJQl9CTEVORF9OT1JNQUwpOworICB9CisgIEFTU0VSVChwU291cmNlICE9IE5VTEwgJiYgIXBTb3VyY2UtPklzQWxwaGFNYXNrKCkgJiYgcFNyY1JlY3QgIT0gTlVMTCk7CisgIEFTU0VSVChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCk7CisgIGlmIChwU291cmNlLT5IYXNBbHBoYSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKKyAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gR0RJX1NldERJQml0cyhwQml0bWFwLCBwU3JjUmVjdCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKIH0KLUZYX0JPT0wgQ0dkaVByaW50ZXJEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIGludCBhbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKLSAgICAgICAgaWYgKHBTb3VyY2UtPkdldEJQUCgpICE9IDEgfHwgYWxwaGEgIT0gMjU1IHx8ICFtX2JTdXBwb3J0Uk9QKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlc3Rfd2lkdGggPCAwIHx8IGRlc3RfaGVpZ2h0IDwgMCkgewotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRmxpcHBlZCA9IHBTb3VyY2UtPkZsaXBJbWFnZShkZXN0X3dpZHRoIDwgMCwgZGVzdF9oZWlnaHQgPCAwKTsKLSAgICAgICAgICAgIGlmIChwRmxpcHBlZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlc3Rfd2lkdGggPCAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9sZWZ0ICs9IGRlc3Rfd2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVzdF9oZWlnaHQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF90b3AgKz0gZGVzdF9oZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CT09MIHJldCA9IEdESV9TdHJldGNoQml0TWFzayhwRmxpcHBlZCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgYWJzKGRlc3Rfd2lkdGgpLCBhYnMoZGVzdF9oZWlnaHQpLCBjb2xvciwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgZGVsZXRlIHBGbGlwcGVkOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7Ci0gICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gR0RJX1N0cmV0Y2hCaXRNYXNrKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBjb2xvciwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgIH0KLSAgICBpZiAocFNvdXJjZS0+SGFzQWxwaGEoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENHZGlQcmludGVyRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBpZiAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSkgeworICAgIGludCBhbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9BKGNvbG9yKTsKKyAgICBpZiAocFNvdXJjZS0+R2V0QlBQKCkgIT0gMSB8fCBhbHBoYSAhPSAyNTUgfHwgIW1fYlN1cHBvcnRST1ApIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgaWYgKGRlc3Rfd2lkdGggPCAwIHx8IGRlc3RfaGVpZ2h0IDwgMCkgewotICAgICAgICBDRlhfRElCaXRtYXAqIHBGbGlwcGVkID0gcFNvdXJjZS0+RmxpcEltYWdlKGRlc3Rfd2lkdGggPCAwLCBkZXN0X2hlaWdodCA8IDApOwotICAgICAgICBpZiAocEZsaXBwZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXN0X3dpZHRoIDwgMCkgewotICAgICAgICAgICAgZGVzdF9sZWZ0ICs9IGRlc3Rfd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkgewotICAgICAgICAgICAgZGVzdF90b3AgKz0gZGVzdF9oZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCByZXQgPSBHRElfU3RyZXRjaERJQml0cyhwRmxpcHBlZCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgYWJzKGRlc3Rfd2lkdGgpLCBhYnMoZGVzdF9oZWlnaHQpLCBmbGFncywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIGRlbGV0ZSBwRmxpcHBlZDsKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIENGWF9ESUJpdG1hcCogcEZsaXBwZWQgPQorICAgICAgICAgIHBTb3VyY2UtPkZsaXBJbWFnZShkZXN0X3dpZHRoIDwgMCwgZGVzdF9oZWlnaHQgPCAwKTsKKyAgICAgIGlmIChwRmxpcHBlZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChkZXN0X3dpZHRoIDwgMCkgeworICAgICAgICBkZXN0X2xlZnQgKz0gZGVzdF93aWR0aDsKKyAgICAgIH0KKyAgICAgIGlmIChkZXN0X2hlaWdodCA8IDApIHsKKyAgICAgICAgZGVzdF90b3AgKz0gZGVzdF9oZWlnaHQ7CisgICAgICB9CisgICAgICBGWF9CT09MIHJldCA9IEdESV9TdHJldGNoQml0TWFzayhwRmxpcHBlZCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhkZXN0X3dpZHRoKSwgYWJzKGRlc3RfaGVpZ2h0KSwgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgICBkZWxldGUgcEZsaXBwZWQ7CisgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7CiAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIEdESV9TdHJldGNoRElCaXRzKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgcEljY1RyYW5zZm9ybSk7Ci19Ci1zdGF0aWMgQ0ZYX0RJQml0bWFwKiBUcmFuc2Zvcm0xYnBwQml0bWFwKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXN0TWF0cml4KQotewotICAgIEFTU0VSVChwU3JjLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwUmdiIHx8IHBTcmMtPkdldEZvcm1hdCgpID09IEZYRElCXzFicHBNYXNrIHx8IHBTcmMtPkdldEZvcm1hdCgpID09IEZYRElCXzFicHBDbXlrKTsKLSAgICBDRlhfRmxvYXRSZWN0IHVuaXRfcmVjdCA9IHBEZXN0TWF0cml4LT5HZXRVbml0UmVjdCgpOwotICAgIEZYX1JFQ1QgZnVsbF9yZWN0ID0gdW5pdF9yZWN0LkdldE91dHRlclJlY3QoKTsKLSAgICBpbnQgZnVsbF9sZWZ0ID0gZnVsbF9yZWN0LmxlZnQ7Ci0gICAgaW50IGZ1bGxfdG9wID0gZnVsbF9yZWN0LnRvcDsKLSAgICBDRlhfRElCRXh0cmFjdG9yIHNyY19iaXRtYXAocFNyYyk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwU3JjQml0bWFwID0gc3JjX2JpdG1hcDsKLSAgICBpZiAocFNyY0JpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpbnQgc3JjX3dpZHRoID0gcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwgc3JjX2hlaWdodCA9IHBTcmNCaXRtYXAtPkdldEhlaWdodCgpOwotICAgIHVpbnQ4X3QqIHNyY19idWYgPSBwU3JjQml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICBGWF9EV09SRCBzcmNfcGl0Y2ggPSBwU3JjQml0bWFwLT5HZXRQaXRjaCgpOwotICAgIEZYX0ZMT0FUIGRlc3RfYXJlYSA9IHBEZXN0TWF0cml4LT5HZXRVbml0QXJlYSgpOwotICAgIEZYX0ZMT0FUIGFyZWFfc2NhbGUgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShzcmNfd2lkdGggKiBzcmNfaGVpZ2h0KSwgZGVzdF9hcmVhKTsKLSAgICBGWF9GTE9BVCBzaXplX3NjYWxlID0gRlhTWVNfc3FydChhcmVhX3NjYWxlKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IGFkanVzdGVkX21hdHJpeCgqcERlc3RNYXRyaXgpOwotICAgIGFkanVzdGVkX21hdHJpeC5TY2FsZShzaXplX3NjYWxlLCBzaXplX3NjYWxlKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJlc3VsdF9yZWN0X2YgPSBhZGp1c3RlZF9tYXRyaXguR2V0VW5pdFJlY3QoKTsKLSAgICBGWF9SRUNUIHJlc3VsdF9yZWN0ID0gcmVzdWx0X3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBzcmMycmVzdWx0OwotICAgIHNyYzJyZXN1bHQuZSA9IGFkanVzdGVkX21hdHJpeC5jICsgYWRqdXN0ZWRfbWF0cml4LmU7Ci0gICAgc3JjMnJlc3VsdC5mID0gYWRqdXN0ZWRfbWF0cml4LmQgKyBhZGp1c3RlZF9tYXRyaXguZjsKLSAgICBzcmMycmVzdWx0LmEgPSBhZGp1c3RlZF9tYXRyaXguYSAvIHBTcmNCaXRtYXAtPkdldFdpZHRoKCk7Ci0gICAgc3JjMnJlc3VsdC5iID0gYWRqdXN0ZWRfbWF0cml4LmIgLyBwU3JjQml0bWFwLT5HZXRXaWR0aCgpOwotICAgIHNyYzJyZXN1bHQuYyA9IC1hZGp1c3RlZF9tYXRyaXguYyAvIHBTcmNCaXRtYXAtPkdldEhlaWdodCgpOwotICAgIHNyYzJyZXN1bHQuZCA9IC1hZGp1c3RlZF9tYXRyaXguZCAvIHBTcmNCaXRtYXAtPkdldEhlaWdodCgpOwotICAgIHNyYzJyZXN1bHQuVHJhbnNsYXRlSSgtcmVzdWx0X3JlY3QubGVmdCwgLXJlc3VsdF9yZWN0LnRvcCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCByZXN1bHQyc3JjOwotICAgIHJlc3VsdDJzcmMuU2V0UmV2ZXJzZShzcmMycmVzdWx0KTsKLSAgICBDUERGX0ZpeGVkTWF0cml4IHJlc3VsdDJzcmNfZml4KHJlc3VsdDJzcmMsIDgpOwotICAgIGludCByZXN1bHRfd2lkdGggPSByZXN1bHRfcmVjdC5XaWR0aCgpOwotICAgIGludCByZXN1bHRfaGVpZ2h0ID0gcmVzdWx0X3JlY3QuSGVpZ2h0KCk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwVGVtcEJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFwVGVtcEJpdG1hcCkgewotICAgICAgICBpZiAocFNyY0JpdG1hcCAhPSBzcmNfYml0bWFwKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFNyY0JpdG1hcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFwVGVtcEJpdG1hcC0+Q3JlYXRlKHJlc3VsdF93aWR0aCwgcmVzdWx0X2hlaWdodCwgcFNyYy0+R2V0Rm9ybWF0KCkpKSB7Ci0gICAgICAgIGRlbGV0ZSBwVGVtcEJpdG1hcDsKLSAgICAgICAgaWYgKHBTcmNCaXRtYXAgIT0gc3JjX2JpdG1hcCkgewotICAgICAgICAgICAgZGVsZXRlIHBTcmNCaXRtYXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBUZW1wQml0bWFwLT5Db3B5UGFsZXR0ZShwU3JjLT5HZXRQYWxldHRlKCkpOwotICAgIHVpbnQ4X3QqIGRlc3RfYnVmID0gcFRlbXBCaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgIGludCBkZXN0X3BpdGNoID0gcFRlbXBCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCBwU3JjLT5Jc0FscGhhTWFzaygpID8gMCA6IDB4ZmYsIGRlc3RfcGl0Y2ggKiByZXN1bHRfaGVpZ2h0KTsKLSAgICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICBmb3IgKGludCBkZXN0X3kgPSAwOyBkZXN0X3kgPCByZXN1bHRfaGVpZ2h0OyBkZXN0X3kgKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF95ICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgIGZvciAoaW50IGRlc3RfeCA9IDA7IGRlc3RfeCA8IHJlc3VsdF93aWR0aDsgZGVzdF94ICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY194LCBzcmNfeTsKLSAgICAgICAgICAgICAgICByZXN1bHQyc3JjX2ZpeC5UcmFuc2Zvcm0oZGVzdF94LCBkZXN0X3ksIHNyY194LCBzcmNfeSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY194IDwgMCB8fCBzcmNfeCA+PSBzcmNfd2lkdGggfHwgc3JjX3kgPCAwIHx8IHNyY195ID49IHNyY19oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghKChzcmNfYnVmICsgc3JjX3BpdGNoICogc3JjX3kpW3NyY194IC8gOF0gJiAoMSA8PCAoNyAtIHNyY194ICUgOCkpKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfeCAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X3ggJSA4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGRlc3RfeSA9IDA7IGRlc3RfeSA8IHJlc3VsdF9oZWlnaHQ7IGRlc3RfeSArKykgewotICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X3kgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgZm9yIChpbnQgZGVzdF94ID0gMDsgZGVzdF94IDwgcmVzdWx0X3dpZHRoOyBkZXN0X3ggKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIHNyY195OwotICAgICAgICAgICAgICAgIHJlc3VsdDJzcmNfZml4LlRyYW5zZm9ybShkZXN0X3gsIGRlc3RfeSwgc3JjX3gsIHNyY195KTsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX3ggPCAwIHx8IHNyY194ID49IHNyY193aWR0aCB8fCBzcmNfeSA8IDAgfHwgc3JjX3kgPj0gc3JjX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChzcmNfYnVmICsgc3JjX3BpdGNoICogc3JjX3kpW3NyY194IC8gOF0gJiAoMSA8PCAoNyAtIHNyY194ICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF94IC8gOF0gJj0gfigxIDw8ICg3IC0gZGVzdF94ICUgOCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwU3JjQml0bWFwICE9IHNyY19iaXRtYXApIHsKLSAgICAgICAgZGVsZXRlIHBTcmNCaXRtYXA7Ci0gICAgfQotICAgIHJldHVybiBwVGVtcEJpdG1hcDsKLX0KLUZYX0JPT0wJQ0dkaVByaW50ZXJEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgcmVuZGVyX2ZsYWdzLCB2b2lkKiYgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUgfHwgcFNvdXJjZS0+SGFzQWxwaGEoKSB8fCAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSAmJiAocFNvdXJjZS0+R2V0QlBQKCkgIT0gMSB8fCAhbV9iU3VwcG9ydFJPUCkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0ZYX0Zsb2F0UmVjdCB1bml0X3JlY3QgPSBwTWF0cml4LT5HZXRVbml0UmVjdCgpOwotICAgIEZYX1JFQ1QgZnVsbF9yZWN0ID0gdW5pdF9yZWN0LkdldE91dHRlclJlY3QoKTsKLSAgICBpZiAoRlhTWVNfZmFicyhwTWF0cml4LT5iKSA8IDAuNWYgJiYgcE1hdHJpeC0+YSAhPSAwICYmIEZYU1lTX2ZhYnMocE1hdHJpeC0+YykgPCAwLjVmICYmIHBNYXRyaXgtPmQgIT0gMCkgewotICAgICAgICBGWF9CT09MIGJGbGlwWCA9IHBNYXRyaXgtPmEgPCAwOwotICAgICAgICBGWF9CT09MIGJGbGlwWSA9IHBNYXRyaXgtPmQgPiAwOwotICAgICAgICByZXR1cm4gU3RyZXRjaERJQml0cyhwU291cmNlLCBjb2xvciwgYkZsaXBYID8gZnVsbF9yZWN0LnJpZ2h0IDogZnVsbF9yZWN0LmxlZnQsIGJGbGlwWSA/IGZ1bGxfcmVjdC5ib3R0b20gOiBmdWxsX3JlY3QudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmxpcFggPyAtZnVsbF9yZWN0LldpZHRoKCkgOiBmdWxsX3JlY3QuV2lkdGgoKSwgYkZsaXBZID8gLWZ1bGxfcmVjdC5IZWlnaHQoKSA6IGZ1bGxfcmVjdC5IZWlnaHQoKSwgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7Ci0gICAgfQotICAgIGlmIChGWFNZU19mYWJzKHBNYXRyaXgtPmEpIDwgMC41ZiAmJiBGWFNZU19mYWJzKHBNYXRyaXgtPmQpIDwgMC41ZikgewotICAgICAgICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9IHBTb3VyY2UtPlN3YXBYWShwTWF0cml4LT5jID4gMCwgcE1hdHJpeC0+YiA8IDApOwotICAgICAgICBpZiAocFRyYW5zZm9ybWVkID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIHJldCA9IFN0cmV0Y2hESUJpdHMocFRyYW5zZm9ybWVkLCBjb2xvciwgZnVsbF9yZWN0LmxlZnQsIGZ1bGxfcmVjdC50b3AsIGZ1bGxfcmVjdC5XaWR0aCgpLCBmdWxsX3JlY3QuSGVpZ2h0KCksIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKLSAgICAgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHBTb3VyY2UtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBUcmFuc2Zvcm0xYnBwQml0bWFwKHBTb3VyY2UsIHBNYXRyaXgpOwotICAgICAgICBpZiAocEljY1RyYW5zZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgU2F2ZVN0YXRlKCk7Ci0gICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwotICAgICAgICBwYXRoLkFwcGVuZFJlY3QoMCwgMCwgMS4wZiwgMS4wZik7Ci0gICAgICAgIFNldENsaXBfUGF0aEZpbGwoJnBhdGgsIHBNYXRyaXgsIFdJTkRJTkcpOwotICAgICAgICBGWF9CT09MIHJldCA9IFN0cmV0Y2hESUJpdHMocFRyYW5zZm9ybWVkLCBjb2xvciwgZnVsbF9yZWN0LmxlZnQsIGZ1bGxfcmVjdC50b3AsIGZ1bGxfcmVjdC5XaWR0aCgpLCBmdWxsX3JlY3QuSGVpZ2h0KCksIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKLSAgICAgICAgUmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgIGRlbGV0ZSBwVHJhbnNmb3JtZWQ7Ci0gICAgICAgIGhhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQorICAgIHJldHVybiBHRElfU3RyZXRjaEJpdE1hc2socEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0LCBjb2xvciwgZmxhZ3MsIGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKKyAgfQorICBpZiAocFNvdXJjZS0+SGFzQWxwaGEoKSkgewogICAgIHJldHVybiBGQUxTRTsKLX0KLUNQU091dHB1dDo6Q1BTT3V0cHV0KEhEQyBoREMpCi17Ci0gICAgbV9oREMgPSBoREM7Ci0gICAgbV9wQnVmID0gTlVMTDsKLX0KLUNQU091dHB1dDo6fkNQU091dHB1dCgpCi17Ci0gICAgaWYgKG1fcEJ1ZikgewotICAgICAgICBGWF9GcmVlKG1fcEJ1Zik7CisgIH0KKyAgaWYgKGRlc3Rfd2lkdGggPCAwIHx8IGRlc3RfaGVpZ2h0IDwgMCkgeworICAgIENGWF9ESUJpdG1hcCogcEZsaXBwZWQgPQorICAgICAgICBwU291cmNlLT5GbGlwSW1hZ2UoZGVzdF93aWR0aCA8IDAsIGRlc3RfaGVpZ2h0IDwgMCk7CisgICAgaWYgKHBGbGlwcGVkID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci19Ci12b2lkIENQU091dHB1dDo6SW5pdCgpCi17Ci0gICAgbV9wQnVmID0gRlhfQWxsb2MoRlhfQ0hBUiwgMTAyNik7Ci19Ci12b2lkIENQU091dHB1dDo6T3V0cHV0UFMoY29uc3QgRlhfQ0hBUiogc3RyaW5nLCBpbnQgbGVuKQotewotICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgIGxlbiA9IChpbnQpRlhTWVNfc3RybGVuKHN0cmluZyk7CisgICAgaWYgKGRlc3Rfd2lkdGggPCAwKSB7CisgICAgICBkZXN0X2xlZnQgKz0gZGVzdF93aWR0aDsKICAgICB9Ci0gICAgaW50IHNlbnRfbGVuID0gMDsKLSAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBpbnQgc2VuZF9sZW4gPSBsZW4gPiAxMDI0ID8gMTAyNCA6IGxlbjsKLSAgICAgICAgKihGWF9XT1JEKiltX3BCdWYgPSBzZW5kX2xlbjsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZiArIDIsIHN0cmluZyArIHNlbnRfbGVuLCBzZW5kX2xlbik7Ci0gICAgICAgIGludCByZXQgPSBFeHRFc2NhcGUobV9oREMsIFBBU1NUSFJPVUdILCBzZW5kX2xlbiArIDIsIG1fcEJ1ZiwgMCwgTlVMTCk7Ci0gICAgICAgIHNlbnRfbGVuICs9IHNlbmRfbGVuOwotICAgICAgICBsZW4gLT0gc2VuZF9sZW47CisgICAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkgeworICAgICAgZGVzdF90b3AgKz0gZGVzdF9oZWlnaHQ7CiAgICAgfQorICAgIEZYX0JPT0wgcmV0ID0KKyAgICAgICAgR0RJX1N0cmV0Y2hESUJpdHMocEZsaXBwZWQsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGFicyhkZXN0X3dpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGRlc3RfaGVpZ2h0KSwgZmxhZ3MsIHBJY2NUcmFuc2Zvcm0pOworICAgIGRlbGV0ZSBwRmxpcHBlZDsKKyAgICByZXR1cm4gcmV0OworICB9CisgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKKyAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gR0RJX1N0cmV0Y2hESUJpdHMocEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0LCBmbGFncywgcEljY1RyYW5zZm9ybSk7CiB9Ci1DUFNQcmludGVyRHJpdmVyOjpDUFNQcmludGVyRHJpdmVyKCkKLXsKLSAgICBtX3BQU091dHB1dCA9IE5VTEw7Ci0gICAgbV9iQ215a091dHB1dCA9IEZBTFNFOwotfQotQ1BTUHJpbnRlckRyaXZlcjo6fkNQU1ByaW50ZXJEcml2ZXIoKQotewotICAgIEVuZFJlbmRlcmluZygpOwotICAgIGRlbGV0ZSBtX3BQU091dHB1dDsKLX0KLUZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6SW5pdChIREMgaERDLCBpbnQgcHNsZXZlbCwgRlhfQk9PTCBiQ215a091dHB1dCkKLXsKLSAgICBtX2hEQyA9IGhEQzsKLSAgICBtX0hvcnpTaXplID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBIT1JaU0laRSk7Ci0gICAgbV9WZXJ0U2l6ZSA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgVkVSVFNJWkUpOwotICAgIG1fV2lkdGggPSA6OkdldERldmljZUNhcHMobV9oREMsIEhPUlpSRVMpOwotICAgIG1fSGVpZ2h0ID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBWRVJUUkVTKTsKLSAgICBtX25CaXRzUGVyUGl4ZWwgPSA6OkdldERldmljZUNhcHMobV9oREMsIEJJVFNQSVhFTCk7Ci0gICAgbV9wUFNPdXRwdXQgPSBGWF9ORVcgQ1BTT3V0cHV0KGhEQyk7Ci0gICAgaWYgKCFtX3BQU091dHB1dCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitzdGF0aWMgQ0ZYX0RJQml0bWFwKiBUcmFuc2Zvcm0xYnBwQml0bWFwKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBEZXN0TWF0cml4KSB7CisgIEFTU0VSVChwU3JjLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwUmdiIHx8CisgICAgICAgICBwU3JjLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwTWFzayB8fAorICAgICAgICAgcFNyYy0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfMWJwcENteWspOworICBDRlhfRmxvYXRSZWN0IHVuaXRfcmVjdCA9IHBEZXN0TWF0cml4LT5HZXRVbml0UmVjdCgpOworICBGWF9SRUNUIGZ1bGxfcmVjdCA9IHVuaXRfcmVjdC5HZXRPdXR0ZXJSZWN0KCk7CisgIGludCBmdWxsX2xlZnQgPSBmdWxsX3JlY3QubGVmdDsKKyAgaW50IGZ1bGxfdG9wID0gZnVsbF9yZWN0LnRvcDsKKyAgQ0ZYX0RJQkV4dHJhY3RvciBzcmNfYml0bWFwKHBTcmMpOworICBDRlhfRElCaXRtYXAqIHBTcmNCaXRtYXAgPSBzcmNfYml0bWFwOworICBpZiAocFNyY0JpdG1hcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IHNyY193aWR0aCA9IHBTcmNCaXRtYXAtPkdldFdpZHRoKCksIHNyY19oZWlnaHQgPSBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgdWludDhfdCogc3JjX2J1ZiA9IHBTcmNCaXRtYXAtPkdldEJ1ZmZlcigpOworICBGWF9EV09SRCBzcmNfcGl0Y2ggPSBwU3JjQml0bWFwLT5HZXRQaXRjaCgpOworICBGWF9GTE9BVCBkZXN0X2FyZWEgPSBwRGVzdE1hdHJpeC0+R2V0VW5pdEFyZWEoKTsKKyAgRlhfRkxPQVQgYXJlYV9zY2FsZSA9CisgICAgICBGWFNZU19EaXYoKEZYX0ZMT0FUKShzcmNfd2lkdGggKiBzcmNfaGVpZ2h0KSwgZGVzdF9hcmVhKTsKKyAgRlhfRkxPQVQgc2l6ZV9zY2FsZSA9IEZYU1lTX3NxcnQoYXJlYV9zY2FsZSk7CisgIENGWF9BZmZpbmVNYXRyaXggYWRqdXN0ZWRfbWF0cml4KCpwRGVzdE1hdHJpeCk7CisgIGFkanVzdGVkX21hdHJpeC5TY2FsZShzaXplX3NjYWxlLCBzaXplX3NjYWxlKTsKKyAgQ0ZYX0Zsb2F0UmVjdCByZXN1bHRfcmVjdF9mID0gYWRqdXN0ZWRfbWF0cml4LkdldFVuaXRSZWN0KCk7CisgIEZYX1JFQ1QgcmVzdWx0X3JlY3QgPSByZXN1bHRfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBzcmMycmVzdWx0OworICBzcmMycmVzdWx0LmUgPSBhZGp1c3RlZF9tYXRyaXguYyArIGFkanVzdGVkX21hdHJpeC5lOworICBzcmMycmVzdWx0LmYgPSBhZGp1c3RlZF9tYXRyaXguZCArIGFkanVzdGVkX21hdHJpeC5mOworICBzcmMycmVzdWx0LmEgPSBhZGp1c3RlZF9tYXRyaXguYSAvIHBTcmNCaXRtYXAtPkdldFdpZHRoKCk7CisgIHNyYzJyZXN1bHQuYiA9IGFkanVzdGVkX21hdHJpeC5iIC8gcFNyY0JpdG1hcC0+R2V0V2lkdGgoKTsKKyAgc3JjMnJlc3VsdC5jID0gLWFkanVzdGVkX21hdHJpeC5jIC8gcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIHNyYzJyZXN1bHQuZCA9IC1hZGp1c3RlZF9tYXRyaXguZCAvIHBTcmNCaXRtYXAtPkdldEhlaWdodCgpOworICBzcmMycmVzdWx0LlRyYW5zbGF0ZUkoLXJlc3VsdF9yZWN0LmxlZnQsIC1yZXN1bHRfcmVjdC50b3ApOworICBDRlhfQWZmaW5lTWF0cml4IHJlc3VsdDJzcmM7CisgIHJlc3VsdDJzcmMuU2V0UmV2ZXJzZShzcmMycmVzdWx0KTsKKyAgQ1BERl9GaXhlZE1hdHJpeCByZXN1bHQyc3JjX2ZpeChyZXN1bHQyc3JjLCA4KTsKKyAgaW50IHJlc3VsdF93aWR0aCA9IHJlc3VsdF9yZWN0LldpZHRoKCk7CisgIGludCByZXN1bHRfaGVpZ2h0ID0gcmVzdWx0X3JlY3QuSGVpZ2h0KCk7CisgIENGWF9ESUJpdG1hcCogcFRlbXBCaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOworICBpZiAoIXBUZW1wQml0bWFwKSB7CisgICAgaWYgKHBTcmNCaXRtYXAgIT0gc3JjX2JpdG1hcCkgeworICAgICAgZGVsZXRlIHBTcmNCaXRtYXA7CiAgICAgfQotICAgICgoQ1BTT3V0cHV0KiltX3BQU091dHB1dCktPkluaXQoKTsKLSAgICBtX1BTUmVuZGVyZXIuSW5pdChtX3BQU091dHB1dCwgcHNsZXZlbCwgbV9XaWR0aCwgbV9IZWlnaHQsIGJDbXlrT3V0cHV0KTsKLSAgICBtX2JDbXlrT3V0cHV0ID0gYkNteWtPdXRwdXQ7Ci0gICAgSFJHTiBoUmduID0gOjpDcmVhdGVSZWN0UmduKDAsIDAsIDEsIDEpOwotICAgIGludCByZXQgPSA6OkdldENsaXBSZ24oaERDLCBoUmduKTsKLSAgICBpZiAocmV0ID09IDEpIHsKLSAgICAgICAgcmV0ID0gOjpHZXRSZWdpb25EYXRhKGhSZ24sIDAsIE5VTEwpOwotICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICBSR05EQVRBKiBwRGF0YSA9IChSR05EQVRBKilGWF9BbGxvYyh1aW50OF90LCByZXQpOwotICAgICAgICAgICAgcmV0ID0gOjpHZXRSZWdpb25EYXRhKGhSZ24sIHJldCwgcERhdGEpOwotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwotICAgICAgICAgICAgICAgIHBhdGguQWxsb2NQb2ludENvdW50KHBEYXRhLT5yZGgubkNvdW50ICogNSk7Ci0gICAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBEYXRhLT5yZGgubkNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJFQ1QqIHBSZWN0ID0gKFJFQ1QqKShwRGF0YS0+QnVmZmVyICsgcERhdGEtPnJkaC5uUmduU2l6ZSAqIGkpOwotICAgICAgICAgICAgICAgICAgICBwYXRoLkFwcGVuZFJlY3QoKEZYX0ZMT0FUKXBSZWN0LT5sZWZ0LCAoRlhfRkxPQVQpcFJlY3QtPmJvdHRvbSwgKEZYX0ZMT0FUKXBSZWN0LT5yaWdodCwgKEZYX0ZMT0FUKXBSZWN0LT50b3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX1BTUmVuZGVyZXIuU2V0Q2xpcF9QYXRoRmlsbCgmcGF0aCwgTlVMTCwgRlhGSUxMX1dJTkRJTkcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRnJlZShwRGF0YSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCFwVGVtcEJpdG1hcC0+Q3JlYXRlKHJlc3VsdF93aWR0aCwgcmVzdWx0X2hlaWdodCwgcFNyYy0+R2V0Rm9ybWF0KCkpKSB7CisgICAgZGVsZXRlIHBUZW1wQml0bWFwOworICAgIGlmIChwU3JjQml0bWFwICE9IHNyY19iaXRtYXApIHsKKyAgICAgIGRlbGV0ZSBwU3JjQml0bWFwOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwVGVtcEJpdG1hcC0+Q29weVBhbGV0dGUocFNyYy0+R2V0UGFsZXR0ZSgpKTsKKyAgdWludDhfdCogZGVzdF9idWYgPSBwVGVtcEJpdG1hcC0+R2V0QnVmZmVyKCk7CisgIGludCBkZXN0X3BpdGNoID0gcFRlbXBCaXRtYXAtPkdldFBpdGNoKCk7CisgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgcFNyYy0+SXNBbHBoYU1hc2soKSA/IDAgOiAweGZmLAorICAgICAgICAgICAgICAgZGVzdF9waXRjaCAqIHJlc3VsdF9oZWlnaHQpOworICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSkgeworICAgIGZvciAoaW50IGRlc3RfeSA9IDA7IGRlc3RfeSA8IHJlc3VsdF9oZWlnaHQ7IGRlc3RfeSsrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIGRlc3RfeSAqIGRlc3RfcGl0Y2g7CisgICAgICBmb3IgKGludCBkZXN0X3ggPSAwOyBkZXN0X3ggPCByZXN1bHRfd2lkdGg7IGRlc3RfeCsrKSB7CisgICAgICAgIGludCBzcmNfeCwgc3JjX3k7CisgICAgICAgIHJlc3VsdDJzcmNfZml4LlRyYW5zZm9ybShkZXN0X3gsIGRlc3RfeSwgc3JjX3gsIHNyY195KTsKKyAgICAgICAgaWYgKHNyY194IDwgMCB8fCBzcmNfeCA+PSBzcmNfd2lkdGggfHwgc3JjX3kgPCAwIHx8CisgICAgICAgICAgICBzcmNfeSA+PSBzcmNfaGVpZ2h0KSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKCEoKHNyY19idWYgKyBzcmNfcGl0Y2ggKiBzcmNfeSlbc3JjX3ggLyA4XSAmCisgICAgICAgICAgICAgICgxIDw8ICg3IC0gc3JjX3ggJSA4KSkpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuW2Rlc3RfeCAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X3ggJSA4KTsKKyAgICAgIH0KICAgICB9Ci0gICAgOjpEZWxldGVPYmplY3QoaFJnbik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1pbnQgQ1BTUHJpbnRlckRyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkKLXsKLSAgICBzd2l0Y2ggKGNhcHNfaWQpIHsKLSAgICAgICAgY2FzZSBGWERDX0RFVklDRV9DTEFTUzoKLSAgICAgICAgICAgIHJldHVybiBGWERDX1BSSU5URVI7Ci0gICAgICAgIGNhc2UgRlhEQ19QSVhFTF9XSURUSDoKLSAgICAgICAgICAgIHJldHVybiBtX1dpZHRoOwotICAgICAgICBjYXNlIEZYRENfUElYRUxfSEVJR0hUOgotICAgICAgICAgICAgcmV0dXJuIG1fSGVpZ2h0OwotICAgICAgICBjYXNlIEZYRENfQklUU19QSVhFTDoKLSAgICAgICAgICAgIHJldHVybiBtX25CaXRzUGVyUGl4ZWw7Ci0gICAgICAgIGNhc2UgRlhEQ19SRU5ERVJfQ0FQUzoKLSAgICAgICAgICAgIHJldHVybiBtX2JDbXlrT3V0cHV0ID8gRlhSQ19CSVRfTUFTSyB8IEZYUkNfQ01ZS19PVVRQVVQgOiBGWFJDX0JJVF9NQVNLOwotICAgICAgICBjYXNlIEZYRENfSE9SWl9TSVpFOgotICAgICAgICAgICAgcmV0dXJuIG1fSG9yelNpemU7Ci0gICAgICAgIGNhc2UgRlhEQ19WRVJUX1NJWkU6Ci0gICAgICAgICAgICByZXR1cm4gbV9WZXJ0U2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBkZXN0X3kgPSAwOyBkZXN0X3kgPCByZXN1bHRfaGVpZ2h0OyBkZXN0X3krKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X3kgKiBkZXN0X3BpdGNoOworICAgICAgZm9yIChpbnQgZGVzdF94ID0gMDsgZGVzdF94IDwgcmVzdWx0X3dpZHRoOyBkZXN0X3grKykgeworICAgICAgICBpbnQgc3JjX3gsIHNyY195OworICAgICAgICByZXN1bHQyc3JjX2ZpeC5UcmFuc2Zvcm0oZGVzdF94LCBkZXN0X3ksIHNyY194LCBzcmNfeSk7CisgICAgICAgIGlmIChzcmNfeCA8IDAgfHwgc3JjX3ggPj0gc3JjX3dpZHRoIHx8IHNyY195IDwgMCB8fAorICAgICAgICAgICAgc3JjX3kgPj0gc3JjX2hlaWdodCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoc3JjX2J1ZiArIHNyY19waXRjaCAqIHNyY195KVtzcmNfeCAvIDhdICYgKDEgPDwgKDcgLSBzcmNfeCAlIDgpKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbltkZXN0X3ggLyA4XSAmPSB+KDEgPDwgKDcgLSBkZXN0X3ggJSA4KSk7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICB9CisgIGlmIChwU3JjQml0bWFwICE9IHNyY19iaXRtYXApIHsKKyAgICBkZWxldGUgcFNyY0JpdG1hcDsKKyAgfQorICByZXR1cm4gcFRlbXBCaXRtYXA7CiB9Ci1GWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OlN0YXJ0UmVuZGVyaW5nKCkKLXsKLSAgICByZXR1cm4gbV9QU1JlbmRlcmVyLlN0YXJ0UmVuZGVyaW5nKCk7Ci19Ci12b2lkIENQU1ByaW50ZXJEcml2ZXI6OkVuZFJlbmRlcmluZygpCi17Ci0gICAgbV9QU1JlbmRlcmVyLkVuZFJlbmRlcmluZygpOwotfQotdm9pZCBDUFNQcmludGVyRHJpdmVyOjpTYXZlU3RhdGUoKQotewotICAgIG1fUFNSZW5kZXJlci5TYXZlU3RhdGUoKTsKLX0KLXZvaWQgQ1BTUHJpbnRlckRyaXZlcjo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCkKLXsKLSAgICBtX1BTUmVuZGVyZXIuUmVzdG9yZVN0YXRlKGJLZWVwU2F2ZWQpOwotfQotRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgaW50IGZpbGxfbW9kZSkKLXsKLSAgICBtX1BTUmVuZGVyZXIuU2V0Q2xpcF9QYXRoRmlsbChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBmaWxsX21vZGUpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKQotewotICAgIG1fUFNSZW5kZXJlci5TZXRDbGlwX1BhdGhTdHJva2UocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIEZYX0FSR0IgZmlsbF9jb2xvciwgRlhfQVJHQiBzdHJva2VfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDR2RpUHJpbnRlckRyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByZW5kZXJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKGJpdG1hcF9hbHBoYSA8IDI1NSB8fCBwU291cmNlLT5IYXNBbHBoYSgpIHx8CisgICAgICAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSAmJiAocFNvdXJjZS0+R2V0QlBQKCkgIT0gMSB8fCAhbV9iU3VwcG9ydFJPUCkpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9GbG9hdFJlY3QgdW5pdF9yZWN0ID0gcE1hdHJpeC0+R2V0VW5pdFJlY3QoKTsKKyAgRlhfUkVDVCBmdWxsX3JlY3QgPSB1bml0X3JlY3QuR2V0T3V0dGVyUmVjdCgpOworICBpZiAoRlhTWVNfZmFicyhwTWF0cml4LT5iKSA8IDAuNWYgJiYgcE1hdHJpeC0+YSAhPSAwICYmCisgICAgICBGWFNZU19mYWJzKHBNYXRyaXgtPmMpIDwgMC41ZiAmJiBwTWF0cml4LT5kICE9IDApIHsKKyAgICBGWF9CT09MIGJGbGlwWCA9IHBNYXRyaXgtPmEgPCAwOworICAgIEZYX0JPT0wgYkZsaXBZID0gcE1hdHJpeC0+ZCA+IDA7CisgICAgcmV0dXJuIFN0cmV0Y2hESUJpdHMocFNvdXJjZSwgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgYkZsaXBYID8gZnVsbF9yZWN0LnJpZ2h0IDogZnVsbF9yZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYkZsaXBZID8gZnVsbF9yZWN0LmJvdHRvbSA6IGZ1bGxfcmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgYkZsaXBYID8gLWZ1bGxfcmVjdC5XaWR0aCgpIDogZnVsbF9yZWN0LldpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYkZsaXBZID8gLWZ1bGxfcmVjdC5IZWlnaHQoKSA6IGZ1bGxfcmVjdC5IZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKKyAgfQorICBpZiAoRlhTWVNfZmFicyhwTWF0cml4LT5hKSA8IDAuNWYgJiYgRlhTWVNfZmFicyhwTWF0cml4LT5kKSA8IDAuNWYpIHsKKyAgICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9CisgICAgICAgIHBTb3VyY2UtPlN3YXBYWShwTWF0cml4LT5jID4gMCwgcE1hdHJpeC0+YiA8IDApOworICAgIGlmIChwVHJhbnNmb3JtZWQgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gbV9QU1JlbmRlcmVyLkRyYXdQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSAmIDMsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotfQotRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KQotewotICAgICpwUmVjdCA9IG1fUFNSZW5kZXJlci5HZXRDbGlwQm94KCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgRlhfQk9PTCByZXQgPSBTdHJldGNoRElCaXRzKAorICAgICAgICBwVHJhbnNmb3JtZWQsIGNvbG9yLCBmdWxsX3JlY3QubGVmdCwgZnVsbF9yZWN0LnRvcCwgZnVsbF9yZWN0LldpZHRoKCksCisgICAgICAgIGZ1bGxfcmVjdC5IZWlnaHQoKSwgTlVMTCwgMCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7CisgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKKyAgICByZXR1cm4gcmV0OworICB9CisgIGlmIChwU291cmNlLT5HZXRCUFAoKSA9PSAxKSB7CisgICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBUcmFuc2Zvcm0xYnBwQml0bWFwKHBTb3VyY2UsIHBNYXRyaXgpOworICAgIGlmIChwSWNjVHJhbnNmb3JtID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIG1fUFNSZW5kZXJlci5TZXRESUJpdHMocEJpdG1hcCwgY29sb3IsIGxlZnQsIHRvcCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci19Ci1GWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gbV9QU1JlbmRlcmVyLlN0cmV0Y2hESUJpdHMocEJpdG1hcCwgY29sb3IsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci19Ci1GWF9CT09MCUNQU1ByaW50ZXJEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgICAgU2F2ZVN0YXRlKCk7CisgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgICAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIDEuMGYsIDEuMGYpOworICAgIFNldENsaXBfUGF0aEZpbGwoJnBhdGgsIHBNYXRyaXgsIFdJTkRJTkcpOworICAgIEZYX0JPT0wgcmV0ID0gU3RyZXRjaERJQml0cygKKyAgICAgICAgcFRyYW5zZm9ybWVkLCBjb2xvciwgZnVsbF9yZWN0LmxlZnQsIGZ1bGxfcmVjdC50b3AsIGZ1bGxfcmVjdC5XaWR0aCgpLAorICAgICAgICBmdWxsX3JlY3QuSGVpZ2h0KCksIE5VTEwsIDAsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOworICAgIFJlc3RvcmVTdGF0ZSgpOworICAgIGRlbGV0ZSBwVHJhbnNmb3JtZWQ7CiAgICAgaGFuZGxlID0gTlVMTDsKLSAgICByZXR1cm4gbV9QU1JlbmRlcmVyLkRyYXdESUJpdHMocEJpdG1hcCwgY29sb3IsIHBNYXRyaXgsIHJlbmRlcl9mbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MCUNQU1ByaW50ZXJEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICByZXR1cm4gbV9QU1JlbmRlcmVyLkRyYXdUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIHBPYmplY3QyRGV2aWNlLCBmb250X3NpemUsIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKK0NQU091dHB1dDo6Q1BTT3V0cHV0KEhEQyBoREMpIHsKKyAgbV9oREMgPSBoREM7CisgIG1fcEJ1ZiA9IE5VTEw7Cit9CitDUFNPdXRwdXQ6On5DUFNPdXRwdXQoKSB7CisgIGlmIChtX3BCdWYpIHsKKyAgICBGWF9GcmVlKG1fcEJ1Zik7CisgIH0KK30KK3ZvaWQgQ1BTT3V0cHV0OjpJbml0KCkgeworICBtX3BCdWYgPSBGWF9BbGxvYyhGWF9DSEFSLCAxMDI2KTsKK30KK3ZvaWQgQ1BTT3V0cHV0OjpPdXRwdXRQUyhjb25zdCBGWF9DSEFSKiBzdHJpbmcsIGludCBsZW4pIHsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBsZW4gPSAoaW50KUZYU1lTX3N0cmxlbihzdHJpbmcpOworICB9CisgIGludCBzZW50X2xlbiA9IDA7CisgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgaW50IHNlbmRfbGVuID0gbGVuID4gMTAyNCA/IDEwMjQgOiBsZW47CisgICAgKihGWF9XT1JEKiltX3BCdWYgPSBzZW5kX2xlbjsKKyAgICBGWFNZU19tZW1jcHkobV9wQnVmICsgMiwgc3RyaW5nICsgc2VudF9sZW4sIHNlbmRfbGVuKTsKKyAgICBpbnQgcmV0ID0gRXh0RXNjYXBlKG1faERDLCBQQVNTVEhST1VHSCwgc2VuZF9sZW4gKyAyLCBtX3BCdWYsIDAsIE5VTEwpOworICAgIHNlbnRfbGVuICs9IHNlbmRfbGVuOworICAgIGxlbiAtPSBzZW5kX2xlbjsKKyAgfQorfQorQ1BTUHJpbnRlckRyaXZlcjo6Q1BTUHJpbnRlckRyaXZlcigpIHsKKyAgbV9wUFNPdXRwdXQgPSBOVUxMOworICBtX2JDbXlrT3V0cHV0ID0gRkFMU0U7Cit9CitDUFNQcmludGVyRHJpdmVyOjp+Q1BTUHJpbnRlckRyaXZlcigpIHsKKyAgRW5kUmVuZGVyaW5nKCk7CisgIGRlbGV0ZSBtX3BQU091dHB1dDsKK30KK0ZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6SW5pdChIREMgaERDLCBpbnQgcHNsZXZlbCwgRlhfQk9PTCBiQ215a091dHB1dCkgeworICBtX2hEQyA9IGhEQzsKKyAgbV9Ib3J6U2l6ZSA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgSE9SWlNJWkUpOworICBtX1ZlcnRTaXplID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBWRVJUU0laRSk7CisgIG1fV2lkdGggPSA6OkdldERldmljZUNhcHMobV9oREMsIEhPUlpSRVMpOworICBtX0hlaWdodCA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgVkVSVFJFUyk7CisgIG1fbkJpdHNQZXJQaXhlbCA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgQklUU1BJWEVMKTsKKyAgbV9wUFNPdXRwdXQgPSBGWF9ORVcgQ1BTT3V0cHV0KGhEQyk7CisgIGlmICghbV9wUFNPdXRwdXQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgKChDUFNPdXRwdXQqKW1fcFBTT3V0cHV0KS0+SW5pdCgpOworICBtX1BTUmVuZGVyZXIuSW5pdChtX3BQU091dHB1dCwgcHNsZXZlbCwgbV9XaWR0aCwgbV9IZWlnaHQsIGJDbXlrT3V0cHV0KTsKKyAgbV9iQ215a091dHB1dCA9IGJDbXlrT3V0cHV0OworICBIUkdOIGhSZ24gPSA6OkNyZWF0ZVJlY3RSZ24oMCwgMCwgMSwgMSk7CisgIGludCByZXQgPSA6OkdldENsaXBSZ24oaERDLCBoUmduKTsKKyAgaWYgKHJldCA9PSAxKSB7CisgICAgcmV0ID0gOjpHZXRSZWdpb25EYXRhKGhSZ24sIDAsIE5VTEwpOworICAgIGlmIChyZXQpIHsKKyAgICAgIFJHTkRBVEEqIHBEYXRhID0gKFJHTkRBVEEqKUZYX0FsbG9jKHVpbnQ4X3QsIHJldCk7CisgICAgICByZXQgPSA6OkdldFJlZ2lvbkRhdGEoaFJnbiwgcmV0LCBwRGF0YSk7CisgICAgICBpZiAocmV0KSB7CisgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOworICAgICAgICBwYXRoLkFsbG9jUG9pbnRDb3VudChwRGF0YS0+cmRoLm5Db3VudCAqIDUpOworICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcERhdGEtPnJkaC5uQ291bnQ7IGkrKykgeworICAgICAgICAgIFJFQ1QqIHBSZWN0ID0gKFJFQ1QqKShwRGF0YS0+QnVmZmVyICsgcERhdGEtPnJkaC5uUmduU2l6ZSAqIGkpOworICAgICAgICAgIHBhdGguQXBwZW5kUmVjdCgoRlhfRkxPQVQpcFJlY3QtPmxlZnQsIChGWF9GTE9BVClwUmVjdC0+Ym90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpcFJlY3QtPnJpZ2h0LCAoRlhfRkxPQVQpcFJlY3QtPnRvcCk7CisgICAgICAgIH0KKyAgICAgICAgbV9QU1JlbmRlcmVyLlNldENsaXBfUGF0aEZpbGwoJnBhdGgsIE5VTEwsIEZYRklMTF9XSU5ESU5HKTsKKyAgICAgIH0KKyAgICAgIEZYX0ZyZWUocERhdGEpOworICAgIH0KKyAgfQorICA6OkRlbGV0ZU9iamVjdChoUmduKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitpbnQgQ1BTUHJpbnRlckRyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgeworICBzd2l0Y2ggKGNhcHNfaWQpIHsKKyAgICBjYXNlIEZYRENfREVWSUNFX0NMQVNTOgorICAgICAgcmV0dXJuIEZYRENfUFJJTlRFUjsKKyAgICBjYXNlIEZYRENfUElYRUxfV0lEVEg6CisgICAgICByZXR1cm4gbV9XaWR0aDsKKyAgICBjYXNlIEZYRENfUElYRUxfSEVJR0hUOgorICAgICAgcmV0dXJuIG1fSGVpZ2h0OworICAgIGNhc2UgRlhEQ19CSVRTX1BJWEVMOgorICAgICAgcmV0dXJuIG1fbkJpdHNQZXJQaXhlbDsKKyAgICBjYXNlIEZYRENfUkVOREVSX0NBUFM6CisgICAgICByZXR1cm4gbV9iQ215a091dHB1dCA/IEZYUkNfQklUX01BU0sgfCBGWFJDX0NNWUtfT1VUUFVUIDogRlhSQ19CSVRfTUFTSzsKKyAgICBjYXNlIEZYRENfSE9SWl9TSVpFOgorICAgICAgcmV0dXJuIG1fSG9yelNpemU7CisgICAgY2FzZSBGWERDX1ZFUlRfU0laRToKKyAgICAgIHJldHVybiBtX1ZlcnRTaXplOworICB9CisgIHJldHVybiAwOworfQorRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpTdGFydFJlbmRlcmluZygpIHsKKyAgcmV0dXJuIG1fUFNSZW5kZXJlci5TdGFydFJlbmRlcmluZygpOworfQordm9pZCBDUFNQcmludGVyRHJpdmVyOjpFbmRSZW5kZXJpbmcoKSB7CisgIG1fUFNSZW5kZXJlci5FbmRSZW5kZXJpbmcoKTsKK30KK3ZvaWQgQ1BTUHJpbnRlckRyaXZlcjo6U2F2ZVN0YXRlKCkgeworICBtX1BTUmVuZGVyZXIuU2F2ZVN0YXRlKCk7Cit9Cit2b2lkIENQU1ByaW50ZXJEcml2ZXI6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpIHsKKyAgbV9QU1JlbmRlcmVyLlJlc3RvcmVTdGF0ZShiS2VlcFNhdmVkKTsKK30KK0ZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6U2V0Q2xpcF9QYXRoRmlsbCgKKyAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICBpbnQgZmlsbF9tb2RlKSB7CisgIG1fUFNSZW5kZXJlci5TZXRDbGlwX1BhdGhGaWxsKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIGZpbGxfbW9kZSk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoCisgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSkgeworICBtX1BTUmVuZGVyZXIuU2V0Q2xpcF9QYXRoU3Ryb2tlKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gbV9QU1JlbmRlcmVyLkRyYXdQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlICYgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKK30KK0ZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkgeworICAqcFJlY3QgPSBtX1BTUmVuZGVyZXIuR2V0Q2xpcEJveCgpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBtX1BTUmVuZGVyZXIuU2V0RElCaXRzKHBCaXRtYXAsIGNvbG9yLCBsZWZ0LCB0b3AsIGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pOworfQorRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gbV9QU1JlbmRlcmVyLlN0cmV0Y2hESUJpdHMocEJpdG1hcCwgY29sb3IsIGRlc3RfbGVmdCwgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgZmxhZ3MsIGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKK30KK0ZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJlbmRlcl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoYml0bWFwX2FscGhhIDwgMjU1KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGhhbmRsZSA9IE5VTEw7CisgIHJldHVybiBtX1BTUmVuZGVyZXIuRHJhd0RJQml0cyhwQml0bWFwLCBjb2xvciwgcE1hdHJpeCwgcmVuZGVyX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Cit9CitGWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICByZXR1cm4gbV9QU1JlbmRlcmVyLkRyYXdUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3dpbjMyL3dpbjMyX2ludC5oIGIvY29yZS9zcmMvZnhnZS93aW4zMi93aW4zMl9pbnQuaAppbmRleCA1NjljNGY2Li5jYjNiMDE3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL3dpbjMyX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvd2luMzJfaW50LmgKQEAgLTYsMjM3ICs2LDM0OCBAQAogI2lmbmRlZiBDT1JFX1NSQ19GWEdFX1dJTjMyX1dJTjMyX0lOVF9IXwogI2RlZmluZSBDT1JFX1NSQ19GWEdFX1dJTjMyX1dJTjMyX0lOVF9IXwogCi1zdHJ1Y3QgIFdJTkRJQl9PcGVuX0FyZ3NfOwotY2xhc3MgQ0dkaXBsdXNFeHQKLXsKLXB1YmxpYzoKLSAgICBDR2RpcGx1c0V4dCgpOwotICAgIH5DR2RpcGx1c0V4dCgpOwotICAgIHZvaWQJCQlMb2FkKCk7Ci0gICAgRlhfQk9PTAkJCUlzQXZhaWxhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2hNb2R1bGUgIT0gTlVMTDsKLSAgICB9Ci0gICAgRlhfQk9PTAkJCVN0cmV0Y2hCaXRNYXNrKEhEQyBoREMsIEJPT0wgYk1vbm9EZXZpY2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGludCBmbGFncyk7Ci0gICAgRlhfQk9PTAkJCVN0cmV0Y2hESUJpdHMoSERDIGhEQywgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBpbnQgZmxhZ3MpOwotICAgIEZYX0JPT0wJCQlEcmF3UGF0aChIREMgaERDLCBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3Ryb2tlX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICApOworc3RydWN0IFdJTkRJQl9PcGVuX0FyZ3NfOworY2xhc3MgQ0dkaXBsdXNFeHQgeworIHB1YmxpYzoKKyAgQ0dkaXBsdXNFeHQoKTsKKyAgfkNHZGlwbHVzRXh0KCk7CisgIHZvaWQgTG9hZCgpOworICBGWF9CT09MIElzQXZhaWxhYmxlKCkgeyByZXR1cm4gbV9oTW9kdWxlICE9IE5VTEw7IH0KKyAgRlhfQk9PTCBTdHJldGNoQml0TWFzayhIREMgaERDLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgYk1vbm9EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOworICBGWF9CT09MIFN0cmV0Y2hESUJpdHMoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisgIEZYX0JPT0wgRHJhd1BhdGgoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfYXJnYiwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfYXJnYiwKKyAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlKTsKIAotICAgIHZvaWQqCQkJTG9hZE1lbUZvbnQodWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUpOwotICAgIHZvaWQJCQlEZWxldGVNZW1Gb250KHZvaWQqIHBGb250Q29sbGVjdGlvbik7Ci0gICAgRlhfQk9PTCAgICAgICAgIEdkaXBDcmVhdGVGcm9tSW1hZ2Uodm9pZCogYml0bWFwLCB2b2lkKiogZ3JhcGhpY3MpOwotICAgIHZvaWQgICAgICAgICAgICBHZGlwRGVsZXRlR3JhcGhpY3Modm9pZCogZ3JhcGhpY3MpOwotICAgIHZvaWQgICAgICAgICAgICBHZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQodm9pZCogZ3JhcGhpY3MsIGludCBtb2RlKTsKLSAgICB2b2lkICAgICAgICAgICAgR2RpcFNldFBhZ2VVbml0KHZvaWQqIGdyYXBoaWNzLCBGWF9EV09SRCB1bml0KTsKLSAgICB2b2lkICAgICAgICAgICAgR2RpcFNldFdvcmxkVHJhbnNmb3JtKHZvaWQqIGdyYXBoaWNzLCB2b2lkKiBwTWF0cml4KTsKLSAgICBGWF9CT09MICAgICAgICAgR2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCAqZ3JhcGhpY3MsICB1bnNpZ25lZCBzaG9ydCAqdGV4dCwgaW50IGxlbmd0aCwgdm9pZCAqZm9udCwgdm9pZCogYnJ1c2gsIHZvaWQgKnBvc2l0aW9ucywgaW50IGZsYWdzLCBjb25zdCB2b2lkICptYXRyaXgpOwotICAgIHZvaWQgICAgICAgICAgICBHZGlwQ3JlYXRlQnJ1c2goRlhfRFdPUkQgZmlsbF9hcmdiLCB2b2lkKiogcEJydXNoKTsKLSAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUJydXNoKHZvaWQqIHBCcnVzaCk7Ci0gICAgdm9pZCAgICAgICAgICAgIEdkaXBDcmVhdGVNYXRyaXgoRlhfRkxPQVQgYSwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgZCwgRlhfRkxPQVQgZSwgRlhfRkxPQVQgZiwgdm9pZCoqIG1hdHJpeCk7Ci0gICAgdm9pZCAgICAgICAgICAgIEdkaXBEZWxldGVNYXRyaXgodm9pZCogbWF0cml4KTsKLSAgICBGWF9CT09MICAgICAgICAgR2RpcENyZWF0ZUZvbnRGYW1pbHlGcm9tTmFtZShjb25zdCBGWF9XQ0hBUiogbmFtZSwgdm9pZCogcEZvbnRDb2xsZWN0aW9uLCB2b2lkKipwRmFtaWx5KTsKLSAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUZvbnRGYW1pbHkodm9pZCogcEZhbWlseSk7Ci0gICAgRlhfQk9PTCAgICAgICAgIEdkaXBDcmVhdGVGb250RnJvbUZhbWlseSh2b2lkKiBwRmFtaWx5LCBGWF9GTE9BVCBmb250X3NpemUsIGludCBmb250c3R5bGUsIGludCBmbGFnLCB2b2lkKiogcEZvbnQpOwotICAgIHZvaWQqICAgICAgICAgICBHZGlwQ3JlYXRlRm9udEZyb21Db2xsZWN0aW9uKHZvaWQqIHBGb250Q29sbGVjdGlvbiwgRlhfRkxPQVQgZm9udF9zaXplLCBpbnQgZm9udHN0eWxlKTsKLSAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUZvbnQodm9pZCogcEZvbnQpOwotICAgIEZYX0JPT0wgICAgICAgICBHZGlwQ3JlYXRlQml0bWFwKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgdm9pZCoqYml0bWFwKTsKLSAgICB2b2lkICAgICAgICAgICAgR2RpcERpc3Bvc2VJbWFnZSh2b2lkKiBiaXRtYXApOwotICAgIHZvaWQgICAgICAgICAgICBHZGlwR2V0Rm9udFNpemUodm9pZCAqcEZvbnQsIEZYX0ZMT0FUICpzaXplKTsKLSAgICB2b2lkKiAgICAgICAgICAgR2RpQWRkRm9udE1lbVJlc291cmNlRXgodm9pZCAqcEZvbnRkYXRhLCBGWF9EV09SRCBzaXplLCB2b2lkKiBwZHYsIEZYX0RXT1JEKiBudW1fZmFjZSk7Ci0gICAgRlhfQk9PTCAgICAgICAgIEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KHZvaWQqIGhhbmRsZSk7Ci0gICAgdm9pZCoJCQltX0Z1bmN0aW9uc1sxMDBdOwotICAgIHZvaWQqICAgICAgICAgICBtX3BHZGlBZGRGb250TWVtUmVzb3VyY2VFeDsKLSAgICB2b2lkKiAgICAgICAgICAgbV9wR2RpUmVtb3ZlRm9udE1lbVJlc291cnNlRXg7Ci0gICAgQ0ZYX0RJQml0bWFwKglMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncyk7Ci1wcm90ZWN0ZWQ6Ci0gICAgSE1PRFVMRQkJCW1faE1vZHVsZTsKLSAgICBITU9EVUxFICAgICAgICAgbV9HZGlNb2R1bGU7CisgIHZvaWQqIExvYWRNZW1Gb250KHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKTsKKyAgdm9pZCBEZWxldGVNZW1Gb250KHZvaWQqIHBGb250Q29sbGVjdGlvbik7CisgIEZYX0JPT0wgR2RpcENyZWF0ZUZyb21JbWFnZSh2b2lkKiBiaXRtYXAsIHZvaWQqKiBncmFwaGljcyk7CisgIHZvaWQgR2RpcERlbGV0ZUdyYXBoaWNzKHZvaWQqIGdyYXBoaWNzKTsKKyAgdm9pZCBHZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQodm9pZCogZ3JhcGhpY3MsIGludCBtb2RlKTsKKyAgdm9pZCBHZGlwU2V0UGFnZVVuaXQodm9pZCogZ3JhcGhpY3MsIEZYX0RXT1JEIHVuaXQpOworICB2b2lkIEdkaXBTZXRXb3JsZFRyYW5zZm9ybSh2b2lkKiBncmFwaGljcywgdm9pZCogcE1hdHJpeCk7CisgIEZYX0JPT0wgR2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBvc2l0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogbWF0cml4KTsKKyAgdm9pZCBHZGlwQ3JlYXRlQnJ1c2goRlhfRFdPUkQgZmlsbF9hcmdiLCB2b2lkKiogcEJydXNoKTsKKyAgdm9pZCBHZGlwRGVsZXRlQnJ1c2godm9pZCogcEJydXNoKTsKKyAgdm9pZCBHZGlwQ3JlYXRlTWF0cml4KEZYX0ZMT0FUIGEsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBtYXRyaXgpOworICB2b2lkIEdkaXBEZWxldGVNYXRyaXgodm9pZCogbWF0cml4KTsKKyAgRlhfQk9PTCBHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKGNvbnN0IEZYX1dDSEFSKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEZvbnRDb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBGYW1pbHkpOworICB2b2lkIEdkaXBEZWxldGVGb250RmFtaWx5KHZvaWQqIHBGYW1pbHkpOworICBGWF9CT09MIEdkaXBDcmVhdGVGb250RnJvbUZhbWlseSh2b2lkKiBwRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250c3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcEZvbnQpOworICB2b2lkKiBHZGlwQ3JlYXRlRm9udEZyb21Db2xsZWN0aW9uKHZvaWQqIHBGb250Q29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRzdHlsZSk7CisgIHZvaWQgR2RpcERlbGV0ZUZvbnQodm9pZCogcEZvbnQpOworICBGWF9CT09MIEdkaXBDcmVhdGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKiogYml0bWFwKTsKKyAgdm9pZCBHZGlwRGlzcG9zZUltYWdlKHZvaWQqIGJpdG1hcCk7CisgIHZvaWQgR2RpcEdldEZvbnRTaXplKHZvaWQqIHBGb250LCBGWF9GTE9BVCogc2l6ZSk7CisgIHZvaWQqIEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KHZvaWQqIHBGb250ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogbnVtX2ZhY2UpOworICBGWF9CT09MIEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KHZvaWQqIGhhbmRsZSk7CisgIHZvaWQqIG1fRnVuY3Rpb25zWzEwMF07CisgIHZvaWQqIG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4OworICB2b2lkKiBtX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeDsKKyAgQ0ZYX0RJQml0bWFwKiBMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncyk7CisKKyBwcm90ZWN0ZWQ6CisgIEhNT0RVTEUgbV9oTW9kdWxlOworICBITU9EVUxFIG1fR2RpTW9kdWxlOwogfTsKICNpbmNsdWRlICJkd3JpdGVfaW50LmgiCi1jbGFzcyBDV2luMzJQbGF0Zm9ybQotewotcHVibGljOgotICAgIEZYX0JPT0wJCQltX2JIYWxmVG9uZTsKLSAgICBDR2RpcGx1c0V4dAkJbV9HZGlwbHVzRXh0OwotICAgIENEV3JpdGVFeHQgICAgICBtX0RXcml0ZUV4dDsKK2NsYXNzIENXaW4zMlBsYXRmb3JtIHsKKyBwdWJsaWM6CisgIEZYX0JPT0wgbV9iSGFsZlRvbmU7CisgIENHZGlwbHVzRXh0IG1fR2RpcGx1c0V4dDsKKyAgQ0RXcml0ZUV4dCBtX0RXcml0ZUV4dDsKIH07Ci1jbGFzcyBDR2RpRGV2aWNlRHJpdmVyIDogcHVibGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIKLXsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGludAkJR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCk7Ci0gICAgdmlydHVhbCB2b2lkCVNhdmVTdGF0ZSgpCi0gICAgewotICAgICAgICBTYXZlREMobV9oREMpOworY2xhc3MgQ0dkaURldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyIHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgaW50IEdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOworICB2aXJ0dWFsIHZvaWQgU2F2ZVN0YXRlKCkgeyBTYXZlREMobV9oREMpOyB9CisgIHZpcnR1YWwgdm9pZCBSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkID0gRkFMU0UpIHsKKyAgICBSZXN0b3JlREMobV9oREMsIC0xKTsKKyAgICBpZiAoYktlZXBTYXZlZCkgeworICAgICAgU2F2ZURDKG1faERDKTsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQgPSBGQUxTRSkKLSAgICB7Ci0gICAgICAgIFJlc3RvcmVEQyhtX2hEQywgLTEpOwotICAgICAgICBpZiAoYktlZXBTYXZlZCkgewotICAgICAgICAgICAgU2F2ZURDKG1faERDKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgfQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpOworICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKTsKKyAgdmlydHVhbCBGWF9CT09MIERyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKTsKKyAgdmlydHVhbCB2b2lkKiBHZXRDbGlwUmduKCk7CisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwUmduKHZvaWQqIHBSZ24pOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7CisgIHZpcnR1YWwgRlhfQk9PTCBEZWxldGVEZXZpY2VSZ24odm9pZCogcFJnbik7CisgIHZpcnR1YWwgdm9pZCBEcmF3TGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5Mik7CisgIHZpcnR1YWwgdm9pZCogR2V0UGxhdGZvcm1TdXJmYWNlKCkgeyByZXR1cm4gKHZvaWQqKW1faERDOyB9CisgIEZYX0JPT0wgR0RJX1NldERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOworICBGWF9CT09MIEdESV9TdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7CisgIEZYX0JPT0wgR0RJX1N0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBiaXRtYXBfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50CWJsZW5kX3R5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLSAgICB2aXJ0dWFsIHZvaWQqIEdldENsaXBSZ24oKSA7Ci0gICAgdmlydHVhbCBGWF9CT09MIFNldENsaXBSZ24odm9pZCogcFJnbikgOwotICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlRGV2aWNlUmduKHZvaWQqIHBSZ24pOwotICAgIHZpcnR1YWwgdm9pZAlEcmF3TGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5Mik7Ci0gICAgdmlydHVhbCB2b2lkKglHZXRQbGF0Zm9ybVN1cmZhY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICh2b2lkKiltX2hEQzsKLSAgICB9Ci0gICAgRlhfQk9PTAkJCUdESV9TZXRESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgRlhfQk9PTAkJCUdESV9TdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgRlhfQk9PTAkJCUdESV9TdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGJpdG1hcF9jb2xvciwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgSERDCQkJCW1faERDOwotICAgIGludAkJCQltX1dpZHRoLCBtX0hlaWdodCwgbV9uQml0c1BlclBpeGVsOwotICAgIGludAkJCQltX0RldmljZUNsYXNzLCBtX1JlbmRlckNhcHM7Ci0gICAgQ0dkaURldmljZURyaXZlcihIREMgaERDLCBpbnQgZGV2aWNlX2NsYXNzKTsKLSAgICB+Q0dkaURldmljZURyaXZlcigpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOworICBIREMgbV9oREM7CisgIGludCBtX1dpZHRoLCBtX0hlaWdodCwgbV9uQml0c1BlclBpeGVsOworICBpbnQgbV9EZXZpY2VDbGFzcywgbV9SZW5kZXJDYXBzOworICBDR2RpRGV2aWNlRHJpdmVyKEhEQyBoREMsIGludCBkZXZpY2VfY2xhc3MpOworICB+Q0dkaURldmljZURyaXZlcigpIHt9CiB9OwotY2xhc3MgQ0dkaURpc3BsYXlEcml2ZXIgOiBwdWJsaWMgQ0dkaURldmljZURyaXZlcgotewotcHVibGljOgotICAgIENHZGlEaXNwbGF5RHJpdmVyKEhEQyBoREMpOwotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfQk9PTAkJCVVzZUZveGl0U3RyZXRjaEVuZ2luZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBpbnQgcmVuZGVyX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworY2xhc3MgQ0dkaURpc3BsYXlEcml2ZXIgOiBwdWJsaWMgQ0dkaURldmljZURyaXZlciB7CisgcHVibGljOgorICBDR2RpRGlzcGxheURyaXZlcihIREMgaERDKTsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCBGWF9CT09MIEdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJERWRnZSA9IEZBTFNFKTsKKyAgdmlydHVhbCBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7CisgIHZpcnR1YWwgRlhfQk9PTCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJlbmRlcl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9CT09MIFVzZUZveGl0U3RyZXRjaEVuZ2luZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZW5kZXJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIH07Ci1jbGFzcyBDR2RpUHJpbnRlckRyaXZlciA6IHB1YmxpYyBDR2RpRGV2aWNlRHJpdmVyCi17Ci1wdWJsaWM6Ci0gICAgQ0dkaVByaW50ZXJEcml2ZXIoSERDIGhEQyk7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBpbnQJCUdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgaW50CQkJCW1fSG9yelNpemUsIG1fVmVydFNpemU7Ci0gICAgRlhfQk9PTAkJCW1fYlN1cHBvcnRST1A7CitjbGFzcyBDR2RpUHJpbnRlckRyaXZlciA6IHB1YmxpYyBDR2RpRGV2aWNlRHJpdmVyIHsKKyBwdWJsaWM6CisgIENHZGlQcmludGVyRHJpdmVyKEhEQyBoREMpOworCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIGludCBHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKTsKKyAgdmlydHVhbCBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7CisgIHZpcnR1YWwgRlhfQk9PTCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJlbmRlcl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CisgIGludCBtX0hvcnpTaXplLCBtX1ZlcnRTaXplOworICBGWF9CT09MIG1fYlN1cHBvcnRST1A7CiB9OwotY2xhc3MgQ1BTT3V0cHV0IDogcHVibGljIElGWF9QU091dHB1dAotewotcHVibGljOgotICAgIENQU091dHB1dChIREMgaERDKTsKLSAgICB2aXJ0dWFsIH5DUFNPdXRwdXQoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0KLSAgICB2b2lkIEluaXQoKTsKLSAgICB2aXJ0dWFsIHZvaWQJT3V0cHV0UFMoY29uc3QgRlhfQ0hBUiogc3RyaW5nLCBpbnQgbGVuKTsKLSAgICBIREMJCQkJbV9oREM7Ci0gICAgRlhfQ0hBUiogICAgICAgIG1fcEJ1ZjsKK2NsYXNzIENQU091dHB1dCA6IHB1YmxpYyBJRlhfUFNPdXRwdXQgeworIHB1YmxpYzoKKyAgQ1BTT3V0cHV0KEhEQyBoREMpOworICB2aXJ0dWFsIH5DUFNPdXRwdXQoKTsKKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9CisgIHZvaWQgSW5pdCgpOworICB2aXJ0dWFsIHZvaWQgT3V0cHV0UFMoY29uc3QgRlhfQ0hBUiogc3RyaW5nLCBpbnQgbGVuKTsKKyAgSERDIG1faERDOworICBGWF9DSEFSKiBtX3BCdWY7CiB9OwotY2xhc3MgQ1BTUHJpbnRlckRyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BTUHJpbnRlckRyaXZlcigpOwotICAgIEZYX0JPT0wJCQlJbml0KEhEQyBoREMsIGludCBwc19sZXZlbCwgRlhfQk9PTCBiQ215a091dHB1dCk7Ci0gICAgfkNQU1ByaW50ZXJEcml2ZXIoKTsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICB2aXJ0dWFsIGludAkJR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0UmVuZGVyaW5nKCk7Ci0gICAgdmlydHVhbCB2b2lkCUVuZFJlbmRlcmluZygpOwotICAgIHZpcnR1YWwgdm9pZAlTYXZlU3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKK2NsYXNzIENQU1ByaW50ZXJEcml2ZXIgOiBwdWJsaWMgSUZYX1JlbmRlckRldmljZURyaXZlciB7CisgcHVibGljOgorICBDUFNQcmludGVyRHJpdmVyKCk7CisgIEZYX0JPT0wgSW5pdChIREMgaERDLCBpbnQgcHNfbGV2ZWwsIEZYX0JPT0wgYkNteWtPdXRwdXQpOworICB+Q1BTUHJpbnRlckRyaXZlcigpOworCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkgeyByZXR1cm4gVFJVRTsgfQorICB2aXJ0dWFsIGludCBHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKTsKKyAgdmlydHVhbCBGWF9CT09MIFN0YXJ0UmVuZGVyaW5nKCk7CisgIHZpcnR1YWwgdm9pZCBFbmRSZW5kZXJpbmcoKTsKKyAgdmlydHVhbCB2b2lkIFNhdmVTdGF0ZSgpOworICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKTsKKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlKTsKKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIHZvaWQqJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCB2b2lkKglHZXRQbGF0Zm9ybVN1cmZhY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICh2b2lkKiltX2hEQzsKLSAgICB9Ci0gICAgSERDCQkJCW1faERDOwotICAgIEZYX0JPT0wJCQltX2JDbXlrT3V0cHV0OwotICAgIGludAkJCQltX1dpZHRoLCBtX0hlaWdodCwgbV9uQml0c1BlclBpeGVsOwotICAgIGludAkJCQltX0hvcnpTaXplLCBtX1ZlcnRTaXplOwotICAgIENQU091dHB1dCoJCW1fcFBTT3V0cHV0OwotICAgIENGWF9QU1JlbmRlcmVyCW1fUFNSZW5kZXJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKTsKKyAgdmlydHVhbCBGWF9CT09MIERyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKKyAgdmlydHVhbCBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7CisgIHZpcnR1YWwgRlhfQk9PTCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJlbmRlcl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7CisgIHZpcnR1YWwgdm9pZCogR2V0UGxhdGZvcm1TdXJmYWNlKCkgeyByZXR1cm4gKHZvaWQqKW1faERDOyB9CisgIEhEQyBtX2hEQzsKKyAgRlhfQk9PTCBtX2JDbXlrT3V0cHV0OworICBpbnQgbV9XaWR0aCwgbV9IZWlnaHQsIG1fbkJpdHNQZXJQaXhlbDsKKyAgaW50IG1fSG9yelNpemUsIG1fVmVydFNpemU7CisgIENQU091dHB1dCogbV9wUFNPdXRwdXQ7CisgIENGWF9QU1JlbmRlcmVyIG1fUFNSZW5kZXJlcjsKIH07Ci12b2lkIF9Db2xvcjJBcmdiKEZYX0FSR0ImIGFyZ2IsIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Cit2b2lkIF9Db2xvcjJBcmdiKEZYX0FSR0ImIGFyZ2IsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlhHRV9XSU4zMl9XSU4zMl9JTlRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmgKaW5kZXggM2JlNDlmYy4uNzk3ODE1MCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmgKQEAgLTEyLDM5ICsxMiw0MyBAQAogY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OwogY2xhc3MgQ1BERlNES19Bbm5vdDsKIAotY2xhc3MgQ0JBX0ZvbnRNYXAgOiBwdWJsaWMgQ1BXTF9Gb250TWFwCi17Ci1wdWJsaWM6Ci0JQ0JBX0ZvbnRNYXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOwotCUNCQV9Gb250TWFwKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0LCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOworY2xhc3MgQ0JBX0ZvbnRNYXAgOiBwdWJsaWMgQ1BXTF9Gb250TWFwIHsKKyBwdWJsaWM6CisgIENCQV9Gb250TWFwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKTsKKyAgQ0JBX0ZvbnRNYXAoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsCisgICAgICAgICAgICAgIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcik7CiAKLQl2aXJ0dWFsIH5DQkFfRm9udE1hcCgpOworICB2aXJ0dWFsIH5DQkFfRm9udE1hcCgpOwogCi0JdmlydHVhbCB2b2lkCQkJCUluaXRpYWwoY29uc3QgRlhfQ0hBUiogZm9udG5hbWUgPSBOVUxMKTsKKyAgdmlydHVhbCB2b2lkIEluaXRpYWwoY29uc3QgRlhfQ0hBUiogZm9udG5hbWUgPSBOVUxMKTsKIAotcHVibGljOgotCXZvaWQJCQkJCQlTZXREZWZhdWx0Rm9udChDUERGX0ZvbnQgKiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJiBzRm9udE5hbWUpOworIHB1YmxpYzoKKyAgdm9pZCBTZXREZWZhdWx0Rm9udChDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKTsKIAotCXZvaWQJCQkJCQlSZXNldCgpOwotCXZvaWQJCQkJCQlTZXRBUFR5cGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUpOworICB2b2lkIFJlc2V0KCk7CisgIHZvaWQgU2V0QVBUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlKTsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgQ1BERl9Gb250KgkJCUZpbmRGb250U2FtZUNoYXJzZXQoQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsIGludDMyX3QgbkNoYXJzZXQpOwotCXZpcnR1YWwgdm9pZAkJCQlBZGRlZEZvbnQoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMpOwotCXZpcnR1YWwgQ1BERl9Eb2N1bWVudCoJCUdldERvY3VtZW50KCk7Ci1wcml2YXRlOgotCUNQREZfRm9udCoJCQkJCUZpbmRSZXNGb250U2FtZUNoYXJzZXQoQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsCi0JCQkJCQkJCQlpbnQzMl90IG5DaGFyc2V0KTsKLQlDUERGX0ZvbnQqCQkJCQlHZXRBbm5vdERlZmF1bHRGb250KENGWF9CeXRlU3RyaW5nICZjc05hbWVUYWcpOwotCXZvaWQJCQkJCQlBZGRGb250VG9Bbm5vdERpY3QoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBbGlhcyk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIENQREZfRm9udCogRmluZEZvbnRTYW1lQ2hhcnNldChDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCk7CisgIHZpcnR1YWwgdm9pZCBBZGRlZEZvbnQoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMpOworICB2aXJ0dWFsIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCk7CiAKLXByaXZhdGU6Ci0JQ1BERl9Eb2N1bWVudCoJCQkJbV9wRG9jdW1lbnQ7Ci0JQ1BERl9EaWN0aW9uYXJ5KgkJCW1fcEFubm90RGljdDsKLQlDUERGX0ZvbnQqCQkJCQltX3BEZWZhdWx0Rm9udDsKLQlDRlhfQnl0ZVN0cmluZwkJCQltX3NEZWZhdWx0Rm9udE5hbWU7CisgcHJpdmF0ZToKKyAgQ1BERl9Gb250KiBGaW5kUmVzRm9udFNhbWVDaGFyc2V0KENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQpOworICBDUERGX0ZvbnQqIEdldEFubm90RGVmYXVsdEZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CisgIHZvaWQgQWRkRm9udFRvQW5ub3REaWN0KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQWxpYXMpOwogCi0JQ0ZYX0J5dGVTdHJpbmcJCQkJbV9zQVBUeXBlOworIHByaXZhdGU6CisgIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OworICBDUERGX0RpY3Rpb25hcnkqIG1fcEFubm90RGljdDsKKyAgQ1BERl9Gb250KiBtX3BEZWZhdWx0Rm9udDsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9zRGVmYXVsdEZvbnROYW1lOworCisgIENGWF9CeXRlU3RyaW5nIG1fc0FQVHlwZTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX0NCQV9GT05UTUFQX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5oCmluZGV4IDNkZWVhZTguLjBhYzcxNzAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5oCkBAIC05LDIxICs5LDI1IEBACiAKICNpbmNsdWRlICJGRkxfRm9ybUZpbGxlci5oIgogCi1jbGFzcyBDRkZMX0NoZWNrQm94IDogcHVibGljIENGRkxfQnV0dG9uCi17Ci1wdWJsaWM6Ci0JQ0ZGTF9DaGVja0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7Ci0JdmlydHVhbCB+Q0ZGTF9DaGVja0JveCgpOworY2xhc3MgQ0ZGTF9DaGVja0JveCA6IHB1YmxpYyBDRkZMX0J1dHRvbiB7CisgcHVibGljOgorICBDRkZMX0NoZWNrQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKKyAgdmlydHVhbCB+Q0ZGTF9DaGVja0JveCgpOwogCi0JdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdmlydHVhbCBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0JdmlydHVhbCB2b2lkCQkJCVNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZpcnR1YWwgRlhfQk9PTCBJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZpcnR1YWwgdm9pZCBTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfQ0hFQ0tCT1hfSF8KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guaAppbmRleCAwYWRlMWJjLi4xYTNjMjBjIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guaApAQCAtMTMsNjIgKzEzLDY5IEBACiBjbGFzcyBDQkFfRm9udE1hcDsKIGNsYXNzIENQREZTREtfRG9jdW1lbnQ7CiAKLXN0cnVjdCBGRkxfQ29tYm9Cb3hTdGF0ZQotewotCWludCBuSW5kZXg7Ci0JaW50IG5TdGFydDsKLQlpbnQgbkVuZDsKLQlDRlhfV2lkZVN0cmluZyBzVmFsdWU7CitzdHJ1Y3QgRkZMX0NvbWJvQm94U3RhdGUgeworICBpbnQgbkluZGV4OworICBpbnQgblN0YXJ0OworICBpbnQgbkVuZDsKKyAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlOwogfTsKIAotY2xhc3MgQ0ZGTF9Db21ib0JveCA6IHB1YmxpYyBDRkZMX0Zvcm1GaWxsZXIsIHB1YmxpYyBJUFdMX0ZvY3VzSGFuZGxlciwgcHVibGljIElQV0xfRWRpdF9Ob3RpZnkKLXsKLXB1YmxpYzoKLQlDRkZMX0NvbWJvQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBXaWRnZXQpOwotCXZpcnR1YWwgfkNGRkxfQ29tYm9Cb3goKTsKK2NsYXNzIENGRkxfQ29tYm9Cb3ggOiBwdWJsaWMgQ0ZGTF9Gb3JtRmlsbGVyLAorICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJUFdMX0ZvY3VzSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVBXTF9FZGl0X05vdGlmeSB7CisgcHVibGljOgorICBDRkZMX0NvbWJvQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBXaWRnZXQpOworICB2aXJ0dWFsIH5DRkZMX0NvbWJvQm94KCk7CiAKLQl2aXJ0dWFsCVBXTF9DUkVBVEVQQVJBTQkJR2V0Q3JlYXRlUGFyYW0oKTsKLQl2aXJ0dWFsIENQV0xfV25kKgkJCU5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIFBXTF9DUkVBVEVQQVJBTSBHZXRDcmVhdGVQYXJhbSgpOworICB2aXJ0dWFsIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CisgIHZpcnR1YWwgRlhfQk9PTCBJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZpcnR1YWwgdm9pZCBTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdmlydHVhbCB2b2lkIEdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiYgZmEpOworICB2aXJ0dWFsIHZvaWQgU2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7CisgIHZpcnR1YWwgRlhfQk9PTCBJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldyk7CisgIHZpcnR1YWwgdm9pZCBTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdmlydHVhbCB2b2lkIFJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0gCXZpcnR1YWwgdm9pZAkJCQlHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKLSAJdmlydHVhbCB2b2lkCQkJCVNldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpOwotIAl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpOwotCXZpcnR1YWwgdm9pZAkJCQlTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIHZvaWQJCQkJUmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZpcnR1YWwgQ1BXTF9XbmQqIFJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIE9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpOwogCi0JdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgSXNGaWVsZEZ1bGwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0ZpZWxkRnVsbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIE9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpOworICB2aXJ0dWFsIHZvaWQgT25LaWxsRm9jdXMoQ1BXTF9XbmQqIHBXbmQpOwogCi1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbktpbGxGb2N1cyhDUFdMX1duZCogcFduZCk7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgT25BZGRVbmRvKENQV0xfRWRpdCogcEVkaXQpOwogCi1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJCU9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KTsKKyBwdWJsaWM6CisgIHZpcnR1YWwgRlhfQk9PTCBDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIHZpcnR1YWwgRlhfQk9PTCBDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgdmlydHVhbCBGWF9CT09MIENhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgdmlydHVhbCB2b2lkIERvQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB2aXJ0dWFsIHZvaWQgRG9DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgdmlydHVhbCB2b2lkIERvUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIAotCXZpcnR1YWwgdm9pZAkJCQlEb0NvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIHZvaWQJCQkJRG9DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIHZvaWQJCQkJRG9QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworIHByaXZhdGU6CisgIENGWF9XaWRlU3RyaW5nIEdldFNlbGVjdEV4cG9ydFRleHQoKTsKIAotcHJpdmF0ZToKLQlDRlhfV2lkZVN0cmluZwkJCQlHZXRTZWxlY3RFeHBvcnRUZXh0KCk7Ci0KLXByaXZhdGU6Ci0JQ0JBX0ZvbnRNYXAqCQkJCW1fcEZvbnRNYXA7Ci0JRkZMX0NvbWJvQm94U3RhdGUJCQkJbV9TdGF0ZTsKKyBwcml2YXRlOgorICBDQkFfRm9udE1hcCogbV9wRm9udE1hcDsKKyAgRkZMX0NvbWJvQm94U3RhdGUgbV9TdGF0ZTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX0NPTUJPQk9YX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaAppbmRleCAyMTViYmE5Li5mYWI5ODljIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmgKQEAgLTE4LDE0NCArMTgsMTk2IEBACiBjbGFzcyBDUERGU0RLX0RvY3VtZW50OwogY2xhc3MgQ1BERlNES19XaWRnZXQ7CiAKLWNsYXNzIENGRkxfRm9ybUZpbGxlciA6IHB1YmxpYyBJUFdMX1Byb3ZpZGVyLCBwdWJsaWMgQ1BXTF9UaW1lckhhbmRsZXIKLXsKLXB1YmxpYzoKLQlDRkZMX0Zvcm1GaWxsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIH5DRkZMX0Zvcm1GaWxsZXIoKTsKK2NsYXNzIENGRkxfRm9ybUZpbGxlciA6IHB1YmxpYyBJUFdMX1Byb3ZpZGVyLCBwdWJsaWMgQ1BXTF9UaW1lckhhbmRsZXIgeworIHB1YmxpYzoKKyAgQ0ZGTF9Gb3JtRmlsbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHZpcnR1YWwgfkNGRkxfRm9ybUZpbGxlcigpOwogCi0JdmlydHVhbCBGWF9SRUNUCQkJCUdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LAotCQkJCQkJCQkJQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQkJCUZYX0RXT1JEIGR3RmxhZ3MpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLQkJCQkJCQkJCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQlGWF9EV09SRCBkd0ZsYWdzKTsKKyAgdmlydHVhbCBGWF9SRUNUIEdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHZpcnR1YWwgdm9pZCBPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyk7CisgIHZpcnR1YWwgdm9pZCBPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkRlbGV0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2aXJ0dWFsIHZvaWQgT25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCB2b2lkIE9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2aXJ0dWFsIHZvaWQgT25EZWxldGUoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgdm9pZAkJCQlPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHZpcnR1YWwgdm9pZCBPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2aXJ0dWFsIHZvaWQgT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7CiAKLQl2aXJ0dWFsCXZvaWQJCQkJT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0JdmlydHVhbAl2b2lkCQkJCU9uU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCB2b2lkIE9uRGVTZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2aXJ0dWFsIHZvaWQgT25TZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgdmlydHVhbCBGWF9CT09MIENhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgdmlydHVhbCBGWF9CT09MIENhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgQ2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIAotCXZpcnR1YWwgdm9pZAkJCQlEb0NvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIHZvaWQJCQkJRG9DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIHZvaWQJCQkJRG9QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB2aXJ0dWFsIHZvaWQgRG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIHZpcnR1YWwgdm9pZCBEb0N1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB2aXJ0dWFsIHZvaWQgRG9QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwogCi0gICAgICAgIC8vIENQV0xfVGltZXJIYW5kbGVyCi0JdmlydHVhbCB2b2lkCQkJCVRpbWVyUHJvYygpOwotCXZpcnR1YWwgSUZYX1N5c3RlbUhhbmRsZXIqCUdldFN5c3RlbUhhbmRsZXIoKSBjb25zdDsKKyAgLy8gQ1BXTF9UaW1lckhhbmRsZXIKKyAgdmlydHVhbCB2b2lkIFRpbWVyUHJvYygpOworICB2aXJ0dWFsIElGWF9TeXN0ZW1IYW5kbGVyKiBHZXRTeXN0ZW1IYW5kbGVyKCkgY29uc3Q7CiAKLQl2aXJ0dWFsIENQREZfTWF0cml4CQkJR2V0V2luZG93TWF0cml4KHZvaWQqIHBBdHRhY2hlZERhdGEpOwotCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCUxvYWRQb3B1cE1lbnVTdHJpbmcoaW50IG5JbmRleCk7CisgIHZpcnR1YWwgQ1BERl9NYXRyaXggR2V0V2luZG93TWF0cml4KHZvaWQqIHBBdHRhY2hlZERhdGEpOworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIExvYWRQb3B1cE1lbnVTdHJpbmcoaW50IG5JbmRleCk7CiAKLSAJdmlydHVhbCB2b2lkCQkJCUdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCi0gCQkJCQkJCQkJUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7Ci0gCXZpcnR1YWwgdm9pZAkJCQlTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotIAkJCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpOwotIAl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCi0gCQkJCQkJCQkJY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldyk7CisgIHZpcnR1YWwgdm9pZCBHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKKyAgdmlydHVhbCB2b2lkIFNldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpOworICB2aXJ0dWFsIEZYX0JPT0wgSXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpOwogCi0JdmlydHVhbCB2b2lkCQkJCVNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCXZpcnR1YWwgdm9pZAkJCQlSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdmlydHVhbCB2b2lkIFNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLQl2aXJ0dWFsIENQV0xfV25kKiAJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7CisgIHZpcnR1YWwgQ1BXTF9XbmQqIFJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbktleVN0cm9rZShGWF9CT09MIGJLZXlEb3duKTsKKyAgdmlydHVhbCB2b2lkIE9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24pOwogCi0JQ1BERl9NYXRyaXgJCQkJCUdldEN1ck1hdHJpeCgpOworICBDUERGX01hdHJpeCBHZXRDdXJNYXRyaXgoKTsKIAotCUNQREZfUmVjdAkJCQkJRkZMdG9QV0woY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKLQlDUERGX1JlY3QJCQkJCVBXTHRvRkZMKGNvbnN0IENQREZfUmVjdCYgcmVjdCk7Ci0JQ1BERl9Qb2ludAkJCQkJRkZMdG9QV0woY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCUNQREZfUG9pbnQJCQkJCVBXTHRvRkZMKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgQ1BERl9SZWN0IEZGTHRvUFdMKGNvbnN0IENQREZfUmVjdCYgcmVjdCk7CisgIENQREZfUmVjdCBQV0x0b0ZGTChjb25zdCBDUERGX1JlY3QmIHJlY3QpOworICBDUERGX1BvaW50IEZGTHRvUFdMKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgQ1BERl9Qb2ludCBQV0x0b0ZGTChjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQlDUERGX1BvaW50CQkJCQlXbmR0b1BXTChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENQREZfUG9pbnQmIHB0KTsKLQlDUERGX1JlY3QJCQkJCUZGTHRvV25kKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKKyAgQ1BERl9Qb2ludCBXbmR0b1BXTChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENQREZfUG9pbnQmIHB0KTsKKyAgQ1BERl9SZWN0IEZGTHRvV25kKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKIAotCXZvaWQJCQkJCQlTZXRXaW5kb3dSZWN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ1BERl9SZWN0JiByY1dpbmRvdyk7Ci0JQ1BERl9SZWN0CQkJCQlHZXRXaW5kb3dSZWN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZvaWQgU2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENQREZfUmVjdCYgcmNXaW5kb3cpOworICBDUERGX1JlY3QgR2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0JRlhfQk9PTAkJCQkJCUNvbW1pdERhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9VSU5UIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCXZpcnR1YWwgdm9pZAkJCQlTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICBGWF9CT09MIENvbW1pdERhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9VSU5UIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIElzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdmlydHVhbCB2b2lkIFNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNGaWVsZEZ1bGwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdmlydHVhbCBGWF9CT09MIElzRmllbGRGdWxsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLQlDUFdMX1duZCoJCQkJCUdldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYk5ldyk7Ci0Jdm9pZAkJCQkJCURlc3Ryb3lQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2b2lkCQkJCQkJRXNjYXBlRmlsbGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiRGVzdHJveVBERldpbmRvdyk7CisgIENQV0xfV25kKiBHZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJOZXcpOworICB2b2lkIERlc3Ryb3lQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdm9pZCBFc2NhcGVGaWxsZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJEZXN0cm95UERGV2luZG93KTsKIAotCXZpcnR1YWwJUFdMX0NSRUFURVBBUkFNCQlHZXRDcmVhdGVQYXJhbSgpOwotCXZpcnR1YWwgQ1BXTF9XbmQqCQkJTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgPSAwOwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJR2V0Rm9jdXNCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdmlydHVhbCBQV0xfQ1JFQVRFUEFSQU0gR2V0Q3JlYXRlUGFyYW0oKTsKKyAgdmlydHVhbCBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpID0gMDsKKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0Rm9jdXNCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCUZYX0JPT0wJCQkJCQlJc1ZhbGlkKCkgY29uc3Q7Ci0JQ1BERl9SZWN0CQkJCQlHZXRQREZXaW5kb3dSZWN0KCkgY29uc3Q7CisgIEZYX0JPT0wgSXNWYWxpZCgpIGNvbnN0OworICBDUERGX1JlY3QgR2V0UERGV2luZG93UmVjdCgpIGNvbnN0OwogCi0JQ1BERlNES19QYWdlVmlldyoJCQlHZXRDdXJQYWdlVmlldygpOwotCXZvaWQJCQkJCQlTZXRDaGFuZ2VNYXJrKCk7CisgIENQREZTREtfUGFnZVZpZXcqIEdldEN1clBhZ2VWaWV3KCk7CisgIHZvaWQgU2V0Q2hhbmdlTWFyaygpOwogCi0JdmlydHVhbCB2b2lkCQkJCUludmFsaWRhdGVSZWN0KGRvdWJsZSBsZWZ0LCBkb3VibGUgdG9wLCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20pOwotCUNQREZEb2NfRW52aXJvbm1lbnQqCQlHZXRBcHAoKXtyZXR1cm4gbV9wQXBwO30KLQlDUERGU0RLX0Fubm90KgkJCQlHZXRTREtBbm5vdCgpIHtyZXR1cm4gbV9wQW5ub3Q7fQorICB2aXJ0dWFsIHZvaWQgSW52YWxpZGF0ZVJlY3QoZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSk7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIEdldEFwcCgpIHsgcmV0dXJuIG1fcEFwcDsgfQorICBDUERGU0RLX0Fubm90KiBHZXRTREtBbm5vdCgpIHsgcmV0dXJuIG1fcEFubm90OyB9CiAKLXByb3RlY3RlZDoKLSAgICB1c2luZyBDRkZMX1BhZ2VWaWV3MlBERldpbmRvdyA9IHN0ZDo6bWFwPENQREZTREtfUGFnZVZpZXcqLCBDUFdMX1duZCo+OworIHByb3RlY3RlZDoKKyAgdXNpbmcgQ0ZGTF9QYWdlVmlldzJQREZXaW5kb3cgPSBzdGQ6Om1hcDxDUERGU0RLX1BhZ2VWaWV3KiwgQ1BXTF9XbmQqPjsKIAotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEFwcDsKLSAgICBDUERGU0RLX1dpZGdldCogbV9wV2lkZ2V0OwotICAgIENQREZTREtfQW5ub3QqIG1fcEFubm90OworICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7CisgIENQREZTREtfV2lkZ2V0KiBtX3BXaWRnZXQ7CisgIENQREZTREtfQW5ub3QqIG1fcEFubm90OwogCi0gICAgRlhfQk9PTCBtX2JWYWxpZDsKLSAgICBDRkZMX1BhZ2VWaWV3MlBERldpbmRvdyBtX01hcHM7Ci0gICAgQ1BERl9Qb2ludCBtX3B0T2xkUG9zOworICBGWF9CT09MIG1fYlZhbGlkOworICBDRkZMX1BhZ2VWaWV3MlBERldpbmRvdyBtX01hcHM7CisgIENQREZfUG9pbnQgbV9wdE9sZFBvczsKIH07CiAKLWNsYXNzIENGRkxfQnV0dG9uIDogcHVibGljIENGRkxfRm9ybUZpbGxlcgotewotcHVibGljOgotCUNGRkxfQnV0dG9uKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBXaWRnZXQpOwotCXZpcnR1YWwgfkNGRkxfQnV0dG9uKCk7CitjbGFzcyBDRkZMX0J1dHRvbiA6IHB1YmxpYyBDRkZMX0Zvcm1GaWxsZXIgeworIHB1YmxpYzoKKyAgQ0ZGTF9CdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcFdpZGdldCk7CisgIHZpcnR1YWwgfkNGRkxfQnV0dG9uKCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLQkJCQkJCQkJCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQlGWF9EV09SRCBkd0ZsYWdzKTsKKyAgdmlydHVhbCB2b2lkIE9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHZpcnR1YWwgdm9pZCBPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCB2b2lkIE9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKTsKIAotCXZpcnR1YWwJdm9pZAkJCQlPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLQkJCQkJCQkJCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQlGWF9EV09SRCBkd0ZsYWdzKTsKLXByb3RlY3RlZDoKLQlGWF9CT09MCQkJCQkJbV9iTW91c2VJbjsKLQlGWF9CT09MCQkJCQkJbV9iTW91c2VEb3duOworICB2aXJ0dWFsIHZvaWQgT25EcmF3RGVhY3RpdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKTsKKworIHByb3RlY3RlZDoKKyAgRlhfQk9PTCBtX2JNb3VzZUluOworICBGWF9CT09MIG1fYk1vdXNlRG93bjsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX0ZPUk1GSUxMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKaW5kZXggNzA5NjE3MC4uZWNlOGU0YSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKQEAgLTE0LDEwOSArMTQsMjAxIEBACiBjbGFzcyBDRkZMX0Zvcm1GaWxsZXI7CiBjbGFzcyBDRkZMX1ByaXZhdGVEYXRhOwogCi1jbGFzcyBDRkZMX0lGb3JtRmlsbGVyIDogcHVibGljIElQV0xfRmlsbGVyX05vdGlmeQotewotcHVibGljOgotCUNGRkxfSUZvcm1GaWxsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7Ci0JdmlydHVhbCB+Q0ZGTF9JRm9ybUZpbGxlcigpOworY2xhc3MgQ0ZGTF9JRm9ybUZpbGxlciA6IHB1YmxpYyBJUFdMX0ZpbGxlcl9Ob3RpZnkgeworIHB1YmxpYzoKKyAgQ0ZGTF9JRm9ybUZpbGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKTsKKyAgdmlydHVhbCB+Q0ZGTF9JRm9ybUZpbGxlcigpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X0hpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LENQREZTREtfQW5ub3QqIHBBbm5vdCwgQ1BERl9Qb2ludCBwb2ludCk7Ci0JdmlydHVhbCBGWF9SRUNUCQkJCUdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgLypIREMgaERDLCovIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLQkJCQkJCQkJCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQkvKmNvbnN0IENSZWN0JiByY1dpbmRvdywqLyBGWF9EV09SRCBkd0ZsYWdzKTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X0hpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQgcG9pbnQpOworICB2aXJ0dWFsIEZYX1JFQ1QgR2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCB2b2lkIE9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgLypIREMgaERDLCovIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgLypjb25zdCBDUmVjdCYgcmNXaW5kb3csKi8gRlhfRFdPUkQgZHdGbGFncyk7CiAKKyAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHZpcnR1YWwgdm9pZCBPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCB2b2lkIE9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHZpcnR1YWwgdm9pZCBPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFnKTsKKyAgdmlydHVhbCB2b2lkIE9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWcpOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MpOworICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOworICB2aXJ0dWFsIHZvaWQgT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHZpcnR1YWwgdm9pZCBPblNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQl2aXJ0dWFsCXZvaWQJCQkJT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0JdmlydHVhbAl2b2lkCQkJCU9uU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsRlhfVUlOVCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7CisgIHZpcnR1YWwgdm9pZCBRdWVyeVdoZXJlUG9wdXAodm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQb3B1cE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9wdXBNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlBvcHVwUmV0KTsKKyAgdmlydHVhbCB2b2lkIE9uQmVmb3JlS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUHJpdmF0ZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNlbEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCB2b2lkIE9uQWZ0ZXJLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpOwogCi0JdmlydHVhbCB2b2lkCQkJCVF1ZXJ5V2hlcmVQb3B1cCh2b2lkKiBwUHJpdmF0ZURhdGEsIEZYX0ZMT0FUIGZQb3B1cE1pbixGWF9GTE9BVCBmUG9wdXBNYXgsIGludDMyX3QgJiBuUmV0LCBGWF9GTE9BVCAmIGZQb3B1cFJldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uQmVmb3JlS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgaW50MzJfdCBuS2V5Q29kZSwKLQkJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJCWludCBuU2VsU3RhcnQsIGludCBuU2VsRW5kLAotCQkJCQkJCQkJCUZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkFmdGVyS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykgOworICB2aXJ0dWFsIHZvaWQgT25TZXRXaW5kb3dSZWN0KHZvaWQqIHBQcml2YXRlRGF0YSwgY29uc3QgQ1BERl9SZWN0JiByY1dpbmRvdyk7CisgIHZpcnR1YWwgdm9pZCBPbktleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQpOworICB2aXJ0dWFsIHZvaWQgT25Qb3B1cFByZU9wZW4odm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgdm9pZCBPblBvcHVwUG9zdE9wZW4odm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPblNldFdpbmRvd1JlY3Qodm9pZCogcFByaXZhdGVEYXRhLCBjb25zdCBDUERGX1JlY3QgJiByY1dpbmRvdyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgaW50MzJfdCBuS2V5Q29kZSwgQ0ZYX1dpZGVTdHJpbmcgJiBzdHJDaGFuZ2UsCi0JCQkJCQkJCQljb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uUG9wdXBQcmVPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Qb3B1cFBvc3RPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCB2b2lkIEJlZm9yZVVuZG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgdmlydHVhbCB2b2lkIEJlZm9yZVJlZG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgdmlydHVhbCB2b2lkIEFmdGVyVW5kbyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB2aXJ0dWFsIHZvaWQgQWZ0ZXJSZWRvKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJQmVmb3JlVW5kbyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgdm9pZAkJCQlCZWZvcmVSZWRvKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCB2b2lkCQkJCUFmdGVyVW5kbyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgdm9pZAkJCQlBZnRlclJlZG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgdmlydHVhbCBGWF9CT09MIENhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgdmlydHVhbCBGWF9CT09MIENhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgQ2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB2aXJ0dWFsIHZvaWQgRG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIHZpcnR1YWwgdm9pZCBEb0N1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB2aXJ0dWFsIHZvaWQgRG9QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwogCi0JdmlydHVhbCB2b2lkCQkJCURvQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgdm9pZAkJCQlEb0N1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgdm9pZAkJCQlEb1Bhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIENGRkxfRm9ybUZpbGxlciogR2V0Rm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0JPT0wgYlJlZ2lzdGVyKTsKKyAgdm9pZCBSZW1vdmVGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQlDRkZMX0Zvcm1GaWxsZXIqCQkJR2V0Rm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0JPT0wgYlJlZ2lzdGVyKTsKLQl2b2lkCQkJCQkJUmVtb3ZlRm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICBzdGF0aWMgRlhfQk9PTCBJc1Zpc2libGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOworICBzdGF0aWMgRlhfQk9PTCBJc1JlYWRPbmx5KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKKyAgc3RhdGljIEZYX0JPT0wgSXNGaWxsaW5nQWxsb3dlZChDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CisgIHN0YXRpYyBGWF9CT09MIElzVmFsaWRBbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCi0Jc3RhdGljIEZYX0JPT0wJCQkJSXNWaXNpYmxlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKLQlzdGF0aWMgRlhfQk9PTAkJCQlJc1JlYWRPbmx5KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKLQlzdGF0aWMgRlhfQk9PTAkJCQlJc0ZpbGxpbmdBbGxvd2VkKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKLSAJc3RhdGljIEZYX0JPT0wJCQkJSXNWYWxpZEFubm90KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdm9pZCBPbktleVN0cm9rZUNvbW1pdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKTsKKyAgdm9pZCBPblZhbGlkYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDLAorICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZyk7CiAKLQl2b2lkCQkJCQkJT25LZXlTdHJva2VDb21taXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJDLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZvaWQJCQkJCQlPblZhbGlkYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSQywgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdm9pZCBPbkNhbGN1bGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpOworICB2b2lkIE9uRm9ybWF0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZyk7CisgIHZvaWQgT25CdXR0b25VcChDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSZXNldCwKKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZyk7CisgIHZvaWQgT25DbGljayhDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSZXNldCwKKyAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZyk7CisgIHZvaWQgT25GdWxsKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgIEZYX0JPT0wmIGJSZXNldCwKKyAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWcpOworICB2b2lkIE9uUHJlT3BlbihDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmVzZXQsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFnKTsKKyAgdm9pZCBPblBvc3RPcGVuKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJlc2V0LAorICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFnKTsKIAotCXZvaWQJCQkJCQlPbkNhbGN1bGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZvaWQJCQkJCQlPbkZvcm1hdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZvaWQJCQkJCQlPbkJ1dHRvblVwKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSZXNldCwgRlhfQk9PTCYgYkV4aXQsRlhfVUlOVCBuRmxhZyk7Ci0Jdm9pZAkJCQkJCU9uQ2xpY2soQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJlc2V0LCBGWF9CT09MJiBiRXhpdCwgRlhfVUlOVCBuRmxhZyk7Ci0Jdm9pZAkJCQkJCU9uRnVsbChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiUmVzZXQsIEZYX0JPT0wmIGJFeGl0LCBGWF9VSU5UIG5GbGFnKTsKLQl2b2lkCQkJCQkJT25QcmVPcGVuKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSZXNldCwgRlhfQk9PTCYgYkV4aXQsIEZYX1VJTlQgbkZsYWcpOwotCXZvaWQJCQkJCQlPblBvc3RPcGVuKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSZXNldCwgRlhfQk9PTCYgYkV4aXQsIEZYX1VJTlQgbkZsYWcpOworIHByaXZhdGU6CisgIHVzaW5nIENGRkxfV2lkZ2V0MkZpbGxlciA9IHN0ZDo6bWFwPENQREZTREtfQW5ub3QqLCBDRkZMX0Zvcm1GaWxsZXIqPjsKIAotcHJpdmF0ZToKLSAgICB1c2luZyBDRkZMX1dpZGdldDJGaWxsZXIgPSBzdGQ6Om1hcDxDUERGU0RLX0Fubm90KiwgQ0ZGTF9Gb3JtRmlsbGVyKj47CisgIHZvaWQgVW5SZWdpc3RlckZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdm9pZCBTZXRGb2N1c0Fubm90VGFiKENQREZTREtfQW5ub3QqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYW1lRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOZXh0KTsKIAotICAgIHZvaWQgVW5SZWdpc3RlckZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KTsKLSAgICB2b2lkIFNldEZvY3VzQW5ub3RUYWIoQ1BERlNES19Bbm5vdCogcFdpZGdldCwgRlhfQk9PTCBiU2FtZUZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOZXh0KTsKLQotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEFwcDsKLSAgICBDRkZMX1dpZGdldDJGaWxsZXIgbV9NYXBzOwotICAgIEZYX0JPT0wgbV9iTm90aWZ5aW5nOworICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7CisgIENGRkxfV2lkZ2V0MkZpbGxlciBtX01hcHM7CisgIEZYX0JPT0wgbV9iTm90aWZ5aW5nOwogfTsKIAotY2xhc3MgQ0ZGTF9Qcml2YXRlRGF0YQotewotcHVibGljOgotCUNQREZTREtfV2lkZ2V0KgkJCXBXaWRnZXQ7Ci0JQ1BERlNES19QYWdlVmlldyoJcFBhZ2VWaWV3OwotCWludAkJCQkJbldpZGdldEFnZTsKLQlpbnQJCQkJCW5WYWx1ZUFnZTsKK2NsYXNzIENGRkxfUHJpdmF0ZURhdGEgeworIHB1YmxpYzoKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQ7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldzsKKyAgaW50IG5XaWRnZXRBZ2U7CisgIGludCBuVmFsdWVBZ2U7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9JRk9STUZJTExFUl9IXwotCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guaAppbmRleCA0YzA4MTNmLi4yZTI2MDY5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmgKQEAgLTExLDQzICsxMSw0MCBAQAogCiAjaW5jbHVkZSAiRkZMX0Zvcm1GaWxsZXIuaCIKIAotY2xhc3MgIENCQV9Gb250TWFwOworY2xhc3MgQ0JBX0ZvbnRNYXA7CiAKLWNsYXNzIENGRkxfTGlzdEJveCA6IHB1YmxpYyBDRkZMX0Zvcm1GaWxsZXIKLXsKLXB1YmxpYzoKLSAgICBDRkZMX0xpc3RCb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcFdpZGdldCk7Ci0gICAgdmlydHVhbCB+Q0ZGTF9MaXN0Qm94KCk7CitjbGFzcyBDRkZMX0xpc3RCb3ggOiBwdWJsaWMgQ0ZGTF9Gb3JtRmlsbGVyIHsKKyBwdWJsaWM6CisgIENGRkxfTGlzdEJveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KTsKKyAgdmlydHVhbCB+Q0ZGTF9MaXN0Qm94KCk7CiAKLSAgICB2aXJ0dWFsIFBXTF9DUkVBVEVQQVJBTSBHZXRDcmVhdGVQYXJhbSgpOwotICAgIHZpcnR1YWwgQ1BXTF9XbmQqIE5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIFBXTF9DUkVBVEVQQVJBTSBHZXRDcmVhdGVQYXJhbSgpOworICB2aXJ0dWFsIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTCBJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0gICAgdmlydHVhbCB2b2lkIFNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZpcnR1YWwgRlhfQk9PTCBJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZpcnR1YWwgdm9pZCBTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0gICAgdmlydHVhbCB2b2lkIEdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKLSAgICB2aXJ0dWFsIHZvaWQgU2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpOworICB2aXJ0dWFsIHZvaWQgR2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7CisgIHZpcnR1YWwgdm9pZCBTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKIAotICAgIHZpcnR1YWwgdm9pZCBTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLSAgICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZpcnR1YWwgdm9pZCBTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdmlydHVhbCB2b2lkIFJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogCi0gICAgdmlydHVhbCBDUFdMX1duZCogUmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7Ci0gICAgdmlydHVhbCB2b2lkIE9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBDUFdMX1duZCogUmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXN0b3JlVmFsdWUpOworICB2aXJ0dWFsIHZvaWQgT25LZXlTdHJva2UoRlhfQk9PTCBiS2V5RG93biwgRlhfRFdPUkQgbkZsYWcpOwogCi1wcml2YXRlOgotICAgIENCQV9Gb250TWFwKiBtX3BGb250TWFwOwotICAgIHN0ZDo6c2V0PGludD4gbV9PcmlnaW5TZWxlY3Rpb25zOwotICAgIENGWF9BcnJheVRlbXBsYXRlPGludD4gbV9TdGF0ZTsKKyBwcml2YXRlOgorICBDQkFfRm9udE1hcCogbV9wRm9udE1hcDsKKyAgc3RkOjpzZXQ8aW50PiBtX09yaWdpblNlbGVjdGlvbnM7CisgIENGWF9BcnJheVRlbXBsYXRlPGludD4gbV9TdGF0ZTsKIH07CiAKLQogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfTElTVEJPWF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5oCmluZGV4IDA1MWEyNTAuLmIwNTFkZjggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmgKQEAgLTEzLDQ0ICsxMyw2MyBAQAogY2xhc3MgQ0ZGTF9Gb3JtRmlsbGVyOwogY2xhc3MgQ1BERl9Gb3JtRmllbGQ7CiAKLWNsYXNzIENGRkxfTm90aWZ5Ci17Ci1wdWJsaWM6Ci0JQ0ZGTF9Ob3RpZnkoQ0ZGTF9Gb3JtRmlsbGVyICogcEZvcm1GaWxsZXIpOwotCXZpcnR1YWwgfkNGRkxfTm90aWZ5KCk7CitjbGFzcyBDRkZMX05vdGlmeSB7CisgcHVibGljOgorICBDRkZMX05vdGlmeShDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyKTsKKyAgdmlydHVhbCB+Q0ZGTF9Ob3RpZnkoKTsKIAotcHVibGljOgotCUZYX0JPT0wJCQkJCQkJCQlPblNldEZvY3VzKEZYX0JPT0wgJiBiRXhpdCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU9uTW91c2VFbnRlcihGWF9CT09MICYgYkV4aXQpOwotCUZYX0JPT0wJCQkJCQkJCQlPbk1vdXNlRG93bihGWF9CT09MICYgYkV4aXQpOwotCUZYX0JPT0wJCQkJCQkJCQlPbk1vdXNlVXAoRlhfQk9PTCAmIGJFeGl0KTsKLQlGWF9CT09MCQkJCQkJCQkJT25Nb3VzZUV4aXQoRlhfQk9PTCAmIGJFeGl0KTsKLQlGWF9CT09MCQkJCQkJCQkJT25LaWxsRm9jdXMoRlhfQk9PTCAmIGJFeGl0KTsKKyBwdWJsaWM6CisgIEZYX0JPT0wgT25TZXRGb2N1cyhGWF9CT09MJiBiRXhpdCk7CisgIEZYX0JPT0wgT25Nb3VzZUVudGVyKEZYX0JPT0wmIGJFeGl0KTsKKyAgRlhfQk9PTCBPbk1vdXNlRG93bihGWF9CT09MJiBiRXhpdCk7CisgIEZYX0JPT0wgT25Nb3VzZVVwKEZYX0JPT0wmIGJFeGl0KTsKKyAgRlhfQk9PTCBPbk1vdXNlRXhpdChGWF9CT09MJiBiRXhpdCk7CisgIEZYX0JPT0wgT25LaWxsRm9jdXMoRlhfQk9PTCYgYkV4aXQpOwogCi0JRlhfQk9PTAkJCQkJCQkJCU9uQ2FsY3VsYXRlKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU9uRm9ybWF0KGludCBpQ29tbWl0S2V5KTsKLQlGWF9CT09MCQkJCQkJCQkJT25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwKLQkJCQkJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwKLQkJCQkJCQkJCQkJICAgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgJiBiUkMpOwotCUZYX0JPT0wJCQkJCQkJCQlPbktleVN0cm9rZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgaW50IG5Db21taXRLZXksIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKLQkJCQkJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwKLQkJCQkJCQkJCQkJICAgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYldpbGxDb21taXQsIEZYX0JPT0wgYkZpZWxkRnVsbCwKLQkJCQkJCQkJCQkJICAgaW50JiBuU2VsU3RhcnQsIGludCYgblNlbEVuZCwgRlhfQk9PTCYgYlJDKTsKKyAgRlhfQk9PTCBPbkNhbGN1bGF0ZSgpOworICBGWF9CT09MIE9uRm9ybWF0KGludCBpQ29tbWl0S2V5KTsKKyAgRlhfQk9PTCBPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDKTsKKyAgRlhfQk9PTCBPbktleVN0cm9rZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbW1pdEtleSwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc3RyVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWxsQ29tbWl0LAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpZWxkRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDKTsKIAotCXZvaWQJCQkJCQkJCQlCZWZvcmVOb3RpZnkoKTsKLQl2b2lkCQkJCQkJCQkJQWZ0ZXJOb3RpZnkoKTsKLQlGWF9CT09MCQkJCQkJCQkJSXNOb3RpZnlpbmcoKSBjb25zdCB7cmV0dXJuIG1fbk5vdGlmeUZsYWcgPiAwO30KKyAgdm9pZCBCZWZvcmVOb3RpZnkoKTsKKyAgdm9pZCBBZnRlck5vdGlmeSgpOworICBGWF9CT09MIElzTm90aWZ5aW5nKCkgY29uc3QgeyByZXR1cm4gbV9uTm90aWZ5RmxhZyA+IDA7IH0KIAotcHJpdmF0ZToKLSAJRlhfQk9PTAkJCQkJCQkJCURvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIEZYX0JPT0wgJiBiRXhpdCk7Ci0gCUZYX0JPT0wJCQkJCQkJCQlGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pOwotIAlGWF9CT09MCQkJCQkJCQkJRmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uIGFhY3Rpb24sQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKTsKLSAJRlhfQk9PTAkJCQkJCQkJCUV4ZWN1dGVBY3Rpb25UcmVlKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgQ1BERl9BY3Rpb24gJiBhY3Rpb24sIEZYX0JPT0wmIGJFeGl0KTsKLSAJRlhfQk9PTAkJCQkJCQkJCUV4ZWN1dGVBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uLEZYX0JPT0wmIGJFeGl0KTsKKyBwcml2YXRlOgorICBGWF9CT09MIERvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIEZYX0JPT0wmIGJFeGl0KTsKKyAgRlhfQk9PTCBGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIENQREZfQWN0aW9uJiBhY3Rpb24pOworICBGWF9CT09MIEZpbmRBQWN0aW9uKENQREZfQUFjdGlvbiBhYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX0FjdGlvbiYgYWN0aW9uKTsKKyAgRlhfQk9PTCBFeGVjdXRlQWN0aW9uVHJlZShDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCk7CisgIEZYX0JPT0wgRXhlY3V0ZUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQpOwogCi0JQ0ZGTF9Gb3JtRmlsbGVyICoJCQkJCQltX3BGb3JtRmlsbGVyOwotCUZYX0JPT0wJCQkJCQkJCQltX2JEb0FjdGlvbmluZzsKLQlpbnQzMl90CQkJCQkJCQltX25Ob3RpZnlGbGFnOworICBDRkZMX0Zvcm1GaWxsZXIqIG1fcEZvcm1GaWxsZXI7CisgIEZYX0JPT0wgbV9iRG9BY3Rpb25pbmc7CisgIGludDMyX3QgbV9uTm90aWZ5RmxhZzsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX05PVElGWV9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9QdXNoQnV0dG9uLmgKaW5kZXggM2NmYWVmYi4uNWM0ODE5NCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5oCkBAIC05LDE4ICs5LDIwIEBACiAKICNpbmNsdWRlICJGRkxfRm9ybUZpbGxlci5oIgogCi1jbGFzcyBDRkZMX1B1c2hCdXR0b24gOiBwdWJsaWMgQ0ZGTF9CdXR0b24KLXsKLXB1YmxpYzoKLQlDRkZMX1B1c2hCdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIH5DRkZMX1B1c2hCdXR0b24oKTsKK2NsYXNzIENGRkxfUHVzaEJ1dHRvbiA6IHB1YmxpYyBDRkZMX0J1dHRvbiB7CisgcHVibGljOgorICBDRkZMX1B1c2hCdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCB+Q0ZGTF9QdXNoQnV0dG9uKCk7CiAKLQl2aXJ0dWFsIENQV0xfV25kKgkJCU5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXcoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCAgQ1BERlNES19Bbm5vdCogcEFubm90LAotCQkJCQkJCQkJQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQkJCUZYX0RXT1JEIGR3RmxhZ3MpOworICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOworICB2aXJ0dWFsIHZvaWQgT25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfUFVTSEJVVFRPTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uaAppbmRleCA0NjMzMmUwLi5iYTdiZmY0IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uaApAQCAtOSwxOCArOSwyMyBAQAogCiAjaW5jbHVkZSAiRkZMX0Zvcm1GaWxsZXIuaCIKIAotY2xhc3MgQ0ZGTF9SYWRpb0J1dHRvbiA6IHB1YmxpYyBDRkZMX0J1dHRvbgotewotcHVibGljOgotCUNGRkxfUmFkaW9CdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIH5DRkZMX1JhZGlvQnV0dG9uKCk7CitjbGFzcyBDRkZMX1JhZGlvQnV0dG9uIDogcHVibGljIENGRkxfQnV0dG9uIHsKKyBwdWJsaWM6CisgIENGRkxfUmFkaW9CdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCB+Q0ZGTF9SYWRpb0J1dHRvbigpOwogCi0JdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLSAgCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdmlydHVhbCBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIHZvaWQgU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX1JBRElPQlVUVE9OX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmgKaW5kZXggY2I4ZGYzZi4uMjBmNDc4YiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuaApAQCAtOSw2NyArOSw3MCBAQAogCiAjaW5jbHVkZSAiRkZMX0Zvcm1GaWxsZXIuaCIKIAotI2RlZmluZSBCRl9BTElHTl9MRUZUCQkJMAotI2RlZmluZSBCRl9BTElHTl9NSURETEUJCQkxCi0jZGVmaW5lIEJGX0FMSUdOX1JJR0hUCQkJMgorI2RlZmluZSBCRl9BTElHTl9MRUZUIDAKKyNkZWZpbmUgQkZfQUxJR05fTUlERExFIDEKKyNkZWZpbmUgQkZfQUxJR05fUklHSFQgMgogCiBjbGFzcyBDQkFfRm9udE1hcDsKIAotc3RydWN0IEZGTF9UZXh0RmllbGRTdGF0ZQotewotCWludCBuU3RhcnQ7Ci0JaW50IG5FbmQ7Ci0JQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlOworc3RydWN0IEZGTF9UZXh0RmllbGRTdGF0ZSB7CisgIGludCBuU3RhcnQ7CisgIGludCBuRW5kOworICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7CiB9OwogCi1jbGFzcyBDRkZMX1RleHRGaWVsZCA6IHB1YmxpYyBDRkZMX0Zvcm1GaWxsZXIsIHB1YmxpYyBJUFdMX0ZvY3VzSGFuZGxlciwgcHVibGljIElQV0xfRWRpdF9Ob3RpZnkKLXsKLXB1YmxpYzoKLQlDRkZMX1RleHRGaWVsZChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgfkNGRkxfVGV4dEZpZWxkKCk7CitjbGFzcyBDRkZMX1RleHRGaWVsZCA6IHB1YmxpYyBDRkZMX0Zvcm1GaWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJUFdMX0ZvY3VzSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElQV0xfRWRpdF9Ob3RpZnkgeworIHB1YmxpYzoKKyAgQ0ZGTF9UZXh0RmllbGQoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCB+Q0ZGTF9UZXh0RmllbGQoKTsKIAotCXZpcnR1YWwJUFdMX0NSRUFURVBBUkFNCQlHZXRDcmVhdGVQYXJhbSgpOwotCXZpcnR1YWwgQ1BXTF9XbmQqCQkJTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZpcnR1YWwgUFdMX0NSRUFURVBBUkFNIEdldENyZWF0ZVBhcmFtKCk7CisgIHZpcnR1YWwgQ1BXTF9XbmQqIE5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAorICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKKyAgdmlydHVhbCBGWF9CT09MIElzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdmlydHVhbCB2b2lkIFNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCXZpcnR1YWwgdm9pZAkJCQlTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIHZvaWQgR2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7CisgIHZpcnR1YWwgdm9pZCBTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKKyAgdmlydHVhbCBGWF9CT09MIElzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KTsKKyAgdmlydHVhbCB2b2lkIFNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLSAJdmlydHVhbCB2b2lkCQkJCUdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCi0gCQkJCQkJCQkJCQkJUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7Ci0gCXZpcnR1YWwgdm9pZAkJCQlTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotCQkJCQkJCQkJY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7Ci0gCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKLSAJCQkJCQkJCQkJCQljb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KTsKLQl2aXJ0dWFsIHZvaWQJCQkJU2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0JdmlydHVhbCB2b2lkCQkJCVJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIENQV0xfV25kKiBSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7CiAKLQl2aXJ0dWFsIENQV0xfV25kKgkJCVJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKTsKKyAgdmlydHVhbCBGWF9CT09MIElzRmllbGRGdWxsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNGaWVsZEZ1bGwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBPblNldEZvY3VzKENQV0xfV25kKiBwV25kKTsKKyAgdmlydHVhbCB2b2lkIE9uS2lsbEZvY3VzKENQV0xfV25kKiBwV25kKTsKIAotcHVibGljOgotCXZpcnR1YWwgdm9pZAkJCQlPblNldEZvY3VzKENQV0xfV25kKiBwV25kKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25LaWxsRm9jdXMoQ1BXTF9XbmQqIHBXbmQpOworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIE9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KTsKIAotcHVibGljOgotCXZpcnR1YWwgdm9pZAkJCQlPbkFkZFVuZG8oQ1BXTF9FZGl0KiBwRWRpdCk7CisgcHVibGljOgorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIHZpcnR1YWwgRlhfQk9PTCBDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwogCi1wdWJsaWM6Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIHZpcnR1YWwgdm9pZCBEb0NvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgdmlydHVhbCB2b2lkIERvQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIHZpcnR1YWwgdm9pZCBEb1Bhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJRG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCB2b2lkCQkJCURvQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCB2b2lkCQkJCURvUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQotcHJpdmF0ZToKLQlDQkFfRm9udE1hcCoJCQkJbV9wRm9udE1hcDsKLQlGRkxfVGV4dEZpZWxkU3RhdGUJCQltX1N0YXRlOwotCisgcHJpdmF0ZToKKyAgQ0JBX0ZvbnRNYXAqIG1fcEZvbnRNYXA7CisgIEZGTF9UZXh0RmllbGRTdGF0ZSBtX1N0YXRlOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfVEVYVEZJRUxEX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVXRpbHMuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9VdGlscy5oCmluZGV4IGZlMDI1ZWMuLjM3MmEyYjYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9VdGlscy5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9VdGlscy5oCkBAIC05LDE1ICs5LDEyIEBACiAKICNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIgogCi1jbGFzcyBDRkZMX1V0aWxzCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIENQREZfUmVjdCBNYXhSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsY29uc3QgQ1BERl9SZWN0JiByZWN0Mik7Ci0gICAgc3RhdGljIENQREZfUmVjdCBJbmZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIGNyUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUJiBmU2l6ZSk7Ci0gICAgc3RhdGljIENQREZfUmVjdCBEZWZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIGNyUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUJiBmU2l6ZSk7Ci0gICAgc3RhdGljIEZYX0JPT0wgVHJhY2VPYmplY3QoQ1BERl9PYmplY3QqIHBPYmopOworY2xhc3MgQ0ZGTF9VdGlscyB7CisgcHVibGljOgorICBzdGF0aWMgQ1BERl9SZWN0IE1heFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0MSwgY29uc3QgQ1BERl9SZWN0JiByZWN0Mik7CisgIHN0YXRpYyBDUERGX1JlY3QgSW5mbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiBjclJlY3QsIGNvbnN0IEZYX0ZMT0FUJiBmU2l6ZSk7CisgIHN0YXRpYyBDUERGX1JlY3QgRGVmbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiBjclJlY3QsIGNvbnN0IEZYX0ZMT0FUJiBmU2l6ZSk7CisgIHN0YXRpYyBGWF9CT09MIFRyYWNlT2JqZWN0KENQREZfT2JqZWN0KiBwT2JqKTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2FwcC5oIGIvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaAppbmRleCBlNjUwYzYyLi5iZjk2OTkzIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2FwcC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmgKQEAgLTEwLDczICsxMCw4NyBAQAogY2xhc3MgSUZYSlNfUnVudGltZTsNCiBjbGFzcyBDSlNfUnVudGltZUZhY3Rvcnk7DQogDQotY2xhc3MgQ1BERlhGQV9BcHAgOiBwdWJsaWMgSVhGQV9BcHBQcm92aWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBDUERGWEZBX0FwcCogR2V0SW5zdGFuY2UoKTsNCi0gICAgc3RhdGljIHZvaWQgUmVsZWFzZUluc3RhbmNlKCk7DQorY2xhc3MgQ1BERlhGQV9BcHAgOiBwdWJsaWMgSVhGQV9BcHBQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDUERGWEZBX0FwcCogR2V0SW5zdGFuY2UoKTsNCisgIHN0YXRpYyB2b2lkIFJlbGVhc2VJbnN0YW5jZSgpOw0KIA0KLSAgICBDUERGWEZBX0FwcCgpOw0KLSAgICB+Q1BERlhGQV9BcHAoKSBvdmVycmlkZTsNCisgIENQREZYRkFfQXBwKCk7DQorICB+Q1BERlhGQV9BcHAoKSBvdmVycmlkZTsNCiANCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBJbml0aWFsaXplKCk7DQotICAgIElYRkFfQXBwKiAgICAgICAgICAgR2V0WEZBQXBwKCkgeyByZXR1cm4gbV9wWEZBQXBwOyB9DQorICBGWF9CT09MIEluaXRpYWxpemUoKTsNCisgIElYRkFfQXBwKiBHZXRYRkFBcHAoKSB7IHJldHVybiBtX3BYRkFBcHA7IH0NCiANCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBBZGRGb3JtRmlsbEVudihDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBSZW1vdmVGb3JtRmlsbEVudihDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KTsNCisgIEZYX0JPT0wgQWRkRm9ybUZpbGxFbnYoQ1BERkRvY19FbnZpcm9ubWVudCogcEVudik7DQorICBGWF9CT09MIFJlbW92ZUZvcm1GaWxsRW52KENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpOw0KIA0KLSAgICBGWEpTRV9IUlVOVElNRSAgICAgIEdldEpTRVJ1bnRpbWUoKSB7IHJldHVybiBtX2hKU0VSdW50aW1lOyB9DQotICAgIHZvaWQgICAgICAgICAgICAgICAgUmVsZWFzZVJ1bnRpbWUoKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBJbml0UnVudGltZShGWF9CT09MIGJSZXNldD1GQUxTRSk7DQorICBGWEpTRV9IUlVOVElNRSBHZXRKU0VSdW50aW1lKCkgeyByZXR1cm4gbV9oSlNFUnVudGltZTsgfQ0KKyAgdm9pZCBSZWxlYXNlUnVudGltZSgpOw0KKyAgRlhfQk9PTCBJbml0UnVudGltZShGWF9CT09MIGJSZXNldCA9IEZBTFNFKTsNCiANCi0gICAgQ0pTX1J1bnRpbWVGYWN0b3J5KiBHZXRSdW50aW1lRmFjdG9yeSgpIHsgcmV0dXJuIG1fcEpTUnVudGltZUZhY3Rvcnk7IH0NCisgIENKU19SdW50aW1lRmFjdG9yeSogR2V0UnVudGltZUZhY3RvcnkoKSB7IHJldHVybiBtX3BKU1J1bnRpbWVGYWN0b3J5OyB9DQogDQotICAgIC8vIElGWEFfQXBwUHJvdmlkZXI6DQotICAgIHZvaWQgR2V0QXBwVHlwZShDRlhfV2lkZVN0cmluZyAmd3NBcHBUeXBlKSBvdmVycmlkZTsNCi0gICAgdm9pZCBTZXRBcHBUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBcHBUeXBlKSBvdmVycmlkZTsNCisgIC8vIElGWEFfQXBwUHJvdmlkZXI6DQorICB2b2lkIEdldEFwcFR5cGUoQ0ZYX1dpZGVTdHJpbmcmIHdzQXBwVHlwZSkgb3ZlcnJpZGU7DQorICB2b2lkIFNldEFwcFR5cGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0FwcFR5cGUpIG92ZXJyaWRlOw0KIA0KLSAgICB2b2lkIEdldExhbmd1YWdlKENGWF9XaWRlU3RyaW5nICZ3c0xhbmd1YWdlKSBvdmVycmlkZTsNCi0gICAgdm9pZCBHZXRQbGF0Zm9ybShDRlhfV2lkZVN0cmluZyAmd3NQbGF0Zm9ybSkgb3ZlcnJpZGU7DQotICAgIHZvaWQgR2V0VmFyaWF0aW9uKENGWF9XaWRlU3RyaW5nICZ3c1ZhcmlhdGlvbikgb3ZlcnJpZGU7DQotICAgIHZvaWQgR2V0VmVyc2lvbihDRlhfV2lkZVN0cmluZyAmd3NWZXJzaW9uKSBvdmVycmlkZTsNCi0gICAgdm9pZCBHZXRGb3hpdFZlcnNpb24oQ0ZYX1dpZGVTdHJpbmcgJndzRm94aXRWZXJzaW9uKSBvdmVycmlkZSB7DQotICAgICAgICB3c0ZveGl0VmVyc2lvbiA9IEwiNy4wIjsNCi0gICAgfQ0KKyAgdm9pZCBHZXRMYW5ndWFnZShDRlhfV2lkZVN0cmluZyYgd3NMYW5ndWFnZSkgb3ZlcnJpZGU7DQorICB2b2lkIEdldFBsYXRmb3JtKENGWF9XaWRlU3RyaW5nJiB3c1BsYXRmb3JtKSBvdmVycmlkZTsNCisgIHZvaWQgR2V0VmFyaWF0aW9uKENGWF9XaWRlU3RyaW5nJiB3c1ZhcmlhdGlvbikgb3ZlcnJpZGU7DQorICB2b2lkIEdldFZlcnNpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzVmVyc2lvbikgb3ZlcnJpZGU7DQorICB2b2lkIEdldEZveGl0VmVyc2lvbihDRlhfV2lkZVN0cmluZyYgd3NGb3hpdFZlcnNpb24pIG92ZXJyaWRlIHsNCisgICAgd3NGb3hpdFZlcnNpb24gPSBMIjcuMCI7DQorICB9DQogDQotICAgIHZvaWQgR2V0QXBwTmFtZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSBvdmVycmlkZTsNCi0gICAgdm9pZCBHZXRGb3hpdEFwcE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRm94aXROYW1lKSBvdmVycmlkZSB7DQotICAgICAgICB3c0ZveGl0TmFtZSA9IEwiRm94aXQiOw0KLSAgICB9DQorICB2b2lkIEdldEFwcE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSkgb3ZlcnJpZGU7DQorICB2b2lkIEdldEZveGl0QXBwTmFtZShDRlhfV2lkZVN0cmluZyYgd3NGb3hpdE5hbWUpIG92ZXJyaWRlIHsNCisgICAgd3NGb3hpdE5hbWUgPSBMIkZveGl0IjsNCisgIH0NCiANCi0gICAgdm9pZCBCZWVwKEZYX0RXT1JEIGR3VHlwZSkgb3ZlcnJpZGU7DQotICAgIGludDMyX3QgTXNnQm94KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZXNzYWdlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGl0bGUsIEZYX0RXT1JEIGR3SWNvblR5cGUsIEZYX0RXT1JEIGR3QnV0dG9uVHlwZSkgb3ZlcnJpZGU7DQotICAgIHZvaWQgUmVzcG9uc2UoQ0ZYX1dpZGVTdHJpbmcgJndzQW5zd2VyLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUXVlc3Rpb24sIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSwNCi0gICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGVmYXVsdEFuc3dlciwgRlhfQk9PTCBiTWFyaykgb3ZlcnJpZGU7DQorICB2b2lkIEJlZXAoRlhfRFdPUkQgZHdUeXBlKSBvdmVycmlkZTsNCisgIGludDMyX3QgTXNnQm94KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZXNzYWdlLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlLA0KKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdJY29uVHlwZSwNCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QnV0dG9uVHlwZSkgb3ZlcnJpZGU7DQorICB2b2lkIFJlc3BvbnNlKENGWF9XaWRlU3RyaW5nJiB3c0Fuc3dlciwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1F1ZXN0aW9uLA0KKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGl0bGUsDQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEZWZhdWx0QW5zd2VyLA0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJNYXJrKSBvdmVycmlkZTsNCiANCi0gICAgaW50MzJfdCBHZXREb2N1bWVudENvdW50SW5CYXRjaCgpIG92ZXJyaWRlOw0KLSAgICBpbnQzMl90IEdldEN1ckRvY3VtZW50SW5CYXRjaCgpIG92ZXJyaWRlOw0KKyAgaW50MzJfdCBHZXREb2N1bWVudENvdW50SW5CYXRjaCgpIG92ZXJyaWRlOw0KKyAgaW50MzJfdCBHZXRDdXJEb2N1bWVudEluQmF0Y2goKSBvdmVycmlkZTsNCiANCi0gICAgSUZYX0ZpbGVSZWFkKiBEb3dubG9hZFVSTChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMKSBvdmVycmlkZTsNCi0gICAgRlhfQk9PTCBQb3N0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGF0YSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnRUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFbmNvZGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NIZWFkZXIsIENGWF9XaWRlU3RyaW5nICZ3c1Jlc3BvbnNlKSBvdmVycmlkZTsNCi0gICAgRlhfQk9PTCBQdXRSZXF1ZXN0VVJMKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVUkwsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEYXRhLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRW5jb2RlKSBvdmVycmlkZTsNCisgIElGWF9GaWxlUmVhZCogRG93bmxvYWRVUkwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VSTCkgb3ZlcnJpZGU7DQorICBGWF9CT09MIFBvc3RSZXF1ZXN0VVJMKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVUkwsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ29udGVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFbmNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NIZWFkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3BvbnNlKSBvdmVycmlkZTsNCisgIEZYX0JPT0wgUHV0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFbmNvZGUpIG92ZXJyaWRlOw0KIA0KLSAgICB2b2lkIExvYWRTdHJpbmcoaW50MzJfdCBpU3RyaW5nSUQsIENGWF9XaWRlU3RyaW5nICZ3c1N0cmluZykgb3ZlcnJpZGU7DQotICAgIEZYX0JPT0wgU2hvd0ZpbGVEaWFsb2coY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsdGVyLCBDRlhfV2lkZVN0cmluZ0FycmF5ICZ3c1BhdGhBcnIsIEZYX0JPT0wgYk9wZW4pIG92ZXJyaWRlOw0KLSAgICBJRldMX0FkYXB0ZXJUaW1lck1nciogR2V0VGltZXJNZ3IoKSBvdmVycmlkZTsNCisgIHZvaWQgTG9hZFN0cmluZyhpbnQzMl90IGlTdHJpbmdJRCwgQ0ZYX1dpZGVTdHJpbmcmIHdzU3RyaW5nKSBvdmVycmlkZTsNCisgIEZYX0JPT0wgU2hvd0ZpbGVEaWFsb2coY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsdGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5JiB3c1BhdGhBcnIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk9wZW4pIG92ZXJyaWRlOw0KKyAgSUZXTF9BZGFwdGVyVGltZXJNZ3IqIEdldFRpbWVyTWdyKCkgb3ZlcnJpZGU7DQogDQotICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZEb2NfRW52aXJvbm1lbnQqPiBtX3BFbnZMaXN0Ow0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERkRvY19FbnZpcm9ubWVudCo+IG1fcEVudkxpc3Q7DQogDQotcHJvdGVjdGVkOg0KLSAgICBzdGF0aWMgQ1BERlhGQV9BcHAqIGdfcEFwcDsNCisgcHJvdGVjdGVkOg0KKyAgc3RhdGljIENQREZYRkFfQXBwKiBnX3BBcHA7DQogDQotICAgIEZYX0JPT0wgbV9iSW5pdFJ1bnRpbWU7DQotICAgIElYRkFfQXBwKiBtX3BYRkFBcHA7DQotICAgIElYRkFfRm9udE1nciogbV9wRm9udE1ncjsNCi0gICAgRlhKU0VfSFJVTlRJTUUgbV9oSlNFUnVudGltZTsNCi0gICAgSUZYSlNfUnVudGltZSogbV9wSlNSdW50aW1lOw0KLSAgICBDSlNfUnVudGltZUZhY3RvcnkqIG1fcEpTUnVudGltZUZhY3Rvcnk7DQotICAgIENGWF9XaWRlU3RyaW5nIG1fY3NBcHBUeXBlOw0KKyAgRlhfQk9PTCBtX2JJbml0UnVudGltZTsNCisgIElYRkFfQXBwKiBtX3BYRkFBcHA7DQorICBJWEZBX0ZvbnRNZ3IqIG1fcEZvbnRNZ3I7DQorICBGWEpTRV9IUlVOVElNRSBtX2hKU0VSdW50aW1lOw0KKyAgSUZYSlNfUnVudGltZSogbV9wSlNSdW50aW1lOw0KKyAgQ0pTX1J1bnRpbWVGYWN0b3J5KiBtX3BKU1J1bnRpbWVGYWN0b3J5Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV9jc0FwcFR5cGU7DQogfTsNCiANCiAjZW5kaWYgIC8vIEZQREZYRkFfQVBQX0hfDQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgKaW5kZXggZjhkNjkxZS4uMjdlN2E5MSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQotIA0KKw0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQogDQogI2lmbmRlZiBGUERGWEZBX0RPQ19IXw0KQEAgLTE4LDE0MiArMTgsMjE5IEBACiBjbGFzcyBJRlhKU19Db250ZXh0Ow0KIGNsYXNzIElYRkFfRG9jSGFuZGxlcjsNCiANCi1jbGFzcyBDUERGWEZBX0RvY3VtZW50IDogcHVibGljIElYRkFfRG9jUHJvdmlkZXINCi17DQotcHVibGljOg0KLQlDUERGWEZBX0RvY3VtZW50KENQREZfRG9jdW1lbnQqIHBQREZEb2MsIENQREZYRkFfQXBwKiBwUHJvdmlkZXIpOw0KLQl+Q1BERlhGQV9Eb2N1bWVudCgpOw0KK2NsYXNzIENQREZYRkFfRG9jdW1lbnQgOiBwdWJsaWMgSVhGQV9Eb2NQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIENQREZYRkFfRG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcFBERkRvYywgQ1BERlhGQV9BcHAqIHBQcm92aWRlcik7DQorICB+Q1BERlhGQV9Eb2N1bWVudCgpOw0KIA0KLQlGWF9CT09MCQkJCUxvYWRYRkFEb2MoKTsNCi0JQ1BERlhGQV9BcHAqCQlHZXRBcHAoKSB7cmV0dXJuIG1fcEFwcDt9DQotCUNQREZfRG9jdW1lbnQqCQlHZXRQREZEb2MoKSB7IHJldHVybiBtX3BQREZEb2M7IH0NCi0JSVhGQV9Eb2MqCQkJR2V0WEZBRG9jKCkgeyByZXR1cm4gbV9wWEZBRG9jOyB9DQotCUlYRkFfRG9jVmlldyoJICAgIEdldFhGQURvY1ZpZXcoKSB7IHJldHVybiBtX3BYRkFEb2NWaWV3OyB9DQorICBGWF9CT09MIExvYWRYRkFEb2MoKTsNCisgIENQREZYRkFfQXBwKiBHZXRBcHAoKSB7IHJldHVybiBtX3BBcHA7IH0NCisgIENQREZfRG9jdW1lbnQqIEdldFBERkRvYygpIHsgcmV0dXJuIG1fcFBERkRvYzsgfQ0KKyAgSVhGQV9Eb2MqIEdldFhGQURvYygpIHsgcmV0dXJuIG1fcFhGQURvYzsgfQ0KKyAgSVhGQV9Eb2NWaWV3KiBHZXRYRkFEb2NWaWV3KCkgeyByZXR1cm4gbV9wWEZBRG9jVmlldzsgfQ0KIA0KLQlpbnQJCQkJCUdldFBhZ2VDb3VudCgpOw0KLQlDUERGWEZBX1BhZ2UqCQlHZXRQYWdlKGludCBwYWdlX2luZGV4KTsNCi0JQ1BERlhGQV9QYWdlKgkJR2V0UGFnZShJWEZBX1BhZ2VWaWV3KiBwUGFnZSk7DQotCXZvaWQJCQkJUmVtb3ZlUGFnZShDUERGWEZBX1BhZ2UqIHBhZ2UpOw0KLQlpbnQJCQkJCUdldERvY1R5cGUoKXsgcmV0dXJuIG1faURvY1R5cGU7IH0NCisgIGludCBHZXRQYWdlQ291bnQoKTsNCisgIENQREZYRkFfUGFnZSogR2V0UGFnZShpbnQgcGFnZV9pbmRleCk7DQorICBDUERGWEZBX1BhZ2UqIEdldFBhZ2UoSVhGQV9QYWdlVmlldyogcFBhZ2UpOw0KKyAgdm9pZCBSZW1vdmVQYWdlKENQREZYRkFfUGFnZSogcGFnZSk7DQorICBpbnQgR2V0RG9jVHlwZSgpIHsgcmV0dXJuIG1faURvY1R5cGU7IH0NCiANCi0JQ1BERlNES19Eb2N1bWVudCoJR2V0U0RLRG9jdW1lbnQoQ1BERkRvY19FbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsNCi0Jdm9pZAkJCQlSZWxlYXNlU0RLRG9jKCk7DQorICBDUERGU0RLX0RvY3VtZW50KiBHZXRTREtEb2N1bWVudChDUERGRG9jX0Vudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpOw0KKyAgdm9pZCBSZWxlYXNlU0RLRG9jKCk7DQogDQotCXZvaWQJCQkJRlhSZWN0MlBERlJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBmeFJlY3RGLCBDUERGX1JlY3QmIHBkZlJlY3QpOw0KKyAgdm9pZCBGWFJlY3QyUERGUmVjdChjb25zdCBDRlhfUmVjdEYmIGZ4UmVjdEYsIENQREZfUmVjdCYgcGRmUmVjdCk7DQogDQotcHVibGljOg0KLQl2aXJ0dWFsIHZvaWQJCVNldENoYW5nZU1hcmsoSVhGQV9Eb2MqIGhEb2MpOw0KLQl2aXJ0dWFsIEZYX0JPT0wJCUdldENoYW5nZU1hcmsoSVhGQV9Eb2MqIGhEb2MpOw0KLQkvL3VzZWQgaW4gZHluYW1pYyB4ZmEsIGR3RmxhZ3MgcmVmZXIgdG8gWEZBX0lOVkFMSURBVEVfWFhYIG1hY3Jvcy4NCi0JdmlydHVhbCB2b2lkCQlJbnZhbGlkYXRlUmVjdChJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENGWF9SZWN0RiYgcnQsIEZYX0RXT1JEIGR3RmxhZ3MgPSAwKTsNCi0JLy91c2VkIGluIHN0YXRpYyB4ZmEsIGR3RmxhZ3MgcmVmZXIgdG8gWEZBX0lOVkFMSURBVEVfWFhYIG1hY3Jvcy4NCi0JdmlydHVhbCB2b2lkCQlJbnZhbGlkYXRlUmVjdChJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncyA9IDApOw0KLQkvL3Nob3cgb3IgaGlkZSBjYXJldA0KLQl2aXJ0dWFsIHZvaWQJCURpc3BsYXlDYXJldChJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfQk9PTCBiVmlzaWJsZSwgY29uc3QgQ0ZYX1JlY3RGKiBwUnRBbmNob3IpOw0KLQkvL2R3UG9zOiAoMDpib3R0b20gMTp0b3ApDQotCXZpcnR1YWwgRlhfQk9PTAkJR2V0UG9wdXBQb3MoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0ZMT0FUIGZNaW5Qb3B1cCwgRlhfRkxPQVQgZk1heFBvcHVwLCANCi0JCQkJCQkJY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvciwgQ0ZYX1JlY3RGICZydFBvcHVwKTsNCi0JdmlydHVhbCBGWF9CT09MCQlQb3B1cE1lbnUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9Qb2ludEYgcHRQb3B1cCwgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdEV4Y2x1ZGUgPSBOVUxMKTsNCisgcHVibGljOg0KKyAgdmlydHVhbCB2b2lkIFNldENoYW5nZU1hcmsoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldENoYW5nZU1hcmsoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgLy8gdXNlZCBpbiBkeW5hbWljIHhmYSwgZHdGbGFncyByZWZlciB0byBYRkFfSU5WQUxJREFURV9YWFggbWFjcm9zLg0KKyAgdmlydHVhbCB2b2lkIEludmFsaWRhdGVSZWN0KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSAwKTsNCisgIC8vIHVzZWQgaW4gc3RhdGljIHhmYSwgZHdGbGFncyByZWZlciB0byBYRkFfSU5WQUxJREFURV9YWFggbWFjcm9zLg0KKyAgdmlydHVhbCB2b2lkIEludmFsaWRhdGVSZWN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzID0gMCk7DQorICAvLyBzaG93IG9yIGhpZGUgY2FyZXQNCisgIHZpcnR1YWwgdm9pZCBEaXNwbGF5Q2FyZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZpc2libGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0QW5jaG9yKTsNCisgIC8vIGR3UG9zOiAoMDpib3R0b20gMTp0b3ApDQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UG9wdXBQb3MoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pblBvcHVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhQb3B1cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUG9wdXBNZW51KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGIHB0UG9wdXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3RFeGNsdWRlID0gTlVMTCk7DQogDQotCS8vZHdGbGFncyBYRkFfUEFHRVZJRVdFVkVOVF9BZGRlZCwgWEZBX1BBR0VWSUVXRVZFTlRfUmVtb3ZpbmcNCi0JdmlydHVhbCB2b2lkCQlQYWdlVmlld0V2ZW50KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfRFdPUkQgZHdGbGFncyk7DQotCS8vZHdFdmVudCByZWZlciB0byBYRkFfV0lER0VURVZFTlRfWFhYDQotCXZpcnR1YWwgdm9pZAkJV2lkZ2V0RXZlbnQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0RGF0YSwgRlhfRFdPUkQgZHdFdmVudCwgdm9pZCogcFBhcmFtID0gTlVMTCwgdm9pZCogcEFkZGl0aW9uYWwgPSBOVUxMKTsNCi0JDQotCS8vcmV0dXJuIHRydWUgaWYgcmVuZGVyIGl0Lg0KLQl2aXJ0dWFsIEZYX0JPT0wJCVJlbmRlckN1c3RvbVdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXgsIGNvbnN0IENGWF9SZWN0RiYgcnRVSSl7cmV0dXJuIEZBTFNFO30NCisgIC8vIGR3RmxhZ3MgWEZBX1BBR0VWSUVXRVZFTlRfQWRkZWQsIFhGQV9QQUdFVklFV0VWRU5UX1JlbW92aW5nDQorICB2aXJ0dWFsIHZvaWQgUGFnZVZpZXdFdmVudChJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKyAgLy8gZHdFdmVudCByZWZlciB0byBYRkFfV0lER0VURVZFTlRfWFhYDQorICB2aXJ0dWFsIHZvaWQgV2lkZ2V0RXZlbnQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXREYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQWRkaXRpb25hbCA9IE5VTEwpOw0KIA0KLQkvL2hvc3QgbWV0aG9kDQotCXZpcnR1YWwJaW50MzJfdAlDb3VudFBhZ2VzKElYRkFfRG9jKiBoRG9jKTsNCi0JdmlydHVhbAlpbnQzMl90CUdldEN1cnJlbnRQYWdlKElYRkFfRG9jKiBoRG9jKTsNCi0JdmlydHVhbCB2b2lkCQlTZXRDdXJyZW50UGFnZShJWEZBX0RvYyogaERvYywgaW50MzJfdCBpQ3VyUGFnZSk7DQotCXZpcnR1YWwgRlhfQk9PTAkJSXNDYWxjdWxhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jKTsNCi0JdmlydHVhbCB2b2lkCQlTZXRDYWxjdWxhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jLCBGWF9CT09MIGJFbmFibGVkKTsNCi0JdmlydHVhbCB2b2lkCQlHZXRUaXRsZShJWEZBX0RvYyogaERvYywgQ0ZYX1dpZGVTdHJpbmcgJndzVGl0bGUpOw0KLQl2aXJ0dWFsIHZvaWQJCVNldFRpdGxlKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGl0bGUpOw0KLQl2aXJ0dWFsIHZvaWQJCUV4cG9ydERhdGEoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlUGF0aCwgRlhfQk9PTCBiWERQID0gVFJVRSk7DQotCXZpcnR1YWwgdm9pZAkJSW1wb3J0RGF0YShJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVQYXRoKTsNCi0JdmlydHVhbCB2b2lkCQlHb3RvVVJMKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGJzVVJMLCBGWF9CT09MIGJBcHBlbmQgPSBUUlVFKTsNCi0JdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkYXRpb25zRW5hYmxlZChJWEZBX0RvYyogaERvYyk7DQotCXZpcnR1YWwgdm9pZAkJU2V0VmFsaWRhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jLCBGWF9CT09MIGJFbmFibGVkKTsNCi0JdmlydHVhbCB2b2lkCQlTZXRGb2N1c1dpZGdldChJWEZBX0RvYyogaERvYywgSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KLQl2aXJ0dWFsIHZvaWQJCVByaW50KElYRkFfRG9jKiBoRG9jLCBpbnQzMl90IG5TdGFydFBhZ2UsIGludDMyX3QgbkVuZFBhZ2UsIEZYX0RXT1JEIGR3T3B0aW9ucyk7DQorICAvLyByZXR1cm4gdHJ1ZSBpZiByZW5kZXIgaXQuDQorICB2aXJ0dWFsIEZYX0JPT0wgUmVuZGVyQ3VzdG9tV2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFVJKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCiANCi0JLy9MYXlvdXRQc2V1ZG8gbWV0aG9kDQotCXZpcnR1YWwgaW50MzJfdAkJCUFic1BhZ2VDb3VudEluQmF0Y2goSVhGQV9Eb2MqIGhEb2Mpe3JldHVybiAwO30NCi0JdmlydHVhbCBpbnQzMl90CQkJQWJzUGFnZUluQmF0Y2goSVhGQV9Eb2MqIGhEb2MsIElYRkFfV2lkZ2V0KiBoV2lkZ2V0KXtyZXR1cm4gMDt9DQotCXZpcnR1YWwgaW50MzJfdAkJCVNoZWV0Q291bnRJbkJhdGNoKElYRkFfRG9jKiBoRG9jKXtyZXR1cm4gMDt9DQotCXZpcnR1YWwgaW50MzJfdAkJCVNoZWV0SW5CYXRjaChJWEZBX0RvYyogaERvYywgSVhGQV9XaWRnZXQqIGhXaWRnZXQpe3JldHVybiAwO30NCisgIC8vIGhvc3QgbWV0aG9kDQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRQYWdlcyhJWEZBX0RvYyogaERvYyk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q3VycmVudFBhZ2UoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCB2b2lkIFNldEN1cnJlbnRQYWdlKElYRkFfRG9jKiBoRG9jLCBpbnQzMl90IGlDdXJQYWdlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0NhbGN1bGF0aW9uc0VuYWJsZWQoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCB2b2lkIFNldENhbGN1bGF0aW9uc0VuYWJsZWQoSVhGQV9Eb2MqIGhEb2MsIEZYX0JPT0wgYkVuYWJsZWQpOw0KKyAgdmlydHVhbCB2b2lkIEdldFRpdGxlKElYRkFfRG9jKiBoRG9jLCBDRlhfV2lkZVN0cmluZyYgd3NUaXRsZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGl0bGUoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSk7DQorICB2aXJ0dWFsIHZvaWQgRXhwb3J0RGF0YShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlhEUCA9IFRSVUUpOw0KKyAgdmlydHVhbCB2b2lkIEltcG9ydERhdGEoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlUGF0aCk7DQorICB2aXJ0dWFsIHZvaWQgR290b1VSTChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgYnNVUkwsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBcHBlbmQgPSBUUlVFKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc1ZhbGlkYXRpb25zRW5hYmxlZChJWEZBX0RvYyogaERvYyk7DQorICB2aXJ0dWFsIHZvaWQgU2V0VmFsaWRhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jLCBGWF9CT09MIGJFbmFibGVkKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb2N1c1dpZGdldChJWEZBX0RvYyogaERvYywgSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgdmlydHVhbCB2b2lkIFByaW50KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0UGFnZSwNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5FbmRQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3T3B0aW9ucyk7DQogDQotCS8vU2lnbmF0dXJlUHNldWRvTW9kZWwgbWV0aG9kDQotCS8vVE9ETzoNCi0JdmlydHVhbCBpbnQzMl90CQkJVmVyaWZ5KElYRkFfRG9jKiBoRG9jLCBDWEZBX05vZGUqIHBTaWdOb2RlLCBGWF9CT09MIGJVc2VkID0gVFJVRS8qLCBTZWN1cml0eUhhbmRsZXIqIHBIYW5kbGVyLCBTaWduYXR1cmVJbmZvICZpbmZvKi8pIHtyZXR1cm4gMDt9DQotCXZpcnR1YWwgRlhfQk9PTAkJCQlTaWduKElYRkFfRG9jKiBoRG9jLCBDWEZBX05vZGVMaXN0KiBwTm9kZUxpc3QsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzWE1MSWRlbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSA9IEZYX1dTVFJDKEwib3BlbiIpLCBGWF9CT09MIGJVc2VkID0gVFJVRS8qLCBTZWN1cml0eUhhbmRsZXIqIHBIYW5kbGVyID0gTlVMTCwgU2lnbmF0dXJlSW5mbyAmaW5mbyovKSB7cmV0dXJuIDA7fQ0KLQl2aXJ0dWFsIENYRkFfTm9kZUxpc3QqCQlFbnVtZXJhdGUoSVhGQV9Eb2MqIGhEb2MpIHtyZXR1cm4gMDt9DQotCXZpcnR1YWwgRlhfQk9PTAkJCQlDbGVhcihJWEZBX0RvYyogaERvYywgQ1hGQV9Ob2RlKiBwU2lnTm9kZSwgRlhfQk9PTCBiQ2xlYXJlZCA9IFRSVUUpIHtyZXR1cm4gMDt9DQorICAvLyBMYXlvdXRQc2V1ZG8gbWV0aG9kDQorICB2aXJ0dWFsIGludDMyX3QgQWJzUGFnZUNvdW50SW5CYXRjaChJWEZBX0RvYyogaERvYykgeyByZXR1cm4gMDsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEFic1BhZ2VJbkJhdGNoKElYRkFfRG9jKiBoRG9jLCBJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBTaGVldENvdW50SW5CYXRjaChJWEZBX0RvYyogaERvYykgeyByZXR1cm4gMDsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IFNoZWV0SW5CYXRjaChJWEZBX0RvYyogaERvYywgSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQogDQotCS8vR2V0IGRvY3VtZW50IHBhdGgNCi0JdmlydHVhbCB2b2lkCQlHZXRVUkwoSVhGQV9Eb2MqIGhEb2MsIENGWF9XaWRlU3RyaW5nICZ3c0RvY1VSTCk7DQotCXZpcnR1YWwgRlhfQVJHQgkJR2V0SGlnaGxpZ2h0Q29sb3IoSVhGQV9Eb2MqIGhEb2MpOw0KLQl2aXJ0dWFsIHZvaWQJCUFkZERvUmVjb3JkKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCi0JLyoqIA0KLQkgKlN1Ym1pdCBkYXRhIHRvIGVtYWlsLCBodHRwLCBmdHAuCQ0KLQkgKiBAcGFyYW1baW5dIGhEb2MgVGhlIGRvY3VtZW50IGhhbmRsZXIuDQotCSAqIEBwYXJhbVtpbl0gZUZvcm1hdCBEZXRlcm1pbmVzIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSBzdWJtaXR0ZWQuIFhGQV9BVFRSSUJVVEVFTlVNX1hkcCwgWEZBX0FUVFJJQlVURUVOVU1fWG1sLi4uDQotCSAqIEBwYXJhbVtpbl0gd3NUYXJnZXQgVGhlIFVSTCB0byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHN1Ym1pdHRlZC4NCi0JICogQHBhcmFtW2luXSBlRW5jb2RpbmcgVGhlIGVuY29kaW5nIG9mIHRleHQgY29udGVudC4NCi0JICogQHBhcmFtW2luXSBwWERQQ29udGVudCBDb250cm9scyB3aGF0IHN1YnNldCBvZiB0aGUgZGF0YSBpcyBzdWJtaXR0ZWQsIHVzZWQgb25seSB3aGVuIHRoZSBmb3JtYXQgcHJvcGVydHkgaXMgeGRwLg0KLQkgKiBAcGFyYW1baW5dIGJFbWJlZFBERiwgc3BlY2lmaWVzIHdoZXRoZXIgUERGIGlzIGVtYmVkZGVkIGluIHRoZSBzdWJtaXR0ZWQgY29udGVudCBvciBub3QuDQotCSAqLw0KLQl2aXJ0dWFsIEZYX0JPT0wJCVN1Ym1pdERhdGEoSVhGQV9Eb2MqIGhEb2MsIENYRkFfU3VibWl0IHN1Ym1pdCk7DQorICAvLyBTaWduYXR1cmVQc2V1ZG9Nb2RlbCBtZXRob2QNCisgIC8vIFRPRE86DQorICB2aXJ0dWFsIGludDMyX3QgVmVyaWZ5KA0KKyAgICAgIElYRkFfRG9jKiBoRG9jLA0KKyAgICAgIENYRkFfTm9kZSogcFNpZ05vZGUsDQorICAgICAgRlhfQk9PTA0KKyAgICAgICAgICBiVXNlZCA9IFRSVUUgLyosIFNlY3VyaXR5SGFuZGxlciogcEhhbmRsZXIsIFNpZ25hdHVyZUluZm8gJmluZm8qLykgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHZpcnR1YWwgRlhfQk9PTCBTaWduKA0KKyAgICAgIElYRkFfRG9jKiBoRG9jLA0KKyAgICAgIENYRkFfTm9kZUxpc3QqIHBOb2RlTGlzdCwNCisgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXhwcmVzc2lvbiwNCisgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzWE1MSWRlbnQsDQorICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlID0gRlhfV1NUUkMoTCJvcGVuIiksDQorICAgICAgRlhfQk9PTA0KKyAgICAgICAgICBiVXNlZCA9IFRSVUUgLyosIFNlY3VyaXR5SGFuZGxlciogcEhhbmRsZXIgPSBOVUxMLCBTaWduYXR1cmVJbmZvICZpbmZvKi8pIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB2aXJ0dWFsIENYRkFfTm9kZUxpc3QqIEVudW1lcmF0ZShJWEZBX0RvYyogaERvYykgeyByZXR1cm4gMDsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIENsZWFyKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFNpZ05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xlYXJlZCA9IFRSVUUpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQogDQotCXZpcnR1YWwgRlhfQk9PTAkJQ2hlY2tXb3JkKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkKXtyZXR1cm4gRkFMU0U7fQ0KLQl2aXJ0dWFsIEZYX0JPT0wJCUdldFN1Z2dlc3RXb3JkcyhJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzV29yZCwgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3Qpe3JldHVybiBGQUxTRTt9DQorICAvLyBHZXQgZG9jdW1lbnQgcGF0aA0KKyAgdmlydHVhbCB2b2lkIEdldFVSTChJWEZBX0RvYyogaERvYywgQ0ZYX1dpZGVTdHJpbmcmIHdzRG9jVVJMKTsNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRIaWdobGlnaHRDb2xvcihJWEZBX0RvYyogaERvYyk7DQorICB2aXJ0dWFsIHZvaWQgQWRkRG9SZWNvcmQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgLyoqDQorICAgKlN1Ym1pdCBkYXRhIHRvIGVtYWlsLCBodHRwLCBmdHAuDQorICAgKiBAcGFyYW1baW5dIGhEb2MgVGhlIGRvY3VtZW50IGhhbmRsZXIuDQorICAgKiBAcGFyYW1baW5dIGVGb3JtYXQgRGV0ZXJtaW5lcyB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUNCisgICAqc3VibWl0dGVkLiBYRkFfQVRUUklCVVRFRU5VTV9YZHAsIFhGQV9BVFRSSUJVVEVFTlVNX1htbC4uLg0KKyAgICogQHBhcmFtW2luXSB3c1RhcmdldCBUaGUgVVJMIHRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgc3VibWl0dGVkLg0KKyAgICogQHBhcmFtW2luXSBlRW5jb2RpbmcgVGhlIGVuY29kaW5nIG9mIHRleHQgY29udGVudC4NCisgICAqIEBwYXJhbVtpbl0gcFhEUENvbnRlbnQgQ29udHJvbHMgd2hhdCBzdWJzZXQgb2YgdGhlIGRhdGEgaXMgc3VibWl0dGVkLCB1c2VkDQorICAgKm9ubHkgd2hlbiB0aGUgZm9ybWF0IHByb3BlcnR5IGlzIHhkcC4NCisgICAqIEBwYXJhbVtpbl0gYkVtYmVkUERGLCBzcGVjaWZpZXMgd2hldGhlciBQREYgaXMgZW1iZWRkZWQgaW4gdGhlIHN1Ym1pdHRlZA0KKyAgICpjb250ZW50IG9yIG5vdC4NCisgICAqLw0KKyAgdmlydHVhbCBGWF9CT09MIFN1Ym1pdERhdGEoSVhGQV9Eb2MqIGhEb2MsIENYRkFfU3VibWl0IHN1Ym1pdCk7DQogDQotCS8vR2V0IFBERiBqYXZhc2NyaXB0IG9iamVjdCwgc2V0IHRoZSBvYmplY3QgdG8gaFZhbHVlLg0KLQl2aXJ0dWFsIEZYX0JPT0wJCUdldFBERlNjcmlwdE9iamVjdChJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tXb3JkKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRTdWdnZXN0V29yZHMoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc1dvcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQXJyYXkmIHNTdWdnZXN0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCiANCi0JdmlydHVhbCBGWF9CT09MCQlHZXRHbG9iYWxQcm9wZXJ0eShJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCi0JdmlydHVhbCBGWF9CT09MCQlTZXRHbG9iYWxQcm9wZXJ0eShJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCi0JdmlydHVhbCBDUERGX0RvY3VtZW50KiAgT3BlblBERihJWEZBX0RvYyogaERvYywgSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhfQk9PTCBiVGFrZU92ZXJGaWxlKXtyZXR1cm4gTlVMTDt9DQorICAvLyBHZXQgUERGIGphdmFzY3JpcHQgb2JqZWN0LCBzZXQgdGhlIG9iamVjdCB0byBoVmFsdWUuDQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UERGU2NyaXB0T2JqZWN0KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCiANCi0JdmlydHVhbCBJRlhfRmlsZVJlYWQqCU9wZW5MaW5rZWRGaWxlKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMaW5rKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRHbG9iYWxQcm9wZXJ0eShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0R2xvYmFsUHJvcGVydHkoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KKyAgdmlydHVhbCBDUERGX0RvY3VtZW50KiBPcGVuUERGKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcEZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVGFrZU92ZXJGaWxlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KIA0KLQlGWF9CT09MCQlfR2V0SFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUsIElGWEpTX1J1bnRpbWUqIHJ1blRpbWUpOw0KLQlGWF9CT09MCQlfT25CZWZvcmVOb3RpZnlTdW1iaXQoKTsNCi0Jdm9pZAkJX09uQWZ0ZXJOb3RpZnlTdW1iaXQoKTsNCi0JRlhfQk9PTAkJX05vdGlmeVN1Ym1pdChGWF9CT09MIGJQcmV2T3JQb3N0KTsNCi0JRlhfQk9PTAkJX1N1Ym1pdERhdGEoSVhGQV9Eb2MqIGhEb2MsIENYRkFfU3VibWl0IHN1Ym1pdCk7DQotCUZYX0JPT0wJCV9NYWlsVG9JbmZvKENGWF9XaWRlU3RyaW5nJiBjc1VSTCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVG9BZGRyZXNzLCBDRlhfV2lkZVN0cmluZyYgY3NDQ0FkZHJlc3MsIENGWF9XaWRlU3RyaW5nJiBjc0JDQ0FkZHJlc3MsIENGWF9XaWRlU3RyaW5nJiBjc1N1YmplY3QsIENGWF9XaWRlU3RyaW5nJiBjc01zZyk7DQotCUZYX0JPT0wJCV9FeHBvcnRTdWJtaXRGaWxlKEZQREZfRklMRUhBTkRMRVIqIHBwRmlsZUhhbmRsZXIsIGludCBmaWxlVHlwZSwgRlBERl9EV09SRCBlbmNvZGVUeXBlLCBGUERGX0RXT1JEIGZsYWcgPSAweDAxMTExMTExKTsNCi0Jdm9pZAkJX1RvWEZBQ29udGVudEZsYWdzKENGWF9XaWRlU3RyaW5nIGNzU3JjQ29udGVudCwgRlBERl9EV09SRCYgZmxhZyk7DQotCXZvaWQJCV9DbGVhckNoYW5nZU1hcmsoKTsNCisgIHZpcnR1YWwgSUZYX0ZpbGVSZWFkKiBPcGVuTGlua2VkRmlsZShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMaW5rKTsNCiANCi1wcml2YXRlOg0KLQl2b2lkCQlDbG9zZVhGQURvYyhJWEZBX0RvY0hhbmRsZXIqIHBEb2MpIHsNCi0JCQkJCWlmIChwRG9jKSB7DQotCQkJCQkJcERvYy0+Q2xvc2VEb2MobV9wWEZBRG9jKTsNCi0JCQkJCQlwRG9jLT5SZWxlYXNlRG9jKG1fcFhGQURvYyk7DQotCQkJCQkJbV9wWEZBRG9jID0gTlVMTDsNCi0JCQkJCQltX3BYRkFEb2NWaWV3ID0gTlVMTDsNCi0JCQkJCX0NCi0JCQkJfQ0KKyAgRlhfQk9PTCBfR2V0SFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhKU19SdW50aW1lKiBydW5UaW1lKTsNCisgIEZYX0JPT0wgX09uQmVmb3JlTm90aWZ5U3VtYml0KCk7DQorICB2b2lkIF9PbkFmdGVyTm90aWZ5U3VtYml0KCk7DQorICBGWF9CT09MIF9Ob3RpZnlTdWJtaXQoRlhfQk9PTCBiUHJldk9yUG9zdCk7DQorICBGWF9CT09MIF9TdWJtaXREYXRhKElYRkFfRG9jKiBoRG9jLCBDWEZBX1N1Ym1pdCBzdWJtaXQpOw0KKyAgRlhfQk9PTCBfTWFpbFRvSW5mbyhDRlhfV2lkZVN0cmluZyYgY3NVUkwsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1RvQWRkcmVzcywNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzQ0NBZGRyZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NCQ0NBZGRyZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NTdWJqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NNc2cpOw0KKyAgRlhfQk9PTCBfRXhwb3J0U3VibWl0RmlsZShGUERGX0ZJTEVIQU5ETEVSKiBwcEZpbGVIYW5kbGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZW5jb2RlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBmbGFnID0gMHgwMTExMTExMSk7DQorICB2b2lkIF9Ub1hGQUNvbnRlbnRGbGFncyhDRlhfV2lkZVN0cmluZyBjc1NyY0NvbnRlbnQsIEZQREZfRFdPUkQmIGZsYWcpOw0KKyAgdm9pZCBfQ2xlYXJDaGFuZ2VNYXJrKCk7DQogDQotCUNQREZfRG9jdW1lbnQqIG1fcFBERkRvYzsNCi0JSVhGQV9Eb2MqICBtX3BYRkFEb2M7DQotCUlYRkFfRG9jVmlldyogbV9wWEZBRG9jVmlldzsNCi0JQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERlhGQV9QYWdlKj4gbV9YRkFQYWdlTGlzdDsNCisgcHJpdmF0ZToNCisgIHZvaWQgQ2xvc2VYRkFEb2MoSVhGQV9Eb2NIYW5kbGVyKiBwRG9jKSB7DQorICAgIGlmIChwRG9jKSB7DQorICAgICAgcERvYy0+Q2xvc2VEb2MobV9wWEZBRG9jKTsNCisgICAgICBwRG9jLT5SZWxlYXNlRG9jKG1fcFhGQURvYyk7DQorICAgICAgbV9wWEZBRG9jID0gTlVMTDsNCisgICAgICBtX3BYRkFEb2NWaWV3ID0gTlVMTDsNCisgICAgfQ0KKyAgfQ0KIA0KLQlDUERGU0RLX0RvY3VtZW50KiBtX3BTREtEb2M7DQotCUNQREZYRkFfQXBwKiBtX3BBcHA7DQorICBDUERGX0RvY3VtZW50KiBtX3BQREZEb2M7DQorICBJWEZBX0RvYyogbV9wWEZBRG9jOw0KKyAgSVhGQV9Eb2NWaWV3KiBtX3BYRkFEb2NWaWV3Ow0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERlhGQV9QYWdlKj4gbV9YRkFQYWdlTGlzdDsNCiANCi0JQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX1hmYUdsb2JhbFByb3BlcnR5Ow0KKyAgQ1BERlNES19Eb2N1bWVudCogbV9wU0RLRG9jOw0KKyAgQ1BERlhGQV9BcHAqIG1fcEFwcDsNCiANCi0JQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX1ZhbHVlTWFwOw0KKyAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX1hmYUdsb2JhbFByb3BlcnR5Ow0KIA0KLQlJRlhKU19Db250ZXh0KgkJCW1fcEpTQ29udGV4dDsNCisgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIgbV9WYWx1ZU1hcDsNCiANCi0JaW50CQkJbV9pRG9jVHlwZTsNCisgIElGWEpTX0NvbnRleHQqIG1fcEpTQ29udGV4dDsNCisNCisgIGludCBtX2lEb2NUeXBlOw0KIH07DQogDQogI2VuZGlmICAvLyBGUERGWEZBX0RPQ19IXw0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIGIvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgKaW5kZXggZjU1YTQyNC4uMWE5N2ZlNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgKQEAgLTEsNDggKzEsNjUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KLSANCisNCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpZm5kZWYgX0ZQREZYRkFfUEFHRVZJRVdfSF8NCiAjZGVmaW5lIF9GUERGWEZBX1BBR0VWSUVXX0hfDQogDQotY2xhc3MgQ1BERlhGQV9QYWdlDQotew0KLXB1YmxpYzoNCi0JQ1BERlhGQV9QYWdlKENQREZYRkFfRG9jdW1lbnQqIHBEb2MsIGludCBwYWdlX2luZGV4KTsNCi0JfkNQREZYRkFfUGFnZSgpOw0KK2NsYXNzIENQREZYRkFfUGFnZSB7DQorIHB1YmxpYzoNCisgIENQREZYRkFfUGFnZShDUERGWEZBX0RvY3VtZW50KiBwRG9jLCBpbnQgcGFnZV9pbmRleCk7DQorICB+Q1BERlhGQV9QYWdlKCk7DQogDQotCXZvaWQJCVJlbGVhc2UoKTsNCi0Jdm9pZAkJQWRkUmVmKCl7IG1faVJlZiArKzsgfQ0KLQlGWF9CT09MCQlMb2FkUGFnZSgpOw0KLQlGWF9CT09MCQlMb2FkUERGUGFnZShDUERGX0RpY3Rpb25hcnkqIHBhZ2VEaWN0KTsNCi0JQ1BERlhGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSB7IHJldHVybiBtX3BEb2N1bWVudDsgfQ0KLQlpbnQJCQlHZXRQYWdlSW5kZXgoKSB7IHJldHVybiBtX2lQYWdlSW5kZXg7IH0NCi0JQ1BERl9QYWdlKglHZXRQREZQYWdlKCkgeyByZXR1cm4gbV9wUERGUGFnZTsgfQ0KLQlJWEZBX1BhZ2VWaWV3KiBHZXRYRkFQYWdlVmlldygpIHsgcmV0dXJuIG1fcFhGQVBhZ2VWaWV3OyB9DQorICB2b2lkIFJlbGVhc2UoKTsNCisgIHZvaWQgQWRkUmVmKCkgeyBtX2lSZWYrKzsgfQ0KKyAgRlhfQk9PTCBMb2FkUGFnZSgpOw0KKyAgRlhfQk9PTCBMb2FkUERGUGFnZShDUERGX0RpY3Rpb25hcnkqIHBhZ2VEaWN0KTsNCisgIENQREZYRkFfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0NCisgIGludCBHZXRQYWdlSW5kZXgoKSB7IHJldHVybiBtX2lQYWdlSW5kZXg7IH0NCisgIENQREZfUGFnZSogR2V0UERGUGFnZSgpIHsgcmV0dXJuIG1fcFBERlBhZ2U7IH0NCisgIElYRkFfUGFnZVZpZXcqIEdldFhGQVBhZ2VWaWV3KCkgeyByZXR1cm4gbV9wWEZBUGFnZVZpZXc7IH0NCiANCi0JRlhfRkxPQVQJR2V0UGFnZVdpZHRoKCk7DQotCUZYX0ZMT0FUCUdldFBhZ2VIZWlnaHQoKTsNCisgIEZYX0ZMT0FUIEdldFBhZ2VXaWR0aCgpOw0KKyAgRlhfRkxPQVQgR2V0UGFnZUhlaWdodCgpOw0KIA0KLQl2b2lkCQlEZXZpY2VUb1BhZ2UoaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LCANCi0JCQkJCQkJIGludCByb3RhdGUsIGludCBkZXZpY2VfeCwgaW50IGRldmljZV95LCBkb3VibGUqIHBhZ2VfeCwgZG91YmxlKiBwYWdlX3kpOw0KLQl2b2lkCQlQYWdlVG9EZXZpY2UoaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LA0KLQkJCQkJCQkgaW50IHJvdGF0ZSwgZG91YmxlIHBhZ2VfeCwgZG91YmxlIHBhZ2VfeSwgaW50KiBkZXZpY2VfeCwgaW50KiBkZXZpY2VfeSk7DQorICB2b2lkIERldmljZVRvUGFnZShpbnQgc3RhcnRfeCwNCisgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LA0KKyAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwNCisgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksDQorICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV94LA0KKyAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV95LA0KKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYWdlX3gsDQorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhZ2VfeSk7DQorICB2b2lkIFBhZ2VUb0RldmljZShpbnQgc3RhcnRfeCwNCisgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LA0KKyAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwNCisgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksDQorICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwNCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3ksDQorICAgICAgICAgICAgICAgICAgICBpbnQqIGRldmljZV94LA0KKyAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeSk7DQogDQotCXZvaWQJCUdldERpc3BsYXlNYXRyaXgoQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4LCBpbnQgeFBvcywgaW50IHlQb3MsIA0KLQkJCQkJCQkJIGludCB4U2l6ZSwgaW50IHlTaXplLCBpbnQgaVJvdGF0ZSkgY29uc3Q7DQorICB2b2lkIEdldERpc3BsYXlNYXRyaXgoQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4UG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB5UG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlSb3RhdGUpIGNvbnN0Ow0KIA0KLXByb3RlY3RlZDoNCi0JRlhfQk9PTAkJTG9hZFBERlBhZ2UoKTsNCi0JRlhfQk9PTAkJTG9hZFhGQVBhZ2VWaWV3KCk7DQorIHByb3RlY3RlZDoNCisgIEZYX0JPT0wgTG9hZFBERlBhZ2UoKTsNCisgIEZYX0JPT0wgTG9hZFhGQVBhZ2VWaWV3KCk7DQogDQotcHJpdmF0ZToNCi0JQ1BERl9QYWdlKgltX3BQREZQYWdlOw0KLQlJWEZBX1BhZ2VWaWV3KiBtX3BYRkFQYWdlVmlldzsNCi0JaW50IG1faVBhZ2VJbmRleDsNCi0JQ1BERlhGQV9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7DQotCWludCBtX2lSZWY7DQorIHByaXZhdGU6DQorICBDUERGX1BhZ2UqIG1fcFBERlBhZ2U7DQorICBJWEZBX1BhZ2VWaWV3KiBtX3BYRkFQYWdlVmlldzsNCisgIGludCBtX2lQYWdlSW5kZXg7DQorICBDUERGWEZBX0RvY3VtZW50KiBtX3BEb2N1bWVudDsNCisgIGludCBtX2lSZWY7DQogfTsNCiANCiAjZW5kaWYNCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3V0aWwuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5oCmluZGV4IDk2NzZiMTMuLmE2ZjMyN2EgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5oCkBAIC0xLDQ0ICsxLDM4IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCi0gDQorDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaWZuZGVmIF9GUERGWEZBX1VUSUxfSF8NCiAjZGVmaW5lIF9GUERGWEZBX1VUSUxfSF8NCiANCi0jZGVmaW5lIEpTX1NUUl9WSUVXRVJUWVBFX1NUQU5EQVJECQlMIkV4Y2hhbmdlIg0KLSNkZWZpbmUgSlNfU1RSX0xBTkdVQU5HRQkJCQlMIkVOVSINCi0jZGVmaW5lIEpTX1NUUl9WSUVXRVJWQVJJQVRJT04JCQlMIkZ1bGwiDQotI2RlZmluZSBKU19TVFJfVklFV0VSVkVSU0lPTl9YRkEJCUwiMTEiDQorI2RlZmluZSBKU19TVFJfVklFV0VSVFlQRV9TVEFOREFSRCBMIkV4Y2hhbmdlIg0KKyNkZWZpbmUgSlNfU1RSX0xBTkdVQU5HRSBMIkVOVSINCisjZGVmaW5lIEpTX1NUUl9WSUVXRVJWQVJJQVRJT04gTCJGdWxsIg0KKyNkZWZpbmUgSlNfU1RSX1ZJRVdFUlZFUlNJT05fWEZBIEwiMTEiDQogDQotY2xhc3MgQ1hGQV9GV0xBZGFwdGVyVGltZXJNZ3IgOiBwdWJsaWMgSUZXTF9BZGFwdGVyVGltZXJNZ3INCi17DQotcHVibGljOg0KLQlDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncihDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KSA6IG1fcEVudihwRW52KQ0KLQl7DQorY2xhc3MgQ1hGQV9GV0xBZGFwdGVyVGltZXJNZ3IgOiBwdWJsaWMgSUZXTF9BZGFwdGVyVGltZXJNZ3Igew0KKyBwdWJsaWM6DQorICBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncihDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KSA6IG1fcEVudihwRW52KSB7fQ0KKyAgdmlydHVhbCBGV0xfRVJSIFN0YXJ0KElGV0xfVGltZXIqIHBUaW1lciwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0VsYXBzZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSFRJTUVSJiBoVGltZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1tZWRpYXRlbHkgPSBUUlVFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTdG9wKEZXTF9IVElNRVIgaFRpbWVyKTsNCiANCi0JfQ0KLQl2aXJ0dWFsIEZXTF9FUlIJCVN0YXJ0KElGV0xfVGltZXIgKnBUaW1lciwgRlhfRFdPUkQgZHdFbGFwc2UsIEZXTF9IVElNRVIgJmhUaW1lciwgRlhfQk9PTCBiSW1tZWRpYXRlbHkgPSBUUlVFKTsNCi0JdmlydHVhbCBGV0xfRVJSCQlTdG9wKEZXTF9IVElNRVIgaFRpbWVyKTsNCisgcHJvdGVjdGVkOg0KKyAgc3RhdGljIHZvaWQgVGltZXJQcm9jKGludDMyX3QgaWRFdmVudCk7DQogDQotcHJvdGVjdGVkOg0KLQlzdGF0aWMgdm9pZCBUaW1lclByb2MoaW50MzJfdCBpZEV2ZW50KTsNCi0NCi0Jc3RhdGljIENGWF9QdHJBcnJheQltc190aW1lckFycmF5Ow0KLQlDUERGRG9jX0Vudmlyb25tZW50KiBtX3BFbnY7DQorICBzdGF0aWMgQ0ZYX1B0ckFycmF5IG1zX3RpbWVyQXJyYXk7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BFbnY7DQogfTsNCiANCi1jbGFzcyBDRldMX1RpbWVySW5mbw0KLXsNCi1wdWJsaWM6DQotCUNGV0xfVGltZXJJbmZvKCkNCi0JCTogcFRpbWVyKE5VTEwpDQotCXsNCi0NCi0JfQ0KLQl1aW50MzJfdCB1SURFdmVudDsNCi0JSUZXTF9UaW1lciAqcFRpbWVyOw0KK2NsYXNzIENGV0xfVGltZXJJbmZvIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9UaW1lckluZm8oKSA6IHBUaW1lcihOVUxMKSB7fQ0KKyAgdWludDMyX3QgdUlERXZlbnQ7DQorICBJRldMX1RpbWVyKiBwVGltZXI7DQogfTsNCiANCi0jZW5kaWYgDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYWN0aW9uaGFuZGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYWN0aW9uaGFuZGxlci5oCmluZGV4IDM5ZWM0ZjQuLmRmYjdkNDggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2FjdGlvbmhhbmRsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19hY3Rpb25oYW5kbGVyLmgKQEAgLTIwLDY1ICsyMCwxMTggQEAKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKIGNsYXNzIElGWEpTX1J1bnRpbWU7CiAKLWNsYXNzIENQREZTREtfRm9ybUFjdGlvbkhhbmRsZXIKLXsKLXB1YmxpYzoKLQlGWF9CT09MCURvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCURvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCURvQWN0aW9uX1Jlc2V0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJRG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworY2xhc3MgQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlciB7CisgcHVibGljOgorICBGWF9CT09MIERvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgRlhfQk9PTCBEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICBGWF9CT09MIERvQWN0aW9uX1Jlc2V0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICBGWF9CT09MIERvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiB9OwogCi1jbGFzcyBDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcgotewotcHVibGljOgotCUZYX0JPT0wJRG9BY3Rpb25fUmVuZGl0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JRlhfQk9PTAlEb0FjdGlvbl9Tb3VuZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJRG9BY3Rpb25fTW92aWUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKK2NsYXNzIENQREZTREtfTWVkaWFBY3Rpb25IYW5kbGVyIHsKKyBwdWJsaWM6CisgIEZYX0JPT0wgRG9BY3Rpb25fUmVuZGl0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIEZYX0JPT0wgRG9BY3Rpb25fU291bmQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICBGWF9CT09MIERvQWN0aW9uX01vdmllKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKIH07CiAKLWNsYXNzIENQREZTREtfQWN0aW9uSGFuZGxlcgotewotcHVibGljOgotCUNQREZTREtfQWN0aW9uSGFuZGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwRXZpKTsKK2NsYXNzIENQREZTREtfQWN0aW9uSGFuZGxlciB7CisgcHVibGljOgorICBDUERGU0RLX0FjdGlvbkhhbmRsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEV2aSk7CiAKLQl2b2lkIFNldE1lZGlhQWN0aW9uSGFuZGxlcihDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlciogcEhhbmRsZXIpOworICB2b2lkIFNldE1lZGlhQWN0aW9uSGFuZGxlcihDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlciogcEhhbmRsZXIpOwogCi0JRlhfQk9PTAkJRG9BY3Rpb25fRG9jT3Blbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJCURvQWN0aW9uX0phdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLENGWF9XaWRlU3RyaW5nIGNzSlNOYW1lLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJCURvQWN0aW9uX1BhZ2UoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJCURvQWN0aW9uX0RvY3VtZW50KGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCQlEb0FjdGlvbl9Cb29rTWFyayhDUERGX0Jvb2ttYXJrICpwQm9va01hcmssIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCQlEb0FjdGlvbl9TY3JlZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCUZYX0JPT0wJCURvQWN0aW9uX0xpbmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCQlEb0FjdGlvbl9GaWVsZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEpOwotCUZYX0JPT0wJCURvQWN0aW9uX0ZpZWxkSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhKTsKKyAgRlhfQk9PTCBEb0FjdGlvbl9Eb2NPcGVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICBGWF9CT09MIERvQWN0aW9uX0phdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NKU05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICBGWF9CT09MIERvQWN0aW9uX1BhZ2UoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIEZYX0JPT0wgRG9BY3Rpb25fRG9jdW1lbnQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgRlhfQk9PTCBEb0FjdGlvbl9Cb29rTWFyayhDUERGX0Jvb2ttYXJrKiBwQm9va01hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgRlhfQk9PTCBEb0FjdGlvbl9TY3JlZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworICBGWF9CT09MIERvQWN0aW9uX0xpbmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgRlhfQk9PTCBEb0FjdGlvbl9GaWVsZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhKTsKKyAgRlhfQk9PTCBEb0FjdGlvbl9GaWVsZEphdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSk7CiAKLXByaXZhdGU6Ci0JRlhfQk9PTAkJCQlFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENGWF9QdHJMaXN0JiBsaXN0KTsKLQlGWF9CT09MCQkJCUV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDRlhfUHRyTGlzdCYgbGlzdCk7Ci0JRlhfQk9PTAkJCQlFeGVjdXRlRmllbGRBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLCBDRlhfUHRyTGlzdCYgbGlzdCk7Ci0JRlhfQk9PTAkJCQlFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ1BERlNES19Bbm5vdCogcFNjcmVlbiwgQ0ZYX1B0ckxpc3QmIGxpc3QpOwotCUZYX0JPT0wJCQkJRXhlY3V0ZUJvb2tNYXJrKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgIENQREZfQm9va21hcmsqIHBCb29rbWFyaywgQ0ZYX1B0ckxpc3QmIGxpc3QpOwotCUZYX0JPT0wJCQkJRXhlY3V0ZUxpbmtBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgQ0ZYX1B0ckxpc3QmIGxpc3QpOworIHByaXZhdGU6CisgIEZYX0JPT0wgRXhlY3V0ZURvY3VtZW50T3BlbkFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckxpc3QmIGxpc3QpOworICBGWF9CT09MIEV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJMaXN0JiBsaXN0KTsKKyAgRlhfQk9PTCBFeGVjdXRlRmllbGRBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJMaXN0JiBsaXN0KTsKKyAgRlhfQk9PTCBFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckxpc3QmIGxpc3QpOworICBGWF9CT09MIEV4ZWN1dGVCb29rTWFyayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQm9va21hcmsqIHBCb29rbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckxpc3QmIGxpc3QpOworICBGWF9CT09MIEV4ZWN1dGVMaW5rQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJMaXN0JiBsaXN0KTsKIAotCXZvaWQJCQkJRG9BY3Rpb25fTm9Kcyhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZvaWQJCQkJUnVuRG9jdW1lbnRQYWdlSmF2YVNjcmlwdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCk7Ci0Jdm9pZAkJCQlSdW5Eb2N1bWVudE9wZW5KYXZhU2NyaXB0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNTY3JpcHROYW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KTsKLQl2b2lkCQkJCVJ1bkZpZWxkSmF2YVNjcmlwdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCk7CisgIHZvaWQgRG9BY3Rpb25fTm9Kcyhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB2b2lkIFJ1bkRvY3VtZW50UGFnZUphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCk7CisgIHZvaWQgUnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc1NjcmlwdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KTsKKyAgdm9pZCBSdW5GaWVsZEphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpOwogCi0JRlhfQk9PTAkJCQlJc1ZhbGlkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOwotCUZYX0JPT0wJCQkJSXNWYWxpZERvY1ZpZXcoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgRlhfQk9PTCBJc1ZhbGlkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOworICBGWF9CT09MIElzVmFsaWREb2NWaWV3KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAKLQl2b2lkCQkJCURvQWN0aW9uX0dvVG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0Jdm9pZAkJCQlEb0FjdGlvbl9Hb1RvUihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOwotCXZvaWQJCQkJRG9BY3Rpb25fTGF1bmNoKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0Jdm9pZAkJCQlEb0FjdGlvbl9VUkkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKLQl2b2lkCQkJCURvQWN0aW9uX05hbWVkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0Jdm9pZAkJCQlEb0FjdGlvbl9TZXRPQ0dTdGF0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworICB2b2lkIERvQWN0aW9uX0dvVG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKKyAgdm9pZCBEb0FjdGlvbl9Hb1RvUihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworICB2b2lkIERvQWN0aW9uX0xhdW5jaChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworICB2b2lkIERvQWN0aW9uX1VSSShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworICB2b2lkIERvQWN0aW9uX05hbWVkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CisgIHZvaWQgRG9BY3Rpb25fU2V0T0NHU3RhdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOwogCi0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPENQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI+IG1fcEZvcm1BY3Rpb25IYW5kbGVyOwotICAgIENQREZTREtfTWVkaWFBY3Rpb25IYW5kbGVyKiBtX3BNZWRpYUFjdGlvbkhhbmRsZXI7CisgIG5vbnN0ZDo6dW5pcXVlX3B0cjxDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyPiBtX3BGb3JtQWN0aW9uSGFuZGxlcjsKKyAgQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXIqIG1fcE1lZGlhQWN0aW9uSGFuZGxlcjsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZTREtfQUNUSU9OSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYW5ub3RoYW5kbGVyLmggYi9mcGRmc2RrL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaAppbmRleCBiNDZhYWUyLi5iNzU1ZTdlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaApAQCAtMjEsMzIzICsyMSw0NjggQEAKIGNsYXNzIENQREZfUG9pbnQ7CiBjbGFzcyBDUERGX1JlY3Q7CiAKLWNsYXNzIElQREZTREtfQW5ub3RIYW5kbGVyCi17CitjbGFzcyBJUERGU0RLX0Fubm90SGFuZGxlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUERGU0RLX0Fubm90SGFuZGxlcigpe307CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIH5JUERGU0RLX0Fubm90SGFuZGxlcigpIHt9OworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldFR5cGUoKSA9IDA7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRUeXBlKCkgPSAwOworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldE5hbWUoKSA9IDA7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXROYW1lKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKKyAgdmlydHVhbCBDUERGU0RLX0Fubm90KiBOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpID0gMDsKIAorICB2aXJ0dWFsIENQREZTREtfQW5ub3QqIE5ld0Fubm90KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKSA9IDA7CiAKLQl2aXJ0dWFsIENQREZTREtfQW5ub3QqCQlOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7CiAKLQl2aXJ0dWFsIENQREZTREtfQW5ub3QqCQlOZXdBbm5vdChJWEZBX1dpZGdldCogaFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpID0gMDsKKyAgdmlydHVhbCB2b2lkIERlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCVJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlEZWxldGVBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEhpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CiAKKyAgdmlydHVhbCB2b2lkIE9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSA9IDA7CiAKLQl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25EcmF3U2xlZXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgPSAwOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKIAorICB2aXJ0dWFsIHZvaWQgT25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLQkJQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJRlhfRFdPUkQgZHdGbGFncykgPSAwOworICB2aXJ0dWFsIHZvaWQgT25EZWxldGUoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3U2xlZXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0JCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCWNvbnN0IENQREZfUmVjdCYgcmNXaW5kb3csIEZYX0RXT1JEIGR3RmxhZ3MpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uUmVsZWFzZShDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKIAorICB2aXJ0dWFsIHZvaWQgT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSA9IDA7CiAKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIC8vIGJ5IHdqbS4KKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKSA9IDA7CiAKKyAgdmlydHVhbCB2b2lkIE9uRGVTZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJT25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwotCi0JdmlydHVhbCB2b2lkCQkJCU9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwotCi0JdmlydHVhbCB2b2lkCQkJCU9uUmVsZWFzZShDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKLQotCi0JdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7Ci0KLQotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwotLy9ieSB3am0uCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKSA9MCA7Ci0KLQl2aXJ0dWFsCXZvaWQJCQkJT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwotCXZpcnR1YWwJdm9pZAkJCQlPblNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwotCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uWEZBQ2hhbmdlZEZvY3VzKENQREZTREtfQW5ub3QqIHBPbGRBbm5vdCwgQ1BERlNES19Bbm5vdCogcE5ld0Fubm90KSA9IDA7Ci0KKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgT25YRkFDaGFuZ2VkRm9jdXMoQ1BERlNES19Bbm5vdCogcE9sZEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcE5ld0Fubm90KSA9IDA7CiB9OwogCitjbGFzcyBDUERGU0RLX0JGQW5ub3RIYW5kbGVyIDogcHVibGljIElQREZTREtfQW5ub3RIYW5kbGVyIHsKKyBwdWJsaWM6CisgIENQREZTREtfQkZBbm5vdEhhbmRsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkKKyAgICAgIDogbV9wQXBwKHBBcHApLCBtX3BGb3JtRmlsbGVyKE5VTEwpIHt9CisgIHZpcnR1YWwgfkNQREZTREtfQkZBbm5vdEhhbmRsZXIoKSB7fQogCi1jbGFzcyBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOnB1YmxpYyBJUERGU0RLX0Fubm90SGFuZGxlcgotewotcHVibGljOgotCUNQREZTREtfQkZBbm5vdEhhbmRsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkgOiBtX3BBcHAocEFwcCksIG1fcEZvcm1GaWxsZXIoTlVMTCkge30KLQl2aXJ0dWFsCX5DUERGU0RLX0JGQW5ub3RIYW5kbGVyKCkge30KLXB1YmxpYzoKKyBwdWJsaWM6CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0VHlwZSgpIHsgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCJXaWRnZXQiKTsgfQogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0VHlwZSgpICB7cmV0dXJuIENGWF9CeXRlU3RyaW5nKCJXaWRnZXQiKTt9CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZSgpIHsgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCJXaWRnZXRIYW5kbGVyIik7IH0KIAotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldE5hbWUoKSAge3JldHVybiBDRlhfQnl0ZVN0cmluZygiV2lkZ2V0SGFuZGxlciIpO30KKyAgdmlydHVhbCBGWF9CT09MIENhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2aXJ0dWFsIENQREZTREtfQW5ub3QqIE5ld0Fubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpOwogCi0JdmlydHVhbCBDUERGU0RLX0Fubm90KgkJTmV3QW5ub3QoQ1BERl9Bbm5vdCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSk7CisgIHZpcnR1YWwgQ1BERlNES19Bbm5vdCogTmV3QW5ub3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpOwogCi0JdmlydHVhbCBDUERGU0RLX0Fubm90KgkJTmV3QW5ub3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKTsKKyAgdmlydHVhbCB2b2lkIFJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCi0JdmlydHVhbCB2b2lkCQkJCVJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpICA7CisgIHZpcnR1YWwgdm9pZCBEZWxldGVBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CiAKLQl2aXJ0dWFsIHZvaWQJCQkJRGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorICB2aXJ0dWFsIENQREZfUmVjdCBHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKKyAgdmlydHVhbCBGWF9CT09MIEhpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KSA7CisgIHZpcnR1YWwgdm9pZCBPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIHZvaWQgT25EcmF3U2xlZXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykge30KIAorICB2aXJ0dWFsIHZvaWQgT25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXcoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0JCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCSBGWF9EV09SRCBkd0ZsYWdzKSA7CisgIHZpcnR1YWwgdm9pZCBPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXdTbGVlcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLQkJQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJY29uc3QgQ1BERl9SZWN0JiByY1dpbmRvdywgRlhfRFdPUkQgZHdGbGFncykge30KKyAgdmlydHVhbCB2b2lkIE9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KIAorICB2aXJ0dWFsIHZvaWQgT25SZWxlYXNlKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KIAotCXZpcnR1YWwgdm9pZAkJCQlPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpIDsKKyAgdmlydHVhbCB2b2lkIE9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCB2b2lkIE9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KSA7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25EZWxldGUoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorICAvLyBieSB3am0uCisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uUmVsZWFzZShDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CisgIHZpcnR1YWwgdm9pZCBPbkRlU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorICB2aXJ0dWFsIHZvaWQgT25TZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CiAKKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uWEZBQ2hhbmdlZEZvY3VzKENQREZTREtfQW5ub3QqIHBPbGRBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBOZXdBbm5vdCkgeworICAgIHJldHVybiBUUlVFOworICB9CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgOwotCXZpcnR1YWwgdm9pZAkJCQlPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpIDsKKyAgdm9pZCBTZXRGb3JtRmlsbGVyKENGRkxfSUZvcm1GaWxsZXIqIHBGaWxsZXIpIHsgbV9wRm9ybUZpbGxlciA9IHBGaWxsZXI7IH0KKyAgQ0ZGTF9JRm9ybUZpbGxlciogR2V0Rm9ybUZpbGxlcigpIHsgcmV0dXJuIG1fcEZvcm1GaWxsZXI7IH0KIAotCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7cmV0dXJuIEZBTFNFO30KLQotLy9ieSB3am0uCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZyk7Ci0KLQl2aXJ0dWFsCXZvaWQJCQkJT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KLQl2aXJ0dWFsCXZvaWQJCQkJT25TZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9Ci0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uWEZBQ2hhbmdlZEZvY3VzKENQREZTREtfQW5ub3QqIHBPbGRBbm5vdCwgQ1BERlNES19Bbm5vdCogcE5ld0Fubm90KXsgcmV0dXJuIFRSVUU7IH0KLQotCXZvaWQJCQkJCQlTZXRGb3JtRmlsbGVyKENGRkxfSUZvcm1GaWxsZXIqIHBGaWxsZXIpe21fcEZvcm1GaWxsZXIgPSBwRmlsbGVyO30KLQlDRkZMX0lGb3JtRmlsbGVyKgkJCUdldEZvcm1GaWxsZXIoKSB7cmV0dXJuIG1fcEZvcm1GaWxsZXI7fQotcHJpdmF0ZToKLQotCUNQREZEb2NfRW52aXJvbm1lbnQqCQltX3BBcHA7Ci0JQ0ZGTF9JRm9ybUZpbGxlcioJCQltX3BGb3JtRmlsbGVyOworIHByaXZhdGU6CisgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEFwcDsKKyAgQ0ZGTF9JRm9ybUZpbGxlciogbV9wRm9ybUZpbGxlcjsKIH07CiAKLWNsYXNzIENQREZTREtfWEZBQW5ub3RIYW5kbGVyIDogcHVibGljIElQREZTREtfQW5ub3RIYW5kbGVyCi17Ci1wdWJsaWM6Ci0JQ1BERlNES19YRkFBbm5vdEhhbmRsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7Ci0JfkNQREZTREtfWEZBQW5ub3RIYW5kbGVyKCl7fQorY2xhc3MgQ1BERlNES19YRkFBbm5vdEhhbmRsZXIgOiBwdWJsaWMgSVBERlNES19Bbm5vdEhhbmRsZXIgeworIHB1YmxpYzoKKyAgQ1BERlNES19YRkFBbm5vdEhhbmRsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7CisgIH5DUERGU0RLX1hGQUFubm90SGFuZGxlcigpIHt9CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRUeXBlKCkgeyByZXR1cm4gRlNES19YRkFXSURHRVRfVFlQRU5BTUU7IH0KKyBwdWJsaWM6CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0VHlwZSgpIHsgcmV0dXJuIEZTREtfWEZBV0lER0VUX1RZUEVOQU1FOyB9CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXROYW1lKCkgeyByZXR1cm4gIlhGQVdpZGdldEhhbmRsZXIiOyB9CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZSgpIHsgcmV0dXJuICJYRkFXaWRnZXRIYW5kbGVyIjsgfQogCi0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKKyAgdmlydHVhbCBDUERGU0RLX0Fubm90KiBOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KIAotCXZpcnR1YWwgQ1BERlNES19Bbm5vdCoJCU5ld0Fubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpIHsgcmV0dXJuIE5VTEw7IH0KKyAgdmlydHVhbCBDUERGU0RLX0Fubm90KiBOZXdBbm5vdChJWEZBX1dpZGdldCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSk7CiAKLQl2aXJ0dWFsIENQREZTREtfQW5ub3QqCQlOZXdBbm5vdChJWEZBX1dpZGdldCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSk7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotCXZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCB2b2lkIERlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KIAotCXZpcnR1YWwgdm9pZAkJCQlEZWxldGVBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAorICB2aXJ0dWFsIEZYX0JPT0wgSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0JdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2aXJ0dWFsIHZvaWQgT25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCB2b2lkIE9uRHJhd1NsZWVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY1dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHt9CiAKKyAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KIAotCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXcoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0JCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCUZYX0RXT1JEIGR3RmxhZ3MpOworICB2aXJ0dWFsIHZvaWQgT25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KIAotCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXdTbGVlcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLQkJQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJY29uc3QgQ1BERl9SZWN0JiByY1dpbmRvdywgRlhfRFdPUkQgZHdGbGFncykge30KKyAgdmlydHVhbCB2b2lkIE9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KIAorICB2aXJ0dWFsIHZvaWQgT25SZWxlYXNlKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KIAorICB2aXJ0dWFsIHZvaWQgT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIHZvaWQgT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpOwogCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgLy8gYnkgd2ptLgorICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MpOworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CisgIHZpcnR1YWwgdm9pZCBPbkRlU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorICB2aXJ0dWFsIHZvaWQgT25TZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uWEZBQ2hhbmdlZEZvY3VzKENQREZTREtfQW5ub3QqIHBPbGRBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBOZXdBbm5vdCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25EZWxldGUoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorIHByaXZhdGU6CisgIElYRkFfV2lkZ2V0SGFuZGxlciogR2V0WEZBV2lkZ2V0SGFuZGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICBGWF9EV09SRCBHZXRGV0xGbGFncyhGWF9EV09SRCBkd0ZsYWcpOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uUmVsZWFzZShDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9Ci0KLQotCXZpcnR1YWwgdm9pZAkJCQlPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKLQotCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA7Ci0JLy9ieSB3am0uCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZyk7Ci0KLQl2aXJ0dWFsCXZvaWQJCQkJT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KLQl2aXJ0dWFsCXZvaWQJCQkJT25TZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9Ci0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblhGQUNoYW5nZWRGb2N1cyhDUERGU0RLX0Fubm90KiBwT2xkQW5ub3QsIENQREZTREtfQW5ub3QqIHBOZXdBbm5vdCk7Ci0KLXByaXZhdGU6Ci0JSVhGQV9XaWRnZXRIYW5kbGVyKgkJCUdldFhGQVdpZGdldEhhbmRsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQlGWF9EV09SRAkJCQkJR2V0RldMRmxhZ3MoRlhfRFdPUkQgZHdGbGFnKTsKLQotcHJpdmF0ZToKLQlDUERGRG9jX0Vudmlyb25tZW50KgkJbV9wQXBwOworIHByaXZhdGU6CisgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEFwcDsKIH07CiAKICNkZWZpbmUgQ0JBX0Fubm90SGFuZGxlckFycmF5IENGWF9BcnJheVRlbXBsYXRlPElQREZTREtfQW5ub3RIYW5kbGVyKj4KLWNsYXNzIENQREZTREtfQW5ub3RIYW5kbGVyTWdyCi17Ci1wdWJsaWM6Ci0JLy8gRGVzdHJveSB0aGUgaGFuZGxlcgotCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwotCXZpcnR1YWwgfkNQREZTREtfQW5ub3RIYW5kbGVyTWdyKCkgOworY2xhc3MgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IgeworIHB1YmxpYzoKKyAgLy8gRGVzdHJveSB0aGUgaGFuZGxlcgorICBDUERGU0RLX0Fubm90SGFuZGxlck1ncihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKTsKKyAgdmlydHVhbCB+Q1BERlNES19Bbm5vdEhhbmRsZXJNZ3IoKTsKIAotcHVibGljOgotCXZvaWQJCQkJCQlSZWdpc3RlckFubm90SGFuZGxlcihJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlcik7Ci0Jdm9pZAkJCQkJCVVuUmVnaXN0ZXJBbm5vdEhhbmRsZXIoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIpOworIHB1YmxpYzoKKyAgdm9pZCBSZWdpc3RlckFubm90SGFuZGxlcihJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlcik7CisgIHZvaWQgVW5SZWdpc3RlckFubm90SGFuZGxlcihJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlcik7CiAKLQl2aXJ0dWFsIENQREZTREtfQW5ub3QqCQlOZXdBbm5vdChDUERGX0Fubm90ICogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcpOwotCXZpcnR1YWwgQ1BERlNES19Bbm5vdCoJCU5ld0Fubm90KElYRkFfV2lkZ2V0KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0JdmlydHVhbCB2b2lkCQkJCVJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90ICogcEFubm90KTsKKyAgdmlydHVhbCBDUERGU0RLX0Fubm90KiBOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdmlydHVhbCBDUERGU0RLX0Fubm90KiBOZXdBbm5vdChJWEZBX1dpZGdldCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotCXZpcnR1YWwgdm9pZAkJCQlBbm5vdF9PbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgdm9pZAkJCQlBbm5vdF9PbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KTsKLXB1YmxpYzoKLQlJUERGU0RLX0Fubm90SGFuZGxlcioJCUdldEFubm90SGFuZGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQlBbm5vdF9PbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0JCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsRlhfRFdPUkQgZHdGbGFncyk7CisgIHZpcnR1YWwgdm9pZCBBbm5vdF9PbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2aXJ0dWFsIHZvaWQgQW5ub3RfT25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJQW5ub3RfT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzKTsKLQl2aXJ0dWFsIHZvaWQJCQkJQW5ub3RfT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MpOworIHB1YmxpYzoKKyAgSVBERlNES19Bbm5vdEhhbmRsZXIqIEdldEFubm90SGFuZGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgQW5ub3RfT25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgdm9pZCBBbm5vdF9Pbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MpOworICB2aXJ0dWFsIHZvaWQgQW5ub3RfT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9Pbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9Pbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9PbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgQW5ub3RfT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9PblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzKTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9PbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwJRlhfQk9PTAkJCQlBbm5vdF9PbkNoYW5nZUZvY3VzKENQREZTREtfQW5ub3QqIHBTZXRBbm5vdCxDUERGU0RLX0Fubm90KiBwS2lsbEFubm90KTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9PbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uQ2hhbmdlRm9jdXMoQ1BERlNES19Bbm5vdCogcFNldEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwS2lsbEFubm90KTsKIAotCXZpcnR1YWwgQ1BERl9SZWN0CQkJQW5ub3RfT25HZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIENQREZfUmVjdCBBbm5vdF9PbkdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2aXJ0dWFsIEZYX0JPT0wgQW5ub3RfT25IaXRUZXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi1wcml2YXRlOgotCUlQREZTREtfQW5ub3RIYW5kbGVyKgkJCUdldEFubm90SGFuZGxlcihjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1R5cGUpIGNvbnN0OwotCUNQREZTREtfQW5ub3QqCQkJCUdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsRlhfQk9PTCBiTmV4dCk7Ci1wcml2YXRlOgotCUNCQV9Bbm5vdEhhbmRsZXJBcnJheQkJbV9IYW5kbGVyczsKLQlDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCQltX21hcFR5cGUySGFuZGxlcjsKLQlDUERGRG9jX0Vudmlyb25tZW50KgkJbV9wQXBwOworIHByaXZhdGU6CisgIElQREZTREtfQW5ub3RIYW5kbGVyKiBHZXRBbm5vdEhhbmRsZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNUeXBlKSBjb25zdDsKKyAgQ1BERlNES19Bbm5vdCogR2V0TmV4dEFubm90KENQREZTREtfQW5ub3QqIHBTREtBbm5vdCwgRlhfQk9PTCBiTmV4dCk7CisKKyBwcml2YXRlOgorICBDQkFfQW5ub3RIYW5kbGVyQXJyYXkgbV9IYW5kbGVyczsKKyAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX21hcFR5cGUySGFuZGxlcjsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogbV9wQXBwOwogfTsKIAotdHlwZWRlZiBpbnQgKCpBSV9DT01QQVJFKSAoQ1BERlNES19Bbm5vdCogcDEsIENQREZTREtfQW5ub3QqIHAyKTsKK3R5cGVkZWYgaW50ICgqQUlfQ09NUEFSRSkoQ1BERlNES19Bbm5vdCogcDEsIENQREZTREtfQW5ub3QqIHAyKTsKIAotY2xhc3MgQ1BERlNES19Bbm5vdEl0ZXJhdG9yCi17Ci1wdWJsaWM6Ci0gICAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJldmVyc2UsCi0JCUZYX0JPT0wgYklnbm9yZVRvcG1vc3Q9RkFMU0UsRlhfQk9PTCBiQ2lyY2xlPUZBTFNFLENGWF9QdHJBcnJheSogcExpc3Q9TlVMTCk7Ci0gICAgdmlydHVhbCB+Q1BERlNES19Bbm5vdEl0ZXJhdG9yKCkgeyB9CitjbGFzcyBDUERGU0RLX0Fubm90SXRlcmF0b3IgeworIHB1YmxpYzoKKyAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldmVyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVUb3Btb3N0ID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaXJjbGUgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogcExpc3QgPSBOVUxMKTsKKyAgdmlydHVhbCB+Q1BERlNES19Bbm5vdEl0ZXJhdG9yKCkge30KIAotCXZpcnR1YWwgQ1BERlNES19Bbm5vdCoJTmV4dCAoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpIDsKLQl2aXJ0dWFsIENQREZTREtfQW5ub3QqCVByZXYgKGNvbnN0IENQREZTREtfQW5ub3QqIHBDdXJyZW50KSA7Ci0JdmlydHVhbCBDUERGU0RLX0Fubm90KglOZXh0KGludCYgaW5kZXggKSA7Ci0JdmlydHVhbCBDUERGU0RLX0Fubm90KglQcmV2KGludCYgaW5kZXggKSA7Ci0JdmlydHVhbCBpbnQgICAgICAgICAgICAgQ291bnQoKXtyZXR1cm4gbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0U2l6ZSgpO30KKyAgdmlydHVhbCBDUERGU0RLX0Fubm90KiBOZXh0KGNvbnN0IENQREZTREtfQW5ub3QqIHBDdXJyZW50KTsKKyAgdmlydHVhbCBDUERGU0RLX0Fubm90KiBQcmV2KGNvbnN0IENQREZTREtfQW5ub3QqIHBDdXJyZW50KTsKKyAgdmlydHVhbCBDUERGU0RLX0Fubm90KiBOZXh0KGludCYgaW5kZXgpOworICB2aXJ0dWFsIENQREZTREtfQW5ub3QqIFByZXYoaW50JiBpbmRleCk7CisgIHZpcnR1YWwgaW50IENvdW50KCkgeyByZXR1cm4gbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0U2l6ZSgpOyB9CiAKLQl2aXJ0dWFsIEZYX0JPT0wgICAgICAgICBJbml0SXRlcmF0b3JBbm5vdExpc3QoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldyxDRlhfUHRyQXJyYXkqIHBMaXN0PU5VTEwpOworICB2aXJ0dWFsIEZYX0JPT0wgSW5pdEl0ZXJhdG9yQW5ub3RMaXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBMaXN0ID0gTlVMTCk7CiAKLQl2b2lkCQkJCQlJbnNlcnRTb3J0KENGWF9QdHJBcnJheSAmYXJyYXlMaXN0LCBBSV9DT01QQVJFIHBDb21wYXJlKTsKKyAgdm9pZCBJbnNlcnRTb3J0KENGWF9QdHJBcnJheSYgYXJyYXlMaXN0LCBBSV9DT01QQVJFIHBDb21wYXJlKTsKIAotcHJvdGVjdGVkOgotCUNQREZTREtfQW5ub3QqCU5leHRBbm5vdCAoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpIDsKLQlDUERGU0RLX0Fubm90KglQcmV2QW5ub3QgKGNvbnN0IENQREZTREtfQW5ub3QqIHBDdXJyZW50KSA7Ci0JQ1BERlNES19Bbm5vdCoJTmV4dEFubm90KGludCYgaW5kZXggKSA7Ci0JQ1BERlNES19Bbm5vdCoJUHJldkFubm90KGludCYgaW5kZXggKSA7CisgcHJvdGVjdGVkOgorICBDUERGU0RLX0Fubm90KiBOZXh0QW5ub3QoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpOworICBDUERGU0RLX0Fubm90KiBQcmV2QW5ub3QoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpOworICBDUERGU0RLX0Fubm90KiBOZXh0QW5ub3QoaW50JiBpbmRleCk7CisgIENQREZTREtfQW5ub3QqIFByZXZBbm5vdChpbnQmIGluZGV4KTsKIAotCUNGWF9QdHJBcnJheQkgICAgIG1fcEl0ZXJhdG9yQW5ub3RMaXN0OwotCUZYX0JPT0wJCQkgICAgIG1fYlJldmVyc2U7Ci0JRlhfQk9PTCAgICAgICAgICAgICAgbV9iSWdub3JlVG9wbW9zdDsKLQlGWF9CT09MICAgICAgICAgICAgICBtX2JDaXJjbGU7CisgIENGWF9QdHJBcnJheSBtX3BJdGVyYXRvckFubm90TGlzdDsKKyAgRlhfQk9PTCBtX2JSZXZlcnNlOworICBGWF9CT09MIG1fYklnbm9yZVRvcG1vc3Q7CisgIEZYX0JPT0wgbV9iQ2lyY2xlOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlNES19BTk5PVEhBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgKaW5kZXggYjcxZTEyOC4uNzA2ZTk2NCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgKQEAgLTI1LDE5MiArMjUsMTk4IEBACiBjbGFzcyBDUERGX1JlbmRlck9wdGlvbnM7CiBjbGFzcyBDRlhfUmVuZGVyRGV2aWNlOwogCi0jZGVmaW5lIENGWF9JbnRBcnJheQkJCQlDRlhfQXJyYXlUZW1wbGF0ZTxpbnQ+CisjZGVmaW5lIENGWF9JbnRBcnJheSBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQ+CiAKLWNsYXNzICBDUERGU0RLX0RhdGVUaW1lCi17Ci1wdWJsaWM6Ci0JQ1BERlNES19EYXRlVGltZSgpOwotCUNQREZTREtfRGF0ZVRpbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGR0U3RyKTsKLQlDUERGU0RLX0RhdGVUaW1lKGNvbnN0IENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQlDUERGU0RLX0RhdGVUaW1lKGNvbnN0IEZYX1NZU1RFTVRJTUUmIHN0KTsKK2NsYXNzIENQREZTREtfRGF0ZVRpbWUgeworIHB1YmxpYzoKKyAgQ1BERlNES19EYXRlVGltZSgpOworICBDUERGU0RLX0RhdGVUaW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBkdFN0cik7CisgIENQREZTREtfRGF0ZVRpbWUoY29uc3QgQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworICBDUERGU0RLX0RhdGVUaW1lKGNvbnN0IEZYX1NZU1RFTVRJTUUmIHN0KTsKIAorICBDUERGU0RLX0RhdGVUaW1lJiBvcGVyYXRvcj0oY29uc3QgQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworICBDUERGU0RLX0RhdGVUaW1lJiBvcGVyYXRvcj0oY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpOworICBGWF9CT09MIG9wZXJhdG9yPT0oQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworICBGWF9CT09MIG9wZXJhdG9yIT0oQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworICBGWF9CT09MIG9wZXJhdG9yPihDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7CisgIEZYX0JPT0wgb3BlcmF0b3I+PShDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7CisgIEZYX0JPT0wgb3BlcmF0b3I8KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKKyAgRlhfQk9PTCBvcGVyYXRvcjw9KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKKyAgb3BlcmF0b3IgdGltZV90KCk7CiAKLQlDUERGU0RLX0RhdGVUaW1lJglvcGVyYXRvciA9IChjb25zdCBDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7Ci0JQ1BERlNES19EYXRlVGltZSYJb3BlcmF0b3IgPSAoY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpOwotCUZYX0JPT0wJCQkJb3BlcmF0b3IgPT0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQlGWF9CT09MCQkJCW9wZXJhdG9yICE9IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7Ci0JRlhfQk9PTAkJCQlvcGVyYXRvciA+IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7Ci0JRlhfQk9PTAkJCQlvcGVyYXRvciA+PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOwotCUZYX0JPT0wJCQkJb3BlcmF0b3IgPCAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOwotCUZYX0JPT0wJCQkJb3BlcmF0b3IgPD0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQkJCQkJCW9wZXJhdG9yIHRpbWVfdCgpOworICBDUERGU0RLX0RhdGVUaW1lJiBGcm9tUERGRGF0ZVRpbWVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGR0U3RyKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgVG9Db21tb25EYXRlVGltZVN0cmluZygpOworICBDRlhfQnl0ZVN0cmluZyBUb1BERkRhdGVUaW1lU3RyaW5nKCk7CisgIHZvaWQgVG9TeXN0ZW1UaW1lKEZYX1NZU1RFTVRJTUUmIHN0KTsKKyAgQ1BERlNES19EYXRlVGltZSBUb0dNVCgpOworICBDUERGU0RLX0RhdGVUaW1lJiBBZGREYXlzKHNob3J0IGRheXMpOworICBDUERGU0RLX0RhdGVUaW1lJiBBZGRTZWNvbmRzKGludCBzZWNvbmRzKTsKIAotCUNQREZTREtfRGF0ZVRpbWUmCUZyb21QREZEYXRlVGltZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgZHRTdHIpOwotCUNGWF9CeXRlU3RyaW5nCQlUb0NvbW1vbkRhdGVUaW1lU3RyaW5nKCk7Ci0JQ0ZYX0J5dGVTdHJpbmcJCVRvUERGRGF0ZVRpbWVTdHJpbmcoKTsKLQl2b2lkCQkJCVRvU3lzdGVtVGltZShGWF9TWVNURU1USU1FJiBzdCk7Ci0JQ1BERlNES19EYXRlVGltZQlUb0dNVCgpOwotCUNQREZTREtfRGF0ZVRpbWUmCUFkZERheXMoc2hvcnQgZGF5cyk7Ci0JQ1BERlNES19EYXRlVGltZSYJQWRkU2Vjb25kcyhpbnQgc2Vjb25kcyk7CisgIHZvaWQgUmVzZXREYXRlVGltZSgpOwogCi0Jdm9pZAkJCQlSZXNldERhdGVUaW1lKCk7Ci0KLQlzdHJ1Y3QgRlhfREFURVRJTUUKLQl7Ci0JCWludDE2X3QJeWVhcjsKLQkJdWludDhfdAkJbW9udGg7Ci0JCXVpbnQ4X3QJCWRheTsKLQkJdWludDhfdAkJaG91cjsKLQkJdWludDhfdAkJbWludXRlOwotCQl1aW50OF90CQlzZWNvbmQ7Ci0JCWludDhfdCAJdHpIb3VyOwotCQl1aW50OF90CQl0ek1pbnV0ZTsKLQl9ZHQ7CisgIHN0cnVjdCBGWF9EQVRFVElNRSB7CisgICAgaW50MTZfdCB5ZWFyOworICAgIHVpbnQ4X3QgbW9udGg7CisgICAgdWludDhfdCBkYXk7CisgICAgdWludDhfdCBob3VyOworICAgIHVpbnQ4X3QgbWludXRlOworICAgIHVpbnQ4X3Qgc2Vjb25kOworICAgIGludDhfdCB0ekhvdXI7CisgICAgdWludDhfdCB0ek1pbnV0ZTsKKyAgfSBkdDsKIH07CiAKLWNsYXNzIENQREZTREtfQW5ub3QKLXsKLXB1YmxpYzoKLQlDUERGU0RLX0Fubm90KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0gICAgdmlydHVhbCB+Q1BERlNES19Bbm5vdCgpIHt9OwotcHVibGljOgotCXZpcnR1YWwJRlhfQk9PTAkJCQlJc1hGQUZpZWxkKCkgeyByZXR1cm4gRkFMU0U7IH0KK2NsYXNzIENQREZTREtfQW5ub3QgeworIHB1YmxpYzoKKyAgQ1BERlNES19Bbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIH5DUERGU0RLX0Fubm90KCl7fTsKIAotCXZpcnR1YWwgRlhfRkxPQVQJCQlHZXRNaW5XaWR0aCgpIGNvbnN0OwotCXZpcnR1YWwgRlhfRkxPQVQJCQlHZXRNaW5IZWlnaHQoKSBjb25zdDsKLQkvL2RlZmluZSBsYXlvdXQgb3JkZXIgdG8gNS4KLQl2aXJ0dWFsIGludAkJCQkJR2V0TGF5b3V0T3JkZXIoKSBjb25zdCB7IHJldHVybiA1OyB9CisgcHVibGljOgorICB2aXJ0dWFsIEZYX0JPT0wgSXNYRkFGaWVsZCgpIHsgcmV0dXJuIEZBTFNFOyB9CiAKLQl2aXJ0dWFsIENQREZfQW5ub3QqCQkJR2V0UERGQW5ub3QoKSB7IHJldHVybiBOVUxMOyB9Ci0JdmlydHVhbCBJWEZBX1dpZGdldCoJCUdldFhGQVdpZGdldCgpIHsgcmV0dXJuIE5VTEw7IH0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRNaW5XaWR0aCgpIGNvbnN0OworICB2aXJ0dWFsIEZYX0ZMT0FUIEdldE1pbkhlaWdodCgpIGNvbnN0OworICAvLyBkZWZpbmUgbGF5b3V0IG9yZGVyIHRvIDUuCisgIHZpcnR1YWwgaW50IEdldExheW91dE9yZGVyKCkgY29uc3QgeyByZXR1cm4gNTsgfQogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuICIiOyB9Ci0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0U3ViVHlwZSgpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgQ1BERl9Bbm5vdCogR2V0UERGQW5ub3QoKSB7IHJldHVybiBOVUxMOyB9CisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldFhGQVdpZGdldCgpIHsgcmV0dXJuIE5VTEw7IH0KIAotCXZpcnR1YWwgdm9pZAkJCQlTZXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkge30KLQl2aXJ0dWFsIENQREZfUmVjdAkJCUdldFJlY3QoKSBjb25zdCB7IHJldHVybiBDUERGX1JlY3QoKTsgfQorICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldFN1YlR5cGUoKSBjb25zdCB7IHJldHVybiAiIjsgfQogCi0JdmlydHVhbCB2b2lkCQkJCUFubm90X09uRHJhdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHt9CisgIHZpcnR1YWwgdm9pZCBTZXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkge30KKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0UmVjdCgpIGNvbnN0IHsgcmV0dXJuIENQREZfUmVjdCgpOyB9CiAKLXB1YmxpYzoKLQlDUERGX1BhZ2UqCQkJCQlHZXRQREZQYWdlKCk7Ci0JQ1BERlhGQV9QYWdlKgkJCQlHZXRQREZYRkFQYWdlKCk7CisgIHZpcnR1YWwgdm9pZCBBbm5vdF9PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHt9CiAKLQl2b2lkCQkJCQkJU2V0UGFnZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsgbV9wUGFnZVZpZXcgPSBwUGFnZVZpZXc7IH0KLQlDUERGU0RLX1BhZ2VWaWV3KgkJCUdldFBhZ2VWaWV3KCkgeyByZXR1cm4gbV9wUGFnZVZpZXc7IH0KKyBwdWJsaWM6CisgIENQREZfUGFnZSogR2V0UERGUGFnZSgpOworICBDUERGWEZBX1BhZ2UqIEdldFBERlhGQVBhZ2UoKTsKIAotCS8vIFRhYiBPcmRlcgotCWludAkJCQkJCQlHZXRUYWJPcmRlcigpOwotCXZvaWQJCQkJCQlTZXRUYWJPcmRlcihpbnQgaVRhYk9yZGVyKTsKKyAgdm9pZCBTZXRQYWdlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeyBtX3BQYWdlVmlldyA9IHBQYWdlVmlldzsgfQorICBDUERGU0RLX1BhZ2VWaWV3KiBHZXRQYWdlVmlldygpIHsgcmV0dXJuIG1fcFBhZ2VWaWV3OyB9CiAKLQkvLyBTZWxlY3Rpb24KLQlGWF9CT09MCQkJCQkJSXNTZWxlY3RlZCgpOwotCXZvaWQJCQkJCQlTZXRTZWxlY3RlZChGWF9CT09MIGJTZWxlY3RlZCk7CisgIC8vIFRhYiBPcmRlcgorICBpbnQgR2V0VGFiT3JkZXIoKTsKKyAgdm9pZCBTZXRUYWJPcmRlcihpbnQgaVRhYk9yZGVyKTsKIAotcHJvdGVjdGVkOgotCUNQREZfQW5ub3QqCQkJbV9wQW5ub3Q7Ci0JQ1BERlNES19QYWdlVmlldyoJbV9wUGFnZVZpZXc7Ci0JRlhfQk9PTAkJCQltX2JTZWxlY3RlZDsKLQlpbnQJCQkJCW1fblRhYk9yZGVyOworICAvLyBTZWxlY3Rpb24KKyAgRlhfQk9PTCBJc1NlbGVjdGVkKCk7CisgIHZvaWQgU2V0U2VsZWN0ZWQoRlhfQk9PTCBiU2VsZWN0ZWQpOwogCisgcHJvdGVjdGVkOgorICBDUERGX0Fubm90KiBtX3BBbm5vdDsKKyAgQ1BERlNES19QYWdlVmlldyogbV9wUGFnZVZpZXc7CisgIEZYX0JPT0wgbV9iU2VsZWN0ZWQ7CisgIGludCBtX25UYWJPcmRlcjsKIH07CiAKLWNsYXNzIENQREZTREtfQkFBbm5vdCA6IHB1YmxpYyBDUERGU0RLX0Fubm90Ci17Ci1wdWJsaWM6Ci0JQ1BERlNES19CQUFubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIH5DUERGU0RLX0JBQW5ub3QoKTsKK2NsYXNzIENQREZTREtfQkFBbm5vdCA6IHB1YmxpYyBDUERGU0RLX0Fubm90IHsKKyBwdWJsaWM6CisgIENQREZTREtfQkFBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZpcnR1YWwgfkNQREZTREtfQkFBbm5vdCgpOwogCi1wdWJsaWM6Ci0JdmlydHVhbCBGWF9CT09MCQkJCUlzWEZBRmllbGQoKTsKKyBwdWJsaWM6CisgIHZpcnR1YWwgRlhfQk9PTCBJc1hGQUZpZWxkKCk7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRUeXBlKCkgY29uc3Q7Ci0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0U3ViVHlwZSgpIGNvbnN0OworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldFR5cGUoKSBjb25zdDsKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXRTdWJUeXBlKCkgY29uc3Q7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJU2V0UmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpOwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJR2V0UmVjdCgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU2V0UmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpOworICB2aXJ0dWFsIENQREZfUmVjdCBHZXRSZWN0KCkgY29uc3Q7CiAKLQl2aXJ0dWFsIENQREZfQW5ub3QqCQkJR2V0UERGQW5ub3QoKTsKKyAgdmlydHVhbCBDUERGX0Fubm90KiBHZXRQREZBbm5vdCgpOwogCi0JdmlydHVhbCB2b2lkCQkJCUFubm90X09uRHJhdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwotcHVibGljOgotCUNQREZfRGljdGlvbmFyeSoJCQlHZXRBbm5vdERpY3QoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIEFubm90X09uRHJhdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CiAKLQl2b2lkCQkJCQkJU2V0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNDb250ZW50cyk7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0Q29udGVudHMoKSBjb25zdDsKKyBwdWJsaWM6CisgIENQREZfRGljdGlvbmFyeSogR2V0QW5ub3REaWN0KCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJU2V0QW5ub3ROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSk7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0QW5ub3ROYW1lKCkgY29uc3Q7CisgIHZvaWQgU2V0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNDb250ZW50cyk7CisgIENGWF9XaWRlU3RyaW5nIEdldENvbnRlbnRzKCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJU2V0TW9kaWZpZWREYXRlKGNvbnN0IEZYX1NZU1RFTVRJTUUmIHN0KTsKLQlGWF9TWVNURU1USU1FCQkJCUdldE1vZGlmaWVkRGF0ZSgpIGNvbnN0OworICB2b2lkIFNldEFubm90TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpOworICBDRlhfV2lkZVN0cmluZyBHZXRBbm5vdE5hbWUoKSBjb25zdDsKIAotCXZvaWQJCQkJCQlTZXRGbGFncyhpbnQgbkZsYWdzKTsKLQlpbnQJCQkJCQkJR2V0RmxhZ3MoKSBjb25zdDsKKyAgdm9pZCBTZXRNb2RpZmllZERhdGUoY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpOworICBGWF9TWVNURU1USU1FIEdldE1vZGlmaWVkRGF0ZSgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCVNldEFwcFN0YXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpOwotCUNGWF9CeXRlU3RyaW5nCQkJCUdldEFwcFN0YXRlKCkgY29uc3Q7CisgIHZvaWQgU2V0RmxhZ3MoaW50IG5GbGFncyk7CisgIGludCBHZXRGbGFncygpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCVNldFN0cnVjdFBhcmVudChpbnQga2V5KTsKLQlpbnQJCQkJCQkJR2V0U3RydWN0UGFyZW50KCkgY29uc3Q7CisgIHZvaWQgU2V0QXBwU3RhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CisgIENGWF9CeXRlU3RyaW5nIEdldEFwcFN0YXRlKCkgY29uc3Q7CiAKLQkvL2JvcmRlcgotCXZvaWQJCQkJCQlTZXRCb3JkZXJXaWR0aChpbnQgbldpZHRoKTsKLQlpbnQJCQkJCQkJR2V0Qm9yZGVyV2lkdGgoKSBjb25zdDsKKyAgdm9pZCBTZXRTdHJ1Y3RQYXJlbnQoaW50IGtleSk7CisgIGludCBHZXRTdHJ1Y3RQYXJlbnQoKSBjb25zdDsKIAotCS8vQkJTX1NPTElECi0JLy9CQlNfREFTSAotCS8vQkJTX0JFVkVMRUQKLQkvL0JCU19JTlNFVAotCS8vQkJTX1VOREVSTElORQorICAvLyBib3JkZXIKKyAgdm9pZCBTZXRCb3JkZXJXaWR0aChpbnQgbldpZHRoKTsKKyAgaW50IEdldEJvcmRlcldpZHRoKCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJU2V0Qm9yZGVyU3R5bGUoaW50IG5TdHlsZSk7Ci0JaW50CQkJCQkJCUdldEJvcmRlclN0eWxlKCkgY29uc3Q7CisgIC8vIEJCU19TT0xJRAorICAvLyBCQlNfREFTSAorICAvLyBCQlNfQkVWRUxFRAorICAvLyBCQlNfSU5TRVQKKyAgLy8gQkJTX1VOREVSTElORQogCi0Jdm9pZAkJCQkJCVNldEJvcmRlckRhc2goY29uc3QgQ0ZYX0ludEFycmF5JiBhcnJheSk7Ci0Jdm9pZAkJCQkJCUdldEJvcmRlckRhc2goQ0ZYX0ludEFycmF5JiBhcnJheSkgY29uc3Q7CisgIHZvaWQgU2V0Qm9yZGVyU3R5bGUoaW50IG5TdHlsZSk7CisgIGludCBHZXRCb3JkZXJTdHlsZSgpIGNvbnN0OwogCi0JLy9UaGUgYmFja2dyb3VuZCBvZiB0aGUgYW5ub3RhdGlvbidzIGljb24gd2hlbiBjbG9zZWQKLQkvL1RoZSB0aXRsZSBiYXIgb2YgdGhlIGFubm90YXRpb24ncyBwb3AtdXAgd2luZG93Ci0JLy9UaGUgYm9yZGVyIG9mIGEgbGluayBhbm5vdGF0aW9uCisgIHZvaWQgU2V0Qm9yZGVyRGFzaChjb25zdCBDRlhfSW50QXJyYXkmIGFycmF5KTsKKyAgdm9pZCBHZXRCb3JkZXJEYXNoKENGWF9JbnRBcnJheSYgYXJyYXkpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCVNldENvbG9yKEZYX0NPTE9SUkVGIGNvbG9yKTsKLQl2b2lkCQkJCQkJUmVtb3ZlQ29sb3IoKTsKLQlGWF9CT09MCQkJCQkJR2V0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKKyAgLy8gVGhlIGJhY2tncm91bmQgb2YgdGhlIGFubm90YXRpb24ncyBpY29uIHdoZW4gY2xvc2VkCisgIC8vIFRoZSB0aXRsZSBiYXIgb2YgdGhlIGFubm90YXRpb24ncyBwb3AtdXAgd2luZG93CisgIC8vIFRoZSBib3JkZXIgb2YgYSBsaW5rIGFubm90YXRpb24KIAotCUZYX0JPT0wJCQkJCQlJc1Zpc2libGUoKSBjb25zdDsKLQkvL2FjdGlvbgorICB2b2lkIFNldENvbG9yKEZYX0NPTE9SUkVGIGNvbG9yKTsKKyAgdm9pZCBSZW1vdmVDb2xvcigpOworICBGWF9CT09MIEdldENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CiAKLQlDUERGX0FjdGlvbgkJCQkJR2V0QWN0aW9uKCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCVNldEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYSk7Ci0Jdm9pZAkJCQkJCVJlbW92ZUFjdGlvbigpOworICBGWF9CT09MIElzVmlzaWJsZSgpIGNvbnN0OworICAvLyBhY3Rpb24KIAotCUNQREZfQUFjdGlvbgkJCQlHZXRBQWN0aW9uKCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCVNldEFBY3Rpb24oY29uc3QgQ1BERl9BQWN0aW9uJiBhYSk7Ci0Jdm9pZAkJCQkJCVJlbW92ZUFBY3Rpb24oKTsKKyAgQ1BERl9BY3Rpb24gR2V0QWN0aW9uKCkgY29uc3Q7CisgIHZvaWQgU2V0QWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhKTsKKyAgdm9pZCBSZW1vdmVBY3Rpb24oKTsKIAotCXZpcnR1YWwgQ1BERl9BY3Rpb24JCQlHZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCk7CisgIENQREZfQUFjdGlvbiBHZXRBQWN0aW9uKCkgY29uc3Q7CisgIHZvaWQgU2V0QUFjdGlvbihjb25zdCBDUERGX0FBY3Rpb24mIGFhKTsKKyAgdm9pZCBSZW1vdmVBQWN0aW9uKCk7CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNBcHBlYXJhbmNlVmFsaWQoKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7Ci0JdmlydHVhbCB2b2lkCQkJCURyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCUNQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwotCXZvaWQJCQkJCQlEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCWNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOworICB2aXJ0dWFsIENQREZfQWN0aW9uIEdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFUKTsKIAotCXZvaWQJCQkJCQlDbGVhckNhY2hlZEFQKCk7CisgcHVibGljOgorICB2aXJ0dWFsIEZYX0JPT0wgSXNBcHBlYXJhbmNlVmFsaWQoKTsKKyAgdmlydHVhbCBGWF9CT09MIElzQXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpOworICB2aXJ0dWFsIHZvaWQgRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CisgIHZvaWQgRHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwogCi0JdmlydHVhbCB2b2lkCQkJCVJlc2V0QXBwZWFyYW5jZSgpOwotCXZvaWQJCQkJCQlXcml0ZUFwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUsIGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAotCQljb25zdCBDUERGX01hdHJpeCYgbWF0cml4LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0NvbnRlbnRzLAotCQljb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQU3RhdGUgPSAiIik7CisgIHZvaWQgQ2xlYXJDYWNoZWRBUCgpOwogCi1wcml2YXRlOgotCUZYX0JPT0wgQ3JlYXRlRm9ybUZpbGxlcigpOwotcHJvdGVjdGVkOgotCUNQREZfQW5ub3QqCQkJbV9wQW5ub3Q7CisgIHZpcnR1YWwgdm9pZCBSZXNldEFwcGVhcmFuY2UoKTsKKyAgdm9pZCBXcml0ZUFwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0NvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQU3RhdGUgPSAiIik7CisKKyBwcml2YXRlOgorICBGWF9CT09MIENyZWF0ZUZvcm1GaWxsZXIoKTsKKworIHByb3RlY3RlZDoKKyAgQ1BERl9Bbm5vdCogbV9wQW5ub3Q7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GU0RLX0JBU0VBTk5PVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vmb3JtLmgKaW5kZXggOGQ3NDEzOC4uMDg5YTM0YyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlZm9ybS5oCkBAIC0zMSwzMjggKzMxLDM1NyBAQAogY2xhc3MgQ1BERl9Gb3JtRmllbGQ7CiBzdHJ1Y3QgQ1BXTF9Db2xvcjsKIAotdHlwZWRlZiBlbnVtIF9QREZTREtfWEZBQUFjdGlvblR5cGUKLXsKLQlQREZTREtfWEZBX0NsaWNrID0gMCwKLQlQREZTREtfWEZBX0Z1bGwsCi0JUERGU0RLX1hGQV9QcmVPcGVuLAotCVBERlNES19YRkFfUG9zdE9wZW4KLX1QREZTREtfWEZBQUFjdGlvblR5cGU7Cit0eXBlZGVmIGVudW0gX1BERlNES19YRkFBQWN0aW9uVHlwZSB7CisgIFBERlNES19YRkFfQ2xpY2sgPSAwLAorICBQREZTREtfWEZBX0Z1bGwsCisgIFBERlNES19YRkFfUHJlT3BlbiwKKyAgUERGU0RLX1hGQV9Qb3N0T3BlbgorfSBQREZTREtfWEZBQUFjdGlvblR5cGU7CiAKLXR5cGVkZWYgc3RydWN0IF9QREZTREtfRmllbGRBY3Rpb24KLXsKLQlfUERGU0RLX0ZpZWxkQWN0aW9uKCkKLQl7Ci0JCWJNb2RpZmllciA9IEZBTFNFOwotCQliU2hpZnQgPSBGQUxTRTsKLQkJbkNvbW1pdEtleSA9IDA7Ci0JCWJLZXlEb3duID0gRkFMU0U7Ci0JCW5TZWxFbmQgPSBuU2VsU3RhcnQgPSAwOwotCQliV2lsbENvbW1pdCA9IEZBTFNFOwotCQliRmllbGRGdWxsID0gRkFMU0U7Ci0JCWJSQyA9IFRSVUU7Ci0JfQordHlwZWRlZiBzdHJ1Y3QgX1BERlNES19GaWVsZEFjdGlvbiB7CisgIF9QREZTREtfRmllbGRBY3Rpb24oKSB7CisgICAgYk1vZGlmaWVyID0gRkFMU0U7CisgICAgYlNoaWZ0ID0gRkFMU0U7CisgICAgbkNvbW1pdEtleSA9IDA7CisgICAgYktleURvd24gPSBGQUxTRTsKKyAgICBuU2VsRW5kID0gblNlbFN0YXJ0ID0gMDsKKyAgICBiV2lsbENvbW1pdCA9IEZBTFNFOworICAgIGJGaWVsZEZ1bGwgPSBGQUxTRTsKKyAgICBiUkMgPSBUUlVFOworICB9CiAKLQlGWF9CT09MCQkJCQliTW9kaWZpZXI7CQkvL2luCi0JRlhfQk9PTAkJCQkJYlNoaWZ0OwkJCS8vaW4KLQlpbnQJCQkJCQluQ29tbWl0S2V5OwkJLy9pbgotCUNGWF9XaWRlU3RyaW5nCQkJc0NoYW5nZTsJCS8vaW5bb3V0XQotCUNGWF9XaWRlU3RyaW5nCQkJc0NoYW5nZUV4OwkJLy9pbgotCUZYX0JPT0wJCQkJCWJLZXlEb3duOwkJLy9pbgotCWludAkJCQkJCW5TZWxFbmQ7CQkvL2luW291dF0KLQlpbnQJCQkJCQluU2VsU3RhcnQ7CQkvL2luW291dF0KLQlDRlhfV2lkZVN0cmluZwkJCXNWYWx1ZTsJCQkvL2luW291dF0KLQlGWF9CT09MCQkJCQliV2lsbENvbW1pdDsJLy9pbgotCUZYX0JPT0wJCQkJCWJGaWVsZEZ1bGw7CQkvL2luCi0JRlhfQk9PTAkJCQkJYlJDOwkJCS8vaW5bb3V0XQotfVBERlNES19GaWVsZEFjdGlvbjsKLWNsYXNzIENQREZTREtfV2lkZ2V0IDogcHVibGljIENQREZTREtfQkFBbm5vdAotewotcHVibGljOgotCUlYRkFfV2lkZ2V0KgkJCQkJCUdldE1peFhGQVdpZGdldCgpOwotCUlYRkFfV2lkZ2V0KgkJCQkJCUdldEdyb3VwTWl4WEZBV2lkZ2V0KCk7Ci0JSVhGQV9XaWRnZXRIYW5kbGVyKgkJCQlHZXRYRkFXaWRnZXRIYW5kbGVyKCk7CisgIEZYX0JPT0wgYk1vZGlmaWVyOyAgLy8gaW4KKyAgRlhfQk9PTCBiU2hpZnQ7ICAvLyBpbgorICBpbnQgbkNvbW1pdEtleTsgIC8vIGluCisgIENGWF9XaWRlU3RyaW5nIHNDaGFuZ2U7ICAvLyBpbltvdXRdCisgIENGWF9XaWRlU3RyaW5nIHNDaGFuZ2VFeDsgIC8vIGluCisgIEZYX0JPT0wgYktleURvd247ICAvLyBpbgorICBpbnQgblNlbEVuZDsgIC8vIGluW291dF0KKyAgaW50IG5TZWxTdGFydDsgIC8vIGluW291dF0KKyAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlOyAgLy8gaW5bb3V0XQorICBGWF9CT09MIGJXaWxsQ29tbWl0OyAgLy8gaW4KKyAgRlhfQk9PTCBiRmllbGRGdWxsOyAgLy8gaW4KKyAgRlhfQk9PTCBiUkM7ICAvLyBpbltvdXRdCit9IFBERlNES19GaWVsZEFjdGlvbjsKK2NsYXNzIENQREZTREtfV2lkZ2V0IDogcHVibGljIENQREZTREtfQkFBbm5vdCB7CisgcHVibGljOgorICBJWEZBX1dpZGdldCogR2V0TWl4WEZBV2lkZ2V0KCk7CisgIElYRkFfV2lkZ2V0KiBHZXRHcm91cE1peFhGQVdpZGdldCgpOworICBJWEZBX1dpZGdldEhhbmRsZXIqIEdldFhGQVdpZGdldEhhbmRsZXIoKTsKIAotCUZYX0JPT0wJCQkJCQkJSGFzWEZBQUFjdGlvbihQREZTREtfWEZBQUFjdGlvblR5cGUgZVhGQUFBVCk7Ci0JRlhfQk9PTAkJCQkJCQlPblhGQUFBY3Rpb24oUERGU0RLX1hGQUFBY3Rpb25UeXBlIGVYRkFBQVQsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgRlhfQk9PTCBIYXNYRkFBQWN0aW9uKFBERlNES19YRkFBQWN0aW9uVHlwZSBlWEZBQUFUKTsKKyAgRlhfQk9PTCBPblhGQUFBY3Rpb24oUERGU0RLX1hGQUFBY3Rpb25UeXBlIGVYRkFBQVQsCisgICAgICAgICAgICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCXZvaWQJCQkJCQkJU3luY2hyb25pemUoRlhfQk9PTCBiU3luY2hyb25pemVFbHNlKTsKLQl2b2lkCQkJCQkJCVN5bmNocm9uaXplWEZBVmFsdWUoKTsKLQl2b2lkCQkJCQkJCVN5bmNocm9uaXplWEZBSXRlbXMoKTsKKyAgdm9pZCBTeW5jaHJvbml6ZShGWF9CT09MIGJTeW5jaHJvbml6ZUVsc2UpOworICB2b2lkIFN5bmNocm9uaXplWEZBVmFsdWUoKTsKKyAgdm9pZCBTeW5jaHJvbml6ZVhGQUl0ZW1zKCk7CiAKLQlzdGF0aWMgdm9pZAkJCQkJCVN5bmNocm9uaXplWEZBVmFsdWUoSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldywgSVhGQV9XaWRnZXQqIGhXaWRnZXQsCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wpOwotCXN0YXRpYyB2b2lkCQkJCQkJU3luY2hyb25pemVYRkFJdGVtcyhJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3LCBJWEZBX1dpZGdldCogaFdpZGdldCwKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCk7CisgIHN0YXRpYyB2b2lkIFN5bmNocm9uaXplWEZBVmFsdWUoSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEZBX1dpZGdldCogaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wpOworICBzdGF0aWMgdm9pZCBTeW5jaHJvbml6ZVhGQUl0ZW1zKElYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9XaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKTsKIAotcHVibGljOgotCUNQREZTREtfV2lkZ2V0KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSk7Ci0JdmlydHVhbCB+Q1BERlNES19XaWRnZXQoKTsKKyBwdWJsaWM6CisgIENQREZTREtfV2lkZ2V0KENQREZfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSk7CisgIHZpcnR1YWwgfkNQREZTREtfV2lkZ2V0KCk7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJR2V0U3ViVHlwZSgpIGNvbnN0OworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldFN1YlR5cGUoKSBjb25zdDsKIAotCXZpcnR1YWwgQ1BERl9BY3Rpb24JCQkJR2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQpOworICB2aXJ0dWFsIENQREZfQWN0aW9uIEdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFUKTsKIAotCWludAkJCQkJCQkJR2V0RmllbGRUeXBlKCkgY29uc3Q7Ci0JLy9kZWZpbmUgbGF5b3V0IG9yZGVyIHRvIDIuCi0JdmlydHVhbCBpbnQJCQkJCQlHZXRMYXlvdXRPcmRlcigpIGNvbnN0IHtyZXR1cm4gMjt9Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlJc0FwcGVhcmFuY2VWYWxpZCgpOwotCS8qCi0JRklFTERGTEFHX1JFQURPTkxZCi0JRklFTERGTEFHX1JFUVVJUkVECi0JRklFTERGTEFHX05PRVhQT1JUCi0JKi8KKyAgaW50IEdldEZpZWxkVHlwZSgpIGNvbnN0OworICAvLyBkZWZpbmUgbGF5b3V0IG9yZGVyIHRvIDIuCisgIHZpcnR1YWwgaW50IEdldExheW91dE9yZGVyKCkgY29uc3QgeyByZXR1cm4gMjsgfQorICB2aXJ0dWFsIEZYX0JPT0wgSXNBcHBlYXJhbmNlVmFsaWQoKTsKKyAgLyoKKyAgRklFTERGTEFHX1JFQURPTkxZCisgIEZJRUxERkxBR19SRVFVSVJFRAorICBGSUVMREZMQUdfTk9FWFBPUlQKKyAgKi8KIAotCWludAkJCQkJCQkJR2V0RmllbGRGbGFncygpIGNvbnN0OwotCWludAkJCQkJCQkJR2V0Um90YXRlKCkgY29uc3Q7CisgIGludCBHZXRGaWVsZEZsYWdzKCkgY29uc3Q7CisgIGludCBHZXRSb3RhdGUoKSBjb25zdDsKIAotCUZYX0JPT0wJCQkJCQkJR2V0RmlsbENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlHZXRCb3JkZXJDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJR2V0VGV4dENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7Ci0JRlhfRkxPQVQJCQkJCQlHZXRGb250U2l6ZSgpIGNvbnN0OworICBGWF9CT09MIEdldEZpbGxDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0OworICBGWF9CT09MIEdldEJvcmRlckNvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CisgIEZYX0JPT0wgR2V0VGV4dENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CisgIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3Q7CiAKLQlpbnQJCQkJCQkJCUdldFNlbGVjdGVkSW5kZXgoaW50IG5JbmRleCk7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFZhbHVlKEZYX0JPT0wgYkRpc3BsYXkgPSBUUlVFKTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJR2V0RGVmYXVsdFZhbHVlKCkgY29uc3Q7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldE9wdGlvbkxhYmVsKGludCBuSW5kZXgpIGNvbnN0OwotCWludAkJCQkJCQkJQ291bnRPcHRpb25zKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpOwotCWludAkJCQkJCQkJR2V0VG9wVmlzaWJsZUluZGV4KCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc0NoZWNrZWQoKTsKLQkvKgotCUJGX0FMSUdOX0xFRlQKLQlCRl9BTElHTl9NSURETAotCUJGX0FMSUdOX1JJR0hUCi0JKi8KLQlpbnQJCQkJCQkJCUdldEFsaWdubWVudCgpIGNvbnN0OwotCWludAkJCQkJCQkJR2V0TWF4TGVuKCkgY29uc3Q7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldE5hbWUoKTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJR2V0QWx0ZXJuYXRlTmFtZSgpIGNvbnN0OworICBpbnQgR2V0U2VsZWN0ZWRJbmRleChpbnQgbkluZGV4KTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VmFsdWUoRlhfQk9PTCBiRGlzcGxheSA9IFRSVUUpOworICBDRlhfV2lkZVN0cmluZyBHZXREZWZhdWx0VmFsdWUoKSBjb25zdDsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0T3B0aW9uTGFiZWwoaW50IG5JbmRleCkgY29uc3Q7CisgIGludCBDb3VudE9wdGlvbnMoKSBjb25zdDsKKyAgRlhfQk9PTCBJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpOworICBpbnQgR2V0VG9wVmlzaWJsZUluZGV4KCkgY29uc3Q7CisgIEZYX0JPT0wgSXNDaGVja2VkKCk7CisgIC8qCisgIEJGX0FMSUdOX0xFRlQKKyAgQkZfQUxJR05fTUlEREwKKyAgQkZfQUxJR05fUklHSFQKKyAgKi8KKyAgaW50IEdldEFsaWdubWVudCgpIGNvbnN0OworICBpbnQgR2V0TWF4TGVuKCkgY29uc3Q7CisgIENGWF9XaWRlU3RyaW5nIEdldE5hbWUoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0QWx0ZXJuYXRlTmFtZSgpIGNvbnN0OwogCi0vL1NldCBQcm9wZXJ0aWVzLgotCXZvaWQJCQkJCQkJU2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5KTsKLQl2b2lkCQkJCQkJCVNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQlTZXREZWZhdWx0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSk7Ci0Jdm9pZAkJCQkJCQlTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KTsKLQl2b2lkCQkJCQkJCUNsZWFyU2VsZWN0aW9uKEZYX0JPT0wgYk5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQlTZXRUb3BWaXNpYmxlSW5kZXgoaW50IGluZGV4KTsKKyAgLy8gU2V0IFByb3BlcnRpZXMuCisgIHZvaWQgU2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5KTsKKyAgdm9pZCBTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1ZhbHVlLCBGWF9CT09MIGJOb3RpZnkpOworICB2b2lkIFNldERlZmF1bHRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1ZhbHVlKTsKKyAgdm9pZCBTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KTsKKyAgdm9pZCBDbGVhclNlbGVjdGlvbihGWF9CT09MIGJOb3RpZnkpOworICB2b2lkIFNldFRvcFZpc2libGVJbmRleChpbnQgaW5kZXgpOwogCi0Jdm9pZAkJCQkJCQlSZXNldEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKTsKLQl2b2lkCQkJCQkJCVJlc2V0QXBwZWFyYW5jZShjb25zdCBGWF9XQ0hBUiogc1ZhbHVlLCBGWF9CT09MIGJWYWx1ZUNoYW5nZWQpOwotCXZvaWQJCQkJCQkJUmVzZXRGaWVsZEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKTsKLQl2b2lkCQkJCQkJCVVwZGF0ZUZpZWxkKCk7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCU9uRm9ybWF0KEZYX0JPT0wmIGJGb3JtYXRlZCk7CisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlKEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCk7CisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCk7CisgIHZvaWQgUmVzZXRGaWVsZEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKTsKKyAgdm9pZCBVcGRhdGVGaWVsZCgpOworICBDRlhfV2lkZVN0cmluZyBPbkZvcm1hdChGWF9CT09MJiBiRm9ybWF0ZWQpOwogCi0vL01lc3NhZ2UuCi0gCUZYX0JPT0wJCQkJCQkJT25BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLAotCQkJCQkJCQkJCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgLy8gTWVzc2FnZS4KKyAgRlhfQk9PTCBPbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLQlDUERGU0RLX0ludGVyRm9ybSoJCQkJR2V0SW50ZXJGb3JtKCkgY29uc3Qge3JldHVybiBtX3BJbnRlckZvcm07fQotCUNQREZfRm9ybUZpZWxkKgkJCQkJR2V0Rm9ybUZpZWxkKCkgY29uc3Q7Ci0JQ1BERl9Gb3JtQ29udHJvbCoJCQkJR2V0Rm9ybUNvbnRyb2woKSBjb25zdDsKLQlzdGF0aWMgQ1BERl9Gb3JtQ29udHJvbCoJCUdldEZvcm1Db250cm9sKENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOworICBDUERGU0RLX0ludGVyRm9ybSogR2V0SW50ZXJGb3JtKCkgY29uc3QgeyByZXR1cm4gbV9wSW50ZXJGb3JtOyB9CisgIENQREZfRm9ybUZpZWxkKiBHZXRGb3JtRmllbGQoKSBjb25zdDsKKyAgQ1BERl9Gb3JtQ29udHJvbCogR2V0Rm9ybUNvbnRyb2woKSBjb25zdDsKKyAgc3RhdGljIENQREZfRm9ybUNvbnRyb2wqIEdldEZvcm1Db250cm9sKENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKIAotCXZvaWQJCQkJCQkJRHJhd1NoYWRvdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2b2lkIERyYXdTaGFkb3coQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotCXZvaWQJCQkJCQkJU2V0QXBwTW9kaWZpZWQoKTsKLQl2b2lkCQkJCQkJCUNsZWFyQXBwTW9kaWZpZWQoKTsKLQlGWF9CT09MCQkJCQkJCUlzQXBwTW9kaWZpZWQoKSBjb25zdDsKKyAgdm9pZCBTZXRBcHBNb2RpZmllZCgpOworICB2b2lkIENsZWFyQXBwTW9kaWZpZWQoKTsKKyAgRlhfQk9PTCBJc0FwcE1vZGlmaWVkKCkgY29uc3Q7CiAKLQlpbnQzMl90CQkJCQkJR2V0QXBwZWFyYW5jZUFnZSgpIGNvbnN0OwotCWludDMyX3QJCQkJCQlHZXRWYWx1ZUFnZSgpIGNvbnN0OworICBpbnQzMl90IEdldEFwcGVhcmFuY2VBZ2UoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRWYWx1ZUFnZSgpIGNvbnN0OwogCi1wcml2YXRlOgotCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlX1B1c2hCdXR0b24oKTsKLQl2b2lkCQkJCQkJCVJlc2V0QXBwZWFyYW5jZV9DaGVja0JveCgpOwotCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlX1JhZGlvQnV0dG9uKCk7Ci0Jdm9pZAkJCQkJCQlSZXNldEFwcGVhcmFuY2VfQ29tYm9Cb3goY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSk7Ci0Jdm9pZAkJCQkJCQlSZXNldEFwcGVhcmFuY2VfTGlzdEJveCgpOwotCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlX1RleHRGaWVsZChjb25zdCBGWF9XQ0hBUiogc1ZhbHVlKTsKKyBwcml2YXRlOgorICB2b2lkIFJlc2V0QXBwZWFyYW5jZV9QdXNoQnV0dG9uKCk7CisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlX0NoZWNrQm94KCk7CisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlX1JhZGlvQnV0dG9uKCk7CisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlX0NvbWJvQm94KGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUpOworICB2b2lkIFJlc2V0QXBwZWFyYW5jZV9MaXN0Qm94KCk7CisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlX1RleHRGaWVsZChjb25zdCBGWF9XQ0hBUiogc1ZhbHVlKTsKIAotCUNQREZfUmVjdAkJCQkJCUdldENsaWVudFJlY3QoKSBjb25zdDsKLQlDUERGX1JlY3QJCQkJCQlHZXRSb3RhdGVkUmVjdCgpIGNvbnN0OworICBDUERGX1JlY3QgR2V0Q2xpZW50UmVjdCgpIGNvbnN0OworICBDUERGX1JlY3QgR2V0Um90YXRlZFJlY3QoKSBjb25zdDsKIAotCUNGWF9CeXRlU3RyaW5nCQkJCQlHZXRCYWNrZ3JvdW5kQXBwU3RyZWFtKCkgY29uc3Q7Ci0JQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEJvcmRlckFwcFN0cmVhbSgpIGNvbnN0OwotCUNQREZfTWF0cml4CQkJCQkJR2V0TWF0cml4KCkgY29uc3Q7CisgIENGWF9CeXRlU3RyaW5nIEdldEJhY2tncm91bmRBcHBTdHJlYW0oKSBjb25zdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Qm9yZGVyQXBwU3RyZWFtKCkgY29uc3Q7CisgIENQREZfTWF0cml4IEdldE1hdHJpeCgpIGNvbnN0OwogCi0JQ1BXTF9Db2xvcgkJCQkJCUdldFRleHRQV0xDb2xvcigpIGNvbnN0OwotCUNQV0xfQ29sb3IJCQkJCQlHZXRCb3JkZXJQV0xDb2xvcigpIGNvbnN0OwotCUNQV0xfQ29sb3IJCQkJCQlHZXRGaWxsUFdMQ29sb3IoKSBjb25zdDsKKyAgQ1BXTF9Db2xvciBHZXRUZXh0UFdMQ29sb3IoKSBjb25zdDsKKyAgQ1BXTF9Db2xvciBHZXRCb3JkZXJQV0xDb2xvcigpIGNvbnN0OworICBDUFdMX0NvbG9yIEdldEZpbGxQV0xDb2xvcigpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlBZGRJbWFnZVRvQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSwgQ1BERl9TdHJlYW0qIHBJbWFnZSk7Ci0Jdm9pZAkJCQkJCQlSZW1vdmVBcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlKTsKLXB1YmxpYzoKLQlGWF9CT09MCQkJCQkJCUlzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpOwotCXZvaWQJCQkJCQkJRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7Ci1wdWJsaWM6Ci0JRlhfQk9PTAkJCQkJCQlIaXRUZXN0KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7Ci1wcml2YXRlOgotCUNQREZTREtfSW50ZXJGb3JtKgkJCQltX3BJbnRlckZvcm07Ci0JRlhfQk9PTAkJCQkJCQltX2JBcHBNb2RpZmllZDsKLQlpbnQzMl90CQkJCQkJbV9uQXBwQWdlOwotCWludDMyX3QJCQkJCQltX25WYWx1ZUFnZTsKKyAgdm9pZCBBZGRJbWFnZVRvQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSwgQ1BERl9TdHJlYW0qIHBJbWFnZSk7CisgIHZvaWQgUmVtb3ZlQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSk7CiAKLQlJWEZBX1dpZGdldCoJCQkJCQltX2hNaXhYRkFXaWRnZXQ7Ci0JSVhGQV9XaWRnZXRIYW5kbGVyKgkJCQltX3BXaWRnZXRIYW5kbGVyOworIHB1YmxpYzoKKyAgRlhfQk9PTCBJc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKTsKKyAgdm9pZCBEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKKworIHB1YmxpYzoKKyAgRlhfQk9PTCBIaXRUZXN0KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7CisKKyBwcml2YXRlOgorICBDUERGU0RLX0ludGVyRm9ybSogbV9wSW50ZXJGb3JtOworICBGWF9CT09MIG1fYkFwcE1vZGlmaWVkOworICBpbnQzMl90IG1fbkFwcEFnZTsKKyAgaW50MzJfdCBtX25WYWx1ZUFnZTsKKworICBJWEZBX1dpZGdldCogbV9oTWl4WEZBV2lkZ2V0OworICBJWEZBX1dpZGdldEhhbmRsZXIqIG1fcFdpZGdldEhhbmRsZXI7CiB9OwogCi1jbGFzcyBDUERGU0RLX1hGQVdpZGdldCA6IHB1YmxpYyBDUERGU0RLX0Fubm90Ci17Ci1wdWJsaWM6Ci0JQ1BERlNES19YRkFXaWRnZXQoSVhGQV9XaWRnZXQqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSk7Ci0JdmlydHVhbCB+Q1BERlNES19YRkFXaWRnZXQoKXt9CitjbGFzcyBDUERGU0RLX1hGQVdpZGdldCA6IHB1YmxpYyBDUERGU0RLX0Fubm90IHsKKyBwdWJsaWM6CisgIENQREZTREtfWEZBV2lkZ2V0KElYRkFfV2lkZ2V0KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0pOworICB2aXJ0dWFsIH5DUERGU0RLX1hGQVdpZGdldCgpIHt9CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNYRkFGaWVsZCgpOwotCXZpcnR1YWwgSVhGQV9XaWRnZXQqCQkJR2V0WEZBV2lkZ2V0KCkgeyByZXR1cm4gbV9oWEZBV2lkZ2V0OyB9CisgcHVibGljOgorICB2aXJ0dWFsIEZYX0JPT0wgSXNYRkFGaWVsZCgpOworICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBHZXRYRkFXaWRnZXQoKSB7IHJldHVybiBtX2hYRkFXaWRnZXQ7IH0KIAotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldFR5cGUoKSBjb25zdCA7Ci0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0U3ViVHlwZSgpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0VHlwZSgpIGNvbnN0OworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldFN1YlR5cGUoKSBjb25zdCB7IHJldHVybiAiIjsgfQogCi0JdmlydHVhbCBDRlhfRmxvYXRSZWN0CQlHZXRSZWN0KCk7CisgIHZpcnR1YWwgQ0ZYX0Zsb2F0UmVjdCBHZXRSZWN0KCk7CiAKLXB1YmxpYzoKLQlDUERGU0RLX0ludGVyRm9ybSoJCQlHZXRJbnRlckZvcm0oKSB7IHJldHVybiBtX3BJbnRlckZvcm07IH0KKyBwdWJsaWM6CisgIENQREZTREtfSW50ZXJGb3JtKiBHZXRJbnRlckZvcm0oKSB7IHJldHVybiBtX3BJbnRlckZvcm07IH0KIAotcHJpdmF0ZToKLQlDUERGU0RLX0ludGVyRm9ybSoJCQkJbV9wSW50ZXJGb3JtOwotCUlYRkFfV2lkZ2V0KgkJCQkJCW1faFhGQVdpZGdldDsKKyBwcml2YXRlOgorICBDUERGU0RLX0ludGVyRm9ybSogbV9wSW50ZXJGb3JtOworICBJWEZBX1dpZGdldCogbV9oWEZBV2lkZ2V0OwogfTsKIAotI2RlZmluZSBDUERGU0RLX1hGQVdpZGdldE1hcCBDRlhfTWFwUHRyVGVtcGxhdGU8SVhGQV9XaWRnZXQqLCBDUERGU0RLX1hGQVdpZGdldCo+CisjZGVmaW5lIENQREZTREtfWEZBV2lkZ2V0TWFwIFwKKyAgQ0ZYX01hcFB0clRlbXBsYXRlPElYRkFfV2lkZ2V0KiwgQ1BERlNES19YRkFXaWRnZXQqPgogI2RlZmluZSBDUERGU0RLX0ZpZWxkU3luY2hyb25pemVNYXAgQ0ZYX01hcFB0clRlbXBsYXRlPENQREZfRm9ybUZpZWxkKiwgaW50PgogCi1jbGFzcyBDUERGU0RLX0ludGVyRm9ybSA6IHB1YmxpYyBDUERGX0Zvcm1Ob3RpZnkKLXsKLXB1YmxpYzoKLQlleHBsaWNpdCBDUERGU0RLX0ludGVyRm9ybShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCX5DUERGU0RLX0ludGVyRm9ybSgpIG92ZXJyaWRlOworY2xhc3MgQ1BERlNES19JbnRlckZvcm0gOiBwdWJsaWMgQ1BERl9Gb3JtTm90aWZ5IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZTREtfSW50ZXJGb3JtKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIH5DUERGU0RLX0ludGVyRm9ybSgpIG92ZXJyaWRlOwogCi0JQ1BERl9JbnRlckZvcm0qIEdldEludGVyRm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fcEludGVyRm9ybTsgfQotCUNQREZTREtfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KKyAgQ1BERl9JbnRlckZvcm0qIEdldEludGVyRm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fcEludGVyRm9ybTsgfQorICBDUERGU0RLX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50OyB9CiAKLQlGWF9CT09MCQkJCQkJCUhpZ2hsaWdodFdpZGdldHMoKTsKKyAgRlhfQk9PTCBIaWdobGlnaHRXaWRnZXRzKCk7CiAKLQlDUERGU0RLX1dpZGdldCoJCQkJCUdldFNpYmxpbmcoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYk5leHQpIGNvbnN0OwotCUNQREZTREtfV2lkZ2V0KgkJCQkJR2V0V2lkZ2V0KENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKSBjb25zdDsKLQl2b2lkCQkJCQkJCUdldFdpZGdldHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWVsZE5hbWUsIENGWF9QdHJBcnJheSYgd2lkZ2V0cyk7Ci0Jdm9pZAkJCQkJCQlHZXRXaWRnZXRzKENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9QdHJBcnJheSYgd2lkZ2V0cyk7CisgIENQREZTREtfV2lkZ2V0KiBHZXRTaWJsaW5nKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJOZXh0KSBjb25zdDsKKyAgQ1BERlNES19XaWRnZXQqIEdldFdpZGdldChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCkgY29uc3Q7CisgIHZvaWQgR2V0V2lkZ2V0cyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpZWxkTmFtZSwgQ0ZYX1B0ckFycmF5JiB3aWRnZXRzKTsKKyAgdm9pZCBHZXRXaWRnZXRzKENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9QdHJBcnJheSYgd2lkZ2V0cyk7CiAKLQl2b2lkCQkJCQkJCUFkZE1hcChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCwgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwotCXZvaWQJCQkJCQkJUmVtb3ZlTWFwKENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKTsKKyAgdm9pZCBBZGRNYXAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wsIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKKyAgdm9pZCBSZW1vdmVNYXAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpOwogCi0Jdm9pZAkJCQkJCQlBZGRYRkFNYXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENQREZTREtfWEZBV2lkZ2V0KiBwV2lkZ2V0KTsKLQl2b2lkCQkJCQkJCVJlbW92ZVhGQU1hcChJWEZBX1dpZGdldCogaFdpZGdldCk7Ci0JQ1BERlNES19YRkFXaWRnZXQqCQkJCUdldFhGQVdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCk7CisgIHZvaWQgQWRkWEZBTWFwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDUERGU0RLX1hGQVdpZGdldCogcFdpZGdldCk7CisgIHZvaWQgUmVtb3ZlWEZBTWFwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsKKyAgQ1BERlNES19YRkFXaWRnZXQqIEdldFhGQVdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCk7CiAKLQl2b2lkCQkJCQkJCUVuYWJsZUNhbGN1bGF0ZShGWF9CT09MIGJFbmFibGVkKTsKLQlGWF9CT09MCQkJCQkJCUlzQ2FsY3VsYXRlRW5hYmxlZCgpIGNvbnN0OworICB2b2lkIEVuYWJsZUNhbGN1bGF0ZShGWF9CT09MIGJFbmFibGVkKTsKKyAgRlhfQk9PTCBJc0NhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdDsKIAotCXZvaWQJCQkJCQkJWGZhRW5hYmxlQ2FsY3VsYXRlKEZYX0JPT0wgYkVuYWJsZWQpOwotCUZYX0JPT0wJCQkJCQkJSXNYZmFDYWxjdWxhdGVFbmFibGVkKCkgY29uc3Q7CisgIHZvaWQgWGZhRW5hYmxlQ2FsY3VsYXRlKEZYX0JPT0wgYkVuYWJsZWQpOworICBGWF9CT09MIElzWGZhQ2FsY3VsYXRlRW5hYmxlZCgpIGNvbnN0OwogCi0JRlhfQk9PTAkJCQkJCQlJc1hmYVZhbGlkYXRpb25zRW5hYmxlZCgpOwotCXZvaWQJCQkJCQkJWGZhU2V0VmFsaWRhdGlvbnNFbmFibGVkKEZYX0JPT0wgYkVuYWJsZWQpOworICBGWF9CT09MIElzWGZhVmFsaWRhdGlvbnNFbmFibGVkKCk7CisgIHZvaWQgWGZhU2V0VmFsaWRhdGlvbnNFbmFibGVkKEZYX0JPT0wgYkVuYWJsZWQpOwogCiAjaWZkZWYgX1dJTjMyCi0JQ1BERl9TdHJlYW0qCQkJCQlMb2FkSW1hZ2VGcm9tRmlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpbGUpOworICBDUERGX1N0cmVhbSogTG9hZEltYWdlRnJvbUZpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWxlKTsKICNlbmRpZgogCi0Jdm9pZAkJCQkJCQlPbktleVN0cm9rZUNvbW1pdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIEZYX0JPT0wmIGJSQyk7Ci0Jdm9pZAkJCQkJCQlPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwgRlhfQk9PTCYgYlJDKTsKLQl2b2lkCQkJCQkJCU9uQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gTlVMTCk7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCU9uRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBGWF9CT09MJiBiRm9ybWF0ZWQpOworICB2b2lkIE9uS2V5U3Ryb2tlQ29tbWl0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSQyk7CisgIHZvaWQgT25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLAorICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDKTsKKyAgdm9pZCBPbkNhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IE5VTEwpOworICBDRlhfV2lkZVN0cmluZyBPbkZvcm1hdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgRlhfQk9PTCYgYkZvcm1hdGVkKTsKIAotCXZvaWQJCQkJCQkJUmVzZXRGaWVsZEFwcGVhcmFuY2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCk7Ci0Jdm9pZAkJCQkJCQlVcGRhdGVGaWVsZChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCk7CisgIHZvaWQgUmVzZXRGaWVsZEFwcGVhcmFuY2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWYWx1ZUNoYW5nZWQpOworICB2b2lkIFVwZGF0ZUZpZWxkKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkKTsKIAotCUZYX0JPT0wJCQkJCQkJRG9BY3Rpb25fSGlkZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKLQlGWF9CT09MCQkJCQkJCURvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0JRlhfQk9PTAkJCQkJCQlEb0FjdGlvbl9SZXNldEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0JRlhfQk9PTAkJCQkJCQlEb0FjdGlvbl9JbXBvcnREYXRhKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworICBGWF9CT09MIERvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CisgIEZYX0JPT0wgRG9BY3Rpb25fU3VibWl0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKKyAgRlhfQk9PTCBEb0FjdGlvbl9SZXNldEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CisgIEZYX0JPT0wgRG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKIAotCXZvaWQJCQkJCQkJR2V0RmllbGRGcm9tT2JqZWN0cyhjb25zdCBDRlhfUHRyQXJyYXkmIG9iamVjdHMsIENGWF9QdHJBcnJheSYgZmllbGRzKTsKLQlGWF9CT09MCQkJCQkJCUlzVmFsaWRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOwotCUZYX0JPT0wJCQkJCQkJU3VibWl0RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0Rlc3RpbmF0aW9uLCBjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywKLQkJRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwgRlhfQk9PTCBiVXJsRW5jb2RlZCk7Ci0JRlhfQk9PTAkJCQkJCQlTdWJtaXRGb3JtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRGVzdGluYXRpb24sIEZYX0JPT0wgYlVybEVuY29kZWQpOwotCUZYX0JPT0wJCQkJCQkJRXhwb3J0Rm9ybVRvRkRGVGV4dEJ1ZihDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpOwotCUZYX0JPT0wJCQkJCQkJRXhwb3J0RmllbGRzVG9GREZUZXh0QnVmKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1Zik7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRlbXBvcmFyeUZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmlsZUV4dCk7CisgIHZvaWQgR2V0RmllbGRGcm9tT2JqZWN0cyhjb25zdCBDRlhfUHRyQXJyYXkmIG9iamVjdHMsIENGWF9QdHJBcnJheSYgZmllbGRzKTsKKyAgRlhfQk9PTCBJc1ZhbGlkRmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KTsKKyAgRlhfQk9PTCBTdWJtaXRGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVcmxFbmNvZGVkKTsKKyAgRlhfQk9PTCBTdWJtaXRGb3JtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRGVzdGluYXRpb24sIEZYX0JPT0wgYlVybEVuY29kZWQpOworICBGWF9CT09MIEV4cG9ydEZvcm1Ub0ZERlRleHRCdWYoQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKTsKKyAgRlhfQk9PTCBFeHBvcnRGaWVsZHNUb0ZERlRleHRCdWYoY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1Zik7CisgIENGWF9XaWRlU3RyaW5nIEdldFRlbXBvcmFyeUZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmlsZUV4dCk7CiAKLQl2b2lkCQkJCQkJCVN5bmNocm9uaXplRmllbGQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIEZYX0JPT0wgYlN5bmNocm9uaXplRWxzZSk7CisgIHZvaWQgU3luY2hyb25pemVGaWVsZChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgRlhfQk9PTCBiU3luY2hyb25pemVFbHNlKTsKIAotcHJpdmF0ZToKLQl2aXJ0dWFsIGludAkJCQkJCUJlZm9yZVZhbHVlQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlKTsKLQl2aXJ0dWFsIGludAkJCQkJCUFmdGVyVmFsdWVDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCk7Ci0JdmlydHVhbCBpbnQJCQkJCQlCZWZvcmVTZWxlY3Rpb25DaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpOwotCXZpcnR1YWwgaW50CQkJCQkJQWZ0ZXJTZWxlY3Rpb25DaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCk7Ci0JdmlydHVhbCBpbnQJCQkJCQlBZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgY29uc3QgQ0ZYX0J5dGVBcnJheSYgc3RhdHVzQXJyYXkpOwotCXZpcnR1YWwgaW50CQkJCQkJQmVmb3JlRm9ybVJlc2V0KGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSk7Ci0JdmlydHVhbCBpbnQJCQkJCQlBZnRlckZvcm1SZXNldChjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pOwotCXZpcnR1YWwgaW50CQkJCQkJQmVmb3JlRm9ybUltcG9ydERhdGEoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKTsKLQl2aXJ0dWFsIGludAkJCQkJCUFmdGVyRm9ybUltcG9ydERhdGEoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKTsKKyBwcml2YXRlOgorICB2aXJ0dWFsIGludCBCZWZvcmVWYWx1ZUNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSk7CisgIHZpcnR1YWwgaW50IEFmdGVyVmFsdWVDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCk7CisgIHZpcnR1YWwgaW50IEJlZm9yZVNlbGVjdGlvbkNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpOworICB2aXJ0dWFsIGludCBBZnRlclNlbGVjdGlvbkNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKTsKKyAgdmlydHVhbCBpbnQgQWZ0ZXJDaGVja2VkU3RhdHVzQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZUFycmF5JiBzdGF0dXNBcnJheSk7CisgIHZpcnR1YWwgaW50IEJlZm9yZUZvcm1SZXNldChjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pOworICB2aXJ0dWFsIGludCBBZnRlckZvcm1SZXNldChjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pOworICB2aXJ0dWFsIGludCBCZWZvcmVGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pOworICB2aXJ0dWFsIGludCBBZnRlckZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSk7CiAKLQlGWF9CT09MCQkJCQkJCUZERlRvVVJMRW5jb2RlZERhdGEoQ0ZYX1dpZGVTdHJpbmcgY3NGREZGaWxlLCBDRlhfV2lkZVN0cmluZyBjc1R4dEZpbGUpOwotCUZYX0JPT0wJCQkJCQkJRkRGVG9VUkxFbmNvZGVkRGF0YSh1aW50OF90KiYgcEJ1ZiwgRlhfU1RSU0laRSYgbkJ1ZlNpemUpOwotCWludAkJCQkJCQkJR2V0UGFnZUluZGV4QnlBbm5vdERpY3QoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIGNvbnN0OwotCXZvaWQJCQkJCQkJRG9GREZCdWZmZXIoQ0ZYX0J5dGVTdHJpbmcgc0J1ZmZlcik7CisgIEZYX0JPT0wgRkRGVG9VUkxFbmNvZGVkRGF0YShDRlhfV2lkZVN0cmluZyBjc0ZERkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1R4dEZpbGUpOworICBGWF9CT09MIEZERlRvVVJMRW5jb2RlZERhdGEodWludDhfdComIHBCdWYsIEZYX1NUUlNJWkUmIG5CdWZTaXplKTsKKyAgaW50IEdldFBhZ2VJbmRleEJ5QW5ub3REaWN0KENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgY29uc3Q7CisgIHZvaWQgRG9GREZCdWZmZXIoQ0ZYX0J5dGVTdHJpbmcgc0J1ZmZlcik7CiAKLSAgICB1c2luZyBDUERGU0RLX1dpZGdldE1hcCA9IHN0ZDo6bWFwPENQREZfRm9ybUNvbnRyb2wqLCBDUERGU0RLX1dpZGdldCo+OworICB1c2luZyBDUERGU0RLX1dpZGdldE1hcCA9IHN0ZDo6bWFwPENQREZfRm9ybUNvbnRyb2wqLCBDUERGU0RLX1dpZGdldCo+OwogCi0gICAgQ1BERlNES19Eb2N1bWVudCogbV9wRG9jdW1lbnQ7Ci0gICAgQ1BERl9JbnRlckZvcm0qIG1fcEludGVyRm9ybTsKLSAgICBDUERGU0RLX1dpZGdldE1hcCBtX01hcDsKLSAgICBDUERGU0RLX1hGQVdpZGdldE1hcCBtX1hGQU1hcDsKLSAgICBDUERGU0RLX0ZpZWxkU3luY2hyb25pemVNYXAgbV9GaWVsZFN5bmNocm9uaXplTWFwOwotICAgIEZYX0JPT0wgbV9iQ2FsY3VsYXRlOwotICAgIEZYX0JPT0wgbV9iWGZhQ2FsY3VsYXRlOwotICAgIEZYX0JPT0wgbV9iWGZhVmFsaWRhdGlvbnNFbmFibGVkOwotICAgIEZYX0JPT0wgbV9iQnVzeTsKKyAgQ1BERlNES19Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CisgIENQREZfSW50ZXJGb3JtKiBtX3BJbnRlckZvcm07CisgIENQREZTREtfV2lkZ2V0TWFwIG1fTWFwOworICBDUERGU0RLX1hGQVdpZGdldE1hcCBtX1hGQU1hcDsKKyAgQ1BERlNES19GaWVsZFN5bmNocm9uaXplTWFwIG1fRmllbGRTeW5jaHJvbml6ZU1hcDsKKyAgRlhfQk9PTCBtX2JDYWxjdWxhdGU7CisgIEZYX0JPT0wgbV9iWGZhQ2FsY3VsYXRlOworICBGWF9CT09MIG1fYlhmYVZhbGlkYXRpb25zRW5hYmxlZDsKKyAgRlhfQk9PTCBtX2JCdXN5OwogCi1wdWJsaWM6Ci0JRlhfQk9PTCBJc05lZWRIaWdoTGlnaHQoaW50IG5GaWVsZFR5cGUpOwotCXZvaWQgICAgUmVtb3ZlQWxsSGlnaExpZ2h0KCk7Ci0Jdm9pZCAgICBTZXRIaWdobGlnaHRBbHBoYSh1aW50OF90IGFscGhhKSB7bV9pSGlnaGxpZ2h0QWxwaGEgPSBhbHBoYTt9Ci0JdWludDhfdCBHZXRIaWdobGlnaHRBbHBoYSgpIHtyZXR1cm4gbV9pSGlnaGxpZ2h0QWxwaGE7fQotCXZvaWQgICAgU2V0SGlnaGxpZ2h0Q29sb3IoRlhfQ09MT1JSRUYgY2xyLCBpbnQgbkZpZWxkVHlwZSk7Ci0JRlhfQ09MT1JSRUYgR2V0SGlnaGxpZ2h0Q29sb3IoaW50IG5GaWVsZFR5cGUpOwotcHJpdmF0ZToKLQlGWF9DT0xPUlJFRiBtX2FIaWdobGlnaHRDb2xvcls3XTsKLQl1aW50OF90IG1faUhpZ2hsaWdodEFscGhhOwotCUZYX0JPT0wJbV9iTmVlZEhpZ2h0bGlnaHRbN107CisgcHVibGljOgorICBGWF9CT09MIElzTmVlZEhpZ2hMaWdodChpbnQgbkZpZWxkVHlwZSk7CisgIHZvaWQgUmVtb3ZlQWxsSGlnaExpZ2h0KCk7CisgIHZvaWQgU2V0SGlnaGxpZ2h0QWxwaGEodWludDhfdCBhbHBoYSkgeyBtX2lIaWdobGlnaHRBbHBoYSA9IGFscGhhOyB9CisgIHVpbnQ4X3QgR2V0SGlnaGxpZ2h0QWxwaGEoKSB7IHJldHVybiBtX2lIaWdobGlnaHRBbHBoYTsgfQorICB2b2lkIFNldEhpZ2hsaWdodENvbG9yKEZYX0NPTE9SUkVGIGNsciwgaW50IG5GaWVsZFR5cGUpOworICBGWF9DT0xPUlJFRiBHZXRIaWdobGlnaHRDb2xvcihpbnQgbkZpZWxkVHlwZSk7CisKKyBwcml2YXRlOgorICBGWF9DT0xPUlJFRiBtX2FIaWdobGlnaHRDb2xvcls3XTsKKyAgdWludDhfdCBtX2lIaWdobGlnaHRBbHBoYTsKKyAgRlhfQk9PTCBtX2JOZWVkSGlnaHRsaWdodFs3XTsKIH07CiAKLSNkZWZpbmUgQkFJX1NUUlVDVFVSRQkJMAotI2RlZmluZSBCQUlfUk9XCQkJCTEKLSNkZWZpbmUgQkFJX0NPTFVNTgkJCTIKKyNkZWZpbmUgQkFJX1NUUlVDVFVSRSAwCisjZGVmaW5lIEJBSV9ST1cgMQorI2RlZmluZSBCQUlfQ09MVU1OIDIKIAotI2RlZmluZSBDUERGU0RLX0Fubm90cwkJCQlDRlhfQXJyYXlUZW1wbGF0ZTxDUERGU0RLX0Fubm90Kj4KLSNkZWZpbmUgQ1BERlNES19Tb3J0QW5ub3RzCQkJQ0dXX0FycmF5VGVtcGxhdGU8Q1BERlNES19Bbm5vdCo+Ci1jbGFzcyBDQkFfQW5ub3RJdGVyYXRvcgotewotcHVibGljOgotCUNCQV9Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNUeXBlLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1N1YlR5cGUpOwotCX5DQkFfQW5ub3RJdGVyYXRvcigpOworI2RlZmluZSBDUERGU0RLX0Fubm90cyBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGU0RLX0Fubm90Kj4KKyNkZWZpbmUgQ1BERlNES19Tb3J0QW5ub3RzIENHV19BcnJheVRlbXBsYXRlPENQREZTREtfQW5ub3QqPgorY2xhc3MgQ0JBX0Fubm90SXRlcmF0b3IgeworIHB1YmxpYzoKKyAgQ0JBX0Fubm90SXRlcmF0b3IoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1R5cGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzU3ViVHlwZSk7CisgIH5DQkFfQW5ub3RJdGVyYXRvcigpOwogCi0JQ1BERlNES19Bbm5vdCoJCQkJR2V0Rmlyc3RBbm5vdCgpOwotCUNQREZTREtfQW5ub3QqCQkJCUdldExhc3RBbm5vdCgpOwotCUNQREZTREtfQW5ub3QqCQkJCUdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCUNQREZTREtfQW5ub3QqCQkJCUdldFByZXZBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICBDUERGU0RLX0Fubm90KiBHZXRGaXJzdEFubm90KCk7CisgIENQREZTREtfQW5ub3QqIEdldExhc3RBbm5vdCgpOworICBDUERGU0RLX0Fubm90KiBHZXROZXh0QW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgQ1BERlNES19Bbm5vdCogR2V0UHJldkFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCQkJR2VuZXJhdGVSZXN1bHRzKCk7Ci0Jc3RhdGljIGludAkJCQkJCQlDb21wYXJlQnlMZWZ0KENQREZTREtfQW5ub3QqIHAxLCBDUERGU0RLX0Fubm90KiBwMik7Ci0Jc3RhdGljIGludAkJCQkJCQlDb21wYXJlQnlUb3AoQ1BERlNES19Bbm5vdCogcDEsIENQREZTREtfQW5ub3QqIHAyKTsKLQlzdGF0aWMgQ1BERl9SZWN0CQkJCQlHZXRBbm5vdFJlY3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyBwcml2YXRlOgorICB2b2lkIEdlbmVyYXRlUmVzdWx0cygpOworICBzdGF0aWMgaW50IENvbXBhcmVCeUxlZnQoQ1BERlNES19Bbm5vdCogcDEsIENQREZTREtfQW5ub3QqIHAyKTsKKyAgc3RhdGljIGludCBDb21wYXJlQnlUb3AoQ1BERlNES19Bbm5vdCogcDEsIENQREZTREtfQW5ub3QqIHAyKTsKKyAgc3RhdGljIENQREZfUmVjdCBHZXRBbm5vdFJlY3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotCUNQREZTREtfUGFnZVZpZXcqCQkJCQltX3BQYWdlVmlldzsKLQlDRlhfQnl0ZVN0cmluZwkJCQkJCW1fc1R5cGU7Ci0JQ0ZYX0J5dGVTdHJpbmcJCQkJCQltX3NTdWJUeXBlOwotCWludAkJCQkJCQkJCW1fblRhYnM7Ci0JQ1BERlNES19Bbm5vdHMJCQkJCQltX0Fubm90czsKKyAgQ1BERlNES19QYWdlVmlldyogbV9wUGFnZVZpZXc7CisgIENGWF9CeXRlU3RyaW5nIG1fc1R5cGU7CisgIENGWF9CeXRlU3RyaW5nIG1fc1N1YlR5cGU7CisgIGludCBtX25UYWJzOworICBDUERGU0RLX0Fubm90cyBtX0Fubm90czsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZTREtfQkFTRUZPUk1fSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2NvbW1vbi5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfY29tbW9uLmgKaW5kZXggYjI0M2NkNC4uMjc5MDQ4YiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfY29tbW9uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfY29tbW9uLmgKQEAgLTcsMzkgKzcsMzkgQEAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZTREtfQ09NTU9OX0hfCiAjZGVmaW5lIEZQREZTREtfSU5DTFVERV9GU0RLX0NPTU1PTl9IXwogCi0jZGVmaW5lIEJGRlRfU0lHTkFUVVJFCQkJCSJTaWduYXR1cmUiCisjZGVmaW5lIEJGRlRfU0lHTkFUVVJFICJTaWduYXR1cmUiCiAKLS8vZm9yIGFsbCBmaWVsZHMKLSNkZWZpbmUgRklFTERGTEFHX1JFQURPTkxZCQkJCQkxCi0jZGVmaW5lIEZJRUxERkxBR19SRVFVSVJFRAkJCQkJMgotI2RlZmluZSBGSUVMREZMQUdfTk9FWFBPUlQJCQkJCTQKLS8vZm9yIHRleHQgZmllbGRzCi0jZGVmaW5lIEZJRUxERkxBR19NVUxUSUxJTkUJCQkJCSgxPDwxMikKLSNkZWZpbmUgRklFTERGTEFHX1BBU1NXT1JECQkJCQkoMTw8MTMpCi0jZGVmaW5lIEZJRUxERkxBR19GSUxFU0VMRUNUCQkJCSgxPDwyMCkKLSNkZWZpbmUgRklFTERGTEFHX0RPTk9UU1BFTExDSEVDSwkJCSgxPDwyMikKLSNkZWZpbmUgRklFTERGTEFHX0RPTk9UU0NST0xMCQkJCSgxPDwyMykKLSNkZWZpbmUgRklFTERGTEFHX0NPTUIJCQkJCQkoMTw8MjQpCi0jZGVmaW5lIEZJRUxERkxBR19SSUNIVEVYVAkJCQkJKDE8PDI1KQotLy9mb3IgYnV0dG9uIGZpbGVkcwotI2RlZmluZSBGSUVMREZMQUdfTk9UT0dHTEVUT09GRgkJCQkoMTw8MTQpCi0jZGVmaW5lIEZJRUxERkxBR19SQURJTwkJCQkJCSgxPDwxNSkKLSNkZWZpbmUgRklFTERGTEFHX1BVU0hCVVRUT04JCQkJKDE8PDE2KQotI2RlZmluZSBGSUVMREZMQUdfUkFESU9TSU5VTklTT04JCQkoMTw8MjUpCi0vL2ZvciBjaG9pY2UgZmllbGRzCi0jZGVmaW5lIEZJRUxERkxBR19DT01CTwkJCQkJCSgxPDwxNykKLSNkZWZpbmUgRklFTERGTEFHX0VESVQJCQkJCQkoMTw8MTgpCi0jZGVmaW5lIEZJRUxERkxBR19TT1JUCQkJCQkJKDE8PDE5KQotI2RlZmluZSBGSUVMREZMQUdfTVVMVElTRUxFQ1QJCQkJKDE8PDIxKQorLy8gZm9yIGFsbCBmaWVsZHMKKyNkZWZpbmUgRklFTERGTEFHX1JFQURPTkxZIDEKKyNkZWZpbmUgRklFTERGTEFHX1JFUVVJUkVEIDIKKyNkZWZpbmUgRklFTERGTEFHX05PRVhQT1JUIDQKKy8vIGZvciB0ZXh0IGZpZWxkcworI2RlZmluZSBGSUVMREZMQUdfTVVMVElMSU5FICgxIDw8IDEyKQorI2RlZmluZSBGSUVMREZMQUdfUEFTU1dPUkQgKDEgPDwgMTMpCisjZGVmaW5lIEZJRUxERkxBR19GSUxFU0VMRUNUICgxIDw8IDIwKQorI2RlZmluZSBGSUVMREZMQUdfRE9OT1RTUEVMTENIRUNLICgxIDw8IDIyKQorI2RlZmluZSBGSUVMREZMQUdfRE9OT1RTQ1JPTEwgKDEgPDwgMjMpCisjZGVmaW5lIEZJRUxERkxBR19DT01CICgxIDw8IDI0KQorI2RlZmluZSBGSUVMREZMQUdfUklDSFRFWFQgKDEgPDwgMjUpCisvLyBmb3IgYnV0dG9uIGZpbGVkcworI2RlZmluZSBGSUVMREZMQUdfTk9UT0dHTEVUT09GRiAoMSA8PCAxNCkKKyNkZWZpbmUgRklFTERGTEFHX1JBRElPICgxIDw8IDE1KQorI2RlZmluZSBGSUVMREZMQUdfUFVTSEJVVFRPTiAoMSA8PCAxNikKKyNkZWZpbmUgRklFTERGTEFHX1JBRElPU0lOVU5JU09OICgxIDw8IDI1KQorLy8gZm9yIGNob2ljZSBmaWVsZHMKKyNkZWZpbmUgRklFTERGTEFHX0NPTUJPICgxIDw8IDE3KQorI2RlZmluZSBGSUVMREZMQUdfRURJVCAoMSA8PCAxOCkKKyNkZWZpbmUgRklFTERGTEFHX1NPUlQgKDEgPDwgMTkpCisjZGVmaW5lIEZJRUxERkxBR19NVUxUSVNFTEVDVCAoMSA8PCAyMSkKICNpZm5kZWYgRklFTERGTEFHX0RPTk9UU1BFTExDSEVDSwotI2RlZmluZSBGSUVMREZMQUdfRE9OT1RTUEVMTENIRUNLCQkoMTw8MjIpCisjZGVmaW5lIEZJRUxERkxBR19ET05PVFNQRUxMQ0hFQ0sgKDEgPDwgMjIpCiAjZW5kaWYKLSNkZWZpbmUgRklFTERGTEFHX0NPTU1JVE9OU0VMQ0hBTkdFCQkJKDE8PDI2KQorI2RlZmluZSBGSUVMREZMQUdfQ09NTUlUT05TRUxDSEFOR0UgKDEgPDwgMjYpCiAKLSNkZWZpbmUgQkJTX1NPTElECQkJCQkwCi0jZGVmaW5lIEJCU19EQVNICQkJCQkxCi0jZGVmaW5lIEJCU19CRVZFTEVECQkJCQkyCi0jZGVmaW5lIEJCU19JTlNFVAkJCQkJMwotI2RlZmluZSBCQlNfVU5ERVJMSU5FCQkJCTQKKyNkZWZpbmUgQkJTX1NPTElEIDAKKyNkZWZpbmUgQkJTX0RBU0ggMQorI2RlZmluZSBCQlNfQkVWRUxFRCAyCisjZGVmaW5lIEJCU19JTlNFVCAzCisjZGVmaW5lIEJCU19VTkRFUkxJTkUgNAogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GU0RLX0NPTU1PTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmggYi9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaAppbmRleCBlMWFiMTc2Li5mMjA4YzA1IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaApAQCAtMzEsNjYgKzMxLDc3IEBACiAKICNpZm5kZWYgRlhfQVJHQlRPQ09MT1JSRUYKIC8qKiBAYnJpZWYgQ29udmVydCBhICNGWF9BUkdCIHRvIGEgI0ZYX0NPTE9SUkVGLiAqLwotI2RlZmluZSBGWF9BUkdCVE9DT0xPUlJFRihhcmdiKQkJKCgoKEZYX0RXT1JEKWFyZ2IgJiAweDAwRkYwMDAwKSA+PiAxNil8KChGWF9EV09SRClhcmdiICYgMHgwMDAwRkYwMCl8KCgoRlhfRFdPUkQpYXJnYiAmIDB4MDAwMDAwRkYpIDw8IDE2KSkKKyNkZWZpbmUgRlhfQVJHQlRPQ09MT1JSRUYoYXJnYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKEZYX0RXT1JEKWFyZ2IgJiAweDAwRkYwMDAwKSA+PiAxNikgfCAoKEZYX0RXT1JEKWFyZ2IgJiAweDAwMDBGRjAwKSB8IFwKKyAgICgoKEZYX0RXT1JEKWFyZ2IgJiAweDAwMDAwMEZGKSA8PCAxNikpCiAjZW5kaWYKIAogI2lmbmRlZiBGWF9DT0xPUlJFRlRPQVJHQgogLyoqIEBicmllZiBDb252ZXJ0IGEgI0ZYX0NPTE9SUkVGIHRvIGEgI0ZYX0FSR0IuICovCi0jZGVmaW5lIEZYX0NPTE9SUkVGVE9BUkdCKHJnYikJCSgoRlhfRFdPUkQpMHhGRjAwMDAwMHwoKChGWF9EV09SRClyZ2IgJiAweDAwMDAwMEZGKSA8PCAxNil8KChGWF9EV09SRClyZ2IgJiAweDAwMDBGRjAwKXwoKChGWF9EV09SRClyZ2IgJiAweDAwRkYwMDAwKSA+PiAxNikpCisjZGVmaW5lIEZYX0NPTE9SUkVGVE9BUkdCKHJnYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChGWF9EV09SRCkweEZGMDAwMDAwIHwgKCgoRlhfRFdPUkQpcmdiICYgMHgwMDAwMDBGRikgPDwgMTYpIHwgXAorICAgKChGWF9EV09SRClyZ2IgJiAweDAwMDBGRjAwKSB8ICgoKEZYX0RXT1JEKXJnYiAmIDB4MDBGRjAwMDApID4+IDE2KSkKICNlbmRpZgogCiB0eXBlZGVmIHVuc2lnbmVkIGludCBGWF9VSU5UOwogY2xhc3MgQ1JlbmRlckNvbnRleHQ7CiBjbGFzcyBJRlNES19QQVVTRV9BZGFwdGVyOwogCi1jbGFzcyBDUERGX0N1c3RvbUFjY2VzcyBmaW5hbCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQKLXsKLXB1YmxpYzoKLQlDUERGX0N1c3RvbUFjY2VzcyhGUERGX0ZJTEVBQ0NFU1MqIHBGaWxlQWNjZXNzKTsKLQl+Q1BERl9DdXN0b21BY2Nlc3MoKSB7fQorY2xhc3MgQ1BERl9DdXN0b21BY2Nlc3MgZmluYWwgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkIHsKKyBwdWJsaWM6CisgIENQREZfQ3VzdG9tQWNjZXNzKEZQREZfRklMRUFDQ0VTUyogcEZpbGVBY2Nlc3MpOworICB+Q1BERl9DdXN0b21BY2Nlc3MoKSB7fQogCisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0RnVsbFBhdGgoKSB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFNpemUoKSBvdmVycmlkZSB7IHJldHVybiBtX0ZpbGVBY2Nlc3MubV9GaWxlTGVuOyB9CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCeXRlKEZYX0RXT1JEIHBvcywgdWludDhfdCYgY2gpOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0QmxvY2soRlhfRFdPUkQgcG9zLCB1aW50OF90KiBwQnVmLCBGWF9EV09SRCBzaXplKTsKKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZSB7IGRlbGV0ZSB0aGlzOyB9CisgIHZpcnR1YWwgRlhfQk9PTCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldEZ1bGxQYXRoKCkgeyByZXR1cm4gIiI7IH0KLQl2aXJ0dWFsIEZYX0ZJTEVTSVpFCUdldFNpemUoKSBvdmVycmlkZSB7IHJldHVybiBtX0ZpbGVBY2Nlc3MubV9GaWxlTGVuOyB9Ci0JdmlydHVhbCBGWF9CT09MCQlHZXRCeXRlKEZYX0RXT1JEIHBvcywgdWludDhfdCYgY2gpOwotCXZpcnR1YWwgRlhfQk9PTAkJR2V0QmxvY2soRlhfRFdPUkQgcG9zLCB1aW50OF90KiBwQnVmLCBGWF9EV09SRCBzaXplKTsKLQl2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSBvdmVycmlkZSB7IGRlbGV0ZSB0aGlzOyB9Ci0JdmlydHVhbCBGWF9CT09MCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKLQotCUZQREZfRklMRUFDQ0VTUwkJbV9GaWxlQWNjZXNzOwotCXVpbnQ4X3QJCQkJbV9CdWZmZXJbNTEyXTsKLQlGWF9EV09SRAkJCW1fQnVmZmVyT2Zmc2V0OworICBGUERGX0ZJTEVBQ0NFU1MgbV9GaWxlQWNjZXNzOworICB1aW50OF90IG1fQnVmZmVyWzUxMl07CisgIEZYX0RXT1JEIG1fQnVmZmVyT2Zmc2V0OwogfTsKIAotY2xhc3MgQ0ZQREZfRmlsZVN0cmVhbSA6IHB1YmxpYyBJRlhfRmlsZVN0cmVhbQotewotcHVibGljOgotCUNGUERGX0ZpbGVTdHJlYW0oRlBERl9GSUxFSEFORExFUiogcEZTKTsKLQl2aXJ0dWFsIH5DRlBERl9GaWxlU3RyZWFtKCkge30KK2NsYXNzIENGUERGX0ZpbGVTdHJlYW0gOiBwdWJsaWMgSUZYX0ZpbGVTdHJlYW0geworIHB1YmxpYzoKKyAgQ0ZQREZfRmlsZVN0cmVhbShGUERGX0ZJTEVIQU5ETEVSKiBwRlMpOworICB2aXJ0dWFsIH5DRlBERl9GaWxlU3RyZWFtKCkge30KIAotCXZpcnR1YWwgSUZYX0ZpbGVTdHJlYW0qCQlSZXRhaW4oKTsKLQl2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpOworICB2aXJ0dWFsIElGWF9GaWxlU3RyZWFtKiBSZXRhaW4oKTsKKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsKIAotCXZpcnR1YWwgRlhfRklMRVNJWkUJCQlHZXRTaXplKCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUlzRU9GKCk7Ci0JdmlydHVhbCBGWF9GSUxFU0laRQkJCUdldFBvc2l0aW9uKCkge3JldHVybiBtX25DdXJQb3M7fQotCXZpcnR1YWwgdm9pZAkJCQlTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpIHttX25DdXJQb3MgPSBwb3M7IH0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0JdmlydHVhbCBzaXplX3QJCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwotCXZpcnR1YWwJRlhfQk9PTAkJCQlXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUZsdXNoKCk7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0U2l6ZSgpOworICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKTsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpIHsgcmV0dXJuIG1fbkN1clBvczsgfQorICB2aXJ0dWFsIHZvaWQgU2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKSB7IG1fbkN1clBvcyA9IHBvczsgfQorICB2aXJ0dWFsIEZYX0JPT0wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgIHZpcnR1YWwgc2l6ZV90IFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgdmlydHVhbCBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKTsKKyAgdmlydHVhbCBGWF9CT09MIEZsdXNoKCk7CiAKLXByb3RlY3RlZDoKLQlGUERGX0ZJTEVIQU5ETEVSKgltX3BGUzsKLQlGWF9GSUxFU0laRQkJbV9uQ3VyUG9zOworIHByb3RlY3RlZDoKKyAgRlBERl9GSUxFSEFORExFUiogbV9wRlM7CisgIEZYX0ZJTEVTSVpFIG1fbkN1clBvczsKIH07CiAKIHZvaWQgRHJvcENvbnRleHQodm9pZCogZGF0YSk7CiB2b2lkIEZTREtfU2V0U2FuZEJveFBvbGljeShGUERGX0RXT1JEIHBvbGljeSwgRlBERl9CT09MIGVuYWJsZSk7CiBGUERGX0JPT0wgRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfRFdPUkQgcG9saWN5KTsKLXZvaWQgRlBERl9SZW5kZXJQYWdlX1JldGFpbChDUmVuZGVyQ29udGV4dCogcENvbnRleHQsIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLCBpbnQgZmxhZ3MsIEZYX0JPT0wgYk5lZWRUb1Jlc3RvcmUsCit2b2lkIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwoQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOZWVkVG9SZXN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGU0RLX1BBVVNFX0FkYXB0ZXIqIHBhdXNlKTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlNES19ERUZJTkVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgKaW5kZXggYmQxNThiYy4uMWU2NDhlOSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgKQEAgLTExLDcgKzExLDcgQEAKIAogI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaCIKICNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiIC8vIGNyb3NzIHBsYXRmb3JtIGtleWNvZGUgYW5kIGV2ZW50cyBkZWZpbmUuCisjaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfZndsZXZlbnQuaCIgIC8vIGNyb3NzIHBsYXRmb3JtIGtleWNvZGUgYW5kIGV2ZW50cyBkZWZpbmUuCiAjaW5jbHVkZSAiZnNka19jb21tb24uaCIKICNpbmNsdWRlICJmc2RrX2RlZmluZS5oIgogI2luY2x1ZGUgImZ4X3N5c3RlbWhhbmRsZXIuaCIKQEAgLTMzLDYyMSArMzMsNjU1IEBACiBjbGFzcyBDUERGU0RLX1dpZGdldDsKIGNsYXNzIElGWF9TeXN0ZW1IYW5kbGVyOwogCi1jbGFzcyBDUERGRG9jX0Vudmlyb25tZW50IGZpbmFsCi17Ci1wdWJsaWM6Ci0gICAgQ1BERkRvY19FbnZpcm9ubWVudChDUERGWEZBX0RvY3VtZW50KiBwRG9jLCAgRlBERl9GT1JNRklMTElORk8qIHBGRmluZm8pOwotICAgIHZpcnR1YWwgfkNQREZEb2NfRW52aXJvbm1lbnQoKTsKK2NsYXNzIENQREZEb2NfRW52aXJvbm1lbnQgZmluYWwgeworIHB1YmxpYzoKKyAgQ1BERkRvY19FbnZpcm9ubWVudChDUERGWEZBX0RvY3VtZW50KiBwRG9jLCBGUERGX0ZPUk1GSUxMSU5GTyogcEZGaW5mbyk7CisgIHZpcnR1YWwgfkNQREZEb2NfRW52aXJvbm1lbnQoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPlJlbGVhc2UpCi0gICAgICAgICAgICBtX3BJbmZvLT5SZWxlYXNlKG1fcEluZm8pOwotICAgICAgICBkZWxldGUgdGhpczsKKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+UmVsZWFzZSkKKyAgICAgIG1fcEluZm8tPlJlbGVhc2UobV9wSW5mbyk7CisgICAgZGVsZXRlIHRoaXM7CisgIH0KKworICB2b2lkIEZGSV9JbnZhbGlkYXRlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBib3R0b20pIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfSW52YWxpZGF0ZSkKKyAgICAgIG1fcEluZm8tPkZGSV9JbnZhbGlkYXRlKG1fcEluZm8sIHBhZ2UsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgIH0KKworICB2b2lkIEZGSV9PdXRwdXRTZWxlY3RlZFJlY3QoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYm90dG9tKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX091dHB1dFNlbGVjdGVkUmVjdCkKKyAgICAgIG1fcEluZm8tPkZGSV9PdXRwdXRTZWxlY3RlZFJlY3QobV9wSW5mbywgcGFnZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgfQorCisgIHZvaWQgRkZJX1NldEN1cnNvcihpbnQgbkN1cnNvclR5cGUpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfU2V0Q3Vyc29yKQorICAgICAgbV9wSW5mby0+RkZJX1NldEN1cnNvcihtX3BJbmZvLCBuQ3Vyc29yVHlwZSk7CisgIH0KKworICBpbnQgRkZJX1NldFRpbWVyKGludCB1RWxhcHNlLCBUaW1lckNhbGxiYWNrIGxwVGltZXJGdW5jKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1NldFRpbWVyKQorICAgICAgcmV0dXJuIG1fcEluZm8tPkZGSV9TZXRUaW1lcihtX3BJbmZvLCB1RWxhcHNlLCBscFRpbWVyRnVuYyk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgdm9pZCBGRklfS2lsbFRpbWVyKGludCBuVGltZXJJRCkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9LaWxsVGltZXIpCisgICAgICBtX3BJbmZvLT5GRklfS2lsbFRpbWVyKG1fcEluZm8sIG5UaW1lcklEKTsKKyAgfQorCisgIEZYX1NZU1RFTVRJTUUgRkZJX0dldExvY2FsVGltZSgpIHsKKyAgICBGWF9TWVNURU1USU1FIGZ4dGltZTsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfR2V0TG9jYWxUaW1lKSB7CisgICAgICBGUERGX1NZU1RFTVRJTUUgc3lzdGltZSA9IG1fcEluZm8tPkZGSV9HZXRMb2NhbFRpbWUobV9wSW5mbyk7CisgICAgICBmeHRpbWUud0RheSA9IHN5c3RpbWUud0RheTsKKyAgICAgIGZ4dGltZS53RGF5T2ZXZWVrID0gc3lzdGltZS53RGF5T2ZXZWVrOworICAgICAgZnh0aW1lLndIb3VyID0gc3lzdGltZS53SG91cjsKKyAgICAgIGZ4dGltZS53TWlsbGlzZWNvbmRzID0gc3lzdGltZS53TWlsbGlzZWNvbmRzOworICAgICAgZnh0aW1lLndNaW51dGUgPSBzeXN0aW1lLndNaW51dGU7CisgICAgICBmeHRpbWUud01vbnRoID0gc3lzdGltZS53TW9udGg7CisgICAgICBmeHRpbWUud1NlY29uZCA9IHN5c3RpbWUud1NlY29uZDsKKyAgICAgIGZ4dGltZS53WWVhciA9IHN5c3RpbWUud1llYXI7CiAgICAgfQorICAgIHJldHVybiBmeHRpbWU7CisgIH0KIAotICAgIHZvaWQgRkZJX0ludmFsaWRhdGUoRlBERl9QQUdFIHBhZ2UsIGRvdWJsZSBsZWZ0LCBkb3VibGUgdG9wLCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20pCi0gICAgewotICAgICAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfSW52YWxpZGF0ZSkKLSAgICAgICAgICAgIG1fcEluZm8tPkZGSV9JbnZhbGlkYXRlKG1fcEluZm8sIHBhZ2UsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0gICAgfQorICB2b2lkIEZGSV9PbkNoYW5nZSgpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfT25DaGFuZ2UpCisgICAgICBtX3BJbmZvLT5GRklfT25DaGFuZ2UobV9wSW5mbyk7CisgIH0KIAotICAgIHZvaWQgRkZJX091dHB1dFNlbGVjdGVkUmVjdChGUERGX1BBR0UgcGFnZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9PdXRwdXRTZWxlY3RlZFJlY3QpCi0gICAgICAgICAgICBtX3BJbmZvLT5GRklfT3V0cHV0U2VsZWN0ZWRSZWN0KG1fcEluZm8sIHBhZ2UsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0gICAgfQorICBGWF9CT09MIEZGSV9Jc1NISUZUS2V5RG93bihGWF9EV09SRCBuRmxhZykgeworICAgIHJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5KSAhPSAwOworICB9CiAKLSAgICB2b2lkIEZGSV9TZXRDdXJzb3IoaW50IG5DdXJzb3JUeXBlKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1NldEN1cnNvcikKLSAgICAgICAgICAgIG1fcEluZm8tPkZGSV9TZXRDdXJzb3IobV9wSW5mbywgbkN1cnNvclR5cGUpOwotICAgIH0KKyAgRlhfQk9PTCBGRklfSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykgeworICAgIHJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX0NvbnRyb2xLZXkpICE9IDA7CisgIH0KIAotICAgIGludCAgRkZJX1NldFRpbWVyKGludCB1RWxhcHNlLCBUaW1lckNhbGxiYWNrIGxwVGltZXJGdW5jKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1NldFRpbWVyKQotICAgICAgICAgICAgcmV0dXJuIG1fcEluZm8tPkZGSV9TZXRUaW1lcihtX3BJbmZvLCB1RWxhcHNlLCBscFRpbWVyRnVuYyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgIEZYX0JPT0wgRkZJX0lzQUxUS2V5RG93bihGWF9EV09SRCBuRmxhZykgeworICAgIHJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX0FsdEtleSkgIT0gMDsKKyAgfQogCi0gICAgdm9pZCBGRklfS2lsbFRpbWVyKGludCBuVGltZXJJRCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9LaWxsVGltZXIpCi0gICAgICAgICAgICBtX3BJbmZvLT5GRklfS2lsbFRpbWVyKG1fcEluZm8sIG5UaW1lcklEKTsKLSAgICB9CisgIEZYX0JPT0wgRkZJX0lzSU5TRVJUS2V5RG93bihGWF9EV09SRCBuRmxhZykgeyByZXR1cm4gRkFMU0U7IH0KIAotICAgIEZYX1NZU1RFTVRJTUUgRkZJX0dldExvY2FsVGltZSgpCi0gICAgewotICAgICAgICBGWF9TWVNURU1USU1FIGZ4dGltZTsKLSAgICAgICAgaWYobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfR2V0TG9jYWxUaW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBGUERGX1NZU1RFTVRJTUUgc3lzdGltZSA9IG1fcEluZm8tPkZGSV9HZXRMb2NhbFRpbWUobV9wSW5mbyk7Ci0gICAgICAgICAgICBmeHRpbWUud0RheSA9IHN5c3RpbWUud0RheTsKLSAgICAgICAgICAgIGZ4dGltZS53RGF5T2ZXZWVrID0gc3lzdGltZS53RGF5T2ZXZWVrOwotICAgICAgICAgICAgZnh0aW1lLndIb3VyID0gc3lzdGltZS53SG91cjsKLSAgICAgICAgICAgIGZ4dGltZS53TWlsbGlzZWNvbmRzID0gc3lzdGltZS53TWlsbGlzZWNvbmRzOwotICAgICAgICAgICAgZnh0aW1lLndNaW51dGUgPSBzeXN0aW1lLndNaW51dGU7Ci0gICAgICAgICAgICBmeHRpbWUud01vbnRoID0gc3lzdGltZS53TW9udGg7Ci0gICAgICAgICAgICBmeHRpbWUud1NlY29uZCA9IHN5c3RpbWUud1NlY29uZDsKLSAgICAgICAgICAgIGZ4dGltZS53WWVhciA9IHN5c3RpbWUud1llYXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZ4dGltZTsKLSAgICB9CisgIGludCBKU19hcHBBbGVydChjb25zdCBGWF9XQ0hBUiogTXNnLAorICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIFRpdGxlLAorICAgICAgICAgICAgICAgICAgRlhfVUlOVCBUeXBlLAorICAgICAgICAgICAgICAgICAgRlhfVUlOVCBJY29uKTsKKyAgaW50IEpTX2FwcFJlc3BvbnNlKGNvbnN0IEZYX1dDSEFSKiBRdWVzdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGNMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOwogCi0gICAgdm9pZCBGRklfT25DaGFuZ2UoKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX09uQ2hhbmdlKQotICAgICAgICAgICAgbV9wSW5mby0+RkZJX09uQ2hhbmdlKG1fcEluZm8pOwotICAgIH0KKyAgdm9pZCBKU19hcHBCZWVwKGludCBuVHlwZSkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX2JlZXApCisgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfYmVlcChtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBuVHlwZSk7CisgIH0KIAotICAgIEZYX0JPT0wgRkZJX0lzU0hJRlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChuRmxhZyAmIEZXTF9FVkVOVEZMQUdfU2hpZnRLZXkpICE9IDA7Ci0gICAgfQorICBDRlhfV2lkZVN0cmluZyBKU19maWVsZEJyb3dzZSgpOworICBDRlhfV2lkZVN0cmluZyBKU19kb2NHZXRGaWxlUGF0aCgpOwogCi0gICAgRlhfQk9PTCBGRklfSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykKLSAgICB7Ci0gICAgICAgIHJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX0NvbnRyb2xLZXkpICE9IDA7Ci0gICAgfQorICB2b2lkIEpTX2RvY1N1Ym1pdEZvcm0odm9pZCogZm9ybURhdGEsIGludCBsZW5ndGgsIGNvbnN0IEZYX1dDSEFSKiBVUkwpOworICB2b2lkIEpTX2RvY21haWxGb3JtKHZvaWQqIG1haWxEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJVSSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogVG8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIFN1YmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIENDLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBCQ0MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIE1zZyk7CiAKLSAgICBGWF9CT09MIEZGSV9Jc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpCi0gICAgewotICAgICAgICByZXR1cm4gKG5GbGFnICYgRldMX0VWRU5URkxBR19BbHRLZXkpICE9IDA7Ci0gICAgfQorICB2b2lkIEpTX2RvY3ByaW50KEZQREZfQk9PTCBiVUksCisgICAgICAgICAgICAgICAgICAgaW50IG5TdGFydCwKKyAgICAgICAgICAgICAgICAgICBpbnQgbkVuZCwKKyAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlNpbGVudCwKKyAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlNocmlua1RvRml0LAorICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUHJpbnRBc0ltYWdlLAorICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUmV2ZXJzZSwKKyAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYkFubm90YXRpb25zKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfcHJpbnQpCisgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfcHJpbnQobV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgYlVJLCBuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkVuZCwgYlNpbGVudCwgYlNocmlua1RvRml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcmludEFzSW1hZ2UsIGJSZXZlcnNlLCBiQW5ub3RhdGlvbnMpOworICB9CiAKLSAgICBGWF9CT09MIEZGSV9Jc0lOU0VSVEtleURvd24oRlhfRFdPUkQgbkZsYWcpCi0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorICB2b2lkIEpTX2RvY2dvdG9QYWdlKGludCBuUGFnZU51bSkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYKKyAgICAgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX2dvdG9QYWdlKQorICAgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX2dvdG9QYWdlKG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIG5QYWdlTnVtKTsKKyAgfQogCi0gICAgaW50IEpTX2FwcEFsZXJ0KGNvbnN0IEZYX1dDSEFSKiBNc2csIGNvbnN0IEZYX1dDSEFSKiBUaXRsZSwgRlhfVUlOVCBUeXBlLCBGWF9VSU5UIEljb24pOwotICAgIGludCBKU19hcHBSZXNwb25zZShjb25zdCBGWF9XQ0hBUiogUXVlc3Rpb24sIGNvbnN0IEZYX1dDSEFSKiBUaXRsZSwgY29uc3QgRlhfV0NIQVIqIERlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBjTGFiZWwsIEZQREZfQk9PTCBiUGFzc3dvcmQsIHZvaWQqIHJlc3BvbnNlLCBpbnQgbGVuZ3RoKTsKKyAgRlBERl9QQUdFIEZGSV9HZXRQYWdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBuUGFnZUluZGV4KSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldFBhZ2UpCisgICAgICByZXR1cm4gbV9wSW5mby0+RkZJX0dldFBhZ2UobV9wSW5mbywgZG9jdW1lbnQsIG5QYWdlSW5kZXgpOworICAgIHJldHVybiBOVUxMOworICB9CiAKLSAgICB2b2lkIEpTX2FwcEJlZXAoaW50IG5UeXBlKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfYmVlcCkKLSAgICAgICAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9iZWVwKG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIG5UeXBlKTsKLSAgICB9CisgIEZQREZfUEFHRSBGRklfR2V0Q3VycmVudFBhZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9HZXRDdXJyZW50UGFnZSkKKyAgICAgIHJldHVybiBtX3BJbmZvLT5GRklfR2V0Q3VycmVudFBhZ2UobV9wSW5mbywgZG9jdW1lbnQpOworICAgIHJldHVybiBOVUxMOworICB9CiAKLSAgICBDRlhfV2lkZVN0cmluZyBKU19maWVsZEJyb3dzZSgpOwotICAgIENGWF9XaWRlU3RyaW5nIEpTX2RvY0dldEZpbGVQYXRoKCk7CisgIGludCBGRklfR2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfR2V0Um90YXRpb24pCisgICAgICByZXR1cm4gbV9wSW5mby0+RkZJX0dldFJvdGF0aW9uKG1fcEluZm8sIHBhZ2UpOworICAgIHJldHVybiAwOworICB9CiAKLSAgICB2b2lkIEpTX2RvY1N1Ym1pdEZvcm0odm9pZCogZm9ybURhdGEsIGludCBsZW5ndGgsIGNvbnN0IEZYX1dDSEFSKiBVUkwpOwotICAgIHZvaWQgSlNfZG9jbWFpbEZvcm0odm9pZCogbWFpbERhdGEsIGludCBsZW5ndGgsIEZQREZfQk9PTCBiVUksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogVG8sIGNvbnN0IEZYX1dDSEFSKiBTdWJqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIENDLCBjb25zdCBGWF9XQ0hBUiogQkNDLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIE1zZyk7CisgIHZvaWQgRkZJX0V4ZWN1dGVOYW1lZEFjdGlvbihjb25zdCBGWF9DSEFSKiBuYW1lZEFjdGlvbikgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24pCisgICAgICBtX3BJbmZvLT5GRklfRXhlY3V0ZU5hbWVkQWN0aW9uKG1fcEluZm8sIG5hbWVkQWN0aW9uKTsKKyAgfQogCi0gICAgdm9pZCBKU19kb2NwcmludChGUERGX0JPT0wgYlVJLCBpbnQgblN0YXJ0LCBpbnQgbkVuZCwgRlBERl9CT09MIGJTaWxlbnQsCi0gICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlNocmlua1RvRml0LCBGUERGX0JPT0wgYlByaW50QXNJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUmV2ZXJzZSwgRlBERl9CT09MIGJBbm5vdGF0aW9ucykKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX3ByaW50KQotICAgICAgICAgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX3ByaW50KAotICAgICAgICAgICAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIGJVSSwgblN0YXJ0LCBuRW5kLCBiU2lsZW50LCBiU2hyaW5rVG9GaXQsCi0gICAgICAgICAgICAgICAgYlByaW50QXNJbWFnZSwgYlJldmVyc2UsIGJBbm5vdGF0aW9ucyk7Ci0gICAgfQorICB2b2lkIEZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyh2b2lkKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIGZvY3VzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBuVGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9jdXMpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfU2V0VGV4dEZpZWxkRm9jdXMpCisgICAgICBtX3BJbmZvLT5GRklfU2V0VGV4dEZpZWxkRm9jdXMobV9wSW5mbywgZm9jdXNUZXh0LCBuVGV4dExlbiwgYkZvY3VzKTsKKyAgfQogCi0gICAgdm9pZCBKU19kb2Nnb3RvUGFnZShpbnQgblBhZ2VOdW0pCi0gICAgewotICAgICAgICBpZihtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX2dvdG9QYWdlKQotICAgICAgICAgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX2dvdG9QYWdlKG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIG5QYWdlTnVtKTsKLSAgICB9CisgIHZvaWQgRkZJX0RvVVJJQWN0aW9uKGNvbnN0IEZYX0NIQVIqIGJzVVJJKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0RvVVJJQWN0aW9uKQorICAgICAgbV9wSW5mby0+RkZJX0RvVVJJQWN0aW9uKG1fcEluZm8sIGJzVVJJKTsKKyAgfQogCi0gICAgRlBERl9QQUdFIEZGSV9HZXRQYWdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsaW50IG5QYWdlSW5kZXgpCi0gICAgewotICAgICAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfR2V0UGFnZSkKLSAgICAgICAgICAgIHJldHVybiBtX3BJbmZvLT5GRklfR2V0UGFnZShtX3BJbmZvLCBkb2N1bWVudCwgblBhZ2VJbmRleCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgdm9pZCBGRklfRG9Hb1RvQWN0aW9uKGludCBuUGFnZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHpvb21Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZQb3NBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplT2ZBcnJheSkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9Eb0dvVG9BY3Rpb24pCisgICAgICBtX3BJbmZvLT5GRklfRG9Hb1RvQWN0aW9uKG1fcEluZm8sIG5QYWdlSW5kZXgsIHpvb21Nb2RlLCBmUG9zQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVPZkFycmF5KTsKKyAgfQogCi0gICAgRlBERl9QQUdFIEZGSV9HZXRDdXJyZW50UGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldEN1cnJlbnRQYWdlKQotICAgICAgICAgICAgcmV0dXJuIG1fcEluZm8tPkZGSV9HZXRDdXJyZW50UGFnZShtX3BJbmZvLCBkb2N1bWVudCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgdm9pZCBGRklfRGlzcGxheUNhcmV0KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJWaXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9EaXNwbGF5Q2FyZXQpCisgICAgICBtX3BJbmZvLT5GRklfRGlzcGxheUNhcmV0KG1fcEluZm8sIHBhZ2UsIGJWaXNpYmxlLCBsZWZ0LCB0b3AsIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20pOworICB9CiAKLSAgICBpbnQgRkZJX0dldFJvdGF0aW9uKEZQREZfUEFHRSBwYWdlKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldFJvdGF0aW9uKQotICAgICAgICAgICAgcmV0dXJuIG1fcEluZm8tPkZGSV9HZXRSb3RhdGlvbihtX3BJbmZvLCBwYWdlKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICBpbnQgRkZJX0dldEN1cnJlbnRQYWdlSW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9HZXRDdXJyZW50UGFnZUluZGV4KQorICAgICAgbV9wSW5mby0+RkZJX0dldEN1cnJlbnRQYWdlSW5kZXgobV9wSW5mbywgZG9jdW1lbnQpOworICAgIHJldHVybiAtMTsKKyAgfQogCi0gICAgdm9pZCBGRklfRXhlY3V0ZU5hbWVkQWN0aW9uKGNvbnN0IEZYX0NIQVIqIG5hbWVkQWN0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0V4ZWN1dGVOYW1lZEFjdGlvbikKLSAgICAgICAgICAgIG1fcEluZm8tPkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24obV9wSW5mbywgbmFtZWRBY3Rpb24pOwotICAgIH0KKyAgaW50IEZGSV9TZXRDdXJyZW50UGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgaUN1clBhZ2UpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfU2V0Q3VycmVudFBhZ2UpCisgICAgICBtX3BJbmZvLT5GRklfU2V0Q3VycmVudFBhZ2UobV9wSW5mbywgZG9jdW1lbnQsIGlDdXJQYWdlKTsKKyAgICByZXR1cm4gLTE7CisgIH0KIAotICAgIHZvaWQgRkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKHZvaWQqIGZpZWxkLEZQREZfV0lERVNUUklORyBmb2N1c1RleHQsIEZQREZfRFdPUkQgblRleHRMZW4sIEZYX0JPT0wgYkZvY3VzKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1NldFRleHRGaWVsZEZvY3VzKQotICAgICAgICAgICAgbV9wSW5mby0+RkZJX1NldFRleHRGaWVsZEZvY3VzKG1fcEluZm8sIGZvY3VzVGV4dCwgblRleHRMZW4sIGJGb2N1cyk7Ci0gICAgfQorICBDRlhfV2lkZVN0cmluZyBGRklfR2V0QXBwTmFtZSgpIGNvbnN0IHsgcmV0dXJuIENGWF9XaWRlU3RyaW5nKEwiQWNyb2JhdCIpOyB9CiAKLSAgICB2b2lkIEZGSV9Eb1VSSUFjdGlvbihjb25zdCBGWF9DSEFSKiBic1VSSSkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9Eb1VSSUFjdGlvbikKLSAgICAgICAgICAgIG1fcEluZm8tPkZGSV9Eb1VSSUFjdGlvbihtX3BJbmZvLCBic1VSSSk7Ci0gICAgfQotCi0gICAgdm9pZCBGRklfRG9Hb1RvQWN0aW9uKGludCBuUGFnZUluZGV4LCBpbnQgem9vbU1vZGUsIGZsb2F0KiBmUG9zQXJyYXksIGludCBzaXplT2ZBcnJheSkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9Eb0dvVG9BY3Rpb24pCi0gICAgICAgICAgICBtX3BJbmZvLT5GRklfRG9Hb1RvQWN0aW9uKG1fcEluZm8sIG5QYWdlSW5kZXgsIHpvb21Nb2RlLCBmUG9zQXJyYXksIHNpemVPZkFycmF5KTsKLSAgICB9Ci0KLSAgICB2b2lkIEZGSV9EaXNwbGF5Q2FyZXQoRlBERl9QQUdFIHBhZ2UsIEZQREZfQk9PTCBiVmlzaWJsZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9EaXNwbGF5Q2FyZXQpCi0gICAgICAgICAgICBtX3BJbmZvLT5GRklfRGlzcGxheUNhcmV0KG1fcEluZm8sIHBhZ2UsIGJWaXNpYmxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIH0KLQotICAgIGludCBGRklfR2V0Q3VycmVudFBhZ2VJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldEN1cnJlbnRQYWdlSW5kZXgpCi0gICAgICAgICAgICBtX3BJbmZvLT5GRklfR2V0Q3VycmVudFBhZ2VJbmRleChtX3BJbmZvLCBkb2N1bWVudCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpbnQgRkZJX1NldEN1cnJlbnRQYWdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBpQ3VyUGFnZSkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9TZXRDdXJyZW50UGFnZSkKLSAgICAgICAgICAgIG1fcEluZm8tPkZGSV9TZXRDdXJyZW50UGFnZShtX3BJbmZvLCBkb2N1bWVudCwgaUN1clBhZ2UpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgQ0ZYX1dpZGVTdHJpbmcgRkZJX0dldEFwcE5hbWUoKSBjb25zdCB7IHJldHVybiBDRlhfV2lkZVN0cmluZyhMIkFjcm9iYXQiKTsgfQotCi0gICAgQ0ZYX1dpZGVTdHJpbmcgIEZGSV9HZXRQbGF0Zm9ybSgpCi0gICAgewotICAgICAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfR2V0UGxhdGZvcm0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBuUmVxdWlyZWRMZW4gPSBtX3BJbmZvLT5GRklfR2V0UGxhdGZvcm0obV9wSW5mbywgTlVMTCwgMCk7Ci0gICAgICAgICAgICBpZiAoblJlcXVpcmVkTGVuIDw9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIEwiIjsKLQotICAgICAgICAgICAgY2hhciogcGJ1ZmYgPSBuZXcgY2hhcltuUmVxdWlyZWRMZW5dOwotICAgICAgICAgICAgaWYgKCFwYnVmZikKLSAgICAgICAgICAgICAgICByZXR1cm4gTCIiOwotCi0gICAgICAgICAgICBtZW1zZXQocGJ1ZmYsIDAsIG5SZXF1aXJlZExlbik7Ci0gICAgICAgICAgICBpbnQgbkFjdHVhbExlbiA9IG1fcEluZm8tPkZGSV9HZXRQbGF0Zm9ybShtX3BJbmZvLCBwYnVmZiwgblJlcXVpcmVkTGVuKTsKLSAgICAgICAgICAgIGlmIChuQWN0dWFsTGVuIDw9IDAgfHwgbkFjdHVhbExlbiA+IG5SZXF1aXJlZExlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBwYnVmZjsKLSAgICAgICAgICAgICAgICByZXR1cm4gTCIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNSZXQgPSBDRlhfQnl0ZVN0cmluZyhwYnVmZiwgbkFjdHVhbExlbik7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1JldCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSgodW5zaWduZWQgc2hvcnQqKWJzUmV0LkdldEJ1ZmZlcihic1JldC5HZXRMZW5ndGgoKSksIGJzUmV0LkdldExlbmd0aCgpL3NpemVvZih1bnNpZ25lZCBzaG9ydCkpOwotICAgICAgICAgICAgZGVsZXRlW10gcGJ1ZmY7Ci0gICAgICAgICAgICByZXR1cm4gd3NSZXQ7Ci0gICAgICAgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgRkZJX0dldFBsYXRmb3JtKCkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9HZXRQbGF0Zm9ybSkgeworICAgICAgaW50IG5SZXF1aXJlZExlbiA9IG1fcEluZm8tPkZGSV9HZXRQbGF0Zm9ybShtX3BJbmZvLCBOVUxMLCAwKTsKKyAgICAgIGlmIChuUmVxdWlyZWRMZW4gPD0gMCkKICAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9CiAKLSAgICB2b2lkIEZGSV9Hb3RvVVJMKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVUkwsIEZYX0JPT0wgYkFwcGVuZCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9Hb3RvVVJMKQotICAgICAgICB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1RvID0gQ0ZYX1dpZGVTdHJpbmcod3NVUkwpLlVURjE2TEVfRW5jb2RlKCk7Ci0gICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgcFRvID0gKEZQREZfV0lERVNUUklORylic1RvLkdldEJ1ZmZlcih3c1VSTC5HZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICBtX3BJbmZvLT5GRklfR290b1VSTChtX3BJbmZvLCBkb2N1bWVudCwgcFRvKTsKLSAgICAgICAgICAgIGJzVG8uUmVsZWFzZUJ1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBGRklfR2V0VVJMKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIENGWF9XaWRlU3RyaW5nJiB3c1VSTCkKLSAgICB7Ci0gICAgICAgIHdzVVJMID0gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICB2b2lkIEZGSV9BZGREb1JlY29yZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0KSB7fQotICAgIHZvaWQgRkZJX1BhZ2VFdmVudChGUERGX1BBR0UgcGFnZSwgRlBERl9EV09SRCBmbGFnKSB7fQotCi0gICAgdm9pZCBGRklfR2V0UGFnZVZpZXdSZWN0KEZQREZfUEFHRSBwYWdlLCBGU19SRUNURiYgZHN0UmVjdCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9HZXRQYWdlVmlld1JlY3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSBsZWZ0OwotICAgICAgICAgICAgZG91YmxlIHRvcDsKLSAgICAgICAgICAgIGRvdWJsZSByaWdodDsKLSAgICAgICAgICAgIGRvdWJsZSBib3R0b207Ci0gICAgICAgICAgICBtX3BJbmZvLT5GRklfR2V0UGFnZVZpZXdSZWN0KG1fcEluZm8sIHBhZ2UsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pOwotCi0gICAgICAgICAgICBkc3RSZWN0LmxlZnQgPSBzdGF0aWNfY2FzdDxmbG9hdD4obGVmdCk7Ci0gICAgICAgICAgICBkc3RSZWN0LnRvcCA9IHN0YXRpY19jYXN0PGZsb2F0Pih0b3AgPCBib3R0b20gPyBib3R0b20gOiB0b3ApOwotICAgICAgICAgICAgZHN0UmVjdC5ib3R0b20gPSBzdGF0aWNfY2FzdDxmbG9hdD4odG9wIDwgYm90dG9tID8gdG9wIDogYm90dG9tKTsKLSAgICAgICAgICAgIGRzdFJlY3QucmlnaHQgPSBzdGF0aWNfY2FzdDxmbG9hdD4ocmlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgRlhfQk9PTCBGRklfUG9wdXBNZW51KEZQREZfUEFHRSBwYWdlLCBGUERGX1dJREdFVCBoV2lkZ2V0LCBpbnQgbWVudUZsYWcsIENGWF9Qb2ludEYgcHRQb3B1cCwgY29uc3QgQ0ZYX1BvaW50RiogcFJlY3RFeGNsdWRlKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1BvcHVwTWVudSkKLSAgICAgICAgICAgIHJldHVybiBtX3BJbmZvLT5GRklfUG9wdXBNZW51KG1fcEluZm8sIHBhZ2UsIGhXaWRnZXQsIG1lbnVGbGFnLCBwdFBvcHVwLngsIHB0UG9wdXAueSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICB2b2lkIEZGSV9BbGVydChGUERGX1dJREVTVFJJTkcgTXNnLCBGUERGX1dJREVTVFJJTkcgVGl0bGUsIGludCBUeXBlLCBpbnQgSWNvbikKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX2FsZXJ0KQotICAgICAgICAgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX2FsZXJ0KG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIE1zZywgVGl0bGUsIFR5cGUsIEljb24pOwotICAgIH0KLQotICAgIHZvaWQgRkZJX0VtYWlsVG8oRlBERl9GSUxFSEFORExFUiogZmlsZUhhbmRsZXIsIEZQREZfV0lERVNUUklORyBwVG8sCi0gICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgcFN1YmplY3QsIEZQREZfV0lERVNUUklORyBwQ0MsCi0gICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgcEJjYywgRlBERl9XSURFU1RSSU5HIHBNc2cpCi0gICAgewotICAgICAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfRW1haWxUbykKLSAgICAgICAgICAgIG1fcEluZm8tPkZGSV9FbWFpbFRvKG1fcEluZm8sIGZpbGVIYW5kbGVyLCBwVG8sIHBTdWJqZWN0LCBwQ0MsIHBCY2MsIHBNc2cpOwotICAgIH0KLQotICAgIHZvaWQgRkZJX1VwbG9hZFRvKEZQREZfRklMRUhBTkRMRVIqIGZpbGVIYW5kbGVyLCBpbnQgZmlsZUZsYWcsIEZQREZfV0lERVNUUklORyB1cGxvYWRUbykKLSAgICB7Ci0gICAgICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9VcGxvYWRUbykKLSAgICAgICAgICAgIG1fcEluZm8tPkZGSV9VcGxvYWRUbyhtX3BJbmZvLCBmaWxlSGFuZGxlciwgZmlsZUZsYWcsIHVwbG9hZFRvKTsKLSAgICB9Ci0KLSAgICBGUERGX0ZJTEVIQU5ETEVSKiBGRklfT3BlbkZpbGUoaW50IGZpbGVUeXBlLCBGUERGX1dJREVTVFJJTkcgd3NVUkwsIGNvbnN0IGNoYXIqIG1vZGUpCi0gICAgewotICAgICAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfT3BlbkZpbGUpCi0gICAgICAgICAgICByZXR1cm4gbV9wSW5mby0+RkZJX09wZW5GaWxlKG1fcEluZm8sIGZpbGVUeXBlLCB3c1VSTCwgbW9kZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nIEZGSV9HZXRGaWxlUGF0aChGUERGX0ZJTEVIQU5ETEVSKiBwRmlsZUhhbmRsZXIpIGNvbnN0Ci0gICAgeworICAgICAgY2hhciogcGJ1ZmYgPSBuZXcgY2hhcltuUmVxdWlyZWRMZW5dOworICAgICAgaWYgKCFwYnVmZikKICAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9CiAKLSAgICBpbnQgRkZJX0dldERvY3VtZW50Q291bnQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IEZGSV9HZXRDdXJEb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIElGWF9GaWxlUmVhZCogRkZJX0Rvd25sb2FkRnJvbVVSTChjb25zdCBGWF9XQ0hBUiogdXJsKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0Rvd25sb2FkRnJvbVVSTCkKLSAgICAgICAgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnN0clVSTCA9IENGWF9XaWRlU3RyaW5nKHVybCkuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB3c1VSTCA9IChGUERGX1dJREVTVFJJTkcpYnN0clVSTC5HZXRCdWZmZXIoYnN0clVSTC5HZXRMZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIEZQREZfTFBGSUxFSEFORExFUiBmaWxlSGFuZGxlciA9IG1fcEluZm8tPkZGSV9Eb3dubG9hZEZyb21VUkwobV9wSW5mbywgd3NVUkwpOwotCi0gICAgICAgICAgICBDRlBERl9GaWxlU3RyZWFtKiBmaWxlU3RyZWFtID0gRlhfTkVXIENGUERGX0ZpbGVTdHJlYW0oZmlsZUhhbmRsZXIpOwotICAgICAgICAgICAgcmV0dXJuIGZpbGVTdHJlYW07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgQ0ZYX1dpZGVTdHJpbmcgRkZJX1Bvc3RSZXF1ZXN0VVJMKGNvbnN0IEZYX1dDSEFSKiB3c1VSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHdzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHdzQ29udGVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0VuY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHdzSGVhZGVyKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1Bvc3RSZXF1ZXN0VVJMKQotICAgICAgICB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1VSTCA9IENGWF9XaWRlU3RyaW5nKHdzVVJMKS5VVEYxNkxFX0VuY29kZSgpOwotICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFVSTCA9IChGUERGX1dJREVTVFJJTkcpYnNVUkwuR2V0QnVmZmVyKGJzVVJMLkdldExlbmd0aCgpKTsKLQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEYXRhID0gQ0ZYX1dpZGVTdHJpbmcod3NEYXRhKS5VVEYxNkxFX0VuY29kZSgpOwotICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIGRhdGEgPSAoRlBERl9XSURFU1RSSU5HKWJzRGF0YS5HZXRCdWZmZXIoYnNEYXRhLkdldExlbmd0aCgpKTsKLQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDb250ZW50VHlwZSA9IENGWF9XaWRlU3RyaW5nKHdzQ29udGVudFR5cGUpLlVURjE2TEVfRW5jb2RlKCk7Ci0gICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgY29udGVudFR5cGUgPSAoRlBERl9XSURFU1RSSU5HKWJzQ29udGVudFR5cGUuR2V0QnVmZmVyKGJzQ29udGVudFR5cGUuR2V0TGVuZ3RoKCkpOwotCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0VuY29kZSA9IENGWF9XaWRlU3RyaW5nKHdzRW5jb2RlKS5VVEYxNkxFX0VuY29kZSgpOwotICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIGVuY29kZSA9IChGUERGX1dJREVTVFJJTkcpYnNFbmNvZGUuR2V0QnVmZmVyKGJzRW5jb2RlLkdldExlbmd0aCgpKTsKLQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNIZWFkZXIgPSBDRlhfV2lkZVN0cmluZyh3c0hlYWRlcikuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBoZWFkZXIgPSAoRlBERl9XSURFU1RSSU5HKWJzSGVhZGVyLkdldEJ1ZmZlcihic0hlYWRlci5HZXRMZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIEZQREZfQlNUUiByZXNwb25lOwotICAgICAgICAgICAgRlBERl9CU3RyX0luaXQoJnJlc3BvbmUpOwotICAgICAgICAgICAgbV9wSW5mby0+RkZJX1Bvc3RSZXF1ZXN0VVJMKG1fcEluZm8sIFVSTCwgZGF0YSwgY29udGVudFR5cGUsIGVuY29kZSwgaGVhZGVyLCAmcmVzcG9uZSk7Ci0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUmV0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKCh1bnNpZ25lZCBzaG9ydCopcmVzcG9uZS5zdHIsIHJlc3BvbmUubGVuL3NpemVvZih1bnNpZ25lZCBzaG9ydCkpOwotICAgICAgICAgICAgRlBERl9CU3RyX0NsZWFyKCZyZXNwb25lKTsKLQotICAgICAgICAgICAgcmV0dXJuIHdzUmV0OwotICAgICAgICB9CisgICAgICBtZW1zZXQocGJ1ZmYsIDAsIG5SZXF1aXJlZExlbik7CisgICAgICBpbnQgbkFjdHVhbExlbiA9IG1fcEluZm8tPkZGSV9HZXRQbGF0Zm9ybShtX3BJbmZvLCBwYnVmZiwgblJlcXVpcmVkTGVuKTsKKyAgICAgIGlmIChuQWN0dWFsTGVuIDw9IDAgfHwgbkFjdHVhbExlbiA+IG5SZXF1aXJlZExlbikgeworICAgICAgICBkZWxldGVbXSBwYnVmZjsKICAgICAgICAgcmV0dXJuIEwiIjsKKyAgICAgIH0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzUmV0ID0gQ0ZYX0J5dGVTdHJpbmcocGJ1ZmYsIG5BY3R1YWxMZW4pOworICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoCisgICAgICAgICAgKHVuc2lnbmVkIHNob3J0Kilic1JldC5HZXRCdWZmZXIoYnNSZXQuR2V0TGVuZ3RoKCkpLAorICAgICAgICAgIGJzUmV0LkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisgICAgICBkZWxldGVbXSBwYnVmZjsKKyAgICAgIHJldHVybiB3c1JldDsKICAgICB9CisgICAgcmV0dXJuIEwiIjsKKyAgfQogCi0gICAgRlBERl9CT09MIEZGSV9QdXRSZXF1ZXN0VVJMKGNvbnN0IEZYX1dDSEFSKiB3c1VSTCwgY29uc3QgRlhfV0NIQVIqIHdzRGF0YSwgY29uc3QgRlhfV0NIQVIqIHdzRW5jb2RlKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1B1dFJlcXVlc3RVUkwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVVJMID0gQ0ZYX1dpZGVTdHJpbmcod3NVUkwpLlVURjE2TEVfRW5jb2RlKCk7Ci0gICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgVVJMID0gKEZQREZfV0lERVNUUklORylic1VSTC5HZXRCdWZmZXIoYnNVUkwuR2V0TGVuZ3RoKCkpOwotCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0RhdGEgPSBDRlhfV2lkZVN0cmluZyh3c0RhdGEpLlVURjE2TEVfRW5jb2RlKCk7Ci0gICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgZGF0YSA9IChGUERGX1dJREVTVFJJTkcpYnNEYXRhLkdldEJ1ZmZlcihic0RhdGEuR2V0TGVuZ3RoKCkpOwotCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0VuY29kZSA9IENGWF9XaWRlU3RyaW5nKHdzRW5jb2RlKS5VVEYxNkxFX0VuY29kZSgpOwotICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIGVuY29kZSA9IChGUERGX1dJREVTVFJJTkcpYnNFbmNvZGUuR2V0QnVmZmVyKGJzRW5jb2RlLkdldExlbmd0aCgpKTsKLQotICAgICAgICAgICAgcmV0dXJuIG1fcEluZm8tPkZGSV9QdXRSZXF1ZXN0VVJMKG1fcEluZm8sIFVSTCwgZGF0YSwgZW5jb2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgIHZvaWQgRkZJX0dvdG9VUkwoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMLAorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFwcGVuZCkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9Hb3RvVVJMKSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBic1RvID0gQ0ZYX1dpZGVTdHJpbmcod3NVUkwpLlVURjE2TEVfRW5jb2RlKCk7CisgICAgICBGUERGX1dJREVTVFJJTkcgcFRvID0gKEZQREZfV0lERVNUUklORylic1RvLkdldEJ1ZmZlcih3c1VSTC5HZXRMZW5ndGgoKSk7CisgICAgICBtX3BJbmZvLT5GRklfR290b1VSTChtX3BJbmZvLCBkb2N1bWVudCwgcFRvKTsKKyAgICAgIGJzVG8uUmVsZWFzZUJ1ZmZlcigpOwogICAgIH0KKyAgfQogCi0gICAgRlBERl9CT09MIEZGSV9TaG93RmlsZURpYWxvZyhjb25zdCBGWF9XQ0hBUiogd3NUaXRsZSwgY29uc3QgRlhfV0NIQVIqIHdzRmlsdGVyLCBDRlhfV2lkZVN0cmluZ0FycmF5ICZ3c1BhdGhBcnIsIEZYX0JPT0wgYk9wZW4pCi0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgIHZvaWQgRkZJX0dldFVSTChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBDRlhfV2lkZVN0cmluZyYgd3NVUkwpIHsKKyAgICB3c1VSTCA9IENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKworICB2b2lkIEZGSV9BZGREb1JlY29yZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0KSB7fQorICB2b2lkIEZGSV9QYWdlRXZlbnQoRlBERl9QQUdFIHBhZ2UsIEZQREZfRFdPUkQgZmxhZykge30KKworICB2b2lkIEZGSV9HZXRQYWdlVmlld1JlY3QoRlBERl9QQUdFIHBhZ2UsIEZTX1JFQ1RGJiBkc3RSZWN0KSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldFBhZ2VWaWV3UmVjdCkgeworICAgICAgZG91YmxlIGxlZnQ7CisgICAgICBkb3VibGUgdG9wOworICAgICAgZG91YmxlIHJpZ2h0OworICAgICAgZG91YmxlIGJvdHRvbTsKKyAgICAgIG1fcEluZm8tPkZGSV9HZXRQYWdlVmlld1JlY3QobV9wSW5mbywgcGFnZSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSk7CisKKyAgICAgIGRzdFJlY3QubGVmdCA9IHN0YXRpY19jYXN0PGZsb2F0PihsZWZ0KTsKKyAgICAgIGRzdFJlY3QudG9wID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRvcCA8IGJvdHRvbSA/IGJvdHRvbSA6IHRvcCk7CisgICAgICBkc3RSZWN0LmJvdHRvbSA9IHN0YXRpY19jYXN0PGZsb2F0Pih0b3AgPCBib3R0b20gPyB0b3AgOiBib3R0b20pOworICAgICAgZHN0UmVjdC5yaWdodCA9IHN0YXRpY19jYXN0PGZsb2F0PihyaWdodCk7CiAgICAgfQorICB9CiAKLSAgICBDRlhfV2lkZVN0cmluZyBGRklfR2V0TGFuZ3VhZ2UoKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldExhbmd1YWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgblJlcXVpcmVkTGVuID0gbV9wSW5mby0+RkZJX0dldExhbmd1YWdlKG1fcEluZm8sIE5VTEwsIDApOwotICAgICAgICAgICAgaWYgKG5SZXF1aXJlZExlbiA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBMIiI7CisgIEZYX0JPT0wgRkZJX1BvcHVwTWVudShGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVudUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGIHB0UG9wdXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGKiBwUmVjdEV4Y2x1ZGUpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfUG9wdXBNZW51KQorICAgICAgcmV0dXJuIG1fcEluZm8tPkZGSV9Qb3B1cE1lbnUobV9wSW5mbywgcGFnZSwgaFdpZGdldCwgbWVudUZsYWcsIHB0UG9wdXAueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0UG9wdXAueSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLSAgICAgICAgICAgIGNoYXIqIHBidWZmID0gbmV3IGNoYXJbblJlcXVpcmVkTGVuXTsKLSAgICAgICAgICAgIGlmICghcGJ1ZmYpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEwiIjsKKyAgdm9pZCBGRklfQWxlcnQoRlBERl9XSURFU1RSSU5HIE1zZywKKyAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFRpdGxlLAorICAgICAgICAgICAgICAgICBpbnQgVHlwZSwKKyAgICAgICAgICAgICAgICAgaW50IEljb24pIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9hbGVydCkKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9hbGVydChtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBNc2csIFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUsIEljb24pOworICB9CiAKLSAgICAgICAgICAgIG1lbXNldChwYnVmZiwgMCwgblJlcXVpcmVkTGVuKTsKLSAgICAgICAgICAgIGludCBuQWN0dWFsTGVuID0gbV9wSW5mby0+RkZJX0dldExhbmd1YWdlKG1fcEluZm8sIHBidWZmLCBuUmVxdWlyZWRMZW4pOwotICAgICAgICAgICAgaWYgKG5BY3R1YWxMZW4gPD0gMCB8fCBuQWN0dWFsTGVuID4gblJlcXVpcmVkTGVuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIHBidWZmOwotICAgICAgICAgICAgICAgIHJldHVybiBMIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1JldCA9IENGWF9CeXRlU3RyaW5nKHBidWZmLCBuQWN0dWFsTGVuKTsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUmV0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKCh1bnNpZ25lZCBzaG9ydCopYnNSZXQuR2V0QnVmZmVyKGJzUmV0LkdldExlbmd0aCgpKSwgYnNSZXQuR2V0TGVuZ3RoKCkvc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7Ci0gICAgICAgICAgICBkZWxldGVbXSBwYnVmZjsKLSAgICAgICAgICAgIHJldHVybiB3c1JldDsKLSAgICAgICAgfQorICB2b2lkIEZGSV9FbWFpbFRvKEZQREZfRklMRUhBTkRMRVIqIGZpbGVIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBwVG8sCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHBTdWJqZWN0LAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBwQ0MsCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHBCY2MsCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHBNc2cpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfRW1haWxUbykKKyAgICAgIG1fcEluZm8tPkZGSV9FbWFpbFRvKG1fcEluZm8sIGZpbGVIYW5kbGVyLCBwVG8sIHBTdWJqZWN0LCBwQ0MsIHBCY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwTXNnKTsKKyAgfQorCisgIHZvaWQgRkZJX1VwbG9hZFRvKEZQREZfRklMRUhBTkRMRVIqIGZpbGVIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB1cGxvYWRUbykgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9VcGxvYWRUbykKKyAgICAgIG1fcEluZm8tPkZGSV9VcGxvYWRUbyhtX3BJbmZvLCBmaWxlSGFuZGxlciwgZmlsZUZsYWcsIHVwbG9hZFRvKTsKKyAgfQorCisgIEZQREZfRklMRUhBTkRMRVIqIEZGSV9PcGVuRmlsZShpbnQgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtb2RlKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX09wZW5GaWxlKQorICAgICAgcmV0dXJuIG1fcEluZm8tPkZGSV9PcGVuRmlsZShtX3BJbmZvLCBmaWxlVHlwZSwgd3NVUkwsIG1vZGUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgRkZJX0dldEZpbGVQYXRoKEZQREZfRklMRUhBTkRMRVIqIHBGaWxlSGFuZGxlcikgY29uc3QgeworICAgIHJldHVybiBMIiI7CisgIH0KKworICBpbnQgRkZJX0dldERvY3VtZW50Q291bnQoKSBjb25zdCB7IHJldHVybiAwOyB9CisgIGludCBGRklfR2V0Q3VyRG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgSUZYX0ZpbGVSZWFkKiBGRklfRG93bmxvYWRGcm9tVVJMKGNvbnN0IEZYX1dDSEFSKiB1cmwpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfRG93bmxvYWRGcm9tVVJMKSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBic3RyVVJMID0gQ0ZYX1dpZGVTdHJpbmcodXJsKS5VVEYxNkxFX0VuY29kZSgpOworICAgICAgRlBERl9XSURFU1RSSU5HIHdzVVJMID0KKyAgICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzdHJVUkwuR2V0QnVmZmVyKGJzdHJVUkwuR2V0TGVuZ3RoKCkpOworCisgICAgICBGUERGX0xQRklMRUhBTkRMRVIgZmlsZUhhbmRsZXIgPQorICAgICAgICAgIG1fcEluZm8tPkZGSV9Eb3dubG9hZEZyb21VUkwobV9wSW5mbywgd3NVUkwpOworCisgICAgICBDRlBERl9GaWxlU3RyZWFtKiBmaWxlU3RyZWFtID0gRlhfTkVXIENGUERGX0ZpbGVTdHJlYW0oZmlsZUhhbmRsZXIpOworICAgICAgcmV0dXJuIGZpbGVTdHJlYW07CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgRkZJX1Bvc3RSZXF1ZXN0VVJMKGNvbnN0IEZYX1dDSEFSKiB3c1VSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogd3NDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0VuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0hlYWRlcikgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9Qb3N0UmVxdWVzdFVSTCkgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVUkwgPSBDRlhfV2lkZVN0cmluZyh3c1VSTCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBVUkwgPSAoRlBERl9XSURFU1RSSU5HKWJzVVJMLkdldEJ1ZmZlcihic1VSTC5HZXRMZW5ndGgoKSk7CisKKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzRGF0YSA9IENGWF9XaWRlU3RyaW5nKHdzRGF0YSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBkYXRhID0KKyAgICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzRGF0YS5HZXRCdWZmZXIoYnNEYXRhLkdldExlbmd0aCgpKTsKKworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDb250ZW50VHlwZSA9CisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcod3NDb250ZW50VHlwZSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBjb250ZW50VHlwZSA9CisgICAgICAgICAgKEZQREZfV0lERVNUUklORylic0NvbnRlbnRUeXBlLkdldEJ1ZmZlcihic0NvbnRlbnRUeXBlLkdldExlbmd0aCgpKTsKKworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGUgPSBDRlhfV2lkZVN0cmluZyh3c0VuY29kZSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBlbmNvZGUgPQorICAgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnNFbmNvZGUuR2V0QnVmZmVyKGJzRW5jb2RlLkdldExlbmd0aCgpKTsKKworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNIZWFkZXIgPSBDRlhfV2lkZVN0cmluZyh3c0hlYWRlcikuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBoZWFkZXIgPQorICAgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnNIZWFkZXIuR2V0QnVmZmVyKGJzSGVhZGVyLkdldExlbmd0aCgpKTsKKworICAgICAgRlBERl9CU1RSIHJlc3BvbmU7CisgICAgICBGUERGX0JTdHJfSW5pdCgmcmVzcG9uZSk7CisgICAgICBtX3BJbmZvLT5GRklfUG9zdFJlcXVlc3RVUkwobV9wSW5mbywgVVJMLCBkYXRhLCBjb250ZW50VHlwZSwgZW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwgJnJlc3BvbmUpOworCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1JldCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSgKKyAgICAgICAgICAodW5zaWduZWQgc2hvcnQqKXJlc3BvbmUuc3RyLCByZXNwb25lLmxlbiAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICAgICAgRlBERl9CU3RyX0NsZWFyKCZyZXNwb25lKTsKKworICAgICAgcmV0dXJuIHdzUmV0OworICAgIH0KKyAgICByZXR1cm4gTCIiOworICB9CisKKyAgRlBERl9CT09MIEZGSV9QdXRSZXF1ZXN0VVJMKGNvbnN0IEZYX1dDSEFSKiB3c1VSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogd3NFbmNvZGUpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfUHV0UmVxdWVzdFVSTCkgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVUkwgPSBDRlhfV2lkZVN0cmluZyh3c1VSTCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBVUkwgPSAoRlBERl9XSURFU1RSSU5HKWJzVVJMLkdldEJ1ZmZlcihic1VSTC5HZXRMZW5ndGgoKSk7CisKKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzRGF0YSA9IENGWF9XaWRlU3RyaW5nKHdzRGF0YSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBkYXRhID0KKyAgICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzRGF0YS5HZXRCdWZmZXIoYnNEYXRhLkdldExlbmd0aCgpKTsKKworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGUgPSBDRlhfV2lkZVN0cmluZyh3c0VuY29kZSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBlbmNvZGUgPQorICAgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnNFbmNvZGUuR2V0QnVmZmVyKGJzRW5jb2RlLkdldExlbmd0aCgpKTsKKworICAgICAgcmV0dXJuIG1fcEluZm8tPkZGSV9QdXRSZXF1ZXN0VVJMKG1fcEluZm8sIFVSTCwgZGF0YSwgZW5jb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgRlBERl9CT09MIEZGSV9TaG93RmlsZURpYWxvZyhjb25zdCBGWF9XQ0hBUiogd3NUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogd3NGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgd3NQYXRoQXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk9wZW4pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBDRlhfV2lkZVN0cmluZyBGRklfR2V0TGFuZ3VhZ2UoKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldExhbmd1YWdlKSB7CisgICAgICBpbnQgblJlcXVpcmVkTGVuID0gbV9wSW5mby0+RkZJX0dldExhbmd1YWdlKG1fcEluZm8sIE5VTEwsIDApOworICAgICAgaWYgKG5SZXF1aXJlZExlbiA8PSAwKQogICAgICAgICByZXR1cm4gTCIiOworCisgICAgICBjaGFyKiBwYnVmZiA9IG5ldyBjaGFyW25SZXF1aXJlZExlbl07CisgICAgICBpZiAoIXBidWZmKQorICAgICAgICByZXR1cm4gTCIiOworCisgICAgICBtZW1zZXQocGJ1ZmYsIDAsIG5SZXF1aXJlZExlbik7CisgICAgICBpbnQgbkFjdHVhbExlbiA9IG1fcEluZm8tPkZGSV9HZXRMYW5ndWFnZShtX3BJbmZvLCBwYnVmZiwgblJlcXVpcmVkTGVuKTsKKyAgICAgIGlmIChuQWN0dWFsTGVuIDw9IDAgfHwgbkFjdHVhbExlbiA+IG5SZXF1aXJlZExlbikgeworICAgICAgICBkZWxldGVbXSBwYnVmZjsKKyAgICAgICAgcmV0dXJuIEwiIjsKKyAgICAgIH0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzUmV0ID0gQ0ZYX0J5dGVTdHJpbmcocGJ1ZmYsIG5BY3R1YWxMZW4pOworICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoCisgICAgICAgICAgKHVuc2lnbmVkIHNob3J0Kilic1JldC5HZXRCdWZmZXIoYnNSZXQuR2V0TGVuZ3RoKCkpLAorICAgICAgICAgIGJzUmV0LkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisgICAgICBkZWxldGVbXSBwYnVmZjsKKyAgICAgIHJldHVybiB3c1JldDsKICAgICB9CisgICAgcmV0dXJuIEwiIjsKKyAgfQogCi0gICAgRlhfQk9PTCBJc0pTSW5pdGlhdGVkKCkgY29uc3QgeyByZXR1cm4gbV9wSW5mbyAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtOyB9Ci0gICAgdm9pZCBTZXRTREtEb2N1bWVudChDUERGU0RLX0RvY3VtZW50KiBwRlhEb2MpIHsgbV9wU0RLRG9jID0gcEZYRG9jOyB9Ci0gICAgQ1BERlNES19Eb2N1bWVudCogR2V0U0RLRG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BTREtEb2M7IH0KLSAgICBDUERGWEZBX0RvY3VtZW50KiBHZXRQREZYRkFEb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcFhGQURvYzsgfQotICAgIENGWF9CeXRlU3RyaW5nIEdldEFwcE5hbWUoKSBjb25zdCB7IHJldHVybiAiIjsgfQotICAgIElGWF9TeXN0ZW1IYW5kbGVyKiBHZXRTeXNIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gbV9wU3lzSGFuZGxlcjsgfQotICAgIEZQREZfRk9STUZJTExJTkZPKiBHZXRGb3JtRmlsbEluZm8oKSBjb25zdCB7IHJldHVybiBtX3BJbmZvOyB9CisgIEZYX0JPT0wgSXNKU0luaXRpYXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybTsgfQorICB2b2lkIFNldFNES0RvY3VtZW50KENQREZTREtfRG9jdW1lbnQqIHBGWERvYykgeyBtX3BTREtEb2MgPSBwRlhEb2M7IH0KKyAgQ1BERlNES19Eb2N1bWVudCogR2V0U0RLRG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BTREtEb2M7IH0KKyAgQ1BERlhGQV9Eb2N1bWVudCogR2V0UERGWEZBRG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BYRkFEb2M7IH0KKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0QXBwTmFtZSgpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIElGWF9TeXN0ZW1IYW5kbGVyKiBHZXRTeXNIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gbV9wU3lzSGFuZGxlcjsgfQorICBGUERGX0ZPUk1GSUxMSU5GTyogR2V0Rm9ybUZpbGxJbmZvKCkgY29uc3QgeyByZXR1cm4gbV9wSW5mbzsgfQogCi0gICAgQ0ZGTF9JRm9ybUZpbGxlciogR2V0SUZvcm1GaWxsZXIoKTsgICAgICAgICAgICAgLy8gQ3JlYXRlcyBpZiBub3QgcHJlc2VudC4KLSAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogR2V0QW5ub3RIYW5kbGVyTWdyKCk7ICAvLyBDcmVhdGVzIGlmIG5vdCBwcmVzZW50LgotICAgIElGWEpTX1J1bnRpbWUqICBHZXRKU1J1bnRpbWUoKTsgICAgICAgICAgICAgICAgIC8vIENyZWF0ZXMgaWYgbm90IHByZXNlbnQuCi0gICAgQ1BERlNES19BY3Rpb25IYW5kbGVyKiBHZXRBY3Rpb25IYW5kZXIoKTsgICAgICAgLy8gQ3JlYXRlcyBpZiBub3QgcHJlc2VudC4KKyAgQ0ZGTF9JRm9ybUZpbGxlciogR2V0SUZvcm1GaWxsZXIoKTsgICAgICAgICAgICAgLy8gQ3JlYXRlcyBpZiBub3QgcHJlc2VudC4KKyAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIEdldEFubm90SGFuZGxlck1ncigpOyAgLy8gQ3JlYXRlcyBpZiBub3QgcHJlc2VudC4KKyAgSUZYSlNfUnVudGltZSogR2V0SlNSdW50aW1lKCk7ICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlcyBpZiBub3QgcHJlc2VudC4KKyAgQ1BERlNES19BY3Rpb25IYW5kbGVyKiBHZXRBY3Rpb25IYW5kZXIoKTsgICAgICAgLy8gQ3JlYXRlcyBpZiBub3QgcHJlc2VudC4KIAotcHJpdmF0ZToKLSAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogbV9wQW5ub3RIYW5kbGVyTWdyOwotICAgIENQREZTREtfQWN0aW9uSGFuZGxlciogbV9wQWN0aW9uSGFuZGxlcjsKLSAgICBJRlhKU19SdW50aW1lKiBtX3BKU1J1bnRpbWU7Ci0gICAgRlBERl9GT1JNRklMTElORk8qIGNvbnN0IG1fcEluZm87Ci0gICAgQ1BERlNES19Eb2N1bWVudCogbV9wU0RLRG9jOwotICAgIENQREZYRkFfRG9jdW1lbnQqIGNvbnN0IG1fcFhGQURvYzsKLSAgICBDRkZMX0lGb3JtRmlsbGVyKiBtX3BJRm9ybUZpbGxlcjsKLSAgICBJRlhfU3lzdGVtSGFuZGxlciogbV9wU3lzSGFuZGxlcjsKKyBwcml2YXRlOgorICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogbV9wQW5ub3RIYW5kbGVyTWdyOworICBDUERGU0RLX0FjdGlvbkhhbmRsZXIqIG1fcEFjdGlvbkhhbmRsZXI7CisgIElGWEpTX1J1bnRpbWUqIG1fcEpTUnVudGltZTsKKyAgRlBERl9GT1JNRklMTElORk8qIGNvbnN0IG1fcEluZm87CisgIENQREZTREtfRG9jdW1lbnQqIG1fcFNES0RvYzsKKyAgQ1BERlhGQV9Eb2N1bWVudCogY29uc3QgbV9wWEZBRG9jOworICBDRkZMX0lGb3JtRmlsbGVyKiBtX3BJRm9ybUZpbGxlcjsKKyAgSUZYX1N5c3RlbUhhbmRsZXIqIG1fcFN5c0hhbmRsZXI7CiB9OwogCi1jbGFzcyBDUERGU0RLX0RvY3VtZW50Ci17Ci1wdWJsaWM6Ci0gICAgQ1BERlNES19Eb2N1bWVudChDUERGWEZBX0RvY3VtZW50KiBwRG9jLCBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KTsKLSAgICB+Q1BERlNES19Eb2N1bWVudCgpOworY2xhc3MgQ1BERlNES19Eb2N1bWVudCB7CisgcHVibGljOgorICBDUERGU0RLX0RvY3VtZW50KENQREZYRkFfRG9jdW1lbnQqIHBEb2MsIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpOworICB+Q1BERlNES19Eb2N1bWVudCgpOwogCi0gICAgQ1BERlNES19JbnRlckZvcm0qICAgICAgR2V0SW50ZXJGb3JtKCkgOwotICAgIENQREZYRkFfRG9jdW1lbnQqICAgICAgIEdldERvY3VtZW50KCkge3JldHVybiBtX3BEb2M7fQorICBDUERGU0RLX0ludGVyRm9ybSogR2V0SW50ZXJGb3JtKCk7CisgIENQREZYRkFfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgeyByZXR1cm4gbV9wRG9jOyB9CiAKLSAgICAgICAgaW50IEdldFBhZ2VWaWV3Q291bnQoKSBjb25zdCB7IHJldHVybiBtX3BhZ2VNYXAuc2l6ZSgpOyB9Ci0gICAgQ1BERlNES19QYWdlVmlldyogICAgICAgR2V0UGFnZVZpZXcoQ1BERlhGQV9QYWdlKiBwUERGWEZBUGFnZSwgRlhfQk9PTCBSZU5ldyA9IFRSVUUpOwotICAgIENQREZTREtfUGFnZVZpZXcqICAgICAgIEdldFBhZ2VWaWV3KGludCBuSW5kZXgpOwotICAgIENQREZTREtfUGFnZVZpZXcqICAgICAgIEdldEN1cnJlbnRWaWV3KCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgUmVNb3ZlUGFnZVZpZXcoQ1BERlhGQV9QYWdlKiBwUERGUGFnZSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgVXBkYXRlQWxsVmlld3MoQ1BERlNES19QYWdlVmlldyogcFNlbmRlciwgQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgaW50IEdldFBhZ2VWaWV3Q291bnQoKSBjb25zdCB7IHJldHVybiBtX3BhZ2VNYXAuc2l6ZSgpOyB9CisgIENQREZTREtfUGFnZVZpZXcqIEdldFBhZ2VWaWV3KENQREZYRkFfUGFnZSogcFBERlhGQVBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgUmVOZXcgPSBUUlVFKTsKKyAgQ1BERlNES19QYWdlVmlldyogR2V0UGFnZVZpZXcoaW50IG5JbmRleCk7CisgIENQREZTREtfUGFnZVZpZXcqIEdldEN1cnJlbnRWaWV3KCk7CisgIHZvaWQgUmVNb3ZlUGFnZVZpZXcoQ1BERlhGQV9QYWdlKiBwUERGUGFnZSk7CisgIHZvaWQgVXBkYXRlQWxsVmlld3MoQ1BERlNES19QYWdlVmlldyogcFNlbmRlciwgQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotICAgIENQREZTREtfQW5ub3QqICAgICAgICAgIEdldEZvY3VzQW5ub3QoKTsKKyAgQ1BERlNES19Bbm5vdCogR2V0Rm9jdXNBbm5vdCgpOwogCi0gICAgSUZYSlNfUnVudGltZSAqICAgICAgICAgR2V0SnNSdW50aW1lKCk7CisgIElGWEpTX1J1bnRpbWUqIEdldEpzUnVudGltZSgpOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgU2V0Rm9jdXNBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcgPSAwKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBLaWxsRm9jdXNBbm5vdChGWF9VSU5UIG5GbGFnID0gMCk7CisgIEZYX0JPT0wgU2V0Rm9jdXNBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcgPSAwKTsKKyAgRlhfQk9PTCBLaWxsRm9jdXNBbm5vdChGWF9VSU5UIG5GbGFnID0gMCk7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBFeHRyYWN0UGFnZXMoY29uc3QgQ0ZYX1dvcmRBcnJheSAmYXJyRXh0cmFQYWdlcywgQ1BERl9Eb2N1bWVudCogcERzdERvYyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSW5zZXJ0UGFnZXMoaW50IG5JbnNlcnRBdCwgY29uc3QgQ1BERl9Eb2N1bWVudCogcFNyY0RvYywgY29uc3QgQ0ZYX1dvcmRBcnJheSAmYXJyU3JjUGFnZXMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIERlbGV0ZVBhZ2VzKGludCBuU3RhcnQsIGludCBuQ291bnQpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIFJlcGxhY2VQYWdlcyhpbnQgblBhZ2UsIGNvbnN0IENQREZfRG9jdW1lbnQqIHBTcmNEb2MsIGNvbnN0IENGWF9Xb3JkQXJyYXkgJmFyclNyY1BhZ2VzKTsKKyAgRlhfQk9PTCBFeHRyYWN0UGFnZXMoY29uc3QgQ0ZYX1dvcmRBcnJheSYgYXJyRXh0cmFQYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERzdERvYyk7CisgIEZYX0JPT0wgSW5zZXJ0UGFnZXMoaW50IG5JbnNlcnRBdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RvY3VtZW50KiBwU3JjRG9jLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Xb3JkQXJyYXkmIGFyclNyY1BhZ2VzKTsKKyAgRlhfQk9PTCBEZWxldGVQYWdlcyhpbnQgblN0YXJ0LCBpbnQgbkNvdW50KTsKKyAgRlhfQk9PTCBSZXBsYWNlUGFnZXMoaW50IG5QYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RvY3VtZW50KiBwU3JjRG9jLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV29yZEFycmF5JiBhcnJTcmNQYWdlcyk7CiAKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBPbkNsb3NlRG9jdW1lbnQoKTsKKyAgdm9pZCBPbkNsb3NlRG9jdW1lbnQoKTsKIAotICAgIGludCAgICAgICAgICAgICAgICAgICAgIEdldFBhZ2VDb3VudCgpIHtyZXR1cm4gbV9wRG9jLT5HZXRQYWdlQ291bnQoKTt9Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgR2V0UGVybWlzc2lvbnMoaW50IG5GbGFnKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBHZXRDaGFuZ2VNYXJrKCkge3JldHVybiBtX2JDaGFuZ2VNYXNrO30KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBTZXRDaGFuZ2VNYXJrKCkge21fYkNoYW5nZU1hc2sgPSBUUlVFO30KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBDbGVhckNoYW5nZU1hcmsoKSB7bV9iQ2hhbmdlTWFzaz0gRkFMU0U7fQotICAgIENGWF9XaWRlU3RyaW5nICAgICAgICAgIEdldFBhdGgoKSA7Ci0gICAgQ1BERlhGQV9QYWdlKiAgICAgICAgICAgR2V0UGFnZShpbnQgbkluZGV4KTsKLSAgICBDUERGRG9jX0Vudmlyb25tZW50ICogICBHZXRFbnYoKSB7cmV0dXJuIG1fcEVudjsgfQotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIFByb2NKYXZhc2NyaXB0RnVuKCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgUHJvY09wZW5BY3Rpb24oKTsKLSAgICBDUERGX09DQ29udGV4dCogICAgICAgICBHZXRPQ0NvbnRleHQoKTsKLXByaXZhdGU6Ci0gICAgc3RkOjptYXA8Q1BERlhGQV9QYWdlKiwgQ1BERlNES19QYWdlVmlldyo+IG1fcGFnZU1hcDsKLSAgICBDUERGWEZBX0RvY3VtZW50KiBtX3BEb2M7Ci0gICAgQ1BERlNES19JbnRlckZvcm0qIG1fcEludGVyRm9ybTsKLSAgICBDUERGU0RLX0Fubm90KiBtX3BGb2N1c0Fubm90OwotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEVudjsKLSAgICBDUERGX09DQ29udGV4dCogbV9wT2Njb250ZW50OwotICAgIEZYX0JPT0wgbV9iQ2hhbmdlTWFzazsKKyAgaW50IEdldFBhZ2VDb3VudCgpIHsgcmV0dXJuIG1fcERvYy0+R2V0UGFnZUNvdW50KCk7IH0KKyAgRlhfQk9PTCBHZXRQZXJtaXNzaW9ucyhpbnQgbkZsYWcpOworICBGWF9CT09MIEdldENoYW5nZU1hcmsoKSB7IHJldHVybiBtX2JDaGFuZ2VNYXNrOyB9CisgIHZvaWQgU2V0Q2hhbmdlTWFyaygpIHsgbV9iQ2hhbmdlTWFzayA9IFRSVUU7IH0KKyAgdm9pZCBDbGVhckNoYW5nZU1hcmsoKSB7IG1fYkNoYW5nZU1hc2sgPSBGQUxTRTsgfQorICBDRlhfV2lkZVN0cmluZyBHZXRQYXRoKCk7CisgIENQREZYRkFfUGFnZSogR2V0UGFnZShpbnQgbkluZGV4KTsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogR2V0RW52KCkgeyByZXR1cm4gbV9wRW52OyB9CisgIHZvaWQgUHJvY0phdmFzY3JpcHRGdW4oKTsKKyAgRlhfQk9PTCBQcm9jT3BlbkFjdGlvbigpOworICBDUERGX09DQ29udGV4dCogR2V0T0NDb250ZXh0KCk7CisKKyBwcml2YXRlOgorICBzdGQ6Om1hcDxDUERGWEZBX1BhZ2UqLCBDUERGU0RLX1BhZ2VWaWV3Kj4gbV9wYWdlTWFwOworICBDUERGWEZBX0RvY3VtZW50KiBtX3BEb2M7CisgIENQREZTREtfSW50ZXJGb3JtKiBtX3BJbnRlckZvcm07CisgIENQREZTREtfQW5ub3QqIG1fcEZvY3VzQW5ub3Q7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEVudjsKKyAgQ1BERl9PQ0NvbnRleHQqIG1fcE9jY29udGVudDsKKyAgRlhfQk9PTCBtX2JDaGFuZ2VNYXNrOwogfTsKLWNsYXNzIENQREZTREtfUGFnZVZpZXcgZmluYWwKLXsKLXB1YmxpYzoKLSAgICBDUERGU0RLX1BhZ2VWaWV3KENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MsQ1BERlhGQV9QYWdlKiBwYWdlKTsKLSAgICB+Q1BERlNES19QYWdlVmlldygpOwotICAgIHZvaWQgUGFnZVZpZXdfT25EcmF3KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgRlhfUkVDVCogcENsaXAgPSBOVUxMKSA7Ci0gICAgQ1BERl9Bbm5vdCogICAgICAgICAgICAgICAgICAgICBHZXRQREZBbm5vdEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKTsKLSAgICBDUERGU0RLX0Fubm90KiAgICAgICAgICAgICAgICAgIEdldEZYQW5ub3RBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7Ci0gICAgQ1BERl9Bbm5vdCogICAgICAgICAgICAgICAgICAgICBHZXRQREZXaWRnZXRBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7Ci0gICAgQ1BERlNES19Bbm5vdCogICAgICAgICAgICAgICAgICBHZXRGWFdpZGdldEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKTsKLSAgICBDUERGU0RLX0Fubm90KiAgICAgICAgICAgICAgICAgIEdldEZvY3VzQW5ub3QoKSA7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRGb2N1c0Fubm90KENQREZTREtfQW5ub3QqIHBTREtBbm5vdCxGWF9VSU5UIG5GbGFnID0gMCkge21fcFNES0RvYy0+U2V0Rm9jdXNBbm5vdChwU0RLQW5ub3QsIG5GbGFnKTt9Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICBLaWxsRm9jdXNBbm5vdChGWF9VSU5UIG5GbGFnID0gMCkge3JldHVybiBtX3BTREtEb2MtPktpbGxGb2N1c0Fubm90KG5GbGFnKTt9Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdF9IYXNBcHBlYXJhbmNlKENQREZfQW5ub3QqIHBBbm5vdCk7CitjbGFzcyBDUERGU0RLX1BhZ2VWaWV3IGZpbmFsIHsKKyBwdWJsaWM6CisgIENQREZTREtfUGFnZVZpZXcoQ1BERlNES19Eb2N1bWVudCogcFNES0RvYywgQ1BERlhGQV9QYWdlKiBwYWdlKTsKKyAgfkNQREZTREtfUGFnZVZpZXcoKTsKKyAgdm9pZCBQYWdlVmlld19PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCogcENsaXAgPSBOVUxMKTsKKyAgQ1BERl9Bbm5vdCogR2V0UERGQW5ub3RBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7CisgIENQREZTREtfQW5ub3QqIEdldEZYQW5ub3RBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7CisgIENQREZfQW5ub3QqIEdldFBERldpZGdldEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKTsKKyAgQ1BERlNES19Bbm5vdCogR2V0RlhXaWRnZXRBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7CisgIENQREZTREtfQW5ub3QqIEdldEZvY3VzQW5ub3QoKTsKKyAgdm9pZCBTZXRGb2N1c0Fubm90KENQREZTREtfQW5ub3QqIHBTREtBbm5vdCwgRlhfVUlOVCBuRmxhZyA9IDApIHsKKyAgICBtX3BTREtEb2MtPlNldEZvY3VzQW5ub3QocFNES0Fubm90LCBuRmxhZyk7CisgIH0KKyAgRlhfQk9PTCBLaWxsRm9jdXNBbm5vdChGWF9VSU5UIG5GbGFnID0gMCkgeworICAgIHJldHVybiBtX3BTREtEb2MtPktpbGxGb2N1c0Fubm90KG5GbGFnKTsKKyAgfQorICBGWF9CT09MIEFubm90X0hhc0FwcGVhcmFuY2UoQ1BERl9Bbm5vdCogcEFubm90KTsKIAotICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgQWRkQW5ub3QoQ1BERl9EaWN0aW9uYXJ5ICogcERpY3QpOwotICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgQWRkQW5ub3QoY29uc3QgRlhfQ0hBUiogbHBTdWJUeXBlLENQREZfRGljdGlvbmFyeSAqIHBEaWN0KTsKLSAgICBDUERGU0RLX0Fubm90KiAgICAgICAgICAgICAgICAgIEFkZEFubm90KENQREZfQW5ub3QgKiBwUERGQW5ub3QpOwotICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgQWRkQW5ub3QoSVhGQV9XaWRnZXQqIHBQREZBbm5vdCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICBDUERGU0RLX0Fubm90KiBBZGRBbm5vdChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgQ1BERlNES19Bbm5vdCogQWRkQW5ub3QoY29uc3QgRlhfQ0hBUiogbHBTdWJUeXBlLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgQ1BERlNES19Bbm5vdCogQWRkQW5ub3QoQ1BERl9Bbm5vdCogcFBERkFubm90KTsKKyAgQ1BERlNES19Bbm5vdCogQWRkQW5ub3QoSVhGQV9XaWRnZXQqIHBQREZBbm5vdCk7CisgIEZYX0JPT0wgRGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRBbm5vdHMoKTsKLSAgICBDUERGU0RLX0Fubm90KiAgICAgICAgICAgICAgICAgIEdldEFubm90KGludCBuSW5kZXgpOwotICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgR2V0QW5ub3RCeURpY3QoQ1BERl9EaWN0aW9uYXJ5ICogcERpY3QpOwotICAgIENQREZTREtfQW5ub3QqICAgICAgICAgICAgICAgICAgR2V0QW5ub3RCeVhGQVdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCk7Ci0gICAgQ1BERlhGQV9QYWdlKiAgICAgICAgICAgICAgICAgICBHZXRQREZYRkFQYWdlKCl7cmV0dXJuIG1fcGFnZTt9Ci0gICAgQ1BERl9QYWdlKiAgICAgICAgICAgICAgICAgICAgICBHZXRQREZQYWdlKCk7Ci0gICAgQ1BERl9Eb2N1bWVudCogICAgICAgICAgICAgICAgICBHZXRQREZEb2N1bWVudCgpOwotICAgIENQREZTREtfRG9jdW1lbnQqICAgICAgICAgICAgICAgR2V0U0RLRG9jdW1lbnQoKSB7cmV0dXJuIG1fcFNES0RvYzt9Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIE9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25SQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIE9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25DaGFyKGludCBuQ2hhciwgRlhfVUlOVCBuRmxhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25LZXlEb3duKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBPbktleVVwKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKyAgaW50IENvdW50QW5ub3RzKCk7CisgIENQREZTREtfQW5ub3QqIEdldEFubm90KGludCBuSW5kZXgpOworICBDUERGU0RLX0Fubm90KiBHZXRBbm5vdEJ5RGljdChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgQ1BERlNES19Bbm5vdCogR2V0QW5ub3RCeVhGQVdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCk7CisgIENQREZYRkFfUGFnZSogR2V0UERGWEZBUGFnZSgpIHsgcmV0dXJuIG1fcGFnZTsgfQorICBDUERGX1BhZ2UqIEdldFBERlBhZ2UoKTsKKyAgQ1BERl9Eb2N1bWVudCogR2V0UERGRG9jdW1lbnQoKTsKKyAgQ1BERlNES19Eb2N1bWVudCogR2V0U0RLRG9jdW1lbnQoKSB7IHJldHVybiBtX3BTREtEb2M7IH0KKyAgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9VSU5UIG5GbGFnKTsKKyAgRlhfQk9PTCBPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfVUlOVCBuRmxhZyk7CisgIEZYX0JPT0wgT25SQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfVUlOVCBuRmxhZyk7CisgIEZYX0JPT0wgT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpOworICBGWF9CT09MIE9uQ2hhcihpbnQgbkNoYXIsIEZYX1VJTlQgbkZsYWcpOworICBGWF9CT09MIE9uS2V5RG93bihpbnQgbktleUNvZGUsIGludCBuRmxhZyk7CisgIEZYX0JPT0wgT25LZXlVcChpbnQgbktleUNvZGUsIGludCBuRmxhZyk7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIGludCBuRmxhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgT25Nb3VzZVdoZWVsKGRvdWJsZSBkZWx0YVgsIGRvdWJsZSBkZWx0YVksY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludCBuRmxhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNWYWxpZEFubm90KHZvaWQqIHApOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRNYXRyaXgoQ1BERl9NYXRyaXgmIG1hdHJpeCkge21hdHJpeCA9IG1fY3VyTWF0cml4O30KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBVcGRhdGVSZWN0cyhDRlhfUmVjdEFycmF5JiByZWN0cyk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVWaWV3KENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0gICAgQ0ZYX1B0ckFycmF5KiAgICAgICAgICAgICAgICAgICBHZXRBbm5vdExpc3QoKXsgcmV0dXJuICZtX2Z4QW5ub3RBcnJheTsgfQorICBGWF9CT09MIE9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBpbnQgbkZsYWcpOworICBGWF9CT09MIE9uTW91c2VXaGVlbChkb3VibGUgZGVsdGFYLAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVsdGFZLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GbGFnKTsKKyAgRlhfQk9PTCBJc1ZhbGlkQW5ub3Qodm9pZCogcCk7CisgIHZvaWQgR2V0Q3VycmVudE1hdHJpeChDUERGX01hdHJpeCYgbWF0cml4KSB7IG1hdHJpeCA9IG1fY3VyTWF0cml4OyB9CisgIHZvaWQgVXBkYXRlUmVjdHMoQ0ZYX1JlY3RBcnJheSYgcmVjdHMpOworICB2b2lkIFVwZGF0ZVZpZXcoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgQ0ZYX1B0ckFycmF5KiBHZXRBbm5vdExpc3QoKSB7IHJldHVybiAmbV9meEFubm90QXJyYXk7IH0KIAotICAgIGludCAgICAgICAgICAgICAgICAgICAgIEdldFBhZ2VJbmRleCgpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZEZYQW5ub3RzKCk7Ci0gICAgdm9pZCBTZXRWYWxpZChGWF9CT09MIGJWYWxpZCkge21fYlZhbGlkID0gYlZhbGlkO30KLSAgICBGWF9CT09MIElzVmFsaWQoKSB7cmV0dXJuIG1fYlZhbGlkO30KLSAgICB2b2lkIFNldExvY2soRlhfQk9PTCBiTG9ja2VkKSB7bV9iTG9ja2VkPSBiTG9ja2VkO30KLSAgICBGWF9CT09MIElzTG9ja2VkKCkge3JldHVybiBtX2JMb2NrZWQ7fQotcHJpdmF0ZToKLSAgICB2b2lkIFBhZ2VWaWV3X09uSGlnaGxpZ2h0Rm9ybUZpZWxkcyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7Ci0gICAgQ1BERl9NYXRyaXggbV9jdXJNYXRyaXg7Ci0gICAgQ1BERlhGQV9QYWdlKiBtX3BhZ2U7Ci0gICAgQ1BERl9Bbm5vdExpc3QqIG1fcEFubm90TGlzdDsKLSAgICAvL0NQREZTREtfQW5ub3QqIG1fcEZvY3VzQW5ub3Q7Ci0gICAgQ0ZYX1B0ckFycmF5ICBtX2Z4QW5ub3RBcnJheTsKLSAgICBDUERGU0RLX0RvY3VtZW50KiBtX3BTREtEb2M7Ci0gICAgQ1BERlNES19Bbm5vdCogbV9DYXB0dXJlV2lkZ2V0OwotICAgIEZYX0JPT0wgbV9iRW50ZXJXaWRnZXQ7Ci0gICAgRlhfQk9PTCBtX2JFeGl0V2lkZ2V0OwotICAgIEZYX0JPT0wgbV9iT25XaWRnZXQ7Ci0gICAgRlhfQk9PTCBtX2JWYWxpZDsKLSAgICBGWF9CT09MIG1fYkxvY2tlZDsKKyAgaW50IEdldFBhZ2VJbmRleCgpOworICB2b2lkIExvYWRGWEFubm90cygpOworICB2b2lkIFNldFZhbGlkKEZYX0JPT0wgYlZhbGlkKSB7IG1fYlZhbGlkID0gYlZhbGlkOyB9CisgIEZYX0JPT0wgSXNWYWxpZCgpIHsgcmV0dXJuIG1fYlZhbGlkOyB9CisgIHZvaWQgU2V0TG9jayhGWF9CT09MIGJMb2NrZWQpIHsgbV9iTG9ja2VkID0gYkxvY2tlZDsgfQorICBGWF9CT09MIElzTG9ja2VkKCkgeyByZXR1cm4gbV9iTG9ja2VkOyB9CisKKyBwcml2YXRlOgorICB2b2lkIFBhZ2VWaWV3X09uSGlnaGxpZ2h0Rm9ybUZpZWxkcyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CisgIENQREZfTWF0cml4IG1fY3VyTWF0cml4OworICBDUERGWEZBX1BhZ2UqIG1fcGFnZTsKKyAgQ1BERl9Bbm5vdExpc3QqIG1fcEFubm90TGlzdDsKKyAgLy8gQ1BERlNES19Bbm5vdCogbV9wRm9jdXNBbm5vdDsKKyAgQ0ZYX1B0ckFycmF5IG1fZnhBbm5vdEFycmF5OworICBDUERGU0RLX0RvY3VtZW50KiBtX3BTREtEb2M7CisgIENQREZTREtfQW5ub3QqIG1fQ2FwdHVyZVdpZGdldDsKKyAgRlhfQk9PTCBtX2JFbnRlcldpZGdldDsKKyAgRlhfQk9PTCBtX2JFeGl0V2lkZ2V0OworICBGWF9CT09MIG1fYk9uV2lkZ2V0OworICBGWF9CT09MIG1fYlZhbGlkOworICBGWF9CT09MIG1fYkxvY2tlZDsKIH07CiAKK3RlbXBsYXRlIDxjbGFzcyBUWVBFPgorY2xhc3MgQ0dXX0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT4geworIHB1YmxpYzoKKyAgQ0dXX0FycmF5VGVtcGxhdGUoKSB7fQorICB2aXJ0dWFsIH5DR1dfQXJyYXlUZW1wbGF0ZSgpIHt9CiAKLXRlbXBsYXRlPGNsYXNzIFRZUEU+Ci1jbGFzcyBDR1dfQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPgotewotcHVibGljOgotICAgIENHV19BcnJheVRlbXBsYXRlKCl7fQotICAgIHZpcnR1YWwgfkNHV19BcnJheVRlbXBsYXRlKCl7fQorICB0eXBlZGVmIGludCAoKkxQX0NPTVBBUkUpKFRZUEUgcDEsIFRZUEUgcDIpOwogCi0gICAgdHlwZWRlZiBpbnQgKCpMUF9DT01QQVJFKShUWVBFIHAxLCBUWVBFIHAyKTsKKyAgdm9pZCBTb3J0KExQX0NPTVBBUkUgcENvbXBhcmUsIEZYX0JPT0wgYkFzY2VudCA9IFRSVUUpIHsKKyAgICBpbnQgblNpemUgPSB0aGlzLT5HZXRTaXplKCk7CisgICAgUXVpY2tTb3J0KDAsIG5TaXplIC0gMSwgYkFzY2VudCwgcENvbXBhcmUpOworICB9CiAKLSAgICB2b2lkIFNvcnQoTFBfQ09NUEFSRSBwQ29tcGFyZSwgRlhfQk9PTCBiQXNjZW50ID0gVFJVRSkKLSAgICB7Ci0gICAgICAgIGludCBuU2l6ZSA9IHRoaXMtPkdldFNpemUoKTsKLSAgICAgICAgUXVpY2tTb3J0KDAsIG5TaXplIC0xLCBiQXNjZW50LCBwQ29tcGFyZSk7CisgcHJpdmF0ZToKKyAgdm9pZCBRdWlja1NvcnQoRlhfVUlOVCBuU3RhcnRQb3MsCisgICAgICAgICAgICAgICAgIEZYX1VJTlQgblN0b3BQb3MsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFzY2VuZCwKKyAgICAgICAgICAgICAgICAgTFBfQ09NUEFSRSBwQ29tcGFyZSkgeworICAgIGlmIChuU3RhcnRQb3MgPj0gblN0b3BQb3MpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoKG5TdG9wUG9zIC0gblN0YXJ0UG9zKSA9PSAxKSB7CisgICAgICBUWVBFIFZhbHVlMSA9IHRoaXMtPkdldEF0KG5TdGFydFBvcyk7CisgICAgICBUWVBFIFZhbHVlMiA9IHRoaXMtPkdldEF0KG5TdG9wUG9zKTsKKworICAgICAgaW50IGlHcmVhdGUgPSAoKnBDb21wYXJlKShWYWx1ZTEsIFZhbHVlMik7CisgICAgICBpZiAoKGJBc2NlbmQgJiYgaUdyZWF0ZSA+IDApIHx8ICghYkFzY2VuZCAmJiBpR3JlYXRlIDwgMCkpIHsKKyAgICAgICAgdGhpcy0+U2V0QXQoblN0YXJ0UG9zLCBWYWx1ZTIpOworICAgICAgICB0aGlzLT5TZXRBdChuU3RvcFBvcywgVmFsdWUxKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKICAgICB9CiAKLXByaXZhdGU6Ci0gICAgdm9pZCBRdWlja1NvcnQoRlhfVUlOVCBuU3RhcnRQb3MsIEZYX1VJTlQgblN0b3BQb3MsIEZYX0JPT0wgYkFzY2VuZCwgTFBfQ09NUEFSRSBwQ29tcGFyZSkKLSAgICB7Ci0gICAgICAgIGlmIChuU3RhcnRQb3MgPj0gblN0b3BQb3MpIHJldHVybjsKKyAgICBGWF9VSU5UIG0gPSBuU3RhcnRQb3MgKyAoblN0b3BQb3MgLSBuU3RhcnRQb3MpIC8gMjsKKyAgICBGWF9VSU5UIGkgPSBuU3RhcnRQb3M7CiAKLSAgICAgICAgaWYgKChuU3RvcFBvcyAtIG5TdGFydFBvcykgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgVFlQRSBWYWx1ZTEgPSB0aGlzLT5HZXRBdChuU3RhcnRQb3MpOwotICAgICAgICAgICAgVFlQRSBWYWx1ZTIgPSB0aGlzLT5HZXRBdChuU3RvcFBvcyk7CisgICAgVFlQRSBWYWx1ZSA9IHRoaXMtPkdldEF0KG0pOwogCi0gICAgICAgICAgICBpbnQgaUdyZWF0ZSA9ICgqcENvbXBhcmUpKFZhbHVlMSwgVmFsdWUyKTsKLSAgICAgICAgICAgIGlmICgoYkFzY2VuZCAmJiBpR3JlYXRlID4gMCkgfHwgKCFiQXNjZW5kICYmIGlHcmVhdGUgPCAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLT5TZXRBdChuU3RhcnRQb3MsIFZhbHVlMik7Ci0gICAgICAgICAgICAgICAgdGhpcy0+U2V0QXQoblN0b3BQb3MsIFZhbHVlMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICB3aGlsZSAoaSA8IG0pIHsKKyAgICAgIFRZUEUgdGVtcCA9IHRoaXMtPkdldEF0KGkpOwogCi0gICAgICAgIEZYX1VJTlQgbSA9IG5TdGFydFBvcyArIChuU3RvcFBvcyAtIG5TdGFydFBvcykgLyAyOwotICAgICAgICBGWF9VSU5UIGkgPSBuU3RhcnRQb3M7Ci0KLSAgICAgICAgVFlQRSBWYWx1ZSA9IHRoaXMtPkdldEF0KG0pOwotCi0gICAgICAgIHdoaWxlIChpIDwgbSkKLSAgICAgICAgewotICAgICAgICAgICAgVFlQRSB0ZW1wID0gdGhpcy0+R2V0QXQoaSk7Ci0KLSAgICAgICAgICAgIGludCBpR3JlYXRlID0gKCpwQ29tcGFyZSkodGVtcCwgVmFsdWUpOwotICAgICAgICAgICAgaWYgKChiQXNjZW5kICYmIGlHcmVhdGUgPiAwKSB8fCAoIWJBc2NlbmQgJiYgaUdyZWF0ZSA8IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMtPkluc2VydEF0KG0rMSwgdGVtcCk7Ci0gICAgICAgICAgICAgICAgdGhpcy0+UmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICAgICAgbS0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEZYX1VJTlQgaiA9IG5TdG9wUG9zOwotCi0gICAgICAgIHdoaWxlIChqID4gbSkKLSAgICAgICAgewotICAgICAgICAgICAgVFlQRSB0ZW1wID0gdGhpcy0+R2V0QXQoaik7Ci0KLSAgICAgICAgICAgIGludCBpR3JlYXRlID0gKCpwQ29tcGFyZSkodGVtcCwgVmFsdWUpOwotICAgICAgICAgICAgaWYgKChiQXNjZW5kICYmIGlHcmVhdGUgPCAwKSB8fCAoIWJBc2NlbmQgJiYgaUdyZWF0ZSA+IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMtPlJlbW92ZUF0KGopOwotICAgICAgICAgICAgICAgIHRoaXMtPkluc2VydEF0KG0sIHRlbXApOwotICAgICAgICAgICAgICAgIG0rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBqLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoblN0YXJ0UG9zIDwgbSkgUXVpY2tTb3J0KG5TdGFydFBvcywgbSwgYkFzY2VuZCwgcENvbXBhcmUpOwotICAgICAgICBpZiAoblN0b3BQb3MgPiBtKSBRdWlja1NvcnQobSwgblN0b3BQb3MsIGJBc2NlbmQsIHBDb21wYXJlKTsKKyAgICAgIGludCBpR3JlYXRlID0gKCpwQ29tcGFyZSkodGVtcCwgVmFsdWUpOworICAgICAgaWYgKChiQXNjZW5kICYmIGlHcmVhdGUgPiAwKSB8fCAoIWJBc2NlbmQgJiYgaUdyZWF0ZSA8IDApKSB7CisgICAgICAgIHRoaXMtPkluc2VydEF0KG0gKyAxLCB0ZW1wKTsKKyAgICAgICAgdGhpcy0+UmVtb3ZlQXQoaSk7CisgICAgICAgIG0tLTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGkrKzsKKyAgICAgIH0KICAgICB9CisKKyAgICBGWF9VSU5UIGogPSBuU3RvcFBvczsKKworICAgIHdoaWxlIChqID4gbSkgeworICAgICAgVFlQRSB0ZW1wID0gdGhpcy0+R2V0QXQoaik7CisKKyAgICAgIGludCBpR3JlYXRlID0gKCpwQ29tcGFyZSkodGVtcCwgVmFsdWUpOworICAgICAgaWYgKChiQXNjZW5kICYmIGlHcmVhdGUgPCAwKSB8fCAoIWJBc2NlbmQgJiYgaUdyZWF0ZSA+IDApKSB7CisgICAgICAgIHRoaXMtPlJlbW92ZUF0KGopOworICAgICAgICB0aGlzLT5JbnNlcnRBdChtLCB0ZW1wKTsKKyAgICAgICAgbSsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgai0tOworICAgICAgfQorICAgIH0KKworICAgIGlmIChuU3RhcnRQb3MgPCBtKQorICAgICAgUXVpY2tTb3J0KG5TdGFydFBvcywgbSwgYkFzY2VuZCwgcENvbXBhcmUpOworICAgIGlmIChuU3RvcFBvcyA+IG0pCisgICAgICBRdWlja1NvcnQobSwgblN0b3BQb3MsIGJBc2NlbmQsIHBDb21wYXJlKTsKKyAgfQogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlNES19NR1JfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX3JlbmRlcmNvbnRleHQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX3JlbmRlcmNvbnRleHQuaAppbmRleCBiMmJjMTYzLi45ZDFkYWJkIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfcmVuZGVyY29udGV4dC5oCkBAIC0xMSwzMyArMTEsMzEgQEAKICNpbmNsdWRlICJmc2RrX2RlZmluZS5oIgogCiAvLyBFdmVyeXRoaW5nIGFib3V0IHJlbmRlcmluZyBpcyBwdXQgaGVyZTogZm9yIE9PTSByZWNvdmVyeQotY2xhc3MgQ1JlbmRlckNvbnRleHQKLXsKLXB1YmxpYzoKLQlDUmVuZGVyQ29udGV4dCgpIHsgQ2xlYXIoKTsgfQotCX5DUmVuZGVyQ29udGV4dCgpOworY2xhc3MgQ1JlbmRlckNvbnRleHQgeworIHB1YmxpYzoKKyAgQ1JlbmRlckNvbnRleHQoKSB7IENsZWFyKCk7IH0KKyAgfkNSZW5kZXJDb250ZXh0KCk7CiAKLQl2b2lkIENsZWFyKCk7CisgIHZvaWQgQ2xlYXIoKTsKIAotCUNGWF9SZW5kZXJEZXZpY2UqCQltX3BEZXZpY2U7Ci0JQ1BERl9SZW5kZXJDb250ZXh0KgkJbV9wQ29udGV4dDsKLQlDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIqCW1fcFJlbmRlcmVyOwotCUNQREZfQW5ub3RMaXN0KgkJCW1fcEFubm90czsKLQlDUERGX1JlbmRlck9wdGlvbnMqCQltX3BPcHRpb25zOworICBDRlhfUmVuZGVyRGV2aWNlKiBtX3BEZXZpY2U7CisgIENQREZfUmVuZGVyQ29udGV4dCogbV9wQ29udGV4dDsKKyAgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyKiBtX3BSZW5kZXJlcjsKKyAgQ1BERl9Bbm5vdExpc3QqIG1fcEFubm90czsKKyAgQ1BERl9SZW5kZXJPcHRpb25zKiBtX3BPcHRpb25zOwogI2lmZGVmIF9XSU4zMl9XQ0UKLQlDRlhfRElCaXRtYXAqCW1fcEJpdG1hcDsKLQlIQklUTUFQCQkJbV9oQml0bWFwOworICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKKyAgSEJJVE1BUCBtX2hCaXRtYXA7CiAjZW5kaWYKIH07CiAKLWNsYXNzIElGU0RLX1BBVVNFX0FkYXB0ZXIgOiBwdWJsaWMgSUZYX1BhdXNlCi17Ci1wdWJsaWM6Ci0JSUZTREtfUEFVU0VfQWRhcHRlcihJRlNES19QQVVTRSogSVBhdXNlICk7Ci0JRlhfQk9PTCBOZWVkVG9QYXVzZU5vdygpOworY2xhc3MgSUZTREtfUEFVU0VfQWRhcHRlciA6IHB1YmxpYyBJRlhfUGF1c2UgeworIHB1YmxpYzoKKyAgSUZTREtfUEFVU0VfQWRhcHRlcihJRlNES19QQVVTRSogSVBhdXNlKTsKKyAgRlhfQk9PTCBOZWVkVG9QYXVzZU5vdygpOwogCi1wcml2YXRlOgotCUlGU0RLX1BBVVNFKiBtX0lQYXVzZTsKKyBwcml2YXRlOgorICBJRlNES19QQVVTRSogbV9JUGF1c2U7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GU0RLX1JFTkRFUkNPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9meF9zeXN0ZW1oYW5kbGVyLmggYi9mcGRmc2RrL2luY2x1ZGUvZnhfc3lzdGVtaGFuZGxlci5oCmluZGV4IGJmNTllNDUuLjMxZDMzNDcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9meF9zeXN0ZW1oYW5kbGVyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Z4X3N5c3RlbWhhbmRsZXIuaApAQCAtNywxMyArNywxMiBAQAogI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfRlhfU1lTVEVNSEFORExFUl9IXwogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRlhfU1lTVEVNSEFORExFUl9IXwogCi10eXBlZGVmIHZvaWQqCQkJCUZYX0hXTkQ7Ci10eXBlZGVmIHZvaWQqCQkJCUZYX0hNRU5VOwotdHlwZWRlZiB2b2lkCQkJCQkoKlRpbWVyQ2FsbGJhY2spKGludDMyX3QgaWRFdmVudCk7Cit0eXBlZGVmIHZvaWQqIEZYX0hXTkQ7Cit0eXBlZGVmIHZvaWQqIEZYX0hNRU5VOwordHlwZWRlZiB2b2lkICgqVGltZXJDYWxsYmFjaykoaW50MzJfdCBpZEV2ZW50KTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0ZYX1NZU1RFTVRJTUUKLXsKLSAgICBfRlhfU1lTVEVNVElNRSgpCit0eXBlZGVmIHN0cnVjdCBfRlhfU1lTVEVNVElNRSB7CisgIF9GWF9TWVNURU1USU1FKCkKICAgICAgIDogd1llYXIoMCksCiAgICAgICAgIHdNb250aCgwKSwKICAgICAgICAgd0RheU9mV2VlaygwKSwKQEAgLTIyLDcyICsyMSw4MCBAQAogICAgICAgICB3TWludXRlKDApLAogICAgICAgICB3U2Vjb25kKDApLAogICAgICAgICB3TWlsbGlzZWNvbmRzKDApIHt9Ci0gICAgRlhfV09SRCB3WWVhcjsKLSAgICBGWF9XT1JEIHdNb250aDsKLSAgICBGWF9XT1JEIHdEYXlPZldlZWs7Ci0gICAgRlhfV09SRCB3RGF5OwotICAgIEZYX1dPUkQgd0hvdXI7Ci0gICAgRlhfV09SRCB3TWludXRlOwotICAgIEZYX1dPUkQgd1NlY29uZDsKLSAgICBGWF9XT1JEIHdNaWxsaXNlY29uZHM7Ci19RlhfU1lTVEVNVElNRTsKKyAgRlhfV09SRCB3WWVhcjsKKyAgRlhfV09SRCB3TW9udGg7CisgIEZYX1dPUkQgd0RheU9mV2VlazsKKyAgRlhfV09SRCB3RGF5OworICBGWF9XT1JEIHdIb3VyOworICBGWF9XT1JEIHdNaW51dGU7CisgIEZYX1dPUkQgd1NlY29uZDsKKyAgRlhfV09SRCB3TWlsbGlzZWNvbmRzOworfSBGWF9TWVNURU1USU1FOwogCi0vL2N1cnNvciBzdHlsZQotI2RlZmluZSBGWENUX0FSUk9XCQkJCTAKLSNkZWZpbmUgRlhDVF9ORVNXCQkJCTEKLSNkZWZpbmUgRlhDVF9OV1NFCQkJCTIKLSNkZWZpbmUgRlhDVF9WQkVBTQkJCQkzCi0jZGVmaW5lIEZYQ1RfSEJFQU0JCQkJNAotI2RlZmluZSBGWENUX0hBTkQJCQkJNQorLy8gY3Vyc29yIHN0eWxlCisjZGVmaW5lIEZYQ1RfQVJST1cgMAorI2RlZmluZSBGWENUX05FU1cgMQorI2RlZmluZSBGWENUX05XU0UgMgorI2RlZmluZSBGWENUX1ZCRUFNIDMKKyNkZWZpbmUgRlhDVF9IQkVBTSA0CisjZGVmaW5lIEZYQ1RfSEFORCA1CiAKLWNsYXNzIElGWF9TeXN0ZW1IYW5kbGVyCi17Ci1wdWJsaWM6Ci0JdmlydHVhbCB+SUZYX1N5c3RlbUhhbmRsZXIoKSB7fQotCXZpcnR1YWwgdm9pZAkJCQlJbnZhbGlkYXRlUmVjdChGWF9IV05EIGhXbmQsIEZYX1JFQ1QgcmVjdCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZAkJCQlPdXRwdXRTZWxlY3RlZFJlY3Qodm9pZCogcEZvcm1GaWxsZXIsIENQREZfUmVjdCZyZWN0KSA9IDA7CitjbGFzcyBJRlhfU3lzdGVtSGFuZGxlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfU3lzdGVtSGFuZGxlcigpIHt9CisgIHZpcnR1YWwgdm9pZCBJbnZhbGlkYXRlUmVjdChGWF9IV05EIGhXbmQsIEZYX1JFQ1QgcmVjdCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT3V0cHV0U2VsZWN0ZWRSZWN0KHZvaWQqIHBGb3JtRmlsbGVyLCBDUERGX1JlY3QmIHJlY3QpID0gMDsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc1NlbGVjdGlvbkltcGxlbWVudGVkKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNTZWxlY3Rpb25JbXBsZW1lbnRlZCgpID0gMDsKIAotCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCUdldENsaXBib2FyZFRleHQoRlhfSFdORCBoV25kKSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCVNldENsaXBib2FyZFRleHQoRlhfSFdORCBoV25kLCBDRlhfV2lkZVN0cmluZyBzdHJpbmcpID0gMDsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQsIENGWF9XaWRlU3RyaW5nIHN0cmluZykgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCUNsaWVudFRvU2NyZWVuKEZYX0hXTkQgaFduZCwgaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlTY3JlZW5Ub0NsaWVudChGWF9IV05EIGhXbmQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpID0gMDsKKyAgdmlydHVhbCB2b2lkIENsaWVudFRvU2NyZWVuKEZYX0hXTkQgaFduZCwgaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2NyZWVuVG9DbGllbnQoRlhfSFdORCBoV25kLCBpbnQzMl90JiB4LCBpbnQzMl90JiB5KSA9IDA7CiAKLQkvKmN1cnNvciBzdHlsZQotCUZYQ1RfQVJST1cKLQlGWENUX05FU1cKLQlGWENUX05XU0UKLQlGWENUX1ZCRUFNCi0JRlhDVF9IQkVBTQotCUZYQ1RfSEFORAotCSovCi0JdmlydHVhbCB2b2lkCQkJCVNldEN1cnNvcihpbnQzMl90IG5DdXJzb3JUeXBlKSA9IDA7CisgIC8qY3Vyc29yIHN0eWxlCisgIEZYQ1RfQVJST1cKKyAgRlhDVF9ORVNXCisgIEZYQ1RfTldTRQorICBGWENUX1ZCRUFNCisgIEZYQ1RfSEJFQU0KKyAgRlhDVF9IQU5ECisgICovCisgIHZpcnR1YWwgdm9pZCBTZXRDdXJzb3IoaW50MzJfdCBuQ3Vyc29yVHlwZSkgPSAwOwogCi0JdmlydHVhbCBGWF9ITUVOVQkJCUNyZWF0ZVBvcHVwTWVudSgpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQXBwZW5kTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgbklETmV3SXRlbSwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUVuYWJsZU1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LCBpbnQzMl90IG5JREl0ZW0sIEZYX0JPT0wgYkVuYWJsZWQpID0gMDsKLQl2aXJ0dWFsIGludDMyX3QJCQlUcmFja1BvcHVwTWVudShGWF9ITUVOVSBoTWVudSwgaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0hXTkQgaFBhcmVudCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlEZXN0cm95TWVudShGWF9ITUVOVSBoTWVudSkgPSAwOworICB2aXJ0dWFsIEZYX0hNRU5VIENyZWF0ZVBvcHVwTWVudSgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEFwcGVuZE1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSUROZXdJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBFbmFibGVNZW51SXRlbShGWF9ITUVOVSBoTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbklESXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuYWJsZWQpID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IFRyYWNrUG9wdXBNZW51KEZYX0hNRU5VIGhNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSFdORCBoUGFyZW50KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBEZXN0cm95TWVudShGWF9ITUVOVSBoTWVudSkgPSAwOwogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0TmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJRmluZE5hdGl2ZVRydWVUeXBlRm9udChpbnQzMl90IG5DaGFyc2V0LCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lKSA9IDA7Ci0JdmlydHVhbCBDUERGX0ZvbnQqCQkJQWRkTmF0aXZlVHJ1ZVR5cGVGb250VG9QREYoQ1BERl9Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSwgdWludDhfdCBuQ2hhcnNldCkgPSAwOworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldE5hdGl2ZVRydWVUeXBlRm9udChpbnQzMl90IG5DaGFyc2V0KSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpID0gMDsKKyAgdmlydHVhbCBDUERGX0ZvbnQqIEFkZE5hdGl2ZVRydWVUeXBlRm9udFRvUERGKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuQ2hhcnNldCkgPSAwOwogCi0JdmlydHVhbCBpbnQzMl90CQkJU2V0VGltZXIoaW50MzJfdCB1RWxhcHNlLCBUaW1lckNhbGxiYWNrIGxwVGltZXJGdW5jKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCUtpbGxUaW1lcihpbnQzMl90IG5JRCkgPSAwOworICB2aXJ0dWFsIGludDMyX3QgU2V0VGltZXIoaW50MzJfdCB1RWxhcHNlLCBUaW1lckNhbGxiYWNrIGxwVGltZXJGdW5jKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBLaWxsVGltZXIoaW50MzJfdCBuSUQpID0gMDsKIAorICB2aXJ0dWFsIEZYX0JPT0wgSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzQ1RSTEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzQUxUS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7CisgIHZpcnR1YWwgRlhfU1lTVEVNVElNRSBHZXRMb2NhbFRpbWUoKSA9IDA7CiAKLQl2aXJ0dWFsCUZYX1NZU1RFTVRJTUUJCUdldExvY2FsVGltZSgpID0gMDsKLQotCXZpcnR1YWwgaW50MzJfdAkJCUdldENoYXJTZXQoKSA9IDA7Ci0JdmlydHVhbCB2b2lkIAkJCQlTZXRDaGFyU2V0KGludDMyX3QgbkNoYXJTZXQpID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldENoYXJTZXQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRDaGFyU2V0KGludDMyX3QgbkNoYXJTZXQpID0gMDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZYX1NZU1RFTUhBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhfZWRpdC5oIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmgKaW5kZXggZDE1NGNiMi4uYmZlNmEyNTQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhfZWRpdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhfZWRpdC5oCkBAIC0zNSw0NTEgKzM1LDUzNSBAQAogc3RydWN0IENQVlRfV29yZFByb3BzOwogc3RydWN0IENQVlRfV29yZFJhbmdlOwogCi0jZGVmaW5lIFBWVFdPUkRfU1RZTEVfTk9STUFMCQkJCTB4MDAwMEwKLSNkZWZpbmUgUFZUV09SRF9TVFlMRV9ISUdITElHSFQJCQkJMHgwMDAxTAotI2RlZmluZSBQVlRXT1JEX1NUWUxFX1VOREVSTElORQkJCQkweDAwMDJMCi0jZGVmaW5lIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQJCQkJMHgwMDA0TAotI2RlZmluZSBQVlRXT1JEX1NUWUxFX1NRVUlHR0xZCQkJCTB4MDAwOEwKLSNkZWZpbmUgUFZUV09SRF9TVFlMRV9EVUFMQ1JPU1NPVVQJCQkweDAwMTBMCi0jZGVmaW5lIFBWVFdPUkRfU1RZTEVfQk9MRAkJCQkJMHgwMDIwTAotI2RlZmluZSBQVlRXT1JEX1NUWUxFX0lUQUxJQwkJCQkweDAwNDBMCisjZGVmaW5lIFBWVFdPUkRfU1RZTEVfTk9STUFMIDB4MDAwMEwKKyNkZWZpbmUgUFZUV09SRF9TVFlMRV9ISUdITElHSFQgMHgwMDAxTAorI2RlZmluZSBQVlRXT1JEX1NUWUxFX1VOREVSTElORSAweDAwMDJMCisjZGVmaW5lIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQgMHgwMDA0TAorI2RlZmluZSBQVlRXT1JEX1NUWUxFX1NRVUlHR0xZIDB4MDAwOEwKKyNkZWZpbmUgUFZUV09SRF9TVFlMRV9EVUFMQ1JPU1NPVVQgMHgwMDEwTAorI2RlZmluZSBQVlRXT1JEX1NUWUxFX0JPTEQgMHgwMDIwTAorI2RlZmluZSBQVlRXT1JEX1NUWUxFX0lUQUxJQyAweDAwNDBMCiAKLSNkZWZpbmUgRlhfRURJVF9JU0xBVElOV09SRCh1KQkodSA9PSAweDJEIHx8ICh1IDw9IDB4MDA1QSAmJiB1ID49IDB4MDA0MSkgfHwgKHUgPD0gMHgwMDdBICYmIHUgPj0gMHgwMDYxKSB8fCAodSA8PSAweDAyQUYgJiYgdSA+PSAweDAwQzApKQorI2RlZmluZSBGWF9FRElUX0lTTEFUSU5XT1JEKHUpICAgICAgICAgICAgICAgICAgXAorICAodSA9PSAweDJEIHx8ICh1IDw9IDB4MDA1QSAmJiB1ID49IDB4MDA0MSkgfHwgXAorICAgKHUgPD0gMHgwMDdBICYmIHUgPj0gMHgwMDYxKSB8fCAodSA8PSAweDAyQUYgJiYgdSA+PSAweDAwQzApKQogCiAjaWZuZGVmIERFRkFVTFRfQ0hBUlNFVAotI2RlZmluZSBERUZBVUxUX0NIQVJTRVQgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfQ0hBUlNFVCAxCiAjZW5kaWYKIAotY2xhc3MgSUZYX0VkaXRfRm9udE1hcAotewotcHVibGljOgotICAgICAgICB2aXJ0dWFsIH5JRlhfRWRpdF9Gb250TWFwKCkgeyB9Ci0JLy9tYXAgYSBmb250aW5kZXggdG8gcGRmIGZvbnQuCi0JdmlydHVhbCBDUERGX0ZvbnQgKgkJCQkJCUdldFBERkZvbnQoaW50MzJfdCBuRm9udEluZGV4KSA9IDA7Ci0JLy9nZXQgdGhlIGFsaWFzIG9mIGEgcGRmIGZvbnQuCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0UERGRm9udEFsaWFzKGludDMyX3QgbkZvbnRJbmRleCkgPSAwOwotCS8vZ2V0IHRoZSBpbmRleCBvZiBhIGZvbnQgdGhhdCBjYW4gc2hvdyBhIHdvcmQuCi0JdmlydHVhbCBpbnQzMl90CQkJCQkJR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgaW50MzJfdCBuRm9udEluZGV4KSA9IDA7Ci0JLy9nZXQgdGhlIGNoYXJjb2RlIG9mIHdvcmQgZnJvbSB1bmljb2RlCi0JdmlydHVhbCBpbnQzMl90CQkJCQkJQ2hhckNvZGVGcm9tVW5pY29kZShpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCkgPSAwOwotCS8vZ2V0IHRoZSBjaGFyc2V0IG9mIHVuaWNvZGUKLQl2aXJ0dWFsIGludDMyX3QJCQkJCQlDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KSA9IDA7CitjbGFzcyBJRlhfRWRpdF9Gb250TWFwIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGWF9FZGl0X0ZvbnRNYXAoKSB7fQorICAvLyBtYXAgYSBmb250aW5kZXggdG8gcGRmIGZvbnQuCisgIHZpcnR1YWwgQ1BERl9Gb250KiBHZXRQREZGb250KGludDMyX3QgbkZvbnRJbmRleCkgPSAwOworICAvLyBnZXQgdGhlIGFsaWFzIG9mIGEgcGRmIGZvbnQuCisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0UERGRm9udEFsaWFzKGludDMyX3QgbkZvbnRJbmRleCkgPSAwOworICAvLyBnZXQgdGhlIGluZGV4IG9mIGEgZm9udCB0aGF0IGNhbiBzaG93IGEgd29yZC4KKyAgdmlydHVhbCBpbnQzMl90IEdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCkgPSAwOworICAvLyBnZXQgdGhlIGNoYXJjb2RlIG9mIHdvcmQgZnJvbSB1bmljb2RlCisgIHZpcnR1YWwgaW50MzJfdCBDaGFyQ29kZUZyb21Vbmljb2RlKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkKSA9IDA7CisgIC8vIGdldCB0aGUgY2hhcnNldCBvZiB1bmljb2RlCisgIHZpcnR1YWwgaW50MzJfdCBDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KSA9IDA7CiB9OwogCi1jbGFzcyBJRlhfRWRpdF9Ob3RpZnkKLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB+SUZYX0VkaXRfTm90aWZ5KCkgeyB9Ci0JLy9zZXQgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyIGluZm9ybWF0aW9uLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxJbmZvWChGWF9GTE9BVCBmUGxhdGVNaW4sIEZYX0ZMT0FUIGZQbGF0ZU1heCwKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZDb250ZW50TWluLCBGWF9GTE9BVCBmQ29udGVudE1heCwKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZTbWFsbFN0ZXAsIEZYX0ZMT0FUIGZCaWdTdGVwKSA9IDA7Ci0JLy9zZXQgdGhlIHZlcnRpY2FsIHNjcm9sbGJhciBpbmZvcm1hdGlvbi4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmQ29udGVudE1pbiwgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCkgPSAwOwotCS8vc2V0IHRoZSBwb3NpdGlvbiBvZiBob3Jpem9udGFsIHNjcm9sbGJhci4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCkgPSAwOwotCS8vc2V0IHRoZSBwb3NpdGlvbiBvZiB2ZXJ0aWNhbCBzY3JvbGxiYXIuCi0JdmlydHVhbCB2b2lkCQkJCQkJCUlPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpID0gMDsKLQkvL3NldCB0aGUgY2FyZXQgaW5mb3JtYXRpb24uCi0JdmlydHVhbCB2b2lkCQkJCQkJCUlPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCxjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpID0gMDsKLQkvL2lmIHRoZSBjYXJldCBwb3NpdGlvbiBpcyBjaGFuZ2VkICxzZW5kIHRoZSBpbmZvcm1hdGlvbiBvZiBjdXJyZW50IHBvc3Rpb24gdG8gdXNlci4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uQ2FyZXRDaGFuZ2UoY29uc3QgQ1BWVF9TZWNQcm9wcyAmIHNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIHdvcmRQcm9wcykgPSAwOwotCS8vaWYgdGhlIHRleHQgYXJlYSBpcyBjaGFuZ2VkLCBzZW5kIHRoZSBpbmZvcm1hdGlvbiB0byB1c2VyLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlJT25Db250ZW50Q2hhbmdlKGNvbnN0IENQREZfUmVjdCYgcmNDb250ZW50KSA9IDA7Ci0JLy9JbnZhbGlkYXRlIHRoZSByZWN0YW5nbGUgcmVsYXRpdmUgdG8gdGhlIGJvdW5kaW5nIGJveCBvZiBlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlJT25JbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCkgPSAwOworY2xhc3MgSUZYX0VkaXRfTm90aWZ5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGWF9FZGl0X05vdGlmeSgpIHt9CisgIC8vIHNldCB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgaW5mb3JtYXRpb24uCisgIHZpcnR1YWwgdm9pZCBJT25TZXRTY3JvbGxJbmZvWChGWF9GTE9BVCBmUGxhdGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGxhdGVNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNtYWxsU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZCaWdTdGVwKSA9IDA7CisgIC8vIHNldCB0aGUgdmVydGljYWwgc2Nyb2xsYmFyIGluZm9ybWF0aW9uLgorICB2aXJ0dWFsIHZvaWQgSU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBsYXRlTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTbWFsbFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQmlnU3RlcCkgPSAwOworICAvLyBzZXQgdGhlIHBvc2l0aW9uIG9mIGhvcml6b250YWwgc2Nyb2xsYmFyLgorICB2aXJ0dWFsIHZvaWQgSU9uU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCkgPSAwOworICAvLyBzZXQgdGhlIHBvc2l0aW9uIG9mIHZlcnRpY2FsIHNjcm9sbGJhci4KKyAgdmlydHVhbCB2b2lkIElPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpID0gMDsKKyAgLy8gc2V0IHRoZSBjYXJldCBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCB2b2lkIElPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdEhlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdEZvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpID0gMDsKKyAgLy8gaWYgdGhlIGNhcmV0IHBvc2l0aW9uIGlzIGNoYW5nZWQgLHNlbmQgdGhlIGluZm9ybWF0aW9uIG9mIGN1cnJlbnQgcG9zdGlvbgorICAvLyB0byB1c2VyLgorICB2aXJ0dWFsIHZvaWQgSU9uQ2FyZXRDaGFuZ2UoY29uc3QgQ1BWVF9TZWNQcm9wcyYgc2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyYgd29yZFByb3BzKSA9IDA7CisgIC8vIGlmIHRoZSB0ZXh0IGFyZWEgaXMgY2hhbmdlZCwgc2VuZCB0aGUgaW5mb3JtYXRpb24gdG8gdXNlci4KKyAgdmlydHVhbCB2b2lkIElPbkNvbnRlbnRDaGFuZ2UoY29uc3QgQ1BERl9SZWN0JiByY0NvbnRlbnQpID0gMDsKKyAgLy8gSW52YWxpZGF0ZSB0aGUgcmVjdGFuZ2xlIHJlbGF0aXZlIHRvIHRoZSBib3VuZGluZyBib3ggb2YgZWRpdC4KKyAgdmlydHVhbCB2b2lkIElPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QpID0gMDsKIH07CiAKLWNsYXNzIElGWF9FZGl0X09wck5vdGlmeQotewotcHVibGljOgotICAgICAgICB2aXJ0dWFsIH5JRlhfRWRpdF9PcHJOb3RpZnkoKSB7IH0KK2NsYXNzIElGWF9FZGl0X09wck5vdGlmeSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfRWRpdF9PcHJOb3RpZnkoKSB7fQogCi0JLy9PcHJUeXBlOiAwCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uSW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgPSAwOwotCS8vT3ByVHlwZTogMQotCXZpcnR1YWwgdm9pZAkJCQkJCQlPbkluc2VydFJldHVybihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgPSAwOwotCS8vT3ByVHlwZTogMgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPbkJhY2tTcGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgPSAwOwotCS8vT3ByVHlwZTogMwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPbkRlbGV0ZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgPSAwOwotCS8vT3ByVHlwZTogNAotCXZpcnR1YWwgdm9pZAkJCQkJCQlPbkNsZWFyKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7Ci0JLy9PcHJUeXBlOiA1Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgPSAwOwotCS8vT3ByVHlwZTogNgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblNldFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpID0gMDsKLQkvLwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPbkFkZFVuZG8oSUZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSkgPSAwOworICAvLyBPcHJUeXBlOiAwCisgIHZpcnR1YWwgdm9pZCBPbkluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgPSAwOworICAvLyBPcHJUeXBlOiAxCisgIHZpcnR1YWwgdm9pZCBPbkluc2VydFJldHVybihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpID0gMDsKKyAgLy8gT3ByVHlwZTogMgorICB2aXJ0dWFsIHZvaWQgT25CYWNrU3BhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7CisgIC8vIE9wclR5cGU6IDMKKyAgdmlydHVhbCB2b2lkIE9uRGVsZXRlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgPSAwOworICAvLyBPcHJUeXBlOiA0CisgIHZpcnR1YWwgdm9pZCBPbkNsZWFyKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7CisgIC8vIE9wclR5cGU6IDUKKyAgdmlydHVhbCB2b2lkIE9uSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7CisgIC8vIE9wclR5cGU6IDYKKyAgdmlydHVhbCB2b2lkIE9uU2V0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7CisgIC8vCisgIHZpcnR1YWwgdm9pZCBPbkFkZFVuZG8oSUZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSkgPSAwOwogfTsKIAotY2xhc3MgSUZYX0VkaXRfSXRlcmF0b3IKLXsKLXB1YmxpYzoKLQl2aXJ0dWFsIH5JRlhfRWRpdF9JdGVyYXRvcigpICB7fQotcHVibGljOgotCS8vbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbmV4dCB3b3JkLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlOZXh0V29yZCgpID0gMDsKLQkvL21vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIG5leHQgbGluZS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJTmV4dExpbmUoKSA9IDA7Ci0JLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBuZXh0IHNlY3Rpb24uCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCU5leHRTZWN0aW9uKCkgPSAwOworY2xhc3MgSUZYX0VkaXRfSXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX0VkaXRfSXRlcmF0b3IoKSB7fQogCi0JLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBwcmV2aW91cyB3b3JkLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlQcmV2V29yZCgpID0gMDsKLQkvL21vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIHByZXZpb3VzIGxpbmUuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVByZXZMaW5lKCkgPSAwOwotCS8vbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgcHJldmlvdXMgc2VjdGlvbi4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJUHJldlNlY3Rpb24oKSA9IDA7CisgcHVibGljOgorICAvLyBtb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBuZXh0IHdvcmQuCisgIHZpcnR1YWwgRlhfQk9PTCBOZXh0V29yZCgpID0gMDsKKyAgLy8gbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbmV4dCBsaW5lLgorICB2aXJ0dWFsIEZYX0JPT0wgTmV4dExpbmUoKSA9IDA7CisgIC8vIG1vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIG5leHQgc2VjdGlvbi4KKyAgdmlydHVhbCBGWF9CT09MIE5leHRTZWN0aW9uKCkgPSAwOwogCi0JLy9nZXQgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBjdXJyZW50IHdvcmQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY3VycmVudCBsaW5lLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0ID0gMDsKLQkvL2dldCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSBjb25zdCA9IDA7Ci0JLy9zZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEF0KGludDMyX3QgbldvcmRJbmRleCkgPSAwOwotCS8vc2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSA9IDA7Ci0JLy9nZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0JdmlydHVhbCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmCQkJR2V0QXQoKSBjb25zdCA9IDA7CisgIC8vIG1vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIHByZXZpb3VzIHdvcmQuCisgIHZpcnR1YWwgRlhfQk9PTCBQcmV2V29yZCgpID0gMDsKKyAgLy8gbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgcHJldmlvdXMgbGluZS4KKyAgdmlydHVhbCBGWF9CT09MIFByZXZMaW5lKCkgPSAwOworICAvLyBtb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBwcmV2aW91cyBzZWN0aW9uLgorICB2aXJ0dWFsIEZYX0JPT0wgUHJldlNlY3Rpb24oKSA9IDA7CiAKLQkvL2dldCB0aGUgZWRpdCB3aGljaCB0aGlzIGl0ZXJhdG9yIGJlbG9uZ3MgdG8KLQl2aXJ0dWFsIElGWF9FZGl0KgkJCQkJCUdldEVkaXQoKSBjb25zdCA9IDA7CisgIC8vIGdldCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGN1cnJlbnQgd29yZC4KKyAgdmlydHVhbCBGWF9CT09MIEdldFdvcmQoQ1BWVF9Xb3JkJiB3b3JkKSBjb25zdCA9IDA7CisgIC8vIGdldCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGN1cnJlbnQgbGluZS4KKyAgdmlydHVhbCBGWF9CT09MIEdldExpbmUoQ1BWVF9MaW5lJiBsaW5lKSBjb25zdCA9IDA7CisgIC8vIGdldCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4KKyAgdmlydHVhbCBGWF9CT09MIEdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uJiBzZWN0aW9uKSBjb25zdCA9IDA7CisgIC8vIHNldCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgdmlydHVhbCB2b2lkIFNldEF0KGludDMyX3QgbldvcmRJbmRleCkgPSAwOworICAvLyBzZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgIHZpcnR1YWwgdm9pZCBTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpID0gMDsKKyAgLy8gZ2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICB2aXJ0dWFsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBHZXRBdCgpIGNvbnN0ID0gMDsKKworICAvLyBnZXQgdGhlIGVkaXQgd2hpY2ggdGhpcyBpdGVyYXRvciBiZWxvbmdzIHRvCisgIHZpcnR1YWwgSUZYX0VkaXQqIEdldEVkaXQoKSBjb25zdCA9IDA7CiB9OwogCi1jbGFzcyBJRlhfRWRpdF9VbmRvSXRlbQotewotcHVibGljOgotCXZpcnR1YWwgfklGWF9FZGl0X1VuZG9JdGVtKCkgeyB9CitjbGFzcyBJRlhfRWRpdF9VbmRvSXRlbSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfRWRpdF9VbmRvSXRlbSgpIHt9CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJVW5kbygpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJUmVkbygpID0gMDsKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCQlHZXRVbmRvVGl0bGUoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBVbmRvKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgUmVkbygpID0gMDsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRVbmRvVGl0bGUoKSA9IDA7CiB9OwogCi1jbGFzcyBJRlhfRWRpdAotewotcHVibGljOgotCXN0YXRpYyBJRlhfRWRpdCoJCQkJCQlOZXdFZGl0KCk7Ci0Jc3RhdGljCXZvaWQJCQkJCQkJRGVsRWRpdChJRlhfRWRpdCogcEVkaXQpOworY2xhc3MgSUZYX0VkaXQgeworIHB1YmxpYzoKKyAgc3RhdGljIElGWF9FZGl0KiBOZXdFZGl0KCk7CisgIHN0YXRpYyB2b2lkIERlbEVkaXQoSUZYX0VkaXQqIHBFZGl0KTsKIAotICAgICAgICAvL3NldCBhIElGWF9FZGl0X0ZvbnRNYXAgcG9pbnRlciBpbXBsZW1lbnRlZCBieSB1c2VyLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRGb250TWFwKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwKSA9IDA7Ci0JLy9pZiB1c2VyIGRvbid0IGxpa2UgdG8gdXNlIEZvbnRNYXAsIGltcGxlbWVudCBWVFByb3ZpZGVyIGFuZCBzZXQgaXQgZGlyZWN0bHkuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFZUUHJvdmlkZXIoSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIqIHBQcm92aWRlcikgPSAwOwotCS8vc2V0IGEgSUZYX0VkaXRfTm90aWZ5IHBvaW50ZXIgaW1wbGVtZW50ZWQgYnkgdXNlci4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Tm90aWZ5KElGWF9FZGl0X05vdGlmeSAqIHBOb3RpZnkpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0T3ByTm90aWZ5KElGWF9FZGl0X09wck5vdGlmeSogcE9wck5vdGlmeSkgPSAwOwotCS8vZ2V0IGEgcG9pbnRlciBhbGxvY2F0ZWQgYnkgQ1BERl9FZGl0LCBieSB0aGlzIHBvaW50ZXIsIHVzZXIgY2FuIGl0ZXJhdGUgdGhlIGNvbnRlbnRzIG9mIGVkaXQsIGJ1dCBkb24ndCBuZWVkIHRvIHJlbGVhc2UuCi0JdmlydHVhbCBJRlhfRWRpdF9JdGVyYXRvcioJCQkJR2V0SXRlcmF0b3IoKSA9IDA7Ci0JLy9nZXQgYSBWVCBwb2ludGVyIHJlbGF0aXZlIHRvIHRoaXMgZWRpdC4KLQl2aXJ0dWFsIElQREZfVmFyaWFibGVUZXh0KgkJCQlHZXRWYXJpYWJsZVRleHQoKSA9IDA7Ci0JLy9nZXQgdGhlIElGWF9FZGl0X0ZvbnRNYXAgcG9pbnRlciBzZXQgYnkgdXNlci4KLQl2aXJ0dWFsIElGWF9FZGl0X0ZvbnRNYXAqCQkJCUdldEZvbnRNYXAoKSA9IDA7CisgIC8vIHNldCBhIElGWF9FZGl0X0ZvbnRNYXAgcG9pbnRlciBpbXBsZW1lbnRlZCBieSB1c2VyLgorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udE1hcChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCkgPSAwOworICAvLyBpZiB1c2VyIGRvbid0IGxpa2UgdG8gdXNlIEZvbnRNYXAsIGltcGxlbWVudCBWVFByb3ZpZGVyIGFuZCBzZXQgaXQKKyAgLy8gZGlyZWN0bHkuCisgIHZpcnR1YWwgdm9pZCBTZXRWVFByb3ZpZGVyKElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBwUHJvdmlkZXIpID0gMDsKKyAgLy8gc2V0IGEgSUZYX0VkaXRfTm90aWZ5IHBvaW50ZXIgaW1wbGVtZW50ZWQgYnkgdXNlci4KKyAgdmlydHVhbCB2b2lkIFNldE5vdGlmeShJRlhfRWRpdF9Ob3RpZnkqIHBOb3RpZnkpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldE9wck5vdGlmeShJRlhfRWRpdF9PcHJOb3RpZnkqIHBPcHJOb3RpZnkpID0gMDsKKyAgLy8gZ2V0IGEgcG9pbnRlciBhbGxvY2F0ZWQgYnkgQ1BERl9FZGl0LCBieSB0aGlzIHBvaW50ZXIsIHVzZXIgY2FuIGl0ZXJhdGUgdGhlCisgIC8vIGNvbnRlbnRzIG9mIGVkaXQsIGJ1dCBkb24ndCBuZWVkIHRvIHJlbGVhc2UuCisgIHZpcnR1YWwgSUZYX0VkaXRfSXRlcmF0b3IqIEdldEl0ZXJhdG9yKCkgPSAwOworICAvLyBnZXQgYSBWVCBwb2ludGVyIHJlbGF0aXZlIHRvIHRoaXMgZWRpdC4KKyAgdmlydHVhbCBJUERGX1ZhcmlhYmxlVGV4dCogR2V0VmFyaWFibGVUZXh0KCkgPSAwOworICAvLyBnZXQgdGhlIElGWF9FZGl0X0ZvbnRNYXAgcG9pbnRlciBzZXQgYnkgdXNlci4KKyAgdmlydHVhbCBJRlhfRWRpdF9Gb250TWFwKiBHZXRGb250TWFwKCkgPSAwOwogCi0JLy9pbml0aWFsaXplIHRoZSBlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlJbml0aWFsaXplKCkgPSAwOworICAvLyBpbml0aWFsaXplIHRoZSBlZGl0LgorICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZSgpID0gMDsKIAotCS8vc2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHRleHQgYXJlYS4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwotCS8vc2V0IHRoZSBzY3JvbGwgb3JpZ2luCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpID0gMDsKKyAgLy8gc2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHRleHQgYXJlYS4KKyAgdmlydHVhbCB2b2lkIFNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIHNjcm9sbCBvcmlnaW4KKyAgdmlydHVhbCB2b2lkIFNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwogCi0JLy9zZXQgdGhlIGhvcml6b250YWwgdGV4dCBhbGlnbm1lbnQgaW4gdGV4dCBib3gsIG5Gb3JtYXQgKDA6bGVmdCAxOm1pZGRsZSAyOnJpZ2h0KS4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QWxpZ25tZW50SChpbnQzMl90IG5Gb3JtYXQgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL3NldCB0aGUgdmVydGljYWwgdGV4dCBhbGlnbm1lbnQgaW4gdGV4dCBib3gsIG5Gb3JtYXQgKDA6dG9wIDE6Y2VudGVyIDI6Ym90dG9tKS4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QWxpZ25tZW50VihpbnQzMl90IG5Gb3JtYXQgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL2lmIHRoZSB0ZXh0IGlzIHNob3duIGluIHNlY3JldCAsIHNldCBhIGNoYXJhY3RlciBmb3Igc3Vic3RpdHV0ZS4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQgPSAnKicsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwotCS8vc2V0IHRoZSBtYXhpbWFsIGNvdW50IG9mIHdvcmRzIG9mIHRoZSB0ZXh0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7Ci0JLy9pZiBzZXQgdGhlIGNvdW50IG9mIGNoYXJBcnJheSAsIHRoZW4gYWxsIHdvcmRzIGlzIHNob3duIGluIGVxdWFsIHNwYWNlLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7Ci0JLy9zZXQgdGhlIHNwYWNlIG9mIHR3byBjaGFyYWN0ZXJzLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSA9IDAuMGYsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwotCS8vc2V0IHRoZSBob3Jpem9udGFsIHNjYWxlIG9mIGFsbCBjaGFyYWN0ZXJzLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlID0gMTAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL3NldCB0aGUgbGVhZGluZyBvZiBhbGwgbGluZXMKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL2lmIHNldCwgQ1JMRiBpcyBhbGxvd2VkLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRNdWx0aUxpbmUoRlhfQk9PTCBiTXVsdGlMaW5lID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7Ci0JLy9pZiBzZXQsIGFsbCB3b3JkcyBhdXRvIGZpdCB0aGUgd2lkdGggb2YgdGhlIGJvdW5kaW5nIGJveC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b1JldHVybihGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7Ci0JLy9pZiBzZXQsIGEgZm9udCBzaXplIGlzIGNhbGN1bGF0ZWQgdG8gZnVsbCBmaXQgdGhlIGJvdW5kaW5nIGJveC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL2lzIHNldCwgdGhlIHRleHQgaXMgYWxsb3dlZCB0byBzY3JvbGwuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEF1dG9TY3JvbGwoRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwotCS8vc2V0IHRoZSBmb250IHNpemUgb2YgYWxsIHdvcmRzLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwotCS8vdGhlIHRleHQgaXMgYWxsb3dlZCB0byBhdXRvLXNjcm9sbCwgYWxsb3cgdGhlIHRleHQgb3ZlcmZsb3c/Ci0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFRleHRPdmVyZmxvdyhGWF9CT09MIGJBbGxvd2VkID0gRkFMU0UsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIGhvcml6b250YWwgdGV4dCBhbGlnbm1lbnQgaW4gdGV4dCBib3gsIG5Gb3JtYXQgKDA6bGVmdCAxOm1pZGRsZQorICAvLyAyOnJpZ2h0KS4KKyAgdmlydHVhbCB2b2lkIFNldEFsaWdubWVudEgoaW50MzJfdCBuRm9ybWF0ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisgIC8vIHNldCB0aGUgdmVydGljYWwgdGV4dCBhbGlnbm1lbnQgaW4gdGV4dCBib3gsIG5Gb3JtYXQgKDA6dG9wIDE6Y2VudGVyCisgIC8vIDI6Ym90dG9tKS4KKyAgdmlydHVhbCB2b2lkIFNldEFsaWdubWVudFYoaW50MzJfdCBuRm9ybWF0ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisgIC8vIGlmIHRoZSB0ZXh0IGlzIHNob3duIGluIHNlY3JldCAsIHNldCBhIGNoYXJhY3RlciBmb3Igc3Vic3RpdHV0ZS4KKyAgdmlydHVhbCB2b2lkIFNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkID0gJyonLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIG1heGltYWwgY291bnQgb2Ygd29yZHMgb2YgdGhlIHRleHQuCisgIHZpcnR1YWwgdm9pZCBTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisgIC8vIGlmIHNldCB0aGUgY291bnQgb2YgY2hhckFycmF5ICwgdGhlbiBhbGwgd29yZHMgaXMgc2hvd24gaW4gZXF1YWwgc3BhY2UuCisgIHZpcnR1YWwgdm9pZCBTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisgIC8vIHNldCB0aGUgc3BhY2Ugb2YgdHdvIGNoYXJhY3RlcnMuCisgIHZpcnR1YWwgdm9pZCBTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSA9IDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisgIC8vIHNldCB0aGUgaG9yaXpvbnRhbCBzY2FsZSBvZiBhbGwgY2hhcmFjdGVycy4KKyAgdmlydHVhbCB2b2lkIFNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisgIC8vIHNldCB0aGUgbGVhZGluZyBvZiBhbGwgbGluZXMKKyAgdmlydHVhbCB2b2lkIFNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisgIC8vIGlmIHNldCwgQ1JMRiBpcyBhbGxvd2VkLgorICB2aXJ0dWFsIHZvaWQgU2V0TXVsdGlMaW5lKEZYX0JPT0wgYk11bHRpTGluZSA9IFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisgIC8vIGlmIHNldCwgYWxsIHdvcmRzIGF1dG8gZml0IHRoZSB3aWR0aCBvZiB0aGUgYm91bmRpbmcgYm94LgorICB2aXJ0dWFsIHZvaWQgU2V0QXV0b1JldHVybihGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisgIC8vIGlmIHNldCwgYSBmb250IHNpemUgaXMgY2FsY3VsYXRlZCB0byBmdWxsIGZpdCB0aGUgYm91bmRpbmcgYm94LgorICB2aXJ0dWFsIHZvaWQgU2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKyAgLy8gaXMgc2V0LCB0aGUgdGV4dCBpcyBhbGxvd2VkIHRvIHNjcm9sbC4KKyAgdmlydHVhbCB2b2lkIFNldEF1dG9TY3JvbGwoRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIGZvbnQgc2l6ZSBvZiBhbGwgd29yZHMuCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyB0aGUgdGV4dCBpcyBhbGxvd2VkIHRvIGF1dG8tc2Nyb2xsLCBhbGxvdyB0aGUgdGV4dCBvdmVyZmxvdz8KKyAgdmlydHVhbCB2b2lkIFNldFRleHRPdmVyZmxvdyhGWF9CT09MIGJBbGxvd2VkID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CiAKLQkvL3F1ZXJ5IGlmIHRoZSBlZGl0IGlzIHJpY2hlZGl0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc1JpY2hUZXh0KCkgY29uc3QgPSAwOwotCS8vc2V0IHRoZSBlZGl0IGlzIHJpY2hlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRSaWNoVGV4dChGWF9CT09MIGJSaWNoVGV4dCA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwotCS8vc2V0IHRoZSBmb250c2l6ZSBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7Ci0JLy9zZXQgdGhlIGZvbnRpbmRleCBvZiBzZWxlY3RlZCB0ZXh0LCB1c2VyIGNhbiBjaGFuZ2UgdGhlIGZvbnQgb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaEZvbnRJbmRleChpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKLQkvL3NldCB0aGUgdGV4dGNvbG9yIG9mIHNlbGVjdGVkIHRleHQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0Q29sb3IoRlhfQ09MT1JSRUYgZHdDb2xvcikgPSAwOwotCS8vc2V0IHRoZSB0ZXh0IHNjcmlwdCB0eXBlIG9mIHNlbGVjdGVkIHRleHQuICgwOm5vcm1hbCAxOnN1cGVyc2NyaXB0IDI6c3Vic2NyaXB0KQotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKSA9IDA7Ci0JLy9zZXQgdGhlIGJvbGQgZm9udCBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dEJvbGQoRlhfQk9PTCBiQm9sZCA9IFRSVUUpID0gMDsKLQkvL3NldCB0aGUgaXRhbGljIGZvbnQgc3R5bGUgb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRJdGFsaWMoRlhfQk9PTCBiSXRhbGljID0gVFJVRSkgPSAwOwotCS8vc2V0IHRoZSB1bmRlcmxpbmUgc3R5bGUgb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRVbmRlcmxpbmUoRlhfQk9PTCBiVW5kZXJsaW5lID0gVFJVRSkgPSAwOwotCS8vc2V0IHRoZSBjcm9zc291dCBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dENyb3Nzb3V0KEZYX0JPT0wgYkNyb3Nzb3V0ID0gVFJVRSkgPSAwOwotCS8vc2V0IHRoZSBjaGFyc3BhY2Ugb2Ygc2VsZWN0ZWQgdGV4dCwgaW4gdXNlciBjb29yZGluYXRlLgotCXZpcnR1YWwJRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSA9IDA7Ci0JLy9zZXQgdGhlIGhvcml6b250YWwgc2NhbGUgb2Ygc2VsZWN0ZWQgdGV4dCwgZGVmYXVsdCB2YWx1ZSBpcyAxMDAuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCkgPSAwOwotCS8vc2V0IHRoZSBsZWFkaW5nIG9mIHNlbGVjdGVkIHNlY3Rpb24sIGluIHVzZXIgY29vcmRpbmF0ZS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcpID0gMDsKLQkvL3NldCB0aGUgaW5kZW50IG9mIHNlbGVjdGVkIHNlY3Rpb24sIGluIHVzZXIgY29vcmRpbmF0ZS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRMaW5lSW5kZW50KEZYX0ZMT0FUIGZMaW5lSW5kZW50KSA9IDA7Ci0JLy9zZXQgdGhlIGFsaWdubWVudCBvZiBzZWxlY3RlZCBzZWN0aW9uLCBuQWxpZ25tZW50KDA6bGVmdCAxOm1pZGRsZSAyOnJpZ2h0KQotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dEFsaWdubWVudChpbnQzMl90IG5BbGlnbm1lbnQpID0gMDsKKyAgLy8gcXVlcnkgaWYgdGhlIGVkaXQgaXMgcmljaGVkaXQuCisgIHZpcnR1YWwgRlhfQk9PTCBJc1JpY2hUZXh0KCkgY29uc3QgPSAwOworICAvLyBzZXQgdGhlIGVkaXQgaXMgcmljaGVkaXQuCisgIHZpcnR1YWwgdm9pZCBTZXRSaWNoVGV4dChGWF9CT09MIGJSaWNoVGV4dCA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIGZvbnRzaXplIG9mIHNlbGVjdGVkIHRleHQuCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7CisgIC8vIHNldCB0aGUgZm9udGluZGV4IG9mIHNlbGVjdGVkIHRleHQsIHVzZXIgY2FuIGNoYW5nZSB0aGUgZm9udCBvZiBzZWxlY3RlZAorICAvLyB0ZXh0LgorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmljaEZvbnRJbmRleChpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKKyAgLy8gc2V0IHRoZSB0ZXh0Y29sb3Igb2Ygc2VsZWN0ZWQgdGV4dC4KKyAgdmlydHVhbCBGWF9CT09MIFNldFJpY2hUZXh0Q29sb3IoRlhfQ09MT1JSRUYgZHdDb2xvcikgPSAwOworICAvLyBzZXQgdGhlIHRleHQgc2NyaXB0IHR5cGUgb2Ygc2VsZWN0ZWQgdGV4dC4gKDA6bm9ybWFsIDE6c3VwZXJzY3JpcHQKKyAgLy8gMjpzdWJzY3JpcHQpCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKSA9IDA7CisgIC8vIHNldCB0aGUgYm9sZCBmb250IHN0eWxlIG9mIHNlbGVjdGVkIHRleHQuCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRSaWNoVGV4dEJvbGQoRlhfQk9PTCBiQm9sZCA9IFRSVUUpID0gMDsKKyAgLy8gc2V0IHRoZSBpdGFsaWMgZm9udCBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmljaFRleHRJdGFsaWMoRlhfQk9PTCBiSXRhbGljID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIHVuZGVybGluZSBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmljaFRleHRVbmRlcmxpbmUoRlhfQk9PTCBiVW5kZXJsaW5lID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIGNyb3Nzb3V0IHN0eWxlIG9mIHNlbGVjdGVkIHRleHQuCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRSaWNoVGV4dENyb3Nzb3V0KEZYX0JPT0wgYkNyb3Nzb3V0ID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIGNoYXJzcGFjZSBvZiBzZWxlY3RlZCB0ZXh0LCBpbiB1c2VyIGNvb3JkaW5hdGUuCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRSaWNoVGV4dENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSA9IDA7CisgIC8vIHNldCB0aGUgaG9yaXpvbnRhbCBzY2FsZSBvZiBzZWxlY3RlZCB0ZXh0LCBkZWZhdWx0IHZhbHVlIGlzIDEwMC4KKyAgdmlydHVhbCBGWF9CT09MIFNldFJpY2hUZXh0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCkgPSAwOworICAvLyBzZXQgdGhlIGxlYWRpbmcgb2Ygc2VsZWN0ZWQgc2VjdGlvbiwgaW4gdXNlciBjb29yZGluYXRlLgorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmljaFRleHRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcpID0gMDsKKyAgLy8gc2V0IHRoZSBpbmRlbnQgb2Ygc2VsZWN0ZWQgc2VjdGlvbiwgaW4gdXNlciBjb29yZGluYXRlLgorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmljaFRleHRMaW5lSW5kZW50KEZYX0ZMT0FUIGZMaW5lSW5kZW50KSA9IDA7CisgIC8vIHNldCB0aGUgYWxpZ25tZW50IG9mIHNlbGVjdGVkIHNlY3Rpb24sIG5BbGlnbm1lbnQoMDpsZWZ0IDE6bWlkZGxlIDI6cmlnaHQpCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRSaWNoVGV4dEFsaWdubWVudChpbnQzMl90IG5BbGlnbm1lbnQpID0gMDsKIAotCS8vc2V0IHRoZSBzZWxlY3RlZCByYW5nZSBvZiB0ZXh0LgotCS8vaWYgblN0YXJ0Q2hhciA9PSAwIGFuZCBuRW5kQ2hhciA9PSAtMSwgc2VsZWN0IGFsbCB0aGUgdGV4dC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0U2VsKGludDMyX3QgblN0YXJ0Q2hhcixpbnQzMl90IG5FbmRDaGFyKSA9IDA7Ci0JLy9nZXQgdGhlIHNlbGVjdGVkIHJhbmdlIG9mIHRleHQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCUdldFNlbChpbnQzMl90ICYgblN0YXJ0Q2hhciwgaW50MzJfdCAmIG5FbmRDaGFyKSBjb25zdCA9IDA7Ci0JLy9zZWxlY3QgYWxsIHRoZSB0ZXh0LgotCXZpcnR1YWwJdm9pZAkJCQkJCQlTZWxlY3RBbGwoKSA9IDA7Ci0JLy9zZXQgdGV4dCBpcyBub3Qgc2VsZWN0ZWQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNlbGVjdE5vbmUoKSA9IDA7Ci0JLy9nZXQgdGhlIGNhcmV0IHBvc2l0aW9uLgotCXZpcnR1YWwgaW50MzJfdAkJCQkJCUdldENhcmV0KCkgY29uc3QgPSAwOwotCXZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldENhcmV0V29yZFBsYWNlKCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSBzdHJpbmcgb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCQlHZXRTZWxUZXh0KCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSB0ZXh0IGNvbmVudAotCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdCA9IDA7Ci0JLy9xdWVyeSBpZiBhbnkgdGV4dCBpcyBzZWxlY3RlZC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNTZWxlY3RlZCgpIGNvbnN0ID0gMDsKLQkvL2dldCB0aGUgc2Nyb2xsIG9yaWdpbgotCXZpcnR1YWwgQ1BERl9Qb2ludAkJCQkJCUdldFNjcm9sbFBvcygpIGNvbnN0ID0gMDsKLQkvL2dldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSB0ZXh0IGFyZWEuCi0JdmlydHVhbCBDUERGX1JlY3QJCQkJCQlHZXRQbGF0ZVJlY3QoKSBjb25zdCA9IDA7Ci0JLy9nZXQgdGhlIGZhY3QgYXJlYSBvZiB0aGUgdGV4dC4KLQl2aXJ0dWFsIENQREZfUmVjdAkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSB2aXNpYmxlIHdvcmQgcmFuZ2UKLQl2aXJ0dWFsIENQVlRfV29yZFJhbmdlCQkJCQlHZXRWaXNpYmxlV29yZFJhbmdlKCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSB3aG9sZSB3b3JkIHJhbmdlCi0JdmlydHVhbCBDUFZUX1dvcmRSYW5nZQkJCQkJR2V0V2hvbGVXb3JkUmFuZ2UoKSBjb25zdCA9IDA7Ci0JLy9nZXQgdGhlIHdvcmQgcmFuZ2Ugb2Ygc2VsZWN0IHRleHQKLQl2aXJ0dWFsIENQVlRfV29yZFJhbmdlCQkJCQlHZXRTZWxlY3RXb3JkUmFuZ2UoKSBjb25zdCA9IDA7CisgIC8vIHNldCB0aGUgc2VsZWN0ZWQgcmFuZ2Ugb2YgdGV4dC4KKyAgLy8gaWYgblN0YXJ0Q2hhciA9PSAwIGFuZCBuRW5kQ2hhciA9PSAtMSwgc2VsZWN0IGFsbCB0aGUgdGV4dC4KKyAgdmlydHVhbCB2b2lkIFNldFNlbChpbnQzMl90IG5TdGFydENoYXIsIGludDMyX3QgbkVuZENoYXIpID0gMDsKKyAgLy8gZ2V0IHRoZSBzZWxlY3RlZCByYW5nZSBvZiB0ZXh0LgorICB2aXJ0dWFsIHZvaWQgR2V0U2VsKGludDMyX3QmIG5TdGFydENoYXIsIGludDMyX3QmIG5FbmRDaGFyKSBjb25zdCA9IDA7CisgIC8vIHNlbGVjdCBhbGwgdGhlIHRleHQuCisgIHZpcnR1YWwgdm9pZCBTZWxlY3RBbGwoKSA9IDA7CisgIC8vIHNldCB0ZXh0IGlzIG5vdCBzZWxlY3RlZC4KKyAgdmlydHVhbCB2b2lkIFNlbGVjdE5vbmUoKSA9IDA7CisgIC8vIGdldCB0aGUgY2FyZXQgcG9zaXRpb24uCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDYXJldCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBHZXRDYXJldFdvcmRQbGFjZSgpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBzdHJpbmcgb2Ygc2VsZWN0ZWQgdGV4dC4KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRTZWxUZXh0KCkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIHRleHQgY29uZW50CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0ID0gMDsKKyAgLy8gcXVlcnkgaWYgYW55IHRleHQgaXMgc2VsZWN0ZWQuCisgIHZpcnR1YWwgRlhfQk9PTCBJc1NlbGVjdGVkKCkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIHNjcm9sbCBvcmlnaW4KKyAgdmlydHVhbCBDUERGX1BvaW50IEdldFNjcm9sbFBvcygpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHRleHQgYXJlYS4KKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0UGxhdGVSZWN0KCkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIGZhY3QgYXJlYSBvZiB0aGUgdGV4dC4KKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0Q29udGVudFJlY3QoKSBjb25zdCA9IDA7CisgIC8vIGdldCB0aGUgdmlzaWJsZSB3b3JkIHJhbmdlCisgIHZpcnR1YWwgQ1BWVF9Xb3JkUmFuZ2UgR2V0VmlzaWJsZVdvcmRSYW5nZSgpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSB3aG9sZSB3b3JkIHJhbmdlCisgIHZpcnR1YWwgQ1BWVF9Xb3JkUmFuZ2UgR2V0V2hvbGVXb3JkUmFuZ2UoKSBjb25zdCA9IDA7CisgIC8vIGdldCB0aGUgd29yZCByYW5nZSBvZiBzZWxlY3QgdGV4dAorICB2aXJ0dWFsIENQVlRfV29yZFJhbmdlIEdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0ID0gMDsKIAotCS8vc2VuZCB0aGUgbW91c2Vkb3duIG1lc3NhZ2UgdG8gZWRpdCBmb3IgcmVzcG9uc2UuCi0JLy9pZiBTaGlmdCBrZXkgaXMgaG9sZCwgYlNoaWZ0IGlzIFRSVUUsIGlzIEN0cmwga2V5IGlzIGhvbGQsIGJDdHJsIGlzIFRSVUUuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JLy9zZW5kIHRoZSBtb3VzZW1vdmUgbWVzc2FnZSB0byBlZGl0IHdoZW4gbW91c2UgZG93biBpcyBUUlVFLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCS8vc2VuZCB0aGUgVVAga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JLy9zZW5kIHRoZSBET1dOIGtleSBtZXNzYWdlIHRvIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfRE9XTihGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JLy9zZW5kIHRoZSBMRUZUIGtleSBtZXNzYWdlIHRvIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfTEVGVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JLy9zZW5kIHRoZSBSSUdIVCBrZXkgbWVzc2FnZSB0byBlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQkvL3NlbmQgdGhlIEhPTUUga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQkvL3NlbmQgdGhlIEVORCBrZXkgbWVzc2FnZSB0byBlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7CisgIC8vIHNlbmQgdGhlIG1vdXNlZG93biBtZXNzYWdlIHRvIGVkaXQgZm9yIHJlc3BvbnNlLgorICAvLyBpZiBTaGlmdCBrZXkgaXMgaG9sZCwgYlNoaWZ0IGlzIFRSVUUsIGlzIEN0cmwga2V5IGlzIGhvbGQsIGJDdHJsIGlzIFRSVUUuCisgIHZpcnR1YWwgdm9pZCBPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3RybCkgPSAwOworICAvLyBzZW5kIHRoZSBtb3VzZW1vdmUgbWVzc2FnZSB0byBlZGl0IHdoZW4gbW91c2UgZG93biBpcyBUUlVFLgorICB2aXJ0dWFsIHZvaWQgT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgLy8gc2VuZCB0aGUgVVAga2V5IG1lc3NhZ2UgdG8gZWRpdC4KKyAgdmlydHVhbCB2b2lkIE9uVktfVVAoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgLy8gc2VuZCB0aGUgRE9XTiBrZXkgbWVzc2FnZSB0byBlZGl0LgorICB2aXJ0dWFsIHZvaWQgT25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSA9IDA7CisgIC8vIHNlbmQgdGhlIExFRlQga2V5IG1lc3NhZ2UgdG8gZWRpdC4KKyAgdmlydHVhbCB2b2lkIE9uVktfTEVGVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgPSAwOworICAvLyBzZW5kIHRoZSBSSUdIVCBrZXkgbWVzc2FnZSB0byBlZGl0LgorICB2aXJ0dWFsIHZvaWQgT25WS19SSUdIVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgPSAwOworICAvLyBzZW5kIHRoZSBIT01FIGtleSBtZXNzYWdlIHRvIGVkaXQuCisgIHZpcnR1YWwgdm9pZCBPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgLy8gc2VuZCB0aGUgRU5EIGtleSBtZXNzYWdlIHRvIGVkaXQuCisgIHZpcnR1YWwgdm9pZCBPblZLX0VORChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgPSAwOwogCi0JLy9wdXQgdGV4dCBpbnRvIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAotCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKLQkvL2luc2VydCBhIHdvcmQgaW50byB0aGUgZWRpdC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOwotCS8vaW5zZXJ0IGEgcmV0dXJuIGludG8gdGhlIGVkaXQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7Ci0JLy9pbnNlcnQgdGV4dCBpbnRvIHRoZSBlZGl0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCi0JCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOwotCS8vZG8gYmFja3NwYWNlIG9wZXJhdGlvbi4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJQmFja3NwYWNlKCkgPSAwOwotCS8vZG8gZGVsZXRlIG9wZXJhdGlvbi4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJRGVsZXRlKCkgPSAwOwotCS8vZGVsZXRlIHRoZSBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlDbGVhcigpID0gMDsKKyAgLy8gcHV0IHRleHQgaW50byBlZGl0LgorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKKyAgLy8gaW5zZXJ0IGEgd29yZCBpbnRvIHRoZSBlZGl0LgorICB2aXJ0dWFsIEZYX0JPT0wgSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CisgIC8vIGluc2VydCBhIHJldHVybiBpbnRvIHRoZSBlZGl0LgorICB2aXJ0dWFsIEZYX0JPT0wgSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CisgIC8vIGluc2VydCB0ZXh0IGludG8gdGhlIGVkaXQuCisgIHZpcnR1YWwgRlhfQk9PTCBJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOworICAvLyBkbyBiYWNrc3BhY2Ugb3BlcmF0aW9uLgorICB2aXJ0dWFsIEZYX0JPT0wgQmFja3NwYWNlKCkgPSAwOworICAvLyBkbyBkZWxldGUgb3BlcmF0aW9uLgorICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlKCkgPSAwOworICAvLyBkZWxldGUgdGhlIHNlbGVjdGVkIHRleHQuCisgIHZpcnR1YWwgRlhfQk9PTCBDbGVhcigpID0gMDsKIAotCS8vZG8gUmVkbyBvcGVyYXRpb24uCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVJlZG8oKSA9IDA7Ci0JLy9kbyBVbmRvIG9wZXJhdGlvbi4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJVW5kbygpID0gMDsKLQkvL21vdmUgY2FyZXQKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Q2FyZXQoaW50MzJfdCBuUG9zKSA9IDA7CisgIC8vIGRvIFJlZG8gb3BlcmF0aW9uLgorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpID0gMDsKKyAgLy8gZG8gVW5kbyBvcGVyYXRpb24uCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKCkgPSAwOworICAvLyBtb3ZlIGNhcmV0CisgIHZpcnR1YWwgdm9pZCBTZXRDYXJldChpbnQzMl90IG5Qb3MpID0gMDsKIAotCS8vYXJyYW5nZSBhbGwgd29yZHMgb3ZlciBhZ2FpbgotCXZpcnR1YWwgdm9pZAkJCQkJCQlQYWludCgpID0gMDsKKyAgLy8gYXJyYW5nZSBhbGwgd29yZHMgb3ZlciBhZ2FpbgorICB2aXJ0dWFsIHZvaWQgUGFpbnQoKSA9IDA7CiAKLQkvL2FsbG93IHRvIHJlZnJlc2ggc2NyZWVuPwotCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpID0gMDsKKyAgLy8gYWxsb3cgdG8gcmVmcmVzaCBzY3JlZW4/CisgIHZpcnR1YWwgdm9pZCBFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCQlSZWZyZXNoV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgPSAwOworICB2aXJ0dWFsIHZvaWQgUmVmcmVzaFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpID0gMDsKIAotCS8vYWxsb3cgdW5kby9yZWRvPwotCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pID0gMDsKKyAgLy8gYWxsb3cgdW5kby9yZWRvPworICB2aXJ0dWFsIHZvaWQgRW5hYmxlVW5kbyhGWF9CT09MIGJVbmRvKSA9IDA7CiAKLQkvL2FsbG93IG5vdGlmeT8KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkgPSAwOworICAvLyBhbGxvdyBub3RpZnk/CisgIHZpcnR1YWwgdm9pZCBFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KSA9IDA7CiAKLQkvL2FsbG93IG9wciBub3RpZnk/Ci0JdmlydHVhbCB2b2lkCQkJCQkJCUVuYWJsZU9wck5vdGlmeShGWF9CT09MIGJOb3RpZnkpID0gMDsKKyAgLy8gYWxsb3cgb3ByIG5vdGlmeT8KKyAgdmlydHVhbCB2b2lkIEVuYWJsZU9wck5vdGlmeShGWF9CT09MIGJOb3RpZnkpID0gMDsKIAotCS8vbWFwIHdvcmQgcGxhY2UgdG8gd29yZCBpbmRleC4KLQl2aXJ0dWFsIGludDMyX3QJCQkJCQlXb3JkUGxhY2VUb1dvcmRJbmRleChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7Ci0JLy9tYXAgd29yZCBpbmRleCB0byB3b3JkIHBsYWNlLgotCXZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCVdvcmRJbmRleFRvV29yZFBsYWNlKGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsKKyAgLy8gbWFwIHdvcmQgcGxhY2UgdG8gd29yZCBpbmRleC4KKyAgdmlydHVhbCBpbnQzMl90IFdvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgPSAwOworICAvLyBtYXAgd29yZCBpbmRleCB0byB3b3JkIHBsYWNlLgorICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIFdvcmRJbmRleFRvV29yZFBsYWNlKGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsKIAotCS8vZ2V0IHRoZSBiZWdpbm5pbmcgcG9zaXRpb24gb2YgYSBsaW5lCi0JdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJR2V0TGluZUJlZ2luUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIGJlZ2lubmluZyBwb3NpdGlvbiBvZiBhIGxpbmUKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBHZXRMaW5lQmVnaW5QbGFjZSgKKyAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgPSAwOwogCi0JLy9nZXQgdGhlIGVuZGluZyBwb3NpdGlvbiBvZiBhIGxpbmUKLQl2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIGVuZGluZyBwb3NpdGlvbiBvZiBhIGxpbmUKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCA9IDA7CiAKLQkvL2dldCB0aGUgYmVnaW5uaW5nIHBvc2l0aW9uIG9mIGEgc2VjdGlvbgotCXZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldFNlY3Rpb25CZWdpblBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBiZWdpbm5pbmcgcG9zaXRpb24gb2YgYSBzZWN0aW9uCisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgR2V0U2VjdGlvbkJlZ2luUGxhY2UoCisgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0ID0gMDsKIAotCS8vZ2V0IHRoZSBlbmRpbmcgcG9zaXRpb24gb2YgYSBzZWN0aW9uCi0JdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJR2V0U2VjdGlvbkVuZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBlbmRpbmcgcG9zaXRpb24gb2YgYSBzZWN0aW9uCisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgR2V0U2VjdGlvbkVuZFBsYWNlKAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCA9IDA7CiAKLQkvL3NlYXJjaCBhIHdvcmRwbGFjZSBmb3JtIHBvaW50Ci0JdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJU2VhcmNoV29yZFBsYWNlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCA9IDA7CisgIC8vIHNlYXJjaCBhIHdvcmRwbGFjZSBmb3JtIHBvaW50CisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgU2VhcmNoV29yZFBsYWNlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCA9IDA7CiAKLQkvL2dldCB0aGUgZm9udCBzaXplIG9mIG5vbl9yaWNoIHRleHQgb3IgZGVmYXVsdCBmb250IHNpemUgb2YgcmljaHRleHQuCi0JdmlydHVhbCBGWF9GTE9BVAkJCQkJCUdldEZvbnRTaXplKCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSBtYXNrIGNoYXJhY3Rlci4KLQl2aXJ0dWFsIEZYX1dPUkQJCQkJCQkJR2V0UGFzc3dvcmRDaGFyKCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSBjb3VudCBvZiBjaGFyQXJyYXkKLQl2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRDaGFyQXJyYXkoKSBjb25zdCA9IDA7Ci0JLy9nZXQgdGhlIGhvcml6b250YWwgc2NhbGUgb2YgYWxsIGNoYXJhY3RlcnMKLQl2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRIb3J6U2NhbGUoKSBjb25zdCA9IDA7Ci0JLy9nZXQgdGhlIHNwYWNlIG9mIHR3byBjaGFyYWN0ZXJzCi0JdmlydHVhbCBGWF9GTE9BVAkJCQkJCUdldENoYXJTcGFjZSgpIGNvbnN0ID0gMDsKLQkvL2dldCB0aGUgbGF0aW4gd29yZHMgb2Ygc3BlY2lmaWVkIHJhbmdlCi0JdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQkJR2V0UmFuZ2VUZXh0KGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpIGNvbnN0ID0gMDsKLQkvL2lzIHRoZSB0ZXh0IGZ1bGwgaW4gYm91bmRpbmcgYm94Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzVGV4dEZ1bGwoKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUNhblVuZG8oKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUNhblJlZG8oKSBjb25zdCA9IDA7Ci0JLy9pZiB0aGUgY29udGVudCBpcyBjaGFuZ2VkIGFmdGVyIHNldHRleHQ/Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdCA9IDA7Ci0JLy9nZXQgdGhlIHRvdGFsIHdvcmRzIGluIGVkaXQKLQl2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRUb3RhbFdvcmRzKCkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIGZvbnQgc2l6ZSBvZiBub25fcmljaCB0ZXh0IG9yIGRlZmF1bHQgZm9udCBzaXplIG9mIHJpY2h0ZXh0LgorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIG1hc2sgY2hhcmFjdGVyLgorICB2aXJ0dWFsIEZYX1dPUkQgR2V0UGFzc3dvcmRDaGFyKCkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIGNvdW50IG9mIGNoYXJBcnJheQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhckFycmF5KCkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIGhvcml6b250YWwgc2NhbGUgb2YgYWxsIGNoYXJhY3RlcnMKKyAgdmlydHVhbCBpbnQzMl90IEdldEhvcnpTY2FsZSgpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBzcGFjZSBvZiB0d28gY2hhcmFjdGVycworICB2aXJ0dWFsIEZYX0ZMT0FUIEdldENoYXJTcGFjZSgpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBsYXRpbiB3b3JkcyBvZiBzcGVjaWZpZWQgcmFuZ2UKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRSYW5nZVRleHQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKSBjb25zdCA9IDA7CisgIC8vIGlzIHRoZSB0ZXh0IGZ1bGwgaW4gYm91bmRpbmcgYm94CisgIHZpcnR1YWwgRlhfQk9PTCBJc1RleHRGdWxsKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgQ2FuVW5kbygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIENhblJlZG8oKSBjb25zdCA9IDA7CisgIC8vIGlmIHRoZSBjb250ZW50IGlzIGNoYW5nZWQgYWZ0ZXIgc2V0dGV4dD8KKyAgdmlydHVhbCBGWF9CT09MIElzTW9kaWZpZWQoKSBjb25zdCA9IDA7CisgIC8vIGdldCB0aGUgdG90YWwgd29yZHMgaW4gZWRpdAorICB2aXJ0dWFsIGludDMyX3QgR2V0VG90YWxXb3JkcygpIGNvbnN0ID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCQlBZGRVbmRvSXRlbShJRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBBZGRVbmRvSXRlbShJRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKSA9IDA7CiAKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEVkaXRBcHBlYXJhbmNlU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LAotCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgPSBOVUxMLAotCQkJCQkJCQkJCQkJCUZYX0JPT0wgYkNvbnRpbnVvdXMgPSBUUlVFLCBGWF9XT1JEIFN1YldvcmQgPSAwKTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgPSBOVUxMKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd0VkaXQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgSUZYX0VkaXQqIHBFZGl0LCBGWF9DT0xPUlJFRiBjclRleHRGaWxsLCBGWF9DT0xPUlJFRiBjclRleHRTdHJva2UsCi0JCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsIHZvaWQqIHBGRkxEYXRhKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd1VuZGVybGluZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLCBJRlhfRWRpdCogcEVkaXQsIEZYX0NPTE9SUkVGIGNvbG9yLAotCQkJCQkJCQkJCQkJCWNvbnN0IENQREZfUmVjdCYgcmNDbGlwLCBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCURyYXdSaWNoRWRpdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLCBJRlhfRWRpdCogcEVkaXQsCi0JCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2VuZXJhdGVQYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsIElGWF9FZGl0KiBwRWRpdCwKLQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwgRlhfQ09MT1JSRUYgY3JUZXh0LCBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1RleHRPYmplY3QqPiYgT2JqQXJyYXkpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlHZW5lcmF0ZVJpY2hQYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsIElGWF9FZGl0KiBwRWRpdCwKLQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9UZXh0T2JqZWN0Kj4mIE9iakFycmF5KTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2VuZXJhdGVVbmRlcmxpbmVPYmplY3RzKENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywgSUZYX0VkaXQqIHBFZGl0LAotCQkJCQkJCQkJCQkJCWNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLCBGWF9DT0xPUlJFRiBjb2xvcik7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRFZGl0QXBwZWFyYW5jZVN0cmVhbSgKKyAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEwsCisgICAgICBGWF9CT09MIGJDb250aW51b3VzID0gVFJVRSwKKyAgICAgIEZYX1dPUkQgU3ViV29yZCA9IDApOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbSgKKyAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEwpOworICBzdGF0aWMgdm9pZCBEcmF3RWRpdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPTE9SUkVGIGNyVGV4dEZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPTE9SUkVGIGNyVGV4dFN0cm9rZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBGRkxEYXRhKTsKKyAgc3RhdGljIHZvaWQgRHJhd1VuZGVybGluZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPTE9SUkVGIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNDbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UpOworICBzdGF0aWMgdm9pZCBEcmF3UmljaEVkaXQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSk7CisgIHN0YXRpYyB2b2lkIEdlbmVyYXRlUGFnZU9iamVjdHMoCisgICAgICBDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsCisgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCisgICAgICBGWF9DT0xPUlJFRiBjclRleHQsCisgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1RleHRPYmplY3QqPiYgT2JqQXJyYXkpOworICBzdGF0aWMgdm9pZCBHZW5lcmF0ZVJpY2hQYWdlT2JqZWN0cygKKyAgICAgIENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywKKyAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwKKyAgICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfVGV4dE9iamVjdCo+JiBPYmpBcnJheSk7CisgIHN0YXRpYyB2b2lkIEdlbmVyYXRlVW5kZXJsaW5lT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0xPUlJFRiBjb2xvcik7CiAKLXByb3RlY3RlZDoKLSAgICB+SUZYX0VkaXQoKSB7IH0KKyBwcm90ZWN0ZWQ6CisgIH5JRlhfRWRpdCgpIHt9CiB9OwogCi1jbGFzcyBJRlhfTGlzdF9Ob3RpZnkKLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB+SUZYX0xpc3RfTm90aWZ5KCkgeyB9Ci0JLy9zZXQgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyIGluZm9ybWF0aW9uLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxJbmZvWChGWF9GTE9BVCBmUGxhdGVNaW4sIEZYX0ZMT0FUIGZQbGF0ZU1heCwKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZDb250ZW50TWluLCBGWF9GTE9BVCBmQ29udGVudE1heCwKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZTbWFsbFN0ZXAsIEZYX0ZMT0FUIGZCaWdTdGVwKSA9IDA7Ci0JLy9zZXQgdGhlIHZlcnRpY2FsIHNjcm9sbGJhciBpbmZvcm1hdGlvbi4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmQ29udGVudE1pbiwgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCkgPSAwOwotCS8vc2V0IHRoZSBwb3NpdGlvbiBvZiBob3Jpem9udGFsIHNjcm9sbGJhci4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCkgPSAwOwotCS8vc2V0IHRoZSBwb3NpdGlvbiBvZiB2ZXJ0aWNhbCBzY3JvbGxiYXIuCi0JdmlydHVhbCB2b2lkCQkJCQkJCUlPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpID0gMDsKLQkvL0ludmFsaWRhdGUgdGhlIHJlY3RhbmdsZSByZWxhdGl2ZSB0byB0aGUgYm91bmRpbmcgYm94IG9mIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCUlPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCAqIHBSZWN0KSA9IDA7CitjbGFzcyBJRlhfTGlzdF9Ob3RpZnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX0xpc3RfTm90aWZ5KCkge30KKyAgLy8gc2V0IHRoZSBob3Jpem9udGFsIHNjcm9sbGJhciBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCB2b2lkIElPblNldFNjcm9sbEluZm9YKEZYX0ZMT0FUIGZQbGF0ZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQbGF0ZU1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU21hbGxTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJpZ1N0ZXApID0gMDsKKyAgLy8gc2V0IHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW5mb3JtYXRpb24uCisgIHZpcnR1YWwgdm9pZCBJT25TZXRTY3JvbGxJbmZvWShGWF9GTE9BVCBmUGxhdGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGxhdGVNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNtYWxsU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZCaWdTdGVwKSA9IDA7CisgIC8vIHNldCB0aGUgcG9zaXRpb24gb2YgaG9yaXpvbnRhbCBzY3JvbGxiYXIuCisgIHZpcnR1YWwgdm9pZCBJT25TZXRTY3JvbGxQb3NYKEZYX0ZMT0FUIGZ4KSA9IDA7CisgIC8vIHNldCB0aGUgcG9zaXRpb24gb2YgdmVydGljYWwgc2Nyb2xsYmFyLgorICB2aXJ0dWFsIHZvaWQgSU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSkgPSAwOworICAvLyBJbnZhbGlkYXRlIHRoZSByZWN0YW5nbGUgcmVsYXRpdmUgdG8gdGhlIGJvdW5kaW5nIGJveCBvZiBlZGl0LgorICB2aXJ0dWFsIHZvaWQgSU9uSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0KiBwUmVjdCkgPSAwOwogfTsKIAotY2xhc3MgSUZYX0xpc3QKLXsKLXB1YmxpYzoKLQlzdGF0aWMgSUZYX0xpc3QqCQkJCQkJTmV3TGlzdCgpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlEZWxMaXN0KElGWF9MaXN0KiBwTGlzdCk7CitjbGFzcyBJRlhfTGlzdCB7CisgcHVibGljOgorICBzdGF0aWMgSUZYX0xpc3QqIE5ld0xpc3QoKTsKKyAgc3RhdGljIHZvaWQgRGVsTGlzdChJRlhfTGlzdCogcExpc3QpOwogCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCVNldE5vdGlmeShJRlhfTGlzdF9Ob3RpZnkgKiBwTm90aWZ5KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRGb250TWFwKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXROb3RpZnkoSUZYX0xpc3RfTm90aWZ5KiBwTm90aWZ5KSA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpID0gMDsKIAotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCQkJR2V0UGxhdGVSZWN0KCkgY29uc3QgPSAwOwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldFBsYXRlUmVjdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0Q29udGVudFJlY3QoKSBjb25zdCA9IDA7CiAKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCQkJR2V0Rm9udFNpemUoKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBJRlhfRWRpdCoJCQkJCQlHZXRJdGVtRWRpdChpbnQzMl90IG5JbmRleCkgY29uc3QgPSAwOwotCXZpcnR1YWwgaW50MzJfdAkJCQkJCUdldENvdW50KCkgY29uc3QgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JbmRleCkgY29uc3QgPSAwOwotCXZpcnR1YWwgRlhfRkxPQVQJCQkJCQlHZXRGaXJzdEhlaWdodCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBJRlhfRWRpdCogR2V0SXRlbUVkaXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldENvdW50KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGaXJzdEhlaWdodCgpIGNvbnN0ID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRNdWx0aXBsZVNlbChGWF9CT09MIGJNdWx0aXBsZSkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc011bHRpcGxlU2VsKCkgY29uc3QgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc1ZhbGlkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QgPSAwOwotCXZpcnR1YWwgaW50MzJfdAkJCQkJCUZpbmROZXh0KGludDMyX3QgbkluZGV4LEZYX1dDSEFSIG5DaGFyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRNdWx0aXBsZVNlbChGWF9CT09MIGJNdWx0aXBsZSkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNNdWx0aXBsZVNlbCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBGaW5kTmV4dChpbnQzMl90IG5JbmRleCwgRlhfV0NIQVIgbkNoYXIpIGNvbnN0ID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCVNjcm9sbFRvTGlzdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4KSA9IDA7Ci0JdmlydHVhbCBDUERGX1JlY3QJCQkJCQlHZXRJdGVtUmVjdChpbnQzMl90IG5JbmRleCkgY29uc3QgPSAwOwotCXZpcnR1YWwgaW50MzJfdAkJCQkJCUdldENhcmV0KCkgY29uc3QgPSAwOwotCXZpcnR1YWwgaW50MzJfdAkJCQkJCUdldFNlbGVjdCgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRUb3BJdGVtKCkgY29uc3QgPSAwOwotCXZpcnR1YWwgaW50MzJfdAkJCQkJCUdldEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIGludDMyX3QJCQkJCQlHZXRGaXJzdFNlbGVjdGVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTY3JvbGxUb0xpc3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCkgPSAwOworICB2aXJ0dWFsIENQREZfUmVjdCBHZXRJdGVtUmVjdChpbnQzMl90IG5JbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0Q2FyZXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRTZWxlY3QoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRUb3BJdGVtKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0SXRlbUluZGV4KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRGaXJzdFNlbGVjdGVkKCkgY29uc3QgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCQkJCUFkZFN0cmluZyhjb25zdCBGWF9XQ0hBUiogc3RyaW5nKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFRvcEl0ZW0oaW50MzJfdCBuSW5kZXgpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRDYXJldChpbnQzMl90IG5JdGVtSW5kZXgpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJRW1wdHkoKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCUNhbmNlbCgpID0gMDsKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCQlHZXRUZXh0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgQWRkU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFRvcEl0ZW0oaW50MzJfdCBuSW5kZXgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldENhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCkgPSAwOworICB2aXJ0dWFsIHZvaWQgRW1wdHkoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBDYW5jZWwoKSA9IDA7CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0ID0gMDsKIAorICB2aXJ0dWFsIHZvaWQgT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDdHJsKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblZLX1VQKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uVktfTEVGVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25WS19SSUdIVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblZLX0VORChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25WSyhpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX1VQKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19SSUdIVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfSE9NRShGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WSyhpbnQzMl90IG5JdGVtSW5kZXgsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhcixGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgfklGWF9MaXN0KCkgeyB9CisgcHJvdGVjdGVkOgorICB+SUZYX0xpc3QoKSB7fQogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlhFRElUX0ZYX0VESVRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmggYi9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oCmluZGV4IDdhMjc0MmYuLmQ2NTRlYmMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaApAQCAtMjMsNzk1ICsyMyw4MDEgQEAKIGNsYXNzIENGWF9FZGl0X1VuZG87CiBjbGFzcyBDRlhfRWRpdF9Qcm92aWRlcjsKIAotI2RlZmluZSBGWF9FRElUX0lzRmxvYXRaZXJvKGYpCQkJCQkJKGYgPCAwLjAwMDEgJiYgZiA+IC0wLjAwMDEpCi0jZGVmaW5lIEZYX0VESVRfSXNGbG9hdEVxdWFsKGZhLGZiKQkJCQkJRlhfRURJVF9Jc0Zsb2F0WmVybyhmYSAtIGZiKQotI2RlZmluZSBGWF9FRElUX0lzRmxvYXRCaWdnZXIoZmEsZmIpCQkJCShmYSA+IGZiICYmICFGWF9FRElUX0lzRmxvYXRFcXVhbChmYSxmYikpCi0jZGVmaW5lIEZYX0VESVRfSXNGbG9hdFNtYWxsZXIoZmEsZmIpCQkJCShmYSA8IGZiICYmICFGWF9FRElUX0lzRmxvYXRFcXVhbChmYSxmYikpCisjZGVmaW5lIEZYX0VESVRfSXNGbG9hdFplcm8oZikgKGYgPCAwLjAwMDEgJiYgZiA+IC0wLjAwMDEpCisjZGVmaW5lIEZYX0VESVRfSXNGbG9hdEVxdWFsKGZhLCBmYikgRlhfRURJVF9Jc0Zsb2F0WmVybyhmYSAtIGZiKQorI2RlZmluZSBGWF9FRElUX0lzRmxvYXRCaWdnZXIoZmEsIGZiKSAoZmEgPiBmYiAmJiAhRlhfRURJVF9Jc0Zsb2F0RXF1YWwoZmEsIGZiKSkKKyNkZWZpbmUgRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihmYSwgZmIpIFwKKyAgKGZhIDwgZmIgJiYgIUZYX0VESVRfSXNGbG9hdEVxdWFsKGZhLCBmYikpCiAKLXRlbXBsYXRlPGNsYXNzIFQ+IFQgRlhfRURJVF9NSU4gKGNvbnN0IFQgJiBpLCBjb25zdCBUICYgaikgeyByZXR1cm4gKChpIDwgaikgPyBpIDogaik7IH0KLXRlbXBsYXRlPGNsYXNzIFQ+IFQgRlhfRURJVF9NQVggKGNvbnN0IFQgJiBpLCBjb25zdCBUICYgaikgeyByZXR1cm4gKChpID4gaikgPyBpIDogaik7IH0KK3RlbXBsYXRlIDxjbGFzcyBUPgorVCBGWF9FRElUX01JTihjb25zdCBUJiBpLCBjb25zdCBUJiBqKSB7CisgIHJldHVybiAoKGkgPCBqKSA/IGkgOiBqKTsKK30KK3RlbXBsYXRlIDxjbGFzcyBUPgorVCBGWF9FRElUX01BWChjb25zdCBUJiBpLCBjb25zdCBUJiBqKSB7CisgIHJldHVybiAoKGkgPiBqKSA/IGkgOiBqKTsKK30KIAotI2RlZmluZQlGWF9FRElUX1BJCQkJCQkJCQkJMy4xNDE1OTI2NTM1ODk3OWYKLSNkZWZpbmUgRlhfRURJVF9JVEFMSUNfQU5HRUwJCQkJCQkxMCAqIEZYX0VESVRfUEkgLyAxODAuMGYKLQorI2RlZmluZSBGWF9FRElUX1BJIDMuMTQxNTkyNjUzNTg5NzlmCisjZGVmaW5lIEZYX0VESVRfSVRBTElDX0FOR0VMIDEwICogRlhfRURJVF9QSSAvIDE4MC4wZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X1JlZnJlc2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1lbnVtIFJFRlJFU0hfUExBTl9FCi17Ci0JUlBfQU5BTFlTRSwKLQlSUF9OT0FOQUxZU0UsCi0JUlBfT1BUSU9OQUwKK2VudW0gUkVGUkVTSF9QTEFOX0UgeyBSUF9BTkFMWVNFLCBSUF9OT0FOQUxZU0UsIFJQX09QVElPTkFMIH07CisKK2VudW0gRURJVF9QUk9QU19FIHsKKyAgRVBfTElORUxFQURJTkcsCisgIEVQX0xJTkVJTkRFTlQsCisgIEVQX0FMSUdOTUVOVCwKKyAgRVBfRk9OVElOREVYLAorICBFUF9GT05UU0laRSwKKyAgRVBfV09SRENPTE9SLAorICBFUF9TQ1JJUFRUWVBFLAorICBFUF9VTkRFUkxJTkUsCisgIEVQX0NST1NTT1VULAorICBFUF9DSEFSU1BBQ0UsCisgIEVQX0hPUlpTQ0FMRSwKKyAgRVBfQk9MRCwKKyAgRVBfSVRBTElDCiB9OwogCi1lbnVtIEVESVRfUFJPUFNfRQotewotCUVQX0xJTkVMRUFESU5HLAotCUVQX0xJTkVJTkRFTlQsCi0JRVBfQUxJR05NRU5ULAotCUVQX0ZPTlRJTkRFWCwKLQlFUF9GT05UU0laRSwKLQlFUF9XT1JEQ09MT1IsCi0JRVBfU0NSSVBUVFlQRSwKLQlFUF9VTkRFUkxJTkUsCi0JRVBfQ1JPU1NPVVQsCi0JRVBfQ0hBUlNQQUNFLAotCUVQX0hPUlpTQ0FMRSwKLQlFUF9CT0xELAotCUVQX0lUQUxJQworc3RydWN0IENGWF9FZGl0X0xpbmVSZWN0IHsKKyAgQ0ZYX0VkaXRfTGluZVJlY3QoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyTGluZSwgY29uc3QgQ1BERl9SZWN0JiByY0xpbmUpCisgICAgICA6IG1fd3JMaW5lKHdyTGluZSksIG1fcmNMaW5lKHJjTGluZSkge30KKworICBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QmIGxpbmVyZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmbGluZXJlY3QsIHNpemVvZihDRlhfRWRpdF9MaW5lUmVjdCkpICE9IDA7CisgIH0KKworICBGWF9CT09MIElzU2FtZUhlaWdodChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCYgbGluZXJlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybygKKyAgICAgICAgKG1fcmNMaW5lLnRvcCAtIG1fcmNMaW5lLmJvdHRvbSkgLQorICAgICAgICAobGluZXJlY3QubV9yY0xpbmUudG9wIC0gbGluZXJlY3QubV9yY0xpbmUuYm90dG9tKSk7CisgIH0KKworICBGWF9CT09MIElzU2FtZVRvcChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCYgbGluZXJlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybyhtX3JjTGluZS50b3AgLSBsaW5lcmVjdC5tX3JjTGluZS50b3ApOworICB9CisKKyAgRlhfQk9PTCBJc1NhbWVMZWZ0KGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0JiBsaW5lcmVjdCkgY29uc3QgeworICAgIHJldHVybiBGWF9FRElUX0lzRmxvYXRaZXJvKG1fcmNMaW5lLmxlZnQgLSBsaW5lcmVjdC5tX3JjTGluZS5sZWZ0KTsKKyAgfQorCisgIEZYX0JPT0wgSXNTYW1lUmlnaHQoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QmIGxpbmVyZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIEZYX0VESVRfSXNGbG9hdFplcm8obV9yY0xpbmUucmlnaHQgLSBsaW5lcmVjdC5tX3JjTGluZS5yaWdodCk7CisgIH0KKworICBDUFZUX1dvcmRSYW5nZSBtX3dyTGluZTsKKyAgQ1BERl9SZWN0IG1fcmNMaW5lOwogfTsKIAotc3RydWN0IENGWF9FZGl0X0xpbmVSZWN0Ci17Ci0JQ0ZYX0VkaXRfTGluZVJlY3QoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ckxpbmUsY29uc3QgQ1BERl9SZWN0ICYgcmNMaW5lKSA6Ci0JCW1fd3JMaW5lKHdyTGluZSksIG1fcmNMaW5lKHJjTGluZSkKLQl7Ci0JfQorY2xhc3MgQ0ZYX0VkaXRfTGluZVJlY3RBcnJheSB7CisgcHVibGljOgorICBDRlhfRWRpdF9MaW5lUmVjdEFycmF5KCkge30KIAotCUZYX0JPT0wgb3BlcmF0b3IgIT0gKGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0Ci0JewotCQlyZXR1cm4gRlhTWVNfbWVtY21wKHRoaXMsICZsaW5lcmVjdCwgc2l6ZW9mKENGWF9FZGl0X0xpbmVSZWN0KSkgIT0gMDsKLQl9CisgIHZpcnR1YWwgfkNGWF9FZGl0X0xpbmVSZWN0QXJyYXkoKSB7IEVtcHR5KCk7IH0KIAotCUZYX0JPT0wgSXNTYW1lSGVpZ2h0KGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0Ci0JewotCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybygobV9yY0xpbmUudG9wIC0gbV9yY0xpbmUuYm90dG9tKSAtIChsaW5lcmVjdC5tX3JjTGluZS50b3AgLWxpbmVyZWN0Lm1fcmNMaW5lLmJvdHRvbSkpOwotCX0KKyAgdm9pZCBFbXB0eSgpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9MaW5lUmVjdHMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICAgIGRlbGV0ZSBtX0xpbmVSZWN0cy5HZXRBdChpKTsKIAotCUZYX0JPT0wgSXNTYW1lVG9wKGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0Ci0JewotCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybyhtX3JjTGluZS50b3AgLSBsaW5lcmVjdC5tX3JjTGluZS50b3ApOwotCX0KKyAgICBtX0xpbmVSZWN0cy5SZW1vdmVBbGwoKTsKKyAgfQogCi0JRlhfQk9PTCBJc1NhbWVMZWZ0KGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0Ci0JewotCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybyhtX3JjTGluZS5sZWZ0IC0gbGluZXJlY3QubV9yY0xpbmUubGVmdCk7Ci0JfQorICB2b2lkIFJlbW92ZUFsbCgpIHsgbV9MaW5lUmVjdHMuUmVtb3ZlQWxsKCk7IH0KIAotCUZYX0JPT0wgSXNTYW1lUmlnaHQoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QgJiBsaW5lcmVjdCkgY29uc3QKLQl7Ci0JCXJldHVybiBGWF9FRElUX0lzRmxvYXRaZXJvKG1fcmNMaW5lLnJpZ2h0IC0gbGluZXJlY3QubV9yY0xpbmUucmlnaHQpOwotCX0KKyAgdm9pZCBvcGVyYXRvcj0oQ0ZYX0VkaXRfTGluZVJlY3RBcnJheSYgcmVjdHMpIHsKKyAgICBFbXB0eSgpOworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSByZWN0cy5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgICAgbV9MaW5lUmVjdHMuQWRkKHJlY3RzLkdldEF0KGkpKTsKIAotCUNQVlRfV29yZFJhbmdlCQkJCQkJCW1fd3JMaW5lOwotCUNQREZfUmVjdAkJCQkJCQkJbV9yY0xpbmU7CisgICAgcmVjdHMuUmVtb3ZlQWxsKCk7CisgIH0KKworICB2b2lkIEFkZChjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3JMaW5lLCBjb25zdCBDUERGX1JlY3QmIHJjTGluZSkgeworICAgIGlmIChDRlhfRWRpdF9MaW5lUmVjdCogcFJlY3QgPSBuZXcgQ0ZYX0VkaXRfTGluZVJlY3Qod3JMaW5lLCByY0xpbmUpKQorICAgICAgbV9MaW5lUmVjdHMuQWRkKHBSZWN0KTsKKyAgfQorCisgIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fTGluZVJlY3RzLkdldFNpemUoKTsgfQorCisgIENGWF9FZGl0X0xpbmVSZWN0KiBHZXRBdChpbnQzMl90IG5JbmRleCkgY29uc3QgeworICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX0xpbmVSZWN0cy5HZXRTaXplKCkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBtX0xpbmVSZWN0cy5HZXRBdChuSW5kZXgpOworICB9CisKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX0VkaXRfTGluZVJlY3QqPiBtX0xpbmVSZWN0czsKIH07CiAKLWNsYXNzIENGWF9FZGl0X0xpbmVSZWN0QXJyYXkKLXsKLXB1YmxpYzoKLQlDRlhfRWRpdF9MaW5lUmVjdEFycmF5KCkKLQl7Ci0JfQorY2xhc3MgQ0ZYX0VkaXRfUmVjdEFycmF5IHsKKyBwdWJsaWM6CisgIENGWF9FZGl0X1JlY3RBcnJheSgpIHt9CiAKLQl2aXJ0dWFsIH5DRlhfRWRpdF9MaW5lUmVjdEFycmF5KCkKLQl7Ci0JCUVtcHR5KCk7Ci0JfQorICB2aXJ0dWFsIH5DRlhfRWRpdF9SZWN0QXJyYXkoKSB7IEVtcHR5KCk7IH0KIAotCXZvaWQgRW1wdHkoKQotCXsKLQkJZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fTGluZVJlY3RzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0JCQlkZWxldGUgbV9MaW5lUmVjdHMuR2V0QXQoaSk7CisgIHZvaWQgRW1wdHkoKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fUmVjdHMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICAgIGRlbGV0ZSBtX1JlY3RzLkdldEF0KGkpOwogCi0JCW1fTGluZVJlY3RzLlJlbW92ZUFsbCgpOwotCX0KKyAgICBtX1JlY3RzLlJlbW92ZUFsbCgpOworICB9CiAKLQl2b2lkIFJlbW92ZUFsbCgpCi0JewotCQltX0xpbmVSZWN0cy5SZW1vdmVBbGwoKTsKLQl9CisgIHZvaWQgQWRkKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICAgIC8vIGNoZWNrIGZvciBvdmVybGFwZWQgYXJlYQorICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX1JlY3RzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgICBpZiAoQ1BERl9SZWN0KiBwUmVjdCA9IG1fUmVjdHMuR2V0QXQoaSkpCisgICAgICAgIGlmIChwUmVjdC0+Q29udGFpbnMocmVjdCkpCisgICAgICAgICAgcmV0dXJuOwogCi0Jdm9pZCBvcGVyYXRvciA9IChDRlhfRWRpdF9MaW5lUmVjdEFycmF5ICYgcmVjdHMpCi0JewotCQlFbXB0eSgpOwotCQlmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gcmVjdHMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKLQkJCW1fTGluZVJlY3RzLkFkZChyZWN0cy5HZXRBdChpKSk7CisgICAgaWYgKENQREZfUmVjdCogcE5ld1JlY3QgPSBuZXcgQ1BERl9SZWN0KHJlY3QpKQorICAgICAgbV9SZWN0cy5BZGQocE5ld1JlY3QpOworICB9CiAKLQkJcmVjdHMuUmVtb3ZlQWxsKCk7Ci0JfQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBtX1JlY3RzLkdldFNpemUoKTsgfQogCi0Jdm9pZCBBZGQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ckxpbmUsY29uc3QgQ1BERl9SZWN0ICYgcmNMaW5lKQotCXsKLQkJaWYgKENGWF9FZGl0X0xpbmVSZWN0ICogcFJlY3QgPSBuZXcgQ0ZYX0VkaXRfTGluZVJlY3Qod3JMaW5lLHJjTGluZSkpCi0JCQltX0xpbmVSZWN0cy5BZGQocFJlY3QpOwotCX0KKyAgQ1BERl9SZWN0KiBHZXRBdChpbnQzMl90IG5JbmRleCkgY29uc3QgeworICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX1JlY3RzLkdldFNpemUoKSkKKyAgICAgIHJldHVybiBOVUxMOwogCi0JaW50MzJfdCBHZXRTaXplKCkgY29uc3QKLQl7Ci0JCXJldHVybiBtX0xpbmVSZWN0cy5HZXRTaXplKCk7Ci0JfQorICAgIHJldHVybiBtX1JlY3RzLkdldEF0KG5JbmRleCk7CisgIH0KIAotCUNGWF9FZGl0X0xpbmVSZWN0ICogR2V0QXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0Ci0JewotCQlpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9MaW5lUmVjdHMuR2V0U2l6ZSgpKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJcmV0dXJuIG1fTGluZVJlY3RzLkdldEF0KG5JbmRleCk7Ci0JfQotCi0JQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX0VkaXRfTGluZVJlY3QqPgkJbV9MaW5lUmVjdHM7CisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfUmVjdCo+IG1fUmVjdHM7CiB9OwogCi1jbGFzcyBDRlhfRWRpdF9SZWN0QXJyYXkKLXsKLXB1YmxpYzoKLQlDRlhfRWRpdF9SZWN0QXJyYXkoKQotCXsKLQl9CitjbGFzcyBDRlhfRWRpdF9SZWZyZXNoIHsKKyBwdWJsaWM6CisgIENGWF9FZGl0X1JlZnJlc2goKTsKKyAgdmlydHVhbCB+Q0ZYX0VkaXRfUmVmcmVzaCgpOwogCi0JdmlydHVhbCB+Q0ZYX0VkaXRfUmVjdEFycmF5KCkKLQl7Ci0JCUVtcHR5KCk7Ci0JfQorICB2b2lkIEJlZ2luUmVmcmVzaCgpOworICB2b2lkIFB1c2goY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIGxpbmVyYW5nZSwgY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKKyAgdm9pZCBOb0FuYWx5c2UoKTsKKyAgdm9pZCBBbmFseXNlKGludDMyX3QgbkFsaWdubWVudCk7CisgIHZvaWQgQWRkUmVmcmVzaChjb25zdCBDUERGX1JlY3QmIHJlY3QpOworICBjb25zdCBDRlhfRWRpdF9SZWN0QXJyYXkqIEdldFJlZnJlc2hSZWN0cygpIGNvbnN0OworICB2b2lkIEVuZFJlZnJlc2goKTsKIAotCXZvaWQgRW1wdHkoKQotCXsKLQkJZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fUmVjdHMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKLQkJCWRlbGV0ZSBtX1JlY3RzLkdldEF0KGkpOwotCi0JCW1fUmVjdHMuUmVtb3ZlQWxsKCk7Ci0JfQotCi0Jdm9pZCBBZGQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLQl7Ci0JCS8vY2hlY2sgZm9yIG92ZXJsYXBlZCBhcmVhCi0JCWZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX1JlY3RzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0JCQlpZiAoQ1BERl9SZWN0ICogcFJlY3QgPSBtX1JlY3RzLkdldEF0KGkpKQotCQkJCWlmIChwUmVjdC0+Q29udGFpbnMocmVjdCkpcmV0dXJuOwotCi0JCWlmIChDUERGX1JlY3QgKiBwTmV3UmVjdCA9IG5ldyBDUERGX1JlY3QocmVjdCkpCi0JCQltX1JlY3RzLkFkZChwTmV3UmVjdCk7Ci0JfQotCi0JaW50MzJfdCBHZXRTaXplKCkgY29uc3QKLQl7Ci0JCXJldHVybiBtX1JlY3RzLkdldFNpemUoKTsKLQl9Ci0KLQlDUERGX1JlY3QgKiBHZXRBdChpbnQzMl90IG5JbmRleCkgY29uc3QKLQl7Ci0JCWlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX1JlY3RzLkdldFNpemUoKSkKLQkJCXJldHVybiBOVUxMOwotCi0JCXJldHVybiBtX1JlY3RzLkdldEF0KG5JbmRleCk7Ci0JfQotCi0JQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9SZWN0Kj4JCQltX1JlY3RzOworIHByaXZhdGU6CisgIENGWF9FZGl0X0xpbmVSZWN0QXJyYXkgbV9OZXdMaW5lUmVjdHM7CisgIENGWF9FZGl0X0xpbmVSZWN0QXJyYXkgbV9PbGRMaW5lUmVjdHM7CisgIENGWF9FZGl0X1JlY3RBcnJheSBtX1JlZnJlc2hSZWN0czsKIH07CiAKLWNsYXNzIENGWF9FZGl0X1JlZnJlc2gKLXsKLXB1YmxpYzoKLQlDRlhfRWRpdF9SZWZyZXNoKCk7Ci0JdmlydHVhbCB+Q0ZYX0VkaXRfUmVmcmVzaCgpOwotCi0Jdm9pZAkJCQkJCQkJCUJlZ2luUmVmcmVzaCgpOwotCXZvaWQJCQkJCQkJCQlQdXNoKGNvbnN0IENQVlRfV29yZFJhbmdlICYgbGluZXJhbmdlLGNvbnN0IENQREZfUmVjdCAmIHJlY3QpOwotCXZvaWQJCQkJCQkJCQlOb0FuYWx5c2UoKTsKLQl2b2lkCQkJCQkJCQkJQW5hbHlzZShpbnQzMl90IG5BbGlnbm1lbnQpOwotCXZvaWQJCQkJCQkJCQlBZGRSZWZyZXNoKGNvbnN0IENQREZfUmVjdCAmIHJlY3QpOwotCWNvbnN0IENGWF9FZGl0X1JlY3RBcnJheSAqCQkJCUdldFJlZnJlc2hSZWN0cygpIGNvbnN0OwotCXZvaWQJCQkJCQkJCQlFbmRSZWZyZXNoKCk7Ci0KLXByaXZhdGU6Ci0JQ0ZYX0VkaXRfTGluZVJlY3RBcnJheQkJCQkJbV9OZXdMaW5lUmVjdHM7Ci0JQ0ZYX0VkaXRfTGluZVJlY3RBcnJheQkJCQkJbV9PbGRMaW5lUmVjdHM7Ci0JQ0ZYX0VkaXRfUmVjdEFycmF5CQkJCQkJbV9SZWZyZXNoUmVjdHM7Ci19OwotCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXRfU2VsZWN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotY2xhc3MgQ0ZYX0VkaXRfU2VsZWN0Ci17Ci1wdWJsaWM6Ci0JQ0ZYX0VkaXRfU2VsZWN0KCkKLQl7Ci0JfQorY2xhc3MgQ0ZYX0VkaXRfU2VsZWN0IHsKKyBwdWJsaWM6CisgIENGWF9FZGl0X1NlbGVjdCgpIHt9CiAKLQlDRlhfRWRpdF9TZWxlY3QoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBiZWdpbixjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGVuZCkKLQl7Ci0JCVNldChiZWdpbixlbmQpOwotCX0KKyAgQ0ZYX0VkaXRfU2VsZWN0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBiZWdpbiwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGVuZCkgeworICAgIFNldChiZWdpbiwgZW5kKTsKKyAgfQogCi0JQ0ZYX0VkaXRfU2VsZWN0KGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpCi0JewotCQlTZXQocmFuZ2UuQmVnaW5Qb3MscmFuZ2UuRW5kUG9zKTsKLQl9CisgIENGWF9FZGl0X1NlbGVjdChjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpIHsKKyAgICBTZXQocmFuZ2UuQmVnaW5Qb3MsIHJhbmdlLkVuZFBvcyk7CisgIH0KIAotCUNQVlRfV29yZFJhbmdlIENvbnZlcnRUb1dvcmRSYW5nZSgpIGNvbnN0Ci0JewotCQlyZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UoQmVnaW5Qb3MsIEVuZFBvcyk7Ci0JfQorICBDUFZUX1dvcmRSYW5nZSBDb252ZXJ0VG9Xb3JkUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIENQVlRfV29yZFJhbmdlKEJlZ2luUG9zLCBFbmRQb3MpOworICB9CiAKLQl2b2lkIERlZmF1bHQoKQotCXsKLQkJQmVnaW5Qb3MuRGVmYXVsdCgpOwotCQlFbmRQb3MuRGVmYXVsdCgpOwotCX0KKyAgdm9pZCBEZWZhdWx0KCkgeworICAgIEJlZ2luUG9zLkRlZmF1bHQoKTsKKyAgICBFbmRQb3MuRGVmYXVsdCgpOworICB9CiAKLQl2b2lkIFNldChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGJlZ2luLGNvbnN0IENQVlRfV29yZFBsYWNlICYgZW5kKQotCXsKLQkJQmVnaW5Qb3MgPSBiZWdpbjsKLQkJRW5kUG9zID0gZW5kOwotCX0KKyAgdm9pZCBTZXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKSB7CisgICAgQmVnaW5Qb3MgPSBiZWdpbjsKKyAgICBFbmRQb3MgPSBlbmQ7CisgIH0KIAotCXZvaWQgU2V0QmVnaW5Qb3MoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBiZWdpbikKLQl7Ci0JCUJlZ2luUG9zID0gYmVnaW47Ci0JfQorICB2b2lkIFNldEJlZ2luUG9zKGNvbnN0IENQVlRfV29yZFBsYWNlJiBiZWdpbikgeyBCZWdpblBvcyA9IGJlZ2luOyB9CiAKLQl2b2lkIFNldEVuZFBvcyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGVuZCkKLQl7Ci0JCUVuZFBvcyA9IGVuZDsKLQl9CisgIHZvaWQgU2V0RW5kUG9zKGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpIHsgRW5kUG9zID0gZW5kOyB9CiAKLQlGWF9CT09MIElzRXhpc3QoKSBjb25zdAotCXsKLQkJcmV0dXJuIEJlZ2luUG9zICE9IEVuZFBvczsKLQl9CisgIEZYX0JPT0wgSXNFeGlzdCgpIGNvbnN0IHsgcmV0dXJuIEJlZ2luUG9zICE9IEVuZFBvczsgfQogCi0JRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cikgY29uc3QKLQl7Ci0JCXJldHVybiB3ci5CZWdpblBvcyAhPSBCZWdpblBvcyB8fCB3ci5FbmRQb3MgIT0gRW5kUG9zOwotCX0KKyAgRlhfQk9PTCBvcGVyYXRvciE9KGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgY29uc3QgeworICAgIHJldHVybiB3ci5CZWdpblBvcyAhPSBCZWdpblBvcyB8fCB3ci5FbmRQb3MgIT0gRW5kUG9zOworICB9CiAKLQlDUFZUX1dvcmRQbGFjZSBCZWdpblBvcyxFbmRQb3M7CisgIENQVlRfV29yZFBsYWNlIEJlZ2luUG9zLCBFbmRQb3M7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X1VuZG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1jbGFzcyBDRlhfRWRpdF9VbmRvCi17Ci1wdWJsaWM6Ci0JQ0ZYX0VkaXRfVW5kbyhpbnQzMl90IG5CdWZzaXplID0gMTAwMDApOwotCXZpcnR1YWwgfkNGWF9FZGl0X1VuZG8oKTsKK2NsYXNzIENGWF9FZGl0X1VuZG8geworIHB1YmxpYzoKKyAgQ0ZYX0VkaXRfVW5kbyhpbnQzMl90IG5CdWZzaXplID0gMTAwMDApOworICB2aXJ0dWFsIH5DRlhfRWRpdF9VbmRvKCk7CiAKLQl2b2lkCQkJCQkJCQkJVW5kbygpOwotCXZvaWQJCQkJCQkJCQlSZWRvKCk7CisgIHZvaWQgVW5kbygpOworICB2b2lkIFJlZG8oKTsKIAotCXZvaWQJCQkJCQkJCQlBZGRJdGVtKElGWF9FZGl0X1VuZG9JdGVtKiBwSXRlbSk7CisgIHZvaWQgQWRkSXRlbShJRlhfRWRpdF9VbmRvSXRlbSogcEl0ZW0pOwogCi0JRlhfQk9PTAkJCQkJCQkJCUNhblVuZG8oKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJQ2FuUmVkbygpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlJc01vZGlmaWVkKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJCUlzV29ya2luZygpIGNvbnN0OworICBGWF9CT09MIENhblVuZG8oKSBjb25zdDsKKyAgRlhfQk9PTCBDYW5SZWRvKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNNb2RpZmllZCgpIGNvbnN0OworICBGWF9CT09MIElzV29ya2luZygpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQkJCVJlc2V0KCk7CisgIHZvaWQgUmVzZXQoKTsKIAotCUlGWF9FZGl0X1VuZG9JdGVtKgkJCQkJCUdldEl0ZW0oaW50MzJfdCBuSW5kZXgpOwotCWludDMyX3QJCQkJCQkJCUdldEl0ZW1Db3VudCgpe3JldHVybiBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpO30KLQlpbnQzMl90CQkJCQkJCQlHZXRDdXJVbmRvUG9zKCl7cmV0dXJuIG1fbkN1clVuZG9Qb3M7fQorICBJRlhfRWRpdF9VbmRvSXRlbSogR2V0SXRlbShpbnQzMl90IG5JbmRleCk7CisgIGludDMyX3QgR2V0SXRlbUNvdW50KCkgeyByZXR1cm4gbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKTsgfQorICBpbnQzMl90IEdldEN1clVuZG9Qb3MoKSB7IHJldHVybiBtX25DdXJVbmRvUG9zOyB9CiAKLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCQkJCVNldEJ1ZlNpemUoaW50MzJfdCBuU2l6ZSl7bV9uQnVmU2l6ZSA9IG5TaXplO30KLQlpbnQzMl90CQkJCQkJCQlHZXRCdWZTaXplKCl7cmV0dXJuIG1fbkJ1ZlNpemU7fQorIHByaXZhdGU6CisgIHZvaWQgU2V0QnVmU2l6ZShpbnQzMl90IG5TaXplKSB7IG1fbkJ1ZlNpemUgPSBuU2l6ZTsgfQorICBpbnQzMl90IEdldEJ1ZlNpemUoKSB7IHJldHVybiBtX25CdWZTaXplOyB9CiAKLQl2b2lkCQkJCQkJCQkJUmVtb3ZlSGVhZHMoKTsKLQl2b2lkCQkJCQkJCQkJUmVtb3ZlVGFpbHMoKTsKKyAgdm9pZCBSZW1vdmVIZWFkcygpOworICB2b2lkIFJlbW92ZVRhaWxzKCk7CiAKLXByaXZhdGU6Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0VkaXRfVW5kb0l0ZW0qPgltX1VuZG9JdGVtU3RhY2s7CisgcHJpdmF0ZToKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0VkaXRfVW5kb0l0ZW0qPiBtX1VuZG9JdGVtU3RhY2s7CiAKLQlpbnQzMl90CQkJCQkJCQltX25DdXJVbmRvUG9zOwotCWludDMyX3QJCQkJCQkJCW1fbkJ1ZlNpemU7Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYk1vZGlmaWVkOwotCUZYX0JPT0wJCQkJCQkJCQltX2JWaXJnaW47Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYldvcmtpbmc7CisgIGludDMyX3QgbV9uQ3VyVW5kb1BvczsKKyAgaW50MzJfdCBtX25CdWZTaXplOworICBGWF9CT09MIG1fYk1vZGlmaWVkOworICBGWF9CT09MIG1fYlZpcmdpbjsKKyAgRlhfQk9PTCBtX2JXb3JraW5nOwogfTsKIAotY2xhc3MgQ0ZYX0VkaXRfVW5kb0l0ZW0gOiBwdWJsaWMgSUZYX0VkaXRfVW5kb0l0ZW0KLXsKLXB1YmxpYzoKLQlDRlhfRWRpdF9VbmRvSXRlbSgpIDogbV9iRmlyc3QoVFJVRSksIG1fYkxhc3QoVFJVRSkge30KK2NsYXNzIENGWF9FZGl0X1VuZG9JdGVtIDogcHVibGljIElGWF9FZGl0X1VuZG9JdGVtIHsKKyBwdWJsaWM6CisgIENGWF9FZGl0X1VuZG9JdGVtKCkgOiBtX2JGaXJzdChUUlVFKSwgbV9iTGFzdChUUlVFKSB7fQogCi0JQ0ZYX1dpZGVTdHJpbmcgR2V0VW5kb1RpdGxlKCkgb3ZlcnJpZGUgeyByZXR1cm4gTCIiOyB9CisgIENGWF9XaWRlU3RyaW5nIEdldFVuZG9UaXRsZSgpIG92ZXJyaWRlIHsgcmV0dXJuIEwiIjsgfQogCi0Jdm9pZAkJCQkJCQkJCVNldEZpcnN0KEZYX0JPT0wgYkZpcnN0KXttX2JGaXJzdCA9IGJGaXJzdDt9Ci0JRlhfQk9PTAkJCQkJCQkJCUlzRmlyc3QoKXtyZXR1cm4gbV9iRmlyc3Q7fQotCXZvaWQJCQkJCQkJCQlTZXRMYXN0KEZYX0JPT0wgYkxhc3Qpe21fYkxhc3QgPSBiTGFzdDt9Ci0JRlhfQk9PTAkJCQkJCQkJCUlzTGFzdCgpe3JldHVybiBtX2JMYXN0O30KKyAgdm9pZCBTZXRGaXJzdChGWF9CT09MIGJGaXJzdCkgeyBtX2JGaXJzdCA9IGJGaXJzdDsgfQorICBGWF9CT09MIElzRmlyc3QoKSB7IHJldHVybiBtX2JGaXJzdDsgfQorICB2b2lkIFNldExhc3QoRlhfQk9PTCBiTGFzdCkgeyBtX2JMYXN0ID0gYkxhc3Q7IH0KKyAgRlhfQk9PTCBJc0xhc3QoKSB7IHJldHVybiBtX2JMYXN0OyB9CiAKLXByaXZhdGU6Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYkZpcnN0OwotCUZYX0JPT0wJCQkJCQkJCQltX2JMYXN0OworIHByaXZhdGU6CisgIEZYX0JPT0wgbV9iRmlyc3Q7CisgIEZYX0JPT0wgbV9iTGFzdDsKIH07CiAKLWNsYXNzIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW0gOiBwdWJsaWMgSUZYX0VkaXRfVW5kb0l0ZW0KLXsKLXB1YmxpYzoKLQlDRlhfRWRpdF9Hcm91cFVuZG9JdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGl0bGUpOwotCX5DRlhfRWRpdF9Hcm91cFVuZG9JdGVtKCkgb3ZlcnJpZGU7CitjbGFzcyBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtIDogcHVibGljIElGWF9FZGl0X1VuZG9JdGVtIHsKKyBwdWJsaWM6CisgIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUaXRsZSk7CisgIH5DRlhfRWRpdF9Hcm91cFVuZG9JdGVtKCkgb3ZlcnJpZGU7CiAKLQl2b2lkCQkJCQkJCVVuZG8oKSBvdmVycmlkZTsKLQl2b2lkCQkJCQkJCVJlZG8oKSBvdmVycmlkZTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJR2V0VW5kb1RpdGxlKCkgb3ZlcnJpZGU7CisgIHZvaWQgVW5kbygpIG92ZXJyaWRlOworICB2b2lkIFJlZG8oKSBvdmVycmlkZTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VW5kb1RpdGxlKCkgb3ZlcnJpZGU7CiAKLQl2b2lkCQkJCQkJCQkJQWRkVW5kb0l0ZW0oQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSk7Ci0Jdm9pZAkJCQkJCQkJCVVwZGF0ZUl0ZW1zKCk7CisgIHZvaWQgQWRkVW5kb0l0ZW0oQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSk7CisgIHZvaWQgVXBkYXRlSXRlbXMoKTsKIAotcHJpdmF0ZToKLQlDRlhfV2lkZVN0cmluZwkJCQkJCQltX3NUaXRsZTsKLQlDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfRWRpdF9VbmRvSXRlbSo+CW1fSXRlbXM7CisgcHJpdmF0ZToKKyAgQ0ZYX1dpZGVTdHJpbmcgbV9zVGl0bGU7CisgIENGWF9BcnJheVRlbXBsYXRlPENGWF9FZGl0X1VuZG9JdGVtKj4gbV9JdGVtczsKIH07CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXRfVW5kb0l0ZW0gZGVyaXZlZCBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXRfVW5kb0l0ZW0gZGVyaXZlZCBjbGFzc2VzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWNsYXNzIENGWEVVX0luc2VydFdvcmQgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0KLXsKLXB1YmxpYzoKLQlDRlhFVV9JbnNlcnRXb3JkKENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGRQbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ld1BsYWNlLAotCQlGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzKTsKLQl2aXJ0dWFsIH5DRlhFVV9JbnNlcnRXb3JkKCk7CitjbGFzcyBDRlhFVV9JbnNlcnRXb3JkIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtIHsKKyBwdWJsaWM6CisgIENGWEVVX0luc2VydFdvcmQoQ0ZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE5ld1BsYWNlLAorICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpOworICB2aXJ0dWFsIH5DRlhFVV9JbnNlcnRXb3JkKCk7CiAKLQl2b2lkCQkJCQkJUmVkbygpOwotCXZvaWQJCQkJCQlVbmRvKCk7CisgIHZvaWQgUmVkbygpOworICB2b2lkIFVuZG8oKTsKIAotcHJpdmF0ZToKLQlDRlhfRWRpdCoJCQkJCW1fcEVkaXQ7CisgcHJpdmF0ZToKKyAgQ0ZYX0VkaXQqIG1fcEVkaXQ7CiAKLQlDUFZUX1dvcmRQbGFjZQkJCQltX3dwT2xkOwotCUNQVlRfV29yZFBsYWNlCQkJCW1fd3BOZXc7Ci0JRlhfV09SRAkJCQkJCW1fV29yZDsKLQlpbnQzMl90CQkJCQltX25DaGFyc2V0OwotCUNQVlRfV29yZFByb3BzCQkJCW1fV29yZFByb3BzOworICBDUFZUX1dvcmRQbGFjZSBtX3dwT2xkOworICBDUFZUX1dvcmRQbGFjZSBtX3dwTmV3OworICBGWF9XT1JEIG1fV29yZDsKKyAgaW50MzJfdCBtX25DaGFyc2V0OworICBDUFZUX1dvcmRQcm9wcyBtX1dvcmRQcm9wczsKIH07CiAKLWNsYXNzIENGWEVVX0luc2VydFJldHVybiA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbQotewotcHVibGljOgotCUNGWEVVX0luc2VydFJldHVybihDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKLQkJCQkJCQkgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzKTsKLQl2aXJ0dWFsIH5DRlhFVV9JbnNlcnRSZXR1cm4oKTsKK2NsYXNzIENGWEVVX0luc2VydFJldHVybiA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbSB7CisgcHVibGljOgorICBDRlhFVV9JbnNlcnRSZXR1cm4oQ0ZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKTsKKyAgdmlydHVhbCB+Q0ZYRVVfSW5zZXJ0UmV0dXJuKCk7CiAKLQl2b2lkCQkJCQkJUmVkbygpOwotCXZvaWQJCQkJCQlVbmRvKCk7CisgIHZvaWQgUmVkbygpOworICB2b2lkIFVuZG8oKTsKIAotcHJpdmF0ZToKLQlDRlhfRWRpdCAqCQkJCQltX3BFZGl0OworIHByaXZhdGU6CisgIENGWF9FZGl0KiBtX3BFZGl0OwogCi0JQ1BWVF9Xb3JkUGxhY2UJCQkJbV93cE9sZDsKLQlDUFZUX1dvcmRQbGFjZQkJCQltX3dwTmV3OwotCUNQVlRfU2VjUHJvcHMJCQkJbV9TZWNQcm9wczsKLQlDUFZUX1dvcmRQcm9wcwkJCQltX1dvcmRQcm9wczsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE9sZDsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE5ldzsKKyAgQ1BWVF9TZWNQcm9wcyBtX1NlY1Byb3BzOworICBDUFZUX1dvcmRQcm9wcyBtX1dvcmRQcm9wczsKIH07CiAKLWNsYXNzIENGWEVVX0JhY2tzcGFjZSA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbQotewotcHVibGljOgotCUNGWEVVX0JhY2tzcGFjZShDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKLQkJCQkJCUZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LAotCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAmIFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIFdvcmRQcm9wcyk7Ci0JdmlydHVhbCB+Q0ZYRVVfQmFja3NwYWNlKCk7CitjbGFzcyBDRlhFVV9CYWNrc3BhY2UgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0geworIHB1YmxpYzoKKyAgQ0ZYRVVfQmFja3NwYWNlKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3UGxhY2UsCisgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzJiBTZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBXb3JkUHJvcHMpOworICB2aXJ0dWFsIH5DRlhFVV9CYWNrc3BhY2UoKTsKIAotCXZvaWQJCQkJCQlSZWRvKCk7Ci0Jdm9pZAkJCQkJCVVuZG8oKTsKKyAgdm9pZCBSZWRvKCk7CisgIHZvaWQgVW5kbygpOwogCi1wcml2YXRlOgotCUNGWF9FZGl0ICoJCQkJCW1fcEVkaXQ7CisgcHJpdmF0ZToKKyAgQ0ZYX0VkaXQqIG1fcEVkaXQ7CiAKLQlDUFZUX1dvcmRQbGFjZQkJCQltX3dwT2xkOwotCUNQVlRfV29yZFBsYWNlCQkJCW1fd3BOZXc7Ci0JRlhfV09SRAkJCQkJCW1fV29yZDsKLQlpbnQzMl90CQkJCQltX25DaGFyc2V0OwotCUNQVlRfU2VjUHJvcHMJCQkJbV9TZWNQcm9wczsKLQlDUFZUX1dvcmRQcm9wcwkJCQltX1dvcmRQcm9wczsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE9sZDsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE5ldzsKKyAgRlhfV09SRCBtX1dvcmQ7CisgIGludDMyX3QgbV9uQ2hhcnNldDsKKyAgQ1BWVF9TZWNQcm9wcyBtX1NlY1Byb3BzOworICBDUFZUX1dvcmRQcm9wcyBtX1dvcmRQcm9wczsKIH07CiAKLWNsYXNzIENGWEVVX0RlbGV0ZSA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbQotewotcHVibGljOgotCUNGWEVVX0RlbGV0ZShDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKLQkJCQkJCUZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LAotCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAmIFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIFdvcmRQcm9wcywgRlhfQk9PTCBiU2VjRW5kKTsKLQl2aXJ0dWFsIH5DRlhFVV9EZWxldGUoKTsKK2NsYXNzIENGWEVVX0RlbGV0ZSA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbSB7CisgcHVibGljOgorICBDRlhFVV9EZWxldGUoQ0ZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMmIFNlY1Byb3BzLAorICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIFdvcmRQcm9wcywKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlY0VuZCk7CisgIHZpcnR1YWwgfkNGWEVVX0RlbGV0ZSgpOwogCi0Jdm9pZAkJCQkJCVJlZG8oKTsKLQl2b2lkCQkJCQkJVW5kbygpOworICB2b2lkIFJlZG8oKTsKKyAgdm9pZCBVbmRvKCk7CiAKLXByaXZhdGU6Ci0JQ0ZYX0VkaXQgKgkJCQkJbV9wRWRpdDsKKyBwcml2YXRlOgorICBDRlhfRWRpdCogbV9wRWRpdDsKIAotCUNQVlRfV29yZFBsYWNlCQkJCW1fd3BPbGQ7Ci0JQ1BWVF9Xb3JkUGxhY2UJCQkJbV93cE5ldzsKLQlGWF9XT1JECQkJCQkJbV9Xb3JkOwotCWludDMyX3QJCQkJCW1fbkNoYXJzZXQ7Ci0JQ1BWVF9TZWNQcm9wcwkJCQltX1NlY1Byb3BzOwotCUNQVlRfV29yZFByb3BzCQkJCW1fV29yZFByb3BzOwotCUZYX0JPT0wJCQkJCQltX2JTZWNFbmQ7CisgIENQVlRfV29yZFBsYWNlIG1fd3BPbGQ7CisgIENQVlRfV29yZFBsYWNlIG1fd3BOZXc7CisgIEZYX1dPUkQgbV9Xb3JkOworICBpbnQzMl90IG1fbkNoYXJzZXQ7CisgIENQVlRfU2VjUHJvcHMgbV9TZWNQcm9wczsKKyAgQ1BWVF9Xb3JkUHJvcHMgbV9Xb3JkUHJvcHM7CisgIEZYX0JPT0wgbV9iU2VjRW5kOwogfTsKIAotY2xhc3MgQ0ZYRVVfQ2xlYXIgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0KLXsKLXB1YmxpYzoKLQlDRlhFVV9DbGVhcihDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyU2VsLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmIHN3VGV4dCk7Ci0JdmlydHVhbCB+Q0ZYRVVfQ2xlYXIoKTsKK2NsYXNzIENGWEVVX0NsZWFyIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtIHsKKyBwdWJsaWM6CisgIENGWEVVX0NsZWFyKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyU2VsLAorICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dUZXh0KTsKKyAgdmlydHVhbCB+Q0ZYRVVfQ2xlYXIoKTsKIAotCXZvaWQJCQkJCQlSZWRvKCk7Ci0Jdm9pZAkJCQkJCVVuZG8oKTsKKyAgdm9pZCBSZWRvKCk7CisgIHZvaWQgVW5kbygpOwogCi1wcml2YXRlOgotCUNGWF9FZGl0KgkJCQkJbV9wRWRpdDsKKyBwcml2YXRlOgorICBDRlhfRWRpdCogbV9wRWRpdDsKIAotCUNQVlRfV29yZFJhbmdlCQkJCW1fd3JTZWw7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJbV9zd1RleHQ7CisgIENQVlRfV29yZFJhbmdlIG1fd3JTZWw7CisgIENGWF9XaWRlU3RyaW5nIG1fc3dUZXh0OwogfTsKIAotY2xhc3MgQ0ZYRVVfQ2xlYXJSaWNoIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtCi17Ci1wdWJsaWM6Ci0JQ0ZYRVVfQ2xlYXJSaWNoKENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGRQbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ld1BsYWNlLAotCQkJCQkJY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3clNlbCwKLQkJCQkJICAgRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsCi0JCQkJCSAgIGNvbnN0IENQVlRfU2VjUHJvcHMgJiBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiBXb3JkUHJvcHMpOwotCXZpcnR1YWwgfkNGWEVVX0NsZWFyUmljaCgpOworY2xhc3MgQ0ZYRVVfQ2xlYXJSaWNoIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtIHsKKyBwdWJsaWM6CisgIENGWEVVX0NsZWFyUmljaChDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGRQbGFjZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE5ld1BsYWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyU2VsLAorICAgICAgICAgICAgICAgICAgRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyYgU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyYgV29yZFByb3BzKTsKKyAgdmlydHVhbCB+Q0ZYRVVfQ2xlYXJSaWNoKCk7CiAKLQl2b2lkCQkJCQkJUmVkbygpOwotCXZvaWQJCQkJCQlVbmRvKCk7CisgIHZvaWQgUmVkbygpOworICB2b2lkIFVuZG8oKTsKIAotcHJpdmF0ZToKLQlDRlhfRWRpdCAqCQkJCQltX3BFZGl0OworIHByaXZhdGU6CisgIENGWF9FZGl0KiBtX3BFZGl0OwogCi0JQ1BWVF9Xb3JkUGxhY2UJCQkJbV93cE9sZDsKLQlDUFZUX1dvcmRQbGFjZQkJCQltX3dwTmV3OwotCUNQVlRfV29yZFJhbmdlCQkJCW1fd3JTZWw7Ci0JRlhfV09SRAkJCQkJCW1fV29yZDsKLQlpbnQzMl90CQkJCQltX25DaGFyc2V0OwotCUNQVlRfU2VjUHJvcHMJCQkJbV9TZWNQcm9wczsKLQlDUFZUX1dvcmRQcm9wcwkJCQltX1dvcmRQcm9wczsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE9sZDsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE5ldzsKKyAgQ1BWVF9Xb3JkUmFuZ2UgbV93clNlbDsKKyAgRlhfV09SRCBtX1dvcmQ7CisgIGludDMyX3QgbV9uQ2hhcnNldDsKKyAgQ1BWVF9TZWNQcm9wcyBtX1NlY1Byb3BzOworICBDUFZUX1dvcmRQcm9wcyBtX1dvcmRQcm9wczsKIH07CiAKLWNsYXNzIENGWEVVX0luc2VydFRleHQgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0KLXsKLXB1YmxpYzoKLQlDRlhFVV9JbnNlcnRUZXh0KENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGRQbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ld1BsYWNlLAotCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzd1RleHQsIGludDMyX3QgY2hhcnNldCwKLQkJCQkJCSAgIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyk7Ci0JdmlydHVhbCB+Q0ZYRVVfSW5zZXJ0VGV4dCgpOworY2xhc3MgQ0ZYRVVfSW5zZXJ0VGV4dCA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbSB7CisgcHVibGljOgorICBDRlhFVV9JbnNlcnRUZXh0KENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGRQbGFjZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dUZXh0LAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpOworICB2aXJ0dWFsIH5DRlhFVV9JbnNlcnRUZXh0KCk7CiAKLQl2b2lkCQkJCQkJUmVkbygpOwotCXZvaWQJCQkJCQlVbmRvKCk7CisgIHZvaWQgUmVkbygpOworICB2b2lkIFVuZG8oKTsKIAotcHJpdmF0ZToKLQlDRlhfRWRpdCAqCQkJCQltX3BFZGl0OworIHByaXZhdGU6CisgIENGWF9FZGl0KiBtX3BFZGl0OwogCi0JQ1BWVF9Xb3JkUGxhY2UJCQkJbV93cE9sZDsKLQlDUFZUX1dvcmRQbGFjZQkJCQltX3dwTmV3OwotCUNGWF9XaWRlU3RyaW5nCQkJCW1fc3dUZXh0OwotCWludDMyX3QJCQkJCW1fbkNoYXJzZXQ7Ci0JQ1BWVF9TZWNQcm9wcwkJCQltX1NlY1Byb3BzOwotCUNQVlRfV29yZFByb3BzCQkJCW1fV29yZFByb3BzOworICBDUFZUX1dvcmRQbGFjZSBtX3dwT2xkOworICBDUFZUX1dvcmRQbGFjZSBtX3dwTmV3OworICBDRlhfV2lkZVN0cmluZyBtX3N3VGV4dDsKKyAgaW50MzJfdCBtX25DaGFyc2V0OworICBDUFZUX1NlY1Byb3BzIG1fU2VjUHJvcHM7CisgIENQVlRfV29yZFByb3BzIG1fV29yZFByb3BzOwogfTsKIAotY2xhc3MgQ0ZYRVVfU2V0U2VjUHJvcHMgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0KLXsKLXB1YmxpYzoKLQlDRlhFVV9TZXRTZWNQcm9wcyhDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBFRElUX1BST1BTX0UgZXAsCi0JCWNvbnN0IENQVlRfU2VjUHJvcHMgJiBvbGRzZWNwcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiBvbGR3b3JkcHJvcHMsCi0JCWNvbnN0IENQVlRfU2VjUHJvcHMgJiBuZXdzZWNwcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiBuZXd3b3JkcHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpOwotCXZpcnR1YWwgfkNGWEVVX1NldFNlY1Byb3BzKCk7CitjbGFzcyBDRlhFVV9TZXRTZWNQcm9wcyA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbSB7CisgcHVibGljOgorICBDRlhFVV9TZXRTZWNQcm9wcyhDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgRURJVF9QUk9QU19FIGVwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzJiBvbGRzZWNwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIG9sZHdvcmRwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyYgbmV3c2VjcHJvcHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBuZXd3b3JkcHJvcHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiByYW5nZSk7CisgIHZpcnR1YWwgfkNGWEVVX1NldFNlY1Byb3BzKCk7CiAKLQl2b2lkCQkJCQkJUmVkbygpOwotCXZvaWQJCQkJCQlVbmRvKCk7CisgIHZvaWQgUmVkbygpOworICB2b2lkIFVuZG8oKTsKIAotcHJpdmF0ZToKLQlDRlhfRWRpdCAqCQkJCQltX3BFZGl0OwotCUNQVlRfV29yZFBsYWNlCQkJCW1fd3BQbGFjZTsKLQlDUFZUX1dvcmRSYW5nZQkJCQltX3dyUGxhY2U7Ci0JRURJVF9QUk9QU19FCQkJCW1fZVByb3BzOworIHByaXZhdGU6CisgIENGWF9FZGl0KiBtX3BFZGl0OworICBDUFZUX1dvcmRQbGFjZSBtX3dwUGxhY2U7CisgIENQVlRfV29yZFJhbmdlIG1fd3JQbGFjZTsKKyAgRURJVF9QUk9QU19FIG1fZVByb3BzOwogCi0JQ1BWVF9TZWNQcm9wcwkJCQltX09sZFNlY1Byb3BzOwotCUNQVlRfU2VjUHJvcHMJCQkJbV9OZXdTZWNQcm9wczsKLQlDUFZUX1dvcmRQcm9wcwkJCQltX09sZFdvcmRQcm9wczsKLQlDUFZUX1dvcmRQcm9wcwkJCQltX05ld1dvcmRQcm9wczsKKyAgQ1BWVF9TZWNQcm9wcyBtX09sZFNlY1Byb3BzOworICBDUFZUX1NlY1Byb3BzIG1fTmV3U2VjUHJvcHM7CisgIENQVlRfV29yZFByb3BzIG1fT2xkV29yZFByb3BzOworICBDUFZUX1dvcmRQcm9wcyBtX05ld1dvcmRQcm9wczsKIH07CiAKLWNsYXNzIENGWEVVX1NldFdvcmRQcm9wcyA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbQotewotcHVibGljOgotCUNGWEVVX1NldFdvcmRQcm9wcyhDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBFRElUX1BST1BTX0UgZXAsCi0JCWNvbnN0IENQVlRfV29yZFByb3BzICYgb2xkcHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgbmV3cHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpOwotCXZpcnR1YWwgfkNGWEVVX1NldFdvcmRQcm9wcygpOworY2xhc3MgQ0ZYRVVfU2V0V29yZFByb3BzIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtIHsKKyBwdWJsaWM6CisgIENGWEVVX1NldFdvcmRQcm9wcyhDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICBFRElUX1BST1BTX0UgZXAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyYgb2xkcHJvcHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyYgbmV3cHJvcHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpOworICB2aXJ0dWFsIH5DRlhFVV9TZXRXb3JkUHJvcHMoKTsKIAotCXZvaWQJCQkJCQlSZWRvKCk7Ci0Jdm9pZAkJCQkJCVVuZG8oKTsKKyAgdm9pZCBSZWRvKCk7CisgIHZvaWQgVW5kbygpOwogCi1wcml2YXRlOgotCUNGWF9FZGl0ICoJCQkJCW1fcEVkaXQ7Ci0JQ1BWVF9Xb3JkUGxhY2UJCQkJbV93cFBsYWNlOwotCUNQVlRfV29yZFJhbmdlCQkJCW1fd3JQbGFjZTsKLQlFRElUX1BST1BTX0UJCQkJbV9lUHJvcHM7CisgcHJpdmF0ZToKKyAgQ0ZYX0VkaXQqIG1fcEVkaXQ7CisgIENQVlRfV29yZFBsYWNlIG1fd3BQbGFjZTsKKyAgQ1BWVF9Xb3JkUmFuZ2UgbV93clBsYWNlOworICBFRElUX1BST1BTX0UgbV9lUHJvcHM7CiAKLQlDUFZUX1dvcmRQcm9wcwkJCQltX09sZFdvcmRQcm9wczsKLQlDUFZUX1dvcmRQcm9wcwkJCQltX05ld1dvcmRQcm9wczsKKyAgQ1BWVF9Xb3JkUHJvcHMgbV9PbGRXb3JkUHJvcHM7CisgIENQVlRfV29yZFByb3BzIG1fTmV3V29yZFByb3BzOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfRWRpdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWNsYXNzIENGWF9FZGl0IDogcHVibGljIElGWF9FZGl0Ci17Ci0JZnJpZW5kIGNsYXNzIENGWF9FZGl0X0l0ZXJhdG9yOwotCWZyaWVuZCBjbGFzcyBDRlhFVV9JbnNlcnRXb3JkOwotCWZyaWVuZCBjbGFzcyBDRlhFVV9JbnNlcnRSZXR1cm47Ci0JZnJpZW5kIGNsYXNzIENGWEVVX0JhY2tzcGFjZTsKLQlmcmllbmQgY2xhc3MgQ0ZYRVVfRGVsZXRlOwotCWZyaWVuZCBjbGFzcyBDRlhFVV9DbGVhcjsKLQlmcmllbmQgY2xhc3MgQ0ZYRVVfQ2xlYXJSaWNoOwotCWZyaWVuZCBjbGFzcyBDRlhFVV9TZXRTZWNQcm9wczsKLQlmcmllbmQgY2xhc3MgQ0ZYRVVfU2V0V29yZFByb3BzOwotCWZyaWVuZCBjbGFzcyBDRlhFVV9JbnNlcnRUZXh0OworY2xhc3MgQ0ZYX0VkaXQgOiBwdWJsaWMgSUZYX0VkaXQgeworICBmcmllbmQgY2xhc3MgQ0ZYX0VkaXRfSXRlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBDRlhFVV9JbnNlcnRXb3JkOworICBmcmllbmQgY2xhc3MgQ0ZYRVVfSW5zZXJ0UmV0dXJuOworICBmcmllbmQgY2xhc3MgQ0ZYRVVfQmFja3NwYWNlOworICBmcmllbmQgY2xhc3MgQ0ZYRVVfRGVsZXRlOworICBmcmllbmQgY2xhc3MgQ0ZYRVVfQ2xlYXI7CisgIGZyaWVuZCBjbGFzcyBDRlhFVV9DbGVhclJpY2g7CisgIGZyaWVuZCBjbGFzcyBDRlhFVV9TZXRTZWNQcm9wczsKKyAgZnJpZW5kIGNsYXNzIENGWEVVX1NldFdvcmRQcm9wczsKKyAgZnJpZW5kIGNsYXNzIENGWEVVX0luc2VydFRleHQ7CiAKLXB1YmxpYzoKLQlDRlhfRWRpdChJUERGX1ZhcmlhYmxlVGV4dCAqIHBWVCk7Ci0JdmlydHVhbCB+Q0ZYX0VkaXQoKTsKKyBwdWJsaWM6CisgIENGWF9FZGl0KElQREZfVmFyaWFibGVUZXh0KiBwVlQpOworICB2aXJ0dWFsIH5DRlhfRWRpdCgpOwogCi0Jdm9pZAkJCQkJCQkJCVNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwKTsKLQl2b2lkCQkJCQkJCQkJU2V0VlRQcm92aWRlcihJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciogcFByb3ZpZGVyKTsKLQl2b2lkCQkJCQkJCQkJU2V0Tm90aWZ5KElGWF9FZGl0X05vdGlmeSAqIHBOb3RpZnkpOwotCXZvaWQJCQkJCQkJCQlTZXRPcHJOb3RpZnkoSUZYX0VkaXRfT3ByTm90aWZ5KiBwT3ByTm90aWZ5KTsKLQlJRlhfRWRpdF9JdGVyYXRvcioJCQkJCQlHZXRJdGVyYXRvcigpOwotCUlQREZfVmFyaWFibGVUZXh0ICoJCQkJCQlHZXRWYXJpYWJsZVRleHQoKTsKLQlJRlhfRWRpdF9Gb250TWFwKgkJCQkJCUdldEZvbnRNYXAoKTsKKyAgdm9pZCBTZXRGb250TWFwKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwKTsKKyAgdm9pZCBTZXRWVFByb3ZpZGVyKElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBwUHJvdmlkZXIpOworICB2b2lkIFNldE5vdGlmeShJRlhfRWRpdF9Ob3RpZnkqIHBOb3RpZnkpOworICB2b2lkIFNldE9wck5vdGlmeShJRlhfRWRpdF9PcHJOb3RpZnkqIHBPcHJOb3RpZnkpOworICBJRlhfRWRpdF9JdGVyYXRvciogR2V0SXRlcmF0b3IoKTsKKyAgSVBERl9WYXJpYWJsZVRleHQqIEdldFZhcmlhYmxlVGV4dCgpOworICBJRlhfRWRpdF9Gb250TWFwKiBHZXRGb250TWFwKCk7CiAKLQl2b2lkCQkJCQkJCQkJSW5pdGlhbGl6ZSgpOwotCXZvaWQJCQkJCQkJCQlTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCk7CisgIHZvaWQgSW5pdGlhbGl6ZSgpOworICB2b2lkIFNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisgIHZvaWQgU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAotCXZvaWQJCQkJCQkJCQlTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdCA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldEFsaWdubWVudFYoaW50MzJfdCBuRm9ybWF0ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQgPSAnKicsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UgPSAwLjBmLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlID0gMTAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRBdXRvRm9udFNpemUoRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldEF1dG9TY3JvbGwoRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0VGV4dE92ZXJmbG93KEZYX0JPT0wgYkFsbG93ZWQgPSBGQUxTRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKyAgdm9pZCBTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdCA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisgIHZvaWQgU2V0QWxpZ25tZW50VihpbnQzMl90IG5Gb3JtYXQgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworICB2b2lkIFNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkID0gJyonLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworICB2b2lkIFNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworICB2b2lkIFNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworICB2b2lkIFNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZiwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKyAgdm9pZCBTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlID0gMTAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworICB2b2lkIFNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKyAgdm9pZCBTZXRNdWx0aUxpbmUoRlhfQk9PTCBiTXVsdGlMaW5lID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKyAgdm9pZCBTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworICB2b2lkIFNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKyAgdm9pZCBTZXRBdXRvU2Nyb2xsKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworICB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKyAgdm9pZCBTZXRUZXh0T3ZlcmZsb3coRlhfQk9PTCBiQWxsb3dlZCA9IEZBTFNFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwogCi0JRlhfQk9PTAkJCQkJCQkJCUlzUmljaFRleHQoKSBjb25zdDsKLQl2b2lkCQkJCQkJCQkJU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQgPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaEZvbnRJbmRleChpbnQzMl90IG5Gb250SW5kZXgpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRCb2xkKEZYX0JPT0wgYkJvbGQgPSBUUlVFKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRJdGFsaWMoRlhfQk9PTCBiSXRhbGljID0gVFJVRSk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0VW5kZXJsaW5lKEZYX0JPT0wgYlVuZGVybGluZSA9IFRSVUUpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dENyb3Nzb3V0KEZYX0JPT0wgYkNyb3Nzb3V0ID0gVFJVRSk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZyk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0QWxpZ25tZW50KGludDMyX3QgbkFsaWdubWVudCk7CisgIEZYX0JPT0wgSXNSaWNoVGV4dCgpIGNvbnN0OworICB2b2lkIFNldFJpY2hUZXh0KEZYX0JPT0wgYlJpY2hUZXh0ID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKyAgRlhfQk9PTCBTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKKyAgRlhfQk9PTCBTZXRSaWNoRm9udEluZGV4KGludDMyX3QgbkZvbnRJbmRleCk7CisgIEZYX0JPT0wgU2V0UmljaFRleHRDb2xvcihGWF9DT0xPUlJFRiBkd0NvbG9yKTsKKyAgRlhfQk9PTCBTZXRSaWNoVGV4dFNjcmlwdChpbnQzMl90IG5TY3JpcHRUeXBlKTsKKyAgRlhfQk9PTCBTZXRSaWNoVGV4dEJvbGQoRlhfQk9PTCBiQm9sZCA9IFRSVUUpOworICBGWF9CT09MIFNldFJpY2hUZXh0SXRhbGljKEZYX0JPT0wgYkl0YWxpYyA9IFRSVUUpOworICBGWF9CT09MIFNldFJpY2hUZXh0VW5kZXJsaW5lKEZYX0JPT0wgYlVuZGVybGluZSA9IFRSVUUpOworICBGWF9CT09MIFNldFJpY2hUZXh0Q3Jvc3NvdXQoRlhfQk9PTCBiQ3Jvc3NvdXQgPSBUUlVFKTsKKyAgRlhfQk9PTCBTZXRSaWNoVGV4dENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKTsKKyAgRlhfQk9PTCBTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApOworICBGWF9CT09MIFNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKTsKKyAgRlhfQk9PTCBTZXRSaWNoVGV4dExpbmVJbmRlbnQoRlhfRkxPQVQgZkxpbmVJbmRlbnQpOworICBGWF9CT09MIFNldFJpY2hUZXh0QWxpZ25tZW50KGludDMyX3QgbkFsaWdubWVudCk7CiAKLQl2b2lkCQkJCQkJCQkJT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfVVAoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfRE9XTihGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCQkJT25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJCQlPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJCQlPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOworICB2b2lkIE9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCk7CisgIHZvaWQgT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKTsKKyAgdm9pZCBPblZLX1VQKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKTsKKyAgdm9pZCBPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpOworICB2b2lkIE9uVktfTEVGVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCk7CisgIHZvaWQgT25WS19SSUdIVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCk7CisgIHZvaWQgT25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKTsKKyAgdm9pZCBPblZLX0VORChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCk7CiAKLQl2b2lkCQkJCQkJCQkJU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCxpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCi0JCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0JRlhfQk9PTAkJCQkJCQkJCUluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOwotCUZYX0JPT0wJCQkJCQkJCQlJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0JRlhfQk9PTAkJCQkJCQkJCUJhY2tzcGFjZSgpOwotCUZYX0JPT0wJCQkJCQkJCQlEZWxldGUoKTsKLQlGWF9CT09MCQkJCQkJCQkJQ2xlYXIoKTsKLQlGWF9CT09MCQkJCQkJCQkJRW1wdHkoKTsKLQlGWF9CT09MCQkJCQkJCQkJSW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAotCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOwotCUZYX0JPT0wJCQkJCQkJCQlSZWRvKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVVuZG8oKTsKLQlDUFZUX1dvcmRQbGFjZQkJCQkJCQlEb0luc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0LAotCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzKTsKLQlpbnQzMl90CQkJCQkJCQlHZXRDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KTsKKyAgdm9pZCBTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAorICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzID0gTlVMTCwKKyAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzID0gTlVMTCk7CisgIEZYX0JPT0wgSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpOworICBGWF9CT09MIEluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpOworICBGWF9CT09MIEJhY2tzcGFjZSgpOworICBGWF9CT09MIERlbGV0ZSgpOworICBGWF9CT09MIENsZWFyKCk7CisgIEZYX0JPT0wgRW1wdHkoKTsKKyAgRlhfQk9PTCBJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzID0gTlVMTCk7CisgIEZYX0JPT0wgUmVkbygpOworICBGWF9CT09MIFVuZG8oKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgRG9JbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpOworICBpbnQzMl90IEdldENoYXJTZXRGcm9tVW5pY29kZShGWF9XT1JEIHdvcmQsIGludDMyX3Qgbk9sZENoYXJzZXQpOwogCi0JaW50MzJfdAkJCQkJCQkJV29yZFBsYWNlVG9Xb3JkSW5kZXgoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0JQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJV29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3Q7CisgIGludDMyX3QgV29yZFBsYWNlVG9Xb3JkSW5kZXgoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgV29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3Q7CiAKLQlDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLQlDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0JQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0U2VjdGlvbkJlZ2luUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0JQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0U2VjdGlvbkVuZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotCUNQVlRfV29yZFBsYWNlCQkJCQkJCVNlYXJjaFdvcmRQbGFjZShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7CisgIENQVlRfV29yZFBsYWNlIEdldExpbmVCZWdpblBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3Q7CisgIENQVlRfV29yZFBsYWNlIEdldExpbmVFbmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBHZXRTZWN0aW9uQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBHZXRTZWN0aW9uRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgU2VhcmNoV29yZFBsYWNlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKIAotCWludDMyX3QJCQkJCQkJCUdldENhcmV0KCkgY29uc3Q7Ci0JQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0Q2FyZXRXb3JkUGxhY2UoKSBjb25zdDsKLQlDRlhfV2lkZVN0cmluZwkJCQkJCQlHZXRTZWxUZXh0KCkgY29uc3Q7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCQkJR2V0VGV4dCgpIGNvbnN0OwotCUZYX0ZMT0FUCQkJCQkJCQlHZXRGb250U2l6ZSgpIGNvbnN0OwotCUZYX1dPUkQJCQkJCQkJCQlHZXRQYXNzd29yZENoYXIoKSBjb25zdDsKLQlDUERGX1BvaW50CQkJCQkJCQlHZXRTY3JvbGxQb3MoKSBjb25zdDsKLQlpbnQzMl90CQkJCQkJCQlHZXRDaGFyQXJyYXkoKSBjb25zdDsKLQlDUERGX1JlY3QJCQkJCQkJCUdldFBsYXRlUmVjdCgpIGNvbnN0OwotCUNQREZfUmVjdAkJCQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdDsKLQlDRlhfV2lkZVN0cmluZwkJCQkJCQlHZXRSYW5nZVRleHQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSkgY29uc3Q7Ci0JaW50MzJfdAkJCQkJCQkJR2V0SG9yelNjYWxlKCkgY29uc3Q7Ci0JRlhfRkxPQVQJCQkJCQkJCUdldENoYXJTcGFjZSgpIGNvbnN0OwotCWludDMyX3QJCQkJCQkJCUdldFRvdGFsV29yZHMoKSBjb25zdDsKLQlpbnQzMl90CQkJCQkJCQlHZXRUb3RhbExpbmVzKCkgY29uc3Q7CisgIGludDMyX3QgR2V0Q2FyZXQoKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0Q2FyZXRXb3JkUGxhY2UoKSBjb25zdDsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0U2VsVGV4dCgpIGNvbnN0OworICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3Q7CisgIEZYX1dPUkQgR2V0UGFzc3dvcmRDaGFyKCkgY29uc3Q7CisgIENQREZfUG9pbnQgR2V0U2Nyb2xsUG9zKCkgY29uc3Q7CisgIGludDMyX3QgR2V0Q2hhckFycmF5KCkgY29uc3Q7CisgIENQREZfUmVjdCBHZXRQbGF0ZVJlY3QoKSBjb25zdDsKKyAgQ1BERl9SZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Q7CisgIENGWF9XaWRlU3RyaW5nIEdldFJhbmdlVGV4dChjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpIGNvbnN0OworICBpbnQzMl90IEdldEhvcnpTY2FsZSgpIGNvbnN0OworICBGWF9GTE9BVCBHZXRDaGFyU3BhY2UoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRUb3RhbFdvcmRzKCkgY29uc3Q7CisgIGludDMyX3QgR2V0VG90YWxMaW5lcygpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQkJCVNldFNlbChpbnQzMl90IG5TdGFydENoYXIsaW50MzJfdCBuRW5kQ2hhcik7Ci0Jdm9pZAkJCQkJCQkJCUdldFNlbChpbnQzMl90ICYgblN0YXJ0Q2hhciwgaW50MzJfdCAmIG5FbmRDaGFyKSBjb25zdDsKKyAgdm9pZCBTZXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKTsKKyAgdm9pZCBHZXRTZWwoaW50MzJfdCYgblN0YXJ0Q2hhciwgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0OwogCi1wcml2YXRlOgotCXZvaWQJCQkJCQkJCQlTZWxlY3RBbGwoKTsKLQl2b2lkCQkJCQkJCQkJU2VsZWN0Tm9uZSgpOwotCXZvaWQJCQkJCQkJCQlTZXRTZWwoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBiZWdpbixjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGVuZCk7Ci0JRlhfQk9PTAkJCQkJCQkJCUlzU2VsZWN0ZWQoKSBjb25zdDsKKyBwcml2YXRlOgorICB2b2lkIFNlbGVjdEFsbCgpOworICB2b2lkIFNlbGVjdE5vbmUoKTsKKyAgdm9pZCBTZXRTZWwoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKTsKKyAgRlhfQk9PTCBJc1NlbGVjdGVkKCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCQkJUmVhcnJhbmdlQWxsKCk7Ci0Jdm9pZAkJCQkJCQkJCVJlYXJyYW5nZVBhcnQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSk7Ci0Jdm9pZAkJCQkJCQkJCVBhaW50KCk7Ci0Jdm9pZAkJCQkJCQkJCVNjcm9sbFRvQ2FyZXQoKTsKLQl2b2lkCQkJCQkJCQkJU2V0U2Nyb2xsSW5mbygpOwotCXZvaWQJCQkJCQkJCQlTZXRTY3JvbGxQb3NYKEZYX0ZMT0FUIGZ4KTsKLQl2b2lkCQkJCQkJCQkJU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSk7Ci0Jdm9pZAkJCQkJCQkJCVNldFNjcm9sbExpbWl0KCk7Ci0Jdm9pZAkJCQkJCQkJCVNldENvbnRlbnRDaGFuZ2VkKCk7Ci0Jdm9pZAkJCQkJCQkJCUVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpOworICB2b2lkIFJlYXJyYW5nZUFsbCgpOworICB2b2lkIFJlYXJyYW5nZVBhcnQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKTsKKyAgdm9pZCBQYWludCgpOworICB2b2lkIFNjcm9sbFRvQ2FyZXQoKTsKKyAgdm9pZCBTZXRTY3JvbGxJbmZvKCk7CisgIHZvaWQgU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCk7CisgIHZvaWQgU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSk7CisgIHZvaWQgU2V0U2Nyb2xsTGltaXQoKTsKKyAgdm9pZCBTZXRDb250ZW50Q2hhbmdlZCgpOworICB2b2lkIEVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpOwogCi0Jdm9pZAkJCQkJCQkJCVNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsaW50MzJfdCBjaGFyc2V0LAotCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJQmFja3NwYWNlKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJRGVsZXRlKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJQ2xlYXIoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOwotCUZYX0JPT0wJCQkJCQkJCQlJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LCBpbnQzMl90IGNoYXJzZXQsCi0JCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyxGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywKLQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFNlY1Byb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsCi0JCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIEZYX0JPT0wgYkFkZFVuZG8pOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRXb3JkUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwKLQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ciwgRlhfQk9PTCBiQWRkVW5kbyk7Ci0Jdm9pZAkJCQkJCQkJCVBhaW50U2V0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cik7Ci0Jdm9pZAkJCQkJCQkJCVBhaW50SW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3KTsKKyAgdm9pZCBTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMsCisgICAgICAgICAgICAgICBGWF9CT09MIGJBZGRVbmRvLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQpOworICBGWF9CT09MIEluc2VydFdvcmQoRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGRVbmRvLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQpOworICBGWF9CT09MIEluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGRVbmRvLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCk7CisgIEZYX0JPT0wgQmFja3NwYWNlKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKKyAgRlhfQk9PTCBEZWxldGUoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOworICBGWF9CT09MIENsZWFyKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKKyAgRlhfQk9PTCBJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGRVbmRvLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQpOworICBGWF9CT09MIFNldFJpY2hUZXh0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKTsKKyAgRlhfQk9PTCBTZXRTZWNQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkZFVuZG8pOworICBGWF9CT09MIFNldFdvcmRQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkZFVuZG8pOworICB2b2lkIFBhaW50U2V0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyKTsKKyAgdm9pZCBQYWludEluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXcpOwogCi0JaW5saW5lIENQREZfUG9pbnQJCQkJCQlWVFRvRWRpdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwotCWlubGluZSBDUERGX1BvaW50CQkJCQkJRWRpdFRvVlQoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLQlpbmxpbmUgQ1BERl9SZWN0CQkJCQkJVlRUb0VkaXQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgY29uc3Q7Ci0JaW5saW5lIENQREZfUmVjdAkJCQkJCUVkaXRUb1ZUKGNvbnN0IENQREZfUmVjdCAmIHJlY3QpIGNvbnN0OworICBpbmxpbmUgQ1BERl9Qb2ludCBWVFRvRWRpdChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7CisgIGlubGluZSBDUERGX1BvaW50IEVkaXRUb1ZUKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgaW5saW5lIENQREZfUmVjdCBWVFRvRWRpdChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0OworICBpbmxpbmUgQ1BERl9SZWN0IEVkaXRUb1ZUKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCQkJRW5hYmxlUmVmcmVzaChGWF9CT09MIGJSZWZyZXNoKTsKLQl2b2lkCQkJCQkJCQkJUmVmcmVzaChSRUZSRVNIX1BMQU5fRSBlUGxhbixjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZTEgPSBOVUxMLGNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlMiA9IE5VTEwpOwotCXZvaWQJCQkJCQkJCQlSZWZyZXNoUHVzaExpbmVSZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKTsKLQl2b2lkCQkJCQkJCQkJUmVmcmVzaFB1c2hSYW5kb21SZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKTsKLQl2b2lkCQkJCQkJCQkJUmVmcmVzaFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpOworICB2b2lkIEVuYWJsZVJlZnJlc2goRlhfQk9PTCBiUmVmcmVzaCk7CisgIHZvaWQgUmVmcmVzaChSRUZSRVNIX1BMQU5fRSBlUGxhbiwKKyAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UxID0gTlVMTCwKKyAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UyID0gTlVMTCk7CisgIHZvaWQgUmVmcmVzaFB1c2hMaW5lUmVjdHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyKTsKKyAgdm9pZCBSZWZyZXNoUHVzaFJhbmRvbVJlY3RzKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cik7CisgIHZvaWQgUmVmcmVzaFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpOwogCi0Jdm9pZAkJCQkJCQkJCVNldENhcmV0KGludDMyX3QgblBvcyk7Ci0Jdm9pZAkJCQkJCQkJCVNldENhcmV0KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwotCXZvaWQJCQkJCQkJCQlTZXRDYXJldEluZm8oKTsKLQl2b2lkCQkJCQkJCQkJU2V0Q2FyZXRPcmlnaW4oKTsKLQl2b2lkCQkJCQkJCQkJU2V0Q2FyZXRDaGFuZ2UoKTsKKyAgdm9pZCBTZXRDYXJldChpbnQzMl90IG5Qb3MpOworICB2b2lkIFNldENhcmV0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisgIHZvaWQgU2V0Q2FyZXRJbmZvKCk7CisgIHZvaWQgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgdm9pZCBTZXRDYXJldENoYW5nZSgpOwogCi0JQ1BWVF9Xb3JkUmFuZ2UJCQkJCQkJR2V0V2hvbGVXb3JkUmFuZ2UoKSBjb25zdDsKLQlDUFZUX1dvcmRSYW5nZQkJCQkJCQlHZXRWaXNpYmxlV29yZFJhbmdlKCkgY29uc3Q7Ci0JQ1BWVF9Xb3JkUmFuZ2UJCQkJCQkJR2V0TGF0aW5Xb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotCUNQVlRfV29yZFJhbmdlCQkJCQkJCUNvbWJpbmVXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cjEsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IyKTsKLQlDUFZUX1dvcmRSYW5nZQkJCQkJCQlHZXRTZWxlY3RXb3JkUmFuZ2UoKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUmFuZ2UgR2V0V2hvbGVXb3JkUmFuZ2UoKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUmFuZ2UgR2V0VmlzaWJsZVdvcmRSYW5nZSgpIGNvbnN0OworICBDUFZUX1dvcmRSYW5nZSBHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUmFuZ2UgQ29tYmluZVdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpOworICBDUFZUX1dvcmRSYW5nZSBHZXRTZWxlY3RXb3JkUmFuZ2UoKSBjb25zdDsKIAotCXZvaWQJCQkJCQkJCQlFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pOwotCXZvaWQJCQkJCQkJCQlFbmFibGVPcHJOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KTsKKyAgdm9pZCBFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pOworICB2b2lkIEVuYWJsZU9wck5vdGlmeShGWF9CT09MIGJOb3RpZnkpOwogCi0JRlhfQk9PTAkJCQkJCQkJCUlzVGV4dEZ1bGwoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJSXNUZXh0T3ZlcmZsb3coKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJQ2FuVW5kbygpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlDYW5SZWRvKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKKyAgRlhfQk9PTCBJc1RleHRGdWxsKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNUZXh0T3ZlcmZsb3coKSBjb25zdDsKKyAgRlhfQk9PTCBDYW5VbmRvKCkgY29uc3Q7CisgIEZYX0JPT0wgQ2FuUmVkbygpIGNvbnN0OworICBGWF9CT09MIElzTW9kaWZpZWQoKSBjb25zdDsKIAotCXZvaWQJCQkJCQkJCQlCZWdpbkdyb3VwVW5kbyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RpdGxlKTsKLQl2b2lkCQkJCQkJCQkJRW5kR3JvdXBVbmRvKCk7Ci0Jdm9pZAkJCQkJCQkJCUFkZEVkaXRVbmRvSXRlbShDRlhfRWRpdF9VbmRvSXRlbSogcEVkaXRVbmRvSXRlbSk7Ci0Jdm9pZAkJCQkJCQkJCUFkZFVuZG9JdGVtKElGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0pOworICB2b2lkIEJlZ2luR3JvdXBVbmRvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGl0bGUpOworICB2b2lkIEVuZEdyb3VwVW5kbygpOworICB2b2lkIEFkZEVkaXRVbmRvSXRlbShDRlhfRWRpdF9VbmRvSXRlbSogcEVkaXRVbmRvSXRlbSk7CisgIHZvaWQgQWRkVW5kb0l0ZW0oSUZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSk7CiAKLQl2b2lkCQkJCQkJCQkJU2V0UGFnZUluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKLQlDUFZUX1dvcmRQbGFjZQkJCQkJCQlTZWFyY2hQYWdlRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwUGFnZUJlZ2luLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7Ci0JRlhfRkxPQVQJCQkJCQkJCUdldExpbmVUb3AoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKLQlGWF9GTE9BVAkJCQkJCQkJR2V0TGluZUJvdHRvbShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICB2b2lkIFNldFBhZ2VJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisgIENQVlRfV29yZFBsYWNlIFNlYXJjaFBhZ2VFbmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BQYWdlQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldExpbmVUb3AoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0TGluZUJvdHRvbShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OwogCi1wcml2YXRlOgotCUlQREZfVmFyaWFibGVUZXh0KgkJCQkJCW1fcFZUOwotCUlGWF9FZGl0X05vdGlmeSoJCQkJCQltX3BOb3RpZnk7Ci0JSUZYX0VkaXRfT3ByTm90aWZ5KgkJCQkJCW1fcE9wck5vdGlmeTsKLQlDRlhfRWRpdF9Qcm92aWRlcioJCQkJCQltX3BWVFByb3ZpZGU7CisgcHJpdmF0ZToKKyAgSVBERl9WYXJpYWJsZVRleHQqIG1fcFZUOworICBJRlhfRWRpdF9Ob3RpZnkqIG1fcE5vdGlmeTsKKyAgSUZYX0VkaXRfT3ByTm90aWZ5KiBtX3BPcHJOb3RpZnk7CisgIENGWF9FZGl0X1Byb3ZpZGVyKiBtX3BWVFByb3ZpZGU7CiAKLQlDUFZUX1dvcmRQbGFjZQkJCQkJCQltX3dwQ2FyZXQ7Ci0JQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJbV93cE9sZENhcmV0OwotCUNGWF9FZGl0X1NlbGVjdAkJCQkJCQltX1NlbFN0YXRlOworICBDUFZUX1dvcmRQbGFjZSBtX3dwQ2FyZXQ7CisgIENQVlRfV29yZFBsYWNlIG1fd3BPbGRDYXJldDsKKyAgQ0ZYX0VkaXRfU2VsZWN0IG1fU2VsU3RhdGU7CiAKLQlDUERGX1BvaW50CQkJCQkJCQltX3B0U2Nyb2xsUG9zOwotCUNQREZfUG9pbnQJCQkJCQkJCW1fcHRSZWZyZXNoU2Nyb2xsUG9zOwotCUZYX0JPT0wJCQkJCQkJCQltX2JFbmFibGVTY3JvbGw7Ci0JSUZYX0VkaXRfSXRlcmF0b3IgKgkJCQkJCW1fcEl0ZXJhdG9yOwotCUNGWF9FZGl0X1JlZnJlc2gJCQkJCQltX1JlZnJlc2g7Ci0JQ1BERl9Qb2ludAkJCQkJCQkJbV9wdENhcmV0OwotCUNGWF9FZGl0X1VuZG8JCQkJCQkJbV9VbmRvOwotCWludDMyX3QJCQkJCQkJCW1fbkFsaWdubWVudDsKLQlGWF9CT09MCQkJCQkJCQkJbV9iTm90aWZ5RmxhZzsKLQlGWF9CT09MCQkJCQkJCQkJbV9iRW5hYmxlT3ZlcmZsb3c7Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYkVuYWJsZVJlZnJlc2g7Ci0JQ1BERl9SZWN0CQkJCQkJCQltX3JjT2xkQ29udGVudDsKLQlGWF9CT09MCQkJCQkJCQkJbV9iRW5hYmxlVW5kbzsKLQlGWF9CT09MCQkJCQkJCQkJbV9iTm90aWZ5OwotCUZYX0JPT0wJCQkJCQkJCQltX2JPcHJOb3RpZnk7Ci0JQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbSoJCQkJCW1fcEdyb3VwVW5kb0l0ZW07CisgIENQREZfUG9pbnQgbV9wdFNjcm9sbFBvczsKKyAgQ1BERl9Qb2ludCBtX3B0UmVmcmVzaFNjcm9sbFBvczsKKyAgRlhfQk9PTCBtX2JFbmFibGVTY3JvbGw7CisgIElGWF9FZGl0X0l0ZXJhdG9yKiBtX3BJdGVyYXRvcjsKKyAgQ0ZYX0VkaXRfUmVmcmVzaCBtX1JlZnJlc2g7CisgIENQREZfUG9pbnQgbV9wdENhcmV0OworICBDRlhfRWRpdF9VbmRvIG1fVW5kbzsKKyAgaW50MzJfdCBtX25BbGlnbm1lbnQ7CisgIEZYX0JPT0wgbV9iTm90aWZ5RmxhZzsKKyAgRlhfQk9PTCBtX2JFbmFibGVPdmVyZmxvdzsKKyAgRlhfQk9PTCBtX2JFbmFibGVSZWZyZXNoOworICBDUERGX1JlY3QgbV9yY09sZENvbnRlbnQ7CisgIEZYX0JPT0wgbV9iRW5hYmxlVW5kbzsKKyAgRlhfQk9PTCBtX2JOb3RpZnk7CisgIEZYX0JPT0wgbV9iT3ByTm90aWZ5OworICBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtKiBtX3BHcm91cFVuZG9JdGVtOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfRWRpdF9JdGVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWNsYXNzIENGWF9FZGl0X0l0ZXJhdG9yIDogcHVibGljIElGWF9FZGl0X0l0ZXJhdG9yCi17Ci1wdWJsaWM6Ci0JQ0ZYX0VkaXRfSXRlcmF0b3IoQ0ZYX0VkaXQgKiBwRWRpdCxJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBWVEl0ZXJhdG9yKTsKLQl2aXJ0dWFsIH5DRlhfRWRpdF9JdGVyYXRvcigpOworY2xhc3MgQ0ZYX0VkaXRfSXRlcmF0b3IgOiBwdWJsaWMgSUZYX0VkaXRfSXRlcmF0b3IgeworIHB1YmxpYzoKKyAgQ0ZYX0VkaXRfSXRlcmF0b3IoQ0ZYX0VkaXQqIHBFZGl0LCBJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcFZUSXRlcmF0b3IpOworICB2aXJ0dWFsIH5DRlhfRWRpdF9JdGVyYXRvcigpOwogCi0JRlhfQk9PTAkJCQkJCQkJCU5leHRXb3JkKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU5leHRMaW5lKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU5leHRTZWN0aW9uKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVByZXZXb3JkKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVByZXZMaW5lKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVByZXZTZWN0aW9uKCk7CisgIEZYX0JPT0wgTmV4dFdvcmQoKTsKKyAgRlhfQk9PTCBOZXh0TGluZSgpOworICBGWF9CT09MIE5leHRTZWN0aW9uKCk7CisgIEZYX0JPT0wgUHJldldvcmQoKTsKKyAgRlhfQk9PTCBQcmV2TGluZSgpOworICBGWF9CT09MIFByZXZTZWN0aW9uKCk7CiAKLQlGWF9CT09MCQkJCQkJCQkJR2V0V29yZChDUFZUX1dvcmQgJiB3b3JkKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKSBjb25zdDsKLQl2b2lkCQkJCQkJCQkJU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KTsKLQl2b2lkCQkJCQkJCQkJU2V0QXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7Ci0JY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJgkJCQkJR2V0QXQoKSBjb25zdDsKLQlJRlhfRWRpdCoJCQkJCQkJCUdldEVkaXQoKSBjb25zdDsKKyAgRlhfQk9PTCBHZXRXb3JkKENQVlRfV29yZCYgd29yZCkgY29uc3Q7CisgIEZYX0JPT0wgR2V0TGluZShDUFZUX0xpbmUmIGxpbmUpIGNvbnN0OworICBGWF9CT09MIEdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uJiBzZWN0aW9uKSBjb25zdDsKKyAgdm9pZCBTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpOworICB2b2lkIFNldEF0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBHZXRBdCgpIGNvbnN0OworICBJRlhfRWRpdCogR2V0RWRpdCgpIGNvbnN0OwogCi1wcml2YXRlOgotCUNGWF9FZGl0ICoJCQkJCQkJCW1fcEVkaXQ7Ci0JSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqCQkJCW1fcFZUSXRlcmF0b3I7CisgcHJpdmF0ZToKKyAgQ0ZYX0VkaXQqIG1fcEVkaXQ7CisgIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBtX3BWVEl0ZXJhdG9yOwogfTsKIAotY2xhc3MgQ0ZYX0VkaXRfUHJvdmlkZXIgOiBwdWJsaWMgSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIKLXsKLXB1YmxpYzoKLQlDRlhfRWRpdF9Qcm92aWRlcihJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCk7Ci0JdmlydHVhbCB+Q0ZYX0VkaXRfUHJvdmlkZXIoKTsKK2NsYXNzIENGWF9FZGl0X1Byb3ZpZGVyIDogcHVibGljIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyIHsKKyBwdWJsaWM6CisgIENGWF9FZGl0X1Byb3ZpZGVyKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwKTsKKyAgdmlydHVhbCB+Q0ZYX0VkaXRfUHJvdmlkZXIoKTsKIAotCUlGWF9FZGl0X0ZvbnRNYXAqCQkJR2V0Rm9udE1hcCgpOworICBJRlhfRWRpdF9Gb250TWFwKiBHZXRGb250TWFwKCk7CiAKLQlpbnQzMl90CQkJCQlHZXRDaGFyV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQsIGludDMyX3QgbldvcmRTdHlsZSk7Ci0JaW50MzJfdAkJCQkJR2V0VHlwZUFzY2VudChpbnQzMl90IG5Gb250SW5kZXgpOwotCWludDMyX3QJCQkJCUdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCk7Ci0JaW50MzJfdAkJCQkJR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwgaW50MzJfdCBuRm9udEluZGV4KTsKLQlpbnQzMl90CQkJCQlHZXREZWZhdWx0Rm9udEluZGV4KCk7Ci0JRlhfQk9PTAkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCk7CisgIGludDMyX3QgR2V0Q2hhcldpZHRoKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkLCBpbnQzMl90IG5Xb3JkU3R5bGUpOworICBpbnQzMl90IEdldFR5cGVBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KTsKKyAgaW50MzJfdCBHZXRUeXBlRGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgpOworICBpbnQzMl90IEdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCk7CisgIGludDMyX3QgR2V0RGVmYXVsdEZvbnRJbmRleCgpOworICBGWF9CT09MIElzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCk7CiAKLXByaXZhdGU6Ci0JSUZYX0VkaXRfRm9udE1hcCoJCQltX3BGb250TWFwOworIHByaXZhdGU6CisgIElGWF9FZGl0X0ZvbnRNYXAqIG1fcEZvbnRNYXA7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GWEVESVRfRlhFVF9FRElUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2xpc3QuaAppbmRleCBmZTc1YjBmLi40YWEzNTY4IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9saXN0LmgKQEAgLTEyLDM1MyArMTIsMzM3IEBACiAKIGNsYXNzIElGWF9FZGl0OwogCi1jbGFzcyBDTFNUX1NpemUKLXsKLXB1YmxpYzoKLQlDTFNUX1NpemUoKSA6IHgoMC4wZiksIHkoMC4wZikKLQl7Ci0JfQorY2xhc3MgQ0xTVF9TaXplIHsKKyBwdWJsaWM6CisgIENMU1RfU2l6ZSgpIDogeCgwLjBmKSwgeSgwLjBmKSB7fQogCi0JQ0xTVF9TaXplKEZYX0ZMT0FUIG90aGVyX3gsIEZYX0ZMT0FUIG90aGVyX3kpCi0JewotCQl4ID0gb3RoZXJfeDsKLQkJeSA9IG90aGVyX3k7Ci0JfQorICBDTFNUX1NpemUoRlhfRkxPQVQgb3RoZXJfeCwgRlhfRkxPQVQgb3RoZXJfeSkgeworICAgIHggPSBvdGhlcl94OworICAgIHkgPSBvdGhlcl95OworICB9CiAKLQl2b2lkIERlZmF1bHQoKQotCXsKLQkJeCA9IDAuMGY7Ci0JCXkgPSAwLjBmOwotCX0KKyAgdm9pZCBEZWZhdWx0KCkgeworICAgIHggPSAwLjBmOworICAgIHkgPSAwLjBmOworICB9CiAKLQlGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDTFNUX1NpemUgJiBzaXplKSBjb25zdAotCXsKLQkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmc2l6ZSwgc2l6ZW9mKENMU1RfU2l6ZSkpICE9IDA7Ci0JfQorICBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ0xTVF9TaXplJiBzaXplKSBjb25zdCB7CisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmc2l6ZSwgc2l6ZW9mKENMU1RfU2l6ZSkpICE9IDA7CisgIH0KIAotCUZYX0ZMT0FUIHgseTsKKyAgRlhfRkxPQVQgeCwgeTsKIH07CiAKLWNsYXNzIENMU1RfUmVjdCA6IHB1YmxpYyBDUERGX1JlY3QKLXsKLXB1YmxpYzoKLQlDTFNUX1JlY3QoKQotCXsKLQkJbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMC4wZjsKLQl9CitjbGFzcyBDTFNUX1JlY3QgOiBwdWJsaWMgQ1BERl9SZWN0IHsKKyBwdWJsaWM6CisgIENMU1RfUmVjdCgpIHsgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMC4wZjsgfQogCi0gICAgQ0xTVF9SZWN0KEZYX0ZMT0FUIG90aGVyX2xlZnQsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3RvcCwKLSAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfcmlnaHQsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2JvdHRvbSkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSBvdGhlcl9sZWZ0OwotICAgICAgICB0b3AgPSBvdGhlcl90b3A7Ci0gICAgICAgIHJpZ2h0ID0gb3RoZXJfcmlnaHQ7Ci0gICAgICAgIGJvdHRvbSA9IG90aGVyX2JvdHRvbTsKLSAgICB9CisgIENMU1RfUmVjdChGWF9GTE9BVCBvdGhlcl9sZWZ0LAorICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfdG9wLAorICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfcmlnaHQsCisgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl9ib3R0b20pIHsKKyAgICBsZWZ0ID0gb3RoZXJfbGVmdDsKKyAgICB0b3AgPSBvdGhlcl90b3A7CisgICAgcmlnaHQgPSBvdGhlcl9yaWdodDsKKyAgICBib3R0b20gPSBvdGhlcl9ib3R0b207CisgIH0KIAotICAgIENMU1RfUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0KQotICAgIHsKLSAgICAgICAgbGVmdCA9IHJlY3QubGVmdDsKLSAgICAgICAgdG9wID0gcmVjdC50b3A7Ci0gICAgICAgIHJpZ2h0ID0gcmVjdC5yaWdodDsKLSAgICAgICAgYm90dG9tID0gcmVjdC5ib3R0b207Ci0gICAgfQorICBDTFNUX1JlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7CisgICAgbGVmdCA9IHJlY3QubGVmdDsKKyAgICB0b3AgPSByZWN0LnRvcDsKKyAgICByaWdodCA9IHJlY3QucmlnaHQ7CisgICAgYm90dG9tID0gcmVjdC5ib3R0b207CisgIH0KIAotCXZvaWQgRGVmYXVsdCgpCi0JewotCQlsZWZ0ID0gdG9wID0gcmlnaHQgPSBib3R0b20gPSAwLjBmOwotCX0KKyAgdm9pZCBEZWZhdWx0KCkgeyBsZWZ0ID0gdG9wID0gcmlnaHQgPSBib3R0b20gPSAwLjBmOyB9CiAKLQljb25zdCBDTFNUX1JlY3Qgb3BlcmF0b3IgPSAoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLQl7Ci0JCWxlZnQgPSByZWN0LmxlZnQ7Ci0JCXRvcCA9IHJlY3QudG9wOwotCQlyaWdodCA9IHJlY3QucmlnaHQ7Ci0JCWJvdHRvbSA9IHJlY3QuYm90dG9tOworICBjb25zdCBDTFNUX1JlY3Qgb3BlcmF0b3I9KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICAgIGxlZnQgPSByZWN0LmxlZnQ7CisgICAgdG9wID0gcmVjdC50b3A7CisgICAgcmlnaHQgPSByZWN0LnJpZ2h0OworICAgIGJvdHRvbSA9IHJlY3QuYm90dG9tOwogCi0JCXJldHVybiAqdGhpczsKLQl9CisgICAgcmV0dXJuICp0aGlzOworICB9CiAKLQlGWF9CT09MIG9wZXJhdG9yID09IChjb25zdCBDTFNUX1JlY3QgJiByZWN0KSBjb25zdAotCXsKLQkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmcmVjdCwgc2l6ZW9mKENMU1RfUmVjdCkpID09IDA7Ci0JfQorICBGWF9CT09MIG9wZXJhdG9yPT0oY29uc3QgQ0xTVF9SZWN0JiByZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmcmVjdCwgc2l6ZW9mKENMU1RfUmVjdCkpID09IDA7CisgIH0KIAotCUZYX0JPT0wgb3BlcmF0b3IgIT0gKGNvbnN0IENMU1RfUmVjdCAmIHJlY3QpIGNvbnN0Ci0JewotCQlyZXR1cm4gRlhTWVNfbWVtY21wKHRoaXMsICZyZWN0LCBzaXplb2YoQ0xTVF9SZWN0KSkgIT0gMDsKLQl9CisgIEZYX0JPT0wgb3BlcmF0b3IhPShjb25zdCBDTFNUX1JlY3QmIHJlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gRlhTWVNfbWVtY21wKHRoaXMsICZyZWN0LCBzaXplb2YoQ0xTVF9SZWN0KSkgIT0gMDsKKyAgfQogCi0JRlhfRkxPQVQgV2lkdGgoKSBjb25zdAotCXsKLQkJcmV0dXJuIHJpZ2h0IC0gbGVmdDsKLQl9CisgIEZYX0ZMT0FUIFdpZHRoKCkgY29uc3QgeyByZXR1cm4gcmlnaHQgLSBsZWZ0OyB9CiAKLQlGWF9GTE9BVCBIZWlnaHQoKSBjb25zdAotCXsKLQkJaWYgKHRvcCA+IGJvdHRvbSkKLQkJCXJldHVybiB0b3AgLSBib3R0b207Ci0JCXJldHVybiBib3R0b20gLSB0b3A7Ci0JfQorICBGWF9GTE9BVCBIZWlnaHQoKSBjb25zdCB7CisgICAgaWYgKHRvcCA+IGJvdHRvbSkKKyAgICAgIHJldHVybiB0b3AgLSBib3R0b207CisgICAgcmV0dXJuIGJvdHRvbSAtIHRvcDsKKyAgfQogCi0JQ1BERl9Qb2ludCBMZWZ0VG9wKCkgY29uc3QKLQl7Ci0JCXJldHVybiBDUERGX1BvaW50KGxlZnQsdG9wKTsKLQl9CisgIENQREZfUG9pbnQgTGVmdFRvcCgpIGNvbnN0IHsgcmV0dXJuIENQREZfUG9pbnQobGVmdCwgdG9wKTsgfQogCi0JQ1BERl9Qb2ludCBSaWdodEJvdHRvbSgpIGNvbnN0Ci0JewotCQlyZXR1cm4gQ1BERl9Qb2ludChyaWdodCxib3R0b20pOwotCX0KKyAgQ1BERl9Qb2ludCBSaWdodEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIENQREZfUG9pbnQocmlnaHQsIGJvdHRvbSk7IH0KIAotCWNvbnN0IENMU1RfUmVjdCBvcGVyYXRvciArPSAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotCXsKLQkJbGVmdCArPSBwb2ludC54OwotCQlyaWdodCArPSBwb2ludC54OwotCQl0b3AgKz0gcG9pbnQueTsKLQkJYm90dG9tICs9IHBvaW50Lnk7CisgIGNvbnN0IENMU1RfUmVjdCBvcGVyYXRvcis9KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgICAgbGVmdCArPSBwb2ludC54OworICAgIHJpZ2h0ICs9IHBvaW50Lng7CisgICAgdG9wICs9IHBvaW50Lnk7CisgICAgYm90dG9tICs9IHBvaW50Lnk7CiAKLQkJcmV0dXJuICp0aGlzOwotCX0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KIAotCWNvbnN0IENMU1RfUmVjdCBvcGVyYXRvciAtPSAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotCXsKLQkJbGVmdCAtPSBwb2ludC54OwotCQlyaWdodCAtPSBwb2ludC54OwotCQl0b3AgLT0gcG9pbnQueTsKLQkJYm90dG9tIC09IHBvaW50Lnk7CisgIGNvbnN0IENMU1RfUmVjdCBvcGVyYXRvci09KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgICAgbGVmdCAtPSBwb2ludC54OworICAgIHJpZ2h0IC09IHBvaW50Lng7CisgICAgdG9wIC09IHBvaW50Lnk7CisgICAgYm90dG9tIC09IHBvaW50Lnk7CiAKLQkJcmV0dXJuICp0aGlzOwotCX0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KIAotCUNMU1RfUmVjdCBvcGVyYXRvciArIChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci0JewotCQlyZXR1cm4gQ0xTVF9SZWN0KGxlZnQgKyBwb2ludC54LAotCQkJCQl0b3AgKyBwb2ludC55LAotCQkJCQlyaWdodCArIHBvaW50LngsCi0JCQkJCWJvdHRvbSArIHBvaW50LnkpOwotCX0KKyAgQ0xTVF9SZWN0IG9wZXJhdG9yKyhjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICAgIHJldHVybiBDTFNUX1JlY3QobGVmdCArIHBvaW50LngsIHRvcCArIHBvaW50LnksIHJpZ2h0ICsgcG9pbnQueCwKKyAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSArIHBvaW50LnkpOworICB9CiAKLQlDTFNUX1JlY3Qgb3BlcmF0b3IgLSAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdAotCXsKLQkJcmV0dXJuIENMU1RfUmVjdChsZWZ0IC0gcG9pbnQueCwKLQkJCQkJdG9wIC0gcG9pbnQueSwKLQkJCQkJcmlnaHQgLSBwb2ludC54LAotCQkJCQlib3R0b20gLSBwb2ludC55KTsKLQl9CisgIENMU1RfUmVjdCBvcGVyYXRvci0oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgICByZXR1cm4gQ0xTVF9SZWN0KGxlZnQgLSBwb2ludC54LCB0b3AgLSBwb2ludC55LCByaWdodCAtIHBvaW50LngsCisgICAgICAgICAgICAgICAgICAgICBib3R0b20gLSBwb2ludC55KTsKKyAgfQogfTsKIAotY2xhc3MgQ0ZYX0xpc3RJdGVtCi17Ci1wdWJsaWM6Ci0JQ0ZYX0xpc3RJdGVtKCk7Ci0JdmlydHVhbCB+Q0ZYX0xpc3RJdGVtKCk7CitjbGFzcyBDRlhfTGlzdEl0ZW0geworIHB1YmxpYzoKKyAgQ0ZYX0xpc3RJdGVtKCk7CisgIHZpcnR1YWwgfkNGWF9MaXN0SXRlbSgpOwogCi0Jdm9pZAkJCQkJCQlTZXRGb250TWFwKElGWF9FZGl0X0ZvbnRNYXAgKiBwRm9udE1hcCk7Ci0JSUZYX0VkaXRfSXRlcmF0b3IqCQkJCUdldEl0ZXJhdG9yKCkgY29uc3Q7Ci0JSUZYX0VkaXQqCQkJCQkJR2V0RWRpdCgpIGNvbnN0OworICB2b2lkIFNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXApOworICBJRlhfRWRpdF9JdGVyYXRvciogR2V0SXRlcmF0b3IoKSBjb25zdDsKKyAgSUZYX0VkaXQqIEdldEVkaXQoKSBjb25zdDsKIAotcHVibGljOgotCXZvaWQJCQkJCQkJU2V0UmVjdChjb25zdCBDTFNUX1JlY3QgJiByZWN0KTsKLQl2b2lkCQkJCQkJCVNldFNlbGVjdChGWF9CT09MIGJTZWxlY3RlZCk7Ci0Jdm9pZAkJCQkJCQlTZXRDYXJldChGWF9CT09MIGJDYXJldCk7Ci0Jdm9pZAkJCQkJCQlTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0KTsKLQl2b2lkCQkJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdDsKKyBwdWJsaWM6CisgIHZvaWQgU2V0UmVjdChjb25zdCBDTFNUX1JlY3QmIHJlY3QpOworICB2b2lkIFNldFNlbGVjdChGWF9CT09MIGJTZWxlY3RlZCk7CisgIHZvaWQgU2V0Q2FyZXQoRlhfQk9PTCBiQ2FyZXQpOworICB2b2lkIFNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQpOworICB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKIAotCUNMU1RfUmVjdAkJCQkJCUdldFJlY3QoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzU2VsZWN0ZWQoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzQ2FyZXQoKSBjb25zdDsKLQlGWF9GTE9BVAkJCQkJCUdldEl0ZW1IZWlnaHQoKSBjb25zdDsKLQlGWF9XT1JECQkJCQkJCUdldEZpcnN0Q2hhcigpIGNvbnN0OworICBDTFNUX1JlY3QgR2V0UmVjdCgpIGNvbnN0OworICBGWF9CT09MIElzU2VsZWN0ZWQoKSBjb25zdDsKKyAgRlhfQk9PTCBJc0NhcmV0KCkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldEl0ZW1IZWlnaHQoKSBjb25zdDsKKyAgRlhfV09SRCBHZXRGaXJzdENoYXIoKSBjb25zdDsKIAotcHJpdmF0ZToKLQlJRlhfRWRpdCoJCQkJCQltX3BFZGl0OwotCUZYX0JPT0wJCQkJCQkJbV9iU2VsZWN0ZWQ7Ci0JRlhfQk9PTAkJCQkJCQltX2JDYXJldDsKLQlDTFNUX1JlY3QJCQkJCQltX3JjTGlzdEl0ZW07CisgcHJpdmF0ZToKKyAgSUZYX0VkaXQqIG1fcEVkaXQ7CisgIEZYX0JPT0wgbV9iU2VsZWN0ZWQ7CisgIEZYX0JPT0wgbV9iQ2FyZXQ7CisgIENMU1RfUmVjdCBtX3JjTGlzdEl0ZW07CiB9OwogCi1jbGFzcyBDRlhfTGlzdENvbnRhaW5lcgotewotcHVibGljOgotCUNGWF9MaXN0Q29udGFpbmVyKCkgOiBtX3JjUGxhdGUoMC4wZiwwLjBmLDAuMGYsMC4wZiksIG1fcmNDb250ZW50KDAuMGYsMC4wZiwwLjBmLDAuMGYpe30KLQl2aXJ0dWFsIH5DRlhfTGlzdENvbnRhaW5lcigpe30KLQl2aXJ0dWFsIHZvaWQJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0KXttX3JjUGxhdGUgPSByZWN0O30KLQlDUERGX1JlY3QJCQkJCQlHZXRQbGF0ZVJlY3QoKSBjb25zdHtyZXR1cm4gbV9yY1BsYXRlO30KLQl2b2lkCQkJCQkJCVNldENvbnRlbnRSZWN0KGNvbnN0IENMU1RfUmVjdCAmIHJlY3Qpe21fcmNDb250ZW50ID0gcmVjdDt9Ci0JQ0xTVF9SZWN0CQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdHtyZXR1cm4gbV9yY0NvbnRlbnQ7fQotCUNQREZfUG9pbnQJCQkJCQlHZXRCVFBvaW50KCkgY29uc3R7cmV0dXJuIENQREZfUG9pbnQobV9yY1BsYXRlLmxlZnQsbV9yY1BsYXRlLnRvcCk7fQotCUNQREZfUG9pbnQJCQkJCQlHZXRFVFBvaW50KCkgY29uc3R7cmV0dXJuIENQREZfUG9pbnQobV9yY1BsYXRlLnJpZ2h0LG1fcmNQbGF0ZS5ib3R0b20pO30KLXB1YmxpYzoKLQlDUERGX1BvaW50CQkJCQkJSW5uZXJUb091dGVyKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3R7cmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIEdldEJUUG9pbnQoKS54LEdldEJUUG9pbnQoKS55IC0gcG9pbnQueSk7fQotCUNQREZfUG9pbnQJCQkJCQlPdXRlclRvSW5uZXIoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdHtyZXR1cm4gQ1BERl9Qb2ludChwb2ludC54IC0gR2V0QlRQb2ludCgpLngsR2V0QlRQb2ludCgpLnkgLSBwb2ludC55KTt9Ci0JQ1BERl9SZWN0CQkJCQkJSW5uZXJUb091dGVyKGNvbnN0IENMU1RfUmVjdCAmIHJlY3QpIGNvbnN0e0NQREZfUG9pbnQgcHRMZWZ0VG9wID0gSW5uZXJUb091dGVyKENQREZfUG9pbnQocmVjdC5sZWZ0LHJlY3QudG9wKSk7Ci0JCQkJCQkJCQkJCQkJCQkJCQkJQ1BERl9Qb2ludCBwdFJpZ2h0Qm90dG9tID0gSW5uZXJUb091dGVyKENQREZfUG9pbnQocmVjdC5yaWdodCxyZWN0LmJvdHRvbSkpOwotCQkJCQkJCQkJCQkJCQkJCQkJCXJldHVybiBDUERGX1JlY3QocHRMZWZ0VG9wLngscHRSaWdodEJvdHRvbS55LHB0UmlnaHRCb3R0b20ueCxwdExlZnRUb3AueSk7fQotCUNMU1RfUmVjdAkJCQkJCU91dGVyVG9Jbm5lcihjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdHtDUERGX1BvaW50IHB0TGVmdFRvcCA9IE91dGVyVG9Jbm5lcihDUERGX1BvaW50KHJlY3QubGVmdCxyZWN0LnRvcCkpOwotCQkJCQkJCQkJCQkJCQkJCQkJCUNQREZfUG9pbnQgcHRSaWdodEJvdHRvbSA9IE91dGVyVG9Jbm5lcihDUERGX1BvaW50KHJlY3QucmlnaHQscmVjdC5ib3R0b20pKTsKLQkJCQkJCQkJCQkJCQkJCQkJCQlyZXR1cm4gQ0xTVF9SZWN0KHB0TGVmdFRvcC54LHB0TGVmdFRvcC55LHB0UmlnaHRCb3R0b20ueCxwdFJpZ2h0Qm90dG9tLnkpO30KLXByaXZhdGU6Ci0JQ1BERl9SZWN0CQkJCQkJbV9yY1BsYXRlOwotCUNMU1RfUmVjdAkJCQkJCW1fcmNDb250ZW50OwkJLy9wb3NpdGl2ZSBmb3JldmVyIQorY2xhc3MgQ0ZYX0xpc3RDb250YWluZXIgeworIHB1YmxpYzoKKyAgQ0ZYX0xpc3RDb250YWluZXIoKQorICAgICAgOiBtX3JjUGxhdGUoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiksCisgICAgICAgIG1fcmNDb250ZW50KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpIHt9CisgIHZpcnR1YWwgfkNGWF9MaXN0Q29udGFpbmVyKCkge30KKyAgdmlydHVhbCB2b2lkIFNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsgbV9yY1BsYXRlID0gcmVjdDsgfQorICBDUERGX1JlY3QgR2V0UGxhdGVSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9yY1BsYXRlOyB9CisgIHZvaWQgU2V0Q29udGVudFJlY3QoY29uc3QgQ0xTVF9SZWN0JiByZWN0KSB7IG1fcmNDb250ZW50ID0gcmVjdDsgfQorICBDTFNUX1JlY3QgR2V0Q29udGVudFJlY3QoKSBjb25zdCB7IHJldHVybiBtX3JjQ29udGVudDsgfQorICBDUERGX1BvaW50IEdldEJUUG9pbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIENQREZfUG9pbnQobV9yY1BsYXRlLmxlZnQsIG1fcmNQbGF0ZS50b3ApOworICB9CisgIENQREZfUG9pbnQgR2V0RVRQb2ludCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ1BERl9Qb2ludChtX3JjUGxhdGUucmlnaHQsIG1fcmNQbGF0ZS5ib3R0b20pOworICB9CisKKyBwdWJsaWM6CisgIENQREZfUG9pbnQgSW5uZXJUb091dGVyKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgICAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIEdldEJUUG9pbnQoKS54LCBHZXRCVFBvaW50KCkueSAtIHBvaW50LnkpOworICB9CisgIENQREZfUG9pbnQgT3V0ZXJUb0lubmVyKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgICAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCAtIEdldEJUUG9pbnQoKS54LCBHZXRCVFBvaW50KCkueSAtIHBvaW50LnkpOworICB9CisgIENQREZfUmVjdCBJbm5lclRvT3V0ZXIoY29uc3QgQ0xTVF9SZWN0JiByZWN0KSBjb25zdCB7CisgICAgQ1BERl9Qb2ludCBwdExlZnRUb3AgPSBJbm5lclRvT3V0ZXIoQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSk7CisgICAgQ1BERl9Qb2ludCBwdFJpZ2h0Qm90dG9tID0KKyAgICAgICAgSW5uZXJUb091dGVyKENQREZfUG9pbnQocmVjdC5yaWdodCwgcmVjdC5ib3R0b20pKTsKKyAgICByZXR1cm4gQ1BERl9SZWN0KHB0TGVmdFRvcC54LCBwdFJpZ2h0Qm90dG9tLnksIHB0UmlnaHRCb3R0b20ueCwKKyAgICAgICAgICAgICAgICAgICAgIHB0TGVmdFRvcC55KTsKKyAgfQorICBDTFNUX1JlY3QgT3V0ZXJUb0lubmVyKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICAgIENQREZfUG9pbnQgcHRMZWZ0VG9wID0gT3V0ZXJUb0lubmVyKENQREZfUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkpOworICAgIENQREZfUG9pbnQgcHRSaWdodEJvdHRvbSA9CisgICAgICAgIE91dGVyVG9Jbm5lcihDUERGX1BvaW50KHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKSk7CisgICAgcmV0dXJuIENMU1RfUmVjdChwdExlZnRUb3AueCwgcHRMZWZ0VG9wLnksIHB0UmlnaHRCb3R0b20ueCwKKyAgICAgICAgICAgICAgICAgICAgIHB0UmlnaHRCb3R0b20ueSk7CisgIH0KKworIHByaXZhdGU6CisgIENQREZfUmVjdCBtX3JjUGxhdGU7CisgIENMU1RfUmVjdCBtX3JjQ29udGVudDsgIC8vIHBvc2l0aXZlIGZvcmV2ZXIhCiB9OwogCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBjbGFzcyBDTFNUX0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT4KLXsKLXB1YmxpYzoKLQlGWF9CT09MIElzRW1wdHkoKSB7IHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7IH0KLQlUWVBFIEdldEF0KGludDMyX3QgbkluZGV4KSBjb25zdCB7IGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpKSByZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldEF0KG5JbmRleCk7IHJldHVybiBOVUxMO30KLQl2b2lkIFJlbW92ZUF0KGludDMyX3QgbkluZGV4KXtpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSkgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OlJlbW92ZUF0KG5JbmRleCk7fQordGVtcGxhdGUgPGNsYXNzIFRZUEU+CitjbGFzcyBDTFNUX0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT4geworIHB1YmxpYzoKKyAgRlhfQk9PTCBJc0VtcHR5KCkgeyByZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSA8PSAwOyB9CisgIFRZUEUgR2V0QXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsKKyAgICBpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSkKKyAgICAgIHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0QXQobkluZGV4KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB2b2lkIFJlbW92ZUF0KGludDMyX3QgbkluZGV4KSB7CisgICAgaWYgKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRTaXplKCkpCisgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6UmVtb3ZlQXQobkluZGV4KTsKKyAgfQogfTsKIAotY2xhc3MgQ0ZYX0xpc3QgOiBwcm90ZWN0ZWQgQ0ZYX0xpc3RDb250YWluZXIgLCBwdWJsaWMgSUZYX0xpc3QKLXsKLXB1YmxpYzoKLQlDRlhfTGlzdCgpOwotCXZpcnR1YWwgfkNGWF9MaXN0KCk7CitjbGFzcyBDRlhfTGlzdCA6IHByb3RlY3RlZCBDRlhfTGlzdENvbnRhaW5lciwgcHVibGljIElGWF9MaXN0IHsKKyBwdWJsaWM6CisgIENGWF9MaXN0KCk7CisgIHZpcnR1YWwgfkNGWF9MaXN0KCk7CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udE1hcChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCk7CisgIHZpcnR1YWwgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOwogCi0JdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0UGxhdGVSZWN0KCkgY29uc3Q7Ci0JdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdDsKKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0UGxhdGVSZWN0KCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Q7CiAKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7Ci0JdmlydHVhbCBJRlhfRWRpdCoJCQkJR2V0SXRlbUVkaXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwotCXZpcnR1YWwgaW50MzJfdAkJCQlHZXRDb3VudCgpIGNvbnN0OwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwotCXZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0Rmlyc3RIZWlnaHQoKSBjb25zdDsKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0OworICB2aXJ0dWFsIElGWF9FZGl0KiBHZXRJdGVtRWRpdChpbnQzMl90IG5JbmRleCkgY29uc3Q7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRDb3VudCgpIGNvbnN0OworICB2aXJ0dWFsIEZYX0JPT0wgSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0OworICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZpcnN0SGVpZ2h0KCkgY29uc3Q7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldE11bHRpcGxlU2VsKEZYX0JPT0wgYk11bHRpcGxlKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzTXVsdGlwbGVTZWwoKSBjb25zdDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKLQl2aXJ0dWFsIGludDMyX3QJCQkJRmluZE5leHQoaW50MzJfdCBuSW5kZXgsRlhfV0NIQVIgbkNoYXIpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU2V0TXVsdGlwbGVTZWwoRlhfQk9PTCBiTXVsdGlwbGUpOworICB2aXJ0dWFsIEZYX0JPT0wgSXNNdWx0aXBsZVNlbCgpIGNvbnN0OworICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworICB2aXJ0dWFsIGludDMyX3QgRmluZE5leHQoaW50MzJfdCBuSW5kZXgsIEZYX1dDSEFSIG5DaGFyKSBjb25zdDsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJRW1wdHkoKTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBFbXB0eSgpOwogCi0Jdm9pZAkJCQkJCQlBZGRJdGVtKGNvbnN0IEZYX1dDSEFSKiBzdHIpOwotCXZpcnR1YWwgdm9pZAkJCQkJUmVBcnJhbmdlKGludDMyX3Qgbkl0ZW1JbmRleCk7CisgIHZvaWQgQWRkSXRlbShjb25zdCBGWF9XQ0hBUiogc3RyKTsKKyAgdmlydHVhbCB2b2lkIFJlQXJyYW5nZShpbnQzMl90IG5JdGVtSW5kZXgpOwogCi0JdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwotCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRJdGVtVGV4dChpbnQzMl90IG5JbmRleCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldEl0ZW1SZWN0KGludDMyX3QgbkluZGV4KSBjb25zdDsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0SXRlbVRleHQoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlTZXRJdGVtU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpOwotCXZvaWQJCQkJCQkJU2V0SXRlbUNhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiQ2FyZXQpOworICB2b2lkIFNldEl0ZW1TZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCk7CisgIHZvaWQgU2V0SXRlbUNhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiQ2FyZXQpOwogCi0JdmlydHVhbCBpbnQzMl90CQkJCUdldEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwotCWludDMyX3QJCQkJCQlHZXRGaXJzdFNlbGVjdGVkKCkgY29uc3Q7Ci0JaW50MzJfdAkJCQkJCUdldExhc3RTZWxlY3RlZCgpIGNvbnN0OwotCUZYX1dDSEFSCQkJCQkJVG91cHBlcihGWF9XQ0hBUiBjKSBjb25zdDsKKyAgdmlydHVhbCBpbnQzMl90IEdldEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7CisgIGludDMyX3QgR2V0Rmlyc3RTZWxlY3RlZCgpIGNvbnN0OworICBpbnQzMl90IEdldExhc3RTZWxlY3RlZCgpIGNvbnN0OworICBGWF9XQ0hBUiBUb3VwcGVyKEZYX1dDSEFSIGMpIGNvbnN0OwogCi1wcml2YXRlOgotCUNMU1RfQXJyYXlUZW1wbGF0ZTxDRlhfTGlzdEl0ZW0qPgltX2FMaXN0SXRlbXM7Ci0JRlhfRkxPQVQJCQkJCQkJbV9mRm9udFNpemU7Ci0JSUZYX0VkaXRfRm9udE1hcCoJCQkJCW1fcEZvbnRNYXA7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iTXVsdGlwbGU7CisgcHJpdmF0ZToKKyAgQ0xTVF9BcnJheVRlbXBsYXRlPENGWF9MaXN0SXRlbSo+IG1fYUxpc3RJdGVtczsKKyAgRlhfRkxPQVQgbV9mRm9udFNpemU7CisgIElGWF9FZGl0X0ZvbnRNYXAqIG1fcEZvbnRNYXA7CisgIEZYX0JPT0wgbV9iTXVsdGlwbGU7CiB9OwogCi1zdHJ1Y3QgQ1BMU1RfU2VsZWN0X0l0ZW0KLXsKLQlDUExTVF9TZWxlY3RfSXRlbShpbnQzMl90IG90aGVyX25JdGVtSW5kZXgsIGludDMyX3Qgb3RoZXJfblN0YXRlKQotCXsKLQkJbkl0ZW1JbmRleCA9IG90aGVyX25JdGVtSW5kZXg7Ci0JCW5TdGF0ZSA9IG90aGVyX25TdGF0ZTsKLQl9CitzdHJ1Y3QgQ1BMU1RfU2VsZWN0X0l0ZW0geworICBDUExTVF9TZWxlY3RfSXRlbShpbnQzMl90IG90aGVyX25JdGVtSW5kZXgsIGludDMyX3Qgb3RoZXJfblN0YXRlKSB7CisgICAgbkl0ZW1JbmRleCA9IG90aGVyX25JdGVtSW5kZXg7CisgICAgblN0YXRlID0gb3RoZXJfblN0YXRlOworICB9CiAKLQlpbnQzMl90CQluSXRlbUluZGV4OwotCWludDMyX3QJCW5TdGF0ZTsgLy8wOm5vcm1hbCBzZWxlY3QgLTE6dG8gZGVzZWxlY3QgMTogdG8gc2VsZWN0CisgIGludDMyX3Qgbkl0ZW1JbmRleDsKKyAgaW50MzJfdCBuU3RhdGU7ICAvLyAwOm5vcm1hbCBzZWxlY3QgLTE6dG8gZGVzZWxlY3QgMTogdG8gc2VsZWN0CiB9OwogCi1jbGFzcyBDUExTVF9TZWxlY3QKLXsKLXB1YmxpYzoKLQlDUExTVF9TZWxlY3QoKTsKLQl2aXJ0dWFsIH5DUExTVF9TZWxlY3QoKTsKK2NsYXNzIENQTFNUX1NlbGVjdCB7CisgcHVibGljOgorICBDUExTVF9TZWxlY3QoKTsKKyAgdmlydHVhbCB+Q1BMU1RfU2VsZWN0KCk7CiAKLXB1YmxpYzoKLQl2b2lkCQkJCQkJCUFkZChpbnQzMl90IG5JdGVtSW5kZXgpOwotCXZvaWQJCQkJCQkJQWRkKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KTsKLQl2b2lkCQkJCQkJCVN1YihpbnQzMl90IG5JdGVtSW5kZXgpOwotCXZvaWQJCQkJCQkJU3ViKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KTsKLQlGWF9CT09MCQkJCQkJCUlzRXhpc3QoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKLQlpbnQzMl90CQkJCQkJRmluZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwotCWludDMyX3QJCQkJCQlHZXRDb3VudCgpIGNvbnN0OwotCWludDMyX3QJCQkJCQlHZXRJdGVtSW5kZXgoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwotCWludDMyX3QJCQkJCQlHZXRTdGF0ZShpbnQzMl90IG5JbmRleCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQlEb25lKCk7Ci0Jdm9pZAkJCQkJCQlEZXNlbGVjdEFsbCgpOworIHB1YmxpYzoKKyAgdm9pZCBBZGQoaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBBZGQoaW50MzJfdCBuQmVnaW5JbmRleCwgaW50MzJfdCBuRW5kSW5kZXgpOworICB2b2lkIFN1YihpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIFN1YihpbnQzMl90IG5CZWdpbkluZGV4LCBpbnQzMl90IG5FbmRJbmRleCk7CisgIEZYX0JPT0wgSXNFeGlzdChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworICBpbnQzMl90IEZpbmQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKyAgaW50MzJfdCBHZXRDb3VudCgpIGNvbnN0OworICBpbnQzMl90IEdldEl0ZW1JbmRleChpbnQzMl90IG5JbmRleCkgY29uc3Q7CisgIGludDMyX3QgR2V0U3RhdGUoaW50MzJfdCBuSW5kZXgpIGNvbnN0OworICB2b2lkIERvbmUoKTsKKyAgdm9pZCBEZXNlbGVjdEFsbCgpOwogCi1wcml2YXRlOgotCUNGWF9BcnJheVRlbXBsYXRlPENQTFNUX1NlbGVjdF9JdGVtKj4JbV9hSXRlbXM7CisgcHJpdmF0ZToKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BMU1RfU2VsZWN0X0l0ZW0qPiBtX2FJdGVtczsKIH07CiAKLWNsYXNzIENGWF9MaXN0Q3RybCA6IHB1YmxpYyBDRlhfTGlzdAotewotcHVibGljOgotCUNGWF9MaXN0Q3RybCgpOwotCXZpcnR1YWwgfkNGWF9MaXN0Q3RybCgpOworY2xhc3MgQ0ZYX0xpc3RDdHJsIDogcHVibGljIENGWF9MaXN0IHsKKyBwdWJsaWM6CisgIENGWF9MaXN0Q3RybCgpOworICB2aXJ0dWFsIH5DRlhfTGlzdEN0cmwoKTsKIAotcHVibGljOgotCXZvaWQJCQkJCQkJU2V0Tm90aWZ5KElGWF9MaXN0X05vdGlmeSAqIHBOb3RpZnkpOworIHB1YmxpYzoKKyAgdm9pZCBTZXROb3RpZnkoSUZYX0xpc3RfTm90aWZ5KiBwTm90aWZ5KTsKIAotCXZvaWQJCQkJCQkJT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfRE9XTihGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfTEVGVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQlPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQlPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVksoaW50MzJfdCBuSXRlbUluZGV4LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCUZYX0JPT0wJCQkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CisgIHZvaWQgT25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKTsKKyAgdm9pZCBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpOworICB2b2lkIE9uVktfVVAoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpOworICB2b2lkIE9uVktfRE9XTihGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCk7CisgIHZvaWQgT25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKTsKKyAgdm9pZCBPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKTsKKyAgdm9pZCBPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpOworICB2b2lkIE9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKTsKKyAgdm9pZCBPblZLKGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpOworICBGWF9CT09MIE9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCk7CiAKLQl2aXJ0dWFsIENQREZfUG9pbnQJCQkJSW5Ub091dChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwotCXZpcnR1YWwgQ1BERl9Qb2ludAkJCQlPdXRUb0luKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7Ci0JdmlydHVhbCBDUERGX1JlY3QJCQkJSW5Ub091dChjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdDsKLQl2aXJ0dWFsIENQREZfUmVjdAkJCQlPdXRUb0luKGNvbnN0IENQREZfUmVjdCAmIHJlY3QpIGNvbnN0OworICB2aXJ0dWFsIENQREZfUG9pbnQgSW5Ub091dChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9Qb2ludCBPdXRUb0luKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgdmlydHVhbCBDUERGX1JlY3QgSW5Ub091dChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0OworICB2aXJ0dWFsIENQREZfUmVjdCBPdXRUb0luKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3Q7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0KTsKLQl2b2lkCQkJCQkJCVNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpOwotCXZvaWQJCQkJCQkJU2Nyb2xsVG9MaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpOwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldEl0ZW1SZWN0KGludDMyX3QgbkluZGV4KSBjb25zdDsKLQlpbnQzMl90CQkJCQkJR2V0Q2FyZXQoKSBjb25zdCB7cmV0dXJuIG1fbkNhcmV0SW5kZXg7fQotCWludDMyX3QJCQkJCQlHZXRTZWxlY3QoKSBjb25zdCB7cmV0dXJuIG1fblNlbEl0ZW07fQotCWludDMyX3QJCQkJCQlHZXRUb3BJdGVtKCkgY29uc3Q7Ci0JdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdDsKLQl2aXJ0dWFsIGludDMyX3QJCQkJR2V0SXRlbUluZGV4KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKKyAgdm9pZCBTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2b2lkIFNjcm9sbFRvTGlzdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgpIGNvbnN0OworICBpbnQzMl90IEdldENhcmV0KCkgY29uc3QgeyByZXR1cm4gbV9uQ2FyZXRJbmRleDsgfQorICBpbnQzMl90IEdldFNlbGVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fblNlbEl0ZW07IH0KKyAgaW50MzJfdCBHZXRUb3BJdGVtKCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Q7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZyk7Ci0Jdm9pZAkJCQkJCQlTZXRUb3BJdGVtKGludDMyX3QgbkluZGV4KTsKLQl2b2lkCQkJCQkJCVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpOwotCXZpcnR1YWwgdm9pZAkJCQkJU2V0Q2FyZXQoaW50MzJfdCBuSXRlbUluZGV4KTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUVtcHR5KCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlDYW5jZWwoKTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJR2V0VGV4dCgpIGNvbnN0OworICB2b2lkIEFkZFN0cmluZyhjb25zdCBGWF9XQ0hBUiogc3RyaW5nKTsKKyAgdm9pZCBTZXRUb3BJdGVtKGludDMyX3QgbkluZGV4KTsKKyAgdm9pZCBTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdmlydHVhbCB2b2lkIFNldENhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCk7CisgIHZpcnR1YWwgdm9pZCBFbXB0eSgpOworICB2aXJ0dWFsIHZvaWQgQ2FuY2VsKCk7CisgIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKIAotcHJpdmF0ZToKLQl2b2lkCQkJCQkJCVNldE11bHRpcGxlU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpOwotCXZvaWQJCQkJCQkJU2V0U2luZ2xlU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCk7Ci0Jdm9pZAkJCQkJCQlJbnZhbGlkYXRlSXRlbShpbnQzMl90IG5JdGVtSW5kZXgpOwotCXZvaWQJCQkJCQkJU2VsZWN0SXRlbXMoKTsKLQlGWF9CT09MCQkJCQkJCUlzSXRlbVZpc2libGUoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKLQl2b2lkCQkJCQkJCVNldFNjcm9sbEluZm8oKTsKLQl2b2lkCQkJCQkJCVNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpOwotCXZpcnR1YWwgdm9pZAkJCQkJUmVBcnJhbmdlKGludDMyX3Qgbkl0ZW1JbmRleCk7CisgcHJpdmF0ZToKKyAgdm9pZCBTZXRNdWx0aXBsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKTsKKyAgdm9pZCBTZXRTaW5nbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBJbnZhbGlkYXRlSXRlbShpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIFNlbGVjdEl0ZW1zKCk7CisgIEZYX0JPT0wgSXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworICB2b2lkIFNldFNjcm9sbEluZm8oKTsKKyAgdm9pZCBTZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKKyAgdmlydHVhbCB2b2lkIFJlQXJyYW5nZShpbnQzMl90IG5JdGVtSW5kZXgpOwogCi1wcml2YXRlOgotCUlGWF9MaXN0X05vdGlmeSoJCQkJbV9wTm90aWZ5OwotCUZYX0JPT0wJCQkJCQkJbV9iTm90aWZ5RmxhZzsKLQlDUERGX1BvaW50CQkJCQkJbV9wdFNjcm9sbFBvczsKLQlDUExTVF9TZWxlY3QJCQkJCW1fYVNlbEl0ZW1zOwkvL2ZvciBtdWx0aXBsZQotCWludDMyX3QJCQkJCQltX25TZWxJdGVtOwkJLy9mb3Igc2luZ2xlCi0JaW50MzJfdAkJCQkJCW1fbkZvb3RJbmRleDsJLy9mb3IgbXVsdGlwbGUKLQlGWF9CT09MCQkJCQkJCW1fYkN0cmxTZWw7CQkvL2ZvciBtdWx0aXBsZQotCWludDMyX3QJCQkJCQltX25DYXJldEluZGV4OwkvL2ZvciBtdWx0aXBsZQorIHByaXZhdGU6CisgIElGWF9MaXN0X05vdGlmeSogbV9wTm90aWZ5OworICBGWF9CT09MIG1fYk5vdGlmeUZsYWc7CisgIENQREZfUG9pbnQgbV9wdFNjcm9sbFBvczsKKyAgQ1BMU1RfU2VsZWN0IG1fYVNlbEl0ZW1zOyAgLy8gZm9yIG11bHRpcGxlCisgIGludDMyX3QgbV9uU2VsSXRlbTsgIC8vIGZvciBzaW5nbGUKKyAgaW50MzJfdCBtX25Gb290SW5kZXg7ICAvLyBmb3IgbXVsdGlwbGUKKyAgRlhfQk9PTCBtX2JDdHJsU2VsOyAgLy8gZm9yIG11bHRpcGxlCisgIGludDMyX3QgbV9uQ2FyZXRJbmRleDsgIC8vIGZvciBtdWx0aXBsZQogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlhFRElUX0ZYRVRfTElTVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvQ29uc3RzLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Db25zdHMuaAppbmRleCBkMDRjYzZiLi5jMGFiZTRjIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Db25zdHMuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Db25zdHMuaApAQCAtMTEsMTE3ICsxMSwxMDggQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJvcmRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotY2xhc3MgQ0pTX0JvcmRlciA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX0JvcmRlcihKU0ZYT2JqZWN0ICBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX0JvcmRlcih2b2lkKXt9OworY2xhc3MgQ0pTX0JvcmRlciA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19Cb3JkZXIoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCl7fTsKKyAgdmlydHVhbCB+Q0pTX0JvcmRlcih2b2lkKXt9OwogCi0JREVDTEFSRV9KU19DTEFTU19DT05TVCgpOworICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGlzcGxheSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotY2xhc3MgQ0pTX0Rpc3BsYXkgOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19EaXNwbGF5KEpTRlhPYmplY3QgIHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fTsKLQl2aXJ0dWFsIH5DSlNfRGlzcGxheSh2b2lkKXt9OworY2xhc3MgQ0pTX0Rpc3BsYXkgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBDSlNfRGlzcGxheShKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KXt9OworICB2aXJ0dWFsIH5DSlNfRGlzcGxheSh2b2lkKXt9OwogCi0JREVDTEFSRV9KU19DTEFTU19DT05TVCgpOworICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZm9udCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotY2xhc3MgQ0pTX0ZvbnQgOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19Gb250KEpTRlhPYmplY3QgIHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fTsKLQl2aXJ0dWFsIH5DSlNfRm9udCh2b2lkKXt9OworY2xhc3MgQ0pTX0ZvbnQgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBDSlNfRm9udChKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KXt9OworICB2aXJ0dWFsIH5DSlNfRm9udCh2b2lkKXt9OwogCi0JREVDTEFSRV9KU19DTEFTU19DT05TVCgpOworICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGlnaGxpZ2h0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1jbGFzcyBDSlNfSGlnaGxpZ2h0IDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfSGlnaGxpZ2h0KEpTRlhPYmplY3QgIHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fTsKLQl2aXJ0dWFsIH5DSlNfSGlnaGxpZ2h0KHZvaWQpe307CitjbGFzcyBDSlNfSGlnaGxpZ2h0IDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pTX0hpZ2hsaWdodChKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KXt9OworICB2aXJ0dWFsIH5DSlNfSGlnaGxpZ2h0KHZvaWQpe307CiAKLQlERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7CisgIERFQ0xBUkVfSlNfQ0xBU1NfQ09OU1QoKTsKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwb3NpdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotY2xhc3MgQ0pTX1Bvc2l0aW9uIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfUG9zaXRpb24oSlNGWE9iamVjdCAgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19Qb3NpdGlvbih2b2lkKXt9OworY2xhc3MgQ0pTX1Bvc2l0aW9uIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pTX1Bvc2l0aW9uKEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3Qpe307CisgIHZpcnR1YWwgfkNKU19Qb3NpdGlvbih2b2lkKXt9OwogCi0JREVDTEFSRV9KU19DTEFTU19DT05TVCgpOworICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2NhbGVIb3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWNsYXNzIENKU19TY2FsZUhvdyA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX1NjYWxlSG93KEpTRlhPYmplY3QgIHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fTsKLQl2aXJ0dWFsIH5DSlNfU2NhbGVIb3codm9pZCl7fTsKK2NsYXNzIENKU19TY2FsZUhvdyA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19TY2FsZUhvdyhKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KXt9OworICB2aXJ0dWFsIH5DSlNfU2NhbGVIb3codm9pZCl7fTsKIAotCURFQ0xBUkVfSlNfQ0xBU1NfQ09OU1QoKTsKKyAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNjYWxlV2hlbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotY2xhc3MgQ0pTX1NjYWxlV2hlbiA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX1NjYWxlV2hlbihKU0ZYT2JqZWN0ICBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX1NjYWxlV2hlbih2b2lkKXt9OworY2xhc3MgQ0pTX1NjYWxlV2hlbiA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19TY2FsZVdoZW4oSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCl7fTsKKyAgdmlydHVhbCB+Q0pTX1NjYWxlV2hlbih2b2lkKXt9OwogCi0JREVDTEFSRV9KU19DTEFTU19DT05TVCgpOworICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3R5bGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWNsYXNzIENKU19TdHlsZSA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX1N0eWxlKEpTRlhPYmplY3QgIHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fTsKLQl2aXJ0dWFsIH5DSlNfU3R5bGUodm9pZCl7fTsKK2NsYXNzIENKU19TdHlsZSA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19TdHlsZShKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KXt9OworICB2aXJ0dWFsIH5DSlNfU3R5bGUodm9pZCl7fTsKIAotCURFQ0xBUkVfSlNfQ0xBU1NfQ09OU1QoKTsKKyAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHpvb210eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1jbGFzcyBDSlNfWm9vbXR5cGUgOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19ab29tdHlwZShKU0ZYT2JqZWN0ICBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX1pvb210eXBlKHZvaWQpe307CitjbGFzcyBDSlNfWm9vbXR5cGUgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBDSlNfWm9vbXR5cGUoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCl7fTsKKyAgdmlydHVhbCB+Q0pTX1pvb210eXBlKHZvaWQpe307CiAKLQlERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7CisgIERFQ0xBUkVfSlNfQ0xBU1NfQ09OU1QoKTsKIH07CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfR2xvYmFsQ29uc3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19HbG9iYWxDb25zdHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1jbGFzcyBDSlNfR2xvYmFsQ29uc3RzIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlzdGF0aWMgaW50CQkJCUluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKTsKK2NsYXNzIENKU19HbG9iYWxDb25zdHMgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgaW50IEluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKTsKIH07CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfR2xvYmFsQXJyYXlzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19HbG9iYWxBcnJheXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1jbGFzcyBDSlNfR2xvYmFsQXJyYXlzIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlzdGF0aWMgaW50CQkJCUluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKTsKK2NsYXNzIENKU19HbG9iYWxBcnJheXMgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgaW50IEluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfQ09OU1RTX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Eb2N1bWVudC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRG9jdW1lbnQuaAppbmRleCAxMTY0MjM2Li41MmExOTgxIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Eb2N1bWVudC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0RvY3VtZW50LmgKQEAgLTksMjY3ICs5LDM5OSBAQAogCiAjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCiAKLWNsYXNzIFByaW50UGFyYW1zT2JqIDogcHVibGljIENKU19FbWJlZE9iagotewotcHVibGljOgotCVByaW50UGFyYW1zT2JqKENKU19PYmplY3QqIHBKU09iamVjdCk7Ci0JdmlydHVhbCB+UHJpbnRQYXJhbXNPYmooKXt9CitjbGFzcyBQcmludFBhcmFtc09iaiA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgUHJpbnRQYXJhbXNPYmooQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgdmlydHVhbCB+UHJpbnRQYXJhbXNPYmooKSB7fQogCi1wdWJsaWM6Ci0JRlhfQk9PTCBiVUk7Ci0JaW50IG5TdGFydDsKLQlpbnQgbkVuZDsKLQlGWF9CT09MIGJTaWxlbnQ7Ci0JRlhfQk9PTCBiU2hyaW5rVG9GaXQ7Ci0JRlhfQk9PTCBiUHJpbnRBc0ltYWdlOwotCUZYX0JPT0wgYlJldmVyc2U7Ci0JRlhfQk9PTCBiQW5ub3RhdGlvbnM7CisgcHVibGljOgorICBGWF9CT09MIGJVSTsKKyAgaW50IG5TdGFydDsKKyAgaW50IG5FbmQ7CisgIEZYX0JPT0wgYlNpbGVudDsKKyAgRlhfQk9PTCBiU2hyaW5rVG9GaXQ7CisgIEZYX0JPT0wgYlByaW50QXNJbWFnZTsKKyAgRlhfQk9PTCBiUmV2ZXJzZTsKKyAgRlhfQk9PTCBiQW5ub3RhdGlvbnM7CiB9OwogCi1jbGFzcyBDSlNfUHJpbnRQYXJhbXNPYmogOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19QcmludFBhcmFtc09iaihKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQotCXZpcnR1YWwgfkNKU19QcmludFBhcmFtc09iaigpe30KK2NsYXNzIENKU19QcmludFBhcmFtc09iaiA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19QcmludFBhcmFtc09iaihKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB2aXJ0dWFsIH5DSlNfUHJpbnRQYXJhbXNPYmooKSB7fQogCi0JREVDTEFSRV9KU19DTEFTUyhDSlNfUHJpbnRQYXJhbXNPYmopOworICBERUNMQVJFX0pTX0NMQVNTKENKU19QcmludFBhcmFtc09iaik7CiB9OwogCi0KIGNsYXNzIEljb247CiBjbGFzcyBGaWVsZDsKIAotc3RydWN0IEljb25FbGVtZW50Ci17Ci0JSWNvbkVsZW1lbnQoKSA6IEljb25OYW1lKEwiIiksIE5leHRJY29uKE5VTEwpLCBJY29uU3RyZWFtKE5VTEwpIHt9Ci0JdmlydHVhbCB+SWNvbkVsZW1lbnQoKQotCXsKLQl9Ci0JQ0ZYX1dpZGVTdHJpbmcJSWNvbk5hbWU7Ci0JSWNvbkVsZW1lbnQqCU5leHRJY29uOwotCUljb24qCQkJSWNvblN0cmVhbTsKK3N0cnVjdCBJY29uRWxlbWVudCB7CisgIEljb25FbGVtZW50KCkgOiBJY29uTmFtZShMIiIpLCBOZXh0SWNvbihOVUxMKSwgSWNvblN0cmVhbShOVUxMKSB7fQorICB2aXJ0dWFsIH5JY29uRWxlbWVudCgpIHt9CisgIENGWF9XaWRlU3RyaW5nIEljb25OYW1lOworICBJY29uRWxlbWVudCogTmV4dEljb247CisgIEljb24qIEljb25TdHJlYW07CiB9OwogCi1jbGFzcyBJY29uVHJlZQotewotcHVibGljOgotCUljb25UcmVlKCk6bV9wSGVhZChOVUxMKSwgbV9wRW5kKE5VTEwpLCBtX2lMZW5ndGgoMCkKLQl7CitjbGFzcyBJY29uVHJlZSB7CisgcHVibGljOgorICBJY29uVHJlZSgpIDogbV9wSGVhZChOVUxMKSwgbV9wRW5kKE5VTEwpLCBtX2lMZW5ndGgoMCkge30KIAotCX0KKyAgdmlydHVhbCB+SWNvblRyZWUoKSB7fQogCi0JdmlydHVhbCB+SWNvblRyZWUoKQotCXsKLQl9CisgcHVibGljOgorICB2b2lkIEluc2VydEljb25FbGVtZW50KEljb25FbGVtZW50KiBwTmV3SWNvbik7CisgIHZvaWQgRGVsZXRlSWNvbkVsZW1lbnQoQ0ZYX1dpZGVTdHJpbmcgc3dJY29uTmFtZSk7CisgIHZvaWQgRGVsZXRlSWNvblRyZWUoKTsKKyAgaW50IEdldExlbmd0aCgpOworICBJY29uRWxlbWVudCogb3BlcmF0b3JbXShpbnQgaUluZGV4KTsKIAotcHVibGljOgotCXZvaWQJCQlJbnNlcnRJY29uRWxlbWVudChJY29uRWxlbWVudCogcE5ld0ljb24pOwotCXZvaWQJCQlEZWxldGVJY29uRWxlbWVudChDRlhfV2lkZVN0cmluZyBzd0ljb25OYW1lKTsKLQl2b2lkCQkJRGVsZXRlSWNvblRyZWUoKTsKLQlpbnQJCQkJR2V0TGVuZ3RoKCk7Ci0JSWNvbkVsZW1lbnQqCW9wZXJhdG9yW10oaW50IGlJbmRleCk7Ci0KLXByaXZhdGU6Ci0JSWNvbkVsZW1lbnQqCW1fcEhlYWQ7Ci0JSWNvbkVsZW1lbnQqCW1fcEVuZDsKLQlpbnQJCQkJbV9pTGVuZ3RoOworIHByaXZhdGU6CisgIEljb25FbGVtZW50KiBtX3BIZWFkOworICBJY29uRWxlbWVudCogbV9wRW5kOworICBpbnQgbV9pTGVuZ3RoOwogfTsKIAogc3RydWN0IENKU19EZWxheURhdGE7CiBzdHJ1Y3QgQ0pTX0RlbGF5QW5ub3Q7CiBzdHJ1Y3QgQ0pTX0Fubm90T2JqOwogCi1jbGFzcyBEb2N1bWVudCA6IHB1YmxpYyBDSlNfRW1iZWRPYmoKLXsKLXB1YmxpYzoKLQlEb2N1bWVudChDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotCXZpcnR1YWwgfkRvY3VtZW50KCk7CitjbGFzcyBEb2N1bWVudCA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgRG9jdW1lbnQoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgdmlydHVhbCB+RG9jdW1lbnQoKTsKIAotcHVibGljOgotCUZYX0JPT0wJQURCRShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJYXV0aG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAliYXNlVVJMKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlib29rbWFya1Jvb3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJQ29sbGFiKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAljcmVhdGlvbkRhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWNyZWF0b3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWRlbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlkaXJ0eShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZG9jdW1lbnRGaWxlTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZXh0ZXJuYWwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWZpbGVzaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlpY29ucyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJaW5mbyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJa2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWxheW91dChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJbWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW1vZERhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW1vdXNlWChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJbW91c2VZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAludW1GaWVsZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlwYWdlTnVtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlwYWdlV2luZG93UmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcGF0aChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcHJvZHVjZXIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXN1YmplY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXRpdGxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAl6b29tKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAl6b29tVHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworIHB1YmxpYzoKKyAgRlhfQk9PTCBBREJFKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYXV0aG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYmFzZVVSTChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJvb2ttYXJrUm9vdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIENvbGxhYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNyZWF0aW9uRGF0ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNyZWF0b3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBkZWxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGRpcnR5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZG9jdW1lbnRGaWxlTmFtZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZXh0ZXJuYWwoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZmlsZXNpemUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgaWNvbnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBpbmZvKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wga2V5d29yZHMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbGF5b3V0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBtb2REYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbW91c2VYKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbW91c2VZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbnVtRmllbGRzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbnVtUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcGFnZU51bShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHBhZ2VXaW5kb3dSZWN0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHBhdGgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBwcm9kdWNlcihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzdWJqZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgdGl0bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB6b29tKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgem9vbVR5cGUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKLQlGWF9CT09MIGFkZEFubm90KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJYWRkRmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlhZGRMaW5rKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJYWRkSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWNhbGN1bGF0ZU5vdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWNsb3NlRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJY3JlYXRlRGF0YU9iamVjdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGRlbGV0ZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZXhwb3J0QXNUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZXhwb3J0QXNGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlleHBvcnRBc1hGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBleHRyYWN0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldEFubm90cyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldEFubm90M0QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRBbm5vdHMzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldExpbmtzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0TnRoRmllbGROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0T0NHcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldFBhZ2VCb3goSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRQYWdlTnRoV29yZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRQYWdlTnVtV29yZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBnZXRQcmludFBhcmFtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGdldFVSTChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWltcG9ydEFuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJaW1wb3J0QW5YRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJaW1wb3J0VGV4dERhdGEoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBpbnNlcnRQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW1haWxGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlyZW1vdmVGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJlcGxhY2VQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXJlc2V0Rm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXNhdmVBcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXN1Ym1pdEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAltYWlsRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcmVtb3ZlSWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBhZGRBbm5vdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBhZGRGaWVsZChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBhZGRMaW5rKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGFkZEljb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgY2FsY3VsYXRlTm93KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNsb3NlRG9jKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNyZWF0ZURhdGFPYmplY3QoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZGVsZXRlUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZXhwb3J0QXNUZXh0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGV4cG9ydEFzRkRGKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGV4cG9ydEFzWEZERihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBleHRyYWN0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0QW5ub3QoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0QW5ub3RzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldEFubm90M0QoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0QW5ub3RzM0QoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0RmllbGQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBnZXRMaW5rcyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBnZXROdGhGaWVsZE5hbWUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0T0NHcyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBnZXRQYWdlQm94KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldFBhZ2VOdGhXb3JkKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0UGFnZU51bVdvcmRzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldFByaW50UGFyYW1zKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldFVSTChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBpbXBvcnRBbkZERihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBpbXBvcnRBblhGREYoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgaW1wb3J0VGV4dERhdGEoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgaW5zZXJ0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbWFpbEZvcm0oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcHJpbnQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmVtb3ZlRmllbGQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmVwbGFjZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJlc2V0Rm9ybShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzYXZlQXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc3VibWl0Rm9ybShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBtYWlsRG9jKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKLXB1YmxpYzoKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNoRG9jKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwotCUNQREZTREtfRG9jdW1lbnQqICAgICAgICAgICAgICAgICAgICAgICBHZXRSZWFkZXJEb2MoKTsKLQlzdGF0aWMgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzdHJGaWxlTmFtZSk7Ci0Jc3RhdGljIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RGb2xkZXJOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzdHJGb2xkZXJOYW1lKTsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkRGVsYXlEYXRhKENKU19EZWxheURhdGEqIHBEYXRhKTsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9GaWVsZERlbGF5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCk7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZERlbGF5QW5ub3REYXRhKENKU19Bbm5vdE9iaiAqcERhdGEpOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb0Fubm90RGVsYXkoKTsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0SXNvbGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSkge21faXNvbGF0ZSA9IGlzb2xhdGU7fQotCUNKU19Eb2N1bWVudCogICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDSlNEb2MoKSBjb25zdDsKKyBwdWJsaWM6CisgIHZvaWQgQXR0YWNoRG9jKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOworICBDUERGU0RLX0RvY3VtZW50KiBHZXRSZWFkZXJEb2MoKTsKKyAgc3RhdGljIEZYX0JPT0wgRXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRmlsZU5hbWUpOworICBzdGF0aWMgRlhfQk9PTCBFeHRyYWN0Rm9sZGVyTmFtZShDUERGU0RLX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRm9sZGVyTmFtZSk7CisgIHZvaWQgQWRkRGVsYXlEYXRhKENKU19EZWxheURhdGEqIHBEYXRhKTsKKyAgdm9pZCBEb0ZpZWxkRGVsYXkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4KTsKKyAgdm9pZCBBZGREZWxheUFubm90RGF0YShDSlNfQW5ub3RPYmoqIHBEYXRhKTsKKyAgdm9pZCBEb0Fubm90RGVsYXkoKTsKKyAgdm9pZCBTZXRJc29sYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlKSB7IG1faXNvbGF0ZSA9IGlzb2xhdGU7IH0KKyAgQ0pTX0RvY3VtZW50KiBHZXRDSlNEb2MoKSBjb25zdDsKIAotcHJpdmF0ZToKLQlDRlhfV2lkZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2ZXJzYWxTdHIoQ0ZYX1dpZGVTdHJpbmcgY2JGcm9tKTsKLQlDRlhfV2lkZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3V0U3RyaW5nKENGWF9XaWRlU3RyaW5nIGNiRnJvbSk7Ci0JYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzRW5jbG9zZWRJblJlY3QoQ0ZYX0Zsb2F0UmVjdCByZWN0LCBDRlhfRmxvYXRSZWN0IExpbmtSZWN0KTsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRXb3JkcyhDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKTsKLQlDRlhfV2lkZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0T2JqV29yZFN0cihDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBpbnQgbldvcmRJbmRleCk7Ci0JRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlclBhcmFtcyhKU09iamVjdCAqcE9iaixDSlNfQW5ub3RPYmomIGFubm90b2JqKTsKKyBwcml2YXRlOgorICBDRlhfV2lkZVN0cmluZyBSZXZlcnNhbFN0cihDRlhfV2lkZVN0cmluZyBjYkZyb20pOworICBDRlhfV2lkZVN0cmluZyBDdXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcgY2JGcm9tKTsKKyAgYm9vbCBJc0VuY2xvc2VkSW5SZWN0KENGWF9GbG9hdFJlY3QgcmVjdCwgQ0ZYX0Zsb2F0UmVjdCBMaW5rUmVjdCk7CisgIGludCBDb3VudFdvcmRzKENQREZfVGV4dE9iamVjdCogcFRleHRPYmopOworICBDRlhfV2lkZVN0cmluZyBHZXRPYmpXb3JkU3RyKENQREZfVGV4dE9iamVjdCogcFRleHRPYmosIGludCBuV29yZEluZGV4KTsKKyAgRlhfQk9PTCBQYXJzZXJQYXJhbXMoSlNPYmplY3QqIHBPYmosIENKU19Bbm5vdE9iaiYgYW5ub3RvYmopOwogCi0Jdjg6Oklzb2xhdGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faXNvbGF0ZTsKLQlJY29uVHJlZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSWNvblRyZWU7Ci0JQ1BERlNES19Eb2N1bWVudCogICAgICAgICAgICAgICAgICAgICAgIG1fcERvY3VtZW50OwotCUNGWF9XaWRlU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICBtX2N3QmFzZVVSTDsKLQlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iRGVsYXk7Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0RlbGF5RGF0YSo+ICAgICAgIG1fRGVsYXlEYXRhOwotCUNGWF9BcnJheVRlbXBsYXRlPENKU19Bbm5vdE9iaio+ICAgICAgICBtX0RlbGF5QW5ub3REYXRhOworICB2ODo6SXNvbGF0ZSogbV9pc29sYXRlOworICBJY29uVHJlZSogbV9wSWNvblRyZWU7CisgIENQREZTREtfRG9jdW1lbnQqIG1fcERvY3VtZW50OworICBDRlhfV2lkZVN0cmluZyBtX2N3QmFzZVVSTDsKKyAgYm9vbCBtX2JEZWxheTsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0RlbGF5RGF0YSo+IG1fRGVsYXlEYXRhOworICBDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfQW5ub3RPYmoqPiBtX0RlbGF5QW5ub3REYXRhOwogfTsKIAotY2xhc3MgQ0pTX0RvY3VtZW50IDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfRG9jdW1lbnQoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX0RvY3VtZW50KCl7fTsKK2NsYXNzIENKU19Eb2N1bWVudCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19Eb2N1bWVudChKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KXt9OworICB2aXJ0dWFsIH5DSlNfRG9jdW1lbnQoKXt9OwogCi0JdmlydHVhbCBGWF9CT09MCUluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyk7CisgIHZpcnR1YWwgRlhfQk9PTCBJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpOwogCi0JREVDTEFSRV9KU19DTEFTUyhDSlNfRG9jdW1lbnQpOworICBERUNMQVJFX0pTX0NMQVNTKENKU19Eb2N1bWVudCk7CiAKLQlKU19TVEFUSUNfUFJPUChBREJFLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AoYXV0aG9yLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AoYmFzZVVSTCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGJvb2ttYXJrUm9vdCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGNhbGN1bGF0ZSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKENvbGxhYiwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGNyZWF0aW9uRGF0ZSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGNyZWF0b3IsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfUFJPUChkZWxheSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGRpcnR5LCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AoZG9jdW1lbnRGaWxlTmFtZSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGV4dGVybmFsLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AoZmlsZXNpemUsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfUFJPUChpY29ucywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGluZm8sIERvY3VtZW50KTsKLQlKU19TVEFUSUNfUFJPUChrZXl3b3JkcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGxheW91dCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKG1lZGlhLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AobW9kRGF0ZSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKG1vdXNlWCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKG1vdXNlWSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKG51bUZpZWxkcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKG51bVBhZ2VzLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AocGFnZU51bSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKHBhZ2VXaW5kb3dSZWN0LCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AocGF0aCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKHByb2R1Y2VyLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1Aoc3ViamVjdCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKHRpdGxlLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1Aoem9vbSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKHpvb21UeXBlLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKEFEQkUsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoYXV0aG9yLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGJhc2VVUkwsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoYm9va21hcmtSb290LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGNhbGN1bGF0ZSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChDb2xsYWIsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoY3JlYXRpb25EYXRlLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGNyZWF0b3IsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoZGVsYXksIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoZGlydHksIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoZG9jdW1lbnRGaWxlTmFtZSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChleHRlcm5hbCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChmaWxlc2l6ZSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChpY29ucywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChpbmZvLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGtleXdvcmRzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGxheW91dCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChtZWRpYSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChtb2REYXRlLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKG1vdXNlWCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChtb3VzZVksIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AobnVtRmllbGRzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKG51bVBhZ2VzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHBhZ2VOdW0sIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AocGFnZVdpbmRvd1JlY3QsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AocGF0aCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChwcm9kdWNlciwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChzdWJqZWN0LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHRpdGxlLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHpvb20sIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoem9vbVR5cGUsIERvY3VtZW50KTsKIAotCUpTX1NUQVRJQ19NRVRIT0QoYWRkQW5ub3QsRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoYWRkRmllbGQsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGFkZExpbmssIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGFkZEljb24sIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGNhbGN1bGF0ZU5vdywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoY2xvc2VEb2MsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGNyZWF0ZURhdGFPYmplY3QsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGRlbGV0ZVBhZ2VzLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChleHBvcnRBc1RleHQsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGV4cG9ydEFzRkRGLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChleHBvcnRBc1hGREYsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGV4dHJhY3RQYWdlcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0QW5ub3QsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGdldEFubm90cywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0QW5ub3QzRCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0QW5ub3RzM0QsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGdldEZpZWxkLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChnZXRJY29uLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChnZXRMaW5rcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0TnRoRmllbGROYW1lLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChnZXRPQ0dzLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChnZXRQYWdlQm94LCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChnZXRQYWdlTnRoV29yZCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0UGFnZU50aFdvcmRRdWFkcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0UGFnZU51bVdvcmRzLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChnZXRQcmludFBhcmFtcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0VVJMLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChpbXBvcnRBbkZERiwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoaW1wb3J0QW5YRkRGLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChpbXBvcnRUZXh0RGF0YSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoaW5zZXJ0UGFnZXMsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKG1haWxGb3JtLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChwcmludCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QocmVtb3ZlRmllbGQsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKHJlcGxhY2VQYWdlcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QocmVtb3ZlSWNvbiwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QocmVzZXRGb3JtLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChzYXZlQXMsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKHN1Ym1pdEZvcm0sIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKG1haWxEb2MsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChhZGRBbm5vdCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGFkZEZpZWxkLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYWRkTGluaywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGFkZEljb24sIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChjYWxjdWxhdGVOb3csIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChjbG9zZURvYywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGNyZWF0ZURhdGFPYmplY3QsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChkZWxldGVQYWdlcywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGV4cG9ydEFzVGV4dCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGV4cG9ydEFzRkRGLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZXhwb3J0QXNYRkRGLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZXh0cmFjdFBhZ2VzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0QW5ub3QsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRBbm5vdHMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRBbm5vdDNELCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0QW5ub3RzM0QsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRGaWVsZCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldEljb24sIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRMaW5rcywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldE50aEZpZWxkTmFtZSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldE9DR3MsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRQYWdlQm94LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0UGFnZU50aFdvcmQsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRQYWdlTnRoV29yZFF1YWRzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0UGFnZU51bVdvcmRzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0UHJpbnRQYXJhbXMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRVUkwsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChpbXBvcnRBbkZERiwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGltcG9ydEFuWEZERiwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGltcG9ydFRleHREYXRhLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaW5zZXJ0UGFnZXMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChtYWlsRm9ybSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKHByaW50LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocmVtb3ZlRmllbGQsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChyZXBsYWNlUGFnZXMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChyZW1vdmVJY29uLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocmVzZXRGb3JtLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2F2ZUFzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc3VibWl0Rm9ybSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKG1haWxEb2MsIERvY3VtZW50KTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfRE9DVU1FTlRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ZpZWxkLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oCmluZGV4IDcwZDFkMzkuLmFmYmY3ODMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ZpZWxkLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaApAQCAtMTQsMzQ2ICsxNCw2MTEgQEAKIAogY2xhc3MgRG9jdW1lbnQ7CiAKLWVudW0gRklFTERfUFJPUAotewotCUZQX0FMSUdOTUVOVCwKLQlGUF9CT1JERVJTVFlMRSwKLQlGUF9CVVRUT05BTElHTlgsCi0JRlBfQlVUVE9OQUxJR05ZLAotCUZQX0JVVFRPTkZJVEJPVU5EUywKLQlGUF9CVVRUT05QT1NJVElPTiwKLQlGUF9CVVRUT05TQ0FMRUhPVywKLQlGUF9CVVRUT05TQ0FMRVdIRU4sCi0JRlBfQ0FMQ09SREVSSU5ERVgsCi0JRlBfQ0hBUkxJTUlULAotCUZQX0NPTUIsCi0JRlBfQ09NTUlUT05TRUxDSEFOR0UsCi0JRlBfQ1VSUkVOVFZBTFVFSU5ESUNFUywKLQlGUF9ERUZBVUxUVkFMVUUsCi0JRlBfRE9OT1RTQ1JPTEwsCi0JRlBfRElTUExBWSwKLQlGUF9GSUxMQ09MT1IsCi0JRlBfSElEREVOLAotCUZQX0hJR0hMSUdIVCwKLQlGUF9MSU5FV0lEVEgsCi0JRlBfTVVMVElMSU5FLAotCUZQX01VTFRJUExFU0VMRUNUSU9OLAotCUZQX1BBU1NXT1JELAotCUZQX1JFQ1QsCi0JRlBfUklDSFRFWFQsCi0JRlBfUklDSFZBTFVFLAotCUZQX1JPVEFUSU9OLAotCUZQX1NUUk9LRUNPTE9SLAotCUZQX1NUWUxFLAotCUZQX1RFWFRDT0xPUiwKLQlGUF9URVhURk9OVCwKLQlGUF9URVhUU0laRSwKLQlGUF9VU0VSTkFNRSwKLQlGUF9WQUxVRQorZW51bSBGSUVMRF9QUk9QIHsKKyAgRlBfQUxJR05NRU5ULAorICBGUF9CT1JERVJTVFlMRSwKKyAgRlBfQlVUVE9OQUxJR05YLAorICBGUF9CVVRUT05BTElHTlksCisgIEZQX0JVVFRPTkZJVEJPVU5EUywKKyAgRlBfQlVUVE9OUE9TSVRJT04sCisgIEZQX0JVVFRPTlNDQUxFSE9XLAorICBGUF9CVVRUT05TQ0FMRVdIRU4sCisgIEZQX0NBTENPUkRFUklOREVYLAorICBGUF9DSEFSTElNSVQsCisgIEZQX0NPTUIsCisgIEZQX0NPTU1JVE9OU0VMQ0hBTkdFLAorICBGUF9DVVJSRU5UVkFMVUVJTkRJQ0VTLAorICBGUF9ERUZBVUxUVkFMVUUsCisgIEZQX0RPTk9UU0NST0xMLAorICBGUF9ESVNQTEFZLAorICBGUF9GSUxMQ09MT1IsCisgIEZQX0hJRERFTiwKKyAgRlBfSElHSExJR0hULAorICBGUF9MSU5FV0lEVEgsCisgIEZQX01VTFRJTElORSwKKyAgRlBfTVVMVElQTEVTRUxFQ1RJT04sCisgIEZQX1BBU1NXT1JELAorICBGUF9SRUNULAorICBGUF9SSUNIVEVYVCwKKyAgRlBfUklDSFZBTFVFLAorICBGUF9ST1RBVElPTiwKKyAgRlBfU1RST0tFQ09MT1IsCisgIEZQX1NUWUxFLAorICBGUF9URVhUQ09MT1IsCisgIEZQX1RFWFRGT05ULAorICBGUF9URVhUU0laRSwKKyAgRlBfVVNFUk5BTUUsCisgIEZQX1ZBTFVFCiB9OwogCi1jbGFzcyBDSlNfV2lkZVN0cmluZ0FycmF5Ci17Ci1wdWJsaWM6Ci0JQ0pTX1dpZGVTdHJpbmdBcnJheSgpe30KLQl2aXJ0dWFsIH5DSlNfV2lkZVN0cmluZ0FycmF5KCkKLQl7Ci0JCWZvciAoaW50IGk9MCxzej1tX0RhdGEuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCQlkZWxldGUgbV9EYXRhLkdldEF0KGkpOwotCQltX0RhdGEuUmVtb3ZlQWxsKCk7Ci0JfQorY2xhc3MgQ0pTX1dpZGVTdHJpbmdBcnJheSB7CisgcHVibGljOgorICBDSlNfV2lkZVN0cmluZ0FycmF5KCkge30KKyAgdmlydHVhbCB+Q0pTX1dpZGVTdHJpbmdBcnJheSgpIHsKKyAgICBmb3IgKGludCBpID0gMCwgc3ogPSBtX0RhdGEuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICAgIGRlbGV0ZSBtX0RhdGEuR2V0QXQoaSk7CisgICAgbV9EYXRhLlJlbW92ZUFsbCgpOworICB9CiAKLQl2b2lkIEFkZChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKQotCXsKLQkJbV9EYXRhLkFkZChuZXcgQ0ZYX1dpZGVTdHJpbmcoc3RyaW5nKSk7Ci0JfQorICB2b2lkIEFkZChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKSB7CisgICAgbV9EYXRhLkFkZChuZXcgQ0ZYX1dpZGVTdHJpbmcoc3RyaW5nKSk7CisgIH0KIAotCWludCBHZXRTaXplKCkgY29uc3QKLQl7Ci0JCXJldHVybiBtX0RhdGEuR2V0U2l6ZSgpOwotCX0KKyAgaW50IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBtX0RhdGEuR2V0U2l6ZSgpOyB9CiAKLQlDRlhfV2lkZVN0cmluZyBHZXRBdChpbnQgaSkgY29uc3QKLQl7Ci0JCXJldHVybiAqbV9EYXRhLkdldEF0KGkpOwotCX0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0QXQoaW50IGkpIGNvbnN0IHsgcmV0dXJuICptX0RhdGEuR2V0QXQoaSk7IH0KIAotcHJpdmF0ZToKLQlDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfV2lkZVN0cmluZyo+CW1fRGF0YTsKKyBwcml2YXRlOgorICBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfV2lkZVN0cmluZyo+IG1fRGF0YTsKIH07CiAKLXN0cnVjdCBDSlNfRGVsYXlEYXRhCi17Ci0JQ0ZYX1dpZGVTdHJpbmcJCQlzRmllbGROYW1lOwotCWludAkJCQkJCW5Db250cm9sSW5kZXg7Ci0JZW51bSBGSUVMRF9QUk9QCQkJZVByb3A7Ci0JaW50MzJfdAkJCQludW07Ci0JYm9vbAkJCQkJYjsKLQlDRlhfQnl0ZVN0cmluZwkJCXN0cmluZzsKLQlDRlhfV2lkZVN0cmluZwkJCXdpZGVzdHJpbmc7Ci0JQ1BERl9SZWN0CQkJCXJlY3Q7Ci0JQ1BXTF9Db2xvcgkJCQljb2xvcjsKLQlDRlhfRFdvcmRBcnJheQkJCXdvcmRhcnJheTsKLQlDSlNfV2lkZVN0cmluZ0FycmF5CQl3aWRlc3RyaW5nYXJyYXk7CitzdHJ1Y3QgQ0pTX0RlbGF5RGF0YSB7CisgIENGWF9XaWRlU3RyaW5nIHNGaWVsZE5hbWU7CisgIGludCBuQ29udHJvbEluZGV4OworICBlbnVtIEZJRUxEX1BST1AgZVByb3A7CisgIGludDMyX3QgbnVtOworICBib29sIGI7CisgIENGWF9CeXRlU3RyaW5nIHN0cmluZzsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZXN0cmluZzsKKyAgQ1BERl9SZWN0IHJlY3Q7CisgIENQV0xfQ29sb3IgY29sb3I7CisgIENGWF9EV29yZEFycmF5IHdvcmRhcnJheTsKKyAgQ0pTX1dpZGVTdHJpbmdBcnJheSB3aWRlc3RyaW5nYXJyYXk7CiB9OwogCi1jbGFzcyBGaWVsZCA6IHB1YmxpYyBDSlNfRW1iZWRPYmoKLXsKLXB1YmxpYzoKLQlGaWVsZChDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotCXZpcnR1YWwgfkZpZWxkKHZvaWQpOworY2xhc3MgRmllbGQgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIEZpZWxkKENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIHZpcnR1YWwgfkZpZWxkKHZvaWQpOwogCi0gICAgRlhfQk9PTCBhbGlnbm1lbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBGWF9CT09MIGJvcmRlclN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25BbGlnblgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvbkFsaWduWShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uRml0Qm91bmRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25Qb3NpdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uU2NhbGVIb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBGWF9CT09MIGJ1dHRvblNjYWxlV2hlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY2FsY09yZGVySW5kZXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNoYXJMaW1pdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY29tYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY29tbWl0T25TZWxDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGN1cnJlbnRWYWx1ZUluZGljZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBGWF9CT09MIGRlZmF1bHRTdHlsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZGVmYXVsdFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkb05vdFNjcm9sbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZG9Ob3RTcGVsbENoZWNrKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkZWxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZGlzcGxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICAgIEZYX0JPT0wgZG9jKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBlZGl0YWJsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZXhwb3J0VmFsdWVzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBmaWxlU2VsZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBmaWxsQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGhpZGRlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICAgIEZYX0JPT0wgaGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBsaW5lV2lkdGgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIG11bHRpbGluZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbXVsdGlwbGVTZWxlY3Rpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIG5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIG51bUl0ZW1zKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gICAgRlhfQk9PTCBwYWdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBwYXNzd29yZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJhZGlvc0luVW5pc29uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByZWFkb25seShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICAgIEZYX0JPT0wgcmVxdWlyZWQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJpY2hUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJvdGF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzdHJva2VDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHN1Ym1pdE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHRleHRDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdGV4dEZvbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHRleHRTaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB1c2VyTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHZhbHVlQXNTdHJpbmcoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGFsaWdubWVudChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJvcmRlclN0eWxlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJ1dHRvbkFsaWduWChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJ1dHRvbkFsaWduWShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJ1dHRvbkZpdEJvdW5kcyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJ1dHRvblNjYWxlSG93KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJ1dHRvblNjYWxlV2hlbihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNhbGNPcmRlckluZGV4KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNoYXJMaW1pdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNvbWIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBjb21taXRPblNlbENoYW5nZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBjdXJyZW50VmFsdWVJbmRpY2VzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBkZWZhdWx0U3R5bGUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBkZWZhdWx0VmFsdWUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBkb05vdFNjcm9sbChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBkb05vdFNwZWxsQ2hlY2soSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBkZWxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGRpc3BsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBkb2MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBlZGl0YWJsZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBleHBvcnRWYWx1ZXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBmaWxlU2VsZWN0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBmaWxsQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBoaWRkZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBoaWdobGlnaHQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBsaW5lV2lkdGgoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBtdWx0aWxpbmUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBtdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbnVtSXRlbXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcGFnZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHBhc3N3b3JkKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHByaW50KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmFkaW9zSW5Vbmlzb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmVhZG9ubHkoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJlcXVpcmVkKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJpY2hUZXh0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJvdGF0aW9uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHN0cm9rZUNvbG9yKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc3VibWl0TmFtZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgdGV4dENvbG9yKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgdGV4dEZvbnQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgdGV4dFNpemUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgdHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHVzZXJOYW1lKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgdmFsdWVBc1N0cmluZyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKLQlGWF9CT09MIGJyb3dzZUZvckZpbGVUb1N1Ym1pdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvbkdldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uSW1wb3J0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvblNldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25TZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY2hlY2tUaGlzQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGRlZmF1bHRJc0NoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkZWxldGVJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBnZXRBcnJheShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGdldEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGdldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBpbnNlcnRJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBpc0JveENoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBpc0RlZmF1bHRDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2V0QWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzZXRJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2lnbmF0dXJlR2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2lnbmF0dXJlSW5mbyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNpZ25hdHVyZVNldFNlZWRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNpZ25hdHVyZVNpZ24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaWduYXR1cmVWYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBicm93c2VGb3JGaWxlVG9TdWJtaXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYnV0dG9uR2V0Q2FwdGlvbihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBidXR0b25HZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJ1dHRvbkltcG9ydEljb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYnV0dG9uU2V0Q2FwdGlvbihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBidXR0b25TZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNoZWNrVGhpc0JveChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBjbGVhckl0ZW1zKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGRlZmF1bHRJc0NoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZGVsZXRlSXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldEFycmF5KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBnZXRMb2NrKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGluc2VydEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBpc0JveENoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgaXNEZWZhdWx0Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzZXRBY3Rpb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc2V0SXRlbXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc2V0TG9jayhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHNpZ25hdHVyZUdldFNlZWRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzaWduYXR1cmVJbmZvKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHNpZ25hdHVyZVNldFNlZWRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzaWduYXR1cmVTaWduKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHNpZ25hdHVyZVZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCi1wdWJsaWM6Ci0Jc3RhdGljIHZvaWQgU2V0QWxpZ25tZW50KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZyk7Ci0gICAgc3RhdGljIHZvaWQgU2V0Qm9yZGVyU3R5bGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKLQlzdGF0aWMgdm9pZCBTZXRCdXR0b25BbGlnblgoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKTsKLQlzdGF0aWMgdm9pZCBTZXRCdXR0b25BbGlnblkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKTsKLQlzdGF0aWMgdm9pZCBTZXRCdXR0b25GaXRCb3VuZHMoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpOwotCXN0YXRpYyB2b2lkIFNldEJ1dHRvblBvc2l0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcik7Ci0Jc3RhdGljIHZvaWQgU2V0QnV0dG9uU2NhbGVIb3coQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKTsKLSAgICBzdGF0aWMgdm9pZCBTZXRCdXR0b25TY2FsZVdoZW4oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKTsKLQlzdGF0aWMgdm9pZCBTZXRDYWxjT3JkZXJJbmRleChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpOwotCXN0YXRpYyB2b2lkIFNldENoYXJMaW1pdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpOwotCXN0YXRpYyB2b2lkIFNldENvbWIoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpOwotCXN0YXRpYyB2b2lkIFNldENvbW1pdE9uU2VsQ2hhbmdlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKTsKLQlzdGF0aWMgdm9pZCBTZXRDdXJyZW50VmFsdWVJbmRpY2VzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX0RXb3JkQXJyYXkmIGFycmF5KTsKLSAgICBzdGF0aWMgdm9pZCBTZXREZWZhdWx0U3R5bGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4KTsKLQlzdGF0aWMgdm9pZCBTZXREZWZhdWx0VmFsdWUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKTsKLQlzdGF0aWMgdm9pZCBTZXREb05vdFNjcm9sbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYik7Ci0Jc3RhdGljIHZvaWQgU2V0RGlzcGxheShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpOwotCXN0YXRpYyB2b2lkIFNldEZpbGxDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKLQlzdGF0aWMgdm9pZCBTZXRIaWRkZW4oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpOwotICAgIHN0YXRpYyB2b2lkIFNldEhpZ2hsaWdodChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOwotCXN0YXRpYyB2b2lkIFNldExpbmVXaWR0aChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpOwotCXN0YXRpYyB2b2lkIFNldE11bHRpbGluZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYik7Ci0Jc3RhdGljIHZvaWQgU2V0TXVsdGlwbGVTZWxlY3Rpb24oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpOwotCXN0YXRpYyB2b2lkIFNldFBhc3N3b3JkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKTsKLQlzdGF0aWMgdm9pZCBTZXRSZWN0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKLQlzdGF0aWMgdm9pZCBTZXRSaWNoVGV4dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYik7Ci0Jc3RhdGljIHZvaWQgU2V0UmljaFZhbHVlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCk7Ci0Jc3RhdGljIHZvaWQgU2V0Um90YXRpb24oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKTsKLQlzdGF0aWMgdm9pZCBTZXRTdHJva2VDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKLQlzdGF0aWMgdm9pZCBTZXRTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOwotCXN0YXRpYyB2b2lkIFNldFRleHRDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKLQlzdGF0aWMgdm9pZCBTZXRUZXh0Rm9udChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOwotCXN0YXRpYyB2b2lkIFNldFRleHRTaXplKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcik7Ci0Jc3RhdGljIHZvaWQgU2V0VXNlck5hbWUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKTsKLQlzdGF0aWMgdm9pZCBTZXRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENKU19XaWRlU3RyaW5nQXJyYXkmIHN0ckFycmF5KTsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFNldEFsaWdubWVudChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOworICBzdGF0aWMgdm9pZCBTZXRCb3JkZXJTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOworICBzdGF0aWMgdm9pZCBTZXRCdXR0b25BbGlnblgoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKTsKKyAgc3RhdGljIHZvaWQgU2V0QnV0dG9uQWxpZ25ZKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7CisgIHN0YXRpYyB2b2lkIFNldEJ1dHRvbkZpdEJvdW5kcyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYik7CisgIHN0YXRpYyB2b2lkIFNldEJ1dHRvblBvc2l0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7CisgIHN0YXRpYyB2b2lkIFNldEJ1dHRvblNjYWxlSG93KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7CisgIHN0YXRpYyB2b2lkIFNldEJ1dHRvblNjYWxlV2hlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICBzdGF0aWMgdm9pZCBTZXRDYWxjT3JkZXJJbmRleChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICBzdGF0aWMgdm9pZCBTZXRDaGFyTGltaXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKTsKKyAgc3RhdGljIHZvaWQgU2V0Q29tYihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYik7CisgIHN0YXRpYyB2b2lkIFNldENvbW1pdE9uU2VsQ2hhbmdlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKTsKKyAgc3RhdGljIHZvaWQgU2V0Q3VycmVudFZhbHVlSW5kaWNlcyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9EV29yZEFycmF5JiBhcnJheSk7CisgIHN0YXRpYyB2b2lkIFNldERlZmF1bHRTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCk7CisgIHN0YXRpYyB2b2lkIFNldERlZmF1bHRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpOworICBzdGF0aWMgdm9pZCBTZXREb05vdFNjcm9sbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYik7CisgIHN0YXRpYyB2b2lkIFNldERpc3BsYXkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKTsKKyAgc3RhdGljIHZvaWQgU2V0RmlsbENvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworICBzdGF0aWMgdm9pZCBTZXRIaWRkZW4oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpOworICBzdGF0aWMgdm9pZCBTZXRIaWdobGlnaHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKKyAgc3RhdGljIHZvaWQgU2V0TGluZVdpZHRoKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7CisgIHN0YXRpYyB2b2lkIFNldE11bHRpbGluZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYik7CisgIHN0YXRpYyB2b2lkIFNldE11bHRpcGxlU2VsZWN0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKTsKKyAgc3RhdGljIHZvaWQgU2V0UGFzc3dvcmQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpOworICBzdGF0aWMgdm9pZCBTZXRSZWN0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKKyAgc3RhdGljIHZvaWQgU2V0UmljaFRleHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpOworICBzdGF0aWMgdm9pZCBTZXRSaWNoVmFsdWUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgpOworICBzdGF0aWMgdm9pZCBTZXRSb3RhdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICBzdGF0aWMgdm9pZCBTZXRTdHJva2VDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKKyAgc3RhdGljIHZvaWQgU2V0U3R5bGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKKyAgc3RhdGljIHZvaWQgU2V0VGV4dENvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworICBzdGF0aWMgdm9pZCBTZXRUZXh0Rm9udChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOworICBzdGF0aWMgdm9pZCBTZXRUZXh0U2l6ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICBzdGF0aWMgdm9pZCBTZXRVc2VyTmFtZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpOworICBzdGF0aWMgdm9pZCBTZXRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19XaWRlU3RyaW5nQXJyYXkmIHN0ckFycmF5KTsKIAotcHVibGljOgotCXN0YXRpYyB2b2lkCQkJCQkJCUFkZEZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgaW50IG5QYWdlSW5kZXgsIGludCBuRmllbGRUeXBlLAotCQkJCQkJCQkJCQljb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUsIGNvbnN0IENQREZfUmVjdCYgcmNDb29yZHMpOwotcHVibGljOgotCXN0YXRpYyB2b2lkCQkJCQkJCVVwZGF0ZUZvcm1GaWVsZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAotCQkJCQkJCQkJCQlGWF9CT09MIGJDaGFuZ2VNYXJrLCBGWF9CT09MIGJSZXNldEFQLCBGWF9CT09MIGJSZWZyZXNoKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQlVcGRhdGVGb3JtQ29udHJvbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCwKLQkJCQkJCQkJCQkJRlhfQk9PTCBiQ2hhbmdlTWFyaywgRlhfQk9PTCBiUmVzZXRBUCwgRlhfQk9PTCBiUmVmcmVzaCk7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBBZGRGaWVsZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGFnZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjQ29vcmRzKTsKIAotCXN0YXRpYyBDUERGU0RLX1dpZGdldCoJCQkJCUdldFdpZGdldChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJR2V0Rm9ybUZpZWxkcyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSwgQ0ZYX1B0ckFycmF5JiBGaWVsZHNBcnJheSk7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBVcGRhdGVGb3JtRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFuZ2VNYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzZXRBUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlZnJlc2gpOworICBzdGF0aWMgdm9pZCBVcGRhdGVGb3JtQ29udHJvbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhbmdlTWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzZXRBUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVmcmVzaCk7CiAKLQlzdGF0aWMgdm9pZAkJCQkJCQlEb0RlbGF5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0pTX0RlbGF5RGF0YSogcERhdGEpOworICBzdGF0aWMgQ1BERlNES19XaWRnZXQqIEdldFdpZGdldChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCk7CisgIHN0YXRpYyB2b2lkIEdldEZvcm1GaWVsZHMoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkmIEZpZWxkc0FycmF5KTsKIAotcHVibGljOgotCUZYX0JPT0wJCQkJCQkJCUF0dGFjaEZpZWxkKERvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7Ci0Jdm9pZAkJCQkJCQkJU2V0RGVsYXkoRlhfQk9PTCBiRGVsYXkpOwotCXZvaWQJCQkJCQkJCVNldElzb2xhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUpIHttX2lzb2xhdGUgPSBpc29sYXRlO30KLXByb3RlY3RlZDoKLQl2b2lkCQkJCQkJCQlQYXJzZUZpZWxkTmFtZShjb25zdCBzdGQ6OndzdHJpbmcgJnN0ckZpZWxkTmFtZVBhcnNlZCxzdGQ6OndzdHJpbmcgJnN0ckZpZWxkTmFtZSxpbnQgJiBpQ29udHJvbE5vKTsKLQl2b2lkCQkJCQkJCQlHZXRGb3JtRmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSwgQ0ZYX1B0ckFycmF5JiBGaWVsZHNBcnJheSk7Ci0JQ1BERl9Gb3JtQ29udHJvbCogCQkJCQlHZXRTbWFydEZpZWxkQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCk7Ci0JRlhfQk9PTAkJCQkJCQkJVmFsdWVJc09jY3VyKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyBjc09wdExhYmVsKTsKKyAgc3RhdGljIHZvaWQgRG9EZWxheShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENKU19EZWxheURhdGEqIHBEYXRhKTsKIAotCXZvaWQJCQkJCQkJCUFkZERlbGF5X0ludChlbnVtIEZJRUxEX1BST1AgcHJvcCwgaW50MzJfdCBuKTsKLQl2b2lkCQkJCQkJCQlBZGREZWxheV9Cb29sKGVudW0gRklFTERfUFJPUCBwcm9wLGJvb2wgYik7Ci0Jdm9pZAkJCQkJCQkJQWRkRGVsYXlfU3RyaW5nKGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKLQl2b2lkCQkJCQkJCQlBZGREZWxheV9XaWRlU3RyaW5nKGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKTsKLQl2b2lkCQkJCQkJCQlBZGREZWxheV9SZWN0KGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDUERGX1JlY3QmIHJlY3QpOwotCXZvaWQJCQkJCQkJCUFkZERlbGF5X0NvbG9yKGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0Jdm9pZAkJCQkJCQkJQWRkRGVsYXlfV29yZEFycmF5KGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDRlhfRFdvcmRBcnJheSYgYXJyYXkpOwotCXZvaWQJCQkJCQkJCUFkZERlbGF5X1dpZGVTdHJpbmdBcnJheShlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0pTX1dpZGVTdHJpbmdBcnJheSYgYXJyYXkpOworIHB1YmxpYzoKKyAgRlhfQk9PTCBBdHRhY2hGaWVsZChEb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpOworICB2b2lkIFNldERlbGF5KEZYX0JPT0wgYkRlbGF5KTsKKyAgdm9pZCBTZXRJc29sYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlKSB7IG1faXNvbGF0ZSA9IGlzb2xhdGU7IH0KIAotCXZvaWQJCQkJCQkJCURvRGVsYXkoKTsKLXB1YmxpYzoKLQlEb2N1bWVudCoJCQkJCQkJbV9wSlNEb2M7Ci0JQ1BERlNES19Eb2N1bWVudCoJCQkJCW1fcERvY3VtZW50OwotCUNGWF9XaWRlU3RyaW5nCQkJCQkJbV9GaWVsZE5hbWU7Ci0JaW50CQkJCQkJCQkJbV9uRm9ybUNvbnRyb2xJbmRleDsKLQlGWF9CT09MCQkJCQkJCQltX2JDYW5TZXQ7CisgcHJvdGVjdGVkOgorICB2b2lkIFBhcnNlRmllbGROYW1lKGNvbnN0IHN0ZDo6d3N0cmluZyYgc3RyRmllbGROYW1lUGFyc2VkLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6d3N0cmluZyYgc3RyRmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGludCYgaUNvbnRyb2xObyk7CisgIHZvaWQgR2V0Rm9ybUZpZWxkcyhjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkmIEZpZWxkc0FycmF5KTsKKyAgQ1BERl9Gb3JtQ29udHJvbCogR2V0U21hcnRGaWVsZENvbnRyb2woQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQpOworICBGWF9CT09MIFZhbHVlSXNPY2N1cihDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCk7CiAKLQlGWF9CT09MCQkJCQkJCQltX2JEZWxheTsKLQl2ODo6SXNvbGF0ZSoJCQkJCQkJbV9pc29sYXRlOworICB2b2lkIEFkZERlbGF5X0ludChlbnVtIEZJRUxEX1BST1AgcHJvcCwgaW50MzJfdCBuKTsKKyAgdm9pZCBBZGREZWxheV9Cb29sKGVudW0gRklFTERfUFJPUCBwcm9wLCBib29sIGIpOworICB2b2lkIEFkZERlbGF5X1N0cmluZyhlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZyk7CisgIHZvaWQgQWRkRGVsYXlfV2lkZVN0cmluZyhlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZyk7CisgIHZvaWQgQWRkRGVsYXlfUmVjdChlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKKyAgdm9pZCBBZGREZWxheV9Db2xvcihlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworICB2b2lkIEFkZERlbGF5X1dvcmRBcnJheShlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0ZYX0RXb3JkQXJyYXkmIGFycmF5KTsKKyAgdm9pZCBBZGREZWxheV9XaWRlU3RyaW5nQXJyYXkoZW51bSBGSUVMRF9QUk9QIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19XaWRlU3RyaW5nQXJyYXkmIGFycmF5KTsKKworICB2b2lkIERvRGVsYXkoKTsKKworIHB1YmxpYzoKKyAgRG9jdW1lbnQqIG1fcEpTRG9jOworICBDUERGU0RLX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKKyAgQ0ZYX1dpZGVTdHJpbmcgbV9GaWVsZE5hbWU7CisgIGludCBtX25Gb3JtQ29udHJvbEluZGV4OworICBGWF9CT09MIG1fYkNhblNldDsKKworICBGWF9CT09MIG1fYkRlbGF5OworICB2ODo6SXNvbGF0ZSogbV9pc29sYXRlOwogfTsKIAotY2xhc3MgQ0pTX0ZpZWxkIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfRmllbGQoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX0ZpZWxkKHZvaWQpe307CitjbGFzcyBDSlNfRmllbGQgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBDSlNfRmllbGQoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCl7fTsKKyAgdmlydHVhbCB+Q0pTX0ZpZWxkKHZvaWQpe307CiAKLQl2aXJ0dWFsIEZYX0JPT0wJSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKTsKKyAgdmlydHVhbCBGWF9CT09MIEluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyk7CiAKLQlERUNMQVJFX0pTX0NMQVNTKENKU19GaWVsZCk7CisgIERFQ0xBUkVfSlNfQ0xBU1MoQ0pTX0ZpZWxkKTsKIAotICAgIEpTX1NUQVRJQ19QUk9QKGFsaWdubWVudCwgRmllbGQpOwotICAgIEpTX1NUQVRJQ19QUk9QKGJvcmRlclN0eWxlLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoYnV0dG9uQWxpZ25YLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoYnV0dG9uQWxpZ25ZLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoYnV0dG9uRml0Qm91bmRzLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoYnV0dG9uUG9zaXRpb24sIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChidXR0b25TY2FsZUhvdywgRmllbGQpOwotICAgIEpTX1NUQVRJQ19QUk9QKGJ1dHRvblNjYWxlV2hlbiwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKGNhbGNPcmRlckluZGV4LCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoY2hhckxpbWl0LCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoY29tYiwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKGNvbW1pdE9uU2VsQ2hhbmdlLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoY3VycmVudFZhbHVlSW5kaWNlcywgRmllbGQpOwotICAgIEpTX1NUQVRJQ19QUk9QKGRlZmF1bHRTdHlsZSwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKGRlZmF1bHRWYWx1ZSwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKGRvTm90U2Nyb2xsLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoZG9Ob3RTcGVsbENoZWNrLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoZGVsYXksIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChkaXNwbGF5LCBGaWVsZCk7Ci0gICAgSlNfU1RBVElDX1BST1AoZG9jLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoZWRpdGFibGUsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChleHBvcnRWYWx1ZXMsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChmaWxlU2VsZWN0LCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoZmlsbENvbG9yLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoaGlkZGVuLCBGaWVsZCk7Ci0gICAgSlNfU1RBVElDX1BST1AoaGlnaGxpZ2h0LCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AobGluZVdpZHRoLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AobXVsdGlsaW5lLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AobXVsdGlwbGVTZWxlY3Rpb24sIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChuYW1lLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AobnVtSXRlbXMsIEZpZWxkKTsKLSAgICBKU19TVEFUSUNfUFJPUChwYWdlLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AocGFzc3dvcmQsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChwcmludCwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHJhZGlvc0luVW5pc29uLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AocmVhZG9ubHksIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChyZWN0LCBGaWVsZCk7Ci0gICAgSlNfU1RBVElDX1BST1AocmVxdWlyZWQsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChyaWNoVGV4dCwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHJpY2hWYWx1ZSwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHJvdGF0aW9uLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1Aoc3Ryb2tlQ29sb3IsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChzdHlsZSwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHN1Ym1pdE5hbWUsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUCh0ZXh0Q29sb3IsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUCh0ZXh0Rm9udCwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHRleHRTaXplLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AodHlwZSwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHVzZXJOYW1lLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AodmFsdWUsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUCh2YWx1ZUFzU3RyaW5nLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1Aoc291cmNlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGFsaWdubWVudCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChib3JkZXJTdHlsZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChidXR0b25BbGlnblgsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoYnV0dG9uQWxpZ25ZLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGJ1dHRvbkZpdEJvdW5kcywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChidXR0b25Qb3NpdGlvbiwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChidXR0b25TY2FsZUhvdywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChidXR0b25TY2FsZVdoZW4sIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoY2FsY09yZGVySW5kZXgsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoY2hhckxpbWl0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGNvbWIsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoY29tbWl0T25TZWxDaGFuZ2UsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoY3VycmVudFZhbHVlSW5kaWNlcywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChkZWZhdWx0U3R5bGUsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoZGVmYXVsdFZhbHVlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGRvTm90U2Nyb2xsLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGRvTm90U3BlbGxDaGVjaywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChkZWxheSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChkaXNwbGF5LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGRvYywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChlZGl0YWJsZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChleHBvcnRWYWx1ZXMsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoZmlsZVNlbGVjdCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChmaWxsQ29sb3IsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoaGlkZGVuLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGhpZ2hsaWdodCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChsaW5lV2lkdGgsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AobXVsdGlsaW5lLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKG11bHRpcGxlU2VsZWN0aW9uLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKG5hbWUsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AobnVtSXRlbXMsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AocGFnZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChwYXNzd29yZCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChwcmludCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChyYWRpb3NJblVuaXNvbiwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChyZWFkb25seSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChyZWN0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHJlcXVpcmVkLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHJpY2hUZXh0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHJpY2hWYWx1ZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChyb3RhdGlvbiwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChzdHJva2VDb2xvciwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChzdHlsZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChzdWJtaXROYW1lLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHRleHRDb2xvciwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUCh0ZXh0Rm9udCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUCh0ZXh0U2l6ZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUCh0eXBlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHVzZXJOYW1lLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHZhbHVlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHZhbHVlQXNTdHJpbmcsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1Aoc291cmNlLCBGaWVsZCk7CiAKLQlKU19TVEFUSUNfTUVUSE9EKGJyb3dzZUZvckZpbGVUb1N1Ym1pdCwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0QoYnV0dG9uR2V0Q2FwdGlvbiwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0QoYnV0dG9uR2V0SWNvbiwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0QoYnV0dG9uSW1wb3J0SWNvbiwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0QoYnV0dG9uU2V0Q2FwdGlvbiwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0QoYnV0dG9uU2V0SWNvbiwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0QoY2hlY2tUaGlzQm94LCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChjbGVhckl0ZW1zLCBGaWVsZCk7Ci0gCUpTX1NUQVRJQ19NRVRIT0QoZGVmYXVsdElzQ2hlY2tlZCwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZGVsZXRlSXRlbUF0LCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChnZXRBcnJheSwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0SXRlbUF0LCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChnZXRMb2NrLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChpbnNlcnRJdGVtQXQsIEZpZWxkKTsKLQlKU19TVEFUSUNfTUVUSE9EKGlzQm94Q2hlY2tlZCwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0QoaXNEZWZhdWx0Q2hlY2tlZCwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0Qoc2V0QWN0aW9uLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChzZXRGb2N1cywgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0Qoc2V0SXRlbXMsIEZpZWxkKTsKLQlKU19TVEFUSUNfTUVUSE9EKHNldExvY2ssIEZpZWxkKTsKLQlKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZUdldE1vZGlmaWNhdGlvbnMsIEZpZWxkKTsKLQlKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZUdldFNlZWRWYWx1ZSwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlSW5mbywgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlU2V0U2VlZFZhbHVlLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVTaWduLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVWYWxpZGF0ZSwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGJyb3dzZUZvckZpbGVUb1N1Ym1pdCwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGJ1dHRvbkdldENhcHRpb24sIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChidXR0b25HZXRJY29uLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYnV0dG9uSW1wb3J0SWNvbiwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGJ1dHRvblNldENhcHRpb24sIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChidXR0b25TZXRJY29uLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoY2hlY2tUaGlzQm94LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoY2xlYXJJdGVtcywgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGRlZmF1bHRJc0NoZWNrZWQsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChkZWxldGVJdGVtQXQsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRBcnJheSwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldEl0ZW1BdCwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldExvY2ssIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChpbnNlcnRJdGVtQXQsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChpc0JveENoZWNrZWQsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChpc0RlZmF1bHRDaGVja2VkLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2V0QWN0aW9uLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2V0Rm9jdXMsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChzZXRJdGVtcywgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKHNldExvY2ssIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlR2V0U2VlZFZhbHVlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlSW5mbywgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZVNldFNlZWRWYWx1ZSwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZVNpZ24sIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVWYWxpZGF0ZSwgRmllbGQpOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9GSUVMRF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgKaW5kZXggMWQ5Mzk2Zi4uZDJjYmZiMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oCkBAIC0xNiwxMDMgKzE2LDE2MSBAQAogY2xhc3MgQ1BERlNES19Bbm5vdDsKIGNsYXNzIENQREZTREtfRG9jdW1lbnQ7CiAKLWNsYXNzIElGWEpTX0NvbnRleHQKLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB+SUZYSlNfQ29udGV4dCgpIHsgfQotCXZpcnR1YWwgRlhfQk9PTAkJCQlDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCVJ1blNjcmlwdChjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbykgPSAwOworY2xhc3MgSUZYSlNfQ29udGV4dCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhKU19Db250ZXh0KCkge30KKyAgdmlydHVhbCBGWF9CT09MIENvbXBpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFJ1blNjcmlwdChjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBpbmZvKSA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25BcHBfSW5pdCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uQXBwX0luaXQoKSA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25Eb2NfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkRvY19XaWxsUHJpbnQoQ1BERlNES19Eb2N1bWVudCogcERvYykgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkRvY19EaWRQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRG9jX1dpbGxTYXZlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Eb2NfRGlkU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRG9jX1dpbGxDbG9zZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkRvY19PcGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkRvY19XaWxsUHJpbnQoQ1BERlNES19Eb2N1bWVudCogcERvYykgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Eb2NfRGlkUHJpbnQoQ1BERlNES19Eb2N1bWVudCogcERvYykgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Eb2NfV2lsbFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYykgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Eb2NfRGlkU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcERvYykgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uUGFnZV9PcGVuKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX0Nsb3NlKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uUGFnZV9PcGVuKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uUGFnZV9DbG9zZShDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblBhZ2VfSW5WaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0tleXN0cm9rZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCi0JCQkJCQkJCQlGWF9CT09MIEtleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLCBpbnQgJm5TZWxFbmQsaW50ICZuU2VsU3RhcnQsIEZYX0JPT0wgYlNoaWZ0LAotCQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwKLQkJCQkJCQkJCUZYX0JPT0wgYkZpZWxkRnVsbCwgRlhfQk9PTCAmYlJjKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLAotCQkJCQkJCQkJRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lsbENvbW1pdCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lsbENvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpZWxkRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYykgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJjKSA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fT3V0VmlldyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbk1lbnVfRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uQmF0Y2hFeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Db25zb2xlX0V4ZWMoKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRXh0ZXJuYWxfRXhlYygpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uTWVudV9FeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uQmF0Y2hFeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uQ29uc29sZV9FeGVjKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25FeHRlcm5hbF9FeGVjKCkgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCUVuYWJsZU1lc3NhZ2VCb3goRlhfQk9PTCBiRW5hYmxlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBFbmFibGVNZXNzYWdlQm94KEZYX0JPT0wgYkVuYWJsZSkgPSAwOwogfTsKIAotY2xhc3MgSUZYSlNfUnVudGltZQotewotcHVibGljOgotCXZpcnR1YWwgSUZYSlNfQ29udGV4dCoJCU5ld0NvbnRleHQoKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCVJlbGVhc2VDb250ZXh0KElGWEpTX0NvbnRleHQgKiBwQ29udGV4dCkgPSAwOwotCXZpcnR1YWwgSUZYSlNfQ29udGV4dCoJCUdldEN1cnJlbnRDb250ZXh0KCkgPSAwOworY2xhc3MgSUZYSlNfUnVudGltZSB7CisgcHVibGljOgorICB2aXJ0dWFsIElGWEpTX0NvbnRleHQqIE5ld0NvbnRleHQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlQ29udGV4dChJRlhKU19Db250ZXh0KiBwQ29udGV4dCkgPSAwOworICB2aXJ0dWFsIElGWEpTX0NvbnRleHQqIEdldEN1cnJlbnRDb250ZXh0KCkgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCVNldFJlYWRlckRvY3VtZW50KENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFJlYWRlckRvY3VtZW50KENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MpID0gMDsKIAotCXZpcnR1YWwJQ1BERlNES19Eb2N1bWVudCoJR2V0UmVhZGVyRG9jdW1lbnQoKSA9IDA7CisgIHZpcnR1YWwgQ1BERlNES19Eb2N1bWVudCogR2V0UmVhZGVyRG9jdW1lbnQoKSA9IDA7CiAKLQl2aXJ0dWFsCUZYX0JPT0wJCQkJR2V0SFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpID0gMDsKLQl2aXJ0dWFsCUZYX0JPT0wJCQkJU2V0SFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEdldEhWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFNldEhWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpID0gMDsKIAotcHJvdGVjdGVkOgotICAgICAgICAgfklGWEpTX1J1bnRpbWUoKSB7IH0KKyBwcm90ZWN0ZWQ6CisgIH5JRlhKU19SdW50aW1lKCkge30KIH07CiAKIGNsYXNzIENQREZEb2NfRW52aXJvbm1lbnQ7CiBjbGFzcyBDSlNfR2xvYmFsRGF0YTsKIAotY2xhc3MgQ0pTX1J1bnRpbWVGYWN0b3J5Ci17Ci1wdWJsaWM6Ci0JQ0pTX1J1bnRpbWVGYWN0b3J5KCk6bV9iSW5pdChGQUxTRSksbV9uUmVmKDApLG1fcEdsb2JhbERhdGEoTlVMTCksbV9uR2xvYmFsRGF0YUNvdW50KDApIHt9Ci0JfkNKU19SdW50aW1lRmFjdG9yeSgpOwotCUlGWEpTX1J1bnRpbWUqCQkJCQlOZXdKU1J1bnRpbWUoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7Ci0Jdm9pZAkJCQkJCQlEZWxldGVKU1J1bnRpbWUoSUZYSlNfUnVudGltZSogcFJ1bnRpbWUpOwotCXZvaWQJCQkJCQkJQWRkUmVmKCk7Ci0Jdm9pZAkJCQkJCQlSZWxlYXNlKCk7CitjbGFzcyBDSlNfUnVudGltZUZhY3RvcnkgeworIHB1YmxpYzoKKyAgQ0pTX1J1bnRpbWVGYWN0b3J5KCkKKyAgICAgIDogbV9iSW5pdChGQUxTRSksIG1fblJlZigwKSwgbV9wR2xvYmFsRGF0YShOVUxMKSwgbV9uR2xvYmFsRGF0YUNvdW50KDApIHt9CisgIH5DSlNfUnVudGltZUZhY3RvcnkoKTsKKyAgSUZYSlNfUnVudGltZSogTmV3SlNSdW50aW1lKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOworICB2b2lkIERlbGV0ZUpTUnVudGltZShJRlhKU19SdW50aW1lKiBwUnVudGltZSk7CisgIHZvaWQgQWRkUmVmKCk7CisgIHZvaWQgUmVsZWFzZSgpOwogCi0JQ0pTX0dsb2JhbERhdGEqCQkJCQlOZXdHbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwotCXZvaWQJCQkJCQkJUmVsZWFzZUdsb2JhbERhdGEoKTsKLXByaXZhdGU6Ci0JRlhfQk9PTCBtX2JJbml0OwotCWludCBtX25SZWY7Ci0JQ0pTX0dsb2JhbERhdGEqCQkJCQltX3BHbG9iYWxEYXRhOwotCWludDMyX3QJCQkJCQltX25HbG9iYWxEYXRhQ291bnQ7CisgIENKU19HbG9iYWxEYXRhKiBOZXdHbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOworICB2b2lkIFJlbGVhc2VHbG9iYWxEYXRhKCk7CisKKyBwcml2YXRlOgorICBGWF9CT09MIG1fYkluaXQ7CisgIGludCBtX25SZWY7CisgIENKU19HbG9iYWxEYXRhKiBtX3BHbG9iYWxEYXRhOworICBpbnQzMl90IG1fbkdsb2JhbERhdGFDb3VudDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSUpBVkFTQ1JJUFRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ljb24uaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ljb24uaAppbmRleCAwMjk4MDA1Li4wYjU0OWVjIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JY29uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSWNvbi5oCkBAIC05LDMyICs5LDMwIEBACiAKICNpbmNsdWRlICJKU19EZWZpbmUuaCIKIAotY2xhc3MgSWNvbiA6IHB1YmxpYyBDSlNfRW1iZWRPYmoKLXsKLXB1YmxpYzoKLQlJY29uKENKU19PYmplY3QqIHBKU09iamVjdCk7Ci0JdmlydHVhbCB+SWNvbigpOwotCUZYX0JPT0wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXZvaWQJCQkJU2V0U3RyZWFtKENQREZfU3RyZWFtKiBwSWNvblN0cmVhbSk7Ci0JQ1BERl9TdHJlYW0qCQlHZXRTdHJlYW0oKTsKLQl2b2lkCQkJCVNldEljb25OYW1lKENGWF9XaWRlU3RyaW5nIG5hbWUpOwotCUNGWF9XaWRlU3RyaW5nCQlHZXRJY29uTmFtZSgpOworY2xhc3MgSWNvbiA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgSWNvbihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOworICB2aXJ0dWFsIH5JY29uKCk7CisgIEZYX0JPT0wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICB2b2lkIFNldFN0cmVhbShDUERGX1N0cmVhbSogcEljb25TdHJlYW0pOworICBDUERGX1N0cmVhbSogR2V0U3RyZWFtKCk7CisgIHZvaWQgU2V0SWNvbk5hbWUoQ0ZYX1dpZGVTdHJpbmcgbmFtZSk7CisgIENGWF9XaWRlU3RyaW5nIEdldEljb25OYW1lKCk7CiAKLXByaXZhdGU6Ci0JQ1BERl9TdHJlYW0qCQltX3BJY29uU3RyZWFtOwotCUNGWF9XaWRlU3RyaW5nCQltX3N3SWNvbk5hbWU7CisgcHJpdmF0ZToKKyAgQ1BERl9TdHJlYW0qIG1fcEljb25TdHJlYW07CisgIENGWF9XaWRlU3RyaW5nIG1fc3dJY29uTmFtZTsKIH07CiAKLWNsYXNzIENKU19JY29uIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfSWNvbihKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KXt9OwotCXZpcnR1YWwgfkNKU19JY29uKCl7fTsKK2NsYXNzIENKU19JY29uIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pTX0ljb24oSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCl7fTsKKyAgdmlydHVhbCB+Q0pTX0ljb24oKXt9OwogCi1wdWJsaWM6Ci0JREVDTEFSRV9KU19DTEFTUyhDSlNfSWNvbik7CisgcHVibGljOgorICBERUNMQVJFX0pTX0NMQVNTKENKU19JY29uKTsKIAotCUpTX1NUQVRJQ19QUk9QKG5hbWUsIEljb24pOworICBKU19TVEFUSUNfUFJPUChuYW1lLCBJY29uKTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSUNPTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oCmluZGV4IDA2MGJiNTUuLmY2MWYzN2MgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19Db250ZXh0LmgKQEAgLTE0LDg0ICsxNCwxMzggQEAKIGNsYXNzIENKU19FdmVudEhhbmRsZXI7CiBjbGFzcyBDSlNfUnVudGltZTsKIAotY2xhc3MgQ0pTX0NvbnRleHQgOiBwdWJsaWMgSUZYSlNfQ29udGV4dAotewotcHVibGljOgotCUNKU19Db250ZXh0KENKU19SdW50aW1lKiBwUnVudGltZSk7Ci0JdmlydHVhbCB+Q0pTX0NvbnRleHQoKTsKK2NsYXNzIENKU19Db250ZXh0IDogcHVibGljIElGWEpTX0NvbnRleHQgeworIHB1YmxpYzoKKyAgQ0pTX0NvbnRleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgdmlydHVhbCB+Q0pTX0NvbnRleHQoKTsKIAotcHVibGljOgotCXZpcnR1YWwgRlhfQk9PTAkJCQlDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJUnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKKyBwdWJsaWM6CisgIHZpcnR1YWwgRlhfQk9PTCBDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKKyAgdmlydHVhbCBGWF9CT09MIFJ1blNjcmlwdChjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbyk7CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIHZvaWQJCQkJT25BcHBfSW5pdCgpOworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIE9uQXBwX0luaXQoKTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkRvY19PcGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Eb2NfV2lsbFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkRvY19EaWRQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Eb2NfV2lsbFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRG9jX0RpZFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRG9jX1dpbGxDbG9zZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKKyAgdmlydHVhbCB2b2lkIE9uRG9jX09wZW4oQ1BERlNES19Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpOworICB2aXJ0dWFsIHZvaWQgT25Eb2NfV2lsbFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpOworICB2aXJ0dWFsIHZvaWQgT25Eb2NfRGlkUHJpbnQoQ1BERlNES19Eb2N1bWVudCogcERvYyk7CisgIHZpcnR1YWwgdm9pZCBPbkRvY19XaWxsU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKKyAgdmlydHVhbCB2b2lkIE9uRG9jX0RpZFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYyk7CisgIHZpcnR1YWwgdm9pZCBPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcERvYyk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX09wZW4oQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uUGFnZV9DbG9zZShDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX091dFZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7CisgIHZpcnR1YWwgdm9pZCBPblBhZ2VfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKKyAgdmlydHVhbCB2b2lkIE9uUGFnZV9DbG9zZShDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKKyAgdmlydHVhbCB2b2lkIE9uUGFnZV9JblZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7CisgIHZpcnR1YWwgdm9pZCBPblBhZ2VfT3V0VmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KTsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCk7CisgIHZpcnR1YWwgdm9pZCBPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KTsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfQmx1cihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MIGJXaWxsQ29tbWl0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIGludCAmblNlbEVuZCxpbnQgJm5TZWxTdGFydCwgRlhfQk9PTCBiU2hpZnQsCi0JCQkJCQkJCQlDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MIGJXaWxsQ29tbWl0LAotCQkJCQkJCQkJRlhfQk9PTCBiRmllbGRGdWxsLCBGWF9CT09MICZiUmMpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwKLQkJCQkJCQkJCUZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKTsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWxsQ29tbWl0KTsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWxsQ29tbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmllbGRGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJjKTsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYyk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0luVmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9DbG9zZShGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyayk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOworICB2aXJ0dWFsIHZvaWQgT25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyayk7CisgIHZpcnR1YWwgdm9pZCBPbkxpbmtfTW91c2VVcChDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbk1lbnVfRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uQmF0Y2hFeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkNvbnNvbGVfRXhlYygpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkV4dGVybmFsX0V4ZWMoKTsKKyAgdmlydHVhbCB2b2lkIE9uTWVudV9FeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSk7CisgIHZpcnR1YWwgdm9pZCBPbkJhdGNoRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKKyAgdmlydHVhbCB2b2lkIE9uQ29uc29sZV9FeGVjKCk7CisgIHZpcnR1YWwgdm9pZCBPbkV4dGVybmFsX0V4ZWMoKTsKIAotCXZpcnR1YWwgdm9pZAkJCQlFbmFibGVNZXNzYWdlQm94KEZYX0JPT0wgYkVuYWJsZSkge21fYk1zZ0JveEVuYWJsZSA9IGJFbmFibGU7fQotCUZYX0JPT0wJCQkJCQlJc01zZ0JveEVuYWJsZWQoKSBjb25zdCB7cmV0dXJuIG1fYk1zZ0JveEVuYWJsZTt9CisgIHZpcnR1YWwgdm9pZCBFbmFibGVNZXNzYWdlQm94KEZYX0JPT0wgYkVuYWJsZSkgeyBtX2JNc2dCb3hFbmFibGUgPSBiRW5hYmxlOyB9CisgIEZYX0JPT0wgSXNNc2dCb3hFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbV9iTXNnQm94RW5hYmxlOyB9CiAKLXB1YmxpYzoKLQlDUERGRG9jX0Vudmlyb25tZW50KgkJR2V0UmVhZGVyQXBwKCk7Ci0JQ0pTX1J1bnRpbWUqCQkJCUdldEpTUnVudGltZSgpe3JldHVybiBtX3BSdW50aW1lO30KKyBwdWJsaWM6CisgIENQREZEb2NfRW52aXJvbm1lbnQqIEdldFJlYWRlckFwcCgpOworICBDSlNfUnVudGltZSogR2V0SlNSdW50aW1lKCkgeyByZXR1cm4gbV9wUnVudGltZTsgfQogCi0JRlhfQk9PTAkJCQkJCURvSm9iKGludCBuTW9kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pOworICBGWF9CT09MIERvSm9iKGludCBuTW9kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pOwogCi0JQ0pTX0V2ZW50SGFuZGxlcioJCQlHZXRFdmVudEhhbmRsZXIoKXtyZXR1cm4gbV9wRXZlbnRIYW5kbGVyO307Ci0JQ1BERlNES19Eb2N1bWVudCoJCQlHZXRSZWFkZXJEb2N1bWVudCgpOworICBDSlNfRXZlbnRIYW5kbGVyKiBHZXRFdmVudEhhbmRsZXIoKSB7IHJldHVybiBtX3BFdmVudEhhbmRsZXI7IH07CisgIENQREZTREtfRG9jdW1lbnQqIEdldFJlYWRlckRvY3VtZW50KCk7CiAKLXByaXZhdGU6Ci0JQ0pTX1J1bnRpbWUqCQkJCW1fcFJ1bnRpbWU7Ci0JQ0pTX0V2ZW50SGFuZGxlcioJCQltX3BFdmVudEhhbmRsZXI7CisgcHJpdmF0ZToKKyAgQ0pTX1J1bnRpbWUqIG1fcFJ1bnRpbWU7CisgIENKU19FdmVudEhhbmRsZXIqIG1fcEV2ZW50SGFuZGxlcjsKIAotCUZYX0JPT0wJCQkJCQltX2JCdXN5OwotCUZYX0JPT0wJCQkJCQltX2JNc2dCb3hFbmFibGU7CisgIEZYX0JPT0wgbV9iQnVzeTsKKyAgRlhfQk9PTCBtX2JNc2dCb3hFbmFibGU7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKaW5kZXggYzQ4MGNlMy4uNzQ5MGEyZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKQEAgLTEyLDQ2ICsxMiw2OCBAQAogI2luY2x1ZGUgIkpTX09iamVjdC5oIgogI2luY2x1ZGUgIkpTX1ZhbHVlLmgiCiAKLXN0cnVjdCBKU0NvbnN0U3BlYwotewotCWNvbnN0IHdjaGFyX3QqIHBOYW1lOwotCWRvdWJsZSBudW1iZXI7Ci0JY29uc3Qgd2NoYXJfdCogc3RyaW5nOwotCXVpbnQ4X3QgdDsgLy8wOmRvdWJsZSAxOnN0cgorc3RydWN0IEpTQ29uc3RTcGVjIHsKKyAgY29uc3Qgd2NoYXJfdCogcE5hbWU7CisgIGRvdWJsZSBudW1iZXI7CisgIGNvbnN0IHdjaGFyX3QqIHN0cmluZzsKKyAgdWludDhfdCB0OyAgLy8gMDpkb3VibGUgMTpzdHIKIH07CiAKLXN0cnVjdCBKU1Byb3BlcnR5U3BlYwotewotCWNvbnN0IHdjaGFyX3QqIHBOYW1lOwotCXY4OjpBY2Nlc3NvckdldHRlckNhbGxiYWNrIHBQcm9wR2V0OwotCXY4OjpBY2Nlc3NvclNldHRlckNhbGxiYWNrIHBQcm9wUHV0Oworc3RydWN0IEpTUHJvcGVydHlTcGVjIHsKKyAgY29uc3Qgd2NoYXJfdCogcE5hbWU7CisgIHY4OjpBY2Nlc3NvckdldHRlckNhbGxiYWNrIHBQcm9wR2V0OworICB2ODo6QWNjZXNzb3JTZXR0ZXJDYWxsYmFjayBwUHJvcFB1dDsKIH07CiAKLXN0cnVjdCBKU01ldGhvZFNwZWMKLXsKLQljb25zdCB3Y2hhcl90KiBwTmFtZTsKLQl2ODo6RnVuY3Rpb25DYWxsYmFjayBwTWV0aG9kQ2FsbDsKK3N0cnVjdCBKU01ldGhvZFNwZWMgeworICBjb25zdCB3Y2hhcl90KiBwTmFtZTsKKyAgdjg6OkZ1bmN0aW9uQ2FsbGJhY2sgcE1ldGhvZENhbGw7CiB9OwogCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQVUJMSUMgREVGSU5FIFNQRUMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBKU19XSURFU1RSSU5HKHdpZGVzdHJpbmcpIEwjIyN3aWRlc3RyaW5nCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQVUJMSUMgREVGSU5FIFNQRUMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgSlNfV0lERVNUUklORyh3aWRlc3RyaW5nKSBMIyMgI3dpZGVzdHJpbmcKIAotI2RlZmluZSBCRUdJTl9KU19TVEFUSUNfQ09OU1QoanNfY2xhc3NfbmFtZSkgSlNDb25zdFNwZWMganNfY2xhc3NfbmFtZTo6SlNfQ2xhc3NfQ29uc3RzW10gPSB7Ci0jZGVmaW5lIEpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoY29uc3RfbmFtZSwgcFZhbHVlKSB7SlNfV0lERVNUUklORyhjb25zdF9uYW1lKSwgcFZhbHVlLCBMIiIsIDB9LAotI2RlZmluZSBKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKGNvbnN0X25hbWUsIHBWYWx1ZSkge0pTX1dJREVTVFJJTkcoY29uc3RfbmFtZSksIDAsIEpTX1dJREVTVFJJTkcocFZhbHVlKSwgMX0sCi0jZGVmaW5lIEVORF9KU19TVEFUSUNfQ09OU1QoKSB7MCwgMCwgMCwgMH19OworI2RlZmluZSBCRUdJTl9KU19TVEFUSUNfQ09OU1QoanNfY2xhc3NfbmFtZSkgXAorICBKU0NvbnN0U3BlYyBqc19jbGFzc19uYW1lOjpKU19DbGFzc19Db25zdHNbXSA9IHsKKyNkZWZpbmUgSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihjb25zdF9uYW1lLCBwVmFsdWUpIFwKKyAgeyBKU19XSURFU1RSSU5HKGNvbnN0X25hbWUpLCBwVmFsdWUsIEwiIiwgMCB9ICAgICAgICAgIFwKKyAgLAorI2RlZmluZSBKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKGNvbnN0X25hbWUsIHBWYWx1ZSkgICAgIFwKKyAgeyBKU19XSURFU1RSSU5HKGNvbnN0X25hbWUpLCAwLCBKU19XSURFU1RSSU5HKHBWYWx1ZSksIDEgfSBcCisgICwKKyNkZWZpbmUgRU5EX0pTX1NUQVRJQ19DT05TVCgpIFwKKyAgeyAwLCAwLCAwLCAwIH0gICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgOwogCi0jZGVmaW5lIEJFR0lOX0pTX1NUQVRJQ19QUk9QKGpzX2NsYXNzX25hbWUpIEpTUHJvcGVydHlTcGVjIGpzX2NsYXNzX25hbWU6OkpTX0NsYXNzX1Byb3BlcnRpZXNbXSA9IHsKLSNkZWZpbmUgSlNfU1RBVElDX1BST1BfRU5UUlkocHJvcF9uYW1lKSB7SlNfV0lERVNUUklORyhwcm9wX25hbWUpLCBnZXRfIyNwcm9wX25hbWUjI19zdGF0aWMsIHNldF8jI3Byb3BfbmFtZSMjX3N0YXRpY30sCi0jZGVmaW5lIEVORF9KU19TVEFUSUNfUFJPUCgpIHswLCAwLCAwfX07CisjZGVmaW5lIEJFR0lOX0pTX1NUQVRJQ19QUk9QKGpzX2NsYXNzX25hbWUpIFwKKyAgSlNQcm9wZXJ0eVNwZWMganNfY2xhc3NfbmFtZTo6SlNfQ2xhc3NfUHJvcGVydGllc1tdID0geworI2RlZmluZSBKU19TVEFUSUNfUFJPUF9FTlRSWShwcm9wX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEpTX1dJREVTVFJJTkcocHJvcF9uYW1lKSwgZ2V0XyMjcHJvcF9uYW1lIyNfc3RhdGljLCBzZXRfIyNwcm9wX25hbWUjI19zdGF0aWMgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAsCisjZGVmaW5lIEVORF9KU19TVEFUSUNfUFJPUCgpIFwKKyAgeyAwLCAwLCAwIH0gICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDsKIAotI2RlZmluZSBCRUdJTl9KU19TVEFUSUNfTUVUSE9EKGpzX2NsYXNzX25hbWUpIEpTTWV0aG9kU3BlYyBqc19jbGFzc19uYW1lOjpKU19DbGFzc19NZXRob2RzW10gPSB7Ci0jZGVmaW5lIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkobWV0aG9kX25hbWUpIHtKU19XSURFU1RSSU5HKG1ldGhvZF9uYW1lKSwgbWV0aG9kX25hbWUjI19zdGF0aWN9LAotI2RlZmluZSBFTkRfSlNfU1RBVElDX01FVEhPRCgpIHswLCAwfX07CisjZGVmaW5lIEJFR0lOX0pTX1NUQVRJQ19NRVRIT0QoanNfY2xhc3NfbmFtZSkgXAorICBKU01ldGhvZFNwZWMganNfY2xhc3NfbmFtZTo6SlNfQ2xhc3NfTWV0aG9kc1tdID0geworI2RlZmluZSBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG1ldGhvZF9uYW1lKSAgICAgICAgICAgIFwKKyAgeyBKU19XSURFU1RSSU5HKG1ldGhvZF9uYW1lKSwgbWV0aG9kX25hbWUjI19zdGF0aWMgfSBcCisgICwKKyNkZWZpbmUgRU5EX0pTX1NUQVRJQ19NRVRIT0QoKSBcCisgIHsgMCwgMCB9ICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgOwogCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBST1AgQ0FMTEJBQ0sgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUFJPUCBDQUxMQkFDSworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotdGVtcGxhdGUgPGNsYXNzIEMsIEZYX0JPT0wgKEM6OipNKShJRlhKU19Db250ZXh0KiwgQ0pTX1Byb3BWYWx1ZSYsIENGWF9XaWRlU3RyaW5nJik+Cit0ZW1wbGF0ZSA8Y2xhc3MgQywKKyAgICAgICAgICBGWF9CT09MIChDOjoqTSkoSUZYSlNfQ29udGV4dCosIENKU19Qcm9wVmFsdWUmLCBDRlhfV2lkZVN0cmluZyYpPgogdm9pZCBKU1Byb3BHZXR0ZXIoY29uc3QgY2hhciogcHJvcF9uYW1lX3N0cmluZywKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsYXNzX25hbWVfc3RyaW5nLAogICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LApAQCAtNjEsMTcgKzgzLDE5IEBACiAgIElGWEpTX0NvbnRleHQqIHBSdW50aW1lQ29udGV4dCA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwogICBDSlNfUHJvcFZhbHVlIHZhbHVlKGlzb2xhdGUpOwogICB2YWx1ZS5TdGFydEdldHRpbmcoKTsKLSAgQ0pTX09iamVjdCogcEpTT2JqID0gKENKU19PYmplY3QqKUpTX0dldFByaXZhdGUoaXNvbGF0ZSxpbmZvLkhvbGRlcigpKTsKKyAgQ0pTX09iamVjdCogcEpTT2JqID0gKENKU19PYmplY3QqKUpTX0dldFByaXZhdGUoaXNvbGF0ZSwgaW5mby5Ib2xkZXIoKSk7CiAgIEMqIHBPYmogPSByZWludGVycHJldF9jYXN0PEMqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOwogICBDRlhfV2lkZVN0cmluZyBzRXJyb3I7CiAgIGlmICghKHBPYmotPipNKShwUnVudGltZUNvbnRleHQsIHZhbHVlLCBzRXJyb3IpKSB7Ci0gICAgSlNfRXJyb3IoaXNvbGF0ZSwgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lX3N0cmluZywgcHJvcF9uYW1lX3N0cmluZywgc0Vycm9yKSk7CisgICAgSlNfRXJyb3IoaXNvbGF0ZSwKKyAgICAgICAgICAgICBKU0Zvcm1hdEVycm9yU3RyaW5nKGNsYXNzX25hbWVfc3RyaW5nLCBwcm9wX25hbWVfc3RyaW5nLCBzRXJyb3IpKTsKICAgICByZXR1cm47CiAgIH0KICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCgodjg6OkxvY2FsPHY4OjpWYWx1ZT4pdmFsdWUpOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQywgRlhfQk9PTCAoQzo6Kk0pKElGWEpTX0NvbnRleHQqLCBDSlNfUHJvcFZhbHVlJiwgQ0ZYX1dpZGVTdHJpbmcmKT4KK3RlbXBsYXRlIDxjbGFzcyBDLAorICAgICAgICAgIEZYX0JPT0wgKEM6OipNKShJRlhKU19Db250ZXh0KiwgQ0pTX1Byb3BWYWx1ZSYsIENGWF9XaWRlU3RyaW5nJik+CiB2b2lkIEpTUHJvcFNldHRlcihjb25zdCBjaGFyKiBwcm9wX25hbWVfc3RyaW5nLAogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZV9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCkBAIC04MiwzMiArMTA2LDM3IEBACiAgIElGWEpTX0NvbnRleHQqIHBSdW50aW1lQ29udGV4dCA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwogICBDSlNfUHJvcFZhbHVlIHByb3BWYWx1ZShDSlNfVmFsdWUoaXNvbGF0ZSwgdmFsdWUsIFZUX3Vua25vd24pKTsKICAgcHJvcFZhbHVlLlN0YXJ0U2V0dGluZygpOwotICBDSlNfT2JqZWN0KiBwSlNPYmogPSAoQ0pTX09iamVjdCopSlNfR2V0UHJpdmF0ZShpc29sYXRlLGluZm8uSG9sZGVyKCkpOworICBDSlNfT2JqZWN0KiBwSlNPYmogPSAoQ0pTX09iamVjdCopSlNfR2V0UHJpdmF0ZShpc29sYXRlLCBpbmZvLkhvbGRlcigpKTsKICAgQyogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qyo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7CiAgIENGWF9XaWRlU3RyaW5nIHNFcnJvcjsKICAgaWYgKCEocE9iai0+Kk0pKHBSdW50aW1lQ29udGV4dCwgcHJvcFZhbHVlLCBzRXJyb3IpKSB7Ci0gICAgSlNfRXJyb3IoaXNvbGF0ZSwgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lX3N0cmluZywgcHJvcF9uYW1lX3N0cmluZywgc0Vycm9yKSk7CisgICAgSlNfRXJyb3IoaXNvbGF0ZSwKKyAgICAgICAgICAgICBKU0Zvcm1hdEVycm9yU3RyaW5nKGNsYXNzX25hbWVfc3RyaW5nLCBwcm9wX25hbWVfc3RyaW5nLCBzRXJyb3IpKTsKICAgfQogfQogCi0jZGVmaW5lIEpTX1NUQVRJQ19QUk9QKHByb3BfbmFtZSwgY2xhc3NfbmFtZSkgXAotICBzdGF0aWMgdm9pZCBnZXRfIyNwcm9wX25hbWUjI19zdGF0aWMoIFwKLSAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgXAotICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsgXAotICAgIEpTUHJvcEdldHRlcjxjbGFzc19uYW1lLCAmY2xhc3NfbmFtZTo6cHJvcF9uYW1lPiggXAotICAgICAgICAjcHJvcF9uYW1lLCAjY2xhc3NfbmFtZSwgcHJvcGVydHksIGluZm8pOyBcCi0gIH0gXAotICBzdGF0aWMgdm9pZCBzZXRfIyNwcm9wX25hbWUjI19zdGF0aWMoIFwKLSAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgXAotICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsIFwKLSAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2b2lkPiYgaW5mbykgeyBcCi0gICAgSlNQcm9wU2V0dGVyPGNsYXNzX25hbWUsICZjbGFzc19uYW1lOjpwcm9wX25hbWU+KCBcCi0gICAgICAgICNwcm9wX25hbWUsICNjbGFzc19uYW1lLCBwcm9wZXJ0eSwgdmFsdWUsIGluZm8pOyBcCisjZGVmaW5lIEpTX1NUQVRJQ19QUk9QKHByb3BfbmFtZSwgY2xhc3NfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIGdldF8jI3Byb3BfbmFtZSMjX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSlNQcm9wR2V0dGVyPGNsYXNzX25hbWUsICZjbGFzc19uYW1lOjpwcm9wX25hbWU+KCNwcm9wX25hbWUsICNjbGFzc19uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LCBpbmZvKTsgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIHNldF8jI3Byb3BfbmFtZSMjX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88dm9pZD4mIGluZm8pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSlNQcm9wU2V0dGVyPGNsYXNzX25hbWUsICZjbGFzc19uYW1lOjpwcm9wX25hbWU+KCNwcm9wX25hbWUsICNjbGFzc19uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LCB2YWx1ZSwgaW5mbyk7ICBcCiAgIH0KIAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUVUSE9EIENBTExCQUNLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1FVEhPRCBDQUxMQkFDSworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi10ZW1wbGF0ZSA8Y2xhc3MgQywgRlhfQk9PTCAoQzo6Kk0pKElGWEpTX0NvbnRleHQqLCBjb25zdCBDSlNfUGFyYW1ldGVycyYsIENKU19WYWx1ZSYsIENGWF9XaWRlU3RyaW5nJik+Cit0ZW1wbGF0ZSA8Y2xhc3MgQywKKyAgICAgICAgICBGWF9CT09MIChDOjoqTSkoSUZYSlNfQ29udGV4dCosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmKT4KIHZvaWQgSlNNZXRob2QoY29uc3QgY2hhciogbWV0aG9kX25hbWVfc3RyaW5nLAogICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc19uYW1lX3N0cmluZywKICAgICAgICAgICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKQEAgLTExNSwxMjEgKzE0NCwxNDAgQEAKICAgSUZYSlNfUnVudGltZSogcFJ1bnRpbWUgPSAoSUZYSlNfUnVudGltZSopaXNvbGF0ZS0+R2V0RGF0YSgyKTsKICAgSUZYSlNfQ29udGV4dCogcFJ1bnRpbWVDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7CiAgIENKU19QYXJhbWV0ZXJzIHBhcmFtZXRlcnM7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpPCh1bnNpZ25lZCBpbnQpaW5mby5MZW5ndGgoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludClpbmZvLkxlbmd0aCgpOyBpKyspIHsKICAgICBwYXJhbWV0ZXJzLnB1c2hfYmFjayhDSlNfVmFsdWUoaXNvbGF0ZSwgaW5mb1tpXSwgVlRfdW5rbm93bikpOwogICB9CiAgIENKU19WYWx1ZSB2YWx1ZVJlcyhpc29sYXRlKTsKLSAgQ0pTX09iamVjdCogcEpTT2JqID0gKENKU19PYmplY3QgKilKU19HZXRQcml2YXRlKGlzb2xhdGUsaW5mby5Ib2xkZXIoKSk7CisgIENKU19PYmplY3QqIHBKU09iaiA9IChDSlNfT2JqZWN0KilKU19HZXRQcml2YXRlKGlzb2xhdGUsIGluZm8uSG9sZGVyKCkpOwogICBDKiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDKj4ocEpTT2JqLT5HZXRFbWJlZE9iamVjdCgpKTsKICAgQ0ZYX1dpZGVTdHJpbmcgc0Vycm9yOwogICBpZiAoIShwT2JqLT4qTSkocFJ1bnRpbWVDb250ZXh0LCBwYXJhbWV0ZXJzLCB2YWx1ZVJlcywgc0Vycm9yKSkgewotICAgIEpTX0Vycm9yKGlzb2xhdGUsIEpTRm9ybWF0RXJyb3JTdHJpbmcoY2xhc3NfbmFtZV9zdHJpbmcsIG1ldGhvZF9uYW1lX3N0cmluZywgc0Vycm9yKSk7CisgICAgSlNfRXJyb3IoaXNvbGF0ZSwgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lX3N0cmluZywgbWV0aG9kX25hbWVfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Vycm9yKSk7CiAgICAgcmV0dXJuOwogICB9CiAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQodmFsdWVSZXMuVG9WOFZhbHVlKCkpOwogfQogCi0jZGVmaW5lIEpTX1NUQVRJQ19NRVRIT0QobWV0aG9kX25hbWUsIGNsYXNzX25hbWUpIFwKLSAgc3RhdGljIHZvaWQgbWV0aG9kX25hbWUjI19zdGF0aWMoIFwKLSAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7ICAgIFwKLSAgICBKU01ldGhvZDxjbGFzc19uYW1lLCAmY2xhc3NfbmFtZTo6bWV0aG9kX25hbWU+KCBcCi0gICAgICAgICNtZXRob2RfbmFtZSwgI2NsYXNzX25hbWUsIGluZm8pOyBcCisjZGVmaW5lIEpTX1NUQVRJQ19NRVRIT0QobWV0aG9kX25hbWUsIGNsYXNzX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIG1ldGhvZF9uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSlNNZXRob2Q8Y2xhc3NfbmFtZSwgJmNsYXNzX25hbWU6Om1ldGhvZF9uYW1lPigjbWV0aG9kX25hbWUsICNjbGFzc19uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvKTsgICAgICAgICAgICAgICAgICAgICBcCiAgIH0KIAogI2RlZmluZSBKU19TUEVDSUFMX1NUQVRJQ19NRVRIT0QobWV0aG9kX25hbWUsIGNsYXNzX2FsdGVybmF0ZSwgY2xhc3NfbmFtZSkgXAotICBzdGF0aWMgdm9pZCBtZXRob2RfbmFtZSMjX3N0YXRpYyggXAotICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsgICAgXAotICAgIEpTTWV0aG9kPGNsYXNzX2FsdGVybmF0ZSwgJmNsYXNzX2FsdGVybmF0ZTo6bWV0aG9kX25hbWU+KCBcCi0gICAgICAgICNtZXRob2RfbmFtZSwgI2NsYXNzX25hbWUsIGluZm8pOyBcCisgIHN0YXRpYyB2b2lkIG1ldGhvZF9uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyAgICAgICAgICAgICAgICAgICBcCisgICAgSlNNZXRob2Q8Y2xhc3NfYWx0ZXJuYXRlLCAmY2xhc3NfYWx0ZXJuYXRlOjptZXRob2RfbmFtZT4oICAgICAgICAgICAgICBcCisgICAgICAgICNtZXRob2RfbmFtZSwgI2NsYXNzX25hbWUsIGluZm8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0KIAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBKUyBDTEFTUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBKUyBDTEFTUworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2RlZmluZSBERUNMQVJFX0pTX0NMQVNTKGpzX2NsYXNzX25hbWUpIFwKLQlzdGF0aWMgdm9pZCBKU0NvbnN0cnVjdG9yKElGWEpTX0NvbnRleHQqIGNjLCBKU0ZYT2JqZWN0IG9iaixKU0ZYT2JqZWN0IGdsb2JhbCk7XAotCXN0YXRpYyB2b2lkIEpTRGVzdHJ1Y3RvcihKU0ZYT2JqZWN0IG9iaik7XAotCXN0YXRpYyBpbnQgSW5pdChJSlNfUnVudGltZSogcFJ1bnRpbWUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlKTtcCi0Jc3RhdGljIEpTQ29uc3RTcGVjIEpTX0NsYXNzX0NvbnN0c1tdO1wKLQlzdGF0aWMgSlNQcm9wZXJ0eVNwZWMgSlNfQ2xhc3NfUHJvcGVydGllc1tdO1wKLQlzdGF0aWMgSlNNZXRob2RTcGVjCUpTX0NsYXNzX01ldGhvZHNbXTtcCi0Jc3RhdGljIGNvbnN0IHdjaGFyX3QqIG1fcENsYXNzTmFtZQorI2RlZmluZSBERUNMQVJFX0pTX0NMQVNTKGpzX2NsYXNzX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgSlNDb25zdHJ1Y3RvcihJRlhKU19Db250ZXh0KiBjYywgSlNGWE9iamVjdCBvYmosICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNGWE9iamVjdCBnbG9iYWwpOyAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9pZCBKU0Rlc3RydWN0b3IoSlNGWE9iamVjdCBvYmopOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGludCBJbml0KElKU19SdW50aW1lKiBwUnVudGltZSwgRlhKU09CSlRZUEUgZU9ialR5cGUpOyBcCisgIHN0YXRpYyBKU0NvbnN0U3BlYyBKU19DbGFzc19Db25zdHNbXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgSlNQcm9wZXJ0eVNwZWMgSlNfQ2xhc3NfUHJvcGVydGllc1tdOyAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIEpTTWV0aG9kU3BlYyBKU19DbGFzc19NZXRob2RzW107ICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCB3Y2hhcl90KiBtX3BDbGFzc05hbWUKIAotI2RlZmluZSBJTVBMRU1FTlRfSlNfQ0xBU1NfUklDSChqc19jbGFzc19uYW1lLCBjbGFzc19hbHRlcm5hdGUsIGNsYXNzX25hbWUpIFwKLWNvbnN0IHdjaGFyX3QqIGpzX2NsYXNzX25hbWU6Om1fcENsYXNzTmFtZSA9IEpTX1dJREVTVFJJTkcoY2xhc3NfbmFtZSk7XAotdm9pZCBqc19jbGFzc19uYW1lOjpKU0NvbnN0cnVjdG9yKElGWEpTX0NvbnRleHQqIGNjLCBKU0ZYT2JqZWN0IG9iaiwgSlNGWE9iamVjdCBnbG9iYWwpXAote1wKLQlDSlNfT2JqZWN0KiBwT2JqID0gRlhfTkVXIGpzX2NsYXNzX25hbWUob2JqKTtcCi0JcE9iai0+U2V0RW1iZWRPYmplY3QoRlhfTkVXIGNsYXNzX2FsdGVybmF0ZShwT2JqKSk7XAotCUpTX1NldFByaXZhdGUoTlVMTCxvYmosKHZvaWQqKXBPYmopOyBcCi0JcE9iai0+SW5pdEluc3RhbmNlKGNjKTtcCi19XAotXAotdm9pZCBqc19jbGFzc19uYW1lOjpKU0Rlc3RydWN0b3IoSlNGWE9iamVjdCBvYmopIFwKLXtcCi0JanNfY2xhc3NfbmFtZSogcE9iaiA9IChqc19jbGFzc19uYW1lKilKU19HZXRQcml2YXRlKE5VTEwsb2JqKTtcCi0JQVNTRVJUKHBPYmogIT0gTlVMTCk7XAotCXBPYmotPkV4aXRJbnN0YW5jZSgpO1wKLQlkZWxldGUgcE9iajtcCi19XAotXAotaW50IGpzX2NsYXNzX25hbWU6OkluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lLCBGWEpTT0JKVFlQRSBlT2JqVHlwZSlcCi17XAotCWludCBuT2JqRGVmbklEID0gSlNfRGVmaW5lT2JqKHBSdW50aW1lLCBqc19jbGFzc19uYW1lOjptX3BDbGFzc05hbWUsIGVPYmpUeXBlLCBKU0NvbnN0cnVjdG9yLCBKU0Rlc3RydWN0b3IpO1wKLQlpZiAobk9iakRlZm5JRCA+PSAwKVwKLQl7XAotCQlmb3IgKGludCBqPTAsIHN6aj1zaXplb2YoSlNfQ2xhc3NfUHJvcGVydGllcykvc2l6ZW9mKEpTUHJvcGVydHlTcGVjKS0xOyBqPHN6ajsgaisrKVwKLQkJe1wKLQkJCWlmIChKU19EZWZpbmVPYmpQcm9wZXJ0eShwUnVudGltZSwgbk9iakRlZm5JRCwgSlNfQ2xhc3NfUHJvcGVydGllc1tqXS5wTmFtZSwgSlNfQ2xhc3NfUHJvcGVydGllc1tqXS5wUHJvcEdldCwgSlNfQ2xhc3NfUHJvcGVydGllc1tqXS5wUHJvcFB1dCkgPCAwKSByZXR1cm4gLTE7XAotCQl9XAotCQlmb3IgKGludCBrPTAsIHN6az1zaXplb2YoSlNfQ2xhc3NfTWV0aG9kcykvc2l6ZW9mKEpTTWV0aG9kU3BlYyktMTsgazxzems7IGsrKylcCi0JCXtcCi0JCQlpZiAoSlNfRGVmaW5lT2JqTWV0aG9kKHBSdW50aW1lLCBuT2JqRGVmbklELEpTX0NsYXNzX01ldGhvZHNba10ucE5hbWUsIEpTX0NsYXNzX01ldGhvZHNba10ucE1ldGhvZENhbGwpIDwgMCkgcmV0dXJuIC0xO1wKLQkJfVwKLQkJcmV0dXJuIG5PYmpEZWZuSUQ7XAotCX1cCi0JcmV0dXJuIC0xO1wKLX0KKyNkZWZpbmUgSU1QTEVNRU5UX0pTX0NMQVNTX1JJQ0goanNfY2xhc3NfbmFtZSwgY2xhc3NfYWx0ZXJuYXRlLCBjbGFzc19uYW1lKSAgICBcCisgIGNvbnN0IHdjaGFyX3QqIGpzX2NsYXNzX25hbWU6Om1fcENsYXNzTmFtZSA9IEpTX1dJREVTVFJJTkcoY2xhc3NfbmFtZSk7ICAgICAgXAorICB2b2lkIGpzX2NsYXNzX25hbWU6OkpTQ29uc3RydWN0b3IoSUZYSlNfQ29udGV4dCogY2MsIEpTRlhPYmplY3Qgb2JqLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTRlhPYmplY3QgZ2xvYmFsKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0pTX09iamVjdCogcE9iaiA9IEZYX05FVyBqc19jbGFzc19uYW1lKG9iaik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBPYmotPlNldEVtYmVkT2JqZWN0KEZYX05FVyBjbGFzc19hbHRlcm5hdGUocE9iaikpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBKU19TZXRQcml2YXRlKE5VTEwsIG9iaiwgKHZvaWQqKXBPYmopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcE9iai0+SW5pdEluc3RhbmNlKGNjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6SlNEZXN0cnVjdG9yKEpTRlhPYmplY3Qgb2JqKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGpzX2NsYXNzX25hbWUqIHBPYmogPSAoanNfY2xhc3NfbmFtZSopSlNfR2V0UHJpdmF0ZShOVUxMLCBvYmopOyAgICAgICAgICAgIFwKKyAgICBBU1NFUlQocE9iaiAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcE9iai0+RXhpdEluc3RhbmNlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlbGV0ZSBwT2JqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQganNfY2xhc3NfbmFtZTo6SW5pdChJSlNfUnVudGltZSogcFJ1bnRpbWUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlKSB7ICAgICAgIFwKKyAgICBpbnQgbk9iakRlZm5JRCA9IEpTX0RlZmluZU9iaihwUnVudGltZSwganNfY2xhc3NfbmFtZTo6bV9wQ2xhc3NOYW1lLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU9ialR5cGUsIEpTQ29uc3RydWN0b3IsIEpTRGVzdHJ1Y3Rvcik7ICAgICAgXAorICAgIGlmIChuT2JqRGVmbklEID49IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAoaW50IGogPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBzemogPSBzaXplb2YoSlNfQ2xhc3NfUHJvcGVydGllcykgLyBzaXplb2YoSlNQcm9wZXJ0eVNwZWMpIC0gMTsgXAorICAgICAgICAgICBqIDwgc3pqOyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKEpTX0RlZmluZU9ialByb3BlcnR5KHBSdW50aW1lLCBuT2JqRGVmbklELCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU19DbGFzc19Qcm9wZXJ0aWVzW2pdLnBOYW1lLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNfQ2xhc3NfUHJvcGVydGllc1tqXS5wUHJvcEdldCwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTX0NsYXNzX1Byb3BlcnRpZXNbal0ucFByb3BQdXQpIDwgMCkgICAgICAgICBcCisgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAoaW50IGsgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBzemsgPSBzaXplb2YoSlNfQ2xhc3NfTWV0aG9kcykgLyBzaXplb2YoSlNNZXRob2RTcGVjKSAtIDE7ICAgICAgXAorICAgICAgICAgICBrIDwgc3prOyBrKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKEpTX0RlZmluZU9iak1ldGhvZChwUnVudGltZSwgbk9iakRlZm5JRCwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNfQ2xhc3NfTWV0aG9kc1trXS5wTmFtZSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTX0NsYXNzX01ldGhvZHNba10ucE1ldGhvZENhbGwpIDwgMCkgICAgICAgICAgIFwKKyAgICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIG5PYmpEZWZuSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKLSNkZWZpbmUgSU1QTEVNRU5UX0pTX0NMQVNTKGpzX2NsYXNzX25hbWUsIGNsYXNzX25hbWUpIElNUExFTUVOVF9KU19DTEFTU19SSUNIKGpzX2NsYXNzX25hbWUsIGNsYXNzX25hbWUsIGNsYXNzX25hbWUpCisjZGVmaW5lIElNUExFTUVOVF9KU19DTEFTUyhqc19jbGFzc19uYW1lLCBjbGFzc19uYW1lKSBcCisgIElNUExFTUVOVF9KU19DTEFTU19SSUNIKGpzX2NsYXNzX25hbWUsIGNsYXNzX25hbWUsIGNsYXNzX25hbWUpCiAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ09OU1QgQ0xBU1MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ09OU1QgQ0xBU1MKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLSNkZWZpbmUgREVDTEFSRV9KU19DTEFTU19DT05TVCgpIFwKLQlzdGF0aWMgaW50IEluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lLCBGWEpTT0JKVFlQRSBlT2JqVHlwZSk7XAotCXN0YXRpYyBKU0NvbnN0U3BlYyBKU19DbGFzc19Db25zdHNbXTtcCi0Jc3RhdGljIGNvbnN0IHdjaGFyX3QqIG1fcENsYXNzTmFtZQorI2RlZmluZSBERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGludCBJbml0KElKU19SdW50aW1lKiBwUnVudGltZSwgRlhKU09CSlRZUEUgZU9ialR5cGUpOyBcCisgIHN0YXRpYyBKU0NvbnN0U3BlYyBKU19DbGFzc19Db25zdHNbXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3Qgd2NoYXJfdCogbV9wQ2xhc3NOYW1lCiAKLSNkZWZpbmUgSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKGpzX2NsYXNzX25hbWUsIGNsYXNzX25hbWUpIFwKLWNvbnN0IHdjaGFyX3QqIGpzX2NsYXNzX25hbWU6Om1fcENsYXNzTmFtZSA9IEpTX1dJREVTVFJJTkcoY2xhc3NfbmFtZSk7XAotaW50IGpzX2NsYXNzX25hbWU6OkluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lLCBGWEpTT0JKVFlQRSBlT2JqVHlwZSlcCi17XAotCWludCBuT2JqRGVmbklEID0gSlNfRGVmaW5lT2JqKHBSdW50aW1lLCBqc19jbGFzc19uYW1lOjptX3BDbGFzc05hbWUsIGVPYmpUeXBlLCBOVUxMLCBOVUxMKTtcCi0JaWYgKG5PYmpEZWZuSUQgPj0wKVwKLQl7XAotCQlmb3IgKGludCBpPTAsIHN6PXNpemVvZihKU19DbGFzc19Db25zdHMpL3NpemVvZihKU0NvbnN0U3BlYyktMTsgaTxzejsgaSsrKVwKLQkJe1wKLQkJCWlmIChKU19DbGFzc19Db25zdHNbaV0udCA9PSAwKVwKLQkJCXtcCi0JCQkJaWYgKEpTX0RlZmluZU9iakNvbnN0KHBSdW50aW1lLCBuT2JqRGVmbklELCBKU19DbGFzc19Db25zdHNbaV0ucE5hbWUsIEpTX05ld051bWJlcihwUnVudGltZSxKU19DbGFzc19Db25zdHNbaV0ubnVtYmVyKSkgPCAwKSByZXR1cm4gLTE7XAotCQkJfVwKLQkJCWVsc2VcCi0JCQl7XAotCQkJaWYgKEpTX0RlZmluZU9iakNvbnN0KHBSdW50aW1lLCBuT2JqRGVmbklELCBKU19DbGFzc19Db25zdHNbaV0ucE5hbWUsIEpTX05ld1N0cmluZyhwUnVudGltZSxKU19DbGFzc19Db25zdHNbaV0uc3RyaW5nKSkgPCAwKSByZXR1cm4gLTE7XAotCQkJfVwKLQkJfVwKLQkJcmV0dXJuIG5PYmpEZWZuSUQ7XAotCX1cCi0JcmV0dXJuIC0xO1wKLX0KKyNkZWZpbmUgSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKGpzX2NsYXNzX25hbWUsIGNsYXNzX25hbWUpICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3Qgd2NoYXJfdCoganNfY2xhc3NfbmFtZTo6bV9wQ2xhc3NOYW1lID0gSlNfV0lERVNUUklORyhjbGFzc19uYW1lKTsgICAgIFwKKyAgaW50IGpzX2NsYXNzX25hbWU6OkluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lLCBGWEpTT0JKVFlQRSBlT2JqVHlwZSkgeyAgICAgIFwKKyAgICBpbnQgbk9iakRlZm5JRCA9IEpTX0RlZmluZU9iaihwUnVudGltZSwganNfY2xhc3NfbmFtZTo6bV9wQ2xhc3NOYW1lLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT2JqVHlwZSwgTlVMTCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobk9iakRlZm5JRCA+PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHNpemVvZihKU19DbGFzc19Db25zdHMpIC8gc2l6ZW9mKEpTQ29uc3RTcGVjKSAtIDE7IFwKKyAgICAgICAgICAgaSA8IHN6OyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKEpTX0NsYXNzX0NvbnN0c1tpXS50ID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpZiAoSlNfRGVmaW5lT2JqQ29uc3QoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHBSdW50aW1lLCBuT2JqRGVmbklELCBKU19DbGFzc19Db25zdHNbaV0ucE5hbWUsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIEpTX05ld051bWJlcihwUnVudGltZSwgSlNfQ2xhc3NfQ29uc3RzW2ldLm51bWJlcikpIDwgMCkgICAgIFwKKyAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpZiAoSlNfRGVmaW5lT2JqQ29uc3QoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHBSdW50aW1lLCBuT2JqRGVmbklELCBKU19DbGFzc19Db25zdHNbaV0ucE5hbWUsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIEpTX05ld1N0cmluZyhwUnVudGltZSwgSlNfQ2xhc3NfQ29uc3RzW2ldLnN0cmluZykpIDwgMCkgICAgIFwKKyAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBuT2JqRGVmbklEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNQRUNJQUwgSlMgQ0xBU1MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1BFQ0lBTCBKUyBDTEFTUworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogdGVtcGxhdGUgPGNsYXNzIEFsdD4KLXZvaWQgSlNTcGVjaWFsUHJvcFF1ZXJ5KGNvbnN0IGNoYXIgKiwgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6SW50ZWdlcj4mIGluZm8pIHsKK3ZvaWQgSlNTcGVjaWFsUHJvcFF1ZXJ5KGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpJbnRlZ2VyPiYgaW5mbykgewogICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOwogICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZShwcm9wZXJ0eSk7Ci0gIENGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKTsKLSAgQ0pTX09iamVjdCogcEpTT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDSlNfT2JqZWN0Kj4oSlNfR2V0UHJpdmF0ZShpc29sYXRlLCBpbmZvLkhvbGRlcigpKSk7CisgIENGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgqdXRmOF92YWx1ZSwgdXRmOF92YWx1ZS5sZW5ndGgoKSk7CisgIENKU19PYmplY3QqIHBKU09iaiA9CisgICAgICByZWludGVycHJldF9jYXN0PENKU19PYmplY3QqPihKU19HZXRQcml2YXRlKGlzb2xhdGUsIGluZm8uSG9sZGVyKCkpKTsKICAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOwogICBGWF9CT09MIGJSZXQgPSBwT2JqLT5RdWVyeVByb3BlcnR5KHByb3BuYW1lLmNfc3RyKCkpOwogICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGJSZXQgPyA0IDogMCk7CkBAIC0yNDMsMTYgKzI5MSwxOCBAQAogICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwogICBJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilpc29sYXRlLT5HZXREYXRhKDIpOwogICBJRlhKU19Db250ZXh0KiBwUnVudGltZUNvbnRleHQgPSBwUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLSAgQ0pTX09iamVjdCogcEpTT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDSlNfT2JqZWN0Kj4oSlNfR2V0UHJpdmF0ZShpc29sYXRlLCBpbmZvLkhvbGRlcigpKSk7CisgIENKU19PYmplY3QqIHBKU09iaiA9CisgICAgICByZWludGVycHJldF9jYXN0PENKU19PYmplY3QqPihKU19HZXRQcml2YXRlKGlzb2xhdGUsIGluZm8uSG9sZGVyKCkpKTsKICAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOwogICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZShwcm9wZXJ0eSk7Ci0gIENGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgcHJvcG5hbWUgPQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKTsKICAgQ0ZYX1dpZGVTdHJpbmcgc0Vycm9yOwogICBDSlNfUHJvcFZhbHVlIHZhbHVlKGlzb2xhdGUpOwogICB2YWx1ZS5TdGFydEdldHRpbmcoKTsKICAgaWYgKCFwT2JqLT5Eb1Byb3BlcnR5KHBSdW50aW1lQ29udGV4dCwgcHJvcG5hbWUuY19zdHIoKSwgdmFsdWUsIHNFcnJvcikpIHsKLSAgICAgIEpTX0Vycm9yKGlzb2xhdGUsIEpTRm9ybWF0RXJyb3JTdHJpbmcoY2xhc3NfbmFtZSwgIkdldFByb3BlcnR5Iiwgc0Vycm9yKSk7Ci0gICAgICByZXR1cm47CisgICAgSlNfRXJyb3IoaXNvbGF0ZSwgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lLCAiR2V0UHJvcGVydHkiLCBzRXJyb3IpKTsKKyAgICByZXR1cm47CiAgIH0KICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCgodjg6OkxvY2FsPHY4OjpWYWx1ZT4pdmFsdWUpOwogfQpAQCAtMjY2LDE1ICszMTYsMTcgQEAKICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gaXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKICAgSUZYSlNfUnVudGltZSogcFJ1bnRpbWUgPSAoSUZYSlNfUnVudGltZSopaXNvbGF0ZS0+R2V0RGF0YSgyKTsKICAgSUZYSlNfQ29udGV4dCogcFJ1bnRpbWVDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0gIENKU19PYmplY3QqIHBKU09iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0pTX09iamVjdCo+KEpTX0dldFByaXZhdGUoaXNvbGF0ZSwgaW5mby5Ib2xkZXIoKSkpOworICBDSlNfT2JqZWN0KiBwSlNPYmogPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxDSlNfT2JqZWN0Kj4oSlNfR2V0UHJpdmF0ZShpc29sYXRlLCBpbmZvLkhvbGRlcigpKSk7CiAgIEFsdCogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8QWx0Kj4ocEpTT2JqLT5HZXRFbWJlZE9iamVjdCgpKTsKICAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHV0ZjhfdmFsdWUocHJvcGVydHkpOwotICBDRlhfV2lkZVN0cmluZyBwcm9wbmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgqdXRmOF92YWx1ZSwgdXRmOF92YWx1ZS5sZW5ndGgoKSk7CisgIENGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgqdXRmOF92YWx1ZSwgdXRmOF92YWx1ZS5sZW5ndGgoKSk7CiAgIENGWF9XaWRlU3RyaW5nIHNFcnJvcjsKLSAgQ0pTX1Byb3BWYWx1ZSBQcm9wVmFsdWUoQ0pTX1ZhbHVlKGlzb2xhdGUsdmFsdWUsVlRfdW5rbm93bikpOworICBDSlNfUHJvcFZhbHVlIFByb3BWYWx1ZShDSlNfVmFsdWUoaXNvbGF0ZSwgdmFsdWUsIFZUX3Vua25vd24pKTsKICAgUHJvcFZhbHVlLlN0YXJ0U2V0dGluZygpOwogICBpZiAoIXBPYmotPkRvUHJvcGVydHkocFJ1bnRpbWVDb250ZXh0LCBwcm9wbmFtZS5jX3N0cigpLCBQcm9wVmFsdWUsIHNFcnJvcikpIHsKLSAgICAgIEpTX0Vycm9yKGlzb2xhdGUsIEpTRm9ybWF0RXJyb3JTdHJpbmcoY2xhc3NfbmFtZSwgIlB1dFByb3BlcnR5Iiwgc0Vycm9yKSk7CisgICAgSlNfRXJyb3IoaXNvbGF0ZSwgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lLCAiUHV0UHJvcGVydHkiLCBzRXJyb3IpKTsKICAgfQogfQogCkBAIC0yODYsMTAgKzMzOCwxMiBAQAogICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwogICBJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilpc29sYXRlLT5HZXREYXRhKDIpOwogICBJRlhKU19Db250ZXh0KiBwUnVudGltZUNvbnRleHQgPSBwUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLSAgQ0pTX09iamVjdCogcEpTT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDSlNfT2JqZWN0Kj4oSlNfR2V0UHJpdmF0ZShpc29sYXRlLCBpbmZvLkhvbGRlcigpKSk7CisgIENKU19PYmplY3QqIHBKU09iaiA9CisgICAgICByZWludGVycHJldF9jYXN0PENKU19PYmplY3QqPihKU19HZXRQcml2YXRlKGlzb2xhdGUsIGluZm8uSG9sZGVyKCkpKTsKICAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOwogICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZShwcm9wZXJ0eSk7Ci0gIENGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgcHJvcG5hbWUgPQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKTsKICAgQ0ZYX1dpZGVTdHJpbmcgc0Vycm9yOwogICBpZiAoIXBPYmotPkRlbFByb3BlcnR5KHBSdW50aW1lQ29udGV4dCwgcHJvcG5hbWUuY19zdHIoKSwgc0Vycm9yKSkgewogICAgIENGWF9CeXRlU3RyaW5nIGNiTmFtZTsKQEAgLTI5OCw4MyArMzUyLDExNCBAQAogICB9CiB9CiAKLSNkZWZpbmUgREVDTEFSRV9TUEVDSUFMX0pTX0NMQVNTKGpzX2NsYXNzX25hbWUpIFwKLQlzdGF0aWMgdm9pZCBKU0NvbnN0cnVjdG9yKElGWEpTX0NvbnRleHQqIGNjLCBKU0ZYT2JqZWN0IG9iaiwgSlNGWE9iamVjdCBnbG9iYWwpO1wKLQlzdGF0aWMgdm9pZCBKU0Rlc3RydWN0b3IoSlNGWE9iamVjdCBvYmopO1wKLQlzdGF0aWMgSlNDb25zdFNwZWMgSlNfQ2xhc3NfQ29uc3RzW107XAotCXN0YXRpYyBKU1Byb3BlcnR5U3BlYyBKU19DbGFzc19Qcm9wZXJ0aWVzW107XAotCXN0YXRpYyBKU01ldGhvZFNwZWMJSlNfQ2xhc3NfTWV0aG9kc1tdO1wKLQlzdGF0aWMgaW50IEluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lLCBGWEpTT0JKVFlQRSBlT2JqVHlwZSk7XAotCXN0YXRpYyBjb25zdCB3Y2hhcl90KiBtX3BDbGFzc05hbWU7XAotCXN0YXRpYyB2b2lkIHF1ZXJ5cHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWModjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6SW50ZWdlcj4mIGluZm8pO1wKLQlzdGF0aWMgdm9pZCBnZXRwcm9wXyMjanNfY2xhc3NfbmFtZSMjX3N0YXRpYyh2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTtcCi0Jc3RhdGljIHZvaWQgcHV0cHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWModjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTtcCi0Jc3RhdGljIHZvaWQgZGVscHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWModjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6Qm9vbGVhbj4mIGluZm8pCisjZGVmaW5lIERFQ0xBUkVfU1BFQ0lBTF9KU19DTEFTUyhqc19jbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIEpTQ29uc3RydWN0b3IoSUZYSlNfQ29udGV4dCogY2MsIEpTRlhPYmplY3Qgb2JqLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNGWE9iamVjdCBnbG9iYWwpOyAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIEpTRGVzdHJ1Y3RvcihKU0ZYT2JqZWN0IG9iaik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBKU0NvbnN0U3BlYyBKU19DbGFzc19Db25zdHNbXTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBKU1Byb3BlcnR5U3BlYyBKU19DbGFzc19Qcm9wZXJ0aWVzW107ICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBKU01ldGhvZFNwZWMgSlNfQ2xhc3NfTWV0aG9kc1tdOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBpbnQgSW5pdChJSlNfUnVudGltZSogcFJ1bnRpbWUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlKTsgICBcCisgIHN0YXRpYyBjb25zdCB3Y2hhcl90KiBtX3BDbGFzc05hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIHF1ZXJ5cHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWMoICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkludGVnZXI+JiBpbmZvKTsgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIGdldHByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7ICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIHB1dHByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7ICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIGRlbHByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkJvb2xlYW4+JiBpbmZvKQogCiAjZGVmaW5lIElNUExFTUVOVF9TUEVDSUFMX0pTX0NMQVNTKGpzX2NsYXNzX25hbWUsIGNsYXNzX2FsdGVybmF0ZSwgY2xhc3NfbmFtZSkgXAotY29uc3Qgd2NoYXJfdCAqIGpzX2NsYXNzX25hbWU6Om1fcENsYXNzTmFtZSA9IEpTX1dJREVTVFJJTkcoY2xhc3NfbmFtZSk7XAotdm9pZCBqc19jbGFzc19uYW1lOjpxdWVyeXByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSxjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkludGVnZXI+JiBpbmZvKSB7IFwKLSAgSlNTcGVjaWFsUHJvcFF1ZXJ5PGNsYXNzX2FsdGVybmF0ZT4oI2NsYXNzX25hbWUsIHByb3BlcnR5LCBpbmZvKTsgICAgIFwKLX1cCi12b2lkIGpzX2NsYXNzX25hbWU6OmdldHByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsgXAotICBKU1NwZWNpYWxQcm9wR2V0PGNsYXNzX2FsdGVybmF0ZT4oI2NsYXNzX25hbWUsIHByb3BlcnR5LCBpbmZvKTsgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdm9pZCBqc19jbGFzc19uYW1lOjpwdXRwcm9wXyMjanNfY2xhc3NfbmFtZSMjX3N0YXRpYyh2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHtcCi0gIEpTU3BlY2lhbFByb3BQdXQ8Y2xhc3NfYWx0ZXJuYXRlPigjY2xhc3NfbmFtZSwgcHJvcGVydHksIHZhbHVlLCBpbmZvKTsgXAotfVwKLXZvaWQganNfY2xhc3NfbmFtZTo6ZGVscHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWModjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6Qm9vbGVhbj4mIGluZm8pIHsgXAotICBKU1NwZWNpYWxQcm9wRGVsPGNsYXNzX2FsdGVybmF0ZT4oI2NsYXNzX25hbWUsIHByb3BlcnR5LCBpbmZvKTsgXAotfSBcCi12b2lkIGpzX2NsYXNzX25hbWU6OkpTQ29uc3RydWN0b3IoSUZYSlNfQ29udGV4dCogY2MsIEpTRlhPYmplY3QgIG9iaixKU0ZYT2JqZWN0ICBnbG9iYWwpXAote1wKLQlDSlNfT2JqZWN0KiBwT2JqID0gRlhfTkVXIGpzX2NsYXNzX25hbWUob2JqKTtcCi0JcE9iai0+U2V0RW1iZWRPYmplY3QoRlhfTkVXIGNsYXNzX2FsdGVybmF0ZShwT2JqKSk7XAotCUpTX1NldFByaXZhdGUoTlVMTCxvYmosICh2b2lkKilwT2JqKTsgXAotCXBPYmotPkluaXRJbnN0YW5jZShjYyk7XAotfVwKLVwKLXZvaWQganNfY2xhc3NfbmFtZTo6SlNEZXN0cnVjdG9yKEpTRlhPYmplY3Qgb2JqKSBcCi17XAotCWpzX2NsYXNzX25hbWUqIHBPYmogPSAoanNfY2xhc3NfbmFtZSopSlNfR2V0UHJpdmF0ZShOVUxMLG9iaik7XAotCUFTU0VSVChwT2JqICE9IE5VTEwpO1wKLQlwT2JqLT5FeGl0SW5zdGFuY2UoKTtcCi0JZGVsZXRlIHBPYmo7XAotfVwKLVwKLWludCBqc19jbGFzc19uYW1lOjpJbml0KElKU19SdW50aW1lKiBwUnVudGltZSwgRlhKU09CSlRZUEUgZU9ialR5cGUpXAote1wKLVwKLQlpbnQgbk9iakRlZm5JRCA9IEpTX0RlZmluZU9iaihwUnVudGltZSwganNfY2xhc3NfbmFtZTo6bV9wQ2xhc3NOYW1lLCBlT2JqVHlwZSwgSlNDb25zdHJ1Y3RvciwgSlNEZXN0cnVjdG9yKTtcCi1cCi0JaWYgKG5PYmpEZWZuSUQgPj0gMClcCi0Je1wKLQkJZm9yIChpbnQgaj0wLCBzemo9c2l6ZW9mKEpTX0NsYXNzX1Byb3BlcnRpZXMpL3NpemVvZihKU1Byb3BlcnR5U3BlYyktMTsgajxzemo7IGorKylcCi0JCXtcCi0JCQlpZiAoSlNfRGVmaW5lT2JqUHJvcGVydHkocFJ1bnRpbWUsIG5PYmpEZWZuSUQsIEpTX0NsYXNzX1Byb3BlcnRpZXNbal0ucE5hbWUsIEpTX0NsYXNzX1Byb3BlcnRpZXNbal0ucFByb3BHZXQsSlNfQ2xhc3NfUHJvcGVydGllc1tqXS5wUHJvcFB1dCk8MClyZXR1cm4gLTE7XAotCQl9XAotXAotCQlmb3IgKGludCBrPTAsIHN6az1zaXplb2YoSlNfQ2xhc3NfTWV0aG9kcykvc2l6ZW9mKEpTTWV0aG9kU3BlYyktMTsgazxzems7IGsrKylcCi0JCXtcCi0JCQlpZiAoSlNfRGVmaW5lT2JqTWV0aG9kKHBSdW50aW1lLCBuT2JqRGVmbklELEpTX0NsYXNzX01ldGhvZHNba10ucE5hbWUsSlNfQ2xhc3NfTWV0aG9kc1trXS5wTWV0aG9kQ2FsbCk8MClyZXR1cm4gLTE7XAotCQl9XAotCQlpZiAoSlNfRGVmaW5lT2JqQWxsUHJvcGVydGllcyhwUnVudGltZSwgbk9iakRlZm5JRCwganNfY2xhc3NfbmFtZTo6cXVlcnlwcm9wXyMjanNfY2xhc3NfbmFtZSMjX3N0YXRpYywganNfY2xhc3NfbmFtZTo6Z2V0cHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWMsanNfY2xhc3NfbmFtZTo6cHV0cHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWMsanNfY2xhc3NfbmFtZTo6ZGVscHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWMpPDApIHJldHVybiAtMTtcCi1cCi0JCXJldHVybiBuT2JqRGVmbklEO1wKLQl9XAotXAotCXJldHVybiAtMTtcCi19CisgIGNvbnN0IHdjaGFyX3QqIGpzX2NsYXNzX25hbWU6Om1fcENsYXNzTmFtZSA9IEpTX1dJREVTVFJJTkcoY2xhc3NfbmFtZSk7ICAgICAgXAorICB2b2lkIGpzX2NsYXNzX25hbWU6OnF1ZXJ5cHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkludGVnZXI+JiBpbmZvKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIEpTU3BlY2lhbFByb3BRdWVyeTxjbGFzc19hbHRlcm5hdGU+KCNjbGFzc19uYW1lLCBwcm9wZXJ0eSwgaW5mbyk7ICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6Z2V0cHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSlNTcGVjaWFsUHJvcEdldDxjbGFzc19hbHRlcm5hdGU+KCNjbGFzc19uYW1lLCBwcm9wZXJ0eSwgaW5mbyk7ICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBqc19jbGFzc19uYW1lOjpwdXRwcm9wXyMjanNfY2xhc3NfbmFtZSMjX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCAgICAgICAgICAgICAgXAorICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBKU1NwZWNpYWxQcm9wUHV0PGNsYXNzX2FsdGVybmF0ZT4oI2NsYXNzX25hbWUsIHByb3BlcnR5LCB2YWx1ZSwgaW5mbyk7ICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGpzX2NsYXNzX25hbWU6OmRlbHByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkJvb2xlYW4+JiBpbmZvKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIEpTU3BlY2lhbFByb3BEZWw8Y2xhc3NfYWx0ZXJuYXRlPigjY2xhc3NfbmFtZSwgcHJvcGVydHksIGluZm8pOyAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6SlNDb25zdHJ1Y3RvcihJRlhKU19Db250ZXh0KiBjYywgSlNGWE9iamVjdCBvYmosICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNGWE9iamVjdCBnbG9iYWwpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDSlNfT2JqZWN0KiBwT2JqID0gRlhfTkVXIGpzX2NsYXNzX25hbWUob2JqKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcE9iai0+U2V0RW1iZWRPYmplY3QoRlhfTkVXIGNsYXNzX2FsdGVybmF0ZShwT2JqKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEpTX1NldFByaXZhdGUoTlVMTCwgb2JqLCAodm9pZCopcE9iaik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwT2JqLT5Jbml0SW5zdGFuY2UoY2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBqc19jbGFzc19uYW1lOjpKU0Rlc3RydWN0b3IoSlNGWE9iamVjdCBvYmopIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAganNfY2xhc3NfbmFtZSogcE9iaiA9IChqc19jbGFzc19uYW1lKilKU19HZXRQcml2YXRlKE5VTEwsIG9iaik7ICAgICAgICAgICAgXAorICAgIEFTU0VSVChwT2JqICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwT2JqLT5FeGl0SW5zdGFuY2UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVsZXRlIHBPYmo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBqc19jbGFzc19uYW1lOjpJbml0KElKU19SdW50aW1lKiBwUnVudGltZSwgRlhKU09CSlRZUEUgZU9ialR5cGUpIHsgICAgICAgXAorICAgIGludCBuT2JqRGVmbklEID0gSlNfRGVmaW5lT2JqKHBSdW50aW1lLCBqc19jbGFzc19uYW1lOjptX3BDbGFzc05hbWUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT2JqVHlwZSwgSlNDb25zdHJ1Y3RvciwgSlNEZXN0cnVjdG9yKTsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChuT2JqRGVmbklEID49IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAoaW50IGogPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBzemogPSBzaXplb2YoSlNfQ2xhc3NfUHJvcGVydGllcykgLyBzaXplb2YoSlNQcm9wZXJ0eVNwZWMpIC0gMTsgXAorICAgICAgICAgICBqIDwgc3pqOyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKEpTX0RlZmluZU9ialByb3BlcnR5KHBSdW50aW1lLCBuT2JqRGVmbklELCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU19DbGFzc19Qcm9wZXJ0aWVzW2pdLnBOYW1lLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNfQ2xhc3NfUHJvcGVydGllc1tqXS5wUHJvcEdldCwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTX0NsYXNzX1Byb3BlcnRpZXNbal0ucFByb3BQdXQpIDwgMCkgICAgICAgICBcCisgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmb3IgKGludCBrID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgc3prID0gc2l6ZW9mKEpTX0NsYXNzX01ldGhvZHMpIC8gc2l6ZW9mKEpTTWV0aG9kU3BlYykgLSAxOyAgICAgIFwKKyAgICAgICAgICAgayA8IHN6azsgaysrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChKU19EZWZpbmVPYmpNZXRob2QocFJ1bnRpbWUsIG5PYmpEZWZuSUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTX0NsYXNzX01ldGhvZHNba10ucE5hbWUsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU19DbGFzc19NZXRob2RzW2tdLnBNZXRob2RDYWxsKSA8IDApICAgICAgICAgICBcCisgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChKU19EZWZpbmVPYmpBbGxQcm9wZXJ0aWVzKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHBSdW50aW1lLCBuT2JqRGVmbklELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBqc19jbGFzc19uYW1lOjpxdWVyeXByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAganNfY2xhc3NfbmFtZTo6Z2V0cHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWMsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIGpzX2NsYXNzX25hbWU6OnB1dHByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBqc19jbGFzc19uYW1lOjpkZWxwcm9wXyMjanNfY2xhc3NfbmFtZSMjX3N0YXRpYykgPCAwKSAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIG5PYmpEZWZuSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdMT0JBTCBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdMT0JBTCBNRVRIT0RTCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi10ZW1wbGF0ZSA8RlhfQk9PTCAoKkYpKElGWEpTX0NvbnRleHQqLCBjb25zdCBDSlNfUGFyYW1ldGVycyYsIENKU19WYWx1ZSYsIENGWF9XaWRlU3RyaW5nJik+Ci12b2lkIEpTR2xvYmFsRnVuYyhjb25zdCBjaGFyICpmdW5jX25hbWVfc3RyaW5nLAordGVtcGxhdGUgPEZYX0JPT0wgKAorICAgICpGKShJRlhKU19Db250ZXh0KiwgY29uc3QgQ0pTX1BhcmFtZXRlcnMmLCBDSlNfVmFsdWUmLCBDRlhfV2lkZVN0cmluZyYpPgordm9pZCBKU0dsb2JhbEZ1bmMoY29uc3QgY2hhciogZnVuY19uYW1lX3N0cmluZywKICAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7CiAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7CiAgIElGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWlzb2xhdGUtPkdldERhdGEoMik7CiAgIElGWEpTX0NvbnRleHQqIHBSdW50aW1lQ29udGV4dCA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwogICBDSlNfUGFyYW1ldGVycyBwYXJhbWV0ZXJzOwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaTwodW5zaWduZWQgaW50KWluZm8uTGVuZ3RoKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpaW5mby5MZW5ndGgoKTsgaSsrKSB7CiAgICAgcGFyYW1ldGVycy5wdXNoX2JhY2soQ0pTX1ZhbHVlKGlzb2xhdGUsIGluZm9baV0sIFZUX3Vua25vd24pKTsKICAgfQogICBDSlNfVmFsdWUgdmFsdWVSZXMoaXNvbGF0ZSk7CkBAIC0zODYsNjMgKzQ3MSw3MSBAQAogICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KHZhbHVlUmVzLlRvVjhWYWx1ZSgpKTsKIH0KIAotI2RlZmluZSBKU19TVEFUSUNfR0xPQkFMX0ZVTihmdW5fbmFtZSkgXAotICBzdGF0aWMgdm9pZCBmdW5fbmFtZSMjX3N0YXRpYyhjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyBcCi0gICAgSlNHbG9iYWxGdW5jPGZ1bl9uYW1lPigjZnVuX25hbWUsIGluZm8pOyBcCisjZGVmaW5lIEpTX1NUQVRJQ19HTE9CQUxfRlVOKGZ1bl9uYW1lKSAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIGZ1bl9uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyBcCisgICAgSlNHbG9iYWxGdW5jPGZ1bl9uYW1lPigjZnVuX25hbWUsIGluZm8pOyAgICAgICAgICAgICBcCiAgIH0KIAotI2RlZmluZSBKU19TVEFUSUNfREVDTEFSRV9HTE9CQUxfRlVOKCkgXAotc3RhdGljIEpTTWV0aG9kU3BlYwlnbG9iYWxfbWV0aG9kc1tdOyBcCi1zdGF0aWMgaW50IEluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKQorI2RlZmluZSBKU19TVEFUSUNfREVDTEFSRV9HTE9CQUxfRlVOKCkgIFwKKyAgc3RhdGljIEpTTWV0aG9kU3BlYyBnbG9iYWxfbWV0aG9kc1tdOyBcCisgIHN0YXRpYyBpbnQgSW5pdChJSlNfUnVudGltZSogcFJ1bnRpbWUpCiAKICNkZWZpbmUgQkVHSU5fSlNfU1RBVElDX0dMT0JBTF9GVU4oanNfY2xhc3NfbmFtZSkgXAotSlNNZXRob2RTcGVjIGpzX2NsYXNzX25hbWU6Omdsb2JhbF9tZXRob2RzW10gPSB7Ci0KLSNkZWZpbmUgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkobWV0aG9kX25hbWUpIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkobWV0aG9kX25hbWUpCisgIEpTTWV0aG9kU3BlYyBqc19jbGFzc19uYW1lOjpnbG9iYWxfbWV0aG9kc1tdID0geworI2RlZmluZSBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShtZXRob2RfbmFtZSkgXAorICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG1ldGhvZF9uYW1lKQogCiAjZGVmaW5lIEVORF9KU19TVEFUSUNfR0xPQkFMX0ZVTigpIEVORF9KU19TVEFUSUNfTUVUSE9EKCkKIAotI2RlZmluZSBJTVBMRU1FTlRfSlNfU1RBVElDX0dMT0JBTF9GVU4oanNfY2xhc3NfbmFtZSkgXAotaW50IGpzX2NsYXNzX25hbWU6OkluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKVwKLXtcCi0JZm9yIChpbnQgaT0wLCBzej1zaXplb2YoanNfY2xhc3NfbmFtZTo6Z2xvYmFsX21ldGhvZHMpL3NpemVvZihKU01ldGhvZFNwZWMpLTE7IGk8c3o7IGkrKylcCi0Je1wKLQkJaWYgKEpTX0RlZmluZUdsb2JhbE1ldGhvZChwUnVudGltZSxcCi0JCQkJanNfY2xhc3NfbmFtZTo6Z2xvYmFsX21ldGhvZHNbaV0ucE5hbWUsXAotCQkJCWpzX2NsYXNzX25hbWU6Omdsb2JhbF9tZXRob2RzW2ldLnBNZXRob2RDYWxsXAotCQkJCSkgPCAwXAotCQkJKXJldHVybiAtMTtcCi0JfVwKLQlyZXR1cm4gMDtcCi19CisjZGVmaW5lIElNUExFTUVOVF9KU19TVEFUSUNfR0xPQkFMX0ZVTihqc19jbGFzc19uYW1lKSAgICAgICAgICAgIFwKKyAgaW50IGpzX2NsYXNzX25hbWU6OkluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKSB7ICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHNpemVvZihqc19jbGFzc19uYW1lOjpnbG9iYWxfbWV0aG9kcykgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKU01ldGhvZFNwZWMpIC0gICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgaSA8IHN6OyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoSlNfRGVmaW5lR2xvYmFsTWV0aG9kKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgcFJ1bnRpbWUsIGpzX2NsYXNzX25hbWU6Omdsb2JhbF9tZXRob2RzW2ldLnBOYW1lLCAgXAorICAgICAgICAgICAgICBqc19jbGFzc19uYW1lOjpnbG9iYWxfbWV0aG9kc1tpXS5wTWV0aG9kQ2FsbCkgPCAwKSBcCisgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KIAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBHTE9CQUwgQ09OU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIERFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIGNvbnN0X25hbWUgLCBjb25zdF92YWx1ZSlcCi1pZiAoSlNfRGVmaW5lR2xvYmFsQ29uc3QocFJ1bnRpbWUsSlNfV0lERVNUUklORyhjb25zdF9uYW1lKSxKU19OZXdTdHJpbmcocFJ1bnRpbWUsSlNfV0lERVNUUklORyhjb25zdF92YWx1ZSkpKSkgcmV0dXJuIC0xCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdMT0JBTCBDT05TVFMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIERFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIGNvbnN0X25hbWUsIGNvbnN0X3ZhbHVlKSBcCisgIGlmIChKU19EZWZpbmVHbG9iYWxDb25zdCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcFJ1bnRpbWUsIEpTX1dJREVTVFJJTkcoY29uc3RfbmFtZSksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgSlNfTmV3U3RyaW5nKHBSdW50aW1lLCBKU19XSURFU1RSSU5HKGNvbnN0X3ZhbHVlKSkpKSBcCisgIHJldHVybiAtMQogCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdMT0JBTCBBUlJBWVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gR0xPQkFMIEFSUkFZUworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2RlZmluZSBERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKVwKLWludCBzaXplID0gRlhfQXJyYXlTaXplKEFycmF5Q29udGVudCk7XAotXAotQ0pTX0FycmF5IGFycmF5KHBSdW50aW1lKTtcCi1mb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSBhcnJheS5TZXRFbGVtZW50KGksQ0pTX1ZhbHVlKHBSdW50aW1lLEFycmF5Q29udGVudFtpXSkpO1wKLVwKLUNKU19Qcm9wVmFsdWUgcHJvcChwUnVudGltZSk7XAotcHJvcCA8PCBhcnJheTtcCi1pZiAoSlNfRGVmaW5lR2xvYmFsQ29uc3QocFJ1bnRpbWUsIChjb25zdCB3Y2hhcl90KilBcnJheU5hbWUsIHByb3AuVG9WOFZhbHVlKCkpIDwgMClcCi0JcmV0dXJuIC0xCisjZGVmaW5lIERFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgc2l6ZSA9IEZYX0FycmF5U2l6ZShBcnJheUNvbnRlbnQpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENKU19BcnJheSBhcnJheShwUnVudGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnJheS5TZXRFbGVtZW50KGksIENKU19WYWx1ZShwUnVudGltZSwgQXJyYXlDb250ZW50W2ldKSk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDSlNfUHJvcFZhbHVlIHByb3AocFJ1bnRpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHJvcCA8PCBhcnJheTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChKU19EZWZpbmVHbG9iYWxDb25zdChwUnVudGltZSwgKGNvbnN0IHdjaGFyX3QqKUFycmF5TmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5Ub1Y4VmFsdWUoKSkgPCAwKSAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIC0xCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jZGVmaW5lIFZBTFVFX05BTUVfU1RSSU5HCQlMInN0cmluZyIKLSNkZWZpbmUgVkFMVUVfTkFNRV9OVU1CRVIJCUwibnVtYmVyIgotI2RlZmluZSBWQUxVRV9OQU1FX0JPT0xFQU4JCUwiYm9vbGVhbiIKLSNkZWZpbmUgVkFMVUVfTkFNRV9EQVRFCQkJTCJkYXRlIgotI2RlZmluZSBWQUxVRV9OQU1FX09CSkVDVAkJTCJvYmplY3QiCi0jZGVmaW5lIFZBTFVFX05BTUVfRlhPQkoJCUwiZnhvYmoiCi0jZGVmaW5lIFZBTFVFX05BTUVfTlVMTAkJCUwibnVsbCIKLSNkZWZpbmUgVkFMVUVfTkFNRV9VTkRFRklORUQJTCJ1bmRlZmluZWQiCisjZGVmaW5lIFZBTFVFX05BTUVfU1RSSU5HIEwic3RyaW5nIgorI2RlZmluZSBWQUxVRV9OQU1FX05VTUJFUiBMIm51bWJlciIKKyNkZWZpbmUgVkFMVUVfTkFNRV9CT09MRUFOIEwiYm9vbGVhbiIKKyNkZWZpbmUgVkFMVUVfTkFNRV9EQVRFIEwiZGF0ZSIKKyNkZWZpbmUgVkFMVUVfTkFNRV9PQkpFQ1QgTCJvYmplY3QiCisjZGVmaW5lIFZBTFVFX05BTUVfRlhPQkogTCJmeG9iaiIKKyNkZWZpbmUgVkFMVUVfTkFNRV9OVUxMIEwibnVsbCIKKyNkZWZpbmUgVkFMVUVfTkFNRV9VTkRFRklORUQgTCJ1bmRlZmluZWQiCiAKIEZYSlNWQUxVRVRZUEUgR0VUX1ZBTFVFX1RZUEUodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcCk7CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgKaW5kZXggNjJhZmI4Mi4uNWU0OTgyYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgKQEAgLTE3LDE1NyArMTcsMjA0IEBACiBjbGFzcyBDUERGX0Zvcm1GaWVsZDsKIGNsYXNzIEZpZWxkOwogCi1lbnVtIEpTX0VWRU5UX1QKLXsKLQlKRVRfVU5LTk9XTiwKLQlKRVRfQVBQX0lOSVQsCi0JSkVUX0RPQ19PUEVOLAotCUpFVF9ET0NfV0lMTFBSSU5ULAotCUpFVF9ET0NfRElEUFJJTlQsCi0JSkVUX0RPQ19XSUxMU0FWRSwKLQlKRVRfRE9DX0RJRFNBVkUsCi0JSkVUX0RPQ19XSUxMQ0xPU0UsCi0JSkVUX1BBR0VfT1BFTiwKLQlKRVRfUEFHRV9DTE9TRSwKLQlKRVRfUEFHRV9JTlZJRVcsCi0JSkVUX1BBR0VfT1VUVklFVywKLQlKRVRfRklFTERfTU9VU0VET1dOLAotCUpFVF9GSUVMRF9NT1VTRVVQLAotCUpFVF9GSUVMRF9NT1VTRUVOVEVSLAotCUpFVF9GSUVMRF9NT1VTRUVYSVQsCi0JSkVUX0ZJRUxEX0ZPQ1VTLAotCUpFVF9GSUVMRF9CTFVSLAotCUpFVF9GSUVMRF9LRVlTVFJPS0UsCi0JSkVUX0ZJRUxEX1ZBTElEQVRFLAotCUpFVF9GSUVMRF9DQUxDVUxBVEUsCi0JSkVUX0ZJRUxEX0ZPUk1BVCwKLQlKRVRfU0NSRUVOX0ZPQ1VTLAotCUpFVF9TQ1JFRU5fQkxVUiwKLQlKRVRfU0NSRUVOX09QRU4sCi0JSkVUX1NDUkVFTl9DTE9TRSwKLQlKRVRfU0NSRUVOX01PVVNFRE9XTiwKLQlKRVRfU0NSRUVOX01PVVNFVVAsCi0JSkVUX1NDUkVFTl9NT1VTRUVOVEVSLAotCUpFVF9TQ1JFRU5fTU9VU0VFWElULAotCUpFVF9TQ1JFRU5fSU5WSUVXLAotCUpFVF9TQ1JFRU5fT1VUVklFVywKLQlKRVRfQkFUQ0hfRVhFQywKLQlKRVRfTUVOVV9FWEVDLAotCUpFVF9DT05TT0xFX0VYRUMsCi0JSkVUX0VYVEVSTkFMX0VYRUMsCi0JSkVUX0JPT0tNQVJLX01PVVNFVVAsCi0JSkVUX0xJTktfTU9VU0VVUAorZW51bSBKU19FVkVOVF9UIHsKKyAgSkVUX1VOS05PV04sCisgIEpFVF9BUFBfSU5JVCwKKyAgSkVUX0RPQ19PUEVOLAorICBKRVRfRE9DX1dJTExQUklOVCwKKyAgSkVUX0RPQ19ESURQUklOVCwKKyAgSkVUX0RPQ19XSUxMU0FWRSwKKyAgSkVUX0RPQ19ESURTQVZFLAorICBKRVRfRE9DX1dJTExDTE9TRSwKKyAgSkVUX1BBR0VfT1BFTiwKKyAgSkVUX1BBR0VfQ0xPU0UsCisgIEpFVF9QQUdFX0lOVklFVywKKyAgSkVUX1BBR0VfT1VUVklFVywKKyAgSkVUX0ZJRUxEX01PVVNFRE9XTiwKKyAgSkVUX0ZJRUxEX01PVVNFVVAsCisgIEpFVF9GSUVMRF9NT1VTRUVOVEVSLAorICBKRVRfRklFTERfTU9VU0VFWElULAorICBKRVRfRklFTERfRk9DVVMsCisgIEpFVF9GSUVMRF9CTFVSLAorICBKRVRfRklFTERfS0VZU1RST0tFLAorICBKRVRfRklFTERfVkFMSURBVEUsCisgIEpFVF9GSUVMRF9DQUxDVUxBVEUsCisgIEpFVF9GSUVMRF9GT1JNQVQsCisgIEpFVF9TQ1JFRU5fRk9DVVMsCisgIEpFVF9TQ1JFRU5fQkxVUiwKKyAgSkVUX1NDUkVFTl9PUEVOLAorICBKRVRfU0NSRUVOX0NMT1NFLAorICBKRVRfU0NSRUVOX01PVVNFRE9XTiwKKyAgSkVUX1NDUkVFTl9NT1VTRVVQLAorICBKRVRfU0NSRUVOX01PVVNFRU5URVIsCisgIEpFVF9TQ1JFRU5fTU9VU0VFWElULAorICBKRVRfU0NSRUVOX0lOVklFVywKKyAgSkVUX1NDUkVFTl9PVVRWSUVXLAorICBKRVRfQkFUQ0hfRVhFQywKKyAgSkVUX01FTlVfRVhFQywKKyAgSkVUX0NPTlNPTEVfRVhFQywKKyAgSkVUX0VYVEVSTkFMX0VYRUMsCisgIEpFVF9CT09LTUFSS19NT1VTRVVQLAorICBKRVRfTElOS19NT1VTRVVQCiB9OwogCi1jbGFzcyBDSlNfRXZlbnRIYW5kbGVyCi17Ci1wdWJsaWM6Ci0JQ0pTX0V2ZW50SGFuZGxlcihDSlNfQ29udGV4dCAqIHBDb250ZXh0KTsKLQl2aXJ0dWFsIH5DSlNfRXZlbnRIYW5kbGVyKCk7CitjbGFzcyBDSlNfRXZlbnRIYW5kbGVyIHsKKyBwdWJsaWM6CisgIENKU19FdmVudEhhbmRsZXIoQ0pTX0NvbnRleHQqIHBDb250ZXh0KTsKKyAgdmlydHVhbCB+Q0pTX0V2ZW50SGFuZGxlcigpOwogCi0Jdm9pZAkJCQkJT25BcHBfSW5pdCgpOworICB2b2lkIE9uQXBwX0luaXQoKTsKIAotCXZvaWQJCQkJCU9uRG9jX09wZW4oQ1BERlNES19Eb2N1bWVudCogcERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpOwotCXZvaWQJCQkJCU9uRG9jX1dpbGxQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKLQl2b2lkCQkJCQlPbkRvY19EaWRQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKLQl2b2lkCQkJCQlPbkRvY19XaWxsU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKLQl2b2lkCQkJCQlPbkRvY19EaWRTYXZlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwotCXZvaWQJCQkJCU9uRG9jX1dpbGxDbG9zZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKKyAgdm9pZCBPbkRvY19PcGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKTsKKyAgdm9pZCBPbkRvY19XaWxsUHJpbnQoQ1BERlNES19Eb2N1bWVudCogcERvYyk7CisgIHZvaWQgT25Eb2NfRGlkUHJpbnQoQ1BERlNES19Eb2N1bWVudCogcERvYyk7CisgIHZvaWQgT25Eb2NfV2lsbFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYyk7CisgIHZvaWQgT25Eb2NfRGlkU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKKyAgdm9pZCBPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcERvYyk7CiAKLQl2b2lkCQkJCQlPblBhZ2VfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKLQl2b2lkCQkJCQlPblBhZ2VfQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcERvYyk7Ci0Jdm9pZAkJCQkJT25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKLQl2b2lkCQkJCQlPblBhZ2VfT3V0VmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKKyAgdm9pZCBPblBhZ2VfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKKyAgdm9pZCBPblBhZ2VfQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcERvYyk7CisgIHZvaWQgT25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKKyAgdm9pZCBPblBhZ2VfT3V0VmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKIAotCXZvaWQJCQkJCU9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpOwotCXZvaWQJCQkJCU9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wgYldpbGxDb21taXQpOwotCXZvaWQJCQkJCU9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKLQkJCQkJCQkJRlhfQk9PTCBLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwgaW50ICZuU2VsRW5kLGludCAmblNlbFN0YXJ0LCBGWF9CT09MIGJTaGlmdCwKLQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwKLQkJCQkJCQkJRlhfQk9PTCBiRmllbGRGdWxsLCBGWF9CT09MICZiUmMpOwotCXZvaWQJCQkJCU9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLAotCQkJCQkJCQlGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYyk7CisgIHZvaWQgT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYyk7CisgIHZvaWQgT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpbGxDb21taXQpOworICB2b2lkIE9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpbGxDb21taXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmllbGRGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYyk7CisgIHZvaWQgT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYyk7CiAKLQl2b2lkCQkJCQlPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2b2lkCQkJCQlPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZvaWQJCQkJCU9uRmllbGRfQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOwotCXZvaWQJCQkJCU9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKKyAgdm9pZCBPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCk7CisgIHZvaWQgT25GaWVsZF9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpOworICB2b2lkIE9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KTsKKyAgdm9pZCBPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCk7CisgIHZvaWQgT25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSk7CisgIHZvaWQgT25GaWVsZF9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOwogCi0Jdm9pZAkJCQkJT25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fT3BlbihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fTW91c2VEb3duKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZvaWQgT25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZvaWQgT25TY3JlZW5fQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworICB2b2lkIE9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9DbG9zZShGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKIAotCXZvaWQJCQkJCU9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspOwotCXZvaWQJCQkJCU9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOworICB2b2lkIE9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspOworICB2b2lkIE9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOwogCi0Jdm9pZAkJCQkJT25NZW51X0V4ZWMoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpOwotCXZvaWQJCQkJCU9uQmF0Y2hFeGVjKENQREZTREtfRG9jdW1lbnQgKnBUYXJnZXQpOwotCXZvaWQJCQkJCU9uQ29uc29sZV9FeGVjKCk7Ci0Jdm9pZAkJCQkJT25FeHRlcm5hbF9FeGVjKCk7CisgIHZvaWQgT25NZW51X0V4ZWMoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSk7CisgIHZvaWQgT25CYXRjaEV4ZWMoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7CisgIHZvaWQgT25Db25zb2xlX0V4ZWMoKTsKKyAgdm9pZCBPbkV4dGVybmFsX0V4ZWMoKTsKIAotcHVibGljOgotICAgIHZvaWQJCQkJCUluaXRpYWwoSlNfRVZFTlRfVCB0eXBlKTsKLQl2b2lkCQkJCQlEZXN0cm95KCk7Ci0JRlhfQk9PTAkJCQkJSXNWYWxpZCgpOworIHB1YmxpYzoKKyAgdm9pZCBJbml0aWFsKEpTX0VWRU5UX1QgdHlwZSk7CisgIHZvaWQgRGVzdHJveSgpOworICBGWF9CT09MIElzVmFsaWQoKTsKIAorICBDRlhfV2lkZVN0cmluZyYgQ2hhbmdlKCk7CisgIENGWF9XaWRlU3RyaW5nIENoYW5nZUV4KCk7CisgIGludCBDb21taXRLZXkoKTsKKyAgRlhfQk9PTCBGaWVsZEZ1bGwoKTsKKyAgRlhfQk9PTCBLZXlEb3duKCk7CisgIEZYX0JPT0wgTW9kaWZpZXIoKTsKKyAgY29uc3QgRlhfV0NIQVIqIE5hbWUoKTsKKyAgY29uc3QgRlhfV0NIQVIqIFR5cGUoKTsKKyAgRlhfQk9PTCYgUmMoKTsKKyAgaW50JiBTZWxFbmQoKTsKKyAgaW50JiBTZWxTdGFydCgpOworICBGWF9CT09MIFNoaWZ0KCk7CisgIEZpZWxkKiBTb3VyY2UoKTsKKyAgRmllbGQqIFRhcmdldF9GaWVsZCgpOworICBDRlhfV2lkZVN0cmluZyYgVmFsdWUoKTsKKyAgRlhfQk9PTCBXaWxsQ29tbWl0KCk7CisgIENGWF9XaWRlU3RyaW5nIFRhcmdldE5hbWUoKTsKIAotCUNGWF9XaWRlU3RyaW5nJgkJCUNoYW5nZSgpOwotCUNGWF9XaWRlU3RyaW5nCQkJQ2hhbmdlRXgoKTsKLQlpbnQJCQkJCQlDb21taXRLZXkoKTsKLQlGWF9CT09MCQkJCQlGaWVsZEZ1bGwoKTsKLQlGWF9CT09MCQkJCQlLZXlEb3duKCk7Ci0JRlhfQk9PTAkJCQkJTW9kaWZpZXIoKTsKLQljb25zdCBGWF9XQ0hBUioJCQkJTmFtZSgpOwotCWNvbnN0IEZYX1dDSEFSKgkJCQlUeXBlKCk7Ci0JRlhfQk9PTCYJCQkJUmMoKTsKLQlpbnQmCQkJCQlTZWxFbmQoKTsKLQlpbnQmCQkJCQlTZWxTdGFydCgpOwotCUZYX0JPT0wJCQkJCVNoaWZ0KCk7Ci0JRmllbGQqCQkJCQlTb3VyY2UoKTsKLQlGaWVsZCoJCQkJCVRhcmdldF9GaWVsZCgpOwotCUNGWF9XaWRlU3RyaW5nJgkJCVZhbHVlKCk7Ci0JRlhfQk9PTAkJCQkJV2lsbENvbW1pdCgpOwotCUNGWF9XaWRlU3RyaW5nCQkJVGFyZ2V0TmFtZSgpOworICBKU19FVkVOVF9UIEV2ZW50VHlwZSgpIHsgcmV0dXJuIG1fZUV2ZW50VHlwZTsgfTsKIAotCUpTX0VWRU5UX1QJCQkJRXZlbnRUeXBlKCkge3JldHVybiBtX2VFdmVudFR5cGU7fTsKKyBwdWJsaWM6CisgIENKU19Db250ZXh0KiBtX3BKU0NvbnRleHQ7CisgIEpTX0VWRU5UX1QgbV9lRXZlbnRUeXBlOworICBGWF9CT09MIG1fYlZhbGlkOwogCi1wdWJsaWM6Ci0JQ0pTX0NvbnRleHQqCQkJbV9wSlNDb250ZXh0OwotCUpTX0VWRU5UX1QJCQkJbV9lRXZlbnRUeXBlOwotCUZYX0JPT0wJCQkJCW1fYlZhbGlkOworICBDRlhfV2lkZVN0cmluZyBtX3N0clRhcmdldE5hbWU7CisgIENGWF9XaWRlU3RyaW5nIG1fc3RyU291cmNlTmFtZTsKKyAgQ0ZYX1dpZGVTdHJpbmcqIG1fcFdpZGVTdHJDaGFuZ2U7CisgIENGWF9XaWRlU3RyaW5nIG1fV2lkZVN0ckNoYW5nZUR1OworICBDRlhfV2lkZVN0cmluZyBtX1dpZGVTdHJDaGFuZ2VFeDsKKyAgaW50IG1fbkNvbW1pdEtleTsKKyAgRlhfQk9PTCBtX2JLZXlEb3duOworICBGWF9CT09MIG1fYk1vZGlmaWVyOworICBGWF9CT09MIG1fYlNoaWZ0OworICBpbnQqIG1fcElTZWxFbmQ7CisgIGludCBtX25TZWxFbmREdTsKKyAgaW50KiBtX3BJU2VsU3RhcnQ7CisgIGludCBtX25TZWxTdGFydER1OworICBGWF9CT09MIG1fYldpbGxDb21taXQ7CisgIENGWF9XaWRlU3RyaW5nKiBtX3BWYWx1ZTsKKyAgRlhfQk9PTCBtX2JGaWVsZEZ1bGw7CisgIEZYX0JPT0wqIG1fcGJSYzsKKyAgRlhfQk9PTCBtX2JSY0R1OwogCi0JQ0ZYX1dpZGVTdHJpbmcJCQltX3N0clRhcmdldE5hbWU7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQltX3N0clNvdXJjZU5hbWU7Ci0JQ0ZYX1dpZGVTdHJpbmcqCQkJbV9wV2lkZVN0ckNoYW5nZTsKLQlDRlhfV2lkZVN0cmluZwkJCW1fV2lkZVN0ckNoYW5nZUR1OwotCUNGWF9XaWRlU3RyaW5nCQkJbV9XaWRlU3RyQ2hhbmdlRXg7Ci0JaW50CQkJCQkJbV9uQ29tbWl0S2V5OwotCUZYX0JPT0wJCQkJCW1fYktleURvd247Ci0JRlhfQk9PTAkJCQkJbV9iTW9kaWZpZXI7Ci0JRlhfQk9PTAkJCQkJbV9iU2hpZnQ7Ci0JaW50KgkJCQkJbV9wSVNlbEVuZDsKLQlpbnQJCQkJCQltX25TZWxFbmREdTsKLQlpbnQqCQkJCQltX3BJU2VsU3RhcnQ7Ci0JaW50CQkJCQkJbV9uU2VsU3RhcnREdTsKLQlGWF9CT09MCQkJCQltX2JXaWxsQ29tbWl0OwotCUNGWF9XaWRlU3RyaW5nKgkJCW1fcFZhbHVlOwotCUZYX0JPT0wJCQkJCW1fYkZpZWxkRnVsbDsKLQlGWF9CT09MKgkJCQltX3BiUmM7Ci0JRlhfQk9PTAkJCQkJbV9iUmNEdTsKLQotCUNQREZTREtfRG9jdW1lbnQqCQltX3BTb3VyY2VEb2M7Ci0JQ1BERl9Cb29rbWFyayoJCQltX3BUYXJnZXRCb29rTWFyazsKLQlDUERGU0RLX0RvY3VtZW50KgkJbV9wVGFyZ2V0RG9jOwotCUNQREZTREtfQW5ub3QqCQkJbV9wVGFyZ2V0QW5ub3Q7CisgIENQREZTREtfRG9jdW1lbnQqIG1fcFNvdXJjZURvYzsKKyAgQ1BERl9Cb29rbWFyayogbV9wVGFyZ2V0Qm9va01hcms7CisgIENQREZTREtfRG9jdW1lbnQqIG1fcFRhcmdldERvYzsKKyAgQ1BERlNES19Bbm5vdCogbV9wVGFyZ2V0QW5ub3Q7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX0VWRU5USEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oCmluZGV4IGJiYzBiMTIuLjQ2Yjk0YTQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmgKQEAgLTksOTAgKzksOTUgQEAKIAogI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgogCi0jZGVmaW5lIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVIJCTAKLSNkZWZpbmUgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4JCTEKLSNkZWZpbmUgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORwkJMgotI2RlZmluZSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUCQkzCi0jZGVmaW5lIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMCQkJNAorI2RlZmluZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSIDAKKyNkZWZpbmUgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4gMQorI2RlZmluZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HIDIKKyNkZWZpbmUgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVCAzCisjZGVmaW5lIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMIDQKIAogY2xhc3MgQ0pTX0tleVZhbHVlOwogY2xhc3MgQ1BERkRvY19FbnZpcm9ubWVudDsKIAotY2xhc3MgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkKLXsKLXB1YmxpYzoKLQlDSlNfR2xvYmFsVmFyaWFibGVBcnJheSgpOwotCXZpcnR1YWwgfkNKU19HbG9iYWxWYXJpYWJsZUFycmF5KCk7CitjbGFzcyBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSB7CisgcHVibGljOgorICBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSgpOworICB2aXJ0dWFsIH5DSlNfR2xvYmFsVmFyaWFibGVBcnJheSgpOwogCi0Jdm9pZAkJCUFkZChDSlNfS2V5VmFsdWUqIHApOwotCWludAkJCQlDb3VudCgpIGNvbnN0OwotCUNKU19LZXlWYWx1ZSoJR2V0QXQoaW50IGluZGV4KSBjb25zdDsKLQl2b2lkCQkJQ29weShjb25zdCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpOworICB2b2lkIEFkZChDSlNfS2V5VmFsdWUqIHApOworICBpbnQgQ291bnQoKSBjb25zdDsKKyAgQ0pTX0tleVZhbHVlKiBHZXRBdChpbnQgaW5kZXgpIGNvbnN0OworICB2b2lkIENvcHkoY29uc3QgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkmIGFycmF5KTsKIAotCXZvaWQJCQlFbXB0eSgpOworICB2b2lkIEVtcHR5KCk7CiAKLXByaXZhdGU6Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0tleVZhbHVlKj4gYXJyYXk7CisgcHJpdmF0ZToKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0tleVZhbHVlKj4gYXJyYXk7CiB9OwogCi1jbGFzcyBDSlNfS2V5VmFsdWUKLXsKLXB1YmxpYzoKLQlDSlNfS2V5VmFsdWUoKXt9Ci0JdmlydHVhbCB+Q0pTX0tleVZhbHVlKCl7fQorY2xhc3MgQ0pTX0tleVZhbHVlIHsKKyBwdWJsaWM6CisgIENKU19LZXlWYWx1ZSgpIHt9CisgIHZpcnR1YWwgfkNKU19LZXlWYWx1ZSgpIHt9CiAKLQlDRlhfQnl0ZVN0cmluZwkJCQkJc0tleTsKLQlpbnQJCQkJCQkJCW5UeXBlOyAvLzA6aW50IDE6Ym9vbCAyOnN0cmluZyAzOm9iagotCWRvdWJsZQkJCQkJCQlkRGF0YTsKLQlib29sCQkJCQkJCWJEYXRhOwotCUNGWF9CeXRlU3RyaW5nCQkJCQlzRGF0YTsKLQlDSlNfR2xvYmFsVmFyaWFibGVBcnJheQkJCW9iakRhdGE7CisgIENGWF9CeXRlU3RyaW5nIHNLZXk7CisgIGludCBuVHlwZTsgIC8vIDA6aW50IDE6Ym9vbCAyOnN0cmluZyAzOm9iagorICBkb3VibGUgZERhdGE7CisgIGJvb2wgYkRhdGE7CisgIENGWF9CeXRlU3RyaW5nIHNEYXRhOworICBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSBvYmpEYXRhOwogfTsKIAotY2xhc3MgQ0pTX0dsb2JhbERhdGFfRWxlbWVudAotewotcHVibGljOgotCUNKU19HbG9iYWxEYXRhX0VsZW1lbnQoKXt9Ci0JdmlydHVhbCB+Q0pTX0dsb2JhbERhdGFfRWxlbWVudCgpe30KK2NsYXNzIENKU19HbG9iYWxEYXRhX0VsZW1lbnQgeworIHB1YmxpYzoKKyAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCgpIHt9CisgIHZpcnR1YWwgfkNKU19HbG9iYWxEYXRhX0VsZW1lbnQoKSB7fQogCi0JQ0pTX0tleVZhbHVlCQkJZGF0YTsKLQlGWF9CT09MCQkJCQliUGVyc2lzdGVudDsKKyAgQ0pTX0tleVZhbHVlIGRhdGE7CisgIEZYX0JPT0wgYlBlcnNpc3RlbnQ7CiB9OwogCi1jbGFzcyBDSlNfR2xvYmFsRGF0YQotewotcHVibGljOgotCUNKU19HbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwotCXZpcnR1YWwgfkNKU19HbG9iYWxEYXRhKCk7CitjbGFzcyBDSlNfR2xvYmFsRGF0YSB7CisgcHVibGljOgorICBDSlNfR2xvYmFsRGF0YShDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKTsKKyAgdmlydHVhbCB+Q0pTX0dsb2JhbERhdGEoKTsKIAotcHVibGljOgotCXZvaWQJCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLCBkb3VibGUgZERhdGEpOwotCXZvaWQJCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlQm9vbGVhbihjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgYm9vbCBiRGF0YSk7Ci0Jdm9pZAkJCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVTdHJpbmcoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSk7Ci0Jdm9pZAkJCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVPYmplY3QoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSk7Ci0Jdm9pZAkJCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVOdWxsKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lKTsKKyBwdWJsaWM6CisgIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVOdW1iZXIoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGRvdWJsZSBkRGF0YSk7CisgIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLCBib29sIGJEYXRhKTsKKyAgdm9pZCBTZXRHbG9iYWxWYXJpYWJsZVN0cmluZyhjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0RhdGEpOworICB2b2lkIFNldEdsb2JhbFZhcmlhYmxlT2JqZWN0KGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSk7CisgIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVOdWxsKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lKTsKIAotCUZYX0JPT0wJCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgRlhfQk9PTCBiUGVyc2lzdGVudCk7Ci0JRlhfQk9PTAkJCQkJCQkJRGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpOworICBGWF9CT09MIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGVyc2lzdGVudCk7CisgIEZYX0JPT0wgRGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpOwogCi0JaW50MzJfdAkJCQkJCQlHZXRTaXplKCkgY29uc3Q7Ci0JQ0pTX0dsb2JhbERhdGFfRWxlbWVudCoJCQkJR2V0QXQoaW50IGluZGV4KSBjb25zdDsKKyAgaW50MzJfdCBHZXRTaXplKCkgY29uc3Q7CisgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIEdldEF0KGludCBpbmRleCkgY29uc3Q7CiAKLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCQkJTG9hZEdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKLQl2b2lkCQkJCQkJCQlTYXZlR2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKTsKKyBwcml2YXRlOgorICB2b2lkIExvYWRHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7CisgIHZvaWQgU2F2ZUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7CiAKLQlDSlNfR2xvYmFsRGF0YV9FbGVtZW50KgkJCQlHZXRHbG9iYWxWYXJpYWJsZShjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSk7Ci0JaW50CQkJCQkJCQkJRmluZEdsb2JhbFZhcmlhYmxlKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lKTsKKyAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogR2V0R2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpOworICBpbnQgRmluZEdsb2JhbFZhcmlhYmxlKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lKTsKIAotCXZvaWQJCQkJCQkJCUxvYWRGaWxlQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBzRmlsZVBhdGgsIHVpbnQ4X3QqJiBwQnVmZmVyLCBpbnQzMl90JiBuTGVuZ3RoKTsKLQl2b2lkCQkJCQkJCQlXcml0ZUZpbGVCdWZmZXIoY29uc3QgRlhfV0NIQVIqIHNGaWxlUGF0aCwgY29uc3QgRlhfQ0hBUiogcEJ1ZmZlciwgaW50MzJfdCBuTGVuZ3RoKTsKLQl2b2lkCQkJCQkJCQlNYWtlQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ0pTX0tleVZhbHVlKiBwRGF0YSwgQ0ZYX0JpbmFyeUJ1ZiYgc0RhdGEpOworICB2b2lkIExvYWRGaWxlQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBzRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkxlbmd0aCk7CisgIHZvaWQgV3JpdGVGaWxlQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBzRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCk7CisgIHZvaWQgTWFrZUJ5dGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX0tleVZhbHVlKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBzRGF0YSk7CiAKLXByaXZhdGU6Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0dsb2JhbERhdGFfRWxlbWVudCo+CW1fYXJyYXlHbG9iYWxEYXRhOwotCUNGWF9XaWRlU3RyaW5nCQkJCQkJCQltX3NGaWxlUGF0aDsKLQlDUERGRG9jX0Vudmlyb25tZW50KgkJCQkJCW1fcEFwcDsKKyBwcml2YXRlOgorICBDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfR2xvYmFsRGF0YV9FbGVtZW50Kj4gbV9hcnJheUdsb2JhbERhdGE7CisgIENGWF9XaWRlU3RyaW5nIG1fc0ZpbGVQYXRoOworICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX0dMT0JBTERBVEFfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKaW5kZXggYWJmYzgxOC4uZmU4YTkxZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKQEAgLTcsOCArNyw4IEBACiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX09CSkVDVF9IXwogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KU19PQkpFQ1RfSF8KIAotI2luY2x1ZGUgIi4uL2ZzZGtfZGVmaW5lLmgiICAvLyBGb3IgRlhfVUlOVAotI2luY2x1ZGUgIi4uL2ZzZGtfbWdyLmgiICAvLyBGb3IgQ1BERkRvY19FbnZpcm9ubWVudAorI2luY2x1ZGUgIi4uL2ZzZGtfZGVmaW5lLmgiICAgICAgIC8vIEZvciBGWF9VSU5UCisjaW5jbHVkZSAiLi4vZnNka19tZ3IuaCIgICAgICAgICAgLy8gRm9yIENQREZEb2NfRW52aXJvbm1lbnQKICNpbmNsdWRlICIuLi9meF9zeXN0ZW1oYW5kbGVyLmgiICAvLyBGb3IgSUZYX1N5c3RlbUhhbmRsZXIKICNpbmNsdWRlICIuLi9qc2FwaS9meGpzX3Y4LmgiCiAKQEAgLTE3LDI4NCArMTcsMjMzIEBACiBjbGFzcyBDSlNfVGltZXI7CiBjbGFzcyBDSlNfQ29udGV4dDsKIAotY2xhc3MgQ0pTX0VtYmVkT2JqCi17Ci1wdWJsaWM6Ci0JQ0pTX0VtYmVkT2JqKENKU19PYmplY3QqIHBKU09iamVjdCk7Ci0JdmlydHVhbCB+Q0pTX0VtYmVkT2JqKCk7CitjbGFzcyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgQ0pTX0VtYmVkT2JqKENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIHZpcnR1YWwgfkNKU19FbWJlZE9iaigpOwogCi0JdmlydHVhbCB2b2lkCQkJCVRpbWVyUHJvYyhDSlNfVGltZXIqIHBUaW1lcil7fTsKKyAgdmlydHVhbCB2b2lkIFRpbWVyUHJvYyhDSlNfVGltZXIqIHBUaW1lcil7fTsKIAotCUNKU19UaW1lcioJCQkJCUJlZ2luVGltZXIoQ1BERkRvY19FbnZpcm9ubWVudCAqIHBBcHAsIEZYX1VJTlQgbkVsYXBzZSk7Ci0Jdm9pZAkJCQkJCUVuZFRpbWVyKENKU19UaW1lciogcFRpbWVyKTsKKyAgQ0pTX1RpbWVyKiBCZWdpblRpbWVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIEZYX1VJTlQgbkVsYXBzZSk7CisgIHZvaWQgRW5kVGltZXIoQ0pTX1RpbWVyKiBwVGltZXIpOwogCi0JQ0pTX09iamVjdCoJCQkJCUdldEpTT2JqZWN0KCl7cmV0dXJuIG1fcEpTT2JqZWN0O307Ci0Jb3BlcmF0b3IJCQkJCUNKU19PYmplY3QqICgpe3JldHVybiBtX3BKU09iamVjdDt9OworICBDSlNfT2JqZWN0KiBHZXRKU09iamVjdCgpIHsgcmV0dXJuIG1fcEpTT2JqZWN0OyB9OworICBvcGVyYXRvciBDSlNfT2JqZWN0KigpIHsgcmV0dXJuIG1fcEpTT2JqZWN0OyB9OwogCi0JQ1BERlNES19QYWdlVmlldyAqCQkJSlNHZXRQYWdlVmlldyhJRlhKU19Db250ZXh0KiBjYyk7Ci0JaW50CQkJCQkJCU1zZ0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IEZYX1dDSEFSKiBzd01zZywgY29uc3QgRlhfV0NIQVIqIHN3VGl0bGUgPSBOVUxMLCBGWF9VSU5UIG5UeXBlID0gMCwgRlhfVUlOVCBuSWNvbiA9IDApOwotCXZvaWQJCQkJCQlBbGVydChDSlNfQ29udGV4dCogcENvbnRleHQsIGNvbnN0IEZYX1dDSEFSKiBzd01zZyk7CisgIENQREZTREtfUGFnZVZpZXcqIEpTR2V0UGFnZVZpZXcoSUZYSlNfQ29udGV4dCogY2MpOworICBpbnQgTXNnQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsCisgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzd01zZywKKyAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3dUaXRsZSA9IE5VTEwsCisgICAgICAgICAgICAgRlhfVUlOVCBuVHlwZSA9IDAsCisgICAgICAgICAgICAgRlhfVUlOVCBuSWNvbiA9IDApOworICB2b2lkIEFsZXJ0KENKU19Db250ZXh0KiBwQ29udGV4dCwgY29uc3QgRlhfV0NIQVIqIHN3TXNnKTsKIAotcHJvdGVjdGVkOgotCUNKU19PYmplY3QqCQkJCQltX3BKU09iamVjdDsKKyBwcm90ZWN0ZWQ6CisgIENKU19PYmplY3QqIG1fcEpTT2JqZWN0OwogfTsKIAotY2xhc3MgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19PYmplY3QoSlNGWE9iamVjdCBwT2JqZWN0KTsKLQl2aXJ0dWFsIH5DSlNfT2JqZWN0KHZvaWQpOworY2xhc3MgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBDSlNfT2JqZWN0KEpTRlhPYmplY3QgcE9iamVjdCk7CisgIHZpcnR1YWwgfkNKU19PYmplY3Qodm9pZCk7CiAKLQl2b2lkCQkJCQkJTWFrZVdlYWsoKTsKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zZSgpOworICB2b2lkIE1ha2VXZWFrKCk7CisgIHZvaWQgRGlzcG9zZSgpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUlzVHlwZShjb25zdCBGWF9DSEFSKiBzQ2xhc3NOYW1lKXtyZXR1cm4gVFJVRTt9OwotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpe3JldHVybiAiIjt9OworICB2aXJ0dWFsIEZYX0JPT0wgSXNUeXBlKGNvbnN0IEZYX0NIQVIqIHNDbGFzc05hbWUpIHsgcmV0dXJuIFRSVUU7IH07CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgeyByZXR1cm4gIiI7IH07CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKXtyZXR1cm4gVFJVRTt9OwotCXZpcnR1YWwgRlhfQk9PTAkJCQlFeGl0SW5zdGFuY2UoKXtyZXR1cm4gVFJVRTt9OworICB2aXJ0dWFsIEZYX0JPT0wgSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKSB7IHJldHVybiBUUlVFOyB9OworICB2aXJ0dWFsIEZYX0JPT0wgRXhpdEluc3RhbmNlKCkgeyByZXR1cm4gVFJVRTsgfTsKIAotCW9wZXJhdG9yCQkJCQlKU0ZYT2JqZWN0ICgpIHtyZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcobV9wSXNvbGF0ZSwgbV9wT2JqZWN0KTt9Ci0Jb3BlcmF0b3IJCQkJCUNKU19FbWJlZE9iaiogKCl7cmV0dXJuIG1fcEVtYmVkT2JqO307CisgIG9wZXJhdG9yIEpTRlhPYmplY3QoKSB7CisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KG1fcElzb2xhdGUsIG1fcE9iamVjdCk7CisgIH0KKyAgb3BlcmF0b3IgQ0pTX0VtYmVkT2JqKigpIHsgcmV0dXJuIG1fcEVtYmVkT2JqOyB9OwogCi0Jdm9pZAkJCQkJCVNldEVtYmVkT2JqZWN0KENKU19FbWJlZE9iaiogcE9iail7bV9wRW1iZWRPYmogPSBwT2JqO307Ci0JQ0pTX0VtYmVkT2JqICoJCQkJR2V0RW1iZWRPYmplY3QoKXtyZXR1cm4gbV9wRW1iZWRPYmo7fTsKKyAgdm9pZCBTZXRFbWJlZE9iamVjdChDSlNfRW1iZWRPYmoqIHBPYmopIHsgbV9wRW1iZWRPYmogPSBwT2JqOyB9OworICBDSlNfRW1iZWRPYmoqIEdldEVtYmVkT2JqZWN0KCkgeyByZXR1cm4gbV9wRW1iZWRPYmo7IH07CiAKLQlzdGF0aWMgQ1BERlNES19QYWdlVmlldyAqCUpTR2V0UGFnZVZpZXcoSUZYSlNfQ29udGV4dCogY2MpOwotCXN0YXRpYyBpbnQJCQkJCU1zZ0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IEZYX1dDSEFSKiBzd01zZywgY29uc3QgRlhfV0NIQVIqIHN3VGl0bGUgPSBOVUxMLCBGWF9VSU5UIG5UeXBlID0gMCxGWF9VSU5UIG5JY29uID0gMCk7Ci0Jc3RhdGljIHZvaWQJCQkJCUFsZXJ0KENKU19Db250ZXh0KiBwQ29udGV4dCwgY29uc3QgRlhfV0NIQVIqIHN3TXNnKTsKKyAgc3RhdGljIENQREZTREtfUGFnZVZpZXcqIEpTR2V0UGFnZVZpZXcoSUZYSlNfQ29udGV4dCogY2MpOworICBzdGF0aWMgaW50IE1zZ0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLAorICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzd01zZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN3VGl0bGUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5UeXBlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuSWNvbiA9IDApOworICBzdGF0aWMgdm9pZCBBbGVydChDSlNfQ29udGV4dCogcENvbnRleHQsIGNvbnN0IEZYX1dDSEFSKiBzd01zZyk7CiAKLQl2ODo6SXNvbGF0ZSoJCQkJCUdldElzb2xhdGUoKSB7cmV0dXJuIG1fcElzb2xhdGU7fQotcHJvdGVjdGVkOgotCUNKU19FbWJlZE9iaiAqCQkJCW1fcEVtYmVkT2JqOwotCXY4OjpHbG9iYWw8djg6Ok9iamVjdD4JCQltX3BPYmplY3Q7Ci0Jdjg6Oklzb2xhdGUqCQkJCQltX3BJc29sYXRlOworICB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIHsgcmV0dXJuIG1fcElzb2xhdGU7IH0KKworIHByb3RlY3RlZDoKKyAgQ0pTX0VtYmVkT2JqKiBtX3BFbWJlZE9iajsKKyAgdjg6Okdsb2JhbDx2ODo6T2JqZWN0PiBtX3BPYmplY3Q7CisgIHY4OjpJc29sYXRlKiBtX3BJc29sYXRlOwogfTsKIAotc3RydWN0IEpTX1RJTUVSX01BUAotewotCUZYX1VJTlQgbklEOwotCUNKU19UaW1lciAqIHBUaW1lcjsKK3N0cnVjdCBKU19USU1FUl9NQVAgeworICBGWF9VSU5UIG5JRDsKKyAgQ0pTX1RpbWVyKiBwVGltZXI7CiB9OwogCi10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPEpTX1RJTUVSX01BUCo+CUNUaW1lck1hcEFycmF5OwordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxKU19USU1FUl9NQVAqPiBDVGltZXJNYXBBcnJheTsKIAotc3RydWN0IEpTX1RJTUVSX01BUEFSUkFZCi17Ci1wdWJsaWM6Ci0JSlNfVElNRVJfTUFQQVJSQVkoKQotCXsKLQl9CitzdHJ1Y3QgSlNfVElNRVJfTUFQQVJSQVkgeworIHB1YmxpYzoKKyAgSlNfVElNRVJfTUFQQVJSQVkoKSB7fQogCi0JfkpTX1RJTUVSX01BUEFSUkFZKCkKLQl7Ci0JCVJlc2V0KCk7Ci0JfQorICB+SlNfVElNRVJfTUFQQVJSQVkoKSB7IFJlc2V0KCk7IH0KIAotCXZvaWQgUmVzZXQoKQotCXsKLQkJZm9yIChpbnQgaT0wLHN6PW1fQXJyYXkuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCQlkZWxldGUgbV9BcnJheS5HZXRBdChpKTsKKyAgdm9pZCBSZXNldCgpIHsKKyAgICBmb3IgKGludCBpID0gMCwgc3ogPSBtX0FycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgICBkZWxldGUgbV9BcnJheS5HZXRBdChpKTsKIAotCQltX0FycmF5LlJlbW92ZUFsbCgpOwotCX0KKyAgICBtX0FycmF5LlJlbW92ZUFsbCgpOworICB9CiAKLQl2b2lkIFNldEF0KEZYX1VJTlQgbkluZGV4LENKU19UaW1lciAqIHBUaW1lcikKLQl7Ci0JCWludCBpID0gRmluZChuSW5kZXgpOworICB2b2lkIFNldEF0KEZYX1VJTlQgbkluZGV4LCBDSlNfVGltZXIqIHBUaW1lcikgeworICAgIGludCBpID0gRmluZChuSW5kZXgpOwogCi0JCWlmIChpPj0wKQotCQl7Ci0JCQlpZiAoSlNfVElNRVJfTUFQICogcE1hcCA9IG1fQXJyYXkuR2V0QXQoaSkpCi0JCQkJcE1hcC0+cFRpbWVyID0gcFRpbWVyOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKEpTX1RJTUVSX01BUCAqIHBNYXAgPSBuZXcgSlNfVElNRVJfTUFQKQotCQkJewotCQkJCXBNYXAtPm5JRCA9IG5JbmRleDsKLQkJCQlwTWFwLT5wVGltZXIgPSBwVGltZXI7Ci0JCQkJbV9BcnJheS5BZGQocE1hcCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKGkgPj0gMCkgeworICAgICAgaWYgKEpTX1RJTUVSX01BUCogcE1hcCA9IG1fQXJyYXkuR2V0QXQoaSkpCisgICAgICAgIHBNYXAtPnBUaW1lciA9IHBUaW1lcjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKEpTX1RJTUVSX01BUCogcE1hcCA9IG5ldyBKU19USU1FUl9NQVApIHsKKyAgICAgICAgcE1hcC0+bklEID0gbkluZGV4OworICAgICAgICBwTWFwLT5wVGltZXIgPSBwVGltZXI7CisgICAgICAgIG1fQXJyYXkuQWRkKHBNYXApOworICAgICAgfQorICAgIH0KKyAgfQogCi0JQ0pTX1RpbWVyICogR2V0QXQoRlhfVUlOVCBuSW5kZXgpCi0JewotCQlpbnQgaSA9IEZpbmQobkluZGV4KTsKKyAgQ0pTX1RpbWVyKiBHZXRBdChGWF9VSU5UIG5JbmRleCkgeworICAgIGludCBpID0gRmluZChuSW5kZXgpOwogCi0JCWlmIChpPj0wKQotCQl7Ci0JCQlpZiAoSlNfVElNRVJfTUFQICogcE1hcCA9IG1fQXJyYXkuR2V0QXQoaSkpCi0JCQkJcmV0dXJuIHBNYXAtPnBUaW1lcjsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGkgPj0gMCkgeworICAgICAgaWYgKEpTX1RJTUVSX01BUCogcE1hcCA9IG1fQXJyYXkuR2V0QXQoaSkpCisgICAgICAgIHJldHVybiBwTWFwLT5wVGltZXI7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CiAKLQl2b2lkIFJlbW92ZUF0KEZYX1VJTlQgbkluZGV4KQotCXsKLQkJaW50IGkgPSBGaW5kKG5JbmRleCk7CisgIHZvaWQgUmVtb3ZlQXQoRlhfVUlOVCBuSW5kZXgpIHsKKyAgICBpbnQgaSA9IEZpbmQobkluZGV4KTsKIAotCQlpZiAoaT49MCkKLQkJewotCQkJZGVsZXRlIG1fQXJyYXkuR2V0QXQoaSk7Ci0JCQltX0FycmF5LlJlbW92ZUF0KGkpOwotCQl9Ci0JCS8vVG8gcHJldmVudCBwb3RlbnRpYWwgZmFrZSBtZW1vcnkgbGVhayByZXBvcnRlZCBieSB2YzYuCi0JCWlmKG1fQXJyYXkuR2V0U2l6ZSgpID09IDApCi0JCQltX0FycmF5LlJlbW92ZUFsbCgpOwotCX0KKyAgICBpZiAoaSA+PSAwKSB7CisgICAgICBkZWxldGUgbV9BcnJheS5HZXRBdChpKTsKKyAgICAgIG1fQXJyYXkuUmVtb3ZlQXQoaSk7CisgICAgfQorICAgIC8vIFRvIHByZXZlbnQgcG90ZW50aWFsIGZha2UgbWVtb3J5IGxlYWsgcmVwb3J0ZWQgYnkgdmM2LgorICAgIGlmIChtX0FycmF5LkdldFNpemUoKSA9PSAwKQorICAgICAgbV9BcnJheS5SZW1vdmVBbGwoKTsKKyAgfQogCi0JaW50IEZpbmQoRlhfVUlOVCBuSW5kZXgpCi0JewotCQlmb3IgKGludCBpPTAsc3o9bV9BcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJewotCQkJaWYgKEpTX1RJTUVSX01BUCAqIHBNYXAgPSBtX0FycmF5LkdldEF0KGkpKQotCQkJewotCQkJCWlmIChwTWFwLT5uSUQgPT0gbkluZGV4KQotCQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQorICBpbnQgRmluZChGWF9VSU5UIG5JbmRleCkgeworICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fQXJyYXkuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgICAgaWYgKEpTX1RJTUVSX01BUCogcE1hcCA9IG1fQXJyYXkuR2V0QXQoaSkpIHsKKyAgICAgICAgaWYgKHBNYXAtPm5JRCA9PSBuSW5kZXgpCisgICAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisgICAgfQogCi0JCXJldHVybiAtMTsKLQl9CisgICAgcmV0dXJuIC0xOworICB9CiAKLQlDVGltZXJNYXBBcnJheQkJbV9BcnJheTsKKyAgQ1RpbWVyTWFwQXJyYXkgbV9BcnJheTsKIH07CiAKIEpTX1RJTUVSX01BUEFSUkFZJiBHZXRUaW1lTWFwKCk7CiAKIGNsYXNzIENKU19SdW50aW1lOwogCi1jbGFzcyBDSlNfVGltZXIKLXsKLXB1YmxpYzoKLQlDSlNfVGltZXIoQ0pTX0VtYmVkT2JqICogcE9iaiwgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk6Ci0JCW1fblRpbWVySUQoMCksCi0JCW1fcEVtYmVkT2JqKHBPYmopLAotCQltX2JQcm9jZXNzaW5nKEZBTFNFKSwKLQkJbV9kd1N0YXJ0VGltZSgwKSwKLQkJbV9kd1RpbWVPdXQoMCksCi0JCW1fZHdFbGFwc2UoMCksCi0JCW1fcFJ1bnRpbWUoTlVMTCksCi0JCW1fblR5cGUoMCksCi0JCW1fcEFwcChwQXBwKQotCXsKLQl9CitjbGFzcyBDSlNfVGltZXIgeworIHB1YmxpYzoKKyAgQ0pTX1RpbWVyKENKU19FbWJlZE9iaiogcE9iaiwgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkKKyAgICAgIDogbV9uVGltZXJJRCgwKSwKKyAgICAgICAgbV9wRW1iZWRPYmoocE9iaiksCisgICAgICAgIG1fYlByb2Nlc3NpbmcoRkFMU0UpLAorICAgICAgICBtX2R3U3RhcnRUaW1lKDApLAorICAgICAgICBtX2R3VGltZU91dCgwKSwKKyAgICAgICAgbV9kd0VsYXBzZSgwKSwKKyAgICAgICAgbV9wUnVudGltZShOVUxMKSwKKyAgICAgICAgbV9uVHlwZSgwKSwKKyAgICAgICAgbV9wQXBwKHBBcHApIHt9CiAKLQl2aXJ0dWFsIH5DSlNfVGltZXIoKQotCXsKLQkJS2lsbEpTVGltZXIoKTsKLQl9CisgIHZpcnR1YWwgfkNKU19UaW1lcigpIHsgS2lsbEpTVGltZXIoKTsgfQogCi1wdWJsaWM6Ci0JRlhfVUlOVCBTZXRKU1RpbWVyKEZYX1VJTlQgbkVsYXBzZSkKLQl7Ci0JCWlmIChtX25UaW1lcklEKUtpbGxKU1RpbWVyKCk7Ci0JCUlGWF9TeXN0ZW1IYW5kbGVyKiBwSGFuZGxlciA9IG1fcEFwcC0+R2V0U3lzSGFuZGxlcigpOwotCQltX25UaW1lcklEID0gcEhhbmRsZXItPlNldFRpbWVyKG5FbGFwc2UsVGltZXJQcm9jKTsKLQkJR2V0VGltZU1hcCgpLlNldEF0KG1fblRpbWVySUQsdGhpcyk7Ci0JCW1fZHdFbGFwc2UgPSBuRWxhcHNlOwotCQlyZXR1cm4gbV9uVGltZXJJRDsKLQl9OworIHB1YmxpYzoKKyAgRlhfVUlOVCBTZXRKU1RpbWVyKEZYX1VJTlQgbkVsYXBzZSkgeworICAgIGlmIChtX25UaW1lcklEKQorICAgICAgS2lsbEpTVGltZXIoKTsKKyAgICBJRlhfU3lzdGVtSGFuZGxlciogcEhhbmRsZXIgPSBtX3BBcHAtPkdldFN5c0hhbmRsZXIoKTsKKyAgICBtX25UaW1lcklEID0gcEhhbmRsZXItPlNldFRpbWVyKG5FbGFwc2UsIFRpbWVyUHJvYyk7CisgICAgR2V0VGltZU1hcCgpLlNldEF0KG1fblRpbWVySUQsIHRoaXMpOworICAgIG1fZHdFbGFwc2UgPSBuRWxhcHNlOworICAgIHJldHVybiBtX25UaW1lcklEOworICB9OwogCi0Jdm9pZCBLaWxsSlNUaW1lcigpCi0JewotCQlpZiAobV9uVGltZXJJRCkKLQkJewotCQkJaWYgKG1fcEFwcCA9PSBOVUxMKSB7Ci0JCQkJR2V0VGltZU1hcCgpLlJlbW92ZUF0KG1fblRpbWVySUQpOwotCQkJCW1fblRpbWVySUQgPSAwOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlGWF9TeXN0ZW1IYW5kbGVyKiBwSGFuZGxlciA9IG1fcEFwcC0+R2V0U3lzSGFuZGxlcigpOwotCQkJcEhhbmRsZXItPktpbGxUaW1lcihtX25UaW1lcklEKTsKLQkJCUdldFRpbWVNYXAoKS5SZW1vdmVBdChtX25UaW1lcklEKTsKLQkJCW1fblRpbWVySUQgPSAwOwotCQl9Ci0JfTsKKyAgdm9pZCBLaWxsSlNUaW1lcigpIHsKKyAgICBpZiAobV9uVGltZXJJRCkgeworICAgICAgaWYgKG1fcEFwcCA9PSBOVUxMKSB7CisgICAgICAgIEdldFRpbWVNYXAoKS5SZW1vdmVBdChtX25UaW1lcklEKTsKKyAgICAgICAgbV9uVGltZXJJRCA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIElGWF9TeXN0ZW1IYW5kbGVyKiBwSGFuZGxlciA9IG1fcEFwcC0+R2V0U3lzSGFuZGxlcigpOworICAgICAgcEhhbmRsZXItPktpbGxUaW1lcihtX25UaW1lcklEKTsKKyAgICAgIEdldFRpbWVNYXAoKS5SZW1vdmVBdChtX25UaW1lcklEKTsKKyAgICAgIG1fblRpbWVySUQgPSAwOworICAgIH0KKyAgfTsKIAotCXZvaWQgU2V0VHlwZShpbnQgblR5cGUpCi0JewotCQltX25UeXBlID0gblR5cGU7Ci0JfQorICB2b2lkIFNldFR5cGUoaW50IG5UeXBlKSB7IG1fblR5cGUgPSBuVHlwZTsgfQogCi0JaW50IEdldFR5cGUoKSBjb25zdAotCXsKLQkJcmV0dXJuIG1fblR5cGU7Ci0JfQorICBpbnQgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fblR5cGU7IH0KIAotCXZvaWQgU2V0U3RhcnRUaW1lKEZYX0RXT1JEIGR3U3RhcnRUaW1lKQotCXsKLQkJbV9kd1N0YXJ0VGltZSA9IGR3U3RhcnRUaW1lOwotCX0KKyAgdm9pZCBTZXRTdGFydFRpbWUoRlhfRFdPUkQgZHdTdGFydFRpbWUpIHsgbV9kd1N0YXJ0VGltZSA9IGR3U3RhcnRUaW1lOyB9CiAKLQlGWF9EV09SRCBHZXRTdGFydFRpbWUoKSBjb25zdAotCXsKLQkJcmV0dXJuIG1fZHdTdGFydFRpbWU7Ci0JfQorICBGWF9EV09SRCBHZXRTdGFydFRpbWUoKSBjb25zdCB7IHJldHVybiBtX2R3U3RhcnRUaW1lOyB9CiAKLQl2b2lkIFNldFRpbWVPdXQoRlhfRFdPUkQgZHdUaW1lT3V0KQotCXsKLQkJbV9kd1RpbWVPdXQgPSBkd1RpbWVPdXQ7Ci0JfQorICB2b2lkIFNldFRpbWVPdXQoRlhfRFdPUkQgZHdUaW1lT3V0KSB7IG1fZHdUaW1lT3V0ID0gZHdUaW1lT3V0OyB9CiAKLQlGWF9EV09SRCBHZXRUaW1lT3V0KCkgY29uc3QKLQl7Ci0JCXJldHVybiBtX2R3VGltZU91dDsKLQl9CisgIEZYX0RXT1JEIEdldFRpbWVPdXQoKSBjb25zdCB7IHJldHVybiBtX2R3VGltZU91dDsgfQogCi0Jdm9pZCBTZXRSdW50aW1lKENKU19SdW50aW1lKiBwUnVudGltZSkKLQl7Ci0JCW1fcFJ1bnRpbWUgPSBwUnVudGltZTsKLQl9CisgIHZvaWQgU2V0UnVudGltZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsgbV9wUnVudGltZSA9IHBSdW50aW1lOyB9CiAKLQlDSlNfUnVudGltZSogR2V0UnVudGltZSgpIGNvbnN0Ci0JewotCQlyZXR1cm4gbV9wUnVudGltZTsKLQl9CisgIENKU19SdW50aW1lKiBHZXRSdW50aW1lKCkgY29uc3QgeyByZXR1cm4gbV9wUnVudGltZTsgfQogCi0Jdm9pZCBTZXRKU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpCi0JewotCQltX3N3SlNjcmlwdCA9IHNjcmlwdDsKLQl9CisgIHZvaWQgU2V0SlNjcmlwdChjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KSB7IG1fc3dKU2NyaXB0ID0gc2NyaXB0OyB9CiAKLQlDRlhfV2lkZVN0cmluZyBHZXRKU2NyaXB0KCkgY29uc3QKLQl7Ci0JCXJldHVybiBtX3N3SlNjcmlwdDsKLQl9CisgIENGWF9XaWRlU3RyaW5nIEdldEpTY3JpcHQoKSBjb25zdCB7IHJldHVybiBtX3N3SlNjcmlwdDsgfQogCi0Jc3RhdGljIHZvaWQgVGltZXJQcm9jKGludCBpZEV2ZW50KQotCXsKLQkJaWYgKENKU19UaW1lciAqIHBUaW1lciA9IEdldFRpbWVNYXAoKS5HZXRBdChpZEV2ZW50KSkKLQkJewotCQkJaWYgKCFwVGltZXItPm1fYlByb2Nlc3NpbmcpCi0JCQl7Ci0JCQkJcFRpbWVyLT5tX2JQcm9jZXNzaW5nID0gVFJVRTsKLQkJCQlpZiAocFRpbWVyLT5tX3BFbWJlZE9iaikgcFRpbWVyLT5tX3BFbWJlZE9iai0+VGltZXJQcm9jKHBUaW1lcik7Ci0JCQkJcFRpbWVyLT5tX2JQcm9jZXNzaW5nID0gRkFMU0U7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkvLwlUUkFDRShMIkJVU1khXG4iKTsKLQkJCX0KLQkJfQotCX07CisgIHN0YXRpYyB2b2lkIFRpbWVyUHJvYyhpbnQgaWRFdmVudCkgeworICAgIGlmIChDSlNfVGltZXIqIHBUaW1lciA9IEdldFRpbWVNYXAoKS5HZXRBdChpZEV2ZW50KSkgeworICAgICAgaWYgKCFwVGltZXItPm1fYlByb2Nlc3NpbmcpIHsKKyAgICAgICAgcFRpbWVyLT5tX2JQcm9jZXNzaW5nID0gVFJVRTsKKyAgICAgICAgaWYgKHBUaW1lci0+bV9wRW1iZWRPYmopCisgICAgICAgICAgcFRpbWVyLT5tX3BFbWJlZE9iai0+VGltZXJQcm9jKHBUaW1lcik7CisgICAgICAgIHBUaW1lci0+bV9iUHJvY2Vzc2luZyA9IEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8JVFJBQ0UoTCJCVVNZIVxuIik7CisgICAgICB9CisgICAgfQorICB9OwogCi1wcml2YXRlOgotCUZYX1VJTlQJCQkJCQkJbV9uVGltZXJJRDsKLQlDSlNfRW1iZWRPYmoqCQkJCQltX3BFbWJlZE9iajsKLQlGWF9CT09MCQkJCQkJCW1fYlByb2Nlc3Npbmc7CisgcHJpdmF0ZToKKyAgRlhfVUlOVCBtX25UaW1lcklEOworICBDSlNfRW1iZWRPYmoqIG1fcEVtYmVkT2JqOworICBGWF9CT09MIG1fYlByb2Nlc3Npbmc7CiAKLQkvL2RhdGEKLQlGWF9EV09SRAkJCQkJCW1fZHdTdGFydFRpbWU7Ci0JRlhfRFdPUkQJCQkJCQltX2R3VGltZU91dDsKLQlGWF9EV09SRAkJCQkJCW1fZHdFbGFwc2U7Ci0JQ0pTX1J1bnRpbWUqCQkJCQltX3BSdW50aW1lOwotCUNGWF9XaWRlU3RyaW5nCQkJCQltX3N3SlNjcmlwdDsKLQlpbnQJCQkJCQkJCW1fblR5cGU7IC8vMDpJbnRlcnZhbDsgMTpUaW1lT3V0CisgIC8vIGRhdGEKKyAgRlhfRFdPUkQgbV9kd1N0YXJ0VGltZTsKKyAgRlhfRFdPUkQgbV9kd1RpbWVPdXQ7CisgIEZYX0RXT1JEIG1fZHdFbGFwc2U7CisgIENKU19SdW50aW1lKiBtX3BSdW50aW1lOworICBDRlhfV2lkZVN0cmluZyBtX3N3SlNjcmlwdDsKKyAgaW50IG1fblR5cGU7ICAvLyAwOkludGVydmFsOyAxOlRpbWVPdXQKIAotCUNQREZEb2NfRW52aXJvbm1lbnQqCQkJbV9wQXBwOworICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX09CSkVDVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oCmluZGV4IDIwZDdkNjMuLjFmYjAzNDggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgKQEAgLTE2LDYzICsxNiw2NSBAQAogY2xhc3MgQ0pTX0NvbnRleHQ7CiAKIGNsYXNzIENKU19BcnJheUJ1ZmZlckFsbG9jYXRvciA6IHB1YmxpYyB2ODo6QXJyYXlCdWZmZXI6OkFsbG9jYXRvciB7Ci0gICAgdm9pZCogQWxsb2NhdGUoc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCogQWxsb2NhdGVVbmluaXRpYWxpemVkKHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlOwotICAgIHZvaWQgRnJlZSh2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSBvdmVycmlkZTsKKyAgdm9pZCogQWxsb2NhdGUoc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGU7CisgIHZvaWQqIEFsbG9jYXRlVW5pbml0aWFsaXplZChzaXplX3QgbGVuZ3RoKSBvdmVycmlkZTsKKyAgdm9pZCBGcmVlKHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlOwogfTsKIAotY2xhc3MgQ0pTX0ZpZWxkRXZlbnQKLXsKLXB1YmxpYzoKLQlDRlhfV2lkZVN0cmluZwkJc1RhcmdldE5hbWU7Ci0JSlNfRVZFTlRfVAkJCWVFdmVudFR5cGU7Ci0JQ0pTX0ZpZWxkRXZlbnQqCQlwTmV4dDsKK2NsYXNzIENKU19GaWVsZEV2ZW50IHsKKyBwdWJsaWM6CisgIENGWF9XaWRlU3RyaW5nIHNUYXJnZXROYW1lOworICBKU19FVkVOVF9UIGVFdmVudFR5cGU7CisgIENKU19GaWVsZEV2ZW50KiBwTmV4dDsKIH07CiAKLWNsYXNzIENKU19SdW50aW1lIDogcHVibGljIElGWEpTX1J1bnRpbWUKLXsKLXB1YmxpYzoKLQlDSlNfUnVudGltZShDUERGRG9jX0Vudmlyb25tZW50ICogcEFwcCk7Ci0JdmlydHVhbCB+Q0pTX1J1bnRpbWUoKTsKK2NsYXNzIENKU19SdW50aW1lIDogcHVibGljIElGWEpTX1J1bnRpbWUgeworIHB1YmxpYzoKKyAgQ0pTX1J1bnRpbWUoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7CisgIHZpcnR1YWwgfkNKU19SdW50aW1lKCk7CiAKLQl2aXJ0dWFsIElGWEpTX0NvbnRleHQgKgkJCQkJTmV3Q29udGV4dCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlSZWxlYXNlQ29udGV4dChJRlhKU19Db250ZXh0ICogcENvbnRleHQpOwotCXZpcnR1YWwgSUZYSlNfQ29udGV4dCoJCQkJCUdldEN1cnJlbnRDb250ZXh0KCk7CisgIHZpcnR1YWwgSUZYSlNfQ29udGV4dCogTmV3Q29udGV4dCgpOworICB2aXJ0dWFsIHZvaWQgUmVsZWFzZUNvbnRleHQoSUZYSlNfQ29udGV4dCogcENvbnRleHQpOworICB2aXJ0dWFsIElGWEpTX0NvbnRleHQqIEdldEN1cnJlbnRDb250ZXh0KCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UmVhZGVyRG9jdW1lbnQoQ1BERlNES19Eb2N1bWVudCAqcFJlYWRlckRvYyk7Ci0JdmlydHVhbCBDUERGU0RLX0RvY3VtZW50ICoJCQkJR2V0UmVhZGVyRG9jdW1lbnQoKXtyZXR1cm4gbV9wRG9jdW1lbnQ7fQorICB2aXJ0dWFsIHZvaWQgU2V0UmVhZGVyRG9jdW1lbnQoQ1BERlNES19Eb2N1bWVudCogcFJlYWRlckRvYyk7CisgIHZpcnR1YWwgQ1BERlNES19Eb2N1bWVudCogR2V0UmVhZGVyRG9jdW1lbnQoKSB7IHJldHVybiBtX3BEb2N1bWVudDsgfQogCi0JQ1BERkRvY19FbnZpcm9ubWVudCAqCQkJCQlHZXRSZWFkZXJBcHAoKXtyZXR1cm4gbV9wQXBwO30KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogR2V0UmVhZGVyQXBwKCkgeyByZXR1cm4gbV9wQXBwOyB9CiAKLQlGWF9CT09MCQkJCQkJCQkJSW5pdEpTT2JqZWN0cygpOworICBGWF9CT09MIEluaXRKU09iamVjdHMoKTsKIAotCUZYX0JPT0wJCQkJCQkJCQlBZGRFdmVudFRvTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSk7Ci0Jdm9pZAkJCQkJCQkJCVJlbW92ZUV2ZW50SW5Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwgSlNfRVZFTlRfVCBlRXZlbnRUeXBlKTsKLQl2b2lkCQkJCQkJCQkJUmVtb3ZlRXZlbnRzSW5Mb29wKENKU19GaWVsZEV2ZW50KiBwU3RhcnQpOworICBGWF9CT09MIEFkZEV2ZW50VG9Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBKU19FVkVOVF9UIGVFdmVudFR5cGUpOworICB2b2lkIFJlbW92ZUV2ZW50SW5Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBKU19FVkVOVF9UIGVFdmVudFR5cGUpOworICB2b2lkIFJlbW92ZUV2ZW50c0luTG9vcChDSlNfRmllbGRFdmVudCogcFN0YXJ0KTsKIAotCXZvaWQJCQkJCQkJCQlCZWdpbkJsb2NrKCl7bV9iQmxvY2tpbmcgPSBUUlVFO30KLQl2b2lkCQkJCQkJCQkJRW5kQmxvY2soKXttX2JCbG9ja2luZyA9IEZBTFNFO30KLQlGWF9CT09MCQkJCQkJCQkJSXNCbG9ja2luZygpe3JldHVybiBtX2JCbG9ja2luZzt9CisgIHZvaWQgQmVnaW5CbG9jaygpIHsgbV9iQmxvY2tpbmcgPSBUUlVFOyB9CisgIHZvaWQgRW5kQmxvY2soKSB7IG1fYkJsb2NraW5nID0gRkFMU0U7IH0KKyAgRlhfQk9PTCBJc0Jsb2NraW5nKCkgeyByZXR1cm4gbV9iQmxvY2tpbmc7IH0KIAotCW9wZXJhdG9yCQkJCQkJCQlJSlNfUnVudGltZSooKSB7cmV0dXJuIChJSlNfUnVudGltZSopbV9pc29sYXRlO30KLQl2ODo6SXNvbGF0ZSoJCQkJCQkJR2V0SXNvbGF0ZSgpe3JldHVybiBtX2lzb2xhdGU7fTsKLQl2b2lkCQkJCQkJCQkJU2V0SXNvbGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSl7bV9pc29sYXRlID0gaXNvbGF0ZTt9CisgIG9wZXJhdG9yIElKU19SdW50aW1lKigpIHsgcmV0dXJuIChJSlNfUnVudGltZSopbV9pc29sYXRlOyB9CisgIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkgeyByZXR1cm4gbV9pc29sYXRlOyB9OworICB2b2lkIFNldElzb2xhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUpIHsgbV9pc29sYXRlID0gaXNvbGF0ZTsgfQogCi0Jdjg6OkxvY2FsPHY4OjpDb250ZXh0PgkJCQkJTmV3SlNDb250ZXh0KCk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gTmV3SlNDb250ZXh0KCk7CiAKKyAgdmlydHVhbCBGWF9CT09MIEdldEhWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpOworICB2aXJ0dWFsIEZYX0JPT0wgU2V0SFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7CiAKLQl2aXJ0dWFsCUZYX0JPT0wJCQkJCQkJR2V0SFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpOwotCXZpcnR1YWwJRlhfQk9PTAkJCQkJCQlTZXRIVmFsdWVCeU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7Ci1wcm90ZWN0ZWQ6Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0NvbnRleHQqPgkJbV9Db250ZXh0QXJyYXk7Ci0JQ1BERkRvY19FbnZpcm9ubWVudCoJCQkJCQkJbV9wQXBwOwotCUNQREZTREtfRG9jdW1lbnQqCQkJCQkJbV9wRG9jdW1lbnQ7Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYkJsb2NraW5nOwotCUNKU19GaWVsZEV2ZW50KgkJCQkJCQltX3BGaWVsZEV2ZW50UGF0aDsKKyBwcm90ZWN0ZWQ6CisgIENGWF9BcnJheVRlbXBsYXRlPENKU19Db250ZXh0Kj4gbV9Db250ZXh0QXJyYXk7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEFwcDsKKyAgQ1BERlNES19Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CisgIEZYX0JPT0wgbV9iQmxvY2tpbmc7CisgIENKU19GaWVsZEV2ZW50KiBtX3BGaWVsZEV2ZW50UGF0aDsKIAotCXY4OjpJc29sYXRlKiBtX2lzb2xhdGU7Ci0Jbm9uc3RkOjp1bmlxdWVfcHRyPENKU19BcnJheUJ1ZmZlckFsbG9jYXRvcj4gbV9wQXJyYXlCdWZmZXJBbGxvY2F0b3I7Ci0Jdjg6Okdsb2JhbDx2ODo6Q29udGV4dD4gbV9jb250ZXh0OworICB2ODo6SXNvbGF0ZSogbV9pc29sYXRlOworICBub25zdGQ6OnVuaXF1ZV9wdHI8Q0pTX0FycmF5QnVmZmVyQWxsb2NhdG9yPiBtX3BBcnJheUJ1ZmZlckFsbG9jYXRvcjsKKyAgdjg6Okdsb2JhbDx2ODo6Q29udGV4dD4gbV9jb250ZXh0OwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KU19SVU5USU1FX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaAppbmRleCA2MTg2ODE3Li4xNjA2ZmI1IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgKQEAgLTE1LDE3NSArMTUsMTc5IEBACiBjbGFzcyBDSlNfRG9jdW1lbnQ7CiBjbGFzcyBDSlNfT2JqZWN0OwogCi1jbGFzcyBDSlNfVmFsdWUKLXsKLXB1YmxpYzoKLQlDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUpOwotCUNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlLEZYSlNWQUxVRVRZUEUgdCk7Ci0JQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBpbnQgJmlWYWx1ZSk7Ci0JQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBkb3VibGUgJmRWYWx1ZSk7Ci0JQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBmbG9hdCAmZlZhbHVlKTsKLQlDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IGJvb2wgJmJWYWx1ZSk7Ci0JQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBKU0ZYT2JqZWN0KTsKLQlDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19PYmplY3QqKTsKLSAgIAlDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19Eb2N1bWVudCopOwotCUNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3QgRlhfQ0hBUiogcFN0cik7Ci0JQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBGWF9XQ0hBUiogcFdzdHIpOwotCUNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgQ0pTX0FycmF5JiBhcnJheSk7CitjbGFzcyBDSlNfVmFsdWUgeworIHB1YmxpYzoKKyAgQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlKTsKKyAgQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUsIEZYSlNWQUxVRVRZUEUgdCk7CisgIENKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3QgaW50JiBpVmFsdWUpOworICBDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IGRvdWJsZSYgZFZhbHVlKTsKKyAgQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBmbG9hdCYgZlZhbHVlKTsKKyAgQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBib29sJiBiVmFsdWUpOworICBDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIEpTRlhPYmplY3QpOworICBDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19PYmplY3QqKTsKKyAgQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBDSlNfRG9jdW1lbnQqKTsKKyAgQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBGWF9DSEFSKiBwU3RyKTsKKyAgQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBGWF9XQ0hBUiogcFdzdHIpOworICBDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19BcnJheSYgYXJyYXkpOwogCi0JfkNKU19WYWx1ZSgpOworICB+Q0pTX1ZhbHVlKCk7CiAKLQl2b2lkIFNldE51bGwoKTsKLSAgICB2b2lkIEF0dGFjaCh2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUsRlhKU1ZBTFVFVFlQRSB0KTsKLQl2b2lkIEF0dGFjaChDSlNfVmFsdWUgKnBWYWx1ZSk7Ci0Jdm9pZCBEZXRhY2goKTsKKyAgdm9pZCBTZXROdWxsKCk7CisgIHZvaWQgQXR0YWNoKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSwgRlhKU1ZBTFVFVFlQRSB0KTsKKyAgdm9pZCBBdHRhY2goQ0pTX1ZhbHVlKiBwVmFsdWUpOworICB2b2lkIERldGFjaCgpOwogCisgIGludCBUb0ludCgpIGNvbnN0OworICBib29sIFRvQm9vbCgpIGNvbnN0OworICBkb3VibGUgVG9Eb3VibGUoKSBjb25zdDsKKyAgZmxvYXQgVG9GbG9hdCgpIGNvbnN0OworICBDSlNfT2JqZWN0KiBUb0NKU09iamVjdCgpIGNvbnN0OworICBDRlhfV2lkZVN0cmluZyBUb0NGWFdpZGVTdHJpbmcoKSBjb25zdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgVG9DRlhCeXRlU3RyaW5nKCkgY29uc3Q7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBUb1Y4T2JqZWN0KCkgY29uc3Q7CisgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IFRvVjhBcnJheSgpIGNvbnN0OworICB2ODo6TG9jYWw8djg6OlZhbHVlPiBUb1Y4VmFsdWUoKSBjb25zdDsKIAotCWludCBUb0ludCgpIGNvbnN0OwotCWJvb2wgVG9Cb29sKCkgY29uc3Q7Ci0JZG91YmxlIFRvRG91YmxlKCkgY29uc3Q7Ci0JZmxvYXQgIFRvRmxvYXQoKSBjb25zdDsKLQlDSlNfT2JqZWN0KiBUb0NKU09iamVjdCgpIGNvbnN0OwotCUNGWF9XaWRlU3RyaW5nIFRvQ0ZYV2lkZVN0cmluZygpIGNvbnN0OwotCUNGWF9CeXRlU3RyaW5nIFRvQ0ZYQnl0ZVN0cmluZygpIGNvbnN0OwotCXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBUb1Y4T2JqZWN0KCkgY29uc3Q7Ci0Jdjg6OkxvY2FsPHY4OjpBcnJheT4gVG9WOEFycmF5KCkgY29uc3Q7Ci0Jdjg6OkxvY2FsPHY4OjpWYWx1ZT4gVG9WOFZhbHVlKCkgY29uc3Q7CisgIHZvaWQgb3BlcmF0b3I9KGludCBpVmFsdWUpOworICB2b2lkIG9wZXJhdG9yPShib29sIGJWYWx1ZSk7CisgIHZvaWQgb3BlcmF0b3I9KGRvdWJsZSk7CisgIHZvaWQgb3BlcmF0b3I9KGZsb2F0KTsKKyAgdm9pZCBvcGVyYXRvcj0oQ0pTX09iamVjdCopOworICB2b2lkIG9wZXJhdG9yPShDSlNfRG9jdW1lbnQqKTsKKyAgdm9pZCBvcGVyYXRvcj0odjg6OkxvY2FsPHY4OjpPYmplY3Q+KTsKKyAgdm9pZCBvcGVyYXRvcj0oQ0pTX0FycmF5Jik7CisgIHZvaWQgb3BlcmF0b3I9KENKU19EYXRlJik7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEZYX1dDSEFSKiBwV3N0cik7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEZYX0NIQVIqIHBTdHIpOworICB2b2lkIG9wZXJhdG9yPShDSlNfVmFsdWUgdmFsdWUpOwogCi0Jdm9pZCBvcGVyYXRvciA9IChpbnQgaVZhbHVlKTsKLQl2b2lkIG9wZXJhdG9yID0gKGJvb2wgYlZhbHVlKTsKLQl2b2lkIG9wZXJhdG9yID0gKGRvdWJsZSk7Ci0Jdm9pZCBvcGVyYXRvciA9IChmbG9hdCk7Ci0Jdm9pZCBvcGVyYXRvciA9IChDSlNfT2JqZWN0Kik7Ci0Jdm9pZCBvcGVyYXRvciA9IChDSlNfRG9jdW1lbnQqKTsKLQl2b2lkIG9wZXJhdG9yID0gKHY4OjpMb2NhbDx2ODo6T2JqZWN0Pik7Ci0Jdm9pZCBvcGVyYXRvciA9IChDSlNfQXJyYXkgJik7Ci0Jdm9pZCBvcGVyYXRvciA9IChDSlNfRGF0ZSAmKTsKLQl2b2lkIG9wZXJhdG9yID0gKGNvbnN0IEZYX1dDSEFSKiBwV3N0cik7Ci0Jdm9pZCBvcGVyYXRvciA9IChjb25zdCBGWF9DSEFSKiBwU3RyKTsKLQl2b2lkIG9wZXJhdG9yID0gKENKU19WYWx1ZSB2YWx1ZSk7CisgIEZYX0JPT0wgSXNBcnJheU9iamVjdCgpIGNvbnN0OworICBGWF9CT09MIElzRGF0ZU9iamVjdCgpIGNvbnN0OworICBGWEpTVkFMVUVUWVBFIEdldFR5cGUoKSBjb25zdDsKIAotCUZYX0JPT0wgSXNBcnJheU9iamVjdCgpIGNvbnN0OwotCUZYX0JPT0wJSXNEYXRlT2JqZWN0KCkgY29uc3Q7Ci0JRlhKU1ZBTFVFVFlQRSBHZXRUeXBlKCkgY29uc3Q7CisgIEZYX0JPT0wgQ29udmVydFRvQXJyYXkoQ0pTX0FycmF5JikgY29uc3Q7CisgIEZYX0JPT0wgQ29udmVydFRvRGF0ZShDSlNfRGF0ZSYpIGNvbnN0OwogCi0JRlhfQk9PTCBDb252ZXJ0VG9BcnJheShDSlNfQXJyYXkgJikgY29uc3Q7Ci0JRlhfQk9PTCBDb252ZXJ0VG9EYXRlKENKU19EYXRlICYpIGNvbnN0OworICB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIHsgcmV0dXJuIG1faXNvbGF0ZTsgfQogCi0Jdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoKSB7cmV0dXJuIG1faXNvbGF0ZTt9Ci1wcm90ZWN0ZWQ6Ci0Jdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbV9wVmFsdWU7Ci0JRlhKU1ZBTFVFVFlQRSBtX2VUeXBlOwotCXY4OjpJc29sYXRlKiBtX2lzb2xhdGU7CisgcHJvdGVjdGVkOgorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBtX3BWYWx1ZTsKKyAgRlhKU1ZBTFVFVFlQRSBtX2VUeXBlOworICB2ODo6SXNvbGF0ZSogbV9pc29sYXRlOwogfTsKIAotY2xhc3MgQ0pTX1BhcmFtZXRlcnMgOiBwdWJsaWMgQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX1ZhbHVlPgotewotcHVibGljOgotCXZvaWQgcHVzaF9iYWNrKGNvbnN0IENKU19WYWx1ZSYgbmV3RWxlbWVudCkgewotCQlDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfVmFsdWU+OjpBZGQobmV3RWxlbWVudCk7Ci0JfQotCWludCBzaXplKCkgY29uc3QgewotCQlyZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX1ZhbHVlPjo6R2V0U2l6ZSgpOwotCX0KK2NsYXNzIENKU19QYXJhbWV0ZXJzIDogcHVibGljIENGWF9BcnJheVRlbXBsYXRlPENKU19WYWx1ZT4geworIHB1YmxpYzoKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgQ0pTX1ZhbHVlJiBuZXdFbGVtZW50KSB7CisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX1ZhbHVlPjo6QWRkKG5ld0VsZW1lbnQpOworICB9CisgIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX1ZhbHVlPjo6R2V0U2l6ZSgpOyB9CiB9OwogCi1jbGFzcyBDSlNfUHJvcFZhbHVlOiBwdWJsaWMgQ0pTX1ZhbHVlCi17Ci1wdWJsaWM6Ci0JQ0pTX1Byb3BWYWx1ZShjb25zdCBDSlNfVmFsdWUmKTsKLQlDSlNfUHJvcFZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlKTsKLQl+Q0pTX1Byb3BWYWx1ZSgpOwotcHVibGljOgotCUZYX0JPT0wgSXNTZXR0aW5nKCk7Ci0JRlhfQk9PTCBJc0dldHRpbmcoKTsKLQl2b2lkIG9wZXJhdG9yPDwoaW50KTsKLQl2b2lkIG9wZXJhdG9yPj4oaW50JikgY29uc3Q7Ci0Jdm9pZCBvcGVyYXRvcjw8KGJvb2wpOwotCXZvaWQgb3BlcmF0b3I+Pihib29sJikgY29uc3Q7Ci0Jdm9pZCBvcGVyYXRvcjw8KGRvdWJsZSk7Ci0Jdm9pZCBvcGVyYXRvcj4+KGRvdWJsZSYpIGNvbnN0OwotCXZvaWQgb3BlcmF0b3I8PChDSlNfT2JqZWN0KiBwT2JqKTsKLQl2b2lkIG9wZXJhdG9yPj4oQ0pTX09iamVjdComIHBwT2JqKSBjb25zdDsKLQl2b2lkIG9wZXJhdG9yPDwoQ0pTX0RvY3VtZW50KiBwSnNEb2MpOwotCXZvaWQgb3BlcmF0b3I+PihDSlNfRG9jdW1lbnQqJiBwcEpzRG9jKSBjb25zdDsKLQl2b2lkIG9wZXJhdG9yPDwoQ0ZYX0J5dGVTdHJpbmcpOwotCXZvaWQgb3BlcmF0b3I+PihDRlhfQnl0ZVN0cmluZyYpIGNvbnN0OwotCXZvaWQgb3BlcmF0b3I8PChDRlhfV2lkZVN0cmluZyk7Ci0Jdm9pZCBvcGVyYXRvcj4+KENGWF9XaWRlU3RyaW5nJikgY29uc3Q7Ci0Jdm9pZCBvcGVyYXRvcjw8KGNvbnN0IEZYX1dDSEFSKiBjX3N0cmluZyk7Ci0Jdm9pZCBvcGVyYXRvcjw8KEpTRlhPYmplY3QpOwotCXZvaWQgb3BlcmF0b3I+PihKU0ZYT2JqZWN0JikgY29uc3Q7Ci0Jdm9pZCBvcGVyYXRvcj4+KENKU19BcnJheSYgYXJyYXkpIGNvbnN0OwotCXZvaWQgb3BlcmF0b3I8PChDSlNfQXJyYXkmIGFycmF5KTsKLQl2b2lkIG9wZXJhdG9yPDwoQ0pTX0RhdGUmIGRhdGUpOwotCXZvaWQgb3BlcmF0b3I+PihDSlNfRGF0ZSYgZGF0ZSkgY29uc3Q7Ci0Jb3BlcmF0b3Igdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKSBjb25zdDsKLQl2b2lkIFN0YXJ0U2V0dGluZygpOwotCXZvaWQgU3RhcnRHZXR0aW5nKCk7Ci1wcml2YXRlOgotCUZYX0JPT0wgbV9iSXNTZXR0aW5nOworY2xhc3MgQ0pTX1Byb3BWYWx1ZSA6IHB1YmxpYyBDSlNfVmFsdWUgeworIHB1YmxpYzoKKyAgQ0pTX1Byb3BWYWx1ZShjb25zdCBDSlNfVmFsdWUmKTsKKyAgQ0pTX1Byb3BWYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSk7CisgIH5DSlNfUHJvcFZhbHVlKCk7CisKKyBwdWJsaWM6CisgIEZYX0JPT0wgSXNTZXR0aW5nKCk7CisgIEZYX0JPT0wgSXNHZXR0aW5nKCk7CisgIHZvaWQgb3BlcmF0b3I8PChpbnQpOworICB2b2lkIG9wZXJhdG9yPj4oaW50JikgY29uc3Q7CisgIHZvaWQgb3BlcmF0b3I8PChib29sKTsKKyAgdm9pZCBvcGVyYXRvcj4+KGJvb2wmKSBjb25zdDsKKyAgdm9pZCBvcGVyYXRvcjw8KGRvdWJsZSk7CisgIHZvaWQgb3BlcmF0b3I+Pihkb3VibGUmKSBjb25zdDsKKyAgdm9pZCBvcGVyYXRvcjw8KENKU19PYmplY3QqIHBPYmopOworICB2b2lkIG9wZXJhdG9yPj4oQ0pTX09iamVjdComIHBwT2JqKSBjb25zdDsKKyAgdm9pZCBvcGVyYXRvcjw8KENKU19Eb2N1bWVudCogcEpzRG9jKTsKKyAgdm9pZCBvcGVyYXRvcj4+KENKU19Eb2N1bWVudComIHBwSnNEb2MpIGNvbnN0OworICB2b2lkIG9wZXJhdG9yPDwoQ0ZYX0J5dGVTdHJpbmcpOworICB2b2lkIG9wZXJhdG9yPj4oQ0ZYX0J5dGVTdHJpbmcmKSBjb25zdDsKKyAgdm9pZCBvcGVyYXRvcjw8KENGWF9XaWRlU3RyaW5nKTsKKyAgdm9pZCBvcGVyYXRvcj4+KENGWF9XaWRlU3RyaW5nJikgY29uc3Q7CisgIHZvaWQgb3BlcmF0b3I8PChjb25zdCBGWF9XQ0hBUiogY19zdHJpbmcpOworICB2b2lkIG9wZXJhdG9yPDwoSlNGWE9iamVjdCk7CisgIHZvaWQgb3BlcmF0b3I+PihKU0ZYT2JqZWN0JikgY29uc3Q7CisgIHZvaWQgb3BlcmF0b3I+PihDSlNfQXJyYXkmIGFycmF5KSBjb25zdDsKKyAgdm9pZCBvcGVyYXRvcjw8KENKU19BcnJheSYgYXJyYXkpOworICB2b2lkIG9wZXJhdG9yPDwoQ0pTX0RhdGUmIGRhdGUpOworICB2b2lkIG9wZXJhdG9yPj4oQ0pTX0RhdGUmIGRhdGUpIGNvbnN0OworICBvcGVyYXRvciB2ODo6TG9jYWw8djg6OlZhbHVlPigpIGNvbnN0OworICB2b2lkIFN0YXJ0U2V0dGluZygpOworICB2b2lkIFN0YXJ0R2V0dGluZygpOworCisgcHJpdmF0ZToKKyAgRlhfQk9PTCBtX2JJc1NldHRpbmc7CiB9OwogCi1jbGFzcyBDSlNfQXJyYXkKLXsKLXB1YmxpYzoKLQlDSlNfQXJyYXkodjg6Oklzb2xhdGUqIGlzb2xhdGUpOwotCXZpcnR1YWwgfkNKU19BcnJheSgpOworY2xhc3MgQ0pTX0FycmF5IHsKKyBwdWJsaWM6CisgIENKU19BcnJheSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSk7CisgIHZpcnR1YWwgfkNKU19BcnJheSgpOwogCi0Jdm9pZCBBdHRhY2godjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5KTsKLQl2b2lkIEdldEVsZW1lbnQodW5zaWduZWQgaW5kZXgsQ0pTX1ZhbHVlICZ2YWx1ZSk7Ci0Jdm9pZCBTZXRFbGVtZW50KHVuc2lnbmVkIGluZGV4LENKU19WYWx1ZSB2YWx1ZSk7Ci0gICAgaW50IEdldExlbmd0aCgpOwotCUZYX0JPT0wgSXNBdHRhY2hlZCgpOwotCW9wZXJhdG9yIHY4OjpMb2NhbDx2ODo6QXJyYXk+KCk7CisgIHZvaWQgQXR0YWNoKHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSk7CisgIHZvaWQgR2V0RWxlbWVudCh1bnNpZ25lZCBpbmRleCwgQ0pTX1ZhbHVlJiB2YWx1ZSk7CisgIHZvaWQgU2V0RWxlbWVudCh1bnNpZ25lZCBpbmRleCwgQ0pTX1ZhbHVlIHZhbHVlKTsKKyAgaW50IEdldExlbmd0aCgpOworICBGWF9CT09MIElzQXR0YWNoZWQoKTsKKyAgb3BlcmF0b3Igdjg6OkxvY2FsPHY4OjpBcnJheT4oKTsKIAotCXY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkge3JldHVybiBtX2lzb2xhdGU7fQotcHJpdmF0ZToKLQl2ODo6TG9jYWw8djg6OkFycmF5PiBtX3BBcnJheTsKLQl2ODo6SXNvbGF0ZSogbV9pc29sYXRlOworICB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIHsgcmV0dXJuIG1faXNvbGF0ZTsgfQorCisgcHJpdmF0ZToKKyAgdjg6OkxvY2FsPHY4OjpBcnJheT4gbV9wQXJyYXk7CisgIHY4OjpJc29sYXRlKiBtX2lzb2xhdGU7CiB9OwogCi1jbGFzcyBDSlNfRGF0ZQotewotZnJpZW5kIGNsYXNzIENKU19WYWx1ZTsKLXB1YmxpYzoKLQlDSlNfRGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSk7Ci0JQ0pTX0RhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUsZG91YmxlIGRNc2VjX3RpbWUpOwotCUNKU19EYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlLGludCB5ZWFyLCBpbnQgbW9uLCBpbnQgZGF5LGludCBob3VyLCBpbnQgbWluLCBpbnQgc2VjKTsKLQl2aXJ0dWFsIH5DSlNfRGF0ZSgpOwotCXZvaWQgQXR0YWNoKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBEYXRlKTsKK2NsYXNzIENKU19EYXRlIHsKKyAgZnJpZW5kIGNsYXNzIENKU19WYWx1ZTsKIAotCWludCAgICAgR2V0WWVhcigpOwotCXZvaWQgICAgU2V0WWVhcihpbnQgaVllYXIpOworIHB1YmxpYzoKKyAgQ0pTX0RhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUpOworICBDSlNfRGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgZG91YmxlIGRNc2VjX3RpbWUpOworICBDSlNfRGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwKKyAgICAgICAgICAgaW50IHllYXIsCisgICAgICAgICAgIGludCBtb24sCisgICAgICAgICAgIGludCBkYXksCisgICAgICAgICAgIGludCBob3VyLAorICAgICAgICAgICBpbnQgbWluLAorICAgICAgICAgICBpbnQgc2VjKTsKKyAgdmlydHVhbCB+Q0pTX0RhdGUoKTsKKyAgdm9pZCBBdHRhY2godjg6OkxvY2FsPHY4OjpWYWx1ZT4gcERhdGUpOwogCi0JaW50ICAgICBHZXRNb250aCgpOwotCXZvaWQgICAgU2V0TW9udGgoaW50IGlNb250aCk7CisgIGludCBHZXRZZWFyKCk7CisgIHZvaWQgU2V0WWVhcihpbnQgaVllYXIpOwogCi0JaW50ICAgICBHZXREYXkoKTsKLQl2b2lkICAgIFNldERheShpbnQgaURheSk7CisgIGludCBHZXRNb250aCgpOworICB2b2lkIFNldE1vbnRoKGludCBpTW9udGgpOwogCi0JaW50ICAgICBHZXRIb3VycygpOwotCXZvaWQgICAgU2V0SG91cnMoaW50IGlIb3Vycyk7CisgIGludCBHZXREYXkoKTsKKyAgdm9pZCBTZXREYXkoaW50IGlEYXkpOwogCi0JaW50ICAgICBHZXRNaW51dGVzKCk7Ci0Jdm9pZCAgICBTZXRNaW51dGVzKGludCBtaW51dGVzKTsKKyAgaW50IEdldEhvdXJzKCk7CisgIHZvaWQgU2V0SG91cnMoaW50IGlIb3Vycyk7CiAKLQlpbnQgICAgIEdldFNlY29uZHMoKTsKLQl2b2lkICAgIFNldFNlY29uZHMoaW50IHNlY29uZHMpOworICBpbnQgR2V0TWludXRlcygpOworICB2b2lkIFNldE1pbnV0ZXMoaW50IG1pbnV0ZXMpOwogCi0Jb3BlcmF0b3Igdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKLQlvcGVyYXRvciBkb3VibGUoKSBjb25zdDsKKyAgaW50IEdldFNlY29uZHMoKTsKKyAgdm9pZCBTZXRTZWNvbmRzKGludCBzZWNvbmRzKTsKIAotCUNGWF9XaWRlU3RyaW5nCVRvU3RyaW5nKCkgY29uc3Q7CisgIG9wZXJhdG9yIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgIG9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0OwogCi0Jc3RhdGljIGRvdWJsZQlNYWtlRGF0ZShpbnQgeWVhciwgaW50IG1vbiwgaW50IG1kYXksaW50IGhvdXIsIGludCBtaW4sIGludCBzZWMsaW50IG1zKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgVG9TdHJpbmcoKSBjb25zdDsKIAotCUZYX0JPT0wJSXNWYWxpZERhdGUoKTsKKyAgc3RhdGljIGRvdWJsZQorICBNYWtlRGF0ZShpbnQgeWVhciwgaW50IG1vbiwgaW50IG1kYXksIGludCBob3VyLCBpbnQgbWluLCBpbnQgc2VjLCBpbnQgbXMpOwogCi1wcm90ZWN0ZWQ6Ci0Jdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbV9wRGF0ZTsKLQl2ODo6SXNvbGF0ZSogbV9pc29sYXRlOworICBGWF9CT09MIElzVmFsaWREYXRlKCk7CisKKyBwcm90ZWN0ZWQ6CisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IG1fcERhdGU7CisgIHY4OjpJc29sYXRlKiBtX2lzb2xhdGU7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgKaW5kZXggY2ZmOWUxMS4uYzVkNWVhNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaApAQCAtOSw5NSArOSwxNzcgQEAKIAogI2luY2x1ZGUgIkpTX0RlZmluZS5oIgogCi1jbGFzcyBDSlNfUHVibGljTWV0aG9kcyA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX1B1YmxpY01ldGhvZHMoSlNGWE9iamVjdCAgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19QdWJsaWNNZXRob2RzKHZvaWQpe307CitjbGFzcyBDSlNfUHVibGljTWV0aG9kcyA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19QdWJsaWNNZXRob2RzKEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3Qpe307CisgIHZpcnR1YWwgfkNKU19QdWJsaWNNZXRob2RzKHZvaWQpe307CiAKLXB1YmxpYzoKLQlzdGF0aWMgRlhfQk9PTCBBRk51bWJlcl9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRkRhdGVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZEYXRlX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGRGF0ZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZEYXRlX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlRpbWVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7IC8vCi0Jc3RhdGljIEZYX0JPT0wgQUZUaW1lX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZUaW1lX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlNwZWNpYWxfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGU3BlY2lhbF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZTcGVjaWFsX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOy8vCi0Jc3RhdGljIEZYX0JPT0wgQUZTaW1wbGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZNYWtlTnVtYmVyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGU2ltcGxlX0NhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRkV4dHJhY3ROdW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworIHB1YmxpYzoKKyAgc3RhdGljIEZYX0JPT0wgQUZOdW1iZXJfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBzdGF0aWMgRlhfQk9PTCBBRk51bWJlcl9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGUGVyY2VudF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZEYXRlX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBzdGF0aWMgRlhfQk9PTCBBRkRhdGVfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBzdGF0aWMgRlhfQk9PTCBBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBzdGF0aWMgRlhfQk9PTCBBRlRpbWVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7ICAvLworICBzdGF0aWMgRlhfQk9PTCBBRlRpbWVfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGVGltZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGU3BlY2lhbF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGU3BlY2lhbF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGU3BlY2lhbF9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsgIC8vCisgIHN0YXRpYyBGWF9CT09MIEFGU2ltcGxlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBzdGF0aWMgRlhfQk9PTCBBRk1ha2VOdW1iZXIoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGU2ltcGxlX0NhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZSYW5nZV9WYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZNZXJnZUNoYW5nZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZFeHRyYWN0TnVtcyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAotcHVibGljOgotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGTnVtYmVyX0Zvcm1hdCk7Ci0JSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZOdW1iZXJfS2V5c3Ryb2tlKTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlBlcmNlbnRfRm9ybWF0KTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlBlcmNlbnRfS2V5c3Ryb2tlKTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRkRhdGVfRm9ybWF0RXgpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGRGF0ZV9LZXlzdHJva2VFeCk7Ci0JSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZEYXRlX0Zvcm1hdCk7Ci0JSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZEYXRlX0tleXN0cm9rZSk7Ci0JSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZUaW1lX0Zvcm1hdEV4KTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlRpbWVfS2V5c3Ryb2tlRXgpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGVGltZV9Gb3JtYXQpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGVGltZV9LZXlzdHJva2UpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGU3BlY2lhbF9Gb3JtYXQpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGU3BlY2lhbF9LZXlzdHJva2UpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGU3BlY2lhbF9LZXlzdHJva2VFeCk7Ci0JSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZTaW1wbGUpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGTWFrZU51bWJlcik7Ci0JSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZTaW1wbGVfQ2FsY3VsYXRlKTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlJhbmdlX1ZhbGlkYXRlKTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRk1lcmdlQ2hhbmdlKTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlBhcnNlRGF0ZUV4KTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRkV4dHJhY3ROdW1zKTsKKyBwdWJsaWM6CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGTnVtYmVyX0Zvcm1hdCk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGTnVtYmVyX0tleXN0cm9rZSk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGUGVyY2VudF9Gb3JtYXQpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlBlcmNlbnRfS2V5c3Ryb2tlKTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZEYXRlX0Zvcm1hdEV4KTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZEYXRlX0tleXN0cm9rZUV4KTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZEYXRlX0Zvcm1hdCk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGRGF0ZV9LZXlzdHJva2UpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlRpbWVfRm9ybWF0RXgpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlRpbWVfS2V5c3Ryb2tlRXgpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlRpbWVfRm9ybWF0KTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZUaW1lX0tleXN0cm9rZSk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGU3BlY2lhbF9Gb3JtYXQpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlNwZWNpYWxfS2V5c3Ryb2tlKTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZTcGVjaWFsX0tleXN0cm9rZUV4KTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZTaW1wbGUpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRk1ha2VOdW1iZXIpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlNpbXBsZV9DYWxjdWxhdGUpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlJhbmdlX1ZhbGlkYXRlKTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZNZXJnZUNoYW5nZSk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGUGFyc2VEYXRlRXgpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRkV4dHJhY3ROdW1zKTsKIAotCUpTX1NUQVRJQ19ERUNMQVJFX0dMT0JBTF9GVU4oKTsKKyAgSlNfU1RBVElDX0RFQ0xBUkVfR0xPQkFMX0ZVTigpOwogCi1wdWJsaWM6Ci0Jc3RhdGljIGludAkJCQlQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzdHJpbmcsaW50IG5TdGFydCxpbnQgJiBuU2tpcCwgaW50IG5NYXhTdGVwKTsKLQlzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcJUGFyc2VTdHJpbmdTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywgaW50IG5TdGFydCwgaW50JiBuU2tpcCk7Ci0Jc3RhdGljIGRvdWJsZQkJCU1ha2VSZWd1bGFyRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0LCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpOwotCXN0YXRpYyBDRlhfV2lkZVN0cmluZwlNYWtlRm9ybWF0RGF0ZShkb3VibGUgZERhdGUsY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBmb3JtYXQpOwotCXN0YXRpYyBGWF9CT09MCQkJQ29udmVydFN0cmluZ1RvTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwgZG91YmxlICYgZFJldCwgRlhfQk9PTCAmIGJEb3QpOwotCXN0YXRpYyBkb3VibGUJCQlQYXJzZVN0cmluZ1RvTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSk7Ci0Jc3RhdGljIGRvdWJsZQkJCVBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpOwotCXN0YXRpYyBkb3VibGUgICAgICAgICAgIE1ha2VJbnRlckRhdGUoQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUpOwotCXN0YXRpYyBkb3VibGUJCQlQYXJzZU51bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIEZYX0JPT0wmIGJBbGxEaWdpdHMsIEZYX0JPT0wmIGJEb3QsIEZYX0JPT0wmIGJTaWduLCBGWF9CT09MJiBiS1hKUyk7CisgcHVibGljOgorICBzdGF0aWMgaW50IFBhcnNlU3RyaW5nSW50ZWdlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5Ta2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk1heFN0ZXApOworICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgUGFyc2VTdHJpbmdTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5Ta2lwKTsKKyAgc3RhdGljIGRvdWJsZSBNYWtlUmVndWxhckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiV3JvbmdGb3JtYXQpOworICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgTWFrZUZvcm1hdERhdGUoZG91YmxlIGREYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZvcm1hdCk7CisgIHN0YXRpYyBGWF9CT09MIENvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUmIGRSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRG90KTsKKyAgc3RhdGljIGRvdWJsZSBQYXJzZVN0cmluZ1RvTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSk7CisgIHN0YXRpYyBkb3VibGUgUGFyc2VOb3JtYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYldyb25nRm9ybWF0KTsKKyAgc3RhdGljIGRvdWJsZSBNYWtlSW50ZXJEYXRlKENGWF9XaWRlU3RyaW5nIHN0clZhbHVlKTsKKyAgc3RhdGljIGRvdWJsZSBQYXJzZU51bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkFsbERpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJTaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJLWEpTKTsKIAotcHVibGljOgotCXN0YXRpYyBDRlhfV2lkZVN0cmluZwlTdHJMVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cik7Ci0Jc3RhdGljIENGWF9XaWRlU3RyaW5nCVN0clJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKTsKLQlzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcJU3RyVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cik7CisgcHVibGljOgorICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgU3RyTFRyaW0oY29uc3QgRlhfV0NIQVIqIHBTdHIpOworICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgU3RyUlRyaW0oY29uc3QgRlhfV0NIQVIqIHBTdHIpOworICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgU3RyVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cik7CiAKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJU3RyTFRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cik7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCVN0clJUcmltKGNvbnN0IEZYX0NIQVIqIHBTdHIpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwlTdHJUcmltKGNvbnN0IEZYX0NIQVIqIHBTdHIpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgU3RyTFRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cik7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBTdHJSVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIFN0clRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cik7CiAKLQlzdGF0aWMgRlhfQk9PTAkJCUlzTnVtYmVyKGNvbnN0IEZYX0NIQVIqIHN0cmluZyk7Ci0Jc3RhdGljIEZYX0JPT0wJCQlJc051bWJlcihjb25zdCBGWF9XQ0hBUiogc3RyaW5nKTsKKyAgc3RhdGljIEZYX0JPT0wgSXNOdW1iZXIoY29uc3QgRlhfQ0hBUiogc3RyaW5nKTsKKyAgc3RhdGljIEZYX0JPT0wgSXNOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN0cmluZyk7CiAKLQlzdGF0aWMgRlhfQk9PTAkJCUlzRGlnaXQoY2hhciBjaCk7Ci0Jc3RhdGljIEZYX0JPT0wJCQlJc0RpZ2l0KHdjaGFyX3QgY2gpOwotCXN0YXRpYyBGWF9CT09MCQkJSXNBbHBoYWJldGljKHdjaGFyX3QgY2gpOwotCXN0YXRpYyBGWF9CT09MCQkJSXNBbHBoYU51bWVyaWMod2NoYXJfdCBjaCk7CisgIHN0YXRpYyBGWF9CT09MIElzRGlnaXQoY2hhciBjaCk7CisgIHN0YXRpYyBGWF9CT09MIElzRGlnaXQod2NoYXJfdCBjaCk7CisgIHN0YXRpYyBGWF9CT09MIElzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKTsKKyAgc3RhdGljIEZYX0JPT0wgSXNBbHBoYU51bWVyaWMod2NoYXJfdCBjaCk7CiAKLQlzdGF0aWMgRlhfQk9PTAkJCW1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzayk7Ci0Jc3RhdGljIEZYX0JPT0wJCQlpc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCk7CisgIHN0YXRpYyBGWF9CT09MIG1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSwgd2NoYXJfdCBjX01hc2spOworICBzdGF0aWMgRlhfQk9PTCBpc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCk7CiAKLQlzdGF0aWMgZG91YmxlCQkJQUZfU2ltcGxlKGNvbnN0IEZYX1dDSEFSKiBzRnVjdGlvbiwgZG91YmxlIGRWYWx1ZTEsIGRvdWJsZSBkVmFsdWUyKTsKLQlzdGF0aWMgQ0pTX0FycmF5CQlBRl9NYWtlQXJyYXlGcm9tTGlzdCh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgQ0pTX1ZhbHVlIHZhbCk7CisgIHN0YXRpYyBkb3VibGUgQUZfU2ltcGxlKGNvbnN0IEZYX1dDSEFSKiBzRnVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkVmFsdWUyKTsKKyAgc3RhdGljIENKU19BcnJheSBBRl9NYWtlQXJyYXlGcm9tTGlzdCh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgQ0pTX1ZhbHVlIHZhbCk7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX1BVQkxJQ01FVEhPRFNfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2FwcC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvYXBwLmgKaW5kZXggYWM5MGU2Mi4uMjIxYTdjMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvYXBwLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvYXBwLmgKQEAgLTE1LDM1ICsxNSwzMyBAQAogCiBjbGFzcyBDSlNfVGltZXI7CiAKLWNsYXNzIFRpbWVyT2JqIDogcHVibGljIENKU19FbWJlZE9iagotewotcHVibGljOgotCVRpbWVyT2JqKENKU19PYmplY3QqIHBKU09iamVjdCk7Ci0JdmlydHVhbCB+VGltZXJPYmooKTsKK2NsYXNzIFRpbWVyT2JqIDogcHVibGljIENKU19FbWJlZE9iaiB7CisgcHVibGljOgorICBUaW1lck9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOworICB2aXJ0dWFsIH5UaW1lck9iaigpOwogCi1wdWJsaWM6Ci0Jdm9pZAkJCVNldFRpbWVyKENKU19UaW1lciogcFRpbWVyKTsKLQlDSlNfVGltZXIqCQlHZXRUaW1lcigpIGNvbnN0OworIHB1YmxpYzoKKyAgdm9pZCBTZXRUaW1lcihDSlNfVGltZXIqIHBUaW1lcik7CisgIENKU19UaW1lciogR2V0VGltZXIoKSBjb25zdDsKIAotcHJpdmF0ZToKLQlDSlNfVGltZXIqCQltX3BUaW1lcjsKKyBwcml2YXRlOgorICBDSlNfVGltZXIqIG1fcFRpbWVyOwogfTsKIAotY2xhc3MgQ0pTX1RpbWVyT2JqIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfVGltZXJPYmooSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KLQl2aXJ0dWFsIH5DSlNfVGltZXJPYmooKXt9CitjbGFzcyBDSlNfVGltZXJPYmogOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBDSlNfVGltZXJPYmooSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgdmlydHVhbCB+Q0pTX1RpbWVyT2JqKCkge30KIAotCURFQ0xBUkVfSlNfQ0xBU1MoQ0pTX1RpbWVyT2JqKTsKKyAgREVDTEFSRV9KU19DTEFTUyhDSlNfVGltZXJPYmopOwogfTsKIAotCiAvLyBzdHJ1Y3QgQVBQX01FTlVJVEVNX0FSUkFZOwogLy8KIC8vIHN0cnVjdCBBUFBfTUVOVUlURU0KIC8vIHsKLS8vIAlBUFBfTUVOVUlURU0oKSA6IG9TdWJNZW51KE5VTEwpLCBjTmFtZShMIiIpLCBjUmV0dXJuKEwiIiksIGJNYXJrZWQoZmFsc2UpLCBiRW5hYmxlZCh0cnVlKQorLy8gCUFQUF9NRU5VSVRFTSgpIDogb1N1Yk1lbnUoTlVMTCksIGNOYW1lKEwiIiksIGNSZXR1cm4oTCIiKSwKKy8vIGJNYXJrZWQoZmFsc2UpLCBiRW5hYmxlZCh0cnVlKQogLy8gCXsKIC8vIAl9CiAvLyAJQ0ZYX1dpZGVTdHJpbmcgY05hbWU7CkBAIC0xMDMsMTIxICsxMDEsMjA2IEBACiAvLyAJSE1FTlUgaE1lbnU7CiAvLyB9OwogCi1jbGFzcyBhcHAgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqCi17Ci1wdWJsaWM6Ci0JYXBwKENKU19PYmplY3QgKiBwSlNPYmplY3QpOwotCXZpcnR1YWwgfmFwcCgpOworY2xhc3MgYXBwIDogcHVibGljIENKU19FbWJlZE9iaiB7CisgcHVibGljOgorICBhcHAoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgdmlydHVhbCB+YXBwKCk7CiAKLXB1YmxpYzoKLQlGWF9CT09MCQkJCQkJYWN0aXZlRG9jcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQljYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJZm9ybXNWZXJzaW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWZzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWZ1bGxzY3JlZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJbGFuZ3VhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJbWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJcGxhdGZvcm0oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJcnVudGltZUhpZ2hsaWdodChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQl2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXZpZXdlclZhcmlhdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQl2aWV3ZXJWZXJzaW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgcHVibGljOgorICBGWF9CT09MIGFjdGl2ZURvY3MoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGZvcm1zVmVyc2lvbihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGZzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZnVsbHNjcmVlbihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbGFuZ3VhZ2UoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBwbGF0Zm9ybShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBydW50aW1lSGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB2aWV3ZXJWYXJpYXRpb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB2aWV3ZXJWZXJzaW9uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAorICBGWF9CT09MIGFsZXJ0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJlZXAoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNsZWFySW50ZXJ2YWwoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgY2xlYXJUaW1lT3V0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGV4ZWNEaWFsb2coSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZXhlY01lbnVJdGVtKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGZpbmRDb21wb25lbnQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ29CYWNrKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdvRm9yd2FyZChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbWFpbE1zZyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBuZXdGREYoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbmV3RG9jKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIG9wZW5Eb2MoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgb3BlbkZERihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBwb3BVcE1lbnVFeChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBwb3BVcE1lbnUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmVzcG9uc2UoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc2V0SW50ZXJ2YWwoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc2V0VGltZU91dChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIAotCUZYX0JPT0wJCQkJCQlhbGVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJYmVlcChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJYnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQljbGVhckludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQljbGVhclRpbWVPdXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWV4ZWNEaWFsb2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWV4ZWNNZW51SXRlbShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJZmluZENvbXBvbmVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJZ29CYWNrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlnb0ZvcndhcmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWxhdW5jaFVSTChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJbWFpbE1zZyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJbmV3RkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQluZXdEb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCW9wZW5Eb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCW9wZW5GREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXBvcFVwTWVudUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlwb3BVcE1lbnUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXJlc3BvbnNlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlzZXRJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJc2V0VGltZU91dChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyBwcml2YXRlOgorICAvLwlGWF9EV09SRAkJCQkJQXBwR2V0VGlja0NvdW50KCk7CisgIHZvaWQgVGltZXJQcm9jKENKU19UaW1lciogcFRpbWVyKTsKKyAgdm9pZCBSdW5Kc1NjcmlwdChDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NjcmlwdCk7CisgIC8vCXZvaWQJCQkJCQlQYXJzZVBvcHVwTWVudU9iaihBUFBfTUVOVUlURU0gKgorICAvL3BwTWVudUl0ZW0sSlNPYmplY3QgKiBwT2JqKTsKKyAgLy8Jdm9pZAkJCQkJCURlbGV0ZU1lbnVJdGVtcyhBUFBfTUVOVUlURU1fQVJSQVkgKgorICAvL3BNZW51SXRlbXMpOworICAvLyAJdm9pZAkJCQkJCUFkZE1lbnVJdGVtKEFQUF9NRU5VSVRFTV9BUlJBWSAqIHBNZW51SXRlbXMsIEhNRU5VCisgIC8vIGhNZW51LCBNRU5VSVRFTUlORk8gTWVudUl0ZW1JbmZvKTsKKyAgLy8gCXZvaWQJCQkJCQlJbml0TWVudUl0ZW1JbmZvKE1FTlVJVEVNSU5GTyYKKyAgLy8gTWVudUl0ZW1JbmZvKTsKKyAgLy8gCXZvaWQJCQkJCQlEZXN0cm95UG9wVXBNZW51KCk7CiAKLXByaXZhdGU6Ci0vLwlGWF9EV09SRAkJCQkJQXBwR2V0VGlja0NvdW50KCk7Ci0Jdm9pZAkJCQkJCVRpbWVyUHJvYyhDSlNfVGltZXIqIHBUaW1lcik7Ci0Jdm9pZAkJCQkJCVJ1bkpzU2NyaXB0KENKU19SdW50aW1lICogcFJ1bnRpbWUsY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB3c1NjcmlwdCk7Ci0vLwl2b2lkCQkJCQkJUGFyc2VQb3B1cE1lbnVPYmooQVBQX01FTlVJVEVNICogcHBNZW51SXRlbSxKU09iamVjdCAqIHBPYmopOwotLy8Jdm9pZAkJCQkJCURlbGV0ZU1lbnVJdGVtcyhBUFBfTUVOVUlURU1fQVJSQVkgKiBwTWVudUl0ZW1zKTsKLS8vIAl2b2lkCQkJCQkJQWRkTWVudUl0ZW0oQVBQX01FTlVJVEVNX0FSUkFZICogcE1lbnVJdGVtcywgSE1FTlUgaE1lbnUsIE1FTlVJVEVNSU5GTyBNZW51SXRlbUluZm8pOwotLy8gCXZvaWQJCQkJCQlJbml0TWVudUl0ZW1JbmZvKE1FTlVJVEVNSU5GTyYgTWVudUl0ZW1JbmZvKTsKLS8vIAl2b2lkCQkJCQkJRGVzdHJveVBvcFVwTWVudSgpOworICAvLyAJdm9pZAkJCQkJCVBhcnNlck1lbnVJdGVtKEFQUF9NRU5VKiBwSGVhZCwgY29uc3QKKyAgLy8gQ0pTX1BhcmFtZXRlcnMmcGFyYW1zKTsKKyAgLy8gCXZvaWQJCQkJCQlBZGRJdGVtVG9NZW51KEFQUF9NRU5VKiBwSGVhZCwgSE1FTlUgaE1lbnUsCisgIC8vIE1FTlVJVEVNSU5GTyBNZW51SXRlbUluZm8pOworICAvLyAJdm9pZAkJCQkJCURlc3Ryb3lNZW51SXRlbXMoQVBQX01FTlUqCisgIC8vIHBIZWFkKTsKIAotLy8gCXZvaWQJCQkJCQlQYXJzZXJNZW51SXRlbShBUFBfTUVOVSogcEhlYWQsIGNvbnN0IENKU19QYXJhbWV0ZXJzJnBhcmFtcyk7Ci0vLyAJdm9pZAkJCQkJCUFkZEl0ZW1Ub01lbnUoQVBQX01FTlUqIHBIZWFkLCBITUVOVSBoTWVudSwgTUVOVUlURU1JTkZPIE1lbnVJdGVtSW5mbyk7Ci0vLyAJdm9pZAkJCQkJCURlc3Ryb3lNZW51SXRlbXMoQVBQX01FTlUqIHBIZWFkKTsKKyBwdWJsaWM6CisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBTeXNQYXRoVG9QREZQYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzT2xkUGF0aCk7CiAKLXB1YmxpYzoKLQlzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcJCVN5c1BhdGhUb1BERlBhdGgoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNPbGRQYXRoKTsKKyBwcml2YXRlOgorICBib29sIG1fYkNhbGN1bGF0ZTsKKyAgYm9vbCBtX2JSdW50aW1lSGlnaExpZ2h0OwogCi1wcml2YXRlOgorICBDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfVGltZXIqPiBtX2FUaW1lcjsKKyAgLy8JQVBQX01FTlUqCQkJCQltX3BNZW51SGVhZDsKIAotCWJvb2wJCQkJCQltX2JDYWxjdWxhdGU7Ci0JYm9vbAkJCQkJCW1fYlJ1bnRpbWVIaWdoTGlnaHQ7Ci0KLQlDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfVGltZXIqPgltX2FUaW1lcjsKLS8vCUFQUF9NRU5VKgkJCQkJbV9wTWVudUhlYWQ7Ci0KLXB1YmxpYzoKLS8vCXN0YXRpYyBDUmVhZGVyX0FwcCogc19BcHA7CisgcHVibGljOgorICAvLwlzdGF0aWMgQ1JlYWRlcl9BcHAqIHNfQXBwOwogfTsKIAotY2xhc3MgQ0pTX0FwcCA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX0FwcChKU0ZYT2JqZWN0ICBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX0FwcCh2b2lkKXt9OworY2xhc3MgQ0pTX0FwcCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19BcHAoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCl7fTsKKyAgdmlydHVhbCB+Q0pTX0FwcCh2b2lkKXt9OwogCi0JREVDTEFSRV9KU19DTEFTUyhDSlNfQXBwKTsKKyAgREVDTEFSRV9KU19DTEFTUyhDSlNfQXBwKTsKIAotCUpTX1NUQVRJQ19QUk9QKGFjdGl2ZURvY3MsIGFwcCk7Ci0JSlNfU1RBVElDX1BST1AoY2FsY3VsYXRlLCBhcHApOwotCUpTX1NUQVRJQ19QUk9QKGZvcm1zVmVyc2lvbiwgYXBwKTsKLQlKU19TVEFUSUNfUFJPUChmcywgYXBwKTsKLQlKU19TVEFUSUNfUFJPUChmdWxsc2NyZWVuLCBhcHApOwotCUpTX1NUQVRJQ19QUk9QKGxhbmd1YWdlLCBhcHApOwotCUpTX1NUQVRJQ19QUk9QKG1lZGlhLCBhcHApOwotCUpTX1NUQVRJQ19QUk9QKHBsYXRmb3JtLCBhcHApOwotCUpTX1NUQVRJQ19QUk9QKHJ1bnRpbWVIaWdobGlnaHQsIGFwcCk7Ci0JSlNfU1RBVElDX1BST1Aodmlld2VyVHlwZSwgYXBwKTsKLQlKU19TVEFUSUNfUFJPUCh2aWV3ZXJWYXJpYXRpb24sIGFwcCk7Ci0JSlNfU1RBVElDX1BST1Aodmlld2VyVmVyc2lvbiwgYXBwKTsKKyAgSlNfU1RBVElDX1BST1AoYWN0aXZlRG9jcywgYXBwKTsKKyAgSlNfU1RBVElDX1BST1AoY2FsY3VsYXRlLCBhcHApOworICBKU19TVEFUSUNfUFJPUChmb3Jtc1ZlcnNpb24sIGFwcCk7CisgIEpTX1NUQVRJQ19QUk9QKGZzLCBhcHApOworICBKU19TVEFUSUNfUFJPUChmdWxsc2NyZWVuLCBhcHApOworICBKU19TVEFUSUNfUFJPUChsYW5ndWFnZSwgYXBwKTsKKyAgSlNfU1RBVElDX1BST1AobWVkaWEsIGFwcCk7CisgIEpTX1NUQVRJQ19QUk9QKHBsYXRmb3JtLCBhcHApOworICBKU19TVEFUSUNfUFJPUChydW50aW1lSGlnaGxpZ2h0LCBhcHApOworICBKU19TVEFUSUNfUFJPUCh2aWV3ZXJUeXBlLCBhcHApOworICBKU19TVEFUSUNfUFJPUCh2aWV3ZXJWYXJpYXRpb24sIGFwcCk7CisgIEpTX1NUQVRJQ19QUk9QKHZpZXdlclZlcnNpb24sIGFwcCk7CiAKLQlKU19TVEFUSUNfTUVUSE9EKGFsZXJ0LCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0QoYmVlcCwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKGJyb3dzZUZvckRvYywgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKGNsZWFySW50ZXJ2YWwsIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChjbGVhclRpbWVPdXQsIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChleGVjRGlhbG9nLCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0QoZXhlY01lbnVJdGVtLCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0QoZmluZENvbXBvbmVudCwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKGdvQmFjaywgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKGdvRm9yd2FyZCwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKGxhdW5jaFVSTCwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKG1haWxNc2csIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChuZXdGREYsIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChuZXdEb2MsIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChvcGVuRG9jLCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0Qob3BlbkZERiwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKHBvcFVwTWVudUV4LCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0QocG9wVXBNZW51LCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0QocmVzcG9uc2UsIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChzZXRJbnRlcnZhbCwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKHNldFRpbWVPdXQsIGFwcCk7Ci0KKyAgSlNfU1RBVElDX01FVEhPRChhbGVydCwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChiZWVwLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKGJyb3dzZUZvckRvYywgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChjbGVhckludGVydmFsLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKGNsZWFyVGltZU91dCwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChleGVjRGlhbG9nLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKGV4ZWNNZW51SXRlbSwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChmaW5kQ29tcG9uZW50LCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKGdvQmFjaywgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChnb0ZvcndhcmQsIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QobGF1bmNoVVJMLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKG1haWxNc2csIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QobmV3RkRGLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKG5ld0RvYywgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChvcGVuRG9jLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKG9wZW5GREYsIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocG9wVXBNZW51RXgsIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocG9wVXBNZW51LCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKHJlc3BvbnNlLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKHNldEludGVydmFsLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKHNldFRpbWVPdXQsIGFwcCk7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0FQUF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29sb3IuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmgKaW5kZXggZGY4NjNiNS4uNDU3MDRlZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29sb3IuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oCkBAIC0xMCw3MSArMTAsNzYgQEAKICNpbmNsdWRlICJKU19EZWZpbmUuaCIKIC8vIFRPRE8odHNlcGV6KTogaW5jbHVkZSBDUFdMX0NvbG9yLmggb25jZSBpdHMgb3duIElXWVUgaXMgZml4ZWQuCiAKLWNsYXNzIGNvbG9yIDogcHVibGljIENKU19FbWJlZE9iagotewotcHVibGljOgotCWNvbG9yKENKU19PYmplY3QqIHBKU09iamVjdCk7Ci0JdmlydHVhbCB+Y29sb3Iodm9pZCk7CitjbGFzcyBjb2xvciA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgY29sb3IoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgdmlydHVhbCB+Y29sb3Iodm9pZCk7CiAKLQlGWF9CT09MIGJsYWNrKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBibHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBjeWFuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBka0dyYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGdyYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGdyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBsdEdyYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIG1hZ2VudGEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJlZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdHJhbnNwYXJlbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHdoaXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB5ZWxsb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBibGFjayhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBjeWFuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZGtHcmF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdyZWVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbHRHcmF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbWFnZW50YShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJlZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHRyYW5zcGFyZW50KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHdoaXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgeWVsbG93KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKLQlGWF9CT09MIGNvbnZlcnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBlcXVhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBjb252ZXJ0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGVxdWFsKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCi1wdWJsaWM6Ci0Jc3RhdGljIHZvaWQJCUNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsIENKU19BcnJheSYgYXJyYXkpOwotCXN0YXRpYyB2b2lkCQlDb252ZXJ0QXJyYXlUb1BXTENvbG9yKENKU19BcnJheSYgYXJyYXksIENQV0xfQ29sb3ImIGNvbG9yKTsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIENvbnZlcnRQV0xDb2xvclRvQXJyYXkoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsIENKU19BcnJheSYgYXJyYXkpOworICBzdGF0aWMgdm9pZCBDb252ZXJ0QXJyYXlUb1BXTENvbG9yKENKU19BcnJheSYgYXJyYXksIENQV0xfQ29sb3ImIGNvbG9yKTsKIAotcHJpdmF0ZToKLQlDUFdMX0NvbG9yCQltX2NyVHJhbnNwYXJlbnQ7Ci0JQ1BXTF9Db2xvcgkJbV9jckJsYWNrOwotCUNQV0xfQ29sb3IJCW1fY3JXaGl0ZTsKLQlDUFdMX0NvbG9yCQltX2NyUmVkOwotCUNQV0xfQ29sb3IJCW1fY3JHcmVlbjsKLQlDUFdMX0NvbG9yCQltX2NyQmx1ZTsKLQlDUFdMX0NvbG9yCQltX2NyQ3lhbjsKLQlDUFdMX0NvbG9yCQltX2NyTWFnZW50YTsKLQlDUFdMX0NvbG9yCQltX2NyWWVsbG93OwotCUNQV0xfQ29sb3IJCW1fY3JES0dyYXk7Ci0JQ1BXTF9Db2xvcgkJbV9jckdyYXk7Ci0JQ1BXTF9Db2xvcgkJbV9jckxUR3JheTsKKyBwcml2YXRlOgorICBDUFdMX0NvbG9yIG1fY3JUcmFuc3BhcmVudDsKKyAgQ1BXTF9Db2xvciBtX2NyQmxhY2s7CisgIENQV0xfQ29sb3IgbV9jcldoaXRlOworICBDUFdMX0NvbG9yIG1fY3JSZWQ7CisgIENQV0xfQ29sb3IgbV9jckdyZWVuOworICBDUFdMX0NvbG9yIG1fY3JCbHVlOworICBDUFdMX0NvbG9yIG1fY3JDeWFuOworICBDUFdMX0NvbG9yIG1fY3JNYWdlbnRhOworICBDUFdMX0NvbG9yIG1fY3JZZWxsb3c7CisgIENQV0xfQ29sb3IgbV9jckRLR3JheTsKKyAgQ1BXTF9Db2xvciBtX2NyR3JheTsKKyAgQ1BXTF9Db2xvciBtX2NyTFRHcmF5OwogfTsKIAotY2xhc3MgQ0pTX0NvbG9yIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfQ29sb3IoSlNGWE9iamVjdCAgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19Db2xvcih2b2lkKXt9OworY2xhc3MgQ0pTX0NvbG9yIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pTX0NvbG9yKEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3Qpe307CisgIHZpcnR1YWwgfkNKU19Db2xvcih2b2lkKXt9OwogCi0JREVDTEFSRV9KU19DTEFTUyhDSlNfQ29sb3IpOworICBERUNMQVJFX0pTX0NMQVNTKENKU19Db2xvcik7CiAKLQlKU19TVEFUSUNfUFJPUChibGFjaywgY29sb3IpOwotCUpTX1NUQVRJQ19QUk9QKGJsdWUsIGNvbG9yKTsKLQlKU19TVEFUSUNfUFJPUChjeWFuLCBjb2xvcik7Ci0JSlNfU1RBVElDX1BST1AoZGtHcmF5LCBjb2xvcik7Ci0JSlNfU1RBVElDX1BST1AoZ3JheSwgY29sb3IpOwotCUpTX1NUQVRJQ19QUk9QKGdyZWVuLCBjb2xvcik7Ci0JSlNfU1RBVElDX1BST1AobHRHcmF5LCBjb2xvcik7Ci0JSlNfU1RBVElDX1BST1AobWFnZW50YSwgY29sb3IpOwotCUpTX1NUQVRJQ19QUk9QKHJlZCwgY29sb3IpOwotCUpTX1NUQVRJQ19QUk9QKHRyYW5zcGFyZW50LCBjb2xvcik7Ci0JSlNfU1RBVElDX1BST1Aod2hpdGUsIGNvbG9yKTsKLQlKU19TVEFUSUNfUFJPUCh5ZWxsb3csIGNvbG9yKTsKKyAgSlNfU1RBVElDX1BST1AoYmxhY2ssIGNvbG9yKTsKKyAgSlNfU1RBVElDX1BST1AoYmx1ZSwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUChjeWFuLCBjb2xvcik7CisgIEpTX1NUQVRJQ19QUk9QKGRrR3JheSwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUChncmF5LCBjb2xvcik7CisgIEpTX1NUQVRJQ19QUk9QKGdyZWVuLCBjb2xvcik7CisgIEpTX1NUQVRJQ19QUk9QKGx0R3JheSwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUChtYWdlbnRhLCBjb2xvcik7CisgIEpTX1NUQVRJQ19QUk9QKHJlZCwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUCh0cmFuc3BhcmVudCwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUCh3aGl0ZSwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUCh5ZWxsb3csIGNvbG9yKTsKIAotCUpTX1NUQVRJQ19NRVRIT0QoY29udmVydCxjb2xvcik7Ci0JSlNfU1RBVElDX01FVEhPRChlcXVhbCxjb2xvcik7Ci0KKyAgSlNfU1RBVElDX01FVEhPRChjb252ZXJ0LCBjb2xvcik7CisgIEpTX1NUQVRJQ19NRVRIT0QoZXF1YWwsIGNvbG9yKTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfQ09MT1JfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbnNvbGUuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbnNvbGUuaAppbmRleCAwY2JjMjkxLi5hMDRkODdiIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb25zb2xlLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29uc29sZS5oCkBAIC05LDMxICs5LDQxIEBACiAKICNpbmNsdWRlICJKU19EZWZpbmUuaCIKIAotY2xhc3MgY29uc29sZSA6IHB1YmxpYyBDSlNfRW1iZWRPYmoKLXsKLXB1YmxpYzoKLQljb25zb2xlKENKU19PYmplY3QqIHBKU09iamVjdCk7Ci0JdmlydHVhbCB+Y29uc29sZSh2b2lkKTsKK2NsYXNzIGNvbnNvbGUgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIGNvbnNvbGUoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgdmlydHVhbCB+Y29uc29sZSh2b2lkKTsKIAotcHVibGljOgotCUZYX0JPT0wgY2xlYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBoaWRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcHJpbnRsbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNob3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgcHVibGljOgorICBGWF9CT09MIGNsZWFyKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGhpZGUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcHJpbnRsbihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzaG93KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogfTsKIAotY2xhc3MgQ0pTX0NvbnNvbGUgOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19Db25zb2xlKEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19Db25zb2xlKHZvaWQpe307CitjbGFzcyBDSlNfQ29uc29sZSA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19Db25zb2xlKEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3Qpe307CisgIHZpcnR1YWwgfkNKU19Db25zb2xlKHZvaWQpe307CiAKLQlERUNMQVJFX0pTX0NMQVNTKENKU19Db25zb2xlKTsKKyAgREVDTEFSRV9KU19DTEFTUyhDSlNfQ29uc29sZSk7CiAKLQlKU19TVEFUSUNfTUVUSE9EKGNsZWFyLCBjb25zb2xlKTsKLQlKU19TVEFUSUNfTUVUSE9EKGhpZGUsIGNvbnNvbGUpOwotCUpTX1NUQVRJQ19NRVRIT0QocHJpbnRsbiwgY29uc29sZSk7Ci0JSlNfU1RBVElDX01FVEhPRChzaG93LCBjb25zb2xlKTsKKyAgSlNfU1RBVElDX01FVEhPRChjbGVhciwgY29uc29sZSk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaGlkZSwgY29uc29sZSk7CisgIEpTX1NUQVRJQ19NRVRIT0QocHJpbnRsbiwgY29uc29sZSk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2hvdywgY29uc29sZSk7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0NPTlNPTEVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2V2ZW50LmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9ldmVudC5oCmluZGV4IDkxYTM4YmEuLmM3Yzg5OWUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2V2ZW50LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvZXZlbnQuaApAQCAtOSw2NCArOSw4MSBAQAogCiAjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCiAKLWNsYXNzIGV2ZW50IDogcHVibGljIENKU19FbWJlZE9iagotewotcHVibGljOgotCWV2ZW50KENKU19PYmplY3QgKiBwSlNPYmplY3QpOwotCXZpcnR1YWwgfmV2ZW50KHZvaWQpOworY2xhc3MgZXZlbnQgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIGV2ZW50KENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIHZpcnR1YWwgfmV2ZW50KHZvaWQpOwogCi1wdWJsaWM6Ci0JRlhfQk9PTCBjaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNoYW5nZUV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBjb21taXRLZXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGZpZWxkRnVsbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wga2V5RG93bihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbW9kaWZpZXIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIG5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJjKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByaWNoQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByaWNoQ2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2VsRW5kKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzZWxTdGFydChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2hpZnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdGFyZ2V0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0YXJnZXROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB2YWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgd2lsbENvbW1pdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCisgcHVibGljOgorICBGWF9CT09MIGNoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNoYW5nZUV4KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNvbW1pdEtleShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGZpZWxkRnVsbChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGtleURvd24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBtb2RpZmllcihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCByaWNoQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCByaWNoQ2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCByaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzZWxFbmQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzZWxTdGFydChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHRhcmdldChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHRhcmdldE5hbWUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB2YWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHdpbGxDb21taXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogfTsKIAotY2xhc3MgQ0pTX0V2ZW50IDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfRXZlbnQoSlNGWE9iamVjdCAgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19FdmVudCh2b2lkKXt9OworY2xhc3MgQ0pTX0V2ZW50IDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pTX0V2ZW50KEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3Qpe307CisgIHZpcnR1YWwgfkNKU19FdmVudCh2b2lkKXt9OwogCi0JREVDTEFSRV9KU19DTEFTUyhDSlNfRXZlbnQpOworICBERUNMQVJFX0pTX0NMQVNTKENKU19FdmVudCk7CiAKLQlKU19TVEFUSUNfUFJPUChjaGFuZ2UsIGV2ZW50KTsKLQlKU19TVEFUSUNfUFJPUChjaGFuZ2VFeCwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKGNvbW1pdEtleSwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKGZpZWxkRnVsbCwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKGtleURvd24sIGV2ZW50KTsKLQlKU19TVEFUSUNfUFJPUChtb2RpZmllciwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKG5hbWUsIGV2ZW50KTsKLQlKU19TVEFUSUNfUFJPUChyYywgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKHJpY2hDaGFuZ2UsIGV2ZW50KTsKLQlKU19TVEFUSUNfUFJPUChyaWNoQ2hhbmdlRXgsIGV2ZW50KTsKLQlKU19TVEFUSUNfUFJPUChyaWNoVmFsdWUsIGV2ZW50KTsKLQlKU19TVEFUSUNfUFJPUChzZWxFbmQsIGV2ZW50KTsKLQlKU19TVEFUSUNfUFJPUChzZWxTdGFydCwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKHNoaWZ0LCBldmVudCk7Ci0JSlNfU1RBVElDX1BST1Aoc291cmNlLCBldmVudCk7Ci0JSlNfU1RBVElDX1BST1AodGFyZ2V0LCBldmVudCk7Ci0JSlNfU1RBVElDX1BST1AodGFyZ2V0TmFtZSwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKHR5cGUsIGV2ZW50KTsKLQlKU19TVEFUSUNfUFJPUCh2YWx1ZSwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKHdpbGxDb21taXQsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1AoY2hhbmdlLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGNoYW5nZUV4LCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGNvbW1pdEtleSwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChmaWVsZEZ1bGwsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoa2V5RG93biwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChtb2RpZmllciwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChuYW1lLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHJjLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHJpY2hDaGFuZ2UsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1AocmljaENoYW5nZUV4LCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHJpY2hWYWx1ZSwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChzZWxFbmQsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoc2VsU3RhcnQsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoc2hpZnQsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoc291cmNlLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHRhcmdldCwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUCh0YXJnZXROYW1lLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHR5cGUsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1AodmFsdWUsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aod2lsbENvbW1pdCwgZXZlbnQpOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvZ2xvYmFsLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaAppbmRleCA4M2UwN2Y2Li4zMDNhYzc2IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaApAQCAtMTMsNzcgKzEzLDgyIEBACiBjbGFzcyBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTsKIGNsYXNzIENKU19LZXlWYWx1ZTsKIAotc3RydWN0IGpzX2dsb2JhbF9kYXRhCi17Ci0JanNfZ2xvYmFsX2RhdGEoKQotCXsKLQkJblR5cGUgPSAwOwotCQlkRGF0YSA9IDA7Ci0JCWJEYXRhID0gRkFMU0U7Ci0JCXNEYXRhID0gIiI7Ci0JCWJQZXJzaXN0ZW50ID0gRkFMU0U7Ci0JCWJEZWxldGVkID0gRkFMU0U7Ci0JfQorc3RydWN0IGpzX2dsb2JhbF9kYXRhIHsKKyAganNfZ2xvYmFsX2RhdGEoKSB7CisgICAgblR5cGUgPSAwOworICAgIGREYXRhID0gMDsKKyAgICBiRGF0YSA9IEZBTFNFOworICAgIHNEYXRhID0gIiI7CisgICAgYlBlcnNpc3RlbnQgPSBGQUxTRTsKKyAgICBiRGVsZXRlZCA9IEZBTFNFOworICB9CiAKLQl+anNfZ2xvYmFsX2RhdGEoKQotCXsKLQkJcERhdGEuUmVzZXQoKTsKLQl9Ci0JaW50CQkJCQluVHlwZTsgLy8wOmludCAxOmJvb2wgMjpzdHJpbmcgMzpvYmoKLQlkb3VibGUJCQkJZERhdGE7Ci0JYm9vbAkJCQliRGF0YTsKLQlDRlhfQnl0ZVN0cmluZwkJc0RhdGE7Ci0Jdjg6Okdsb2JhbDx2ODo6T2JqZWN0PiAgcERhdGE7Ci0JYm9vbAkJCQliUGVyc2lzdGVudDsKLQlib29sCQkJCWJEZWxldGVkOworICB+anNfZ2xvYmFsX2RhdGEoKSB7IHBEYXRhLlJlc2V0KCk7IH0KKyAgaW50IG5UeXBlOyAgLy8gMDppbnQgMTpib29sIDI6c3RyaW5nIDM6b2JqCisgIGRvdWJsZSBkRGF0YTsKKyAgYm9vbCBiRGF0YTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc0RhdGE7CisgIHY4OjpHbG9iYWw8djg6Ok9iamVjdD4gcERhdGE7CisgIGJvb2wgYlBlcnNpc3RlbnQ7CisgIGJvb2wgYkRlbGV0ZWQ7CiB9OwogCi1jbGFzcyBnbG9iYWxfYWx0ZXJuYXRlIDogcHVibGljIENKU19FbWJlZE9iagotewotcHVibGljOgotCWdsb2JhbF9hbHRlcm5hdGUoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKLQl2aXJ0dWFsIH5nbG9iYWxfYWx0ZXJuYXRlKCk7CitjbGFzcyBnbG9iYWxfYWx0ZXJuYXRlIDogcHVibGljIENKU19FbWJlZE9iaiB7CisgcHVibGljOgorICBnbG9iYWxfYWx0ZXJuYXRlKENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIHZpcnR1YWwgfmdsb2JhbF9hbHRlcm5hdGUoKTsKIAotcHVibGljOgotCUZYX0JPT0wJCQkJCQlzZXRQZXJzaXN0ZW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworIHB1YmxpYzoKKyAgRlhfQk9PTCBzZXRQZXJzaXN0ZW50KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCi1wdWJsaWM6Ci0JRlhfQk9PTAkJCQkJCVF1ZXJ5UHJvcGVydHkoY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lKTsKLQlGWF9CT09MCQkJCQkJRG9Qcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLCBDSlNfUHJvcFZhbHVlICYgdnAsIENGWF9XaWRlU3RyaW5nICYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJRGVsUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJiBzRXJyb3IpOworIHB1YmxpYzoKKyAgRlhfQk9PTCBRdWVyeVByb3BlcnR5KGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSk7CisgIEZYX0JPT0wgRG9Qcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgRGVsUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwogCi0Jdm9pZAkJCQkJCUluaXRpYWwoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7CisgIHZvaWQgSW5pdGlhbChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKTsKIAotcHJpdmF0ZToKLQl2b2lkCQkJCQkJVXBkYXRlR2xvYmFsUGVyc2lzdGVudFZhcmlhYmxlcygpOwotCXZvaWQJCQkJCQlDb21taXRHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOwotCXZvaWQJCQkJCQlEZXN0cm95R2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKTsKLQlGWF9CT09MCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVzKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLCBpbnQgblR5cGUsCi0JCQkJCQkJCQlkb3VibGUgZERhdGEsIGJvb2wgYkRhdGEsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSwgSlNPYmplY3QgcERhdGEsIGJvb2wgYkRlZmF1bHRQZXJzaXN0ZW50KTsKKyBwcml2YXRlOgorICB2b2lkIFVwZGF0ZUdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKKyAgdm9pZCBDb21taXRHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOworICB2b2lkIERlc3Ryb3lHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOworICBGWF9CT09MIFNldEdsb2JhbFZhcmlhYmxlcyhjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPYmplY3QgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRlZmF1bHRQZXJzaXN0ZW50KTsKIAotCXZvaWQJCQkJCQlPYmplY3RUb0FycmF5KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpOwotCXZvaWQJCQkJCQlQdXRPYmplY3RQcm9wZXJ0eSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqLCBDSlNfS2V5VmFsdWUqIHBEYXRhKTsKKyAgdm9pZCBPYmplY3RUb0FycmF5KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkmIGFycmF5KTsKKyAgdm9pZCBQdXRPYmplY3RQcm9wZXJ0eSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqLCBDSlNfS2V5VmFsdWUqIHBEYXRhKTsKIAotcHJpdmF0ZToKLQlDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCQltX21hcEdsb2JhbDsKLQlDRlhfV2lkZVN0cmluZwkJCQltX3NGaWxlUGF0aDsKLQlDSlNfR2xvYmFsRGF0YSoJCQkJbV9wR2xvYmFsRGF0YTsKLQlDUERGRG9jX0Vudmlyb25tZW50KgkJCQltX3BBcHA7CisgcHJpdmF0ZToKKyAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX21hcEdsb2JhbDsKKyAgQ0ZYX1dpZGVTdHJpbmcgbV9zRmlsZVBhdGg7CisgIENKU19HbG9iYWxEYXRhKiBtX3BHbG9iYWxEYXRhOworICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7CiB9OwogCitjbGFzcyBDSlNfR2xvYmFsIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pTX0dsb2JhbChKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KXt9OworICB2aXJ0dWFsIH5DSlNfR2xvYmFsKHZvaWQpe307CiAKLWNsYXNzIENKU19HbG9iYWwgOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19HbG9iYWwoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX0dsb2JhbCh2b2lkKXt9OworICB2aXJ0dWFsIEZYX0JPT0wgSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKTsKIAotCXZpcnR1YWwgRlhfQk9PTAlJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpOworICBERUNMQVJFX1NQRUNJQUxfSlNfQ0xBU1MoQ0pTX0dsb2JhbCk7CiAKLQlERUNMQVJFX1NQRUNJQUxfSlNfQ0xBU1MoQ0pTX0dsb2JhbCk7Ci0KLQlKU19TUEVDSUFMX1NUQVRJQ19NRVRIT0Qoc2V0UGVyc2lzdGVudCwgZ2xvYmFsX2FsdGVybmF0ZSwgZ2xvYmFsKTsKLQorICBKU19TUEVDSUFMX1NUQVRJQ19NRVRIT0Qoc2V0UGVyc2lzdGVudCwgZ2xvYmFsX2FsdGVybmF0ZSwgZ2xvYmFsKTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfR0xPQkFMX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9yZXBvcnQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3JlcG9ydC5oCmluZGV4IDU2Zjc0MmMuLmE5MDA0ZmQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3JlcG9ydC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3JlcG9ydC5oCkBAIC05LDI4ICs5LDMyIEBACiAKICNpbmNsdWRlICJKU19EZWZpbmUuaCIKIAotY2xhc3MgUmVwb3J0IDogcHVibGljIENKU19FbWJlZE9iagotewotcHVibGljOgotCVJlcG9ydChDSlNfT2JqZWN0ICogcEpTT2JqZWN0KTsKLQl2aXJ0dWFsIH5SZXBvcnQoKTsKK2NsYXNzIFJlcG9ydCA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgUmVwb3J0KENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIHZpcnR1YWwgflJlcG9ydCgpOwogCi1wdWJsaWM6Ci0JRlhfQk9PTCBzYXZlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgd3JpdGVUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworIHB1YmxpYzoKKyAgRlhfQk9PTCBzYXZlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHdyaXRlVGV4dChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKIH07CiAKLWNsYXNzIENKU19SZXBvcnQgOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19SZXBvcnQoSlNGWE9iamVjdCAgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3Qpe307Ci0JdmlydHVhbCB+Q0pTX1JlcG9ydCgpe307CitjbGFzcyBDSlNfUmVwb3J0IDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pTX1JlcG9ydChKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KXt9OworICB2aXJ0dWFsIH5DSlNfUmVwb3J0KCl7fTsKIAotcHVibGljOgotCURFQ0xBUkVfSlNfQ0xBU1MoQ0pTX1JlcG9ydCk7CisgcHVibGljOgorICBERUNMQVJFX0pTX0NMQVNTKENKU19SZXBvcnQpOwogCi0JSlNfU1RBVElDX01FVEhPRChzYXZlLCBSZXBvcnQpCi0JSlNfU1RBVElDX01FVEhPRCh3cml0ZVRleHQsIFJlcG9ydCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2F2ZSwgUmVwb3J0KQorICBKU19TVEFUSUNfTUVUSE9EKHdyaXRlVGV4dCwgUmVwb3J0KTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfUkVQT1JUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9yZXNvdXJjZS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvcmVzb3VyY2UuaAppbmRleCA0MzM3ODU5Li44MDYyOWNmIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9yZXNvdXJjZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3Jlc291cmNlLmgKQEAgLTgsMjggKzgsMjggQEAKICNkZWZpbmUgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfUkVTT1VSQ0VfSF8KIAogI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCIgIC8vIEZvciBDRlhfV2lkZVN0cmluZy4KLSNpbmNsdWRlICIuLi9mc2RrX2RlZmluZS5oIiAgLy8gRm9yIEZYX1VJTlQuCisjaW5jbHVkZSAiLi4vZnNka19kZWZpbmUuaCIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIEZYX1VJTlQuCiAKIGNsYXNzIENKU19Db250ZXh0OwogCi0jZGVmaW5lIElEU19TVFJJTkdfSlNBTEVSVCAgICAgICAgICAgICAgMjU2MTMKLSNkZWZpbmUgSURTX1NUUklOR19KU1BBUkFNRVJST1IgICAgICAgICAyNTYxNAorI2RlZmluZSBJRFNfU1RSSU5HX0pTQUxFUlQgMjU2MTMKKyNkZWZpbmUgSURTX1NUUklOR19KU1BBUkFNRVJST1IgMjU2MTQKICNkZWZpbmUgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSAyNTYxNQotI2RlZmluZSBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORyAgICAgIDI1NjE3Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNQQVJTRURBVEUgICAgICAgICAgMjU2MTgKLSNkZWZpbmUgSURTX1NUUklOR19KU1JBTkdFMSAgICAgICAgICAgICAyNTYxOQotI2RlZmluZSBJRFNfU1RSSU5HX0pTUkFOR0UyICAgICAgICAgICAgIDI1NjIwCi0jZGVmaW5lIElEU19TVFJJTkdfSlNSQU5HRTMgICAgICAgICAgICAgMjU2MjEKLSNkZWZpbmUgSURTX1NUUklOR19OT1RTVVBQT1JUICAgICAgICAgICAyNTYyNwotI2RlZmluZSBJRFNfU1RSSU5HX0pTQlVTWSAgICAgICAgICAgICAgIDI1NjI4Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNFVkVOVCAgICAgICAgICAgICAgMjU2MjkKLSNkZWZpbmUgSURTX1NUUklOR19SVU4gICAgICAgICAgICAgICAgICAyNTYzMAotI2RlZmluZSBJRFNfU1RSSU5HX0pTUFJJTlQxICAgICAgICAgICAgIDI1NjMyCi0jZGVmaW5lIElEU19TVFJJTkdfSlNQUklOVDIgICAgICAgICAgICAgMjU2MzMKLSNkZWZpbmUgSURTX1NUUklOR19KU05PR0xPQkFMICAgICAgICAgICAyNTYzNQotI2RlZmluZSBJRFNfU1RSSU5HX0pTUkVBRE9OTFkgICAgICAgICAgIDI1NjM2Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNUWVBFRVJST1IgICAgICAgICAgMjU2MzcKLSNkZWZpbmUgSURTX1NUUklOR19KU1ZBTFVFRVJST1IgICAgICAgICAyNTYzOAorI2RlZmluZSBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORyAyNTYxNworI2RlZmluZSBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFIDI1NjE4CisjZGVmaW5lIElEU19TVFJJTkdfSlNSQU5HRTEgMjU2MTkKKyNkZWZpbmUgSURTX1NUUklOR19KU1JBTkdFMiAyNTYyMAorI2RlZmluZSBJRFNfU1RSSU5HX0pTUkFOR0UzIDI1NjIxCisjZGVmaW5lIElEU19TVFJJTkdfTk9UU1VQUE9SVCAyNTYyNworI2RlZmluZSBJRFNfU1RSSU5HX0pTQlVTWSAyNTYyOAorI2RlZmluZSBJRFNfU1RSSU5HX0pTRVZFTlQgMjU2MjkKKyNkZWZpbmUgSURTX1NUUklOR19SVU4gMjU2MzAKKyNkZWZpbmUgSURTX1NUUklOR19KU1BSSU5UMSAyNTYzMgorI2RlZmluZSBJRFNfU1RSSU5HX0pTUFJJTlQyIDI1NjMzCisjZGVmaW5lIElEU19TVFJJTkdfSlNOT0dMT0JBTCAyNTYzNQorI2RlZmluZSBJRFNfU1RSSU5HX0pTUkVBRE9OTFkgMjU2MzYKKyNkZWZpbmUgSURTX1NUUklOR19KU1RZUEVFUlJPUiAyNTYzNworI2RlZmluZSBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUiAyNTYzOAogCiBDRlhfV2lkZVN0cmluZyBKU0dldFN0cmluZ0Zyb21JRChDSlNfQ29udGV4dCogcENvbnRleHQsIEZYX1VJTlQgaWQpOwogQ0ZYX1dpZGVTdHJpbmcgSlNGb3JtYXRFcnJvclN0cmluZyhjb25zdCBjaGFyKiBjbGFzc19uYW1lLApkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oCmluZGV4IGNhNGRiMzQuLjJlNjViZDMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3V0aWwuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC91dGlsLmgKQEAgLTExLDQwICsxMSw1OCBAQAogCiAjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCiAKLWNsYXNzIHV0aWwgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqCi17Ci1wdWJsaWM6Ci0JdXRpbChDSlNfT2JqZWN0ICogcEpTT2JqZWN0KTsKLQl2aXJ0dWFsIH51dGlsKHZvaWQpOworY2xhc3MgdXRpbCA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgdXRpbChDSlNfT2JqZWN0KiBwSlNPYmplY3QpOworICB2aXJ0dWFsIH51dGlsKHZvaWQpOwogCi1wdWJsaWM6Ci0JRlhfQk9PTCBwcmludGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBwcmludGYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBwcmludHgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzY2FuZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ5dGVUb0NoYXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgcHVibGljOgorICBGWF9CT09MIHByaW50ZChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBwcmludGYoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcHJpbnR4KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHNjYW5kKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJ5dGVUb0NoYXIoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CiAKLXB1YmxpYzoKLQlzdGF0aWMgdm9pZAkJcHJpbnRkKGNvbnN0IHN0ZDo6d3N0cmluZyAmY0Zvcm1hdCxDSlNfRGF0ZSBEYXRlLGJvb2wgYlhGQVBpY3R1cmUsIHN0ZDo6d3N0cmluZyAmY1B1cnBvc2UpOwotCXN0YXRpYyB2b2lkCQlwcmludHgoY29uc3Qgc3RkOjpzdHJpbmcgJmNGb3JtYXQsY29uc3Qgc3RkOjpzdHJpbmcgJmNTb3VyY2UsIHN0ZDo6c3RyaW5nICZjUHVycG9zZSk7Ci0Jc3RhdGljIGludAkJUGFyc3REYXRhVHlwZShzdGQ6OndzdHJpbmcqIHNGb3JtYXQpOworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgcHJpbnRkKGNvbnN0IHN0ZDo6d3N0cmluZyYgY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgIENKU19EYXRlIERhdGUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJYRkFQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nJiBjUHVycG9zZSk7CisgIHN0YXRpYyB2b2lkIHByaW50eChjb25zdCBzdGQ6OnN0cmluZyYgY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcmIGNQdXJwb3NlKTsKKyAgc3RhdGljIGludCBQYXJzdERhdGFUeXBlKHN0ZDo6d3N0cmluZyogc0Zvcm1hdCk7CiB9OwogCi1jbGFzcyBDSlNfVXRpbCA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX1V0aWwoSlNGWE9iamVjdCAgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19VdGlsKHZvaWQpe307CitjbGFzcyBDSlNfVXRpbCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19VdGlsKEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3Qpe307CisgIHZpcnR1YWwgfkNKU19VdGlsKHZvaWQpe307CiAKLQlERUNMQVJFX0pTX0NMQVNTKENKU19VdGlsKTsKKyAgREVDTEFSRV9KU19DTEFTUyhDSlNfVXRpbCk7CiAKLQlKU19TVEFUSUNfTUVUSE9EKHByaW50ZCwgdXRpbCk7Ci0JSlNfU1RBVElDX01FVEhPRChwcmludGYsIHV0aWwpOwotCUpTX1NUQVRJQ19NRVRIT0QocHJpbnR4LCB1dGlsKTsKLQlKU19TVEFUSUNfTUVUSE9EKHNjYW5kLCB1dGlsKTsKLQlKU19TVEFUSUNfTUVUSE9EKGJ5dGVUb0NoYXIsIHV0aWwpOworICBKU19TVEFUSUNfTUVUSE9EKHByaW50ZCwgdXRpbCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocHJpbnRmLCB1dGlsKTsKKyAgSlNfU1RBVElDX01FVEhPRChwcmludHgsIHV0aWwpOworICBKU19TVEFUSUNfTUVUSE9EKHNjYW5kLCB1dGlsKTsKKyAgSlNfU1RBVElDX01FVEhPRChieXRlVG9DaGFyLCB1dGlsKTsKIH07CiAKLWludDY0X3QgRlhfYXRvaTY0KGNvbnN0IGNoYXIgKm5wdHIpOworaW50NjRfdCBGWF9hdG9pNjQoY29uc3QgY2hhciogbnB0cik7CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2pzYXBpL2Z4anNfdjguaCBiL2ZwZGZzZGsvaW5jbHVkZS9qc2FwaS9meGpzX3Y4LmgKaW5kZXggZTI5MTg5OC4uNzJmMmE1ZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2pzYXBpL2Z4anNfdjguaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvanNhcGkvZnhqc192OC5oCkBAIC0xMywxMjcgKzEzLDIwMiBAQAogI2luY2x1ZGUgPHY4Lmg+CiAjaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIiAgLy8gRm9yIENGWF9XaWRlU3RyaW5nCiAKLXR5cGVkZWYgdjg6OlZhbHVlCQkJSlNWYWx1ZTsKLXR5cGVkZWYgdjg6OkxvY2FsPHY4OjpPYmplY3Q+CUpTT2JqZWN0OwotdHlwZWRlZiB2ODo6TG9jYWw8djg6Ok9iamVjdD4JSlNGWE9iamVjdDsKK3R5cGVkZWYgdjg6OlZhbHVlIEpTVmFsdWU7Cit0eXBlZGVmIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBKU09iamVjdDsKK3R5cGVkZWYgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IEpTRlhPYmplY3Q7CiAKLWVudW0gRlhKU09CSlRZUEUKLXsKLQlKU19EWU5BTUlDID0gMCwKLQlKU19TVEFUSUMgPSAxLAorZW51bSBGWEpTT0JKVFlQRSB7CisgIEpTX0RZTkFNSUMgPSAwLAorICBKU19TVEFUSUMgPSAxLAogfTsKIAotZW51bSBGWEpTVkFMVUVUWVBFCi17Ci0JVlRfdW5rbm93biwKLQlWVF9zdHJpbmcsCi0JVlRfbnVtYmVyLAotCVZUX2Jvb2xlYW4sCi0JVlRfZGF0ZSwKLQlWVF9vYmplY3QsCi0JVlRfZnhvYmplY3QsCi0JVlRfbnVsbCwKLQlWVF91bmRlZmluZWQKK2VudW0gRlhKU1ZBTFVFVFlQRSB7CisgIFZUX3Vua25vd24sCisgIFZUX3N0cmluZywKKyAgVlRfbnVtYmVyLAorICBWVF9ib29sZWFuLAorICBWVF9kYXRlLAorICBWVF9vYmplY3QsCisgIFZUX2Z4b2JqZWN0LAorICBWVF9udWxsLAorICBWVF91bmRlZmluZWQKIH07CiAKLXN0cnVjdCBGWEpTRXJyCi17Ci0JY29uc3Qgd2NoYXJfdCogbWVzc2FnZTsKLSAgICBjb25zdCB3Y2hhcl90KiBzcmNsaW5lOwotICAgIHVuc2lnbmVkIGxpbm51bTsKK3N0cnVjdCBGWEpTRXJyIHsKKyAgY29uc3Qgd2NoYXJfdCogbWVzc2FnZTsKKyAgY29uc3Qgd2NoYXJfdCogc3JjbGluZTsKKyAgdW5zaWduZWQgbGlubnVtOwogfTsKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBUEkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiB0eXBlZGVmIHY4OjpJc29sYXRlIElKU19SdW50aW1lOwogY2xhc3MgSUZYSlNfQ29udGV4dDsKIGNsYXNzIElGWEpTX1J1bnRpbWU7CiAKLXR5cGVkZWYgdm9pZCAoKkxQX0NPTlNUUlVDVE9SKShJRlhKU19Db250ZXh0KiBjYywgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGdsb2JhbCk7Cit0eXBlZGVmIHZvaWQgKCpMUF9DT05TVFJVQ1RPUikoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gZ2xvYmFsKTsKIHR5cGVkZWYgdm9pZCAoKkxQX0RFU1RSVUNUT1IpKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmopOwogCitpbnQgSlNfRGVmaW5lT2JqKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzT2JqTmFtZSwKKyAgICAgICAgICAgICAgICAgRlhKU09CSlRZUEUgZU9ialR5cGUsCisgICAgICAgICAgICAgICAgIExQX0NPTlNUUlVDVE9SIHBDb25zdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgTFBfREVTVFJVQ1RPUiBwRGVzdHJ1Y3Rvcik7CitpbnQgSlNfRGVmaW5lT2JqTWV0aG9kKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9iakRlZm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc01ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHY4OjpGdW5jdGlvbkNhbGxiYWNrIHBNZXRob2RDYWxsKTsKK2ludCBKU19EZWZpbmVPYmpQcm9wZXJ0eShJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9iakRlZm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzUHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkFjY2Vzc29yR2V0dGVyQ2FsbGJhY2sgcFByb3BHZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkFjY2Vzc29yU2V0dGVyQ2FsbGJhY2sgcFByb3BQdXQpOworaW50IEpTX0RlZmluZU9iakFsbFByb3BlcnRpZXMoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9iakRlZm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOYW1lZFByb3BlcnR5UXVlcnlDYWxsYmFjayBwUHJvcFF1cmV5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5hbWVkUHJvcGVydHlHZXR0ZXJDYWxsYmFjayBwUHJvcEdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOYW1lZFByb3BlcnR5U2V0dGVyQ2FsbGJhY2sgcFByb3BQdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TmFtZWRQcm9wZXJ0eURlbGV0ZXJDYWxsYmFjayBwUHJvcERlbCk7CitpbnQgSlNfRGVmaW5lT2JqQ29uc3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG5PYmpEZWZuSUQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc0NvbnN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwRGVmYXVsdCk7CitpbnQgSlNfRGVmaW5lR2xvYmFsTWV0aG9kKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzTWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkZ1bmN0aW9uQ2FsbGJhY2sgcE1ldGhvZENhbGwpOworaW50IEpTX0RlZmluZUdsb2JhbENvbnN0KElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNDb25zdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcERlZmF1bHQpOwogCi1pbnQJCQkJCQkJCUpTX0RlZmluZU9iaihJSlNfUnVudGltZSogcEpTUnVudGltZSwgY29uc3Qgd2NoYXJfdCogc09iak5hbWUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlLCBMUF9DT05TVFJVQ1RPUiBwQ29uc3RydWN0b3IsIExQX0RFU1RSVUNUT1IgcERlc3RydWN0b3IpOwotaW50CQkJCQkJCQlKU19EZWZpbmVPYmpNZXRob2QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuT2JqRGVmbklELCBjb25zdCB3Y2hhcl90KiBzTWV0aG9kTmFtZSwgdjg6OkZ1bmN0aW9uQ2FsbGJhY2sgcE1ldGhvZENhbGwpOwotaW50CQkJCQkJCQlKU19EZWZpbmVPYmpQcm9wZXJ0eShJSlNfUnVudGltZSogcEpTUnVudGltZSwgaW50IG5PYmpEZWZuSUQsIGNvbnN0IHdjaGFyX3QqIHNQcm9wTmFtZSwgdjg6OkFjY2Vzc29yR2V0dGVyQ2FsbGJhY2sgcFByb3BHZXQsIHY4OjpBY2Nlc3NvclNldHRlckNhbGxiYWNrIHBQcm9wUHV0KTsKLWludAkJCQkJCQkJSlNfRGVmaW5lT2JqQWxsUHJvcGVydGllcyhJSlNfUnVudGltZSogcEpTUnVudGltZSwgaW50IG5PYmpEZWZuSUQsIHY4OjpOYW1lZFByb3BlcnR5UXVlcnlDYWxsYmFjayBwUHJvcFF1cmV5LCB2ODo6TmFtZWRQcm9wZXJ0eUdldHRlckNhbGxiYWNrIHBQcm9wR2V0LCB2ODo6TmFtZWRQcm9wZXJ0eVNldHRlckNhbGxiYWNrIHBQcm9wUHV0LCB2ODo6TmFtZWRQcm9wZXJ0eURlbGV0ZXJDYWxsYmFjayBwUHJvcERlbCk7Ci1pbnQJCQkJCQkJCUpTX0RlZmluZU9iakNvbnN0KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBpbnQgbk9iakRlZm5JRCwgY29uc3Qgd2NoYXJfdCogc0NvbnN0TmFtZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcERlZmF1bHQpOwotaW50CQkJCQkJCQlKU19EZWZpbmVHbG9iYWxNZXRob2QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGNvbnN0IHdjaGFyX3QqIHNNZXRob2ROYW1lLCB2ODo6RnVuY3Rpb25DYWxsYmFjayBwTWV0aG9kQ2FsbCk7Ci1pbnQJCQkJCQkJCUpTX0RlZmluZUdsb2JhbENvbnN0KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBjb25zdCB3Y2hhcl90KiBzQ29uc3ROYW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwRGVmYXVsdCk7Cit2b2lkIEpTX0luaXRpYWxSdW50aW1lKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICBJRlhKU19SdW50aW1lKiBwRlhSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICBJRlhKU19Db250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiYgdjhQZXJzaXN0ZW50Q29udGV4dCk7Cit2b2lkIEpTX1JlbGVhc2VSdW50aW1lKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiYgdjhQZXJzaXN0ZW50Q29udGV4dCk7Cit2b2lkIEpTX0luaXRpYWwodW5zaWduZWQgaW50IGVtYmVkZGVyRGF0YVNsb3QpOwordm9pZCBKU19SZWxlYXNlKCk7CitpbnQgSlNfUGFyc2UoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgSUZYSlNfQ29udGV4dCogcEpTQ29udGV4dCwKKyAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzY3JpcHQsCisgICAgICAgICAgICAgbG9uZyBsZW5ndGgsCisgICAgICAgICAgICAgRlhKU0VyciogcGVycm9yKTsKK2ludCBKU19FeGVjdXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgSUZYSlNfQ29udGV4dCogcEpTQ29udGV4dCwKKyAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNjcmlwdCwKKyAgICAgICAgICAgICAgIGxvbmcgbGVuZ3RoLAorICAgICAgICAgICAgICAgRlhKU0VyciogcGVycm9yKTsKK3Y4OjpMb2NhbDx2ODo6T2JqZWN0PiBKU19OZXdGeER5bmFtaWNPYmooSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWEpTX0NvbnRleHQqIHBKU0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuT2JqRGVmbklEKTsKK3Y4OjpMb2NhbDx2ODo6T2JqZWN0PiBKU19HZXRTdGF0aWNPYmooSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuT2JqRGVmbklEKTsKK3ZvaWQgSlNfU2V0VGhpc09iaihJSlNfUnVudGltZSogcEpTUnVudGltZSwgaW50IG5UaGlzT2JqSUQpOwordjg6OkxvY2FsPHY4OjpPYmplY3Q+IEpTX0dldFRoaXNPYmooSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUpOworaW50IEpTX0dldE9iakRlZm5JRCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7CitJSlNfUnVudGltZSogSlNfR2V0UnVudGltZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7CitpbnQgSlNfR2V0T2JqRGVmbklEKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBjb25zdCB3Y2hhcl90KiBwT2JqTmFtZSk7Cit2b2lkIEpTX0Vycm9yKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgbWVzc2FnZSk7Cit1bnNpZ25lZCBKU19DYWxjSGFzaChjb25zdCB3Y2hhcl90KiBtYWluLCB1bnNpZ25lZCBuTGVuKTsKK3Vuc2lnbmVkIEpTX0NhbGNIYXNoKGNvbnN0IHdjaGFyX3QqIG1haW4pOworY29uc3Qgd2NoYXJfdCogSlNfR2V0VHlwZW9mKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBPYmopOwordm9pZCBKU19TZXRQcml2YXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIHApOwordm9pZCogSlNfR2V0UHJpdmF0ZShJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwordm9pZCBKU19TZXRQcml2YXRlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCB2b2lkKiBwKTsKK3ZvaWQqIEpTX0dldFByaXZhdGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwordm9pZCBKU19GcmVlUHJpdmF0ZSh2b2lkKiBwKTsKK3ZvaWQgSlNfRnJlZVByaXZhdGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfR2V0T2JqZWN0VmFsdWUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfR2V0T2JqZWN0RWxlbWVudChJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSk7Cit2ODo6TG9jYWw8djg6OkFycmF5PiBKU19HZXRPYmplY3RFbGVtZW50TmFtZXMoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwordm9pZCBKU19QdXRPYmplY3RTdHJpbmcoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNWYWx1ZSk7Cit2b2lkIEpTX1B1dE9iamVjdE51bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5WYWx1ZSk7Cit2b2lkIEpTX1B1dE9iamVjdE51bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZlZhbHVlKTsKK3ZvaWQgSlNfUHV0T2JqZWN0TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFZhbHVlKTsKK3ZvaWQgSlNfUHV0T2JqZWN0Qm9vbGVhbihJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmFsdWUpOwordm9pZCBKU19QdXRPYmplY3RPYmplY3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwUHV0KTsKK3ZvaWQgSlNfUHV0T2JqZWN0TnVsbChJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUpOwordW5zaWduZWQgSlNfUHV0QXJyYXlFbGVtZW50KElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU1ZBTFVFVFlQRSBlVHlwZSk7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBKU19HZXRBcnJheUVsZW1lbnQoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4KTsKK3Vuc2lnbmVkIEpTX0dldEFycmF5TGVuZ3RoKHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSk7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBKU19HZXRMaXN0VmFsdWUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KTsKIAotdm9pZAkJCQkJCQlKU19Jbml0aWFsUnVudGltZShJSlNfUnVudGltZSogcEpTUnVudGltZSxJRlhKU19SdW50aW1lKiBwRlhSdW50aW1lLCBJRlhKU19Db250ZXh0KiBjb250ZXh0LCB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiYgdjhQZXJzaXN0ZW50Q29udGV4dCk7Ci12b2lkCQkJCQkJCUpTX1JlbGVhc2VSdW50aW1lKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiYgdjhQZXJzaXN0ZW50Q29udGV4dCk7Ci12b2lkCQkJCQkJCUpTX0luaXRpYWwodW5zaWduZWQgaW50IGVtYmVkZGVyRGF0YVNsb3QpOwotdm9pZAkJCQkJCQlKU19SZWxlYXNlKCk7Ci1pbnQJCQkJCQkJCUpTX1BhcnNlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBJRlhKU19Db250ZXh0KiBwSlNDb250ZXh0LCBjb25zdCB3Y2hhcl90KiBzY3JpcHQsIGxvbmcgbGVuZ3RoLCBGWEpTRXJyKiBwZXJyb3IpOwotaW50CQkJCQkJCQlKU19FeGVjdXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBJRlhKU19Db250ZXh0KiBwSlNDb250ZXh0LCBjb25zdCB3Y2hhcl90KiBzY3JpcHQsIGxvbmcgbGVuZ3RoLCBGWEpTRXJyKiBwZXJyb3IpOwotdjg6OkxvY2FsPHY4OjpPYmplY3Q+CQkJSlNfTmV3RnhEeW5hbWljT2JqKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBJRlhKU19Db250ZXh0KiBwSlNDb250ZXh0LCBpbnQgbk9iakRlZm5JRCk7Ci12ODo6TG9jYWw8djg6Ok9iamVjdD4JCQlKU19HZXRTdGF0aWNPYmooSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuT2JqRGVmbklEKTsKLXZvaWQJCQkJCQkJSlNfU2V0VGhpc09iaihJSlNfUnVudGltZSogcEpTUnVudGltZSwgaW50IG5UaGlzT2JqSUQpOwotdjg6OkxvY2FsPHY4OjpPYmplY3Q+CQkJSlNfR2V0VGhpc09iaihJSlNfUnVudGltZSAqIHBKU1J1bnRpbWUpOwotaW50CQkJCQkJCQlKU19HZXRPYmpEZWZuSUQodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwotSUpTX1J1bnRpbWUqCQkJCQlKU19HZXRSdW50aW1lKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKTsKLWludAkJCQkJCQkJSlNfR2V0T2JqRGVmbklEKElKU19SdW50aW1lICogcEpTUnVudGltZSwgY29uc3Qgd2NoYXJfdCogcE9iak5hbWUpOwotdm9pZAkJCQkJCQlKU19FcnJvcih2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG1lc3NhZ2UpOwotdW5zaWduZWQJCQkJCQlKU19DYWxjSGFzaChjb25zdCB3Y2hhcl90KiBtYWluLCB1bnNpZ25lZCBuTGVuKTsKLXVuc2lnbmVkCQkJCQkJSlNfQ2FsY0hhc2goY29uc3Qgd2NoYXJfdCogbWFpbik7Ci1jb25zdCB3Y2hhcl90KgkJCQkJSlNfR2V0VHlwZW9mKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBPYmopOwotdm9pZAkJCQkJCQlKU19TZXRQcml2YXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgdm9pZCogcCk7Ci12b2lkKgkJCQkJCQlKU19HZXRQcml2YXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7Ci12b2lkCQkJCQkJCUpTX1NldFByaXZhdGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIHZvaWQqIHApOwotdm9pZCoJCQkJCQkJSlNfR2V0UHJpdmF0ZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7Ci12b2lkCQkJCQkJCUpTX0ZyZWVQcml2YXRlKHZvaWQqIHApOwotdm9pZAkJCQkJCQlKU19GcmVlUHJpdmF0ZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7Ci12ODo6TG9jYWw8djg6OlZhbHVlPgkJCUpTX0dldE9iamVjdFZhbHVlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKTsKLXY4OjpMb2NhbDx2ODo6VmFsdWU+CQkJSlNfR2V0T2JqZWN0RWxlbWVudChJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lKTsKLXY4OjpMb2NhbDx2ODo6QXJyYXk+CQkJSlNfR2V0T2JqZWN0RWxlbWVudE5hbWVzKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7Ci12b2lkCQkJCQkJCUpTX1B1dE9iamVjdFN0cmluZyhJSlNfUnVudGltZSogcEpTUnVudGltZSx2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLCBjb25zdCB3Y2hhcl90KiBzVmFsdWUpOwotdm9pZAkJCQkJCQlKU19QdXRPYmplY3ROdW1iZXIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwgaW50IG5WYWx1ZSk7Ci12b2lkCQkJCQkJCUpTX1B1dE9iamVjdE51bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSx2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLCBmbG9hdCBmVmFsdWUpOwotdm9pZAkJCQkJCQlKU19QdXRPYmplY3ROdW1iZXIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwgZG91YmxlIGRWYWx1ZSk7Ci12b2lkCQkJCQkJCUpTX1B1dE9iamVjdEJvb2xlYW4oSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwgYm9vbCBiVmFsdWUpOwotdm9pZAkJCQkJCQlKU19QdXRPYmplY3RPYmplY3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBQdXQpOwotdm9pZAkJCQkJCQlKU19QdXRPYmplY3ROdWxsKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUpOwotdW5zaWduZWQJCQkJCQlKU19QdXRBcnJheUVsZW1lbnQoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSx1bnNpZ25lZCBpbmRleCx2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUsRlhKU1ZBTFVFVFlQRSBlVHlwZSk7Ci12ODo6TG9jYWw8djg6OlZhbHVlPgkJCUpTX0dldEFycmF5RWxlbWVudChJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5LHVuc2lnbmVkIGluZGV4KTsKLXVuc2lnbmVkCQkJCQkJSlNfR2V0QXJyYXlMZW5ndGgodjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5KTsKLXY4OjpMb2NhbDx2ODo6VmFsdWU+CQkJSlNfR2V0TGlzdFZhbHVlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwTGlzdCwgaW50IGluZGV4KTsKK3Y4OjpMb2NhbDx2ODo6QXJyYXk+IEpTX05ld0FycmF5KElKU19SdW50aW1lKiBwSlNSdW50aW1lKTsKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld051bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSwgaW50IG51bWJlcik7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdOdW1iZXIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGRvdWJsZSBudW1iZXIpOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBmbG9hdCBudW1iZXIpOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3Qm9vbGVhbihJSlNfUnVudGltZSogcEpTUnVudGltZSwgYm9vbCBiKTsKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld09iamVjdChJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdPYmplY3QyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBwT2JqKTsKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld1N0cmluZyhJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzdHJpbmcpOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3U3RyaW5nKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBuTGVuKTsKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld051bGwoKTsKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld0RhdGUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGRvdWJsZSBkKTsKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld1ZhbHVlKElKU19SdW50aW1lKiBwSlNSdW50aW1lKTsKIAoraW50IEpTX1RvSW50MzIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7Citib29sIEpTX1RvQm9vbGVhbihJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKK2RvdWJsZSBKU19Ub051bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKK3Y4OjpMb2NhbDx2ODo6T2JqZWN0PiBKU19Ub09iamVjdChJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOworQ0ZYX1dpZGVTdHJpbmcgSlNfVG9TdHJpbmcoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOwordjg6OkxvY2FsPHY4OjpBcnJheT4gSlNfVG9BcnJheShJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKK3ZvaWQgSlNfVmFsdWVDb3B5KHY4OjpMb2NhbDx2ODo6VmFsdWU+JiBwVG8sIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBGcm9tKTsKIAotdjg6OkxvY2FsPHY4OjpBcnJheT4JCQlKU19OZXdBcnJheShJSlNfUnVudGltZSogcEpTUnVudGltZSk7Ci12ODo6TG9jYWw8djg6OlZhbHVlPgkJCUpTX05ld051bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSxpbnQgbnVtYmVyKTsKLXY4OjpMb2NhbDx2ODo6VmFsdWU+CQkJSlNfTmV3TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLGRvdWJsZSBudW1iZXIpOwotdjg6OkxvY2FsPHY4OjpWYWx1ZT4JCQlKU19OZXdOdW1iZXIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsZmxvYXQgbnVtYmVyKTsKLXY4OjpMb2NhbDx2ODo6VmFsdWU+CQkJSlNfTmV3Qm9vbGVhbihJSlNfUnVudGltZSogcEpTUnVudGltZSxib29sIGIpOwotdjg6OkxvY2FsPHY4OjpWYWx1ZT4JCQlKU19OZXdPYmplY3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwotdjg6OkxvY2FsPHY4OjpWYWx1ZT4JCQlKU19OZXdPYmplY3QyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBPYmopOwotdjg6OkxvY2FsPHY4OjpWYWx1ZT4JCQlKU19OZXdTdHJpbmcoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsY29uc3Qgd2NoYXJfdCogc3RyaW5nKTsKLXY4OjpMb2NhbDx2ODo6VmFsdWU+CQkJSlNfTmV3U3RyaW5nKElKU19SdW50aW1lKiBwSlNSdW50aW1lLGNvbnN0IHdjaGFyX3QqIHN0cmluZywgdW5zaWduZWQgbkxlbik7Ci12ODo6TG9jYWw8djg6OlZhbHVlPgkJCUpTX05ld051bGwoKTsKLXY4OjpMb2NhbDx2ODo6VmFsdWU+CQkJSlNfTmV3RGF0ZShJSlNfUnVudGltZSogcEpTUnVudGltZSxkb3VibGUgZCk7Ci12ODo6TG9jYWw8djg6OlZhbHVlPgkJCUpTX05ld1ZhbHVlKElKU19SdW50aW1lKiBwSlNSdW50aW1lKTsKLQotCi1pbnQJCQkJCQkJCUpTX1RvSW50MzIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7Ci1ib29sCQkJCQkJCUpTX1RvQm9vbGVhbihJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKLWRvdWJsZQkJCQkJCQlKU19Ub051bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKLXY4OjpMb2NhbDx2ODo6T2JqZWN0PgkJCUpTX1RvT2JqZWN0KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOwotQ0ZYX1dpZGVTdHJpbmcJCQkJCUpTX1RvU3RyaW5nKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOwotdjg6OkxvY2FsPHY4OjpBcnJheT4JCQlKU19Ub0FycmF5KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOwotdm9pZAkJCQkJCQlKU19WYWx1ZUNvcHkodjg6OkxvY2FsPHY4OjpWYWx1ZT4mIHBUbywgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcEZyb20pOwotCi1kb3VibGUJCQkJCQkJSlNfR2V0RGF0ZVRpbWUoKTsKLWludAkJCQkJCQkJSlNfR2V0WWVhckZyb21UaW1lKGRvdWJsZSBkdCk7Ci1pbnQJCQkJCQkJCUpTX0dldE1vbnRoRnJvbVRpbWUoZG91YmxlIGR0KTsKLWludAkJCQkJCQkJSlNfR2V0RGF5RnJvbVRpbWUoZG91YmxlIGR0KTsKLWludAkJCQkJCQkJSlNfR2V0SG91ckZyb21UaW1lKGRvdWJsZSBkdCk7Ci1pbnQJCQkJCQkJCUpTX0dldE1pbkZyb21UaW1lKGRvdWJsZSBkdCk7Ci1pbnQJCQkJCQkJCUpTX0dldFNlY0Zyb21UaW1lKGRvdWJsZSBkdCk7Ci1kb3VibGUJCQkJCQkJSlNfRGF0ZVBhcnNlKGNvbnN0IHdjaGFyX3QqIHN0cmluZyk7Ci1kb3VibGUJCQkJCQkJSlNfTWFrZURheShpbnQgblllYXIsIGludCBuTW9udGgsIGludCBuRGF5KTsKLWRvdWJsZQkJCQkJCQlKU19NYWtlVGltZShpbnQgbkhvdXIsIGludCBuTWluLCBpbnQgblNlYywgaW50IG5Ncyk7Ci1kb3VibGUJCQkJCQkJSlNfTWFrZURhdGUoZG91YmxlIGRheSwgZG91YmxlIHRpbWUpOwotYm9vbAkJCQkJCQlKU19Qb3J0SXNOYW4oZG91YmxlIGQpOwotZG91YmxlCQkJCQkJCUpTX0xvY2FsVGltZShkb3VibGUgZCk7Citkb3VibGUgSlNfR2V0RGF0ZVRpbWUoKTsKK2ludCBKU19HZXRZZWFyRnJvbVRpbWUoZG91YmxlIGR0KTsKK2ludCBKU19HZXRNb250aEZyb21UaW1lKGRvdWJsZSBkdCk7CitpbnQgSlNfR2V0RGF5RnJvbVRpbWUoZG91YmxlIGR0KTsKK2ludCBKU19HZXRIb3VyRnJvbVRpbWUoZG91YmxlIGR0KTsKK2ludCBKU19HZXRNaW5Gcm9tVGltZShkb3VibGUgZHQpOworaW50IEpTX0dldFNlY0Zyb21UaW1lKGRvdWJsZSBkdCk7Citkb3VibGUgSlNfRGF0ZVBhcnNlKGNvbnN0IHdjaGFyX3QqIHN0cmluZyk7Citkb3VibGUgSlNfTWFrZURheShpbnQgblllYXIsIGludCBuTW9udGgsIGludCBuRGF5KTsKK2RvdWJsZSBKU19NYWtlVGltZShpbnQgbkhvdXIsIGludCBuTWluLCBpbnQgblNlYywgaW50IG5Ncyk7Citkb3VibGUgSlNfTWFrZURhdGUoZG91YmxlIGRheSwgZG91YmxlIHRpbWUpOworYm9vbCBKU19Qb3J0SXNOYW4oZG91YmxlIGQpOworZG91YmxlIEpTX0xvY2FsVGltZShkb3VibGUgZCk7CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pTQVBJX0ZYSlNfVjhfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgKaW5kZXggNDkzNzg0MS4uMzYzNTU2NyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgKQEAgLTksMTkgKzksMTggQEAKIAogI2luY2x1ZGUgIlBXTF9XbmQuaCIKIAotY2xhc3MgQ1BXTF9CdXR0b24gOiBwdWJsaWMgQ1BXTF9XbmQKLXsKLXB1YmxpYzoKLQlDUFdMX0J1dHRvbigpOwotCXZpcnR1YWwgfkNQV0xfQnV0dG9uKCk7CitjbGFzcyBDUFdMX0J1dHRvbiA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX0J1dHRvbigpOworICB2aXJ0dWFsIH5DUFdMX0J1dHRvbigpOwogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkCQkJCU9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiAKLXByb3RlY3RlZDoKLQlGWF9CT09MCQkJCQkJbV9iTW91c2VEb3duOworIHByb3RlY3RlZDoKKyAgRlhfQk9PTCBtX2JNb3VzZURvd247CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0JVVFRPTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NhcmV0LmgKaW5kZXggNjgzOGJjNC4uN2U2MWVlYiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9DYXJldC5oCkBAIC05LDQ1ICs5LDQzIEBACiAKICNpbmNsdWRlICJQV0xfV25kLmgiCiAKLXN0cnVjdCBQV0xfQ0FSRVRfSU5GTwotewotcHVibGljOgotCVBXTF9DQVJFVF9JTkZPKCkgOiBiVmlzaWJsZShGQUxTRSksIHB0SGVhZCgwLDApLCBwdEZvb3QoMCwwKQotCXsKLQl9CitzdHJ1Y3QgUFdMX0NBUkVUX0lORk8geworIHB1YmxpYzoKKyAgUFdMX0NBUkVUX0lORk8oKSA6IGJWaXNpYmxlKEZBTFNFKSwgcHRIZWFkKDAsIDApLCBwdEZvb3QoMCwgMCkge30KIAotCUZYX0JPT0wJCQkJCQliVmlzaWJsZTsKLQlDUERGX1BvaW50CQkJCQlwdEhlYWQ7Ci0JQ1BERl9Qb2ludAkJCQkJcHRGb290OworICBGWF9CT09MIGJWaXNpYmxlOworICBDUERGX1BvaW50IHB0SGVhZDsKKyAgQ1BERl9Qb2ludCBwdEZvb3Q7CiB9OwogCitjbGFzcyBDUFdMX0NhcmV0IDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfQ2FyZXQoKTsKKyAgdmlydHVhbCB+Q1BXTF9DYXJldCgpOwogCi1jbGFzcyBDUFdMX0NhcmV0IDogcHVibGljIENQV0xfV25kCi17Ci1wdWJsaWM6Ci0JQ1BXTF9DYXJldCgpOwotCXZpcnR1YWwgfkNQV0xfQ2FyZXQoKTsKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSk7CisgIHZpcnR1YWwgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyAgdmlydHVhbCB2b2lkIEludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QgPSBOVUxMKTsKKyAgdmlydHVhbCB2b2lkIFNldFZpc2libGUoRlhfQk9PTCBiVmlzaWJsZSkge30KKyAgdmlydHVhbCB2b2lkIFRpbWVyUHJvYygpOworICB2b2lkIFNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRIZWFkLAorICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0Rm9vdCk7CisgIENGWF9CeXRlU3RyaW5nIEdldENhcmV0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCk7CisgIHZvaWQgU2V0SW52YWxpZFJlY3QoQ1BERl9SZWN0IHJjKSB7IG1fcmNJbnZhbGlkID0gcmM7IH0KIAotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKLQl2aXJ0dWFsIHZvaWQJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwotCXZpcnR1YWwgdm9pZAkJCQlJbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCA9IE5VTEwpOwotCXZpcnR1YWwgdm9pZAkJCQlTZXRWaXNpYmxlKEZYX0JPT0wgYlZpc2libGUpIHt9Ci0JdmlydHVhbAl2b2lkCQkJCVRpbWVyUHJvYygpOwotCXZvaWQJCQkJCQlTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KTsKLQlDRlhfQnl0ZVN0cmluZwkJCQlHZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KTsKLQl2b2lkCQkJCQkJU2V0SW52YWxpZFJlY3QoQ1BERl9SZWN0IHJjKSB7bV9yY0ludmFsaWQgPSByYzt9CisgcHJpdmF0ZToKKyAgdm9pZCBHZXRDYXJldEFwcChDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0sIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0KTsKKyAgQ1BERl9SZWN0IEdldENhcmV0UmVjdCgpIGNvbnN0OwogCi1wcml2YXRlOgotCXZvaWQJCQkJCQlHZXRDYXJldEFwcChDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtLGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCk7Ci0JQ1BERl9SZWN0CQkJCQlHZXRDYXJldFJlY3QoKSBjb25zdDsKLQotCUZYX0JPT0wJCQkJCQltX2JGbGFzaDsKLQlDUERGX1BvaW50CQkJCQltX3B0SGVhZDsKLQlDUERGX1BvaW50CQkJCQltX3B0Rm9vdDsKLQlGWF9GTE9BVAkJCQkJbV9mV2lkdGg7Ci0JaW50MzJfdAkJCQkJbV9uRGVsYXk7Ci0JQ1BERl9SZWN0CQkJCQltX3JjSW52YWxpZDsKKyAgRlhfQk9PTCBtX2JGbGFzaDsKKyAgQ1BERl9Qb2ludCBtX3B0SGVhZDsKKyAgQ1BERl9Qb2ludCBtX3B0Rm9vdDsKKyAgRlhfRkxPQVQgbV9mV2lkdGg7CisgIGludDMyX3QgbV9uRGVsYXk7CisgIENQREZfUmVjdCBtX3JjSW52YWxpZDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfQ0FSRVRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Db21ib0JveC5oCmluZGV4IDdhODZjY2QuLjk4YWU3Y2EgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guaApAQCAtMTEsMTA4ICsxMSwxMDggQEAKICNpbmNsdWRlICJQV0xfTGlzdEJveC5oIgogI2luY2x1ZGUgIlBXTF9XbmQuaCIKIAotY2xhc3MgQ1BXTF9DQkVkaXQgOiBwdWJsaWMgQ1BXTF9FZGl0Ci17Ci1wdWJsaWM6Ci0JQ1BXTF9DQkVkaXQoKXt9OwotCXZpcnR1YWwgfkNQV0xfQ0JFZGl0KCl7fTsKK2NsYXNzIENQV0xfQ0JFZGl0IDogcHVibGljIENQV0xfRWRpdCB7CisgcHVibGljOgorICBDUFdMX0NCRWRpdCgpe307CisgIHZpcnR1YWwgfkNQV0xfQ0JFZGl0KCl7fTsKIH07CiAKLWNsYXNzIENQV0xfQ0JMaXN0Qm94IDogcHVibGljIENQV0xfTGlzdEJveAotewotcHVibGljOgotCUNQV0xfQ0JMaXN0Qm94KCl7fTsKLQl2aXJ0dWFsIH5DUFdMX0NCTGlzdEJveCgpe307CitjbGFzcyBDUFdMX0NCTGlzdEJveCA6IHB1YmxpYyBDUFdMX0xpc3RCb3ggeworIHB1YmxpYzoKKyAgQ1BXTF9DQkxpc3RCb3goKXt9OworICB2aXJ0dWFsIH5DUFdMX0NCTGlzdEJveCgpe307CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgcHVibGljOgorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAotCUZYX0JPT0wJCQkJT25LZXlEb3duV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7Ci0JRlhfQk9PTAkJCQlPbkNoYXJXaXRoRXhpdChGWF9XT1JEIG5DaGFyLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgRlhfQk9PTCBPbktleURvd25XaXRoRXhpdChGWF9XT1JEIG5DaGFyLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOworICBGWF9CT09MIE9uQ2hhcldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7CiB9OwogCi0jZGVmaW5lIFBXTF9DT01CT0JPWF9CVVRUT05fV0lEVEgJCTEzCisjZGVmaW5lIFBXTF9DT01CT0JPWF9CVVRUT05fV0lEVEggMTMKIAotY2xhc3MgQ1BXTF9DQkJ1dHRvbiA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfQ0JCdXR0b24oKXt9OwotCXZpcnR1YWwgfkNQV0xfQ0JCdXR0b24oKXt9OworY2xhc3MgQ1BXTF9DQkJ1dHRvbiA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX0NCQnV0dG9uKCl7fTsKKyAgdmlydHVhbCB+Q1BXTF9DQkJ1dHRvbigpe307CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIHZvaWQJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7Ci0JdmlydHVhbCB2b2lkCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pOworICB2aXJ0dWFsIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CiB9OwogCi1jbGFzcyBDUFdMX0NvbWJvQm94IDogcHVibGljIENQV0xfV25kCi17Ci1wdWJsaWM6Ci0JQ1BXTF9Db21ib0JveCgpOwotCW9wZXJhdG9yIENQV0xfRWRpdCogKCkJCXtyZXR1cm4gbV9wRWRpdDt9CitjbGFzcyBDUFdMX0NvbWJvQm94IDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfQ29tYm9Cb3goKTsKKyAgb3BlcmF0b3IgQ1BXTF9FZGl0KigpIHsgcmV0dXJuIG1fcEVkaXQ7IH0KIAotcHVibGljOgotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQlPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CisgcHVibGljOgorICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgT25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSA9IDAsIGludHB0cl90IGxQYXJhbSA9IDApOworICB2aXJ0dWFsIHZvaWQgT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtID0gMCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCXZpcnR1YWwgdm9pZAkJCQlSZVBvc0NoaWxkV25kKCk7CisgIHZpcnR1YWwgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdmlydHVhbCB2b2lkIFJlUG9zQ2hpbGRXbmQoKTsKIAotCXZpcnR1YWwgQ1BERl9SZWN0CQkJR2V0Rm9jdXNSZWN0KCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldEZvY3VzUmVjdCgpIGNvbnN0OwogCi0JdmlydHVhbCB2b2lkCQkJCVNldEZvY3VzKCk7Ci0JdmlydHVhbCB2b2lkCQkJCUtpbGxGb2N1cygpOworICB2aXJ0dWFsIHZvaWQgU2V0Rm9jdXMoKTsKKyAgdmlydHVhbCB2b2lkIEtpbGxGb2N1cygpOwogCi0JRlhfQk9PTAkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKKyAgRlhfQk9PTCBJc01vZGlmaWVkKCkgY29uc3Q7CiAKLXB1YmxpYzoKLQl2b2lkCQkJCQkJU2V0RmlsbGVyTm90aWZ5KElQV0xfRmlsbGVyX05vdGlmeSogcE5vdGlmeSk7CisgcHVibGljOgorICB2b2lkIFNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpOwogCi0JQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0VGV4dCgpIGNvbnN0OwotCXZvaWQJCQkJCQlTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0KTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0OworICB2b2lkIFNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQpOwogCi0Jdm9pZAkJCQkJCUFkZFN0cmluZyhjb25zdCBGWF9XQ0hBUiogc3RyaW5nKTsKLQlpbnQzMl90CQkJCQlHZXRTZWxlY3QoKSBjb25zdDsKLQl2b2lkCQkJCQkJU2V0U2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCk7CisgIHZvaWQgQWRkU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpOworICBpbnQzMl90IEdldFNlbGVjdCgpIGNvbnN0OworICB2b2lkIFNldFNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpOwogCi0Jdm9pZAkJCQkJCVNldEVkaXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLGludDMyX3QgbkVuZENoYXIpOwotCXZvaWQJCQkJCQlHZXRFZGl0U2VsKGludDMyX3QgJiBuU3RhcnRDaGFyLCBpbnQzMl90ICYgbkVuZENoYXIgKSBjb25zdDsKLQl2b2lkCQkJCQkJQ2xlYXIoKTsKLQl2b2lkCQkJCQkJU2VsZWN0QWxsKCk7Ci0JRlhfQk9PTAkJCQkJCUlzUG9wdXAoKSBjb25zdDsKKyAgdm9pZCBTZXRFZGl0U2VsKGludDMyX3QgblN0YXJ0Q2hhciwgaW50MzJfdCBuRW5kQ2hhcik7CisgIHZvaWQgR2V0RWRpdFNlbChpbnQzMl90JiBuU3RhcnRDaGFyLCBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3Q7CisgIHZvaWQgQ2xlYXIoKTsKKyAgdm9pZCBTZWxlY3RBbGwoKTsKKyAgRlhfQk9PTCBJc1BvcHVwKCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJU2V0U2VsZWN0VGV4dCgpOworICB2b2lkIFNldFNlbGVjdFRleHQoKTsKIAotcHJpdmF0ZToKLQl2b2lkCQkJCQkJQ3JlYXRlRWRpdChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0Jdm9pZAkJCQkJCUNyZWF0ZUJ1dHRvbihjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0Jdm9pZAkJCQkJCUNyZWF0ZUxpc3RCb3goY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOworIHByaXZhdGU6CisgIHZvaWQgQ3JlYXRlRWRpdChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdm9pZCBDcmVhdGVCdXR0b24oY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCk7CisgIHZvaWQgQ3JlYXRlTGlzdEJveChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKIAotCXZvaWQJCQkJCQlTZXRQb3B1cChGWF9CT09MIGJQb3B1cCk7CisgIHZvaWQgU2V0UG9wdXAoRlhfQk9PTCBiUG9wdXApOwogCi1wcml2YXRlOgotCUNQV0xfQ0JFZGl0KgkJCQltX3BFZGl0OwotCUNQV0xfQ0JCdXR0b24qCQkJCW1fcEJ1dHRvbjsKLQlDUFdMX0NCTGlzdEJveCoJCQkJbV9wTGlzdDsKKyBwcml2YXRlOgorICBDUFdMX0NCRWRpdCogbV9wRWRpdDsKKyAgQ1BXTF9DQkJ1dHRvbiogbV9wQnV0dG9uOworICBDUFdMX0NCTGlzdEJveCogbV9wTGlzdDsKIAotCUZYX0JPT0wJCQkJCQltX2JQb3B1cDsKLQlDUERGX1JlY3QJCQkJCW1fcmNPbGRXaW5kb3c7Ci0JaW50MzJfdAkJCQkJbV9uUG9wdXBXaGVyZTsKLQlpbnQzMl90CQkJCQltX25TZWxlY3RJdGVtOwotCUlQV0xfRmlsbGVyX05vdGlmeSoJCQltX3BGaWxsZXJOb3RpZnk7CisgIEZYX0JPT0wgbV9iUG9wdXA7CisgIENQREZfUmVjdCBtX3JjT2xkV2luZG93OworICBpbnQzMl90IG1fblBvcHVwV2hlcmU7CisgIGludDMyX3QgbV9uU2VsZWN0SXRlbTsKKyAgSVBXTF9GaWxsZXJfTm90aWZ5KiBtX3BGaWxsZXJOb3RpZnk7CiAKLXB1YmxpYzoKLQl2b2lkCQkJCQkJCUF0dGFjaEZGTERhdGEodm9pZCogcERhdGEpIHttX3BGb3JtRmlsbGVyID0gcERhdGE7fQotcHJpdmF0ZToKLQl2b2lkKgkJCQkJCQltX3BGb3JtRmlsbGVyOworIHB1YmxpYzoKKyAgdm9pZCBBdHRhY2hGRkxEYXRhKHZvaWQqIHBEYXRhKSB7IG1fcEZvcm1GaWxsZXIgPSBwRGF0YTsgfQorCisgcHJpdmF0ZToKKyAgdm9pZCogbV9wRm9ybUZpbGxlcjsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfQ09NQk9CT1hfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaAppbmRleCBiNWRlYmFjLi4wMjgxZDM3IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdC5oCkBAIC0xNSwxMzEgKzE1LDE3MSBAQAogY2xhc3MgSVBXTF9GaWxsZXJfTm90aWZ5OwogY2xhc3MgSVBXTF9TcGVsbENoZWNrOwogCi1jbGFzcyBJUFdMX0ZpbGxlcl9Ob3RpZnkKLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB+SVBXTF9GaWxsZXJfTm90aWZ5KCkgeyB9Ci0JdmlydHVhbCB2b2lkCQkJCQlRdWVyeVdoZXJlUG9wdXAodm9pZCogcFByaXZhdGVEYXRhLCBGWF9GTE9BVCBmUG9wdXBNaW4sRlhfRkxPQVQgZlBvcHVwTWF4LAotCQkJCQkJCQkJCWludDMyX3QgJiBuUmV0LCBGWF9GTE9BVCAmIGZQb3B1cFJldCkgPSAwOyAvL25SZXQ6ICgwOmJvdHRvbSAxOnRvcCkKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQmVmb3JlS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgaW50MzJfdCBuS2V5Q29kZSwKLQkJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJCWludCBuU2VsU3RhcnQsIGludCBuU2VsRW5kLAotCQkJCQkJCQkJCUZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQWZ0ZXJLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CitjbGFzcyBJUFdMX0ZpbGxlcl9Ob3RpZnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBXTF9GaWxsZXJfTm90aWZ5KCkge30KKyAgdmlydHVhbCB2b2lkIFF1ZXJ5V2hlcmVQb3B1cCgKKyAgICAgIHZvaWQqIHBQcml2YXRlRGF0YSwKKyAgICAgIEZYX0ZMT0FUIGZQb3B1cE1pbiwKKyAgICAgIEZYX0ZMT0FUIGZQb3B1cE1heCwKKyAgICAgIGludDMyX3QmIG5SZXQsCisgICAgICBGWF9GTE9BVCYgZlBvcHVwUmV0KSA9IDA7ICAvLyBuUmV0OiAoMDpib3R0b20gMTp0b3ApCisgIHZpcnR1YWwgdm9pZCBPbkJlZm9yZUtleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TZWxFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgPSAwOworICB2aXJ0dWFsIHZvaWQgT25BZnRlcktleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUHJpdmF0ZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCQlPblBvcHVwUHJlT3Blbih2b2lkKiBwUHJpdmF0ZURhdGEsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJT25Qb3B1cFBvc3RPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblBvcHVwUHJlT3Blbih2b2lkKiBwUHJpdmF0ZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblBvcHVwUG9zdE9wZW4odm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSA9IDA7CiB9OwogCi1jbGFzcyBDUFdMX0VkaXQgOiBwdWJsaWMgQ1BXTF9FZGl0Q3RybCwgcHVibGljIElGWF9FZGl0X09wck5vdGlmeQotewotcHVibGljOgotCUNQV0xfRWRpdCgpOwotCXZpcnR1YWwgfkNQV0xfRWRpdCgpOworY2xhc3MgQ1BXTF9FZGl0IDogcHVibGljIENQV0xfRWRpdEN0cmwsIHB1YmxpYyBJRlhfRWRpdF9PcHJOb3RpZnkgeworIHB1YmxpYzoKKyAgQ1BXTF9FZGl0KCk7CisgIHZpcnR1YWwgfkNQV0xfRWRpdCgpOwogCi1wdWJsaWM6Ci0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQkJT25EZXN0cm95KCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkNyZWF0ZWQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKLQl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRDbGllbnRSZWN0KCkgY29uc3Q7CisgcHVibGljOgorICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgT25EZXN0cm95KCk7CisgIHZpcnR1YWwgdm9pZCBPbkNyZWF0ZWQoKTsKKyAgdmlydHVhbCB2b2lkIFJlUG9zQ2hpbGRXbmQoKTsKKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0Q2xpZW50UmVjdCgpIGNvbnN0OwogCi0JdmlydHVhbCB2b2lkCQkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyAgdmlydHVhbCB2b2lkIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSk7CisgIHZpcnR1YWwgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25EYmxDbGsoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldEZvY3VzUmVjdCgpIGNvbnN0OworICB2aXJ0dWFsIENQREZfUmVjdCBHZXRGb2N1c1JlY3QoKSBjb25zdDsKIAotcHVibGljOgotCXZvaWQJCQkJCQkJU2V0QWxpZ25Gb3JtYXRIKFBXTF9FRElUX0FMSUdORk9STUFUX0ggbkZvcm1hdCA9IFBFQUhfTEVGVCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsJLy8wOmxlZnQgMTpyaWdodCAyOm1pZGRsZQotCXZvaWQJCQkJCQkJU2V0QWxpZ25Gb3JtYXRWKFBXTF9FRElUX0FMSUdORk9STUFUX1YgbkZvcm1hdCA9IFBFQVZfVE9QLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwkvLzA6dG9wIDE6Ym90dG9tIDI6Y2VudGVyCisgcHVibGljOgorICB2b2lkIFNldEFsaWduRm9ybWF0SChQV0xfRURJVF9BTElHTkZPUk1BVF9IIG5Gb3JtYXQgPSBQRUFIX0xFRlQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7ICAvLyAwOmxlZnQgMTpyaWdodCAyOm1pZGRsZQorICB2b2lkIFNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQgPSBQRUFWX1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsgIC8vIDA6dG9wIDE6Ym90dG9tIDI6Y2VudGVyCiAKLQl2b2lkCQkJCQkJCVNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkpOwotCXZvaWQJCQkJCQkJU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhcik7CisgIHZvaWQgU2V0Q2hhckFycmF5KGludDMyX3QgbkNoYXJBcnJheSk7CisgIHZvaWQgU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhcik7CiAKLQl2b2lkCQkJCQkJCVNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQlTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKKyAgdm9pZCBTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworICB2b2lkIFNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwogCi0Jdm9pZAkJCQkJCQlTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisgIHZvaWQgU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwogCi0Jdm9pZAkJCQkJCQlFbmFibGVTcGVsbENoZWNrKEZYX0JPT0wgYkVuYWJsZWQpOworICB2b2lkIEVuYWJsZVNwZWxsQ2hlY2soRlhfQk9PTCBiRW5hYmxlZCk7CiAKLQlGWF9CT09MCQkJCQkJCUNhblNlbGVjdEFsbCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJQ2FuQ2xlYXIoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUNhbkNvcHkoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUNhbkN1dCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJQ2FuUGFzdGUoKSBjb25zdDsKKyAgRlhfQk9PTCBDYW5TZWxlY3RBbGwoKSBjb25zdDsKKyAgRlhfQk9PTCBDYW5DbGVhcigpIGNvbnN0OworICBGWF9CT09MIENhbkNvcHkoKSBjb25zdDsKKyAgRlhfQk9PTCBDYW5DdXQoKSBjb25zdDsKKyAgRlhfQk9PTCBDYW5QYXN0ZSgpIGNvbnN0OwogCi0JdmlydHVhbCB2b2lkCQkJCQlDb3B5VGV4dCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJUGFzdGVUZXh0KCk7Ci0JdmlydHVhbCB2b2lkIAkJCQkJQ3V0VGV4dCgpOworICB2aXJ0dWFsIHZvaWQgQ29weVRleHQoKTsKKyAgdmlydHVhbCB2b2lkIFBhc3RlVGV4dCgpOworICB2aXJ0dWFsIHZvaWQgQ3V0VGV4dCgpOwogCi0JdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiBjc1RleHQpOwotCXZvaWQJCQkJCQkJUmVwbGFjZVNlbChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KTsKKyAgdmlydHVhbCB2b2lkIFNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCk7CisgIHZvaWQgUmVwbGFjZVNlbChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KTsKIAotCUNGWF9CeXRlU3RyaW5nCQkJCQlHZXRUZXh0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpIGNvbnN0OwotCUNGWF9CeXRlU3RyaW5nCQkJCQlHZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KSBjb25zdDsKLQlDRlhfQnl0ZVN0cmluZwkJCQkJR2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpIGNvbnN0OworICBDRlhfQnl0ZVN0cmluZyBHZXRUZXh0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCkgY29uc3Q7CisgIENGWF9CeXRlU3RyaW5nIEdldENhcmV0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCkgY29uc3Q7CisgIENGWF9CeXRlU3RyaW5nIEdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpIGNvbnN0OwogCi0JRlhfQk9PTAkJCQkJCQlJc1RleHRGdWxsKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNUZXh0RnVsbCgpIGNvbnN0OwogCi0Jc3RhdGljIEZYX0ZMT0FUCQkJCQlHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ1BERl9SZWN0JiByY1BsYXRlLCBpbnQzMl90IG5DaGFyQXJyYXkpOworICBzdGF0aWMgRlhfRkxPQVQgR2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY1BsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJBcnJheSk7CiAKLQl2b2lkCQkJCQkJCVNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpIHttX3BGaWxsZXJOb3RpZnkgPSBwTm90aWZ5O30KKyAgdm9pZCBTZXRGaWxsZXJOb3RpZnkoSVBXTF9GaWxsZXJfTm90aWZ5KiBwTm90aWZ5KSB7CisgICAgbV9wRmlsbGVyTm90aWZ5ID0gcE5vdGlmeTsKKyAgfQogCi0Jdm9pZAkJCQkJCQlHZW5lcmF0ZVBhZ2VPYmplY3RzKENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywKLQkJCQkJCQkJCQljb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9UZXh0T2JqZWN0Kj4mIE9iakFycmF5KTsKLQl2b2lkCQkJCQkJCUdlbmVyYXRlUGFnZU9iamVjdHMoQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmplY3RzLAotCQkJCQkJCQkJCWNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0KTsKKyAgdm9pZCBHZW5lcmF0ZVBhZ2VPYmplY3RzKENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9UZXh0T2JqZWN0Kj4mIE9iakFycmF5KTsKKyAgdm9pZCBHZW5lcmF0ZVBhZ2VPYmplY3RzKENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0KTsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJT25TZXRGb2N1cygpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25LaWxsRm9jdXMoKTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBPblNldEZvY3VzKCk7CisgIHZpcnR1YWwgdm9pZCBPbktpbGxGb2N1cygpOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25JbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25CYWNrU3BhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25EZWxldGUoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25DbGVhcihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlPblNldFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25JbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQWRkVW5kbyhJRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBPbkluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7CisgIHZpcnR1YWwgdm9pZCBPbkluc2VydFJldHVybihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpOworICB2aXJ0dWFsIHZvaWQgT25CYWNrU3BhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKTsKKyAgdmlydHVhbCB2b2lkIE9uRGVsZXRlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7CisgIHZpcnR1YWwgdm9pZCBPbkNsZWFyKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKTsKKyAgdmlydHVhbCB2b2lkIE9uU2V0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKTsKKyAgdmlydHVhbCB2b2lkIE9uSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKTsKKyAgdmlydHVhbCB2b2lkIE9uQWRkVW5kbyhJRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKTsKIAotcHJpdmF0ZToKLQlDUFZUX1dvcmRSYW5nZQkJCQkJR2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkCQkJCQlTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KTsKLQlGWF9CT09MCQkJCQkJCUlzVlNjcm9sbEJhclZpc2libGUoKSBjb25zdDsKLQl2b2lkCQkJCQkJCVNldFBhcmFtQnlGbGFnKCk7CisgcHJpdmF0ZToKKyAgQ1BWVF9Xb3JkUmFuZ2UgR2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KTsKKyAgRlhfQk9PTCBJc1ZTY3JvbGxCYXJWaXNpYmxlKCkgY29uc3Q7CisgIHZvaWQgU2V0UGFyYW1CeUZsYWcoKTsKIAotCUZYX0ZMT0FUCQkJCQkJR2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKGludDMyX3QgbkNoYXJBcnJheSk7Ci0JQ1BERl9Qb2ludAkJCQkJCUdldFdvcmRSaWdodEJvdHRvbVBvaW50KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cFdvcmQpOworICBGWF9GTE9BVCBHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoaW50MzJfdCBuQ2hhckFycmF5KTsKKyAgQ1BERl9Qb2ludCBHZXRXb3JkUmlnaHRCb3R0b21Qb2ludChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BXb3JkKTsKIAotCUNQVlRfV29yZFJhbmdlCQkJCQlDb21iaW5lV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjEsIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpOwotCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLQlDUFZUX1dvcmRSYW5nZQkJCQkJR2V0TGF0aW5Xb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRBcmFiaWNXb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotCUNQVlRfV29yZFJhbmdlCQkJCQlHZXRTYW1lV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBGWF9CT09MIGJMYXRpbiwgRlhfQk9PTCBiQXJhYmljKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUmFuZ2UgQ29tYmluZVdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpOworICBDUFZUX1dvcmRSYW5nZSBHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OworICBDUFZUX1dvcmRSYW5nZSBHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUmFuZ2UgR2V0QXJhYmljV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICBDUFZUX1dvcmRSYW5nZSBHZXRTYW1lV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxhdGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBcmFiaWMpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlBanVzdEFyYWJpY1dvcmRzKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cik7Ci1wdWJsaWM6Ci0JRlhfQk9PTAkJCQkJCQlJc1Byb2NlZWR0b09uQ2hhcihGWF9XT1JEIG5LZXlDb2RlLCBGWF9EV09SRCBuRmxhZyk7Ci1wcml2YXRlOgotCUlQV0xfRmlsbGVyX05vdGlmeSoJCQkJbV9wRmlsbGVyTm90aWZ5OwotCUlQV0xfU3BlbGxDaGVjayoJCQkJbV9wU3BlbGxDaGVjazsKLQlGWF9CT09MCQkJCQkJCW1fYkZvY3VzOwotCUNQREZfUmVjdAkJCQkJCW1fcmNPbGRXaW5kb3c7Ci1wdWJsaWM6Ci0Jdm9pZAkJCQkJCQlBdHRhY2hGRkxEYXRhKHZvaWQqIHBEYXRhKSB7bV9wRm9ybUZpbGxlciA9IHBEYXRhO30KLXByaXZhdGU6Ci0Jdm9pZCoJCQkJCQkJbV9wRm9ybUZpbGxlcjsKKyAgdm9pZCBBanVzdEFyYWJpY1dvcmRzKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cik7CisKKyBwdWJsaWM6CisgIEZYX0JPT0wgSXNQcm9jZWVkdG9PbkNoYXIoRlhfV09SRCBuS2V5Q29kZSwgRlhfRFdPUkQgbkZsYWcpOworCisgcHJpdmF0ZToKKyAgSVBXTF9GaWxsZXJfTm90aWZ5KiBtX3BGaWxsZXJOb3RpZnk7CisgIElQV0xfU3BlbGxDaGVjayogbV9wU3BlbGxDaGVjazsKKyAgRlhfQk9PTCBtX2JGb2N1czsKKyAgQ1BERl9SZWN0IG1fcmNPbGRXaW5kb3c7CisKKyBwdWJsaWM6CisgIHZvaWQgQXR0YWNoRkZMRGF0YSh2b2lkKiBwRGF0YSkgeyBtX3BGb3JtRmlsbGVyID0gcERhdGE7IH0KKworIHByaXZhdGU6CisgIHZvaWQqIG1fcEZvcm1GaWxsZXI7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0VESVRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oCmluZGV4IDI3M2IzODQuLjc4NGVjNjEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaApAQCAtMTgsMTU5ICsxOCwxNzIgQEAKIGNsYXNzIElQV0xfRWRpdF9Ob3RpZnk7CiBzdHJ1Y3QgQ1BWVF9Xb3JkUGxhY2U7CiAKLWVudW0gUFdMX0VESVRfQUxJR05GT1JNQVRfSAotewotCVBFQUhfTEVGVCA9IDAsCi0JUEVBSF9NSURETEUsCi0JUEVBSF9SSUdIVAorZW51bSBQV0xfRURJVF9BTElHTkZPUk1BVF9IIHsgUEVBSF9MRUZUID0gMCwgUEVBSF9NSURETEUsIFBFQUhfUklHSFQgfTsKKworZW51bSBQV0xfRURJVF9BTElHTkZPUk1BVF9WIHsgUEVBVl9UT1AgPSAwLCBQRUFWX0NFTlRFUiwgUEVBVl9CT1RUT00gfTsKKworY2xhc3MgSVBXTF9FZGl0X05vdGlmeSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUFdMX0VkaXRfTm90aWZ5KCkge30KKyAgLy8gd2hlbiB0aGUgcG9zaXRpb24gb2YgY2FyZXQgaXMgY2hhbmdlZCBpbiBlZGl0CisgIHZpcnR1YWwgdm9pZCBPbkNhcmV0TW92ZShpbnQzMl90IHgxLCBpbnQzMl90IHkxLCBpbnQzMl90IHgyLCBpbnQzMl90IHkyKSB7fQorICB2aXJ0dWFsIHZvaWQgT25Db250ZW50Q2hhbmdlKGNvbnN0IENQREZfUmVjdCYgcmNDb250ZW50KSB7fQorICAvLyBPcHJUeXBlOiAwIEluc2VydFdvcmQKKyAgLy8gMSBJbnNlcnRSZXR1cm4KKyAgLy8gMiBCYWNrU3BhY2UKKyAgLy8gMyBEZWxldGUKKyAgLy8gNCBDbGVhcgorICAvLyA1IEluc2VydFRleHQKKyAgLy8gNiBTZXRUZXh0CisgIHZpcnR1YWwgdm9pZCBPbkluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkge30KKyAgdmlydHVhbCB2b2lkIE9uSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkge30KKyAgdmlydHVhbCB2b2lkIE9uQmFja1NwYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkge30KKyAgdmlydHVhbCB2b2lkIE9uRGVsZXRlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkge30KKyAgdmlydHVhbCB2b2lkIE9uQ2xlYXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpIHt9CisgIHZpcnR1YWwgdm9pZCBPbkluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkge30KKyAgdmlydHVhbCB2b2lkIE9uU2V0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSB7fQorICB2aXJ0dWFsIHZvaWQgT25BZGRVbmRvKENQV0xfRWRpdCogcEVkaXQpIHt9CiB9OwogCi1lbnVtIFBXTF9FRElUX0FMSUdORk9STUFUX1YKLXsKLQlQRUFWX1RPUCA9IDAsCi0JUEVBVl9DRU5URVIsCi0JUEVBVl9CT1RUT00KLX07CitjbGFzcyBDUFdMX0VkaXRDdHJsIDogcHVibGljIENQV0xfV25kLCBwdWJsaWMgSUZYX0VkaXRfTm90aWZ5IHsKKyAgZnJpZW5kIGNsYXNzIENQV0xfRWRpdF9Ob3RpZnk7CiAKLWNsYXNzIElQV0xfRWRpdF9Ob3RpZnkKLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB+SVBXTF9FZGl0X05vdGlmeSgpIHsgfQotCS8vd2hlbiB0aGUgcG9zaXRpb24gb2YgY2FyZXQgaXMgY2hhbmdlZCBpbiBlZGl0Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkNhcmV0TW92ZShpbnQzMl90IHgxLCBpbnQzMl90IHkxLCBpbnQzMl90IHgyLCBpbnQzMl90IHkyKSB7fQotCXZpcnR1YWwgdm9pZAkJCQkJT25Db250ZW50Q2hhbmdlKGNvbnN0IENQREZfUmVjdCYgcmNDb250ZW50KXt9Ci0JLy9PcHJUeXBlOiAwIEluc2VydFdvcmQKLQkvLzEgSW5zZXJ0UmV0dXJuCi0JLy8yIEJhY2tTcGFjZQotCS8vMyBEZWxldGUKLQkvLzQgQ2xlYXIKLQkvLzUgSW5zZXJ0VGV4dAotCS8vNiBTZXRUZXh0Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2Upe30KLQl2aXJ0dWFsIHZvaWQJCQkJCU9uSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKXt9Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkJhY2tTcGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSl7fQotCXZpcnR1YWwgdm9pZAkJCQkJT25EZWxldGUoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2Upe30KLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQ2xlYXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2Upe30KLQl2aXJ0dWFsIHZvaWQJCQkJCU9uSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSl7fQotCXZpcnR1YWwgdm9pZAkJCQkJT25TZXRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKXt9Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkFkZFVuZG8oQ1BXTF9FZGl0KiBwRWRpdCkge30KLX07CisgcHVibGljOgorICBDUFdMX0VkaXRDdHJsKCk7CisgIHZpcnR1YWwgfkNQV0xfRWRpdEN0cmwoKTsKIAotY2xhc3MgQ1BXTF9FZGl0Q3RybCA6IHB1YmxpYyBDUFdMX1duZCwgcHVibGljIElGWF9FZGl0X05vdGlmeQotewotCWZyaWVuZCBjbGFzcyBDUFdMX0VkaXRfTm90aWZ5OworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApOworICB2aXJ0dWFsIHZvaWQgT25DcmVhdGVkKCk7CiAKLXB1YmxpYzoKLQlDUFdMX0VkaXRDdHJsKCk7Ci0JdmlydHVhbCB+Q1BXTF9FZGl0Q3RybCgpOworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCB2b2lkIE9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSA9IDApOwogCi1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkNyZWF0ZWQoKTsKKyAgdmlydHVhbCB2b2lkIENyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApOworICB2aXJ0dWFsIHZvaWQgUmVQb3NDaGlsZFduZCgpOworICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0OwogCi0JdmlydHVhbCBGWF9CT09MCQkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtID0gMCwgaW50cHRyX3QgbFBhcmFtID0gMCk7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KTsKIAotCXZpcnR1YWwgdm9pZAkJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCXZpcnR1YWwgdm9pZAkJCQkJUmVQb3NDaGlsZFduZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBDb3B5VGV4dCgpOworICB2aXJ0dWFsIHZvaWQgUGFzdGVUZXh0KCk7CisgIHZpcnR1YWwgdm9pZCBDdXRUZXh0KCk7CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCk7CisgIENQREZfUmVjdCBHZXRDb250ZW50UmVjdCgpIGNvbnN0OworICB2b2lkIEdldENhcmV0UG9zKGludDMyX3QmIHgsIGludDMyX3QmIHkpIGNvbnN0OworICBGWF9CT09MIElzTW9kaWZpZWQoKSBjb25zdDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJQ29weVRleHQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVBhc3RlVGV4dCgpOwotCXZpcnR1YWwgdm9pZCAJCQkJCUN1dFRleHQoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0OworICB2b2lkIFNldFNlbChpbnQzMl90IG5TdGFydENoYXIsIGludDMyX3QgbkVuZENoYXIpOworICB2b2lkIEdldFNlbChpbnQzMl90JiBuU3RhcnRDaGFyLCBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3Q7CisgIHZvaWQgR2V0VGV4dFJhbmdlKGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblN0YXJ0Q2hhciwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0OworICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KGludDMyX3QmIG5TdGFydENoYXIsIGludDMyX3QmIG5FbmRDaGFyKSBjb25zdDsKKyAgdm9pZCBDbGVhcigpOworICB2b2lkIFNlbGVjdEFsbCgpOwogCi0JQ1BERl9SZWN0CQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdDsKLQl2b2lkCQkJCQkJCUdldENhcmV0UG9zKGludDMyX3QmIHgsIGludDMyX3QmIHkpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OworICBpbnQzMl90IEdldENhcmV0KCkgY29uc3Q7CisgIHZvaWQgU2V0Q2FyZXQoaW50MzJfdCBuUG9zKTsKKyAgaW50MzJfdCBHZXRUb3RhbFdvcmRzKCkgY29uc3Q7CiAKLQlDRlhfV2lkZVN0cmluZwkJCQkJR2V0VGV4dCgpIGNvbnN0OwotCXZvaWQJCQkJCQkJU2V0U2VsKGludDMyX3QgblN0YXJ0Q2hhcixpbnQzMl90IG5FbmRDaGFyKTsKLQl2b2lkCQkJCQkJCUdldFNlbChpbnQzMl90ICYgblN0YXJ0Q2hhciwgaW50MzJfdCAmIG5FbmRDaGFyICkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQlHZXRUZXh0UmFuZ2UoY29uc3QgQ1BERl9SZWN0JiByZWN0LCBpbnQzMl90ICYgblN0YXJ0Q2hhciwgaW50MzJfdCAmIG5FbmRDaGFyKSBjb25zdDsKLQlDRlhfV2lkZVN0cmluZwkJCQkJR2V0VGV4dChpbnQzMl90ICYgblN0YXJ0Q2hhciwgaW50MzJfdCAmIG5FbmRDaGFyKSBjb25zdDsKLQl2b2lkCQkJCQkJCUNsZWFyKCk7Ci0Jdm9pZAkJCQkJCQlTZWxlY3RBbGwoKTsKKyAgdm9pZCBQYWludCgpOwogCi0JaW50MzJfdAkJCQkJCUdldENhcmV0KCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQlTZXRDYXJldChpbnQzMl90IG5Qb3MpOwotCWludDMyX3QJCQkJCQlHZXRUb3RhbFdvcmRzKCkgY29uc3Q7CisgIHZvaWQgRW5hYmxlUmVmcmVzaChGWF9CT09MIGJSZWZyZXNoKTsKKyAgQ1BERl9Qb2ludCBHZXRTY3JvbGxQb3MoKSBjb25zdDsKKyAgdm9pZCBTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0Jdm9pZAkJCQkJCQlQYWludCgpOworICB2b2lkIFNldEVkaXROb3RpZnkoSVBXTF9FZGl0X05vdGlmeSogcE5vdGlmeSkgeyBtX3BFZGl0Tm90aWZ5ID0gcE5vdGlmeTsgfQogCi0Jdm9pZAkJCQkJCQlFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpOwotCUNQREZfUG9pbnQJCQkJCQlHZXRTY3JvbGxQb3MoKSBjb25zdDsKLQl2b2lkCQkJCQkJCVNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZvaWQgU2V0Q2hhclNldCh1aW50OF90IG5DaGFyU2V0KSB7IG1fbkNoYXJTZXQgPSBuQ2hhclNldDsgfQorICBpbnQzMl90IEdldENoYXJTZXQoKSBjb25zdDsKIAotCXZvaWQJCQkJCQkJU2V0RWRpdE5vdGlmeShJUFdMX0VkaXRfTm90aWZ5KiBwTm90aWZ5KSB7bV9wRWRpdE5vdGlmeSA9IHBOb3RpZnk7fQorICB2b2lkIFNldENvZGVQYWdlKGludDMyX3QgbkNvZGVQYWdlKSB7IG1fbkNvZGVQYWdlID0gbkNvZGVQYWdlOyB9CisgIGludDMyX3QgR2V0Q29kZVBhZ2UoKSBjb25zdCB7IHJldHVybiBtX25Db2RlUGFnZTsgfQogCi0Jdm9pZAkJCQkJCQlTZXRDaGFyU2V0KHVpbnQ4X3QgbkNoYXJTZXQpe21fbkNoYXJTZXQgPSBuQ2hhclNldDt9Ci0JaW50MzJfdAkJCQkJCUdldENoYXJTZXQoKSBjb25zdDsKKyAgQ1BERl9Gb250KiBHZXRDYXJldEZvbnQoKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0Q2FyZXRGb250U2l6ZSgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlTZXRDb2RlUGFnZShpbnQzMl90IG5Db2RlUGFnZSl7bV9uQ29kZVBhZ2UgPSBuQ29kZVBhZ2U7fQotCWludDMyX3QJCQkJCQlHZXRDb2RlUGFnZSgpIGNvbnN0IHtyZXR1cm4gbV9uQ29kZVBhZ2U7fQorICBGWF9CT09MIENhblVuZG8oKSBjb25zdDsKKyAgRlhfQk9PTCBDYW5SZWRvKCkgY29uc3Q7CisgIHZvaWQgUmVkbygpOworICB2b2lkIFVuZG8oKTsKIAotCUNQREZfRm9udCAqCQkJCQkJR2V0Q2FyZXRGb250KCkgY29uc3Q7Ci0JRlhfRkxPQVQJCQkJCQlHZXRDYXJldEZvbnRTaXplKCkgY29uc3Q7CisgIHZvaWQgU2V0UmVhZHlUb0lucHV0KCk7CiAKLQlGWF9CT09MCQkJCQkJCUNhblVuZG8oKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUNhblJlZG8oKSBjb25zdDsKLQl2b2lkCQkJCQkJCVJlZG8oKTsKLQl2b2lkCQkJCQkJCVVuZG8oKTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KTsKIAotCXZvaWQJCQkJCQkJU2V0UmVhZHlUb0lucHV0KCk7Ci1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQlTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KTsKKyAgdmlydHVhbCB2b2lkIEluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5DaGFyc2V0KTsKKyAgdmlydHVhbCB2b2lkIEluc2VydFJldHVybigpOworICB2aXJ0dWFsIHZvaWQgSW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KTsKIAotCXZpcnR1YWwgdm9pZAkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQpOwotCXZpcnR1YWwgdm9pZAkJCQkJSW5zZXJ0UmV0dXJuKCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiBjc1RleHQpOworICB2aXJ0dWFsIHZvaWQgU2V0Q3Vyc29yKCk7CisgIEZYX0JPT0wgSXNXbmRIb3JWKCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldEN1cnNvcigpOwotCUZYX0JPT0wJCQkJCQkJSXNXbmRIb3JWKCk7CisgIHZvaWQgRGVsZXRlKCk7CisgIHZvaWQgQmFja3NwYWNlKCk7CiAKLQl2b2lkCQkJCQkJCURlbGV0ZSgpOwotCXZvaWQJCQkJCQkJQmFja3NwYWNlKCk7CisgcHJvdGVjdGVkOgorICB2b2lkIEdldENhcmV0SW5mbyhDUERGX1BvaW50JiBwdEhlYWQsIENQREZfUG9pbnQmIHB0Rm9vdCkgY29uc3Q7CisgIHZvaWQgU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdEhlYWQsCisgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRGb290KTsKIAotcHJvdGVjdGVkOgotCXZvaWQJCQkJCQkJR2V0Q2FyZXRJbmZvKENQREZfUG9pbnQgJiBwdEhlYWQsIENQREZfUG9pbnQgJiBwdEZvb3QpIGNvbnN0OwotCXZvaWQJCQkJCQkJU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwgY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCk7CisgIHZvaWQgU2V0RWRpdENhcmV0KEZYX0JPT0wgYlZpc2libGUpOwogCi0Jdm9pZAkJCQkJCQlTZXRFZGl0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgSU9uU2V0U2Nyb2xsSW5mb1goRlhfRkxPQVQgZlBsYXRlTWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBsYXRlTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTbWFsbFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQmlnU3RlcCkge30KKyAgdmlydHVhbCB2b2lkIElPblNldFNjcm9sbEluZm9ZKEZYX0ZMT0FUIGZQbGF0ZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQbGF0ZU1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU21hbGxTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJpZ1N0ZXApOworICB2aXJ0dWFsIHZvaWQgSU9uU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCkge30KKyAgdmlydHVhbCB2b2lkIElPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpOworICB2aXJ0dWFsIHZvaWQgSU9uU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0SGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0Rm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisgIHZpcnR1YWwgdm9pZCBJT25DYXJldENoYW5nZShjb25zdCBDUFZUX1NlY1Byb3BzJiBzZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiB3b3JkUHJvcHMpOworICB2aXJ0dWFsIHZvaWQgSU9uQ29udGVudENoYW5nZShjb25zdCBDUERGX1JlY3QmIHJjQ29udGVudCk7CisgIHZpcnR1YWwgdm9pZCBJT25JbnZhbGlkYXRlUmVjdChDUERGX1JlY3QqIHBSZWN0KTsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJSU9uU2V0U2Nyb2xsSW5mb1goRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmQ29udGVudE1pbiwgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCl7fQotCXZpcnR1YWwgdm9pZAkJCQkJSU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmQ29udGVudE1pbiwgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlJT25TZXRTY3JvbGxQb3NYKEZYX0ZMT0FUIGZ4KXt9Ci0JdmlydHVhbCB2b2lkCQkJCQlJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUlPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCxjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOwotCXZpcnR1YWwgdm9pZAkJCQkJSU9uQ2FyZXRDaGFuZ2UoY29uc3QgQ1BWVF9TZWNQcm9wcyAmIHNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIHdvcmRQcm9wcyk7Ci0JdmlydHVhbCB2b2lkCQkJCQlJT25Db250ZW50Q2hhbmdlKGNvbnN0IENQREZfUmVjdCYgcmNDb250ZW50KTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUlPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCAqIHBSZWN0KTsKKyBwcml2YXRlOgorICB2b2lkIENyZWF0ZUVkaXRDYXJldChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKIAotcHJpdmF0ZToKLQl2b2lkCQkJCQkJCUNyZWF0ZUVkaXRDYXJldChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CisgcHJvdGVjdGVkOgorICBJRlhfRWRpdCogbV9wRWRpdDsKKyAgQ1BXTF9DYXJldCogbV9wRWRpdENhcmV0OworICBGWF9CT09MIG1fYk1vdXNlRG93bjsKKyAgSVBXTF9FZGl0X05vdGlmeSogbV9wRWRpdE5vdGlmeTsKIAotcHJvdGVjdGVkOgotCUlGWF9FZGl0KgkJCQkJCW1fcEVkaXQ7Ci0JQ1BXTF9DYXJldCoJCQkJCQltX3BFZGl0Q2FyZXQ7Ci0JRlhfQk9PTAkJCQkJCQltX2JNb3VzZURvd247Ci0JSVBXTF9FZGl0X05vdGlmeSoJCQkJbV9wRWRpdE5vdGlmeTsKLQotcHJpdmF0ZToKLQlpbnQzMl90CQkJCQkJbV9uQ2hhclNldDsKLQlpbnQzMl90CQkJCQkJbV9uQ29kZVBhZ2U7CisgcHJpdmF0ZToKKyAgaW50MzJfdCBtX25DaGFyU2V0OworICBpbnQzMl90IG1fbkNvZGVQYWdlOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9FRElUQ1RSTF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oCmluZGV4IDU2MmQ1ZGYuLjBmNTEyNGMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Gb250TWFwLmgKQEAgLTEzLDExOCArMTMsMTI3IEBACiBjbGFzcyBDUERGX0RvY3VtZW50OwogY2xhc3MgSUZYX1N5c3RlbUhhbmRsZXI7CiAKLXN0cnVjdCBDUFdMX0ZvbnRNYXBfRGF0YQotewotCUNQREZfRm9udCoJCQlwRm9udDsKLQlpbnQzMl90CQkJbkNoYXJzZXQ7Ci0JQ0ZYX0J5dGVTdHJpbmcJCXNGb250TmFtZTsKK3N0cnVjdCBDUFdMX0ZvbnRNYXBfRGF0YSB7CisgIENQREZfRm9udCogcEZvbnQ7CisgIGludDMyX3QgbkNoYXJzZXQ7CisgIENGWF9CeXRlU3RyaW5nIHNGb250TmFtZTsKIH07CiAKLXN0cnVjdCBDUFdMX0ZvbnRNYXBfTmF0aXZlCi17Ci0JaW50MzJfdAkJCW5DaGFyc2V0OwotCUNGWF9CeXRlU3RyaW5nCQlzRm9udE5hbWU7CitzdHJ1Y3QgQ1BXTF9Gb250TWFwX05hdGl2ZSB7CisgIGludDMyX3QgbkNoYXJzZXQ7CisgIENGWF9CeXRlU3RyaW5nIHNGb250TmFtZTsKIH07CiAKICNpZm5kZWYgQU5TSV9DSEFSU0VUCiAKLSNkZWZpbmUgQU5TSV9DSEFSU0VUICAgICAgICAgICAgMAotI2RlZmluZSBERUZBVUxUX0NIQVJTRVQgICAgICAgICAxCi0jZGVmaW5lIFNZTUJPTF9DSEFSU0VUICAgICAgICAgIDIKLSNkZWZpbmUgU0hJRlRKSVNfQ0hBUlNFVCAgICAgICAgMTI4Ci0jZGVmaW5lIEhBTkdFVUxfQ0hBUlNFVCAgICAgICAgIDEyOQotI2RlZmluZSBIQU5HVUxfQ0hBUlNFVCAgICAgICAgICAxMjkKLSNkZWZpbmUgR0IyMzEyX0NIQVJTRVQgICAgICAgICAgMTM0Ci0jZGVmaW5lIENISU5FU0VCSUc1X0NIQVJTRVQgICAgIDEzNgotI2RlZmluZSBPRU1fQ0hBUlNFVCAgICAgICAgICAgICAyNTUKLSNkZWZpbmUgSk9IQUJfQ0hBUlNFVCAgICAgICAgICAgMTMwCi0jZGVmaW5lIEhFQlJFV19DSEFSU0VUICAgICAgICAgIDE3NwotI2RlZmluZSBBUkFCSUNfQ0hBUlNFVCAgICAgICAgICAxNzgKLSNkZWZpbmUgR1JFRUtfQ0hBUlNFVCAgICAgICAgICAgMTYxCi0jZGVmaW5lIFRVUktJU0hfQ0hBUlNFVCAgICAgICAgIDE2MgotI2RlZmluZSBWSUVUTkFNRVNFX0NIQVJTRVQgICAgICAxNjMKLSNkZWZpbmUgVEhBSV9DSEFSU0VUICAgICAgICAgICAgMjIyCi0jZGVmaW5lIEVBU1RFVVJPUEVfQ0hBUlNFVCAgICAgIDIzOAotI2RlZmluZSBSVVNTSUFOX0NIQVJTRVQgICAgICAgICAyMDQKLSNkZWZpbmUgQkFMVElDX0NIQVJTRVQgICAgICAgICAgMTg2CisjZGVmaW5lIEFOU0lfQ0hBUlNFVCAwCisjZGVmaW5lIERFRkFVTFRfQ0hBUlNFVCAxCisjZGVmaW5lIFNZTUJPTF9DSEFSU0VUIDIKKyNkZWZpbmUgU0hJRlRKSVNfQ0hBUlNFVCAxMjgKKyNkZWZpbmUgSEFOR0VVTF9DSEFSU0VUIDEyOQorI2RlZmluZSBIQU5HVUxfQ0hBUlNFVCAxMjkKKyNkZWZpbmUgR0IyMzEyX0NIQVJTRVQgMTM0CisjZGVmaW5lIENISU5FU0VCSUc1X0NIQVJTRVQgMTM2CisjZGVmaW5lIE9FTV9DSEFSU0VUIDI1NQorI2RlZmluZSBKT0hBQl9DSEFSU0VUIDEzMAorI2RlZmluZSBIRUJSRVdfQ0hBUlNFVCAxNzcKKyNkZWZpbmUgQVJBQklDX0NIQVJTRVQgMTc4CisjZGVmaW5lIEdSRUVLX0NIQVJTRVQgMTYxCisjZGVmaW5lIFRVUktJU0hfQ0hBUlNFVCAxNjIKKyNkZWZpbmUgVklFVE5BTUVTRV9DSEFSU0VUIDE2MworI2RlZmluZSBUSEFJX0NIQVJTRVQgMjIyCisjZGVmaW5lIEVBU1RFVVJPUEVfQ0hBUlNFVCAyMzgKKyNkZWZpbmUgUlVTU0lBTl9DSEFSU0VUIDIwNAorI2RlZmluZSBCQUxUSUNfQ0hBUlNFVCAxODYKIAogI2VuZGlmCiAKLWNsYXNzIENQV0xfRm9udE1hcCA6IHB1YmxpYyBJRlhfRWRpdF9Gb250TWFwCi17Ci1wdWJsaWM6Ci0JQ1BXTF9Gb250TWFwKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcik7Ci0JdmlydHVhbCB+Q1BXTF9Gb250TWFwKCk7CitjbGFzcyBDUFdMX0ZvbnRNYXAgOiBwdWJsaWMgSUZYX0VkaXRfRm9udE1hcCB7CisgcHVibGljOgorICBDUFdMX0ZvbnRNYXAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKTsKKyAgdmlydHVhbCB+Q1BXTF9Gb250TWFwKCk7CiAKLQl2aXJ0dWFsIENQREZfRm9udCoJCQkJCQkJR2V0UERGRm9udChpbnQzMl90IG5Gb250SW5kZXgpOwotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCQkJCQlHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KTsKLQl2aXJ0dWFsIGludDMyX3QJCQkJCQkJR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCk7Ci0JdmlydHVhbCBpbnQzMl90CQkJCQkJCUNoYXJDb2RlRnJvbVVuaWNvZGUoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpOwotCXZpcnR1YWwgaW50MzJfdAkJCQkJCQlDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KTsKKyAgdmlydHVhbCBDUERGX0ZvbnQqIEdldFBERkZvbnQoaW50MzJfdCBuRm9udEluZGV4KTsKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KTsKKyAgdmlydHVhbCBpbnQzMl90IEdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgpOworICB2aXJ0dWFsIGludDMyX3QgQ2hhckNvZGVGcm9tVW5pY29kZShpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCk7CisgIHZpcnR1YWwgaW50MzJfdCBDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KTsKIAotcHVibGljOgotCXZpcnR1YWwgdm9pZAkJCQkJCQkJSW5pdGlhbChjb25zdCBGWF9DSEFSKiBmb250bmFtZSA9IE5VTEwpOwotCXZvaWQJCQkJCQkJCQkJU2V0U3lzdGVtSGFuZGxlcihJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIEluaXRpYWwoY29uc3QgRlhfQ0hBUiogZm9udG5hbWUgPSBOVUxMKTsKKyAgdm9pZCBTZXRTeXN0ZW1IYW5kbGVyKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcik7CiAKLQlpbnQzMl90CQkJCQkJCQkJR2V0Rm9udE1hcENvdW50KCkgY29uc3Q7Ci0JY29uc3QgQ1BXTF9Gb250TWFwX0RhdGEqCQkJCQlHZXRGb250TWFwRGF0YShpbnQzMl90IG5JbmRleCkgY29uc3Q7CisgIGludDMyX3QgR2V0Rm9udE1hcENvdW50KCkgY29uc3Q7CisgIGNvbnN0IENQV0xfRm9udE1hcF9EYXRhKiBHZXRGb250TWFwRGF0YShpbnQzMl90IG5JbmRleCkgY29uc3Q7CiAKLXB1YmxpYzoKLQlzdGF0aWMgaW50MzJfdAkJCQkJCQkJR2V0TmF0aXZlQ2hhcnNldCgpOwotCUNGWF9CeXRlU3RyaW5nCQkJCQkJCQlHZXROYXRpdmVGb250TmFtZShpbnQzMl90IG5DaGFyc2V0KTsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbnQzMl90IEdldE5hdGl2ZUNoYXJzZXQoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmF0aXZlRm9udE5hbWUoaW50MzJfdCBuQ2hhcnNldCk7CiAKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCQlHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChpbnQzMl90IG5DaGFyc2V0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldERlZmF1bHRGb250QnlDaGFyc2V0KGludDMyX3QgbkNoYXJzZXQpOwogCi0JQ1BERl9Gb250KgkJCQkJCQkJCUFkZEZvbnRUb0RvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIHVpbnQ4X3QgbkNoYXJzZXQpOwotCXN0YXRpYyBGWF9CT09MCQkJCQkJCQlJc1N0YW5kYXJkRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKTsKLQlDUERGX0ZvbnQqCQkJCQkJCQkJQWRkU3RhbmRhcmRGb250KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpOwotCUNQREZfRm9udCoJCQkJCQkJCQlBZGRTeXN0ZW1Gb250KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsCi0JCQkJCQkJCQkJCQkJdWludDhfdCBuQ2hhcnNldCk7CisgIENQREZfRm9udCogQWRkRm9udFRvRG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbkNoYXJzZXQpOworICBzdGF0aWMgRlhfQk9PTCBJc1N0YW5kYXJkRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKTsKKyAgQ1BERl9Gb250KiBBZGRTdGFuZGFyZEZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSk7CisgIENQREZfRm9udCogQWRkU3lzdGVtRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbkNoYXJzZXQpOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCBDUERGX0ZvbnQqCQkJCQkJCUZpbmRGb250U2FtZUNoYXJzZXQoQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsIGludDMyX3QgbkNoYXJzZXQpOwotCXZpcnR1YWwgdm9pZAkJCQkJCQkJQWRkZWRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzKTsKLQlGWF9CT09MCQkJCQkJCQkJCUtub3dXb3JkKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkKTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgQ1BERl9Gb250KiBGaW5kRm9udFNhbWVDaGFyc2V0KENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0KTsKKyAgdmlydHVhbCB2b2lkIEFkZGVkRm9udChDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcyk7CisgIEZYX0JPT0wgS25vd1dvcmQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpOwogCi0JdmlydHVhbCBDUERGX0RvY3VtZW50KgkJCQkJCUdldERvY3VtZW50KCk7CisgIHZpcnR1YWwgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKTsKIAotCXZvaWQJCQkJCQkJCQkJRW1wdHkoKTsKLQlpbnQzMl90CQkJCQkJCQkJR2V0Rm9udEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIGludDMyX3QgbkNoYXJzZXQsIEZYX0JPT0wgYkZpbmQpOwotCWludDMyX3QJCQkJCQkJCQlHZXRQV0xGb250SW5kZXgoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5DaGFyc2V0KTsKLQlpbnQzMl90CQkJCQkJCQkJQWRkRm9udERhdGEoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsIGludDMyX3QgbkNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQpOworICB2b2lkIEVtcHR5KCk7CisgIGludDMyX3QgR2V0Rm9udEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQpOworICBpbnQzMl90IEdldFBXTEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQpOworICBpbnQzMl90IEFkZEZvbnREYXRhKENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCk7CiAKLQlDRlhfQnl0ZVN0cmluZwkJCQkJCQkJRW5jb2RlRm9udEFsaWFzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIGludDMyX3QgbkNoYXJzZXQpOwotCUNGWF9CeXRlU3RyaW5nCQkJCQkJCQlFbmNvZGVGb250QWxpYXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSk7CisgIENGWF9CeXRlU3RyaW5nIEVuY29kZUZvbnRBbGlhcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCk7CisgIENGWF9CeXRlU3RyaW5nIEVuY29kZUZvbnRBbGlhcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKTsKIAotcHJpdmF0ZToKLQlDRlhfQnl0ZVN0cmluZwkJCQkJCQkJR2V0Rm9udE5hbWUoaW50MzJfdCBuRm9udEluZGV4KTsKLQlpbnQzMl90CQkJCQkJCQkJRmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCk7CisgcHJpdmF0ZToKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Rm9udE5hbWUoaW50MzJfdCBuRm9udEluZGV4KTsKKyAgaW50MzJfdCBGaW5kRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQpOwogCi0JQ0ZYX0J5dGVTdHJpbmcJCQkJCQkJCUdldE5hdGl2ZUZvbnQoaW50MzJfdCBuQ2hhcnNldCk7CisgIENGWF9CeXRlU3RyaW5nIEdldE5hdGl2ZUZvbnQoaW50MzJfdCBuQ2hhcnNldCk7CiAKLXB1YmxpYzoKLSAgICB1c2luZyBDaGFyc2V0Rm9udE1hcCA9IEZQREZfQ2hhcnNldEZvbnRNYXA7Ci0Jc3RhdGljIGNvbnN0IENoYXJzZXRGb250TWFwCQkJCQlkZWZhdWx0VFRGTWFwW107CisgcHVibGljOgorICB1c2luZyBDaGFyc2V0Rm9udE1hcCA9IEZQREZfQ2hhcnNldEZvbnRNYXA7CisgIHN0YXRpYyBjb25zdCBDaGFyc2V0Rm9udE1hcCBkZWZhdWx0VFRGTWFwW107CiAKLXByb3RlY3RlZDoKLQlDRlhfQXJyYXlUZW1wbGF0ZTxDUFdMX0ZvbnRNYXBfRGF0YSo+CQltX2FEYXRhOwotCUNGWF9BcnJheVRlbXBsYXRlPENQV0xfRm9udE1hcF9OYXRpdmUqPgkJbV9hTmF0aXZlRm9udDsKKyBwcm90ZWN0ZWQ6CisgIENGWF9BcnJheVRlbXBsYXRlPENQV0xfRm9udE1hcF9EYXRhKj4gbV9hRGF0YTsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BXTF9Gb250TWFwX05hdGl2ZSo+IG1fYU5hdGl2ZUZvbnQ7CiAKLXByaXZhdGU6Ci0JQ1BERl9Eb2N1bWVudCoJCQkJCQkJCW1fcFBERkRvYzsKLQlJRlhfU3lzdGVtSGFuZGxlcioJCQkJCQkJbV9wU3lzdGVtSGFuZGxlcjsKKyBwcml2YXRlOgorICBDUERGX0RvY3VtZW50KiBtX3BQREZEb2M7CisgIElGWF9TeXN0ZW1IYW5kbGVyKiBtX3BTeXN0ZW1IYW5kbGVyOwogfTsKIAotY2xhc3MgQ1BXTF9Eb2NGb250TWFwIDogcHVibGljIENQV0xfRm9udE1hcAotewotcHVibGljOgotCUNQV0xfRG9jRm9udE1hcChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsIENQREZfRG9jdW1lbnQqIHBBdHRhY2hlZERvYyk7Ci0JdmlydHVhbCB+Q1BXTF9Eb2NGb250TWFwKCk7CitjbGFzcyBDUFdMX0RvY0ZvbnRNYXAgOiBwdWJsaWMgQ1BXTF9Gb250TWFwIHsKKyBwdWJsaWM6CisgIENQV0xfRG9jRm9udE1hcChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwQXR0YWNoZWREb2MpOworICB2aXJ0dWFsIH5DUFdMX0RvY0ZvbnRNYXAoKTsKIAotCXZpcnR1YWwgQ1BERl9Eb2N1bWVudCoJCQkJCQlHZXREb2N1bWVudCgpOworICB2aXJ0dWFsIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCk7CiAKLXByaXZhdGU6Ci0JQ1BERl9Eb2N1bWVudCoJCQkJCQkJCW1fcEF0dGFjaGVkRG9jOworIHByaXZhdGU6CisgIENQREZfRG9jdW1lbnQqIG1fcEF0dGFjaGVkRG9jOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9GT05UTUFQX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uLmgKaW5kZXggY2ZmNGU4Yy4uNzE4M2YwMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbi5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb24uaApAQCAtMTAsNTEgKzEwLDQ4IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgIlBXTF9XbmQuaCIKIAotY2xhc3MgQ1BXTF9JbWFnZSA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfSW1hZ2UoKTsKLQl2aXJ0dWFsIH5DUFdMX0ltYWdlKCk7CitjbGFzcyBDUFdMX0ltYWdlIDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfSW1hZ2UoKTsKKyAgdmlydHVhbCB+Q1BXTF9JbWFnZSgpOwogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJCUdldEltYWdlQXBwU3RyZWFtKCk7CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0SW1hZ2VBcHBTdHJlYW0oKTsKIAotCXZpcnR1YWwgdm9pZAkJCQkJR2V0U2NhbGUoRlhfRkxPQVQgJiBmSFNjYWxlLEZYX0ZMT0FUICYgZlZTY2FsZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlHZXRJbWFnZU9mZnNldChGWF9GTE9BVCAmIHgsRlhfRkxPQVQgJiB5KTsKLQl2aXJ0dWFsIENQREZfU3RyZWFtICoJCQlHZXRQREZTdHJlYW0oKTsKKyAgdmlydHVhbCB2b2lkIEdldFNjYWxlKEZYX0ZMT0FUJiBmSFNjYWxlLCBGWF9GTE9BVCYgZlZTY2FsZSk7CisgIHZpcnR1YWwgdm9pZCBHZXRJbWFnZU9mZnNldChGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpOworICB2aXJ0dWFsIENQREZfU3RyZWFtKiBHZXRQREZTdHJlYW0oKTsKIAotcHVibGljOgotCXZvaWQJCQkJCQkJU2V0UERGU3RyZWFtKENQREZfU3RyZWFtKiBwU3RyZWFtKTsKLQl2b2lkCQkJCQkJCUdldEltYWdlU2l6ZShGWF9GTE9BVCAmIGZXaWR0aCxGWF9GTE9BVCAmIGZIZWlnaHQpOwotCUNQREZfTWF0cml4CQkJCQkJR2V0SW1hZ2VNYXRyaXgoKTsKLQlDRlhfQnl0ZVN0cmluZwkJCQkJR2V0SW1hZ2VBbGlhcygpOwotCXZvaWQJCQkJCQkJU2V0SW1hZ2VBbGlhcyhjb25zdCBGWF9DSEFSKiBzSW1hZ2VBbGlhcyk7CisgcHVibGljOgorICB2b2lkIFNldFBERlN0cmVhbShDUERGX1N0cmVhbSogcFN0cmVhbSk7CisgIHZvaWQgR2V0SW1hZ2VTaXplKEZYX0ZMT0FUJiBmV2lkdGgsIEZYX0ZMT0FUJiBmSGVpZ2h0KTsKKyAgQ1BERl9NYXRyaXggR2V0SW1hZ2VNYXRyaXgoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0SW1hZ2VBbGlhcygpOworICB2b2lkIFNldEltYWdlQWxpYXMoY29uc3QgRlhfQ0hBUiogc0ltYWdlQWxpYXMpOwogCi1wcm90ZWN0ZWQ6Ci0JQ1BERl9TdHJlYW0qCQkJCQltX3BQREZTdHJlYW07Ci0JQ0ZYX0J5dGVTdHJpbmcJCQkJCW1fc0ltYWdlQWxpYXM7CisgcHJvdGVjdGVkOgorICBDUERGX1N0cmVhbSogbV9wUERGU3RyZWFtOworICBDRlhfQnl0ZVN0cmluZyBtX3NJbWFnZUFsaWFzOwogfTsKIAotY2xhc3MgQ1BXTF9JY29uIDogcHVibGljIENQV0xfSW1hZ2UKLXsKLXB1YmxpYzoKLQlDUFdMX0ljb24oKTsKLQl2aXJ0dWFsIH5DUFdMX0ljb24oKTsKK2NsYXNzIENQV0xfSWNvbiA6IHB1YmxpYyBDUFdMX0ltYWdlIHsKKyBwdWJsaWM6CisgIENQV0xfSWNvbigpOworICB2aXJ0dWFsIH5DUFdMX0ljb24oKTsKIAotCXZpcnR1YWwgQ1BERl9JY29uRml0ICoJCQlHZXRJY29uRml0KCl7cmV0dXJuIG1fcEljb25GaXQ7fTsKKyAgdmlydHVhbCBDUERGX0ljb25GaXQqIEdldEljb25GaXQoKSB7IHJldHVybiBtX3BJY29uRml0OyB9OwogCi0JdmlydHVhbCB2b2lkCQkJCQlHZXRTY2FsZShGWF9GTE9BVCAmIGZIU2NhbGUsRlhfRkxPQVQgJiBmVlNjYWxlKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUdldEltYWdlT2Zmc2V0KEZYX0ZMT0FUICYgeCxGWF9GTE9BVCAmIHkpOworICB2aXJ0dWFsIHZvaWQgR2V0U2NhbGUoRlhfRkxPQVQmIGZIU2NhbGUsIEZYX0ZMT0FUJiBmVlNjYWxlKTsKKyAgdmlydHVhbCB2b2lkIEdldEltYWdlT2Zmc2V0KEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSk7CiAKLQlpbnQzMl90CQkJCQkJR2V0U2NhbGVNZXRob2QoKTsKLQlGWF9CT09MCQkJCQkJCUlzUHJvcG9ydGlvbmFsU2NhbGUoKTsKLQl2b2lkCQkJCQkJCUdldEljb25Qb3NpdGlvbihGWF9GTE9BVCAmIGZMZWZ0LCBGWF9GTE9BVCAmIGZCb3R0b20pOwotCUZYX0JPT0wJCQkJCQkJR2V0Rml0dGluZ0JvdW5kcygpOworICBpbnQzMl90IEdldFNjYWxlTWV0aG9kKCk7CisgIEZYX0JPT0wgSXNQcm9wb3J0aW9uYWxTY2FsZSgpOworICB2b2lkIEdldEljb25Qb3NpdGlvbihGWF9GTE9BVCYgZkxlZnQsIEZYX0ZMT0FUJiBmQm90dG9tKTsKKyAgRlhfQk9PTCBHZXRGaXR0aW5nQm91bmRzKCk7CiAKLQl2b2lkCQkJCQkJCVNldEljb25GaXQoQ1BERl9JY29uRml0ICogcEljb25GaXQpe21fcEljb25GaXQgPSBwSWNvbkZpdDt9OworICB2b2lkIFNldEljb25GaXQoQ1BERl9JY29uRml0KiBwSWNvbkZpdCkgeyBtX3BJY29uRml0ID0gcEljb25GaXQ7IH07CiAKLXByaXZhdGU6Ci0JQ1BERl9JY29uRml0ICoJCQkJCW1fcEljb25GaXQ7CisgcHJpdmF0ZToKKyAgQ1BERl9JY29uRml0KiBtX3BJY29uRml0OwogfTsKIAotCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0lDT05fSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb25MaXN0LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uTGlzdC5oCmluZGV4IGI4YmMzZDIuLjMwYTEyZGMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb25MaXN0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuaApAQCAtMTcsMTEyICsxNywxMTQgQEAKIGNsYXNzIENQV0xfSWNvbkxpc3Q7CiBjbGFzcyBDUFdMX0xhYmVsOwogCi1jbGFzcyBJUFdMX0ljb25MaXN0X05vdGlmeQotewotcHVibGljOgotICAgICAgICB2aXJ0dWFsIH5JUFdMX0ljb25MaXN0X05vdGlmeSgpIHsgfQotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZUxpc3RTZWxDaGFuZ2VkKGludDMyX3Qgbkl0ZW1JbmRleCkgPSAwOworY2xhc3MgSVBXTF9JY29uTGlzdF9Ob3RpZnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBXTF9JY29uTGlzdF9Ob3RpZnkoKSB7fQorICB2aXJ0dWFsIHZvaWQgT25Ob3RlTGlzdFNlbENoYW5nZWQoaW50MzJfdCBuSXRlbUluZGV4KSA9IDA7CiB9OwogCi1jbGFzcyBDUFdMX0ljb25MaXN0X0l0ZW0gOiBwdWJsaWMgQ1BXTF9XbmQKLXsKLXB1YmxpYzoKLQlDUFdMX0ljb25MaXN0X0l0ZW0oKTsKLQl2aXJ0dWFsIH5DUFdMX0ljb25MaXN0X0l0ZW0oKTsKK2NsYXNzIENQV0xfSWNvbkxpc3RfSXRlbSA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX0ljb25MaXN0X0l0ZW0oKTsKKyAgdmlydHVhbCB+Q1BXTF9JY29uTGlzdF9JdGVtKCk7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlSZVBvc0NoaWxkV25kKCk7CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdmlydHVhbCB2b2lkIFJlUG9zQ2hpbGRXbmQoKTsKIAotCXZvaWQJCQkJCQkJCVNldFNlbGVjdChGWF9CT09MIGJTZWxlY3RlZCk7Ci0JRlhfQk9PTAkJCQkJCQkJSXNTZWxlY3RlZCgpIGNvbnN0OwotCXZvaWQJCQkJCQkJCVNldERhdGEodm9pZCogcERhdGEpOwotCXZvaWQJCQkJCQkJCVNldEljb24oaW50MzJfdCBuSWNvbkluZGV4KTsKLQl2b2lkCQkJCQkJCQlTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwotCXZvaWQJCQkJCQkJCVNldEljb25GaWxsQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwotCUNGWF9XaWRlU3RyaW5nCQkJCQkJR2V0VGV4dCgpIGNvbnN0OworICB2b2lkIFNldFNlbGVjdChGWF9CT09MIGJTZWxlY3RlZCk7CisgIEZYX0JPT0wgSXNTZWxlY3RlZCgpIGNvbnN0OworICB2b2lkIFNldERhdGEodm9pZCogcERhdGEpOworICB2b2lkIFNldEljb24oaW50MzJfdCBuSWNvbkluZGV4KTsKKyAgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOworICB2b2lkIFNldEljb25GaWxsQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCQlHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEl0ZW1IZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpOworICB2aXJ0dWFsIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbkVuYWJsZWQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbkRpc2FibGVkKCk7CisgIHZpcnR1YWwgdm9pZCBPbkVuYWJsZWQoKTsKKyAgdmlydHVhbCB2b2lkIE9uRGlzYWJsZWQoKTsKIAotcHJpdmF0ZToKLQlpbnQzMl90CQkJCQkJCW1fbkljb25JbmRleDsKLQl2b2lkKgkJCQkJCQkJbV9wRGF0YTsKLQlGWF9CT09MCQkJCQkJCQltX2JTZWxlY3RlZDsKLQlDUFdMX0xhYmVsKgkJCQkJCQltX3BUZXh0OwotCUNQV0xfQ29sb3IJCQkJCQkJbV9jckljb247CisgcHJpdmF0ZToKKyAgaW50MzJfdCBtX25JY29uSW5kZXg7CisgIHZvaWQqIG1fcERhdGE7CisgIEZYX0JPT0wgbV9iU2VsZWN0ZWQ7CisgIENQV0xfTGFiZWwqIG1fcFRleHQ7CisgIENQV0xfQ29sb3IgbV9jckljb247CiB9OwogCi1jbGFzcyBDUFdMX0ljb25MaXN0X0NvbnRlbnQgOiBwdWJsaWMgQ1BXTF9MaXN0Q3RybAotewotcHVibGljOgotCUNQV0xfSWNvbkxpc3RfQ29udGVudChpbnQzMl90IG5MaXN0Q291bnQpOwotCXZpcnR1YWwgfkNQV0xfSWNvbkxpc3RfQ29udGVudCgpOworY2xhc3MgQ1BXTF9JY29uTGlzdF9Db250ZW50IDogcHVibGljIENQV0xfTGlzdEN0cmwgeworIHB1YmxpYzoKKyAgQ1BXTF9JY29uTGlzdF9Db250ZW50KGludDMyX3Qgbkxpc3RDb3VudCk7CisgIHZpcnR1YWwgfkNQV0xfSWNvbkxpc3RfQ29udGVudCgpOwogCi0Jdm9pZAkJCQkJCQkJU2V0U2VsZWN0KGludDMyX3QgbkluZGV4KTsKLQlpbnQzMl90CQkJCQkJCUdldFNlbGVjdCgpIGNvbnN0OwotCXZvaWQJCQkJCQkJCVNldE5vdGlmeShJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQkJU2V0TGlzdERhdGEoaW50MzJfdCBuSXRlbUluZGV4LCB2b2lkKiBwRGF0YSk7Ci0Jdm9pZAkJCQkJCQkJU2V0TGlzdEljb24oaW50MzJfdCBuSXRlbUluZGV4LCBpbnQzMl90IG5JY29uSW5kZXgpOwotCXZvaWQJCQkJCQkJCVNldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKLQl2b2lkCQkJCQkJCQlTZXRJY29uRmlsbENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJCUdldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKLQlJUFdMX0ljb25MaXN0X05vdGlmeSoJCQkJR2V0Tm90aWZ5KCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQkJU2Nyb2xsVG9JdGVtKGludDMyX3Qgbkl0ZW1JbmRleCk7CisgIHZvaWQgU2V0U2VsZWN0KGludDMyX3QgbkluZGV4KTsKKyAgaW50MzJfdCBHZXRTZWxlY3QoKSBjb25zdDsKKyAgdm9pZCBTZXROb3RpZnkoSVBXTF9JY29uTGlzdF9Ob3RpZnkqIHBOb3RpZnkpOworICB2b2lkIEVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpOworICB2b2lkIFNldExpc3REYXRhKGludDMyX3Qgbkl0ZW1JbmRleCwgdm9pZCogcERhdGEpOworICB2b2lkIFNldExpc3RJY29uKGludDMyX3Qgbkl0ZW1JbmRleCwgaW50MzJfdCBuSWNvbkluZGV4KTsKKyAgdm9pZCBTZXRMaXN0U3RyaW5nKGludDMyX3Qgbkl0ZW1JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisgIHZvaWQgU2V0SWNvbkZpbGxDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CisgIENGWF9XaWRlU3RyaW5nIEdldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKyAgSVBXTF9JY29uTGlzdF9Ob3RpZnkqIEdldE5vdGlmeSgpIGNvbnN0OworICB2b2lkIFNjcm9sbFRvSXRlbShpbnQzMl90IG5JdGVtSW5kZXgpOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKIAotcHJpdmF0ZToKLQlDUFdMX0ljb25MaXN0X0l0ZW0qCQkJCQlHZXRMaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwotCXZvaWQJCQkJCQkJCVNlbGVjdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3QpOwotCWludDMyX3QJCQkJCQkJRmluZEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgcHJpdmF0ZToKKyAgQ1BXTF9JY29uTGlzdF9JdGVtKiBHZXRMaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworICB2b2lkIFNlbGVjdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3QpOworICBpbnQzMl90IEZpbmRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0JaW50MzJfdAkJCQkJCQkJbV9uU2VsZWN0SW5kZXg7Ci0JSVBXTF9JY29uTGlzdF9Ob3RpZnkqCQkJCW1fcE5vdGlmeTsKLQlGWF9CT09MCQkJCQkJCQltX2JFbmFibGVOb3RpZnk7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iTW91c2VEb3duOwotCWludDMyX3QJCQkJCQkJbV9uTGlzdENvdW50OworICBpbnQzMl90IG1fblNlbGVjdEluZGV4OworICBJUFdMX0ljb25MaXN0X05vdGlmeSogbV9wTm90aWZ5OworICBGWF9CT09MIG1fYkVuYWJsZU5vdGlmeTsKKyAgRlhfQk9PTCBtX2JNb3VzZURvd247CisgIGludDMyX3QgbV9uTGlzdENvdW50OwogfTsKIAotY2xhc3MgQ1BXTF9JY29uTGlzdCA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfSWNvbkxpc3QoaW50MzJfdCBuTGlzdENvdW50KTsKLQl2aXJ0dWFsIH5DUFdMX0ljb25MaXN0KCk7CitjbGFzcyBDUFdMX0ljb25MaXN0IDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfSWNvbkxpc3QoaW50MzJfdCBuTGlzdENvdW50KTsKKyAgdmlydHVhbCB+Q1BXTF9JY29uTGlzdCgpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZvaWQJCQkJCQkJCVNldFNlbGVjdChpbnQzMl90IG5JbmRleCk7Ci0Jdm9pZAkJCQkJCQkJU2V0VG9wSXRlbShpbnQzMl90IG5JbmRleCk7Ci0JaW50MzJfdAkJCQkJCQlHZXRTZWxlY3QoKSBjb25zdDsKLQl2b2lkCQkJCQkJCQlTZXROb3RpZnkoSVBXTF9JY29uTGlzdF9Ob3RpZnkqIHBOb3RpZnkpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpOwotCXZvaWQJCQkJCQkJCVNldExpc3REYXRhKGludDMyX3Qgbkl0ZW1JbmRleCwgdm9pZCogcERhdGEpOwotCXZvaWQJCQkJCQkJCVNldExpc3RJY29uKGludDMyX3Qgbkl0ZW1JbmRleCwgaW50MzJfdCBuSWNvbkluZGV4KTsKLQl2b2lkCQkJCQkJCQlTZXRMaXN0U3RyaW5nKGludDMyX3Qgbkl0ZW1JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0Jdm9pZAkJCQkJCQkJU2V0SWNvbkZpbGxDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCQlHZXRMaXN0U3RyaW5nKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Q7CisgIHZvaWQgU2V0U2VsZWN0KGludDMyX3QgbkluZGV4KTsKKyAgdm9pZCBTZXRUb3BJdGVtKGludDMyX3QgbkluZGV4KTsKKyAgaW50MzJfdCBHZXRTZWxlY3QoKSBjb25zdDsKKyAgdm9pZCBTZXROb3RpZnkoSVBXTF9JY29uTGlzdF9Ob3RpZnkqIHBOb3RpZnkpOworICB2b2lkIEVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpOworICB2b2lkIFNldExpc3REYXRhKGludDMyX3Qgbkl0ZW1JbmRleCwgdm9pZCogcERhdGEpOworICB2b2lkIFNldExpc3RJY29uKGludDMyX3Qgbkl0ZW1JbmRleCwgaW50MzJfdCBuSWNvbkluZGV4KTsKKyAgdm9pZCBTZXRMaXN0U3RyaW5nKGludDMyX3Qgbkl0ZW1JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisgIHZvaWQgU2V0SWNvbkZpbGxDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CisgIENGWF9XaWRlU3RyaW5nIEdldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJCU9uQ3JlYXRlZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgT25DcmVhdGVkKCk7CisgIHZpcnR1YWwgdm9pZCBSZVBvc0NoaWxkV25kKCk7CisgIHZpcnR1YWwgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSA9IDAsIGludHB0cl90IGxQYXJhbSA9IDApOworICB2aXJ0dWFsIHZvaWQgT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtID0gMCk7CiAKLXByaXZhdGU6Ci0JQ1BXTF9JY29uTGlzdF9Db250ZW50KgkJCQltX3BMaXN0Q29udGVudDsKLQlpbnQzMl90CQkJCQkJCW1fbkxpc3RDb3VudDsKKyBwcml2YXRlOgorICBDUFdMX0ljb25MaXN0X0NvbnRlbnQqIG1fcExpc3RDb250ZW50OworICBpbnQzMl90IG1fbkxpc3RDb3VudDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfSUNPTkxJU1RfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xhYmVsLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MYWJlbC5oCmluZGV4IDNkZjU0N2UuLmI2Y2I3ZjUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xhYmVsLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGFiZWwuaApAQCAtMTEsMzUgKzExLDM1IEBACiAKIGNsYXNzIElGWF9FZGl0OwogCi1jbGFzcyBDUFdMX0xhYmVsIDogcHVibGljIENQV0xfV25kCi17Ci1wdWJsaWM6Ci0JQ1BXTF9MYWJlbCgpOwotCXZpcnR1YWwgfkNQV0xfTGFiZWwoKTsKK2NsYXNzIENQV0xfTGFiZWwgOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9MYWJlbCgpOworICB2aXJ0dWFsIH5DUFdMX0xhYmVsKCk7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOwotCXZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0Rm9udFNpemUoKSBjb25zdDsKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0Rm9udFNpemUoKSBjb25zdDsKIAotCXZvaWQJCQkJCQkJU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJR2V0VGV4dCgpIGNvbnN0OwotCXZvaWQJCQkJCQkJU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhcik7Ci0Jdm9pZAkJCQkJCQlTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlKTsKLQl2b2lkCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKTsKLQlDUERGX1JlY3QJCQkJCQlHZXRDb250ZW50UmVjdCgpIGNvbnN0OwotCWludDMyX3QJCQkJCQlHZXRUb3RhbFdvcmRzKCk7Ci0JQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFRleHRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCkgY29uc3Q7CisgIHZvaWQgU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0OworICB2b2lkIFNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIpOworICB2b2lkIFNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUpOworICB2b2lkIFNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKTsKKyAgQ1BERl9SZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Q7CisgIGludDMyX3QgR2V0VG90YWxXb3JkcygpOworICBDRlhfQnl0ZVN0cmluZyBHZXRUZXh0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCkgY29uc3Q7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQ3JlYXRlZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwotCXZpcnR1YWwgdm9pZAkJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlSZVBvc0NoaWxkV25kKCk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgT25DcmVhdGVkKCk7CisgIHZpcnR1YWwgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyAgdmlydHVhbCB2b2lkIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSk7CisgIHZpcnR1YWwgdm9pZCBSZVBvc0NoaWxkV25kKCk7CiAKLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCQlTZXRQYXJhbUJ5RmxhZygpOworIHByaXZhdGU6CisgIHZvaWQgU2V0UGFyYW1CeUZsYWcoKTsKIAotCUlGWF9FZGl0KgkJCQkJCW1fcEVkaXQ7CisgIElGWF9FZGl0KiBtX3BFZGl0OwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9MQUJFTF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oCmluZGV4IDdjMzdmYjMuLmI5MzcyZWYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Qm94LmgKQEAgLTE1LDg5ICsxNSwxMDcgQEAKIGNsYXNzIENQV0xfTGlzdEJveDsKIGNsYXNzIElQV0xfRmlsbGVyX05vdGlmeTsKIAotY2xhc3MgQ1BXTF9MaXN0X05vdGlmeSA6IHB1YmxpYyBJRlhfTGlzdF9Ob3RpZnkKLXsKLXB1YmxpYzoKLQlDUFdMX0xpc3RfTm90aWZ5KENQV0xfTGlzdEJveCAqIHBMaXN0KTsKLQl2aXJ0dWFsIH5DUFdMX0xpc3RfTm90aWZ5KCk7CitjbGFzcyBDUFdMX0xpc3RfTm90aWZ5IDogcHVibGljIElGWF9MaXN0X05vdGlmeSB7CisgcHVibGljOgorICBDUFdMX0xpc3RfTm90aWZ5KENQV0xfTGlzdEJveCogcExpc3QpOworICB2aXJ0dWFsIH5DUFdMX0xpc3RfTm90aWZ5KCk7CiAKLQl2b2lkCQkJCQkJCUlPblNldFNjcm9sbEluZm9YKEZYX0ZMT0FUIGZQbGF0ZU1pbiwgRlhfRkxPQVQgZlBsYXRlTWF4LAotCQkJCQkJCQkJCQkJRlhfRkxPQVQgZkNvbnRlbnRNaW4sIEZYX0ZMT0FUIGZDb250ZW50TWF4LAotCQkJCQkJCQkJCQkJRlhfRkxPQVQgZlNtYWxsU3RlcCwgRlhfRkxPQVQgZkJpZ1N0ZXApe30KLQl2b2lkCQkJCQkJCUlPblNldFNjcm9sbEluZm9ZKEZYX0ZMT0FUIGZQbGF0ZU1pbiwgRlhfRkxPQVQgZlBsYXRlTWF4LAotCQkJCQkJCQkJCQkJRlhfRkxPQVQgZkNvbnRlbnRNaW4sIEZYX0ZMT0FUIGZDb250ZW50TWF4LAotCQkJCQkJCQkJCQkJRlhfRkxPQVQgZlNtYWxsU3RlcCwgRlhfRkxPQVQgZkJpZ1N0ZXApOwotCXZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCl7fQotCXZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSk7Ci0Jdm9pZAkJCQkJCQlJT25TZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKLQl2b2lkCQkJCQkJCUlPbkNhcmV0Q2hhbmdlKGNvbnN0IENQVlRfU2VjUHJvcHMgJiBzZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiB3b3JkUHJvcHMpOwotCXZvaWQJCQkJCQkJSU9uSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0ICogcFJlY3QpOworICB2b2lkIElPblNldFNjcm9sbEluZm9YKEZYX0ZMT0FUIGZQbGF0ZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGxhdGVNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNtYWxsU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQmlnU3RlcCkge30KKyAgdm9pZCBJT25TZXRTY3JvbGxJbmZvWShGWF9GTE9BVCBmUGxhdGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBsYXRlTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTbWFsbFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJpZ1N0ZXApOworICB2b2lkIElPblNldFNjcm9sbFBvc1goRlhfRkxPQVQgZngpIHt9CisgIHZvaWQgSU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSk7CisgIHZvaWQgSU9uU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdEhlYWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRGb290LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisgIHZvaWQgSU9uQ2FyZXRDaGFuZ2UoY29uc3QgQ1BWVF9TZWNQcm9wcyYgc2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIHdvcmRQcm9wcyk7CisgIHZvaWQgSU9uSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0KiBwUmVjdCk7CiAKLXByaXZhdGU6Ci0JQ1BXTF9MaXN0Qm94KgkJCQkJbV9wTGlzdDsKKyBwcml2YXRlOgorICBDUFdMX0xpc3RCb3gqIG1fcExpc3Q7CiB9OwogCi1jbGFzcyBDUFdMX0xpc3RCb3ggOiBwdWJsaWMgQ1BXTF9XbmQKLXsKLXB1YmxpYzoKLQlDUFdMX0xpc3RCb3goKTsKLQl2aXJ0dWFsIH5DUFdMX0xpc3RCb3goKTsKK2NsYXNzIENQV0xfTGlzdEJveCA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX0xpc3RCb3goKTsKKyAgdmlydHVhbCB+Q1BXTF9MaXN0Qm94KCk7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkNyZWF0ZWQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uRGVzdHJveSgpOwotCXZpcnR1YWwgdm9pZAkJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBPbkNyZWF0ZWQoKTsKKyAgdmlydHVhbCB2b2lkIE9uRGVzdHJveSgpOworICB2aXJ0dWFsIHZvaWQgR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKTsKKyAgdmlydHVhbCB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCB2b2lkCQkJCQlLaWxsRm9jdXMoKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCB2b2lkIEtpbGxGb2N1cygpOwogCi0JdmlydHVhbCB2b2lkCQkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJR2V0VGV4dCgpIGNvbnN0OwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldEZvY3VzUmVjdCgpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBPbk5vdGlmeShDUFdMX1duZCogcFduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKKyAgdmlydHVhbCB2b2lkIFJlUG9zQ2hpbGRXbmQoKTsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldEZvY3VzUmVjdCgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlPbk5vdGlmeVNlbENoYW5nZWQoRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCAmIGJFeGl0ICwgRlhfRFdPUkQgbkZsYWcpOworICB2b2lkIE9uTm90aWZ5U2VsQ2hhbmdlZChGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwogCi0Jdm9pZAkJCQkJCQlBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZyk7Ci0Jdm9pZAkJCQkJCQlTZXRUb3BWaXNpYmxlSW5kZXgoaW50MzJfdCBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCVNjcm9sbFRvTGlzdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCVJlc2V0Q29udGVudCgpOwotCXZvaWQJCQkJCQkJUmVzZXQoKTsKLQl2b2lkCQkJCQkJCVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpOwotCXZvaWQJCQkJCQkJU2V0Q2FyZXQoaW50MzJfdCBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCVNldEhvdmVyU2VsKEZYX0JPT0wgYkhvdmVyU2VsKTsKKyAgdm9pZCBBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZyk7CisgIHZvaWQgU2V0VG9wVmlzaWJsZUluZGV4KGludDMyX3Qgbkl0ZW1JbmRleCk7CisgIHZvaWQgU2Nyb2xsVG9MaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIFJlc2V0Q29udGVudCgpOworICB2b2lkIFJlc2V0KCk7CisgIHZvaWQgU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCk7CisgIHZvaWQgU2V0Q2FyZXQoaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBTZXRIb3ZlclNlbChGWF9CT09MIGJIb3ZlclNlbCk7CiAKLQlpbnQzMl90CQkJCQkJR2V0Q291bnQoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzTXVsdGlwbGVTZWwoKSBjb25zdDsKLQlpbnQzMl90CQkJCQkJR2V0Q2FyZXRJbmRleCgpIGNvbnN0OwotCWludDMyX3QJCQkJCQlHZXRDdXJTZWwoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzSXRlbVNlbGVjdGVkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Q7Ci0JaW50MzJfdAkJCQkJCUdldFRvcFZpc2libGVJbmRleCgpIGNvbnN0OwotCWludDMyX3QJCQkJCQlGaW5kTmV4dChpbnQzMl90IG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3Q7Ci0JQ1BERl9SZWN0CQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdDsKLQlGWF9GTE9BVAkJCQkJCUdldEZpcnN0SGVpZ2h0KCkgY29uc3Q7Ci0JQ1BERl9SZWN0CQkJCQkJR2V0TGlzdFJlY3QoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRDb3VudCgpIGNvbnN0OworICBGWF9CT09MIElzTXVsdGlwbGVTZWwoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRDYXJldEluZGV4KCkgY29uc3Q7CisgIGludDMyX3QgR2V0Q3VyU2VsKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKyAgaW50MzJfdCBHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdDsKKyAgaW50MzJfdCBGaW5kTmV4dChpbnQzMl90IG5JbmRleCwgRlhfV0NIQVIgbkNoYXIpIGNvbnN0OworICBDUERGX1JlY3QgR2V0Q29udGVudFJlY3QoKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0Rmlyc3RIZWlnaHQoKSBjb25zdDsKKyAgQ1BERl9SZWN0IEdldExpc3RSZWN0KCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCVNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpIHttX3BGaWxsZXJOb3RpZnkgPSBwTm90aWZ5O30KKyAgdm9pZCBTZXRGaWxsZXJOb3RpZnkoSVBXTF9GaWxsZXJfTm90aWZ5KiBwTm90aWZ5KSB7CisgICAgbV9wRmlsbGVyTm90aWZ5ID0gcE5vdGlmeTsKKyAgfQogCi1wcm90ZWN0ZWQ6Ci0JSUZYX0xpc3QqCQkJCQkJbV9wTGlzdDsKLQlDUFdMX0xpc3RfTm90aWZ5KgkJCQltX3BMaXN0Tm90aWZ5OwotCUZYX0JPT0wJCQkJCQkJbV9iTW91c2VEb3duOwotCUZYX0JPT0wJCQkJCQkJbV9iSG92ZXJTZWw7Ci0JSVBXTF9GaWxsZXJfTm90aWZ5KgkJCQltX3BGaWxsZXJOb3RpZnk7Ci1wdWJsaWM6Ci0Jdm9pZAkJCQkJCQlBdHRhY2hGRkxEYXRhKHZvaWQqIHBEYXRhKSB7bV9wRm9ybUZpbGxlciA9IHBEYXRhO30KLXByaXZhdGU6Ci0Jdm9pZCoJCQkJCQkJbV9wRm9ybUZpbGxlcjsKKyBwcm90ZWN0ZWQ6CisgIElGWF9MaXN0KiBtX3BMaXN0OworICBDUFdMX0xpc3RfTm90aWZ5KiBtX3BMaXN0Tm90aWZ5OworICBGWF9CT09MIG1fYk1vdXNlRG93bjsKKyAgRlhfQk9PTCBtX2JIb3ZlclNlbDsKKyAgSVBXTF9GaWxsZXJfTm90aWZ5KiBtX3BGaWxsZXJOb3RpZnk7CisKKyBwdWJsaWM6CisgIHZvaWQgQXR0YWNoRkZMRGF0YSh2b2lkKiBwRGF0YSkgeyBtX3BGb3JtRmlsbGVyID0gcERhdGE7IH0KKworIHByaXZhdGU6CisgIHZvaWQqIG1fcEZvcm1GaWxsZXI7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0xJU1RCT1hfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5oCmluZGV4IGMxMDdhMGMuLmNkOTA2OTIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuaApAQCAtOSwzOSArOSwzOSBAQAogCiAjaW5jbHVkZSAiUFdMX1duZC5oIgogCi1jbGFzcyBDUFdMX0xpc3RDdHJsIDogcHVibGljIENQV0xfV25kCi17Ci1wdWJsaWM6Ci0JQ1BXTF9MaXN0Q3RybCgpOwotCXZpcnR1YWwgfkNQV0xfTGlzdEN0cmwoKTsKK2NsYXNzIENQV0xfTGlzdEN0cmwgOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9MaXN0Q3RybCgpOworICB2aXJ0dWFsIH5DUFdMX0xpc3RDdHJsKCk7CiAKLQl2b2lkCQkJCQkJCQlTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCUNQREZfUG9pbnQJCQkJCQkJR2V0U2Nyb2xsUG9zKCkgY29uc3Q7Ci0JQ1BERl9SZWN0CQkJCQkJCUdldFNjcm9sbEFyZWEoKSBjb25zdDsKLQl2b2lkCQkJCQkJCQlTZXRJdGVtU3BhY2UoRlhfRkxPQVQgZlNwYWNlKTsKLQl2b2lkCQkJCQkJCQlTZXRUb3BTcGFjZShGWF9GTE9BVCBmU3BhY2UpOwotCXZvaWQJCQkJCQkJCVNldEJvdHRvbVNwYWNlKEZYX0ZMT0FUIGZTcGFjZSk7Ci0Jdm9pZAkJCQkJCQkJUmVzZXRGYWNlKCk7Ci0Jdm9pZAkJCQkJCQkJUmVzZXRDb250ZW50KGludDMyX3QgblN0YXJ0KTsKLQlpbnQzMl90CQkJCQkJCUdldEl0ZW1JbmRleChDUFdMX1duZCogcEl0ZW0pOwotCUZYX0ZMT0FUCQkJCQkJCUdldENvbnRlbnRzSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKTsKLQlDUERGX1BvaW50CQkJCQkJCUluVG9PdXQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OwotCUNQREZfUG9pbnQJCQkJCQkJT3V0VG9Jbihjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7Ci0JQ1BERl9SZWN0CQkJCQkJCUluVG9PdXQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdDsKLQlDUERGX1JlY3QJCQkJCQkJT3V0VG9Jbihjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0OworICB2b2lkIFNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIENQREZfUG9pbnQgR2V0U2Nyb2xsUG9zKCkgY29uc3Q7CisgIENQREZfUmVjdCBHZXRTY3JvbGxBcmVhKCkgY29uc3Q7CisgIHZvaWQgU2V0SXRlbVNwYWNlKEZYX0ZMT0FUIGZTcGFjZSk7CisgIHZvaWQgU2V0VG9wU3BhY2UoRlhfRkxPQVQgZlNwYWNlKTsKKyAgdm9pZCBTZXRCb3R0b21TcGFjZShGWF9GTE9BVCBmU3BhY2UpOworICB2b2lkIFJlc2V0RmFjZSgpOworICB2b2lkIFJlc2V0Q29udGVudChpbnQzMl90IG5TdGFydCk7CisgIGludDMyX3QgR2V0SXRlbUluZGV4KENQV0xfV25kKiBwSXRlbSk7CisgIEZYX0ZMT0FUIEdldENvbnRlbnRzSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKTsKKyAgQ1BERl9Qb2ludCBJblRvT3V0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgQ1BERl9Qb2ludCBPdXRUb0luKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgQ1BERl9SZWN0IEluVG9PdXQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdDsKKyAgQ1BERl9SZWN0IE91dFRvSW4oY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdDsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFJlUG9zQ2hpbGRXbmQoKTsKKyAgdmlydHVhbCB2b2lkIERyYXdDaGlsZEFwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCQkJUmVzZXRBbGwoRlhfQk9PTCBiTW92ZSxpbnQzMl90IG5TdGFydCk7CisgcHJpdmF0ZToKKyAgdm9pZCBSZXNldEFsbChGWF9CT09MIGJNb3ZlLCBpbnQzMl90IG5TdGFydCk7CiAKLQlDUERGX1JlY3QJCQkJCQkJbV9yY0NvbnRlbnQ7Ci0JQ1BERl9Qb2ludAkJCQkJCQltX3B0U2Nyb2xsOwotCUZYX0ZMT0FUCQkJCQkJCW1fZkl0ZW1TcGFjZTsKLQlGWF9GTE9BVAkJCQkJCQltX2ZUb3BTcGFjZTsKLQlGWF9GTE9BVAkJCQkJCQltX2ZCb3R0b21TcGFjZTsKKyAgQ1BERl9SZWN0IG1fcmNDb250ZW50OworICBDUERGX1BvaW50IG1fcHRTY3JvbGw7CisgIEZYX0ZMT0FUIG1fZkl0ZW1TcGFjZTsKKyAgRlhfRkxPQVQgbV9mVG9wU3BhY2U7CisgIEZYX0ZMT0FUIG1fZkJvdHRvbVNwYWNlOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9MSVNUQ1RSTF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTm90ZS5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTm90ZS5oCmluZGV4IDI5Yjc4NTcuLjRmMThmYTIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX05vdGUuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Ob3RlLmgKQEAgLTI4LDMzMyArMjgsMzQyIEBACiBjbGFzcyBJUFdMX05vdGVOb3RpZnk7CiBjbGFzcyBJUG9wdXBfTm90ZTsKIAotY2xhc3MgSVBXTF9Ob3RlTm90aWZ5Ci17Ci1wdWJsaWM6Ci0JdmlydHVhbCB+SVBXTF9Ob3RlTm90aWZ5KCkgeyB9Ci0JdmlydHVhbCB2b2lkCQkJCQkJT25Ob3RlTW92ZShjb25zdCBGWF9SRUNUJiBydFdpbikgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZVNob3coRlhfQk9PTCBiU2hvdykgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZUFjdGl2YXRlKEZYX0JPT0wgYkFjdGl2ZSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZUNsb3NlKCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uSXRlbUNyZWF0ZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uSXRlbURlbGV0ZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uU2V0QXV0aG9yTmFtZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uU2V0QmtDb2xvcihJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uU2V0Q29udGVudHMoSVBXTF9Ob3RlSXRlbSogcEl0ZW0pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPblNldERhdGVUaW1lKElQV0xfTm90ZUl0ZW0qIHBJdGVtKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJT25TZXRTdWJqZWN0TmFtZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uUG9wdXBNZW51KGludDMyX3QgeCwgaW50MzJfdCB5KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJT25Qb3B1cE1lbnUoSVBXTF9Ob3RlSXRlbSogcEl0ZW0sIGludDMyX3QgeCwgaW50MzJfdCB5KSA9IDA7CitjbGFzcyBJUFdMX05vdGVOb3RpZnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBXTF9Ob3RlTm90aWZ5KCkge30KKyAgdmlydHVhbCB2b2lkIE9uTm90ZU1vdmUoY29uc3QgRlhfUkVDVCYgcnRXaW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uTm90ZVNob3coRlhfQk9PTCBiU2hvdykgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Ob3RlQWN0aXZhdGUoRlhfQk9PTCBiQWN0aXZlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbk5vdGVDbG9zZSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uSXRlbUNyZWF0ZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25JdGVtRGVsZXRlKElQV0xfTm90ZUl0ZW0qIHBJdGVtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNldEF1dGhvck5hbWUoSVBXTF9Ob3RlSXRlbSogcEl0ZW0pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2V0QmtDb2xvcihJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TZXRDb250ZW50cyhJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TZXREYXRlVGltZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TZXRTdWJqZWN0TmFtZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Qb3B1cE1lbnUoaW50MzJfdCB4LCBpbnQzMl90IHkpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uUG9wdXBNZW51KElQV0xfTm90ZUl0ZW0qIHBJdGVtLCBpbnQzMl90IHgsIGludDMyX3QgeSkgPSAwOwogfTsKIAotY2xhc3MgSVBXTF9Ob3RlSGFuZGxlcgotewotcHVibGljOgotCXZpcnR1YWwgfklQV0xfTm90ZUhhbmRsZXIoKSB7IH0KLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGVDb2xvckNoYW5nZWQoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpID0gMDsKK2NsYXNzIElQV0xfTm90ZUhhbmRsZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBXTF9Ob3RlSGFuZGxlcigpIHt9CisgIHZpcnR1YWwgdm9pZCBPbk5vdGVDb2xvckNoYW5nZWQoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpID0gMDsKIH07CiAKLWNsYXNzIElQV0xfTm90ZUl0ZW0KLXsKLXB1YmxpYzoKLQl2aXJ0dWFsIH5JUFdMX05vdGVJdGVtKCkgeyB9Ci0JdmlydHVhbCB2b2lkCQkJCQkJU2V0UHJpdmF0ZURhdGEodm9pZCogcERhdGEpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRCa0NvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJU2V0U3ViamVjdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJU2V0QXV0aG9yTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXREYXRlVGltZShGWF9TWVNURU1USU1FIHRpbWUpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc0NvbnRlbnRzKSA9IDA7CitjbGFzcyBJUFdMX05vdGVJdGVtIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklQV0xfTm90ZUl0ZW0oKSB7fQorICB2aXJ0dWFsIHZvaWQgU2V0UHJpdmF0ZURhdGEodm9pZCogcERhdGEpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldEJrQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFN1YmplY3ROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0QXV0aG9yTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldERhdGVUaW1lKEZYX1NZU1RFTVRJTUUgdGltZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNDb250ZW50cykgPSAwOwogCi0JdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlDcmVhdGVTdWJJdGVtKCkgPSAwOwotCXZpcnR1YWwgaW50MzJfdAkJCQkJQ291bnRTdWJJdGVtcygpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qCQkJCUdldFN1Ykl0ZW1zKGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEZWxldGVTdWJJdGVtKElQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldEZvY3VzKCkgPSAwOworICB2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qIENyZWF0ZVN1Ykl0ZW0oKSA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFN1Ykl0ZW1zKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qIEdldFN1Ykl0ZW1zKGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIERlbGV0ZVN1Ykl0ZW0oSVBXTF9Ob3RlSXRlbSogcE5vdGVJdGVtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRGb2N1cygpID0gMDsKIAotCXZpcnR1YWwgSVBXTF9Ob3RlSXRlbSoJCQkJR2V0UGFyZW50SXRlbSgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIHZvaWQqCQkJCQkJR2V0UHJpdmF0ZURhdGEoKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQlHZXRBdXRob3JOYW1lKCkgY29uc3QgPSAwOwotCXZpcnR1YWwgQ1BXTF9Db2xvcgkJCQkJR2V0QmtDb2xvcigpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCUdldENvbnRlbnRzKCkgY29uc3QgPSAwOwotCXZpcnR1YWwgRlhfU1lTVEVNVElNRQkJCQlHZXREYXRlVGltZSgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCUdldFN1YmplY3ROYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qIEdldFBhcmVudEl0ZW0oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCogR2V0UHJpdmF0ZURhdGEoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0QXV0aG9yTmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUFdMX0NvbG9yIEdldEJrQ29sb3IoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0Q29udGVudHMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRlhfU1lTVEVNVElNRSBHZXREYXRlVGltZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRTdWJqZWN0TmFtZSgpIGNvbnN0ID0gMDsKIAotCXZpcnR1YWwgQ1BXTF9FZGl0KgkJCQkJR2V0RWRpdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUFdMX0VkaXQqIEdldEVkaXQoKSBjb25zdCA9IDA7CiB9OwogCi1jbGFzcyBDUFdMX05vdGVfSWNvbiA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfTm90ZV9JY29uKCk7Ci0JdmlydHVhbCB+Q1BXTF9Ob3RlX0ljb24oKTsKK2NsYXNzIENQV0xfTm90ZV9JY29uIDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfTm90ZV9JY29uKCk7CisgIHZpcnR1YWwgfkNQV0xfTm90ZV9JY29uKCk7CiAKLQl2b2lkCQkJCQkJCQlTZXRJY29uVHlwZShpbnQzMl90IG5UeXBlKTsKKyAgdm9pZCBTZXRJY29uVHlwZShpbnQzMl90IG5UeXBlKTsKIAotcHVibGljOgorIHB1YmxpYzoKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKLQotcHJpdmF0ZToKLQlpbnQzMl90CQkJCQkJCW1fblR5cGU7CisgcHJpdmF0ZToKKyAgaW50MzJfdCBtX25UeXBlOwogfTsKIAotY2xhc3MgQ1BXTF9Ob3RlX0Nsb3NlQm94IDogcHVibGljIENQV0xfQnV0dG9uCi17Ci1wdWJsaWM6Ci0JQ1BXTF9Ob3RlX0Nsb3NlQm94KCk7Ci0JdmlydHVhbCB+Q1BXTF9Ob3RlX0Nsb3NlQm94KCk7CitjbGFzcyBDUFdMX05vdGVfQ2xvc2VCb3ggOiBwdWJsaWMgQ1BXTF9CdXR0b24geworIHB1YmxpYzoKKyAgQ1BXTF9Ob3RlX0Nsb3NlQm94KCk7CisgIHZpcnR1YWwgfkNQV0xfTm90ZV9DbG9zZUJveCgpOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwogCi1wcml2YXRlOgotCUZYX0JPT0wJCQkJCQkJCW1fYk1vdXNlRG93bjsKKyBwcml2YXRlOgorICBGWF9CT09MIG1fYk1vdXNlRG93bjsKIH07CiAKLWNsYXNzIENQV0xfTm90ZV9MQkJveCA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfTm90ZV9MQkJveCgpOwotCXZpcnR1YWwgfkNQV0xfTm90ZV9MQkJveCgpOworY2xhc3MgQ1BXTF9Ob3RlX0xCQm94IDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfTm90ZV9MQkJveCgpOworICB2aXJ0dWFsIH5DUFdMX05vdGVfTEJCb3goKTsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIH07CiAKLWNsYXNzIENQV0xfTm90ZV9SQkJveCA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfTm90ZV9SQkJveCgpOwotCXZpcnR1YWwgfkNQV0xfTm90ZV9SQkJveCgpOworY2xhc3MgQ1BXTF9Ob3RlX1JCQm94IDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfTm90ZV9SQkJveCgpOworICB2aXJ0dWFsIH5DUFdMX05vdGVfUkJCb3goKTsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIH07CiAKLWNsYXNzIENQV0xfTm90ZV9FZGl0IDogcHVibGljIENQV0xfRWRpdAotewotcHVibGljOgotCUNQV0xfTm90ZV9FZGl0KCk7Ci0JdmlydHVhbCB+Q1BXTF9Ob3RlX0VkaXQoKTsKK2NsYXNzIENQV0xfTm90ZV9FZGl0IDogcHVibGljIENQV0xfRWRpdCB7CisgcHVibGljOgorICBDUFdMX05vdGVfRWRpdCgpOworICB2aXJ0dWFsIH5DUFdMX05vdGVfRWRpdCgpOwogCi0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYkVuYWJsZSkge21fYkVuYWJsZU5vdGlmeSA9IGJFbmFibGU7fQotCXZpcnR1YWwgRlhfRkxPQVQJCQkJCUdldEl0ZW1IZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpOwotCUZYX0ZMT0FUCQkJCQkJCUdldEl0ZW1MZWZ0TWFyZ2luKCk7Ci0JRlhfRkxPQVQJCQkJCQkJR2V0SXRlbVJpZ2h0TWFyZ2luKCk7CisgIHZvaWQgRW5hYmxlTm90aWZ5KEZYX0JPT0wgYkVuYWJsZSkgeyBtX2JFbmFibGVOb3RpZnkgPSBiRW5hYmxlOyB9CisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0SXRlbUhlaWdodChGWF9GTE9BVCBmTGltaXRXaWR0aCk7CisgIEZYX0ZMT0FUIEdldEl0ZW1MZWZ0TWFyZ2luKCk7CisgIEZYX0ZMT0FUIEdldEl0ZW1SaWdodE1hcmdpbigpOwogCi0JdmlydHVhbCB2b2lkCQkJCQkJU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KTsKKyAgdmlydHVhbCB2b2lkIFNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCk7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlSZVBvc0NoaWxkV25kKCk7Ci0JdmlydHVhbCB2b2lkCQkJCQkJT25TZXRGb2N1cygpOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uS2lsbEZvY3VzKCk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtID0gMCk7CisgIHZpcnR1YWwgdm9pZCBSZVBvc0NoaWxkV25kKCk7CisgIHZpcnR1YWwgdm9pZCBPblNldEZvY3VzKCk7CisgIHZpcnR1YWwgdm9pZCBPbktpbGxGb2N1cygpOwogCi1wcml2YXRlOgotCUZYX0JPT0wJCQkJCQkJCW1fYkVuYWJsZU5vdGlmeTsKLQlGWF9GTE9BVAkJCQkJCQltX2ZPbGRJdGVtSGVpZ2h0OwotCUZYX0JPT0wJCQkJCQkJCW1fYlNpemVDaGFuZ2VkOwotCUZYX0ZMT0FUCQkJCQkJCW1fZk9sZE1pbjsKLQlGWF9GTE9BVAkJCQkJCQltX2ZPbGRNYXg7CisgcHJpdmF0ZToKKyAgRlhfQk9PTCBtX2JFbmFibGVOb3RpZnk7CisgIEZYX0ZMT0FUIG1fZk9sZEl0ZW1IZWlnaHQ7CisgIEZYX0JPT0wgbV9iU2l6ZUNoYW5nZWQ7CisgIEZYX0ZMT0FUIG1fZk9sZE1pbjsKKyAgRlhfRkxPQVQgbV9mT2xkTWF4OwogfTsKIAotY2xhc3MgQ1BXTF9Ob3RlX09wdGlvbnMgOiBwdWJsaWMgQ1BXTF9XbmQKLXsKLXB1YmxpYzoKLQlDUFdMX05vdGVfT3B0aW9ucygpOwotCXZpcnR1YWwgfkNQV0xfTm90ZV9PcHRpb25zKCk7CitjbGFzcyBDUFdMX05vdGVfT3B0aW9ucyA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX05vdGVfT3B0aW9ucygpOworICB2aXJ0dWFsIH5DUFdMX05vdGVfT3B0aW9ucygpOwogCi0JQ1BERl9SZWN0CQkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkCQkJCQkJU2V0VGV4dENvbG9yKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcik7Ci0Jdm9pZAkJCQkJCQkJU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpOworICBDUERGX1JlY3QgR2V0Q29udGVudFJlY3QoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIFNldFRleHRDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CisgIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJUmVQb3NDaGlsZFduZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgUmVQb3NDaGlsZFduZCgpOworICB2aXJ0dWFsIHZvaWQgQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCk7CisgIHZpcnR1YWwgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKIAotcHJpdmF0ZToKLQlDUFdMX0xhYmVsKgkJCQkJCQltX3BUZXh0OworIHByaXZhdGU6CisgIENQV0xfTGFiZWwqIG1fcFRleHQ7CiB9OwogCi1jbGFzcyBDUFdMX05vdGVfQ29udGVudHMgOiBwdWJsaWMgQ1BXTF9MaXN0Q3RybAotewotcHVibGljOgotCUNQV0xfTm90ZV9Db250ZW50cygpOwotCXZpcnR1YWwgfkNQV0xfTm90ZV9Db250ZW50cygpOworY2xhc3MgQ1BXTF9Ob3RlX0NvbnRlbnRzIDogcHVibGljIENQV0xfTGlzdEN0cmwgeworIHB1YmxpYzoKKyAgQ1BXTF9Ob3RlX0NvbnRlbnRzKCk7CisgIHZpcnR1YWwgfkNQV0xfTm90ZV9Db250ZW50cygpOwogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJCQlHZXRDbGFzc05hbWUoKSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBPbk5vdGlmeShDUFdMX1duZCogcFduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKIAotCXZvaWQJCQkJCQkJCVNldEVkaXRGb2N1cyhGWF9CT09MIGJMYXN0KTsKLQlDUFdMX0VkaXQqCQkJCQkJCUdldEVkaXQoKSBjb25zdDsKKyAgdm9pZCBTZXRFZGl0Rm9jdXMoRlhfQk9PTCBiTGFzdCk7CisgIENQV0xfRWRpdCogR2V0RWRpdCgpIGNvbnN0OwogCi1wdWJsaWM6Ci0Jdm9pZAkJCQkJCQkJU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpOwotCUNGWF9XaWRlU3RyaW5nCQkJCQkJR2V0VGV4dCgpIGNvbnN0OworIHB1YmxpYzoKKyAgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCk7CisgIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKIAotCUNQV0xfTm90ZUl0ZW0qCQkJCQkJQ3JlYXRlU3ViSXRlbSgpOwotCXZvaWQJCQkJCQkJCURlbGV0ZVN1Ykl0ZW0oSVBXTF9Ob3RlSXRlbSogcE5vdGVJdGVtKTsKLQlpbnQzMl90CQkJCQkJCUNvdW50U3ViSXRlbXMoKSBjb25zdDsKLQlJUFdMX05vdGVJdGVtKgkJCQkJCUdldFN1Ykl0ZW1zKGludDMyX3QgaW5kZXgpIGNvbnN0OworICBDUFdMX05vdGVJdGVtKiBDcmVhdGVTdWJJdGVtKCk7CisgIHZvaWQgRGVsZXRlU3ViSXRlbShJUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0pOworICBpbnQzMl90IENvdW50U3ViSXRlbXMoKSBjb25zdDsKKyAgSVBXTF9Ob3RlSXRlbSogR2V0U3ViSXRlbXMoaW50MzJfdCBpbmRleCkgY29uc3Q7CiAKLQl2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qCQkJCUdldEhpdE5vdGVJdGVtKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKTsKKyAgdmlydHVhbCBJUFdMX05vdGVJdGVtKiBHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZvaWQgRW5hYmxlUmVhZChGWF9CT09MIGJFbmFibGVkKTsKKyAgdm9pZCBFbmFibGVNb2RpZnkoRlhfQk9PTCBiRW5hYmxlZCk7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIHZvaWQJCQkJCQlDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCk7CiAKLXByaXZhdGU6Ci0JQ1BXTF9Ob3RlX0VkaXQqCQkJCQkJbV9wRWRpdDsKKyBwcml2YXRlOgorICBDUFdMX05vdGVfRWRpdCogbV9wRWRpdDsKIH07CiAKLWNsYXNzIENQV0xfTm90ZUl0ZW0gOiBwdWJsaWMgQ1BXTF9XbmQsIHB1YmxpYyBJUFdMX05vdGVJdGVtCi17Ci1wdWJsaWM6Ci0JQ1BXTF9Ob3RlSXRlbSgpOwotCXZpcnR1YWwgfkNQV0xfTm90ZUl0ZW0oKTsKK2NsYXNzIENQV0xfTm90ZUl0ZW0gOiBwdWJsaWMgQ1BXTF9XbmQsIHB1YmxpYyBJUFdMX05vdGVJdGVtIHsKKyBwdWJsaWM6CisgIENQV0xfTm90ZUl0ZW0oKTsKKyAgdmlydHVhbCB+Q1BXTF9Ob3RlSXRlbSgpOwogCi1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJCQkJU2V0UHJpdmF0ZURhdGEodm9pZCogcERhdGEpOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldEJrQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldFN1YmplY3ROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQkJU2V0QXV0aG9yTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldERhdGVUaW1lKEZYX1NZU1RFTVRJTUUgdGltZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQkJU2V0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNDb250ZW50cyk7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0UHJpdmF0ZURhdGEodm9pZCogcERhdGEpOworICB2aXJ0dWFsIHZvaWQgU2V0QmtDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CisgIHZpcnR1YWwgdm9pZCBTZXRTdWJqZWN0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpOworICB2aXJ0dWFsIHZvaWQgU2V0QXV0aG9yTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpOworICB2aXJ0dWFsIHZvaWQgU2V0RGF0ZVRpbWUoRlhfU1lTVEVNVElNRSB0aW1lKTsKKyAgdmlydHVhbCB2b2lkIFNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpOwogCi0JdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlDcmVhdGVTdWJJdGVtKCk7Ci0JdmlydHVhbCBpbnQzMl90CQkJCQlDb3VudFN1Ykl0ZW1zKCkgY29uc3Q7Ci0JdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlHZXRTdWJJdGVtcyhpbnQzMl90IGluZGV4KSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEZWxldGVTdWJJdGVtKElQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSk7Ci0JdmlydHVhbCB2b2lkCQkJCQkJU2V0Rm9jdXMoKXtTZXROb3RlRm9jdXMoRkFMU0UpO30KKyAgdmlydHVhbCBJUFdMX05vdGVJdGVtKiBDcmVhdGVTdWJJdGVtKCk7CisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFN1Ykl0ZW1zKCkgY29uc3Q7CisgIHZpcnR1YWwgSVBXTF9Ob3RlSXRlbSogR2V0U3ViSXRlbXMoaW50MzJfdCBpbmRleCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBEZWxldGVTdWJJdGVtKElQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSk7CisgIHZpcnR1YWwgdm9pZCBTZXRGb2N1cygpIHsgU2V0Tm90ZUZvY3VzKEZBTFNFKTsgfQogCi0JdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlHZXRQYXJlbnRJdGVtKCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkKgkJCQkJCUdldFByaXZhdGVEYXRhKCkgY29uc3Q7Ci0JdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQlHZXRBdXRob3JOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCBDUFdMX0NvbG9yCQkJCQlHZXRCa0NvbG9yKCkgY29uc3Q7Ci0JdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQlHZXRDb250ZW50cygpIGNvbnN0OwotCXZpcnR1YWwgRlhfU1lTVEVNVElNRQkJCQlHZXREYXRlVGltZSgpIGNvbnN0OwotCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0U3ViamVjdE5hbWUoKSBjb25zdDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlJc1RvcEl0ZW0oKSBjb25zdCB7IHJldHVybiBGQUxTRTt9Ci0JdmlydHVhbCBDUFdMX0VkaXQqCQkJCQlHZXRFZGl0KCkgY29uc3Q7CisgIHZpcnR1YWwgSVBXTF9Ob3RlSXRlbSogR2V0UGFyZW50SXRlbSgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQqIEdldFByaXZhdGVEYXRhKCkgY29uc3Q7CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0QXV0aG9yTmFtZSgpIGNvbnN0OworICB2aXJ0dWFsIENQV0xfQ29sb3IgR2V0QmtDb2xvcigpIGNvbnN0OworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldENvbnRlbnRzKCkgY29uc3Q7CisgIHZpcnR1YWwgRlhfU1lTVEVNVElNRSBHZXREYXRlVGltZSgpIGNvbnN0OworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldFN1YmplY3ROYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgRlhfQk9PTCBJc1RvcEl0ZW0oKSBjb25zdCB7IHJldHVybiBGQUxTRTsgfQorICB2aXJ0dWFsIENQV0xfRWRpdCogR2V0RWRpdCgpIGNvbnN0OwogCi1wdWJsaWM6Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCQkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlHZXRGb2N1c2VkTm90ZUl0ZW0oKSBjb25zdDsKKyBwdWJsaWM6CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0OworICB2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qIEdldEhpdE5vdGVJdGVtKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBJUFdMX05vdGVJdGVtKiBHZXRGb2N1c2VkTm90ZUl0ZW0oKSBjb25zdDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCVJlc2V0U3ViamVjdE5hbWUoaW50MzJfdCBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKTsKKyAgdmlydHVhbCB2b2lkIFJlc2V0U3ViamVjdE5hbWUoaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpOworICB2b2lkIEVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKTsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgUmVQb3NDaGlsZFduZCgpOworICB2aXJ0dWFsIHZvaWQgQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKKyAgdmlydHVhbCB2b2lkIE9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSA9IDApOwogCi1wdWJsaWM6Ci0JdmlydHVhbCBGWF9GTE9BVAkJCQkJR2V0SXRlbUhlaWdodChGWF9GTE9BVCBmTGltaXRXaWR0aCk7Ci0JdmlydHVhbCBGWF9GTE9BVAkJCQkJR2V0SXRlbUxlZnRNYXJnaW4oKTsKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCQlHZXRJdGVtUmlnaHRNYXJnaW4oKTsKLQlDUFdMX05vdGVJdGVtKgkJCQkJCUNyZWF0ZU5vdGVJdGVtKCk7Ci0JQ1BXTF9Ob3RlSXRlbSoJCQkJCQlHZXRQYXJlbnROb3RlSXRlbSgpIGNvbnN0OworIHB1YmxpYzoKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKTsKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRJdGVtTGVmdE1hcmdpbigpOworICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEl0ZW1SaWdodE1hcmdpbigpOworICBDUFdMX05vdGVJdGVtKiBDcmVhdGVOb3RlSXRlbSgpOworICBDUFdMX05vdGVJdGVtKiBHZXRQYXJlbnROb3RlSXRlbSgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQkJU2V0Tm90ZUZvY3VzKEZYX0JPT0wgYkxhc3QpOwotCXZvaWQJCQkJCQkJCU9uQ29udGVudHNWYWxpZGF0ZSgpOworICB2b2lkIFNldE5vdGVGb2N1cyhGWF9CT09MIGJMYXN0KTsKKyAgdm9pZCBPbkNvbnRlbnRzVmFsaWRhdGUoKTsKIAotCXZvaWQJCQkJCQkJCU9uQ3JlYXRlTm90ZUl0ZW0oKTsKKyAgdm9pZCBPbkNyZWF0ZU5vdGVJdGVtKCk7CiAKLXByb3RlY3RlZDoKLQl2b2lkCQkJCQkJCQlQb3B1cE5vdGVJdGVtTWVudShjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgcHJvdGVjdGVkOgorICB2b2lkIFBvcHVwTm90ZUl0ZW1NZW51KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAotCXZpcnR1YWwgY29uc3QgQ1BXTF9Ob3RlKgkJCUdldE5vdGUoKSBjb25zdDsKLQl2aXJ0dWFsIElQV0xfTm90ZU5vdGlmeSoJCQlHZXROb3RlTm90aWZ5KCkgY29uc3Q7CisgIHZpcnR1YWwgY29uc3QgQ1BXTF9Ob3RlKiBHZXROb3RlKCkgY29uc3Q7CisgIHZpcnR1YWwgSVBXTF9Ob3RlTm90aWZ5KiBHZXROb3RlTm90aWZ5KCkgY29uc3Q7CiAKLXByb3RlY3RlZDoKLQlDUFdMX0xhYmVsKgkJCQkJCQltX3BTdWJqZWN0OwotCUNQV0xfTGFiZWwqCQkJCQkJCW1fcERhdGVUaW1lOwotCUNQV0xfTm90ZV9Db250ZW50cyoJCQkJCW1fcENvbnRlbnRzOworIHByb3RlY3RlZDoKKyAgQ1BXTF9MYWJlbCogbV9wU3ViamVjdDsKKyAgQ1BXTF9MYWJlbCogbV9wRGF0ZVRpbWU7CisgIENQV0xfTm90ZV9Db250ZW50cyogbV9wQ29udGVudHM7CiAKLXByaXZhdGU6Ci0Jdm9pZCoJCQkJCQkJCW1fcFByaXZhdGVEYXRhOwotCUZYX1NZU1RFTVRJTUUJCQkJCQltX2R0Tm90ZTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJCW1fc0F1dGhvcjsKKyBwcml2YXRlOgorICB2b2lkKiBtX3BQcml2YXRlRGF0YTsKKyAgRlhfU1lTVEVNVElNRSBtX2R0Tm90ZTsKKyAgQ0ZYX1dpZGVTdHJpbmcgbV9zQXV0aG9yOwogCi0JRlhfRkxPQVQJCQkJCQkJbV9mT2xkSXRlbUhlaWdodDsKLQlGWF9CT09MCQkJCQkJCQltX2JTaXplQ2hhbmdlZDsKLQlGWF9CT09MCQkJCQkJCQltX2JBbGxvd01vZGlmeTsKKyAgRlhfRkxPQVQgbV9mT2xkSXRlbUhlaWdodDsKKyAgRlhfQk9PTCBtX2JTaXplQ2hhbmdlZDsKKyAgRlhfQk9PTCBtX2JBbGxvd01vZGlmeTsKIH07CiAKLWNsYXNzIENQV0xfTm90ZSA6IHB1YmxpYyBDUFdMX05vdGVJdGVtCi17Ci1wdWJsaWM6Ci0JQ1BXTF9Ob3RlKElQb3B1cF9Ob3RlKiBwUG9wdXBOb3RlLCBJUFdMX05vdGVOb3RpZnkqIHBOb3RlTm90aWZ5LCBJUFdMX05vdGVIYW5kbGVyKiBwTm90ZUhhbmRsZXIpOwotCXZpcnR1YWwgfkNQV0xfTm90ZSgpOworY2xhc3MgQ1BXTF9Ob3RlIDogcHVibGljIENQV0xfTm90ZUl0ZW0geworIHB1YmxpYzoKKyAgQ1BXTF9Ob3RlKElQb3B1cF9Ob3RlKiBwUG9wdXBOb3RlLAorICAgICAgICAgICAgSVBXTF9Ob3RlTm90aWZ5KiBwTm90ZU5vdGlmeSwKKyAgICAgICAgICAgIElQV0xfTm90ZUhhbmRsZXIqIHBOb3RlSGFuZGxlcik7CisgIHZpcnR1YWwgfkNQV0xfTm90ZSgpOwogCi1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJCQkJU2V0U3ViamVjdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRBdXRob3JOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSk7Ci0JdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQlHZXRBdXRob3JOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkCQkJCQkJU2V0QmtDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0JdmlydHVhbCB2b2lkCQkJCQkJUmVzZXRTdWJqZWN0TmFtZShpbnQzMl90IG5JdGVtSW5kZXgpe30KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlJc1RvcEl0ZW0oKSBjb25zdCB7cmV0dXJuIFRSVUU7fQotCXZpcnR1YWwgY29uc3QgQ1BXTF9Ob3RlKgkJCUdldE5vdGUoKSBjb25zdDsKLQl2aXJ0dWFsIElQV0xfTm90ZU5vdGlmeSoJCQlHZXROb3RlTm90aWZ5KCkgY29uc3Q7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0U3ViamVjdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKTsKKyAgdmlydHVhbCB2b2lkIFNldEF1dGhvck5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKTsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRBdXRob3JOYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBTZXRCa0NvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKKyAgdmlydHVhbCB2b2lkIFJlc2V0U3ViamVjdE5hbWUoaW50MzJfdCBuSXRlbUluZGV4KSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgSXNUb3BJdGVtKCkgY29uc3QgeyByZXR1cm4gVFJVRTsgfQorICB2aXJ0dWFsIGNvbnN0IENQV0xfTm90ZSogR2V0Tm90ZSgpIGNvbnN0OworICB2aXJ0dWFsIElQV0xfTm90ZU5vdGlmeSogR2V0Tm90ZU5vdGlmeSgpIGNvbnN0OwogCi1wdWJsaWM6Ci0JSVBXTF9Ob3RlSXRlbSoJCQkJCQlSZXBseSgpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU5vdGlmeShGWF9CT09MIGJFbmFibGVkKTsKLQl2b2lkCQkJCQkJCQlTZXRJY29uVHlwZShpbnQzMl90IG5UeXBlKTsKLQl2b2lkCQkJCQkJCQlTZXRPcHRpb25zVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpOworIHB1YmxpYzoKKyAgSVBXTF9Ob3RlSXRlbSogUmVwbHkoKTsKKyAgdm9pZCBFbmFibGVOb3RpZnkoRlhfQk9PTCBiRW5hYmxlZCk7CisgIHZvaWQgU2V0SWNvblR5cGUoaW50MzJfdCBuVHlwZSk7CisgIHZvaWQgU2V0T3B0aW9uc1RleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUZXh0KTsKKyAgdm9pZCBFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpOworICB2b2lkIEVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKTsKIAotCUNGWF9XaWRlU3RyaW5nCQkJCQkJR2V0UmVwbHlTdHJpbmcoKSBjb25zdDsKLQl2b2lkCQkJCQkJCQlTZXRSZXBseVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0UmVwbHlTdHJpbmcoKSBjb25zdDsKKyAgdm9pZCBTZXRSZXBseVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKTsKIAotCS8vMC1ub3JtYWwgLyAxLWNhcHRpb24gLyAyLWxlZnRib3R0b20gY29ybmVyIC8gMy1yaWdodGJvdHRvbSBjb3JuZXIgLyA0LWNsb3NlIC8gNS1vcHRpb25zCi0JaW50MzJfdAkJCQkJCQlOb3RlSGl0VGVzdChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7Ci0JQ1BERl9SZWN0CQkJCQkJCUdldENhcHRpb25SZWN0KCkgY29uc3Qge3JldHVybiBtX3JjQ2FwdGlvbjt9Ci0JSVBvcHVwX05vdGUqCQkJCQkJR2V0UG9wdXBOb3RlKCkgY29uc3Qge3JldHVybiBtX3BQb3B1cE5vdGU7fQorICAvLyAwLW5vcm1hbCAvIDEtY2FwdGlvbiAvIDItbGVmdGJvdHRvbSBjb3JuZXIgLyAzLXJpZ2h0Ym90dG9tIGNvcm5lciAvIDQtY2xvc2UKKyAgLy8gLyA1LW9wdGlvbnMKKyAgaW50MzJfdCBOb3RlSGl0VGVzdChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7CisgIENQREZfUmVjdCBHZXRDYXB0aW9uUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcmNDYXB0aW9uOyB9CisgIElQb3B1cF9Ob3RlKiBHZXRQb3B1cE5vdGUoKSBjb25zdCB7IHJldHVybiBtX3BQb3B1cE5vdGU7IH0KIAotcHVibGljOgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgcHVibGljOgorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJUmVQb3NDaGlsZFduZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBSZVBvc0NoaWxkV25kKCk7CisgIHZpcnR1YWwgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSA9IDAsIGludHB0cl90IGxQYXJhbSA9IDApOworICB2aXJ0dWFsIHZvaWQgT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtID0gMCk7CiAKLQlGWF9CT09MCQkJCQkJCQlSZXNldFNjcm9sbEJhcigpOwotCXZvaWQJCQkJCQkJCVJlUG9zTm90ZUNoaWxkcmVuKCk7Ci0JRlhfQk9PTAkJCQkJCQkJU2Nyb2xsQmFyU2hvdWxkVmlzaWJsZSgpOworICBGWF9CT09MIFJlc2V0U2Nyb2xsQmFyKCk7CisgIHZvaWQgUmVQb3NOb3RlQ2hpbGRyZW4oKTsKKyAgRlhfQk9PTCBTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCk7CiAKLXByaXZhdGU6Ci0JQ1BXTF9MYWJlbCoJCQkJCQkJbV9wQXV0aG9yOwotCUNQV0xfTm90ZV9JY29uKgkJCQkJCW1fcEljb247Ci0JQ1BXTF9Ob3RlX0Nsb3NlQm94KgkJCQkJbV9wQ2xvc2VCb3g7Ci0JQ1BXTF9Ob3RlX0xCQm94KgkJCQkJbV9wTEJCb3g7Ci0JQ1BXTF9Ob3RlX1JCQm94KgkJCQkJbV9wUkJCb3g7Ci0JQ1BXTF9TY3JvbGxCYXIqCQkJCQkJbV9wQ29udGVudHNCYXI7Ci0JQ1BXTF9Ob3RlX09wdGlvbnMqCQkJCQltX3BPcHRpb25zOwotCUlQV0xfTm90ZU5vdGlmeSoJCQkJCW1fcE5vdGVOb3RpZnk7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iUmVzaXppbmc7Ci0JUFdMX1NDUk9MTF9JTkZPCQkJCQkJbV9PbGRTY3JvbGxJbmZvOwotCUNQREZfUmVjdAkJCQkJCQltX3JjQ2FwdGlvbjsKLQlGWF9CT09MCQkJCQkJCQltX2JFbmFsYmxlTm90aWZ5OwotCUlQb3B1cF9Ob3RlKgkJCQkJCW1fcFBvcHVwTm90ZTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJCW1fc1JlcGx5U3RyaW5nOworIHByaXZhdGU6CisgIENQV0xfTGFiZWwqIG1fcEF1dGhvcjsKKyAgQ1BXTF9Ob3RlX0ljb24qIG1fcEljb247CisgIENQV0xfTm90ZV9DbG9zZUJveCogbV9wQ2xvc2VCb3g7CisgIENQV0xfTm90ZV9MQkJveCogbV9wTEJCb3g7CisgIENQV0xfTm90ZV9SQkJveCogbV9wUkJCb3g7CisgIENQV0xfU2Nyb2xsQmFyKiBtX3BDb250ZW50c0JhcjsKKyAgQ1BXTF9Ob3RlX09wdGlvbnMqIG1fcE9wdGlvbnM7CisgIElQV0xfTm90ZU5vdGlmeSogbV9wTm90ZU5vdGlmeTsKKyAgRlhfQk9PTCBtX2JSZXNpemluZzsKKyAgUFdMX1NDUk9MTF9JTkZPIG1fT2xkU2Nyb2xsSW5mbzsKKyAgQ1BERl9SZWN0IG1fcmNDYXB0aW9uOworICBGWF9CT09MIG1fYkVuYWxibGVOb3RpZnk7CisgIElQb3B1cF9Ob3RlKiBtX3BQb3B1cE5vdGU7CisgIENGWF9XaWRlU3RyaW5nIG1fc1JlcGx5U3RyaW5nOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9OT1RFX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oCmluZGV4IDAzOTAyMjIuLmExNDlhMDEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oCkBAIC0xMiwxNTUgKzEyLDE1MCBAQAogY2xhc3MgQ1BXTF9TQkJ1dHRvbjsKIGNsYXNzIENQV0xfU2Nyb2xsQmFyOwogCi1zdHJ1Y3QgUFdMX1NDUk9MTF9JTkZPCi17Ci1wdWJsaWM6Ci0JUFdMX1NDUk9MTF9JTkZPKCkgOiBmQ29udGVudE1pbigwLjBmKSwgZkNvbnRlbnRNYXgoMC4wZiksIGZQbGF0ZVdpZHRoKDAuMGYpLCBmQmlnU3RlcCgwLjBmKSwgZlNtYWxsU3RlcCgwLjBmKQotCXsKLQl9Ci0JRlhfRkxPQVQJCQkJCWZDb250ZW50TWluOwotCUZYX0ZMT0FUCQkJCQlmQ29udGVudE1heDsKLQlGWF9GTE9BVAkJCQkJZlBsYXRlV2lkdGg7Ci0JRlhfRkxPQVQJCQkJCWZCaWdTdGVwOwotCUZYX0ZMT0FUCQkJCQlmU21hbGxTdGVwOworc3RydWN0IFBXTF9TQ1JPTExfSU5GTyB7CisgcHVibGljOgorICBQV0xfU0NST0xMX0lORk8oKQorICAgICAgOiBmQ29udGVudE1pbigwLjBmKSwKKyAgICAgICAgZkNvbnRlbnRNYXgoMC4wZiksCisgICAgICAgIGZQbGF0ZVdpZHRoKDAuMGYpLAorICAgICAgICBmQmlnU3RlcCgwLjBmKSwKKyAgICAgICAgZlNtYWxsU3RlcCgwLjBmKSB7fQorICBGWF9GTE9BVCBmQ29udGVudE1pbjsKKyAgRlhfRkxPQVQgZkNvbnRlbnRNYXg7CisgIEZYX0ZMT0FUIGZQbGF0ZVdpZHRoOworICBGWF9GTE9BVCBmQmlnU3RlcDsKKyAgRlhfRkxPQVQgZlNtYWxsU3RlcDsKIH07CiAKLWVudW0gUFdMX1NDUk9MTEJBUl9UWVBFCi17Ci0JU0JUX0hTQ1JPTEwsCi0JU0JUX1ZTQ1JPTEwKK2VudW0gUFdMX1NDUk9MTEJBUl9UWVBFIHsgU0JUX0hTQ1JPTEwsIFNCVF9WU0NST0xMIH07CisKK2VudW0gUFdMX1NCQlVUVE9OX1RZUEUgeyBQU0JUX01JTiwgUFNCVF9NQVgsIFBTQlRfUE9TIH07CisKK2NsYXNzIENQV0xfU0JCdXR0b24gOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9TQkJ1dHRvbihQV0xfU0NST0xMQkFSX1RZUEUgZVNjcm9sbEJhclR5cGUsCisgICAgICAgICAgICAgICAgUFdMX1NCQlVUVE9OX1RZUEUgZUJ1dHRvblR5cGUpOworICB2aXJ0dWFsIH5DUFdMX1NCQnV0dG9uKCk7CisKKyBwdWJsaWM6CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdmlydHVhbCB2b2lkIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSk7CisgIHZpcnR1YWwgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworCisgcHJvdGVjdGVkOgorICBQV0xfU0NST0xMQkFSX1RZUEUgbV9lU2Nyb2xsQmFyVHlwZTsKKyAgUFdMX1NCQlVUVE9OX1RZUEUgbV9lU0JCdXR0b25UeXBlOworCisgIEZYX0JPT0wgbV9iTW91c2VEb3duOwogfTsKIAotZW51bSBQV0xfU0JCVVRUT05fVFlQRQotewotCVBTQlRfTUlOLAotCVBTQlRfTUFYLAotCVBTQlRfUE9TCitzdHJ1Y3QgUFdMX0ZMT0FUUkFOR0UgeworIHB1YmxpYzoKKyAgUFdMX0ZMT0FUUkFOR0UoKTsKKyAgUFdMX0ZMT0FUUkFOR0UoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpOworICB2b2lkIERlZmF1bHQoKTsKKyAgdm9pZCBTZXQoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpOworICBGWF9CT09MIEluKEZYX0ZMT0FUIHgpIGNvbnN0OworICBGWF9GTE9BVCBHZXRXaWR0aCgpIGNvbnN0OworCisgIEZYX0ZMT0FUIGZNaW4sIGZNYXg7CiB9OwogCi1jbGFzcyBDUFdMX1NCQnV0dG9uIDogcHVibGljIENQV0xfV25kCi17Ci1wdWJsaWM6Ci0JQ1BXTF9TQkJ1dHRvbihQV0xfU0NST0xMQkFSX1RZUEUgZVNjcm9sbEJhclR5cGUsUFdMX1NCQlVUVE9OX1RZUEUgZUJ1dHRvblR5cGUpOwotCXZpcnR1YWwgfkNQV0xfU0JCdXR0b24oKTsKK3N0cnVjdCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBIHsKKyBwdWJsaWM6CisgIFBXTF9TQ1JPTExfUFJJVkFURURBVEEoKTsKIAotcHVibGljOgotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQlPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0JdmlydHVhbCB2b2lkCQkJCUdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pOwotCXZpcnR1YWwgdm9pZAkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdm9pZCBEZWZhdWx0KCk7CisgIHZvaWQgU2V0U2Nyb2xsUmFuZ2UoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpOworICB2b2lkIFNldENsaWVudFdpZHRoKEZYX0ZMT0FUIHdpZHRoKTsKKyAgdm9pZCBTZXRTbWFsbFN0ZXAoRlhfRkxPQVQgc3RlcCk7CisgIHZvaWQgU2V0QmlnU3RlcChGWF9GTE9BVCBzdGVwKTsKKyAgRlhfQk9PTCBTZXRQb3MoRlhfRkxPQVQgcG9zKTsKIAotcHJvdGVjdGVkOgotCVBXTF9TQ1JPTExCQVJfVFlQRQkJCW1fZVNjcm9sbEJhclR5cGU7Ci0JUFdMX1NCQlVUVE9OX1RZUEUJCQltX2VTQkJ1dHRvblR5cGU7CisgIHZvaWQgQWRkU21hbGwoKTsKKyAgdm9pZCBTdWJTbWFsbCgpOworICB2b2lkIEFkZEJpZygpOworICB2b2lkIFN1YkJpZygpOwogCi0JRlhfQk9PTAkJCQkJCW1fYk1vdXNlRG93bjsKKyAgUFdMX0ZMT0FUUkFOR0UgU2Nyb2xsUmFuZ2U7CisgIEZYX0ZMT0FUIGZDbGllbnRXaWR0aDsKKyAgRlhfRkxPQVQgZlNjcm9sbFBvczsKKyAgRlhfRkxPQVQgZkJpZ1N0ZXA7CisgIEZYX0ZMT0FUIGZTbWFsbFN0ZXA7CiB9OwogCi1zdHJ1Y3QgUFdMX0ZMT0FUUkFOR0UKLXsKLXB1YmxpYzoKLQlQV0xfRkxPQVRSQU5HRSgpOwotCVBXTF9GTE9BVFJBTkdFKEZYX0ZMT0FUIG1pbixGWF9GTE9BVCBtYXgpOwotCXZvaWQgRGVmYXVsdCgpOwotCXZvaWQgU2V0KEZYX0ZMT0FUIG1pbixGWF9GTE9BVCBtYXgpOwotCUZYX0JPT0wJSW4oRlhfRkxPQVQgeCkgY29uc3Q7Ci0JRlhfRkxPQVQgR2V0V2lkdGgoKSBjb25zdDsKK2NsYXNzIENQV0xfU2Nyb2xsQmFyIDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfU2Nyb2xsQmFyKFBXTF9TQ1JPTExCQVJfVFlQRSBzYlR5cGUgPSBTQlRfSFNDUk9MTCk7CisgIHZpcnR1YWwgfkNQV0xfU2Nyb2xsQmFyKCk7CiAKLQlGWF9GTE9BVCBmTWluLGZNYXg7Ci19OworIHB1YmxpYzoKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApOworICB2aXJ0dWFsIHZvaWQgUmVQb3NDaGlsZFduZCgpOworICB2aXJ0dWFsIHZvaWQgR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKTsKKyAgdmlydHVhbCB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwogCi1zdHJ1Y3QgUFdMX1NDUk9MTF9QUklWQVRFREFUQQotewotcHVibGljOgotCVBXTF9TQ1JPTExfUFJJVkFURURBVEEoKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgdm9pZCBPbk5vdGlmeShDUFdMX1duZCogcFduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKIAotCXZvaWQgRGVmYXVsdCgpOwotCXZvaWQgU2V0U2Nyb2xsUmFuZ2UoRlhfRkxPQVQgbWluLEZYX0ZMT0FUIG1heCk7Ci0Jdm9pZCBTZXRDbGllbnRXaWR0aChGWF9GTE9BVCB3aWR0aCk7Ci0Jdm9pZCBTZXRTbWFsbFN0ZXAoRlhfRkxPQVQgc3RlcCk7Ci0Jdm9pZCBTZXRCaWdTdGVwKEZYX0ZMT0FUIHN0ZXApOwotCUZYX0JPT0wgU2V0UG9zKEZYX0ZMT0FUIHBvcyk7CisgIHZpcnR1YWwgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKIAotCXZvaWQgQWRkU21hbGwoKTsKLQl2b2lkIFN1YlNtYWxsKCk7Ci0Jdm9pZCBBZGRCaWcoKTsKLQl2b2lkIFN1YkJpZygpOworICBGWF9GTE9BVCBHZXRTY3JvbGxCYXJXaWR0aCgpIGNvbnN0OworICBQV0xfU0NST0xMQkFSX1RZUEUgR2V0U2Nyb2xsQmFyVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2JUeXBlOyB9OwogCi0JUFdMX0ZMT0FUUkFOR0UJCQkJU2Nyb2xsUmFuZ2U7Ci0JRlhfRkxPQVQJCQkJCWZDbGllbnRXaWR0aDsKLQlGWF9GTE9BVAkJCQkJZlNjcm9sbFBvczsKLQlGWF9GTE9BVAkJCQkJZkJpZ1N0ZXA7Ci0JRlhfRkxPQVQJCQkJCWZTbWFsbFN0ZXA7Ci19OworICB2b2lkIFNldE5vdGlmeUZvcmV2ZXIoRlhfQk9PTCBiRm9yZXZlcikgeyBtX2JOb3RpZnlGb3JldmVyID0gYkZvcmV2ZXI7IH0KIAotY2xhc3MgQ1BXTF9TY3JvbGxCYXIgOiBwdWJsaWMgQ1BXTF9XbmQKLXsKLXB1YmxpYzoKLQlDUFdMX1Njcm9sbEJhcihQV0xfU0NST0xMQkFSX1RZUEUgc2JUeXBlID0gU0JUX0hTQ1JPTEwpOwotCXZpcnR1YWwgfkNQV0xfU2Nyb2xsQmFyKCk7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFNjcm9sbFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgsIEZYX0ZMT0FUIGZDbGllbnRXaWR0aCk7CisgIHZvaWQgU2V0U2Nyb2xsUG9zKEZYX0ZMT0FUIGZQb3MpOworICB2b2lkIE1vdmVQb3NCdXR0b24oRlhfQk9PTCBiUmVmcmVzaCk7CisgIHZvaWQgU2V0U2Nyb2xsU3RlcChGWF9GTE9BVCBmQmlnU3RlcCwgRlhfRkxPQVQgZlNtYWxsU3RlcCk7CisgIHZvaWQgTm90aWZ5U2Nyb2xsV2luZG93KCk7CisgIENQREZfUmVjdCBHZXRTY3JvbGxBcmVhKCkgY29uc3Q7CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRDbGFzc05hbWUoKSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCXZpcnR1YWwgdm9pZAkJCQlSZVBvc0NoaWxkV25kKCk7Ci0JdmlydHVhbCB2b2lkCQkJCUdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pOwotCXZpcnR1YWwgdm9pZAkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgcHJpdmF0ZToKKyAgdm9pZCBDcmVhdGVCdXR0b25zKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgdm9pZAkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKKyAgdm9pZCBPbk1pbkJ1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZvaWQgT25NaW5CdXR0b25MQlVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdm9pZCBPbk1pbkJ1dHRvbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOworICB2b2lkIE9uTWF4QnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdm9pZCBPbk1heEJ1dHRvbkxCVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2b2lkIE9uTWF4QnV0dG9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAotCUZYX0ZMT0FUCQkJCQlHZXRTY3JvbGxCYXJXaWR0aCgpIGNvbnN0OwotCVBXTF9TQ1JPTExCQVJfVFlQRQkJCUdldFNjcm9sbEJhclR5cGUoKSBjb25zdCB7cmV0dXJuIG1fc2JUeXBlO307CisgIHZvaWQgT25Qb3NCdXR0b25MQkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2b2lkIE9uUG9zQnV0dG9uTEJVcChjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZvaWQgT25Qb3NCdXR0b25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0Jdm9pZAkJCQkJCVNldE5vdGlmeUZvcmV2ZXIoRlhfQk9PTCBiRm9yZXZlcikge21fYk5vdGlmeUZvcmV2ZXIgPSBiRm9yZXZlcjt9CisgIEZYX0ZMT0FUIFRydWVUb0ZhY2UoRlhfRkxPQVQpOworICBGWF9GTE9BVCBGYWNlVG9UcnVlKEZYX0ZMT0FUKTsKIAotcHJvdGVjdGVkOgotCXZvaWQJCQkJCQlTZXRTY3JvbGxSYW5nZShGWF9GTE9BVCBmTWluLEZYX0ZMT0FUIGZNYXgsRlhfRkxPQVQgZkNsaWVudFdpZHRoKTsKLQl2b2lkCQkJCQkJU2V0U2Nyb2xsUG9zKEZYX0ZMT0FUIGZQb3MpOwotCXZvaWQJCQkJCQlNb3ZlUG9zQnV0dG9uKEZYX0JPT0wgYlJlZnJlc2gpOwotCXZvaWQJCQkJCQlTZXRTY3JvbGxTdGVwKEZYX0ZMT0FUIGZCaWdTdGVwLEZYX0ZMT0FUIGZTbWFsbFN0ZXApOwotCXZvaWQJCQkJCQlOb3RpZnlTY3JvbGxXaW5kb3coKTsKLQlDUERGX1JlY3QJCQkJCUdldFNjcm9sbEFyZWEoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIFRpbWVyUHJvYygpOwogCi1wcml2YXRlOgotCXZvaWQJCQkJCQlDcmVhdGVCdXR0b25zKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQotCXZvaWQJCQkJCQlPbk1pbkJ1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpOwotCXZvaWQJCQkJCQlPbk1pbkJ1dHRvbkxCVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KTsKLQl2b2lkCQkJCQkJT25NaW5CdXR0b25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KTsKLQotCXZvaWQJCQkJCQlPbk1heEJ1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpOwotCXZvaWQJCQkJCQlPbk1heEJ1dHRvbkxCVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KTsKLQl2b2lkCQkJCQkJT25NYXhCdXR0b25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KTsKLQotCXZvaWQJCQkJCQlPblBvc0J1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpOwotCXZvaWQJCQkJCQlPblBvc0J1dHRvbkxCVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KTsKLQl2b2lkCQkJCQkJT25Qb3NCdXR0b25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KTsKLQotCUZYX0ZMT0FUCQkJCQlUcnVlVG9GYWNlKEZYX0ZMT0FUKTsKLQlGWF9GTE9BVAkJCQkJRmFjZVRvVHJ1ZShGWF9GTE9BVCk7Ci0KLQl2aXJ0dWFsCXZvaWQJCQkJVGltZXJQcm9jKCk7Ci0KLXByaXZhdGU6Ci0JUFdMX1NDUk9MTEJBUl9UWVBFCQkJbV9zYlR5cGU7Ci0JUFdMX1NDUk9MTF9JTkZPCQkJCW1fT3JpZ2luSW5mbzsKLQlDUFdMX1NCQnV0dG9uKgkJCQltX3BNaW5CdXR0b247Ci0JQ1BXTF9TQkJ1dHRvbioJCQkJbV9wTWF4QnV0dG9uOwotCUNQV0xfU0JCdXR0b24qCQkJCW1fcFBvc0J1dHRvbjsKLQlQV0xfU0NST0xMX1BSSVZBVEVEQVRBCQltX3NEYXRhOwotCUZYX0JPT0wJCQkJCQltX2JNb3VzZURvd247Ci0JRlhfQk9PTAkJCQkJCW1fYk1pbk9yTWF4OwotCUZYX0JPT0wJCQkJCQltX2JOb3RpZnlGb3JldmVyOwotCUZYX0ZMT0FUCQkJCQltX25PbGRQb3M7Ci0JRlhfRkxPQVQJCQkJCW1fZk9sZFBvc0J1dHRvbjsKKyBwcml2YXRlOgorICBQV0xfU0NST0xMQkFSX1RZUEUgbV9zYlR5cGU7CisgIFBXTF9TQ1JPTExfSU5GTyBtX09yaWdpbkluZm87CisgIENQV0xfU0JCdXR0b24qIG1fcE1pbkJ1dHRvbjsKKyAgQ1BXTF9TQkJ1dHRvbiogbV9wTWF4QnV0dG9uOworICBDUFdMX1NCQnV0dG9uKiBtX3BQb3NCdXR0b247CisgIFBXTF9TQ1JPTExfUFJJVkFURURBVEEgbV9zRGF0YTsKKyAgRlhfQk9PTCBtX2JNb3VzZURvd247CisgIEZYX0JPT0wgbV9iTWluT3JNYXg7CisgIEZYX0JPT0wgbV9iTm90aWZ5Rm9yZXZlcjsKKyAgRlhfRkxPQVQgbV9uT2xkUG9zOworICBGWF9GTE9BVCBtX2ZPbGRQb3NCdXR0b247CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX1NDUk9MTEJBUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuaAppbmRleCBkOWJlMzIyLi5jNDhkNGU5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuaApAQCAtMTMsNTUgKzEzLDU1IEBACiBjbGFzcyBDRlhfRElCU291cmNlOwogY2xhc3MgQ1BXTF9MYWJlbDsKIAotY2xhc3MgQ1BXTF9TaWduYXR1cmVfSW1hZ2UgOiBwdWJsaWMgQ1BXTF9JbWFnZQotewotcHVibGljOgotCUNQV0xfU2lnbmF0dXJlX0ltYWdlKCk7Ci0JdmlydHVhbCB+Q1BXTF9TaWduYXR1cmVfSW1hZ2UoKTsKK2NsYXNzIENQV0xfU2lnbmF0dXJlX0ltYWdlIDogcHVibGljIENQV0xfSW1hZ2UgeworIHB1YmxpYzoKKyAgQ1BXTF9TaWduYXR1cmVfSW1hZ2UoKTsKKyAgdmlydHVhbCB+Q1BXTF9TaWduYXR1cmVfSW1hZ2UoKTsKIAotCXZvaWQJCQkJCQkJCVNldEltYWdlKENGWF9ESUJTb3VyY2UqIHBJbWFnZSk7Ci0JQ0ZYX0RJQlNvdXJjZSoJCQkJCQlHZXRJbWFnZSgpOworICB2b2lkIFNldEltYWdlKENGWF9ESUJTb3VyY2UqIHBJbWFnZSk7CisgIENGWF9ESUJTb3VyY2UqIEdldEltYWdlKCk7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgIHZpcnR1YWwgdm9pZCBHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pOwogCi0JdmlydHVhbCB2b2lkCQkJCQkJR2V0U2NhbGUoRlhfRkxPQVQgJiBmSFNjYWxlLEZYX0ZMT0FUICYgZlZTY2FsZSk7CisgIHZpcnR1YWwgdm9pZCBHZXRTY2FsZShGWF9GTE9BVCYgZkhTY2FsZSwgRlhfRkxPQVQmIGZWU2NhbGUpOwogCi1wcml2YXRlOgotCUNGWF9ESUJTb3VyY2UqCQkJCQkJbV9wSW1hZ2U7CisgcHJpdmF0ZToKKyAgQ0ZYX0RJQlNvdXJjZSogbV9wSW1hZ2U7CiB9OwogCi1jbGFzcyBDUFdMX1NpZ25hdHVyZSA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfU2lnbmF0dXJlKCk7Ci0JdmlydHVhbCB+Q1BXTF9TaWduYXR1cmUoKTsKK2NsYXNzIENQV0xfU2lnbmF0dXJlIDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfU2lnbmF0dXJlKCk7CisgIHZpcnR1YWwgfkNQV0xfU2lnbmF0dXJlKCk7CiAKLQl2b2lkCQkJCQkJCQlTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiBzVGV4dCk7Ci0Jdm9pZAkJCQkJCQkJU2V0RGVzY3JpcHRpb24oY29uc3QgRlhfV0NIQVIqIHN0cmluZyk7Ci0Jdm9pZAkJCQkJCQkJU2V0SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcEltYWdlKTsKLQl2b2lkCQkJCQkJCQlTZXRJbWFnZVN0cmVhbShDUERGX1N0cmVhbSAqIHBTdHJlYW0sIGNvbnN0IEZYX0NIQVIqIHNJbWFnZUFsaWFzKTsKKyAgdm9pZCBTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiBzVGV4dCk7CisgIHZvaWQgU2V0RGVzY3JpcHRpb24oY29uc3QgRlhfV0NIQVIqIHN0cmluZyk7CisgIHZvaWQgU2V0SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcEltYWdlKTsKKyAgdm9pZCBTZXRJbWFnZVN0cmVhbShDUERGX1N0cmVhbSogcFN0cmVhbSwgY29uc3QgRlhfQ0hBUiogc0ltYWdlQWxpYXMpOwogCi0Jdm9pZAkJCQkJCQkJU2V0VGV4dEZsYWcoRlhfQk9PTCBiVGV4dEV4aXN0KTsKLQl2b2lkCQkJCQkJCQlTZXRJbWFnZUZsYWcoRlhfQk9PTCBiSW1hZ2VFeGlzdCk7Ci0Jdm9pZAkJCQkJCQkJU2V0Rm94aXRGbGFnKEZYX0JPT0wgYkZsYWdFeGlzdCk7CisgIHZvaWQgU2V0VGV4dEZsYWcoRlhfQk9PTCBiVGV4dEV4aXN0KTsKKyAgdm9pZCBTZXRJbWFnZUZsYWcoRlhfQk9PTCBiSW1hZ2VFeGlzdCk7CisgIHZvaWQgU2V0Rm94aXRGbGFnKEZYX0JPT0wgYkZsYWdFeGlzdCk7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIHZvaWQJCQkJCQlSZVBvc0NoaWxkV25kKCk7Ci0JdmlydHVhbCB2b2lkCQkJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFJlUG9zQ2hpbGRXbmQoKTsKKyAgdmlydHVhbCB2b2lkIENyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApOwogCi0JdmlydHVhbCB2b2lkCQkJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwotCXZpcnR1YWwgdm9pZAkJCQkJCUdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pOworICB2aXJ0dWFsIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgIHZpcnR1YWwgdm9pZCBHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pOwogCi1wcml2YXRlOgotCUNQV0xfTGFiZWwqCQkJCQkJCW1fcFRleHQ7Ci0JQ1BXTF9MYWJlbCoJCQkJCQkJbV9wRGVzY3JpcHRpb247Ci0JQ1BXTF9TaWduYXR1cmVfSW1hZ2UqCQkJCW1fcEltYWdlOworIHByaXZhdGU6CisgIENQV0xfTGFiZWwqIG1fcFRleHQ7CisgIENQV0xfTGFiZWwqIG1fcERlc2NyaXB0aW9uOworICBDUFdMX1NpZ25hdHVyZV9JbWFnZSogbV9wSW1hZ2U7CiAKLQlGWF9CT09MCQkJCQkJCQltX2JUZXh0RXhpc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iSW1hZ2VFeGlzdDsKLQlGWF9CT09MCQkJCQkJCQltX2JGbGFnRXhpc3Q7CisgIEZYX0JPT0wgbV9iVGV4dEV4aXN0OworICBGWF9CT09MIG1fYkltYWdlRXhpc3Q7CisgIEZYX0JPT0wgbV9iRmxhZ0V4aXN0OwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9TSUdOQVRVUkVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uaAppbmRleCAzMTc4N2Q3Li44Y2ZlODE5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oCkBAIC05LDQ4ICs5LDQ1IEBACiAKICNpbmNsdWRlICJQV0xfQnV0dG9uLmgiCiAKLWNsYXNzIENQV0xfUHVzaEJ1dHRvbiA6IHB1YmxpYyBDUFdMX0J1dHRvbgotewotcHVibGljOgotCUNQV0xfUHVzaEJ1dHRvbigpOwotCXZpcnR1YWwgfkNQV0xfUHVzaEJ1dHRvbigpOworY2xhc3MgQ1BXTF9QdXNoQnV0dG9uIDogcHVibGljIENQV0xfQnV0dG9uIHsKKyBwdWJsaWM6CisgIENQV0xfUHVzaEJ1dHRvbigpOworICB2aXJ0dWFsIH5DUFdMX1B1c2hCdXR0b24oKTsKIAotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJR2V0Rm9jdXNSZWN0KCkgY29uc3Q7CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldEZvY3VzUmVjdCgpIGNvbnN0OwogfTsKIAotY2xhc3MgQ1BXTF9DaGVja0JveCA6IHB1YmxpYyBDUFdMX0J1dHRvbgotewotcHVibGljOgotCUNQV0xfQ2hlY2tCb3goKTsKLQl2aXJ0dWFsIH5DUFdMX0NoZWNrQm94KCk7CitjbGFzcyBDUFdMX0NoZWNrQm94IDogcHVibGljIENQV0xfQnV0dG9uIHsKKyBwdWJsaWM6CisgIENQV0xfQ2hlY2tCb3goKTsKKyAgdmlydHVhbCB+Q1BXTF9DaGVja0JveCgpOwogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0OworICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CiAKLQl2b2lkCQkJCQkJU2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spOwotCUZYX0JPT0wJCQkJCQlJc0NoZWNrZWQoKSBjb25zdDsKKyAgdm9pZCBTZXRDaGVjayhGWF9CT09MIGJDaGVjayk7CisgIEZYX0JPT0wgSXNDaGVja2VkKCkgY29uc3Q7CiAKLXByaXZhdGU6Ci0JRlhfQk9PTAkJCQkJCW1fYkNoZWNrZWQ7CisgcHJpdmF0ZToKKyAgRlhfQk9PTCBtX2JDaGVja2VkOwogfTsKIAotY2xhc3MgQ1BXTF9SYWRpb0J1dHRvbiA6IHB1YmxpYyBDUFdMX0J1dHRvbgotewotcHVibGljOgotCUNQV0xfUmFkaW9CdXR0b24oKTsKLQl2aXJ0dWFsIH5DUFdMX1JhZGlvQnV0dG9uKCk7CitjbGFzcyBDUFdMX1JhZGlvQnV0dG9uIDogcHVibGljIENQV0xfQnV0dG9uIHsKKyBwdWJsaWM6CisgIENQV0xfUmFkaW9CdXR0b24oKTsKKyAgdmlydHVhbCB+Q1BXTF9SYWRpb0J1dHRvbigpOwogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0OworICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CiAKLQl2b2lkCQkJCQkJU2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spOwotCUZYX0JPT0wJCQkJCQlJc0NoZWNrZWQoKSBjb25zdDsKKyAgdm9pZCBTZXRDaGVjayhGWF9CT09MIGJDaGVjayk7CisgIEZYX0JPT0wgSXNDaGVja2VkKCkgY29uc3Q7CiAKLXByaXZhdGU6Ci0JRlhfQk9PTAkJCQkJCW1fYkNoZWNrZWQ7CisgcHJpdmF0ZToKKyAgRlhfQk9PTCBtX2JDaGVja2VkOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9TUEVDSUFMQlVUVE9OX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaAppbmRleCBiNThmMzBlLi5lNzk3NTEwIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgKQEAgLTgsMjM2ICs4LDQwNiBAQAogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9VVElMU19IXwogCiAjaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIgIC8vIEZvciBDUERGX1BvaW50LgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIgIC8vIEZvciBDUFZUX1dvcmRSYW5nZS4KKyNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgiICAgICAgLy8gRm9yIENQVlRfV29yZFJhbmdlLgogI2luY2x1ZGUgIi4uL2Z4ZWRpdC9meF9lZGl0LmgiCiAjaW5jbHVkZSAiUFdMX1duZC5oIgogCiBjbGFzcyBDRlhfUGF0aERhdGE7CiBzdHJ1Y3QgQ1BXTF9Db2xvcjsKIAotdGVtcGxhdGU8Y2xhc3MgVD4gVCBQV0xfTUlOIChjb25zdCBUICYgaSwgY29uc3QgVCAmIGopIHsgcmV0dXJuICgoaSA8IGopID8gaSA6IGopOyB9Ci10ZW1wbGF0ZTxjbGFzcyBUPiBUIFBXTF9NQVggKGNvbnN0IFQgJiBpLCBjb25zdCBUICYgaikgeyByZXR1cm4gKChpID4gaikgPyBpIDogaik7IH0KK3RlbXBsYXRlIDxjbGFzcyBUPgorVCBQV0xfTUlOKGNvbnN0IFQmIGksIGNvbnN0IFQmIGopIHsKKyAgcmV0dXJuICgoaSA8IGopID8gaSA6IGopOworfQordGVtcGxhdGUgPGNsYXNzIFQ+CitUIFBXTF9NQVgoY29uc3QgVCYgaSwgY29uc3QgVCYgaikgeworICByZXR1cm4gKChpID4gaikgPyBpIDogaik7Cit9CiAKLSNkZWZpbmUgUFdMX1BERjJXSU4oY29sb3IpCQkJCQkodWludDhfdChjb2xvcioyNTUpKQotI2RlZmluZSBQV0xfV0lOMlBERihjb2xvcikJCQkJCSgoRlhfRkxPQVQpKChGWF9GTE9BVCljb2xvci8yNTUuMGYpKQorI2RlZmluZSBQV0xfUERGMldJTihjb2xvcikgKHVpbnQ4X3QoY29sb3IgKiAyNTUpKQorI2RlZmluZSBQV0xfV0lOMlBERihjb2xvcikgKChGWF9GTE9BVCkoKEZYX0ZMT0FUKWNvbG9yIC8gMjU1LjBmKSkKIAotI2RlZmluZSBQV0xfTUFLRURXT1JEKGxvdyxoaWdoKQkJCQkoKEZYX0RXT1JEKSgoRlhfV09SRCkobG93KSB8IChGWF9EV09SRCkoKChGWF9XT1JEKShoaWdoKSk8PDE2KSkpCi0jZGVmaW5lIFBXTF9HRVRMT1dXT1JEKGR3b3JkKQkJCQkoKEZYX1dPUkQpKGR3b3JkKSkKLSNkZWZpbmUgUFdMX0dFVEhJR0hXT1JEKGR3b3JkKQkJCQkoKEZYX1dPUkQpKGR3b3JkPj4xNikpCisjZGVmaW5lIFBXTF9NQUtFRFdPUkQobG93LCBoaWdoKSBcCisgICgoRlhfRFdPUkQpKChGWF9XT1JEKShsb3cpIHwgKEZYX0RXT1JEKSgoKEZYX1dPUkQpKGhpZ2gpKSA8PCAxNikpKQorI2RlZmluZSBQV0xfR0VUTE9XV09SRChkd29yZCkgKChGWF9XT1JEKShkd29yZCkpCisjZGVmaW5lIFBXTF9HRVRISUdIV09SRChkd29yZCkgKChGWF9XT1JEKShkd29yZCA+PiAxNikpCiAKLSNkZWZpbmUgUFdMX0lDT05UWVBFX0NIRUNLTUFSSwkJCQkwCi0jZGVmaW5lIFBXTF9JQ09OVFlQRV9DSVJDTEUJCQkJCTEKLSNkZWZpbmUgUFdMX0lDT05UWVBFX0NPTU1FTlQJCQkJMgotI2RlZmluZSBQV0xfSUNPTlRZUEVfQ1JPU1MJCQkJCTMKLSNkZWZpbmUgUFdMX0lDT05UWVBFX0hFTFAJCQkJCTQKLSNkZWZpbmUgUFdMX0lDT05UWVBFX0lOU0VSVFRFWFQJCQkJNQotI2RlZmluZSBQV0xfSUNPTlRZUEVfS0VZCQkJCQk2Ci0jZGVmaW5lIFBXTF9JQ09OVFlQRV9ORVdQQVJBR1JBUEgJCQk3Ci0jZGVmaW5lIFBXTF9JQ09OVFlQRV9URVhUTk9URQkJCQk4Ci0jZGVmaW5lIFBXTF9JQ09OVFlQRV9QQVJBR1JBUEgJCQkJOQotI2RlZmluZSBQV0xfSUNPTlRZUEVfUklHSFRBUlJPVwkJCQkxMAotI2RlZmluZSBQV0xfSUNPTlRZUEVfUklHSFRQT0lOVEVSCQkJMTEKLSNkZWZpbmUgUFdMX0lDT05UWVBFX1NUQVIJCQkJCTEyCi0jZGVmaW5lIFBXTF9JQ09OVFlQRV9VUEFSUk9XCQkJCTEzCi0jZGVmaW5lIFBXTF9JQ09OVFlQRV9VUExFRlRBUlJPVwkJCTE0CisjZGVmaW5lIFBXTF9JQ09OVFlQRV9DSEVDS01BUksgMAorI2RlZmluZSBQV0xfSUNPTlRZUEVfQ0lSQ0xFIDEKKyNkZWZpbmUgUFdMX0lDT05UWVBFX0NPTU1FTlQgMgorI2RlZmluZSBQV0xfSUNPTlRZUEVfQ1JPU1MgMworI2RlZmluZSBQV0xfSUNPTlRZUEVfSEVMUCA0CisjZGVmaW5lIFBXTF9JQ09OVFlQRV9JTlNFUlRURVhUIDUKKyNkZWZpbmUgUFdMX0lDT05UWVBFX0tFWSA2CisjZGVmaW5lIFBXTF9JQ09OVFlQRV9ORVdQQVJBR1JBUEggNworI2RlZmluZSBQV0xfSUNPTlRZUEVfVEVYVE5PVEUgOAorI2RlZmluZSBQV0xfSUNPTlRZUEVfUEFSQUdSQVBIIDkKKyNkZWZpbmUgUFdMX0lDT05UWVBFX1JJR0hUQVJST1cgMTAKKyNkZWZpbmUgUFdMX0lDT05UWVBFX1JJR0hUUE9JTlRFUiAxMQorI2RlZmluZSBQV0xfSUNPTlRZUEVfU1RBUiAxMgorI2RlZmluZSBQV0xfSUNPTlRZUEVfVVBBUlJPVyAxMworI2RlZmluZSBQV0xfSUNPTlRZUEVfVVBMRUZUQVJST1cgMTQKIAotI2RlZmluZSBQV0xfSUNPTlRZUEVfR1JBUEgJCQkJCTE1Ci0jZGVmaW5lIFBXTF9JQ09OVFlQRV9QQVBFUkNMSVAJCQkJMTYKLSNkZWZpbmUgUFdMX0lDT05UWVBFX0FUVEFDSE1FTlQJCQkJMTcKLSNkZWZpbmUgUFdMX0lDT05UWVBFX1RBRwkJCQkJMTgKKyNkZWZpbmUgUFdMX0lDT05UWVBFX0dSQVBIIDE1CisjZGVmaW5lIFBXTF9JQ09OVFlQRV9QQVBFUkNMSVAgMTYKKyNkZWZpbmUgUFdMX0lDT05UWVBFX0FUVEFDSE1FTlQgMTcKKyNkZWZpbmUgUFdMX0lDT05UWVBFX1RBRyAxOAogCi0jZGVmaW5lIFBXTF9JQ09OVFlQRV9GT1hJVAkJCQkJMTkKKyNkZWZpbmUgUFdMX0lDT05UWVBFX0ZPWElUIDE5CiAKLSNkZWZpbmUgUFdMX0lDT05UWVBFX1VOS05PV04JCQkJLTEKKyNkZWZpbmUgUFdMX0lDT05UWVBFX1VOS05PV04gLTEKIAotLy9jaGVja2JveCAmIHJhZGlvYnV0dG9uIHN0eWxlCi0jZGVmaW5lIFBDU19DSEVDSwkJCQkJCQkwCi0jZGVmaW5lIFBDU19DSVJDTEUJCQkJCQkJMQotI2RlZmluZSBQQ1NfQ1JPU1MJCQkJCQkJMgotI2RlZmluZSBQQ1NfRElBTU9ORAkJCQkJCQkzCi0jZGVmaW5lIFBDU19TUVVBUkUJCQkJCQkJNAotI2RlZmluZSBQQ1NfU1RBUgkJCQkJCQk1CisvLyBjaGVja2JveCAmIHJhZGlvYnV0dG9uIHN0eWxlCisjZGVmaW5lIFBDU19DSEVDSyAwCisjZGVmaW5lIFBDU19DSVJDTEUgMQorI2RlZmluZSBQQ1NfQ1JPU1MgMgorI2RlZmluZSBQQ1NfRElBTU9ORCAzCisjZGVmaW5lIFBDU19TUVVBUkUgNAorI2RlZmluZSBQQ1NfU1RBUiA1CiAKLSNkZWZpbmUJUFdMX1BJCQkJCQkJCQkzLjE0MTU5MjY1MzU4OTc5ZgotI2RlZmluZSBQV0xfQkVaSUVSCQkJCQkJCTAuNTUyMjg0NzQ5ODMwOGYKKyNkZWZpbmUgUFdMX1BJIDMuMTQxNTkyNjUzNTg5NzlmCisjZGVmaW5lIFBXTF9CRVpJRVIgMC41NTIyODQ3NDk4MzA4ZgogCi0vL3B1c2hidXR0b24gbGF5b3V0IHN0eWxlCi0jZGVmaW5lIFBQQkxfTEFCRUwJCQkJCQkJMAotI2RlZmluZSBQUEJMX0lDT04JCQkJCQkJMQotI2RlZmluZSBQUEJMX0lDT05UT1BMQUJFTEJPVFRPTQkJCQkyCi0jZGVmaW5lCVBQQkxfTEFCRUxUT1BJQ09OQk9UVE9NCQkJCTMKLSNkZWZpbmUJUFBCTF9JQ09OTEVGVExBQkVMUklHSFQJCQkJNAotI2RlZmluZSBQUEJMX0xBQkVMTEVGVElDT05SSUdIVAkJCQk1Ci0jZGVmaW5lIFBQQkxfTEFCRUxPVkVSSUNPTgkJCQkJNgorLy8gcHVzaGJ1dHRvbiBsYXlvdXQgc3R5bGUKKyNkZWZpbmUgUFBCTF9MQUJFTCAwCisjZGVmaW5lIFBQQkxfSUNPTiAxCisjZGVmaW5lIFBQQkxfSUNPTlRPUExBQkVMQk9UVE9NIDIKKyNkZWZpbmUgUFBCTF9MQUJFTFRPUElDT05CT1RUT00gMworI2RlZmluZSBQUEJMX0lDT05MRUZUTEFCRUxSSUdIVCA0CisjZGVmaW5lIFBQQkxfTEFCRUxMRUZUSUNPTlJJR0hUIDUKKyNkZWZpbmUgUFBCTF9MQUJFTE9WRVJJQ09OIDYKIAotY2xhc3MgQ1BXTF9Qb2ludCA6IHB1YmxpYyBDUERGX1BvaW50Ci17Ci1wdWJsaWM6Ci0JQ1BXTF9Qb2ludCgpIDogQ1BERl9Qb2ludCgwLjBmLDAuMGYpe30KLQlDUFdMX1BvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgOiBDUERGX1BvaW50KGZ4LGZ5KSB7fQotCUNQV0xfUG9pbnQoY29uc3QgQ1BXTF9Qb2ludCYgcG9pbnQpIDogQ1BERl9Qb2ludChwb2ludC54LCBwb2ludC55KSB7fQorY2xhc3MgQ1BXTF9Qb2ludCA6IHB1YmxpYyBDUERGX1BvaW50IHsKKyBwdWJsaWM6CisgIENQV0xfUG9pbnQoKSA6IENQREZfUG9pbnQoMC4wZiwgMC4wZikge30KKyAgQ1BXTF9Qb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIDogQ1BERl9Qb2ludChmeCwgZnkpIHt9CisgIENQV0xfUG9pbnQoY29uc3QgQ1BXTF9Qb2ludCYgcG9pbnQpIDogQ1BERl9Qb2ludChwb2ludC54LCBwb2ludC55KSB7fQogfTsKIAotZW51bSBQV0xfUEFUSERBVEFfVFlQRQotewotCVBXTFBUX01PVkVUTywKLQlQV0xQVF9MSU5FVE8sCi0JUFdMUFRfQkVaSUVSVE8sCi0JUFdMUFRfVU5LTk9XTgorZW51bSBQV0xfUEFUSERBVEFfVFlQRSB7CisgIFBXTFBUX01PVkVUTywKKyAgUFdMUFRfTElORVRPLAorICBQV0xQVF9CRVpJRVJUTywKKyAgUFdMUFRfVU5LTk9XTgogfTsKIAotZW51bSBQV0xfUEFUSF9UWVBFCi17Ci0JUFdMUFRfUEFUSERBVEEsCi0JUFdMUFRfU1RSRUFNCi19OworZW51bSBQV0xfUEFUSF9UWVBFIHsgUFdMUFRfUEFUSERBVEEsIFBXTFBUX1NUUkVBTSB9OwogCi1jbGFzcyBDUFdMX1BhdGhEYXRhCi17Ci1wdWJsaWM6Ci0JQ1BXTF9QYXRoRGF0YSgpIDogcG9pbnQoKSwgdHlwZShQV0xQVF9VTktOT1dOKXt9Ci0JQ1BXTF9QYXRoRGF0YShjb25zdCBDUFdMX1BvaW50JiBwdCwgUFdMX1BBVEhEQVRBX1RZUEUgdHApIDogcG9pbnQocHQpLCB0eXBlKHRwKSB7fQorY2xhc3MgQ1BXTF9QYXRoRGF0YSB7CisgcHVibGljOgorICBDUFdMX1BhdGhEYXRhKCkgOiBwb2ludCgpLCB0eXBlKFBXTFBUX1VOS05PV04pIHt9CisgIENQV0xfUGF0aERhdGEoY29uc3QgQ1BXTF9Qb2ludCYgcHQsIFBXTF9QQVRIREFUQV9UWVBFIHRwKQorICAgICAgOiBwb2ludChwdCksIHR5cGUodHApIHt9CiAKLQlDUFdMX1BvaW50CQkJCQkJCQlwb2ludDsKLQlQV0xfUEFUSERBVEFfVFlQRQkJCQkJCXR5cGU7CisgIENQV0xfUG9pbnQgcG9pbnQ7CisgIFBXTF9QQVRIREFUQV9UWVBFIHR5cGU7CiB9OwogCiBjbGFzcyBJUFdMX1NwZWxsQ2hlY2s7CiAKLWNsYXNzIENQV0xfVXRpbHMKLXsKLXB1YmxpYzoKLQlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJSW5mbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByY1JlY3QsIEZYX0ZMT0FUIGZTaXplKTsKLQlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJRGVmbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByY1JlY3QsIEZYX0ZMT0FUIGZTaXplKTsKLQlzdGF0aWMgRlhfQk9PTAkJCQkJCQlJbnRlcnNlY3RSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsIGNvbnN0IENQREZfUmVjdCYgcmVjdDIpOwotCXN0YXRpYyBGWF9CT09MCQkJCQkJCUNvbnRhaW5zUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUGFyZW50LCBjb25zdCBDUERGX1JlY3QmIHJjQ2hpbGQpOwotCXN0YXRpYyBDUERGX1JlY3QJCQkJCQlTY2FsZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByY1JlY3QsRlhfRkxPQVQgZlNjYWxlKTsKLQlzdGF0aWMgQ1BWVF9Xb3JkUmFuZ2UJCQkJCU92ZXJsYXBXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMSwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMik7Ci0Jc3RhdGljIENQREZfUmVjdAkJCQkJCUdldENlbnRlclNxdWFyZShjb25zdCBDUERGX1JlY3QgJiByZWN0KTsKLQlzdGF0aWMgQ1BXTF9Db2xvcgkJCQkJCVN1YnN0cmFjdENvbG9yKGNvbnN0IENQV0xfQ29sb3IgJiBzQ29sb3IsRlhfRkxPQVQgZkNvbG9yU3ViKTsKLQlzdGF0aWMgQ1BXTF9Db2xvcgkJCQkJCURldmlkZUNvbG9yKGNvbnN0IENQV0xfQ29sb3IgJiBzQ29sb3IsRlhfRkxPQVQgZkNvbG9yRGV2aWRlKTsKLQlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJTWF4UmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0MSxjb25zdCBDUERGX1JlY3QgJiByZWN0Mik7Ci0Jc3RhdGljIENQREZfUmVjdAkJCQkJCU9mZnNldFJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCxGWF9GTE9BVCB4LEZYX0ZMT0FUIHkpOwotCXN0YXRpYyBDUERGX1BvaW50CQkJCQkJT2Zmc2V0UG9pbnQoY29uc3QgIENQREZfUG9pbnQgJiBwb2ludCxGWF9GTE9BVCB4LEZYX0ZMT0FUIHkpOwotCXN0YXRpYyBGWF9DT0xPUlJFRgkJCQkJCVBXTENvbG9yVG9GWENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLCBpbnQzMl90IG5UcmFuc3BhcmFuY3kgPSAyNTUpOwotCXN0YXRpYyBGWF9CT09MCQkJCQkJCUlzQmxhY2tPcldoaXRlKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKLQlzdGF0aWMgQ1BXTF9Db2xvcgkJCQkJCUdldFJldmVyc2VDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CitjbGFzcyBDUFdMX1V0aWxzIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDUERGX1JlY3QgSW5mbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByY1JlY3QsIEZYX0ZMT0FUIGZTaXplKTsKKyAgc3RhdGljIENQREZfUmVjdCBEZWZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUmVjdCwgRlhfRkxPQVQgZlNpemUpOworICBzdGF0aWMgRlhfQk9PTCBJbnRlcnNlY3RSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsIGNvbnN0IENQREZfUmVjdCYgcmVjdDIpOworICBzdGF0aWMgRlhfQk9PTCBDb250YWluc1JlY3QoY29uc3QgQ1BERl9SZWN0JiByY1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCk7CisgIHN0YXRpYyBDUERGX1JlY3QgU2NhbGVSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNSZWN0LCBGWF9GTE9BVCBmU2NhbGUpOworICBzdGF0aWMgQ1BWVF9Xb3JkUmFuZ2UgT3ZlcmxhcFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IyKTsKKyAgc3RhdGljIENQREZfUmVjdCBHZXRDZW50ZXJTcXVhcmUoY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKKyAgc3RhdGljIENQV0xfQ29sb3IgU3Vic3RyYWN0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciYgc0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29sb3JTdWIpOworICBzdGF0aWMgQ1BXTF9Db2xvciBEZXZpZGVDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBzQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb2xvckRldmlkZSk7CisgIHN0YXRpYyBDUERGX1JlY3QgTWF4UmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QxLCBjb25zdCBDUERGX1JlY3QmIHJlY3QyKTsKKyAgc3RhdGljIENQREZfUmVjdCBPZmZzZXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCwgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7CisgIHN0YXRpYyBDUERGX1BvaW50IE9mZnNldFBvaW50KGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5KTsKKyAgc3RhdGljIEZYX0NPTE9SUkVGIFBXTENvbG9yVG9GWENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuVHJhbnNwYXJhbmN5ID0gMjU1KTsKKyAgc3RhdGljIEZYX0JPT0wgSXNCbGFja09yV2hpdGUoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworICBzdGF0aWMgQ1BXTF9Db2xvciBHZXRSZXZlcnNlQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwogCi0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRDb2xvckFwcFN0cmVhbShjb25zdCBDUFdMX0NvbG9yICYgY29sb3IsY29uc3QgRlhfQk9PTCAmIGJGaWxsT3JTdHJva2UgPSBUUlVFKTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEJvcmRlckFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9GTE9BVCBmV2lkdGgsCi0JCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY29sb3IsIGNvbnN0IENQV0xfQ29sb3IgJiBjckxlZnRUb3AsIGNvbnN0IENQV0xfQ29sb3IgJiBjclJpZ2h0Qm90dG9tLAotCQkJCQkJCQkJCQkJaW50MzJfdCBuU3R5bGUsIGNvbnN0IENQV0xfRGFzaCAmIGRhc2gpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0Q2lyY2xlQm9yZGVyQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0ZMT0FUIGZXaWR0aCwKLQkJCQkJCQkJCQkJCWNvbnN0IENQV0xfQ29sb3IgJiBjb2xvciwgY29uc3QgQ1BXTF9Db2xvciAmIGNyTGVmdFRvcCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyUmlnaHRCb3R0b20sCi0JCQkJCQkJCQkJCQlpbnQzMl90IG5TdHlsZSwgY29uc3QgQ1BXTF9EYXNoICYgZGFzaCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRSZWN0RmlsbEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByZWN0LGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcik7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRDaXJjbGVGaWxsQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJlY3QsY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yKTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQk9PTCYgYkZpbGxPclN0cm9rZSA9IFRSVUUpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0Qm9yZGVyQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JMZWZ0VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyUmlnaHRCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9EYXNoJiBkYXNoKTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldENpcmNsZUJvcmRlckFwcFN0cmVhbSgKKyAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgIEZYX0ZMT0FUIGZXaWR0aCwKKyAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAorICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JMZWZ0VG9wLAorICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JSaWdodEJvdHRvbSwKKyAgICAgIGludDMyX3QgblN0eWxlLAorICAgICAgY29uc3QgQ1BXTF9EYXNoJiBkYXNoKTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldFJlY3RGaWxsQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldENpcmNsZUZpbGxBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CiAKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFB1c2hCdXR0b25BcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LAotCQkJCQkJCQkJCQkJCQlJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAsCi0JCQkJCQkJCQkJCQkJCUNQREZfU3RyZWFtICogcEljb25TdHJlYW0sCi0JCQkJCQkJCQkJCQkJCUNQREZfSWNvbkZpdCAmIEljb25GaXQsCi0JCQkJCQkJCQkJCQkJCWNvbnN0IENGWF9XaWRlU3RyaW5nICYgc0xhYmVsLAotCQkJCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0LAotCQkJCQkJCQkJCQkJCQlGWF9GTE9BVCBmRm9udFNpemUsCi0JCQkJCQkJCQkJCQkJCWludDMyX3QgbkxheU91dCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRDaGVja0JveEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsCi0JCQkJCQkJCQkJCQkJCWludDMyX3QgblN0eWxlLAotCQkJCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFJhZGlvQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwKLQkJCQkJCQkJCQkJCQkJaW50MzJfdCBuU3R5bGUsCi0JCQkJCQkJCQkJCQkJCWNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0UHVzaEJ1dHRvbkFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwSWNvblN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9JY29uRml0JiBJY29uRml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc0xhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGF5T3V0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldENoZWNrQm94QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0UmFkaW9CdXR0b25BcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCk7CiAKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEVkaXRBcHBTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlID0gTlVMTCwKLQkJCQkJCQkJCQkJCQkJRlhfQk9PTCBiQ29udGludW91cyA9IFRSVUUsIEZYX1dPUkQgU3ViV29yZCA9IDApOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0RWRpdFNlbEFwcFN0cmVhbShJRlhfRWRpdCogcEVkaXQsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwKLQkJCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UgPSBOVUxMKTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFNwZWxsQ2hlY2tBcHBTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBJUFdMX1NwZWxsQ2hlY2sqIHBTcGVsbENoZWNrLAotCQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsCi0JCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlID0gTlVMTCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRUZXh0QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCxJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAsCi0JCQkJCQkJCQkJCQkJCWNvbnN0IENGWF9XaWRlU3RyaW5nICYgc1RleHQsIGludDMyX3QgbkFsaWdubWVudEgsIGludDMyX3QgbkFsaWdubWVudFYsCi0JCQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiTXVsdGlMaW5lLCBGWF9CT09MIGJBdXRvUmV0dXJuLCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldERyb3BCdXR0b25BcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEVkaXRBcHBTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbnRpbnVvdXMgPSBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIFN1YldvcmQgPSAwKTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEVkaXRTZWxBcHBTdHJlYW0oCisgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgPSBOVUxMKTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldFNwZWxsQ2hlY2tBcHBTdHJlYW0oCisgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICBJUFdMX1NwZWxsQ2hlY2sqIHBTcGVsbENoZWNrLAorICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlID0gTlVMTCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRUZXh0QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5BbGlnbm1lbnRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5BbGlnbm1lbnRWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk11bHRpTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXV0b1JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldERyb3BCdXR0b25BcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0JiByY0JCb3gpOwogCi0Jc3RhdGljIHZvaWQJCQkJCQkJCURyYXdGaWxsUmVjdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLGNvbnN0IENQREZfUmVjdCAmIHJlY3QsCi0JCQkJCQkJCQkJCQkJCWNvbnN0IENQV0xfQ29sb3IgJiBjb2xvciwgaW50MzJfdCBuVHJhbnNwYXJhbmN5KTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd0ZpbGxSZWN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQkJCQkJCWNvbnN0IENQREZfUmVjdCAmIHJlY3QsY29uc3QgRlhfQ09MT1JSRUYgJiBjb2xvcik7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCURyYXdTdHJva2VSZWN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwKLQkJCQkJCQkJCQkJCQkJY29uc3QgRlhfQ09MT1JSRUYgJiBjb2xvciwgRlhfRkxPQVQgZldpZHRoKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd1N0cm9rZUxpbmUoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9Qb2ludCAmIHB0TW92ZVRvLCBjb25zdCBDUERGX1BvaW50ICYgcHRMaW5lVG8sIGNvbnN0IEZYX0NPTE9SUkVGICYgY29sb3IsIEZYX0ZMT0FUIGZXaWR0aCk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCURyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQkJCQkJCWNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0ZMT0FUIGZXaWR0aCwKLQkJCQkJCQkJCQkJCWNvbnN0IENQV0xfQ29sb3IgJiBjb2xvciwgY29uc3QgQ1BXTF9Db2xvciAmIGNyTGVmdFRvcCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyUmlnaHRCb3R0b20sCi0JCQkJCQkJCQkJCQlpbnQzMl90IG5TdHlsZSwgY29uc3QgQ1BXTF9EYXNoICYgZGFzaCwgaW50MzJfdCBuVHJhbnNwYXJhbmN5KTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd0ZpbGxBcmVhKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQkJCQkJCWNvbnN0IENQREZfUG9pbnQqIHBQdHMsIGludDMyX3QgbkNvdW50LCBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3U2hhZG93KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQkJCQkJCUZYX0JPT0wgYlZlcnRpY2FsLCBGWF9CT09MIGJIb3Jpem9udGFsLCBDUERGX1JlY3QgcmVjdCwKLQkJCQkJCQkJCQkJCQkJaW50MzJfdCBuVHJhbnNwYXJhbmN5LCBpbnQzMl90IG5TdGFydEdyYXksIGludDMyX3QgbkVuZEdyYXkpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3RWRpdFNwZWxsQ2hlY2soQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgSUZYX0VkaXQqIHBFZGl0LAotCQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCi0JCQkJCQkJCQkJCQkJCUlQV0xfU3BlbGxDaGVjayogcFNwZWxsQ2hlY2spOwotcHVibGljOgotCXN0YXRpYyB2b2lkCQkJCQkJCQlDb252ZXJ0Q01ZSzJSR0IoRlhfRkxPQVQgZEMsRlhfRkxPQVQgZE0sRlhfRkxPQVQgZFksRlhfRkxPQVQgZEssRlhfRkxPQVQgJmRSLEZYX0ZMT0FUICZkRyxGWF9GTE9BVCAmZEIpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlDb252ZXJ0UkdCMkNNWUsoRlhfRkxPQVQgZFIsRlhfRkxPQVQgZEcsRlhfRkxPQVQgZEIsRlhfRkxPQVQgJmRDLEZYX0ZMT0FUICZkTSxGWF9GTE9BVCAmZFksRlhfRkxPQVQgJmRLKTsKKyAgc3RhdGljIHZvaWQgRHJhd0ZpbGxSZWN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5UcmFuc3BhcmFuY3kpOworICBzdGF0aWMgdm9pZCBEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IpOworICBzdGF0aWMgdm9pZCBEcmF3U3Ryb2tlUmVjdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoKTsKKyAgc3RhdGljIHZvaWQgRHJhd1N0cm9rZUxpbmUoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRNb3ZlVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0TGluZVRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCk7CisgIHN0YXRpYyB2b2lkIERyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JMZWZ0VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyUmlnaHRCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9EYXNoJiBkYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblRyYW5zcGFyYW5jeSk7CisgIHN0YXRpYyB2b2lkIERyYXdGaWxsQXJlYShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQqIHBQdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvcik7CisgIHN0YXRpYyB2b2lkIERyYXdTaGFkb3coQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhvcml6b250YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuVHJhbnNwYXJhbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0R3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5FbmRHcmF5KTsKKyAgc3RhdGljIHZvaWQgRHJhd0VkaXRTcGVsbENoZWNrKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUFdMX1NwZWxsQ2hlY2sqIHBTcGVsbENoZWNrKTsKIAotCXN0YXRpYyB2b2lkCQkJCQkJCQlDb252ZXJ0UkdCMkdSQVkoRlhfRkxPQVQgZFIsRlhfRkxPQVQgZEcsRlhfRkxPQVQgZEIsRlhfRkxPQVQgJmRHcmF5KTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJQ29udmVydEdSQVkyUkdCKEZYX0ZMT0FUIGRHcmF5LEZYX0ZMT0FUICZkUixGWF9GTE9BVCAmZEcsRlhfRkxPQVQgJmRCKTsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIENvbnZlcnRDTVlLMlJHQihGWF9GTE9BVCBkQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkQik7CisgIHN0YXRpYyB2b2lkIENvbnZlcnRSR0IyQ01ZSyhGWF9GTE9BVCBkUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZEspOwogCi0Jc3RhdGljIHZvaWQJCQkJCQkJCUNvbnZlcnRDTVlLMkdSQVkoRlhfRkxPQVQgZEMsRlhfRkxPQVQgZE0sRlhfRkxPQVQgZFksRlhfRkxPQVQgZEssRlhfRkxPQVQgJmRHcmF5KTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJQ29udmVydEdSQVkyQ01ZSyhGWF9GTE9BVCBkR3JheSxGWF9GTE9BVCAmZEMsRlhfRkxPQVQgJmRNLEZYX0ZMT0FUICZkWSxGWF9GTE9BVCAmZEspOworICBzdGF0aWMgdm9pZCBDb252ZXJ0UkdCMkdSQVkoRlhfRkxPQVQgZFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRHcmF5KTsKKyAgc3RhdGljIHZvaWQgQ29udmVydEdSQVkyUkdCKEZYX0ZMT0FUIGRHcmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRCKTsKIAotCXN0YXRpYyB2b2lkCQkJCQkJCQlQV0xDb2xvclRvQVJHQihjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwgaW50MzJfdCYgYWxwaGEsIEZYX0ZMT0FUJiByZWQsIEZYX0ZMT0FUJiBncmVlbiwgRlhfRkxPQVQmIGJsdWUpOworICBzdGF0aWMgdm9pZCBDb252ZXJ0Q01ZSzJHUkFZKEZYX0ZMT0FUIGRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkR3JheSk7CisgIHN0YXRpYyB2b2lkIENvbnZlcnRHUkFZMkNNWUsoRlhfRkxPQVQgZEdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRLKTsKIAotcHVibGljOgotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0SWNvbkFwcFN0cmVhbShpbnQzMl90IG5UeXBlLCBjb25zdCBDUERGX1JlY3QmIHJlY3QsIGNvbnN0IENQV0xfQ29sb3ImIGNyRmlsbCwKLQkJCQkJCQkJCQkJCWNvbnN0IENQV0xfQ29sb3ImIGNyU3Ryb2tlID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUik7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCURyYXdJY29uQXBwU3RyZWFtKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQkJCQlpbnQzMl90IG5UeXBlLCBjb25zdCBDUERGX1JlY3QgJiByZWN0LCBjb25zdCBDUFdMX0NvbG9yJiBjckZpbGwsCi0JCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yJiBjclN0cm9rZSwgY29uc3QgaW50MzJfdCBuVHJhbnNwYXJhbmN5KTsKKyAgc3RhdGljIHZvaWQgUFdMQ29sb3JUb0FSR0IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBibHVlKTsKIAotcHJpdmF0ZToKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEFwcFN0cmVhbUZyb21BcnJheShjb25zdCBDUFdMX1BhdGhEYXRhKiBwUGF0aERhdGEsIGludDMyX3QgbkNvdW50KTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0UGF0aERhdGFGcm9tQXJyYXkoQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUFdMX1BhdGhEYXRhKiBwUGF0aERhdGEsIGludDMyX3QgbkNvdW50KTsKKyBwdWJsaWM6CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRJY29uQXBwU3RyZWFtKAorICAgICAgaW50MzJfdCBuVHlwZSwKKyAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyRmlsbCwKKyAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyU3Ryb2tlID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUik7CisgIHN0YXRpYyB2b2lkIERyYXdJY29uQXBwU3RyZWFtKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JGaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclN0cm9rZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBuVHJhbnNwYXJhbmN5KTsKIAotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QXBwU3RyZWFtX0NoZWNrKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRBcHBTdHJlYW1fQ2lyY2xlKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRBcHBTdHJlYW1fQ3Jvc3MoY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEFwcFN0cmVhbV9EaWFtb25kKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRBcHBTdHJlYW1fU3F1YXJlKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRBcHBTdHJlYW1fU3Rhcihjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpOworIHByaXZhdGU6CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoY29uc3QgQ1BXTF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50KTsKKyAgc3RhdGljIHZvaWQgR2V0UGF0aERhdGFGcm9tQXJyYXkoQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50KTsKIAotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QVBfQ2hlY2soY29uc3QgQ1BERl9SZWN0ICYgY3JCQm94KTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEFQX0NpcmNsZShjb25zdCBDUERGX1JlY3QgJiBjckJCb3gpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QVBfQ3Jvc3MoY29uc3QgQ1BERl9SZWN0ICYgY3JCQm94KTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEFQX0RpYW1vbmQoY29uc3QgQ1BERl9SZWN0ICYgY3JCQm94KTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEFQX1NxdWFyZShjb25zdCBDUERGX1JlY3QgJiBjckJCb3gpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QVBfU3Rhcihjb25zdCBDUERGX1JlY3QgJiBjckJCb3gpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QVBfSGFsZkNpcmNsZShjb25zdCBDUERGX1JlY3QgJiBjckJCb3gsRlhfRkxPQVQgZlJvdGF0ZSk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBcHBTdHJlYW1fQ2hlY2soY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9DaXJjbGUoY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBcHBTdHJlYW1fQ3Jvc3MoY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9EaWFtb25kKGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9TcXVhcmUoY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBcHBTdHJlYW1fU3Rhcihjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCk7CiAKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfQ2hlY2ttYXJrKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX0NpcmNsZShDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlHZXRHcmFwaGljc19Db21tZW50KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX0Nyb3NzKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX0hlbHAoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfSW5zZXJ0VGV4dChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlHZXRHcmFwaGljc19LZXkoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfTmV3UGFyYWdyYXBoKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX1RleHROb3RlKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX1BhcmFncmFwaChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlHZXRHcmFwaGljc19SaWdodEFycm93KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX1JpZ2h0UG9pbnRlcihDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlHZXRHcmFwaGljc19TdGFyKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX1VwQXJyb3coQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfVXBMZWZ0QXJyb3coQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfR3JhcGgoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfUGFwZXJjbGlwKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX0F0dGFjaG1lbnQoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfVGFnKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX0ZveGl0KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBUF9DaGVjayhjb25zdCBDUERGX1JlY3QmIGNyQkJveCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBUF9DaXJjbGUoY29uc3QgQ1BERl9SZWN0JiBjckJCb3gpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0QVBfQ3Jvc3MoY29uc3QgQ1BERl9SZWN0JiBjckJCb3gpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0QVBfRGlhbW9uZChjb25zdCBDUERGX1JlY3QmIGNyQkJveCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBUF9TcXVhcmUoY29uc3QgQ1BERl9SZWN0JiBjckJCb3gpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0QVBfU3Rhcihjb25zdCBDUERGX1JlY3QmIGNyQkJveCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBUF9IYWxmQ2lyY2xlKGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUm90YXRlKTsKKworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19DaGVja21hcmsoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfQ2lyY2xlKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyB2b2lkIEdldEdyYXBoaWNzX0NvbW1lbnQoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfQ3Jvc3MoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfSGVscChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19JbnNlcnRUZXh0KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyB2b2lkIEdldEdyYXBoaWNzX0tleShDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19OZXdQYXJhZ3JhcGgoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfVGV4dE5vdGUoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfUGFyYWdyYXBoKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyB2b2lkIEdldEdyYXBoaWNzX1JpZ2h0QXJyb3coQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfUmlnaHRQb2ludGVyKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyB2b2lkIEdldEdyYXBoaWNzX1N0YXIoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfVXBBcnJvdyhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19VcExlZnRBcnJvdyhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19HcmFwaChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19QYXBlcmNsaXAoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfQXR0YWNobWVudChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19UYWcoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfRm94aXQoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgKaW5kZXggNjdiMjhjZi4uMjM1Nzg2YiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgKQEAgLTIxLDQ0NCArMjEsNDU1IEBACiBjbGFzcyBJUFdMX1Byb3ZpZGVyOwogY2xhc3MgSVBXTF9TcGVsbENoZWNrOwogCi0vL3dpbmRvdyBzdHlsZXMKLSNkZWZpbmUgUFdTX0NISUxECQkJCQkJCTB4ODAwMDAwMDBMCi0jZGVmaW5lIFBXU19CT1JERVIJCQkJCQkJMHg0MDAwMDAwMEwKLSNkZWZpbmUgUFdTX0JBQ0tHUk9VTkQJCQkJCQkweDIwMDAwMDAwTAotI2RlZmluZSBQV1NfSFNDUk9MTAkJCQkJCQkweDEwMDAwMDAwTAotI2RlZmluZSBQV1NfVlNDUk9MTAkJCQkJCQkweDA4MDAwMDAwTAotI2RlZmluZSBQV1NfVklTSUJMRQkJCQkJCQkweDA0MDAwMDAwTAotI2RlZmluZSBQV1NfRElTQUJMRQkJCQkJCQkweDAyMDAwMDAwTAotI2RlZmluZSBQV1NfUkVBRE9OTFkJCQkJCQkweDAxMDAwMDAwTAotI2RlZmluZSBQV1NfQVVUT0ZPTlRTSVpFCQkJCQkweDAwODAwMDAwTAotI2RlZmluZSBQV1NfQVVUT1RSQU5TUEFSRU5UCQkJCQkweDAwNDAwMDAwTAotI2RlZmluZSBQV1NfTk9SRUZSRVNIQ0xJUAkJCQkJMHgwMDIwMDAwMEwKKy8vIHdpbmRvdyBzdHlsZXMKKyNkZWZpbmUgUFdTX0NISUxEIDB4ODAwMDAwMDBMCisjZGVmaW5lIFBXU19CT1JERVIgMHg0MDAwMDAwMEwKKyNkZWZpbmUgUFdTX0JBQ0tHUk9VTkQgMHgyMDAwMDAwMEwKKyNkZWZpbmUgUFdTX0hTQ1JPTEwgMHgxMDAwMDAwMEwKKyNkZWZpbmUgUFdTX1ZTQ1JPTEwgMHgwODAwMDAwMEwKKyNkZWZpbmUgUFdTX1ZJU0lCTEUgMHgwNDAwMDAwMEwKKyNkZWZpbmUgUFdTX0RJU0FCTEUgMHgwMjAwMDAwMEwKKyNkZWZpbmUgUFdTX1JFQURPTkxZIDB4MDEwMDAwMDBMCisjZGVmaW5lIFBXU19BVVRPRk9OVFNJWkUgMHgwMDgwMDAwMEwKKyNkZWZpbmUgUFdTX0FVVE9UUkFOU1BBUkVOVCAweDAwNDAwMDAwTAorI2RlZmluZSBQV1NfTk9SRUZSRVNIQ0xJUCAweDAwMjAwMDAwTAogCi0vL2VkaXQgYW5kIGxhYmVsIHN0eWxlcwotI2RlZmluZSBQRVNfTVVMVElMSU5FCQkJCQkJMHgwMDAxTAotI2RlZmluZSBQRVNfUEFTU1dPUkQJCQkJCQkweDAwMDJMCi0jZGVmaW5lIFBFU19MRUZUCQkJCQkJCTB4MDAwNEwKLSNkZWZpbmUgUEVTX1JJR0hUCQkJCQkJCTB4MDAwOEwKLSNkZWZpbmUgUEVTX01JRERMRQkJCQkJCQkweDAwMTBMCi0jZGVmaW5lIFBFU19UT1AJCQkJCQkJCTB4MDAyMEwKLSNkZWZpbmUgUEVTX0JPVFRPTQkJCQkJCQkweDAwNDBMCi0jZGVmaW5lIFBFU19DRU5URVIJCQkJCQkJMHgwMDgwTAotI2RlZmluZSBQRVNfQ0hBUkFSUkFZCQkJCQkJMHgwMTAwTAotI2RlZmluZSBQRVNfQVVUT1NDUk9MTAkJCQkJCTB4MDIwMEwKLSNkZWZpbmUgUEVTX0FVVE9SRVRVUk4JCQkJCQkweDA0MDBMCi0jZGVmaW5lIFBFU19VTkRPCQkJCQkJCTB4MDgwMEwKLSNkZWZpbmUgUEVTX1JJQ0gJCQkJCQkJMHgxMDAwTAotI2RlZmluZSBQRVNfU1BFTExDSEVDSwkJCQkJCTB4MjAwMEwKLSNkZWZpbmUgUEVTX1RFWFRPVkVSRkxPVwkJCQkJMHg0MDAwTAotI2RlZmluZSBQRVNfTk9SRUFECQkJCQkJCTB4ODAwMEwKKy8vIGVkaXQgYW5kIGxhYmVsIHN0eWxlcworI2RlZmluZSBQRVNfTVVMVElMSU5FIDB4MDAwMUwKKyNkZWZpbmUgUEVTX1BBU1NXT1JEIDB4MDAwMkwKKyNkZWZpbmUgUEVTX0xFRlQgMHgwMDA0TAorI2RlZmluZSBQRVNfUklHSFQgMHgwMDA4TAorI2RlZmluZSBQRVNfTUlERExFIDB4MDAxMEwKKyNkZWZpbmUgUEVTX1RPUCAweDAwMjBMCisjZGVmaW5lIFBFU19CT1RUT00gMHgwMDQwTAorI2RlZmluZSBQRVNfQ0VOVEVSIDB4MDA4MEwKKyNkZWZpbmUgUEVTX0NIQVJBUlJBWSAweDAxMDBMCisjZGVmaW5lIFBFU19BVVRPU0NST0xMIDB4MDIwMEwKKyNkZWZpbmUgUEVTX0FVVE9SRVRVUk4gMHgwNDAwTAorI2RlZmluZSBQRVNfVU5ETyAweDA4MDBMCisjZGVmaW5lIFBFU19SSUNIIDB4MTAwMEwKKyNkZWZpbmUgUEVTX1NQRUxMQ0hFQ0sgMHgyMDAwTAorI2RlZmluZSBQRVNfVEVYVE9WRVJGTE9XIDB4NDAwMEwKKyNkZWZpbmUgUEVTX05PUkVBRCAweDgwMDBMCiAKLS8vbGlzdGJveCBzdHlsZXMKLSNkZWZpbmUgUExCU19NVUxUSVBMRVNFTAkJCQkJMHgwMDAxTAotI2RlZmluZSBQTEJTX0hPVkVSU0VMCQkJCQkJMHgwMDA4TAorLy8gbGlzdGJveCBzdHlsZXMKKyNkZWZpbmUgUExCU19NVUxUSVBMRVNFTCAweDAwMDFMCisjZGVmaW5lIFBMQlNfSE9WRVJTRUwgMHgwMDA4TAogCi0vL2NvbWJvYm94IHN0eWxlcwotI2RlZmluZSBQQ0JTX0FMTE9XQ1VTVE9NVEVYVAkJCQkweDAwMDFMCisvLyBjb21ib2JveCBzdHlsZXMKKyNkZWZpbmUgUENCU19BTExPV0NVU1RPTVRFWFQgMHgwMDAxTAogCi0vL3JpY2hlZGl0IHN0eWxlcwotI2RlZmluZSBQUkVTX01VTFRJTElORQkJCQkJCTB4MDAwMUwKLSNkZWZpbmUgUFJFU19BVVRPUkVUVVJOCQkJCQkJMHgwMDAyTAotI2RlZmluZSBQUkVTX0FVVE9TQ1JPTEwJCQkJCQkweDAwMDRMCi0jZGVmaW5lIFBSRVNfU1BFTExDSEVDSwkJCQkJCTB4MDAwOEwKLSNkZWZpbmUgUFJFU19VTkRPCQkJCQkJCTB4MDEwMEwKLSNkZWZpbmUgUFJFU19NVUxUSVBBR0VTCQkJCQkJMHgwMjAwTAotI2RlZmluZSBQUkVTX1RFWFRPVkVSRkxPVwkJCQkJMHgwNDAwTAorLy8gcmljaGVkaXQgc3R5bGVzCisjZGVmaW5lIFBSRVNfTVVMVElMSU5FIDB4MDAwMUwKKyNkZWZpbmUgUFJFU19BVVRPUkVUVVJOIDB4MDAwMkwKKyNkZWZpbmUgUFJFU19BVVRPU0NST0xMIDB4MDAwNEwKKyNkZWZpbmUgUFJFU19TUEVMTENIRUNLIDB4MDAwOEwKKyNkZWZpbmUgUFJFU19VTkRPIDB4MDEwMEwKKyNkZWZpbmUgUFJFU19NVUxUSVBBR0VTIDB4MDIwMEwKKyNkZWZpbmUgUFJFU19URVhUT1ZFUkZMT1cgMHgwNDAwTAogCi0vL2JvcmRlciBzdHlsZQotI2RlZmluZSBQQlNfU09MSUQJCQkJCQkJMAotI2RlZmluZSBQQlNfREFTSAkJCQkJCQkxCi0jZGVmaW5lIFBCU19CRVZFTEVECQkJCQkJCTIKLSNkZWZpbmUgUEJTX0lOU0VUCQkJCQkJCTMKLSNkZWZpbmUgUEJTX1VOREVSTElORUQJCQkJCQk0Ci0jZGVmaW5lIFBCU19TSEFET1cJCQkJCQkJNQorLy8gYm9yZGVyIHN0eWxlCisjZGVmaW5lIFBCU19TT0xJRCAwCisjZGVmaW5lIFBCU19EQVNIIDEKKyNkZWZpbmUgUEJTX0JFVkVMRUQgMgorI2RlZmluZSBQQlNfSU5TRVQgMworI2RlZmluZSBQQlNfVU5ERVJMSU5FRCA0CisjZGVmaW5lIFBCU19TSEFET1cgNQogCi0vL25vdGlmaWNhdGlvbiBtZXNzYWdlcwotI2RlZmluZSBQTk1fQUREQ0hJTEQJCQkJCQkweDAwMDAwMDAwTAotI2RlZmluZSBQTk1fUkVNT1ZFQ0hJTEQJCQkJCQkweDAwMDAwMDAxTAotI2RlZmluZSBQTk1fU0VUU0NST0xMSU5GTwkJCQkJMHgwMDAwMDAwMkwKLSNkZWZpbmUgUE5NX1NFVFNDUk9MTFBPUwkJCQkJMHgwMDAwMDAwM0wKLSNkZWZpbmUgUE5NX1NDUk9MTFdJTkRPVwkJCQkJMHgwMDAwMDAwNEwKLSNkZWZpbmUgUE5NX0xCVVRUT05ET1dOCQkJCQkJMHgwMDAwMDAwNUwKLSNkZWZpbmUgUE5NX0xCVVRUT05VUAkJCQkJCTB4MDAwMDAwMDZMCi0jZGVmaW5lIFBOTV9NT1VTRU1PVkUJCQkJCQkweDAwMDAwMDA3TAotI2RlZmluZQlQTk1fTk9URVJFU0VUCQkJCQkJMHgwMDAwMDAwOEwKLSNkZWZpbmUgUE5NX1NFVENBUkVUSU5GTwkJCQkJMHgwMDAwMDAwOUwKLSNkZWZpbmUgUE5NX1NFTENIQU5HRUQJCQkJCQkweDAwMDAwMDBBTAotI2RlZmluZQlQTk1fTk9URUVESVRDSEFOR0VECQkJCQkweDAwMDAwMDBCTAorLy8gbm90aWZpY2F0aW9uIG1lc3NhZ2VzCisjZGVmaW5lIFBOTV9BRERDSElMRCAweDAwMDAwMDAwTAorI2RlZmluZSBQTk1fUkVNT1ZFQ0hJTEQgMHgwMDAwMDAwMUwKKyNkZWZpbmUgUE5NX1NFVFNDUk9MTElORk8gMHgwMDAwMDAwMkwKKyNkZWZpbmUgUE5NX1NFVFNDUk9MTFBPUyAweDAwMDAwMDAzTAorI2RlZmluZSBQTk1fU0NST0xMV0lORE9XIDB4MDAwMDAwMDRMCisjZGVmaW5lIFBOTV9MQlVUVE9ORE9XTiAweDAwMDAwMDA1TAorI2RlZmluZSBQTk1fTEJVVFRPTlVQIDB4MDAwMDAwMDZMCisjZGVmaW5lIFBOTV9NT1VTRU1PVkUgMHgwMDAwMDAwN0wKKyNkZWZpbmUgUE5NX05PVEVSRVNFVCAweDAwMDAwMDA4TAorI2RlZmluZSBQTk1fU0VUQ0FSRVRJTkZPIDB4MDAwMDAwMDlMCisjZGVmaW5lIFBOTV9TRUxDSEFOR0VEIDB4MDAwMDAwMEFMCisjZGVmaW5lIFBOTV9OT1RFRURJVENIQU5HRUQgMHgwMDAwMDAwQkwKIAotI2RlZmluZSBQV0xfQ0xBU1NOQU1FX0VESVQJCQkJCSJDUFdMX0VkaXQiCisjZGVmaW5lIFBXTF9DTEFTU05BTUVfRURJVCAiQ1BXTF9FZGl0IgogCi1zdHJ1Y3QgQ1BXTF9EYXNoCi17Ci0JQ1BXTF9EYXNoKGludDMyX3QgZGFzaCwgaW50MzJfdCBnYXAsIGludDMyX3QgcGhhc2UpIDogbkRhc2goZGFzaCksIG5HYXAoZ2FwKSwgblBoYXNlKHBoYXNlKQotCXt9CitzdHJ1Y3QgQ1BXTF9EYXNoIHsKKyAgQ1BXTF9EYXNoKGludDMyX3QgZGFzaCwgaW50MzJfdCBnYXAsIGludDMyX3QgcGhhc2UpCisgICAgICA6IG5EYXNoKGRhc2gpLCBuR2FwKGdhcCksIG5QaGFzZShwaGFzZSkge30KIAotCWludDMyX3QJCQluRGFzaDsKLQlpbnQzMl90CQkJbkdhcDsKLQlpbnQzMl90CQkJblBoYXNlOworICBpbnQzMl90IG5EYXNoOworICBpbnQzMl90IG5HYXA7CisgIGludDMyX3QgblBoYXNlOwogfTsKIAotc3RydWN0IENQV0xfQ29sb3IKLXsKLQlDUFdMX0NvbG9yKGludDMyX3QgdHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVCwgRlhfRkxPQVQgY29sb3IxID0gMC4wZiwgRlhfRkxPQVQgY29sb3IyID0gMC4wZiwgRlhfRkxPQVQgY29sb3IzID0gMC4wZiwgRlhfRkxPQVQgY29sb3I0ID0gMC4wZikKLQkJOiBuQ29sb3JUeXBlKHR5cGUpLCBmQ29sb3IxKGNvbG9yMSksIGZDb2xvcjIoY29sb3IyKSwgZkNvbG9yMyhjb2xvcjMpLCBmQ29sb3I0KGNvbG9yNCkKLQl7fQorc3RydWN0IENQV0xfQ29sb3IgeworICBDUFdMX0NvbG9yKGludDMyX3QgdHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVCwKKyAgICAgICAgICAgICBGWF9GTE9BVCBjb2xvcjEgPSAwLjBmLAorICAgICAgICAgICAgIEZYX0ZMT0FUIGNvbG9yMiA9IDAuMGYsCisgICAgICAgICAgICAgRlhfRkxPQVQgY29sb3IzID0gMC4wZiwKKyAgICAgICAgICAgICBGWF9GTE9BVCBjb2xvcjQgPSAwLjBmKQorICAgICAgOiBuQ29sb3JUeXBlKHR5cGUpLAorICAgICAgICBmQ29sb3IxKGNvbG9yMSksCisgICAgICAgIGZDb2xvcjIoY29sb3IyKSwKKyAgICAgICAgZkNvbG9yMyhjb2xvcjMpLAorICAgICAgICBmQ29sb3I0KGNvbG9yNCkge30KIAotCUNQV0xfQ29sb3IoaW50MzJfdCByLCBpbnQzMl90IGcsIGludDMyX3QgYikgOgotCQluQ29sb3JUeXBlKENPTE9SVFlQRV9SR0IpLCBmQ29sb3IxKHIvMjU1LjBmKSwgZkNvbG9yMihnLzI1NS4wZiksIGZDb2xvcjMoYi8yNTUuMGYpLCBmQ29sb3I0KDApCi0Je30KKyAgQ1BXTF9Db2xvcihpbnQzMl90IHIsIGludDMyX3QgZywgaW50MzJfdCBiKQorICAgICAgOiBuQ29sb3JUeXBlKENPTE9SVFlQRV9SR0IpLAorICAgICAgICBmQ29sb3IxKHIgLyAyNTUuMGYpLAorICAgICAgICBmQ29sb3IyKGcgLyAyNTUuMGYpLAorICAgICAgICBmQ29sb3IzKGIgLyAyNTUuMGYpLAorICAgICAgICBmQ29sb3I0KDApIHt9CiAKLQl2b2lkIENvbnZlcnRDb2xvclR5cGUoaW50MzJfdCBvdGhlcl9uQ29sb3JUeXBlKTsKKyAgdm9pZCBDb252ZXJ0Q29sb3JUeXBlKGludDMyX3Qgb3RoZXJfbkNvbG9yVHlwZSk7CiAKLQkvKgotCUNPTE9SVFlQRV9UUkFOU1BBUkVOVAotCUNPTE9SVFlQRV9SR0IKLQlDT0xPUlRZUEVfQ01ZSwotCUNPTE9SVFlQRV9HUkFZCi0JKi8KLQlpbnQzMl90CQkJCQluQ29sb3JUeXBlOwotCUZYX0ZMT0FUCQkJCQlmQ29sb3IxLGZDb2xvcjIsZkNvbG9yMyxmQ29sb3I0OworICAvKgorICBDT0xPUlRZUEVfVFJBTlNQQVJFTlQKKyAgQ09MT1JUWVBFX1JHQgorICBDT0xPUlRZUEVfQ01ZSworICBDT0xPUlRZUEVfR1JBWQorICAqLworICBpbnQzMl90IG5Db2xvclR5cGU7CisgIEZYX0ZMT0FUIGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjQ7CiB9OwogCi1pbmxpbmUgRlhfQk9PTCBvcGVyYXRvciA9PSAoY29uc3QgQ1BXTF9Db2xvciAmYzEsIGNvbnN0IENQV0xfQ29sb3IgJmMyKQotewotCXJldHVybiBjMS5uQ29sb3JUeXBlID09IGMyLm5Db2xvclR5cGUgJiYKLQkJYzEuZkNvbG9yMSAtIGMyLmZDb2xvcjEgPCAwLjAwMDEgJiYgYzEuZkNvbG9yMSAtIGMyLmZDb2xvcjEgPiAtMC4wMDAxICYmCi0JCWMxLmZDb2xvcjIgLSBjMi5mQ29sb3IyIDwgMC4wMDAxICYmIGMxLmZDb2xvcjIgLSBjMi5mQ29sb3IyID4gLTAuMDAwMSAmJgotCQljMS5mQ29sb3IzIC0gYzIuZkNvbG9yMyA8IDAuMDAwMSAmJiBjMS5mQ29sb3IzIC0gYzIuZkNvbG9yMyA+IC0wLjAwMDEgJiYKLQkJYzEuZkNvbG9yNCAtIGMyLmZDb2xvcjQgPCAwLjAwMDEgJiYgYzEuZkNvbG9yNCAtIGMyLmZDb2xvcjQgPiAtMC4wMDAxOworaW5saW5lIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBDUFdMX0NvbG9yJiBjMSwgY29uc3QgQ1BXTF9Db2xvciYgYzIpIHsKKyAgcmV0dXJuIGMxLm5Db2xvclR5cGUgPT0gYzIubkNvbG9yVHlwZSAmJiBjMS5mQ29sb3IxIC0gYzIuZkNvbG9yMSA8IDAuMDAwMSAmJgorICAgICAgICAgYzEuZkNvbG9yMSAtIGMyLmZDb2xvcjEgPiAtMC4wMDAxICYmCisgICAgICAgICBjMS5mQ29sb3IyIC0gYzIuZkNvbG9yMiA8IDAuMDAwMSAmJgorICAgICAgICAgYzEuZkNvbG9yMiAtIGMyLmZDb2xvcjIgPiAtMC4wMDAxICYmCisgICAgICAgICBjMS5mQ29sb3IzIC0gYzIuZkNvbG9yMyA8IDAuMDAwMSAmJgorICAgICAgICAgYzEuZkNvbG9yMyAtIGMyLmZDb2xvcjMgPiAtMC4wMDAxICYmCisgICAgICAgICBjMS5mQ29sb3I0IC0gYzIuZkNvbG9yNCA8IDAuMDAwMSAmJiBjMS5mQ29sb3I0IC0gYzIuZkNvbG9yNCA+IC0wLjAwMDE7CiB9CiAKLWlubGluZSBGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDUFdMX0NvbG9yICZjMSwgY29uc3QgQ1BXTF9Db2xvciAmYzIpCi17Ci0JcmV0dXJuICFvcGVyYXRvciA9PSAoYzEsIGMyKTsKK2lubGluZSBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ1BXTF9Db2xvciYgYzEsIGNvbnN0IENQV0xfQ29sb3ImIGMyKSB7CisgIHJldHVybiAhb3BlcmF0b3I9PShjMSwgYzIpOwogfQogCi0jZGVmaW5lIFBXTF9TQ1JPTExCQVJfV0lEVEgJCQkJCTEyLjBmCi0jZGVmaW5lIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRICQkJOS4wZgotI2RlZmluZSBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSAkyLjBmCi0jZGVmaW5lIFBXTF9TQ1JPTExCQVJfVFJBTlNQQVJBTkNZCQkJMTUwCi0jZGVmaW5lIFBXTF9TQ1JPTExCQVJfQktDT0xPUgkJCQlDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMjIwLjBmLzI1NS4wZiwyMjAuMGYvMjU1LjBmLDIyMC4wZi8yNTUuMGYpCi0jZGVmaW5lIFBXTF9ERUZBVUxUX1NFTFRFWFRDT0xPUgkJCUNQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwxLDEsMSkKLSNkZWZpbmUgUFdMX0RFRkFVTFRfU0VMQkFDS0NPTE9SCQkJQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLDAsNTEuMGYvMjU1LjBmLDExMy4wZi8yNTUuMGYpCi0jZGVmaW5lIFBXTF9ERUZBVUxUX0JBQ0tDT0xPUgkJCQlQV0xfREVGQVVMVF9TRUxURVhUQ09MT1IKLSNkZWZpbmUgUFdMX0RFRkFVTFRfVEVYVENPTE9SCQkJCUNQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwwLDAsMCkKLSNkZWZpbmUgUFdMX0RFRkFVTFRfRk9OVFNJWkUJCQkJOS4wZgotI2RlZmluZSBQV0xfREVGQVVMVF9CTEFDS0NPTE9SCQkJCUNQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMCkKLSNkZWZpbmUgUFdMX0RFRkFVTFRfV0hJVEVDT0xPUgkJCQlDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpCi0jZGVmaW5lIFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SCQkJQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwLjUwKQotI2RlZmluZSBQV0xfREVGQVVMVF9MSUdIVEdSQVlDT0xPUgkJCUNQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMC43NSkKLSNkZWZpbmUgUFdMX1RSSUFOR0xFX0hBTEZMRU4JCQkJMi4wZgotI2RlZmluZQlQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTgkJMy4wZgotI2RlZmluZSBQV0xfSU5WQUxJREFURV9JTkZMQVRFCQkJCTIKKyNkZWZpbmUgUFdMX1NDUk9MTEJBUl9XSURUSCAxMi4wZgorI2RlZmluZSBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCA5LjBmCisjZGVmaW5lIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIIDIuMGYKKyNkZWZpbmUgUFdMX1NDUk9MTEJBUl9UUkFOU1BBUkFOQ1kgMTUwCisjZGVmaW5lIFBXTF9TQ1JPTExCQVJfQktDT0xPUiBcCisgIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMjIwLjBmIC8gMjU1LjBmLCAyMjAuMGYgLyAyNTUuMGYsIDIyMC4wZiAvIDI1NS4wZikKKyNkZWZpbmUgUFdMX0RFRkFVTFRfU0VMVEVYVENPTE9SIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMSwgMSwgMSkKKyNkZWZpbmUgUFdMX0RFRkFVTFRfU0VMQkFDS0NPTE9SIFwKKyAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAwLCA1MS4wZiAvIDI1NS4wZiwgMTEzLjBmIC8gMjU1LjBmKQorI2RlZmluZSBQV0xfREVGQVVMVF9CQUNLQ09MT1IgUFdMX0RFRkFVTFRfU0VMVEVYVENPTE9SCisjZGVmaW5lIFBXTF9ERUZBVUxUX1RFWFRDT0xPUiBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDAsIDAsIDApCisjZGVmaW5lIFBXTF9ERUZBVUxUX0ZPTlRTSVpFIDkuMGYKKyNkZWZpbmUgUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUiBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKQorI2RlZmluZSBQV0xfREVGQVVMVF9XSElURUNPTE9SIENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpCisjZGVmaW5lIFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SIENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNTApCisjZGVmaW5lIFBXTF9ERUZBVUxUX0xJR0hUR1JBWUNPTE9SIENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNzUpCisjZGVmaW5lIFBXTF9UUklBTkdMRV9IQUxGTEVOIDIuMGYKKyNkZWZpbmUgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gMy4wZgorI2RlZmluZSBQV0xfSU5WQUxJREFURV9JTkZMQVRFIDIKIAotY2xhc3MgSVBXTF9TcGVsbENoZWNrCi17Ci1wdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgfklQV0xfU3BlbGxDaGVjaygpIHsgfQotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlDaGVja1dvcmQoY29uc3QgRlhfQ0hBUiogc1dvcmQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU3VnZ2VzdFdvcmRzKGNvbnN0IEZYX0NIQVIqIHNXb3JkLCBDRlhfQnl0ZVN0cmluZ0FycmF5ICYgc1N1Z2dlc3QpID0gMDsKK2NsYXNzIElQV0xfU3BlbGxDaGVjayB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUFdMX1NwZWxsQ2hlY2soKSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tXb3JkKGNvbnN0IEZYX0NIQVIqIHNXb3JkKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTdWdnZXN0V29yZHMoY29uc3QgRlhfQ0hBUiogc1dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpID0gMDsKIH07CiAKLWNsYXNzIElQV0xfUHJvdmlkZXIKLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB+SVBXTF9Qcm92aWRlcigpIHsgfQorY2xhc3MgSVBXTF9Qcm92aWRlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUFdMX1Byb3ZpZGVyKCkge30KIAotCS8vZ2V0IGEgbWF0cml4IHdoaWNoIG1hcCB1c2VyIHNwYWNlIHRvIENXbmQgY2xpZW50IHNwYWNlCi0JdmlydHVhbCBDUERGX01hdHJpeAkJCQkJCUdldFdpbmRvd01hdHJpeCh2b2lkKiBwQXR0YWNoZWREYXRhKSA9IDA7CisgIC8vIGdldCBhIG1hdHJpeCB3aGljaCBtYXAgdXNlciBzcGFjZSB0byBDV25kIGNsaWVudCBzcGFjZQorICB2aXJ0dWFsIENQREZfTWF0cml4IEdldFdpbmRvd01hdHJpeCh2b2lkKiBwQXR0YWNoZWREYXRhKSA9IDA7CiAKLQkvKgotCTAgTCImVW5kb1x0Q3RybCtaIgotCTEgTCImUmVkb1x0Q3RybCtTaGlmdCtaIgotCTIgTCJDdSZ0XHRDdHJsK1giCi0JMyBMIiZDb3B5XHRDdHJsK0MiCi0JNCBMIiZQYXN0ZVx0Q3RybCtWIgotCTUgTCImRGVsZXRlIgotCTYgIEwiJlNlbGVjdCBBbGxcdEN0cmwrQSIKLQkqLwotCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQkJCUxvYWRQb3B1cE1lbnVTdHJpbmcoaW50MzJfdCBuSW5kZXgpID0gMDsKKyAgLyoKKyAgMCBMIiZVbmRvXHRDdHJsK1oiCisgIDEgTCImUmVkb1x0Q3RybCtTaGlmdCtaIgorICAyIEwiQ3UmdFx0Q3RybCtYIgorICAzIEwiJkNvcHlcdEN0cmwrQyIKKyAgNCBMIiZQYXN0ZVx0Q3RybCtWIgorICA1IEwiJkRlbGV0ZSIKKyAgNiAgTCImU2VsZWN0IEFsbFx0Q3RybCtBIgorICAqLworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIExvYWRQb3B1cE1lbnVTdHJpbmcoaW50MzJfdCBuSW5kZXgpID0gMDsKIH07CiAKLWNsYXNzIElQV0xfRm9jdXNIYW5kbGVyCi17Ci1wdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgfklQV0xfRm9jdXNIYW5kbGVyKCkgeyB9Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25LaWxsRm9jdXMoQ1BXTF9XbmQqIHBXbmQpID0gMDsKK2NsYXNzIElQV0xfRm9jdXNIYW5kbGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklQV0xfRm9jdXNIYW5kbGVyKCkge30KKyAgdmlydHVhbCB2b2lkIE9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uS2lsbEZvY3VzKENQV0xfV25kKiBwV25kKSA9IDA7CiB9OwogCi1zdHJ1Y3QgUFdMX0NSRUFURVBBUkFNCi17Ci1wdWJsaWM6Ci0JUFdMX0NSRUFURVBBUkFNKCkgOiByY1JlY3RXbmQoMCwwLDAsMCksCi0JCXBTeXN0ZW1IYW5kbGVyKE5VTEwpLAotCQlwRm9udE1hcChOVUxMKSwKLQkJcFByb3ZpZGVyKE5VTEwpLAotCQlwRm9jdXNIYW5kbGVyKE5VTEwpLAotCQlkd0ZsYWdzKDApLAotCQlzQmFja2dyb3VuZENvbG9yKCksCi0JCWhBdHRhY2hlZFduZChOVUxMKSwKLQkJcFNwZWxsQ2hlY2soTlVMTCksCi0JCW5Cb3JkZXJTdHlsZShQQlNfU09MSUQpLAotCQlkd0JvcmRlcldpZHRoKDEpLAotCQlzQm9yZGVyQ29sb3IoKSwKLQkJc1RleHRDb2xvcigpLAotCQlzVGV4dFN0cm9rZUNvbG9yKCksCi0JCW5UcmFuc3BhcmVuY3koMjU1KSwKLQkJZkZvbnRTaXplKFBXTF9ERUZBVUxUX0ZPTlRTSVpFKSwKLQkJc0Rhc2goMywwLDApLAotCQlwQXR0YWNoZWREYXRhKE5VTEwpLAotCQlwUGFyZW50V25kKE5VTEwpLAotCQlwTXNnQ29udHJvbChOVUxMKSwKLQkJZUN1cnNvclR5cGUoRlhDVF9BUlJPVyksCi0JCW10Q2hpbGQoMSwwLDAsMSwwLDApCi0JewotCX0KK3N0cnVjdCBQV0xfQ1JFQVRFUEFSQU0geworIHB1YmxpYzoKKyAgUFdMX0NSRUFURVBBUkFNKCkKKyAgICAgIDogcmNSZWN0V25kKDAsIDAsIDAsIDApLAorICAgICAgICBwU3lzdGVtSGFuZGxlcihOVUxMKSwKKyAgICAgICAgcEZvbnRNYXAoTlVMTCksCisgICAgICAgIHBQcm92aWRlcihOVUxMKSwKKyAgICAgICAgcEZvY3VzSGFuZGxlcihOVUxMKSwKKyAgICAgICAgZHdGbGFncygwKSwKKyAgICAgICAgc0JhY2tncm91bmRDb2xvcigpLAorICAgICAgICBoQXR0YWNoZWRXbmQoTlVMTCksCisgICAgICAgIHBTcGVsbENoZWNrKE5VTEwpLAorICAgICAgICBuQm9yZGVyU3R5bGUoUEJTX1NPTElEKSwKKyAgICAgICAgZHdCb3JkZXJXaWR0aCgxKSwKKyAgICAgICAgc0JvcmRlckNvbG9yKCksCisgICAgICAgIHNUZXh0Q29sb3IoKSwKKyAgICAgICAgc1RleHRTdHJva2VDb2xvcigpLAorICAgICAgICBuVHJhbnNwYXJlbmN5KDI1NSksCisgICAgICAgIGZGb250U2l6ZShQV0xfREVGQVVMVF9GT05UU0laRSksCisgICAgICAgIHNEYXNoKDMsIDAsIDApLAorICAgICAgICBwQXR0YWNoZWREYXRhKE5VTEwpLAorICAgICAgICBwUGFyZW50V25kKE5VTEwpLAorICAgICAgICBwTXNnQ29udHJvbChOVUxMKSwKKyAgICAgICAgZUN1cnNvclR5cGUoRlhDVF9BUlJPVyksCisgICAgICAgIG10Q2hpbGQoMSwgMCwgMCwgMSwgMCwgMCkge30KIAotCUNQREZfUmVjdAkJCQlyY1JlY3RXbmQ7CQkJCS8vcmVxdWlyZWQKLQlJRlhfU3lzdGVtSGFuZGxlcioJCXBTeXN0ZW1IYW5kbGVyOwkJCS8vcmVxdWlyZWQKLQlJRlhfRWRpdF9Gb250TWFwKgkJcEZvbnRNYXA7CQkJCS8vcmVxdWlyZWQgZm9yIHRleHQgd2luZG93Ci0JSVBXTF9Qcm92aWRlcioJCQlwUHJvdmlkZXI7CQkJCS8vcmVxdWlyZWQgZm9yIHNlbGYgY29vcmRpbmF0ZQotCUlQV0xfRm9jdXNIYW5kbGVyKgkJcEZvY3VzSGFuZGxlcjsJCQkvL29wdGlvbmFsCi0JRlhfRFdPUkQJCQkJZHdGbGFnczsJCQkJLy9vcHRpb25hbAotCUNQV0xfQ29sb3IJCQkJc0JhY2tncm91bmRDb2xvcjsJCS8vb3B0aW9uYWwKLQlGWF9IV05ECQkJCQloQXR0YWNoZWRXbmQ7CQkJLy9yZXF1aXJlZCBmb3Igbm8tcmVhZGVyIGZyYW1ld29yawotCUlQV0xfU3BlbGxDaGVjayoJCXBTcGVsbENoZWNrOwkJCS8vcmVxdWlyZWQgZm9yIHNwZWxsY2hlY2tpbmcKLQlpbnQzMl90CQkJCW5Cb3JkZXJTdHlsZTsJCQkvL29wdGlvbmFsCi0JaW50MzJfdAkJCQlkd0JvcmRlcldpZHRoOwkJCS8vb3B0aW9uYWwKLQlDUFdMX0NvbG9yCQkJCXNCb3JkZXJDb2xvcjsJCQkvL29wdGlvbmFsCi0JQ1BXTF9Db2xvcgkJCQlzVGV4dENvbG9yOwkJCQkvL29wdGlvbmFsCi0JQ1BXTF9Db2xvcgkJCQlzVGV4dFN0cm9rZUNvbG9yOwkJLy9vcHRpb25hbAotCWludDMyX3QJCQkJblRyYW5zcGFyZW5jeTsJCQkvL29wdGlvbmFsCi0JRlhfRkxPQVQJCQkJZkZvbnRTaXplOwkJCQkvL29wdGlvbmFsCi0JQ1BXTF9EYXNoCQkJCXNEYXNoOwkJCQkJLy9vcHRpb25hbAotCXZvaWQqCQkJCQlwQXR0YWNoZWREYXRhOwkJCS8vb3B0aW9uYWwKLQlDUFdMX1duZCoJCQkJcFBhcmVudFduZDsJCQkJLy9pZ25vcmUKLQlDUFdMX01zZ0NvbnRyb2wqCQlwTXNnQ29udHJvbDsJCQkvL2lnbm9yZQotCWludDMyX3QJCQkJZUN1cnNvclR5cGU7CQkJLy9pZ25vcmUKLQlDUERGX01hdHJpeAkJCQltdENoaWxkOwkJCQkvL2lnbm9yZQorICBDUERGX1JlY3QgcmNSZWN0V25kOyAgLy8gcmVxdWlyZWQKKyAgSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyOyAgLy8gcmVxdWlyZWQKKyAgSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXA7ICAvLyByZXF1aXJlZCBmb3IgdGV4dCB3aW5kb3cKKyAgSVBXTF9Qcm92aWRlciogcFByb3ZpZGVyOyAgLy8gcmVxdWlyZWQgZm9yIHNlbGYgY29vcmRpbmF0ZQorICBJUFdMX0ZvY3VzSGFuZGxlciogcEZvY3VzSGFuZGxlcjsgIC8vIG9wdGlvbmFsCisgIEZYX0RXT1JEIGR3RmxhZ3M7ICAvLyBvcHRpb25hbAorICBDUFdMX0NvbG9yIHNCYWNrZ3JvdW5kQ29sb3I7ICAvLyBvcHRpb25hbAorICBGWF9IV05EIGhBdHRhY2hlZFduZDsgIC8vIHJlcXVpcmVkIGZvciBuby1yZWFkZXIgZnJhbWV3b3JrCisgIElQV0xfU3BlbGxDaGVjayogcFNwZWxsQ2hlY2s7ICAvLyByZXF1aXJlZCBmb3Igc3BlbGxjaGVja2luZworICBpbnQzMl90IG5Cb3JkZXJTdHlsZTsgIC8vIG9wdGlvbmFsCisgIGludDMyX3QgZHdCb3JkZXJXaWR0aDsgIC8vIG9wdGlvbmFsCisgIENQV0xfQ29sb3Igc0JvcmRlckNvbG9yOyAgLy8gb3B0aW9uYWwKKyAgQ1BXTF9Db2xvciBzVGV4dENvbG9yOyAgLy8gb3B0aW9uYWwKKyAgQ1BXTF9Db2xvciBzVGV4dFN0cm9rZUNvbG9yOyAgLy8gb3B0aW9uYWwKKyAgaW50MzJfdCBuVHJhbnNwYXJlbmN5OyAgLy8gb3B0aW9uYWwKKyAgRlhfRkxPQVQgZkZvbnRTaXplOyAgLy8gb3B0aW9uYWwKKyAgQ1BXTF9EYXNoIHNEYXNoOyAgLy8gb3B0aW9uYWwKKyAgdm9pZCogcEF0dGFjaGVkRGF0YTsgIC8vIG9wdGlvbmFsCisgIENQV0xfV25kKiBwUGFyZW50V25kOyAgLy8gaWdub3JlCisgIENQV0xfTXNnQ29udHJvbCogcE1zZ0NvbnRyb2w7ICAvLyBpZ25vcmUKKyAgaW50MzJfdCBlQ3Vyc29yVHlwZTsgIC8vIGlnbm9yZQorICBDUERGX01hdHJpeCBtdENoaWxkOyAgLy8gaWdub3JlCiB9OwogCi1jbGFzcyBDUFdMX1RpbWVyCi17Ci1wdWJsaWM6Ci0JQ1BXTF9UaW1lcihDUFdMX1RpbWVySGFuZGxlciogcEF0dGFjaGVkLCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOwotCXZpcnR1YWwgfkNQV0xfVGltZXIoKTsKK2NsYXNzIENQV0xfVGltZXIgeworIHB1YmxpYzoKKyAgQ1BXTF9UaW1lcihDUFdMX1RpbWVySGFuZGxlciogcEF0dGFjaGVkLCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOworICB2aXJ0dWFsIH5DUFdMX1RpbWVyKCk7CiAKLQlpbnQzMl90CQkJCQkJCVNldFBXTFRpbWVyKGludDMyX3QgbkVsYXBzZSk7Ci0Jdm9pZAkJCQkJCQkJS2lsbFBXTFRpbWVyKCk7Ci0Jc3RhdGljIHZvaWQgCQkJCQkJVGltZXJQcm9jKGludDMyX3QgaWRFdmVudCk7CisgIGludDMyX3QgU2V0UFdMVGltZXIoaW50MzJfdCBuRWxhcHNlKTsKKyAgdm9pZCBLaWxsUFdMVGltZXIoKTsKKyAgc3RhdGljIHZvaWQgVGltZXJQcm9jKGludDMyX3QgaWRFdmVudCk7CiAKLXByaXZhdGU6Ci0JaW50MzJfdAkJCQkJCQltX25UaW1lcklEOwotCUNQV0xfVGltZXJIYW5kbGVyKgkJCQkJbV9wQXR0YWNoZWQ7Ci0JSUZYX1N5c3RlbUhhbmRsZXIqCQkJCQltX3BTeXN0ZW1IYW5kbGVyOworIHByaXZhdGU6CisgIGludDMyX3QgbV9uVGltZXJJRDsKKyAgQ1BXTF9UaW1lckhhbmRsZXIqIG1fcEF0dGFjaGVkOworICBJRlhfU3lzdGVtSGFuZGxlciogbV9wU3lzdGVtSGFuZGxlcjsKIH07CiAKLWNsYXNzIENQV0xfVGltZXJIYW5kbGVyCi17Ci1wdWJsaWM6Ci0JQ1BXTF9UaW1lckhhbmRsZXIoKTsKLQl2aXJ0dWFsIH5DUFdMX1RpbWVySGFuZGxlcigpOworY2xhc3MgQ1BXTF9UaW1lckhhbmRsZXIgeworIHB1YmxpYzoKKyAgQ1BXTF9UaW1lckhhbmRsZXIoKTsKKyAgdmlydHVhbCB+Q1BXTF9UaW1lckhhbmRsZXIoKTsKIAotCXZvaWQJCQkJCQkJCUJlZ2luVGltZXIoaW50MzJfdCBuRWxhcHNlKTsKLQl2b2lkCQkJCQkJCQlFbmRUaW1lcigpOwotCXZpcnR1YWwgdm9pZAkJCQkJCVRpbWVyUHJvYygpOwotCXZpcnR1YWwgSUZYX1N5c3RlbUhhbmRsZXIqCQkJR2V0U3lzdGVtSGFuZGxlcigpIGNvbnN0ID0gMDsKKyAgdm9pZCBCZWdpblRpbWVyKGludDMyX3QgbkVsYXBzZSk7CisgIHZvaWQgRW5kVGltZXIoKTsKKyAgdmlydHVhbCB2b2lkIFRpbWVyUHJvYygpOworICB2aXJ0dWFsIElGWF9TeXN0ZW1IYW5kbGVyKiBHZXRTeXN0ZW1IYW5kbGVyKCkgY29uc3QgPSAwOwogCi1wcml2YXRlOgotCUNQV0xfVGltZXIqCQkJCQkJCW1fcFRpbWVyOworIHByaXZhdGU6CisgIENQV0xfVGltZXIqIG1fcFRpbWVyOwogfTsKIAotY2xhc3MgQ1BXTF9XbmQgOiBwdWJsaWMgQ1BXTF9UaW1lckhhbmRsZXIKLXsKLQlmcmllbmQgY2xhc3MgQ1BXTF9Nc2dDb250cm9sOwotcHVibGljOgotCUNQV0xfV25kKCk7Ci0JdmlydHVhbCB+Q1BXTF9XbmQoKTsKK2NsYXNzIENQV0xfV25kIDogcHVibGljIENQV0xfVGltZXJIYW5kbGVyIHsKKyAgZnJpZW5kIGNsYXNzIENQV0xfTXNnQ29udHJvbDsKIAotCXZvaWQJCQkJCQkJQ3JlYXRlKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQlEZXN0cm95KCk7Ci0Jdm9pZAkJCQkJCQlNb3ZlKGNvbnN0IENQREZfUmVjdCAmIHJjTmV3LEZYX0JPT0wgYlJlc2V0LEZYX0JPT0wgYlJlZnJlc2gpOwotCXZpcnR1YWwgdm9pZAkJCQkJSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0KiBwUmVjdCA9IE5VTEwpOworIHB1YmxpYzoKKyAgQ1BXTF9XbmQoKTsKKyAgdmlydHVhbCB+Q1BXTF9XbmQoKTsKIAotCXZvaWQJCQkJCQkJR2V0QXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVN0cmluZyAmIHNBcHBTdHJlYW0pOwotCXZvaWQJCQkJCQkJRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgIHZvaWQgQ3JlYXRlKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApOworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0OworICB2b2lkIERlc3Ryb3koKTsKKyAgdm9pZCBNb3ZlKGNvbnN0IENQREZfUmVjdCYgcmNOZXcsIEZYX0JPT0wgYlJlc2V0LCBGWF9CT09MIGJSZWZyZXNoKTsKKyAgdmlydHVhbCB2b2lkIEludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QgPSBOVUxMKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uS2V5VXAoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTUJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTUJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbk1CdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uUkJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uUkJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZvaWQgR2V0QXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVN0cmluZyYgc0FwcFN0cmVhbSk7CisgIHZvaWQgRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvY3VzKCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlLaWxsRm9jdXMoKTsKLQl2b2lkCQkJCQkJCVNldENhcHR1cmUoKTsKLQl2b2lkCQkJCQkJCVJlbGVhc2VDYXB0dXJlKCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlVcChGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25NQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1CdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1CdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpOwogCi0JdmlydHVhbCB2b2lkCQkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHRDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpOwotCXZpcnR1YWwgdm9pZAkJCQkJU2V0VGV4dFN0cm9rZUNvbG9yKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcik7Ci0JdmlydHVhbCB2b2lkCQkJCQlTZXRWaXNpYmxlKEZYX0JPT0wgYlZpc2libGUpOworICB2aXJ0dWFsIHZvaWQgU2V0Rm9jdXMoKTsKKyAgdmlydHVhbCB2b2lkIEtpbGxGb2N1cygpOworICB2b2lkIFNldENhcHR1cmUoKTsKKyAgdm9pZCBSZWxlYXNlQ2FwdHVyZSgpOwogCi0JdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0Rm9jdXNSZWN0KCkgY29uc3Q7Ci0JdmlydHVhbCBDUFdMX0NvbG9yCQkJCUdldEJhY2tncm91bmRDb2xvcigpIGNvbnN0OwotCXZpcnR1YWwgQ1BXTF9Db2xvcgkJCQlHZXRCb3JkZXJDb2xvcigpIGNvbnN0OwotCXZpcnR1YWwgQ1BXTF9Db2xvcgkJCQlHZXRUZXh0Q29sb3IoKSBjb25zdDsKLQl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJR2V0VGV4dFN0cm9rZUNvbG9yKCkgY29uc3Q7Ci0JdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRGb250U2l6ZSgpIGNvbnN0OwotCXZpcnR1YWwgaW50MzJfdAkJCQlHZXRJbm5lckJvcmRlcldpZHRoKCkgY29uc3Q7Ci0JdmlydHVhbCBDUFdMX0NvbG9yCQkJCUdldEJvcmRlckxlZnRUb3BDb2xvcihpbnQzMl90IG5Cb3JkZXJTdHlsZSkgY29uc3Q7Ci0JdmlydHVhbCBDUFdMX0NvbG9yCQkJCUdldEJvcmRlclJpZ2h0Qm90dG9tQ29sb3IoaW50MzJfdCBuQm9yZGVyU3R5bGUpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtID0gMCk7CisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworICB2aXJ0dWFsIHZvaWQgU2V0VGV4dFN0cm9rZUNvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKKyAgdmlydHVhbCB2b2lkIFNldFZpc2libGUoRlhfQk9PTCBiVmlzaWJsZSk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzTW9kaWZpZWQoKSBjb25zdCB7cmV0dXJuIEZBTFNFO30KKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0Rm9jdXNSZWN0KCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BXTF9Db2xvciBHZXRCYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgdmlydHVhbCBDUFdMX0NvbG9yIEdldEJvcmRlckNvbG9yKCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BXTF9Db2xvciBHZXRUZXh0Q29sb3IoKSBjb25zdDsKKyAgdmlydHVhbCBDUFdMX0NvbG9yIEdldFRleHRTdHJva2VDb2xvcigpIGNvbnN0OworICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3Q7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRJbm5lckJvcmRlcldpZHRoKCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BXTF9Db2xvciBHZXRCb3JkZXJMZWZ0VG9wQ29sb3IoaW50MzJfdCBuQm9yZGVyU3R5bGUpIGNvbnN0OworICB2aXJ0dWFsIENQV0xfQ29sb3IgR2V0Qm9yZGVyUmlnaHRCb3R0b21Db2xvcihpbnQzMl90IG5Cb3JkZXJTdHlsZSkgY29uc3Q7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBJc01vZGlmaWVkKCkgY29uc3QgeyByZXR1cm4gRkFMU0U7IH0KIAotCXZvaWQJCQkJCQkJU2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcik7Ci0Jdm9pZAkJCQkJCQlTZXRCb3JkZXJDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpOwotCXZvaWQJCQkJCQkJU2V0Qm9yZGVyV2lkdGgoaW50MzJfdCBuQm9yZGVyV2lkdGgpOwotCXZvaWQJCQkJCQkJU2V0Q2xpcFJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCk7Ci0Jdm9pZAkJCQkJCQlTZXRCb3JkZXJTdHlsZShpbnQzMl90IGVCb3JkZXJTdHlsZSk7Ci0Jdm9pZAkJCQkJCQlTZXRCb3JkZXJEYXNoKGNvbnN0IENQV0xfRGFzaCAmIHNEYXNoKTsKKyAgdmlydHVhbCB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CiAKLQlDUERGX1JlY3QJCQkJCQlHZXRPcmlnaW5XaW5kb3dSZWN0KCkgY29uc3Q7Ci0JdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0V2luZG93UmVjdCgpIGNvbnN0OwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldENsaWVudFJlY3QoKSBjb25zdDsKLQlDUERGX1BvaW50CQkJCQkJR2V0Q2VudGVyUG9pbnQoKSBjb25zdDsKLQlDUERGX1JlY3QJCQkJCQlHZXRDbGllbnRDZW50ZXJTcXVhcmUoKSBjb25zdDsKLQlDUERGX1JlY3QJCQkJCQlHZXRXaW5kb3dDZW50ZXJTcXVhcmUoKSBjb25zdDsKLQlpbnQzMl90CQkJCQkJR2V0Qm9yZGVyV2lkdGgoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzVmlzaWJsZSgpIGNvbnN0IHtyZXR1cm4gbV9iVmlzaWJsZTt9Ci0JRlhfQk9PTAkJCQkJCQlIYXNGbGFnKEZYX0RXT1JEIGR3RmxhZ3MpIGNvbnN0OwotCXZvaWQJCQkJCQkJQWRkRmxhZyhGWF9EV09SRCBkd0ZsYWdzKTsKLQl2b2lkCQkJCQkJCVJlbW92ZUZsYWcoRlhfRFdPUkQgZHdGbGFncyk7Ci0JQ1BERl9SZWN0CQkJCQkJR2V0Q2xpcFJlY3QoKSBjb25zdDsKLQlDUFdMX1duZCoJCQkJCQlHZXRQYXJlbnRXaW5kb3coKSBjb25zdDsKLQlpbnQzMl90CQkJCQkJR2V0Qm9yZGVyU3R5bGUoKSBjb25zdDsKLQlDUFdMX0Rhc2gJCQkJCQlHZXRCb3JkZXJEYXNoKCkgY29uc3Q7Ci0Jdm9pZCoJCQkJCQkJR2V0QXR0YWNoZWREYXRhKCkgY29uc3Q7CisgIHZvaWQgU2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKKyAgdm9pZCBTZXRCb3JkZXJDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CisgIHZvaWQgU2V0Qm9yZGVyV2lkdGgoaW50MzJfdCBuQm9yZGVyV2lkdGgpOworICB2b2lkIFNldENsaXBSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCk7CisgIHZvaWQgU2V0Qm9yZGVyU3R5bGUoaW50MzJfdCBlQm9yZGVyU3R5bGUpOworICB2b2lkIFNldEJvcmRlckRhc2goY29uc3QgQ1BXTF9EYXNoJiBzRGFzaCk7CiAKLQlGWF9CT09MCQkJCQkJCVduZEhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUNsaWVudEhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzQ2FwdHVyZU1vdXNlKCkgY29uc3Q7CisgIENQREZfUmVjdCBHZXRPcmlnaW5XaW5kb3dSZWN0KCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldFdpbmRvd1JlY3QoKSBjb25zdDsKKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0Q2xpZW50UmVjdCgpIGNvbnN0OworICBDUERGX1BvaW50IEdldENlbnRlclBvaW50KCkgY29uc3Q7CisgIENQREZfUmVjdCBHZXRDbGllbnRDZW50ZXJTcXVhcmUoKSBjb25zdDsKKyAgQ1BERl9SZWN0IEdldFdpbmRvd0NlbnRlclNxdWFyZSgpIGNvbnN0OworICBpbnQzMl90IEdldEJvcmRlcldpZHRoKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNWaXNpYmxlKCkgY29uc3QgeyByZXR1cm4gbV9iVmlzaWJsZTsgfQorICBGWF9CT09MIEhhc0ZsYWcoRlhfRFdPUkQgZHdGbGFncykgY29uc3Q7CisgIHZvaWQgQWRkRmxhZyhGWF9EV09SRCBkd0ZsYWdzKTsKKyAgdm9pZCBSZW1vdmVGbGFnKEZYX0RXT1JEIGR3RmxhZ3MpOworICBDUERGX1JlY3QgR2V0Q2xpcFJlY3QoKSBjb25zdDsKKyAgQ1BXTF9XbmQqIEdldFBhcmVudFdpbmRvdygpIGNvbnN0OworICBpbnQzMl90IEdldEJvcmRlclN0eWxlKCkgY29uc3Q7CisgIENQV0xfRGFzaCBHZXRCb3JkZXJEYXNoKCkgY29uc3Q7CisgIHZvaWQqIEdldEF0dGFjaGVkRGF0YSgpIGNvbnN0OwogCi0JY29uc3QgQ1BXTF9XbmQqCQkJCQlHZXRGb2N1c2VkKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc0ZvY3VzZWQoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzUmVhZE9ubHkoKSBjb25zdDsKLQlDUFdMX1Njcm9sbEJhcioJCQkJCUdldFZTY3JvbGxCYXIoKSBjb25zdDsKKyAgRlhfQk9PTCBXbmRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgRlhfQk9PTCBDbGllbnRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgRlhfQk9PTCBJc0NhcHR1cmVNb3VzZSgpIGNvbnN0OwogCi0JSUZYX0VkaXRfRm9udE1hcCoJCQkJR2V0Rm9udE1hcCgpIGNvbnN0OwotCUlQV0xfUHJvdmlkZXIqCQkJCQlHZXRQcm92aWRlcigpIGNvbnN0OwotCXZpcnR1YWwgSUZYX1N5c3RlbUhhbmRsZXIqCQlHZXRTeXN0ZW1IYW5kbGVyKCkgY29uc3Q7Ci0JSVBXTF9Gb2N1c0hhbmRsZXIqCQkJCUdldEZvY3VzSGFuZGxlcigpIGNvbnN0OworICBjb25zdCBDUFdMX1duZCogR2V0Rm9jdXNlZCgpIGNvbnN0OworICBGWF9CT09MIElzRm9jdXNlZCgpIGNvbnN0OworICBGWF9CT09MIElzUmVhZE9ubHkoKSBjb25zdDsKKyAgQ1BXTF9TY3JvbGxCYXIqIEdldFZTY3JvbGxCYXIoKSBjb25zdDsKIAotCWludDMyX3QJCQkJCQlHZXRUcmFuc3BhcmVuY3koKTsKLQl2b2lkCQkJCQkJCVNldFRyYW5zcGFyZW5jeShpbnQzMl90IG5UcmFuc3BhcmVuY3kpOworICBJRlhfRWRpdF9Gb250TWFwKiBHZXRGb250TWFwKCkgY29uc3Q7CisgIElQV0xfUHJvdmlkZXIqIEdldFByb3ZpZGVyKCkgY29uc3Q7CisgIHZpcnR1YWwgSUZYX1N5c3RlbUhhbmRsZXIqIEdldFN5c3RlbUhhbmRsZXIoKSBjb25zdDsKKyAgSVBXTF9Gb2N1c0hhbmRsZXIqIEdldEZvY3VzSGFuZGxlcigpIGNvbnN0OwogCi0JQ1BERl9NYXRyaXgJCQkJCQlHZXRDaGlsZFRvUm9vdCgpIGNvbnN0OwotCUNQREZfTWF0cml4CQkJCQkJR2V0Q2hpbGRNYXRyaXgoKSBjb25zdDsKLQl2b2lkCQkJCQkJCVNldENoaWxkTWF0cml4KGNvbnN0IENQREZfTWF0cml4JiBtdCk7Ci0JQ1BERl9NYXRyaXgJCQkJCQlHZXRXaW5kb3dNYXRyaXgoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRUcmFuc3BhcmVuY3koKTsKKyAgdm9pZCBTZXRUcmFuc3BhcmVuY3koaW50MzJfdCBuVHJhbnNwYXJlbmN5KTsKIAotCXZpcnR1YWwgQ1BERl9Qb2ludAkJCQlDaGlsZFRvUGFyZW50KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKLQl2aXJ0dWFsIENQREZfUmVjdAkJCQlDaGlsZFRvUGFyZW50KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3Q7Ci0JdmlydHVhbCBDUERGX1BvaW50CQkJCVBhcmVudFRvQ2hpbGQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCVBhcmVudFRvQ2hpbGQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdDsKKyAgQ1BERl9NYXRyaXggR2V0Q2hpbGRUb1Jvb3QoKSBjb25zdDsKKyAgQ1BERl9NYXRyaXggR2V0Q2hpbGRNYXRyaXgoKSBjb25zdDsKKyAgdm9pZCBTZXRDaGlsZE1hdHJpeChjb25zdCBDUERGX01hdHJpeCYgbXQpOworICBDUERGX01hdHJpeCBHZXRXaW5kb3dNYXRyaXgoKSBjb25zdDsKIAotCS8vdGhvc2UgbWV0aG9kcyBvbmx5IGltcGxlbWVudGVkIGJ5IGxpc3RjdHJsIGl0ZW0KLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEl0ZW1IZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpIHtyZXR1cm4gMDt9Ci0JdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRJdGVtTGVmdE1hcmdpbigpIHtyZXR1cm4gMDt9Ci0JdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRJdGVtUmlnaHRNYXJnaW4oKSB7cmV0dXJuIDA7fQorICB2aXJ0dWFsIENQREZfUG9pbnQgQ2hpbGRUb1BhcmVudChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9SZWN0IENoaWxkVG9QYXJlbnQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdDsKKyAgdmlydHVhbCBDUERGX1BvaW50IFBhcmVudFRvQ2hpbGQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OworICB2aXJ0dWFsIENQREZfUmVjdCBQYXJlbnRUb0NoaWxkKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCUVuYWJsZVdpbmRvdyhGWF9CT09MIGJFbmFibGUpOwotCUZYX0JPT0wJCQkJCQkJSXNFbmFibGVkKCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlTZXRDdXJzb3IoKTsKKyAgLy8gdGhvc2UgbWV0aG9kcyBvbmx5IGltcGxlbWVudGVkIGJ5IGxpc3RjdHJsIGl0ZW0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0SXRlbUxlZnRNYXJnaW4oKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0SXRlbVJpZ2h0TWFyZ2luKCkgeyByZXR1cm4gMDsgfQogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQlDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlSZVBvc0NoaWxkV25kKCk7Ci0Jdm9pZAkJCQkJCQlHZXRBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pOwotCXZpcnR1YWwgdm9pZAkJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlHZXRDaGlsZEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7CisgIHZvaWQgRW5hYmxlV2luZG93KEZYX0JPT0wgYkVuYWJsZSk7CisgIEZYX0JPT0wgSXNFbmFibGVkKCk7CisgIHZpcnR1YWwgdm9pZCBTZXRDdXJzb3IoKTsKIAotCXZpcnR1YWwgdm9pZAkJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwotCXZpcnR1YWwgdm9pZAkJCQkJRHJhd0NoaWxkQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdmlydHVhbCB2b2lkIFJlUG9zQ2hpbGRXbmQoKTsKKyAgdm9pZCBHZXRBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSk7CisgIHZpcnR1YWwgdm9pZCBHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pOworICB2aXJ0dWFsIHZvaWQgR2V0Q2hpbGRBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQ3JlYXRlZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25EZXN0cm95KCk7CisgIHZpcnR1YWwgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyAgdmlydHVhbCB2b2lkIERyYXdDaGlsZEFwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uU2V0Rm9jdXMoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uS2lsbEZvY3VzKCk7CisgIHZpcnR1YWwgdm9pZCBPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlZCgpOworICB2aXJ0dWFsIHZvaWQgT25EZXN0cm95KCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uRW5hYmxlZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25EaXNhYmxlZCgpOworICB2aXJ0dWFsIHZvaWQgT25TZXRGb2N1cygpOworICB2aXJ0dWFsIHZvaWQgT25LaWxsRm9jdXMoKTsKIAotCXZvaWQJCQkJCQkJU2V0Tm90aWZ5RmxhZyhGWF9CT09MIGJOb3RpZnlpbmcgPSBUUlVFKXttX2JOb3RpZnlpbmcgPSBiTm90aWZ5aW5nO307CisgIHZpcnR1YWwgdm9pZCBPbkVuYWJsZWQoKTsKKyAgdmlydHVhbCB2b2lkIE9uRGlzYWJsZWQoKTsKIAotCUZYX0JPT0wJCQkJCQkJSXNWYWxpZCgpIGNvbnN0OwotCVBXTF9DUkVBVEVQQVJBTQkJCQkJR2V0Q3JlYXRpb25QYXJhbSgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNOb3RpZnlpbmcoKSBjb25zdCB7cmV0dXJuIG1fYk5vdGlmeWluZzt9CisgIHZvaWQgU2V0Tm90aWZ5RmxhZyhGWF9CT09MIGJOb3RpZnlpbmcgPSBUUlVFKSB7IG1fYk5vdGlmeWluZyA9IGJOb3RpZnlpbmc7IH07CiAKLQl2b2lkCQkJCQkJCUludmFsaWRhdGVSZWN0TW92ZShjb25zdCBDUERGX1JlY3QgJiByY09sZCwgY29uc3QgQ1BERl9SZWN0ICYgcmNOZXcpOworICBGWF9CT09MIElzVmFsaWQoKSBjb25zdDsKKyAgUFdMX0NSRUFURVBBUkFNIEdldENyZWF0aW9uUGFyYW0oKSBjb25zdDsKKyAgRlhfQk9PTCBJc05vdGlmeWluZygpIGNvbnN0IHsgcmV0dXJuIG1fYk5vdGlmeWluZzsgfQogCi0Jdm9pZAkJCQkJCQlQV0x0b1duZChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpIGNvbnN0OwotCUZYX1JFQ1QJCQkJCQkJUFdMdG9XbmQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgY29uc3Q7Ci0JRlhfSFdORAkJCQkJCQlHZXRBdHRhY2hlZEhXbmQoKSBjb25zdDsKKyAgdm9pZCBJbnZhbGlkYXRlUmVjdE1vdmUoY29uc3QgQ1BERl9SZWN0JiByY09sZCwgY29uc3QgQ1BERl9SZWN0JiByY05ldyk7CiAKLQlGWF9CT09MCQkJCQkJCUlzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc1duZENhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0OwotCWNvbnN0IENQV0xfV25kKgkJCQkJR2V0Um9vdFduZCgpIGNvbnN0OworICB2b2lkIFBXTHRvV25kKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBpbnQzMl90JiB4LCBpbnQzMl90JiB5KSBjb25zdDsKKyAgRlhfUkVDVCBQV0x0b1duZChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0OworICBGWF9IV05EIEdldEF0dGFjaGVkSFduZCgpIGNvbnN0OwogCi0JRlhfQk9PTAkJCQkJCQlJc0NUUkxwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzU0hJRlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzQUxUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc0lOU0VSVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OworICBGWF9CT09MIElzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kKiBwV25kKSBjb25zdDsKKyAgRlhfQk9PTCBJc1duZENhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3Q7CisgIGNvbnN0IENQV0xfV25kKiBHZXRSb290V25kKCkgY29uc3Q7CiAKLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCQlBZGRDaGlsZChDUFdMX1duZCAqIHBXbmQpOwotCXZvaWQJCQkJCQkJUmVtb3ZlQ2hpbGQoQ1BXTF9XbmQgKiBwV25kKTsKKyAgRlhfQk9PTCBJc0NUUkxwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKKyAgRlhfQk9PTCBJc1NISUZUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7CisgIEZYX0JPT0wgSXNBTFRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKKyAgRlhfQk9PTCBJc0lOU0VSVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlDcmVhdGVTY3JvbGxCYXIoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCXZvaWQJCQkJCQkJQ3JlYXRlVlNjcm9sbEJhcihjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7CisgcHJpdmF0ZToKKyAgdm9pZCBBZGRDaGlsZChDUFdMX1duZCogcFduZCk7CisgIHZvaWQgUmVtb3ZlQ2hpbGQoQ1BXTF9XbmQqIHBXbmQpOwogCi0Jdm9pZAkJCQkJCQlBanVzdFN0eWxlKCk7Ci0Jdm9pZAkJCQkJCQlDcmVhdGVNc2dDb250cm9sKCk7Ci0Jdm9pZAkJCQkJCQlEZXN0cm95TXNnQ29udHJvbCgpOworICB2b2lkIENyZWF0ZVNjcm9sbEJhcihjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdm9pZCBDcmVhdGVWU2Nyb2xsQmFyKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApOwogCi0JQ1BXTF9Nc2dDb250cm9sKgkJCQlHZXRNc2dDb250cm9sKCkgY29uc3Q7CisgIHZvaWQgQWp1c3RTdHlsZSgpOworICB2b2lkIENyZWF0ZU1zZ0NvbnRyb2woKTsKKyAgdm9pZCBEZXN0cm95TXNnQ29udHJvbCgpOwogCi1wcm90ZWN0ZWQ6Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8Q1BXTF9XbmQqPgltX2FDaGlsZHJlbjsKKyAgQ1BXTF9Nc2dDb250cm9sKiBHZXRNc2dDb250cm9sKCkgY29uc3Q7CiAKLXByaXZhdGU6Ci0JUFdMX0NSRUFURVBBUkFNCQkJCQltX3NQcml2YXRlUGFyYW07CisgcHJvdGVjdGVkOgorICBDRlhfQXJyYXlUZW1wbGF0ZTxDUFdMX1duZCo+IG1fYUNoaWxkcmVuOwogCi0JQ1BXTF9TY3JvbGxCYXIqCQkJCQltX3BWU2Nyb2xsQmFyOworIHByaXZhdGU6CisgIFBXTF9DUkVBVEVQQVJBTSBtX3NQcml2YXRlUGFyYW07CiAKLQlDUERGX1JlY3QJCQkJCQltX3JjV2luZG93OwotCUNQREZfUmVjdAkJCQkJCW1fcmNDbGlwOworICBDUFdMX1Njcm9sbEJhciogbV9wVlNjcm9sbEJhcjsKIAotCUZYX0JPT0wJCQkJCQkJbV9iQ3JlYXRlZDsKLQlGWF9CT09MCQkJCQkJCW1fYlZpc2libGU7Ci0JRlhfQk9PTAkJCQkJCQltX2JOb3RpZnlpbmc7Ci0JRlhfQk9PTAkJCQkJCQltX2JFbmFibGVkOworICBDUERGX1JlY3QgbV9yY1dpbmRvdzsKKyAgQ1BERl9SZWN0IG1fcmNDbGlwOworCisgIEZYX0JPT0wgbV9iQ3JlYXRlZDsKKyAgRlhfQk9PTCBtX2JWaXNpYmxlOworICBGWF9CT09MIG1fYk5vdGlmeWluZzsKKyAgRlhfQk9PTCBtX2JFbmFibGVkOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9XTkRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmNwcAppbmRleCA1M2VmZTlmLi5jYjZkNTE5IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuY3BwCkBAIC03LDI5MyArNywyODAgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRm9ybUZpbGxlci5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuaCIKIAotQ0JBX0ZvbnRNYXA6OkNCQV9Gb250TWFwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKSA6Ci0JQ1BXTF9Gb250TWFwKHBTeXN0ZW1IYW5kbGVyKSwKLQltX3BEb2N1bWVudChOVUxMKSwKLQltX3BBbm5vdERpY3QoTlVMTCksCi0JbV9wRGVmYXVsdEZvbnQoTlVMTCksCi0JbV9zQVBUeXBlKCJOIikKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOworQ0JBX0ZvbnRNYXA6OkNCQV9Gb250TWFwKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpCisgICAgOiBDUFdMX0ZvbnRNYXAocFN5c3RlbUhhbmRsZXIpLAorICAgICAgbV9wRG9jdW1lbnQoTlVMTCksCisgICAgICBtX3BBbm5vdERpY3QoTlVMTCksCisgICAgICBtX3BEZWZhdWx0Rm9udChOVUxMKSwKKyAgICAgIG1fc0FQVHlwZSgiTiIpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAotCUNQREZfUGFnZSogcFBhZ2UgPSBwQW5ub3QtPkdldFBERlBhZ2UoKTsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IHBBbm5vdC0+R2V0UERGUGFnZSgpOwogCi0JbV9wRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7Ci0JbV9wQW5ub3REaWN0ID0gcEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRBbm5vdERpY3QoKTsKKyAgbV9wRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CisgIG1fcEFubm90RGljdCA9IHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0QW5ub3REaWN0KCk7CiB9CiAKLUNCQV9Gb250TWFwOjpDQkFfRm9udE1hcChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKLQkJCQkJCSBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpIDoKLQlDUFdMX0ZvbnRNYXAocFN5c3RlbUhhbmRsZXIpLAotCW1fcERvY3VtZW50KHBEb2N1bWVudCksCi0JbV9wQW5ub3REaWN0KHBBbm5vdERpY3QpLAotCW1fcERlZmF1bHRGb250KE5VTEwpLAotCW1fc0FQVHlwZSgiTiIpCi17CitDQkFfRm9udE1hcDo6Q0JBX0ZvbnRNYXAoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpCisgICAgOiBDUFdMX0ZvbnRNYXAocFN5c3RlbUhhbmRsZXIpLAorICAgICAgbV9wRG9jdW1lbnQocERvY3VtZW50KSwKKyAgICAgIG1fcEFubm90RGljdChwQW5ub3REaWN0KSwKKyAgICAgIG1fcERlZmF1bHRGb250KE5VTEwpLAorICAgICAgbV9zQVBUeXBlKCJOIikge30KKworQ0JBX0ZvbnRNYXA6On5DQkFfRm9udE1hcCgpIHt9CisKK3ZvaWQgQ0JBX0ZvbnRNYXA6OlJlc2V0KCkgeworICBFbXB0eSgpOworICBtX3BEZWZhdWx0Rm9udCA9IE5VTEw7CisgIG1fc0RlZmF1bHRGb250TmFtZSA9ICIiOwogfQogCi1DQkFfRm9udE1hcDo6fkNCQV9Gb250TWFwKCkKLXsKK3ZvaWQgQ0JBX0ZvbnRNYXA6OkluaXRpYWwoY29uc3QgRlhfQ0hBUiogZm9udG5hbWUpIHsKKyAgaW50MzJfdCBuQ2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVDsKKworICBpZiAoIW1fcERlZmF1bHRGb250KSB7CisgICAgbV9wRGVmYXVsdEZvbnQgPSBHZXRBbm5vdERlZmF1bHRGb250KG1fc0RlZmF1bHRGb250TmFtZSk7CisgICAgaWYgKG1fcERlZmF1bHRGb250KSB7CisgICAgICBpZiAoY29uc3QgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCA9IG1fcERlZmF1bHRGb250LT5HZXRTdWJzdEZvbnQoKSkKKyAgICAgICAgbkNoYXJzZXQgPSBwU3Vic3RGb250LT5tX0NoYXJzZXQ7CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKG1fc0RlZmF1bHRGb250TmFtZSA9PSAiV2luZ2RpbmdzIiB8fAorICAgICAgICAgICAgbV9zRGVmYXVsdEZvbnROYW1lID09ICJXaW5nZGluZ3MyIiB8fAorICAgICAgICAgICAgbV9zRGVmYXVsdEZvbnROYW1lID09ICJXaW5nZGluZ3MzIiB8fAorICAgICAgICAgICAgbV9zRGVmYXVsdEZvbnROYW1lID09ICJXZWJkaW5ncyIpCisgICAgICAgICAgbkNoYXJzZXQgPSBTWU1CT0xfQ0hBUlNFVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG5DaGFyc2V0ID0gQU5TSV9DSEFSU0VUOworICAgICAgfQorICAgICAgQWRkRm9udERhdGEobV9wRGVmYXVsdEZvbnQsIG1fc0RlZmF1bHRGb250TmFtZSwgbkNoYXJzZXQpOworICAgICAgQWRkRm9udFRvQW5ub3REaWN0KG1fcERlZmF1bHRGb250LCBtX3NEZWZhdWx0Rm9udE5hbWUpOworICAgIH0KKyAgfQorCisgIGlmIChuQ2hhcnNldCAhPSBBTlNJX0NIQVJTRVQpCisgICAgQ1BXTF9Gb250TWFwOjpJbml0aWFsKGZvbnRuYW1lKTsKIH0KIAotdm9pZCBDQkFfRm9udE1hcDo6UmVzZXQoKQotewotCUVtcHR5KCk7Ci0JbV9wRGVmYXVsdEZvbnQgPSBOVUxMOwotCW1fc0RlZmF1bHRGb250TmFtZSA9ICIiOwordm9pZCBDQkFfRm9udE1hcDo6U2V0RGVmYXVsdEZvbnQoQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpIHsKKyAgQVNTRVJUKHBGb250ICE9IE5VTEwpOworCisgIGlmIChtX3BEZWZhdWx0Rm9udCkKKyAgICByZXR1cm47CisKKyAgbV9wRGVmYXVsdEZvbnQgPSBwRm9udDsKKyAgbV9zRGVmYXVsdEZvbnROYW1lID0gc0ZvbnROYW1lOworCisgIC8vCWlmIChtX3NEZWZhdWx0Rm9udE5hbWUuSXNFbXB0eSgpKQorICAvLwkJbV9zRGVmYXVsdEZvbnROYW1lID0gcEZvbnQtPkdldEZvbnRUeXBlTmFtZSgpOworCisgIGludDMyX3QgbkNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQ7CisgIGlmIChjb25zdCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250ID0gbV9wRGVmYXVsdEZvbnQtPkdldFN1YnN0Rm9udCgpKQorICAgIG5DaGFyc2V0ID0gcFN1YnN0Rm9udC0+bV9DaGFyc2V0OworICBBZGRGb250RGF0YShtX3BEZWZhdWx0Rm9udCwgbV9zRGVmYXVsdEZvbnROYW1lLCBuQ2hhcnNldCk7CiB9CiAKLXZvaWQgQ0JBX0ZvbnRNYXA6OkluaXRpYWwoY29uc3QgRlhfQ0hBUiogZm9udG5hbWUpCi17Ci0JaW50MzJfdCBuQ2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVDsKK0NQREZfRm9udCogQ0JBX0ZvbnRNYXA6OkZpbmRGb250U2FtZUNoYXJzZXQoQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQpIHsKKyAgQVNTRVJUKG1fcEFubm90RGljdCAhPSBOVUxMKTsKIAotCWlmICghbV9wRGVmYXVsdEZvbnQpCi0JewotCQltX3BEZWZhdWx0Rm9udCA9IEdldEFubm90RGVmYXVsdEZvbnQobV9zRGVmYXVsdEZvbnROYW1lKTsKLQkJaWYgKG1fcERlZmF1bHRGb250KQotCQl7Ci0JCQlpZiAoY29uc3QgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCA9IG1fcERlZmF1bHRGb250LT5HZXRTdWJzdEZvbnQoKSkKLQkJCQluQ2hhcnNldCA9IHBTdWJzdEZvbnQtPm1fQ2hhcnNldDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAobV9zRGVmYXVsdEZvbnROYW1lID09ICJXaW5nZGluZ3MiIHx8IG1fc0RlZmF1bHRGb250TmFtZSA9PSAiV2luZ2RpbmdzMiIgfHwKLQkJCQkJbV9zRGVmYXVsdEZvbnROYW1lID09ICJXaW5nZGluZ3MzIiB8fCBtX3NEZWZhdWx0Rm9udE5hbWUgPT0gIldlYmRpbmdzIikKLQkJCQkJCW5DaGFyc2V0ID0gU1lNQk9MX0NIQVJTRVQ7Ci0JCQkJZWxzZQotCQkJCQluQ2hhcnNldCA9IEFOU0lfQ0hBUlNFVDsKLQkJCX0KLQkJCUFkZEZvbnREYXRhKG1fcERlZmF1bHRGb250LCBtX3NEZWZhdWx0Rm9udE5hbWUsIG5DaGFyc2V0KTsKLQkJCUFkZEZvbnRUb0Fubm90RGljdChtX3BEZWZhdWx0Rm9udCwgbV9zRGVmYXVsdEZvbnROYW1lKTsKLQkJfQotCX0KKyAgaWYgKG1fcEFubm90RGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIikgPT0gIldpZGdldCIpIHsKKyAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBHZXREb2N1bWVudCgpOworICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLQlpZiAobkNoYXJzZXQgIT0gQU5TSV9DSEFSU0VUKQotCQlDUFdMX0ZvbnRNYXA6OkluaXRpYWwoZm9udG5hbWUpOworICAgIENQREZfRGljdGlvbmFyeSogcFJvb3REaWN0ID0gcERvY3VtZW50LT5HZXRSb290KCk7CisgICAgaWYgKCFwUm9vdERpY3QpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIENQREZfRGljdGlvbmFyeSogcEFjcm9Gb3JtRGljdCA9IHBSb290RGljdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgICBpZiAoIXBBY3JvRm9ybURpY3QpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIENQREZfRGljdGlvbmFyeSogcERSRGljdCA9IHBBY3JvRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgICAgaWYgKCFwRFJEaWN0KQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gRmluZFJlc0ZvbnRTYW1lQ2hhcnNldChwRFJEaWN0LCBzRm9udEFsaWFzLCBuQ2hhcnNldCk7CisgIH0KKworICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBDQkFfRm9udE1hcDo6U2V0RGVmYXVsdEZvbnQoQ1BERl9Gb250ICogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nICYgc0ZvbnROYW1lKQotewotCUFTU0VSVChwRm9udCAhPSBOVUxMKTsKLQotCWlmIChtX3BEZWZhdWx0Rm9udCkgcmV0dXJuOwotCi0JbV9wRGVmYXVsdEZvbnQgPSBwRm9udDsKLQltX3NEZWZhdWx0Rm9udE5hbWUgPSBzRm9udE5hbWU7Ci0KLS8vCWlmIChtX3NEZWZhdWx0Rm9udE5hbWUuSXNFbXB0eSgpKQotLy8JCW1fc0RlZmF1bHRGb250TmFtZSA9IHBGb250LT5HZXRGb250VHlwZU5hbWUoKTsKLQotCWludDMyX3QgbkNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQ7Ci0JaWYgKGNvbnN0IENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQgPSBtX3BEZWZhdWx0Rm9udC0+R2V0U3Vic3RGb250KCkpCi0JCW5DaGFyc2V0ID0gcFN1YnN0Rm9udC0+bV9DaGFyc2V0OwotCUFkZEZvbnREYXRhKG1fcERlZmF1bHRGb250LCBtX3NEZWZhdWx0Rm9udE5hbWUsIG5DaGFyc2V0KTsKK0NQREZfRG9jdW1lbnQqIENCQV9Gb250TWFwOjpHZXREb2N1bWVudCgpIHsKKyAgcmV0dXJuIG1fcERvY3VtZW50OwogfQogCi1DUERGX0ZvbnQqIENCQV9Gb250TWFwOjpGaW5kRm9udFNhbWVDaGFyc2V0KENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLCBpbnQzMl90IG5DaGFyc2V0KQotewotCUFTU0VSVChtX3BBbm5vdERpY3QgIT0gTlVMTCk7CitDUERGX0ZvbnQqIENCQV9Gb250TWFwOjpGaW5kUmVzRm9udFNhbWVDaGFyc2V0KENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0KSB7CisgIGlmICghcFJlc0RpY3QpCisgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobV9wQW5ub3REaWN0LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSA9PSAiV2lkZ2V0IikKLQl7Ci0JCUNQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IEdldERvY3VtZW50KCk7Ci0JCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CisgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IEdldERvY3VtZW50KCk7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLQkJQ1BERl9EaWN0aW9uYXJ5ICogcFJvb3REaWN0ID0gcERvY3VtZW50LT5HZXRSb290KCk7Ci0JCWlmICghcFJvb3REaWN0KSByZXR1cm4gTlVMTDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwUmVzRGljdC0+R2V0RGljdCgiRm9udCIpOworICBpZiAocEZvbnRzID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CiAKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm1EaWN0ID0gcFJvb3REaWN0LT5HZXREaWN0KCJBY3JvRm9ybSIpOwotCQlpZiAoIXBBY3JvRm9ybURpY3QpIHJldHVybiBOVUxMOworICBDUERGX0ZvbnQqIHBGaW5kID0gTlVMTDsKIAotCQlDUERGX0RpY3Rpb25hcnkgKiBwRFJEaWN0ID0gcEFjcm9Gb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKLQkJaWYgKCFwRFJEaWN0KSByZXR1cm4gTlVMTDsKKyAgRlhfUE9TSVRJT04gcG9zID0gcEZvbnRzLT5HZXRTdGFydFBvcygpOworICB3aGlsZSAocG9zKSB7CisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBOVUxMOworICAgIENGWF9CeXRlU3RyaW5nIGNzS2V5OworICAgIHBPYmogPSBwRm9udHMtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOworICAgIGlmIChwT2JqID09IE5VTEwpCisgICAgICBjb250aW51ZTsKIAotCQlyZXR1cm4gRmluZFJlc0ZvbnRTYW1lQ2hhcnNldChwRFJEaWN0LCBzRm9udEFsaWFzLCBuQ2hhcnNldCk7Ci0JfQorICAgIENQREZfT2JqZWN0KiBwRGlyZWN0ID0gcE9iai0+R2V0RGlyZWN0KCk7CisgICAgaWYgKHBEaXJlY3QgPT0gTlVMTCB8fCBwRGlyZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpCisgICAgICBjb250aW51ZTsKIAotCXJldHVybiBOVUxMOworICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRGlyZWN0OworICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKQorICAgICAgY29udGludWU7CisKKyAgICBDUERGX0ZvbnQqIHBGb250ID0gcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7CisgICAgaWYgKHBGb250ID09IE5VTEwpCisgICAgICBjb250aW51ZTsKKyAgICBjb25zdCBDRlhfU3Vic3RGb250KiBwU3Vic3QgPSBwRm9udC0+R2V0U3Vic3RGb250KCk7CisgICAgaWYgKHBTdWJzdCA9PSBOVUxMKQorICAgICAgY29udGludWU7CisgICAgaWYgKHBTdWJzdC0+bV9DaGFyc2V0ID09IG5DaGFyc2V0KSB7CisgICAgICBzRm9udEFsaWFzID0gY3NLZXk7CisgICAgICBwRmluZCA9IHBGb250OworICAgIH0KKyAgfQorICByZXR1cm4gcEZpbmQ7CiB9CiAKLUNQREZfRG9jdW1lbnQqIENCQV9Gb250TWFwOjpHZXREb2N1bWVudCgpCi17Ci0JcmV0dXJuIG1fcERvY3VtZW50Owordm9pZCBDQkFfRm9udE1hcDo6QWRkZWRGb250KENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMpIHsKKyAgQWRkRm9udFRvQW5ub3REaWN0KHBGb250LCBzRm9udEFsaWFzKTsKIH0KIAotQ1BERl9Gb250KiBDQkFfRm9udE1hcDo6RmluZFJlc0ZvbnRTYW1lQ2hhcnNldChDUERGX0RpY3Rpb25hcnkqIHBSZXNEaWN0LCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywKLQkJCQkJCQkJCQkJCQlpbnQzMl90IG5DaGFyc2V0KQotewotCWlmICghcFJlc0RpY3QpIHJldHVybiBOVUxMOwordm9pZCBDQkFfRm9udE1hcDo6QWRkRm9udFRvQW5ub3REaWN0KENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBbGlhcykgeworICBpZiAoIXBGb250KQorICAgIHJldHVybjsKIAotCUNQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IEdldERvY3VtZW50KCk7Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKKyAgQVNTRVJUKG1fcEFubm90RGljdCAhPSBOVUxMKTsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwUmVzRGljdC0+R2V0RGljdCgiRm9udCIpOwotCWlmIChwRm9udHMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIENQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IG1fcEFubm90RGljdC0+R2V0RGljdCgiQVAiKTsKIAotCUNQREZfRm9udCogcEZpbmQgPSBOVUxMOworICBpZiAocEFQRGljdCA9PSBOVUxMKSB7CisgICAgcEFQRGljdCA9IEZYX05FVyBDUERGX0RpY3Rpb25hcnk7CisgICAgbV9wQW5ub3REaWN0LT5TZXRBdCgiQVAiLCBwQVBEaWN0KTsKKyAgfQogCi0JRlhfUE9TSVRJT04gcG9zID0gcEZvbnRzLT5HZXRTdGFydFBvcygpOwotCXdoaWxlIChwb3MpCi0JewotCQlDUERGX09iamVjdCogcE9iaiA9IE5VTEw7Ci0JCUNGWF9CeXRlU3RyaW5nIGNzS2V5OwotCQlwT2JqID0gcEZvbnRzLT5HZXROZXh0RWxlbWVudChwb3MsIGNzS2V5KTsKLQkJaWYgKHBPYmogPT0gTlVMTCkgY29udGludWU7CisgIC8vIHRvIGF2b2lkIGNoZWNrYm94IGFuZCByYWRpb2J1dHRvbgorICBDUERGX09iamVjdCogcE9iamVjdCA9IHBBUERpY3QtPkdldEVsZW1lbnQobV9zQVBUeXBlKTsKKyAgaWYgKHBPYmplY3QgJiYgcE9iamVjdC0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKQorICAgIHJldHVybjsKIAotCQlDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOwotCQlpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgY29udGludWU7CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcEFQRGljdC0+R2V0U3RyZWFtKG1fc0FQVHlwZSk7CisgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKKyAgICBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICAgIGludDMyX3Qgb2JqbnVtID0gbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBTdHJlYW0pOworICAgIHBBUERpY3QtPlNldEF0UmVmZXJlbmNlKG1fc0FQVHlwZSwgbV9wRG9jdW1lbnQsIG9iam51bSk7CisgIH0KIAotCQlDUERGX0RpY3Rpb25hcnkqIHBFbGVtZW50ID0gKENQREZfRGljdGlvbmFyeSopcERpcmVjdDsKLQkJaWYgKHBFbGVtZW50LT5HZXRTdHJpbmcoIlR5cGUiKSAhPSAiRm9udCIpIGNvbnRpbnVlOworICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1EaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwogCi0JCUNQREZfRm9udCogcEZvbnQgPSBwRG9jdW1lbnQtPkxvYWRGb250KHBFbGVtZW50KTsKLQkJaWYgKHBGb250ID09IE5VTEwpIGNvbnRpbnVlOwotCQljb25zdCBDRlhfU3Vic3RGb250KiBwU3Vic3QgPSBwRm9udC0+R2V0U3Vic3RGb250KCk7Ci0JCWlmIChwU3Vic3QgPT0gTlVMTCkgY29udGludWU7Ci0JCWlmIChwU3Vic3QtPm1fQ2hhcnNldCA9PSBuQ2hhcnNldCkKLQkJewotCQkJc0ZvbnRBbGlhcyA9IGNzS2V5OwotCQkJcEZpbmQgPSBwRm9udDsKLQkJfQotCX0KLQlyZXR1cm4gcEZpbmQ7CisgIGlmICghcFN0cmVhbURpY3QpIHsKKyAgICBwU3RyZWFtRGljdCA9IEZYX05FVyBDUERGX0RpY3Rpb25hcnk7CisgICAgcFN0cmVhbS0+SW5pdFN0cmVhbShOVUxMLCAwLCBwU3RyZWFtRGljdCk7CisgIH0KKworICBpZiAocFN0cmVhbURpY3QpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOworICAgIGlmICghcFN0cmVhbVJlc0xpc3QpIHsKKyAgICAgIHBTdHJlYW1SZXNMaXN0ID0gRlhfTkVXIENQREZfRGljdGlvbmFyeSgpOworICAgICAgcFN0cmVhbURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwU3RyZWFtUmVzTGlzdCk7CisgICAgfQorCisgICAgaWYgKHBTdHJlYW1SZXNMaXN0KSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNGb250TGlzdCA9IHBTdHJlYW1SZXNMaXN0LT5HZXREaWN0KCJGb250Iik7CisgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdCkgeworICAgICAgICBwU3RyZWFtUmVzRm9udExpc3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgICAgICBpbnQzMl90IG9iam51bSA9IG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtUmVzRm9udExpc3QpOworICAgICAgICBwU3RyZWFtUmVzTGlzdC0+U2V0QXRSZWZlcmVuY2UoIkZvbnQiLCBtX3BEb2N1bWVudCwgb2JqbnVtKTsKKyAgICAgIH0KKyAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0LT5LZXlFeGlzdChzQWxpYXMpKQorICAgICAgICBwU3RyZWFtUmVzRm9udExpc3QtPlNldEF0UmVmZXJlbmNlKHNBbGlhcywgbV9wRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnQtPkdldEZvbnREaWN0KCkpOworICAgIH0KKyAgfQogfQogCi12b2lkIENCQV9Gb250TWFwOjpBZGRlZEZvbnQoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMpCi17Ci0JQWRkRm9udFRvQW5ub3REaWN0KHBGb250LCBzRm9udEFsaWFzKTsKK0NQREZfRm9udCogQ0JBX0ZvbnRNYXA6OkdldEFubm90RGVmYXVsdEZvbnQoQ0ZYX0J5dGVTdHJpbmcmIHNBbGlhcykgeworICBBU1NFUlQobV9wQW5ub3REaWN0ICE9IE5VTEwpOworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm1EaWN0ID0gTlVMTDsKKworICBGWF9CT09MIGJXaWRnZXQgPSAobV9wQW5ub3REaWN0LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSA9PSAiV2lkZ2V0Iik7CisKKyAgaWYgKGJXaWRnZXQpIHsKKyAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdERpY3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpKQorICAgICAgcEFjcm9Gb3JtRGljdCA9IHBSb290RGljdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nIHNEQTsKKyAgQ1BERl9PYmplY3QqIHBPYmo7CisgIGlmICgocE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEFubm90RGljdCwgIkRBIikpKQorICAgIHNEQSA9IHBPYmotPkdldFN0cmluZygpOworCisgIGlmIChiV2lkZ2V0KSB7CisgICAgaWYgKHNEQS5Jc0VtcHR5KCkpIHsKKyAgICAgIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihwQWNyb0Zvcm1EaWN0LCAiREEiKTsKKyAgICAgIHNEQSA9IHBPYmogPyBwT2JqLT5HZXRTdHJpbmcoKSA6IENGWF9CeXRlU3RyaW5nKCk7CisgICAgfQorICB9CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBOVUxMOworCisgIGlmICghc0RBLklzRW1wdHkoKSkgeworICAgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChzREEpOworICAgIHN5bnRheC5GaW5kVGFnUGFyYW0oIlRmIiwgMik7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnROYW1lID0gc3ludGF4LkdldFdvcmQoKTsKKyAgICBzQWxpYXMgPSBQREZfTmFtZURlY29kZShzRm9udE5hbWUpLk1pZCgxKTsKKworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEUkRpY3QgPSBtX3BBbm5vdERpY3QtPkdldERpY3QoIkRSIikpCisgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRFJGb250RGljdCA9IHBEUkRpY3QtPkdldERpY3QoIkZvbnQiKSkKKyAgICAgICAgcEZvbnREaWN0ID0gcERSRm9udERpY3QtPkdldERpY3Qoc0FsaWFzKTsKKworICAgIGlmICghcEZvbnREaWN0KQorICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IG1fcEFubm90RGljdC0+R2V0RGljdCgiQVAiKSkKKyAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcE5vcm1hbERpY3QgPSBwQVBEaWN0LT5HZXREaWN0KCJOIikpCisgICAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcE5vcm1hbFJlc0RpY3QgPQorICAgICAgICAgICAgICAgICAgcE5vcm1hbERpY3QtPkdldERpY3QoIlJlc291cmNlcyIpKQorICAgICAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcFJlc0ZvbnREaWN0ID0gcE5vcm1hbFJlc0RpY3QtPkdldERpY3QoIkZvbnQiKSkKKyAgICAgICAgICAgICAgcEZvbnREaWN0ID0gcFJlc0ZvbnREaWN0LT5HZXREaWN0KHNBbGlhcyk7CisKKyAgICBpZiAoYldpZGdldCkgeworICAgICAgaWYgKCFwRm9udERpY3QpIHsKKyAgICAgICAgaWYgKHBBY3JvRm9ybURpY3QpIHsKKyAgICAgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRFJEaWN0ID0gcEFjcm9Gb3JtRGljdC0+R2V0RGljdCgiRFIiKSkKKyAgICAgICAgICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEUkZvbnREaWN0ID0gcERSRGljdC0+R2V0RGljdCgiRm9udCIpKQorICAgICAgICAgICAgICBwRm9udERpY3QgPSBwRFJGb250RGljdC0+R2V0RGljdChzQWxpYXMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHBGb250RGljdCA/IG1fcERvY3VtZW50LT5Mb2FkRm9udChwRm9udERpY3QpIDogbnVsbHB0cjsKIH0KIAotdm9pZCBDQkFfRm9udE1hcDo6QWRkRm9udFRvQW5ub3REaWN0KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQWxpYXMpCi17Ci0JaWYgKCFwRm9udCkJcmV0dXJuOwordm9pZCBDQkFfRm9udE1hcDo6U2V0QVBUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlKSB7CisgIG1fc0FQVHlwZSA9IHNBUFR5cGU7CiAKLQlBU1NFUlQobV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotCUNQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IG1fcEFubm90RGljdC0+R2V0RGljdCgiQVAiKTsKLQotCWlmIChwQVBEaWN0ID09IE5VTEwpCi0JewotCQlwQVBEaWN0ID0gRlhfTkVXIENQREZfRGljdGlvbmFyeTsKLQkJbV9wQW5ub3REaWN0LT5TZXRBdCgiQVAiLCBwQVBEaWN0KTsKLQl9Ci0KLQkvL3RvIGF2b2lkIGNoZWNrYm94IGFuZCByYWRpb2J1dHRvbgotCUNQREZfT2JqZWN0KiBwT2JqZWN0ID0gcEFQRGljdC0+R2V0RWxlbWVudChtX3NBUFR5cGUpOwotCWlmIChwT2JqZWN0ICYmIHBPYmplY3QtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkKLQkJcmV0dXJuOwotCi0JQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwQVBEaWN0LT5HZXRTdHJlYW0obV9zQVBUeXBlKTsKLQlpZiAocFN0cmVhbSA9PSBOVUxMKQotCXsKLQkJcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKLQkJaW50MzJfdCBvYmpudW0gPSBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7Ci0JCXBBUERpY3QtPlNldEF0UmVmZXJlbmNlKG1fc0FQVHlwZSwgbV9wRG9jdW1lbnQsIG9iam51bSk7Ci0JfQotCi0JQ1BERl9EaWN0aW9uYXJ5ICogcFN0cmVhbURpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0KLQlpZiAoIXBTdHJlYW1EaWN0KQotCXsKLQkJcFN0cmVhbURpY3QgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OwotCQlwU3RyZWFtLT5Jbml0U3RyZWFtKE5VTEwsIDAsIHBTdHJlYW1EaWN0KTsKLQl9Ci0KLQlpZiAocFN0cmVhbURpY3QpCi0JewotCQlDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOwotCQlpZiAoIXBTdHJlYW1SZXNMaXN0KQotCQl7Ci0JCQlwU3RyZWFtUmVzTGlzdCA9IEZYX05FVyBDUERGX0RpY3Rpb25hcnkoKTsKLQkJCXBTdHJlYW1EaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcFN0cmVhbVJlc0xpc3QpOwotCQl9Ci0KLQkJaWYgKHBTdHJlYW1SZXNMaXN0KQotCQl7Ci0JCQlDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNGb250TGlzdCA9IHBTdHJlYW1SZXNMaXN0LT5HZXREaWN0KCJGb250Iik7Ci0JCQlpZiAoIXBTdHJlYW1SZXNGb250TGlzdCkKLQkJCXsKLQkJCQlwU3RyZWFtUmVzRm9udExpc3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotCQkJCWludDMyX3Qgb2JqbnVtID0gbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBTdHJlYW1SZXNGb250TGlzdCk7Ci0JCQkJcFN0cmVhbVJlc0xpc3QtPlNldEF0UmVmZXJlbmNlKCJGb250IiwgbV9wRG9jdW1lbnQsIG9iam51bSk7Ci0JCQl9Ci0JCQlpZiAoIXBTdHJlYW1SZXNGb250TGlzdC0+S2V5RXhpc3Qoc0FsaWFzKSkKLQkJCQlwU3RyZWFtUmVzRm9udExpc3QtPlNldEF0UmVmZXJlbmNlKHNBbGlhcywgbV9wRG9jdW1lbnQsIHBGb250LT5HZXRGb250RGljdCgpKTsKLQkJfQotCX0KKyAgUmVzZXQoKTsKKyAgSW5pdGlhbCgpOwogfQotCi1DUERGX0ZvbnQqIENCQV9Gb250TWFwOjpHZXRBbm5vdERlZmF1bHRGb250KENGWF9CeXRlU3RyaW5nICZzQWxpYXMpCi17Ci0JQVNTRVJUKG1fcEFubm90RGljdCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybURpY3QgPSBOVUxMOwotCi0JRlhfQk9PTCBiV2lkZ2V0ID0gKG1fcEFubm90RGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIikgPT0gIldpZGdldCIpOwotCi0JaWYgKGJXaWRnZXQpCi0JewotCQlpZiAoQ1BERl9EaWN0aW9uYXJ5ICogcFJvb3REaWN0ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKSkKLQkJCXBBY3JvRm9ybURpY3QgPSBwUm9vdERpY3QtPkdldERpY3QoIkFjcm9Gb3JtIik7Ci0JfQotCi0JQ0ZYX0J5dGVTdHJpbmcgc0RBOwotCUNQREZfT2JqZWN0KiBwT2JqOwotCWlmICgocE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEFubm90RGljdCwgIkRBIikpKQotCQlzREEgPSBwT2JqLT5HZXRTdHJpbmcoKTsKLQotCWlmIChiV2lkZ2V0KQotCXsKLQkJaWYgKHNEQS5Jc0VtcHR5KCkpCi0JCXsKLQkJCXBPYmogPSBGUERGX0dldEZpZWxkQXR0cihwQWNyb0Zvcm1EaWN0LCAiREEiKTsKLQkJCXNEQSA9IHBPYmogPyBwT2JqLT5HZXRTdHJpbmcoKSA6IENGWF9CeXRlU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlDUERGX0RpY3Rpb25hcnkgKiBwRm9udERpY3QgPSBOVUxMOwotCi0JaWYgKCFzREEuSXNFbXB0eSgpKQotCXsKLQkJQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KHNEQSk7Ci0JCXN5bnRheC5GaW5kVGFnUGFyYW0oIlRmIiwgMik7Ci0JCUNGWF9CeXRlU3RyaW5nIHNGb250TmFtZSA9IHN5bnRheC5HZXRXb3JkKCk7Ci0JCXNBbGlhcyA9IFBERl9OYW1lRGVjb2RlKHNGb250TmFtZSkuTWlkKDEpOwotCi0JCWlmIChDUERGX0RpY3Rpb25hcnkgKiBwRFJEaWN0ID0gbV9wQW5ub3REaWN0LT5HZXREaWN0KCJEUiIpKQotCQkJaWYgKENQREZfRGljdGlvbmFyeSogcERSRm9udERpY3QgPSBwRFJEaWN0LT5HZXREaWN0KCJGb250IikpCi0JCQkJcEZvbnREaWN0ID0gcERSRm9udERpY3QtPkdldERpY3Qoc0FsaWFzKTsKLQotCQlpZiAoIXBGb250RGljdCkKLQkJCWlmIChDUERGX0RpY3Rpb25hcnkqIHBBUERpY3QgPSBtX3BBbm5vdERpY3QtPkdldERpY3QoIkFQIikpCi0JCQkJaWYgKENQREZfRGljdGlvbmFyeSogcE5vcm1hbERpY3QgPSBwQVBEaWN0LT5HZXREaWN0KCJOIikpCi0JCQkJCWlmIChDUERGX0RpY3Rpb25hcnkqIHBOb3JtYWxSZXNEaWN0ID0gcE5vcm1hbERpY3QtPkdldERpY3QoIlJlc291cmNlcyIpKQotCQkJCQkJaWYgKENQREZfRGljdGlvbmFyeSogcFJlc0ZvbnREaWN0ID0gcE5vcm1hbFJlc0RpY3QtPkdldERpY3QoIkZvbnQiKSkKLQkJCQkJCQlwRm9udERpY3QgPSBwUmVzRm9udERpY3QtPkdldERpY3Qoc0FsaWFzKTsKLQotCQlpZiAoYldpZGdldCkKLQkJewotCQkJaWYgKCFwRm9udERpY3QpCi0JCQl7Ci0JCQkJaWYgKHBBY3JvRm9ybURpY3QpCi0JCQkJewotCQkJCQlpZiAoQ1BERl9EaWN0aW9uYXJ5ICogcERSRGljdCA9IHBBY3JvRm9ybURpY3QtPkdldERpY3QoIkRSIikpCi0JCQkJCQlpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRFJGb250RGljdCA9IHBEUkRpY3QtPkdldERpY3QoIkZvbnQiKSkKLQkJCQkJCQlwRm9udERpY3QgPSBwRFJGb250RGljdC0+R2V0RGljdChzQWxpYXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotICAgIHJldHVybiBwRm9udERpY3QgPyBtX3BEb2N1bWVudC0+TG9hZEZvbnQocEZvbnREaWN0KSA6IG51bGxwdHI7Ci19Ci0KLXZvaWQgQ0JBX0ZvbnRNYXA6OlNldEFQVHlwZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSkKLXsKLQltX3NBUFR5cGUgPSBzQVBUeXBlOwotCi0JUmVzZXQoKTsKLQlJbml0aWFsKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmNwcAppbmRleCA1NWQyZDQ1Li40MmM2MjUxIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guY3BwCkBAIC04LDEzNyArOCwxMjIgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgiCiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZGTF9DaGVja0JveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRkZMX0NoZWNrQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NGRkxfQ2hlY2tCb3g6OkNGRkxfQ2hlY2tCb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpCisgICAgOiBDRkZMX0J1dHRvbihwQXBwLCBwV2lkZ2V0KSB7fQogCi1DRkZMX0NoZWNrQm94OjpDRkZMX0NoZWNrQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KSA6Ci0JQ0ZGTF9CdXR0b24ocEFwcCwgcFdpZGdldCkKLXsKK0NGRkxfQ2hlY2tCb3g6On5DRkZMX0NoZWNrQm94KCkge30KKworQ1BXTF9XbmQqIENGRkxfQ2hlY2tCb3g6Ok5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQ1BXTF9DaGVja0JveCogcFduZCA9IG5ldyBDUFdMX0NoZWNrQm94KCk7CisgIHBXbmQtPkNyZWF0ZShjcCk7CisKKyAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKKyAgcFduZC0+U2V0Q2hlY2sobV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKSk7CisKKyAgcmV0dXJuIHBXbmQ7CiB9CiAKLUNGRkxfQ2hlY2tCb3g6On5DRkZMX0NoZWNrQm94KCkKLXsKK0ZYX0JPT0wgQ0ZGTF9DaGVja0JveDo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncykgeworICBzd2l0Y2ggKG5LZXlDb2RlKSB7CisgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46CisgICAgY2FzZSBGV0xfVktFWV9TcGFjZToKKyAgICAgIHJldHVybiBUUlVFOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWdzKTsKKyAgfQorfQorRlhfQk9PTCBDRkZMX0NoZWNrQm94OjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKSB7CisgIHN3aXRjaCAobkNoYXIpIHsKKyAgICBjYXNlIEZXTF9WS0VZX1JldHVybjoKKyAgICBjYXNlIEZXTF9WS0VZX1NwYWNlOiB7CisgICAgICBDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7CisgICAgICBBU1NFUlQocElGb3JtRmlsbGVyICE9IE5VTEwpOworCisgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7CisgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOworCisgICAgICBGWF9CT09MIGJSZXNldCA9IEZBTFNFOworICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworCisgICAgICBwSUZvcm1GaWxsZXItPk9uQnV0dG9uVXAobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsIG5GbGFncyk7CisKKyAgICAgIGlmIChiUmVzZXQpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgaWYgKGJFeGl0KQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKKworICAgICAgaWYgKENQV0xfQ2hlY2tCb3gqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisgICAgICAgIHBXbmQtPlNldENoZWNrKCFwV25kLT5Jc0NoZWNrZWQoKSk7CisKKyAgICAgIENvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZ3MpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKKyAgfQogfQogCi1DUFdMX1duZCogQ0ZGTF9DaGVja0JveDo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlDUFdMX0NoZWNrQm94KiBwV25kID0gbmV3IENQV0xfQ2hlY2tCb3goKTsKLQlwV25kLT5DcmVhdGUoY3ApOworRlhfQk9PTCBDRkZMX0NoZWNrQm94OjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIENGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAKLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotCXBXbmQtPlNldENoZWNrKG1fcFdpZGdldC0+SXNDaGVja2VkKCkpOworICBpZiAoSXNWYWxpZCgpKSB7CisgICAgaWYgKENQV0xfQ2hlY2tCb3gqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpIHsKKyAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgICAgICBwV25kLT5TZXRDaGVjayghcFdpZGdldC0+SXNDaGVja2VkKCkpOworICAgICAgLy8JcFduZC0+U2V0Q2hlY2soIXBXbmQtPklzQ2hlY2tlZCgpKTsKKyAgICB9CiAKLQlyZXR1cm4gcFduZDsKKyAgICBpZiAoIUNvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZ3MpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9DaGVja0JveDo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCi17Ci0Jc3dpdGNoIChuS2V5Q29kZSkKLQl7Ci0JY2FzZSBGV0xfVktFWV9SZXR1cm46Ci0JY2FzZSBGV0xfVktFWV9TcGFjZToKLQkJcmV0dXJuIFRSVUU7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFncyk7Ci0JfQotfQotRlhfQk9PTAlDRkZMX0NoZWNrQm94OjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKLXsKLQlzd2l0Y2ggKG5DaGFyKQotCXsKLQljYXNlIEZXTF9WS0VZX1JldHVybjoKLQljYXNlIEZXTF9WS0VZX1NwYWNlOgotCQl7Ci0JCQlDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7Ci0JCQlBU1NFUlQocElGb3JtRmlsbGVyICE9IE5VTEwpOworRlhfQk9PTCBDRkZMX0NoZWNrQm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogCi0JCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7Ci0JCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOworICBpZiAoQ1BXTF9DaGVja0JveCogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICByZXR1cm4gcFduZC0+SXNDaGVja2VkKCkgIT0gbV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKTsKKyAgfQogCi0JCQlGWF9CT09MIGJSZXNldCA9IEZBTFNFOwotCQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCi0JCQlwSUZvcm1GaWxsZXItPk9uQnV0dG9uVXAobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsbkZsYWdzKTsKLQotCQkJaWYgKGJSZXNldCkgcmV0dXJuIFRSVUU7Ci0JCQlpZiAoYkV4aXQpIHJldHVybiBUUlVFOwotCi0JCQlDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwotCi0JCQlpZiAoQ1BXTF9DaGVja0JveCAqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCi0JCQkJcFduZC0+U2V0Q2hlY2soIXBXbmQtPklzQ2hlY2tlZCgpKTsKLQotCQkJQ29tbWl0RGF0YShwUGFnZVZpZXcsbkZsYWdzKTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7Ci0JfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9DaGVja0JveDo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlDRkZMX0J1dHRvbjo6T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwordm9pZCBDRkZMX0NoZWNrQm94OjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIAotCWlmIChJc1ZhbGlkKCkpCi0JewotCQlpZiAoQ1BXTF9DaGVja0JveCAqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCi0JCXsKLQkJCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7Ci0JCQlwV25kLT5TZXRDaGVjayghcFdpZGdldC0+SXNDaGVja2VkKCkpOwotCQkvLwlwV25kLT5TZXRDaGVjayghcFduZC0+SXNDaGVja2VkKCkpOwotCQl9CisgIGlmIChDUFdMX0NoZWNrQm94KiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIEZYX0JPT0wgYk5ld0NoZWNrZWQgPSBwV25kLT5Jc0NoZWNrZWQoKTsKIAotCQlpZiAoIUNvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZ3MpKSByZXR1cm4gRkFMU0U7Ci0JfQorICAgIGlmIChiTmV3Q2hlY2tlZCkgeworICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCk7CisgICAgICBBU1NFUlQocEZpZWxkICE9IE5VTEwpOwogCi0JcmV0dXJuIFRSVUU7Ci19CisgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gcEZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKSkgeworICAgICAgICAgIGlmIChwQ3RybC0+SXNDaGVja2VkKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KIAotRlhfQk9PTAlDRkZMX0NoZWNrQm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQotCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Ci0KLQlpZiAoQ1BXTF9DaGVja0JveCogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JewotCQlyZXR1cm4gcFduZC0+SXNDaGVja2VkKCkgIT0gbV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgQ0ZGTF9DaGVja0JveDo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCi0JQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLQotCWlmIChDUFdMX0NoZWNrQm94KiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQl7Ci0KLQkJRlhfQk9PTCBiTmV3Q2hlY2tlZCA9IHBXbmQtPklzQ2hlY2tlZCgpOwotCi0KLQkJaWYgKGJOZXdDaGVja2VkKQotCQl7Ci0JCQlDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKTsKLQkJCUFTU0VSVChwRmllbGQgIT0gTlVMTCk7Ci0KLQkJCWZvciAoaW50MzJfdCBpPTAsc3o9cEZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGk8c3o7IGkrKykKLQkJCXsKLQkJCQlpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEN0cmwgPSBwRmllbGQtPkdldENvbnRyb2woaSkpCi0JCQkJewotCQkJCQlpZiAocEN0cmwtPklzQ2hlY2tlZCgpKQotCQkJCQl7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCW1fcFdpZGdldC0+U2V0Q2hlY2soYk5ld0NoZWNrZWQsIEZBTFNFKTsKLQkJbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwotCQlTZXRDaGFuZ2VNYXJrKCk7Ci0JfQotCisgICAgbV9wV2lkZ2V0LT5TZXRDaGVjayhiTmV3Q2hlY2tlZCwgRkFMU0UpOworICAgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKKyAgICBTZXRDaGFuZ2VNYXJrKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmNwcAppbmRleCA5NjU3NGQ2Li4xNDc3ZTI0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guY3BwCkBAIC0xMCw0MDkgKzEwLDM1OCBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmgiCiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZGTF9Db21ib0JveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRkZMX0NvbWJvQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ0ZGTF9Db21ib0JveDo6Q0ZGTF9Db21ib0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpIDoKLSAgICBDRkZMX0Zvcm1GaWxsZXIocEFwcCwgcEFubm90KSwgbV9wRm9udE1hcCggTlVMTCApCi17Ci0gICAgICAgIG1fU3RhdGUubkluZGV4ID0gMDsKLSAgICAgICAgbV9TdGF0ZS5uU3RhcnQgPSAwOwotICAgICAgICBtX1N0YXRlLm5FbmQgICA9IDA7CitDRkZMX0NvbWJvQm94OjpDRkZMX0NvbWJvQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKKyAgICA6IENGRkxfRm9ybUZpbGxlcihwQXBwLCBwQW5ub3QpLCBtX3BGb250TWFwKE5VTEwpIHsKKyAgbV9TdGF0ZS5uSW5kZXggPSAwOworICBtX1N0YXRlLm5TdGFydCA9IDA7CisgIG1fU3RhdGUubkVuZCA9IDA7CiB9CiAKLUNGRkxfQ29tYm9Cb3g6On5DRkZMX0NvbWJvQm94KCkKLXsKLSAgICBkZWxldGUgbV9wRm9udE1hcDsKK0NGRkxfQ29tYm9Cb3g6On5DRkZMX0NvbWJvQm94KCkgeworICBkZWxldGUgbV9wRm9udE1hcDsKIH0KIAotUFdMX0NSRUFURVBBUkFNIENGRkxfQ29tYm9Cb3g6OkdldENyZWF0ZVBhcmFtKCkKLXsKLSAgICBQV0xfQ1JFQVRFUEFSQU0gY3AgPSBDRkZMX0Zvcm1GaWxsZXI6OkdldENyZWF0ZVBhcmFtKCk7CitQV0xfQ1JFQVRFUEFSQU0gQ0ZGTF9Db21ib0JveDo6R2V0Q3JlYXRlUGFyYW0oKSB7CisgIFBXTF9DUkVBVEVQQVJBTSBjcCA9IENGRkxfRm9ybUZpbGxlcjo6R2V0Q3JlYXRlUGFyYW0oKTsKIAotICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CisgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLSAgICBpbnQgbkZsYWdzID0gbV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCk7CisgIGludCBuRmxhZ3MgPSBtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKIAotICAgIGlmIChuRmxhZ3MgJiBGSUVMREZMQUdfRURJVCkKLSAgICB7Ci0gICAgICAgIGNwLmR3RmxhZ3MgfD0gUENCU19BTExPV0NVU1RPTVRFWFQ7Ci0gICAgfQorICBpZiAobkZsYWdzICYgRklFTERGTEFHX0VESVQpIHsKKyAgICBjcC5kd0ZsYWdzIHw9IFBDQlNfQUxMT1dDVVNUT01URVhUOworICB9CiAKLSAgICBpZiAoIW1fcEZvbnRNYXApCi0gICAgewotICAgICAgICBtX3BGb250TWFwID0gbmV3IENCQV9Gb250TWFwKG1fcFdpZGdldCwgR2V0U3lzdGVtSGFuZGxlcigpKTsKLSAgICAgICAgbV9wRm9udE1hcC0+SW5pdGlhbCgpOwotICAgIH0KKyAgaWYgKCFtX3BGb250TWFwKSB7CisgICAgbV9wRm9udE1hcCA9IG5ldyBDQkFfRm9udE1hcChtX3BXaWRnZXQsIEdldFN5c3RlbUhhbmRsZXIoKSk7CisgICAgbV9wRm9udE1hcC0+SW5pdGlhbCgpOworICB9CiAKLSAgICBjcC5wRm9udE1hcCA9IG1fcEZvbnRNYXA7Ci0gICAgY3AucEZvY3VzSGFuZGxlciA9IHRoaXM7CisgIGNwLnBGb250TWFwID0gbV9wRm9udE1hcDsKKyAgY3AucEZvY3VzSGFuZGxlciA9IHRoaXM7CiAKLSAgICByZXR1cm4gY3A7CisgIHJldHVybiBjcDsKIH0KIAotQ1BXTF9XbmQqIENGRkxfQ29tYm9Cb3g6Ok5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0gICAgQ1BXTF9Db21ib0JveCAqIHBXbmQgPSBuZXcgQ1BXTF9Db21ib0JveCgpOwotICAgIHBXbmQtPkF0dGFjaEZGTERhdGEodGhpcyk7Ci0gICAgcFduZC0+Q3JlYXRlKGNwKTsKK0NQV0xfV25kKiBDRkZMX0NvbWJvQm94OjpOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIENQV0xfQ29tYm9Cb3gqIHBXbmQgPSBuZXcgQ1BXTF9Db21ib0JveCgpOworICBwV25kLT5BdHRhY2hGRkxEYXRhKHRoaXMpOworICBwV25kLT5DcmVhdGUoY3ApOwogCi0gICAgQ0ZGTF9JRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7Ci0gICAgcFduZC0+U2V0RmlsbGVyTm90aWZ5KHBGb3JtRmlsbGVyKTsKKyAgQ0ZGTF9JRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7CisgIHBXbmQtPlNldEZpbGxlck5vdGlmeShwRm9ybUZpbGxlcik7CiAKLSAgICBpbnQzMl90IG5DdXJTZWwgPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0OwotICAgIGlmIChuQ3VyU2VsIDwgMCkKLSAgICAgICAgc3dUZXh0ID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwotICAgIGVsc2UKLSAgICAgICAgc3dUZXh0ID0gbV9wV2lkZ2V0LT5HZXRPcHRpb25MYWJlbChuQ3VyU2VsKTsKKyAgaW50MzJfdCBuQ3VyU2VsID0gbV9wV2lkZ2V0LT5HZXRTZWxlY3RlZEluZGV4KDApOworICBDRlhfV2lkZVN0cmluZyBzd1RleHQ7CisgIGlmIChuQ3VyU2VsIDwgMCkKKyAgICBzd1RleHQgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CisgIGVsc2UKKyAgICBzd1RleHQgPSBtX3BXaWRnZXQtPkdldE9wdGlvbkxhYmVsKG5DdXJTZWwpOwogCi0gICAgZm9yIChpbnQzMl90IGk9MCxzej1tX3BXaWRnZXQtPkNvdW50T3B0aW9ucygpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgICBwV25kLT5BZGRTdHJpbmcobV9wV2lkZ2V0LT5HZXRPcHRpb25MYWJlbChpKS5jX3N0cigpKTsKLSAgICB9CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX3BXaWRnZXQtPkNvdW50T3B0aW9ucygpOyBpIDwgc3o7IGkrKykgeworICAgIHBXbmQtPkFkZFN0cmluZyhtX3BXaWRnZXQtPkdldE9wdGlvbkxhYmVsKGkpLmNfc3RyKCkpOworICB9CiAKLSAgICBwV25kLT5TZXRTZWxlY3QobkN1clNlbCk7Ci0gICAgcFduZC0+U2V0VGV4dChzd1RleHQuY19zdHIoKSk7Ci0gICAgcmV0dXJuIHBXbmQ7CisgIHBXbmQtPlNldFNlbGVjdChuQ3VyU2VsKTsKKyAgcFduZC0+U2V0VGV4dChzd1RleHQuY19zdHIoKSk7CisgIHJldHVybiBwV25kOwogfQogCi0KLUZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCi17Ci0gICAgcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CitGWF9CT09MIENGRkxfQ29tYm9Cb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MpIHsKKyAgcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0gICAgQ1BXTF9Db21ib0JveCogcFduZCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7Ci0gICAgaWYgKCFwV25kKQotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGRkxfQ29tYm9Cb3g6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIENQV0xfQ29tYm9Cb3gqIHBXbmQgPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworICBpZiAoIXBXbmQpCisgICAgcmV0dXJuIEZBTFNFOwogCisgIGludDMyX3QgbkN1clNlbCA9IHBXbmQtPkdldFNlbGVjdCgpOworICBpZiAoIShtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19FRElUKSkKKyAgICByZXR1cm4gbkN1clNlbCAhPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CisKKyAgaWYgKG5DdXJTZWwgPj0gMCkKKyAgICByZXR1cm4gbkN1clNlbCAhPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CisKKyAgcmV0dXJuIHBXbmQtPkdldFRleHQoKSAhPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7Cit9CisKK3ZvaWQgQ0ZGTF9Db21ib0JveDo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CisKKyAgaWYgKENQV0xfQ29tYm9Cb3gqIHBXbmQgPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gcFduZC0+R2V0VGV4dCgpOwogICAgIGludDMyX3QgbkN1clNlbCA9IHBXbmQtPkdldFNlbGVjdCgpOwotICAgIGlmICghKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0VESVQpKQotICAgICAgICByZXR1cm4gbkN1clNlbCAhPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CiAKLSAgICBpZiAobkN1clNlbCA+PSAwKQotICAgICAgICByZXR1cm4gbkN1clNlbCAhPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CisgICAgLy8gbWFudGlzOjAwMDQxNTcKKyAgICBGWF9CT09MIGJTZXRWYWx1ZSA9IFRSVUU7CiAKLSAgICByZXR1cm4gcFduZC0+R2V0VGV4dCgpICE9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKLX0KLQotdm9pZCBDRkZMX0NvbWJvQm94OjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0gICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLQotICAgIGlmIChDUFdMX0NvbWJvQm94KiBwV25kID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IHBXbmQtPkdldFRleHQoKTsKLSAgICAgICAgaW50MzJfdCBuQ3VyU2VsID0gcFduZC0+R2V0U2VsZWN0KCk7Ci0KLSAgICAgICAgLy9tYW50aXM6MDAwNDE1NwotICAgICAgICBGWF9CT09MIGJTZXRWYWx1ZSA9IFRSVUU7Ci0KLSAgICAgICAgaWYgKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0VESVQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuQ3VyU2VsID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN3VGV4dCAhPSBtX3BXaWRnZXQtPkdldE9wdGlvbkxhYmVsKG5DdXJTZWwpKQotICAgICAgICAgICAgICAgICAgICBiU2V0VmFsdWUgPSBUUlVFOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYlNldFZhbHVlID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYlNldFZhbHVlID0gVFJVRTsKLSAgICAgICAgfQorICAgIGlmIChtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19FRElUKSB7CisgICAgICBpZiAobkN1clNlbCA+PSAwKSB7CisgICAgICAgIGlmIChzd1RleHQgIT0gbV9wV2lkZ2V0LT5HZXRPcHRpb25MYWJlbChuQ3VyU2VsKSkKKyAgICAgICAgICBiU2V0VmFsdWUgPSBUUlVFOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBiU2V0VmFsdWUgPSBGQUxTRTsKKyAgICAgICAgICBiU2V0VmFsdWUgPSBGQUxTRTsKKyAgICAgIH0gZWxzZQorICAgICAgICBiU2V0VmFsdWUgPSBUUlVFOworICAgIH0gZWxzZQorICAgICAgYlNldFZhbHVlID0gRkFMU0U7CiAKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc09sZFZhbHVlOworICAgIENGWF9XaWRlU3RyaW5nIHNPbGRWYWx1ZTsKIAotCi0gICAgICAgIGlmIChiU2V0VmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNPbGRWYWx1ZSA9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKLSAgICAgICAgICAgIG1fcFdpZGdldC0+U2V0VmFsdWUoc3dUZXh0LCBGQUxTRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7Ci0gICAgICAgICAgICBtX3BXaWRnZXQtPlNldE9wdGlvblNlbGVjdGlvbihuQ3VyU2VsLCBUUlVFLCBGQUxTRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKFRSVUUpOwotICAgICAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7Ci0gICAgICAgIFNldENoYW5nZU1hcmsoKTsKLQotICAgICAgICBtX3BXaWRnZXQtPkdldFBERlBhZ2UoKTsKLQotCisgICAgaWYgKGJTZXRWYWx1ZSkgeworICAgICAgc09sZFZhbHVlID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOworICAgICAgbV9wV2lkZ2V0LT5TZXRWYWx1ZShzd1RleHQsIEZBTFNFKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9wV2lkZ2V0LT5HZXRTZWxlY3RlZEluZGV4KDApOworICAgICAgbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24obkN1clNlbCwgVFJVRSwgRkFMU0UpOwogICAgIH0KKworICAgIG1fcFdpZGdldC0+UmVzZXRGaWVsZEFwcGVhcmFuY2UoVFJVRSk7CisgICAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOworICAgIFNldENoYW5nZU1hcmsoKTsKKworICAgIG1fcFdpZGdldC0+R2V0UERGUGFnZSgpOworICB9CiB9CiAKLSB2b2lkIENGRkxfQ29tYm9Cb3g6OkdldEFjdGlvbkRhdGEoIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBQREZTREtfRmllbGRBY3Rpb24mIGZhKQotewotICAgIHN3aXRjaCAodHlwZSkKLSAgICB7Cit2b2lkIENGRkxfQ29tYm9Cb3g6OkdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGZhKSB7CisgIHN3aXRjaCAodHlwZSkgewogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6Ci0gICAgICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKSpwQ29tYm9Cb3gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmEuYkZpZWxkRnVsbCA9IHBFZGl0LT5Jc1RleHRGdWxsKCk7Ci0gICAgICAgICAgICAgICAgaW50IG5TZWxTdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IG5TZWxFbmQgPSAwOwotICAgICAgICAgICAgICAgIHBFZGl0LT5HZXRTZWwoblNlbFN0YXJ0LCBuU2VsRW5kKTsKLSAgICAgICAgICAgICAgICBmYS5uU2VsRW5kID0gblNlbEVuZDsKLSAgICAgICAgICAgICAgICBmYS5uU2VsU3RhcnQgPSBuU2VsU3RhcnQ7Ci0gICAgICAgICAgICAgICAgZmEuc1ZhbHVlID0gcEVkaXQtPkdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBmYS5zQ2hhbmdlRXggPSBHZXRTZWxlY3RFeHBvcnRUZXh0KCk7CisgICAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0KKyAgICAgICAgICAgICAgKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgICAgICBpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKSpwQ29tYm9Cb3gpIHsKKyAgICAgICAgICBmYS5iRmllbGRGdWxsID0gcEVkaXQtPklzVGV4dEZ1bGwoKTsKKyAgICAgICAgICBpbnQgblNlbFN0YXJ0ID0gMDsKKyAgICAgICAgICBpbnQgblNlbEVuZCA9IDA7CisgICAgICAgICAgcEVkaXQtPkdldFNlbChuU2VsU3RhcnQsIG5TZWxFbmQpOworICAgICAgICAgIGZhLm5TZWxFbmQgPSBuU2VsRW5kOworICAgICAgICAgIGZhLm5TZWxTdGFydCA9IG5TZWxTdGFydDsKKyAgICAgICAgICBmYS5zVmFsdWUgPSBwRWRpdC0+R2V0VGV4dCgpOworICAgICAgICAgIGZhLnNDaGFuZ2VFeCA9IEdldFNlbGVjdEV4cG9ydFRleHQoKTsKIAotICAgICAgICAgICAgICAgIGlmIChmYS5iRmllbGRGdWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmEuc0NoYW5nZSA9IEwiIjsKLSAgICAgICAgICAgICAgICAgICAgZmEuc0NoYW5nZUV4ID0gTCIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZmEuYkZpZWxkRnVsbCkgeworICAgICAgICAgICAgZmEuc0NoYW5nZSA9IEwiIjsKKyAgICAgICAgICAgIGZhLnNDaGFuZ2VFeCA9IEwiIjsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6VmFsaWRhdGU6Ci0gICAgICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKSpwQ29tYm9Cb3gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmEuc1ZhbHVlID0gcEVkaXQtPkdldFRleHQoKTsKLSAgICAgICAgICAgIH0KKyAgICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPQorICAgICAgICAgICAgICAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgICAgIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkgeworICAgICAgICAgIGZhLnNWYWx1ZSA9IHBFZGl0LT5HZXRUZXh0KCk7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6TG9zZUZvY3VzOgogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpHZXRGb2N1czoKLSAgICAgICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLSAgICAgICAgZmEuc1ZhbHVlID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwotICAgICAgICBicmVhazsKKyAgICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CisgICAgICBmYS5zVmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CisgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9CisgICAgICBicmVhazsKKyAgfQogfQogCi0KLQotdm9pZCBDRkZMX0NvbWJvQm94OjpTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpCi0gICAgewordm9pZCBDRkZMX0NvbWJvQm94OjpTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSkgeworICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgotICAgICAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSAoQ1BXTF9FZGl0KikqcENvbWJvQm94KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBFZGl0LT5TZXRTZWwoZmEublNlbFN0YXJ0LCBmYS5uU2VsRW5kKTsKLSAgICAgICAgICAgICAgICBwRWRpdC0+UmVwbGFjZVNlbChmYS5zQ2hhbmdlLmNfc3RyKCkpOwotICAgICAgICAgICAgfQorICAgICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9CisgICAgICAgICAgICAgIChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICAgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSAoQ1BXTF9FZGl0KikqcENvbWJvQm94KSB7CisgICAgICAgICAgcEVkaXQtPlNldFNlbChmYS5uU2VsU3RhcnQsIGZhLm5TZWxFbmQpOworICAgICAgICAgIHBFZGl0LT5SZXBsYWNlU2VsKGZhLnNDaGFuZ2UuY19zdHIoKSk7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9CisgICAgICBicmVhazsKKyAgfQogfQogCi1GWF9CT09MIENGRkxfQ29tYm9Cb3g6OklzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldykKLXsKLSAgICBzd2l0Y2ggKHR5cGUpCi0gICAgeworRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpIHsKKyAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLSAgICAgICAgcmV0dXJuICghZmFPbGQuYkZpZWxkRnVsbCAmJiBmYU9sZC5uU2VsRW5kICE9IGZhTmV3Lm5TZWxFbmQpIHx8IGZhT2xkLm5TZWxTdGFydCAhPSBmYU5ldy5uU2VsU3RhcnQgfHwKLSAgICAgICAgICAgIGZhT2xkLnNDaGFuZ2UgIT0gZmFOZXcuc0NoYW5nZTsKKyAgICAgIHJldHVybiAoIWZhT2xkLmJGaWVsZEZ1bGwgJiYgZmFPbGQublNlbEVuZCAhPSBmYU5ldy5uU2VsRW5kKSB8fAorICAgICAgICAgICAgIGZhT2xkLm5TZWxTdGFydCAhPSBmYU5ldy5uU2VsU3RhcnQgfHwKKyAgICAgICAgICAgICBmYU9sZC5zQ2hhbmdlICE9IGZhTmV3LnNDaGFuZ2U7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZCBDRkZMX0NvbWJvQm94OjpTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisKKyAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9CisgICAgICAgICAgKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIG1fU3RhdGUubkluZGV4ID0gcENvbWJvQm94LT5HZXRTZWxlY3QoKTsKKworICAgIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkgeworICAgICAgcEVkaXQtPkdldFNlbChtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKKyAgICAgIG1fU3RhdGUuc1ZhbHVlID0gcEVkaXQtPkdldFRleHQoKTsKICAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7CisgIH0KIH0KIAotdm9pZCBDRkZMX0NvbWJvQm94OjpTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Cit2b2lkIENGRkxfQ29tYm9Cb3g6OlJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKIAotICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotICAgIHsKLSAgICAgICAgbV9TdGF0ZS5uSW5kZXggPSBwQ29tYm9Cb3gtPkdldFNlbGVjdCgpOwotCi0gICAgICAgIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkKLSAgICAgICAgewotICAgICAgICAgICAgcEVkaXQtPkdldFNlbChtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKLSAgICAgICAgICAgIG1fU3RhdGUuc1ZhbHVlID0gcEVkaXQtPkdldFRleHQoKTsKLSAgICAgICAgfQorICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0KKyAgICAgICAgICAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpIHsKKyAgICBpZiAobV9TdGF0ZS5uSW5kZXggPj0gMCkKKyAgICAgIHBDb21ib0JveC0+U2V0U2VsZWN0KG1fU3RhdGUubkluZGV4KTsKKyAgICBlbHNlIHsKKyAgICAgIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkgeworICAgICAgICBwRWRpdC0+U2V0VGV4dChtX1N0YXRlLnNWYWx1ZS5jX3N0cigpKTsKKyAgICAgICAgcEVkaXQtPlNldFNlbChtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKKyAgICAgIH0KICAgICB9CisgIH0KIH0KIAotdm9pZCBDRkZMX0NvbWJvQm94OjpSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CitDUFdMX1duZCogQ0ZGTF9Db21ib0JveDo6UmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkgeworICBpZiAoYlJlc3RvcmVWYWx1ZSkKKyAgICBTYXZlU3RhdGUocFBhZ2VWaWV3KTsKIAotICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCi0gICAgewotICAgICAgICBpZiAobV9TdGF0ZS5uSW5kZXggPj0gMCkKLSAgICAgICAgICAgIHBDb21ib0JveC0+U2V0U2VsZWN0KG1fU3RhdGUubkluZGV4KTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKSpwQ29tYm9Cb3gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEVkaXQtPlNldFRleHQobV9TdGF0ZS5zVmFsdWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgcEVkaXQtPlNldFNlbChtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7CisKKyAgQ1BXTF9XbmQqIHBSZXQgPSBOVUxMOworCisgIGlmIChiUmVzdG9yZVZhbHVlKSB7CisgICAgUmVzdG9yZVN0YXRlKHBQYWdlVmlldyk7CisgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKyAgfSBlbHNlCisgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOworCisgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKKworICByZXR1cm4gcFJldDsKK30KKwordm9pZCBDRkZMX0NvbWJvQm94OjpPbktleVN0cm9rZShGWF9CT09MIGJLZXlEb3duLCBGWF9VSU5UIG5GbGFnKSB7CisgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CisKKyAgaW50IG5GbGFncyA9IG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpOworCisgIGlmIChuRmxhZ3MgJiBGSUVMREZMQUdfQ09NTUlUT05TRUxDSEFOR0UpIHsKKyAgICBpZiAobV9iVmFsaWQpIHsKKyAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CisgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOworCisgICAgICBpZiAoQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFnKSkgeworICAgICAgICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7CisgICAgICAgIG1fYlZhbGlkID0gRkFMU0U7CisgICAgICB9CiAgICAgfQorICB9CiB9CiAKLUNQV0xfV25kKiBDRkZMX0NvbWJvQm94OjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkKLXsKLSAgICBpZiAoYlJlc3RvcmVWYWx1ZSkKLSAgICAgICAgU2F2ZVN0YXRlKHBQYWdlVmlldyk7Ci0KLSAgICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7Ci0KLSAgICBDUFdMX1duZCogcFJldCA9IE5VTEw7Ci0KLSAgICBpZiAoYlJlc3RvcmVWYWx1ZSkKLSAgICB7Ci0gICAgICAgIFJlc3RvcmVTdGF0ZShwUGFnZVZpZXcpOwotICAgICAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpJc0ZpZWxkRnVsbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9CisgICAgICAgICAgKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkgeworICAgICAgcmV0dXJuIHBFZGl0LT5Jc1RleHRGdWxsKCk7CiAgICAgfQotICAgIGVsc2UKLSAgICAgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOworICB9CiAKLSAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7Ci0KLSAgICByZXR1cm4gcFJldDsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENGRkxfQ29tYm9Cb3g6Ok9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpCi17Ci0gICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKK3ZvaWQgQ0ZGTF9Db21ib0JveDo6T25TZXRGb2N1cyhDUFdMX1duZCogcFduZCkgeworICBBU1NFUlQobV9wQXBwICE9IE5VTEwpOwogCi0gICAgaW50IG5GbGFncyA9IG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpOworICBBU1NFUlQocFduZCAhPSBOVUxMKTsKIAotICAgIGlmIChuRmxhZ3MgJiBGSUVMREZMQUdfQ09NTUlUT05TRUxDSEFOR0UpCi0gICAgewotICAgICAgICBpZiAobV9iVmFsaWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7Ci0gICAgICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOworICBpZiAocFduZC0+R2V0Q2xhc3NOYW1lKCkgPT0gUFdMX0NMQVNTTkFNRV9FRElUKSB7CisgICAgQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKXBXbmQ7CisgICAgcEVkaXQtPlNldENoYXJTZXQoMTM0KTsKKyAgICBwRWRpdC0+U2V0Q29kZVBhZ2UoOTM2KTsKIAotICAgICAgICAgICAgaWYgKENvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwotICAgICAgICAgICAgICAgIG1fYlZhbGlkID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBwRWRpdC0+U2V0UmVhZHlUb0lucHV0KCk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0ID0gcEVkaXQtPkdldFRleHQoKTsKKyAgICBpbnQgbkNoYXJhY3RlcnMgPSB3c1RleHQuR2V0TGVuZ3RoKCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVVEZUZXh0ID0gd3NUZXh0LlVURjE2TEVfRW5jb2RlKCk7CisgICAgdW5zaWduZWQgc2hvcnQqIHBCdWZmZXIgPSAodW5zaWduZWQgc2hvcnQqKWJzVVRGVGV4dC5jX3N0cigpOworICAgIG1fcEFwcC0+RkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJhY3RlcnMsIFRSVUUpOworCisgICAgcEVkaXQtPlNldEVkaXROb3RpZnkodGhpcyk7CisgIH0KK30KKwordm9pZCBDRkZMX0NvbWJvQm94OjpPbktpbGxGb2N1cyhDUFdMX1duZCogcFduZCkgeworICBBU1NFUlQobV9wQXBwICE9IE5VTEwpOworfQorCitGWF9CT09MIENGRkxfQ29tYm9Cb3g6OkNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENGRkxfQ29tYm9Cb3g6OkNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkIENGRkxfQ29tYm9Cb3g6OkRvQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKK30KKwordm9pZCBDRkZMX0NvbWJvQm94OjpEb0N1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKK30KKwordm9pZCBDRkZMX0NvbWJvQm94OjpEb1Bhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworfQorCit2b2lkIENGRkxfQ29tYm9Cb3g6Ok9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KSB7CisgIEFTU0VSVChwRWRpdCAhPSBOVUxMKTsKK30KKworQ0ZYX1dpZGVTdHJpbmcgQ0ZGTF9Db21ib0JveDo6R2V0U2VsZWN0RXhwb3J0VGV4dCgpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7CisKKyAgaW50IG5FeHBvcnQgPSAtMTsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKKyAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9CisgICAgICAgICAgKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIG5FeHBvcnQgPSBwQ29tYm9Cb3gtPkdldFNlbGVjdCgpOworICB9CisKKyAgaWYgKG5FeHBvcnQgPj0gMCkgeworICAgIGlmIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCkpIHsKKyAgICAgIHN3UmV0ID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uVmFsdWUobkV4cG9ydCk7CisgICAgICBpZiAoc3dSZXQuSXNFbXB0eSgpKQorICAgICAgICBzd1JldCA9IHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKG5FeHBvcnQpOwogICAgIH0KLX0KKyAgfQogCi1GWF9CT09MCUNGRkxfQ29tYm9Cb3g6OklzRmllbGRGdWxsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQl7Ci0JCWlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkKLQkJewotCQkJcmV0dXJuIHBFZGl0LT5Jc1RleHRGdWxsKCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgQ0ZGTF9Db21ib0JveDo6T25TZXRGb2N1cyhDUFdMX1duZCogcFduZCkKLXsKLSAgICBBU1NFUlQobV9wQXBwICE9IE5VTEwpOwotCi0gICAgQVNTRVJUKHBXbmQgIT0gTlVMTCk7Ci0KLSAgICBpZiAocFduZC0+R2V0Q2xhc3NOYW1lKCkgPT0gUFdMX0NMQVNTTkFNRV9FRElUKQotICAgIHsKLSAgICAgICAgQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKXBXbmQ7Ci0gICAgICAgIHBFZGl0LT5TZXRDaGFyU2V0KDEzNCk7Ci0gICAgICAgIHBFZGl0LT5TZXRDb2RlUGFnZSg5MzYpOwotCi0gICAgICAgIHBFZGl0LT5TZXRSZWFkeVRvSW5wdXQoKTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0ID0gcEVkaXQtPkdldFRleHQoKTsKLSAgICAgICAgaW50IG5DaGFyYWN0ZXJzID0gd3NUZXh0LkdldExlbmd0aCgpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1VURlRleHQgPSB3c1RleHQuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQqIHBCdWZmZXIgPSAodW5zaWduZWQgc2hvcnQqKWJzVVRGVGV4dC5jX3N0cigpOwotICAgICAgICBtX3BBcHAtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhtX3BXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBwQnVmZmVyLCBuQ2hhcmFjdGVycywgVFJVRSk7Ci0KLSAgICAgICAgcEVkaXQtPlNldEVkaXROb3RpZnkodGhpcyk7Ci0gICAgfQotfQotCi12b2lkIENGRkxfQ29tYm9Cb3g6Ok9uS2lsbEZvY3VzKENQV0xfV25kKiBwV25kKQotewotICAgIEFTU0VSVChtX3BBcHAgIT0gTlVMTCk7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6Q2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0gICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgQ0ZGTF9Db21ib0JveDo6RG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotfQotCi12b2lkIENGRkxfQ29tYm9Cb3g6OkRvQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotfQotCi12b2lkIENGRkxfQ29tYm9Cb3g6OkRvUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci19Ci0KLXZvaWQgQ0ZGTF9Db21ib0JveDo6T25BZGRVbmRvKENQV0xfRWRpdCogcEVkaXQpCi17Ci0gICAgQVNTRVJUKHBFZGl0ICE9IE5VTEwpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDRkZMX0NvbWJvQm94OjpHZXRTZWxlY3RFeHBvcnRUZXh0KCkKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBzd1JldDsKLQotICAgIGludCBuRXhwb3J0ID0gLTE7Ci0gICAgQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKLSAgICBpZiAoQ1BXTF9Db21ib0JveCAqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0gICAgewotICAgICAgICBuRXhwb3J0ID0gcENvbWJvQm94LT5HZXRTZWxlY3QoKTsKLSAgICB9Ci0KLSAgICBpZiAobkV4cG9ydCA+PSAwKQotICAgIHsKLSAgICAgICAgaWYgKENQREZfRm9ybUZpZWxkICogcEZvcm1GaWVsZCA9IG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3UmV0ID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uVmFsdWUobkV4cG9ydCk7Ci0gICAgICAgICAgICBpZiAoc3dSZXQuSXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHN3UmV0ID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwobkV4cG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3dSZXQ7CisgIHJldHVybiBzd1JldDsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKaW5kZXggNzE3ZDFhNS4uNWVlZjViYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKQEAgLTQsODMxICs0LDc2MyBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0KICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuaCIKIAotI2RlZmluZSBHZXRSZWQocmdiKSAgICAgICAgICgodWludDhfdCkocmdiKSkKLSNkZWZpbmUgR2V0R3JlZW4ocmdiKSAgICAgICAoKHVpbnQ4X3QpKCgoRlhfV09SRCkocmdiKSkgPj4gOCkpCi0jZGVmaW5lIEdldEJsdWUocmdiKSAgICAgICAgKCh1aW50OF90KSgocmdiKT4+MTYpKQorI2RlZmluZSBHZXRSZWQocmdiKSAoKHVpbnQ4X3QpKHJnYikpCisjZGVmaW5lIEdldEdyZWVuKHJnYikgKCh1aW50OF90KSgoKEZYX1dPUkQpKHJnYikpID4+IDgpKQorI2RlZmluZSBHZXRCbHVlKHJnYikgKCh1aW50OF90KSgocmdiKSA+PiAxNikpCiAKLSNkZWZpbmUgRkZMX0hJTlRfRUxBUFNFICAgICA4MDAKKyNkZWZpbmUgRkZMX0hJTlRfRUxBUFNFIDgwMAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGRkxfRm9ybUZpbGxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNGRkxfRm9ybUZpbGxlcjo6Q0ZGTF9Gb3JtRmlsbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKLSAgICA6IG1fcEFwcChwQXBwKSwKLSAgICAgIG1fcEFubm90KHBBbm5vdCksCi0gICAgICBtX2JWYWxpZChGQUxTRSksCi0gICAgICBtX3B0T2xkUG9zKDAsMCkKLXsKLSAgICBtX3BXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKSBwQW5ub3Q7CitDRkZMX0Zvcm1GaWxsZXI6OkNGRkxfRm9ybUZpbGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KQorICAgIDogbV9wQXBwKHBBcHApLCBtX3BBbm5vdChwQW5ub3QpLCBtX2JWYWxpZChGQUxTRSksIG1fcHRPbGRQb3MoMCwgMCkgeworICBtX3BXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKIH0KIAotQ0ZGTF9Gb3JtRmlsbGVyOjp+Q0ZGTF9Gb3JtRmlsbGVyKCkKLXsKLSAgICBmb3IgKGF1dG8mIGl0IDogbV9NYXBzKSB7Ci0gICAgICAgIENQV0xfV25kKiBwV25kID0gaXQuc2Vjb25kOwotICAgICAgICBDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwV25kLT5HZXRBdHRhY2hlZERhdGEoKTsKLSAgICAgICAgcFduZC0+RGVzdHJveSgpOwotICAgICAgICBkZWxldGUgcFduZDsKLSAgICAgICAgZGVsZXRlIHBEYXRhOwotICAgIH0KLSAgICBtX01hcHMuY2xlYXIoKTsKLX0KLQotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlNldFdpbmRvd1JlY3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDUERGX1JlY3QmIHJjV2luZG93KQotewotICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHBXbmQtPk1vdmUoQ1BERl9SZWN0KHJjV2luZG93KSwgVFJVRSwgRkFMU0UpOwotICAgIH0KLX0KLQotQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6R2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0gICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBXbmQtPkdldFdpbmRvd1JlY3QoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gQ1BERl9SZWN0KDAsMCwwLDApOwotfQotCi1GWF9SRUNUIENGRkxfRm9ybUZpbGxlcjo6R2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0gICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBtX3BXaWRnZXQtPkdldFJlY3QoKTsKLQotICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIENQREZfUmVjdCByY1dpbmRvdyA9IHBXbmQtPkdldFdpbmRvd1JlY3QoKTsKLSAgICAgICAgcmNBbm5vdCA9IFBXTHRvRkZMKHJjV2luZG93KTsKLSAgICB9Ci0KLSAgICBDUERGX1JlY3QgcmNXaW4gPSByY0Fubm90OwotCi0gICAgQ1BERl9SZWN0IHJjRm9jdXMgPSBHZXRGb2N1c0JveChwUGFnZVZpZXcpOwotICAgIGlmICghcmNGb2N1cy5Jc0VtcHR5KCkpCi0gICAgICAgIHJjV2luLlVuaW9uKHJjRm9jdXMpOwotCi0gICAgQ1BERl9SZWN0IHJlY3QgPSBDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChyY1dpbiwxKTsKLQotICAgIHJldHVybiByZWN0LkdldE91dHRlclJlY3QoKTsKLX0KLQotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykKLXsKLSAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwotCi0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIENQREZfTWF0cml4IG10ID0gR2V0Q3VyTWF0cml4KCk7Ci0gICAgICAgIG10LkNvbmNhdCgqcFVzZXIyRGV2aWNlKTsKLSAgICAgICAgcFduZC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwmbXQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotICAgICAgICBpZiAoQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWaXNpYmxlKHBXaWRnZXQpKQotICAgICAgICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwotICAgIH0KLX0KLQotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uRHJhd0RlYWN0aXZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykKLXsKLSAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKLX0KLQotCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6T25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotfQotCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6T25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLX0KLQotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLX0KLQotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLX0KLQotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQotewotICAgIEVuZFRpbWVyKCk7Ci0gICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLX0KLQotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCi0gICAgewotICAgICAgICBtX2JWYWxpZCA9IFRSVUU7Ci0gICAgICAgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldyxwQW5ub3QpOwotICAgICAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0KLSAgICAgICAgaWYoIXJlY3QuQ29udGFpbnMoKGludClwb2ludC54LCAoaW50KXBvaW50LnkpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIHJldHVybiBwV25kLT5PbkxCdXR0b25Eb3duKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotICAgIHsKLSAgICAgICAgRlhfUkVDVCByY0ZGTCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKLSAgICAgICAgSW52YWxpZGF0ZVJlY3QocmNGRkwubGVmdCwgcmNGRkwudG9wLCByY0ZGTC5yaWdodCwgcmNGRkwuYm90dG9tKTsKLSAgICAgICAgcFduZC0+T25MQnV0dG9uVXAoV25kdG9QV0wocFBhZ2VWaWV3LCBwb2ludCksbkZsYWdzKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHBXbmQtPk9uTEJ1dHRvbkRibENsayhXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIGlmICgobV9wdE9sZFBvcy54ICE9IHBvaW50LngpIHx8IChtX3B0T2xkUG9zLnkgIT0gcG9pbnQueSkpCi0gICAgewotICAgICAgICBtX3B0T2xkUG9zID0gcG9pbnQ7Ci0gICAgfQotCi0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHBXbmQtPk9uTW91c2VNb3ZlKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKCFJc1ZhbGlkKCkpIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwV25kLT5Pbk1vdXNlV2hlZWwoekRlbHRhLCBXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCi0gICAgewotICAgICAgICBwV25kLT5PblJCdXR0b25Eb3duKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHBXbmQtPk9uUkJ1dHRvblVwKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIGlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0gICAgewotICAgICAgICBwV25kLT5PblJCdXR0b25EYmxDbGsoV25kdG9QV0wocFBhZ2VWaWV3LCBwb2ludCksbkZsYWdzKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCi17Ci0gICAgaWYgKElzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7Ci0gICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBXbmQtPk9uS2V5RG93bihuS2V5Q29kZSxuRmxhZ3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCi17Ci0gICAgaWYgKElzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7Ci0gICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBXbmQtPk9uQ2hhcihuQ2hhcixuRmxhZ3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6T25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBBU1NFUlQoRkFMU0UpOwotfQotCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6T25TZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgQVNTRVJUKEZBTFNFKTsKLX0KLQotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKQotewotICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7Ci0gICAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBXaWRnZXQtPkdldFBERlhGQVBhZ2UoKTsKLSAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wQXBwLT5HZXRTREtEb2N1bWVudCgpOwotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBEb2MtPkdldFBhZ2VWaWV3KHBQYWdlKTsKLSAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKLSAgICAgICAgcFduZC0+U2V0Rm9jdXMoKTsKLQotICAgIG1fYlZhbGlkID0gVFJVRTsKLSAgICBGWF9SRUNUIHJjUmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldyxwQW5ub3QpOwotICAgIEludmFsaWRhdGVSZWN0KHJjUmVjdC5sZWZ0LCByY1JlY3QudG9wLCByY1JlY3QucmlnaHQsIHJjUmVjdC5ib3R0b20pOwotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKQotewotICAgIGlmICghSXNWYWxpZCgpKQotICAgICAgICByZXR1cm4gVFJVRTsKLQotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7Ci0gICAgQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFnKTsKLQotICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICAgICAgcFduZC0+S2lsbEZvY3VzKCk7Ci0KLSAgICBzd2l0Y2ggKG1fcFdpZGdldC0+R2V0RmllbGRUeXBlKCkpCi0gICAgewotICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046Ci0gICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6Ci0gICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046Ci0gICAgICAgIEVzY2FwZUZpbGxlcihwUGFnZVZpZXcsIFRSVUUpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LCBGQUxTRSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzVmFsaWQoKSBjb25zdAotewotICAgIHJldHVybiBtX2JWYWxpZDsKLX0KLQotUFdMX0NSRUFURVBBUkFNIENGRkxfRm9ybUZpbGxlcjo6R2V0Q3JlYXRlUGFyYW0oKQotewotICAgIEFTU0VSVChtX3BBcHAgIT0gTlVMTCk7Ci0KLSAgICBQV0xfQ1JFQVRFUEFSQU0gY3A7Ci0gICAgY3AucFBhcmVudFduZCA9IE5VTEw7Ci0gICAgY3AucFByb3ZpZGVyID0gdGhpczsKLSAgICBjcC5yY1JlY3RXbmQgPSBHZXRQREZXaW5kb3dSZWN0KCk7Ci0KLSAgICBGWF9EV09SRCBkd0NyZWF0ZUZsYWdzID0gUFdTX0JPUkRFUiB8IFBXU19CQUNLR1JPVU5EIHwgUFdTX1ZJU0lCTEU7Ci0gICAgRlhfRFdPUkQgZHdGaWVsZEZsYWcgPSBtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKLSAgICBpZiAoZHdGaWVsZEZsYWcgJiBGSUVMREZMQUdfUkVBRE9OTFkpCi0gICAgewotICAgICAgICBkd0NyZWF0ZUZsYWdzIHw9IFBXU19SRUFET05MWTsKLSAgICB9Ci0KLSAgICBGWF9DT0xPUlJFRiBjb2xvcjsKLSAgICBpZiAobV9wV2lkZ2V0LT5HZXRGaWxsQ29sb3IoY29sb3IpKQotICAgIHsKLSAgICAgICAgY3Auc0JhY2tncm91bmRDb2xvciA9IENQV0xfQ29sb3IoR2V0UmVkKGNvbG9yKSwgR2V0R3JlZW4oY29sb3IpLCBHZXRCbHVlKGNvbG9yKSk7Ci0gICAgfQotCi0gICAgaWYgKG1fcFdpZGdldC0+R2V0Qm9yZGVyQ29sb3IoY29sb3IpKQotICAgIHsKLSAgICAgICAgY3Auc0JvcmRlckNvbG9yID0gQ1BXTF9Db2xvcihHZXRSZWQoY29sb3IpLCBHZXRHcmVlbihjb2xvciksIEdldEJsdWUoY29sb3IpKTsKLSAgICB9Ci0KLSAgICBjcC5zVGV4dENvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwKTsKLQotICAgIGlmIChtX3BXaWRnZXQtPkdldFRleHRDb2xvcihjb2xvcikpCi0gICAgewotICAgICAgICBjcC5zVGV4dENvbG9yID0gQ1BXTF9Db2xvcihHZXRSZWQoY29sb3IpLCBHZXRHcmVlbihjb2xvciksIEdldEJsdWUoY29sb3IpKTsKLSAgICB9Ci0KLSAgICBjcC5mRm9udFNpemUgPSBtX3BXaWRnZXQtPkdldEZvbnRTaXplKCk7Ci0gICAgY3AuZHdCb3JkZXJXaWR0aCA9IG1fcFdpZGdldC0+R2V0Qm9yZGVyV2lkdGgoKTsKLQotICAgIGludCBuQm9yZGVyU3R5bGUgPSBtX3BXaWRnZXQtPkdldEJvcmRlclN0eWxlKCk7Ci0KLSAgICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkKLSAgICB7Ci0gICAgY2FzZSBCQlNfU09MSUQ6Ci0gICAgICAgIGNwLm5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCQlNfREFTSDoKLSAgICAgICAgY3AubkJvcmRlclN0eWxlID0gUEJTX0RBU0g7Ci0gICAgICAgIGNwLnNEYXNoID0gQ1BXTF9EYXNoKDMsMywwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCQlNfQkVWRUxFRDoKLSAgICAgICAgY3AubkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7Ci0gICAgICAgIGNwLmR3Qm9yZGVyV2lkdGggKj0gMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCQlNfSU5TRVQ6Ci0gICAgICAgIGNwLm5Cb3JkZXJTdHlsZSA9IFBCU19JTlNFVDsKLSAgICAgICAgY3AuZHdCb3JkZXJXaWR0aCAqPSAyOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEJCU19VTkRFUkxJTkU6Ci0gICAgICAgIGNwLm5Cb3JkZXJTdHlsZSA9IFBCU19VTkRFUkxJTkVEOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoY3AuZkZvbnRTaXplIDw9IDApCi0gICAgewotICAgICAgICBkd0NyZWF0ZUZsYWdzIHw9IFBXU19BVVRPRk9OVFNJWkU7Ci0gICAgfQotCi0gICAgY3AuZHdGbGFncyA9IGR3Q3JlYXRlRmxhZ3M7Ci0gICAgY3AucFN5c3RlbUhhbmRsZXIgPSBtX3BBcHAtPkdldFN5c0hhbmRsZXIoKTsKLSAgICByZXR1cm4gY3A7Ci19Ci0KLUNQV0xfV25kKiBDRkZMX0Zvcm1GaWxsZXI6OkdldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYk5ldykKLXsKLSAgICBBU1NFUlQocFBhZ2VWaWV3KTsKLQotICAgIGF1dG8gaXQgPSBtX01hcHMuZmluZChwUGFnZVZpZXcpOwotICAgIGNvbnN0IGJvb2wgZm91bmQgPSBpdCAhPSBtX01hcHMuZW5kKCk7Ci0gICAgQ1BXTF9XbmQqIHBXbmQgPSBmb3VuZCA/IGl0LT5zZWNvbmQgOiBudWxscHRyOwotICAgIGlmICghYk5ldykKLSAgICAgICAgcmV0dXJuIHBXbmQ7Ci0KLSAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgQ0ZGTF9Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0KLSAgICAgICAgICAgIChDRkZMX1ByaXZhdGVEYXRhKilwV25kLT5HZXRBdHRhY2hlZERhdGEoKTsKLSAgICAgICAgaWYgKHBQcml2YXRlRGF0YS0+bldpZGdldEFnZSAhPSBtX3BXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIFJlc2V0UERGV2luZG93KAotICAgICAgICAgICAgICAgIHBQYWdlVmlldywgbV9wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpID09IHBQcml2YXRlRGF0YS0+blZhbHVlQWdlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgUFdMX0NSRUFURVBBUkFNIGNwID0gR2V0Q3JlYXRlUGFyYW0oKTsKLSAgICAgIGNwLmhBdHRhY2hlZFduZCA9IChGWF9IV05EKW1fcFdpZGdldDsKLQotICAgICAgQ0ZGTF9Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0gbmV3IENGRkxfUHJpdmF0ZURhdGE7Ci0gICAgICBwUHJpdmF0ZURhdGEtPnBXaWRnZXQgPSBtX3BXaWRnZXQ7Ci0gICAgICBwUHJpdmF0ZURhdGEtPnBQYWdlVmlldyA9IHBQYWdlVmlldzsKLSAgICAgIHBQcml2YXRlRGF0YS0+bldpZGdldEFnZSA9IG1fcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwotICAgICAgcFByaXZhdGVEYXRhLT5uVmFsdWVBZ2UgPSAwOwotCi0gICAgICBjcC5wQXR0YWNoZWREYXRhID0gcFByaXZhdGVEYXRhOwotCi0gICAgICBwV25kID0gTmV3UERGV2luZG93KGNwLCBwUGFnZVZpZXcpOwotICAgICAgbV9NYXBzW3BQYWdlVmlld10gPSBwV25kOwotICAgIH0KLQotICAgIHJldHVybiBwV25kOwotfQotCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6RGVzdHJveVBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0gICAgYXV0byBpdCA9IG1fTWFwcy5maW5kKHBQYWdlVmlldyk7Ci0gICAgaWYgKGl0ID09IG1fTWFwcy5lbmQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ1BXTF9XbmQqIHBXbmQgPSBpdC0+c2Vjb25kOworQ0ZGTF9Gb3JtRmlsbGVyOjp+Q0ZGTF9Gb3JtRmlsbGVyKCkgeworICBmb3IgKGF1dG8mIGl0IDogbV9NYXBzKSB7CisgICAgQ1BXTF9XbmQqIHBXbmQgPSBpdC5zZWNvbmQ7CiAgICAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFduZC0+R2V0QXR0YWNoZWREYXRhKCk7CiAgICAgcFduZC0+RGVzdHJveSgpOwogICAgIGRlbGV0ZSBwV25kOwogICAgIGRlbGV0ZSBwRGF0YTsKLQotICAgIG1fTWFwcy5lcmFzZShpdCk7CisgIH0KKyAgbV9NYXBzLmNsZWFyKCk7CiB9CiAKLUNQREZfTWF0cml4IENGRkxfRm9ybUZpbGxlcjo6R2V0V2luZG93TWF0cml4KHZvaWQqIHBBdHRhY2hlZERhdGEpCi17Ci0gICAgaWYgKENGRkxfUHJpdmF0ZURhdGEqIHBQcml2YXRlRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwQXR0YWNoZWREYXRhKQotICAgIHsKLSAgICAgICAgaWYgKHBQcml2YXRlRGF0YS0+cFBhZ2VWaWV3KQotICAgICAgICB7Ci0gICAgICAgICAgICBDUERGX01hdHJpeCBtdFBhZ2VWaWV3OwotICAgICAgICAgICAgcFByaXZhdGVEYXRhLT5wUGFnZVZpZXctPkdldEN1cnJlbnRNYXRyaXgobXRQYWdlVmlldyk7Ci0gICAgICAgICAgICBDUERGX01hdHJpeCBtdCA9IEdldEN1ck1hdHJpeCgpOwotICAgICAgICAgICAgbXQuQ29uY2F0KG10UGFnZVZpZXcpOwordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlNldFdpbmRvd1JlY3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY1dpbmRvdykgeworICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICBwV25kLT5Nb3ZlKENQREZfUmVjdChyY1dpbmRvdyksIFRSVUUsIEZBTFNFKTsKKyAgfQorfQogCi0gICAgICAgICAgICByZXR1cm4gbXQ7Ci0gICAgICAgIH0KK0NQREZfUmVjdCBDRkZMX0Zvcm1GaWxsZXI6OkdldFdpbmRvd1JlY3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIHJldHVybiBwV25kLT5HZXRXaW5kb3dSZWN0KCk7CisgIH0KKworICByZXR1cm4gQ1BERl9SZWN0KDAsIDAsIDAsIDApOworfQorCitGWF9SRUNUIENGRkxfRm9ybUZpbGxlcjo6R2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworCisgIENQREZfUmVjdCByY0Fubm90ID0gbV9wV2lkZ2V0LT5HZXRSZWN0KCk7CisKKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgQ1BERl9SZWN0IHJjV2luZG93ID0gcFduZC0+R2V0V2luZG93UmVjdCgpOworICAgIHJjQW5ub3QgPSBQV0x0b0ZGTChyY1dpbmRvdyk7CisgIH0KKworICBDUERGX1JlY3QgcmNXaW4gPSByY0Fubm90OworCisgIENQREZfUmVjdCByY0ZvY3VzID0gR2V0Rm9jdXNCb3gocFBhZ2VWaWV3KTsKKyAgaWYgKCFyY0ZvY3VzLklzRW1wdHkoKSkKKyAgICByY1dpbi5VbmlvbihyY0ZvY3VzKTsKKworICBDUERGX1JlY3QgcmVjdCA9IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KHJjV2luLCAxKTsKKworICByZXR1cm4gcmVjdC5HZXRPdXR0ZXJSZWN0KCk7Cit9CisKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHsKKyAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKKworICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICBDUERGX01hdHJpeCBtdCA9IEdldEN1ck1hdHJpeCgpOworICAgIG10LkNvbmNhdCgqcFVzZXIyRGV2aWNlKTsKKyAgICBwV25kLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCAmbXQpOworICB9IGVsc2UgeworICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgICAgaWYgKENGRkxfSUZvcm1GaWxsZXI6OklzVmlzaWJsZShwV2lkZ2V0KSkKKyAgICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKKyAgfQorfQorCit2b2lkIENGRkxfRm9ybUZpbGxlcjo6T25EcmF3RGVhY3RpdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgeworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OworICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7Cit9CisKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CisKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorCit2b2lkIENGRkxfRm9ybUZpbGxlcjo6T25EZWxldGUoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorCit2b2lkIENGRkxfRm9ybUZpbGxlcjo6T25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorCit2b2lkIENGRkxfRm9ybUZpbGxlcjo6T25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBFbmRUaW1lcigpOworICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOworfQorCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKSB7CisgICAgbV9iVmFsaWQgPSBUUlVFOworICAgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKKyAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CisKKyAgICBpZiAoIXJlY3QuQ29udGFpbnMoKGludClwb2ludC54LCAoaW50KXBvaW50LnkpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIHBXbmQtPk9uTEJ1dHRvbkRvd24oV25kdG9QV0wocFBhZ2VWaWV3LCBwb2ludCksIG5GbGFncyk7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIEZYX1JFQ1QgcmNGRkwgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CisgICAgSW52YWxpZGF0ZVJlY3QocmNGRkwubGVmdCwgcmNGRkwudG9wLCByY0ZGTC5yaWdodCwgcmNGRkwuYm90dG9tKTsKKyAgICBwV25kLT5PbkxCdXR0b25VcChXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSwgbkZsYWdzKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIHBXbmQtPk9uTEJ1dHRvbkRibENsayhXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSwgbkZsYWdzKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKChtX3B0T2xkUG9zLnggIT0gcG9pbnQueCkgfHwgKG1fcHRPbGRQb3MueSAhPSBwb2ludC55KSkgeworICAgIG1fcHRPbGRQb3MgPSBwb2ludDsKKyAgfQorCisgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIHBXbmQtPk9uTW91c2VNb3ZlKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLCBuRmxhZ3MpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAoIUlzVmFsaWQoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpIHsKKyAgICByZXR1cm4gcFduZC0+T25Nb3VzZVdoZWVsKHpEZWx0YSwgV25kdG9QV0wocFBhZ2VWaWV3LCBwb2ludCksIG5GbGFncyk7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpIHsKKyAgICBwV25kLT5PblJCdXR0b25Eb3duKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLCBuRmxhZ3MpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICBwV25kLT5PblJCdXR0b25VcChXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSwgbkZsYWdzKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIHBXbmQtPk9uUkJ1dHRvbkRibENsayhXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSwgbkZsYWdzKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKSB7CisgIGlmIChJc1ZhbGlkKCkpIHsKKyAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldygpOworICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisKKyAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICAgIHJldHVybiBwV25kLT5PbktleURvd24obktleUNvZGUsIG5GbGFncyk7CiAgICAgfQotICAgIHJldHVybiBDUERGX01hdHJpeCgxLDAsMCwxLDAsMCk7CisgIH0KKworICByZXR1cm4gRkFMU0U7CiB9CiAKLUNQREZfTWF0cml4IENGRkxfRm9ybUZpbGxlcjo6R2V0Q3VyTWF0cml4KCkKLXsKLSAgICBDUERGX01hdHJpeCBtdDsKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncykgeworICBpZiAoSXNWYWxpZCgpKSB7CisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKKyAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0gICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKKyAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICAgIHJldHVybiBwV25kLT5PbkNoYXIobkNoYXIsIG5GbGFncyk7CisgICAgfQorICB9CiAKLSAgICBDUERGX1JlY3QgcmNEQSA7Ci0gICAgbV9wV2lkZ2V0LT5HZXRQREZBbm5vdCgpLT5HZXRSZWN0KHJjREEpOworICByZXR1cm4gRkFMU0U7Cit9CiAKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkRlU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChGQUxTRSk7Cit9CiAKLSAgICBzd2l0Y2ggKG1fcFdpZGdldC0+R2V0Um90YXRlKCkpCi0gICAgewordm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChGQUxTRSk7Cit9CisKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykgeworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OworICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gcFdpZGdldC0+R2V0UERGWEZBUGFnZSgpOworICBDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wQXBwLT5HZXRTREtEb2N1bWVudCgpOworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRG9jLT5HZXRQYWdlVmlldyhwUGFnZSk7CisgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQorICAgIHBXbmQtPlNldEZvY3VzKCk7CisKKyAgbV9iVmFsaWQgPSBUUlVFOworICBGWF9SRUNUIHJjUmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKKyAgSW52YWxpZGF0ZVJlY3QocmNSZWN0LmxlZnQsIHJjUmVjdC50b3AsIHJjUmVjdC5yaWdodCwgcmNSZWN0LmJvdHRvbSk7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKSB7CisgIGlmICghSXNWYWxpZCgpKQorICAgIHJldHVybiBUUlVFOworCisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CisgIENvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZyk7CisKKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIHBXbmQtPktpbGxGb2N1cygpOworCisgIHN3aXRjaCAobV9wV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSkgeworICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CisgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CisgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CisgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LCBGQUxTRSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzVmFsaWQoKSBjb25zdCB7CisgIHJldHVybiBtX2JWYWxpZDsKK30KKworUFdMX0NSRUFURVBBUkFNIENGRkxfRm9ybUZpbGxlcjo6R2V0Q3JlYXRlUGFyYW0oKSB7CisgIEFTU0VSVChtX3BBcHAgIT0gTlVMTCk7CisKKyAgUFdMX0NSRUFURVBBUkFNIGNwOworICBjcC5wUGFyZW50V25kID0gTlVMTDsKKyAgY3AucFByb3ZpZGVyID0gdGhpczsKKyAgY3AucmNSZWN0V25kID0gR2V0UERGV2luZG93UmVjdCgpOworCisgIEZYX0RXT1JEIGR3Q3JlYXRlRmxhZ3MgPSBQV1NfQk9SREVSIHwgUFdTX0JBQ0tHUk9VTkQgfCBQV1NfVklTSUJMRTsKKyAgRlhfRFdPUkQgZHdGaWVsZEZsYWcgPSBtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKKyAgaWYgKGR3RmllbGRGbGFnICYgRklFTERGTEFHX1JFQURPTkxZKSB7CisgICAgZHdDcmVhdGVGbGFncyB8PSBQV1NfUkVBRE9OTFk7CisgIH0KKworICBGWF9DT0xPUlJFRiBjb2xvcjsKKyAgaWYgKG1fcFdpZGdldC0+R2V0RmlsbENvbG9yKGNvbG9yKSkgeworICAgIGNwLnNCYWNrZ3JvdW5kQ29sb3IgPQorICAgICAgICBDUFdMX0NvbG9yKEdldFJlZChjb2xvciksIEdldEdyZWVuKGNvbG9yKSwgR2V0Qmx1ZShjb2xvcikpOworICB9CisKKyAgaWYgKG1fcFdpZGdldC0+R2V0Qm9yZGVyQ29sb3IoY29sb3IpKSB7CisgICAgY3Auc0JvcmRlckNvbG9yID0KKyAgICAgICAgQ1BXTF9Db2xvcihHZXRSZWQoY29sb3IpLCBHZXRHcmVlbihjb2xvciksIEdldEJsdWUoY29sb3IpKTsKKyAgfQorCisgIGNwLnNUZXh0Q29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKKworICBpZiAobV9wV2lkZ2V0LT5HZXRUZXh0Q29sb3IoY29sb3IpKSB7CisgICAgY3Auc1RleHRDb2xvciA9IENQV0xfQ29sb3IoR2V0UmVkKGNvbG9yKSwgR2V0R3JlZW4oY29sb3IpLCBHZXRCbHVlKGNvbG9yKSk7CisgIH0KKworICBjcC5mRm9udFNpemUgPSBtX3BXaWRnZXQtPkdldEZvbnRTaXplKCk7CisgIGNwLmR3Qm9yZGVyV2lkdGggPSBtX3BXaWRnZXQtPkdldEJvcmRlcldpZHRoKCk7CisKKyAgaW50IG5Cb3JkZXJTdHlsZSA9IG1fcFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKTsKKworICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgeworICAgIGNhc2UgQkJTX1NPTElEOgorICAgICAgY3AubkJvcmRlclN0eWxlID0gUEJTX1NPTElEOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfREFTSDoKKyAgICAgIGNwLm5Cb3JkZXJTdHlsZSA9IFBCU19EQVNIOworICAgICAgY3Auc0Rhc2ggPSBDUFdMX0Rhc2goMywgMywgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJCU19CRVZFTEVEOgorICAgICAgY3AubkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7CisgICAgICBjcC5kd0JvcmRlcldpZHRoICo9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJCU19JTlNFVDoKKyAgICAgIGNwLm5Cb3JkZXJTdHlsZSA9IFBCU19JTlNFVDsKKyAgICAgIGNwLmR3Qm9yZGVyV2lkdGggKj0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX1VOREVSTElORToKKyAgICAgIGNwLm5Cb3JkZXJTdHlsZSA9IFBCU19VTkRFUkxJTkVEOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoY3AuZkZvbnRTaXplIDw9IDApIHsKKyAgICBkd0NyZWF0ZUZsYWdzIHw9IFBXU19BVVRPRk9OVFNJWkU7CisgIH0KKworICBjcC5kd0ZsYWdzID0gZHdDcmVhdGVGbGFnczsKKyAgY3AucFN5c3RlbUhhbmRsZXIgPSBtX3BBcHAtPkdldFN5c0hhbmRsZXIoKTsKKyAgcmV0dXJuIGNwOworfQorCitDUFdMX1duZCogQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5ldykgeworICBBU1NFUlQocFBhZ2VWaWV3KTsKKworICBhdXRvIGl0ID0gbV9NYXBzLmZpbmQocFBhZ2VWaWV3KTsKKyAgY29uc3QgYm9vbCBmb3VuZCA9IGl0ICE9IG1fTWFwcy5lbmQoKTsKKyAgQ1BXTF9XbmQqIHBXbmQgPSBmb3VuZCA/IGl0LT5zZWNvbmQgOiBudWxscHRyOworICBpZiAoIWJOZXcpCisgICAgcmV0dXJuIHBXbmQ7CisKKyAgaWYgKGZvdW5kKSB7CisgICAgQ0ZGTF9Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBXbmQtPkdldEF0dGFjaGVkRGF0YSgpOworICAgIGlmIChwUHJpdmF0ZURhdGEtPm5XaWRnZXRBZ2UgIT0gbV9wV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpIHsKKyAgICAgIHJldHVybiBSZXNldFBERldpbmRvdygKKyAgICAgICAgICBwUGFnZVZpZXcsIG1fcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSA9PSBwUHJpdmF0ZURhdGEtPm5WYWx1ZUFnZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIFBXTF9DUkVBVEVQQVJBTSBjcCA9IEdldENyZWF0ZVBhcmFtKCk7CisgICAgY3AuaEF0dGFjaGVkV25kID0gKEZYX0hXTkQpbV9wV2lkZ2V0OworCisgICAgQ0ZGTF9Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0gbmV3IENGRkxfUHJpdmF0ZURhdGE7CisgICAgcFByaXZhdGVEYXRhLT5wV2lkZ2V0ID0gbV9wV2lkZ2V0OworICAgIHBQcml2YXRlRGF0YS0+cFBhZ2VWaWV3ID0gcFBhZ2VWaWV3OworICAgIHBQcml2YXRlRGF0YS0+bldpZGdldEFnZSA9IG1fcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOworICAgIHBQcml2YXRlRGF0YS0+blZhbHVlQWdlID0gMDsKKworICAgIGNwLnBBdHRhY2hlZERhdGEgPSBwUHJpdmF0ZURhdGE7CisKKyAgICBwV25kID0gTmV3UERGV2luZG93KGNwLCBwUGFnZVZpZXcpOworICAgIG1fTWFwc1twUGFnZVZpZXddID0gcFduZDsKKyAgfQorCisgIHJldHVybiBwV25kOworfQorCit2b2lkIENGRkxfRm9ybUZpbGxlcjo6RGVzdHJveVBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgYXV0byBpdCA9IG1fTWFwcy5maW5kKHBQYWdlVmlldyk7CisgIGlmIChpdCA9PSBtX01hcHMuZW5kKCkpCisgICAgcmV0dXJuOworCisgIENQV0xfV25kKiBwV25kID0gaXQtPnNlY29uZDsKKyAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFduZC0+R2V0QXR0YWNoZWREYXRhKCk7CisgIHBXbmQtPkRlc3Ryb3koKTsKKyAgZGVsZXRlIHBXbmQ7CisgIGRlbGV0ZSBwRGF0YTsKKworICBtX01hcHMuZXJhc2UoaXQpOworfQorCitDUERGX01hdHJpeCBDRkZMX0Zvcm1GaWxsZXI6OkdldFdpbmRvd01hdHJpeCh2b2lkKiBwQXR0YWNoZWREYXRhKSB7CisgIGlmIChDRkZMX1ByaXZhdGVEYXRhKiBwUHJpdmF0ZURhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcEF0dGFjaGVkRGF0YSkgeworICAgIGlmIChwUHJpdmF0ZURhdGEtPnBQYWdlVmlldykgeworICAgICAgQ1BERl9NYXRyaXggbXRQYWdlVmlldzsKKyAgICAgIHBQcml2YXRlRGF0YS0+cFBhZ2VWaWV3LT5HZXRDdXJyZW50TWF0cml4KG10UGFnZVZpZXcpOworICAgICAgQ1BERl9NYXRyaXggbXQgPSBHZXRDdXJNYXRyaXgoKTsKKyAgICAgIG10LkNvbmNhdChtdFBhZ2VWaWV3KTsKKworICAgICAgcmV0dXJuIG10OworICAgIH0KKyAgfQorICByZXR1cm4gQ1BERl9NYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCk7Cit9CisKK0NQREZfTWF0cml4IENGRkxfRm9ybUZpbGxlcjo6R2V0Q3VyTWF0cml4KCkgeworICBDUERGX01hdHJpeCBtdDsKKworICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOworCisgIENQREZfUmVjdCByY0RBOworICBtX3BXaWRnZXQtPkdldFBERkFubm90KCktPkdldFJlY3QocmNEQSk7CisKKyAgc3dpdGNoIChtX3BXaWRnZXQtPkdldFJvdGF0ZSgpKSB7CiAgICAgZGVmYXVsdDoKICAgICBjYXNlIDA6Ci0gICAgICAgIG10ID0gQ1BERl9NYXRyaXgoMSwwLDAsMSwwLDApOwotICAgICAgICBicmVhazsKKyAgICAgIG10ID0gQ1BERl9NYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCk7CisgICAgICBicmVhazsKICAgICBjYXNlIDkwOgotICAgICAgICBtdCA9IENQREZfTWF0cml4KDAsMSwtMSwwLHJjREEucmlnaHQgLSByY0RBLmxlZnQsMCk7Ci0gICAgICAgIGJyZWFrOworICAgICAgbXQgPSBDUERGX01hdHJpeCgwLCAxLCAtMSwgMCwgcmNEQS5yaWdodCAtIHJjREEubGVmdCwgMCk7CisgICAgICBicmVhazsKICAgICBjYXNlIDE4MDoKLSAgICAgICAgbXQgPSBDUERGX01hdHJpeCgtMSwwLDAsLTEscmNEQS5yaWdodCAtIHJjREEubGVmdCxyY0RBLnRvcCAtIHJjREEuYm90dG9tKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBtdCA9IENQREZfTWF0cml4KC0xLCAwLCAwLCAtMSwgcmNEQS5yaWdodCAtIHJjREEubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgcmNEQS50b3AgLSByY0RBLmJvdHRvbSk7CisgICAgICBicmVhazsKICAgICBjYXNlIDI3MDoKLSAgICAgICAgbXQgPSBDUERGX01hdHJpeCgwLC0xLDEsMCwwLHJjREEudG9wIC0gcmNEQS5ib3R0b20pOwotICAgICAgICBicmVhazsKKyAgICAgIG10ID0gQ1BERl9NYXRyaXgoMCwgLTEsIDEsIDAsIDAsIHJjREEudG9wIC0gcmNEQS5ib3R0b20pOworICAgICAgYnJlYWs7CisgIH0KKyAgbXQuZSArPSByY0RBLmxlZnQ7CisgIG10LmYgKz0gcmNEQS5ib3R0b207CisKKyAgcmV0dXJuIG10OworfQorCitDRlhfV2lkZVN0cmluZyBDRkZMX0Zvcm1GaWxsZXI6OkxvYWRQb3B1cE1lbnVTdHJpbmcoaW50IG5JbmRleCkgeworICBBU1NFUlQobV9wQXBwICE9IE5VTEwpOworCisgIHJldHVybiBMIiI7Cit9CisKK0NQREZfUmVjdCBDRkZMX0Zvcm1GaWxsZXI6OkdldFBERldpbmRvd1JlY3QoKSBjb25zdCB7CisgIENQREZfUmVjdCByZWN0QW5ub3Q7CisgIG1fcFdpZGdldC0+R2V0UERGQW5ub3QoKS0+R2V0UmVjdChyZWN0QW5ub3QpOworCisgIEZYX0ZMT0FUIGZXaWR0aCA9IHJlY3RBbm5vdC5yaWdodCAtIHJlY3RBbm5vdC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gcmVjdEFubm90LnRvcCAtIHJlY3RBbm5vdC5ib3R0b207CisgIGlmICgobV9wV2lkZ2V0LT5HZXRSb3RhdGUoKSAvIDkwKSAmIDB4MDEpCisgICAgcmV0dXJuIENQREZfUmVjdCgwLCAwLCBmSGVpZ2h0LCBmV2lkdGgpOworCisgIHJldHVybiBDUERGX1JlY3QoMCwgMCwgZldpZHRoLCBmSGVpZ2h0KTsKK30KKworQ1BERlNES19QYWdlVmlldyogQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRDdXJQYWdlVmlldygpIHsKKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IG1fcEFubm90LT5HZXRQREZYRkFQYWdlKCk7CisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BBcHAtPkdldFNES0RvY3VtZW50KCk7CisgIGlmICghcFNES0RvYykKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHBTREtEb2MtPkdldFBhZ2VWaWV3KHBQYWdlKTsKK30KKworQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6R2V0Rm9jdXNCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIENQREZfUmVjdCByY0ZvY3VzID0gRkZMdG9XbmQocFBhZ2VWaWV3LCBQV0x0b0ZGTChwV25kLT5HZXRGb2N1c1JlY3QoKSkpOworICAgIENQREZfUmVjdCByY1BhZ2UgPSBwUGFnZVZpZXctPkdldFBERlBhZ2UoKS0+R2V0UGFnZUJCb3goKTsKKyAgICBpZiAocmNQYWdlLkNvbnRhaW5zKHJjRm9jdXMpKQorICAgICAgcmV0dXJuIHJjRm9jdXM7CisgIH0KKyAgcmV0dXJuIENQREZfUmVjdCgwLCAwLCAwLCAwKTsKK30KKworQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6RkZMdG9QV0woY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7CisgIENQREZfTWF0cml4IG10OworICBtdC5TZXRSZXZlcnNlKEdldEN1ck1hdHJpeCgpKTsKKworICBDUERGX1JlY3QgdGVtcCA9IHJlY3Q7CisgIG10LlRyYW5zZm9ybVJlY3QodGVtcCk7CisKKyAgcmV0dXJuIHRlbXA7Cit9CisKK0NQREZfUmVjdCBDRkZMX0Zvcm1GaWxsZXI6OlBXTHRvRkZMKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICBDUERGX01hdHJpeCBtdCA9IEdldEN1ck1hdHJpeCgpOworCisgIENQREZfUmVjdCB0ZW1wID0gcmVjdDsKKyAgbXQuVHJhbnNmb3JtUmVjdCh0ZW1wKTsKKworICByZXR1cm4gdGVtcDsKK30KKworQ1BERl9Qb2ludCBDRkZMX0Zvcm1GaWxsZXI6OkZGTHRvUFdMKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIENQREZfTWF0cml4IG10OworICBtdC5TZXRSZXZlcnNlKEdldEN1ck1hdHJpeCgpKTsKKworICBDUERGX1BvaW50IHB0ID0gcG9pbnQ7CisgIG10LlRyYW5zZm9ybShwdC54LCBwdC55KTsKKworICByZXR1cm4gcHQ7Cit9CisKK0NQREZfUG9pbnQgQ0ZGTF9Gb3JtRmlsbGVyOjpQV0x0b0ZGTChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBDUERGX01hdHJpeCBtdCA9IEdldEN1ck1hdHJpeCgpOworCisgIENQREZfUG9pbnQgcHQgPSBwb2ludDsKKyAgbXQuVHJhbnNmb3JtKHB0LngsIHB0LnkpOworCisgIHJldHVybiBwdDsKK30KKworQ1BERl9Qb2ludCBDRkZMX0Zvcm1GaWxsZXI6OlduZHRvUFdMKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdCkgeworICByZXR1cm4gRkZMdG9QV0wocHQpOworfQorCitDUERGX1JlY3QgQ0ZGTF9Gb3JtRmlsbGVyOjpGRkx0b1duZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsKKyAgcmV0dXJuIHJlY3Q7Cit9CisKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpDb21taXREYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWcpIHsKKyAgaWYgKElzRGF0YUNoYW5nZWQocFBhZ2VWaWV3KSkgeworICAgIEZYX0JPT0wgYlJDID0gVFJVRTsKKyAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gbV9wQXBwLT5HZXRJRm9ybUZpbGxlcigpOworICAgIHBJRm9ybUZpbGxlci0+T25LZXlTdHJva2VDb21taXQobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJSQywgYkV4aXQsIG5GbGFnKTsKKyAgICBpZiAoYkV4aXQpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBpZiAoIWJSQykgeworICAgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgbXQuZSArPSByY0RBLmxlZnQ7Ci0gICAgbXQuZiArPSByY0RBLmJvdHRvbTsKIAotICAgIHJldHVybiBtdDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0ZGTF9Gb3JtRmlsbGVyOjpMb2FkUG9wdXBNZW51U3RyaW5nKGludCBuSW5kZXgpCi17Ci0gICAgQVNTRVJUKG1fcEFwcCAhPSBOVUxMKTsKLQotICAgIHJldHVybiBMIiI7Ci19Ci0KLUNQREZfUmVjdCBDRkZMX0Zvcm1GaWxsZXI6OkdldFBERldpbmRvd1JlY3QoKSBjb25zdAotewotICAgIENQREZfUmVjdCByZWN0QW5ub3Q7Ci0gICAgbV9wV2lkZ2V0LT5HZXRQREZBbm5vdCgpLT5HZXRSZWN0KHJlY3RBbm5vdCk7Ci0KLSAgICBGWF9GTE9BVCBmV2lkdGggPSByZWN0QW5ub3QucmlnaHQgLSByZWN0QW5ub3QubGVmdDsKLSAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gcmVjdEFubm90LnRvcCAtIHJlY3RBbm5vdC5ib3R0b207Ci0gICAgaWYgKChtX3BXaWRnZXQtPkdldFJvdGF0ZSgpIC8gOTApICYgMHgwMSkKLSAgICAgICAgcmV0dXJuIENQREZfUmVjdCgwLCAwLCBmSGVpZ2h0LCBmV2lkdGgpOwotCi0gICAgcmV0dXJuIENQREZfUmVjdCgwLCAwLCBmV2lkdGgsIGZIZWlnaHQpOwotfQotCi1DUERGU0RLX1BhZ2VWaWV3KiBDRkZMX0Zvcm1GaWxsZXI6OkdldEN1clBhZ2VWaWV3KCkKLXsKLSAgICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gbV9wQW5ub3QtPkdldFBERlhGQVBhZ2UoKTsKLSAgICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gbV9wQXBwLT5HZXRTREtEb2N1bWVudCgpOwotICAgIGlmICghcFNES0RvYykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHBTREtEb2MtPkdldFBhZ2VWaWV3KHBQYWdlKTsKLX0KLQotQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6R2V0Rm9jdXNCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIENQREZfUmVjdCByY0ZvY3VzID0gRkZMdG9XbmQocFBhZ2VWaWV3LCBQV0x0b0ZGTChwV25kLT5HZXRGb2N1c1JlY3QoKSkpOwotICAgICAgICBDUERGX1JlY3QgcmNQYWdlID0gcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCktPkdldFBhZ2VCQm94KCk7Ci0gICAgICAgIGlmIChyY1BhZ2UuQ29udGFpbnMocmNGb2N1cykpCi0gICAgICAgICAgICByZXR1cm4gcmNGb2N1czsKKyAgICBwSUZvcm1GaWxsZXItPk9uVmFsaWRhdGUobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJSQywgYkV4aXQsIG5GbGFnKTsKKyAgICBpZiAoYkV4aXQpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBpZiAoIWJSQykgeworICAgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIENQREZfUmVjdCgwLDAsMCwwKTsKKworICAgIFNhdmVEYXRhKHBQYWdlVmlldyk7CisgICAgcElGb3JtRmlsbGVyLT5PbkNhbGN1bGF0ZShtX3BXaWRnZXQsIHBQYWdlVmlldywgYkV4aXQsIG5GbGFnKTsKKyAgICBpZiAoYkV4aXQpCisgICAgICByZXR1cm4gVFJVRTsKKworICAgIHBJRm9ybUZpbGxlci0+T25Gb3JtYXQobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJFeGl0LCBuRmxhZyk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUNQREZfUmVjdCBDRkZMX0Zvcm1GaWxsZXI6OkZGTHRvUFdMKGNvbnN0IENQREZfUmVjdCYgcmVjdCkKLXsKLSAgICBDUERGX01hdHJpeCBtdDsKLSAgICBtdC5TZXRSZXZlcnNlKEdldEN1ck1hdHJpeCgpKTsKLQotICAgIENQREZfUmVjdCB0ZW1wID0gcmVjdDsKLSAgICBtdC5UcmFuc2Zvcm1SZWN0KHRlbXApOwotCi0gICAgcmV0dXJuIHRlbXA7CitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1DUERGX1JlY3QgQ0ZGTF9Gb3JtRmlsbGVyOjpQV0x0b0ZGTChjb25zdCBDUERGX1JlY3QmIHJlY3QpCi17Ci0gICAgQ1BERl9NYXRyaXggbXQgPSBHZXRDdXJNYXRyaXgoKTsKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHt9CiAKLSAgICBDUERGX1JlY3QgdGVtcCA9IHJlY3Q7Ci0gICAgbXQuVHJhbnNmb3JtUmVjdCh0ZW1wKTsKLQotICAgIHJldHVybiB0ZW1wOworRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzRmllbGRGdWxsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLUNQREZfUG9pbnQgQ0ZGTF9Gb3JtRmlsbGVyOjpGRkx0b1BXTChjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBDUERGX01hdHJpeCBtdDsKLSAgICBtdC5TZXRSZXZlcnNlKEdldEN1ck1hdHJpeCgpKTsKLQotICAgIENQREZfUG9pbnQgcHQgPSBwb2ludDsKLSAgICBtdC5UcmFuc2Zvcm0ocHQueCxwdC55KTsKLQotICAgIHJldHVybiBwdDsKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTZXRDaGFuZ2VNYXJrKCkgeworICBtX3BBcHAtPkZGSV9PbkNoYW5nZSgpOwogfQogCi1DUERGX1BvaW50IENGRkxfRm9ybUZpbGxlcjo6UFdMdG9GRkwoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotewotICAgIENQREZfTWF0cml4IG10ID0gR2V0Q3VyTWF0cml4KCk7Ci0KLSAgICBDUERGX1BvaW50IHB0ID0gcG9pbnQ7Ci0gICAgbXQuVHJhbnNmb3JtKHB0LngscHQueSk7Ci0KLSAgICByZXR1cm4gcHQ7Cit2b2lkIENGRkxfRm9ybUZpbGxlcjo6R2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGZhKSB7CisgIGZhLnNWYWx1ZSA9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKIH0KIAotQ1BERl9Qb2ludCBDRkZMX0Zvcm1GaWxsZXI6OlduZHRvUFdMKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ1BERl9Qb2ludCYgcHQpCi17Ci0gICAgcmV0dXJuIEZGTHRvUFdMKHB0KTsKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpIHt9CisKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6RkZMdG9XbmQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDUERGX1JlY3QgJiByZWN0KQotewotICAgIHJldHVybiByZWN0Owordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHt9CisKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7fQorCitDUFdMX1duZCogQ0ZGTF9Gb3JtRmlsbGVyOjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXN0b3JlVmFsdWUpIHsKKyAgcmV0dXJuIEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OkNvbW1pdERhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9VSU5UIG5GbGFnKQotewotICAgIGlmIChJc0RhdGFDaGFuZ2VkKHBQYWdlVmlldykpCi0gICAgewotICAgICAgICBGWF9CT09MIGJSQyA9IFRSVUU7Ci0gICAgICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLSAgICAgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gbV9wQXBwLT5HZXRJRm9ybUZpbGxlcigpOwotICAgICAgICBwSUZvcm1GaWxsZXItPk9uS2V5U3Ryb2tlQ29tbWl0KG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiUkMsIGJFeGl0LCBuRmxhZyk7Ci0gICAgICAgIGlmIChiRXhpdCkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICBpZiAoIWJSQykKLSAgICAgICAgewotICAgICAgICAgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlRpbWVyUHJvYygpIHt9CiAKLSAgICAgICAgcElGb3JtRmlsbGVyLT5PblZhbGlkYXRlKG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiUkMsIGJFeGl0LCBuRmxhZyk7Ci0gICAgICAgIGlmIChiRXhpdCkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICBpZiAoIWJSQykKLSAgICAgICAgewotICAgICAgICAgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIFNhdmVEYXRhKHBQYWdlVmlldyk7Ci0gICAgICAgIHBJRm9ybUZpbGxlci0+T25DYWxjdWxhdGUobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJFeGl0LG5GbGFnKTsKLSAgICAgICAgaWYgKGJFeGl0KQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICAgICAgcElGb3JtRmlsbGVyLT5PbkZvcm1hdChtX3BXaWRnZXQsIHBQYWdlVmlldywgYkV4aXQsbkZsYWcpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKK0lGWF9TeXN0ZW1IYW5kbGVyKiBDRkZMX0Zvcm1GaWxsZXI6OkdldFN5c3RlbUhhbmRsZXIoKSBjb25zdCB7CisgIHJldHVybiBtX3BBcHAtPkdldFN5c0hhbmRsZXIoKTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotICAgIHJldHVybiBGQUxTRTsKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleVN0cm9rZShGWF9CT09MIGJLZXlEb3duKSB7fQorCit2b2lkIENGRkxfRm9ybUZpbGxlcjo6RXNjYXBlRmlsbGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVzdHJveVBERldpbmRvdykgeworICBtX2JWYWxpZCA9IEZBTFNFOworCisgIEZYX1JFQ1QgcmNSZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBtX3BXaWRnZXQpOworICBJbnZhbGlkYXRlUmVjdChyY1JlY3QubGVmdCwgcmNSZWN0LnRvcCwgcmNSZWN0LnJpZ2h0LCByY1JlY3QuYm90dG9tKTsKKworICBpZiAoYkRlc3Ryb3lQREZXaW5kb3cpCisgICAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwogfQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQoteworRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OkNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzRmllbGRGdWxsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLSAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTZXRDaGFuZ2VNYXJrKCkKLXsKLSAgICBtX3BBcHAtPkZGSV9PbkNoYW5nZSgpOworRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OkNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiYgZmEpCi17Ci0gICAgZmEuc1ZhbHVlID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwotfQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkRvQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHt9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSkKLXsKLX0KK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpEb0N1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHt9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpCi17Ci0gICAgcmV0dXJuIEZBTFNFOwotfQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkRvUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7fQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6U2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLX0KLQotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci19Ci0KLUNQV0xfV25kKiAgQ0ZGTF9Gb3JtRmlsbGVyOjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkKLXsKLSAgICByZXR1cm4gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOwotfQotCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6VGltZXJQcm9jKCkKLXsKLQotfQotCi1JRlhfU3lzdGVtSGFuZGxlciogQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRTeXN0ZW1IYW5kbGVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCk7Ci19Ci0KLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleVN0cm9rZShGWF9CT09MIGJLZXlEb3duKQotewotfQotCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6RXNjYXBlRmlsbGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiRGVzdHJveVBERldpbmRvdykKLXsKLSAgICBtX2JWYWxpZCA9IEZBTFNFOwotCi0gICAgRlhfUkVDVCByY1JlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIG1fcFdpZGdldCk7Ci0gICAgSW52YWxpZGF0ZVJlY3QocmNSZWN0LmxlZnQsIHJjUmVjdC50b3AsIHJjUmVjdC5yaWdodCwgcmNSZWN0LmJvdHRvbSk7Ci0KLSAgICBpZihiRGVzdHJveVBERldpbmRvdykKLSAgICAgICAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwotfQotCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6Q2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6RG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLX0KLQotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkRvQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLX0KLQotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkRvUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotfQotCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6SW52YWxpZGF0ZVJlY3QoZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSkKLXsKLSAgICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gbV9wV2lkZ2V0LT5HZXRQREZYRkFQYWdlKCk7Ci0gICAgbV9wQXBwLT5GRklfSW52YWxpZGF0ZShwUGFnZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpJbnZhbGlkYXRlUmVjdChkb3VibGUgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYm90dG9tKSB7CisgIENQREZYRkFfUGFnZSogcFBhZ2UgPSBtX3BXaWRnZXQtPkdldFBERlhGQVBhZ2UoKTsKKyAgbV9wQXBwLT5GRklfSW52YWxpZGF0ZShwUGFnZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRkZMX0J1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNGRkxfQnV0dG9uOjpDRkZMX0J1dHRvbihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KSA6Ci0gICAgQ0ZGTF9Gb3JtRmlsbGVyKHBBcHAsIHBXaWRnZXQpLAotICAgIG1fYk1vdXNlSW4oRkFMU0UpLAotICAgIG1fYk1vdXNlRG93bihGQUxTRSkKLXsKK0NGRkxfQnV0dG9uOjpDRkZMX0J1dHRvbihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KQorICAgIDogQ0ZGTF9Gb3JtRmlsbGVyKHBBcHAsIHBXaWRnZXQpLCBtX2JNb3VzZUluKEZBTFNFKSwgbV9iTW91c2VEb3duKEZBTFNFKSB7fQorCitDRkZMX0J1dHRvbjo6fkNGRkxfQnV0dG9uKCkge30KKwordm9pZCBDRkZMX0J1dHRvbjo6T25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgbV9iTW91c2VJbiA9IFRSVUU7CisgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKKyAgSW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwogfQogCi1DRkZMX0J1dHRvbjo6fkNGRkxfQnV0dG9uKCkKLXsKK3ZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBtX2JNb3VzZUluID0gRkFMU0U7CisKKyAgRlhfUkVDVCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOworICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CisgIEVuZFRpbWVyKCk7CisgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiB9CiAKLXZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBtX2JNb3VzZUluID0gVFJVRTsKLSAgICBGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKLSAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CitGWF9CT09MIENGRkxfQnV0dG9uOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQ1BERl9SZWN0IHJjQW5ub3QgPSBwQW5ub3QtPkdldFJlY3QoKTsKKyAgaWYgKCFyY0Fubm90LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBtX2JNb3VzZURvd24gPSBUUlVFOworICBtX2JWYWxpZCA9IFRSVUU7CisgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKKyAgSW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDRkZMX0J1dHRvbjo6T25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgbV9iTW91c2VJbiA9IEZBTFNFOworRlhfQk9PTCBDRkZMX0J1dHRvbjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBDUERGX1JlY3QgcmNBbm5vdCA9IHBBbm5vdC0+R2V0UmVjdCgpOworICBpZiAoIXJjQW5ub3QuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgRlhfUkVDVCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LHBBbm5vdCk7Ci0gICAgSW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwotICAgIEVuZFRpbWVyKCk7Ci0gICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKKyAgbV9iTW91c2VEb3duID0gRkFMU0U7CisgIG1fcFdpZGdldC0+R2V0UERGUGFnZSgpOworCisgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKKyAgSW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDRkZMX0J1dHRvbjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIENQREZfUmVjdCByY0Fubm90ID0gcEFubm90LT5HZXRSZWN0KCk7Ci0gICAgaWYoIXJjQW5ub3QuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ0ZGTF9CdXR0b246Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKG1fcEFwcCAhPSBOVUxMKTsKIAotICAgIG1fYk1vdXNlRG93biA9IFRSVUU7Ci0gICAgbV9iVmFsaWQgPSBUUlVFOwotICAgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKLSAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIENQREZfUmVjdCByY0Fubm90ID0gcEFubm90LT5HZXRSZWN0KCk7Ci0gICAgaWYoIXJjQW5ub3QuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKK3ZvaWQgQ0ZGTF9CdXR0b246Ok9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7CisgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgIENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gcFdpZGdldC0+R2V0Rm9ybUNvbnRyb2woKTsKKyAgQ1BERl9Gb3JtQ29udHJvbDo6SGlnaGxpZ2h0aW5nTW9kZSBlSE0gPSBwQ3RybC0+R2V0SGlnaGxpZ2h0aW5nTW9kZSgpOwogCi0gICAgbV9iTW91c2VEb3duID0gRkFMU0U7Ci0gICAgbV9wV2lkZ2V0LT5HZXRQREZQYWdlKCk7Ci0KLQotICAgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKLSAgICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9CdXR0b246Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgQVNTRVJUKG1fcEFwcCAhPSBOVUxMKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIENGRkxfQnV0dG9uOjpPbkRyYXcoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKQotewotICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0gICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLSAgICBDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IHBXaWRnZXQtPkdldEZvcm1Db250cm9sKCk7Ci0gICAgQ1BERl9Gb3JtQ29udHJvbDo6SGlnaGxpZ2h0aW5nTW9kZSBlSE0gPSBwQ3RybC0+R2V0SGlnaGxpZ2h0aW5nTW9kZSgpOwotCi0gICAgaWYgKGVITSA9PSBDUERGX0Zvcm1Db250cm9sOjpQdXNoKQotICAgIHsKLSAgICAgICAgaWYgKG1fYk1vdXNlRG93bikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBXaWRnZXQtPklzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkRvd24pKQotICAgICAgICAgICAgICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6RG93biwgTlVMTCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1fYk1vdXNlSW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5Jc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpSb2xsb3ZlcikpCi0gICAgICAgICAgICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpSb2xsb3ZlciwgTlVMTCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwotICAgICAgICB9CisgIGlmIChlSE0gPT0gQ1BERl9Gb3JtQ29udHJvbDo6UHVzaCkgeworICAgIGlmIChtX2JNb3VzZURvd24pIHsKKyAgICAgIGlmIChwV2lkZ2V0LT5Jc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpEb3duKSkKKyAgICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpEb3duLCBOVUxMKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0gZWxzZSBpZiAobV9iTW91c2VJbikgeworICAgICAgaWYgKHBXaWRnZXQtPklzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OlJvbGxvdmVyKSkKKyAgICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpSb2xsb3ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBlbHNlCisgICAgICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwogICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKKyAgfSBlbHNlCisgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwogfQogCi0KLXZvaWQgQ0ZGTF9CdXR0b246Ok9uRHJhd0RlYWN0aXZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpCi17Ci0gICAgT25EcmF3KHBQYWdlVmlldywgcEFubm90LCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIGR3RmxhZ3MpOwordm9pZCBDRkZMX0J1dHRvbjo6T25EcmF3RGVhY3RpdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7CisgIE9uRHJhdyhwUGFnZVZpZXcsIHBBbm5vdCwgcERldmljZSwgcFVzZXIyRGV2aWNlLCBkd0ZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmNwcAppbmRleCBiYjkzMTZkLi4yNzgxNjllIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuY3BwCkBAIC0xMywxMjU0ICsxMywxMTg5IEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmgiCiAKLSNkZWZpbmUgRkZMX01BWExJU1RCT1hIRUlHSFQgICAgICAgIDE0MC4wZgorI2RlZmluZSBGRkxfTUFYTElTVEJPWEhFSUdIVCAxNDAuMGYKIAogLy8gSEhPT0sgQ0ZGTF9JRm9ybUZpbGxlcjo6bV9ob29rU2hlZXQgPSBOVUxMOwogLy8gTVNHIENGRkxfSUZvcm1GaWxsZXI6OmdfTXNnOwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRkZMX0lGb3JtRmlsbGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRkZMX0lGb3JtRmlsbGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAotQ0ZGTF9JRm9ybUZpbGxlcjo6Q0ZGTF9JRm9ybUZpbGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKSA6Ci0gICAgbV9wQXBwKHBBcHApLAotICAgIG1fYk5vdGlmeWluZyhGQUxTRSkKLXsKK0NGRkxfSUZvcm1GaWxsZXI6OkNGRkxfSUZvcm1GaWxsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkKKyAgICA6IG1fcEFwcChwQXBwKSwgbV9iTm90aWZ5aW5nKEZBTFNFKSB7fQorCitDRkZMX0lGb3JtRmlsbGVyOjp+Q0ZGTF9JRm9ybUZpbGxlcigpIHsKKyAgZm9yIChhdXRvJiBpdCA6IG1fTWFwcykKKyAgICBkZWxldGUgaXQuc2Vjb25kOworICBtX01hcHMuY2xlYXIoKTsKIH0KIAotQ0ZGTF9JRm9ybUZpbGxlcjo6fkNGRkxfSUZvcm1GaWxsZXIoKQotewotICAgIGZvciAoYXV0byYgaXQgOiBtX01hcHMpCi0gICAgICAgIGRlbGV0ZSBpdC5zZWNvbmQ7Ci0gICAgbV9NYXBzLmNsZWFyKCk7CitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6OkFubm90X0hpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BvaW50IHBvaW50KSB7CisgIENQREZfUmVjdCByYyA9IHBBbm5vdC0+R2V0UmVjdCgpOworICBpZiAocmMuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSkpCisgICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpBbm5vdF9IaXRUZXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxDUERGU0RLX0Fubm90KiBwQW5ub3QsIENQREZfUG9pbnQgcG9pbnQpCi17Ci0gICAgQ1BERl9SZWN0IHJjID0gcEFubm90LT5HZXRSZWN0KCk7Ci0gICAgaWYocmMuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSkpCitGWF9SRUNUIENGRkxfSUZvcm1GaWxsZXI6OkdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKKyAgICByZXR1cm4gcEZvcm1GaWxsZXItPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKKworICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOworCisgIENQREZfQW5ub3QqIHBQREZBbm5vdCA9IHBBbm5vdC0+R2V0UERGQW5ub3QoKTsKKyAgQ1BERl9SZWN0IHJjQW5ub3Q7CisgIHBQREZBbm5vdC0+R2V0UmVjdChyY0Fubm90KTsKKworICBDUERGX1JlY3QgcmNXaW4gPSBDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChyY0Fubm90LCAxKTsKKyAgcmV0dXJuIHJjV2luLkdldE91dHRlclJlY3QoKTsKK30KKwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypIREMgaERDLCovIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb25zdCBDUmVjdCYgcmNXaW5kb3csKi8gRlhfRFdPUkQgZHdGbGFncykgeworICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OworCisgIGlmIChJc1Zpc2libGUocFdpZGdldCkpIHsKKyAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpIHsKKyAgICAgIGlmIChwRm9ybUZpbGxlci0+SXNWYWxpZCgpKSB7CisgICAgICAgIHBGb3JtRmlsbGVyLT5PbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7CisgICAgICAgIHBBbm5vdC0+R2V0UERGUGFnZSgpOworCisgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcEFwcC0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgICAgICAgaWYgKHBEb2N1bWVudC0+R2V0Rm9jdXNBbm5vdCgpID09IHBBbm5vdCkgeworICAgICAgICAgIENQREZfUmVjdCByY0ZvY3VzID0gcEZvcm1GaWxsZXItPkdldEZvY3VzQm94KHBQYWdlVmlldyk7CisgICAgICAgICAgaWYgKCFyY0ZvY3VzLklzRW1wdHkoKSkgeworICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgICAgICAgICAgICBwYXRoLlNldFBvaW50Q291bnQoNSk7CisgICAgICAgICAgICBwYXRoLlNldFBvaW50KDAsIHJjRm9jdXMubGVmdCwgcmNGb2N1cy50b3AsIEZYUFRfTU9WRVRPKTsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMSwgcmNGb2N1cy5sZWZ0LCByY0ZvY3VzLmJvdHRvbSwgRlhQVF9MSU5FVE8pOworICAgICAgICAgICAgcGF0aC5TZXRQb2ludCgyLCByY0ZvY3VzLnJpZ2h0LCByY0ZvY3VzLmJvdHRvbSwgRlhQVF9MSU5FVE8pOworICAgICAgICAgICAgcGF0aC5TZXRQb2ludCgzLCByY0ZvY3VzLnJpZ2h0LCByY0ZvY3VzLnRvcCwgRlhQVF9MSU5FVE8pOworICAgICAgICAgICAgcGF0aC5TZXRQb2ludCg0LCByY0ZvY3VzLmxlZnQsIHJjRm9jdXMudG9wLCBGWFBUX0xJTkVUTyk7CisKKyAgICAgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgICAgICAgICAgICBnc2QuU2V0RGFzaENvdW50KDEpOworICAgICAgICAgICAgZ3NkLm1fRGFzaEFycmF5WzBdID0gMS4wZjsKKyAgICAgICAgICAgIGdzZC5tX0Rhc2hQaGFzZSA9IDA7CisgICAgICAgICAgICBnc2QubV9MaW5lV2lkdGggPSAxLjBmOworICAgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoMjU1LCAwLCAwLCAwKSwgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgICBwRm9ybUZpbGxlci0+T25EcmF3RGVhY3RpdmUocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzKTsKKyAgICBlbHNlCisgICAgICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7CisKKyAgICBpZiAoIUlzUmVhZE9ubHkocFdpZGdldCkgJiYgSXNGaWxsaW5nQWxsb3dlZChwV2lkZ2V0KSkKKyAgICAgIHBXaWRnZXQtPkRyYXdTaGFkb3cocERldmljZSwgcFBhZ2VWaWV3KTsKKyAgfQorfQorCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpIHsKKyAgICBwRm9ybUZpbGxlci0+T25DcmVhdGUocEFubm90KTsKKyAgfQorfQorCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgcEZvcm1GaWxsZXItPk9uTG9hZChwQW5ub3QpOworICB9Cit9CisKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25EZWxldGUoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkgeworICAgIHBGb3JtRmlsbGVyLT5PbkRlbGV0ZShwQW5ub3QpOworICB9CisKKyAgVW5SZWdpc3RlckZvcm1GaWxsZXIocEFubm90KTsKK30KKwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZykgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOworCisgIGlmICghbV9iTm90aWZ5aW5nKSB7CisgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKKyAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckVudGVyKSkgeworICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKworICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CisKKyAgICAgIHBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKKworICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpDdXJzb3JFbnRlciwgZmEsIHBQYWdlVmlldyk7CisgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKworICAgICAgLy8gaWYgKCAhSXNWYWxpZEFubm90KHBQYWdlVmlldywgcEFubm90KSApIHJldHVybjsKKworICAgICAgaWYgKHBXaWRnZXQtPklzQXBwTW9kaWZpZWQoKSkgeworICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKSB7CisgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSA9PSBuVmFsdWVBZ2UpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpIHsKKyAgICBwRm9ybUZpbGxlci0+T25Nb3VzZUVudGVyKHBQYWdlVmlldywgcEFubm90KTsKKyAgfQorfQorCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFnKSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CisKKyAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OworICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6Q3Vyc29yRXhpdCkpIHsKKyAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CisgICAgICBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKyAgICAgIHBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKKworICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisKKyAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckV4aXQsIGZhLCBwUGFnZVZpZXcpOworICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisKKyAgICAgIC8vIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcEFubm90KSkgcmV0dXJuOworCisgICAgICBpZiAocFdpZGdldC0+SXNBcHBNb2RpZmllZCgpKSB7CisgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpIHsKKyAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpIHsKKyAgICBwRm9ybUZpbGxlci0+T25Nb3VzZUV4aXQocFBhZ2VWaWV3LCBwQW5ub3QpOworICB9Cit9CisKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CisKKyAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OworICAgIGlmIChBbm5vdF9IaXRUZXN0KHBQYWdlVmlldywgcEFubm90LCBwb2ludCkgJiYKKyAgICAgICAgcFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvbkRvd24pKSB7CisgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOworICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CisgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CisKKyAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisKKyAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKKyAgICAgIGZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWdzKTsKKyAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFncyk7CisgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpCdXR0b25Eb3duLCBmYSwgcFBhZ2VWaWV3KTsKKyAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworCisgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBBbm5vdCkpCiAgICAgICAgIHJldHVybiBUUlVFOwotICAgIHJldHVybiBGQUxTRTsKLX0KIAotRlhfUkVDVCBDRkZMX0lGb3JtRmlsbGVyOjpHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCi0gICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOwotCi0gICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLQotICAgIENQREZfQW5ub3QqIHBQREZBbm5vdCA9IHBBbm5vdC0+R2V0UERGQW5ub3QoKTsKLSAgICBDUERGX1JlY3QgcmNBbm5vdDsKLSAgICBwUERGQW5ub3QtPkdldFJlY3QocmNBbm5vdCk7Ci0KLSAgICBDUERGX1JlY3QgcmNXaW4gPSBDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChyY0Fubm90LCAxKTsKLSAgICByZXR1cm4gcmNXaW4uR2V0T3V0dGVyUmVjdCgpOwotfQotCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIC8qSERDIGhEQywqLyBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgLypjb25zdCBDUmVjdCYgcmNXaW5kb3csKi8gRlhfRFdPUkQgZHdGbGFncykKLXsKLSAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7Ci0KLSAgICBpZiAoSXNWaXNpYmxlKHBXaWRnZXQpKQotICAgIHsKLSAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocEZvcm1GaWxsZXItPklzVmFsaWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRm9ybUZpbGxlci0+T25EcmF3KHBQYWdlVmlldywgcEFubm90LCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIGR3RmxhZ3MpOwotICAgICAgICAgICAgICAgIHBBbm5vdC0+R2V0UERGUGFnZSgpOwotCi0gICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wQXBwLT5HZXRTREtEb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChwRG9jdW1lbnQtPkdldEZvY3VzQW5ub3QoKSA9PSBwQW5ub3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNGb2N1cyA9IHBGb3JtRmlsbGVyLT5HZXRGb2N1c0JveChwUGFnZVZpZXcpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXJjRm9jdXMuSXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguU2V0UG9pbnRDb3VudCg1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMCwgcmNGb2N1cy5sZWZ0LCAgcmNGb2N1cy50b3AsIEZYUFRfTU9WRVRPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMSwgcmNGb2N1cy5sZWZ0LCAgcmNGb2N1cy5ib3R0b20sIEZYUFRfTElORVRPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMiwgcmNGb2N1cy5yaWdodCwgIHJjRm9jdXMuYm90dG9tLCBGWFBUX0xJTkVUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLlNldFBvaW50KDMsIHJjRm9jdXMucmlnaHQsICByY0ZvY3VzLnRvcCwgRlhQVF9MSU5FVE8pOwotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5TZXRQb2ludCg0LCByY0ZvY3VzLmxlZnQsICByY0ZvY3VzLnRvcCwgRlhQVF9MSU5FVE8pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3NkLlNldERhc2hDb3VudCgxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdzZC5tX0Rhc2hBcnJheVswXSA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnc2QubV9EYXNoUGhhc2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3NkLm1fTGluZVdpZHRoID0gMS4wZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIEFyZ2JFbmNvZGUoMjU1LDAsMCwwKSwgRlhGSUxMX0FMVEVSTkFURSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQorICAgICAgaWYgKHBXaWRnZXQtPklzQXBwTW9kaWZpZWQoKSkgeworICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKSB7CisgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotICAgICAgICAgICAgcEZvcm1GaWxsZXItPk9uRHJhd0RlYWN0aXZlKHBQYWdlVmlldywgcEFubm90LCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIGR3RmxhZ3MpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7Ci0KLSAgICAgICAgaWYgKCFJc1JlYWRPbmx5KHBXaWRnZXQpICYmIElzRmlsbGluZ0FsbG93ZWQocFdpZGdldCkpCi0gICAgICAgICAgICBwV2lkZ2V0LT5EcmF3U2hhZG93KHBEZXZpY2UsIHBQYWdlVmlldyk7CisgICAgICB9CiAgICAgfQorICB9CisKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PbkxCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotICAgIHsKLSAgICAgICAgcEZvcm1GaWxsZXItPk9uQ3JlYXRlKHBBbm5vdCk7Ci0gICAgfQotfQorRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcEFwcC0+R2V0U0RLRG9jdW1lbnQoKTsKIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHBGb3JtRmlsbGVyLT5PbkxvYWQocEFubm90KTsKLSAgICB9Ci19Ci0KLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25EZWxldGUoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHBGb3JtRmlsbGVyLT5PbkRlbGV0ZShwQW5ub3QpOwotICAgIH0KLQotICAgIFVuUmVnaXN0ZXJGb3JtRmlsbGVyKHBBbm5vdCk7Ci19Ci0KLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0gICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKLQotICAgIGlmICghbV9iTm90aWZ5aW5nKQotICAgIHsKLSAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLSAgICAgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpDdXJzb3JFbnRlcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7Ci0KLSAgICAgICAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwotCi0gICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0KLQotCi0gICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0gICAgICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKLSAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLSAgICAgICAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckVudGVyLCBmYSwgcFBhZ2VWaWV3ICk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKLQotICAgICAgICAgICAgLy9pZiAoICFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwQW5ub3QpICkgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAocFdpZGdldC0+SXNBcHBNb2RpZmllZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpID09IG5WYWx1ZUFnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpCi0gICAgewotICAgICAgICBwRm9ybUZpbGxlci0+T25Nb3VzZUVudGVyKHBQYWdlVmlldywgcEFubm90KTsKLSAgICB9Ci19Ci0KLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLSAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwotCi0gICAgaWYgKCFtX2JOb3RpZnlpbmcpCi0gICAgewotICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotICAgICAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckV4aXQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOwotICAgICAgICAgICAgcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwotICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7Ci0gICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0KLQotCi0gICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0gICAgICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKLSAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLQotICAgICAgICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6Q3Vyc29yRXhpdCwgZmEsIHBQYWdlVmlldyk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKLQotICAgICAgICAgICAgLy9pZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBBbm5vdCkpIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKHBXaWRnZXQtPklzQXBwTW9kaWZpZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHBGb3JtRmlsbGVyLT5Pbk1vdXNlRXhpdChwUGFnZVZpZXcsIHBBbm5vdCk7Ci0gICAgfQotfQotCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7Ci0KLSAgICBpZiAoIW1fYk5vdGlmeWluZykKLSAgICB7Ci0gICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7Ci0gICAgICAgIGlmIChBbm5vdF9IaXRUZXN0KHBQYWdlVmlldywgcEFubm90LCBwb2ludCkgJiYgcFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvbkRvd24pKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOwotICAgICAgICAgICAgcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwotICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7Ci0gICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0KLQotCi0gICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0gICAgICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFncyk7Ci0gICAgICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZ3MpOwotICAgICAgICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uRG93biwgZmEsIHBQYWdlVmlldyk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKLQotICAgICAgICAgICAgaWYgKCFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwQW5ub3QpKSByZXR1cm4gVFJVRTsKLQotICAgICAgICAgICAgaWYgKHBXaWRnZXQtPklzQXBwTW9kaWZpZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25MQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKLSAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcEFwcC0+R2V0U0RLRG9jdW1lbnQoKTsKLQotICAgIHN3aXRjaCAocFdpZGdldC0+R2V0RmllbGRUeXBlKCkpCi0gICAgeworICBzd2l0Y2ggKHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpKSB7CiAgICAgY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKICAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKLSAgICAgICAgaWYgKEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KS5Db250YWlucygoaW50KXBvaW50LngsIChpbnQpcG9pbnQueSkpCi0gICAgICAgICAgICBwRG9jdW1lbnQtPlNldEZvY3VzQW5ub3QocEFubm90KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKKyAgICAgIGlmIChHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCkuQ29udGFpbnMoKGludClwb2ludC54LCAoaW50KXBvaW50LnkpKQogICAgICAgICBwRG9jdW1lbnQtPlNldEZvY3VzQW5ub3QocEFubm90KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHBEb2N1bWVudC0+U2V0Rm9jdXNBbm5vdChwQW5ub3QpOworICAgICAgYnJlYWs7CisgIH0KIAotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKIAotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIGJSZXQgPSBwRm9ybUZpbGxlci0+T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwotICAgIH0KKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgYlJldCA9IHBGb3JtRmlsbGVyLT5PbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KIAotICAgIGlmIChwRG9jdW1lbnQtPkdldEZvY3VzQW5ub3QoKSA9PSBwQW5ub3QpCi0gICAgewotICAgICAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0gICAgICAgIEZYX0JPT0wgYlJlc2V0ID0gRkFMU0U7Ci0gICAgICAgIE9uQnV0dG9uVXAocFdpZGdldCwgcFBhZ2VWaWV3LCBiUmVzZXQsIGJFeGl0LG5GbGFncyk7Ci0gICAgICAgIGlmIChiRXhpdCkgcmV0dXJuIFRSVUU7CisgIGlmIChwRG9jdW1lbnQtPkdldEZvY3VzQW5ub3QoKSA9PSBwQW5ub3QpIHsKKyAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgICAgRlhfQk9PTCBiUmVzZXQgPSBGQUxTRTsKKyAgICBPbkJ1dHRvblVwKHBXaWRnZXQsIHBQYWdlVmlldywgYlJlc2V0LCBiRXhpdCwgbkZsYWdzKTsKKyAgICBpZiAoYkV4aXQpCisgICAgICByZXR1cm4gVFJVRTsKIAotICAgICAgICBPbkNsaWNrKHBXaWRnZXQsIHBQYWdlVmlldywgYlJlc2V0LCBiRXhpdCwgbkZsYWdzKTsKLSAgICAgICAgaWYgKGJFeGl0KSByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIGJSZXQ7CisgICAgT25DbGljayhwV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsIG5GbGFncyk7CisgICAgaWYgKGJFeGl0KQorICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIGJSZXQ7CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25CdXR0b25VcChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiUmVzZXQsIEZYX0JPT0wmIGJFeGl0LEZYX1VJTlQgbkZsYWcpCi17Ci0gICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQnV0dG9uVXAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSZXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFnKSB7CisgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgaWYgKCFtX2JOb3RpZnlpbmcpCi0gICAgewotICAgICAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvblVwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKLSAgICAgICAgICAgIGludCBuQWdlID0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwotICAgICAgICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CisgIGlmICghbV9iTm90aWZ5aW5nKSB7CisgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpCdXR0b25VcCkpIHsKKyAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CisgICAgICBpbnQgbkFnZSA9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKKyAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwogCi0gICAgICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotLy8gICAgICAgICAgQ1JlYWRlcl9Eb2NWaWV3KiBwRG9jVmlldyA9IHBQYWdlVmlldy0+R2V0RG9jVmlldygpOwotLy8gICAgICAgICAgQVNTRVJUKHBEb2NWaWV3ICE9IE5VTEwpOworICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKyAgICAgIC8vICAgICAgICAgIENSZWFkZXJfRG9jVmlldyogcERvY1ZpZXcgPSBwUGFnZVZpZXctPkdldERvY1ZpZXcoKTsKKyAgICAgIC8vICAgICAgICAgIEFTU0VSVChwRG9jVmlldyAhPSBOVUxMKTsKIAorICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CiAKKyAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvblVwLCBmYSwgcFBhZ2VWaWV3KTsKKyAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOwogCi0gICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0gICAgICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKLSAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLQotICAgICAgICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uVXAsIGZhLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7Ci0KLSAgICAgICAgICAgIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcFdpZGdldCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5BZ2UgIT0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYlJlc2V0ID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7Ci0KLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCi0gICAgewotICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uTEJ1dHRvbkRibENsayhwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLSAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwotCi0gICAgLy9jaGFuZ2UgY3Vyc29yCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpCi0gICAgewotICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uTW91c2VNb3ZlKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7Ci0KLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCi0gICAgewotICAgICAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uTW91c2VXaGVlbChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCB6RGVsdGEsIHBvaW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0gICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKLQotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25SQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLSAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwotCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PblJCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uUkJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0gICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKLQotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25SQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLSAgICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwotCi0gICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWdzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCi17Ci0gICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKLSAgICBpZiAobkNoYXIgPT0gRldMX1ZLRVlfVGFiKQotICAgICAgICByZXR1cm4gVFJVRTsKLQotICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLSAgICAgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkRlU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKLQotCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLQl7Ci0JCXBGb3JtRmlsbGVyLT5PbkRlU2VsZWN0ZWQocEFubm90KTsKLQl9Ci19Ci0KLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25TZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwotCi0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJcEZvcm1GaWxsZXItPk9uU2VsZWN0ZWQocEFubm90KTsKLQl9Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsRlhfVUlOVCBuRmxhZykKLXsKLSAgICBpZiAoIXBBbm5vdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKLQotICAgIGlmICghbV9iTm90aWZ5aW5nKQotICAgIHsKLSAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLSAgICAgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpHZXRGb2N1cykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7Ci0gICAgICAgICAgICBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7Ci0KLSAgICAgICAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwotICAgICAgICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOwotCi0gICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7Ci0gICAgICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotCi0gICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0gICAgICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKLSAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLQotICAgICAgICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgVFJVRSk7Ci0gICAgICAgICAgICBpZighcEZvcm1GaWxsZXIpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpHZXRGb2N1cywgZmEpOwotICAgICAgICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6R2V0Rm9jdXMsIGZhLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7Ci0KLSAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0FwcE1vZGlmaWVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBUUlVFKSkKLSAgICAgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PblNldEZvY3VzKHBBbm5vdCwgbkZsYWcpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpCi17Ci0gICAgaWYoIXBBbm5vdCkgcmV0dXJuIEZBTFNFOwotICAgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7Ci0KLSAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCi0gICAgewotICAgICAgICBpZiAocEZvcm1GaWxsZXItPk9uS2lsbEZvY3VzKHBBbm5vdCwgbkZsYWcpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIW1fYk5vdGlmeWluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotICAgICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6TG9zZUZvY3VzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKLQotICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwV2lkZ2V0LT5HZXRQYWdlVmlldygpOwotICAgICAgICAgICAgICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKLSAgICAgICAgICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7Ci0gICAgICAgICAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLQotICAgICAgICAgICAgICAgICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6TG9zZUZvY3VzLCBmYSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6TG9zZUZvY3VzLCBmYSwgcFBhZ2VWaWV3KTsKLSAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6OklzVmlzaWJsZShDUERGU0RLX1dpZGdldCogcFdpZGdldCkKLXsKLSAgICByZXR1cm4gcFdpZGdldC0+SXNWaXNpYmxlKCk7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNSZWFkT25seShDUERGU0RLX1dpZGdldCogcFdpZGdldCkKLXsKLSAgICBBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKLQotICAgIGludCBuRmllbGRGbGFncyA9IHBXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKLQotICAgIHJldHVybiAobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWTsKLX0KLQotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpJc0ZpbGxpbmdBbGxvd2VkKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQotewotICAgIGlmIChwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBDUERGX1BhZ2UqIHBQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOwotICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKLSAgICBGWF9EV09SRCBkd1Blcm1pc3Npb25zID0gcERvY3VtZW50LT5HZXRVc2VyUGVybWlzc2lvbnMoKTsKLSAgICByZXR1cm4gKGR3UGVybWlzc2lvbnMgJiBGUERGUEVSTV9GSUxMX0ZPUk0pIHx8Ci0gICAgICAgICAgICAoZHdQZXJtaXNzaW9ucyAmIEZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8Ci0gICAgICAgICAgICAoZHdQZXJtaXNzaW9ucyAmIEZQREZQRVJNX01PRElGWSk7Ci19Ci0KLUNGRkxfRm9ybUZpbGxlciogQ0ZGTF9JRm9ybUZpbGxlcjo6R2V0Rm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0JPT0wgYlJlZ2lzdGVyKQotewotICAgIGF1dG8gaXQgPSBtX01hcHMuZmluZChwQW5ub3QpOwotICAgIGlmIChpdCAhPSBtX01hcHMuZW5kKCkpCi0gICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwotCi0gICAgaWYgKCFiUmVnaXN0ZXIpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLSAgICBpbnQgbkZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOwotICAgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXI7Ci0gICAgc3dpdGNoIChuRmllbGRUeXBlKSB7Ci0gICAgICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046Ci0gICAgICAgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX1B1c2hCdXR0b24obV9wQXBwLCBwV2lkZ2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKLSAgICAgICAgICAgIHBGb3JtRmlsbGVyID0gbmV3IENGRkxfQ2hlY2tCb3gobV9wQXBwLCBwV2lkZ2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046Ci0gICAgICAgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX1JhZGlvQnV0dG9uKG1fcEFwcCwgcFdpZGdldCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKLSAgICAgICAgICAgIHBGb3JtRmlsbGVyID0gbmV3IENGRkxfVGV4dEZpZWxkKG1fcEFwcCwgcFdpZGdldCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6Ci0gICAgICAgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX0xpc3RCb3gobV9wQXBwLCBwV2lkZ2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6Ci0gICAgICAgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX0NvbWJvQm94KG1fcEFwcCwgcFdpZGdldCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRklFTERUWVBFX1VOS05PV046Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcEZvcm1GaWxsZXIgPSBudWxscHRyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCFwRm9ybUZpbGxlcikKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBtX01hcHNbcEFubm90XSA9IHBGb3JtRmlsbGVyOwotICAgIHJldHVybiBwRm9ybUZpbGxlcjsKLX0KLQotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpSZW1vdmVGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBpZiAoIHBBbm5vdCAhPSBOVUxMICkKLSAgICB7Ci0gICAgICAgIFVuUmVnaXN0ZXJGb3JtRmlsbGVyKCBwQW5ub3QgKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6VW5SZWdpc3RlckZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotICAgIGF1dG8gaXQgPSBtX01hcHMuZmluZChwQW5ub3QpOwotICAgIGlmIChpdCA9PSBtX01hcHMuZW5kKCkpCisgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKSB7CisgICAgICAgIGJFeGl0ID0gVFJVRTsKICAgICAgICAgcmV0dXJuOworICAgICAgfQogCi0gICAgZGVsZXRlIGl0LT5zZWNvbmQ7Ci0gICAgbV9NYXBzLmVyYXNlKGl0KTsKKyAgICAgIGlmIChuQWdlICE9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkgeworICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKSB7CisgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYlJlc2V0ID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpTZXRGb2N1c0Fubm90VGFiKENQREZTREtfQW5ub3QqIHBXaWRnZXQsIEZYX0JPT0wgYlNhbWVGaWVsZCwgRlhfQk9PTCBiTmV4dCkKLXsKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAorICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpIHsKKyAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uTEJ1dHRvbkRibENsayhwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6UXVlcnlXaGVyZVBvcHVwKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfRkxPQVQgZlBvcHVwTWluLEZYX0ZMT0FUIGZQb3B1cE1heCwgaW50MzJfdCAmIG5SZXQsIEZYX0ZMT0FUICYgZlBvcHVwUmV0KQotewotICAgIEFTU0VSVChwUHJpdmF0ZURhdGEgIT0gTlVMTCk7CitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAotICAgIENGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKKyAgLy8gY2hhbmdlIGN1cnNvcgorICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBUUlVFKSkgeworICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25Nb3VzZU1vdmUocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOworICB9CiAKKyAgcmV0dXJuIEZBTFNFOworfQogCitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5Pbk1vdXNlV2hlZWwocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgekRlbHRhLCBwb2ludCk7CisgIH0KIAotICAgIENQREZfUmVjdCByY1BhZ2VWaWV3KDAsMCwwLDApOwotICAgIHJjUGFnZVZpZXcucmlnaHQgPSBwRGF0YS0+cFdpZGdldC0+R2V0UERGUGFnZSgpLT5HZXRQYWdlV2lkdGgoKTsKLSAgICByY1BhZ2VWaWV3LmJvdHRvbSA9IHBEYXRhLT5wV2lkZ2V0LT5HZXRQREZQYWdlKCktPkdldFBhZ2VIZWlnaHQoKTsKLSAgICByY1BhZ2VWaWV3Lk5vcm1hbGl6ZSgpOworICByZXR1cm4gRkFMU0U7Cit9CiAKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKLSAgICBBU1NFUlQocERhdGEtPnBXaWRnZXQgIT0gTlVMTCk7Ci0gICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBwRGF0YS0+cFdpZGdldC0+R2V0UmVjdCgpOworICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpIHsKKyAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uUkJ1dHRvbkRvd24ocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOworICB9CiAKLSAgICBGWF9GTE9BVCBmVG9wID0gMC4wZjsKLSAgICBGWF9GTE9BVCBmQm90dG9tID0gMC4wZjsKKyAgcmV0dXJuIEZBTFNFOworfQogCi0gICAgQ1BERlNES19XaWRnZXQgKiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwRGF0YS0+cFdpZGdldDsKLSAgICBzd2l0Y2ggKHBXaWRnZXQtPkdldFJvdGF0ZSgpIC8gOTApCi0gICAgeworRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CisKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PblJCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKKworICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpIHsKKyAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uUkJ1dHRvbkRibENsayhwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncykgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOworCisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkgeworICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFncyk7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncykgeworICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOworICBpZiAobkNoYXIgPT0gRldMX1ZLRVlfVGFiKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKKyAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOworCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkRlU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CisKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgcEZvcm1GaWxsZXItPk9uRGVTZWxlY3RlZChwQW5ub3QpOworICB9Cit9CisKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25TZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKKworICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpIHsKKyAgICBwRm9ybUZpbGxlci0+T25TZWxlY3RlZChwQW5ub3QpOworICB9Cit9CisKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpIHsKKyAgaWYgKCFwQW5ub3QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CisKKyAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OworICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6R2V0Rm9jdXMpKSB7CisgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOworCisgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKyAgICAgIHBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKKworICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcEFubm90LT5HZXRQYWdlVmlldygpOworICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisKKyAgICAgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIFRSVUUpOworICAgICAgaWYgKCFwRm9ybUZpbGxlcikKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkdldEZvY3VzLCBmYSk7CisgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpHZXRGb2N1cywgZmEsIHBQYWdlVmlldyk7CisgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKworICAgICAgaWYgKHBXaWRnZXQtPklzQXBwTW9kaWZpZWQoKSkgeworICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKSB7CisgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpCisgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PblNldEZvY3VzKHBBbm5vdCwgbkZsYWcpOworCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykgeworICBpZiAoIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CisKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgaWYgKHBGb3JtRmlsbGVyLT5PbktpbGxGb2N1cyhwQW5ub3QsIG5GbGFnKSkgeworICAgICAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKKyAgICAgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXMpKSB7CisgICAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CisKKyAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwV2lkZ2V0LT5HZXRQYWdlVmlldygpOworICAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisKKyAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICAgICAgZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOworCisgICAgICAgICAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246Okxvc2VGb2N1cywgZmEpOworCisgICAgICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6TG9zZUZvY3VzLCBmYSwgcFBhZ2VWaWV3KTsKKyAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWaXNpYmxlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KSB7CisgIHJldHVybiBwV2lkZ2V0LT5Jc1Zpc2libGUoKTsKK30KKworRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpJc1JlYWRPbmx5KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KSB7CisgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOworCisgIGludCBuRmllbGRGbGFncyA9IHBXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKKworICByZXR1cm4gKG5GaWVsZEZsYWdzICYgRklFTERGTEFHX1JFQURPTkxZKSA9PSBGSUVMREZMQUdfUkVBRE9OTFk7Cit9CisKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNGaWxsaW5nQWxsb3dlZChDUERGU0RLX1dpZGdldCogcFdpZGdldCkgeworICBpZiAocFdpZGdldC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1BVU0hCVVRUT04pCisgICAgcmV0dXJuIFRSVUU7CisKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IHBXaWRnZXQtPkdldFBERlBhZ2UoKTsKKyAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OworICBGWF9EV09SRCBkd1Blcm1pc3Npb25zID0gcERvY3VtZW50LT5HZXRVc2VyUGVybWlzc2lvbnMoKTsKKyAgcmV0dXJuIChkd1Blcm1pc3Npb25zICYgRlBERlBFUk1fRklMTF9GT1JNKSB8fAorICAgICAgICAgKGR3UGVybWlzc2lvbnMgJiBGUERGUEVSTV9BTk5PVF9GT1JNKSB8fAorICAgICAgICAgKGR3UGVybWlzc2lvbnMgJiBGUERGUEVSTV9NT0RJRlkpOworfQorCitDRkZMX0Zvcm1GaWxsZXIqIENGRkxfSUZvcm1GaWxsZXI6OkdldEZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlZ2lzdGVyKSB7CisgIGF1dG8gaXQgPSBtX01hcHMuZmluZChwQW5ub3QpOworICBpZiAoaXQgIT0gbV9NYXBzLmVuZCgpKQorICAgIHJldHVybiBpdC0+c2Vjb25kOworCisgIGlmICghYlJlZ2lzdGVyKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7CisgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXI7CisgIHN3aXRjaCAobkZpZWxkVHlwZSkgeworICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CisgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX1B1c2hCdXR0b24obV9wQXBwLCBwV2lkZ2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgorICAgICAgcEZvcm1GaWxsZXIgPSBuZXcgQ0ZGTF9DaGVja0JveChtX3BBcHAsIHBXaWRnZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CisgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX1JhZGlvQnV0dG9uKG1fcEFwcCwgcFdpZGdldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CisgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX1RleHRGaWVsZChtX3BBcHAsIHBXaWRnZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDoKKyAgICAgIHBGb3JtRmlsbGVyID0gbmV3IENGRkxfTGlzdEJveChtX3BBcHAsIHBXaWRnZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6CisgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX0NvbWJvQm94KG1fcEFwcCwgcFdpZGdldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICBwRm9ybUZpbGxlciA9IG51bGxwdHI7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghcEZvcm1GaWxsZXIpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgbV9NYXBzW3BBbm5vdF0gPSBwRm9ybUZpbGxlcjsKKyAgcmV0dXJuIHBGb3JtRmlsbGVyOworfQorCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6OlJlbW92ZUZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIGlmIChwQW5ub3QgIT0gTlVMTCkgeworICAgIFVuUmVnaXN0ZXJGb3JtRmlsbGVyKHBBbm5vdCk7CisgIH0KK30KKwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpVblJlZ2lzdGVyRm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgYXV0byBpdCA9IG1fTWFwcy5maW5kKHBBbm5vdCk7CisgIGlmIChpdCA9PSBtX01hcHMuZW5kKCkpCisgICAgcmV0dXJuOworCisgIGRlbGV0ZSBpdC0+c2Vjb25kOworICBtX01hcHMuZXJhc2UoaXQpOworfQorCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6OlNldEZvY3VzQW5ub3RUYWIoQ1BERlNES19Bbm5vdCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYW1lRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTmV4dCkge30KKwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpRdWVyeVdoZXJlUG9wdXAodm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBvcHVwTWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBvcHVwTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmUG9wdXBSZXQpIHsKKyAgQVNTRVJUKHBQcml2YXRlRGF0YSAhPSBOVUxMKTsKKworICBDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7CisKKyAgQ1BERl9SZWN0IHJjUGFnZVZpZXcoMCwgMCwgMCwgMCk7CisgIHJjUGFnZVZpZXcucmlnaHQgPSBwRGF0YS0+cFdpZGdldC0+R2V0UERGUGFnZSgpLT5HZXRQYWdlV2lkdGgoKTsKKyAgcmNQYWdlVmlldy5ib3R0b20gPSBwRGF0YS0+cFdpZGdldC0+R2V0UERGUGFnZSgpLT5HZXRQYWdlSGVpZ2h0KCk7CisgIHJjUGFnZVZpZXcuTm9ybWFsaXplKCk7CisKKyAgQVNTRVJUKHBEYXRhLT5wV2lkZ2V0ICE9IE5VTEwpOworICBDUERGX1JlY3QgcmNBbm5vdCA9IHBEYXRhLT5wV2lkZ2V0LT5HZXRSZWN0KCk7CisKKyAgRlhfRkxPQVQgZlRvcCA9IDAuMGY7CisgIEZYX0ZMT0FUIGZCb3R0b20gPSAwLjBmOworCisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwRGF0YS0+cFdpZGdldDsKKyAgc3dpdGNoIChwV2lkZ2V0LT5HZXRSb3RhdGUoKSAvIDkwKSB7CiAgICAgZGVmYXVsdDoKICAgICBjYXNlIDA6Ci0gICAgICAgIGZUb3AgPSByY1BhZ2VWaWV3LnRvcCAtIHJjQW5ub3QudG9wOwotICAgICAgICBmQm90dG9tID0gcmNBbm5vdC5ib3R0b20gLSByY1BhZ2VWaWV3LmJvdHRvbTsKLSAgICAgICAgYnJlYWs7CisgICAgICBmVG9wID0gcmNQYWdlVmlldy50b3AgLSByY0Fubm90LnRvcDsKKyAgICAgIGZCb3R0b20gPSByY0Fubm90LmJvdHRvbSAtIHJjUGFnZVZpZXcuYm90dG9tOworICAgICAgYnJlYWs7CiAgICAgY2FzZSAxOgotICAgICAgICBmVG9wID0gcmNBbm5vdC5sZWZ0IC0gcmNQYWdlVmlldy5sZWZ0OwotICAgICAgICBmQm90dG9tID0gcmNQYWdlVmlldy5yaWdodCAtIHJjQW5ub3QucmlnaHQ7Ci0gICAgICAgIGJyZWFrOworICAgICAgZlRvcCA9IHJjQW5ub3QubGVmdCAtIHJjUGFnZVZpZXcubGVmdDsKKyAgICAgIGZCb3R0b20gPSByY1BhZ2VWaWV3LnJpZ2h0IC0gcmNBbm5vdC5yaWdodDsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgMjoKLSAgICAgICAgZlRvcCA9IHJjQW5ub3QuYm90dG9tIC0gcmNQYWdlVmlldy5ib3R0b207Ci0gICAgICAgIGZCb3R0b20gPSByY1BhZ2VWaWV3LnRvcCAtIHJjQW5ub3QudG9wOwotICAgICAgICBicmVhazsKKyAgICAgIGZUb3AgPSByY0Fubm90LmJvdHRvbSAtIHJjUGFnZVZpZXcuYm90dG9tOworICAgICAgZkJvdHRvbSA9IHJjUGFnZVZpZXcudG9wIC0gcmNBbm5vdC50b3A7CisgICAgICBicmVhazsKICAgICBjYXNlIDM6Ci0gICAgICAgIGZUb3AgPSByY1BhZ2VWaWV3LnJpZ2h0IC0gcmNBbm5vdC5yaWdodDsKLSAgICAgICAgZkJvdHRvbSA9IHJjQW5ub3QubGVmdCAtIHJjUGFnZVZpZXcubGVmdDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgICAgZlRvcCA9IHJjUGFnZVZpZXcucmlnaHQgLSByY0Fubm90LnJpZ2h0OworICAgICAgZkJvdHRvbSA9IHJjQW5ub3QubGVmdCAtIHJjUGFnZVZpZXcubGVmdDsKKyAgICAgIGJyZWFrOworICB9CiAKLSAgICBGWF9GTE9BVCBmRmFjdEhlaWdodCA9IDA7Ci0gICAgRlhfQk9PTCBiQm90dG9tID0gVFJVRTsKLSAgICBGWF9GTE9BVCBmTWF4TGlzdEJveEhlaWdodCA9IDA7Ci0gICAgaWYgKGZQb3B1cE1heCA+IEZGTF9NQVhMSVNUQk9YSEVJR0hUKQotICAgIHsKLSAgICAgICAgaWYgKGZQb3B1cE1pbiA+IEZGTF9NQVhMSVNUQk9YSEVJR0hUKQotICAgICAgICB7Ci0gICAgICAgICAgICBmTWF4TGlzdEJveEhlaWdodCA9IGZQb3B1cE1pbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZNYXhMaXN0Qm94SGVpZ2h0ID0gRkZMX01BWExJU1RCT1hIRUlHSFQ7Ci0gICAgICAgIH0KKyAgRlhfRkxPQVQgZkZhY3RIZWlnaHQgPSAwOworICBGWF9CT09MIGJCb3R0b20gPSBUUlVFOworICBGWF9GTE9BVCBmTWF4TGlzdEJveEhlaWdodCA9IDA7CisgIGlmIChmUG9wdXBNYXggPiBGRkxfTUFYTElTVEJPWEhFSUdIVCkgeworICAgIGlmIChmUG9wdXBNaW4gPiBGRkxfTUFYTElTVEJPWEhFSUdIVCkgeworICAgICAgZk1heExpc3RCb3hIZWlnaHQgPSBmUG9wdXBNaW47CisgICAgfSBlbHNlIHsKKyAgICAgIGZNYXhMaXN0Qm94SGVpZ2h0ID0gRkZMX01BWExJU1RCT1hIRUlHSFQ7CiAgICAgfQotICAgIGVsc2UKLSAgICAgICAgZk1heExpc3RCb3hIZWlnaHQgPSBmUG9wdXBNYXg7CisgIH0gZWxzZQorICAgIGZNYXhMaXN0Qm94SGVpZ2h0ID0gZlBvcHVwTWF4OwogCi0gICAgaWYgKGZCb3R0b20gPiBmTWF4TGlzdEJveEhlaWdodCkKLSAgICB7Ci0gICAgICAgIGZGYWN0SGVpZ2h0ID0gZk1heExpc3RCb3hIZWlnaHQ7CisgIGlmIChmQm90dG9tID4gZk1heExpc3RCb3hIZWlnaHQpIHsKKyAgICBmRmFjdEhlaWdodCA9IGZNYXhMaXN0Qm94SGVpZ2h0OworICAgIGJCb3R0b20gPSBUUlVFOworICB9IGVsc2UgeworICAgIGlmIChmVG9wID4gZk1heExpc3RCb3hIZWlnaHQpIHsKKyAgICAgIGZGYWN0SGVpZ2h0ID0gZk1heExpc3RCb3hIZWlnaHQ7CisgICAgICBiQm90dG9tID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChmVG9wID4gZkJvdHRvbSkgeworICAgICAgICBmRmFjdEhlaWdodCA9IGZUb3A7CisgICAgICAgIGJCb3R0b20gPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZGYWN0SGVpZ2h0ID0gZkJvdHRvbTsKICAgICAgICAgYkJvdHRvbSA9IFRSVUU7CisgICAgICB9CiAgICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChmVG9wID4gZk1heExpc3RCb3hIZWlnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZGYWN0SGVpZ2h0ID0gZk1heExpc3RCb3hIZWlnaHQ7Ci0gICAgICAgICAgICBiQm90dG9tID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZlRvcCA+IGZCb3R0b20pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZkZhY3RIZWlnaHQgPSBmVG9wOwotICAgICAgICAgICAgICAgIGJCb3R0b20gPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmRmFjdEhlaWdodCA9IGZCb3R0b207Ci0gICAgICAgICAgICAgICAgYkJvdHRvbSA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgIH0KIAotICAgIG5SZXQgPSBiQm90dG9tID8gMCA6IDE7Ci0gICAgZlBvcHVwUmV0ID0gZkZhY3RIZWlnaHQ7CisgIG5SZXQgPSBiQm90dG9tID8gMCA6IDE7CisgIGZQb3B1cFJldCA9IGZGYWN0SGVpZ2h0OwogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uU2V0V2luZG93UmVjdCh2b2lkKiBwUHJpdmF0ZURhdGEsIGNvbnN0IENQREZfUmVjdCAmIHJjV2luZG93KQotewotCUFTU0VSVChwUHJpdmF0ZURhdGEgIT0gTlVMTCk7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uU2V0V2luZG93UmVjdCh2b2lkKiBwUHJpdmF0ZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjV2luZG93KSB7CisgIEFTU0VSVChwUHJpdmF0ZURhdGEgIT0gTlVMTCk7CiAKLQlDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7CisgIENGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKIAotCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwRGF0YS0+cFdpZGdldCwgVFJVRSkpCi0JeworICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIFRSVUUpKSB7CisgICAgQ1BERl9SZWN0IHJjT2xkID0KKyAgICAgICAgcEZvcm1GaWxsZXItPlBXTHRvRkZMKHBGb3JtRmlsbGVyLT5HZXRXaW5kb3dSZWN0KHBEYXRhLT5wUGFnZVZpZXcpKTsKKyAgICBDUERGX1JlY3QgcmNOZXcgPSBwRm9ybUZpbGxlci0+UFdMdG9GRkwocmNXaW5kb3cpOworICAgIHBGb3JtRmlsbGVyLT5TZXRXaW5kb3dSZWN0KHBEYXRhLT5wUGFnZVZpZXcsIHJjV2luZG93KTsKIAotCQlDUERGX1JlY3QgcmNPbGQgPSBwRm9ybUZpbGxlci0+UFdMdG9GRkwocEZvcm1GaWxsZXItPkdldFdpbmRvd1JlY3QocERhdGEtPnBQYWdlVmlldykpOwotCQlDUERGX1JlY3QgcmNOZXcgPSBwRm9ybUZpbGxlci0+UFdMdG9GRkwocmNXaW5kb3cpOwotCQlwRm9ybUZpbGxlci0+U2V0V2luZG93UmVjdChwRGF0YS0+cFBhZ2VWaWV3LCByY1dpbmRvdyk7Ci0KLQkJQ1BERl9SZWN0IHVuUmVjdCA9IHJjT2xkOwotCQl1blJlY3QuVW5pb24ocmNOZXcpOwotCQkvL0ZYX1JFQ1QgcmNSZWN0ID0gdW5SZWN0LkdldE91dHRlclJlY3QoKTsKLQkJdW5SZWN0LmxlZnQgPSAoRlhfRkxPQVQpKHVuUmVjdC5sZWZ0IC0gMC41KTsKLQkJdW5SZWN0LnJpZ2h0ID0gKEZYX0ZMT0FUKSh1blJlY3QucmlnaHQgKyAwLjUpOwotCQl1blJlY3QudG9wID0gKEZYX0ZMT0FUKSh1blJlY3QudG9wICsgMC41KTsKLQkJdW5SZWN0LmJvdHRvbSA9IChGWF9GTE9BVCkodW5SZWN0LmJvdHRvbSAtMC41KTsKLQkJbV9wQXBwLT5GRklfSW52YWxpZGF0ZShwRGF0YS0+cFdpZGdldC0+R2V0UERGWEZBUGFnZSgpLCB1blJlY3QubGVmdCwgdW5SZWN0LnRvcCwgdW5SZWN0LnJpZ2h0LCB1blJlY3QuYm90dG9tKTsKLQl9CisgICAgQ1BERl9SZWN0IHVuUmVjdCA9IHJjT2xkOworICAgIHVuUmVjdC5VbmlvbihyY05ldyk7CisgICAgLy8gRlhfUkVDVCByY1JlY3QgPSB1blJlY3QuR2V0T3V0dGVyUmVjdCgpOworICAgIHVuUmVjdC5sZWZ0ID0gKEZYX0ZMT0FUKSh1blJlY3QubGVmdCAtIDAuNSk7CisgICAgdW5SZWN0LnJpZ2h0ID0gKEZYX0ZMT0FUKSh1blJlY3QucmlnaHQgKyAwLjUpOworICAgIHVuUmVjdC50b3AgPSAoRlhfRkxPQVQpKHVuUmVjdC50b3AgKyAwLjUpOworICAgIHVuUmVjdC5ib3R0b20gPSAoRlhfRkxPQVQpKHVuUmVjdC5ib3R0b20gLSAwLjUpOworICAgIG1fcEFwcC0+RkZJX0ludmFsaWRhdGUocERhdGEtPnBXaWRnZXQtPkdldFBERlhGQVBhZ2UoKSwgdW5SZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1blJlY3QudG9wLCB1blJlY3QucmlnaHQsIHVuUmVjdC5ib3R0b20pOworICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBpbnQzMl90IG5LZXlDb2RlLCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotCQkJCQkJCQkgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sCi0JCQkJCQkJCSAgIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCkKLXsKLQlBU1NFUlQocFByaXZhdGVEYXRhICE9IE5VTEwpOwotCUNGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKLQlBU1NFUlQocERhdGEtPnBXaWRnZXQgIT0gTlVMTCk7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQcml2YXRlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0KSB7CisgIEFTU0VSVChwUHJpdmF0ZURhdGEgIT0gTlVMTCk7CisgIENGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKKyAgQVNTRVJUKHBEYXRhLT5wV2lkZ2V0ICE9IE5VTEwpOwogCi0JQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIEZBTFNFKTsKLQlBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7CisgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBEYXRhLT5wV2lkZ2V0LCBGQUxTRSk7CisgIEFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKIAotCXBGb3JtRmlsbGVyLT5PbktleVN0cm9rZShiS2V5RG93bik7CisgIHBGb3JtRmlsbGVyLT5PbktleVN0cm9rZShiS2V5RG93bik7CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LZXlTdHJva2VDb21taXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJDLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgaWYgKCFtX2JOb3RpZnlpbmcpCi0gICAgewotICAgICAgICBBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKLSAgICAgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOwotICAgICAgICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOwotCi0gICAgICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotCi0gICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0gICAgICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKLSAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLSAgICAgICAgICAgIGZhLmJXaWxsQ29tbWl0ID0gVFJVRTsKLSAgICAgICAgICAgIGZhLmJLZXlEb3duID0gVFJVRTsKLSAgICAgICAgICAgIGZhLmJSQyA9IFRSVUU7Ci0KLSAgICAgICAgICAgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKTsKLSAgICAgICAgICAgIEFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKLQotICAgICAgICAgICAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEpOwotICAgICAgICAgICAgcEZvcm1GaWxsZXItPlNhdmVTdGF0ZShwUGFnZVZpZXcpOwotCi0gICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmFPbGQgPSBmYTsKLSAgICAgICAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEsIHBQYWdlVmlldyk7Ci0KLSAgICAgICAgICAgIGJSQyA9IGZhLmJSQzsKLS8vICAgICAgICAgIGJFeGl0ID0gIUlzVmFsaWRBbm5vdChtX3BBcHAsIHBEb2N1bWVudCwgcERvY1ZpZXcsIHBQYWdlVmlldywgcFdpZGdldCk7Ci0KLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uVmFsaWRhdGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJDLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgaWYgKCFtX2JOb3RpZnlpbmcpCi0gICAgewotICAgICAgICBBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKLSAgICAgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7Ci0gICAgICAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0vLyAgICAgICAgICBDUmVhZGVyX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcFBhZ2VWaWV3LT5HZXREb2NWaWV3KCk7Ci0vLyAgICAgICAgICBBU1NFUlQocERvY1ZpZXcgIT0gTlVMTCk7Ci0KLQotCi0gICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0gICAgICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKLSAgICAgICAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLSAgICAgICAgICAgIGZhLmJLZXlEb3duID0gVFJVRTsKLSAgICAgICAgICAgIGZhLmJSQyA9IFRSVUU7Ci0KLSAgICAgICAgICAgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKTsKLSAgICAgICAgICAgIEFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKLQotICAgICAgICAgICAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OlZhbGlkYXRlLCBmYSk7Ci0gICAgICAgICAgICBwRm9ybUZpbGxlci0+U2F2ZVN0YXRlKHBQYWdlVmlldyk7Ci0KLSAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYU9sZCA9IGZhOwotICAgICAgICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6VmFsaWRhdGUsIGZhLCBwUGFnZVZpZXcpOwotCi0gICAgICAgICAgICBiUkMgPSBmYS5iUkM7Ci0vLyAgICAgICAgICBiRXhpdCA9ICFJc1ZhbGlkQW5ub3QobV9wQXBwLCBwRG9jdW1lbnQsIHBEb2NWaWV3LCBwUGFnZVZpZXcsIHBXaWRnZXQpOwotCi0gICAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNhbGN1bGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgaWYgKCFtX2JOb3RpZnlpbmcpCi0gICAgewotICAgICAgICBBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKLSAgICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLS8vICAgICAgQ1JlYWRlcl9Eb2NWaWV3KiBwRG9jVmlldyA9IHBQYWdlVmlldy0+R2V0RG9jVmlldygpOwotLy8gICAgICBBU1NFUlQocERvY1ZpZXcgIT0gTlVMTCk7Ci0gICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKLSAgICAgICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLSAgICAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLSAgICAgICAgcEludGVyRm9ybS0+T25DYWxjdWxhdGUocFdpZGdldC0+R2V0Rm9ybUZpZWxkKCkpOwotCi0vLyAgICAgIGJFeGl0ID0gIUlzVmFsaWRBbm5vdChtX3BBcHAsIHBEb2N1bWVudCwgcERvY1ZpZXcsIHBQYWdlVmlldywgcFdpZGdldCk7Ci0KLSAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7Ci0gICAgfQotfQotCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uRm9ybWF0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKLXsKLSAgICBpZiAoIW1fYk5vdGlmeWluZykKLSAgICB7Ci0gICAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwotICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotLy8gICAgICBDUmVhZGVyX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcFBhZ2VWaWV3LT5HZXREb2NWaWV3KCk7Ci0vLyAgICAgIEFTU0VSVChwRG9jVmlldyAhPSBOVUxMKTsKLSAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOwotICAgICAgICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotICAgICAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotICAgICAgICBGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOwotICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwSW50ZXJGb3JtLT5PbkZvcm1hdChwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgYkZvcm1hdGVkKTsKLQotLy8gICAgICBiRXhpdCA9ICFJc1ZhbGlkQW5ub3QobV9wQXBwLCBwRG9jdW1lbnQsIHBEb2NWaWV3LCBwUGFnZVZpZXcsIHBXaWRnZXQpOwotCi0gICAgICAgIGlmIChiRXhpdCkgcmV0dXJuOwotCi0gICAgICAgIGlmIChiRm9ybWF0ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnRlckZvcm0tPlJlc2V0RmllbGRBcHBlYXJhbmNlKHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBzVmFsdWUuY19zdHIoKSwgVFJVRSk7Ci0gICAgICAgICAgICBwSW50ZXJGb3JtLT5VcGRhdGVGaWVsZChwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKLSAgICB9Ci19Ci0KLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25DbGljayhDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiUmVzZXQsIEZYX0JPT0wmIGJFeGl0LCBGWF9VSU5UIG5GbGFnKQotewordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbktleVN0cm9rZUNvbW1pdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fYk5vdGlmeWluZykgewogICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOworICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlKSkgeworICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgIHBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKIAotICAgIGlmICghbV9iTm90aWZ5aW5nKQotICAgIHsKLSAgICAgICAgaWYgKHBXaWRnZXQtPkhhc1hGQUFBY3Rpb24oUERGU0RLX1hGQV9DbGljaykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7Ci0gICAgICAgICAgICBpbnQgbkFnZSA9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKLSAgICAgICAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOworICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKIAotICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7Ci0gICAgICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJXaWxsQ29tbWl0ID0gVFJVRTsKKyAgICAgIGZhLmJLZXlEb3duID0gVFJVRTsKKyAgICAgIGZhLmJSQyA9IFRSVUU7CiAKLSAgICAgICAgICAgIHBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX0NsaWNrLCBmYSwgcFBhZ2VWaWV3KTsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpOworICAgICAgQVNTRVJUKHBGb3JtRmlsbGVyICE9IE5VTEwpOwogCi0gICAgICAgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlLCBmYSk7CisgICAgICBwRm9ybUZpbGxlci0+U2F2ZVN0YXRlKHBQYWdlVmlldyk7CiAKLSAgICAgICAgICAgIGlmIChuQWdlICE9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYU9sZCA9IGZhOworICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlLCBmYSwgcFBhZ2VWaWV3KTsKIAotICAgICAgICAgICAgICAgIGJSZXNldCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIGJSQyA9IGZhLmJSQzsKKyAgICAgIC8vICAgICAgICAgIGJFeGl0ID0gIUlzVmFsaWRBbm5vdChtX3BBcHAsIHBEb2N1bWVudCwgcERvY1ZpZXcsIHBQYWdlVmlldywKKyAgICAgIC8vICAgICAgICAgIHBXaWRnZXQpOworCisgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKICAgICB9CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkZ1bGwoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJlc2V0LCBGWF9CT09MJiBiRXhpdCwgRlhfVUlOVCBuRmxhZykKLXsKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25WYWxpZGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmICghbV9iTm90aWZ5aW5nKSB7CiAgICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CisgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSkpIHsKKyAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CisgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CiAKLSAgICBpZiAoIW1fYk5vdGlmeWluZykKLSAgICB7Ci0gICAgICAgIGlmIChwV2lkZ2V0LT5IYXNYRkFBQWN0aW9uKFBERlNES19YRkFfRnVsbCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7Ci0gICAgICAgICAgICBpbnQgbkFnZSA9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKLSAgICAgICAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOworICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKyAgICAgIC8vICAgICAgICAgIENSZWFkZXJfRG9jVmlldyogcERvY1ZpZXcgPSBwUGFnZVZpZXctPkdldERvY1ZpZXcoKTsKKyAgICAgIC8vICAgICAgICAgIEFTU0VSVChwRG9jVmlldyAhPSBOVUxMKTsKIAotICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7Ci0gICAgICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJLZXlEb3duID0gVFJVRTsKKyAgICAgIGZhLmJSQyA9IFRSVUU7CiAKLSAgICAgICAgICAgIHBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX0Z1bGwsIGZhLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSk7CisgICAgICBBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7CiAKLSAgICAgICAgICAgIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcFdpZGdldCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KKyAgICAgIHBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSwgZmEpOworICAgICAgcEZvcm1GaWxsZXItPlNhdmVTdGF0ZShwUGFnZVZpZXcpOwogCi0gICAgICAgICAgICBpZiAobkFnZSAhPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmFPbGQgPSBmYTsKKyAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OlZhbGlkYXRlLCBmYSwgcFBhZ2VWaWV3KTsKIAotICAgICAgICAgICAgICAgIGJSZXNldCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIGJSQyA9IGZhLmJSQzsKKyAgICAgIC8vICAgICAgICAgIGJFeGl0ID0gIUlzVmFsaWRBbm5vdChtX3BBcHAsIHBEb2N1bWVudCwgcERvY1ZpZXcsIHBQYWdlVmlldywKKyAgICAgIC8vICAgICAgICAgIHBXaWRnZXQpOworCisgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKICAgICB9CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPblBvcHVwUHJlT3Blbih2b2lkKiBwUHJpdmF0ZURhdGEsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKLXsKLQlBU1NFUlQocFByaXZhdGVEYXRhICE9IE5VTEwpOwotCUNGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKLQlBU1NFUlQocERhdGEtPnBXaWRnZXQgIT0gTlVMTCk7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQ2FsY3VsYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fYk5vdGlmeWluZykgeworICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOworICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisgICAgLy8gICAgICBDUmVhZGVyX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcFBhZ2VWaWV3LT5HZXREb2NWaWV3KCk7CisgICAgLy8gICAgICBBU1NFUlQocERvY1ZpZXcgIT0gTlVMTCk7CisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLQlGWF9CT09MIGJUZW1wUmVzZXQgPSBGQUxTRTsKLQlGWF9CT09MIGJUZW1wRXhpdCA9IEZBTFNFOwotCXRoaXMtPk9uUHJlT3BlbihwRGF0YS0+cFdpZGdldCwgcERhdGEtPnBQYWdlVmlldywgYlRlbXBSZXNldCwgYlRlbXBFeGl0LCBuRmxhZyk7CisgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPQorICAgICAgICAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAKLQlpZiAoYlRlbXBSZXNldCB8fCBiVGVtcEV4aXQpCi0JewotCQliRXhpdCA9IFRSVUU7Ci0JfQorICAgIHBJbnRlckZvcm0tPk9uQ2FsY3VsYXRlKHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpKTsKKworICAgIC8vICAgICAgYkV4aXQgPSAhSXNWYWxpZEFubm90KG1fcEFwcCwgcERvY3VtZW50LCBwRG9jVmlldywgcFBhZ2VWaWV3LAorICAgIC8vICAgICAgcFdpZGdldCk7CisKKyAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgfQogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uUG9wdXBQb3N0T3Blbih2b2lkKiBwUHJpdmF0ZURhdGEsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKLXsKLQlBU1NFUlQocFByaXZhdGVEYXRhICE9IE5VTEwpOwotCUNGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKLQlBU1NFUlQocERhdGEtPnBXaWRnZXQgIT0gTlVMTCk7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uRm9ybWF0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fYk5vdGlmeWluZykgeworICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOworICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisgICAgLy8gICAgICBDUmVhZGVyX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcFBhZ2VWaWV3LT5HZXREb2NWaWV3KCk7CisgICAgLy8gICAgICBBU1NFUlQocERvY1ZpZXcgIT0gTlVMTCk7CisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLQlGWF9CT09MIGJUZW1wUmVzZXQgPSBGQUxTRTsKLQlGWF9CT09MIGJUZW1wRXhpdCA9IEZBTFNFOwotCXRoaXMtPk9uUG9zdE9wZW4ocERhdGEtPnBXaWRnZXQsIHBEYXRhLT5wUGFnZVZpZXcsIGJUZW1wUmVzZXQsIGJUZW1wRXhpdCwgbkZsYWcpOworICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgICAgKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwogCi0JaWYgKGJUZW1wUmVzZXQgfHwgYlRlbXBFeGl0KQotCXsKLQkJYkV4aXQgPSBUUlVFOwotCX0KKyAgICBGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOworICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9CisgICAgICAgIHBJbnRlckZvcm0tPk9uRm9ybWF0KHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBiRm9ybWF0ZWQpOworCisgICAgLy8gICAgICBiRXhpdCA9ICFJc1ZhbGlkQW5ub3QobV9wQXBwLCBwRG9jdW1lbnQsIHBEb2NWaWV3LCBwUGFnZVZpZXcsCisgICAgLy8gICAgICBwV2lkZ2V0KTsKKworICAgIGlmIChiRXhpdCkKKyAgICAgIHJldHVybjsKKworICAgIGlmIChiRm9ybWF0ZWQpIHsKKyAgICAgIHBJbnRlckZvcm0tPlJlc2V0RmllbGRBcHBlYXJhbmNlKHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBzVmFsdWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworICAgICAgcEludGVyRm9ybS0+VXBkYXRlRmllbGQocFdpZGdldC0+R2V0Rm9ybUZpZWxkKCkpOworICAgIH0KKworICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25QcmVPcGVuKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSZXNldCwgRlhfQk9PTCYgYkV4aXQsIEZYX1VJTlQgbkZsYWcpCi17Ci0JQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQ2xpY2soQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSZXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFnKSB7CisgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogCi0JaWYgKCFtX2JOb3RpZnlpbmcpCi0JewotCQlpZiAocFdpZGdldC0+SGFzWEZBQUFjdGlvbihQREZTREtfWEZBX1ByZU9wZW4pKQotCQl7Ci0JCQltX2JOb3RpZnlpbmcgPSBUUlVFOwotCQkJaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7Ci0JCQlpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKyAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICBpZiAocFdpZGdldC0+SGFzWEZBQUFjdGlvbihQREZTREtfWEZBX0NsaWNrKSkgeworICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgIGludCBuQWdlID0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOworICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAKLQkJCVBERlNES19GaWVsZEFjdGlvbiBmYTsKLQkJCWZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOwotCQkJZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CiAKLQkJCXBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX1ByZU9wZW4sIGZhLCBwUGFnZVZpZXcpOwotCQkJbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICBwV2lkZ2V0LT5PblhGQUFBY3Rpb24oUERGU0RLX1hGQV9DbGljaywgZmEsIHBQYWdlVmlldyk7CisgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKIAotCQkJaWYgKCFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwV2lkZ2V0KSkKLQkJCXsKLQkJCQliRXhpdCA9IFRSVUU7Ci0JCQkJcmV0dXJuOwotCQkJfQorICAgICAgaWYgKCFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwV2lkZ2V0KSkgeworICAgICAgICBiRXhpdCA9IFRSVUU7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KIAotCQkJaWYgKG5BZ2UgIT0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKQotCQkJewotCQkJCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCi0JCQkJewotCQkJCQlwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7Ci0JCQkJfQorICAgICAgaWYgKG5BZ2UgIT0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKSB7CisgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpIHsKKyAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7CisgICAgICAgIH0KIAotCQkJCWJSZXNldCA9IFRSVUU7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIGJSZXNldCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Qb3N0T3BlbihDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiUmVzZXQsIEZYX0JPT0wmIGJFeGl0LCBGWF9VSU5UIG5GbGFnKQotewotCUFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkZ1bGwoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWcpIHsKKyAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CiAKLQlpZiAoIW1fYk5vdGlmeWluZykKLQl7Ci0JCWlmIChwV2lkZ2V0LT5IYXNYRkFBQWN0aW9uKFBERlNES19YRkFfUG9zdE9wZW4pKQotCQl7Ci0JCQltX2JOb3RpZnlpbmcgPSBUUlVFOwotCQkJaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7Ci0JCQlpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKyAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICBpZiAocFdpZGdldC0+SGFzWEZBQUFjdGlvbihQREZTREtfWEZBX0Z1bGwpKSB7CisgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKIAotCQkJUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotCQkJZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7Ci0JCQlmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKIAotCQkJcFdpZGdldC0+T25YRkFBQWN0aW9uKFBERlNES19YRkFfUG9zdE9wZW4sIGZhLCBwUGFnZVZpZXcpOwotCQkJbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICBwV2lkZ2V0LT5PblhGQUFBY3Rpb24oUERGU0RLX1hGQV9GdWxsLCBmYSwgcFBhZ2VWaWV3KTsKKyAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOwogCi0JCQlpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKQotCQkJewotCQkJCWJFeGl0ID0gVFJVRTsKLQkJCQlyZXR1cm47Ci0JCQl9CisgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKSB7CisgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQogCi0JCQlpZiAobkFnZSAhPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpCi0JCQl7Ci0JCQkJaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkKLQkJCQl7Ci0JCQkJCXBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKLQkJCQl9CisgICAgICBpZiAobkFnZSAhPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpIHsKKyAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkgeworICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKKyAgICAgICAgfQogCi0JCQkJYlJlc2V0ID0gVFJVRTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgYlJlc2V0ID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotRlhfQk9PTAlDRkZMX0lGb3JtRmlsbGVyOjpJc1ZhbGlkQW5ub3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgaWYocFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gcFBhZ2VWaWV3LT5Jc1ZhbGlkQW5ub3QocEFubm90LT5HZXRQREZBbm5vdCgpKTsKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Qb3B1cFByZU9wZW4odm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQVNTRVJUKHBQcml2YXRlRGF0YSAhPSBOVUxMKTsKKyAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOworICBBU1NFUlQocERhdGEtPnBXaWRnZXQgIT0gTlVMTCk7CiAKLSAgICByZXR1cm4gRkFMU0U7CisgIEZYX0JPT0wgYlRlbXBSZXNldCA9IEZBTFNFOworICBGWF9CT09MIGJUZW1wRXhpdCA9IEZBTFNFOworICB0aGlzLT5PblByZU9wZW4ocERhdGEtPnBXaWRnZXQsIHBEYXRhLT5wUGFnZVZpZXcsIGJUZW1wUmVzZXQsIGJUZW1wRXhpdCwKKyAgICAgICAgICAgICAgICAgIG5GbGFnKTsKKworICBpZiAoYlRlbXBSZXNldCB8fCBiVGVtcEV4aXQpIHsKKyAgICBiRXhpdCA9IFRSVUU7CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpCZWZvcmVVbmRvKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Qb3B1cFBvc3RPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQVNTRVJUKHBQcml2YXRlRGF0YSAhPSBOVUxMKTsKKyAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOworICBBU1NFUlQocERhdGEtPnBXaWRnZXQgIT0gTlVMTCk7CiAKKyAgRlhfQk9PTCBiVGVtcFJlc2V0ID0gRkFMU0U7CisgIEZYX0JPT0wgYlRlbXBFeGl0ID0gRkFMU0U7CisgIHRoaXMtPk9uUG9zdE9wZW4ocERhdGEtPnBXaWRnZXQsIHBEYXRhLT5wUGFnZVZpZXcsIGJUZW1wUmVzZXQsIGJUZW1wRXhpdCwKKyAgICAgICAgICAgICAgICAgICBuRmxhZyk7CisKKyAgaWYgKGJUZW1wUmVzZXQgfHwgYlRlbXBFeGl0KSB7CisgICAgYkV4aXQgPSBUUlVFOworICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6QmVmb3JlUmVkbyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JQmVmb3JlVW5kbyhwRG9jdW1lbnQpOwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPblByZU9wZW4oQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWcpIHsKKyAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CisKKyAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICBpZiAocFdpZGdldC0+SGFzWEZBQUFjdGlvbihQREZTREtfWEZBX1ByZU9wZW4pKSB7CisgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisKKyAgICAgIHBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX1ByZU9wZW4sIGZhLCBwUGFnZVZpZXcpOworICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisKKyAgICAgIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcFdpZGdldCkpIHsKKyAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChuQWdlICE9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkgeworICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKSB7CisgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYlJlc2V0ID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpBZnRlclVuZG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPblBvc3RPcGVuKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZykgeworICBBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKKworICBpZiAoIW1fYk5vdGlmeWluZykgeworICAgIGlmIChwV2lkZ2V0LT5IYXNYRkFBQWN0aW9uKFBERlNES19YRkFfUG9zdE9wZW4pKSB7CisgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisKKyAgICAgIHBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX1Bvc3RPcGVuLCBmYSwgcFBhZ2VWaWV3KTsKKyAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworCisgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKSB7CisgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAobkFnZSAhPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpIHsKKyAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkgeworICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGJSZXNldCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6QWZ0ZXJSZWRvKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWYWxpZEFubm90KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBpZiAocFBhZ2VWaWV3KQorICAgIHJldHVybiBwUGFnZVZpZXctPklzVmFsaWRBbm5vdChwQW5ub3QtPkdldFBERkFubm90KCkpOworCisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDRkZMX0lGb3JtRmlsbGVyOjpDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6QmVmb3JlVW5kbyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHt9CiAKLQlyZXR1cm4gRkFMU0U7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6OkJlZm9yZVJlZG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIEJlZm9yZVVuZG8ocERvY3VtZW50KTsKIH0KIAotRlhfQk9PTAlDRkZMX0lGb3JtRmlsbGVyOjpDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpBZnRlclVuZG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7fQogCi0JcmV0dXJuIEZBTFNFOwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpBZnRlclJlZG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7fQorCitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6OkNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDRkZMX0lGb3JtRmlsbGVyOjpDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0KLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6OkNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6OkRvQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17CitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6OkNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6RG9DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpEb0NvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7fQorCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6OkRvQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkge30KKwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpEb1Bhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkge30KK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25CZWZvcmVLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBBU1NFUlQocFByaXZhdGVEYXRhICE9IE5VTEwpOworICBDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7CisgIEFTU0VSVChwRGF0YS0+cFdpZGdldCAhPSBOVUxMKTsKKworICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwRGF0YS0+cFdpZGdldCwgRkFMU0UpOworICBBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7CisKKyAgaWYgKHBGb3JtRmlsbGVyLT5Jc0ZpZWxkRnVsbChwRGF0YS0+cFBhZ2VWaWV3KSkgeworICAgIEZYX0JPT0wgYkZ1bGxFeGl0ID0gRkFMU0U7CisgICAgRlhfQk9PTCBiRnVsbFJlc2V0ID0gRkFMU0U7CisgICAgT25GdWxsKHBEYXRhLT5wV2lkZ2V0LCBwRGF0YS0+cFBhZ2VWaWV3LCBiRnVsbFJlc2V0LCBiRnVsbEV4aXQsIG5GbGFnKTsKKworICAgIGlmIChiRnVsbFJlc2V0IHx8IGJGdWxsRXhpdCkgeworICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGlmICghbV9iTm90aWZ5aW5nKSB7CisgICAgaWYgKHBEYXRhLT5wV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlKSkgeworICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgIGludCBuQWdlID0gcERhdGEtPnBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKKyAgICAgIGludCBuVmFsdWVBZ2UgPSBwRGF0YS0+cFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKworICAgICAgQVNTRVJUKHBEYXRhLT5wUGFnZVZpZXcgIT0gTlVMTCk7CisgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwRGF0YS0+cFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworCisgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLnNDaGFuZ2UgPSBzdHJDaGFuZ2U7CisgICAgICBmYS5zQ2hhbmdlRXggPSBzdHJDaGFuZ2VFeDsKKyAgICAgIGZhLmJLZXlEb3duID0gYktleURvd247CisgICAgICBmYS5iV2lsbENvbW1pdCA9IEZBTFNFOworICAgICAgZmEuYlJDID0gVFJVRTsKKyAgICAgIGZhLm5TZWxTdGFydCA9IG5TZWxTdGFydDsKKyAgICAgIGZhLm5TZWxFbmQgPSBuU2VsRW5kOworCisgICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwRGF0YS0+cFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEpOworICAgICAgcEZvcm1GaWxsZXItPlNhdmVTdGF0ZShwRGF0YS0+cFBhZ2VWaWV3KTsKKworICAgICAgaWYgKHBEYXRhLT5wV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsIGZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPnBQYWdlVmlldykpIHsKKyAgICAgICAgaWYgKCFJc1ZhbGlkQW5ub3QocERhdGEtPnBQYWdlVmlldywgcERhdGEtPnBXaWRnZXQpKSB7CisgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuQWdlICE9IHBEYXRhLT5wV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpIHsKKyAgICAgICAgICBDUFdMX1duZCogcFduZCA9IHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdygKKyAgICAgICAgICAgICAgcERhdGEtPnBQYWdlVmlldywgblZhbHVlQWdlID09IHBEYXRhLT5wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKKyAgICAgICAgICBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwV25kLT5HZXRBdHRhY2hlZERhdGEoKTsKKyAgICAgICAgICBiRXhpdCA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmEuYlJDKSB7CisgICAgICAgICAgcEZvcm1GaWxsZXItPlNldEFjdGlvbkRhdGEocERhdGEtPnBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmEpOworICAgICAgICAgIGJSQyA9IEZBTFNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXN0b3JlU3RhdGUocERhdGEtPnBQYWdlVmlldyk7CisgICAgICAgICAgYlJDID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERvY3VtZW50LT5HZXRGb2N1c0Fubm90KCkgIT0gcERhdGEtPnBXaWRnZXQpIHsKKyAgICAgICAgICBwRm9ybUZpbGxlci0+Q29tbWl0RGF0YShwRGF0YS0+cFBhZ2VWaWV3LCBuRmxhZyk7CisgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwRGF0YS0+cFBhZ2VWaWV3LCBwRGF0YS0+cFdpZGdldCkpIHsKKyAgICAgICAgICBiRXhpdCA9IFRSVUU7CisgICAgICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgIH0KKyAgfQogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6OkRvUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkFmdGVyS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIEFTU0VSVChwUHJpdmF0ZURhdGEgIT0gTlVMTCk7CisgIENGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKKyAgQVNTRVJUKHBEYXRhLT5wV2lkZ2V0ICE9IE5VTEwpOwogCi19Ci12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQmVmb3JlS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgaW50MzJfdCBuS2V5Q29kZSwKLQkJCQkJCQkJCQkJICBDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJCQkgIGludCBuU2VsU3RhcnQsIGludCBuU2VsRW5kLAotCQkJCQkJCQkJCUZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQVNTRVJUKHBQcml2YXRlRGF0YSAhPSBOVUxMKTsKLQlDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7Ci0JQVNTRVJUKHBEYXRhLT5wV2lkZ2V0ICE9IE5VTEwpOworICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwRGF0YS0+cFdpZGdldCwgRkFMU0UpOworICBBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7CiAKLQlDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwRGF0YS0+cFdpZGdldCwgRkFMU0UpOwotCUFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKLQotCWlmIChwRm9ybUZpbGxlci0+SXNGaWVsZEZ1bGwocERhdGEtPnBQYWdlVmlldykpCi0JewotCQlGWF9CT09MIGJGdWxsRXhpdCA9IEZBTFNFOwotCQlGWF9CT09MIGJGdWxsUmVzZXQgPSBGQUxTRTsKLQkJT25GdWxsKHBEYXRhLT5wV2lkZ2V0LCBwRGF0YS0+cFBhZ2VWaWV3LCBiRnVsbFJlc2V0LCBiRnVsbEV4aXQsIG5GbGFnKTsKLQotCQlpZiAoYkZ1bGxSZXNldCB8fCBiRnVsbEV4aXQpCi0JCXsKLQkJCWJFeGl0ID0gVFJVRTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWlmICghbV9iTm90aWZ5aW5nKQotCXsKLQkJaWYgKHBEYXRhLT5wV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlKSkKLQkJewotCQkJbV9iTm90aWZ5aW5nID0gVFJVRTsKLQkJCWludCBuQWdlID0gcERhdGEtPnBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKLQkJCWludCBuVmFsdWVBZ2UgPSBwRGF0YS0+cFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKLQotCQkJQVNTRVJUKHBEYXRhLT5wUGFnZVZpZXcgIT0gTlVMTCk7Ci0JCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgID0gcERhdGEtPnBQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKLQotCQkJUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotIAkJCWZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOwotIAkJCWZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLQkJCWZhLnNDaGFuZ2UgPSBzdHJDaGFuZ2U7Ci0JCQlmYS5zQ2hhbmdlRXggPSBzdHJDaGFuZ2VFeDsKLQkJCWZhLmJLZXlEb3duID0gYktleURvd247Ci0JCQlmYS5iV2lsbENvbW1pdCA9IEZBTFNFOwotCQkJZmEuYlJDID0gVFJVRTsKLQkJCWZhLm5TZWxTdGFydCA9IG5TZWxTdGFydDsKLQkJCWZhLm5TZWxFbmQgPSBuU2VsRW5kOwotCi0KLQkJCXBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBEYXRhLT5wUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlLCBmYSk7Ci0JCQlwRm9ybUZpbGxlci0+U2F2ZVN0YXRlKHBEYXRhLT5wUGFnZVZpZXcpOwotCi0JCQlpZiAocERhdGEtPnBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEsIHBEYXRhLT5wUGFnZVZpZXcpKQotCQkJewotCQkJCWlmICghSXNWYWxpZEFubm90KHBEYXRhLT5wUGFnZVZpZXcsIHBEYXRhLT5wV2lkZ2V0KSkKLQkJCQl7Ci0JCQkJCWJFeGl0ID0gVFJVRTsKLQkJCQkJbV9iTm90aWZ5aW5nID0gRkFMU0U7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAobkFnZSAhPSBwRGF0YS0+cFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKQotCQkJCXsKLQkJCQkJQ1BXTF9XbmQqIHBXbmQgPSBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocERhdGEtPnBQYWdlVmlldywgblZhbHVlQWdlID09IHBEYXRhLT5wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKLQkJCQkJcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFduZC0+R2V0QXR0YWNoZWREYXRhKCk7Ci0JCQkJCWJFeGl0ID0gVFJVRTsKLQkJCQl9Ci0KLQkJCQlpZiAoZmEuYlJDKQotCQkJCXsKLQkJCQkJcEZvcm1GaWxsZXItPlNldEFjdGlvbkRhdGEocERhdGEtPnBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsIGZhKTsKLQkJCQkJYlJDID0gRkFMU0U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBGb3JtRmlsbGVyLT5SZXN0b3JlU3RhdGUocERhdGEtPnBQYWdlVmlldyk7Ci0JCQkJCWJSQyA9IEZBTFNFOwotCQkJCX0KLQotCQkJCWlmIChwRG9jdW1lbnQtPkdldEZvY3VzQW5ub3QoKSAhPSBwRGF0YS0+cFdpZGdldCkKLQkJCQl7Ci0JCQkJCXBGb3JtRmlsbGVyLT5Db21taXREYXRhKHBEYXRhLT5wUGFnZVZpZXcsbkZsYWcpOwotCQkJCQliRXhpdCA9IFRSVUU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmICghSXNWYWxpZEFubm90KHBEYXRhLT5wUGFnZVZpZXcsIHBEYXRhLT5wV2lkZ2V0KSkKLQkJCQl7Ci0JCQkJCWJFeGl0ID0gVFJVRTsKLQkJCQkJbV9iTm90aWZ5aW5nID0gRkFMU0U7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW1fYk5vdGlmeWluZyA9IEZBTFNFOwotCQl9Ci0JfQotfQotCi12b2lkCUNGRkxfSUZvcm1GaWxsZXI6Ok9uQWZ0ZXJLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBGWF9CT09MICYgYkV4aXQsRlhfRFdPUkQgbkZsYWcpCi17Ci0JQVNTRVJUKHBQcml2YXRlRGF0YSAhPSBOVUxMKTsKLQlDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7Ci0JQVNTRVJUKHBEYXRhLT5wV2lkZ2V0ICE9IE5VTEwpOwotCi0JQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIEZBTFNFKTsKLQlBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7Ci0KLQlpZiAoIWJFZGl0T3JMaXN0KQotCQlwRm9ybUZpbGxlci0+T25LZXlTdHJva2UoYkV4aXQpOworICBpZiAoIWJFZGl0T3JMaXN0KQorICAgIHBGb3JtRmlsbGVyLT5PbktleVN0cm9rZShiRXhpdCk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCmluZGV4IGMxMDVjZmMuLjA3MzVmNDggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCkBAIC0xMiwyODYgKzEyLDIzNyBAQAogLy8jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9VbmRvLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5oIgogCisjZGVmaW5lIEZGTF9ERUZBVUxUTElTVEJPWEZPTlRTSVpFIDEyLjBmCiAKLSNkZWZpbmUJRkZMX0RFRkFVTFRMSVNUQk9YRk9OVFNJWkUJCTEyLjBmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGRkxfTGlzdEJveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAorQ0ZGTF9MaXN0Qm94OjpDRkZMX0xpc3RCb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcFdpZGdldCkKKyAgICA6IENGRkxfRm9ybUZpbGxlcihwQXBwLCBwV2lkZ2V0KSwgbV9wRm9udE1hcChOVUxMKSB7fQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGRkxfTGlzdEJveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUNGRkxfTGlzdEJveDo6Q0ZGTF9MaXN0Qm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBXaWRnZXQpIDoKLQlDRkZMX0Zvcm1GaWxsZXIocEFwcCwgcFdpZGdldCksCi0JbV9wRm9udE1hcChOVUxMKQoteworQ0ZGTF9MaXN0Qm94Ojp+Q0ZGTF9MaXN0Qm94KCkgeworICBkZWxldGUgbV9wRm9udE1hcDsKIH0KIAotQ0ZGTF9MaXN0Qm94Ojp+Q0ZGTF9MaXN0Qm94KCkKLXsKLSAgICBkZWxldGUgbV9wRm9udE1hcDsKK1BXTF9DUkVBVEVQQVJBTSBDRkZMX0xpc3RCb3g6OkdldENyZWF0ZVBhcmFtKCkgeworICBQV0xfQ1JFQVRFUEFSQU0gY3AgPSBDRkZMX0Zvcm1GaWxsZXI6OkdldENyZWF0ZVBhcmFtKCk7CisKKyAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKKyAgRlhfRFdPUkQgZHdGaWVsZEZsYWcgPSBtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKKworICBpZiAoZHdGaWVsZEZsYWcgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpIHsKKyAgICBjcC5kd0ZsYWdzIHw9IFBMQlNfTVVMVElQTEVTRUw7CisgIH0KKworICBjcC5kd0ZsYWdzIHw9IFBXU19WU0NST0xMOworCisgIGlmIChjcC5kd0ZsYWdzICYgUFdTX0FVVE9GT05UU0laRSkKKyAgICBjcC5mRm9udFNpemUgPSBGRkxfREVGQVVMVExJU1RCT1hGT05UU0laRTsKKworICBpZiAoIW1fcEZvbnRNYXApIHsKKyAgICBtX3BGb250TWFwID0gbmV3IENCQV9Gb250TWFwKG1fcFdpZGdldCwgbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCkpOworICAgIG1fcEZvbnRNYXAtPkluaXRpYWwoKTsKKyAgfQorICBjcC5wRm9udE1hcCA9IG1fcEZvbnRNYXA7CisKKyAgcmV0dXJuIGNwOwogfQogCi1QV0xfQ1JFQVRFUEFSQU0JQ0ZGTF9MaXN0Qm94OjpHZXRDcmVhdGVQYXJhbSgpCi17Ci0JUFdMX0NSRUFURVBBUkFNIGNwID0gQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRDcmVhdGVQYXJhbSgpOworQ1BXTF9XbmQqIENGRkxfTGlzdEJveDo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIENQV0xfTGlzdEJveCogcFduZCA9IG5ldyBDUFdMX0xpc3RCb3goKTsKKyAgcFduZC0+QXR0YWNoRkZMRGF0YSh0aGlzKTsKKyAgcFduZC0+Q3JlYXRlKGNwKTsKIAotCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Ci0JRlhfRFdPUkQgZHdGaWVsZEZsYWcgPSBtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKKyAgQVNTRVJUKG1fcEFwcCAhPSBOVUxMKTsKKyAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gbV9wQXBwLT5HZXRJRm9ybUZpbGxlcigpOworICBwV25kLT5TZXRGaWxsZXJOb3RpZnkocElGb3JtRmlsbGVyKTsKIAotCWlmIChkd0ZpZWxkRmxhZyAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkKLQl7Ci0JCWNwLmR3RmxhZ3MgfD0gUExCU19NVUxUSVBMRVNFTDsKLQl9CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX3BXaWRnZXQtPkNvdW50T3B0aW9ucygpOyBpIDwgc3o7IGkrKykKKyAgICBwV25kLT5BZGRTdHJpbmcobV9wV2lkZ2V0LT5HZXRPcHRpb25MYWJlbChpKS5jX3N0cigpKTsKIAotCWNwLmR3RmxhZ3MgfD0gUFdTX1ZTQ1JPTEw7CisgIGlmIChwV25kLT5IYXNGbGFnKFBMQlNfTVVMVElQTEVTRUwpKSB7CisgICAgbV9PcmlnaW5TZWxlY3Rpb25zLmNsZWFyKCk7CiAKLQlpZiAoY3AuZHdGbGFncyAmIFBXU19BVVRPRk9OVFNJWkUpCi0JCWNwLmZGb250U2l6ZSA9IEZGTF9ERUZBVUxUTElTVEJPWEZPTlRTSVpFOworICAgIEZYX0JPT0wgYlNldENhcmV0ID0gRkFMU0U7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fcFdpZGdldC0+Q291bnRPcHRpb25zKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICBpZiAobV9wV2lkZ2V0LT5Jc09wdGlvblNlbGVjdGVkKGkpKSB7CisgICAgICAgIGlmICghYlNldENhcmV0KSB7CisgICAgICAgICAgcFduZC0+U2V0Q2FyZXQoaSk7CisgICAgICAgICAgYlNldENhcmV0ID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBwV25kLT5TZWxlY3QoaSk7CisgICAgICAgIG1fT3JpZ2luU2VsZWN0aW9ucy5pbnNlcnQoaSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fcFdpZGdldC0+Q291bnRPcHRpb25zKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICBpZiAobV9wV2lkZ2V0LT5Jc09wdGlvblNlbGVjdGVkKGkpKSB7CisgICAgICAgIHBXbmQtPlNlbGVjdChpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CiAKLQlpZiAoIW1fcEZvbnRNYXApCi0JewotCQltX3BGb250TWFwID0gbmV3IENCQV9Gb250TWFwKG1fcFdpZGdldCwgbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCkpOwotCQltX3BGb250TWFwLT5Jbml0aWFsKCk7Ci0JfQotCWNwLnBGb250TWFwID0gbV9wRm9udE1hcDsKKyAgcFduZC0+U2V0VG9wVmlzaWJsZUluZGV4KG1fcFdpZGdldC0+R2V0VG9wVmlzaWJsZUluZGV4KCkpOwogCi0JcmV0dXJuIGNwOworICByZXR1cm4gcFduZDsKIH0KIAotQ1BXTF9XbmQqIENGRkxfTGlzdEJveDo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlDUFdMX0xpc3RCb3gqIHBXbmQgPSBuZXcgQ1BXTF9MaXN0Qm94KCk7Ci0JcFduZC0+QXR0YWNoRkZMRGF0YSh0aGlzKTsKLQlwV25kLT5DcmVhdGUoY3ApOwotCi0JQVNTRVJUKG1fcEFwcCAhPSBOVUxMKTsKLQlDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7Ci0JcFduZC0+U2V0RmlsbGVyTm90aWZ5KHBJRm9ybUZpbGxlcik7Ci0KLQlmb3IgKGludDMyX3QgaT0wLHN6PW1fcFdpZGdldC0+Q291bnRPcHRpb25zKCk7IGk8c3o7IGkrKykKLQkJcFduZC0+QWRkU3RyaW5nKG1fcFdpZGdldC0+R2V0T3B0aW9uTGFiZWwoaSkuY19zdHIoKSk7Ci0KLQlpZiAocFduZC0+SGFzRmxhZyhQTEJTX01VTFRJUExFU0VMKSkKLQl7Ci0JCW1fT3JpZ2luU2VsZWN0aW9ucy5jbGVhcigpOwotCi0JCUZYX0JPT0wgYlNldENhcmV0ID0gRkFMU0U7Ci0JCWZvciAoaW50MzJfdCBpPTAsc3o9bV9wV2lkZ2V0LT5Db3VudE9wdGlvbnMoKTsgaTxzejsgaSsrKQotCQl7Ci0JCQlpZiAobV9wV2lkZ2V0LT5Jc09wdGlvblNlbGVjdGVkKGkpKQotCQkJewotCQkJCWlmICghYlNldENhcmV0KQotCQkJCXsKLQkJCQkJcFduZC0+U2V0Q2FyZXQoaSk7Ci0JCQkJCWJTZXRDYXJldCA9IFRSVUU7Ci0JCQkJfQotCQkJCXBXbmQtPlNlbGVjdChpKTsKLQkJCQltX09yaWdpblNlbGVjdGlvbnMuaW5zZXJ0KGkpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWZvciAoaW50IGk9MCxzej1tX3BXaWRnZXQtPkNvdW50T3B0aW9ucygpOyBpPHN6OyBpKyspCi0JCXsKLQkJCWlmIChtX3BXaWRnZXQtPklzT3B0aW9uU2VsZWN0ZWQoaSkpCi0JCQl7Ci0JCQkJcFduZC0+U2VsZWN0KGkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcFduZC0+U2V0VG9wVmlzaWJsZUluZGV4KG1fcFdpZGdldC0+R2V0VG9wVmlzaWJsZUluZGV4KCkpOwotCi0JcmV0dXJuIHBXbmQ7CitGWF9CT09MIENGRkxfTGlzdEJveDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MpIHsKKyAgcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiB9CiAKK0ZYX0JPT0wgQ0ZGTF9MaXN0Qm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworICBpZiAoIXBMaXN0Qm94KQorICAgIHJldHVybiBGQUxTRTsKIAotRlhfQk9PTAlDRkZMX0xpc3RCb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQotewotCXJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOworICBpZiAobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpIHsKKyAgICBpbnQgblNlbENvdW50ID0gMDsKKyAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gcExpc3RCb3gtPkdldENvdW50KCk7IGkgPCBzejsgKytpKSB7CisgICAgICBpZiAocExpc3RCb3gtPklzSXRlbVNlbGVjdGVkKGkpKSB7CisgICAgICAgIGlmIChtX09yaWdpblNlbGVjdGlvbnMuY291bnQoaSkgPT0gMCkKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICBuU2VsQ291bnQrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gblNlbENvdW50ICE9IG1fT3JpZ2luU2VsZWN0aW9ucy5zaXplKCk7CisgIH0KKyAgcmV0dXJuIHBMaXN0Qm94LT5HZXRDdXJTZWwoKSAhPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9MaXN0Qm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLSAgICBDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOwotICAgIGlmICghcExpc3RCb3gpCi0gICAgICAgIHJldHVybiBGQUxTRTsKK3ZvaWQgQ0ZGTF9MaXN0Qm94OjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKKworICBpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIENGWF9JbnRBcnJheSBhT2xkU2VsZWN0LCBhTmV3U2VsZWN0OworCisgICAgeworICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9wV2lkZ2V0LT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgaWYgKG1fcFdpZGdldC0+SXNPcHRpb25TZWxlY3RlZChpKSkgeworICAgICAgICAgIGFPbGRTZWxlY3QuQWRkKGkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBuTmV3VG9wSW5kZXggPSBwTGlzdEJveC0+R2V0VG9wVmlzaWJsZUluZGV4KCk7CisKKyAgICBtX3BXaWRnZXQtPkNsZWFyU2VsZWN0aW9uKEZBTFNFKTsKIAogICAgIGlmIChtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkgewotICAgICAgICBpbnQgblNlbENvdW50ID0gMDsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IHBMaXN0Qm94LT5HZXRDb3VudCgpOyBpIDwgc3o7ICsraSkgewotICAgICAgICAgICAgaWYgKHBMaXN0Qm94LT5Jc0l0ZW1TZWxlY3RlZChpKSkgewotICAgICAgICAgICAgICAgIGlmIChtX09yaWdpblNlbGVjdGlvbnMuY291bnQoaSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICAgICAgICAgICAgICBuU2VsQ291bnQrKzsKLSAgICAgICAgICAgIH0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBwTGlzdEJveC0+R2V0Q291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgaWYgKHBMaXN0Qm94LT5Jc0l0ZW1TZWxlY3RlZChpKSkgeworICAgICAgICAgIG1fcFdpZGdldC0+U2V0T3B0aW9uU2VsZWN0aW9uKGksIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgICBhTmV3U2VsZWN0LkFkZChpKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuU2VsQ291bnQgIT0gbV9PcmlnaW5TZWxlY3Rpb25zLnNpemUoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24ocExpc3RCb3gtPkdldEN1clNlbCgpLCBUUlVFLCBGQUxTRSk7CisgICAgICBhTmV3U2VsZWN0LkFkZChwTGlzdEJveC0+R2V0Q3VyU2VsKCkpOwogICAgIH0KLSAgICByZXR1cm4gcExpc3RCb3gtPkdldEN1clNlbCgpICE9IG1fcFdpZGdldC0+R2V0U2VsZWN0ZWRJbmRleCgwKTsKKworICAgIG1fcFdpZGdldC0+U2V0VG9wVmlzaWJsZUluZGV4KG5OZXdUb3BJbmRleCk7CisgICAgbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZShUUlVFKTsKKyAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CisgICAgU2V0Q2hhbmdlTWFyaygpOworICB9CiB9CiAKLXZvaWQgQ0ZGTF9MaXN0Qm94OjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0JQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLQotCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsKLQkJQ0ZYX0ludEFycmF5IGFPbGRTZWxlY3QsIGFOZXdTZWxlY3Q7Ci0KLQkJewotCQkJZm9yIChpbnQgaT0wLHN6PW1fcFdpZGdldC0+Q291bnRPcHRpb25zKCk7IGk8c3o7IGkrKykKLQkJCXsKLQkJCQlpZiAobV9wV2lkZ2V0LT5Jc09wdGlvblNlbGVjdGVkKGkpKQotCQkJCXsKLQkJCQkJYU9sZFNlbGVjdC5BZGQoaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQotCQlpbnQzMl90IG5OZXdUb3BJbmRleCA9IHBMaXN0Qm94LT5HZXRUb3BWaXNpYmxlSW5kZXgoKTsKLQotCQltX3BXaWRnZXQtPkNsZWFyU2VsZWN0aW9uKEZBTFNFKTsKLQotCQlpZiAobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpCi0JCXsKLQkJCWZvciAoaW50MzJfdCBpPTAsc3o9cExpc3RCb3gtPkdldENvdW50KCk7IGk8c3o7IGkrKykKLQkJCXsKLQkJCQlpZiAocExpc3RCb3gtPklzSXRlbVNlbGVjdGVkKGkpKQotCQkJCXsKLQkJCQkJbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24oaSwgVFJVRSwgRkFMU0UpOwotCQkJCQlhTmV3U2VsZWN0LkFkZChpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQltX3BXaWRnZXQtPlNldE9wdGlvblNlbGVjdGlvbihwTGlzdEJveC0+R2V0Q3VyU2VsKCksIFRSVUUsIEZBTFNFKTsKLQkJCWFOZXdTZWxlY3QuQWRkKHBMaXN0Qm94LT5HZXRDdXJTZWwoKSk7Ci0JCX0KLQotCQltX3BXaWRnZXQtPlNldFRvcFZpc2libGVJbmRleChuTmV3VG9wSW5kZXgpOwotCQltX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKFRSVUUpOwotCQltX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7Ci0JCVNldENoYW5nZU1hcmsoKTsKLQl9Cit2b2lkIENGRkxfTGlzdEJveDo6R2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGZhKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKKyAgICAgIGlmIChtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkgeworICAgICAgICBmYS5zVmFsdWUgPSBMIiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9CisgICAgICAgICAgICAgICAgKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgICAgICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKKyAgICAgICAgICBpbnQzMl90IG5DdXJTZWwgPSBwTGlzdEJveC0+R2V0Q3VyU2VsKCk7CisgICAgICAgICAgaWYgKG5DdXJTZWwgPj0gMCkKKyAgICAgICAgICAgIGZhLnNWYWx1ZSA9IG1fcFdpZGdldC0+R2V0T3B0aW9uTGFiZWwobkN1clNlbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXM6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkdldEZvY3VzOgorICAgICAgaWYgKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJU0VMRUNUKSB7CisgICAgICAgIGZhLnNWYWx1ZSA9IEwiIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CisgICAgICAgIGludDMyX3QgbkN1clNlbCA9IG1fcFdpZGdldC0+R2V0U2VsZWN0ZWRJbmRleCgwKTsKKyAgICAgICAgaWYgKG5DdXJTZWwgPj0gMCkKKyAgICAgICAgICBmYS5zVmFsdWUgPSBtX3BXaWRnZXQtPkdldE9wdGlvbkxhYmVsKG5DdXJTZWwpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLXZvaWQgQ0ZGTF9MaXN0Qm94OjpHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotCQkJCQkJUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSkKLXsKLQlzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKLQkJaWYgKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJU0VMRUNUKQotCQl7Ci0JCQlmYS5zVmFsdWUgPSBMIiI7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQkJCXsKLQkJCQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotCQkJCWludDMyX3QgbkN1clNlbCA9IHBMaXN0Qm94LT5HZXRDdXJTZWwoKTsKLQkJCQlpZiAobkN1clNlbCA+PSAwKQotCQkJCQlmYS5zVmFsdWUgPSBtX3BXaWRnZXQtPkdldE9wdGlvbkxhYmVsKG5DdXJTZWwpOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXM6Ci0JY2FzZSBDUERGX0FBY3Rpb246OkdldEZvY3VzOgotCQlpZiAobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpCi0JCXsKLQkJCWZhLnNWYWx1ZSA9IEwiIjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Ci0JCQlpbnQzMl90IG5DdXJTZWwgPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7Ci0JCQlpZiAobkN1clNlbCA+PSAwKQotCQkJCWZhLnNWYWx1ZSA9IG1fcFdpZGdldC0+R2V0T3B0aW9uTGFiZWwobkN1clNlbCk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQordm9pZCBDRkZMX0xpc3RCb3g6OlNldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSkge30KKwordm9pZCBDRkZMX0xpc3RCb3g6OlNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKworICBpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBwTGlzdEJveC0+R2V0Q291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIGlmIChwTGlzdEJveC0+SXNJdGVtU2VsZWN0ZWQoaSkpIHsKKyAgICAgICAgbV9TdGF0ZS5BZGQoaSk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLQotdm9pZCBDRkZMX0xpc3RCb3g6OlNldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCi0JCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpCi17Cit2b2lkIENGRkxfTGlzdEJveDo6UmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fU3RhdGUuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICAgIHBMaXN0Qm94LT5TZWxlY3QobV9TdGF0ZVtpXSk7CisgIH0KIH0KIAotdm9pZCBDRkZMX0xpc3RCb3g6OlNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0JQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKK0NQV0xfV25kKiBDRkZMX0xpc3RCb3g6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkgeworICBpZiAoYlJlc3RvcmVWYWx1ZSkKKyAgICBTYXZlU3RhdGUocFBhZ2VWaWV3KTsKIAotCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsKLQkJZm9yIChpbnQzMl90IGk9MCxzej1wTGlzdEJveC0+R2V0Q291bnQoKTsgaTxzejsgaSsrKQotCQl7Ci0JCQlpZiAocExpc3RCb3gtPklzSXRlbVNlbGVjdGVkKGkpKQotCQkJewotCQkJCW1fU3RhdGUuQWRkKGkpOwotCQkJfQotCQl9Ci0JfQorICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7CisKKyAgQ1BXTF9XbmQqIHBSZXQgPSBOVUxMOworCisgIGlmIChiUmVzdG9yZVZhbHVlKSB7CisgICAgUmVzdG9yZVN0YXRlKHBQYWdlVmlldyk7CisgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKyAgfSBlbHNlCisgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOworCisgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKKworICByZXR1cm4gcFJldDsKIH0KIAotdm9pZCBDRkZMX0xpc3RCb3g6OlJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0JaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JewotCQlmb3IgKGludCBpPTAsc3o9bV9TdGF0ZS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCXBMaXN0Qm94LT5TZWxlY3QobV9TdGF0ZVtpXSk7Ci0JfQordm9pZCBDRkZMX0xpc3RCb3g6Ok9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX0RXT1JEIG5GbGFnKSB7CisgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CisKKyAgaW50IG5GbGFncyA9IG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpOworCisgIGlmIChuRmxhZ3MgJiBGSUVMREZMQUdfQ09NTUlUT05TRUxDSEFOR0UpIHsKKyAgICBpZiAobV9iVmFsaWQpIHsKKyAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CisgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOworCisgICAgICBpZiAoQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFnKSkgeworICAgICAgICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7CisgICAgICAgIG1fYlZhbGlkID0gRkFMU0U7CisgICAgICB9CisgICAgfQorICB9CiB9Ci0KLUNQV0xfV25kKiBDRkZMX0xpc3RCb3g6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKQotewotCWlmIChiUmVzdG9yZVZhbHVlKQotCQlTYXZlU3RhdGUocFBhZ2VWaWV3KTsKLQotCURlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKLQotCUNQV0xfV25kKiBwUmV0ID0gTlVMTDsKLQotCWlmIChiUmVzdG9yZVZhbHVlKQotCXsKLQkJUmVzdG9yZVN0YXRlKHBQYWdlVmlldyk7Ci0JCXBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7Ci0JfQotCWVsc2UKLQkJcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOwotCi0JbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwotCi0JcmV0dXJuIHBSZXQ7Ci19Ci0KLXZvaWQgQ0ZGTF9MaXN0Qm94OjpPbktleVN0cm9rZShGWF9CT09MIGJLZXlEb3duLCBGWF9EV09SRCBuRmxhZykKLXsKLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotCi0JaW50IG5GbGFncyA9IG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpOwotCi0JaWYgKG5GbGFncyAmIEZJRUxERkxBR19DT01NSVRPTlNFTENIQU5HRSkKLQl7Ci0JCWlmIChtX2JWYWxpZCkKLQkJewotCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKLQkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0KLQkJCWlmIChDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWcpKQotCQkJewotCQkJCURlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKLQkJCQltX2JWYWxpZCA9IEZBTFNFOwotCQkJfQotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmNwcAppbmRleCA1OGEyMjAyLi5lMzQ4ZjhlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5jcHAKQEAgLTEwLDE2NCArMTAsMTY4IEBACiAvLyAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5oIgogLy8gI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTW9kdWxlLmgiCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGRkxfTm90aWZ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZGTF9Ob3RpZnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAogLy8jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDgwMCkKIAotQ0ZGTF9Ob3RpZnk6OkNGRkxfTm90aWZ5KENGRkxfRm9ybUZpbGxlciAqIHBGb3JtRmlsbGVyKSA6Ci0JbV9iRG9BY3Rpb25pbmcoRkFMU0UpLAotCW1fbk5vdGlmeUZsYWcoMCkKLXsKLQlBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7CitDRkZMX05vdGlmeTo6Q0ZGTF9Ob3RpZnkoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlcikKKyAgICA6IG1fYkRvQWN0aW9uaW5nKEZBTFNFKSwgbV9uTm90aWZ5RmxhZygwKSB7CisgIEFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKIH0KIAotQ0ZGTF9Ob3RpZnk6On5DRkZMX05vdGlmeSgpCi17CitDRkZMX05vdGlmeTo6fkNGRkxfTm90aWZ5KCkge30KKwordm9pZCBDRkZMX05vdGlmeTo6QmVmb3JlTm90aWZ5KCkgeworICBtX25Ob3RpZnlGbGFnKys7CiB9CiAKLXZvaWQgQ0ZGTF9Ob3RpZnk6OkJlZm9yZU5vdGlmeSgpCi17Ci0JbV9uTm90aWZ5RmxhZyArKzsKK3ZvaWQgQ0ZGTF9Ob3RpZnk6OkFmdGVyTm90aWZ5KCkgeworICBtX25Ob3RpZnlGbGFnLS07CiB9CiAKLQotdm9pZCBDRkZMX05vdGlmeTo6QWZ0ZXJOb3RpZnkoKQotewotCW1fbk5vdGlmeUZsYWcgLS07CitGWF9CT09MIENGRkxfTm90aWZ5OjpPbk1vdXNlVXAoRlhfQk9PTCYgYkV4aXQpIHsKKyAgQmVmb3JlTm90aWZ5KCk7CisgIEZYX0JPT0wgYlJldCA9CisgICAgICBGQUxTRTsgIC8vIERvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpCdXR0b25VcCwgYkV4aXQpOworICBBZnRlck5vdGlmeSgpOworICByZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTCBDRkZMX05vdGlmeTo6T25Nb3VzZVVwKEZYX0JPT0wgJiBiRXhpdCkKLXsKLQlCZWZvcmVOb3RpZnkoKTsKLQlGWF9CT09MIGJSZXQgPSBGQUxTRTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpCdXR0b25VcCwgYkV4aXQpOwotCUFmdGVyTm90aWZ5KCk7Ci0JcmV0dXJuIGJSZXQ7CitGWF9CT09MIENGRkxfTm90aWZ5OjpPbk1vdXNlRG93bihGWF9CT09MJiBiRXhpdCkgeworICBCZWZvcmVOb3RpZnkoKTsKKyAgRlhfQk9PTCBiUmV0ID0KKyAgICAgIEZBTFNFOyAgLy8gRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkJ1dHRvbkRvd24sIGJFeGl0KTsKKyAgQWZ0ZXJOb3RpZnkoKTsKKyAgcmV0dXJuIGJSZXQ7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VEb3duKEZYX0JPT0wgJiBiRXhpdCkKLXsKLQlCZWZvcmVOb3RpZnkoKTsKLQlGWF9CT09MIGJSZXQgPSBGQUxTRTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpCdXR0b25Eb3duLCBiRXhpdCk7Ci0JQWZ0ZXJOb3RpZnkoKTsKLQlyZXR1cm4gYlJldDsKK0ZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VFbnRlcihGWF9CT09MJiBiRXhpdCkgeworICBCZWZvcmVOb3RpZnkoKTsKKyAgRlhfQk9PTCBiUmV0ID0KKyAgICAgIEZBTFNFOyAgLy8gRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkN1cnNvckVudGVyLCBiRXhpdCk7CisgIEFmdGVyTm90aWZ5KCk7CisgIHJldHVybiBiUmV0OwogfQogCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPbk1vdXNlRW50ZXIoRlhfQk9PTCAmIGJFeGl0KQotewotCUJlZm9yZU5vdGlmeSgpOwotCUZYX0JPT0wgYlJldCA9IEZBTFNFOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkN1cnNvckVudGVyLCBiRXhpdCk7Ci0JQWZ0ZXJOb3RpZnkoKTsKLQlyZXR1cm4gYlJldDsKK0ZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VFeGl0KEZYX0JPT0wmIGJFeGl0KSB7CisgIEJlZm9yZU5vdGlmeSgpOworICBGWF9CT09MIGJSZXQgPQorICAgICAgRkFMU0U7ICAvLyBEb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6Q3Vyc29yRXhpdCwgYkV4aXQpOworICBBZnRlck5vdGlmeSgpOworICByZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTCBDRkZMX05vdGlmeTo6T25Nb3VzZUV4aXQoRlhfQk9PTCAmIGJFeGl0KQotewotCUJlZm9yZU5vdGlmeSgpOwotCUZYX0JPT0wgYlJldCA9IEZBTFNFOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkN1cnNvckV4aXQsIGJFeGl0KTsKLQlBZnRlck5vdGlmeSgpOwotCXJldHVybiBiUmV0OworRlhfQk9PTCBDRkZMX05vdGlmeTo6T25TZXRGb2N1cyhGWF9CT09MJiBiRXhpdCkgeworICBCZWZvcmVOb3RpZnkoKTsKKyAgRlhfQk9PTCBiUmV0ID0KKyAgICAgIEZBTFNFOyAgLy8gRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkdldEZvY3VzLCBiRXhpdCk7CisgIEFmdGVyTm90aWZ5KCk7CisgIHJldHVybiBiUmV0OwogfQogCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPblNldEZvY3VzKEZYX0JPT0wgJiBiRXhpdCkKLXsKLQlCZWZvcmVOb3RpZnkoKTsKLQlGWF9CT09MIGJSZXQgPSBGQUxTRTsvL0RvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlOjpHZXRGb2N1cywgYkV4aXQpOwotCUFmdGVyTm90aWZ5KCk7Ci0JcmV0dXJuIGJSZXQ7CitGWF9CT09MIENGRkxfTm90aWZ5OjpPbktpbGxGb2N1cyhGWF9CT09MJiBiRXhpdCkgeworICBCZWZvcmVOb3RpZnkoKTsKKyAgRlhfQk9PTCBiUmV0ID0KKyAgICAgIEZBTFNFOyAgLy8gRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6Okxvc2VGb2N1cywgYkV4aXQpOworICBBZnRlck5vdGlmeSgpOworICByZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTCBDRkZMX05vdGlmeTo6T25LaWxsRm9jdXMoRlhfQk9PTCAmIGJFeGl0KQotewotCUJlZm9yZU5vdGlmeSgpOwotCUZYX0JPT0wgYlJldCA9IEZBTFNFOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6Okxvc2VGb2N1cywgYkV4aXQpOwotCUFmdGVyTm90aWZ5KCk7Ci0JcmV0dXJuIGJSZXQ7CitGWF9CT09MIENGRkxfTm90aWZ5OjpPbkNhbGN1bGF0ZSgpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uQ2FsY3VsYXRlKCkKLXsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uRm9ybWF0KGludCBpQ29tbWl0S2V5KSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPbkZvcm1hdChpbnQgaUNvbW1pdEtleSkKLXsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uS2V5U3Ryb2tlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db21taXRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc3RyVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWxsQ29tbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmllbGRGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUkMpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uS2V5U3Ryb2tlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBpbnQgbkNvbW1pdEtleSwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsCi0JCQkJCQkJICAgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYldpbGxDb21taXQsIEZYX0JPT0wgYkZpZWxkRnVsbCwKLQkJCQkJCQkgICBpbnQmIG5TZWxTdGFydCwgaW50JiBuU2VsRW5kLCBGWF9CT09MJiBiUkMpCi17Ci0JcmV0dXJuIFRSVUU7CitGWF9CT09MIENGRkxfTm90aWZ5OjpPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc3RyVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUkMpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uVmFsaWRhdGUoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcgJiBzdHJDaGFuZ2UsCi0JCQkJCQkJCQkgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLAotCQkJCQkJCQkJICAgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgJiBiUkMpCi17Ci0JcmV0dXJuIFRSVUU7CitGWF9CT09MIENGRkxfTm90aWZ5OjpEb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULCBGWF9CT09MJiBiRXhpdCkgeworICBpZiAobV9iRG9BY3Rpb25pbmcpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZfQWN0aW9uIGFjdGlvbjsKKyAgaWYgKCFGaW5kQUFjdGlvbihlQUFULCBhY3Rpb24pKQorICAgIHJldHVybiBGQUxTRTsKKworICBtX2JEb0FjdGlvbmluZyA9IFRSVUU7CisgIEV4ZWN1dGVBY3Rpb25UcmVlKGVBQVQsIGFjdGlvbiwgYkV4aXQpOworICBtX2JEb0FjdGlvbmluZyA9IEZBTFNFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTAlDRkZMX05vdGlmeTo6RG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgRlhfQk9PTCAmIGJFeGl0KQotewotICAgIGlmIChtX2JEb0FjdGlvbmluZykKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgQ1BERl9BY3Rpb24gYWN0aW9uOwotICAgIGlmICghRmluZEFBY3Rpb24oZUFBVCwgYWN0aW9uKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgbV9iRG9BY3Rpb25pbmcgPSBUUlVFOwotICAgIEV4ZWN1dGVBY3Rpb25UcmVlKGVBQVQsYWN0aW9uLGJFeGl0KTsKLSAgICBtX2JEb0FjdGlvbmluZyA9IEZBTFNFOworRlhfQk9PTCBDRkZMX05vdGlmeTo6RXhlY3V0ZUFjdGlvblRyZWUoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0KSB7CisgIGlmICghRXhlY3V0ZUFjdGlvbihlQUFULCBhY3Rpb24sIGJFeGl0KSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChiRXhpdCkKICAgICByZXR1cm4gVFJVRTsKKworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gYWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgIENQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7CisgICAgaWYgKCFFeGVjdXRlQWN0aW9uVHJlZShlQUFULCBzdWJhY3Rpb24sIGJFeGl0KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoYkV4aXQpCisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MCUNGRkxfTm90aWZ5OjpFeGVjdXRlQWN0aW9uVHJlZShDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24sIEZYX0JPT0wmIGJFeGl0KQotewotCWlmICghRXhlY3V0ZUFjdGlvbihlQUFULGFjdGlvbixiRXhpdCkpIHJldHVybiBGQUxTRTsKLQlpZiAoYkV4aXQpIHJldHVybiBUUlVFOwotCi0JZm9yIChpbnQzMl90IGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKLQl7Ci0JCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZUFjdGlvblRyZWUoZUFBVCxzdWJhY3Rpb24sYkV4aXQpKSByZXR1cm4gRkFMU0U7Ci0JCWlmIChiRXhpdCkgYnJlYWs7Ci0JfQotCi0JcmV0dXJuIFRSVUU7CitGWF9CT09MIENGRkxfTm90aWZ5OjpGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FjdGlvbiYgYWN0aW9uKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAorRlhfQk9PTCBDRkZMX05vdGlmeTo6RmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uIGFhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FjdGlvbiYgYWN0aW9uKSB7CisgIENQREZfQWN0aW9uIE15QWN0aW9uOwogCi1GWF9CT09MCUNGRkxfTm90aWZ5OjpGaW5kQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pCi17Ci0JcmV0dXJuIEZBTFNFOworICBpZiAoYWFjdGlvbi5BY3Rpb25FeGlzdChlQUFUKSkgeworICAgIE15QWN0aW9uID0gYWFjdGlvbi5HZXRBY3Rpb24oZUFBVCk7CisgIH0gZWxzZQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoTXlBY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpVbmtub3duKQorICAgIHJldHVybiBGQUxTRTsKKworICBhY3Rpb24gPSBNeUFjdGlvbjsKKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDRkZMX05vdGlmeTo6RmluZEFBY3Rpb24oQ1BERl9BQWN0aW9uIGFhY3Rpb24sQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uKQotewotCUNQREZfQWN0aW9uIE15QWN0aW9uOwotCi0JaWYgKGFhY3Rpb24uQWN0aW9uRXhpc3QoZUFBVCkpCi0JewotCQlNeUFjdGlvbiA9IGFhY3Rpb24uR2V0QWN0aW9uKGVBQVQpOwotCX0KLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLQotCi0JaWYgKE15QWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6VW5rbm93bikKLQkJcmV0dXJuIEZBTFNFOwotCi0JYWN0aW9uID0gTXlBY3Rpb247Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTAlDRkZMX05vdGlmeTo6RXhlY3V0ZUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24sRlhfQk9PTCYgYkV4aXQpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDRkZMX05vdGlmeTo6RXhlY3V0ZUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0KSB7CisgIHJldHVybiBGQUxTRTsKIH0KIC8vI3ByYWdtYSB3YXJuaW5nKGRlZmF1bHQ6IDQ4MDApCi0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKaW5kZXggYTVkZjQ4OC4uNTMzZDc4NiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKQEAgLTgsMzYgKzgsMzMgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uaCIKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRkZMX1B1c2hCdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRkZMX1B1c2hCdXR0b24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ0ZGTF9QdXNoQnV0dG9uOjpDRkZMX1B1c2hCdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcEFubm90KToKLQlDRkZMX0J1dHRvbiggcEFwcCwgcEFubm90KQoteworQ0ZGTF9QdXNoQnV0dG9uOjpDRkZMX1B1c2hCdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkKKyAgICA6IENGRkxfQnV0dG9uKHBBcHAsIHBBbm5vdCkge30KKworQ0ZGTF9QdXNoQnV0dG9uOjp+Q0ZGTF9QdXNoQnV0dG9uKCkge30KKworQ1BXTF9XbmQqIENGRkxfUHVzaEJ1dHRvbjo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIENQV0xfUHVzaEJ1dHRvbiogcFduZCA9IG5ldyBDUFdMX1B1c2hCdXR0b24oKTsKKyAgcFduZC0+Q3JlYXRlKGNwKTsKKworICByZXR1cm4gcFduZDsKIH0KIAotQ0ZGTF9QdXNoQnV0dG9uOjp+Q0ZGTF9QdXNoQnV0dG9uKCkKLXsKK0ZYX0JPT0wgQ0ZGTF9QdXNoQnV0dG9uOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncykgeworICByZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIH0KIAotQ1BXTF9XbmQqIENGRkxfUHVzaEJ1dHRvbjo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlDUFdMX1B1c2hCdXR0b24qIHBXbmQgPSBuZXcgQ1BXTF9QdXNoQnV0dG9uKCk7Ci0JcFduZC0+Q3JlYXRlKGNwKTsKLQotCXJldHVybiBwV25kOwordm9pZCBDRkZMX1B1c2hCdXR0b246Ok9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgeworICBDRkZMX0J1dHRvbjo6T25EcmF3KHBQYWdlVmlldywgcEFubm90LCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIGR3RmxhZ3MpOwogfQotCi0KLUZYX0JPT0wJQ0ZGTF9QdXNoQnV0dG9uOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKLXsKLQlyZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKLX0KLQotdm9pZCBDRkZMX1B1c2hCdXR0b246Ok9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0JCQkJCQkJIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJIEZYX0RXT1JEIGR3RmxhZ3MpCi17Ci0JQ0ZGTF9CdXR0b246Ok9uRHJhdyhwUGFnZVZpZXcsIHBBbm5vdCwgcERldmljZSwgcFVzZXIyRGV2aWNlLCBkd0ZsYWdzKTsKLX0KLQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5jcHAKaW5kZXggMWY3M2U4Yy4uN2M0ZjlhOSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmNwcApAQCAtOSwxMjkgKzksMTI0IEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5oIgogLy8jaW5jbHVkZSAiLi4vaW5jbHVkZS9GRkxfVW5kby5oIgogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGRkxfUmFkaW9CdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRkZMX1JhZGlvQnV0dG9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNGRkxfUmFkaW9CdXR0b246OkNGRkxfUmFkaW9CdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcFdpZGdldCkgOgotCUNGRkxfQnV0dG9uKHBBcHAsIHBXaWRnZXQpCi17CitDRkZMX1JhZGlvQnV0dG9uOjpDRkZMX1JhZGlvQnV0dG9uKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBXaWRnZXQpCisgICAgOiBDRkZMX0J1dHRvbihwQXBwLCBwV2lkZ2V0KSB7fQorCitDRkZMX1JhZGlvQnV0dG9uOjp+Q0ZGTF9SYWRpb0J1dHRvbigpIHt9CisKK0NQV0xfV25kKiBDRkZMX1JhZGlvQnV0dG9uOjpOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIENQV0xfUmFkaW9CdXR0b24qIHBXbmQgPSBuZXcgQ1BXTF9SYWRpb0J1dHRvbigpOworICBwV25kLT5DcmVhdGUoY3ApOworCisgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CisgIHBXbmQtPlNldENoZWNrKG1fcFdpZGdldC0+SXNDaGVja2VkKCkpOworCisgIHJldHVybiBwV25kOwogfQogCi1DRkZMX1JhZGlvQnV0dG9uOjp+Q0ZGTF9SYWRpb0J1dHRvbigpCi17CitGWF9CT09MIENGRkxfUmFkaW9CdXR0b246Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MpIHsKKyAgc3dpdGNoIChuS2V5Q29kZSkgeworICAgIGNhc2UgRldMX1ZLRVlfUmV0dXJuOgorICAgIGNhc2UgRldMX1ZLRVlfU3BhY2U6CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFncyk7CisgIH0KIH0KIAotQ1BXTF9XbmQqIENGRkxfUmFkaW9CdXR0b246Ok5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0JQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IG5ldyBDUFdMX1JhZGlvQnV0dG9uKCk7Ci0JcFduZC0+Q3JlYXRlKGNwKTsKK0ZYX0JPT0wgQ0ZGTF9SYWRpb0J1dHRvbjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncykgeworICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46CisgICAgY2FzZSBGV0xfVktFWV9TcGFjZTogeworICAgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gbV9wQXBwLT5HZXRJRm9ybUZpbGxlcigpOworICAgICAgQVNTRVJUKHBJRm9ybUZpbGxlciAhPSBOVUxMKTsKIAotCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Ci0JcFduZC0+U2V0Q2hlY2sobV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKSk7CisgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7CisgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0JcmV0dXJuIHBXbmQ7CisgICAgICBGWF9CT09MIGJSZXNldCA9IEZBTFNFOworICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworCisgICAgICBwSUZvcm1GaWxsZXItPk9uQnV0dG9uVXAobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsIG5GbGFncyk7CisKKyAgICAgIGlmIChiUmVzZXQpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgaWYgKGJFeGl0KQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKKworICAgICAgaWYgKENQV0xfUmFkaW9CdXR0b24qIHBXbmQgPQorICAgICAgICAgICAgICAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisgICAgICAgIHBXbmQtPlNldENoZWNrKFRSVUUpOworICAgICAgQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOworICB9CiB9CiAKLUZYX0JPT0wJQ0ZGTF9SYWRpb0J1dHRvbjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCi17Ci0Jc3dpdGNoIChuS2V5Q29kZSkKLQl7Ci0JY2FzZSBGV0xfVktFWV9SZXR1cm46Ci0JY2FzZSBGV0xfVktFWV9TcGFjZToKLQkJcmV0dXJuIFRSVUU7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFncyk7Ci0JfQorRlhfQk9PTCBDRkZMX1JhZGlvQnV0dG9uOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIENGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIGlmIChDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0KKyAgICAgICAgICAgIChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKKyAgICAgIHBXbmQtPlNldENoZWNrKFRSVUUpOworCisgICAgaWYgKCFDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWdzKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MCUNGRkxfUmFkaW9CdXR0b246Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQotewotCXN3aXRjaCAobkNoYXIpCi0JewotCWNhc2UgRldMX1ZLRVlfUmV0dXJuOgotCWNhc2UgRldMX1ZLRVlfU3BhY2U6Ci0JCXsKLQkJCUNGRkxfSUZvcm1GaWxsZXIqIHBJRm9ybUZpbGxlciA9IG1fcEFwcC0+R2V0SUZvcm1GaWxsZXIoKTsKLQkJCUFTU0VSVChwSUZvcm1GaWxsZXIgIT0gTlVMTCk7CitGWF9CT09MIENGRkxfUmFkaW9CdXR0b246OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CiAKLQkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKLQkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisgIGlmIChDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0KKyAgICAgICAgICAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgcmV0dXJuIHBXbmQtPklzQ2hlY2tlZCgpICE9IG1fcFdpZGdldC0+SXNDaGVja2VkKCk7CisgIH0KIAotCQkJRlhfQk9PTCBiUmVzZXQgPSBGQUxTRTsKLQkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQotCQkJcElGb3JtRmlsbGVyLT5PbkJ1dHRvblVwKG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiUmVzZXQsIGJFeGl0LG5GbGFncyk7Ci0KLQkJCWlmIChiUmVzZXQpIHJldHVybiBUUlVFOwotCQkJaWYgKGJFeGl0KSByZXR1cm4gVFJVRTsKLQotCQkJQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKLQotCQkJaWYgKENQV0xfUmFkaW9CdXR0b24gKiBwV25kID0gKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQotCQkJCXBXbmQtPlNldENoZWNrKFRSVUUpOwotCQkJQ29tbWl0RGF0YShwUGFnZVZpZXcsbkZsYWdzKTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7Ci0JfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlDRkZMX0J1dHRvbjo6T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwordm9pZCBDRkZMX1JhZGlvQnV0dG9uOjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIAotCWlmIChJc1ZhbGlkKCkpCi0JewotCQlpZiAoQ1BXTF9SYWRpb0J1dHRvbiAqIHBXbmQgPSAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCi0JCQlwV25kLT5TZXRDaGVjayhUUlVFKTsKKyAgaWYgKENQV0xfUmFkaW9CdXR0b24qIHBXbmQgPQorICAgICAgICAgIChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICBGWF9CT09MIGJOZXdDaGVja2VkID0gcFduZC0+SXNDaGVja2VkKCk7CiAKLQkJaWYgKCFDb21taXREYXRhKHBQYWdlVmlldyxuRmxhZ3MpKSByZXR1cm4gRkFMU0U7Ci0JfQorICAgIGlmIChiTmV3Q2hlY2tlZCkgeworICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCk7CisgICAgICBBU1NFUlQocEZpZWxkICE9IE5VTEwpOwogCi0JcmV0dXJuIFRSVUU7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gcEZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKSkgeworICAgICAgICAgIGlmIChwQ3RybC0+SXNDaGVja2VkKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIG1fcFdpZGdldC0+U2V0Q2hlY2soYk5ld0NoZWNrZWQsIEZBTFNFKTsKKyAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CisgICAgU2V0Q2hhbmdlTWFyaygpOworICB9CiB9Ci0KLUZYX0JPT0wJQ0ZGTF9SYWRpb0J1dHRvbjo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0JQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLQotCWlmIChDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0gKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQl7Ci0JCXJldHVybiBwV25kLT5Jc0NoZWNrZWQoKSAhPSBtX3BXaWRnZXQtPklzQ2hlY2tlZCgpOwotCX0KLQotCXJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBDRkZMX1JhZGlvQnV0dG9uOjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0JQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLQotCWlmIChDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0gKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQl7Ci0KLQkJRlhfQk9PTCBiTmV3Q2hlY2tlZCA9IHBXbmQtPklzQ2hlY2tlZCgpOwotCi0JCWlmIChiTmV3Q2hlY2tlZCkKLQkJewotCQkJQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCk7Ci0JCQlBU1NFUlQocEZpZWxkICE9IE5VTEwpOwotCi0JCQlmb3IgKGludDMyX3QgaT0wLHN6PXBGaWVsZC0+Q291bnRDb250cm9scygpOyBpPHN6OyBpKyspCi0JCQl7Ci0JCQkJaWYgKENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gcEZpZWxkLT5HZXRDb250cm9sKGkpKQotCQkJCXsKLQkJCQkJaWYgKHBDdHJsLT5Jc0NoZWNrZWQoKSkKLQkJCQkJewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQltX3BXaWRnZXQtPlNldENoZWNrKGJOZXdDaGVja2VkLCBGQUxTRSk7Ci0JCW1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKLQkJU2V0Q2hhbmdlTWFyaygpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5jcHAKaW5kZXggZGJjZjRlNS4uMzhkNzRmMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuY3BwCkBAIC03LDM4MCArNywzMTcgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuaCIKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRkZMX1RleHRGaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGRkxfVGV4dEZpZWxkCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNGRkxfVGV4dEZpZWxkOjpDRkZMX1RleHRGaWVsZChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpIDoKLSAgICBDRkZMX0Zvcm1GaWxsZXIocEFwcCwgcEFubm90KSwKLSAgICBtX3BGb250TWFwKE5VTEwpLy8sCi0gICAgLy9tX3BTcGVsbENoZWNrKE5VTEwpCitDRkZMX1RleHRGaWVsZDo6Q0ZGTF9UZXh0RmllbGQoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcEFubm90KQorICAgIDogQ0ZGTF9Gb3JtRmlsbGVyKHBBcHAsIHBBbm5vdCksCisgICAgICBtX3BGb250TWFwKE5VTEwpICAvLywKKy8vIG1fcFNwZWxsQ2hlY2soTlVMTCkKIHsKLSAgICBtX1N0YXRlLm5TdGFydCA9IG1fU3RhdGUubkVuZCA9IDA7CisgIG1fU3RhdGUublN0YXJ0ID0gbV9TdGF0ZS5uRW5kID0gMDsKIH0KIAotQ0ZGTF9UZXh0RmllbGQ6On5DRkZMX1RleHRGaWVsZCgpCi17Ci0gICAgZGVsZXRlIG1fcEZvbnRNYXA7CitDRkZMX1RleHRGaWVsZDo6fkNGRkxfVGV4dEZpZWxkKCkgeworICBkZWxldGUgbV9wRm9udE1hcDsKIH0KIAotUFdMX0NSRUFURVBBUkFNIENGRkxfVGV4dEZpZWxkOjpHZXRDcmVhdGVQYXJhbSgpCi17Ci0gICAgUFdMX0NSRUFURVBBUkFNIGNwID0gQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRDcmVhdGVQYXJhbSgpOworUFdMX0NSRUFURVBBUkFNIENGRkxfVGV4dEZpZWxkOjpHZXRDcmVhdGVQYXJhbSgpIHsKKyAgUFdMX0NSRUFURVBBUkFNIGNwID0gQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRDcmVhdGVQYXJhbSgpOwogCi0gICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLSAgICBpbnQgbkZsYWdzID0gbV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCk7CisgIEFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CisgIGludCBuRmxhZ3MgPSBtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKIAorICBpZiAobkZsYWdzICYgRklFTERGTEFHX1BBU1NXT1JEKSB7CisgICAgY3AuZHdGbGFncyB8PSBQRVNfUEFTU1dPUkQ7CisgIH0KIAotICAgIGlmIChuRmxhZ3MgJiBGSUVMREZMQUdfUEFTU1dPUkQpCi0gICAgewotICAgICAgICBjcC5kd0ZsYWdzIHw9IFBFU19QQVNTV09SRDsKKyAgaWYgKCEobkZsYWdzICYgRklFTERGTEFHX0RPTk9UU1BFTExDSEVDSykpIHsKKyAgfQorCisgIGlmIChuRmxhZ3MgJiBGSUVMREZMQUdfTVVMVElMSU5FKSB7CisgICAgY3AuZHdGbGFncyB8PSBQRVNfTVVMVElMSU5FIHwgUEVTX0FVVE9SRVRVUk4gfCBQRVNfVE9QOworCisgICAgaWYgKCEobkZsYWdzICYgRklFTERGTEFHX0RPTk9UU0NST0xMKSkgeworICAgICAgY3AuZHdGbGFncyB8PSBQV1NfVlNDUk9MTCB8IFBFU19BVVRPU0NST0xMOwogICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjcC5kd0ZsYWdzIHw9IFBFU19DRU5URVI7CiAKLSAgICBpZiAoIShuRmxhZ3MgJiBGSUVMREZMQUdfRE9OT1RTUEVMTENIRUNLKSkKLSAgICB7CisgICAgaWYgKCEobkZsYWdzICYgRklFTERGTEFHX0RPTk9UU0NST0xMKSkgeworICAgICAgY3AuZHdGbGFncyB8PSBQRVNfQVVUT1NDUk9MTDsKICAgICB9CisgIH0KIAotICAgIGlmIChuRmxhZ3MgJiBGSUVMREZMQUdfTVVMVElMSU5FKQotICAgIHsKLSAgICAgICAgY3AuZHdGbGFncyB8PSBQRVNfTVVMVElMSU5FIHwgUEVTX0FVVE9SRVRVUk4gfCBQRVNfVE9QOworICBpZiAobkZsYWdzICYgRklFTERGTEFHX0NPTUIpIHsKKyAgICBjcC5kd0ZsYWdzIHw9IFBFU19DSEFSQVJSQVk7CisgIH0KIAotICAgICAgICBpZiAoIShuRmxhZ3MgJiBGSUVMREZMQUdfRE9OT1RTQ1JPTEwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcC5kd0ZsYWdzIHw9IFBXU19WU0NST0xMIHwgUEVTX0FVVE9TQ1JPTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3AuZHdGbGFncyB8PSBQRVNfQ0VOVEVSOworICBpZiAobkZsYWdzICYgRklFTERGTEFHX1JJQ0hURVhUKSB7CisgICAgY3AuZHdGbGFncyB8PSBQRVNfUklDSDsKKyAgfQogCi0gICAgICAgIGlmICghKG5GbGFncyAmIEZJRUxERkxBR19ET05PVFNDUk9MTCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNwLmR3RmxhZ3MgfD0gUEVTX0FVVE9TQ1JPTEw7Ci0gICAgICAgIH0KLSAgICB9CisgIGNwLmR3RmxhZ3MgfD0gUEVTX1VORE87CiAKLSAgICBpZiAobkZsYWdzICYgRklFTERGTEFHX0NPTUIpCi0gICAgewotICAgICAgICBjcC5kd0ZsYWdzIHw9IFBFU19DSEFSQVJSQVk7Ci0gICAgfQotCi0gICAgaWYgKG5GbGFncyAmIEZJRUxERkxBR19SSUNIVEVYVCkKLSAgICB7Ci0gICAgICAgIGNwLmR3RmxhZ3MgfD0gUEVTX1JJQ0g7Ci0gICAgfQotCi0gICAgY3AuZHdGbGFncyB8PSBQRVNfVU5ETzsKLQotICAgIHN3aXRjaCAobV9wV2lkZ2V0LT5HZXRBbGlnbm1lbnQoKSkKLSAgICB7CisgIHN3aXRjaCAobV9wV2lkZ2V0LT5HZXRBbGlnbm1lbnQoKSkgewogICAgIGRlZmF1bHQ6CiAgICAgY2FzZSBCRl9BTElHTl9MRUZUOgotICAgICAgICBjcC5kd0ZsYWdzIHw9IFBFU19MRUZUOwotICAgICAgICBicmVhazsKKyAgICAgIGNwLmR3RmxhZ3MgfD0gUEVTX0xFRlQ7CisgICAgICBicmVhazsKICAgICBjYXNlIEJGX0FMSUdOX01JRERMRToKLSAgICAgICAgY3AuZHdGbGFncyB8PSBQRVNfTUlERExFOwotICAgICAgICBicmVhazsKKyAgICAgIGNwLmR3RmxhZ3MgfD0gUEVTX01JRERMRTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQkZfQUxJR05fUklHSFQ6Ci0gICAgICAgIGNwLmR3RmxhZ3MgfD0gUEVTX1JJR0hUOwotICAgICAgICBicmVhazsKLSAgICB9CisgICAgICBjcC5kd0ZsYWdzIHw9IFBFU19SSUdIVDsKKyAgICAgIGJyZWFrOworICB9CiAKLSAgICBpZiAoIW1fcEZvbnRNYXApCi0gICAgewotICAgICAgICBtX3BGb250TWFwID0gbmV3IENCQV9Gb250TWFwKG1fcFdpZGdldCwgbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCkpOwotICAgICAgICBtX3BGb250TWFwLT5Jbml0aWFsKCk7Ci0gICAgfQotICAgIGNwLnBGb250TWFwID0gbV9wRm9udE1hcDsKLSAgICBjcC5wRm9jdXNIYW5kbGVyID0gdGhpczsKKyAgaWYgKCFtX3BGb250TWFwKSB7CisgICAgbV9wRm9udE1hcCA9IG5ldyBDQkFfRm9udE1hcChtX3BXaWRnZXQsIG1fcEFwcC0+R2V0U3lzSGFuZGxlcigpKTsKKyAgICBtX3BGb250TWFwLT5Jbml0aWFsKCk7CisgIH0KKyAgY3AucEZvbnRNYXAgPSBtX3BGb250TWFwOworICBjcC5wRm9jdXNIYW5kbGVyID0gdGhpczsKIAotICAgIHJldHVybiBjcDsKKyAgcmV0dXJuIGNwOwogfQogCi1DUFdMX1duZCogQ0ZGTF9UZXh0RmllbGQ6Ok5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0gICAgQ1BXTF9FZGl0ICogcFduZCA9IG5ldyBDUFdMX0VkaXQoKTsKLSAgICAgICAgcFduZC0+QXR0YWNoRkZMRGF0YSh0aGlzKTsKLSAgICBwV25kLT5DcmVhdGUoY3ApOworQ1BXTF9XbmQqIENGRkxfVGV4dEZpZWxkOjpOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBDUFdMX0VkaXQqIHBXbmQgPSBuZXcgQ1BXTF9FZGl0KCk7CisgIHBXbmQtPkF0dGFjaEZGTERhdGEodGhpcyk7CisgIHBXbmQtPkNyZWF0ZShjcCk7CiAKKyAgQVNTRVJUKG1fcEFwcCAhPSBOVUxMKTsKKyAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gbV9wQXBwLT5HZXRJRm9ybUZpbGxlcigpOworICBwV25kLT5TZXRGaWxsZXJOb3RpZnkocElGb3JtRmlsbGVyKTsKIAorICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOworICBpbnQzMl90IG5NYXhMZW4gPSBtX3BXaWRnZXQtPkdldE1heExlbigpOworICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwogCi0gICAgQVNTRVJUKG1fcEFwcCAhPSBOVUxMKTsKLSAgICBDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7Ci0gICAgcFduZC0+U2V0RmlsbGVyTm90aWZ5KHBJRm9ybUZpbGxlcik7CisgIGlmIChuTWF4TGVuID4gMCkgeworICAgIGlmIChwV25kLT5IYXNGbGFnKFBFU19DSEFSQVJSQVkpKSB7CisgICAgICBwV25kLT5TZXRDaGFyQXJyYXkobk1heExlbik7CisgICAgICBwV25kLT5TZXRBbGlnbkZvcm1hdFYoUEVBVl9DRU5URVIpOworICAgIH0gZWxzZSB7CisgICAgICBwV25kLT5TZXRMaW1pdENoYXIobk1heExlbik7CisgICAgfQorICB9CiAKLSAgICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotICAgIGludDMyX3Qgbk1heExlbiA9IG1fcFdpZGdldC0+R2V0TWF4TGVuKCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZSA9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKKyAgcFduZC0+U2V0VGV4dChzd1ZhbHVlLmNfc3RyKCkpOworICByZXR1cm4gcFduZDsKK30KIAotICAgIGlmIChuTWF4TGVuID4gMCkKLSAgICB7Ci0gICAgICAgIGlmIChwV25kLT5IYXNGbGFnKFBFU19DSEFSQVJSQVkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwV25kLT5TZXRDaGFyQXJyYXkobk1heExlbik7Ci0gICAgICAgICAgICBwV25kLT5TZXRBbGlnbkZvcm1hdFYoUEVBVl9DRU5URVIpOworRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKSB7CisgIHN3aXRjaCAobkNoYXIpIHsKKyAgICBjYXNlIEZXTF9WS0VZX1JldHVybjoKKyAgICAgIGlmICghKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJTElORSkpIHsKKyAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKKyAgICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKyAgICAgICAgbV9iVmFsaWQgPSAhbV9iVmFsaWQ7CisgICAgICAgIENQREZfUmVjdCByY0Fubm90ID0gcEFubm90LT5HZXRSZWN0KCk7CisgICAgICAgIG1fcEFwcC0+RkZJX0ludmFsaWRhdGUocEFubm90LT5HZXRQREZYRkFQYWdlKCksIHJjQW5ub3QubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0Fubm90LnRvcCwgcmNBbm5vdC5yaWdodCwgcmNBbm5vdC5ib3R0b20pOworCisgICAgICAgIGlmIChtX2JWYWxpZCkgeworICAgICAgICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQorICAgICAgICAgICAgcFduZC0+U2V0Rm9jdXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncykpIHsKKyAgICAgICAgICAgIERlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFduZC0+U2V0TGltaXRDaGFyKG5NYXhMZW4pOwotICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX0VzY2FwZTogeworICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKKyAgICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisgICAgICBFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LCBUUlVFKTsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KKyAgfQogCi0gICAgcFduZC0+U2V0VGV4dChzd1ZhbHVlLmNfc3RyKCkpOwotICAgIHJldHVybiBwV25kOworICByZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIH0KIAorRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKIAotRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCi17Ci0Jc3dpdGNoIChuQ2hhcikKLQl7Ci0JY2FzZSBGV0xfVktFWV9SZXR1cm46Ci0gCQlpZiAoIShtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSUxJTkUpKQotIAkJewotIAkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7Ci0gCQkJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLSAJCQltX2JWYWxpZCA9ICFtX2JWYWxpZDsKLQkJCUNQREZfUmVjdCByY0Fubm90ID0gcEFubm90LT5HZXRSZWN0KCk7Ci0JCQltX3BBcHAtPkZGSV9JbnZhbGlkYXRlKHBBbm5vdC0+R2V0UERGWEZBUGFnZSgpLCByY0Fubm90LmxlZnQsIHJjQW5ub3QudG9wLCByY0Fubm90LnJpZ2h0LCByY0Fubm90LmJvdHRvbSk7CisgIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIHJldHVybiBwRWRpdC0+R2V0VGV4dCgpICE9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKIAotIAkJCWlmIChtX2JWYWxpZCkKLSAJCQl7Ci0gCQkJCWlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQotIAkJCQkJcFduZC0+U2V0Rm9jdXMoKTsKLSAJCQl9Ci0gCQkJZWxzZQotIAkJCXsKLSAJCQkJaWYgKENvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZ3MpKQotIAkJCQl7Ci0gCQkJCQlEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7Ci0gCQkJCQlyZXR1cm4gVFJVRTsKLSAJCQkJfQotIAkJCQllbHNlCi0gCQkJCXsKLSAJCQkJCXJldHVybiBGQUxTRTsKLSAJCQkJfQotIAkJCX0KLSAJCX0KLQkJYnJlYWs7Ci0JY2FzZSBGV0xfVktFWV9Fc2NhcGU6Ci0JCXsKLQkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7Ci0JCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotCQkJRXNjYXBlRmlsbGVyKHBQYWdlVmlldyxUUlVFKTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQotCi0JcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0gICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKK3ZvaWQgQ0ZGTF9UZXh0RmllbGQ6OlNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwogCi0gICAgaWYgKENQV0xfRWRpdCAqIHBFZGl0ID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotICAgICAgICByZXR1cm4gcEVkaXQtPkdldFRleHQoKSAhPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CisgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICBDRlhfV2lkZVN0cmluZyBzT2xkVmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc05ld1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIG1fcFdpZGdldC0+U2V0VmFsdWUoc05ld1ZhbHVlLCBGQUxTRSk7CisgICAgbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZShUUlVFKTsKKyAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CisgICAgU2V0Q2hhbmdlTWFyaygpOworICB9CiB9CiAKLXZvaWQgQ0ZGTF9UZXh0RmllbGQ6OlNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLSAgICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotCi0gICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHNPbGRWYWx1ZSA9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc05ld1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwotCi0gICAgICAgIG1fcFdpZGdldC0+U2V0VmFsdWUoc05ld1ZhbHVlLCBGQUxTRSk7Ci0gICAgICAgIG1fcFdpZGdldC0+UmVzZXRGaWVsZEFwcGVhcmFuY2UoVFJVRSk7Ci0gICAgICAgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKLSAgICAgICAgU2V0Q2hhbmdlTWFyaygpOwotICAgIH0KLX0KLQotdm9pZCBDRkZMX1RleHRGaWVsZDo6R2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiYgZmEpCi17Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKK3ZvaWQgQ0ZGTF9UZXh0RmllbGQ6OkdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiYgZmEpIHsKKyAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLSAgICAgICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICAgICAgewotICAgICAgICAgICAgZmEuYkZpZWxkRnVsbCA9IHBXbmQtPklzVGV4dEZ1bGwoKTsKKyAgICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICAgICAgZmEuYkZpZWxkRnVsbCA9IHBXbmQtPklzVGV4dEZ1bGwoKTsKIAotICAgICAgICAgICAgZmEuc1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOworICAgICAgICBmYS5zVmFsdWUgPSBwV25kLT5HZXRUZXh0KCk7CiAKLSAgICAgICAgICAgIGlmIChmYS5iRmllbGRGdWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhLnNDaGFuZ2UgPSBMIiI7Ci0gICAgICAgICAgICAgICAgZmEuc0NoYW5nZUV4ID0gTCIiOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAoZmEuYkZpZWxkRnVsbCkgeworICAgICAgICAgIGZhLnNDaGFuZ2UgPSBMIiI7CisgICAgICAgICAgZmEuc0NoYW5nZUV4ID0gTCIiOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBDUERGX0FBY3Rpb246OlZhbGlkYXRlOgotICAgICAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYS5zVmFsdWUgPSBwV25kLT5HZXRUZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgICAgIGZhLnNWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXM6CiAgICAgY2FzZSBDUERGX0FBY3Rpb246OkdldEZvY3VzOgotICAgICAgICBBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotICAgICAgICBmYS5zVmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7Ci0gICAgICAgIGJyZWFrOworICAgICAgQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKKyAgICAgIGZhLnNWYWx1ZSA9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKKyAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKyAgICAgIGJyZWFrOworICB9CiB9CiAKLXZvaWQgQ0ZGTF9UZXh0RmllbGQ6OlNldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKQotewotICAgIHN3aXRjaCAodHlwZSkKLSAgICB7Cit2b2lkIENGRkxfVGV4dEZpZWxkOjpTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKSB7CisgIHN3aXRjaCAodHlwZSkgewogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6Ci0gICAgICAgIGlmIChDUFdMX0VkaXQgKiBwRWRpdCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLSAgICAgICAgewotICAgICAgICAgICAgcEVkaXQtPlNldEZvY3VzKCk7Ci0gICAgICAgICAgICBwRWRpdC0+U2V0U2VsKGZhLm5TZWxTdGFydCwgZmEublNlbEVuZCk7Ci0gICAgICAgICAgICBwRWRpdC0+UmVwbGFjZVNlbChmYS5zQ2hhbmdlLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICAgICAgcEVkaXQtPlNldEZvY3VzKCk7CisgICAgICAgIHBFZGl0LT5TZXRTZWwoZmEublNlbFN0YXJ0LCBmYS5uU2VsRW5kKTsKKyAgICAgICAgcEVkaXQtPlJlcGxhY2VTZWwoZmEuc0NoYW5nZS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKyAgICAgIGJyZWFrOworICB9CiB9CiAKLQotRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6SXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KQotewotICAgIHN3aXRjaCAodHlwZSkKLSAgICB7CitGWF9CT09MIENGRkxfVGV4dEZpZWxkOjpJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldykgeworICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgotICAgICAgICByZXR1cm4gKCFmYU9sZC5iRmllbGRGdWxsICYmIGZhT2xkLm5TZWxFbmQgIT0gZmFOZXcublNlbEVuZCkgfHwgZmFPbGQublNlbFN0YXJ0ICE9IGZhTmV3Lm5TZWxTdGFydCB8fAotICAgICAgICAgICAgZmFPbGQuc0NoYW5nZSAhPSBmYU5ldy5zQ2hhbmdlOworICAgICAgcmV0dXJuICghZmFPbGQuYkZpZWxkRnVsbCAmJiBmYU9sZC5uU2VsRW5kICE9IGZhTmV3Lm5TZWxFbmQpIHx8CisgICAgICAgICAgICAgZmFPbGQublNlbFN0YXJ0ICE9IGZhTmV3Lm5TZWxTdGFydCB8fAorICAgICAgICAgICAgIGZhT2xkLnNDaGFuZ2UgIT0gZmFOZXcuc0NoYW5nZTsKICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9CisgICAgICBicmVhazsKKyAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZGTF9UZXh0RmllbGQ6OlNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0gICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKK3ZvaWQgQ0ZGTF9UZXh0RmllbGQ6OlNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKIAotICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0gICAgewotICAgICAgICBwV25kLT5HZXRTZWwobV9TdGF0ZS5uU3RhcnQsIG1fU3RhdGUubkVuZCk7Ci0gICAgICAgIG1fU3RhdGUuc1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwotICAgIH0KKyAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIHBXbmQtPkdldFNlbChtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKKyAgICBtX1N0YXRlLnNWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKKyAgfQogfQogCi12b2lkIENGRkxfVGV4dEZpZWxkOjpSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Cit2b2lkIENGRkxfVGV4dEZpZWxkOjpSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKLSAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCi0gICAgewotICAgICAgICBwV25kLT5TZXRUZXh0KG1fU3RhdGUuc1ZhbHVlLmNfc3RyKCkpOwotICAgICAgICBwV25kLT5TZXRTZWwobV9TdGF0ZS5uU3RhcnQsIG1fU3RhdGUubkVuZCk7Ci0gICAgfQorICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpIHsKKyAgICBwV25kLT5TZXRUZXh0KG1fU3RhdGUuc1ZhbHVlLmNfc3RyKCkpOworICAgIHBXbmQtPlNldFNlbChtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKKyAgfQogfQogCi1DUFdMX1duZCogQ0ZGTF9UZXh0RmllbGQ6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKQotewotICAgIGlmIChiUmVzdG9yZVZhbHVlKQotICAgICAgICBTYXZlU3RhdGUocFBhZ2VWaWV3KTsKK0NQV0xfV25kKiBDRkZMX1RleHRGaWVsZDo6UmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXN0b3JlVmFsdWUpIHsKKyAgaWYgKGJSZXN0b3JlVmFsdWUpCisgICAgU2F2ZVN0YXRlKHBQYWdlVmlldyk7CiAKLSAgICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7CisgIERlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKIAotICAgIENQV0xfV25kKiBwUmV0ID0gTlVMTDsKKyAgQ1BXTF9XbmQqIHBSZXQgPSBOVUxMOwogCi0gICAgaWYgKGJSZXN0b3JlVmFsdWUpCi0gICAgewotICAgICAgICBSZXN0b3JlU3RhdGUocFBhZ2VWaWV3KTsKLSAgICAgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSk7CisgIGlmIChiUmVzdG9yZVZhbHVlKSB7CisgICAgUmVzdG9yZVN0YXRlKHBQYWdlVmlldyk7CisgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKyAgfSBlbHNlCisgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOwogCi0gICAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOworICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CiAKLSAgICByZXR1cm4gcFJldDsKKyAgcmV0dXJuIHBSZXQ7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9UZXh0RmllbGQ6OklzRmllbGRGdWxsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsKLQkJcmV0dXJuIHBXbmQtPklzVGV4dEZ1bGwoKTsKLQl9CitGWF9CT09MIENGRkxfVGV4dEZpZWxkOjpJc0ZpZWxkRnVsbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIHJldHVybiBwV25kLT5Jc1RleHRGdWxsKCk7CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENGRkxfVGV4dEZpZWxkOjpPblNldEZvY3VzKENQV0xfV25kKiBwV25kKQotewotICAgIEFTU0VSVChtX3BBcHAgIT0gTlVMTCk7Cit2b2lkIENGRkxfVGV4dEZpZWxkOjpPblNldEZvY3VzKENQV0xfV25kKiBwV25kKSB7CisgIEFTU0VSVChtX3BBcHAgIT0gTlVMTCk7CiAKLSAgICBBU1NFUlQocFduZCAhPSBOVUxMKTsKKyAgQVNTRVJUKHBXbmQgIT0gTlVMTCk7CiAKLSAgICBpZiAocFduZC0+R2V0Q2xhc3NOYW1lKCkgPT0gUFdMX0NMQVNTTkFNRV9FRElUKQotICAgIHsKLSAgICAgICAgQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKXBXbmQ7Ci0gICAgICAgIHBFZGl0LT5TZXRDaGFyU2V0KDEzNCk7Ci0gICAgICAgIHBFZGl0LT5TZXRDb2RlUGFnZSg5MzYpOworICBpZiAocFduZC0+R2V0Q2xhc3NOYW1lKCkgPT0gUFdMX0NMQVNTTkFNRV9FRElUKSB7CisgICAgQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKXBXbmQ7CisgICAgcEVkaXQtPlNldENoYXJTZXQoMTM0KTsKKyAgICBwRWRpdC0+U2V0Q29kZVBhZ2UoOTM2KTsKIAotICAgICAgICBwRWRpdC0+U2V0UmVhZHlUb0lucHV0KCk7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dCA9IHBFZGl0LT5HZXRUZXh0KCk7Ci0gICAgICAgIGludCBuQ2hhcmFjdGVycyA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVVEZUZXh0ID0gd3NUZXh0LlVURjE2TEVfRW5jb2RlKCk7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0KiBwQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0Kilic1VURlRleHQuY19zdHIoKTsKLSAgICAgICAgbV9wQXBwLT5GRklfT25TZXRGaWVsZElucHV0Rm9jdXMobV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgcEJ1ZmZlciwgbkNoYXJhY3RlcnMsIFRSVUUpOworICAgIHBFZGl0LT5TZXRSZWFkeVRvSW5wdXQoKTsKKyAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBwRWRpdC0+R2V0VGV4dCgpOworICAgIGludCBuQ2hhcmFjdGVycyA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBic1VURlRleHQgPSB3c1RleHQuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICB1bnNpZ25lZCBzaG9ydCogcEJ1ZmZlciA9ICh1bnNpZ25lZCBzaG9ydCopYnNVVEZUZXh0LmNfc3RyKCk7CisgICAgbV9wQXBwLT5GRklfT25TZXRGaWVsZElucHV0Rm9jdXMobV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhcmFjdGVycywgVFJVRSk7CiAKLSAgICAgICAgcEVkaXQtPlNldEVkaXROb3RpZnkodGhpcyk7Ci0gICAgICAgIC8vcFVuZG8tPkJlZ2luRWRpdChwRG9jdW1lbnQpOwotICAgIH0KKyAgICBwRWRpdC0+U2V0RWRpdE5vdGlmeSh0aGlzKTsKKyAgICAvLyBwVW5kby0+QmVnaW5FZGl0KHBEb2N1bWVudCk7CisgIH0KIH0KIAotdm9pZCBDRkZMX1RleHRGaWVsZDo6T25LaWxsRm9jdXMoQ1BXTF9XbmQqIHBXbmQpCi17Cit2b2lkIENGRkxfVGV4dEZpZWxkOjpPbktpbGxGb2N1cyhDUFdMX1duZCogcFduZCkge30KIAorRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6Q2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENGRkxfVGV4dEZpZWxkOjpDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLSAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGRkxfVGV4dEZpZWxkOjpDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDRkZMX1RleHRGaWVsZDo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLSAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGRkxfVGV4dEZpZWxkOjpDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENGRkxfVGV4dEZpZWxkOjpDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0gICAgcmV0dXJuIEZBTFNFOwotfQordm9pZCBDRkZMX1RleHRGaWVsZDo6RG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkge30KIAotdm9pZCBDRkZMX1RleHRGaWVsZDo6RG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKK3ZvaWQgQ0ZGTF9UZXh0RmllbGQ6OkRvQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkge30KIAotfQordm9pZCBDRkZMX1RleHRGaWVsZDo6RG9QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHt9CiAKLXZvaWQgQ0ZGTF9UZXh0RmllbGQ6OkRvQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLX0KLQotdm9pZCBDRkZMX1RleHRGaWVsZDo6RG9QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0KLX0KLQotdm9pZCBDRkZMX1RleHRGaWVsZDo6T25BZGRVbmRvKENQV0xfRWRpdCogcEVkaXQpCi17Ci19Ci0KK3ZvaWQgQ0ZGTF9UZXh0RmllbGQ6Ok9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KSB7fQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVXRpbHMuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVXRpbHMuY3BwCmluZGV4IDhkMmQ3NmQuLmQyY2U1NmEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9VdGlscy5jcHAKQEAgLTksMTA2ICs5LDkxIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0Zvcm1GaWxsZXIuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmgiCiAKLUNQREZfUmVjdCBDRkZMX1V0aWxzOjpNYXhSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QxLGNvbnN0IENQREZfUmVjdCAmIHJlY3QyKQotewotCUNQREZfUmVjdCByY1JldDsKK0NQREZfUmVjdCBDRkZMX1V0aWxzOjpNYXhSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsIGNvbnN0IENQREZfUmVjdCYgcmVjdDIpIHsKKyAgQ1BERl9SZWN0IHJjUmV0OwogCi0JcmNSZXQubGVmdCA9IHN0ZDo6bWluKHJlY3QxLmxlZnQsIHJlY3QyLmxlZnQpOwotCXJjUmV0LmJvdHRvbSA9IHN0ZDo6bWluKHJlY3QxLmJvdHRvbSwgcmVjdDIuYm90dG9tKTsKLQlyY1JldC5yaWdodCA9IHN0ZDo6bWF4KHJlY3QxLnJpZ2h0LCByZWN0Mi5yaWdodCk7Ci0JcmNSZXQudG9wID0gc3RkOjptYXgocmVjdDEudG9wLCByZWN0Mi50b3ApOworICByY1JldC5sZWZ0ID0gc3RkOjptaW4ocmVjdDEubGVmdCwgcmVjdDIubGVmdCk7CisgIHJjUmV0LmJvdHRvbSA9IHN0ZDo6bWluKHJlY3QxLmJvdHRvbSwgcmVjdDIuYm90dG9tKTsKKyAgcmNSZXQucmlnaHQgPSBzdGQ6Om1heChyZWN0MS5yaWdodCwgcmVjdDIucmlnaHQpOworICByY1JldC50b3AgPSBzdGQ6Om1heChyZWN0MS50b3AsIHJlY3QyLnRvcCk7CiAKLQlyZXR1cm4gcmNSZXQ7CisgIHJldHVybiByY1JldDsKIH0KIAotQ1BERl9SZWN0IENGRkxfVXRpbHM6OkluZmxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIGNyUmVjdCxjb25zdCBGWF9GTE9BVCAmIGZTaXplKQotewotCUNQREZfUmVjdCBjck5ldyhjclJlY3QubGVmdCAtIGZTaXplLAotCQkJCQljclJlY3QuYm90dG9tIC0gZlNpemUsCi0JCQkJCWNyUmVjdC5yaWdodCArIGZTaXplLAotCQkJCQljclJlY3QudG9wICsgZlNpemUpOwotCWNyTmV3Lk5vcm1hbGl6ZSgpOwotCXJldHVybiBjck5ldzsKK0NQREZfUmVjdCBDRkZMX1V0aWxzOjpJbmZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIGNyUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCYgZlNpemUpIHsKKyAgQ1BERl9SZWN0IGNyTmV3KGNyUmVjdC5sZWZ0IC0gZlNpemUsIGNyUmVjdC5ib3R0b20gLSBmU2l6ZSwKKyAgICAgICAgICAgICAgICAgIGNyUmVjdC5yaWdodCArIGZTaXplLCBjclJlY3QudG9wICsgZlNpemUpOworICBjck5ldy5Ob3JtYWxpemUoKTsKKyAgcmV0dXJuIGNyTmV3OwogfQogCi1DUERGX1JlY3QgQ0ZGTF9VdGlsczo6RGVmbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgY3JSZWN0LGNvbnN0IEZYX0ZMT0FUICYgZlNpemUpCi17Ci0JQ1BERl9SZWN0IGNyTmV3KGNyUmVjdC5sZWZ0ICsgZlNpemUsCi0JCQkJCWNyUmVjdC5ib3R0b20gKyBmU2l6ZSwKLQkJCQkJY3JSZWN0LnJpZ2h0IC0gZlNpemUsCi0JCQkJCWNyUmVjdC50b3AgLSBmU2l6ZSk7Ci0JY3JOZXcuTm9ybWFsaXplKCk7Ci0JcmV0dXJuIGNyTmV3OworQ1BERl9SZWN0IENGRkxfVXRpbHM6OkRlZmxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCYgY3JSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUJiBmU2l6ZSkgeworICBDUERGX1JlY3QgY3JOZXcoY3JSZWN0LmxlZnQgKyBmU2l6ZSwgY3JSZWN0LmJvdHRvbSArIGZTaXplLAorICAgICAgICAgICAgICAgICAgY3JSZWN0LnJpZ2h0IC0gZlNpemUsIGNyUmVjdC50b3AgLSBmU2l6ZSk7CisgIGNyTmV3Lk5vcm1hbGl6ZSgpOworICByZXR1cm4gY3JOZXc7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9VdGlsczo6VHJhY2VPYmplY3QoQ1BERl9PYmplY3QqIHBPYmopCi17Ci0JaWYgKCFwT2JqKSByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGRkxfVXRpbHM6OlRyYWNlT2JqZWN0KENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGlmICghcE9iaikKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlGWF9EV09SRAlkd09iak51bSA9IHBPYmotPkdldE9iak51bSgpOwotCXN3aXRjaCAocE9iai0+R2V0VHlwZSgpKQotCXsKLQljYXNlIFBERk9CSl9BUlJBWToKLQkJewotCQkJQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBPYmo7Ci0JCQlmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKQotCQkJewotCQkJCUNQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOwotCQkJCVRyYWNlT2JqZWN0KHBFbGVtZW50KTsKLQkJCX0KLQkJfQotCQlicmVhazsKKyAgRlhfRFdPUkQgZHdPYmpOdW0gPSBwT2JqLT5HZXRPYmpOdW0oKTsKKyAgc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIFBERk9CSl9BUlJBWTogeworICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBPYmo7CisgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7CisgICAgICAgIFRyYWNlT2JqZWN0KHBFbGVtZW50KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOwogCi0JY2FzZSBQREZPQkpfRElDVElPTkFSWToKLQkJewotCQkJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7CisgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWTogeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7CiAKLQkJCUZYX1BPU0lUSU9OIGZQb3MgPSBwRGljdC0+R2V0U3RhcnRQb3MoKTsKLQkJCUNGWF9CeXRlU3RyaW5nIGNzS2V5OwotCQkJZG8KLQkJCXsKLQkJCQlDUERGX09iamVjdCogcEVsZW1lbnQgPSBwRGljdC0+R2V0TmV4dEVsZW1lbnQoZlBvcywgY3NLZXkpOwotIAkJCQkvL1RSQUNFKGNzS2V5ICsgIlxuIik7Ci0JCQkJaWYgKCFwRWxlbWVudCkgYnJlYWs7Ci0JCQkJVHJhY2VPYmplY3QocEVsZW1lbnQpOwotCQkJfXdoaWxlIChUUlVFKTsKLQkJfQotCQlicmVhazsKKyAgICAgIEZYX1BPU0lUSU9OIGZQb3MgPSBwRGljdC0+R2V0U3RhcnRQb3MoKTsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGNzS2V5OworICAgICAgZG8geworICAgICAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwRGljdC0+R2V0TmV4dEVsZW1lbnQoZlBvcywgY3NLZXkpOworICAgICAgICAvLyBUUkFDRShjc0tleSArICJcbiIpOworICAgICAgICBpZiAoIXBFbGVtZW50KQorICAgICAgICAgIGJyZWFrOworICAgICAgICBUcmFjZU9iamVjdChwRWxlbWVudCk7CisgICAgICB9IHdoaWxlIChUUlVFKTsKKyAgICB9IGJyZWFrOwogCi0JY2FzZSBQREZPQkpfU1RSRUFNOgotCQl7Ci0JCQlDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopcE9iajsKLQkJCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0JCQlUcmFjZU9iamVjdChwRGljdCk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSBQREZPQkpfU1RSRUFNOiB7CisgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopcE9iajsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CisgICAgICBUcmFjZU9iamVjdChwRGljdCk7CisgICAgfSBicmVhazsKIAotCWNhc2UgUERGT0JKX1JFRkVSRU5DRToKLQkJewotCQkJQ1BERl9PYmplY3QqIHBEaXJlY3RPYmogPSBwT2JqLT5HZXREaXJlY3QoKTsKLQkJCVRyYWNlT2JqZWN0KHBEaXJlY3RPYmopOwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogeworICAgICAgQ1BERl9PYmplY3QqIHBEaXJlY3RPYmogPSBwT2JqLT5HZXREaXJlY3QoKTsKKyAgICAgIFRyYWNlT2JqZWN0KHBEaXJlY3RPYmopOworICAgIH0gYnJlYWs7CiAKLQljYXNlIFBERk9CSl9CT09MRUFOOgotCQlicmVhazsKLQljYXNlIFBERk9CSl9OVU1CRVI6Ci0JCS8vVFJBQ0UoIiVkXG4iLChpbnQzMl90KXBPYmopOwotCQlicmVhazsKLQljYXNlIFBERk9CSl9TVFJJTkc6Ci0JCS8vVFJBQ0UoKChDUERGX1N0cmluZyopcE9iaiktPkdldFN0cmluZygpICsgIlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgUERGT0JKX05BTUU6Ci0JCS8vVFJBQ0UoKChDUERGX05hbWUqKXBPYmopLT5HZXRTdHJpbmcoKSArICJcbiIpOwotCQlicmVhazsKLQljYXNlIFBERk9CSl9OVUxMOgotLy8JY2FzZSBQREZPQkpfS0VZV09SRDoKLS8vCWNhc2UgUERGT0JKX0VPRjoKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JaWYgKGR3T2JqTnVtID09IDApIHJldHVybiBGQUxTRTsKKyAgICBjYXNlIFBERk9CSl9CT09MRUFOOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZPQkpfTlVNQkVSOgorICAgICAgLy8gVFJBQ0UoIiVkXG4iLChpbnQzMl90KXBPYmopOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZPQkpfU1RSSU5HOgorICAgICAgLy8gVFJBQ0UoKChDUERGX1N0cmluZyopcE9iaiktPkdldFN0cmluZygpICsgIlxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERk9CSl9OQU1FOgorICAgICAgLy8gVFJBQ0UoKChDUERGX05hbWUqKXBPYmopLT5HZXRTdHJpbmcoKSArICJcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZPQkpfTlVMTDoKKyAgICAvLwljYXNlIFBERk9CSl9LRVlXT1JEOgorICAgIC8vCWNhc2UgUERGT0JKX0VPRjoKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKGR3T2JqTnVtID09IDApCisgICAgcmV0dXJuIEZBTFNFOwogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbC5jcHAKaW5kZXggMjEyMWYyNi4uMGQ1NjAyZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsLmNwcApAQCAtMTEsMTYwICsxMSwxMzggQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCIKIAogZXh0ZXJuIHZvaWQgUHJvY2Vzc1BhcnNlRXJyb3IoRlhfRFdPUkQgZXJyX2NvZGUpOwotY2xhc3MgQ0ZQREZfRmlsZUF2YWlsV3JhcCA6IHB1YmxpYyBJRlhfRmlsZUF2YWlsCi17Ci1wdWJsaWM6Ci0JQ0ZQREZfRmlsZUF2YWlsV3JhcCgpCi0JewotCQltX3BmaWxlQXZhaWwgPSBOVUxMOwotCX0KK2NsYXNzIENGUERGX0ZpbGVBdmFpbFdyYXAgOiBwdWJsaWMgSUZYX0ZpbGVBdmFpbCB7CisgcHVibGljOgorICBDRlBERl9GaWxlQXZhaWxXcmFwKCkgeyBtX3BmaWxlQXZhaWwgPSBOVUxMOyB9CiAKLQl2b2lkIFNldChGWF9GSUxFQVZBSUwqIHBmaWxlQXZhaWwpCi0JewotCQltX3BmaWxlQXZhaWwgPSBwZmlsZUF2YWlsOwotCX0KKyAgdm9pZCBTZXQoRlhfRklMRUFWQUlMKiBwZmlsZUF2YWlsKSB7IG1fcGZpbGVBdmFpbCA9IHBmaWxlQXZhaWw7IH0KIAotCXZpcnR1YWwgRlhfQk9PTAkJCUlzRGF0YUF2YWlsKCBGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0RXT1JEIHNpemUpCi0JewotCQlyZXR1cm4gbV9wZmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChtX3BmaWxlQXZhaWwsIG9mZnNldCwgc2l6ZSk7Ci0JfQorICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQXZhaWwoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9EV09SRCBzaXplKSB7CisgICAgcmV0dXJuIG1fcGZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9wZmlsZUF2YWlsLCBvZmZzZXQsIHNpemUpOworICB9CiAKLXByaXZhdGU6Ci0JRlhfRklMRUFWQUlMKiBtX3BmaWxlQXZhaWw7CisgcHJpdmF0ZToKKyAgRlhfRklMRUFWQUlMKiBtX3BmaWxlQXZhaWw7CiB9OwogCi1jbGFzcyBDRlBERl9GaWxlQWNjZXNzV3JhcCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQKLXsKLXB1YmxpYzoKLQlDRlBERl9GaWxlQWNjZXNzV3JhcCgpCi0JewotCQltX3BGaWxlQWNjZXNzID0gTlVMTDsKLQl9CitjbGFzcyBDRlBERl9GaWxlQWNjZXNzV3JhcCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQgeworIHB1YmxpYzoKKyAgQ0ZQREZfRmlsZUFjY2Vzc1dyYXAoKSB7IG1fcEZpbGVBY2Nlc3MgPSBOVUxMOyB9CiAKLQl2b2lkIFNldChGUERGX0ZJTEVBQ0NFU1MqIHBGaWxlKQotCXsKLQkJbV9wRmlsZUFjY2VzcyA9IHBGaWxlOwotCX0KKyAgdm9pZCBTZXQoRlBERl9GSUxFQUNDRVNTKiBwRmlsZSkgeyBtX3BGaWxlQWNjZXNzID0gcEZpbGU7IH0KIAotCXZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFNpemUoKQotCXsKLQkJcmV0dXJuIG1fcEZpbGVBY2Nlc3MtPm1fRmlsZUxlbjsKLQl9CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIHsgcmV0dXJuIG1fcEZpbGVBY2Nlc3MtPm1fRmlsZUxlbjsgfQogCi0JdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLQl7Ci0JCXJldHVybiBtX3BGaWxlQWNjZXNzLT5tX0dldEJsb2NrKG1fcEZpbGVBY2Nlc3MtPm1fUGFyYW0sIG9mZnNldCwgKHVpbnQ4X3QqKWJ1ZmZlciwgc2l6ZSk7Ci0JfQorICB2aXJ0dWFsIEZYX0JPT0wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBtX3BGaWxlQWNjZXNzLT5tX0dldEJsb2NrKG1fcEZpbGVBY2Nlc3MtPm1fUGFyYW0sIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopYnVmZmVyLCBzaXplKTsKKyAgfQogCi0JdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpCi0JewotCX0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7fQogCi1wcml2YXRlOgotCUZQREZfRklMRUFDQ0VTUyoJCW1fcEZpbGVBY2Nlc3M7CisgcHJpdmF0ZToKKyAgRlBERl9GSUxFQUNDRVNTKiBtX3BGaWxlQWNjZXNzOwogfTsKIAotY2xhc3MgQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAgOiBwdWJsaWMgSUZYX0Rvd25sb2FkSGludHMKLXsKLXB1YmxpYzoKLQlDRlBERl9Eb3dubG9hZEhpbnRzV3JhcChGWF9ET1dOTE9BREhJTlRTKiBwRG93bmxvYWRIaW50cykKLQl7Ci0JCW1fcERvd25sb2FkSGludHMgPSBwRG93bmxvYWRIaW50czsKLQl9Ci1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJQWRkU2VnbWVudChGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0RXT1JEIHNpemUpCi0JewotCQltX3BEb3dubG9hZEhpbnRzLT5BZGRTZWdtZW50KG1fcERvd25sb2FkSGludHMsIG9mZnNldCwgc2l6ZSk7Ci0JfQotcHJpdmF0ZToKLQlGWF9ET1dOTE9BREhJTlRTKiBtX3BEb3dubG9hZEhpbnRzOworY2xhc3MgQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAgOiBwdWJsaWMgSUZYX0Rvd25sb2FkSGludHMgeworIHB1YmxpYzoKKyAgQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAoRlhfRE9XTkxPQURISU5UUyogcERvd25sb2FkSGludHMpIHsKKyAgICBtX3BEb3dubG9hZEhpbnRzID0gcERvd25sb2FkSGludHM7CisgIH0KKworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIEFkZFNlZ21lbnQoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9EV09SRCBzaXplKSB7CisgICAgbV9wRG93bmxvYWRIaW50cy0+QWRkU2VnbWVudChtX3BEb3dubG9hZEhpbnRzLCBvZmZzZXQsIHNpemUpOworICB9CisKKyBwcml2YXRlOgorICBGWF9ET1dOTE9BREhJTlRTKiBtX3BEb3dubG9hZEhpbnRzOwogfTsKIAotY2xhc3MgQ0ZQREZfRGF0YUF2YWlsCi17Ci1wdWJsaWM6Ci0JQ0ZQREZfRGF0YUF2YWlsKCkKLQl7Ci0JCW1fcERhdGFBdmFpbCA9IE5VTEw7Ci0JfQorY2xhc3MgQ0ZQREZfRGF0YUF2YWlsIHsKKyBwdWJsaWM6CisgIENGUERGX0RhdGFBdmFpbCgpIHsgbV9wRGF0YUF2YWlsID0gTlVMTDsgfQogCi0JfkNGUERGX0RhdGFBdmFpbCgpCi0JewotICAgICAgICAgICAgZGVsZXRlIG1fcERhdGFBdmFpbDsKLQl9CisgIH5DRlBERl9EYXRhQXZhaWwoKSB7IGRlbGV0ZSBtX3BEYXRhQXZhaWw7IH0KIAotCUlQREZfRGF0YUF2YWlsKgkJCW1fcERhdGFBdmFpbDsKLQlDRlBERl9GaWxlQXZhaWxXcmFwCQltX0ZpbGVBdmFpbDsKLQlDRlBERl9GaWxlQWNjZXNzV3JhcAltX0ZpbGVSZWFkOworICBJUERGX0RhdGFBdmFpbCogbV9wRGF0YUF2YWlsOworICBDRlBERl9GaWxlQXZhaWxXcmFwIG1fRmlsZUF2YWlsOworICBDRlBERl9GaWxlQWNjZXNzV3JhcCBtX0ZpbGVSZWFkOwogfTsKIAotRExMRVhQT1JUIEZQREZfQVZBSUwgU1REQ0FMTCBGUERGQXZhaWxfQ3JlYXRlKEZYX0ZJTEVBVkFJTCogZmlsZV9hdmFpbCwgRlBERl9GSUxFQUNDRVNTKiBmaWxlKQotewotCUNGUERGX0RhdGFBdmFpbCogcEF2YWlsID0gRlhfTkVXIENGUERGX0RhdGFBdmFpbDsKLQlwQXZhaWwtPm1fRmlsZUF2YWlsLlNldChmaWxlX2F2YWlsKTsKLQlwQXZhaWwtPm1fRmlsZVJlYWQuU2V0KGZpbGUpOwotCXBBdmFpbC0+bV9wRGF0YUF2YWlsID0gSVBERl9EYXRhQXZhaWw6OkNyZWF0ZSgmcEF2YWlsLT5tX0ZpbGVBdmFpbCwgJnBBdmFpbC0+bV9GaWxlUmVhZCk7Ci0JcmV0dXJuIHBBdmFpbDsKK0RMTEVYUE9SVCBGUERGX0FWQUlMIFNURENBTEwgRlBERkF2YWlsX0NyZWF0ZShGWF9GSUxFQVZBSUwqIGZpbGVfYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFQUNDRVNTKiBmaWxlKSB7CisgIENGUERGX0RhdGFBdmFpbCogcEF2YWlsID0gRlhfTkVXIENGUERGX0RhdGFBdmFpbDsKKyAgcEF2YWlsLT5tX0ZpbGVBdmFpbC5TZXQoZmlsZV9hdmFpbCk7CisgIHBBdmFpbC0+bV9GaWxlUmVhZC5TZXQoZmlsZSk7CisgIHBBdmFpbC0+bV9wRGF0YUF2YWlsID0KKyAgICAgIElQREZfRGF0YUF2YWlsOjpDcmVhdGUoJnBBdmFpbC0+bV9GaWxlQXZhaWwsICZwQXZhaWwtPm1fRmlsZVJlYWQpOworICByZXR1cm4gcEF2YWlsOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZBdmFpbF9EZXN0cm95KEZQREZfQVZBSUwgYXZhaWwpCi17Ci0gICAgZGVsZXRlIChDRlBERl9EYXRhQXZhaWwqKWF2YWlsOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGQXZhaWxfRGVzdHJveShGUERGX0FWQUlMIGF2YWlsKSB7CisgIGRlbGV0ZSAoQ0ZQREZfRGF0YUF2YWlsKilhdmFpbDsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0RvY0F2YWlsKEZQREZfQVZBSUwgYXZhaWwsIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKQotewotCWlmIChhdmFpbCA9PSBOVUxMIHx8IGhpbnRzID09IE5VTEwpIHJldHVybiAwOwotCUNGUERGX0Rvd25sb2FkSGludHNXcmFwIGhpbnRzX3dyYXAoaGludHMpOwotCXJldHVybiAoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPklzRG9jQXZhaWwoJmhpbnRzX3dyYXApOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0RvY0F2YWlsKEZQREZfQVZBSUwgYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9XTkxPQURISU5UUyogaGludHMpIHsKKyAgaWYgKGF2YWlsID09IE5VTEwgfHwgaGludHMgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAgaGludHNfd3JhcChoaW50cyk7CisgIHJldHVybiAoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPklzRG9jQXZhaWwoJmhpbnRzX3dyYXApOwogfQogCi1leHRlcm4gdm9pZCBDaGVja1VuU3VwcG9ydEVycm9yKENQREZfRG9jdW1lbnQgKiBwRG9jLCBGWF9EV09SRCBlcnJfY29kZSk7CitleHRlcm4gdm9pZCBDaGVja1VuU3VwcG9ydEVycm9yKENQREZfRG9jdW1lbnQqIHBEb2MsIEZYX0RXT1JEIGVycl9jb2RlKTsKIAotRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGQXZhaWxfR2V0RG9jdW1lbnQoRlBERl9BVkFJTCBhdmFpbCwJRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKQotewotCWlmIChhdmFpbCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlDUERGX1BhcnNlciogcFBhcnNlciA9IEZYX05FVyBDUERGX1BhcnNlcjsKLQlwUGFyc2VyLT5TZXRQYXNzd29yZChwYXNzd29yZCk7CitETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMCitGUERGQXZhaWxfR2V0RG9jdW1lbnQoRlBERl9BVkFJTCBhdmFpbCwgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKSB7CisgIGlmIChhdmFpbCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBDUERGX1BhcnNlciogcFBhcnNlciA9IEZYX05FVyBDUERGX1BhcnNlcjsKKyAgcFBhcnNlci0+U2V0UGFzc3dvcmQocGFzc3dvcmQpOwogCi0JRlhfRFdPUkQgZXJyX2NvZGUgPSBwUGFyc2VyLT5TdGFydEFzeW5QYXJzZSgoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPkdldEZpbGVSZWFkKCkpOwotCWlmIChlcnJfY29kZSkgewotCQlkZWxldGUgcFBhcnNlcjsKLQkJUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKChDRlBERl9EYXRhQXZhaWwqKWF2YWlsKS0+bV9wRGF0YUF2YWlsLT5TZXREb2N1bWVudChwUGFyc2VyLT5HZXREb2N1bWVudCgpKTsKLQlDaGVja1VuU3VwcG9ydEVycm9yKHBQYXJzZXItPkdldERvY3VtZW50KCksIEZQREZfRVJSX1NVQ0NFU1MpOwotCUNQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBwUGFyc2VyLT5HZXREb2N1bWVudCgpOwotCUNQREZYRkFfQXBwKiBwQXBwID0gQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCk7Ci0JQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gRlhfTkVXIENQREZYRkFfRG9jdW1lbnQocFBERkRvYywgcEFwcCk7Ci0JcmV0dXJuIHBEb2N1bWVudDsKKyAgRlhfRFdPUkQgZXJyX2NvZGUgPSBwUGFyc2VyLT5TdGFydEFzeW5QYXJzZSgKKyAgICAgICgoQ0ZQREZfRGF0YUF2YWlsKilhdmFpbCktPm1fcERhdGFBdmFpbC0+R2V0RmlsZVJlYWQoKSk7CisgIGlmIChlcnJfY29kZSkgeworICAgIGRlbGV0ZSBwUGFyc2VyOworICAgIFByb2Nlc3NQYXJzZUVycm9yKGVycl9jb2RlKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPlNldERvY3VtZW50KHBQYXJzZXItPkdldERvY3VtZW50KCkpOworICBDaGVja1VuU3VwcG9ydEVycm9yKHBQYXJzZXItPkdldERvY3VtZW50KCksIEZQREZfRVJSX1NVQ0NFU1MpOworICBDUERGX0RvY3VtZW50KiBwUERGRG9jID0gcFBhcnNlci0+R2V0RG9jdW1lbnQoKTsKKyAgQ1BERlhGQV9BcHAqIHBBcHAgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gRlhfTkVXIENQREZYRkFfRG9jdW1lbnQocFBERkRvYywgcEFwcCk7CisgIHJldHVybiBwRG9jdW1lbnQ7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfR2V0Rmlyc3RQYWdlTnVtKEZQREZfRE9DVU1FTlQgZG9jKQotewotCWlmIChkb2MgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jKS0+R2V0UERGRG9jKCk7Ci0JcmV0dXJuICgoQ1BERl9QYXJzZXIqKXBEb2MtPkdldFBhcnNlcigpKS0+R2V0Rmlyc3RQYWdlTm8oKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfR2V0Rmlyc3RQYWdlTnVtKEZQREZfRE9DVU1FTlQgZG9jKSB7CisgIGlmIChkb2MgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jKS0+R2V0UERGRG9jKCk7CisgIHJldHVybiAoKENQREZfUGFyc2VyKilwRG9jLT5HZXRQYXJzZXIoKSktPkdldEZpcnN0UGFnZU5vKCk7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNQYWdlQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwgaW50IHBhZ2VfaW5kZXgsIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKQotewotCWlmIChhdmFpbCA9PSBOVUxMIHx8IGhpbnRzID09IE5VTEwpIHJldHVybiAwOwotCUNGUERGX0Rvd25sb2FkSGludHNXcmFwIGhpbnRzX3dyYXAoaGludHMpOwotCXJldHVybiAoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPklzUGFnZUF2YWlsKHBhZ2VfaW5kZXgsICZoaW50c193cmFwKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNQYWdlQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKSB7CisgIGlmIChhdmFpbCA9PSBOVUxMIHx8IGhpbnRzID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIENGUERGX0Rvd25sb2FkSGludHNXcmFwIGhpbnRzX3dyYXAoaGludHMpOworICByZXR1cm4gKChDRlBERl9EYXRhQXZhaWwqKWF2YWlsKQorICAgICAgLT5tX3BEYXRhQXZhaWwtPklzUGFnZUF2YWlsKHBhZ2VfaW5kZXgsICZoaW50c193cmFwKTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChGUERGX0FWQUlMIGF2YWlsLCBGWF9ET1dOTE9BREhJTlRTKiBoaW50cykKLXsKLQlpZiAoYXZhaWwgPT0gTlVMTCB8fCBoaW50cyA9PSBOVUxMKSByZXR1cm4gLTE7Ci0JQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAgaGludHNfd3JhcChoaW50cyk7Ci0JcmV0dXJuICgoQ0ZQREZfRGF0YUF2YWlsKilhdmFpbCktPm1fcERhdGFBdmFpbC0+SXNGb3JtQXZhaWwoJmhpbnRzX3dyYXApOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChGUERGX0FWQUlMIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1dOTE9BREhJTlRTKiBoaW50cykgeworICBpZiAoYXZhaWwgPT0gTlVMTCB8fCBoaW50cyA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAgaGludHNfd3JhcChoaW50cyk7CisgIHJldHVybiAoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPklzRm9ybUF2YWlsKCZoaW50c193cmFwKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZBdmFpbF9Jc0xpbmVhcml6ZWQoRlBERl9BVkFJTCBhdmFpbCkKLXsKLQkJaWYgKGF2YWlsID09IE5VTEwpIHJldHVybiAtMTsKLQlyZXR1cm4gKChDRlBERl9EYXRhQXZhaWwqKWF2YWlsKS0+bV9wRGF0YUF2YWlsLT5Jc0xpbmVhcml6ZWRQREYoKTsKLQorRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZBdmFpbF9Jc0xpbmVhcml6ZWQoRlBERl9BVkFJTCBhdmFpbCkgeworICBpZiAoYXZhaWwgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiAoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPklzTGluZWFyaXplZFBERigpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWxfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsX2VtYmVkZGVydGVzdC5jcHAKaW5kZXggZDJmMGI3OC4uMjkyZmY3OSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWxfZW1iZWRkZXJ0ZXN0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbF9lbWJlZGRlcnRlc3QuY3BwCkBAIC03LDggKzcsNyBAQAogI2luY2x1ZGUgIi4uLy4uL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCi1jbGFzcyBGUERGRGF0YUF2YWlsRW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7Ci19OworY2xhc3MgRlBERkRhdGFBdmFpbEVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CiAKIFRFU1RfRihGUERGRGF0YUF2YWlsRW1iZWRkZXJ0ZXN0LCBUcmFpbGVyVW50ZXJtaW5hdGVkKSB7CiAgIC8vIERvY3VtZW50IGRvZXNuJ3QgZXZlbiBvcGVuIHVuZGVyIFhGQSBidXQgbXVzdCBub3QgY3Jhc2guCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX2V4dC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX2V4dC5jcHAKaW5kZXggY2MzNTllOS4uYTE5OGY5ZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl9leHQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfZXh0LmNwcApAQCAtOSwyMzAgKzksMTk5IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgogCi0jZGVmaW5lICBGUERGU0RLX1VOU1VQUE9SVF9DQUxMIDEwMAorI2RlZmluZSBGUERGU0RLX1VOU1VQUE9SVF9DQUxMIDEwMAogCi1jbGFzcyBDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIKLXsKLXB1YmxpYzoKLSAgICBDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIoVU5TVVBQT1JUX0lORk8qIHVuc3BfaW5mbyl7IG1fdW5zcF9pbmZvID0gdW5zcF9pbmZvO30KLS8vICBGWF9CT09MIE5lZWRUb1BhdXNlTm93KCk7Ci0gICAgdm9pZCBSZXBvcnRFcnJvcihpbnQgbkVycm9yVHlwZSk7CitjbGFzcyBDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIgeworIHB1YmxpYzoKKyAgQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyKFVOU1VQUE9SVF9JTkZPKiB1bnNwX2luZm8pIHsKKyAgICBtX3Vuc3BfaW5mbyA9IHVuc3BfaW5mbzsKKyAgfQorICAvLyAgRlhfQk9PTCBOZWVkVG9QYXVzZU5vdygpOworICB2b2lkIFJlcG9ydEVycm9yKGludCBuRXJyb3JUeXBlKTsKIAotcHJpdmF0ZToKLSAgICBVTlNVUFBPUlRfSU5GTyogbV91bnNwX2luZm87CisgcHJpdmF0ZToKKyAgVU5TVVBQT1JUX0lORk8qIG1fdW5zcF9pbmZvOwogfTsKIAotdm9pZCBDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXI6OlJlcG9ydEVycm9yKGludCBuRXJyb3JUeXBlKQotewotICAgIGlmKG1fdW5zcF9pbmZvICYmIG1fdW5zcF9pbmZvLT5GU0RLX1VuU3VwcG9ydF9IYW5kbGVyKQotICAgIHsKLSAgICAgICAgbV91bnNwX2luZm8tPkZTREtfVW5TdXBwb3J0X0hhbmRsZXIobV91bnNwX2luZm8sbkVycm9yVHlwZSk7Ci0gICAgfQordm9pZCBDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXI6OlJlcG9ydEVycm9yKGludCBuRXJyb3JUeXBlKSB7CisgIGlmIChtX3Vuc3BfaW5mbyAmJiBtX3Vuc3BfaW5mby0+RlNES19VblN1cHBvcnRfSGFuZGxlcikgeworICAgIG1fdW5zcF9pbmZvLT5GU0RLX1VuU3VwcG9ydF9IYW5kbGVyKG1fdW5zcF9pbmZvLCBuRXJyb3JUeXBlKTsKKyAgfQogfQogCi12b2lkIEZyZWVVbnN1cHBvcnRJbmZvKHZvaWQqIHBEYXRhKQotewotICAgIENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciAqIHBBZGFwdGVyID0gKENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciAqKXBEYXRhOwotICAgIGRlbGV0ZSBwQWRhcHRlcjsKK3ZvaWQgRnJlZVVuc3VwcG9ydEluZm8odm9pZCogcERhdGEpIHsKKyAgQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyKiBwQWRhcHRlciA9IChDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIqKXBEYXRhOworICBkZWxldGUgcEFkYXB0ZXI7CiB9CiAKLUZYX0JPT0wgRlBERl9VblN1cHBvcnRFcnJvcihpbnQgbkVycm9yKQotewotICAgIENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciAqIHBBZGFwdGVyID0gKENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciAqKUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UHJpdmF0ZURhdGEoKHZvaWQgKilGUERGU0RLX1VOU1VQUE9SVF9DQUxMKTsKK0ZYX0JPT0wgRlBERl9VblN1cHBvcnRFcnJvcihpbnQgbkVycm9yKSB7CisgIENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciogcEFkYXB0ZXIgPQorICAgICAgKENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciopQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQcml2YXRlRGF0YSgKKyAgICAgICAgICAodm9pZCopRlBERlNES19VTlNVUFBPUlRfQ0FMTCk7CiAKLSAgICBpZighcEFkYXB0ZXIpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBwQWRhcHRlci0+UmVwb3J0RXJyb3IobkVycm9yKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZTREtfU2V0VW5TcE9ialByb2Nlc3NIYW5kbGVyKFVOU1VQUE9SVF9JTkZPKiB1bnNwX2luZm8pCi17Ci0gICAgaWYgKCF1bnNwX2luZm8gfHwgdW5zcF9pbmZvLT52ZXJzaW9uIT0xKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyICogcEFkYXB0ZXIgPSBuZXcgQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyKHVuc3BfaW5mbyk7Ci0KLSAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPlNldFByaXZhdGVEYXRhKCh2b2lkICopRlBERlNES19VTlNVUFBPUlRfQ0FMTCxwQWRhcHRlciwgJkZyZWVVbnN1cHBvcnRJbmZvKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIENoZWNrVW5TdXBwb3J0QW5ub3QoQ1BERl9Eb2N1bWVudCAqIHBEb2MsIENQREZfQW5ub3QqIHBQREZBbm5vdCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBjYlN1YlR5cGUgPSBwUERGQW5ub3QtPkdldFN1YlR5cGUoKTsKLSAgICBpZihjYlN1YlR5cGUuQ29tcGFyZSgiM0QiKSA9PSAwKQotICAgIHsKLSAgICAgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfM0RBTk5PVCk7Ci0gICAgfQotICAgIGVsc2UgaWYoY2JTdWJUeXBlLkNvbXBhcmUoIlNjcmVlbiIpID09MCkKLSAgICB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9IHBQREZBbm5vdC0+R2V0QW5ub3REaWN0KCk7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNiU3RyaW5nOwotICAgICAgICBpZihwQW5ub3REaWN0LT5LZXlFeGlzdCgiSVQiKSkKLSAgICAgICAgICAgIGNiU3RyaW5nID0gcEFubm90RGljdC0+R2V0U3RyaW5nKCJJVCIpOwotICAgICAgICBpZihjYlN0cmluZy5Db21wYXJlKCJJbWciKSAhPSAwKQotICAgICAgICAgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfU0NSRUVOX01FRElBKTsKLSAgICB9Ci0gICAgZWxzZSBpZihjYlN1YlR5cGUuQ29tcGFyZSgiTW92aWUiKSA9PTApCi0gICAgewotICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9BTk5PVF9NT1ZJRSk7Ci0gICAgfQotICAgIGVsc2UgaWYoY2JTdWJUeXBlLkNvbXBhcmUoIlNvdW5kIikgPT0wKQotICAgIHsKLSAgICAgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfU09VTkQpOwotICAgIH0KLSAgICBlbHNlIGlmKGNiU3ViVHlwZS5Db21wYXJlKCJSaWNoTWVkaWEiKSA9PTApCi0gICAgewotICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9BTk5PVF9TQ1JFRU5fUklDSE1FRElBKTsKLSAgICB9Ci0gICAgZWxzZSBpZihjYlN1YlR5cGUuQ29tcGFyZSgiRmlsZUF0dGFjaG1lbnQiKSA9PTApCi0gICAgewotICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9BTk5PVF9BVFRBQ0hNRU5UKTsKLSAgICB9Ci0gICAgZWxzZSBpZihjYlN1YlR5cGUuQ29tcGFyZSgiV2lkZ2V0IikgPT0wKQotICAgIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0ID0gcFBERkFubm90LT5HZXRBbm5vdERpY3QoKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY2JTdHJpbmc7Ci0gICAgICAgIGlmKHBBbm5vdERpY3QtPktleUV4aXN0KCJGVCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYlN0cmluZyA9IHBBbm5vdERpY3QtPkdldFN0cmluZygiRlQiKTsKLSAgICAgICAgfQotICAgICAgICBpZihjYlN0cmluZy5Db21wYXJlKCJTaWciKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9BTk5PVF9TSUcpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLUZYX0JPT0wgQ2hlY2tTaGFyZWRGb3JtKENYTUxfRWxlbWVudCAqIHBFbGVtZW50LCBDRlhfQnl0ZVN0cmluZyBjYk5hbWUpCi17Ci0gICAgaW50IGNvdW50ID0gcEVsZW1lbnQtPkNvdW50QXR0cnMoKTsKLSAgICBpbnQgaT0wOwotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3BhY2UsIG5hbWU7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHZhbHVlOwotICAgICAgICBwRWxlbWVudC0+R2V0QXR0ckJ5SW5kZXgoaSwgc3BhY2UsIG5hbWUsIHZhbHVlKTsKLSAgICAgICAgaWYgKHNwYWNlID09IEZYX0JTVFJDKCJ4bWxucyIpICYmIG5hbWUgPT0gRlhfQlNUUkMoImFkaG9jd2YiKSAmJiB2YWx1ZSA9PSAgTCJodHRwOi8vbnMuYWRvYmUuY29tL0Fjcm9iYXRBZGhvY1dvcmtmbG93LzEuMC8iKQotICAgICAgICB7Ci0gICAgICAgICAgICBDWE1MX0VsZW1lbnQgKnBWZXJzaW9uID0gcEVsZW1lbnQtPkdldEVsZW1lbnQoImFkaG9jd2YiLGNiTmFtZSk7Ci0gICAgICAgICAgICBpZiAoIXBWZXJzaW9uKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50ID0gcFZlcnNpb24tPkdldENvbnRlbnQoMCk7IC8vID09IDEuMQotICAgICAgICAgICAgaW50IG5UeXBlID0gd3NDb250ZW50LkdldEludGVnZXIoKTsKLSAgICAgICAgICAgIHN3aXRjaChuVHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9ET0NfU0hBUkVERk9STV9BQ1JPQkFUKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9ET0NfU0hBUkVERk9STV9GSUxFU1lTVEVNKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9ET0NfU0hBUkVERk9STV9FTUFJTCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBGWF9EV09SRCBuQ291bnQgPSBwRWxlbWVudC0+Q291bnRDaGlsZHJlbigpOwotICAgIGZvcihpPTA7IGk8KGludCluQ291bnQ7IGkrKykKLSAgICB7Ci0gICAgICAgIENYTUxfRWxlbWVudDo6Q2hpbGRUeXBlIGNoaWxkVHlwZSA9IHBFbGVtZW50LT5HZXRDaGlsZFR5cGUoaSk7Ci0gICAgICAgIGlmKGNoaWxkVHlwZSA9PSBDWE1MX0VsZW1lbnQ6OkVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENYTUxfRWxlbWVudCAqIHBDaGlsZCA9IHBFbGVtZW50LT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgaWYoQ2hlY2tTaGFyZWRGb3JtKHBDaGlsZCwgY2JOYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KKyAgaWYgKCFwQWRhcHRlcikKICAgICByZXR1cm4gRkFMU0U7CisgIHBBZGFwdGVyLT5SZXBvcnRFcnJvcihuRXJyb3IpOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDaGVja1VuU3VwcG9ydEVycm9yKENQREZfRG9jdW1lbnQgKiBwRG9jLCBGWF9EV09SRCBlcnJfY29kZSkKLXsKLQkvLyBTZWN1cml0eQotCWlmKGVycl9jb2RlID09IEZQREZfRVJSX1NFQ1VSSVRZKQotCXsKLQkJRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfRE9DX1NFQ1VSSVRZKTsKLQkJcmV0dXJuIDsKLQl9Ci0JaWYoIXBEb2MpCi0JCXJldHVybiA7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwKK0ZTREtfU2V0VW5TcE9ialByb2Nlc3NIYW5kbGVyKFVOU1VQUE9SVF9JTkZPKiB1bnNwX2luZm8pIHsKKyAgaWYgKCF1bnNwX2luZm8gfHwgdW5zcF9pbmZvLT52ZXJzaW9uICE9IDEpCisgICAgcmV0dXJuIEZBTFNFOworICBDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIqIHBBZGFwdGVyID0KKyAgICAgIG5ldyBDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIodW5zcF9pbmZvKTsKIAotCS8vIFBvcnRmb2xpb3MgYW5kIFBhY2thZ2VzCi0JQ1BERl9EaWN0aW9uYXJ5ICogcFJvb3REaWN0ID0gcERvYy0+R2V0Um9vdCgpOwotCWlmKHBSb290RGljdCkKLQl7Ci0JCUNGWF9CeXRlU3RyaW5nIGNiU3RyaW5nOwotCQlpZihwUm9vdERpY3QtPktleUV4aXN0KCJDb2xsZWN0aW9uIikpCi0JCXsKLQkJCUZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19QT1JUQUJMRUNPTExFQ1RJT04pOwotCQkJcmV0dXJuIDsKLQkJfQotCQlpZihwUm9vdERpY3QtPktleUV4aXN0KCJOYW1lcyIpKQotCQl7Ci0JCQlDUERGX0RpY3Rpb25hcnkqIHBOYW1lRGljdCA9IHBSb290RGljdC0+R2V0RGljdCgiTmFtZXMiKTsKLQkJCWlmIChwTmFtZURpY3QgJiYgcE5hbWVEaWN0LT5LZXlFeGlzdCgiRW1iZWRkZWRGaWxlcyIpKQotCQkJewotCQkJCUZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19BVFRBQ0hNRU5UKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIGlmIChwTmFtZURpY3QgJiYgcE5hbWVEaWN0LT5LZXlFeGlzdCgiSmF2YVNjcmlwdCIpKQotCQkJewotCQkJCUNQREZfRGljdGlvbmFyeSogcEpTRGljdCA9IHBOYW1lRGljdC0+R2V0RGljdCgiSmF2YVNjcmlwdCIpOwotCQkJCUNQREZfQXJyYXkgKiBwQXJyYXkgPSBwSlNEaWN0ID8gcEpTRGljdC0+R2V0QXJyYXkoIk5hbWVzIikgOiBOVUxMOwotCQkJCWlmIChwQXJyYXkpIHsKLQkJCQkJaW50IG5Db3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKLQkJCQkJZm9yKGludCBpPTA7IGk8bkNvdW50OyBpKyspCi0JCQkJCXsKLQkJCQkJCUNGWF9CeXRlU3RyaW5nIGNiU3RyID0gcEFycmF5LT5HZXRTdHJpbmcoaSk7Ci0JCQkJCQlpZihjYlN0ci5Db21wYXJlKCJjb20uYWRvYmUuYWNyb2JhdC5TaGFyZWRSZXZpZXcuUmVnaXN0ZXIiKSA9PSAwKQotCQkJCQkJewotCQkJCQkJCUZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19TSEFSRURSRVZJRVcpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5TZXRQcml2YXRlRGF0YSgodm9pZCopRlBERlNES19VTlNVUFBPUlRfQ0FMTCwgcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkZyZWVVbnN1cHBvcnRJbmZvKTsKIAotCS8vIFNoYXJlZEZvcm0KLQlDUERGX01ldGFkYXRhIG1ldGFEYXRhOwotCW1ldGFEYXRhLkxvYWREb2MocERvYyk7Ci0JQ1hNTF9FbGVtZW50ICogcEVsZW1lbnQgPSBtZXRhRGF0YS5HZXRSb290KCk7Ci0JaWYocEVsZW1lbnQpCi0JCUNoZWNrU2hhcmVkRm9ybShwRWxlbWVudCwgIndvcmtmbG93VHlwZSIpOworICByZXR1cm4gVFJVRTsKIH0KIAotRExMRVhQT1JUIGludCBGUERGRG9jX0dldFBhZ2VNb2RlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpCi17Ci0gICAgaWYgKCFkb2N1bWVudCkKLSAgICAgICAgcmV0dXJuIFBBR0VNT0RFX1VOS05PV047Cit2b2lkIENoZWNrVW5TdXBwb3J0QW5ub3QoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9Bbm5vdCogcFBERkFubm90KSB7CisgIENGWF9CeXRlU3RyaW5nIGNiU3ViVHlwZSA9IHBQREZBbm5vdC0+R2V0U3ViVHlwZSgpOworICBpZiAoY2JTdWJUeXBlLkNvbXBhcmUoIjNEIikgPT0gMCkgeworICAgIEZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0FOTk9UXzNEQU5OT1QpOworICB9IGVsc2UgaWYgKGNiU3ViVHlwZS5Db21wYXJlKCJTY3JlZW4iKSA9PSAwKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0ID0gcFBERkFubm90LT5HZXRBbm5vdERpY3QoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBjYlN0cmluZzsKKyAgICBpZiAocEFubm90RGljdC0+S2V5RXhpc3QoIklUIikpCisgICAgICBjYlN0cmluZyA9IHBBbm5vdERpY3QtPkdldFN0cmluZygiSVQiKTsKKyAgICBpZiAoY2JTdHJpbmcuQ29tcGFyZSgiSW1nIikgIT0gMCkKKyAgICAgIEZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0FOTk9UX1NDUkVFTl9NRURJQSk7CisgIH0gZWxzZSBpZiAoY2JTdWJUeXBlLkNvbXBhcmUoIk1vdmllIikgPT0gMCkgeworICAgIEZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0FOTk9UX01PVklFKTsKKyAgfSBlbHNlIGlmIChjYlN1YlR5cGUuQ29tcGFyZSgiU291bmQiKSA9PSAwKSB7CisgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfU09VTkQpOworICB9IGVsc2UgaWYgKGNiU3ViVHlwZS5Db21wYXJlKCJSaWNoTWVkaWEiKSA9PSAwKSB7CisgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfU0NSRUVOX1JJQ0hNRURJQSk7CisgIH0gZWxzZSBpZiAoY2JTdWJUeXBlLkNvbXBhcmUoIkZpbGVBdHRhY2htZW50IikgPT0gMCkgeworICAgIEZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0FOTk9UX0FUVEFDSE1FTlQpOworICB9IGVsc2UgaWYgKGNiU3ViVHlwZS5Db21wYXJlKCJXaWRnZXQiKSA9PSAwKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0ID0gcFBERkFubm90LT5HZXRBbm5vdERpY3QoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBjYlN0cmluZzsKKyAgICBpZiAocEFubm90RGljdC0+S2V5RXhpc3QoIkZUIikpIHsKKyAgICAgIGNiU3RyaW5nID0gcEFubm90RGljdC0+R2V0U3RyaW5nKCJGVCIpOworICAgIH0KKyAgICBpZiAoY2JTdHJpbmcuQ29tcGFyZSgiU2lnIikgPT0gMCkgeworICAgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfU0lHKTsKKyAgICB9CisgIH0KK30KIAotCUNQREZfRGljdGlvbmFyeSAqcFJvb3QgPSAoKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpKS0+R2V0Um9vdCgpOwotICAgIGlmICghcFJvb3QpCi0gICAgICAgIHJldHVybiBQQUdFTU9ERV9VTktOT1dOOworRlhfQk9PTCBDaGVja1NoYXJlZEZvcm0oQ1hNTF9FbGVtZW50KiBwRWxlbWVudCwgQ0ZYX0J5dGVTdHJpbmcgY2JOYW1lKSB7CisgIGludCBjb3VudCA9IHBFbGVtZW50LT5Db3VudEF0dHJzKCk7CisgIGludCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzcGFjZSwgbmFtZTsKKyAgICBDRlhfV2lkZVN0cmluZyB2YWx1ZTsKKyAgICBwRWxlbWVudC0+R2V0QXR0ckJ5SW5kZXgoaSwgc3BhY2UsIG5hbWUsIHZhbHVlKTsKKyAgICBpZiAoc3BhY2UgPT0gRlhfQlNUUkMoInhtbG5zIikgJiYgbmFtZSA9PSBGWF9CU1RSQygiYWRob2N3ZiIpICYmCisgICAgICAgIHZhbHVlID09IEwiaHR0cDovL25zLmFkb2JlLmNvbS9BY3JvYmF0QWRob2NXb3JrZmxvdy8xLjAvIikgeworICAgICAgQ1hNTF9FbGVtZW50KiBwVmVyc2lvbiA9IHBFbGVtZW50LT5HZXRFbGVtZW50KCJhZGhvY3dmIiwgY2JOYW1lKTsKKyAgICAgIGlmICghcFZlcnNpb24pCisgICAgICAgIGNvbnRpbnVlOworICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50ID0gcFZlcnNpb24tPkdldENvbnRlbnQoMCk7ICAvLyA9PSAxLjEKKyAgICAgIGludCBuVHlwZSA9IHdzQ29udGVudC5HZXRJbnRlZ2VyKCk7CisgICAgICBzd2l0Y2ggKG5UeXBlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9ET0NfU0hBUkVERk9STV9BQ1JPQkFUKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIEZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19TSEFSRURGT1JNX0ZJTEVTWVNURU0pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfRE9DX1NIQVJFREZPUk1fRU1BSUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQogCi0gICAgQ1BERl9PYmplY3QqIHBOYW1lID0gcFJvb3QtPkdldEVsZW1lbnQoIlBhZ2VNb2RlIik7Ci0gICAgaWYgKCFwTmFtZSkKLSAgICAgICAgcmV0dXJuIFBBR0VNT0RFX1VTRU5PTkU7CisgIEZYX0RXT1JEIG5Db3VudCA9IHBFbGVtZW50LT5Db3VudENoaWxkcmVuKCk7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KW5Db3VudDsgaSsrKSB7CisgICAgQ1hNTF9FbGVtZW50OjpDaGlsZFR5cGUgY2hpbGRUeXBlID0gcEVsZW1lbnQtPkdldENoaWxkVHlwZShpKTsKKyAgICBpZiAoY2hpbGRUeXBlID09IENYTUxfRWxlbWVudDo6RWxlbWVudCkgeworICAgICAgQ1hNTF9FbGVtZW50KiBwQ2hpbGQgPSBwRWxlbWVudC0+R2V0RWxlbWVudChpKTsKKyAgICAgIGlmIChDaGVja1NoYXJlZEZvcm0ocENoaWxkLCBjYk5hbWUpKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyUGFnZU1vZGUgPSBwTmFtZS0+R2V0U3RyaW5nKCk7Ci0gICAgaWYgKHN0clBhZ2VNb2RlLklzRW1wdHkoKXx8c3RyUGFnZU1vZGUuRXF1YWxOb0Nhc2UoIlVzZU5vbmUiKSkKLSAgICAgICAgcmV0dXJuIFBBR0VNT0RFX1VTRU5PTkU7Ci0gICAgaWYgKHN0clBhZ2VNb2RlLkVxdWFsTm9DYXNlKCJVc2VPdXRsaW5lcyIpKQotICAgICAgICByZXR1cm4gUEFHRU1PREVfVVNFT1VUTElORVM7Ci0gICAgaWYgKHN0clBhZ2VNb2RlLkVxdWFsTm9DYXNlKCJVc2VUaHVtYnMiKSkKLSAgICAgICAgcmV0dXJuIFBBR0VNT0RFX1VTRVRIVU1CUzsKLSAgICBpZiAoc3RyUGFnZU1vZGUuRXF1YWxOb0Nhc2UoIkZ1bGxTY3JlZW4iKSkKLSAgICAgICAgcmV0dXJuIFBBR0VNT0RFX0ZVTExTQ1JFRU47Ci0gICAgaWYgKHN0clBhZ2VNb2RlLkVxdWFsTm9DYXNlKCJVc2VPQyIpKQotICAgICAgICByZXR1cm4gUEFHRU1PREVfVVNFT0M7Ci0gICAgaWYgKHN0clBhZ2VNb2RlLkVxdWFsTm9DYXNlKCJVc2VBdHRhY2htZW50cyIpKQotICAgICAgICByZXR1cm4gUEFHRU1PREVfVVNFQVRUQUNITUVOVFM7Cit2b2lkIENoZWNrVW5TdXBwb3J0RXJyb3IoQ1BERl9Eb2N1bWVudCogcERvYywgRlhfRFdPUkQgZXJyX2NvZGUpIHsKKyAgLy8gU2VjdXJpdHkKKyAgaWYgKGVycl9jb2RlID09IEZQREZfRVJSX1NFQ1VSSVRZKSB7CisgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfRE9DX1NFQ1VSSVRZKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwRG9jKQorICAgIHJldHVybjsKIAorICAvLyBQb3J0Zm9saW9zIGFuZCBQYWNrYWdlcworICBDUERGX0RpY3Rpb25hcnkqIHBSb290RGljdCA9IHBEb2MtPkdldFJvb3QoKTsKKyAgaWYgKHBSb290RGljdCkgeworICAgIENGWF9CeXRlU3RyaW5nIGNiU3RyaW5nOworICAgIGlmIChwUm9vdERpY3QtPktleUV4aXN0KCJDb2xsZWN0aW9uIikpIHsKKyAgICAgIEZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19QT1JUQUJMRUNPTExFQ1RJT04pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocFJvb3REaWN0LT5LZXlFeGlzdCgiTmFtZXMiKSkgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTmFtZURpY3QgPSBwUm9vdERpY3QtPkdldERpY3QoIk5hbWVzIik7CisgICAgICBpZiAocE5hbWVEaWN0ICYmIHBOYW1lRGljdC0+S2V5RXhpc3QoIkVtYmVkZGVkRmlsZXMiKSkgeworICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9ET0NfQVRUQUNITUVOVCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSBpZiAocE5hbWVEaWN0ICYmIHBOYW1lRGljdC0+S2V5RXhpc3QoIkphdmFTY3JpcHQiKSkgeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBKU0RpY3QgPSBwTmFtZURpY3QtPkdldERpY3QoIkphdmFTY3JpcHQiKTsKKyAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcEpTRGljdCA/IHBKU0RpY3QtPkdldEFycmF5KCJOYW1lcyIpIDogTlVMTDsKKyAgICAgICAgaWYgKHBBcnJheSkgeworICAgICAgICAgIGludCBuQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY2JTdHIgPSBwQXJyYXktPkdldFN0cmluZyhpKTsKKyAgICAgICAgICAgIGlmIChjYlN0ci5Db21wYXJlKCJjb20uYWRvYmUuYWNyb2JhdC5TaGFyZWRSZXZpZXcuUmVnaXN0ZXIiKSA9PSAwKSB7CisgICAgICAgICAgICAgIEZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19TSEFSRURSRVZJRVcpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gU2hhcmVkRm9ybQorICBDUERGX01ldGFkYXRhIG1ldGFEYXRhOworICBtZXRhRGF0YS5Mb2FkRG9jKHBEb2MpOworICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gbWV0YURhdGEuR2V0Um9vdCgpOworICBpZiAocEVsZW1lbnQpCisgICAgQ2hlY2tTaGFyZWRGb3JtKHBFbGVtZW50LCAid29ya2Zsb3dUeXBlIik7Cit9CisKK0RMTEVYUE9SVCBpbnQgRlBERkRvY19HZXRQYWdlTW9kZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CisgIGlmICghZG9jdW1lbnQpCiAgICAgcmV0dXJuIFBBR0VNT0RFX1VOS05PV047CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9CisgICAgICAoKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpKS0+R2V0Um9vdCgpOworICBpZiAoIXBSb290KQorICAgIHJldHVybiBQQUdFTU9ERV9VTktOT1dOOworCisgIENQREZfT2JqZWN0KiBwTmFtZSA9IHBSb290LT5HZXRFbGVtZW50KCJQYWdlTW9kZSIpOworICBpZiAoIXBOYW1lKQorICAgIHJldHVybiBQQUdFTU9ERV9VU0VOT05FOworCisgIENGWF9CeXRlU3RyaW5nIHN0clBhZ2VNb2RlID0gcE5hbWUtPkdldFN0cmluZygpOworICBpZiAoc3RyUGFnZU1vZGUuSXNFbXB0eSgpIHx8IHN0clBhZ2VNb2RlLkVxdWFsTm9DYXNlKCJVc2VOb25lIikpCisgICAgcmV0dXJuIFBBR0VNT0RFX1VTRU5PTkU7CisgIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZSgiVXNlT3V0bGluZXMiKSkKKyAgICByZXR1cm4gUEFHRU1PREVfVVNFT1VUTElORVM7CisgIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZSgiVXNlVGh1bWJzIikpCisgICAgcmV0dXJuIFBBR0VNT0RFX1VTRVRIVU1CUzsKKyAgaWYgKHN0clBhZ2VNb2RlLkVxdWFsTm9DYXNlKCJGdWxsU2NyZWVuIikpCisgICAgcmV0dXJuIFBBR0VNT0RFX0ZVTExTQ1JFRU47CisgIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZSgiVXNlT0MiKSkKKyAgICByZXR1cm4gUEFHRU1PREVfVVNFT0M7CisgIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZSgiVXNlQXR0YWNobWVudHMiKSkKKyAgICByZXR1cm4gUEFHRU1PREVfVVNFQVRUQUNITUVOVFM7CisKKyAgcmV0dXJuIFBBR0VNT0RFX1VOS05PV047CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX2ZsYXR0ZW4uY3BwIGIvZnBkZnNkay9zcmMvZnBkZl9mbGF0dGVuLmNwcAppbmRleCA5ZWY2MTE3Li41NTE0YjJiIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX2ZsYXR0ZW4uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfZmxhdHRlbi5jcHAKQEAgLTE1LDU0NCArMTUsNTI1IEBACiBlbnVtIEZQREZfVFlQRSB7IE1BWCwgTUlOIH07CiBlbnVtIEZQREZfVkFMVUUgeyBUT1AsIExFRlQsIFJJR0hULCBCT1RUT00gfTsKIAotRlhfQk9PTCBJc1ZhbGlhYmxlUmVjdChDUERGX1JlY3QgcmVjdCwgQ1BERl9SZWN0IHJjUGFnZSkKLXsKLQlpZiAoIHJlY3QubGVmdCAtIHJlY3QucmlnaHQgPiAwLjAwMDAwMWYgfHwKLQkJIHJlY3QuYm90dG9tIC0gcmVjdC50b3AgPiAwLjAwMDAwMWYpCi0JCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgSXNWYWxpYWJsZVJlY3QoQ1BERl9SZWN0IHJlY3QsIENQREZfUmVjdCByY1BhZ2UpIHsKKyAgaWYgKHJlY3QubGVmdCAtIHJlY3QucmlnaHQgPiAwLjAwMDAwMWYgfHwgcmVjdC5ib3R0b20gLSByZWN0LnRvcCA+IDAuMDAwMDAxZikKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAocmVjdC5sZWZ0ID09IDAuMGYgJiYKLQkJcmVjdC50b3AgPT0gMC4wZiAmJgotCQlyZWN0LnJpZ2h0ID09IDAuMGYgJiYKLQkJcmVjdC5ib3R0b20gPT0gMC4wZikKLQkJcmV0dXJuIEZBTFNFOworICBpZiAocmVjdC5sZWZ0ID09IDAuMGYgJiYgcmVjdC50b3AgPT0gMC4wZiAmJiByZWN0LnJpZ2h0ID09IDAuMGYgJiYKKyAgICAgIHJlY3QuYm90dG9tID09IDAuMGYpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKCFyY1BhZ2UuSXNFbXB0eSgpKQotCXsKLQkJaWYgKHJlY3QubGVmdCAtIHJjUGFnZS5sZWZ0IDwgLTEwLjAwMDAwMWYgfHwKLQkJCXJlY3QucmlnaHQgLSByY1BhZ2UucmlnaHQgPiAxMC4wMDAwMDFmIHx8Ci0JCQlyZWN0LnRvcCAtIHJjUGFnZS50b3AgPiAxMC4wMDAwMDFmIHx8Ci0JCQlyZWN0LmJvdHRvbSAtIHJjUGFnZS5ib3R0b20gPCAtMTAuMDAwMDAxZikKLQkJCXJldHVybiBGQUxTRTsKLQl9CisgIGlmICghcmNQYWdlLklzRW1wdHkoKSkgeworICAgIGlmIChyZWN0LmxlZnQgLSByY1BhZ2UubGVmdCA8IC0xMC4wMDAwMDFmIHx8CisgICAgICAgIHJlY3QucmlnaHQgLSByY1BhZ2UucmlnaHQgPiAxMC4wMDAwMDFmIHx8CisgICAgICAgIHJlY3QudG9wIC0gcmNQYWdlLnRvcCA+IDEwLjAwMDAwMWYgfHwKKyAgICAgICAgcmVjdC5ib3R0b20gLSByY1BhZ2UuYm90dG9tIDwgLTEwLjAwMDAwMWYpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAorRlhfQk9PTCBHZXRDb250ZW50c1JlY3QoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3RBcnJheSogcFJlY3RBcnJheSkgeworICBDUERGX1BhZ2UqIHBQREZQYWdlID0gRlhfTkVXIENQREZfUGFnZTsKKyAgcFBERlBhZ2UtPkxvYWQocERvYywgcERpY3QsIEZBTFNFKTsKKyAgcFBERlBhZ2UtPlBhcnNlQ29udGVudCgpOwogCi1GWF9CT09MIEdldENvbnRlbnRzUmVjdCggQ1BERl9Eb2N1bWVudCAqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfUmVjdEFycmF5ICogcFJlY3RBcnJheSApCi17Ci0JQ1BERl9QYWdlKiBwUERGUGFnZSA9IEZYX05FVyBDUERGX1BhZ2U7Ci0JcFBERlBhZ2UtPkxvYWQoIHBEb2MsIHBEaWN0LCBGQUxTRSApOwotCXBQREZQYWdlLT5QYXJzZUNvbnRlbnQoKTsKKyAgRlhfUE9TSVRJT04gcG9zID0gcFBERlBhZ2UtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKIAotCUZYX1BPU0lUSU9OIHBvcyA9IHBQREZQYWdlLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0ID0gcFBERlBhZ2UtPkdldE5leHRPYmplY3QocG9zKTsKKyAgICBpZiAoIXBQYWdlT2JqZWN0KQorICAgICAgY29udGludWU7CiAKLQl3aGlsZSAocG9zKQotCXsKLQkJQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iamVjdCA9IHBQREZQYWdlLT5HZXROZXh0T2JqZWN0KHBvcyk7Ci0JCWlmICghcFBhZ2VPYmplY3QpY29udGludWU7CisgICAgQ1BERl9SZWN0IHJjOworICAgIHJjLmxlZnQgPSBwUGFnZU9iamVjdC0+bV9MZWZ0OworICAgIHJjLnJpZ2h0ID0gcFBhZ2VPYmplY3QtPm1fUmlnaHQ7CisgICAgcmMuYm90dG9tID0gcFBhZ2VPYmplY3QtPm1fQm90dG9tOworICAgIHJjLnRvcCA9IHBQYWdlT2JqZWN0LT5tX1RvcDsKIAotCQlDUERGX1JlY3QgcmM7Ci0JCXJjLmxlZnQgPSBwUGFnZU9iamVjdC0+bV9MZWZ0OwotCQlyYy5yaWdodCA9IHBQYWdlT2JqZWN0LT5tX1JpZ2h0OwotCQlyYy5ib3R0b20gPSBwUGFnZU9iamVjdC0+bV9Cb3R0b207Ci0JCXJjLnRvcCA9IHBQYWdlT2JqZWN0LT5tX1RvcDsKLQotCQlpZiAoSXNWYWxpYWJsZVJlY3QocmMsIHBEaWN0LT5HZXRSZWN0KCJNZWRpYUJveCIpKSkKLQkJewotCQkJcFJlY3RBcnJheS0+QWRkKHJjKTsKLQkJfQotCX0KLQotCWRlbGV0ZSBwUERGUGFnZTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotCi12b2lkIFBhcnNlclN0cmVhbSggQ1BERl9EaWN0aW9uYXJ5ICogcFBhZ2VEaWMsIENQREZfRGljdGlvbmFyeSogcFN0cmVhbSwgQ1BERl9SZWN0QXJyYXkgKiBwUmVjdEFycmF5LCBDUERGX09iamVjdEFycmF5ICogcE9iamVjdEFycmF5ICkKLXsKLQlpZiAoIXBTdHJlYW0pcmV0dXJuOwotCUNQREZfUmVjdCByZWN0OwotCWlmIChwU3RyZWFtLT5LZXlFeGlzdCgiUmVjdCIpKQotCQlyZWN0ID0gcFN0cmVhbS0+R2V0UmVjdCgiUmVjdCIpOwotCWVsc2UgaWYgKHBTdHJlYW0tPktleUV4aXN0KCJCQm94IikpCi0JCXJlY3QgPSBwU3RyZWFtLT5HZXRSZWN0KCJCQm94Iik7Ci0KLQlpZiAoSXNWYWxpYWJsZVJlY3QocmVjdCwgcFBhZ2VEaWMtPkdldFJlY3QoIk1lZGlhQm94IikpKQotCQlwUmVjdEFycmF5LT5BZGQocmVjdCk7Ci0KLQlwT2JqZWN0QXJyYXktPkFkZChwU3RyZWFtKTsKLX0KLQotCi1pbnQgUGFyc2VyQW5ub3RzKCBDUERGX0RvY3VtZW50KiBwU291cmNlRG9jLCBDUERGX0RpY3Rpb25hcnkgKiBwUGFnZURpYywgQ1BERl9SZWN0QXJyYXkgKiBwUmVjdEFycmF5LCBDUERGX09iamVjdEFycmF5ICogcE9iamVjdEFycmF5LCBpbnQgblVzYWdlKQotewotICAgIGlmICghcFNvdXJjZURvYyB8fCAhcFBhZ2VEaWMpCi0gICAgICAgIHJldHVybiBGTEFUVEVOX0ZBSUw7Ci0KLSAgICBHZXRDb250ZW50c1JlY3QoIHBTb3VyY2VEb2MsIHBQYWdlRGljLCBwUmVjdEFycmF5ICk7Ci0gICAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlRGljLT5HZXRBcnJheSgiQW5ub3RzIik7Ci0gICAgaWYgKCFwQW5ub3RzKQotICAgICAgICByZXR1cm4gRkxBVFRFTl9OT1RISU5HVE9ETzsKLQotICAgIEZYX0RXT1JEIGR3U2l6ZSA9IHBBbm5vdHMtPkdldENvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KWR3U2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwQW5ub3RzLT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgIGlmICghcE9iaiB8fCBwT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpYyA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHNTdWJ0eXBlID0gcEFubm90RGljLT5HZXRTdHJpbmcoIlN1YnR5cGUiKTsKLSAgICAgICAgaWYgKHNTdWJ0eXBlID09ICJQb3B1cCIpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpbnQgbkFubm90RmxhZyA9IHBBbm5vdERpYy0+R2V0SW50ZWdlcigiRiIpOwotICAgICAgICBpZiAobkFubm90RmxhZyAmIEFOTk9URkxBR19ISURERU4pCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZihuVXNhZ2UgPT0gRkxBVF9OT1JNQUxESVNQTEFZKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobkFubm90RmxhZyAmIEFOTk9URkxBR19JTlZJU0lCTEUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFBhcnNlclN0cmVhbSggcFBhZ2VEaWMsIHBBbm5vdERpYywgcFJlY3RBcnJheSwgcE9iamVjdEFycmF5ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobkFubm90RmxhZyAmIEFOTk9URkxBR19QUklOVCkKLSAgICAgICAgICAgICAgICBQYXJzZXJTdHJlYW0oIHBQYWdlRGljLCBwQW5ub3REaWMsIHBSZWN0QXJyYXksIHBPYmplY3RBcnJheSApOwotICAgICAgICB9CisgICAgaWYgKElzVmFsaWFibGVSZWN0KHJjLCBwRGljdC0+R2V0UmVjdCgiTWVkaWFCb3giKSkpIHsKKyAgICAgIHBSZWN0QXJyYXktPkFkZChyYyk7CiAgICAgfQotICAgIHJldHVybiBGTEFUVEVOX1NVQ0NFU1M7CisgIH0KKworICBkZWxldGUgcFBERlBhZ2U7CisgIHJldHVybiBUUlVFOwogfQogCit2b2lkIFBhcnNlclN0cmVhbShDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljLAorICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0QXJyYXkqIHBSZWN0QXJyYXksCisgICAgICAgICAgICAgICAgICBDUERGX09iamVjdEFycmF5KiBwT2JqZWN0QXJyYXkpIHsKKyAgaWYgKCFwU3RyZWFtKQorICAgIHJldHVybjsKKyAgQ1BERl9SZWN0IHJlY3Q7CisgIGlmIChwU3RyZWFtLT5LZXlFeGlzdCgiUmVjdCIpKQorICAgIHJlY3QgPSBwU3RyZWFtLT5HZXRSZWN0KCJSZWN0Iik7CisgIGVsc2UgaWYgKHBTdHJlYW0tPktleUV4aXN0KCJCQm94IikpCisgICAgcmVjdCA9IHBTdHJlYW0tPkdldFJlY3QoIkJCb3giKTsKIAotRlhfRkxPQVQgR2V0TWluTWF4VmFsdWUoIENQREZfUmVjdEFycmF5JiBhcnJheSwgRlBERl9UWVBFIHR5cGUsIEZQREZfVkFMVUUgdmFsdWUpCi17Ci0JaW50IG5SZWN0cyA9IGFycmF5LkdldFNpemUoKTsKLQlGWF9GTE9BVCBmUmV0ID0gMC4wZjsKKyAgaWYgKElzVmFsaWFibGVSZWN0KHJlY3QsIHBQYWdlRGljLT5HZXRSZWN0KCJNZWRpYUJveCIpKSkKKyAgICBwUmVjdEFycmF5LT5BZGQocmVjdCk7CiAKLQlpZiAoblJlY3RzIDw9IDApcmV0dXJuIDAuMGY7Ci0KLQlGWF9GTE9BVCogcEFycmF5ID0gbmV3IEZYX0ZMT0FUW25SZWN0c107Ci0Jc3dpdGNoKHZhbHVlKQotCXsKLQljYXNlIExFRlQ6Ci0JCXsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblJlY3RzOyBpKyspCi0JCQkJcEFycmF5W2ldID0gQ1BERl9SZWN0KGFycmF5LkdldEF0KGkpKS5sZWZ0OwotCi0JCQlicmVhazsKLQkJfQotCWNhc2UgVE9QOgotCQl7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZWN0czsgaSsrKQotCQkJCXBBcnJheVtpXSA9IENQREZfUmVjdChhcnJheS5HZXRBdChpKSkudG9wOwotCi0JCQlicmVhazsKLQkJfQotCWNhc2UgUklHSFQ6Ci0JCXsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblJlY3RzOyBpKyspCi0JCQkJcEFycmF5W2ldID0gQ1BERl9SZWN0KGFycmF5LkdldEF0KGkpKS5yaWdodDsKLQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEJPVFRPTToKLQkJewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUmVjdHM7IGkrKykKLQkJCQlwQXJyYXlbaV0gPSBDUERGX1JlY3QoYXJyYXkuR2V0QXQoaSkpLmJvdHRvbTsKLQotCQkJYnJlYWs7Ci0JCX0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JZlJldCA9IHBBcnJheVswXTsKLQlpZiAodHlwZSA9PSBNQVgpCi0JewotCQlmb3IgKGludCBpID0gMTsgaSA8IG5SZWN0czsgaSsrKQotCQkJaWYgKGZSZXQgPD0gcEFycmF5W2ldKQotCQkJCWZSZXQgPSBwQXJyYXlbaV07Ci0JfQotCWVsc2UKLQl7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgblJlY3RzOyBpKyspCi0JCQlpZiAoZlJldCA+PSBwQXJyYXlbaV0pCi0JCQkJZlJldCA9IHBBcnJheVtpXTsKLQl9Ci0JZGVsZXRlW10gcEFycmF5OwotCXJldHVybiBmUmV0OworICBwT2JqZWN0QXJyYXktPkFkZChwU3RyZWFtKTsKIH0KIAotQ1BERl9SZWN0IENhbGN1bGF0ZVJlY3QoIENQREZfUmVjdEFycmF5ICogcFJlY3RBcnJheSApCi17CitpbnQgUGFyc2VyQW5ub3RzKENQREZfRG9jdW1lbnQqIHBTb3VyY2VEb2MsCisgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWMsCisgICAgICAgICAgICAgICAgIENQREZfUmVjdEFycmF5KiBwUmVjdEFycmF5LAorICAgICAgICAgICAgICAgICBDUERGX09iamVjdEFycmF5KiBwT2JqZWN0QXJyYXksCisgICAgICAgICAgICAgICAgIGludCBuVXNhZ2UpIHsKKyAgaWYgKCFwU291cmNlRG9jIHx8ICFwUGFnZURpYykKKyAgICByZXR1cm4gRkxBVFRFTl9GQUlMOwogCi0JQ1BERl9SZWN0IHJjUmV0OworICBHZXRDb250ZW50c1JlY3QocFNvdXJjZURvYywgcFBhZ2VEaWMsIHBSZWN0QXJyYXkpOworICBDUERGX0FycmF5KiBwQW5ub3RzID0gcFBhZ2VEaWMtPkdldEFycmF5KCJBbm5vdHMiKTsKKyAgaWYgKCFwQW5ub3RzKQorICAgIHJldHVybiBGTEFUVEVOX05PVEhJTkdUT0RPOwogCi0JcmNSZXQubGVmdCA9IEdldE1pbk1heFZhbHVlKCpwUmVjdEFycmF5LCBNSU4sIExFRlQpOwotCXJjUmV0LnRvcCA9IEdldE1pbk1heFZhbHVlKCpwUmVjdEFycmF5LCBNQVgsIFRPUCk7Ci0JcmNSZXQucmlnaHQgPSBHZXRNaW5NYXhWYWx1ZSgqcFJlY3RBcnJheSwgTUFYLCBSSUdIVCk7Ci0JcmNSZXQuYm90dG9tID0gR2V0TWluTWF4VmFsdWUoKnBSZWN0QXJyYXksIE1JTiwgQk9UVE9NKTsKKyAgRlhfRFdPUkQgZHdTaXplID0gcEFubm90cy0+R2V0Q291bnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KWR3U2l6ZTsgaSsrKSB7CisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwQW5ub3RzLT5HZXRFbGVtZW50VmFsdWUoaSk7CisgICAgaWYgKCFwT2JqIHx8IHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkKKyAgICAgIGNvbnRpbnVlOwogCi0JcmV0dXJuIHJjUmV0OworICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKKyAgICBDRlhfQnl0ZVN0cmluZyBzU3VidHlwZSA9IHBBbm5vdERpYy0+R2V0U3RyaW5nKCJTdWJ0eXBlIik7CisgICAgaWYgKHNTdWJ0eXBlID09ICJQb3B1cCIpCisgICAgICBjb250aW51ZTsKKworICAgIGludCBuQW5ub3RGbGFnID0gcEFubm90RGljLT5HZXRJbnRlZ2VyKCJGIik7CisgICAgaWYgKG5Bbm5vdEZsYWcgJiBBTk5PVEZMQUdfSElEREVOKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoblVzYWdlID09IEZMQVRfTk9STUFMRElTUExBWSkgeworICAgICAgaWYgKG5Bbm5vdEZsYWcgJiBBTk5PVEZMQUdfSU5WSVNJQkxFKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgUGFyc2VyU3RyZWFtKHBQYWdlRGljLCBwQW5ub3REaWMsIHBSZWN0QXJyYXksIHBPYmplY3RBcnJheSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChuQW5ub3RGbGFnICYgQU5OT1RGTEFHX1BSSU5UKQorICAgICAgICBQYXJzZXJTdHJlYW0ocFBhZ2VEaWMsIHBBbm5vdERpYywgcFJlY3RBcnJheSwgcE9iamVjdEFycmF5KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZMQVRURU5fU1VDQ0VTUzsKIH0KIAorRlhfRkxPQVQgR2V0TWluTWF4VmFsdWUoQ1BERl9SZWN0QXJyYXkmIGFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9UWVBFIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1ZBTFVFIHZhbHVlKSB7CisgIGludCBuUmVjdHMgPSBhcnJheS5HZXRTaXplKCk7CisgIEZYX0ZMT0FUIGZSZXQgPSAwLjBmOwogCi12b2lkIFNldFBhZ2VDb250ZW50cyhDRlhfQnl0ZVN0cmluZyBrZXksIENQREZfRGljdGlvbmFyeSogcFBhZ2UsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlDUERGX09iamVjdCogcENvbnRlbnRzT2JqID0gcFBhZ2UtPkdldFN0cmVhbSgiQ29udGVudHMiKTsKLQlpZiAoIXBDb250ZW50c09iaikKLQl7Ci0JCXBDb250ZW50c09iaiA9IHBQYWdlLT5HZXRBcnJheSgiQ29udGVudHMiKTsKLQl9CisgIGlmIChuUmVjdHMgPD0gMCkKKyAgICByZXR1cm4gMC4wZjsKIAotCWlmICghcENvbnRlbnRzT2JqKQotCXsKLQkJLy9DcmVhdGUgYSBuZXcgY29udGVudHMgZGljdGlvbmFyeQotCQlpZiAoIWtleS5Jc0VtcHR5KCkpCi0JCXsKLQkJCUNQREZfU3RyZWFtKiBwTmV3Q29udGVudHMgPSBGWF9ORVcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgRlhfTkVXIENQREZfRGljdGlvbmFyeSk7Ci0JCQlpZiAoIXBOZXdDb250ZW50cylyZXR1cm47Ci0JCQlwUGFnZS0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgcERvY3VtZW50LCBwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBOZXdDb250ZW50cykpOworICBGWF9GTE9BVCogcEFycmF5ID0gbmV3IEZYX0ZMT0FUW25SZWN0c107CisgIHN3aXRjaCAodmFsdWUpIHsKKyAgICBjYXNlIExFRlQ6IHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblJlY3RzOyBpKyspCisgICAgICAgIHBBcnJheVtpXSA9IENQREZfUmVjdChhcnJheS5HZXRBdChpKSkubGVmdDsKIAotCQkJQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbTsKLQkJCXNTdHJlYW0uRm9ybWF0KCJxIDEgMCAwIDEgMCAwIGNtIC8lcyBEbyBRIiwga2V5LmNfc3RyKCkpOwotCQkJcE5ld0NvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOwotCQl9Ci0JCXJldHVybjsKLQl9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUT1A6IHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblJlY3RzOyBpKyspCisgICAgICAgIHBBcnJheVtpXSA9IENQREZfUmVjdChhcnJheS5HZXRBdChpKSkudG9wOwogCi0JaW50IGlUeXBlID0gcENvbnRlbnRzT2JqLT5HZXRUeXBlKCk7Ci0JQ1BERl9BcnJheSogcENvbnRlbnRzQXJyYXkgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUklHSFQ6IHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblJlY3RzOyBpKyspCisgICAgICAgIHBBcnJheVtpXSA9IENQREZfUmVjdChhcnJheS5HZXRBdChpKSkucmlnaHQ7CiAKLQlzd2l0Y2goaVR5cGUpCi0JewotCWNhc2UgUERGT0JKX1NUUkVBTToKLQkJewotCQkJcENvbnRlbnRzQXJyYXkgPSBGWF9ORVcgQ1BERl9BcnJheTsKLQkJCUNQREZfU3RyZWFtKiBwQ29udGVudHMgPSAoQ1BERl9TdHJlYW0qKXBDb250ZW50c09iajsKLQkJCUZYX0RXT1JEIGR3T2JqTnVtID0gcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwQ29udGVudHMpOwotCQkJQ1BERl9TdHJlYW1BY2MgYWNjOwotCQkJYWNjLkxvYWRBbGxEYXRhKHBDb250ZW50cyk7Ci0JCQlDRlhfQnl0ZVN0cmluZyBzU3RyZWFtID0gInFcbiI7Ci0JCQlDRlhfQnl0ZVN0cmluZyBzQm9keSA9IENGWF9CeXRlU3RyaW5nKChjb25zdCBGWF9DSEFSKilhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKLQkJCXNTdHJlYW0gPSBzU3RyZWFtICsgc0JvZHkgKyAiXG5RIjsKLQkJCXBDb250ZW50cy0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopc1N0cmVhbSwgc1N0cmVhbS5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKLQkJCXBDb250ZW50c0FycmF5LT5BZGRSZWZlcmVuY2UocERvY3VtZW50LCBkd09iak51bSk7Ci0JCQlicmVhazsKLQkJfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQk9UVE9NOiB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5SZWN0czsgaSsrKQorICAgICAgICBwQXJyYXlbaV0gPSBDUERGX1JlY3QoYXJyYXkuR2V0QXQoaSkpLmJvdHRvbTsKIAotCWNhc2UgUERGT0JKX0FSUkFZOgotCQl7Ci0JCQlwQ29udGVudHNBcnJheSA9IChDUERGX0FycmF5KilwQ29udGVudHNPYmo7Ci0JCQlicmVhazsKLQkJfQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICghcENvbnRlbnRzQXJyYXkpcmV0dXJuOwotCi0JRlhfRFdPUkQgZHdPYmpOdW0gPSBwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBDb250ZW50c0FycmF5KTsKLQlwUGFnZS0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgcERvY3VtZW50LCBkd09iak51bSk7Ci0KLQlpZiAoIWtleS5Jc0VtcHR5KCkpCi0JewotCQlDUERGX1N0cmVhbSogcE5ld0NvbnRlbnRzID0gRlhfTkVXIENQREZfU3RyZWFtKE5VTEwsIDAsIEZYX05FVyBDUERGX0RpY3Rpb25hcnkpOwotCQlkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocE5ld0NvbnRlbnRzKTsKLQkJcENvbnRlbnRzQXJyYXktPkFkZFJlZmVyZW5jZShwRG9jdW1lbnQsIGR3T2JqTnVtKTsKLQotCQlDRlhfQnl0ZVN0cmluZyBzU3RyZWFtOwotCQlzU3RyZWFtLkZvcm1hdCgicSAxIDAgMCAxIDAgMCBjbSAvJXMgRG8gUSIsIGtleS5jX3N0cigpKTsKLQkJcE5ld0NvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOwotCX0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgZlJldCA9IHBBcnJheVswXTsKKyAgaWYgKHR5cGUgPT0gTUFYKSB7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuUmVjdHM7IGkrKykKKyAgICAgIGlmIChmUmV0IDw9IHBBcnJheVtpXSkKKyAgICAgICAgZlJldCA9IHBBcnJheVtpXTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IG5SZWN0czsgaSsrKQorICAgICAgaWYgKGZSZXQgPj0gcEFycmF5W2ldKQorICAgICAgICBmUmV0ID0gcEFycmF5W2ldOworICB9CisgIGRlbGV0ZVtdIHBBcnJheTsKKyAgcmV0dXJuIGZSZXQ7CiB9CiAKLUNGWF9BZmZpbmVNYXRyaXggR2V0TWF0cml4KENQREZfUmVjdCByY0Fubm90LCBDUERGX1JlY3QgcmNTdHJlYW0sIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KQotewotCWlmKHJjU3RyZWFtLklzRW1wdHkoKSkKLQkJcmV0dXJuIENGWF9BZmZpbmVNYXRyaXgoKTsKK0NQREZfUmVjdCBDYWxjdWxhdGVSZWN0KENQREZfUmVjdEFycmF5KiBwUmVjdEFycmF5KSB7CisgIENQREZfUmVjdCByY1JldDsKIAotCW1hdHJpeC5UcmFuc2Zvcm1SZWN0KHJjU3RyZWFtKTsKLQlyY1N0cmVhbS5Ob3JtYWxpemUoKTsKKyAgcmNSZXQubGVmdCA9IEdldE1pbk1heFZhbHVlKCpwUmVjdEFycmF5LCBNSU4sIExFRlQpOworICByY1JldC50b3AgPSBHZXRNaW5NYXhWYWx1ZSgqcFJlY3RBcnJheSwgTUFYLCBUT1ApOworICByY1JldC5yaWdodCA9IEdldE1pbk1heFZhbHVlKCpwUmVjdEFycmF5LCBNQVgsIFJJR0hUKTsKKyAgcmNSZXQuYm90dG9tID0gR2V0TWluTWF4VmFsdWUoKnBSZWN0QXJyYXksIE1JTiwgQk9UVE9NKTsKIAotCUZYX0ZMT0FUIGEgPSByY0Fubm90LldpZHRoKCkvcmNTdHJlYW0uV2lkdGgoKTsKLQlGWF9GTE9BVCBkID0gcmNBbm5vdC5IZWlnaHQoKS9yY1N0cmVhbS5IZWlnaHQoKTsKLQotCUZYX0ZMT0FUIGUgPSByY0Fubm90LmxlZnQgLSByY1N0cmVhbS5sZWZ0ICogYTsKLQlGWF9GTE9BVCBmID0gcmNBbm5vdC5ib3R0b20gLSByY1N0cmVhbS5ib3R0b20gKiBkOwotCXJldHVybiBDRlhfQWZmaW5lTWF0cml4KGEsIDAsIDAsIGQsIGUsIGYpOworICByZXR1cm4gcmNSZXQ7CiB9CiAKLXZvaWQgR2V0T2Zmc2V0KEZYX0ZMT0FUJiBmYSwgRlhfRkxPQVQmIGZkLCBGWF9GTE9BVCYgZmUsIEZYX0ZMT0FUJiBmZiwgQ1BERl9SZWN0IHJjQW5ub3QsIENQREZfUmVjdCByY1N0cmVhbSwgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgpCi17Ci0JRlhfRkxPQVQgZlN0cmVhbVdpZHRoID0gMC4wZjsKLQlGWF9GTE9BVCBmU3RyZWFtSGVpZ2h0ID0gMC4wZjsKK3ZvaWQgU2V0UGFnZUNvbnRlbnRzKENGWF9CeXRlU3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQ1BERl9PYmplY3QqIHBDb250ZW50c09iaiA9IHBQYWdlLT5HZXRTdHJlYW0oIkNvbnRlbnRzIik7CisgIGlmICghcENvbnRlbnRzT2JqKSB7CisgICAgcENvbnRlbnRzT2JqID0gcFBhZ2UtPkdldEFycmF5KCJDb250ZW50cyIpOworICB9CiAKKyAgaWYgKCFwQ29udGVudHNPYmopIHsKKyAgICAvLyBDcmVhdGUgYSBuZXcgY29udGVudHMgZGljdGlvbmFyeQorICAgIGlmICgha2V5LklzRW1wdHkoKSkgeworICAgICAgQ1BERl9TdHJlYW0qIHBOZXdDb250ZW50cyA9CisgICAgICAgICAgRlhfTkVXIENQREZfU3RyZWFtKE5VTEwsIDAsIEZYX05FVyBDUERGX0RpY3Rpb25hcnkpOworICAgICAgaWYgKCFwTmV3Q29udGVudHMpCisgICAgICAgIHJldHVybjsKKyAgICAgIHBQYWdlLT5TZXRBdFJlZmVyZW5jZSgiQ29udGVudHMiLCBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwTmV3Q29udGVudHMpKTsKIAorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbTsKKyAgICAgIHNTdHJlYW0uRm9ybWF0KCJxIDEgMCAwIDEgMCAwIGNtIC8lcyBEbyBRIiwga2V5LmNfc3RyKCkpOworICAgICAgcE5ld0NvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQogCi0JaWYgKG1hdHJpeC5hICE9IDAgJiYgbWF0cml4LmQgIT0gMCkKLQl7Ci0JCWZTdHJlYW1XaWR0aCA9IHJjU3RyZWFtLnJpZ2h0IC0gcmNTdHJlYW0ubGVmdDsKLQkJZlN0cmVhbUhlaWdodCA9IHJjU3RyZWFtLnRvcCAtIHJjU3RyZWFtLmJvdHRvbTsKLQl9Ci0JZWxzZQotCXsKLQkJZlN0cmVhbVdpZHRoID0gcmNTdHJlYW0udG9wIC0gcmNTdHJlYW0uYm90dG9tOwotCQlmU3RyZWFtSGVpZ2h0ID0gcmNTdHJlYW0ucmlnaHQgLSByY1N0cmVhbS5sZWZ0OwotCX0KKyAgaW50IGlUeXBlID0gcENvbnRlbnRzT2JqLT5HZXRUeXBlKCk7CisgIENQREZfQXJyYXkqIHBDb250ZW50c0FycmF5ID0gTlVMTDsKIAotCUZYX0ZMT0FUIHgxID0gbWF0cml4LmEgKiByY1N0cmVhbS5sZWZ0ICsgbWF0cml4LmMgKiByY1N0cmVhbS5ib3R0b20gKyBtYXRyaXguZTsKLQlGWF9GTE9BVCB5MSA9IG1hdHJpeC5iICogcmNTdHJlYW0ubGVmdCArIG1hdHJpeC5kICogcmNTdHJlYW0uYm90dG9tICsgbWF0cml4LmY7Ci0JRlhfRkxPQVQgeDIgPSBtYXRyaXguYSAqIHJjU3RyZWFtLmxlZnQgKyBtYXRyaXguYyAqIHJjU3RyZWFtLnRvcCArIG1hdHJpeC5lOwotCUZYX0ZMT0FUIHkyID0gbWF0cml4LmIgKiByY1N0cmVhbS5sZWZ0ICsgbWF0cml4LmQgKiByY1N0cmVhbS50b3AgKyBtYXRyaXguZjsKLQlGWF9GTE9BVCB4MyA9IG1hdHJpeC5hICogcmNTdHJlYW0ucmlnaHQgKyBtYXRyaXguYyAqIHJjU3RyZWFtLmJvdHRvbSArIG1hdHJpeC5lOwotCUZYX0ZMT0FUIHkzID0gbWF0cml4LmIgKiByY1N0cmVhbS5yaWdodCArIG1hdHJpeC5kICogcmNTdHJlYW0uYm90dG9tICsgbWF0cml4LmY7Ci0JRlhfRkxPQVQgeDQgPSBtYXRyaXguYSAqIHJjU3RyZWFtLnJpZ2h0ICsgbWF0cml4LmMgKiByY1N0cmVhbS50b3AgKyBtYXRyaXguZTsKLQlGWF9GTE9BVCB5NCA9IG1hdHJpeC5iICogcmNTdHJlYW0ucmlnaHQgKyBtYXRyaXguZCAqIHJjU3RyZWFtLnRvcCArIG1hdHJpeC5mOworICBzd2l0Y2ggKGlUeXBlKSB7CisgICAgY2FzZSBQREZPQkpfU1RSRUFNOiB7CisgICAgICBwQ29udGVudHNBcnJheSA9IEZYX05FVyBDUERGX0FycmF5OworICAgICAgQ1BERl9TdHJlYW0qIHBDb250ZW50cyA9IChDUERGX1N0cmVhbSopcENvbnRlbnRzT2JqOworICAgICAgRlhfRFdPUkQgZHdPYmpOdW0gPSBwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBDb250ZW50cyk7CisgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7CisgICAgICBhY2MuTG9hZEFsbERhdGEocENvbnRlbnRzKTsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHNTdHJlYW0gPSAicVxuIjsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHNCb2R5ID0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZygoY29uc3QgRlhfQ0hBUiopYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSk7CisgICAgICBzU3RyZWFtID0gc1N0cmVhbSArIHNCb2R5ICsgIlxuUSI7CisgICAgICBwQ29udGVudHMtPlNldERhdGEoKGNvbnN0IHVpbnQ4X3QqKXNTdHJlYW0sIHNTdHJlYW0uR2V0TGVuZ3RoKCksIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKyAgICAgIHBDb250ZW50c0FycmF5LT5BZGRSZWZlcmVuY2UocERvY3VtZW50LCBkd09iak51bSk7CisgICAgICBicmVhazsKKyAgICB9CiAKLQlGWF9GTE9BVCBsZWZ0ID0gRlhfTUlOKEZYX01JTih4MSwgeDIpLCBGWF9NSU4oeDMsIHg0KSk7Ci0JRlhfRkxPQVQgYm90dG9tID0gRlhfTUlOKEZYX01JTih5MSwgeTIpLCBGWF9NSU4oeTMsIHk0KSk7CisgICAgY2FzZSBQREZPQkpfQVJSQVk6IHsKKyAgICAgIHBDb250ZW50c0FycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50c09iajsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIAotCWZhID0gKHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQpL2ZTdHJlYW1XaWR0aDsKLQlmZCA9IChyY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKS9mU3RyZWFtSGVpZ2h0OwotCWZlID0gcmNBbm5vdC5sZWZ0IC0gbGVmdCAqIGZhOwotCWZmID0gcmNBbm5vdC5ib3R0b20gLSBib3R0b20gKiBmZDsKKyAgaWYgKCFwQ29udGVudHNBcnJheSkKKyAgICByZXR1cm47CisKKyAgRlhfRFdPUkQgZHdPYmpOdW0gPSBwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBDb250ZW50c0FycmF5KTsKKyAgcFBhZ2UtPlNldEF0UmVmZXJlbmNlKCJDb250ZW50cyIsIHBEb2N1bWVudCwgZHdPYmpOdW0pOworCisgIGlmICgha2V5LklzRW1wdHkoKSkgeworICAgIENQREZfU3RyZWFtKiBwTmV3Q29udGVudHMgPQorICAgICAgICBGWF9ORVcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgRlhfTkVXIENQREZfRGljdGlvbmFyeSk7CisgICAgZHdPYmpOdW0gPSBwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBOZXdDb250ZW50cyk7CisgICAgcENvbnRlbnRzQXJyYXktPkFkZFJlZmVyZW5jZShwRG9jdW1lbnQsIGR3T2JqTnVtKTsKKworICAgIENGWF9CeXRlU3RyaW5nIHNTdHJlYW07CisgICAgc1N0cmVhbS5Gb3JtYXQoInEgMSAwIDAgMSAwIDAgY20gLyVzIERvIFEiLCBrZXkuY19zdHIoKSk7CisgICAgcE5ld0NvbnRlbnRzLT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworICB9CiB9CiAKK0NGWF9BZmZpbmVNYXRyaXggR2V0TWF0cml4KENQREZfUmVjdCByY0Fubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgpIHsKKyAgaWYgKHJjU3RyZWFtLklzRW1wdHkoKSkKKyAgICByZXR1cm4gQ0ZYX0FmZmluZU1hdHJpeCgpOwogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfRmxhdHRlbiggRlBERl9QQUdFIHBhZ2UsIGludCBuRmxhZykKLXsKLQlpZiAoIXBhZ2UpCi0JewotCQlyZXR1cm4gRkxBVFRFTl9GQUlMOwotCX0KKyAgbWF0cml4LlRyYW5zZm9ybVJlY3QocmNTdHJlYW0pOworICByY1N0cmVhbS5Ob3JtYWxpemUoKTsKIAotCUNQREZfUGFnZSAqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKSggcGFnZSApKS0+R2V0UERGUGFnZSgpOwotCWlmICghcFBhZ2UpCi0JCXJldHVybiBGTEFUVEVOX0ZBSUw7CisgIEZYX0ZMT0FUIGEgPSByY0Fubm90LldpZHRoKCkgLyByY1N0cmVhbS5XaWR0aCgpOworICBGWF9GTE9BVCBkID0gcmNBbm5vdC5IZWlnaHQoKSAvIHJjU3RyZWFtLkhlaWdodCgpOwogCi0JQ1BERl9Eb2N1bWVudCAqIHBEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKLQlDUERGX0RpY3Rpb25hcnkgKiBwUGFnZURpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7CisgIEZYX0ZMT0FUIGUgPSByY0Fubm90LmxlZnQgLSByY1N0cmVhbS5sZWZ0ICogYTsKKyAgRlhfRkxPQVQgZiA9IHJjQW5ub3QuYm90dG9tIC0gcmNTdHJlYW0uYm90dG9tICogZDsKKyAgcmV0dXJuIENGWF9BZmZpbmVNYXRyaXgoYSwgMCwgMCwgZCwgZSwgZik7Cit9CiAKLQlpZiAoICFwRG9jdW1lbnQgfHwgIXBQYWdlRGljdCApCi0JewotCQlyZXR1cm4gRkxBVFRFTl9GQUlMOwotCX0KK3ZvaWQgR2V0T2Zmc2V0KEZYX0ZMT0FUJiBmYSwKKyAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmZCwKKyAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmZSwKKyAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmZiwKKyAgICAgICAgICAgICAgIENQREZfUmVjdCByY0Fubm90LAorICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjU3RyZWFtLAorICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgpIHsKKyAgRlhfRkxPQVQgZlN0cmVhbVdpZHRoID0gMC4wZjsKKyAgRlhfRkxPQVQgZlN0cmVhbUhlaWdodCA9IDAuMGY7CiAKLQlDUERGX09iamVjdEFycmF5IE9iamVjdEFycmF5OwotCUNQREZfUmVjdEFycmF5ICBSZWN0QXJyYXk7CisgIGlmIChtYXRyaXguYSAhPSAwICYmIG1hdHJpeC5kICE9IDApIHsKKyAgICBmU3RyZWFtV2lkdGggPSByY1N0cmVhbS5yaWdodCAtIHJjU3RyZWFtLmxlZnQ7CisgICAgZlN0cmVhbUhlaWdodCA9IHJjU3RyZWFtLnRvcCAtIHJjU3RyZWFtLmJvdHRvbTsKKyAgfSBlbHNlIHsKKyAgICBmU3RyZWFtV2lkdGggPSByY1N0cmVhbS50b3AgLSByY1N0cmVhbS5ib3R0b207CisgICAgZlN0cmVhbUhlaWdodCA9IHJjU3RyZWFtLnJpZ2h0IC0gcmNTdHJlYW0ubGVmdDsKKyAgfQogCi0JaW50IGlSZXQgPSBGTEFUVEVOX0ZBSUw7Ci0JaVJldCA9IFBhcnNlckFubm90cyggcERvY3VtZW50LCBwUGFnZURpY3QsICZSZWN0QXJyYXksICZPYmplY3RBcnJheSwgbkZsYWcpOwotCWlmIChpUmV0ID09IEZMQVRURU5fTk9USElOR1RPRE8gfHwgaVJldCA9PSBGTEFUVEVOX0ZBSUwpCi0JCXJldHVybiBpUmV0OworICBGWF9GTE9BVCB4MSA9CisgICAgICBtYXRyaXguYSAqIHJjU3RyZWFtLmxlZnQgKyBtYXRyaXguYyAqIHJjU3RyZWFtLmJvdHRvbSArIG1hdHJpeC5lOworICBGWF9GTE9BVCB5MSA9CisgICAgICBtYXRyaXguYiAqIHJjU3RyZWFtLmxlZnQgKyBtYXRyaXguZCAqIHJjU3RyZWFtLmJvdHRvbSArIG1hdHJpeC5mOworICBGWF9GTE9BVCB4MiA9IG1hdHJpeC5hICogcmNTdHJlYW0ubGVmdCArIG1hdHJpeC5jICogcmNTdHJlYW0udG9wICsgbWF0cml4LmU7CisgIEZYX0ZMT0FUIHkyID0gbWF0cml4LmIgKiByY1N0cmVhbS5sZWZ0ICsgbWF0cml4LmQgKiByY1N0cmVhbS50b3AgKyBtYXRyaXguZjsKKyAgRlhfRkxPQVQgeDMgPQorICAgICAgbWF0cml4LmEgKiByY1N0cmVhbS5yaWdodCArIG1hdHJpeC5jICogcmNTdHJlYW0uYm90dG9tICsgbWF0cml4LmU7CisgIEZYX0ZMT0FUIHkzID0KKyAgICAgIG1hdHJpeC5iICogcmNTdHJlYW0ucmlnaHQgKyBtYXRyaXguZCAqIHJjU3RyZWFtLmJvdHRvbSArIG1hdHJpeC5mOworICBGWF9GTE9BVCB4NCA9IG1hdHJpeC5hICogcmNTdHJlYW0ucmlnaHQgKyBtYXRyaXguYyAqIHJjU3RyZWFtLnRvcCArIG1hdHJpeC5lOworICBGWF9GTE9BVCB5NCA9IG1hdHJpeC5iICogcmNTdHJlYW0ucmlnaHQgKyBtYXRyaXguZCAqIHJjU3RyZWFtLnRvcCArIG1hdHJpeC5mOwogCi0JQ1BERl9SZWN0IHJjT3JpZ2luYWxDQjsKLQlDUERGX1JlY3QgcmNNZXJnZXIgPSBDYWxjdWxhdGVSZWN0KCAmUmVjdEFycmF5ICk7Ci0JQ1BERl9SZWN0IHJjT3JpZ2luYWxNQiA9IHBQYWdlRGljdC0+R2V0UmVjdCgiTWVkaWFCb3giKTsKKyAgRlhfRkxPQVQgbGVmdCA9IEZYX01JTihGWF9NSU4oeDEsIHgyKSwgRlhfTUlOKHgzLCB4NCkpOworICBGWF9GTE9BVCBib3R0b20gPSBGWF9NSU4oRlhfTUlOKHkxLCB5MiksIEZYX01JTih5MywgeTQpKTsKIAotCWlmIChwUGFnZURpY3QtPktleUV4aXN0KCJDcm9wQm94IikpCi0JCXJjT3JpZ2luYWxNQiA9IHBQYWdlRGljdC0+R2V0UmVjdCgiQ3JvcEJveCIpOworICBmYSA9IChyY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0KSAvIGZTdHJlYW1XaWR0aDsKKyAgZmQgPSAocmNBbm5vdC50b3AgLSByY0Fubm90LmJvdHRvbSkgLyBmU3RyZWFtSGVpZ2h0OworICBmZSA9IHJjQW5ub3QubGVmdCAtIGxlZnQgKiBmYTsKKyAgZmYgPSByY0Fubm90LmJvdHRvbSAtIGJvdHRvbSAqIGZkOworfQogCi0JaWYgKHJjT3JpZ2luYWxNQi5Jc0VtcHR5KCkpCi0JewotCQlyY09yaWdpbmFsTUIgPSBDUERGX1JlY3QoMC4wZiwgMC4wZiwgNjEyLjBmLCA3OTIuMGYpOwotCX0KK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9GbGF0dGVuKEZQREZfUEFHRSBwYWdlLCBpbnQgbkZsYWcpIHsKKyAgaWYgKCFwYWdlKSB7CisgICAgcmV0dXJuIEZMQVRURU5fRkFJTDsKKyAgfQogCi0JcmNNZXJnZXIubGVmdCA9IHJjTWVyZ2VyLmxlZnQgPCByY09yaWdpbmFsTUIubGVmdD8gcmNPcmlnaW5hbE1CLmxlZnQgOiByY01lcmdlci5sZWZ0OwotCXJjTWVyZ2VyLnJpZ2h0ID0gcmNNZXJnZXIucmlnaHQgPiByY09yaWdpbmFsTUIucmlnaHQ/IHJjT3JpZ2luYWxNQi5yaWdodCA6IHJjTWVyZ2VyLnJpZ2h0OwotCXJjTWVyZ2VyLnRvcCA9IHJjTWVyZ2VyLnRvcCA+IHJjT3JpZ2luYWxNQi50b3A/IHJjT3JpZ2luYWxNQi50b3AgOiByY01lcmdlci50b3A7Ci0JcmNNZXJnZXIuYm90dG9tID0gcmNNZXJnZXIuYm90dG9tIDwgcmNPcmlnaW5hbE1CLmJvdHRvbT8gcmNPcmlnaW5hbE1CLmJvdHRvbSA6IHJjTWVyZ2VyLmJvdHRvbTsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKikocGFnZSkpLT5HZXRQREZQYWdlKCk7CisgIGlmICghcFBhZ2UpCisgICAgcmV0dXJuIEZMQVRURU5fRkFJTDsKIAotCWlmIChwUGFnZURpY3QtPktleUV4aXN0KCJBcnRCb3giKSkKLQkJcmNPcmlnaW5hbENCID0gcFBhZ2VEaWN0LT5HZXRSZWN0KCJBcnRCb3giKTsKLQllbHNlCi0JCXJjT3JpZ2luYWxDQiA9IHJjT3JpZ2luYWxNQjsKKyAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKIAotCWlmICghcmNPcmlnaW5hbE1CLklzRW1wdHkoKSkKLQl7Ci0JCUNQREZfQXJyYXkqIHBNZWRpYUJveCA9IEZYX05FVyBDUERGX0FycmF5KCk7CisgIGlmICghcERvY3VtZW50IHx8ICFwUGFnZURpY3QpIHsKKyAgICByZXR1cm4gRkxBVFRFTl9GQUlMOworICB9CiAKLQkJcE1lZGlhQm94LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKHJjT3JpZ2luYWxNQi5sZWZ0KSk7Ci0JCXBNZWRpYUJveC0+QWRkKEZYX05FVyBDUERGX051bWJlcihyY09yaWdpbmFsTUIuYm90dG9tKSk7Ci0JCXBNZWRpYUJveC0+QWRkKEZYX05FVyBDUERGX051bWJlcihyY09yaWdpbmFsTUIucmlnaHQpKTsKLQkJcE1lZGlhQm94LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKHJjT3JpZ2luYWxNQi50b3ApKTsKKyAgQ1BERl9PYmplY3RBcnJheSBPYmplY3RBcnJheTsKKyAgQ1BERl9SZWN0QXJyYXkgUmVjdEFycmF5OwogCi0JCXBQYWdlRGljdC0+U2V0QXQoIk1lZGlhQm94IixwTWVkaWFCb3gpOwotCX0KKyAgaW50IGlSZXQgPSBGTEFUVEVOX0ZBSUw7CisgIGlSZXQgPSBQYXJzZXJBbm5vdHMocERvY3VtZW50LCBwUGFnZURpY3QsICZSZWN0QXJyYXksICZPYmplY3RBcnJheSwgbkZsYWcpOworICBpZiAoaVJldCA9PSBGTEFUVEVOX05PVEhJTkdUT0RPIHx8IGlSZXQgPT0gRkxBVFRFTl9GQUlMKQorICAgIHJldHVybiBpUmV0OwogCi0JaWYgKCFyY09yaWdpbmFsQ0IuSXNFbXB0eSgpKQotCXsKLQkJQ1BERl9BcnJheSogcENyb3BCb3ggPSBGWF9ORVcgQ1BERl9BcnJheSgpOwotCQlwQ3JvcEJveC0+QWRkKEZYX05FVyBDUERGX051bWJlcihyY09yaWdpbmFsQ0IubGVmdCkpOwotCQlwQ3JvcEJveC0+QWRkKEZYX05FVyBDUERGX051bWJlcihyY09yaWdpbmFsQ0IuYm90dG9tKSk7Ci0JCXBDcm9wQm94LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKHJjT3JpZ2luYWxDQi5yaWdodCkpOwotCQlwQ3JvcEJveC0+QWRkKEZYX05FVyBDUERGX051bWJlcihyY09yaWdpbmFsQ0IudG9wKSk7Ci0JCXBQYWdlRGljdC0+U2V0QXQoIkFydEJveCIsIHBDcm9wQm94KTsKLQl9CisgIENQREZfUmVjdCByY09yaWdpbmFsQ0I7CisgIENQREZfUmVjdCByY01lcmdlciA9IENhbGN1bGF0ZVJlY3QoJlJlY3RBcnJheSk7CisgIENQREZfUmVjdCByY09yaWdpbmFsTUIgPSBwUGFnZURpY3QtPkdldFJlY3QoIk1lZGlhQm94Iik7CiAKLQlDUERGX0RpY3Rpb25hcnkqIHBSZXMgPSBOVUxMOwotCXBSZXMgPSBwUGFnZURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOwotCWlmICghcFJlcykKLQl7Ci0JCXBSZXMgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OwotCQlwUGFnZURpY3QtPlNldEF0KCAiUmVzb3VyY2VzIiwgcFJlcyApOwotCX0KKyAgaWYgKHBQYWdlRGljdC0+S2V5RXhpc3QoIkNyb3BCb3giKSkKKyAgICByY09yaWdpbmFsTUIgPSBwUGFnZURpY3QtPkdldFJlY3QoIkNyb3BCb3giKTsKIAotCUNQREZfU3RyZWFtKiBwTmV3WE9iamVjdCA9IEZYX05FVyBDUERGX1N0cmVhbShOVUxMLCAwLCBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5KTsKLQlGWF9EV09SRCBkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocE5ld1hPYmplY3QpOwotCUNQREZfRGljdGlvbmFyeSogcFBhZ2VYT2JqZWN0ID0gcFJlcy0+R2V0RGljdCgiWE9iamVjdCIpOwotCWlmICghcFBhZ2VYT2JqZWN0KQotCXsKLQkJcFBhZ2VYT2JqZWN0ID0gRlhfTkVXIENQREZfRGljdGlvbmFyeTsKLQkJcFJlcy0+U2V0QXQoIlhPYmplY3QiLCBwUGFnZVhPYmplY3QpOwotCX0KKyAgaWYgKHJjT3JpZ2luYWxNQi5Jc0VtcHR5KCkpIHsKKyAgICByY09yaWdpbmFsTUIgPSBDUERGX1JlY3QoMC4wZiwgMC4wZiwgNjEyLjBmLCA3OTIuMGYpOworICB9CiAKLQlDRlhfQnl0ZVN0cmluZyBrZXkgPSAiIjsKLQlpbnQgblN0cmVhbXMgPSBPYmplY3RBcnJheS5HZXRTaXplKCk7CisgIHJjTWVyZ2VyLmxlZnQgPQorICAgICAgcmNNZXJnZXIubGVmdCA8IHJjT3JpZ2luYWxNQi5sZWZ0ID8gcmNPcmlnaW5hbE1CLmxlZnQgOiByY01lcmdlci5sZWZ0OworICByY01lcmdlci5yaWdodCA9CisgICAgICByY01lcmdlci5yaWdodCA+IHJjT3JpZ2luYWxNQi5yaWdodCA/IHJjT3JpZ2luYWxNQi5yaWdodCA6IHJjTWVyZ2VyLnJpZ2h0OworICByY01lcmdlci50b3AgPQorICAgICAgcmNNZXJnZXIudG9wID4gcmNPcmlnaW5hbE1CLnRvcCA/IHJjT3JpZ2luYWxNQi50b3AgOiByY01lcmdlci50b3A7CisgIHJjTWVyZ2VyLmJvdHRvbSA9IHJjTWVyZ2VyLmJvdHRvbSA8IHJjT3JpZ2luYWxNQi5ib3R0b20gPyByY09yaWdpbmFsTUIuYm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByY01lcmdlci5ib3R0b207CiAKLQlpZiAoblN0cmVhbXMgPiAwKQotCXsKLQkJZm9yIChpbnQgaUtleSA9IDA7IC8qaUtleSA8IDEwMCovOyBpS2V5KyspCi0JCXsKLQkJCWNoYXIgc0V4dGVuZFs1XSA9IHt9OwotCQkJRlhTWVNfaXRvYShpS2V5LCBzRXh0ZW5kLCAxMCk7Ci0JCQlrZXkgPSBDRlhfQnl0ZVN0cmluZygiRkZUIikgKyBDRlhfQnl0ZVN0cmluZyhzRXh0ZW5kKTsKKyAgaWYgKHBQYWdlRGljdC0+S2V5RXhpc3QoIkFydEJveCIpKQorICAgIHJjT3JpZ2luYWxDQiA9IHBQYWdlRGljdC0+R2V0UmVjdCgiQXJ0Qm94Iik7CisgIGVsc2UKKyAgICByY09yaWdpbmFsQ0IgPSByY09yaWdpbmFsTUI7CiAKLQkJCWlmICghcFBhZ2VYT2JqZWN0LT5LZXlFeGlzdChrZXkpKQotCQkJCWJyZWFrOwotCQl9Ci0JfQorICBpZiAoIXJjT3JpZ2luYWxNQi5Jc0VtcHR5KCkpIHsKKyAgICBDUERGX0FycmF5KiBwTWVkaWFCb3ggPSBGWF9ORVcgQ1BERl9BcnJheSgpOwogCi0JU2V0UGFnZUNvbnRlbnRzKGtleSwgcFBhZ2VEaWN0LCBwRG9jdW1lbnQpOworICAgIHBNZWRpYUJveC0+QWRkKEZYX05FVyBDUERGX051bWJlcihyY09yaWdpbmFsTUIubGVmdCkpOworICAgIHBNZWRpYUJveC0+QWRkKEZYX05FVyBDUERGX051bWJlcihyY09yaWdpbmFsTUIuYm90dG9tKSk7CisgICAgcE1lZGlhQm94LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKHJjT3JpZ2luYWxNQi5yaWdodCkpOworICAgIHBNZWRpYUJveC0+QWRkKEZYX05FVyBDUERGX051bWJlcihyY09yaWdpbmFsTUIudG9wKSk7CiAKLQlDUERGX0RpY3Rpb25hcnkqIHBOZXdYT1JlcyA9IE5VTEw7CisgICAgcFBhZ2VEaWN0LT5TZXRBdCgiTWVkaWFCb3giLCBwTWVkaWFCb3gpOworICB9CiAKLQlpZiAoIWtleS5Jc0VtcHR5KCkpCi0JewotCQlwUGFnZVhPYmplY3QtPlNldEF0UmVmZXJlbmNlKGtleSwgcERvY3VtZW50LCBkd09iak51bSk7Ci0JCUNQREZfRGljdGlvbmFyeSogcE5ld09YYmplY3REaWMgPSBwTmV3WE9iamVjdC0+R2V0RGljdCgpOwotCQlwTmV3WE9SZXMgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OwotCQlwTmV3T1hiamVjdERpYy0+U2V0QXQoIlJlc291cmNlcyIsIHBOZXdYT1Jlcyk7Ci0JCXBOZXdPWGJqZWN0RGljLT5TZXRBdE5hbWUoIlR5cGUiLCAiWE9iamVjdCIpOwotCQlwTmV3T1hiamVjdERpYy0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIkZvcm0iKTsKLQkJcE5ld09YYmplY3REaWMtPlNldEF0SW50ZWdlcigiRm9ybVR5cGUiLCAxKTsKLQkJcE5ld09YYmplY3REaWMtPlNldEF0TmFtZSgiTmFtZSIsICJGUk0iKTsKLQkJQ1BERl9SZWN0IHJjQkJveCA9IHBQYWdlRGljdC0+R2V0UmVjdCgiQXJ0Qm94Iik7Ci0JCXBOZXdPWGJqZWN0RGljLT5TZXRBdFJlY3QoIkJCb3giLCByY0JCb3gpOwotCX0KKyAgaWYgKCFyY09yaWdpbmFsQ0IuSXNFbXB0eSgpKSB7CisgICAgQ1BERl9BcnJheSogcENyb3BCb3ggPSBGWF9ORVcgQ1BERl9BcnJheSgpOworICAgIHBDcm9wQm94LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKHJjT3JpZ2luYWxDQi5sZWZ0KSk7CisgICAgcENyb3BCb3gtPkFkZChGWF9ORVcgQ1BERl9OdW1iZXIocmNPcmlnaW5hbENCLmJvdHRvbSkpOworICAgIHBDcm9wQm94LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKHJjT3JpZ2luYWxDQi5yaWdodCkpOworICAgIHBDcm9wQm94LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKHJjT3JpZ2luYWxDQi50b3ApKTsKKyAgICBwUGFnZURpY3QtPlNldEF0KCJBcnRCb3giLCBwQ3JvcEJveCk7CisgIH0KIAotCWZvciAoaW50IGkgPSAwOyBpIDwgblN0cmVhbXM7IGkrKykKLQl7Ci0JCUNQREZfRGljdGlvbmFyeSogcEFubm90RGljID0gT2JqZWN0QXJyYXkuR2V0QXQoaSk7Ci0JCWlmICghcEFubm90RGljKWNvbnRpbnVlOworICBDUERGX0RpY3Rpb25hcnkqIHBSZXMgPSBOVUxMOworICBwUmVzID0gcFBhZ2VEaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKKyAgaWYgKCFwUmVzKSB7CisgICAgcFJlcyA9IEZYX05FVyBDUERGX0RpY3Rpb25hcnk7CisgICAgcFBhZ2VEaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcFJlcyk7CisgIH0KIAotCQlDUERGX1JlY3QgcmNBbm5vdCA9IHBBbm5vdERpYy0+R2V0UmVjdCgiUmVjdCIpOwotCQlyY0Fubm90Lk5vcm1hbGl6ZSgpOworICBDUERGX1N0cmVhbSogcE5ld1hPYmplY3QgPQorICAgICAgRlhfTkVXIENQREZfU3RyZWFtKE5VTEwsIDAsIEZYX05FVyBDUERGX0RpY3Rpb25hcnkpOworICBGWF9EV09SRCBkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocE5ld1hPYmplY3QpOworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlWE9iamVjdCA9IHBSZXMtPkdldERpY3QoIlhPYmplY3QiKTsKKyAgaWYgKCFwUGFnZVhPYmplY3QpIHsKKyAgICBwUGFnZVhPYmplY3QgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OworICAgIHBSZXMtPlNldEF0KCJYT2JqZWN0IiwgcFBhZ2VYT2JqZWN0KTsKKyAgfQogCi0JCUNGWF9CeXRlU3RyaW5nIHNBbm5vdFN0YXRlID0gcEFubm90RGljLT5HZXRTdHJpbmcoIkFTIik7Ci0JCUNQREZfRGljdGlvbmFyeSogcEFubm90QVAgPSBwQW5ub3REaWMtPkdldERpY3QoIkFQIik7Ci0JCWlmICghcEFubm90QVApY29udGludWU7CisgIENGWF9CeXRlU3RyaW5nIGtleSA9ICIiOworICBpbnQgblN0cmVhbXMgPSBPYmplY3RBcnJheS5HZXRTaXplKCk7CiAKLQkJQ1BERl9TdHJlYW0qIHBBUFN0cmVhbSA9IHBBbm5vdEFQLT5HZXRTdHJlYW0oIk4iKTsKLQkJaWYgKCFwQVBTdHJlYW0pCi0JCXsKLQkJCUNQREZfRGljdGlvbmFyeSogcEFQRGljID0gcEFubm90QVAtPkdldERpY3QoIk4iKTsKLQkJCWlmICghcEFQRGljKWNvbnRpbnVlOworICBpZiAoblN0cmVhbXMgPiAwKSB7CisgICAgZm9yIChpbnQgaUtleSA9IDA7IC8qaUtleSA8IDEwMCovOyBpS2V5KyspIHsKKyAgICAgIGNoYXIgc0V4dGVuZFs1XSA9IHt9OworICAgICAgRlhTWVNfaXRvYShpS2V5LCBzRXh0ZW5kLCAxMCk7CisgICAgICBrZXkgPSBDRlhfQnl0ZVN0cmluZygiRkZUIikgKyBDRlhfQnl0ZVN0cmluZyhzRXh0ZW5kKTsKIAotCQkJaWYgKCFzQW5ub3RTdGF0ZS5Jc0VtcHR5KCkpCi0JCQl7Ci0JCQkJcEFQU3RyZWFtID0gcEFQRGljLT5HZXRTdHJlYW0oc0Fubm90U3RhdGUpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUZYX1BPU0lUSU9OIHBvcyA9IHBBUERpYy0+R2V0U3RhcnRQb3MoKTsKLQkJCQlpZiAocG9zKQotCQkJCXsKLQkJCQkJQ0ZYX0J5dGVTdHJpbmcgc0tleTsKLQkJCQkJQ1BERl9PYmplY3QqIHBGaXJzdE9iaiA9IHBBUERpYy0+R2V0TmV4dEVsZW1lbnQocG9zLCBzS2V5KTsKLQkJCQkJaWYgKHBGaXJzdE9iaikKLQkJCQkJewotCQkJCQkJaWYgKHBGaXJzdE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpCi0JCQkJCQkJcEZpcnN0T2JqID0gcEZpcnN0T2JqLT5HZXREaXJlY3QoKTsKKyAgICAgIGlmICghcFBhZ2VYT2JqZWN0LT5LZXlFeGlzdChrZXkpKQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIAotCQkJCQkJaWYgKHBGaXJzdE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pCi0JCQkJCQkJY29udGludWU7CisgIFNldFBhZ2VDb250ZW50cyhrZXksIHBQYWdlRGljdCwgcERvY3VtZW50KTsKIAotCQkJCQkJcEFQU3RyZWFtID0gKENQREZfU3RyZWFtKilwRmlyc3RPYmo7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwTmV3WE9SZXMgPSBOVUxMOwogCi0JCWlmICghcEFQU3RyZWFtKWNvbnRpbnVlOworICBpZiAoIWtleS5Jc0VtcHR5KCkpIHsKKyAgICBwUGFnZVhPYmplY3QtPlNldEF0UmVmZXJlbmNlKGtleSwgcERvY3VtZW50LCBkd09iak51bSk7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTmV3T1hiamVjdERpYyA9IHBOZXdYT2JqZWN0LT5HZXREaWN0KCk7CisgICAgcE5ld1hPUmVzID0gRlhfTkVXIENQREZfRGljdGlvbmFyeTsKKyAgICBwTmV3T1hiamVjdERpYy0+U2V0QXQoIlJlc291cmNlcyIsIHBOZXdYT1Jlcyk7CisgICAgcE5ld09YYmplY3REaWMtPlNldEF0TmFtZSgiVHlwZSIsICJYT2JqZWN0Iik7CisgICAgcE5ld09YYmplY3REaWMtPlNldEF0TmFtZSgiU3VidHlwZSIsICJGb3JtIik7CisgICAgcE5ld09YYmplY3REaWMtPlNldEF0SW50ZWdlcigiRm9ybVR5cGUiLCAxKTsKKyAgICBwTmV3T1hiamVjdERpYy0+U2V0QXROYW1lKCJOYW1lIiwgIkZSTSIpOworICAgIENQREZfUmVjdCByY0JCb3ggPSBwUGFnZURpY3QtPkdldFJlY3QoIkFydEJveCIpOworICAgIHBOZXdPWGJqZWN0RGljLT5TZXRBdFJlY3QoIkJCb3giLCByY0JCb3gpOworICB9CiAKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWMgPSBwQVBTdHJlYW0tPkdldERpY3QoKTsKLQkJQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXggPSBwQVBEaWMtPkdldE1hdHJpeCgiTWF0cml4Iik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgblN0cmVhbXM7IGkrKykgeworICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljID0gT2JqZWN0QXJyYXkuR2V0QXQoaSk7CisgICAgaWYgKCFwQW5ub3REaWMpCisgICAgICBjb250aW51ZTsKIAotCQlDUERGX1JlY3QgcmNTdHJlYW07Ci0JCWlmIChwQVBEaWMtPktleUV4aXN0KCJSZWN0IikpCi0JCQlyY1N0cmVhbSA9IHBBUERpYy0+R2V0UmVjdCgiUmVjdCIpOwotCQllbHNlIGlmIChwQVBEaWMtPktleUV4aXN0KCJCQm94IikpCi0JCQlyY1N0cmVhbSA9IHBBUERpYy0+R2V0UmVjdCgiQkJveCIpOworICAgIENQREZfUmVjdCByY0Fubm90ID0gcEFubm90RGljLT5HZXRSZWN0KCJSZWN0Iik7CisgICAgcmNBbm5vdC5Ob3JtYWxpemUoKTsKIAotCQlpZiAocmNTdHJlYW0uSXNFbXB0eSgpKWNvbnRpbnVlOworICAgIENGWF9CeXRlU3RyaW5nIHNBbm5vdFN0YXRlID0gcEFubm90RGljLT5HZXRTdHJpbmcoIkFTIik7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3RBUCA9IHBBbm5vdERpYy0+R2V0RGljdCgiQVAiKTsKKyAgICBpZiAoIXBBbm5vdEFQKQorICAgICAgY29udGludWU7CiAKLQkJQ1BERl9PYmplY3QqIHBPYmogPSBwQVBTdHJlYW07CisgICAgQ1BERl9TdHJlYW0qIHBBUFN0cmVhbSA9IHBBbm5vdEFQLT5HZXRTdHJlYW0oIk4iKTsKKyAgICBpZiAoIXBBUFN0cmVhbSkgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWMgPSBwQW5ub3RBUC0+R2V0RGljdCgiTiIpOworICAgICAgaWYgKCFwQVBEaWMpCisgICAgICAgIGNvbnRpbnVlOwogCi0JCWlmIChwT2JqKQotCQl7Ci0JCQlDUERGX0RpY3Rpb25hcnkqIHBPYmpEaWMgPSBwT2JqLT5HZXREaWN0KCk7Ci0JCQlpZiAocE9iakRpYykKLQkJCXsKLQkJCQlwT2JqRGljLT5TZXRBdE5hbWUoIlR5cGUiLCAiWE9iamVjdCIpOwotCQkJCXBPYmpEaWMtPlNldEF0TmFtZSgiU3VidHlwZSIsICJGb3JtIik7Ci0JCQl9Ci0JCX0KKyAgICAgIGlmICghc0Fubm90U3RhdGUuSXNFbXB0eSgpKSB7CisgICAgICAgIHBBUFN0cmVhbSA9IHBBUERpYy0+R2V0U3RyZWFtKHNBbm5vdFN0YXRlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBBUERpYy0+R2V0U3RhcnRQb3MoKTsKKyAgICAgICAgaWYgKHBvcykgeworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNLZXk7CisgICAgICAgICAgQ1BERl9PYmplY3QqIHBGaXJzdE9iaiA9IHBBUERpYy0+R2V0TmV4dEVsZW1lbnQocG9zLCBzS2V5KTsKKyAgICAgICAgICBpZiAocEZpcnN0T2JqKSB7CisgICAgICAgICAgICBpZiAocEZpcnN0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkKKyAgICAgICAgICAgICAgcEZpcnN0T2JqID0gcEZpcnN0T2JqLT5HZXREaXJlY3QoKTsKIAotCQlDUERGX0RpY3Rpb25hcnkqIHBYT2JqZWN0ID0gcE5ld1hPUmVzLT5HZXREaWN0KCJYT2JqZWN0Iik7Ci0JCWlmICghcFhPYmplY3QpCi0JCXsKLQkJCXBYT2JqZWN0ID0gRlhfTkVXIENQREZfRGljdGlvbmFyeTsKLQkJCXBOZXdYT1Jlcy0+U2V0QXQoIlhPYmplY3QiLCBwWE9iamVjdCk7Ci0JCX0KKyAgICAgICAgICAgIGlmIChwRmlyc3RPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKQorICAgICAgICAgICAgICBjb250aW51ZTsKIAotCQlDRlhfQnl0ZVN0cmluZyBzRm9ybU5hbWU7Ci0JCXNGb3JtTmFtZS5Gb3JtYXQoIkYlZCIsIGkpOwotCQlGWF9EV09SRCBkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocE9iaik7Ci0JCXBYT2JqZWN0LT5TZXRBdFJlZmVyZW5jZShzRm9ybU5hbWUsIHBEb2N1bWVudCwgZHdPYmpOdW0pOworICAgICAgICAgICAgcEFQU3RyZWFtID0gKENQREZfU3RyZWFtKilwRmlyc3RPYmo7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQogCi0JCUNQREZfU3RyZWFtQWNjIGFjYzsKLQkJYWNjLkxvYWRBbGxEYXRhKHBOZXdYT2JqZWN0KTsKKyAgICBpZiAoIXBBUFN0cmVhbSkKKyAgICAgIGNvbnRpbnVlOwogCi0JCWNvbnN0IHVpbnQ4X3QqIHBEYXRhID0gYWNjLkdldERhdGEoKTsKLQkJQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbShwRGF0YSwgYWNjLkdldFNpemUoKSk7Ci0JCUNGWF9CeXRlU3RyaW5nIHNUZW1wOworICAgIENQREZfRGljdGlvbmFyeSogcEFQRGljID0gcEFQU3RyZWFtLT5HZXREaWN0KCk7CisgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXggPSBwQVBEaWMtPkdldE1hdHJpeCgiTWF0cml4Iik7CiAKLQkJaWYgKG1hdHJpeC5Jc0lkZW50aXR5KCkpCi0JCXsKLQkJCW1hdHJpeC5hID0gMS4wZjsKLQkJCW1hdHJpeC5iID0gMC4wZjsKLQkJCW1hdHJpeC5jID0gMC4wZjsKLQkJCW1hdHJpeC5kID0gMS4wZjsKLQkJCW1hdHJpeC5lID0gMC4wZjsKLQkJCW1hdHJpeC5mID0gMC4wZjsKLQkJfQorICAgIENQREZfUmVjdCByY1N0cmVhbTsKKyAgICBpZiAocEFQRGljLT5LZXlFeGlzdCgiUmVjdCIpKQorICAgICAgcmNTdHJlYW0gPSBwQVBEaWMtPkdldFJlY3QoIlJlY3QiKTsKKyAgICBlbHNlIGlmIChwQVBEaWMtPktleUV4aXN0KCJCQm94IikpCisgICAgICByY1N0cmVhbSA9IHBBUERpYy0+R2V0UmVjdCgiQkJveCIpOwogCi0JCUNGWF9BZmZpbmVNYXRyaXggbSA9IEdldE1hdHJpeChyY0Fubm90LCByY1N0cmVhbSwgbWF0cml4KTsKLQkJc1RlbXAuRm9ybWF0KCJxICVmIDAgMCAlZiAlZiAlZiBjbSAvJXMgRG8gUVxuIiwgbS5hLCBtLmQsIG0uZSwgbS5mLCBzRm9ybU5hbWUuY19zdHIoKSk7Ci0JCXNTdHJlYW0gKz0gc1RlbXA7CisgICAgaWYgKHJjU3RyZWFtLklzRW1wdHkoKSkKKyAgICAgIGNvbnRpbnVlOwogCi0JCXBOZXdYT2JqZWN0LT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOwotCX0KLQlwUGFnZURpY3QtPlJlbW92ZUF0KCAiQW5ub3RzIiApOworICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEFQU3RyZWFtOwogCi0JT2JqZWN0QXJyYXkuUmVtb3ZlQWxsKCk7Ci0JUmVjdEFycmF5LlJlbW92ZUFsbCgpOworICAgIGlmIChwT2JqKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBPYmpEaWMgPSBwT2JqLT5HZXREaWN0KCk7CisgICAgICBpZiAocE9iakRpYykgeworICAgICAgICBwT2JqRGljLT5TZXRBdE5hbWUoIlR5cGUiLCAiWE9iamVjdCIpOworICAgICAgICBwT2JqRGljLT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiRm9ybSIpOworICAgICAgfQorICAgIH0KIAotCXJldHVybiBGTEFUVEVOX1NVQ0NFU1M7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwWE9iamVjdCA9IHBOZXdYT1Jlcy0+R2V0RGljdCgiWE9iamVjdCIpOworICAgIGlmICghcFhPYmplY3QpIHsKKyAgICAgIHBYT2JqZWN0ID0gRlhfTkVXIENQREZfRGljdGlvbmFyeTsKKyAgICAgIHBOZXdYT1Jlcy0+U2V0QXQoIlhPYmplY3QiLCBwWE9iamVjdCk7CisgICAgfQorCisgICAgQ0ZYX0J5dGVTdHJpbmcgc0Zvcm1OYW1lOworICAgIHNGb3JtTmFtZS5Gb3JtYXQoIkYlZCIsIGkpOworICAgIEZYX0RXT1JEIGR3T2JqTnVtID0gcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwT2JqKTsKKyAgICBwWE9iamVjdC0+U2V0QXRSZWZlcmVuY2Uoc0Zvcm1OYW1lLCBwRG9jdW1lbnQsIGR3T2JqTnVtKTsKKworICAgIENQREZfU3RyZWFtQWNjIGFjYzsKKyAgICBhY2MuTG9hZEFsbERhdGEocE5ld1hPYmplY3QpOworCisgICAgY29uc3QgdWludDhfdCogcERhdGEgPSBhY2MuR2V0RGF0YSgpOworICAgIENGWF9CeXRlU3RyaW5nIHNTdHJlYW0ocERhdGEsIGFjYy5HZXRTaXplKCkpOworICAgIENGWF9CeXRlU3RyaW5nIHNUZW1wOworCisgICAgaWYgKG1hdHJpeC5Jc0lkZW50aXR5KCkpIHsKKyAgICAgIG1hdHJpeC5hID0gMS4wZjsKKyAgICAgIG1hdHJpeC5iID0gMC4wZjsKKyAgICAgIG1hdHJpeC5jID0gMC4wZjsKKyAgICAgIG1hdHJpeC5kID0gMS4wZjsKKyAgICAgIG1hdHJpeC5lID0gMC4wZjsKKyAgICAgIG1hdHJpeC5mID0gMC4wZjsKKyAgICB9CisKKyAgICBDRlhfQWZmaW5lTWF0cml4IG0gPSBHZXRNYXRyaXgocmNBbm5vdCwgcmNTdHJlYW0sIG1hdHJpeCk7CisgICAgc1RlbXAuRm9ybWF0KCJxICVmIDAgMCAlZiAlZiAlZiBjbSAvJXMgRG8gUVxuIiwgbS5hLCBtLmQsIG0uZSwgbS5mLAorICAgICAgICAgICAgICAgICBzRm9ybU5hbWUuY19zdHIoKSk7CisgICAgc1N0cmVhbSArPSBzVGVtcDsKKworICAgIHBOZXdYT2JqZWN0LT5TZXREYXRhKChjb25zdCB1aW50OF90KilzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgIH0KKyAgcFBhZ2VEaWN0LT5SZW1vdmVBdCgiQW5ub3RzIik7CisKKyAgT2JqZWN0QXJyYXkuUmVtb3ZlQWxsKCk7CisgIFJlY3RBcnJheS5SZW1vdmVBbGwoKTsKKworICByZXR1cm4gRkxBVFRFTl9TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl9wcm9ncmVzc2l2ZS5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcAppbmRleCBmNDdjZDdkLi45MTY3YTc3IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcApAQCAtMTEsMTAwICsxMSwxMDQgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgiCiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VCaXRtYXBfU3RhcnQoIEZQREZfQklUTUFQIGJpdG1hcCwgRlBERl9QQUdFIHBhZ2UsCi0JCQkJCQkJCQkJCQkJaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LAotCQkJCQkJCQkJCQkJICAgIGludCBzaXplX3ksIGludCByb3RhdGUsIGludCBmbGFncywKLQkJCQkJCQkJCQkJCQlJRlNES19QQVVTRSAqIHBhdXNlICkKLXsKLQlpZiAoYml0bWFwID09IE5VTEwgfHwgcGFnZSA9PSBOVUxMKQotCQlyZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydChGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZTREtfUEFVU0UqIHBhdXNlKSB7CisgIGlmIChiaXRtYXAgPT0gTlVMTCB8fCBwYWdlID09IE5VTEwpCisgICAgcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKIAotIAlpZiAoIXBhdXNlKQotIAkJcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKKyAgaWYgKCFwYXVzZSkKKyAgICByZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOwogCi0JaWYgKHBhdXNlLT52ZXJzaW9uICE9MSkKLQkJcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKKyAgaWYgKHBhdXNlLT52ZXJzaW9uICE9IDEpCisgICAgcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKIAotCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKLQlpZiAoIXBQYWdlKQotCQlyZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOworICBDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7CisgIGlmICghcFBhZ2UpCisgICAgcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKIAotLy8JRlhNVF9DU0xPQ0tfT0JKKCZwUGFnZS0+bV9QYWdlTG9jayk7CisgIC8vCUZYTVRfQ1NMT0NLX09CSigmcFBhZ2UtPm1fUGFnZUxvY2spOwogCi0JQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gRlhfTkVXIENSZW5kZXJDb250ZXh0OwotCXBQYWdlLT5TZXRQcml2YXRlRGF0YSgodm9pZCopMSwgcENvbnRleHQsIERyb3BDb250ZXh0ICk7CisgIENSZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IEZYX05FVyBDUmVuZGVyQ29udGV4dDsKKyAgcFBhZ2UtPlNldFByaXZhdGVEYXRhKCh2b2lkKikxLCBwQ29udGV4dCwgRHJvcENvbnRleHQpOwogI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi0JcENvbnRleHQtPm1fcERldmljZSA9IEZYX05FVyBDRlhfU2tpYURldmljZTsKLQlpZiAoZmxhZ3MgJiBGUERGX1JFVkVSU0VfQllURV9PUkRFUikKLQkJKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXAsMCxUUlVFKTsKLQllbHNlCi0JCSgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKKyAgcENvbnRleHQtPm1fcERldmljZSA9IEZYX05FVyBDRlhfU2tpYURldmljZTsKKyAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCisgICAgKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSkKKyAgICAgICAgLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLCAwLCBUUlVFKTsKKyAgZWxzZQorICAgICgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKICNlbHNlCi0JcENvbnRleHQtPm1fcERldmljZSA9IEZYX05FVyBDRlhfRnhnZURldmljZTsKLQlpZiAoZmxhZ3MgJiBGUERGX1JFVkVSU0VfQllURV9PUkRFUikKLQkJKChDRlhfRnhnZURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXAsMCxUUlVFKTsKLQllbHNlCi0JCSgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKKyAgcENvbnRleHQtPm1fcERldmljZSA9IEZYX05FVyBDRlhfRnhnZURldmljZTsKKyAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCisgICAgKChDRlhfRnhnZURldmljZSopcENvbnRleHQtPm1fcERldmljZSkKKyAgICAgICAgLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLCAwLCBUUlVFKTsKKyAgZWxzZQorICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKICNlbmRpZgotCUlGU0RLX1BBVVNFX0FkYXB0ZXIgSVBhdXNlQWRhcHRlcihwYXVzZSk7CisgIElGU0RLX1BBVVNFX0FkYXB0ZXIgSVBhdXNlQWRhcHRlcihwYXVzZSk7CiAKLSAgICBGUERGX1JlbmRlclBhZ2VfUmV0YWlsKHBDb250ZXh0LCBwYWdlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSwgZmxhZ3MsRkFMU0UsICZJUGF1c2VBZGFwdGVyKTsKKyAgRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncywgRkFMU0UsICZJUGF1c2VBZGFwdGVyKTsKIAotCWlmICggcENvbnRleHQtPm1fcFJlbmRlcmVyICkKLQl7Ci0JCUNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6UmVuZGVyU3RhdHVzIHN0YXR1cyA9IENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6RmFpbGVkOwotCQlzdGF0dXMgPSBwQ29udGV4dC0+bV9wUmVuZGVyZXItPkdldFN0YXR1cygpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQlyZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOworICBpZiAocENvbnRleHQtPm1fcFJlbmRlcmVyKSB7CisgICAgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpSZW5kZXJTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpGYWlsZWQ7CisgICAgc3RhdHVzID0gcENvbnRleHQtPm1fcFJlbmRlcmVyLT5HZXRTdGF0dXMoKTsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisgIHJldHVybiBGUERGX1JFTkRFUl9GQUlMRUQ7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VfQ29udGludWUoRlBERl9QQUdFIHBhZ2UsSUZTREtfUEFVU0UgKiBwYXVzZSkKLXsKLQlpZiAocGFnZSA9PSBOVUxMKQotCQlyZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZV9Db250aW51ZShGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZTREtfUEFVU0UqIHBhdXNlKSB7CisgIGlmIChwYWdlID09IE5VTEwpCisgICAgcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKIAotIAlpZiAoIXBhdXNlKQotCQlyZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOworICBpZiAoIXBhdXNlKQorICAgIHJldHVybiBGUERGX1JFTkRFUl9GQUlMRUQ7CiAKLQlpZiAocGF1c2UtPnZlcnNpb24gIT0xKQotCQlyZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOworICBpZiAocGF1c2UtPnZlcnNpb24gIT0gMSkKKyAgICByZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOwogCi0JQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwotCWlmICghcFBhZ2UpCi0JCXJldHVybiBGUERGX1JFTkRFUl9GQUlMRUQ7CisgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOwogCi0vLwlGWE1UX0NTTE9DS19PQkooJnBQYWdlLT5tX1BhZ2VMb2NrKTsKKyAgLy8JRlhNVF9DU0xPQ0tfT0JKKCZwUGFnZS0+bV9QYWdlTG9jayk7CiAKLQlDUmVuZGVyQ29udGV4dCAqIHBDb250ZXh0ID0gKENSZW5kZXJDb250ZXh0KilwUGFnZS0+R2V0UHJpdmF0ZURhdGEoKHZvaWQqKTEpOwotCWlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9wUmVuZGVyZXIpCi0JewotCQlJRlNES19QQVVTRV9BZGFwdGVyIElQYXVzZUFkYXB0ZXIocGF1c2UpOwotCQlwQ29udGV4dC0+bV9wUmVuZGVyZXItPkNvbnRpbnVlKCZJUGF1c2VBZGFwdGVyKTsKKyAgQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gKENSZW5kZXJDb250ZXh0KilwUGFnZS0+R2V0UHJpdmF0ZURhdGEoKHZvaWQqKTEpOworICBpZiAocENvbnRleHQgJiYgcENvbnRleHQtPm1fcFJlbmRlcmVyKSB7CisgICAgSUZTREtfUEFVU0VfQWRhcHRlciBJUGF1c2VBZGFwdGVyKHBhdXNlKTsKKyAgICBwQ29udGV4dC0+bV9wUmVuZGVyZXItPkNvbnRpbnVlKCZJUGF1c2VBZGFwdGVyKTsKIAotCQlDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OlJlbmRlclN0YXR1cyBzdGF0dXMgPSBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OkZhaWxlZDsKLQkJc3RhdHVzID0gcENvbnRleHQtPm1fcFJlbmRlcmVyLT5HZXRTdGF0dXMoKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKKyAgICBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OlJlbmRlclN0YXR1cyBzdGF0dXMgPQorICAgICAgICBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OkZhaWxlZDsKKyAgICBzdGF0dXMgPSBwQ29udGV4dC0+bV9wUmVuZGVyZXItPkdldFN0YXR1cygpOworICAgIHJldHVybiBzdGF0dXM7CisgIH0KKyAgcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKIH0KIAorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VfQ2xvc2UoRlBERl9QQUdFIHBhZ2UpIHsKKyAgaWYgKHBhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm47CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlX0Nsb3NlKEZQREZfUEFHRSBwYWdlKQotewotCWlmIChwYWdlID09IE5VTEwpIHJldHVybjsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7Ci0JaWYgKCFwUGFnZSkgcmV0dXJuOworICAvLwlGWE1UX0NTTE9DS19PQkooJnBQYWdlLT5tX1BhZ2VMb2NrKTsKIAotLy8JRlhNVF9DU0xPQ0tfT0JKKCZwUGFnZS0+bV9QYWdlTG9jayk7Ci0KLQlDUmVuZGVyQ29udGV4dCAqIHBDb250ZXh0ID0gKENSZW5kZXJDb250ZXh0KilwUGFnZS0+R2V0UHJpdmF0ZURhdGEoKHZvaWQqKTEpOwotCWlmIChwQ29udGV4dCkKLQl7Ci0JCXBDb250ZXh0LT5tX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotCQlkZWxldGUgcENvbnRleHQ7Ci0JCXBQYWdlLT5SZW1vdmVQcml2YXRlRGF0YSgodm9pZCopMSk7Ci0JfQorICBDUmVuZGVyQ29udGV4dCogcENvbnRleHQgPSAoQ1JlbmRlckNvbnRleHQqKXBQYWdlLT5HZXRQcml2YXRlRGF0YSgodm9pZCopMSk7CisgIGlmIChwQ29udGV4dCkgeworICAgIHBDb250ZXh0LT5tX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOworICAgIGRlbGV0ZSBwQ29udGV4dDsKKyAgICBwUGFnZS0+UmVtb3ZlUHJpdmF0ZURhdGEoKHZvaWQqKTEpOworICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfc2VhcmNoZXguY3BwIGIvZnBkZnNkay9zcmMvZnBkZl9zZWFyY2hleC5jcHAKaW5kZXggZTAxMmQzMC4uOTc0NzMxNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl9zZWFyY2hleC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9zZWFyY2hleC5jcHAKQEAgLTgsMTEgKzgsOSBAQAogCiAjaW5jbHVkZSAiLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oIgogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Q2hhckluZGV4RnJvbVRleHRJbmRleCgKLSAgICBGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKLSAgICBpbnQgblRleHRJbmRleCkKLXsKLSAgICBpZiAoIXRleHRfcGFnZSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHJldHVybiAoKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZSktPkNoYXJJbmRleEZyb21UZXh0SW5kZXgoblRleHRJbmRleCk7CitETExFWFBPUlQgaW50IFNURENBTEwKK0ZQREZUZXh0X0dldENoYXJJbmRleEZyb21UZXh0SW5kZXgoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIGludCBuVGV4dEluZGV4KSB7CisgIGlmICghdGV4dF9wYWdlKQorICAgIHJldHVybiAtMTsKKyAgcmV0dXJuICgoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlKS0+Q2hhckluZGV4RnJvbVRleHRJbmRleChuVGV4dEluZGV4KTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfc3lzZm9udGluZm8uY3BwIGIvZnBkZnNkay9zcmMvZnBkZl9zeXNmb250aW5mby5jcHAKaW5kZXggNmI3ZDZmYi4uYTBmZGI1MCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl9zeXNmb250aW5mby5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9zeXNmb250aW5mby5jcHAKQEAgLTgsMTY3ICs4LDE4MSBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIgogCi1jbGFzcyBDRlhfRXh0ZXJuYWxGb250SW5mbyBmaW5hbCA6IHB1YmxpYyBJRlhfU3lzdGVtRm9udEluZm8KLXsKLXB1YmxpYzoKLQlDRlhfRXh0ZXJuYWxGb250SW5mbyhGUERGX1NZU0ZPTlRJTkZPKiBwSW5mbykgOiBtX3BJbmZvKHBJbmZvKSB7IH0KK2NsYXNzIENGWF9FeHRlcm5hbEZvbnRJbmZvIGZpbmFsIDogcHVibGljIElGWF9TeXN0ZW1Gb250SW5mbyB7CisgcHVibGljOgorICBDRlhfRXh0ZXJuYWxGb250SW5mbyhGUERGX1NZU0ZPTlRJTkZPKiBwSW5mbykgOiBtX3BJbmZvKHBJbmZvKSB7fQogCi0JdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgb3ZlcnJpZGUKLQl7Ci0JCWlmIChtX3BJbmZvLT5SZWxlYXNlKQotCQkJbV9wSW5mby0+UmVsZWFzZShtX3BJbmZvKTsKLQkJZGVsZXRlIHRoaXM7Ci0JfQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9wSW5mby0+UmVsZWFzZSkKKyAgICAgIG1fcEluZm8tPlJlbGVhc2UobV9wSW5mbyk7CisgICAgZGVsZXRlIHRoaXM7CisgIH0KIAotCXZpcnR1YWwJRlhfQk9PTAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSBvdmVycmlkZQotCXsKLQkJaWYgKG1fcEluZm8tPkVudW1Gb250cykgewotCQkJbV9wSW5mby0+RW51bUZvbnRzKG1fcEluZm8sIHBNYXBwZXIpOwotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQkJcmV0dXJuIEZBTFNFOwotCX0KKyAgdmlydHVhbCBGWF9CT09MIEVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikgb3ZlcnJpZGUgeworICAgIGlmIChtX3BJbmZvLT5FbnVtRm9udHMpIHsKKyAgICAgIG1fcEluZm8tPkVudW1Gb250cyhtX3BJbmZvLCBwTWFwcGVyKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCXZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFtaWx5LCBpbnQmIGlFeGFjdCkgIG92ZXJyaWRlCi0JewotCQlpZiAobV9wSW5mby0+TWFwRm9udCkKLQkJCXJldHVybiBtX3BJbmZvLT5NYXBGb250KG1fcEluZm8sIHdlaWdodCwgYkl0YWxpYywgY2hhcnNldCwgcGl0Y2hfZmFtaWx5LCBmYW1pbHksICZpRXhhY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgIHZpcnR1YWwgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9wSW5mby0+TWFwRm9udCkKKyAgICAgIHJldHVybiBtX3BJbmZvLT5NYXBGb250KG1fcEluZm8sIHdlaWdodCwgYkl0YWxpYywgY2hhcnNldCwgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5LCAmaUV4YWN0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogCi0JdmlydHVhbCB2b2lkKgkJR2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYW1pbHkpICBvdmVycmlkZQotCXsKLQkJaWYgKG1fcEluZm8tPkdldEZvbnQpCi0JCQlyZXR1cm4gbV9wSW5mby0+R2V0Rm9udChtX3BJbmZvLCBmYW1pbHkpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgIHZpcnR1YWwgdm9pZCogR2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYW1pbHkpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9wSW5mby0+R2V0Rm9udCkKKyAgICAgIHJldHVybiBtX3BJbmZvLT5HZXRGb250KG1fcEluZm8sIGZhbWlseSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KIAotCXZpcnR1YWwgRlhfRFdPUkQJR2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpICBvdmVycmlkZQotCXsKLQkJaWYgKG1fcEluZm8tPkdldEZvbnREYXRhKQotCQkJcmV0dXJuIG1fcEluZm8tPkdldEZvbnREYXRhKG1fcEluZm8sIGhGb250LCB0YWJsZSwgYnVmZmVyLCBzaXplKTsKLQkJcmV0dXJuIDA7Ci0JfQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldEZvbnREYXRhKHZvaWQqIGhGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplKSBvdmVycmlkZSB7CisgICAgaWYgKG1fcEluZm8tPkdldEZvbnREYXRhKQorICAgICAgcmV0dXJuIG1fcEluZm8tPkdldEZvbnREYXRhKG1fcEluZm8sIGhGb250LCB0YWJsZSwgYnVmZmVyLCBzaXplKTsKKyAgICByZXR1cm4gMDsKKyAgfQogCi0JdmlydHVhbCBGWF9CT09MCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpICBvdmVycmlkZQotCXsKLQkJaWYgKG1fcEluZm8tPkdldEZhY2VOYW1lID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQkJRlhfRFdPUkQgc2l6ZSA9IG1fcEluZm8tPkdldEZhY2VOYW1lKG1fcEluZm8sIGhGb250LCBOVUxMLCAwKTsKLQkJaWYgKHNpemUgPT0gMCkgcmV0dXJuIEZBTFNFOwotCQljaGFyKiBidWZmZXIgPSBGWF9BbGxvYyhjaGFyLCBzaXplKTsKLQkJc2l6ZSA9IG1fcEluZm8tPkdldEZhY2VOYW1lKG1fcEluZm8sIGhGb250LCBidWZmZXIsIHNpemUpOwotCQluYW1lID0gQ0ZYX0J5dGVTdHJpbmcoYnVmZmVyLCBzaXplKTsKLQkJRlhfRnJlZShidWZmZXIpOwotCQlyZXR1cm4gVFJVRTsKLQl9CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9wSW5mby0+R2V0RmFjZU5hbWUgPT0gTlVMTCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBGWF9EV09SRCBzaXplID0gbV9wSW5mby0+R2V0RmFjZU5hbWUobV9wSW5mbywgaEZvbnQsIE5VTEwsIDApOworICAgIGlmIChzaXplID09IDApCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgY2hhciogYnVmZmVyID0gRlhfQWxsb2MoY2hhciwgc2l6ZSk7CisgICAgc2l6ZSA9IG1fcEluZm8tPkdldEZhY2VOYW1lKG1fcEluZm8sIGhGb250LCBidWZmZXIsIHNpemUpOworICAgIG5hbWUgPSBDRlhfQnl0ZVN0cmluZyhidWZmZXIsIHNpemUpOworICAgIEZYX0ZyZWUoYnVmZmVyKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JdmlydHVhbCBGWF9CT09MCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSAgb3ZlcnJpZGUKLQl7Ci0JCWlmIChtX3BJbmZvLT5HZXRGb250Q2hhcnNldCkgewotCQkJY2hhcnNldCA9IG1fcEluZm8tPkdldEZvbnRDaGFyc2V0KG1fcEluZm8sIGhGb250KTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSBvdmVycmlkZSB7CisgICAgaWYgKG1fcEluZm8tPkdldEZvbnRDaGFyc2V0KSB7CisgICAgICBjaGFyc2V0ID0gbV9wSW5mby0+R2V0Rm9udENoYXJzZXQobV9wSW5mbywgaEZvbnQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JdmlydHVhbCB2b2lkCQlEZWxldGVGb250KHZvaWQqIGhGb250KSAgb3ZlcnJpZGUKLQl7Ci0JCWlmIChtX3BJbmZvLT5EZWxldGVGb250KQotCQkJbV9wSW5mby0+RGVsZXRlRm9udChtX3BJbmZvLCBoRm9udCk7Ci0JfQorICB2aXJ0dWFsIHZvaWQgRGVsZXRlRm9udCh2b2lkKiBoRm9udCkgb3ZlcnJpZGUgeworICAgIGlmIChtX3BJbmZvLT5EZWxldGVGb250KQorICAgICAgbV9wSW5mby0+RGVsZXRlRm9udChtX3BJbmZvLCBoRm9udCk7CisgIH0KIAotcHJpdmF0ZToKLQl+Q0ZYX0V4dGVybmFsRm9udEluZm8oKSB7IH0KKyBwcml2YXRlOgorICB+Q0ZYX0V4dGVybmFsRm9udEluZm8oKSB7fQogCi0JRlBERl9TWVNGT05USU5GTyogY29uc3QgbV9wSW5mbzsKKyAgRlBERl9TWVNGT05USU5GTyogY29uc3QgbV9wSW5mbzsKIH07CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9BZGRJbnN0YWxsZWRGb250KHZvaWQqIG1hcHBlciwgY29uc3QgY2hhciogbmFtZSwgaW50IGNoYXJzZXQpCi17Ci0JKChDRlhfRm9udE1hcHBlciopbWFwcGVyKS0+QWRkSW5zdGFsbGVkRm9udChuYW1lLCBjaGFyc2V0KTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9BZGRJbnN0YWxsZWRGb250KHZvaWQqIG1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCkgeworICAoKENGWF9Gb250TWFwcGVyKiltYXBwZXIpLT5BZGRJbnN0YWxsZWRGb250KG5hbWUsIGNoYXJzZXQpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0U3lzdGVtRm9udEluZm8oRlBERl9TWVNGT05USU5GTyogcEZvbnRJbmZvRXh0KQotewotCWlmIChwRm9udEluZm9FeHQtPnZlcnNpb24gIT0gMSkKLQkJcmV0dXJuOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldFN5c3RlbUZvbnRJbmZvKEZQREZfU1lTRk9OVElORk8qIHBGb250SW5mb0V4dCkgeworICBpZiAocEZvbnRJbmZvRXh0LT52ZXJzaW9uICE9IDEpCisgICAgcmV0dXJuOwogCi0JQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5TZXRTeXN0ZW1Gb250SW5mbygKLQkJbmV3IENGWF9FeHRlcm5hbEZvbnRJbmZvKHBGb250SW5mb0V4dCkpOworICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPlNldFN5c3RlbUZvbnRJbmZvKAorICAgICAgbmV3IENGWF9FeHRlcm5hbEZvbnRJbmZvKHBGb250SW5mb0V4dCkpOwogfQogCi1ETExFWFBPUlQgY29uc3QgRlBERl9DaGFyc2V0Rm9udE1hcCogU1REQ0FMTCBGUERGX0dldERlZmF1bHRUVEZNYXAoKQotewotICAgIHJldHVybiBDUFdMX0ZvbnRNYXA6OmRlZmF1bHRUVEZNYXA7CitETExFWFBPUlQgY29uc3QgRlBERl9DaGFyc2V0Rm9udE1hcCogU1REQ0FMTCBGUERGX0dldERlZmF1bHRUVEZNYXAoKSB7CisgIHJldHVybiBDUFdMX0ZvbnRNYXA6OmRlZmF1bHRUVEZNYXA7CiB9CiAKLXN0cnVjdCBGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQgOiBwdWJsaWMgRlBERl9TWVNGT05USU5GTwotewotCUlGWF9TeXN0ZW1Gb250SW5mbyoJbV9wRm9udEluZm87CitzdHJ1Y3QgRlBERl9TWVNGT05USU5GT19ERUZBVUxUIDogcHVibGljIEZQREZfU1lTRk9OVElORk8geworICBJRlhfU3lzdGVtRm9udEluZm8qIG1fcEZvbnRJbmZvOwogfTsKIAotc3RhdGljIHZvaWQgRGVmYXVsdFJlbGVhc2Uoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcykKLXsKLQkoKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCopcFRoaXMpLT5tX3BGb250SW5mby0+UmVsZWFzZSgpOworc3RhdGljIHZvaWQgRGVmYXVsdFJlbGVhc2Uoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcykgeworICAoKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCopcFRoaXMpLT5tX3BGb250SW5mby0+UmVsZWFzZSgpOwogfQogCi1zdGF0aWMgdm9pZCBEZWZhdWx0RW51bUZvbnRzKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIHBNYXBwZXIpCi17Ci0JKChGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqKXBUaGlzKS0+bV9wRm9udEluZm8tPkVudW1Gb250TGlzdCgoQ0ZYX0ZvbnRNYXBwZXIqKXBNYXBwZXIpOworc3RhdGljIHZvaWQgRGVmYXVsdEVudW1Gb250cyhzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBwTWFwcGVyKSB7CisgICgoRlBERl9TWVNGT05USU5GT19ERUZBVUxUKilwVGhpcykKKyAgICAgIC0+bV9wRm9udEluZm8tPkVudW1Gb250TGlzdCgoQ0ZYX0ZvbnRNYXBwZXIqKXBNYXBwZXIpOwogfQogCi1zdGF0aWMgdm9pZCogRGVmYXVsdE1hcEZvbnQoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgaW50IHdlaWdodCwgaW50IGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBjaGFyKiBmYW1pbHksIGludCogYkV4YWN0KQotewotCXJldHVybiAoKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCopcFRoaXMpLT5tX3BGb250SW5mby0+TWFwRm9udCh3ZWlnaHQsIGJJdGFsaWMsIGNoYXJzZXQsIHBpdGNoX2ZhbWlseSwgZmFtaWx5LCAqYkV4YWN0KTsKK3N0YXRpYyB2b2lkKiBEZWZhdWx0TWFwRm9udChzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBiRXhhY3QpIHsKKyAgcmV0dXJuICgoRlBERl9TWVNGT05USU5GT19ERUZBVUxUKilwVGhpcykKKyAgICAgIC0+bV9wRm9udEluZm8tPk1hcEZvbnQod2VpZ2h0LCBiSXRhbGljLCBjaGFyc2V0LCBwaXRjaF9mYW1pbHksIGZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJFeGFjdCk7CiB9CiAKLXZvaWQqIERlZmF1bHRHZXRGb250KHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIGNvbnN0IGNoYXIqIGZhbWlseSkKLXsKLQlyZXR1cm4gKChGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqKXBUaGlzKS0+bV9wRm9udEluZm8tPkdldEZvbnQoZmFtaWx5KTsKK3ZvaWQqIERlZmF1bHRHZXRGb250KHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIGNvbnN0IGNoYXIqIGZhbWlseSkgeworICByZXR1cm4gKChGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqKXBUaGlzKS0+bV9wRm9udEluZm8tPkdldEZvbnQoZmFtaWx5KTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgRGVmYXVsdEdldEZvbnREYXRhKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250LAotCQkJdW5zaWduZWQgaW50IHRhYmxlLCB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpCi17Ci0JcmV0dXJuICgoRlBERl9TWVNGT05USU5GT19ERUZBVUxUKilwVGhpcyktPm1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgdGFibGUsIGJ1ZmZlciwgYnVmX3NpemUpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgRGVmYXVsdEdldEZvbnREYXRhKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogaEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zl9zaXplKSB7CisgIHJldHVybiAoKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCopcFRoaXMpCisgICAgICAtPm1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgdGFibGUsIGJ1ZmZlciwgYnVmX3NpemUpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBEZWZhdWx0R2V0RmFjZU5hbWUoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogaEZvbnQsIGNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZfc2l6ZSkKLXsKLQlDRlhfQnl0ZVN0cmluZyBuYW1lOwotCWlmICghKChGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqKXBUaGlzKS0+bV9wRm9udEluZm8tPkdldEZhY2VOYW1lKGhGb250LCBuYW1lKSkgcmV0dXJuIDA7Ci0JaWYgKG5hbWUuR2V0TGVuZ3RoKCkgPj0gKGxvbmcpYnVmX3NpemUpIHJldHVybiBuYW1lLkdldExlbmd0aCgpICsgMTsKLQlGWFNZU19zdHJjcHkoYnVmZmVyLCBuYW1lKTsKLQlyZXR1cm4gbmFtZS5HZXRMZW5ndGgoKSArIDE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBEZWZhdWx0R2V0RmFjZU5hbWUoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZfc2l6ZSkgeworICBDRlhfQnl0ZVN0cmluZyBuYW1lOworICBpZiAoISgoRlBERl9TWVNGT05USU5GT19ERUZBVUxUKilwVGhpcykKKyAgICAgICAgICAgLT5tX3BGb250SW5mby0+R2V0RmFjZU5hbWUoaEZvbnQsIG5hbWUpKQorICAgIHJldHVybiAwOworICBpZiAobmFtZS5HZXRMZW5ndGgoKSA+PSAobG9uZylidWZfc2l6ZSkKKyAgICByZXR1cm4gbmFtZS5HZXRMZW5ndGgoKSArIDE7CisgIEZYU1lTX3N0cmNweShidWZmZXIsIG5hbWUpOworICByZXR1cm4gbmFtZS5HZXRMZW5ndGgoKSArIDE7CiB9CiAKLXN0YXRpYyBpbnQgRGVmYXVsdEdldEZvbnRDaGFyc2V0KHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250KQotewotCWludCBjaGFyc2V0OwotCWlmICghKChGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqKXBUaGlzKS0+bV9wRm9udEluZm8tPkdldEZvbnRDaGFyc2V0KGhGb250LCBjaGFyc2V0KSkgcmV0dXJuIDA7Ci0JcmV0dXJuIGNoYXJzZXQ7CitzdGF0aWMgaW50IERlZmF1bHRHZXRGb250Q2hhcnNldChzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCkgeworICBpbnQgY2hhcnNldDsKKyAgaWYgKCEoKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCopcFRoaXMpCisgICAgICAgICAgIC0+bV9wRm9udEluZm8tPkdldEZvbnRDaGFyc2V0KGhGb250LCBjaGFyc2V0KSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIGNoYXJzZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIERlZmF1bHREZWxldGVGb250KHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250KQotewotCSgoRlBERl9TWVNGT05USU5GT19ERUZBVUxUKilwVGhpcyktPm1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKK3N0YXRpYyB2b2lkIERlZmF1bHREZWxldGVGb250KHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250KSB7CisgICgoRlBERl9TWVNGT05USU5GT19ERUZBVUxUKilwVGhpcyktPm1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKIH0KIAotRExMRVhQT1JUIEZQREZfU1lTRk9OVElORk8qIFNURENBTEwgRlBERl9HZXREZWZhdWx0U3lzdGVtRm9udEluZm8oKQotewotCUlGWF9TeXN0ZW1Gb250SW5mbyogcEZvbnRJbmZvID0gSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCk7Ci0JaWYgKHBGb250SW5mbyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKK0RMTEVYUE9SVCBGUERGX1NZU0ZPTlRJTkZPKiBTVERDQUxMIEZQREZfR2V0RGVmYXVsdFN5c3RlbUZvbnRJbmZvKCkgeworICBJRlhfU3lzdGVtRm9udEluZm8qIHBGb250SW5mbyA9IElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgpOworICBpZiAocEZvbnRJbmZvID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CiAKLQlGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqIHBGb250SW5mb0V4dCA9IEZYX0FsbG9jKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCwgMSk7Ci0JcEZvbnRJbmZvRXh0LT5EZWxldGVGb250ID0gRGVmYXVsdERlbGV0ZUZvbnQ7Ci0JcEZvbnRJbmZvRXh0LT5FbnVtRm9udHMgPSBEZWZhdWx0RW51bUZvbnRzOwotCXBGb250SW5mb0V4dC0+R2V0RmFjZU5hbWUgPSBEZWZhdWx0R2V0RmFjZU5hbWU7Ci0JcEZvbnRJbmZvRXh0LT5HZXRGb250ID0gRGVmYXVsdEdldEZvbnQ7Ci0JcEZvbnRJbmZvRXh0LT5HZXRGb250Q2hhcnNldCA9IERlZmF1bHRHZXRGb250Q2hhcnNldDsKLQlwRm9udEluZm9FeHQtPkdldEZvbnREYXRhID0gRGVmYXVsdEdldEZvbnREYXRhOwotCXBGb250SW5mb0V4dC0+TWFwRm9udCA9IERlZmF1bHRNYXBGb250OwotCXBGb250SW5mb0V4dC0+UmVsZWFzZSA9IERlZmF1bHRSZWxlYXNlOwotCXBGb250SW5mb0V4dC0+dmVyc2lvbiA9IDE7Ci0JcEZvbnRJbmZvRXh0LT5tX3BGb250SW5mbyA9IHBGb250SW5mbzsKLQlyZXR1cm4gcEZvbnRJbmZvRXh0OworICBGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqIHBGb250SW5mb0V4dCA9CisgICAgICBGWF9BbGxvYyhGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQsIDEpOworICBwRm9udEluZm9FeHQtPkRlbGV0ZUZvbnQgPSBEZWZhdWx0RGVsZXRlRm9udDsKKyAgcEZvbnRJbmZvRXh0LT5FbnVtRm9udHMgPSBEZWZhdWx0RW51bUZvbnRzOworICBwRm9udEluZm9FeHQtPkdldEZhY2VOYW1lID0gRGVmYXVsdEdldEZhY2VOYW1lOworICBwRm9udEluZm9FeHQtPkdldEZvbnQgPSBEZWZhdWx0R2V0Rm9udDsKKyAgcEZvbnRJbmZvRXh0LT5HZXRGb250Q2hhcnNldCA9IERlZmF1bHRHZXRGb250Q2hhcnNldDsKKyAgcEZvbnRJbmZvRXh0LT5HZXRGb250RGF0YSA9IERlZmF1bHRHZXRGb250RGF0YTsKKyAgcEZvbnRJbmZvRXh0LT5NYXBGb250ID0gRGVmYXVsdE1hcEZvbnQ7CisgIHBGb250SW5mb0V4dC0+UmVsZWFzZSA9IERlZmF1bHRSZWxlYXNlOworICBwRm9udEluZm9FeHQtPnZlcnNpb24gPSAxOworICBwRm9udEluZm9FeHQtPm1fcEZvbnRJbmZvID0gcEZvbnRJbmZvOworICByZXR1cm4gcEZvbnRJbmZvRXh0OwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAKaW5kZXggZTQ5ZDc0ZS4uYWQ1ZjdmZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX3RyYW5zZm9ybXBhZ2UuY3BwCkBAIC05LDMyNiArOSwzMzIgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgiCiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfU2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsIGZsb2F0IGxlZnQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgcmlnaHQsIGZsb2F0IHRvcCkKLXsKLQlpZighcGFnZSkKLQkJcmV0dXJuOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKLQlpZiAoIXBQYWdlKSByZXR1cm47Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7Ci0JQ1BERl9BcnJheSogcE1lZGlhQm94QXJyYXkgPSBGWF9ORVcgQ1BERl9BcnJheTsKLQlwTWVkaWFCb3hBcnJheS0+QWRkKEZYX05FVyBDUERGX051bWJlcihsZWZ0KSk7Ci0JcE1lZGlhQm94QXJyYXktPkFkZChGWF9ORVcgQ1BERl9OdW1iZXIoYm90dG9tKSk7Ci0JcE1lZGlhQm94QXJyYXktPkFkZChGWF9ORVcgQ1BERl9OdW1iZXIoRlhfRkxPQVQocmlnaHQpKSk7Ci0JcE1lZGlhQm94QXJyYXktPkFkZChGWF9ORVcgQ1BERl9OdW1iZXIoRlhfRkxPQVQodG9wKSkpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRNZWRpYUJveChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdG9wKSB7CisgIGlmICghcGFnZSkKKyAgICByZXR1cm47CisgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm47CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OworICBDUERGX0FycmF5KiBwTWVkaWFCb3hBcnJheSA9IEZYX05FVyBDUERGX0FycmF5OworICBwTWVkaWFCb3hBcnJheS0+QWRkKEZYX05FVyBDUERGX051bWJlcihsZWZ0KSk7CisgIHBNZWRpYUJveEFycmF5LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKGJvdHRvbSkpOworICBwTWVkaWFCb3hBcnJheS0+QWRkKEZYX05FVyBDUERGX051bWJlcihGWF9GTE9BVChyaWdodCkpKTsKKyAgcE1lZGlhQm94QXJyYXktPkFkZChGWF9ORVcgQ1BERl9OdW1iZXIoRlhfRkxPQVQodG9wKSkpOwogCi0JcFBhZ2VEaWN0LT5TZXRBdCgiTWVkaWFCb3giLCBwTWVkaWFCb3hBcnJheSk7CisgIHBQYWdlRGljdC0+U2V0QXQoIk1lZGlhQm94IiwgcE1lZGlhQm94QXJyYXkpOwogfQogCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX1NldENyb3BCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdG9wKSB7CisgIGlmICghcGFnZSkKKyAgICByZXR1cm47CisgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm47CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OworICBDUERGX0FycmF5KiBwQ3JvcEJveEFycmF5ID0gRlhfTkVXIENQREZfQXJyYXk7CisgIHBDcm9wQm94QXJyYXktPkFkZChGWF9ORVcgQ1BERl9OdW1iZXIobGVmdCkpOworICBwQ3JvcEJveEFycmF5LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKGJvdHRvbSkpOworICBwQ3JvcEJveEFycmF5LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKEZYX0ZMT0FUKHJpZ2h0KSkpOworICBwQ3JvcEJveEFycmF5LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKEZYX0ZMT0FUKHRvcCkpKTsKIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLCBmbG9hdCBsZWZ0LCBmbG9hdCBib3R0b20sIGZsb2F0IHJpZ2h0LCBmbG9hdCB0b3ApCi17Ci0JaWYoIXBhZ2UpCi0JCXJldHVybjsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7Ci0JaWYgKCFwUGFnZSkgcmV0dXJuOwotCUNQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwotCUNQREZfQXJyYXkqIHBDcm9wQm94QXJyYXkgPSBGWF9ORVcgQ1BERl9BcnJheTsKLQlwQ3JvcEJveEFycmF5LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKGxlZnQpKTsKLQlwQ3JvcEJveEFycmF5LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKGJvdHRvbSkpOwotCXBDcm9wQm94QXJyYXktPkFkZChGWF9ORVcgQ1BERl9OdW1iZXIoRlhfRkxPQVQocmlnaHQpKSk7Ci0JcENyb3BCb3hBcnJheS0+QWRkKEZYX05FVyBDUERGX051bWJlcihGWF9GTE9BVCh0b3ApKSk7Ci0KLQotCXBQYWdlRGljdC0+U2V0QXQoIkNyb3BCb3giLCBwQ3JvcEJveEFycmF5KTsKKyAgcFBhZ2VEaWN0LT5TZXRBdCgiQ3JvcEJveCIsIHBDcm9wQm94QXJyYXkpOwogfQogCi0KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZXRNZWRpYUJveChGUERGX1BBR0UgcGFnZSwgZmxvYXQqIGxlZnQsIGZsb2F0KiBib3R0b20sIGZsb2F0KiByaWdodCwgZmxvYXQqIHRvcCkKLXsKLQlpZighcGFnZSkKLQkJcmV0dXJuIEZBTFNFOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKLQlpZiAoIXBQYWdlKSByZXR1cm4gRkFMU0U7Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7Ci0JQ1BERl9BcnJheSogcEFycmF5ID0gcFBhZ2VEaWN0LT5HZXRBcnJheSgiTWVkaWFCb3giKTsKLQlpZihwQXJyYXkpCi0JewotCQkqbGVmdCA9IHBBcnJheS0+R2V0RmxvYXQoMCk7Ci0JCSpib3R0b20gPSBwQXJyYXktPkdldEZsb2F0KDEpOwotCQkqcmlnaHQgPSBwQXJyYXktPkdldEZsb2F0KDIpOwotCQkqdG9wID0gcEFycmF5LT5HZXRGbG9hdCgzKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCXJldHVybiBGQUxTRTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZXRNZWRpYUJveChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9wKSB7CisgIGlmICghcGFnZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OworICBDUERGX0FycmF5KiBwQXJyYXkgPSBwUGFnZURpY3QtPkdldEFycmF5KCJNZWRpYUJveCIpOworICBpZiAocEFycmF5KSB7CisgICAgKmxlZnQgPSBwQXJyYXktPkdldEZsb2F0KDApOworICAgICpib3R0b20gPSBwQXJyYXktPkdldEZsb2F0KDEpOworICAgICpyaWdodCA9IHBBcnJheS0+R2V0RmxvYXQoMik7CisgICAgKnRvcCA9IHBBcnJheS0+R2V0RmxvYXQoMyk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0Q3JvcEJveChGUERGX1BBR0UgcGFnZSwgZmxvYXQqIGxlZnQsIGZsb2F0KiBib3R0b20sIGZsb2F0KiByaWdodCwgZmxvYXQqIHRvcCkKLXsKLQlpZighcGFnZSkKLQkJcmV0dXJuIEZBTFNFOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKLQlpZiAoIXBQYWdlKSByZXR1cm4gRkFMU0U7Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7Ci0JQ1BERl9BcnJheSogcEFycmF5ID0gcFBhZ2VEaWN0LT5HZXRBcnJheSgiQ3JvcEJveCIpOwotCWlmKHBBcnJheSkKLQl7Ci0JCSpsZWZ0ID0gcEFycmF5LT5HZXRGbG9hdCgwKTsKLQkJKmJvdHRvbSA9IHBBcnJheS0+R2V0RmxvYXQoMSk7Ci0JCSpyaWdodCA9IHBBcnJheS0+R2V0RmxvYXQoMik7Ci0JCSp0b3AgPSBwQXJyYXktPkdldEZsb2F0KDMpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dldENyb3BCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9wKSB7CisgIGlmICghcGFnZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OworICBDUERGX0FycmF5KiBwQXJyYXkgPSBwUGFnZURpY3QtPkdldEFycmF5KCJDcm9wQm94Iik7CisgIGlmIChwQXJyYXkpIHsKKyAgICAqbGVmdCA9IHBBcnJheS0+R2V0RmxvYXQoMCk7CisgICAgKmJvdHRvbSA9IHBBcnJheS0+R2V0RmxvYXQoMSk7CisgICAgKnJpZ2h0ID0gcEFycmF5LT5HZXRGbG9hdCgyKTsKKyAgICAqdG9wID0gcEFycmF5LT5HZXRGbG9hdCgzKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9UcmFuc0Zvcm1XaXRoQ2xpcChGUERGX1BBR0UgcGFnZSwgRlNfTUFUUklYKiBtYXRyaXgsIEZTX1JFQ1RGKiBjbGlwUmVjdCkKLXsKLQlpZighcGFnZSkKLQkJcmV0dXJuIEZBTFNFOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX1RyYW5zRm9ybVdpdGhDbGlwKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX01BVFJJWCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1JFQ1RGKiBjbGlwUmVjdCkgeworICBpZiAoIXBhZ2UpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwotCWlmICghcFBhZ2UpCi0JCXJldHVybiBGQUxTRTsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworICBpZiAoIXBQYWdlKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNGWF9CeXRlVGV4dEJ1ZiB0ZXh0QnVmOwotCXRleHRCdWY8PCJxICI7Ci0JQ0ZYX0Zsb2F0UmVjdCByZWN0KGNsaXBSZWN0LT5sZWZ0LCBjbGlwUmVjdC0+Ym90dG9tLCBjbGlwUmVjdC0+cmlnaHQsIGNsaXBSZWN0LT50b3ApOwotCXJlY3QuTm9ybWFsaXplKCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgYnNDbGlwcGluZzsKLQlic0NsaXBwaW5nLkZvcm1hdCgiJWYgJWYgJWYgJWYgcmUgVyogbiAiLCByZWN0LmxlZnQsIHJlY3QuYm90dG9tLCByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCkpOwotCXRleHRCdWY8PGJzQ2xpcHBpbmc7CisgIENGWF9CeXRlVGV4dEJ1ZiB0ZXh0QnVmOworICB0ZXh0QnVmIDw8ICJxICI7CisgIENGWF9GbG9hdFJlY3QgcmVjdChjbGlwUmVjdC0+bGVmdCwgY2xpcFJlY3QtPmJvdHRvbSwgY2xpcFJlY3QtPnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgY2xpcFJlY3QtPnRvcCk7CisgIHJlY3QuTm9ybWFsaXplKCk7CisgIENGWF9CeXRlU3RyaW5nIGJzQ2xpcHBpbmc7CisgIGJzQ2xpcHBpbmcuRm9ybWF0KCIlZiAlZiAlZiAlZiByZSBXKiBuICIsIHJlY3QubGVmdCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSk7CisgIHRleHRCdWYgPDwgYnNDbGlwcGluZzsKIAotCUNGWF9CeXRlU3RyaW5nIGJzTWF0aXg7Ci0JYnNNYXRpeC5Gb3JtYXQoIiVmICVmICVmICVmICVmICVmIGNtICIsIG1hdHJpeC0+YSwgbWF0cml4LT5iLG1hdHJpeC0+YyxtYXRyaXgtPmQsbWF0cml4LT5lLG1hdHJpeC0+Zik7Ci0JdGV4dEJ1Zjw8YnNNYXRpeDsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNNYXRpeDsKKyAgYnNNYXRpeC5Gb3JtYXQoIiVmICVmICVmICVmICVmICVmIGNtICIsIG1hdHJpeC0+YSwgbWF0cml4LT5iLCBtYXRyaXgtPmMsCisgICAgICAgICAgICAgICAgIG1hdHJpeC0+ZCwgbWF0cml4LT5lLCBtYXRyaXgtPmYpOworICB0ZXh0QnVmIDw8IGJzTWF0aXg7CiAKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpYyA9IHBQYWdlLT5tX3BGb3JtRGljdDsKKyAgQ1BERl9PYmplY3QqIHBDb250ZW50T2JqID0gcFBhZ2VEaWMgPyBwUGFnZURpYy0+R2V0RWxlbWVudCgiQ29udGVudHMiKSA6IE5VTEw7CisgIGlmICghcENvbnRlbnRPYmopCisgICAgcENvbnRlbnRPYmogPSBwUGFnZURpYyA/IHBQYWdlRGljLT5HZXRBcnJheSgiQ29udGVudHMiKSA6IE5VTEw7CisgIGlmICghcENvbnRlbnRPYmopCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpYyA9IHBQYWdlLT5tX3BGb3JtRGljdDsKLQlDUERGX09iamVjdCogcENvbnRlbnRPYmogPSBwUGFnZURpYyA/IHBQYWdlRGljLT5HZXRFbGVtZW50KCJDb250ZW50cyIpIDogTlVMTDsKLQlpZighcENvbnRlbnRPYmopCi0JCXBDb250ZW50T2JqID0gcFBhZ2VEaWMgPyBwUGFnZURpYy0+R2V0QXJyYXkoIkNvbnRlbnRzIikgOiBOVUxMOwotCWlmKCFwQ29udGVudE9iaikKLQkJcmV0dXJuIEZBTFNFOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWMgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IEZYX05FVyBDUERGX1N0cmVhbShOVUxMLCAwLCBwRGljKTsKKyAgcFN0cmVhbS0+U2V0RGF0YSh0ZXh0QnVmLkdldEJ1ZmZlcigpLCB0ZXh0QnVmLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBQYWdlLT5tX3BEb2N1bWVudDsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBGQUxTRTsKKyAgcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7CiAKLQlDUERGX0RpY3Rpb25hcnkqIHBEaWMgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OwotCUNQREZfU3RyZWFtKiBwU3RyZWFtID0gRlhfTkVXIENQREZfU3RyZWFtKE5VTEwsMCwgcERpYyk7Ci0JcFN0cmVhbS0+U2V0RGF0YSh0ZXh0QnVmLkdldEJ1ZmZlcigpLCB0ZXh0QnVmLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gcFBhZ2UtPm1fcERvY3VtZW50OwotCWlmKCFwRG9jKQotCQlyZXR1cm4gRkFMU0U7Ci0JcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7CisgIHBEaWMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICBDUERGX1N0cmVhbSogcEVuZFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBwRGljKTsKKyAgcEVuZFN0cmVhbS0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopIiBRIiwgMiwgRkFMU0UsIEZBTFNFKTsKKyAgcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocEVuZFN0cmVhbSk7CiAKLQlwRGljID0gbmV3IENQREZfRGljdGlvbmFyeTsKLQlDUERGX1N0cmVhbSogcEVuZFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLDAsIHBEaWMpOwotCXBFbmRTdHJlYW0tPlNldERhdGEoKGNvbnN0IHVpbnQ4X3QqKSIgUSIsIDIsIEZBTFNFLCBGQUxTRSk7Ci0JcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocEVuZFN0cmVhbSk7CisgIENQREZfQXJyYXkqIHBDb250ZW50QXJyYXkgPSBOVUxMOworICBpZiAocENvbnRlbnRPYmogJiYgcENvbnRlbnRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKKyAgICBwQ29udGVudEFycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50T2JqOworICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gRlhfTkVXIENQREZfUmVmZXJlbmNlKHBEb2MsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKKyAgICBwQ29udGVudEFycmF5LT5JbnNlcnRBdCgwLCBwUmVmKTsKKyAgICBwQ29udGVudEFycmF5LT5BZGRSZWZlcmVuY2UocERvYywgcEVuZFN0cmVhbSk7CiAKLQlDUERGX0FycmF5KiBwQ29udGVudEFycmF5ID0gTlVMTDsKLQlpZiAocENvbnRlbnRPYmogJiYgcENvbnRlbnRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpCi0JewotCQlwQ29udGVudEFycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50T2JqOwotCQlDUERGX1JlZmVyZW5jZSogcFJlZiA9IEZYX05FVyBDUERGX1JlZmVyZW5jZShwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7Ci0JCXBDb250ZW50QXJyYXktPkluc2VydEF0KDAsIHBSZWYpOwotCQlwQ29udGVudEFycmF5LT5BZGRSZWZlcmVuY2UocERvYyxwRW5kU3RyZWFtKTsKKyAgfSBlbHNlIGlmIChwQ29udGVudE9iaiAmJiBwQ29udGVudE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICBDUERGX1JlZmVyZW5jZSogcFJlZmVyZW5jZSA9IChDUERGX1JlZmVyZW5jZSopcENvbnRlbnRPYmo7CisgICAgQ1BERl9PYmplY3QqIHBEaXJlY3RPYmogPSBwUmVmZXJlbmNlLT5HZXREaXJlY3QoKTsKKyAgICBpZiAocERpcmVjdE9iaiAhPSBOVUxMKSB7CisgICAgICBpZiAocERpcmVjdE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgICAgICBwQ29udGVudEFycmF5ID0gKENQREZfQXJyYXkqKXBEaXJlY3RPYmo7CisgICAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0KKyAgICAgICAgICAgIEZYX05FVyBDUERGX1JlZmVyZW5jZShwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgICAgICAgIHBDb250ZW50QXJyYXktPkluc2VydEF0KDAsIHBSZWYpOworICAgICAgICBwQ29udGVudEFycmF5LT5BZGRSZWZlcmVuY2UocERvYywgcEVuZFN0cmVhbSk7CiAKLQl9Ci0JZWxzZSBpZihwQ29udGVudE9iaiAmJiBwQ29udGVudE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpCi0JewotCQlDUERGX1JlZmVyZW5jZSogcFJlZmVyZW5jZSA9IChDUERGX1JlZmVyZW5jZSopcENvbnRlbnRPYmo7Ci0JCUNQREZfT2JqZWN0KiBwRGlyZWN0T2JqID0gcFJlZmVyZW5jZS0+R2V0RGlyZWN0KCk7Ci0JCWlmKHBEaXJlY3RPYmogIT0gTlVMTCkKLQkJewotCQkJaWYocERpcmVjdE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkKLQkJCXsKLQkJCQlwQ29udGVudEFycmF5ID0gKENQREZfQXJyYXkqKXBEaXJlY3RPYmo7Ci0JCQkJQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBGWF9ORVcgQ1BERl9SZWZlcmVuY2UocERvYywgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOwotCQkJCXBDb250ZW50QXJyYXktPkluc2VydEF0KDAsIHBSZWYpOwotCQkJCXBDb250ZW50QXJyYXktPkFkZFJlZmVyZW5jZShwRG9jLHBFbmRTdHJlYW0pOworICAgICAgfSBlbHNlIGlmIChwRGlyZWN0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgeworICAgICAgICBwQ29udGVudEFycmF5ID0gRlhfTkVXIENQREZfQXJyYXkoKTsKKyAgICAgICAgcENvbnRlbnRBcnJheS0+QWRkUmVmZXJlbmNlKHBEb2MsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKKyAgICAgICAgcENvbnRlbnRBcnJheS0+QWRkUmVmZXJlbmNlKHBEb2MsIHBEaXJlY3RPYmotPkdldE9iak51bSgpKTsKKyAgICAgICAgcENvbnRlbnRBcnJheS0+QWRkUmVmZXJlbmNlKHBEb2MsIHBFbmRTdHJlYW0pOworICAgICAgICBwUGFnZURpYy0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBDb250ZW50QXJyYXkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotCQkJfQotCQkJZWxzZSBpZihwRGlyZWN0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkKLQkJCXsKLQkJCQlwQ29udGVudEFycmF5ID0gRlhfTkVXIENQREZfQXJyYXkoKTsKLQkJCQlwQ29udGVudEFycmF5LT5BZGRSZWZlcmVuY2UocERvYyxwU3RyZWFtLT5HZXRPYmpOdW0oKSk7Ci0JCQkJcENvbnRlbnRBcnJheS0+QWRkUmVmZXJlbmNlKHBEb2MscERpcmVjdE9iai0+R2V0T2JqTnVtKCkpOwotCQkJCXBDb250ZW50QXJyYXktPkFkZFJlZmVyZW5jZShwRG9jLCBwRW5kU3RyZWFtKTsKLQkJCQlwUGFnZURpYy0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgcERvYywgcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocENvbnRlbnRBcnJheSkpOwotCQkJfQotCQl9Ci0JfQorICAvLyBOZWVkIHRvIHRyYW5zZm9ybSB0aGUgcGF0dGVybnMgYXMgd2VsbC4KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzID0gcFBhZ2VEaWMtPkdldERpY3QoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKKyAgaWYgKHBSZXMpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXR0ZW5EaWN0ID0gcFJlcy0+R2V0RGljdChGWF9CU1RSQygiUGF0dGVybiIpKTsKKyAgICBpZiAocFBhdHRlbkRpY3QpIHsKKyAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBQYXR0ZW5EaWN0LT5HZXRTdGFydFBvcygpOworICAgICAgd2hpbGUgKHBvcykgeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gTlVMTDsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OworICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBQYXR0ZW5EaWN0LT5HZXROZXh0RWxlbWVudChwb3MsIGtleSk7CisgICAgICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkKKyAgICAgICAgICBwT2JqID0gcE9iai0+R2V0RGlyZWN0KCk7CisgICAgICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICAgICAgICBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7CisgICAgICAgIH0gZWxzZSBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKKyAgICAgICAgICBwRGljdCA9ICgoQ1BERl9TdHJlYW0qKXBPYmopLT5HZXREaWN0KCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGNvbnRpbnVlOwogCi0JLy9OZWVkIHRvIHRyYW5zZm9ybSB0aGUgcGF0dGVybnMgYXMgd2VsbC4KLQlDUERGX0RpY3Rpb25hcnkqIHBSZXMgPSBwUGFnZURpYy0+R2V0RGljdChGWF9CU1RSQygiUmVzb3VyY2VzIikpOwotCWlmKHBSZXMpCi0JewotCQlDUERGX0RpY3Rpb25hcnkqIHBQYXR0ZW5EaWN0ID0gcFJlcy0+R2V0RGljdChGWF9CU1RSQygiUGF0dGVybiIpKTsKLQkJaWYocFBhdHRlbkRpY3QpCi0JCXsKLQkJCUZYX1BPU0lUSU9OIHBvcyA9IHBQYXR0ZW5EaWN0LT5HZXRTdGFydFBvcygpOwotCQkJd2hpbGUocG9zKQotCQkJewotCQkJCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMOwotCQkJCUNGWF9CeXRlU3RyaW5nIGtleTsKLQkJCQlDUERGX09iamVjdCogcE9iaiA9IHBQYXR0ZW5EaWN0LT5HZXROZXh0RWxlbWVudChwb3MsIGtleSk7Ci0JCQkJaWYocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpCi0JCQkJCXBPYmogPSBwT2JqLT5HZXREaXJlY3QoKTsKLQkJCQlpZihwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpCi0JCQkJewotCQkJCQlwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7Ci0JCQkJfQotCQkJCWVsc2UgaWYocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pCi0JCQkJewotCQkJCQlwRGljdCA9ICgoQ1BERl9TdHJlYW0qKXBPYmopLT5HZXREaWN0KCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJY29udGludWU7CisgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbSA9IHBEaWN0LT5HZXRNYXRyaXgoRlhfQlNUUkMoIk1hdHJpeCIpKTsKKyAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCB0ID0gKihDRlhfQWZmaW5lTWF0cml4KiltYXRyaXg7CisgICAgICAgIG0uQ29uY2F0KHQpOworICAgICAgICBwRGljdC0+U2V0QXRNYXRyaXgoRlhfQlNUUkMoIk1hdHJpeCIpLCBtKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotCQkJCUNGWF9BZmZpbmVNYXRyaXggbSA9IHBEaWN0LT5HZXRNYXRyaXgoRlhfQlNUUkMoIk1hdHJpeCIpKTsKLQkJCQlDRlhfQWZmaW5lTWF0cml4IHQgPSAqKENGWF9BZmZpbmVNYXRyaXgqKW1hdHJpeDsKLQkJCQltLkNvbmNhdCh0KTsKLQkJCQlwRGljdC0+U2V0QXRNYXRyaXgoRlhfQlNUUkMoIk1hdHJpeCIpLCBtKTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZU9ial9UcmFuc2Zvcm1DbGlwUGF0aChGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QsZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsIGRvdWJsZSBlLCBkb3VibGUgZikKLXsKLQlDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gKENQREZfUGFnZU9iamVjdCopcGFnZV9vYmplY3Q7Ci0JaWYocFBhZ2VPYmogPT0gTlVMTCkKLQkJcmV0dXJuOwotCUNGWF9BZmZpbmVNYXRyaXggbWF0cml4KChGWF9GTE9BVClhLChGWF9GTE9BVCliLChGWF9GTE9BVCljLChGWF9GTE9BVClkLChGWF9GTE9BVCllLChGWF9GTE9BVClmKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwKK0ZQREZQYWdlT2JqX1RyYW5zZm9ybUNsaXBQYXRoKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZikgeworICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gKENQREZfUGFnZU9iamVjdCopcGFnZV9vYmplY3Q7CisgIGlmIChwUGFnZU9iaiA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgoKEZYX0ZMT0FUKWEsIChGWF9GTE9BVCliLCAoRlhfRkxPQVQpYywgKEZYX0ZMT0FUKWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCllLCAoRlhfRkxPQVQpZik7CiAKLQkvL1NwZWNpYWwgdHJlYXRtZW50IHRvIHNoYWRpbmcgb2JqZWN0LCBiZWNhdXNlIHRoZSBDbGlwUGF0aCBmb3Igc2hhZGluZyBvYmplY3QgaXMgYWxyZWFkeSB0cmFuc2Zvcm1lZC4KLQlpZihwUGFnZU9iai0+bV9UeXBlICE9IFBERlBBR0VfU0hBRElORykKLQkJcFBhZ2VPYmotPlRyYW5zZm9ybUNsaXBQYXRoKG1hdHJpeCk7Ci0JcFBhZ2VPYmotPlRyYW5zZm9ybUdlbmVyYWxTdGF0ZShtYXRyaXgpOworICAvLyBTcGVjaWFsIHRyZWF0bWVudCB0byBzaGFkaW5nIG9iamVjdCwgYmVjYXVzZSB0aGUgQ2xpcFBhdGggZm9yIHNoYWRpbmcKKyAgLy8gb2JqZWN0IGlzIGFscmVhZHkgdHJhbnNmb3JtZWQuCisgIGlmIChwUGFnZU9iai0+bV9UeXBlICE9IFBERlBBR0VfU0hBRElORykKKyAgICBwUGFnZU9iai0+VHJhbnNmb3JtQ2xpcFBhdGgobWF0cml4KTsKKyAgcFBhZ2VPYmotPlRyYW5zZm9ybUdlbmVyYWxTdGF0ZShtYXRyaXgpOwogfQogCi0KLURMTEVYUE9SVCBGUERGX0NMSVBQQVRIIFNURENBTEwgRlBERl9DcmVhdGVDbGlwUGF0aChmbG9hdCBsZWZ0LCBmbG9hdCBib3R0b20sIGZsb2F0IHJpZ2h0LCBmbG9hdCB0b3ApCi17Ci0JQ1BERl9DbGlwUGF0aCogcE5ld0NsaXBQYXRoID0gIEZYX05FVyBDUERGX0NsaXBQYXRoKCk7Ci0JcE5ld0NsaXBQYXRoLT5HZXRNb2RpZnkoKTsKLQlDUERGX1BhdGggUGF0aDsKLQlQYXRoLkdldE1vZGlmeSgpOwotCVBhdGguQXBwZW5kUmVjdChsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOwotCXBOZXdDbGlwUGF0aC0+QXBwZW5kUGF0aChQYXRoLCBGWEZJTExfQUxURVJOQVRFLCBGQUxTRSk7Ci0JcmV0dXJuIHBOZXdDbGlwUGF0aDsKK0RMTEVYUE9SVCBGUERGX0NMSVBQQVRIIFNURENBTEwgRlBERl9DcmVhdGVDbGlwUGF0aChmbG9hdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0b3ApIHsKKyAgQ1BERl9DbGlwUGF0aCogcE5ld0NsaXBQYXRoID0gRlhfTkVXIENQREZfQ2xpcFBhdGgoKTsKKyAgcE5ld0NsaXBQYXRoLT5HZXRNb2RpZnkoKTsKKyAgQ1BERl9QYXRoIFBhdGg7CisgIFBhdGguR2V0TW9kaWZ5KCk7CisgIFBhdGguQXBwZW5kUmVjdChsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOworICBwTmV3Q2xpcFBhdGgtPkFwcGVuZFBhdGgoUGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgRkFMU0UpOworICByZXR1cm4gcE5ld0NsaXBQYXRoOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRGVzdHJveUNsaXBQYXRoKEZQREZfQ0xJUFBBVEggY2xpcFBhdGgpCi17Ci0gICAgZGVsZXRlIChDUERGX0NsaXBQYXRoKiljbGlwUGF0aDsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9EZXN0cm95Q2xpcFBhdGgoRlBERl9DTElQUEFUSCBjbGlwUGF0aCkgeworICBkZWxldGUgKENQREZfQ2xpcFBhdGgqKWNsaXBQYXRoOwogfQogCi12b2lkIE91dHB1dFBhdGgoQ0ZYX0J5dGVUZXh0QnVmJiBidWYsIENQREZfUGF0aCBwYXRoKQotewotCWNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhID0gcGF0aDsKLQlpZiAocFBhdGhEYXRhID09IE5VTEwpIHJldHVybjsKK3ZvaWQgT3V0cHV0UGF0aChDRlhfQnl0ZVRleHRCdWYmIGJ1ZiwgQ1BERl9QYXRoIHBhdGgpIHsKKyAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEgPSBwYXRoOworICBpZiAocFBhdGhEYXRhID09IE5VTEwpCisgICAgcmV0dXJuOwogCi0JRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsKKyAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsKIAotCWlmIChwYXRoLklzUmVjdCgpKSB7Ci0JCWJ1ZiA8PCAocFBvaW50c1swXS5tX1BvaW50WCkgPDwgIiAiIDw8IChwUG9pbnRzWzBdLm1fUG9pbnRZKSA8PCAiICIKLQkJCTw8IChwUG9pbnRzWzJdLm1fUG9pbnRYIC0gcFBvaW50c1swXS5tX1BvaW50WCkgPDwgIiAiCi0JCQk8PCAocFBvaW50c1syXS5tX1BvaW50WSAtIHBQb2ludHNbMF0ubV9Qb2ludFkpIDw8ICIgcmVcbiI7Ci0JCXJldHVybjsKLQl9CisgIGlmIChwYXRoLklzUmVjdCgpKSB7CisgICAgYnVmIDw8IChwUG9pbnRzWzBdLm1fUG9pbnRYKSA8PCAiICIgPDwgKHBQb2ludHNbMF0ubV9Qb2ludFkpIDw8ICIgIgorICAgICAgICA8PCAocFBvaW50c1syXS5tX1BvaW50WCAtIHBQb2ludHNbMF0ubV9Qb2ludFgpIDw8ICIgIgorICAgICAgICA8PCAocFBvaW50c1syXS5tX1BvaW50WSAtIHBQb2ludHNbMF0ubV9Qb2ludFkpIDw8ICIgcmVcbiI7CisgICAgcmV0dXJuOworICB9CiAKLQlDRlhfQnl0ZVN0cmluZyB0ZW1wOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7IGkgKyspIHsKLQkJYnVmIDw8IChwUG9pbnRzW2ldLm1fUG9pbnRYKSA8PCAiICIgPDwgKHBQb2ludHNbaV0ubV9Qb2ludFkpOwotCQlpbnQgcG9pbnRfdHlwZSA9IHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFOwotCQlpZiAocG9pbnRfdHlwZSA9PSBGWFBUX01PVkVUTykKLQkJCWJ1ZiA8PCAiIG1cbiI7Ci0JCWVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9CRVpJRVJUTykgewotCQkJYnVmIDw8ICIgIiA8PCAocFBvaW50c1tpKzFdLm1fUG9pbnRYKSA8PCAiICIgPDwgKHBQb2ludHNbaSsxXS5tX1BvaW50WSkgPDwgIiAiIDw8Ci0JCQkJKHBQb2ludHNbaSsyXS5tX1BvaW50WCkgPDwgIiAiIDw8IChwUG9pbnRzW2krMl0ubV9Qb2ludFkpOwotCQkJaWYgKHBQb2ludHNbaSsyXS5tX0ZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKQotCQkJCWJ1ZiA8PCAiIGMgaFxuIjsKLQkJCWVsc2UKLQkJCQlidWYgPDwgIiBjXG4iOwotCQkJaSArPSAyOwotCQl9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9MSU5FVE8pIHsKLQkJCWlmIChwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpCi0JCQkJYnVmIDw8ICIgbCBoXG4iOwotCQkJZWxzZQotCQkJCWJ1ZiA8PCAiIGxcbiI7Ci0JCX0KLQl9CisgIENGWF9CeXRlU3RyaW5nIHRlbXA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7IGkrKykgeworICAgIGJ1ZiA8PCAocFBvaW50c1tpXS5tX1BvaW50WCkgPDwgIiAiIDw8IChwUG9pbnRzW2ldLm1fUG9pbnRZKTsKKyAgICBpbnQgcG9pbnRfdHlwZSA9IHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFOworICAgIGlmIChwb2ludF90eXBlID09IEZYUFRfTU9WRVRPKQorICAgICAgYnVmIDw8ICIgbVxuIjsKKyAgICBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfQkVaSUVSVE8pIHsKKyAgICAgIGJ1ZiA8PCAiICIgPDwgKHBQb2ludHNbaSArIDFdLm1fUG9pbnRYKSA8PCAiICIKKyAgICAgICAgICA8PCAocFBvaW50c1tpICsgMV0ubV9Qb2ludFkpIDw8ICIgIiA8PCAocFBvaW50c1tpICsgMl0ubV9Qb2ludFgpCisgICAgICAgICAgPDwgIiAiIDw8IChwUG9pbnRzW2kgKyAyXS5tX1BvaW50WSk7CisgICAgICBpZiAocFBvaW50c1tpICsgMl0ubV9GbGFnICYgRlhQVF9DTE9TRUZJR1VSRSkKKyAgICAgICAgYnVmIDw8ICIgYyBoXG4iOworICAgICAgZWxzZQorICAgICAgICBidWYgPDwgIiBjXG4iOworICAgICAgaSArPSAyOworICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0xJTkVUTykgeworICAgICAgaWYgKHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9DTE9TRUZJR1VSRSkKKyAgICAgICAgYnVmIDw8ICIgbCBoXG4iOworICAgICAgZWxzZQorICAgICAgICBidWYgPDwgIiBsXG4iOworICAgIH0KKyAgfQogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0luc2VydENsaXBQYXRoKEZQREZfUEFHRSBwYWdlLEZQREZfQ0xJUFBBVEggY2xpcFBhdGgpCi17Ci0JaWYoIXBhZ2UpCi0JCXJldHVybjsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7Ci0JaWYgKCFwUGFnZSkgcmV0dXJuOwotCUNQREZfRGljdGlvbmFyeSogcFBhZ2VEaWMgPSBwUGFnZS0+bV9wRm9ybURpY3Q7Ci0JQ1BERl9PYmplY3QqIHBDb250ZW50T2JqID0gcFBhZ2VEaWMgPyBwUGFnZURpYy0+R2V0RWxlbWVudCgiQ29udGVudHMiKSA6IE5VTEw7Ci0JaWYoIXBDb250ZW50T2JqKQotCQlwQ29udGVudE9iaiA9IHBQYWdlRGljID8gcFBhZ2VEaWMtPkdldEFycmF5KCJDb250ZW50cyIpIDogTlVMTDsKLQlpZighcENvbnRlbnRPYmopCi0JCXJldHVybjsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfSW5zZXJ0Q2xpcFBhdGgoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQ0xJUFBBVEggY2xpcFBhdGgpIHsKKyAgaWYgKCFwYWdlKQorICAgIHJldHVybjsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworICBpZiAoIXBQYWdlKQorICAgIHJldHVybjsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpYyA9IHBQYWdlLT5tX3BGb3JtRGljdDsKKyAgQ1BERl9PYmplY3QqIHBDb250ZW50T2JqID0gcFBhZ2VEaWMgPyBwUGFnZURpYy0+R2V0RWxlbWVudCgiQ29udGVudHMiKSA6IE5VTEw7CisgIGlmICghcENvbnRlbnRPYmopCisgICAgcENvbnRlbnRPYmogPSBwUGFnZURpYyA/IHBQYWdlRGljLT5HZXRBcnJheSgiQ29udGVudHMiKSA6IE5VTEw7CisgIGlmICghcENvbnRlbnRPYmopCisgICAgcmV0dXJuOwogCi0JQ0ZYX0J5dGVUZXh0QnVmIHN0ckNsaXA7Ci0JQ1BERl9DbGlwUGF0aCogcENsaXBQYXRoID0gKENQREZfQ2xpcFBhdGgqKWNsaXBQYXRoOwotCUZYX0RXT1JEIGk7Ci0JZm9yIChpID0gMDsgaSA8IHBDbGlwUGF0aC0+R2V0UGF0aENvdW50KCk7IGkgKyspIHsKLQkJQ1BERl9QYXRoIHBhdGggPSBwQ2xpcFBhdGgtPkdldFBhdGgoaSk7Ci0JCWludCBpQ2xpcFR5cGUgPSBwQ2xpcFBhdGgtPkdldENsaXBUeXBlKGkpOwotCQlpZiAocGF0aC5HZXRQb2ludENvdW50KCkgPT0gMCkgewotCQkJLy8gRW1wdHkgY2xpcHBpbmcgKHRvdGFsbHkgY2xpcHBlZCBvdXQpCi0JCQlzdHJDbGlwIDw8ICIwIDAgbSBXIG4gIjsKLQkJfSBlbHNlIHsKLQkJCU91dHB1dFBhdGgoc3RyQ2xpcCwgcGF0aCk7Ci0JCQlpZiAoaUNsaXBUeXBlID09IEZYRklMTF9XSU5ESU5HKQotCQkJCXN0ckNsaXAgPDwgIlcgblxuIjsKLQkJCWVsc2UKLQkJCQlzdHJDbGlwIDw8ICJXKiBuXG4iOwotCQl9Ci0JfQotCUNQREZfRGljdGlvbmFyeSogcERpYyA9IEZYX05FVyBDUERGX0RpY3Rpb25hcnk7Ci0JQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBGWF9ORVcgQ1BERl9TdHJlYW0oTlVMTCwwLCBwRGljKTsKLQlwU3RyZWFtLT5TZXREYXRhKHN0ckNsaXAuR2V0QnVmZmVyKCksIHN0ckNsaXAuR2V0U2l6ZSgpLCBGQUxTRSwgRkFMU0UpOwotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7Ci0JaWYoIXBEb2MpCi0JCXJldHVybjsKLQlwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHN0ckNsaXA7CisgIENQREZfQ2xpcFBhdGgqIHBDbGlwUGF0aCA9IChDUERGX0NsaXBQYXRoKiljbGlwUGF0aDsKKyAgRlhfRFdPUkQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHBDbGlwUGF0aC0+R2V0UGF0aENvdW50KCk7IGkrKykgeworICAgIENQREZfUGF0aCBwYXRoID0gcENsaXBQYXRoLT5HZXRQYXRoKGkpOworICAgIGludCBpQ2xpcFR5cGUgPSBwQ2xpcFBhdGgtPkdldENsaXBUeXBlKGkpOworICAgIGlmIChwYXRoLkdldFBvaW50Q291bnQoKSA9PSAwKSB7CisgICAgICAvLyBFbXB0eSBjbGlwcGluZyAodG90YWxseSBjbGlwcGVkIG91dCkKKyAgICAgIHN0ckNsaXAgPDwgIjAgMCBtIFcgbiAiOworICAgIH0gZWxzZSB7CisgICAgICBPdXRwdXRQYXRoKHN0ckNsaXAsIHBhdGgpOworICAgICAgaWYgKGlDbGlwVHlwZSA9PSBGWEZJTExfV0lORElORykKKyAgICAgICAgc3RyQ2xpcCA8PCAiVyBuXG4iOworICAgICAgZWxzZQorICAgICAgICBzdHJDbGlwIDw8ICJXKiBuXG4iOworICAgIH0KKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWMgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IEZYX05FVyBDUERGX1N0cmVhbShOVUxMLCAwLCBwRGljKTsKKyAgcFN0cmVhbS0+U2V0RGF0YShzdHJDbGlwLkdldEJ1ZmZlcigpLCBzdHJDbGlwLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBQYWdlLT5tX3BEb2N1bWVudDsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybjsKKyAgcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7CiAKLQlDUERGX0FycmF5KiBwQ29udGVudEFycmF5ID0gTlVMTDsKLQlpZiAocENvbnRlbnRPYmogJiYgcENvbnRlbnRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpCi0JewotCQlwQ29udGVudEFycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50T2JqOwotCQlDUERGX1JlZmVyZW5jZSogcFJlZiA9IEZYX05FVyBDUERGX1JlZmVyZW5jZShwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7Ci0JCXBDb250ZW50QXJyYXktPkluc2VydEF0KDAsIHBSZWYpOworICBDUERGX0FycmF5KiBwQ29udGVudEFycmF5ID0gTlVMTDsKKyAgaWYgKHBDb250ZW50T2JqICYmIHBDb250ZW50T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgcENvbnRlbnRBcnJheSA9IChDUERGX0FycmF5KilwQ29udGVudE9iajsKKyAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IEZYX05FVyBDUERGX1JlZmVyZW5jZShwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgICAgcENvbnRlbnRBcnJheS0+SW5zZXJ0QXQoMCwgcFJlZik7CiAKLQl9Ci0JZWxzZSBpZihwQ29udGVudE9iaiAmJiBwQ29udGVudE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpCi0JewotCQlDUERGX1JlZmVyZW5jZSogcFJlZmVyZW5jZSA9IChDUERGX1JlZmVyZW5jZSopcENvbnRlbnRPYmo7Ci0JCUNQREZfT2JqZWN0KiBwRGlyZWN0T2JqID0gcFJlZmVyZW5jZS0+R2V0RGlyZWN0KCk7Ci0JCWlmKHBEaXJlY3RPYmogIT0gTlVMTCkKLQkJewotCQkJaWYocERpcmVjdE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkKLQkJCXsKLQkJCQlwQ29udGVudEFycmF5ID0gKENQREZfQXJyYXkqKXBEaXJlY3RPYmo7Ci0JCQkJQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBGWF9ORVcgQ1BERl9SZWZlcmVuY2UocERvYywgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOwotCQkJCXBDb250ZW50QXJyYXktPkluc2VydEF0KDAsIHBSZWYpOworICB9IGVsc2UgaWYgKHBDb250ZW50T2JqICYmIHBDb250ZW50T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgeworICAgIENQREZfUmVmZXJlbmNlKiBwUmVmZXJlbmNlID0gKENQREZfUmVmZXJlbmNlKilwQ29udGVudE9iajsKKyAgICBDUERGX09iamVjdCogcERpcmVjdE9iaiA9IHBSZWZlcmVuY2UtPkdldERpcmVjdCgpOworICAgIGlmIChwRGlyZWN0T2JqICE9IE5VTEwpIHsKKyAgICAgIGlmIChwRGlyZWN0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7CisgICAgICAgIHBDb250ZW50QXJyYXkgPSAoQ1BERl9BcnJheSopcERpcmVjdE9iajsKKyAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPQorICAgICAgICAgICAgRlhfTkVXIENQREZfUmVmZXJlbmNlKHBEb2MsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKKyAgICAgICAgcENvbnRlbnRBcnJheS0+SW5zZXJ0QXQoMCwgcFJlZik7CiAKLQkJCX0KLQkJCWVsc2UgaWYocERpcmVjdE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pCi0JCQl7Ci0JCQkJcENvbnRlbnRBcnJheSA9IEZYX05FVyBDUERGX0FycmF5KCk7Ci0JCQkJcENvbnRlbnRBcnJheS0+QWRkUmVmZXJlbmNlKHBEb2MscFN0cmVhbS0+R2V0T2JqTnVtKCkpOwotCQkJCXBDb250ZW50QXJyYXktPkFkZFJlZmVyZW5jZShwRG9jLHBEaXJlY3RPYmotPkdldE9iak51bSgpKTsKLQkJCQlwUGFnZURpYy0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgcERvYywgcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocENvbnRlbnRBcnJheSkpOwotCQkJfQotCQl9Ci0JfQorICAgICAgfSBlbHNlIGlmIChwRGlyZWN0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgeworICAgICAgICBwQ29udGVudEFycmF5ID0gRlhfTkVXIENQREZfQXJyYXkoKTsKKyAgICAgICAgcENvbnRlbnRBcnJheS0+QWRkUmVmZXJlbmNlKHBEb2MsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKKyAgICAgICAgcENvbnRlbnRBcnJheS0+QWRkUmVmZXJlbmNlKHBEb2MsIHBEaXJlY3RPYmotPkdldE9iak51bSgpKTsKKyAgICAgICAgcFBhZ2VEaWMtPlNldEF0UmVmZXJlbmNlKCJDb250ZW50cyIsIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwQ29udGVudEFycmF5KSk7CisgICAgICB9CisgICAgfQorICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZkb2MuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmRvYy5jcHAKaW5kZXggNTEyODg0Ny4uNDY4OGU0OSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZmRvYy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmRvYy5jcHAKQEAgLTExLDI4OSArMTEsMjkzIEBACiAKIHN0YXRpYyBpbnQgVEhJU01PRFVMRSA9IDA7CiAKLXN0YXRpYyBDUERGX0Jvb2ttYXJrIEZpbmRCb29rbWFyayhjb25zdCBDUERGX0Jvb2ttYXJrVHJlZSYgdHJlZSwgQ1BERl9Cb29rbWFyayBib29rbWFyaywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHRpdGxlKQotewotICAgIGlmIChib29rbWFyayAmJiBib29rbWFyay5HZXRUaXRsZSgpLkNvbXBhcmVOb0Nhc2UodGl0bGUuY19zdHIoKSkgPT0gMCkgewotICAgICAgICAvLyBGaXJzdCBjaGVjayB0aGlzIGl0ZW0KLSAgICAgICAgcmV0dXJuIGJvb2ttYXJrOwotICAgIH0KLSAgICAvLyBnbyBpbnRvIGNoaWxkcmVuIGl0ZW1zCi0gICAgQ1BERl9Cb29rbWFyayBjaGlsZCA9IHRyZWUuR2V0Rmlyc3RDaGlsZChib29rbWFyayk7Ci0gICAgd2hpbGUgKGNoaWxkKSB7Ci0gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXRlbQotICAgICAgICBDUERGX0Jvb2ttYXJrIGZvdW5kID0gRmluZEJvb2ttYXJrKHRyZWUsIGNoaWxkLCB0aXRsZSk7Ci0gICAgICAgIGlmIChmb3VuZCkKLSAgICAgICAgICAgIHJldHVybiBmb3VuZDsKLSAgICAgICAgY2hpbGQgPSB0cmVlLkdldE5leHRTaWJsaW5nKGNoaWxkKTsKLSAgICB9Ci0gICAgcmV0dXJuIENQREZfQm9va21hcmsoKTsKK3N0YXRpYyBDUERGX0Jvb2ttYXJrIEZpbmRCb29rbWFyayhjb25zdCBDUERGX0Jvb2ttYXJrVHJlZSYgdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Jvb2ttYXJrIGJvb2ttYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0aXRsZSkgeworICBpZiAoYm9va21hcmsgJiYgYm9va21hcmsuR2V0VGl0bGUoKS5Db21wYXJlTm9DYXNlKHRpdGxlLmNfc3RyKCkpID09IDApIHsKKyAgICAvLyBGaXJzdCBjaGVjayB0aGlzIGl0ZW0KKyAgICByZXR1cm4gYm9va21hcms7CisgIH0KKyAgLy8gZ28gaW50byBjaGlsZHJlbiBpdGVtcworICBDUERGX0Jvb2ttYXJrIGNoaWxkID0gdHJlZS5HZXRGaXJzdENoaWxkKGJvb2ttYXJrKTsKKyAgd2hpbGUgKGNoaWxkKSB7CisgICAgLy8gY2hlY2sgaWYgdGhpcyBpdGVtCisgICAgQ1BERl9Cb29rbWFyayBmb3VuZCA9IEZpbmRCb29rbWFyayh0cmVlLCBjaGlsZCwgdGl0bGUpOworICAgIGlmIChmb3VuZCkKKyAgICAgIHJldHVybiBmb3VuZDsKKyAgICBjaGlsZCA9IHRyZWUuR2V0TmV4dFNpYmxpbmcoY2hpbGQpOworICB9CisgIHJldHVybiBDUERGX0Jvb2ttYXJrKCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0dldEZpcnN0Q2hpbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBwRGljdCkKLXsKLSAgICBpZiAoIWRvY3VtZW50IHx8ICFwRGljdCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKLSAgICBDUERGX0Jvb2ttYXJrVHJlZSB0cmVlKHBEb2MpOwotICAgIENQREZfQm9va21hcmsgYm9va21hcmsgPSBDUERGX0Jvb2ttYXJrKChDUERGX0RpY3Rpb25hcnkqKXBEaWN0KTsKLSAgICByZXR1cm4gdHJlZS5HZXRGaXJzdENoaWxkKGJvb2ttYXJrKS5HZXREaWN0KCk7CitETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMCitGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIHBEaWN0KSB7CisgIGlmICghZG9jdW1lbnQgfHwgIXBEaWN0KQorICAgIHJldHVybiBOVUxMOworICBDUERGX0RvY3VtZW50KiBwRG9jID0gKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpOworICBDUERGX0Jvb2ttYXJrVHJlZSB0cmVlKHBEb2MpOworICBDUERGX0Jvb2ttYXJrIGJvb2ttYXJrID0gQ1BERl9Cb29rbWFyaygoQ1BERl9EaWN0aW9uYXJ5KilwRGljdCk7CisgIHJldHVybiB0cmVlLkdldEZpcnN0Q2hpbGQoYm9va21hcmspLkdldERpY3QoKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0TmV4dFNpYmxpbmcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBwRGljdCkKLXsKLSAgICBpZiAoIWRvY3VtZW50IHx8ICFwRGljdCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKLSAgICBDUERGX0Jvb2ttYXJrVHJlZSB0cmVlKHBEb2MpOwotICAgIENQREZfQm9va21hcmsgYm9va21hcmsgPSBDUERGX0Jvb2ttYXJrKChDUERGX0RpY3Rpb25hcnkqKXBEaWN0KTsKLSAgICByZXR1cm4gdHJlZS5HZXROZXh0U2libGluZyhib29rbWFyaykuR2V0RGljdCgpOworRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTAorRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQk9PS01BUksgcERpY3QpIHsKKyAgaWYgKCFkb2N1bWVudCB8fCAhcERpY3QpCisgICAgcmV0dXJuIE5VTEw7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7CisgIENQREZfQm9va21hcmtUcmVlIHRyZWUocERvYyk7CisgIENQREZfQm9va21hcmsgYm9va21hcmsgPSBDUERGX0Jvb2ttYXJrKChDUERGX0RpY3Rpb25hcnkqKXBEaWN0KTsKKyAgcmV0dXJuIHRyZWUuR2V0TmV4dFNpYmxpbmcoYm9va21hcmspLkdldERpY3QoKTsKIH0KIAotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0VGl0bGUoRlBERl9CT09LTUFSSyBwRGljdCwgdm9pZCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1ZmxlbikKLXsKLSAgICBpZiAoIXBEaWN0KQotICAgICAgICByZXR1cm4gMDsKLSAgICBDUERGX0Jvb2ttYXJrIGJvb2ttYXJrKChDUERGX0RpY3Rpb25hcnkqKXBEaWN0KTsKLSAgICBDRlhfV2lkZVN0cmluZyB0aXRsZSA9IGJvb2ttYXJrLkdldFRpdGxlKCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RlZFRpdGxlID0gdGl0bGUuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICB1bnNpZ25lZCBsb25nIGxlbiA9IGVuY29kZWRUaXRsZS5HZXRMZW5ndGgoKTsKLSAgICBpZiAoYnVmZmVyICYmIGJ1ZmxlbiA+PSBsZW4pIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgZW5jb2RlZFRpdGxlLmNfc3RyKCksIGxlbik7Ci0gICAgfQotICAgIHJldHVybiBsZW47CitETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZCb29rbWFya19HZXRUaXRsZShGUERGX0JPT0tNQVJLIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pIHsKKyAgaWYgKCFwRGljdCkKKyAgICByZXR1cm4gMDsKKyAgQ1BERl9Cb29rbWFyayBib29rbWFyaygoQ1BERl9EaWN0aW9uYXJ5KilwRGljdCk7CisgIENGWF9XaWRlU3RyaW5nIHRpdGxlID0gYm9va21hcmsuR2V0VGl0bGUoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RlZFRpdGxlID0gdGl0bGUuVVRGMTZMRV9FbmNvZGUoKTsKKyAgdW5zaWduZWQgbG9uZyBsZW4gPSBlbmNvZGVkVGl0bGUuR2V0TGVuZ3RoKCk7CisgIGlmIChidWZmZXIgJiYgYnVmbGVuID49IGxlbikgeworICAgIEZYU1lTX21lbWNweShidWZmZXIsIGVuY29kZWRUaXRsZS5jX3N0cigpLCBsZW4pOworICB9CisgIHJldHVybiBsZW47CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0ZpbmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURFU1RSSU5HIHRpdGxlKQotewotICAgIGlmICghZG9jdW1lbnQpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICghdGl0bGUgfHwgdGl0bGVbMF0gPT0gMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKLSAgICBDUERGX0Jvb2ttYXJrVHJlZSB0cmVlKHBEb2MpOwotICAgIEZYX1NUUlNJWkUgbGVuID0gQ0ZYX1dpZGVTdHJpbmc6OldTdHJpbmdMZW5ndGgodGl0bGUpOwotICAgIENGWF9XaWRlU3RyaW5nIGVuY29kZWRUaXRsZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSh0aXRsZSwgbGVuKTsKLSAgICByZXR1cm4gRmluZEJvb2ttYXJrKHRyZWUsIENQREZfQm9va21hcmsoKSwgZW5jb2RlZFRpdGxlKS5HZXREaWN0KCk7CitETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMIEZQREZCb29rbWFya19GaW5kKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB0aXRsZSkgeworICBpZiAoIWRvY3VtZW50KQorICAgIHJldHVybiBOVUxMOworICBpZiAoIXRpdGxlIHx8IHRpdGxlWzBdID09IDApCisgICAgcmV0dXJuIE5VTEw7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7CisgIENQREZfQm9va21hcmtUcmVlIHRyZWUocERvYyk7CisgIEZYX1NUUlNJWkUgbGVuID0gQ0ZYX1dpZGVTdHJpbmc6OldTdHJpbmdMZW5ndGgodGl0bGUpOworICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkVGl0bGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUodGl0bGUsIGxlbik7CisgIHJldHVybiBGaW5kQm9va21hcmsodHJlZSwgQ1BERl9Cb29rbWFyaygpLCBlbmNvZGVkVGl0bGUpLkdldERpY3QoKTsKIH0KIAotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZCb29rbWFya19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQk9PS01BUksgcERpY3QpCi17Ci0gICAgaWYgKCFkb2N1bWVudCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFwRGljdCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgQ1BERl9Cb29rbWFyayBib29rbWFyaygoQ1BERl9EaWN0aW9uYXJ5KilwRGljdCk7Ci0gICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKLSAgICBDUERGX0Rlc3QgZGVzdCA9IGJvb2ttYXJrLkdldERlc3QocERvYyk7Ci0gICAgaWYgKGRlc3QpCi0gICAgICAgIHJldHVybiBkZXN0LkdldE9iamVjdCgpOwotICAgIC8vIElmIHRoaXMgYm9va21hcmsgaXMgbm90IGRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCBhIGRlc3QsIHdlIHRyeSB0byBnZXQgYWN0aW9uCi0gICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYm9va21hcmsuR2V0QWN0aW9uKCk7Ci0gICAgaWYgKCFhY3Rpb24pCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBhY3Rpb24uR2V0RGVzdChwRG9jKS5HZXRPYmplY3QoKTsKK0RMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PS01BUksgcERpY3QpIHsKKyAgaWYgKCFkb2N1bWVudCkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCFwRGljdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgQ1BERl9Cb29rbWFyayBib29rbWFyaygoQ1BERl9EaWN0aW9uYXJ5KilwRGljdCk7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7CisgIENQREZfRGVzdCBkZXN0ID0gYm9va21hcmsuR2V0RGVzdChwRG9jKTsKKyAgaWYgKGRlc3QpCisgICAgcmV0dXJuIGRlc3QuR2V0T2JqZWN0KCk7CisgIC8vIElmIHRoaXMgYm9va21hcmsgaXMgbm90IGRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCBhIGRlc3QsIHdlIHRyeSB0byBnZXQKKyAgLy8gYWN0aW9uCisgIENQREZfQWN0aW9uIGFjdGlvbiA9IGJvb2ttYXJrLkdldEFjdGlvbigpOworICBpZiAoIWFjdGlvbikKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGFjdGlvbi5HZXREZXN0KHBEb2MpLkdldE9iamVjdCgpOwogfQogCi1ETExFWFBPUlQgRlBERl9BQ1RJT04gU1REQ0FMTCBGUERGQm9va21hcmtfR2V0QWN0aW9uKEZQREZfQk9PS01BUksgcERpY3QpCi17Ci0gICAgaWYgKCFwRGljdCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgQ1BERl9Cb29rbWFyayBib29rbWFyaygoQ1BERl9EaWN0aW9uYXJ5KilwRGljdCk7Ci0gICAgcmV0dXJuIGJvb2ttYXJrLkdldEFjdGlvbigpLkdldERpY3QoKTsKK0RMTEVYUE9SVCBGUERGX0FDVElPTiBTVERDQUxMIEZQREZCb29rbWFya19HZXRBY3Rpb24oRlBERl9CT09LTUFSSyBwRGljdCkgeworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiBOVUxMOworICBDUERGX0Jvb2ttYXJrIGJvb2ttYXJrKChDUERGX0RpY3Rpb25hcnkqKXBEaWN0KTsKKyAgcmV0dXJuIGJvb2ttYXJrLkdldEFjdGlvbigpLkdldERpY3QoKTsKIH0KIAotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGQWN0aW9uX0dldFR5cGUoRlBERl9BQ1RJT04gcERpY3QpCi17Ci0gICAgaWYgKCFwRGljdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgQ1BERl9BY3Rpb24gYWN0aW9uKChDUERGX0RpY3Rpb25hcnkqKXBEaWN0KTsKLSAgICBDUERGX0FjdGlvbjo6QWN0aW9uVHlwZSB0eXBlID0gYWN0aW9uLkdldFR5cGUoKTsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBDUERGX0FjdGlvbjo6R29UbzoKLSAgICAgICAgICAgIHJldHVybiBQREZBQ1RJT05fR09UTzsKLSAgICAgICAgY2FzZSBDUERGX0FjdGlvbjo6R29Ub1I6Ci0gICAgICAgICAgICByZXR1cm4gUERGQUNUSU9OX1JFTU9URUdPVE87Ci0gICAgICAgIGNhc2UgQ1BERl9BY3Rpb246OlVSSToKLSAgICAgICAgICAgIHJldHVybiBQREZBQ1RJT05fVVJJOwotICAgICAgICBjYXNlIENQREZfQWN0aW9uOjpMYXVuY2g6Ci0gICAgICAgICAgICByZXR1cm4gUERGQUNUSU9OX0xBVU5DSDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBQREZBQ1RJT05fVU5TVVBQT1JURUQ7Ci0gICAgfQotICAgIHJldHVybiBQREZBQ1RJT05fVU5TVVBQT1JURUQ7CitETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZBY3Rpb25fR2V0VHlwZShGUERGX0FDVElPTiBwRGljdCkgeworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiAwOworICBDUERGX0FjdGlvbiBhY3Rpb24oKENQREZfRGljdGlvbmFyeSopcERpY3QpOworICBDUERGX0FjdGlvbjo6QWN0aW9uVHlwZSB0eXBlID0gYWN0aW9uLkdldFR5cGUoKTsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6R29UbzoKKyAgICAgIHJldHVybiBQREZBQ1RJT05fR09UTzsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpHb1RvUjoKKyAgICAgIHJldHVybiBQREZBQ1RJT05fUkVNT1RFR09UTzsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpVUkk6CisgICAgICByZXR1cm4gUERGQUNUSU9OX1VSSTsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpMYXVuY2g6CisgICAgICByZXR1cm4gUERGQUNUSU9OX0xBVU5DSDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFBERkFDVElPTl9VTlNVUFBPUlRFRDsKKyAgfQorICByZXR1cm4gUERGQUNUSU9OX1VOU1VQUE9SVEVEOwogfQogCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkFjdGlvbl9HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQUNUSU9OIHBEaWN0KQotewotICAgIGlmICghZG9jdW1lbnQpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICghcERpY3QpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7Ci0gICAgQ1BERl9BY3Rpb24gYWN0aW9uKChDUERGX0RpY3Rpb25hcnkqKXBEaWN0KTsKLSAgICByZXR1cm4gYWN0aW9uLkdldERlc3QocERvYykuR2V0T2JqZWN0KCk7CitETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkFjdGlvbl9HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQUNUSU9OIHBEaWN0KSB7CisgIGlmICghZG9jdW1lbnQpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghcERpY3QpCisgICAgcmV0dXJuIE5VTEw7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7CisgIENQREZfQWN0aW9uIGFjdGlvbigoQ1BERl9EaWN0aW9uYXJ5KilwRGljdCk7CisgIHJldHVybiBhY3Rpb24uR2V0RGVzdChwRG9jKS5HZXRPYmplY3QoKTsKIH0KIAotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGQWN0aW9uX0dldFVSSVBhdGgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9BQ1RJT04gcERpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1ZmxlbikKLXsKLSAgICBpZiAoIWRvY3VtZW50KQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoIXBEaWN0KQotICAgICAgICByZXR1cm4gMDsKLSAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpOwotICAgIENQREZfQWN0aW9uIGFjdGlvbigoQ1BERl9EaWN0aW9uYXJ5KilwRGljdCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgcGF0aCA9IGFjdGlvbi5HZXRVUkkocERvYyk7Ci0gICAgdW5zaWduZWQgbG9uZyBsZW4gPSBwYXRoLkdldExlbmd0aCgpICsgMTsKLSAgICBpZiAoYnVmZmVyICE9IE5VTEwgJiYgYnVmbGVuID49IGxlbikKLSAgICAgICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgcGF0aC5jX3N0cigpLCBsZW4pOwotICAgIHJldHVybiBsZW47CitETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZBY3Rpb25fR2V0VVJJUGF0aChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9BQ1RJT04gcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICBpZiAoIWRvY3VtZW50KQorICAgIHJldHVybiAwOworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiAwOworICBDUERGX0RvY3VtZW50KiBwRG9jID0gKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpOworICBDUERGX0FjdGlvbiBhY3Rpb24oKENQREZfRGljdGlvbmFyeSopcERpY3QpOworICBDRlhfQnl0ZVN0cmluZyBwYXRoID0gYWN0aW9uLkdldFVSSShwRG9jKTsKKyAgdW5zaWduZWQgbG9uZyBsZW4gPSBwYXRoLkdldExlbmd0aCgpICsgMTsKKyAgaWYgKGJ1ZmZlciAhPSBOVUxMICYmIGJ1ZmxlbiA+PSBsZW4pCisgICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgcGF0aC5jX3N0cigpLCBsZW4pOworICByZXR1cm4gbGVuOwogfQogCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZEZXN0X0dldFBhZ2VJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0RFU1QgcERpY3QpCi17Ci0gICAgaWYgKCFkb2N1bWVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCFwRGljdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKLSAgICBDUERGX0Rlc3QgZGVzdCgoQ1BERl9BcnJheSopcERpY3QpOwotICAgIHJldHVybiBkZXN0LkdldFBhZ2VJbmRleChwRG9jKTsKK0RMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkRlc3RfR2V0UGFnZUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RFU1QgcERpY3QpIHsKKyAgaWYgKCFkb2N1bWVudCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFwRGljdCkKKyAgICByZXR1cm4gMDsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKKyAgQ1BERl9EZXN0IGRlc3QoKENQREZfQXJyYXkqKXBEaWN0KTsKKyAgcmV0dXJuIGRlc3QuR2V0UGFnZUluZGV4KHBEb2MpOwogfQogCi1zdGF0aWMgdm9pZCBSZWxlYXNlTGlua0xpc3Qodm9pZCogZGF0YSkKLXsKLSAgICBkZWxldGUgKENQREZfTGlua0xpc3QqKWRhdGE7CitzdGF0aWMgdm9pZCBSZWxlYXNlTGlua0xpc3Qodm9pZCogZGF0YSkgeworICBkZWxldGUgKENQREZfTGlua0xpc3QqKWRhdGE7CiB9CiAKLURMTEVYUE9SVCBGUERGX0xJTksgU1REQ0FMTCBGUERGTGlua19HZXRMaW5rQXRQb2ludChGUERGX1BBR0UgcGFnZSwgZG91YmxlIHgsIGRvdWJsZSB5KQotewotICAgIGlmICghcGFnZSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwotICAgIGlmICghcFBhZ2UpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIC8vIExpbmsgbGlzdCBpcyBzdG9yZWQgd2l0aCB0aGUgZG9jdW1lbnQKLSAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gcFBhZ2UtPm1fcERvY3VtZW50OwotICAgIENQREZfTGlua0xpc3QqIHBMaW5rTGlzdCA9IChDUERGX0xpbmtMaXN0KilwRG9jLT5HZXRQcml2YXRlRGF0YSgmVEhJU01PRFVMRSk7Ci0gICAgaWYgKCFwTGlua0xpc3QpIHsKLSAgICAgICAgcExpbmtMaXN0ID0gRlhfTkVXIENQREZfTGlua0xpc3QocERvYyk7Ci0gICAgICAgIHBEb2MtPlNldFByaXZhdGVEYXRhKCZUSElTTU9EVUxFLCBwTGlua0xpc3QsIFJlbGVhc2VMaW5rTGlzdCk7Ci0gICAgfQotICAgIHJldHVybiBwTGlua0xpc3QtPkdldExpbmtBdFBvaW50KHBQYWdlLCAoRlhfRkxPQVQpeCwgKEZYX0ZMT0FUKXkpLkdldERpY3QoKTsKK0RMTEVYUE9SVCBGUERGX0xJTksgU1REQ0FMTCBGUERGTGlua19HZXRMaW5rQXRQb2ludChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeSkgeworICBpZiAoIXBhZ2UpCisgICAgcmV0dXJuIE5VTEw7CisgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgLy8gTGluayBsaXN0IGlzIHN0b3JlZCB3aXRoIHRoZSBkb2N1bWVudAorICBDUERGX0RvY3VtZW50KiBwRG9jID0gcFBhZ2UtPm1fcERvY3VtZW50OworICBDUERGX0xpbmtMaXN0KiBwTGlua0xpc3QgPSAoQ1BERl9MaW5rTGlzdCopcERvYy0+R2V0UHJpdmF0ZURhdGEoJlRISVNNT0RVTEUpOworICBpZiAoIXBMaW5rTGlzdCkgeworICAgIHBMaW5rTGlzdCA9IEZYX05FVyBDUERGX0xpbmtMaXN0KHBEb2MpOworICAgIHBEb2MtPlNldFByaXZhdGVEYXRhKCZUSElTTU9EVUxFLCBwTGlua0xpc3QsIFJlbGVhc2VMaW5rTGlzdCk7CisgIH0KKyAgcmV0dXJuIHBMaW5rTGlzdC0+R2V0TGlua0F0UG9pbnQocFBhZ2UsIChGWF9GTE9BVCl4LCAoRlhfRkxPQVQpeSkuR2V0RGljdCgpOwogfQogCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0xJTksgcERpY3QpCi17Ci0gICAgaWYgKCFkb2N1bWVudCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFwRGljdCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKLSAgICBDUERGX0xpbmsgbGluaygoQ1BERl9EaWN0aW9uYXJ5KilwRGljdCk7Ci0gICAgRlBERl9ERVNUIGRlc3QgPSBsaW5rLkdldERlc3QocERvYykuR2V0T2JqZWN0KCk7Ci0gICAgaWYgKGRlc3QpCi0gICAgICAgIHJldHVybiBkZXN0OwotICAgIC8vIElmIHRoaXMgbGluayBpcyBub3QgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIGEgZGVzdCwgd2UgdHJ5IHRvIGdldCBhY3Rpb24KLSAgICBDUERGX0FjdGlvbiBhY3Rpb24gPSBsaW5rLkdldEFjdGlvbigpOwotICAgIGlmICghYWN0aW9uKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gYWN0aW9uLkdldERlc3QocERvYykuR2V0T2JqZWN0KCk7CitETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9MSU5LIHBEaWN0KSB7CisgIGlmICghZG9jdW1lbnQpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghcERpY3QpCisgICAgcmV0dXJuIE5VTEw7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7CisgIENQREZfTGluayBsaW5rKChDUERGX0RpY3Rpb25hcnkqKXBEaWN0KTsKKyAgRlBERl9ERVNUIGRlc3QgPSBsaW5rLkdldERlc3QocERvYykuR2V0T2JqZWN0KCk7CisgIGlmIChkZXN0KQorICAgIHJldHVybiBkZXN0OworICAvLyBJZiB0aGlzIGxpbmsgaXMgbm90IGRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCBhIGRlc3QsIHdlIHRyeSB0byBnZXQgYWN0aW9uCisgIENQREZfQWN0aW9uIGFjdGlvbiA9IGxpbmsuR2V0QWN0aW9uKCk7CisgIGlmICghYWN0aW9uKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gYWN0aW9uLkdldERlc3QocERvYykuR2V0T2JqZWN0KCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0FDVElPTiBTVERDQUxMIEZQREZMaW5rX0dldEFjdGlvbihGUERGX0xJTksgcERpY3QpCi17Ci0gICAgaWYgKCFwRGljdCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgQ1BERl9MaW5rIGxpbmsoKENQREZfRGljdGlvbmFyeSopcERpY3QpOwotICAgIHJldHVybiBsaW5rLkdldEFjdGlvbigpLkdldERpY3QoKTsKK0RMTEVYUE9SVCBGUERGX0FDVElPTiBTVERDQUxMIEZQREZMaW5rX0dldEFjdGlvbihGUERGX0xJTksgcERpY3QpIHsKKyAgaWYgKCFwRGljdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgQ1BERl9MaW5rIGxpbmsoKENQREZfRGljdGlvbmFyeSopcERpY3QpOworICByZXR1cm4gbGluay5HZXRBY3Rpb24oKS5HZXREaWN0KCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19FbnVtZXJhdGUoRlBERl9QQUdFIHBhZ2UsIGludCogc3RhcnRQb3MsIEZQREZfTElOSyogbGlua0Fubm90KQotewotICAgIGlmKCFwYWdlIHx8ICFzdGFydFBvcyB8fCAhbGlua0Fubm90KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwotICAgIGlmKCFwUGFnZS0+bV9wRm9ybURpY3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBDUERGX0FycmF5KiBwQW5ub3RzID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7Ci0gICAgaWYoIXBBbm5vdHMpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBmb3IgKGludCBpID0gKnN0YXJ0UG9zOyBpIDwgKGludClwQW5ub3RzLT5HZXRDb3VudCgpOyBpKyspIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBBbm5vdHMtPkdldEVsZW1lbnRWYWx1ZShpKTsKLSAgICAgICAgaWYgKCFwRGljdCB8fCBwRGljdC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmKHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkuRXF1YWwoRlhfQlNUUkMoIkxpbmsiKSkpIHsKLSAgICAgICAgICAgICpzdGFydFBvcyA9IGkgKyAxOwotICAgICAgICAgICAgKmxpbmtBbm5vdCA9IChGUERGX0xJTkspcERpY3Q7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19FbnVtZXJhdGUoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTElOSyogbGlua0Fubm90KSB7CisgIGlmICghcGFnZSB8fCAhc3RhcnRQb3MgfHwgIWxpbmtBbm5vdCkKICAgICByZXR1cm4gRkFMU0U7CisgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKyAgaWYgKCFwUGFnZS0+bV9wRm9ybURpY3QpCisgICAgcmV0dXJuIEZBTFNFOworICBDUERGX0FycmF5KiBwQW5ub3RzID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7CisgIGlmICghcEFubm90cykKKyAgICByZXR1cm4gRkFMU0U7CisgIGZvciAoaW50IGkgPSAqc3RhcnRQb3M7IGkgPCAoaW50KXBBbm5vdHMtPkdldENvdW50KCk7IGkrKykgeworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwQW5ub3RzLT5HZXRFbGVtZW50VmFsdWUoaSk7CisgICAgaWYgKCFwRGljdCB8fCBwRGljdC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKQorICAgICAgY29udGludWU7CisgICAgaWYgKHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkuRXF1YWwoRlhfQlNUUkMoIkxpbmsiKSkpIHsKKyAgICAgICpzdGFydFBvcyA9IGkgKyAxOworICAgICAgKmxpbmtBbm5vdCA9IChGUERGX0xJTkspcERpY3Q7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0QW5ub3RSZWN0KEZQREZfTElOSyBsaW5rQW5ub3QsIEZTX1JFQ1RGKiByZWN0KQotewotICAgIGlmKCFsaW5rQW5ub3QgfHwgIXJlY3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilsaW5rQW5ub3Q7Ci0gICAgQ1BERl9SZWN0IHJ0ID0gcEFubm90RGljdC0+R2V0UmVjdChGWF9CU1RSQygiUmVjdCIpKTsKLSAgICByZWN0LT5sZWZ0ID0gcnQubGVmdDsKLSAgICByZWN0LT5ib3R0b20gPSBydC5ib3R0b207Ci0gICAgcmVjdC0+cmlnaHQgPSBydC5yaWdodDsKLSAgICByZWN0LT50b3AgPSBydC50b3A7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0QW5ub3RSZWN0KEZQREZfTElOSyBsaW5rQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1JFQ1RGKiByZWN0KSB7CisgIGlmICghbGlua0Fubm90IHx8ICFyZWN0KQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0ID0gKENQREZfRGljdGlvbmFyeSopbGlua0Fubm90OworICBDUERGX1JlY3QgcnQgPSBwQW5ub3REaWN0LT5HZXRSZWN0KEZYX0JTVFJDKCJSZWN0IikpOworICByZWN0LT5sZWZ0ID0gcnQubGVmdDsKKyAgcmVjdC0+Ym90dG9tID0gcnQuYm90dG9tOworICByZWN0LT5yaWdodCA9IHJ0LnJpZ2h0OworICByZWN0LT50b3AgPSBydC50b3A7CisgIHJldHVybiBUUlVFOworfQorCitETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfQ291bnRRdWFkUG9pbnRzKEZQREZfTElOSyBsaW5rQW5ub3QpIHsKKyAgaWYgKCFsaW5rQW5ub3QpCisgICAgcmV0dXJuIDA7CisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWxpbmtBbm5vdDsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcEFubm90RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlF1YWRQb2ludHMiKSk7CisgIGlmICghcEFycmF5KQorICAgIHJldHVybiAwOworICByZXR1cm4gcEFycmF5LT5HZXRDb3VudCgpIC8gODsKK30KKworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19RVUFEUE9JTlRTRiogcXVhZFBvaW50cykgeworICBpZiAoIWxpbmtBbm5vdCB8fCAhcXVhZFBvaW50cykKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWxpbmtBbm5vdDsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcEFubm90RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlF1YWRQb2ludHMiKSk7CisgIGlmIChwQXJyYXkpIHsKKyAgICBpZiAocXVhZEluZGV4IDwgMCB8fCBxdWFkSW5kZXggPj0gKGludClwQXJyYXktPkdldENvdW50KCkgLyA4IHx8CisgICAgICAgICgocXVhZEluZGV4ICogOCArIDcpID49IChpbnQpcEFycmF5LT5HZXRDb3VudCgpKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBxdWFkUG9pbnRzLT54MSA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCAqIDgpOworICAgIHF1YWRQb2ludHMtPnkxID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4ICogOCArIDEpOworICAgIHF1YWRQb2ludHMtPngyID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4ICogOCArIDIpOworICAgIHF1YWRQb2ludHMtPnkyID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4ICogOCArIDMpOworICAgIHF1YWRQb2ludHMtPngzID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4ICogOCArIDQpOworICAgIHF1YWRQb2ludHMtPnkzID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4ICogOCArIDUpOworICAgIHF1YWRQb2ludHMtPng0ID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4ICogOCArIDYpOworICAgIHF1YWRQb2ludHMtPnk0ID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4ICogOCArIDcpOwogICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90KQotewotICAgIGlmKCFsaW5rQW5ub3QpCi0gICAgICAgIHJldHVybiAwOwotICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWxpbmtBbm5vdDsKLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwQW5ub3REaWN0LT5HZXRBcnJheShGWF9CU1RSQygiUXVhZFBvaW50cyIpKTsKLSAgICBpZiAoIXBBcnJheSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHBBcnJheS0+R2V0Q291bnQoKSAvIDg7Ci19Ci0KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19HZXRRdWFkUG9pbnRzKEZQREZfTElOSyBsaW5rQW5ub3QsIGludCBxdWFkSW5kZXgsIEZTX1FVQURQT0lOVFNGKiBxdWFkUG9pbnRzKQotewotICAgIGlmKCFsaW5rQW5ub3QgfHwgIXF1YWRQb2ludHMpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilsaW5rQW5ub3Q7Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gcEFubm90RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlF1YWRQb2ludHMiKSk7Ci0gICAgaWYgKHBBcnJheSkgewotICAgICAgICBpZiAocXVhZEluZGV4IDwgMCB8fCBxdWFkSW5kZXggPj0gKGludClwQXJyYXktPkdldENvdW50KCkvOCB8fCAoKHF1YWRJbmRleCo4KzcpID49IChpbnQpcEFycmF5LT5HZXRDb3VudCgpKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgcXVhZFBvaW50cy0+eDEgPSBwQXJyYXktPkdldE51bWJlcihxdWFkSW5kZXgqOCk7Ci0gICAgICAgIHF1YWRQb2ludHMtPnkxID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrMSk7Ci0gICAgICAgIHF1YWRQb2ludHMtPngyID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrMik7Ci0gICAgICAgIHF1YWRQb2ludHMtPnkyID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrMyk7Ci0gICAgICAgIHF1YWRQb2ludHMtPngzID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrNCk7Ci0gICAgICAgIHF1YWRQb2ludHMtPnkzID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrNSk7Ci0gICAgICAgIHF1YWRQb2ludHMtPng0ID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrNik7Ci0gICAgICAgIHF1YWRQb2ludHMtPnk0ID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrNyk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRNZXRhVGV4dChGUERGX0RPQ1VNRU5UIGRvYywgRlBERl9CWVRFU1RSSU5HIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmbGVuKQotewotICAgIGlmICghZG9jIHx8ICF0YWcpCi0gICAgICAgIHJldHVybiAwOwotICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvYyktPkdldFBERkRvYygpOwotICAgIC8vIEdldCBpbmZvIGRpY3Rpb25hcnkKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBJbmZvID0gcERvYy0+R2V0SW5mbygpOwotICAgIGlmICghcEluZm8pCi0gICAgICAgIHJldHVybiAwOwotICAgIENGWF9XaWRlU3RyaW5nIHRleHQgPSBwSW5mby0+R2V0VW5pY29kZVRleHQodGFnKTsKLSAgICAvLyBVc2UgVVRGLTE2TEUgZW5jb2RpbmcKLSAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGVkVGV4dCA9IHRleHQuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICB1bnNpZ25lZCBsb25nIGxlbiA9IGVuY29kZWRUZXh0LkdldExlbmd0aCgpOwotICAgIGlmIChidWZmZXIgJiYgYnVmbGVuID49IGxlbikgewotICAgICAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCBlbmNvZGVkVGV4dC5jX3N0cigpLCBsZW4pOwotICAgIH0KLSAgICByZXR1cm4gbGVuOworRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldE1ldGFUZXh0KEZQREZfRE9DVU1FTlQgZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7CisgIGlmICghZG9jIHx8ICF0YWcpCisgICAgcmV0dXJuIDA7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvYyktPkdldFBERkRvYygpOworICAvLyBHZXQgaW5mbyBkaWN0aW9uYXJ5CisgIENQREZfRGljdGlvbmFyeSogcEluZm8gPSBwRG9jLT5HZXRJbmZvKCk7CisgIGlmICghcEluZm8pCisgICAgcmV0dXJuIDA7CisgIENGWF9XaWRlU3RyaW5nIHRleHQgPSBwSW5mby0+R2V0VW5pY29kZVRleHQodGFnKTsKKyAgLy8gVXNlIFVURi0xNkxFIGVuY29kaW5nCisgIENGWF9CeXRlU3RyaW5nIGVuY29kZWRUZXh0ID0gdGV4dC5VVEYxNkxFX0VuY29kZSgpOworICB1bnNpZ25lZCBsb25nIGxlbiA9IGVuY29kZWRUZXh0LkdldExlbmd0aCgpOworICBpZiAoYnVmZmVyICYmIGJ1ZmxlbiA+PSBsZW4pIHsKKyAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCBlbmNvZGVkVGV4dC5jX3N0cigpLCBsZW4pOworICB9CisgIHJldHVybiBsZW47CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmZG9jX2VtYmVkZGVydGVzdC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmZG9jX2VtYmVkZGVydGVzdC5jcHAKaW5kZXggMWYxMWJlZi4uOWM5ZmFjOCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZmRvY19lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZkb2NfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtNyw4ICs3LDcgQEAKICNpbmNsdWRlICIuLi8uLi90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAotY2xhc3MgRlBERkRvY0VtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3QgewotfTsKK2NsYXNzIEZQREZEb2NFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHt9OwogCiBURVNUX0YoRlBERkRvY0VtYmVkZGVydGVzdCwgRGVzdEdldFBhZ2VJbmRleCkgewogICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRlc3RpbmcvcmVzb3VyY2VzL25hbWVkX2Rlc3RzLnBkZiIpKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0aW1nLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0aW1nLmNwcAppbmRleCBhNjk1MWQyLi5iZmQ5YWRlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZWRpdGltZy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRpbWcuY3BwCkBAIC05LDcwICs5LDc3IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIgogCi1ETExFWFBPUlQgRlBERl9QQUdFT0JKRUNUIFNURENBTEwgRlBERlBhZ2VPYmpfTmV3SW1nZU9iaihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotewotCWlmICghZG9jdW1lbnQpCi0JCXJldHVybiBOVUxMOwotCUNQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiA9IEZYX05FVyBDUERGX0ltYWdlT2JqZWN0OwotCUNQREZfSW1hZ2UqIHBJbWcgPSBGWF9ORVcgQ1BERl9JbWFnZSgoKENQREZYRkFfRG9jdW1lbnQgKilkb2N1bWVudCktPkdldFBERkRvYygpKTsKLQlwSW1hZ2VPYmotPm1fcEltYWdlID0gcEltZzsKLQlyZXR1cm4gcEltYWdlT2JqOworRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMCitGUERGUGFnZU9ial9OZXdJbWdlT2JqKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgaWYgKCFkb2N1bWVudCkKKyAgICByZXR1cm4gTlVMTDsKKyAgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqID0gRlhfTkVXIENQREZfSW1hZ2VPYmplY3Q7CisgIENQREZfSW1hZ2UqIHBJbWcgPQorICAgICAgRlhfTkVXIENQREZfSW1hZ2UoKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpKTsKKyAgcEltYWdlT2JqLT5tX3BJbWFnZSA9IHBJbWc7CisgIHJldHVybiBwSW1hZ2VPYmo7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfTG9hZEpwZWdGaWxlKEZQREZfUEFHRSogcGFnZXMsIGludCBuQ291bnQsRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwgRlBERl9GSUxFQUNDRVNTKiBmaWxlQWNjZXNzKQotewotCWlmICghaW1hZ2Vfb2JqZWN0IHx8ICFmaWxlQWNjZXNzIHx8ICFwYWdlcykKLQkJcmV0dXJuIEZBTFNFOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGSW1hZ2VPYmpfTG9hZEpwZWdGaWxlKEZQREZfUEFHRSogcGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRUFDQ0VTUyogZmlsZUFjY2VzcykgeworICBpZiAoIWltYWdlX29iamVjdCB8fCAhZmlsZUFjY2VzcyB8fCAhcGFnZXMpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JSUZYX0ZpbGVSZWFkKiBwRmlsZSA9IEZYX05FVyBDUERGX0N1c3RvbUFjY2VzcyhmaWxlQWNjZXNzKTsKKyAgSUZYX0ZpbGVSZWFkKiBwRmlsZSA9IEZYX05FVyBDUERGX0N1c3RvbUFjY2VzcyhmaWxlQWNjZXNzKTsKIAotCUNQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopaW1hZ2Vfb2JqZWN0OwotCXBJbWdPYmotPm1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpOwotCWZvciAoaW50IGluZGV4PTA7aW5kZXg8bkNvdW50O2luZGV4KyspCi0JewotCQlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2VzW2luZGV4XSktPkdldFBERlBhZ2UoKTsKLQkJaWYgKCFwUGFnZSkKLQkJCWNvbnRpbnVlOwotCQlwSW1nT2JqLT5tX3BJbWFnZS0+UmVzZXRDYWNoZShwUGFnZSxOVUxMKTsKLQl9Ci0JcEltZ09iai0+bV9wSW1hZ2UtPlNldEpwZWdJbWFnZShwRmlsZSk7CisgIENQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopaW1hZ2Vfb2JqZWN0OworICBwSW1nT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRNb2RpZnkoKTsKKyAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5Db3VudDsgaW5kZXgrKykgeworICAgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZXNbaW5kZXhdKS0+R2V0UERGUGFnZSgpOworICAgIGlmICghcFBhZ2UpCisgICAgICBjb250aW51ZTsKKyAgICBwSW1nT2JqLT5tX3BJbWFnZS0+UmVzZXRDYWNoZShwUGFnZSwgTlVMTCk7CisgIH0KKyAgcEltZ09iai0+bV9wSW1hZ2UtPlNldEpwZWdJbWFnZShwRmlsZSk7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLQotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9TZXRNYXRyaXgJKEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCi0JCQkJCQkJCQkJCQkgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsIGRvdWJsZSBlLCBkb3VibGUgZikKLXsKLQlpZiAoIWltYWdlX29iamVjdCkKLQkJcmV0dXJuIEZBTFNFOwotCUNQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopaW1hZ2Vfb2JqZWN0OwotCXBJbWdPYmotPm1fTWF0cml4LmEgPSAoRlhfRkxPQVQpYTsKLQlwSW1nT2JqLT5tX01hdHJpeC5iID0gKEZYX0ZMT0FUKWI7Ci0JcEltZ09iai0+bV9NYXRyaXguYyA9IChGWF9GTE9BVCljOwotCXBJbWdPYmotPm1fTWF0cml4LmQgPSAoRlhfRkxPQVQpZDsKLQlwSW1nT2JqLT5tX01hdHJpeC5lID0gKEZYX0ZMT0FUKWU7Ci0JcEltZ09iai0+bV9NYXRyaXguZiA9IChGWF9GTE9BVClmOwotCXBJbWdPYmotPkNhbGNCb3VuZGluZ0JveCgpOwotCXJldHVybiAgVFJVRTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfU2V0TWF0cml4KEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYpIHsKKyAgaWYgKCFpbWFnZV9vYmplY3QpCisgICAgcmV0dXJuIEZBTFNFOworICBDUERGX0ltYWdlT2JqZWN0KiBwSW1nT2JqID0gKENQREZfSW1hZ2VPYmplY3QqKWltYWdlX29iamVjdDsKKyAgcEltZ09iai0+bV9NYXRyaXguYSA9IChGWF9GTE9BVClhOworICBwSW1nT2JqLT5tX01hdHJpeC5iID0gKEZYX0ZMT0FUKWI7CisgIHBJbWdPYmotPm1fTWF0cml4LmMgPSAoRlhfRkxPQVQpYzsKKyAgcEltZ09iai0+bV9NYXRyaXguZCA9IChGWF9GTE9BVClkOworICBwSW1nT2JqLT5tX01hdHJpeC5lID0gKEZYX0ZMT0FUKWU7CisgIHBJbWdPYmotPm1fTWF0cml4LmYgPSAoRlhfRkxPQVQpZjsKKyAgcEltZ09iai0+Q2FsY0JvdW5kaW5nQm94KCk7CisgIHJldHVybiBUUlVFOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX1NldEJpdG1hcChGUERGX1BBR0UqIHBhZ2VzLGludCBuQ291bnQsRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCxGUERGX0JJVE1BUCBiaXRtYXApCi17Ci0JaWYgKCFpbWFnZV9vYmplY3QgfHwgIWJpdG1hcCB8fCAhcGFnZXMpCi0JCXJldHVybiBGQUxTRTsKLQlDRlhfRElCaXRtYXAqIHBCbXAgPSBOVUxMOwotCXBCbXAgPSAoQ0ZYX0RJQml0bWFwKiliaXRtYXA7Ci0JQ1BERl9JbWFnZU9iamVjdCogcEltZ09iaiA9IChDUERGX0ltYWdlT2JqZWN0KilpbWFnZV9vYmplY3Q7Ci0JcEltZ09iai0+bV9HZW5lcmFsU3RhdGUuR2V0TW9kaWZ5KCk7Ci0JZm9yIChpbnQgaW5kZXg9MDtpbmRleDxuQ291bnQ7aW5kZXgrKykKLQl7Ci0JCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZXNbaW5kZXhdKS0+R2V0UERGUGFnZSgpOwotCQlpZiAoIXBQYWdlKSBjb250aW51ZTsKLQkJcEltZ09iai0+bV9wSW1hZ2UtPlJlc2V0Q2FjaGUocFBhZ2UsTlVMTCk7Ci0JfQotCXBJbWdPYmotPm1fcEltYWdlLT5TZXRJbWFnZShwQm1wLEZBTFNFKTsKLQlwSW1nT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKLQlyZXR1cm4gVFJVRTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfU2V0Qml0bWFwKEZQREZfUEFHRSogcGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQklUTUFQIGJpdG1hcCkgeworICBpZiAoIWltYWdlX29iamVjdCB8fCAhYml0bWFwIHx8ICFwYWdlcykKKyAgICByZXR1cm4gRkFMU0U7CisgIENGWF9ESUJpdG1hcCogcEJtcCA9IE5VTEw7CisgIHBCbXAgPSAoQ0ZYX0RJQml0bWFwKiliaXRtYXA7CisgIENQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopaW1hZ2Vfb2JqZWN0OworICBwSW1nT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRNb2RpZnkoKTsKKyAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5Db3VudDsgaW5kZXgrKykgeworICAgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZXNbaW5kZXhdKS0+R2V0UERGUGFnZSgpOworICAgIGlmICghcFBhZ2UpCisgICAgICBjb250aW51ZTsKKyAgICBwSW1nT2JqLT5tX3BJbWFnZS0+UmVzZXRDYWNoZShwUGFnZSwgTlVMTCk7CisgIH0KKyAgcEltZ09iai0+bV9wSW1hZ2UtPlNldEltYWdlKHBCbXAsIEZBTFNFKTsKKyAgcEltZ09iai0+Q2FsY0JvdW5kaW5nQm94KCk7CisgIHJldHVybiBUUlVFOwogfQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmZWRpdHBhZ2UuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRwYWdlLmNwcAppbmRleCBkMTA2OGFlLi5hODQ0N2NlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZWRpdHBhZ2UuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0cGFnZS5jcHAKQEAgLTE3LDMyMyArMTcsMzMzIEBACiAjaW5jbHVkZSA8Y3RpbWU+CiAjZW5kaWYKIAotRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCkKLXsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gRlhfTkVXIENQREZfRG9jdW1lbnQ7Ci0JaWYgKCFwRG9jKQotCQlyZXR1cm4gTlVMTDsKLQlwRG9jLT5DcmVhdGVOZXdEb2MoKTsKLQl0aW1lX3QgY3VycmVudFRpbWU7CitETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKSB7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBGWF9ORVcgQ1BERl9Eb2N1bWVudDsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBOVUxMOworICBwRG9jLT5DcmVhdGVOZXdEb2MoKTsKKyAgdGltZV90IGN1cnJlbnRUaW1lOwogCi0JQ0ZYX0J5dGVTdHJpbmcgRGF0ZVN0cjsKKyAgQ0ZYX0J5dGVTdHJpbmcgRGF0ZVN0cjsKIAotCWlmKEZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQotCXsKLQkJaWYgKCAtMSAhPSB0aW1lKCAmY3VycmVudFRpbWUgKSApCi0JCXsKLQkJCXRtICogcFRNID0gbG9jYWx0aW1lKCAmY3VycmVudFRpbWUgKTsKLQkJCWlmICggcFRNICkKLQkJCXsKLQkJCQlEYXRlU3RyLkZvcm1hdCgJIkQ6JTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwgcFRNLT50bV95ZWFyKzE5MDAsIHBUTS0+dG1fbW9uKzEsCi0JCQkJCXBUTS0+dG1fbWRheSwgcFRNLT50bV9ob3VyLCBwVE0tPnRtX21pbiwgcFRNLT50bV9zZWMgKTsKLQkJCX0KLQkJfQotCX0KKyAgaWYgKEZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKSB7CisgICAgaWYgKC0xICE9IHRpbWUoJmN1cnJlbnRUaW1lKSkgeworICAgICAgdG0qIHBUTSA9IGxvY2FsdGltZSgmY3VycmVudFRpbWUpOworICAgICAgaWYgKHBUTSkgeworICAgICAgICBEYXRlU3RyLkZvcm1hdCgiRDolMDRkJTAyZCUwMmQlMDJkJTAyZCUwMmQiLCBwVE0tPnRtX3llYXIgKyAxOTAwLAorICAgICAgICAgICAgICAgICAgICAgICBwVE0tPnRtX21vbiArIDEsIHBUTS0+dG1fbWRheSwgcFRNLT50bV9ob3VyLCBwVE0tPnRtX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgcFRNLT50bV9zZWMpOworICAgICAgfQorICAgIH0KKyAgfQogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwSW5mb0RpY3QgPSBOVUxMOwotCXBJbmZvRGljdCA9IHBEb2MtPkdldEluZm8oKTsKLQlpZiAocEluZm9EaWN0KQotCXsKLQkJaWYoRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUykpCi0JCQlwSW5mb0RpY3QtPlNldEF0KCJDcmVhdGlvbkRhdGUiLCBuZXcgQ1BERl9TdHJpbmcoRGF0ZVN0cikpOwotCQlwSW5mb0RpY3QtPlNldEF0KCJDcmVhdG9yIixGWF9ORVcgQ1BERl9TdHJpbmcoTCJQREZpdW0iKSk7Ci0JfQorICBDUERGX0RpY3Rpb25hcnkqIHBJbmZvRGljdCA9IE5VTEw7CisgIHBJbmZvRGljdCA9IHBEb2MtPkdldEluZm8oKTsKKyAgaWYgKHBJbmZvRGljdCkgeworICAgIGlmIChGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTKSkKKyAgICAgIHBJbmZvRGljdC0+U2V0QXQoIkNyZWF0aW9uRGF0ZSIsIG5ldyBDUERGX1N0cmluZyhEYXRlU3RyKSk7CisgICAgcEluZm9EaWN0LT5TZXRBdCgiQ3JlYXRvciIsIEZYX05FVyBDUERGX1N0cmluZyhMIlBERml1bSIpKTsKKyAgfQogCi0JQ1BERlhGQV9BcHAqIHBBcHAgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKTsKLQlDUERGWEZBX0RvY3VtZW50KiBkb2N1bWVudCA9IEZYX05FVyBDUERGWEZBX0RvY3VtZW50KHBEb2MsIHBBcHApOwotCXJldHVybiBkb2N1bWVudDsKKyAgQ1BERlhGQV9BcHAqIHBBcHAgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogZG9jdW1lbnQgPSBGWF9ORVcgQ1BERlhGQV9Eb2N1bWVudChwRG9jLCBwQXBwKTsKKyAgcmV0dXJuIGRvY3VtZW50OwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0RlbGV0ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgcGFnZV9pbmRleCkKLXsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpOwotCWlmIChwRG9jID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAocGFnZV9pbmRleCA8IDAgfHwgcGFnZV9pbmRleCA+PSBwRG9jLT5HZXRQYWdlQ291bnQoKSkKLQkJcmV0dXJuOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9EZWxldGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IHBhZ2VfaW5kZXgpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKKyAgaWYgKHBEb2MgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIGlmIChwYWdlX2luZGV4IDwgMCB8fCBwYWdlX2luZGV4ID49IHBEb2MtPkdldFBhZ2VDb3VudCgpKQorICAgIHJldHVybjsKIAotCXBEb2MtPkRlbGV0ZVBhZ2UocGFnZV9pbmRleCk7CisgIHBEb2MtPkRlbGV0ZVBhZ2UocGFnZV9pbmRleCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX1BBR0UgU1REQ0FMTCBGUERGUGFnZV9OZXcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IHBhZ2VfaW5kZXgsIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCkKLXsKLQlpZiAoIWRvY3VtZW50KQotCQlyZXR1cm4gTlVMTDsKK0RMTEVYUE9SVCBGUERGX1BBR0UgU1REQ0FMTCBGUERGUGFnZV9OZXcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGhlaWdodCkgeworICBpZiAoIWRvY3VtZW50KQorICAgIHJldHVybiBOVUxMOwogCi0vLwlDUERGX1BhcnNlciogcFBhcnNlciA9IChDUERGX1BhcnNlciopZG9jdW1lbnQ7Ci0JQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKLQlpZihwYWdlX2luZGV4IDwgMCkKLQkJcGFnZV9pbmRleCA9IDA7Ci0JaWYocERvYy0+R2V0UGFnZUNvdW50KCk8cGFnZV9pbmRleCkKLQkJcGFnZV9pbmRleCA9IHBEb2MtPkdldFBhZ2VDb3VudCgpOwotLy8JaWYgKHBhZ2VfaW5kZXggPCAwIHx8IHBhZ2VfaW5kZXggPj0gcERvYy0+R2V0UGFnZUNvdW50KCkpCi0vLwkJcmV0dXJuIE5VTEw7CisgIC8vCUNQREZfUGFyc2VyKiBwUGFyc2VyID0gKENQREZfUGFyc2VyKilkb2N1bWVudDsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKKyAgaWYgKHBhZ2VfaW5kZXggPCAwKQorICAgIHBhZ2VfaW5kZXggPSAwOworICBpZiAocERvYy0+R2V0UGFnZUNvdW50KCkgPCBwYWdlX2luZGV4KQorICAgIHBhZ2VfaW5kZXggPSBwRG9jLT5HZXRQYWdlQ291bnQoKTsKKyAgLy8JaWYgKHBhZ2VfaW5kZXggPCAwIHx8IHBhZ2VfaW5kZXggPj0gcERvYy0+R2V0UGFnZUNvdW50KCkpCisgIC8vCQlyZXR1cm4gTlVMTDsKIAotCUNQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvYy0+Q3JlYXRlTmV3UGFnZShwYWdlX2luZGV4KTsKLQlpZighcFBhZ2VEaWN0KQotCQlyZXR1cm4gTlVMTDsKLQlDUERGX0FycmF5KiBwTWVkaWFCb3hBcnJheSA9IEZYX05FVyBDUERGX0FycmF5OwotCXBNZWRpYUJveEFycmF5LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKDApKTsKLQlwTWVkaWFCb3hBcnJheS0+QWRkKEZYX05FVyBDUERGX051bWJlcigwKSk7Ci0JcE1lZGlhQm94QXJyYXktPkFkZChGWF9ORVcgQ1BERl9OdW1iZXIoRlhfRkxPQVQod2lkdGgpKSk7Ci0JcE1lZGlhQm94QXJyYXktPkFkZChGWF9ORVcgQ1BERl9OdW1iZXIoRlhfRkxPQVQoaGVpZ2h0KSkpOworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBEb2MtPkNyZWF0ZU5ld1BhZ2UocGFnZV9pbmRleCk7CisgIGlmICghcFBhZ2VEaWN0KQorICAgIHJldHVybiBOVUxMOworICBDUERGX0FycmF5KiBwTWVkaWFCb3hBcnJheSA9IEZYX05FVyBDUERGX0FycmF5OworICBwTWVkaWFCb3hBcnJheS0+QWRkKEZYX05FVyBDUERGX051bWJlcigwKSk7CisgIHBNZWRpYUJveEFycmF5LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKDApKTsKKyAgcE1lZGlhQm94QXJyYXktPkFkZChGWF9ORVcgQ1BERl9OdW1iZXIoRlhfRkxPQVQod2lkdGgpKSk7CisgIHBNZWRpYUJveEFycmF5LT5BZGQoRlhfTkVXIENQREZfTnVtYmVyKEZYX0ZMT0FUKGhlaWdodCkpKTsKIAotCXBQYWdlRGljdC0+U2V0QXQoIk1lZGlhQm94IiwgcE1lZGlhQm94QXJyYXkpOwotCXBQYWdlRGljdC0+U2V0QXQoIlJvdGF0ZSIsIEZYX05FVyBDUERGX051bWJlcigwKSk7Ci0JcFBhZ2VEaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgRlhfTkVXIENQREZfRGljdGlvbmFyeSk7CisgIHBQYWdlRGljdC0+U2V0QXQoIk1lZGlhQm94IiwgcE1lZGlhQm94QXJyYXkpOworICBwUGFnZURpY3QtPlNldEF0KCJSb3RhdGUiLCBGWF9ORVcgQ1BERl9OdW1iZXIoMCkpOworICBwUGFnZURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5KTsKIAotLy8gCUNQREZfUGFnZSogcFBhZ2UgPSBGWF9ORVcgQ1BERl9QYWdlOwotLy8gCXBQYWdlLT5Mb2FkKHBEb2MscFBhZ2VEaWN0KTsKLS8vIAlwUGFnZS0+UGFyc2VDb250ZW50KCk7CisgIC8vIAlDUERGX1BhZ2UqIHBQYWdlID0gRlhfTkVXIENQREZfUGFnZTsKKyAgLy8gCXBQYWdlLT5Mb2FkKHBEb2MscFBhZ2VEaWN0KTsKKyAgLy8gCXBQYWdlLT5QYXJzZUNvbnRlbnQoKTsKIAotCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBGWF9ORVcgQ1BERlhGQV9QYWdlKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCwgcGFnZV9pbmRleCk7Ci0JcFBhZ2UtPkxvYWRQREZQYWdlKHBQYWdlRGljdCk7CisgIENQREZYRkFfUGFnZSogcFBhZ2UgPQorICAgICAgRlhfTkVXIENQREZYRkFfUGFnZSgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQsIHBhZ2VfaW5kZXgpOworICBwUGFnZS0+TG9hZFBERlBhZ2UocFBhZ2VEaWN0KTsKIAotCXJldHVybiBwUGFnZTsKKyAgcmV0dXJuIHBQYWdlOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfR2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UpCi17Ci0JQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwotCWlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCkKLQkJfHwgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKCJQYWdlIikpCi0JewotCQlyZXR1cm4gLTE7Ci0JfQotCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfR2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworICBpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fAorICAgICAgIXBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKSB8fAorICAgICAgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKAorICAgICAgICAgICJQYWdlIikpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKIAotCWludCByb3RhdGUgPSAwOwotCWlmKHBEaWN0ICE9IE5VTEwpCi0JewotCQlpZiAocERpY3QtPktleUV4aXN0KCJSb3RhdGUiKSkKLQkJCXJvdGF0ZSA9IHBEaWN0LT5HZXRFbGVtZW50KCJSb3RhdGUiKS0+R2V0RGlyZWN0KCk/IHBEaWN0LT5HZXRFbGVtZW50KCJSb3RhdGUiKS0+R2V0RGlyZWN0KCktPkdldEludGVnZXIoKSAvIDkwIDogMDsKLQkJZWxzZQotCQl7Ci0JCQlpZihwRGljdC0+S2V5RXhpc3QoIlBhcmVudCIpKQotCQkJewotCQkJCUNQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gKENQREZfRGljdGlvbmFyeSopcERpY3QtPkdldEVsZW1lbnQoIlBhcmVudCIpLT5HZXREaXJlY3QoKTsKLQkJCQl3aGlsZShwUGFnZXMpCi0JCQkJewotCQkJCQlpZihwUGFnZXMtPktleUV4aXN0KCJSb3RhdGUiKSkKLQkJCQkJewotCQkJCQkJcm90YXRlID0gcFBhZ2VzLT5HZXRFbGVtZW50KCJSb3RhdGUiKS0+R2V0RGlyZWN0KCk/IHBQYWdlcy0+R2V0RWxlbWVudCgiUm90YXRlIiktPkdldERpcmVjdCgpLT5HZXRJbnRlZ2VyKCkgLyA5MCA6IDA7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQllbHNlIGlmKHBQYWdlcy0+S2V5RXhpc3QoIlBhcmVudCIpKQotCQkJCQkJcFBhZ2VzID0gKENQREZfRGljdGlvbmFyeSopcFBhZ2VzLT5HZXRFbGVtZW50KCJQYXJlbnQiKS0+R2V0RGlyZWN0KCk7Ci0JCQkJCWVsc2UgYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiAtMTsKLQl9CisgIGludCByb3RhdGUgPSAwOworICBpZiAocERpY3QgIT0gTlVMTCkgeworICAgIGlmIChwRGljdC0+S2V5RXhpc3QoIlJvdGF0ZSIpKQorICAgICAgcm90YXRlID0gcERpY3QtPkdldEVsZW1lbnQoIlJvdGF0ZSIpLT5HZXREaXJlY3QoKQorICAgICAgICAgICAgICAgICAgID8gcERpY3QtPkdldEVsZW1lbnQoIlJvdGF0ZSIpLT5HZXREaXJlY3QoKS0+R2V0SW50ZWdlcigpIC8gOTAKKyAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgZWxzZSB7CisgICAgICBpZiAocERpY3QtPktleUV4aXN0KCJQYXJlbnQiKSkgeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlcyA9CisgICAgICAgICAgICAoQ1BERl9EaWN0aW9uYXJ5KilwRGljdC0+R2V0RWxlbWVudCgiUGFyZW50IiktPkdldERpcmVjdCgpOworICAgICAgICB3aGlsZSAocFBhZ2VzKSB7CisgICAgICAgICAgaWYgKHBQYWdlcy0+S2V5RXhpc3QoIlJvdGF0ZSIpKSB7CisgICAgICAgICAgICByb3RhdGUgPQorICAgICAgICAgICAgICAgIHBQYWdlcy0+R2V0RWxlbWVudCgiUm90YXRlIiktPkdldERpcmVjdCgpCisgICAgICAgICAgICAgICAgICAgID8gcFBhZ2VzLT5HZXRFbGVtZW50KCJSb3RhdGUiKS0+R2V0RGlyZWN0KCktPkdldEludGVnZXIoKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgIDkwCisgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSBpZiAocFBhZ2VzLT5LZXlFeGlzdCgiUGFyZW50IikpCisgICAgICAgICAgICBwUGFnZXMgPQorICAgICAgICAgICAgICAgIChDUERGX0RpY3Rpb25hcnkqKXBQYWdlcy0+R2V0RWxlbWVudCgiUGFyZW50IiktPkdldERpcmVjdCgpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQogCi0JcmV0dXJuIHJvdGF0ZTsKKyAgcmV0dXJuIHJvdGF0ZTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9JbnNlcnRPYmplY3QoRlBERl9QQUdFIHBhZ2UsIEZQREZfUEFHRU9CSkVDVCBwYWdlX29iaikKLXsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7Ci0JaWYgKCFwUGFnZSB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0IHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPktleUV4aXN0KCJUeXBlIikgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKQotCQl8fCBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCktPkdldFN0cmluZygpLkNvbXBhcmUoIlBhZ2UiKSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0JQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IChDUERGX1BhZ2VPYmplY3QqKXBhZ2Vfb2JqOwotCWlmKHBQYWdlT2JqID09IE5VTEwpCi0JCXJldHVybjsKLQlGWF9QT1NJVElPTiBMYXN0UGVyc2l0aW9uID0gcFBhZ2UtPkdldExhc3RPYmplY3RQb3NpdGlvbigpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9JbnNlcnRPYmplY3QoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmopIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworICBpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fAorICAgICAgIXBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKSB8fAorICAgICAgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKAorICAgICAgICAgICJQYWdlIikpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IChDUERGX1BhZ2VPYmplY3QqKXBhZ2Vfb2JqOworICBpZiAocFBhZ2VPYmogPT0gTlVMTCkKKyAgICByZXR1cm47CisgIEZYX1BPU0lUSU9OIExhc3RQZXJzaXRpb24gPSBwUGFnZS0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCk7CiAKLQlwUGFnZS0+SW5zZXJ0T2JqZWN0KExhc3RQZXJzaXRpb24sIHBQYWdlT2JqKTsKLQlzd2l0Y2gocFBhZ2VPYmotPm1fVHlwZSkKLQl7Ci0JY2FzZSBGUERGX1BBR0VPQkpfUEFUSDoKLQkJewotCQkJQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiA9IChDUERGX1BhdGhPYmplY3QqKXBQYWdlT2JqOwotCQkJcFBhdGhPYmotPkNhbGNCb3VuZGluZ0JveCgpOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEZQREZfUEFHRU9CSl9URVhUOgotCQl7Ci0JCQkvLwlDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqID0gKENQREZfUGF0aE9iamVjdCopcFBhZ2VPYmo7Ci0JCQkvLwlwUGF0aE9iai0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgRlBERl9QQUdFT0JKX0lNQUdFOgotCQl7Ci0JCQlDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopcFBhZ2VPYmo7Ci0JCQlwSW1hZ2VPYmotPkNhbGNCb3VuZGluZ0JveCgpOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEZQREZfUEFHRU9CSl9TSEFESU5HOgotCQl7Ci0JCQlDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqID0gKENQREZfU2hhZGluZ09iamVjdCopcFBhZ2VPYmo7Ci0JCQlwU2hhZGluZ09iai0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgRlBERl9QQUdFT0JKX0ZPUk06Ci0JCXsKLQkJCUNQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwUGFnZU9iajsKLQkJCXBGb3JtT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKLQkJCWJyZWFrOwotCQl9Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorICBwUGFnZS0+SW5zZXJ0T2JqZWN0KExhc3RQZXJzaXRpb24sIHBQYWdlT2JqKTsKKyAgc3dpdGNoIChwUGFnZU9iai0+bV9UeXBlKSB7CisgICAgY2FzZSBGUERGX1BBR0VPQkpfUEFUSDogeworICAgICAgQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiA9IChDUERGX1BhdGhPYmplY3QqKXBQYWdlT2JqOworICAgICAgcFBhdGhPYmotPkNhbGNCb3VuZGluZ0JveCgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlBERl9QQUdFT0JKX1RFWFQ6IHsKKyAgICAgIC8vCUNQREZfUGF0aE9iamVjdCogcFBhdGhPYmogPSAoQ1BERl9QYXRoT2JqZWN0KilwUGFnZU9iajsKKyAgICAgIC8vCXBQYXRoT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZQREZfUEFHRU9CSl9JTUFHRTogeworICAgICAgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqID0gKENQREZfSW1hZ2VPYmplY3QqKXBQYWdlT2JqOworICAgICAgcEltYWdlT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZQREZfUEFHRU9CSl9TSEFESU5HOiB7CisgICAgICBDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqID0gKENQREZfU2hhZGluZ09iamVjdCopcFBhZ2VPYmo7CisgICAgICBwU2hhZGluZ09iai0+Q2FsY0JvdW5kaW5nQm94KCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGUERGX1BBR0VPQkpfRk9STTogeworICAgICAgQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiA9IChDUERGX0Zvcm1PYmplY3QqKXBQYWdlT2JqOworICAgICAgcEZvcm1PYmotPkNhbGNCb3VuZGluZ0JveCgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQogCi0JLy8JcFBhZ2UtPlBhcnNlQ29udGVudCgpOwotCS8vcFBhZ2UtPkdlbmVyYXRlQ29udGVudCgpOwotCisgIC8vCXBQYWdlLT5QYXJzZUNvbnRlbnQoKTsKKyAgLy8gcFBhZ2UtPkdlbmVyYXRlQ29udGVudCgpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfQ291bnRPYmplY3QoRlBERl9QQUdFIHBhZ2UpCi17Ci0JQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwotCWlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCkKLQkJfHwgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKCJQYWdlIikpCi0JewotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBwUGFnZS0+Q291bnRPYmplY3RzKCk7Ci0vLwlyZXR1cm4gMDsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9Db3VudE9iamVjdChGUERGX1BBR0UgcGFnZSkgeworICBDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7CisgIGlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8CisgICAgICAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpIHx8CisgICAgICBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCktPkdldFN0cmluZygpLkNvbXBhcmUoCisgICAgICAgICAgIlBhZ2UiKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gcFBhZ2UtPkNvdW50T2JqZWN0cygpOworICAvLwlyZXR1cm4gMDsKIH0KIAotRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlX0dldE9iamVjdChGUERGX1BBR0UgcGFnZSwgaW50IGluZGV4KQotewotCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKLQlpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKQotCQl8fCBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCktPkdldFN0cmluZygpLkNvbXBhcmUoIlBhZ2UiKSkKLQl7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcFBhZ2UtPkdldE9iamVjdEJ5SW5kZXgoaW5kZXgpOwotLy8JcmV0dXJuIE5VTEw7CitETExFWFBPUlQgRlBERl9QQUdFT0JKRUNUIFNURENBTEwgRlBERlBhZ2VfR2V0T2JqZWN0KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworICBpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fAorICAgICAgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKAorICAgICAgICAgICJQYWdlIikpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcFBhZ2UtPkdldE9iamVjdEJ5SW5kZXgoaW5kZXgpOworICAvLwlyZXR1cm4gTlVMTDsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0hhc1RyYW5zcGFyZW5jeShGUERGX1BBR0UgcGFnZSkKLXsKLQlpZighcGFnZSkgcmV0dXJuIEZBTFNFOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKLQlpZiAoIXBQYWdlKSByZXR1cm4gRkFMU0U7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfSGFzVHJhbnNwYXJlbmN5KEZQREZfUEFHRSBwYWdlKSB7CisgIGlmICghcGFnZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlyZXR1cm4gcFBhZ2UtPkJhY2tncm91bmRBbHBoYU5lZWRlZCgpOworICByZXR1cm4gcFBhZ2UtPkJhY2tncm91bmRBbHBoYU5lZWRlZCgpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VPYmpfSGFzVHJhbnNwYXJlbmN5KEZQREZfUEFHRU9CSkVDVCBwYWdlT2JqZWN0KQotewotCWlmKCFwYWdlT2JqZWN0KSByZXR1cm4gRkFMU0U7Ci0JQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IChDUERGX1BhZ2VPYmplY3QqKXBhZ2VPYmplY3Q7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwKK0ZQREZQYWdlT2JqX0hhc1RyYW5zcGFyZW5jeShGUERGX1BBR0VPQkpFQ1QgcGFnZU9iamVjdCkgeworICBpZiAoIXBhZ2VPYmplY3QpCisgICAgcmV0dXJuIEZBTFNFOworICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gKENQREZfUGFnZU9iamVjdCopcGFnZU9iamVjdDsKIAotCWNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxTdGF0ZSA9IHBQYWdlT2JqLT5tX0dlbmVyYWxTdGF0ZTsKLQlpbnQgYmxlbmRfdHlwZSA9IHBHZW5lcmFsU3RhdGUgPyBwR2VuZXJhbFN0YXRlLT5tX0JsZW5kVHlwZSA6IEZYRElCX0JMRU5EX05PUk1BTDsKLQlpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHJldHVybiBUUlVFOworICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsU3RhdGUgPSBwUGFnZU9iai0+bV9HZW5lcmFsU3RhdGU7CisgIGludCBibGVuZF90eXBlID0KKyAgICAgIHBHZW5lcmFsU3RhdGUgPyBwR2VuZXJhbFN0YXRlLT5tX0JsZW5kVHlwZSA6IEZYRElCX0JMRU5EX05PUk1BTDsKKyAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKQorICAgIHJldHVybiBUUlVFOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwU01hc2tEaWN0ID0gcEdlbmVyYWxTdGF0ZSA/IChDUERGX0RpY3Rpb25hcnkqKXBHZW5lcmFsU3RhdGUtPm1fcFNvZnRNYXNrIDogTlVMTDsKLQlpZihwU01hc2tEaWN0KSByZXR1cm4gVFJVRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwU01hc2tEaWN0ID0KKyAgICAgIHBHZW5lcmFsU3RhdGUgPyAoQ1BERl9EaWN0aW9uYXJ5KilwR2VuZXJhbFN0YXRlLT5tX3BTb2Z0TWFzayA6IE5VTEw7CisgIGlmIChwU01hc2tEaWN0KQorICAgIHJldHVybiBUUlVFOwogCi0JaWYocEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxBbHBoYSAhPSAxLjBmKQotCQlyZXR1cm4gVFJVRTsKKyAgaWYgKHBHZW5lcmFsU3RhdGUgJiYgcEdlbmVyYWxTdGF0ZS0+bV9GaWxsQWxwaGEgIT0gMS4wZikKKyAgICByZXR1cm4gVFJVRTsKIAotCWlmKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9QQVRIKQotCXsKLQkJaWYocEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX1N0cm9rZUFscGhhICE9IDEuMGYpCi0JCQlyZXR1cm4gVFJVRTsKLQl9CisgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfUEFUSCkgeworICAgIGlmIChwR2VuZXJhbFN0YXRlICYmIHBHZW5lcmFsU3RhdGUtPm1fU3Ryb2tlQWxwaGEgIT0gMS4wZikKKyAgICAgIHJldHVybiBUUlVFOworICB9CiAKLQlpZihwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkKLQl7Ci0JCUNQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwUGFnZU9iajsKLQkJaWYocEZvcm1PYmotPm1fcEZvcm0gJiYgKHBGb3JtT2JqLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEKSkKLQkJCXJldHVybiBUUlVFOwotCQlpZihwRm9ybU9iai0+bV9wRm9ybSAmJiAoIShwRm9ybU9iai0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCkgJiYgKHBGb3JtT2JqLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQKSkpCi0JCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworICBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0ZPUk0pIHsKKyAgICBDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqID0gKENQREZfRm9ybU9iamVjdCopcFBhZ2VPYmo7CisgICAgaWYgKHBGb3JtT2JqLT5tX3BGb3JtICYmCisgICAgICAgIChwRm9ybU9iai0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCkpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBpZiAocEZvcm1PYmotPm1fcEZvcm0gJiYKKyAgICAgICAgKCEocEZvcm1PYmotPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpICYmCisgICAgICAgICAocEZvcm1PYmotPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVApKSkKKyAgICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChGUERGX1BBR0UgcGFnZSkKLXsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7Ci0JaWYgKCFwUGFnZSB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0IHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPktleUV4aXN0KCJUeXBlIikgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKQotCQl8fCBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCktPkdldFN0cmluZygpLkNvbXBhcmUoIlBhZ2UiKSkKLQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlIENHKHBQYWdlKTsKLQlDRy5HZW5lcmF0ZUNvbnRlbnQoKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQoRlBERl9QQUdFIHBhZ2UpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworICBpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fAorICAgICAgIXBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKSB8fAorICAgICAgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKAorICAgICAgICAgICJQYWdlIikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlIENHKHBQYWdlKTsKKyAgQ0cuR2VuZXJhdGVDb250ZW50KCk7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCwKLQkJCSBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKQotewotCUNQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSAoQ1BERl9QYWdlT2JqZWN0KilwYWdlX29iamVjdDsKLQlpZihwUGFnZU9iaiA9PSBOVUxMKQotCQlyZXR1cm47Ci0vL1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqID0gRlhfTkVXIENQREZfSW1hZ2VPYmplY3Q7Ci0JQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgoKEZYX0ZMT0FUKWEsKEZYX0ZMT0FUKWIsKEZYX0ZMT0FUKWMsKEZYX0ZMT0FUKWQsKEZYX0ZMT0FUKWUsKEZYX0ZMT0FUKWYpOwotCXBQYWdlT2JqLT5UcmFuc2Zvcm0obWF0cml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZikgeworICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gKENQREZfUGFnZU9iamVjdCopcGFnZV9vYmplY3Q7CisgIGlmIChwUGFnZU9iaiA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgLy8gUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmogPSBGWF9ORVcgQ1BERl9JbWFnZU9iamVjdDsKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgoKEZYX0ZMT0FUKWEsIChGWF9GTE9BVCliLCAoRlhfRkxPQVQpYywgKEZYX0ZMT0FUKWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCllLCAoRlhfRkxPQVQpZik7CisgIHBQYWdlT2JqLT5UcmFuc2Zvcm0obWF0cml4KTsKIH0KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfVHJhbnNmb3JtQW5ub3RzKEZQREZfUEFHRSBwYWdlLAotCQkJCQkJCQkJCQkgICBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKQotewotCWlmKHBhZ2UgPT0gTlVMTCkKLQkJcmV0dXJuOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKLQlpZiAoIXBQYWdlKSByZXR1cm47Ci0JQ1BERl9Bbm5vdExpc3QgQW5ub3RMaXN0KHBQYWdlKTsKLQlmb3IgKGludCBpPTA7IGk8QW5ub3RMaXN0LkNvdW50KCk7aSsrKQotCXsKLQkJQ1BERl9Bbm5vdCogcEFubm90ID0gQW5ub3RMaXN0LkdldEF0KGkpOwotCQkvLyB0cmFuc2Zvcm1Bbm5vdHMgUmVjdGFuZ2xlCi0JCUNQREZfUmVjdCByZWN0OwotCQlwQW5ub3QtPkdldFJlY3QocmVjdCk7Ci0JCUNGWF9BZmZpbmVNYXRyaXggbWF0cml4KChGWF9GTE9BVClhLChGWF9GTE9BVCliLChGWF9GTE9BVCljLChGWF9GTE9BVClkLChGWF9GTE9BVCllLChGWF9GTE9BVClmKTsKLQkJcmVjdC5UcmFuc2Zvcm0oJm1hdHJpeCk7Ci0JCUNQREZfQXJyYXkgKnBSZWN0QXJyYXkgPSBOVUxMOwotCQlwUmVjdEFycmF5ID0gcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0QXJyYXkoIlJlY3QiKTsKLQkJaWYgKCFwUmVjdEFycmF5KSBwUmVjdEFycmF5PUNQREZfQXJyYXk6OkNyZWF0ZSgpOwotCQlwUmVjdEFycmF5LT5TZXRBdCgwLCBuZXcgQ1BERl9OdW1iZXIocmVjdC5sZWZ0KSk7Ci0JCXBSZWN0QXJyYXktPlNldEF0KDEsIG5ldyBDUERGX051bWJlcihyZWN0LmJvdHRvbSkpOwotCQlwUmVjdEFycmF5LT5TZXRBdCgyLCBuZXcgQ1BERl9OdW1iZXIocmVjdC5yaWdodCkpOwotCQlwUmVjdEFycmF5LT5TZXRBdCgzLCBuZXcgQ1BERl9OdW1iZXIocmVjdC50b3ApKTsKLQkJcEFubm90LT5HZXRBbm5vdERpY3QoKS0+U2V0QXQoIlJlY3QiLHBSZWN0QXJyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmKSB7CisgIGlmIChwYWdlID09IE5VTEwpCisgICAgcmV0dXJuOworICBDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7CisgIGlmICghcFBhZ2UpCisgICAgcmV0dXJuOworICBDUERGX0Fubm90TGlzdCBBbm5vdExpc3QocFBhZ2UpOworICBmb3IgKGludCBpID0gMDsgaSA8IEFubm90TGlzdC5Db3VudCgpOyBpKyspIHsKKyAgICBDUERGX0Fubm90KiBwQW5ub3QgPSBBbm5vdExpc3QuR2V0QXQoaSk7CisgICAgLy8gdHJhbnNmb3JtQW5ub3RzIFJlY3RhbmdsZQorICAgIENQREZfUmVjdCByZWN0OworICAgIHBBbm5vdC0+R2V0UmVjdChyZWN0KTsKKyAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCgoRlhfRkxPQVQpYSwgKEZYX0ZMT0FUKWIsIChGWF9GTE9BVCljLCAoRlhfRkxPQVQpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpZSwgKEZYX0ZMT0FUKWYpOworICAgIHJlY3QuVHJhbnNmb3JtKCZtYXRyaXgpOworICAgIENQREZfQXJyYXkqIHBSZWN0QXJyYXkgPSBOVUxMOworICAgIHBSZWN0QXJyYXkgPSBwQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRBcnJheSgiUmVjdCIpOworICAgIGlmICghcFJlY3RBcnJheSkKKyAgICAgIHBSZWN0QXJyYXkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKKyAgICBwUmVjdEFycmF5LT5TZXRBdCgwLCBuZXcgQ1BERl9OdW1iZXIocmVjdC5sZWZ0KSk7CisgICAgcFJlY3RBcnJheS0+U2V0QXQoMSwgbmV3IENQREZfTnVtYmVyKHJlY3QuYm90dG9tKSk7CisgICAgcFJlY3RBcnJheS0+U2V0QXQoMiwgbmV3IENQREZfTnVtYmVyKHJlY3QucmlnaHQpKTsKKyAgICBwUmVjdEFycmF5LT5TZXRBdCgzLCBuZXcgQ1BERl9OdW1iZXIocmVjdC50b3ApKTsKKyAgICBwQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdCgiUmVjdCIsIHBSZWN0QXJyYXkpOwogCi0JCS8vVHJhbnNmb3JtIEFQJ3MgcmVjdGFuZ2xlCi0JCS8vVG8gRG8KLQotCX0KLQorICAgIC8vIFRyYW5zZm9ybSBBUCdzIHJlY3RhbmdsZQorICAgIC8vIFRvIERvCisgIH0KIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRSb3RhdGlvbihGUERGX1BBR0UgcGFnZSwgaW50IHJvdGF0ZSkKLXsKLQlpZiAocGFnZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwotCWlmICghcFBhZ2UpIHJldHVybjsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfU2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UsIGludCByb3RhdGUpIHsKKyAgaWYgKHBhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm47CiAKLQlpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpCi0JCXx8IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKS0+R2V0U3RyaW5nKCkuQ29tcGFyZSgiUGFnZSIpKQotCXsKLQkJcmV0dXJuOwotCX0KLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwotCXJvdGF0ZSAlPTQ7CisgIGlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8CisgICAgICAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpIHx8CisgICAgICBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCktPkdldFN0cmluZygpLkNvbXBhcmUoCisgICAgICAgICAgIlBhZ2UiKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OworICByb3RhdGUgJT0gNDsKIAotCXBEaWN0LT5TZXRBdCgiUm90YXRlIiwgRlhfTkVXIENQREZfTnVtYmVyKHJvdGF0ZSAqIDkwKSk7CisgIHBEaWN0LT5TZXRBdCgiUm90YXRlIiwgRlhfTkVXIENQREZfTnVtYmVyKHJvdGF0ZSAqIDkwKSk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGwuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmZvcm1maWxsLmNwcAppbmRleCBhYTFjMDRhLi4zNjlmOWI0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZmb3JtZmlsbC5jcHAKQEAgLTEyLDYwMyArMTIsNjU2IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2FwcC5oIgogCi0KICNpbmNsdWRlICIuLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKIAogbmFtZXNwYWNlIHsKIAotQ1BERlNES19Eb2N1bWVudCogRm9ybUhhbmRsZVRvU0RLRG9jKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKQotewotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSAoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZTsKLSAgICByZXR1cm4gcEVudiA/IHBFbnYtPkdldFNES0RvY3VtZW50KCkgOiBudWxscHRyOworQ1BERlNES19Eb2N1bWVudCogRm9ybUhhbmRsZVRvU0RLRG9jKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSAoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZTsKKyAgcmV0dXJuIHBFbnYgPyBwRW52LT5HZXRTREtEb2N1bWVudCgpIDogbnVsbHB0cjsKIH0KIAotQ1BERlNES19JbnRlckZvcm0qIEZvcm1IYW5kbGVUb0ludGVyRm9ybShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkKLXsKLSAgICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gRm9ybUhhbmRsZVRvU0RLRG9jKGhIYW5kbGUpOwotICAgIHJldHVybiBwU0RLRG9jID8gcFNES0RvYy0+R2V0SW50ZXJGb3JtKCkgOiBudWxscHRyOworQ1BERlNES19JbnRlckZvcm0qIEZvcm1IYW5kbGVUb0ludGVyRm9ybShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgeworICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gRm9ybUhhbmRsZVRvU0RLRG9jKGhIYW5kbGUpOworICByZXR1cm4gcFNES0RvYyA/IHBTREtEb2MtPkdldEludGVyRm9ybSgpIDogbnVsbHB0cjsKIH0KIAotQ1BERlNES19QYWdlVmlldyogRm9ybUhhbmRsZVRvUGFnZVZpZXcoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlKQotewotICAgIGlmICghcGFnZSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7CitDUERGU0RLX1BhZ2VWaWV3KiBGb3JtSGFuZGxlVG9QYWdlVmlldyhGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlKSB7CisgIGlmICghcGFnZSkKKyAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBGb3JtSGFuZGxlVG9TREtEb2MoaEhhbmRsZSk7Ci0gICAgcmV0dXJuIHBTREtEb2MgPyBwU0RLRG9jLT5HZXRQYWdlVmlldygoQ1BERlhGQV9QYWdlKilwYWdlLCBUUlVFKSA6IG51bGxwdHI7CisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBGb3JtSGFuZGxlVG9TREtEb2MoaEhhbmRsZSk7CisgIHJldHVybiBwU0RLRG9jID8gcFNES0RvYy0+R2V0UGFnZVZpZXcoKENQREZYRkFfUGFnZSopcGFnZSwgVFJVRSkgOiBudWxscHRyOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQRFBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludCgKLSAgICBGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgRlBERl9QQUdFIHBhZ2UsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpCi17Ci0gICAgaWYoIXBhZ2UgfHwgIWhIYW5kbGUpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBDUERGX1BhZ2UgKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKikgcGFnZSktPkdldFBERlBhZ2UoKTsKLSAgICBpZiAocFBhZ2UpCi0gICAgewotICAgICAgICBDUERGX0ludGVyRm9ybSAqIHBJbnRlckZvcm0gPSBOVUxMOwotICAgICAgICBwSW50ZXJGb3JtID0gbmV3IENQREZfSW50ZXJGb3JtKHBQYWdlLT5tX3BEb2N1bWVudCxGQUxTRSk7Ci0gICAgICAgIGlmICghcEludGVyRm9ybSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gcEludGVyRm9ybS0+R2V0Q29udHJvbEF0UG9pbnQocFBhZ2UsIChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOwotICAgICAgICBpZighcEZvcm1DdHJsKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGUgcEludGVyRm9ybTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBGb3JtQ3RybC0+R2V0RmllbGQoKTsKLSAgICAgICAgaWYoIXBGb3JtRmllbGQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwSW50ZXJGb3JtOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG5UeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7Ci0gICAgICAgIGRlbGV0ZSBwSW50ZXJGb3JtOwotICAgICAgICByZXR1cm4gblR5cGU7Ci0gICAgfQotCi0gICAgSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3ID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRYRkFQYWdlVmlldygpOwotICAgIGlmIChwUGFnZVZpZXcpCi0gICAgewotICAgICAgICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gTlVMTDsKLSAgICAgICAgSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBQYWdlVmlldy0+R2V0RG9jVmlldygpOwotICAgICAgICBpZiAoIXBEb2NWaWV3KQotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIHBXaWRnZXRIYW5kbGVyID0gcERvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0SGFuZGxlcikKLSAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICBJWEZBX1dpZGdldCogcFhGQUFubm90ID0gTlVMTDsKLSAgICAgICAgSVhGQV9XaWRnZXRJdGVyYXRvciogcFdpZGdldEl0ZXJhdG9yID0gcFBhZ2VWaWV3LT5DcmVhdGVXaWRnZXRJdGVyYXRvcihYRkFfVFJBVkVSU0VXQVlfRm9ybSwgWEZBX1dJREdFVEZJTFRFUl9WaWV3YWJsZXxYRkFfV0lER0VURklMVEVSX0FsbFR5cGUpOwotICAgICAgICBpZiAoIXBXaWRnZXRJdGVyYXRvcikKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcFhGQUFubm90ID0gcFdpZGdldEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7Ci0gICAgICAgIHdoaWxlIChwWEZBQW5ub3QpIHsKLSAgICAgICAgICAgIENGWF9SZWN0RiByY0JCb3g7Ci0gICAgICAgICAgICBwV2lkZ2V0SGFuZGxlci0+R2V0QkJveCAocFhGQUFubm90LCByY0JCb3gsIDApOwotICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByY1dpZGdldChyY0JCb3gubGVmdCwgcmNCQm94LnRvcCwgcmNCQm94LmxlZnQgKyByY0JCb3gud2lkdGgsIHJjQkJveC50b3ArcmNCQm94LmhlaWdodCk7Ci0gICAgICAgICAgICByY1dpZGdldC5sZWZ0IC09IDEuMGY7Ci0gICAgICAgICAgICByY1dpZGdldC5yaWdodCArPSAxLjBmOwotICAgICAgICAgICAgcmNXaWRnZXQuYm90dG9tIC09IDEuMGY7Ci0gICAgICAgICAgICByY1dpZGdldC50b3AgKz0gMS4wZjsKLQotICAgICAgICAgICAgaWYgKHJjV2lkZ2V0LkNvbnRhaW5zKHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwYWdlX3gpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwYWdlX3kpKSkgewotICAgICAgICAgICAgICAgIHBXaWRnZXRJdGVyYXRvci0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBGUERGX0ZPUk1GSUVMRF9YRkE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwWEZBQW5ub3QgPSBwV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb05leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBXaWRnZXRJdGVyYXRvci0+UmVsZWFzZSgpOwotICAgIH0KLQorRExMRVhQT1JUIGludCBTVERDQUxMIEZQRFBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKKyAgaWYgKCFwYWdlIHx8ICFoSGFuZGxlKQogICAgIHJldHVybiAtMTsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOworICBpZiAocFBhZ2UpIHsKKyAgICBDUERGX0ludGVyRm9ybSogcEludGVyRm9ybSA9IE5VTEw7CisgICAgcEludGVyRm9ybSA9IG5ldyBDUERGX0ludGVyRm9ybShwUGFnZS0+bV9wRG9jdW1lbnQsIEZBTFNFKTsKKyAgICBpZiAoIXBJbnRlckZvcm0pCisgICAgICByZXR1cm4gLTE7CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gcEludGVyRm9ybS0+R2V0Q29udHJvbEF0UG9pbnQoCisgICAgICAgIHBQYWdlLCAoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKKyAgICBpZiAoIXBGb3JtQ3RybCkgeworICAgICAgZGVsZXRlIHBJbnRlckZvcm07CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gcEZvcm1DdHJsLT5HZXRGaWVsZCgpOworICAgIGlmICghcEZvcm1GaWVsZCkgeworICAgICAgZGVsZXRlIHBJbnRlckZvcm07CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50IG5UeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7CisgICAgZGVsZXRlIHBJbnRlckZvcm07CisgICAgcmV0dXJuIG5UeXBlOworICB9CisKKyAgSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3ID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRYRkFQYWdlVmlldygpOworICBpZiAocFBhZ2VWaWV3KSB7CisgICAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IE5VTEw7CisgICAgSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBQYWdlVmlldy0+R2V0RG9jVmlldygpOworICAgIGlmICghcERvY1ZpZXcpCisgICAgICByZXR1cm4gLTE7CisKKyAgICBwV2lkZ2V0SGFuZGxlciA9IHBEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7CisgICAgaWYgKCFwV2lkZ2V0SGFuZGxlcikKKyAgICAgIHJldHVybiAtMTsKKworICAgIElYRkFfV2lkZ2V0KiBwWEZBQW5ub3QgPSBOVUxMOworICAgIElYRkFfV2lkZ2V0SXRlcmF0b3IqIHBXaWRnZXRJdGVyYXRvciA9IHBQYWdlVmlldy0+Q3JlYXRlV2lkZ2V0SXRlcmF0b3IoCisgICAgICAgIFhGQV9UUkFWRVJTRVdBWV9Gb3JtLAorICAgICAgICBYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlIHwgWEZBX1dJREdFVEZJTFRFUl9BbGxUeXBlKTsKKyAgICBpZiAoIXBXaWRnZXRJdGVyYXRvcikKKyAgICAgIHJldHVybiAtMTsKKyAgICBwWEZBQW5ub3QgPSBwV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb05leHQoKTsKKyAgICB3aGlsZSAocFhGQUFubm90KSB7CisgICAgICBDRlhfUmVjdEYgcmNCQm94OworICAgICAgcFdpZGdldEhhbmRsZXItPkdldEJCb3gocFhGQUFubm90LCByY0JCb3gsIDApOworICAgICAgQ0ZYX0Zsb2F0UmVjdCByY1dpZGdldChyY0JCb3gubGVmdCwgcmNCQm94LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmxlZnQgKyByY0JCb3gud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3AgKyByY0JCb3guaGVpZ2h0KTsKKyAgICAgIHJjV2lkZ2V0LmxlZnQgLT0gMS4wZjsKKyAgICAgIHJjV2lkZ2V0LnJpZ2h0ICs9IDEuMGY7CisgICAgICByY1dpZGdldC5ib3R0b20gLT0gMS4wZjsKKyAgICAgIHJjV2lkZ2V0LnRvcCArPSAxLjBmOworCisgICAgICBpZiAocmNXaWRnZXQuQ29udGFpbnMoc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBhZ2VfeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBhZ2VfeSkpKSB7CisgICAgICAgIHBXaWRnZXRJdGVyYXRvci0+UmVsZWFzZSgpOworICAgICAgICByZXR1cm4gRlBERl9GT1JNRklFTERfWEZBOworICAgICAgfQorICAgICAgcFhGQUFubm90ID0gcFdpZGdldEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7CisgICAgfQorCisgICAgcFdpZGdldEl0ZXJhdG9yLT5SZWxlYXNlKCk7CisgIH0KKworICByZXR1cm4gLTE7CiB9CiAKLURMTEVYUE9SVCBGUERGX0ZPUk1IQU5ETEUgU1REQ0FMTCBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfRk9STUZJTExJTkZPKiBmb3JtSW5mbykKLXsKLSAgICBpZiAoIWRvY3VtZW50IHx8ICFmb3JtSW5mbyB8fCBmb3JtSW5mby0+dmVyc2lvbiAhPSAyKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKK0RMTEVYUE9SVCBGUERGX0ZPUk1IQU5ETEUgU1REQ0FMTAorRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1GSUxMSU5GTyogZm9ybUluZm8pIHsKKyAgaWYgKCFkb2N1bWVudCB8fCAhZm9ybUluZm8gfHwgZm9ybUluZm8tPnZlcnNpb24gIT0gMikKKyAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbmV3IENQREZEb2NfRW52aXJvbm1lbnQocERvY3VtZW50LCBmb3JtSW5mbyk7Ci0gICAgcEVudi0+U2V0U0RLRG9jdW1lbnQocERvY3VtZW50LT5HZXRTREtEb2N1bWVudChwRW52KSk7CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG5ldyBDUERGRG9jX0Vudmlyb25tZW50KHBEb2N1bWVudCwgZm9ybUluZm8pOworICBwRW52LT5TZXRTREtEb2N1bWVudChwRG9jdW1lbnQtPkdldFNES0RvY3VtZW50KHBFbnYpKTsKIAotICAgIENQREZYRkFfQXBwKiBwQXBwID0gQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCk7Ci0gICAgcEFwcC0+QWRkRm9ybUZpbGxFbnYocEVudik7CisgIENQREZYRkFfQXBwKiBwQXBwID0gQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCk7CisgIHBBcHAtPkFkZEZvcm1GaWxsRW52KHBFbnYpOwogCi0gICAgcmV0dXJuIHBFbnY7CisgIHJldHVybiBwRW52OwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvbm1lbnQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUpCi17Ci0gICAgaWYgKCFoSGFuZGxlKQotICAgICAgICByZXR1cm47Ci0gICAgQ1BERlhGQV9BcHAqIHBBcHAgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKTsKLSAgICBwQXBwLT5SZW1vdmVGb3JtRmlsbEVudigoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSk7Ci0gICAgZGVsZXRlIChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERkRPQ19FeGl0Rm9ybUZpbGxFbnZpcm9ubWVudChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgeworICBpZiAoIWhIYW5kbGUpCisgICAgcmV0dXJuOworICBDUERGWEZBX0FwcCogcEFwcCA9IENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpOworICBwQXBwLT5SZW1vdmVGb3JtRmlsbEVudigoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSk7CisgIGRlbGV0ZSAoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25Nb3VzZU1vdmUoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbW9kaWZpZXIsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpCi17Ci0gICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7Ci0gICAgaWYgKCFwUGFnZVZpZXcpCi0gICAgICAgIHJldHVybiBGQUxTRTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uTW91c2VNb3ZlKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSkgeworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKKyAgaWYgKCFwUGFnZVZpZXcpCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgQ1BERl9Qb2ludCBwdCgoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKLSAgICByZXR1cm4gcFBhZ2VWaWV3LT5Pbk1vdXNlTW92ZShwdCwgbW9kaWZpZXIpOworICBDUERGX1BvaW50IHB0KChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOworICByZXR1cm4gcFBhZ2VWaWV3LT5Pbk1vdXNlTW92ZShwdCwgbW9kaWZpZXIpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkxCdXR0b25Eb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBGUERGX1BBR0UgcGFnZSwgaW50IG1vZGlmaWVyLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95KQotewotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwotICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gRkFMU0U7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkxCdXR0b25Eb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KSB7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOworICBpZiAoIXBQYWdlVmlldykKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBDUERGX1BvaW50IHB0KChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOwotICAgIHJldHVybiBwUGFnZVZpZXctPk9uTEJ1dHRvbkRvd24ocHQsIG1vZGlmaWVyKTsKKyAgQ1BERl9Qb2ludCBwdCgoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKKyAgcmV0dXJuIHBQYWdlVmlldy0+T25MQnV0dG9uRG93bihwdCwgbW9kaWZpZXIpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkxCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgRlBERl9QQUdFIHBhZ2UsIGludCBtb2RpZmllciwgZG91YmxlIHBhZ2VfeCwgZG91YmxlIHBhZ2VfeSkKLXsKLSAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKLSAgICBpZiAoIXBQYWdlVmlldykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25MQnV0dG9uVXAoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KSB7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOworICBpZiAoIXBQYWdlVmlldykKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBDUERGX1BvaW50IHB0KChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOwotICAgIHJldHVybiBwUGFnZVZpZXctPk9uTEJ1dHRvblVwKHB0LCBtb2RpZmllcik7CisgIENQREZfUG9pbnQgcHQoKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7CisgIHJldHVybiBwUGFnZVZpZXctPk9uTEJ1dHRvblVwKHB0LCBtb2RpZmllcik7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uUkJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbW9kaWZpZXIsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpCi17Ci0gICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7Ci0gICAgaWYgKCFwUGFnZVZpZXcpCi0gICAgICAgIHJldHVybiBGQUxTRTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uUkJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CisgIGlmICghcFBhZ2VWaWV3KQorICAgIHJldHVybiBGQUxTRTsKIAotICAgIENQREZfUG9pbnQgcHQoKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7Ci0gICAgcmV0dXJuIHBQYWdlVmlldy0+T25SQnV0dG9uRG93bihwdCwgbW9kaWZpZXIpOworICBDUERGX1BvaW50IHB0KChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOworICByZXR1cm4gcFBhZ2VWaWV3LT5PblJCdXR0b25Eb3duKHB0LCBtb2RpZmllcik7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uUkJ1dHRvblVwKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBGUERGX1BBR0UgcGFnZSwgaW50IG1vZGlmaWVyLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95KQotewotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwotICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gRkFMU0U7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PblJCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CisgIGlmICghcFBhZ2VWaWV3KQorICAgIHJldHVybiBGQUxTRTsKIAotICAgIENQREZfUG9pbnQgcHQoKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7Ci0gICAgcmV0dXJuIHBQYWdlVmlldy0+T25SQnV0dG9uVXAocHQsIG1vZGlmaWVyKTsKKyAgQ1BERl9Qb2ludCBwdCgoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKKyAgcmV0dXJuIHBQYWdlVmlldy0+T25SQnV0dG9uVXAocHQsIG1vZGlmaWVyKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlEb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBGUERGX1BBR0UgcGFnZSwgaW50IG5LZXlDb2RlLCBpbnQgbW9kaWZpZXIpCi17Ci0gICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7Ci0gICAgaWYgKCFwUGFnZVZpZXcpCi0gICAgICAgIHJldHVybiBGQUxTRTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uS2V5RG93bihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyKSB7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOworICBpZiAoIXBQYWdlVmlldykKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICByZXR1cm4gcFBhZ2VWaWV3LT5PbktleURvd24obktleUNvZGUsIG1vZGlmaWVyKTsKKyAgcmV0dXJuIHBQYWdlVmlldy0+T25LZXlEb3duKG5LZXlDb2RlLCBtb2RpZmllcik7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uS2V5VXAoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbktleUNvZGUsIGludCBtb2RpZmllcikKLXsKLSAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKLSAgICBpZiAoIXBQYWdlVmlldykKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlVcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyKSB7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOworICBpZiAoIXBQYWdlVmlldykKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICByZXR1cm4gcFBhZ2VWaWV3LT5PbktleVVwKG5LZXlDb2RlLCBtb2RpZmllcik7CisgIHJldHVybiBwUGFnZVZpZXctPk9uS2V5VXAobktleUNvZGUsIG1vZGlmaWVyKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25DaGFyKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBGUERGX1BBR0UgcGFnZSwgaW50IG5DaGFyLCAgaW50IG1vZGlmaWVyKQotewotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwotICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgICByZXR1cm4gRkFMU0U7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkNoYXIoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcikgeworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKKyAgaWYgKCFwUGFnZVZpZXcpCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgcmV0dXJuIHBQYWdlVmlldy0+T25DaGFyKG5DaGFyLCBtb2RpZmllcik7CisgIHJldHVybiBwUGFnZVZpZXctPk9uQ2hhcihuQ2hhciwgbW9kaWZpZXIpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9Gb3JjZVRvS2lsbEZvY3VzKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKQotewotICAgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBGb3JtSGFuZGxlVG9TREtEb2MoaEhhbmRsZSk7Ci0gICAgaWYgKCFwU0RLRG9jKQotICAgICAgICByZXR1cm4gRkFMU0U7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9Gb3JjZVRvS2lsbEZvY3VzKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBGb3JtSGFuZGxlVG9TREtEb2MoaEhhbmRsZSk7CisgIGlmICghcFNES0RvYykKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICByZXR1cm4gcFNES0RvYy0+S2lsbEZvY3VzQW5ub3QoMCk7CisgIHJldHVybiBwU0RLRG9jLT5LaWxsRm9jdXNBbm5vdCgwKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0ZGTERyYXcoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfQklUTUFQIGJpdG1hcCwgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksIGludCByb3RhdGUsIGludCBmbGFncykKLXsKLSAgICBpZiAoIWhIYW5kbGUgfHwgIXBhZ2UpCi0gICAgICAgIHJldHVybiA7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRkZMRHJhdyhGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgeworICBpZiAoIWhIYW5kbGUgfHwgIXBhZ2UpCisgICAgcmV0dXJuOwogCi0gICAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IChDUERGWEZBX1BhZ2UqKXBhZ2U7Ci0gICAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2UtPkdldERvY3VtZW50KCk7Ci0gICAgaWYgKCFwRG9jdW1lbnQpCi0gICAgICAgIHJldHVybjsKLSAgICBDUERGX0RvY3VtZW50KiBwUERGRG9jID0gcERvY3VtZW50LT5HZXRQREZEb2MoKTsKLSAgICBpZiAoIXBQREZEb2MpCi0gICAgICAgIHJldHVybjsKKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IChDUERGWEZBX1BhZ2UqKXBhZ2U7CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlLT5HZXREb2N1bWVudCgpOworICBpZiAoIXBEb2N1bWVudCkKKyAgICByZXR1cm47CisgIENQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBwRG9jdW1lbnQtPkdldFBERkRvYygpOworICBpZiAoIXBQREZEb2MpCisgICAgcmV0dXJuOwogCi0gICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlOwotICAgIENQREZTREtfRG9jdW1lbnQqIHBGWERvYyA9IHBFbnYtPkdldFNES0RvY3VtZW50KCk7Ci0gICAgaWYgKCFwRlhEb2MpCi0gICAgICAgIHJldHVybjsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlOworICBDUERGU0RLX0RvY3VtZW50KiBwRlhEb2MgPSBwRW52LT5HZXRTREtEb2N1bWVudCgpOworICBpZiAoIXBGWERvYykKKyAgICByZXR1cm47CiAKLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICBwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChtYXRyaXgsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUpOworICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKKyAgcFBhZ2UtPkdldERpc3BsYXlNYXRyaXgobWF0cml4LCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlKTsKIAotICAgIEZYX1JFQ1QgY2xpcDsKLSAgICBjbGlwLmxlZnQgPSBzdGFydF94OwotICAgIGNsaXAucmlnaHQgPSBzdGFydF94ICsgc2l6ZV94OwotICAgIGNsaXAudG9wID0gc3RhcnRfeTsKLSAgICBjbGlwLmJvdHRvbSA9IHN0YXJ0X3kgKyBzaXplX3k7CisgIEZYX1JFQ1QgY2xpcDsKKyAgY2xpcC5sZWZ0ID0gc3RhcnRfeDsKKyAgY2xpcC5yaWdodCA9IHN0YXJ0X3ggKyBzaXplX3g7CisgIGNsaXAudG9wID0gc3RhcnRfeTsKKyAgY2xpcC5ib3R0b20gPSBzdGFydF95ICsgc2l6ZV95OwogCiAjaWZkZWYgX1NLSUFfU1VQUE9SVF8KLSAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1NraWFEZXZpY2U+IHBEZXZpY2UobmV3IENGWF9Ta2lhRGV2aWNlKTsKKyAgbm9uc3RkOjp1bmlxdWVfcHRyPENGWF9Ta2lhRGV2aWNlPiBwRGV2aWNlKG5ldyBDRlhfU2tpYURldmljZSk7CiAjZWxzZQotICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxDRlhfRnhnZURldmljZT4gcERldmljZShuZXcgQ0ZYX0Z4Z2VEZXZpY2UpOworICBub25zdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0Z4Z2VEZXZpY2U+IHBEZXZpY2UobmV3IENGWF9GeGdlRGV2aWNlKTsKICNlbmRpZgogCi0gICAgaWYgKCFwRGV2aWNlKQotICAgICAgICByZXR1cm47Ci0gICAgcERldmljZS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7Ci0gICAgcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0gICAgcERldmljZS0+U2V0Q2xpcF9SZWN0KCZjbGlwKTsKKyAgaWYgKCFwRGV2aWNlKQorICAgIHJldHVybjsKKyAgcERldmljZS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7CisgIHBEZXZpY2UtPlNhdmVTdGF0ZSgpOworICBwRGV2aWNlLT5TZXRDbGlwX1JlY3QoJmNsaXApOwogCi0gICAgQ1BERl9SZW5kZXJPcHRpb25zIG9wdGlvbnM7Ci0gICAgaWYgKGZsYWdzICYgRlBERl9MQ0RfVEVYVCkKLSAgICAgICAgb3B0aW9ucy5tX0ZsYWdzIHw9IFJFTkRFUl9DTEVBUlRZUEU7Ci0gICAgZWxzZQotICAgICAgICBvcHRpb25zLm1fRmxhZ3MgJj0gflJFTkRFUl9DTEVBUlRZUEU7CisgIENQREZfUmVuZGVyT3B0aW9ucyBvcHRpb25zOworICBpZiAoZmxhZ3MgJiBGUERGX0xDRF9URVhUKQorICAgIG9wdGlvbnMubV9GbGFncyB8PSBSRU5ERVJfQ0xFQVJUWVBFOworICBlbHNlCisgICAgb3B0aW9ucy5tX0ZsYWdzICY9IH5SRU5ERVJfQ0xFQVJUWVBFOwogCi0gICAgLy9HcmF5c2NhbGUgb3V0cHV0Ci0gICAgaWYgKGZsYWdzICYgRlBERl9HUkFZU0NBTEUpCi0gICAgewotICAgICAgICBvcHRpb25zLm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX0dSQVk7Ci0gICAgICAgIG9wdGlvbnMubV9Gb3JlQ29sb3IgPSAwOwotICAgICAgICBvcHRpb25zLm1fQmFja0NvbG9yID0gMHhmZmZmZmY7Ci0gICAgfQotICAgIG9wdGlvbnMubV9BZGRGbGFncyA9IGZsYWdzID4+IDg7Ci0gICAgb3B0aW9ucy5tX3BPQ0NvbnRleHQgPSBGWF9ORVcgQ1BERl9PQ0NvbnRleHQocFBERkRvYyk7CisgIC8vIEdyYXlzY2FsZSBvdXRwdXQKKyAgaWYgKGZsYWdzICYgRlBERl9HUkFZU0NBTEUpIHsKKyAgICBvcHRpb25zLm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX0dSQVk7CisgICAgb3B0aW9ucy5tX0ZvcmVDb2xvciA9IDA7CisgICAgb3B0aW9ucy5tX0JhY2tDb2xvciA9IDB4ZmZmZmZmOworICB9CisgIG9wdGlvbnMubV9BZGRGbGFncyA9IGZsYWdzID4+IDg7CisgIG9wdGlvbnMubV9wT0NDb250ZXh0ID0gRlhfTkVXIENQREZfT0NDb250ZXh0KHBQREZEb2MpOwogCi0gICAgaWYgKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZYRkFfUGFnZSopcGFnZSkpCi0gICAgICAgIHBQYWdlVmlldy0+UGFnZVZpZXdfT25EcmF3KHBEZXZpY2UuZ2V0KCksICZtYXRyaXgsICZvcHRpb25zLCAmY2xpcCk7CisgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KChDUERGWEZBX1BhZ2UqKXBhZ2UpKQorICAgIHBQYWdlVmlldy0+UGFnZVZpZXdfT25EcmF3KHBEZXZpY2UuZ2V0KCksICZtYXRyaXgsICZvcHRpb25zLCAmY2xpcCk7CiAKLSAgICBwRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyAgcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CiAKLSAgICBkZWxldGUgb3B0aW9ucy5tX3BPQ0NvbnRleHQ7Ci0gICAgb3B0aW9ucy5tX3BPQ0NvbnRleHQgPSBOVUxMOworICBkZWxldGUgb3B0aW9ucy5tX3BPQ0NvbnRleHQ7CisgIG9wdGlvbnMubV9wT0NDb250ZXh0ID0gTlVMTDsKIH0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfVW5kbyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0KQotewotICAgIGlmIChOVUxMID09IGhXaWRnZXQgfHwgTlVMTCA9PSBkb2N1bWVudCkKLSAgICAgICAgcmV0dXJuOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9VbmRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCkgeworICBpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCisgICAgcmV0dXJuOwogCi0gICAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OwotICAgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9EeW5hbWljICYmIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX1N0YXRpYykKLSAgICAgICAgcmV0dXJuOworICBDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CisgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9EeW5hbWljICYmCisgICAgICBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisgICAgcmV0dXJuOwogCi0gICAgSVhGQV9NZW51SGFuZGxlciogcFhGQU1lbnVIYW5kZXIgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7Ci0gICAgaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKKyAgSVhGQV9NZW51SGFuZGxlciogcFhGQU1lbnVIYW5kZXIgPQorICAgICAgQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOworICBpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKKyAgICByZXR1cm47CiAKLSAgICBwWEZBTWVudUhhbmRlci0+VW5kbygoSVhGQV9XaWRnZXQqKWhXaWRnZXQpOwotCisgIHBYRkFNZW51SGFuZGVyLT5VbmRvKChJWEZBX1dpZGdldCopaFdpZGdldCk7CiB9Ci1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1JlZG8oRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURHRVQgaFdpZGdldCkKLXsKLSAgICBpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCi0gICAgICAgIHJldHVybjsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUmVkbyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQpIHsKKyAgaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQorICAgIHJldHVybjsKIAotICAgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKLSAgICBpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJiBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCi0gICAgICAgIHJldHVybjsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OworICBpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJgorICAgICAgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorICAgIHJldHVybjsKIAotICAgIElYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0gQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOwotICAgIGlmIChwWEZBTWVudUhhbmRlciA9PSBOVUxMKQotICAgICAgICByZXR1cm47CisgIElYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0KKyAgICAgIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRYRkFBcHAoKS0+R2V0TWVudUhhbmRsZXIoKTsKKyAgaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCisgICAgcmV0dXJuOwogCi0gICAgcFhGQU1lbnVIYW5kZXItPlJlZG8oKElYRkFfV2lkZ2V0KiloV2lkZ2V0KTsKKyAgcFhGQU1lbnVIYW5kZXItPlJlZG8oKElYRkFfV2lkZ2V0KiloV2lkZ2V0KTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9TZWxlY3RBbGwoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURHRVQgaFdpZGdldCkKLXsKLSAgICBpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCi0gICAgICAgIHJldHVybjsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfU2VsZWN0QWxsKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0KSB7CisgIGlmIChOVUxMID09IGhXaWRnZXQgfHwgTlVMTCA9PSBkb2N1bWVudCkKKyAgICByZXR1cm47CiAKLSAgICBDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0gICAgaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQotICAgICAgICByZXR1cm47CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKKyAgaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYKKyAgICAgIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX1N0YXRpYykKKyAgICByZXR1cm47CiAKLSAgICBJWEZBX01lbnVIYW5kbGVyKiBwWEZBTWVudUhhbmRlciA9IENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRYRkFBcHAoKS0+R2V0TWVudUhhbmRsZXIoKTsKLSAgICBpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOworICBJWEZBX01lbnVIYW5kbGVyKiBwWEZBTWVudUhhbmRlciA9CisgICAgICBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7CisgIGlmIChwWEZBTWVudUhhbmRlciA9PSBOVUxMKQorICAgIHJldHVybjsKIAotICAgIHBYRkFNZW51SGFuZGVyLT5TZWxlY3RBbGwoKElYRkFfV2lkZ2V0KiloV2lkZ2V0KTsKKyAgcFhGQU1lbnVIYW5kZXItPlNlbGVjdEFsbCgoSVhGQV9XaWRnZXQqKWhXaWRnZXQpOwogfQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9Db3B5KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIEZQREZfV0lERVNUUklORyB3c1RleHQsIEZQREZfRFdPUkQqIHNpemUpCi17Ci0gICAgaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQotICAgICAgICByZXR1cm47CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X0NvcHkoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCogc2l6ZSkgeworICBpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCisgICAgcmV0dXJuOwogCi0gICAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OwotICAgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9EeW5hbWljICYmIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX1N0YXRpYykKLSAgICAgICAgcmV0dXJuOworICBDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CisgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9EeW5hbWljICYmCisgICAgICBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisgICAgcmV0dXJuOwogCi0gICAgSVhGQV9NZW51SGFuZGxlciogcFhGQU1lbnVIYW5kZXIgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7Ci0gICAgaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKKyAgSVhGQV9NZW51SGFuZGxlciogcFhGQU1lbnVIYW5kZXIgPQorICAgICAgQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOworICBpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKKyAgICByZXR1cm47CiAKLSAgICBDRlhfV2lkZVN0cmluZyB3c0NwVGV4dDsKLSAgICBwWEZBTWVudUhhbmRlci0+Q29weSgoSVhGQV9XaWRnZXQqKWhXaWRnZXQsIHdzQ3BUZXh0KTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDcFRleHQ7CisgIHBYRkFNZW51SGFuZGVyLT5Db3B5KChJWEZBX1dpZGdldCopaFdpZGdldCwgd3NDcFRleHQpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNDcFRleHQgPSB3c0NwVGV4dC5VVEYxNkxFX0VuY29kZSgpOwotICAgIGludCBsZW4gPSBic0NwVGV4dC5HZXRMZW5ndGgoKS9zaXplb2YodW5zaWduZWQgc2hvcnQpOwotICAgIGlmICh3c1RleHQgPT0gTlVMTCkgewotICAgICAgICAqc2l6ZSA9IGxlbjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNDcFRleHQgPSB3c0NwVGV4dC5VVEYxNkxFX0VuY29kZSgpOworICBpbnQgbGVuID0gYnNDcFRleHQuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpOworICBpZiAod3NUZXh0ID09IE5VTEwpIHsKKyAgICAqc2l6ZSA9IGxlbjsKKyAgICByZXR1cm47CisgIH0KIAotICAgIGludCByZWFsX3NpemUgPSBsZW4gPCAqc2l6ZSA/IGxlbiA6ICpzaXplOwotICAgIGlmIChyZWFsX3NpemUgPiAwKQotICAgIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KCh2b2lkKil3c1RleHQsYnNDcFRleHQuR2V0QnVmZmVyKHJlYWxfc2l6ZSpzaXplb2YodW5zaWduZWQgc2hvcnQpKSxyZWFsX3NpemUqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7Ci0gICAgICAgIGJzQ3BUZXh0LlJlbGVhc2VCdWZmZXIocmVhbF9zaXplKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwotICAgIH0KLSAgICAqc2l6ZSA9IHJlYWxfc2l6ZTsKKyAgaW50IHJlYWxfc2l6ZSA9IGxlbiA8ICpzaXplID8gbGVuIDogKnNpemU7CisgIGlmIChyZWFsX3NpemUgPiAwKSB7CisgICAgRlhTWVNfbWVtY3B5KCh2b2lkKil3c1RleHQsCisgICAgICAgICAgICAgICAgIGJzQ3BUZXh0LkdldEJ1ZmZlcihyZWFsX3NpemUgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSwKKyAgICAgICAgICAgICAgICAgcmVhbF9zaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisgICAgYnNDcFRleHQuUmVsZWFzZUJ1ZmZlcihyZWFsX3NpemUgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKyAgfQorICAqc2l6ZSA9IHJlYWxfc2l6ZTsKIH0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ3V0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIEZQREZfV0lERVNUUklORyB3c1RleHQsIEZQREZfRFdPUkQqIHNpemUpCi17Ci0gICAgaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQotICAgICAgICByZXR1cm47Ci0gICAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OwotICAgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9EeW5hbWljICYmIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX1N0YXRpYykKLSAgICAgICAgcmV0dXJuOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9DdXQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCogc2l6ZSkgeworICBpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCisgICAgcmV0dXJuOworICBDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CisgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9EeW5hbWljICYmCisgICAgICBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisgICAgcmV0dXJuOwogCi0gICAgSVhGQV9NZW51SGFuZGxlciogcFhGQU1lbnVIYW5kZXIgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7Ci0gICAgaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKKyAgSVhGQV9NZW51SGFuZGxlciogcFhGQU1lbnVIYW5kZXIgPQorICAgICAgQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOworICBpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKKyAgICByZXR1cm47CiAKLSAgICBDRlhfV2lkZVN0cmluZyB3c0NwVGV4dDsKLSAgICBwWEZBTWVudUhhbmRlci0+Q3V0KChJWEZBX1dpZGdldCopaFdpZGdldCwgd3NDcFRleHQpOworICBDRlhfV2lkZVN0cmluZyB3c0NwVGV4dDsKKyAgcFhGQU1lbnVIYW5kZXItPkN1dCgoSVhGQV9XaWRnZXQqKWhXaWRnZXQsIHdzQ3BUZXh0KTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGJzQ3BUZXh0ID0gd3NDcFRleHQuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICBpbnQgbGVuID0gYnNDcFRleHQuR2V0TGVuZ3RoKCkvc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKLSAgICBpZiAod3NUZXh0ID09IE5VTEwpIHsKLSAgICAgICAgKnNpemUgPSBsZW47Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgIENGWF9CeXRlU3RyaW5nIGJzQ3BUZXh0ID0gd3NDcFRleHQuVVRGMTZMRV9FbmNvZGUoKTsKKyAgaW50IGxlbiA9IGJzQ3BUZXh0LkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKyAgaWYgKHdzVGV4dCA9PSBOVUxMKSB7CisgICAgKnNpemUgPSBsZW47CisgICAgcmV0dXJuOworICB9CiAKLSAgICBpbnQgcmVhbF9zaXplID0gbGVuIDwgKnNpemUgPyBsZW4gOiAqc2l6ZTsKLSAgICBpZiAocmVhbF9zaXplID4gMCkKLSAgICB7Ci0gICAgICAgIEZYU1lTX21lbWNweSgodm9pZCopd3NUZXh0LGJzQ3BUZXh0LkdldEJ1ZmZlcihyZWFsX3NpemUqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkscmVhbF9zaXplKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwotICAgICAgICBic0NwVGV4dC5SZWxlYXNlQnVmZmVyKHJlYWxfc2l6ZSpzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKLSAgICB9Ci0gICAgKnNpemUgPSByZWFsX3NpemU7CisgIGludCByZWFsX3NpemUgPSBsZW4gPCAqc2l6ZSA/IGxlbiA6ICpzaXplOworICBpZiAocmVhbF9zaXplID4gMCkgeworICAgIEZYU1lTX21lbWNweSgodm9pZCopd3NUZXh0LAorICAgICAgICAgICAgICAgICBic0NwVGV4dC5HZXRCdWZmZXIocmVhbF9zaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksCisgICAgICAgICAgICAgICAgIHJlYWxfc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICAgIGJzQ3BUZXh0LlJlbGVhc2VCdWZmZXIocmVhbF9zaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisgIH0KKyAgKnNpemUgPSByZWFsX3NpemU7CiB9Ci1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1Bhc3RlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIEZQREZfV0lERVNUUklORyB3c1RleHQsIEZQREZfRFdPUkQgc2l6ZSkKLXsKLSAgICBpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCi0gICAgICAgIHJldHVybjsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUGFzdGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKSB7CisgIGlmIChOVUxMID09IGhXaWRnZXQgfHwgTlVMTCA9PSBkb2N1bWVudCkKKyAgICByZXR1cm47CiAKLSAgICBDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0gICAgaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQotICAgICAgICByZXR1cm47CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKKyAgaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYKKyAgICAgIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX1N0YXRpYykKKyAgICByZXR1cm47CiAKLSAgICBJWEZBX01lbnVIYW5kbGVyKiBwWEZBTWVudUhhbmRlciA9IENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRYRkFBcHAoKS0+R2V0TWVudUhhbmRsZXIoKTsKLSAgICBpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOworICBJWEZBX01lbnVIYW5kbGVyKiBwWEZBTWVudUhhbmRlciA9CisgICAgICBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7CisgIGlmIChwWEZBTWVudUhhbmRlciA9PSBOVUxMKQorICAgIHJldHVybjsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdzdHIgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUod3NUZXh0LCBzaXplKTsKLSAgICBwWEZBTWVudUhhbmRlci0+UGFzdGUoKElYRkFfV2lkZ2V0KiloV2lkZ2V0LCB3c3RyKTsKLQorICBDRlhfV2lkZVN0cmluZyB3c3RyID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKHdzVGV4dCwgc2l6ZSk7CisgIHBYRkFNZW51SGFuZGVyLT5QYXN0ZSgoSVhGQV9XaWRnZXQqKWhXaWRnZXQsIHdzdHIpOwogfQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9SZXBsYWNlU3BlbGxDaGVja1dvcmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURHRVQgaFdpZGdldCwgZmxvYXQgeCwgZmxvYXQgeSwgRlBERl9CWVRFU1RSSU5HIGJzVGV4dCkKLXsKLSAgICBpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCi0gICAgICAgIHJldHVybjsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwKK0ZQREZfV2lkZ2V0X1JlcGxhY2VTcGVsbENoZWNrV29yZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBic1RleHQpIHsKKyAgaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQorICAgIHJldHVybjsKIAotICAgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKLSAgICBpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJiBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCi0gICAgICAgIHJldHVybjsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OworICBpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJgorICAgICAgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorICAgIHJldHVybjsKIAotICAgIElYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0gQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOwotICAgIGlmIChwWEZBTWVudUhhbmRlciA9PSBOVUxMKQotICAgICAgICByZXR1cm47CisgIElYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0KKyAgICAgIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRYRkFBcHAoKS0+R2V0TWVudUhhbmRsZXIoKTsKKyAgaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCisgICAgcmV0dXJuOwogCi0gICAgQ0ZYX1BvaW50RiBwdFBvcHVwOwotICAgIHB0UG9wdXAueCA9IHg7Ci0gICAgcHRQb3B1cC55ID0geTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnMoYnNUZXh0KTsKLSAgICBwWEZBTWVudUhhbmRlci0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKChJWEZBX1dpZGdldCopaFdpZGdldCxwdFBvcHVwLGJzKTsKLQorICBDRlhfUG9pbnRGIHB0UG9wdXA7CisgIHB0UG9wdXAueCA9IHg7CisgIHB0UG9wdXAueSA9IHk7CisgIENGWF9CeXRlU3RyaW5nQyBicyhic1RleHQpOworICBwWEZBTWVudUhhbmRlci0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKChJWEZBX1dpZGdldCopaFdpZGdldCwgcHRQb3B1cCwgYnMpOwogfQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9HZXRTcGVsbENoZWNrV29yZHMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURHRVQgaFdpZGdldCwgZmxvYXQgeCwgZmxvYXQgeSwgRlBERl9TVFJJTkdIQU5ETEUqIHN0cmluZ0hhbmRsZSkKLXsKLSAgICBpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCi0gICAgICAgIHJldHVybjsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwKK0ZQREZfV2lkZ2V0X0dldFNwZWxsQ2hlY2tXb3JkcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfU1RSSU5HSEFORExFKiBzdHJpbmdIYW5kbGUpIHsKKyAgaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQorICAgIHJldHVybjsKIAotICAgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKLSAgICBpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJiBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCi0gICAgICAgIHJldHVybjsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OworICBpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJgorICAgICAgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorICAgIHJldHVybjsKIAotICAgIElYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0gQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOwotICAgIGlmIChwWEZBTWVudUhhbmRlciA9PSBOVUxMKQotICAgICAgICByZXR1cm47CisgIElYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0KKyAgICAgIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRYRkFBcHAoKS0+R2V0TWVudUhhbmRsZXIoKTsKKyAgaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCisgICAgcmV0dXJuOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSogc1N1Z2dlc3RXb3JkcyA9IEZYX05FVyBDRlhfQnl0ZVN0cmluZ0FycmF5OwotICAgIENGWF9Qb2ludEYgcHRQb3B1cDsKLSAgICBwdFBvcHVwLnggPSB4OwotICAgIHB0UG9wdXAueSA9IHk7Ci0gICAgcFhGQU1lbnVIYW5kZXItPkdldFN1Z2dlc3RXb3JkcygoSVhGQV9XaWRnZXQqKWhXaWRnZXQsIHB0UG9wdXAsICpzU3VnZ2VzdFdvcmRzKTsKLSAgICAqc3RyaW5nSGFuZGxlID0gKEZQREZfU1RSSU5HSEFORExFKXNTdWdnZXN0V29yZHM7CisgIENGWF9CeXRlU3RyaW5nQXJyYXkqIHNTdWdnZXN0V29yZHMgPSBGWF9ORVcgQ0ZYX0J5dGVTdHJpbmdBcnJheTsKKyAgQ0ZYX1BvaW50RiBwdFBvcHVwOworICBwdFBvcHVwLnggPSB4OworICBwdFBvcHVwLnkgPSB5OworICBwWEZBTWVudUhhbmRlci0+R2V0U3VnZ2VzdFdvcmRzKChJWEZBX1dpZGdldCopaFdpZGdldCwgcHRQb3B1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc1N1Z2dlc3RXb3Jkcyk7CisgICpzdHJpbmdIYW5kbGUgPSAoRlBERl9TVFJJTkdIQU5ETEUpc1N1Z2dlc3RXb3JkczsKIH0KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1N0cmluZ0hhbmRsZUNvdW50cyhGUERGX1NUUklOR0hBTkRMRSBzdHJpbmdIYW5kbGUpCi17Ci0gICAgaWYgKHN0cmluZ0hhbmRsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSogc1N1Z2dlc3RXb3JkcyA9IChDRlhfQnl0ZVN0cmluZ0FycmF5KilzdHJpbmdIYW5kbGU7Ci0gICAgcmV0dXJuIHNTdWdnZXN0V29yZHMtPkdldFNpemUoKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1N0cmluZ0hhbmRsZUNvdW50cyhGUERGX1NUUklOR0hBTkRMRSBzdHJpbmdIYW5kbGUpIHsKKyAgaWYgKHN0cmluZ0hhbmRsZSA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgQ0ZYX0J5dGVTdHJpbmdBcnJheSogc1N1Z2dlc3RXb3JkcyA9IChDRlhfQnl0ZVN0cmluZ0FycmF5KilzdHJpbmdIYW5kbGU7CisgIHJldHVybiBzU3VnZ2VzdFdvcmRzLT5HZXRTaXplKCk7CiB9Ci1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TdHJpbmdIYW5kbGVHZXRTdHJpbmdCeUluZGV4KEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSwgaW50IGluZGV4LCBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LCBGUERGX0RXT1JEKiBzaXplKQotewotICAgIGlmIChzdHJpbmdIYW5kbGUgPT0gTlVMTCB8fCBzaXplID09IE5VTEwpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBpbnQgY291bnQgPSBGUERGX1N0cmluZ0hhbmRsZUNvdW50cyhzdHJpbmdIYW5kbGUpOwotICAgIGlmIChpbmRleCA8IDB8fCBpbmRleCA+PSBjb3VudCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX1N0cmluZ0hhbmRsZUdldFN0cmluZ0J5SW5kZXgoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQqIHNpemUpIHsKKyAgaWYgKHN0cmluZ0hhbmRsZSA9PSBOVUxMIHx8IHNpemUgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGludCBjb3VudCA9IEZQREZfU3RyaW5nSGFuZGxlQ291bnRzKHN0cmluZ0hhbmRsZSk7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gY291bnQpCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSBzU3VnZ2VzdFdvcmRzID0gKihDRlhfQnl0ZVN0cmluZ0FycmF5KilzdHJpbmdIYW5kbGU7Ci0gICAgaW50IGxlbiA9IHNTdWdnZXN0V29yZHNbaW5kZXhdLkdldExlbmd0aCgpOworICBDRlhfQnl0ZVN0cmluZ0FycmF5IHNTdWdnZXN0V29yZHMgPSAqKENGWF9CeXRlU3RyaW5nQXJyYXkqKXN0cmluZ0hhbmRsZTsKKyAgaW50IGxlbiA9IHNTdWdnZXN0V29yZHNbaW5kZXhdLkdldExlbmd0aCgpOwogCi0gICAgaWYgKGJzVGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgICpzaXplID0gbGVuOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICBpbnQgcmVhbF9zaXplID0gbGVuIDwgKnNpemUgPyBsZW4gOiAqc2l6ZTsKLSAgICBpZiAocmVhbF9zaXplID4gMCkKLSAgICAgICAgRlhTWVNfbWVtY3B5KCh2b2lkKilic1RleHQsIChjb25zdCBGWF9DSEFSKikoc1N1Z2dlc3RXb3Jkc1tpbmRleF0pLCByZWFsX3NpemUpOwotICAgICpzaXplID0gcmVhbF9zaXplOwotCisgIGlmIChic1RleHQgPT0gTlVMTCkgeworICAgICpzaXplID0gbGVuOwogICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaW50IHJlYWxfc2l6ZSA9IGxlbiA8ICpzaXplID8gbGVuIDogKnNpemU7CisgIGlmIChyZWFsX3NpemUgPiAwKQorICAgIEZYU1lTX21lbWNweSgodm9pZCopYnNUZXh0LCAoY29uc3QgRlhfQ0hBUiopKHNTdWdnZXN0V29yZHNbaW5kZXhdKSwKKyAgICAgICAgICAgICAgICAgcmVhbF9zaXplKTsKKyAgKnNpemUgPSByZWFsX3NpemU7CisKKyAgcmV0dXJuIFRSVUU7CiB9Ci1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU3RyaW5nSGFuZGxlUmVsZWFzZShGUERGX1NUUklOR0hBTkRMRSBzdHJpbmdIYW5kbGUpCi17Ci0gICAgaWYgKHN0cmluZ0hhbmRsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0gICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSogc1N1Z2dlc3RXb3JkcyA9IChDRlhfQnl0ZVN0cmluZ0FycmF5KilzdHJpbmdIYW5kbGU7Ci0gICAgZGVsZXRlIHNTdWdnZXN0V29yZHM7CitETExFWFBPUlQgdm9pZCBTVERDQUxMCitGUERGX1N0cmluZ0hhbmRsZVJlbGVhc2UoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlKSB7CisgIGlmIChzdHJpbmdIYW5kbGUgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIENGWF9CeXRlU3RyaW5nQXJyYXkqIHNTdWdnZXN0V29yZHMgPSAoQ0ZYX0J5dGVTdHJpbmdBcnJheSopc3RyaW5nSGFuZGxlOworICBkZWxldGUgc1N1Z2dlc3RXb3JkczsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfU3RyaW5nSGFuZGxlQWRkU3RyaW5nKEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSwgRlBERl9CWVRFU1RSSU5HIGJzVGV4dCwgRlBERl9EV09SRCBzaXplKQotewotICAgIGlmIChzdHJpbmdIYW5kbGUgPT0gTlVMTCB8fCBic1RleHQgPT0gTlVMTCB8fCBzaXplIDw9IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERl9TdHJpbmdIYW5kbGVBZGRTdHJpbmcoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIGJzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgc2l6ZSkgeworICBpZiAoc3RyaW5nSGFuZGxlID09IE5VTEwgfHwgYnNUZXh0ID09IE5VTEwgfHwgc2l6ZSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKIAotICAgIENGWF9CeXRlU3RyaW5nQXJyYXkqIHN0cmluZ0FyciA9IChDRlhfQnl0ZVN0cmluZ0FycmF5KilzdHJpbmdIYW5kbGU7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNTdHIoYnNUZXh0LCBzaXplKTsKKyAgQ0ZYX0J5dGVTdHJpbmdBcnJheSogc3RyaW5nQXJyID0gKENGWF9CeXRlU3RyaW5nQXJyYXkqKXN0cmluZ0hhbmRsZTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNTdHIoYnNUZXh0LCBzaXplKTsKIAotICAgIHN0cmluZ0Fyci0+QWRkKGJzU3RyKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgc3RyaW5nQXJyLT5BZGQoYnNTdHIpOworICByZXR1cm4gVFJVRTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBpbnQgZmllbGRUeXBlLCB1bnNpZ25lZCBsb25nIGNvbG9yKQotewotICAgIGlmIChDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IEZvcm1IYW5kbGVUb0ludGVyRm9ybShoSGFuZGxlKSkKLSAgICAgICAgcEludGVyRm9ybS0+U2V0SGlnaGxpZ2h0Q29sb3IoY29sb3IsIGZpZWxkVHlwZSk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0Q29sb3IoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvbG9yKSB7CisgIGlmIChDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IEZvcm1IYW5kbGVUb0ludGVyRm9ybShoSGFuZGxlKSkKKyAgICBwSW50ZXJGb3JtLT5TZXRIaWdobGlnaHRDb2xvcihjb2xvciwgZmllbGRUeXBlKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodEFscGhhKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCB1bnNpZ25lZCBjaGFyIGFscGhhKQotewotICAgIGlmIChDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IEZvcm1IYW5kbGVUb0ludGVyRm9ybShoSGFuZGxlKSkKLSAgICAgICAgcEludGVyRm9ybS0+U2V0SGlnaGxpZ2h0QWxwaGEoYWxwaGEpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodEFscGhhKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYWxwaGEpIHsKKyAgaWYgKENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gRm9ybUhhbmRsZVRvSW50ZXJGb3JtKGhIYW5kbGUpKQorICAgIHBJbnRlckZvcm0tPlNldEhpZ2hsaWdodEFscGhhKGFscGhhKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbW92ZUZvcm1GaWVsZEhpZ2hsaWdodChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkKLXsKLSAgICBpZiAoQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBGb3JtSGFuZGxlVG9JbnRlckZvcm0oaEhhbmRsZSkpCi0gICAgICAgIHBJbnRlckZvcm0tPlJlbW92ZUFsbEhpZ2hMaWdodCgpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbW92ZUZvcm1GaWVsZEhpZ2hsaWdodChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgeworICBpZiAoQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBGb3JtSGFuZGxlVG9JbnRlckZvcm0oaEhhbmRsZSkpCisgICAgcEludGVyRm9ybS0+UmVtb3ZlQWxsSGlnaExpZ2h0KCk7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKQotewotICAgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKSkKLSAgICAgICAgcFBhZ2VWaWV3LT5TZXRWYWxpZChUUlVFKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CisgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKSkKKyAgICBwUGFnZVZpZXctPlNldFZhbGlkKFRSVUUpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fT25CZWZvcmVDbG9zZVBhZ2UoRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKQotewotICAgIGlmICghaEhhbmRsZSB8fCAhcGFnZSkKLSAgICAgICAgcmV0dXJuOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX09uQmVmb3JlQ2xvc2VQYWdlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CisgIGlmICghaEhhbmRsZSB8fCAhcGFnZSkKKyAgICByZXR1cm47CiAKLSAgICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0U0RLRG9jdW1lbnQoKTsKLSAgICBpZiAoIXBTREtEb2MpCi0gICAgICAgIHJldHVybjsKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldFNES0RvY3VtZW50KCk7CisgIGlmICghcFNES0RvYykKKyAgICByZXR1cm47CiAKLSAgICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gKENQREZYRkFfUGFnZSopcGFnZTsKLSAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLRG9jLT5HZXRQYWdlVmlldyhwUGFnZSwgRkFMU0UpOwotICAgIGlmIChwUGFnZVZpZXcpCi0gICAgewotICAgICAgICBwUGFnZVZpZXctPlNldFZhbGlkKEZBTFNFKTsKLSAgICAgICAgLy8gUmVNb3ZlUGFnZVZpZXcoKSB0YWtlcyBjYXJlIG9mIHRoZSBkZWxldGUgZm9yIHVzLgotICAgICAgICBwU0RLRG9jLT5SZU1vdmVQYWdlVmlldyhwUGFnZSk7CisgIENQREZYRkFfUGFnZSogcFBhZ2UgPSAoQ1BERlhGQV9QYWdlKilwYWdlOworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLRG9jLT5HZXRQYWdlVmlldyhwUGFnZSwgRkFMU0UpOworICBpZiAocFBhZ2VWaWV3KSB7CisgICAgcFBhZ2VWaWV3LT5TZXRWYWxpZChGQUxTRSk7CisgICAgLy8gUmVNb3ZlUGFnZVZpZXcoKSB0YWtlcyBjYXJlIG9mIHRoZSBkZWxldGUgZm9yIHVzLgorICAgIHBTREtEb2MtPlJlTW92ZVBhZ2VWaWV3KHBQYWdlKTsKKyAgfQorfQorCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9Eb2N1bWVudEpTQWN0aW9uKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBGb3JtSGFuZGxlVG9TREtEb2MoaEhhbmRsZSk7CisgIGlmIChwU0RLRG9jICYmICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPklzSlNJbml0aWF0ZWQoKSkKKyAgICBwU0RLRG9jLT5Qcm9jSmF2YXNjcmlwdEZ1bigpOworfQorCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9Eb2N1bWVudE9wZW5BY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUpIHsKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IEZvcm1IYW5kbGVUb1NES0RvYyhoSGFuZGxlKTsKKyAgaWYgKHBTREtEb2MgJiYgKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+SXNKU0luaXRpYXRlZCgpKQorICAgIHBTREtEb2MtPlByb2NPcGVuQWN0aW9uKCk7Cit9CisKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50QUFjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWFUeXBlKSB7CisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBGb3JtSGFuZGxlVG9TREtEb2MoaEhhbmRsZSk7CisgIGlmICghcFNES0RvYykKKyAgICByZXR1cm47CisKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWMgPSBwRG9jLT5HZXRSb290KCk7CisgIGlmICghcERpYykKKyAgICByZXR1cm47CisgIENQREZfQUFjdGlvbiBhYSA9IHBEaWMtPkdldERpY3QoRlhfQlNUUkMoIkFBIikpOworICBpZiAoYWEuQWN0aW9uRXhpc3QoKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUpYWFUeXBlKSkgeworICAgIENQREZfQWN0aW9uIGFjdGlvbiA9IGFhLkdldEFjdGlvbigoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSlhYVR5cGUpOworICAgIENQREZTREtfQWN0aW9uSGFuZGxlciogcEFjdGlvbkhhbmRsZXIgPQorICAgICAgICAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRBY3Rpb25IYW5kZXIoKTsKKyAgICBBU1NFUlQocEFjdGlvbkhhbmRsZXIgIT0gTlVMTCk7CisgICAgcEFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX0RvY3VtZW50KGFjdGlvbiwgKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUpYWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0RLRG9jKTsKKyAgfQorfQorCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9QYWdlQUFjdGlvbihGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFhVHlwZSkgeworICBpZiAoIWhIYW5kbGUgfHwgIXBhZ2UpCisgICAgcmV0dXJuOworICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IChDUERGWEZBX1BhZ2UqKXBhZ2U7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBTREtEb2MtPkdldFBhZ2VWaWV3KHBQYWdlLCBGQUxTRSk7CisgIGlmIChwUGFnZVZpZXcpIHsKKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcFNES0RvYy0+R2V0RW52KCk7CisgICAgQ1BERlNES19BY3Rpb25IYW5kbGVyKiBwQWN0aW9uSGFuZGxlciA9IHBFbnYtPkdldEFjdGlvbkhhbmRlcigpOworICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPkdldFBERlBhZ2UoKS0+bV9wRm9ybURpY3Q7CisgICAgQ1BERl9BQWN0aW9uIGFhID0gcFBhZ2VEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJBQSIpKTsKKworICAgIEZYX0JPT0wgYkV4aXN0T0FBY3Rpb24gPSBGQUxTRTsKKyAgICBGWF9CT09MIGJFeGlzdENBQWN0aW9uID0gRkFMU0U7CisgICAgaWYgKEZQREZQQUdFX0FBQ1RJT05fT1BFTiA9PSBhYVR5cGUpIHsKKyAgICAgIGJFeGlzdE9BQWN0aW9uID0gYWEuQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpPcGVuUGFnZSk7CisgICAgICBpZiAoYkV4aXN0T0FBY3Rpb24pIHsKKyAgICAgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYWEuR2V0QWN0aW9uKENQREZfQUFjdGlvbjo6T3BlblBhZ2UpOworICAgICAgICBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fUGFnZShhY3Rpb24sIENQREZfQUFjdGlvbjo6T3BlblBhZ2UsIHBTREtEb2MpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBiRXhpc3RDQUFjdGlvbiA9IGFhLkFjdGlvbkV4aXN0KENQREZfQUFjdGlvbjo6Q2xvc2VQYWdlKTsKKyAgICAgIGlmIChiRXhpc3RDQUFjdGlvbikgeworICAgICAgICBDUERGX0FjdGlvbiBhY3Rpb24gPSBhYS5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpDbG9zZVBhZ2UpOworICAgICAgICBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fUGFnZShhY3Rpb24sIENQREZfQUFjdGlvbjo6Q2xvc2VQYWdlLCBwU0RLRG9jKTsKKyAgICAgIH0KICAgICB9Ci19Ci0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50SlNBY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUpCi17Ci0gICAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IEZvcm1IYW5kbGVUb1NES0RvYyhoSGFuZGxlKTsKLSAgICBpZiAocFNES0RvYyAmJiAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5Jc0pTSW5pdGlhdGVkKCkpCi0gICAgICAgIHBTREtEb2MtPlByb2NKYXZhc2NyaXB0RnVuKCk7Ci19Ci0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkKLXsKLSAgICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gRm9ybUhhbmRsZVRvU0RLRG9jKGhIYW5kbGUpOwotICAgIGlmIChwU0RLRG9jICYmICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPklzSlNJbml0aWF0ZWQoKSkKLSAgICAgICAgcFNES0RvYy0+UHJvY09wZW5BY3Rpb24oKTsKLX0KLQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX0RvRG9jdW1lbnRBQWN0aW9uKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBpbnQgYWFUeXBlKQotewotICAgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBGb3JtSGFuZGxlVG9TREtEb2MoaEhhbmRsZSk7Ci0gICAgaWYgKCFwU0RLRG9jKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljID0gcERvYy0+R2V0Um9vdCgpOwotICAgIGlmICghcERpYykKLSAgICAgICAgcmV0dXJuOwotICAgIENQREZfQUFjdGlvbiBhYSA9IHBEaWMtPkdldERpY3QoRlhfQlNUUkMoIkFBIikpOwotICAgIGlmKGFhLkFjdGlvbkV4aXN0KChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlKWFhVHlwZSkpCi0gICAgewotICAgICAgICBDUERGX0FjdGlvbiBhY3Rpb24gPSBhYS5HZXRBY3Rpb24oKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUpYWFUeXBlKTsKLSAgICAgICAgQ1BERlNES19BY3Rpb25IYW5kbGVyICpwQWN0aW9uSGFuZGxlciA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldEFjdGlvbkhhbmRlcigpOwotICAgICAgICBBU1NFUlQocEFjdGlvbkhhbmRsZXIgIT0gTlVMTCk7Ci0gICAgICAgIHBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9Eb2N1bWVudChhY3Rpb24sIChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlKWFhVHlwZSwgcFNES0RvYyk7Ci0gICAgfQotfQotCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9QYWdlQUFjdGlvbihGUERGX1BBR0UgcGFnZSwgRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIGludCBhYVR5cGUpCi17Ci0gICAgaWYoIWhIYW5kbGUgfHwgIXBhZ2UpCi0gICAgICAgIHJldHVybjsKLSAgICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0U0RLRG9jdW1lbnQoKTsKLSAgICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gKENQREZYRkFfUGFnZSopcGFnZTsKLSAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLRG9jLT5HZXRQYWdlVmlldyhwUGFnZSwgRkFMU0UpOwotICAgIGlmKHBQYWdlVmlldykKLSAgICB7Ci0gICAgICAgIENQREZEb2NfRW52aXJvbm1lbnQgKnBFbnYgPSBwU0RLRG9jLT5HZXRFbnYoKTsKLSAgICAgICAgQ1BERlNES19BY3Rpb25IYW5kbGVyICpwQWN0aW9uSGFuZGxlciA9IHBFbnYtPkdldEFjdGlvbkhhbmRlcigpOwotICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBQYWdlRGljdCA9IHBQYWdlLT5HZXRQREZQYWdlKCktPm1fcEZvcm1EaWN0OwotICAgICAgICBDUERGX0FBY3Rpb24gYWEgPSBwUGFnZURpY3QtPkdldERpY3QoRlhfQlNUUkMoIkFBIikpOwotCi0gICAgICAgIEZYX0JPT0wgYkV4aXN0T0FBY3Rpb24gPSBGQUxTRTsKLSAgICAgICAgRlhfQk9PTCBiRXhpc3RDQUFjdGlvbiA9IEZBTFNFOwotICAgICAgICBpZiAoRlBERlBBR0VfQUFDVElPTl9PUEVOID09IGFhVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgYkV4aXN0T0FBY3Rpb24gPSBhYS5BY3Rpb25FeGlzdChDUERGX0FBY3Rpb246Ok9wZW5QYWdlKTsKLSAgICAgICAgICAgIGlmIChiRXhpc3RPQUFjdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDUERGX0FjdGlvbiBhY3Rpb24gPSBhYS5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpPcGVuUGFnZSk7Ci0gICAgICAgICAgICAgICAgcEFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX1BhZ2UoYWN0aW9uLCBDUERGX0FBY3Rpb246Ok9wZW5QYWdlLCBwU0RLRG9jKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJFeGlzdENBQWN0aW9uID0gYWEuQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpDbG9zZVBhZ2UpOwotICAgICAgICAgICAgaWYgKGJFeGlzdENBQWN0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENQREZfQWN0aW9uIGFjdGlvbiA9IGFhLkdldEFjdGlvbihDUERGX0FBY3Rpb246OkNsb3NlUGFnZSk7Ci0gICAgICAgICAgICAgICAgcEFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX1BhZ2UoYWN0aW9uLCBDUERGX0FBY3Rpb246OkNsb3NlUGFnZSwgcFNES0RvYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZmb3JtZmlsbF9lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmZvcm1maWxsX2VtYmVkZGVydGVzdC5jcHAKaW5kZXggMWMzODc3MC4uNmJhYWQxMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZmZvcm1maWxsX2VtYmVkZGVydGVzdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmZvcm1maWxsX2VtYmVkZGVydGVzdC5jcHAKQEAgLTIsNyArMiw2IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0KICNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgogI2luY2x1ZGUgIi4uLy4uL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgogI2luY2x1ZGUgIi4uLy4uL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF9tb2NrX2RlbGVnYXRlLmgiCkBAIC0xMyw4ICsxMiw3IEBACiB1c2luZyB0ZXN0aW5nOjpfOwogdXNpbmcgdGVzdGluZzo6UmV0dXJuOwogCi1jbGFzcyBGUERGRm9ybUZpbGxFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHsKLX07CitjbGFzcyBGUERGRm9ybUZpbGxFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHt9OwogCiBURVNUX0YoRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0LCBGaXJzdFRlc3QpIHsKICAgRW1iZWRkZXJUZXN0TW9ja0RlbGVnYXRlIG1vY2s7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmcHBvLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCmluZGV4IDkzNzY2ZWUuLmQzODk5MTUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCkBAIC04LDQ1NSArOCw0MTkgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiCiAKLWNsYXNzIENQREZfUGFnZU9yZ2FuaXplcgotewotcHVibGljOgotICAgIENQREZfUGFnZU9yZ2FuaXplcigpOwotICAgIH5DUERGX1BhZ2VPcmdhbml6ZXIoKTsKK2NsYXNzIENQREZfUGFnZU9yZ2FuaXplciB7CisgcHVibGljOgorICBDUERGX1BhZ2VPcmdhbml6ZXIoKTsKKyAgfkNQREZfUGFnZU9yZ2FuaXplcigpOwogCi1wdWJsaWM6Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICBQREZEb2NJbml0KENQREZfRG9jdW1lbnQgKnBEZXN0UERGRG9jLCBDUERGX0RvY3VtZW50ICpwU3JjUERGRG9jKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgIEV4cG9ydFBhZ2UoQ1BERl9Eb2N1bWVudCAqcFNyY1BERkRvYywgQ0ZYX1dvcmRBcnJheSogblBhZ2VOdW0sIENQREZfRG9jdW1lbnQgKnBEZXN0UERGRG9jLCBpbnQgbkluZGV4KTsKLSAgICBDUERGX09iamVjdCogICAgICAgIFBhZ2VEaWN0R2V0SW5oZXJpdGFibGVUYWcoQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCwgQ0ZYX0J5dGVTdHJpbmcgblNyY3RhZyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICBVcGRhdGVSZWZlcmVuY2UoQ1BERl9PYmplY3QgKnBPYmosIENQREZfRG9jdW1lbnQgKnBEb2MsIENGWF9NYXBQdHJUb1B0ciogcE1hcFB0clRvUHRyKTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIEdldE5ld09iaklkKENQREZfRG9jdW1lbnQgKnBEb2MsIENGWF9NYXBQdHJUb1B0ciogcE1hcFB0clRvUHRyLCBDUERGX1JlZmVyZW5jZSAqcFJlZik7Ci0KKyBwdWJsaWM6CisgIEZYX0JPT0wgUERGRG9jSW5pdChDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYywgQ1BERl9Eb2N1bWVudCogcFNyY1BERkRvYyk7CisgIEZYX0JPT0wgRXhwb3J0UGFnZShDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dvcmRBcnJheSogblBhZ2VOdW0sCisgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYywKKyAgICAgICAgICAgICAgICAgICAgIGludCBuSW5kZXgpOworICBDUERGX09iamVjdCogUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuU3JjdGFnKTsKKyAgRlhfQk9PTCBVcGRhdGVSZWZlcmVuY2UoQ1BERl9PYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXBQdHJUb1B0ciogcE1hcFB0clRvUHRyKTsKKyAgaW50IEdldE5ld09iaklkKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICBDRlhfTWFwUHRyVG9QdHIqIHBNYXBQdHJUb1B0ciwKKyAgICAgICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmKTsKIH07CiAKK0NQREZfUGFnZU9yZ2FuaXplcjo6Q1BERl9QYWdlT3JnYW5pemVyKCkge30KIAotQ1BERl9QYWdlT3JnYW5pemVyOjpDUERGX1BhZ2VPcmdhbml6ZXIoKQoteworQ1BERl9QYWdlT3JnYW5pemVyOjp+Q1BERl9QYWdlT3JnYW5pemVyKCkge30KIAotfQorRlhfQk9PTCBDUERGX1BhZ2VPcmdhbml6ZXI6OlBERkRvY0luaXQoQ1BERl9Eb2N1bWVudCogcERlc3RQREZEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jKSB7CisgIGlmICghcERlc3RQREZEb2MgfHwgIXBTcmNQREZEb2MpCisgICAgcmV0dXJuIGZhbHNlOwogCi1DUERGX1BhZ2VPcmdhbml6ZXI6On5DUERGX1BhZ2VPcmdhbml6ZXIoKQotewotCi19Ci0KLUZYX0JPT0wgQ1BERl9QYWdlT3JnYW5pemVyOjpQREZEb2NJbml0KENQREZfRG9jdW1lbnQgKnBEZXN0UERGRG9jLCBDUERGX0RvY3VtZW50ICpwU3JjUERGRG9jKQotewotICAgIGlmKCFwRGVzdFBERkRvYyB8fCAhcFNyY1BERkRvYykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwTmV3Um9vdCA9IHBEZXN0UERGRG9jLT5HZXRSb290KCk7Ci0gICAgaWYoIXBOZXdSb290KSAgIHJldHVybiBGQUxTRTsKLQotICAgIC8vU2V0IHRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBDUERGX0RpY3Rpb25hcnkqIERJbmZvRGljdCA9IHBEZXN0UERGRG9jLT5HZXRJbmZvKCk7Ci0KLSAgICBpZighREluZm9EaWN0KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyBwcm9kdWNlcnN0cjsKLSAgICBwcm9kdWNlcnN0ci5Gb3JtYXQoIlBERml1bSIpOwotICAgIERJbmZvRGljdC0+U2V0QXQoIlByb2R1Y2VyIiwgbmV3IENQREZfU3RyaW5nKHByb2R1Y2Vyc3RyKSk7Ci0KLSAgICAvL1NldCB0eXBlLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIENGWF9CeXRlU3RyaW5nIGNiUm9vdFR5cGUgPSBwTmV3Um9vdC0+R2V0U3RyaW5nKCJUeXBlIiwiIik7Ci0gICAgaWYoIGNiUm9vdFR5cGUuRXF1YWwoIiIpICkKLSAgICB7Ci0gICAgICAgIHBOZXdSb290LT5TZXRBdCgiVHlwZSIsIG5ldyBDUERGX05hbWUoIkNhdGFsb2ciKSk7Ci0gICAgfQotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwTmV3UGFnZXMgPSAoQ1BERl9EaWN0aW9uYXJ5KikocE5ld1Jvb3QtPkdldEVsZW1lbnQoIlBhZ2VzIik/IHBOZXdSb290LT5HZXRFbGVtZW50KCJQYWdlcyIpLT5HZXREaXJlY3QoKSA6IE5VTEwpOwotICAgIGlmKCFwTmV3UGFnZXMpCi0gICAgewotICAgICAgICBwTmV3UGFnZXMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICBGWF9EV09SRCBOZXdQYWdlc09OID0gcERlc3RQREZEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBOZXdQYWdlcyk7Ci0gICAgICAgIHBOZXdSb290LT5TZXRBdCgiUGFnZXMiLCBuZXcgQ1BERl9SZWZlcmVuY2UocERlc3RQREZEb2MsIE5ld1BhZ2VzT04pKTsKLSAgICB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyBjYlBhZ2VUeXBlID0gcE5ld1BhZ2VzLT5HZXRTdHJpbmcoIlR5cGUiLCIiKTsKLSAgICBpZihjYlBhZ2VUeXBlLkVxdWFsKCIiKSkKLSAgICB7Ci0gICAgICAgIHBOZXdQYWdlcy0+U2V0QXQoIlR5cGUiLCBuZXcgQ1BERl9OYW1lKCJQYWdlcyIpKTsKLSAgICB9Ci0KLSAgICBDUERGX0FycmF5KiBwS2V5c0FycmF5ID0gcE5ld1BhZ2VzLT5HZXRBcnJheSgiS2lkcyIpOwotICAgIGlmKHBLZXlzQXJyYXkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBOZXdLaWRzID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgIEZYX0RXT1JEIEtpZHNvYmpudW0gPSAtMTsKLSAgICAgICAgS2lkc29iam51bSA9IHBEZXN0UERGRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwTmV3S2lkcyk7Ly8sIEtpZHNvYmpudW0sIEtpZHNnZW5udW0pOwotCi0gICAgICAgIHBOZXdQYWdlcy0+U2V0QXQoIktpZHMiLCBuZXcgQ1BERl9SZWZlcmVuY2UocERlc3RQREZEb2MsIEtpZHNvYmpudW0pKTsvLywgS2lkc2dlbm51bSkpOwotICAgICAgICBwTmV3UGFnZXMtPlNldEF0KCJDb3VudCIsIG5ldyBDUERGX051bWJlcigwKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUZYX0JPT0wgQ1BERl9QYWdlT3JnYW5pemVyOjpFeHBvcnRQYWdlKENQREZfRG9jdW1lbnQgKnBTcmNQREZEb2MsIENGWF9Xb3JkQXJyYXkqIG5QYWdlTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCAqcERlc3RQREZEb2MsaW50IG5JbmRleCkKLXsKLSAgICBpbnQgY3VycGFnZSA9bkluZGV4OwotCi0gICAgQ0ZYX01hcFB0clRvUHRyKiBwTWFwUHRyVG9QdHIgPSBuZXcgQ0ZYX01hcFB0clRvUHRyOwotICAgIHBNYXBQdHJUb1B0ci0+SW5pdEhhc2hUYWJsZSgxMDAxKTsKLQotICAgIGZvcihpbnQgaT0wOyBpPG5QYWdlTnVtLT5HZXRTaXplKCk7IGkrKykKLSAgICB7Ci0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ3VyUGFnZURpY3QgPSBwRGVzdFBERkRvYy0+Q3JlYXRlTmV3UGFnZShjdXJwYWdlKTsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3JjUGFnZURpY3QgPSBwU3JjUERGRG9jLT5HZXRQYWdlKG5QYWdlTnVtLT5HZXRBdChpKS0xKTsKLSAgICAgICAgaWYoIXBTcmNQYWdlRGljdCB8fCAhcEN1clBhZ2VEaWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGUgcE1hcFB0clRvUHRyOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xvbmUgdGhlIHBhZ2UgZGljdGlvbmFyeS8vLy8vLy8vLy8vCi0gICAgICAgIEZYX1BPU0lUSU9OIFNyY1BvcyA9IHBTcmNQYWdlRGljdC0+R2V0U3RhcnRQb3MoKTsKLSAgICAgICAgd2hpbGUgKFNyY1BvcykKLSAgICAgICAgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY2JTcmNLZXlTdHI7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBTcmNQYWdlRGljdC0+R2V0TmV4dEVsZW1lbnQoU3JjUG9zLCBjYlNyY0tleVN0cik7Ci0gICAgICAgICAgICBpZihjYlNyY0tleVN0ci5Db21wYXJlKCgiVHlwZSIpKSAmJiBjYlNyY0tleVN0ci5Db21wYXJlKCgiUGFyZW50IikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHBDdXJQYWdlRGljdC0+S2V5RXhpc3QoY2JTcmNLZXlTdHIpKQotICAgICAgICAgICAgICAgICAgICBwQ3VyUGFnZURpY3QtPlJlbW92ZUF0KGNiU3JjS2V5U3RyKTsKLSAgICAgICAgICAgICAgICBwQ3VyUGFnZURpY3QtPlNldEF0KGNiU3JjS2V5U3RyLCBwT2JqLT5DbG9uZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vaW5oZXJpdGFibGUgaXRlbS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIENQREZfT2JqZWN0KiBwSW5oZXJpdGFibGUgPSBOVUxMOwotICAgICAgICAvLzEgTWVkaWFCb3ggIC8vcmVxdWlyZWQKLSAgICAgICAgaWYoIXBDdXJQYWdlRGljdC0+S2V5RXhpc3QoIk1lZGlhQm94IikpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgcEluaGVyaXRhYmxlID0gUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhwU3JjUGFnZURpY3QsICJNZWRpYUJveCIpOwotICAgICAgICAgICAgaWYoIXBJbmhlcml0YWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL1NlYXJjaCB0aGUgIkNyb3BCb3giIGZyb20gc291cmNlIHBhZ2UgZGljdGlvbmFyeSwgaWYgbm90IGV4aXN0cyx3ZSB0YWtlIHRoZSBsZXR0ZXIgc2l6ZS4KLSAgICAgICAgICAgICAgICBwSW5oZXJpdGFibGUgPSBQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKHBTcmNQYWdlRGljdCwgIkNyb3BCb3giKTsKLSAgICAgICAgICAgICAgICBpZihwSW5oZXJpdGFibGUpCi0gICAgICAgICAgICAgICAgICAgIHBDdXJQYWdlRGljdC0+U2V0QXQoIk1lZGlhQm94IiwgcEluaGVyaXRhYmxlLT5DbG9uZSgpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL01ha2UgdGhlIGRlZmF1bHQgc2l6ZSB0byBiZSBsZXR0ZXIgc2l6ZSAoOC41J3gxMScpCi0gICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICAgICAgICAgICAgICBwQXJyYXktPkFkZE51bWJlcigwKTsKLSAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGROdW1iZXIoMCk7Ci0gICAgICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkTnVtYmVyKDYxMik7Ci0gICAgICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkTnVtYmVyKDc5Mik7Ci0gICAgICAgICAgICAgICAgICAgIHBDdXJQYWdlRGljdC0+U2V0QXQoIk1lZGlhQm94IiwgcEFycmF5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcEN1clBhZ2VEaWN0LT5TZXRBdCgiTWVkaWFCb3giLCBwSW5oZXJpdGFibGUtPkNsb25lKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vMiBSZXNvdXJjZXMgLy9yZXF1aXJlZAotICAgICAgICBpZighcEN1clBhZ2VEaWN0LT5LZXlFeGlzdCgiUmVzb3VyY2VzIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbmhlcml0YWJsZSA9IFBhZ2VEaWN0R2V0SW5oZXJpdGFibGVUYWcocFNyY1BhZ2VEaWN0LCAiUmVzb3VyY2VzIik7Ci0gICAgICAgICAgICBpZighcEluaGVyaXRhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBwTWFwUHRyVG9QdHI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEN1clBhZ2VEaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcEluaGVyaXRhYmxlLT5DbG9uZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLzMgQ3JvcEJveCAgLy9PcHRpb25hbAotICAgICAgICBpZighcEN1clBhZ2VEaWN0LT5LZXlFeGlzdCgiQ3JvcEJveCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5oZXJpdGFibGUgPSBQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKHBTcmNQYWdlRGljdCwgIkNyb3BCb3giKTsKLSAgICAgICAgICAgIGlmKHBJbmhlcml0YWJsZSkKLSAgICAgICAgICAgICAgICBwQ3VyUGFnZURpY3QtPlNldEF0KCJDcm9wQm94IiwgcEluaGVyaXRhYmxlLT5DbG9uZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLzQgUm90YXRlICAvL09wdGlvbmFsCi0gICAgICAgIGlmKCFwQ3VyUGFnZURpY3QtPktleUV4aXN0KCJSb3RhdGUiKSkKLSAgICAgICAgewotICAgICAgICAgICAgcEluaGVyaXRhYmxlID0gUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhwU3JjUGFnZURpY3QsICJSb3RhdGUiKTsKLSAgICAgICAgICAgIGlmKHBJbmhlcml0YWJsZSkKLSAgICAgICAgICAgICAgICBwQ3VyUGFnZURpY3QtPlNldEF0KCJSb3RhdGUiLCBwSW5oZXJpdGFibGUtPkNsb25lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vVXBkYXRlIHRoZSByZWZlcmVuY2UKLSAgICAgICAgRlhfRFdPUkQgZHdPbGRQYWdlT2JqID0gcFNyY1BhZ2VEaWN0LT5HZXRPYmpOdW0oKTsKLSAgICAgICAgRlhfRFdPUkQgZHdOZXdQYWdlT2JqID0gcEN1clBhZ2VEaWN0LT5HZXRPYmpOdW0oKTsKLQotICAgICAgICBwTWFwUHRyVG9QdHItPlNldEF0KCh2b2lkKikodWludHB0cl90KWR3T2xkUGFnZU9iaiwgKHZvaWQqKSh1aW50cHRyX3QpZHdOZXdQYWdlT2JqKTsKLQotICAgICAgICBVcGRhdGVSZWZlcmVuY2UocEN1clBhZ2VEaWN0LCBwRGVzdFBERkRvYywgcE1hcFB0clRvUHRyKTsKLSAgICAgICAgY3VycGFnZSsrOwotICAgIH0KLQotICAgIGRlbGV0ZSBwTWFwUHRyVG9QdHI7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUNQREZfT2JqZWN0KiBDUERGX1BhZ2VPcmdhbml6ZXI6OlBhZ2VEaWN0R2V0SW5oZXJpdGFibGVUYWcoQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCwgQ0ZYX0J5dGVTdHJpbmcgblNyY3RhZykKLXsKLSAgICBpZighcERpY3QgfHwgIXBEaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8IG5TcmN0YWcuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIENQREZfT2JqZWN0KiBwVHlwZSA9IHBEaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpOwotICAgIGlmKCFwVHlwZSB8fCBwVHlwZS0+R2V0VHlwZSgpICE9IFBERk9CSl9OQU1FKSAgIHJldHVybiBOVUxMOwotCi0gICAgaWYocFR5cGUtPkdldFN0cmluZygpLkNvbXBhcmUoIlBhZ2UiKSkgIHJldHVybiBOVUxMOwotCi0gICAgaWYoIXBEaWN0LT5LZXlFeGlzdCgiUGFyZW50IikpICByZXR1cm4gTlVMTDsKLSAgICBDUERGX09iamVjdCogcFBhcmVudCA9IHBEaWN0LT5HZXRFbGVtZW50KCJQYXJlbnQiKS0+R2V0RGlyZWN0KCk7Ci0gICAgaWYoIXBQYXJlbnQgfHwgcFBhcmVudC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSByZXR1cm4gTlVMTDsKLQotICAgIENQREZfRGljdGlvbmFyeSogcHAgPSAoQ1BERl9EaWN0aW9uYXJ5KilwUGFyZW50OwotCi0gICAgaWYocERpY3QtPktleUV4aXN0KChjb25zdCBjaGFyKiluU3JjdGFnKSkKLSAgICAgICAgcmV0dXJuIHBEaWN0LT5HZXRFbGVtZW50KChjb25zdCBjaGFyKiluU3JjdGFnKTsKLSAgICB3aGlsZSAocHApCi0gICAgewotICAgICAgICBpZiAocHAtPktleUV4aXN0KChjb25zdCBjaGFyKiluU3JjdGFnKSkKLSAgICAgICAgICAgIHJldHVybiBwcC0+R2V0RWxlbWVudCgoY29uc3QgY2hhciopblNyY3RhZyk7Ci0gICAgICAgIGlmIChwcC0+S2V5RXhpc3QoIlBhcmVudCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcCA9IChDUERGX0RpY3Rpb25hcnkqKXBwLT5HZXRFbGVtZW50KCJQYXJlbnQiKS0+R2V0RGlyZWN0KCk7Ci0gICAgICAgICAgICBpZiAocHAtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVMTCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotRlhfQk9PTCBDUERGX1BhZ2VPcmdhbml6ZXI6OlVwZGF0ZVJlZmVyZW5jZShDUERGX09iamVjdCAqcE9iaiwgQ1BERl9Eb2N1bWVudCAqcERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hcFB0clRvUHRyKiBwTWFwUHRyVG9QdHIpCi17Ci0gICAgc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpCi0gICAgewotICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRToKLSAgICAgICAgewotICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWZlcmVuY2UgPSAoQ1BERl9SZWZlcmVuY2UqKXBPYmo7Ci0gICAgICAgICAgICBpbnQgbmV3b2JqbnVtID0gR2V0TmV3T2JqSWQocERvYywgcE1hcFB0clRvUHRyLCBwUmVmZXJlbmNlKTsKLSAgICAgICAgICAgIGlmIChuZXdvYmpudW0gPT0gMCkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgcFJlZmVyZW5jZS0+U2V0UmVmKHBEb2MsIG5ld29iam51bSk7Ly8sIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBjYXNlIFBERk9CSl9ESUNUSU9OQVJZOgotICAgICAgICB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKLQotICAgICAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gcERpY3QtPkdldFN0YXJ0UG9zKCk7Ci0gICAgICAgICAgICB3aGlsZShwb3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5KCIiKTsKLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE5leHRPYmogPSBwRGljdC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOwotICAgICAgICAgICAgICAgIGlmICghRlhTWVNfc3RyY21wKGtleSwgIlBhcmVudCIpIHx8ICFGWFNZU19zdHJjbXAoa2V5LCAiUHJldiIpIHx8ICFGWFNZU19zdHJjbXAoa2V5LCAiRmlyc3QiKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYocE5leHRPYmopCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZighVXBkYXRlUmVmZXJlbmNlKHBOZXh0T2JqLCBwRG9jLCBwTWFwUHRyVG9QdHIpKQotICAgICAgICAgICAgICAgICAgICAgICAgcERpY3QtPlJlbW92ZUF0KGtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBjYXNlICAgIFBERk9CSl9BUlJBWToKLSAgICAgICAgewotICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBPYmo7Ci0gICAgICAgICAgICBGWF9EV09SRCBjb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCBpID0gMDsgaSA8IGNvdW50OyBpICsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwTmV4dE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpKTsKLSAgICAgICAgICAgICAgICBpZihwTmV4dE9iaikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCFVcGRhdGVSZWZlcmVuY2UocE5leHRPYmosIHBEb2MsIHBNYXBQdHJUb1B0cikpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBjYXNlICAgIFBERk9CSl9TVFJFQU06Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwT2JqOwotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKLSAgICAgICAgICAgIGlmKHBEaWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCFVcGRhdGVSZWZlcmVuY2UocERpY3QsIHBEb2MsIHBNYXBQdHJUb1B0cikpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGRlZmF1bHQ6ICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1pbnQgQ1BERl9QYWdlT3JnYW5pemVyOjpHZXROZXdPYmpJZChDUERGX0RvY3VtZW50ICpwRG9jLCBDRlhfTWFwUHRyVG9QdHIqIHBNYXBQdHJUb1B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlICpwUmVmKQotewotICAgIGlmKCFwUmVmKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHNpemVfdCBkd09iam51bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOwotICAgIHNpemVfdCBkd05ld09iak51bSA9IDA7Ci0KLSAgICBwTWFwUHRyVG9QdHItPkxvb2t1cCgodm9pZCopZHdPYmpudW0sICh2b2lkKiYpZHdOZXdPYmpOdW0pOwotICAgIGlmKGR3TmV3T2JqTnVtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChpbnQpZHdOZXdPYmpOdW07Ci0gICAgfQotCi0gICAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwUmVmLT5HZXREaXJlY3QoKTsKLSAgICBpZighcERpcmVjdCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIENQREZfT2JqZWN0KiBwQ2xvbmUgPSBwRGlyZWN0LT5DbG9uZSgpOwotICAgIGlmKCFwQ2xvbmUpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZihwQ2xvbmUtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkKLSAgICB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3RDbG9uZSA9IChDUERGX0RpY3Rpb25hcnkqKXBDbG9uZTsKLSAgICAgICAgaWYocERpY3RDbG9uZS0+S2V5RXhpc3QoIlR5cGUiKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyVHlwZSA9IHBEaWN0Q2xvbmUtPkdldFN0cmluZygiVHlwZSIpOwotICAgICAgICAgICAgaWYoIUZYU1lTX3N0cmljbXAoc3RyVHlwZSwgIlBhZ2VzIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERpY3RDbG9uZS0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighRlhTWVNfc3RyaWNtcChzdHJUeXBlLCAiUGFnZSIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEaWN0Q2xvbmUtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkd05ld09iak51bSA9IHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBDbG9uZSk7Ci0gICAgcE1hcFB0clRvUHRyLT5TZXRBdCgodm9pZCopZHdPYmpudW0sICh2b2lkKilkd05ld09iak51bSk7Ci0gICAgaWYoIVVwZGF0ZVJlZmVyZW5jZShwQ2xvbmUsIHBEb2MsIHBNYXBQdHJUb1B0cikpCi0gICAgewotICAgICAgICBwQ2xvbmUtPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIChpbnQpZHdOZXdPYmpOdW07Ci19Ci0KLUZQREZfQk9PTCBQYXJzZXJQYWdlUmFuZ2VTdHJpbmcoQ0ZYX0J5dGVTdHJpbmcgcmFuZ3N0cmluZywgQ0ZYX1dvcmRBcnJheSogcGFnZUFycmF5LGludCBuQ291bnQpCi17Ci0gICAgaWYocmFuZ3N0cmluZy5HZXRMZW5ndGgoKSAhPSAwKQotICAgIHsKLSAgICAgICAgcmFuZ3N0cmluZy5SZW1vdmUoJyAnKTsKLSAgICAgICAgaW50IG5MZW5ndGggPSByYW5nc3RyaW5nLkdldExlbmd0aCgpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjYkNvbXBhcmVTdHJpbmcoIjAxMjM0NTY3ODktLCIpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxuTGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGNiQ29tcGFyZVN0cmluZy5GaW5kKHJhbmdzdHJpbmdbaV0pID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjYk1pZFJhbmdlOwotICAgICAgICBpbnQgblN0cmluZ0Zyb20gPSAwOwotICAgICAgICBpbnQgblN0cmluZ1RvPTA7Ci0gICAgICAgIHdoaWxlKG5TdHJpbmdUbyA8IG5MZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5TdHJpbmdUbyA9IHJhbmdzdHJpbmcuRmluZCgnLCcsblN0cmluZ0Zyb20pOwotICAgICAgICAgICAgaWYoblN0cmluZ1RvID09IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5TdHJpbmdUbyA9IG5MZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYk1pZFJhbmdlID0gcmFuZ3N0cmluZy5NaWQoblN0cmluZ0Zyb20sblN0cmluZ1RvLW5TdHJpbmdGcm9tKTsKLQotICAgICAgICAgICAgaW50IG5NaWQgPSBjYk1pZFJhbmdlLkZpbmQoJy0nKTsKLSAgICAgICAgICAgIGlmKG5NaWQgPT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBsUGFnZU51bSA9IGF0b2woY2JNaWRSYW5nZSk7Ci0gICAgICAgICAgICAgICAgaWYobFBhZ2VOdW0gPD0gMCB8fCBsUGFnZU51bSA+IG5Db3VudCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgICAgICAgICAgcGFnZUFycmF5LT5BZGQoKEZYX1dPUkQpbFBhZ2VOdW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBuU3RhcnRQYWdlTnVtID0gYXRvbChjYk1pZFJhbmdlLk1pZCgwLG5NaWQpKTsKLSAgICAgICAgICAgICAgICBpZiAoblN0YXJ0UGFnZU51bSA9PTApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICAgICAgICAgIG5NaWQgPSBuTWlkKzE7Ci0gICAgICAgICAgICAgICAgaW50IG5FbmQgPSBjYk1pZFJhbmdlLkdldExlbmd0aCgpLW5NaWQ7Ci0gICAgICAgICAgICAgICAgaWYgKG5FbmQgPT0wKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICBpbnQgbkVuZFBhZ2VOdW0gPSBhdG9sKGNiTWlkUmFuZ2UuTWlkKG5NaWQsbkVuZCkpOwotICAgICAgICAgICAgICAgIGlmIChuU3RhcnRQYWdlTnVtIDwgMCB8fG5TdGFydFBhZ2VOdW0gPm5FbmRQYWdlTnVtfHwgbkVuZFBhZ2VOdW0gPiBuQ291bnQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IG5JbmRleCA9IG5TdGFydFBhZ2VOdW07IG5JbmRleCA8PSBuRW5kUGFnZU51bTsgKytuSW5kZXgpCi0gICAgICAgICAgICAgICAgICAgIHBhZ2VBcnJheS0+QWRkKG5JbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuU3RyaW5nRnJvbSA9IG5TdHJpbmdUbyArIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0ltcG9ydFBhZ2VzKEZQREZfRE9DVU1FTlQgZGVzdF9kb2MsRlBERl9ET0NVTUVOVCBzcmNfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHBhZ2VyYW5nZSwgaW50IGluZGV4KQotewotICAgIGlmKGRlc3RfZG9jID09IE5VTEwgfHwgc3JjX2RvYyA9PSBOVUxMICkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIENGWF9Xb3JkQXJyYXkgcGFnZUFycmF5OwotICAgIENQREZYRkFfRG9jdW1lbnQqIHBTcmNEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopc3JjX2RvYzsKLSAgICBDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jID0gcFNyY0RvYy0+R2V0UERGRG9jKCk7Ci0gICAgaW50IG5Db3VudCA9IHBTcmNQREZEb2MtPkdldFBhZ2VDb3VudCgpOwotICAgIGlmKHBhZ2VyYW5nZSkKLSAgICB7Ci0gICAgICAgIGlmKFBhcnNlclBhZ2VSYW5nZVN0cmluZyhwYWdlcmFuZ2UsJnBhZ2VBcnJheSxuQ291bnQpID09IEZBTFNFKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IoaW50IGk9MTsgaTw9bkNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhZ2VBcnJheS5BZGQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDUERGWEZBX0RvY3VtZW50KiBwRGVzdERvYyA9IChDUERGWEZBX0RvY3VtZW50KilkZXN0X2RvYzsKLSAgICBDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYyA9IHBEZXN0RG9jLT5HZXRQREZEb2MoKTsKLSAgICBDUERGX1BhZ2VPcmdhbml6ZXIgcGFnZU9yZzsKLQotICAgIHBhZ2VPcmcuUERGRG9jSW5pdChwRGVzdFBERkRvYyxwU3JjUERGRG9jKTsKLQotICAgIGlmKHBhZ2VPcmcuRXhwb3J0UGFnZShwU3JjUERGRG9jLCZwYWdlQXJyYXkscERlc3RQREZEb2MsaW5kZXgpKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwTmV3Um9vdCA9IHBEZXN0UERGRG9jLT5HZXRSb290KCk7CisgIGlmICghcE5ld1Jvb3QpCiAgICAgcmV0dXJuIEZBTFNFOworCisgIC8vIFNldCB0aGUgZG9jdW1lbnQgaW5mb3JtYXRpb24vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgIENQREZfRGljdGlvbmFyeSogREluZm9EaWN0ID0gcERlc3RQREZEb2MtPkdldEluZm8oKTsKKworICBpZiAoIURJbmZvRGljdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgcHJvZHVjZXJzdHI7CisgIHByb2R1Y2Vyc3RyLkZvcm1hdCgiUERGaXVtIik7CisgIERJbmZvRGljdC0+U2V0QXQoIlByb2R1Y2VyIiwgbmV3IENQREZfU3RyaW5nKHByb2R1Y2Vyc3RyKSk7CisKKyAgLy8gU2V0IHR5cGUvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIENGWF9CeXRlU3RyaW5nIGNiUm9vdFR5cGUgPSBwTmV3Um9vdC0+R2V0U3RyaW5nKCJUeXBlIiwgIiIpOworICBpZiAoY2JSb290VHlwZS5FcXVhbCgiIikpIHsKKyAgICBwTmV3Um9vdC0+U2V0QXQoIlR5cGUiLCBuZXcgQ1BERl9OYW1lKCJDYXRhbG9nIikpOworICB9CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwTmV3UGFnZXMgPQorICAgICAgKENQREZfRGljdGlvbmFyeSopKHBOZXdSb290LT5HZXRFbGVtZW50KCJQYWdlcyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcE5ld1Jvb3QtPkdldEVsZW1lbnQoIlBhZ2VzIiktPkdldERpcmVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCk7CisgIGlmICghcE5ld1BhZ2VzKSB7CisgICAgcE5ld1BhZ2VzID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBGWF9EV09SRCBOZXdQYWdlc09OID0gcERlc3RQREZEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBOZXdQYWdlcyk7CisgICAgcE5ld1Jvb3QtPlNldEF0KCJQYWdlcyIsIG5ldyBDUERGX1JlZmVyZW5jZShwRGVzdFBERkRvYywgTmV3UGFnZXNPTikpOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmcgY2JQYWdlVHlwZSA9IHBOZXdQYWdlcy0+R2V0U3RyaW5nKCJUeXBlIiwgIiIpOworICBpZiAoY2JQYWdlVHlwZS5FcXVhbCgiIikpIHsKKyAgICBwTmV3UGFnZXMtPlNldEF0KCJUeXBlIiwgbmV3IENQREZfTmFtZSgiUGFnZXMiKSk7CisgIH0KKworICBDUERGX0FycmF5KiBwS2V5c0FycmF5ID0gcE5ld1BhZ2VzLT5HZXRBcnJheSgiS2lkcyIpOworICBpZiAocEtleXNBcnJheSA9PSBOVUxMKSB7CisgICAgQ1BERl9BcnJheSogcE5ld0tpZHMgPSBuZXcgQ1BERl9BcnJheTsKKyAgICBGWF9EV09SRCBLaWRzb2JqbnVtID0gLTE7CisgICAgS2lkc29iam51bSA9CisgICAgICAgIHBEZXN0UERGRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwTmV3S2lkcyk7ICAvLywgS2lkc29iam51bSwgS2lkc2dlbm51bSk7CisKKyAgICBwTmV3UGFnZXMtPlNldEF0KAorICAgICAgICAiS2lkcyIsIG5ldyBDUERGX1JlZmVyZW5jZShwRGVzdFBERkRvYywgS2lkc29iam51bSkpOyAgLy8sIEtpZHNnZW5udW0pKTsKKyAgICBwTmV3UGFnZXMtPlNldEF0KCJDb3VudCIsIG5ldyBDUERGX051bWJlcigwKSk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfQ29weVZpZXdlclByZWZlcmVuY2VzKEZQREZfRE9DVU1FTlQgZGVzdF9kb2MsIEZQREZfRE9DVU1FTlQgc3JjX2RvYykKLXsKLSAgICBpZihzcmNfZG9jID09IE5VTEwgfHwgZGVzdF9kb2MgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIENQREZYRkFfRG9jdW1lbnQqIHBTcmNEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopc3JjX2RvYzsKLSAgICBDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jID0gcFNyY0RvYy0+R2V0UERGRG9jKCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3JjRGljdCA9IHBTcmNQREZEb2MtPkdldFJvb3QoKTsKLSAgICBwU3JjRGljdCA9IHBTcmNEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpKTsKLSAgICBpZighcFNyY0RpY3QpCitGWF9CT09MIENQREZfUGFnZU9yZ2FuaXplcjo6RXhwb3J0UGFnZShDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dvcmRBcnJheSogblBhZ2VOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRGVzdFBERkRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuSW5kZXgpIHsKKyAgaW50IGN1cnBhZ2UgPSBuSW5kZXg7CisKKyAgQ0ZYX01hcFB0clRvUHRyKiBwTWFwUHRyVG9QdHIgPSBuZXcgQ0ZYX01hcFB0clRvUHRyOworICBwTWFwUHRyVG9QdHItPkluaXRIYXNoVGFibGUoMTAwMSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUGFnZU51bS0+R2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBDdXJQYWdlRGljdCA9IHBEZXN0UERGRG9jLT5DcmVhdGVOZXdQYWdlKGN1cnBhZ2UpOworICAgIENQREZfRGljdGlvbmFyeSogcFNyY1BhZ2VEaWN0ID0gcFNyY1BERkRvYy0+R2V0UGFnZShuUGFnZU51bS0+R2V0QXQoaSkgLSAxKTsKKyAgICBpZiAoIXBTcmNQYWdlRGljdCB8fCAhcEN1clBhZ2VEaWN0KSB7CisgICAgICBkZWxldGUgcE1hcFB0clRvUHRyOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIENsb25lIHRoZSBwYWdlIGRpY3Rpb25hcnkvLy8vLy8vLy8vLworICAgIEZYX1BPU0lUSU9OIFNyY1BvcyA9IHBTcmNQYWdlRGljdC0+R2V0U3RhcnRQb3MoKTsKKyAgICB3aGlsZSAoU3JjUG9zKSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBjYlNyY0tleVN0cjsKKyAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcFNyY1BhZ2VEaWN0LT5HZXROZXh0RWxlbWVudChTcmNQb3MsIGNiU3JjS2V5U3RyKTsKKyAgICAgIGlmIChjYlNyY0tleVN0ci5Db21wYXJlKCgiVHlwZSIpKSAmJiBjYlNyY0tleVN0ci5Db21wYXJlKCgiUGFyZW50IikpKSB7CisgICAgICAgIGlmIChwQ3VyUGFnZURpY3QtPktleUV4aXN0KGNiU3JjS2V5U3RyKSkKKyAgICAgICAgICBwQ3VyUGFnZURpY3QtPlJlbW92ZUF0KGNiU3JjS2V5U3RyKTsKKyAgICAgICAgcEN1clBhZ2VEaWN0LT5TZXRBdChjYlNyY0tleVN0ciwgcE9iai0+Q2xvbmUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gaW5oZXJpdGFibGUgaXRlbS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgQ1BERl9PYmplY3QqIHBJbmhlcml0YWJsZSA9IE5VTEw7CisgICAgLy8gMSBNZWRpYUJveCAgLy9yZXF1aXJlZAorICAgIGlmICghcEN1clBhZ2VEaWN0LT5LZXlFeGlzdCgiTWVkaWFCb3giKSkgeworICAgICAgcEluaGVyaXRhYmxlID0gUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhwU3JjUGFnZURpY3QsICJNZWRpYUJveCIpOworICAgICAgaWYgKCFwSW5oZXJpdGFibGUpIHsKKyAgICAgICAgLy8gU2VhcmNoIHRoZSAiQ3JvcEJveCIgZnJvbSBzb3VyY2UgcGFnZSBkaWN0aW9uYXJ5LCBpZiBub3QgZXhpc3RzLHdlCisgICAgICAgIC8vIHRha2UgdGhlIGxldHRlciBzaXplLgorICAgICAgICBwSW5oZXJpdGFibGUgPSBQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKHBTcmNQYWdlRGljdCwgIkNyb3BCb3giKTsKKyAgICAgICAgaWYgKHBJbmhlcml0YWJsZSkKKyAgICAgICAgICBwQ3VyUGFnZURpY3QtPlNldEF0KCJNZWRpYUJveCIsIHBJbmhlcml0YWJsZS0+Q2xvbmUoKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vIE1ha2UgdGhlIGRlZmF1bHQgc2l6ZSB0byBiZSBsZXR0ZXIgc2l6ZSAoOC41J3gxMScpCisgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgICAgICAgICAgcEFycmF5LT5BZGROdW1iZXIoMCk7CisgICAgICAgICAgcEFycmF5LT5BZGROdW1iZXIoMCk7CisgICAgICAgICAgcEFycmF5LT5BZGROdW1iZXIoNjEyKTsKKyAgICAgICAgICBwQXJyYXktPkFkZE51bWJlcig3OTIpOworICAgICAgICAgIHBDdXJQYWdlRGljdC0+U2V0QXQoIk1lZGlhQm94IiwgcEFycmF5KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlCisgICAgICAgIHBDdXJQYWdlRGljdC0+U2V0QXQoIk1lZGlhQm94IiwgcEluaGVyaXRhYmxlLT5DbG9uZSgpKTsKKyAgICB9CisgICAgLy8gMiBSZXNvdXJjZXMgLy9yZXF1aXJlZAorICAgIGlmICghcEN1clBhZ2VEaWN0LT5LZXlFeGlzdCgiUmVzb3VyY2VzIikpIHsKKyAgICAgIHBJbmhlcml0YWJsZSA9IFBhZ2VEaWN0R2V0SW5oZXJpdGFibGVUYWcocFNyY1BhZ2VEaWN0LCAiUmVzb3VyY2VzIik7CisgICAgICBpZiAoIXBJbmhlcml0YWJsZSkgeworICAgICAgICBkZWxldGUgcE1hcFB0clRvUHRyOwogICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgQ1BERlhGQV9Eb2N1bWVudCogcERzdERvYyA9IChDUERGWEZBX0RvY3VtZW50KilkZXN0X2RvYzsKLSAgICBDUERGX0RvY3VtZW50KiBwRHN0UERGRG9jID0gcERzdERvYy0+R2V0UERGRG9jKCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRHN0RGljdCA9IHBEc3RQREZEb2MtPkdldFJvb3QoKTsKLSAgICBpZighcERzdERpY3QpCisgICAgICB9CisgICAgICBwQ3VyUGFnZURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwSW5oZXJpdGFibGUtPkNsb25lKCkpOworICAgIH0KKyAgICAvLyAzIENyb3BCb3ggIC8vT3B0aW9uYWwKKyAgICBpZiAoIXBDdXJQYWdlRGljdC0+S2V5RXhpc3QoIkNyb3BCb3giKSkgeworICAgICAgcEluaGVyaXRhYmxlID0gUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhwU3JjUGFnZURpY3QsICJDcm9wQm94Iik7CisgICAgICBpZiAocEluaGVyaXRhYmxlKQorICAgICAgICBwQ3VyUGFnZURpY3QtPlNldEF0KCJDcm9wQm94IiwgcEluaGVyaXRhYmxlLT5DbG9uZSgpKTsKKyAgICB9CisgICAgLy8gNCBSb3RhdGUgIC8vT3B0aW9uYWwKKyAgICBpZiAoIXBDdXJQYWdlRGljdC0+S2V5RXhpc3QoIlJvdGF0ZSIpKSB7CisgICAgICBwSW5oZXJpdGFibGUgPSBQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKHBTcmNQYWdlRGljdCwgIlJvdGF0ZSIpOworICAgICAgaWYgKHBJbmhlcml0YWJsZSkKKyAgICAgICAgcEN1clBhZ2VEaWN0LT5TZXRBdCgiUm90YXRlIiwgcEluaGVyaXRhYmxlLT5DbG9uZSgpKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBVcGRhdGUgdGhlIHJlZmVyZW5jZQorICAgIEZYX0RXT1JEIGR3T2xkUGFnZU9iaiA9IHBTcmNQYWdlRGljdC0+R2V0T2JqTnVtKCk7CisgICAgRlhfRFdPUkQgZHdOZXdQYWdlT2JqID0gcEN1clBhZ2VEaWN0LT5HZXRPYmpOdW0oKTsKKworICAgIHBNYXBQdHJUb1B0ci0+U2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdPbGRQYWdlT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSh1aW50cHRyX3QpZHdOZXdQYWdlT2JqKTsKKworICAgIFVwZGF0ZVJlZmVyZW5jZShwQ3VyUGFnZURpY3QsIHBEZXN0UERGRG9jLCBwTWFwUHRyVG9QdHIpOworICAgIGN1cnBhZ2UrKzsKKyAgfQorCisgIGRlbGV0ZSBwTWFwUHRyVG9QdHI7CisgIHJldHVybiBUUlVFOworfQorCitDUERGX09iamVjdCogQ1BERl9QYWdlT3JnYW5pemVyOjpQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKAorICAgIENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgQ0ZYX0J5dGVTdHJpbmcgblNyY3RhZykgeworICBpZiAoIXBEaWN0IHx8ICFwRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fCBuU3JjdGFnLklzRW1wdHkoKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBDUERGX09iamVjdCogcFR5cGUgPSBwRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKTsKKyAgaWYgKCFwVHlwZSB8fCBwVHlwZS0+R2V0VHlwZSgpICE9IFBERk9CSl9OQU1FKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChwVHlwZS0+R2V0U3RyaW5nKCkuQ29tcGFyZSgiUGFnZSIpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghcERpY3QtPktleUV4aXN0KCJQYXJlbnQiKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgQ1BERl9PYmplY3QqIHBQYXJlbnQgPSBwRGljdC0+R2V0RWxlbWVudCgiUGFyZW50IiktPkdldERpcmVjdCgpOworICBpZiAoIXBQYXJlbnQgfHwgcFBhcmVudC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKQorICAgIHJldHVybiBOVUxMOworCisgIENQREZfRGljdGlvbmFyeSogcHAgPSAoQ1BERl9EaWN0aW9uYXJ5KilwUGFyZW50OworCisgIGlmIChwRGljdC0+S2V5RXhpc3QoKGNvbnN0IGNoYXIqKW5TcmN0YWcpKQorICAgIHJldHVybiBwRGljdC0+R2V0RWxlbWVudCgoY29uc3QgY2hhciopblNyY3RhZyk7CisgIHdoaWxlIChwcCkgeworICAgIGlmIChwcC0+S2V5RXhpc3QoKGNvbnN0IGNoYXIqKW5TcmN0YWcpKQorICAgICAgcmV0dXJuIHBwLT5HZXRFbGVtZW50KChjb25zdCBjaGFyKiluU3JjdGFnKTsKKyAgICBpZiAocHAtPktleUV4aXN0KCJQYXJlbnQiKSkgeworICAgICAgcHAgPSAoQ1BERl9EaWN0aW9uYXJ5KilwcC0+R2V0RWxlbWVudCgiUGFyZW50IiktPkdldERpcmVjdCgpOworICAgICAgaWYgKHBwLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTEwpCisgICAgICAgIGJyZWFrOworICAgIH0gZWxzZQorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworRlhfQk9PTCBDUERGX1BhZ2VPcmdhbml6ZXI6OlVwZGF0ZVJlZmVyZW5jZShDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hcFB0clRvUHRyKiBwTWFwUHRyVG9QdHIpIHsKKyAgc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKKyAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmZXJlbmNlID0gKENQREZfUmVmZXJlbmNlKilwT2JqOworICAgICAgaW50IG5ld29iam51bSA9IEdldE5ld09iaklkKHBEb2MsIHBNYXBQdHJUb1B0ciwgcFJlZmVyZW5jZSk7CisgICAgICBpZiAobmV3b2JqbnVtID09IDApCiAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBwRHN0RGljdC0+U2V0QXQoRlhfQlNUUkMoIlZpZXdlclByZWZlcmVuY2VzIiksIHBTcmNEaWN0LT5DbG9uZShUUlVFKSk7CisgICAgICBwUmVmZXJlbmNlLT5TZXRSZWYocERvYywgbmV3b2JqbnVtKTsgIC8vLCAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9ESUNUSU9OQVJZOiB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKKworICAgICAgRlhfUE9TSVRJT04gcG9zID0gcERpY3QtPkdldFN0YXJ0UG9zKCk7CisgICAgICB3aGlsZSAocG9zKSB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleSgiIik7CisgICAgICAgIENQREZfT2JqZWN0KiBwTmV4dE9iaiA9IHBEaWN0LT5HZXROZXh0RWxlbWVudChwb3MsIGtleSk7CisgICAgICAgIGlmICghRlhTWVNfc3RyY21wKGtleSwgIlBhcmVudCIpIHx8ICFGWFNZU19zdHJjbXAoa2V5LCAiUHJldiIpIHx8CisgICAgICAgICAgICAhRlhTWVNfc3RyY21wKGtleSwgIkZpcnN0IikpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChwTmV4dE9iaikgeworICAgICAgICAgIGlmICghVXBkYXRlUmVmZXJlbmNlKHBOZXh0T2JqLCBwRG9jLCBwTWFwUHRyVG9QdHIpKQorICAgICAgICAgICAgcERpY3QtPlJlbW92ZUF0KGtleSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9BUlJBWTogeworICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBPYmo7CisgICAgICBGWF9EV09SRCBjb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIENQREZfT2JqZWN0KiBwTmV4dE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpKTsKKyAgICAgICAgaWYgKHBOZXh0T2JqKSB7CisgICAgICAgICAgaWYgKCFVcGRhdGVSZWZlcmVuY2UocE5leHRPYmosIHBEb2MsIHBNYXBQdHJUb1B0cikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9TVFJFQU06IHsKKyAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwT2JqOworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKKyAgICAgIGlmIChwRGljdCkgeworICAgICAgICBpZiAoIVVwZGF0ZVJlZmVyZW5jZShwRGljdCwgcERvYywgcE1hcFB0clRvUHRyKSkKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitpbnQgQ1BERl9QYWdlT3JnYW5pemVyOjpHZXROZXdPYmpJZChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hcFB0clRvUHRyKiBwTWFwUHRyVG9QdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZikgeworICBpZiAoIXBSZWYpCisgICAgcmV0dXJuIDA7CisKKyAgc2l6ZV90IGR3T2JqbnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CisgIHNpemVfdCBkd05ld09iak51bSA9IDA7CisKKyAgcE1hcFB0clRvUHRyLT5Mb29rdXAoKHZvaWQqKWR3T2JqbnVtLCAodm9pZComKWR3TmV3T2JqTnVtKTsKKyAgaWYgKGR3TmV3T2JqTnVtKSB7CisgICAgcmV0dXJuIChpbnQpZHdOZXdPYmpOdW07CisgIH0KKworICBDUERGX09iamVjdCogcERpcmVjdCA9IHBSZWYtPkdldERpcmVjdCgpOworICBpZiAoIXBEaXJlY3QpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIENQREZfT2JqZWN0KiBwQ2xvbmUgPSBwRGlyZWN0LT5DbG9uZSgpOworICBpZiAoIXBDbG9uZSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHBDbG9uZS0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdENsb25lID0gKENQREZfRGljdGlvbmFyeSopcENsb25lOworICAgIGlmIChwRGljdENsb25lLT5LZXlFeGlzdCgiVHlwZSIpKSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBzdHJUeXBlID0gcERpY3RDbG9uZS0+R2V0U3RyaW5nKCJUeXBlIik7CisgICAgICBpZiAoIUZYU1lTX3N0cmljbXAoc3RyVHlwZSwgIlBhZ2VzIikpIHsKKyAgICAgICAgcERpY3RDbG9uZS0+UmVsZWFzZSgpOworICAgICAgICByZXR1cm4gNDsKKyAgICAgIH0gZWxzZSBpZiAoIUZYU1lTX3N0cmljbXAoc3RyVHlwZSwgIlBhZ2UiKSkgeworICAgICAgICBwRGljdENsb25lLT5SZWxlYXNlKCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGR3TmV3T2JqTnVtID0gcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocENsb25lKTsKKyAgcE1hcFB0clRvUHRyLT5TZXRBdCgodm9pZCopZHdPYmpudW0sICh2b2lkKilkd05ld09iak51bSk7CisgIGlmICghVXBkYXRlUmVmZXJlbmNlKHBDbG9uZSwgcERvYywgcE1hcFB0clRvUHRyKSkgeworICAgIHBDbG9uZS0+UmVsZWFzZSgpOworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIChpbnQpZHdOZXdPYmpOdW07Cit9CisKK0ZQREZfQk9PTCBQYXJzZXJQYWdlUmFuZ2VTdHJpbmcoQ0ZYX0J5dGVTdHJpbmcgcmFuZ3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dvcmRBcnJheSogcGFnZUFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvdW50KSB7CisgIGlmIChyYW5nc3RyaW5nLkdldExlbmd0aCgpICE9IDApIHsKKyAgICByYW5nc3RyaW5nLlJlbW92ZSgnICcpOworICAgIGludCBuTGVuZ3RoID0gcmFuZ3N0cmluZy5HZXRMZW5ndGgoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBjYkNvbXBhcmVTdHJpbmcoIjAxMjM0NTY3ODktLCIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoY2JDb21wYXJlU3RyaW5nLkZpbmQocmFuZ3N0cmluZ1tpXSkgPT0gLTEpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgQ0ZYX0J5dGVTdHJpbmcgY2JNaWRSYW5nZTsKKyAgICBpbnQgblN0cmluZ0Zyb20gPSAwOworICAgIGludCBuU3RyaW5nVG8gPSAwOworICAgIHdoaWxlIChuU3RyaW5nVG8gPCBuTGVuZ3RoKSB7CisgICAgICBuU3RyaW5nVG8gPSByYW5nc3RyaW5nLkZpbmQoJywnLCBuU3RyaW5nRnJvbSk7CisgICAgICBpZiAoblN0cmluZ1RvID09IC0xKSB7CisgICAgICAgIG5TdHJpbmdUbyA9IG5MZW5ndGg7CisgICAgICB9CisgICAgICBjYk1pZFJhbmdlID0gcmFuZ3N0cmluZy5NaWQoblN0cmluZ0Zyb20sIG5TdHJpbmdUbyAtIG5TdHJpbmdGcm9tKTsKKworICAgICAgaW50IG5NaWQgPSBjYk1pZFJhbmdlLkZpbmQoJy0nKTsKKyAgICAgIGlmIChuTWlkID09IC0xKSB7CisgICAgICAgIGxvbmcgbFBhZ2VOdW0gPSBhdG9sKGNiTWlkUmFuZ2UpOworICAgICAgICBpZiAobFBhZ2VOdW0gPD0gMCB8fCBsUGFnZU51bSA+IG5Db3VudCkKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgcGFnZUFycmF5LT5BZGQoKEZYX1dPUkQpbFBhZ2VOdW0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IG5TdGFydFBhZ2VOdW0gPSBhdG9sKGNiTWlkUmFuZ2UuTWlkKDAsIG5NaWQpKTsKKyAgICAgICAgaWYgKG5TdGFydFBhZ2VOdW0gPT0gMCkKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgbk1pZCA9IG5NaWQgKyAxOworICAgICAgICBpbnQgbkVuZCA9IGNiTWlkUmFuZ2UuR2V0TGVuZ3RoKCkgLSBuTWlkOworICAgICAgICBpZiAobkVuZCA9PSAwKQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICBpbnQgbkVuZFBhZ2VOdW0gPSBhdG9sKGNiTWlkUmFuZ2UuTWlkKG5NaWQsIG5FbmQpKTsKKyAgICAgICAgaWYgKG5TdGFydFBhZ2VOdW0gPCAwIHx8IG5TdGFydFBhZ2VOdW0gPiBuRW5kUGFnZU51bSB8fAorICAgICAgICAgICAgbkVuZFBhZ2VOdW0gPiBuQ291bnQpCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgIGZvciAoaW50IG5JbmRleCA9IG5TdGFydFBhZ2VOdW07IG5JbmRleCA8PSBuRW5kUGFnZU51bTsgKytuSW5kZXgpCisgICAgICAgICAgcGFnZUFycmF5LT5BZGQobkluZGV4KTsKKyAgICAgIH0KKyAgICAgIG5TdHJpbmdGcm9tID0gblN0cmluZ1RvICsgMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0ltcG9ydFBhZ2VzKEZQREZfRE9DVU1FTlQgZGVzdF9kb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIHNyY19kb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFnZXJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CisgIGlmIChkZXN0X2RvYyA9PSBOVUxMIHx8IHNyY19kb2MgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIENGWF9Xb3JkQXJyYXkgcGFnZUFycmF5OworICBDUERGWEZBX0RvY3VtZW50KiBwU3JjRG9jID0gKENQREZYRkFfRG9jdW1lbnQqKXNyY19kb2M7CisgIENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MgPSBwU3JjRG9jLT5HZXRQREZEb2MoKTsKKyAgaW50IG5Db3VudCA9IHBTcmNQREZEb2MtPkdldFBhZ2VDb3VudCgpOworICBpZiAocGFnZXJhbmdlKSB7CisgICAgaWYgKFBhcnNlclBhZ2VSYW5nZVN0cmluZyhwYWdlcmFuZ2UsICZwYWdlQXJyYXksIG5Db3VudCkgPT0gRkFMU0UpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbkNvdW50OyBpKyspIHsKKyAgICAgIHBhZ2VBcnJheS5BZGQoaSk7CisgICAgfQorICB9CisKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERlc3REb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopZGVzdF9kb2M7CisgIENQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jID0gcERlc3REb2MtPkdldFBERkRvYygpOworICBDUERGX1BhZ2VPcmdhbml6ZXIgcGFnZU9yZzsKKworICBwYWdlT3JnLlBERkRvY0luaXQocERlc3RQREZEb2MsIHBTcmNQREZEb2MpOworCisgIGlmIChwYWdlT3JnLkV4cG9ydFBhZ2UocFNyY1BERkRvYywgJnBhZ2VBcnJheSwgcERlc3RQREZEb2MsIGluZGV4KSkKICAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9Db3B5Vmlld2VyUHJlZmVyZW5jZXMoRlBERl9ET0NVTUVOVCBkZXN0X2RvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIHNyY19kb2MpIHsKKyAgaWYgKHNyY19kb2MgPT0gTlVMTCB8fCBkZXN0X2RvYyA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcFNyY0RvYyA9IChDUERGWEZBX0RvY3VtZW50KilzcmNfZG9jOworICBDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jID0gcFNyY0RvYy0+R2V0UERGRG9jKCk7CisgIENQREZfRGljdGlvbmFyeSogcFNyY0RpY3QgPSBwU3JjUERGRG9jLT5HZXRSb290KCk7CisgIHBTcmNEaWN0ID0gcFNyY0RpY3QtPkdldERpY3QoRlhfQlNUUkMoIlZpZXdlclByZWZlcmVuY2VzIikpOworICBpZiAoIXBTcmNEaWN0KQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERzdERvYyA9IChDUERGWEZBX0RvY3VtZW50KilkZXN0X2RvYzsKKyAgQ1BERl9Eb2N1bWVudCogcERzdFBERkRvYyA9IHBEc3REb2MtPkdldFBERkRvYygpOworICBDUERGX0RpY3Rpb25hcnkqIHBEc3REaWN0ID0gcERzdFBERkRvYy0+R2V0Um9vdCgpOworICBpZiAoIXBEc3REaWN0KQorICAgIHJldHVybiBGQUxTRTsKKyAgcERzdERpY3QtPlNldEF0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpLCBwU3JjRGljdC0+Q2xvbmUoVFJVRSkpOworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZzYXZlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZzYXZlLmNwcAppbmRleCBiZWE1MzkyLi4xNGY3MzA5IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmc2F2ZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnNhdmUuY3BwCkBAIC0xOCwzMzkgKzE4LDMyMCBAQAogI2luY2x1ZGUgPGN0aW1lPgogI2VuZGlmCiAKLWNsYXNzIENGWF9JRmlsZVdyaXRlIGZpbmFsIDogcHVibGljIElGWF9TdHJlYW1Xcml0ZQoteworY2xhc3MgQ0ZYX0lGaWxlV3JpdGUgZmluYWwgOiBwdWJsaWMgSUZYX1N0cmVhbVdyaXRlIHsKKyBwdWJsaWM6CisgIENGWF9JRmlsZVdyaXRlKCk7CisgIEZYX0JPT0wgSW5pdChGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZVN0cnVjdCk7CisgIHZpcnR1YWwgRlhfQk9PTCBXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgb3ZlcnJpZGUge30KIAotcHVibGljOgotICAgIENGWF9JRmlsZVdyaXRlKCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICBJbml0KCBGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGVTdHJ1Y3QgKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIFJlbGVhc2UoKSBvdmVycmlkZSB7fQotCi1wcm90ZWN0ZWQ6Ci0gICAgRlBERl9GSUxFV1JJVEUqICAgICBtX3BGaWxlV3JpdGVTdHJ1Y3Q7CisgcHJvdGVjdGVkOgorICBGUERGX0ZJTEVXUklURSogbV9wRmlsZVdyaXRlU3RydWN0OwogfTsKIAotQ0ZYX0lGaWxlV3JpdGU6OkNGWF9JRmlsZVdyaXRlKCkKLXsKLSAgICBtX3BGaWxlV3JpdGVTdHJ1Y3QgPSBOVUxMOworQ0ZYX0lGaWxlV3JpdGU6OkNGWF9JRmlsZVdyaXRlKCkgeworICBtX3BGaWxlV3JpdGVTdHJ1Y3QgPSBOVUxMOwogfQogCi1GWF9CT09MIENGWF9JRmlsZVdyaXRlOjpJbml0KCBGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGVTdHJ1Y3QgKQotewotICAgIGlmICghcEZpbGVXcml0ZVN0cnVjdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDRlhfSUZpbGVXcml0ZTo6SW5pdChGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZVN0cnVjdCkgeworICBpZiAoIXBGaWxlV3JpdGVTdHJ1Y3QpCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgbV9wRmlsZVdyaXRlU3RydWN0ID0gcEZpbGVXcml0ZVN0cnVjdDsKKyAgbV9wRmlsZVdyaXRlU3RydWN0ID0gcEZpbGVXcml0ZVN0cnVjdDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgQ0ZYX0lGaWxlV3JpdGU6OldyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICghbV9wRmlsZVdyaXRlU3RydWN0KQorICAgIHJldHVybiBGQUxTRTsKKworICBtX3BGaWxlV3JpdGVTdHJ1Y3QtPldyaXRlQmxvY2sobV9wRmlsZVdyaXRlU3RydWN0LCBwRGF0YSwgc2l6ZSk7CisgIHJldHVybiBUUlVFOworfQorCisjZGVmaW5lIFhGQV9EQVRBU0VUUyAwCisjZGVmaW5lIFhGQV9GT1JNUyAxCisKK0ZYX0JPT0wgX1NhdmVYRkFEb2N1bWVudERhdGEoQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkmIGZpbGVMaXN0KSB7CisgIGlmICghcERvY3VtZW50KQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEgJiYKKyAgICAgIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfU1RBVElDX1hGQSkKICAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBDRlhfSUZpbGVXcml0ZTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpCi17Ci0gICAgaWYgKCFtX3BGaWxlV3JpdGVTdHJ1Y3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIG1fcEZpbGVXcml0ZVN0cnVjdC0+V3JpdGVCbG9jayggbV9wRmlsZVdyaXRlU3RydWN0LCBwRGF0YSwgc2l6ZSApOworICBpZiAoIUNQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRYRkFBcHAoKSkKICAgICByZXR1cm4gVFJVRTsKLX0KIAotI2RlZmluZSAgWEZBX0RBVEFTRVRTIDAKLSNkZWZpbmUgIFhGQV9GT1JNUyAgICAxCisgIElYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcgPSBwRG9jdW1lbnQtPkdldFhGQURvY1ZpZXcoKTsKKyAgaWYgKE5VTEwgPT0gcFhGQURvY1ZpZXcpCisgICAgcmV0dXJuIFRSVUU7CiAKLUZYX0JPT0wgX1NhdmVYRkFEb2N1bWVudERhdGEoQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfUHRyQXJyYXkmIGZpbGVMaXN0KQotewotICAgIGlmICghcERvY3VtZW50KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEgJiYgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gRE9DVFlQRV9TVEFUSUNfWEZBKQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICBpZiAoIUNQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRYRkFBcHAoKSkKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgIElYRkFfRG9jSGFuZGxlciogcFhGQURvY0hhbmRsZXIgPQorICAgICAgQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFhGQUFwcCgpLT5HZXREb2NIYW5kbGVyKCk7CisgIENQREZfRG9jdW1lbnQqIHBQREZEb2N1bWVudCA9IHBEb2N1bWVudC0+R2V0UERGRG9jKCk7CisgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gcERvY3VtZW50LT5HZXRYRkFEb2NWaWV3KCk7Ci0gICAgaWYgKE5VTEwgPT0gcFhGQURvY1ZpZXcpCi0gICAgICAgIHJldHVybiBUUlVFOwotCi0gICAgSVhGQV9Eb2NIYW5kbGVyICpwWEZBRG9jSGFuZGxlciA9IENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRYRkFBcHAoKS0+R2V0RG9jSGFuZGxlcigpOwotICAgIENQREZfRG9jdW1lbnQgKiBwUERGRG9jdW1lbnQgPSBwRG9jdW1lbnQtPkdldFBERkRvYygpOwotICAgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBQREZEb2N1bWVudC0+R2V0Um9vdCgpOwotICAgIGlmIChwUm9vdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKLSAgICBpZiAoTlVMTCA9PSBwQWNyb0Zvcm0pCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBDUERGX09iamVjdCogcFhGQSA9IHBBY3JvRm9ybS0+R2V0RWxlbWVudCgiWEZBIik7Ci0gICAgaWYgKHBYRkEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgaWYocFhGQS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBYRkEtPkdldEFycmF5KCk7Ci0gICAgaWYgKE5VTEwgPT0gcEFycmF5KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaW50IHNpemUgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgaW50IGlGb3JtSW5kZXggPSAtMTsKLSAgICBpbnQgaURhdGFTZXRzSW5kZXggPSAtMTsKLSAgICBpbnQgaVRlbXBsYXRlID0gLTE7Ci0gICAgaW50IGlMYXN0ID0gc2l6ZSAtIDI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKQotICAgIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBQREZPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaSk7Ci0gICAgICAgIGlmIChwUERGT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUklORykKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAocFBERk9iai0+R2V0U3RyaW5nKCkgPT0gImZvcm0iKQotICAgICAgICAgICAgaUZvcm1JbmRleCA9IGkrMTsKLSAgICAgICAgZWxzZSBpZiAocFBERk9iai0+R2V0U3RyaW5nKCkgPT0gImRhdGFzZXRzIikKLSAgICAgICAgICAgIGlEYXRhU2V0c0luZGV4ID0gaSsxOwotICAgICAgICBlbHNlIGlmIChwUERGT2JqLT5HZXRTdHJpbmcoKSA9PSBGWF9CU1RSQygidGVtcGxhdGUiKSkKLSAgICAgICAgICAgIGlUZW1wbGF0ZSA9IGkgKyAxOwotICAgIH0KLSAgICBJWEZBX0NoZWNrc3VtQ29udGV4dCogcENvbnRleHQgPSBOVUxMOworICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcFBERkRvY3VtZW50LT5HZXRSb290KCk7CisgIGlmIChwUm9vdCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgaWYgKE5VTEwgPT0gcEFjcm9Gb3JtKQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERl9PYmplY3QqIHBYRkEgPSBwQWNyb0Zvcm0tPkdldEVsZW1lbnQoIlhGQSIpOworICBpZiAocFhGQSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworICBpZiAocFhGQS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBYRkEtPkdldEFycmF5KCk7CisgIGlmIChOVUxMID09IHBBcnJheSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGludCBzaXplID0gcEFycmF5LT5HZXRDb3VudCgpOworICBpbnQgaUZvcm1JbmRleCA9IC0xOworICBpbnQgaURhdGFTZXRzSW5kZXggPSAtMTsKKyAgaW50IGlUZW1wbGF0ZSA9IC0xOworICBpbnQgaUxhc3QgPSBzaXplIC0gMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7CisgICAgQ1BERl9PYmplY3QqIHBQREZPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaSk7CisgICAgaWYgKHBQREZPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSSU5HKQorICAgICAgY29udGludWU7CisgICAgaWYgKHBQREZPYmotPkdldFN0cmluZygpID09ICJmb3JtIikKKyAgICAgIGlGb3JtSW5kZXggPSBpICsgMTsKKyAgICBlbHNlIGlmIChwUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAiZGF0YXNldHMiKQorICAgICAgaURhdGFTZXRzSW5kZXggPSBpICsgMTsKKyAgICBlbHNlIGlmIChwUERGT2JqLT5HZXRTdHJpbmcoKSA9PSBGWF9CU1RSQygidGVtcGxhdGUiKSkKKyAgICAgIGlUZW1wbGF0ZSA9IGkgKyAxOworICB9CisgIElYRkFfQ2hlY2tzdW1Db250ZXh0KiBwQ29udGV4dCA9IE5VTEw7CiAjZGVmaW5lIFhGQV9VU0VDS1NVTQogI2lmZGVmIFhGQV9VU0VDS1NVTQotICAgIC8vQ2hlY2tzdW0KLSAgICBwQ29udGV4dCA9IFhGQV9DaGVja3N1bV9DcmVhdGUoKTsKLSAgICBGWFNZU19hc3NlcnQocENvbnRleHQpOwotICAgIHBDb250ZXh0LT5TdGFydENoZWNrc3VtKCk7CisgIC8vIENoZWNrc3VtCisgIHBDb250ZXh0ID0gWEZBX0NoZWNrc3VtX0NyZWF0ZSgpOworICBGWFNZU19hc3NlcnQocENvbnRleHQpOworICBwQ29udGV4dC0+U3RhcnRDaGVja3N1bSgpOwogCi0gICAgLy90ZW1wbGF0ZQotICAgIGlmIChpVGVtcGxhdGUgPiAtMSkKLSAgICB7Ci0gICAgICAgIENQREZfU3RyZWFtICpwVGVtcGxhdGVTdHJlYW0gPSBwQXJyYXktPkdldFN0cmVhbShpVGVtcGxhdGUpOwotICAgICAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW1BY2M7Ci0gICAgICAgIHN0cmVhbUFjYy5Mb2FkQWxsRGF0YShwVGVtcGxhdGVTdHJlYW0pOwotICAgICAgICB1aW50OF90KiBwRGF0YSA9ICh1aW50OF90KilzdHJlYW1BY2MuR2V0RGF0YSgpOwotICAgICAgICBGWF9EV09SRCBkd1NpemUyID0gc3RyZWFtQWNjLkdldFNpemUoKTsKLSAgICAgICAgSUZYX0ZpbGVTdHJlYW0gKnBUZW1wbGF0ZSA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwRGF0YSwgZHdTaXplMik7Ci0gICAgICAgIHBDb250ZXh0LT5VcGRhdGVDaGVja3N1bSgoSUZYX0ZpbGVSZWFkKilwVGVtcGxhdGUpOwotICAgICAgICBwVGVtcGxhdGUtPlJlbGVhc2UoKTsKLSAgICB9CisgIC8vIHRlbXBsYXRlCisgIGlmIChpVGVtcGxhdGUgPiAtMSkgeworICAgIENQREZfU3RyZWFtKiBwVGVtcGxhdGVTdHJlYW0gPSBwQXJyYXktPkdldFN0cmVhbShpVGVtcGxhdGUpOworICAgIENQREZfU3RyZWFtQWNjIHN0cmVhbUFjYzsKKyAgICBzdHJlYW1BY2MuTG9hZEFsbERhdGEocFRlbXBsYXRlU3RyZWFtKTsKKyAgICB1aW50OF90KiBwRGF0YSA9ICh1aW50OF90KilzdHJlYW1BY2MuR2V0RGF0YSgpOworICAgIEZYX0RXT1JEIGR3U2l6ZTIgPSBzdHJlYW1BY2MuR2V0U2l6ZSgpOworICAgIElGWF9GaWxlU3RyZWFtKiBwVGVtcGxhdGUgPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocERhdGEsIGR3U2l6ZTIpOworICAgIHBDb250ZXh0LT5VcGRhdGVDaGVja3N1bSgoSUZYX0ZpbGVSZWFkKilwVGVtcGxhdGUpOworICAgIHBUZW1wbGF0ZS0+UmVsZWFzZSgpOworICB9CiAjZW5kaWYKLSAgICBDUERGX1N0cmVhbSogcEZvcm1TdHJlYW0gPSBOVUxMOwotICAgIENQREZfU3RyZWFtKiBwRGF0YVNldHNTdHJlYW0gPSBOVUxMOwotICAgIGlmIChpRm9ybUluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgICAgLy9HZXQgZm9ybSBDUERGX1N0cmVhbQotICAgICAgICBDUERGX09iamVjdCogcEZvcm1QREZPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaUZvcm1JbmRleCk7Ci0gICAgICAgIGlmIChwRm9ybVBERk9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENQREZfUmVmZXJlbmNlKiBwRm9ybVJlZk9iaiA9IChDUERGX1JlZmVyZW5jZSopcEZvcm1QREZPYmo7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcEZvcm1EaXJjZXRPYmogPSBwRm9ybVBERk9iai0+R2V0RGlyZWN0KCk7Ci0gICAgICAgICAgICBpZiAoTlVMTCAhPSBwRm9ybURpcmNldE9iaiAmJiBwRm9ybURpcmNldE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEZvcm1TdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBGb3JtRGlyY2V0T2JqOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBGb3JtUERGT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkKLSAgICAgICAgewotICAgICAgICAgICAgcEZvcm1TdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBGb3JtUERGT2JqOwotICAgICAgICB9CisgIENQREZfU3RyZWFtKiBwRm9ybVN0cmVhbSA9IE5VTEw7CisgIENQREZfU3RyZWFtKiBwRGF0YVNldHNTdHJlYW0gPSBOVUxMOworICBpZiAoaUZvcm1JbmRleCAhPSAtMSkgeworICAgIC8vIEdldCBmb3JtIENQREZfU3RyZWFtCisgICAgQ1BERl9PYmplY3QqIHBGb3JtUERGT2JqID0gcEFycmF5LT5HZXRFbGVtZW50KGlGb3JtSW5kZXgpOworICAgIGlmIChwRm9ybVBERk9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICAgIENQREZfUmVmZXJlbmNlKiBwRm9ybVJlZk9iaiA9IChDUERGX1JlZmVyZW5jZSopcEZvcm1QREZPYmo7CisgICAgICBDUERGX09iamVjdCogcEZvcm1EaXJjZXRPYmogPSBwRm9ybVBERk9iai0+R2V0RGlyZWN0KCk7CisgICAgICBpZiAoTlVMTCAhPSBwRm9ybURpcmNldE9iaiAmJgorICAgICAgICAgIHBGb3JtRGlyY2V0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgeworICAgICAgICBwRm9ybVN0cmVhbSA9IChDUERGX1N0cmVhbSopcEZvcm1EaXJjZXRPYmo7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChwRm9ybVBERk9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKKyAgICAgIHBGb3JtU3RyZWFtID0gKENQREZfU3RyZWFtKilwRm9ybVBERk9iajsKICAgICB9CisgIH0KIAotICAgIGlmIChpRGF0YVNldHNJbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICAgIC8vR2V0IGRhdGFzZXRzIENQREZfU3RyZWFtCi0gICAgICAgIENQREZfT2JqZWN0KiBwRGF0YVNldHNQREZPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaURhdGFTZXRzSW5kZXgpOwotICAgICAgICBpZiAocERhdGFTZXRzUERGT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkKLSAgICAgICAgewotICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBEYXRhU2V0c1JlZk9iaiA9IChDUERGX1JlZmVyZW5jZSopcERhdGFTZXRzUERGT2JqOwotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBEYXRhU2V0c0RpcmNldE9iaiA9IHBEYXRhU2V0c1JlZk9iai0+R2V0RGlyZWN0KCk7Ci0gICAgICAgICAgICBpZiAoTlVMTCAhPSBwRGF0YVNldHNEaXJjZXRPYmogJiYgcERhdGFTZXRzRGlyY2V0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRGF0YVNldHNTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBEYXRhU2V0c0RpcmNldE9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwRGF0YVNldHNQREZPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRGF0YVNldHNTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBEYXRhU2V0c1BERk9iajsKLSAgICAgICAgfQorICBpZiAoaURhdGFTZXRzSW5kZXggIT0gLTEpIHsKKyAgICAvLyBHZXQgZGF0YXNldHMgQ1BERl9TdHJlYW0KKyAgICBDUERGX09iamVjdCogcERhdGFTZXRzUERGT2JqID0gcEFycmF5LT5HZXRFbGVtZW50KGlEYXRhU2V0c0luZGV4KTsKKyAgICBpZiAocERhdGFTZXRzUERGT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgeworICAgICAgQ1BERl9SZWZlcmVuY2UqIHBEYXRhU2V0c1JlZk9iaiA9IChDUERGX1JlZmVyZW5jZSopcERhdGFTZXRzUERGT2JqOworICAgICAgQ1BERl9PYmplY3QqIHBEYXRhU2V0c0RpcmNldE9iaiA9IHBEYXRhU2V0c1JlZk9iai0+R2V0RGlyZWN0KCk7CisgICAgICBpZiAoTlVMTCAhPSBwRGF0YVNldHNEaXJjZXRPYmogJiYKKyAgICAgICAgICBwRGF0YVNldHNEaXJjZXRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CisgICAgICAgIHBEYXRhU2V0c1N0cmVhbSA9IChDUERGX1N0cmVhbSopcERhdGFTZXRzRGlyY2V0T2JqOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocERhdGFTZXRzUERGT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgeworICAgICAgcERhdGFTZXRzU3RyZWFtID0gKENQREZfU3RyZWFtKilwRGF0YVNldHNQREZPYmo7CiAgICAgfQotICAgIC8vZW5kCi0gICAgLy9MImRhdGFzZXRzIgotICAgIHsKLSAgICAgICAgSUZYX0ZpbGVTdHJlYW0qIHBEc2ZpbGVXcml0ZSA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgpOwotICAgICAgICBpZiAoIE5VTEwgPT0gcERzZmlsZVdyaXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgcENvbnRleHQtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIHBEc2ZpbGVXcml0ZS0+UmVsZWFzZSgpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwWEZBRG9jSGFuZGxlci0+U2F2ZVBhY2thZ2UocFhGQURvY1ZpZXctPkdldERvYygpLCBDRlhfV2lkZVN0cmluZ0MoTCJkYXRhc2V0cyIpLCBwRHNmaWxlV3JpdGUpICYmIHBEc2ZpbGVXcml0ZS0+R2V0U2l6ZSgpPjApCi0gICAgICAgIHsKKyAgfQorICAvLyBlbmQKKyAgLy8gTCJkYXRhc2V0cyIKKyAgeworICAgIElGWF9GaWxlU3RyZWFtKiBwRHNmaWxlV3JpdGUgPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oKTsKKyAgICBpZiAoTlVMTCA9PSBwRHNmaWxlV3JpdGUpIHsKKyAgICAgIHBDb250ZXh0LT5SZWxlYXNlKCk7CisgICAgICBwRHNmaWxlV3JpdGUtPlJlbGVhc2UoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKHBYRkFEb2NIYW5kbGVyLT5TYXZlUGFja2FnZShwWEZBRG9jVmlldy0+R2V0RG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MoTCJkYXRhc2V0cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzZmlsZVdyaXRlKSAmJgorICAgICAgICBwRHNmaWxlV3JpdGUtPkdldFNpemUoKSA+IDApIHsKICNpZmRlZiBYRkFfVVNFQ0tTVU0KLSAgICAgICAgLy9EYXRhc2V0cwotICAgICAgICBwQ29udGV4dC0+VXBkYXRlQ2hlY2tzdW0oKElGWF9GaWxlUmVhZCopcERzZmlsZVdyaXRlKTsKLSAgICAgICAgcENvbnRleHQtPkZpbmlzaENoZWNrc3VtKCk7CisgICAgICAvLyBEYXRhc2V0cworICAgICAgcENvbnRleHQtPlVwZGF0ZUNoZWNrc3VtKChJRlhfRmlsZVJlYWQqKXBEc2ZpbGVXcml0ZSk7CisgICAgICBwQ29udGV4dC0+RmluaXNoQ2hlY2tzdW0oKTsKICNlbmRpZgotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGF0YURpY3QgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICAgICAgaWYgKGlEYXRhU2V0c0luZGV4ICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwRGF0YVNldHNTdHJlYW0pCi0gICAgICAgICAgICAgICAgICAgIHBEYXRhU2V0c1N0cmVhbS0+SW5pdFN0cmVhbShwRHNmaWxlV3JpdGUsIHBEYXRhRGljdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBEYXRhID0gRlhfTkVXIENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIHBEYXRhLT5Jbml0U3RyZWFtKHBEc2ZpbGVXcml0ZSwgcERhdGFEaWN0KTsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBBcHBTdHJlYW1vYmpudW0gPSBwUERGRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBEYXRhKTsKLSAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IChDUERGX1JlZmVyZW5jZSopcFBERkRvY3VtZW50LT5HZXRJbmRpcmVjdE9iamVjdChBcHBTdHJlYW1vYmpudW0pOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaUxhc3QgPSBwQXJyYXktPkdldENvdW50KCkgLTI7Ci0gICAgICAgICAgICAgICAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaUxhc3QsQ1BERl9TdHJpbmc6OkNyZWF0ZSgiZGF0YXNldHMiKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaUxhc3QrMSwgcERhdGEsIHBQREZEb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlsZUxpc3QuQWRkKHBEc2ZpbGVXcml0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vTCJmb3JtIgotICAgIHsKLQotICAgICAgICBJRlhfRmlsZVN0cmVhbSogcGZpbGVXcml0ZSA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgpOwotICAgICAgICBpZiAoTlVMTCA9PSBwZmlsZVdyaXRlKQorICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGF0YURpY3QgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OworICAgICAgaWYgKGlEYXRhU2V0c0luZGV4ICE9IC0xKSB7CisgICAgICAgIGlmIChwRGF0YVNldHNTdHJlYW0pCisgICAgICAgICAgcERhdGFTZXRzU3RyZWFtLT5Jbml0U3RyZWFtKHBEc2ZpbGVXcml0ZSwgcERhdGFEaWN0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENQREZfU3RyZWFtKiBwRGF0YSA9IEZYX05FVyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKKyAgICAgICAgcERhdGEtPkluaXRTdHJlYW0ocERzZmlsZVdyaXRlLCBwRGF0YURpY3QpOworICAgICAgICBGWF9EV09SRCBBcHBTdHJlYW1vYmpudW0gPSBwUERGRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBEYXRhKTsKKyAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPQorICAgICAgICAgICAgKENQREZfUmVmZXJlbmNlKilwUERGRG9jdW1lbnQtPkdldEluZGlyZWN0T2JqZWN0KEFwcFN0cmVhbW9iam51bSk7CiAgICAgICAgIHsKLSAgICAgICAgICAgIHBDb250ZXh0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgaUxhc3QgPSBwQXJyYXktPkdldENvdW50KCkgLSAyOworICAgICAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaUxhc3QsIENQREZfU3RyaW5nOjpDcmVhdGUoImRhdGFzZXRzIikpOworICAgICAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaUxhc3QgKyAxLCBwRGF0YSwgcFBERkRvY3VtZW50KTsKICAgICAgICAgfQotICAgICAgICBpZihwWEZBRG9jSGFuZGxlci0+U2F2ZVBhY2thZ2UocFhGQURvY1ZpZXctPkdldERvYygpLCBDRlhfV2lkZVN0cmluZ0MoTCJmb3JtIiksIHBmaWxlV3JpdGUsIHBDb250ZXh0KSAmJiBwZmlsZVdyaXRlID4gMCkKKyAgICAgIH0KKyAgICAgIGZpbGVMaXN0LkFkZChwRHNmaWxlV3JpdGUpOworICAgIH0KKyAgfQorCisgIC8vIEwiZm9ybSIKKyAgeworICAgIElGWF9GaWxlU3RyZWFtKiBwZmlsZVdyaXRlID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCk7CisgICAgaWYgKE5VTEwgPT0gcGZpbGVXcml0ZSkgeworICAgICAgcENvbnRleHQtPlJlbGVhc2UoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKHBYRkFEb2NIYW5kbGVyLT5TYXZlUGFja2FnZShwWEZBRG9jVmlldy0+R2V0RG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MoTCJmb3JtIiksIHBmaWxlV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCkgJiYKKyAgICAgICAgcGZpbGVXcml0ZSA+IDApIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcERhdGFEaWN0ID0gRlhfTkVXIENQREZfRGljdGlvbmFyeTsKKyAgICAgIGlmIChpRm9ybUluZGV4ICE9IC0xKSB7CisgICAgICAgIGlmIChwRm9ybVN0cmVhbSkKKyAgICAgICAgICBwRm9ybVN0cmVhbS0+SW5pdFN0cmVhbShwZmlsZVdyaXRlLCBwRGF0YURpY3QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1BERl9TdHJlYW0qIHBEYXRhID0gRlhfTkVXIENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICAgICAgICBwRGF0YS0+SW5pdFN0cmVhbShwZmlsZVdyaXRlLCBwRGF0YURpY3QpOworICAgICAgICBGWF9EV09SRCBBcHBTdHJlYW1vYmpudW0gPSBwUERGRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBEYXRhKTsKKyAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPQorICAgICAgICAgICAgKENQREZfUmVmZXJlbmNlKilwUERGRG9jdW1lbnQtPkdldEluZGlyZWN0T2JqZWN0KEFwcFN0cmVhbW9iam51bSk7CiAgICAgICAgIHsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERhdGFEaWN0ID0gRlhfTkVXIENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgICAgIGlmIChpRm9ybUluZGV4ICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwRm9ybVN0cmVhbSkKLSAgICAgICAgICAgICAgICAgICAgcEZvcm1TdHJlYW0tPkluaXRTdHJlYW0ocGZpbGVXcml0ZSwgcERhdGFEaWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcERhdGEgPSBGWF9ORVcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcERhdGEtPkluaXRTdHJlYW0ocGZpbGVXcml0ZSwgcERhdGFEaWN0KTsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBBcHBTdHJlYW1vYmpudW0gPSBwUERGRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBEYXRhKTsKLSAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IChDUERGX1JlZmVyZW5jZSopcFBERkRvY3VtZW50LT5HZXRJbmRpcmVjdE9iamVjdChBcHBTdHJlYW1vYmpudW0pOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaUxhc3QgPSBwQXJyYXktPkdldENvdW50KCkgLTI7Ci0gICAgICAgICAgICAgICAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaUxhc3QsIENQREZfU3RyaW5nOjpDcmVhdGUoImZvcm0iKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaUxhc3QrMSwgcERhdGEsIHBQREZEb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlsZUxpc3QuQWRkKHBmaWxlV3JpdGUpOworICAgICAgICAgIGlMYXN0ID0gcEFycmF5LT5HZXRDb3VudCgpIC0gMjsKKyAgICAgICAgICBwQXJyYXktPkluc2VydEF0KGlMYXN0LCBDUERGX1N0cmluZzo6Q3JlYXRlKCJmb3JtIikpOworICAgICAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaUxhc3QgKyAxLCBwRGF0YSwgcFBERkRvY3VtZW50KTsKICAgICAgICAgfQorICAgICAgfQorICAgICAgZmlsZUxpc3QuQWRkKHBmaWxlV3JpdGUpOwogICAgIH0KLSAgICBwQ29udGV4dC0+UmVsZWFzZSgpOworICB9CisgIHBDb250ZXh0LT5SZWxlYXNlKCk7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIF9TZW5kUG9zdFNhdmVUb1hGQURvYyhDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgaWYgKCFwRG9jdW1lbnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTklNSUNfWEZBICYmCisgICAgICBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX1NUQVRJQ19YRkEpCiAgICAgcmV0dXJuIFRSVUU7CisKKyAgSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldyA9IHBEb2N1bWVudC0+R2V0WEZBRG9jVmlldygpOworICBpZiAoTlVMTCA9PSBwWEZBRG9jVmlldykKKyAgICByZXR1cm4gRkFMU0U7CisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRlciA9IHBYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7CisKKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBOVUxMOworICBJWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBwV2lkZ2V0QWNjSXRlcmF0b3IgPQorICAgICAgcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7CisgIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsKKyAgd2hpbGUgKHBXaWRnZXRBY2MpIHsKKyAgICBDWEZBX0V2ZW50UGFyYW0gcHJlUGFyYW07CisgICAgcHJlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Qb3N0U2F2ZTsKKyAgICBwV2lkZ2V0SGFuZGVyLT5Qcm9jZXNzRXZlbnQocFdpZGdldEFjYywgJnByZVBhcmFtKTsKKyAgICBwV2lkZ2V0QWNjID0gcFdpZGdldEFjY0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7CisgIH0KKyAgcFdpZGdldEFjY0l0ZXJhdG9yLT5SZWxlYXNlKCk7CisgIHBYRkFEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7CisgIHBEb2N1bWVudC0+X0NsZWFyQ2hhbmdlTWFyaygpOworICByZXR1cm4gVFJVRTsKIH0KIAotCi1GWF9CT09MIF9TZW5kUG9zdFNhdmVUb1hGQURvYyhDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0gICAgaWYgKCFwRG9jdW1lbnQpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTklNSUNfWEZBICYmIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfU1RBVElDX1hGQSkKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gcERvY3VtZW50LT5HZXRYRkFEb2NWaWV3KCk7Ci0gICAgaWYgKE5VTEwgPT0gcFhGQURvY1ZpZXcpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kZXIgPSAgcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKLQotICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gTlVMTDsKLSAgICBJWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBwV2lkZ2V0QWNjSXRlcmF0b3IgPSBwWEZBRG9jVmlldy0+Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoKTsKLSAgICBwV2lkZ2V0QWNjID0gcFdpZGdldEFjY0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7Ci0gICAgd2hpbGUocFdpZGdldEFjYykKLSAgICB7Ci0gICAgICAgIENYRkFfRXZlbnRQYXJhbSBwcmVQYXJhbTsKLSAgICAgICAgcHJlUGFyYW0ubV9lVHlwZSA9ICBYRkFfRVZFTlRfUG9zdFNhdmU7Ci0gICAgICAgIHBXaWRnZXRIYW5kZXItPlByb2Nlc3NFdmVudChwV2lkZ2V0QWNjLCZwcmVQYXJhbSk7Ci0gICAgICAgIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsKLSAgICB9Ci0gICAgcFdpZGdldEFjY0l0ZXJhdG9yLT5SZWxlYXNlKCk7Ci0gICAgcFhGQURvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKLSAgICBwRG9jdW1lbnQtPl9DbGVhckNoYW5nZU1hcmsoKTsKK0ZYX0JPT0wgX1NlbmRQcmVTYXZlVG9YRkFEb2MoQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkmIGZpbGVMaXN0KSB7CisgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTklNSUNfWEZBICYmCisgICAgICBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX1NUQVRJQ19YRkEpCiAgICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotRlhfQk9PTCBfU2VuZFByZVNhdmVUb1hGQURvYyhDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9QdHJBcnJheSYgZmlsZUxpc3QpCi17Ci0gICAgaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEgJiYgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gRE9DVFlQRV9TVEFUSUNfWEZBKQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICBJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gcERvY3VtZW50LT5HZXRYRkFEb2NWaWV3KCk7Ci0gICAgaWYgKE5VTEwgPT0gcFhGQURvY1ZpZXcpCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRlciA9ICBwWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOwotICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gTlVMTDsKLSAgICBJWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBwV2lkZ2V0QWNjSXRlcmF0b3IgPSBwWEZBRG9jVmlldy0+Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoKTsKKyAgSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldyA9IHBEb2N1bWVudC0+R2V0WEZBRG9jVmlldygpOworICBpZiAoTlVMTCA9PSBwWEZBRG9jVmlldykKKyAgICByZXR1cm4gVFJVRTsKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGVyID0gcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBOVUxMOworICBJWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBwV2lkZ2V0QWNjSXRlcmF0b3IgPQorICAgICAgcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7CisgIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsKKyAgd2hpbGUgKHBXaWRnZXRBY2MpIHsKKyAgICBDWEZBX0V2ZW50UGFyYW0gcHJlUGFyYW07CisgICAgcHJlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9QcmVTYXZlOworICAgIHBXaWRnZXRIYW5kZXItPlByb2Nlc3NFdmVudChwV2lkZ2V0QWNjLCAmcHJlUGFyYW0pOwogICAgIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsKLSAgICB3aGlsZShwV2lkZ2V0QWNjKQotICAgIHsKLSAgICAgICAgQ1hGQV9FdmVudFBhcmFtIHByZVBhcmFtOwotICAgICAgICBwcmVQYXJhbS5tX2VUeXBlID0gIFhGQV9FVkVOVF9QcmVTYXZlOwotICAgICAgICBwV2lkZ2V0SGFuZGVyLT5Qcm9jZXNzRXZlbnQocFdpZGdldEFjYywgJnByZVBhcmFtKTsKLSAgICAgICAgcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOwotICAgIH0KLSAgICBwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsKLSAgICBwWEZBRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOwotICAgIHJldHVybiBfU2F2ZVhGQURvY3VtZW50RGF0YShwRG9jdW1lbnQsIGZpbGVMaXN0KTsKKyAgfQorICBwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsKKyAgcFhGQURvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKKyAgcmV0dXJuIF9TYXZlWEZBRG9jdW1lbnREYXRhKHBEb2N1bWVudCwgZmlsZUxpc3QpOwogfQogCi1GUERGX0JPT0wgX0ZQREZfRG9jX1NhdmUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9GSUxFV1JJVEUgKiBwRmlsZVdyaXRlLEZQREZfRFdPUkQgZmxhZ3MsIEZQREZfQk9PTCBiU2V0VmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZVZlcmlvbikKLXsKLSAgICBDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OworRlBERl9CT09MIF9GUERGX0RvY19TYXZlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFV1JJVEUqIHBGaWxlV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlNldFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVWZXJpb24pIHsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKIAotICAgIENGWF9QdHJBcnJheSBmaWxlTGlzdDsKKyAgQ0ZYX1B0ckFycmF5IGZpbGVMaXN0OwogCi0gICAgX1NlbmRQcmVTYXZlVG9YRkFEb2MocERvYywgZmlsZUxpc3QpOworICBfU2VuZFByZVNhdmVUb1hGQURvYyhwRG9jLCBmaWxlTGlzdCk7CiAKLSAgICBDUERGX0RvY3VtZW50KiBwUERGRG9jID0gcERvYy0+R2V0UERGRG9jKCk7Ci0gICAgaWYgKCFwUERGRG9jKQotICAgICAgICByZXR1cm4gMDsKKyAgQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBEb2MtPkdldFBERkRvYygpOworICBpZiAoIXBQREZEb2MpCisgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAoIGZsYWdzIDwgRlBERl9JTkNSRU1FTlRBTCB8fCBmbGFncyA+IEZQREZfUkVNT1ZFX1NFQ1VSSVRZICkKLSAgICB7Ci0gICAgICAgIGZsYWdzID0gMDsKLSAgICB9CisgIGlmIChmbGFncyA8IEZQREZfSU5DUkVNRU5UQUwgfHwgZmxhZ3MgPiBGUERGX1JFTU9WRV9TRUNVUklUWSkgeworICAgIGZsYWdzID0gMDsKKyAgfQogCi0gICAgQ1BERl9DcmVhdG9yIEZpbGVNYWtlcihwUERGRG9jKTsKLSAgICBpZiAoYlNldFZlcnNpb24pCi0gICAgICAgIEZpbGVNYWtlci5TZXRGaWxlVmVyc2lvbihmaWxlVmVyaW9uKTsKLSAgICBpZiAoZmxhZ3MgPT0gRlBERl9SRU1PVkVfU0VDVVJJVFkpCi0gICAgewotICAgICAgICBmbGFncyA9ICAwOwotICAgICAgICBGaWxlTWFrZXIuUmVtb3ZlU2VjdXJpdHkoKTsKLSAgICB9Ci0gICAgQ0ZYX0lGaWxlV3JpdGUqIHBTdHJlYW1Xcml0ZSA9IE5VTEw7Ci0gICAgRlhfQk9PTCBiUmV0OwotICAgIHBTdHJlYW1Xcml0ZSA9IG5ldyBDRlhfSUZpbGVXcml0ZTsKLSAgICBwU3RyZWFtV3JpdGUtPkluaXQoIHBGaWxlV3JpdGUgKTsKLSAgICBiUmV0ID0gRmlsZU1ha2VyLkNyZWF0ZShwU3RyZWFtV3JpdGUsIGZsYWdzKTsKKyAgQ1BERl9DcmVhdG9yIEZpbGVNYWtlcihwUERGRG9jKTsKKyAgaWYgKGJTZXRWZXJzaW9uKQorICAgIEZpbGVNYWtlci5TZXRGaWxlVmVyc2lvbihmaWxlVmVyaW9uKTsKKyAgaWYgKGZsYWdzID09IEZQREZfUkVNT1ZFX1NFQ1VSSVRZKSB7CisgICAgZmxhZ3MgPSAwOworICAgIEZpbGVNYWtlci5SZW1vdmVTZWN1cml0eSgpOworICB9CisgIENGWF9JRmlsZVdyaXRlKiBwU3RyZWFtV3JpdGUgPSBOVUxMOworICBGWF9CT09MIGJSZXQ7CisgIHBTdHJlYW1Xcml0ZSA9IG5ldyBDRlhfSUZpbGVXcml0ZTsKKyAgcFN0cmVhbVdyaXRlLT5Jbml0KHBGaWxlV3JpdGUpOworICBiUmV0ID0gRmlsZU1ha2VyLkNyZWF0ZShwU3RyZWFtV3JpdGUsIGZsYWdzKTsKIAotICAgIF9TZW5kUG9zdFNhdmVUb1hGQURvYyhwRG9jKTsKLSAgICAvL3BEb2MtPl9DbGVhckNoYW5nZU1hcmsoKTsKKyAgX1NlbmRQb3N0U2F2ZVRvWEZBRG9jKHBEb2MpOworICAvLyBwRG9jLT5fQ2xlYXJDaGFuZ2VNYXJrKCk7CiAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0LkdldFNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgICAgSUZYX0ZpbGVTdHJlYW0qIHBGaWxlID0gKElGWF9GaWxlU3RyZWFtKilmaWxlTGlzdC5HZXRBdChpKTsKLSAgICAgICAgcEZpbGUtPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgZmlsZUxpc3QuUmVtb3ZlQWxsKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3QuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBJRlhfRmlsZVN0cmVhbSogcEZpbGUgPSAoSUZYX0ZpbGVTdHJlYW0qKWZpbGVMaXN0LkdldEF0KGkpOworICAgIHBGaWxlLT5SZWxlYXNlKCk7CisgIH0KKyAgZmlsZUxpc3QuUmVtb3ZlQWxsKCk7CiAKLSAgICBkZWxldGUgcFN0cmVhbVdyaXRlOwotICAgIHJldHVybiBiUmV0OworICBkZWxldGUgcFN0cmVhbVdyaXRlOworICByZXR1cm4gYlJldDsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfU2F2ZUFzQ29weSggICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCxGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGZsYWdzICkKLXsKLSAgICByZXR1cm4gX0ZQREZfRG9jX1NhdmUoZG9jdW1lbnQsIHBGaWxlV3JpdGUsIGZsYWdzLCBGQUxTRSAsIDApOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfU2F2ZUFzQ29weShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBmbGFncykgeworICByZXR1cm4gX0ZQREZfRG9jX1NhdmUoZG9jdW1lbnQsIHBGaWxlV3JpdGUsIGZsYWdzLCBGQUxTRSwgMCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVXaXRoVmVyc2lvbiggICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZSwKLSAgICBGUERGX0RXT1JEIGZsYWdzLCBpbnQgZmlsZVZlcnNpb24pCi17Ci0gICAgcmV0dXJuIF9GUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgVFJVRSAsIGZpbGVWZXJzaW9uKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVXaXRoVmVyc2lvbihGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRVdSSVRFKiBwRmlsZVdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVWZXJzaW9uKSB7CisgIHJldHVybiBfRlBERl9Eb2NfU2F2ZShkb2N1bWVudCwgcEZpbGVXcml0ZSwgZmxhZ3MsIFRSVUUsIGZpbGVWZXJzaW9uKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnRleHQuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnRleHQuY3BwCmluZGV4IDdiMDdhMTMuLmZhZDJiODQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmdGV4dC5jcHAKQEAgLTE0LDI0MCArMTQsMjgxIEBACiAjaW5jbHVkZSA8dGNoYXIuaD4KICNlbmRpZgogCi0JLy8gamFiZGVsbWFsZWs6IGNvbW1lbnRlZCBvdXQgdG8gYnVpbGQgb24gTGludXguICBOb3QgdXNlZC4KLQkvLyBleHRlcm4gSEFORExFIGdfaE1vZHVsZTsKKy8vIGphYmRlbG1hbGVrOiBjb21tZW50ZWQgb3V0IHRvIGJ1aWxkIG9uIExpbnV4LiAgTm90IHVzZWQuCisvLyBleHRlcm4gSEFORExFIGdfaE1vZHVsZTsKIAotRExMRVhQT1JUIEZQREZfVEVYVFBBR0UgU1REQ0FMTCBGUERGVGV4dF9Mb2FkUGFnZShGUERGX1BBR0UgcGFnZSkKLXsKLQlpZiAoIXBhZ2UpIHJldHVybiBOVUxMOwotCUlQREZfVGV4dFBhZ2UqIHRleHRwYWdlPU5VTEw7Ci0JQ1BERlhGQV9QYWdlKiBwUGFnZSA9IChDUERGWEZBX1BhZ2UqKXBhZ2U7Ci0JaWYgKCFwUGFnZS0+R2V0UERGUGFnZSgpKSByZXR1cm4gTlVMTDsKLQlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFBhZ2UtPkdldERvY3VtZW50KCk7Ci0JQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKHBEb2MtPkdldFBERkRvYygpKTsKLQl0ZXh0cGFnZT1JUERGX1RleHRQYWdlOjpDcmVhdGVUZXh0UGFnZSgoQ1BERl9QYWdlKilwUGFnZS0+R2V0UERGUGFnZSgpLHZpZXdSZWYuSXNEaXJlY3Rpb25SMkwoKSk7Ci0JdGV4dHBhZ2UtPlBhcnNlVGV4dFBhZ2UoKTsKK0RMTEVYUE9SVCBGUERGX1RFWFRQQUdFIFNURENBTEwgRlBERlRleHRfTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UpIHsKKyAgaWYgKCFwYWdlKQorICAgIHJldHVybiBOVUxMOworICBJUERGX1RleHRQYWdlKiB0ZXh0cGFnZSA9IE5VTEw7CisgIENQREZYRkFfUGFnZSogcFBhZ2UgPSAoQ1BERlhGQV9QYWdlKilwYWdlOworICBpZiAoIXBQYWdlLT5HZXRQREZQYWdlKCkpCisgICAgcmV0dXJuIE5VTEw7CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwUGFnZS0+R2V0RG9jdW1lbnQoKTsKKyAgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKHBEb2MtPkdldFBERkRvYygpKTsKKyAgdGV4dHBhZ2UgPSBJUERGX1RleHRQYWdlOjpDcmVhdGVUZXh0UGFnZSgoQ1BERl9QYWdlKilwUGFnZS0+R2V0UERGUGFnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdSZWYuSXNEaXJlY3Rpb25SMkwoKSk7CisgIHRleHRwYWdlLT5QYXJzZVRleHRQYWdlKCk7CiAKLQlyZXR1cm4gdGV4dHBhZ2U7CisgIHJldHVybiB0ZXh0cGFnZTsKIH0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlRleHRfQ2xvc2VQYWdlKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlKQotewotICAgIGRlbGV0ZSAoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9DbG9zZVBhZ2UoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UpIHsKKyAgZGVsZXRlIChJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7CiB9Ci1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfQ291bnRDaGFycyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkKLXsKLQlpZiAoIXRleHRfcGFnZSkgcmV0dXJuCS0xOwotCUlQREZfVGV4dFBhZ2UqIHRleHRwYWdlPShJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7Ci0JcmV0dXJuICB0ZXh0cGFnZS0+Q291bnRDaGFycygpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0NvdW50Q2hhcnMoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UpIHsKKyAgaWYgKCF0ZXh0X3BhZ2UpCisgICAgcmV0dXJuIC0xOworICBJUERGX1RleHRQYWdlKiB0ZXh0cGFnZSA9IChJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7CisgIHJldHVybiB0ZXh0cGFnZS0+Q291bnRDaGFycygpOwogfQotRExMRVhQT1JUIHVuc2lnbmVkIGludCBTVERDQUxMIEZQREZUZXh0X0dldFVuaWNvZGUoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIGludCBpbmRleCkKLXsKLQlpZiAoIXRleHRfcGFnZSkgcmV0dXJuIC0xOwotCUlQREZfVGV4dFBhZ2UqIHRleHRwYWdlPShJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7CitETExFWFBPUlQgdW5zaWduZWQgaW50IFNURENBTEwgRlBERlRleHRfR2V0VW5pY29kZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICBpZiAoIXRleHRfcGFnZSkKKyAgICByZXR1cm4gLTE7CisgIElQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKIAotCWlmIChpbmRleDwwIHx8IGluZGV4Pj10ZXh0cGFnZS0+Q291bnRDaGFycygpKSByZXR1cm4gMDsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0ZXh0cGFnZS0+Q291bnRDaGFycygpKQorICAgIHJldHVybiAwOwogCi0JRlBERl9DSEFSX0lORk8JY2hhcmluZm87Ci0JdGV4dHBhZ2UtPkdldENoYXJJbmZvKGluZGV4LGNoYXJpbmZvKTsKLQlyZXR1cm4gY2hhcmluZm8ubV9Vbmljb2RlOworICBGUERGX0NIQVJfSU5GTyBjaGFyaW5mbzsKKyAgdGV4dHBhZ2UtPkdldENoYXJJbmZvKGluZGV4LCBjaGFyaW5mbyk7CisgIHJldHVybiBjaGFyaW5mby5tX1VuaWNvZGU7CiB9Ci1ETExFWFBPUlQgZG91YmxlIFNURENBTEwgRlBERlRleHRfR2V0Rm9udFNpemUoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIGludCBpbmRleCkKLXsKLQlpZiAoIXRleHRfcGFnZSkgcmV0dXJuIDA7Ci0JSVBERl9UZXh0UGFnZSogdGV4dHBhZ2U9KElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKK0RMTEVYUE9SVCBkb3VibGUgU1REQ0FMTCBGUERGVGV4dF9HZXRGb250U2l6ZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgaWYgKCF0ZXh0X3BhZ2UpCisgICAgcmV0dXJuIDA7CisgIElQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKIAotCWlmIChpbmRleDwwIHx8IGluZGV4Pj10ZXh0cGFnZS0+Q291bnRDaGFycygpKSByZXR1cm4gMDsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0ZXh0cGFnZS0+Q291bnRDaGFycygpKQorICAgIHJldHVybiAwOwogCi0JRlBERl9DSEFSX0lORk8JY2hhcmluZm87Ci0JdGV4dHBhZ2UtPkdldENoYXJJbmZvKGluZGV4LGNoYXJpbmZvKTsKLQlyZXR1cm4gY2hhcmluZm8ubV9Gb250U2l6ZTsKKyAgRlBERl9DSEFSX0lORk8gY2hhcmluZm87CisgIHRleHRwYWdlLT5HZXRDaGFySW5mbyhpbmRleCwgY2hhcmluZm8pOworICByZXR1cm4gY2hhcmluZm8ubV9Gb250U2l6ZTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRDaGFyQm94KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLCBpbnQgaW5kZXgsZG91YmxlKiBsZWZ0LAotCQkJCQkJCQkJCQkJCWRvdWJsZSogcmlnaHQsIGRvdWJsZSogYm90dG9tLCBkb3VibGUqIHRvcCkKLXsKLQlpZiAoIXRleHRfcGFnZSkgcmV0dXJuOwotCUlQREZfVGV4dFBhZ2UqIHRleHRwYWdlPShJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZUZXh0X0dldENoYXJCb3goRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9wKSB7CisgIGlmICghdGV4dF9wYWdlKQorICAgIHJldHVybjsKKyAgSVBERl9UZXh0UGFnZSogdGV4dHBhZ2UgPSAoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOwogCi0JaWYgKGluZGV4PDAgfHwgaW5kZXg+PXRleHRwYWdlLT5Db3VudENoYXJzKCkpIHJldHVybiA7Ci0JRlBERl9DSEFSX0lORk8JY2hhcmluZm87Ci0JdGV4dHBhZ2UtPkdldENoYXJJbmZvKGluZGV4LGNoYXJpbmZvKTsKLQkqbGVmdD1jaGFyaW5mby5tX0NoYXJCb3gubGVmdDsKLQkqcmlnaHQ9Y2hhcmluZm8ubV9DaGFyQm94LnJpZ2h0OwotCSpib3R0b209Y2hhcmluZm8ubV9DaGFyQm94LmJvdHRvbTsKLQkqdG9wPWNoYXJpbmZvLm1fQ2hhckJveC50b3A7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGV4dHBhZ2UtPkNvdW50Q2hhcnMoKSkKKyAgICByZXR1cm47CisgIEZQREZfQ0hBUl9JTkZPIGNoYXJpbmZvOworICB0ZXh0cGFnZS0+R2V0Q2hhckluZm8oaW5kZXgsIGNoYXJpbmZvKTsKKyAgKmxlZnQgPSBjaGFyaW5mby5tX0NoYXJCb3gubGVmdDsKKyAgKnJpZ2h0ID0gY2hhcmluZm8ubV9DaGFyQm94LnJpZ2h0OworICAqYm90dG9tID0gY2hhcmluZm8ubV9DaGFyQm94LmJvdHRvbTsKKyAgKnRvcCA9IGNoYXJpbmZvLm1fQ2hhckJveC50b3A7CiB9CiAKLS8vc2VsZWN0Ci1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3MoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsZG91YmxlIHgsZG91YmxlIHksZG91YmxlIHhUb3JlbGFuY2UsZG91YmxlIHlUb3JlbGFuY2UpCi17Ci0JaWYgKCF0ZXh0X3BhZ2UpIHJldHVybiAtMzsKLQlJUERGX1RleHRQYWdlKiB0ZXh0cGFnZT0oSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOwotCXJldHVybiB0ZXh0cGFnZS0+R2V0SW5kZXhBdFBvcygoRlhfRkxPQVQpeCwoRlhfRkxPQVQpeSwoRlhfRkxPQVQpeFRvcmVsYW5jZSwoRlhfRkxPQVQpeVRvcmVsYW5jZSk7CisvLyBzZWxlY3QKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeFRvcmVsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeVRvcmVsYW5jZSkgeworICBpZiAoIXRleHRfcGFnZSkKKyAgICByZXR1cm4gLTM7CisgIElQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKKyAgcmV0dXJuIHRleHRwYWdlLT5HZXRJbmRleEF0UG9zKChGWF9GTE9BVCl4LCAoRlhfRkxPQVQpeSwgKEZYX0ZMT0FUKXhUb3JlbGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpeVRvcmVsYW5jZSk7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRUZXh0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLGludCBzdGFydCxpbnQgY291bnQsdW5zaWduZWQgc2hvcnQqIHJlc3VsdCkKLXsKLQlpZiAoIXRleHRfcGFnZSkgcmV0dXJuIDA7Ci0JSVBERl9UZXh0UGFnZSogdGV4dHBhZ2U9KElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRUZXh0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIHJlc3VsdCkgeworICBpZiAoIXRleHRfcGFnZSkKKyAgICByZXR1cm4gMDsKKyAgSVBERl9UZXh0UGFnZSogdGV4dHBhZ2UgPSAoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOwogCi0JaWYgKHN0YXJ0Pj10ZXh0cGFnZS0+Q291bnRDaGFycygpKSByZXR1cm4gMDsKKyAgaWYgKHN0YXJ0ID49IHRleHRwYWdlLT5Db3VudENoYXJzKCkpCisgICAgcmV0dXJuIDA7CiAKLQlDRlhfV2lkZVN0cmluZyBzdHI9dGV4dHBhZ2UtPkdldFBhZ2VUZXh0KHN0YXJ0LGNvdW50KTsKLQlpZihzdHIuR2V0TGVuZ3RoKCk+Y291bnQpCi0JCXN0ciA9IHN0ci5MZWZ0KGNvdW50KTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gdGV4dHBhZ2UtPkdldFBhZ2VUZXh0KHN0YXJ0LCBjb3VudCk7CisgIGlmIChzdHIuR2V0TGVuZ3RoKCkgPiBjb3VudCkKKyAgICBzdHIgPSBzdHIuTGVmdChjb3VudCk7CiAKLQlDRlhfQnl0ZVN0cmluZyBjYlVURjE2c3RyID0gc3RyLlVURjE2TEVfRW5jb2RlKCk7Ci0JRlhTWVNfbWVtY3B5KHJlc3VsdCxjYlVURjE2c3RyLkdldEJ1ZmZlcihjYlVURjE2c3RyLkdldExlbmd0aCgpKSxjYlVURjE2c3RyLkdldExlbmd0aCgpKTsKLQljYlVURjE2c3RyLlJlbGVhc2VCdWZmZXIoY2JVVEYxNnN0ci5HZXRMZW5ndGgoKSk7CisgIENGWF9CeXRlU3RyaW5nIGNiVVRGMTZzdHIgPSBzdHIuVVRGMTZMRV9FbmNvZGUoKTsKKyAgRlhTWVNfbWVtY3B5KHJlc3VsdCwgY2JVVEYxNnN0ci5HZXRCdWZmZXIoY2JVVEYxNnN0ci5HZXRMZW5ndGgoKSksCisgICAgICAgICAgICAgICBjYlVURjE2c3RyLkdldExlbmd0aCgpKTsKKyAgY2JVVEYxNnN0ci5SZWxlYXNlQnVmZmVyKGNiVVRGMTZzdHIuR2V0TGVuZ3RoKCkpOwogCi0JcmV0dXJuIGNiVVRGMTZzdHIuR2V0TGVuZ3RoKCkvc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKyAgcmV0dXJuIGNiVVRGMTZzdHIuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfQ291bnRSZWN0cyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSxpbnQgc3RhcnQsaW50IGNvdW50KQotewotCWlmICghdGV4dF9wYWdlKSByZXR1cm4gMDsKLQlJUERGX1RleHRQYWdlKiB0ZXh0cGFnZT0oSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOwotCXJldHVybgl0ZXh0cGFnZS0+Q291bnRSZWN0cyhzdGFydCxjb3VudCk7Ci0KK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9Db3VudFJlY3RzKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgIGlmICghdGV4dF9wYWdlKQorICAgIHJldHVybiAwOworICBJUERGX1RleHRQYWdlKiB0ZXh0cGFnZSA9IChJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7CisgIHJldHVybiB0ZXh0cGFnZS0+Q291bnRSZWN0cyhzdGFydCwgY291bnQpOwogfQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRSZWN0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLGludCByZWN0X2luZGV4LCBkb3VibGUqIGxlZnQsZG91YmxlKiAgdG9wLAotCQkJCQkJCQkJCWRvdWJsZSogIHJpZ2h0LCBkb3VibGUqICBib3R0b20pCi17Ci0JaWYgKCF0ZXh0X3BhZ2UpIHJldHVybjsKLQlJUERGX1RleHRQYWdlKiB0ZXh0cGFnZT0oSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOwotCUNGWF9GbG9hdFJlY3QJcmVjdDsKLQl0ZXh0cGFnZS0+R2V0UmVjdChyZWN0X2luZGV4LHJlY3QubGVmdCxyZWN0LnRvcCxyZWN0LnJpZ2h0LHJlY3QuYm90dG9tKTsKLQkqbGVmdD1yZWN0LmxlZnQ7Ci0JKnRvcD1yZWN0LnRvcDsKLQkqcmlnaHQ9cmVjdC5yaWdodDsKLQkqYm90dG9tPXJlY3QuYm90dG9tOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRSZWN0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tKSB7CisgIGlmICghdGV4dF9wYWdlKQorICAgIHJldHVybjsKKyAgSVBERl9UZXh0UGFnZSogdGV4dHBhZ2UgPSAoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOworICBDRlhfRmxvYXRSZWN0IHJlY3Q7CisgIHRleHRwYWdlLT5HZXRSZWN0KHJlY3RfaW5kZXgsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKKyAgKmxlZnQgPSByZWN0LmxlZnQ7CisgICp0b3AgPSByZWN0LnRvcDsKKyAgKnJpZ2h0ID0gcmVjdC5yaWdodDsKKyAgKmJvdHRvbSA9IHJlY3QuYm90dG9tOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsCi0JCQkJCQkJCQkJCSAgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tLHVuc2lnbmVkIHNob3J0KiBidWZmZXIsaW50IGJ1ZmxlbikKLXsKLQlpZiAoIXRleHRfcGFnZSkgcmV0dXJuIDA7Ci0JSVBERl9UZXh0UGFnZSogdGV4dHBhZ2U9KElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKLQlDRlhfRmxvYXRSZWN0IHJlY3QoKEZYX0ZMT0FUKWxlZnQsKEZYX0ZMT0FUKWJvdHRvbSwoRlhfRkxPQVQpcmlnaHQsKEZYX0ZMT0FUKXRvcCk7Ci0JQ0ZYX1dpZGVTdHJpbmcgc3RyPXRleHRwYWdlLT5HZXRUZXh0QnlSZWN0KHJlY3QpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0dldEJvdW5kZWRUZXh0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmbGVuKSB7CisgIGlmICghdGV4dF9wYWdlKQorICAgIHJldHVybiAwOworICBJUERGX1RleHRQYWdlKiB0ZXh0cGFnZSA9IChJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7CisgIENGWF9GbG9hdFJlY3QgcmVjdCgoRlhfRkxPQVQpbGVmdCwgKEZYX0ZMT0FUKWJvdHRvbSwgKEZYX0ZMT0FUKXJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXRvcCk7CisgIENGWF9XaWRlU3RyaW5nIHN0ciA9IHRleHRwYWdlLT5HZXRUZXh0QnlSZWN0KHJlY3QpOwogCi0JaWYgKGJ1Zmxlbjw9MCB8fCBidWZmZXI9PU5VTEwpCi0JewotCQlyZXR1cm4gc3RyLkdldExlbmd0aCgpOwotCX0KKyAgaWYgKGJ1ZmxlbiA8PSAwIHx8IGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIHN0ci5HZXRMZW5ndGgoKTsKKyAgfQogCi0JQ0ZYX0J5dGVTdHJpbmcgY2JVVEYxNlN0ciA9IHN0ci5VVEYxNkxFX0VuY29kZSgpOwotCWludCBsZW4gPSBjYlVURjE2U3RyLkdldExlbmd0aCgpL3NpemVvZih1bnNpZ25lZCBzaG9ydCk7Ci0JaW50IHNpemUgPSBidWZsZW4gPiBsZW4gPyBsZW4gOiBidWZsZW47Ci0JRlhTWVNfbWVtY3B5KGJ1ZmZlcixjYlVURjE2U3RyLkdldEJ1ZmZlcihzaXplKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpLHNpemUqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7Ci0JY2JVVEYxNlN0ci5SZWxlYXNlQnVmZmVyKHNpemUqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisgIENGWF9CeXRlU3RyaW5nIGNiVVRGMTZTdHIgPSBzdHIuVVRGMTZMRV9FbmNvZGUoKTsKKyAgaW50IGxlbiA9IGNiVVRGMTZTdHIuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpOworICBpbnQgc2l6ZSA9IGJ1ZmxlbiA+IGxlbiA/IGxlbiA6IGJ1ZmxlbjsKKyAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgY2JVVEYxNlN0ci5HZXRCdWZmZXIoc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpLAorICAgICAgICAgICAgICAgc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICBjYlVURjE2U3RyLlJlbGVhc2VCdWZmZXIoc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwogCi0JcmV0dXJuIHNpemU7Ci0KKyAgcmV0dXJuIHNpemU7CiB9CiAKLS8vU2VhcmNoCisvLyBTZWFyY2gKIC8vLTEgZm9yIGVuZAotRExMRVhQT1JUIEZQREZfU0NISEFORExFIFNURENBTEwgRlBERlRleHRfRmluZFN0YXJ0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLEZQREZfV0lERVNUUklORyBmaW5kd2hhdCx1bnNpZ25lZCBsb25nIGZsYWdzLGludCBzdGFydF9pbmRleCkKLXsKLQlpZiAoIXRleHRfcGFnZSkgcmV0dXJuIE5VTEw7Ci0JSVBERl9UZXh0UGFnZUZpbmQqIHRleHRwYWdlRmluZD1OVUxMOwotCXRleHRwYWdlRmluZD1JUERGX1RleHRQYWdlRmluZDo6Q3JlYXRlUGFnZUZpbmQoKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZSk7Ci0JRlhfU1RSU0laRSBsZW4gPSBDRlhfV2lkZVN0cmluZzo6V1N0cmluZ0xlbmd0aChmaW5kd2hhdCk7Ci0JdGV4dHBhZ2VGaW5kLT5GaW5kRmlyc3QoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGZpbmR3aGF0LCBsZW4pLGZsYWdzLHN0YXJ0X2luZGV4KTsKLQlyZXR1cm4gdGV4dHBhZ2VGaW5kOworRExMRVhQT1JUIEZQREZfU0NISEFORExFIFNURENBTEwgRlBERlRleHRfRmluZFN0YXJ0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBmaW5kd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9pbmRleCkgeworICBpZiAoIXRleHRfcGFnZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgSVBERl9UZXh0UGFnZUZpbmQqIHRleHRwYWdlRmluZCA9IE5VTEw7CisgIHRleHRwYWdlRmluZCA9IElQREZfVGV4dFBhZ2VGaW5kOjpDcmVhdGVQYWdlRmluZCgoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlKTsKKyAgRlhfU1RSU0laRSBsZW4gPSBDRlhfV2lkZVN0cmluZzo6V1N0cmluZ0xlbmd0aChmaW5kd2hhdCk7CisgIHRleHRwYWdlRmluZC0+RmluZEZpcnN0KENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShmaW5kd2hhdCwgbGVuKSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2luZGV4KTsKKyAgcmV0dXJuIHRleHRwYWdlRmluZDsKIH0KLURMTEVYUE9SVCBGUERGX0JPT0wJU1REQ0FMTCBGUERGVGV4dF9GaW5kTmV4dChGUERGX1NDSEhBTkRMRSBoYW5kbGUpCi17Ci0JaWYgKCFoYW5kbGUpIHJldHVybiBGQUxTRTsKLQlJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kPShJUERGX1RleHRQYWdlRmluZCopaGFuZGxlOwotCXJldHVybgl0ZXh0cGFnZUZpbmQtPkZpbmROZXh0KCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlRleHRfRmluZE5leHQoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKSB7CisgIGlmICghaGFuZGxlKQorICAgIHJldHVybiBGQUxTRTsKKyAgSVBERl9UZXh0UGFnZUZpbmQqIHRleHRwYWdlRmluZCA9IChJUERGX1RleHRQYWdlRmluZCopaGFuZGxlOworICByZXR1cm4gdGV4dHBhZ2VGaW5kLT5GaW5kTmV4dCgpOwogfQotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZUZXh0X0ZpbmRQcmV2KEZQREZfU0NISEFORExFIGhhbmRsZSkKLXsKLQlpZiAoIWhhbmRsZSkgcmV0dXJuIEZBTFNFOwotCUlQREZfVGV4dFBhZ2VGaW5kKiB0ZXh0cGFnZUZpbmQ9KElQREZfVGV4dFBhZ2VGaW5kKiloYW5kbGU7Ci0JcmV0dXJuCXRleHRwYWdlRmluZC0+RmluZFByZXYoKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGVGV4dF9GaW5kUHJldihGUERGX1NDSEhBTkRMRSBoYW5kbGUpIHsKKyAgaWYgKCFoYW5kbGUpCisgICAgcmV0dXJuIEZBTFNFOworICBJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kID0gKElQREZfVGV4dFBhZ2VGaW5kKiloYW5kbGU7CisgIHJldHVybiB0ZXh0cGFnZUZpbmQtPkZpbmRQcmV2KCk7CiB9Ci1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0U2NoUmVzdWx0SW5kZXgoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKQotewotCWlmICghaGFuZGxlKSByZXR1cm4gMDsKLQlJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kPShJUERGX1RleHRQYWdlRmluZCopaGFuZGxlOwotCXJldHVybiB0ZXh0cGFnZUZpbmQtPkdldEN1ck9yZGVyKCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0U2NoUmVzdWx0SW5kZXgoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKSB7CisgIGlmICghaGFuZGxlKQorICAgIHJldHVybiAwOworICBJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kID0gKElQREZfVGV4dFBhZ2VGaW5kKiloYW5kbGU7CisgIHJldHVybiB0ZXh0cGFnZUZpbmQtPkdldEN1ck9yZGVyKCk7CiB9Ci1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0U2NoQ291bnQoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKQotewotCWlmICghaGFuZGxlKSByZXR1cm4gMDsKLQlJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kPShJUERGX1RleHRQYWdlRmluZCopaGFuZGxlOwotCXJldHVybiB0ZXh0cGFnZUZpbmQtPkdldE1hdGNoZWRDb3VudCgpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0dldFNjaENvdW50KEZQREZfU0NISEFORExFIGhhbmRsZSkgeworICBpZiAoIWhhbmRsZSkKKyAgICByZXR1cm4gMDsKKyAgSVBERl9UZXh0UGFnZUZpbmQqIHRleHRwYWdlRmluZCA9IChJUERGX1RleHRQYWdlRmluZCopaGFuZGxlOworICByZXR1cm4gdGV4dHBhZ2VGaW5kLT5HZXRNYXRjaGVkQ291bnQoKTsKIH0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlRleHRfRmluZENsb3NlKEZQREZfU0NISEFORExFIGhhbmRsZSkKLXsKLQlpZiAoIWhhbmRsZSkgcmV0dXJuOwotCUlQREZfVGV4dFBhZ2VGaW5kKiB0ZXh0cGFnZUZpbmQ9KElQREZfVGV4dFBhZ2VGaW5kKiloYW5kbGU7Ci0JZGVsZXRlCXRleHRwYWdlRmluZDsKLQloYW5kbGU9TlVMTDsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlRleHRfRmluZENsb3NlKEZQREZfU0NISEFORExFIGhhbmRsZSkgeworICBpZiAoIWhhbmRsZSkKKyAgICByZXR1cm47CisgIElQREZfVGV4dFBhZ2VGaW5kKiB0ZXh0cGFnZUZpbmQgPSAoSVBERl9UZXh0UGFnZUZpbmQqKWhhbmRsZTsKKyAgZGVsZXRlIHRleHRwYWdlRmluZDsKKyAgaGFuZGxlID0gTlVMTDsKIH0KIAotLy93ZWIgbGluawotRExMRVhQT1JUIEZQREZfUEFHRUxJTksgU1REQ0FMTCBGUERGTGlua19Mb2FkV2ViTGlua3MoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UpCi17Ci0JaWYgKCF0ZXh0X3BhZ2UpIHJldHVybiBOVUxMOwotCUlQREZfTGlua0V4dHJhY3QqIHBhZ2VMaW5rPU5VTEw7Ci0JcGFnZUxpbms9SVBERl9MaW5rRXh0cmFjdDo6Q3JlYXRlTGlua0V4dHJhY3QoKTsKLQlwYWdlTGluay0+RXh0cmFjdExpbmtzKChJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2UpOwotCXJldHVybiBwYWdlTGluazsKKy8vIHdlYiBsaW5rCitETExFWFBPUlQgRlBERl9QQUdFTElOSyBTVERDQUxMIEZQREZMaW5rX0xvYWRXZWJMaW5rcyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkgeworICBpZiAoIXRleHRfcGFnZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgSVBERl9MaW5rRXh0cmFjdCogcGFnZUxpbmsgPSBOVUxMOworICBwYWdlTGluayA9IElQREZfTGlua0V4dHJhY3Q6OkNyZWF0ZUxpbmtFeHRyYWN0KCk7CisgIHBhZ2VMaW5rLT5FeHRyYWN0TGlua3MoKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZSk7CisgIHJldHVybiBwYWdlTGluazsKIH0KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19Db3VudFdlYkxpbmtzKEZQREZfUEFHRUxJTksgbGlua19wYWdlKQotewotCWlmICghbGlua19wYWdlKSByZXR1cm4gMDsKLQlJUERGX0xpbmtFeHRyYWN0KiBwYWdlTGluaz0oSVBERl9MaW5rRXh0cmFjdCopbGlua19wYWdlOwotCXJldHVybglwYWdlTGluay0+Q291bnRMaW5rcygpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50V2ViTGlua3MoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UpIHsKKyAgaWYgKCFsaW5rX3BhZ2UpCisgICAgcmV0dXJuIDA7CisgIElQREZfTGlua0V4dHJhY3QqIHBhZ2VMaW5rID0gKElQREZfTGlua0V4dHJhY3QqKWxpbmtfcGFnZTsKKyAgcmV0dXJuIHBhZ2VMaW5rLT5Db3VudExpbmtzKCk7CiB9Ci1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfR2V0VVJMKEZQREZfUEFHRUxJTksgbGlua19wYWdlLGludCBsaW5rX2luZGV4LCB1bnNpZ25lZCBzaG9ydCogYnVmZmVyLGludCBidWZsZW4pCi17Ci0JaWYgKCFsaW5rX3BhZ2UpIHJldHVybiAwOwotCUlQREZfTGlua0V4dHJhY3QqIHBhZ2VMaW5rPShJUERGX0xpbmtFeHRyYWN0KilsaW5rX3BhZ2U7Ci0JQ0ZYX1dpZGVTdHJpbmcgdXJsPXBhZ2VMaW5rLT5HZXRVUkwobGlua19pbmRleCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfR2V0VVJMKEZQREZfUEFHRUxJTksgbGlua19wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlua19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmxlbikgeworICBpZiAoIWxpbmtfcGFnZSkKKyAgICByZXR1cm4gMDsKKyAgSVBERl9MaW5rRXh0cmFjdCogcGFnZUxpbmsgPSAoSVBERl9MaW5rRXh0cmFjdCopbGlua19wYWdlOworICBDRlhfV2lkZVN0cmluZyB1cmwgPSBwYWdlTGluay0+R2V0VVJMKGxpbmtfaW5kZXgpOwogCi0JQ0ZYX0J5dGVTdHJpbmcgY2JVVEYxNlVSTCA9IHVybC5VVEYxNkxFX0VuY29kZSgpOwotCWludCBsZW49IGNiVVRGMTZVUkwuR2V0TGVuZ3RoKCkvc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKLQlpZiAoYnVmZmVyPT1OVUxMIHx8IGJ1Zmxlbjw9MCkKLQkJcmV0dXJuIGxlbjsKLQlpbnQgc2l6ZT1sZW48YnVmbGVuID8gbGVuIDpidWZsZW47Ci0JaWYgKHNpemU+MCkKLQl7Ci0JCUZYU1lTX21lbWNweShidWZmZXIsY2JVVEYxNlVSTC5HZXRCdWZmZXIoc2l6ZSpzaXplb2YodW5zaWduZWQgc2hvcnQpKSxzaXplKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwotCQljYlVURjE2VVJMLlJlbGVhc2VCdWZmZXIoc2l6ZSpzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKLQl9Ci0JcmV0dXJuIHNpemU7CisgIENGWF9CeXRlU3RyaW5nIGNiVVRGMTZVUkwgPSB1cmwuVVRGMTZMRV9FbmNvZGUoKTsKKyAgaW50IGxlbiA9IGNiVVRGMTZVUkwuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpOworICBpZiAoYnVmZmVyID09IE5VTEwgfHwgYnVmbGVuIDw9IDApCisgICAgcmV0dXJuIGxlbjsKKyAgaW50IHNpemUgPSBsZW4gPCBidWZsZW4gPyBsZW4gOiBidWZsZW47CisgIGlmIChzaXplID4gMCkgeworICAgIEZYU1lTX21lbWNweShidWZmZXIsIGNiVVRGMTZVUkwuR2V0QnVmZmVyKHNpemUgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSwKKyAgICAgICAgICAgICAgICAgc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICAgIGNiVVRGMTZVUkwuUmVsZWFzZUJ1ZmZlcihzaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisgIH0KKyAgcmV0dXJuIHNpemU7CiB9Ci1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfQ291bnRSZWN0cyhGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSxpbnQgbGlua19pbmRleCkKLXsKLQlpZiAoIWxpbmtfcGFnZSkgcmV0dXJuIDA7Ci0JSVBERl9MaW5rRXh0cmFjdCogcGFnZUxpbms9KElQREZfTGlua0V4dHJhY3QqKWxpbmtfcGFnZTsKLQlDRlhfUmVjdEFycmF5IHJlY3RBcnJheTsKLQlwYWdlTGluay0+R2V0UmVjdHMobGlua19pbmRleCxyZWN0QXJyYXkpOwotCXJldHVybiByZWN0QXJyYXkuR2V0U2l6ZSgpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50UmVjdHMoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlua19pbmRleCkgeworICBpZiAoIWxpbmtfcGFnZSkKKyAgICByZXR1cm4gMDsKKyAgSVBERl9MaW5rRXh0cmFjdCogcGFnZUxpbmsgPSAoSVBERl9MaW5rRXh0cmFjdCopbGlua19wYWdlOworICBDRlhfUmVjdEFycmF5IHJlY3RBcnJheTsKKyAgcGFnZUxpbmstPkdldFJlY3RzKGxpbmtfaW5kZXgsIHJlY3RBcnJheSk7CisgIHJldHVybiByZWN0QXJyYXkuR2V0U2l6ZSgpOwogfQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGTGlua19HZXRSZWN0KEZQREZfUEFHRUxJTksgbGlua19wYWdlLGludCBsaW5rX2luZGV4LCAgaW50IHJlY3RfaW5kZXgsIGRvdWJsZSogbGVmdCwKLQkJCQkJCQkJCQlkb3VibGUqICB0b3AsZG91YmxlKiAgcmlnaHQsIGRvdWJsZSogIGJvdHRvbSkKLXsKLQlpZiAoIWxpbmtfcGFnZSkgcmV0dXJuOwotCUlQREZfTGlua0V4dHJhY3QqIHBhZ2VMaW5rPShJUERGX0xpbmtFeHRyYWN0KilsaW5rX3BhZ2U7Ci0JQ0ZYX1JlY3RBcnJheSByZWN0QXJyYXk7Ci0JcGFnZUxpbmstPkdldFJlY3RzKGxpbmtfaW5kZXgscmVjdEFycmF5KTsKLQlpZiAocmVjdF9pbmRleCA+PSAwICYmIHJlY3RfaW5kZXggPCByZWN0QXJyYXkuR2V0U2l6ZSgpKSB7Ci0JCUNGWF9GbG9hdFJlY3QgcmVjdD1yZWN0QXJyYXkuR2V0QXQocmVjdF9pbmRleCk7Ci0JCSpsZWZ0PXJlY3QubGVmdDsKLQkJKnJpZ2h0PXJlY3QucmlnaHQ7Ci0JCSp0b3A9cmVjdC50b3A7Ci0JCSpib3R0b209cmVjdC5ib3R0b207Ci0JfQorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGTGlua19HZXRSZWN0KEZQREZfUEFHRUxJTksgbGlua19wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tKSB7CisgIGlmICghbGlua19wYWdlKQorICAgIHJldHVybjsKKyAgSVBERl9MaW5rRXh0cmFjdCogcGFnZUxpbmsgPSAoSVBERl9MaW5rRXh0cmFjdCopbGlua19wYWdlOworICBDRlhfUmVjdEFycmF5IHJlY3RBcnJheTsKKyAgcGFnZUxpbmstPkdldFJlY3RzKGxpbmtfaW5kZXgsIHJlY3RBcnJheSk7CisgIGlmIChyZWN0X2luZGV4ID49IDAgJiYgcmVjdF9pbmRleCA8IHJlY3RBcnJheS5HZXRTaXplKCkpIHsKKyAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSByZWN0QXJyYXkuR2V0QXQocmVjdF9pbmRleCk7CisgICAgKmxlZnQgPSByZWN0LmxlZnQ7CisgICAgKnJpZ2h0ID0gcmVjdC5yaWdodDsKKyAgICAqdG9wID0gcmVjdC50b3A7CisgICAgKmJvdHRvbSA9IHJlY3QuYm90dG9tOworICB9CiB9Ci1ETExFWFBPUlQgdm9pZAlTVERDQUxMCUZQREZMaW5rX0Nsb3NlV2ViTGlua3MoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UpCi17Ci0gICAgZGVsZXRlIChJUERGX0xpbmtFeHRyYWN0KilsaW5rX3BhZ2U7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZMaW5rX0Nsb3NlV2ViTGlua3MoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UpIHsKKyAgZGVsZXRlIChJUERGX0xpbmtFeHRyYWN0KilsaW5rX3BhZ2U7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0X2VtYmVkZGVydGVzdC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmdGV4dF9lbWJlZGRlcnRlc3QuY3BwCmluZGV4IDgzODRhNDEuLmRkMzczN2EgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0X2VtYmVkZGVydGVzdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnRleHRfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMjUsOCArMjUsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotY2xhc3MgRlBERlRleHRFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHsKLX07CitjbGFzcyBGUERGVGV4dEVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CiAKIFRFU1RfRihGUERGVGV4dEVtYmVkZGVydGVzdCwgVGV4dCkgewogICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkLnBkZiIpKTsKQEAgLTYzLDE4ICs2MiwxNCBAQAogICBFWFBFQ1RfTkVBUig0OS44NDQsIGJvdHRvbSwgMC4wMDEpOwogICBFWFBFQ1RfTkVBUig1NS41MjAsIHRvcCwgMC4wMDEpOwogCi0gIEVYUEVDVF9FUSg0LCBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcygKLSAgICAgIHRleHRwYWdlLCA0Mi4wLCA1MC4wLCAxLjAsIDEuMCkpOwotICBFWFBFQ1RfRVEoLTEsIEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKAotICAgICAgdGV4dHBhZ2UsIDAuMCwgMC4wLCAxLjAsIDEuMCkpOwotICBFWFBFQ1RfRVEoLTEsIEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKAotICAgICAgdGV4dHBhZ2UsIDE5OS4wLCAxOTkuMCwgMS4wLCAxLjApKTsKKyAgRVhQRUNUX0VRKDQsIEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKHRleHRwYWdlLCA0Mi4wLCA1MC4wLCAxLjAsIDEuMCkpOworICBFWFBFQ1RfRVEoLTEsIEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKHRleHRwYWdlLCAwLjAsIDAuMCwgMS4wLCAxLjApKTsKKyAgRVhQRUNUX0VRKC0xLCBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcyh0ZXh0cGFnZSwgMTk5LjAsIDE5OS4wLCAxLjAsIDEuMCkpOwogCiAgIC8vIFRlc3Qgb3V0IG9mIHJhbmdlIGluZGljaWVzLgotICBFWFBFQ1RfRVEoLTEsIEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKAotICAgICAgdGV4dHBhZ2UsIDQyLjAsIDEwMDAwMDAwLjAsIDEuMCwgMS4wKSk7Ci0gIEVYUEVDVF9FUSgtMSwgRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3MoCi0gICAgICB0ZXh0cGFnZSwgLTEuMCwgNTAuMCwgMS4wLCAxLjApKTsKKyAgRVhQRUNUX0VRKC0xLAorICAgICAgICAgICAgRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3ModGV4dHBhZ2UsIDQyLjAsIDEwMDAwMDAwLjAsIDEuMCwgMS4wKSk7CisgIEVYUEVDVF9FUSgtMSwgRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3ModGV4dHBhZ2UsIC0xLjAsIDUwLjAsIDEuMCwgMS4wKSk7CiAKICAgLy8gQ291bnQgZG9lcyBub3QgaW5jbHVkZSB0aGUgdGVybWluYXRpbmcgTlVMIGluIHRoZSBzdHJpbmcgbGl0ZXJhbC4KICAgRVhQRUNUX0VRKDIsIEZQREZUZXh0X0NvdW50UmVjdHModGV4dHBhZ2UsIDAsIHNpemVvZihleHBlY3RlZCkgLSAxKSk7CkBAIC0xMTAsMjUgKzEwNSwyNCBAQAogICBFWFBFQ1RfRVEoMC4wLCBib3R0b20pOwogICBFWFBFQ1RfRVEoMC4wLCB0b3ApOwogCi0gIEVYUEVDVF9FUSg5LCBGUERGVGV4dF9HZXRCb3VuZGVkVGV4dCgKLSAgICAgIHRleHRwYWdlLCA0MS4wLCA1Ni4wLCA4Mi4wLCA0OC4wLCAwLCAwKSk7CisgIEVYUEVDVF9FUSg5LCBGUERGVGV4dF9HZXRCb3VuZGVkVGV4dCh0ZXh0cGFnZSwgNDEuMCwgNTYuMCwgODIuMCwgNDguMCwgMCwgMCkpOwogCiAgIC8vIEV4dHJhY3Qgc3RhcnRpbmcgYXQgY2hhcmFjdGVyIDQgYXMgYWJvdmUuCiAgIG1lbXNldChmaXhlZF9idWZmZXIsIDB4YmQsIHNpemVvZihmaXhlZF9idWZmZXIpKTsKLSAgRVhQRUNUX0VRKDEsIEZQREZUZXh0X0dldEJvdW5kZWRUZXh0KAotICAgICAgdGV4dHBhZ2UsIDQxLjAsIDU2LjAsIDgyLjAsIDQ4LjAsIGZpeGVkX2J1ZmZlciwgMSkpOworICBFWFBFQ1RfRVEoMSwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQodGV4dHBhZ2UsIDQxLjAsIDU2LjAsIDgyLjAsIDQ4LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9idWZmZXIsIDEpKTsKICAgRVhQRUNUX1RSVUUoY2hlY2tfdW5zaWduZWRfc2hvcnRzKGV4cGVjdGVkICsgNCwgZml4ZWRfYnVmZmVyLCAxKSk7CiAgIEVYUEVDVF9FUSgweGJkYmQsIGZpeGVkX2J1ZmZlclsxXSk7CiAKICAgbWVtc2V0KGZpeGVkX2J1ZmZlciwgMHhiZCwgc2l6ZW9mKGZpeGVkX2J1ZmZlcikpOwotICBFWFBFQ1RfRVEoOSwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQoCi0gICAgICB0ZXh0cGFnZSwgNDEuMCwgNTYuMCwgODIuMCwgNDguMCwgZml4ZWRfYnVmZmVyLCA5KSk7CisgIEVYUEVDVF9FUSg5LCBGUERGVGV4dF9HZXRCb3VuZGVkVGV4dCh0ZXh0cGFnZSwgNDEuMCwgNTYuMCwgODIuMCwgNDguMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX2J1ZmZlciwgOSkpOwogICBFWFBFQ1RfVFJVRShjaGVja191bnNpZ25lZF9zaG9ydHMoZXhwZWN0ZWQgKyA0LCBmaXhlZF9idWZmZXIsIDkpKTsKICAgRVhQRUNUX0VRKDB4YmRiZCwgZml4ZWRfYnVmZmVyWzldKTsKIAogICBtZW1zZXQoZml4ZWRfYnVmZmVyLCAweGJkLCBzaXplb2YoZml4ZWRfYnVmZmVyKSk7Ci0gIEVYUEVDVF9FUSgxMCwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQoCi0gICAgICB0ZXh0cGFnZSwgNDEuMCwgNTYuMCwgODIuMCwgNDguMCwgZml4ZWRfYnVmZmVyLCAxMjgpKTsKKyAgRVhQRUNUX0VRKDEwLCBGUERGVGV4dF9HZXRCb3VuZGVkVGV4dCh0ZXh0cGFnZSwgNDEuMCwgNTYuMCwgODIuMCwgNDguMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9idWZmZXIsIDEyOCkpOwogICBFWFBFQ1RfVFJVRShjaGVja191bnNpZ25lZF9zaG9ydHMoZXhwZWN0ZWQgKyA0LCBmaXhlZF9idWZmZXIsIDkpKTsKICAgRVhQRUNUX0VRKDB1LCBmaXhlZF9idWZmZXJbOV0pOwogICBFWFBFQ1RfRVEoMHhiZGJkLCBmaXhlZF9idWZmZXJbMTBdKTsKQEAgLTE0NiwxMCArMTQwLDEwIEBACiAgIEVYUEVDVF9ORShudWxscHRyLCB0ZXh0cGFnZSk7CiAKICAgLy8gQXZvaWQgaXNzdWVzIHdpdGggc3lzdGVtIHdjaGFyX3Qgd2lkdGggdnMuIEZQREZfV2lkZVN0cmluZy4KLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9wZVtdID0geyAnbicsICdvJywgJ3AnLCAnZScsICdcMCcgfTsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgd29ybGRbXSA9IHsgJ3cnLCAnbycsICdyJywgJ2wnLCAnZCcsICdcMCcgfTsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgd29ybGRfY2Fwc1tdID0geyAnVycsICdPJywgJ1InLCAnTCcsICdEJywgJ1wwJyB9OwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCB3b3JsZF9zdWJzdHJbXSA9IHsgJ28nLCAncicsICdsJywgJ2QnLCAnXDAnIH07CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcGVbXSA9IHsnbicsICdvJywgJ3AnLCAnZScsICdcMCd9OworICBjb25zdCB1bnNpZ25lZCBzaG9ydCB3b3JsZFtdID0geyd3JywgJ28nLCAncicsICdsJywgJ2QnLCAnXDAnfTsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgd29ybGRfY2Fwc1tdID0geydXJywgJ08nLCAnUicsICdMJywgJ0QnLCAnXDAnfTsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgd29ybGRfc3Vic3RyW10gPSB7J28nLCAncicsICdsJywgJ2QnLCAnXDAnfTsKIAogICAvLyBObyBvY2N1cmVuY2VzIG9mICJub3BlIiBpbiB0ZXN0IHBhZ2UuCiAgIEZQREZfU0NISEFORExFIHNlYXJjaCA9IEZQREZUZXh0X0ZpbmRTdGFydCh0ZXh0cGFnZSwgbm9wZSwgMCwgMCk7CkBAIC0yMDMsOCArMTk3LDggQEAKICAgRlBERlRleHRfRmluZENsb3NlKHNlYXJjaCk7CiAKICAgLy8gRXhhY3Qgc2VhcmNoIHVuYWZmZWN0ZWQgYnkgY2FzZSBzZW5zaXRpaXR5IGFuZCB3aG9sZSB3b3JkIGZsYWdzLgotICBzZWFyY2ggPSBGUERGVGV4dF9GaW5kU3RhcnQoCi0gICAgICB0ZXh0cGFnZSwgd29ybGQsIEZQREZfTUFUQ0hDQVNFIHwgRlBERl9NQVRDSFdIT0xFV09SRCwgMCk7CisgIHNlYXJjaCA9IEZQREZUZXh0X0ZpbmRTdGFydCh0ZXh0cGFnZSwgd29ybGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX01BVENIQ0FTRSB8IEZQREZfTUFUQ0hXSE9MRVdPUkQsIDApOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgc2VhcmNoKTsKICAgRVhQRUNUX1RSVUUoRlBERlRleHRfRmluZE5leHQoc2VhcmNoKSk7CiAgIEVYUEVDVF9FUSg3LCBGUERGVGV4dF9HZXRTY2hSZXN1bHRJbmRleChzZWFyY2gpKTsKQEAgLTI5MywyNyArMjg3LDI4IEBACiAKICAgLy8gQ2hlY2sgYnVmZmVyIHRoYXQgZG9lc24ndCBoYXZlIHNwYWNlIGZvciBhIHRlcm1pbmF0aW5nIE5VTC4KICAgbWVtc2V0KGZpeGVkX2J1ZmZlciwgMHhiZCwgc2l6ZW9mKGZpeGVkX2J1ZmZlcikpOwotICBFWFBFQ1RfRVEoc2l6ZW9mKGV4cGVjdGVkX3VybCkgLSAxLCBGUERGTGlua19HZXRVUkwoCi0gICAgICBwYWdlbGluaywgMCwgZml4ZWRfYnVmZmVyLCBzaXplb2YoZXhwZWN0ZWRfdXJsKSAtIDEpKTsKLSAgRVhQRUNUX1RSVUUoY2hlY2tfdW5zaWduZWRfc2hvcnRzKAotICAgICAgZXhwZWN0ZWRfdXJsLCBmaXhlZF9idWZmZXIsIHNpemVvZihleHBlY3RlZF91cmwpIC0gMSkpOworICBFWFBFQ1RfRVEoCisgICAgICBzaXplb2YoZXhwZWN0ZWRfdXJsKSAtIDEsCisgICAgICBGUERGTGlua19HZXRVUkwocGFnZWxpbmssIDAsIGZpeGVkX2J1ZmZlciwgc2l6ZW9mKGV4cGVjdGVkX3VybCkgLSAxKSk7CisgIEVYUEVDVF9UUlVFKGNoZWNrX3Vuc2lnbmVkX3Nob3J0cyhleHBlY3RlZF91cmwsIGZpeGVkX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihleHBlY3RlZF91cmwpIC0gMSkpOwogICBFWFBFQ1RfRVEoMHhiZGJkLCBmaXhlZF9idWZmZXJbc2l6ZW9mKGV4cGVjdGVkX3VybCkgLSAxXSk7CiAKICAgLy8gUmV0cmVpdmUgbGluayB3aXRoIGV4YWN0bHktc2l6ZWQgYnVmZmVyLgogICBtZW1zZXQoZml4ZWRfYnVmZmVyLCAweGJkLCBzaXplb2YoZml4ZWRfYnVmZmVyKSk7Ci0gIEVYUEVDVF9FUShzaXplb2YoZXhwZWN0ZWRfdXJsKSwgRlBERkxpbmtfR2V0VVJMKAotICAgICAgcGFnZWxpbmssIDAsIGZpeGVkX2J1ZmZlciwgc2l6ZW9mKGV4cGVjdGVkX3VybCkpKTsKLSAgRVhQRUNUX1RSVUUoY2hlY2tfdW5zaWduZWRfc2hvcnRzKAotICAgICAgZXhwZWN0ZWRfdXJsLCBmaXhlZF9idWZmZXIsIHNpemVvZihleHBlY3RlZF91cmwpKSk7CisgIEVYUEVDVF9FUShzaXplb2YoZXhwZWN0ZWRfdXJsKSwKKyAgICAgICAgICAgIEZQREZMaW5rX0dldFVSTChwYWdlbGluaywgMCwgZml4ZWRfYnVmZmVyLCBzaXplb2YoZXhwZWN0ZWRfdXJsKSkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIGNoZWNrX3Vuc2lnbmVkX3Nob3J0cyhleHBlY3RlZF91cmwsIGZpeGVkX2J1ZmZlciwgc2l6ZW9mKGV4cGVjdGVkX3VybCkpKTsKICAgRVhQRUNUX0VRKDB1LCBmaXhlZF9idWZmZXJbc2l6ZW9mKGV4cGVjdGVkX3VybCkgLSAxXSk7CiAgIEVYUEVDVF9FUSgweGJkYmQsIGZpeGVkX2J1ZmZlcltzaXplb2YoZXhwZWN0ZWRfdXJsKV0pOwogCiAgIC8vIFJldHJlaXZlIGxpbmsgd2l0aCBhbXBsZS1zaXplZC1idWZmZXIuCiAgIG1lbXNldChmaXhlZF9idWZmZXIsIDB4YmQsIHNpemVvZihmaXhlZF9idWZmZXIpKTsKLSAgRVhQRUNUX0VRKHNpemVvZihleHBlY3RlZF91cmwpLCBGUERGTGlua19HZXRVUkwoCi0gICAgICBwYWdlbGluaywgMCwgZml4ZWRfYnVmZmVyLCAxMjgpKTsKLSAgRVhQRUNUX1RSVUUoY2hlY2tfdW5zaWduZWRfc2hvcnRzKAotICAgICAgZXhwZWN0ZWRfdXJsLCBmaXhlZF9idWZmZXIsIHNpemVvZihleHBlY3RlZF91cmwpKSk7CisgIEVYUEVDVF9FUShzaXplb2YoZXhwZWN0ZWRfdXJsKSwKKyAgICAgICAgICAgIEZQREZMaW5rX0dldFVSTChwYWdlbGluaywgMCwgZml4ZWRfYnVmZmVyLCAxMjgpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBjaGVja191bnNpZ25lZF9zaG9ydHMoZXhwZWN0ZWRfdXJsLCBmaXhlZF9idWZmZXIsIHNpemVvZihleHBlY3RlZF91cmwpKSk7CiAgIEVYUEVDVF9FUSgwdSwgZml4ZWRfYnVmZmVyW3NpemVvZihleHBlY3RlZF91cmwpIC0gMV0pOwogICBFWFBFQ1RfRVEoMHhiZGJkLCBmaXhlZF9idWZmZXJbc2l6ZW9mKGV4cGVjdGVkX3VybCldKTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnZpZXcuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnZpZXcuY3BwCmluZGV4IGQ2NjI1MjAuLjE1OTQ0MGQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmdmlldy5jcHAKQEAgLTIxLDQzMiArMjEsNDMzIEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3V0aWwuaCIKIAotQ0ZQREZfRmlsZVN0cmVhbTo6Q0ZQREZfRmlsZVN0cmVhbShGUERGX0ZJTEVIQU5ETEVSKiBwRlMpCi17Ci0JbV9wRlMJCQk9CXBGUzsKLQltX25DdXJQb3MJCT0JMDsKK0NGUERGX0ZpbGVTdHJlYW06OkNGUERGX0ZpbGVTdHJlYW0oRlBERl9GSUxFSEFORExFUiogcEZTKSB7CisgIG1fcEZTID0gcEZTOworICBtX25DdXJQb3MgPSAwOwogfQogCi1JRlhfRmlsZVN0cmVhbSogQ0ZQREZfRmlsZVN0cmVhbTo6UmV0YWluKCkKLXsKLQlyZXR1cm4gdGhpczsKK0lGWF9GaWxlU3RyZWFtKiBDRlBERl9GaWxlU3RyZWFtOjpSZXRhaW4oKSB7CisgIHJldHVybiB0aGlzOwogfQogCi12b2lkIENGUERGX0ZpbGVTdHJlYW06OlJlbGVhc2UoKQotewotCWlmIChtX3BGUyAmJiBtX3BGUy0+UmVsZWFzZSkKLQkJbV9wRlMtPlJlbGVhc2UobV9wRlMtPmNsaWVudERhdGEpOwotCWRlbGV0ZSB0aGlzOwordm9pZCBDRlBERl9GaWxlU3RyZWFtOjpSZWxlYXNlKCkgeworICBpZiAobV9wRlMgJiYgbV9wRlMtPlJlbGVhc2UpCisgICAgbV9wRlMtPlJlbGVhc2UobV9wRlMtPmNsaWVudERhdGEpOworICBkZWxldGUgdGhpczsKIH0KIAotRlhfRklMRVNJWkUgQ0ZQREZfRmlsZVN0cmVhbTo6R2V0U2l6ZSgpCi17Ci0JaWYgKG1fcEZTICYmIG1fcEZTLT5HZXRTaXplKQotCQlyZXR1cm4gKEZYX0ZJTEVTSVpFKW1fcEZTLT5HZXRTaXplKG1fcEZTLT5jbGllbnREYXRhKTsKLQlyZXR1cm4gMDsKK0ZYX0ZJTEVTSVpFIENGUERGX0ZpbGVTdHJlYW06OkdldFNpemUoKSB7CisgIGlmIChtX3BGUyAmJiBtX3BGUy0+R2V0U2l6ZSkKKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKW1fcEZTLT5HZXRTaXplKG1fcEZTLT5jbGllbnREYXRhKTsKKyAgcmV0dXJuIDA7CiB9CiAKLUZYX0JPT0wgQ0ZQREZfRmlsZVN0cmVhbTo6SXNFT0YoKQotewotCXJldHVybiBtX25DdXJQb3MgPj0gR2V0U2l6ZSgpOworRlhfQk9PTCBDRlBERl9GaWxlU3RyZWFtOjpJc0VPRigpIHsKKyAgcmV0dXJuIG1fbkN1clBvcyA+PSBHZXRTaXplKCk7CiB9CiAKLUZYX0JPT0wgQ0ZQREZfRmlsZVN0cmVhbTo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLXsKLQlpZiAoIWJ1ZmZlciB8fCAhc2l6ZSB8fCAhbV9wRlMtPlJlYWRCbG9jaykgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDRlBERl9GaWxlU3RyZWFtOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFidWZmZXIgfHwgIXNpemUgfHwgIW1fcEZTLT5SZWFkQmxvY2spCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKG1fcEZTLT5SZWFkQmxvY2sobV9wRlMtPmNsaWVudERhdGEsIChGUERGX0RXT1JEKW9mZnNldCwgYnVmZmVyLCAoRlBERl9EV09SRClzaXplKSA9PSAwKQotCXsKLQkJbV9uQ3VyUG9zID0gb2Zmc2V0ICsgc2l6ZTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCXJldHVybiBGQUxTRTsKKyAgaWYgKG1fcEZTLT5SZWFkQmxvY2sobV9wRlMtPmNsaWVudERhdGEsIChGUERGX0RXT1JEKW9mZnNldCwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAoRlBERl9EV09SRClzaXplKSA9PSAwKSB7CisgICAgbV9uQ3VyUG9zID0gb2Zmc2V0ICsgc2l6ZTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLXNpemVfdCBDRlBERl9GaWxlU3RyZWFtOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLXsKLQlpZiAoIWJ1ZmZlciB8fCAhc2l6ZSB8fCAhbV9wRlMtPlJlYWRCbG9jaykgcmV0dXJuIDA7CitzaXplX3QgQ0ZQREZfRmlsZVN0cmVhbTo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFidWZmZXIgfHwgIXNpemUgfHwgIW1fcEZTLT5SZWFkQmxvY2spCisgICAgcmV0dXJuIDA7CiAKLQlGWF9GSUxFU0laRSBuU2l6ZSA9IEdldFNpemUoKTsKLQlpZiAobV9uQ3VyUG9zID49IG5TaXplKSByZXR1cm4gMDsKLQlGWF9GSUxFU0laRSBkd0F2YWlsID0gblNpemUgLSBtX25DdXJQb3M7Ci0JaWYgKGR3QXZhaWwgPCAoRlhfRklMRVNJWkUpc2l6ZSkgc2l6ZSA9IChzaXplX3QpZHdBdmFpbDsKLQlpZiAobV9wRlMtPlJlYWRCbG9jayhtX3BGUy0+Y2xpZW50RGF0YSwgKEZQREZfRFdPUkQpbV9uQ3VyUG9zLCBidWZmZXIsIChGUERGX0RXT1JEKXNpemUpID09IDApCi0JewotCQltX25DdXJQb3MgKz0gc2l6ZTsKLQkJcmV0dXJuIHNpemU7Ci0JfQorICBGWF9GSUxFU0laRSBuU2l6ZSA9IEdldFNpemUoKTsKKyAgaWYgKG1fbkN1clBvcyA+PSBuU2l6ZSkKKyAgICByZXR1cm4gMDsKKyAgRlhfRklMRVNJWkUgZHdBdmFpbCA9IG5TaXplIC0gbV9uQ3VyUG9zOworICBpZiAoZHdBdmFpbCA8IChGWF9GSUxFU0laRSlzaXplKQorICAgIHNpemUgPSAoc2l6ZV90KWR3QXZhaWw7CisgIGlmIChtX3BGUy0+UmVhZEJsb2NrKG1fcEZTLT5jbGllbnREYXRhLCAoRlBERl9EV09SRCltX25DdXJQb3MsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZQREZfRFdPUkQpc2l6ZSkgPT0gMCkgeworICAgIG1fbkN1clBvcyArPSBzaXplOworICAgIHJldHVybiBzaXplOworICB9CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9CiAKLUZYX0JPT0wgQ0ZQREZfRmlsZVN0cmVhbTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpCi17Ci0JaWYgKCFtX3BGUyB8fCAhbV9wRlMtPldyaXRlQmxvY2spIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ0ZQREZfRmlsZVN0cmVhbTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgIGlmICghbV9wRlMgfHwgIW1fcEZTLT5Xcml0ZUJsb2NrKQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmKG1fcEZTLT5Xcml0ZUJsb2NrKG1fcEZTLT5jbGllbnREYXRhLCAoRlBERl9EV09SRClvZmZzZXQsIGJ1ZmZlciwgKEZQREZfRFdPUkQpc2l6ZSkgPT0gMCkKLQl7Ci0JCW1fbkN1clBvcyA9IG9mZnNldCArIHNpemU7Ci0JCXJldHVybiBUUlVFOwotCX0KLQlyZXR1cm4gRkFMU0U7CisgIGlmIChtX3BGUy0+V3JpdGVCbG9jayhtX3BGUy0+Y2xpZW50RGF0YSwgKEZQREZfRFdPUkQpb2Zmc2V0LCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAoRlBERl9EV09SRClzaXplKSA9PSAwKSB7CisgICAgbV9uQ3VyUG9zID0gb2Zmc2V0ICsgc2l6ZTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ0ZQREZfRmlsZVN0cmVhbTo6Rmx1c2goKQotewotCWlmICghbV9wRlMgfHwgIW1fcEZTLT5GbHVzaCkgcmV0dXJuIFRSVUU7CitGWF9CT09MIENGUERGX0ZpbGVTdHJlYW06OkZsdXNoKCkgeworICBpZiAoIW1fcEZTIHx8ICFtX3BGUy0+Rmx1c2gpCisgICAgcmV0dXJuIFRSVUU7CiAKLQlyZXR1cm4gbV9wRlMtPkZsdXNoKG1fcEZTLT5jbGllbnREYXRhKSA9PSAwOworICByZXR1cm4gbV9wRlMtPkZsdXNoKG1fcEZTLT5jbGllbnREYXRhKSA9PSAwOwogfQogCi1DUERGX0N1c3RvbUFjY2Vzczo6Q1BERl9DdXN0b21BY2Nlc3MoRlBERl9GSUxFQUNDRVNTKiBwRmlsZUFjY2VzcykKLXsKLQltX0ZpbGVBY2Nlc3MgPSAqcEZpbGVBY2Nlc3M7Ci0JbV9CdWZmZXJPZmZzZXQgPSAoRlhfRFdPUkQpLTE7CitDUERGX0N1c3RvbUFjY2Vzczo6Q1BERl9DdXN0b21BY2Nlc3MoRlBERl9GSUxFQUNDRVNTKiBwRmlsZUFjY2VzcykgeworICBtX0ZpbGVBY2Nlc3MgPSAqcEZpbGVBY2Nlc3M7CisgIG1fQnVmZmVyT2Zmc2V0ID0gKEZYX0RXT1JEKS0xOwogfQogCi1GWF9CT09MIENQREZfQ3VzdG9tQWNjZXNzOjpHZXRCeXRlKEZYX0RXT1JEIHBvcywgdWludDhfdCYgY2gpCi17Ci0JaWYgKHBvcyA+PSBtX0ZpbGVBY2Nlc3MubV9GaWxlTGVuKSByZXR1cm4gRkFMU0U7Ci0JaWYgKG1fQnVmZmVyT2Zmc2V0ID09IChGWF9EV09SRCktMSB8fCBwb3MgPCBtX0J1ZmZlck9mZnNldCB8fCBwb3MgPj0gbV9CdWZmZXJPZmZzZXQgKyA1MTIpIHsKLQkJLy8gTmVlZCB0byByZWFkIGZyb20gZmlsZSBhY2Nlc3MKLQkJbV9CdWZmZXJPZmZzZXQgPSBwb3M7Ci0JCWludCBzaXplID0gNTEyOwotCQlpZiAocG9zICsgNTEyID4gbV9GaWxlQWNjZXNzLm1fRmlsZUxlbikKLQkJCXNpemUgPSBtX0ZpbGVBY2Nlc3MubV9GaWxlTGVuIC0gcG9zOwotCQlpZiAoIW1fRmlsZUFjY2Vzcy5tX0dldEJsb2NrKG1fRmlsZUFjY2Vzcy5tX1BhcmFtLCBtX0J1ZmZlck9mZnNldCwgbV9CdWZmZXIsIHNpemUpKQotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQljaCA9IG1fQnVmZmVyW3BvcyAtIG1fQnVmZmVyT2Zmc2V0XTsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BERl9DdXN0b21BY2Nlc3M6OkdldEJ5dGUoRlhfRFdPUkQgcG9zLCB1aW50OF90JiBjaCkgeworICBpZiAocG9zID49IG1fRmlsZUFjY2Vzcy5tX0ZpbGVMZW4pCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAobV9CdWZmZXJPZmZzZXQgPT0gKEZYX0RXT1JEKS0xIHx8IHBvcyA8IG1fQnVmZmVyT2Zmc2V0IHx8CisgICAgICBwb3MgPj0gbV9CdWZmZXJPZmZzZXQgKyA1MTIpIHsKKyAgICAvLyBOZWVkIHRvIHJlYWQgZnJvbSBmaWxlIGFjY2VzcworICAgIG1fQnVmZmVyT2Zmc2V0ID0gcG9zOworICAgIGludCBzaXplID0gNTEyOworICAgIGlmIChwb3MgKyA1MTIgPiBtX0ZpbGVBY2Nlc3MubV9GaWxlTGVuKQorICAgICAgc2l6ZSA9IG1fRmlsZUFjY2Vzcy5tX0ZpbGVMZW4gLSBwb3M7CisgICAgaWYgKCFtX0ZpbGVBY2Nlc3MubV9HZXRCbG9jayhtX0ZpbGVBY2Nlc3MubV9QYXJhbSwgbV9CdWZmZXJPZmZzZXQsIG1fQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY2ggPSBtX0J1ZmZlcltwb3MgLSBtX0J1ZmZlck9mZnNldF07CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQREZfQ3VzdG9tQWNjZXNzOjpHZXRCbG9jayhGWF9EV09SRCBwb3MsIHVpbnQ4X3QqIHBCdWYsIEZYX0RXT1JEIHNpemUpCi17Ci0JaWYgKHBvcyArIHNpemUgPiBtX0ZpbGVBY2Nlc3MubV9GaWxlTGVuKSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIG1fRmlsZUFjY2Vzcy5tX0dldEJsb2NrKG1fRmlsZUFjY2Vzcy5tX1BhcmFtLCBwb3MsIHBCdWYsIHNpemUpOworRlhfQk9PTCBDUERGX0N1c3RvbUFjY2Vzczo6R2V0QmxvY2soRlhfRFdPUkQgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUpIHsKKyAgaWYgKHBvcyArIHNpemUgPiBtX0ZpbGVBY2Nlc3MubV9GaWxlTGVuKQorICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIG1fRmlsZUFjY2Vzcy5tX0dldEJsb2NrKG1fRmlsZUFjY2Vzcy5tX1BhcmFtLCBwb3MsIHBCdWYsIHNpemUpOwogfQogCi1GWF9CT09MIENQREZfQ3VzdG9tQWNjZXNzOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQotewotICAgIGlmIChvZmZzZXQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfU0FGRV9GSUxFU0laRSBuZXdQb3MgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9GSUxFU0laRSwgc2l6ZV90PihzaXplKTsKLSAgICBuZXdQb3MgKz0gb2Zmc2V0OwotICAgIGlmICghbmV3UG9zLklzVmFsaWQoKSB8fCBuZXdQb3MuVmFsdWVPckRpZSgpID4gbV9GaWxlQWNjZXNzLm1fRmlsZUxlbikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBtX0ZpbGVBY2Nlc3MubV9HZXRCbG9jayhtX0ZpbGVBY2Nlc3MubV9QYXJhbSwgb2Zmc2V0LCh1aW50OF90KikgYnVmZmVyLCBzaXplKTsKK0ZYX0JPT0wgQ1BERl9DdXN0b21BY2Nlc3M6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX1NBRkVfRklMRVNJWkUgbmV3UG9zID0KKyAgICAgIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0ZJTEVTSVpFLCBzaXplX3Q+KHNpemUpOworICBuZXdQb3MgKz0gb2Zmc2V0OworICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkgfHwgbmV3UG9zLlZhbHVlT3JEaWUoKSA+IG1fRmlsZUFjY2Vzcy5tX0ZpbGVMZW4pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIG1fRmlsZUFjY2Vzcy5tX0dldEJsb2NrKG1fRmlsZUFjY2Vzcy5tX1BhcmFtLCBvZmZzZXQsICh1aW50OF90KilidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKIH0KIAotLy8wIGJpdDogRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTCisvLyAwIGJpdDogRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTCiBzdGF0aWMgRlhfRFdPUkQgZm94aXRfc2FuZGJveF9wb2xpY3kgPSAweEZGRkZGRkZGOwogCi12b2lkIEZTREtfU2V0U2FuZEJveFBvbGljeShGUERGX0RXT1JEIHBvbGljeSwgRlBERl9CT09MIGVuYWJsZSkKLXsKLQlzd2l0Y2gocG9saWN5KQotCXsKLQljYXNlIEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUzoKLQkJewotCQkJaWYoZW5hYmxlKQotCQkJCWZveGl0X3NhbmRib3hfcG9saWN5IHw9IDB4MDE7Ci0JCQllbHNlCi0JCQkJZm94aXRfc2FuZGJveF9wb2xpY3kgJj0gMHhGRkZGRkZGRTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Cit2b2lkIEZTREtfU2V0U2FuZEJveFBvbGljeShGUERGX0RXT1JEIHBvbGljeSwgRlBERl9CT09MIGVuYWJsZSkgeworICBzd2l0Y2ggKHBvbGljeSkgeworICAgIGNhc2UgRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTOiB7CisgICAgICBpZiAoZW5hYmxlKQorICAgICAgICBmb3hpdF9zYW5kYm94X3BvbGljeSB8PSAweDAxOworICAgICAgZWxzZQorICAgICAgICBmb3hpdF9zYW5kYm94X3BvbGljeSAmPSAweEZGRkZGRkZFOworICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLUZQREZfQk9PTCBGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9EV09SRCBwb2xpY3kpCi17Ci0Jc3dpdGNoKHBvbGljeSkKLQl7Ci0JY2FzZSBGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1M6Ci0JCXsKLQkJCWlmKGZveGl0X3NhbmRib3hfcG9saWN5JjB4MDEpCi0JCQkJcmV0dXJuIFRSVUU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gRkFMU0U7CitGUERGX0JPT0wgRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfRFdPUkQgcG9saWN5KSB7CisgIHN3aXRjaCAocG9saWN5KSB7CisgICAgY2FzZSBGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1M6IHsKKyAgICAgIGlmIChmb3hpdF9zYW5kYm94X3BvbGljeSAmIDB4MDEpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCiBDQ29kZWNfTW9kdWxlTWdyKiBnX3BDb2RlY01vZHVsZSA9IG51bGxwdHI7CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9Jbml0TGlicmFyeSgpCi17Ci0gICAgZ19wQ29kZWNNb2R1bGUgPSBuZXcgQ0NvZGVjX01vZHVsZU1ncigpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0luaXRMaWJyYXJ5KCkgeworICBnX3BDb2RlY01vZHVsZSA9IG5ldyBDQ29kZWNfTW9kdWxlTWdyKCk7CiAKLSAgICBDRlhfR0VNb2R1bGU6OkNyZWF0ZSgpOwotICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPlNldENvZGVjTW9kdWxlKGdfcENvZGVjTW9kdWxlKTsKKyAgQ0ZYX0dFTW9kdWxlOjpDcmVhdGUoKTsKKyAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+U2V0Q29kZWNNb2R1bGUoZ19wQ29kZWNNb2R1bGUpOwogCi0gICAgQ1BERl9Nb2R1bGVNZ3I6OkNyZWF0ZSgpOwotICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+U2V0Q29kZWNNb2R1bGUoZ19wQ29kZWNNb2R1bGUpOwotICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+SW5pdFBhZ2VNb2R1bGUoKTsKLSAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkluaXRSZW5kZXJNb2R1bGUoKTsKKyAgQ1BERl9Nb2R1bGVNZ3I6OkNyZWF0ZSgpOworICBDUERGX01vZHVsZU1ncjo6R2V0KCktPlNldENvZGVjTW9kdWxlKGdfcENvZGVjTW9kdWxlKTsKKyAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5Jbml0UGFnZU1vZHVsZSgpOworICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkluaXRSZW5kZXJNb2R1bGUoKTsKIAotICAgIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5Jbml0aWFsaXplKCk7CisgIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5Jbml0aWFsaXplKCk7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9EZXN0cm95TGlicmFyeSgpCi17Ci0gICAgQ1BERlhGQV9BcHA6OlJlbGVhc2VJbnN0YW5jZSgpOwotICAgIENQREZfTW9kdWxlTWdyOjpEZXN0cm95KCk7Ci0gICAgQ0ZYX0dFTW9kdWxlOjpEZXN0cm95KCk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRGVzdHJveUxpYnJhcnkoKSB7CisgIENQREZYRkFfQXBwOjpSZWxlYXNlSW5zdGFuY2UoKTsKKyAgQ1BERl9Nb2R1bGVNZ3I6OkRlc3Ryb3koKTsKKyAgQ0ZYX0dFTW9kdWxlOjpEZXN0cm95KCk7CiAKLSAgICBkZWxldGUgZ19wQ29kZWNNb2R1bGU7Ci0gICAgZ19wQ29kZWNNb2R1bGUgPSBudWxscHRyOworICBkZWxldGUgZ19wQ29kZWNNb2R1bGU7CisgIGdfcENvZGVjTW9kdWxlID0gbnVsbHB0cjsKIH0KIAogI2lmbmRlZiBfV0lOMzIKIGludCBnX0xhc3RFcnJvcjsKLXZvaWQgU2V0TGFzdEVycm9yKGludCBlcnIpCi17Ci0JZ19MYXN0RXJyb3IgPSBlcnI7Cit2b2lkIFNldExhc3RFcnJvcihpbnQgZXJyKSB7CisgIGdfTGFzdEVycm9yID0gZXJyOwogfQogCi1pbnQgR2V0TGFzdEVycm9yKCkKLXsKLQlyZXR1cm4gZ19MYXN0RXJyb3I7CitpbnQgR2V0TGFzdEVycm9yKCkgeworICByZXR1cm4gZ19MYXN0RXJyb3I7CiB9CiAjZW5kaWYKIAotdm9pZCBQcm9jZXNzUGFyc2VFcnJvcihGWF9EV09SRCBlcnJfY29kZSkKLXsKLQkvLyBUcmFuc2xhdGUgRlBERkFQSSBlcnJvciBjb2RlIHRvIEZQREZWSUVXIGVycm9yIGNvZGUKLQlzd2l0Y2ggKGVycl9jb2RlKSB7Ci0JCWNhc2UgUERGUEFSU0VfRVJST1JfRklMRToKLQkJCWVycl9jb2RlID0gRlBERl9FUlJfRklMRTsKLQkJCWJyZWFrOwotCQljYXNlIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDoKLQkJCWVycl9jb2RlID0gRlBERl9FUlJfRk9STUFUOwotCQkJYnJlYWs7Ci0JCWNhc2UgUERGUEFSU0VfRVJST1JfUEFTU1dPUkQ6Ci0JCQllcnJfY29kZSA9IEZQREZfRVJSX1BBU1NXT1JEOwotCQkJYnJlYWs7Ci0JCWNhc2UgUERGUEFSU0VfRVJST1JfSEFORExFUjoKLQkJCWVycl9jb2RlID0gRlBERl9FUlJfU0VDVVJJVFk7Ci0JCQlicmVhazsKLQl9Ci0JU2V0TGFzdEVycm9yKGVycl9jb2RlKTsKK3ZvaWQgUHJvY2Vzc1BhcnNlRXJyb3IoRlhfRFdPUkQgZXJyX2NvZGUpIHsKKyAgLy8gVHJhbnNsYXRlIEZQREZBUEkgZXJyb3IgY29kZSB0byBGUERGVklFVyBlcnJvciBjb2RlCisgIHN3aXRjaCAoZXJyX2NvZGUpIHsKKyAgICBjYXNlIFBERlBBUlNFX0VSUk9SX0ZJTEU6CisgICAgICBlcnJfY29kZSA9IEZQREZfRVJSX0ZJTEU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDoKKyAgICAgIGVycl9jb2RlID0gRlBERl9FUlJfRk9STUFUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZQQVJTRV9FUlJPUl9QQVNTV09SRDoKKyAgICAgIGVycl9jb2RlID0gRlBERl9FUlJfUEFTU1dPUkQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERlBBUlNFX0VSUk9SX0hBTkRMRVI6CisgICAgICBlcnJfY29kZSA9IEZQREZfRVJSX1NFQ1VSSVRZOworICAgICAgYnJlYWs7CisgIH0KKyAgU2V0TGFzdEVycm9yKGVycl9jb2RlKTsKIH0KIAotRExMRVhQT1JUIHZvaWQJU1REQ0FMTCBGUERGX1NldFNhbmRCb3hQb2xpY3koRlBERl9EV09SRCBwb2xpY3ksIEZQREZfQk9PTCBlbmFibGUpCi17Ci0JcmV0dXJuIEZTREtfU2V0U2FuZEJveFBvbGljeShwb2xpY3ksIGVuYWJsZSk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0U2FuZEJveFBvbGljeShGUERGX0RXT1JEIHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBlbmFibGUpIHsKKyAgcmV0dXJuIEZTREtfU2V0U2FuZEJveFBvbGljeShwb2xpY3ksIGVuYWJsZSk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERl9Mb2FkRG9jdW1lbnQoRlBERl9TVFJJTkcgZmlsZV9wYXRoLCBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpCi17Ci0JQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSBGWF9ORVcgQ1BERl9QYXJzZXI7Ci0JcFBhcnNlci0+U2V0UGFzc3dvcmQocGFzc3dvcmQpOworRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGX0xvYWREb2N1bWVudChGUERGX1NUUklORyBmaWxlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBwYXNzd29yZCkgeworICBDUERGX1BhcnNlciogcFBhcnNlciA9IEZYX05FVyBDUERGX1BhcnNlcjsKKyAgcFBhcnNlci0+U2V0UGFzc3dvcmQocGFzc3dvcmQpOwogCi0JRlhfRFdPUkQgZXJyX2NvZGUgPSBwUGFyc2VyLT5TdGFydFBhcnNlKChjb25zdCBGWF9DSEFSKilmaWxlX3BhdGgpOwotCWlmIChlcnJfY29kZSkgewotCQlkZWxldGUgcFBhcnNlcjsKLQkJUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBQYXJzZXItPkdldERvY3VtZW50KCk7Ci0JaWYgKCFwUERGRG9jKQotCQlyZXR1cm4gTlVMTDsKKyAgRlhfRFdPUkQgZXJyX2NvZGUgPSBwUGFyc2VyLT5TdGFydFBhcnNlKChjb25zdCBGWF9DSEFSKilmaWxlX3BhdGgpOworICBpZiAoZXJyX2NvZGUpIHsKKyAgICBkZWxldGUgcFBhcnNlcjsKKyAgICBQcm9jZXNzUGFyc2VFcnJvcihlcnJfY29kZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBQYXJzZXItPkdldERvY3VtZW50KCk7CisgIGlmICghcFBERkRvYykKKyAgICByZXR1cm4gTlVMTDsKIAotCUNQREZYRkFfQXBwKiBwUHJvdmlkZXIgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKTsKLQlDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBGWF9ORVcgQ1BERlhGQV9Eb2N1bWVudChwUERGRG9jLCBwUHJvdmlkZXIpOwotCXJldHVybiBwRG9jdW1lbnQ7CisgIENQREZYRkFfQXBwKiBwUHJvdmlkZXIgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gRlhfTkVXIENQREZYRkFfRG9jdW1lbnQocFBERkRvYywgcFByb3ZpZGVyKTsKKyAgcmV0dXJuIHBEb2N1bWVudDsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfSGFzWEZBRmllbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50KiBkb2NUeXBlKQotewotCWlmICghZG9jdW1lbnQpCi0JCXJldHVybiBGQUxTRTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0hhc1hGQUZpZWxkKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRvY1R5cGUpIHsKKyAgaWYgKCFkb2N1bWVudCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDUERGX0RvY3VtZW50ICpwZGZEb2MgPSAoc3RhdGljX2Nhc3Q8Q1BERlhGQV9Eb2N1bWVudCAqPihkb2N1bWVudCkpLT5HZXRQREZEb2MoKTsKLQlpZiAoIXBkZkRvYykKLQkJcmV0dXJuIEZBTFNFOworICBDUERGX0RvY3VtZW50KiBwZGZEb2MgPQorICAgICAgKHN0YXRpY19jYXN0PENQREZYRkFfRG9jdW1lbnQqPihkb2N1bWVudCkpLT5HZXRQREZEb2MoKTsKKyAgaWYgKCFwZGZEb2MpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBkZkRvYy0+R2V0Um9vdCgpOwotCWlmICghcFJvb3QpCi0JCXJldHVybiBGQUxTRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBkZkRvYy0+R2V0Um9vdCgpOworICBpZiAoIXBSb290KQorICAgIHJldHVybiBGQUxTRTsKIAotCUNQREZfRGljdGlvbmFyeSogcEFjcm9Gb3JtID0gcFJvb3QtPkdldERpY3QoIkFjcm9Gb3JtIik7Ci0JaWYgKCFwQWNyb0Zvcm0pCi0JCXJldHVybiBGQUxTRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgaWYgKCFwQWNyb0Zvcm0pCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9PYmplY3QqIHBYRkEgPSBwQWNyb0Zvcm0tPkdldEVsZW1lbnQoIlhGQSIpOwotCWlmICghcFhGQSkKLQkJcmV0dXJuIEZBTFNFOworICBDUERGX09iamVjdCogcFhGQSA9IHBBY3JvRm9ybS0+R2V0RWxlbWVudCgiWEZBIik7CisgIGlmICghcFhGQSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlGWF9CT09MIGJEeW5hbWljWEZBID0gcFJvb3QtPkdldEJvb2xlYW4oIk5lZWRzUmVuZGVyaW5nIiwgRkFMU0UpOworICBGWF9CT09MIGJEeW5hbWljWEZBID0gcFJvb3QtPkdldEJvb2xlYW4oIk5lZWRzUmVuZGVyaW5nIiwgRkFMU0UpOwogCi0JaWYgKGJEeW5hbWljWEZBKQotCQkqZG9jVHlwZSA9IERPQ1RZUEVfRFlOSU1JQ19YRkE7Ci0JZWxzZQotCQkqZG9jVHlwZSA9IERPQ1RZUEVfU1RBVElDX1hGQTsKKyAgaWYgKGJEeW5hbWljWEZBKQorICAgICpkb2NUeXBlID0gRE9DVFlQRV9EWU5JTUlDX1hGQTsKKyAgZWxzZQorICAgICpkb2NUeXBlID0gRE9DVFlQRV9TVEFUSUNfWEZBOwogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1ETExFWFBPUlQgIEZQREZfQk9PTCBTVERDQUxMIEZQREZfTG9hZFhGQShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotewotCXJldHVybiBkb2N1bWVudCAmJiAoc3RhdGljX2Nhc3Q8Q1BERlhGQV9Eb2N1bWVudCAqPihkb2N1bWVudCkpLT5Mb2FkWEZBRG9jKCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9Mb2FkWEZBKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgcmV0dXJuIGRvY3VtZW50ICYmIChzdGF0aWNfY2FzdDxDUERGWEZBX0RvY3VtZW50Kj4oZG9jdW1lbnQpKS0+TG9hZFhGQURvYygpOwogfQogCitleHRlcm4gdm9pZCBDaGVja1VuU3VwcG9ydEVycm9yKENQREZfRG9jdW1lbnQqIHBEb2MsIEZYX0RXT1JEIGVycl9jb2RlKTsKIAotZXh0ZXJuIHZvaWQgQ2hlY2tVblN1cHBvcnRFcnJvcihDUERGX0RvY3VtZW50ICogcERvYywgRlhfRFdPUkQgZXJyX2NvZGUpOworY2xhc3MgQ01lbUZpbGUgZmluYWwgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkIHsKKyBwdWJsaWM6CisgIENNZW1GaWxlKHVpbnQ4X3QqIHBCdWYsIEZYX0ZJTEVTSVpFIHNpemUpIDogbV9wQnVmKHBCdWYpLCBtX3NpemUoc2l6ZSkge30KIAotY2xhc3MgQ01lbUZpbGUgZmluYWwgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkCi17Ci1wdWJsaWM6Ci0JQ01lbUZpbGUodWludDhfdCogcEJ1ZiwgRlhfRklMRVNJWkUgc2l6ZSk6bV9wQnVmKHBCdWYpLG1fc2l6ZShzaXplKSB7fQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0KKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRTaXplKCkgeyByZXR1cm4gbV9zaXplOyB9CisgIHZpcnR1YWwgRlhfQk9PTCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgRlhfU0FGRV9GSUxFU0laRSBuZXdQb3MgPQorICAgICAgICBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9GSUxFU0laRSwgc2l6ZV90PihzaXplKTsKKyAgICBuZXdQb3MgKz0gb2Zmc2V0OworICAgIGlmICghbmV3UG9zLklzVmFsaWQoKSB8fCBuZXdQb3MuVmFsdWVPckRpZSgpID4gKEZYX0RXT1JEKW1fc2l6ZSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCBtX3BCdWYgKyBvZmZzZXQsIHNpemUpOworICAgIHJldHVybiBUUlVFOworICB9CiAKLQl2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkge2RlbGV0ZSB0aGlzO30KLQl2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRTaXplKCkge3JldHVybiBtX3NpemU7fQotCXZpcnR1YWwgRlhfQk9PTAkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpCi0JewotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9TQUZFX0ZJTEVTSVpFIG5ld1BvcyA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0ZJTEVTSVpFLCBzaXplX3Q+KHNpemUpOwotICAgICAgICAgICAgbmV3UG9zICs9IG9mZnNldDsKLSAgICAgICAgICAgIGlmICghbmV3UG9zLklzVmFsaWQoKSB8fCBuZXdQb3MuVmFsdWVPckRpZSgpID4gKEZYX0RXT1JEKW1fc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLQkgICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgbV9wQnVmK29mZnNldCwgc2l6ZSk7Ci0JICAgIHJldHVybiBUUlVFOwotCX0KLXByaXZhdGU6Ci0JdWludDhfdCogbV9wQnVmOwotCUZYX0ZJTEVTSVpFIG1fc2l6ZTsKKyBwcml2YXRlOgorICB1aW50OF90KiBtX3BCdWY7CisgIEZYX0ZJTEVTSVpFIG1fc2l6ZTsKIH07Ci1ETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZE1lbURvY3VtZW50KGNvbnN0IHZvaWQqIGRhdGFfYnVmLCBpbnQgc2l6ZSwgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKQotewotCUNQREZfUGFyc2VyKiBwUGFyc2VyID0gRlhfTkVXIENQREZfUGFyc2VyOwotCXBQYXJzZXItPlNldFBhc3N3b3JkKHBhc3N3b3JkKTsKLQlDTWVtRmlsZSogcE1lbUZpbGUgPSBuZXcgQ01lbUZpbGUoKHVpbnQ4X3QqKWRhdGFfYnVmLCBzaXplKTsKLQlGWF9EV09SRCBlcnJfY29kZSA9IHBQYXJzZXItPlN0YXJ0UGFyc2UocE1lbUZpbGUpOwotCWlmIChlcnJfY29kZSkgewotCQlkZWxldGUgcFBhcnNlcjsKLQkJUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JQ1BERl9Eb2N1bWVudCAqIHBEb2MgPSBOVUxMOwotCXBEb2MgPSBwUGFyc2VyP3BQYXJzZXItPkdldERvY3VtZW50KCk6TlVMTDsKLQlDaGVja1VuU3VwcG9ydEVycm9yKHBEb2MsIGVycl9jb2RlKTsKLQlDUERGX0RvY3VtZW50KiBwUERGRG9jID0gcFBhcnNlci0+R2V0RG9jdW1lbnQoKTsKLQlpZiAoIXBQREZEb2MpCi0JCXJldHVybiBOVUxMOworRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGX0xvYWRNZW1Eb2N1bWVudChjb25zdCB2b2lkKiBkYXRhX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBwYXNzd29yZCkgeworICBDUERGX1BhcnNlciogcFBhcnNlciA9IEZYX05FVyBDUERGX1BhcnNlcjsKKyAgcFBhcnNlci0+U2V0UGFzc3dvcmQocGFzc3dvcmQpOworICBDTWVtRmlsZSogcE1lbUZpbGUgPSBuZXcgQ01lbUZpbGUoKHVpbnQ4X3QqKWRhdGFfYnVmLCBzaXplKTsKKyAgRlhfRFdPUkQgZXJyX2NvZGUgPSBwUGFyc2VyLT5TdGFydFBhcnNlKHBNZW1GaWxlKTsKKyAgaWYgKGVycl9jb2RlKSB7CisgICAgZGVsZXRlIHBQYXJzZXI7CisgICAgUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBOVUxMOworICBwRG9jID0gcFBhcnNlciA/IHBQYXJzZXItPkdldERvY3VtZW50KCkgOiBOVUxMOworICBDaGVja1VuU3VwcG9ydEVycm9yKHBEb2MsIGVycl9jb2RlKTsKKyAgQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBQYXJzZXItPkdldERvY3VtZW50KCk7CisgIGlmICghcFBERkRvYykKKyAgICByZXR1cm4gTlVMTDsKIAotCUNQREZYRkFfQXBwKiBwUHJvdmlkZXIgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKTsKLQlDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBGWF9ORVcgQ1BERlhGQV9Eb2N1bWVudChwUERGRG9jLCBwUHJvdmlkZXIpOwotCXJldHVybiBwRG9jdW1lbnQ7CisgIENQREZYRkFfQXBwKiBwUHJvdmlkZXIgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gRlhfTkVXIENQREZYRkFfRG9jdW1lbnQocFBERkRvYywgcFByb3ZpZGVyKTsKKyAgcmV0dXJuIHBEb2N1bWVudDsKIH0KIAotRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGX0xvYWRDdXN0b21Eb2N1bWVudChGUERGX0ZJTEVBQ0NFU1MqIHBGaWxlQWNjZXNzLCBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpCi17Ci0JQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSBGWF9ORVcgQ1BERl9QYXJzZXI7Ci0JcFBhcnNlci0+U2V0UGFzc3dvcmQocGFzc3dvcmQpOwotCUNQREZfQ3VzdG9tQWNjZXNzKiBwRmlsZSA9IEZYX05FVyBDUERGX0N1c3RvbUFjY2VzcyhwRmlsZUFjY2Vzcyk7Ci0JRlhfRFdPUkQgZXJyX2NvZGUgPSBwUGFyc2VyLT5TdGFydFBhcnNlKHBGaWxlKTsKLQlpZiAoZXJyX2NvZGUpIHsKLQkJZGVsZXRlIHBQYXJzZXI7Ci0JCVByb2Nlc3NQYXJzZUVycm9yKGVycl9jb2RlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUNQREZfRG9jdW1lbnQgKiBwRG9jID0gTlVMTDsKLQlwRG9jID0gcFBhcnNlcj9wUGFyc2VyLT5HZXREb2N1bWVudCgpOk5VTEw7Ci0JQ2hlY2tVblN1cHBvcnRFcnJvcihwRG9jLCBlcnJfY29kZSk7Ci0JQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBQYXJzZXItPkdldERvY3VtZW50KCk7Ci0JaWYgKCFwUERGRG9jKQotCQlyZXR1cm4gTlVMTDsKK0RMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwKK0ZQREZfTG9hZEN1c3RvbURvY3VtZW50KEZQREZfRklMRUFDQ0VTUyogcEZpbGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpIHsKKyAgQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSBGWF9ORVcgQ1BERl9QYXJzZXI7CisgIHBQYXJzZXItPlNldFBhc3N3b3JkKHBhc3N3b3JkKTsKKyAgQ1BERl9DdXN0b21BY2Nlc3MqIHBGaWxlID0gRlhfTkVXIENQREZfQ3VzdG9tQWNjZXNzKHBGaWxlQWNjZXNzKTsKKyAgRlhfRFdPUkQgZXJyX2NvZGUgPSBwUGFyc2VyLT5TdGFydFBhcnNlKHBGaWxlKTsKKyAgaWYgKGVycl9jb2RlKSB7CisgICAgZGVsZXRlIHBQYXJzZXI7CisgICAgUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBOVUxMOworICBwRG9jID0gcFBhcnNlciA/IHBQYXJzZXItPkdldERvY3VtZW50KCkgOiBOVUxMOworICBDaGVja1VuU3VwcG9ydEVycm9yKHBEb2MsIGVycl9jb2RlKTsKKyAgQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBQYXJzZXItPkdldERvY3VtZW50KCk7CisgIGlmICghcFBERkRvYykKKyAgICByZXR1cm4gTlVMTDsKIAotCUNQREZYRkFfQXBwKiBwUHJvdmlkZXIgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKTsKLQlDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBGWF9ORVcgQ1BERlhGQV9Eb2N1bWVudChwUERGRG9jLCBwUHJvdmlkZXIpOwotCXJldHVybiBwRG9jdW1lbnQ7CisgIENQREZYRkFfQXBwKiBwUHJvdmlkZXIgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gRlhfTkVXIENQREZYRkFfRG9jdW1lbnQocFBERkRvYywgcFByb3ZpZGVyKTsKKyAgcmV0dXJuIHBEb2N1bWVudDsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfR2V0RmlsZVZlcnNpb24oRlBERl9ET0NVTUVOVCBkb2MsIGludCogZmlsZVZlcnNpb24pCi17Ci0JaWYoIWRvY3x8IWZpbGVWZXJzaW9uKSByZXR1cm4gRkFMU0U7Ci0JKmZpbGVWZXJzaW9uID0gMDsKLQlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gKENQREZYRkFfRG9jdW1lbnQqKWRvYzsKLQlDUERGX0RvY3VtZW50KiBwUERGRG9jID0gcERvYy0+R2V0UERGRG9jKCk7Ci0JaWYgKCFwUERGRG9jKSByZXR1cm4gKEZYX0RXT1JEKS0xOwotCUNQREZfUGFyc2VyKiBwUGFyc2VyID0gCShDUERGX1BhcnNlciopcFBERkRvYy0+R2V0UGFyc2VyKCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9HZXRGaWxlVmVyc2lvbihGUERGX0RPQ1VNRU5UIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmlsZVZlcnNpb24pIHsKKyAgaWYgKCFkb2MgfHwgIWZpbGVWZXJzaW9uKQorICAgIHJldHVybiBGQUxTRTsKKyAgKmZpbGVWZXJzaW9uID0gMDsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IChDUERGWEZBX0RvY3VtZW50Kilkb2M7CisgIENQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBwRG9jLT5HZXRQREZEb2MoKTsKKyAgaWYgKCFwUERGRG9jKQorICAgIHJldHVybiAoRlhfRFdPUkQpLTE7CisgIENQREZfUGFyc2VyKiBwUGFyc2VyID0gKENQREZfUGFyc2VyKilwUERGRG9jLT5HZXRQYXJzZXIoKTsKIAotCWlmKCFwUGFyc2VyKQotCQlyZXR1cm4gRkFMU0U7Ci0JKmZpbGVWZXJzaW9uID0gcFBhcnNlci0+R2V0RmlsZVZlcnNpb24oKTsKLQlyZXR1cm4gVFJVRTsKKyAgaWYgKCFwUGFyc2VyKQorICAgIHJldHVybiBGQUxTRTsKKyAgKmZpbGVWZXJzaW9uID0gcFBhcnNlci0+R2V0RmlsZVZlcnNpb24oKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLS8vIGphYmRlbG1hbGVrOiBjaGFuZ2VkIHJldHVybiB0eXBlIGZyb20gRlhfRFdPUkQgdG8gYnVpbGQgb24gTGludXggKGFuZCBtYXRjaCBoZWFkZXIpLgotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldERvY1Blcm1pc3Npb25zKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpCi17Ci0JaWYgKGRvY3VtZW50ID09IE5VTEwpIHJldHVybiAwOwotCUNQREZYRkFfRG9jdW1lbnQqcERvYyA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKLQlDUERGX0RvY3VtZW50KiBwUERGRG9jID0gcERvYy0+R2V0UERGRG9jKCk7Ci0JaWYgKCFwUERGRG9jKSByZXR1cm4gKEZYX0RXT1JEKS0xOwotCUNQREZfUGFyc2VyKiBwUGFyc2VyID0gCShDUERGX1BhcnNlciopcFBERkRvYy0+R2V0UGFyc2VyKCk7Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYXJzZXItPkdldEVuY3J5cHREaWN0KCk7Ci0JaWYgKHBEaWN0ID09IE5VTEwpIHJldHVybiAoRlhfRFdPUkQpLTE7CisvLyBqYWJkZWxtYWxlazogY2hhbmdlZCByZXR1cm4gdHlwZSBmcm9tIEZYX0RXT1JEIHRvIGJ1aWxkIG9uIExpbnV4IChhbmQgbWF0Y2gKKy8vIGhlYWRlcikuCitETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0RG9jUGVybWlzc2lvbnMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworICBpZiAoZG9jdW1lbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKKyAgQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBEb2MtPkdldFBERkRvYygpOworICBpZiAoIXBQREZEb2MpCisgICAgcmV0dXJuIChGWF9EV09SRCktMTsKKyAgQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKXBQREZEb2MtPkdldFBhcnNlcigpOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhcnNlci0+R2V0RW5jcnlwdERpY3QoKTsKKyAgaWYgKHBEaWN0ID09IE5VTEwpCisgICAgcmV0dXJuIChGWF9EV09SRCktMTsKIAotCXJldHVybiBwRGljdC0+R2V0SW50ZWdlcigiUCIpOworICByZXR1cm4gcERpY3QtPkdldEludGVnZXIoIlAiKTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfR2V0U2VjdXJpdHlIYW5kbGVyUmV2aXNpb24oRlBERl9ET0NVTUVOVCBkb2N1bWVudCkKLXsKLSAgICBpZiAoZG9jdW1lbnQgPT0gTlVMTCkgcmV0dXJuIC0xOwotCUNQREZfRG9jdW1lbnQqcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKLSAgICBDUERGX1BhcnNlciogcFBhcnNlciA9IChDUERGX1BhcnNlciopcERvYy0+R2V0UGFyc2VyKCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYXJzZXItPkdldEVuY3J5cHREaWN0KCk7Ci0gICAgaWYgKHBEaWN0ID09IE5VTEwpIHJldHVybiAtMTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX0dldFNlY3VyaXR5SGFuZGxlclJldmlzaW9uKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgaWYgKGRvY3VtZW50ID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBDUERGX0RvY3VtZW50KiBwRG9jID0gKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpOworICBDUERGX1BhcnNlciogcFBhcnNlciA9IChDUERGX1BhcnNlciopcERvYy0+R2V0UGFyc2VyKCk7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFyc2VyLT5HZXRFbmNyeXB0RGljdCgpOworICBpZiAocERpY3QgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CiAKLSAgICByZXR1cm4gcERpY3QtPkdldEludGVnZXIoIlIiKTsKKyAgcmV0dXJuIHBEaWN0LT5HZXRJbnRlZ2VyKCJSIik7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX0dldFBhZ2VDb3VudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotewotCWlmIChkb2N1bWVudCA9PSBOVUxMKSByZXR1cm4gMDsKLQlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OwotCXJldHVybiBwRG9jLT5HZXRQYWdlQ291bnQoKTsKLS8vCXJldHVybiAoKENQREZfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UGFnZUNvdW50KCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRQYWdlQ291bnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworICBpZiAoZG9jdW1lbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKKyAgcmV0dXJuIHBEb2MtPkdldFBhZ2VDb3VudCgpOworICAvLwlyZXR1cm4gKChDUERGX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBhZ2VDb3VudCgpOwogfQogCi1ETExFWFBPUlQgRlBERl9QQUdFIFNURENBTEwgRlBERl9Mb2FkUGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgcGFnZV9pbmRleCkKLXsKLQlpZiAoZG9jdW1lbnQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKLQlpZiAocGFnZV9pbmRleCA8IDAgfHwgcGFnZV9pbmRleCA+PSBwRG9jLT5HZXRQYWdlQ291bnQoKSkgcmV0dXJuIE5VTEw7Ci0vLwlDUERGX1BhcnNlciogcFBhcnNlciA9IChDUERGX1BhcnNlciopZG9jdW1lbnQ7Ci0JcmV0dXJuIHBEb2MtPkdldFBhZ2UocGFnZV9pbmRleCk7CitETExFWFBPUlQgRlBERl9QQUdFIFNURENBTEwgRlBERl9Mb2FkUGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgpIHsKKyAgaWYgKGRvY3VtZW50ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CisgIGlmIChwYWdlX2luZGV4IDwgMCB8fCBwYWdlX2luZGV4ID49IHBEb2MtPkdldFBhZ2VDb3VudCgpKQorICAgIHJldHVybiBOVUxMOworICAvLwlDUERGX1BhcnNlciogcFBhcnNlciA9IChDUERGX1BhcnNlciopZG9jdW1lbnQ7CisgIHJldHVybiBwRG9jLT5HZXRQYWdlKHBhZ2VfaW5kZXgpOwogfQogCi1ETExFWFBPUlQgZG91YmxlIFNURENBTEwgRlBERl9HZXRQYWdlV2lkdGgoRlBERl9QQUdFIHBhZ2UpCi17Ci0JaWYgKCFwYWdlKQotCQlyZXR1cm4gMC4wOwotCXJldHVybiAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBhZ2VXaWR0aCgpOwotLy8JcmV0dXJuICgoQ1BERl9QYWdlKilwYWdlKS0+R2V0UGFnZVdpZHRoKCk7CitETExFWFBPUlQgZG91YmxlIFNURENBTEwgRlBERl9HZXRQYWdlV2lkdGgoRlBERl9QQUdFIHBhZ2UpIHsKKyAgaWYgKCFwYWdlKQorICAgIHJldHVybiAwLjA7CisgIHJldHVybiAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBhZ2VXaWR0aCgpOworICAvLwlyZXR1cm4gKChDUERGX1BhZ2UqKXBhZ2UpLT5HZXRQYWdlV2lkdGgoKTsKIH0KIAotRExMRVhQT1JUIGRvdWJsZSBTVERDQUxMIEZQREZfR2V0UGFnZUhlaWdodChGUERGX1BBR0UgcGFnZSkKLXsKLQlpZiAoIXBhZ2UpIHJldHVybiAwLjA7Ci0vLwlyZXR1cm4gKChDUERGX1BhZ2UqKXBhZ2UpLT5HZXRQYWdlSGVpZ2h0KCk7Ci0JcmV0dXJuICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UGFnZUhlaWdodCgpOworRExMRVhQT1JUIGRvdWJsZSBTVERDQUxMIEZQREZfR2V0UGFnZUhlaWdodChGUERGX1BBR0UgcGFnZSkgeworICBpZiAoIXBhZ2UpCisgICAgcmV0dXJuIDAuMDsKKyAgLy8JcmV0dXJuICgoQ1BERl9QYWdlKilwYWdlKS0+R2V0UGFnZUhlaWdodCgpOworICByZXR1cm4gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQYWdlSGVpZ2h0KCk7CiB9CiAKLXZvaWQgRHJvcENvbnRleHQodm9pZCogZGF0YSkKLXsKLQlkZWxldGUgKENSZW5kZXJDb250ZXh0KilkYXRhOwordm9pZCBEcm9wQ29udGV4dCh2b2lkKiBkYXRhKSB7CisgIGRlbGV0ZSAoQ1JlbmRlckNvbnRleHQqKWRhdGE7CiB9CiAKICNpZiBkZWZpbmVkKF9ERUJVRykgfHwgZGVmaW5lZChERUJVRykKQEAgLTQ1NCw1ODAgKzQ1NSw2NDAgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChfV0lOMzIpCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZShIREMgZGMsIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCi0JCQkJCQlpbnQgcm90YXRlLCBpbnQgZmxhZ3MpCi17Ci0JaWYgKHBhZ2U9PU5VTEwpIHJldHVybjsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7Ci0JaWYgKCFwUGFnZSkgcmV0dXJuOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2UoSERDIGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7CisgIGlmIChwYWdlID09IE5VTEwpCisgICAgcmV0dXJuOworICBDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7CisgIGlmICghcFBhZ2UpCisgICAgcmV0dXJuOwogCi0JQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gRlhfTkVXIENSZW5kZXJDb250ZXh0OwotCXBQYWdlLT5TZXRQcml2YXRlRGF0YSgodm9pZCopMSwgcENvbnRleHQsIERyb3BDb250ZXh0KTsKKyAgQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gRlhfTkVXIENSZW5kZXJDb250ZXh0OworICBwUGFnZS0+U2V0UHJpdmF0ZURhdGEoKHZvaWQqKTEsIHBDb250ZXh0LCBEcm9wQ29udGV4dCk7CiAKICNpZm5kZWYgX1dJTjMyX1dDRQotCUNGWF9ESUJpdG1hcCogcEJpdG1hcCA9IE5VTEw7Ci0JRlhfQk9PTCBiQmFja2dyb3VuZEFscGhhTmVlZGVkPUZBTFNFOwotCWJCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgPSBwUGFnZS0+QmFja2dyb3VuZEFscGhhTmVlZGVkKCk7Ci0JaWYgKGJCYWNrZ3JvdW5kQWxwaGFOZWVkZWQpCi0JewotCi0JCXBCaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOwotCQlwQml0bWFwLT5DcmVhdGUoc2l6ZV94LCBzaXplX3ksIEZYRElCX0FyZ2IpOwotCQlwQml0bWFwLT5DbGVhcigweDAwZmZmZmZmKTsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gTlVMTDsKKyAgRlhfQk9PTCBiQmFja2dyb3VuZEFscGhhTmVlZGVkID0gRkFMU0U7CisgIGJCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgPSBwUGFnZS0+QmFja2dyb3VuZEFscGhhTmVlZGVkKCk7CisgIGlmIChiQmFja2dyb3VuZEFscGhhTmVlZGVkKSB7CisgICAgcEJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7CisgICAgcEJpdG1hcC0+Q3JlYXRlKHNpemVfeCwgc2l6ZV95LCBGWERJQl9BcmdiKTsKKyAgICBwQml0bWFwLT5DbGVhcigweDAwZmZmZmZmKTsKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwotCQlwQ29udGV4dC0+bV9wRGV2aWNlID0gRlhfTkVXIENGWF9Ta2lhRGV2aWNlOwotCQkoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKXBCaXRtYXApOworICAgIHBDb250ZXh0LT5tX3BEZXZpY2UgPSBGWF9ORVcgQ0ZYX1NraWFEZXZpY2U7CisgICAgKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKilwQml0bWFwKTsKICNlbHNlCi0JCXBDb250ZXh0LT5tX3BEZXZpY2UgPSBGWF9ORVcgQ0ZYX0Z4Z2VEZXZpY2U7Ci0JCSgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopcEJpdG1hcCk7CisgICAgcENvbnRleHQtPm1fcERldmljZSA9IEZYX05FVyBDRlhfRnhnZURldmljZTsKKyAgICAoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKXBCaXRtYXApOwogI2VuZGlmCi0JfQotCWVsc2UKLQkgICAgcENvbnRleHQtPm1fcERldmljZSA9IEZYX05FVyBDRlhfV2luZG93c0RldmljZShkYyk7CisgIH0gZWxzZQorICAgIHBDb250ZXh0LT5tX3BEZXZpY2UgPSBGWF9ORVcgQ0ZYX1dpbmRvd3NEZXZpY2UoZGMpOwogCi0JRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUsIGZsYWdzLCBUUlVFLCBOVUxMKTsKKyAgRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncywgVFJVRSwgTlVMTCk7CiAKLQlpZiAoYkJhY2tncm91bmRBbHBoYU5lZWRlZCkKLQl7Ci0JCWlmIChwQml0bWFwKQotCQl7Ci0JCQlDRlhfV2luZG93c0RldmljZSBXaW5EQyhkYyk7CisgIGlmIChiQmFja2dyb3VuZEFscGhhTmVlZGVkKSB7CisgICAgaWYgKHBCaXRtYXApIHsKKyAgICAgIENGWF9XaW5kb3dzRGV2aWNlIFdpbkRDKGRjKTsKIAotIAkJCWlmIChXaW5EQy5HZXREZXZpY2VDYXBzKEZYRENfREVWSUNFX0NMQVNTKSA9PSBGWERDX1BSSU5URVIpCi0gCQkJewotCQkJCUNGWF9ESUJpdG1hcCogcERzdCA9IEZYX05FVyBDRlhfRElCaXRtYXA7Ci0JCQkJaW50IHBpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKLQkJCQlwRHN0LT5DcmVhdGUoc2l6ZV94LCBzaXplX3ksIEZYRElCX1JnYjMyKTsKLQkJCQlGWFNZU19tZW1zZXQocERzdC0+R2V0QnVmZmVyKCksIC0xLCBwaXRjaCpzaXplX3kpOwotCQkJCXBEc3QtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBzaXplX3gsIHNpemVfeSwgcEJpdG1hcCwgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgTlVMTCk7Ci0JCQkJV2luREMuU3RyZXRjaERJQml0cyhwRHN0LDAsMCxzaXplX3gsc2l6ZV95KTsKLQkJCQlkZWxldGUgcERzdDsKLSAJCQl9Ci0gCQkJZWxzZQotIAkJCQlXaW5EQy5TZXRESUJpdHMocEJpdG1hcCwwLDApOwotCi0JCX0KLQl9Ci0jZWxzZQotCS8vIGdldCBjbGlwIHJlZ2lvbgotCVJFQ1QgcmVjdCwgY2xpcHJlY3Q7Ci0JcmVjdC5sZWZ0ID0gc3RhcnRfeDsKLQlyZWN0LnRvcCA9IHN0YXJ0X3k7Ci0JcmVjdC5yaWdodCA9IHN0YXJ0X3ggKyBzaXplX3g7Ci0JcmVjdC5ib3R0b20gPSBzdGFydF95ICsgc2l6ZV95OwotCUdldENsaXBCb3goZGMsICZjbGlwcmVjdCk7Ci0JSW50ZXJzZWN0UmVjdCgmcmVjdCwgJnJlY3QsICZjbGlwcmVjdCk7Ci0JaW50IHdpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKLQlpbnQgaGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKLQotI2lmZGVmIERFQlVHX1RSQUNFCi0JewotCQljaGFyIHN0clsxMjhdOwotCQltZW1zZXQoc3RyLCAwLCBzaXplb2Yoc3RyKSk7Ci0JCUZYU1lTX3NucHJpbnRmKHN0ciwgc2l6ZW9mKHN0cikgLSAxLCAiUmVuZGVyaW5nIERJQiAlZCB4ICVkIiwgd2lkdGgsIGhlaWdodCk7Ci0JCUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoOTk5LCBzdHIpOwotCX0KLSNlbmRpZgotCi0JLy8gQ3JlYXRlIGEgRElCIHNlY3Rpb24KLQlMUFZPSUQgcEJ1ZmZlcjsKLQlCSVRNQVBJTkZPSEVBREVSIGJtaWg7Ci0JRlhTWVNfbWVtc2V0KCZibWloLCAwLCBzaXplb2YgYm1paCk7Ci0JYm1paC5iaVNpemUgPSBzaXplb2YgYm1paDsKLQlibWloLmJpQml0Q291bnQgPSAyNDsKLQlibWloLmJpSGVpZ2h0ID0gLWhlaWdodDsKLQlibWloLmJpUGxhbmVzID0gMTsKLQlibWloLmJpV2lkdGggPSB3aWR0aDsKLQlwQ29udGV4dC0+bV9oQml0bWFwID0gQ3JlYXRlRElCU2VjdGlvbihkYywgKEJJVE1BUElORk8qKSZibWloLCBESUJfUkdCX0NPTE9SUywgJnBCdWZmZXIsIE5VTEwsIDApOwotCWlmIChwQ29udGV4dC0+bV9oQml0bWFwID09IE5VTEwpIHsKLSNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKF9ERUJVRykKLQkJY2hhciBzdHJbMTI4XTsKLQkJbWVtc2V0KHN0ciwgMCwgc2l6ZW9mKHN0cikpOwotCQlGWFNZU19zbnByaW50ZihzdHIsIHNpemVvZihzdHIpIC0gMSwgIkVycm9yIENyZWF0ZURJQlNlY3Rpb246ICVkIHggJWQsIGVycm9yIGNvZGUgPSAlZCIsIHdpZHRoLCBoZWlnaHQsIEdldExhc3RFcnJvcigpKTsKLQkJQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcihGUERGRVJSX09VVF9PRl9NRU1PUlksIHN0cik7Ci0jZWxzZQotCQlDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKEZQREZFUlJfT1VUX09GX01FTU9SWSwgTlVMTCk7Ci0jZW5kaWYKLQl9Ci0JRlhTWVNfbWVtc2V0KHBCdWZmZXIsIDB4ZmYsIGhlaWdodCooKHdpZHRoKjMrMykvNCo0KSk7Ci0KLSNpZmRlZiBERUJVR19UUkFDRQotCXsKLQkJQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcig5OTksICJESUJTZWN0aW9uIGNyZWF0ZWQiKTsKLQl9Ci0jZW5kaWYKLQotCS8vIENyZWF0ZSBhIGRldmljZSB3aXRoIHRoaXMgZXh0ZXJuYWwgYnVmZmVyCi0JcENvbnRleHQtPm1fcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0JcENvbnRleHQtPm1fcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYiwgKHVpbnQ4X3QqKXBCdWZmZXIpOwotCXBDb250ZXh0LT5tX3BEZXZpY2UgPSBuZXcgQ1BERl9GeGdlRGV2aWNlOwotCSgoQ1BERl9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKHBDb250ZXh0LT5tX3BCaXRtYXApOwotCi0jaWZkZWYgREVCVUdfVFJBQ0UKLQlDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKDk5OSwgIlJlYWR5IGZvciBQREYgcmVuZGVyaW5nIik7Ci0jZW5kaWYKLQotCS8vIG91dHB1dCB0byBiaXRtYXAgZGV2aWNlCi0JRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCAtIHJlY3QubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3kgLSByZWN0LnRvcCwgc2l6ZV94LCBzaXplX3ksIHJvdGF0ZSwgZmxhZ3MpOwotCi0jaWZkZWYgREVCVUdfVFJBQ0UKLQlDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKDk5OSwgIkZpbmlzaGVkIFBERiByZW5kZXJpbmciKTsKLSNlbmRpZgotCi0JLy8gTm93IG91dHB1dCB0byByZWFsIGRldmljZQotCUhEQyBoTWVtREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwotCWlmIChoTWVtREMgPT0gTlVMTCkgewotI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoX0RFQlVHKQotCQljaGFyIHN0clsxMjhdOwotCQltZW1zZXQoc3RyLCAwLCBzaXplb2Yoc3RyKSk7Ci0JCUZYU1lTX3NucHJpbnRmKHN0ciwgc2l6ZW9mKHN0cikgLSAxLCAiRXJyb3IgQ3JlYXRlQ29tcGF0aWJsZURDLiBFcnJvciBjb2RlID0gJWQiLCBHZXRMYXN0RXJyb3IoKSk7Ci0JCUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoRlBERkVSUl9PVVRfT0ZfTUVNT1JZLCBzdHIpOwotI2Vsc2UKLQkJQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcihGUERGRVJSX09VVF9PRl9NRU1PUlksIE5VTEwpOwotI2VuZGlmCi0JfQotCi0JSEdESU9CSiBoT2xkQml0bWFwID0gU2VsZWN0T2JqZWN0KGhNZW1EQywgcENvbnRleHQtPm1faEJpdG1hcCk7Ci0KLSNpZmRlZiBERUJVR19UUkFDRQotCUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoOTk5LCAiUmVhZHkgZm9yIHNjcmVlbiByZW5kZXJpbmciKTsKLSNlbmRpZgotCi0JQml0Qmx0KGRjLCByZWN0LmxlZnQsIHJlY3QudG9wLCB3aWR0aCwgaGVpZ2h0LCBoTWVtREMsIDAsIDAsIFNSQ0NPUFkpOwotCVNlbGVjdE9iamVjdChoTWVtREMsIGhPbGRCaXRtYXApOwotCURlbGV0ZURDKGhNZW1EQyk7Ci0KLSNpZmRlZiBERUJVR19UUkFDRQotCUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoOTk5LCAiRmluaXNoZWQgc2NyZWVuIHJlbmRlcmluZyIpOwotI2VuZGlmCi0KLSNlbmRpZgotICAgIGlmIChiQmFja2dyb3VuZEFscGhhTmVlZGVkKSB7Ci0gICAgICAgIGRlbGV0ZSBwQml0bWFwOwotICAgICAgICBwQml0bWFwID0gTlVMTDsKKyAgICAgIGlmIChXaW5EQy5HZXREZXZpY2VDYXBzKEZYRENfREVWSUNFX0NMQVNTKSA9PSBGWERDX1BSSU5URVIpIHsKKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRHN0ID0gRlhfTkVXIENGWF9ESUJpdG1hcDsKKyAgICAgICAgaW50IHBpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKKyAgICAgICAgcERzdC0+Q3JlYXRlKHNpemVfeCwgc2l6ZV95LCBGWERJQl9SZ2IzMik7CisgICAgICAgIEZYU1lTX21lbXNldChwRHN0LT5HZXRCdWZmZXIoKSwgLTEsIHBpdGNoICogc2l6ZV95KTsKKyAgICAgICAgcERzdC0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHNpemVfeCwgc2l6ZV95LCBwQml0bWFwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgTlVMTCk7CisgICAgICAgIFdpbkRDLlN0cmV0Y2hESUJpdHMocERzdCwgMCwgMCwgc2l6ZV94LCBzaXplX3kpOworICAgICAgICBkZWxldGUgcERzdDsKKyAgICAgIH0gZWxzZQorICAgICAgICBXaW5EQy5TZXRESUJpdHMocEJpdG1hcCwgMCwgMCk7CiAgICAgfQotICAgIGRlbGV0ZSBwQ29udGV4dDsKLSAgICBwUGFnZS0+UmVtb3ZlUHJpdmF0ZURhdGEoKHZvaWQqKTEpOwotfQotI2VuZGlmCi0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlQml0bWFwKEZQREZfQklUTUFQIGJpdG1hcCwgRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwKLQkJCQkJCWludCBzaXplX3gsIGludCBzaXplX3ksIGludCByb3RhdGUsIGludCBmbGFncykKLXsKLQlpZiAoYml0bWFwID09IE5VTEwgfHwgcGFnZSA9PSBOVUxMKSByZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwotCWlmICghcFBhZ2UpIHJldHVybjsKLQotCUNSZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IEZYX05FVyBDUmVuZGVyQ29udGV4dDsKLQlwUGFnZS0+U2V0UHJpdmF0ZURhdGEoKHZvaWQqKTEsIHBDb250ZXh0LCBEcm9wQ29udGV4dCk7Ci0jaWZkZWYgX1NLSUFfU1VQUE9SVF8KLQlwQ29udGV4dC0+bV9wRGV2aWNlID0gRlhfTkVXIENGWF9Ta2lhRGV2aWNlOwotCi0JaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCi0JCSgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsVFJVRSk7Ci0JZWxzZQotCQkoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7CisgIH0KICNlbHNlCi0JcENvbnRleHQtPm1fcERldmljZSA9IEZYX05FVyBDRlhfRnhnZURldmljZTsKKyAgLy8gZ2V0IGNsaXAgcmVnaW9uCisgIFJFQ1QgcmVjdCwgY2xpcHJlY3Q7CisgIHJlY3QubGVmdCA9IHN0YXJ0X3g7CisgIHJlY3QudG9wID0gc3RhcnRfeTsKKyAgcmVjdC5yaWdodCA9IHN0YXJ0X3ggKyBzaXplX3g7CisgIHJlY3QuYm90dG9tID0gc3RhcnRfeSArIHNpemVfeTsKKyAgR2V0Q2xpcEJveChkYywgJmNsaXByZWN0KTsKKyAgSW50ZXJzZWN0UmVjdCgmcmVjdCwgJnJlY3QsICZjbGlwcmVjdCk7CisgIGludCB3aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7CisgIGludCBoZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOwogCi0JaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCi0JCSgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLDAsVFJVRSk7Ci0JZWxzZQotCQkoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7CisjaWZkZWYgREVCVUdfVFJBQ0UKKyAgeworICAgIGNoYXIgc3RyWzEyOF07CisgICAgbWVtc2V0KHN0ciwgMCwgc2l6ZW9mKHN0cikpOworICAgIEZYU1lTX3NucHJpbnRmKHN0ciwgc2l6ZW9mKHN0cikgLSAxLCAiUmVuZGVyaW5nIERJQiAlZCB4ICVkIiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKDk5OSwgc3RyKTsKKyAgfQogI2VuZGlmCiAKLQlGUERGX1JlbmRlclBhZ2VfUmV0YWlsKHBDb250ZXh0LCBwYWdlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSwgZmxhZ3MsIFRSVUUsIE5VTEwpOwotCi0JZGVsZXRlIHBDb250ZXh0OwotCXBQYWdlLT5SZW1vdmVQcml2YXRlRGF0YSgodm9pZCopMSk7Ci19Ci0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9DbG9zZVBhZ2UoRlBERl9QQUdFIHBhZ2UpCi17Ci0JaWYgKCFwYWdlKSByZXR1cm47Ci0KLQlDUERGWEZBX1BhZ2UqIHBQYWdlID0gKENQREZYRkFfUGFnZSopcGFnZTsKLQlwUGFnZS0+UmVsZWFzZSgpOwotfQotCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfQ2xvc2VEb2N1bWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotewotCWlmICghZG9jdW1lbnQpCi0JCXJldHVybjsKLQotCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0JZGVsZXRlIHBEb2M7Ci19Ci0KLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRMYXN0RXJyb3IoKQotewotCXJldHVybiBHZXRMYXN0RXJyb3IoKTsKLX0KLQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0RldmljZVRvUGFnZShGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LAotCQkJCQkJaW50IHJvdGF0ZSwgaW50IGRldmljZV94LCBpbnQgZGV2aWNlX3ksIGRvdWJsZSogcGFnZV94LCBkb3VibGUqIHBhZ2VfeSkKLXsKLQlpZiAocGFnZSA9PSBOVUxMIHx8IHBhZ2VfeCA9PSBOVUxMIHx8IHBhZ2VfeSA9PSBOVUxMKSByZXR1cm47Ci0JQ1BERlhGQV9QYWdlKiBwUGFnZSA9IChDUERGWEZBX1BhZ2UqKXBhZ2U7Ci0KLQlwUGFnZS0+RGV2aWNlVG9QYWdlKHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUsIGRldmljZV94LCBkZXZpY2VfeSwgcGFnZV94LCBwYWdlX3kpOwotfQotCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUGFnZVRvRGV2aWNlKEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCi0JCQkJCQlpbnQgcm90YXRlLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95LCBpbnQqIGRldmljZV94LCBpbnQqIGRldmljZV95KQotewotCWlmIChwYWdlID09IE5VTEwgfHwgZGV2aWNlX3ggPT0gTlVMTCB8fCBkZXZpY2VfeSA9PSBOVUxMKSByZXR1cm47Ci0JQ1BERlhGQV9QYWdlKiBwUGFnZSA9IChDUERGWEZBX1BhZ2UqKXBhZ2U7Ci0JcFBhZ2UtPlBhZ2VUb0RldmljZShzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlLCBwYWdlX3gsIHBhZ2VfeSwgZGV2aWNlX3gsIGRldmljZV95KTsKLX0KLQotRExMRVhQT1JUIEZQREZfQklUTUFQIFNURENBTEwgRlBERkJpdG1hcF9DcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYWxwaGEpCi17Ci0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcChuZXcgQ0ZYX0RJQml0bWFwKTsKLSAgICBpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBhbHBoYSA/IEZYRElCX0FyZ2IgOiBGWERJQl9SZ2IzMikpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwQml0bWFwLnJlbGVhc2UoKTsKLX0KLQotRExMRVhQT1JUIEZQREZfQklUTUFQIFNURENBTEwgRlBERkJpdG1hcF9DcmVhdGVFeChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIHZvaWQqIGZpcnN0X3NjYW4sIGludCBzdHJpZGUpCi17Ci0JRlhESUJfRm9ybWF0IGZ4X2Zvcm1hdDsKLQlzd2l0Y2ggKGZvcm1hdCkgewotCQljYXNlIEZQREZCaXRtYXBfR3JheToKLQkJCWZ4X2Zvcm1hdCA9IEZYRElCXzhicHBSZ2I7Ci0JCQlicmVhazsKLQkJY2FzZSBGUERGQml0bWFwX0JHUjoKLQkJCWZ4X2Zvcm1hdCA9IEZYRElCX1JnYjsKLQkJCWJyZWFrOwotCQljYXNlIEZQREZCaXRtYXBfQkdSeDoKLQkJCWZ4X2Zvcm1hdCA9IEZYRElCX1JnYjMyOwotCQkJYnJlYWs7Ci0JCWNhc2UgRlBERkJpdG1hcF9CR1JBOgotCQkJZnhfZm9ybWF0ID0gRlhESUJfQXJnYjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCUNGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0JcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZ4X2Zvcm1hdCwgKHVpbnQ4X3QqKWZpcnN0X3NjYW4sIHN0cmlkZSk7Ci0JcmV0dXJuIHBCaXRtYXA7Ci19Ci0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkJpdG1hcF9GaWxsUmVjdChGUERGX0JJVE1BUCBiaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZQREZfRFdPUkQgY29sb3IpCi17Ci0JaWYgKGJpdG1hcCA9PSBOVUxMKSByZXR1cm47Ci0jaWZkZWYgX1NLSUFfU1VQUE9SVF8KLQlDRlhfU2tpYURldmljZSBkZXZpY2U7CisgIC8vIENyZWF0ZSBhIERJQiBzZWN0aW9uCisgIExQVk9JRCBwQnVmZmVyOworICBCSVRNQVBJTkZPSEVBREVSIGJtaWg7CisgIEZYU1lTX21lbXNldCgmYm1paCwgMCwgc2l6ZW9mIGJtaWgpOworICBibWloLmJpU2l6ZSA9IHNpemVvZiBibWloOworICBibWloLmJpQml0Q291bnQgPSAyNDsKKyAgYm1paC5iaUhlaWdodCA9IC1oZWlnaHQ7CisgIGJtaWguYmlQbGFuZXMgPSAxOworICBibWloLmJpV2lkdGggPSB3aWR0aDsKKyAgcENvbnRleHQtPm1faEJpdG1hcCA9IENyZWF0ZURJQlNlY3Rpb24oZGMsIChCSVRNQVBJTkZPKikmYm1paCwgRElCX1JHQl9DT0xPUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLCBOVUxMLCAwKTsKKyAgaWYgKHBDb250ZXh0LT5tX2hCaXRtYXAgPT0gTlVMTCkgeworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoX0RFQlVHKQorICAgIGNoYXIgc3RyWzEyOF07CisgICAgbWVtc2V0KHN0ciwgMCwgc2l6ZW9mKHN0cikpOworICAgIEZYU1lTX3NucHJpbnRmKHN0ciwgc2l6ZW9mKHN0cikgLSAxLAorICAgICAgICAgICAgICAgICAgICJFcnJvciBDcmVhdGVESUJTZWN0aW9uOiAlZCB4ICVkLCBlcnJvciBjb2RlID0gJWQiLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICBoZWlnaHQsIEdldExhc3RFcnJvcigpKTsKKyAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKEZQREZFUlJfT1VUX09GX01FTU9SWSwgc3RyKTsKICNlbHNlCi0JQ0ZYX0Z4Z2VEZXZpY2UgZGV2aWNlOworICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoRlBERkVSUl9PVVRfT0ZfTUVNT1JZLCBOVUxMKTsKICNlbmRpZgotCWRldmljZS5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKLQlpZiAoISgoQ0ZYX0RJQml0bWFwKiliaXRtYXApLT5IYXNBbHBoYSgpKSBjb2xvciB8PSAweEZGMDAwMDAwOwotCUZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQrd2lkdGgsIHRvcCtoZWlnaHQpOwotCWRldmljZS5GaWxsUmVjdCgmcmVjdCwgY29sb3IpOworICB9CisgIEZYU1lTX21lbXNldChwQnVmZmVyLCAweGZmLCBoZWlnaHQgKiAoKHdpZHRoICogMyArIDMpIC8gNCAqIDQpKTsKKworI2lmZGVmIERFQlVHX1RSQUNFCisgIHsgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcig5OTksICJESUJTZWN0aW9uIGNyZWF0ZWQiKTsgfQorI2VuZGlmCisKKyAgLy8gQ3JlYXRlIGEgZGV2aWNlIHdpdGggdGhpcyBleHRlcm5hbCBidWZmZXIKKyAgcENvbnRleHQtPm1fcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIHBDb250ZXh0LT5tX3BCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IsICh1aW50OF90KilwQnVmZmVyKTsKKyAgcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDUERGX0Z4Z2VEZXZpY2U7CisgICgoQ1BERl9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKHBDb250ZXh0LT5tX3BCaXRtYXApOworCisjaWZkZWYgREVCVUdfVFJBQ0UKKyAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcig5OTksICJSZWFkeSBmb3IgUERGIHJlbmRlcmluZyIpOworI2VuZGlmCisKKyAgLy8gb3V0cHV0IHRvIGJpdG1hcCBkZXZpY2UKKyAgRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCAtIHJlY3QubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF95IC0gcmVjdC50b3AsIHNpemVfeCwgc2l6ZV95LCByb3RhdGUsIGZsYWdzKTsKKworI2lmZGVmIERFQlVHX1RSQUNFCisgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoOTk5LCAiRmluaXNoZWQgUERGIHJlbmRlcmluZyIpOworI2VuZGlmCisKKyAgLy8gTm93IG91dHB1dCB0byByZWFsIGRldmljZQorICBIREMgaE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKKyAgaWYgKGhNZW1EQyA9PSBOVUxMKSB7CisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChfREVCVUcpCisgICAgY2hhciBzdHJbMTI4XTsKKyAgICBtZW1zZXQoc3RyLCAwLCBzaXplb2Yoc3RyKSk7CisgICAgRlhTWVNfc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSAtIDEsCisgICAgICAgICAgICAgICAgICAgIkVycm9yIENyZWF0ZUNvbXBhdGlibGVEQy4gRXJyb3IgY29kZSA9ICVkIiwgR2V0TGFzdEVycm9yKCkpOworICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoRlBERkVSUl9PVVRfT0ZfTUVNT1JZLCBzdHIpOworI2Vsc2UKKyAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKEZQREZFUlJfT1VUX09GX01FTU9SWSwgTlVMTCk7CisjZW5kaWYKKyAgfQorCisgIEhHRElPQkogaE9sZEJpdG1hcCA9IFNlbGVjdE9iamVjdChoTWVtREMsIHBDb250ZXh0LT5tX2hCaXRtYXApOworCisjaWZkZWYgREVCVUdfVFJBQ0UKKyAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcig5OTksICJSZWFkeSBmb3Igc2NyZWVuIHJlbmRlcmluZyIpOworI2VuZGlmCisKKyAgQml0Qmx0KGRjLCByZWN0LmxlZnQsIHJlY3QudG9wLCB3aWR0aCwgaGVpZ2h0LCBoTWVtREMsIDAsIDAsIFNSQ0NPUFkpOworICBTZWxlY3RPYmplY3QoaE1lbURDLCBoT2xkQml0bWFwKTsKKyAgRGVsZXRlREMoaE1lbURDKTsKKworI2lmZGVmIERFQlVHX1RSQUNFCisgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoOTk5LCAiRmluaXNoZWQgc2NyZWVuIHJlbmRlcmluZyIpOworI2VuZGlmCisKKyNlbmRpZgorICBpZiAoYkJhY2tncm91bmRBbHBoYU5lZWRlZCkgeworICAgIGRlbGV0ZSBwQml0bWFwOworICAgIHBCaXRtYXAgPSBOVUxMOworICB9CisgIGRlbGV0ZSBwQ29udGV4dDsKKyAgcFBhZ2UtPlJlbW92ZVByaXZhdGVEYXRhKCh2b2lkKikxKTsKK30KKyNlbmRpZgorCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcChGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKKyAgaWYgKGJpdG1hcCA9PSBOVUxMIHx8IHBhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIENQREZfUGFnZSogcFBhZ2UgPSAoKENQREZYRkFfUGFnZSopcGFnZSktPkdldFBERlBhZ2UoKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm47CisKKyAgQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gRlhfTkVXIENSZW5kZXJDb250ZXh0OworICBwUGFnZS0+U2V0UHJpdmF0ZURhdGEoKHZvaWQqKTEsIHBDb250ZXh0LCBEcm9wQ29udGV4dCk7CisjaWZkZWYgX1NLSUFfU1VQUE9SVF8KKyAgcENvbnRleHQtPm1fcERldmljZSA9IEZYX05FVyBDRlhfU2tpYURldmljZTsKKworICBpZiAoZmxhZ3MgJiBGUERGX1JFVkVSU0VfQllURV9PUkRFUikKKyAgICAoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKQorICAgICAgICAtPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXAsIDAsIFRSVUUpOworICBlbHNlCisgICAgKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXApOworI2Vsc2UKKyAgcENvbnRleHQtPm1fcERldmljZSA9IEZYX05FVyBDRlhfRnhnZURldmljZTsKKworICBpZiAoZmxhZ3MgJiBGUERGX1JFVkVSU0VfQllURV9PUkRFUikKKyAgICAoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKQorICAgICAgICAtPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXAsIDAsIFRSVUUpOworICBlbHNlCisgICAgKChDRlhfRnhnZURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXApOworI2VuZGlmCisKKyAgRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncywgVFJVRSwgTlVMTCk7CisKKyAgZGVsZXRlIHBDb250ZXh0OworICBwUGFnZS0+UmVtb3ZlUHJpdmF0ZURhdGEoKHZvaWQqKTEpOwogfQogCi1ETExFWFBPUlQgdm9pZCogU1REQ0FMTCBGUERGQml0bWFwX0dldEJ1ZmZlcihGUERGX0JJVE1BUCBiaXRtYXApCi17Ci0JaWYgKGJpdG1hcCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlyZXR1cm4gKChDRlhfRElCaXRtYXAqKWJpdG1hcCktPkdldEJ1ZmZlcigpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0Nsb3NlUGFnZShGUERGX1BBR0UgcGFnZSkgeworICBpZiAoIXBhZ2UpCisgICAgcmV0dXJuOworCisgIENQREZYRkFfUGFnZSogcFBhZ2UgPSAoQ1BERlhGQV9QYWdlKilwYWdlOworICBwUGFnZS0+UmVsZWFzZSgpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkJpdG1hcF9HZXRXaWR0aChGUERGX0JJVE1BUCBiaXRtYXApCi17Ci0JaWYgKGJpdG1hcCA9PSBOVUxMKSByZXR1cm4gMDsKLQlyZXR1cm4gKChDRlhfRElCaXRtYXAqKWJpdG1hcCktPkdldFdpZHRoKCk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfQ2xvc2VEb2N1bWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CisgIGlmICghZG9jdW1lbnQpCisgICAgcmV0dXJuOworCisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CisgIGRlbGV0ZSBwRG9jOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkJpdG1hcF9HZXRIZWlnaHQoRlBERl9CSVRNQVAgYml0bWFwKQotewotCWlmIChiaXRtYXAgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JcmV0dXJuICgoQ0ZYX0RJQml0bWFwKiliaXRtYXApLT5HZXRIZWlnaHQoKTsKK0RMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRMYXN0RXJyb3IoKSB7CisgIHJldHVybiBHZXRMYXN0RXJyb3IoKTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZCaXRtYXBfR2V0U3RyaWRlKEZQREZfQklUTUFQIGJpdG1hcCkKLXsKLQlpZiAoYml0bWFwID09IE5VTEwpIHJldHVybiAwOwotCXJldHVybiAoKENGWF9ESUJpdG1hcCopYml0bWFwKS0+R2V0UGl0Y2goKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9EZXZpY2VUb1BhZ2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhZ2VfeSkgeworICBpZiAocGFnZSA9PSBOVUxMIHx8IHBhZ2VfeCA9PSBOVUxMIHx8IHBhZ2VfeSA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IChDUERGWEZBX1BhZ2UqKXBhZ2U7CisKKyAgcFBhZ2UtPkRldmljZVRvUGFnZShzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlLCBkZXZpY2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfeSwgcGFnZV94LCBwYWdlX3kpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZCaXRtYXBfRGVzdHJveShGUERGX0JJVE1BUCBiaXRtYXApCi17Ci0gICAgZGVsZXRlIChDRlhfRElCaXRtYXAqKWJpdG1hcDsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9QYWdlVG9EZXZpY2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeSkgeworICBpZiAocGFnZSA9PSBOVUxMIHx8IGRldmljZV94ID09IE5VTEwgfHwgZGV2aWNlX3kgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIENQREZYRkFfUGFnZSogcFBhZ2UgPSAoQ1BERlhGQV9QYWdlKilwYWdlOworICBwUGFnZS0+UGFnZVRvRGV2aWNlKHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUsIHBhZ2VfeCwgcGFnZV95LAorICAgICAgICAgICAgICAgICAgICAgIGRldmljZV94LCBkZXZpY2VfeSk7CiB9CiAKLXZvaWQgRlBERl9SZW5kZXJQYWdlX1JldGFpbChDUmVuZGVyQ29udGV4dCogcENvbnRleHQsIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwgaW50IGZsYWdzLEZYX0JPT0wgYk5lZWRUb1Jlc3RvcmUsIElGU0RLX1BBVVNFX0FkYXB0ZXIgKiBwYXVzZSApCi17Ci0JQ1BERl9QYWdlKiBwUGFnZSA9ICgoQ1BERlhGQV9QYWdlKilwYWdlKS0+R2V0UERGUGFnZSgpOwotCWlmIChwUGFnZSA9PSBOVUxMKSByZXR1cm47Ci0KLQlpZiAoIXBDb250ZXh0LT5tX3BPcHRpb25zKQotCQlwQ29udGV4dC0+bV9wT3B0aW9ucyA9IG5ldyBDUERGX1JlbmRlck9wdGlvbnM7Ci0KLQlpZiAoZmxhZ3MgJiBGUERGX0xDRF9URVhUKQotCQlwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9GbGFncyB8PSBSRU5ERVJfQ0xFQVJUWVBFOwotCWVsc2UKLQkJcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgJj0gflJFTkRFUl9DTEVBUlRZUEU7Ci0JaWYgKGZsYWdzICYgRlBERl9OT19OQVRJVkVURVhUKQotCQlwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9GbGFncyB8PSBSRU5ERVJfTk9fTkFUSVZFVEVYVDsKLQlpZiAoZmxhZ3MgJiBGUERGX1JFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSkKLQkJcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFOwotCWlmIChmbGFncyAmIEZQREZfUkVOREVSX0ZPUkNFSEFMRlRPTkUpCi0JCXBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0ZsYWdzIHw9IFJFTkRFUl9GT1JDRV9IQUxGVE9ORTsKLQkvL0dyYXlzY2FsZSBvdXRwdXQKLQlpZiAoZmxhZ3MgJiBGUERGX0dSQVlTQ0FMRSkKLQl7Ci0JCXBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0NvbG9yTW9kZSA9IFJFTkRFUl9DT0xPUl9HUkFZOwotCQlwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9Gb3JlQ29sb3IgPSAwOwotCQlwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9CYWNrQ29sb3IgPSAweGZmZmZmZjsKLQl9Ci0JY29uc3QgQ1BERl9PQ0NvbnRleHQ6OlVzYWdlVHlwZSB1c2FnZSA9IChmbGFncyAmIEZQREZfUFJJTlRJTkcpID8gQ1BERl9PQ0NvbnRleHQ6OlByaW50IDogQ1BERl9PQ0NvbnRleHQ6OlZpZXc7Ci0JcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fQWRkRmxhZ3MgPSBmbGFncyA+PiA4OwotCXBDb250ZXh0LT5tX3BPcHRpb25zLT5tX3BPQ0NvbnRleHQgPSBuZXcgQ1BERl9PQ0NvbnRleHQocFBhZ2UtPm1fcERvY3VtZW50LCB1c2FnZSk7Ci0KLQlDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLQlwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChtYXRyaXgsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUpOwotCi0JRlhfUkVDVCBjbGlwOwotCWNsaXAubGVmdCA9IHN0YXJ0X3g7Ci0JY2xpcC5yaWdodCA9IHN0YXJ0X3ggKyBzaXplX3g7Ci0JY2xpcC50b3AgPSBzdGFydF95OwotCWNsaXAuYm90dG9tID0gc3RhcnRfeSArIHNpemVfeTsKLQlwQ29udGV4dC0+bV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKLQlwQ29udGV4dC0+bV9wRGV2aWNlLT5TZXRDbGlwX1JlY3QoJmNsaXApOwotCi0JcENvbnRleHQtPm1fcENvbnRleHQgPSBGWF9ORVcgQ1BERl9SZW5kZXJDb250ZXh0OwotCXBDb250ZXh0LT5tX3BDb250ZXh0LT5DcmVhdGUocFBhZ2UpOwotCXBDb250ZXh0LT5tX3BDb250ZXh0LT5BcHBlbmRPYmplY3RMaXN0KHBQYWdlLCAmbWF0cml4KTsKLQotCWlmIChmbGFncyAmIEZQREZfQU5OT1QpIHsKLQkJcENvbnRleHQtPm1fcEFubm90cyA9IEZYX05FVyBDUERGX0Fubm90TGlzdChwUGFnZSk7Ci0JCUZYX0JPT0wgYlByaW50aW5nID0gcENvbnRleHQtPm1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSAhPSBGWERDX0RJU1BMQVk7Ci0JCXBDb250ZXh0LT5tX3BBbm5vdHMtPkRpc3BsYXlBbm5vdHMocFBhZ2UsIHBDb250ZXh0LT5tX3BDb250ZXh0LCBiUHJpbnRpbmcsICZtYXRyaXgsIFRSVUUsIE5VTEwpOwotCX0KLQotCXBDb250ZXh0LT5tX3BSZW5kZXJlciA9IEZYX05FVyBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI7Ci0JcENvbnRleHQtPm1fcFJlbmRlcmVyLT5TdGFydChwQ29udGV4dC0+bV9wQ29udGV4dCwgcENvbnRleHQtPm1fcERldmljZSwgcENvbnRleHQtPm1fcE9wdGlvbnMsIHBhdXNlKTsKLQlpZiAoYk5lZWRUb1Jlc3RvcmUpCi0JewotCQlwQ29udGV4dC0+bV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLQl9Ci0KLS8vI2VuZGlmCitETExFWFBPUlQgRlBERl9CSVRNQVAgU1REQ0FMTCBGUERGQml0bWFwX0NyZWF0ZShpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhKSB7CisgIG5vbnN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXAobmV3IENGWF9ESUJpdG1hcCk7CisgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGFscGhhID8gRlhESUJfQXJnYiA6IEZYRElCX1JnYjMyKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBwQml0bWFwLnJlbGVhc2UoKTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfR2V0UGFnZVNpemVCeUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBwYWdlX2luZGV4LCBkb3VibGUqIHdpZHRoLCBkb3VibGUqIGhlaWdodCkKLXsKLS8vIAlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwotLy8gCWlmKHBEb2MgPT0gTlVMTCkKLS8vIAkJcmV0dXJuIEZBTFNFOwotLy8KLS8vIAlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcERvYy0+R2V0UGFnZShwYWdlX2luZGV4KTsKLS8vIAlpZiAocERpY3QgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotLy8KLS8vIAlDUERGX1BhZ2UgcGFnZTsKLS8vIAlwYWdlLkxvYWQocERvYywgcERpY3QpOwotLy8gCSp3aWR0aCA9IHBhZ2UuR2V0UGFnZVdpZHRoKCk7Ci0vLyAJKmhlaWdodCA9IHBhZ2UuR2V0UGFnZUhlaWdodCgpOwotCi0JQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKLQlpZiAocERvYyA9PSBOVUxMKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlpbnQgY291bnQgPSBwRG9jLT5HZXRQYWdlQ291bnQoKTsKLQlpZiAocGFnZV9pbmRleCA8IDAgfHwgcGFnZV9pbmRleCA+PSBjb3VudCkKLQkJcmV0dXJuIEZBTFNFOwotCi0JQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBEb2MtPkdldFBhZ2UocGFnZV9pbmRleCk7Ci0JaWYgKCFwUGFnZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JKndpZHRoID0gcFBhZ2UtPkdldFBhZ2VXaWR0aCgpOwotCSpoZWlnaHQgPSBwUGFnZS0+R2V0UGFnZUhlaWdodCgpOwotCi0JcmV0dXJuIFRSVUU7CitETExFWFBPUlQgRlBERl9CSVRNQVAgU1REQ0FMTCBGUERGQml0bWFwX0NyZWF0ZUV4KGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZmlyc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgeworICBGWERJQl9Gb3JtYXQgZnhfZm9ybWF0OworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgRlBERkJpdG1hcF9HcmF5OgorICAgICAgZnhfZm9ybWF0ID0gRlhESUJfOGJwcFJnYjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBERkJpdG1hcF9CR1I6CisgICAgICBmeF9mb3JtYXQgPSBGWERJQl9SZ2I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQREZCaXRtYXBfQkdSeDoKKyAgICAgIGZ4X2Zvcm1hdCA9IEZYRElCX1JnYjMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUERGQml0bWFwX0JHUkE6CisgICAgICBmeF9mb3JtYXQgPSBGWERJQl9BcmdiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIHBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmeF9mb3JtYXQsICh1aW50OF90KilmaXJzdF9zY2FuLCBzdHJpZGUpOworICByZXR1cm4gcEJpdG1hcDsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldFByaW50U2NhbGluZyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotewotCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0JaWYgKCFwRG9jKSByZXR1cm4gVFJVRTsKLQlDUERGX0RvY3VtZW50KiBwUERGRG9jID0gcERvYy0+R2V0UERGRG9jKCk7Ci0JaWYgKCFwUERGRG9jKSByZXR1cm4gVFJVRTsKLQlDUERGX1ZpZXdlclByZWZlcmVuY2VzIHZpZXdSZWYocFBERkRvYyk7Ci0JcmV0dXJuIHZpZXdSZWYuUHJpbnRTY2FsaW5nKCk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZCaXRtYXBfRmlsbFJlY3QoRlBERl9CSVRNQVAgYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBjb2xvcikgeworICBpZiAoYml0bWFwID09IE5VTEwpCisgICAgcmV0dXJuOworI2lmZGVmIF9TS0lBX1NVUFBPUlRfCisgIENGWF9Ta2lhRGV2aWNlIGRldmljZTsKKyNlbHNlCisgIENGWF9GeGdlRGV2aWNlIGRldmljZTsKKyNlbmRpZgorICBkZXZpY2UuQXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7CisgIGlmICghKChDRlhfRElCaXRtYXAqKWJpdG1hcCktPkhhc0FscGhhKCkpCisgICAgY29sb3IgfD0gMHhGRjAwMDAwMDsKKyAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoLCB0b3AgKyBoZWlnaHQpOworICBkZXZpY2UuRmlsbFJlY3QoJnJlY3QsIGNvbG9yKTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldE51bUNvcGllcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotewotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7Ci0gICAgaWYgKCFwRG9jKSByZXR1cm4gMTsKLSAgICBDUERGX1ZpZXdlclByZWZlcmVuY2VzIHZpZXdSZWYocERvYyk7Ci0gICAgcmV0dXJuIHZpZXdSZWYuTnVtQ29waWVzKCk7CitETExFWFBPUlQgdm9pZCogU1REQ0FMTCBGUERGQml0bWFwX0dldEJ1ZmZlcihGUERGX0JJVE1BUCBiaXRtYXApIHsKKyAgaWYgKGJpdG1hcCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gKChDRlhfRElCaXRtYXAqKWJpdG1hcCktPkdldEJ1ZmZlcigpOwogfQogCi1ETExFWFBPUlQgRlBERl9QQUdFUkFOR0UgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXRQcmludFBhZ2VSYW5nZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotewotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7Ci0gICAgaWYgKCFwRG9jKSByZXR1cm4gTlVMTDsKLSAgICBDUERGX1ZpZXdlclByZWZlcmVuY2VzIHZpZXdSZWYocERvYyk7Ci0gICAgcmV0dXJuIHZpZXdSZWYuUHJpbnRQYWdlUmFuZ2UoKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQml0bWFwX0dldFdpZHRoKEZQREZfQklUTUFQIGJpdG1hcCkgeworICBpZiAoYml0bWFwID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAoKENGWF9ESUJpdG1hcCopYml0bWFwKS0+R2V0V2lkdGgoKTsKIH0KIAotRExMRVhQT1JUIEZQREZfRFVQTEVYVFlQRSBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldER1cGxleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotewotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7Ci0gICAgaWYgKCFwRG9jKSByZXR1cm4gRHVwbGV4VW5kZWZpbmVkOwotICAgIENQREZfVmlld2VyUHJlZmVyZW5jZXMgdmlld1JlZihwRG9jKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBkdXBsZXggPSB2aWV3UmVmLkR1cGxleCgpOwotICAgIGlmIChGWF9CU1RSQygiU2ltcGxleCIpID09IGR1cGxleCkKLSAgICAgICAgcmV0dXJuIFNpbXBsZXg7Ci0gICAgaWYgKEZYX0JTVFJDKCJEdXBsZXhGbGlwU2hvcnRFZGdlIikgPT0gZHVwbGV4KQotICAgICAgICByZXR1cm4gRHVwbGV4RmxpcFNob3J0RWRnZTsKLSAgICBpZiAoRlhfQlNUUkMoIkR1cGxleEZsaXBMb25nRWRnZSIpID09IGR1cGxleCkKLSAgICAgICAgcmV0dXJuIER1cGxleEZsaXBMb25nRWRnZTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQml0bWFwX0dldEhlaWdodChGUERGX0JJVE1BUCBiaXRtYXApIHsKKyAgaWYgKGJpdG1hcCA9PSBOVUxMKQorICAgIHJldHVybiAwOworICByZXR1cm4gKChDRlhfRElCaXRtYXAqKWJpdG1hcCktPkdldEhlaWdodCgpOworfQorCitETExFWFBPUlQgaW50IFNURENBTEwgRlBERkJpdG1hcF9HZXRTdHJpZGUoRlBERl9CSVRNQVAgYml0bWFwKSB7CisgIGlmIChiaXRtYXAgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuICgoQ0ZYX0RJQml0bWFwKiliaXRtYXApLT5HZXRQaXRjaCgpOworfQorCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZCaXRtYXBfRGVzdHJveShGUERGX0JJVE1BUCBiaXRtYXApIHsKKyAgZGVsZXRlIChDRlhfRElCaXRtYXAqKWJpdG1hcDsKK30KKwordm9pZCBGUERGX1JlbmRlclBhZ2VfUmV0YWlsKENSZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTmVlZFRvUmVzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRV9BZGFwdGVyKiBwYXVzZSkgeworICBDUERGX1BhZ2UqIHBQYWdlID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRQREZQYWdlKCk7CisgIGlmIChwUGFnZSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAoIXBDb250ZXh0LT5tX3BPcHRpb25zKQorICAgIHBDb250ZXh0LT5tX3BPcHRpb25zID0gbmV3IENQREZfUmVuZGVyT3B0aW9uczsKKworICBpZiAoZmxhZ3MgJiBGUERGX0xDRF9URVhUKQorICAgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0ZsYWdzIHw9IFJFTkRFUl9DTEVBUlRZUEU7CisgIGVsc2UKKyAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9GbGFncyAmPSB+UkVOREVSX0NMRUFSVFlQRTsKKyAgaWYgKGZsYWdzICYgRlBERl9OT19OQVRJVkVURVhUKQorICAgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0ZsYWdzIHw9IFJFTkRFUl9OT19OQVRJVkVURVhUOworICBpZiAoZmxhZ3MgJiBGUERGX1JFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSkKKyAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9GbGFncyB8PSBSRU5ERVJfTElNSVRFRElNQUdFQ0FDSEU7CisgIGlmIChmbGFncyAmIEZQREZfUkVOREVSX0ZPUkNFSEFMRlRPTkUpCisgICAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX0ZPUkNFX0hBTEZUT05FOworICAvLyBHcmF5c2NhbGUgb3V0cHV0CisgIGlmIChmbGFncyAmIEZQREZfR1JBWVNDQUxFKSB7CisgICAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX0dSQVk7CisgICAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRm9yZUNvbG9yID0gMDsKKyAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9CYWNrQ29sb3IgPSAweGZmZmZmZjsKKyAgfQorICBjb25zdCBDUERGX09DQ29udGV4dDo6VXNhZ2VUeXBlIHVzYWdlID0KKyAgICAgIChmbGFncyAmIEZQREZfUFJJTlRJTkcpID8gQ1BERl9PQ0NvbnRleHQ6OlByaW50IDogQ1BERl9PQ0NvbnRleHQ6OlZpZXc7CisgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0FkZEZsYWdzID0gZmxhZ3MgPj4gODsKKyAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fcE9DQ29udGV4dCA9CisgICAgICBuZXcgQ1BERl9PQ0NvbnRleHQocFBhZ2UtPm1fcERvY3VtZW50LCB1c2FnZSk7CisKKyAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7CisgIHBQYWdlLT5HZXREaXNwbGF5TWF0cml4KG1hdHJpeCwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksIHJvdGF0ZSk7CisKKyAgRlhfUkVDVCBjbGlwOworICBjbGlwLmxlZnQgPSBzdGFydF94OworICBjbGlwLnJpZ2h0ID0gc3RhcnRfeCArIHNpemVfeDsKKyAgY2xpcC50b3AgPSBzdGFydF95OworICBjbGlwLmJvdHRvbSA9IHN0YXJ0X3kgKyBzaXplX3k7CisgIHBDb250ZXh0LT5tX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOworICBwQ29udGV4dC0+bV9wRGV2aWNlLT5TZXRDbGlwX1JlY3QoJmNsaXApOworCisgIHBDb250ZXh0LT5tX3BDb250ZXh0ID0gRlhfTkVXIENQREZfUmVuZGVyQ29udGV4dDsKKyAgcENvbnRleHQtPm1fcENvbnRleHQtPkNyZWF0ZShwUGFnZSk7CisgIHBDb250ZXh0LT5tX3BDb250ZXh0LT5BcHBlbmRPYmplY3RMaXN0KHBQYWdlLCAmbWF0cml4KTsKKworICBpZiAoZmxhZ3MgJiBGUERGX0FOTk9UKSB7CisgICAgcENvbnRleHQtPm1fcEFubm90cyA9IEZYX05FVyBDUERGX0Fubm90TGlzdChwUGFnZSk7CisgICAgRlhfQk9PTCBiUHJpbnRpbmcgPSBwQ29udGV4dC0+bV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpICE9IEZYRENfRElTUExBWTsKKyAgICBwQ29udGV4dC0+bV9wQW5ub3RzLT5EaXNwbGF5QW5ub3RzKHBQYWdlLCBwQ29udGV4dC0+bV9wQ29udGV4dCwgYlByaW50aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hdHJpeCwgVFJVRSwgTlVMTCk7CisgIH0KKworICBwQ29udGV4dC0+bV9wUmVuZGVyZXIgPSBGWF9ORVcgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOworICBwQ29udGV4dC0+bV9wUmVuZGVyZXItPlN0YXJ0KHBDb250ZXh0LT5tX3BDb250ZXh0LCBwQ29udGV4dC0+bV9wRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tX3BPcHRpb25zLCBwYXVzZSk7CisgIGlmIChiTmVlZFRvUmVzdG9yZSkgeworICAgIHBDb250ZXh0LT5tX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOworICB9CisKKyAgLy8jZW5kaWYKK30KKworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfR2V0UGFnZVNpemVCeUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGhlaWdodCkgeworICAvLyAJQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKKyAgLy8gCWlmKHBEb2MgPT0gTlVMTCkKKyAgLy8gCQlyZXR1cm4gRkFMU0U7CisgIC8vCisgIC8vIAlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcERvYy0+R2V0UGFnZShwYWdlX2luZGV4KTsKKyAgLy8gCWlmIChwRGljdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisgIC8vCisgIC8vIAlDUERGX1BhZ2UgcGFnZTsKKyAgLy8gCXBhZ2UuTG9hZChwRG9jLCBwRGljdCk7CisgIC8vIAkqd2lkdGggPSBwYWdlLkdldFBhZ2VXaWR0aCgpOworICAvLyAJKmhlaWdodCA9IHBhZ2UuR2V0UGFnZUhlaWdodCgpOworCisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CisgIGlmIChwRG9jID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGludCBjb3VudCA9IHBEb2MtPkdldFBhZ2VDb3VudCgpOworICBpZiAocGFnZV9pbmRleCA8IDAgfHwgcGFnZV9pbmRleCA+PSBjb3VudCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBEb2MtPkdldFBhZ2UocGFnZV9pbmRleCk7CisgIGlmICghcFBhZ2UpCisgICAgcmV0dXJuIEZBTFNFOworCisgICp3aWR0aCA9IHBQYWdlLT5HZXRQYWdlV2lkdGgoKTsKKyAgKmhlaWdodCA9IHBQYWdlLT5HZXRQYWdlSGVpZ2h0KCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERl9WSUVXRVJSRUZfR2V0UHJpbnRTY2FsaW5nKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBUUlVFOworICBDUERGX0RvY3VtZW50KiBwUERGRG9jID0gcERvYy0+R2V0UERGRG9jKCk7CisgIGlmICghcFBERkRvYykKKyAgICByZXR1cm4gVFJVRTsKKyAgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKHBQREZEb2MpOworICByZXR1cm4gdmlld1JlZi5QcmludFNjYWxpbmcoKTsKK30KKworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldE51bUNvcGllcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gMTsKKyAgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKHBEb2MpOworICByZXR1cm4gdmlld1JlZi5OdW1Db3BpZXMoKTsKK30KKworRExMRVhQT1JUIEZQREZfUEFHRVJBTkdFIFNURENBTEwKK0ZQREZfVklFV0VSUkVGX0dldFByaW50UGFnZVJhbmdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBOVUxMOworICBDUERGX1ZpZXdlclByZWZlcmVuY2VzIHZpZXdSZWYocERvYyk7CisgIHJldHVybiB2aWV3UmVmLlByaW50UGFnZVJhbmdlKCk7Cit9CisKK0RMTEVYUE9SVCBGUERGX0RVUExFWFRZUEUgU1REQ0FMTAorRlBERl9WSUVXRVJSRUZfR2V0RHVwbGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9ICgoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQpLT5HZXRQREZEb2MoKTsKKyAgaWYgKCFwRG9jKQogICAgIHJldHVybiBEdXBsZXhVbmRlZmluZWQ7CisgIENQREZfVmlld2VyUHJlZmVyZW5jZXMgdmlld1JlZihwRG9jKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgZHVwbGV4ID0gdmlld1JlZi5EdXBsZXgoKTsKKyAgaWYgKEZYX0JTVFJDKCJTaW1wbGV4IikgPT0gZHVwbGV4KQorICAgIHJldHVybiBTaW1wbGV4OworICBpZiAoRlhfQlNUUkMoIkR1cGxleEZsaXBTaG9ydEVkZ2UiKSA9PSBkdXBsZXgpCisgICAgcmV0dXJuIER1cGxleEZsaXBTaG9ydEVkZ2U7CisgIGlmIChGWF9CU1RSQygiRHVwbGV4RmxpcExvbmdFZGdlIikgPT0gZHVwbGV4KQorICAgIHJldHVybiBEdXBsZXhGbGlwTG9uZ0VkZ2U7CisgIHJldHVybiBEdXBsZXhVbmRlZmluZWQ7CiB9CiAKLURMTEVYUE9SVCBGUERGX0RXT1JEIFNURENBTEwgRlBERl9Db3VudE5hbWVkRGVzdHMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkKLXsKLSAgICBpZiAoIWRvY3VtZW50KSByZXR1cm4gMDsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpOworRExMRVhQT1JUIEZQREZfRFdPUkQgU1REQ0FMTCBGUERGX0NvdW50TmFtZWREZXN0cyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CisgIGlmICghZG9jdW1lbnQpCisgICAgcmV0dXJuIDA7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UERGRG9jKCk7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOwotICAgIGlmICghcFJvb3QpIHJldHVybiAwOworICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOworICBpZiAoIXBSb290KQorICAgIHJldHVybiAwOwogCi0gICAgQ1BERl9OYW1lVHJlZSBuYW1lVHJlZShwRG9jLCBGWF9CU1RSQygiRGVzdHMiKSk7Ci0gICAgaW50IGNvdW50ID0gbmFtZVRyZWUuR2V0Q291bnQoKTsKKyAgQ1BERl9OYW1lVHJlZSBuYW1lVHJlZShwRG9jLCBGWF9CU1RSQygiRGVzdHMiKSk7CisgIGludCBjb3VudCA9IG5hbWVUcmVlLkdldENvdW50KCk7CisgIENQREZfRGljdGlvbmFyeSogcERlc3QgPSBwUm9vdC0+R2V0RGljdChGWF9CU1RSQygiRGVzdHMiKSk7CisgIGlmIChwRGVzdCkKKyAgICBjb3VudCArPSBwRGVzdC0+R2V0Q291bnQoKTsKKyAgcmV0dXJuIGNvdW50OworfQorCitETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERl9HZXROYW1lZERlc3RCeU5hbWUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgbmFtZSkgeworICBpZiAoIWRvY3VtZW50KQorICAgIHJldHVybiBOVUxMOworICBpZiAoIW5hbWUgfHwgbmFtZVswXSA9PSAwKQorICAgIHJldHVybiBOVUxMOworCisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CisgIENQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBwRG9jLT5HZXRQREZEb2MoKTsKKyAgaWYgKCFwUERGRG9jKQorICAgIHJldHVybiBOVUxMOworICBDUERGX05hbWVUcmVlIG5hbWVfdHJlZShwUERGRG9jLCBGWF9CU1RSQygiRGVzdHMiKSk7CisgIHJldHVybiBuYW1lX3RyZWUuTG9va3VwTmFtZWREZXN0KHBQREZEb2MsIG5hbWUpOworfQorCitGUERGX1JFU1VMVCBGUERGX0JTdHJfSW5pdChGUERGX0JTVFIqIHN0cikgeworICBpZiAoIXN0cikKKyAgICByZXR1cm4gLTE7CisKKyAgRlhTWVNfbWVtc2V0KHN0ciwgMCwgc2l6ZW9mKEZQREZfQlNUUikpOworICByZXR1cm4gMDsKK30KKworRlBERl9SRVNVTFQgRlBERl9CU3RyX1NldChGUERGX0JTVFIqIHN0ciwgRlBERl9MUENTVFIgYnN0ciwgaW50IGxlbmd0aCkgeworICBpZiAoIXN0cikKKyAgICByZXR1cm4gLTE7CisgIGlmICghYnN0ciB8fCAhbGVuZ3RoKQorICAgIHJldHVybiAtMTsKKyAgaWYgKGxlbmd0aCA9PSAtMSkKKyAgICBsZW5ndGggPSBGWFNZU19zdHJsZW4oYnN0cik7CisKKyAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgaWYgKHN0ci0+c3RyKSB7CisgICAgICBGWF9GcmVlKHN0ci0+c3RyKTsKKyAgICAgIHN0ci0+c3RyID0gTlVMTDsKKyAgICB9CisgICAgc3RyLT5sZW4gPSAwOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHN0ci0+c3RyICYmIHN0ci0+bGVuIDwgbGVuZ3RoKQorICAgIHN0ci0+c3RyID0gRlhfUmVhbGxvYyhjaGFyLCBzdHItPnN0ciwgbGVuZ3RoICsgMSk7CisgIGVsc2UgaWYgKCFzdHItPnN0cikKKyAgICBzdHItPnN0ciA9IEZYX0FsbG9jKGNoYXIsIGxlbmd0aCArIDEpOworCisgIHN0ci0+c3RyW2xlbmd0aF0gPSAwOworICBpZiAoc3RyLT5zdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgRlhTWVNfbWVtY3B5KHN0ci0+c3RyLCBic3RyLCBsZW5ndGgpOworICBzdHItPmxlbiA9IGxlbmd0aDsKKworICByZXR1cm4gMDsKK30KKworRlBERl9SRVNVTFQgRlBERl9CU3RyX0NsZWFyKEZQREZfQlNUUiogc3RyKSB7CisgIGlmICghc3RyKQorICAgIHJldHVybiAtMTsKKworICBpZiAoc3RyLT5zdHIpIHsKKyAgICBGWF9GcmVlKHN0ci0+c3RyKTsKKyAgICBzdHItPnN0ciA9IE5VTEw7CisgIH0KKyAgc3RyLT5sZW4gPSAwOworICByZXR1cm4gMDsKK30KKworRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKiBidWZsZW4pIHsKKyAgaWYgKCFidWZmZXIpCisgICAgKmJ1ZmxlbiA9IDA7CisgIGlmICghZG9jdW1lbnQgfHwgaW5kZXggPCAwKQorICAgIHJldHVybiBOVUxMOworICBDUERGX0RvY3VtZW50KiBwRG9jID0gKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpOworCisgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CisgIGlmICghcFJvb3QpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgQ1BERl9PYmplY3QqIHBEZXN0T2JqID0gTlVMTDsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lOworICBDUERGX05hbWVUcmVlIG5hbWVUcmVlKHBEb2MsIEZYX0JTVFJDKCJEZXN0cyIpKTsKKyAgaW50IGNvdW50ID0gbmFtZVRyZWUuR2V0Q291bnQoKTsKKyAgaWYgKGluZGV4ID49IGNvdW50KSB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGVzdCA9IHBSb290LT5HZXREaWN0KEZYX0JTVFJDKCJEZXN0cyIpKTsKLSAgICBpZiAocERlc3QpCi0gICAgICAgIGNvdW50ICs9IHBEZXN0LT5HZXRDb3VudCgpOwotICAgIHJldHVybiBjb3VudDsKLX0KLQotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0QnlOYW1lKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsRlBERl9CWVRFU1RSSU5HIG5hbWUpCi17Ci0JaWYgKCFkb2N1bWVudCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFuYW1lIHx8IG5hbWVbMF0gPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OwotCUNQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBwRG9jLT5HZXRQREZEb2MoKTsKLQlpZiAoIXBQREZEb2MpCi0JCXJldHVybiBOVUxMOwotCUNQREZfTmFtZVRyZWUgbmFtZV90cmVlKHBQREZEb2MsIEZYX0JTVFJDKCJEZXN0cyIpKTsKLQlyZXR1cm4gbmFtZV90cmVlLkxvb2t1cE5hbWVkRGVzdChwUERGRG9jLCBuYW1lKTsKLX0KLQotRlBERl9SRVNVTFQJRlBERl9CU3RyX0luaXQoRlBERl9CU1RSKiBzdHIpCi17Ci0JaWYgKCFzdHIpCi0JCXJldHVybiAtMTsKLQotCUZYU1lTX21lbXNldChzdHIsIDAsIHNpemVvZihGUERGX0JTVFIpKTsKLQlyZXR1cm4gMDsKLX0KLQotRlBERl9SRVNVTFQgRlBERl9CU3RyX1NldChGUERGX0JTVFIqIHN0ciwgRlBERl9MUENTVFIgYnN0ciwgaW50IGxlbmd0aCkKLXsKLQlpZiAoIXN0cikgcmV0dXJuIC0xOwotCWlmICghYnN0ciB8fCAhbGVuZ3RoKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGxlbmd0aCA9PSAtMSkKLQkJbGVuZ3RoID0gRlhTWVNfc3RybGVuKGJzdHIpOwotCi0JaWYgKGxlbmd0aCA9PSAwKQotCXsKLQkJaWYgKHN0ci0+c3RyKQotCQl7Ci0JCQlGWF9GcmVlKHN0ci0+c3RyKTsKLQkJCXN0ci0+c3RyID0gTlVMTDsKLQkJfQotCQlzdHItPmxlbiA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChzdHItPnN0ciAmJiBzdHItPmxlbiA8IGxlbmd0aCkKLQkJc3RyLT5zdHIgPSBGWF9SZWFsbG9jKGNoYXIsIHN0ci0+c3RyLCBsZW5ndGgrMSk7Ci0JZWxzZSBpZiAoIXN0ci0+c3RyKQotCQlzdHItPnN0ciA9IEZYX0FsbG9jKGNoYXIsIGxlbmd0aCsxKTsKLQotCXN0ci0+c3RyW2xlbmd0aF0gPSAwOwotCWlmIChzdHItPnN0ciA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlGWFNZU19tZW1jcHkoc3RyLT5zdHIsIGJzdHIsIGxlbmd0aCk7Ci0Jc3RyLT5sZW4gPSBsZW5ndGg7Ci0KLQlyZXR1cm4gMDsKLX0KLQotRlBERl9SRVNVTFQJRlBERl9CU3RyX0NsZWFyKEZQREZfQlNUUiogc3RyKQotewotCWlmKCFzdHIpCi0JCXJldHVybiAtMTsKLQotCWlmIChzdHItPnN0cikKLQl7Ci0JCUZYX0ZyZWUoc3RyLT5zdHIpOwotCQlzdHItPnN0ciA9IE5VTEw7Ci0JfQotCXN0ci0+bGVuID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBpbmRleCwgdm9pZCogYnVmZmVyLCBsb25nKiBidWZsZW4pCi17Ci0gICAgaWYgKCFidWZmZXIpCi0gICAgICAgICpidWZsZW4gPSAwOwotICAgIGlmICghZG9jdW1lbnQgfHwgaW5kZXggPCAwKSByZXR1cm4gTlVMTDsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFBERkRvYygpOwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBEb2MtPkdldFJvb3QoKTsKLSAgICBpZiAoIXBSb290KSByZXR1cm4gTlVMTDsKLQotICAgIENQREZfT2JqZWN0KiBwRGVzdE9iaiA9IE5VTEw7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lOwotICAgIENQREZfTmFtZVRyZWUgbmFtZVRyZWUocERvYywgRlhfQlNUUkMoIkRlc3RzIikpOwotICAgIGludCBjb3VudCA9IG5hbWVUcmVlLkdldENvdW50KCk7Ci0gICAgaWYgKGluZGV4ID49IGNvdW50KSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERlc3QgPSBwUm9vdC0+R2V0RGljdChGWF9CU1RSQygiRGVzdHMiKSk7Ci0gICAgICAgIGlmICghcERlc3QpIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoaW5kZXggPj0gY291bnQgKyBwRGVzdC0+R2V0Q291bnQoKSkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGluZGV4IC09IGNvdW50OwotICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwRGVzdC0+R2V0U3RhcnRQb3MoKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICBwRGVzdE9iaiA9IHBEZXN0LT5HZXROZXh0RWxlbWVudChwb3MsIGJzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoIXBEZXN0T2JqKSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChpID09IGluZGV4KSBicmVhazsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBEZXN0T2JqID0gbmFtZVRyZWUuTG9va3VwVmFsdWUoaW5kZXgsIGJzTmFtZSk7CisgICAgaWYgKCFwRGVzdCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChpbmRleCA+PSBjb3VudCArIHBEZXN0LT5HZXRDb3VudCgpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaW5kZXggLT0gY291bnQ7CisgICAgRlhfUE9TSVRJT04gcG9zID0gcERlc3QtPkdldFN0YXJ0UG9zKCk7CisgICAgaW50IGkgPSAwOworICAgIHdoaWxlIChwb3MpIHsKKyAgICAgIHBEZXN0T2JqID0gcERlc3QtPkdldE5leHRFbGVtZW50KHBvcywgYnNOYW1lKTsKKyAgICAgIGlmICghcERlc3RPYmopCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKGkgPT0gaW5kZXgpCisgICAgICAgIGJyZWFrOworICAgICAgaSsrOwogICAgIH0KLSAgICBpZiAoIXBEZXN0T2JqKSByZXR1cm4gTlVMTDsKLSAgICBpZiAocERlc3RPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICBwRGVzdE9iaiA9ICgoQ1BERl9EaWN0aW9uYXJ5KilwRGVzdE9iaiktPkdldEFycmF5KEZYX0JTVFJDKCJEIikpOwotICAgICAgICBpZiAoIXBEZXN0T2JqKSByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBEZXN0T2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSByZXR1cm4gTlVMTDsKLSAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBQREZfRGVjb2RlVGV4dChic05hbWUpOwotICAgIENGWF9CeXRlU3RyaW5nIHV0ZjE2TmFtZSA9IHdzTmFtZS5VVEYxNkxFX0VuY29kZSgpOwotICAgIHVuc2lnbmVkIGludCBsZW4gPSB1dGYxNk5hbWUuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKCFidWZmZXIpIHsKLSAgICAgICAgKmJ1ZmxlbiA9IGxlbjsKLSAgICB9IGVsc2UgaWYgKCpidWZsZW4gPj0gbGVuKSB7Ci0gICAgICAgIG1lbWNweShidWZmZXIsIHV0ZjE2TmFtZS5jX3N0cigpLCBsZW4pOwotICAgICAgICAqYnVmbGVuID0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpidWZsZW4gPSAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIChGUERGX0RFU1QpcERlc3RPYmo7CisgIH0gZWxzZSB7CisgICAgcERlc3RPYmogPSBuYW1lVHJlZS5Mb29rdXBWYWx1ZShpbmRleCwgYnNOYW1lKTsKKyAgfQorICBpZiAoIXBEZXN0T2JqKQorICAgIHJldHVybiBOVUxMOworICBpZiAocERlc3RPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIHBEZXN0T2JqID0gKChDUERGX0RpY3Rpb25hcnkqKXBEZXN0T2JqKS0+R2V0QXJyYXkoRlhfQlNUUkMoIkQiKSk7CisgICAgaWYgKCFwRGVzdE9iaikKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChwRGVzdE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkKKyAgICByZXR1cm4gTlVMTDsKKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lID0gUERGX0RlY29kZVRleHQoYnNOYW1lKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgdXRmMTZOYW1lID0gd3NOYW1lLlVURjE2TEVfRW5jb2RlKCk7CisgIHVuc2lnbmVkIGludCBsZW4gPSB1dGYxNk5hbWUuR2V0TGVuZ3RoKCk7CisgIGlmICghYnVmZmVyKSB7CisgICAgKmJ1ZmxlbiA9IGxlbjsKKyAgfSBlbHNlIGlmICgqYnVmbGVuID49IGxlbikgeworICAgIG1lbWNweShidWZmZXIsIHV0ZjE2TmFtZS5jX3N0cigpLCBsZW4pOworICAgICpidWZsZW4gPSBsZW47CisgIH0gZWxzZSB7CisgICAgKmJ1ZmxlbiA9IC0xOworICB9CisgIHJldHVybiAoRlBERl9ERVNUKXBEZXN0T2JqOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnZpZXdfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3X2VtYmVkZGVydGVzdC5jcHAKaW5kZXggZDU4Mzk5YS4uZTM2OWVkOCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZnZpZXdfZW1iZWRkZXJ0ZXN0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmdmlld19lbWJlZGRlcnRlc3QuY3BwCkBAIC0xNCw4ICsxNCw3IEBACiAgIEVYUEVDVF9UUlVFKENoZWNrUERGaXVtQ0FwaSgpKTsKIH0KIAotY2xhc3MgRlBERlZpZXdFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHsKLX07CitjbGFzcyBGUERGVmlld0VtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CiAKIFRFU1RfRihGUERGVmlld0VtYmVkZGVydGVzdCwgRG9jdW1lbnQpIHsKICAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJ0ZXN0aW5nL3Jlc291cmNlcy9hYm91dF9ibGFuay5wZGYiKSk7CkBAIC01NCw3ICs1Myw3IEBACiAgIEZQREZfREVTVCBkZXN0OwogCiAgIC8vIFF1ZXJ5IHRoZSBzaXplIG9mIHRoZSBmaXJzdCBpdGVtLgotICBidWZmZXJfc2l6ZSA9IDIwMDAwMDA7IC8vIEFic3VyZGx5IGxhcmdlLCBjaGVjayBub3QgdXNlZCBmb3IgdGhpcyBjYXNlLgorICBidWZmZXJfc2l6ZSA9IDIwMDAwMDA7ICAvLyBBYnN1cmRseSBsYXJnZSwgY2hlY2sgbm90IHVzZWQgZm9yIHRoaXMgY2FzZS4KICAgZGVzdCA9IEZQREZfR2V0TmFtZWREZXN0KGRvY3VtZW50KCksIDAsIG51bGxwdHIsICZidWZmZXJfc2l6ZSk7CiAgIEVYUEVDVF9ORShudWxscHRyLCBkZXN0KTsKICAgRVhQRUNUX0VRKDEydSwgYnVmZmVyX3NpemUpOwpAQCAtMTA0LDkgKzEwMyw4IEBACiAgIGRlc3QgPSBGUERGX0dldE5hbWVkRGVzdChkb2N1bWVudCgpLCA0LCBmaXhlZF9idWZmZXIsICZidWZmZXJfc2l6ZSk7CiAgIEVYUEVDVF9ORShudWxscHRyLCBkZXN0KTsKICAgRVhQRUNUX0VRKDMwdSwgYnVmZmVyX3NpemUpOwotICBFWFBFQ1RfRVEoCi0gICAgICBzdGQ6OnN0cmluZygiRlwwaVwwclwwc1wwdFwwQVwwbFwwdFwwZVwwclwwblwwYVwwdFwwZVwwXDBcMCIsIDMwKSwKLSAgICAgIHN0ZDo6c3RyaW5nKGZpeGVkX2J1ZmZlciwgYnVmZmVyX3NpemUpKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCJGXDBpXDByXDBzXDB0XDBBXDBsXDB0XDBlXDByXDBuXDBhXDB0XDBlXDBcMFwwIiwgMzApLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoZml4ZWRfYnVmZmVyLCBidWZmZXJfc2l6ZSkpOwogCiAgIC8vIFRyeSB0byByZXRyaWV2ZSBzaXh0aCBpdGVtIHdpdGggYW1wbGUgYnVmZmVyLiBJdGVtIGlzdGFrZW4gZnJvbSB0aGUKICAgLy8gb2xkLXN0eWxlIERlc3RzIGRpY3Rpb25hcnkgb2JqZWN0IGJ1dCBoYXMgYSBzdWItZGljdGlvbmFyeSBpbgpAQCAtMTE1LDkgKzExMyw4IEBACiAgIGRlc3QgPSBGUERGX0dldE5hbWVkRGVzdChkb2N1bWVudCgpLCA1LCBmaXhlZF9idWZmZXIsICZidWZmZXJfc2l6ZSk7CiAgIEVYUEVDVF9ORShudWxscHRyLCBkZXN0KTsKICAgRVhQRUNUX0VRKDI4dSwgYnVmZmVyX3NpemUpOwotICBFWFBFQ1RfRVEoCi0gICAgICBzdGQ6OnN0cmluZygiTFwwYVwwc1wwdFwwQVwwbFwwdFwwZVwwclwwblwwYVwwdFwwZVwwXDBcMCIsIDI4KSwKLSAgICAgIHN0ZDo6c3RyaW5nKGZpeGVkX2J1ZmZlciwgYnVmZmVyX3NpemUpKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCJMXDBhXDBzXDB0XDBBXDBsXDB0XDBlXDByXDBuXDBhXDB0XDBlXDBcMFwwIiwgMjgpLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoZml4ZWRfYnVmZmVyLCBidWZmZXJfc2l6ZSkpOwogCiAgIC8vIFRyeSB0byByZXRyaWV2ZSBub24tZXhpc3RlbnQgaXRlbSB3aXRoIGFtcGxlIGJ1ZmZlci4KICAgYnVmZmVyX3NpemUgPSBzaXplb2YoZml4ZWRfYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX2FwcC5jcHAKaW5kZXggNzJmYzkxZS4uYTUzMzgxOCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX2FwcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX2FwcC5jcHAKQEAgLTE1LDU0NiArMTUsNTQyIEBACiANCiBDUERGWEZBX0FwcCogQ1BERlhGQV9BcHA6OmdfcEFwcCA9IE5VTEw7DQogDQotQ1BERlhGQV9BcHAqIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpDQotew0KLSAgICBpZiAoIWdfcEFwcCkgew0KLSAgICAgICAgZ19wQXBwID0gRlhfTkVXIENQREZYRkFfQXBwKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGdfcEFwcDsNCitDUERGWEZBX0FwcCogQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCkgew0KKyAgaWYgKCFnX3BBcHApIHsNCisgICAgZ19wQXBwID0gRlhfTkVXIENQREZYRkFfQXBwKCk7DQorICB9DQorICByZXR1cm4gZ19wQXBwOw0KIH0NCiANCi12b2lkIENQREZYRkFfQXBwOjpSZWxlYXNlSW5zdGFuY2UoKQ0KLXsNCi0gICAgZGVsZXRlIGdfcEFwcDsNCi0gICAgZ19wQXBwID0gTlVMTDsNCit2b2lkIENQREZYRkFfQXBwOjpSZWxlYXNlSW5zdGFuY2UoKSB7DQorICBkZWxldGUgZ19wQXBwOw0KKyAgZ19wQXBwID0gTlVMTDsNCiB9DQogDQotQ0pTX1J1bnRpbWVGYWN0b3J5KiBnX0dldEpTUnVudGltZUZhY3RvcnkoKQ0KLXsNCi0gICAgc3RhdGljIENKU19SdW50aW1lRmFjdG9yeSBnX0pTUnVudGltZUZhY3Rvcnk7DQotICAgIHJldHVybiAmZ19KU1J1bnRpbWVGYWN0b3J5Ow0KK0NKU19SdW50aW1lRmFjdG9yeSogZ19HZXRKU1J1bnRpbWVGYWN0b3J5KCkgew0KKyAgc3RhdGljIENKU19SdW50aW1lRmFjdG9yeSBnX0pTUnVudGltZUZhY3Rvcnk7DQorICByZXR1cm4gJmdfSlNSdW50aW1lRmFjdG9yeTsNCiB9DQogDQotQ1BERlhGQV9BcHA6OkNQREZYRkFfQXBwKCkgOg0KLSAgICBtX2JJbml0UnVudGltZShGQUxTRSksDQotICAgIG1fcFhGQUFwcChOVUxMKSwNCi0gICAgbV9wRm9udE1ncihOVUxMKSwNCi0gICAgbV9oSlNFUnVudGltZShOVUxMKSwNCi0gICAgbV9jc0FwcFR5cGUoSlNfU1RSX1ZJRVdFUlRZUEVfU1RBTkRBUkQpDQotew0KLSAgICBtX3BKU1J1bnRpbWVGYWN0b3J5ID0gZ19HZXRKU1J1bnRpbWVGYWN0b3J5KCk7DQotICAgIG1fcEpTUnVudGltZUZhY3RvcnktPkFkZFJlZigpOw0KLSAgICBtX3BFbnZMaXN0LlJlbW92ZUFsbCgpOw0KK0NQREZYRkFfQXBwOjpDUERGWEZBX0FwcCgpDQorICAgIDogbV9iSW5pdFJ1bnRpbWUoRkFMU0UpLA0KKyAgICAgIG1fcFhGQUFwcChOVUxMKSwNCisgICAgICBtX3BGb250TWdyKE5VTEwpLA0KKyAgICAgIG1faEpTRVJ1bnRpbWUoTlVMTCksDQorICAgICAgbV9jc0FwcFR5cGUoSlNfU1RSX1ZJRVdFUlRZUEVfU1RBTkRBUkQpIHsNCisgIG1fcEpTUnVudGltZUZhY3RvcnkgPSBnX0dldEpTUnVudGltZUZhY3RvcnkoKTsNCisgIG1fcEpTUnVudGltZUZhY3RvcnktPkFkZFJlZigpOw0KKyAgbV9wRW52TGlzdC5SZW1vdmVBbGwoKTsNCiB9DQogDQotQ1BERlhGQV9BcHA6On5DUERGWEZBX0FwcCgpDQotew0KLSAgICBkZWxldGUgbV9wRm9udE1ncjsNCi0gICAgbV9wRm9udE1nciA9IE5VTEw7DQorQ1BERlhGQV9BcHA6On5DUERGWEZBX0FwcCgpIHsNCisgIGRlbGV0ZSBtX3BGb250TWdyOw0KKyAgbV9wRm9udE1nciA9IE5VTEw7DQogDQotICAgIGRlbGV0ZSBtX3BYRkFBcHA7DQotICAgIG1fcFhGQUFwcCA9IE5VTEw7DQorICBkZWxldGUgbV9wWEZBQXBwOw0KKyAgbV9wWEZBQXBwID0gTlVMTDsNCiANCi0gICAgbV9wSlNSdW50aW1lRmFjdG9yeS0+UmVsZWFzZSgpOw0KLSAgICBGWEpTRV9SdW50aW1lX1JlbGVhc2UobV9oSlNFUnVudGltZSk7DQotICAgIG1faEpTRVJ1bnRpbWUgPSBOVUxMOw0KKyAgbV9wSlNSdW50aW1lRmFjdG9yeS0+UmVsZWFzZSgpOw0KKyAgRlhKU0VfUnVudGltZV9SZWxlYXNlKG1faEpTRVJ1bnRpbWUpOw0KKyAgbV9oSlNFUnVudGltZSA9IE5VTEw7DQogDQotICAgIEZYSlNFX0ZpbmFsaXplKCk7DQotICAgIEJDX0xpYnJhcnlfRGVzdG9yeSgpOw0KKyAgRlhKU0VfRmluYWxpemUoKTsNCisgIEJDX0xpYnJhcnlfRGVzdG9yeSgpOw0KIH0NCiANCi1GWF9CT09MIENQREZYRkFfQXBwOjpJbml0aWFsaXplKCkNCi17DQotICAgIEJDX0xpYnJhcnlfSW5pdCgpOw0KLSAgICBGWEpTRV9Jbml0aWFsaXplKCk7DQorRlhfQk9PTCBDUERGWEZBX0FwcDo6SW5pdGlhbGl6ZSgpIHsNCisgIEJDX0xpYnJhcnlfSW5pdCgpOw0KKyAgRlhKU0VfSW5pdGlhbGl6ZSgpOw0KIA0KLSAgICBtX2hKU0VSdW50aW1lID0gRlhKU0VfUnVudGltZV9DcmVhdGUoKTsNCi0gICAgaWYgKCFtX2hKU0VSdW50aW1lKQ0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgbV9oSlNFUnVudGltZSA9IEZYSlNFX1J1bnRpbWVfQ3JlYXRlKCk7DQorICBpZiAoIW1faEpTRVJ1bnRpbWUpDQorICAgIHJldHVybiBGQUxTRTsNCiANCi0gICAgbV9wWEZBQXBwID0gSVhGQV9BcHA6OkNyZWF0ZSh0aGlzKTsNCi0gICAgaWYgKCFtX3BYRkFBcHApDQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICBtX3BYRkFBcHAgPSBJWEZBX0FwcDo6Q3JlYXRlKHRoaXMpOw0KKyAgaWYgKCFtX3BYRkFBcHApDQorICAgIHJldHVybiBGQUxTRTsNCiANCi0gICAgbV9wRm9udE1nciA9IElYRkFfRm9udE1ncjo6Q3JlYXRlRGVmYXVsdCgpOw0KLSAgICBpZiAoIW1fcEZvbnRNZ3IpDQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICBtX3BGb250TWdyID0gSVhGQV9Gb250TWdyOjpDcmVhdGVEZWZhdWx0KCk7DQorICBpZiAoIW1fcEZvbnRNZ3IpDQorICAgIHJldHVybiBGQUxTRTsNCiANCi0gICAgbV9wWEZBQXBwLT5TZXREZWZhdWx0Rm9udE1ncihtX3BGb250TWdyKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICBtX3BYRkFBcHAtPlNldERlZmF1bHRGb250TWdyKG1fcEZvbnRNZ3IpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KIA0KIEZYX0JPT0wgQ1BERlhGQV9BcHA6OkluaXRSdW50aW1lKEZYX0JPT0wgYlJlc2V0KSB7DQotICAgIGlmIChiUmVzZXQpIHsNCi0gICAgICAgIG1fYkluaXRSdW50aW1lID0gRkFMU0U7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBpZiAobV9iSW5pdFJ1bnRpbWUpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIG1fYkluaXRSdW50aW1lID0gVFJVRTsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi0NCi1GWF9CT09MIENQREZYRkFfQXBwOjpBZGRGb3JtRmlsbEVudihDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KQ0KLXsNCi0gICAgaWYgKCFwRW52KSByZXR1cm4gRkFMU0U7DQotDQotICAgIG1fcEVudkxpc3QuQWRkKHBFbnYpOw0KKyAgaWYgKGJSZXNldCkgew0KKyAgICBtX2JJbml0UnVudGltZSA9IEZBTFNFOw0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChtX2JJbml0UnVudGltZSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIG1fYkluaXRSdW50aW1lID0gVFJVRTsNCisgIHJldHVybiBGQUxTRTsNCiB9DQogDQotRlhfQk9PTCBDUERGWEZBX0FwcDo6UmVtb3ZlRm9ybUZpbGxFbnYoQ1BERkRvY19FbnZpcm9ubWVudCogcEVudikNCi17DQotICAgIGlmICghcEVudikgcmV0dXJuIEZBTFNFOw0KLQ0KLSAgICBpbnQgbkZpbmQgPSBtX3BFbnZMaXN0LkZpbmQocEVudik7DQotICAgIGlmIChuRmluZCAhPSAtMSkgew0KLSAgICAgICAgbV9wRW52TGlzdC5SZW1vdmVBdChuRmluZCk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLQ0KK0ZYX0JPT0wgQ1BERlhGQV9BcHA6OkFkZEZvcm1GaWxsRW52KENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpIHsNCisgIGlmICghcEVudikNCiAgICAgcmV0dXJuIEZBTFNFOw0KLX0NCi12b2lkIENQREZYRkFfQXBwOjpSZWxlYXNlUnVudGltZSgpDQotew0KLSAgICB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiBjb250ZXh0Ow0KLSAgICBKU19SZWxlYXNlUnVudGltZSgoSUpTX1J1bnRpbWUqKW1faEpTRVJ1bnRpbWUsIGNvbnRleHQpOw0KKw0KKyAgbV9wRW52TGlzdC5BZGQocEVudik7DQorICByZXR1cm4gVFJVRTsNCiB9DQogDQotdm9pZCBDUERGWEZBX0FwcDo6R2V0QXBwVHlwZShDRlhfV2lkZVN0cmluZyAmd3NBcHBUeXBlKQ0KLXsNCi0gICAgd3NBcHBUeXBlID0gbV9jc0FwcFR5cGU7DQorRlhfQk9PTCBDUERGWEZBX0FwcDo6UmVtb3ZlRm9ybUZpbGxFbnYoQ1BERkRvY19FbnZpcm9ubWVudCogcEVudikgew0KKyAgaWYgKCFwRW52KQ0KKyAgICByZXR1cm4gRkFMU0U7DQorDQorICBpbnQgbkZpbmQgPSBtX3BFbnZMaXN0LkZpbmQocEVudik7DQorICBpZiAobkZpbmQgIT0gLTEpIHsNCisgICAgbV9wRW52TGlzdC5SZW1vdmVBdChuRmluZCk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENQREZYRkFfQXBwOjpSZWxlYXNlUnVudGltZSgpIHsNCisgIHY4OjpHbG9iYWw8djg6OkNvbnRleHQ+IGNvbnRleHQ7DQorICBKU19SZWxlYXNlUnVudGltZSgoSUpTX1J1bnRpbWUqKW1faEpTRVJ1bnRpbWUsIGNvbnRleHQpOw0KIH0NCiANCi12b2lkIENQREZYRkFfQXBwOjpHZXRBcHBOYW1lKENGWF9XaWRlU3RyaW5nJiB3c05hbWUpDQotew0KLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCi0gICAgaWYgKHBFbnYpDQotICAgIHsNCi0gICAgICAgIHdzTmFtZSA9IHBFbnYtPkZGSV9HZXRBcHBOYW1lKCk7DQotICAgIH0NCit2b2lkIENQREZYRkFfQXBwOjpHZXRBcHBUeXBlKENGWF9XaWRlU3RyaW5nJiB3c0FwcFR5cGUpIHsNCisgIHdzQXBwVHlwZSA9IG1fY3NBcHBUeXBlOw0KIH0NCiANCi12b2lkIENQREZYRkFfQXBwOjpTZXRBcHBUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBcHBUeXBlKQ0KLXsNCi0gICAgbV9jc0FwcFR5cGUgPSB3c0FwcFR5cGU7DQordm9pZCBDUERGWEZBX0FwcDo6R2V0QXBwTmFtZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSB7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisgIGlmIChwRW52KSB7DQorICAgIHdzTmFtZSA9IHBFbnYtPkZGSV9HZXRBcHBOYW1lKCk7DQorICB9DQogfQ0KIA0KLXZvaWQgQ1BERlhGQV9BcHA6OkdldExhbmd1YWdlKENGWF9XaWRlU3RyaW5nICZ3c0xhbmd1YWdlKQ0KLXsNCi0gICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQotICAgIGlmIChwRW52KQ0KLSAgICB7DQotICAgICAgICB3c0xhbmd1YWdlID0gcEVudi0+RkZJX0dldExhbmd1YWdlKCk7DQotICAgIH0NCit2b2lkIENQREZYRkFfQXBwOjpTZXRBcHBUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBcHBUeXBlKSB7DQorICBtX2NzQXBwVHlwZSA9IHdzQXBwVHlwZTsNCiB9DQogDQotdm9pZCBDUERGWEZBX0FwcDo6R2V0UGxhdGZvcm0oQ0ZYX1dpZGVTdHJpbmcgJndzUGxhdGZvcm0pDQotew0KLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCi0gICAgaWYgKHBFbnYpDQotICAgIHsNCi0gICAgICAgIHdzUGxhdGZvcm0gPSBwRW52LT5GRklfR2V0UGxhdGZvcm0oKTsNCi0gICAgfQ0KK3ZvaWQgQ1BERlhGQV9BcHA6OkdldExhbmd1YWdlKENGWF9XaWRlU3RyaW5nJiB3c0xhbmd1YWdlKSB7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisgIGlmIChwRW52KSB7DQorICAgIHdzTGFuZ3VhZ2UgPSBwRW52LT5GRklfR2V0TGFuZ3VhZ2UoKTsNCisgIH0NCiB9DQogDQotdm9pZCBDUERGWEZBX0FwcDo6R2V0VmFyaWF0aW9uKENGWF9XaWRlU3RyaW5nICZ3c1ZhcmlhdGlvbikNCi17DQotICAgIHdzVmFyaWF0aW9uID0gSlNfU1RSX1ZJRVdFUlZBUklBVElPTjsNCit2b2lkIENQREZYRkFfQXBwOjpHZXRQbGF0Zm9ybShDRlhfV2lkZVN0cmluZyYgd3NQbGF0Zm9ybSkgew0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQorICBpZiAocEVudikgew0KKyAgICB3c1BsYXRmb3JtID0gcEVudi0+RkZJX0dldFBsYXRmb3JtKCk7DQorICB9DQogfQ0KIA0KLXZvaWQgQ1BERlhGQV9BcHA6OkdldFZlcnNpb24oQ0ZYX1dpZGVTdHJpbmcgJndzVmVyc2lvbikNCi17DQotICAgIHdzVmVyc2lvbiA9IEpTX1NUUl9WSUVXRVJWRVJTSU9OX1hGQTsNCit2b2lkIENQREZYRkFfQXBwOjpHZXRWYXJpYXRpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzVmFyaWF0aW9uKSB7DQorICB3c1ZhcmlhdGlvbiA9IEpTX1NUUl9WSUVXRVJWQVJJQVRJT047DQogfQ0KIA0KLXZvaWQgQ1BERlhGQV9BcHA6OkJlZXAoRlhfRFdPUkQgZHdUeXBlKQ0KLXsNCi0gICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQotICAgIGlmIChwRW52KQ0KLSAgICB7DQotICAgICAgICBwRW52LT5KU19hcHBCZWVwKGR3VHlwZSk7DQotICAgIH0NCit2b2lkIENQREZYRkFfQXBwOjpHZXRWZXJzaW9uKENGWF9XaWRlU3RyaW5nJiB3c1ZlcnNpb24pIHsNCisgIHdzVmVyc2lvbiA9IEpTX1NUUl9WSUVXRVJWRVJTSU9OX1hGQTsNCiB9DQogDQotaW50MzJfdCBDUERGWEZBX0FwcDo6TXNnQm94KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZXNzYWdlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGl0bGUsIEZYX0RXT1JEIGR3SWNvblR5cGUsIEZYX0RXT1JEIGR3QnV0dG9uVHlwZSkNCi17DQotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KLSAgICBpZiAoIXBFbnYpDQotICAgICAgICByZXR1cm4gLTE7DQordm9pZCBDUERGWEZBX0FwcDo6QmVlcChGWF9EV09SRCBkd1R5cGUpIHsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KKyAgaWYgKHBFbnYpIHsNCisgICAgcEVudi0+SlNfYXBwQmVlcChkd1R5cGUpOw0KKyAgfQ0KK30NCiANCi0gICAgRlhfRFdPUkQgaWNvblR5cGUgPSAwOw0KLSAgICBpbnQgaUJ1dHRvblR5cGUgPSAwOw0KLSAgICBzd2l0Y2ggKGR3SWNvblR5cGUpDQotICAgIHsNCitpbnQzMl90IENQREZYRkFfQXBwOjpNc2dCb3goY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01lc3NhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdJY29uVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdCdXR0b25UeXBlKSB7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisgIGlmICghcEVudikNCisgICAgcmV0dXJuIC0xOw0KKw0KKyAgRlhfRFdPUkQgaWNvblR5cGUgPSAwOw0KKyAgaW50IGlCdXR0b25UeXBlID0gMDsNCisgIHN3aXRjaCAoZHdJY29uVHlwZSkgew0KICAgICBjYXNlIFhGQV9NQklDT05fRXJyb3I6DQotICAgICAgICBpY29uVHlwZSB8PSAwOw0KLSAgICAgICAgYnJlYWs7DQorICAgICAgaWNvblR5cGUgfD0gMDsNCisgICAgICBicmVhazsNCiAgICAgY2FzZSBYRkFfTUJJQ09OX1dhcm5pbmc6DQotICAgICAgICBpY29uVHlwZSB8PSAxOw0KLSAgICAgICAgYnJlYWs7DQorICAgICAgaWNvblR5cGUgfD0gMTsNCisgICAgICBicmVhazsNCiAgICAgY2FzZSBYRkFfTUJJQ09OX1F1ZXN0aW9uOg0KLSAgICAgICAgaWNvblR5cGUgfD0gMjsNCi0gICAgICAgIGJyZWFrOw0KKyAgICAgIGljb25UeXBlIHw9IDI7DQorICAgICAgYnJlYWs7DQogICAgIGNhc2UgWEZBX01CSUNPTl9TdGF0dXM6DQotICAgICAgICBpY29uVHlwZSB8PSAzOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgc3dpdGNoIChkd0J1dHRvblR5cGUpDQotICAgIHsNCi0gICAgY2FzZSAgWEZBX01CX09LOg0KLSAgICAgICAgaUJ1dHRvblR5cGUgfD0gMDsNCi0gICAgICAgIGJyZWFrOw0KKyAgICAgIGljb25UeXBlIHw9IDM7DQorICAgICAgYnJlYWs7DQorICB9DQorICBzd2l0Y2ggKGR3QnV0dG9uVHlwZSkgew0KKyAgICBjYXNlIFhGQV9NQl9PSzoNCisgICAgICBpQnV0dG9uVHlwZSB8PSAwOw0KKyAgICAgIGJyZWFrOw0KICAgICBjYXNlIFhGQV9NQl9PS0NhbmNlbDoNCi0gICAgICAgIGlCdXR0b25UeXBlIHw9IDE7DQotICAgICAgICBicmVhazsNCisgICAgICBpQnV0dG9uVHlwZSB8PSAxOw0KKyAgICAgIGJyZWFrOw0KICAgICBjYXNlIFhGQV9NQl9ZZXNObzoNCi0gICAgICAgIGlCdXR0b25UeXBlIHw9IDI7DQotICAgICAgICBicmVhazsNCisgICAgICBpQnV0dG9uVHlwZSB8PSAyOw0KKyAgICAgIGJyZWFrOw0KICAgICBjYXNlIFhGQV9NQl9ZZXNOb0NhbmNlbDoNCi0gICAgICAgIGlCdXR0b25UeXBlIHw9IDM7DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlSZXQgPSBwRW52LT5KU19hcHBBbGVydCh3c01lc3NhZ2UuR2V0UHRyKCksIHdzVGl0bGUuR2V0UHRyKCksIGlCdXR0b25UeXBlLCBpY29uVHlwZSk7DQotICAgIHN3aXRjaCAoaVJldCkNCi0gICAgew0KKyAgICAgIGlCdXR0b25UeXBlIHw9IDM7DQorICAgICAgYnJlYWs7DQorICB9DQorICBpbnQzMl90IGlSZXQgPSBwRW52LT5KU19hcHBBbGVydCh3c01lc3NhZ2UuR2V0UHRyKCksIHdzVGl0bGUuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQnV0dG9uVHlwZSwgaWNvblR5cGUpOw0KKyAgc3dpdGNoIChpUmV0KSB7DQogICAgIGNhc2UgMToNCi0gICAgICAgIHJldHVybiBYRkFfSURPSzsNCisgICAgICByZXR1cm4gWEZBX0lET0s7DQogICAgIGNhc2UgMjoNCi0gICAgICAgIHJldHVybiBYRkFfSURDYW5jZWw7DQorICAgICAgcmV0dXJuIFhGQV9JRENhbmNlbDsNCiAgICAgY2FzZSAzOg0KLSAgICAgICAgcmV0dXJuIFhGQV9JRE5vOw0KKyAgICAgIHJldHVybiBYRkFfSURObzsNCiAgICAgY2FzZSA0Og0KLSAgICAgICAgcmV0dXJuIFhGQV9JRFllczsNCi0gICAgfQ0KLSAgICByZXR1cm4gWEZBX0lEWWVzOw0KKyAgICAgIHJldHVybiBYRkFfSURZZXM7DQorICB9DQorICByZXR1cm4gWEZBX0lEWWVzOw0KIH0NCiANCi12b2lkIENQREZYRkFfQXBwOjpSZXNwb25zZShDRlhfV2lkZVN0cmluZyAmd3NBbnN3ZXIsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NRdWVzdGlvbiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGVmYXVsdEFuc3dlciwgRlhfQk9PTCBiTWFyaykNCi17DQotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KLSAgICBpZiAocEVudikNCi0gICAgew0KLSAgICAgICAgaW50IG5MZW5ndGggPSAyMDQ4Ow0KLSAgICAgICAgY2hhciogcEJ1ZmYgPSBuZXcgY2hhcltuTGVuZ3RoXTsNCi0gICAgICAgIG5MZW5ndGggPSBwRW52LT5KU19hcHBSZXNwb25zZSh3c1F1ZXN0aW9uLkdldFB0cigpLCB3c1RpdGxlLkdldFB0cigpLCB3c0RlZmF1bHRBbnN3ZXIuR2V0UHRyKCksIE5VTEwsIGJNYXJrLCBwQnVmZiwgbkxlbmd0aCk7DQotICAgICAgICBpZihuTGVuZ3RoID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuTGVuZ3RoID0gbkxlbmd0aD4yMDQ2PzIwNDY6bkxlbmd0aDsNCi0gICAgICAgICAgICBwQnVmZltuTGVuZ3RoXSA9IDA7DQotICAgICAgICAgICAgcEJ1ZmZbbkxlbmd0aCsxXSA9IDA7DQotICAgICAgICAgICAgd3NBbnN3ZXIgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoKHVuc2lnbmVkIHNob3J0KilwQnVmZiwgbkxlbmd0aCk7DQotICAgICAgICB9DQotICAgICAgICBkZWxldGVbXSBwQnVmZjsNCit2b2lkIENQREZYRkFfQXBwOjpSZXNwb25zZShDRlhfV2lkZVN0cmluZyYgd3NBbnN3ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1F1ZXN0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGVmYXVsdEFuc3dlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNYXJrKSB7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisgIGlmIChwRW52KSB7DQorICAgIGludCBuTGVuZ3RoID0gMjA0ODsNCisgICAgY2hhciogcEJ1ZmYgPSBuZXcgY2hhcltuTGVuZ3RoXTsNCisgICAgbkxlbmd0aCA9IHBFbnYtPkpTX2FwcFJlc3BvbnNlKHdzUXVlc3Rpb24uR2V0UHRyKCksIHdzVGl0bGUuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RlZmF1bHRBbnN3ZXIuR2V0UHRyKCksIE5VTEwsIGJNYXJrLCBwQnVmZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5MZW5ndGgpOw0KKyAgICBpZiAobkxlbmd0aCA+IDApIHsNCisgICAgICBuTGVuZ3RoID0gbkxlbmd0aCA+IDIwNDYgPyAyMDQ2IDogbkxlbmd0aDsNCisgICAgICBwQnVmZltuTGVuZ3RoXSA9IDA7DQorICAgICAgcEJ1ZmZbbkxlbmd0aCArIDFdID0gMDsNCisgICAgICB3c0Fuc3dlciA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSgodW5zaWduZWQgc2hvcnQqKXBCdWZmLCBuTGVuZ3RoKTsNCiAgICAgfQ0KKyAgICBkZWxldGVbXSBwQnVmZjsNCisgIH0NCiB9DQogDQotaW50MzJfdCBDUERGWEZBX0FwcDo6R2V0Q3VyRG9jdW1lbnRJbkJhdGNoKCkNCi17DQotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KLSAgICBpZiAocEVudikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBFbnYtPkZGSV9HZXRDdXJEb2N1bWVudCgpOw0KLSAgICB9DQotICAgIHJldHVybiAwOw0KK2ludDMyX3QgQ1BERlhGQV9BcHA6OkdldEN1ckRvY3VtZW50SW5CYXRjaCgpIHsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KKyAgaWYgKHBFbnYpIHsNCisgICAgcmV0dXJuIHBFbnYtPkZGSV9HZXRDdXJEb2N1bWVudCgpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQogfQ0KIA0KLWludDMyX3QgQ1BERlhGQV9BcHA6OkdldERvY3VtZW50Q291bnRJbkJhdGNoKCkNCi17DQotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KLSAgICBpZiAocEVudikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBFbnYtPkZGSV9HZXREb2N1bWVudENvdW50KCk7DQotICAgIH0NCitpbnQzMl90IENQREZYRkFfQXBwOjpHZXREb2N1bWVudENvdW50SW5CYXRjaCgpIHsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KKyAgaWYgKHBFbnYpIHsNCisgICAgcmV0dXJuIHBFbnYtPkZGSV9HZXREb2N1bWVudENvdW50KCk7DQorICB9DQogDQotICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIDA7DQogfQ0KIA0KLUlGWF9GaWxlUmVhZCogQ1BERlhGQV9BcHA6OkRvd25sb2FkVVJMKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVUkwpDQotew0KLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCi0gICAgaWYgKHBFbnYpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwRW52LT5GRklfRG93bmxvYWRGcm9tVVJMKHdzVVJMLkdldFB0cigpKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCitJRlhfRmlsZVJlYWQqIENQREZYRkFfQXBwOjpEb3dubG9hZFVSTChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMKSB7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisgIGlmIChwRW52KSB7DQorICAgIHJldHVybiBwRW52LT5GRklfRG93bmxvYWRGcm9tVVJMKHdzVVJMLkdldFB0cigpKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCiANCi1GWF9CT09MIENQREZYRkFfQXBwOjpQb3N0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGF0YSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnRUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0VuY29kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0hlYWRlciwgQ0ZYX1dpZGVTdHJpbmcgJndzUmVzcG9uc2UpDQotew0KLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCi0gICAgaWYgKHBFbnYpDQotICAgIHsNCi0gICAgICAgIHdzUmVzcG9uc2UgPSBwRW52LT5GRklfUG9zdFJlcXVlc3RVUkwod3NVUkwuR2V0UHRyKCksIHdzRGF0YS5HZXRQdHIoKSwgd3NDb250ZW50VHlwZS5HZXRQdHIoKSwgd3NFbmNvZGUuR2V0UHRyKCksIHdzSGVhZGVyLkdldFB0cigpKTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENQREZYRkFfQXBwOjpQb3N0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDb250ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRW5jb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NIZWFkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzcG9uc2UpIHsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KKyAgaWYgKHBFbnYpIHsNCisgICAgd3NSZXNwb25zZSA9IHBFbnYtPkZGSV9Qb3N0UmVxdWVzdFVSTCh3c1VSTC5HZXRQdHIoKSwgd3NEYXRhLkdldFB0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzQ29udGVudFR5cGUuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NFbmNvZGUuR2V0UHRyKCksIHdzSGVhZGVyLkdldFB0cigpKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KIA0KLUZYX0JPT0wgQ1BERlhGQV9BcHA6OlB1dFJlcXVlc3RVUkwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VSTCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0RhdGEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFbmNvZGUpDQotew0KLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCi0gICAgaWYgKHBFbnYpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwRW52LT5GRklfUHV0UmVxdWVzdFVSTCh3c1VSTC5HZXRQdHIoKSwgd3NEYXRhLkdldFB0cigpLCB3c0VuY29kZS5HZXRQdHIoKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1BERlhGQV9BcHA6OlB1dFJlcXVlc3RVUkwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VSTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0VuY29kZSkgew0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQorICBpZiAocEVudikgew0KKyAgICByZXR1cm4gcEVudi0+RkZJX1B1dFJlcXVlc3RVUkwod3NVUkwuR2V0UHRyKCksIHdzRGF0YS5HZXRQdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRW5jb2RlLkdldFB0cigpKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQogDQotdm9pZCBDUERGWEZBX0FwcDo6TG9hZFN0cmluZyhpbnQzMl90IGlTdHJpbmdJRCwgQ0ZYX1dpZGVTdHJpbmcgJndzU3RyaW5nKQ0KLXsNCi0gICAgc3dpdGNoIChpU3RyaW5nSUQpDQotICAgIHsNCit2b2lkIENQREZYRkFfQXBwOjpMb2FkU3RyaW5nKGludDMyX3QgaVN0cmluZ0lELCBDRlhfV2lkZVN0cmluZyYgd3NTdHJpbmcpIHsNCisgIHN3aXRjaCAoaVN0cmluZ0lEKSB7DQogICAgIGNhc2UgWEZBX0lEU19WYWxpZGF0ZUZhaWxlZDoNCi0gICAgICAgIHdzU3RyaW5nID0gTCIlcyB2YWxpZGF0ZSBmYWlsZWQiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCIlcyB2YWxpZGF0ZSBmYWlsZWQiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0NhbGNPdmVycmlkZToNCi0gICAgICAgIHdzU3RyaW5nID0gTCJDYWxjdWxhdGUgT3ZlcnJpZGUiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJDYWxjdWxhdGUgT3ZlcnJpZGUiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX01vZGlmeUZpZWxkOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBtb2RpZnkgdGhpcyBmaWVsZD8iOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbW9kaWZ5IHRoaXMgZmllbGQ/IjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19Ob3RNb2RpZnlGaWVsZDoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGlzIGZpZWxkLiI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IHRoaXMgZmllbGQuIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19BcHBOYW1lOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIkZveGl0IjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiRm94aXQiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0ltYWdlRmlsdGVyOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIkltYWdlIEZpbGVzKCouYm1wOyouanBnOyoucG5nOyouZ2lmOyoudGlmKXwqLmJtcDsqLmpwZzsqLnBuZzsqLmdpZjsqLnRpZnxBbGwgRmlsZXMoKi4qKXwqLip8fCI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPQ0KKyAgICAgICAgICBMIkltYWdlICINCisgICAgICAgICAgTCJGaWxlcygqLmJtcDsqLmpwZzsqLnBuZzsqLmdpZjsqLnRpZil8Ki5ibXA7Ki5qcGc7Ki5wbmc7Ki5naWY7Ki50aWZ8Ig0KKyAgICAgICAgICBMIkFsbCBGaWxlcygqLiopfCouKnx8IjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19VTktOT1dfQ0FUQ0hFRDoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJ1bmtub3duIGVycm9yIGlzIGNhdGNoZWQhIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwidW5rbm93biBlcnJvciBpcyBjYXRjaGVkISI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfVW5hYmxlX1RPX1NFVDoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJVbmFibGUgdG8gc2V0ICI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19WQUxVRV9FWENBTE1BVE9SWToNCi0gICAgICAgIHdzU3RyaW5nID0gTCIgdmFsdWUhIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiIHZhbHVlISI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfSU5WQUxJRF9FTlVNX1ZBTFVFOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIkludmFsaWQgZW51bWVyYXRlZCB2YWx1ZTogIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiSW52YWxpZCBlbnVtZXJhdGVkIHZhbHVlOiAiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX1VOU1VQUE9SVF9NRVRIT0Q6DQotICAgICAgICB3c1N0cmluZyA9IEwidW5zdXBwb3J0ICVzIG1ldGhvZC4iOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJ1bnN1cHBvcnQgJXMgbWV0aG9kLiI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfVU5TVVBQT1JUX1BST1A6DQotICAgICAgICB3c1N0cmluZyA9IEwidW5zdXBwb3J0ICVzIHByb3BlcnR5LiI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMInVuc3VwcG9ydCAlcyBwcm9wZXJ0eS4iOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQ6DQotICAgICAgICB3c1N0cmluZyA9IEwiSW52YWxpZCBwcm9wZXJ0eSBzZXQgb3BlcmF0aW9uOyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIkludmFsaWQgcHJvcGVydHkgc2V0IG9wZXJhdGlvbjsiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX05PVF9ERUZBVUxfVkFMVUU6DQotICAgICAgICB3c1N0cmluZyA9IEwiIGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQgcHJvcGVydHkiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCIgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBwcm9wZXJ0eSI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfVU5BQkxFX1NFVF9MQU5HVUFHRToNCi0gICAgICAgIHdzU3RyaW5nID0gTCJVbmFibGUgdG8gc2V0IGxhbmd1YWdlIHZhbHVlISI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgbGFuZ3VhZ2UgdmFsdWUhIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19VTkFCTEVfU0VUX05VTVBBR0VTOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgbnVtUGFnZXMgdmFsdWUhIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCBudW1QYWdlcyB2YWx1ZSEiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX1VOQUJMRV9TRVRfUExBVEZPUk06DQotICAgICAgICB3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCBwbGF0Zm9ybSB2YWx1ZSEiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJVbmFibGUgdG8gc2V0IHBsYXRmb3JtIHZhbHVlISI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfVU5BQkxFX1NFVF9WQUxJREFUSU9ORU5BQkxFOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgdmFsaWRhdGlvbnNFbmFibGVkIHZhbHVlISI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgdmFsaWRhdGlvbnNFbmFibGVkIHZhbHVlISI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfVU5BQkxFX1NFVF9WQVJJQVRJT046DQotICAgICAgICB3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCB2YXJpYXRpb24gdmFsdWUhIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCB2YXJpYXRpb24gdmFsdWUhIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19VTkFCTEVfU0VUX1ZFUlNJT046DQotICAgICAgICB3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCB2ZXJzaW9uIHZhbHVlISI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgdmVyc2lvbiB2YWx1ZSEiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX1VOQUJMRV9TRVRfUkVBRFk6DQotICAgICAgICB3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCByZWFkeSB2YWx1ZSEiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJVbmFibGUgdG8gc2V0IHJlYWR5IHZhbHVlISI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfTlVNQkVSX09GX09DQ1VSOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIlRoZSBlbGVtZW50IFslc10gaGFzIHZpb2xhdGVkIGl0cyBhbGxvd2FibGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9DQorICAgICAgICAgIEwiVGhlIGVsZW1lbnQgWyVzXSBoYXMgdmlvbGF0ZWQgaXRzIGFsbG93YWJsZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX1VOQUJMRV9TRVRfQ0xBU1NfTkFNRToNCi0gICAgICAgIHdzU3RyaW5nID0gTCJVbmFibGUgdG8gc2V0IGNsYXNzTmFtZSB2YWx1ZSEiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJVbmFibGUgdG8gc2V0IGNsYXNzTmFtZSB2YWx1ZSEiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX1VOQUJMRV9TRVRfTEVOR1RIX1ZBTFVFOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgbGVuZ3RoIHZhbHVlISI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgbGVuZ3RoIHZhbHVlISI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfVU5TVVBQT1JUX0NIQVI6DQotICAgICAgICB3c1N0cmluZyA9IEwidW5zdXBwb3J0ZWQgY2hhciAnJWMnIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwidW5zdXBwb3J0ZWQgY2hhciAnJWMnIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19CQURfU1VGRklYOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMImJhZCBzdWZmaXggb24gbnVtYmVyIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiYmFkIHN1ZmZpeCBvbiBudW1iZXIiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0VYUEVDVEVEX0lERU5UOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMImV4cGVjdGVkIGlkZW50aWZpZXIgaW5zdGVhZCBvZiAnJXMnIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiZXhwZWN0ZWQgaWRlbnRpZmllciBpbnN0ZWFkIG9mICclcyciOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0VYUEVDVEVEX1NUUklORzoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJleHBlY3RlZCAnJXMnIGluc3RlYWQgb2YgJyVzJyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImV4cGVjdGVkICclcycgaW5zdGVhZCBvZiAnJXMnIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19JTlZBTElEQVRFX0NIQVI6DQotICAgICAgICB3c1N0cmluZyA9IEwiaW52YWxpZGF0ZSBjaGFyICclYyciOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJpbnZhbGlkYXRlIGNoYXIgJyVjJyI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfUkVERUZJTklUSU9OOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIiclcycgcmVkZWZpbml0aW9uICI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIiclcycgcmVkZWZpbml0aW9uICI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfSU5WQUxJREFURV9UT0tFTjoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJpbnZhbGlkYXRlIHRva2VuICclcyciOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJpbnZhbGlkYXRlIHRva2VuICclcyciOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0lOVkFMSURBVEVfRVhQUkVTU0lPTjoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJpbnZhbGlkYXRlIGV4cHJlc3Npb24gJyVzJyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImludmFsaWRhdGUgZXhwcmVzc2lvbiAnJXMnIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19VTkRFRklORV9JREVOVElGSUVSOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMInVuZGVmaW5lZCBpZGVudGlmaWVyICclcyciOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJ1bmRlZmluZWQgaWRlbnRpZmllciAnJXMnIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19JTlZBTElEQVRFX0xFRlRWQUxVRToNCi0gICAgICAgIHdzU3RyaW5nID0gTCJpbnZhbGlkYXRlIGxlZnQtdmFsdWUgJyVzJyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImludmFsaWRhdGUgbGVmdC12YWx1ZSAnJXMnIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19DT01QSUxFUl9FUlJPUjoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJjb21waWxlciBlcnJvciI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImNvbXBpbGVyIGVycm9yIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19DQU5OT1RfTU9ESUZZX1ZBTFVFOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMImNhbid0IG1vZGlmeSB0aGUgJyVzJyB2YWx1ZSI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImNhbid0IG1vZGlmeSB0aGUgJyVzJyB2YWx1ZSI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfRVJST1JfUEFSQU1FVEVSUzoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJmdW5jdGlvbiAnJXMnIGhhcyBub3QgJWQgcGFyYW1ldGVycyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImZ1bmN0aW9uICclcycgaGFzIG5vdCAlZCBwYXJhbWV0ZXJzIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19FWFBFQ1RfRU5ESUY6DQotICAgICAgICB3c1N0cmluZyA9IEwiZXhwZWN0ZWQgJ2VuZGlmJyBpbnN0ZWFkIG9mICclcyciOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJleHBlY3RlZCAnZW5kaWYnIGluc3RlYWQgb2YgJyVzJyI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMInVuZXhwZWN0ZWQgZXhwcmVzc2lvbiAnJXMnIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwidW5leHBlY3RlZCBleHByZXNzaW9uICclcyciOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0NPTkRJVElPTl9JU19OVUxMOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMImNvbmRpdGlvbiBpcyBudWxsIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiY29uZGl0aW9uIGlzIG51bGwiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0lMTEVHQUxCUkVBSzoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJpbGxlZ2FsIGJyZWFrIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiaWxsZWdhbCBicmVhayI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfSUxMRUdBTENPTlRJTlVFOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMImlsbGVnYWwgY29udGludWUiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJpbGxlZ2FsIGNvbnRpbnVlIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19FWFBFQ1RFRF9PUEVSQVRPUjoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJleHBlY3RlZCBvcGVyYXRvciAnJXMnIGluc3RlYWQgb2YgJyVzJyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImV4cGVjdGVkIG9wZXJhdG9yICclcycgaW5zdGVhZCBvZiAnJXMnIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19ESVZJREVfWkVSTzoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJkaXZpZGUgYnkgemVybyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImRpdmlkZSBieSB6ZXJvIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19DQU5OT1RfQ09WRVJUX09CSkVDVDoNCi0gICAgICAgIHdzU3RyaW5nID0gTCIlcy4lcyBjYW4gbm90IGNvdmVydCB0byBvYmplY3QiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCIlcy4lcyBjYW4gbm90IGNvdmVydCB0byBvYmplY3QiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX05PVF9GT1VORF9DT05UQUlORVI6DQotICAgICAgICB3c1N0cmluZyA9IEwiY2FuIG5vdCBmb3VuZCBjb250YWluZXIgJyVzJyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImNhbiBub3QgZm91bmQgY29udGFpbmVyICclcyciOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX05PVF9GT1VORF9QUk9QRVJUWToNCi0gICAgICAgIHdzU3RyaW5nID0gTCJjYW4gbm90IGZvdW5kIHByb3BlcnR5ICclcyciOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJjYW4gbm90IGZvdW5kIHByb3BlcnR5ICclcyciOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX05PVF9GT1VORF9NRVRIT0Q6DQotICAgICAgICB3c1N0cmluZyA9IEwiY2FuIG5vdCBmb3VuZCBtZXRob2QgJyVzJyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImNhbiBub3QgZm91bmQgbWV0aG9kICclcyciOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX05PVF9GT1VORF9DT05TVDoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJjYW4gbm90IGZvdW5kIGNvbnN0ICclcyciOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJjYW4gbm90IGZvdW5kIGNvbnN0ICclcyciOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX05PVF9BU1NJR05fT0JKRUNUOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMImNhbiBub3QgZGlyZWN0IGFzc2lnbiB2YWx1ZSB0byBvYmplY3QiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJjYW4gbm90IGRpcmVjdCBhc3NpZ24gdmFsdWUgdG8gb2JqZWN0IjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19JVkFMSURBVEVfSU5TVFJVQ1RJT046DQotICAgICAgICB3c1N0cmluZyA9IEwiaW52YWxpZGF0ZSBpbnN0cnVjdGlvbiI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImludmFsaWRhdGUgaW5zdHJ1Y3Rpb24iOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0VYUEVDVF9OVU1CRVI6DQotICAgICAgICB3c1N0cmluZyA9IEwiZXhwZWN0ZWQgbnVtYmVyIGluc3RlYWQgb2YgJyVzJyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImV4cGVjdGVkIG51bWJlciBpbnN0ZWFkIG9mICclcyciOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX1ZBTElEQVRFX09VVF9BUlJBWToNCi0gICAgICAgIHdzU3RyaW5nID0gTCJ2YWxpZGF0ZSBhY2Nlc3MgaW5kZXggJyVzJyBvdXQgb2YgYXJyYXkiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJ2YWxpZGF0ZSBhY2Nlc3MgaW5kZXggJyVzJyBvdXQgb2YgYXJyYXkiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0NBTk5PVF9BU1NJR05fSURFTlQ6DQotICAgICAgICB3c1N0cmluZyA9IEwiY2FuIG5vdCBhc3NpZ24gdG8gJXMiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJjYW4gbm90IGFzc2lnbiB0byAlcyI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfTk9UX0ZPVU5UX0ZVTkNUSU9OOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMImNhbiBub3QgZm91bmQgJyVzJyBmdW5jdGlvbiI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMImNhbiBub3QgZm91bmQgJyVzJyBmdW5jdGlvbiI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfTk9UX0FSUkFZOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIiclcycgZG9lc24ndCBhbiBhcnJheSI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIiclcycgZG9lc24ndCBhbiBhcnJheSI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfT1VUX0FSUkFZOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIm91dCBvZiByYW5nZSBvZiAnJXMnIGFycmF5IjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwib3V0IG9mIHJhbmdlIG9mICclcycgYXJyYXkiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX05PVF9TVVBQT1JUX0NBTEM6DQotICAgICAgICB3c1N0cmluZyA9IEwiJyVzJyBvcGVyYXRvciBjYW4gbm90IHN1cHBvcnQgYXJyYXkgY2FsY3VsYXRlIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiJyVzJyBvcGVyYXRvciBjYW4gbm90IHN1cHBvcnQgYXJyYXkgY2FsY3VsYXRlIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19BUkdVTUVOVF9OT1RfQVJSQVk6DQotICAgICAgICB3c1N0cmluZyA9IEwiJyVzJyBmdW5jdGlvbidzICVkIGFyZ3VtZW50IGNhbiBub3QgYmUgYXJyYXkiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCInJXMnIGZ1bmN0aW9uJ3MgJWQgYXJndW1lbnQgY2FuIG5vdCBiZSBhcnJheSI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfQVJHVU1FTlRfRVhQRUNUX0NPTlRBSU5FUjoNCi0gICAgICAgIHdzU3RyaW5nID0gTCInJXMnIGFyZ3VtZW50IGV4cGVjdGVkIGEgY29udGFpbmVyIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiJyVzJyBhcmd1bWVudCBleHBlY3RlZCBhIGNvbnRhaW5lciI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfQUNDRVNTX1BST1BFUlRZX0lOX05PVF9PQkpFQ1Q6DQotICAgICAgICB3c1N0cmluZyA9IEwiYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byByZWZlcmVuY2UgcHJvcGVydHkgJyVzJyBvZiBhIG5vbi1vYmplY3QgaW4gU09NIGV4cHJlc3Npb24gJXMiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0NCisgICAgICAgICAgTCJhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHJlZmVyZW5jZSBwcm9wZXJ0eSAnJXMnIG9mIGEgbm9uLW9iamVjdCBpbiAiDQorICAgICAgICAgIEwiU09NIGV4cHJlc3Npb24gJXMiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0ZVTkNUSU9OX0lTX0JVSUxESU46DQotICAgICAgICB3c1N0cmluZyA9IEwiZnVuY3Rpb24gJyVzJyBpcyBidWlsZGluIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiZnVuY3Rpb24gJyVzJyBpcyBidWlsZGluIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19FUlJPUl9NU0c6DQotICAgICAgICB3c1N0cmluZyA9IEwiJXMgOiAlcyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIiVzIDogJXMiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0lOREVYX09VVF9PRl9CT1VORFM6DQotICAgICAgICB3c1N0cmluZyA9IEwiSW5kZXggdmFsdWUgaXMgb3V0IG9mIGJvdW5kcyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIkluZGV4IHZhbHVlIGlzIG91dCBvZiBib3VuZHMiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9EOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIkluY29ycmVjdCBudW1iZXIgb2YgcGFyYW1ldGVycyBjYWxsaW5nIG1ldGhvZCAnJXMnIjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiSW5jb3JyZWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIGNhbGxpbmcgbWV0aG9kICclcyciOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0FSR1VNRU5UX01JU01BVENIOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIkFyZ3VtZW50IG1pc21hdGNoIGluIHByb3BlcnR5IG9yIGZ1bmN0aW9uIGFyZ3VtZW50IjsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEwiQXJndW1lbnQgbWlzbWF0Y2ggaW4gcHJvcGVydHkgb3IgZnVuY3Rpb24gYXJndW1lbnQiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX0lOVkFMSURfRU5VTUVSQVRFOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIkludmFsaWQgZW51bWVyYXRlZCB2YWx1ZTogJXMiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJJbnZhbGlkIGVudW1lcmF0ZWQgdmFsdWU6ICVzIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19JTlZBTElEX0FQUEVORDoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJJbnZhbGlkIGFwcGVuZCBvcGVyYXRpb246ICVzIGNhbm5vdCBoYXZlIGEgY2hpbGQgZWxlbWVudCBvZiAlcyI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPQ0KKyAgICAgICAgICBMIkludmFsaWQgYXBwZW5kIG9wZXJhdGlvbjogJXMgY2Fubm90IGhhdmUgYSBjaGlsZCBlbGVtZW50IG9mICVzIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19TT01fRVhQRUNURURfTElTVDoNCi0gICAgICAgIHdzU3RyaW5nID0gTCJTT00gZXhwcmVzc2lvbiByZXR1cm5lZCBsaXN0IHdoZW4gc2luZ2xlIHJlc3VsdCB3YXMgZXhwZWN0ZWQiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0NCisgICAgICAgICAgTCJTT00gZXhwcmVzc2lvbiByZXR1cm5lZCBsaXN0IHdoZW4gc2luZ2xlIHJlc3VsdCB3YXMgZXhwZWN0ZWQiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX05PVF9IQVZFX1BST1BFUlRZOg0KLSAgICAgICAgd3NTdHJpbmcgPSBMIiclcycgZG9lc24ndCBoYXZlIHByb3BlcnR5ICclcyciOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCInJXMnIGRvZXNuJ3QgaGF2ZSBwcm9wZXJ0eSAnJXMnIjsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19JTlZBTElEX05PREVfVFlQRToNCi0gICAgICAgIHdzU3RyaW5nID0gTCJJbnZhbGlkIG5vZGUgdHlwZSA6ICclcyciOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gTCJJbnZhbGlkIG5vZGUgdHlwZSA6ICclcyciOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX1ZJT0xBVEVfQk9VTkRBUlk6DQotICAgICAgICB3c1N0cmluZyA9IEwiVGhlIGVsZW1lbnQgWyVzXSBoYXMgdmlvbGF0ZWQgaXRzIGFsbG93YWJsZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0NCisgICAgICAgICAgTCJUaGUgZWxlbWVudCBbJXNdIGhhcyB2aW9sYXRlZCBpdHMgYWxsb3dhYmxlIG51bWJlciBvZiBvY2N1cnJlbmNlcyI7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfU0VSVkVSX0RFTlk6DQotICAgICAgICB3c1N0cmluZyA9IEwiU2VydmVyIGRvZXMgbm90IHBlcm1pdCI7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBMIlNlcnZlciBkb2VzIG5vdCBwZXJtaXQiOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX1ZhbGlkYXRlTGltaXQ6DQotICAgICAgICB3c1N0cmluZyA9IEZYX1dTVFJDKEwiTWVzc2FnZSBsaW1pdCBleGNlZWRlZC4gUmVtYWluaW5nICVkIHZhbGlkYXRpb24gZXJyb3JzIG5vdCByZXBvcnRlZC4iKTsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEZYX1dTVFJDKA0KKyAgICAgICAgICBMIk1lc3NhZ2UgbGltaXQgZXhjZWVkZWQuIFJlbWFpbmluZyAlZCB2YWxpZGF0aW9uIGVycm9ycyBub3QgIg0KKyAgICAgICAgICBMInJlcG9ydGVkLiIpOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX1ZhbGlkYXRlTnVsbFdhcm5pbmc6DQotICAgICAgICB3c1N0cmluZyA9IEZYX1dTVFJDKEwiJXMgY2Fubm90IGJlIGxlZnQgYmxhbmsuIFRvIGlnbm9yZSB2YWxpZGF0aW9ucyBmb3IgJXMsIGNsaWNrIElnbm9yZS4iKTsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB3c1N0cmluZyA9IEZYX1dTVFJDKA0KKyAgICAgICAgICBMIiVzIGNhbm5vdCBiZSBsZWZ0IGJsYW5rLiBUbyBpZ25vcmUgdmFsaWRhdGlvbnMgZm9yICVzLCBjbGljayAiDQorICAgICAgICAgIEwiSWdub3JlLiIpOw0KKyAgICAgIHJldHVybjsNCiAgICAgY2FzZSBYRkFfSURTX1ZhbGlkYXRlTnVsbEVycm9yOg0KLSAgICAgICAgd3NTdHJpbmcgPSBGWF9XU1RSQyhMIiVzIGNhbm5vdCBiZSBsZWZ0IGJsYW5rLiIpOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHdzU3RyaW5nID0gRlhfV1NUUkMoTCIlcyBjYW5ub3QgYmUgbGVmdCBibGFuay4iKTsNCisgICAgICByZXR1cm47DQogICAgIGNhc2UgWEZBX0lEU19WYWxpZGF0ZVdhcm5pbmc6DQotICAgICAgICB3c1N0cmluZyA9IEZYX1dTVFJDKEwiVGhlIHZhbHVlIHlvdSBlbnRlcmVkIGZvciAlcyBpcyBpbnZhbGlkLiBUbyBpZ25vcmUgdmFsaWRhdGlvbnMgZm9yICVzLCBjbGljayBJZ25vcmUuIik7DQotICAgICAgICByZXR1cm47DQorICAgICAgd3NTdHJpbmcgPSBGWF9XU1RSQygNCisgICAgICAgICAgTCJUaGUgdmFsdWUgeW91IGVudGVyZWQgZm9yICVzIGlzIGludmFsaWQuIFRvIGlnbm9yZSB2YWxpZGF0aW9ucyBmb3IgIg0KKyAgICAgICAgICBMIiVzLCBjbGljayBJZ25vcmUuIik7DQorICAgICAgcmV0dXJuOw0KICAgICBjYXNlIFhGQV9JRFNfVmFsaWRhdGVFcnJvcjoNCi0gICAgICAgIHdzU3RyaW5nID0gRlhfV1NUUkMoTCJUaGUgdmFsdWUgeW91IGVudGVyZWQgZm9yICVzIGlzIGludmFsaWQuIik7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0NCisgICAgICB3c1N0cmluZyA9IEZYX1dTVFJDKEwiVGhlIHZhbHVlIHlvdSBlbnRlcmVkIGZvciAlcyBpcyBpbnZhbGlkLiIpOw0KKyAgICAgIHJldHVybjsNCisgIH0NCiB9DQogDQotRlhfQk9PTCBDUERGWEZBX0FwcDo6U2hvd0ZpbGVEaWFsb2coY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsdGVyLCBDRlhfV2lkZVN0cmluZ0FycmF5ICZ3c1BhdGhBcnIsIEZYX0JPT0wgYk9wZW4pDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDUERGWEZBX0FwcDo6U2hvd0ZpbGVEaWFsb2coY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWx0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgd3NQYXRoQXJyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk9wZW4pIHsNCisgIHJldHVybiBGQUxTRTsNCiB9DQogDQotSUZXTF9BZGFwdGVyVGltZXJNZ3IqIENQREZYRkFfQXBwOjpHZXRUaW1lck1ncigpDQotew0KLSAgICBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1nciogcEFkYXB0ZXIgPSBOVUxMOw0KLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCi0gICAgaWYgKHBFbnYpDQotICAgICAgICBwQWRhcHRlciA9IEZYX05FVyBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncihwRW52KTsNCi0gICAgcmV0dXJuIHBBZGFwdGVyOw0KK0lGV0xfQWRhcHRlclRpbWVyTWdyKiBDUERGWEZBX0FwcDo6R2V0VGltZXJNZ3IoKSB7DQorICBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1nciogcEFkYXB0ZXIgPSBOVUxMOw0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQorICBpZiAocEVudikNCisgICAgcEFkYXB0ZXIgPSBGWF9ORVcgQ1hGQV9GV0xBZGFwdGVyVGltZXJNZ3IocEVudik7DQorICByZXR1cm4gcEFkYXB0ZXI7DQogfQ0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX2RvYy5jcHAKaW5kZXggODFmMWVkYy4uMzBiZTU3ZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX2RvYy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX2RvYy5jcHAKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCi0gDQorDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vcHVibGljL2ZwZGZfZm9ybWZpbGwuaCINCkBAIC0xMywxNyArMTMsMTkgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgiDQogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIg0KIA0KLSNkZWZpbmUgSURTX1hGQV9WYWxpZGF0ZV9JbnB1dCAgIkF0IGxlYXN0IG9uZSByZXF1aXJlZCBmaWVsZCB3YXMgZW1wdHkuIFBsZWFzZSBmaWxsIGluIHRoZSByZXF1aXJlZCBmaWVsZHNcclxuKGhpZ2hsaWdodGVkKSBiZWZvcmUgY29udGludWluZy4iDQorI2RlZmluZSBJRFNfWEZBX1ZhbGlkYXRlX0lucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgIkF0IGxlYXN0IG9uZSByZXF1aXJlZCBmaWVsZCB3YXMgZW1wdHkuIFBsZWFzZSBmaWxsIGluIHRoZSByZXF1aXJlZCAiIFwNCisgICJmaWVsZHNcclxuKGhpZ2hsaWdodGVkKSBiZWZvcmUgY29udGludWluZy4iDQogDQogLy8gc3VibWl0DQotI2RlZmluZSBGWEZBX0NPTkZJRwkJCQkweDAwMDAwMDAxDQotI2RlZmluZSBGWEZBX1RFTVBMQVRFCQkJMHgwMDAwMDAxMA0KLSNkZWZpbmUgRlhGQV9MT0NBTEVTRVQJCQkweDAwMDAwMTAwDQotI2RlZmluZSBGWEZBX0RBVEFTRVRTCQkJMHgwMDAwMTAwMA0KLSNkZWZpbmUgRlhGQV9YTVBNRVRBCQkJMHgwMDAxMDAwMA0KLSNkZWZpbmUgRlhGQV9YRkRGCQkJCTB4MDAxMDAwMDANCi0jZGVmaW5lIEZYRkFfRk9STQkJCQkweDAxMDAwMDAwDQotI2RlZmluZSBGWEZBX1BERgkJCQkweDEwMDAwMDAwDQorI2RlZmluZSBGWEZBX0NPTkZJRyAweDAwMDAwMDAxDQorI2RlZmluZSBGWEZBX1RFTVBMQVRFIDB4MDAwMDAwMTANCisjZGVmaW5lIEZYRkFfTE9DQUxFU0VUIDB4MDAwMDAxMDANCisjZGVmaW5lIEZYRkFfREFUQVNFVFMgMHgwMDAwMTAwMA0KKyNkZWZpbmUgRlhGQV9YTVBNRVRBIDB4MDAwMTAwMDANCisjZGVmaW5lIEZYRkFfWEZERiAweDAwMTAwMDAwDQorI2RlZmluZSBGWEZBX0ZPUk0gMHgwMTAwMDAwMA0KKyNkZWZpbmUgRlhGQV9QREYgMHgxMDAwMDAwMA0KIA0KICNpZm5kZWYgX1dJTjMyDQogZXh0ZXJuIHZvaWQgU2V0TGFzdEVycm9yKGludCBlcnIpOw0KQEAgLTMxLDE0MDkgKzMzLDEzMTkgQEAKIGV4dGVybiBpbnQgR2V0TGFzdEVycm9yKCk7DQogI2VuZGlmDQogDQotQ1BERlhGQV9Eb2N1bWVudDo6Q1BERlhGQV9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwUERGRG9jLCBDUERGWEZBX0FwcCogcFByb3ZpZGVyKSA6DQotCW1fcFBERkRvYyhwUERGRG9jKSwNCi0JbV9wQXBwKHBQcm92aWRlciksDQotCW1fcFhGQURvYyhOVUxMKSwNCi0JbV9wWEZBRG9jVmlldyhOVUxMKSwNCi0JbV9pRG9jVHlwZShET0NUWVBFX1BERiksDQotCW1fcEpTQ29udGV4dChOVUxMKSwNCi0JbV9wU0RLRG9jKE5VTEwpDQotew0KLQltX1hGQVBhZ2VMaXN0LlJlbW92ZUFsbCgpOw0KK0NQREZYRkFfRG9jdW1lbnQ6OkNQREZYRkFfRG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcFBERkRvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZYRkFfQXBwKiBwUHJvdmlkZXIpDQorICAgIDogbV9wUERGRG9jKHBQREZEb2MpLA0KKyAgICAgIG1fcEFwcChwUHJvdmlkZXIpLA0KKyAgICAgIG1fcFhGQURvYyhOVUxMKSwNCisgICAgICBtX3BYRkFEb2NWaWV3KE5VTEwpLA0KKyAgICAgIG1faURvY1R5cGUoRE9DVFlQRV9QREYpLA0KKyAgICAgIG1fcEpTQ29udGV4dChOVUxMKSwNCisgICAgICBtX3BTREtEb2MoTlVMTCkgew0KKyAgbV9YRkFQYWdlTGlzdC5SZW1vdmVBbGwoKTsNCiB9DQogDQotQ1BERlhGQV9Eb2N1bWVudDo6fkNQREZYRkFfRG9jdW1lbnQoKQ0KLXsNCi0JaWYgKG1fcFBERkRvYykNCi0Jew0KLQkJQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKW1fcFBERkRvYy0+R2V0UGFyc2VyKCk7DQotCQlpZiAocFBhcnNlciA9PSBOVUxMKSANCi0JCXsNCi0JCSAJZGVsZXRlIG1fcFBERkRvYzsNCi0JIAl9ZWxzZSANCi0JCXsNCi0JIAkJZGVsZXRlIHBQYXJzZXI7DQotCQl9DQotCQltX3BQREZEb2MgPSBOVUxMOw0KLQl9DQotCWlmIChtX3BYRkFEb2MpDQotCXsNCi0JCUlYRkFfQXBwKiBwQXBwID0gbV9wQXBwLT5HZXRYRkFBcHAoKTsNCi0JCWlmIChwQXBwKSANCi0JCXsNCi0JCQlJWEZBX0RvY0hhbmRsZXIqIHBEb2NIYW5kbGVyID0gcEFwcC0+R2V0RG9jSGFuZGxlcigpOw0KLQkJCWlmIChwRG9jSGFuZGxlcikNCi0JCQl7DQotCQkJCUNsb3NlWEZBRG9jKHBEb2NIYW5kbGVyKTsNCi0JCQl9CQ0KLQkJfQ0KLQl9DQorQ1BERlhGQV9Eb2N1bWVudDo6fkNQREZYRkFfRG9jdW1lbnQoKSB7DQorICBpZiAobV9wUERGRG9jKSB7DQorICAgIENQREZfUGFyc2VyKiBwUGFyc2VyID0gKENQREZfUGFyc2VyKiltX3BQREZEb2MtPkdldFBhcnNlcigpOw0KKyAgICBpZiAocFBhcnNlciA9PSBOVUxMKSB7DQorICAgICAgZGVsZXRlIG1fcFBERkRvYzsNCisgICAgfSBlbHNlIHsNCisgICAgICBkZWxldGUgcFBhcnNlcjsNCisgICAgfQ0KKyAgICBtX3BQREZEb2MgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFhGQURvYykgew0KKyAgICBJWEZBX0FwcCogcEFwcCA9IG1fcEFwcC0+R2V0WEZBQXBwKCk7DQorICAgIGlmIChwQXBwKSB7DQorICAgICAgSVhGQV9Eb2NIYW5kbGVyKiBwRG9jSGFuZGxlciA9IHBBcHAtPkdldERvY0hhbmRsZXIoKTsNCisgICAgICBpZiAocERvY0hhbmRsZXIpIHsNCisgICAgICAgIENsb3NlWEZBRG9jKHBEb2NIYW5kbGVyKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCiANCi0JaWYgKG1fcEpTQ29udGV4dCkNCi0Jew0KLQkJaWYgKG1fcFNES0RvYyAmJiBtX3BTREtEb2MtPkdldEVudigpKQ0KLQkJew0KLQkJCW1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpLT5SZWxlYXNlQ29udGV4dChtX3BKU0NvbnRleHQpOw0KLQkJCW1fcEpTQ29udGV4dCA9IE5VTEw7DQotCQl9DQotCX0NCisgIGlmIChtX3BKU0NvbnRleHQpIHsNCisgICAgaWYgKG1fcFNES0RvYyAmJiBtX3BTREtEb2MtPkdldEVudigpKSB7DQorICAgICAgbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCktPlJlbGVhc2VDb250ZXh0KG1fcEpTQ29udGV4dCk7DQorICAgICAgbV9wSlNDb250ZXh0ID0gTlVMTDsNCisgICAgfQ0KKyAgfQ0KIA0KLQkNCi0JaWYgKG1fcFNES0RvYykNCi0JCWRlbGV0ZSBtX3BTREtEb2M7DQotCW1fcFNES0RvYyA9IE5VTEw7DQorICBpZiAobV9wU0RLRG9jKQ0KKyAgICBkZWxldGUgbV9wU0RLRG9jOw0KKyAgbV9wU0RLRG9jID0gTlVMTDsNCiB9DQogDQotRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpMb2FkWEZBRG9jKCkNCi17DQotCWlmICghbV9wUERGRG9jKSANCi0JCXJldHVybiBGQUxTRTsNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6OkxvYWRYRkFEb2MoKSB7DQorICBpZiAoIW1fcFBERkRvYykNCisgICAgcmV0dXJuIEZBTFNFOw0KIA0KLQltX1hGQVBhZ2VMaXN0LlJlbW92ZUFsbCgpOw0KKyAgbV9YRkFQYWdlTGlzdC5SZW1vdmVBbGwoKTsNCiANCi0JSVhGQV9BcHAqIHBBcHAgPSBtX3BBcHAtPkdldFhGQUFwcCgpOw0KLQlpZiAoIXBBcHApDQotCQlyZXR1cm4gRkFMU0U7DQorICBJWEZBX0FwcCogcEFwcCA9IG1fcEFwcC0+R2V0WEZBQXBwKCk7DQorICBpZiAoIXBBcHApDQorICAgIHJldHVybiBGQUxTRTsNCiANCi0JbV9wWEZBRG9jID0gcEFwcC0+Q3JlYXRlRG9jKHRoaXMsIG1fcFBERkRvYyk7DQotCWlmICghbV9wWEZBRG9jKQ0KLQl7DQotCQlTZXRMYXN0RXJyb3IoRlBERl9FUlJfWEZBTE9BRCk7DQotCQlyZXR1cm4gRkFMU0U7DQotCX0NCisgIG1fcFhGQURvYyA9IHBBcHAtPkNyZWF0ZURvYyh0aGlzLCBtX3BQREZEb2MpOw0KKyAgaWYgKCFtX3BYRkFEb2MpIHsNCisgICAgU2V0TGFzdEVycm9yKEZQREZfRVJSX1hGQUxPQUQpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQogDQotCUlYRkFfRG9jSGFuZGxlciogcERvY0hhbmRsZXIgPSBwQXBwLT5HZXREb2NIYW5kbGVyKCk7DQotCWlmICghcERvY0hhbmRsZXIpDQotCXsNCi0JCVNldExhc3RFcnJvcihGUERGX0VSUl9YRkFMT0FEKTsNCi0JCXJldHVybiBGQUxTRTsNCi0JfQ0KKyAgSVhGQV9Eb2NIYW5kbGVyKiBwRG9jSGFuZGxlciA9IHBBcHAtPkdldERvY0hhbmRsZXIoKTsNCisgIGlmICghcERvY0hhbmRsZXIpIHsNCisgICAgU2V0TGFzdEVycm9yKEZQREZfRVJSX1hGQUxPQUQpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQogDQotCXBEb2NIYW5kbGVyLT5TdGFydExvYWQobV9wWEZBRG9jKTsNCi0JaW50IGlTdGF0dXMgPSBwRG9jSGFuZGxlci0+RG9Mb2FkKG1fcFhGQURvYywgTlVMTCk7DQotCWlmIChpU3RhdHVzICE9IFhGQV9QQVJTRVNUQVRVU19Eb25lKSANCi0Jew0KLQkJQ2xvc2VYRkFEb2MocERvY0hhbmRsZXIpOw0KLQkJU2V0TGFzdEVycm9yKEZQREZfRVJSX1hGQUxPQUQpOw0KLQkJcmV0dXJuIEZBTFNFOw0KLQl9DQotCXBEb2NIYW5kbGVyLT5TdG9wTG9hZChtX3BYRkFEb2MpOw0KLQlwRG9jSGFuZGxlci0+U2V0SlNFUnVudGltZShtX3BYRkFEb2MsIG1fcEFwcC0+R2V0SlNFUnVudGltZSgpKTsNCisgIHBEb2NIYW5kbGVyLT5TdGFydExvYWQobV9wWEZBRG9jKTsNCisgIGludCBpU3RhdHVzID0gcERvY0hhbmRsZXItPkRvTG9hZChtX3BYRkFEb2MsIE5VTEwpOw0KKyAgaWYgKGlTdGF0dXMgIT0gWEZBX1BBUlNFU1RBVFVTX0RvbmUpIHsNCisgICAgQ2xvc2VYRkFEb2MocERvY0hhbmRsZXIpOw0KKyAgICBTZXRMYXN0RXJyb3IoRlBERl9FUlJfWEZBTE9BRCk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHBEb2NIYW5kbGVyLT5TdG9wTG9hZChtX3BYRkFEb2MpOw0KKyAgcERvY0hhbmRsZXItPlNldEpTRVJ1bnRpbWUobV9wWEZBRG9jLCBtX3BBcHAtPkdldEpTRVJ1bnRpbWUoKSk7DQogDQotCWlmIChwRG9jSGFuZGxlci0+R2V0RG9jVHlwZShtX3BYRkFEb2MpID09IFhGQV9ET0NUWVBFX0R5bmFtaWMpDQotCQltX2lEb2NUeXBlID0gRE9DVFlQRV9EWU5JTUlDX1hGQTsNCi0JZWxzZQ0KLQkJbV9pRG9jVHlwZSA9IERPQ1RZUEVfU1RBVElDX1hGQTsNCisgIGlmIChwRG9jSGFuZGxlci0+R2V0RG9jVHlwZShtX3BYRkFEb2MpID09IFhGQV9ET0NUWVBFX0R5bmFtaWMpDQorICAgIG1faURvY1R5cGUgPSBET0NUWVBFX0RZTklNSUNfWEZBOw0KKyAgZWxzZQ0KKyAgICBtX2lEb2NUeXBlID0gRE9DVFlQRV9TVEFUSUNfWEZBOw0KIA0KLQltX3BYRkFEb2NWaWV3ID0gcERvY0hhbmRsZXItPkNyZWF0ZURvY1ZpZXcobV9wWEZBRG9jLCBYRkFfRE9DVklFV19WaWV3KTsNCi0JaWYgKG1fcFhGQURvY1ZpZXctPlN0YXJ0TGF5b3V0KCkgPCAwKQ0KLQl7DQotCQlDbG9zZVhGQURvYyhwRG9jSGFuZGxlcik7DQotCQlTZXRMYXN0RXJyb3IoRlBERl9FUlJfWEZBTEFZT1VUKTsNCi0JCXJldHVybiBGQUxTRTsNCi0JfQ0KKyAgbV9wWEZBRG9jVmlldyA9IHBEb2NIYW5kbGVyLT5DcmVhdGVEb2NWaWV3KG1fcFhGQURvYywgWEZBX0RPQ1ZJRVdfVmlldyk7DQorICBpZiAobV9wWEZBRG9jVmlldy0+U3RhcnRMYXlvdXQoKSA8IDApIHsNCisgICAgQ2xvc2VYRkFEb2MocERvY0hhbmRsZXIpOw0KKyAgICBTZXRMYXN0RXJyb3IoRlBERl9FUlJfWEZBTEFZT1VUKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KIA0KLQltX3BYRkFEb2NWaWV3LT5Eb0xheW91dChOVUxMKTsNCi0JbV9wWEZBRG9jVmlldy0+U3RvcExheW91dCgpOw0KLQlyZXR1cm4gVFJVRTsNCisgIG1fcFhGQURvY1ZpZXctPkRvTGF5b3V0KE5VTEwpOw0KKyAgbV9wWEZBRG9jVmlldy0+U3RvcExheW91dCgpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KIA0KLWludCBDUERGWEZBX0RvY3VtZW50OjpHZXRQYWdlQ291bnQoKQ0KLXsNCi0JaWYgKCFtX3BQREZEb2MgJiYgIW1fcFhGQURvYykNCi0JCXJldHVybiAwOw0KK2ludCBDUERGWEZBX0RvY3VtZW50OjpHZXRQYWdlQ291bnQoKSB7DQorICBpZiAoIW1fcFBERkRvYyAmJiAhbV9wWEZBRG9jKQ0KKyAgICByZXR1cm4gMDsNCiANCi0Jc3dpdGNoIChtX2lEb2NUeXBlKQ0KLQl7DQotCWNhc2UgRE9DVFlQRV9QREY6DQotCWNhc2UgRE9DVFlQRV9TVEFUSUNfWEZBOg0KLQkJaWYgKG1fcFBERkRvYykNCi0JCQlyZXR1cm4gbV9wUERGRG9jLT5HZXRQYWdlQ291bnQoKTsNCi0JY2FzZSBET0NUWVBFX0RZTklNSUNfWEZBOg0KLQkJaWYgKG1fcFhGQURvYykNCi0JCQlyZXR1cm4gbV9wWEZBRG9jVmlldy0+Q291bnRQYWdlVmlld3MoKTsNCi0JZGVmYXVsdDoNCi0JCXJldHVybiAwOw0KLQl9DQorICBzd2l0Y2ggKG1faURvY1R5cGUpIHsNCisgICAgY2FzZSBET0NUWVBFX1BERjoNCisgICAgY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6DQorICAgICAgaWYgKG1fcFBERkRvYykNCisgICAgICAgIHJldHVybiBtX3BQREZEb2MtPkdldFBhZ2VDb3VudCgpOw0KKyAgICBjYXNlIERPQ1RZUEVfRFlOSU1JQ19YRkE6DQorICAgICAgaWYgKG1fcFhGQURvYykNCisgICAgICAgIHJldHVybiBtX3BYRkFEb2NWaWV3LT5Db3VudFBhZ2VWaWV3cygpOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiAwOw0KKyAgfQ0KIA0KLQlyZXR1cm4gMDsNCisgIHJldHVybiAwOw0KIH0NCiANCi1DUERGWEZBX1BhZ2UqIENQREZYRkFfRG9jdW1lbnQ6OkdldFBhZ2UoaW50IHBhZ2VfaW5kZXgpDQotew0KLQlpZiAoIW1fcFBERkRvYyAmJiAhbV9wWEZBRG9jKQ0KLQkJcmV0dXJuIE5VTEw7DQorQ1BERlhGQV9QYWdlKiBDUERGWEZBX0RvY3VtZW50OjpHZXRQYWdlKGludCBwYWdlX2luZGV4KSB7DQorICBpZiAoIW1fcFBERkRvYyAmJiAhbV9wWEZBRG9jKQ0KKyAgICByZXR1cm4gTlVMTDsNCiANCi0JQ1BERlhGQV9QYWdlKiBwUGFnZSA9IE5VTEw7DQotCWlmIChtX1hGQVBhZ2VMaXN0LkdldFNpemUoKSkNCi0Jew0KLQkJcFBhZ2UgPSBtX1hGQVBhZ2VMaXN0LkdldEF0KHBhZ2VfaW5kZXgpOw0KLQkJaWYgKHBQYWdlKQ0KLQkJCXBQYWdlLT5BZGRSZWYoKTsNCi0JfQ0KLQllbHNlIA0KLQl7DQotCQltX1hGQVBhZ2VMaXN0LlNldFNpemUoR2V0UGFnZUNvdW50KCkpOw0KLQl9DQorICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gTlVMTDsNCisgIGlmIChtX1hGQVBhZ2VMaXN0LkdldFNpemUoKSkgew0KKyAgICBwUGFnZSA9IG1fWEZBUGFnZUxpc3QuR2V0QXQocGFnZV9pbmRleCk7DQorICAgIGlmIChwUGFnZSkNCisgICAgICBwUGFnZS0+QWRkUmVmKCk7DQorICB9IGVsc2Ugew0KKyAgICBtX1hGQVBhZ2VMaXN0LlNldFNpemUoR2V0UGFnZUNvdW50KCkpOw0KKyAgfQ0KIA0KLQlpZiAoIXBQYWdlKSANCi0Jew0KLQkJcFBhZ2UgPSBGWF9ORVcgQ1BERlhGQV9QYWdlKHRoaXMsIHBhZ2VfaW5kZXgpOw0KLQkJRlhfQk9PTCBiUmV0ID0gcFBhZ2UtPkxvYWRQYWdlKCk7DQotCQlpZiAoIWJSZXQpIHsNCi0JCQlkZWxldGUgcFBhZ2U7DQotCQkJcmV0dXJuIE5VTEw7DQotCQl9DQorICBpZiAoIXBQYWdlKSB7DQorICAgIHBQYWdlID0gRlhfTkVXIENQREZYRkFfUGFnZSh0aGlzLCBwYWdlX2luZGV4KTsNCisgICAgRlhfQk9PTCBiUmV0ID0gcFBhZ2UtPkxvYWRQYWdlKCk7DQorICAgIGlmICghYlJldCkgew0KKyAgICAgIGRlbGV0ZSBwUGFnZTsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KIA0KLQkJbV9YRkFQYWdlTGlzdC5TZXRBdChwYWdlX2luZGV4LCBwUGFnZSk7DQotCX0NCisgICAgbV9YRkFQYWdlTGlzdC5TZXRBdChwYWdlX2luZGV4LCBwUGFnZSk7DQorICB9DQogDQotCXJldHVybiBwUGFnZTsNCisgIHJldHVybiBwUGFnZTsNCiB9DQogDQotQ1BERlhGQV9QYWdlKiBDUERGWEZBX0RvY3VtZW50OjpHZXRQYWdlKElYRkFfUGFnZVZpZXcqIHBQYWdlKQ0KLXsNCi0JaWYgKCFwUGFnZSkNCi0JCXJldHVybiBOVUxMOw0KK0NQREZYRkFfUGFnZSogQ1BERlhGQV9Eb2N1bWVudDo6R2V0UGFnZShJWEZBX1BhZ2VWaWV3KiBwUGFnZSkgew0KKyAgaWYgKCFwUGFnZSkNCisgICAgcmV0dXJuIE5VTEw7DQogDQotCWlmICghbV9wWEZBRG9jKQ0KLQkJcmV0dXJuIE5VTEw7DQorICBpZiAoIW1fcFhGQURvYykNCisgICAgcmV0dXJuIE5VTEw7DQogDQotCWlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpDQotCQlyZXR1cm4gTlVMTDsNCisgIGlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpDQorICAgIHJldHVybiBOVUxMOw0KIA0KLQlpbnQgblNpemUgPSBtX1hGQVBhZ2VMaXN0LkdldFNpemUoKTsNCi0JZm9yIChpbnQgaT0wOyBpPG5TaXplOyBpKyspDQotCXsNCi0JCUNQREZYRkFfUGFnZSogcFRlbXBQYWdlID0gbV9YRkFQYWdlTGlzdC5HZXRBdChpKTsNCi0JCWlmICghcFRlbXBQYWdlKSBjb250aW51ZTsNCi0JCWlmIChwVGVtcFBhZ2UtPkdldFhGQVBhZ2VWaWV3KCkgJiYgcFRlbXBQYWdlLT5HZXRYRkFQYWdlVmlldygpID09IHBQYWdlKQ0KLQkJCXJldHVybiBwVGVtcFBhZ2U7DQotCX0NCisgIGludCBuU2l6ZSA9IG1fWEZBUGFnZUxpc3QuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2l6ZTsgaSsrKSB7DQorICAgIENQREZYRkFfUGFnZSogcFRlbXBQYWdlID0gbV9YRkFQYWdlTGlzdC5HZXRBdChpKTsNCisgICAgaWYgKCFwVGVtcFBhZ2UpDQorICAgICAgY29udGludWU7DQorICAgIGlmIChwVGVtcFBhZ2UtPkdldFhGQVBhZ2VWaWV3KCkgJiYgcFRlbXBQYWdlLT5HZXRYRkFQYWdlVmlldygpID09IHBQYWdlKQ0KKyAgICAgIHJldHVybiBwVGVtcFBhZ2U7DQorICB9DQogDQotCXJldHVybiBOVUxMOw0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KIA0KLXZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6UmVtb3ZlUGFnZShDUERGWEZBX1BhZ2UqIHBhZ2UpDQotew0KLQltX1hGQVBhZ2VMaXN0LlNldEF0KHBhZ2UtPkdldFBhZ2VJbmRleCgpLCBOVUxMKTsNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OlJlbW92ZVBhZ2UoQ1BERlhGQV9QYWdlKiBwYWdlKSB7DQorICBtX1hGQVBhZ2VMaXN0LlNldEF0KHBhZ2UtPkdldFBhZ2VJbmRleCgpLCBOVUxMKTsNCiB9DQogDQotQ1BERlNES19Eb2N1bWVudCogQ1BERlhGQV9Eb2N1bWVudDo6R2V0U0RLRG9jdW1lbnQoQ1BERkRvY19FbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KQ0KLXsNCi0JaWYgKCFwRm9ybUZpbGxFbnYpDQotCQlyZXR1cm4gbV9wU0RLRG9jOw0KK0NQREZTREtfRG9jdW1lbnQqIENQREZYRkFfRG9jdW1lbnQ6OkdldFNES0RvY3VtZW50KA0KKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsNCisgIGlmICghcEZvcm1GaWxsRW52KQ0KKyAgICByZXR1cm4gbV9wU0RLRG9jOw0KIA0KLQlpZiAobV9wU0RLRG9jKQ0KLQkJcmV0dXJuIG1fcFNES0RvYzsNCisgIGlmIChtX3BTREtEb2MpDQorICAgIHJldHVybiBtX3BTREtEb2M7DQogDQotCW1fcFNES0RvYyA9IG5ldyBDUERGU0RLX0RvY3VtZW50KHRoaXMsIHBGb3JtRmlsbEVudik7DQotCWlmICghbV9wU0RLRG9jKQ0KLQkJcmV0dXJuIE5VTEw7DQorICBtX3BTREtEb2MgPSBuZXcgQ1BERlNES19Eb2N1bWVudCh0aGlzLCBwRm9ybUZpbGxFbnYpOw0KKyAgaWYgKCFtX3BTREtEb2MpDQorICAgIHJldHVybiBOVUxMOw0KIA0KLQlyZXR1cm4gbV9wU0RLRG9jOw0KKyAgcmV0dXJuIG1fcFNES0RvYzsNCiB9DQogDQotdm9pZCBDUERGWEZBX0RvY3VtZW50OjpSZWxlYXNlU0RLRG9jKCkNCi17DQotCWlmIChtX3BTREtEb2MpDQotCQlkZWxldGUgbV9wU0RLRG9jOw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6UmVsZWFzZVNES0RvYygpIHsNCisgIGlmIChtX3BTREtEb2MpDQorICAgIGRlbGV0ZSBtX3BTREtEb2M7DQogDQotCW1fcFNES0RvYyA9IE5VTEw7DQorICBtX3BTREtEb2MgPSBOVUxMOw0KIH0NCiANCi12b2lkIENQREZYRkFfRG9jdW1lbnQ6OkZYUmVjdDJQREZSZWN0KGNvbnN0IENGWF9SZWN0RiYgZnhSZWN0RiwgQ1BERl9SZWN0JiBwZGZSZWN0KQ0KLXsNCi0JcGRmUmVjdC5sZWZ0ID0gZnhSZWN0Ri5sZWZ0Ow0KLQlwZGZSZWN0LnRvcCA9IGZ4UmVjdEYuYm90dG9tKCk7DQotCXBkZlJlY3QucmlnaHQgPSBmeFJlY3RGLnJpZ2h0KCk7DQotCXBkZlJlY3QuYm90dG9tID0gZnhSZWN0Ri50b3A7DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpGWFJlY3QyUERGUmVjdChjb25zdCBDRlhfUmVjdEYmIGZ4UmVjdEYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3QmIHBkZlJlY3QpIHsNCisgIHBkZlJlY3QubGVmdCA9IGZ4UmVjdEYubGVmdDsNCisgIHBkZlJlY3QudG9wID0gZnhSZWN0Ri5ib3R0b20oKTsNCisgIHBkZlJlY3QucmlnaHQgPSBmeFJlY3RGLnJpZ2h0KCk7DQorICBwZGZSZWN0LmJvdHRvbSA9IGZ4UmVjdEYudG9wOw0KIH0NCiANCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6U2V0Q2hhbmdlTWFyayhJWEZBX0RvYyogaERvYykNCi17DQotCWlmIChoRG9jID09IG1fcFhGQURvYyAmJiBtX3BTREtEb2MpDQotCXsNCi0JCW1fcFNES0RvYy0+U2V0Q2hhbmdlTWFyaygpOw0KLQl9DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpTZXRDaGFuZ2VNYXJrKElYRkFfRG9jKiBoRG9jKSB7DQorICBpZiAoaERvYyA9PSBtX3BYRkFEb2MgJiYgbV9wU0RLRG9jKSB7DQorICAgIG1fcFNES0RvYy0+U2V0Q2hhbmdlTWFyaygpOw0KKyAgfQ0KIH0NCiANCi1GWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6OkdldENoYW5nZU1hcmsoSVhGQV9Eb2MqIGhEb2MpDQotew0KLQlpZiAoaERvYyA9PSBtX3BYRkFEb2MgJiYgbV9wU0RLRG9jKQ0KLQkJcmV0dXJuIG1fcFNES0RvYy0+R2V0Q2hhbmdlTWFyaygpOw0KLQlyZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpHZXRDaGFuZ2VNYXJrKElYRkFfRG9jKiBoRG9jKSB7DQorICBpZiAoaERvYyA9PSBtX3BYRkFEb2MgJiYgbV9wU0RLRG9jKQ0KKyAgICByZXR1cm4gbV9wU0RLRG9jLT5HZXRDaGFuZ2VNYXJrKCk7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KIA0KLXZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6SW52YWxpZGF0ZVJlY3QoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDRlhfUmVjdEYmIHJ0LCBGWF9EV09SRCBkd0ZsYWdzIC8qID0gMCAqLykNCi17DQotCWlmICghbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MpDQotCQlyZXR1cm47DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpJbnZhbGlkYXRlUmVjdChJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyAvKiA9IDAgKi8pIHsNCisgIGlmICghbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MpDQorICAgIHJldHVybjsNCiANCi0JaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSkNCi0JCXJldHVybjsNCisgIGlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpDQorICAgIHJldHVybjsNCiANCi0JQ1BERl9SZWN0IHJjUGFnZTsNCi0JRlhSZWN0MlBERlJlY3QocnQsIHJjUGFnZSk7DQorICBDUERGX1JlY3QgcmNQYWdlOw0KKyAgRlhSZWN0MlBERlJlY3QocnQsIHJjUGFnZSk7DQogDQotCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBHZXRQYWdlKHBQYWdlVmlldyk7DQorICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gR2V0UGFnZShwUGFnZVZpZXcpOw0KIA0KLQlpZiAocFBhZ2UgPT0gTlVMTCkNCi0JCXJldHVybjsNCisgIGlmIChwUGFnZSA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQogDQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KLQlpZiAoIXBFbnYpDQotCQlyZXR1cm47DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmICghcEVudikNCisgICAgcmV0dXJuOw0KIA0KLQlwRW52LT5GRklfSW52YWxpZGF0ZSgoRlBERl9QQUdFKXBQYWdlLCByY1BhZ2UubGVmdCwgcmNQYWdlLmJvdHRvbSwgcmNQYWdlLnJpZ2h0LCByY1BhZ2UudG9wKTsNCisgIHBFbnYtPkZGSV9JbnZhbGlkYXRlKChGUERGX1BBR0UpcFBhZ2UsIHJjUGFnZS5sZWZ0LCByY1BhZ2UuYm90dG9tLA0KKyAgICAgICAgICAgICAgICAgICAgICAgcmNQYWdlLnJpZ2h0LCByY1BhZ2UudG9wKTsNCiB9DQogDQotdm9pZCBDUERGWEZBX0RvY3VtZW50OjpJbnZhbGlkYXRlUmVjdChJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncyAvKiA9IDAgKi8pDQotew0KLQlpZiAoIWhXaWRnZXQpDQotCQlyZXR1cm47DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpJbnZhbGlkYXRlUmVjdChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgLyogPSAwICovKSB7DQorICBpZiAoIWhXaWRnZXQpDQorICAgIHJldHVybjsNCiANCi0JaWYgKCFtX3BYRkFEb2MgfHwgIW1fcFNES0RvYyB8fCAhbV9wWEZBRG9jVmlldykNCi0JCXJldHVybjsNCi0JDQotCWlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpDQotCQlyZXR1cm47DQorICBpZiAoIW1fcFhGQURvYyB8fCAhbV9wU0RLRG9jIHx8ICFtX3BYRkFEb2NWaWV3KQ0KKyAgICByZXR1cm47DQogDQotCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7DQotCWlmICghcFdpZGdldEhhbmRsZXIpDQotCQlyZXR1cm47DQorICBpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBKQ0KKyAgICByZXR1cm47DQogDQotCUlYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBXaWRnZXRIYW5kbGVyLT5HZXRQYWdlVmlldyhoV2lkZ2V0KTsNCi0JaWYgKCFwUGFnZVZpZXcpDQotCQlyZXR1cm47DQorICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gbV9wWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOw0KKyAgaWYgKCFwV2lkZ2V0SGFuZGxlcikNCisgICAgcmV0dXJuOw0KIA0KLQlDRlhfUmVjdEYgcmVjdDsNCi0JcFdpZGdldEhhbmRsZXItPkdldFJlY3QoaFdpZGdldCwgcmVjdCk7DQotCUludmFsaWRhdGVSZWN0KHBQYWdlVmlldywgcmVjdCwgZHdGbGFncyk7DQorICBJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwV2lkZ2V0SGFuZGxlci0+R2V0UGFnZVZpZXcoaFdpZGdldCk7DQorICBpZiAoIXBQYWdlVmlldykNCisgICAgcmV0dXJuOw0KKw0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICBwV2lkZ2V0SGFuZGxlci0+R2V0UmVjdChoV2lkZ2V0LCByZWN0KTsNCisgIEludmFsaWRhdGVSZWN0KHBQYWdlVmlldywgcmVjdCwgZHdGbGFncyk7DQogfQ0KIA0KLXZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6RGlzcGxheUNhcmV0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDRlhfUmVjdEYqIHBSdEFuY2hvcikNCi17DQotCWlmICghaFdpZGdldCB8fCBwUnRBbmNob3IgPT0gTlVMTCkgDQotCQlyZXR1cm47DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpEaXNwbGF5Q2FyZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmlzaWJsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdEFuY2hvcikgew0KKyAgaWYgKCFoV2lkZ2V0IHx8IHBSdEFuY2hvciA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQogDQotCWlmICghbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MgfHwgIW1fcFhGQURvY1ZpZXcpDQotCQlyZXR1cm47DQorICBpZiAoIW1fcFhGQURvYyB8fCAhbV9wU0RLRG9jIHx8ICFtX3BYRkFEb2NWaWV3KQ0KKyAgICByZXR1cm47DQogDQotCWlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpDQotCQlyZXR1cm47DQorICBpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBKQ0KKyAgICByZXR1cm47DQogDQotCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7DQotCWlmICghcFdpZGdldEhhbmRsZXIpDQotCQlyZXR1cm47DQorICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gbV9wWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOw0KKyAgaWYgKCFwV2lkZ2V0SGFuZGxlcikNCisgICAgcmV0dXJuOw0KIA0KLQlJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwV2lkZ2V0SGFuZGxlci0+R2V0UGFnZVZpZXcoaFdpZGdldCk7DQotCWlmICghcFBhZ2VWaWV3KQ0KLQkJcmV0dXJuOw0KKyAgSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFdpZGdldEhhbmRsZXItPkdldFBhZ2VWaWV3KGhXaWRnZXQpOw0KKyAgaWYgKCFwUGFnZVZpZXcpDQorICAgIHJldHVybjsNCiANCi0JQ1BERlhGQV9QYWdlKiBwUGFnZSA9IEdldFBhZ2UocFBhZ2VWaWV3KTsNCisgIENQREZYRkFfUGFnZSogcFBhZ2UgPSBHZXRQYWdlKHBQYWdlVmlldyk7DQogDQotCWlmIChwUGFnZSA9PSBOVUxMKQ0KLQkJcmV0dXJuOw0KKyAgaWYgKHBQYWdlID09IE5VTEwpDQorICAgIHJldHVybjsNCiANCi0JQ1BERl9SZWN0IHJjQ2FyZXQ7DQotCUZYUmVjdDJQREZSZWN0KCpwUnRBbmNob3IsIHJjQ2FyZXQpOw0KKyAgQ1BERl9SZWN0IHJjQ2FyZXQ7DQorICBGWFJlY3QyUERGUmVjdCgqcFJ0QW5jaG9yLCByY0NhcmV0KTsNCiANCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQotCWlmICghcEVudikNCi0JCXJldHVybjsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKyAgaWYgKCFwRW52KQ0KKyAgICByZXR1cm47DQogDQotCXBFbnYtPkZGSV9EaXNwbGF5Q2FyZXQoKEZQREZfUEFHRSlwUGFnZSwgYlZpc2libGUsIHJjQ2FyZXQubGVmdCwgcmNDYXJldC50b3AsIHJjQ2FyZXQucmlnaHQsIHJjQ2FyZXQuYm90dG9tKTsNCi0NCisgIHBFbnYtPkZGSV9EaXNwbGF5Q2FyZXQoKEZQREZfUEFHRSlwUGFnZSwgYlZpc2libGUsIHJjQ2FyZXQubGVmdCwgcmNDYXJldC50b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2FyZXQucmlnaHQsIHJjQ2FyZXQuYm90dG9tKTsNCiB9DQogDQotRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpHZXRQb3B1cFBvcyhJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRkxPQVQgZk1pblBvcHVwLCBGWF9GTE9BVCBmTWF4UG9wdXAsIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCkNCi17DQotCWlmIChOVUxMID09IGhXaWRnZXQpDQotCXsNCi0JCXJldHVybiBGQUxTRTsNCi0JfQ0KLQlJWEZBX1BhZ2VWaWV3KiBwWEZBUGFnZVZpZXcgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCktPkdldFBhZ2VWaWV3KGhXaWRnZXQpOw0KLQlpZiAoTlVMTCA9PSBwWEZBUGFnZVZpZXcpDQotCXsNCi0JCXJldHVybiBGQUxTRTsNCi0JfQ0KLQlDUERGWEZBX1BhZ2UqIHBQYWdlID0gR2V0UGFnZShwWEZBUGFnZVZpZXcpOw0KLQlpZiAocFBhZ2UgPT0gTlVMTCkNCi0JCXJldHVybiBGQUxTRTsNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6OkdldFBvcHVwUG9zKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pblBvcHVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heFBvcHVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCkgew0KKyAgaWYgKE5VTEwgPT0gaFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJWEZBX1BhZ2VWaWV3KiBwWEZBUGFnZVZpZXcgPQ0KKyAgICAgIG1fcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKS0+R2V0UGFnZVZpZXcoaFdpZGdldCk7DQorICBpZiAoTlVMTCA9PSBwWEZBUGFnZVZpZXcpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IEdldFBhZ2UocFhGQVBhZ2VWaWV3KTsNCisgIGlmIChwUGFnZSA9PSBOVUxMKQ0KKyAgICByZXR1cm4gRkFMU0U7DQogDQotCUNYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gbV9wWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpLT5HZXREYXRhQWNjKGhXaWRnZXQpOw0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPQ0KKyAgICAgIG1fcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKS0+R2V0RGF0YUFjYyhoV2lkZ2V0KTsNCiANCi0JaW50IG5Sb3RhdGUgPSBwV2lkZ2V0QWNjLT5HZXRSb3RhdGUoKTsNCi0JDQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KLQlpZiAocEVudiA9PSBOVUxMKQ0KLQkJcmV0dXJuIEZBTFNFOw0KLQlGU19SRUNURiBwYWdlVmlld1JlY3Q7DQotCXBFbnYtPkZGSV9HZXRQYWdlVmlld1JlY3QocFBhZ2UsIHBhZ2VWaWV3UmVjdCk7DQorICBpbnQgblJvdGF0ZSA9IHBXaWRnZXRBY2MtPkdldFJvdGF0ZSgpOw0KIA0KLQlDUERGX1JlY3QgcmNBbmNob3I7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybiBGQUxTRTsNCisgIEZTX1JFQ1RGIHBhZ2VWaWV3UmVjdDsNCisgIHBFbnYtPkZGSV9HZXRQYWdlVmlld1JlY3QocFBhZ2UsIHBhZ2VWaWV3UmVjdCk7DQogDQotCXJjQW5jaG9yLmxlZnQgPSBydEFuY2hvci5sZWZ0Ow0KLQlyY0FuY2hvci50b3AgPSBydEFuY2hvci5ib3R0b20oKTsNCi0JcmNBbmNob3IucmlnaHQgPSBydEFuY2hvci5yaWdodCgpOw0KLQlyY0FuY2hvci5ib3R0b20gPSBydEFuY2hvci50b3A7DQotCQ0KLQlpbnQgdDEsdDIsdDsNCi0JRlhfRFdPUkQgZHdQb3M7IEZYX0ZMT0FUIGZQb3VwSGVpZ2h0Ow0KLQlzd2l0Y2goblJvdGF0ZSkNCi0Jew0KLQkJDQotCWNhc2UgOTA6DQotCQl7DQotCQkJdDEgPSAoaW50KShwYWdlVmlld1JlY3QucmlnaHQgLSByY0FuY2hvci5yaWdodCk7DQotIAkJCXQyID0gKGludCkocmNBbmNob3IubGVmdCAgLSBwYWdlVmlld1JlY3QubGVmdCk7DQotCQkJaWYgKHJjQW5jaG9yLmJvdHRvbSA8IHBhZ2VWaWV3UmVjdC5ib3R0b20pIA0KLQkJCXsNCi0JCQkJcnRQb3B1cC5sZWZ0ICs9IHJjQW5jaG9yLmJvdHRvbSAtIHBhZ2VWaWV3UmVjdC5ib3R0b207DQotCQkJfQ0KLQkJIA0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJDQotCWNhc2UgMTgwOg0KLQkJew0KLQkJCXQyID0gKGludCkocGFnZVZpZXdSZWN0LnRvcCAtIHJjQW5jaG9yLnRvcCk7DQotCQkJdDEgPSAoaW50KShyY0FuY2hvci5ib3R0b20gLSBwYWdlVmlld1JlY3QuYm90dG9tKTsgDQotCQkJaWYgKHJjQW5jaG9yLmxlZnQgPCBwYWdlVmlld1JlY3QubGVmdCkgDQotCQkJew0KLQkJCQlydFBvcHVwLmxlZnQgKz0gcmNBbmNob3IubGVmdCAtIHBhZ2VWaWV3UmVjdC5sZWZ0OyANCi0JCQl9DQotCQkJYnJlYWs7DQotCQl9DQotCWNhc2UgMjcwOg0KLQkJew0KLQkJCXQxID0gKGludCkocmNBbmNob3IubGVmdCAgLSBwYWdlVmlld1JlY3QubGVmdCk7DQotCQkJdDIgPSAoaW50KShwYWdlVmlld1JlY3QucmlnaHQgLSByY0FuY2hvci5yaWdodCk7DQotIAkJDQotCQkJaWYgKHJjQW5jaG9yLnRvcCA+IHBhZ2VWaWV3UmVjdC50b3ApIA0KLQkJCXsNCi0JCQkJcnRQb3B1cC5sZWZ0IC09IHJjQW5jaG9yLnRvcCAtIHBhZ2VWaWV3UmVjdC50b3A7IA0KLQkJCX0NCi0JCQlicmVhazsNCi0JCX0NCi0JY2FzZSAwOg0KLQlkZWZhdWx0Og0KLQkJew0KLQkJCXQxID0gKGludCkocGFnZVZpZXdSZWN0LnRvcCAtIHJjQW5jaG9yLnRvcCk7DQotCQkJdDIgPSAoaW50KShyY0FuY2hvci5ib3R0b20gLSBwYWdlVmlld1JlY3QuYm90dG9tKTsgDQotCQkJaWYgKHJjQW5jaG9yLnJpZ2h0ID4gcGFnZVZpZXdSZWN0LnJpZ2h0KSANCi0JCQl7DQotCQkJCXJ0UG9wdXAubGVmdCAtPSByY0FuY2hvci5yaWdodCAtIHBhZ2VWaWV3UmVjdC5yaWdodDsgDQotCQkJfQ0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJDQotCX0NCisgIENQREZfUmVjdCByY0FuY2hvcjsNCiANCi0JaWYgKHQxIDw9IDAgJiYgdDIgPD0gMCkNCi0Jew0KLQkJcmV0dXJuIEZBTFNFOw0KLQl9DQotCWlmICh0MSA8PSAwKQ0KLQl7DQotCQl0ID0gdDI7DQotCQlkd1BvcyA9IDE7DQotCX0NCi0JZWxzZSBpZih0MiA8PSAwKQ0KLQl7DQotCQl0ID0gdDE7DQotCQlkd1BvcyA9IDA7DQotCX0NCi0JZWxzZSBpZiAodDEgPiB0MiApDQotCXsNCi0JCXQgPSB0MTsNCi0JCWR3UG9zID0gMDsNCi0JfQ0KLQllbHNlIA0KLQl7DQotCQl0ID0gdDI7DQotCQlkd1BvcyA9IDE7DQotCX0NCi0JaWYgKHQ8Zk1pblBvcHVwKQ0KLQl7DQotCQlmUG91cEhlaWdodCA9IGZNaW5Qb3B1cDsNCi0JfQ0KLQllbHNlIGlmICh0ID4gZk1heFBvcHVwKQ0KLQl7DQotCQlmUG91cEhlaWdodCA9IGZNYXhQb3B1cDsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWZQb3VwSGVpZ2h0ID0gKEZYX0ZMT0FUKXQ7DQotCX0NCisgIHJjQW5jaG9yLmxlZnQgPSBydEFuY2hvci5sZWZ0Ow0KKyAgcmNBbmNob3IudG9wID0gcnRBbmNob3IuYm90dG9tKCk7DQorICByY0FuY2hvci5yaWdodCA9IHJ0QW5jaG9yLnJpZ2h0KCk7DQorICByY0FuY2hvci5ib3R0b20gPSBydEFuY2hvci50b3A7DQogDQotCXN3aXRjaChuUm90YXRlKQ0KLQl7DQotCQkNCi0JY2FzZSAwOg0KLQljYXNlIDE4MDoNCi0JCXsNCi0JCQlpZiAoZHdQb3MgPT0gMCkNCi0JCQl7DQotCQkJCXJ0UG9wdXAudG9wID0gcnRBbmNob3IuaGVpZ2h0Ow0KLQkJCQlydFBvcHVwLmhlaWdodCA9IGZQb3VwSGVpZ2h0Ow0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQlydFBvcHVwLnRvcCA9IC0gZlBvdXBIZWlnaHQ7DQotCQkJCXJ0UG9wdXAuaGVpZ2h0ID0gZlBvdXBIZWlnaHQ7DQotCQkJfQ0KLQkJCWJyZWFrOw0KLQkJfQ0KLQljYXNlICA5MDoNCi0JY2FzZSAgMjcwOg0KLQkJew0KLQkJCWlmIChkd1BvcyA9PSAwKQ0KLQkJCXsNCi0JCQkJcnRQb3B1cC50b3AgPSBydEFuY2hvci53aWR0aDsNCi0JCQkJcnRQb3B1cC5oZWlnaHQgPSBmUG91cEhlaWdodDsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJcnRQb3B1cC50b3AgPSAtIGZQb3VwSGVpZ2h0Ow0KLQkJCQlydFBvcHVwLmhlaWdodCA9IGZQb3VwSGVpZ2h0Ow0KLQkJCX0NCi0JCQlicmVhazsNCi0JCX0NCi0JZGVmYXVsdDoNCi0JCQlicmVhazsNCi0JfQ0KLQkNCi0JcmV0dXJuIFRSVUU7DQorICBpbnQgdDEsIHQyLCB0Ow0KKyAgRlhfRFdPUkQgZHdQb3M7DQorICBGWF9GTE9BVCBmUG91cEhlaWdodDsNCisgIHN3aXRjaCAoblJvdGF0ZSkgew0KKyAgICBjYXNlIDkwOiB7DQorICAgICAgdDEgPSAoaW50KShwYWdlVmlld1JlY3QucmlnaHQgLSByY0FuY2hvci5yaWdodCk7DQorICAgICAgdDIgPSAoaW50KShyY0FuY2hvci5sZWZ0IC0gcGFnZVZpZXdSZWN0LmxlZnQpOw0KKyAgICAgIGlmIChyY0FuY2hvci5ib3R0b20gPCBwYWdlVmlld1JlY3QuYm90dG9tKSB7DQorICAgICAgICBydFBvcHVwLmxlZnQgKz0gcmNBbmNob3IuYm90dG9tIC0gcGFnZVZpZXdSZWN0LmJvdHRvbTsNCisgICAgICB9DQorDQorICAgICAgYnJlYWs7DQorICAgIH0NCisNCisgICAgY2FzZSAxODA6IHsNCisgICAgICB0MiA9IChpbnQpKHBhZ2VWaWV3UmVjdC50b3AgLSByY0FuY2hvci50b3ApOw0KKyAgICAgIHQxID0gKGludCkocmNBbmNob3IuYm90dG9tIC0gcGFnZVZpZXdSZWN0LmJvdHRvbSk7DQorICAgICAgaWYgKHJjQW5jaG9yLmxlZnQgPCBwYWdlVmlld1JlY3QubGVmdCkgew0KKyAgICAgICAgcnRQb3B1cC5sZWZ0ICs9IHJjQW5jaG9yLmxlZnQgLSBwYWdlVmlld1JlY3QubGVmdDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSAyNzA6IHsNCisgICAgICB0MSA9IChpbnQpKHJjQW5jaG9yLmxlZnQgLSBwYWdlVmlld1JlY3QubGVmdCk7DQorICAgICAgdDIgPSAoaW50KShwYWdlVmlld1JlY3QucmlnaHQgLSByY0FuY2hvci5yaWdodCk7DQorDQorICAgICAgaWYgKHJjQW5jaG9yLnRvcCA+IHBhZ2VWaWV3UmVjdC50b3ApIHsNCisgICAgICAgIHJ0UG9wdXAubGVmdCAtPSByY0FuY2hvci50b3AgLSBwYWdlVmlld1JlY3QudG9wOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIDA6DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICB0MSA9IChpbnQpKHBhZ2VWaWV3UmVjdC50b3AgLSByY0FuY2hvci50b3ApOw0KKyAgICAgIHQyID0gKGludCkocmNBbmNob3IuYm90dG9tIC0gcGFnZVZpZXdSZWN0LmJvdHRvbSk7DQorICAgICAgaWYgKHJjQW5jaG9yLnJpZ2h0ID4gcGFnZVZpZXdSZWN0LnJpZ2h0KSB7DQorICAgICAgICBydFBvcHVwLmxlZnQgLT0gcmNBbmNob3IucmlnaHQgLSBwYWdlVmlld1JlY3QucmlnaHQ7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorDQorICBpZiAodDEgPD0gMCAmJiB0MiA8PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICh0MSA8PSAwKSB7DQorICAgIHQgPSB0MjsNCisgICAgZHdQb3MgPSAxOw0KKyAgfSBlbHNlIGlmICh0MiA8PSAwKSB7DQorICAgIHQgPSB0MTsNCisgICAgZHdQb3MgPSAwOw0KKyAgfSBlbHNlIGlmICh0MSA+IHQyKSB7DQorICAgIHQgPSB0MTsNCisgICAgZHdQb3MgPSAwOw0KKyAgfSBlbHNlIHsNCisgICAgdCA9IHQyOw0KKyAgICBkd1BvcyA9IDE7DQorICB9DQorICBpZiAodCA8IGZNaW5Qb3B1cCkgew0KKyAgICBmUG91cEhlaWdodCA9IGZNaW5Qb3B1cDsNCisgIH0gZWxzZSBpZiAodCA+IGZNYXhQb3B1cCkgew0KKyAgICBmUG91cEhlaWdodCA9IGZNYXhQb3B1cDsNCisgIH0gZWxzZSB7DQorICAgIGZQb3VwSGVpZ2h0ID0gKEZYX0ZMT0FUKXQ7DQorICB9DQorDQorICBzd2l0Y2ggKG5Sb3RhdGUpIHsNCisgICAgY2FzZSAwOg0KKyAgICBjYXNlIDE4MDogew0KKyAgICAgIGlmIChkd1BvcyA9PSAwKSB7DQorICAgICAgICBydFBvcHVwLnRvcCA9IHJ0QW5jaG9yLmhlaWdodDsNCisgICAgICAgIHJ0UG9wdXAuaGVpZ2h0ID0gZlBvdXBIZWlnaHQ7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0UG9wdXAudG9wID0gLWZQb3VwSGVpZ2h0Ow0KKyAgICAgICAgcnRQb3B1cC5oZWlnaHQgPSBmUG91cEhlaWdodDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSA5MDoNCisgICAgY2FzZSAyNzA6IHsNCisgICAgICBpZiAoZHdQb3MgPT0gMCkgew0KKyAgICAgICAgcnRQb3B1cC50b3AgPSBydEFuY2hvci53aWR0aDsNCisgICAgICAgIHJ0UG9wdXAuaGVpZ2h0ID0gZlBvdXBIZWlnaHQ7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0UG9wdXAudG9wID0gLWZQb3VwSGVpZ2h0Ow0KKyAgICAgICAgcnRQb3B1cC5oZWlnaHQgPSBmUG91cEhlaWdodDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisNCisgIHJldHVybiBUUlVFOw0KIH0NCiANCi1GWF9CT09MCUNQREZYRkFfRG9jdW1lbnQ6OlBvcHVwTWVudShJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1BvaW50RiBwdFBvcHVwLCBjb25zdCBDRlhfUmVjdEYqIHBSZWN0RXhjbHVkZSkNCi17DQotCWlmIChOVUxMID09IGhXaWRnZXQpDQotCXsNCi0JCXJldHVybiBGQUxTRTsNCi0JfQ0KLQlJWEZBX1BhZ2VWaWV3KiBwWEZBUGFnZVZpZXcgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCktPkdldFBhZ2VWaWV3KGhXaWRnZXQpOw0KLQlpZiAocFhGQVBhZ2VWaWV3ID09IE5VTEwpDQotCQlyZXR1cm4gRkFMU0U7DQotCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBHZXRQYWdlKHBYRkFQYWdlVmlldyk7DQorRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpQb3B1cE1lbnUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdFBvcHVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3RFeGNsdWRlKSB7DQorICBpZiAoTlVMTCA9PSBoV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElYRkFfUGFnZVZpZXcqIHBYRkFQYWdlVmlldyA9DQorICAgICAgbV9wWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpLT5HZXRQYWdlVmlldyhoV2lkZ2V0KTsNCisgIGlmIChwWEZBUGFnZVZpZXcgPT0gTlVMTCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IEdldFBhZ2UocFhGQVBhZ2VWaWV3KTsNCiANCi0JaWYgKHBQYWdlID09IE5VTEwpDQotCQlyZXR1cm4gRkFMU0U7DQorICBpZiAocFBhZ2UgPT0gTlVMTCkNCisgICAgcmV0dXJuIEZBTFNFOw0KIA0KLQlpbnQgbWVudUZsYWcgPSAwOw0KKyAgaW50IG1lbnVGbGFnID0gMDsNCiANCi0JSVhGQV9NZW51SGFuZGxlciogcFhGQU1lbnVIYW5kZXIgPSBtX3BBcHAtPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOw0KLQlpZiAocFhGQU1lbnVIYW5kZXItPkNhblVuZG8oaFdpZGdldCkpDQotCQltZW51RmxhZyB8PSBGWEZBX01FTVVfVU5ETzsNCi0JaWYgKHBYRkFNZW51SGFuZGVyLT5DYW5SZWRvKGhXaWRnZXQpKQ0KLQkJbWVudUZsYWcgfD0gRlhGQV9NRU1VX1JFRE87DQotCWlmIChwWEZBTWVudUhhbmRlci0+Q2FuUGFzdGUoaFdpZGdldCkpDQotCQltZW51RmxhZyB8PSBGWEZBX01FTVVfUEFTVEU7DQotCWlmIChwWEZBTWVudUhhbmRlci0+Q2FuQ29weShoV2lkZ2V0KSkNCi0JCW1lbnVGbGFnIHw9IEZYRkFfTUVNVV9DT1BZOw0KLQlpZiAocFhGQU1lbnVIYW5kZXItPkNhbkN1dChoV2lkZ2V0KSkNCi0JCW1lbnVGbGFnIHw9IEZYRkFfTUVNVV9DVVQ7DQotCWlmIChwWEZBTWVudUhhbmRlci0+Q2FuU2VsZWN0QWxsKGhXaWRnZXQpKQ0KLQkJbWVudUZsYWcgfD0gRlhGQV9NRU1VX1NFTEVDVEFMTDsNCisgIElYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0gbV9wQXBwLT5HZXRYRkFBcHAoKS0+R2V0TWVudUhhbmRsZXIoKTsNCisgIGlmIChwWEZBTWVudUhhbmRlci0+Q2FuVW5kbyhoV2lkZ2V0KSkNCisgICAgbWVudUZsYWcgfD0gRlhGQV9NRU1VX1VORE87DQorICBpZiAocFhGQU1lbnVIYW5kZXItPkNhblJlZG8oaFdpZGdldCkpDQorICAgIG1lbnVGbGFnIHw9IEZYRkFfTUVNVV9SRURPOw0KKyAgaWYgKHBYRkFNZW51SGFuZGVyLT5DYW5QYXN0ZShoV2lkZ2V0KSkNCisgICAgbWVudUZsYWcgfD0gRlhGQV9NRU1VX1BBU1RFOw0KKyAgaWYgKHBYRkFNZW51SGFuZGVyLT5DYW5Db3B5KGhXaWRnZXQpKQ0KKyAgICBtZW51RmxhZyB8PSBGWEZBX01FTVVfQ09QWTsNCisgIGlmIChwWEZBTWVudUhhbmRlci0+Q2FuQ3V0KGhXaWRnZXQpKQ0KKyAgICBtZW51RmxhZyB8PSBGWEZBX01FTVVfQ1VUOw0KKyAgaWYgKHBYRkFNZW51SGFuZGVyLT5DYW5TZWxlY3RBbGwoaFdpZGdldCkpDQorICAgIG1lbnVGbGFnIHw9IEZYRkFfTUVNVV9TRUxFQ1RBTEw7DQogDQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybiBGQUxTRTsNCiANCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQotCWlmIChwRW52ID09IE5VTEwpDQotCQlyZXR1cm4gRkFMU0U7DQotDQotCXJldHVybiBwRW52LT5GRklfUG9wdXBNZW51KHBQYWdlLCBoV2lkZ2V0LCBtZW51RmxhZywgcHRQb3B1cCwgTlVMTCk7DQorICByZXR1cm4gcEVudi0+RkZJX1BvcHVwTWVudShwUGFnZSwgaFdpZGdldCwgbWVudUZsYWcsIHB0UG9wdXAsIE5VTEwpOw0KIH0NCiANCi12b2lkIENQREZYRkFfRG9jdW1lbnQ6OlBhZ2VWaWV3RXZlbnQoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9EV09SRCBkd0ZsYWdzKQ0KLXsNCi0JaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSkNCi0JCXJldHVybjsNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OlBhZ2VWaWV3RXZlbnQoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICBpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBKQ0KKyAgICByZXR1cm47DQogDQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KLQlpZiAocEVudiA9PSBOVUxMKQ0KLQkJcmV0dXJuOw0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorICBpZiAocEVudiA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQogDQotCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBHZXRQYWdlKHBQYWdlVmlldyk7DQotCWlmIChwUGFnZSA9PSBOVUxMKQ0KLQkJcmV0dXJuOw0KKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IEdldFBhZ2UocFBhZ2VWaWV3KTsNCisgIGlmIChwUGFnZSA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQogDQotCWlmIChkd0ZsYWdzID09IEZYRkFfUEFHRVZJRVdFVkVOVF9QT1NUQURERUQpDQotCXsNCi0JCS8vcEVudi0+RkZJX1BhZ2VFdmVudChwUGFnZSwgRlhGQV9QQUdFVklFV0VWRU5UX1BPU1RBRERFRCk7DQotCX0NCi0JZWxzZSBpZiAoZHdGbGFncyA9PSBGWEZBX1BBR0VWSUVXRVZFTlRfUE9TVFJFTU9WRUQpDQotCXsNCi0JCS8vcEVudi0+RkZJX1BhZ2VFdmVudChwUGFnZSwgRlhGQV9QQUdFVklFV0VWRU5UX1BPU1RSRU1PVkVEKTsNCi0JCS8vUmVtb3ZlUGFnZShwUGFnZSk7DQotCQkvL2RlbGV0ZSBwUGFnZTsNCi0JfQ0KKyAgaWYgKGR3RmxhZ3MgPT0gRlhGQV9QQUdFVklFV0VWRU5UX1BPU1RBRERFRCkgew0KKyAgICAvLyBwRW52LT5GRklfUGFnZUV2ZW50KHBQYWdlLCBGWEZBX1BBR0VWSUVXRVZFTlRfUE9TVEFEREVEKTsNCisgIH0gZWxzZSBpZiAoZHdGbGFncyA9PSBGWEZBX1BBR0VWSUVXRVZFTlRfUE9TVFJFTU9WRUQpIHsNCisgICAgLy8gcEVudi0+RkZJX1BhZ2VFdmVudChwUGFnZSwgRlhGQV9QQUdFVklFV0VWRU5UX1BPU1RSRU1PVkVEKTsNCisgICAgLy8gUmVtb3ZlUGFnZShwUGFnZSk7DQorICAgIC8vIGRlbGV0ZSBwUGFnZTsNCisgIH0NCiB9DQogDQotdm9pZCBDUERGWEZBX0RvY3VtZW50OjpXaWRnZXRFdmVudChJWEZBX1dpZGdldCogaFdpZGdldCwgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXREYXRhLCBGWF9EV09SRCBkd0V2ZW50LCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBBZGRpdGlvbmFsKQ0KLXsNCi0JaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSB8fCBOVUxMID09IGhXaWRnZXQpDQotCQlyZXR1cm47DQotCQ0KLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCi0JaWYgKHBFbnYgPT0gTlVMTCkNCi0JCXJldHVybjsNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OldpZGdldEV2ZW50KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXREYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdFdmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBBZGRpdGlvbmFsKSB7DQorICBpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBIHx8IE5VTEwgPT0gaFdpZGdldCkNCisgICAgcmV0dXJuOw0KIA0KLQlpZiAoTlVMTCA9PSBoV2lkZ2V0KSByZXR1cm47DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybjsNCiANCi0JSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpLT5HZXRQYWdlVmlldyhoV2lkZ2V0KTsNCisgIGlmIChOVUxMID09IGhXaWRnZXQpDQorICAgIHJldHVybjsNCiANCi0JaWYgKHBQYWdlVmlldyA9PSBOVUxMKQ0KLQkJcmV0dXJuOw0KLQlDUERGWEZBX1BhZ2UqIHBYRkFQYWdlID0gR2V0UGFnZShwUGFnZVZpZXcpOw0KLQlpZiAocFhGQVBhZ2UgPT0gTlVMTCkNCi0JCXJldHVybjsNCisgIElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyA9DQorICAgICAgbV9wWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpLT5HZXRQYWdlVmlldyhoV2lkZ2V0KTsNCiANCi0JQ1BERlNES19QYWdlVmlldyogcFNka1BhZ2VWaWV3ID0gbV9wU0RLRG9jLT5HZXRQYWdlVmlldyhwWEZBUGFnZSk7DQorICBpZiAocFBhZ2VWaWV3ID09IE5VTEwpDQorICAgIHJldHVybjsNCisgIENQREZYRkFfUGFnZSogcFhGQVBhZ2UgPSBHZXRQYWdlKHBQYWdlVmlldyk7DQorICBpZiAocFhGQVBhZ2UgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KIA0KLQlDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOw0KKyAgQ1BERlNES19QYWdlVmlldyogcFNka1BhZ2VWaWV3ID0gbV9wU0RLRG9jLT5HZXRQYWdlVmlldyhwWEZBUGFnZSk7DQogDQorICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOw0KIA0KLQlpZiAoZHdFdmVudCA9PSBYRkFfV0lER0VURVZFTlRfUG9zdEFkZGVkKQ0KLQl7DQotLy8gCQkJQ1BERlNES19Bbm5vdCogcEFubm90ID0gcEFubm90SGFuZGxlck1nci0+TmV3QW5ub3QoaFdpZGdldCwgcFNka1BhZ2VWaWV3KTsNCi0vLyAJCQlwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbkxvYWQocEFubm90KTsNCisgIGlmIChkd0V2ZW50ID09IFhGQV9XSURHRVRFVkVOVF9Qb3N0QWRkZWQpIHsNCisgICAgLy8gCQkJQ1BERlNES19Bbm5vdCogcEFubm90ID0gcEFubm90SGFuZGxlck1nci0+TmV3QW5ub3QoaFdpZGdldCwNCisgICAgLy8gcFNka1BhZ2VWaWV3KTsNCisgICAgLy8gCQkJcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Mb2FkKHBBbm5vdCk7DQogDQotCQkJLy9wRW52LT5GRklfV2lkZ2V0RXZlbnQoaFdpZGdldCwgWEZBX1dJREdFVEVWRU5UX1Bvc3RBZGRlZCk7DQotLy8gCQlJWEZBX1BhZ2VWaWV3KiBwT2xkUGFnZVZpZXcgPSAoSVhGQV9QYWdlVmlldyopcEFkZGl0aW9uYWw7DQotLy8gCQlpZiAocE9sZFBhZ2VWaWV3KQ0KLS8vIAkJew0KLS8vIAkJCUNQREZYRkFfUGFnZSogcERlc3RQYWdlID0gbV9wU0RLRG9jLT5HZXRQYWdlVmlldygoSVhGQV9QYWdlVmlldyopcE9sZFBhZ2VWaWV3KTsNCi0vLyAJCQlBU1NFUlQocERlc3RQYWdlKTsNCi0vLyAJCQlDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBwRGVzdFBhZ2UtPkdldEFubm90QnlYRkFXaWRnZXQoaFdpZGdldCk7DQotLy8gCQkJaWYgKHBBbm5vdCkNCi0vLyAJCQl7DQotLy8gCQkJCWlmIChtX3BTREtEb2MtPkdldEZvY3VzQW5ub3QoKSA9PSBwQW5ub3QpDQotLy8gCQkJCXsNCi0vLyAJCQkJCW1fcFNES0RvYy0+U2V0Rm9jdXNBbm5vdChOVUxMKTsNCi0vLyAJCQkJfQ0KLS8vIAkJCQlwRGVzdFBhZ2UtPkRlbGV0ZUFubm90KHBBbm5vdCk7DQotLy8gCQkJfQ0KLS8vIAkJfQ0KLQkJcFNka1BhZ2VWaWV3LT5BZGRBbm5vdChoV2lkZ2V0KTsNCisgICAgLy8gcEVudi0+RkZJX1dpZGdldEV2ZW50KGhXaWRnZXQsIFhGQV9XSURHRVRFVkVOVF9Qb3N0QWRkZWQpOw0KKyAgICAvLyAJCUlYRkFfUGFnZVZpZXcqIHBPbGRQYWdlVmlldyA9IChJWEZBX1BhZ2VWaWV3KilwQWRkaXRpb25hbDsNCisgICAgLy8gCQlpZiAocE9sZFBhZ2VWaWV3KQ0KKyAgICAvLyAJCXsNCisgICAgLy8gCQkJQ1BERlhGQV9QYWdlKiBwRGVzdFBhZ2UgPQ0KKyAgICAvLyBtX3BTREtEb2MtPkdldFBhZ2VWaWV3KChJWEZBX1BhZ2VWaWV3KilwT2xkUGFnZVZpZXcpOw0KKyAgICAvLyAJCQlBU1NFUlQocERlc3RQYWdlKTsNCisgICAgLy8gCQkJQ1BERlNES19Bbm5vdCogcEFubm90ID0NCisgICAgLy8gcERlc3RQYWdlLT5HZXRBbm5vdEJ5WEZBV2lkZ2V0KGhXaWRnZXQpOw0KKyAgICAvLyAJCQlpZiAocEFubm90KQ0KKyAgICAvLyAJCQl7DQorICAgIC8vIAkJCQlpZiAobV9wU0RLRG9jLT5HZXRGb2N1c0Fubm90KCkgPT0gcEFubm90KQ0KKyAgICAvLyAJCQkJew0KKyAgICAvLyAJCQkJCW1fcFNES0RvYy0+U2V0Rm9jdXNBbm5vdChOVUxMKTsNCisgICAgLy8gCQkJCX0NCisgICAgLy8gCQkJCXBEZXN0UGFnZS0+RGVsZXRlQW5ub3QocEFubm90KTsNCisgICAgLy8gCQkJfQ0KKyAgICAvLyAJCX0NCisgICAgcFNka1BhZ2VWaWV3LT5BZGRBbm5vdChoV2lkZ2V0KTsNCiANCi0JfQ0KLQllbHNlIGlmIChkd0V2ZW50ID09IFhGQV9XSURHRVRFVkVOVF9QcmVSZW1vdmVkKQ0KLQl7CQ0KLQkJQ1BERlNES19Bbm5vdCogcEFubm90ID0gcFNka1BhZ2VWaWV3LT5HZXRBbm5vdEJ5WEZBV2lkZ2V0KGhXaWRnZXQpOw0KLQkJaWYgKHBBbm5vdCkgew0KLQkJCXBTZGtQYWdlVmlldy0+RGVsZXRlQW5ub3QocEFubm90KTsNCi0JCQkvL3BFbnYtPkZGSV9XaWRnZXRFdmVudChoV2lkZ2V0LCBYRkFfV0lER0VURVZFTlRfUHJlUmVtb3ZlZCk7DQotCQl9DQotCX0NCisgIH0gZWxzZSBpZiAoZHdFdmVudCA9PSBYRkFfV0lER0VURVZFTlRfUHJlUmVtb3ZlZCkgew0KKyAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBwU2RrUGFnZVZpZXctPkdldEFubm90QnlYRkFXaWRnZXQoaFdpZGdldCk7DQorICAgIGlmIChwQW5ub3QpIHsNCisgICAgICBwU2RrUGFnZVZpZXctPkRlbGV0ZUFubm90KHBBbm5vdCk7DQorICAgICAgLy8gcEVudi0+RkZJX1dpZGdldEV2ZW50KGhXaWRnZXQsIFhGQV9XSURHRVRFVkVOVF9QcmVSZW1vdmVkKTsNCisgICAgfQ0KKyAgfQ0KIH0NCiANCi1pbnQzMl90IENQREZYRkFfRG9jdW1lbnQ6OkNvdW50UGFnZXMoSVhGQV9Eb2MqIGhEb2MpDQotew0KLQlpZiAoaERvYyA9PSBtX3BYRkFEb2MgJiYgbV9wU0RLRG9jKQ0KLQl7DQotCQlyZXR1cm4gR2V0UGFnZUNvdW50KCk7DQotCX0NCi0JcmV0dXJuIDA7DQoraW50MzJfdCBDUERGWEZBX0RvY3VtZW50OjpDb3VudFBhZ2VzKElYRkFfRG9jKiBoRG9jKSB7DQorICBpZiAoaERvYyA9PSBtX3BYRkFEb2MgJiYgbV9wU0RLRG9jKSB7DQorICAgIHJldHVybiBHZXRQYWdlQ291bnQoKTsNCisgIH0NCisgIHJldHVybiAwOw0KIH0NCi1pbnQzMl90IENQREZYRkFfRG9jdW1lbnQ6OkdldEN1cnJlbnRQYWdlKElYRkFfRG9jKiBoRG9jKQ0KLXsNCi0JaWYgKGhEb2MgIT0gbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MpDQotCQlyZXR1cm4gLTE7DQotCWlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpDQotCQlyZXR1cm4gLTE7DQoraW50MzJfdCBDUERGWEZBX0RvY3VtZW50OjpHZXRDdXJyZW50UGFnZShJWEZBX0RvYyogaERvYykgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MpDQorICAgIHJldHVybiAtMTsNCisgIGlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpDQorICAgIHJldHVybiAtMTsNCiANCi0JDQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KLQlpZiAocEVudiA9PSBOVUxMKQ0KLQkJcmV0dXJuIC0xOw0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorICBpZiAocEVudiA9PSBOVUxMKQ0KKyAgICByZXR1cm4gLTE7DQogDQotCXJldHVybiBwRW52LT5GRklfR2V0Q3VycmVudFBhZ2VJbmRleCh0aGlzKTsNCisgIHJldHVybiBwRW52LT5GRklfR2V0Q3VycmVudFBhZ2VJbmRleCh0aGlzKTsNCiB9DQotdm9pZCBDUERGWEZBX0RvY3VtZW50OjpTZXRDdXJyZW50UGFnZShJWEZBX0RvYyogaERvYywgaW50MzJfdCBpQ3VyUGFnZSkNCi17DQotCWlmIChoRG9jICE9IG1fcFhGQURvYyB8fCAhbV9wU0RLRG9jKQ0KLQkJcmV0dXJuOw0KLQlpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBKQ0KLQkJcmV0dXJuOw0KLQkJDQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KLQlpZiAocEVudiA9PSBOVUxMKQ0KLQkJcmV0dXJuOw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6U2V0Q3VycmVudFBhZ2UoSVhGQV9Eb2MqIGhEb2MsIGludDMyX3QgaUN1clBhZ2UpIHsNCisgIGlmIChoRG9jICE9IG1fcFhGQURvYyB8fCAhbV9wU0RLRG9jKQ0KKyAgICByZXR1cm47DQorICBpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBKQ0KKyAgICByZXR1cm47DQogDQotCXBFbnYtPkZGSV9TZXRDdXJyZW50UGFnZSh0aGlzLCBpQ3VyUGFnZSk7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybjsNCisNCisgIHBFbnYtPkZGSV9TZXRDdXJyZW50UGFnZSh0aGlzLCBpQ3VyUGFnZSk7DQogfQ0KLUZYX0JPT0wJQ1BERlhGQV9Eb2N1bWVudDo6SXNDYWxjdWxhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jKQ0KLXsNCi0JaWYgKGhEb2MgIT0gbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MpDQotCQlyZXR1cm4gRkFMU0U7DQotCWlmIChtX3BTREtEb2MtPkdldEludGVyRm9ybSgpKQ0KLQkJcmV0dXJuIG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCktPklzWGZhQ2FsY3VsYXRlRW5hYmxlZCgpOw0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6SXNDYWxjdWxhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jKSB7DQorICBpZiAoaERvYyAhPSBtX3BYRkFEb2MgfHwgIW1fcFNES0RvYykNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaWYgKG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCkpDQorICAgIHJldHVybiBtX3BTREtEb2MtPkdldEludGVyRm9ybSgpLT5Jc1hmYUNhbGN1bGF0ZUVuYWJsZWQoKTsNCiANCi0JcmV0dXJuIEZBTFNFOw0KLQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi12b2lkIENQREZYRkFfRG9jdW1lbnQ6OlNldENhbGN1bGF0aW9uc0VuYWJsZWQoSVhGQV9Eb2MqIGhEb2MsIEZYX0JPT0wgYkVuYWJsZWQpDQotew0KLQlpZiAoaERvYyAhPSBtX3BYRkFEb2MgfHwgIW1fcFNES0RvYykNCi0JCXJldHVybjsNCi0JaWYgKG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCkpDQotCQltX3BTREtEb2MtPkdldEludGVyRm9ybSgpLT5YZmFFbmFibGVDYWxjdWxhdGUoYkVuYWJsZWQpOw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6U2V0Q2FsY3VsYXRpb25zRW5hYmxlZChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5hYmxlZCkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MpDQorICAgIHJldHVybjsNCisgIGlmIChtX3BTREtEb2MtPkdldEludGVyRm9ybSgpKQ0KKyAgICBtX3BTREtEb2MtPkdldEludGVyRm9ybSgpLT5YZmFFbmFibGVDYWxjdWxhdGUoYkVuYWJsZWQpOw0KIH0NCiANCi12b2lkIENQREZYRkFfRG9jdW1lbnQ6OkdldFRpdGxlKElYRkFfRG9jKiBoRG9jLCBDRlhfV2lkZVN0cmluZyAmd3NUaXRsZSkNCi17DQotCWlmIChoRG9jICE9IG1fcFhGQURvYykNCi0JCXJldHVybjsNCi0JaWYgKG1fcFBERkRvYyA9PSBOVUxMKQ0KLQkJcmV0dXJuOw0KLQlDUERGX0RpY3Rpb25hcnkqIHBJbmZvRGljdCA9IG1fcFBERkRvYy0+R2V0SW5mbygpOw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6R2V0VGl0bGUoSVhGQV9Eb2MqIGhEb2MsIENGWF9XaWRlU3RyaW5nJiB3c1RpdGxlKSB7DQorICBpZiAoaERvYyAhPSBtX3BYRkFEb2MpDQorICAgIHJldHVybjsNCisgIGlmIChtX3BQREZEb2MgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwSW5mb0RpY3QgPSBtX3BQREZEb2MtPkdldEluZm8oKTsNCiANCi0JaWYgKHBJbmZvRGljdCA9PSBOVUxMKQ0KLQkJcmV0dXJuOw0KLQkNCi0JQ0ZYX0J5dGVTdHJpbmcgY3NUaXRsZSA9IHBJbmZvRGljdC0+R2V0U3RyaW5nKCJUaXRsZSIpOw0KLSAgICB3c1RpdGxlID0gd3NUaXRsZS5Gcm9tTG9jYWwoY3NUaXRsZS5HZXRCdWZmZXIoY3NUaXRsZS5HZXRMZW5ndGgoKSkpOw0KLQljc1RpdGxlLlJlbGVhc2VCdWZmZXIoY3NUaXRsZS5HZXRMZW5ndGgoKSk7DQorICBpZiAocEluZm9EaWN0ID09IE5VTEwpDQorICAgIHJldHVybjsNCisNCisgIENGWF9CeXRlU3RyaW5nIGNzVGl0bGUgPSBwSW5mb0RpY3QtPkdldFN0cmluZygiVGl0bGUiKTsNCisgIHdzVGl0bGUgPSB3c1RpdGxlLkZyb21Mb2NhbChjc1RpdGxlLkdldEJ1ZmZlcihjc1RpdGxlLkdldExlbmd0aCgpKSk7DQorICBjc1RpdGxlLlJlbGVhc2VCdWZmZXIoY3NUaXRsZS5HZXRMZW5ndGgoKSk7DQogfQ0KLXZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6U2V0VGl0bGUoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSkNCi17DQotCWlmIChoRG9jICE9IG1fcFhGQURvYykNCi0JCXJldHVybjsNCi0JaWYgKG1fcFBERkRvYyA9PSBOVUxMKQ0KLQkJcmV0dXJuOw0KLQlDUERGX0RpY3Rpb25hcnkqIHBJbmZvRGljdCA9IG1fcFBERkRvYy0+R2V0SW5mbygpOw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6U2V0VGl0bGUoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGl0bGUpIHsNCisgIGlmIChoRG9jICE9IG1fcFhGQURvYykNCisgICAgcmV0dXJuOw0KKyAgaWYgKG1fcFBERkRvYyA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQorICBDUERGX0RpY3Rpb25hcnkqIHBJbmZvRGljdCA9IG1fcFBERkRvYy0+R2V0SW5mbygpOw0KIA0KLQlpZiAocEluZm9EaWN0ID09IE5VTEwpDQotCQlyZXR1cm47DQotCXBJbmZvRGljdC0+U2V0QXQoIlRpdGxlIiwgRlhfTkVXIENQREZfU3RyaW5nKHdzVGl0bGUpKTsNCisgIGlmIChwSW5mb0RpY3QgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKyAgcEluZm9EaWN0LT5TZXRBdCgiVGl0bGUiLCBGWF9ORVcgQ1BERl9TdHJpbmcod3NUaXRsZSkpOw0KIH0NCi12b2lkIENQREZYRkFfRG9jdW1lbnQ6OkV4cG9ydERhdGEoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlUGF0aCwgRlhfQk9PTCBiWERQKQ0KLXsNCi0JaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KLQkJcmV0dXJuOw0KLQlpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBICYmIG1faURvY1R5cGUgIT0gRE9DVFlQRV9TVEFUSUNfWEZBKQ0KLQkJcmV0dXJuOw0KLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCi0JaWYgKHBFbnYgPT0gTlVMTCkNCi0JCXJldHVybjsNCi0JaW50IGZpbGVUeXBlID0gYlhEUD9GWEZBX1NBVkVBU19YRFA6RlhGQV9TQVZFQVNfWE1MOw0KLQlDRlhfQnl0ZVN0cmluZyBicyA9IENGWF9XaWRlU3RyaW5nKHdzRmlsZVBhdGgpLlVURjE2TEVfRW5jb2RlKCk7DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpFeHBvcnREYXRhKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZVBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlhEUCkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKyAgICByZXR1cm47DQorICBpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBICYmIG1faURvY1R5cGUgIT0gRE9DVFlQRV9TVEFUSUNfWEZBKQ0KKyAgICByZXR1cm47DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybjsNCisgIGludCBmaWxlVHlwZSA9IGJYRFAgPyBGWEZBX1NBVkVBU19YRFAgOiBGWEZBX1NBVkVBU19YTUw7DQorICBDRlhfQnl0ZVN0cmluZyBicyA9IENGWF9XaWRlU3RyaW5nKHdzRmlsZVBhdGgpLlVURjE2TEVfRW5jb2RlKCk7DQogDQotCWlmICh3c0ZpbGVQYXRoLklzRW1wdHkoKSkgew0KLQkJaWYgKCFwRW52LT5HZXRGb3JtRmlsbEluZm8oKSB8fCBwRW52LT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybSA9PSBOVUxMKQ0KLQkJCXJldHVybjsNCi0JCUNGWF9XaWRlU3RyaW5nIGZpbGVwYXRoID0gcEVudi0+SlNfZmllbGRCcm93c2UoKTsNCi0JCWJzID0gZmlsZXBhdGguVVRGMTZMRV9FbmNvZGUoKTsNCi0JfQ0KLQlpbnQgbGVuID0gYnMuR2V0TGVuZ3RoKCkvc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsNCi0JRlBERl9GSUxFSEFORExFUiogcEZpbGVIYW5kbGVyID0gcEVudi0+RkZJX09wZW5GaWxlKGJYRFA/RlhGQV9TQVZFQVNfWERQOkZYRkFfU0FWRUFTX1hNTCwgKEZQREZfV0lERVNUUklORylicy5HZXRCdWZmZXIobGVuKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpLCAid2IiKTsNCi0JYnMuUmVsZWFzZUJ1ZmZlcihsZW4qc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQorICBpZiAod3NGaWxlUGF0aC5Jc0VtcHR5KCkpIHsNCisgICAgaWYgKCFwRW52LT5HZXRGb3JtRmlsbEluZm8oKSB8fA0KKyAgICAgICAgcEVudi0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm0gPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorICAgIENGWF9XaWRlU3RyaW5nIGZpbGVwYXRoID0gcEVudi0+SlNfZmllbGRCcm93c2UoKTsNCisgICAgYnMgPSBmaWxlcGF0aC5VVEYxNkxFX0VuY29kZSgpOw0KKyAgfQ0KKyAgaW50IGxlbiA9IGJzLkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsNCisgIEZQREZfRklMRUhBTkRMRVIqIHBGaWxlSGFuZGxlciA9IHBFbnYtPkZGSV9PcGVuRmlsZSgNCisgICAgICBiWERQID8gRlhGQV9TQVZFQVNfWERQIDogRlhGQV9TQVZFQVNfWE1MLA0KKyAgICAgIChGUERGX1dJREVTVFJJTkcpYnMuR2V0QnVmZmVyKGxlbiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpLCAid2IiKTsNCisgIGJzLlJlbGVhc2VCdWZmZXIobGVuICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQogDQotCWlmIChwRmlsZUhhbmRsZXIgPT0gTlVMTCkNCi0JCXJldHVybjsNCisgIGlmIChwRmlsZUhhbmRsZXIgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KIA0KLQlDRlBERl9GaWxlU3RyZWFtIGZpbGVXcml0ZShwRmlsZUhhbmRsZXIpOw0KKyAgQ0ZQREZfRmlsZVN0cmVhbSBmaWxlV3JpdGUocEZpbGVIYW5kbGVyKTsNCiANCi0JSVhGQV9Eb2NIYW5kbGVyICpwWEZBRG9jSGFuZGVyID0gbV9wQXBwLT5HZXRYRkFBcHAoKS0+R2V0RG9jSGFuZGxlcigpOw0KLQlDRlhfQnl0ZVN0cmluZyBjb250ZW50Ow0KLQlpZiAoZmlsZVR5cGUgPT0gRlhGQV9TQVZFQVNfWE1MKQ0KLQl7DQotCQljb250ZW50ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxyXG4iOw0KLQkJZmlsZVdyaXRlLldyaXRlQmxvY2soKGNvbnN0IEZYX0NIQVIqKWNvbnRlbnQsIGZpbGVXcml0ZS5HZXRTaXplKCksIGNvbnRlbnQuR2V0TGVuZ3RoKCkpOw0KLQkJQ0ZYX1dpZGVTdHJpbmdDIGRhdGEoTCJkYXRhIik7DQotCQlpZiggcFhGQURvY0hhbmRlci0+U2F2ZVBhY2thZ2UobV9wWEZBRG9jVmlldy0+R2V0RG9jKCksZGF0YSwgJmZpbGVXcml0ZSkpDQotCQl7DQotCQkJTlVMTDsNCi0JCX0NCi0JfQ0KLQkvKmVsc2UgaWYgKGZpbGVUeXBlID09IEZYRkFfRklMRV9TVEFUSUNfWERQKQ0KLQl7DQotCQljb250ZW50ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxyXG4iOw0KLQkJZmlsZVdyaXRlLldyaXRlQmxvY2soKGNvbnN0IEZYX0NIQVIqKWNvbnRlbnQsIGZpbGVXcml0ZS5HZXRTaXplKCksIGNvbnRlbnQuR2V0TGVuZ3RoKCkpOw0KLQkJQ0ZYX1dpZGVTdHJpbmdDIGRhdGEoTCJkYXRhIik7DQotCQlpZiggcFhGQURvY0hhbmRlci0+U2F2ZVBhY2thZ2UobV9wWEZBRG9jVmlldy0+R2V0RG9jKCksIGRhdGEsICZmaWxlV3JpdGUpKQ0KLQkJew0KLQkJCU5VTEw7DQotCQl9DQotCQlDRlhfV2lkZVN0cmluZyB3UGF0aCA9IHBFbnYtPkZGSV9HZXRGaWxlUGF0aChwRmlsZUhhbmRsZXIpOw0KKyAgSVhGQV9Eb2NIYW5kbGVyKiBwWEZBRG9jSGFuZGVyID0gbV9wQXBwLT5HZXRYRkFBcHAoKS0+R2V0RG9jSGFuZGxlcigpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgY29udGVudDsNCisgIGlmIChmaWxlVHlwZSA9PSBGWEZBX1NBVkVBU19YTUwpIHsNCisgICAgY29udGVudCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cclxuIjsNCisgICAgZmlsZVdyaXRlLldyaXRlQmxvY2soKGNvbnN0IEZYX0NIQVIqKWNvbnRlbnQsIGZpbGVXcml0ZS5HZXRTaXplKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuR2V0TGVuZ3RoKCkpOw0KKyAgICBDRlhfV2lkZVN0cmluZ0MgZGF0YShMImRhdGEiKTsNCisgICAgaWYgKHBYRkFEb2NIYW5kZXItPlNhdmVQYWNrYWdlKG1fcFhGQURvY1ZpZXctPkdldERvYygpLCBkYXRhLCAmZmlsZVdyaXRlKSkgew0KKyAgICAgIE5VTEw7DQorICAgIH0NCisgIH0NCisgIC8qZWxzZSBpZiAoZmlsZVR5cGUgPT0gRlhGQV9GSUxFX1NUQVRJQ19YRFApDQorICB7DQorICAgICAgICAgIGNvbnRlbnQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XHJcbiI7DQorICAgICAgICAgIGZpbGVXcml0ZS5Xcml0ZUJsb2NrKChjb25zdCBGWF9DSEFSKiljb250ZW50LCBmaWxlV3JpdGUuR2V0U2l6ZSgpLA0KK2NvbnRlbnQuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MgZGF0YShMImRhdGEiKTsNCisgICAgICAgICAgaWYoIHBYRkFEb2NIYW5kZXItPlNhdmVQYWNrYWdlKG1fcFhGQURvY1ZpZXctPkdldERvYygpLCBkYXRhLA0KKyZmaWxlV3JpdGUpKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgTlVMTDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3UGF0aCA9IHBFbnYtPkZGSV9HZXRGaWxlUGF0aChwRmlsZUhhbmRsZXIpOw0KIC8vIAkJQ0ZYX1dpZGVTdHJpbmcgd1BhdGg7DQogLy8gCQl3UGF0aC5Gcm9tVVRGMTZMRShmaWxlUGF0aCk7DQotCQlDRlhfQnl0ZVN0cmluZyBiUGF0aCA9IHdQYXRoLlVURjhFbmNvZGUoKTsNCi0JCUNGWF9CeXRlU3RyaW5nIHN6Rm9ybWF0ID0gIlxuPHBkZiBocmVmPVwiJXNcIiB4bWxucz1cImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwL3BkZi9cIi8+IjsNCi0JCWNvbnRlbnQuRm9ybWF0KHN6Rm9ybWF0LChjaGFyKikoY29uc3QgRlhfQ0hBUiopYlBhdGgpOw0KLQkJZmlsZVdyaXRlLldyaXRlQmxvY2soKGNvbnN0IEZYX0NIQVIqKWNvbnRlbnQsZmlsZVdyaXRlLkdldFNpemUoKSwgY29udGVudC5HZXRMZW5ndGgoKSk7DQotCX0NCi0JKi8NCi0JZWxzZSBpZiAoZmlsZVR5cGUgPT0gRlhGQV9TQVZFQVNfWERQKQ0KLQl7CQ0KLQkJaWYgKG1fcFBERkRvYyA9PSBOVUxMKQ0KLQkJCXJldHVybjsNCi0JCUNQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BQREZEb2MtPkdldFJvb3QoKTsNCi0JCWlmIChwUm9vdCA9PSBOVUxMKQ0KLQkJCXJldHVybjsNCi0JCUNQREZfRGljdGlvbmFyeSogcEFjcm9Gb3JtID0gcFJvb3QtPkdldERpY3QoIkFjcm9Gb3JtIik7DQotCQlpZiAoTlVMTCA9PSBwQWNyb0Zvcm0pDQotCQkJcmV0dXJuOw0KLQkJQ1BERl9PYmplY3QqIHBYRkEgPSBwQWNyb0Zvcm0tPkdldEVsZW1lbnQoIlhGQSIpOw0KLQkJaWYgKHBYRkEgPT0gTlVMTCkNCi0JCQlyZXR1cm47DQotCQlpZiAocFhGQS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkNCi0JCQlyZXR1cm47DQotCQlDUERGX0FycmF5KiBwQXJyYXkgPSBwWEZBLT5HZXRBcnJheSgpOw0KLQkJaWYgKE5VTEwgPT0gcEFycmF5KQ0KLQkJCXJldHVybjsNCi0JCWludCBzaXplID0gcEFycmF5LT5HZXRDb3VudCgpOw0KLQkJaW50IGlGb3JtSW5kZXggPSAtMTsNCi0JCWludCBpRGF0YVNldHNJbmRleCA9IC0xOw0KLQkJZm9yIChpbnQgaT0xOyBpPHNpemU7aSs9MikNCi0JCXsNCi0JCQlDUERGX09iamVjdCogcFBERk9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpKTsNCi0JCQlDUERGX09iamVjdCogcFByZVBERk9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpLTEpOw0KLQkJCWlmKHBQcmVQREZPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSSU5HKQ0KLQkJCQljb250aW51ZTsNCi0JCQlpZiAocFBERk9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpDQotCQkJCWNvbnRpbnVlOw0KLQkJCUNQREZfT2JqZWN0KiBwRGlyZWN0T2JqID0gcFBERk9iai0+R2V0RGlyZWN0KCk7DQotCQkJaWYocERpcmVjdE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pDQotCQkJCWNvbnRpbnVlOw0KLQkJCWlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKT09ImZvcm0iKQ0KLQkJCXsNCi0JCQkJQ0ZYX1dpZGVTdHJpbmdDIGZvcm0oTCJmb3JtIik7DQotCQkJCXBYRkFEb2NIYW5kZXItPlNhdmVQYWNrYWdlKG1fcFhGQURvY1ZpZXctPkdldERvYygpLCBmb3JtLCAmZmlsZVdyaXRlKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCk9PSJkYXRhc2V0cyIpDQotCQkJew0KLQkJCQlDRlhfV2lkZVN0cmluZ0MgZGF0YXNldHMoTCJkYXRhc2V0cyIpOw0KLQkJCQlwWEZBRG9jSGFuZGVyLT5TYXZlUGFja2FnZShtX3BYRkFEb2NWaWV3LT5HZXREb2MoKSwgZGF0YXNldHMsICZmaWxlV3JpdGUpOw0KLQkJCX0NCi0JCQllbHNlIA0KLQkJCXsJDQotCQkJCWlmIChpID09IHNpemUtMSkNCi0JCQkJew0KLQkJCQkJLy9DRlhfV2lkZVN0cmluZyB3UGF0aCA9IHBFbnYtPkZGSV9HZXRGaWxlUGF0aChwRmlsZUhhbmRsZXIpOw0KLQkJCQkJQ0ZYX1dpZGVTdHJpbmcgd1BhdGggPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoKHVuc2lnbmVkIHNob3J0KikoY29uc3QgRlhfQ0hBUiopYnMsIGJzLkdldExlbmd0aCgpL3NpemVvZih1bnNpZ25lZCBzaG9ydCkpOw0KLQkJCQkJQ0ZYX0J5dGVTdHJpbmcgYlBhdGggPSB3UGF0aC5VVEY4RW5jb2RlKCk7DQotCQkJCQlDRlhfQnl0ZVN0cmluZyBzekZvcm1hdCA9ICJcbjxwZGYgaHJlZj1cIiVzXCIgeG1sbnM9XCJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC9wZGYvXCIvPiI7DQotCQkJCQljb250ZW50LkZvcm1hdChzekZvcm1hdCwoY2hhciopKGNvbnN0IEZYX0NIQVIqKWJQYXRoKTsNCi0JCQkJCWZpbGVXcml0ZS5Xcml0ZUJsb2NrKChjb25zdCBGWF9DSEFSKiljb250ZW50LGZpbGVXcml0ZS5HZXRTaXplKCksIGNvbnRlbnQuR2V0TGVuZ3RoKCkpOw0KLQkJCQl9DQorICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJQYXRoID0gd1BhdGguVVRGOEVuY29kZSgpOw0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzekZvcm1hdCA9ICJcbjxwZGYgaHJlZj1cIiVzXCINCit4bWxucz1cImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwL3BkZi9cIi8+IjsNCisgICAgICAgICAgY29udGVudC5Gb3JtYXQoc3pGb3JtYXQsKGNoYXIqKShjb25zdCBGWF9DSEFSKiliUGF0aCk7DQorICAgICAgICAgIGZpbGVXcml0ZS5Xcml0ZUJsb2NrKChjb25zdCBGWF9DSEFSKiljb250ZW50LGZpbGVXcml0ZS5HZXRTaXplKCksDQorY29udGVudC5HZXRMZW5ndGgoKSk7DQorICB9DQorICAqLw0KKyAgZWxzZSBpZiAoZmlsZVR5cGUgPT0gRlhGQV9TQVZFQVNfWERQKSB7DQorICAgIGlmIChtX3BQREZEb2MgPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BQREZEb2MtPkdldFJvb3QoKTsNCisgICAgaWYgKHBSb290ID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybSA9IHBSb290LT5HZXREaWN0KCJBY3JvRm9ybSIpOw0KKyAgICBpZiAoTlVMTCA9PSBwQWNyb0Zvcm0pDQorICAgICAgcmV0dXJuOw0KKyAgICBDUERGX09iamVjdCogcFhGQSA9IHBBY3JvRm9ybS0+R2V0RWxlbWVudCgiWEZBIik7DQorICAgIGlmIChwWEZBID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKyAgICBpZiAocFhGQS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkNCisgICAgICByZXR1cm47DQorICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBYRkEtPkdldEFycmF5KCk7DQorICAgIGlmIChOVUxMID09IHBBcnJheSkNCisgICAgICByZXR1cm47DQorICAgIGludCBzaXplID0gcEFycmF5LT5HZXRDb3VudCgpOw0KKyAgICBpbnQgaUZvcm1JbmRleCA9IC0xOw0KKyAgICBpbnQgaURhdGFTZXRzSW5kZXggPSAtMTsNCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpICs9IDIpIHsNCisgICAgICBDUERGX09iamVjdCogcFBERk9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpKTsNCisgICAgICBDUERGX09iamVjdCogcFByZVBERk9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpIC0gMSk7DQorICAgICAgaWYgKHBQcmVQREZPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSSU5HKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgaWYgKHBQREZPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgQ1BERl9PYmplY3QqIHBEaXJlY3RPYmogPSBwUERGT2JqLT5HZXREaXJlY3QoKTsNCisgICAgICBpZiAocERpcmVjdE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCkgPT0gImZvcm0iKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0MgZm9ybShMImZvcm0iKTsNCisgICAgICAgIHBYRkFEb2NIYW5kZXItPlNhdmVQYWNrYWdlKG1fcFhGQURvY1ZpZXctPkdldERvYygpLCBmb3JtLCAmZmlsZVdyaXRlKTsNCisgICAgICB9IGVsc2UgaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpID09ICJkYXRhc2V0cyIpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyBkYXRhc2V0cyhMImRhdGFzZXRzIik7DQorICAgICAgICBwWEZBRG9jSGFuZGVyLT5TYXZlUGFja2FnZShtX3BYRkFEb2NWaWV3LT5HZXREb2MoKSwgZGF0YXNldHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVdyaXRlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGkgPT0gc2l6ZSAtIDEpIHsNCisgICAgICAgICAgLy8gQ0ZYX1dpZGVTdHJpbmcgd1BhdGggPSBwRW52LT5GRklfR2V0RmlsZVBhdGgocEZpbGVIYW5kbGVyKTsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd1BhdGggPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoDQorICAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQqKShjb25zdCBGWF9DSEFSKilicywNCisgICAgICAgICAgICAgIGJzLkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQorICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJQYXRoID0gd1BhdGguVVRGOEVuY29kZSgpOw0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzekZvcm1hdCA9DQorICAgICAgICAgICAgICAiXG48cGRmIGhyZWY9XCIlc1wiIHhtbG5zPVwiaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvcGRmL1wiLz4iOw0KKyAgICAgICAgICBjb250ZW50LkZvcm1hdChzekZvcm1hdCwgKGNoYXIqKShjb25zdCBGWF9DSEFSKiliUGF0aCk7DQorICAgICAgICAgIGZpbGVXcml0ZS5Xcml0ZUJsb2NrKChjb25zdCBGWF9DSEFSKiljb250ZW50LCBmaWxlV3JpdGUuR2V0U2l6ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LkdldExlbmd0aCgpKTsNCisgICAgICAgIH0NCiANCi0JCQkJQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBEaXJlY3RPYmo7DQotCQkJCUNQREZfU3RyZWFtQWNjKiBwQWNjID0gRlhfTkVXIENQREZfU3RyZWFtQWNjOw0KLQkJCQlwQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtKTsNCi0JCQkJZmlsZVdyaXRlLldyaXRlQmxvY2socEFjYy0+R2V0RGF0YSgpLCBmaWxlV3JpdGUuR2V0U2l6ZSgpLCBwQWNjLT5HZXRTaXplKCkpOw0KLQkJCQlkZWxldGUgcEFjYzsNCi0JCQl9DQotCQl9DQotCX0NCi0JRlhfQk9PTCBiRXJyb3I9IGZpbGVXcml0ZS5GbHVzaCgpOw0KKyAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBEaXJlY3RPYmo7DQorICAgICAgICBDUERGX1N0cmVhbUFjYyogcEFjYyA9IEZYX05FVyBDUERGX1N0cmVhbUFjYzsNCisgICAgICAgIHBBY2MtPkxvYWRBbGxEYXRhKHBTdHJlYW0pOw0KKyAgICAgICAgZmlsZVdyaXRlLldyaXRlQmxvY2socEFjYy0+R2V0RGF0YSgpLCBmaWxlV3JpdGUuR2V0U2l6ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFjYy0+R2V0U2l6ZSgpKTsNCisgICAgICAgIGRlbGV0ZSBwQWNjOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBiRXJyb3IgPSBmaWxlV3JpdGUuRmx1c2goKTsNCiB9DQotdm9pZCBDUERGWEZBX0RvY3VtZW50OjpJbXBvcnREYXRhKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZVBhdGgpDQotew0KLQkvL1RPRE8uLi4NCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OkltcG9ydERhdGEoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlUGF0aCkgew0KKyAgLy8gVE9ETy4uLg0KIH0NCiANCi12b2lkIENQREZYRkFfRG9jdW1lbnQ6OkdvdG9VUkwoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgYnNVUkwsIEZYX0JPT0wgYkFwcGVuZCkNCi17DQotCWlmIChoRG9jICE9IG1fcFhGQURvYykNCi0JCXJldHVybjsNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OkdvdG9VUkwoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgYnNVUkwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFwcGVuZCkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKyAgICByZXR1cm47DQogDQotCWlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpDQotCQlyZXR1cm47DQotCQkNCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQotCWlmIChwRW52ID09IE5VTEwpDQotCQlyZXR1cm47DQotCQ0KLQlDRlhfV2lkZVN0cmluZ0Mgc3RyKGJzVVJMLkdldFB0cigpKTsNCi0JDQotCXBFbnYtPkZGSV9Hb3RvVVJMKHRoaXMsIHN0ciwgYkFwcGVuZCk7DQorICBpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTklNSUNfWEZBKQ0KKyAgICByZXR1cm47DQogDQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybjsNCisNCisgIENGWF9XaWRlU3RyaW5nQyBzdHIoYnNVUkwuR2V0UHRyKCkpOw0KKw0KKyAgcEVudi0+RkZJX0dvdG9VUkwodGhpcywgc3RyLCBiQXBwZW5kKTsNCiB9DQogDQotRlhfQk9PTAlDUERGWEZBX0RvY3VtZW50OjpJc1ZhbGlkYXRpb25zRW5hYmxlZChJWEZBX0RvYyogaERvYykNCi17DQotCWlmIChoRG9jICE9IG1fcFhGQURvYyB8fCAhbV9wU0RLRG9jKQ0KLQkJcmV0dXJuIEZBTFNFOw0KLQlpZiAobV9wU0RLRG9jLT5HZXRJbnRlckZvcm0oKSkNCi0JCXJldHVybiBtX3BTREtEb2MtPkdldEludGVyRm9ybSgpLT5Jc1hmYVZhbGlkYXRpb25zRW5hYmxlZCgpOw0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6SXNWYWxpZGF0aW9uc0VuYWJsZWQoSVhGQV9Eb2MqIGhEb2MpIHsNCisgIGlmIChoRG9jICE9IG1fcFhGQURvYyB8fCAhbV9wU0RLRG9jKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpZiAobV9wU0RLRG9jLT5HZXRJbnRlckZvcm0oKSkNCisgICAgcmV0dXJuIG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCktPklzWGZhVmFsaWRhdGlvbnNFbmFibGVkKCk7DQogDQotCXJldHVybiBUUlVFOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6U2V0VmFsaWRhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jLCBGWF9CT09MIGJFbmFibGVkKQ0KLXsNCi0JaWYgKGhEb2MgIT0gbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MpDQotCQlyZXR1cm47DQotCWlmIChtX3BTREtEb2MtPkdldEludGVyRm9ybSgpKQ0KLQkJbV9wU0RLRG9jLT5HZXRJbnRlckZvcm0oKS0+WGZhU2V0VmFsaWRhdGlvbnNFbmFibGVkKGJFbmFibGVkKTsNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OlNldFZhbGlkYXRpb25zRW5hYmxlZChJWEZBX0RvYyogaERvYywgRlhfQk9PTCBiRW5hYmxlZCkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MpDQorICAgIHJldHVybjsNCisgIGlmIChtX3BTREtEb2MtPkdldEludGVyRm9ybSgpKQ0KKyAgICBtX3BTREtEb2MtPkdldEludGVyRm9ybSgpLT5YZmFTZXRWYWxpZGF0aW9uc0VuYWJsZWQoYkVuYWJsZWQpOw0KIH0NCi12b2lkICBDUERGWEZBX0RvY3VtZW50OjpTZXRGb2N1c1dpZGdldChJWEZBX0RvYyogaERvYywgSVhGQV9XaWRnZXQqIGhXaWRnZXQpDQotew0KLQlpZiAoaERvYyAhPSBtX3BYRkFEb2MpDQotCQlyZXR1cm47DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpTZXRGb2N1c1dpZGdldChJWEZBX0RvYyogaERvYywgSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIGlmIChoRG9jICE9IG1fcFhGQURvYykNCisgICAgcmV0dXJuOw0KIA0KLQlpZiAoTlVMTCA9PSBoV2lkZ2V0KSB7DQotCQltX3BTREtEb2MtPlNldEZvY3VzQW5ub3QoTlVMTCk7DQotCQlyZXR1cm47DQotCX0NCisgIGlmIChOVUxMID09IGhXaWRnZXQpIHsNCisgICAgbV9wU0RLRG9jLT5TZXRGb2N1c0Fubm90KE5VTEwpOw0KKyAgICByZXR1cm47DQorICB9DQogDQotCWludCBwYWdlVmlld0NvdW50ID0gbV9wU0RLRG9jLT5HZXRQYWdlVmlld0NvdW50KCk7DQotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZVZpZXdDb3VudDsgaSsrKQ0KLQl7DQotCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBtX3BTREtEb2MtPkdldFBhZ2VWaWV3KGkpOw0KLQkJaWYgKHBQYWdlVmlldyA9PSBOVUxMKQ0KLQkJCWNvbnRpbnVlOw0KLQkJQ1BERlNES19Bbm5vdCogcEFubm90ID0gcFBhZ2VWaWV3LT5HZXRBbm5vdEJ5WEZBV2lkZ2V0KGhXaWRnZXQpOw0KLQkJaWYgKHBBbm5vdCkgew0KLQkJCW1fcFNES0RvYy0+U2V0Rm9jdXNBbm5vdChwQW5ub3QpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQl9DQorICBpbnQgcGFnZVZpZXdDb3VudCA9IG1fcFNES0RvYy0+R2V0UGFnZVZpZXdDb3VudCgpOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlVmlld0NvdW50OyBpKyspIHsNCisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wU0RLRG9jLT5HZXRQYWdlVmlldyhpKTsNCisgICAgaWYgKHBQYWdlVmlldyA9PSBOVUxMKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBwUGFnZVZpZXctPkdldEFubm90QnlYRkFXaWRnZXQoaFdpZGdldCk7DQorICAgIGlmIChwQW5ub3QpIHsNCisgICAgICBtX3BTREtEb2MtPlNldEZvY3VzQW5ub3QocEFubm90KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENQREZYRkFfRG9jdW1lbnQ6OlByaW50KElYRkFfRG9jKiBoRG9jLCBpbnQzMl90IG5TdGFydFBhZ2UsIGludDMyX3QgbkVuZFBhZ2UsIEZYX0RXT1JEIGR3T3B0aW9ucykNCi17DQotCWlmIChoRG9jICE9IG1fcFhGQURvYykNCi0JCXJldHVybjsNCi0JCQ0KLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCi0JaWYgKHBFbnYgPT0gTlVMTCkNCi0JCXJldHVybjsNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OlByaW50KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnRQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRW5kUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3T3B0aW9ucykgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKyAgICByZXR1cm47DQogDQotCWlmICghcEVudi0+R2V0Rm9ybUZpbGxJbmZvKCkgfHwgcEVudi0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm0gPT0gTlVMTCkNCi0JCXJldHVybjsNCi0JaWYgKHBFbnYtPkdldEZvcm1GaWxsSW5mbygpLT5tX3BKc1BsYXRmb3JtLT5Eb2NfcHJpbnQgPT0gTlVMTCkNCi0JCXJldHVybjsNCi0JcEVudi0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm0tPkRvY19wcmludChwRW52LT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybSxkd09wdGlvbnMmWEZBX1BSSU5UT1BUX1Nob3dEaWFsb2csDQotCQluU3RhcnRQYWdlLG5FbmRQYWdlLGR3T3B0aW9ucyZYRkFfUFJJTlRPUFRfQ2FuQ2FuY2VsLGR3T3B0aW9ucyZYRkFfUFJJTlRPUFRfU2hyaW5rUGFnZSxkd09wdGlvbnMmWEZBX1BSSU5UT1BUX0FzSW1hZ2UsDQotCQlkd09wdGlvbnMmWEZBX1BSSU5UT1BUX1JldmVyc2VPcmRlcixkd09wdGlvbnMmWEZBX1BSSU5UT1BUX1ByaW50QW5ub3QpOw0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorICBpZiAocEVudiA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQorDQorICBpZiAoIXBFbnYtPkdldEZvcm1GaWxsSW5mbygpIHx8DQorICAgICAgcEVudi0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm0gPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKyAgaWYgKHBFbnYtPkdldEZvcm1GaWxsSW5mbygpLT5tX3BKc1BsYXRmb3JtLT5Eb2NfcHJpbnQgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKyAgcEVudi0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm0tPkRvY19wcmludCgNCisgICAgICBwRW52LT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybSwNCisgICAgICBkd09wdGlvbnMgJiBYRkFfUFJJTlRPUFRfU2hvd0RpYWxvZywgblN0YXJ0UGFnZSwgbkVuZFBhZ2UsDQorICAgICAgZHdPcHRpb25zICYgWEZBX1BSSU5UT1BUX0NhbkNhbmNlbCwgZHdPcHRpb25zICYgWEZBX1BSSU5UT1BUX1Nocmlua1BhZ2UsDQorICAgICAgZHdPcHRpb25zICYgWEZBX1BSSU5UT1BUX0FzSW1hZ2UsIGR3T3B0aW9ucyAmIFhGQV9QUklOVE9QVF9SZXZlcnNlT3JkZXIsDQorICAgICAgZHdPcHRpb25zICYgWEZBX1BSSU5UT1BUX1ByaW50QW5ub3QpOw0KIH0NCiANCi12b2lkIENQREZYRkFfRG9jdW1lbnQ6OkdldFVSTChJWEZBX0RvYyogaERvYywgQ0ZYX1dpZGVTdHJpbmcgJndzRG9jVVJMKQ0KLXsNCi0JaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KLQkJcmV0dXJuOw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6R2V0VVJMKElYRkFfRG9jKiBoRG9jLCBDRlhfV2lkZVN0cmluZyYgd3NEb2NVUkwpIHsNCisgIGlmIChoRG9jICE9IG1fcFhGQURvYykNCisgICAgcmV0dXJuOw0KIA0KLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCi0JaWYgKHBFbnYgPT0gTlVMTCkNCi0JCXJldHVybjsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKyAgaWYgKHBFbnYgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KIA0KLQlwRW52LT5GRklfR2V0VVJMKHRoaXMsIHdzRG9jVVJMKTsNCisgIHBFbnYtPkZGSV9HZXRVUkwodGhpcywgd3NEb2NVUkwpOw0KIH0NCiANCi1GWF9BUkdCCUNQREZYRkFfRG9jdW1lbnQ6OkdldEhpZ2hsaWdodENvbG9yKElYRkFfRG9jKiBoRG9jKQ0KLXsNCi0JaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KLQkJcmV0dXJuIDA7DQotCWlmIChtX3BTREtEb2MpDQotCXsNCi0JCWlmKENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wU0RLRG9jLT5HZXRJbnRlckZvcm0oKSkNCi0JCXsNCi0JCQlGWF9DT0xPUlJFRiBjb2xvciA9IHBJbnRlckZvcm0tPkdldEhpZ2hsaWdodENvbG9yKEZQREZfRk9STUZJRUxEX1hGQSk7DQotCQkJdWludDhfdCBhbHBoYSA9IHBJbnRlckZvcm0tPkdldEhpZ2hsaWdodEFscGhhKCk7DQotCQkJRlhfQVJHQiBhcmdiID0gQXJnYkVuY29kZSgoaW50KWFscGhhLCBjb2xvcik7DQotCQkJcmV0dXJuIGFyZ2I7DQotCQl9CQ0KLQl9DQotCXJldHVybiAwOw0KK0ZYX0FSR0IgQ1BERlhGQV9Eb2N1bWVudDo6R2V0SGlnaGxpZ2h0Q29sb3IoSVhGQV9Eb2MqIGhEb2MpIHsNCisgIGlmIChoRG9jICE9IG1fcFhGQURvYykNCisgICAgcmV0dXJuIDA7DQorICBpZiAobV9wU0RLRG9jKSB7DQorICAgIGlmIChDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCkpIHsNCisgICAgICBGWF9DT0xPUlJFRiBjb2xvciA9IHBJbnRlckZvcm0tPkdldEhpZ2hsaWdodENvbG9yKEZQREZfRk9STUZJRUxEX1hGQSk7DQorICAgICAgdWludDhfdCBhbHBoYSA9IHBJbnRlckZvcm0tPkdldEhpZ2hsaWdodEFscGhhKCk7DQorICAgICAgRlhfQVJHQiBhcmdiID0gQXJnYkVuY29kZSgoaW50KWFscGhhLCBjb2xvcik7DQorICAgICAgcmV0dXJuIGFyZ2I7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAwOw0KIH0NCiANCi12b2lkIENQREZYRkFfRG9jdW1lbnQ6OkFkZERvUmVjb3JkKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KQ0KLXsNCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQotCWlmIChwRW52ID09IE5VTEwpDQotCQlyZXR1cm47DQotCXJldHVybjsNCi0JLy9wRW52LT5GRklfQWRkRG9SZWNvcmQodGhpcywgaFdpZGdldCk7DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpBZGREb1JlY29yZChJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorICBpZiAocEVudiA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQorICByZXR1cm47DQorICAvLyBwRW52LT5GRklfQWRkRG9SZWNvcmQodGhpcywgaFdpZGdldCk7DQogfQ0KIA0KLUZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6X05vdGlmeVN1Ym1pdChGWF9CT09MIGJQcmV2T3JQb3N0KQ0KLXsNCi0JaWYgKGJQcmV2T3JQb3N0KQ0KLQkJcmV0dXJuIF9PbkJlZm9yZU5vdGlmeVN1bWJpdCgpOw0KLQllbHNlDQotCQlfT25BZnRlck5vdGlmeVN1bWJpdCgpOw0KLQlyZXR1cm4gVFJVRTsNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6Ol9Ob3RpZnlTdWJtaXQoRlhfQk9PTCBiUHJldk9yUG9zdCkgew0KKyAgaWYgKGJQcmV2T3JQb3N0KQ0KKyAgICByZXR1cm4gX09uQmVmb3JlTm90aWZ5U3VtYml0KCk7DQorICBlbHNlDQorICAgIF9PbkFmdGVyTm90aWZ5U3VtYml0KCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQogDQotRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpfT25CZWZvcmVOb3RpZnlTdW1iaXQoKQ0KLXsNCi0JaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSAmJiBtX2lEb2NUeXBlICE9IERPQ1RZUEVfU1RBVElDX1hGQSkNCi0JCXJldHVybiBUUlVFOw0KLQlpZiAobV9wWEZBRG9jVmlldyA9PSBOVUxMKQ0KLQkJcmV0dXJuIFRSVUU7DQotCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7DQotCWlmIChwV2lkZ2V0SGFuZGxlciA9PSBOVUxMKQ0KLQkJcmV0dXJuIFRSVUU7DQotCUlYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIHBXaWRnZXRBY2NJdGVyYXRvciA9IG1fcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7DQotCWlmIChwV2lkZ2V0QWNjSXRlcmF0b3IpDQotCXsNCi0JCUNYRkFfRXZlbnRQYXJhbSBQYXJhbTsNCi0JCVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfUHJlU3VibWl0Ow0KLQkJQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCi0JCXdoaWxlIChwV2lkZ2V0QWNjKQ0KLQkJew0KLQkJCXBXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocFdpZGdldEFjYywgJlBhcmFtKTsNCi0JCQlwV2lkZ2V0QWNjID0gcFdpZGdldEFjY0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQotCQl9DQotCQlwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsNCi0JfQ0KLQlwV2lkZ2V0QWNjSXRlcmF0b3IgPSBtX3BYRkFEb2NWaWV3LT5DcmVhdGVXaWRnZXRBY2NJdGVyYXRvcigpOw0KLQlpZiAocFdpZGdldEFjY0l0ZXJhdG9yKQ0KLQl7DQotCQlDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KLQkJcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KLQkJd2hpbGUgKHBXaWRnZXRBY2MpDQotCQl7DQotCQkJaW50IGZSZXQgPSBwV2lkZ2V0QWNjLT5Qcm9jZXNzVmFsaWRhdGUoLTEpOw0KLQkJCWlmIChmUmV0ID09IFhGQV9FVkVOVEVSUk9SX0Vycm9yKQ0KLQkJCXsNCi0JCQkJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQotCQkJCWlmIChwRW52ID09IE5VTEwpDQotCQkJCQlyZXR1cm4gRkFMU0U7DQotCQkJCUNGWF9XaWRlU3RyaW5nIHdzOw0KLQkJCQl3cy5Gcm9tTG9jYWwoSURTX1hGQV9WYWxpZGF0ZV9JbnB1dCk7DQotCQkJCUNGWF9CeXRlU3RyaW5nIGJzID0gd3MuVVRGMTZMRV9FbmNvZGUoKTsNCi0JCQkJaW50IGxlbiA9IGJzLkdldExlbmd0aCgpL3NpemVvZih1bnNpZ25lZCBzaG9ydCk7DQotCQkJCXBFbnYtPkZGSV9BbGVydCgoRlBERl9XSURFU1RSSU5HKWJzLkdldEJ1ZmZlcihsZW4qc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksIChGUERGX1dJREVTVFJJTkcpTCIiLCAwLCAxKTsNCi0JCQkJYnMuUmVsZWFzZUJ1ZmZlcihsZW4qc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQotCQkJCXBXaWRnZXRBY2NJdGVyYXRvci0+UmVsZWFzZSgpOw0KLQkJCQlyZXR1cm4gRkFMU0U7DQotCQkJfQ0KLQkJCXBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCi0JCX0NCi0JCXBXaWRnZXRBY2NJdGVyYXRvci0+UmVsZWFzZSgpOw0KLQkJbV9wWEZBRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KLQl9DQotCQ0KLQlyZXR1cm4gVFJVRTsNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6Ol9PbkJlZm9yZU5vdGlmeVN1bWJpdCgpIHsNCisgIGlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEgJiYgbV9pRG9jVHlwZSAhPSBET0NUWVBFX1NUQVRJQ19YRkEpDQorICAgIHJldHVybiBUUlVFOw0KKyAgaWYgKG1fcFhGQURvY1ZpZXcgPT0gTlVMTCkNCisgICAgcmV0dXJuIFRSVUU7DQorICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gbV9wWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOw0KKyAgaWYgKHBXaWRnZXRIYW5kbGVyID09IE5VTEwpDQorICAgIHJldHVybiBUUlVFOw0KKyAgSVhGQV9XaWRnZXRBY2NJdGVyYXRvciogcFdpZGdldEFjY0l0ZXJhdG9yID0NCisgICAgICBtX3BYRkFEb2NWaWV3LT5DcmVhdGVXaWRnZXRBY2NJdGVyYXRvcigpOw0KKyAgaWYgKHBXaWRnZXRBY2NJdGVyYXRvcikgew0KKyAgICBDWEZBX0V2ZW50UGFyYW0gUGFyYW07DQorICAgIFBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfUHJlU3VibWl0Ow0KKyAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICB3aGlsZSAocFdpZGdldEFjYykgew0KKyAgICAgIHBXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocFdpZGdldEFjYywgJlBhcmFtKTsNCisgICAgICBwV2lkZ2V0QWNjID0gcFdpZGdldEFjY0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgIH0NCisgICAgcFdpZGdldEFjY0l0ZXJhdG9yLT5SZWxlYXNlKCk7DQorICB9DQorICBwV2lkZ2V0QWNjSXRlcmF0b3IgPSBtX3BYRkFEb2NWaWV3LT5DcmVhdGVXaWRnZXRBY2NJdGVyYXRvcigpOw0KKyAgaWYgKHBXaWRnZXRBY2NJdGVyYXRvcikgew0KKyAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICBwV2lkZ2V0QWNjID0gcFdpZGdldEFjY0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgIHdoaWxlIChwV2lkZ2V0QWNjKSB7DQorICAgICAgaW50IGZSZXQgPSBwV2lkZ2V0QWNjLT5Qcm9jZXNzVmFsaWRhdGUoLTEpOw0KKyAgICAgIGlmIChmUmV0ID09IFhGQV9FVkVOVEVSUk9SX0Vycm9yKSB7DQorICAgICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgICAgICAgIGlmIChwRW52ID09IE5VTEwpDQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICAgICAgd3MuRnJvbUxvY2FsKElEU19YRkFfVmFsaWRhdGVfSW5wdXQpOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSB3cy5VVEYxNkxFX0VuY29kZSgpOw0KKyAgICAgICAgaW50IGxlbiA9IGJzLkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsNCisgICAgICAgIHBFbnYtPkZGSV9BbGVydCgNCisgICAgICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzLkdldEJ1ZmZlcihsZW4gKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSwNCisgICAgICAgICAgICAoRlBERl9XSURFU1RSSU5HKUwiIiwgMCwgMSk7DQorICAgICAgICBicy5SZWxlYXNlQnVmZmVyKGxlbiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOw0KKyAgICAgICAgcFdpZGdldEFjY0l0ZXJhdG9yLT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgfQ0KKyAgICBwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsNCisgICAgbV9wWEZBRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KKyAgfQ0KIA0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6X09uQWZ0ZXJOb3RpZnlTdW1iaXQoKQ0KLXsNCi0JaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSAmJiBtX2lEb2NUeXBlICE9IERPQ1RZUEVfU1RBVElDX1hGQSkNCi0JCXJldHVybjsNCi0JaWYgKG1fcFhGQURvY1ZpZXcgPT0gTlVMTCkNCi0JCXJldHVybjsNCi0JSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IG1fcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsNCi0JaWYgKHBXaWRnZXRIYW5kbGVyID09IE5VTEwpDQotCQlyZXR1cm47DQotCUlYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIHBXaWRnZXRBY2NJdGVyYXRvciA9IG1fcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7DQotCWlmIChwV2lkZ2V0QWNjSXRlcmF0b3IgPT0gTlVMTCkNCi0JCXJldHVybjsNCi0JQ1hGQV9FdmVudFBhcmFtIFBhcmFtOyANCi0JUGFyYW0ubV9lVHlwZSA9ICBYRkFfRVZFTlRfUG9zdFN1Ym1pdDsNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6Ol9PbkFmdGVyTm90aWZ5U3VtYml0KCkgew0KKyAgaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSAmJiBtX2lEb2NUeXBlICE9IERPQ1RZUEVfU1RBVElDX1hGQSkNCisgICAgcmV0dXJuOw0KKyAgaWYgKG1fcFhGQURvY1ZpZXcgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IG1fcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsNCisgIGlmIChwV2lkZ2V0SGFuZGxlciA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQorICBJWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBwV2lkZ2V0QWNjSXRlcmF0b3IgPQ0KKyAgICAgIG1fcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7DQorICBpZiAocFdpZGdldEFjY0l0ZXJhdG9yID09IE5VTEwpDQorICAgIHJldHVybjsNCisgIENYRkFfRXZlbnRQYXJhbSBQYXJhbTsNCisgIFBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfUG9zdFN1Ym1pdDsNCiANCi0JQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCi0Jd2hpbGUgKHBXaWRnZXRBY2MpDQotCXsNCi0JCXBXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocFdpZGdldEFjYywgJlBhcmFtKTsNCi0JCXBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCi0JfQ0KLQlwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsNCi0JbV9wWEZBRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgIHdoaWxlIChwV2lkZ2V0QWNjKSB7DQorICAgIHBXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocFdpZGdldEFjYywgJlBhcmFtKTsNCisgICAgcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgfQ0KKyAgcFdpZGdldEFjY0l0ZXJhdG9yLT5SZWxlYXNlKCk7DQorICBtX3BYRkFEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7DQogfQ0KIA0KLUZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6U3VibWl0RGF0YShJWEZBX0RvYyogaERvYywgQ1hGQV9TdWJtaXQgc3VibWl0KQ0KLXsNCi0JaWYgKCFfTm90aWZ5U3VibWl0KFRSVUUpKQ0KLQkJcmV0dXJuIEZBTFNFOw0KLQlpZiAoTlVMTCA9PSBtX3BYRkFEb2NWaWV3KQ0KLQkJcmV0dXJuIEZBTFNFOw0KLQltX3BYRkFEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7DQorRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpTdWJtaXREYXRhKElYRkFfRG9jKiBoRG9jLCBDWEZBX1N1Ym1pdCBzdWJtaXQpIHsNCisgIGlmICghX05vdGlmeVN1Ym1pdChUUlVFKSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaWYgKE5VTEwgPT0gbV9wWEZBRG9jVmlldykNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgbV9wWEZBRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KIA0KLQlGWF9CT09MIHJldCA9IF9TdWJtaXREYXRhKGhEb2MsIHN1Ym1pdCk7DQotCV9Ob3RpZnlTdWJtaXQoRkFMU0UpOw0KLQlyZXR1cm4gcmV0Ow0KKyAgRlhfQk9PTCByZXQgPSBfU3VibWl0RGF0YShoRG9jLCBzdWJtaXQpOw0KKyAgX05vdGlmeVN1Ym1pdChGQUxTRSk7DQorICByZXR1cm4gcmV0Ow0KIH0NCiANCi1JRlhfRmlsZVJlYWQqIENQREZYRkFfRG9jdW1lbnQ6Ok9wZW5MaW5rZWRGaWxlKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMaW5rKQ0KLXsNCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQotCWlmIChwRW52ID09IE5VTEwpDQotCQlyZXR1cm4gRkFMU0U7DQotCUNGWF9CeXRlU3RyaW5nIGJzID0gd3NMaW5rLlVURjE2TEVfRW5jb2RlKCk7DQotCWludCBsZW4gPSBicy5HZXRMZW5ndGgoKS9zaXplb2YodW5zaWduZWQgc2hvcnQpOw0KLQlGUERGX0ZJTEVIQU5ETEVSKiBwRmlsZUhhbmRsZXIgPSBwRW52LT5GRklfT3BlbkZpbGUoMCwgKEZQREZfV0lERVNUUklORylicy5HZXRCdWZmZXIobGVuKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpLCAicmIiKTsNCi0JYnMuUmVsZWFzZUJ1ZmZlcihsZW4qc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQorSUZYX0ZpbGVSZWFkKiBDUERGWEZBX0RvY3VtZW50OjpPcGVuTGlua2VkRmlsZShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0xpbmspIHsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKyAgaWYgKHBFbnYgPT0gTlVMTCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSB3c0xpbmsuVVRGMTZMRV9FbmNvZGUoKTsNCisgIGludCBsZW4gPSBicy5HZXRMZW5ndGgoKSAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7DQorICBGUERGX0ZJTEVIQU5ETEVSKiBwRmlsZUhhbmRsZXIgPSBwRW52LT5GRklfT3BlbkZpbGUoDQorICAgICAgMCwgKEZQREZfV0lERVNUUklORylicy5HZXRCdWZmZXIobGVuICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksICJyYiIpOw0KKyAgYnMuUmVsZWFzZUJ1ZmZlcihsZW4gKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsNCiANCi0JaWYgKHBGaWxlSGFuZGxlciA9PSBOVUxMKQ0KLQkJcmV0dXJuIE5VTEw7DQotCUNGUERGX0ZpbGVTdHJlYW0qIHBGaWxlUmVhZCA9IEZYX05FVyBDRlBERl9GaWxlU3RyZWFtKHBGaWxlSGFuZGxlcik7DQotCXJldHVybiBwRmlsZVJlYWQ7DQorICBpZiAocEZpbGVIYW5kbGVyID09IE5VTEwpDQorICAgIHJldHVybiBOVUxMOw0KKyAgQ0ZQREZfRmlsZVN0cmVhbSogcEZpbGVSZWFkID0gRlhfTkVXIENGUERGX0ZpbGVTdHJlYW0ocEZpbGVIYW5kbGVyKTsNCisgIHJldHVybiBwRmlsZVJlYWQ7DQogfQ0KLUZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6X0V4cG9ydFN1Ym1pdEZpbGUoRlBERl9GSUxFSEFORExFUiogcEZpbGVIYW5kbGVyLCBpbnQgZmlsZVR5cGUsIEZQREZfRFdPUkQgZW5jb2RlVHlwZSwgRlBERl9EV09SRCBmbGFnKQ0KLXsNCi0JaWYgKE5VTEwgPT0gbV9wWEZBRG9jVmlldykNCi0JCXJldHVybiBGQUxTRTsNCi0JSVhGQV9Eb2NIYW5kbGVyKiBwRG9jSGFuZGxlciA9IG1fcEFwcC0+R2V0WEZBQXBwKCktPkdldERvY0hhbmRsZXIoKTsNCi0JQ0ZYX0J5dGVTdHJpbmcgY29udGVudDsNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6Ol9FeHBvcnRTdWJtaXRGaWxlKEZQREZfRklMRUhBTkRMRVIqIHBGaWxlSGFuZGxlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZW5jb2RlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZykgew0KKyAgaWYgKE5VTEwgPT0gbV9wWEZBRG9jVmlldykNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgSVhGQV9Eb2NIYW5kbGVyKiBwRG9jSGFuZGxlciA9IG1fcEFwcC0+R2V0WEZBQXBwKCktPkdldERvY0hhbmRsZXIoKTsNCisgIENGWF9CeXRlU3RyaW5nIGNvbnRlbnQ7DQogDQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KLQlpZiAocEVudiA9PSBOVUxMKQ0KLQkJcmV0dXJuIEZBTFNFOw0KLQkNCi0JQ0ZQREZfRmlsZVN0cmVhbSBmaWxlU3RyZWFtKHBGaWxlSGFuZGxlcik7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybiBGQUxTRTsNCiANCi0JaWYgKGZpbGVUeXBlID09IEZYRkFfU0FWRUFTX1hNTCkNCi0Jew0KLQkJQ0ZYX1dpZGVTdHJpbmcgd3M7DQotCQl3cy5Gcm9tTG9jYWwoImRhdGEiKTsNCi0JCUNGWF9CeXRlU3RyaW5nIGNvbnRlbnQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XHJcbiI7DQotCQlmaWxlU3RyZWFtLldyaXRlQmxvY2soKGNvbnN0IEZYX0NIQVIqKWNvbnRlbnQsMCxjb250ZW50LkdldExlbmd0aCgpKTsNCi0JCXBEb2NIYW5kbGVyLT5TYXZlUGFja2FnZShtX3BYRkFEb2MsIHdzLCAmZmlsZVN0cmVhbSk7DQotCX0NCi0JZWxzZSBpZiAoZmlsZVR5cGUgPT0gRlhGQV9TQVZFQVNfWERQKQ0KLQl7CQ0KLQkJaWYgKGZsYWcgPT0gMCkNCi0JCQlmbGFnID0gRlhGQV9DT05GSUd8RlhGQV9URU1QTEFURXxGWEZBX0xPQ0FMRVNFVHxGWEZBX0RBVEFTRVRTfEZYRkFfWE1QTUVUQXxGWEZBX1hGREZ8RlhGQV9GT1JNOw0KLQkJaWYgKG1fcFBERkRvYyA9PSBOVUxMKSANCi0JCXsNCi0JCQlmaWxlU3RyZWFtLkZsdXNoKCk7DQotCQkJcmV0dXJuIEZBTFNFOw0KLQkJfQkNCi0JCUNQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BQREZEb2MtPkdldFJvb3QoKTsNCi0JCWlmIChwUm9vdCA9PSBOVUxMKSANCi0JCXsNCi0JCQlmaWxlU3RyZWFtLkZsdXNoKCk7DQotCQkJcmV0dXJuIEZBTFNFOw0KLQkJfQ0KLQkJQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsNCi0JCWlmIChOVUxMID09IHBBY3JvRm9ybSkNCi0JCXsNCi0JCQlmaWxlU3RyZWFtLkZsdXNoKCk7DQotCQkJcmV0dXJuIEZBTFNFOw0KLQkJfQ0KLQkJQ1BERl9PYmplY3QqIHBYRkEgPSBwQWNyb0Zvcm0tPkdldEVsZW1lbnQoIlhGQSIpOw0KLQkJaWYgKHBYRkEgPT0gTlVMTCkgDQotCQl7DQotCQkJZmlsZVN0cmVhbS5GbHVzaCgpOw0KLQkJCXJldHVybiBGQUxTRTsNCi0JCX0NCi0JCWlmIChwWEZBLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKQ0KLQkJew0KLQkJCWZpbGVTdHJlYW0uRmx1c2goKTsNCi0JCQlyZXR1cm4gRkFMU0U7DQotCQl9DQotCQlDUERGX0FycmF5KiBwQXJyYXkgPSBwWEZBLT5HZXRBcnJheSgpOw0KLQkJaWYgKE5VTEwgPT0gcEFycmF5KQ0KLQkJew0KLQkJCWZpbGVTdHJlYW0uRmx1c2goKTsNCi0JCQlyZXR1cm4gRkFMU0U7DQotCQl9DQotCQlpbnQgc2l6ZSA9IHBBcnJheS0+R2V0Q291bnQoKTsNCi0JCWludCBpRm9ybUluZGV4ID0gLTE7DQotCQlpbnQgaURhdGFTZXRzSW5kZXggPSAtMTsNCi0JCWZvciAoaW50IGk9MTsgaTxzaXplO2krPTIpDQotCQl7DQotCQkJQ1BERl9PYmplY3QqIHBQREZPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaSk7DQotCQkJQ1BERl9PYmplY3QqIHBQcmVQREZPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaS0xKTsNCi0JCQlpZihwUHJlUERGT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUklORykNCi0JCQkJY29udGludWU7DQotCQkJaWYgKHBQREZPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKQ0KLQkJCQljb250aW51ZTsNCi0JCQlDUERGX09iamVjdCogcERpcmVjdE9iaiA9IHBQREZPYmotPkdldERpcmVjdCgpOw0KLQkJCWlmIChwRGlyZWN0T2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkNCi0JCQkJY29udGludWU7DQotCQkJaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpPT0iY29uZmlnIiAmJiAhKGZsYWcgJiBGWEZBX0NPTkZJRykpDQotCQkJCWNvbnRpbnVlOw0KLQkJCWlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKT09InRlbXBsYXRlIiAmJiAhKGZsYWcgJiBGWEZBX1RFTVBMQVRFKSkNCi0JCQkJY29udGludWU7DQotCQkJaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpPT0ibG9jYWxlU2V0IiAmJiAhKGZsYWcgJiBGWEZBX0xPQ0FMRVNFVCkpDQotCQkJCWNvbnRpbnVlOw0KLQkJCWlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKT09ImRhdGFzZXRzIiAmJiAhKGZsYWcgJiBGWEZBX0RBVEFTRVRTKSkNCi0JCQkJY29udGludWU7DQotCQkJaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpPT0ieG1wbWV0YSIgJiYgIShmbGFnICYgRlhGQV9YTVBNRVRBKSkNCi0JCQkJY29udGludWU7DQotCQkJaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpPT0ieGZkZiIgJiYgIShmbGFnICYgRlhGQV9YRkRGKSkNCi0JCQkJY29udGludWU7DQotCQkJaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpPT0iZm9ybSIgJiYgIShmbGFnICYgRlhGQV9GT1JNKSkNCi0JCQkJY29udGludWU7DQotCQkJaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpPT0iZm9ybSIpDQotCQkJew0KLQkJCQlDRlhfV2lkZVN0cmluZyB3czsNCi0JCQkJd3MuRnJvbUxvY2FsKCJmb3JtIik7DQotCQkJCXBEb2NIYW5kbGVyLT5TYXZlUGFja2FnZShtX3BYRkFEb2MsIHdzLCAmZmlsZVN0cmVhbSk7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpPT0iZGF0YXNldHMiKQ0KLQkJCXsNCi0JCQkJQ0ZYX1dpZGVTdHJpbmcgd3M7DQotCQkJCXdzLkZyb21Mb2NhbCgiZGF0YXNldHMiKTsNCi0JCQkJcERvY0hhbmRsZXItPlNhdmVQYWNrYWdlKG1fcFhGQURvYywgd3MsICZmaWxlU3RyZWFtKTsNCi0JCQl9DQotCQkJZWxzZSANCi0JCQl7CQ0KLQkJCQkvL1BERixjcmVhdG9yLg0KLQkJCQkvL1RPRE86DQotCQkJfQ0KLQkJfQ0KLQl9DQotCXJldHVybiBUUlVFOw0KKyAgQ0ZQREZfRmlsZVN0cmVhbSBmaWxlU3RyZWFtKHBGaWxlSGFuZGxlcik7DQorDQorICBpZiAoZmlsZVR5cGUgPT0gRlhGQV9TQVZFQVNfWE1MKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICB3cy5Gcm9tTG9jYWwoImRhdGEiKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgY29udGVudCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cclxuIjsNCisgICAgZmlsZVN0cmVhbS5Xcml0ZUJsb2NrKChjb25zdCBGWF9DSEFSKiljb250ZW50LCAwLCBjb250ZW50LkdldExlbmd0aCgpKTsNCisgICAgcERvY0hhbmRsZXItPlNhdmVQYWNrYWdlKG1fcFhGQURvYywgd3MsICZmaWxlU3RyZWFtKTsNCisgIH0gZWxzZSBpZiAoZmlsZVR5cGUgPT0gRlhGQV9TQVZFQVNfWERQKSB7DQorICAgIGlmIChmbGFnID09IDApDQorICAgICAgZmxhZyA9IEZYRkFfQ09ORklHIHwgRlhGQV9URU1QTEFURSB8IEZYRkFfTE9DQUxFU0VUIHwgRlhGQV9EQVRBU0VUUyB8DQorICAgICAgICAgICAgIEZYRkFfWE1QTUVUQSB8IEZYRkFfWEZERiB8IEZYRkFfRk9STTsNCisgICAgaWYgKG1fcFBERkRvYyA9PSBOVUxMKSB7DQorICAgICAgZmlsZVN0cmVhbS5GbHVzaCgpOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wUERGRG9jLT5HZXRSb290KCk7DQorICAgIGlmIChwUm9vdCA9PSBOVUxMKSB7DQorICAgICAgZmlsZVN0cmVhbS5GbHVzaCgpOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybSA9IHBSb290LT5HZXREaWN0KCJBY3JvRm9ybSIpOw0KKyAgICBpZiAoTlVMTCA9PSBwQWNyb0Zvcm0pIHsNCisgICAgICBmaWxlU3RyZWFtLkZsdXNoKCk7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENQREZfT2JqZWN0KiBwWEZBID0gcEFjcm9Gb3JtLT5HZXRFbGVtZW50KCJYRkEiKTsNCisgICAgaWYgKHBYRkEgPT0gTlVMTCkgew0KKyAgICAgIGZpbGVTdHJlYW0uRmx1c2goKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBYRkEtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsNCisgICAgICBmaWxlU3RyZWFtLkZsdXNoKCk7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBYRkEtPkdldEFycmF5KCk7DQorICAgIGlmIChOVUxMID09IHBBcnJheSkgew0KKyAgICAgIGZpbGVTdHJlYW0uRmx1c2goKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaW50IHNpemUgPSBwQXJyYXktPkdldENvdW50KCk7DQorICAgIGludCBpRm9ybUluZGV4ID0gLTE7DQorICAgIGludCBpRGF0YVNldHNJbmRleCA9IC0xOw0KKyAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkgKz0gMikgew0KKyAgICAgIENQREZfT2JqZWN0KiBwUERGT2JqID0gcEFycmF5LT5HZXRFbGVtZW50KGkpOw0KKyAgICAgIENQREZfT2JqZWN0KiBwUHJlUERGT2JqID0gcEFycmF5LT5HZXRFbGVtZW50KGkgLSAxKTsNCisgICAgICBpZiAocFByZVBERk9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJJTkcpDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBpZiAocFBERk9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBDUERGX09iamVjdCogcERpcmVjdE9iaiA9IHBQREZPYmotPkdldERpcmVjdCgpOw0KKyAgICAgIGlmIChwRGlyZWN0T2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAiY29uZmlnIiAmJiAhKGZsYWcgJiBGWEZBX0NPTkZJRykpDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCkgPT0gInRlbXBsYXRlIiAmJiAhKGZsYWcgJiBGWEZBX1RFTVBMQVRFKSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAibG9jYWxlU2V0IiAmJiAhKGZsYWcgJiBGWEZBX0xPQ0FMRVNFVCkpDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCkgPT0gImRhdGFzZXRzIiAmJiAhKGZsYWcgJiBGWEZBX0RBVEFTRVRTKSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAieG1wbWV0YSIgJiYgIShmbGFnICYgRlhGQV9YTVBNRVRBKSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAieGZkZiIgJiYgIShmbGFnICYgRlhGQV9YRkRGKSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAiZm9ybSIgJiYgIShmbGFnICYgRlhGQV9GT1JNKSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAiZm9ybSIpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICAgICAgd3MuRnJvbUxvY2FsKCJmb3JtIik7DQorICAgICAgICBwRG9jSGFuZGxlci0+U2F2ZVBhY2thZ2UobV9wWEZBRG9jLCB3cywgJmZpbGVTdHJlYW0pOw0KKyAgICAgIH0gZWxzZSBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCkgPT0gImRhdGFzZXRzIikgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3M7DQorICAgICAgICB3cy5Gcm9tTG9jYWwoImRhdGFzZXRzIik7DQorICAgICAgICBwRG9jSGFuZGxlci0+U2F2ZVBhY2thZ2UobV9wWEZBRG9jLCB3cywgJmZpbGVTdHJlYW0pOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICAvLyBQREYsY3JlYXRvci4NCisgICAgICAgIC8vIFRPRE86DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQogDQotdm9pZCBDUERGWEZBX0RvY3VtZW50OjpfQ2xlYXJDaGFuZ2VNYXJrKCkNCi17DQotCWlmIChtX3BTREtEb2MpDQotCQltX3BTREtEb2MtPkNsZWFyQ2hhbmdlTWFyaygpOw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6X0NsZWFyQ2hhbmdlTWFyaygpIHsNCisgIGlmIChtX3BTREtEb2MpDQorICAgIG1fcFNES0RvYy0+Q2xlYXJDaGFuZ2VNYXJrKCk7DQogfQ0KIA0KLXZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6X1RvWEZBQ29udGVudEZsYWdzKENGWF9XaWRlU3RyaW5nIGNzU3JjQ29udGVudCwgRlBERl9EV09SRCYgZmxhZykNCi17DQotCWlmIChjc1NyY0NvbnRlbnQuRmluZChMIiBjb25maWcgIiwgMCkgIT0gLTEpDQotCQlmbGFnIHw9IEZYRkFfQ09ORklHOw0KLQlpZiAoY3NTcmNDb250ZW50LkZpbmQoTCIgdGVtcGxhdGUgIiwgMCkgIT0gLTEpDQotCQlmbGFnICB8PSBGWEZBX1RFTVBMQVRFOw0KLQlpZiAoY3NTcmNDb250ZW50LkZpbmQoTCIgbG9jYWxlU2V0ICIsIDApICE9IC0xKQ0KLQkJZmxhZyAgfD0gRlhGQV9MT0NBTEVTRVQ7DQotCWlmIChjc1NyY0NvbnRlbnQuRmluZChMIiBkYXRhc2V0cyAiLCAwKSAhPSAtMSkNCi0JCWZsYWcgIHw9IEZYRkFfREFUQVNFVFM7DQotCWlmIChjc1NyY0NvbnRlbnQuRmluZChMIiB4bXBtZXRhICIsIDApICE9IC0xKQ0KLQkJZmxhZyAgfD0gRlhGQV9YTVBNRVRBOw0KLQlpZiAoY3NTcmNDb250ZW50LkZpbmQoTCIgeGZkZiAiLCAwKSAhPSAtMSkNCi0JCWZsYWcgIHw9IEZYRkFfWEZERjsNCi0JaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIGZvcm0gIiwgMCkgIT0gLTEpDQotCQlmbGFnICB8PSBGWEZBX0ZPUk07DQotCWlmIChmbGFnID09IDApDQotCQlmbGFnID0gRlhGQV9DT05GSUd8RlhGQV9URU1QTEFURXxGWEZBX0xPQ0FMRVNFVHxGWEZBX0RBVEFTRVRTfEZYRkFfWE1QTUVUQXxGWEZBX1hGREZ8RlhGQV9GT1JNOw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6X1RvWEZBQ29udGVudEZsYWdzKENGWF9XaWRlU3RyaW5nIGNzU3JjQ29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEJiBmbGFnKSB7DQorICBpZiAoY3NTcmNDb250ZW50LkZpbmQoTCIgY29uZmlnICIsIDApICE9IC0xKQ0KKyAgICBmbGFnIHw9IEZYRkFfQ09ORklHOw0KKyAgaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIHRlbXBsYXRlICIsIDApICE9IC0xKQ0KKyAgICBmbGFnIHw9IEZYRkFfVEVNUExBVEU7DQorICBpZiAoY3NTcmNDb250ZW50LkZpbmQoTCIgbG9jYWxlU2V0ICIsIDApICE9IC0xKQ0KKyAgICBmbGFnIHw9IEZYRkFfTE9DQUxFU0VUOw0KKyAgaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIGRhdGFzZXRzICIsIDApICE9IC0xKQ0KKyAgICBmbGFnIHw9IEZYRkFfREFUQVNFVFM7DQorICBpZiAoY3NTcmNDb250ZW50LkZpbmQoTCIgeG1wbWV0YSAiLCAwKSAhPSAtMSkNCisgICAgZmxhZyB8PSBGWEZBX1hNUE1FVEE7DQorICBpZiAoY3NTcmNDb250ZW50LkZpbmQoTCIgeGZkZiAiLCAwKSAhPSAtMSkNCisgICAgZmxhZyB8PSBGWEZBX1hGREY7DQorICBpZiAoY3NTcmNDb250ZW50LkZpbmQoTCIgZm9ybSAiLCAwKSAhPSAtMSkNCisgICAgZmxhZyB8PSBGWEZBX0ZPUk07DQorICBpZiAoZmxhZyA9PSAwKQ0KKyAgICBmbGFnID0gRlhGQV9DT05GSUcgfCBGWEZBX1RFTVBMQVRFIHwgRlhGQV9MT0NBTEVTRVQgfCBGWEZBX0RBVEFTRVRTIHwNCisgICAgICAgICAgIEZYRkFfWE1QTUVUQSB8IEZYRkFfWEZERiB8IEZYRkFfRk9STTsNCiB9DQotRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpfTWFpbFRvSW5mbyhDRlhfV2lkZVN0cmluZyYgY3NVUkwsIENGWF9XaWRlU3RyaW5nJiBjc1RvQWRkcmVzcywgQ0ZYX1dpZGVTdHJpbmcmIGNzQ0NBZGRyZXNzLCBDRlhfV2lkZVN0cmluZyYgY3NCQ0NBZGRyZXNzLCBDRlhfV2lkZVN0cmluZyYgY3NTdWJqZWN0LCBDRlhfV2lkZVN0cmluZyYgY3NNc2cpDQotew0KLQlDRlhfV2lkZVN0cmluZyBzcmNVUkwgPSBjc1VSTDsNCi0Jc3JjVVJMLlRyaW1MZWZ0KCk7DQotCWlmICgwICE9IHNyY1VSTC5MZWZ0KDcpLkNvbXBhcmVOb0Nhc2UoTCJtYWlsdG86IikpDQotCQlyZXR1cm4gRkFMU0U7DQotCWludCBwb3MgPSBzcmNVUkwuRmluZChMJz8nLDApOw0KLQlDRlhfV2lkZVN0cmluZyB0bXA7DQotCWlmIChwb3MgPT0gLTEpIHsNCi0JCXBvcyA9IHNyY1VSTC5GaW5kKEwnQCcsMCk7DQotCQlpZiAocG9zID09IC0xKQ0KLQkJCXJldHVybiBGQUxTRTsNCi0JCWVsc2UNCi0JCXsNCi0JCQl0bXAgPSBzcmNVUkwuUmlnaHQoY3NVUkwuR2V0TGVuZ3RoKCktNyk7DQotCQkJdG1wLlRyaW1MZWZ0KCk7DQotCQkJdG1wLlRyaW1SaWdodCgpOw0KLQkJfQ0KLQl9IGVsc2Ugew0KLQkJdG1wID0gc3JjVVJMLkxlZnQocG9zKTsNCi0JCXRtcCA9IHRtcC5SaWdodCh0bXAuR2V0TGVuZ3RoKCktNyk7DQotCQl0bXAuVHJpbUxlZnQoKTsNCi0JCXRtcC5UcmltUmlnaHQoKTsNCi0JfQ0KLQkNCi0JY3NUb0FkZHJlc3MgPSB0bXA7DQotCQ0KLQlzcmNVUkwgPSBzcmNVUkwuUmlnaHQoc3JjVVJMLkdldExlbmd0aCgpLShwb3MrMSkpOw0KLQl3aGlsZSAoCSFzcmNVUkwuSXNFbXB0eSgpICkNCi0Jew0KLQkJc3JjVVJMLlRyaW1MZWZ0KCk7DQotCQlzcmNVUkwuVHJpbVJpZ2h0KCk7DQotCQlwb3MgPSBzcmNVUkwuRmluZChMJyYnLDApOw0KLQkJaWYgKHBvcyA9PSAtMSkNCi0JCQl0bXAgPSBzcmNVUkw7DQotCQllbHNlDQotCQkJdG1wID0gc3JjVVJMLkxlZnQocG9zKTsNCi0JCQ0KLQkJdG1wLlRyaW1MZWZ0KCk7DQotCQl0bXAuVHJpbVJpZ2h0KCk7DQotCQlpZiAodG1wLkdldExlbmd0aCgpID49IDMgJiYgMCA9PSB0bXAuTGVmdCgzKS5Db21wYXJlTm9DYXNlKEwiY2M9IikgKQ0KLQkJew0KLQkJCXRtcCA9IHRtcC5SaWdodCh0bXAuR2V0TGVuZ3RoKCktMyk7DQotCQkJaWYgKCFjc0NDQWRkcmVzcy5Jc0VtcHR5KCkpDQotCQkJCWNzQ0NBZGRyZXNzICs9IEwnOyc7DQotCQkJY3NDQ0FkZHJlc3MgKz0gdG1wOw0KLQkJCQ0KLQkJfSANCi0JCWVsc2UgaWYgKHRtcC5HZXRMZW5ndGgoKSA+PSA0ICYmIDAgPT0gdG1wLkxlZnQoNCkuQ29tcGFyZU5vQ2FzZShMImJjYz0iKSkNCi0JCXsNCi0JCQl0bXAgPSB0bXAuUmlnaHQodG1wLkdldExlbmd0aCgpIC0gNCk7DQotCQkJaWYgKCFjc0JDQ0FkZHJlc3MuSXNFbXB0eSgpKQ0KLQkJCQljc0JDQ0FkZHJlc3MgKz0gTCc7JzsNCi0JCQljc0JDQ0FkZHJlc3MgKz0gdG1wOw0KLQkJfQ0KLQkJZWxzZSBpZiAodG1wLkdldExlbmd0aCgpID49IDggJiYgMCA9PXRtcC5MZWZ0KDgpLkNvbXBhcmVOb0Nhc2UoTCJzdWJqZWN0PSIpICkNCi0JCXsNCi0JCQl0bXA9dG1wLlJpZ2h0KHRtcC5HZXRMZW5ndGgoKS04KTsNCi0JCQljc1N1YmplY3QgKz0gdG1wOw0KLQkJfQ0KLQkJZWxzZSBpZih0bXAuR2V0TGVuZ3RoKCkgPj0gNSAmJiAwID09dG1wLkxlZnQoNSkuQ29tcGFyZU5vQ2FzZShMImJvZHk9IikgKQ0KLQkJew0KLQkJCXRtcD10bXAuUmlnaHQodG1wLkdldExlbmd0aCgpIC0gNSk7DQotCQkJY3NNc2cgKz0gdG1wOw0KLQkJfQ0KLQkJaWYgKHBvcyA9PSAtMSkNCi0JCQlzcmNVUkwgPSBMIiI7DQotCQllbHNlDQotCQkJc3JjVVJMID0gc3JjVVJMLlJpZ2h0KGNzVVJMLkdldExlbmd0aCgpLShwb3MrMSkpOw0KLQl9DQotCWNzVG9BZGRyZXNzLlJlcGxhY2UoTCIsIiwgTCI7Iik7DQotCWNzQ0NBZGRyZXNzLlJlcGxhY2UoTCIsIiwgTCI7Iik7DQotCWNzQkNDQWRkcmVzcy5SZXBsYWNlKEwiLCIsIEwiOyIpOw0KLQlyZXR1cm4gVFJVRTsNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6Ol9NYWlsVG9JbmZvKENGWF9XaWRlU3RyaW5nJiBjc1VSTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1RvQWRkcmVzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc0NDQWRkcmVzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc0JDQ0FkZHJlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NTdWJqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzTXNnKSB7DQorICBDRlhfV2lkZVN0cmluZyBzcmNVUkwgPSBjc1VSTDsNCisgIHNyY1VSTC5UcmltTGVmdCgpOw0KKyAgaWYgKDAgIT0gc3JjVVJMLkxlZnQoNykuQ29tcGFyZU5vQ2FzZShMIm1haWx0bzoiKSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaW50IHBvcyA9IHNyY1VSTC5GaW5kKEwnPycsIDApOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgdG1wOw0KKyAgaWYgKHBvcyA9PSAtMSkgew0KKyAgICBwb3MgPSBzcmNVUkwuRmluZChMJ0AnLCAwKTsNCisgICAgaWYgKHBvcyA9PSAtMSkNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIGVsc2Ugew0KKyAgICAgIHRtcCA9IHNyY1VSTC5SaWdodChjc1VSTC5HZXRMZW5ndGgoKSAtIDcpOw0KKyAgICAgIHRtcC5UcmltTGVmdCgpOw0KKyAgICAgIHRtcC5UcmltUmlnaHQoKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgdG1wID0gc3JjVVJMLkxlZnQocG9zKTsNCisgICAgdG1wID0gdG1wLlJpZ2h0KHRtcC5HZXRMZW5ndGgoKSAtIDcpOw0KKyAgICB0bXAuVHJpbUxlZnQoKTsNCisgICAgdG1wLlRyaW1SaWdodCgpOw0KKyAgfQ0KKw0KKyAgY3NUb0FkZHJlc3MgPSB0bXA7DQorDQorICBzcmNVUkwgPSBzcmNVUkwuUmlnaHQoc3JjVVJMLkdldExlbmd0aCgpIC0gKHBvcyArIDEpKTsNCisgIHdoaWxlICghc3JjVVJMLklzRW1wdHkoKSkgew0KKyAgICBzcmNVUkwuVHJpbUxlZnQoKTsNCisgICAgc3JjVVJMLlRyaW1SaWdodCgpOw0KKyAgICBwb3MgPSBzcmNVUkwuRmluZChMJyYnLCAwKTsNCisgICAgaWYgKHBvcyA9PSAtMSkNCisgICAgICB0bXAgPSBzcmNVUkw7DQorICAgIGVsc2UNCisgICAgICB0bXAgPSBzcmNVUkwuTGVmdChwb3MpOw0KKw0KKyAgICB0bXAuVHJpbUxlZnQoKTsNCisgICAgdG1wLlRyaW1SaWdodCgpOw0KKyAgICBpZiAodG1wLkdldExlbmd0aCgpID49IDMgJiYgMCA9PSB0bXAuTGVmdCgzKS5Db21wYXJlTm9DYXNlKEwiY2M9IikpIHsNCisgICAgICB0bXAgPSB0bXAuUmlnaHQodG1wLkdldExlbmd0aCgpIC0gMyk7DQorICAgICAgaWYgKCFjc0NDQWRkcmVzcy5Jc0VtcHR5KCkpDQorICAgICAgICBjc0NDQWRkcmVzcyArPSBMJzsnOw0KKyAgICAgIGNzQ0NBZGRyZXNzICs9IHRtcDsNCisNCisgICAgfSBlbHNlIGlmICh0bXAuR2V0TGVuZ3RoKCkgPj0gNCAmJg0KKyAgICAgICAgICAgICAgIDAgPT0gdG1wLkxlZnQoNCkuQ29tcGFyZU5vQ2FzZShMImJjYz0iKSkgew0KKyAgICAgIHRtcCA9IHRtcC5SaWdodCh0bXAuR2V0TGVuZ3RoKCkgLSA0KTsNCisgICAgICBpZiAoIWNzQkNDQWRkcmVzcy5Jc0VtcHR5KCkpDQorICAgICAgICBjc0JDQ0FkZHJlc3MgKz0gTCc7JzsNCisgICAgICBjc0JDQ0FkZHJlc3MgKz0gdG1wOw0KKyAgICB9IGVsc2UgaWYgKHRtcC5HZXRMZW5ndGgoKSA+PSA4ICYmDQorICAgICAgICAgICAgICAgMCA9PSB0bXAuTGVmdCg4KS5Db21wYXJlTm9DYXNlKEwic3ViamVjdD0iKSkgew0KKyAgICAgIHRtcCA9IHRtcC5SaWdodCh0bXAuR2V0TGVuZ3RoKCkgLSA4KTsNCisgICAgICBjc1N1YmplY3QgKz0gdG1wOw0KKyAgICB9IGVsc2UgaWYgKHRtcC5HZXRMZW5ndGgoKSA+PSA1ICYmDQorICAgICAgICAgICAgICAgMCA9PSB0bXAuTGVmdCg1KS5Db21wYXJlTm9DYXNlKEwiYm9keT0iKSkgew0KKyAgICAgIHRtcCA9IHRtcC5SaWdodCh0bXAuR2V0TGVuZ3RoKCkgLSA1KTsNCisgICAgICBjc01zZyArPSB0bXA7DQorICAgIH0NCisgICAgaWYgKHBvcyA9PSAtMSkNCisgICAgICBzcmNVUkwgPSBMIiI7DQorICAgIGVsc2UNCisgICAgICBzcmNVUkwgPSBzcmNVUkwuUmlnaHQoY3NVUkwuR2V0TGVuZ3RoKCkgLSAocG9zICsgMSkpOw0KKyAgfQ0KKyAgY3NUb0FkZHJlc3MuUmVwbGFjZShMIiwiLCBMIjsiKTsNCisgIGNzQ0NBZGRyZXNzLlJlcGxhY2UoTCIsIiwgTCI7Iik7DQorICBjc0JDQ0FkZHJlc3MuUmVwbGFjZShMIiwiLCBMIjsiKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCiANCi1GWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6Ol9TdWJtaXREYXRhKElYRkFfRG9jKiBoRG9jLCBDWEZBX1N1Ym1pdCBzdWJtaXQpDQotew0KLQlDRlhfV2lkZVN0cmluZ0MgY3NVUkxDOw0KLQlzdWJtaXQuR2V0U3VibWl0VGFyZ2V0KGNzVVJMQyk7DQotCUNGWF9XaWRlU3RyaW5nIGNzVVJMID0gY3NVUkxDOw0KLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCi0JaWYgKHBFbnYgPT0gTlVMTCkNCi0JCXJldHVybiBGQUxTRTsNCi0JaWYgKGNzVVJMLklzRW1wdHkoKSl7CSANCi0JCUNGWF9XaWRlU3RyaW5nIHdzOw0KLQkJd3MuRnJvbUxvY2FsKCJTdWJtaXQgY2FuY2VsbGVkLiIpOw0KLQkJQ0ZYX0J5dGVTdHJpbmcgYnMgPSB3cy5VVEYxNkxFX0VuY29kZSgpOw0KLQkJaW50IGxlbiA9IGJzLkdldExlbmd0aCgpL3NpemVvZih1bnNpZ25lZCBzaG9ydCk7DQotCQlwRW52LT5GRklfQWxlcnQoKEZQREZfV0lERVNUUklORylicy5HZXRCdWZmZXIobGVuKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpLCAoRlBERl9XSURFU1RSSU5HKUwiIiwgMCwgNCk7DQotCQlicy5SZWxlYXNlQnVmZmVyKGxlbipzaXplb2YodW5zaWduZWQgc2hvcnQpKTsNCi0JCXJldHVybiBGQUxTRTsNCi0JfQ0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6X1N1Ym1pdERhdGEoSVhGQV9Eb2MqIGhEb2MsIENYRkFfU3VibWl0IHN1Ym1pdCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmdDIGNzVVJMQzsNCisgIHN1Ym1pdC5HZXRTdWJtaXRUYXJnZXQoY3NVUkxDKTsNCisgIENGWF9XaWRlU3RyaW5nIGNzVVJMID0gY3NVUkxDOw0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorICBpZiAocEVudiA9PSBOVUxMKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpZiAoY3NVUkwuSXNFbXB0eSgpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICB3cy5Gcm9tTG9jYWwoIlN1Ym1pdCBjYW5jZWxsZWQuIik7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzID0gd3MuVVRGMTZMRV9FbmNvZGUoKTsNCisgICAgaW50IGxlbiA9IGJzLkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsNCisgICAgcEVudi0+RkZJX0FsZXJ0KChGUERGX1dJREVTVFJJTkcpYnMuR2V0QnVmZmVyKGxlbiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpLA0KKyAgICAgICAgICAgICAgICAgICAgKEZQREZfV0lERVNUUklORylMIiIsIDAsIDQpOw0KKyAgICBicy5SZWxlYXNlQnVmZmVyKGxlbiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQogDQotCUZQREZfQk9PTCBiUmV0ID0gVFJVRTsNCi0JRlBERl9GSUxFSEFORExFUiogcEZpbGVIYW5kbGVyID0gTlVMTDsNCi0JaW50IGZpbGVGbGFnID0gLTE7DQorICBGUERGX0JPT0wgYlJldCA9IFRSVUU7DQorICBGUERGX0ZJTEVIQU5ETEVSKiBwRmlsZUhhbmRsZXIgPSBOVUxMOw0KKyAgaW50IGZpbGVGbGFnID0gLTE7DQogDQotCWlmIChzdWJtaXQuR2V0U3VibWl0Rm9ybWF0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fWGRwKQ0KLQl7DQotCQlDRlhfV2lkZVN0cmluZ0MgY3NDb250ZW50QzsNCi0JCXN1Ym1pdC5HZXRTdWJtaXRYRFBDb250ZW50KGNzQ29udGVudEMpOw0KLQkJQ0ZYX1dpZGVTdHJpbmcgY3NDb250ZW50Ow0KLQkJY3NDb250ZW50ID0gY3NDb250ZW50Qy5HZXRQdHIoKTsNCi0JCWNzQ29udGVudC5UcmltTGVmdCgpOw0KLQkJY3NDb250ZW50LlRyaW1SaWdodCgpOw0KLQkJQ0ZYX1dpZGVTdHJpbmcgc3BhY2U7DQotCQlzcGFjZS5Gcm9tTG9jYWwoIiAiKTsNCi0JCWNzQ29udGVudCA9IHNwYWNlICsgY3NDb250ZW50ICsgc3BhY2U7DQotCQlGUERGX0RXT1JEIGZsYWcgPSAwOw0KLQkJaWYgKHN1Ym1pdC5Jc1N1Ym1pdEVtYmVkUERGKCkpDQotCQkJZmxhZyB8PSBGWEZBX1BERjsNCi0JCV9Ub1hGQUNvbnRlbnRGbGFncyhjc0NvbnRlbnQsIGZsYWcpOw0KLQkJcEZpbGVIYW5kbGVyID0gcEVudi0+RkZJX09wZW5GaWxlKEZYRkFfU0FWRUFTX1hEUCwgTlVMTCwgIndiIik7DQotCQlmaWxlRmxhZyA9IEZYRkFfU0FWRUFTX1hEUDsNCi0JCV9FeHBvcnRTdWJtaXRGaWxlKHBGaWxlSGFuZGxlciwgRlhGQV9TQVZFQVNfWERQLCAwLCBmbGFnKTsNCi0JfQ0KLQllbHNlIGlmIChzdWJtaXQuR2V0U3VibWl0Rm9ybWF0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fWG1sICkNCi0Jew0KLQkJcEZpbGVIYW5kbGVyID0gcEVudi0+RkZJX09wZW5GaWxlKEZYRkFfU0FWRUFTX1hNTCwgTlVMTCwgIndiIik7DQotCQlmaWxlRmxhZyA9IEZYRkFfU0FWRUFTX1hNTDsNCi0JCV9FeHBvcnRTdWJtaXRGaWxlKHBGaWxlSGFuZGxlciwgRlhGQV9TQVZFQVNfWE1MLCAwKTsNCi0JfQ0KLQllbHNlIGlmIChzdWJtaXQuR2V0U3VibWl0Rm9ybWF0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUGRmICkNCi0Jew0KLQkJCS8vY3NmaWxlbmFtZSA9IGNzRG9jTmFtZTsNCi0JfQ0KLQllbHNlIGlmIChzdWJtaXQuR2V0U3VibWl0Rm9ybWF0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fRm9ybWRhdGEgKQ0KLQl7DQotCQlyZXR1cm4gRkFMU0U7DQotCX0NCi0JZWxzZSBpZiAoc3VibWl0LkdldFN1Ym1pdEZvcm1hdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1VybGVuY29kZWQgKQ0KLQl7DQotCQlwRmlsZUhhbmRsZXIgPSBwRW52LT5GRklfT3BlbkZpbGUoRlhGQV9TQVZFQVNfWE1MLCBOVUxMLCAid2IiKTsNCi0JCWZpbGVGbGFnID0gRlhGQV9TQVZFQVNfWE1MOw0KLQkJX0V4cG9ydFN1Ym1pdEZpbGUocEZpbGVIYW5kbGVyLCBGWEZBX1NBVkVBU19YTUwsIDApOw0KLQl9DQotCWVsc2UgaWYgKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9YZmQgKQ0KLQl7DQotCQlyZXR1cm4gRkFMU0U7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQlyZXR1cm4gRkFMU0U7DQotCX0NCi0JaWYgKHBGaWxlSGFuZGxlciA9PSBOVUxMKQ0KLQkJcmV0dXJuIEZBTFNFOw0KLQlpZiAoMCA9PSBjc1VSTC5MZWZ0KDcpLkNvbXBhcmVOb0Nhc2UoTCJtYWlsdG86IikpDQotCXsNCi0JCUNGWF9XaWRlU3RyaW5nIGNzVG9BZGRyZXNzOyANCi0JCUNGWF9XaWRlU3RyaW5nIGNzQ0NBZGRyZXNzOw0KLQkJQ0ZYX1dpZGVTdHJpbmcgY3NCQ0NBZGRyZXNzOw0KLQkJQ0ZYX1dpZGVTdHJpbmcgY3NTdWJqZWN0Ow0KLQkJQ0ZYX1dpZGVTdHJpbmcgY3NNc2c7DQorICBpZiAoc3VibWl0LkdldFN1Ym1pdEZvcm1hdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1hkcCkgew0KKyAgICBDRlhfV2lkZVN0cmluZ0MgY3NDb250ZW50QzsNCisgICAgc3VibWl0LkdldFN1Ym1pdFhEUENvbnRlbnQoY3NDb250ZW50Qyk7DQorICAgIENGWF9XaWRlU3RyaW5nIGNzQ29udGVudDsNCisgICAgY3NDb250ZW50ID0gY3NDb250ZW50Qy5HZXRQdHIoKTsNCisgICAgY3NDb250ZW50LlRyaW1MZWZ0KCk7DQorICAgIGNzQ29udGVudC5UcmltUmlnaHQoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgc3BhY2U7DQorICAgIHNwYWNlLkZyb21Mb2NhbCgiICIpOw0KKyAgICBjc0NvbnRlbnQgPSBzcGFjZSArIGNzQ29udGVudCArIHNwYWNlOw0KKyAgICBGUERGX0RXT1JEIGZsYWcgPSAwOw0KKyAgICBpZiAoc3VibWl0LklzU3VibWl0RW1iZWRQREYoKSkNCisgICAgICBmbGFnIHw9IEZYRkFfUERGOw0KKyAgICBfVG9YRkFDb250ZW50RmxhZ3MoY3NDb250ZW50LCBmbGFnKTsNCisgICAgcEZpbGVIYW5kbGVyID0gcEVudi0+RkZJX09wZW5GaWxlKEZYRkFfU0FWRUFTX1hEUCwgTlVMTCwgIndiIik7DQorICAgIGZpbGVGbGFnID0gRlhGQV9TQVZFQVNfWERQOw0KKyAgICBfRXhwb3J0U3VibWl0RmlsZShwRmlsZUhhbmRsZXIsIEZYRkFfU0FWRUFTX1hEUCwgMCwgZmxhZyk7DQorICB9IGVsc2UgaWYgKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9YbWwpIHsNCisgICAgcEZpbGVIYW5kbGVyID0gcEVudi0+RkZJX09wZW5GaWxlKEZYRkFfU0FWRUFTX1hNTCwgTlVMTCwgIndiIik7DQorICAgIGZpbGVGbGFnID0gRlhGQV9TQVZFQVNfWE1MOw0KKyAgICBfRXhwb3J0U3VibWl0RmlsZShwRmlsZUhhbmRsZXIsIEZYRkFfU0FWRUFTX1hNTCwgMCk7DQorICB9IGVsc2UgaWYgKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9QZGYpIHsNCisgICAgLy8gY3NmaWxlbmFtZSA9IGNzRG9jTmFtZTsNCisgIH0gZWxzZSBpZiAoc3VibWl0LkdldFN1Ym1pdEZvcm1hdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX0Zvcm1kYXRhKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0gZWxzZSBpZiAoc3VibWl0LkdldFN1Ym1pdEZvcm1hdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1VybGVuY29kZWQpIHsNCisgICAgcEZpbGVIYW5kbGVyID0gcEVudi0+RkZJX09wZW5GaWxlKEZYRkFfU0FWRUFTX1hNTCwgTlVMTCwgIndiIik7DQorICAgIGZpbGVGbGFnID0gRlhGQV9TQVZFQVNfWE1MOw0KKyAgICBfRXhwb3J0U3VibWl0RmlsZShwRmlsZUhhbmRsZXIsIEZYRkFfU0FWRUFTX1hNTCwgMCk7DQorICB9IGVsc2UgaWYgKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9YZmQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBGaWxlSGFuZGxlciA9PSBOVUxMKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpZiAoMCA9PSBjc1VSTC5MZWZ0KDcpLkNvbXBhcmVOb0Nhc2UoTCJtYWlsdG86IikpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NUb0FkZHJlc3M7DQorICAgIENGWF9XaWRlU3RyaW5nIGNzQ0NBZGRyZXNzOw0KKyAgICBDRlhfV2lkZVN0cmluZyBjc0JDQ0FkZHJlc3M7DQorICAgIENGWF9XaWRlU3RyaW5nIGNzU3ViamVjdDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NNc2c7DQogDQotCQliUmV0ID0gX01haWxUb0luZm8oY3NVUkwsIGNzVG9BZGRyZXNzLCBjc0NDQWRkcmVzcywgY3NCQ0NBZGRyZXNzLCBjc1N1YmplY3QsIGNzTXNnKTsNCi0JCWlmIChGQUxTRSA9PSBiUmV0KQ0KLQkJCXJldHVybiBGQUxTRTsNCisgICAgYlJldCA9IF9NYWlsVG9JbmZvKGNzVVJMLCBjc1RvQWRkcmVzcywgY3NDQ0FkZHJlc3MsIGNzQkNDQWRkcmVzcywgY3NTdWJqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgY3NNc2cpOw0KKyAgICBpZiAoRkFMU0UgPT0gYlJldCkNCisgICAgICByZXR1cm4gRkFMU0U7DQogDQotCQlDRlhfQnl0ZVN0cmluZyBic1RvID0gQ0ZYX1dpZGVTdHJpbmcoY3NUb0FkZHJlc3MpLlVURjE2TEVfRW5jb2RlKCk7DQotCQlDRlhfQnl0ZVN0cmluZyBic0NDID0gQ0ZYX1dpZGVTdHJpbmcoY3NDQ0FkZHJlc3MpLlVURjE2TEVfRW5jb2RlKCk7DQotCQlDRlhfQnl0ZVN0cmluZyBic0JjYyA9IENGWF9XaWRlU3RyaW5nKGNzQkNDQWRkcmVzcykuVVRGMTZMRV9FbmNvZGUoKTsNCi0JCUNGWF9CeXRlU3RyaW5nIGJzU3ViamVjdCA9IENGWF9XaWRlU3RyaW5nKGNzU3ViamVjdCkuVVRGMTZMRV9FbmNvZGUoKTsNCi0JCUNGWF9CeXRlU3RyaW5nIGJzTXNnID0gQ0ZYX1dpZGVTdHJpbmcoY3NNc2cpLlVURjE2TEVfRW5jb2RlKCk7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzVG8gPSBDRlhfV2lkZVN0cmluZyhjc1RvQWRkcmVzcykuVVRGMTZMRV9FbmNvZGUoKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDQyA9IENGWF9XaWRlU3RyaW5nKGNzQ0NBZGRyZXNzKS5VVEYxNkxFX0VuY29kZSgpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0JjYyA9IENGWF9XaWRlU3RyaW5nKGNzQkNDQWRkcmVzcykuVVRGMTZMRV9FbmNvZGUoKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNTdWJqZWN0ID0gQ0ZYX1dpZGVTdHJpbmcoY3NTdWJqZWN0KS5VVEYxNkxFX0VuY29kZSgpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic01zZyA9IENGWF9XaWRlU3RyaW5nKGNzTXNnKS5VVEYxNkxFX0VuY29kZSgpOw0KIA0KLQkJRlBERl9XSURFU1RSSU5HIHBUbyA9IChGUERGX1dJREVTVFJJTkcpYnNUby5HZXRCdWZmZXIoYnNUby5HZXRMZW5ndGgoKSk7DQotCQlGUERGX1dJREVTVFJJTkcgcENDID0gKEZQREZfV0lERVNUUklORylic0NDLkdldEJ1ZmZlcihic0NDLkdldExlbmd0aCgpKTsNCi0JCUZQREZfV0lERVNUUklORyBwQmNjID0gKEZQREZfV0lERVNUUklORylic0JjYy5HZXRCdWZmZXIoYnNCY2MuR2V0TGVuZ3RoKCkpOw0KLQkJRlBERl9XSURFU1RSSU5HIHBTdWJqZWN0ID0gKEZQREZfV0lERVNUUklORylic1N1YmplY3QuR2V0QnVmZmVyKGJzU3ViamVjdC5HZXRMZW5ndGgoKSk7DQotCQlGUERGX1dJREVTVFJJTkcgcE1zZyA9IChGUERGX1dJREVTVFJJTkcpYnNNc2cuR2V0QnVmZmVyKGJzTXNnLkdldExlbmd0aCgpKTsNCisgICAgRlBERl9XSURFU1RSSU5HIHBUbyA9IChGUERGX1dJREVTVFJJTkcpYnNUby5HZXRCdWZmZXIoYnNUby5HZXRMZW5ndGgoKSk7DQorICAgIEZQREZfV0lERVNUUklORyBwQ0MgPSAoRlBERl9XSURFU1RSSU5HKWJzQ0MuR2V0QnVmZmVyKGJzQ0MuR2V0TGVuZ3RoKCkpOw0KKyAgICBGUERGX1dJREVTVFJJTkcgcEJjYyA9IChGUERGX1dJREVTVFJJTkcpYnNCY2MuR2V0QnVmZmVyKGJzQmNjLkdldExlbmd0aCgpKTsNCisgICAgRlBERl9XSURFU1RSSU5HIHBTdWJqZWN0ID0NCisgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnNTdWJqZWN0LkdldEJ1ZmZlcihic1N1YmplY3QuR2V0TGVuZ3RoKCkpOw0KKyAgICBGUERGX1dJREVTVFJJTkcgcE1zZyA9IChGUERGX1dJREVTVFJJTkcpYnNNc2cuR2V0QnVmZmVyKGJzTXNnLkdldExlbmd0aCgpKTsNCiANCi0JCXBFbnYtPkZGSV9FbWFpbFRvKHBGaWxlSGFuZGxlciwgcFRvLCBwU3ViamVjdCwgcENDLCBwQmNjLCBwTXNnKTsNCi0JCWJzVG8uUmVsZWFzZUJ1ZmZlcigpOw0KLQkJYnNDQy5SZWxlYXNlQnVmZmVyKCk7DQotCQlic0JjYy5SZWxlYXNlQnVmZmVyKCk7DQotCQlic1N1YmplY3QuUmVsZWFzZUJ1ZmZlcigpOw0KLQkJYnNNc2cuUmVsZWFzZUJ1ZmZlcigpOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJLy9odHRwoaJmdHANCi0JCUNGWF9XaWRlU3RyaW5nIHdzOw0KLQkJQ0ZYX0J5dGVTdHJpbmcgYnMgPSBjc1VSTC5VVEYxNkxFX0VuY29kZSgpOw0KLQkJaW50IGxlbiA9IGJzLkdldExlbmd0aCgpL3NpemVvZih1bnNpZ25lZCBzaG9ydCk7DQotCQlwRW52LT5GRklfVXBsb2FkVG8ocEZpbGVIYW5kbGVyLCBmaWxlRmxhZywgKEZQREZfV0lERVNUUklORylicy5HZXRCdWZmZXIobGVuKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpKTsNCi0JCWJzLlJlbGVhc2VCdWZmZXIobGVuKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOw0KLQl9DQorICAgIHBFbnYtPkZGSV9FbWFpbFRvKHBGaWxlSGFuZGxlciwgcFRvLCBwU3ViamVjdCwgcENDLCBwQmNjLCBwTXNnKTsNCisgICAgYnNUby5SZWxlYXNlQnVmZmVyKCk7DQorICAgIGJzQ0MuUmVsZWFzZUJ1ZmZlcigpOw0KKyAgICBic0JjYy5SZWxlYXNlQnVmZmVyKCk7DQorICAgIGJzU3ViamVjdC5SZWxlYXNlQnVmZmVyKCk7DQorICAgIGJzTXNnLlJlbGVhc2VCdWZmZXIoKTsNCisgIH0gZWxzZSB7DQorICAgIC8vIGh0dHChomZ0cA0KKyAgICBDRlhfV2lkZVN0cmluZyB3czsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSBjc1VSTC5VVEYxNkxFX0VuY29kZSgpOw0KKyAgICBpbnQgbGVuID0gYnMuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpOw0KKyAgICBwRW52LT5GRklfVXBsb2FkVG8oDQorICAgICAgICBwRmlsZUhhbmRsZXIsIGZpbGVGbGFnLA0KKyAgICAgICAgKEZQREZfV0lERVNUUklORylicy5HZXRCdWZmZXIobGVuICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpOw0KKyAgICBicy5SZWxlYXNlQnVmZmVyKGxlbiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOw0KKyAgfQ0KIA0KLQlyZXR1cm4gYlJldDsNCisgIHJldHVybiBiUmV0Ow0KIH0NCiANCi1GWF9CT09MCUNQREZYRkFfRG9jdW1lbnQ6OlNldEdsb2JhbFByb3BlcnR5KElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLQlpZiAoaERvYyAhPSBtX3BYRkFEb2MpDQotCQlyZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpTZXRHbG9iYWxQcm9wZXJ0eShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIGlmIChoRG9jICE9IG1fcFhGQURvYykNCisgICAgcmV0dXJuIEZBTFNFOw0KIA0KLQlpZiAobV9wU0RLRG9jICYmIG1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpKSANCi0JCXJldHVybiBtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKS0+U2V0SFZhbHVlQnlOYW1lKHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQotCXJldHVybiBGQUxTRTsNCisgIGlmIChtX3BTREtEb2MgJiYgbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCkpDQorICAgIHJldHVybiBtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKS0+U2V0SFZhbHVlQnlOYW1lKHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhWYWx1ZSk7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wJQ1BERlhGQV9Eb2N1bWVudDo6R2V0UERGU2NyaXB0T2JqZWN0KElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KLXsNCi0JaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KLQkJcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6R2V0UERGU2NyaXB0T2JqZWN0KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKyAgICByZXR1cm4gRkFMU0U7DQogDQotCWlmICghbV9wU0RLRG9jIHx8ICFtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKSkNCi0JCXJldHVybiBGQUxTRTsNCisgIGlmICghbV9wU0RLRG9jIHx8ICFtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKSkNCisgICAgcmV0dXJuIEZBTFNFOw0KIA0KLQlpZiAoIW1fcEpTQ29udGV4dCkNCi0Jew0KLQkJbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCktPlNldFJlYWRlckRvY3VtZW50KG1fcFNES0RvYyk7DQotCQltX3BKU0NvbnRleHQgPW1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpLT5OZXdDb250ZXh0KCk7DQotCX0NCisgIGlmICghbV9wSlNDb250ZXh0KSB7DQorICAgIG1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpLT5TZXRSZWFkZXJEb2N1bWVudChtX3BTREtEb2MpOw0KKyAgICBtX3BKU0NvbnRleHQgPSBtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKS0+TmV3Q29udGV4dCgpOw0KKyAgfQ0KIA0KLQlyZXR1cm4gX0dldEhWYWx1ZUJ5TmFtZSh1dGY4TmFtZSwgaFZhbHVlLCBtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKSk7DQotDQorICByZXR1cm4gX0dldEhWYWx1ZUJ5TmFtZSh1dGY4TmFtZSwgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCkpOw0KIH0NCi1GWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6OkdldEdsb2JhbFByb3BlcnR5KElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLQlpZiAoaERvYyAhPSBtX3BYRkFEb2MpDQotCQlyZXR1cm4gRkFMU0U7DQotCWlmICghbV9wU0RLRG9jIHx8ICFtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKSkNCi0JCXJldHVybiBGQUxTRTsNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6OkdldEdsb2JhbFByb3BlcnR5KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpZiAoIW1fcFNES0RvYyB8fCAhbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCkpDQorICAgIHJldHVybiBGQUxTRTsNCiANCi0JaWYgKCFtX3BKU0NvbnRleHQpDQotCXsNCi0JCW1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpLT5TZXRSZWFkZXJEb2N1bWVudChtX3BTREtEb2MpOw0KLQkJbV9wSlNDb250ZXh0ID0gbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCktPk5ld0NvbnRleHQoKTsNCi0JfQ0KKyAgaWYgKCFtX3BKU0NvbnRleHQpIHsNCisgICAgbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCktPlNldFJlYWRlckRvY3VtZW50KG1fcFNES0RvYyk7DQorICAgIG1fcEpTQ29udGV4dCA9IG1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpLT5OZXdDb250ZXh0KCk7DQorICB9DQogDQotCXJldHVybiBfR2V0SFZhbHVlQnlOYW1lKHN6UHJvcE5hbWUsIGhWYWx1ZSwgbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCkpOw0KLQ0KKyAgcmV0dXJuIF9HZXRIVmFsdWVCeU5hbWUoc3pQcm9wTmFtZSwgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCkpOw0KIH0NCi1GWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6Ol9HZXRIVmFsdWVCeU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSwgSUZYSlNfUnVudGltZSogcnVuVGltZSkNCi17DQotCXJldHVybiBydW5UaW1lLT5HZXRIVmFsdWVCeU5hbWUodXRmOE5hbWUsIGhWYWx1ZSk7DQorRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpfR2V0SFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWEpTX1J1bnRpbWUqIHJ1blRpbWUpIHsNCisgIHJldHVybiBydW5UaW1lLT5HZXRIVmFsdWVCeU5hbWUodXRmOE5hbWUsIGhWYWx1ZSk7DQogfQ0KLQ0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmNwcAppbmRleCA3Y2Q3MmRlLi5mOGZiYmQ0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuY3BwCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQotIA0KKw0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQogDQogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCINCkBAIC0xMCwyNjQgKzEwLDI0OSBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIg0KICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgiDQogDQotQ1BERlhGQV9QYWdlOjpDUERGWEZBX1BhZ2UoQ1BERlhGQV9Eb2N1bWVudCogcERvYywgaW50IHBhZ2VfaW5kZXgpIDoNCi0JbV9wUERGUGFnZShOVUxMKSwNCi0JbV9wWEZBUGFnZVZpZXcoTlVMTCksDQotCW1faVBhZ2VJbmRleChwYWdlX2luZGV4KSwNCi0JbV9wRG9jdW1lbnQocERvYyksDQotCW1faVJlZigxKQ0KLXsNCitDUERGWEZBX1BhZ2U6OkNQREZYRkFfUGFnZShDUERGWEZBX0RvY3VtZW50KiBwRG9jLCBpbnQgcGFnZV9pbmRleCkNCisgICAgOiBtX3BQREZQYWdlKE5VTEwpLA0KKyAgICAgIG1fcFhGQVBhZ2VWaWV3KE5VTEwpLA0KKyAgICAgIG1faVBhZ2VJbmRleChwYWdlX2luZGV4KSwNCisgICAgICBtX3BEb2N1bWVudChwRG9jKSwNCisgICAgICBtX2lSZWYoMSkge30NCiANCitDUERGWEZBX1BhZ2U6On5DUERGWEZBX1BhZ2UoKSB7DQorICBpZiAobV9wUERGUGFnZSkNCisgICAgZGVsZXRlIG1fcFBERlBhZ2U7DQorICBtX3BQREZQYWdlID0gTlVMTDsNCisgIG1fcFhGQVBhZ2VWaWV3ID0gTlVMTDsNCiB9DQogDQotQ1BERlhGQV9QYWdlOjp+Q1BERlhGQV9QYWdlKCkNCi17DQotCWlmIChtX3BQREZQYWdlKQ0KLQkJZGVsZXRlIG1fcFBERlBhZ2U7DQotCW1fcFBERlBhZ2UgPSBOVUxMOw0KLQltX3BYRkFQYWdlVmlldyA9IE5VTEw7DQordm9pZCBDUERGWEZBX1BhZ2U6OlJlbGVhc2UoKSB7DQorICBtX2lSZWYtLTsNCisgIGlmIChtX2lSZWYgPiAwKQ0KKyAgICByZXR1cm47DQorDQorICBpZiAobV9wRG9jdW1lbnQpDQorICAgIG1fcERvY3VtZW50LT5SZW1vdmVQYWdlKHRoaXMpOw0KKw0KKyAgZGVsZXRlIHRoaXM7DQogfQ0KIA0KLXZvaWQgQ1BERlhGQV9QYWdlOjpSZWxlYXNlKCkNCi17DQotCW1faVJlZi0tOw0KLQlpZiAobV9pUmVmID4gMCkNCi0JCXJldHVybjsNCi0JDQotCWlmIChtX3BEb2N1bWVudCkNCi0JCW1fcERvY3VtZW50LT5SZW1vdmVQYWdlKHRoaXMpOw0KK0ZYX0JPT0wgQ1BERlhGQV9QYWdlOjpMb2FkUERGUGFnZSgpIHsNCisgIGlmICghbV9wRG9jdW1lbnQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIENQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBtX3BEb2N1bWVudC0+R2V0UERGRG9jKCk7DQorICBpZiAocFBERkRvYykgew0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBERkRvYy0+R2V0UGFnZShtX2lQYWdlSW5kZXgpOw0KKyAgICBpZiAocERpY3QgPT0gTlVMTCkNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIGlmIChtX3BQREZQYWdlKSB7DQorICAgICAgaWYgKG1fcFBERlBhZ2UtPm1fcEZvcm1EaWN0ID09IHBEaWN0KQ0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQogDQotCWRlbGV0ZSB0aGlzOw0KKyAgICAgIGRlbGV0ZSBtX3BQREZQYWdlOw0KKyAgICAgIG1fcFBERlBhZ2UgPSBOVUxMOw0KKyAgICB9DQorDQorICAgIG1fcFBERlBhZ2UgPSBGWF9ORVcgQ1BERl9QYWdlOw0KKyAgICBtX3BQREZQYWdlLT5Mb2FkKHBQREZEb2MsIHBEaWN0KTsNCisgICAgbV9wUERGUGFnZS0+UGFyc2VDb250ZW50KCk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCiANCi1GWF9CT09MIENQREZYRkFfUGFnZTo6TG9hZFBERlBhZ2UoKQ0KLXsNCi0JaWYgKCFtX3BEb2N1bWVudCkgcmV0dXJuIEZBTFNFOw0KLQlDUERGX0RvY3VtZW50KiBwUERGRG9jID0gbV9wRG9jdW1lbnQtPkdldFBERkRvYygpOw0KLQlpZiAocFBERkRvYykNCi0Jew0KLQkJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQREZEb2MtPkdldFBhZ2UobV9pUGFnZUluZGV4KTsNCi0JCWlmIChwRGljdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7DQotCQlpZiAobV9wUERGUGFnZSkgew0KLQkJCWlmIChtX3BQREZQYWdlLT5tX3BGb3JtRGljdCA9PSBwRGljdCkNCi0JCQkJcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDUERGWEZBX1BhZ2U6OkxvYWRYRkFQYWdlVmlldygpIHsNCisgIGlmICghbV9wRG9jdW1lbnQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIElYRkFfRG9jKiBwWEZBRG9jID0gbV9wRG9jdW1lbnQtPkdldFhGQURvYygpOw0KKyAgaWYgKHBYRkFEb2MpIHsNCisgICAgSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldyA9IG1fcERvY3VtZW50LT5HZXRYRkFEb2NWaWV3KCk7DQorICAgIGlmICghcFhGQURvY1ZpZXcpDQorICAgICAgcmV0dXJuIEZBTFNFOw0KIA0KLQkJCWRlbGV0ZSBtX3BQREZQYWdlOw0KLQkJCW1fcFBERlBhZ2UgPSBOVUxMOw0KLQkJfQ0KKyAgICBJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwWEZBRG9jVmlldy0+R2V0UGFnZVZpZXcobV9pUGFnZUluZGV4KTsNCisgICAgaWYgKCFwUGFnZVZpZXcpDQorICAgICAgcmV0dXJuIEZBTFNFOw0KIA0KLQkJbV9wUERGUGFnZSA9IEZYX05FVyBDUERGX1BhZ2U7DQotCQltX3BQREZQYWdlLT5Mb2FkKHBQREZEb2MsIHBEaWN0KTsNCi0JCW1fcFBERlBhZ2UtPlBhcnNlQ29udGVudCgpOw0KLQkJcmV0dXJuIFRSVUU7DQotCX0NCisgICAgaWYgKG1fcFhGQVBhZ2VWaWV3KQ0KKyAgICAgIGlmIChtX3BYRkFQYWdlVmlldyA9PSBwUGFnZVZpZXcpDQorICAgICAgICByZXR1cm4gVFJVRTsNCiANCi0JcmV0dXJuIEZBTFNFOw0KKyAgICBtX3BYRkFQYWdlVmlldyA9IHBQYWdlVmlldzsNCisgICAgaW50IGlTdGF0dXMgPSBtX3BYRkFQYWdlVmlldy0+TG9hZFBhZ2VWaWV3KE5VTEwpOw0KKw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisNCisgIHJldHVybiBGQUxTRTsNCiB9DQogDQotRlhfQk9PTCBDUERGWEZBX1BhZ2U6OkxvYWRYRkFQYWdlVmlldygpDQotew0KLQlpZiAoIW1fcERvY3VtZW50KQ0KLQkJcmV0dXJuIEZBTFNFOw0KLQlJWEZBX0RvYyogcFhGQURvYyA9IG1fcERvY3VtZW50LT5HZXRYRkFEb2MoKTsNCi0JaWYgKHBYRkFEb2MpDQotCXsNCi0JCUlYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcgPSBtX3BEb2N1bWVudC0+R2V0WEZBRG9jVmlldygpOw0KLQkJaWYgKCFwWEZBRG9jVmlldykgDQotCQkJcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1BERlhGQV9QYWdlOjpMb2FkUGFnZSgpIHsNCisgIGlmICghbV9wRG9jdW1lbnQgfHwgbV9pUGFnZUluZGV4IDwgMCkNCisgICAgcmV0dXJuIEZBTFNFOw0KIA0KLQkJSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFhGQURvY1ZpZXctPkdldFBhZ2VWaWV3KG1faVBhZ2VJbmRleCk7DQotCQlpZiAoIXBQYWdlVmlldykNCi0JCQlyZXR1cm4gRkFMU0U7DQorICBpbnQgaURvY1R5cGUgPSBtX3BEb2N1bWVudC0+R2V0RG9jVHlwZSgpOw0KKyAgc3dpdGNoIChpRG9jVHlwZSkgew0KKyAgICBjYXNlIERPQ1RZUEVfUERGOg0KKyAgICBjYXNlIERPQ1RZUEVfU1RBVElDX1hGQTogew0KKyAgICAgIHJldHVybiBMb2FkUERGUGFnZSgpOw0KKyAgICB9DQorICAgIGNhc2UgRE9DVFlQRV9EWU5JTUlDX1hGQTogew0KKyAgICAgIHJldHVybiBMb2FkWEZBUGFnZVZpZXcoKTsNCisgICAgfQ0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCiANCi0JCWlmIChtX3BYRkFQYWdlVmlldykNCi0JCQlpZiAobV9wWEZBUGFnZVZpZXcgPT0gcFBhZ2VWaWV3KQ0KLQkJCQlyZXR1cm4gVFJVRTsNCi0NCi0JCW1fcFhGQVBhZ2VWaWV3ID0gcFBhZ2VWaWV3Ow0KLQkJaW50IGlTdGF0dXMgPSBtX3BYRkFQYWdlVmlldy0+TG9hZFBhZ2VWaWV3KE5VTEwpOw0KLQ0KLQkJcmV0dXJuIFRSVUU7DQotCX0NCi0NCi0JcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCiANCi1GWF9CT09MIENQREZYRkFfUGFnZTo6TG9hZFBhZ2UoKQ0KLXsNCi0JaWYgKCFtX3BEb2N1bWVudCB8fCBtX2lQYWdlSW5kZXggPCAwKQ0KLQkJcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1BERlhGQV9QYWdlOjpMb2FkUERGUGFnZShDUERGX0RpY3Rpb25hcnkqIHBhZ2VEaWN0KSB7DQorICBpZiAoIW1fcERvY3VtZW50IHx8IG1faVBhZ2VJbmRleCA8IDAgfHwgIXBhZ2VEaWN0KQ0KKyAgICByZXR1cm4gRkFMU0U7DQogDQotCWludCBpRG9jVHlwZSA9IG1fcERvY3VtZW50LT5HZXREb2NUeXBlKCk7DQotCXN3aXRjaCAoaURvY1R5cGUpDQotCXsNCi0JY2FzZSBET0NUWVBFX1BERjoNCi0JY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6DQotCQl7DQotCQkJcmV0dXJuIExvYWRQREZQYWdlKCk7DQotCQl9DQotCWNhc2UgRE9DVFlQRV9EWU5JTUlDX1hGQToNCi0JCXsNCi0JCQlyZXR1cm4gTG9hZFhGQVBhZ2VWaWV3KCk7DQotCQl9DQotCWRlZmF1bHQ6DQotCQlyZXR1cm4gRkFMU0U7DQotCX0NCisgIGlmIChtX3BQREZQYWdlKQ0KKyAgICBkZWxldGUgbV9wUERGUGFnZTsNCiANCi0JcmV0dXJuIEZBTFNFOw0KKyAgbV9wUERGUGFnZSA9IEZYX05FVyBDUERGX1BhZ2UoKTsNCisgIG1fcFBERlBhZ2UtPkxvYWQobV9wRG9jdW1lbnQtPkdldFBERkRvYygpLCBwYWdlRGljdCk7DQorICBtX3BQREZQYWdlLT5QYXJzZUNvbnRlbnQoKTsNCisNCisgIHJldHVybiBUUlVFOw0KIH0NCiANCi1GWF9CT09MIENQREZYRkFfUGFnZTo6TG9hZFBERlBhZ2UoQ1BERl9EaWN0aW9uYXJ5KiBwYWdlRGljdCkNCi17DQotCWlmICghbV9wRG9jdW1lbnQgfHwgbV9pUGFnZUluZGV4IDwgMCB8fCAhcGFnZURpY3QpDQotCQlyZXR1cm4gRkFMU0U7DQorRlhfRkxPQVQgQ1BERlhGQV9QYWdlOjpHZXRQYWdlV2lkdGgoKSB7DQorICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7DQogDQotCWlmIChtX3BQREZQYWdlKQ0KLQkJZGVsZXRlIG1fcFBERlBhZ2U7DQorICBpZiAoIW1fcFBERlBhZ2UgJiYgIW1fcFhGQVBhZ2VWaWV3KQ0KKyAgICByZXR1cm4gMC4wZjsNCiANCi0JbV9wUERGUGFnZSA9IEZYX05FVyBDUERGX1BhZ2UoKTsNCi0JbV9wUERGUGFnZS0+TG9hZChtX3BEb2N1bWVudC0+R2V0UERGRG9jKCksIHBhZ2VEaWN0KTsNCi0JbV9wUERGUGFnZS0+UGFyc2VDb250ZW50KCk7DQorICBpbnQgbkRvY1R5cGUgPSBtX3BEb2N1bWVudC0+R2V0RG9jVHlwZSgpOw0KKyAgc3dpdGNoIChuRG9jVHlwZSkgew0KKyAgICBjYXNlIERPQ1RZUEVfRFlOSU1JQ19YRkE6IHsNCisgICAgICBpZiAobV9wWEZBUGFnZVZpZXcpIHsNCisgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICAgICAgbV9wWEZBUGFnZVZpZXctPkdldFBhZ2VWaWV3UmVjdChyZWN0KTsNCisgICAgICAgIHJldHVybiByZWN0LndpZHRoOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6DQorICAgIGNhc2UgRE9DVFlQRV9QREY6IHsNCisgICAgICBpZiAobV9wUERGUGFnZSkNCisgICAgICAgIHJldHVybiBtX3BQREZQYWdlLT5HZXRQYWdlV2lkdGgoKTsNCisgICAgfSBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gMC4wZjsNCisgIH0NCiANCi0JcmV0dXJuIFRSVUU7DQorICByZXR1cm4gMC4wZjsNCiB9DQogDQotRlhfRkxPQVQgQ1BERlhGQV9QYWdlOjpHZXRQYWdlV2lkdGgoKQ0KLXsNCi0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOw0KK0ZYX0ZMT0FUIENQREZYRkFfUGFnZTo6R2V0UGFnZUhlaWdodCgpIHsNCisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsNCiANCi0JaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykNCi0JCXJldHVybiAwLjBmOw0KKyAgaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykNCisgICAgcmV0dXJuIDAuMGY7DQogDQotCWludCBuRG9jVHlwZSA9IG1fcERvY3VtZW50LT5HZXREb2NUeXBlKCk7DQotCXN3aXRjaCAobkRvY1R5cGUpDQotCXsNCi0JY2FzZSBET0NUWVBFX0RZTklNSUNfWEZBOg0KLQkJew0KLQkJCWlmIChtX3BYRkFQYWdlVmlldykNCi0JCQl7DQotCQkJCUNGWF9SZWN0RiByZWN0Ow0KLQkJCQltX3BYRkFQYWdlVmlldy0+R2V0UGFnZVZpZXdSZWN0KHJlY3QpOw0KLQkJCQlyZXR1cm4gcmVjdC53aWR0aDsNCi0JCQl9DQotCQl9DQotCQlicmVhazsNCi0JY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6DQotCWNhc2UgRE9DVFlQRV9QREY6DQotCQl7DQotCQkJaWYgKG1fcFBERlBhZ2UpDQotCQkJCXJldHVybiBtX3BQREZQYWdlLT5HZXRQYWdlV2lkdGgoKTsNCi0JCX0NCi0JCWJyZWFrOw0KLQlkZWZhdWx0Og0KLQkJcmV0dXJuIDAuMGY7DQotCX0NCisgIGludCBuRG9jVHlwZSA9IG1fcERvY3VtZW50LT5HZXREb2NUeXBlKCk7DQorICBzd2l0Y2ggKG5Eb2NUeXBlKSB7DQorICAgIGNhc2UgRE9DVFlQRV9QREY6DQorICAgIGNhc2UgRE9DVFlQRV9TVEFUSUNfWEZBOiB7DQorICAgICAgaWYgKG1fcFBERlBhZ2UpDQorICAgICAgICByZXR1cm4gbV9wUERGUGFnZS0+R2V0UGFnZUhlaWdodCgpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIERPQ1RZUEVfRFlOSU1JQ19YRkE6IHsNCisgICAgICBpZiAobV9wWEZBUGFnZVZpZXcpIHsNCisgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICAgICAgbV9wWEZBUGFnZVZpZXctPkdldFBhZ2VWaWV3UmVjdChyZWN0KTsNCisgICAgICAgIHJldHVybiByZWN0LmhlaWdodDsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIDAuMGY7DQorICB9DQogDQotCXJldHVybiAwLjBmOw0KKyAgcmV0dXJuIDAuMGY7DQogfQ0KIA0KLUZYX0ZMT0FUIENQREZYRkFfUGFnZTo6R2V0UGFnZUhlaWdodCgpDQotew0KLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7DQordm9pZCBDUERGWEZBX1BhZ2U6OkRldmljZVRvUGFnZShpbnQgc3RhcnRfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV95LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYWdlX3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhZ2VfeSkgew0KKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOw0KIA0KLQlpZiAoIW1fcFBERlBhZ2UgJiYgIW1fcFhGQVBhZ2VWaWV3KQ0KLQkJcmV0dXJuIDAuMGY7DQorICBpZiAoIW1fcFBERlBhZ2UgJiYgIW1fcFhGQVBhZ2VWaWV3KQ0KKyAgICByZXR1cm47DQogDQotCWludCBuRG9jVHlwZSA9IG1fcERvY3VtZW50LT5HZXREb2NUeXBlKCk7DQotCXN3aXRjaCAobkRvY1R5cGUpDQotCXsNCi0JY2FzZSBET0NUWVBFX1BERjoNCi0JY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6DQotCQl7DQotCQkJaWYgKG1fcFBERlBhZ2UpDQotCQkJCXJldHVybiBtX3BQREZQYWdlLT5HZXRQYWdlSGVpZ2h0KCk7DQotCQl9DQotCQlicmVhazsNCi0JY2FzZSBET0NUWVBFX0RZTklNSUNfWEZBOg0KLQkJew0KLQkJCWlmIChtX3BYRkFQYWdlVmlldykNCi0JCQl7DQotCQkJCUNGWF9SZWN0RiByZWN0Ow0KLQkJCQltX3BYRkFQYWdlVmlldy0+R2V0UGFnZVZpZXdSZWN0KHJlY3QpOw0KLQkJCQlyZXR1cm4gcmVjdC5oZWlnaHQ7DQotCQkJfQ0KLQkJfQ0KLQkJYnJlYWs7DQotCWRlZmF1bHQ6DQotCQlyZXR1cm4gMC4wZjsNCi0JfQ0KKyAgQ1BERl9NYXRyaXggcGFnZTJkZXZpY2U7DQorICBDUERGX01hdHJpeCBkZXZpY2UycGFnZTsNCisgIEZYX0ZMT0FUIHBhZ2VfeF9mLCBwYWdlX3lfZjsNCiANCi0JcmV0dXJuIDAuMGY7DQorICBHZXREaXNwbGF5TWF0cml4KHBhZ2UyZGV2aWNlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlKTsNCisNCisgIGRldmljZTJwYWdlLlNldFJldmVyc2UocGFnZTJkZXZpY2UpOw0KKyAgZGV2aWNlMnBhZ2UuVHJhbnNmb3JtKChGWF9GTE9BVCkoZGV2aWNlX3gpLCAoRlhfRkxPQVQpKGRldmljZV95KSwgcGFnZV94X2YsDQorICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV95X2YpOw0KKw0KKyAgKnBhZ2VfeCA9IChwYWdlX3hfZik7DQorICAqcGFnZV95ID0gKHBhZ2VfeV9mKTsNCiB9DQogDQotdm9pZCBDUERGWEZBX1BhZ2U6OkRldmljZVRvUGFnZShpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksIGludCByb3RhdGUsIGludCBkZXZpY2VfeCwgaW50IGRldmljZV95LCBkb3VibGUqIHBhZ2VfeCwgZG91YmxlKiBwYWdlX3kpDQotew0KLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7DQordm9pZCBDUERGWEZBX1BhZ2U6OlBhZ2VUb0RldmljZShpbnQgc3RhcnRfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRldmljZV94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeSkgew0KKyAgaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykNCisgICAgcmV0dXJuOw0KIA0KLQlpZiAoIW1fcFBERlBhZ2UgJiYgIW1fcFhGQVBhZ2VWaWV3KQ0KLQkJcmV0dXJuOw0KKyAgQ1BERl9NYXRyaXggcGFnZTJkZXZpY2U7DQorICBGWF9GTE9BVCBkZXZpY2VfeF9mLCBkZXZpY2VfeV9mOw0KIA0KLQlDUERGX01hdHJpeCBwYWdlMmRldmljZTsNCi0JQ1BERl9NYXRyaXggZGV2aWNlMnBhZ2U7DQotCUZYX0ZMT0FUIHBhZ2VfeF9mLCBwYWdlX3lfZjsNCisgIEdldERpc3BsYXlNYXRyaXgocGFnZTJkZXZpY2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUpOw0KIA0KLQlHZXREaXNwbGF5TWF0cml4KHBhZ2UyZGV2aWNlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlKTsNCisgIHBhZ2UyZGV2aWNlLlRyYW5zZm9ybSgoKEZYX0ZMT0FUKXBhZ2VfeCksICgoRlhfRkxPQVQpcGFnZV95KSwgZGV2aWNlX3hfZiwNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfeV9mKTsNCiANCi0JZGV2aWNlMnBhZ2UuU2V0UmV2ZXJzZShwYWdlMmRldmljZSk7DQotCWRldmljZTJwYWdlLlRyYW5zZm9ybSgoRlhfRkxPQVQpKGRldmljZV94KSwgKEZYX0ZMT0FUKShkZXZpY2VfeSksIHBhZ2VfeF9mLCBwYWdlX3lfZik7DQotDQotCSpwYWdlX3ggPSAocGFnZV94X2YpOw0KLQkqcGFnZV95ID0gKHBhZ2VfeV9mKTsNCisgICpkZXZpY2VfeCA9IEZYU1lTX3JvdW5kKGRldmljZV94X2YpOw0KKyAgKmRldmljZV95ID0gRlhTWVNfcm91bmQoZGV2aWNlX3lfZik7DQogfQ0KIA0KLXZvaWQgQ1BERlhGQV9QYWdlOjpQYWdlVG9EZXZpY2UoaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LCBpbnQgcm90YXRlLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95LCBpbnQqIGRldmljZV94LCBpbnQqIGRldmljZV95KQ0KLXsNCi0JaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykNCi0JCXJldHVybjsNCit2b2lkIENQREZYRkFfUGFnZTo6R2V0RGlzcGxheU1hdHJpeChDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVJvdGF0ZSkgY29uc3Qgew0KKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOw0KIA0KLQlDUERGX01hdHJpeCBwYWdlMmRldmljZTsNCi0JRlhfRkxPQVQgZGV2aWNlX3hfZiwgZGV2aWNlX3lfZjsNCisgIGlmICghbV9wUERGUGFnZSAmJiAhbV9wWEZBUGFnZVZpZXcpDQorICAgIHJldHVybjsNCiANCi0JR2V0RGlzcGxheU1hdHJpeChwYWdlMmRldmljZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksIHJvdGF0ZSk7DQotDQotCXBhZ2UyZGV2aWNlLlRyYW5zZm9ybSgoKEZYX0ZMT0FUKXBhZ2VfeCksICgoRlhfRkxPQVQpcGFnZV95KSwgZGV2aWNlX3hfZiwgZGV2aWNlX3lfZik7DQotDQotCSpkZXZpY2VfeCA9IEZYU1lTX3JvdW5kKGRldmljZV94X2YpOw0KLQkqZGV2aWNlX3kgPSBGWFNZU19yb3VuZChkZXZpY2VfeV9mKTsNCi19DQotDQotdm9pZCBDUERGWEZBX1BhZ2U6OkdldERpc3BsYXlNYXRyaXgoQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4LCBpbnQgeFBvcywgaW50IHlQb3MsIA0KLQlpbnQgeFNpemUsIGludCB5U2l6ZSwgaW50IGlSb3RhdGUpIGNvbnN0DQotew0KLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7DQotDQotCWlmICghbV9wUERGUGFnZSAmJiAhbV9wWEZBUGFnZVZpZXcpDQotCQlyZXR1cm47DQotDQotCWludCBuRG9jVHlwZSA9IG1fcERvY3VtZW50LT5HZXREb2NUeXBlKCk7DQotCXN3aXRjaCAobkRvY1R5cGUpDQotCXsNCi0JY2FzZSBET0NUWVBFX0RZTklNSUNfWEZBOg0KLQkJew0KLQkJCWlmIChtX3BYRkFQYWdlVmlldykNCi0JCQl7DQotCQkJCUNGWF9SZWN0IHJlY3Q7DQotCQkJCXJlY3QuU2V0KHhQb3MsIHlQb3MsIHhTaXplLCB5U2l6ZSk7DQotCQkJCW1fcFhGQVBhZ2VWaWV3LT5HZXREaXNwbGF5TWF0cml4KG1hdHJpeCwgcmVjdCwgaVJvdGF0ZSk7DQotCQkJfQ0KLQkJfQ0KLQkJYnJlYWs7DQotCWNhc2UgRE9DVFlQRV9QREY6DQotCWNhc2UgRE9DVFlQRV9TVEFUSUNfWEZBOg0KLQkJew0KLQkJCWlmIChtX3BQREZQYWdlKSANCi0JCQl7DQotCQkJCW1fcFBERlBhZ2UtPkdldERpc3BsYXlNYXRyaXgobWF0cml4LCB4UG9zLCB5UG9zLCB4U2l6ZSwgeVNpemUsIGlSb3RhdGUpOw0KLQkJCX0NCi0JCX0NCi0JCWJyZWFrOw0KLQlkZWZhdWx0Og0KLQkJcmV0dXJuOw0KLQl9DQotDQorICBpbnQgbkRvY1R5cGUgPSBtX3BEb2N1bWVudC0+R2V0RG9jVHlwZSgpOw0KKyAgc3dpdGNoIChuRG9jVHlwZSkgew0KKyAgICBjYXNlIERPQ1RZUEVfRFlOSU1JQ19YRkE6IHsNCisgICAgICBpZiAobV9wWEZBUGFnZVZpZXcpIHsNCisgICAgICAgIENGWF9SZWN0IHJlY3Q7DQorICAgICAgICByZWN0LlNldCh4UG9zLCB5UG9zLCB4U2l6ZSwgeVNpemUpOw0KKyAgICAgICAgbV9wWEZBUGFnZVZpZXctPkdldERpc3BsYXlNYXRyaXgobWF0cml4LCByZWN0LCBpUm90YXRlKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRE9DVFlQRV9QREY6DQorICAgIGNhc2UgRE9DVFlQRV9TVEFUSUNfWEZBOiB7DQorICAgICAgaWYgKG1fcFBERlBhZ2UpIHsNCisgICAgICAgIG1fcFBERlBhZ2UtPkdldERpc3BsYXlNYXRyaXgobWF0cml4LCB4UG9zLCB5UG9zLCB4U2l6ZSwgeVNpemUsIGlSb3RhdGUpOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm47DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmNwcAppbmRleCBhYzVlZjIxLi4zZTFlZWRmIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX3V0aWwuY3BwCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQotIA0KKw0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQogDQogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCINCkBAIC0xMCw1OSArMTAsNTYgQEAKIA0KIENGWF9QdHJBcnJheSBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncjo6bXNfdGltZXJBcnJheTsNCiANCi1GV0xfRVJSIENYRkFfRldMQWRhcHRlclRpbWVyTWdyOjpTdGFydChJRldMX1RpbWVyICpwVGltZXIsIEZYX0RXT1JEIGR3RWxhcHNlLCBGV0xfSFRJTUVSICZoVGltZXIsIEZYX0JPT0wgYkltbWVkaWF0ZWx5IC8qID0gVFJVRSAqLykNCi17DQotCWlmIChtX3BFbnYpDQotCXsNCi0JCXVpbnQzMl90IHVJREV2ZW50ID0gbV9wRW52LT5GRklfU2V0VGltZXIoZHdFbGFwc2UsIFRpbWVyUHJvYyk7DQotCQlDRldMX1RpbWVySW5mbyAqcEluZm8gPSBGWF9ORVcgQ0ZXTF9UaW1lckluZm87DQotCQlwSW5mby0+dUlERXZlbnQgPSB1SURFdmVudDsNCi0JCXBJbmZvLT5wVGltZXIgPSBwVGltZXI7DQotCQltc190aW1lckFycmF5LkFkZChwSW5mbyk7DQorRldMX0VSUiBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncjo6U3RhcnQoSUZXTF9UaW1lciogcFRpbWVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RWxhcHNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9IVElNRVImIGhUaW1lciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbW1lZGlhdGVseSAvKiA9IFRSVUUgKi8pIHsNCisgIGlmIChtX3BFbnYpIHsNCisgICAgdWludDMyX3QgdUlERXZlbnQgPSBtX3BFbnYtPkZGSV9TZXRUaW1lcihkd0VsYXBzZSwgVGltZXJQcm9jKTsNCisgICAgQ0ZXTF9UaW1lckluZm8qIHBJbmZvID0gRlhfTkVXIENGV0xfVGltZXJJbmZvOw0KKyAgICBwSW5mby0+dUlERXZlbnQgPSB1SURFdmVudDsNCisgICAgcEluZm8tPnBUaW1lciA9IHBUaW1lcjsNCisgICAgbXNfdGltZXJBcnJheS5BZGQocEluZm8pOw0KIA0KLQkJaFRpbWVyID0gKEZXTF9IVElNRVIpcEluZm87DQotCQlyZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotCX0NCi0JDQotCXJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIGhUaW1lciA9IChGV0xfSFRJTUVSKXBJbmZvOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorDQorICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KIH0NCiANCi1GV0xfRVJSIENYRkFfRldMQWRhcHRlclRpbWVyTWdyOjpTdG9wKEZXTF9IVElNRVIgaFRpbWVyKQ0KLXsNCi0JaWYgKCFoVGltZXIpIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorRldMX0VSUiBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncjo6U3RvcChGV0xfSFRJTUVSIGhUaW1lcikgew0KKyAgaWYgKCFoVGltZXIpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQogDQotCWlmIChtX3BFbnYpDQotCXsNCi0JCUNGV0xfVGltZXJJbmZvICpwSW5mbyA9IChDRldMX1RpbWVySW5mbyopaFRpbWVyOw0KKyAgaWYgKG1fcEVudikgew0KKyAgICBDRldMX1RpbWVySW5mbyogcEluZm8gPSAoQ0ZXTF9UaW1lckluZm8qKWhUaW1lcjsNCiANCi0JCW1fcEVudi0+RkZJX0tpbGxUaW1lcihwSW5mby0+dUlERXZlbnQpOw0KKyAgICBtX3BFbnYtPkZGSV9LaWxsVGltZXIocEluZm8tPnVJREV2ZW50KTsNCiANCi0JCWludDMyX3QgaW5kZXggPSBtc190aW1lckFycmF5LkZpbmQocEluZm8pOw0KLQkJaWYgKGluZGV4ID49IDApDQotCQl7DQotCQkJbXNfdGltZXJBcnJheS5SZW1vdmVBdChpbmRleCk7DQotCQkJZGVsZXRlIHBJbmZvOw0KLQkJfQ0KLQkJcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLQl9DQorICAgIGludDMyX3QgaW5kZXggPSBtc190aW1lckFycmF5LkZpbmQocEluZm8pOw0KKyAgICBpZiAoaW5kZXggPj0gMCkgew0KKyAgICAgIG1zX3RpbWVyQXJyYXkuUmVtb3ZlQXQoaW5kZXgpOw0KKyAgICAgIGRlbGV0ZSBwSW5mbzsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQogDQotCXJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KIH0NCiANCi12b2lkIENYRkFfRldMQWRhcHRlclRpbWVyTWdyOjpUaW1lclByb2MoaW50MzJfdCBpZEV2ZW50KQ0KLXsNCi0JQ0ZXTF9UaW1lckluZm8gKnBJbmZvID0gTlVMTDsNCi0JaW50MzJfdCBpQ291bnQgPSBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncjo6bXNfdGltZXJBcnJheS5HZXRTaXplKCk7DQotCWZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKQ0KLQl7DQotCQlDRldMX1RpbWVySW5mbyAqcFRlbXAgPSAoQ0ZXTF9UaW1lckluZm8qKUNYRkFfRldMQWRhcHRlclRpbWVyTWdyOjptc190aW1lckFycmF5LkdldEF0KGkpOw0KLQkJaWYgKHBUZW1wLT51SURFdmVudCA9PSBpZEV2ZW50KQ0KLQkJew0KLQkJCXBJbmZvID0gcFRlbXA7IGJyZWFrOw0KLQkJfQ0KLQl9DQotCWlmIChwSW5mbykNCi0Jew0KLQkJcEluZm8tPnBUaW1lci0+UnVuKChGV0xfSFRJTUVSKXBJbmZvKTsNCi0JfQ0KK3ZvaWQgQ1hGQV9GV0xBZGFwdGVyVGltZXJNZ3I6OlRpbWVyUHJvYyhpbnQzMl90IGlkRXZlbnQpIHsNCisgIENGV0xfVGltZXJJbmZvKiBwSW5mbyA9IE5VTEw7DQorICBpbnQzMl90IGlDb3VudCA9IENYRkFfRldMQWRhcHRlclRpbWVyTWdyOjptc190aW1lckFycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENGV0xfVGltZXJJbmZvKiBwVGVtcCA9DQorICAgICAgICAoQ0ZXTF9UaW1lckluZm8qKUNYRkFfRldMQWRhcHRlclRpbWVyTWdyOjptc190aW1lckFycmF5LkdldEF0KGkpOw0KKyAgICBpZiAocFRlbXAtPnVJREV2ZW50ID09IGlkRXZlbnQpIHsNCisgICAgICBwSW5mbyA9IHBUZW1wOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAocEluZm8pIHsNCisgICAgcEluZm8tPnBUaW1lci0+UnVuKChGV0xfSFRJTUVSKXBJbmZvKTsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnNka19hY3Rpb25oYW5kbGVyLmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAKaW5kZXggNDg1ODUyYy4uYzcyYmRmZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19hY3Rpb25oYW5kbGVyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwCkBAIC0xNCwyMzUgKzE0LDIyNCBAQAogCiBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkNQREZTREtfQWN0aW9uSGFuZGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwRXZpKQogICAgIDogbV9wRm9ybUFjdGlvbkhhbmRsZXIobmV3IENQREZTREtfRm9ybUFjdGlvbkhhbmRsZXIpLAotICAgICAgbV9wTWVkaWFBY3Rpb25IYW5kbGVyKE5VTEwpIHsKKyAgICAgIG1fcE1lZGlhQWN0aW9uSGFuZGxlcihOVUxMKSB7fQorCit2b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6U2V0TWVkaWFBY3Rpb25IYW5kbGVyKAorICAgIENQREZTREtfTWVkaWFBY3Rpb25IYW5kbGVyKiBwSGFuZGxlcikgeworICBBU1NFUlQocEhhbmRsZXIgIT0gTlVMTCk7CisgIEFTU0VSVChtX3BNZWRpYUFjdGlvbkhhbmRsZXIgPT0gTlVMTCk7CisgIG1fcE1lZGlhQWN0aW9uSGFuZGxlciA9IHBIYW5kbGVyOwogfQogCi12b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6U2V0TWVkaWFBY3Rpb25IYW5kbGVyKENQREZTREtfTWVkaWFBY3Rpb25IYW5kbGVyKiBwSGFuZGxlcikKLXsKLQlBU1NFUlQocEhhbmRsZXIgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcE1lZGlhQWN0aW9uSGFuZGxlciA9PSBOVUxMKTsKLQltX3BNZWRpYUFjdGlvbkhhbmRsZXIgPSBwSGFuZGxlcjsKKy8vIGRvY3VtZW50IG9wZW4KK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Eb2NPcGVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQ0ZYX1B0ckxpc3QgbGlzdDsKKyAgcmV0dXJuIEV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpOwogfQogCi0vL2RvY3VtZW50IG9wZW4KLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Eb2NPcGVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlDRlhfUHRyTGlzdCBsaXN0OwotCXJldHVybiBFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGFjdGlvbiwgcERvY3VtZW50LCBsaXN0KTsKKy8vIGRvY3VtZW50IG9wZW4KK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9KYXZhU2NyaXB0KAorICAgIGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbiwKKyAgICBDRlhfV2lkZVN0cmluZyBjc0pTTmFtZSwKKyAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgaWYgKEpzQWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkgeworICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBKc0FjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgaWYgKCFzd0pTLklzRW1wdHkoKSkgeworICAgICAgUnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdChwRG9jdW1lbnQsIGNzSlNOYW1lLCBzd0pTKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIHJldHVybiBGQUxTRTsKIH0KIAotLy9kb2N1bWVudCBvcGVuCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sQ0ZYX1dpZGVTdHJpbmcgY3NKU05hbWUsCi0JCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCWlmIChKc0FjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpCi0JewotCQlDRlhfV2lkZVN0cmluZyBzd0pTID0gSnNBY3Rpb24uR2V0SmF2YVNjcmlwdCgpOwotCQlpZiAoIXN3SlMuSXNFbXB0eSgpKQotCQl7Ci0JCQlSdW5Eb2N1bWVudE9wZW5KYXZhU2NyaXB0KHBEb2N1bWVudCwgY3NKU05hbWUsIHN3SlMpOwotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KAorICAgIGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbiwKKyAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSkgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBpZiAocEVudi0+SXNKU0luaXRpYXRlZCgpICYmIEpzQWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkgeworICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBKc0FjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgaWYgKCFzd0pTLklzRW1wdHkoKSkgeworICAgICAgUnVuRmllbGRKYXZhU2NyaXB0KHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHlwZSwgZGF0YSwgc3dKUyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotCQkJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKLQkJCQkJCQkJCVBERlNES19GaWVsZEFjdGlvbiYgZGF0YSkKLXsKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKLQlBU1NFUlQocEVudik7Ci0JaWYgKHBFbnYtPklzSlNJbml0aWF0ZWQoKSAmJiBKc0FjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpCi0JewotCQlDRlhfV2lkZVN0cmluZyBzd0pTID0gSnNBY3Rpb24uR2V0SmF2YVNjcmlwdCgpOwotCQlpZiAoIXN3SlMuSXNFbXB0eSgpKQotCQl7Ci0JCQlSdW5GaWVsZEphdmFTY3JpcHQocERvY3VtZW50LCBwRm9ybUZpZWxkLCB0eXBlLCBkYXRhLCBzd0pTKTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9QYWdlKAorICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLAorICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICBDRlhfUHRyTGlzdCBsaXN0OworICByZXR1cm4gRXhlY3V0ZURvY3VtZW50UGFnZUFjdGlvbihhY3Rpb24sIGVUeXBlLCBwRG9jdW1lbnQsIGxpc3QpOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUGFnZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBlbnVtIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZVR5cGUsCi0JCQkJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCUNGWF9QdHJMaXN0IGxpc3Q7Ci0JcmV0dXJuIEV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oYWN0aW9uLCBlVHlwZSwgcERvY3VtZW50LCBsaXN0KTsKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Eb2N1bWVudCgKKyAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwKKyAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQ0ZYX1B0ckxpc3QgbGlzdDsKKyAgcmV0dXJuIEV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oYWN0aW9uLCBlVHlwZSwgcERvY3VtZW50LCBsaXN0KTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0RvY3VtZW50KGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwKLQkJCQkJCQkJCQkJIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlDRlhfUHRyTGlzdCBsaXN0OwotCXJldHVybiBFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGFjdGlvbiwgZVR5cGUsIHBEb2N1bWVudCwgbGlzdCk7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fQm9va01hcmsoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICBDRlhfUHRyTGlzdCBsaXN0OworICByZXR1cm4gRXhlY3V0ZUJvb2tNYXJrKGFjdGlvbiwgcERvY3VtZW50LCBwQm9va01hcmssIGxpc3QpOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fQm9va01hcmsoQ1BERl9Cb29rbWFyayAqcEJvb2tNYXJrLCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCi0JCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCUNGWF9QdHJMaXN0IGxpc3Q7Ci0JcmV0dXJuIEV4ZWN1dGVCb29rTWFyayhhY3Rpb24sIHBEb2N1bWVudCwgcEJvb2tNYXJrLCBsaXN0KTsKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9TY3JlZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgQ0ZYX1B0ckxpc3QgbGlzdDsKKyAgcmV0dXJuIEV4ZWN1dGVTY3JlZW5BY3Rpb24oYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBTY3JlZW4sIGxpc3QpOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU2NyZWVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLQkJCQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0JQ0ZYX1B0ckxpc3QgbGlzdDsKLQlyZXR1cm4gRXhlY3V0ZVNjcmVlbkFjdGlvbihhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcFNjcmVlbiwgbGlzdCk7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fTGluayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIENGWF9QdHJMaXN0IGxpc3Q7CisgIHJldHVybiBFeGVjdXRlTGlua0FjdGlvbihhY3Rpb24sIHBEb2N1bWVudCwgbGlzdCk7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9MaW5rKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCi0JCQkJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCUNGWF9QdHJMaXN0IGxpc3Q7Ci0JcmV0dXJuIEV4ZWN1dGVMaW5rQWN0aW9uKGFjdGlvbiwgcERvY3VtZW50LCBsaXN0KTsKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9GaWVsZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhKSB7CisgIENGWF9QdHJMaXN0IGxpc3Q7CisgIHJldHVybiBFeGVjdXRlRmllbGRBY3Rpb24oYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBGb3JtRmllbGQsIGRhdGEsIGxpc3QpOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRmllbGQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotCQkJCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKLQkJCQkJCQkJCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhKQotewotCUNGWF9QdHJMaXN0IGxpc3Q7Ci0JcmV0dXJuIEV4ZWN1dGVGaWVsZEFjdGlvbihhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgZGF0YSwgbGlzdCk7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZURvY3VtZW50T3BlbkFjdGlvbigKKyAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICBDRlhfUHRyTGlzdCYgbGlzdCkgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKKyAgaWYgKGxpc3QuRmluZChwRGljdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGxpc3QuQWRkVGFpbChwRGljdCk7CisKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2N1bWVudC0+R2V0RW52KCk7CisgIEFTU0VSVChwRW52KTsKKyAgaWYgKGFjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpIHsKKyAgICBpZiAocEVudi0+SXNKU0luaXRpYXRlZCgpKSB7CisgICAgICBDRlhfV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKKyAgICAgIGlmICghc3dKUy5Jc0VtcHR5KCkpIHsKKyAgICAgICAgUnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdChwRG9jdW1lbnQsIEwiIiwgc3dKUyk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIERvQWN0aW9uX05vSnMoYWN0aW9uLCBwRG9jdW1lbnQpOworICB9CisKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IGFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOworICAgIGlmICghRXhlY3V0ZURvY3VtZW50T3BlbkFjdGlvbihzdWJhY3Rpb24sIHBEb2N1bWVudCwgbGlzdCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckxpc3QmIGxpc3QpCi17Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7Ci0JaWYgKGxpc3QuRmluZChwRGljdCkpCi0JCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlTGlua0FjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyTGlzdCYgbGlzdCkgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCi0JbGlzdC5BZGRUYWlsKHBEaWN0KTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CisgIGlmIChsaXN0LkZpbmQocERpY3QpKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOwotCUFTU0VSVChwRW52KTsKLQlpZiAoYWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkKLQl7Ci0JCWlmKHBFbnYtPklzSlNJbml0aWF0ZWQoKSkKLQkJewotCQkJQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7Ci0JCQlpZiAoIXN3SlMuSXNFbXB0eSgpKQotCQkJewotCQkJCVJ1bkRvY3VtZW50T3BlbkphdmFTY3JpcHQocERvY3VtZW50LCBMIiIsIHN3SlMpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURvQWN0aW9uX05vSnMoYWN0aW9uLCBwRG9jdW1lbnQpOwotCX0KKyAgbGlzdC5BZGRUYWlsKHBEaWN0KTsKIAotCWZvciAoaW50MzJfdCBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCi0JewotCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oc3ViYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpKSByZXR1cm4gRkFMU0U7Ci0JfQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBpZiAoYWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkgeworICAgIGlmIChwRW52LT5Jc0pTSW5pdGlhdGVkKCkpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOworICAgICAgaWYgKCFzd0pTLklzRW1wdHkoKSkgeworICAgICAgICBJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IHBEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7ICAvLz8/Pz8KKyAgICAgICAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwogCi0JcmV0dXJuIFRSVUU7CisgICAgICAgIHBSdW50aW1lLT5TZXRSZWFkZXJEb2N1bWVudChwRG9jdW1lbnQpOworCisgICAgICAgIElGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKKyAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworCisgICAgICAgIHBDb250ZXh0LT5PbkxpbmtfTW91c2VVcChwRG9jdW1lbnQpOworCisgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzSW5mbzsKKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCBjc0luZm8pOworICAgICAgICBpZiAoIWJSZXQpIHsKKyAgICAgICAgICAvLyBGSVhNRTogcmV0dXJuIGVycm9yLgorICAgICAgICB9CisKKyAgICAgICAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgRG9BY3Rpb25fTm9KcyhhY3Rpb24sIHBEb2N1bWVudCk7CisgIH0KKworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gYWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgIENQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7CisgICAgaWYgKCFFeGVjdXRlTGlua0FjdGlvbihzdWJhY3Rpb24sIHBEb2N1bWVudCwgbGlzdCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVMaW5rQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKLQkJCQkJCQkJCQkJCSAgQ0ZYX1B0ckxpc3QmIGxpc3QpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKAorICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICBDRlhfUHRyTGlzdCYgbGlzdCkgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7Ci0JaWYgKGxpc3QuRmluZChwRGljdCkpCi0JCXJldHVybiBGQUxTRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CisgIGlmIChsaXN0LkZpbmQocERpY3QpKQorICAgIHJldHVybiBGQUxTRTsKIAotCWxpc3QuQWRkVGFpbChwRGljdCk7CisgIGxpc3QuQWRkVGFpbChwRGljdCk7CiAKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKLQlBU1NFUlQocEVudik7Ci0JaWYgKGFjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpCi0JewotCQlpZihwRW52LT5Jc0pTSW5pdGlhdGVkKCkpCi0JCXsKLQkJCUNGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOwotCQkJaWYgKCFzd0pTLklzRW1wdHkoKSkKLQkJCXsKLQkJCQlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IHBEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7IC8vPz8/PwotCQkJCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2N1bWVudC0+R2V0RW52KCk7CisgIEFTU0VSVChwRW52KTsKKyAgaWYgKGFjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpIHsKKyAgICBpZiAocEVudi0+SXNKU0luaXRpYXRlZCgpKSB7CisgICAgICBDRlhfV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKKyAgICAgIGlmICghc3dKUy5Jc0VtcHR5KCkpIHsKKyAgICAgICAgUnVuRG9jdW1lbnRQYWdlSmF2YVNjcmlwdChwRG9jdW1lbnQsIHR5cGUsIHN3SlMpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBEb0FjdGlvbl9Ob0pzKGFjdGlvbiwgcERvY3VtZW50KTsKKyAgfQogCi0JCQkJcFJ1bnRpbWUtPlNldFJlYWRlckRvY3VtZW50KHBEb2N1bWVudCk7CisgIGlmICghSXNWYWxpZERvY1ZpZXcocERvY3VtZW50KSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQkJCQlJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7Ci0JCQkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gYWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgIENQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7CisgICAgaWYgKCFFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKHN1YmFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBsaXN0KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JCQkJcENvbnRleHQtPk9uTGlua19Nb3VzZVVwKHBEb2N1bWVudCk7Ci0KLQkJCQlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JCQkJRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCBjc0luZm8pOwotCQkJCWlmICghYlJldCkKLQkJCQl7Ci0JCQkJCS8vIEZJWE1FOiByZXR1cm4gZXJyb3IuCi0JCQkJfQotCi0JCQkJcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlEb0FjdGlvbl9Ob0pzKGFjdGlvbiwgcERvY3VtZW50KTsKLQl9Ci0KLQlmb3IgKGludDMyX3QgaT0wLHN6PWFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaTxzejsgaSsrKQotCXsKLQkJQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKLQkJaWYgKCFFeGVjdXRlTGlua0FjdGlvbihzdWJhY3Rpb24sIHBEb2N1bWVudCwgbGlzdCkpIHJldHVybiBGQUxTRTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLQkJCQkJCQkJCQkJCSBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9QdHJMaXN0JiBsaXN0KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKLQlpZiAobGlzdC5GaW5kKHBEaWN0KSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JbGlzdC5BZGRUYWlsKHBEaWN0KTsKLQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOwotCUFTU0VSVChwRW52KTsKLQlpZiAoYWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkKLQl7Ci0JCWlmKHBFbnYtPklzSlNJbml0aWF0ZWQoKSkKLQkJewotCQkJQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7Ci0JCQlpZiAoIXN3SlMuSXNFbXB0eSgpKQotCQkJewotCQkJCVJ1bkRvY3VtZW50UGFnZUphdmFTY3JpcHQocERvY3VtZW50LCB0eXBlLCBzd0pTKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlEb0FjdGlvbl9Ob0pzKGFjdGlvbiwgcERvY3VtZW50KTsKLQl9Ci0KLQlpZiAoIUlzVmFsaWREb2NWaWV3KHBEb2N1bWVudCkpCi0JCXJldHVybiBGQUxTRTsKLQotCWZvciAoaW50MzJfdCBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCi0JewotCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIGxpc3QpKSByZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpJc1ZhbGlkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpCi17CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6SXNWYWxpZEZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KSB7CiAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAgIEFTU0VSVChwRmllbGREaWN0ICE9IE5VTEwpOwogCkBAIC0yNTUsNTU0ICsyNDQsNTQ1IEBACiAgIHJldHVybiBwUERGSW50ZXJGb3JtLT5HZXRGaWVsZEJ5RGljdChwRmllbGREaWN0KSAhPSBOVUxMOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZUZpZWxkQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLQkJCQkJCQkJCQkgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCi0JCQkJCQkJCQkJICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIENGWF9QdHJMaXN0JiBsaXN0KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZUZpZWxkQWN0aW9uKAorICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCisgICAgQ0ZYX1B0ckxpc3QmIGxpc3QpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIAotCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOwotCWlmIChsaXN0LkZpbmQocERpY3QpKQotCQlyZXR1cm4gRkFMU0U7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOworICBpZiAobGlzdC5GaW5kKHBEaWN0KSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlsaXN0LkFkZFRhaWwocERpY3QpOworICBsaXN0LkFkZFRhaWwocERpY3QpOwogCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2N1bWVudC0+R2V0RW52KCk7Ci0JQVNTRVJUKHBFbnYpOwotCWlmIChhY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KQotCXsKLQkJaWYocEVudi0+SXNKU0luaXRpYXRlZCgpKQotCQl7Ci0JCQlDRlhfV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKLQkJCWlmICghc3dKUy5Jc0VtcHR5KCkpCi0JCQl7Ci0JCQkJUnVuRmllbGRKYXZhU2NyaXB0KHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHlwZSwgZGF0YSwgc3dKUyk7Ci0JCQkJaWYgKCFJc1ZhbGlkRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLT5HZXRGaWVsZERpY3QoKSkpCi0JCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlEb0FjdGlvbl9Ob0pzKGFjdGlvbiwgcERvY3VtZW50KTsKLQl9CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOworICBBU1NFUlQocEVudik7CisgIGlmIChhY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KSB7CisgICAgaWYgKHBFbnYtPklzSlNJbml0aWF0ZWQoKSkgeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgICBpZiAoIXN3SlMuSXNFbXB0eSgpKSB7CisgICAgICAgIFJ1bkZpZWxkSmF2YVNjcmlwdChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHR5cGUsIGRhdGEsIHN3SlMpOworICAgICAgICBpZiAoIUlzVmFsaWRGaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQtPkdldEZpZWxkRGljdCgpKSkKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIERvQWN0aW9uX05vSnMoYWN0aW9uLCBwRG9jdW1lbnQpOworICB9CiAKLQlmb3IgKGludDMyX3QgaT0wLHN6PWFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaTxzejsgaSsrKQotCXsKLQkJQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKLQkJaWYgKCFFeGVjdXRlRmllbGRBY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBGb3JtRmllbGQsIGRhdGEsIGxpc3QpKSByZXR1cm4gRkFMU0U7Ci0JfQorICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gYWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgIENQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7CisgICAgaWYgKCFFeGVjdXRlRmllbGRBY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBGb3JtRmllbGQsIGRhdGEsIGxpc3QpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLQkJCQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4sIENGWF9QdHJMaXN0JiBsaXN0KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZVNjcmVlbkFjdGlvbigKKyAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbiwKKyAgICBDRlhfUHRyTGlzdCYgbGlzdCkgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7Ci0JaWYgKGxpc3QuRmluZChwRGljdCkpCi0JCXJldHVybiBGQUxTRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CisgIGlmIChsaXN0LkZpbmQocERpY3QpKQorICAgIHJldHVybiBGQUxTRTsKIAotCWxpc3QuQWRkVGFpbChwRGljdCk7CisgIGxpc3QuQWRkVGFpbChwRGljdCk7CiAKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKLQlBU1NFUlQocEVudik7Ci0JaWYgKGFjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpCi0JewotCQlpZihwRW52LT5Jc0pTSW5pdGlhdGVkKCkpCi0JCXsKLQkJCUNGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOwotCQkJaWYgKCFzd0pTLklzRW1wdHkoKSkKLQkJCXsKLQkJCQlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IHBEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7Ci0JCQkJQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBpZiAoYWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkgeworICAgIGlmIChwRW52LT5Jc0pTSW5pdGlhdGVkKCkpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOworICAgICAgaWYgKCFzd0pTLklzRW1wdHkoKSkgeworICAgICAgICBJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IHBEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7CisgICAgICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAotCQkJCXBSdW50aW1lLT5TZXRSZWFkZXJEb2N1bWVudChwRG9jdW1lbnQpOworICAgICAgICBwUnVudGltZS0+U2V0UmVhZGVyRG9jdW1lbnQocERvY3VtZW50KTsKIAotCQkJCUlGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKLQkJCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgICAgICAgIElGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKKyAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogCi0JLy8gCQkJc3dpdGNoICh0eXBlKQotCS8vIAkJCXsKLQkvLyAJCQljYXNlIENQREZfQUFjdGlvbjo6Q3Vyc29yRW50ZXI6Ci0JLy8gCQkJCXBDb250ZXh0LT5PblNjcmVlbl9Nb3VzZUVudGVyKElzQ1RSTHByZXNzZWQoKSwgSXNTSElGVHByZXNzZWQoKSwgcFNjcmVlbik7Ci0JLy8gCQkJCWJyZWFrOwotCS8vIAkJCWNhc2UgQ1BERl9BQWN0aW9uOjpDdXJzb3JFeGl0OgotCS8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fTW91c2VFeGl0KElzQ1RSTHByZXNzZWQoKSwgSXNTSElGVHByZXNzZWQoKSwgcFNjcmVlbik7Ci0JLy8gCQkJCWJyZWFrOwotCS8vIAkJCWNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25Eb3duOgotCS8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fTW91c2VEb3duKElzQ1RSTHByZXNzZWQoKSwgSXNTSElGVHByZXNzZWQoKSwgcFNjcmVlbik7Ci0JLy8gCQkJCWJyZWFrOwotCS8vIAkJCWNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25VcDoKLQkvLyAJCQkJcENvbnRleHQtPk9uU2NyZWVuX01vdXNlVXAoSXNDVFJMcHJlc3NlZCgpLCBJc1NISUZUcHJlc3NlZCgpLCBwU2NyZWVuKTsKLQkvLyAJCQkJYnJlYWs7Ci0JLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246OkdldEZvY3VzOgotCS8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fRm9jdXMoSXNDVFJMcHJlc3NlZCgpLCBJc1NISUZUcHJlc3NlZCgpLCBwU2NyZWVuKTsKLQkvLyAJCQkJYnJlYWs7Ci0JLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246Okxvc2VGb2N1czoKLQkvLyAJCQkJcENvbnRleHQtPk9uU2NyZWVuX0JsdXIoSXNDVFJMcHJlc3NlZCgpLCBJc1NISUZUcHJlc3NlZCgpLCBwU2NyZWVuKTsKLQkvLyAJCQkJYnJlYWs7Ci0JLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VPcGVuOgotCS8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fT3BlbihJc0NUUkxwcmVzc2VkKCksIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOwotCS8vIAkJCQlicmVhazsKLQkvLyAJCQljYXNlIENQREZfQUFjdGlvbjo6UGFnZUNsb3NlOgotCS8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fQ2xvc2UoSXNDVFJMcHJlc3NlZCgpLCBJc1NISUZUcHJlc3NlZCgpLCBwU2NyZWVuKTsKLQkvLyAJCQkJYnJlYWs7Ci0JLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VWaXNpYmxlOgotCS8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fSW5WaWV3KElzQ1RSTHByZXNzZWQoKSwgSXNTSElGVHByZXNzZWQoKSwgcFNjcmVlbik7Ci0JLy8gCQkJCWJyZWFrOwotCS8vIAkJCWNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlSW52aXNpYmxlOgotCS8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fT3V0VmlldyhJc0NUUkxwcmVzc2VkKCksIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOwotCS8vIAkJCQlicmVhazsKLQkvLyAJCQlkZWZhdWx0OgotCS8vIAkJCQlBU1NFUlQoRkFMU0UpOwotCS8vIAkJCQlicmVhazsKLQkvLyAJCQl9CisgICAgICAgIC8vIAkJCXN3aXRjaCAodHlwZSkKKyAgICAgICAgLy8gCQkJeworICAgICAgICAvLyAJCQljYXNlIENQREZfQUFjdGlvbjo6Q3Vyc29yRW50ZXI6CisgICAgICAgIC8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fTW91c2VFbnRlcihJc0NUUkxwcmVzc2VkKCksCisgICAgICAgIC8vIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOworICAgICAgICAvLyAJCQkJYnJlYWs7CisgICAgICAgIC8vIAkJCWNhc2UgQ1BERl9BQWN0aW9uOjpDdXJzb3JFeGl0OgorICAgICAgICAvLyAJCQkJcENvbnRleHQtPk9uU2NyZWVuX01vdXNlRXhpdChJc0NUUkxwcmVzc2VkKCksCisgICAgICAgIC8vIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOworICAgICAgICAvLyAJCQkJYnJlYWs7CisgICAgICAgIC8vIAkJCWNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25Eb3duOgorICAgICAgICAvLyAJCQkJcENvbnRleHQtPk9uU2NyZWVuX01vdXNlRG93bihJc0NUUkxwcmVzc2VkKCksCisgICAgICAgIC8vIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOworICAgICAgICAvLyAJCQkJYnJlYWs7CisgICAgICAgIC8vIAkJCWNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25VcDoKKyAgICAgICAgLy8gCQkJCXBDb250ZXh0LT5PblNjcmVlbl9Nb3VzZVVwKElzQ1RSTHByZXNzZWQoKSwKKyAgICAgICAgLy8gSXNTSElGVHByZXNzZWQoKSwgcFNjcmVlbik7CisgICAgICAgIC8vIAkJCQlicmVhazsKKyAgICAgICAgLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246OkdldEZvY3VzOgorICAgICAgICAvLyAJCQkJcENvbnRleHQtPk9uU2NyZWVuX0ZvY3VzKElzQ1RSTHByZXNzZWQoKSwKKyAgICAgICAgLy8gSXNTSElGVHByZXNzZWQoKSwgcFNjcmVlbik7CisgICAgICAgIC8vIAkJCQlicmVhazsKKyAgICAgICAgLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246Okxvc2VGb2N1czoKKyAgICAgICAgLy8gCQkJCXBDb250ZXh0LT5PblNjcmVlbl9CbHVyKElzQ1RSTHByZXNzZWQoKSwKKyAgICAgICAgLy8gSXNTSElGVHByZXNzZWQoKSwgcFNjcmVlbik7CisgICAgICAgIC8vIAkJCQlicmVhazsKKyAgICAgICAgLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VPcGVuOgorICAgICAgICAvLyAJCQkJcENvbnRleHQtPk9uU2NyZWVuX09wZW4oSXNDVFJMcHJlc3NlZCgpLAorICAgICAgICAvLyBJc1NISUZUcHJlc3NlZCgpLCBwU2NyZWVuKTsKKyAgICAgICAgLy8gCQkJCWJyZWFrOworICAgICAgICAvLyAJCQljYXNlIENQREZfQUFjdGlvbjo6UGFnZUNsb3NlOgorICAgICAgICAvLyAJCQkJcENvbnRleHQtPk9uU2NyZWVuX0Nsb3NlKElzQ1RSTHByZXNzZWQoKSwKKyAgICAgICAgLy8gSXNTSElGVHByZXNzZWQoKSwgcFNjcmVlbik7CisgICAgICAgIC8vIAkJCQlicmVhazsKKyAgICAgICAgLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VWaXNpYmxlOgorICAgICAgICAvLyAJCQkJcENvbnRleHQtPk9uU2NyZWVuX0luVmlldyhJc0NUUkxwcmVzc2VkKCksCisgICAgICAgIC8vIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOworICAgICAgICAvLyAJCQkJYnJlYWs7CisgICAgICAgIC8vIAkJCWNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlSW52aXNpYmxlOgorICAgICAgICAvLyAJCQkJcENvbnRleHQtPk9uU2NyZWVuX091dFZpZXcoSXNDVFJMcHJlc3NlZCgpLAorICAgICAgICAvLyBJc1NISUZUcHJlc3NlZCgpLCBwU2NyZWVuKTsKKyAgICAgICAgLy8gCQkJCWJyZWFrOworICAgICAgICAvLyAJCQlkZWZhdWx0OgorICAgICAgICAvLyAJCQkJQVNTRVJUKEZBTFNFKTsKKyAgICAgICAgLy8gCQkJCWJyZWFrOworICAgICAgICAvLyAJCQl9CiAKLQkJCQlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JCQkJRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCBjc0luZm8pOwotCQkJCWlmICghYlJldCkKLQkJCQl7Ci0JCQkJCS8vQ0JDTF9Gb3JtTm90aWZ5OjpNc2dCb3hKU0Vycm9yKHBQYWdlVmlldy0+R2V0UGFnZVZpZXdXbmQoKSwgY3NJbmZvKTsKLQkJCQl9CisgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzSW5mbzsKKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCBjc0luZm8pOworICAgICAgICBpZiAoIWJSZXQpIHsKKyAgICAgICAgICAvLyBDQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLAorICAgICAgICAgIC8vIGNzSW5mbyk7CisgICAgICAgIH0KIAotCQkJCXBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJRG9BY3Rpb25fTm9KcyhhY3Rpb24sIHBEb2N1bWVudCk7Ci0JfQorICAgICAgICBwUnVudGltZS0+UmVsZWFzZUNvbnRleHQocENvbnRleHQpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBEb0FjdGlvbl9Ob0pzKGFjdGlvbiwgcERvY3VtZW50KTsKKyAgfQogCi0JZm9yIChpbnQzMl90IGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKLQl7Ci0JCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZVNjcmVlbkFjdGlvbihzdWJhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcFNjcmVlbiwgbGlzdCkpIHJldHVybiBGQUxTRTsKLQl9CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBhY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGkgPCBzejsgaSsrKSB7CisgICAgQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKKyAgICBpZiAoIUV4ZWN1dGVTY3JlZW5BY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBTY3JlZW4sIGxpc3QpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlQm9va01hcmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAotCQkJCQkJCQkJCSBDUERGX0Jvb2ttYXJrKiBwQm9va21hcmssIENGWF9QdHJMaXN0JiBsaXN0KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZUJvb2tNYXJrKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Cb29rbWFyayogcEJvb2ttYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyTGlzdCYgbGlzdCkgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7Ci0JaWYgKGxpc3QuRmluZChwRGljdCkpCi0JCXJldHVybiBGQUxTRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CisgIGlmIChsaXN0LkZpbmQocERpY3QpKQorICAgIHJldHVybiBGQUxTRTsKIAotCWxpc3QuQWRkVGFpbChwRGljdCk7CisgIGxpc3QuQWRkVGFpbChwRGljdCk7CiAKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKLQlBU1NFUlQocEVudik7Ci0JaWYgKGFjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpCi0JewotCQlpZihwRW52LT5Jc0pTSW5pdGlhdGVkKCkpCi0JCXsKLQkJCUNGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOwotCQkJaWYgKCFzd0pTLklzRW1wdHkoKSkKLQkJCXsKLQkJCQlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IHBEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7Ci0JCQkJQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBpZiAoYWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkgeworICAgIGlmIChwRW52LT5Jc0pTSW5pdGlhdGVkKCkpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOworICAgICAgaWYgKCFzd0pTLklzRW1wdHkoKSkgeworICAgICAgICBJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IHBEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7CisgICAgICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAotCQkJCXBSdW50aW1lLT5TZXRSZWFkZXJEb2N1bWVudChwRG9jdW1lbnQpOworICAgICAgICBwUnVudGltZS0+U2V0UmVhZGVyRG9jdW1lbnQocERvY3VtZW50KTsKIAotCQkJCUlGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKLQkJCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgICAgICAgIElGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKKyAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogCi0JCQkJcENvbnRleHQtPk9uQm9va21hcmtfTW91c2VVcChwQm9va21hcmspOworICAgICAgICBwQ29udGV4dC0+T25Cb29rbWFya19Nb3VzZVVwKHBCb29rbWFyayk7CiAKLQkJCQlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JCQkJRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCBjc0luZm8pOwotCQkJCWlmICghYlJldCkKLQkJCQl7Ci0JCQkJCS8vQ0JDTF9Gb3JtTm90aWZ5OjpNc2dCb3hKU0Vycm9yKHBQYWdlVmlldy0+R2V0UGFnZVZpZXdXbmQoKSwgY3NJbmZvKTsKLQkJCQl9CisgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzSW5mbzsKKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCBjc0luZm8pOworICAgICAgICBpZiAoIWJSZXQpIHsKKyAgICAgICAgICAvLyBDQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLAorICAgICAgICAgIC8vIGNzSW5mbyk7CisgICAgICAgIH0KIAotCQkJCXBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJRG9BY3Rpb25fTm9KcyhhY3Rpb24sIHBEb2N1bWVudCk7Ci0JfQorICAgICAgICBwUnVudGltZS0+UmVsZWFzZUNvbnRleHQocENvbnRleHQpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBEb0FjdGlvbl9Ob0pzKGFjdGlvbiwgcERvY3VtZW50KTsKKyAgfQogCi0JZm9yIChpbnQzMl90IGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKLQl7Ci0JCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZUJvb2tNYXJrKHN1YmFjdGlvbiwgcERvY3VtZW50LCBwQm9va21hcmssIGxpc3QpKSByZXR1cm4gRkFMU0U7Ci0JfQorICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gYWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgIENQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7CisgICAgaWYgKCFFeGVjdXRlQm9va01hcmsoc3ViYWN0aW9uLCBwRG9jdW1lbnQsIHBCb29rbWFyaywgbGlzdCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX05vSnMoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fTm9Kcyhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLQlzd2l0Y2ggKGFjdGlvbi5HZXRUeXBlKCkpCi0JewotCWNhc2UgQ1BERl9BY3Rpb246OkdvVG86Ci0JCURvQWN0aW9uX0dvVG8ocERvY3VtZW50LCBhY3Rpb24pOwotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpHb1RvUjoKLQkJRG9BY3Rpb25fR29Ub1IocERvY3VtZW50LCBhY3Rpb24pOwotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpHb1RvRToKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FjdGlvbjo6TGF1bmNoOgotCQlEb0FjdGlvbl9MYXVuY2gocERvY3VtZW50LCBhY3Rpb24pOwotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpUaHJlYWQ6Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BY3Rpb246OlVSSToKLQkJRG9BY3Rpb25fVVJJKHBEb2N1bWVudCwgYWN0aW9uKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FjdGlvbjo6U291bmQ6Ci0JCWlmIChtX3BNZWRpYUFjdGlvbkhhbmRsZXIpCi0JCXsKLQkJCW1fcE1lZGlhQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fU291bmQoYWN0aW9uLCBwRG9jdW1lbnQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BY3Rpb246Ok1vdmllOgotCQlpZiAobV9wTWVkaWFBY3Rpb25IYW5kbGVyKQotCQl7Ci0JCQltX3BNZWRpYUFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX01vdmllKGFjdGlvbiwgcERvY3VtZW50KTsKLQkJfQotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpIaWRlOgotCQlpZiAobV9wRm9ybUFjdGlvbkhhbmRsZXIpCi0JCXsKLQkJCW1fcEZvcm1BY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9IaWRlKGFjdGlvbiwgcERvY3VtZW50KTsKLQkJfQotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpOYW1lZDoKLQkJRG9BY3Rpb25fTmFtZWQocERvY3VtZW50LCBhY3Rpb24pOwotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpTdWJtaXRGb3JtOgotCQlpZiAobV9wRm9ybUFjdGlvbkhhbmRsZXIpCi0JCXsKLQkJCW1fcEZvcm1BY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9TdWJtaXRGb3JtKGFjdGlvbiwgcERvY3VtZW50KTsKLQkJfQotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpSZXNldEZvcm06Ci0JCWlmIChtX3BGb3JtQWN0aW9uSGFuZGxlcikKLQkJewotCQkJbV9wRm9ybUFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX1Jlc2V0Rm9ybShhY3Rpb24sIHBEb2N1bWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FjdGlvbjo6SW1wb3J0RGF0YToKLQkJaWYgKG1fcEZvcm1BY3Rpb25IYW5kbGVyKQotCQl7Ci0JCQltX3BGb3JtQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fSW1wb3J0RGF0YShhY3Rpb24sIHBEb2N1bWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdDoKLQkJQVNTRVJUKEZBTFNFKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FjdGlvbjo6U2V0T0NHU3RhdGU6Ci0JCURvQWN0aW9uX1NldE9DR1N0YXRlKHBEb2N1bWVudCwgIGFjdGlvbik7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BY3Rpb246OlJlbmRpdGlvbjoKLQkJaWYgKG1fcE1lZGlhQWN0aW9uSGFuZGxlcikKLQkJewotCQkJbV9wTWVkaWFBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9SZW5kaXRpb24oYWN0aW9uLCBwRG9jdW1lbnQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BY3Rpb246OlRyYW5zOgotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpHb1RvM0RWaWV3OgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisgIHN3aXRjaCAoYWN0aW9uLkdldFR5cGUoKSkgeworICAgIGNhc2UgQ1BERl9BY3Rpb246OkdvVG86CisgICAgICBEb0FjdGlvbl9Hb1RvKHBEb2N1bWVudCwgYWN0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246OkdvVG9SOgorICAgICAgRG9BY3Rpb25fR29Ub1IocERvY3VtZW50LCBhY3Rpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6R29Ub0U6CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpMYXVuY2g6CisgICAgICBEb0FjdGlvbl9MYXVuY2gocERvY3VtZW50LCBhY3Rpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6VGhyZWFkOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6VVJJOgorICAgICAgRG9BY3Rpb25fVVJJKHBEb2N1bWVudCwgYWN0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246OlNvdW5kOgorICAgICAgaWYgKG1fcE1lZGlhQWN0aW9uSGFuZGxlcikgeworICAgICAgICBtX3BNZWRpYUFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX1NvdW5kKGFjdGlvbiwgcERvY3VtZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246Ok1vdmllOgorICAgICAgaWYgKG1fcE1lZGlhQWN0aW9uSGFuZGxlcikgeworICAgICAgICBtX3BNZWRpYUFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX01vdmllKGFjdGlvbiwgcERvY3VtZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246OkhpZGU6CisgICAgICBpZiAobV9wRm9ybUFjdGlvbkhhbmRsZXIpIHsKKyAgICAgICAgbV9wRm9ybUFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX0hpZGUoYWN0aW9uLCBwRG9jdW1lbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6TmFtZWQ6CisgICAgICBEb0FjdGlvbl9OYW1lZChwRG9jdW1lbnQsIGFjdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpTdWJtaXRGb3JtOgorICAgICAgaWYgKG1fcEZvcm1BY3Rpb25IYW5kbGVyKSB7CisgICAgICAgIG1fcEZvcm1BY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9TdWJtaXRGb3JtKGFjdGlvbiwgcERvY3VtZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246OlJlc2V0Rm9ybToKKyAgICAgIGlmIChtX3BGb3JtQWN0aW9uSGFuZGxlcikgeworICAgICAgICBtX3BGb3JtQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fUmVzZXRGb3JtKGFjdGlvbiwgcERvY3VtZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246OkltcG9ydERhdGE6CisgICAgICBpZiAobV9wRm9ybUFjdGlvbkhhbmRsZXIpIHsKKyAgICAgICAgbV9wRm9ybUFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX0ltcG9ydERhdGEoYWN0aW9uLCBwRG9jdW1lbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdDoKKyAgICAgIEFTU0VSVChGQUxTRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpTZXRPQ0dTdGF0ZToKKyAgICAgIERvQWN0aW9uX1NldE9DR1N0YXRlKHBEb2N1bWVudCwgYWN0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246OlJlbmRpdGlvbjoKKyAgICAgIGlmIChtX3BNZWRpYUFjdGlvbkhhbmRsZXIpIHsKKyAgICAgICAgbV9wTWVkaWFBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9SZW5kaXRpb24oYWN0aW9uLCBwRG9jdW1lbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6VHJhbnM6CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpHb1RvM0RWaWV3OgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpJc1ZhbGlkRG9jVmlldyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpJc1ZhbGlkRG9jVmlldyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Hb1RvKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKLQkJCQkJCQkJICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQotewotCUFTU0VSVChhY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICBBU1NFUlQoYWN0aW9uKTsKIAotCUNQREZfRG9jdW1lbnQqIHBQREZEb2N1bWVudCA9IHBEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCk7Ci0JQVNTRVJUKHBQREZEb2N1bWVudCAhPSBOVUxMKTsKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcERvY3VtZW50LT5HZXRFbnYoKTsKLQlBU1NFUlQocEFwcCAhPSBOVUxMKTsKKyAgQ1BERl9Eb2N1bWVudCogcFBERkRvY3VtZW50ID0gcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKTsKKyAgQVNTRVJUKHBQREZEb2N1bWVudCAhPSBOVUxMKTsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBEb2N1bWVudC0+R2V0RW52KCk7CisgIEFTU0VSVChwQXBwICE9IE5VTEwpOwogCi0JQ1BERl9EZXN0IE15RGVzdCA9IGFjdGlvbi5HZXREZXN0KHBQREZEb2N1bWVudCk7Ci0JaW50IG5QYWdlSW5kZXggPSBNeURlc3QuR2V0UGFnZUluZGV4KHBQREZEb2N1bWVudCk7Ci0JaW50IG5GaXRUeXBlID0gTXlEZXN0LkdldFpvb21Nb2RlKCk7Ci0JY29uc3QgQ1BERl9BcnJheSAqIHBNeUFycmF5ID0gKENQREZfQXJyYXkqKU15RGVzdC5HZXRPYmplY3QoKTsKLQlmbG9hdCogcFBvc0FyeSA9IE5VTEw7Ci0JaW50IHNpemVPZkFyeSA9IDA7Ci0JaWYgKHBNeUFycmF5ICE9IE5VTEwpCi0JewotCQlwUG9zQXJ5ID0gbmV3IGZsb2F0W3BNeUFycmF5LT5HZXRDb3VudCgpXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMjsgaSA8IChpbnQpcE15QXJyYXktPkdldENvdW50KCk7IGkrKykKLQkJewotCQkJcFBvc0FyeVtqKytdID0gcE15QXJyYXktPkdldEZsb2F0KGkpOwotCQl9Ci0JCXNpemVPZkFyeSA9IGo7Ci0JfQotCXBBcHAtPkZGSV9Eb0dvVG9BY3Rpb24oblBhZ2VJbmRleCwgbkZpdFR5cGUsIHBQb3NBcnksIHNpemVPZkFyeSk7Ci0JaWYocFBvc0FyeSkKLQkJZGVsZXRlW10gcFBvc0FyeTsKKyAgQ1BERl9EZXN0IE15RGVzdCA9IGFjdGlvbi5HZXREZXN0KHBQREZEb2N1bWVudCk7CisgIGludCBuUGFnZUluZGV4ID0gTXlEZXN0LkdldFBhZ2VJbmRleChwUERGRG9jdW1lbnQpOworICBpbnQgbkZpdFR5cGUgPSBNeURlc3QuR2V0Wm9vbU1vZGUoKTsKKyAgY29uc3QgQ1BERl9BcnJheSogcE15QXJyYXkgPSAoQ1BERl9BcnJheSopTXlEZXN0LkdldE9iamVjdCgpOworICBmbG9hdCogcFBvc0FyeSA9IE5VTEw7CisgIGludCBzaXplT2ZBcnkgPSAwOworICBpZiAocE15QXJyYXkgIT0gTlVMTCkgeworICAgIHBQb3NBcnkgPSBuZXcgZmxvYXRbcE15QXJyYXktPkdldENvdW50KCldOworICAgIGludCBqID0gMDsKKyAgICBmb3IgKGludCBpID0gMjsgaSA8IChpbnQpcE15QXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgICAgcFBvc0FyeVtqKytdID0gcE15QXJyYXktPkdldEZsb2F0KGkpOworICAgIH0KKyAgICBzaXplT2ZBcnkgPSBqOworICB9CisgIHBBcHAtPkZGSV9Eb0dvVG9BY3Rpb24oblBhZ2VJbmRleCwgbkZpdFR5cGUsIHBQb3NBcnksIHNpemVPZkFyeSk7CisgIGlmIChwUG9zQXJ5KQorICAgIGRlbGV0ZVtdIHBQb3NBcnk7CiB9CiAKLXZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Hb1RvUihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCi17Cit2b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fR29Ub1IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pIHt9CiAKK3ZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9MYXVuY2goQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKSB7fQorCit2b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fVVJJKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICBBU1NFUlQoYWN0aW9uKTsKKworICBDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBBcHAgIT0gTlVMTCk7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgc1VSSSA9IGFjdGlvbi5HZXRVUkkocERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKSk7CisgIHBBcHAtPkZGSV9Eb1VSSUFjdGlvbihzVVJJLmNfc3RyKCkpOwogfQogCi12b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fTGF1bmNoKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKLXsKK3ZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9OYW1lZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICBBU1NFUlQoYWN0aW9uKTsKIAorICBDRlhfQnl0ZVN0cmluZyBjc05hbWUgPSBhY3Rpb24uR2V0TmFtZWRBY3Rpb24oKTsKKyAgcERvY3VtZW50LT5HZXRFbnYoKS0+RkZJX0V4ZWN1dGVOYW1lZEFjdGlvbihjc05hbWUpOwogfQogCi12b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fVVJJKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKLXsKLSAJQVNTRVJUKGFjdGlvbik7Cit2b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU2V0T0NHU3RhdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pIHt9CiAKLSAJQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBEb2N1bWVudC0+R2V0RW52KCk7Ci0gCUFTU0VSVChwQXBwICE9IE5VTEwpOwordm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OlJ1bkZpZWxkSmF2YVNjcmlwdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCkgeworICBBU1NFUlQodHlwZSAhPSBDUERGX0FBY3Rpb246OkNhbGN1bGF0ZSk7CisgIEFTU0VSVCh0eXBlICE9IENQREZfQUFjdGlvbjo6Rm9ybWF0KTsKIAotIAlDRlhfQnl0ZVN0cmluZyBzVVJJID0gYWN0aW9uLkdldFVSSShwRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpKTsKLSAJcEFwcC0+RkZJX0RvVVJJQWN0aW9uKHNVUkkuY19zdHIoKSk7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgSUZYSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwRG9jdW1lbnQtPkdldEpzUnVudGltZSgpOworICBBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CisKKyAgcFJ1bnRpbWUtPlNldFJlYWRlckRvY3VtZW50KHBEb2N1bWVudCk7CisKKyAgSUZYSlNfQ29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+TmV3Q29udGV4dCgpOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkN1cnNvckVudGVyOgorICAgICAgcENvbnRleHQtPk9uRmllbGRfTW91c2VFbnRlcihkYXRhLmJNb2RpZmllciwgZGF0YS5iU2hpZnQsIHBGb3JtRmllbGQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkN1cnNvckV4aXQ6CisgICAgICBwQ29udGV4dC0+T25GaWVsZF9Nb3VzZUV4aXQoZGF0YS5iTW9kaWZpZXIsIGRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25Eb3duOgorICAgICAgcENvbnRleHQtPk9uRmllbGRfTW91c2VEb3duKGRhdGEuYk1vZGlmaWVyLCBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6QnV0dG9uVXA6CisgICAgICBwQ29udGV4dC0+T25GaWVsZF9Nb3VzZVVwKGRhdGEuYk1vZGlmaWVyLCBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6R2V0Rm9jdXM6CisgICAgICBwQ29udGV4dC0+T25GaWVsZF9Gb2N1cyhkYXRhLmJNb2RpZmllciwgZGF0YS5iU2hpZnQsIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnNWYWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6TG9zZUZvY3VzOgorICAgICAgcENvbnRleHQtPk9uRmllbGRfQmx1cihkYXRhLmJNb2RpZmllciwgZGF0YS5iU2hpZnQsIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc1ZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6CisgICAgICBwQ29udGV4dC0+T25GaWVsZF9LZXlzdHJva2UoZGF0YS5zQ2hhbmdlLCBkYXRhLnNDaGFuZ2VFeCwgZGF0YS5iS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJNb2RpZmllciwgZGF0YS5uU2VsRW5kLCBkYXRhLm5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCwgZGF0YS5zVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5iV2lsbENvbW1pdCwgZGF0YS5iRmllbGRGdWxsLCBkYXRhLmJSQyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6VmFsaWRhdGU6CisgICAgICBwQ29udGV4dC0+T25GaWVsZF9WYWxpZGF0ZShkYXRhLnNDaGFuZ2UsIGRhdGEuc0NoYW5nZUV4LCBkYXRhLmJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5iTW9kaWZpZXIsIGRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zVmFsdWUsIGRhdGEuYlJDKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgYnJlYWs7CisgIH0KKworICBDRlhfV2lkZVN0cmluZyBjc0luZm87CisgIEZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCBjc0luZm8pOworICBpZiAoIWJSZXQpIHsKKyAgICAvLyBDQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOworICB9CisKKyAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKIH0KIAotdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX05hbWVkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKLXsKLSAJQVNTRVJUKGFjdGlvbik7Cit2b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6UnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdCgKKyAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNTY3JpcHROYW1lLAorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIAotIAlDRlhfQnl0ZVN0cmluZyBjc05hbWUgPSBhY3Rpb24uR2V0TmFtZWRBY3Rpb24oKTsKLSAJcERvY3VtZW50LT5HZXRFbnYoKS0+RkZJX0V4ZWN1dGVOYW1lZEFjdGlvbihjc05hbWUpOworICBJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IHBEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKworICBwUnVudGltZS0+U2V0UmVhZGVyRG9jdW1lbnQocERvY3VtZW50KTsKKworICBJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKworICBwQ29udGV4dC0+T25Eb2NfT3BlbihwRG9jdW1lbnQsIHNTY3JpcHROYW1lKTsKKworICBDRlhfV2lkZVN0cmluZyBjc0luZm87CisgIEZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCBjc0luZm8pOworICBpZiAoIWJSZXQpIHsKKyAgICAvLyBDQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOworICB9CisKKyAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKIH0KIAordm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OlJ1bkRvY3VtZW50UGFnZUphdmFTY3JpcHQoCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KSB7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLXZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9TZXRPQ0dTdGF0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCi17CisgIElGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gcERvY3VtZW50LT5HZXRKc1J1bnRpbWUoKTsKKyAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworCisgIHBSdW50aW1lLT5TZXRSZWFkZXJEb2N1bWVudChwRG9jdW1lbnQpOworCisgIElGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpPcGVuUGFnZToKKyAgICAgIHBDb250ZXh0LT5PblBhZ2VfT3BlbihwRG9jdW1lbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkNsb3NlUGFnZToKKyAgICAgIHBDb250ZXh0LT5PblBhZ2VfQ2xvc2UocERvY3VtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpDbG9zZURvY3VtZW50OgorICAgICAgcENvbnRleHQtPk9uRG9jX1dpbGxDbG9zZShwRG9jdW1lbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlNhdmVEb2N1bWVudDoKKyAgICAgIHBDb250ZXh0LT5PbkRvY19XaWxsU2F2ZShwRG9jdW1lbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkRvY3VtZW50U2F2ZWQ6CisgICAgICBwQ29udGV4dC0+T25Eb2NfRGlkU2F2ZShwRG9jdW1lbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlByaW50RG9jdW1lbnQ6CisgICAgICBwQ29udGV4dC0+T25Eb2NfV2lsbFByaW50KHBEb2N1bWVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6RG9jdW1lbnRQcmludGVkOgorICAgICAgcENvbnRleHQtPk9uRG9jX0RpZFByaW50KHBEb2N1bWVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6UGFnZVZpc2libGU6CisgICAgICBwQ29udGV4dC0+T25QYWdlX0luVmlldyhwRG9jdW1lbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VJbnZpc2libGU6CisgICAgICBwQ29udGV4dC0+T25QYWdlX091dFZpZXcocERvY3VtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgYnJlYWs7CisgIH0KKworICBDRlhfV2lkZVN0cmluZyBjc0luZm87CisgIEZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCBjc0luZm8pOworICBpZiAoIWJSZXQpIHsKKyAgICAvLyBDQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOworICB9CisKKyAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKIH0KIAotdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OlJ1bkZpZWxkSmF2YVNjcmlwdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCi0JCQkJCQkJCQkJUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KQotewotCUFTU0VSVCh0eXBlICE9IENQREZfQUFjdGlvbjo6Q2FsY3VsYXRlKTsKLQlBU1NFUlQodHlwZSAhPSBDUERGX0FBY3Rpb246OkZvcm1hdCk7CitGWF9CT09MIENQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIAotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKIAotCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gcERvY3VtZW50LT5HZXRKc1J1bnRpbWUoKTsKLQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CisgIGlmIChwSW50ZXJGb3JtLT5Eb0FjdGlvbl9IaWRlKGFjdGlvbikpIHsKKyAgICBwRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JcFJ1bnRpbWUtPlNldFJlYWRlckRvY3VtZW50KHBEb2N1bWVudCk7Ci0KLQlJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCi0Jc3dpdGNoICh0eXBlKQotCXsKLQljYXNlIENQREZfQUFjdGlvbjo6Q3Vyc29yRW50ZXI6Ci0JCXBDb250ZXh0LT5PbkZpZWxkX01vdXNlRW50ZXIoZGF0YS5iTW9kaWZpZXIsIGRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OkN1cnNvckV4aXQ6Ci0JCXBDb250ZXh0LT5PbkZpZWxkX01vdXNlRXhpdChkYXRhLmJNb2RpZmllciwgZGF0YS5iU2hpZnQsIHBGb3JtRmllbGQpOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6QnV0dG9uRG93bjoKLQkJcENvbnRleHQtPk9uRmllbGRfTW91c2VEb3duKGRhdGEuYk1vZGlmaWVyLCBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25VcDoKLQkJcENvbnRleHQtPk9uRmllbGRfTW91c2VVcChkYXRhLmJNb2RpZmllciwgZGF0YS5iU2hpZnQsIHBGb3JtRmllbGQpOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6R2V0Rm9jdXM6Ci0JCXBDb250ZXh0LT5PbkZpZWxkX0ZvY3VzKGRhdGEuYk1vZGlmaWVyLCBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCwgZGF0YS5zVmFsdWUpOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6TG9zZUZvY3VzOgotCQlwQ29udGV4dC0+T25GaWVsZF9CbHVyKGRhdGEuYk1vZGlmaWVyLCBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCwgZGF0YS5zVmFsdWUpOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgotCQlwQ29udGV4dC0+T25GaWVsZF9LZXlzdHJva2UoZGF0YS5zQ2hhbmdlLCBkYXRhLnNDaGFuZ2VFeCwgZGF0YS5iS2V5RG93biwKLQkJCWRhdGEuYk1vZGlmaWVyLCBkYXRhLm5TZWxFbmQsIGRhdGEublNlbFN0YXJ0LCBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCwgZGF0YS5zVmFsdWUsCi0JCQlkYXRhLmJXaWxsQ29tbWl0LCBkYXRhLmJGaWVsZEZ1bGwsIGRhdGEuYlJDKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OlZhbGlkYXRlOgotCQlwQ29udGV4dC0+T25GaWVsZF9WYWxpZGF0ZShkYXRhLnNDaGFuZ2UsIGRhdGEuc0NoYW5nZUV4LCBkYXRhLmJLZXlEb3duLCBkYXRhLmJNb2RpZmllciwKLQkJCWRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkLCBkYXRhLnNWYWx1ZSwgZGF0YS5iUkMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlBU1NFUlQoRkFMU0UpOwotCQlicmVhazsKLQl9Ci0KLQlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7Ci0JaWYgKCFiUmV0KQotCXsKLQkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwotCX0KLQotCXBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OlJ1bkRvY3VtZW50T3BlbkphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc1NjcmlwdE5hbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU3VibWl0Rm9ybSgKKyAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCi0JSUZYSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwRG9jdW1lbnQtPkdldEpzUnVudGltZSgpOwotCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwogCi0JcFJ1bnRpbWUtPlNldFJlYWRlckRvY3VtZW50KHBEb2N1bWVudCk7Ci0KLQlJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCi0JcENvbnRleHQtPk9uRG9jX09wZW4ocERvY3VtZW50LCBzU2NyaXB0TmFtZSk7Ci0KLQlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7Ci0JaWYgKCFiUmV0KQotCXsKLQkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwotCX0KLQotCXBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7CisgIHJldHVybiBwSW50ZXJGb3JtLT5Eb0FjdGlvbl9TdWJtaXRGb3JtKGFjdGlvbik7CiB9CiAKLXZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpSdW5Eb2N1bWVudFBhZ2VKYXZhU2NyaXB0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIENQREZTREtfRm9ybUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1Jlc2V0Rm9ybSgKKyAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCi0JSUZYSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwRG9jdW1lbnQtPkdldEpzUnVudGltZSgpOwotCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwogCi0JcFJ1bnRpbWUtPlNldFJlYWRlckRvY3VtZW50KHBEb2N1bWVudCk7CisgIGlmIChwSW50ZXJGb3JtLT5Eb0FjdGlvbl9SZXNldEZvcm0oYWN0aW9uKSkgeworICAgIHJldHVybiBUUlVFOworICB9CiAKLQlJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCi0Jc3dpdGNoICh0eXBlKQotCXsKLQljYXNlIENQREZfQUFjdGlvbjo6T3BlblBhZ2U6Ci0JCXBDb250ZXh0LT5PblBhZ2VfT3BlbihwRG9jdW1lbnQpOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6Q2xvc2VQYWdlOgotCQlwQ29udGV4dC0+T25QYWdlX0Nsb3NlKHBEb2N1bWVudCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpDbG9zZURvY3VtZW50OgotCQlwQ29udGV4dC0+T25Eb2NfV2lsbENsb3NlKHBEb2N1bWVudCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpTYXZlRG9jdW1lbnQ6Ci0JCXBDb250ZXh0LT5PbkRvY19XaWxsU2F2ZShwRG9jdW1lbnQpOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6RG9jdW1lbnRTYXZlZDoKLQkJcENvbnRleHQtPk9uRG9jX0RpZFNhdmUocERvY3VtZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OlByaW50RG9jdW1lbnQ6Ci0JCXBDb250ZXh0LT5PbkRvY19XaWxsUHJpbnQocERvY3VtZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OkRvY3VtZW50UHJpbnRlZDoKLQkJcENvbnRleHQtPk9uRG9jX0RpZFByaW50KHBEb2N1bWVudCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlVmlzaWJsZToKLQkJcENvbnRleHQtPk9uUGFnZV9JblZpZXcocERvY3VtZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VJbnZpc2libGU6Ci0JCXBDb250ZXh0LT5PblBhZ2VfT3V0VmlldyhwRG9jdW1lbnQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlBU1NFUlQoRkFMU0UpOwotCQlicmVhazsKLQl9Ci0KLQlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7Ci0JaWYgKCFiUmV0KQotCXsKLQkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwotCX0KLQotCXBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7CisgIHJldHVybiBGQUxTRTsKIH0KIAorRlhfQk9PTCBDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9JbXBvcnREYXRhKAorICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLUZYX0JPT0wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fSGlkZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwogCi0JQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisgIGlmIChwSW50ZXJGb3JtLT5Eb0FjdGlvbl9JbXBvcnREYXRhKGFjdGlvbikpIHsKKyAgICBwRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JaWYgKHBJbnRlckZvcm0tPkRvQWN0aW9uX0hpZGUoYWN0aW9uKSkKLQl7Ci0JCXBEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCi0JQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLQlyZXR1cm4gcEludGVyRm9ybS0+RG9BY3Rpb25fU3VibWl0Rm9ybShhY3Rpb24pOworRlhfQk9PTCBDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUmVuZGl0aW9uKAorICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9SZXNldEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotCWlmIChwSW50ZXJGb3JtLT5Eb0FjdGlvbl9SZXNldEZvcm0oYWN0aW9uKSkKLQl7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1NvdW5kKAorICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9JbXBvcnREYXRhKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCi0JQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLQlpZiAocEludGVyRm9ybS0+RG9BY3Rpb25fSW1wb3J0RGF0YShhY3Rpb24pKQotCXsKLQkJcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTAlDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUmVuZGl0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1NvdW5kKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX01vdmllKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfTWVkaWFBY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Nb3ZpZSgKKyAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX2Fubm90aGFuZGxlci5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX2Fubm90aGFuZGxlci5jcHAKaW5kZXggZWJkZDY3ZS4uYTcyOWZiNyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19hbm5vdGhhbmRsZXIuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfYW5ub3RoYW5kbGVyLmNwcApAQCAtMTEsMTM0NyArMTEsMTMxMCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaCIKIAorQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkNQREZTREtfQW5ub3RIYW5kbGVyTWdyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApIHsKKyAgbV9wQXBwID0gcEFwcDsKIAotQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkNQREZTREtfQW5ub3RIYW5kbGVyTWdyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApCi17Ci0gICAgbV9wQXBwID0gcEFwcDsKKyAgQ1BERlNES19CRkFubm90SGFuZGxlciogcEhhbmRsZXIgPSBuZXcgQ1BERlNES19CRkFubm90SGFuZGxlcihtX3BBcHApOworICBwSGFuZGxlci0+U2V0Rm9ybUZpbGxlcihtX3BBcHAtPkdldElGb3JtRmlsbGVyKCkpOworICBSZWdpc3RlckFubm90SGFuZGxlcihwSGFuZGxlcik7CiAKLSAgICBDUERGU0RLX0JGQW5ub3RIYW5kbGVyKiBwSGFuZGxlciA9IG5ldyBDUERGU0RLX0JGQW5ub3RIYW5kbGVyKG1fcEFwcCk7Ci0gICAgcEhhbmRsZXItPlNldEZvcm1GaWxsZXIobV9wQXBwLT5HZXRJRm9ybUZpbGxlcigpKTsKLSAgICBSZWdpc3RlckFubm90SGFuZGxlcihwSGFuZGxlcik7Ci0KLSAgICBDUERGU0RLX1hGQUFubm90SGFuZGxlciogcFhGQUFubm90SGFuZGxlciA9IG5ldyBDUERGU0RLX1hGQUFubm90SGFuZGxlcihtX3BBcHApOwotICAgIFJlZ2lzdGVyQW5ub3RIYW5kbGVyKHBYRkFBbm5vdEhhbmRsZXIpOworICBDUERGU0RLX1hGQUFubm90SGFuZGxlciogcFhGQUFubm90SGFuZGxlciA9CisgICAgICBuZXcgQ1BERlNES19YRkFBbm5vdEhhbmRsZXIobV9wQXBwKTsKKyAgUmVnaXN0ZXJBbm5vdEhhbmRsZXIocFhGQUFubm90SGFuZGxlcik7CiB9CiAKLUNQREZTREtfQW5ub3RIYW5kbGVyTWdyOjp+Q1BERlNES19Bbm5vdEhhbmRsZXJNZ3IoKQotewotICAgIGZvcihpbnQgaT0wOyBpPG1fSGFuZGxlcnMuR2V0U2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgICBJUERGU0RLX0Fubm90SGFuZGxlciogcEhhbmRsZXIgPSBtX0hhbmRsZXJzLkdldEF0KGkpOwotICAgICAgICBkZWxldGUgcEhhbmRsZXI7CitDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6fkNQREZTREtfQW5ub3RIYW5kbGVyTWdyKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1fSGFuZGxlcnMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBJUERGU0RLX0Fubm90SGFuZGxlciogcEhhbmRsZXIgPSBtX0hhbmRsZXJzLkdldEF0KGkpOworICAgIGRlbGV0ZSBwSGFuZGxlcjsKKyAgfQorICBtX0hhbmRsZXJzLlJlbW92ZUFsbCgpOworICBtX21hcFR5cGUySGFuZGxlci5SZW1vdmVBbGwoKTsKK30KKwordm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6UmVnaXN0ZXJBbm5vdEhhbmRsZXIoCisgICAgSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIpIHsKKyAgQVNTRVJUKHBBbm5vdEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgQVNTRVJUKEdldEFubm90SGFuZGxlcihwQW5ub3RIYW5kbGVyLT5HZXRUeXBlKCkpID09IE5VTEwpOworCisgIG1fSGFuZGxlcnMuQWRkKHBBbm5vdEhhbmRsZXIpOworICBtX21hcFR5cGUySGFuZGxlci5TZXRBdChwQW5ub3RIYW5kbGVyLT5HZXRUeXBlKCksICh2b2lkKilwQW5ub3RIYW5kbGVyKTsKK30KKwordm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6VW5SZWdpc3RlckFubm90SGFuZGxlcigKKyAgICBJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlcikgeworICBBU1NFUlQocEFubm90SGFuZGxlciAhPSBOVUxMKTsKKworICBtX21hcFR5cGUySGFuZGxlci5SZW1vdmVLZXkocEFubm90SGFuZGxlci0+R2V0VHlwZSgpKTsKKworICBmb3IgKGludCBpID0gMCwgc3ogPSBtX0hhbmRsZXJzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAobV9IYW5kbGVycy5HZXRBdChpKSA9PSBwQW5ub3RIYW5kbGVyKSB7CisgICAgICBtX0hhbmRsZXJzLlJlbW92ZUF0KGkpOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1fSGFuZGxlcnMuUmVtb3ZlQWxsKCk7Ci0gICAgbV9tYXBUeXBlMkhhbmRsZXIuUmVtb3ZlQWxsKCk7CisgIH0KIH0KIAotdm9pZCAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6UmVnaXN0ZXJBbm5vdEhhbmRsZXIoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIpCi17Ci0gICAgQVNTRVJUKHBBbm5vdEhhbmRsZXIgIT0gTlVMTCk7CitDUERGU0RLX0Fubm90KiBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6TmV3QW5ub3QoQ1BERl9Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0gICAgQVNTRVJUKEdldEFubm90SGFuZGxlcihwQW5ub3RIYW5kbGVyLT5HZXRUeXBlKCkpID09IE5VTEwpOworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPQorICAgICAgICAgIEdldEFubm90SGFuZGxlcihwQW5ub3QtPkdldFN1YlR5cGUoKSkpIHsKKyAgICByZXR1cm4gcEFubm90SGFuZGxlci0+TmV3QW5ub3QocEFubm90LCBwUGFnZVZpZXcpOworICB9CiAKLSAgICBtX0hhbmRsZXJzLkFkZChwQW5ub3RIYW5kbGVyKTsKLSAgICBtX21hcFR5cGUySGFuZGxlci5TZXRBdChwQW5ub3RIYW5kbGVyLT5HZXRUeXBlKCksICh2b2lkKilwQW5ub3RIYW5kbGVyKTsKKyAgcmV0dXJuIG5ldyBDUERGU0RLX0JBQW5ub3QocEFubm90LCBwUGFnZVZpZXcpOwogfQogCi12b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpVblJlZ2lzdGVyQW5ub3RIYW5kbGVyKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyKQotewotICAgIEFTU0VSVChwQW5ub3RIYW5kbGVyICE9IE5VTEwpOworQ1BERlNES19Bbm5vdCogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6Ok5ld0Fubm90KElYRkFfV2lkZ2V0KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKLSAgICBtX21hcFR5cGUySGFuZGxlci5SZW1vdmVLZXkocEFubm90SGFuZGxlci0+R2V0VHlwZSgpKTsKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0KKyAgICAgICAgICBHZXRBbm5vdEhhbmRsZXIoRlNES19YRkFXSURHRVRfVFlQRU5BTUUpKSB7CisgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk5ld0Fubm90KHBBbm5vdCwgcFBhZ2VWaWV3KTsKKyAgfQogCi0gICAgZm9yIChpbnQgaT0wLCBzej1tX0hhbmRsZXJzLkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKG1fSGFuZGxlcnMuR2V0QXQoaSkgPT0gcEFubm90SGFuZGxlcikKLSAgICAgICAgewotICAgICAgICAgICAgbV9IYW5kbGVycy5SZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQorICByZXR1cm4gTlVMTDsKIH0KIAotQ1BERlNES19Bbm5vdCogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6Ok5ld0Fubm90KENQREZfQW5ub3QgKiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldykKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAKLSAgICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90LT5HZXRTdWJUeXBlKCkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk5ld0Fubm90KHBBbm5vdCwgcFBhZ2VWaWV3KTsKLSAgICB9CisgIHBBbm5vdC0+R2V0UERGUGFnZSgpOwogCi0gICAgcmV0dXJuIG5ldyBDUERGU0RLX0JBQW5ub3QocEFubm90LCBwUGFnZVZpZXcpOworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHBBbm5vdEhhbmRsZXItPk9uUmVsZWFzZShwQW5ub3QpOworICAgIHBBbm5vdEhhbmRsZXItPlJlbGVhc2VBbm5vdChwQW5ub3QpOworICB9IGVsc2UgeworICAgIGRlbGV0ZSAoQ1BERlNES19Bbm5vdCopcEFubm90OworICB9CiB9CiAKLUNQREZTREtfQW5ub3QqIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpOZXdBbm5vdChJWEZBX1dpZGdldCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLSAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwordm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAKLSAgICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIoRlNES19YRkFXSURHRVRfVFlQRU5BTUUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk5ld0Fubm90KHBBbm5vdCwgcFBhZ2VWaWV3KTsKLSAgICB9CisgIENQREZfQW5ub3QqIHBQREZBbm5vdCA9IHBBbm5vdC0+R2V0UERGQW5ub3QoKTsKIAotICAgIHJldHVybiBOVUxMOworICBDUERGU0RLX0RhdGVUaW1lIGN1clRpbWU7CisgIHBQREZBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0U3RyaW5nKCJNIiwgY3VyVGltZS5Ub1BERkRhdGVUaW1lU3RyaW5nKCkpOworICBwUERGQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdE51bWJlcigiRiIsIDApOworCisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKSB7CisgICAgcEFubm90SGFuZGxlci0+T25DcmVhdGUocEFubm90KTsKKyAgfQogfQogCi12b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAKLSAgICBwQW5ub3QtPkdldFBERlBhZ2UoKTsKLQotICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotICAgIHsKLSAgICAgICAgcEFubm90SGFuZGxlci0+T25SZWxlYXNlKHBBbm5vdCk7Ci0gICAgICAgIHBBbm5vdEhhbmRsZXItPlJlbGVhc2VBbm5vdChwQW5ub3QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBkZWxldGUgKENQREZTREtfQW5ub3QqKXBBbm5vdDsKLSAgICB9CisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKSB7CisgICAgcEFubm90SGFuZGxlci0+T25Mb2FkKHBBbm5vdCk7CisgIH0KIH0KIAotdm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CitJUERGU0RLX0Fubm90SGFuZGxlciogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldEFubm90SGFuZGxlcigKKyAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIGNvbnN0IHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAotICAgIENQREZfQW5ub3QqIHBQREZBbm5vdCA9IHBBbm5vdC0+R2V0UERGQW5ub3QoKTsKLQotICAgIENQREZTREtfRGF0ZVRpbWUgY3VyVGltZTsKLSAgICBwUERGQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdFN0cmluZygiTSIsIGN1clRpbWUuVG9QREZEYXRlVGltZVN0cmluZygpKTsKLSAgICBwUERGQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdE51bWJlcigiRiIsIDApOwotCi0gICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0gICAgewotICAgICAgICBwQW5ub3RIYW5kbGVyLT5PbkNyZWF0ZShwQW5ub3QpOwotICAgIH0KKyAgQ1BERl9Bbm5vdCogcFBERkFubm90ID0gcEFubm90LT5HZXRQREZBbm5vdCgpOworICBpZiAocFBERkFubm90KQorICAgIHJldHVybiBHZXRBbm5vdEhhbmRsZXIocFBERkFubm90LT5HZXRTdWJUeXBlKCkpOworICBlbHNlIGlmIChwQW5ub3QtPkdldFhGQVdpZGdldCgpKQorICAgIHJldHVybiBHZXRBbm5vdEhhbmRsZXIoRlNES19YRkFXSURHRVRfVFlQRU5BTUUpOworICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0gICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0gICAgewotICAgICAgICBwQW5ub3RIYW5kbGVyLT5PbkxvYWQocEFubm90KTsKLSAgICB9CitJUERGU0RLX0Fubm90SGFuZGxlciogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldEFubm90SGFuZGxlcigKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1R5cGUpIGNvbnN0IHsKKyAgdm9pZCogcFJldCA9IE5VTEw7CisgIG1fbWFwVHlwZTJIYW5kbGVyLkxvb2t1cChzVHlwZSwgcFJldCk7CisgIHJldHVybiAoSVBERlNES19Bbm5vdEhhbmRsZXIqKXBSZXQ7CiB9CiAKLUlQREZTREtfQW5ub3RIYW5kbGVyKiBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6R2V0QW5ub3RIYW5kbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCkgY29uc3QKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwordm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAotICAgIENQREZfQW5ub3QqIHBQREZBbm5vdCA9IHBBbm5vdC0+R2V0UERGQW5ub3QoKTsKLSAgICBpZiAocFBERkFubm90KQotICAgICAgICByZXR1cm4gR2V0QW5ub3RIYW5kbGVyKHBQREZBbm5vdC0+R2V0U3ViVHlwZSgpKTsKLSAgICBlbHNlIGlmIChwQW5ub3QtPkdldFhGQVdpZGdldCgpKQotICAgICAgICByZXR1cm4gR2V0QW5ub3RIYW5kbGVyKEZTREtfWEZBV0lER0VUX1RZUEVOQU1FKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpIHsKKyAgICBwQW5ub3RIYW5kbGVyLT5PbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7CisgIH0gZWxzZSB7CisgICAgaWYgKCFwQW5ub3QtPklzWEZBRmllbGQoKSkKKyAgICAgICgoQ1BERlNES19CQUFubm90KilwQW5ub3QpCisgICAgICAgICAgLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7CisgIH0KIH0KIAotSVBERlNES19Bbm5vdEhhbmRsZXIqIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpHZXRBbm5vdEhhbmRsZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNUeXBlKSBjb25zdAotewotICAgIHZvaWQqIHBSZXQgPSBOVUxMOwotICAgIG1fbWFwVHlwZTJIYW5kbGVyLkxvb2t1cChzVHlwZSwgcFJldCk7Ci0gICAgcmV0dXJuIChJUERGU0RLX0Fubm90SGFuZGxlciopcFJldDsKK0ZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTEJ1dHRvbkRvd24oCisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PbkxCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworCisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKSB7CisgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uTEJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxCdXR0b25EYmxDbGsoCisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PbkxCdXR0b25EYmxDbGsocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpIHsKKyAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25Nb3VzZU1vdmUocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlV2hlZWwocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uUkJ1dHRvbkRvd24oCisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PblJCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworCisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKSB7CisgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uUkJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxGWF9EV09SRCBkd0ZsYWdzKQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9Pbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCi0gICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0gICAgewotICAgICAgICBwQW5ub3RIYW5kbGVyLT5PbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICghcEFubm90LT5Jc1hGQUZpZWxkKCkpCi0gICAgICAgICAgICAoKENQREZTREtfQkFBbm5vdCopcEFubm90KS0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwotICAgIH0KKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpIHsKKyAgICBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlRW50ZXIocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFnKTsKKyAgfQorICByZXR1cm47CiB9CiAKK3ZvaWQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAKLUZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0KLSAgICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PbkxCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotIHsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0gICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0gICAgewotICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci0gfQotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0gICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0gICAgewotICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25MQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0KLSAgICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlTW92ZShwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0gICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0gICAgewotICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25Nb3VzZVdoZWVsKHBQYWdlVmlldywgcEFubm90LG5GbGFncyx6RGVsdGEsIHBvaW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQotICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uUkJ1dHRvbkRvd24ocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQotICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uUkJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHBBbm5vdEhhbmRsZXItPk9uTW91c2VFeGl0KHBQYWdlVmlldywgcEFubm90LCBuRmxhZyk7CisgIH0KKyAgcmV0dXJuOwogfQogCi12b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9Pbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0gICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0gICAgewotICAgICAgICBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlRW50ZXIocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFnKTsKLSAgICB9Ci0gICAgcmV0dXJuIDsKK0ZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzKSB7CisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKSB7CisgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GbGFnKSB7CisgIGlmICghbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZykgJiYgIW1fcEFwcC0+RkZJX0lzQUxUS2V5RG93bihuRmxhZykpIHsKKyAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKKyAgICBDUERGU0RLX0Fubm90KiBwRm9jdXNBbm5vdCA9IHBQYWdlLT5HZXRGb2N1c0Fubm90KCk7CisgICAgaWYgKHBGb2N1c0Fubm90ICYmIChuS2V5Q29kZSA9PSBGV0xfVktFWV9UYWIpKSB7CisgICAgICBDUERGU0RLX0Fubm90KiBwTmV4dCA9CisgICAgICAgICAgR2V0TmV4dEFubm90KHBGb2N1c0Fubm90LCAhbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpKTsKIAotICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotICAgIHsKLSAgICAgICAgcEFubm90SGFuZGxlci0+T25Nb3VzZUV4aXQocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFnKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKQotewotCi0gICAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0gICAgewotICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25DaGFyKHBBbm5vdCxuQ2hhciwgbkZsYWdzKTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotCi19Ci0KLUZYX0JPT0wgICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCi17Ci0KLSAgICBpZiAoIW1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpICYmICFtX3BBcHAtPkZGSV9Jc0FMVEtleURvd24obkZsYWcpKQotICAgIHsKLSAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2UgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7Ci0gICAgICAgIENQREZTREtfQW5ub3QqIHBGb2N1c0Fubm90ID0gcFBhZ2UtPkdldEZvY3VzQW5ub3QoKTsKLSAgICAgICAgaWYgKHBGb2N1c0Fubm90ICYmIChuS2V5Q29kZSA9PSBGV0xfVktFWV9UYWIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwTmV4dCA9IEdldE5leHRBbm5vdChwRm9jdXNBbm5vdCwgIW1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKSk7Ci0KLSAgICAgICAgICAgIGlmKHBOZXh0ICYmIHBOZXh0ICE9IHBGb2N1c0Fubm90KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlLT5HZXRTREtEb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIHBEb2N1bWVudC0+U2V0Rm9jdXNBbm5vdChwTmV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PbktleURvd24ocEFubm90LG5LZXlDb2RlLCBuRmxhZyk7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQotewotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCAgICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQotICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotICAgIHsKLSAgICAgICAgaWYgKHBBbm5vdEhhbmRsZXItPk9uU2V0Rm9jdXMocEFubm90LCBuRmxhZykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlID0gcEFubm90LT5HZXRQYWdlVmlldygpOwotICAgICAgICAgICAgcFBhZ2UtPkdldFNES0RvY3VtZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKLXsKLSAgICBBU1NFUlQocEFubm90KTsKLSAgICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLSAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uS2lsbEZvY3VzKHBBbm5vdCwgbkZsYWcpOwotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkNoYW5nZUZvY3VzKENQREZTREtfQW5ub3QqIHBTZXRBbm5vdCxDUERGU0RLX0Fubm90KiBwS2lsbEFubm90KQotewotICAgIEZYX0JPT0wgYlhGQSA9IChwU2V0QW5ub3QgJiYgcFNldEFubm90LT5HZXRYRkFXaWRnZXQoKSkgfHwKLSAgICAgICAgKHBLaWxsQW5ub3QgJiYgcEtpbGxBbm5vdC0+R2V0WEZBV2lkZ2V0KCkpOwotCi0gICAgaWYgKGJYRkEpCi0gICAgewotICAgICAgICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBYRkFBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIoRlNES19YRkFXSURHRVRfVFlQRU5BTUUpKQotICAgICAgICAgICAgcmV0dXJuIHBYRkFBbm5vdEhhbmRsZXItPk9uWEZBQ2hhbmdlZEZvY3VzKHBLaWxsQW5ub3QsIHBTZXRBbm5vdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUNQREZfUmVjdCAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQotewotICAgIEFTU0VSVChwQW5ub3QpOwotICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOwotCi0gICAgcmV0dXJuIHBBbm5vdC0+R2V0UmVjdCgpOwotfQotCi1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIEFTU0VSVChwQW5ub3QpOwotICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotICAgIHsKLSAgICAgICAgaWYgKHBBbm5vdEhhbmRsZXItPkNhbkFuc3dlcihwQW5ub3QpKQotICAgICAgICAgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPkhpdFRlc3QocFBhZ2VWaWV3LCBwQW5ub3QsIHBvaW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1DUERGU0RLX0Fubm90KiAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsRlhfQk9PTCBiTmV4dCkKLXsKLSAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSAgcFNES0Fubm90LT5HZXRQYWdlVmlldygpOwotICAgIENQREZYRkFfUGFnZSogcFBhZ2UgPSBwUGFnZVZpZXctPkdldFBERlhGQVBhZ2UoKTsKLSAgICBpZiAocFBhZ2UgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHBQYWdlLT5HZXRQREZQYWdlKCkpIHsgLy8gZm9yIHBkZiBhbm5vdHMuCi0gICAgICAgIENCQV9Bbm5vdEl0ZXJhdG9yIGFpKHBTREtBbm5vdC0+R2V0UGFnZVZpZXcoKSwgcFNES0Fubm90LT5HZXRUeXBlKCksICIiKTsKLSAgICAgICAgQ1BERlNES19Bbm5vdCogcE5leHQgPSBiTmV4dCA/Ci0gICAgICAgIGFpLkdldE5leHRBbm5vdChwU0RLQW5ub3QpIDoKLSAgICAgICAgYWkuR2V0UHJldkFubm90KHBTREtBbm5vdCk7Ci0gICAgICAgIHJldHVybiBwTmV4dDsKLSAgICB9Ci0gICAgLy8gZm9yIHhmYSBhbm5vdHMKLSAgICBJWEZBX1dpZGdldEl0ZXJhdG9yKiBwV2lkZ2V0SXRlcmF0b3IgPSBwUGFnZS0+R2V0WEZBUGFnZVZpZXcoKS0+Q3JlYXRlV2lkZ2V0SXRlcmF0b3IoWEZBX1RSQVZFUlNFV0FZX1RyYW52YWxzZSwgWEZBX1dJREdFVEZJTFRFUl9WaXNpYmxlIHwgWEZBX1dJREdFVEZJTFRFUl9WaWV3YWJsZSB8IFhGQV9XSURHRVRGSUxURVJfRmllbGQpOwotICAgIGlmIChwV2lkZ2V0SXRlcmF0b3IgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICBOVUxMOwotICAgIGlmIChwV2lkZ2V0SXRlcmF0b3ItPkdldEN1cnJlbnRXaWRnZXQoKSAhPSBwU0RLQW5ub3QtPkdldFhGQVdpZGdldCgpKQotICAgICAgICBwV2lkZ2V0SXRlcmF0b3ItPlNldEN1cnJlbnRXaWRnZXQocFNES0Fubm90LT5HZXRYRkFXaWRnZXQoKSk7Ci0gICAgSVhGQV9XaWRnZXQqIGhOZXh0Rm9jdXMgPSBOVUxMOwotICAgIGhOZXh0Rm9jdXMgPSBiTmV4dD9wV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb05leHQoKTpwV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb1ByZXZpb3VzKCk7Ci0gICAgaWYgKGhOZXh0Rm9jdXMgPT0gTlVMTCAmJiBwU0RLQW5ub3QgIT0gTlVMTCkKLSAgICAgICAgaE5leHRGb2N1cyA9IHBXaWRnZXRJdGVyYXRvci0+TW92ZVRvRmlyc3QoKTsKLQotICAgIHBXaWRnZXRJdGVyYXRvci0+UmVsZWFzZSgpOwotICAgIHJldHVybiBwUGFnZVZpZXctPkdldEFubm90QnlYRkFXaWRnZXQoaE5leHRGb2N1cyk7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6Q2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBBU1NFUlQocEFubm90LT5HZXRUeXBlKCkgPT0gIldpZGdldCIpOwotICAgIGlmIChwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSBCRkZUX1NJR05BVFVSRSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLSAgICBpZiAoIXBXaWRnZXQtPklzVmlzaWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaW50IG5GaWVsZEZsYWdzID0gcFdpZGdldC0+R2V0RmllbGRGbGFncygpOwotICAgIGlmICgobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQorICAgICAgaWYgKHBOZXh0ICYmIHBOZXh0ICE9IHBGb2N1c0Fubm90KSB7CisgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlLT5HZXRTREtEb2N1bWVudCgpOworICAgICAgICBwRG9jdW1lbnQtPlNldEZvY3VzQW5ub3QocE5leHQpOwogICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotICAgIENQREZfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7Ci0gICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OwotICAgIEZYX0RXT1JEIGR3UGVybWlzc2lvbnMgPSBwRG9jdW1lbnQtPkdldFVzZXJQZXJtaXNzaW9ucygpOwotICAgIHJldHVybiAoZHdQZXJtaXNzaW9ucyAmIEZQREZQRVJNX0ZJTExfRk9STSkgfHwKLSAgICAgICAgICAgIChkd1Blcm1pc3Npb25zICYgRlBERlBFUk1fQU5OT1RfRk9STSk7CisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKSB7CisgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uS2V5RG93bihwQW5ub3QsIG5LZXlDb2RlLCBuRmxhZyk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GbGFnKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotQ1BERlNES19Bbm5vdCogQ1BERlNES19CRkFubm90SGFuZGxlcjo6TmV3QW5ub3QoQ1BERl9Bbm5vdCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSkKLXsKLSAgICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gbV9wQXBwLT5HZXRTREtEb2N1bWVudCgpOwotICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwU0RLRG9jLT5HZXRJbnRlckZvcm0oKTsKLSAgICBDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IENQREZTREtfV2lkZ2V0OjpHZXRGb3JtQ29udHJvbChwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKSwgcEFubm90LT5HZXRBbm5vdERpY3QoKSk7Ci0gICAgaWYgKCFwQ3RybCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7CitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAotICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gbmV3IENQREZTREtfV2lkZ2V0KHBBbm5vdCwgcFBhZ2UsIHBJbnRlckZvcm0pOwotICAgIHBJbnRlckZvcm0tPkFkZE1hcChwQ3RybCwgcFdpZGdldCk7Ci0gICAgQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgICBpZiAocFBERkludGVyRm9ybSAmJiBwUERGSW50ZXJGb3JtLT5OZWVkQ29uc3RydWN0QVAoKSkKLSAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKG51bGxwdHIsIEZBTFNFKTsKLQotICAgIHJldHVybiBwV2lkZ2V0OworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIGlmIChwQW5ub3RIYW5kbGVyLT5PblNldEZvY3VzKHBBbm5vdCwgbkZsYWcpKSB7CisgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKKyAgICAgIHBQYWdlLT5HZXRTREtEb2N1bWVudCgpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotQ1BERlNES19Bbm5vdCogICAgICBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpOZXdBbm5vdChJWEZBX1dpZGdldCogaFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpCi17CitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBBU1NFUlQocEFubm90KTsKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCisgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uS2lsbEZvY3VzKHBBbm5vdCwgbkZsYWcpOworCisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25DaGFuZ2VGb2N1cygKKyAgICBDUERGU0RLX0Fubm90KiBwU2V0QW5ub3QsCisgICAgQ1BERlNES19Bbm5vdCogcEtpbGxBbm5vdCkgeworICBGWF9CT09MIGJYRkEgPSAocFNldEFubm90ICYmIHBTZXRBbm5vdC0+R2V0WEZBV2lkZ2V0KCkpIHx8CisgICAgICAgICAgICAgICAgIChwS2lsbEFubm90ICYmIHBLaWxsQW5ub3QtPkdldFhGQVdpZGdldCgpKTsKKworICBpZiAoYlhGQSkgeworICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcFhGQUFubm90SGFuZGxlciA9CisgICAgICAgICAgICBHZXRBbm5vdEhhbmRsZXIoRlNES19YRkFXSURHRVRfVFlQRU5BTUUpKQorICAgICAgcmV0dXJuIHBYRkFBbm5vdEhhbmRsZXItPk9uWEZBQ2hhbmdlZEZvY3VzKHBLaWxsQW5ub3QsIHBTZXRBbm5vdCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworQ1BERl9SZWN0IENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkdldFZpZXdCQm94KAorICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgQVNTRVJUKHBBbm5vdCk7CisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQorICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CisKKyAgcmV0dXJuIHBBbm5vdC0+R2V0UmVjdCgpOworfQorCitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90KTsKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpIHsKKyAgICBpZiAocEFubm90SGFuZGxlci0+Q2FuQW5zd2VyKHBBbm5vdCkpCisgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+SGl0VGVzdChwUGFnZVZpZXcsIHBBbm5vdCwgcG9pbnQpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworQ1BERlNES19Bbm5vdCogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5leHQpIHsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFNES0Fubm90LT5HZXRQYWdlVmlldygpOworICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gcFBhZ2VWaWV3LT5HZXRQREZYRkFQYWdlKCk7CisgIGlmIChwUGFnZSA9PSBOVUxMKQogICAgIHJldHVybiBOVUxMOworICBpZiAocFBhZ2UtPkdldFBERlBhZ2UoKSkgeyAgLy8gZm9yIHBkZiBhbm5vdHMuCisgICAgQ0JBX0Fubm90SXRlcmF0b3IgYWkocFNES0Fubm90LT5HZXRQYWdlVmlldygpLCBwU0RLQW5ub3QtPkdldFR5cGUoKSwgIiIpOworICAgIENQREZTREtfQW5ub3QqIHBOZXh0ID0KKyAgICAgICAgYk5leHQgPyBhaS5HZXROZXh0QW5ub3QocFNES0Fubm90KSA6IGFpLkdldFByZXZBbm5vdChwU0RLQW5ub3QpOworICAgIHJldHVybiBwTmV4dDsKKyAgfQorICAvLyBmb3IgeGZhIGFubm90cworICBJWEZBX1dpZGdldEl0ZXJhdG9yKiBwV2lkZ2V0SXRlcmF0b3IgPQorICAgICAgcFBhZ2UtPkdldFhGQVBhZ2VWaWV3KCktPkNyZWF0ZVdpZGdldEl0ZXJhdG9yKAorICAgICAgICAgIFhGQV9UUkFWRVJTRVdBWV9UcmFudmFsc2UsIFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9XSURHRVRGSUxURVJfVmlld2FibGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV0lER0VURklMVEVSX0ZpZWxkKTsKKyAgaWYgKHBXaWRnZXRJdGVyYXRvciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBpZiAocFdpZGdldEl0ZXJhdG9yLT5HZXRDdXJyZW50V2lkZ2V0KCkgIT0gcFNES0Fubm90LT5HZXRYRkFXaWRnZXQoKSkKKyAgICBwV2lkZ2V0SXRlcmF0b3ItPlNldEN1cnJlbnRXaWRnZXQocFNES0Fubm90LT5HZXRYRkFXaWRnZXQoKSk7CisgIElYRkFfV2lkZ2V0KiBoTmV4dEZvY3VzID0gTlVMTDsKKyAgaE5leHRGb2N1cyA9CisgICAgICBiTmV4dCA/IHBXaWRnZXRJdGVyYXRvci0+TW92ZVRvTmV4dCgpIDogcFdpZGdldEl0ZXJhdG9yLT5Nb3ZlVG9QcmV2aW91cygpOworICBpZiAoaE5leHRGb2N1cyA9PSBOVUxMICYmIHBTREtBbm5vdCAhPSBOVUxMKQorICAgIGhOZXh0Rm9jdXMgPSBwV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb0ZpcnN0KCk7CisKKyAgcFdpZGdldEl0ZXJhdG9yLT5SZWxlYXNlKCk7CisgIHJldHVybiBwUGFnZVZpZXctPkdldEFubm90QnlYRkFXaWRnZXQoaE5leHRGb2N1cyk7CiB9CiAKLXZvaWQgQ1BERlNES19CRkFubm90SGFuZGxlcjo6UmVsZWFzZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpDYW5BbnN3ZXIoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwQW5ub3QtPkdldFR5cGUoKSA9PSAiV2lkZ2V0Iik7CisgIGlmIChwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSBCRkZUX1NJR05BVFVSRSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKKyAgaWYgKCFwV2lkZ2V0LT5Jc1Zpc2libGUoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaW50IG5GaWVsZEZsYWdzID0gcFdpZGdldC0+R2V0RmllbGRGbGFncygpOworICBpZiAoKG5GaWVsZEZsYWdzICYgRklFTERGTEFHX1JFQURPTkxZKSA9PSBGSUVMREZMQUdfUkVBRE9OTFkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKKyAgICByZXR1cm4gVFJVRTsKKworICBDUERGX1BhZ2UqIHBQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOworICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CisgIEZYX0RXT1JEIGR3UGVybWlzc2lvbnMgPSBwRG9jdW1lbnQtPkdldFVzZXJQZXJtaXNzaW9ucygpOworICByZXR1cm4gKGR3UGVybWlzc2lvbnMgJiBGUERGUEVSTV9GSUxMX0ZPUk0pIHx8CisgICAgICAgICAoZHdQZXJtaXNzaW9ucyAmIEZQREZQRVJNX0FOTk9UX0ZPUk0pOworfQorCitDUERGU0RLX0Fubm90KiBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSkgeworICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gbV9wQXBwLT5HZXRTREtEb2N1bWVudCgpOworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcFNES0RvYy0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gQ1BERlNES19XaWRnZXQ6OkdldEZvcm1Db250cm9sKAorICAgICAgcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCksIHBBbm5vdC0+R2V0QW5ub3REaWN0KCkpOworICBpZiAoIXBDdHJsKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gbmV3IENQREZTREtfV2lkZ2V0KHBBbm5vdCwgcFBhZ2UsIHBJbnRlckZvcm0pOworICBwSW50ZXJGb3JtLT5BZGRNYXAocEN0cmwsIHBXaWRnZXQpOworICBDUERGX0ludGVyRm9ybSogcFBERkludGVyRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworICBpZiAocFBERkludGVyRm9ybSAmJiBwUERGSW50ZXJGb3JtLT5OZWVkQ29uc3RydWN0QVAoKSkKKyAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UobnVsbHB0ciwgRkFMU0UpOworCisgIHJldHVybiBwV2lkZ2V0OworfQorCitDUERGU0RLX0Fubm90KiBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpOZXdBbm5vdChJWEZBX1dpZGdldCogaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKSB7CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIENQREZTREtfQkZBbm5vdEhhbmRsZXI6OlJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKworICBpZiAobV9wRm9ybUZpbGxlcikKKyAgICBtX3BGb3JtRmlsbGVyLT5PbkRlbGV0ZShwQW5ub3QpOworCisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFdpZGdldC0+R2V0SW50ZXJGb3JtKCk7CisgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBDdHJvbCA9IHBXaWRnZXQtPkdldEZvcm1Db250cm9sKCk7CisgIHBJbnRlckZvcm0tPlJlbW92ZU1hcChwQ3Ryb2wpOworCisgIGRlbGV0ZSBwV2lkZ2V0OworfQorCit2b2lkIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKKworICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpIHsKKyAgICAoKENQREZTREtfQkFBbm5vdCopcEFubm90KQorICAgICAgICAtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wRm9ybUZpbGxlcikgeworICAgICAgbV9wRm9ybUZpbGxlci0+T25EcmF3KHBQYWdlVmlldywgcEFubm90LCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIGR3RmxhZ3MpOworICAgIH0KKyAgfQorfQorCit2b2lkIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworCisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgbV9wRm9ybUZpbGxlci0+T25Nb3VzZUVudGVyKHBQYWdlVmlldywgcEFubm90LCBuRmxhZyk7CisgIH0KK30KK3ZvaWQgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CisKKyAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKSB7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEZvcm1GaWxsZXIpCisgICAgICBtX3BGb3JtRmlsbGVyLT5Pbk1vdXNlRXhpdChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWcpOworICB9Cit9CitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKKworICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpIHsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wRm9ybUZpbGxlcikKKyAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkxCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworCisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTEJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKKworICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpIHsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wRm9ybUZpbGxlcikKKyAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkxCdXR0b25EYmxDbGsocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CisKKyAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKSB7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEZvcm1GaWxsZXIpCisgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25Nb3VzZU1vdmUocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworCisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTW91c2VXaGVlbChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50KTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CisKKyAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKSB7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEZvcm1GaWxsZXIpCisgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25SQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CisKKyAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKSB7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEZvcm1GaWxsZXIpCisgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25SQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncykgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworCisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKKworICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpIHsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wRm9ybUZpbGxlcikKKyAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWcpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcpIHsKKyAgcmV0dXJuIEZBTFNFOworfQordm9pZCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKKworICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpIHsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wRm9ybUZpbGxlcikKKyAgICAgIG1fcEZvcm1GaWxsZXItPk9uQ3JlYXRlKHBBbm5vdCk7CisgIH0KK30KKwordm9pZCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcEFubm90LT5HZXRQYWdlVmlldygpOworICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOworCisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisgIEFTU0VSVChwU0RLRG9jICE9IE5VTEwpOworCisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXREb2N1bWVudCgpOworICBBU1NFUlQocERvYyAhPSBOVUxMKTsKKworICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworCisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgICAgaWYgKCFwV2lkZ2V0LT5Jc0FwcGVhcmFuY2VWYWxpZCgpKQorICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKKworICAgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7CisgICAgaWYgKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCB8fCBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCkgeworICAgICAgRlhfQk9PTCBiRm9ybWF0ZWQgPSBGQUxTRTsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBXaWRnZXQtPk9uRm9ybWF0KGJGb3JtYXRlZCk7CisgICAgICBpZiAoYkZvcm1hdGVkICYmIG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YKSB7CisgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUuY19zdHIoKSwgRkFMU0UpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwRG9jLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9TVEFUSUNfWEZBKSB7CisgICAgICBpZiAoIXBXaWRnZXQtPklzQXBwZWFyYW5jZVZhbGlkKCkgJiYgIXBXaWRnZXQtPkdldFZhbHVlKCkuSXNFbXB0eSgpKQorICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoRkFMU0UpOworICAgIH0KIAogICAgIGlmIChtX3BGb3JtRmlsbGVyKQotICAgICAgICBtX3BGb3JtRmlsbGVyLT5PbkRlbGV0ZShwQW5ub3QpOwotCi0gICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLSAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBXaWRnZXQtPkdldEludGVyRm9ybSgpOwotICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgQ1BERl9Gb3JtQ29udHJvbCogcEN0cm9sID0gcFdpZGdldC0+R2V0Rm9ybUNvbnRyb2woKTsKLSAgICBwSW50ZXJGb3JtLT5SZW1vdmVNYXAocEN0cm9sKTsKLQotCi0gICAgZGVsZXRlIHBXaWRnZXQ7CisgICAgICBtX3BGb3JtRmlsbGVyLT5PbkxvYWQocEFubm90KTsKKyAgfQogfQogCitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CiAKLXZvaWQgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLCAgRlhfRFdPUkQgZHdGbGFncykKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uU2V0Rm9jdXMocEFubm90LCBuRmxhZyk7CisgIH0KIAotICAgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLSAgICB7Ci0gICAgICAgICgoQ1BERlNES19CQUFubm90KilwQW5ub3QpLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChtX3BGb3JtRmlsbGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3BGb3JtRmlsbGVyLT5PbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7Ci0gICAgICAgIH0KLSAgICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CisKKyAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKSB7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEZvcm1GaWxsZXIpCisgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25LaWxsRm9jdXMocEFubm90LCBuRmxhZyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKK0NQREZfUmVjdCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CiAKLSAgICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0gICAgewotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAobV9wRm9ybUZpbGxlcikKLSAgICAgICAgICAgICBtX3BGb3JtRmlsbGVyLT5Pbk1vdXNlRW50ZXIocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFnKTsKLSAgICB9CisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKKyAgfQogCi0KLX0KLXZvaWQgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQotICAgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLSAgICB7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChtX3BGb3JtRmlsbGVyKQotICAgICAgICAgICAgIG1fcEZvcm1GaWxsZXItPk9uTW91c2VFeGl0KHBQYWdlVmlldywgcEFubm90LCBuRmxhZyk7Ci0gICAgfQotCi19Ci1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCi0gICAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQotICAgIHsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKG1fcEZvcm1GaWxsZXIpCi0gICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25MQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gQ1BERl9SZWN0KDAsIDAsIDAsIDApOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6SGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwUGFnZVZpZXcpOworICBBU1NFUlQocEFubm90KTsKIAotICAgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLSAgICB7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChtX3BGb3JtRmlsbGVyKQotICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTEJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7CisgIENQREZfUmVjdCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOworICByZXR1cm4gcmVjdC5Db250YWlucyhwb2ludC54LCBwb2ludC55KTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworLy8gQ1BERlNES19YRkFBbm5vdEhhbmRsZXIKIAotICAgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLSAgICB7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChtX3BGb3JtRmlsbGVyKQotICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTEJ1dHRvbkRibENsayhwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0gICAgfQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9Vbmtub3duIDAKKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfQ2xpZW50IDEgIC8vIGFycm93CisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1RpdGxlYmFyIDExICAvLyBjYXB0aW9uCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0hTY3JvbGxCYXIgMTUKKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVlNjcm9sbEJhciAxNgorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9Cb3JkZXIgMTcKKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfRWRpdCAxOQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9IeXBlckxpbmsgMjAKIAotICAgIHJldHVybiBGQUxTRTsKK0NQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpDUERGU0RLX1hGQUFubm90SGFuZGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKQorICAgIDogbV9wQXBwKHBBcHApIHt9CisKK0NQREZTREtfQW5ub3QqIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpOZXdBbm5vdChJWEZBX1dpZGdldCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKSB7CisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BBcHAtPkdldFNES0RvY3VtZW50KCk7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwU0RLRG9jLT5HZXRJbnRlckZvcm0oKTsKKyAgQ1BERlNES19YRkFXaWRnZXQqIHBXaWRnZXQgPSBuZXcgQ1BERlNES19YRkFXaWRnZXQocEFubm90LCBwUGFnZSwgcEludGVyRm9ybSk7CisgIHBJbnRlckZvcm0tPkFkZFhGQU1hcChwQW5ub3QsIHBXaWRnZXQpOworICByZXR1cm4gcFdpZGdldDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpDYW5BbnN3ZXIoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIHJldHVybiBwQW5ub3QtPkdldFhGQVdpZGdldCgpICE9IE5VTEw7Cit9CiAKLSAgICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0gICAgewotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAobV9wRm9ybUZpbGxlcikKLSAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5Pbk1vdXNlTW92ZShwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0gICAgfQordm9pZCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHsKKyAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAorICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworICBBU1NFUlQocFNES0RvYyAhPSBOVUxMKTsKKworICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgQ0ZYX0dyYXBoaWNzIGdzOworICBncy5DcmVhdGUocERldmljZSk7CisKKyAgQ0ZYX01hdHJpeCBtdDsKKyAgbXQgPSAqKENGWF9NYXRyaXgqKXBVc2VyMkRldmljZTsKKworICBJWEZBX1dpZGdldCogaFdpZGdldCA9IHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCk7CisgIEFTU0VSVChoV2lkZ2V0ICE9IE5VTEwpOworCisgIEZYX0JPT0wgYklzSGlnaGxpZ2h0ID0gRkFMU0U7CisgIGlmIChwU0RLRG9jLT5HZXRGb2N1c0Fubm90KCkgIT0gcEFubm90KQorICAgIGJJc0hpZ2hsaWdodCA9IFRSVUU7CisKKyAgcFdpZGdldEhhbmRsZXItPlJlbmRlcldpZGdldChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCAmZ3MsICZtdCwgYklzSGlnaGxpZ2h0KTsKKworICAvLyB0byBkbyBoaWdobGlnaHQgYW5kIHNoYWRvdworfQorCit2b2lkIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisKKyAgQ1BERlNES19YRkFXaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19YRkFXaWRnZXQqKXBBbm5vdDsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwV2lkZ2V0LT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgcEludGVyRm9ybS0+UmVtb3ZlWEZBTWFwKHBXaWRnZXQtPkdldFhGQVdpZGdldCgpKTsKKworICBkZWxldGUgcFdpZGdldDsKK30KKworQ1BERl9SZWN0IENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworICBYRkFfRUxFTUVOVCBlVHlwZSA9CisgICAgICBwV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhwQW5ub3QtPkdldFhGQVdpZGdldCgpKS0+R2V0VUlUeXBlKCk7CisgIENGWF9SZWN0RiByY0JCb3g7CisgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9TaWduYXR1cmUpCisgICAgcFdpZGdldEhhbmRsZXItPkdldEJCb3gocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSwgVFJVRSk7CisgIGVsc2UKKyAgICBwV2lkZ2V0SGFuZGxlci0+R2V0QkJveChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCByY0JCb3gsIDApOworCisgIENGWF9GbG9hdFJlY3QgcmNXaWRnZXQocmNCQm94LmxlZnQsIHJjQkJveC50b3AsIHJjQkJveC5sZWZ0ICsgcmNCQm94LndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3AgKyByY0JCb3guaGVpZ2h0KTsKKyAgcmNXaWRnZXQubGVmdCAtPSAxLjBmOworICByY1dpZGdldC5yaWdodCArPSAxLjBmOworICByY1dpZGdldC5ib3R0b20gLT0gMS4wZjsKKyAgcmNXaWRnZXQudG9wICs9IDEuMGY7CisKKyAgcmV0dXJuIHJjV2lkZ2V0OworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpIaXRUZXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQogICAgIHJldHVybiBGQUxTRTsKIAotfQotCi0KLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCi0gICAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQotICAgIHsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKG1fcEZvcm1GaWxsZXIpCi0gICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25Nb3VzZVdoZWVsKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHpEZWx0YSxwb2ludCk7Ci0gICAgfQotCisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisgIGlmICghcFNES0RvYykKICAgICByZXR1cm4gRkFMU0U7Ci19CiAKLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0KLSAgICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0gICAgewotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAobV9wRm9ybUZpbGxlcikKLSAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PblJCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLSAgICB9Ci0KKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7CisgIGlmICghcERvYykKICAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKIAotICAgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLSAgICB7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChtX3BGb3JtRmlsbGVyKQotICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uUkJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLSAgICB9Ci0KKyAgSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKTsKKyAgaWYgKCFwRG9jVmlldykKICAgICByZXR1cm4gRkFMU0U7Ci19CiAKLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncykKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0KLSAgICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0gICAgewotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAobV9wRm9ybUZpbGxlcikKLSAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkNoYXIocEFubm90LG5DaGFyLCBuRmxhZ3MpOwotICAgIH0KLQorICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gcERvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKKyAgaWYgKCFwV2lkZ2V0SGFuZGxlcikKICAgICByZXR1cm4gRkFMU0U7CisKKyAgRlhfRFdPUkQgZHdIaXRUZXN0ID0KKyAgICAgIHBXaWRnZXRIYW5kbGVyLT5PbkhpdFRlc3QocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgcG9pbnQueCwgcG9pbnQueSk7CisgIHJldHVybiAoZHdIaXRUZXN0ICE9IEZXTF9XR1RISVRURVNUX1Vua25vd24pOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKK3ZvaWQgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCisgICAgcmV0dXJuOworICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CiAKLSAgICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0gICAgewotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAobV9wRm9ybUZpbGxlcikKLSAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbktleURvd24ocEFubm90LG5LZXlDb2RlLCBuRmxhZyk7Ci0gICAgfQorICBwV2lkZ2V0SGFuZGxlci0+T25Nb3VzZUVudGVyKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCkpOworfQogCit2b2lkIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQorICAgIHJldHVybjsKKworICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgcFdpZGdldEhhbmRsZXItPk9uTW91c2VFeGl0KHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCkpOworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCiAgICAgcmV0dXJuIEZBTFNFOworCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PbkxCdXR0b25Eb3duKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGV0xGbGFncyhuRmxhZ3MpLCBwb2ludC54LCBwb2ludC55KTsKKworICByZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCi17Ci0KK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCiAgICAgcmV0dXJuIEZBTFNFOwotfQotdm9pZCAgICBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwogCi0gICAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQotICAgIHsKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKyAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBiUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uTEJ1dHRvblVwKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RldMRmxhZ3MobkZsYWdzKSwgcG9pbnQueCwgcG9pbnQueSk7CisKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQorICAgIHJldHVybiBGQUxTRTsKKworICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgIGJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25MQnV0dG9uRGJsQ2xrKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEZXTEZsYWdzKG5GbGFncyksIHBvaW50LngsIHBvaW50LnkpOworCisgIHJldHVybiBiUmV0OworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQorICAgIHJldHVybiBGQUxTRTsKKworICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgIGJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25Nb3VzZU1vdmUocEFubm90LT5HZXRYRkFXaWRnZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGV0xGbGFncyhuRmxhZ3MpLCBwb2ludC54LCBwb2ludC55KTsKKworICByZXR1cm4gYlJldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQorICAgIHJldHVybiBGQUxTRTsKKworICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgIGJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25Nb3VzZVdoZWVsKAorICAgICAgcEFubm90LT5HZXRYRkFXaWRnZXQoKSwgR2V0RldMRmxhZ3MobkZsYWdzKSwgekRlbHRhLCBwb2ludC54LCBwb2ludC55KTsKKworICByZXR1cm4gYlJldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQorICAgIHJldHVybiBGQUxTRTsKKworICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgIGJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25SQnV0dG9uRG93bihwQW5ub3QtPkdldFhGQVdpZGdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RldMRmxhZ3MobkZsYWdzKSwgcG9pbnQueCwgcG9pbnQueSk7CisKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PblJCdXR0b25VcChwQW5ub3QtPkdldFhGQVdpZGdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEZXTEZsYWdzKG5GbGFncyksIHBvaW50LngsIHBvaW50LnkpOworCisgIHJldHVybiBiUmV0OworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPblJCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKyAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBiUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uUkJ1dHRvbkRibENsayhwQW5ub3QtPkdldFhGQVdpZGdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGV0xGbGFncyhuRmxhZ3MpLCBwb2ludC54LCBwb2ludC55KTsKKworICByZXR1cm4gYlJldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MpIHsKKyAgaWYgKCFwQW5ub3QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PbkNoYXIocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEZXTEZsYWdzKG5GbGFncykpOworCisgIHJldHVybiBiUmV0OworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcpIHsKKyAgaWYgKCFwQW5ub3QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PbktleURvd24ocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEZXTEZsYWdzKG5GbGFnKSk7CisKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRmxhZykgeworICBpZiAoIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKyAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBiUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uS2V5VXAocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGV0xGbGFncyhuRmxhZykpOworCisgIHJldHVybiBiUmV0OworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPblhGQUNoYW5nZWRGb2N1cyhDUERGU0RLX0Fubm90KiBwT2xkQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwTmV3QW5ub3QpIHsKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IE5VTEw7CisKKyAgaWYgKHBPbGRBbm5vdCkKKyAgICBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocE9sZEFubm90KTsKKyAgZWxzZSBpZiAocE5ld0Fubm90KQorICAgIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwTmV3QW5ub3QpOworCisgIGlmIChwV2lkZ2V0SGFuZGxlcikgeworICAgIEZYX0JPT0wgYlJldCA9IFRSVUU7CisgICAgSVhGQV9XaWRnZXQqIGhXaWRnZXQgPSBwTmV3QW5ub3QgPyBwTmV3QW5ub3QtPkdldFhGQVdpZGdldCgpIDogTlVMTDsKKyAgICBpZiAoaFdpZGdldCkgeworICAgICAgSVhGQV9QYWdlVmlldyogcFhGQVBhZ2VWaWV3ID0gcFdpZGdldEhhbmRsZXItPkdldFBhZ2VWaWV3KGhXaWRnZXQpOworICAgICAgaWYgKHBYRkFQYWdlVmlldykgeworICAgICAgICBiUmV0ID0gcFhGQVBhZ2VWaWV3LT5HZXREb2NWaWV3KCktPlNldEZvY3VzKGhXaWRnZXQpOworICAgICAgICBpZiAocFhGQVBhZ2VWaWV3LT5HZXREb2NWaWV3KCktPkdldEZvY3VzV2lkZ2V0KCkgPT0gaFdpZGdldCkKKyAgICAgICAgICBiUmV0ID0gVFJVRTsKKyAgICAgIH0KICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKG1fcEZvcm1GaWxsZXIpCi0gICAgICAgICAgICBtX3BGb3JtRmlsbGVyLT5PbkNyZWF0ZShwQW5ub3QpOwotICAgIH0KLX0KLQotdm9pZCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0KLSAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7Ci0gICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLQotICAgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7Ci0gICAgQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7Ci0KLSAgICBDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0RG9jdW1lbnQoKTsKLSAgICBBU1NFUlQocERvYyAhPSBOVUxMKTsKLQotICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0KLSAgICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0gICAgewotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotICAgICAgICBpZiAoIXBXaWRnZXQtPklzQXBwZWFyYW5jZVZhbGlkKCkpCi0gICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgRkFMU0UpOwotCi0gICAgICAgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7Ci0gICAgICAgIGlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQgfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwV2lkZ2V0LT5PbkZvcm1hdChiRm9ybWF0ZWQpOwotICAgICAgICAgICAgaWYgKGJGb3JtYXRlZCAmJiBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2Uoc1ZhbHVlLmNfc3RyKCksIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwRG9jLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9TVEFUSUNfWEZBKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXBXaWRnZXQtPklzQXBwZWFyYW5jZVZhbGlkKCkgJiYgIXBXaWRnZXQtPkdldFZhbHVlKCkuSXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShGQUxTRSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmIChtX3BGb3JtRmlsbGVyKQotICAgICAgICAgICAgbV9wRm9ybUZpbGxlci0+T25Mb2FkKHBBbm5vdCk7Ci0gICAgfQotfQotCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotICAgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0KLSAgICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0gICAgewotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAobV9wRm9ybUZpbGxlcikKLSAgICAgICAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PblNldEZvY3VzKHBBbm5vdCxuRmxhZyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCi0gICAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQotICAgIHsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKG1fcEZvcm1GaWxsZXIpCi0gICAgICAgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25LaWxsRm9jdXMocEFubm90LG5GbGFnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotQ1BERl9SZWN0IENQREZTREtfQkZBbm5vdEhhbmRsZXI6OkdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQotICAgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLSAgICB7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChtX3BGb3JtRmlsbGVyKQotICAgICAgICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKLQotICAgIH0KLQotICAgIHJldHVybiBDUERGX1JlY3QoMCwwLDAsMCk7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6SGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgQVNTRVJUKHBQYWdlVmlldyk7Ci0gICAgQVNTRVJUKHBBbm5vdCk7Ci0KLSAgICBDUERGX1JlY3QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKLSAgICByZXR1cm4gcmVjdC5Db250YWlucyhwb2ludC54LCBwb2ludC55KTsKLX0KLQotLy9DUERGU0RLX1hGQUFubm90SGFuZGxlcgotCi0jZGVmaW5lIEZXTF9XR1RISVRURVNUX1Vua25vd24gICAgICAgICAgMAotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9DbGllbnQgICAgICAgICAgIDEgLy9hcnJvdwotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9UaXRsZWJhciAgICAgICAgIDExIC8vY2FwdGlvbgotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9IU2Nyb2xsQmFyICAgICAgIDE1Ci0jZGVmaW5lIEZXTF9XR1RISVRURVNUX1ZTY3JvbGxCYXIgICAgICAgMTYKLSNkZWZpbmUgRldMX1dHVEhJVFRFU1RfQm9yZGVyICAgICAgICAgICAxNwotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9FZGl0ICAgICAgICAgICAgIDE5Ci0jZGVmaW5lIEZXTF9XR1RISVRURVNUX0h5cGVyTGluayAgICAgICAgMjAKLQotQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkNQREZTREtfWEZBQW5ub3RIYW5kbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApIDoKLSAgICBtX3BBcHAocEFwcCkKLXsKLQotfQotCi1DUERGU0RLX0Fubm90KiBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6TmV3QW5ub3QoSVhGQV9XaWRnZXQqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpCi17Ci0gICAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcEFwcC0+R2V0U0RLRG9jdW1lbnQoKTsKLSAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcFNES0RvYy0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgQ1BERlNES19YRkFXaWRnZXQqIHBXaWRnZXQgPSBuZXcgQ1BERlNES19YRkFXaWRnZXQocEFubm90LCBwUGFnZSwgcEludGVyRm9ybSk7Ci0gICAgcEludGVyRm9ybS0+QWRkWEZBTWFwKHBBbm5vdCwgcFdpZGdldCk7Ci0gICAgcmV0dXJuIHBXaWRnZXQ7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgcmV0dXJuIHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCkgIT0gTlVMTDsKLX0KLQotdm9pZCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLCBGWF9EV09SRCBkd0ZsYWdzKQotewotICAgIEFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQotICAgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7Ci0gICAgQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7Ci0KLSAgICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOwotICAgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKLQotICAgIENGWF9HcmFwaGljcyBnczsKLSAgICBncy5DcmVhdGUocERldmljZSk7Ci0KLSAgICBDRlhfTWF0cml4IG10OwotICAgIG10ID0gKihDRlhfTWF0cml4KilwVXNlcjJEZXZpY2U7Ci0KLSAgICBJWEZBX1dpZGdldCogaFdpZGdldCA9IHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCk7Ci0gICAgQVNTRVJUKGhXaWRnZXQgIT0gTlVMTCk7Ci0KLSAgICBGWF9CT09MIGJJc0hpZ2hsaWdodCA9IEZBTFNFOwotICAgIGlmIChwU0RLRG9jLT5HZXRGb2N1c0Fubm90KCkgIT0gcEFubm90KQotICAgICAgICBiSXNIaWdobGlnaHQgPSBUUlVFOwotCi0gICAgcFdpZGdldEhhbmRsZXItPlJlbmRlcldpZGdldChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCAmZ3MsICZtdCwgYklzSGlnaGxpZ2h0KTsKLQotICAgIC8vIHRvIGRvIGhpZ2hsaWdodCBhbmQgc2hhZG93Ci0KLX0KLQotdm9pZCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6UmVsZWFzZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0gICAgQ1BERlNES19YRkFXaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19YRkFXaWRnZXQqKXBBbm5vdDsKLSAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBXaWRnZXQtPkdldEludGVyRm9ybSgpOwotICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgcEludGVyRm9ybS0+UmVtb3ZlWEZBTWFwKHBXaWRnZXQtPkdldFhGQVdpZGdldCgpKTsKLQotICAgIGRlbGV0ZSBwV2lkZ2V0OwotfQotCi1DUERGX1JlY3QgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQotewotICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0KLSAgICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOwotICAgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKLQotICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcFdpZGdldEhhbmRsZXItPkdldERhdGFBY2MocEFubm90LT5HZXRYRkFXaWRnZXQoKSktPkdldFVJVHlwZSgpOwotICAgIENGWF9SZWN0RiByY0JCb3g7Ci0gICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1NpZ25hdHVyZSkKLSAgICAgICAgcFdpZGdldEhhbmRsZXItPkdldEJCb3ggKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIHJjQkJveCwgWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlLCBUUlVFKTsKLSAgICBlbHNlCi0gICAgICAgIHBXaWRnZXRIYW5kbGVyLT5HZXRCQm94IChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCByY0JCb3gsIDApOwotCi0gICAgQ0ZYX0Zsb2F0UmVjdCByY1dpZGdldChyY0JCb3gubGVmdCwgcmNCQm94LnRvcCwgcmNCQm94LmxlZnQgKyByY0JCb3gud2lkdGgsIHJjQkJveC50b3ArcmNCQm94LmhlaWdodCk7Ci0gICAgcmNXaWRnZXQubGVmdCAtPSAxLjBmOwotICAgIHJjV2lkZ2V0LnJpZ2h0ICs9IDEuMGY7Ci0gICAgcmNXaWRnZXQuYm90dG9tIC09IDEuMGY7Ci0gICAgcmNXaWRnZXQudG9wICs9IDEuMGY7Ci0KLSAgICByZXR1cm4gcmNXaWRnZXQ7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIGlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7Ci0gICAgaWYgKCFwU0RLRG9jKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoIXBEb2MpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIElYRkFfRG9jVmlldyogcERvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCk7Ci0gICAgaWYgKCFwRG9jVmlldykKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IHBEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7Ci0gICAgaWYgKCFwV2lkZ2V0SGFuZGxlcikKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgRlhfRFdPUkQgZHdIaXRUZXN0ID0gcFdpZGdldEhhbmRsZXItPk9uSGl0VGVzdChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCBwb2ludC54LCBwb2ludC55KTsKLSAgICByZXR1cm4gKGR3SGl0VGVzdCAhPSBGV0xfV0dUSElUVEVTVF9Vbmtub3duKTsKLX0KLQotdm9pZCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKLXsKLSAgICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQotICAgICAgICByZXR1cm47Ci0gICAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKLSAgICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7Ci0KLSAgICBwV2lkZ2V0SGFuZGxlci0+T25Nb3VzZUVudGVyKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCkpOwotfQotCi12b2lkIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKLSAgICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7Ci0KLSAgICBwV2lkZ2V0SGFuZGxlci0+T25Nb3VzZUV4aXQocEFubm90LT5HZXRYRkFXaWRnZXQoKSk7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKLSAgICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7Ci0KLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKLSAgICBiUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uTEJ1dHRvbkRvd24ocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgR2V0RldMRmxhZ3MobkZsYWdzKSwgcG9pbnQueCwgcG9pbnQueSk7Ci0KICAgICByZXR1cm4gYlJldDsKKyAgfQorCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQotICAgICAgICByZXR1cm4gRkFMU0U7CitJWEZBX1dpZGdldEhhbmRsZXIqIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpHZXRYRkFXaWRnZXRIYW5kbGVyKAorICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBpZiAoIXBBbm5vdCkKKyAgICByZXR1cm4gTlVMTDsKIAotICAgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7Ci0gICAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7CisgIGlmICghcFBhZ2VWaWV3KQorICAgIHJldHVybiBOVUxMOwogCi0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ci0gICAgYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PbkxCdXR0b25VcChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCBHZXRGV0xGbGFncyhuRmxhZ3MpLCBwb2ludC54LCBwb2ludC55KTsKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IHBQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgaWYgKCFwU0RLRG9jKQorICAgIHJldHVybiBOVUxMOwogCi0gICAgcmV0dXJuIGJSZXQ7CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXREb2N1bWVudCgpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKTsKKyAgaWYgKCFwRG9jVmlldykKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gcERvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIGlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyNkZWZpbmUgRldMX0tFWUZMQUdfQ3RybCAoMSA8PCAwKQorI2RlZmluZSBGV0xfS0VZRkxBR19BbHQgKDEgPDwgMSkKKyNkZWZpbmUgRldMX0tFWUZMQUdfU2hpZnQgKDEgPDwgMikKKyNkZWZpbmUgRldMX0tFWUZMQUdfTEJ1dHRvbiAoMSA8PCAzKQorI2RlZmluZSBGV0xfS0VZRkxBR19SQnV0dG9uICgxIDw8IDQpCisjZGVmaW5lIEZXTF9LRVlGTEFHX01CdXR0b24gKDEgPDwgNSkKIAotICAgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7Ci0gICAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworRlhfRFdPUkQgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkdldEZXTEZsYWdzKEZYX0RXT1JEIGR3RmxhZykgeworICBGWF9EV09SRCBkd0ZXTEZsYWcgPSAwOwogCi0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ci0gICAgYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PbkxCdXR0b25EYmxDbGsocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgR2V0RldMRmxhZ3MobkZsYWdzKSwgcG9pbnQueCwgcG9pbnQueSk7CisgIGlmIChkd0ZsYWcgJiBGV0xfRVZFTlRGTEFHX0NvbnRyb2xLZXkpCisgICAgZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX0N0cmw7CisgIGlmIChkd0ZsYWcgJiBGV0xfRVZFTlRGTEFHX0xlZnRCdXR0b25Eb3duKQorICAgIGR3RldMRmxhZyB8PSBGV0xfS0VZRkxBR19MQnV0dG9uOworICBpZiAoZHdGbGFnICYgRldMX0VWRU5URkxBR19NaWRkbGVCdXR0b25Eb3duKQorICAgIGR3RldMRmxhZyB8PSBGV0xfS0VZRkxBR19NQnV0dG9uOworICBpZiAoZHdGbGFnICYgRldMX0VWRU5URkxBR19SaWdodEJ1dHRvbkRvd24pCisgICAgZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX1JCdXR0b247CisgIGlmIChkd0ZsYWcgJiBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5KQorICAgIGR3RldMRmxhZyB8PSBGV0xfS0VZRkxBR19TaGlmdDsKKyAgaWYgKGR3RmxhZyAmIEZXTF9FVkVOVEZMQUdfQWx0S2V5KQorICAgIGR3RldMRmxhZyB8PSBGV0xfS0VZRkxBR19BbHQ7CiAKLSAgICByZXR1cm4gYlJldDsKKyAgcmV0dXJuIGR3RldMRmxhZzsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworLy8gQ1JlYWRlcl9Bbm5vdEl0ZXJhdG9yRXgKIAotICAgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7Ci0gICAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOwotCi0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ci0gICAgYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5Pbk1vdXNlTW92ZShwQW5ub3QtPkdldFhGQVdpZGdldCgpLCBHZXRGV0xGbGFncyhuRmxhZ3MpLCBwb2ludC54LCBwb2ludC55KTsKLQotICAgIHJldHVybiBiUmV0OworQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpDUERGU0RLX0Fubm90SXRlcmF0b3IoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmV2ZXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklnbm9yZVRvcG1vc3QgLyo9RkFMU0UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNpcmNsZSAvKj1GQUxTRSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBwTGlzdCAvKj1OVUxMKi8pIHsKKyAgQVNTRVJUKHBQYWdlVmlldyk7CisgIG1fYlJldmVyc2UgPSBiUmV2ZXJzZTsKKyAgbV9iSWdub3JlVG9wbW9zdCA9IGJJZ25vcmVUb3Btb3N0OworICBtX2JDaXJjbGUgPSBiQ2lyY2xlOworICBtX3BJdGVyYXRvckFubm90TGlzdC5SZW1vdmVBbGwoKTsKKyAgSW5pdEl0ZXJhdG9yQW5ub3RMaXN0KHBQYWdlVmlldywgcExpc3QpOwogfQogCi1GWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOwotICAgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKLQotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOwotICAgIGJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25Nb3VzZVdoZWVsKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIEdldEZXTEZsYWdzKG5GbGFncyksIHpEZWx0YSwgcG9pbnQueCwgcG9pbnQueSk7Ci0KLSAgICByZXR1cm4gYlJldDsKLX0KLQotRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOwotICAgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKLQotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOwotICAgIGJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25SQnV0dG9uRG93bihwQW5ub3QtPkdldFhGQVdpZGdldCgpLCBHZXRGV0xGbGFncyhuRmxhZ3MpLCBwb2ludC54LCBwb2ludC55KTsKLQotICAgIHJldHVybiBiUmV0OwotfQotCi1GWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLSAgICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOwotICAgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKLQotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOwotICAgIGJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25SQnV0dG9uVXAocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgR2V0RldMRmxhZ3MobkZsYWdzKSwgcG9pbnQueCwgcG9pbnQueSk7Ci0KLSAgICByZXR1cm4gYlJldDsKLX0KLQotRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIGlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7Ci0gICAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOwotCi0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ci0gICAgYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PblJCdXR0b25EYmxDbGsocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgR2V0RldMRmxhZ3MobkZsYWdzKSwgcG9pbnQueCwgcG9pbnQueSk7Ci0KLSAgICByZXR1cm4gYlJldDsKLX0KLQotRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncykKLXsKLSAgICBpZiAoIXBBbm5vdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKLSAgICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7Ci0KLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKLSAgICBiUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uQ2hhcihwQW5ub3QtPkdldFhGQVdpZGdldCgpLCBuQ2hhciwgR2V0RldMRmxhZ3MobkZsYWdzKSk7Ci0KLSAgICByZXR1cm4gYlJldDsKLX0KLQotRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCi17Ci0gICAgaWYgKCFwQW5ub3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7Ci0gICAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOwotCi0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ci0gICAgYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PbktleURvd24ocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgbktleUNvZGUsIEdldEZXTEZsYWdzKG5GbGFnKSk7Ci0KLSAgICByZXR1cm4gYlJldDsKLX0KLQotRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQotewotICAgIGlmICghcEFubm90KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOwotICAgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKLQotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOwotICAgIGJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25LZXlVcChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCBuS2V5Q29kZSwgR2V0RldMRmxhZ3MobkZsYWcpKTsKLQotICAgIHJldHVybiBiUmV0OwotfQotCi1GWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uWEZBQ2hhbmdlZEZvY3VzKENQREZTREtfQW5ub3QqIHBPbGRBbm5vdCwgQ1BERlNES19Bbm5vdCogcE5ld0Fubm90KQotewotICAgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBOVUxMOwotCi0gICAgaWYgKHBPbGRBbm5vdCkKLSAgICAgICAgcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBPbGRBbm5vdCk7Ci0gICAgZWxzZSBpZiAocE5ld0Fubm90KQotICAgICAgICBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocE5ld0Fubm90KTsKLQotICAgIGlmIChwV2lkZ2V0SGFuZGxlcikKLSAgICB7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IFRSVUU7Ci0gICAgICAgIElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gcE5ld0Fubm90ID8gcE5ld0Fubm90LT5HZXRYRkFXaWRnZXQoKSA6IE5VTEw7Ci0gICAgICAgIGlmIChoV2lkZ2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBJWEZBX1BhZ2VWaWV3KiBwWEZBUGFnZVZpZXcgPSBwV2lkZ2V0SGFuZGxlci0+R2V0UGFnZVZpZXcoaFdpZGdldCk7Ci0gICAgICAgICAgICBpZiAocFhGQVBhZ2VWaWV3KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJSZXQgPSBwWEZBUGFnZVZpZXctPkdldERvY1ZpZXcoKS0+U2V0Rm9jdXMoaFdpZGdldCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBYRkFQYWdlVmlldy0+R2V0RG9jVmlldygpLT5HZXRGb2N1c1dpZGdldCgpID09IGhXaWRnZXQpCi0gICAgICAgICAgICAgICAgICAgIGJSZXQgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiUmV0OworQ1BERlNES19Bbm5vdCogQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpOZXh0QW5ub3QoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpIHsKKyAgaW50IGluZGV4ID0gLTE7CisgIGludCBuQ291bnQgPSBtX3BJdGVyYXRvckFubm90TGlzdC5HZXRTaXplKCk7CisgIGlmIChwQ3VycmVudCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICAgIENQREZTREtfQW5ub3QqIHBSZWFkZXJBbm5vdCA9CisgICAgICAgICAgKENQREZTREtfQW5ub3QqKW1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldEF0KGkpOworICAgICAgaWYgKHBSZWFkZXJBbm5vdCA9PSBwQ3VycmVudCkgeworICAgICAgICBpbmRleCA9IGk7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLQotICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBOZXh0QW5ub3QoaW5kZXgpOwogfQotCi1JWEZBX1dpZGdldEhhbmRsZXIqIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpHZXRYRkFXaWRnZXRIYW5kbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBpZiAoIXBBbm5vdCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7Ci0gICAgaWYgKCFwUGFnZVZpZXcpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IHBQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKLSAgICBpZiAoIXBTREtEb2MpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7Ci0gICAgaWYgKCFwRG9jKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIElYRkFfRG9jVmlldyogcERvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCk7Ci0gICAgaWYgKCFwRG9jVmlldykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICByZXR1cm4gcERvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKLX0KLQotI2RlZmluZSBGV0xfS0VZRkxBR19DdHJsICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQotI2RlZmluZSBGV0xfS0VZRkxBR19BbHQgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxKQotI2RlZmluZSBGV0xfS0VZRkxBR19TaGlmdCAgICAgICAgICAgICAgICAgICAoMSA8PCAyKQotI2RlZmluZSBGV0xfS0VZRkxBR19MQnV0dG9uICAgICAgICAgICAgICAgICAoMSA8PCAzKQotI2RlZmluZSBGV0xfS0VZRkxBR19SQnV0dG9uICAgICAgICAgICAgICAgICAoMSA8PCA0KQotI2RlZmluZSBGV0xfS0VZRkxBR19NQnV0dG9uICAgICAgICAgICAgICAgICAoMSA8PCA1KQotCi1GWF9EV09SRCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6R2V0RldMRmxhZ3MoRlhfRFdPUkQgZHdGbGFnKQotewotICAgIEZYX0RXT1JEIGR3RldMRmxhZyA9IDA7Ci0KLSAgICBpZiAoZHdGbGFnICYgRldMX0VWRU5URkxBR19Db250cm9sS2V5KQotICAgICAgICBkd0ZXTEZsYWcgfD0gRldMX0tFWUZMQUdfQ3RybDsKLSAgICBpZiAoZHdGbGFnICYgRldMX0VWRU5URkxBR19MZWZ0QnV0dG9uRG93bikKLSAgICAgICAgZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX0xCdXR0b247Ci0gICAgaWYgKGR3RmxhZyAmIEZXTF9FVkVOVEZMQUdfTWlkZGxlQnV0dG9uRG93bikKLSAgICAgICAgZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX01CdXR0b247Ci0gICAgaWYgKGR3RmxhZyAmIEZXTF9FVkVOVEZMQUdfUmlnaHRCdXR0b25Eb3duKQotICAgICAgICBkd0ZXTEZsYWcgfD0gRldMX0tFWUZMQUdfUkJ1dHRvbjsKLSAgICBpZiAoZHdGbGFnICYgRldMX0VWRU5URkxBR19TaGlmdEtleSkKLSAgICAgICAgZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX1NoaWZ0OwotICAgIGlmIChkd0ZsYWcgJiBGV0xfRVZFTlRGTEFHX0FsdEtleSkKLSAgICAgICAgZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX0FsdDsKLQotICAgIHJldHVybiBkd0ZXTEZsYWc7Ci19Ci0KLS8vQ1JlYWRlcl9Bbm5vdEl0ZXJhdG9yRXgKLQotQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpDUERGU0RLX0Fubm90SXRlcmF0b3IoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldyxGWF9CT09MIGJSZXZlcnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklnbm9yZVRvcG1vc3QvKj1GQUxTRSovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNpcmNsZS8qPUZBTFNFKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5ICpwTGlzdC8qPU5VTEwqLykKLXsKLSAgICBBU1NFUlQocFBhZ2VWaWV3KTsKLSAgICBtX2JSZXZlcnNlPWJSZXZlcnNlOwotICAgIG1fYklnbm9yZVRvcG1vc3Q9IGJJZ25vcmVUb3Btb3N0OwotICAgIG1fYkNpcmNsZT1iQ2lyY2xlOwotICAgIG1fcEl0ZXJhdG9yQW5ub3RMaXN0LlJlbW92ZUFsbCgpOwotICAgIEluaXRJdGVyYXRvckFubm90TGlzdChwUGFnZVZpZXcscExpc3QpOwotfQotCi1DUERGU0RLX0Fubm90KiAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpOZXh0QW5ub3QgKGNvbnN0IENQREZTREtfQW5ub3QqIHBDdXJyZW50KQotewotCi0gICAgaW50IGluZGV4ID0gLTE7Ci0gICAgaW50IG5Db3VudCA9IG1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldFNpemUoKTsKLSAgICBpZiAocEN1cnJlbnQpIHsKLSAgICAgICAgZm9yKGludCBpPTA7aTxuQ291bnQ7aSsrKXsKLSAgICAgICAgICAgIENQREZTREtfQW5ub3QgKiBwUmVhZGVyQW5ub3Q9IChDUERGU0RLX0Fubm90ICopbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0QXQoaSk7Ci0gICAgICAgICAgICBpZihwUmVhZGVyQW5ub3QgPT1wQ3VycmVudCl7Ci0gICAgICAgICAgICAgICAgaW5kZXg9aTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorQ1BERlNES19Bbm5vdCogQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpQcmV2QW5ub3QoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpIHsKKyAgaW50IGluZGV4ID0gLTE7CisgIGludCBuQ291bnQgPSBtX3BJdGVyYXRvckFubm90TGlzdC5HZXRTaXplKCk7CisgIGlmIChwQ3VycmVudCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICAgIENQREZTREtfQW5ub3QqIHBSZWFkZXJBbm5vdCA9CisgICAgICAgICAgKENQREZTREtfQW5ub3QqKW1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldEF0KGkpOworICAgICAgaWYgKHBSZWFkZXJBbm5vdCA9PSBwQ3VycmVudCkgeworICAgICAgICBpbmRleCA9IGk7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gTmV4dEFubm90KGluZGV4KTsKKyAgfQorICByZXR1cm4gUHJldkFubm90KGluZGV4KTsKIH0KLUNQREZTREtfQW5ub3QqICBDUERGU0RLX0Fubm90SXRlcmF0b3I6OlByZXZBbm5vdCAoY29uc3QgQ1BERlNES19Bbm5vdCpwQ3VycmVudCkKLXsKLSAgICBpbnQgaW5kZXggPSAtMTsKLSAgICBpbnQgbkNvdW50ID0gbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0U2l6ZSgpOwotICAgIGlmKHBDdXJyZW50KXsKLSAgICAgICAgZm9yKGludCBpPTA7aTxuQ291bnQ7aSsrKXsKLSAgICAgICAgICAgIENQREZTREtfQW5ub3QgKiBwUmVhZGVyQW5ub3Q9IChDUERGU0RLX0Fubm90KiltX3BJdGVyYXRvckFubm90TGlzdC5HZXRBdChpKTsKLSAgICAgICAgICAgIGlmKHBSZWFkZXJBbm5vdCA9PXBDdXJyZW50KXsKLSAgICAgICAgICAgICAgICBpbmRleD1pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CitDUERGU0RLX0Fubm90KiBDUERGU0RLX0Fubm90SXRlcmF0b3I6Ok5leHRBbm5vdChpbnQmIGluZGV4KSB7CisgIGludCBuQ291bnQgPSBtX3BJdGVyYXRvckFubm90TGlzdC5HZXRTaXplKCk7CisgIGlmIChuQ291bnQgPD0gMCkKKyAgICBpbmRleCA9IC0xOworICBlbHNlIHsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICBpbmRleCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX2JDaXJjbGUpIHsKKyAgICAgICAgaW5kZXggPSAoaW5kZXggPCBuQ291bnQgLSAxKSA/IChpbmRleCArIDEpIDogMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4ID0gKGluZGV4IDwgbkNvdW50IC0gMSkgPyAoaW5kZXggKyAxKSA6IC0xOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gUHJldkFubm90KGluZGV4KTsKKyAgfQorICByZXR1cm4gKGluZGV4IDwgMCkgPyBOVUxMIDogKENQREZTREtfQW5ub3QqKW1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldEF0KGluZGV4KTsKIH0KLUNQREZTREtfQW5ub3QqICBDUERGU0RLX0Fubm90SXRlcmF0b3I6Ok5leHRBbm5vdCAoaW50JiBpbmRleCkKLXsKIAotICAgIGludCBuQ291bnQ9bV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0U2l6ZSgpOwotICAgIGlmKG5Db3VudDw9MCkgaW5kZXg9LTE7Ci0gICAgZWxzZXsKLSAgICAgICAgaWYoaW5kZXg8MCl7Ci0gICAgICAgICAgICBpbmRleD0wOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgICBpZihtX2JDaXJjbGUpewotICAgICAgICAgICAgICAgIGluZGV4PSggaW5kZXggPG5Db3VudC0xKSA/IChpbmRleCsxKSA6MDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgaW5kZXg9KCBpbmRleCA8bkNvdW50LTEpID8gKGluZGV4KzEpIDotMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9CitDUERGU0RLX0Fubm90KiBDUERGU0RLX0Fubm90SXRlcmF0b3I6OlByZXZBbm5vdChpbnQmIGluZGV4KSB7CisgIGludCBuQ291bnQgPSBtX3BJdGVyYXRvckFubm90TGlzdC5HZXRTaXplKCk7CisgIGlmIChuQ291bnQgPD0gMCkKKyAgICBpbmRleCA9IC0xOworICBlbHNlIHsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICBpbmRleCA9IG5Db3VudCAtIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX2JDaXJjbGUpIHsKKyAgICAgICAgaW5kZXggPSAoaW5kZXggPiAwKSA/IChpbmRleCAtIDEpIDogbkNvdW50IC0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4ID0gKGluZGV4ID4gMCkgPyAoaW5kZXggLSAxKSA6IC0xOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gKGluZGV4IDwwKSA/IE5VTEwgOiAoQ1BERlNES19Bbm5vdCopbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0QXQoaW5kZXgpOworICB9CisgIHJldHVybiAoaW5kZXggPCAwKSA/IE5VTEwgOiAoQ1BERlNES19Bbm5vdCopbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0QXQoaW5kZXgpOwogfQogCitDUERGU0RLX0Fubm90KiBDUERGU0RLX0Fubm90SXRlcmF0b3I6Ok5leHQoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpIHsKKyAgcmV0dXJuIChtX2JSZXZlcnNlKSA/IFByZXZBbm5vdChwQ3VycmVudCkgOiBOZXh0QW5ub3QocEN1cnJlbnQpOworfQogCi1DUERGU0RLX0Fubm90KiAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpQcmV2QW5ub3QgKGludCYgaW5kZXgpCi17CitDUERGU0RLX0Fubm90KiBDUERGU0RLX0Fubm90SXRlcmF0b3I6OlByZXYoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpIHsKKyAgcmV0dXJuIChtX2JSZXZlcnNlKSA/IE5leHRBbm5vdChwQ3VycmVudCkgOiBQcmV2QW5ub3QocEN1cnJlbnQpOworfQogCi0gICAgaW50IG5Db3VudD1tX3BJdGVyYXRvckFubm90TGlzdC5HZXRTaXplKCk7Ci0gICAgaWYobkNvdW50PD0wKSBpbmRleD0tMTsKLSAgICBlbHNlewotICAgICAgICBpZihpbmRleDwwKXsKLSAgICAgICAgICAgIGluZGV4PW5Db3VudC0xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgICBpZihtX2JDaXJjbGUpewotICAgICAgICAgICAgICAgIGluZGV4ID0gKCBpbmRleCA+MCkgPyAoaW5kZXgtMSkgOm5Db3VudC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICBpbmRleCA9ICggaW5kZXggPjApID8gKGluZGV4LTEpIDotMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorQ1BERlNES19Bbm5vdCogQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpOZXh0KGludCYgaW5kZXgpIHsKKyAgcmV0dXJuIChtX2JSZXZlcnNlKSA/IFByZXZBbm5vdChpbmRleCkgOiBOZXh0QW5ub3QoaW5kZXgpOworfQorCitDUERGU0RLX0Fubm90KiBDUERGU0RLX0Fubm90SXRlcmF0b3I6OlByZXYoaW50JiBpbmRleCkgeworICByZXR1cm4gKG1fYlJldmVyc2UpID8gTmV4dEFubm90KGluZGV4KSA6IFByZXZBbm5vdChpbmRleCk7Cit9CisKK3ZvaWQgQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpJbnNlcnRTb3J0KENGWF9QdHJBcnJheSYgYXJyYXlMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUlfQ09NUEFSRSBwQ29tcGFyZSkgeworICBmb3IgKGludCBpID0gMTsgaSA8IGFycmF5TGlzdC5HZXRTaXplKCk7IGkrKykgeworICAgIGlmIChwQ29tcGFyZSgoQ1BERlNES19Bbm5vdCopKGFycmF5TGlzdFtpXSksCisgICAgICAgICAgICAgICAgIChDUERGU0RLX0Fubm90KikoYXJyYXlMaXN0W2kgLSAxXSkpIDwgMCkgeworICAgICAgaW50IGogPSBpIC0gMTsKKyAgICAgIENQREZTREtfQW5ub3QqIHBUZW1wID0gKENQREZTREtfQW5ub3QqKWFycmF5TGlzdFtpXTsKKworICAgICAgZG8geworICAgICAgICBhcnJheUxpc3RbaiArIDFdID0gYXJyYXlMaXN0W2pdOworICAgICAgfSB3aGlsZSAoLS1qID49IDAgJiYgcENvbXBhcmUocFRlbXAsIChDUERGU0RLX0Fubm90KilhcnJheUxpc3Rbal0pIDwgMCk7CisKKyAgICAgIGFycmF5TGlzdFtqICsgMV0gPSBwVGVtcDsKICAgICB9Ci0gICAgcmV0dXJuIChpbmRleCA8MCkgPyBOVUxMIDogKENQREZTREtfQW5ub3QqKW1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldEF0KGluZGV4KTsKKyAgfQogfQogCi0KLUNQREZTREtfQW5ub3QqQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpOZXh0KGNvbnN0IENQREZTREtfQW5ub3QqIHBDdXJyZW50KQotewotCi0gICAgcmV0dXJuIChtX2JSZXZlcnNlKSA/IFByZXZBbm5vdChwQ3VycmVudCk6TmV4dEFubm90KHBDdXJyZW50KTsKLQoraW50IEx5T3JkZXJDb21wYXJlKENQREZTREtfQW5ub3QqIHAxLCBDUERGU0RLX0Fubm90KiBwMikgeworICBpZiAocDEtPkdldExheW91dE9yZGVyKCkgPCBwMi0+R2V0TGF5b3V0T3JkZXIoKSkKKyAgICByZXR1cm4gLTE7CisgIGlmIChwMS0+R2V0TGF5b3V0T3JkZXIoKSA+IHAyLT5HZXRMYXlvdXRPcmRlcigpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKIH0KIAotQ1BERlNES19Bbm5vdCogIENQREZTREtfQW5ub3RJdGVyYXRvcjo6UHJldihjb25zdCBDUERGU0RLX0Fubm90KiBwQ3VycmVudCkKLXsKK0ZYX0JPT0wgQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpJbml0SXRlcmF0b3JBbm5vdExpc3QoCisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgIENGWF9QdHJBcnJheSogcEFubm90TGlzdCkgeworICBBU1NFUlQocFBhZ2VWaWV3KTsKIAotICAgIHJldHVybiAobV9iUmV2ZXJzZSkgPyBOZXh0QW5ub3QocEN1cnJlbnQpOlByZXZBbm5vdChwQ3VycmVudCk7Ci19CisgIGlmIChwQW5ub3RMaXN0ID09IE5VTEwpIHsKKyAgICBwQW5ub3RMaXN0ID0gcFBhZ2VWaWV3LT5HZXRBbm5vdExpc3QoKTsKKyAgfQogCi1DUERGU0RLX0Fubm90KkNQREZTREtfQW5ub3RJdGVyYXRvcjo6TmV4dChpbnQmIGluZGV4ICkKLXsKKyAgbV9wSXRlcmF0b3JBbm5vdExpc3QuUmVtb3ZlQWxsKCk7CisgIGlmICghcEFubm90TGlzdCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICByZXR1cm4gKG1fYlJldmVyc2UpID8gUHJldkFubm90KGluZGV4KTpOZXh0QW5ub3QoaW5kZXgpOworICBDUERGU0RLX0Fubm90KiBwVG9wTW9zdEFubm90ID0KKyAgICAgIChtX2JJZ25vcmVUb3Btb3N0KSA/IE5VTEwgOiBwUGFnZVZpZXctPkdldEZvY3VzQW5ub3QoKTsKIAotfQorICBpbnQgbkNvdW50ID0gcEFubm90TGlzdC0+R2V0U2l6ZSgpOwogCi1DUERGU0RLX0Fubm90KiAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpQcmV2KGludCYgaW5kZXggKQoteworICBmb3IgKGludCBpID0gbkNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBDUERGU0RLX0Fubm90KiBwUmVhZGVyQW5ub3QgPSAoQ1BERlNES19Bbm5vdCopcEFubm90TGlzdC0+R2V0QXQoaSk7CisgICAgbV9wSXRlcmF0b3JBbm5vdExpc3QuQWRkKHBSZWFkZXJBbm5vdCk7CisgIH0KIAotICAgIHJldHVybiAobV9iUmV2ZXJzZSkgPyBOZXh0QW5ub3QoaW5kZXgpOlByZXZBbm5vdChpbmRleCk7Ci19CisgIEluc2VydFNvcnQobV9wSXRlcmF0b3JBbm5vdExpc3QsICZMeU9yZGVyQ29tcGFyZSk7CiAKLQotdm9pZCBDUERGU0RLX0Fubm90SXRlcmF0b3I6Okluc2VydFNvcnQoQ0ZYX1B0ckFycmF5ICZhcnJheUxpc3QsIEFJX0NPTVBBUkUgcENvbXBhcmUpCi17Ci0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcnJheUxpc3QuR2V0U2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgICBpZiAocENvbXBhcmUoKENQREZTREtfQW5ub3QqKShhcnJheUxpc3RbaV0pICwgKENQREZTREtfQW5ub3QqKShhcnJheUxpc3RbaS0xXSkpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGogPSBpLTE7Ci0gICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwVGVtcCA9IChDUERGU0RLX0Fubm90KilhcnJheUxpc3RbaV07Ci0KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJyYXlMaXN0W2ogKyAxXSA9IGFycmF5TGlzdFtqXTsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0taiA+PSAwICYmIHBDb21wYXJlKHBUZW1wLCAoQ1BERlNES19Bbm5vdCopYXJyYXlMaXN0W2pdKSA8IDApOwotCi0gICAgICAgICAgICBhcnJheUxpc3RbaisxXSA9IHBUZW1wOwotICAgICAgICB9CisgIGlmIChwVG9wTW9zdEFubm90KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgICAgQ1BERlNES19Bbm5vdCogcFJlYWRlckFubm90ID0KKyAgICAgICAgICAoQ1BERlNES19Bbm5vdCopbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0QXQoaSk7CisgICAgICBpZiAocFJlYWRlckFubm90ID09IHBUb3BNb3N0QW5ub3QpIHsKKyAgICAgICAgbV9wSXRlcmF0b3JBbm5vdExpc3QuUmVtb3ZlQXQoaSk7CisgICAgICAgIG1fcEl0ZXJhdG9yQW5ub3RMaXN0Lkluc2VydEF0KDAsIHBSZWFkZXJBbm5vdCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLX0KKyAgfQogCi1pbnQgTHlPcmRlckNvbXBhcmUoQ1BERlNES19Bbm5vdCogcDEsIENQREZTREtfQW5ub3QqIHAyKQotewotICAgIGlmIChwMS0+R2V0TGF5b3V0T3JkZXIoKSA8IHAyLT5HZXRMYXlvdXRPcmRlcigpKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKHAxLT5HZXRMYXlvdXRPcmRlcigpID4gcDItPkdldExheW91dE9yZGVyKCkpCi0gICAgICAgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi1GWF9CT09MIENQREZTREtfQW5ub3RJdGVyYXRvcjo6SW5pdEl0ZXJhdG9yQW5ub3RMaXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxDRlhfUHRyQXJyYXkgKiBwQW5ub3RMaXN0KQotewotICAgIEFTU0VSVChwUGFnZVZpZXcpOwotCi0gICAgaWYocEFubm90TGlzdD09TlVMTCl7Ci0gICAgICAgIHBBbm5vdExpc3Q9cFBhZ2VWaWV3LT5HZXRBbm5vdExpc3QoKTsKLSAgICB9Ci0KLSAgICBtX3BJdGVyYXRvckFubm90TGlzdC5SZW1vdmVBbGwoKTsKLSAgICBpZighcEFubm90TGlzdCkgcmV0dXJuIEZBTFNFOwotCi0gICAgQ1BERlNES19Bbm5vdCAqIHBUb3BNb3N0QW5ub3Q9IChtX2JJZ25vcmVUb3Btb3N0KSA/IE5VTEwgOiBwUGFnZVZpZXctPkdldEZvY3VzQW5ub3QoKTsKLQotCi0gICAgaW50IG5Db3VudCA9cEFubm90TGlzdC0+R2V0U2l6ZSgpOwotCi0gICAgZm9yKGludCBpID0gbkNvdW50LSAxIDtpID49IDA7aS0tKQotICAgIHsKLSAgICAgICAgQ1BERlNES19Bbm5vdCAqIHBSZWFkZXJBbm5vdD0gKENQREZTREtfQW5ub3QqKXBBbm5vdExpc3QtPkdldEF0KGkpOwotICAgICAgICBtX3BJdGVyYXRvckFubm90TGlzdC5BZGQocFJlYWRlckFubm90KTsKLSAgICB9Ci0KLSAgICBJbnNlcnRTb3J0KG1fcEl0ZXJhdG9yQW5ub3RMaXN0LCZMeU9yZGVyQ29tcGFyZSk7Ci0KLSAgICBpZihwVG9wTW9zdEFubm90KQotICAgIHsKLSAgICAgICAgZm9yKGludCBpPTAgO2k8bkNvdW50O2krKykKLSAgICAgICAgewotICAgICAgICAgICAgQ1BERlNES19Bbm5vdCAqIHBSZWFkZXJBbm5vdCA9IChDUERGU0RLX0Fubm90KiltX3BJdGVyYXRvckFubm90TGlzdC5HZXRBdChpKTsKLSAgICAgICAgICAgIGlmKHBSZWFkZXJBbm5vdCA9PSBwVG9wTW9zdEFubm90KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fcEl0ZXJhdG9yQW5ub3RMaXN0LlJlbW92ZUF0KGkpOwotICAgICAgICAgICAgICAgIG1fcEl0ZXJhdG9yQW5ub3RMaXN0Lkluc2VydEF0KDAsIHBSZWFkZXJBbm5vdCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vhbm5vdC5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vhbm5vdC5jcHAKaW5kZXggYTg2MmVhNy4uODNjZDQ5OCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19iYXNlYW5ub3QuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWFubm90LmNwcApAQCAtOSwzMCArOSwyNCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19tZ3IuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgiCiAKLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19EYXRlVGltZQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBfZ0FmeEdldFRpbWVab25lSW5TZWNvbmRzKEZYX0NIQVIgdHpob3VyLCB1aW50OF90IHR6bWludXRlKQotewotICAgIHJldHVybiAoaW50KXR6aG91ciAqIDM2MDAgKyAoaW50KXR6bWludXRlICogKHR6aG91ciA+PSAwID8gNjAgOiAtNjApOworaW50IF9nQWZ4R2V0VGltZVpvbmVJblNlY29uZHMoRlhfQ0hBUiB0emhvdXIsIHVpbnQ4X3QgdHptaW51dGUpIHsKKyAgcmV0dXJuIChpbnQpdHpob3VyICogMzYwMCArIChpbnQpdHptaW51dGUgKiAodHpob3VyID49IDAgPyA2MCA6IC02MCk7CiB9CiAKLUZYX0JPT0wgX2dBZnhJc0xlYXBZZWFyKGludDE2X3QgeWVhcikKLXsKLSAgICByZXR1cm4gKCh5ZWFyICUgNDAwID09IDApIHx8ICgoeWVhciAlIDQgPT0gMCkgJiYgKHllYXIgJSAxMDAgIT0gMCkpKTsKK0ZYX0JPT0wgX2dBZnhJc0xlYXBZZWFyKGludDE2X3QgeWVhcikgeworICByZXR1cm4gKCh5ZWFyICUgNDAwID09IDApIHx8ICgoeWVhciAlIDQgPT0gMCkgJiYgKHllYXIgJSAxMDAgIT0gMCkpKTsKIH0KIAotRlhfV09SRCBfZ0FmeEdldFllYXJEYXlzKGludDE2X3QgeWVhcikKLXsKLSAgICByZXR1cm4gKF9nQWZ4SXNMZWFwWWVhcih5ZWFyKSA9PSBUUlVFID8gMzY2IDogMzY1KTsKK0ZYX1dPUkQgX2dBZnhHZXRZZWFyRGF5cyhpbnQxNl90IHllYXIpIHsKKyAgcmV0dXJuIChfZ0FmeElzTGVhcFllYXIoeWVhcikgPT0gVFJVRSA/IDM2NiA6IDM2NSk7CiB9CiAKLXVpbnQ4X3QgX2dBZnhHZXRNb250aERheXMoaW50MTZfdCB5ZWFyLCB1aW50OF90IG1vbnRoKQotewotICAgIHVpbnQ4X3QgbURheXM7Ci0gICAgc3dpdGNoIChtb250aCkKLSAgICB7Cit1aW50OF90IF9nQWZ4R2V0TW9udGhEYXlzKGludDE2X3QgeWVhciwgdWludDhfdCBtb250aCkgeworICB1aW50OF90IG1EYXlzOworICBzd2l0Y2ggKG1vbnRoKSB7CiAgICAgY2FzZSAxOgogICAgIGNhc2UgMzoKICAgICBjYXNlIDU6CkBAIC00MCwxMDQ5ICszNCw5ODEgQEAKICAgICBjYXNlIDg6CiAgICAgY2FzZSAxMDoKICAgICBjYXNlIDEyOgotICAgICAgICBtRGF5cyA9IDMxOwotICAgICAgICBicmVhazsKKyAgICAgIG1EYXlzID0gMzE7CisgICAgICBicmVhazsKIAogICAgIGNhc2UgNDoKICAgICBjYXNlIDY6CiAgICAgY2FzZSA5OgogICAgIGNhc2UgMTE6Ci0gICAgICAgIG1EYXlzID0gMzA7Ci0gICAgICAgIGJyZWFrOworICAgICAgbURheXMgPSAzMDsKKyAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAyOgotICAgICAgICBpZiAoX2dBZnhJc0xlYXBZZWFyKHllYXIpID09IFRSVUUpCi0gICAgICAgICAgICBtRGF5cyA9IDI5OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtRGF5cyA9IDI4OwotICAgICAgICBicmVhazsKKyAgICAgIGlmIChfZ0FmeElzTGVhcFllYXIoeWVhcikgPT0gVFJVRSkKKyAgICAgICAgbURheXMgPSAyOTsKKyAgICAgIGVsc2UKKyAgICAgICAgbURheXMgPSAyODsKKyAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgICAgbURheXMgPSAwOworICAgICAgbURheXMgPSAwOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gbURheXM7Cit9CisKK0NQREZTREtfRGF0ZVRpbWU6OkNQREZTREtfRGF0ZVRpbWUoKSB7CisgIFJlc2V0RGF0ZVRpbWUoKTsKK30KKworQ1BERlNES19EYXRlVGltZTo6Q1BERlNES19EYXRlVGltZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZHRTdHIpIHsKKyAgUmVzZXREYXRlVGltZSgpOworCisgIEZyb21QREZEYXRlVGltZVN0cmluZyhkdFN0cik7Cit9CisKK0NQREZTREtfRGF0ZVRpbWU6OkNQREZTREtfRGF0ZVRpbWUoY29uc3QgQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpIHsKKyAgb3BlcmF0b3I9KGRhdGV0aW1lKTsKK30KKworQ1BERlNES19EYXRlVGltZTo6Q1BERlNES19EYXRlVGltZShjb25zdCBGWF9TWVNURU1USU1FJiBzdCkgeworICBvcGVyYXRvcj0oc3QpOworfQorCit2b2lkIENQREZTREtfRGF0ZVRpbWU6OlJlc2V0RGF0ZVRpbWUoKSB7CisgIHR6c2V0KCk7CisKKyAgdGltZV90IGN1clRpbWU7CisgIHRpbWUoJmN1clRpbWUpOworICBzdHJ1Y3QgdG0qIG5ld3RpbWU7CisgIC8vIG5ld3RpbWUgPSBnbXRpbWUoJmN1clRpbWUpOworICBuZXd0aW1lID0gbG9jYWx0aW1lKCZjdXJUaW1lKTsKKworICBkdC55ZWFyID0gbmV3dGltZS0+dG1feWVhciArIDE5MDA7CisgIGR0Lm1vbnRoID0gbmV3dGltZS0+dG1fbW9uICsgMTsKKyAgZHQuZGF5ID0gbmV3dGltZS0+dG1fbWRheTsKKyAgZHQuaG91ciA9IG5ld3RpbWUtPnRtX2hvdXI7CisgIGR0Lm1pbnV0ZSA9IG5ld3RpbWUtPnRtX21pbjsKKyAgZHQuc2Vjb25kID0gbmV3dGltZS0+dG1fc2VjOworICAvLyAgZHQudHpIb3VyID0gX3RpbWV6b25lIC8gMzYwMCAqIC0xOworICAvLyAgZHQudHpNaW51dGUgPSAoYWJzKF90aW1lem9uZSkgJSAzNjAwKSAvIDYwOworfQorCitDUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvcj0oCisgICAgY29uc3QgQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpIHsKKyAgRlhTWVNfbWVtY3B5KCZkdCwgJmRhdGV0aW1lLmR0LCBzaXplb2YoRlhfREFURVRJTUUpKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitDUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvcj0oY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpIHsKKyAgdHpzZXQoKTsKKworICBkdC55ZWFyID0gKGludDE2X3Qpc3Qud1llYXI7CisgIGR0Lm1vbnRoID0gKHVpbnQ4X3Qpc3Qud01vbnRoOworICBkdC5kYXkgPSAodWludDhfdClzdC53RGF5OworICBkdC5ob3VyID0gKHVpbnQ4X3Qpc3Qud0hvdXI7CisgIGR0Lm1pbnV0ZSA9ICh1aW50OF90KXN0LndNaW51dGU7CisgIGR0LnNlY29uZCA9ICh1aW50OF90KXN0LndTZWNvbmQ7CisgIC8vICBkdC50ekhvdXIgPSBfdGltZXpvbmUgLyAzNjAwICogLTE7CisgIC8vICBkdC50ek1pbnV0ZSA9IChhYnMoX3RpbWV6b25lKSAlIDM2MDApIC8gNjA7CisgIHJldHVybiAqdGhpczsKK30KKworRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvcj09KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKSB7CisgIHJldHVybiAoRlhTWVNfbWVtY21wKCZkdCwgJmRhdGV0aW1lLmR0LCBzaXplb2YoRlhfREFURVRJTUUpKSA9PSAwKTsKK30KKworRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciE9KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKSB7CisgIHJldHVybiAoRlhTWVNfbWVtY21wKCZkdCwgJmRhdGV0aW1lLmR0LCBzaXplb2YoRlhfREFURVRJTUUpKSAhPSAwKTsKK30KKworRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvcj4oQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpIHsKKyAgQ1BERlNES19EYXRlVGltZSBkdDEgPSBUb0dNVCgpOworICBDUERGU0RLX0RhdGVUaW1lIGR0MiA9IGRhdGV0aW1lLlRvR01UKCk7CisgIGludCBkMSA9CisgICAgICAoKChpbnQpZHQxLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDEuZHQuZGF5OworICBpbnQgZDIgPSAoKChpbnQpZHQxLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubWludXRlKSA8PCA4KSB8CisgICAgICAgICAgIChpbnQpZHQxLmR0LnNlY29uZDsKKyAgaW50IGQzID0KKyAgICAgICgoKGludClkdDIuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0Mi5kdC5kYXk7CisgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwKKyAgICAgICAgICAgKGludClkdDIuZHQuc2Vjb25kOworCisgIGlmIChkMSA+IGQzKQorICAgIHJldHVybiBUUlVFOworICBpZiAoZDIgPiBkNCkKKyAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yPj0oQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpIHsKKyAgQ1BERlNES19EYXRlVGltZSBkdDEgPSBUb0dNVCgpOworICBDUERGU0RLX0RhdGVUaW1lIGR0MiA9IGRhdGV0aW1lLlRvR01UKCk7CisgIGludCBkMSA9CisgICAgICAoKChpbnQpZHQxLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDEuZHQuZGF5OworICBpbnQgZDIgPSAoKChpbnQpZHQxLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubWludXRlKSA8PCA4KSB8CisgICAgICAgICAgIChpbnQpZHQxLmR0LnNlY29uZDsKKyAgaW50IGQzID0KKyAgICAgICgoKGludClkdDIuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0Mi5kdC5kYXk7CisgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwKKyAgICAgICAgICAgKGludClkdDIuZHQuc2Vjb25kOworCisgIGlmIChkMSA+PSBkMykKKyAgICByZXR1cm4gVFJVRTsKKyAgaWYgKGQyID49IGQ0KQorICAgIHJldHVybiBUUlVFOworICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3I8KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKSB7CisgIENQREZTREtfRGF0ZVRpbWUgZHQxID0gVG9HTVQoKTsKKyAgQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOworICBpbnQgZDEgPQorICAgICAgKCgoaW50KWR0MS5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQxLmR0LmRheTsKKyAgaW50IGQyID0gKCgoaW50KWR0MS5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1pbnV0ZSkgPDwgOCkgfAorICAgICAgICAgICAoaW50KWR0MS5kdC5zZWNvbmQ7CisgIGludCBkMyA9CisgICAgICAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OworICBpbnQgZDQgPSAoKChpbnQpZHQyLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubWludXRlKSA8PCA4KSB8CisgICAgICAgICAgIChpbnQpZHQyLmR0LnNlY29uZDsKKworICBpZiAoZDEgPCBkMykKKyAgICByZXR1cm4gVFJVRTsKKyAgaWYgKGQyIDwgZDQpCisgICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvcjw9KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKSB7CisgIENQREZTREtfRGF0ZVRpbWUgZHQxID0gVG9HTVQoKTsKKyAgQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOworICBpbnQgZDEgPQorICAgICAgKCgoaW50KWR0MS5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQxLmR0LmRheTsKKyAgaW50IGQyID0gKCgoaW50KWR0MS5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1pbnV0ZSkgPDwgOCkgfAorICAgICAgICAgICAoaW50KWR0MS5kdC5zZWNvbmQ7CisgIGludCBkMyA9CisgICAgICAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OworICBpbnQgZDQgPSAoKChpbnQpZHQyLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubWludXRlKSA8PCA4KSB8CisgICAgICAgICAgIChpbnQpZHQyLmR0LnNlY29uZDsKKworICBpZiAoZDEgPD0gZDMpCisgICAgcmV0dXJuIFRSVUU7CisgIGlmIChkMiA8PSBkNCkKKyAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciB0aW1lX3QoKSB7CisgIHN0cnVjdCB0bSBuZXd0aW1lOworCisgIG5ld3RpbWUudG1feWVhciA9IGR0LnllYXIgLSAxOTAwOworICBuZXd0aW1lLnRtX21vbiA9IGR0Lm1vbnRoIC0gMTsKKyAgbmV3dGltZS50bV9tZGF5ID0gZHQuZGF5OworICBuZXd0aW1lLnRtX2hvdXIgPSBkdC5ob3VyOworICBuZXd0aW1lLnRtX21pbiA9IGR0Lm1pbnV0ZTsKKyAgbmV3dGltZS50bV9zZWMgPSBkdC5zZWNvbmQ7CisKKyAgcmV0dXJuIG1rdGltZSgmbmV3dGltZSk7Cit9CisKK0NQREZTREtfRGF0ZVRpbWUmIENQREZTREtfRGF0ZVRpbWU6OkZyb21QREZEYXRlVGltZVN0cmluZygKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgZHRTdHIpIHsKKyAgaW50IHN0ckxlbmd0aCA9IGR0U3RyLkdldExlbmd0aCgpOworICBpZiAoc3RyTGVuZ3RoID4gMCkgeworICAgIGludCBpID0gMDsKKyAgICBpbnQgaiwgazsKKyAgICBGWF9DSEFSIGNoOworICAgIHdoaWxlIChpIDwgc3RyTGVuZ3RoKSB7CisgICAgICBjaCA9IGR0U3RyW2ldOworICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCiAgICAgICAgIGJyZWFrOworICAgICAgaSsrOwogICAgIH0KKyAgICBpZiAoaSA+PSBzdHJMZW5ndGgpCisgICAgICByZXR1cm4gKnRoaXM7CiAKLSAgICByZXR1cm4gbURheXM7Ci19Ci0KLUNQREZTREtfRGF0ZVRpbWU6OkNQREZTREtfRGF0ZVRpbWUoKQotewotICAgIFJlc2V0RGF0ZVRpbWUoKTsKLX0KLQotQ1BERlNES19EYXRlVGltZTo6Q1BERlNES19EYXRlVGltZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZHRTdHIpCi17Ci0gICAgUmVzZXREYXRlVGltZSgpOwotCi0gICAgRnJvbVBERkRhdGVUaW1lU3RyaW5nKGR0U3RyKTsKLX0KLQotQ1BERlNES19EYXRlVGltZTo6Q1BERlNES19EYXRlVGltZShjb25zdCBDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKLXsKLSAgICBvcGVyYXRvciA9IChkYXRldGltZSk7Ci19Ci0KLUNQREZTREtfRGF0ZVRpbWU6OkNQREZTREtfRGF0ZVRpbWUoY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpCi17Ci0gICAgb3BlcmF0b3IgPSAoc3QpIDsKLX0KLQotCi12b2lkIENQREZTREtfRGF0ZVRpbWU6OlJlc2V0RGF0ZVRpbWUoKQotewotICAgIHR6c2V0KCk7Ci0KLSAgICB0aW1lX3QgIGN1clRpbWU7Ci0gICAgdGltZSgmY3VyVGltZSk7Ci0gICAgc3RydWN0IHRtKiBuZXd0aW1lOwotICAgIC8vbmV3dGltZSA9IGdtdGltZSgmY3VyVGltZSk7Ci0gICAgbmV3dGltZSA9IGxvY2FsdGltZSgmY3VyVGltZSk7Ci0KLSAgICBkdC55ZWFyID0gbmV3dGltZS0+dG1feWVhciArIDE5MDA7Ci0gICAgZHQubW9udGggPSBuZXd0aW1lLT50bV9tb24gKyAxOwotICAgIGR0LmRheSA9IG5ld3RpbWUtPnRtX21kYXk7Ci0gICAgZHQuaG91ciA9IG5ld3RpbWUtPnRtX2hvdXI7Ci0gICAgZHQubWludXRlID0gbmV3dGltZS0+dG1fbWluOwotICAgIGR0LnNlY29uZCA9IG5ld3RpbWUtPnRtX3NlYzsKLS8vICBkdC50ekhvdXIgPSBfdGltZXpvbmUgLyAzNjAwICogLTE7Ci0vLyAgZHQudHpNaW51dGUgPSAoYWJzKF90aW1lem9uZSkgJSAzNjAwKSAvIDYwOwotfQotCi1DUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA9IChjb25zdCBDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKLXsKLSAgICBGWFNZU19tZW1jcHkoJmR0LCAmZGF0ZXRpbWUuZHQsIHNpemVvZihGWF9EQVRFVElNRSkpOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotQ1BERlNES19EYXRlVGltZSYgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPSAoY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpCi17Ci0gICAgdHpzZXQoKTsKLQotICAgIGR0LnllYXIgPSAoaW50MTZfdClzdC53WWVhcjsKLSAgICBkdC5tb250aCA9ICh1aW50OF90KXN0LndNb250aDsKLSAgICBkdC5kYXkgPSAodWludDhfdClzdC53RGF5OwotICAgIGR0LmhvdXIgPSAodWludDhfdClzdC53SG91cjsKLSAgICBkdC5taW51dGUgPSAodWludDhfdClzdC53TWludXRlOwotICAgIGR0LnNlY29uZCA9ICh1aW50OF90KXN0LndTZWNvbmQ7Ci0vLyAgZHQudHpIb3VyID0gX3RpbWV6b25lIC8gMzYwMCAqIC0xOwotLy8gIGR0LnR6TWludXRlID0gKGFicyhfdGltZXpvbmUpICUgMzYwMCkgLyA2MDsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPT0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQotewotICAgIHJldHVybiAoRlhTWVNfbWVtY21wKCZkdCwgJmRhdGV0aW1lLmR0LCBzaXplb2YoRlhfREFURVRJTUUpKSA9PSAwKTsKLX0KLQotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciAhPSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCi17Ci0gICAgcmV0dXJuIChGWFNZU19tZW1jbXAoJmR0LCAmZGF0ZXRpbWUuZHQsIHNpemVvZihGWF9EQVRFVElNRSkpICE9IDApOwotfQotCi1GWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yID4gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQotewotICAgIENQREZTREtfRGF0ZVRpbWUgZHQxID0gVG9HTVQoKTsKLSAgICBDUERGU0RLX0RhdGVUaW1lIGR0MiA9IGRhdGV0aW1lLlRvR01UKCk7Ci0gICAgaW50IGQxID0gKCgoaW50KWR0MS5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQxLmR0LmRheTsKLSAgICBpbnQgZDIgPSAoKChpbnQpZHQxLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubWludXRlKSA8PCA4KSB8IChpbnQpZHQxLmR0LnNlY29uZDsKLSAgICBpbnQgZDMgPSAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OwotICAgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwgKGludClkdDIuZHQuc2Vjb25kOwotCi0gICAgaWYgKGQxID4gZDMpIHJldHVybiBUUlVFOwotICAgIGlmIChkMiA+IGQ0KSByZXR1cm4gVFJVRTsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgPj0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKQotewotICAgIENQREZTREtfRGF0ZVRpbWUgZHQxID0gVG9HTVQoKTsKLSAgICBDUERGU0RLX0RhdGVUaW1lIGR0MiA9IGRhdGV0aW1lLlRvR01UKCk7Ci0gICAgaW50IGQxID0gKCgoaW50KWR0MS5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQxLmR0LmRheTsKLSAgICBpbnQgZDIgPSAoKChpbnQpZHQxLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubWludXRlKSA8PCA4KSB8IChpbnQpZHQxLmR0LnNlY29uZDsKLSAgICBpbnQgZDMgPSAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OwotICAgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwgKGludClkdDIuZHQuc2Vjb25kOwotCi0gICAgaWYgKGQxID49IGQzKSByZXR1cm4gVFJVRTsKLSAgICBpZiAoZDIgPj0gZDQpIHJldHVybiBUUlVFOwotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA8IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKLXsKLSAgICBDUERGU0RLX0RhdGVUaW1lIGR0MSA9IFRvR01UKCk7Ci0gICAgQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOwotICAgIGludCBkMSA9ICgoKGludClkdDEuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0MS5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0MS5kdC5kYXk7Ci0gICAgaW50IGQyID0gKCgoaW50KWR0MS5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1pbnV0ZSkgPDwgOCkgfCAoaW50KWR0MS5kdC5zZWNvbmQ7Ci0gICAgaW50IGQzID0gKCgoaW50KWR0Mi5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQyLmR0LmRheTsKLSAgICBpbnQgZDQgPSAoKChpbnQpZHQyLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubWludXRlKSA8PCA4KSB8IChpbnQpZHQyLmR0LnNlY29uZDsKLQotICAgIGlmIChkMSA8IGQzKSByZXR1cm4gVFJVRTsKLSAgICBpZiAoZDIgPCBkNCkgcmV0dXJuIFRSVUU7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yIDw9IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKLXsKLSAgICBDUERGU0RLX0RhdGVUaW1lIGR0MSA9IFRvR01UKCk7Ci0gICAgQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOwotICAgIGludCBkMSA9ICgoKGludClkdDEuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0MS5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0MS5kdC5kYXk7Ci0gICAgaW50IGQyID0gKCgoaW50KWR0MS5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1pbnV0ZSkgPDwgOCkgfCAoaW50KWR0MS5kdC5zZWNvbmQ7Ci0gICAgaW50IGQzID0gKCgoaW50KWR0Mi5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQyLmR0LmRheTsKLSAgICBpbnQgZDQgPSAoKChpbnQpZHQyLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubWludXRlKSA8PCA4KSB8IChpbnQpZHQyLmR0LnNlY29uZDsKLQotICAgIGlmIChkMSA8PSBkMykgcmV0dXJuIFRSVUU7Ci0gICAgaWYgKGQyIDw9IGQ0KSByZXR1cm4gVFJVRTsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUNQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yIHRpbWVfdCgpCi17Ci0gICAgc3RydWN0IHRtIG5ld3RpbWU7Ci0KLSAgICBuZXd0aW1lLnRtX3llYXIgPSBkdC55ZWFyIC0gMTkwMDsKLSAgICBuZXd0aW1lLnRtX21vbiA9IGR0Lm1vbnRoIC0gMTsKLSAgICBuZXd0aW1lLnRtX21kYXkgPSBkdC5kYXk7Ci0gICAgbmV3dGltZS50bV9ob3VyID0gZHQuaG91cjsKLSAgICBuZXd0aW1lLnRtX21pbiA9IGR0Lm1pbnV0ZTsKLSAgICBuZXd0aW1lLnRtX3NlYyA9IGR0LnNlY29uZDsKLQotICAgIHJldHVybiBta3RpbWUoJm5ld3RpbWUpOwotfQotCi1DUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpGcm9tUERGRGF0ZVRpbWVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGR0U3RyKQotewotICAgIGludCBzdHJMZW5ndGggPSBkdFN0ci5HZXRMZW5ndGgoKTsKLSAgICBpZiAoc3RyTGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgaW50IGosIGs7Ci0gICAgICAgIEZYX0NIQVIgY2g7Ci0gICAgICAgIHdoaWxlIChpIDwgc3RyTGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaCA9IGR0U3RyW2ldOwotICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIGJyZWFrOwotICAgICAgICAgICAgaSArKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoaSA+PSBzdHJMZW5ndGgpIHJldHVybiAqdGhpczsKLQotICAgICAgICBqID0gMDsKLSAgICAgICAgayA9IDA7Ci0gICAgICAgIHdoaWxlIChpIDwgc3RyTGVuZ3RoICYmIGogPCA0KQotICAgICAgICB7Ci0gICAgICAgICAgICBjaCA9IGR0U3RyW2ldOwotICAgICAgICAgICAgayA9IGsgKiAxMCArIGNoIC0gJzAnOwotICAgICAgICAgICAgaiArKzsKLSAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgYnJlYWs7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9Ci0gICAgICAgIGR0LnllYXIgPSAoaW50MTZfdClrOwotICAgICAgICBpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDQpIHJldHVybiAqdGhpczsKLQotICAgICAgICBqID0gMDsKLSAgICAgICAgayA9IDA7Ci0gICAgICAgIHdoaWxlIChpIDwgc3RyTGVuZ3RoICYmIGogPCAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaCA9IGR0U3RyW2ldOwotICAgICAgICAgICAgayA9IGsgKiAxMCArIGNoIC0gJzAnOwotICAgICAgICAgICAgaiArKzsKLSAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgYnJlYWs7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9Ci0gICAgICAgIGR0Lm1vbnRoID0gKHVpbnQ4X3QpazsKLSAgICAgICAgaWYgKGkgPj0gc3RyTGVuZ3RoIHx8IGogPCAyKSByZXR1cm4gKnRoaXM7Ci0KLSAgICAgICAgaiA9IDA7Ci0gICAgICAgIGsgPSAwOwotICAgICAgICB3aGlsZSAoaSA8IHN0ckxlbmd0aCAmJiBqIDwgMikKLSAgICAgICAgewotICAgICAgICAgICAgY2ggPSBkdFN0cltpXTsKLSAgICAgICAgICAgIGsgPSBrICogMTAgKyBjaCAtICcwJzsKLSAgICAgICAgICAgIGogKys7Ci0gICAgICAgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpIGJyZWFrOwotICAgICAgICAgICAgaSArKzsKLSAgICAgICAgfQotICAgICAgICBkdC5kYXkgPSAodWludDhfdClrOwotICAgICAgICBpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDIpIHJldHVybiAqdGhpczsKLQotICAgICAgICBqID0gMDsKLSAgICAgICAgayA9IDA7Ci0gICAgICAgIHdoaWxlIChpIDwgc3RyTGVuZ3RoICYmIGogPCAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaCA9IGR0U3RyW2ldOwotICAgICAgICAgICAgayA9IGsgKiAxMCArIGNoIC0gJzAnOwotICAgICAgICAgICAgaiArKzsKLSAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgYnJlYWs7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9Ci0gICAgICAgIGR0LmhvdXIgPSAodWludDhfdClrOwotICAgICAgICBpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDIpIHJldHVybiAqdGhpczsKLQotICAgICAgICBqID0gMDsKLSAgICAgICAgayA9IDA7Ci0gICAgICAgIHdoaWxlIChpIDwgc3RyTGVuZ3RoICYmIGogPCAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaCA9IGR0U3RyW2ldOwotICAgICAgICAgICAgayA9IGsgKiAxMCArIGNoIC0gJzAnOwotICAgICAgICAgICAgaiArKzsKLSAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgYnJlYWs7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9Ci0gICAgICAgIGR0Lm1pbnV0ZSA9ICh1aW50OF90KWs7Ci0gICAgICAgIGlmIChpID49IHN0ckxlbmd0aCB8fCBqIDwgMikgcmV0dXJuICp0aGlzOwotCi0gICAgICAgIGogPSAwOwotICAgICAgICBrID0gMDsKLSAgICAgICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoID0gZHRTdHJbaV07Ci0gICAgICAgICAgICBrID0gayAqIDEwICsgY2ggLSAnMCc7Ci0gICAgICAgICAgICBqICsrOwotICAgICAgICAgICAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKSBicmVhazsKLSAgICAgICAgICAgIGkgKys7Ci0gICAgICAgIH0KLSAgICAgICAgZHQuc2Vjb25kID0gKHVpbnQ4X3QpazsKLSAgICAgICAgaWYgKGkgPj0gc3RyTGVuZ3RoIHx8IGogPCAyKSByZXR1cm4gKnRoaXM7Ci0KLSAgICAgICAgY2ggPSBkdFN0cltpICsrXTsKLSAgICAgICAgaWYgKGNoICE9ICctJyAmJiBjaCAhPSAnKycpIHJldHVybiAqdGhpczsKLSAgICAgICAgaWYgKGNoID09ICctJykKLSAgICAgICAgICAgIGR0LnR6SG91ciA9IC0xOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkdC50ekhvdXIgPSAxOwotICAgICAgICBqID0gMDsKLSAgICAgICAgayA9IDA7Ci0gICAgICAgIHdoaWxlIChpIDwgc3RyTGVuZ3RoICYmIGogPCAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaCA9IGR0U3RyW2ldOwotICAgICAgICAgICAgayA9IGsgKiAxMCArIGNoIC0gJzAnOwotICAgICAgICAgICAgaiArKzsKLSAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgYnJlYWs7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9Ci0gICAgICAgIGR0LnR6SG91ciAqPSAoRlhfQ0hBUilrOwotICAgICAgICBpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDIpIHJldHVybiAqdGhpczsKLQotICAgICAgICBjaCA9IGR0U3RyW2kgKytdOwotICAgICAgICBpZiAoY2ggIT0gJ1wnJykgcmV0dXJuICp0aGlzOwotICAgICAgICBqID0gMDsKLSAgICAgICAgayA9IDA7Ci0gICAgICAgIHdoaWxlIChpIDwgc3RyTGVuZ3RoICYmIGogPCAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaCA9IGR0U3RyW2ldOwotICAgICAgICAgICAgayA9IGsgKiAxMCArIGNoIC0gJzAnOwotICAgICAgICAgICAgaiArKzsKLSAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgYnJlYWs7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9Ci0gICAgICAgIGR0LnR6TWludXRlID0gKHVpbnQ4X3QpazsKLSAgICAgICAgaWYgKGkgPj0gc3RyTGVuZ3RoIHx8IGogPCAyKSByZXR1cm4gKnRoaXM7CisgICAgaiA9IDA7CisgICAgayA9IDA7CisgICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDQpIHsKKyAgICAgIGNoID0gZHRTdHJbaV07CisgICAgICBrID0gayAqIDEwICsgY2ggLSAnMCc7CisgICAgICBqKys7CisgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCisgICAgICAgIGJyZWFrOworICAgICAgaSsrOwogICAgIH0KKyAgICBkdC55ZWFyID0gKGludDE2X3QpazsKKyAgICBpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDQpCisgICAgICByZXR1cm4gKnRoaXM7CiAKLSAgICByZXR1cm4gICp0aGlzOwotfQorICAgIGogPSAwOworICAgIGsgPSAwOworICAgIHdoaWxlIChpIDwgc3RyTGVuZ3RoICYmIGogPCAyKSB7CisgICAgICBjaCA9IGR0U3RyW2ldOworICAgICAgayA9IGsgKiAxMCArIGNoIC0gJzAnOworICAgICAgaisrOworICAgICAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQorICAgICAgICBicmVhazsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgZHQubW9udGggPSAodWludDhfdClrOworICAgIGlmIChpID49IHN0ckxlbmd0aCB8fCBqIDwgMikKKyAgICAgIHJldHVybiAqdGhpczsKIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19EYXRlVGltZTo6VG9Db21tb25EYXRlVGltZVN0cmluZygpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyMTsKLSAgICBzdHIxLkZvcm1hdCgiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgIiwgZHQueWVhciwgZHQubW9udGgsIGR0LmRheSwgZHQuaG91ciwgZHQubWludXRlLCBkdC5zZWNvbmQpOwotICAgIGlmIChkdC50ekhvdXIgPCAwKQotICAgICAgICBzdHIxICs9ICItIjsKKyAgICBqID0gMDsKKyAgICBrID0gMDsKKyAgICB3aGlsZSAoaSA8IHN0ckxlbmd0aCAmJiBqIDwgMikgeworICAgICAgY2ggPSBkdFN0cltpXTsKKyAgICAgIGsgPSBrICogMTAgKyBjaCAtICcwJzsKKyAgICAgIGorKzsKKyAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKKyAgICAgICAgYnJlYWs7CisgICAgICBpKys7CisgICAgfQorICAgIGR0LmRheSA9ICh1aW50OF90KWs7CisgICAgaWYgKGkgPj0gc3RyTGVuZ3RoIHx8IGogPCAyKQorICAgICAgcmV0dXJuICp0aGlzOworCisgICAgaiA9IDA7CisgICAgayA9IDA7CisgICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKKyAgICAgIGNoID0gZHRTdHJbaV07CisgICAgICBrID0gayAqIDEwICsgY2ggLSAnMCc7CisgICAgICBqKys7CisgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCisgICAgICAgIGJyZWFrOworICAgICAgaSsrOworICAgIH0KKyAgICBkdC5ob3VyID0gKHVpbnQ4X3QpazsKKyAgICBpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDIpCisgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICBqID0gMDsKKyAgICBrID0gMDsKKyAgICB3aGlsZSAoaSA8IHN0ckxlbmd0aCAmJiBqIDwgMikgeworICAgICAgY2ggPSBkdFN0cltpXTsKKyAgICAgIGsgPSBrICogMTAgKyBjaCAtICcwJzsKKyAgICAgIGorKzsKKyAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKKyAgICAgICAgYnJlYWs7CisgICAgICBpKys7CisgICAgfQorICAgIGR0Lm1pbnV0ZSA9ICh1aW50OF90KWs7CisgICAgaWYgKGkgPj0gc3RyTGVuZ3RoIHx8IGogPCAyKQorICAgICAgcmV0dXJuICp0aGlzOworCisgICAgaiA9IDA7CisgICAgayA9IDA7CisgICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKKyAgICAgIGNoID0gZHRTdHJbaV07CisgICAgICBrID0gayAqIDEwICsgY2ggLSAnMCc7CisgICAgICBqKys7CisgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCisgICAgICAgIGJyZWFrOworICAgICAgaSsrOworICAgIH0KKyAgICBkdC5zZWNvbmQgPSAodWludDhfdClrOworICAgIGlmIChpID49IHN0ckxlbmd0aCB8fCBqIDwgMikKKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIGNoID0gZHRTdHJbaSsrXTsKKyAgICBpZiAoY2ggIT0gJy0nICYmIGNoICE9ICcrJykKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICBpZiAoY2ggPT0gJy0nKQorICAgICAgZHQudHpIb3VyID0gLTE7CiAgICAgZWxzZQotICAgICAgICBzdHIxICs9ICIrIjsKLSAgICBDRlhfQnl0ZVN0cmluZyBzdHIyOwotICAgIHN0cjIuRm9ybWF0KCIlMDJkOiUwMmQiLCBhYnMoZHQudHpIb3VyKSwgZHQudHpNaW51dGUpOwotICAgIHJldHVybiBzdHIxICsgc3RyMjsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19EYXRlVGltZTo6VG9QREZEYXRlVGltZVN0cmluZygpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZHRTdHI7Ci0gICAgY2hhciB0ZW1wU3RyWzMyXTsKLSAgICBtZW1zZXQodGVtcFN0ciwgMCwgc2l6ZW9mKHRlbXBTdHIpKTsKLSAgICBGWFNZU19zbnByaW50Zih0ZW1wU3RyLCBzaXplb2YodGVtcFN0cikgLSAxLCAiRDolMDRkJTAyZCUwMmQlMDJkJTAyZCUwMmQiLAotICAgICAgICAgICAgICAgICAgIGR0LnllYXIsIGR0Lm1vbnRoLCBkdC5kYXksIGR0LmhvdXIsIGR0Lm1pbnV0ZSwgZHQuc2Vjb25kKTsKLSAgICBkdFN0ciA9IENGWF9CeXRlU3RyaW5nKHRlbXBTdHIpOwotICAgIGlmIChkdC50ekhvdXIgPCAwKQotICAgICAgICBkdFN0ciArPSBDRlhfQnl0ZVN0cmluZygiLSIpOwotICAgIGVsc2UKLSAgICAgICAgZHRTdHIgKz0gQ0ZYX0J5dGVTdHJpbmcoIisiKTsKLSAgICBtZW1zZXQodGVtcFN0ciwgMCwgc2l6ZW9mKHRlbXBTdHIpKTsKLSAgICBGWFNZU19zbnByaW50Zih0ZW1wU3RyLCBzaXplb2YodGVtcFN0cikgLSAxLCAiJTAyZCclMDJkJyIsIGFicyhkdC50ekhvdXIpLCBkdC50ek1pbnV0ZSk7Ci0gICAgZHRTdHIgKz0gQ0ZYX0J5dGVTdHJpbmcodGVtcFN0cik7Ci0gICAgcmV0dXJuIGR0U3RyOwotfQotCi12b2lkIENQREZTREtfRGF0ZVRpbWU6OlRvU3lzdGVtVGltZShGWF9TWVNURU1USU1FJiBzdCkKLXsKLSAgICBDUERGU0RLX0RhdGVUaW1lIGR0ID0gKnRoaXM7Ci0gICAgdGltZV90IHQgPSAodGltZV90KWR0OwotICAgIHN0cnVjdCB0bSogcFRpbWUgPSBsb2NhbHRpbWUoJnQpOwotICAgIGlmKHBUaW1lKXsKLSAgICAgICAgc3Qud1llYXIgPSAoRlhfV09SRClwVGltZS0+dG1feWVhciArIDE5MDA7Ci0gICAgICAgIHN0LndNb250aCA9IChGWF9XT1JEKXBUaW1lLT50bV9tb24gKyAxOwotICAgICAgICBzdC53RGF5ID0gKEZYX1dPUkQpcFRpbWUtPnRtX21kYXk7Ci0gICAgICAgIHN0LndEYXlPZldlZWsgPSAoRlhfV09SRClwVGltZS0+dG1fd2RheTsKLSAgICAgICAgc3Qud0hvdXIgPSAoRlhfV09SRClwVGltZS0+dG1faG91cjsKLSAgICAgICAgc3Qud01pbnV0ZSA9IChGWF9XT1JEKXBUaW1lLT50bV9taW47Ci0gICAgICAgIHN0LndTZWNvbmQgPSAoRlhfV09SRClwVGltZS0+dG1fc2VjOwotICAgICAgICBzdC53TWlsbGlzZWNvbmRzID0gMDsKKyAgICAgIGR0LnR6SG91ciA9IDE7CisgICAgaiA9IDA7CisgICAgayA9IDA7CisgICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKKyAgICAgIGNoID0gZHRTdHJbaV07CisgICAgICBrID0gayAqIDEwICsgY2ggLSAnMCc7CisgICAgICBqKys7CisgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCisgICAgICAgIGJyZWFrOworICAgICAgaSsrOwogICAgIH0KKyAgICBkdC50ekhvdXIgKj0gKEZYX0NIQVIpazsKKyAgICBpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDIpCisgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICBjaCA9IGR0U3RyW2krK107CisgICAgaWYgKGNoICE9ICdcJycpCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgaiA9IDA7CisgICAgayA9IDA7CisgICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKKyAgICAgIGNoID0gZHRTdHJbaV07CisgICAgICBrID0gayAqIDEwICsgY2ggLSAnMCc7CisgICAgICBqKys7CisgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCisgICAgICAgIGJyZWFrOworICAgICAgaSsrOworICAgIH0KKyAgICBkdC50ek1pbnV0ZSA9ICh1aW50OF90KWs7CisgICAgaWYgKGkgPj0gc3RyTGVuZ3RoIHx8IGogPCAyKQorICAgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgcmV0dXJuICp0aGlzOwogfQogCi1DUERGU0RLX0RhdGVUaW1lIENQREZTREtfRGF0ZVRpbWU6OlRvR01UKCkKLXsKLSAgICBDUERGU0RLX0RhdGVUaW1lIGR0ID0gKnRoaXM7Ci0gICAgZHQuQWRkU2Vjb25kcygtX2dBZnhHZXRUaW1lWm9uZUluU2Vjb25kcyhkdC5kdC50ekhvdXIsIGR0LmR0LnR6TWludXRlKSk7Ci0gICAgZHQuZHQudHpIb3VyID0gMDsKLSAgICBkdC5kdC50ek1pbnV0ZSA9IDA7Ci0gICAgcmV0dXJuIGR0OworQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19EYXRlVGltZTo6VG9Db21tb25EYXRlVGltZVN0cmluZygpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyMTsKKyAgc3RyMS5Gb3JtYXQoIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkICIsIGR0LnllYXIsIGR0Lm1vbnRoLCBkdC5kYXksCisgICAgICAgICAgICAgIGR0LmhvdXIsIGR0Lm1pbnV0ZSwgZHQuc2Vjb25kKTsKKyAgaWYgKGR0LnR6SG91ciA8IDApCisgICAgc3RyMSArPSAiLSI7CisgIGVsc2UKKyAgICBzdHIxICs9ICIrIjsKKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyMjsKKyAgc3RyMi5Gb3JtYXQoIiUwMmQ6JTAyZCIsIGFicyhkdC50ekhvdXIpLCBkdC50ek1pbnV0ZSk7CisgIHJldHVybiBzdHIxICsgc3RyMjsKIH0KIAotQ1BERlNES19EYXRlVGltZSYgQ1BERlNES19EYXRlVGltZTo6QWRkRGF5cyhzaG9ydCBkYXlzKQotewotICAgIGlmIChkYXlzID09IDApIHJldHVybiAqdGhpczsKK0NGWF9CeXRlU3RyaW5nIENQREZTREtfRGF0ZVRpbWU6OlRvUERGRGF0ZVRpbWVTdHJpbmcoKSB7CisgIENGWF9CeXRlU3RyaW5nIGR0U3RyOworICBjaGFyIHRlbXBTdHJbMzJdOworICBtZW1zZXQodGVtcFN0ciwgMCwgc2l6ZW9mKHRlbXBTdHIpKTsKKyAgRlhTWVNfc25wcmludGYodGVtcFN0ciwgc2l6ZW9mKHRlbXBTdHIpIC0gMSwgIkQ6JTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwKKyAgICAgICAgICAgICAgICAgZHQueWVhciwgZHQubW9udGgsIGR0LmRheSwgZHQuaG91ciwgZHQubWludXRlLCBkdC5zZWNvbmQpOworICBkdFN0ciA9IENGWF9CeXRlU3RyaW5nKHRlbXBTdHIpOworICBpZiAoZHQudHpIb3VyIDwgMCkKKyAgICBkdFN0ciArPSBDRlhfQnl0ZVN0cmluZygiLSIpOworICBlbHNlCisgICAgZHRTdHIgKz0gQ0ZYX0J5dGVTdHJpbmcoIisiKTsKKyAgbWVtc2V0KHRlbXBTdHIsIDAsIHNpemVvZih0ZW1wU3RyKSk7CisgIEZYU1lTX3NucHJpbnRmKHRlbXBTdHIsIHNpemVvZih0ZW1wU3RyKSAtIDEsICIlMDJkJyUwMmQnIiwgYWJzKGR0LnR6SG91ciksCisgICAgICAgICAgICAgICAgIGR0LnR6TWludXRlKTsKKyAgZHRTdHIgKz0gQ0ZYX0J5dGVTdHJpbmcodGVtcFN0cik7CisgIHJldHVybiBkdFN0cjsKK30KIAotICAgIGludDE2X3QgeSA9IGR0LnllYXIsIHl5OwotICAgIHVpbnQ4X3QgICAgIG0gPSBkdC5tb250aDsKLSAgICB1aW50OF90ICAgICBkID0gZHQuZGF5OwotICAgIGludCAgICAgICAgIG1kYXlzLCB5ZGF5cywgbGRheXM7Cit2b2lkIENQREZTREtfRGF0ZVRpbWU6OlRvU3lzdGVtVGltZShGWF9TWVNURU1USU1FJiBzdCkgeworICBDUERGU0RLX0RhdGVUaW1lIGR0ID0gKnRoaXM7CisgIHRpbWVfdCB0ID0gKHRpbWVfdClkdDsKKyAgc3RydWN0IHRtKiBwVGltZSA9IGxvY2FsdGltZSgmdCk7CisgIGlmIChwVGltZSkgeworICAgIHN0LndZZWFyID0gKEZYX1dPUkQpcFRpbWUtPnRtX3llYXIgKyAxOTAwOworICAgIHN0LndNb250aCA9IChGWF9XT1JEKXBUaW1lLT50bV9tb24gKyAxOworICAgIHN0LndEYXkgPSAoRlhfV09SRClwVGltZS0+dG1fbWRheTsKKyAgICBzdC53RGF5T2ZXZWVrID0gKEZYX1dPUkQpcFRpbWUtPnRtX3dkYXk7CisgICAgc3Qud0hvdXIgPSAoRlhfV09SRClwVGltZS0+dG1faG91cjsKKyAgICBzdC53TWludXRlID0gKEZYX1dPUkQpcFRpbWUtPnRtX21pbjsKKyAgICBzdC53U2Vjb25kID0gKEZYX1dPUkQpcFRpbWUtPnRtX3NlYzsKKyAgICBzdC53TWlsbGlzZWNvbmRzID0gMDsKKyAgfQorfQogCi0gICAgbGRheXMgPSBkYXlzOwotICAgIGlmIChsZGF5cyA+IDApCi0gICAgewotICAgICAgICB5eSA9IHk7Ci0gICAgICAgIGlmICgoKEZYX1dPUkQpbSAqIDEwMCArIGQpID4gMzAwKSB5eSArKzsKLSAgICAgICAgeWRheXMgPSBfZ0FmeEdldFllYXJEYXlzKHl5KTsKLSAgICAgICAgd2hpbGUgKGxkYXlzID49IHlkYXlzKQotICAgICAgICB7Ci0gICAgICAgICAgICB5ICsrOwotICAgICAgICAgICAgbGRheXMgLT0geWRheXM7Ci0gICAgICAgICAgICB5eSArKzsKLSAgICAgICAgICAgIG1kYXlzID0gX2dBZnhHZXRNb250aERheXMoeSwgbSk7Ci0gICAgICAgICAgICBpZiAoZCA+IG1kYXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG0gKys7Ci0gICAgICAgICAgICAgICAgZCAtPSBtZGF5czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHlkYXlzID0gX2dBZnhHZXRZZWFyRGF5cyh5eSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWRheXMgPSBfZ0FmeEdldE1vbnRoRGF5cyh5LCBtKSAtIGQgKyAxOwotICAgICAgICB3aGlsZSAobGRheXMgPj0gbWRheXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxkYXlzIC09IG1kYXlzOwotICAgICAgICAgICAgbSArKzsKLSAgICAgICAgICAgIGQgPSAxOwotICAgICAgICAgICAgbWRheXMgPSBfZ0FmeEdldE1vbnRoRGF5cyh5LCBtKTsKLSAgICAgICAgfQotICAgICAgICBkICs9IGxkYXlzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBsZGF5cyAqPSAtMTsKLSAgICAgICAgeXkgPSB5OwotICAgICAgICBpZiAoKChGWF9XT1JEKW0gKiAxMDAgKyBkKSA8IDMwMCkgeXkgLS07Ci0gICAgICAgIHlkYXlzID0gX2dBZnhHZXRZZWFyRGF5cyh5eSk7Ci0gICAgICAgIHdoaWxlIChsZGF5cyA+PSB5ZGF5cykKLSAgICAgICAgewotICAgICAgICAgICAgeSAtLTsKLSAgICAgICAgICAgIGxkYXlzIC09IHlkYXlzOwotICAgICAgICAgICAgeXkgLS07Ci0gICAgICAgICAgICBtZGF5cyA9IF9nQWZ4R2V0TW9udGhEYXlzKHksIG0pOwotICAgICAgICAgICAgaWYgKGQgPiBtZGF5cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtICsrOwotICAgICAgICAgICAgICAgIGQgLT0gbWRheXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB5ZGF5cyA9IF9nQWZ4R2V0WWVhckRheXMoeXkpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChsZGF5cyA+PSBkKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZGF5cyAtPSBkOwotICAgICAgICAgICAgbSAtLTsKLSAgICAgICAgICAgIG1kYXlzID0gX2dBZnhHZXRNb250aERheXMoeSwgbSk7Ci0gICAgICAgICAgICBkID0gbWRheXM7Ci0gICAgICAgIH0KLSAgICAgICAgZCAtPSBsZGF5czsKLSAgICB9CitDUERGU0RLX0RhdGVUaW1lIENQREZTREtfRGF0ZVRpbWU6OlRvR01UKCkgeworICBDUERGU0RLX0RhdGVUaW1lIGR0ID0gKnRoaXM7CisgIGR0LkFkZFNlY29uZHMoLV9nQWZ4R2V0VGltZVpvbmVJblNlY29uZHMoZHQuZHQudHpIb3VyLCBkdC5kdC50ek1pbnV0ZSkpOworICBkdC5kdC50ekhvdXIgPSAwOworICBkdC5kdC50ek1pbnV0ZSA9IDA7CisgIHJldHVybiBkdDsKK30KIAotICAgIGR0LnllYXIgPSB5OwotICAgIGR0Lm1vbnRoID0gbTsKLSAgICBkdC5kYXkgPSBkOwotCitDUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpBZGREYXlzKHNob3J0IGRheXMpIHsKKyAgaWYgKGRheXMgPT0gMCkKICAgICByZXR1cm4gKnRoaXM7CisKKyAgaW50MTZfdCB5ID0gZHQueWVhciwgeXk7CisgIHVpbnQ4X3QgbSA9IGR0Lm1vbnRoOworICB1aW50OF90IGQgPSBkdC5kYXk7CisgIGludCBtZGF5cywgeWRheXMsIGxkYXlzOworCisgIGxkYXlzID0gZGF5czsKKyAgaWYgKGxkYXlzID4gMCkgeworICAgIHl5ID0geTsKKyAgICBpZiAoKChGWF9XT1JEKW0gKiAxMDAgKyBkKSA+IDMwMCkKKyAgICAgIHl5Kys7CisgICAgeWRheXMgPSBfZ0FmeEdldFllYXJEYXlzKHl5KTsKKyAgICB3aGlsZSAobGRheXMgPj0geWRheXMpIHsKKyAgICAgIHkrKzsKKyAgICAgIGxkYXlzIC09IHlkYXlzOworICAgICAgeXkrKzsKKyAgICAgIG1kYXlzID0gX2dBZnhHZXRNb250aERheXMoeSwgbSk7CisgICAgICBpZiAoZCA+IG1kYXlzKSB7CisgICAgICAgIG0rKzsKKyAgICAgICAgZCAtPSBtZGF5czsKKyAgICAgIH0KKyAgICAgIHlkYXlzID0gX2dBZnhHZXRZZWFyRGF5cyh5eSk7CisgICAgfQorICAgIG1kYXlzID0gX2dBZnhHZXRNb250aERheXMoeSwgbSkgLSBkICsgMTsKKyAgICB3aGlsZSAobGRheXMgPj0gbWRheXMpIHsKKyAgICAgIGxkYXlzIC09IG1kYXlzOworICAgICAgbSsrOworICAgICAgZCA9IDE7CisgICAgICBtZGF5cyA9IF9nQWZ4R2V0TW9udGhEYXlzKHksIG0pOworICAgIH0KKyAgICBkICs9IGxkYXlzOworICB9IGVsc2UgeworICAgIGxkYXlzICo9IC0xOworICAgIHl5ID0geTsKKyAgICBpZiAoKChGWF9XT1JEKW0gKiAxMDAgKyBkKSA8IDMwMCkKKyAgICAgIHl5LS07CisgICAgeWRheXMgPSBfZ0FmeEdldFllYXJEYXlzKHl5KTsKKyAgICB3aGlsZSAobGRheXMgPj0geWRheXMpIHsKKyAgICAgIHktLTsKKyAgICAgIGxkYXlzIC09IHlkYXlzOworICAgICAgeXktLTsKKyAgICAgIG1kYXlzID0gX2dBZnhHZXRNb250aERheXMoeSwgbSk7CisgICAgICBpZiAoZCA+IG1kYXlzKSB7CisgICAgICAgIG0rKzsKKyAgICAgICAgZCAtPSBtZGF5czsKKyAgICAgIH0KKyAgICAgIHlkYXlzID0gX2dBZnhHZXRZZWFyRGF5cyh5eSk7CisgICAgfQorICAgIHdoaWxlIChsZGF5cyA+PSBkKSB7CisgICAgICBsZGF5cyAtPSBkOworICAgICAgbS0tOworICAgICAgbWRheXMgPSBfZ0FmeEdldE1vbnRoRGF5cyh5LCBtKTsKKyAgICAgIGQgPSBtZGF5czsKKyAgICB9CisgICAgZCAtPSBsZGF5czsKKyAgfQorCisgIGR0LnllYXIgPSB5OworICBkdC5tb250aCA9IG07CisgIGR0LmRheSA9IGQ7CisKKyAgcmV0dXJuICp0aGlzOwogfQogCi1DUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpBZGRTZWNvbmRzKGludCBzZWNvbmRzKQotewotICAgIGlmIChzZWNvbmRzID09IDApIHJldHVybiAqdGhpczsKLQotICAgIGludCBuOwotICAgIGludCBkYXlzOwotCi0gICAgbiA9IGR0LmhvdXIgKiAzNjAwICsgZHQubWludXRlICogNjAgKyBkdC5zZWNvbmQgKyBzZWNvbmRzOwotICAgIGlmIChuIDwgMCkKLSAgICB7Ci0gICAgICAgIGRheXMgPSAobiAtIDg2Mzk5KSAvIDg2NDAwOwotICAgICAgICBuIC09IGRheXMgKiA4NjQwMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZGF5cyA9IG4gLyA4NjQwMDsKLSAgICAgICAgbiAlPSA4NjQwMDsKLSAgICB9Ci0gICAgZHQuaG91ciA9ICh1aW50OF90KShuIC8gMzYwMCk7Ci0gICAgZHQuaG91ciAlPSAyNDsKLSAgICBuICU9IDM2MDA7Ci0gICAgZHQubWludXRlID0gKHVpbnQ4X3QpKG4gLyA2MCk7Ci0gICAgZHQuc2Vjb25kID0gKHVpbnQ4X3QpKG4gJSA2MCk7Ci0gICAgaWYgKGRheXMgIT0gMCkgQWRkRGF5cyhkYXlzKTsKLQorQ1BERlNES19EYXRlVGltZSYgQ1BERlNES19EYXRlVGltZTo6QWRkU2Vjb25kcyhpbnQgc2Vjb25kcykgeworICBpZiAoc2Vjb25kcyA9PSAwKQogICAgIHJldHVybiAqdGhpczsKLX0KIAorICBpbnQgbjsKKyAgaW50IGRheXM7CisKKyAgbiA9IGR0LmhvdXIgKiAzNjAwICsgZHQubWludXRlICogNjAgKyBkdC5zZWNvbmQgKyBzZWNvbmRzOworICBpZiAobiA8IDApIHsKKyAgICBkYXlzID0gKG4gLSA4NjM5OSkgLyA4NjQwMDsKKyAgICBuIC09IGRheXMgKiA4NjQwMDsKKyAgfSBlbHNlIHsKKyAgICBkYXlzID0gbiAvIDg2NDAwOworICAgIG4gJT0gODY0MDA7CisgIH0KKyAgZHQuaG91ciA9ICh1aW50OF90KShuIC8gMzYwMCk7CisgIGR0LmhvdXIgJT0gMjQ7CisgIG4gJT0gMzYwMDsKKyAgZHQubWludXRlID0gKHVpbnQ4X3QpKG4gLyA2MCk7CisgIGR0LnNlY29uZCA9ICh1aW50OF90KShuICUgNjApOworICBpZiAoZGF5cyAhPSAwKQorICAgIEFkZERheXMoZGF5cyk7CisKKyAgcmV0dXJuICp0aGlzOworfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90CiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ1BERlNES19Bbm5vdDo6Q1BERlNES19Bbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIDoKLW1fcFBhZ2VWaWV3KHBQYWdlVmlldyksCi1tX2JTZWxlY3RlZChGQUxTRSksCi1tX25UYWJPcmRlcigtMSkKLXsKK0NQREZTREtfQW5ub3Q6OkNQREZTREtfQW5ub3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorICAgIDogbV9wUGFnZVZpZXcocFBhZ2VWaWV3KSwgbV9iU2VsZWN0ZWQoRkFMU0UpLCBtX25UYWJPcmRlcigtMSkge30KKworLy8gQ1BERlNES19CQUFubm90CitDUERGU0RLX0JBQW5ub3Q6OkNQREZTREtfQkFBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCisgICAgOiBDUERGU0RLX0Fubm90KHBQYWdlVmlldyksIG1fcEFubm90KHBBbm5vdCkge30KKworQ1BERlNES19CQUFubm90Ojp+Q1BERlNES19CQUFubm90KCkgeworICBtX3BBbm5vdCA9IE5VTEw7CiB9CiAKLQotLy9DUERGU0RLX0JBQW5ub3QKLUNQREZTREtfQkFBbm5vdDo6Q1BERlNES19CQUFubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSA6Ci0gICAgQ1BERlNES19Bbm5vdChwUGFnZVZpZXcpLAotICAgICAgICBtX3BBbm5vdChwQW5ub3QpCi17CitDUERGX0Fubm90KiBDUERGU0RLX0JBQW5ub3Q6OkdldFBERkFubm90KCkgeworICByZXR1cm4gbV9wQW5ub3Q7CiB9CiAKLUNQREZTREtfQkFBbm5vdDo6fkNQREZTREtfQkFBbm5vdCgpCi17Ci0gICAgbV9wQW5ub3QgPSBOVUxMOworRlhfQk9PTCBDUERGU0RLX0Fubm90OjpJc1NlbGVjdGVkKCkgeworICByZXR1cm4gbV9iU2VsZWN0ZWQ7CiB9CiAKLUNQREZfQW5ub3QqIENQREZTREtfQkFBbm5vdDo6R2V0UERGQW5ub3QoKQotewotICAgIHJldHVybiBtX3BBbm5vdDsKLX0KLQotRlhfQk9PTCBDUERGU0RLX0Fubm90OjpJc1NlbGVjdGVkKCkKLXsKLSAgICByZXR1cm4gbV9iU2VsZWN0ZWQ7Ci19Ci0KLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0U2VsZWN0ZWQoRlhfQk9PTCBiU2VsZWN0ZWQpCi17Ci0gICAgbV9iU2VsZWN0ZWQgPSBiU2VsZWN0ZWQ7Cit2b2lkIENQREZTREtfQW5ub3Q6OlNldFNlbGVjdGVkKEZYX0JPT0wgYlNlbGVjdGVkKSB7CisgIG1fYlNlbGVjdGVkID0gYlNlbGVjdGVkOwogfQogCiAvLyBUYWIgT3JkZXIKLWludCBDUERGU0RLX0Fubm90OjpHZXRUYWJPcmRlcigpCi17Ci0gICAgcmV0dXJuIG1fblRhYk9yZGVyOworaW50IENQREZTREtfQW5ub3Q6OkdldFRhYk9yZGVyKCkgeworICByZXR1cm4gbV9uVGFiT3JkZXI7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0VGFiT3JkZXIoaW50IGlUYWJPcmRlcikKLXsKLSAgICBtX25UYWJPcmRlciA9IGlUYWJPcmRlcjsKK3ZvaWQgQ1BERlNES19Bbm5vdDo6U2V0VGFiT3JkZXIoaW50IGlUYWJPcmRlcikgeworICBtX25UYWJPcmRlciA9IGlUYWJPcmRlcjsKIH0KIAotQ1BERl9EaWN0aW9uYXJ5KiBDUERGU0RLX0JBQW5ub3Q6OkdldEFubm90RGljdCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOworQ1BERl9EaWN0aW9uYXJ5KiBDUERGU0RLX0JBQW5ub3Q6OkdldEFubm90RGljdCgpIGNvbnN0IHsKKyAgQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCi0gICAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKTsKKyAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKTsKIH0KIAotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KQotewotICAgIEFTU0VSVChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0ID49IEdldE1pbldpZHRoKCkpOwotICAgIEFTU0VSVChyZWN0LnRvcCAtIHJlY3QuYm90dG9tID49IEdldE1pbkhlaWdodCgpKTsKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICBBU1NFUlQocmVjdC5yaWdodCAtIHJlY3QubGVmdCA+PSBHZXRNaW5XaWR0aCgpKTsKKyAgQVNTRVJUKHJlY3QudG9wIC0gcmVjdC5ib3R0b20gPj0gR2V0TWluSGVpZ2h0KCkpOwogCi0gICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdFJlY3QoIlJlY3QiLCByZWN0KTsKKyAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdFJlY3QoIlJlY3QiLCByZWN0KTsKIH0KIAotQ1BERl9SZWN0IENQREZTREtfQkFBbm5vdDo6R2V0UmVjdCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOworQ1BERl9SZWN0IENQREZTREtfQkFBbm5vdDo6R2V0UmVjdCgpIGNvbnN0IHsKKyAgQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwogCi0gICAgQ1BERl9SZWN0IHJlY3Q7Ci0gICAgbV9wQW5ub3QtPkdldFJlY3QocmVjdCk7CisgIENQREZfUmVjdCByZWN0OworICBtX3BBbm5vdC0+R2V0UmVjdChyZWN0KTsKIAotICAgIHJldHVybiByZWN0OworICByZXR1cm4gcmVjdDsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19CQUFubm90OjpHZXRUeXBlKCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7CitDRlhfQnl0ZVN0cmluZyBDUERGU0RLX0JBQW5ub3Q6OkdldFR5cGUoKSBjb25zdCB7CisgIEFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKIAotICAgIHJldHVybiBtX3BBbm5vdC0+R2V0U3ViVHlwZSgpOworICByZXR1cm4gbV9wQW5ub3QtPkdldFN1YlR5cGUoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19CQUFubm90OjpHZXRTdWJUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIiI7CitDRlhfQnl0ZVN0cmluZyBDUERGU0RLX0JBQW5ub3Q6OkdldFN1YlR5cGUoKSBjb25zdCB7CisgIHJldHVybiAiIjsKIH0KIAotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OlJlc2V0QXBwZWFyYW5jZSgpCi17Ci0gICAgQVNTRVJUKEZBTFNFKTsKK3ZvaWQgQ1BERlNES19CQUFubm90OjpSZXNldEFwcGVhcmFuY2UoKSB7CisgIEFTU0VSVChGQUxTRSk7CiB9CiAKLXZvaWQgQ1BERlNES19CQUFubm90OjpEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQotewotICAgIEFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKLSAgICBBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6RHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworICBBU1NFUlQobV9wUGFnZVZpZXcgIT0gTlVMTCk7CisgIEFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKIAotICAgIG1fcEFubm90LT5EcmF3QXBwZWFyYW5jZShtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpLCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1vZGUsIHBPcHRpb25zKTsKKyAgbV9wQW5ub3QtPkRyYXdBcHBlYXJhbmNlKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIHBEZXZpY2UsIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsIHBPcHRpb25zKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JBQW5ub3Q6OklzQXBwZWFyYW5jZVZhbGlkKCkKLXsKLSAgICByZXR1cm4gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJBUCIpICE9IE5VTEw7CitGWF9CT09MIENQREZTREtfQkFBbm5vdDo6SXNBcHBlYXJhbmNlVmFsaWQoKSB7CisgIHJldHVybiBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFQIikgIT0gTlVMTDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JBQW5ub3Q6OklzQXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFQIik7Ci0gICAgaWYgKHBBUCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfQkFBbm5vdDo6SXNBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBBUCA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQVAiKTsKKyAgaWYgKHBBUCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKIAotICAgIC8vIENob29zZSB0aGUgcmlnaHQgc3ViLWFwCi0gICAgY29uc3QgRlhfQ0hBUiogYXBfZW50cnkgPSAiTiI7Ci0gICAgaWYgKG1vZGUgPT0gQ1BERl9Bbm5vdDo6RG93bikKLSAgICAgICAgYXBfZW50cnkgPSAiRCI7Ci0gICAgZWxzZSBpZiAobW9kZSA9PSBDUERGX0Fubm90OjpSb2xsb3ZlcikKLSAgICAgICAgYXBfZW50cnkgPSAiUiI7Ci0gICAgaWYgKCFwQVAtPktleUV4aXN0KGFwX2VudHJ5KSkKLSAgICAgICAgYXBfZW50cnkgPSAiTiI7CisgIC8vIENob29zZSB0aGUgcmlnaHQgc3ViLWFwCisgIGNvbnN0IEZYX0NIQVIqIGFwX2VudHJ5ID0gIk4iOworICBpZiAobW9kZSA9PSBDUERGX0Fubm90OjpEb3duKQorICAgIGFwX2VudHJ5ID0gIkQiOworICBlbHNlIGlmIChtb2RlID09IENQREZfQW5ub3Q6OlJvbGxvdmVyKQorICAgIGFwX2VudHJ5ID0gIlIiOworICBpZiAoIXBBUC0+S2V5RXhpc3QoYXBfZW50cnkpKQorICAgIGFwX2VudHJ5ID0gIk4iOwogCi0gICAgLy8gR2V0IHRoZSBBUCBzdHJlYW0gb3Igc3ViZGlyZWN0b3J5Ci0gICAgQ1BERl9PYmplY3QqIHBzdWIgPSBwQVAtPkdldEVsZW1lbnRWYWx1ZShhcF9lbnRyeSk7Ci0gICAgaWYgKHBzdWIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAvLyBHZXQgdGhlIEFQIHN0cmVhbSBvciBzdWJkaXJlY3RvcnkKKyAgQ1BERl9PYmplY3QqIHBzdWIgPSBwQVAtPkdldEVsZW1lbnRWYWx1ZShhcF9lbnRyeSk7CisgIGlmIChwc3ViID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIENQREZTREtfQkFBbm5vdDo6RHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKLXsKLSAgICBBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0gICAgbV9wQW5ub3QtPkRyYXdCb3JkZXIocERldmljZSwgcFVzZXIyRGV2aWNlLCBwT3B0aW9ucyk7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6RHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHsKKyAgQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOworICBtX3BBbm5vdC0+RHJhd0JvcmRlcihwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHBPcHRpb25zKTsKIH0KIAotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OkNsZWFyQ2FjaGVkQVAoKQotewotICAgIEFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLSAgICBtX3BBbm5vdC0+Q2xlYXJDYWNoZWRBUCgpOwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OkNsZWFyQ2FjaGVkQVAoKSB7CisgIEFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKKyAgbV9wQW5ub3QtPkNsZWFyQ2FjaGVkQVAoKTsKIH0KIAotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpCi17Ci0gICAgaWYgKHNDb250ZW50cy5Jc0VtcHR5KCkpCi0gICAgICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+UmVtb3ZlQXQoIkNvbnRlbnRzIik7Ci0gICAgZWxzZQotICAgICAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0U3RyaW5nKCJDb250ZW50cyIsIFBERl9FbmNvZGVUZXh0KHNDb250ZW50cykpOwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpIHsKKyAgaWYgKHNDb250ZW50cy5Jc0VtcHR5KCkpCisgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5SZW1vdmVBdCgiQ29udGVudHMiKTsKKyAgZWxzZQorICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+U2V0QXRTdHJpbmcoIkNvbnRlbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERl9FbmNvZGVUZXh0KHNDb250ZW50cykpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX0JBQW5ub3Q6OkdldENvbnRlbnRzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRVbmljb2RlVGV4dCgiQ29udGVudHMiKTsKK0NGWF9XaWRlU3RyaW5nIENQREZTREtfQkFBbm5vdDo6R2V0Q29udGVudHMoKSBjb25zdCB7CisgIHJldHVybiBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldFVuaWNvZGVUZXh0KCJDb250ZW50cyIpOwogfQogCi12b2lkIENQREZTREtfQkFBbm5vdDo6U2V0QW5ub3ROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkKLXsKLSAgICBpZiAoc05hbWUuSXNFbXB0eSgpKQotICAgICAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUF0KCJOTSIpOwotICAgIGVsc2UKLSAgICAgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdFN0cmluZygiTk0iLCBQREZfRW5jb2RlVGV4dChzTmFtZSkpOwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEFubm90TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpIHsKKyAgaWYgKHNOYW1lLklzRW1wdHkoKSkKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUF0KCJOTSIpOworICBlbHNlCisgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdFN0cmluZygiTk0iLCBQREZfRW5jb2RlVGV4dChzTmFtZSkpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX0JBQW5ub3Q6OkdldEFubm90TmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0VW5pY29kZVRleHQoIk5NIik7CitDRlhfV2lkZVN0cmluZyBDUERGU0RLX0JBQW5ub3Q6OkdldEFubm90TmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0VW5pY29kZVRleHQoIk5NIik7CiB9CiAKLXZvaWQgQ1BERlNES19CQUFubm90OjpTZXRNb2RpZmllZERhdGUoY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpCi17Ci0gICAgQ1BERlNES19EYXRlVGltZSBkdChzdCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gZHQuVG9QREZEYXRlVGltZVN0cmluZygpOwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldE1vZGlmaWVkRGF0ZShjb25zdCBGWF9TWVNURU1USU1FJiBzdCkgeworICBDUERGU0RLX0RhdGVUaW1lIGR0KHN0KTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gZHQuVG9QREZEYXRlVGltZVN0cmluZygpOwogCi0gICAgaWYgKHN0ci5Jc0VtcHR5KCkpCi0gICAgICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+UmVtb3ZlQXQoIk0iKTsKLSAgICBlbHNlCi0gICAgICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+U2V0QXRTdHJpbmcoIk0iLCBzdHIpOworICBpZiAoc3RyLklzRW1wdHkoKSkKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUF0KCJNIik7CisgIGVsc2UKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0U3RyaW5nKCJNIiwgc3RyKTsKIH0KIAotRlhfU1lTVEVNVElNRSBDUERGU0RLX0JBQW5ub3Q6OkdldE1vZGlmaWVkRGF0ZSgpIGNvbnN0Ci17Ci0gICAgRlhfU1lTVEVNVElNRSBzeXN0aW1lOwotICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0U3RyaW5nKCJNIik7CitGWF9TWVNURU1USU1FIENQREZTREtfQkFBbm5vdDo6R2V0TW9kaWZpZWREYXRlKCkgY29uc3QgeworICBGWF9TWVNURU1USU1FIHN5c3RpbWU7CisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0U3RyaW5nKCJNIik7CiAKLSAgICBDUERGU0RLX0RhdGVUaW1lIGR0KHN0cik7Ci0gICAgZHQuVG9TeXN0ZW1UaW1lKHN5c3RpbWUpOworICBDUERGU0RLX0RhdGVUaW1lIGR0KHN0cik7CisgIGR0LlRvU3lzdGVtVGltZShzeXN0aW1lKTsKIAotICAgIHJldHVybiBzeXN0aW1lOworICByZXR1cm4gc3lzdGltZTsKIH0KIAotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEZsYWdzKGludCBuRmxhZ3MpCi17Ci0gICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdEludGVnZXIoIkYiLCBuRmxhZ3MpOwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEZsYWdzKGludCBuRmxhZ3MpIHsKKyAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdEludGVnZXIoIkYiLCBuRmxhZ3MpOwogfQogCi1pbnQgQ1BERlNES19CQUFubm90OjpHZXRGbGFncygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0SW50ZWdlcigiRiIpOworaW50IENQREZTREtfQkFBbm5vdDo6R2V0RmxhZ3MoKSBjb25zdCB7CisgIHJldHVybiBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldEludGVnZXIoIkYiKTsKIH0KIAotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEFwcFN0YXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpCi17Ci0gICAgaWYgKHN0ci5Jc0VtcHR5KCkpCi0gICAgICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+UmVtb3ZlQXQoIkFTIik7Ci0gICAgZWxzZQotICAgICAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0U3RyaW5nKCJBUyIsIHN0cik7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6U2V0QXBwU3RhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgeworICBpZiAoc3RyLklzRW1wdHkoKSkKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUF0KCJBUyIpOworICBlbHNlCisgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdFN0cmluZygiQVMiLCBzdHIpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGU0RLX0JBQW5ub3Q6OkdldEFwcFN0YXRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRTdHJpbmcoIkFTIik7CitDRlhfQnl0ZVN0cmluZyBDUERGU0RLX0JBQW5ub3Q6OkdldEFwcFN0YXRlKCkgY29uc3QgeworICByZXR1cm4gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRTdHJpbmcoIkFTIik7CiB9CiAKLXZvaWQgQ1BERlNES19CQUFubm90OjpTZXRTdHJ1Y3RQYXJlbnQoaW50IGtleSkKLXsKLSAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0SW50ZWdlcigiU3RydWN0UGFyZW50Iiwga2V5KTsKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRTdHJ1Y3RQYXJlbnQoaW50IGtleSkgeworICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0SW50ZWdlcigiU3RydWN0UGFyZW50Iiwga2V5KTsKIH0KIAotaW50IENQREZTREtfQkFBbm5vdDo6R2V0U3RydWN0UGFyZW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRJbnRlZ2VyKCJTdHJ1Y3RQYXJlbnQiKTsKK2ludCBDUERGU0RLX0JBQW5ub3Q6OkdldFN0cnVjdFBhcmVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0SW50ZWdlcigiU3RydWN0UGFyZW50Iik7CiB9CiAKLS8vYm9yZGVyCi12b2lkIENQREZTREtfQkFBbm5vdDo6U2V0Qm9yZGVyV2lkdGgoaW50IG5XaWR0aCkKLXsKLSAgICBDUERGX0FycmF5KiBwQm9yZGVyID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRBcnJheSgiQm9yZGVyIik7CisvLyBib3JkZXIKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRCb3JkZXJXaWR0aChpbnQgbldpZHRoKSB7CisgIENQREZfQXJyYXkqIHBCb3JkZXIgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldEFycmF5KCJCb3JkZXIiKTsKIAotICAgIGlmIChwQm9yZGVyKQotICAgIHsKLSAgICAgICAgcEJvcmRlci0+U2V0QXQoMiwgRlhfTkVXIENQREZfTnVtYmVyKG5XaWR0aCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBCU0RpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkJTIik7Ci0KLSAgICAgICAgaWYgKCFwQlNEaWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBwQlNEaWN0ID0gRlhfTkVXIENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+U2V0QXQoIkJTIiwgcEJTRGljdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwQlNEaWN0LT5TZXRBdEludGVnZXIoIlciLCBuV2lkdGgpOwotICAgIH0KLX0KLQotaW50IENQREZTREtfQkFBbm5vdDo6R2V0Qm9yZGVyV2lkdGgoKSBjb25zdAotewotICAgIGlmIChDUERGX0FycmF5KiBwQm9yZGVyID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRBcnJheSgiQm9yZGVyIikpIHsKLSAgICAgICAgcmV0dXJuIHBCb3JkZXItPkdldEludGVnZXIoMik7Ci0gICAgfQotICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBCU0RpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkJTIikpIHsKLSAgICAgICAgcmV0dXJuIHBCU0RpY3QtPkdldEludGVnZXIoIlciLCAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgQ1BERlNES19CQUFubm90OjpTZXRCb3JkZXJTdHlsZShpbnQgblN0eWxlKQoteworICBpZiAocEJvcmRlcikgeworICAgIHBCb3JkZXItPlNldEF0KDIsIEZYX05FVyBDUERGX051bWJlcihuV2lkdGgpKTsKKyAgfSBlbHNlIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBCU0RpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkJTIik7Ci0gICAgaWYgKCFwQlNEaWN0KQotICAgIHsKLSAgICAgICAgcEJTRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+U2V0QXQoIkJTIiwgcEJTRGljdCk7CisKKyAgICBpZiAoIXBCU0RpY3QpIHsKKyAgICAgIHBCU0RpY3QgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OworICAgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdCgiQlMiLCBwQlNEaWN0KTsKICAgICB9CiAKLSAgICBzd2l0Y2ggKG5TdHlsZSkKLSAgICB7CisgICAgcEJTRGljdC0+U2V0QXRJbnRlZ2VyKCJXIiwgbldpZHRoKTsKKyAgfQorfQorCitpbnQgQ1BERlNES19CQUFubm90OjpHZXRCb3JkZXJXaWR0aCgpIGNvbnN0IHsKKyAgaWYgKENQREZfQXJyYXkqIHBCb3JkZXIgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldEFycmF5KCJCb3JkZXIiKSkgeworICAgIHJldHVybiBwQm9yZGVyLT5HZXRJbnRlZ2VyKDIpOworICB9CisgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBCU0RpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkJTIikpIHsKKyAgICByZXR1cm4gcEJTRGljdC0+R2V0SW50ZWdlcigiVyIsIDEpOworICB9CisgIHJldHVybiAxOworfQorCit2b2lkIENQREZTREtfQkFBbm5vdDo6U2V0Qm9yZGVyU3R5bGUoaW50IG5TdHlsZSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBCU0RpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkJTIik7CisgIGlmICghcEJTRGljdCkgeworICAgIHBCU0RpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+U2V0QXQoIkJTIiwgcEJTRGljdCk7CisgIH0KKworICBzd2l0Y2ggKG5TdHlsZSkgewogICAgIGNhc2UgQkJTX1NPTElEOgotICAgICAgICBwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiUyIpOwotICAgICAgICBicmVhazsKKyAgICAgIHBCU0RpY3QtPlNldEF0TmFtZSgiUyIsICJTIik7CisgICAgICBicmVhazsKICAgICBjYXNlIEJCU19EQVNIOgotICAgICAgICBwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiRCIpOwotICAgICAgICBicmVhazsKKyAgICAgIHBCU0RpY3QtPlNldEF0TmFtZSgiUyIsICJEIik7CisgICAgICBicmVhazsKICAgICBjYXNlIEJCU19CRVZFTEVEOgotICAgICAgICBwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiQiIpOwotICAgICAgICBicmVhazsKKyAgICAgIHBCU0RpY3QtPlNldEF0TmFtZSgiUyIsICJCIik7CisgICAgICBicmVhazsKICAgICBjYXNlIEJCU19JTlNFVDoKLSAgICAgICAgcEJTRGljdC0+U2V0QXROYW1lKCJTIiwgIkkiKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiSSIpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBCQlNfVU5ERVJMSU5FOgotICAgICAgICBwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiVSIpOwotICAgICAgICBicmVhazsKLSAgICB9CisgICAgICBwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiVSIpOworICAgICAgYnJlYWs7CisgIH0KIH0KIAotaW50IENQREZTREtfQkFBbm5vdDo6R2V0Qm9yZGVyU3R5bGUoKSBjb25zdAoteworaW50IENQREZTREtfQkFBbm5vdDo6R2V0Qm9yZGVyU3R5bGUoKSBjb25zdCB7CisgIENQREZfRGljdGlvbmFyeSogcEJTRGljdCA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQlMiKTsKKyAgaWYgKHBCU0RpY3QpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzQm9yZGVyU3R5bGUgPSBwQlNEaWN0LT5HZXRTdHJpbmcoIlMiLCAiUyIpOworICAgIGlmIChzQm9yZGVyU3R5bGUgPT0gIlMiKQorICAgICAgcmV0dXJuIEJCU19TT0xJRDsKKyAgICBpZiAoc0JvcmRlclN0eWxlID09ICJEIikKKyAgICAgIHJldHVybiBCQlNfREFTSDsKKyAgICBpZiAoc0JvcmRlclN0eWxlID09ICJCIikKKyAgICAgIHJldHVybiBCQlNfQkVWRUxFRDsKKyAgICBpZiAoc0JvcmRlclN0eWxlID09ICJJIikKKyAgICAgIHJldHVybiBCQlNfSU5TRVQ7CisgICAgaWYgKHNCb3JkZXJTdHlsZSA9PSAiVSIpCisgICAgICByZXR1cm4gQkJTX1VOREVSTElORTsKKyAgfQorCisgIENQREZfQXJyYXkqIHBCb3JkZXIgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldEFycmF5KCJCb3JkZXIiKTsKKyAgaWYgKHBCb3JkZXIpIHsKKyAgICBpZiAocEJvcmRlci0+R2V0Q291bnQoKSA+PSA0KSB7CisgICAgICBDUERGX0FycmF5KiBwRFAgPSBwQm9yZGVyLT5HZXRBcnJheSgzKTsKKyAgICAgIGlmIChwRFAgJiYgcERQLT5HZXRDb3VudCgpID4gMCkKKyAgICAgICAgcmV0dXJuIEJCU19EQVNIOworICAgIH0KKyAgfQorCisgIHJldHVybiBCQlNfU09MSUQ7Cit9CisKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRCb3JkZXJEYXNoKGNvbnN0IENGWF9JbnRBcnJheSYgYXJyYXkpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQlNEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJCUyIpOworICBpZiAoIXBCU0RpY3QpIHsKKyAgICBwQlNEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0KCJCUyIsIHBCU0RpY3QpOworICB9CisKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gRlhfTkVXIENQREZfQXJyYXk7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IGFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBwQXJyYXktPkFkZEludGVnZXIoYXJyYXlbaV0pOworICB9CisKKyAgcEJTRGljdC0+U2V0QXQoIkQiLCBwQXJyYXkpOworfQorCit2b2lkIENQREZTREtfQkFBbm5vdDo6R2V0Qm9yZGVyRGFzaChDRlhfSW50QXJyYXkmIGFycmF5KSBjb25zdCB7CisgIENQREZfQXJyYXkqIHBEYXNoID0gTlVMTDsKKworICBDUERGX0FycmF5KiBwQm9yZGVyID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRBcnJheSgiQm9yZGVyIik7CisgIGlmIChwQm9yZGVyKSB7CisgICAgcERhc2ggPSBwQm9yZGVyLT5HZXRBcnJheSgzKTsKKyAgfSBlbHNlIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBCU0RpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkJTIik7Ci0gICAgaWYgKHBCU0RpY3QpCi0gICAgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzQm9yZGVyU3R5bGUgPSBwQlNEaWN0LT5HZXRTdHJpbmcoIlMiLCAiUyIpOwotICAgICAgICBpZiAoc0JvcmRlclN0eWxlID09ICJTIikgcmV0dXJuIEJCU19TT0xJRDsKLSAgICAgICAgaWYgKHNCb3JkZXJTdHlsZSA9PSAiRCIpIHJldHVybiBCQlNfREFTSDsKLSAgICAgICAgaWYgKHNCb3JkZXJTdHlsZSA9PSAiQiIpIHJldHVybiBCQlNfQkVWRUxFRDsKLSAgICAgICAgaWYgKHNCb3JkZXJTdHlsZSA9PSAiSSIpIHJldHVybiBCQlNfSU5TRVQ7Ci0gICAgICAgIGlmIChzQm9yZGVyU3R5bGUgPT0gIlUiKSByZXR1cm4gQkJTX1VOREVSTElORTsKKyAgICBpZiAocEJTRGljdCkgeworICAgICAgcERhc2ggPSBwQlNEaWN0LT5HZXRBcnJheSgiRCIpOworICAgIH0KKyAgfQorCisgIGlmIChwRGFzaCkgeworICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBEYXNoLT5HZXRDb3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgICAgYXJyYXkuQWRkKHBEYXNoLT5HZXRJbnRlZ2VyKGkpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldENvbG9yKEZYX0NPTE9SUkVGIGNvbG9yKSB7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OworICBwQXJyYXktPkFkZE51bWJlcigoRlhfRkxPQVQpRlhTWVNfR2V0UlZhbHVlKGNvbG9yKSAvIDI1NS4wZik7CisgIHBBcnJheS0+QWRkTnVtYmVyKChGWF9GTE9BVClGWFNZU19HZXRHVmFsdWUoY29sb3IpIC8gMjU1LjBmKTsKKyAgcEFycmF5LT5BZGROdW1iZXIoKEZYX0ZMT0FUKUZYU1lTX0dldEJWYWx1ZShjb2xvcikgLyAyNTUuMGYpOworICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0KCJDIiwgcEFycmF5KTsKK30KKwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlJlbW92ZUNvbG9yKCkgeworICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUF0KCJDIik7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19CQUFubm90OjpHZXRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0IHsKKyAgaWYgKENQREZfQXJyYXkqIHBFbnRyeSA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0QXJyYXkoIkMiKSkgeworICAgIGludCBuQ291bnQgPSBwRW50cnktPkdldENvdW50KCk7CisgICAgaWYgKG5Db3VudCA9PSAxKSB7CisgICAgICBGWF9GTE9BVCBnID0gcEVudHJ5LT5HZXROdW1iZXIoMCkgKiAyNTU7CisKKyAgICAgIGNvbG9yID0gRlhTWVNfUkdCKChpbnQpZywgKGludClnLCAoaW50KWcpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9IGVsc2UgaWYgKG5Db3VudCA9PSAzKSB7CisgICAgICBGWF9GTE9BVCByID0gcEVudHJ5LT5HZXROdW1iZXIoMCkgKiAyNTU7CisgICAgICBGWF9GTE9BVCBnID0gcEVudHJ5LT5HZXROdW1iZXIoMSkgKiAyNTU7CisgICAgICBGWF9GTE9BVCBiID0gcEVudHJ5LT5HZXROdW1iZXIoMikgKiAyNTU7CisKKyAgICAgIGNvbG9yID0gRlhTWVNfUkdCKChpbnQpciwgKGludClnLCAoaW50KWIpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9IGVsc2UgaWYgKG5Db3VudCA9PSA0KSB7CisgICAgICBGWF9GTE9BVCBjID0gcEVudHJ5LT5HZXROdW1iZXIoMCk7CisgICAgICBGWF9GTE9BVCBtID0gcEVudHJ5LT5HZXROdW1iZXIoMSk7CisgICAgICBGWF9GTE9BVCB5ID0gcEVudHJ5LT5HZXROdW1iZXIoMik7CisgICAgICBGWF9GTE9BVCBrID0gcEVudHJ5LT5HZXROdW1iZXIoMyk7CisKKyAgICAgIEZYX0ZMT0FUIHIgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIGMgKyBrKTsKKyAgICAgIEZYX0ZMT0FUIGcgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIG0gKyBrKTsKKyAgICAgIEZYX0ZMT0FUIGIgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIHkgKyBrKTsKKworICAgICAgY29sb3IgPSBGWFNZU19SR0IoKGludCkociAqIDI1NSksIChpbnQpKGcgKiAyNTUpLCAoaW50KShiICogMjU1KSk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OldyaXRlQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQ29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBTdGF0ZSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBBUERpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFQIik7CisKKyAgaWYgKCFwQVBEaWN0KSB7CisgICAgcEFQRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdCgiQVAiLCBwQVBEaWN0KTsKKyAgfQorCisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gTlVMTDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50RGljdCA9IE5VTEw7CisKKyAgaWYgKHNBUFN0YXRlLklzRW1wdHkoKSkgeworICAgIHBQYXJlbnREaWN0ID0gcEFQRGljdDsKKyAgICBwU3RyZWFtID0gcEFQRGljdC0+R2V0U3RyZWFtKHNBUFR5cGUpOworICB9IGVsc2UgeworICAgIENQREZfRGljdGlvbmFyeSogcEFQVHlwZURpY3QgPSBwQVBEaWN0LT5HZXREaWN0KHNBUFR5cGUpOworICAgIGlmICghcEFQVHlwZURpY3QpIHsKKyAgICAgIHBBUFR5cGVEaWN0ID0gRlhfTkVXIENQREZfRGljdGlvbmFyeTsKKyAgICAgIHBBUERpY3QtPlNldEF0KHNBUFR5cGUsIHBBUFR5cGVEaWN0KTsKICAgICB9CiAKLSAgICBDUERGX0FycmF5KiBwQm9yZGVyID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRBcnJheSgiQm9yZGVyIik7Ci0gICAgaWYgKHBCb3JkZXIpCi0gICAgewotICAgICAgICBpZiAocEJvcmRlci0+R2V0Q291bnQoKSA+PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICBDUERGX0FycmF5ICpwRFAgPSBwQm9yZGVyLT5HZXRBcnJheSgzKTsKLSAgICAgICAgICAgIGlmIChwRFAgJiYgcERQLT5HZXRDb3VudCgpID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQkJTX0RBU0g7Ci0gICAgICAgIH0KKyAgICBwUGFyZW50RGljdCA9IHBBUFR5cGVEaWN0OworICAgIHBTdHJlYW0gPSBwQVBUeXBlRGljdC0+R2V0U3RyZWFtKHNBUFN0YXRlKTsKKyAgfQorCisgIGlmICghcFN0cmVhbSkgeworICAgIEFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKKyAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wUGFnZVZpZXctPkdldFBERkRvY3VtZW50KCk7CisgICAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7CisKKyAgICBwU3RyZWFtID0gRlhfTkVXIENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICAgIGludDMyX3Qgb2JqbnVtID0gcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7CisgICAgLy8gcEFQRGljdC0+U2V0QXRSZWZlcmVuY2Uoc0FQVHlwZSwgcERvYywgb2JqbnVtKTsKKyAgICBBU1NFUlQocFBhcmVudERpY3QgIT0gTlVMTCk7CisgICAgcFBhcmVudERpY3QtPlNldEF0UmVmZXJlbmNlKHNBUFR5cGUsIHBEb2MsIG9iam51bSk7CisgIH0KKworICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1EaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworCisgIGlmICghcFN0cmVhbURpY3QpIHsKKyAgICBwU3RyZWFtRGljdCA9IEZYX05FVyBDUERGX0RpY3Rpb25hcnk7CisgICAgcFN0cmVhbURpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJYT2JqZWN0Iik7CisgICAgcFN0cmVhbURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJGb3JtIik7CisgICAgcFN0cmVhbURpY3QtPlNldEF0SW50ZWdlcigiRm9ybVR5cGUiLCAxKTsKKyAgICBwU3RyZWFtLT5Jbml0U3RyZWFtKE5VTEwsIDAsIHBTdHJlYW1EaWN0KTsKKyAgfQorCisgIGlmIChwU3RyZWFtRGljdCkgeworICAgIHBTdHJlYW1EaWN0LT5TZXRBdE1hdHJpeCgiTWF0cml4IiwgbWF0cml4KTsKKyAgICBwU3RyZWFtRGljdC0+U2V0QXRSZWN0KCJCQm94IiwgcmNCQm94KTsKKyAgfQorCisgIHBTdHJlYW0tPlNldERhdGEoKHVpbnQ4X3QqKXNDb250ZW50cy5jX3N0cigpLCBzQ29udGVudHMuR2V0TGVuZ3RoKCksIEZBTFNFLAorICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKK30KKworI2RlZmluZSBCQV9BTk5PVF9NSU5XSURUSCAxCisjZGVmaW5lIEJBX0FOTk9UX01JTkhFSUdIVCAxCisKK0ZYX0ZMT0FUIENQREZTREtfQW5ub3Q6OkdldE1pbldpZHRoKCkgY29uc3QgeworICByZXR1cm4gQkFfQU5OT1RfTUlOV0lEVEg7Cit9CisKK0ZYX0ZMT0FUIENQREZTREtfQW5ub3Q6OkdldE1pbkhlaWdodCgpIGNvbnN0IHsKKyAgcmV0dXJuIEJBX0FOTk9UX01JTkhFSUdIVDsKK30KKworRlhfQk9PTCBDUERGU0RLX0JBQW5ub3Q6OkNyZWF0ZUZvcm1GaWxsZXIoKSB7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGU0RLX0JBQW5ub3Q6OklzVmlzaWJsZSgpIGNvbnN0IHsKKyAgaW50IG5GbGFncyA9IEdldEZsYWdzKCk7CisgIHJldHVybiAhKChuRmxhZ3MgJiBBTk5PVEZMQUdfSU5WSVNJQkxFKSB8fCAobkZsYWdzICYgQU5OT1RGTEFHX0hJRERFTikgfHwKKyAgICAgICAgICAgKG5GbGFncyAmIEFOTk9URkxBR19OT1ZJRVcpKTsKK30KKworQ1BERl9BY3Rpb24gQ1BERlNES19CQUFubm90OjpHZXRBY3Rpb24oKSBjb25zdCB7CisgIHJldHVybiBDUERGX0FjdGlvbihtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkEiKSk7Cit9CisKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICBBU1NFUlQoYWN0aW9uKTsKKyAgaWYgKChDUERGX0FjdGlvbiYpYWN0aW9uICE9CisgICAgICBDUERGX0FjdGlvbihtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkEiKSkpIHsKKyAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wUGFnZVZpZXctPkdldFBERkRvY3VtZW50KCk7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CisgICAgaWYgKHBEaWN0ICYmIHBEaWN0LT5HZXRPYmpOdW0oKSA9PSAwKSB7CisgICAgICBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwRGljdCk7CiAgICAgfQotCi0gICAgcmV0dXJuIEJCU19TT0xJRDsKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0UmVmZXJlbmNlKCJBIiwgcERvYywgcERpY3QtPkdldE9iak51bSgpKTsKKyAgfQogfQogCi12b2lkIENQREZTREtfQkFBbm5vdDo6U2V0Qm9yZGVyRGFzaChjb25zdCBDRlhfSW50QXJyYXkmIGFycmF5KQotewotICAgIENQREZfRGljdGlvbmFyeSogcEJTRGljdCA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQlMiKTsKLSAgICBpZiAoIXBCU0RpY3QpCi0gICAgewotICAgICAgICBwQlNEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdCgiQlMiLCBwQlNEaWN0KTsKLSAgICB9Ci0KLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBGWF9ORVcgQ1BERl9BcnJheTsKLSAgICBmb3IgKGludCBpPTAsc3o9YXJyYXkuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgICBwQXJyYXktPkFkZEludGVnZXIoYXJyYXlbaV0pOwotICAgIH0KLQotICAgIHBCU0RpY3QtPlNldEF0KCJEIiwgcEFycmF5KTsKK3ZvaWQgQ1BERlNES19CQUFubm90OjpSZW1vdmVBY3Rpb24oKSB7CisgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+UmVtb3ZlQXQoIkEiKTsKIH0KIAotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OkdldEJvcmRlckRhc2goQ0ZYX0ludEFycmF5JiBhcnJheSkgY29uc3QKLXsKLSAgICBDUERGX0FycmF5KiBwRGFzaCA9IE5VTEw7Ci0KLSAgICBDUERGX0FycmF5KiBwQm9yZGVyID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRBcnJheSgiQm9yZGVyIik7Ci0gICAgaWYgKHBCb3JkZXIpCi0gICAgewotICAgICAgICBwRGFzaCA9IHBCb3JkZXItPkdldEFycmF5KDMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBCU0RpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkJTIik7Ci0gICAgICAgIGlmIChwQlNEaWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBwRGFzaCA9IHBCU0RpY3QtPkdldEFycmF5KCJEIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocERhc2gpCi0gICAgewotICAgICAgICBmb3IgKGludCBpPTAsc3o9cERhc2gtPkdldENvdW50KCk7IGk8c3o7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgYXJyYXkuQWRkKHBEYXNoLT5HZXRJbnRlZ2VyKGkpKTsKLSAgICAgICAgfQotICAgIH0KK0NQREZfQUFjdGlvbiBDUERGU0RLX0JBQW5ub3Q6OkdldEFBY3Rpb24oKSBjb25zdCB7CisgIHJldHVybiBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFBIik7CiB9CiAKLXZvaWQgQ1BERlNES19CQUFubm90OjpTZXRDb2xvcihGWF9DT0xPUlJFRiBjb2xvcikKLXsKLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKLSAgICBwQXJyYXktPkFkZE51bWJlcigoRlhfRkxPQVQpRlhTWVNfR2V0UlZhbHVlKGNvbG9yKSAvIDI1NS4wZik7Ci0gICAgcEFycmF5LT5BZGROdW1iZXIoKEZYX0ZMT0FUKUZYU1lTX0dldEdWYWx1ZShjb2xvcikgLyAyNTUuMGYpOwotICAgIHBBcnJheS0+QWRkTnVtYmVyKChGWF9GTE9BVClGWFNZU19HZXRCVmFsdWUoY29sb3IpIC8gMjU1LjBmKTsKLSAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0KCJDIiwgcEFycmF5KTsKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRBQWN0aW9uKGNvbnN0IENQREZfQUFjdGlvbiYgYWEpIHsKKyAgQVNTRVJUKGFhICE9IE5VTEwpOworCisgIGlmICgoQ1BERl9BQWN0aW9uJilhYSAhPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFBIikpCisgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdCgiQUEiLCAoQ1BERl9BQWN0aW9uJilhYSk7CiB9CiAKLXZvaWQgQ1BERlNES19CQUFubm90OjpSZW1vdmVDb2xvcigpCi17Ci0gICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5SZW1vdmVBdCgiQyIpOwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlJlbW92ZUFBY3Rpb24oKSB7CisgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+UmVtb3ZlQXQoIkFBIik7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19CQUFubm90OjpHZXRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0Ci17Ci0gICAgaWYgKENQREZfQXJyYXkqIHBFbnRyeSA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0QXJyYXkoIkMiKSkKLSAgICB7Ci0gICAgICAgIGludCBuQ291bnQgPSBwRW50cnktPkdldENvdW50KCk7Ci0gICAgICAgIGlmIChuQ291bnQgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgRlhfRkxPQVQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyKDApICogMjU1OworQ1BERl9BY3Rpb24gQ1BERlNES19CQUFubm90OjpHZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCkgeworICBDUERGX0FBY3Rpb24gQUFjdGlvbiA9IEdldEFBY3Rpb24oKTsKIAotICAgICAgICAgICAgY29sb3IgPSBGWFNZU19SR0IoKGludClnLCAoaW50KWcsIChpbnQpZyk7CisgIGlmIChBQWN0aW9uLkFjdGlvbkV4aXN0KGVBQVQpKQorICAgIHJldHVybiBBQWN0aW9uLkdldEFjdGlvbihlQUFUKTsKIAotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobkNvdW50ID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHIgPSBwRW50cnktPkdldE51bWJlcigwKSAqIDI1NTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGcgPSBwRW50cnktPkdldE51bWJlcigxKSAqIDI1NTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGIgPSBwRW50cnktPkdldE51bWJlcigyKSAqIDI1NTsKKyAgaWYgKGVBQVQgPT0gQ1BERl9BQWN0aW9uOjpCdXR0b25VcCkKKyAgICByZXR1cm4gR2V0QWN0aW9uKCk7CiAKLSAgICAgICAgICAgIGNvbG9yID0gRlhTWVNfUkdCKChpbnQpciwgKGludClnLCAoaW50KWIpOwotCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChuQ291bnQgPT0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgRlhfRkxPQVQgYyA9IHBFbnRyeS0+R2V0TnVtYmVyKDApOwotICAgICAgICAgICAgRlhfRkxPQVQgbSA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpOwotICAgICAgICAgICAgRlhfRkxPQVQgeSA9IHBFbnRyeS0+R2V0TnVtYmVyKDIpOwotICAgICAgICAgICAgRlhfRkxPQVQgayA9IHBFbnRyeS0+R2V0TnVtYmVyKDMpOwotCi0gICAgICAgICAgICBGWF9GTE9BVCByID0gMS4wZiAtIEZYX01JTigxLjBmLCBjICsgayk7Ci0gICAgICAgICAgICBGWF9GTE9BVCBnID0gMS4wZiAtIEZYX01JTigxLjBmLCBtICsgayk7Ci0gICAgICAgICAgICBGWF9GTE9BVCBiID0gMS4wZiAtIEZYX01JTigxLjBmLCB5ICsgayk7Ci0KLSAgICAgICAgICAgIGNvbG9yID0gRlhTWVNfUkdCKChpbnQpKHIgKiAyNTUpLCAoaW50KShnICogMjU1KSwgKGludCkoYiAqIDI1NSkpOwotCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIENQREZfQWN0aW9uKCk7CiB9CiAKLQotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OldyaXRlQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSwgY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfTWF0cml4JiBtYXRyaXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQ29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBTdGF0ZSkKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBBUERpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFQIik7Ci0KLSAgICBpZiAoIXBBUERpY3QpCi0gICAgewotICAgICAgICBwQVBEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdCgiQVAiLCBwQVBEaWN0KTsKLSAgICB9Ci0KLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IE5VTEw7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50RGljdCA9IE5VTEw7Ci0KLSAgICBpZiAoc0FQU3RhdGUuSXNFbXB0eSgpKQotICAgIHsKLSAgICAgICAgcFBhcmVudERpY3QgPSBwQVBEaWN0OwotICAgICAgICBwU3RyZWFtID0gcEFQRGljdC0+R2V0U3RyZWFtKHNBUFR5cGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBUFR5cGVEaWN0ID0gcEFQRGljdC0+R2V0RGljdChzQVBUeXBlKTsKLSAgICAgICAgaWYgKCFwQVBUeXBlRGljdCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFQVHlwZURpY3QgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICAgICAgcEFQRGljdC0+U2V0QXQoc0FQVHlwZSwgcEFQVHlwZURpY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcFBhcmVudERpY3QgPSBwQVBUeXBlRGljdDsKLSAgICAgICAgcFN0cmVhbSA9IHBBUFR5cGVEaWN0LT5HZXRTdHJlYW0oc0FQU3RhdGUpOwotICAgIH0KLQotICAgIGlmICghcFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKLSAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IG1fcFBhZ2VWaWV3LT5HZXRQREZEb2N1bWVudCgpOwotICAgICAgICBBU1NFUlQocERvYyAhPSBOVUxMKTsKLQotICAgICAgICBwU3RyZWFtID0gRlhfTkVXIENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOwotICAgICAgICBpbnQzMl90IG9iam51bSA9IHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBTdHJlYW0pOwotICAgICAgICAvL3BBUERpY3QtPlNldEF0UmVmZXJlbmNlKHNBUFR5cGUsIHBEb2MsIG9iam51bSk7Ci0gICAgICAgIEFTU0VSVChwUGFyZW50RGljdCAhPSBOVUxMKTsKLSAgICAgICAgcFBhcmVudERpY3QtPlNldEF0UmVmZXJlbmNlKHNBUFR5cGUsIHBEb2MsIG9iam51bSk7Ci0gICAgfQotCi0gICAgQ1BERl9EaWN0aW9uYXJ5ICogcFN0cmVhbURpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0KLSAgICBpZiAoIXBTdHJlYW1EaWN0KQotICAgIHsKLSAgICAgICAgcFN0cmVhbURpY3QgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICBwU3RyZWFtRGljdC0+U2V0QXROYW1lKCJUeXBlIiwgIlhPYmplY3QiKTsKLSAgICAgICAgcFN0cmVhbURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJGb3JtIik7Ci0gICAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdEludGVnZXIoIkZvcm1UeXBlIiwgMSk7Ci0gICAgICAgIHBTdHJlYW0tPkluaXRTdHJlYW0oTlVMTCwwLHBTdHJlYW1EaWN0KTsKLSAgICB9Ci0KLSAgICBpZiAocFN0cmVhbURpY3QpCi0gICAgewotICAgICAgICBwU3RyZWFtRGljdC0+U2V0QXRNYXRyaXgoIk1hdHJpeCIsbWF0cml4KTsKLSAgICAgICAgcFN0cmVhbURpY3QtPlNldEF0UmVjdCgiQkJveCIsIHJjQkJveCk7Ci0gICAgfQotCi0gICAgcFN0cmVhbS0+U2V0RGF0YSgodWludDhfdCopc0NvbnRlbnRzLmNfc3RyKCksIHNDb250ZW50cy5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKK0ZYX0JPT0wgQ1BERlNES19CQUFubm90OjpJc1hGQUZpZWxkKCkgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLSNkZWZpbmUgQkFfQU5OT1RfTUlOV0lEVEggICAgICAgICAgIDEKLSNkZWZpbmUgQkFfQU5OT1RfTUlOSEVJR0hUICAgICAgICAgIDEKK3ZvaWQgQ1BERlNES19CQUFubm90OjpBbm5vdF9PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworICBtX3BBbm5vdC0+R2V0QVBGb3JtKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIENQREZfQW5ub3Q6Ok5vcm1hbCk7CisgIG1fcEFubm90LT5EcmF3QXBwZWFyYW5jZShtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpLCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwogCi1GWF9GTE9BVCBDUERGU0RLX0Fubm90OjpHZXRNaW5XaWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEJBX0FOTk9UX01JTldJRFRIOworICByZXR1cm47CiB9CiAKLUZYX0ZMT0FUIENQREZTREtfQW5ub3Q6OkdldE1pbkhlaWdodCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEJBX0FOTk9UX01JTkhFSUdIVDsKK0NQREZfUGFnZSogQ1BERlNES19Bbm5vdDo6R2V0UERGUGFnZSgpIHsKKyAgaWYgKG1fcFBhZ2VWaWV3KQorICAgIHJldHVybiBtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpOworICByZXR1cm4gTlVMTDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JBQW5ub3Q6OkNyZWF0ZUZvcm1GaWxsZXIoKQotewotICAgIHJldHVybiBUUlVFOworQ1BERlhGQV9QYWdlKiBDUERGU0RLX0Fubm90OjpHZXRQREZYRkFQYWdlKCkgeworICBpZiAobV9wUGFnZVZpZXcpCisgICAgcmV0dXJuIG1fcFBhZ2VWaWV3LT5HZXRQREZYRkFQYWdlKCk7CisgIHJldHVybiBOVUxMOwogfQotRlhfQk9PTCBDUERGU0RLX0JBQW5ub3Q6OklzVmlzaWJsZSgpIGNvbnN0Ci17Ci0gICAgaW50IG5GbGFncyA9IEdldEZsYWdzKCk7Ci0gICAgcmV0dXJuICEoKG5GbGFncyAmIEFOTk9URkxBR19JTlZJU0lCTEUpIHx8IChuRmxhZ3MgJiBBTk5PVEZMQUdfSElEREVOKSB8fCAobkZsYWdzICYgQU5OT1RGTEFHX05PVklFVykpOwotfQotCi1DUERGX0FjdGlvbiBDUERGU0RLX0JBQW5ub3Q6OkdldEFjdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENQREZfQWN0aW9uKG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQSIpKTsKLX0KLQotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQotewotICAgIEFTU0VSVChhY3Rpb24pOwotICAgIGlmICgoQ1BERl9BY3Rpb24mKWFjdGlvbiAhPSBDUERGX0FjdGlvbihtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkEiKSkpCi0gICAgewotICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wUGFnZVZpZXctPkdldFBERkRvY3VtZW50KCk7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOwotICAgICAgICBpZiAocERpY3QgJiYgcERpY3QtPkdldE9iak51bSgpID09IDApIHsKLSAgICAgICAgICAgIHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBEaWN0KTsKLSAgICAgICAgfQotICAgICAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0UmVmZXJlbmNlKCJBIiwgcERvYywgcERpY3QtPkdldE9iak51bSgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ1BERlNES19CQUFubm90OjpSZW1vdmVBY3Rpb24oKQotewotICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+UmVtb3ZlQXQoIkEiKTsKLX0KLQotQ1BERl9BQWN0aW9uIENQREZTREtfQkFBbm5vdDo6R2V0QUFjdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQUEiKTsKLX0KLQotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEFBY3Rpb24oY29uc3QgQ1BERl9BQWN0aW9uJiBhYSkKLXsKLSAgICBBU1NFUlQoYWEgIT0gTlVMTCk7Ci0KLSAgICBpZiAoKENQREZfQUFjdGlvbiYpYWEgIT0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJBQSIpKQotICAgICAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0KCJBQSIsIChDUERGX0FBY3Rpb24mKWFhKTsKLX0KLQotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OlJlbW92ZUFBY3Rpb24oKQotewotICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+UmVtb3ZlQXQoIkFBIik7Ci19Ci0KLUNQREZfQWN0aW9uIENQREZTREtfQkFBbm5vdDo6R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQpCi17Ci0gICAgQ1BERl9BQWN0aW9uIEFBY3Rpb24gPSBHZXRBQWN0aW9uKCk7Ci0KLSAgICBpZiAoQUFjdGlvbi5BY3Rpb25FeGlzdChlQUFUKSkKLSAgICAgICAgcmV0dXJuIEFBY3Rpb24uR2V0QWN0aW9uKGVBQVQpOwotCi0gICAgaWYgKGVBQVQgPT0gQ1BERl9BQWN0aW9uOjpCdXR0b25VcCkKLSAgICAgICAgcmV0dXJuIEdldEFjdGlvbigpOwotCi0gICAgcmV0dXJuIENQREZfQWN0aW9uKCk7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19CQUFubm90OjpJc1hGQUZpZWxkKCkKLXsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgIENQREZTREtfQkFBbm5vdDo6QW5ub3RfT25EcmF3KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCi17Ci0KLSAgICBtX3BBbm5vdC0+R2V0QVBGb3JtKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIENQREZfQW5ub3Q6Ok5vcm1hbCk7Ci0gICAgbV9wQW5ub3QtPkRyYXdBcHBlYXJhbmNlKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKLQotICAgIHJldHVybiA7Ci19Ci0KLUNQREZfUGFnZSogQ1BERlNES19Bbm5vdDo6R2V0UERGUGFnZSgpCi17Ci0gICAgaWYobV9wUGFnZVZpZXcpCi0gICAgICAgIHJldHVybiBtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1DUERGWEZBX1BhZ2UqIENQREZTREtfQW5ub3Q6OkdldFBERlhGQVBhZ2UoKQotewotICAgIGlmIChtX3BQYWdlVmlldykKLSAgICAgICAgcmV0dXJuIG1fcFBhZ2VWaWV3LT5HZXRQREZYRkFQYWdlKCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwIGIvZnBkZnNkay9zcmMvZnNka19iYXNlZm9ybS5jcHAKaW5kZXggYjI2YTdmNC4uNWM3NjE0OSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19iYXNlZm9ybS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19iYXNlZm9ybS5jcHAKQEAgLTIwLDM2NTEgKzIwLDMzNTUgQEAKIC8vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotI2RlZmluZSBJc0Zsb2F0WmVybyhmKSAgICAgICAgICAgICAgICAgICAgICAoKGYpIDwgMC4wMSAmJiAoZikgPiAtMC4wMSkKLSNkZWZpbmUgSXNGbG9hdEJpZ2dlcihmYSxmYikgICAgICAgICAgICAgICAgKChmYSkgPiAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCi0jZGVmaW5lIElzRmxvYXRTbWFsbGVyKGZhLGZiKSAgICAgICAgICAgICAgICgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsZmIpICAgICAgICAgICAgICAgICBJc0Zsb2F0WmVybygoZmEpLShmYikpCisjZGVmaW5lIElzRmxvYXRaZXJvKGYpICgoZikgPCAwLjAxICYmIChmKSA+IC0wLjAxKQorI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLCBmYikgKChmYSkgPiAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisjZGVmaW5lIElzRmxvYXRTbWFsbGVyKGZhLCBmYikgKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisjZGVmaW5lIElzRmxvYXRFcXVhbChmYSwgZmIpIElzRmxvYXRaZXJvKChmYSkgLSAoZmIpKQogCi1DUERGU0RLX1dpZGdldDo6Q1BERlNES19XaWRnZXQoQ1BERl9Bbm5vdCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtKSA6Ci0JCQkJCUNQREZTREtfQkFBbm5vdChwQW5ub3QsIHBQYWdlVmlldyksCi0JCQkJCW1fcEludGVyRm9ybShwSW50ZXJGb3JtKSwKLQkJCQkJbV9uQXBwQWdlKDApLAotCQkJCQltX25WYWx1ZUFnZSgwKSwKLQkJCQkJbV9oTWl4WEZBV2lkZ2V0KE5VTEwpLAotCQkJCQltX3BXaWRnZXRIYW5kbGVyKE5VTEwpCi17Ci0gICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKK0NQREZTREtfV2lkZ2V0OjpDUERGU0RLX1dpZGdldChDUERGX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtKQorICAgIDogQ1BERlNES19CQUFubm90KHBBbm5vdCwgcFBhZ2VWaWV3KSwKKyAgICAgIG1fcEludGVyRm9ybShwSW50ZXJGb3JtKSwKKyAgICAgIG1fbkFwcEFnZSgwKSwKKyAgICAgIG1fblZhbHVlQWdlKDApLAorICAgICAgbV9oTWl4WEZBV2lkZ2V0KE5VTEwpLAorICAgICAgbV9wV2lkZ2V0SGFuZGxlcihOVUxMKSB7CisgIEFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CiB9CiAKLUNQREZTREtfV2lkZ2V0Ojp+Q1BERlNES19XaWRnZXQoKQoteworQ1BERlNES19XaWRnZXQ6On5DUERGU0RLX1dpZGdldCgpIHt9CiAKLX0KK0lYRkFfV2lkZ2V0KiBDUERGU0RLX1dpZGdldDo6R2V0TWl4WEZBV2lkZ2V0KCkgeworICBBU1NFUlQobV9wUGFnZVZpZXcgIT0gTlVMTCk7CiAKLUlYRkFfV2lkZ2V0KglDUERGU0RLX1dpZGdldDo6R2V0TWl4WEZBV2lkZ2V0KCkKLXsKLQlBU1NFUlQobV9wUGFnZVZpZXcgIT0gTlVMTCk7CisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7CiAKLQlDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gbV9wUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7Ci0JQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXREb2N1bWVudCgpOworICBBU1NFUlQocERvYyAhPSBOVUxMKTsKIAotCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXREb2N1bWVudCgpOwotCUFTU0VSVChwRG9jICE9IE5VTEwpOworICBpZiAocERvYy0+R2V0RG9jVHlwZSgpID09IERPQ1RZUEVfU1RBVElDX1hGQSkgeworICAgIGlmICghbV9oTWl4WEZBV2lkZ2V0KSB7CisgICAgICBpZiAoSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKSkgeworICAgICAgICBDRlhfV2lkZVN0cmluZyBzTmFtZTsKKyAgICAgICAgaWYgKHRoaXMtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikgeworICAgICAgICAgIHNOYW1lID0gdGhpcy0+R2V0QW5ub3ROYW1lKCk7CisgICAgICAgICAgaWYgKHNOYW1lLklzRW1wdHkoKSkKKyAgICAgICAgICAgIHNOYW1lID0gR2V0TmFtZSgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBzTmFtZSA9IEdldE5hbWUoKTsKIAotCWlmIChwRG9jLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9TVEFUSUNfWEZBKQotCXsKLQkJaWYgKCFtX2hNaXhYRkFXaWRnZXQpCi0JCXsKLQkJCWlmIChJWEZBX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpKQotCQkJewotCQkJCUNGWF9XaWRlU3RyaW5nIHNOYW1lOwotCQkJCWlmICh0aGlzLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pCi0JCQkJewotCQkJCQlzTmFtZSA9IHRoaXMtPkdldEFubm90TmFtZSgpOwotCQkJCQlpZiAoc05hbWUuSXNFbXB0eSgpKQotCQkJCQkJc05hbWUgPSBHZXROYW1lKCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc05hbWUgPSBHZXROYW1lKCk7Ci0KLQkJCQlpZiAoIXNOYW1lLklzRW1wdHkoKSkKLQkJCQkJbV9oTWl4WEZBV2lkZ2V0ID0gcERvY1ZpZXctPkdldFdpZGdldEJ5TmFtZShzTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1faE1peFhGQVdpZGdldDsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotSVhGQV9XaWRnZXQqCUNQREZTREtfV2lkZ2V0OjpHZXRHcm91cE1peFhGQVdpZGdldCgpCi17Ci0JQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOwotCi0JQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOwotCUFTU0VSVChwU0RLRG9jICE9IE5VTEwpOwotCi0JQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7Ci0JQVNTRVJUKHBEb2MgIT0gTlVMTCk7Ci0KLQlpZiAocERvYy0+R2V0RG9jVHlwZSgpID09IERPQ1RZUEVfU1RBVElDX1hGQSkKLQl7Ci0JCWlmIChJWEZBX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpKQotCQl7Ci0JCQlDRlhfV2lkZVN0cmluZyBzTmFtZSA9IEdldE5hbWUoKTsKLQotCQkJaWYgKCFzTmFtZS5Jc0VtcHR5KCkpCi0JCQkJcmV0dXJuIHBEb2NWaWV3LT5HZXRXaWRnZXRCeU5hbWUoc05hbWUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLUlYRkFfV2lkZ2V0SGFuZGxlciogQ1BERlNES19XaWRnZXQ6OkdldFhGQVdpZGdldEhhbmRsZXIoKQotewotCUFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKLQotCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKLQlBU1NFUlQocFNES0RvYyAhPSBOVUxMKTsKLQotCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXREb2N1bWVudCgpOwotCUFTU0VSVChwRG9jICE9IE5VTEwpOwotCi0JaWYgKHBEb2MtPkdldERvY1R5cGUoKSA9PSBET0NUWVBFX1NUQVRJQ19YRkEpCi0JewotCQlpZiAoIW1fcFdpZGdldEhhbmRsZXIpCi0JCXsKLQkJCWlmIChJWEZBX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpKQotCQkJewotCQkJCW1fcFdpZGdldEhhbmRsZXIgPSBwRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtX3BXaWRnZXRIYW5kbGVyOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgWEZBX0VWRU5UVFlQRSBHZXRYRkFFdmVudFR5cGUoUERGU0RLX1hGQUFBY3Rpb25UeXBlIGVYRkFBQVQpCi17Ci0JWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlID0gWEZBX0VWRU5UX1Vua25vd247Ci0KLQlzd2l0Y2ggKGVYRkFBQVQpCi0JewotCWNhc2UgUERGU0RLX1hGQV9DbGljazoKLQkJZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9DbGljazsKLQkJYnJlYWs7Ci0JY2FzZSBQREZTREtfWEZBX0Z1bGw6Ci0JCWVFdmVudFR5cGUgPSBYRkFfRVZFTlRfRnVsbDsKLQkJYnJlYWs7Ci0JY2FzZSBQREZTREtfWEZBX1ByZU9wZW46Ci0JCWVFdmVudFR5cGUgPSBYRkFfRVZFTlRfUHJlT3BlbjsKLQkJYnJlYWs7Ci0JY2FzZSBQREZTREtfWEZBX1Bvc3RPcGVuOgotCQllRXZlbnRUeXBlID0gWEZBX0VWRU5UX1Bvc3RPcGVuOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZUV2ZW50VHlwZTsKLX0KLQotc3RhdGljIFhGQV9FVkVOVFRZUEUgR2V0WEZBRXZlbnRUeXBlKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgRlhfQk9PTCBiV2lsbENvbW1pdCkKLXsKLQlYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUgPSBYRkFfRVZFTlRfVW5rbm93bjsKLQotCXN3aXRjaCAoZUFBVCkKLQl7Ci0JY2FzZSBDUERGX0FBY3Rpb246OkN1cnNvckVudGVyOgotCQllRXZlbnRUeXBlID0gIFhGQV9FVkVOVF9Nb3VzZUVudGVyOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6Q3Vyc29yRXhpdDoKLQkJZUV2ZW50VHlwZSA9ICBYRkFfRVZFTlRfTW91c2VFeGl0OwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6QnV0dG9uRG93bjoKLQkJZUV2ZW50VHlwZSA9ICBYRkFfRVZFTlRfTW91c2VEb3duOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6QnV0dG9uVXA6Ci0JCWVFdmVudFR5cGUgPSAgWEZBX0VWRU5UX01vdXNlVXA7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpHZXRGb2N1czoKLQkJZUV2ZW50VHlwZSA9ICBYRkFfRVZFTlRfRW50ZXI7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXM6Ci0JCWVFdmVudFR5cGUgPSAgWEZBX0VWRU5UX0V4aXQ7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlT3BlbjoKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VDbG9zZToKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VWaXNpYmxlOgotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6UGFnZUludmlzaWJsZToKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLQkJaWYgKCFiV2lsbENvbW1pdCkKLQkJewotCQkJZUV2ZW50VHlwZSA9ICBYRkFfRVZFTlRfQ2hhbmdlOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKLQkJZUV2ZW50VHlwZSA9ICBYRkFfRVZFTlRfVmFsaWRhdGU7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpPcGVuUGFnZToKLQljYXNlIENQREZfQUFjdGlvbjo6Q2xvc2VQYWdlOgotCWNhc2UgQ1BERl9BQWN0aW9uOjpGb3JtYXQ6Ci0JY2FzZSBDUERGX0FBY3Rpb246OkNhbGN1bGF0ZToKLQljYXNlIENQREZfQUFjdGlvbjo6Q2xvc2VEb2N1bWVudDoKLQljYXNlIENQREZfQUFjdGlvbjo6U2F2ZURvY3VtZW50OgotCWNhc2UgQ1BERl9BQWN0aW9uOjpEb2N1bWVudFNhdmVkOgotCWNhc2UgQ1BERl9BQWN0aW9uOjpQcmludERvY3VtZW50OgotCWNhc2UgQ1BERl9BQWN0aW9uOjpEb2N1bWVudFByaW50ZWQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBlRXZlbnRUeXBlOwotfQotCi1GWF9CT09MIENQREZTREtfV2lkZ2V0OjpIYXNYRkFBQWN0aW9uKFBERlNES19YRkFBQWN0aW9uVHlwZSBlWEZBQUFUKQotewotCWlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKQotCXsKLQkJaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpCi0JCXsKLQkJCVhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSA9IEdldFhGQUV2ZW50VHlwZShlWEZBQUFUKTsKLQotCQkJaWYgKChlRXZlbnRUeXBlID09IFhGQV9FVkVOVF9DbGljayB8fAotCQkJCWVFdmVudFR5cGUgPT0gWEZBX0VWRU5UX0NoYW5nZSkgJiYKLQkJCQlHZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pCi0JCQl7Ci0JCQkJaWYgKElYRkFfV2lkZ2V0KiBoR3JvdXBXaWRnZXQgPSBHZXRHcm91cE1peFhGQVdpZGdldCgpKQotCQkJCXsKLQkJCQkJQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoR3JvdXBXaWRnZXQpOwotCQkJCQlpZiAocFhGQVdpZGdldEhhbmRsZXItPkhhc0V2ZW50KHBBY2MsIGVFdmVudFR5cGUpKQotCQkJCQkJcmV0dXJuIFRSVUU7Ci0JCQkJfQotCQkJfQotCi0JCQl7Ci0JCQkJQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KTsKLQkJCQlyZXR1cm4gcFhGQVdpZGdldEhhbmRsZXItPkhhc0V2ZW50KHBBY2MsIGVFdmVudFR5cGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MCUNQREZTREtfV2lkZ2V0OjpPblhGQUFBY3Rpb24oUERGU0RLX1hGQUFBY3Rpb25UeXBlIGVYRkFBQVQsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCUFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKLQotCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKLQlBU1NFUlQocFNES0RvYyAhPSBOVUxMKTsKLQotCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXREb2N1bWVudCgpOwotCUFTU0VSVChwRG9jICE9IE5VTEwpOwotCi0JaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpCi0JewotCQlYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUgPSBHZXRYRkFFdmVudFR5cGUoZVhGQUFBVCk7Ci0KLQkJaWYgKGVFdmVudFR5cGUgIT0gWEZBX0VWRU5UX1Vua25vd24pCi0JCXsKLQkJCWlmIChJWEZBX1dpZGdldEhhbmRsZXIqIHBYRkFXaWRnZXRIYW5kbGVyID0gdGhpcy0+R2V0WEZBV2lkZ2V0SGFuZGxlcigpKQotCQkJewotCQkJCUNYRkFfRXZlbnRQYXJhbSBwYXJhbTsKLQkJCQlwYXJhbS5tX2VUeXBlID0gZUV2ZW50VHlwZTsKLQkJCQlwYXJhbS5tX3dzQ2hhbmdlID0gZGF0YS5zQ2hhbmdlOwotCQkJCXBhcmFtLm1faUNvbW1pdEtleSA9IGRhdGEubkNvbW1pdEtleTsKLQkJCQlwYXJhbS5tX2JTaGlmdCA9IGRhdGEuYlNoaWZ0OwotCQkJCXBhcmFtLm1faVNlbFN0YXJ0ID0gZGF0YS5uU2VsU3RhcnQ7Ci0JCQkJcGFyYW0ubV9pU2VsRW5kID0gZGF0YS5uU2VsRW5kOwotCQkJCXBhcmFtLm1fd3NGdWxsVGV4dCA9IGRhdGEuc1ZhbHVlOwotCQkJCXBhcmFtLm1fYktleURvd24gPSBkYXRhLmJLZXlEb3duOwotCQkJCXBhcmFtLm1fYk1vZGlmaWVyID0gZGF0YS5iTW9kaWZpZXI7Ci0JCQkJcGFyYW0ubV93c05ld1RleHQgPSBkYXRhLnNWYWx1ZTsKLQkJCQlpZiAoZGF0YS5uU2VsRW5kID4gZGF0YS5uU2VsU3RhcnQpCi0JCQkJCXBhcmFtLm1fd3NOZXdUZXh0LkRlbGV0ZShkYXRhLm5TZWxTdGFydCwgZGF0YS5uU2VsRW5kIC0gZGF0YS5uU2VsU3RhcnQpOwotCQkJCWZvciAoaW50IGk9MDsgaTxkYXRhLnNDaGFuZ2UuR2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJcGFyYW0ubV93c05ld1RleHQuSW5zZXJ0KGRhdGEublNlbFN0YXJ0LCBkYXRhLnNDaGFuZ2VbaV0pOwotCQkJCXBhcmFtLm1fd3NQcmV2VGV4dCA9IGRhdGEuc1ZhbHVlOwotCi0JCQkJaWYgKChlRXZlbnRUeXBlID09IFhGQV9FVkVOVF9DbGljayB8fAotCQkJCQllRXZlbnRUeXBlID09IFhGQV9FVkVOVF9DaGFuZ2UpICYmCi0JCQkJCUdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKLQkJCQl7Ci0JCQkJCWlmIChJWEZBX1dpZGdldCogaEdyb3VwV2lkZ2V0ID0gR2V0R3JvdXBNaXhYRkFXaWRnZXQoKSkKLQkJCQkJewotCQkJCQkJQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoR3JvdXBXaWRnZXQpOwotCQkJCQkJcGFyYW0ubV9wVGFyZ2V0ID0gcEFjYzsKLQkJCQkJCXBYRkFXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocEFjYywgJnBhcmFtKTsKLQkJCQkJfQotCi0JCQkJCXsKLQkJCQkJCUNYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCk7Ci0JCQkJCQlwYXJhbS5tX3BUYXJnZXQgPSBwQWNjOwotCQkJCQkJaW50MzJfdCBuUmV0ID0gcFhGQVdpZGdldEhhbmRsZXItPlByb2Nlc3NFdmVudChwQWNjLCAmcGFyYW0pOwotCQkJCQkJcmV0dXJuIG5SZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCk7Ci0JCQkJCXBhcmFtLm1fcFRhcmdldCA9IHBBY2M7Ci0JCQkJCWludDMyX3QgblJldCA9IHBYRkFXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocEFjYywgJnBhcmFtKTsKLQkJCQkJcmV0dXJuIG5SZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzOwotCQkJCX0KLQotCQkJCWlmIChJWEZBX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpKQotCQkJCXsKLQkJCQkJcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlN5bmNocm9uaXplKEZYX0JPT0wgYlN5bmNocm9uaXplRWxzZSkKLXsKLQlpZiAoSVhGQV9XaWRnZXQqIGhXaWRnZXQgPSB0aGlzLT5HZXRNaXhYRkFXaWRnZXQoKSkKLQl7Ci0JCWlmIChJWEZBX1dpZGdldEhhbmRsZXIqIHBYRkFXaWRnZXRIYW5kbGVyID0gdGhpcy0+R2V0WEZBV2lkZ2V0SGFuZGxlcigpKQotCQl7Ci0JCQlDUERGX0Zvcm1GaWVsZCoJcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotCQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQkJCWlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKQotCQkJewotCQkJCXN3aXRjaCAoR2V0RmllbGRUeXBlKCkpCi0JCQkJewotCQkJCWNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotCQkJCWNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgotCQkJCQl7Ci0JCQkJCQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOwotCQkJCQkJQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQotCQkJCQkJWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUgPSBwRm9ybUN0cmwtPklzQ2hlY2tlZCgpID8gWEZBX0NIRUNLU1RBVEVfT24gOiBYRkFfQ0hFQ0tTVEFURV9PZmY7Ci0JCQkJCQlwV2lkZ2V0QWNjLT5TZXRDaGVja1N0YXRlKGVDaGVja1N0YXRlKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6Ci0JCQkJCXBXaWRnZXRBY2MtPlNldFZhbHVlKHBGb3JtRmllbGQtPkdldFZhbHVlKCksIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRklFTERUWVBFX0xJU1RCT1g6Ci0JCQkJCXsKLQkJCQkJCXBXaWRnZXRBY2MtPkNsZWFyQWxsU2VsZWN0aW9ucygpOwotCi0JCQkJCQlmb3IgKGludCBpPTAsc3o9cEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7IGk8c3o7IGkrKykKLQkJCQkJCXsKLQkJCQkJCQlpbnQgbkluZGV4ID0gcEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChpKTsKLQkJCQkJCQlpZiAobkluZGV4ID4gLTEgJiYgbkluZGV4IDwgcFdpZGdldEFjYy0+Q291bnRDaG9pY2VMaXN0SXRlbXMoKSkKLQkJCQkJCQkJcFdpZGdldEFjYy0+U2V0SXRlbVN0YXRlKG5JbmRleCwgVFJVRSwgRkFMU0UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgotCQkJCQl7Ci0JCQkJCQlwV2lkZ2V0QWNjLT5DbGVhckFsbFNlbGVjdGlvbnMoKTsKLQotCQkJCQkJZm9yIChpbnQgaT0wLHN6PXBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpOyBpPHN6OyBpKyspCi0JCQkJCQl7Ci0JCQkJCQkJaW50IG5JbmRleCA9IHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaSk7Ci0JCQkJCQkJaWYgKG5JbmRleCA+IC0xICYmIG5JbmRleCA8IHBXaWRnZXRBY2MtPkNvdW50Q2hvaWNlTGlzdEl0ZW1zKCkpCi0JCQkJCQkJCXBXaWRnZXRBY2MtPlNldEl0ZW1TdGF0ZShuSW5kZXgsIFRSVUUsIEZBTFNFKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXBXaWRnZXRBY2MtPlNldFZhbHVlKHBGb3JtRmllbGQtPkdldFZhbHVlKCksIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmIChiU3luY2hyb25pemVFbHNlKQotCQkJCQlwV2lkZ2V0QWNjLT5Qcm9jZXNzVmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlN5bmNocm9uaXplWEZBVmFsdWUoKQotewotCUFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKLQotCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKLQlBU1NFUlQocFNES0RvYyAhPSBOVUxMKTsKLQotCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXREb2N1bWVudCgpOwotCUFTU0VSVChwRG9jICE9IE5VTEwpOwotCi0JSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKTsKLQlpZiAoIXBYRkFEb2NWaWV3KSByZXR1cm47Ci0KLQlpZiAoSVhGQV9XaWRnZXQqIGhXaWRnZXQgPSB0aGlzLT5HZXRNaXhYRkFXaWRnZXQoKSkKLQl7Ci0JCWlmIChJWEZBX1dpZGdldEhhbmRsZXIqIHBYRkFXaWRnZXRIYW5kbGVyID0gdGhpcy0+R2V0WEZBV2lkZ2V0SGFuZGxlcigpKQotCQl7Ci0JCQlDUERGX0Zvcm1GaWVsZCoJcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotCQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQkJCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0JCQlBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOwotCi0JCQlDUERGU0RLX1dpZGdldDo6U3luY2hyb25pemVYRkFWYWx1ZShwWEZBRG9jVmlldywgaFdpZGdldCwgcEZvcm1GaWVsZCwgcEZvcm1DdHJsKTsKLQkJfQotCX0KLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6U3luY2hyb25pemVYRkFJdGVtcygpCi17Ci0JQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOwotCi0JQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOwotCUFTU0VSVChwU0RLRG9jICE9IE5VTEwpOwotCi0JQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7Ci0JQVNTRVJUKHBEb2MgIT0gTlVMTCk7Ci0KLQlJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpOwotCWlmICghcFhGQURvY1ZpZXcpIHJldHVybjsKLQotCWlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKQotCXsKLQkJaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpCi0JCXsKLQkJCUNQREZfRm9ybUZpZWxkKglwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0JCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotCQkJU3luY2hyb25pemVYRkFJdGVtcyhwWEZBRG9jVmlldywgaFdpZGdldCwgcEZvcm1GaWVsZCwgTlVMTCk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlN5bmNocm9uaXplWEZBVmFsdWUoSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldywgSVhGQV9XaWRnZXQqIGhXaWRnZXQsCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCkKLXsKLQlBU1NFUlQocFhGQURvY1ZpZXcgIT0gTlVMTCk7Ci0JQVNTRVJUKGhXaWRnZXQgIT0gTlVMTCk7Ci0KLQlpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHBYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCkpCi0JewotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQkJQVNTRVJUKHBGb3JtQ29udHJvbCAhPSBOVUxMKTsKLQotCQlzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQotCQl7Ci0JCWNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotCQkJewotCQkJCWlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKQotCQkJCXsKLQkJCQkJRlhfQk9PTCBiQ2hlY2tlZCA9IHBXaWRnZXRBY2MtPkdldENoZWNrU3RhdGUoKSA9PSBYRkFfQ0hFQ0tTVEFURV9PbjsKLQotCQkJCQlwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wocEZvcm1GaWVsZC0+R2V0Q29udHJvbEluZGV4KHBGb3JtQ29udHJvbCksCi0JCQkJCQliQ2hlY2tlZCwgVFJVRSk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgotCQkJewotCQkJCWlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKQotCQkJCXsKLQkJCQkJRlhfQk9PTCBiQ2hlY2tlZCA9IHBXaWRnZXRBY2MtPkdldENoZWNrU3RhdGUoKSA9PSBYRkFfQ0hFQ0tTVEFURV9PbjsKLQotCQkJCQlwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wocEZvcm1GaWVsZC0+R2V0Q29udHJvbEluZGV4KHBGb3JtQ29udHJvbCksCi0JCQkJCQliQ2hlY2tlZCwgVFJVRSk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKLQkJCXsKLQkJCQlpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkKLQkJCQl7Ci0JCQkJCUNGWF9XaWRlU3RyaW5nIHNWYWx1ZTsKLQkJCQkJcFdpZGdldEFjYy0+R2V0VmFsdWUoc1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOwotCQkJCQlwRm9ybUZpZWxkLT5TZXRWYWx1ZShzVmFsdWUsIFRSVUUpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgotCQkJewotCQkJCXBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKEZBTFNFKTsKLQotCQkJCWlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKQotCQkJCXsKLQkJCQkJZm9yIChpbnQgaT0wLHN6PXBXaWRnZXRBY2MtPkNvdW50U2VsZWN0ZWRJdGVtcygpOyBpPHN6OyBpKyspCi0JCQkJCXsKLQkJCQkJCWludCBuSW5kZXggPSBwV2lkZ2V0QWNjLT5HZXRTZWxlY3RlZEl0ZW0oaSk7Ci0KLQkJCQkJCWlmIChuSW5kZXggPiAtMSAmJiBuSW5kZXggPCBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSkKLQkJCQkJCXsKLQkJCQkJCQlwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKG5JbmRleCwgVFJVRSwgVFJVRSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6Ci0JCQl7Ci0JCQkJcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oRkFMU0UpOwotCi0JCQkJaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpCi0JCQkJewotCQkJCQlmb3IgKGludCBpPTAsc3o9cFdpZGdldEFjYy0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7IGk8c3o7IGkrKykKLQkJCQkJewotCQkJCQkJaW50IG5JbmRleCA9IHBXaWRnZXRBY2MtPkdldFNlbGVjdGVkSXRlbShpKTsKLQotCQkJCQkJaWYgKG5JbmRleCA+IC0xICYmIG5JbmRleCA8IHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpKQotCQkJCQkJewotCQkJCQkJCXBGb3JtRmllbGQtPlNldEl0ZW1TZWxlY3Rpb24obkluZGV4LCBUUlVFLCBUUlVFKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCUNGWF9XaWRlU3RyaW5nIHNWYWx1ZTsKLQkJCQkJcFdpZGdldEFjYy0+R2V0VmFsdWUoc1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOwotCQkJCQlwRm9ybUZpZWxkLT5TZXRWYWx1ZShzVmFsdWUsIFRSVUUpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi12b2lkIENQREZTREtfV2lkZ2V0OjpTeW5jaHJvbml6ZVhGQUl0ZW1zKElYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcsIElYRkFfV2lkZ2V0KiBoV2lkZ2V0LAotCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wpCi17Ci0JQVNTRVJUKHBYRkFEb2NWaWV3ICE9IE5VTEwpOwotCUFTU0VSVChoV2lkZ2V0ICE9IE5VTEwpOwotCi0JaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSBwWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpKQotCXsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQkJc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkKLQkJewotCQljYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgotCQkJewotCQkJCXBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKEZBTFNFKTsKLQkJCQlwRm9ybUZpZWxkLT5DbGVhck9wdGlvbnMoVFJVRSk7Ci0KLQkJCQlpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkKLQkJCQl7Ci0JCQkJCWZvciAoaW50IGk9MCxzej1wV2lkZ2V0QWNjLT5Db3VudENob2ljZUxpc3RJdGVtcygpOyBpPHN6OyBpKyspCi0JCQkJCXsKLQkJCQkJCUNGWF9XaWRlU3RyaW5nIHN3VGV4dDsKLQkJCQkJCXBXaWRnZXRBY2MtPkdldENob2ljZUxpc3RJdGVtKHN3VGV4dCwgaSk7Ci0KLQkJCQkJCXBGb3JtRmllbGQtPkluc2VydE9wdGlvbihzd1RleHQsIGksIFRSVUUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgotCQkJewotCQkJCXBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKEZBTFNFKTsKLQkJCQlwRm9ybUZpZWxkLT5DbGVhck9wdGlvbnMoRkFMU0UpOwotCi0JCQkJaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpCi0JCQkJewotCQkJCQlmb3IgKGludCBpPTAsc3o9cFdpZGdldEFjYy0+Q291bnRDaG9pY2VMaXN0SXRlbXMoKTsgaTxzejsgaSsrKQotCQkJCQl7Ci0JCQkJCQlDRlhfV2lkZVN0cmluZyBzd1RleHQ7Ci0JCQkJCQlwV2lkZ2V0QWNjLT5HZXRDaG9pY2VMaXN0SXRlbShzd1RleHQsIGkpOwotCi0JCQkJCQlwRm9ybUZpZWxkLT5JbnNlcnRPcHRpb24oc3dUZXh0LCBpLCBGQUxTRSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwRm9ybUZpZWxkLT5TZXRWYWx1ZShMIiIsIFRSVUUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLUZYX0JPT0wJCUNQREZTREtfV2lkZ2V0OjpJc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKQotewotCUNQREZfRGljdGlvbmFyeSogcEFQID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJBUCIpOwotCWlmICghcEFQKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLQkvLyBDaG9vc2UgdGhlIHJpZ2h0IHN1Yi1hcAotCWNvbnN0IEZYX0NIQVIqIGFwX2VudHJ5ID0gIk4iOwotCWlmIChtb2RlID09IENQREZfQW5ub3Q6OkRvd24pCi0JCWFwX2VudHJ5ID0gIkQiOwotCWVsc2UgaWYgKG1vZGUgPT0gQ1BERl9Bbm5vdDo6Um9sbG92ZXIpCi0JCWFwX2VudHJ5ID0gIlIiOwotCWlmICghcEFQLT5LZXlFeGlzdChhcF9lbnRyeSkpCi0JCWFwX2VudHJ5ID0gIk4iOwotCi0JLy8gR2V0IHRoZSBBUCBzdHJlYW0gb3Igc3ViZGlyZWN0b3J5Ci0JQ1BERl9PYmplY3QqIHBzdWIgPSBwQVAtPkdldEVsZW1lbnRWYWx1ZShhcF9lbnRyeSk7Ci0JaWYgKCFwc3ViKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLQlpbnQgbkZpZWxkVHlwZSA9IEdldEZpZWxkVHlwZSgpOwotCXN3aXRjaCAobkZpZWxkVHlwZSkKLQl7Ci0JY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKLQljYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKLQljYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgotCWNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKLQljYXNlIEZJRUxEVFlQRV9TSUdOQVRVUkU6Ci0JCXJldHVybiBwc3ViLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTTsKLQljYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKLQljYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKLQkJaWYgKHBzdWItPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkKLQkJewotCQkJQ1BERl9EaWN0aW9uYXJ5KiBwU3ViRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBzdWI7Ci0JCQlyZXR1cm4gcFN1YkRpY3QtPkdldFN0cmVhbShHZXRBcHBTdGF0ZSgpKSAhPSBOVUxMOwotCQl9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLQl9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWludCBDUERGU0RLX1dpZGdldDo6R2V0RmllbGRUeXBlKCkgY29uc3QKLXsKLSAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0gICAgQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKLQotICAgIHJldHVybiBwRmllbGQtPkdldEZpZWxkVHlwZSgpOwotfQotCi1GWF9CT09MCUNQREZTREtfV2lkZ2V0OjpJc0FwcGVhcmFuY2VWYWxpZCgpCi17Ci0JQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOwotCi0JQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOwotCUFTU0VSVChwU0RLRG9jICE9IE5VTEwpOwotCi0JQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7Ci0JQVNTRVJUKHBEb2MgIT0gTlVMTCk7Ci0KLQlpbnQgbkRvY1R5cGUgPSBwRG9jLT5HZXREb2NUeXBlKCk7Ci0JaWYgKG5Eb2NUeXBlID09IERPQ1RZUEVfUERGIHx8IG5Eb2NUeXBlID09IERPQ1RZUEVfU1RBVElDX1hGQSkKLQkJcmV0dXJuIENQREZTREtfQkFBbm5vdDo6SXNBcHBlYXJhbmNlVmFsaWQoKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1pbnQgQ1BERlNES19XaWRnZXQ6OkdldEZpZWxkRmxhZ3MoKSBjb25zdAotewotICAgIENQREZfSW50ZXJGb3JtKiBwUERGSW50ZXJGb3JtID0gbV9wSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgICBBU1NFUlQocFBERkludGVyRm9ybSAhPSBOVUxMKTsKLQotICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBQREZJbnRlckZvcm0tPkdldENvbnRyb2xCeURpY3QobV9wQW5ub3QtPkdldEFubm90RGljdCgpKTsKLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBGb3JtQ29udHJvbC0+R2V0RmllbGQoKTsKLSAgICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0U3ViVHlwZSgpIGNvbnN0Ci17Ci0gICAgaW50IG5UeXBlID0gR2V0RmllbGRUeXBlKCk7Ci0KLSAgICBpZiAoblR5cGUgPT0gRklFTERUWVBFX1NJR05BVFVSRSkKLSAgICAgICAgcmV0dXJuIEJGRlRfU0lHTkFUVVJFOwotICAgIHJldHVybiBDUERGU0RLX0Fubm90OjpHZXRTdWJUeXBlKCk7Ci19Ci0KLUNQREZfRm9ybUZpZWxkKiBDUERGU0RLX1dpZGdldDo6R2V0Rm9ybUZpZWxkKCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgQ1BERl9Gb3JtQ29udHJvbCogcEN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOwotICAgIEFTU0VSVChwQ3RybCAhPSBOVUxMKTsKLQotICAgIHJldHVybiBwQ3RybC0+R2V0RmllbGQoKTsKLX0KLQotQ1BERl9Gb3JtQ29udHJvbCogQ1BERlNES19XaWRnZXQ6OkdldEZvcm1Db250cm9sKCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBtX3BJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwotICAgIEFTU0VSVChwUERGSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgcmV0dXJuIHBQREZJbnRlckZvcm0tPkdldENvbnRyb2xCeURpY3QoR2V0QW5ub3REaWN0KCkpOwotfQotCi1DUERGX0Zvcm1Db250cm9sKiBDUERGU0RLX1dpZGdldDo6R2V0Rm9ybUNvbnRyb2woQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0sIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKLXsKLSAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLSAgICBBU1NFUlQocEFubm90RGljdCAhPSBOVUxMKTsKLQotICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gcEludGVyRm9ybS0+R2V0Q29udHJvbEJ5RGljdChwQW5ub3REaWN0KTsKLQotICAgIHJldHVybiBwQ29udHJvbDsKLX0KLQotaW50IENQREZTREtfV2lkZ2V0OjpHZXRSb3RhdGUoKSBjb25zdAotewotICAgIENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKLSAgICBBU1NFUlQocEN0cmwgIT0gTlVMTCk7Ci0KLSAgICByZXR1cm4gcEN0cmwtPkdldFJvdGF0aW9uKCkgJSAzNjA7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nCUNQREZTREtfV2lkZ2V0OjpHZXROYW1lKCkKLXsKLQlBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKLQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotCXJldHVybiBwRm9ybUZpZWxkLT5HZXRGdWxsTmFtZSgpOwotfQotCi1GWF9CT09MCUNQREZTREtfV2lkZ2V0OjpHZXRGaWxsQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAotewotICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0gICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQotICAgIGludCBpQ29sb3JUeXBlID0gMDsKLSAgICBjb2xvciA9IEZYX0FSR0JUT0NPTE9SUkVGKHBGb3JtQ3RybC0+R2V0QmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUpKTsKLQotICAgIHJldHVybiBpQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKLX0KLQotRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6R2V0Qm9yZGVyQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAotewotICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0gICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQotICAgIGludCBpQ29sb3JUeXBlID0gMDsKLSAgICBjb2xvciA9IEZYX0FSR0JUT0NPTE9SUkVGKHBGb3JtQ3RybC0+R2V0Qm9yZGVyQ29sb3IoaUNvbG9yVHlwZSkpOwotCi0gICAgcmV0dXJuIGlDb2xvclR5cGUgIT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotfQotCi1GWF9CT09MIENQREZTREtfV2lkZ2V0OjpHZXRUZXh0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAotewotICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0gICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQotICAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgZGEgPSBwRm9ybUN0cmwtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0gICAgaWYgKGRhLkhhc0NvbG9yKCkpCi0gICAgewotICAgICAgICBGWF9BUkdCIGFyZ2I7Ci0gICAgICAgIGludCBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotICAgICAgICBkYS5HZXRDb2xvcihhcmdiLCBpQ29sb3JUeXBlKTsKLSAgICAgICAgY29sb3IgPSBGWF9BUkdCVE9DT0xPUlJFRihhcmdiKTsKLQotICAgICAgICByZXR1cm4gaUNvbG9yVHlwZSAhPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CisgICAgICAgIGlmICghc05hbWUuSXNFbXB0eSgpKQorICAgICAgICAgIG1faE1peFhGQVdpZGdldCA9IHBEb2NWaWV3LT5HZXRXaWRnZXRCeU5hbWUoc05hbWUpOworICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gbV9oTWl4WEZBV2lkZ2V0OworICB9CiAKKyAgcmV0dXJuIE5VTEw7Cit9CisKK0lYRkFfV2lkZ2V0KiBDUERGU0RLX1dpZGdldDo6R2V0R3JvdXBNaXhYRkFXaWRnZXQoKSB7CisgIEFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKKworICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gbV9wUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisgIEFTU0VSVChwU0RLRG9jICE9IE5VTEwpOworCisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXREb2N1bWVudCgpOworICBBU1NFUlQocERvYyAhPSBOVUxMKTsKKworICBpZiAocERvYy0+R2V0RG9jVHlwZSgpID09IERPQ1RZUEVfU1RBVElDX1hGQSkgeworICAgIGlmIChJWEZBX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpKSB7CisgICAgICBDRlhfV2lkZVN0cmluZyBzTmFtZSA9IEdldE5hbWUoKTsKKworICAgICAgaWYgKCFzTmFtZS5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBwRG9jVmlldy0+R2V0V2lkZ2V0QnlOYW1lKHNOYW1lKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworSVhGQV9XaWRnZXRIYW5kbGVyKiBDUERGU0RLX1dpZGdldDo6R2V0WEZBV2lkZ2V0SGFuZGxlcigpIHsKKyAgQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOworCisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7CisKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7CisgIEFTU0VSVChwRG9jICE9IE5VTEwpOworCisgIGlmIChwRG9jLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9TVEFUSUNfWEZBKSB7CisgICAgaWYgKCFtX3BXaWRnZXRIYW5kbGVyKSB7CisgICAgICBpZiAoSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKSkgeworICAgICAgICBtX3BXaWRnZXRIYW5kbGVyID0gcERvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1fcFdpZGdldEhhbmRsZXI7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFhGQV9FVkVOVFRZUEUgR2V0WEZBRXZlbnRUeXBlKFBERlNES19YRkFBQWN0aW9uVHlwZSBlWEZBQUFUKSB7CisgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9Vbmtub3duOworCisgIHN3aXRjaCAoZVhGQUFBVCkgeworICAgIGNhc2UgUERGU0RLX1hGQV9DbGljazoKKyAgICAgIGVFdmVudFR5cGUgPSBYRkFfRVZFTlRfQ2xpY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERlNES19YRkFfRnVsbDoKKyAgICAgIGVFdmVudFR5cGUgPSBYRkFfRVZFTlRfRnVsbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGU0RLX1hGQV9QcmVPcGVuOgorICAgICAgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9QcmVPcGVuOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZTREtfWEZBX1Bvc3RPcGVuOgorICAgICAgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9Qb3N0T3BlbjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGVFdmVudFR5cGU7Cit9CisKK3N0YXRpYyBYRkFfRVZFTlRUWVBFIEdldFhGQUV2ZW50VHlwZShDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lsbENvbW1pdCkgeworICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUgPSBYRkFfRVZFTlRfVW5rbm93bjsKKworICBzd2l0Y2ggKGVBQVQpIHsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6Q3Vyc29yRW50ZXI6CisgICAgICBlRXZlbnRUeXBlID0gWEZBX0VWRU5UX01vdXNlRW50ZXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6Q3Vyc29yRXhpdDoKKyAgICAgIGVFdmVudFR5cGUgPSBYRkFfRVZFTlRfTW91c2VFeGl0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkJ1dHRvbkRvd246CisgICAgICBlRXZlbnRUeXBlID0gWEZBX0VWRU5UX01vdXNlRG93bjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25VcDoKKyAgICAgIGVFdmVudFR5cGUgPSBYRkFfRVZFTlRfTW91c2VVcDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpHZXRGb2N1czoKKyAgICAgIGVFdmVudFR5cGUgPSBYRkFfRVZFTlRfRW50ZXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6TG9zZUZvY3VzOgorICAgICAgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9FeGl0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VPcGVuOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VDbG9zZToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlVmlzaWJsZToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlSW52aXNpYmxlOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKKyAgICAgIGlmICghYldpbGxDb21taXQpIHsKKyAgICAgICAgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9DaGFuZ2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6VmFsaWRhdGU6CisgICAgICBlRXZlbnRUeXBlID0gWEZBX0VWRU5UX1ZhbGlkYXRlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246Ok9wZW5QYWdlOgorICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpDbG9zZVBhZ2U6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkZvcm1hdDoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6Q2FsY3VsYXRlOgorICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpDbG9zZURvY3VtZW50OgorICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpTYXZlRG9jdW1lbnQ6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkRvY3VtZW50U2F2ZWQ6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlByaW50RG9jdW1lbnQ6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkRvY3VtZW50UHJpbnRlZDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGVFdmVudFR5cGU7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6Okhhc1hGQUFBY3Rpb24oUERGU0RLX1hGQUFBY3Rpb25UeXBlIGVYRkFBQVQpIHsKKyAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpIHsKKyAgICBpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHRoaXMtPkdldFhGQVdpZGdldEhhbmRsZXIoKSkgeworICAgICAgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlID0gR2V0WEZBRXZlbnRUeXBlKGVYRkFBQVQpOworCisgICAgICBpZiAoKGVFdmVudFR5cGUgPT0gWEZBX0VWRU5UX0NsaWNrIHx8IGVFdmVudFR5cGUgPT0gWEZBX0VWRU5UX0NoYW5nZSkgJiYKKyAgICAgICAgICBHZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pIHsKKyAgICAgICAgaWYgKElYRkFfV2lkZ2V0KiBoR3JvdXBXaWRnZXQgPSBHZXRHcm91cE1peFhGQVdpZGdldCgpKSB7CisgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoR3JvdXBXaWRnZXQpOworICAgICAgICAgIGlmIChwWEZBV2lkZ2V0SGFuZGxlci0+SGFzRXZlbnQocEFjYywgZUV2ZW50VHlwZSkpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB7CisgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCk7CisgICAgICAgIHJldHVybiBwWEZBV2lkZ2V0SGFuZGxlci0+SGFzRXZlbnQocEFjYywgZUV2ZW50VHlwZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENQREZTREtfV2lkZ2V0OjpPblhGQUFBY3Rpb24oUERGU0RLX1hGQUFBY3Rpb25UeXBlIGVYRkFBQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBBU1NFUlQobV9wUGFnZVZpZXcgIT0gTlVMTCk7CisKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworICBBU1NFUlQocFNES0RvYyAhPSBOVUxMKTsKKworICBDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0RG9jdW1lbnQoKTsKKyAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7CisKKyAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpIHsKKyAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUgPSBHZXRYRkFFdmVudFR5cGUoZVhGQUFBVCk7CisKKyAgICBpZiAoZUV2ZW50VHlwZSAhPSBYRkFfRVZFTlRfVW5rbm93bikgeworICAgICAgaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpIHsKKyAgICAgICAgQ1hGQV9FdmVudFBhcmFtIHBhcmFtOworICAgICAgICBwYXJhbS5tX2VUeXBlID0gZUV2ZW50VHlwZTsKKyAgICAgICAgcGFyYW0ubV93c0NoYW5nZSA9IGRhdGEuc0NoYW5nZTsKKyAgICAgICAgcGFyYW0ubV9pQ29tbWl0S2V5ID0gZGF0YS5uQ29tbWl0S2V5OworICAgICAgICBwYXJhbS5tX2JTaGlmdCA9IGRhdGEuYlNoaWZ0OworICAgICAgICBwYXJhbS5tX2lTZWxTdGFydCA9IGRhdGEublNlbFN0YXJ0OworICAgICAgICBwYXJhbS5tX2lTZWxFbmQgPSBkYXRhLm5TZWxFbmQ7CisgICAgICAgIHBhcmFtLm1fd3NGdWxsVGV4dCA9IGRhdGEuc1ZhbHVlOworICAgICAgICBwYXJhbS5tX2JLZXlEb3duID0gZGF0YS5iS2V5RG93bjsKKyAgICAgICAgcGFyYW0ubV9iTW9kaWZpZXIgPSBkYXRhLmJNb2RpZmllcjsKKyAgICAgICAgcGFyYW0ubV93c05ld1RleHQgPSBkYXRhLnNWYWx1ZTsKKyAgICAgICAgaWYgKGRhdGEublNlbEVuZCA+IGRhdGEublNlbFN0YXJ0KQorICAgICAgICAgIHBhcmFtLm1fd3NOZXdUZXh0LkRlbGV0ZShkYXRhLm5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5uU2VsRW5kIC0gZGF0YS5uU2VsU3RhcnQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEuc0NoYW5nZS5HZXRMZW5ndGgoKTsgaSsrKQorICAgICAgICAgIHBhcmFtLm1fd3NOZXdUZXh0Lkluc2VydChkYXRhLm5TZWxTdGFydCwgZGF0YS5zQ2hhbmdlW2ldKTsKKyAgICAgICAgcGFyYW0ubV93c1ByZXZUZXh0ID0gZGF0YS5zVmFsdWU7CisKKyAgICAgICAgaWYgKChlRXZlbnRUeXBlID09IFhGQV9FVkVOVF9DbGljayB8fCBlRXZlbnRUeXBlID09IFhGQV9FVkVOVF9DaGFuZ2UpICYmCisgICAgICAgICAgICBHZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pIHsKKyAgICAgICAgICBpZiAoSVhGQV9XaWRnZXQqIGhHcm91cFdpZGdldCA9IEdldEdyb3VwTWl4WEZBV2lkZ2V0KCkpIHsKKyAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaEdyb3VwV2lkZ2V0KTsKKyAgICAgICAgICAgIHBhcmFtLm1fcFRhcmdldCA9IHBBY2M7CisgICAgICAgICAgICBwWEZBV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBBY2MsICZwYXJhbSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgeworICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KTsKKyAgICAgICAgICAgIHBhcmFtLm1fcFRhcmdldCA9IHBBY2M7CisgICAgICAgICAgICBpbnQzMl90IG5SZXQgPSBwWEZBV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBBY2MsICZwYXJhbSk7CisgICAgICAgICAgICByZXR1cm4gblJldCA9PSBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCk7CisgICAgICAgICAgcGFyYW0ubV9wVGFyZ2V0ID0gcEFjYzsKKyAgICAgICAgICBpbnQzMl90IG5SZXQgPSBwWEZBV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBBY2MsICZwYXJhbSk7CisgICAgICAgICAgcmV0dXJuIG5SZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKElYRkFfRG9jVmlldyogcERvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCkpIHsKKyAgICAgICAgICBwRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpTeW5jaHJvbml6ZShGWF9CT09MIGJTeW5jaHJvbml6ZUVsc2UpIHsKKyAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpIHsKKyAgICBpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHRoaXMtPkdldFhGQVdpZGdldEhhbmRsZXIoKSkgeworICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKKyAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkgeworICAgICAgICBzd2l0Y2ggKEdldEZpZWxkVHlwZSgpKSB7CisgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CisgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046IHsKKyAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CisgICAgICAgICAgICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOworCisgICAgICAgICAgICBYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSA9CisgICAgICAgICAgICAgICAgcEZvcm1DdHJsLT5Jc0NoZWNrZWQoKSA/IFhGQV9DSEVDS1NUQVRFX09uIDogWEZBX0NIRUNLU1RBVEVfT2ZmOworICAgICAgICAgICAgcFdpZGdldEFjYy0+U2V0Q2hlY2tTdGF0ZShlQ2hlY2tTdGF0ZSk7CisgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CisgICAgICAgICAgICBwV2lkZ2V0QWNjLT5TZXRWYWx1ZShwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogeworICAgICAgICAgICAgcFdpZGdldEFjYy0+Q2xlYXJBbGxTZWxlY3Rpb25zKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpOyBpIDwgc3o7CisgICAgICAgICAgICAgICAgIGkrKykgeworICAgICAgICAgICAgICBpbnQgbkluZGV4ID0gcEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChpKTsKKyAgICAgICAgICAgICAgaWYgKG5JbmRleCA+IC0xICYmIG5JbmRleCA8IHBXaWRnZXRBY2MtPkNvdW50Q2hvaWNlTGlzdEl0ZW1zKCkpCisgICAgICAgICAgICAgICAgcFdpZGdldEFjYy0+U2V0SXRlbVN0YXRlKG5JbmRleCwgVFJVRSwgRkFMU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6IHsKKyAgICAgICAgICAgIHBXaWRnZXRBY2MtPkNsZWFyQWxsU2VsZWN0aW9ucygpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaSA8IHN6OworICAgICAgICAgICAgICAgICBpKyspIHsKKyAgICAgICAgICAgICAgaW50IG5JbmRleCA9IHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaSk7CisgICAgICAgICAgICAgIGlmIChuSW5kZXggPiAtMSAmJiBuSW5kZXggPCBwV2lkZ2V0QWNjLT5Db3VudENob2ljZUxpc3RJdGVtcygpKQorICAgICAgICAgICAgICAgIHBXaWRnZXRBY2MtPlNldEl0ZW1TdGF0ZShuSW5kZXgsIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBXaWRnZXRBY2MtPlNldFZhbHVlKHBGb3JtRmllbGQtPkdldFZhbHVlKCksIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiU3luY2hyb25pemVFbHNlKQorICAgICAgICAgIHBXaWRnZXRBY2MtPlByb2Nlc3NWYWx1ZUNoYW5nZWQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6U3luY2hyb25pemVYRkFWYWx1ZSgpIHsKKyAgQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOworCisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7CisKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7CisgIEFTU0VSVChwRG9jICE9IE5VTEwpOworCisgIElYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCk7CisgIGlmICghcFhGQURvY1ZpZXcpCisgICAgcmV0dXJuOworCisgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKSB7CisgICAgaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpIHsKKyAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgICAgIEFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CisKKyAgICAgIENQREZTREtfV2lkZ2V0OjpTeW5jaHJvbml6ZVhGQVZhbHVlKHBYRkFEb2NWaWV3LCBoV2lkZ2V0LCBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1DdHJsKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6U3luY2hyb25pemVYRkFJdGVtcygpIHsKKyAgQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOworCisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7CisKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7CisgIEFTU0VSVChwRG9jICE9IE5VTEwpOworCisgIElYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCk7CisgIGlmICghcFhGQURvY1ZpZXcpCisgICAgcmV0dXJuOworCisgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKSB7CisgICAgaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpIHsKKyAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgICAgU3luY2hyb25pemVYRkFJdGVtcyhwWEZBRG9jVmlldywgaFdpZGdldCwgcEZvcm1GaWVsZCwgTlVMTCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlN5bmNocm9uaXplWEZBVmFsdWUoSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9XaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wpIHsKKyAgQVNTRVJUKHBYRkFEb2NWaWV3ICE9IE5VTEwpOworICBBU1NFUlQoaFdpZGdldCAhPSBOVUxMKTsKKworICBpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHBYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCkpIHsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBBU1NFUlQocEZvcm1Db250cm9sICE9IE5VTEwpOworCisgICAgc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkgeworICAgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6IHsKKyAgICAgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0KKyAgICAgICAgICAgICAgICBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkgeworICAgICAgICAgIEZYX0JPT0wgYkNoZWNrZWQgPSBwV2lkZ2V0QWNjLT5HZXRDaGVja1N0YXRlKCkgPT0gWEZBX0NIRUNLU1RBVEVfT247CisKKyAgICAgICAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wocEZvcm1GaWVsZC0+R2V0Q29udHJvbEluZGV4KHBGb3JtQ29udHJvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaGVja2VkLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOiB7CisgICAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9CisgICAgICAgICAgICAgICAgcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpIHsKKyAgICAgICAgICBGWF9CT09MIGJDaGVja2VkID0gcFdpZGdldEFjYy0+R2V0Q2hlY2tTdGF0ZSgpID09IFhGQV9DSEVDS1NUQVRFX09uOworCisgICAgICAgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKHBGb3JtRmllbGQtPkdldENvbnRyb2xJbmRleChwRm9ybUNvbnRyb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hlY2tlZCwgVFJVRSk7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6IHsKKyAgICAgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0KKyAgICAgICAgICAgICAgICBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkgeworICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZTsKKyAgICAgICAgICBwV2lkZ2V0QWNjLT5HZXRWYWx1ZShzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7CisgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc1ZhbHVlLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6IHsKKyAgICAgICAgcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oRkFMU0UpOworCisgICAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9CisgICAgICAgICAgICAgICAgcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwV2lkZ2V0QWNjLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICAgIGludCBuSW5kZXggPSBwV2lkZ2V0QWNjLT5HZXRTZWxlY3RlZEl0ZW0oaSk7CisKKyAgICAgICAgICAgIGlmIChuSW5kZXggPiAtMSAmJiBuSW5kZXggPCBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSkgeworICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKG5JbmRleCwgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6IHsKKyAgICAgICAgcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oRkFMU0UpOworCisgICAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9CisgICAgICAgICAgICAgICAgcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwV2lkZ2V0QWNjLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICAgIGludCBuSW5kZXggPSBwV2lkZ2V0QWNjLT5HZXRTZWxlY3RlZEl0ZW0oaSk7CisKKyAgICAgICAgICAgIGlmIChuSW5kZXggPiAtMSAmJiBuSW5kZXggPCBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSkgeworICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKG5JbmRleCwgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlOworICAgICAgICAgIHBXaWRnZXRBY2MtPkdldFZhbHVlKHNWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKKyAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRWYWx1ZShzVmFsdWUsIFRSVUUpOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpTeW5jaHJvbml6ZVhGQUl0ZW1zKElYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYRkFfV2lkZ2V0KiBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKSB7CisgIEFTU0VSVChwWEZBRG9jVmlldyAhPSBOVUxMKTsKKyAgQVNTRVJUKGhXaWRnZXQgIT0gTlVMTCk7CisKKyAgaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSBwWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpKSB7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKSB7CisgICAgICBjYXNlIEZJRUxEVFlQRV9MSVNUQk9YOiB7CisgICAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKEZBTFNFKTsKKyAgICAgICAgcEZvcm1GaWVsZC0+Q2xlYXJPcHRpb25zKFRSVUUpOworCisgICAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9CisgICAgICAgICAgICAgICAgcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwV2lkZ2V0QWNjLT5Db3VudENob2ljZUxpc3RJdGVtcygpOyBpIDwgc3o7CisgICAgICAgICAgICAgICBpKyspIHsKKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VGV4dDsKKyAgICAgICAgICAgIHBXaWRnZXRBY2MtPkdldENob2ljZUxpc3RJdGVtKHN3VGV4dCwgaSk7CisKKyAgICAgICAgICAgIHBGb3JtRmllbGQtPkluc2VydE9wdGlvbihzd1RleHQsIGksIFRSVUUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOiB7CisgICAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKEZBTFNFKTsKKyAgICAgICAgcEZvcm1GaWVsZC0+Q2xlYXJPcHRpb25zKEZBTFNFKTsKKworICAgICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPQorICAgICAgICAgICAgICAgIHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcFdpZGdldEFjYy0+Q291bnRDaG9pY2VMaXN0SXRlbXMoKTsgaSA8IHN6OworICAgICAgICAgICAgICAgaSsrKSB7CisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1RleHQ7CisgICAgICAgICAgICBwV2lkZ2V0QWNjLT5HZXRDaG9pY2VMaXN0SXRlbShzd1RleHQsIGkpOworCisgICAgICAgICAgICBwRm9ybUZpZWxkLT5JbnNlcnRPcHRpb24oc3dUZXh0LCBpLCBGQUxTRSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoTCIiLCBUUlVFKTsKKyAgICAgIH0gYnJlYWs7CisgICAgfQorICB9Cit9CisKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OklzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKAorICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFQIik7CisgIGlmICghcEFQKQogICAgIHJldHVybiBGQUxTRTsKLX0KIAotRlhfRkxPQVQgQ1BERlNES19XaWRnZXQ6OkdldEZvbnRTaXplKCkgY29uc3QKLXsKLSAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOwotICAgIEFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CisgIC8vIENob29zZSB0aGUgcmlnaHQgc3ViLWFwCisgIGNvbnN0IEZYX0NIQVIqIGFwX2VudHJ5ID0gIk4iOworICBpZiAobW9kZSA9PSBDUERGX0Fubm90OjpEb3duKQorICAgIGFwX2VudHJ5ID0gIkQiOworICBlbHNlIGlmIChtb2RlID09IENQREZfQW5ub3Q6OlJvbGxvdmVyKQorICAgIGFwX2VudHJ5ID0gIlIiOworICBpZiAoIXBBUC0+S2V5RXhpc3QoYXBfZW50cnkpKQorICAgIGFwX2VudHJ5ID0gIk4iOwogCi0gICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBwRGEgPSBwRm9ybUN0cmwtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250ID0gIiI7Ci0gICAgRlhfRkxPQVQgZkZvbnRTaXplID0gMC4wZjsKLSAgICBwRGEuR2V0Rm9udChjc0ZvbnQsIGZGb250U2l6ZSk7CisgIC8vIEdldCB0aGUgQVAgc3RyZWFtIG9yIHN1YmRpcmVjdG9yeQorICBDUERGX09iamVjdCogcHN1YiA9IHBBUC0+R2V0RWxlbWVudFZhbHVlKGFwX2VudHJ5KTsKKyAgaWYgKCFwc3ViKQorICAgIHJldHVybiBGQUxTRTsKIAotICAgIHJldHVybiBmRm9udFNpemU7Ci19Ci0KLWludAlDUERGU0RLX1dpZGdldDo6R2V0U2VsZWN0ZWRJbmRleChpbnQgbkluZGV4KQotewotCWlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKQotCXsKLQkJaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpCi0JCXsKLQkJCWlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKQotCQkJewotCQkJCWlmIChuSW5kZXggPCBwV2lkZ2V0QWNjLT5Db3VudFNlbGVjdGVkSXRlbXMoKSkKLQkJCQkJcmV0dXJuIHBXaWRnZXRBY2MtPkdldFNlbGVjdGVkSXRlbShuSW5kZXgpOwotCQkJfQotCQl9Ci0JfQotCi0JQ1BERl9Gb3JtRmllbGQqCXBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKLQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KG5JbmRleCk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXRWYWx1ZShGWF9CT09MIGJEaXNwbGF5KQotewotCWlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKQotCXsKLQkJaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpCi0JCXsKLQkJCWlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKQotCQkJewotCQkJCUNGWF9XaWRlU3RyaW5nIHNWYWx1ZTsKLQkJCQlwV2lkZ2V0QWNjLT5HZXRWYWx1ZShzVmFsdWUsIGJEaXNwbGF5ID8gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5IDogWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsKLQkJCQlyZXR1cm4gc1ZhbHVlOwotCQkJfQotCQl9Ci0JfQotCi0JQ1BERl9Gb3JtRmllbGQqCXBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKLQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0RGVmYXVsdFZhbHVlKCkgY29uc3QKLXsKLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgcmV0dXJuIHBGb3JtRmllbGQtPkdldERlZmF1bHRWYWx1ZSgpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0T3B0aW9uTGFiZWwoaW50IG5JbmRleCkgY29uc3QKLXsKLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgcmV0dXJuIHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKG5JbmRleCk7Ci19Ci0KLWludCBDUERGU0RLX1dpZGdldDo6Q291bnRPcHRpb25zKCkgY29uc3QKLXsKLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgcmV0dXJuIHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOwotfQotCi1GWF9CT09MCUNQREZTREtfV2lkZ2V0OjpJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpCi17Ci0JaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpCi0JewotCQlpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHRoaXMtPkdldFhGQVdpZGdldEhhbmRsZXIoKSkKLQkJewotCQkJaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpCi0JCQl7Ci0JCQkJaWYgKG5JbmRleCA+IC0xICYmIG5JbmRleCA8IHBXaWRnZXRBY2MtPkNvdW50Q2hvaWNlTGlzdEl0ZW1zKCkpCi0JCQkJCXJldHVybiBwV2lkZ2V0QWNjLT5HZXRJdGVtU3RhdGUobkluZGV4KTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQkJCX0KLQkJfQotCX0KLQotCUNQREZfRm9ybUZpZWxkKglwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0gICAgcmV0dXJuIHBGb3JtRmllbGQtPklzSXRlbVNlbGVjdGVkKG5JbmRleCk7Ci19Ci0KLWludCBDUERGU0RLX1dpZGdldDo6R2V0VG9wVmlzaWJsZUluZGV4KCkgY29uc3QKLXsKLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotICAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRUb3BWaXNpYmxlSW5kZXgoKTsKLX0KLQotRlhfQk9PTAlDUERGU0RLX1dpZGdldDo6SXNDaGVja2VkKCkKLXsKLQlpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHRoaXMtPkdldFhGQVdpZGdldEhhbmRsZXIoKSkKLQl7Ci0JCWlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKQotCQl7Ci0JCQlpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkKLQkJCXsKLQkJCQlGWF9CT09MIGJDaGVja2VkID0gcFdpZGdldEFjYy0+R2V0Q2hlY2tTdGF0ZSgpID09IFhGQV9DSEVDS1NUQVRFX09uOwotCQkJCXJldHVybiBiQ2hlY2tlZDsKLQkJCX0KLQkJfQotCX0KLQotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0JQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQotICAgIHJldHVybiBwRm9ybUN0cmwtPklzQ2hlY2tlZCgpOwotfQotCi1pbnQgQ1BERlNES19XaWRnZXQ6OkdldEFsaWdubWVudCgpIGNvbnN0Ci17Ci0gICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKLSAgICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOwotCi0gICAgcmV0dXJuIHBGb3JtQ3RybC0+R2V0Q29udHJvbEFsaWdubWVudCgpOwotfQotCi1pbnQgQ1BERlNES19XaWRnZXQ6OkdldE1heExlbigpIGNvbnN0Ci17Ci0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKLSAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRNYXhMZW4oKTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5KQotewotICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0gICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQotICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gcEZvcm1DdHJsLT5HZXRGaWVsZCgpOwotICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0JcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKHBGb3JtRmllbGQtPkdldENvbnRyb2xJbmRleChwRm9ybUN0cmwpLCBiQ2hlY2tlZCwgYk5vdGlmeSk7Ci0JaWYgKCFJc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpOb3JtYWwpKQotCQlSZXNldEFwcGVhcmFuY2UoVFJVRSk7Ci0JaWYgKCFiTm90aWZ5KQotCQlTeW5jaHJvbml6ZShUUlVFKTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KQotewotICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0gICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQlwRm9ybUZpZWxkLT5TZXRWYWx1ZShzVmFsdWUsIGJOb3RpZnkpOwotCi0JaWYgKCFiTm90aWZ5KQotCQlTeW5jaHJvbml6ZShUUlVFKTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0RGVmYXVsdFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUpCi17Ci19Ci12b2lkIENQREZTREtfV2lkZ2V0OjpTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KQotewotICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0gICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQlwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGluZGV4LCBiU2VsZWN0ZWQsIGJOb3RpZnkpOwotCi0JaWYgKCFiTm90aWZ5KQotCQlTeW5jaHJvbml6ZShUUlVFKTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6Q2xlYXJTZWxlY3Rpb24oRlhfQk9PTCBiTm90aWZ5KQotewotICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0gICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQlwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbihiTm90aWZ5KTsKLQotCWlmICghYk5vdGlmeSkKLQkJU3luY2hyb25pemUoVFJVRSk7Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlNldFRvcFZpc2libGVJbmRleChpbnQgaW5kZXgpCi17Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlNldEFwcE1vZGlmaWVkKCkKLXsKLSAgICBtX2JBcHBNb2RpZmllZCA9IFRSVUU7Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OkNsZWFyQXBwTW9kaWZpZWQoKQotewotICAgIG1fYkFwcE1vZGlmaWVkID0gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OklzQXBwTW9kaWZpZWQoKSBjb25zdAotewotICAgIHJldHVybiBtX2JBcHBNb2RpZmllZDsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlKEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCkKLXsKLQlzd2l0Y2ggKEdldEZpZWxkVHlwZSgpKQotCXsKLQljYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6Ci0JY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6Ci0JCXsKLQkJCUZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7Ci0JCQlDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSB0aGlzLT5PbkZvcm1hdChiRm9ybWF0ZWQpOwotCQkJaWYgKGJGb3JtYXRlZCkKLQkJCQl0aGlzLT5SZXNldEFwcGVhcmFuY2Uoc1ZhbHVlLCBUUlVFKTsKLQkJCWVsc2UKLQkJCQl0aGlzLT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgVFJVRSk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdGhpcy0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2UoY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSwgRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKQotewotICAgIFNldEFwcE1vZGlmaWVkKCk7Ci0KLSAgICBtX25BcHBBZ2UrKzsKLSAgICBpZiAobV9uQXBwQWdlID4gOTk5OTk5KQotICAgICAgICBtX25BcHBBZ2UgPSAwOwotICAgIGlmIChiVmFsdWVDaGFuZ2VkKQotICAgICAgICBtX25WYWx1ZUFnZSsrOwotCi0gICAgaW50IG5GaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKLQotICAgIHN3aXRjaCAobkZpZWxkVHlwZSkKLSAgICB7CisgIGludCBuRmllbGRUeXBlID0gR2V0RmllbGRUeXBlKCk7CisgIHN3aXRjaCAobkZpZWxkVHlwZSkgewogICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046Ci0gICAgICAgIFJlc2V0QXBwZWFyYW5jZV9QdXNoQnV0dG9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotICAgICAgICBSZXNldEFwcGVhcmFuY2VfQ2hlY2tCb3goKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046Ci0gICAgICAgIFJlc2V0QXBwZWFyYW5jZV9SYWRpb0J1dHRvbigpOwotICAgICAgICBicmVhazsKICAgICBjYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKLSAgICAgICAgUmVzZXRBcHBlYXJhbmNlX0NvbWJvQm94KHNWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwogICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6Ci0gICAgICAgIFJlc2V0QXBwZWFyYW5jZV9MaXN0Qm94KCk7Ci0gICAgICAgIGJyZWFrOwogICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKLSAgICAgICAgUmVzZXRBcHBlYXJhbmNlX1RleHRGaWVsZChzVmFsdWUpOwotICAgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9TSUdOQVRVUkU6CisgICAgICByZXR1cm4gcHN1Yi0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU07CisgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CisgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CisgICAgICBpZiAocHN1Yi0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7CisgICAgICAgIENQREZfRGljdGlvbmFyeSogcFN1YkRpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5Kilwc3ViOworICAgICAgICByZXR1cm4gcFN1YkRpY3QtPkdldFN0cmVhbShHZXRBcHBTdGF0ZSgpKSAhPSBOVUxMOworICAgICAgfQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgQ1BERlNES19XaWRnZXQ6OkdldEZpZWxkVHlwZSgpIGNvbnN0IHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICBBU1NFUlQocEZpZWxkICE9IE5VTEwpOworCisgIHJldHVybiBwRmllbGQtPkdldEZpZWxkVHlwZSgpOworfQorCitGWF9CT09MIENQREZTREtfV2lkZ2V0OjpJc0FwcGVhcmFuY2VWYWxpZCgpIHsKKyAgQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOworCisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7CisKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldERvY3VtZW50KCk7CisgIEFTU0VSVChwRG9jICE9IE5VTEwpOworCisgIGludCBuRG9jVHlwZSA9IHBEb2MtPkdldERvY1R5cGUoKTsKKyAgaWYgKG5Eb2NUeXBlID09IERPQ1RZUEVfUERGIHx8IG5Eb2NUeXBlID09IERPQ1RZUEVfU1RBVElDX1hGQSkKKyAgICByZXR1cm4gQ1BERlNES19CQUFubm90OjpJc0FwcGVhcmFuY2VWYWxpZCgpOworCisgIHJldHVybiBUUlVFOworfQorCitpbnQgQ1BERlNES19XaWRnZXQ6OkdldEZpZWxkRmxhZ3MoKSBjb25zdCB7CisgIENQREZfSW50ZXJGb3JtKiBwUERGSW50ZXJGb3JtID0gbV9wSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBQREZJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0KKyAgICAgIHBQREZJbnRlckZvcm0tPkdldENvbnRyb2xCeURpY3QobV9wQW5ub3QtPkdldEFubm90RGljdCgpKTsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwRm9ybUNvbnRyb2wtPkdldEZpZWxkKCk7CisgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7Cit9CisKK0NGWF9CeXRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXRTdWJUeXBlKCkgY29uc3QgeworICBpbnQgblR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKKworICBpZiAoblR5cGUgPT0gRklFTERUWVBFX1NJR05BVFVSRSkKKyAgICByZXR1cm4gQkZGVF9TSUdOQVRVUkU7CisgIHJldHVybiBDUERGU0RLX0Fubm90OjpHZXRTdWJUeXBlKCk7Cit9CisKK0NQREZfRm9ybUZpZWxkKiBDUERGU0RLX1dpZGdldDo6R2V0Rm9ybUZpZWxkKCkgY29uc3QgeworICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQVNTRVJUKHBDdHJsICE9IE5VTEwpOworCisgIHJldHVybiBwQ3RybC0+R2V0RmllbGQoKTsKK30KKworQ1BERl9Gb3JtQ29udHJvbCogQ1BERlNES19XaWRnZXQ6OkdldEZvcm1Db250cm9sKCkgY29uc3QgeworICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOworCisgIENQREZfSW50ZXJGb3JtKiBwUERGSW50ZXJGb3JtID0gbV9wSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBQREZJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBQREZJbnRlckZvcm0tPkdldENvbnRyb2xCeURpY3QoR2V0QW5ub3REaWN0KCkpOworfQorCitDUERGX0Zvcm1Db250cm9sKiBDUERGU0RLX1dpZGdldDo6R2V0Rm9ybUNvbnRyb2woQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7CisgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworICBBU1NFUlQocEFubm90RGljdCAhPSBOVUxMKTsKKworICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IHBJbnRlckZvcm0tPkdldENvbnRyb2xCeURpY3QocEFubm90RGljdCk7CisKKyAgcmV0dXJuIHBDb250cm9sOworfQorCitpbnQgQ1BERlNES19XaWRnZXQ6OkdldFJvdGF0ZSgpIGNvbnN0IHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOworICBBU1NFUlQocEN0cmwgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBDdHJsLT5HZXRSb3RhdGlvbigpICUgMzYwOworfQorCitDRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0TmFtZSgpIHsKKyAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0RnVsbE5hbWUoKTsKK30KKworRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6R2V0RmlsbENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3QgeworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOworICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOworCisgIGludCBpQ29sb3JUeXBlID0gMDsKKyAgY29sb3IgPSBGWF9BUkdCVE9DT0xPUlJFRihwRm9ybUN0cmwtPkdldEJhY2tncm91bmRDb2xvcihpQ29sb3JUeXBlKSk7CisKKyAgcmV0dXJuIGlDb2xvclR5cGUgIT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworfQorCitGWF9CT09MIENQREZTREtfV2lkZ2V0OjpHZXRCb3JkZXJDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0IHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKKworICBpbnQgaUNvbG9yVHlwZSA9IDA7CisgIGNvbG9yID0gRlhfQVJHQlRPQ09MT1JSRUYocEZvcm1DdHJsLT5HZXRCb3JkZXJDb2xvcihpQ29sb3JUeXBlKSk7CisKKyAgcmV0dXJuIGlDb2xvclR5cGUgIT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworfQorCitGWF9CT09MIENQREZTREtfV2lkZ2V0OjpHZXRUZXh0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdCB7CisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CisgIEFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CisKKyAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBkYSA9IHBGb3JtQ3RybC0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKKyAgaWYgKGRhLkhhc0NvbG9yKCkpIHsKKyAgICBGWF9BUkdCIGFyZ2I7CisgICAgaW50IGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CisgICAgZGEuR2V0Q29sb3IoYXJnYiwgaUNvbG9yVHlwZSk7CisgICAgY29sb3IgPSBGWF9BUkdCVE9DT0xPUlJFRihhcmdiKTsKKworICAgIHJldHVybiBpQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworRlhfRkxPQVQgQ1BERlNES19XaWRnZXQ6OkdldEZvbnRTaXplKCkgY29uc3QgeworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOworICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOworCisgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgcERhID0gcEZvcm1DdHJsLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOworICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnQgPSAiIjsKKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gMC4wZjsKKyAgcERhLkdldEZvbnQoY3NGb250LCBmRm9udFNpemUpOworCisgIHJldHVybiBmRm9udFNpemU7Cit9CisKK2ludCBDUERGU0RLX1dpZGdldDo6R2V0U2VsZWN0ZWRJbmRleChpbnQgbkluZGV4KSB7CisgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKSB7CisgICAgaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpIHsKKyAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKSB7CisgICAgICAgIGlmIChuSW5kZXggPCBwV2lkZ2V0QWNjLT5Db3VudFNlbGVjdGVkSXRlbXMoKSkKKyAgICAgICAgICByZXR1cm4gcFdpZGdldEFjYy0+R2V0U2VsZWN0ZWRJdGVtKG5JbmRleCk7CisgICAgICB9CiAgICAgfQorICB9CiAKLSAgICBBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0gICAgbV9wQW5ub3QtPkNsZWFyQ2FjaGVkQVAoKTsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgobkluZGV4KTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6Ok9uRm9ybWF0KEZYX0JPT0wmIGJGb3JtYXRlZCkKLXsKLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotICAgIHJldHVybiBtX3BJbnRlckZvcm0tPk9uRm9ybWF0KHBGb3JtRmllbGQsIGJGb3JtYXRlZCk7Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0RmllbGRBcHBlYXJhbmNlKEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCkKLXsKLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKLQotICAgIG1fcEludGVyRm9ybS0+UmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgYlZhbHVlQ2hhbmdlZCk7Ci19Ci0KLXZvaWQgICAgQ1BERlNES19XaWRnZXQ6OkRyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0gICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCi17Ci0gICAgaW50IG5GaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKLQotICAgIGlmICgobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1ggfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pICYmCi0gICAgICAgIG1vZGUgPT0gQ1BERl9Bbm5vdDo6Tm9ybWFsICYmCi0gICAgICAgICFJc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpOb3JtYWwpKQotICAgIHsKLSAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGhEYXRhOwotCi0gICAgICAgIENQREZfUmVjdCByY0Fubm90ID0gR2V0UmVjdCgpOwotCi0gICAgICAgIHBhdGhEYXRhLkFwcGVuZFJlY3QocmNBbm5vdC5sZWZ0LCByY0Fubm90LmJvdHRvbSwKLSAgICAgICAgICAgIHJjQW5ub3QucmlnaHQsIHJjQW5ub3QudG9wKTsKLQotICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotICAgICAgICBnc2QubV9MaW5lV2lkdGggPSAwLjBmOwotCi0JCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoRGF0YSwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLCAweEZGQUFBQUFBLCBGWEZJTExfQUxURVJOQVRFKTsKLQl9Ci0JZWxzZQotCXsKLQkJQ1BERlNES19CQUFubm90OjpEcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1vZGUsIHBPcHRpb25zKTsKLQl9Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlVwZGF0ZUZpZWxkKCkKLXsKLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKLSAgICBtX3BJbnRlckZvcm0tPlVwZGF0ZUZpZWxkKHBGb3JtRmllbGQpOwotfQotCi12b2lkIENQREZTREtfV2lkZ2V0OjpEcmF3U2hhZG93KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLSAgICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgaW50IG5GaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKLSAgICBpZiAobV9wSW50ZXJGb3JtLT5Jc05lZWRIaWdoTGlnaHQobkZpZWxkVHlwZSkpCi0gICAgewotCi0vLyAgICAgICAgICBpZiAobkZpZWxkVHlwZSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLS8vICAgICAgICAgIHsKLSAgICAgICAgICAgIENQREZfUmVjdCByYyAgPSBHZXRSZWN0KCk7Ci0gICAgICAgICAgICBGWF9DT0xPUlJFRiBjb2xvciA9IG1fcEludGVyRm9ybS0+R2V0SGlnaGxpZ2h0Q29sb3IobkZpZWxkVHlwZSk7Ci0gICAgICAgICAgICB1aW50OF90IGFscGhhID0gbV9wSW50ZXJGb3JtLT5HZXRIaWdobGlnaHRBbHBoYSgpOwotCi0gICAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJjRGV2aWNlOwotICAgICAgICAgICAgQVNTRVJUKG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpLT5HZXRFbnYoKTsKLSAgICAgICAgICAgIGlmKCFwRW52KQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggcGFnZTJkZXZpY2U7Ci0gICAgICAgICAgICBwUGFnZVZpZXctPkdldEN1cnJlbnRNYXRyaXgocGFnZTJkZXZpY2UpOwotICAgICAgICAgICAgcGFnZTJkZXZpY2UuVHJhbnNmb3JtKCgoRlhfRkxPQVQpcmMubGVmdCksICgoRlhfRkxPQVQpcmMuYm90dG9tKSwgcmNEZXZpY2UubGVmdCwgcmNEZXZpY2UuYm90dG9tKTsKLS8vICAgICAgICAgIHBFbnYtPkZGSV9QYWdlVG9EZXZpY2UobV9wUGFnZVZpZXctPkdldFBERlBhZ2UoKSwgcmMubGVmdCwgcmMuYm90dG9tLCAmcmNEZXZpY2UubGVmdCwgJnJjRGV2aWNlLmJvdHRvbSk7Ci0vLyAgICAgICAgICBwRW52LT5GRklfUGFnZVRvRGV2aWNlKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIHJjLnJpZ2h0LCByYy50b3AsICZyY0RldmljZS5yaWdodCwgJnJjRGV2aWNlLnRvcCk7Ci0gICAgICAgICAgICBwYWdlMmRldmljZS5UcmFuc2Zvcm0oKChGWF9GTE9BVClyYy5yaWdodCksICgoRlhfRkxPQVQpcmMudG9wKSwgcmNEZXZpY2UucmlnaHQsIHJjRGV2aWNlLnRvcCk7Ci0KLSAgICAgICAgICAgIHJjRGV2aWNlLk5vcm1hbGl6ZSgpOwotCi0gICAgICAgICAgICBGWF9BUkdCIGFyZ2IgPSBBcmdiRW5jb2RlKChpbnQpYWxwaGEsIGNvbG9yKTsKLSAgICAgICAgICAgIEZYX1JFQ1QgcmNEZXYoKGludClyY0RldmljZS5sZWZ0LChpbnQpcmNEZXZpY2UudG9wLChpbnQpcmNEZXZpY2UucmlnaHQsKGludClyY0RldmljZS5ib3R0b20pOwotICAgICAgICAgICAgcERldmljZS0+RmlsbFJlY3QoJnJjRGV2LCBhcmdiKTsKLSAgICAgICAgICAgIC8qICAgICAgfSovCitDRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0VmFsdWUoRlhfQk9PTCBiRGlzcGxheSkgeworICBpZiAoSVhGQV9XaWRnZXQqIGhXaWRnZXQgPSB0aGlzLT5HZXRNaXhYRkFXaWRnZXQoKSkgeworICAgIGlmIChJWEZBX1dpZGdldEhhbmRsZXIqIHBYRkFXaWRnZXRIYW5kbGVyID0gdGhpcy0+R2V0WEZBV2lkZ2V0SGFuZGxlcigpKSB7CisgICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkgeworICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7CisgICAgICAgIHBXaWRnZXRBY2MtPkdldFZhbHVlKHNWYWx1ZSwgYkRpc3BsYXkgPyBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7CisgICAgICAgIHJldHVybiBzVmFsdWU7CisgICAgICB9CiAgICAgfQorICB9CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBGb3JtRmllbGQtPkdldFZhbHVlKCk7CiB9CiAKLXZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZV9QdXNoQnV0dG9uKCkKLXsKLSAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldEZvcm1Db250cm9sKCk7Ci0gICAgQVNTRVJUKHBDb250cm9sICE9IE5VTEwpOworQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldERlZmF1bHRWYWx1ZSgpIGNvbnN0IHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKKyAgcmV0dXJuIHBGb3JtRmllbGQtPkdldERlZmF1bHRWYWx1ZSgpOworfQogCitDRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0T3B0aW9uTGFiZWwoaW50IG5JbmRleCkgY29uc3QgeworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAotICAgIENQREZfUmVjdCByY1dpbmRvdyA9IEdldFJvdGF0ZWRSZWN0KCk7CisgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChuSW5kZXgpOworfQogCi0gICAgaW50MzJfdCBuTGF5b3V0ID0gMDsKK2ludCBDUERGU0RLX1dpZGdldDo6Q291bnRPcHRpb25zKCkgY29uc3QgeworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAotICAgIHN3aXRjaCAocENvbnRyb2wtPkdldFRleHRQb3NpdGlvbigpKQotICAgIHsKKyAgcmV0dXJuIHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOworfQorCitGWF9CT09MIENQREZTREtfV2lkZ2V0OjpJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpIHsKKyAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpIHsKKyAgICBpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHRoaXMtPkdldFhGQVdpZGdldEhhbmRsZXIoKSkgeworICAgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpIHsKKyAgICAgICAgaWYgKG5JbmRleCA+IC0xICYmIG5JbmRleCA8IHBXaWRnZXRBY2MtPkNvdW50Q2hvaWNlTGlzdEl0ZW1zKCkpCisgICAgICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPkdldEl0ZW1TdGF0ZShuSW5kZXgpOworCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICByZXR1cm4gcEZvcm1GaWVsZC0+SXNJdGVtU2VsZWN0ZWQobkluZGV4KTsKK30KKworaW50IENQREZTREtfV2lkZ2V0OjpHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdCB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRUb3BWaXNpYmxlSW5kZXgoKTsKK30KKworRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6SXNDaGVja2VkKCkgeworICBpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHRoaXMtPkdldFhGQVdpZGdldEhhbmRsZXIoKSkgeworICAgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKSB7CisgICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkgeworICAgICAgICBGWF9CT09MIGJDaGVja2VkID0gcFdpZGdldEFjYy0+R2V0Q2hlY2tTdGF0ZSgpID09IFhGQV9DSEVDS1NUQVRFX09uOworICAgICAgICByZXR1cm4gYkNoZWNrZWQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKKworICByZXR1cm4gcEZvcm1DdHJsLT5Jc0NoZWNrZWQoKTsKK30KKworaW50IENQREZTREtfV2lkZ2V0OjpHZXRBbGlnbm1lbnQoKSBjb25zdCB7CisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CisgIEFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBGb3JtQ3RybC0+R2V0Q29udHJvbEFsaWdubWVudCgpOworfQorCitpbnQgQ1BERlNES19XaWRnZXQ6OkdldE1heExlbigpIGNvbnN0IHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBGb3JtRmllbGQtPkdldE1heExlbigpOworfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXRDaGVjayhGWF9CT09MIGJDaGVja2VkLCBGWF9CT09MIGJOb3RpZnkpIHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBGb3JtQ3RybC0+R2V0RmllbGQoKTsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKHBGb3JtRmllbGQtPkdldENvbnRyb2xJbmRleChwRm9ybUN0cmwpLCBiQ2hlY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOb3RpZnkpOworICBpZiAoIUlzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6Ok5vcm1hbCkpCisgICAgUmVzZXRBcHBlYXJhbmNlKFRSVUUpOworICBpZiAoIWJOb3RpZnkpCisgICAgU3luY2hyb25pemUoVFJVRSk7Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSkgeworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICBwRm9ybUZpZWxkLT5TZXRWYWx1ZShzVmFsdWUsIGJOb3RpZnkpOworCisgIGlmICghYk5vdGlmeSkKKyAgICBTeW5jaHJvbml6ZShUUlVFKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6U2V0RGVmYXVsdFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUpIHt9Cit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSkgeworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGluZGV4LCBiU2VsZWN0ZWQsIGJOb3RpZnkpOworCisgIGlmICghYk5vdGlmeSkKKyAgICBTeW5jaHJvbml6ZShUUlVFKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6Q2xlYXJTZWxlY3Rpb24oRlhfQk9PTCBiTm90aWZ5KSB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKGJOb3RpZnkpOworCisgIGlmICghYk5vdGlmeSkKKyAgICBTeW5jaHJvbml6ZShUUlVFKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6U2V0VG9wVmlzaWJsZUluZGV4KGludCBpbmRleCkge30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6U2V0QXBwTW9kaWZpZWQoKSB7CisgIG1fYkFwcE1vZGlmaWVkID0gVFJVRTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6Q2xlYXJBcHBNb2RpZmllZCgpIHsKKyAgbV9iQXBwTW9kaWZpZWQgPSBGQUxTRTsKK30KKworRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6SXNBcHBNb2RpZmllZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYkFwcE1vZGlmaWVkOworfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKSB7CisgIHN3aXRjaCAoR2V0RmllbGRUeXBlKCkpIHsKKyAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CisgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6IHsKKyAgICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSB0aGlzLT5PbkZvcm1hdChiRm9ybWF0ZWQpOworICAgICAgaWYgKGJGb3JtYXRlZCkKKyAgICAgICAgdGhpcy0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZSwgVFJVRSk7CisgICAgICBlbHNlCisgICAgICAgIHRoaXMtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBUUlVFKTsKKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aGlzLT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgRkFMU0UpOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKSB7CisgIFNldEFwcE1vZGlmaWVkKCk7CisKKyAgbV9uQXBwQWdlKys7CisgIGlmIChtX25BcHBBZ2UgPiA5OTk5OTkpCisgICAgbV9uQXBwQWdlID0gMDsKKyAgaWYgKGJWYWx1ZUNoYW5nZWQpCisgICAgbV9uVmFsdWVBZ2UrKzsKKworICBpbnQgbkZpZWxkVHlwZSA9IEdldEZpZWxkVHlwZSgpOworCisgIHN3aXRjaCAobkZpZWxkVHlwZSkgeworICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CisgICAgICBSZXNldEFwcGVhcmFuY2VfUHVzaEJ1dHRvbigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CisgICAgICBSZXNldEFwcGVhcmFuY2VfQ2hlY2tCb3goKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgorICAgICAgUmVzZXRBcHBlYXJhbmNlX1JhZGlvQnV0dG9uKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKKyAgICAgIFJlc2V0QXBwZWFyYW5jZV9Db21ib0JveChzVmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDoKKyAgICAgIFJlc2V0QXBwZWFyYW5jZV9MaXN0Qm94KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CisgICAgICBSZXNldEFwcGVhcmFuY2VfVGV4dEZpZWxkKHNWYWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorCisgIEFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKKyAgbV9wQW5ub3QtPkNsZWFyQ2FjaGVkQVAoKTsKK30KKworQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6Ok9uRm9ybWF0KEZYX0JPT0wmIGJGb3JtYXRlZCkgeworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgcmV0dXJuIG1fcEludGVyRm9ybS0+T25Gb3JtYXQocEZvcm1GaWVsZCwgYkZvcm1hdGVkKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRGaWVsZEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKSB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgIEFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgbV9wSW50ZXJGb3JtLT5SZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBOVUxMLCBiVmFsdWVDaGFuZ2VkKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6RHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworICBpbnQgbkZpZWxkVHlwZSA9IEdldEZpZWxkVHlwZSgpOworCisgIGlmICgobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1ggfHwKKyAgICAgICBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikgJiYKKyAgICAgIG1vZGUgPT0gQ1BERl9Bbm5vdDo6Tm9ybWFsICYmCisgICAgICAhSXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6Tm9ybWFsKSkgeworICAgIENGWF9QYXRoRGF0YSBwYXRoRGF0YTsKKworICAgIENQREZfUmVjdCByY0Fubm90ID0gR2V0UmVjdCgpOworCisgICAgcGF0aERhdGEuQXBwZW5kUmVjdChyY0Fubm90LmxlZnQsIHJjQW5ub3QuYm90dG9tLCByY0Fubm90LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgcmNBbm5vdC50b3ApOworCisgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgICBnc2QubV9MaW5lV2lkdGggPSAwLjBmOworCisgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGhEYXRhLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIDB4RkZBQUFBQUEsCisgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CisgIH0gZWxzZSB7CisgICAgQ1BERlNES19CQUFubm90OjpEcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1vZGUsIHBPcHRpb25zKTsKKyAgfQorfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpVcGRhdGVGaWVsZCgpIHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKKyAgbV9wSW50ZXJGb3JtLT5VcGRhdGVGaWVsZChwRm9ybUZpZWxkKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6RHJhd1NoYWRvdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKKworICBpbnQgbkZpZWxkVHlwZSA9IEdldEZpZWxkVHlwZSgpOworICBpZiAobV9wSW50ZXJGb3JtLT5Jc05lZWRIaWdoTGlnaHQobkZpZWxkVHlwZSkpIHsKKyAgICAvLyAgICAgICAgICBpZiAobkZpZWxkVHlwZSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKKyAgICAvLyAgICAgICAgICB7CisgICAgQ1BERl9SZWN0IHJjID0gR2V0UmVjdCgpOworICAgIEZYX0NPTE9SUkVGIGNvbG9yID0gbV9wSW50ZXJGb3JtLT5HZXRIaWdobGlnaHRDb2xvcihuRmllbGRUeXBlKTsKKyAgICB1aW50OF90IGFscGhhID0gbV9wSW50ZXJGb3JtLT5HZXRIaWdobGlnaHRBbHBoYSgpOworCisgICAgQ0ZYX0Zsb2F0UmVjdCByY0RldmljZTsKKyAgICBBU1NFUlQobV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpKTsKKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpLT5HZXRFbnYoKTsKKyAgICBpZiAoIXBFbnYpCisgICAgICByZXR1cm47CisgICAgQ0ZYX0FmZmluZU1hdHJpeCBwYWdlMmRldmljZTsKKyAgICBwUGFnZVZpZXctPkdldEN1cnJlbnRNYXRyaXgocGFnZTJkZXZpY2UpOworICAgIHBhZ2UyZGV2aWNlLlRyYW5zZm9ybSgoKEZYX0ZMT0FUKXJjLmxlZnQpLCAoKEZYX0ZMT0FUKXJjLmJvdHRvbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJjRGV2aWNlLmxlZnQsIHJjRGV2aWNlLmJvdHRvbSk7CisgICAgLy8gICAgICAgICAgcEVudi0+RkZJX1BhZ2VUb0RldmljZShtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpLCByYy5sZWZ0LAorICAgIC8vICAgICAgICAgIHJjLmJvdHRvbSwgJnJjRGV2aWNlLmxlZnQsICZyY0RldmljZS5ib3R0b20pOworICAgIC8vICAgICAgICAgIHBFbnYtPkZGSV9QYWdlVG9EZXZpY2UobV9wUGFnZVZpZXctPkdldFBERlBhZ2UoKSwgcmMucmlnaHQsCisgICAgLy8gICAgICAgICAgcmMudG9wLCAmcmNEZXZpY2UucmlnaHQsICZyY0RldmljZS50b3ApOworICAgIHBhZ2UyZGV2aWNlLlRyYW5zZm9ybSgoKEZYX0ZMT0FUKXJjLnJpZ2h0KSwgKChGWF9GTE9BVClyYy50b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICByY0RldmljZS5yaWdodCwgcmNEZXZpY2UudG9wKTsKKworICAgIHJjRGV2aWNlLk5vcm1hbGl6ZSgpOworCisgICAgRlhfQVJHQiBhcmdiID0gQXJnYkVuY29kZSgoaW50KWFscGhhLCBjb2xvcik7CisgICAgRlhfUkVDVCByY0RldigoaW50KXJjRGV2aWNlLmxlZnQsIChpbnQpcmNEZXZpY2UudG9wLCAoaW50KXJjRGV2aWNlLnJpZ2h0LAorICAgICAgICAgICAgICAgICAgKGludClyY0RldmljZS5ib3R0b20pOworICAgIHBEZXZpY2UtPkZpbGxSZWN0KCZyY0RldiwgYXJnYik7CisgICAgLyogICAgICB9Ki8KKyAgfQorfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2VfUHVzaEJ1dHRvbigpIHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOworICBBU1NFUlQocENvbnRyb2wgIT0gTlVMTCk7CisKKyAgQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsKKworICBpbnQzMl90IG5MYXlvdXQgPSAwOworCisgIHN3aXRjaCAocENvbnRyb2wtPkdldFRleHRQb3NpdGlvbigpKSB7CiAgICAgY2FzZSBURVhUUE9TX0lDT046Ci0gICAgICAgIG5MYXlvdXQgPSBQUEJMX0lDT047Ci0gICAgICAgIGJyZWFrOworICAgICAgbkxheW91dCA9IFBQQkxfSUNPTjsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgVEVYVFBPU19CRUxPVzoKLSAgICAgICAgbkxheW91dCA9IFBQQkxfSUNPTlRPUExBQkVMQk9UVE9NOwotICAgICAgICBicmVhazsKKyAgICAgIG5MYXlvdXQgPSBQUEJMX0lDT05UT1BMQUJFTEJPVFRPTTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgVEVYVFBPU19BQk9WRToKLSAgICAgICAgbkxheW91dCA9IFBQQkxfTEFCRUxUT1BJQ09OQk9UVE9NOwotICAgICAgICBicmVhazsKKyAgICAgIG5MYXlvdXQgPSBQUEJMX0xBQkVMVE9QSUNPTkJPVFRPTTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgVEVYVFBPU19SSUdIVDoKLSAgICAgICAgbkxheW91dCA9IFBQQkxfSUNPTkxFRlRMQUJFTFJJR0hUOwotICAgICAgICBicmVhazsKKyAgICAgIG5MYXlvdXQgPSBQUEJMX0lDT05MRUZUTEFCRUxSSUdIVDsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgVEVYVFBPU19MRUZUOgotICAgICAgICBuTGF5b3V0ID0gUFBCTF9MQUJFTExFRlRJQ09OUklHSFQ7Ci0gICAgICAgIGJyZWFrOworICAgICAgbkxheW91dCA9IFBQQkxfTEFCRUxMRUZUSUNPTlJJR0hUOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBURVhUUE9TX09WRVJMQUlEOgotICAgICAgICBuTGF5b3V0ID0gUFBCTF9MQUJFTE9WRVJJQ09OOwotICAgICAgICBicmVhazsKKyAgICAgIG5MYXlvdXQgPSBQUEJMX0xBQkVMT1ZFUklDT047CisgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBuTGF5b3V0ID0gUFBCTF9MQUJFTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgICAgbkxheW91dCA9IFBQQkxfTEFCRUw7CisgICAgICBicmVhazsKKyAgfQogCi0gICAgQ1BXTF9Db2xvciBjckJhY2tncm91bmQsIGNyQm9yZGVyOworICBDUFdMX0NvbG9yIGNyQmFja2dyb3VuZCwgY3JCb3JkZXI7CiAKLSAgICBpbnQgaUNvbG9yVHlwZTsKLSAgICBGWF9GTE9BVCBmY1s0XTsKKyAgaW50IGlDb2xvclR5cGU7CisgIEZYX0ZMT0FUIGZjWzRdOwogCi0gICAgcENvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUsIGZjKTsKLSAgICBpZiAoaUNvbG9yVHlwZSA+IDApCi0gICAgICAgIGNyQmFja2dyb3VuZCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworICBwQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSwgZmMpOworICBpZiAoaUNvbG9yVHlwZSA+IDApCisgICAgY3JCYWNrZ3JvdW5kID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CiAKLSAgICBwQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0gICAgaWYgKGlDb2xvclR5cGUgPiAwKQotICAgICAgICBjckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworICBwQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7CisgIGlmIChpQ29sb3JUeXBlID4gMCkKKyAgICBjckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOwogCi0gICAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0gICAgaW50MzJfdCBuQm9yZGVyU3R5bGUgPSAwOwotICAgIENQV0xfRGFzaCBkc0JvcmRlcigzLDAsMCk7Ci0gICAgQ1BXTF9Db2xvciBjckxlZnRUb3AsY3JSaWdodEJvdHRvbTsKKyAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7CisgIGludDMyX3QgbkJvcmRlclN0eWxlID0gMDsKKyAgQ1BXTF9EYXNoIGRzQm9yZGVyKDMsIDAsIDApOworICBDUFdMX0NvbG9yIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbTsKIAotICAgIHN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkKLSAgICB7CisgIHN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkgewogICAgIGNhc2UgQkJTX0RBU0g6Ci0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19EQVNIOwotICAgICAgICBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfREFTSDsKKyAgICAgIGRzQm9yZGVyID0gQ1BXTF9EYXNoKDMsIDMsIDApOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBCQlNfQkVWRUxFRDoKLSAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7Ci0gICAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOwotICAgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpOwotICAgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9VdGlsczo6RGV2aWRlQ29sb3IoY3JCYWNrZ3JvdW5kLDIpOwotICAgICAgICBicmVhazsKKyAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19CRVZFTEVEOworICAgICAgZkJvcmRlcldpZHRoICo9IDI7CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX1V0aWxzOjpEZXZpZGVDb2xvcihjckJhY2tncm91bmQsIDIpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBCQlNfSU5TRVQ6Ci0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19JTlNFVDsKLSAgICAgICAgZkJvcmRlcldpZHRoICo9IDI7Ci0gICAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMC41KTsKLSAgICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMC43NSk7Ci0gICAgICAgIGJyZWFrOworICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0lOU0VUOworICAgICAgZkJvcmRlcldpZHRoICo9IDI7CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjUpOworICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNzUpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBCQlNfVU5ERVJMSU5FOgotICAgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfVU5ERVJMSU5FRDsKLSAgICAgICAgYnJlYWs7CisgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfVU5ERVJMSU5FRDsKKyAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKKyAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmNXaW5kb3csIGZCb3JkZXJXaWR0aCk7CisKKyAgQ1BXTF9Db2xvciBjclRleHQoQ09MT1JUWVBFX0dSQVksIDApOworCisgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IDEyLjBmOworICBDRlhfQnl0ZVN0cmluZyBjc05hbWVUYWc7CisKKyAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBkYSA9IHBDb250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOworICBpZiAoZGEuSGFzQ29sb3IoKSkgeworICAgIGRhLkdldENvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgICBjclRleHQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKKyAgfQorCisgIGlmIChkYS5IYXNGb250KCkpCisgICAgZGEuR2V0Rm9udChjc05hbWVUYWcsIGZGb250U2l6ZSk7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgY3NXQ2FwdGlvbjsKKyAgQ0ZYX1dpZGVTdHJpbmcgY3NOb3JtYWxDYXB0aW9uLCBjc1JvbGxvdmVyQ2FwdGlvbiwgY3NEb3duQ2FwdGlvbjsKKworICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIkNBIikpIHsKKyAgICBjc05vcm1hbENhcHRpb24gPSBwQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOworICB9CisgIGlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiUkMiKSkgeworICAgIGNzUm9sbG92ZXJDYXB0aW9uID0gcENvbnRyb2wtPkdldFJvbGxvdmVyQ2FwdGlvbigpOworICB9CisgIGlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiQUMiKSkgeworICAgIGNzRG93bkNhcHRpb24gPSBwQ29udHJvbC0+R2V0RG93bkNhcHRpb24oKTsKKyAgfQorCisgIENQREZfU3RyZWFtKiBwTm9ybWFsSWNvbiA9IE5VTEw7CisgIENQREZfU3RyZWFtKiBwUm9sbG92ZXJJY29uID0gTlVMTDsKKyAgQ1BERl9TdHJlYW0qIHBEb3duSWNvbiA9IE5VTEw7CisKKyAgaWYgKHBDb250cm9sLT5IYXNNS0VudHJ5KCJJIikpIHsKKyAgICBwTm9ybWFsSWNvbiA9IHBDb250cm9sLT5HZXROb3JtYWxJY29uKCk7CisgIH0KKyAgaWYgKHBDb250cm9sLT5IYXNNS0VudHJ5KCJSSSIpKSB7CisgICAgcFJvbGxvdmVySWNvbiA9IHBDb250cm9sLT5HZXRSb2xsb3Zlckljb24oKTsKKyAgfQorICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIklYIikpIHsKKyAgICBwRG93bkljb24gPSBwQ29udHJvbC0+R2V0RG93bkljb24oKTsKKyAgfQorCisgIGlmIChwTm9ybWFsSWNvbikgeworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBJbWFnZURpY3QgPSBwTm9ybWFsSWNvbi0+R2V0RGljdCgpKSB7CisgICAgICBpZiAocEltYWdlRGljdC0+R2V0U3RyaW5nKCJOYW1lIikuSXNFbXB0eSgpKQorICAgICAgICBwSW1hZ2VEaWN0LT5TZXRBdFN0cmluZygiTmFtZSIsICJJbWdBIik7CisgICAgfQorICB9CisKKyAgaWYgKHBSb2xsb3Zlckljb24pIHsKKyAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwSW1hZ2VEaWN0ID0gcFJvbGxvdmVySWNvbi0+R2V0RGljdCgpKSB7CisgICAgICBpZiAocEltYWdlRGljdC0+R2V0U3RyaW5nKCJOYW1lIikuSXNFbXB0eSgpKQorICAgICAgICBwSW1hZ2VEaWN0LT5TZXRBdFN0cmluZygiTmFtZSIsICJJbWdCIik7CisgICAgfQorICB9CisKKyAgaWYgKHBEb3duSWNvbikgeworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBJbWFnZURpY3QgPSBwRG93bkljb24tPkdldERpY3QoKSkgeworICAgICAgaWYgKHBJbWFnZURpY3QtPkdldFN0cmluZygiTmFtZSIpLklzRW1wdHkoKSkKKyAgICAgICAgcEltYWdlRGljdC0+U2V0QXRTdHJpbmcoIk5hbWUiLCAiSW1nQyIpOworICAgIH0KKyAgfQorCisgIENQREZfSWNvbkZpdCBpY29uRml0ID0gcENvbnRyb2wtPkdldEljb25GaXQoKTsKKworICBDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpOworICBBU1NFUlQocERvYyAhPSBOVUxMKTsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2MtPkdldEVudigpOworCisgIENCQV9Gb250TWFwIEZvbnRNYXAoCisgICAgICB0aGlzLAorICAgICAgcEVudi0+R2V0U3lzSGFuZGxlcigpKTsgIC8vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSVN5c3RlbUhhbmRsZTo6R2V0U3lzdGVtSGFuZGxlcihtX3BCYXNlRm9ybS0+R2V0RW52KCkpKTsKKyAgRm9udE1hcC5Jbml0aWFsKCk7CisKKyAgRm9udE1hcC5TZXRBUFR5cGUoIk4iKTsKKworICBDRlhfQnl0ZVN0cmluZyBjc0FQID0KKyAgICAgIENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LCBjckJhY2tncm91bmQpICsKKyAgICAgIENQV0xfVXRpbHM6OkdldEJvcmRlckFwcFN0cmVhbShyY1dpbmRvdywgZkJvcmRlcldpZHRoLCBjckJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc0JvcmRlcikgKworICAgICAgQ1BXTF9VdGlsczo6R2V0UHVzaEJ1dHRvbkFwcFN0cmVhbSgKKyAgICAgICAgICBpY29uRml0LkdldEZpdHRpbmdCb3VuZHMoKSA/IHJjV2luZG93IDogcmNDbGllbnQsICZGb250TWFwLAorICAgICAgICAgIHBOb3JtYWxJY29uLCBpY29uRml0LCBjc05vcm1hbENhcHRpb24sIGNyVGV4dCwgZkZvbnRTaXplLCBuTGF5b3V0KTsKKworICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUCk7CisgIGlmIChwTm9ybWFsSWNvbikKKyAgICBBZGRJbWFnZVRvQXBwZWFyYW5jZSgiTiIsIHBOb3JtYWxJY29uKTsKKworICBDUERGX0Zvcm1Db250cm9sOjpIaWdobGlnaHRpbmdNb2RlIGVITE0gPSBwQ29udHJvbC0+R2V0SGlnaGxpZ2h0aW5nTW9kZSgpOworICBpZiAoZUhMTSA9PSBDUERGX0Zvcm1Db250cm9sOjpQdXNoIHx8IGVITE0gPT0gQ1BERl9Gb3JtQ29udHJvbDo6VG9nZ2xlKSB7CisgICAgaWYgKGNzUm9sbG92ZXJDYXB0aW9uLklzRW1wdHkoKSAmJiAhcFJvbGxvdmVySWNvbikgeworICAgICAgY3NSb2xsb3ZlckNhcHRpb24gPSBjc05vcm1hbENhcHRpb247CisgICAgICBwUm9sbG92ZXJJY29uID0gcE5vcm1hbEljb247CisgICAgfQorCisgICAgRm9udE1hcC5TZXRBUFR5cGUoIlIiKTsKKworICAgIGNzQVAgPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdywgY3JCYWNrZ3JvdW5kKSArCisgICAgICAgICAgIENQV0xfVXRpbHM6OkdldEJvcmRlckFwcFN0cmVhbShyY1dpbmRvdywgZkJvcmRlcldpZHRoLCBjckJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpICsKKyAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0UHVzaEJ1dHRvbkFwcFN0cmVhbSgKKyAgICAgICAgICAgICAgIGljb25GaXQuR2V0Rml0dGluZ0JvdW5kcygpID8gcmNXaW5kb3cgOiByY0NsaWVudCwgJkZvbnRNYXAsCisgICAgICAgICAgICAgICBwUm9sbG92ZXJJY29uLCBpY29uRml0LCBjc1JvbGxvdmVyQ2FwdGlvbiwgY3JUZXh0LCBmRm9udFNpemUsCisgICAgICAgICAgICAgICBuTGF5b3V0KTsKKworICAgIFdyaXRlQXBwZWFyYW5jZSgiUiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQKTsKKyAgICBpZiAocFJvbGxvdmVySWNvbikKKyAgICAgIEFkZEltYWdlVG9BcHBlYXJhbmNlKCJSIiwgcFJvbGxvdmVySWNvbik7CisKKyAgICBpZiAoY3NEb3duQ2FwdGlvbi5Jc0VtcHR5KCkgJiYgIXBEb3duSWNvbikgeworICAgICAgY3NEb3duQ2FwdGlvbiA9IGNzTm9ybWFsQ2FwdGlvbjsKKyAgICAgIHBEb3duSWNvbiA9IHBOb3JtYWxJY29uOworICAgIH0KKworICAgIHN3aXRjaCAobkJvcmRlclN0eWxlKSB7CisgICAgICBjYXNlIFBCU19CRVZFTEVEOiB7CisgICAgICAgIENQV0xfQ29sb3IgY3JUZW1wID0gY3JMZWZ0VG9wOworICAgICAgICBjckxlZnRUb3AgPSBjclJpZ2h0Qm90dG9tOworICAgICAgICBjclJpZ2h0Qm90dG9tID0gY3JUZW1wOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgUEJTX0lOU0VUOgorICAgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKKyAgICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOwogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyY1dpbmRvdyxmQm9yZGVyV2lkdGgpOworICAgIEZvbnRNYXAuU2V0QVBUeXBlKCJEIik7CiAKLSAgICBDUFdMX0NvbG9yIGNyVGV4dChDT0xPUlRZUEVfR1JBWSwwKTsKKyAgICBjc0FQID0gQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0oCisgICAgICAgICAgICAgICByY1dpbmRvdywgQ1BXTF9VdGlsczo6U3Vic3RyYWN0Q29sb3IoY3JCYWNrZ3JvdW5kLCAwLjI1ZikpICsKKyAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJvcmRlclN0eWxlLCBkc0JvcmRlcikgKworICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRQdXNoQnV0dG9uQXBwU3RyZWFtKAorICAgICAgICAgICAgICAgaWNvbkZpdC5HZXRGaXR0aW5nQm91bmRzKCkgPyByY1dpbmRvdyA6IHJjQ2xpZW50LCAmRm9udE1hcCwKKyAgICAgICAgICAgICAgIHBEb3duSWNvbiwgaWNvbkZpdCwgY3NEb3duQ2FwdGlvbiwgY3JUZXh0LCBmRm9udFNpemUsIG5MYXlvdXQpOwogCi0gICAgRlhfRkxPQVQgZkZvbnRTaXplID0gMTIuMGY7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NOYW1lVGFnOwotCi0gICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBkYSA9IHBDb250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotICAgIGlmIChkYS5IYXNDb2xvcigpKQotICAgIHsKLSAgICAgICAgZGEuR2V0Q29sb3IoaUNvbG9yVHlwZSwgZmMpOwotICAgICAgICBjclRleHQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKLSAgICB9Ci0KLSAgICBpZiAoZGEuSGFzRm9udCgpKQotICAgICAgICBkYS5HZXRGb250KGNzTmFtZVRhZywgZkZvbnRTaXplKTsKLQotICAgIENGWF9XaWRlU3RyaW5nIGNzV0NhcHRpb247Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NOb3JtYWxDYXB0aW9uLCBjc1JvbGxvdmVyQ2FwdGlvbiwgY3NEb3duQ2FwdGlvbjsKLQotICAgIGlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiQ0EiKSkKLSAgICB7Ci0gICAgICAgIGNzTm9ybWFsQ2FwdGlvbiA9IHBDb250cm9sLT5HZXROb3JtYWxDYXB0aW9uKCk7Ci0gICAgfQotICAgIGlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiUkMiKSkKLSAgICB7Ci0gICAgICAgIGNzUm9sbG92ZXJDYXB0aW9uID0gcENvbnRyb2wtPkdldFJvbGxvdmVyQ2FwdGlvbigpOwotICAgIH0KLSAgICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIkFDIikpCi0gICAgewotICAgICAgICBjc0Rvd25DYXB0aW9uID0gcENvbnRyb2wtPkdldERvd25DYXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQ1BERl9TdHJlYW0qIHBOb3JtYWxJY29uID0gTlVMTDsKLSAgICBDUERGX1N0cmVhbSogcFJvbGxvdmVySWNvbiA9IE5VTEw7Ci0gICAgQ1BERl9TdHJlYW0qIHBEb3duSWNvbiA9IE5VTEw7Ci0KLSAgICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIkkiKSkKLSAgICB7Ci0gICAgICAgIHBOb3JtYWxJY29uID0gcENvbnRyb2wtPkdldE5vcm1hbEljb24oKTsKLSAgICB9Ci0gICAgaWYgKHBDb250cm9sLT5IYXNNS0VudHJ5KCJSSSIpKQotICAgIHsKLSAgICAgICAgcFJvbGxvdmVySWNvbiA9IHBDb250cm9sLT5HZXRSb2xsb3Zlckljb24oKTsKLSAgICB9Ci0gICAgaWYgKHBDb250cm9sLT5IYXNNS0VudHJ5KCJJWCIpKQotICAgIHsKLSAgICAgICAgcERvd25JY29uID0gcENvbnRyb2wtPkdldERvd25JY29uKCk7Ci0gICAgfQotCi0gICAgaWYgKHBOb3JtYWxJY29uKQotICAgIHsKLSAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcEltYWdlRGljdCA9IHBOb3JtYWxJY29uLT5HZXREaWN0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwSW1hZ2VEaWN0LT5HZXRTdHJpbmcoIk5hbWUiKS5Jc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcEltYWdlRGljdC0+U2V0QXRTdHJpbmcoIk5hbWUiLCAiSW1nQSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBSb2xsb3Zlckljb24pCi0gICAgewotICAgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwSW1hZ2VEaWN0ID0gcFJvbGxvdmVySWNvbi0+R2V0RGljdCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocEltYWdlRGljdC0+R2V0U3RyaW5nKCJOYW1lIikuSXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHBJbWFnZURpY3QtPlNldEF0U3RyaW5nKCJOYW1lIiwgIkltZ0IiKTsKLSAgICAgICAgfQotICAgIH0KLQorICAgIFdyaXRlQXBwZWFyYW5jZSgiRCIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQKTsKICAgICBpZiAocERvd25JY29uKQotICAgIHsKLSAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcEltYWdlRGljdCA9IHBEb3duSWNvbi0+R2V0RGljdCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocEltYWdlRGljdC0+R2V0U3RyaW5nKCJOYW1lIikuSXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHBJbWFnZURpY3QtPlNldEF0U3RyaW5nKCJOYW1lIiwgIkltZ0MiKTsKLSAgICAgICAgfQorICAgICAgQWRkSW1hZ2VUb0FwcGVhcmFuY2UoIkQiLCBwRG93bkljb24pOworICB9IGVsc2UgeworICAgIFJlbW92ZUFwcGVhcmFuY2UoIkQiKTsKKyAgICBSZW1vdmVBcHBlYXJhbmNlKCJSIik7CisgIH0KK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlX0NoZWNrQm94KCkgeworICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldEZvcm1Db250cm9sKCk7CisgIEFTU0VSVChwQ29udHJvbCAhPSBOVUxMKTsKKworICBDUFdMX0NvbG9yIGNyQmFja2dyb3VuZCwgY3JCb3JkZXIsIGNyVGV4dDsKKworICBpbnQgaUNvbG9yVHlwZTsKKyAgRlhfRkxPQVQgZmNbNF07CisKKyAgcENvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgaWYgKGlDb2xvclR5cGUgPiAwKQorICAgIGNyQmFja2dyb3VuZCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworCisgIHBDb250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgaWYgKGlDb2xvclR5cGUgPiAwKQorICAgIGNyQm9yZGVyID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisKKyAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7CisgIGludDMyX3QgbkJvcmRlclN0eWxlID0gMDsKKyAgQ1BXTF9EYXNoIGRzQm9yZGVyKDMsIDAsIDApOworICBDUFdMX0NvbG9yIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbTsKKworICBzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpIHsKKyAgICBjYXNlIEJCU19EQVNIOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0RBU0g7CisgICAgICBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX0JFVkVMRUQ6CisgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKKyAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSk7CisgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9VdGlsczo6RGV2aWRlQ29sb3IoY3JCYWNrZ3JvdW5kLCAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX0lOU0VUOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0lOU0VUOworICAgICAgZkJvcmRlcldpZHRoICo9IDI7CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjUpOworICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNzUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfVU5ERVJMSU5FOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1VOREVSTElORUQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1NPTElEOworICAgICAgYnJlYWs7CisgIH0KKworICBDUERGX1JlY3QgcmNXaW5kb3cgPSBHZXRSb3RhdGVkUmVjdCgpOworICBDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyY1dpbmRvdywgZkJvcmRlcldpZHRoKTsKKworICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGRhID0gcENvbnRyb2wtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisgIGlmIChkYS5IYXNDb2xvcigpKSB7CisgICAgZGEuR2V0Q29sb3IoaUNvbG9yVHlwZSwgZmMpOworICAgIGNyVGV4dCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworICB9CisKKyAgaW50MzJfdCBuU3R5bGUgPSAwOworCisgIENGWF9XaWRlU3RyaW5nIGNzV0NhcHRpb24gPSBwQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOworICBpZiAoY3NXQ2FwdGlvbi5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBzd2l0Y2ggKGNzV0NhcHRpb25bMF0pIHsKKyAgICAgIGNhc2UgTCdsJzoKKyAgICAgICAgblN0eWxlID0gUENTX0NJUkNMRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwnOCc6CisgICAgICAgIG5TdHlsZSA9IFBDU19DUk9TUzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwndSc6CisgICAgICAgIG5TdHlsZSA9IFBDU19ESUFNT05EOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCduJzoKKyAgICAgICAgblN0eWxlID0gUENTX1NRVUFSRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwnSCc6CisgICAgICAgIG5TdHlsZSA9IFBDU19TVEFSOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6ICAvLyBMJzQnCisgICAgICAgIG5TdHlsZSA9IFBDU19DSEVDSzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIG5TdHlsZSA9IFBDU19DSEVDSzsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nIGNzQVBfTl9PTiA9CisgICAgICBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdywgY3JCYWNrZ3JvdW5kKSArCisgICAgICBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNCb3JkZXIpOworCisgIENGWF9CeXRlU3RyaW5nIGNzQVBfTl9PRkYgPSBjc0FQX05fT047CisKKyAgc3dpdGNoIChuQm9yZGVyU3R5bGUpIHsKKyAgICBjYXNlIFBCU19CRVZFTEVEOiB7CisgICAgICBDUFdMX0NvbG9yIGNyVGVtcCA9IGNyTGVmdFRvcDsKKyAgICAgIGNyTGVmdFRvcCA9IGNyUmlnaHRCb3R0b207CisgICAgICBjclJpZ2h0Qm90dG9tID0gY3JUZW1wOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBQQlNfSU5TRVQ6CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NBUF9EX09OID0KKyAgICAgIENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKAorICAgICAgICAgIHJjV2luZG93LCBDUFdMX1V0aWxzOjpTdWJzdHJhY3RDb2xvcihjckJhY2tncm91bmQsIDAuMjVmKSkgKworICAgICAgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwgbkJvcmRlclN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzQm9yZGVyKTsKKworICBDRlhfQnl0ZVN0cmluZyBjc0FQX0RfT0ZGID0gY3NBUF9EX09OOworCisgIGNzQVBfTl9PTiArPSBDUFdMX1V0aWxzOjpHZXRDaGVja0JveEFwcFN0cmVhbShyY0NsaWVudCwgblN0eWxlLCBjclRleHQpOworICBjc0FQX0RfT04gKz0gQ1BXTF9VdGlsczo6R2V0Q2hlY2tCb3hBcHBTdHJlYW0ocmNDbGllbnQsIG5TdHlsZSwgY3JUZXh0KTsKKworICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9OX09OLAorICAgICAgICAgICAgICAgICAgcENvbnRyb2wtPkdldENoZWNrZWRBUFN0YXRlKCkpOworICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9OX09GRiwgIk9mZiIpOworCisgIFdyaXRlQXBwZWFyYW5jZSgiRCIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX0RfT04sCisgICAgICAgICAgICAgICAgICBwQ29udHJvbC0+R2V0Q2hlY2tlZEFQU3RhdGUoKSk7CisgIFdyaXRlQXBwZWFyYW5jZSgiRCIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX0RfT0ZGLCAiT2ZmIik7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NBUyA9IEdldEFwcFN0YXRlKCk7CisgIGlmIChjc0FTLklzRW1wdHkoKSkKKyAgICBTZXRBcHBTdGF0ZSgiT2ZmIik7Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZV9SYWRpb0J1dHRvbigpIHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOworICBBU1NFUlQocENvbnRyb2wgIT0gTlVMTCk7CisKKyAgQ1BXTF9Db2xvciBjckJhY2tncm91bmQsIGNyQm9yZGVyLCBjclRleHQ7CisKKyAgaW50IGlDb2xvclR5cGU7CisgIEZYX0ZMT0FUIGZjWzRdOworCisgIHBDb250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpQ29sb3JUeXBlLCBmYyk7CisgIGlmIChpQ29sb3JUeXBlID4gMCkKKyAgICBjckJhY2tncm91bmQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKKworICBwQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7CisgIGlmIChpQ29sb3JUeXBlID4gMCkKKyAgICBjckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworCisgIEZYX0ZMT0FUIGZCb3JkZXJXaWR0aCA9IChGWF9GTE9BVClHZXRCb3JkZXJXaWR0aCgpOworICBpbnQzMl90IG5Cb3JkZXJTdHlsZSA9IDA7CisgIENQV0xfRGFzaCBkc0JvcmRlcigzLCAwLCAwKTsKKyAgQ1BXTF9Db2xvciBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b207CisKKyAgc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKSB7CisgICAgY2FzZSBCQlNfREFTSDoKKyAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19EQVNIOworICAgICAgZHNCb3JkZXIgPSBDUFdMX0Rhc2goMywgMywgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJCU19CRVZFTEVEOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7CisgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKKyAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOworICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfVXRpbHM6OkRldmlkZUNvbG9yKGNyQmFja2dyb3VuZCwgMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJCU19JTlNFVDoKKyAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19JTlNFVDsKKyAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC41KTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjc1KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX1VOREVSTElORToKKyAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19VTkRFUkxJTkVEOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmNXaW5kb3csIGZCb3JkZXJXaWR0aCk7CisKKyAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBkYSA9IHBDb250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOworICBpZiAoZGEuSGFzQ29sb3IoKSkgeworICAgIGRhLkdldENvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgICBjclRleHQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKKyAgfQorCisgIGludDMyX3QgblN0eWxlID0gMDsKKworICBDRlhfV2lkZVN0cmluZyBjc1dDYXB0aW9uID0gcENvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKTsKKyAgaWYgKGNzV0NhcHRpb24uR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgc3dpdGNoIChjc1dDYXB0aW9uWzBdKSB7CisgICAgICBkZWZhdWx0OiAgLy8gTCdsJzoKKyAgICAgICAgblN0eWxlID0gUENTX0NJUkNMRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwnOCc6CisgICAgICAgIG5TdHlsZSA9IFBDU19DUk9TUzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwndSc6CisgICAgICAgIG5TdHlsZSA9IFBDU19ESUFNT05EOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCduJzoKKyAgICAgICAgblN0eWxlID0gUENTX1NRVUFSRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwnSCc6CisgICAgICAgIG5TdHlsZSA9IFBDU19TVEFSOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCc0JzoKKyAgICAgICAgblN0eWxlID0gUENTX0NIRUNLOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgblN0eWxlID0gUENTX0NJUkNMRTsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nIGNzQVBfTl9PTjsKKworICBDUERGX1JlY3QgcmNDZW50ZXIgPQorICAgICAgQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoQ1BXTF9VdGlsczo6R2V0Q2VudGVyU3F1YXJlKHJjV2luZG93KSwgMS4wZik7CisKKyAgaWYgKG5TdHlsZSA9PSBQQ1NfQ0lSQ0xFKSB7CisgICAgaWYgKG5Cb3JkZXJTdHlsZSA9PSBQQlNfQkVWRUxFRCkgeworICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSk7CisgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9VdGlsczo6U3Vic3RyYWN0Q29sb3IoY3JCYWNrZ3JvdW5kLCAwLjI1Zik7CisgICAgfSBlbHNlIGlmIChuQm9yZGVyU3R5bGUgPT0gUEJTX0lOU0VUKSB7CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjVmKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjc1Zik7CiAgICAgfQogCi0gICAgQ1BERl9JY29uRml0IGljb25GaXQgPSBwQ29udHJvbC0+R2V0SWNvbkZpdCgpOworICAgIGNzQVBfTl9PTiA9IENQV0xfVXRpbHM6OkdldENpcmNsZUZpbGxBcHBTdHJlYW0ocmNDZW50ZXIsIGNyQmFja2dyb3VuZCkgKworICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkdldENpcmNsZUJvcmRlckFwcFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgcmNDZW50ZXIsIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgbkJvcmRlclN0eWxlLCBkc0JvcmRlcik7CisgIH0gZWxzZSB7CisgICAgY3NBUF9OX09OID0gQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0ocmNXaW5kb3csIGNyQmFja2dyb3VuZCkgKworICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkdldEJvcmRlckFwcFN0cmVhbShyY1dpbmRvdywgZkJvcmRlcldpZHRoLCBjckJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQm9yZGVyU3R5bGUsIGRzQm9yZGVyKTsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nIGNzQVBfTl9PRkYgPSBjc0FQX05fT047CisKKyAgc3dpdGNoIChuQm9yZGVyU3R5bGUpIHsKKyAgICBjYXNlIFBCU19CRVZFTEVEOiB7CisgICAgICBDUFdMX0NvbG9yIGNyVGVtcCA9IGNyTGVmdFRvcDsKKyAgICAgIGNyTGVmdFRvcCA9IGNyUmlnaHRCb3R0b207CisgICAgICBjclJpZ2h0Qm90dG9tID0gY3JUZW1wOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBQQlNfSU5TRVQ6CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NBUF9EX09OOworCisgIGlmIChuU3R5bGUgPT0gUENTX0NJUkNMRSkgeworICAgIENQV0xfQ29sb3IgY3JCSyA9IENQV0xfVXRpbHM6OlN1YnN0cmFjdENvbG9yKGNyQmFja2dyb3VuZCwgMC4yNWYpOworICAgIGlmIChuQm9yZGVyU3R5bGUgPT0gUEJTX0JFVkVMRUQpIHsKKyAgICAgIGNyTGVmdFRvcCA9IENQV0xfVXRpbHM6OlN1YnN0cmFjdENvbG9yKGNyQmFja2dyb3VuZCwgMC4yNWYpOworICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOworICAgICAgY3JCSyA9IGNyQmFja2dyb3VuZDsKKyAgICB9IGVsc2UgaWYgKG5Cb3JkZXJTdHlsZSA9PSBQQlNfSU5TRVQpIHsKKyAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDApOworICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOworICAgIH0KKworICAgIGNzQVBfRF9PTiA9IENQV0xfVXRpbHM6OkdldENpcmNsZUZpbGxBcHBTdHJlYW0ocmNDZW50ZXIsIGNyQkspICsKKyAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRDaXJjbGVCb3JkZXJBcHBTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIHJjQ2VudGVyLCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLCBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sCisgICAgICAgICAgICAgICAgICAgIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpOworICB9IGVsc2UgeworICAgIGNzQVBfRF9PTiA9IENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICByY1dpbmRvdywgQ1BXTF9VdGlsczo6U3Vic3RyYWN0Q29sb3IoY3JCYWNrZ3JvdW5kLCAwLjI1ZikpICsKKyAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJvcmRlclN0eWxlLCBkc0JvcmRlcik7CisgIH0KKworICBDRlhfQnl0ZVN0cmluZyBjc0FQX0RfT0ZGID0gY3NBUF9EX09OOworCisgIGNzQVBfTl9PTiArPSBDUFdMX1V0aWxzOjpHZXRSYWRpb0J1dHRvbkFwcFN0cmVhbShyY0NsaWVudCwgblN0eWxlLCBjclRleHQpOworICBjc0FQX0RfT04gKz0gQ1BXTF9VdGlsczo6R2V0UmFkaW9CdXR0b25BcHBTdHJlYW0ocmNDbGllbnQsIG5TdHlsZSwgY3JUZXh0KTsKKworICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9OX09OLAorICAgICAgICAgICAgICAgICAgcENvbnRyb2wtPkdldENoZWNrZWRBUFN0YXRlKCkpOworICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9OX09GRiwgIk9mZiIpOworCisgIFdyaXRlQXBwZWFyYW5jZSgiRCIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX0RfT04sCisgICAgICAgICAgICAgICAgICBwQ29udHJvbC0+R2V0Q2hlY2tlZEFQU3RhdGUoKSk7CisgIFdyaXRlQXBwZWFyYW5jZSgiRCIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX0RfT0ZGLCAiT2ZmIik7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NBUyA9IEdldEFwcFN0YXRlKCk7CisgIGlmIChjc0FTLklzRW1wdHkoKSkKKyAgICBTZXRBcHBTdGF0ZSgiT2ZmIik7Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZV9Db21ib0JveChjb25zdCBGWF9XQ0hBUiogc1ZhbHVlKSB7CisgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQVNTRVJUKHBDb250cm9sICE9IE5VTEwpOworICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcENvbnRyb2wtPkdldEZpZWxkKCk7CisgIEFTU0VSVChwRmllbGQgIT0gTlVMTCk7CisKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNCb2R5LCBzTGluZXM7CisKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICBDUERGX1JlY3QgcmNCdXR0b24gPSByY0NsaWVudDsKKyAgcmNCdXR0b24ubGVmdCA9IHJjQnV0dG9uLnJpZ2h0IC0gMTM7CisgIHJjQnV0dG9uLk5vcm1hbGl6ZSgpOworCisgIGlmIChJRlhfRWRpdCogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKSB7CisgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goRkFMU0UpOworCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKKyAgICBBU1NFUlQocERvYyAhPSBOVUxMKTsKKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvYy0+R2V0RW52KCk7CisgICAgQ0JBX0ZvbnRNYXAgRm9udE1hcCh0aGlzLCBwRW52LT5HZXRTeXNIYW5kbGVyKCkpOworICAgIEZvbnRNYXAuSW5pdGlhbCgpOworICAgIHBFZGl0LT5TZXRGb250TWFwKCZGb250TWFwKTsKKworICAgIENQREZfUmVjdCByY0VkaXQgPSByY0NsaWVudDsKKyAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0OworICAgIHJjRWRpdC5Ob3JtYWxpemUoKTsKKworICAgIHBFZGl0LT5TZXRQbGF0ZVJlY3QocmNFZGl0KTsKKyAgICBwRWRpdC0+U2V0QWxpZ25tZW50VigxKTsKKworICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7CisgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCisgICAgICBwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKFRSVUUpOworICAgIGVsc2UKKyAgICAgIHBFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOworCisgICAgcEVkaXQtPkluaXRpYWxpemUoKTsKKworICAgIGlmIChzVmFsdWUpCisgICAgICBwRWRpdC0+U2V0VGV4dChzVmFsdWUpOworICAgIGVsc2UgeworICAgICAgaW50MzJfdCBuQ3VyU2VsID0gcEZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KDApOworCisgICAgICBpZiAobkN1clNlbCA8IDApCisgICAgICAgIHBFZGl0LT5TZXRUZXh0KHBGaWVsZC0+R2V0VmFsdWUoKS5jX3N0cigpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcEVkaXQtPlNldFRleHQocEZpZWxkLT5HZXRPcHRpb25MYWJlbChuQ3VyU2VsKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7CisKKyAgICBDRlhfQnl0ZVN0cmluZyBzRWRpdCA9CisgICAgICAgIENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0ocEVkaXQsIENQREZfUG9pbnQoMC4wZiwgMC4wZikpOworICAgIGlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgIHNCb2R5IDw8ICIvVHggQk1DXG4iCisgICAgICAgICAgICA8PCAicVxuIjsKKyAgICAgIGlmIChyY0NvbnRlbnQuV2lkdGgoKSA+IHJjRWRpdC5XaWR0aCgpIHx8CisgICAgICAgICAgcmNDb250ZW50LkhlaWdodCgpID4gcmNFZGl0LkhlaWdodCgpKSB7CisgICAgICAgIHNCb2R5IDw8IHJjRWRpdC5sZWZ0IDw8ICIgIiA8PCByY0VkaXQuYm90dG9tIDw8ICIgIiA8PCByY0VkaXQuV2lkdGgoKQorICAgICAgICAgICAgICA8PCAiICIgPDwgcmNFZGl0LkhlaWdodCgpIDw8ICIgcmVcbldcbm5cbiI7CisgICAgICB9CisKKyAgICAgIENQV0xfQ29sb3IgY3JUZXh0ID0gR2V0VGV4dFBXTENvbG9yKCk7CisgICAgICBzQm9keSA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0KSA8PCBzRWRpdAorICAgICAgICAgICAgPDwgIkVUXG4iCisgICAgICAgICAgICA8PCAiUVxuRU1DXG4iOworICAgIH0KKworICAgIElGWF9FZGl0OjpEZWxFZGl0KHBFZGl0KTsKKyAgfQorCisgIHNCb2R5IDw8IENQV0xfVXRpbHM6OkdldERyb3BCdXR0b25BcHBTdHJlYW0ocmNCdXR0b24pOworCisgIENGWF9CeXRlU3RyaW5nIHNBUCA9IEdldEJhY2tncm91bmRBcHBTdHJlYW0oKSArIEdldEJvcmRlckFwcFN0cmVhbSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVzLkdldEJ5dGVTdHJpbmcoKSArIHNCb2R5LkdldEJ5dGVTdHJpbmcoKTsKKworICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgc0FQKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlX0xpc3RCb3goKSB7CisgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQVNTRVJUKHBDb250cm9sICE9IE5VTEwpOworICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcENvbnRyb2wtPkdldEZpZWxkKCk7CisgIEFTU0VSVChwRmllbGQgIT0gTlVMTCk7CisKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworCisgIENGWF9CeXRlVGV4dEJ1ZiBzQm9keSwgc0xpbmVzOworCisgIGlmIChJRlhfRWRpdCogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKSB7CisgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goRkFMU0UpOwogCiAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKICAgICBBU1NFUlQocERvYyAhPSBOVUxMKTsKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvYy0+R2V0RW52KCk7CiAKLSAgICBDQkFfRm9udE1hcCBGb250TWFwKHRoaXMscEVudi0+R2V0U3lzSGFuZGxlcigpKTsvLywgSVN5c3RlbUhhbmRsZTo6R2V0U3lzdGVtSGFuZGxlcihtX3BCYXNlRm9ybS0+R2V0RW52KCkpKTsKKyAgICBDQkFfRm9udE1hcCBGb250TWFwKHRoaXMsIHBFbnYtPkdldFN5c0hhbmRsZXIoKSk7CiAgICAgRm9udE1hcC5Jbml0aWFsKCk7CisgICAgcEVkaXQtPlNldEZvbnRNYXAoJkZvbnRNYXApOwogCi0gICAgRm9udE1hcC5TZXRBUFR5cGUoIk4iKTsKKyAgICBwRWRpdC0+U2V0UGxhdGVSZWN0KENQREZfUmVjdChyY0NsaWVudC5sZWZ0LCAwLjBmLCByY0NsaWVudC5yaWdodCwgMC4wZikpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NBUCA9IENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LCBjckJhY2tncm91bmQpICsKLSAgICAgICAgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLCBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpICsKLSAgICAgICAgQ1BXTF9VdGlsczo6R2V0UHVzaEJ1dHRvbkFwcFN0cmVhbShpY29uRml0LkdldEZpdHRpbmdCb3VuZHMoKSA/IHJjV2luZG93IDogcmNDbGllbnQsICZGb250TWFwLCBwTm9ybWFsSWNvbiwgaWNvbkZpdCwgY3NOb3JtYWxDYXB0aW9uLCBjclRleHQsIGZGb250U2l6ZSwgbkxheW91dCk7CisgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKIAotICAgIFdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQKTsKLSAgICBpZiAocE5vcm1hbEljb24pCi0gICAgICAgIEFkZEltYWdlVG9BcHBlYXJhbmNlKCJOIiwgcE5vcm1hbEljb24pOwotCi0gICAgQ1BERl9Gb3JtQ29udHJvbDo6SGlnaGxpZ2h0aW5nTW9kZSBlSExNID0gcENvbnRyb2wtPkdldEhpZ2hsaWdodGluZ01vZGUoKTsKLSAgICBpZiAoZUhMTSA9PSBDUERGX0Zvcm1Db250cm9sOjpQdXNoIHx8IGVITE0gPT0gQ1BERl9Gb3JtQ29udHJvbDo6VG9nZ2xlKQotICAgIHsKLSAgICAgICAgaWYgKGNzUm9sbG92ZXJDYXB0aW9uLklzRW1wdHkoKSAmJiAhcFJvbGxvdmVySWNvbikKLSAgICAgICAgewotICAgICAgICAgICAgY3NSb2xsb3ZlckNhcHRpb24gPSBjc05vcm1hbENhcHRpb247Ci0gICAgICAgICAgICBwUm9sbG92ZXJJY29uID0gcE5vcm1hbEljb247Ci0gICAgICAgIH0KLQotICAgICAgICBGb250TWFwLlNldEFQVHlwZSgiUiIpOwotCi0gICAgICAgIGNzQVAgPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdywgY3JCYWNrZ3JvdW5kKSArCi0gICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLCBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpICsKLSAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRQdXNoQnV0dG9uQXBwU3RyZWFtKGljb25GaXQuR2V0Rml0dGluZ0JvdW5kcygpID8gcmNXaW5kb3cgOiByY0NsaWVudCwgJkZvbnRNYXAsIHBSb2xsb3Zlckljb24sIGljb25GaXQsIGNzUm9sbG92ZXJDYXB0aW9uLCBjclRleHQsIGZGb250U2l6ZSwgbkxheW91dCk7Ci0KLSAgICAgICAgV3JpdGVBcHBlYXJhbmNlKCJSIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVApOwotICAgICAgICBpZiAocFJvbGxvdmVySWNvbikKLSAgICAgICAgICAgIEFkZEltYWdlVG9BcHBlYXJhbmNlKCJSIiwgcFJvbGxvdmVySWNvbik7Ci0KLSAgICAgICAgaWYgKGNzRG93bkNhcHRpb24uSXNFbXB0eSgpICYmICFwRG93bkljb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNzRG93bkNhcHRpb24gPSBjc05vcm1hbENhcHRpb247Ci0gICAgICAgICAgICBwRG93bkljb24gPSBwTm9ybWFsSWNvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAobkJvcmRlclN0eWxlKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgUEJTX0JFVkVMRUQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ1BXTF9Db2xvciBjclRlbXAgPSBjckxlZnRUb3A7Ci0gICAgICAgICAgICAgICAgY3JMZWZ0VG9wID0gY3JSaWdodEJvdHRvbTsKLSAgICAgICAgICAgICAgICBjclJpZ2h0Qm90dG9tID0gY3JUZW1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEJTX0lOU0VUOgotICAgICAgICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwKTsKLSAgICAgICAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBGb250TWFwLlNldEFQVHlwZSgiRCIpOwotCi0gICAgICAgIGNzQVAgPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdywgQ1BXTF9VdGlsczo6U3Vic3RyYWN0Q29sb3IoY3JCYWNrZ3JvdW5kLDAuMjVmKSkgKwotICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLCBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpICsKLSAgICAgICAgICAgIENQV0xfVXRpbHM6OkdldFB1c2hCdXR0b25BcHBTdHJlYW0oaWNvbkZpdC5HZXRGaXR0aW5nQm91bmRzKCkgPyByY1dpbmRvdyA6IHJjQ2xpZW50LCAmRm9udE1hcCwgcERvd25JY29uLCBpY29uRml0LCBjc0Rvd25DYXB0aW9uLCBjclRleHQsIGZGb250U2l6ZSwgbkxheW91dCk7Ci0KLSAgICAgICAgV3JpdGVBcHBlYXJhbmNlKCJEIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVApOwotICAgICAgICBpZiAocERvd25JY29uKQotICAgICAgICAgICAgQWRkSW1hZ2VUb0FwcGVhcmFuY2UoIkQiLCBwRG93bkljb24pOwotICAgIH0KKyAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKKyAgICAgIHBFZGl0LT5TZXRGb250U2l6ZSgxMi4wZik7CiAgICAgZWxzZQotICAgIHsKLSAgICAgICAgUmVtb3ZlQXBwZWFyYW5jZSgiRCIpOwotICAgICAgICBSZW1vdmVBcHBlYXJhbmNlKCJSIik7Ci0gICAgfQotfQorICAgICAgcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiAKLXZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZV9DaGVja0JveCgpCi17Ci0gICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOwotICAgIEFTU0VSVChwQ29udHJvbCAhPSBOVUxMKTsKKyAgICBwRWRpdC0+SW5pdGlhbGl6ZSgpOwogCisgICAgQ0ZYX0J5dGVUZXh0QnVmIHNMaXN0OworICAgIEZYX0ZMT0FUIGZ5ID0gcmNDbGllbnQudG9wOwogCisgICAgaW50MzJfdCBuVG9wID0gcEZpZWxkLT5HZXRUb3BWaXNpYmxlSW5kZXgoKTsKKyAgICBpbnQzMl90IG5Db3VudCA9IHBGaWVsZC0+Q291bnRPcHRpb25zKCk7CisgICAgaW50MzJfdCBuU2VsQ291bnQgPSBwRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpOwogCi0gICAgQ1BXTF9Db2xvciBjckJhY2tncm91bmQsIGNyQm9yZGVyLCBjclRleHQ7Ci0KLSAgICBpbnQgaUNvbG9yVHlwZTsKLSAgICBGWF9GTE9BVCBmY1s0XTsKLQotICAgIHBDb250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0gICAgaWYgKGlDb2xvclR5cGUgPiAwKQotICAgICAgICBjckJhY2tncm91bmQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKLQotICAgIHBDb250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKGlDb2xvclR5cGUsIGZjKTsKLSAgICBpZiAoaUNvbG9yVHlwZSA+IDApCi0gICAgICAgIGNyQm9yZGVyID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7Ci0KLSAgICBGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKLSAgICBpbnQzMl90IG5Cb3JkZXJTdHlsZSA9IDA7Ci0gICAgQ1BXTF9EYXNoIGRzQm9yZGVyKDMsMCwwKTsKLSAgICBDUFdMX0NvbG9yIGNyTGVmdFRvcCxjclJpZ2h0Qm90dG9tOwotCi0gICAgc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKQotICAgIHsKLSAgICBjYXNlIEJCU19EQVNIOgotICAgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfREFTSDsKLSAgICAgICAgZHNCb3JkZXIgPSBDUFdMX0Rhc2goMywgMywgMCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQkJTX0JFVkVMRUQ6Ci0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19CRVZFTEVEOwotICAgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKLSAgICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwxKTsKLSAgICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfVXRpbHM6OkRldmlkZUNvbG9yKGNyQmFja2dyb3VuZCwyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCQlNfSU5TRVQ6Ci0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19JTlNFVDsKLSAgICAgICAgZkJvcmRlcldpZHRoICo9IDI7Ci0gICAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMC41KTsKLSAgICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMC43NSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQkJTX1VOREVSTElORToKLSAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1VOREVSTElORUQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsKLSAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyY1dpbmRvdyxmQm9yZGVyV2lkdGgpOwotCi0gICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBkYSA9IHBDb250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotICAgIGlmIChkYS5IYXNDb2xvcigpKQotICAgIHsKLSAgICAgICAgZGEuR2V0Q29sb3IoaUNvbG9yVHlwZSwgZmMpOwotICAgICAgICBjclRleHQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IG5TdHlsZSA9IDA7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyBjc1dDYXB0aW9uID0gcENvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKTsKLSAgICBpZiAoY3NXQ2FwdGlvbi5HZXRMZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgICBzd2l0Y2ggKGNzV0NhcHRpb25bMF0pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBMJ2wnOgotICAgICAgICAgICAgblN0eWxlID0gUENTX0NJUkNMRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEwnOCc6Ci0gICAgICAgICAgICBuU3R5bGUgPSBQQ1NfQ1JPU1M7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMJ3UnOgotICAgICAgICAgICAgblN0eWxlID0gUENTX0RJQU1PTkQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMJ24nOgotICAgICAgICAgICAgblN0eWxlID0gUENTX1NRVUFSRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEwnSCc6Ci0gICAgICAgICAgICBuU3R5bGUgPSBQQ1NfU1RBUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvL0wnNCcKLSAgICAgICAgICAgIG5TdHlsZSA9IFBDU19DSEVDSzsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGZvciAoaW50MzJfdCBpID0gblRvcDsgaSA8IG5Db3VudDsgaSsrKSB7CisgICAgICBGWF9CT09MIGJTZWxlY3RlZCA9IEZBTFNFOworICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgblNlbENvdW50OyBqKyspIHsKKyAgICAgICAgaWYgKHBGaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChqKSA9PSBpKSB7CisgICAgICAgICAgYlNlbGVjdGVkID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuU3R5bGUgPSBQQ1NfQ0hFQ0s7CisgICAgICB9CisKKyAgICAgIHBFZGl0LT5TZXRUZXh0KHBGaWVsZC0+R2V0T3B0aW9uTGFiZWwoaSkuY19zdHIoKSk7CisKKyAgICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSBwRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKKyAgICAgIEZYX0ZMT0FUIGZJdGVtSGVpZ2h0ID0gcmNDb250ZW50LkhlaWdodCgpOworCisgICAgICBpZiAoYlNlbGVjdGVkKSB7CisgICAgICAgIENQREZfUmVjdCByY0l0ZW0gPQorICAgICAgICAgICAgQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQsIGZ5IC0gZkl0ZW1IZWlnaHQsIHJjQ2xpZW50LnJpZ2h0LCBmeSk7CisgICAgICAgIHNMaXN0IDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAwLCA1MS4wZiAvIDI1NS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEzLjBmIC8gMjU1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpCisgICAgICAgICAgICAgIDw8IHJjSXRlbS5sZWZ0IDw8ICIgIiA8PCByY0l0ZW0uYm90dG9tIDw8ICIgIiA8PCByY0l0ZW0uV2lkdGgoKQorICAgICAgICAgICAgICA8PCAiICIgPDwgcmNJdGVtLkhlaWdodCgpIDw8ICIgcmUgZlxuIgorICAgICAgICAgICAgICA8PCAiUVxuIjsKKworICAgICAgICBzTGlzdCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSksIFRSVUUpCisgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0ocEVkaXQsIENQREZfUG9pbnQoMC4wZiwgZnkpKQorICAgICAgICAgICAgICA8PCAiRVRcbiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBDUFdMX0NvbG9yIGNyVGV4dCA9IEdldFRleHRQV0xDb2xvcigpOworICAgICAgICBzTGlzdCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCBUUlVFKQorICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LCBDUERGX1BvaW50KDAuMGYsIGZ5KSkKKyAgICAgICAgICAgICAgPDwgIkVUXG4iOworICAgICAgfQorCisgICAgICBmeSAtPSBmSXRlbUhlaWdodDsKICAgICB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0FQX05fT04gPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdyxjckJhY2tncm91bmQpICsKLSAgICAgICAgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LGZCb3JkZXJXaWR0aCxjckJvcmRlcixjckxlZnRUb3AsY3JSaWdodEJvdHRvbSxuQm9yZGVyU3R5bGUsZHNCb3JkZXIpOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NBUF9OX09GRiA9IGNzQVBfTl9PTjsKLQotICAgIHN3aXRjaCAobkJvcmRlclN0eWxlKQotICAgIHsKLSAgICBjYXNlIFBCU19CRVZFTEVEOgotICAgICAgICB7Ci0gICAgICAgICAgICBDUFdMX0NvbG9yIGNyVGVtcCA9IGNyTGVmdFRvcDsKLSAgICAgICAgICAgIGNyTGVmdFRvcCA9IGNyUmlnaHRCb3R0b207Ci0gICAgICAgICAgICBjclJpZ2h0Qm90dG9tID0gY3JUZW1wOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUEJTX0lOU0VUOgotICAgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDApOwotICAgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwxKTsKLSAgICAgICAgYnJlYWs7CisgICAgaWYgKHNMaXN0LkdldFNpemUoKSA+IDApIHsKKyAgICAgIHNCb2R5IDw8ICIvVHggQk1DXG4iCisgICAgICAgICAgICA8PCAicVxuIiA8PCByY0NsaWVudC5sZWZ0IDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiAiCisgICAgICAgICAgICA8PCByY0NsaWVudC5XaWR0aCgpIDw8ICIgIiA8PCByY0NsaWVudC5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOworICAgICAgc0JvZHkgPDwgc0xpc3QgPDwgIlFcbkVNQ1xuIjsKICAgICB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0FQX0RfT04gPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdyxDUFdMX1V0aWxzOjpTdWJzdHJhY3RDb2xvcihjckJhY2tncm91bmQsMC4yNWYpKSArCi0gICAgICAgIENQV0xfVXRpbHM6OkdldEJvcmRlckFwcFN0cmVhbShyY1dpbmRvdyxmQm9yZGVyV2lkdGgsY3JCb3JkZXIsY3JMZWZ0VG9wLGNyUmlnaHRCb3R0b20sbkJvcmRlclN0eWxlLGRzQm9yZGVyKTsKKyAgICBJRlhfRWRpdDo6RGVsRWRpdChwRWRpdCk7CisgIH0KIAotICAgIENGWF9CeXRlU3RyaW5nIGNzQVBfRF9PRkYgPSBjc0FQX0RfT047CisgIENGWF9CeXRlU3RyaW5nIHNBUCA9IEdldEJhY2tncm91bmRBcHBTdHJlYW0oKSArIEdldEJvcmRlckFwcFN0cmVhbSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVzLkdldEJ5dGVTdHJpbmcoKSArIHNCb2R5LkdldEJ5dGVTdHJpbmcoKTsKIAotICAgIGNzQVBfTl9PTiArPSBDUFdMX1V0aWxzOjpHZXRDaGVja0JveEFwcFN0cmVhbShyY0NsaWVudCxuU3R5bGUsY3JUZXh0KTsKLSAgICBjc0FQX0RfT04gKz0gQ1BXTF9VdGlsczo6R2V0Q2hlY2tCb3hBcHBTdHJlYW0ocmNDbGllbnQsblN0eWxlLGNyVGV4dCk7Ci0KLSAgICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9OX09OLCBwQ29udHJvbC0+R2V0Q2hlY2tlZEFQU3RhdGUoKSk7Ci0gICAgV3JpdGVBcHBlYXJhbmNlKCJOIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVBfTl9PRkYsICJPZmYiKTsKLQotICAgIFdyaXRlQXBwZWFyYW5jZSgiRCIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX0RfT04sIHBDb250cm9sLT5HZXRDaGVja2VkQVBTdGF0ZSgpKTsKLSAgICBXcml0ZUFwcGVhcmFuY2UoIkQiLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9EX09GRiwgIk9mZiIpOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NBUyA9IEdldEFwcFN0YXRlKCk7Ci0gICAgaWYgKGNzQVMuSXNFbXB0eSgpKQotICAgICAgICBTZXRBcHBTdGF0ZSgiT2ZmIik7CisgIFdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBzQVApOwogfQogCi12b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2VfUmFkaW9CdXR0b24oKQotewotICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKLSAgICBBU1NFUlQocENvbnRyb2wgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2VfVGV4dEZpZWxkKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUpIHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOworICBBU1NFUlQocENvbnRyb2wgIT0gTlVMTCk7CisgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwQ29udHJvbC0+R2V0RmllbGQoKTsKKyAgQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKIAorICBDRlhfQnl0ZVRleHRCdWYgc0JvZHksIHNMaW5lczsKIAorICBpZiAoSUZYX0VkaXQqIHBFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKSkgeworICAgIHBFZGl0LT5FbmFibGVSZWZyZXNoKEZBTFNFKTsKIAotICAgIENQV0xfQ29sb3IgY3JCYWNrZ3JvdW5kLCBjckJvcmRlciwgY3JUZXh0OwotCi0gICAgaW50IGlDb2xvclR5cGU7Ci0gICAgRlhfRkxPQVQgZmNbNF07Ci0KLSAgICBwQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSwgZmMpOwotICAgIGlmIChpQ29sb3JUeXBlID4gMCkKLSAgICAgICAgY3JCYWNrZ3JvdW5kID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7Ci0KLSAgICBwQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0gICAgaWYgKGlDb2xvclR5cGUgPiAwKQotICAgICAgICBjckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOwotCi0gICAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0gICAgaW50MzJfdCBuQm9yZGVyU3R5bGUgPSAwOwotICAgIENQV0xfRGFzaCBkc0JvcmRlcigzLDAsMCk7Ci0gICAgQ1BXTF9Db2xvciBjckxlZnRUb3AsY3JSaWdodEJvdHRvbTsKLQotICAgIHN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkKLSAgICB7Ci0gICAgY2FzZSBCQlNfREFTSDoKLSAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0RBU0g7Ci0gICAgICAgIGRzQm9yZGVyID0gQ1BXTF9EYXNoKDMsIDMsIDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEJCU19CRVZFTEVEOgotICAgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKLSAgICAgICAgZkJvcmRlcldpZHRoICo9IDI7Ci0gICAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMSk7Ci0gICAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX1V0aWxzOjpEZXZpZGVDb2xvcihjckJhY2tncm91bmQsMik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQkJTX0lOU0VUOgotICAgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfSU5TRVQ7Ci0gICAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOwotICAgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDAuNSk7Ci0gICAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDAuNzUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEJCU19VTkRFUkxJTkU6Ci0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19VTkRFUkxJTkVEOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfU09MSUQ7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIENQREZfUmVjdCByY1dpbmRvdyA9IEdldFJvdGF0ZWRSZWN0KCk7Ci0gICAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmNXaW5kb3csIGZCb3JkZXJXaWR0aCk7Ci0KLSAgICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGRhID0gcENvbnRyb2wtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0gICAgaWYgKGRhLkhhc0NvbG9yKCkpCi0gICAgewotICAgICAgICBkYS5HZXRDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0gICAgICAgIGNyVGV4dCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOwotICAgIH0KLQotICAgIGludDMyX3QgblN0eWxlID0gMDsKLQotICAgIENGWF9XaWRlU3RyaW5nIGNzV0NhcHRpb24gPSBwQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOwotICAgIGlmIChjc1dDYXB0aW9uLkdldExlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoY3NXQ2FwdGlvblswXSkKLSAgICAgICAgewotICAgICAgICBkZWZhdWx0OiAvL0wnbCc6Ci0gICAgICAgICAgICBuU3R5bGUgPSBQQ1NfQ0lSQ0xFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTCc4JzoKLSAgICAgICAgICAgIG5TdHlsZSA9IFBDU19DUk9TUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEwndSc6Ci0gICAgICAgICAgICBuU3R5bGUgPSBQQ1NfRElBTU9ORDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEwnbic6Ci0gICAgICAgICAgICBuU3R5bGUgPSBQQ1NfU1FVQVJFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTCdIJzoKLSAgICAgICAgICAgIG5TdHlsZSA9IFBDU19TVEFSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTCc0JzoKLSAgICAgICAgICAgIG5TdHlsZSA9IFBDU19DSEVDSzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5TdHlsZSA9IFBDU19DSVJDTEU7Ci0gICAgfQotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NBUF9OX09OOwotCi0gICAgQ1BERl9SZWN0IHJjQ2VudGVyID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoQ1BXTF9VdGlsczo6R2V0Q2VudGVyU3F1YXJlKHJjV2luZG93KSwgMS4wZik7Ci0KLSAgICBpZiAoblN0eWxlID09IFBDU19DSVJDTEUpCi0gICAgewotICAgICAgICBpZiAobkJvcmRlclN0eWxlID09IFBCU19CRVZFTEVEKQotICAgICAgICB7Ci0gICAgICAgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKLSAgICAgICAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX1V0aWxzOjpTdWJzdHJhY3RDb2xvcihjckJhY2tncm91bmQsMC4yNWYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5Cb3JkZXJTdHlsZSA9PSBQQlNfSU5TRVQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMC41Zik7Ci0gICAgICAgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwLjc1Zik7Ci0gICAgICAgIH0KLQotICAgICAgICBjc0FQX05fT04gPSBDUFdMX1V0aWxzOjpHZXRDaXJjbGVGaWxsQXBwU3RyZWFtKHJjQ2VudGVyLGNyQmFja2dyb3VuZCkgKwotICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0Q2lyY2xlQm9yZGVyQXBwU3RyZWFtKHJjQ2VudGVyLGZCb3JkZXJXaWR0aCxjckJvcmRlcixjckxlZnRUb3AsY3JSaWdodEJvdHRvbSxuQm9yZGVyU3R5bGUsZHNCb3JkZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjc0FQX05fT04gPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdyxjckJhY2tncm91bmQpICsKLSAgICAgICAgICAgIENQV0xfVXRpbHM6OkdldEJvcmRlckFwcFN0cmVhbShyY1dpbmRvdyxmQm9yZGVyV2lkdGgsY3JCb3JkZXIsY3JMZWZ0VG9wLGNyUmlnaHRCb3R0b20sbkJvcmRlclN0eWxlLGRzQm9yZGVyKTsKLSAgICB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc0FQX05fT0ZGID0gY3NBUF9OX09OOwotCi0gICAgc3dpdGNoIChuQm9yZGVyU3R5bGUpCi0gICAgewotICAgIGNhc2UgUEJTX0JFVkVMRUQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENQV0xfQ29sb3IgY3JUZW1wID0gY3JMZWZ0VG9wOwotICAgICAgICAgICAgY3JMZWZ0VG9wID0gY3JSaWdodEJvdHRvbTsKLSAgICAgICAgICAgIGNyUmlnaHRCb3R0b20gPSBjclRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQQlNfSU5TRVQ6Ci0gICAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMCk7Ci0gICAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc0FQX0RfT047Ci0KLSAgICBpZiAoblN0eWxlID09IFBDU19DSVJDTEUpCi0gICAgewotICAgICAgICBDUFdMX0NvbG9yIGNyQksgPSBDUFdMX1V0aWxzOjpTdWJzdHJhY3RDb2xvcihjckJhY2tncm91bmQsMC4yNWYpOwotICAgICAgICBpZiAobkJvcmRlclN0eWxlID09IFBCU19CRVZFTEVEKQotICAgICAgICB7Ci0gICAgICAgICAgICBjckxlZnRUb3AgPSBDUFdMX1V0aWxzOjpTdWJzdHJhY3RDb2xvcihjckJhY2tncm91bmQsMC4yNWYpOwotICAgICAgICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOwotICAgICAgICAgICAgY3JCSyA9IGNyQmFja2dyb3VuZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChuQm9yZGVyU3R5bGUgPT0gUEJTX0lOU0VUKQotICAgICAgICB7Ci0gICAgICAgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDApOwotICAgICAgICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjc0FQX0RfT04gPSBDUFdMX1V0aWxzOjpHZXRDaXJjbGVGaWxsQXBwU3RyZWFtKHJjQ2VudGVyLGNyQkspCi0gICAgICAgICAgICArIENQV0xfVXRpbHM6OkdldENpcmNsZUJvcmRlckFwcFN0cmVhbShyY0NlbnRlcixmQm9yZGVyV2lkdGgsY3JCb3JkZXIsY3JMZWZ0VG9wLGNyUmlnaHRCb3R0b20sbkJvcmRlclN0eWxlLGRzQm9yZGVyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3NBUF9EX09OID0gQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0ocmNXaW5kb3csQ1BXTF9VdGlsczo6U3Vic3RyYWN0Q29sb3IoY3JCYWNrZ3JvdW5kLDAuMjVmKSkgKwotICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LGZCb3JkZXJXaWR0aCxjckJvcmRlcixjckxlZnRUb3AsY3JSaWdodEJvdHRvbSxuQm9yZGVyU3R5bGUsZHNCb3JkZXIpOwotICAgIH0KLQotICAgIENGWF9CeXRlU3RyaW5nIGNzQVBfRF9PRkYgPSBjc0FQX0RfT047Ci0KLSAgICBjc0FQX05fT04gKz0gQ1BXTF9VdGlsczo6R2V0UmFkaW9CdXR0b25BcHBTdHJlYW0ocmNDbGllbnQsblN0eWxlLGNyVGV4dCk7Ci0gICAgY3NBUF9EX09OICs9IENQV0xfVXRpbHM6OkdldFJhZGlvQnV0dG9uQXBwU3RyZWFtKHJjQ2xpZW50LG5TdHlsZSxjclRleHQpOwotCi0gICAgV3JpdGVBcHBlYXJhbmNlKCJOIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVBfTl9PTiwgcENvbnRyb2wtPkdldENoZWNrZWRBUFN0YXRlKCkpOwotICAgIFdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX05fT0ZGLCAiT2ZmIik7Ci0KLSAgICBXcml0ZUFwcGVhcmFuY2UoIkQiLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9EX09OLCBwQ29udHJvbC0+R2V0Q2hlY2tlZEFQU3RhdGUoKSk7Ci0gICAgV3JpdGVBcHBlYXJhbmNlKCJEIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVBfRF9PRkYsICJPZmYiKTsKLQotICAgIENGWF9CeXRlU3RyaW5nIGNzQVMgPSBHZXRBcHBTdGF0ZSgpOwotICAgIGlmIChjc0FTLklzRW1wdHkoKSkKLSAgICAgICAgU2V0QXBwU3RhdGUoIk9mZiIpOwotfQotCi12b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2VfQ29tYm9Cb3goY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSkKLXsKLSAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldEZvcm1Db250cm9sKCk7Ci0gICAgQVNTRVJUKHBDb250cm9sICE9IE5VTEwpOwotICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwQ29udHJvbC0+R2V0RmllbGQoKTsKLSAgICBBU1NFUlQocEZpZWxkICE9IE5VTEwpOwotCi0gICAgQ0ZYX0J5dGVUZXh0QnVmIHNCb2R5LCBzTGluZXM7Ci0KLSAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0gICAgQ1BERl9SZWN0IHJjQnV0dG9uID0gcmNDbGllbnQ7Ci0gICAgcmNCdXR0b24ubGVmdCA9IHJjQnV0dG9uLnJpZ2h0IC0gMTM7Ci0gICAgcmNCdXR0b24uTm9ybWFsaXplKCk7Ci0KLSAgICBpZiAoSUZYX0VkaXQgKiBwRWRpdCA9IElGWF9FZGl0OjpOZXdFZGl0KCkpCi0gICAgewotICAgICAgICBwRWRpdC0+RW5hYmxlUmVmcmVzaChGQUxTRSk7Ci0KLSAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKLSAgICAgICAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7Ci0gICAgICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jLT5HZXRFbnYoKTsKLSAgICAgICAgQ0JBX0ZvbnRNYXAgRm9udE1hcCh0aGlzLHBFbnYtPkdldFN5c0hhbmRsZXIoKSk7Ci0gICAgICAgIEZvbnRNYXAuSW5pdGlhbCgpOwotICAgICAgICBwRWRpdC0+U2V0Rm9udE1hcCgmRm9udE1hcCk7Ci0KLSAgICAgICAgQ1BERl9SZWN0IHJjRWRpdCA9IHJjQ2xpZW50OwotICAgICAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0OwotICAgICAgICByY0VkaXQuTm9ybWFsaXplKCk7Ci0KLSAgICAgICAgcEVkaXQtPlNldFBsYXRlUmVjdChyY0VkaXQpOwotICAgICAgICBwRWRpdC0+U2V0QWxpZ25tZW50VigxKTsKLQotICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBHZXRGb250U2l6ZSgpOwotICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLSAgICAgICAgICAgIHBFZGl0LT5TZXRBdXRvRm9udFNpemUoVFJVRSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwotCi0gICAgICAgIHBFZGl0LT5Jbml0aWFsaXplKCk7Ci0KLSAgICAgICAgaWYgKHNWYWx1ZSkKLSAgICAgICAgICAgIHBFZGl0LT5TZXRUZXh0KHNWYWx1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBuQ3VyU2VsID0gcEZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KDApOwotCi0gICAgICAgICAgICBpZiAobkN1clNlbCA8IDApCi0gICAgICAgICAgICAgICAgcEVkaXQtPlNldFRleHQocEZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBFZGl0LT5TZXRUZXh0KHBGaWVsZC0+R2V0T3B0aW9uTGFiZWwobkN1clNlbCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7Ci0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXQgPSBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LENQREZfUG9pbnQoMC4wZiwwLjBmKSk7Ci0gICAgICAgIGlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNCb2R5IDw8ICIvVHggQk1DXG4iIDw8ICJxXG4iOwotICAgICAgICAgICAgaWYgKHJjQ29udGVudC5XaWR0aCgpID4gcmNFZGl0LldpZHRoKCkgfHwKLSAgICAgICAgICAgICAgICByY0NvbnRlbnQuSGVpZ2h0KCkgPiByY0VkaXQuSGVpZ2h0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc0JvZHkgPDwgcmNFZGl0LmxlZnQgPDwgIiAiIDw8IHJjRWRpdC5ib3R0b20gPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgIDw8IHJjRWRpdC5XaWR0aCgpIDw8ICIgIiA8PCByY0VkaXQuSGVpZ2h0KCkgPDwgIiByZVxuV1xublxuIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ1BXTF9Db2xvciBjclRleHQgPSBHZXRUZXh0UFdMQ29sb3IoKTsKLSAgICAgICAgICAgIHNCb2R5IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQpIDw8IHNFZGl0IDw8ICJFVFxuIiA8PCAiUVxuRU1DXG4iOwotICAgICAgICB9Ci0KLSAgICAgICAgSUZYX0VkaXQ6OkRlbEVkaXQocEVkaXQpOwotICAgIH0KLQotICAgIHNCb2R5IDw8IENQV0xfVXRpbHM6OkdldERyb3BCdXR0b25BcHBTdHJlYW0ocmNCdXR0b24pOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc0FQID0gR2V0QmFja2dyb3VuZEFwcFN0cmVhbSgpICsgR2V0Qm9yZGVyQXBwU3RyZWFtKCkgKyBzTGluZXMuR2V0Qnl0ZVN0cmluZygpICsgc0JvZHkuR2V0Qnl0ZVN0cmluZygpOwotCi0gICAgV3JpdGVBcHBlYXJhbmNlKCJOIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIHNBUCk7Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZV9MaXN0Qm94KCkKLXsKLSAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldEZvcm1Db250cm9sKCk7Ci0gICAgQVNTRVJUKHBDb250cm9sICE9IE5VTEwpOwotICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwQ29udHJvbC0+R2V0RmllbGQoKTsKLSAgICBBU1NFUlQocEZpZWxkICE9IE5VTEwpOwotCi0gICAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCi0gICAgQ0ZYX0J5dGVUZXh0QnVmIHNCb2R5LCBzTGluZXM7Ci0KLSAgICBpZiAoSUZYX0VkaXQgKiBwRWRpdCA9IElGWF9FZGl0OjpOZXdFZGl0KCkpCi0gICAgewotICAgICAgICBwRWRpdC0+RW5hYmxlUmVmcmVzaChGQUxTRSk7Ci0KLSAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKLSAgICAgICAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7Ci0gICAgICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jLT5HZXRFbnYoKTsKLQotICAgICAgICBDQkFfRm9udE1hcCBGb250TWFwKHRoaXMscEVudi0+R2V0U3lzSGFuZGxlcigpKTsKLSAgICAgICAgRm9udE1hcC5Jbml0aWFsKCk7Ci0gICAgICAgIHBFZGl0LT5TZXRGb250TWFwKCZGb250TWFwKTsKLQotICAgICAgICBwRWRpdC0+U2V0UGxhdGVSZWN0KENQREZfUmVjdChyY0NsaWVudC5sZWZ0LDAuMGYscmNDbGllbnQucmlnaHQsMC4wZikpOwotCi0gICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7Ci0KLSAgICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0gICAgICAgICAgICBwRWRpdC0+U2V0Rm9udFNpemUoMTIuMGYpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLQotICAgICAgICBwRWRpdC0+SW5pdGlhbGl6ZSgpOwotCi0gICAgICAgIENGWF9CeXRlVGV4dEJ1ZiBzTGlzdDsKLSAgICAgICAgRlhfRkxPQVQgZnkgPSByY0NsaWVudC50b3A7Ci0KLSAgICAgICAgaW50MzJfdCBuVG9wID0gcEZpZWxkLT5HZXRUb3BWaXNpYmxlSW5kZXgoKTsKLSAgICAgICAgaW50MzJfdCBuQ291bnQgPSBwRmllbGQtPkNvdW50T3B0aW9ucygpOwotICAgICAgICBpbnQzMl90IG5TZWxDb3VudCA9IHBGaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7Ci0KLSAgICAgICAgZm9yIChpbnQzMl90IGk9blRvcDsgaTxuQ291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQgPSBGQUxTRTsKLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBqPTA7IGo8blNlbENvdW50OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChqKSA9PSBpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYlNlbGVjdGVkID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwRWRpdC0+U2V0VGV4dChwRmllbGQtPkdldE9wdGlvbkxhYmVsKGkpLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7Ci0gICAgICAgICAgICBGWF9GTE9BVCBmSXRlbUhlaWdodCA9IHJjQ29udGVudC5IZWlnaHQoKTsKLQotICAgICAgICAgICAgaWYgKGJTZWxlY3RlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNJdGVtID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQsZnktZkl0ZW1IZWlnaHQscmNDbGllbnQucmlnaHQsZnkpOwotICAgICAgICAgICAgICAgIHNMaXN0IDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwwLDUxLjBmLzI1NS4wZiwxMTMuMGYvMjU1LjBmKSxUUlVFKQotICAgICAgICAgICAgICAgICAgICA8PCByY0l0ZW0ubGVmdCA8PCAiICIgPDwgcmNJdGVtLmJvdHRvbSA8PCAiICIgPDwgcmNJdGVtLldpZHRoKCkgPDwgIiAiIDw8IHJjSXRlbS5IZWlnaHQoKSA8PCAiIHJlIGZcbiIgPDwgIlFcbiI7Ci0KLSAgICAgICAgICAgICAgICBzTGlzdCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwxKSxUUlVFKSA8PAotICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LENQREZfUG9pbnQoMC4wZixmeSkpIDw8ICJFVFxuIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDUFdMX0NvbG9yIGNyVGV4dCA9IEdldFRleHRQV0xDb2xvcigpOwotICAgICAgICAgICAgICAgIHNMaXN0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsVFJVRSkgPDwKLSAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LENQREZfUG9pbnQoMC4wZixmeSkpIDw8ICJFVFxuIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnkgLT0gZkl0ZW1IZWlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc0xpc3QuR2V0U2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgc0JvZHkgPDwgIi9UeCBCTUNcbiIgPDwgInFcbiIgPDwgcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICA8PCByY0NsaWVudC5XaWR0aCgpIDw8ICIgIiA8PCByY0NsaWVudC5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOwotICAgICAgICAgICAgc0JvZHkgPDwgc0xpc3QgPDwgIlFcbkVNQ1xuIjsKLSAgICAgICAgfQotCi0gICAgICAgIElGWF9FZGl0OjpEZWxFZGl0KHBFZGl0KTsKLSAgICB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyBzQVAgPSBHZXRCYWNrZ3JvdW5kQXBwU3RyZWFtKCkgKyBHZXRCb3JkZXJBcHBTdHJlYW0oKSArIHNMaW5lcy5HZXRCeXRlU3RyaW5nKCkgKyBzQm9keS5HZXRCeXRlU3RyaW5nKCk7Ci0KLSAgICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgc0FQKTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlX1RleHRGaWVsZChjb25zdCBGWF9XQ0hBUiogc1ZhbHVlKQotewotCUNQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKLQlBU1NFUlQocENvbnRyb2wgIT0gTlVMTCk7Ci0JQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IHBDb250cm9sLT5HZXRGaWVsZCgpOwotCUFTU0VSVChwRmllbGQgIT0gTlVMTCk7Ci0KLQlDRlhfQnl0ZVRleHRCdWYgc0JvZHksIHNMaW5lczsKLQotCWlmIChJRlhfRWRpdCAqIHBFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKSkKLQl7Ci0JCXBFZGl0LT5FbmFibGVSZWZyZXNoKEZBTFNFKTsKLQotCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpOwotCQlBU1NFUlQocERvYyAhPSBOVUxMKTsKLQkJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2MtPkdldEVudigpOwotCi0JCUNCQV9Gb250TWFwIEZvbnRNYXAodGhpcyxwRW52LT5HZXRTeXNIYW5kbGVyKCkpOy8vLCBJU3lzdGVtSGFuZGxlOjpHZXRTeXN0ZW1IYW5kbGVyKG1fcEJhc2VGb3JtLT5HZXRFbnYoKSkpOwotCQlGb250TWFwLkluaXRpYWwoKTsKLQkJcEVkaXQtPlNldEZvbnRNYXAoJkZvbnRNYXApOwotCi0JCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQkJcEVkaXQtPlNldFBsYXRlUmVjdChyY0NsaWVudCk7Ci0JCXBFZGl0LT5TZXRBbGlnbm1lbnRIKHBDb250cm9sLT5HZXRDb250cm9sQWxpZ25tZW50KCkpOwotCi0JCUZYX0RXT1JEIGR3RmllbGRGbGFncyA9IHBGaWVsZC0+R2V0RmllbGRGbGFncygpOwotCQlGWF9CT09MIGJNdWx0aUxpbmUgPSAoZHdGaWVsZEZsYWdzID4+IDEyKSAmIDE7Ci0KLQkJaWYgKGJNdWx0aUxpbmUpCi0JCXsKLQkJCXBFZGl0LT5TZXRNdWx0aUxpbmUoVFJVRSk7Ci0JCQlwRWRpdC0+U2V0QXV0b1JldHVybihUUlVFKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBFZGl0LT5TZXRBbGlnbm1lbnRWKDEpOwotCQl9Ci0KLQkJRlhfV09SRCBzdWJXb3JkID0gMDsKLQkJaWYgKChkd0ZpZWxkRmxhZ3MgPj4gMTMpICYgMSkKLQkJewotCQkJc3ViV29yZCA9ICcqJzsKLQkJCXBFZGl0LT5TZXRQYXNzd29yZENoYXIoc3ViV29yZCk7Ci0JCX0KLQotCQlpbnQgbk1heExlbiA9IHBGaWVsZC0+R2V0TWF4TGVuKCk7Ci0JCUZYX0JPT0wgYkNoYXJBcnJheSA9IChkd0ZpZWxkRmxhZ3MgPj4gMjQpICYgMTsKLQkJRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKLQotCQlDRlhfV2lkZVN0cmluZyBzVmFsdWVUbXA7Ci0JCWlmICghc1ZhbHVlICYmIChOVUxMICE9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKSkKLQkJewotCQkJc1ZhbHVlVG1wID0gR2V0VmFsdWUoVFJVRSk7Ci0JCQlzVmFsdWUgPSBzVmFsdWVUbXA7Ci0JCX0KLQotCQlpZiAobk1heExlbiA+IDApCi0JCXsKLQkJCWlmIChiQ2hhckFycmF5KQotCQkJewotCQkJCXBFZGl0LT5TZXRDaGFyQXJyYXkobk1heExlbik7Ci0KLQkJCQlpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLQkJCQl7Ci0JCQkJCWZGb250U2l6ZSA9IENQV0xfRWRpdDo6R2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKEZvbnRNYXAuR2V0UERGRm9udCgwKSxyY0NsaWVudCxuTWF4TGVuKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKHNWYWx1ZSkKLQkJCQkJbk1heExlbiA9IHdjc2xlbigoY29uc3Qgd2NoYXJfdCopc1ZhbHVlKTsKLQkJCQlwRWRpdC0+U2V0TGltaXRDaGFyKG5NYXhMZW4pOwotCQkJfQotCQl9Ci0KLQkJaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0JCQlwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKFRSVUUpOwotCQllbHNlCi0JCQlwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLQotCQlwRWRpdC0+SW5pdGlhbGl6ZSgpOwotCi0JCWlmIChzVmFsdWUpCi0JCQlwRWRpdC0+U2V0VGV4dChzVmFsdWUpOwotCQllbHNlCi0JCQlwRWRpdC0+U2V0VGV4dChwRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7Ci0KLQkJQ1BERl9SZWN0IHJjQ29udGVudCA9IHBFZGl0LT5HZXRDb250ZW50UmVjdCgpOwotCi0JCUNGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShwRWRpdCxDUERGX1BvaW50KDAuMGYsMC4wZiksCi0JCQkJCQkJCQkJCQkJCQkJCU5VTEwsIWJDaGFyQXJyYXksc3ViV29yZCk7Ci0KLQkJaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkKLQkJewotCQkJc0JvZHkgPDwgIi9UeCBCTUNcbiIgPDwgInFcbiI7Ci0JCQlpZiAocmNDb250ZW50LldpZHRoKCkgPiByY0NsaWVudC5XaWR0aCgpIHx8Ci0JCQkJcmNDb250ZW50LkhlaWdodCgpID4gcmNDbGllbnQuSGVpZ2h0KCkpCi0JCQl7Ci0JCQkJc0JvZHkgPDwgcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgIgotCQkJCQk8PCByY0NsaWVudC5XaWR0aCgpIDw8ICIgIiA8PCByY0NsaWVudC5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOwotCQkJfQotCQkJQ1BXTF9Db2xvciBjclRleHQgPSBHZXRUZXh0UFdMQ29sb3IoKTsKLQkJCXNCb2R5IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQpIDw8IHNFZGl0IDw8ICJFVFxuIiA8PCAiUVxuRU1DXG4iOwotCQl9Ci0KLQkJaWYgKGJDaGFyQXJyYXkpCi0JCXsKLQkJCXN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkKLQkJCXsKLQkJCWNhc2UgQkJTX1NPTElEOgotCQkJCXsKLQkJCQkJQ0ZYX0J5dGVTdHJpbmcgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSxGQUxTRSk7Ci0JCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJCQl7Ci0JCQkJCQlzTGluZXMgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKLQkJCQkJCQk8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLEZBTFNFKSA8PCAiIDIgSiAwIGpcbiI7Ci0KLQkJCQkJCWZvciAoaW50MzJfdCBpPTE7aTxuTWF4TGVuO2krKykKLQkJCQkJCXsKLQkJCQkJCQlzTGluZXMgPDwgcmNDbGllbnQubGVmdCArICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KS9uTWF4TGVuKSppIDw8ICIgIgotCQkJCQkJCQk8PCByY0NsaWVudC5ib3R0b20gPDwgIiBtXG4iCi0JCQkJCQkJCTw8IHJjQ2xpZW50LmxlZnQgKyAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkvbk1heExlbikqaSA8PCAiICIKLQkJCQkJCQkJPDwgcmNDbGllbnQudG9wIDw8ICIgbCBTXG4iOwotCQkJCQkJfQotCi0JCQkJCQlzTGluZXMgPDwgIlFcbiI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJCU19EQVNIOgotCQkJCXsKLQkJCQkJQ0ZYX0J5dGVTdHJpbmcgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSxGQUxTRSk7Ci0JCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJCQl7Ci0JCQkJCQlDUFdMX0Rhc2ggZHNCb3JkZXIgPSBDUFdMX0Rhc2goMywgMywgMCk7Ci0KLQkJCQkJCXNMaW5lcyA8PCAicVxuIiA8PCBHZXRCb3JkZXJXaWR0aCgpIDw8ICIgd1xuIgotCQkJCQkJCTw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksRkFMU0UpCi0JCQkJCQkJPDwgIlsiIDw8IGRzQm9yZGVyLm5EYXNoIDw8ICIgIgotCQkJCQkJCTw8IGRzQm9yZGVyLm5HYXAgPDwgIl0gIgotCQkJCQkJCTw8IGRzQm9yZGVyLm5QaGFzZSA8PCAiIGRcbiI7Ci0KLQkJCQkJCWZvciAoaW50MzJfdCBpPTE7aTxuTWF4TGVuO2krKykKLQkJCQkJCXsKLQkJCQkJCQlzTGluZXMgPDwgcmNDbGllbnQubGVmdCArICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KS9uTWF4TGVuKSppIDw8ICIgIgotCQkJCQkJCQk8PCByY0NsaWVudC5ib3R0b20gPDwgIiBtXG4iCi0JCQkJCQkJCTw8IHJjQ2xpZW50LmxlZnQgKyAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkvbk1heExlbikqaSA8PCAiICIKLQkJCQkJCQkJPDwgcmNDbGllbnQudG9wIDw8ICIgbCBTXG4iOwotCQkJCQkJfQotCi0JCQkJCQlzTGluZXMgPDwgIlFcbiI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlJRlhfRWRpdDo6RGVsRWRpdChwRWRpdCk7Ci0JfQotCi0JQ0ZYX0J5dGVTdHJpbmcgc0FQID0gR2V0QmFja2dyb3VuZEFwcFN0cmVhbSgpICsgR2V0Qm9yZGVyQXBwU3RyZWFtKCkgKyBzTGluZXMuR2V0Qnl0ZVN0cmluZygpICsgc0JvZHkuR2V0Qnl0ZVN0cmluZygpOwotCVdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBzQVApOwotfQotCi1DUERGX1JlY3QgQ1BERlNES19XaWRnZXQ6OkdldENsaWVudFJlY3QoKSBjb25zdAotewotICAgIENQREZfUmVjdCByY1dpbmRvdyA9IEdldFJvdGF0ZWRSZWN0KCk7Ci0gICAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0gICAgc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKQotICAgIHsKLSAgICBjYXNlIEJCU19CRVZFTEVEOgotICAgIGNhc2UgQkJTX0lOU0VUOgotICAgICAgICBmQm9yZGVyV2lkdGggKj0gMi4wZjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJjV2luZG93LCBmQm9yZGVyV2lkdGgpOwotfQotCi1DUERGX1JlY3QgQ1BERlNES19XaWRnZXQ6OkdldFJvdGF0ZWRSZWN0KCkgY29uc3QKLXsKLSAgICBDUERGX1JlY3QgcmVjdEFubm90ID0gR2V0UmVjdCgpOwotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHJlY3RBbm5vdC5yaWdodCAtIHJlY3RBbm5vdC5sZWZ0OwotICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSByZWN0QW5ub3QudG9wIC0gcmVjdEFubm90LmJvdHRvbTsKLQotICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKLSAgICBDUERGX1JlY3QgcmNQREZXaW5kb3c7Ci0gICAgc3dpdGNoKGFicyhwQ29udHJvbC0+R2V0Um90YXRpb24oKSAlIDM2MCkpCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgIGNhc2UgMTgwOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmNQREZXaW5kb3cgPSBDUERGX1JlY3QoMCwgMCwgZldpZHRoLCBmSGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDkwOgotICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgIHJjUERGV2luZG93ID0gQ1BERl9SZWN0KDAsIDAsIGZIZWlnaHQsIGZXaWR0aCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmNQREZXaW5kb3c7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXRCYWNrZ3JvdW5kQXBwU3RyZWFtKCkgY29uc3QKLXsKLSAgICBDUFdMX0NvbG9yIGNyQmFja2dyb3VuZCA9IEdldEZpbGxQV0xDb2xvcigpOwotICAgIGlmIChjckJhY2tncm91bmQubkNvbG9yVHlwZSAhPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQpIHsKLSAgICAgICAgcmV0dXJuIENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKEdldFJvdGF0ZWRSZWN0KCksIGNyQmFja2dyb3VuZCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldEJvcmRlckFwcFN0cmVhbSgpIGNvbnN0Ci17Ci0gICAgQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsKLSAgICBDUFdMX0NvbG9yIGNyQm9yZGVyID0gR2V0Qm9yZGVyUFdMQ29sb3IoKTsKLSAgICBDUFdMX0NvbG9yIGNyQmFja2dyb3VuZCA9IEdldEZpbGxQV0xDb2xvcigpOwotICAgIENQV0xfQ29sb3IgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tOwotCi0gICAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0gICAgaW50MzJfdCBuQm9yZGVyU3R5bGUgPSAwOwotICAgIENQV0xfRGFzaCBkc0JvcmRlcigzLDAsMCk7Ci0KLSAgICBzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpCi0gICAgewotICAgIGNhc2UgQkJTX0RBU0g6Ci0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19EQVNIOwotICAgICAgICBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCQlNfQkVWRUxFRDoKLSAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7Ci0gICAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOwotICAgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKLSAgICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfVXRpbHM6OkRldmlkZUNvbG9yKGNyQmFja2dyb3VuZCwgMik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQkJTX0lOU0VUOgotICAgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfSU5TRVQ7Ci0gICAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOwotICAgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjUpOwotICAgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC43NSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQkJTX1VOREVSTElORToKLSAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1VOREVSTElORUQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIENQV0xfVXRpbHM6OkdldEJvcmRlckFwcFN0cmVhbShyY1dpbmRvdywgZkJvcmRlcldpZHRoLCBjckJvcmRlciwgY3JMZWZ0VG9wLAotICAgICAgICBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsIGRzQm9yZGVyKTsKLX0KLQotQ1BERl9NYXRyaXggQ1BERlNES19XaWRnZXQ6OkdldE1hdHJpeCgpIGNvbnN0Ci17Ci0gICAgQ1BERl9NYXRyaXggbXQ7Ci0gICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOwotICAgIEFTU0VSVChwQ29udHJvbCAhPSBOVUxMKTsKLQotICAgIENQREZfUmVjdCByY0Fubm90ID0gR2V0UmVjdCgpOwotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQ7Ci0gICAgRlhfRkxPQVQgZkhlaWdodCA9IHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b207Ci0KLQotCi0gICAgc3dpdGNoIChhYnMocENvbnRyb2wtPkdldFJvdGF0aW9uKCkgJSAzNjApKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbXQgPSBDUERGX01hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgbXQgPSBDUERGX01hdHJpeCgwLCAxLCAtMSwgMCwgZldpZHRoLCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIG10ID0gQ1BERl9NYXRyaXgoLTEsIDAsIDAsIC0xLCBmV2lkdGgsIGZIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcwOgotICAgICAgICAgICAgbXQgPSBDUERGX01hdHJpeCgwLCAtMSwgMSwgMCwgMCwgZkhlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gbXQ7Ci19Ci0KLUNQV0xfQ29sb3IgQ1BERlNES19XaWRnZXQ6OkdldFRleHRQV0xDb2xvcigpIGNvbnN0Ci17Ci0gICAgQ1BXTF9Db2xvciBjclRleHQgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKLQotICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0gICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQotICAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgZGEgPSBwRm9ybUN0cmwtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0gICAgaWYgKGRhLkhhc0NvbG9yKCkpCi0gICAgewotICAgICAgICBpbnQzMl90IGlDb2xvclR5cGU7Ci0gICAgICAgIEZYX0ZMT0FUIGZjWzRdOwotICAgICAgICBkYS5HZXRDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0gICAgICAgIGNyVGV4dCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOwotICAgIH0KLQotICAgIHJldHVybiBjclRleHQ7Ci19Ci0KLUNQV0xfQ29sb3IgQ1BERlNES19XaWRnZXQ6OkdldEJvcmRlclBXTENvbG9yKCkgY29uc3QKLXsKLSAgICBDUFdMX0NvbG9yIGNyQm9yZGVyOwotCi0gICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKLSAgICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOwotCi0gICAgaW50MzJfdCBpQ29sb3JUeXBlOwotICAgIEZYX0ZMT0FUIGZjWzRdOwotICAgIHBGb3JtQ3RybC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0gICAgaWYgKGlDb2xvclR5cGUgPiAwKQotICAgICAgICBjckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOwotCi0gICAgcmV0dXJuIGNyQm9yZGVyOwotfQotCi1DUFdMX0NvbG9yIENQREZTREtfV2lkZ2V0OjpHZXRGaWxsUFdMQ29sb3IoKSBjb25zdAotewotICAgIENQV0xfQ29sb3IgY3JGaWxsOwotCi0gICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKLSAgICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOwotCi0gICAgaW50MzJfdCBpQ29sb3JUeXBlOwotICAgIEZYX0ZMT0FUIGZjWzRdOwotICAgIHBGb3JtQ3RybC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSwgZmMpOwotICAgIGlmIChpQ29sb3JUeXBlID4gMCkKLSAgICAgICAgY3JGaWxsID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7Ci0KLSAgICByZXR1cm4gY3JGaWxsOwotfQotCi12b2lkIENQREZTREtfV2lkZ2V0OjpBZGRJbWFnZVRvQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSwgQ1BERl9TdHJlYW0qIHBJbWFnZSkKLXsKLSAgICBBU1NFUlQocEltYWdlICE9IE5VTEwpOwotCi0gICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IG1fcFBhZ2VWaWV3LT5HZXRQREZEb2N1bWVudCgpOy8vcERvY3VtZW50LT5HZXREb2N1bWVudCgpOworICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2MgPSBtX3BJbnRlckZvcm0tPkdldERvY3VtZW50KCk7CiAgICAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7CisgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2MtPkdldEVudigpOwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJBUCIpOwotICAgIEFTU0VSVChwQVBEaWN0ICE9IE5VTEwpOworICAgIENCQV9Gb250TWFwIEZvbnRNYXAoCisgICAgICAgIHRoaXMsCisgICAgICAgIHBFbnYtPkdldFN5c0hhbmRsZXIoKSk7ICAvLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSVN5c3RlbUhhbmRsZTo6R2V0U3lzdGVtSGFuZGxlcihtX3BCYXNlRm9ybS0+R2V0RW52KCkpKTsKKyAgICBGb250TWFwLkluaXRpYWwoKTsKKyAgICBwRWRpdC0+U2V0Rm9udE1hcCgmRm9udE1hcCk7CiAKLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBBUERpY3QtPkdldFN0cmVhbShzQVBUeXBlKTsKLSAgICBBU1NFUlQocFN0cmVhbSAhPSBOVUxMKTsKKyAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgICAgcEVkaXQtPlNldFBsYXRlUmVjdChyY0NsaWVudCk7CisgICAgcEVkaXQtPlNldEFsaWdubWVudEgocENvbnRyb2wtPkdldENvbnRyb2xBbGlnbm1lbnQoKSk7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1EaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwotICAgIEFTU0VSVChwU3RyZWFtRGljdCAhPSBOVUxMKTsKKyAgICBGWF9EV09SRCBkd0ZpZWxkRmxhZ3MgPSBwRmllbGQtPkdldEZpZWxkRmxhZ3MoKTsKKyAgICBGWF9CT09MIGJNdWx0aUxpbmUgPSAoZHdGaWVsZEZsYWdzID4+IDEyKSAmIDE7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBzSW1hZ2VBbGlhcyA9ICJJTUciOwotCi0gICAgaWYgKENQREZfRGljdGlvbmFyeSogcEltYWdlRGljdCA9IHBJbWFnZS0+R2V0RGljdCgpKQotICAgIHsKLSAgICAgICAgc0ltYWdlQWxpYXMgPSBwSW1hZ2VEaWN0LT5HZXRTdHJpbmcoIk5hbWUiKTsKLSAgICAgICAgaWYgKHNJbWFnZUFsaWFzLklzRW1wdHkoKSkKLSAgICAgICAgICAgIHNJbWFnZUFsaWFzID0gIklNRyI7CisgICAgaWYgKGJNdWx0aUxpbmUpIHsKKyAgICAgIHBFZGl0LT5TZXRNdWx0aUxpbmUoVFJVRSk7CisgICAgICBwRWRpdC0+U2V0QXV0b1JldHVybihUUlVFKTsKKyAgICB9IGVsc2UgeworICAgICAgcEVkaXQtPlNldEFsaWdubWVudFYoMSk7CiAgICAgfQogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKLQlpZiAoIXBTdHJlYW1SZXNMaXN0KQotCXsKLQkJcFN0cmVhbVJlc0xpc3QgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5KCk7Ci0JCXBTdHJlYW1EaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcFN0cmVhbVJlc0xpc3QpOwotCX0KLQotCWlmIChwU3RyZWFtUmVzTGlzdCkKLQl7Ci0JCUNQREZfRGljdGlvbmFyeSogcFhPYmplY3QgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5OwotCQlwWE9iamVjdC0+U2V0QXRSZWZlcmVuY2Uoc0ltYWdlQWxpYXMsIHBEb2MsIHBJbWFnZSk7Ci0JCXBTdHJlYW1SZXNMaXN0LT5TZXRBdCgiWE9iamVjdCIsIHBYT2JqZWN0KTsKLQl9Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlJlbW92ZUFwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUpCi17Ci0gICAgaWYgKENQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQVAiKSkKLSAgICB7Ci0gICAgICAgIHBBUERpY3QtPlJlbW92ZUF0KHNBUFR5cGUpOworICAgIEZYX1dPUkQgc3ViV29yZCA9IDA7CisgICAgaWYgKChkd0ZpZWxkRmxhZ3MgPj4gMTMpICYgMSkgeworICAgICAgc3ViV29yZCA9ICcqJzsKKyAgICAgIHBFZGl0LT5TZXRQYXNzd29yZENoYXIoc3ViV29yZCk7CiAgICAgfQotfQogCi1GWF9CT09MIENQREZTREtfV2lkZ2V0OjpPbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKKyAgICBpbnQgbk1heExlbiA9IHBGaWVsZC0+R2V0TWF4TGVuKCk7CisgICAgRlhfQk9PTCBiQ2hhckFycmF5ID0gKGR3RmllbGRGbGFncyA+PiAyNCkgJiAxOworICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7CiAKLQlDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcERvY3VtZW50LT5HZXREb2N1bWVudCgpOwotCUFTU0VSVChwRG9jICE9IE5VTEwpOwotCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2N1bWVudC0+R2V0RW52KCk7Ci0JQVNTRVJUKHBFbnYgIT0gTlVMTCk7Ci0KLQlpZiAoSVhGQV9XaWRnZXQqIGhXaWRnZXQgPSB0aGlzLT5HZXRNaXhYRkFXaWRnZXQoKSkKLQl7Ci0JCVhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSA9IEdldFhGQUV2ZW50VHlwZSh0eXBlLCBkYXRhLmJXaWxsQ29tbWl0KTsKLQotCQlpZiAoZUV2ZW50VHlwZSAhPSBYRkFfRVZFTlRfVW5rbm93bikKLQkJewotCQkJaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpCi0JCQl7Ci0JCQkJQ1hGQV9FdmVudFBhcmFtIHBhcmFtOwotCQkJCXBhcmFtLm1fZVR5cGUgPSBlRXZlbnRUeXBlOwotCQkJCXBhcmFtLm1fd3NDaGFuZ2UgPSBkYXRhLnNDaGFuZ2U7Ci0JCQkJcGFyYW0ubV9pQ29tbWl0S2V5ID0gZGF0YS5uQ29tbWl0S2V5OwotCQkJCXBhcmFtLm1fYlNoaWZ0ID0gZGF0YS5iU2hpZnQ7Ci0JCQkJcGFyYW0ubV9pU2VsU3RhcnQgPSBkYXRhLm5TZWxTdGFydDsKLQkJCQlwYXJhbS5tX2lTZWxFbmQgPSBkYXRhLm5TZWxFbmQ7Ci0JCQkJcGFyYW0ubV93c0Z1bGxUZXh0ID0gZGF0YS5zVmFsdWU7Ci0JCQkJcGFyYW0ubV9iS2V5RG93biA9IGRhdGEuYktleURvd247Ci0JCQkJcGFyYW0ubV9iTW9kaWZpZXIgPSBkYXRhLmJNb2RpZmllcjsKLQkJCQlwYXJhbS5tX3dzTmV3VGV4dCA9IGRhdGEuc1ZhbHVlOwotCQkJCWlmIChkYXRhLm5TZWxFbmQgPiBkYXRhLm5TZWxTdGFydCkKLQkJCQkJcGFyYW0ubV93c05ld1RleHQuRGVsZXRlKGRhdGEublNlbFN0YXJ0LCBkYXRhLm5TZWxFbmQgLSBkYXRhLm5TZWxTdGFydCk7Ci0JCQkJZm9yIChpbnQgaT1kYXRhLnNDaGFuZ2UuR2V0TGVuZ3RoKCkgLSAxOyBpPj0wOyBpLS0pCi0JCQkJCXBhcmFtLm1fd3NOZXdUZXh0Lkluc2VydChkYXRhLm5TZWxTdGFydCwgZGF0YS5zQ2hhbmdlW2ldKTsKLQkJCQlwYXJhbS5tX3dzUHJldlRleHQgPSBkYXRhLnNWYWx1ZTsKLQotCQkJCUNYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCk7Ci0JCQkJcGFyYW0ubV9wVGFyZ2V0ID0gcEFjYzsKLQkJCQlpbnQzMl90IG5SZXQgPSBwWEZBV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBBY2MsICZwYXJhbSk7Ci0KLQkJCQlpZiAoSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKSkKLQkJCQl7Ci0JCQkJCXBEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7Ci0JCQkJfQotCi0JCQkJaWYgKG5SZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzKQotCQkJCQlyZXR1cm4gVFJVRTsKLQkJCX0KLQkJfQotCX0KLQotCUNQREZfQWN0aW9uIGFjdGlvbiA9IEdldEFBY3Rpb24odHlwZSk7Ci0KLQlpZiAoYWN0aW9uICYmIGFjdGlvbi5HZXRUeXBlKCkgIT0gQ1BERl9BY3Rpb246OlVua25vd24pCi0JewotICAgICAgICBDUERGU0RLX0FjdGlvbkhhbmRsZXIqIHBBY3Rpb25IYW5kbGVyID0gcEVudi0+R2V0QWN0aW9uSGFuZGVyKCk7Ci0gICAgICAgIHJldHVybiBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fRmllbGQoYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIEdldEZvcm1GaWVsZCgpLCBkYXRhKTsKKyAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWVUbXA7CisgICAgaWYgKCFzVmFsdWUgJiYgKE5VTEwgIT0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpKSB7CisgICAgICBzVmFsdWVUbXAgPSBHZXRWYWx1ZShUUlVFKTsKKyAgICAgIHNWYWx1ZSA9IHNWYWx1ZVRtcDsKICAgICB9Ci0JcmV0dXJuIEZBTFNFOwotfQogCi1DUERGX0FjdGlvbglDUERGU0RLX1dpZGdldDo6R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQpCi17Ci0Jc3dpdGNoIChlQUFUKQotCXsKLQljYXNlIENQREZfQUFjdGlvbjo6Q3Vyc29yRW50ZXI6Ci0JY2FzZSBDUERGX0FBY3Rpb246OkN1cnNvckV4aXQ6Ci0JY2FzZSBDUERGX0FBY3Rpb246OkJ1dHRvbkRvd246Ci0JY2FzZSBDUERGX0FBY3Rpb246OkJ1dHRvblVwOgotCWNhc2UgQ1BERl9BQWN0aW9uOjpHZXRGb2N1czoKLQljYXNlIENQREZfQUFjdGlvbjo6TG9zZUZvY3VzOgotCWNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlT3BlbjoKLQljYXNlIENQREZfQUFjdGlvbjo6UGFnZUNsb3NlOgotCWNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlVmlzaWJsZToKLQljYXNlIENQREZfQUFjdGlvbjo6UGFnZUludmlzaWJsZToKLQkJcmV0dXJuIENQREZTREtfQkFBbm5vdDo6R2V0QUFjdGlvbihlQUFUKTsKKyAgICBpZiAobk1heExlbiA+IDApIHsKKyAgICAgIGlmIChiQ2hhckFycmF5KSB7CisgICAgICAgIHBFZGl0LT5TZXRDaGFyQXJyYXkobk1heExlbik7CiAKLQljYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgotCWNhc2UgQ1BERl9BQWN0aW9uOjpGb3JtYXQ6Ci0JY2FzZSBDUERGX0FBY3Rpb246OlZhbGlkYXRlOgotCWNhc2UgQ1BERl9BQWN0aW9uOjpDYWxjdWxhdGU6Ci0JCXsKLQkJCUNQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKLQkJCWlmIChDUERGX0FBY3Rpb24gYWEgPSBwRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKSkKLQkJCQlyZXR1cm4gYWEuR2V0QWN0aW9uKGVBQVQpOwotCQkJcmV0dXJuIENQREZTREtfQkFBbm5vdDo6R2V0QUFjdGlvbihlQUFUKTsKLQkJfQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotICAgIHJldHVybiBDUERGX0FjdGlvbigpOwotfQotCi0KLUNGWF9XaWRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXRBbHRlcm5hdGVOYW1lKCkgY29uc3QKLXsKLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgcmV0dXJuIHBGb3JtRmllbGQtPkdldEFsdGVybmF0ZU5hbWUoKTsKLX0KLQotaW50MzJfdCBDUERGU0RLX1dpZGdldDo6R2V0QXBwZWFyYW5jZUFnZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fbkFwcEFnZTsKLX0KLQotaW50MzJfdCBDUERGU0RLX1dpZGdldDo6R2V0VmFsdWVBZ2UoKSBjb25zdAotewotICAgIHJldHVybiBtX25WYWx1ZUFnZTsKLX0KLQotCi1GWF9CT09MIENQREZTREtfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSkKLXsKLSAgICBDUERGX0Fubm90KiBwQW5ub3QgPSBHZXRQREZBbm5vdCgpOwotICAgIENGWF9GbG9hdFJlY3QgYW5ub3RSZWN0OwotICAgIHBBbm5vdC0+R2V0UmVjdChhbm5vdFJlY3QpOwotICAgIGlmKGFubm90UmVjdC5Db250YWlucyhwYWdlWCwgcGFnZVkpKQotICAgIHsKLSAgICAgICAgaWYgKCFJc1Zpc2libGUoKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGludCBuRmllbGRGbGFncyA9IEdldEZpZWxkRmxhZ3MoKTsKLSAgICAgICAgaWYgKChuRmllbGRGbGFncyAmIEZJRUxERkxBR19SRUFET05MWSkgPT0gRklFTERGTEFHX1JFQURPTkxZKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLS8vQ1BERlNES19YRkFXaWRnZXQKLUNQREZTREtfWEZBV2lkZ2V0OjpDUERGU0RLX1hGQVdpZGdldChJWEZBX1dpZGdldCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtKSA6Ci0JQ1BERlNES19Bbm5vdChwUGFnZVZpZXcpLAotCW1faFhGQVdpZGdldChwQW5ub3QpLAotCW1fcEludGVyRm9ybShwSW50ZXJGb3JtKQotewotCi19Ci0KLUZYX0JPT0wgQ1BERlNES19YRkFXaWRnZXQ6OklzWEZBRmllbGQoKQotewotCXJldHVybiBUUlVFOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUERGU0RLX1hGQVdpZGdldDo6R2V0VHlwZSgpIGNvbnN0Ci17Ci0JcmV0dXJuIEZTREtfWEZBV0lER0VUX1RZUEVOQU1FOwotfQotCi1DRlhfRmxvYXRSZWN0IENQREZTREtfWEZBV2lkZ2V0OjpHZXRSZWN0KCkKLXsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRQYWdlVmlldygpOwotCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0KLQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotCUNQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwRG9jdW1lbnQtPkdldERvY3VtZW50KCk7Ci0JQVNTRVJUKHBEb2MgIT0gTlVMTCk7Ci0KLQlJWEZBX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpOwotCUFTU0VSVChwRG9jVmlldyAhPSBOVUxMKTsKLQotCUlYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBwRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOwotCUFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKLQotCUNGWF9SZWN0RiByY0JCb3g7Ci0JcFdpZGdldEhhbmRsZXItPkdldFJlY3QoR2V0WEZBV2lkZ2V0KCksIHJjQkJveCk7Ci0KLQlyZXR1cm4gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gubGVmdCwgcmNCQm94LnRvcCwgcmNCQm94LmxlZnQgKyByY0JCb3gud2lkdGgsIHJjQkJveC50b3ArcmNCQm94LmhlaWdodCk7Ci19Ci0KLS8vQ1BERlNES19JbnRlckZvcm0KLUNQREZTREtfSW50ZXJGb3JtOjpDUERGU0RLX0ludGVyRm9ybShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi0JOm1fcERvY3VtZW50KHBEb2N1bWVudCksCi0JbV9wSW50ZXJGb3JtKE5VTEwpLAotCW1fYkNhbGN1bGF0ZShUUlVFKSwKLQltX2JYZmFDYWxjdWxhdGUoVFJVRSksCi0JbV9iWGZhVmFsaWRhdGlvbnNFbmFibGVkKFRSVUUpLAotCW1fYkJ1c3koRkFMU0UpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCW1fcEludGVyRm9ybSA9IG5ldyBDUERGX0ludGVyRm9ybShtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCksIEZBTFNFKTsKLQlBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCW1fcEludGVyRm9ybS0+U2V0Rm9ybU5vdGlmeSh0aGlzKTsKLQotICAgIGZvcihpbnQgaT0wOyBpPDY7IGkrKykKLSAgICAgICAgbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSBGQUxTRTsKLSAgICBtX2lIaWdobGlnaHRBbHBoYSA9IDA7Ci19Ci0KLUNQREZTREtfSW50ZXJGb3JtOjp+Q1BERlNES19JbnRlckZvcm0oKQotewotICAgIGRlbGV0ZSBtX3BJbnRlckZvcm07Ci0gICAgbV9wSW50ZXJGb3JtID0gbnVsbHB0cjsKLQotICAgIG1fTWFwLmNsZWFyKCk7Ci0gICAgbV9YRkFNYXAuUmVtb3ZlQWxsKCk7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkhpZ2hsaWdodFdpZGdldHMoKQotewotICAgIHJldHVybiBGQUxTRTsKLX0KLQotQ1BERlNES19XaWRnZXQqIENQREZTREtfSW50ZXJGb3JtOjpHZXRTaWJsaW5nKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJOZXh0KSBjb25zdAotewotICAgIG5vbnN0ZDo6dW5pcXVlX3B0cjxDQkFfQW5ub3RJdGVyYXRvcj4gcEl0ZXJhdG9yKAotICAgICAgICBuZXcgQ0JBX0Fubm90SXRlcmF0b3IocFdpZGdldC0+R2V0UGFnZVZpZXcoKSwgIldpZGdldCIsICIiKSk7Ci0KLSAgICBpZiAoYk5leHQpIHsKLSAgICAgICAgcmV0dXJuIChDUERGU0RLX1dpZGdldCopcEl0ZXJhdG9yLT5HZXROZXh0QW5ub3QocFdpZGdldCk7Ci0gICAgfQotICAgIHJldHVybiAoQ1BERlNES19XaWRnZXQqKXBJdGVyYXRvci0+R2V0UHJldkFubm90KHBXaWRnZXQpOwotfQotCi1DUERGU0RLX1dpZGdldCogQ1BERlNES19JbnRlckZvcm06OkdldFdpZGdldChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCkgY29uc3QKLXsKLSAgICBpZiAoIXBDb250cm9sIHx8ICFtX3BJbnRlckZvcm0pCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBudWxscHRyOwotICAgIGNvbnN0IGF1dG8gaXQgPSBtX01hcC5maW5kKHBDb250cm9sKTsKLSAgICBpZiAoaXQgIT0gbV9NYXAuZW5kKCkpCi0gICAgICAgIHBXaWRnZXQgPSBpdC0+c2Vjb25kOwotCi0gICAgaWYgKHBXaWRnZXQpCi0gICAgICAgIHJldHVybiBwV2lkZ2V0OwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ29udHJvbERpY3QgPSBwQ29udHJvbC0+R2V0V2lkZ2V0KCk7Ci0gICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpOwotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlID0gbnVsbHB0cjsKLQotICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBDb250cm9sRGljdC0+R2V0RGljdCgiUCIpKSB7Ci0gICAgICAgIGludCBuUGFnZUluZGV4ID0gcERvY3VtZW50LT5HZXRQYWdlSW5kZXgocFBhZ2VEaWN0LT5HZXRPYmpOdW0oKSk7Ci0gICAgICAgIGlmIChuUGFnZUluZGV4ID49IDApIHsKLSAgICAgICAgICAgIHBQYWdlID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VWaWV3KG5QYWdlSW5kZXgpOworICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgeworICAgICAgICAgIGZGb250U2l6ZSA9IENQV0xfRWRpdDo6R2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKEZvbnRNYXAuR2V0UERGRm9udCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudCwgbk1heExlbik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzVmFsdWUpCisgICAgICAgICAgbk1heExlbiA9IHdjc2xlbigoY29uc3Qgd2NoYXJfdCopc1ZhbHVlKTsKKyAgICAgICAgcEVkaXQtPlNldExpbWl0Q2hhcihuTWF4TGVuKTsKICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIXBQYWdlKSB7Ci0gICAgICAgIGludCBuUGFnZUluZGV4ID0gR2V0UGFnZUluZGV4QnlBbm5vdERpY3QocERvY3VtZW50LCBwQ29udHJvbERpY3QpOwotICAgICAgICBpZiAoblBhZ2VJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBwUGFnZSA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhuUGFnZUluZGV4KTsKLSAgICAgICAgfQorICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQorICAgICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZShUUlVFKTsKKyAgICBlbHNlCisgICAgICBwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKKworICAgIHBFZGl0LT5Jbml0aWFsaXplKCk7CisKKyAgICBpZiAoc1ZhbHVlKQorICAgICAgcEVkaXQtPlNldFRleHQoc1ZhbHVlKTsKKyAgICBlbHNlCisgICAgICBwRWRpdC0+U2V0VGV4dChwRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7CisKKyAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7CisKKyAgICBDRlhfQnl0ZVN0cmluZyBzRWRpdCA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0oCisgICAgICAgIHBFZGl0LCBDUERGX1BvaW50KDAuMGYsIDAuMGYpLCBOVUxMLCAhYkNoYXJBcnJheSwgc3ViV29yZCk7CisKKyAgICBpZiAoc0VkaXQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICBzQm9keSA8PCAiL1R4IEJNQ1xuIgorICAgICAgICAgICAgPDwgInFcbiI7CisgICAgICBpZiAocmNDb250ZW50LldpZHRoKCkgPiByY0NsaWVudC5XaWR0aCgpIHx8CisgICAgICAgICAgcmNDb250ZW50LkhlaWdodCgpID4gcmNDbGllbnQuSGVpZ2h0KCkpIHsKKyAgICAgICAgc0JvZHkgPDwgcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgIgorICAgICAgICAgICAgICA8PCByY0NsaWVudC5XaWR0aCgpIDw8ICIgIiA8PCByY0NsaWVudC5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOworICAgICAgfQorICAgICAgQ1BXTF9Db2xvciBjclRleHQgPSBHZXRUZXh0UFdMQ29sb3IoKTsKKyAgICAgIHNCb2R5IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQpIDw8IHNFZGl0CisgICAgICAgICAgICA8PCAiRVRcbiIKKyAgICAgICAgICAgIDw8ICJRXG5FTUNcbiI7CiAgICAgfQogCi0gICAgaWYgKCFwUGFnZSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgcmV0dXJuIChDUERGU0RLX1dpZGdldCopcFBhZ2UtPkdldEFubm90QnlEaWN0KHBDb250cm9sRGljdCk7Ci19CisgICAgaWYgKGJDaGFyQXJyYXkpIHsKKyAgICAgIHN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkgeworICAgICAgICBjYXNlIEJCU19TT0xJRDogeworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9CisgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksIEZBTFNFKTsKKyAgICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgc0xpbmVzIDw8ICJxXG4iIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCisgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSwgRkFMU0UpCisgICAgICAgICAgICAgICAgICAgPDwgIiAyIEogMCBqXG4iOwogCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpHZXRXaWRnZXRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIHdpZGdldHMpCi17Ci0gICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKLQotICAgIGZvciAoaW50IGk9MCxzej1tX3BJbnRlckZvcm0tPkNvdW50RmllbGRzKHNGaWVsZE5hbWUpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IG1fcEludGVyRm9ybS0+R2V0RmllbGQoaSwgc0ZpZWxkTmFtZSk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgICAgIEdldFdpZGdldHMocEZvcm1GaWVsZCwgd2lkZ2V0cyk7Ci0gICAgfQotfQotCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpHZXRXaWRnZXRzKENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9QdHJBcnJheSYgd2lkZ2V0cykKLXsKLSAgICBBU1NFUlQocEZpZWxkICE9IE5VTEwpOwotCi0gICAgZm9yIChpbnQgaT0wLGlzej1wRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaTxpc3o7IGkrKykKLSAgICB7Ci0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQotICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRm9ybUN0cmwpOwotCi0gICAgICAgIGlmIChwV2lkZ2V0KQotICAgICAgICAgICAgd2lkZ2V0cy5BZGQocFdpZGdldCk7Ci0gICAgfQotfQotCi1pbnQgQ1BERlNES19JbnRlckZvcm06OkdldFBhZ2VJbmRleEJ5QW5ub3REaWN0KENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSBjb25zdAotewotICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgQVNTRVJUKHBBbm5vdERpY3QgIT0gTlVMTCk7Ci0KLSAgICBmb3IgKGludCBpPTAsc3o9cERvY3VtZW50LT5HZXRQYWdlQ291bnQoKTsgaTxzejsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvY3VtZW50LT5HZXRQYWdlKGkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlRGljdC0+R2V0QXJyYXkoIkFubm90cyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3o9cEFubm90cy0+R2V0Q291bnQoKTsgajxqc3o7IGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwRGljdCA9IHBBbm5vdHMtPkdldEVsZW1lbnRWYWx1ZShqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBbm5vdERpY3QgPT0gcERpY3QpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbk1heExlbjsgaSsrKSB7CisgICAgICAgICAgICAgIHNMaW5lcyA8PCByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkgLyBuTWF4TGVuKSAqIGkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiBtXG4iCisgICAgICAgICAgICAgICAgICAgICA8PCByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkgLyBuTWF4TGVuKSAqIGkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCByY0NsaWVudC50b3AgPDwgIiBsIFNcbiI7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKworICAgICAgICAgICAgc0xpbmVzIDw8ICJRXG4iOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBCQlNfREFTSDogeworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9CisgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksIEZBTFNFKTsKKyAgICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgQ1BXTF9EYXNoIGRzQm9yZGVyID0gQ1BXTF9EYXNoKDMsIDMsIDApOworCisgICAgICAgICAgICBzTGluZXMgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKKyAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLCBGQUxTRSkKKyAgICAgICAgICAgICAgICAgICA8PCAiWyIgPDwgZHNCb3JkZXIubkRhc2ggPDwgIiAiIDw8IGRzQm9yZGVyLm5HYXAgPDwgIl0gIgorICAgICAgICAgICAgICAgICAgIDw8IGRzQm9yZGVyLm5QaGFzZSA8PCAiIGRcbiI7CisKKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IG5NYXhMZW47IGkrKykgeworICAgICAgICAgICAgICBzTGluZXMgPDwgcmNDbGllbnQubGVmdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbk1heExlbikgKiBpCisgICAgICAgICAgICAgICAgICAgICA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgbVxuIgorICAgICAgICAgICAgICAgICAgICAgPDwgcmNDbGllbnQubGVmdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbk1heExlbikgKiBpCisgICAgICAgICAgICAgICAgICAgICA8PCAiICIgPDwgcmNDbGllbnQudG9wIDw8ICIgbCBTXG4iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzTGluZXMgPDwgIlFcbiI7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiAtMTsKKyAgICBJRlhfRWRpdDo6RGVsRWRpdChwRWRpdCk7CisgIH0KKworICBDRlhfQnl0ZVN0cmluZyBzQVAgPSBHZXRCYWNrZ3JvdW5kQXBwU3RyZWFtKCkgKyBHZXRCb3JkZXJBcHBTdHJlYW0oKSArCisgICAgICAgICAgICAgICAgICAgICAgIHNMaW5lcy5HZXRCeXRlU3RyaW5nKCkgKyBzQm9keS5HZXRCeXRlU3RyaW5nKCk7CisgIFdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBzQVApOwogfQogCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpBZGRNYXAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wsIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQotewotICAgIG1fTWFwW3BDb250cm9sXSA9IHBXaWRnZXQ7CitDUERGX1JlY3QgQ1BERlNES19XaWRnZXQ6OkdldENsaWVudFJlY3QoKSBjb25zdCB7CisgIENQREZfUmVjdCByY1dpbmRvdyA9IEdldFJvdGF0ZWRSZWN0KCk7CisgIEZYX0ZMT0FUIGZCb3JkZXJXaWR0aCA9IChGWF9GTE9BVClHZXRCb3JkZXJXaWR0aCgpOworICBzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpIHsKKyAgICBjYXNlIEJCU19CRVZFTEVEOgorICAgIGNhc2UgQkJTX0lOU0VUOgorICAgICAgZkJvcmRlcldpZHRoICo9IDIuMGY7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyY1dpbmRvdywgZkJvcmRlcldpZHRoKTsKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVtb3ZlTWFwKENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKQotewotICAgIG1fTWFwLmVyYXNlKHBDb250cm9sKTsKK0NQREZfUmVjdCBDUERGU0RLX1dpZGdldDo6R2V0Um90YXRlZFJlY3QoKSBjb25zdCB7CisgIENQREZfUmVjdCByZWN0QW5ub3QgPSBHZXRSZWN0KCk7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IHJlY3RBbm5vdC5yaWdodCAtIHJlY3RBbm5vdC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gcmVjdEFubm90LnRvcCAtIHJlY3RBbm5vdC5ib3R0b207CisKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOworICBDUERGX1JlY3QgcmNQREZXaW5kb3c7CisgIHN3aXRjaCAoYWJzKHBDb250cm9sLT5HZXRSb3RhdGlvbigpICUgMzYwKSkgeworICAgIGNhc2UgMDoKKyAgICBjYXNlIDE4MDoKKyAgICBkZWZhdWx0OgorICAgICAgcmNQREZXaW5kb3cgPSBDUERGX1JlY3QoMCwgMCwgZldpZHRoLCBmSGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTA6CisgICAgY2FzZSAyNzA6CisgICAgICByY1BERldpbmRvdyA9IENQREZfUmVjdCgwLCAwLCBmSGVpZ2h0LCBmV2lkdGgpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmNQREZXaW5kb3c7CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06OkFkZFhGQU1hcChJWEZBX1dpZGdldCogaFdpZGdldCwgQ1BERlNES19YRkFXaWRnZXQqIHBXaWRnZXQpCi17Ci0JbV9YRkFNYXAuU2V0QXQoaFdpZGdldCwgcFdpZGdldCk7CitDRlhfQnl0ZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0QmFja2dyb3VuZEFwcFN0cmVhbSgpIGNvbnN0IHsKKyAgQ1BXTF9Db2xvciBjckJhY2tncm91bmQgPSBHZXRGaWxsUFdMQ29sb3IoKTsKKyAgaWYgKGNyQmFja2dyb3VuZC5uQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkgeworICAgIHJldHVybiBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShHZXRSb3RhdGVkUmVjdCgpLCBjckJhY2tncm91bmQpOworICB9CisgIHJldHVybiAiIjsKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVtb3ZlWEZBTWFwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KQotewotCW1fWEZBTWFwLlJlbW92ZUtleShoV2lkZ2V0KTsKK0NGWF9CeXRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXRCb3JkZXJBcHBTdHJlYW0oKSBjb25zdCB7CisgIENQREZfUmVjdCByY1dpbmRvdyA9IEdldFJvdGF0ZWRSZWN0KCk7CisgIENQV0xfQ29sb3IgY3JCb3JkZXIgPSBHZXRCb3JkZXJQV0xDb2xvcigpOworICBDUFdMX0NvbG9yIGNyQmFja2dyb3VuZCA9IEdldEZpbGxQV0xDb2xvcigpOworICBDUFdMX0NvbG9yIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbTsKKworICBGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKKyAgaW50MzJfdCBuQm9yZGVyU3R5bGUgPSAwOworICBDUFdMX0Rhc2ggZHNCb3JkZXIoMywgMCwgMCk7CisKKyAgc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKSB7CisgICAgY2FzZSBCQlNfREFTSDoKKyAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19EQVNIOworICAgICAgZHNCb3JkZXIgPSBDUFdMX0Rhc2goMywgMywgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJCU19CRVZFTEVEOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7CisgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKKyAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOworICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfVXRpbHM6OkRldmlkZUNvbG9yKGNyQmFja2dyb3VuZCwgMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJCU19JTlNFVDoKKyAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19JTlNFVDsKKyAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC41KTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjc1KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX1VOREVSTElORToKKyAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19VTkRFUkxJTkVEOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIENQV0xfVXRpbHM6OkdldEJvcmRlckFwcFN0cmVhbShyY1dpbmRvdywgZkJvcmRlcldpZHRoLCBjckJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc0JvcmRlcik7CiB9CiAKLUNQREZTREtfWEZBV2lkZ2V0KiBDUERGU0RLX0ludGVyRm9ybTo6R2V0WEZBV2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KQotewotCUNQREZTREtfWEZBV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsKLQltX1hGQU1hcC5Mb29rdXAoaFdpZGdldCwgcFdpZGdldCk7CitDUERGX01hdHJpeCBDUERGU0RLX1dpZGdldDo6R2V0TWF0cml4KCkgY29uc3QgeworICBDUERGX01hdHJpeCBtdDsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOworICBBU1NFUlQocENvbnRyb2wgIT0gTlVMTCk7CiAKLQlyZXR1cm4gcFdpZGdldDsKKyAgQ1BERl9SZWN0IHJjQW5ub3QgPSBHZXRSZWN0KCk7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tOworCisgIHN3aXRjaCAoYWJzKHBDb250cm9sLT5HZXRSb3RhdGlvbigpICUgMzYwKSkgeworICAgIGNhc2UgMDoKKyAgICBkZWZhdWx0OgorICAgICAgbXQgPSBDUERGX01hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTA6CisgICAgICBtdCA9IENQREZfTWF0cml4KDAsIDEsIC0xLCAwLCBmV2lkdGgsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxODA6CisgICAgICBtdCA9IENQREZfTWF0cml4KC0xLCAwLCAwLCAtMSwgZldpZHRoLCBmSGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjcwOgorICAgICAgbXQgPSBDUERGX01hdHJpeCgwLCAtMSwgMSwgMCwgMCwgZkhlaWdodCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBtdDsKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6RW5hYmxlQ2FsY3VsYXRlKEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0gICAgbV9iQ2FsY3VsYXRlID0gYkVuYWJsZWQ7CitDUFdMX0NvbG9yIENQREZTREtfV2lkZ2V0OjpHZXRUZXh0UFdMQ29sb3IoKSBjb25zdCB7CisgIENQV0xfQ29sb3IgY3JUZXh0ID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCk7CisKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKKworICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGRhID0gcEZvcm1DdHJsLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOworICBpZiAoZGEuSGFzQ29sb3IoKSkgeworICAgIGludDMyX3QgaUNvbG9yVHlwZTsKKyAgICBGWF9GTE9BVCBmY1s0XTsKKyAgICBkYS5HZXRDb2xvcihpQ29sb3JUeXBlLCBmYyk7CisgICAgY3JUZXh0ID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisgIH0KKworICByZXR1cm4gY3JUZXh0OwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpJc0NhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBtX2JDYWxjdWxhdGU7CitDUFdMX0NvbG9yIENQREZTREtfV2lkZ2V0OjpHZXRCb3JkZXJQV0xDb2xvcigpIGNvbnN0IHsKKyAgQ1BXTF9Db2xvciBjckJvcmRlcjsKKworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOworICBBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOworCisgIGludDMyX3QgaUNvbG9yVHlwZTsKKyAgRlhfRkxPQVQgZmNbNF07CisgIHBGb3JtQ3RybC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7CisgIGlmIChpQ29sb3JUeXBlID4gMCkKKyAgICBjckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworCisgIHJldHVybiBjckJvcmRlcjsKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6WGZhRW5hYmxlQ2FsY3VsYXRlKEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0JbV9iWGZhQ2FsY3VsYXRlID0gYkVuYWJsZWQ7Ci19Ci1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpJc1hmYUNhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdAotewotCXJldHVybiBtX2JYZmFDYWxjdWxhdGU7CitDUFdMX0NvbG9yIENQREZTREtfV2lkZ2V0OjpHZXRGaWxsUFdMQ29sb3IoKSBjb25zdCB7CisgIENQV0xfQ29sb3IgY3JGaWxsOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CisgIEFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CisKKyAgaW50MzJfdCBpQ29sb3JUeXBlOworICBGWF9GTE9BVCBmY1s0XTsKKyAgcEZvcm1DdHJsLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpQ29sb3JUeXBlLCBmYyk7CisgIGlmIChpQ29sb3JUeXBlID4gMCkKKyAgICBjckZpbGwgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKKworICByZXR1cm4gY3JGaWxsOwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpJc1hmYVZhbGlkYXRpb25zRW5hYmxlZCgpCi17Ci0JcmV0dXJuIG1fYlhmYVZhbGlkYXRpb25zRW5hYmxlZDsKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OkFkZEltYWdlVG9BcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBJbWFnZSkgeworICBBU1NFUlQocEltYWdlICE9IE5VTEwpOworCisgIENQREZfRG9jdW1lbnQqIHBEb2MgPQorICAgICAgbV9wUGFnZVZpZXctPkdldFBERkRvY3VtZW50KCk7ICAvLyBwRG9jdW1lbnQtPkdldERvY3VtZW50KCk7CisgIEFTU0VSVChwRG9jICE9IE5VTEwpOworCisgIENQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQVAiKTsKKyAgQVNTRVJUKHBBUERpY3QgIT0gTlVMTCk7CisKKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwQVBEaWN0LT5HZXRTdHJlYW0oc0FQVHlwZSk7CisgIEFTU0VSVChwU3RyZWFtICE9IE5VTEwpOworCisgIENQREZfRGljdGlvbmFyeSogcFN0cmVhbURpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CisgIEFTU0VSVChwU3RyZWFtRGljdCAhPSBOVUxMKTsKKworICBDRlhfQnl0ZVN0cmluZyBzSW1hZ2VBbGlhcyA9ICJJTUciOworCisgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBJbWFnZURpY3QgPSBwSW1hZ2UtPkdldERpY3QoKSkgeworICAgIHNJbWFnZUFsaWFzID0gcEltYWdlRGljdC0+R2V0U3RyaW5nKCJOYW1lIik7CisgICAgaWYgKHNJbWFnZUFsaWFzLklzRW1wdHkoKSkKKyAgICAgIHNJbWFnZUFsaWFzID0gIklNRyI7CisgIH0KKworICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOworICBpZiAoIXBTdHJlYW1SZXNMaXN0KSB7CisgICAgcFN0cmVhbVJlc0xpc3QgPSBGWF9ORVcgQ1BERl9EaWN0aW9uYXJ5KCk7CisgICAgcFN0cmVhbURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwU3RyZWFtUmVzTGlzdCk7CisgIH0KKworICBpZiAocFN0cmVhbVJlc0xpc3QpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBYT2JqZWN0ID0gRlhfTkVXIENQREZfRGljdGlvbmFyeTsKKyAgICBwWE9iamVjdC0+U2V0QXRSZWZlcmVuY2Uoc0ltYWdlQWxpYXMsIHBEb2MsIHBJbWFnZSk7CisgICAgcFN0cmVhbVJlc0xpc3QtPlNldEF0KCJYT2JqZWN0IiwgcFhPYmplY3QpOworICB9CiB9Ci12b2lkIENQREZTREtfSW50ZXJGb3JtOjpYZmFTZXRWYWxpZGF0aW9uc0VuYWJsZWQoRlhfQk9PTCBiRW5hYmxlZCkKLXsKLQltX2JYZmFWYWxpZGF0aW9uc0VuYWJsZWQgPSBiRW5hYmxlZDsKKwordm9pZCBDUERGU0RLX1dpZGdldDo6UmVtb3ZlQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSkgeworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJBUCIpKSB7CisgICAgcEFQRGljdC0+UmVtb3ZlQXQoc0FQVHlwZSk7CisgIH0KK30KKworRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6T25BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKKworICBDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcERvY3VtZW50LT5HZXREb2N1bWVudCgpOworICBBU1NFUlQocERvYyAhPSBOVUxMKTsKKworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYgIT0gTlVMTCk7CisKKyAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpIHsKKyAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUgPSBHZXRYRkFFdmVudFR5cGUodHlwZSwgZGF0YS5iV2lsbENvbW1pdCk7CisKKyAgICBpZiAoZUV2ZW50VHlwZSAhPSBYRkFfRVZFTlRfVW5rbm93bikgeworICAgICAgaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpIHsKKyAgICAgICAgQ1hGQV9FdmVudFBhcmFtIHBhcmFtOworICAgICAgICBwYXJhbS5tX2VUeXBlID0gZUV2ZW50VHlwZTsKKyAgICAgICAgcGFyYW0ubV93c0NoYW5nZSA9IGRhdGEuc0NoYW5nZTsKKyAgICAgICAgcGFyYW0ubV9pQ29tbWl0S2V5ID0gZGF0YS5uQ29tbWl0S2V5OworICAgICAgICBwYXJhbS5tX2JTaGlmdCA9IGRhdGEuYlNoaWZ0OworICAgICAgICBwYXJhbS5tX2lTZWxTdGFydCA9IGRhdGEublNlbFN0YXJ0OworICAgICAgICBwYXJhbS5tX2lTZWxFbmQgPSBkYXRhLm5TZWxFbmQ7CisgICAgICAgIHBhcmFtLm1fd3NGdWxsVGV4dCA9IGRhdGEuc1ZhbHVlOworICAgICAgICBwYXJhbS5tX2JLZXlEb3duID0gZGF0YS5iS2V5RG93bjsKKyAgICAgICAgcGFyYW0ubV9iTW9kaWZpZXIgPSBkYXRhLmJNb2RpZmllcjsKKyAgICAgICAgcGFyYW0ubV93c05ld1RleHQgPSBkYXRhLnNWYWx1ZTsKKyAgICAgICAgaWYgKGRhdGEublNlbEVuZCA+IGRhdGEublNlbFN0YXJ0KQorICAgICAgICAgIHBhcmFtLm1fd3NOZXdUZXh0LkRlbGV0ZShkYXRhLm5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5uU2VsRW5kIC0gZGF0YS5uU2VsU3RhcnQpOworICAgICAgICBmb3IgKGludCBpID0gZGF0YS5zQ2hhbmdlLkdldExlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgcGFyYW0ubV93c05ld1RleHQuSW5zZXJ0KGRhdGEublNlbFN0YXJ0LCBkYXRhLnNDaGFuZ2VbaV0pOworICAgICAgICBwYXJhbS5tX3dzUHJldlRleHQgPSBkYXRhLnNWYWx1ZTsKKworICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpOworICAgICAgICBwYXJhbS5tX3BUYXJnZXQgPSBwQWNjOworICAgICAgICBpbnQzMl90IG5SZXQgPSBwWEZBV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBBY2MsICZwYXJhbSk7CisKKyAgICAgICAgaWYgKElYRkFfRG9jVmlldyogcERvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCkpIHsKKyAgICAgICAgICBwRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5SZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzKQorICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgIH0KKyAgfQorCisgIENQREZfQWN0aW9uIGFjdGlvbiA9IEdldEFBY3Rpb24odHlwZSk7CisKKyAgaWYgKGFjdGlvbiAmJiBhY3Rpb24uR2V0VHlwZSgpICE9IENQREZfQWN0aW9uOjpVbmtub3duKSB7CisgICAgQ1BERlNES19BY3Rpb25IYW5kbGVyKiBwQWN0aW9uSGFuZGxlciA9IHBFbnYtPkdldEFjdGlvbkhhbmRlcigpOworICAgIHJldHVybiBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fRmllbGQoYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGb3JtRmllbGQoKSwgZGF0YSk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitDUERGX0FjdGlvbiBDUERGU0RLX1dpZGdldDo6R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQpIHsKKyAgc3dpdGNoIChlQUFUKSB7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkN1cnNvckVudGVyOgorICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpDdXJzb3JFeGl0OgorICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25Eb3duOgorICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25VcDoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6R2V0Rm9jdXM6CisgICAgY2FzZSBDUERGX0FBY3Rpb246Okxvc2VGb2N1czoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6UGFnZU9wZW46CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VDbG9zZToKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6UGFnZVZpc2libGU6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VJbnZpc2libGU6CisgICAgICByZXR1cm4gQ1BERlNES19CQUFubm90OjpHZXRBQWN0aW9uKGVBQVQpOworCisgICAgY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6Rm9ybWF0OgorICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6Q2FsY3VsYXRlOiB7CisgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgICAgICBpZiAoQ1BERl9BQWN0aW9uIGFhID0gcEZpZWxkLT5HZXRBZGRpdGlvbmFsQWN0aW9uKCkpCisgICAgICAgIHJldHVybiBhYS5HZXRBY3Rpb24oZUFBVCk7CisgICAgICByZXR1cm4gQ1BERlNES19CQUFubm90OjpHZXRBQWN0aW9uKGVBQVQpOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKK30KKworQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldEFsdGVybmF0ZU5hbWUoKSBjb25zdCB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRBbHRlcm5hdGVOYW1lKCk7Cit9CisKK2ludDMyX3QgQ1BERlNES19XaWRnZXQ6OkdldEFwcGVhcmFuY2VBZ2UoKSBjb25zdCB7CisgIHJldHVybiBtX25BcHBBZ2U7Cit9CisKK2ludDMyX3QgQ1BERlNES19XaWRnZXQ6OkdldFZhbHVlQWdlKCkgY29uc3QgeworICByZXR1cm4gbV9uVmFsdWVBZ2U7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OkhpdFRlc3QoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKSB7CisgIENQREZfQW5ub3QqIHBBbm5vdCA9IEdldFBERkFubm90KCk7CisgIENGWF9GbG9hdFJlY3QgYW5ub3RSZWN0OworICBwQW5ub3QtPkdldFJlY3QoYW5ub3RSZWN0KTsKKyAgaWYgKGFubm90UmVjdC5Db250YWlucyhwYWdlWCwgcGFnZVkpKSB7CisgICAgaWYgKCFJc1Zpc2libGUoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGludCBuRmllbGRGbGFncyA9IEdldEZpZWxkRmxhZ3MoKTsKKyAgICBpZiAoKG5GaWVsZEZsYWdzICYgRklFTERGTEFHX1JFQURPTkxZKSA9PSBGSUVMREZMQUdfUkVBRE9OTFkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKKy8vIENQREZTREtfWEZBV2lkZ2V0CitDUERGU0RLX1hGQVdpZGdldDo6Q1BERlNES19YRkFXaWRnZXQoSVhGQV9XaWRnZXQqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0pCisgICAgOiBDUERGU0RLX0Fubm90KHBQYWdlVmlldyksCisgICAgICBtX2hYRkFXaWRnZXQocEFubm90KSwKKyAgICAgIG1fcEludGVyRm9ybShwSW50ZXJGb3JtKSB7fQorCitGWF9CT09MIENQREZTREtfWEZBV2lkZ2V0OjpJc1hGQUZpZWxkKCkgeworICByZXR1cm4gVFJVRTsKK30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19YRkFXaWRnZXQ6OkdldFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBGU0RLX1hGQVdJREdFVF9UWVBFTkFNRTsKK30KKworQ0ZYX0Zsb2F0UmVjdCBDUERGU0RLX1hGQVdpZGdldDo6R2V0UmVjdCgpIHsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0UGFnZVZpZXcoKTsKKyAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKworICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBEb2N1bWVudC0+R2V0RG9jdW1lbnQoKTsKKyAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7CisKKyAgSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKTsKKyAgQVNTRVJUKHBEb2NWaWV3ICE9IE5VTEwpOworCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBwRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgQ0ZYX1JlY3RGIHJjQkJveDsKKyAgcFdpZGdldEhhbmRsZXItPkdldFJlY3QoR2V0WEZBV2lkZ2V0KCksIHJjQkJveCk7CisKKyAgcmV0dXJuIENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQsIHJjQkJveC50b3AsIHJjQkJveC5sZWZ0ICsgcmNCQm94LndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gudG9wICsgcmNCQm94LmhlaWdodCk7Cit9CisKKy8vIENQREZTREtfSW50ZXJGb3JtCitDUERGU0RLX0ludGVyRm9ybTo6Q1BERlNES19JbnRlckZvcm0oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQorICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KSwKKyAgICAgIG1fcEludGVyRm9ybShOVUxMKSwKKyAgICAgIG1fYkNhbGN1bGF0ZShUUlVFKSwKKyAgICAgIG1fYlhmYUNhbGN1bGF0ZShUUlVFKSwKKyAgICAgIG1fYlhmYVZhbGlkYXRpb25zRW5hYmxlZChUUlVFKSwKKyAgICAgIG1fYkJ1c3koRkFMU0UpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworICBtX3BJbnRlckZvcm0gPQorICAgICAgbmV3IENQREZfSW50ZXJGb3JtKG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKSwgRkFMU0UpOworICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOworICBtX3BJbnRlckZvcm0tPlNldEZvcm1Ob3RpZnkodGhpcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspCisgICAgbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSBGQUxTRTsKKyAgbV9pSGlnaGxpZ2h0QWxwaGEgPSAwOworfQorCitDUERGU0RLX0ludGVyRm9ybTo6fkNQREZTREtfSW50ZXJGb3JtKCkgeworICBkZWxldGUgbV9wSW50ZXJGb3JtOworICBtX3BJbnRlckZvcm0gPSBudWxscHRyOworCisgIG1fTWFwLmNsZWFyKCk7CisgIG1fWEZBTWFwLlJlbW92ZUFsbCgpOworfQorCitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpIaWdobGlnaHRXaWRnZXRzKCkgeworICByZXR1cm4gRkFMU0U7Cit9CisKK0NQREZTREtfV2lkZ2V0KiBDUERGU0RLX0ludGVyRm9ybTo6R2V0U2libGluZyhDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOZXh0KSBjb25zdCB7CisgIG5vbnN0ZDo6dW5pcXVlX3B0cjxDQkFfQW5ub3RJdGVyYXRvcj4gcEl0ZXJhdG9yKAorICAgICAgbmV3IENCQV9Bbm5vdEl0ZXJhdG9yKHBXaWRnZXQtPkdldFBhZ2VWaWV3KCksICJXaWRnZXQiLCAiIikpOworCisgIGlmIChiTmV4dCkgeworICAgIHJldHVybiAoQ1BERlNES19XaWRnZXQqKXBJdGVyYXRvci0+R2V0TmV4dEFubm90KHBXaWRnZXQpOworICB9CisgIHJldHVybiAoQ1BERlNES19XaWRnZXQqKXBJdGVyYXRvci0+R2V0UHJldkFubm90KHBXaWRnZXQpOworfQorCitDUERGU0RLX1dpZGdldCogQ1BERlNES19JbnRlckZvcm06OkdldFdpZGdldChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCkgY29uc3QgeworICBpZiAoIXBDb250cm9sIHx8ICFtX3BJbnRlckZvcm0pCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBudWxscHRyOworICBjb25zdCBhdXRvIGl0ID0gbV9NYXAuZmluZChwQ29udHJvbCk7CisgIGlmIChpdCAhPSBtX01hcC5lbmQoKSkKKyAgICBwV2lkZ2V0ID0gaXQtPnNlY29uZDsKKworICBpZiAocFdpZGdldCkKKyAgICByZXR1cm4gcFdpZGdldDsKKworICBDUERGX0RpY3Rpb25hcnkqIHBDb250cm9sRGljdCA9IHBDb250cm9sLT5HZXRXaWRnZXQoKTsKKyAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpOworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSA9IG51bGxwdHI7CisKKyAgaWYgKENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcENvbnRyb2xEaWN0LT5HZXREaWN0KCJQIikpIHsKKyAgICBpbnQgblBhZ2VJbmRleCA9IHBEb2N1bWVudC0+R2V0UGFnZUluZGV4KHBQYWdlRGljdC0+R2V0T2JqTnVtKCkpOworICAgIGlmIChuUGFnZUluZGV4ID49IDApIHsKKyAgICAgIHBQYWdlID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VWaWV3KG5QYWdlSW5kZXgpOworICAgIH0KKyAgfQorCisgIGlmICghcFBhZ2UpIHsKKyAgICBpbnQgblBhZ2VJbmRleCA9IEdldFBhZ2VJbmRleEJ5QW5ub3REaWN0KHBEb2N1bWVudCwgcENvbnRyb2xEaWN0KTsKKyAgICBpZiAoblBhZ2VJbmRleCA+PSAwKSB7CisgICAgICBwUGFnZSA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhuUGFnZUluZGV4KTsKKyAgICB9CisgIH0KKworICBpZiAoIXBQYWdlKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gKENQREZTREtfV2lkZ2V0KilwUGFnZS0+R2V0QW5ub3RCeURpY3QocENvbnRyb2xEaWN0KTsKK30KKwordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6R2V0V2lkZ2V0cyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5JiB3aWRnZXRzKSB7CisgIEFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9wSW50ZXJGb3JtLT5Db3VudEZpZWxkcyhzRmllbGROYW1lKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IG1fcEludGVyRm9ybS0+R2V0RmllbGQoaSwgc0ZpZWxkTmFtZSk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBHZXRXaWRnZXRzKHBGb3JtRmllbGQsIHdpZGdldHMpOworICB9Cit9CisKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06OkdldFdpZGdldHMoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5JiB3aWRnZXRzKSB7CisgIEFTU0VSVChwRmllbGQgIT0gTlVMTCk7CisKKyAgZm9yIChpbnQgaSA9IDAsIGlzeiA9IHBGaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgaXN6OyBpKyspIHsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRmllbGQtPkdldENvbnRyb2woaSk7CisgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKKworICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBGb3JtQ3RybCk7CisKKyAgICBpZiAocFdpZGdldCkKKyAgICAgIHdpZGdldHMuQWRkKHBXaWRnZXQpOworICB9Cit9CisKK2ludCBDUERGU0RLX0ludGVyRm9ybTo6R2V0UGFnZUluZGV4QnlBbm5vdERpY3QoCisgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgY29uc3QgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworICBBU1NFUlQocEFubm90RGljdCAhPSBOVUxMKTsKKworICBmb3IgKGludCBpID0gMCwgc3ogPSBwRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBEb2N1bWVudC0+R2V0UGFnZShpKSkgeworICAgICAgaWYgKENQREZfQXJyYXkqIHBBbm5vdHMgPSBwUGFnZURpY3QtPkdldEFycmF5KCJBbm5vdHMiKSkgeworICAgICAgICBmb3IgKGludCBqID0gMCwganN6ID0gcEFubm90cy0+R2V0Q291bnQoKTsgaiA8IGpzejsgaisrKSB7CisgICAgICAgICAgQ1BERl9PYmplY3QqIHBEaWN0ID0gcEFubm90cy0+R2V0RWxlbWVudFZhbHVlKGopOworICAgICAgICAgIGlmIChwQW5ub3REaWN0ID09IHBEaWN0KSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06OkFkZE1hcChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCkgeworICBtX01hcFtwQ29udHJvbF0gPSBwV2lkZ2V0OworfQorCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpSZW1vdmVNYXAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpIHsKKyAgbV9NYXAuZXJhc2UocENvbnRyb2wpOworfQorCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpBZGRYRkFNYXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19YRkFXaWRnZXQqIHBXaWRnZXQpIHsKKyAgbV9YRkFNYXAuU2V0QXQoaFdpZGdldCwgcFdpZGdldCk7Cit9CisKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06OlJlbW92ZVhGQU1hcChJWEZBX1dpZGdldCogaFdpZGdldCkgeworICBtX1hGQU1hcC5SZW1vdmVLZXkoaFdpZGdldCk7Cit9CisKK0NQREZTREtfWEZBV2lkZ2V0KiBDUERGU0RLX0ludGVyRm9ybTo6R2V0WEZBV2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7CisgIENQREZTREtfWEZBV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsKKyAgbV9YRkFNYXAuTG9va3VwKGhXaWRnZXQsIHBXaWRnZXQpOworCisgIHJldHVybiBwV2lkZ2V0OworfQorCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpFbmFibGVDYWxjdWxhdGUoRlhfQk9PTCBiRW5hYmxlZCkgeworICBtX2JDYWxjdWxhdGUgPSBiRW5hYmxlZDsKK30KKworRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6SXNDYWxjdWxhdGVFbmFibGVkKCkgY29uc3QgeworICByZXR1cm4gbV9iQ2FsY3VsYXRlOworfQorCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpYZmFFbmFibGVDYWxjdWxhdGUoRlhfQk9PTCBiRW5hYmxlZCkgeworICBtX2JYZmFDYWxjdWxhdGUgPSBiRW5hYmxlZDsKK30KK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OklzWGZhQ2FsY3VsYXRlRW5hYmxlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYlhmYUNhbGN1bGF0ZTsKK30KKworRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6SXNYZmFWYWxpZGF0aW9uc0VuYWJsZWQoKSB7CisgIHJldHVybiBtX2JYZmFWYWxpZGF0aW9uc0VuYWJsZWQ7Cit9Cit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpYZmFTZXRWYWxpZGF0aW9uc0VuYWJsZWQoRlhfQk9PTCBiRW5hYmxlZCkgeworICBtX2JYZmFWYWxpZGF0aW9uc0VuYWJsZWQgPSBiRW5hYmxlZDsKIH0KIAogI2lmZGVmIF9XSU4zMgotQ1BERl9TdHJlYW0qIENQREZTREtfSW50ZXJGb3JtOjpMb2FkSW1hZ2VGcm9tRmlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpbGUpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCUNQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKTsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworQ1BERl9TdHJlYW0qIENQREZTREtfSW50ZXJGb3JtOjpMb2FkSW1hZ2VGcm9tRmlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpbGUpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCk7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CiAKLQlDUERGX1N0cmVhbSogcFJldFN0cmVhbSA9IE5VTEw7CisgIENQREZfU3RyZWFtKiBwUmV0U3RyZWFtID0gTlVMTDsKIAotCWlmIChDRlhfRElCaXRtYXAqIHBCbXAgPSBDRlhfV2luZG93c0RJQjo6TG9hZEZyb21GaWxlKHNGaWxlLmNfc3RyKCkpKQotCXsKLQkJaW50IG5XaWR0aCA9IHBCbXAtPkdldFdpZHRoKCk7Ci0JCWludCBuSGVpZ2h0ID0gcEJtcC0+R2V0SGVpZ2h0KCk7CisgIGlmIChDRlhfRElCaXRtYXAqIHBCbXAgPSBDRlhfV2luZG93c0RJQjo6TG9hZEZyb21GaWxlKHNGaWxlLmNfc3RyKCkpKSB7CisgICAgaW50IG5XaWR0aCA9IHBCbXAtPkdldFdpZHRoKCk7CisgICAgaW50IG5IZWlnaHQgPSBwQm1wLT5HZXRIZWlnaHQoKTsKIAotCQlDUERGX0ltYWdlIEltYWdlKHBEb2N1bWVudCk7Ci0JCUltYWdlLlNldEltYWdlKHBCbXAsIEZBTFNFKTsKLQkJQ1BERl9TdHJlYW0qIHBJbWFnZVN0cmVhbSA9IEltYWdlLkdldFN0cmVhbSgpOwotCQlpZiAocEltYWdlU3RyZWFtKQotCQl7Ci0JCQlpZiAocEltYWdlU3RyZWFtLT5HZXRPYmpOdW0oKSA9PSAwKQotCQkJCXBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocEltYWdlU3RyZWFtKTsKKyAgICBDUERGX0ltYWdlIEltYWdlKHBEb2N1bWVudCk7CisgICAgSW1hZ2UuU2V0SW1hZ2UocEJtcCwgRkFMU0UpOworICAgIENQREZfU3RyZWFtKiBwSW1hZ2VTdHJlYW0gPSBJbWFnZS5HZXRTdHJlYW0oKTsKKyAgICBpZiAocEltYWdlU3RyZWFtKSB7CisgICAgICBpZiAocEltYWdlU3RyZWFtLT5HZXRPYmpOdW0oKSA9PSAwKQorICAgICAgICBwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBJbWFnZVN0cmVhbSk7CiAKLQkJCUNQREZfRGljdGlvbmFyeSogcFN0cmVhbURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5KCk7Ci0JCQlwU3RyZWFtRGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIkZvcm0iKTsKLQkJCXBTdHJlYW1EaWN0LT5TZXRBdE5hbWUoIk5hbWUiLCAiSU1HIik7Ci0JCQlDUERGX0FycmF5KiBwTWF0cml4ID0gbmV3IENQREZfQXJyYXkoKTsKLQkJCXBTdHJlYW1EaWN0LT5TZXRBdCgiTWF0cml4IiwgcE1hdHJpeCk7Ci0JCQlwTWF0cml4LT5BZGRJbnRlZ2VyKDEpOwotCQkJcE1hdHJpeC0+QWRkSW50ZWdlcigwKTsKLQkJCXBNYXRyaXgtPkFkZEludGVnZXIoMCk7Ci0JCQlwTWF0cml4LT5BZGRJbnRlZ2VyKDEpOwotCQkJcE1hdHJpeC0+QWRkSW50ZWdlcigtbldpZHRoIC8gMik7Ci0JCQlwTWF0cml4LT5BZGRJbnRlZ2VyKC1uSGVpZ2h0IC8gMik7Ci0JCQlDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZSA9IG5ldyBDUERGX0RpY3Rpb25hcnkoKTsKLQkJCXBTdHJlYW1EaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcFJlc291cmNlKTsKLQkJCUNQREZfRGljdGlvbmFyeSogcFhPYmplY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5KCk7Ci0JCQlwUmVzb3VyY2UtPlNldEF0KCJYT2JqZWN0IiwgcFhPYmplY3QpOwotCQkJcFhPYmplY3QtPlNldEF0UmVmZXJlbmNlKCJJbWciLCBwRG9jdW1lbnQsIHBJbWFnZVN0cmVhbSk7Ci0JCQlDUERGX0FycmF5KiBwUHJvY1NldCA9IG5ldyBDUERGX0FycmF5KCk7Ci0JCQlwUmVzb3VyY2UtPlNldEF0KCJQcm9jU2V0IiwgcFByb2NTZXQpOwotCQkJcFByb2NTZXQtPkFkZE5hbWUoIlBERiIpOwotCQkJcFByb2NTZXQtPkFkZE5hbWUoIkltYWdlQyIpOwotCQkJcFN0cmVhbURpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJYT2JqZWN0Iik7Ci0JCQlDUERGX0FycmF5KiBwQkJveCA9IG5ldyBDUERGX0FycmF5KCk7Ci0JCQlwU3RyZWFtRGljdC0+U2V0QXQoIkJCb3giLCBwQkJveCk7Ci0JCQlwQkJveC0+QWRkSW50ZWdlcigwKTsKLQkJCXBCQm94LT5BZGRJbnRlZ2VyKDApOwotCQkJcEJCb3gtPkFkZEludGVnZXIobldpZHRoKTsKLQkJCXBCQm94LT5BZGRJbnRlZ2VyKG5IZWlnaHQpOwotCQkJcFN0cmVhbURpY3QtPlNldEF0SW50ZWdlcigiRm9ybVR5cGUiLCAxKTsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcFN0cmVhbURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5KCk7CisgICAgICBwU3RyZWFtRGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIkZvcm0iKTsKKyAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdE5hbWUoIk5hbWUiLCAiSU1HIik7CisgICAgICBDUERGX0FycmF5KiBwTWF0cml4ID0gbmV3IENQREZfQXJyYXkoKTsKKyAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdCgiTWF0cml4IiwgcE1hdHJpeCk7CisgICAgICBwTWF0cml4LT5BZGRJbnRlZ2VyKDEpOworICAgICAgcE1hdHJpeC0+QWRkSW50ZWdlcigwKTsKKyAgICAgIHBNYXRyaXgtPkFkZEludGVnZXIoMCk7CisgICAgICBwTWF0cml4LT5BZGRJbnRlZ2VyKDEpOworICAgICAgcE1hdHJpeC0+QWRkSW50ZWdlcigtbldpZHRoIC8gMik7CisgICAgICBwTWF0cml4LT5BZGRJbnRlZ2VyKC1uSGVpZ2h0IC8gMik7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZSA9IG5ldyBDUERGX0RpY3Rpb25hcnkoKTsKKyAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcFJlc291cmNlKTsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcFhPYmplY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5KCk7CisgICAgICBwUmVzb3VyY2UtPlNldEF0KCJYT2JqZWN0IiwgcFhPYmplY3QpOworICAgICAgcFhPYmplY3QtPlNldEF0UmVmZXJlbmNlKCJJbWciLCBwRG9jdW1lbnQsIHBJbWFnZVN0cmVhbSk7CisgICAgICBDUERGX0FycmF5KiBwUHJvY1NldCA9IG5ldyBDUERGX0FycmF5KCk7CisgICAgICBwUmVzb3VyY2UtPlNldEF0KCJQcm9jU2V0IiwgcFByb2NTZXQpOworICAgICAgcFByb2NTZXQtPkFkZE5hbWUoIlBERiIpOworICAgICAgcFByb2NTZXQtPkFkZE5hbWUoIkltYWdlQyIpOworICAgICAgcFN0cmVhbURpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJYT2JqZWN0Iik7CisgICAgICBDUERGX0FycmF5KiBwQkJveCA9IG5ldyBDUERGX0FycmF5KCk7CisgICAgICBwU3RyZWFtRGljdC0+U2V0QXQoIkJCb3giLCBwQkJveCk7CisgICAgICBwQkJveC0+QWRkSW50ZWdlcigwKTsKKyAgICAgIHBCQm94LT5BZGRJbnRlZ2VyKDApOworICAgICAgcEJCb3gtPkFkZEludGVnZXIobldpZHRoKTsKKyAgICAgIHBCQm94LT5BZGRJbnRlZ2VyKG5IZWlnaHQpOworICAgICAgcFN0cmVhbURpY3QtPlNldEF0SW50ZWdlcigiRm9ybVR5cGUiLCAxKTsKIAotCQkJcFJldFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKLQkJCUNGWF9CeXRlU3RyaW5nIGNzU3RyZWFtOwotCQkJY3NTdHJlYW0uRm9ybWF0KCJxXG4lZCAwIDAgJWQgMCAwIGNtXG4vSW1nIERvXG5RIiwgbldpZHRoLCBuSGVpZ2h0KTsKLQkJCXBSZXRTdHJlYW0tPkluaXRTdHJlYW0oKHVpbnQ4X3QqKWNzU3RyZWFtLmNfc3RyKCksIGNzU3RyZWFtLkdldExlbmd0aCgpLCBwU3RyZWFtRGljdCk7Ci0JCQlwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBSZXRTdHJlYW0pOwotCQl9CisgICAgICBwUmV0U3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NTdHJlYW07CisgICAgICBjc1N0cmVhbS5Gb3JtYXQoInFcbiVkIDAgMCAlZCAwIDAgY21cbi9JbWcgRG9cblEiLCBuV2lkdGgsIG5IZWlnaHQpOworICAgICAgcFJldFN0cmVhbS0+SW5pdFN0cmVhbSgodWludDhfdCopY3NTdHJlYW0uY19zdHIoKSwgY3NTdHJlYW0uR2V0TGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EaWN0KTsKKyAgICAgIHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocFJldFN0cmVhbSk7CisgICAgfQogCi0JCWRlbGV0ZSBwQm1wOwotCX0KKyAgICBkZWxldGUgcEJtcDsKKyAgfQogCi0JcmV0dXJuIHBSZXRTdHJlYW07CisgIHJldHVybiBwUmV0U3RyZWFtOwogfQogI2VuZGlmCiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06Ok9uQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOwotICAgIEFTU0VSVChwRW52KTsKLSAgICBpZighcEVudi0+SXNKU0luaXRpYXRlZCgpKQotICAgICAgICByZXR1cm47Cit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpPbkNhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCkgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7CisgIEFTU0VSVChwRW52KTsKKyAgaWYgKCFwRW52LT5Jc0pTSW5pdGlhdGVkKCkpCisgICAgcmV0dXJuOwogCi0gICAgaWYgKG1fYkJ1c3kpIHJldHVybjsKKyAgaWYgKG1fYkJ1c3kpCisgICAgcmV0dXJuOwogCi0gICAgbV9iQnVzeSA9IFRSVUU7CisgIG1fYkJ1c3kgPSBUUlVFOwogCi0gICAgaWYgKElzQ2FsY3VsYXRlRW5hYmxlZCgpKQotICAgIHsKLSAgICAgICAgSUZYSlNfUnVudGltZSogcFJ1bnRpbWUgPSBtX3BEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7Ci0gICAgICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKLQotICAgICAgICBwUnVudGltZS0+U2V0UmVhZGVyRG9jdW1lbnQobV9wRG9jdW1lbnQpOwotCi0gICAgICAgIGludCBuU2l6ZSA9IG1fcEludGVyRm9ybS0+Q291bnRGaWVsZHNJbkNhbGN1bGF0aW9uT3JkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5TaXplOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BJbnRlckZvcm0tPkdldEZpZWxkSW5DYWxjdWxhdGlvbk9yZGVyKGkpKQotICAgICAgICAgICAgewotLy8gICAgICAgICAgQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBpbnQgblR5cGUgPSBwRmllbGQtPkdldEZpZWxkVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChuVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgblR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbiBhQWN0aW9uID0gcEZpZWxkLT5HZXRBZGRpdGlvbmFsQWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhQWN0aW9uICYmIGFBY3Rpb24uQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpDYWxjdWxhdGUpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FjdGlvbiBhY3Rpb24gPSBhQWN0aW9uLkdldEFjdGlvbihDUERGX0FBY3Rpb246OkNhbGN1bGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzSlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3NKUy5Jc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzT2xkVmFsdWUgPSBwRmllbGQtPkdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHNPbGRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUkMgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+T25GaWVsZF9DYWxjdWxhdGUocEZvcm1GaWVsZCwgcEZpZWxkLCBzVmFsdWUsIGJSQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0luZm87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoY3NKUywgc0luZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+UmVsZWFzZUNvbnRleHQocENvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiUmV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYlJDKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzVmFsdWUuQ29tcGFyZShzT2xkVmFsdWUpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWVsZC0+U2V0VmFsdWUoc1ZhbHVlLCBUUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBtX2JCdXN5ID0gRkFMU0U7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENQREZTREtfSW50ZXJGb3JtOjpPbkZvcm1hdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgRlhfQk9PTCYgYkZvcm1hdGVkKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLSAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBGb3JtRmllbGQtPkdldFZhbHVlKCk7Ci0gICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKLSAgICBBU1NFUlQocEVudik7Ci0gICAgaWYoIXBFbnYtPklzSlNJbml0aWF0ZWQoKSkKLSAgICB7Ci0gICAgICAgIGJGb3JtYXRlZCA9IEZBTFNFOwotICAgICAgICByZXR1cm4gc1ZhbHVlOwotICAgIH0KLQorICBpZiAoSXNDYWxjdWxhdGVFbmFibGVkKCkpIHsKICAgICBJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IG1fcERvY3VtZW50LT5HZXRKc1J1bnRpbWUoKTsKICAgICBBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CiAKICAgICBwUnVudGltZS0+U2V0UmVhZGVyRG9jdW1lbnQobV9wRG9jdW1lbnQpOwogCi0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9DT01CT0JPWCkKLSAgICB7Ci0gICAgICAgIGlmIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoMCk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkKLSAgICAgICAgICAgICAgICBzVmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBiRm9ybWF0ZWQgPSBGQUxTRTsKLQotICAgIENQREZfQUFjdGlvbiBhQWN0aW9uID0gcEZvcm1GaWVsZC0+R2V0QWRkaXRpb25hbEFjdGlvbigpOwotICAgIGlmIChhQWN0aW9uICE9IE5VTEwgJiYgYUFjdGlvbi5BY3Rpb25FeGlzdChDUERGX0FBY3Rpb246OkZvcm1hdCkpCi0gICAgewotICAgICAgICBDUERGX0FjdGlvbiBhY3Rpb24gPSBhQWN0aW9uLkdldEFjdGlvbihDUERGX0FBY3Rpb246OkZvcm1hdCk7Ci0gICAgICAgIGlmIChhY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNjcmlwdCA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7Ci0gICAgICAgICAgICBpZiAoIXNjcmlwdC5Jc0VtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgVmFsdWUgPSBzVmFsdWU7Ci0KKyAgICBpbnQgblNpemUgPSBtX3BJbnRlckZvcm0tPkNvdW50RmllbGRzSW5DYWxjdWxhdGlvbk9yZGVyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2l6ZTsgaSsrKSB7CisgICAgICBpZiAoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9CisgICAgICAgICAgICAgIG1fcEludGVyRm9ybS0+R2V0RmllbGRJbkNhbGN1bGF0aW9uT3JkZXIoaSkpIHsKKyAgICAgICAgLy8gICAgICAgICAgQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKKyAgICAgICAgaW50IG5UeXBlID0gcEZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKKyAgICAgICAgaWYgKG5UeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7CisgICAgICAgICAgQ1BERl9BQWN0aW9uIGFBY3Rpb24gPSBwRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKTsKKyAgICAgICAgICBpZiAoYUFjdGlvbiAmJiBhQWN0aW9uLkFjdGlvbkV4aXN0KENQREZfQUFjdGlvbjo6Q2FsY3VsYXRlKSkgeworICAgICAgICAgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYUFjdGlvbi5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpDYWxjdWxhdGUpOworICAgICAgICAgICAgaWYgKGFjdGlvbikgeworICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKKyAgICAgICAgICAgICAgaWYgKCFjc0pTLklzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIElGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKICAgICAgICAgICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+T25GaWVsZF9Gb3JtYXQocEZvcm1GaWVsZCwgVmFsdWUsIFRSVUUpOworICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNPbGRWYWx1ZSA9IHBGaWVsZC0+R2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBzT2xkVmFsdWU7CisgICAgICAgICAgICAgICAgRlhfQk9PTCBiUkMgPSBUUlVFOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PbkZpZWxkX0NhbGN1bGF0ZShwRm9ybUZpZWxkLCBwRmllbGQsIHNWYWx1ZSwgYlJDKTsKIAogICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNJbmZvOwotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCBzSW5mbyk7CisgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChjc0pTLCBzSW5mbyk7CiAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKIAotICAgICAgICAgICAgICAgIGlmIChiUmV0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc1ZhbHVlID0gVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGJGb3JtYXRlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgaWYgKGJSZXQpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChiUkMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNWYWx1ZS5Db21wYXJlKHNPbGRWYWx1ZSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICBwRmllbGQtPlNldFZhbHVlKHNWYWx1ZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgfQogICAgICAgICB9CisgICAgICB9CiAgICAgfQorICB9CiAKKyAgbV9iQnVzeSA9IEZBTFNFOworfQorCitDRlhfV2lkZVN0cmluZyBDUERGU0RLX0ludGVyRm9ybTo6T25Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkZvcm1hdGVkKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBpZiAoIXBFbnYtPklzSlNJbml0aWF0ZWQoKSkgeworICAgIGJGb3JtYXRlZCA9IEZBTFNFOwogICAgIHJldHVybiBzVmFsdWU7Ci19CisgIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVzZXRGaWVsZEFwcGVhcmFuY2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCkKLXsKLSAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgSUZYSlNfUnVudGltZSogcFJ1bnRpbWUgPSBtX3BEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAotICAgIGZvciAoaW50IGk9MCxzej1wRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CisgIHBSdW50aW1lLT5TZXRSZWFkZXJEb2N1bWVudChtX3BEb2N1bWVudCk7CiAKLSAgICAgICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKLSAgICAgICAgaWYoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBHZXRXaWRnZXQocEZvcm1DdHJsKSkKLSAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUsIGJWYWx1ZUNoYW5nZWQpOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NPTUJPQk9YKSB7CisgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMCkgeworICAgICAgaW50IGluZGV4ID0gcEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleCgwKTsKKyAgICAgIGlmIChpbmRleCA+PSAwKQorICAgICAgICBzVmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChpbmRleCk7CiAgICAgfQotfQorICB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06OlVwZGF0ZUZpZWxkKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkKQotewotICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICBiRm9ybWF0ZWQgPSBGQUxTRTsKIAotICAgIGZvciAoaW50IGk9MCxzej1wRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CisgIENQREZfQUFjdGlvbiBhQWN0aW9uID0gcEZvcm1GaWVsZC0+R2V0QWRkaXRpb25hbEFjdGlvbigpOworICBpZiAoYUFjdGlvbiAhPSBOVUxMICYmIGFBY3Rpb24uQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpGb3JtYXQpKSB7CisgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYUFjdGlvbi5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpGb3JtYXQpOworICAgIGlmIChhY3Rpb24pIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHNjcmlwdCA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgICBpZiAoIXNjcmlwdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgVmFsdWUgPSBzVmFsdWU7CiAKLSAgICAgICAgaWYoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBHZXRXaWRnZXQocEZvcm1DdHJsKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ1BERkRvY19FbnZpcm9ubWVudCAqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7Ci0gICAgICAgICAgICBDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBwRW52LT5HZXRJRm9ybUZpbGxlcigpOworICAgICAgICBJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7CisgICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKIAotCQkJQ1BERlhGQV9QYWdlICogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZYRkFQYWdlKCk7Ci0JCQlDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VWaWV3KHBQYWdlLEZBTFNFKTsKKyAgICAgICAgcENvbnRleHQtPk9uRmllbGRfRm9ybWF0KHBGb3JtRmllbGQsIFZhbHVlLCBUUlVFKTsKIAotICAgICAgICAgICAgRlhfUkVDVCByY0JCb3ggPSBwSUZvcm1GaWxsZXItPkdldFZpZXdCQm94KHBQYWdlVmlldywgcFdpZGdldCk7CisgICAgICAgIENGWF9XaWRlU3RyaW5nIHNJbmZvOworICAgICAgICBGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgc0luZm8pOworICAgICAgICBwUnVudGltZS0+UmVsZWFzZUNvbnRleHQocENvbnRleHQpOwogCi0gICAgICAgICAgICBwRW52LT5GRklfSW52YWxpZGF0ZShwUGFnZSxyY0JCb3gubGVmdCwgcmNCQm94LnRvcCwgcmNCQm94LnJpZ2h0LCByY0JCb3guYm90dG9tKTsKKyAgICAgICAgaWYgKGJSZXQpIHsKKyAgICAgICAgICBzVmFsdWUgPSBWYWx1ZTsKKyAgICAgICAgICBiRm9ybWF0ZWQgPSBUUlVFOwogICAgICAgICB9CisgICAgICB9CiAgICAgfQorICB9CisKKyAgcmV0dXJuIHNWYWx1ZTsKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6T25LZXlTdHJva2VDb21taXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLCBGWF9CT09MJiBiUkMpCi17Ci0gICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpSZXNldEZpZWxkQXBwZWFyYW5jZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWYWx1ZUNoYW5nZWQpIHsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKLSAgICBDUERGX0FBY3Rpb24gYUFjdGlvbiA9IHBGb3JtRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKTsKLSAgICBpZiAoYUFjdGlvbiAhPSBOVUxMICYmIGFBY3Rpb24uQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UpKQotICAgIHsKLSAgICAgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYUFjdGlvbi5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UpOwotICAgICAgICBpZiAoYWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgICAgICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOwotICAgICAgICAgICAgQVNTRVJUKHBFbnYgIT0gTlVMTCk7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOworICAgIEFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CiAKLSAgICAgICAgICAgIENQREZTREtfQWN0aW9uSGFuZGxlciogcEFjdGlvbkhhbmRsZXIgPSBwRW52LT5HZXRBY3Rpb25IYW5kZXIoKTsKLSAgICAgICAgICAgIEFTU0VSVChwQWN0aW9uSGFuZGxlciAhPSBOVUxMKTsKLQotICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gcEVudi0+RkZJX0lzQ1RSTEtleURvd24oMCk7Ci0gICAgICAgICAgICBmYS5iU2hpZnQgPSBwRW52LT5GRklfSXNTSElGVEtleURvd24oMCk7Ci0gICAgICAgICAgICBmYS5zVmFsdWUgPSBjc1ZhbHVlOwotCi0gICAgICAgICAgICBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsCi0gICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQsIHBGb3JtRmllbGQsIGZhKTsKLSAgICAgICAgICAgIGJSQyA9IGZhLmJSQzsKLSAgICAgICAgfQotICAgIH0KKyAgICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOworICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRm9ybUN0cmwpKQorICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZSwgYlZhbHVlQ2hhbmdlZCk7CisgIH0KIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6T25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIEZYX0JPT0wmIGJSQykKLXsKLSAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06OlVwZGF0ZUZpZWxkKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkKSB7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCi0gICAgQ1BERl9BQWN0aW9uIGFBY3Rpb24gPSBwRm9ybUZpZWxkLT5HZXRBZGRpdGlvbmFsQWN0aW9uKCk7Ci0gICAgaWYgKGFBY3Rpb24gIT0gTlVMTCAmJiBhQWN0aW9uLkFjdGlvbkV4aXN0KENQREZfQUFjdGlvbjo6VmFsaWRhdGUpKQotICAgIHsKLSAgICAgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYUFjdGlvbi5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSk7Ci0gICAgICAgIGlmIChhY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLSAgICAgICAgICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7Ci0gICAgICAgICAgICBBU1NFUlQocEVudiAhPSBOVUxMKTsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7IGkrKykgeworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7CisgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKIAotICAgICAgICAgICAgQ1BERlNES19BY3Rpb25IYW5kbGVyKiBwQWN0aW9uSGFuZGxlciA9IHBFbnYtPkdldEFjdGlvbkhhbmRlcigpOwotICAgICAgICAgICAgQVNTRVJUKHBBY3Rpb25IYW5kbGVyICE9IE5VTEwpOworICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRm9ybUN0cmwpKSB7CisgICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOworICAgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gcEVudi0+R2V0SUZvcm1GaWxsZXIoKTsKIAotICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICAgICAgICAgICAgZmEuYk1vZGlmaWVyID0gcEVudi0+RkZJX0lzQ1RSTEtleURvd24oMCk7Ci0gICAgICAgICAgICBmYS5iU2hpZnQgPSBwRW52LT5GRklfSXNTSElGVEtleURvd24oMCk7Ci0gICAgICAgICAgICBmYS5zVmFsdWUgPSBjc1ZhbHVlOworICAgICAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBXaWRnZXQtPkdldFBERlhGQVBhZ2UoKTsKKyAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhwUGFnZSwgRkFMU0UpOwogCi0gICAgICAgICAgICBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSwgbV9wRG9jdW1lbnQsIHBGb3JtRmllbGQsIGZhKTsKLSAgICAgICAgICAgIGJSQyA9IGZhLmJSQzsKKyAgICAgIEZYX1JFQ1QgcmNCQm94ID0gcElGb3JtRmlsbGVyLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIHBXaWRnZXQpOwogCi0gICAgICAgIH0KKyAgICAgIHBFbnYtPkZGSV9JbnZhbGlkYXRlKHBQYWdlLCByY0JCb3gubGVmdCwgcmNCQm94LnRvcCwgcmNCQm94LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmJvdHRvbSk7CiAgICAgfQorICB9Cit9CisKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06Ok9uS2V5U3Ryb2tlQ29tbWl0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUkMpIHsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgQ1BERl9BQWN0aW9uIGFBY3Rpb24gPSBwRm9ybUZpZWxkLT5HZXRBZGRpdGlvbmFsQWN0aW9uKCk7CisgIGlmIChhQWN0aW9uICE9IE5VTEwgJiYgYUFjdGlvbi5BY3Rpb25FeGlzdChDUERGX0FBY3Rpb246OktleVN0cm9rZSkpIHsKKyAgICBDUERGX0FjdGlvbiBhY3Rpb24gPSBhQWN0aW9uLkdldEFjdGlvbihDUERGX0FBY3Rpb246OktleVN0cm9rZSk7CisgICAgaWYgKGFjdGlvbikgeworICAgICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworICAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgICAgIEFTU0VSVChwRW52ICE9IE5VTEwpOworCisgICAgICBDUERGU0RLX0FjdGlvbkhhbmRsZXIqIHBBY3Rpb25IYW5kbGVyID0gcEVudi0+R2V0QWN0aW9uSGFuZGVyKCk7CisgICAgICBBU1NFUlQocEFjdGlvbkhhbmRsZXIgIT0gTlVMTCk7CisKKyAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKKyAgICAgIGZhLmJNb2RpZmllciA9IHBFbnYtPkZGSV9Jc0NUUkxLZXlEb3duKDApOworICAgICAgZmEuYlNoaWZ0ID0gcEVudi0+RkZJX0lzU0hJRlRLZXlEb3duKDApOworICAgICAgZmEuc1ZhbHVlID0gY3NWYWx1ZTsKKworICAgICAgcEFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX0ZpZWxkSmF2YVNjcmlwdChhY3Rpb24sIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgZmEpOworICAgICAgYlJDID0gZmEuYlJDOworICAgIH0KKyAgfQorfQorCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDKSB7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgIENQREZfQUFjdGlvbiBhQWN0aW9uID0gcEZvcm1GaWVsZC0+R2V0QWRkaXRpb25hbEFjdGlvbigpOworICBpZiAoYUFjdGlvbiAhPSBOVUxMICYmIGFBY3Rpb24uQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSkpIHsKKyAgICBDUERGX0FjdGlvbiBhY3Rpb24gPSBhQWN0aW9uLkdldEFjdGlvbihDUERGX0FBY3Rpb246OlZhbGlkYXRlKTsKKyAgICBpZiAoYWN0aW9uKSB7CisgICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisgICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOworICAgICAgQVNTRVJUKHBFbnYgIT0gTlVMTCk7CisKKyAgICAgIENQREZTREtfQWN0aW9uSGFuZGxlciogcEFjdGlvbkhhbmRsZXIgPSBwRW52LT5HZXRBY3Rpb25IYW5kZXIoKTsKKyAgICAgIEFTU0VSVChwQWN0aW9uSGFuZGxlciAhPSBOVUxMKTsKKworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gcEVudi0+RkZJX0lzQ1RSTEtleURvd24oMCk7CisgICAgICBmYS5iU2hpZnQgPSBwRW52LT5GRklfSXNTSElGVEtleURvd24oMCk7CisgICAgICBmYS5zVmFsdWUgPSBjc1ZhbHVlOworCisgICAgICBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQsIHBGb3JtRmllbGQsIGZhKTsKKyAgICAgIGJSQyA9IGZhLmJSQzsKKyAgICB9CisgIH0KIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKLXsKLSAgICBBU1NFUlQoYWN0aW9uKTsKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICBBU1NFUlQoYWN0aW9uKTsKIAorICBDUERGX0FjdGlvbkZpZWxkcyBhZiA9IGFjdGlvbi5HZXRXaWRnZXRzKCk7CisgIENGWF9QdHJBcnJheSBmaWVsZE9iamVjdHM7CisgIGFmLkdldEFsbEZpZWxkcyhmaWVsZE9iamVjdHMpOworICBDRlhfUHRyQXJyYXkgd2lkZ2V0QXJyYXk7CisgIENGWF9QdHJBcnJheSBmaWVsZHM7CisgIEdldEZpZWxkRnJvbU9iamVjdHMoZmllbGRPYmplY3RzLCBmaWVsZHMpOworCisgIEZYX0JPT0wgYkhpZGUgPSBhY3Rpb24uR2V0SGlkZVN0YXR1cygpOworCisgIEZYX0JPT0wgYkNoYW5nZWQgPSBGQUxTRTsKKworICBmb3IgKGludCBpID0gMCwgc3ogPSBmaWVsZHMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKWZpZWxkc1tpXTsKKyAgICBBU1NFUlQocEZpZWxkICE9IE5VTEwpOworCisgICAgZm9yIChpbnQgaiA9IDAsIGpzeiA9IHBGaWVsZC0+Q291bnRDb250cm9scygpOyBqIDwganN6OyBqKyspIHsKKyAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gcEZpZWxkLT5HZXRDb250cm9sKGopOworICAgICAgQVNTRVJUKHBDb250cm9sICE9IE5VTEwpOworCisgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBHZXRXaWRnZXQocENvbnRyb2wpKSB7CisgICAgICAgIGludCBuRmxhZ3MgPSBwV2lkZ2V0LT5HZXRGbGFncygpOworICAgICAgICBpZiAoYkhpZGUpIHsKKyAgICAgICAgICBuRmxhZ3MgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKKyAgICAgICAgICBuRmxhZ3MgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKKyAgICAgICAgICBuRmxhZ3MgfD0gKEFOTk9URkxBR19ISURERU4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5GbGFncyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOworICAgICAgICAgIG5GbGFncyAmPSAofkFOTk9URkxBR19ISURERU4pOworICAgICAgICAgIG5GbGFncyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOworICAgICAgICB9CisgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKG5GbGFncyk7CisKKyAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsKKyAgICAgICAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKworICAgICAgICBwUGFnZVZpZXctPlVwZGF0ZVZpZXcocFdpZGdldCk7CisKKyAgICAgICAgYkNoYW5nZWQgPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBiQ2hhbmdlZDsKK30KKworRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RG9BY3Rpb25fU3VibWl0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKSB7CisgIEFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CisgIENGWF9XaWRlU3RyaW5nIHNEZXN0aW5hdGlvbiA9IGFjdGlvbi5HZXRGaWxlUGF0aCgpOworICBpZiAoc0Rlc3RpbmF0aW9uLklzRW1wdHkoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQWN0aW9uRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CisgIGlmIChwQWN0aW9uRGljdC0+S2V5RXhpc3QoIkZpZWxkcyIpKSB7CiAgICAgQ1BERl9BY3Rpb25GaWVsZHMgYWYgPSBhY3Rpb24uR2V0V2lkZ2V0cygpOworICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBhY3Rpb24uR2V0RmxhZ3MoKTsKICAgICBDRlhfUHRyQXJyYXkgZmllbGRPYmplY3RzOwogICAgIGFmLkdldEFsbEZpZWxkcyhmaWVsZE9iamVjdHMpOwotICAgIENGWF9QdHJBcnJheSB3aWRnZXRBcnJheTsKKwogICAgIENGWF9QdHJBcnJheSBmaWVsZHM7CiAgICAgR2V0RmllbGRGcm9tT2JqZWN0cyhmaWVsZE9iamVjdHMsIGZpZWxkcyk7Ci0KLSAgICBGWF9CT09MIGJIaWRlID0gYWN0aW9uLkdldEhpZGVTdGF0dXMoKTsKLQotICAgIEZYX0JPT0wgYkNoYW5nZWQgPSBGQUxTRTsKLQotICAgIGZvciAoaW50IGk9MCwgc3o9ZmllbGRzLkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgIHsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopZmllbGRzW2ldOwotICAgICAgICBBU1NFUlQocEZpZWxkICE9IE5VTEwpOwotCi0KLSAgICAgICAgZm9yIChpbnQgaj0wLGpzej1wRmllbGQtPkNvdW50Q29udHJvbHMoKTsgajxqc3o7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBwRmllbGQtPkdldENvbnRyb2woaik7Ci0gICAgICAgICAgICBBU1NFUlQocENvbnRyb2wgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwQ29udHJvbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IG5GbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJIaWRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbkZsYWdzICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIG5GbGFncyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOwotICAgICAgICAgICAgICAgICAgICBuRmxhZ3MgfD0gKEFOTk9URkxBR19ISURERU4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuRmxhZ3MgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgbkZsYWdzICY9ICh+QU5OT1RGTEFHX0hJRERFTik7Ci0gICAgICAgICAgICAgICAgICAgIG5GbGFncyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwV2lkZ2V0LT5TZXRGbGFncyhuRmxhZ3MpOwotCi0gICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotCi0gICAgICAgICAgICAgICAgcFBhZ2VWaWV3LT5VcGRhdGVWaWV3KHBXaWRnZXQpOwotCi0gICAgICAgICAgICAgICAgYkNoYW5nZWQgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGJDaGFuZ2VkOwotfQotCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCi17Ci0gICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKLSAgICBDRlhfV2lkZVN0cmluZyBzRGVzdGluYXRpb24gPSBhY3Rpb24uR2V0RmlsZVBhdGgoKTsKLSAgICBpZiAoc0Rlc3RpbmF0aW9uLklzRW1wdHkoKSkKKyAgICBpZiAoZmllbGRzLkdldFNpemUoKSAhPSAwKSB7CisgICAgICBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlID0gIShkd0ZsYWdzICYgMHgwMSk7CisgICAgICBpZiAobV9wSW50ZXJGb3JtLT5DaGVja1JlcXVpcmVkRmllbGRzKCZmaWVsZHMsIGJJbmNsdWRlT3JFeGNsdWRlKSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQWN0aW9uRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7Ci0gICAgaWYgKHBBY3Rpb25EaWN0LT5LZXlFeGlzdCgiRmllbGRzIikpCi0gICAgewotICAgICAgICBDUERGX0FjdGlvbkZpZWxkcyBhZiA9IGFjdGlvbi5HZXRXaWRnZXRzKCk7Ci0gICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBhY3Rpb24uR2V0RmxhZ3MoKTsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IGZpZWxkT2JqZWN0czsKLSAgICAgICAgYWYuR2V0QWxsRmllbGRzKGZpZWxkT2JqZWN0cyk7Ci0KLSAgICAgICAgQ0ZYX1B0ckFycmF5IGZpZWxkczsKLSAgICAgICAgR2V0RmllbGRGcm9tT2JqZWN0cyhmaWVsZE9iamVjdHMsIGZpZWxkcyk7Ci0gICAgICAgIGlmIChmaWVsZHMuR2V0U2l6ZSgpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUgPSAhKGR3RmxhZ3MgJiAweDAxKTsKLSAgICAgICAgICAgIGlmIChtX3BJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoJmZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUpKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICAgICAgcmV0dXJuIFN1Ym1pdEZpZWxkcyhzRGVzdGluYXRpb24sIGZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUsIEZBTFNFKTsKLSAgICAgICAgfQorICAgICAgcmV0dXJuIFN1Ym1pdEZpZWxkcyhzRGVzdGluYXRpb24sIGZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUsIEZBTFNFKTsKICAgICB9Ci0gICAgaWYgKG1fcEludGVyRm9ybS0+Q2hlY2tSZXF1aXJlZEZpZWxkcygpKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gU3VibWl0Rm9ybShzRGVzdGluYXRpb24sIEZBTFNFKTsKLX0KLQotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6U3VibWl0RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0Rlc3RpbmF0aW9uLCBjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsIEZYX0JPT0wgYlVybEVuY29kZWQpCi17Ci0gICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKLSAgICBBU1NFUlQocEVudiAhPSBOVUxMKTsKLQotICAgIENGWF9CeXRlVGV4dEJ1ZiB0ZXh0QnVmOwotICAgIEV4cG9ydEZpZWxkc1RvRkRGVGV4dEJ1ZihmaWVsZHMsIGJJbmNsdWRlT3JFeGNsdWRlLCB0ZXh0QnVmKTsKLQotICAgIHVpbnQ4X3QqIHBCdWZmZXIgPSB0ZXh0QnVmLkdldEJ1ZmZlcigpOwotICAgIEZYX1NUUlNJWkUgbkJ1ZlNpemUgPSB0ZXh0QnVmLkdldExlbmd0aCgpOwotCi0gICAgaWYgKGJVcmxFbmNvZGVkKQotICAgIHsKLSAgICAgICAgaWYoIUZERlRvVVJMRW5jb2RlZERhdGEocEJ1ZmZlciwgbkJ1ZlNpemUpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHBFbnYtPkpTX2RvY1N1Ym1pdEZvcm0ocEJ1ZmZlciwgbkJ1ZlNpemUsIGNzRGVzdGluYXRpb24uY19zdHIoKSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6RG9GREZCdWZmZXIoQ0ZYX0J5dGVTdHJpbmcgc0J1ZmZlcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAoQ0ZERl9Eb2N1bWVudCAqcEZERkRvY3VtZW50ID0gQ0ZERl9Eb2N1bWVudDo6UGFyc2VNZW1vcnkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzQnVmZmVyLkdldEJ1ZmZlcihzQnVmZmVyLkdldExlbmd0aCgpKSwgc0J1ZmZlci5HZXRMZW5ndGgoKSkpCi0gICAgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290RGljID0gcEZERkRvY3VtZW50LT5HZXRSb290KCk7Ci0gICAgICAgIGlmKHBSb290RGljKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkgKiBwRkRGRGljdD1wUm9vdERpYy0+R2V0RGljdCgiRkRGIik7Ci0gICAgICAgICAgICBpZihwRkRGRGljdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkgKiBwSlNEaWN0ID0gcEZERkRpY3QtPkdldERpY3QoIkphdmFTY3JpcHQiKTsKLSAgICAgICAgICAgICAgICBpZihwSlNEaWN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NKUzsKLQotICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcEpTID0gcEpTRGljdC0+R2V0RWxlbWVudFZhbHVlKCJCZWZvcmUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBKUyAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVR5cGUgPSBwSlMtPkdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpVHlwZSA9PSBQREZPQkpfU1RSSU5HKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzSlMgPSBwSlNEaWN0LT5HZXRVbmljb2RlVGV4dCgiQmVmb3JlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpVHlwZSA9PSBQREZPQkpfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzSlMgPSBwSlMtPkdldFVuaWNvZGVUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZWxldGUgcEZERkRvY3VtZW50OwotICAgIH0KLQotICAgIHNCdWZmZXIuUmVsZWFzZUJ1ZmZlcigpOwotfQotCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpGREZUb1VSTEVuY29kZWREYXRhKENGWF9XaWRlU3RyaW5nIGNzRkRGRmlsZSwgQ0ZYX1dpZGVTdHJpbmcgY3NUeHRGaWxlKQotewotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpGREZUb1VSTEVuY29kZWREYXRhKHVpbnQ4X3QqJiBwQnVmLCBGWF9TVFJTSVpFJiBuQnVmU2l6ZSkKLXsKLSAgICBDRkRGX0RvY3VtZW50KiBwRkRGID0gQ0ZERl9Eb2N1bWVudDo6UGFyc2VNZW1vcnkocEJ1ZiwgbkJ1ZlNpemUpOwotICAgIGlmIChwRkRGKQotICAgIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFpbkRpY3QgPSBwRkRGLT5HZXRSb290KCktPkdldERpY3QoIkZERiIpOwotICAgICAgICBpZiAocE1haW5EaWN0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgICAgICAvLyBHZXQgZmllbGRzCi0gICAgICAgIENQREZfQXJyYXkqIHBGaWVsZHMgPSBwTWFpbkRpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKLSAgICAgICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENGWF9CeXRlVGV4dEJ1ZiBmZGZFbmNvZGVkRGF0YTsKLQotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEZpZWxkcy0+R2V0Q291bnQoKTsgaSArKykKLSAgICAgICAgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGQgPSBwRmllbGRzLT5HZXREaWN0KGkpOwotICAgICAgICAgICAgaWYgKHBGaWVsZCA9PSBOVUxMKSBjb250aW51ZTsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICBuYW1lID0gcEZpZWxkLT5HZXRVbmljb2RlVGV4dCgiVCIpOwotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZV9iID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKG5hbWUpOwotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCVmFsdWUgPSBwRmllbGQtPkdldFN0cmluZygiViIpOwotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NXVmFsdWUgPSBQREZfRGVjb2RlVGV4dChjc0JWYWx1ZSk7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc1ZhbHVlX2IgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoY3NXVmFsdWUpOwotCi0gICAgICAgICAgICBmZGZFbmNvZGVkRGF0YSA9IGZkZkVuY29kZWREYXRhPDxuYW1lX2IuR2V0QnVmZmVyKG5hbWVfYi5HZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICBuYW1lX2IuUmVsZWFzZUJ1ZmZlcigpOwotICAgICAgICAgICAgZmRmRW5jb2RlZERhdGEgPSBmZGZFbmNvZGVkRGF0YTw8Ij0iOwotICAgICAgICAgICAgZmRmRW5jb2RlZERhdGEgPSBmZGZFbmNvZGVkRGF0YTw8Y3NWYWx1ZV9iLkdldEJ1ZmZlcihjc1ZhbHVlX2IuR2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgY3NWYWx1ZV9iLlJlbGVhc2VCdWZmZXIoKTsKLSAgICAgICAgICAgIGlmKGkgIT0gcEZpZWxkcy0+R2V0Q291bnQoKS0xKQotICAgICAgICAgICAgICAgIGZkZkVuY29kZWREYXRhID0gZmRmRW5jb2RlZERhdGE8PCImIjsKLSAgICAgICAgfQotCi0gICAgICAgIG5CdWZTaXplID0gZmRmRW5jb2RlZERhdGEuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIHBCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBuQnVmU2l6ZSk7Ci0gICAgICAgIEZYU1lTX21lbWNweShwQnVmLCBmZGZFbmNvZGVkRGF0YS5HZXRCdWZmZXIoKSwgbkJ1ZlNpemUpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RXhwb3J0RmllbGRzVG9GREZUZXh0QnVmKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKLQotICAgIENGREZfRG9jdW1lbnQqIHBGREYgPSBtX3BJbnRlckZvcm0tPkV4cG9ydFRvRkRGKG1fcERvY3VtZW50LT5HZXRQYXRoKCksKENGWF9QdHJBcnJheSYpZmllbGRzLCBiSW5jbHVkZU9yRXhjbHVkZSk7Ci0gICAgaWYgKCFwRkRGKSByZXR1cm4gRkFMU0U7Ci0gICAgRlhfQk9PTCBiUmV0ID0gcEZERi0+V3JpdGVCdWYodGV4dEJ1Zik7IC8vID0gRkFMU0U7Ly8KLSAgICBkZWxldGUgcEZERjsKLQotICAgIHJldHVybiBiUmV0OwotfQotCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpTeW5jaHJvbml6ZUZpZWxkKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBGWF9CT09MIGJTeW5jaHJvbml6ZUVsc2UpCi17Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQlpbnQgeCA9IDA7Ci0JaWYgKG1fRmllbGRTeW5jaHJvbml6ZU1hcC5Mb29rdXAocEZvcm1GaWVsZCwgeCkpCi0JCXJldHVybjsKLQotCWZvciAoaW50IGk9MCxzej1wRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGk8c3o7IGkrKykKLQl7Ci0JCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7Ci0JCUFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7Ci0KLQkJQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKLQkJaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBGb3JtQ3RybCkpCi0JCXsKLQkJCXBXaWRnZXQtPlN5bmNocm9uaXplKGJTeW5jaHJvbml6ZUVsc2UpOwotCQl9Ci0JfQotfQotCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX0ludGVyRm9ybTo6R2V0VGVtcG9yYXJ5RmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWxlRXh0KQotewotICAgIENGWF9XaWRlU3RyaW5nIHNGaWxlTmFtZTsKLSAgICByZXR1cm4gTCIiOwotfQotCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpTdWJtaXRGb3JtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRGVzdGluYXRpb24sIEZYX0JPT0wgYlVybEVuY29kZWQpCi17Ci0gICAgaWYgKHNEZXN0aW5hdGlvbi5Jc0VtcHR5KCkpIHJldHVybiBGQUxTRTsKLQotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7Ci0gICAgQVNTRVJUKHBFbnYgIT0gTlVMTCk7Ci0KLSAgICBpZihOVUxMID09IG1fcERvY3VtZW50KSByZXR1cm4gRkFMU0U7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NQREZGaWxlUGF0aCA9IG1fcERvY3VtZW50LT5HZXRQYXRoKCk7Ci0KLSAgICBpZihOVUxMID09IG1fcEludGVyRm9ybSkgcmV0dXJuIEZBTFNFOwotICAgIENGREZfRG9jdW1lbnQqIHBGREZEb2MgPSBtX3BJbnRlckZvcm0tPkV4cG9ydFRvRkRGKHdzUERGRmlsZVBhdGgpOwotICAgIGlmIChOVUxMID09IHBGREZEb2MpIHJldHVybiBGQUxTRTsKLQotICAgIENGWF9CeXRlVGV4dEJ1ZiBGZGZCdWZmZXI7Ci0gICAgRlhfQk9PTCBiUmV0ID0gcEZERkRvYy0+V3JpdGVCdWYoRmRmQnVmZmVyKTsKLSAgICBkZWxldGUgcEZERkRvYzsKLSAgICBpZiAoIWJSZXQpIHJldHVybiBGQUxTRTsKLQotICAgIHVpbnQ4X3QqIHBCdWZmZXIgPSBGZGZCdWZmZXIuR2V0QnVmZmVyKCk7Ci0gICAgRlhfU1RSU0laRSBuQnVmU2l6ZSA9IEZkZkJ1ZmZlci5HZXRMZW5ndGgoKTsKLQotICAgIGlmIChiVXJsRW5jb2RlZCkKLSAgICB7Ci0gICAgICAgIGlmKCFGREZUb1VSTEVuY29kZWREYXRhKHBCdWZmZXIsIG5CdWZTaXplKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBwRW52LT5KU19kb2NTdWJtaXRGb3JtKHBCdWZmZXIsIG5CdWZTaXplLCBzRGVzdGluYXRpb24uY19zdHIoKSk7Ci0KLSAgICBpZiAoYlVybEVuY29kZWQgJiYgcEJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIEZYX0ZyZWUocEJ1ZmZlcik7Ci0gICAgICAgIHBCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpFeHBvcnRGb3JtVG9GREZUZXh0QnVmKENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZikKLXsKLQotICAgIEFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgQ0ZERl9Eb2N1bWVudCogcEZERiA9IG1fcEludGVyRm9ybS0+RXhwb3J0VG9GREYobV9wRG9jdW1lbnQtPkdldFBhdGgoKSk7Ci0gICAgaWYgKCFwRkRGKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBGWF9CT09MIGJSZXQgPSBwRkRGLT5Xcml0ZUJ1Zih0ZXh0QnVmKTsKLSAgICBkZWxldGUgcEZERjsKLQotICAgIHJldHVybiBiUmV0OwotfQotCi0KLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX1Jlc2V0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQotewotICAgIEFTU0VSVChhY3Rpb24pOwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQWN0aW9uRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7Ci0gICAgaWYgKHBBY3Rpb25EaWN0LT5LZXlFeGlzdCgiRmllbGRzIikpCi0gICAgewotICAgICAgICBDUERGX0FjdGlvbkZpZWxkcyBhZiA9IGFjdGlvbi5HZXRXaWRnZXRzKCk7Ci0gICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBhY3Rpb24uR2V0RmxhZ3MoKTsKLQotICAgICAgICBDRlhfUHRyQXJyYXkgZmllbGRPYmplY3RzOwotICAgICAgICBhZi5HZXRBbGxGaWVsZHMoZmllbGRPYmplY3RzKTsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IGZpZWxkczsKLSAgICAgICAgR2V0RmllbGRGcm9tT2JqZWN0cyhmaWVsZE9iamVjdHMsIGZpZWxkcyk7Ci0gICAgICAgIHJldHVybiBtX3BJbnRlckZvcm0tPlJlc2V0Rm9ybShmaWVsZHMsICEoZHdGbGFncyAmIDB4MDEpLCBUUlVFKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbV9wSW50ZXJGb3JtLT5SZXNldEZvcm0oVFJVRSk7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKLXsKKyAgfQorICBpZiAobV9wSW50ZXJGb3JtLT5DaGVja1JlcXVpcmVkRmllbGRzKCkpCiAgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBTdWJtaXRGb3JtKHNEZXN0aW5hdGlvbiwgRkFMU0UpOwogfQogCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpHZXRGaWVsZEZyb21PYmplY3RzKGNvbnN0IENGWF9QdHJBcnJheSYgb2JqZWN0cywgQ0ZYX1B0ckFycmF5JiBmaWVsZHMpCi17CitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpTdWJtaXRGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVcmxFbmNvZGVkKSB7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7CisgIEFTU0VSVChwRW52ICE9IE5VTEwpOworCisgIENGWF9CeXRlVGV4dEJ1ZiB0ZXh0QnVmOworICBFeHBvcnRGaWVsZHNUb0ZERlRleHRCdWYoZmllbGRzLCBiSW5jbHVkZU9yRXhjbHVkZSwgdGV4dEJ1Zik7CisKKyAgdWludDhfdCogcEJ1ZmZlciA9IHRleHRCdWYuR2V0QnVmZmVyKCk7CisgIEZYX1NUUlNJWkUgbkJ1ZlNpemUgPSB0ZXh0QnVmLkdldExlbmd0aCgpOworCisgIGlmIChiVXJsRW5jb2RlZCkgeworICAgIGlmICghRkRGVG9VUkxFbmNvZGVkRGF0YShwQnVmZmVyLCBuQnVmU2l6ZSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBwRW52LT5KU19kb2NTdWJtaXRGb3JtKHBCdWZmZXIsIG5CdWZTaXplLCBjc0Rlc3RpbmF0aW9uLmNfc3RyKCkpOworCisgIHJldHVybiBUUlVFOworfQorCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpEb0ZERkJ1ZmZlcihDRlhfQnl0ZVN0cmluZyBzQnVmZmVyKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAoQ0ZERl9Eb2N1bWVudCogcEZERkRvY3VtZW50ID0gQ0ZERl9Eb2N1bWVudDo6UGFyc2VNZW1vcnkoCisgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKXNCdWZmZXIuR2V0QnVmZmVyKHNCdWZmZXIuR2V0TGVuZ3RoKCkpLAorICAgICAgICAgIHNCdWZmZXIuR2V0TGVuZ3RoKCkpKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdERpYyA9IHBGREZEb2N1bWVudC0+R2V0Um9vdCgpOworICAgIGlmIChwUm9vdERpYykgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRkRGRGljdCA9IHBSb290RGljLT5HZXREaWN0KCJGREYiKTsKKyAgICAgIGlmIChwRkRGRGljdCkgeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBKU0RpY3QgPSBwRkRGRGljdC0+R2V0RGljdCgiSmF2YVNjcmlwdCIpOworICAgICAgICBpZiAocEpTRGljdCkgeworICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzSlM7CisKKyAgICAgICAgICBDUERGX09iamVjdCogcEpTID0gcEpTRGljdC0+R2V0RWxlbWVudFZhbHVlKCJCZWZvcmUiKTsKKyAgICAgICAgICBpZiAocEpTICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludCBpVHlwZSA9IHBKUy0+R2V0VHlwZSgpOworICAgICAgICAgICAgaWYgKGlUeXBlID09IFBERk9CSl9TVFJJTkcpCisgICAgICAgICAgICAgIGNzSlMgPSBwSlNEaWN0LT5HZXRVbmljb2RlVGV4dCgiQmVmb3JlIik7CisgICAgICAgICAgICBlbHNlIGlmIChpVHlwZSA9PSBQREZPQkpfU1RSRUFNKQorICAgICAgICAgICAgICBjc0pTID0gcEpTLT5HZXRVbmljb2RlVGV4dCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBkZWxldGUgcEZERkRvY3VtZW50OworICB9CisKKyAgc0J1ZmZlci5SZWxlYXNlQnVmZmVyKCk7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkZERlRvVVJMRW5jb2RlZERhdGEoQ0ZYX1dpZGVTdHJpbmcgY3NGREZGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1R4dEZpbGUpIHsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkZERlRvVVJMRW5jb2RlZERhdGEodWludDhfdComIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUmIG5CdWZTaXplKSB7CisgIENGREZfRG9jdW1lbnQqIHBGREYgPSBDRkRGX0RvY3VtZW50OjpQYXJzZU1lbW9yeShwQnVmLCBuQnVmU2l6ZSk7CisgIGlmIChwRkRGKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFpbkRpY3QgPSBwRkRGLT5HZXRSb290KCktPkdldERpY3QoIkZERiIpOworICAgIGlmIChwTWFpbkRpY3QgPT0gTlVMTCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8vIEdldCBmaWVsZHMKKyAgICBDUERGX0FycmF5KiBwRmllbGRzID0gcE1haW5EaWN0LT5HZXRBcnJheSgiRmllbGRzIik7CisgICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENGWF9CeXRlVGV4dEJ1ZiBmZGZFbmNvZGVkRGF0YTsKKworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwRmllbGRzLT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcEZpZWxkID0gcEZpZWxkcy0+R2V0RGljdChpKTsKKyAgICAgIGlmIChwRmllbGQgPT0gTlVMTCkKKyAgICAgICAgY29udGludWU7CisgICAgICBDRlhfV2lkZVN0cmluZyBuYW1lOworICAgICAgbmFtZSA9IHBGaWVsZC0+R2V0VW5pY29kZVRleHQoIlQiKTsKKyAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWVfYiA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShuYW1lKTsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGNzQlZhbHVlID0gcEZpZWxkLT5HZXRTdHJpbmcoIlYiKTsKKyAgICAgIENGWF9XaWRlU3RyaW5nIGNzV1ZhbHVlID0gUERGX0RlY29kZVRleHQoY3NCVmFsdWUpOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NWYWx1ZV9iID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKGNzV1ZhbHVlKTsKKworICAgICAgZmRmRW5jb2RlZERhdGEgPSBmZGZFbmNvZGVkRGF0YSA8PCBuYW1lX2IuR2V0QnVmZmVyKG5hbWVfYi5HZXRMZW5ndGgoKSk7CisgICAgICBuYW1lX2IuUmVsZWFzZUJ1ZmZlcigpOworICAgICAgZmRmRW5jb2RlZERhdGEgPSBmZGZFbmNvZGVkRGF0YSA8PCAiPSI7CisgICAgICBmZGZFbmNvZGVkRGF0YSA9IGZkZkVuY29kZWREYXRhCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGNzVmFsdWVfYi5HZXRCdWZmZXIoY3NWYWx1ZV9iLkdldExlbmd0aCgpKTsKKyAgICAgIGNzVmFsdWVfYi5SZWxlYXNlQnVmZmVyKCk7CisgICAgICBpZiAoaSAhPSBwRmllbGRzLT5HZXRDb3VudCgpIC0gMSkKKyAgICAgICAgZmRmRW5jb2RlZERhdGEgPSBmZGZFbmNvZGVkRGF0YSA8PCAiJiI7CisgICAgfQorCisgICAgbkJ1ZlNpemUgPSBmZGZFbmNvZGVkRGF0YS5HZXRMZW5ndGgoKTsKKyAgICBwQnVmID0gRlhfQWxsb2ModWludDhfdCwgbkJ1ZlNpemUpOworICAgIEZYU1lTX21lbWNweShwQnVmLCBmZGZFbmNvZGVkRGF0YS5HZXRCdWZmZXIoKSwgbkJ1ZlNpemUpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpFeHBvcnRGaWVsZHNUb0ZERlRleHRCdWYoY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOworCisgIENGREZfRG9jdW1lbnQqIHBGREYgPSBtX3BJbnRlckZvcm0tPkV4cG9ydFRvRkRGKAorICAgICAgbV9wRG9jdW1lbnQtPkdldFBhdGgoKSwgKENGWF9QdHJBcnJheSYpZmllbGRzLCBiSW5jbHVkZU9yRXhjbHVkZSk7CisgIGlmICghcEZERikKKyAgICByZXR1cm4gRkFMU0U7CisgIEZYX0JPT0wgYlJldCA9IHBGREYtPldyaXRlQnVmKHRleHRCdWYpOyAgLy8gPSBGQUxTRTsvLworICBkZWxldGUgcEZERjsKKworICByZXR1cm4gYlJldDsKK30KKwordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6U3luY2hyb25pemVGaWVsZChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY2hyb25pemVFbHNlKSB7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgIGludCB4ID0gMDsKKyAgaWYgKG1fRmllbGRTeW5jaHJvbml6ZU1hcC5Mb29rdXAocEZvcm1GaWVsZCwgeCkpCisgICAgcmV0dXJuOworCisgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOworICAgIEFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7CisKICAgICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgaW50IGlDb3VudCA9IG9iamVjdHMuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKQotICAgIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmplY3QgPSAoQ1BERl9PYmplY3QqKW9iamVjdHNbaV07Ci0gICAgICAgIGlmIChwT2JqZWN0ID09IE5VTEwpIGNvbnRpbnVlOwotCi0gICAgICAgIGludCBpVHlwZSA9IHBPYmplY3QtPkdldFR5cGUoKTsKLSAgICAgICAgaWYgKGlUeXBlID09IFBERk9CSl9TVFJJTkcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzTmFtZSA9IHBPYmplY3QtPkdldFVuaWNvZGVUZXh0KCk7Ci0gICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wSW50ZXJGb3JtLT5HZXRGaWVsZCgwLCBjc05hbWUpOwotICAgICAgICAgICAgaWYgKHBGaWVsZCAhPSBOVUxMKQotICAgICAgICAgICAgICAgIGZpZWxkcy5BZGQocEZpZWxkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1fcEludGVyRm9ybS0+SXNWYWxpZEZvcm1GaWVsZChwT2JqZWN0KSkKLSAgICAgICAgICAgICAgICBmaWVsZHMuQWRkKHBPYmplY3QpOwotICAgICAgICB9CisgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBGb3JtQ3RybCkpIHsKKyAgICAgIHBXaWRnZXQtPlN5bmNocm9uaXplKGJTeW5jaHJvbml6ZUVsc2UpOwogICAgIH0KKyAgfQogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUERGX0Zvcm1Ob3RpZnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NGWF9XaWRlU3RyaW5nIENQREZTREtfSW50ZXJGb3JtOjpHZXRUZW1wb3JhcnlGaWxlTmFtZSgKKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpbGVFeHQpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc0ZpbGVOYW1lOworICByZXR1cm4gTCIiOworfQogCi1pbnQgQ1BERlNES19JbnRlckZvcm06OkJlZm9yZVZhbHVlQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlKQotewotICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilwRmllbGQ7Ci0gICAgaW50IG5UeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7Ci0gICAgaWYgKG5UeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgIHsKLSAgICAgICAgRlhfQk9PTCBiUkMgPSBUUlVFOwotICAgICAgICBPbktleVN0cm9rZUNvbW1pdChwRm9ybUZpZWxkLCBjc1ZhbHVlLCBiUkMpOwotICAgICAgICBpZiAoYlJDKQotICAgICAgICB7Ci0gICAgICAgICAgICBPblZhbGlkYXRlKHBGb3JtRmllbGQsIGNzVmFsdWUsIGJSQyk7Ci0gICAgICAgICAgICByZXR1cm4gYlJDID8gMSA6IC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OlN1Ym1pdEZvcm0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNEZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXJsRW5jb2RlZCkgeworICBpZiAoc0Rlc3RpbmF0aW9uLklzRW1wdHkoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYgIT0gTlVMTCk7CisKKyAgaWYgKE5VTEwgPT0gbV9wRG9jdW1lbnQpCisgICAgcmV0dXJuIEZBTFNFOworICBDRlhfV2lkZVN0cmluZyB3c1BERkZpbGVQYXRoID0gbV9wRG9jdW1lbnQtPkdldFBhdGgoKTsKKworICBpZiAoTlVMTCA9PSBtX3BJbnRlckZvcm0pCisgICAgcmV0dXJuIEZBTFNFOworICBDRkRGX0RvY3VtZW50KiBwRkRGRG9jID0gbV9wSW50ZXJGb3JtLT5FeHBvcnRUb0ZERih3c1BERkZpbGVQYXRoKTsKKyAgaWYgKE5VTEwgPT0gcEZERkRvYykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ0ZYX0J5dGVUZXh0QnVmIEZkZkJ1ZmZlcjsKKyAgRlhfQk9PTCBiUmV0ID0gcEZERkRvYy0+V3JpdGVCdWYoRmRmQnVmZmVyKTsKKyAgZGVsZXRlIHBGREZEb2M7CisgIGlmICghYlJldCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdWludDhfdCogcEJ1ZmZlciA9IEZkZkJ1ZmZlci5HZXRCdWZmZXIoKTsKKyAgRlhfU1RSU0laRSBuQnVmU2l6ZSA9IEZkZkJ1ZmZlci5HZXRMZW5ndGgoKTsKKworICBpZiAoYlVybEVuY29kZWQpIHsKKyAgICBpZiAoIUZERlRvVVJMRW5jb2RlZERhdGEocEJ1ZmZlciwgbkJ1ZlNpemUpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcEVudi0+SlNfZG9jU3VibWl0Rm9ybShwQnVmZmVyLCBuQnVmU2l6ZSwgc0Rlc3RpbmF0aW9uLmNfc3RyKCkpOworCisgIGlmIChiVXJsRW5jb2RlZCAmJiBwQnVmZmVyKSB7CisgICAgRlhfRnJlZShwQnVmZmVyKTsKKyAgICBwQnVmZmVyID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpFeHBvcnRGb3JtVG9GREZUZXh0QnVmKENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZikgeworICBBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgQ0ZERl9Eb2N1bWVudCogcEZERiA9IG1fcEludGVyRm9ybS0+RXhwb3J0VG9GREYobV9wRG9jdW1lbnQtPkdldFBhdGgoKSk7CisgIGlmICghcEZERikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgRlhfQk9PTCBiUmV0ID0gcEZERi0+V3JpdGVCdWYodGV4dEJ1Zik7CisgIGRlbGV0ZSBwRkRGOworCisgIHJldHVybiBiUmV0OworfQorCitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9SZXNldEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICBBU1NFUlQoYWN0aW9uKTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBBY3Rpb25EaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKKyAgaWYgKHBBY3Rpb25EaWN0LT5LZXlFeGlzdCgiRmllbGRzIikpIHsKKyAgICBDUERGX0FjdGlvbkZpZWxkcyBhZiA9IGFjdGlvbi5HZXRXaWRnZXRzKCk7CisgICAgRlhfRFdPUkQgZHdGbGFncyA9IGFjdGlvbi5HZXRGbGFncygpOworCisgICAgQ0ZYX1B0ckFycmF5IGZpZWxkT2JqZWN0czsKKyAgICBhZi5HZXRBbGxGaWVsZHMoZmllbGRPYmplY3RzKTsKKyAgICBDRlhfUHRyQXJyYXkgZmllbGRzOworICAgIEdldEZpZWxkRnJvbU9iamVjdHMoZmllbGRPYmplY3RzLCBmaWVsZHMpOworICAgIHJldHVybiBtX3BJbnRlckZvcm0tPlJlc2V0Rm9ybShmaWVsZHMsICEoZHdGbGFncyAmIDB4MDEpLCBUUlVFKTsKKyAgfQorCisgIHJldHVybiBtX3BJbnRlckZvcm0tPlJlc2V0Rm9ybShUUlVFKTsKK30KKworRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKSB7CisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6R2V0RmllbGRGcm9tT2JqZWN0cyhjb25zdCBDRlhfUHRyQXJyYXkmIG9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSYgZmllbGRzKSB7CisgIEFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgaW50IGlDb3VudCA9IG9iamVjdHMuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgQ1BERl9PYmplY3QqIHBPYmplY3QgPSAoQ1BERl9PYmplY3QqKW9iamVjdHNbaV07CisgICAgaWYgKHBPYmplY3QgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaW50IGlUeXBlID0gcE9iamVjdC0+R2V0VHlwZSgpOworICAgIGlmIChpVHlwZSA9PSBQREZPQkpfU1RSSU5HKSB7CisgICAgICBDRlhfV2lkZVN0cmluZyBjc05hbWUgPSBwT2JqZWN0LT5HZXRVbmljb2RlVGV4dCgpOworICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEludGVyRm9ybS0+R2V0RmllbGQoMCwgY3NOYW1lKTsKKyAgICAgIGlmIChwRmllbGQgIT0gTlVMTCkKKyAgICAgICAgZmllbGRzLkFkZChwRmllbGQpOworICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKKyAgICAgIGlmIChtX3BJbnRlckZvcm0tPklzVmFsaWRGb3JtRmllbGQocE9iamVjdCkpCisgICAgICAgIGZpZWxkcy5BZGQocE9iamVjdCk7CiAgICAgfQotICAgIHJldHVybiAwOworICB9CiB9CiAKLWludAlDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJWYWx1ZUNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKQotewotCUFTU0VSVChwRmllbGQgIT0gTlVMTCk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUERGX0Zvcm1Ob3RpZnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKLQotCVN5bmNocm9uaXplRmllbGQocEZvcm1GaWVsZCwgRkFMU0UpOwotCi0JaW50IG5UeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7Ci0KLQlpZiAoblR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IG5UeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpCi0JewotCQlPbkNhbGN1bGF0ZShwRm9ybUZpZWxkKTsKLQkJRlhfQk9PTCBiRm9ybWF0ZWQgPSBGQUxTRTsKLQkJQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gT25Gb3JtYXQocEZvcm1GaWVsZCwgYkZvcm1hdGVkKTsKLQkJaWYgKGJGb3JtYXRlZCkKLQkJCVJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIHNWYWx1ZS5jX3N0cigpLCBUUlVFKTsKLQkJZWxzZQotCQkJUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgVFJVRSk7Ci0JCVVwZGF0ZUZpZWxkKHBGb3JtRmllbGQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgQ1BERlNES19JbnRlckZvcm06OkJlZm9yZVNlbGVjdGlvbkNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSkKLXsKLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopcEZpZWxkOwotICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfTElTVEJPWCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KK2ludCBDUERGU0RLX0ludGVyRm9ybTo6QmVmb3JlVmFsdWVDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpIHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKKyAgaW50IG5UeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7CisgIGlmIChuVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgblR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkgewogICAgIEZYX0JPT0wgYlJDID0gVFJVRTsKICAgICBPbktleVN0cm9rZUNvbW1pdChwRm9ybUZpZWxkLCBjc1ZhbHVlLCBiUkMpOwotICAgIGlmICghYlJDKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBPblZhbGlkYXRlKHBGb3JtRmllbGQsIGNzVmFsdWUsIGJSQyk7Ci0gICAgaWYgKCFiUkMpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIHJldHVybiAxOwotfQotCi1pbnQgQ1BERlNES19JbnRlckZvcm06OkFmdGVyU2VsZWN0aW9uQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpCi17Ci0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKLSAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgewotICAgICAgICBPbkNhbGN1bGF0ZShwRm9ybUZpZWxkKTsKLSAgICAgICAgUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgVFJVRSk7Ci0gICAgICAgIFVwZGF0ZUZpZWxkKHBGb3JtRmllbGQpOworICAgIGlmIChiUkMpIHsKKyAgICAgIE9uVmFsaWRhdGUocEZvcm1GaWVsZCwgY3NWYWx1ZSwgYlJDKTsKKyAgICAgIHJldHVybiBiUkMgPyAxIDogLTE7CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKIH0KIAotaW50IENQREZTREtfSW50ZXJGb3JtOjpBZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgY29uc3QgQ0ZYX0J5dGVBcnJheSYgc3RhdHVzQXJyYXkpCi17Ci0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKLSAgICBpbnQgblR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKLSAgICBpZiAoblR5cGUgPT0gRklFTERUWVBFX0NIRUNLQk9YIHx8IG5UeXBlID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKLSAgICB7Ci0gICAgICAgIE9uQ2FsY3VsYXRlKHBGb3JtRmllbGQpOwotICAgICAgICBVcGRhdGVGaWVsZChwRm9ybUZpZWxkKTsKK2ludCBDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJWYWx1ZUNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKSB7CisgIEFTU0VSVChwRmllbGQgIT0gTlVMTCk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKKworICBTeW5jaHJvbml6ZUZpZWxkKHBGb3JtRmllbGQsIEZBTFNFKTsKKworICBpbnQgblR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKKworICBpZiAoblR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IG5UeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpIHsKKyAgICBPbkNhbGN1bGF0ZShwRm9ybUZpZWxkKTsKKyAgICBGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOworICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IE9uRm9ybWF0KHBGb3JtRmllbGQsIGJGb3JtYXRlZCk7CisgICAgaWYgKGJGb3JtYXRlZCkKKyAgICAgIFJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIHNWYWx1ZS5jX3N0cigpLCBUUlVFKTsKKyAgICBlbHNlCisgICAgICBSZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBOVUxMLCBUUlVFKTsKKyAgICBVcGRhdGVGaWVsZChwRm9ybUZpZWxkKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCitpbnQgQ1BERlNES19JbnRlckZvcm06OkJlZm9yZVNlbGVjdGlvbkNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpIHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQorICAgIHJldHVybiAwOworCisgIEZYX0JPT0wgYlJDID0gVFJVRTsKKyAgT25LZXlTdHJva2VDb21taXQocEZvcm1GaWVsZCwgY3NWYWx1ZSwgYlJDKTsKKyAgaWYgKCFiUkMpCisgICAgcmV0dXJuIC0xOworCisgIE9uVmFsaWRhdGUocEZvcm1GaWVsZCwgY3NWYWx1ZSwgYlJDKTsKKyAgaWYgKCFiUkMpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAxOworfQorCitpbnQgQ1BERlNES19JbnRlckZvcm06OkFmdGVyU2VsZWN0aW9uQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpIHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9MSVNUQk9YKSB7CisgICAgT25DYWxjdWxhdGUocEZvcm1GaWVsZCk7CisgICAgUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgVFJVRSk7CisgICAgVXBkYXRlRmllbGQocEZvcm1GaWVsZCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJDaGVja2VkU3RhdHVzQ2hhbmdlKAorICAgIGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgY29uc3QgQ0ZYX0J5dGVBcnJheSYgc3RhdHVzQXJyYXkpIHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKKyAgaW50IG5UeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7CisgIGlmIChuVHlwZSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1ggfHwgblR5cGUgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSB7CisgICAgT25DYWxjdWxhdGUocEZvcm1GaWVsZCk7CisgICAgVXBkYXRlRmllbGQocEZvcm1GaWVsZCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBDUERGU0RLX0ludGVyRm9ybTo6QmVmb3JlRm9ybVJlc2V0KGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkgeworICByZXR1cm4gMDsKK30KKworaW50IENQREZTREtfSW50ZXJGb3JtOjpBZnRlckZvcm1SZXNldChjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pIHsKKyAgT25DYWxjdWxhdGUobnVsbHB0cik7CisgIHJldHVybiAwOworfQorCitpbnQgQ1BERlNES19JbnRlckZvcm06OkJlZm9yZUZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkgeworICByZXR1cm4gMDsKK30KKworaW50IENQREZTREtfSW50ZXJGb3JtOjpBZnRlckZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkgeworICBPbkNhbGN1bGF0ZShudWxscHRyKTsKKyAgcmV0dXJuIDA7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OklzTmVlZEhpZ2hMaWdodChpbnQgbkZpZWxkVHlwZSkgeworICBpZiAobkZpZWxkVHlwZSA8IDEgfHwgbkZpZWxkVHlwZSA+IDcpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gbV9iTmVlZEhpZ2h0bGlnaHRbbkZpZWxkVHlwZSAtIDFdOworfQorCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpSZW1vdmVBbGxIaWdoTGlnaHQoKSB7CisgIG1lbXNldCgodm9pZCopbV9iTmVlZEhpZ2h0bGlnaHQsIDAsIDcgKiBzaXplb2YoRlhfQk9PTCkpOworfQordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6U2V0SGlnaGxpZ2h0Q29sb3IoRlhfQ09MT1JSRUYgY2xyLCBpbnQgbkZpZWxkVHlwZSkgeworICBpZiAobkZpZWxkVHlwZSA8IDAgfHwgbkZpZWxkVHlwZSA+IDcpCisgICAgcmV0dXJuOworICBzd2l0Y2ggKG5GaWVsZFR5cGUpIHsKKyAgICBjYXNlIDA6IHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgICAgICAgIG1fYUhpZ2hsaWdodENvbG9yW2ldID0gY2xyOworICAgICAgICBtX2JOZWVkSGlnaHRsaWdodFtpXSA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKICAgICB9Ci0gICAgcmV0dXJuIDA7CisgICAgZGVmYXVsdDogeworICAgICAgbV9hSGlnaGxpZ2h0Q29sb3JbbkZpZWxkVHlwZSAtIDFdID0gY2xyOworICAgICAgbV9iTmVlZEhpZ2h0bGlnaHRbbkZpZWxkVHlwZSAtIDFdID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQogfQogCi1pbnQgQ1BERlNES19JbnRlckZvcm06OkJlZm9yZUZvcm1SZXNldChjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJGb3JtUmVzZXQoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKQotewotICAgIE9uQ2FsY3VsYXRlKG51bGxwdHIpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgQ1BERlNES19JbnRlckZvcm06OkJlZm9yZUZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IENQREZTREtfSW50ZXJGb3JtOjpBZnRlckZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkKLXsKLSAgICBPbkNhbGN1bGF0ZShudWxscHRyKTsKLSAgICByZXR1cm4gMDsKLX0KLQotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6SXNOZWVkSGlnaExpZ2h0KGludCBuRmllbGRUeXBlKQotewotCWlmKG5GaWVsZFR5cGUgPDEgfHwgbkZpZWxkVHlwZSA+IDcpCi0JCXJldHVybiBGQUxTRTsKLQlyZXR1cm4gbV9iTmVlZEhpZ2h0bGlnaHRbbkZpZWxkVHlwZS0xXTsKLX0KLQotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVtb3ZlQWxsSGlnaExpZ2h0KCkKLXsKLQltZW1zZXQoKHZvaWQqKW1fYk5lZWRIaWdodGxpZ2h0LCAwLCA3KnNpemVvZihGWF9CT09MKSk7Ci19Ci12b2lkICAgQ1BERlNES19JbnRlckZvcm06OlNldEhpZ2hsaWdodENvbG9yKEZYX0NPTE9SUkVGIGNsciwgaW50IG5GaWVsZFR5cGUpCi17Ci0JaWYobkZpZWxkVHlwZSA8MCB8fCBuRmllbGRUeXBlID4gNykgcmV0dXJuOwotCXN3aXRjaChuRmllbGRUeXBlKQotCXsKLQljYXNlIDA6Ci0JCXsKLQkJCWZvcihpbnQgaT0wOyBpPDc7IGkrKykKLQkJCXsKLQkJCQltX2FIaWdobGlnaHRDb2xvcltpXSA9IGNscjsKLQkJCQltX2JOZWVkSGlnaHRsaWdodFtpXSA9IFRSVUU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWRlZmF1bHQ6Ci0JCXsKLQkJCW1fYUhpZ2hsaWdodENvbG9yW25GaWVsZFR5cGUtMV0gPSBjbHI7Ci0JCQltX2JOZWVkSGlnaHRsaWdodFtuRmllbGRUeXBlLTFdID0gVFJVRTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi19Ci0KLUZYX0NPTE9SUkVGIENQREZTREtfSW50ZXJGb3JtOjpHZXRIaWdobGlnaHRDb2xvcihpbnQgbkZpZWxkVHlwZSkKLXsKLQlpZiAobkZpZWxkVHlwZSA8IDAgfHwgbkZpZWxkVHlwZSA+IDcpCi0gICAgICAgIHJldHVybiBGWFNZU19SR0IoMjU1LDI1NSwyNTUpOwotCWlmIChuRmllbGRUeXBlID09IDApCi0JCXJldHVybiBtX2FIaWdobGlnaHRDb2xvclswXTsKLSAgICByZXR1cm4gbV9hSGlnaGxpZ2h0Q29sb3JbbkZpZWxkVHlwZS0xXTsKK0ZYX0NPTE9SUkVGIENQREZTREtfSW50ZXJGb3JtOjpHZXRIaWdobGlnaHRDb2xvcihpbnQgbkZpZWxkVHlwZSkgeworICBpZiAobkZpZWxkVHlwZSA8IDAgfHwgbkZpZWxkVHlwZSA+IDcpCisgICAgcmV0dXJuIEZYU1lTX1JHQigyNTUsIDI1NSwgMjU1KTsKKyAgaWYgKG5GaWVsZFR5cGUgPT0gMCkKKyAgICByZXR1cm4gbV9hSGlnaGxpZ2h0Q29sb3JbMF07CisgIHJldHVybiBtX2FIaWdobGlnaHRDb2xvcltuRmllbGRUeXBlIC0gMV07CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0JBX0Fubm90SXRlcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DQkFfQW5ub3RJdGVyYXRvcjo6Q0JBX0Fubm90SXRlcmF0b3IoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1R5cGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzU3ViVHlwZSkKLSAgICA6bV9wUGFnZVZpZXcocFBhZ2VWaWV3KSwKLSAgICBtX3NUeXBlKHNUeXBlKSwKLSAgICBtX3NTdWJUeXBlKHNTdWJUeXBlKSwKLSAgICBtX25UYWJzKEJBSV9TVFJVQ1RVUkUpCi17Ci0gICAgQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOworQ0JBX0Fubm90SXRlcmF0b3I6OkNCQV9Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNTdWJUeXBlKQorICAgIDogbV9wUGFnZVZpZXcocFBhZ2VWaWV3KSwKKyAgICAgIG1fc1R5cGUoc1R5cGUpLAorICAgICAgbV9zU3ViVHlwZShzU3ViVHlwZSksCisgICAgICBtX25UYWJzKEJBSV9TVFJVQ1RVUkUpIHsKKyAgQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOwogCi0gICAgQ1BERl9QYWdlKiBwUERGUGFnZSA9IG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCk7Ci0gICAgQVNTRVJUKHBQREZQYWdlICE9IE5VTEwpOwotICAgIEFTU0VSVChwUERGUGFnZS0+bV9wRm9ybURpY3QgIT0gTlVMTCk7CisgIENQREZfUGFnZSogcFBERlBhZ2UgPSBtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpOworICBBU1NFUlQocFBERlBhZ2UgIT0gTlVMTCk7CisgIEFTU0VSVChwUERGUGFnZS0+bV9wRm9ybURpY3QgIT0gTlVMTCk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBzVGFicyA9IHBQREZQYWdlLT5tX3BGb3JtRGljdC0+R2V0U3RyaW5nKCJUYWJzIik7CisgIENGWF9CeXRlU3RyaW5nIHNUYWJzID0gcFBERlBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRTdHJpbmcoIlRhYnMiKTsKIAotICAgIGlmIChzVGFicyA9PSAiUiIpCi0gICAgewotICAgICAgICBtX25UYWJzID0gQkFJX1JPVzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc1RhYnMgPT0gIkMiKQotICAgIHsKLSAgICAgICAgbV9uVGFicyA9IEJBSV9DT0xVTU47Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1fblRhYnMgPSBCQUlfU1RSVUNUVVJFOwotICAgIH0KKyAgaWYgKHNUYWJzID09ICJSIikgeworICAgIG1fblRhYnMgPSBCQUlfUk9XOworICB9IGVsc2UgaWYgKHNUYWJzID09ICJDIikgeworICAgIG1fblRhYnMgPSBCQUlfQ09MVU1OOworICB9IGVsc2UgeworICAgIG1fblRhYnMgPSBCQUlfU1RSVUNUVVJFOworICB9CiAKLSAgICBHZW5lcmF0ZVJlc3VsdHMoKTsKKyAgR2VuZXJhdGVSZXN1bHRzKCk7CiB9CiAKLUNCQV9Bbm5vdEl0ZXJhdG9yOjp+Q0JBX0Fubm90SXRlcmF0b3IoKQotewotICAgIG1fQW5ub3RzLlJlbW92ZUFsbCgpOworQ0JBX0Fubm90SXRlcmF0b3I6On5DQkFfQW5ub3RJdGVyYXRvcigpIHsKKyAgbV9Bbm5vdHMuUmVtb3ZlQWxsKCk7CiB9CiAKLUNQREZTREtfQW5ub3QqIENCQV9Bbm5vdEl0ZXJhdG9yOjpHZXRGaXJzdEFubm90KCkKLXsKLSAgICBpZiAobV9Bbm5vdHMuR2V0U2l6ZSgpID4gMCkKLSAgICAgICAgcmV0dXJuIG1fQW5ub3RzWzBdOworQ1BERlNES19Bbm5vdCogQ0JBX0Fubm90SXRlcmF0b3I6OkdldEZpcnN0QW5ub3QoKSB7CisgIGlmIChtX0Fubm90cy5HZXRTaXplKCkgPiAwKQorICAgIHJldHVybiBtX0Fubm90c1swXTsKIAotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gTlVMTDsKIH0KIAotQ1BERlNES19Bbm5vdCogQ0JBX0Fubm90SXRlcmF0b3I6OkdldExhc3RBbm5vdCgpCi17Ci0gICAgaWYgKG1fQW5ub3RzLkdldFNpemUoKSA+IDApCi0gICAgICAgIHJldHVybiBtX0Fubm90c1ttX0Fubm90cy5HZXRTaXplKCkgLSAxXTsKK0NQREZTREtfQW5ub3QqIENCQV9Bbm5vdEl0ZXJhdG9yOjpHZXRMYXN0QW5ub3QoKSB7CisgIGlmIChtX0Fubm90cy5HZXRTaXplKCkgPiAwKQorICAgIHJldHVybiBtX0Fubm90c1ttX0Fubm90cy5HZXRTaXplKCkgLSAxXTsKIAotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gTlVMTDsKIH0KIAotQ1BERlNES19Bbm5vdCogQ0JBX0Fubm90SXRlcmF0b3I6OkdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9Bbm5vdHMuR2V0U2l6ZSgpOyBpIDwgc3o7ICsraSkgewotICAgICAgICBpZiAobV9Bbm5vdHNbaV0gPT0gcEFubm90KQotICAgICAgICAgICAgcmV0dXJuIChpICsgMSA8IHN6KSA/IG1fQW5ub3RzW2krMV0gOiBtX0Fubm90c1swXTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CitDUERGU0RLX0Fubm90KiBDQkFfQW5ub3RJdGVyYXRvcjo6R2V0TmV4dEFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBmb3IgKGludCBpID0gMCwgc3ogPSBtX0Fubm90cy5HZXRTaXplKCk7IGkgPCBzejsgKytpKSB7CisgICAgaWYgKG1fQW5ub3RzW2ldID09IHBBbm5vdCkKKyAgICAgIHJldHVybiAoaSArIDEgPCBzeikgPyBtX0Fubm90c1tpICsgMV0gOiBtX0Fubm90c1swXTsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KIAotQ1BERlNES19Bbm5vdCogQ0JBX0Fubm90SXRlcmF0b3I6OkdldFByZXZBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9Bbm5vdHMuR2V0U2l6ZSgpOyBpIDwgc3o7ICsraSkgewotICAgICAgICBpZiAobV9Bbm5vdHNbaV0gPT0gcEFubm90KQotICAgICAgICAgICAgcmV0dXJuIChpIC0gMSA+PSAwKSA/IG1fQW5ub3RzW2ktMV0gOiBtX0Fubm90c1tzei0xXTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CitDUERGU0RLX0Fubm90KiBDQkFfQW5ub3RJdGVyYXRvcjo6R2V0UHJldkFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBmb3IgKGludCBpID0gMCwgc3ogPSBtX0Fubm90cy5HZXRTaXplKCk7IGkgPCBzejsgKytpKSB7CisgICAgaWYgKG1fQW5ub3RzW2ldID09IHBBbm5vdCkKKyAgICAgIHJldHVybiAoaSAtIDEgPj0gMCkgPyBtX0Fubm90c1tpIC0gMV0gOiBtX0Fubm90c1tzeiAtIDFdOworICB9CisgIHJldHVybiBOVUxMOwogfQogCi1pbnQgQ0JBX0Fubm90SXRlcmF0b3I6OkNvbXBhcmVCeUxlZnQoQ1BERlNES19Bbm5vdCogcDEsIENQREZTREtfQW5ub3QqIHAyKQotewotICAgIEFTU0VSVChwMSk7Ci0gICAgQVNTRVJUKHAyKTsKK2ludCBDQkFfQW5ub3RJdGVyYXRvcjo6Q29tcGFyZUJ5TGVmdChDUERGU0RLX0Fubm90KiBwMSwgQ1BERlNES19Bbm5vdCogcDIpIHsKKyAgQVNTRVJUKHAxKTsKKyAgQVNTRVJUKHAyKTsKIAotICAgIENQREZfUmVjdCByY0Fubm90MSA9IEdldEFubm90UmVjdChwMSk7Ci0gICAgQ1BERl9SZWN0IHJjQW5ub3QyID0gR2V0QW5ub3RSZWN0KHAyKTsKKyAgQ1BERl9SZWN0IHJjQW5ub3QxID0gR2V0QW5ub3RSZWN0KHAxKTsKKyAgQ1BERl9SZWN0IHJjQW5ub3QyID0gR2V0QW5ub3RSZWN0KHAyKTsKIAotICAgIGlmIChyY0Fubm90MS5sZWZ0IDwgcmNBbm5vdDIubGVmdCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChyY0Fubm90MS5sZWZ0ID4gcmNBbm5vdDIubGVmdCkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgcmV0dXJuIDA7CisgIGlmIChyY0Fubm90MS5sZWZ0IDwgcmNBbm5vdDIubGVmdCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChyY0Fubm90MS5sZWZ0ID4gcmNBbm5vdDIubGVmdCkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7CiB9CiAKK2ludCBDQkFfQW5ub3RJdGVyYXRvcjo6Q29tcGFyZUJ5VG9wKENQREZTREtfQW5ub3QqIHAxLCBDUERGU0RLX0Fubm90KiBwMikgeworICBBU1NFUlQocDEgIT0gTlVMTCk7CisgIEFTU0VSVChwMiAhPSBOVUxMKTsKIAotaW50IENCQV9Bbm5vdEl0ZXJhdG9yOjpDb21wYXJlQnlUb3AoQ1BERlNES19Bbm5vdCogcDEsIENQREZTREtfQW5ub3QqIHAyKQotewotICAgIEFTU0VSVChwMSAhPSBOVUxMKTsKLSAgICBBU1NFUlQocDIgIT0gTlVMTCk7CisgIENQREZfUmVjdCByY0Fubm90MSA9IEdldEFubm90UmVjdChwMSk7CisgIENQREZfUmVjdCByY0Fubm90MiA9IEdldEFubm90UmVjdChwMik7CiAKLSAgICBDUERGX1JlY3QgcmNBbm5vdDEgPSBHZXRBbm5vdFJlY3QocDEpOwotICAgIENQREZfUmVjdCByY0Fubm90MiA9IEdldEFubm90UmVjdChwMik7Ci0KLSAgICBpZiAocmNBbm5vdDEudG9wIDwgcmNBbm5vdDIudG9wKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKHJjQW5ub3QxLnRvcCA+IHJjQW5ub3QyLnRvcCkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgcmV0dXJuIDA7CisgIGlmIChyY0Fubm90MS50b3AgPCByY0Fubm90Mi50b3ApCisgICAgcmV0dXJuIC0xOworICBpZiAocmNBbm5vdDEudG9wID4gcmNBbm5vdDIudG9wKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKIH0KIAotdm9pZCBDQkFfQW5ub3RJdGVyYXRvcjo6R2VuZXJhdGVSZXN1bHRzKCkKLXsKLSAgICBBU1NFUlQobV9wUGFnZVZpZXcgIT0gTlVMTCk7Cit2b2lkIENCQV9Bbm5vdEl0ZXJhdG9yOjpHZW5lcmF0ZVJlc3VsdHMoKSB7CisgIEFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKIAotICAgIHN3aXRjaCAobV9uVGFicykKLSAgICB7Ci0gICAgY2FzZSBCQUlfU1RSVUNUVVJFOgotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTAsc3o9bV9wUGFnZVZpZXctPkNvdW50QW5ub3RzKCk7IGk8c3o7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBtX3BQYWdlVmlldy0+R2V0QW5ub3QoaSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgc3dpdGNoIChtX25UYWJzKSB7CisgICAgY2FzZSBCQUlfU1RSVUNUVVJFOiB7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBtX3BQYWdlVmlldy0+Q291bnRBbm5vdHMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gbV9wUGFnZVZpZXctPkdldEFubm90KGkpOworICAgICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCi0gICAgICAgICAgICAgICAgaWYgKHBBbm5vdC0+R2V0VHlwZSgpID09IG1fc1R5cGUKLSAgICAgICAgICAgICAgICAgICAgJiYgcEFubm90LT5HZXRTdWJUeXBlKCkgPT0gbV9zU3ViVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgbV9Bbm5vdHMuQWRkKHBBbm5vdCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChwQW5ub3QtPkdldFR5cGUoKSA9PSBtX3NUeXBlICYmIHBBbm5vdC0+R2V0U3ViVHlwZSgpID09IG1fc1N1YlR5cGUpCisgICAgICAgICAgbV9Bbm5vdHMuQWRkKHBBbm5vdCk7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIEJBSV9ST1c6IHsKKyAgICAgIENQREZTREtfU29ydEFubm90cyBzYTsKKworICAgICAgeworICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBtX3BQYWdlVmlldy0+Q291bnRBbm5vdHMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBtX3BQYWdlVmlldy0+R2V0QW5ub3QoaSk7CisgICAgICAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKworICAgICAgICAgIGlmIChwQW5ub3QtPkdldFR5cGUoKSA9PSBtX3NUeXBlICYmCisgICAgICAgICAgICAgIHBBbm5vdC0+R2V0U3ViVHlwZSgpID09IG1fc1N1YlR5cGUpCisgICAgICAgICAgICBzYS5BZGQocEFubm90KTsKICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEJBSV9ST1c6CisgICAgICB9CisKKyAgICAgIGlmIChzYS5HZXRTaXplKCkgPiAwKSB7CisgICAgICAgIHNhLlNvcnQoQ0JBX0Fubm90SXRlcmF0b3I6OkNvbXBhcmVCeUxlZnQpOworICAgICAgfQorCisgICAgICB3aGlsZSAoc2EuR2V0U2l6ZSgpID4gMCkgeworICAgICAgICBpbnQgbkxlZnRUb3BJbmRleCA9IC0xOworCiAgICAgICAgIHsKLSAgICAgICAgICAgIENQREZTREtfU29ydEFubm90cyBzYTsKKyAgICAgICAgICBGWF9GTE9BVCBmVG9wID0gMC4wZjsKIAotICAgICAgICAgICAgeworICAgICAgICAgIGZvciAoaW50IGkgPSBzYS5HZXRTaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gc2EuR2V0QXQoaSk7CisgICAgICAgICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wLHN6PW1fcFBhZ2VWaWV3LT5Db3VudEFubm90cygpOyBpPHN6OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBtX3BQYWdlVmlldy0+R2V0QW5ub3QoaSk7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisgICAgICAgICAgICBDUERGX1JlY3QgcmNBbm5vdCA9IEdldEFubm90UmVjdChwQW5ub3QpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQW5ub3QtPkdldFR5cGUoKSA9PSBtX3NUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSBtX3NTdWJUeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgc2EuQWRkKHBBbm5vdCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJjQW5ub3QudG9wID4gZlRvcCkgeworICAgICAgICAgICAgICBuTGVmdFRvcEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgZlRvcCA9IHJjQW5ub3QudG9wOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2EuR2V0U2l6ZSgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYS5Tb3J0KENCQV9Bbm5vdEl0ZXJhdG9yOjpDb21wYXJlQnlMZWZ0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKHNhLkdldFNpemUoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IG5MZWZ0VG9wSW5kZXggPSAtMTsKLQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvcCA9IDAuMGY7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT1zYS5HZXRTaXplKCktMTsgaT49MDsgaS0tKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBzYS5HZXRBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCByY0Fubm90ID0gR2V0QW5ub3RSZWN0KHBBbm5vdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyY0Fubm90LnRvcCA+IGZUb3ApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbkxlZnRUb3BJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZlRvcCA9IHJjQW5ub3QudG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5MZWZ0VG9wSW5kZXggPj0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBMZWZ0VG9wQW5ub3QgPSBzYS5HZXRBdChuTGVmdFRvcEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHBMZWZ0VG9wQW5ub3QgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjTGVmdFRvcCA9IEdldEFubm90UmVjdChwTGVmdFRvcEFubm90KTsKLQotICAgICAgICAgICAgICAgICAgICBtX0Fubm90cy5BZGQocExlZnRUb3BBbm5vdCk7Ci0gICAgICAgICAgICAgICAgICAgIHNhLlJlbW92ZUF0KG5MZWZ0VG9wSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPGludD4gYVNlbGVjdDsKLQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTAsc3o9c2EuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gc2EuR2V0QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCByY0Fubm90ID0gR2V0QW5ub3RSZWN0KHBBbm5vdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ2VudGVyWSA9IChyY0Fubm90LnRvcCArIHJjQW5ub3QuYm90dG9tKSAvIDIuMGY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkNlbnRlclkgPiByY0xlZnRUb3AuYm90dG9tICYmIGZDZW50ZXJZIDwgcmNMZWZ0VG9wLnRvcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVNlbGVjdC5BZGQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTAsc3o9YVNlbGVjdC5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Fubm90cy5BZGQoc2FbYVNlbGVjdFtpXV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT1hU2VsZWN0LkdldFNpemUoKS0xOyBpPj0wOyBpLS0pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2EuUmVtb3ZlQXQoYVNlbGVjdFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBhU2VsZWN0LlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhLlJlbW92ZUFsbCgpOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEJBSV9DT0xVTU46CisKKyAgICAgICAgaWYgKG5MZWZ0VG9wSW5kZXggPj0gMCkgeworICAgICAgICAgIENQREZTREtfQW5ub3QqIHBMZWZ0VG9wQW5ub3QgPSBzYS5HZXRBdChuTGVmdFRvcEluZGV4KTsKKyAgICAgICAgICBBU1NFUlQocExlZnRUb3BBbm5vdCAhPSBOVUxMKTsKKworICAgICAgICAgIENQREZfUmVjdCByY0xlZnRUb3AgPSBHZXRBbm5vdFJlY3QocExlZnRUb3BBbm5vdCk7CisKKyAgICAgICAgICBtX0Fubm90cy5BZGQocExlZnRUb3BBbm5vdCk7CisgICAgICAgICAgc2EuUmVtb3ZlQXQobkxlZnRUb3BJbmRleCk7CisKKyAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQ+IGFTZWxlY3Q7CisKKyAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBzYS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHNhLkdldEF0KGkpOworICAgICAgICAgICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOworCisgICAgICAgICAgICAgIENQREZfUmVjdCByY0Fubm90ID0gR2V0QW5ub3RSZWN0KHBBbm5vdCk7CisKKyAgICAgICAgICAgICAgRlhfRkxPQVQgZkNlbnRlclkgPSAocmNBbm5vdC50b3AgKyByY0Fubm90LmJvdHRvbSkgLyAyLjBmOworCisgICAgICAgICAgICAgIGlmIChmQ2VudGVyWSA+IHJjTGVmdFRvcC5ib3R0b20gJiYgZkNlbnRlclkgPCByY0xlZnRUb3AudG9wKQorICAgICAgICAgICAgICAgIGFTZWxlY3QuQWRkKGkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IGFTZWxlY3QuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgICAgICAgICAgICBtX0Fubm90cy5BZGQoc2FbYVNlbGVjdFtpXV0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBhU2VsZWN0LkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgIHNhLlJlbW92ZUF0KGFTZWxlY3RbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGFTZWxlY3QuUmVtb3ZlQWxsKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNhLlJlbW92ZUFsbCgpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBCQUlfQ09MVU1OOiB7CisgICAgICBDUERGU0RLX1NvcnRBbm5vdHMgc2E7CisKKyAgICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9wUGFnZVZpZXctPkNvdW50QW5ub3RzKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gbV9wUGFnZVZpZXctPkdldEFubm90KGkpOworICAgICAgICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisKKyAgICAgICAgICBpZiAocEFubm90LT5HZXRUeXBlKCkgPT0gbV9zVHlwZSAmJgorICAgICAgICAgICAgICBwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSBtX3NTdWJUeXBlKQorICAgICAgICAgICAgc2EuQWRkKHBBbm5vdCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHNhLkdldFNpemUoKSA+IDApIHsKKyAgICAgICAgc2EuU29ydChDQkFfQW5ub3RJdGVyYXRvcjo6Q29tcGFyZUJ5VG9wLCBGQUxTRSk7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChzYS5HZXRTaXplKCkgPiAwKSB7CisgICAgICAgIGludCBuTGVmdFRvcEluZGV4ID0gLTE7CisKICAgICAgICAgewotICAgICAgICAgICAgQ1BERlNES19Tb3J0QW5ub3RzIHNhOworICAgICAgICAgIEZYX0ZMT0FUIGZMZWZ0ID0gLTEuMGY7CiAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTAsc3o9bV9wUGFnZVZpZXctPkNvdW50QW5ub3RzKCk7IGk8c3o7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IG1fcFBhZ2VWaWV3LT5HZXRBbm5vdChpKTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gc2EuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHNhLkdldEF0KGkpOworICAgICAgICAgICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAocEFubm90LT5HZXRUeXBlKCkgPT0gbV9zVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEFubm90LT5HZXRTdWJUeXBlKCkgPT0gbV9zU3ViVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhLkFkZChwQW5ub3QpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENQREZfUmVjdCByY0Fubm90ID0gR2V0QW5ub3RSZWN0KHBBbm5vdCk7CisKKyAgICAgICAgICAgIGlmIChmTGVmdCA8IDApIHsKKyAgICAgICAgICAgICAgbkxlZnRUb3BJbmRleCA9IDA7CisgICAgICAgICAgICAgIGZMZWZ0ID0gcmNBbm5vdC5sZWZ0OworICAgICAgICAgICAgfSBlbHNlIGlmIChyY0Fubm90LmxlZnQgPCBmTGVmdCkgeworICAgICAgICAgICAgICBuTGVmdFRvcEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgZkxlZnQgPSByY0Fubm90LmxlZnQ7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzYS5HZXRTaXplKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNhLlNvcnQoQ0JBX0Fubm90SXRlcmF0b3I6OkNvbXBhcmVCeVRvcCwgRkFMU0UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoc2EuR2V0U2l6ZSgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbkxlZnRUb3BJbmRleCA9IC0xOwotCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGVmdCA9IC0xLjBmOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9c2EuR2V0U2l6ZSgpLTE7IGk+PTA7IGktLSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gc2EuR2V0QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNBbm5vdCA9IEdldEFubm90UmVjdChwQW5ub3QpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkxlZnQgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5MZWZ0VG9wSW5kZXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZMZWZ0ID0gcmNBbm5vdC5sZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmNBbm5vdC5sZWZ0IDwgZkxlZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbkxlZnRUb3BJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZkxlZnQgPSByY0Fubm90LmxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobkxlZnRUb3BJbmRleCA+PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcExlZnRUb3BBbm5vdCA9IHNhLkdldEF0KG5MZWZ0VG9wSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBBU1NFUlQocExlZnRUb3BBbm5vdCAhPSBOVUxMKTsKLQotICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNMZWZ0VG9wID0gR2V0QW5ub3RSZWN0KHBMZWZ0VG9wQW5ub3QpOwotCi0gICAgICAgICAgICAgICAgICAgIG1fQW5ub3RzLkFkZChwTGVmdFRvcEFubm90KTsKLSAgICAgICAgICAgICAgICAgICAgc2EuUmVtb3ZlQXQobkxlZnRUb3BJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50PiBhU2VsZWN0OwotCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MCxzej1zYS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBzYS5HZXRBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBHZXRBbm5vdFJlY3QocEFubm90KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDZW50ZXJYID0gKHJjQW5ub3QubGVmdCArIHJjQW5ub3QucmlnaHQpIC8gMi4wZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmQ2VudGVyWCA+IHJjTGVmdFRvcC5sZWZ0ICYmIGZDZW50ZXJYIDwgcmNMZWZ0VG9wLnJpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU2VsZWN0LkFkZChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MCxzej1hU2VsZWN0LkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQW5ub3RzLkFkZChzYVthU2VsZWN0W2ldXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPWFTZWxlY3QuR2V0U2l6ZSgpLTE7IGk+PTA7IGktLSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYS5SZW1vdmVBdChhU2VsZWN0W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFTZWxlY3QuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2EuUmVtb3ZlQWxsKCk7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKworICAgICAgICBpZiAobkxlZnRUb3BJbmRleCA+PSAwKSB7CisgICAgICAgICAgQ1BERlNES19Bbm5vdCogcExlZnRUb3BBbm5vdCA9IHNhLkdldEF0KG5MZWZ0VG9wSW5kZXgpOworICAgICAgICAgIEFTU0VSVChwTGVmdFRvcEFubm90ICE9IE5VTEwpOworCisgICAgICAgICAgQ1BERl9SZWN0IHJjTGVmdFRvcCA9IEdldEFubm90UmVjdChwTGVmdFRvcEFubm90KTsKKworICAgICAgICAgIG1fQW5ub3RzLkFkZChwTGVmdFRvcEFubm90KTsKKyAgICAgICAgICBzYS5SZW1vdmVBdChuTGVmdFRvcEluZGV4KTsKKworICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPGludD4gYVNlbGVjdDsKKworICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHNhLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gc2EuR2V0QXQoaSk7CisgICAgICAgICAgICAgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisKKyAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBHZXRBbm5vdFJlY3QocEFubm90KTsKKworICAgICAgICAgICAgICBGWF9GTE9BVCBmQ2VudGVyWCA9IChyY0Fubm90LmxlZnQgKyByY0Fubm90LnJpZ2h0KSAvIDIuMGY7CisKKyAgICAgICAgICAgICAgaWYgKGZDZW50ZXJYID4gcmNMZWZ0VG9wLmxlZnQgJiYgZkNlbnRlclggPCByY0xlZnRUb3AucmlnaHQpCisgICAgICAgICAgICAgICAgYVNlbGVjdC5BZGQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gYVNlbGVjdC5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgICAgICAgIG1fQW5ub3RzLkFkZChzYVthU2VsZWN0W2ldXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGFTZWxlY3QuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgc2EuUmVtb3ZlQXQoYVNlbGVjdFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgYVNlbGVjdC5SZW1vdmVBbGwoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc2EuUmVtb3ZlQWxsKCk7CisgICAgfSBicmVhazsKKyAgfQogfQogCi1DUERGX1JlY3QgQ0JBX0Fubm90SXRlcmF0b3I6OkdldEFubm90UmVjdChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKK0NQREZfUmVjdCBDQkFfQW5ub3RJdGVyYXRvcjo6R2V0QW5ub3RSZWN0KENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCi0gICAgQ1BERl9Bbm5vdCogcFBERkFubm90ID0gcEFubm90LT5HZXRQREZBbm5vdCgpOwotICAgIEFTU0VSVChwUERGQW5ub3QgIT0gTlVMTCk7CisgIENQREZfQW5ub3QqIHBQREZBbm5vdCA9IHBBbm5vdC0+R2V0UERGQW5ub3QoKTsKKyAgQVNTRVJUKHBQREZBbm5vdCAhPSBOVUxMKTsKIAotICAgIENQREZfUmVjdCByY0Fubm90OwotICAgIHBQREZBbm5vdC0+R2V0UmVjdChyY0Fubm90KTsKKyAgQ1BERl9SZWN0IHJjQW5ub3Q7CisgIHBQREZBbm5vdC0+R2V0UmVjdChyY0Fubm90KTsKIAotICAgIHJldHVybiByY0Fubm90OworICByZXR1cm4gcmNBbm5vdDsKIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnNka19tZ3IuY3BwIGIvZnBkZnNkay9zcmMvZnNka19tZ3IuY3BwCmluZGV4IDYxOTBlZmYuLmQ0NzFkYzEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfbWdyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mc2RrX21nci5jcHAKQEAgLTIwLDEyNjcgKzIwLDEyMDIgQEAKICNpbmNsdWRlIDxjdGltZT4KICNlbmRpZgogCi0vL2V4dGVybiBDUERGRG9jX0Vudmlyb25tZW50KiBnX3BGb3JtRmlsbEFwcDsKLWNsYXNzIENGWF9TeXN0ZW1IYW5kbGVyOnB1YmxpYyBJRlhfU3lzdGVtSGFuZGxlcgotewotcHVibGljOgotICAgIENGWF9TeXN0ZW1IYW5kbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpOm1fcEVudihwRW52KSxtX25DaGFyU2V0KC0xKSB7fQotcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdChGWF9IV05EIGhXbmQsIEZYX1JFQ1QgcmVjdCkgOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBPdXRwdXRTZWxlY3RlZFJlY3Qodm9pZCogcEZvcm1GaWxsZXIsIENQREZfUmVjdCYgcmVjdCk7CisvLyBleHRlcm4gQ1BERkRvY19FbnZpcm9ubWVudCogZ19wRm9ybUZpbGxBcHA7CitjbGFzcyBDRlhfU3lzdGVtSGFuZGxlciA6IHB1YmxpYyBJRlhfU3lzdGVtSGFuZGxlciB7CisgcHVibGljOgorICBDRlhfU3lzdGVtSGFuZGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KSA6IG1fcEVudihwRW52KSwgbV9uQ2hhclNldCgtMSkge30KIAotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICBJc1NlbGVjdGlvbkltcGxlbWVudGVkKCk7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgSW52YWxpZGF0ZVJlY3QoRlhfSFdORCBoV25kLCBGWF9SRUNUIHJlY3QpOworICB2aXJ0dWFsIHZvaWQgT3V0cHV0U2VsZWN0ZWRSZWN0KHZvaWQqIHBGb3JtRmlsbGVyLCBDUERGX1JlY3QmIHJlY3QpOwogCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyAgICAgIEdldENsaXBib2FyZFRleHQoRlhfSFdORCBoV25kKXtyZXR1cm4gTCIiO30KLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgU2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQsIENGWF9XaWRlU3RyaW5nIHN0cmluZykge3JldHVybiBGQUxTRTt9CisgIHZpcnR1YWwgRlhfQk9PTCBJc1NlbGVjdGlvbkltcGxlbWVudGVkKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgQ2xpZW50VG9TY3JlZW4oRlhfSFdORCBoV25kLCBpbnQzMl90JiB4LCBpbnQzMl90JiB5KSB7fQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBTY3JlZW5Ub0NsaWVudChGWF9IV05EIGhXbmQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpIHt9CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQpIHsgcmV0dXJuIEwiIjsgfQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQsIENGWF9XaWRlU3RyaW5nIHN0cmluZykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0gICAgLypjdXJzb3Igc3R5bGUKLSAgICBGWENUX0FSUk9XCi0gICAgRlhDVF9ORVNXCi0gICAgRlhDVF9OV1NFCi0gICAgRlhDVF9WQkVBTQotICAgIEZYQ1RfSEJFQU0KLSAgICBGWENUX0hBTkQKLSAgICAqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBTZXRDdXJzb3IoaW50MzJfdCBuQ3Vyc29yVHlwZSk7CisgIHZpcnR1YWwgdm9pZCBDbGllbnRUb1NjcmVlbihGWF9IV05EIGhXbmQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpIHt9CisgIHZpcnR1YWwgdm9pZCBTY3JlZW5Ub0NsaWVudChGWF9IV05EIGhXbmQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpIHt9CiAKLSAgICB2aXJ0dWFsIEZYX0hNRU5VICAgICAgICAgICAgQ3JlYXRlUG9wdXBNZW51KCkge3JldHVybiBOVUxMO30KLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgQXBwZW5kTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgbklETmV3SXRlbSwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSB7cmV0dXJuIEZBTFNFO30KLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgRW5hYmxlTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgbklESXRlbSwgRlhfQk9PTCBiRW5hYmxlZCkge3JldHVybiBGQUxTRTt9Ci0gICAgdmlydHVhbCBpbnQzMl90ICAgICAgICAgVHJhY2tQb3B1cE1lbnUoRlhfSE1FTlUgaE1lbnUsIGludDMyX3QgeCwgaW50MzJfdCB5LCBGWF9IV05EIGhQYXJlbnQpIHtyZXR1cm4gLTE7fQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBEZXN0cm95TWVudShGWF9ITUVOVSBoTWVudSkge30KKyAgLypjdXJzb3Igc3R5bGUKKyAgRlhDVF9BUlJPVworICBGWENUX05FU1cKKyAgRlhDVF9OV1NFCisgIEZYQ1RfVkJFQU0KKyAgRlhDVF9IQkVBTQorICBGWENUX0hBTkQKKyAgKi8KKyAgdmlydHVhbCB2b2lkIFNldEN1cnNvcihpbnQzMl90IG5DdXJzb3JUeXBlKTsKIAotICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgICAgICBHZXROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCk7Ci0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIEZpbmROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCwgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSk7Ci0gICAgdmlydHVhbCBDUERGX0ZvbnQqICAgICAgICAgIEFkZE5hdGl2ZVRydWVUeXBlRm9udFRvUERGKENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUsIHVpbnQ4X3QgbkNoYXJzZXQpOworICB2aXJ0dWFsIEZYX0hNRU5VIENyZWF0ZVBvcHVwTWVudSgpIHsgcmV0dXJuIE5VTEw7IH0KKyAgdmlydHVhbCBGWF9CT09MIEFwcGVuZE1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSUROZXdJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHZpcnR1YWwgRlhfQk9PTCBFbmFibGVNZW51SXRlbShGWF9ITUVOVSBoTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbklESXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuYWJsZWQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdmlydHVhbCBpbnQzMl90IFRyYWNrUG9wdXBNZW51KEZYX0hNRU5VIGhNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSFdORCBoUGFyZW50KSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHZpcnR1YWwgdm9pZCBEZXN0cm95TWVudShGWF9ITUVOVSBoTWVudSkge30KIAotICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgIFNldFRpbWVyKGludDMyX3QgdUVsYXBzZSwgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYykgOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICBLaWxsVGltZXIoaW50MzJfdCBuSUQpIDsKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCk7CisgIHZpcnR1YWwgRlhfQk9PTCBGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpOworICB2aXJ0dWFsIENQREZfRm9udCogQWRkTmF0aXZlVHJ1ZVR5cGVGb250VG9QREYoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG5DaGFyc2V0KTsKIAorICB2aXJ0dWFsIGludDMyX3QgU2V0VGltZXIoaW50MzJfdCB1RWxhcHNlLCBUaW1lckNhbGxiYWNrIGxwVGltZXJGdW5jKTsKKyAgdmlydHVhbCB2b2lkIEtpbGxUaW1lcihpbnQzMl90IG5JRCk7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNTSElGVEtleURvd24obkZsYWcpO30KLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykge3JldHVybiBtX3BFbnYtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTt9Ci0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgIElzQUxUS2V5RG93bihGWF9EV09SRCBuRmxhZykge3JldHVybiBtX3BFbnYtPkZGSV9Jc0FMVEtleURvd24obkZsYWcpO30KLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSB7cmV0dXJuIG1fcEVudi0+RkZJX0lzSU5TRVJUS2V5RG93bihuRmxhZyk7fQorICB2aXJ0dWFsIEZYX0JPT0wgSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHsKKyAgICByZXR1cm4gbV9wRW52LT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOworICB9CisgIHZpcnR1YWwgRlhfQk9PTCBJc0NUUkxLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSB7CisgICAgcmV0dXJuIG1fcEVudi0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOworICB9CisgIHZpcnR1YWwgRlhfQk9PTCBJc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHsKKyAgICByZXR1cm4gbV9wRW52LT5GRklfSXNBTFRLZXlEb3duKG5GbGFnKTsKKyAgfQorICB2aXJ0dWFsIEZYX0JPT0wgSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSB7CisgICAgcmV0dXJuIG1fcEVudi0+RkZJX0lzSU5TRVJUS2V5RG93bihuRmxhZyk7CisgIH0KIAotICAgIHZpcnR1YWwgRlhfU1lTVEVNVElNRSAgICAgICBHZXRMb2NhbFRpbWUoKTsKKyAgdmlydHVhbCBGWF9TWVNURU1USU1FIEdldExvY2FsVGltZSgpOwogCi0gICAgdmlydHVhbCBpbnQzMl90ICAgICAgICAgR2V0Q2hhclNldCgpIHtyZXR1cm4gbV9uQ2hhclNldDt9Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgIFNldENoYXJTZXQoaW50MzJfdCBuQ2hhclNldCkge21fbkNoYXJTZXQgPSBuQ2hhclNldDt9Ci1wcml2YXRlOgotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEVudjsKLSAgICBpbnQgICAgIG1fbkNoYXJTZXQ7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyU2V0KCkgeyByZXR1cm4gbV9uQ2hhclNldDsgfQorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhclNldChpbnQzMl90IG5DaGFyU2V0KSB7IG1fbkNoYXJTZXQgPSBuQ2hhclNldDsgfQorCisgcHJpdmF0ZToKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogbV9wRW52OworICBpbnQgbV9uQ2hhclNldDsKIH07CiAKLXZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6OlNldEN1cnNvcihpbnQzMl90IG5DdXJzb3JUeXBlKQotewotCi0gICAgbV9wRW52LT5GRklfU2V0Q3Vyc29yKG5DdXJzb3JUeXBlKTsKK3ZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6OlNldEN1cnNvcihpbnQzMl90IG5DdXJzb3JUeXBlKSB7CisgIG1fcEVudi0+RkZJX1NldEN1cnNvcihuQ3Vyc29yVHlwZSk7CiB9CiAKLXZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6OkludmFsaWRhdGVSZWN0KEZYX0hXTkQgaFduZCwgRlhfUkVDVCByZWN0KQotewotICAgIC8vZ19wRm9ybUZpbGxBcHAtPkZGSV9JbnZhbGlkYXRlKCk7Ci0gICAgQ1BERlNES19Bbm5vdCogcFNES0Fubm90ID0gKENQREZTREtfQW5ub3QqKWhXbmQ7Ci0gICAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IE5VTEw7Ci0gICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gTlVMTDsKLSAgICBwUGFnZVZpZXcgPSBwU0RLQW5ub3QtPkdldFBhZ2VWaWV3KCk7Ci0gICAgcFBhZ2UgPSBwU0RLQW5ub3QtPkdldFBERlhGQVBhZ2UoKTsKLSAgICBpZighcFBhZ2UgfHwgIXBQYWdlVmlldykKLSAgICAgICAgcmV0dXJuOwotICAgIENQREZfTWF0cml4IHBhZ2UyZGV2aWNlOwotICAgIHBQYWdlVmlldy0+R2V0Q3VycmVudE1hdHJpeChwYWdlMmRldmljZSk7Ci0gICAgQ1BERl9NYXRyaXggZGV2aWNlMnBhZ2U7Ci0gICAgZGV2aWNlMnBhZ2UuU2V0UmV2ZXJzZShwYWdlMmRldmljZSk7Ci0gICAgRlhfRkxPQVQgbGVmdCwgdG9wLCByaWdodCxib3R0b207Ci0gICAgZGV2aWNlMnBhZ2UuVHJhbnNmb3JtKChGWF9GTE9BVClyZWN0LmxlZnQsIChGWF9GTE9BVClyZWN0LnRvcCwgbGVmdCwgdG9wKTsKLSAgICBkZXZpY2UycGFnZS5UcmFuc2Zvcm0oKEZYX0ZMT0FUKXJlY3QucmlnaHQsIChGWF9GTE9BVClyZWN0LmJvdHRvbSwgcmlnaHQsIGJvdHRvbSk7Ci0vLyAgbV9wRW52LT5GRklfRGV2aWNlVG9QYWdlKHBQYWdlLCByZWN0LmxlZnQsIHJlY3QudG9wLCAoZG91YmxlKikmbGVmdCwgKGRvdWJsZSopJnRvcCk7Ci0vLyAgbV9wRW52LT5GRklfRGV2aWNlVG9QYWdlKHBQYWdlLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgKGRvdWJsZSopJnJpZ2h0LCAoZG91YmxlKikmYm90dG9tKTsKLSAgICBDUERGX1JlY3QgcmNQREYobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKLSAgICByY1BERi5Ob3JtYWxpemUoKTsKK3ZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6OkludmFsaWRhdGVSZWN0KEZYX0hXTkQgaFduZCwgRlhfUkVDVCByZWN0KSB7CisgIC8vIGdfcEZvcm1GaWxsQXBwLT5GRklfSW52YWxpZGF0ZSgpOworICBDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSAoQ1BERlNES19Bbm5vdCopaFduZDsKKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IE5VTEw7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IE5VTEw7CisgIHBQYWdlVmlldyA9IHBTREtBbm5vdC0+R2V0UGFnZVZpZXcoKTsKKyAgcFBhZ2UgPSBwU0RLQW5ub3QtPkdldFBERlhGQVBhZ2UoKTsKKyAgaWYgKCFwUGFnZSB8fCAhcFBhZ2VWaWV3KQorICAgIHJldHVybjsKKyAgQ1BERl9NYXRyaXggcGFnZTJkZXZpY2U7CisgIHBQYWdlVmlldy0+R2V0Q3VycmVudE1hdHJpeChwYWdlMmRldmljZSk7CisgIENQREZfTWF0cml4IGRldmljZTJwYWdlOworICBkZXZpY2UycGFnZS5TZXRSZXZlcnNlKHBhZ2UyZGV2aWNlKTsKKyAgRlhfRkxPQVQgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICBkZXZpY2UycGFnZS5UcmFuc2Zvcm0oKEZYX0ZMT0FUKXJlY3QubGVmdCwgKEZYX0ZMT0FUKXJlY3QudG9wLCBsZWZ0LCB0b3ApOworICBkZXZpY2UycGFnZS5UcmFuc2Zvcm0oKEZYX0ZMT0FUKXJlY3QucmlnaHQsIChGWF9GTE9BVClyZWN0LmJvdHRvbSwgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20pOworICAvLyAgbV9wRW52LT5GRklfRGV2aWNlVG9QYWdlKHBQYWdlLCByZWN0LmxlZnQsIHJlY3QudG9wLCAoZG91YmxlKikmbGVmdCwKKyAgLy8gIChkb3VibGUqKSZ0b3ApOworICAvLyAgbV9wRW52LT5GRklfRGV2aWNlVG9QYWdlKHBQYWdlLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgKGRvdWJsZSopJnJpZ2h0LAorICAvLyAgKGRvdWJsZSopJmJvdHRvbSk7CisgIENQREZfUmVjdCByY1BERihsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOworICByY1BERi5Ob3JtYWxpemUoKTsKIAotICAgIG1fcEVudi0+RkZJX0ludmFsaWRhdGUocFBhZ2UsIHJjUERGLmxlZnQsIHJjUERGLnRvcCwgcmNQREYucmlnaHQsIHJjUERGLmJvdHRvbSk7CisgIG1fcEVudi0+RkZJX0ludmFsaWRhdGUocFBhZ2UsIHJjUERGLmxlZnQsIHJjUERGLnRvcCwgcmNQREYucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmNQREYuYm90dG9tKTsKIH0KLXZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6Ok91dHB1dFNlbGVjdGVkUmVjdCh2b2lkKiBwRm9ybUZpbGxlciwgQ1BERl9SZWN0JiByZWN0KQotewotICAgIENGRkxfRm9ybUZpbGxlciogcEZGTCA9IChDRkZMX0Zvcm1GaWxsZXIqKXBGb3JtRmlsbGVyOwotICAgIGlmKHBGRkwpCi0gICAgewotICAgICAgICBDUERGX1BvaW50IGxlZnRib3R0b20gPSBDUERGX1BvaW50KHJlY3QubGVmdCwgcmVjdC5ib3R0b20pOwotICAgICAgICBDUERGX1BvaW50IHJpZ2h0dG9wID0gQ1BERl9Qb2ludChyZWN0LnJpZ2h0LCByZWN0LnRvcCk7Ci0gICAgICAgIENQREZfUG9pbnQgcHRBID0gcEZGTC0+UFdMdG9GRkwobGVmdGJvdHRvbSk7Ci0gICAgICAgIENQREZfUG9pbnQgcHRCID0gcEZGTC0+UFdMdG9GRkwocmlnaHR0b3ApOwotICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgID0gcEZGTC0+R2V0U0RLQW5ub3QoKTsKLSAgICAgICAgQVNTRVJUKHBBbm5vdCk7Ci0gICAgICAgIENQREZYRkFfUGFnZSogcFBhZ2UgPSBwQW5ub3QtPkdldFBERlhGQVBhZ2UoKTsKLSAgICAgICAgQVNTRVJUKHBQYWdlKTsKLSAgICAgICAgbV9wRW52LT5GRklfT3V0cHV0U2VsZWN0ZWRSZWN0KHBQYWdlLCBwdEEueCwgcHRCLnksIHB0Qi54LCBwdEEueSk7Ci0gICAgfQotfQotCi1GWF9CT09MIENGWF9TeXN0ZW1IYW5kbGVyOjpJc1NlbGVjdGlvbkltcGxlbWVudGVkKCkKLXsKLSAgICBpZihtX3BFbnYpCi0gICAgewotICAgICAgICBGUERGX0ZPUk1GSUxMSU5GTyogcEluZm8gPSBtX3BFbnYtPkdldEZvcm1GaWxsSW5mbygpOwotICAgICAgICBpZihwSW5mbyAmJiBwSW5mby0+RkZJX091dHB1dFNlbGVjdGVkUmVjdCkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENGWF9TeXN0ZW1IYW5kbGVyOjpHZXROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCkKLXsKLSAgICByZXR1cm4gIiI7Ci19Ci0KLUZYX0JPT0wgQ0ZYX1N5c3RlbUhhbmRsZXI6OkZpbmROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCwgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSkKLXsKLSAgICBDRlhfRm9udE1nciogcEZvbnRNZ3IgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCk7Ci0gICAgaWYocEZvbnRNZ3IpCi0gICAgewotICAgICAgICBDRlhfRm9udE1hcHBlciogcEZvbnRNYXBwZXIgPSBwRm9udE1nci0+bV9wQnVpbHRpbk1hcHBlcjsKLSAgICAgICAgaWYocEZvbnRNYXBwZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBuU2l6ZSA9IHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHMuR2V0U2l6ZSgpOwotICAgICAgICAgICAgaWYoblNpemUgPT0wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBGb250TWFwcGVyLT5Mb2FkSW5zdGFsbGVkRm9udHMoKTsKLSAgICAgICAgICAgICAgICBuU2l6ZSA9IHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHMuR2V0U2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxuU2l6ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHNbaV0uQ29tcGFyZShzRm9udEZhY2VOYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotc3RhdGljIGludCBDaGFyU2V0MkNQKGludCBjaGFyc2V0KQotewotICAgIGlmIChjaGFyc2V0ID09IDEyOCkKLSAgICAgICAgcmV0dXJuIDkzMjsKLSAgICBpZiAoY2hhcnNldCA9PSAxMzQpCi0gICAgICAgIHJldHVybiA5MzY7Ci0gICAgaWYgKGNoYXJzZXQgPT0gMTI5KQotICAgICAgICByZXR1cm4gOTQ5OwotICAgIGlmIChjaGFyc2V0ID09IDEzNikKLSAgICAgICAgcmV0dXJuIDk1MDsKLSAgICByZXR1cm4gMDsKLX0KLUNQREZfRm9udCogQ0ZYX1N5c3RlbUhhbmRsZXI6OkFkZE5hdGl2ZVRydWVUeXBlRm9udFRvUERGKENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG5DaGFyc2V0KQotewotICAgIGlmKHBEb2MpCi0gICAgewotICAgICAgICBDRlhfRm9udCogcEZYRm9udCA9IG5ldyBDRlhfRm9udCgpOwotICAgICAgICBwRlhGb250LT5Mb2FkU3Vic3Qoc0ZvbnRGYWNlTmFtZSxUUlVFLDAsMCwwLENoYXJTZXQyQ1AobkNoYXJzZXQpLEZBTFNFKTsKLSAgICAgICAgQ1BERl9Gb250KiBwRm9udCA9IHBEb2MtPkFkZEZvbnQocEZYRm9udCxuQ2hhcnNldCxGQUxTRSk7Ci0gICAgICAgIGRlbGV0ZSBwRlhGb250OwotICAgICAgICByZXR1cm4gcEZvbnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotaW50MzJfdCBDRlhfU3lzdGVtSGFuZGxlcjo6U2V0VGltZXIoaW50MzJfdCB1RWxhcHNlLCBUaW1lckNhbGxiYWNrIGxwVGltZXJGdW5jKQotewotICAgIHJldHVybiBtX3BFbnYtPkZGSV9TZXRUaW1lcih1RWxhcHNlLCBscFRpbWVyRnVuYyk7Ci19Ci12b2lkIENGWF9TeXN0ZW1IYW5kbGVyOjpLaWxsVGltZXIoaW50MzJfdCBuSUQpCi17Ci0gICAgbV9wRW52LT5GRklfS2lsbFRpbWVyKG5JRCk7Ci19Ci0KLUZYX1NZU1RFTVRJTUUgQ0ZYX1N5c3RlbUhhbmRsZXI6OkdldExvY2FsVGltZSgpCi17Ci0gICAgcmV0dXJuIG1fcEVudi0+RkZJX0dldExvY2FsVGltZSgpOwotfQotCi1DUERGRG9jX0Vudmlyb25tZW50OjpDUERGRG9jX0Vudmlyb25tZW50KENQREZYRkFfRG9jdW1lbnQqIHBEb2MsIEZQREZfRk9STUZJTExJTkZPKiBwRkZpbmZvKSA6Ci0gICAgbV9wQW5ub3RIYW5kbGVyTWdyKE5VTEwpLAotICAgIG1fcEFjdGlvbkhhbmRsZXIoTlVMTCksCi0gICAgbV9wSlNSdW50aW1lKE5VTEwpLAotICAgIG1fcEluZm8ocEZGaW5mbyksCi0gICAgbV9wU0RLRG9jKE5VTEwpLAotICAgIG1fcFhGQURvYyhwRG9jKSwKLSAgICBtX3BJRm9ybUZpbGxlcihOVUxMKQotewotICAgIG1fcFN5c0hhbmRsZXIgPSBuZXcgQ0ZYX1N5c3RlbUhhbmRsZXIodGhpcyk7Ci19Ci0KLUNQREZEb2NfRW52aXJvbm1lbnQ6On5DUERGRG9jX0Vudmlyb25tZW50KCkKLXsKLSAgICBkZWxldGUgbV9wSUZvcm1GaWxsZXI7Ci0gICAgbV9wSUZvcm1GaWxsZXIgPSBOVUxMOwotCi0gICAgQ1BERlhGQV9BcHAqIHBQcm92aWRlciA9IENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpOwotICAgIGlmIChtX3BKU1J1bnRpbWUgJiYgcFByb3ZpZGVyLT5HZXRSdW50aW1lRmFjdG9yeSgpKQotICAgICAgICBwUHJvdmlkZXItPkdldFJ1bnRpbWVGYWN0b3J5KCktPkRlbGV0ZUpTUnVudGltZShtX3BKU1J1bnRpbWUpOwotCi0gICAgaWYgKHBQcm92aWRlci0+bV9wRW52TGlzdC5HZXRTaXplKCkgPT0gMCkKLSAgICB7Ci0gICAgICAgIHBQcm92aWRlci0+UmVsZWFzZVJ1bnRpbWUoKTsKLSAgICAgICAgcFByb3ZpZGVyLT5Jbml0UnVudGltZShUUlVFKTsKLSAgICB9Ci0KLSAgICBkZWxldGUgbV9wU3lzSGFuZGxlcjsKLSAgICBtX3BTeXNIYW5kbGVyID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtX3BBbm5vdEhhbmRsZXJNZ3I7Ci0gICAgbV9wQW5ub3RIYW5kbGVyTWdyID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtX3BBY3Rpb25IYW5kbGVyOwotICAgIG1fcEFjdGlvbkhhbmRsZXIgPSBOVUxMOwotfQotCi1pbnQgQ1BERkRvY19FbnZpcm9ubWVudDo6SlNfYXBwQWxlcnQoY29uc3QgRlhfV0NIQVIqIE1zZywgY29uc3QgRlhfV0NIQVIqIFRpdGxlLCBGWF9VSU5UIFR5cGUsIEZYX1VJTlQgSWNvbikKLXsKLSAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9hbGVydCkKLSAgICB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzTXNnID0gQ0ZYX1dpZGVTdHJpbmcoTXNnKS5VVEYxNkxFX0VuY29kZSgpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1RpdGxlID0gQ0ZYX1dpZGVTdHJpbmcoVGl0bGUpLlVURjE2TEVfRW5jb2RlKCk7Ci0gICAgICAgIEZQREZfV0lERVNUUklORyBwTXNnID0gKEZQREZfV0lERVNUUklORylic01zZy5HZXRCdWZmZXIoYnNNc2cuR2V0TGVuZ3RoKCkpOwotICAgICAgICBGUERGX1dJREVTVFJJTkcgcFRpdGxlID0gKEZQREZfV0lERVNUUklORylic1RpdGxlLkdldEJ1ZmZlcihic1RpdGxlLkdldExlbmd0aCgpKTsKLSAgICAgICAgaW50IHJldCA9IG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9hbGVydChtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBwTXNnLCBwVGl0bGUsIFR5cGUsIEljb24pOwotICAgICAgICBic01zZy5SZWxlYXNlQnVmZmVyKCk7Ci0gICAgICAgIGJzVGl0bGUuUmVsZWFzZUJ1ZmZlcigpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLWludCBDUERGRG9jX0Vudmlyb25tZW50OjpKU19hcHBSZXNwb25zZShjb25zdCBGWF9XQ0hBUiogUXVlc3Rpb24sIGNvbnN0IEZYX1dDSEFSKiBUaXRsZSwgY29uc3QgRlhfV0NIQVIqIERlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGNMYWJlbCwgRlBERl9CT09MIGJQYXNzd29yZCwgdm9pZCogcmVzcG9uc2UsIGludCBsZW5ndGgpCi17Ci0gICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfcmVzcG9uc2UpCi0gICAgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1F1ZXN0aW9uID0gQ0ZYX1dpZGVTdHJpbmcoUXVlc3Rpb24pLlVURjE2TEVfRW5jb2RlKCk7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVGl0bGUgPSBDRlhfV2lkZVN0cmluZyhUaXRsZSkuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEZWZhdWx0ID0gQ0ZYX1dpZGVTdHJpbmcoRGVmYXVsdCkuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNMYWJlbCA9IENGWF9XaWRlU3RyaW5nKGNMYWJlbCkuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICAgICAgRlBERl9XSURFU1RSSU5HIHBRdWVzdGlvbiA9IChGUERGX1dJREVTVFJJTkcpYnNRdWVzdGlvbi5HZXRCdWZmZXIoYnNRdWVzdGlvbi5HZXRMZW5ndGgoKSk7Ci0gICAgICAgIEZQREZfV0lERVNUUklORyBwVGl0bGUgPSAoRlBERl9XSURFU1RSSU5HKWJzVGl0bGUuR2V0QnVmZmVyKGJzVGl0bGUuR2V0TGVuZ3RoKCkpOwotICAgICAgICBGUERGX1dJREVTVFJJTkcgcERlZmF1bHQgPSAoRlBERl9XSURFU1RSSU5HKWJzRGVmYXVsdC5HZXRCdWZmZXIoYnNEZWZhdWx0LkdldExlbmd0aCgpKTsKLSAgICAgICAgRlBERl9XSURFU1RSSU5HIHBMYWJlbCA9IChGUERGX1dJREVTVFJJTkcpYnNMYWJlbC5HZXRCdWZmZXIoYnNMYWJlbC5HZXRMZW5ndGgoKSk7Ci0gICAgICAgIGludCByZXQgPSBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfcmVzcG9uc2UobV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgcFF1ZXN0aW9uLCBwVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlZmF1bHQsIHBMYWJlbCwgYlBhc3N3b3JkLCByZXNwb25zZSwgbGVuZ3RoKTsKLSAgICAgICAgYnNRdWVzdGlvbi5SZWxlYXNlQnVmZmVyKCk7Ci0gICAgICAgIGJzVGl0bGUuUmVsZWFzZUJ1ZmZlcigpOwotICAgICAgICBic0RlZmF1bHQuUmVsZWFzZUJ1ZmZlcigpOwotICAgICAgICBic0xhYmVsLlJlbGVhc2VCdWZmZXIoKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi1DRlhfV2lkZVN0cmluZyBDUERGRG9jX0Vudmlyb25tZW50OjpKU19maWVsZEJyb3dzZSgpCi17Ci0gICAgaWYgKCFtX3BJbmZvIHx8Ci0gICAgICAgICFtX3BJbmZvLT5tX3BKc1BsYXRmb3JtIHx8Ci0gICAgICAgICFtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5GaWVsZF9icm93c2UpIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9Ci0KLSAgICBjb25zdCBpbnQgblJlcXVpcmVkTGVuID0gbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RmllbGRfYnJvd3NlKAotICAgICAgICAgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgbnVsbHB0ciwgMCk7Ci0gICAgaWYgKG5SZXF1aXJlZExlbiA8PSAwKQotICAgICAgICByZXR1cm4gTCIiOwotCi0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gcEJ1ZmYobmV3IGNoYXJbblJlcXVpcmVkTGVuXSk7Ci0gICAgbWVtc2V0KHBCdWZmLmdldCgpLCAwLCBuUmVxdWlyZWRMZW4pOwotICAgIGNvbnN0IGludCBuQWN0dWFsTGVuID0gbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RmllbGRfYnJvd3NlKAotICAgICAgICAgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgcEJ1ZmYuZ2V0KCksIG5SZXF1aXJlZExlbik7Ci0gICAgaWYgKG5BY3R1YWxMZW4gPD0gMCB8fCBuQWN0dWFsTGVuID4gblJlcXVpcmVkTGVuKQotICAgICAgICByZXR1cm4gTCIiOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNSZXQgPSBDRlhfQnl0ZVN0cmluZyhwQnVmZi5nZXQoKSwgbkFjdHVhbExlbik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGJzUmV0KTsKLSAgICByZXR1cm4gd3NSZXQ7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENQREZEb2NfRW52aXJvbm1lbnQ6OkpTX2RvY0dldEZpbGVQYXRoKCkKLXsKLSAgICBpZiAoIW1fcEluZm8gfHwKLSAgICAgICAgIW1fcEluZm8tPm1fcEpzUGxhdGZvcm0gfHwKLSAgICAgICAgIW1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19nZXRGaWxlUGF0aCkgewotICAgICAgICByZXR1cm4gTCIiOwotICAgIH0KLQotICAgIGNvbnN0IGludCBuUmVxdWlyZWRMZW4gPSBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfZ2V0RmlsZVBhdGgoCi0gICAgICAgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBudWxscHRyLCAwKTsKLSAgICBpZiAoblJlcXVpcmVkTGVuIDw9IDApCi0gICAgICAgIHJldHVybiBMIiI7Ci0KLSAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBwQnVmZihuZXcgY2hhcltuUmVxdWlyZWRMZW5dKTsKLSAgICBtZW1zZXQocEJ1ZmYuZ2V0KCksIDAsIG5SZXF1aXJlZExlbik7Ci0gICAgY29uc3QgaW50IG5BY3R1YWxMZW4gPSBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfZ2V0RmlsZVBhdGgoCi0gICAgICAgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBwQnVmZi5nZXQoKSwgblJlcXVpcmVkTGVuKTsKLSAgICBpZiAobkFjdHVhbExlbiA8PSAwIHx8IG5BY3R1YWxMZW4gPiBuUmVxdWlyZWRMZW4pCi0gICAgICAgIHJldHVybiBMIiI7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyBic1JldCA9IENGWF9CeXRlU3RyaW5nKHBCdWZmLmdldCgpLCBuQWN0dWFsTGVuKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1JldCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoYnNSZXQpOwotICAgIHJldHVybiB3c1JldDsKLX0KLQotdm9pZCBDUERGRG9jX0Vudmlyb25tZW50OjpKU19kb2NTdWJtaXRGb3JtKHZvaWQqIGZvcm1EYXRhLCBpbnQgbGVuZ3RoLCBjb25zdCBGWF9XQ0hBUiogVVJMKQotewotICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX3N1Ym1pdEZvcm0pCi0gICAgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0Rlc3RpbmF0aW9uID0gQ0ZYX1dpZGVTdHJpbmcoVVJMKS5VVEYxNkxFX0VuY29kZSgpOwotICAgICAgICBGUERGX1dJREVTVFJJTkcgcERlc3RpbmF0aW9uID0gKEZQREZfV0lERVNUUklORylic0Rlc3RpbmF0aW9uLkdldEJ1ZmZlcihic0Rlc3RpbmF0aW9uLkdldExlbmd0aCgpKTsKLSAgICAgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX3N1Ym1pdEZvcm0obV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgZm9ybURhdGEsIGxlbmd0aCwgcERlc3RpbmF0aW9uKTsKLSAgICAgICAgYnNEZXN0aW5hdGlvbi5SZWxlYXNlQnVmZmVyKCk7Ci0gICAgfQotfQotCi12b2lkIENQREZEb2NfRW52aXJvbm1lbnQ6OkpTX2RvY21haWxGb3JtKHZvaWQqIG1haWxEYXRhLCBpbnQgbGVuZ3RoLCBGUERGX0JPT0wgYlVJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogVG8sIGNvbnN0IEZYX1dDSEFSKiBTdWJqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogQ0MsIGNvbnN0IEZYX1dDSEFSKiBCQ0MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBNc2cpCi17Ci0gICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfbWFpbCkKLSAgICB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVG8gPSBDRlhfV2lkZVN0cmluZyhUbykuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDQyA9IENGWF9XaWRlU3RyaW5nKFN1YmplY3QpLlVURjE2TEVfRW5jb2RlKCk7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzQmNjID0gQ0ZYX1dpZGVTdHJpbmcoQkNDKS5VVEYxNkxFX0VuY29kZSgpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1N1YmplY3QgPSBDRlhfV2lkZVN0cmluZyhTdWJqZWN0KS5VVEYxNkxFX0VuY29kZSgpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic01zZyA9IENGWF9XaWRlU3RyaW5nKE1zZykuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICAgICAgRlBERl9XSURFU1RSSU5HIHBUbyA9IChGUERGX1dJREVTVFJJTkcpYnNUby5HZXRCdWZmZXIoYnNUby5HZXRMZW5ndGgoKSk7Ci0gICAgICAgIEZQREZfV0lERVNUUklORyBwQ0MgPSAoRlBERl9XSURFU1RSSU5HKWJzQ0MuR2V0QnVmZmVyKGJzQ0MuR2V0TGVuZ3RoKCkpOwotICAgICAgICBGUERGX1dJREVTVFJJTkcgcEJjYyA9IChGUERGX1dJREVTVFJJTkcpYnNCY2MuR2V0QnVmZmVyKGJzQmNjLkdldExlbmd0aCgpKTsKLSAgICAgICAgRlBERl9XSURFU1RSSU5HIHBTdWJqZWN0ID0gKEZQREZfV0lERVNUUklORylic1N1YmplY3QuR2V0QnVmZmVyKGJzU3ViamVjdC5HZXRMZW5ndGgoKSk7Ci0gICAgICAgIEZQREZfV0lERVNUUklORyBwTXNnID0gKEZQREZfV0lERVNUUklORylic01zZy5HZXRCdWZmZXIoYnNNc2cuR2V0TGVuZ3RoKCkpOwotICAgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfbWFpbChtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBtYWlsRGF0YSwgbGVuZ3RoLCBiVUksIHBUbywgcFN1YmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDQywgcEJjYywgcE1zZyk7Ci0gICAgICAgIGJzVG8uUmVsZWFzZUJ1ZmZlcigpOwotICAgICAgICBic0NDLlJlbGVhc2VCdWZmZXIoKTsKLSAgICAgICAgYnNCY2MuUmVsZWFzZUJ1ZmZlcigpOwotICAgICAgICBic1N1YmplY3QuUmVsZWFzZUJ1ZmZlcigpOwotICAgICAgICBic01zZy5SZWxlYXNlQnVmZmVyKCk7Ci0gICAgfQotfQotCi1JRlhKU19SdW50aW1lKiBDUERGRG9jX0Vudmlyb25tZW50OjpHZXRKU1J1bnRpbWUoKQotewotICAgIGlmICghSXNKU0luaXRpYXRlZCgpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoIW1fcEpTUnVudGltZSkKLSAgICAgICAgbV9wSlNSdW50aW1lID0gQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFJ1bnRpbWVGYWN0b3J5KCktPk5ld0pTUnVudGltZSh0aGlzKTsKLSAgICByZXR1cm4gbV9wSlNSdW50aW1lOwotfQotCi1DUERGU0RLX0Fubm90SGFuZGxlck1nciogQ1BERkRvY19FbnZpcm9ubWVudDo6R2V0QW5ub3RIYW5kbGVyTWdyKCkKLXsKLSAgICBpZiAoIW1fcEFubm90SGFuZGxlck1ncikKLSAgICAgICAgbV9wQW5ub3RIYW5kbGVyTWdyID0gbmV3IENQREZTREtfQW5ub3RIYW5kbGVyTWdyKHRoaXMpOwotICAgIHJldHVybiBtX3BBbm5vdEhhbmRsZXJNZ3I7Ci19Ci0KLUNQREZTREtfQWN0aW9uSGFuZGxlciogQ1BERkRvY19FbnZpcm9ubWVudDo6R2V0QWN0aW9uSGFuZGVyKCkKLXsKLSAgICBpZiAoIW1fcEFjdGlvbkhhbmRsZXIpCi0gICAgICAgIG1fcEFjdGlvbkhhbmRsZXIgPSBuZXcgQ1BERlNES19BY3Rpb25IYW5kbGVyKHRoaXMpOwotICAgIHJldHVybiBtX3BBY3Rpb25IYW5kbGVyOwotfQotCi1DRkZMX0lGb3JtRmlsbGVyKiBDUERGRG9jX0Vudmlyb25tZW50OjpHZXRJRm9ybUZpbGxlcigpCi17Ci0gICAgaWYgKCFtX3BJRm9ybUZpbGxlcikKLSAgICAgICAgbV9wSUZvcm1GaWxsZXIgPSBuZXcgQ0ZGTF9JRm9ybUZpbGxlcih0aGlzKTsKLSAgICByZXR1cm4gbV9wSUZvcm1GaWxsZXI7Ci19Ci0KLUNQREZTREtfRG9jdW1lbnQ6OkNQREZTREtfRG9jdW1lbnQoQ1BERlhGQV9Eb2N1bWVudCogcERvYyxDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KSA6Ci0gICAgbV9wRG9jKHBEb2MpLAotICAgIG1fcEludGVyRm9ybShudWxscHRyKSwKLSAgICBtX3BGb2N1c0Fubm90KG51bGxwdHIpLAotICAgIG1fcEVudihwRW52KSwKLSAgICBtX3BPY2NvbnRlbnQobnVsbHB0ciksCi0gICAgbV9iQ2hhbmdlTWFzayhGQUxTRSkKLXsKLX0KLQotQ1BERlNES19Eb2N1bWVudDo6fkNQREZTREtfRG9jdW1lbnQoKQotewotICAgIGZvciAoYXV0byYgaXQgOiBtX3BhZ2VNYXApCi0gICAgICAgIGRlbGV0ZSBpdC5zZWNvbmQ7Ci0gICAgbV9wYWdlTWFwLmNsZWFyKCk7Ci0KLSAgICBkZWxldGUgbV9wSW50ZXJGb3JtOwotICAgIG1fcEludGVyRm9ybSA9IG51bGxwdHI7Ci0KLSAgICBkZWxldGUgbV9wT2Njb250ZW50OwotICAgIG1fcE9jY29udGVudCA9IG51bGxwdHI7Ci19Ci0KLUNQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2VWaWV3KENQREZYRkFfUGFnZSogcFBERlhGQVBhZ2UsIEZYX0JPT0wgUmVOZXcpCi17Ci0gICAgYXV0byBpdCA9IG1fcGFnZU1hcC5maW5kKHBQREZYRkFQYWdlKTsKLSAgICBpZiAoaXQgIT0gbV9wYWdlTWFwLmVuZCgpKQotICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKLQotICAgIGlmICghUmVOZXcpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbmV3IENQREZTREtfUGFnZVZpZXcodGhpcywgcFBERlhGQVBhZ2UpOwotICAgIG1fcGFnZU1hcFtwUERGWEZBUGFnZV0gPSBwUGFnZVZpZXc7Ci0gICAgLy8gRGVsYXkgdG8gbG9hZCBhbGwgdGhlIGFubm90YXRpb25zLCB0byBhdm9pZCBlbmRsZXNzIGxvb3AuCi0gICAgcFBhZ2VWaWV3LT5Mb2FkRlhBbm5vdHMoKTsKLSAgICByZXR1cm4gcFBhZ2VWaWV3OwotfQotCi1DUERGU0RLX1BhZ2VWaWV3KiBDUERGU0RLX0RvY3VtZW50OjpHZXRDdXJyZW50VmlldygpCi17Ci0gICAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IChDUERGWEZBX1BhZ2UgKiltX3BFbnYtPkZGSV9HZXRDdXJyZW50UGFnZShtX3BEb2MpOwotICAgIHJldHVybiBwUGFnZSA/IEdldFBhZ2VWaWV3KHBQYWdlLCBUUlVFKSA6IG51bGxwdHI7Ci19Ci0KLUNQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2VWaWV3KGludCBuSW5kZXgpCi17Ci0gICAgQ1BERlhGQV9QYWdlKiBwVGVtcFBhZ2UgPQotICAgICAgICAoQ1BERlhGQV9QYWdlKiltX3BFbnYtPkZGSV9HZXRQYWdlKG1fcERvYywgbkluZGV4KTsKLSAgICBpZiAoIXBUZW1wUGFnZSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBhdXRvIGl0ID0gbV9wYWdlTWFwLmZpbmQocFRlbXBQYWdlKTsKLSAgICByZXR1cm4gaXQtPnNlY29uZDsKLX0KLQotdm9pZCBDUERGU0RLX0RvY3VtZW50OjogUHJvY0phdmFzY3JpcHRGdW4oKQotewotICAgIENQREZYRkFfRG9jdW1lbnQqIHBQREZEb2MgPSBHZXREb2N1bWVudCgpOwotICAgIENQREZfRG9jSlNBY3Rpb25zIGRvY0pTKHBQREZEb2MtPkdldFBERkRvYygpKTsKLSAgICBpbnQgaUNvdW50ID0gZG9jSlMuQ291bnRKU0FjdGlvbnMoKTsKLSAgICBpZiAoaUNvdW50IDwgMSkgcmV0dXJuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKQotICAgIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NKU05hbWU7Ci0gICAgICAgIENQREZfQWN0aW9uIGpzQWN0aW9uID0gZG9jSlMuR2V0SlNBY3Rpb24oaSwgY3NKU05hbWUpOwotICAgICAgICBpZihtX3BFbnYtPkdldEFjdGlvbkhhbmRlcigpKQotICAgICAgICAgICAgbV9wRW52LT5HZXRBY3Rpb25IYW5kZXIoKS0+RG9BY3Rpb25fSmF2YVNjcmlwdChqc0FjdGlvbixDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGNzSlNOYW1lKSx0aGlzKTsKLSAgICB9Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19Eb2N1bWVudDo6UHJvY09wZW5BY3Rpb24oKQotewotICAgIGlmKCFtX3BEb2MpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2MtPkdldFBERkRvYygpLT5HZXRSb290KCk7Ci0gICAgaWYgKCFwUm9vdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgQ1BERl9PYmplY3QqIHBPcGVuQWN0aW9uID0gcFJvb3QtPkdldERpY3QoIk9wZW5BY3Rpb24iKTsKLSAgICBpZighcE9wZW5BY3Rpb24pCi0gICAgICAgIHBPcGVuQWN0aW9uID0gcFJvb3QtPkdldEFycmF5KCJPcGVuQWN0aW9uIik7Ci0KLSAgICBpZighcE9wZW5BY3Rpb24pCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGlmKHBPcGVuQWN0aW9uLT5HZXRUeXBlKCk9PVBERk9CSl9BUlJBWSkKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBpZihwT3BlbkFjdGlvbi0+R2V0VHlwZSgpPT1QREZPQkpfRElDVElPTkFSWSkKLSAgICB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSAqIHBEaWN0PShDUERGX0RpY3Rpb25hcnkqKXBPcGVuQWN0aW9uOwotICAgICAgICBDUERGX0FjdGlvbiBhY3Rpb24ocERpY3QpOwotICAgICAgICBpZihtX3BFbnYtPkdldEFjdGlvbkhhbmRlcigpKQotICAgICAgICAgICAgbV9wRW52LT5HZXRBY3Rpb25IYW5kZXIoKS0+RG9BY3Rpb25fRG9jT3BlbihhY3Rpb24sIHRoaXMpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1DUERGX09DQ29udGV4dCogQ1BERlNES19Eb2N1bWVudDo6R2V0T0NDb250ZXh0KCkKLXsKLSAgICBpZighbV9wT2Njb250ZW50KQotICAgICAgICBtX3BPY2NvbnRlbnQgPSBuZXcgQ1BERl9PQ0NvbnRleHQobV9wRG9jLT5HZXRQREZEb2MoKSk7Ci0gICAgcmV0dXJuIG1fcE9jY29udGVudDsKLX0KLQotdm9pZCBDUERGU0RLX0RvY3VtZW50OjpSZU1vdmVQYWdlVmlldyhDUERGWEZBX1BhZ2UqIHBQREZYRkFQYWdlKQotewotICAgIGF1dG8gaXQgPSBtX3BhZ2VNYXAuZmluZChwUERGWEZBUGFnZSk7Ci0gICAgaWYgKGl0ID09IG1fcGFnZU1hcC5lbmQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gaXQtPnNlY29uZDsKLSAgICBpZiAocFBhZ2VWaWV3LT5Jc0xvY2tlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBkZWxldGUgcFBhZ2VWaWV3OwotICAgIG1fcGFnZU1hcC5lcmFzZShpdCk7Ci19Ci0KLUNQREZYRkFfUGFnZSAqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2UoaW50IG5JbmRleCkKLXsKLSAgICBDUERGWEZBX1BhZ2UgKiBwVGVtcFBhZ2UgPSAoQ1BERlhGQV9QYWdlKiltX3BFbnYtPkZGSV9HZXRQYWdlKG1fcERvYyxuSW5kZXgpOwotICAgIGlmKCFwVGVtcFBhZ2UpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBwVGVtcFBhZ2U7Ci19Ci0KLUNQREZTREtfSW50ZXJGb3JtKiBDUERGU0RLX0RvY3VtZW50OjpHZXRJbnRlckZvcm0oKQotewotICAgIGlmKCFtX3BJbnRlckZvcm0pCi0gICAgICAgIG1fcEludGVyRm9ybSA9IG5ldyBDUERGU0RLX0ludGVyRm9ybSh0aGlzKTsKLSAgICByZXR1cm4gbV9wSW50ZXJGb3JtOwotfQotCi12b2lkIENQREZTREtfRG9jdW1lbnQ6OlVwZGF0ZUFsbFZpZXdzKENQREZTREtfUGFnZVZpZXcqIHBTZW5kZXIsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9wYWdlTWFwKSB7Ci0gICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IGl0LnNlY29uZDsKLSAgICAgICAgaWYgKHBQYWdlVmlldyAhPSBwU2VuZGVyKSB7Ci0gICAgICAgICAgICBwUGFnZVZpZXctPlVwZGF0ZVZpZXcocEFubm90KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotQ1BERlNES19Bbm5vdCogQ1BERlNES19Eb2N1bWVudDo6R2V0Rm9jdXNBbm5vdCgpCi17Ci0gICAgcmV0dXJuIG1fcEZvY3VzQW5ub3Q7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19Eb2N1bWVudDo6U2V0Rm9jdXNBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QsRlhfVUlOVCBuRmxhZykKLXsKLQotICAgIGlmKG1fcEZvY3VzQW5ub3Q9PXBBbm5vdCkgcmV0dXJuIFRSVUU7Ci0KLSAgICBDUERGU0RLX0Fubm90KiBwTGFzdEZvY3VzQW5ub3QgPSBtX3BGb2N1c0Fubm90OwotCi0gICAgaWYobV9wRm9jdXNBbm5vdCkKLSAgICB7Ci0gICAgICAgIGlmKCFLaWxsRm9jdXNBbm5vdChuRmxhZykgKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IE5VTEw7Ci0gICAgaWYgKHBBbm5vdCkKLSAgICAgICAgcFBhZ2VWaWV3ID0gcEFubm90LT5HZXRQYWdlVmlldygpOwotICAgIGlmKHBBbm5vdCAmJiBwUGFnZVZpZXctPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyICpwQW5ub3RIYW5kbGVyPW1fcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7Ci0KLSAgICAgICAgaWYocEFubm90SGFuZGxlciYmIW1fcEZvY3VzQW5ub3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghcEFubm90SGFuZGxlci0+QW5ub3RfT25DaGFuZ2VGb2N1cyhwQW5ub3QscExhc3RGb2N1c0Fubm90KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgIGlmICghcEFubm90SGFuZGxlci0+QW5ub3RfT25TZXRGb2N1cyhwQW5ub3QsbkZsYWcpKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIGlmKCFtX3BGb2N1c0Fubm90KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fcEZvY3VzQW5ub3Q9cEFubm90OwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpLaWxsRm9jdXNBbm5vdChGWF9VSU5UIG5GbGFnKQotewotICAgIGlmKG1fcEZvY3VzQW5ub3QpCi0gICAgewotICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciAqcEFubm90SGFuZGxlcj1tX3BFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotICAgICAgICBpZihwQW5ub3RIYW5kbGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwRm9jdXNBbm5vdCA9IG1fcEZvY3VzQW5ub3Q7Ci0gICAgICAgICAgICBtX3BGb2N1c0Fubm90ID0gTlVMTDsKLQotICAgICAgICAgICAgaWYgKCFwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbkNoYW5nZUZvY3VzKE5VTEwsIHBGb2N1c0Fubm90KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgIGlmKHBBbm5vdEhhbmRsZXItPkFubm90X09uS2lsbEZvY3VzKHBGb2N1c0Fubm90LCBuRmxhZykpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBpZihwRm9jdXNBbm5vdC0+R2V0VHlwZSgpID09IEZYX0JTVFJDKCJXaWRnZXQiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwRm9jdXNBbm5vdDsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5GaWVsZFR5cGUgPSBwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoRklFTERUWVBFX1RFWFRGSUVMRCA9PSBuRmllbGRUeXBlIHx8IEZJRUxEVFlQRV9DT01CT0JPWCA9PSBuRmllbGRUeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRW52LT5GRklfT25TZXRGaWVsZElucHV0Rm9jdXMoTlVMTCwgTlVMTCwgMCwgRkFMU0UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCFtX3BGb2N1c0Fubm90KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3BGb2N1c0Fubm90ID0gcEZvY3VzQW5ub3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENQREZTREtfRG9jdW1lbnQ6OkRlbGV0ZVBhZ2VzKGludCBuU3RhcnQsIGludCAgbkNvdW50KQotewotICAgIGlmICggblN0YXJ0IDwgMCB8fCBuU3RhcnQgPj0gR2V0UGFnZUNvdW50KCkgfHwgbkNvdW50IDw9IDAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIENQREZYRkFfUGFnZSAqIHBUZW1wUGFnZSA9IE5VTEw7Ci0gICAgZm9yICggaW50IGkgPSBuQ291bnQtMTsgaSA+PSAwOyBpLS0gKQotICAgIHsKLSAgICAgICAgcFRlbXBQYWdlID0gR2V0UGFnZShuU3RhcnQraSk7Ci0gICAgICAgIGlmICggcFRlbXBQYWdlICE9IE5VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZU1vdmVQYWdlVmlldyhwVGVtcFBhZ2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIENQREZTREtfRG9jdW1lbnQ6Ok9uQ2xvc2VEb2N1bWVudCgpCi17Ci0gICAgS2lsbEZvY3VzQW5ub3QoKTsKLX0KLQotRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpHZXRQZXJtaXNzaW9ucyhpbnQgbkZsYWcpCi17Ci0gICAgRlhfRFdPUkQgZHdQZXJtaXNzaW9ucyA9IG1fcERvYy0+R2V0UERGRG9jKCktPkdldFVzZXJQZXJtaXNzaW9ucygpOwotICAgIHJldHVybiBkd1Blcm1pc3Npb25zJm5GbGFnOwotfQotCi1JRlhKU19SdW50aW1lICogQ1BERlNES19Eb2N1bWVudDo6R2V0SnNSdW50aW1lKCkKLXsKLSAgICBBU1NFUlQobV9wRW52IT1OVUxMKTsKLSAgICByZXR1cm4gbV9wRW52LT5HZXRKU1J1bnRpbWUoKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgIENQREZTREtfRG9jdW1lbnQ6OkdldFBhdGgoKQotewotICAgIEFTU0VSVChtX3BFbnYgIT0gTlVMTCk7Ci0gICAgcmV0dXJuIG1fcEVudi0+SlNfZG9jR2V0RmlsZVBhdGgoKTsKLX0KLQotCi1DUERGU0RLX1BhZ2VWaWV3OjpDUERGU0RLX1BhZ2VWaWV3KENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MsQ1BERlhGQV9QYWdlKiBwYWdlKTptX3BhZ2UocGFnZSksbV9wU0RLRG9jKHBTREtEb2MpCi17Ci0gICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwU0RLRG9jLT5HZXRJbnRlckZvcm0oKTsKLSAgICBpZihwSW50ZXJGb3JtKQotICAgIHsKLSAgICAgICAgQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgICAgICAgaWYgKHBhZ2UtPkdldFBERlBhZ2UoKSkKLSAgICAgICAgICAgIHBQREZJbnRlckZvcm0tPkZpeFBhZ2VGaWVsZHMocGFnZS0+R2V0UERGUGFnZSgpKTsKLSAgICB9Ci0gICAgbV9meEFubm90QXJyYXkuUmVtb3ZlQWxsKCk7Ci0KLSAgICBtX2JFbnRlcldpZGdldCA9IEZBTFNFOwotICAgIG1fYkV4aXRXaWRnZXQgPSBGQUxTRTsKLSAgICBtX2JPbldpZGdldCA9IEZBTFNFOwotICAgIG1fQ2FwdHVyZVdpZGdldCA9IE5VTEw7Ci0gICAgbV9iVmFsaWQgPSBGQUxTRTsKLSAgICBtX2JMb2NrZWQgPSBGQUxTRTsKLSAgICBtX3BBbm5vdExpc3QgPSBOVUxMOwotfQotCi1DUERGU0RLX1BhZ2VWaWV3Ojp+Q1BERlNES19QYWdlVmlldygpCi17Ci0gICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7Ci0gICAgaW50IG5Bbm5vdENvdW50ID0gbV9meEFubm90QXJyYXkuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGk9MDsgaTxuQW5ub3RDb3VudDsgaSsrKQotICAgIHsKLSAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gKENQREZTREtfQW5ub3QqKW1fZnhBbm5vdEFycmF5LkdldEF0KGkpOwotICAgICAgICAvL2lmIHRoZXJlIGlzIGEgZm9jdXNlZCBhbm5vdCBvbiB0aGUgcGFnZSwgd2Ugc2hvdWxkIGtpbGwgdGhlIGZvY3VzIGZpcnN0LgotICAgICAgICBpZihwQW5ub3QgPT0gbV9wU0RLRG9jLT5HZXRGb2N1c0Fubm90KCkpCi0gICAgICAgICAgICBLaWxsRm9jdXNBbm5vdCgpOwotICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotICAgICAgICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7Ci0gICAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPlJlbGVhc2VBbm5vdChwQW5ub3QpOwotICAgIH0KLSAgICBtX2Z4QW5ub3RBcnJheS5SZW1vdmVBbGwoKTsKLQotICAgIGRlbGV0ZSBtX3BBbm5vdExpc3Q7Ci0gICAgbV9wQW5ub3RMaXN0ID0gTlVMTDsKLX0KLQotdm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpQYWdlVmlld19PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUKiBwQ2xpcCkKLXsKLSAgICBtX2N1ck1hdHJpeCA9ICpwVXNlcjJEZXZpY2U7Ci0gICAgLy8gIG1fcEFubm90TGlzdC0+RGlzcGxheUFubm90cyhtX3BhZ2UsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgRkFMU0UsIHBPcHRpb25zKTsKLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLSAgICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gR2V0UERGWEZBUGFnZSgpOwotCi0gICAgaWYgKHBQYWdlID09IE5VTEwpIHJldHVybjsKLQotICAgIGlmIChwUGFnZS0+R2V0RG9jdW1lbnQoKS0+R2V0RG9jVHlwZSgpID09IERPQ1RZUEVfRFlOSU1JQ19YRkEpIHsKLSAgICAgICAgQ0ZYX0dyYXBoaWNzIGdzOwotICAgICAgICBncy5DcmVhdGUocERldmljZSk7Ci0gICAgICAgIGlmIChwQ2xpcCkgewotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJlY3RDbGlwOwotICAgICAgICAgICAgcmVjdENsaXAuU2V0KHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwQ2xpcC0+bGVmdCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBDbGlwLT50b3ApLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwQ2xpcC0+V2lkdGgoKSksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBDbGlwLT5IZWlnaHQoKSkpOwotICAgICAgICAgICAgZ3MuU2V0Q2xpcFJlY3QocmVjdENsaXApOwotICAgICAgICB9Ci0gICAgICAgIElYRkFfUmVuZGVyQ29udGV4dCogcFJlbmRlckNvbnRleHQgPSBYRkFfUmVuZGVyQ29udGV4dF9DcmVhdGUoKTsKLSAgICAgICAgaWYgKCFwUmVuZGVyQ29udGV4dCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgQ1hGQV9SZW5kZXJPcHRpb25zIHJlbmRlck9wdGlvbnM7Ci0gICAgICAgIHJlbmRlck9wdGlvbnMubV9iSGlnaGxpZ2h0ID0gVFJVRTsKLSAgICAgICAgcFJlbmRlckNvbnRleHQtPlN0YXJ0UmVuZGVyKHBQYWdlLT5HZXRYRkFQYWdlVmlldygpLCAmZ3MsICpwVXNlcjJEZXZpY2UsIHJlbmRlck9wdGlvbnMpOwotICAgICAgICBwUmVuZGVyQ29udGV4dC0+RG9SZW5kZXIoKTsKLSAgICAgICAgcFJlbmRlckNvbnRleHQtPlN0b3BSZW5kZXIoKTsKLSAgICAgICAgcFJlbmRlckNvbnRleHQtPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBmb3IgcGRmL3N0YXRpYyB4ZmEuCi0gICAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yIGFubm90SXRlcmF0b3IodGhpcywgVFJVRSk7Ci0gICAgQ1BERlNES19Bbm5vdCAqIHBTREtBbm5vdD1OVUxMOwotICAgIGludCBpbmRleD0tMTsKLSAgICBwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpOwotICAgIHdoaWxlKHBTREtBbm5vdCkKLSAgICB7Ci0gICAgICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7Ci0gICAgICAgIEFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKLSAgICAgICAgcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25EcmF3KHRoaXMsIHBTREtBbm5vdCwgcERldmljZSwgcFVzZXIyRGV2aWNlLCAwKTsKLSAgICAgICAgcFNES0Fubm90ID0gYW5ub3RJdGVyYXRvci5OZXh0KGluZGV4KTsKLSAgICB9Ci19Ci1DUERGX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZBbm5vdEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKQotewotCi0gICAgaW50IG5Db3VudCA9IG1fcEFubm90TGlzdC0+Q291bnQoKTsKLSAgICBmb3IoaW50IGkgPSAwIDsgaTxuQ291bnQ7IGkrKykKLSAgICB7Ci0gICAgICAgIENQREZfQW5ub3QqIHBBbm5vdCA9IG1fcEFubm90TGlzdC0+R2V0QXQoaSk7Ci0gICAgICAgIENGWF9GbG9hdFJlY3QgYW5ub3RSZWN0OwotICAgICAgICBwQW5ub3QtPkdldFJlY3QoYW5ub3RSZWN0KTsKLSAgICAgICAgaWYoYW5ub3RSZWN0LkNvbnRhaW5zKHBhZ2VYLCBwYWdlWSkpCi0gICAgICAgICAgICByZXR1cm4gcEFubm90OwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQ1BERl9Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6R2V0UERGV2lkZ2V0QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpCi17Ci0KLSAgICBpbnQgbkNvdW50ID0gbV9wQW5ub3RMaXN0LT5Db3VudCgpOwotICAgIGZvcihpbnQgaSA9IDAgOyBpPG5Db3VudDsgaSsrKQotICAgIHsKLSAgICAgICAgQ1BERl9Bbm5vdCogcEFubm90ID0gbV9wQW5ub3RMaXN0LT5HZXRBdChpKTsKLSAgICAgICAgaWYocEFubm90LT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgYW5ub3RSZWN0OwotICAgICAgICAgICAgcEFubm90LT5HZXRSZWN0KGFubm90UmVjdCk7Ci0gICAgICAgICAgICBpZihhbm5vdFJlY3QuQ29udGFpbnMocGFnZVgsIHBhZ2VZKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcEFubm90OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1DUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRGWEFubm90QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpCi17Ci0gICAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yIGFubm90SXRlcmF0b3IodGhpcywgRkFMU0UpOwotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwotICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLSAgICBDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBOVUxMOwotICAgIGludCBpbmRleCA9IC0xOwotICAgIHBTREtBbm5vdCA9IGFubm90SXRlcmF0b3IuTmV4dChpbmRleCk7Ci0gICAgd2hpbGUocFNES0Fubm90KQotICAgIHsKLSAgICAgICAgQ1BERl9SZWN0IHJjID0gcEFubm90TWdyLT5Bbm5vdF9PbkdldFZpZXdCQm94KHRoaXMsIHBTREtBbm5vdCk7Ci0gICAgICAgIGlmKHJjLkNvbnRhaW5zKHBhZ2VYLCBwYWdlWSkpCi0gICAgICAgICAgICByZXR1cm4gcFNES0Fubm90OwotICAgICAgICBwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1DUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRGWFdpZGdldEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKQotewotICAgIENQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIEZBTFNFKTsKLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLSAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90TWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7Ci0gICAgQ1BERlNES19Bbm5vdCogcFNES0Fubm90ID0gTlVMTDsKLSAgICBpbnQgaW5kZXggPSAtMTsKLSAgICBwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpOwotICAgIHdoaWxlKHBTREtBbm5vdCkKLSAgICB7Ci0gICAgICAgIGlmKHBTREtBbm5vdC0+R2V0VHlwZSgpID09ICJXaWRnZXQiIHx8IHBTREtBbm5vdC0+R2V0VHlwZSgpID09IEZTREtfWEZBV0lER0VUX1RZUEVOQU1FKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQW5ub3RNZ3ItPkFubm90X09uR2V0Vmlld0JCb3godGhpcywgcFNES0Fubm90KTsKLSAgICAgICAgICAgIENQREZfUG9pbnQgcG9pbnQocGFnZVgsIHBhZ2VZKTsKLSAgICAgICAgICAgIGlmIChwQW5ub3RNZ3ItPkFubm90X09uSGl0VGVzdCh0aGlzLCBwU0RLQW5ub3QsIHBvaW50KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcFNES0Fubm90OwotICAgICAgICB9Ci0gICAgICAgIHBTREtBbm5vdCA9IGFubm90SXRlcmF0b3IuTmV4dChpbmRleCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpBbm5vdF9IYXNBcHBlYXJhbmNlKENQREZfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpYyA9IHBBbm5vdC0+R2V0QW5ub3REaWN0KCk7Ci0gICAgaWYocEFubm90RGljKQotICAgICAgICByZXR1cm4gIHBBbm5vdERpYy0+S2V5RXhpc3QoIkFTIik7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1DUERGU0RLX0Fubm90KiAgQ1BERlNES19QYWdlVmlldzo6QWRkQW5ub3QoQ1BERl9Bbm5vdCAqIHBQREZBbm5vdCkKLXsKLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLSAgICBBU1NFUlQocEVudik7Ci0gICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IgKiBwQW5ub3RIYW5kbGVyPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLQotICAgIENQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9TlVMTDsKLQotICAgIGlmKHBBbm5vdEhhbmRsZXIpCi0gICAgewotICAgICAgICBwU0RLQW5ub3QgPSBwQW5ub3RIYW5kbGVyLT5OZXdBbm5vdChwUERGQW5ub3QsIHRoaXMpOwotICAgIH0KLSAgICBpZighcFNES0Fubm90KQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIG1fZnhBbm5vdEFycmF5LkFkZChwU0RLQW5ub3QpOwotCi0gICAgaWYocEFubm90SGFuZGxlcikKLSAgICB7Ci0gICAgICAgIHBBbm5vdEhhbmRsZXItPkFubm90X09uQ3JlYXRlKHBTREtBbm5vdCk7Ci0KLSAgICB9Ci0KLSAgICAgcmV0dXJuIHBTREtBbm5vdDsKLX0KLQotQ1BERlNES19Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6QWRkQW5ub3QoSVhGQV9XaWRnZXQqIHBQREZBbm5vdCkKLXsKLSAgICBpZiAoIXBQREZBbm5vdCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBHZXRBbm5vdEJ5WEZBV2lkZ2V0KHBQREZBbm5vdCk7Ci0gICAgaWYgKHBTREtBbm5vdCkKLSAgICAgICAgcmV0dXJuIHBTREtBbm5vdDsKLQotICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwotICAgIEFTU0VSVChwRW52KTsKLSAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciAqIHBBbm5vdEhhbmRsZXI9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotCi0gICAgcFNES0Fubm90ID1OVUxMOwotCi0gICAgaWYocEFubm90SGFuZGxlcikKLSAgICB7Ci0gICAgICAgIHBTREtBbm5vdCA9IHBBbm5vdEhhbmRsZXItPk5ld0Fubm90KHBQREZBbm5vdCwgdGhpcyk7Ci0gICAgfQotICAgIGlmKCFwU0RLQW5ub3QpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgbV9meEFubm90QXJyYXkuQWRkKHBTREtBbm5vdCk7Ci0KLSAgICByZXR1cm4gcFNES0Fubm90OwotfQotCi1DUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpBZGRBbm5vdChDUERGX0RpY3Rpb25hcnkgKiBwRGljdCkKLXsKLSAgICByZXR1cm4gcERpY3QgPyBBZGRBbm5vdChwRGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIiksIHBEaWN0KSA6IG51bGxwdHI7Ci19Ci0KLUNQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkFkZEFubm90KGNvbnN0IEZYX0NIQVIqIGxwU3ViVHlwZSxDUERGX0RpY3Rpb25hcnkgKiBwRGljdCkKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotRlhfQk9PTCAgQ1BERlNES19QYWdlVmlldzo6RGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotICAgIGlmICghcEFubm90KQotICAgICAgICByZXR1cm4gRkFMU0U7Cit2b2lkIENGWF9TeXN0ZW1IYW5kbGVyOjpPdXRwdXRTZWxlY3RlZFJlY3Qodm9pZCogcEZvcm1GaWxsZXIsIENQREZfUmVjdCYgcmVjdCkgeworICBDRkZMX0Zvcm1GaWxsZXIqIHBGRkwgPSAoQ0ZGTF9Gb3JtRmlsbGVyKilwRm9ybUZpbGxlcjsKKyAgaWYgKHBGRkwpIHsKKyAgICBDUERGX1BvaW50IGxlZnRib3R0b20gPSBDUERGX1BvaW50KHJlY3QubGVmdCwgcmVjdC5ib3R0b20pOworICAgIENQREZfUG9pbnQgcmlnaHR0b3AgPSBDUERGX1BvaW50KHJlY3QucmlnaHQsIHJlY3QudG9wKTsKKyAgICBDUERGX1BvaW50IHB0QSA9IHBGRkwtPlBXTHRvRkZMKGxlZnRib3R0b20pOworICAgIENQREZfUG9pbnQgcHRCID0gcEZGTC0+UFdMdG9GRkwocmlnaHR0b3ApOworICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHBGRkwtPkdldFNES0Fubm90KCk7CisgICAgQVNTRVJUKHBBbm5vdCk7CiAgICAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBBbm5vdC0+R2V0UERGWEZBUGFnZSgpOwotICAgIGlmICghcFBhZ2UgfHwgKHBQYWdlLT5HZXREb2N1bWVudCgpLT5HZXREb2NUeXBlKCkgIT0gRE9DVFlQRV9TVEFUSUNfWEZBICYmIHBQYWdlLT5HZXREb2N1bWVudCgpLT5HZXREb2NUeXBlKCkgIT0gRE9DVFlQRV9EWU5JTUlDX1hGQSkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGludCBpbmRleCA9IG1fZnhBbm5vdEFycmF5LkZpbmQocEFubm90KTsKLSAgICBtX2Z4QW5ub3RBcnJheS5SZW1vdmVBdChpbmRleCk7Ci0gICAgaWYgKG1fQ2FwdHVyZVdpZGdldCA9PSBwQW5ub3QpCi0gICAgICAgIG1fQ2FwdHVyZVdpZGdldCA9IE5VTEw7Ci0KLSAgICByZXR1cm4gVFJVRTsKKyAgICBBU1NFUlQocFBhZ2UpOworICAgIG1fcEVudi0+RkZJX091dHB1dFNlbGVjdGVkUmVjdChwUGFnZSwgcHRBLngsIHB0Qi55LCBwdEIueCwgcHRBLnkpOworICB9CiB9CiAKLUNQREZfRG9jdW1lbnQqIENQREZTREtfUGFnZVZpZXc6OkdldFBERkRvY3VtZW50KCkKLXsKLSAgICBpZihtX3BhZ2UpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wYWdlLT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKTsKK0ZYX0JPT0wgQ0ZYX1N5c3RlbUhhbmRsZXI6OklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSB7CisgIGlmIChtX3BFbnYpIHsKKyAgICBGUERGX0ZPUk1GSUxMSU5GTyogcEluZm8gPSBtX3BFbnYtPkdldEZvcm1GaWxsSW5mbygpOworICAgIGlmIChwSW5mbyAmJiBwSW5mby0+RkZJX091dHB1dFNlbGVjdGVkUmVjdCkKKyAgICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworQ0ZYX0J5dGVTdHJpbmcgQ0ZYX1N5c3RlbUhhbmRsZXI6OkdldE5hdGl2ZVRydWVUeXBlRm9udChpbnQzMl90IG5DaGFyc2V0KSB7CisgIHJldHVybiAiIjsKK30KKworRlhfQk9PTCBDRlhfU3lzdGVtSGFuZGxlcjo6RmluZE5hdGl2ZVRydWVUeXBlRm9udCgKKyAgICBpbnQzMl90IG5DaGFyc2V0LAorICAgIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpIHsKKyAgQ0ZYX0ZvbnRNZ3IqIHBGb250TWdyID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpOworICBpZiAocEZvbnRNZ3IpIHsKKyAgICBDRlhfRm9udE1hcHBlciogcEZvbnRNYXBwZXIgPSBwRm9udE1nci0+bV9wQnVpbHRpbk1hcHBlcjsKKyAgICBpZiAocEZvbnRNYXBwZXIpIHsKKyAgICAgIGludCBuU2l6ZSA9IHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHMuR2V0U2l6ZSgpOworICAgICAgaWYgKG5TaXplID09IDApIHsKKyAgICAgICAgcEZvbnRNYXBwZXItPkxvYWRJbnN0YWxsZWRGb250cygpOworICAgICAgICBuU2l6ZSA9IHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHMuR2V0U2l6ZSgpOworICAgICAgfQorCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5TaXplOyBpKyspIHsKKyAgICAgICAgaWYgKHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHNbaV0uQ29tcGFyZShzRm9udEZhY2VOYW1lKSkKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KICAgICB9CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgQ2hhclNldDJDUChpbnQgY2hhcnNldCkgeworICBpZiAoY2hhcnNldCA9PSAxMjgpCisgICAgcmV0dXJuIDkzMjsKKyAgaWYgKGNoYXJzZXQgPT0gMTM0KQorICAgIHJldHVybiA5MzY7CisgIGlmIChjaGFyc2V0ID09IDEyOSkKKyAgICByZXR1cm4gOTQ5OworICBpZiAoY2hhcnNldCA9PSAxMzYpCisgICAgcmV0dXJuIDk1MDsKKyAgcmV0dXJuIDA7Cit9CitDUERGX0ZvbnQqIENGWF9TeXN0ZW1IYW5kbGVyOjpBZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERigKKyAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUsCisgICAgdWludDhfdCBuQ2hhcnNldCkgeworICBpZiAocERvYykgeworICAgIENGWF9Gb250KiBwRlhGb250ID0gbmV3IENGWF9Gb250KCk7CisgICAgcEZYRm9udC0+TG9hZFN1YnN0KHNGb250RmFjZU5hbWUsIFRSVUUsIDAsIDAsIDAsIENoYXJTZXQyQ1AobkNoYXJzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgICAgQ1BERl9Gb250KiBwRm9udCA9IHBEb2MtPkFkZEZvbnQocEZYRm9udCwgbkNoYXJzZXQsIEZBTFNFKTsKKyAgICBkZWxldGUgcEZYRm9udDsKKyAgICByZXR1cm4gcEZvbnQ7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworaW50MzJfdCBDRlhfU3lzdGVtSGFuZGxlcjo6U2V0VGltZXIoaW50MzJfdCB1RWxhcHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYykgeworICByZXR1cm4gbV9wRW52LT5GRklfU2V0VGltZXIodUVsYXBzZSwgbHBUaW1lckZ1bmMpOworfQordm9pZCBDRlhfU3lzdGVtSGFuZGxlcjo6S2lsbFRpbWVyKGludDMyX3QgbklEKSB7CisgIG1fcEVudi0+RkZJX0tpbGxUaW1lcihuSUQpOworfQorCitGWF9TWVNURU1USU1FIENGWF9TeXN0ZW1IYW5kbGVyOjpHZXRMb2NhbFRpbWUoKSB7CisgIHJldHVybiBtX3BFbnYtPkZGSV9HZXRMb2NhbFRpbWUoKTsKK30KKworQ1BERkRvY19FbnZpcm9ubWVudDo6Q1BERkRvY19FbnZpcm9ubWVudChDUERGWEZBX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1GSUxMSU5GTyogcEZGaW5mbykKKyAgICA6IG1fcEFubm90SGFuZGxlck1ncihOVUxMKSwKKyAgICAgIG1fcEFjdGlvbkhhbmRsZXIoTlVMTCksCisgICAgICBtX3BKU1J1bnRpbWUoTlVMTCksCisgICAgICBtX3BJbmZvKHBGRmluZm8pLAorICAgICAgbV9wU0RLRG9jKE5VTEwpLAorICAgICAgbV9wWEZBRG9jKHBEb2MpLAorICAgICAgbV9wSUZvcm1GaWxsZXIoTlVMTCkgeworICBtX3BTeXNIYW5kbGVyID0gbmV3IENGWF9TeXN0ZW1IYW5kbGVyKHRoaXMpOworfQorCitDUERGRG9jX0Vudmlyb25tZW50Ojp+Q1BERkRvY19FbnZpcm9ubWVudCgpIHsKKyAgZGVsZXRlIG1fcElGb3JtRmlsbGVyOworICBtX3BJRm9ybUZpbGxlciA9IE5VTEw7CisKKyAgQ1BERlhGQV9BcHAqIHBQcm92aWRlciA9IENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpOworICBpZiAobV9wSlNSdW50aW1lICYmIHBQcm92aWRlci0+R2V0UnVudGltZUZhY3RvcnkoKSkKKyAgICBwUHJvdmlkZXItPkdldFJ1bnRpbWVGYWN0b3J5KCktPkRlbGV0ZUpTUnVudGltZShtX3BKU1J1bnRpbWUpOworCisgIGlmIChwUHJvdmlkZXItPm1fcEVudkxpc3QuR2V0U2l6ZSgpID09IDApIHsKKyAgICBwUHJvdmlkZXItPlJlbGVhc2VSdW50aW1lKCk7CisgICAgcFByb3ZpZGVyLT5Jbml0UnVudGltZShUUlVFKTsKKyAgfQorCisgIGRlbGV0ZSBtX3BTeXNIYW5kbGVyOworICBtX3BTeXNIYW5kbGVyID0gTlVMTDsKKworICBkZWxldGUgbV9wQW5ub3RIYW5kbGVyTWdyOworICBtX3BBbm5vdEhhbmRsZXJNZ3IgPSBOVUxMOworCisgIGRlbGV0ZSBtX3BBY3Rpb25IYW5kbGVyOworICBtX3BBY3Rpb25IYW5kbGVyID0gTlVMTDsKK30KKworaW50IENQREZEb2NfRW52aXJvbm1lbnQ6OkpTX2FwcEFsZXJ0KGNvbnN0IEZYX1dDSEFSKiBNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIEljb24pIHsKKyAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfYWxlcnQpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBic01zZyA9IENGWF9XaWRlU3RyaW5nKE1zZykuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBic1RpdGxlID0gQ0ZYX1dpZGVTdHJpbmcoVGl0bGUpLlVURjE2TEVfRW5jb2RlKCk7CisgICAgRlBERl9XSURFU1RSSU5HIHBNc2cgPSAoRlBERl9XSURFU1RSSU5HKWJzTXNnLkdldEJ1ZmZlcihic01zZy5HZXRMZW5ndGgoKSk7CisgICAgRlBERl9XSURFU1RSSU5HIHBUaXRsZSA9CisgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnNUaXRsZS5HZXRCdWZmZXIoYnNUaXRsZS5HZXRMZW5ndGgoKSk7CisgICAgaW50IHJldCA9IG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9hbGVydChtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBwTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpdGxlLCBUeXBlLCBJY29uKTsKKyAgICBic01zZy5SZWxlYXNlQnVmZmVyKCk7CisgICAgYnNUaXRsZS5SZWxlYXNlQnVmZmVyKCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK2ludCBDUERGRG9jX0Vudmlyb25tZW50OjpKU19hcHBSZXNwb25zZShjb25zdCBGWF9XQ0hBUiogUXVlc3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBjTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9yZXNwb25zZSkgeworICAgIENGWF9CeXRlU3RyaW5nIGJzUXVlc3Rpb24gPSBDRlhfV2lkZVN0cmluZyhRdWVzdGlvbikuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBic1RpdGxlID0gQ0ZYX1dpZGVTdHJpbmcoVGl0bGUpLlVURjE2TEVfRW5jb2RlKCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEZWZhdWx0ID0gQ0ZYX1dpZGVTdHJpbmcoRGVmYXVsdCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBic0xhYmVsID0gQ0ZYX1dpZGVTdHJpbmcoY0xhYmVsKS5VVEYxNkxFX0VuY29kZSgpOworICAgIEZQREZfV0lERVNUUklORyBwUXVlc3Rpb24gPQorICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzUXVlc3Rpb24uR2V0QnVmZmVyKGJzUXVlc3Rpb24uR2V0TGVuZ3RoKCkpOworICAgIEZQREZfV0lERVNUUklORyBwVGl0bGUgPQorICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzVGl0bGUuR2V0QnVmZmVyKGJzVGl0bGUuR2V0TGVuZ3RoKCkpOworICAgIEZQREZfV0lERVNUUklORyBwRGVmYXVsdCA9CisgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnNEZWZhdWx0LkdldEJ1ZmZlcihic0RlZmF1bHQuR2V0TGVuZ3RoKCkpOworICAgIEZQREZfV0lERVNUUklORyBwTGFiZWwgPQorICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzTGFiZWwuR2V0QnVmZmVyKGJzTGFiZWwuR2V0TGVuZ3RoKCkpOworICAgIGludCByZXQgPSBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfcmVzcG9uc2UoCisgICAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIHBRdWVzdGlvbiwgcFRpdGxlLCBwRGVmYXVsdCwgcExhYmVsLCBiUGFzc3dvcmQsCisgICAgICAgIHJlc3BvbnNlLCBsZW5ndGgpOworICAgIGJzUXVlc3Rpb24uUmVsZWFzZUJ1ZmZlcigpOworICAgIGJzVGl0bGUuUmVsZWFzZUJ1ZmZlcigpOworICAgIGJzRGVmYXVsdC5SZWxlYXNlQnVmZmVyKCk7CisgICAgYnNMYWJlbC5SZWxlYXNlQnVmZmVyKCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK0NGWF9XaWRlU3RyaW5nIENQREZEb2NfRW52aXJvbm1lbnQ6OkpTX2ZpZWxkQnJvd3NlKCkgeworICBpZiAoIW1fcEluZm8gfHwgIW1fcEluZm8tPm1fcEpzUGxhdGZvcm0gfHwKKyAgICAgICFtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5GaWVsZF9icm93c2UpIHsKKyAgICByZXR1cm4gTCIiOworICB9CisKKyAgY29uc3QgaW50IG5SZXF1aXJlZExlbiA9CisgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5GaWVsZF9icm93c2UobV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgbnVsbHB0ciwgMCk7CisgIGlmIChuUmVxdWlyZWRMZW4gPD0gMCkKKyAgICByZXR1cm4gTCIiOworCisgIG5vbnN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IHBCdWZmKG5ldyBjaGFyW25SZXF1aXJlZExlbl0pOworICBtZW1zZXQocEJ1ZmYuZ2V0KCksIDAsIG5SZXF1aXJlZExlbik7CisgIGNvbnN0IGludCBuQWN0dWFsTGVuID0gbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RmllbGRfYnJvd3NlKAorICAgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgcEJ1ZmYuZ2V0KCksIG5SZXF1aXJlZExlbik7CisgIGlmIChuQWN0dWFsTGVuIDw9IDAgfHwgbkFjdHVhbExlbiA+IG5SZXF1aXJlZExlbikKKyAgICByZXR1cm4gTCIiOworCisgIENGWF9CeXRlU3RyaW5nIGJzUmV0ID0gQ0ZYX0J5dGVTdHJpbmcocEJ1ZmYuZ2V0KCksIG5BY3R1YWxMZW4pOworICBDRlhfV2lkZVN0cmluZyB3c1JldCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoYnNSZXQpOworICByZXR1cm4gd3NSZXQ7Cit9CisKK0NGWF9XaWRlU3RyaW5nIENQREZEb2NfRW52aXJvbm1lbnQ6OkpTX2RvY0dldEZpbGVQYXRoKCkgeworICBpZiAoIW1fcEluZm8gfHwgIW1fcEluZm8tPm1fcEpzUGxhdGZvcm0gfHwKKyAgICAgICFtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfZ2V0RmlsZVBhdGgpIHsKKyAgICByZXR1cm4gTCIiOworICB9CisKKyAgY29uc3QgaW50IG5SZXF1aXJlZExlbiA9IG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19nZXRGaWxlUGF0aCgKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIG51bGxwdHIsIDApOworICBpZiAoblJlcXVpcmVkTGVuIDw9IDApCisgICAgcmV0dXJuIEwiIjsKKworICBub25zdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBwQnVmZihuZXcgY2hhcltuUmVxdWlyZWRMZW5dKTsKKyAgbWVtc2V0KHBCdWZmLmdldCgpLCAwLCBuUmVxdWlyZWRMZW4pOworICBjb25zdCBpbnQgbkFjdHVhbExlbiA9IG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19nZXRGaWxlUGF0aCgKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIHBCdWZmLmdldCgpLCBuUmVxdWlyZWRMZW4pOworICBpZiAobkFjdHVhbExlbiA8PSAwIHx8IG5BY3R1YWxMZW4gPiBuUmVxdWlyZWRMZW4pCisgICAgcmV0dXJuIEwiIjsKKworICBDRlhfQnl0ZVN0cmluZyBic1JldCA9IENGWF9CeXRlU3RyaW5nKHBCdWZmLmdldCgpLCBuQWN0dWFsTGVuKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGJzUmV0KTsKKyAgcmV0dXJuIHdzUmV0OworfQorCit2b2lkIENQREZEb2NfRW52aXJvbm1lbnQ6OkpTX2RvY1N1Ym1pdEZvcm0odm9pZCogZm9ybURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogVVJMKSB7CisgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19zdWJtaXRGb3JtKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEZXN0aW5hdGlvbiA9IENGWF9XaWRlU3RyaW5nKFVSTCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICBGUERGX1dJREVTVFJJTkcgcERlc3RpbmF0aW9uID0KKyAgICAgICAgKEZQREZfV0lERVNUUklORylic0Rlc3RpbmF0aW9uLkdldEJ1ZmZlcihic0Rlc3RpbmF0aW9uLkdldExlbmd0aCgpKTsKKyAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2Nfc3VibWl0Rm9ybShtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBmb3JtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHBEZXN0aW5hdGlvbik7CisgICAgYnNEZXN0aW5hdGlvbi5SZWxlYXNlQnVmZmVyKCk7CisgIH0KK30KKwordm9pZCBDUERGRG9jX0Vudmlyb25tZW50OjpKU19kb2NtYWlsRm9ybSh2b2lkKiBtYWlsRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJVSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIFRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogU3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIENDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogQkNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogTXNnKSB7CisgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX21haWwpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBic1RvID0gQ0ZYX1dpZGVTdHJpbmcoVG8pLlVURjE2TEVfRW5jb2RlKCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDQyA9IENGWF9XaWRlU3RyaW5nKFN1YmplY3QpLlVURjE2TEVfRW5jb2RlKCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNCY2MgPSBDRlhfV2lkZVN0cmluZyhCQ0MpLlVURjE2TEVfRW5jb2RlKCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNTdWJqZWN0ID0gQ0ZYX1dpZGVTdHJpbmcoU3ViamVjdCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBic01zZyA9IENGWF9XaWRlU3RyaW5nKE1zZykuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICBGUERGX1dJREVTVFJJTkcgcFRvID0gKEZQREZfV0lERVNUUklORylic1RvLkdldEJ1ZmZlcihic1RvLkdldExlbmd0aCgpKTsKKyAgICBGUERGX1dJREVTVFJJTkcgcENDID0gKEZQREZfV0lERVNUUklORylic0NDLkdldEJ1ZmZlcihic0NDLkdldExlbmd0aCgpKTsKKyAgICBGUERGX1dJREVTVFJJTkcgcEJjYyA9IChGUERGX1dJREVTVFJJTkcpYnNCY2MuR2V0QnVmZmVyKGJzQmNjLkdldExlbmd0aCgpKTsKKyAgICBGUERGX1dJREVTVFJJTkcgcFN1YmplY3QgPQorICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzU3ViamVjdC5HZXRCdWZmZXIoYnNTdWJqZWN0LkdldExlbmd0aCgpKTsKKyAgICBGUERGX1dJREVTVFJJTkcgcE1zZyA9IChGUERGX1dJREVTVFJJTkcpYnNNc2cuR2V0QnVmZmVyKGJzTXNnLkdldExlbmd0aCgpKTsKKyAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfbWFpbChtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBtYWlsRGF0YSwgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVSSwgcFRvLCBwU3ViamVjdCwgcENDLCBwQmNjLCBwTXNnKTsKKyAgICBic1RvLlJlbGVhc2VCdWZmZXIoKTsKKyAgICBic0NDLlJlbGVhc2VCdWZmZXIoKTsKKyAgICBic0JjYy5SZWxlYXNlQnVmZmVyKCk7CisgICAgYnNTdWJqZWN0LlJlbGVhc2VCdWZmZXIoKTsKKyAgICBic01zZy5SZWxlYXNlQnVmZmVyKCk7CisgIH0KK30KKworSUZYSlNfUnVudGltZSogQ1BERkRvY19FbnZpcm9ubWVudDo6R2V0SlNSdW50aW1lKCkgeworICBpZiAoIUlzSlNJbml0aWF0ZWQoKSkKICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCFtX3BKU1J1bnRpbWUpCisgICAgbV9wSlNSdW50aW1lID0KKyAgICAgICAgQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFJ1bnRpbWVGYWN0b3J5KCktPk5ld0pTUnVudGltZSh0aGlzKTsKKyAgcmV0dXJuIG1fcEpTUnVudGltZTsKIH0KIAotQ1BERl9QYWdlKiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZQYWdlKCkKLXsKLSAgICBpZiAobV9wYWdlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcGFnZS0+R2V0UERGUGFnZSgpOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOworQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIENQREZEb2NfRW52aXJvbm1lbnQ6OkdldEFubm90SGFuZGxlck1ncigpIHsKKyAgaWYgKCFtX3BBbm5vdEhhbmRsZXJNZ3IpCisgICAgbV9wQW5ub3RIYW5kbGVyTWdyID0gbmV3IENQREZTREtfQW5ub3RIYW5kbGVyTWdyKHRoaXMpOworICByZXR1cm4gbV9wQW5ub3RIYW5kbGVyTWdyOwogfQogCi1pbnQgQ1BERlNES19QYWdlVmlldzo6Q291bnRBbm5vdHMoKQotewotICAgIHJldHVybiBtX2Z4QW5ub3RBcnJheS5HZXRTaXplKCk7CitDUERGU0RLX0FjdGlvbkhhbmRsZXIqIENQREZEb2NfRW52aXJvbm1lbnQ6OkdldEFjdGlvbkhhbmRlcigpIHsKKyAgaWYgKCFtX3BBY3Rpb25IYW5kbGVyKQorICAgIG1fcEFjdGlvbkhhbmRsZXIgPSBuZXcgQ1BERlNES19BY3Rpb25IYW5kbGVyKHRoaXMpOworICByZXR1cm4gbV9wQWN0aW9uSGFuZGxlcjsKIH0KIAotQ1BERlNES19Bbm5vdCogIENQREZTREtfUGFnZVZpZXc6OkdldEFubm90KGludCBuSW5kZXgpCi17Ci0gICAgaW50IG5Db3VudCA9IG1fZnhBbm5vdEFycmF5LkdldFNpemUoKTsKLSAgICBpZiAoIG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG5Db3VudCApCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKENQREZTREtfQW5ub3QqKW1fZnhBbm5vdEFycmF5LkdldEF0KG5JbmRleCk7CitDRkZMX0lGb3JtRmlsbGVyKiBDUERGRG9jX0Vudmlyb25tZW50OjpHZXRJRm9ybUZpbGxlcigpIHsKKyAgaWYgKCFtX3BJRm9ybUZpbGxlcikKKyAgICBtX3BJRm9ybUZpbGxlciA9IG5ldyBDRkZMX0lGb3JtRmlsbGVyKHRoaXMpOworICByZXR1cm4gbV9wSUZvcm1GaWxsZXI7CiB9CiAKLUNQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldEFubm90QnlEaWN0KENQREZfRGljdGlvbmFyeSAqIHBEaWN0KQotewotICAgIGludCBuQ291bnQgPSBtX2Z4QW5ub3RBcnJheS5HZXRTaXplKCk7Ci0gICAgZm9yKGludCBpPTA7IGk8bkNvdW50OyBpKyspCi0gICAgewotICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSAoQ1BERlNES19Bbm5vdCopbV9meEFubm90QXJyYXkuR2V0QXQoaSk7Ci0gICAgICAgIGlmIChwRGljdCA9PSBwQW5ub3QtPkdldFBERkFubm90KCktPkdldEFubm90RGljdCgpKQotICAgICAgICAgICAgcmV0dXJuIHBBbm5vdDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRBbm5vdEJ5WEZBV2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KQotewotICAgIGlmIChoV2lkZ2V0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGludCBhbm5vdENvdW50ID0gbV9meEFubm90QXJyYXkuR2V0U2l6ZSgpOworQ1BERlNES19Eb2N1bWVudDo6Q1BERlNES19Eb2N1bWVudChDUERGWEZBX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KQorICAgIDogbV9wRG9jKHBEb2MpLAorICAgICAgbV9wSW50ZXJGb3JtKG51bGxwdHIpLAorICAgICAgbV9wRm9jdXNBbm5vdChudWxscHRyKSwKKyAgICAgIG1fcEVudihwRW52KSwKKyAgICAgIG1fcE9jY29udGVudChudWxscHRyKSwKKyAgICAgIG1fYkNoYW5nZU1hc2soRkFMU0UpIHt9CiAKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgYW5ub3RDb3VudDsgaSsrKQotICAgIHsKLSAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gKENQREZTREtfQW5ub3QqKW1fZnhBbm5vdEFycmF5LkdldEF0KGkpOwotICAgICAgICBpZihwQW5ub3QtPkdldFhGQVdpZGdldCgpID09IGhXaWRnZXQpCi0gICAgICAgICAgICByZXR1cm4gcEFubm90OwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKK0NQREZTREtfRG9jdW1lbnQ6On5DUERGU0RLX0RvY3VtZW50KCkgeworICBmb3IgKGF1dG8mIGl0IDogbV9wYWdlTWFwKQorICAgIGRlbGV0ZSBpdC5zZWNvbmQ7CisgIG1fcGFnZU1hcC5jbGVhcigpOworCisgIGRlbGV0ZSBtX3BJbnRlckZvcm07CisgIG1fcEludGVyRm9ybSA9IG51bGxwdHI7CisKKyAgZGVsZXRlIG1fcE9jY29udGVudDsKKyAgbV9wT2Njb250ZW50ID0gbnVsbHB0cjsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZykKLXsKLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLSAgICBBU1NFUlQocEVudik7Ci0gICAgQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSk7Ci0gICAgaWYoIXBGWEFubm90KQotICAgIHsKLSAgICAgICAgS2lsbEZvY3VzQW5ub3QobkZsYWcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotICAgICAgICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7CitDUERGU0RLX1BhZ2VWaWV3KiBDUERGU0RLX0RvY3VtZW50OjpHZXRQYWdlVmlldyhDUERGWEZBX1BhZ2UqIHBQREZYRkFQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBSZU5ldykgeworICBhdXRvIGl0ID0gbV9wYWdlTWFwLmZpbmQocFBERlhGQVBhZ2UpOworICBpZiAoaXQgIT0gbV9wYWdlTWFwLmVuZCgpKQorICAgIHJldHVybiBpdC0+c2Vjb25kOwogCi0gICAgICAgIEZYX0JPT0wgYlJldCA9IHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTEJ1dHRvbkRvd24odGhpcywgcEZYQW5ub3QsIG5GbGFnLHBvaW50KTsKLSAgICAgICAgaWYoYlJldCkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0Rm9jdXNBbm5vdChwRlhBbm5vdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJSZXQ7Ci0gICAgfQorICBpZiAoIVJlTmV3KQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IG5ldyBDUERGU0RLX1BhZ2VWaWV3KHRoaXMsIHBQREZYRkFQYWdlKTsKKyAgbV9wYWdlTWFwW3BQREZYRkFQYWdlXSA9IHBQYWdlVmlldzsKKyAgLy8gRGVsYXkgdG8gbG9hZCBhbGwgdGhlIGFubm90YXRpb25zLCB0byBhdm9pZCBlbmRsZXNzIGxvb3AuCisgIHBQYWdlVmlldy0+TG9hZEZYQW5ub3RzKCk7CisgIHJldHVybiBwUGFnZVZpZXc7Cit9CisKK0NQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldEN1cnJlbnRWaWV3KCkgeworICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gKENQREZYRkFfUGFnZSopbV9wRW52LT5GRklfR2V0Q3VycmVudFBhZ2UobV9wRG9jKTsKKyAgcmV0dXJuIHBQYWdlID8gR2V0UGFnZVZpZXcocFBhZ2UsIFRSVUUpIDogbnVsbHB0cjsKK30KKworQ1BERlNES19QYWdlVmlldyogQ1BERlNES19Eb2N1bWVudDo6R2V0UGFnZVZpZXcoaW50IG5JbmRleCkgeworICBDUERGWEZBX1BhZ2UqIHBUZW1wUGFnZSA9IChDUERGWEZBX1BhZ2UqKW1fcEVudi0+RkZJX0dldFBhZ2UobV9wRG9jLCBuSW5kZXgpOworICBpZiAoIXBUZW1wUGFnZSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIGl0ID0gbV9wYWdlTWFwLmZpbmQocFRlbXBQYWdlKTsKKyAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKK3ZvaWQgQ1BERlNES19Eb2N1bWVudDo6UHJvY0phdmFzY3JpcHRGdW4oKSB7CisgIENQREZYRkFfRG9jdW1lbnQqIHBQREZEb2MgPSBHZXREb2N1bWVudCgpOworICBDUERGX0RvY0pTQWN0aW9ucyBkb2NKUyhwUERGRG9jLT5HZXRQREZEb2MoKSk7CisgIGludCBpQ291bnQgPSBkb2NKUy5Db3VudEpTQWN0aW9ucygpOworICBpZiAoaUNvdW50IDwgMSkKKyAgICByZXR1cm47CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBjc0pTTmFtZTsKKyAgICBDUERGX0FjdGlvbiBqc0FjdGlvbiA9IGRvY0pTLkdldEpTQWN0aW9uKGksIGNzSlNOYW1lKTsKKyAgICBpZiAobV9wRW52LT5HZXRBY3Rpb25IYW5kZXIoKSkKKyAgICAgIG1fcEVudi0+R2V0QWN0aW9uSGFuZGVyKCktPkRvQWN0aW9uX0phdmFTY3JpcHQoCisgICAgICAgICAganNBY3Rpb24sIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoY3NKU05hbWUpLCB0aGlzKTsKKyAgfQorfQorCitGWF9CT09MIENQREZTREtfRG9jdW1lbnQ6OlByb2NPcGVuQWN0aW9uKCkgeworICBpZiAoIW1fcERvYykKICAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcERvYy0+R2V0UERGRG9jKCktPkdldFJvb3QoKTsKKyAgaWYgKCFwUm9vdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERl9PYmplY3QqIHBPcGVuQWN0aW9uID0gcFJvb3QtPkdldERpY3QoIk9wZW5BY3Rpb24iKTsKKyAgaWYgKCFwT3BlbkFjdGlvbikKKyAgICBwT3BlbkFjdGlvbiA9IHBSb290LT5HZXRBcnJheSgiT3BlbkFjdGlvbiIpOworCisgIGlmICghcE9wZW5BY3Rpb24pCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChwT3BlbkFjdGlvbi0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAocE9wZW5BY3Rpb24tPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgeworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT3BlbkFjdGlvbjsKKyAgICBDUERGX0FjdGlvbiBhY3Rpb24ocERpY3QpOworICAgIGlmIChtX3BFbnYtPkdldEFjdGlvbkhhbmRlcigpKQorICAgICAgbV9wRW52LT5HZXRBY3Rpb25IYW5kZXIoKS0+RG9BY3Rpb25fRG9jT3BlbihhY3Rpb24sIHRoaXMpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPblJCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZykKLXsKLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLSAgICBBU1NFUlQocEVudik7Ci0gICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLSAgICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7CitDUERGX09DQ29udGV4dCogQ1BERlNES19Eb2N1bWVudDo6R2V0T0NDb250ZXh0KCkgeworICBpZiAoIW1fcE9jY29udGVudCkKKyAgICBtX3BPY2NvbnRlbnQgPSBuZXcgQ1BERl9PQ0NvbnRleHQobV9wRG9jLT5HZXRQREZEb2MoKSk7CisgIHJldHVybiBtX3BPY2NvbnRlbnQ7Cit9CiAKLSAgICBDUERGU0RLX0Fubm90KiBwRlhBbm5vdCA9IEdldEZYV2lkZ2V0QXRQb2ludChwb2ludC54LCBwb2ludC55KTsKK3ZvaWQgQ1BERlNES19Eb2N1bWVudDo6UmVNb3ZlUGFnZVZpZXcoQ1BERlhGQV9QYWdlKiBwUERGWEZBUGFnZSkgeworICBhdXRvIGl0ID0gbV9wYWdlTWFwLmZpbmQocFBERlhGQVBhZ2UpOworICBpZiAoaXQgPT0gbV9wYWdlTWFwLmVuZCgpKQorICAgIHJldHVybjsKIAotICAgIGlmIChwRlhBbm5vdCA9PSBOVUxMKQorICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBpdC0+c2Vjb25kOworICBpZiAocFBhZ2VWaWV3LT5Jc0xvY2tlZCgpKQorICAgIHJldHVybjsKKworICBkZWxldGUgcFBhZ2VWaWV3OworICBtX3BhZ2VNYXAuZXJhc2UoaXQpOworfQorCitDUERGWEZBX1BhZ2UqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2UoaW50IG5JbmRleCkgeworICBDUERGWEZBX1BhZ2UqIHBUZW1wUGFnZSA9IChDUERGWEZBX1BhZ2UqKW1fcEVudi0+RkZJX0dldFBhZ2UobV9wRG9jLCBuSW5kZXgpOworICBpZiAoIXBUZW1wUGFnZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHBUZW1wUGFnZTsKK30KKworQ1BERlNES19JbnRlckZvcm0qIENQREZTREtfRG9jdW1lbnQ6OkdldEludGVyRm9ybSgpIHsKKyAgaWYgKCFtX3BJbnRlckZvcm0pCisgICAgbV9wSW50ZXJGb3JtID0gbmV3IENQREZTREtfSW50ZXJGb3JtKHRoaXMpOworICByZXR1cm4gbV9wSW50ZXJGb3JtOworfQorCit2b2lkIENQREZTREtfRG9jdW1lbnQ6OlVwZGF0ZUFsbFZpZXdzKENQREZTREtfUGFnZVZpZXcqIHBTZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9wYWdlTWFwKSB7CisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gaXQuc2Vjb25kOworICAgIGlmIChwUGFnZVZpZXcgIT0gcFNlbmRlcikgeworICAgICAgcFBhZ2VWaWV3LT5VcGRhdGVWaWV3KHBBbm5vdCk7CisgICAgfQorICB9Cit9CisKK0NQREZTREtfQW5ub3QqIENQREZTREtfRG9jdW1lbnQ6OkdldEZvY3VzQW5ub3QoKSB7CisgIHJldHVybiBtX3BGb2N1c0Fubm90OworfQorCitGWF9CT09MIENQREZTREtfRG9jdW1lbnQ6OlNldEZvY3VzQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKSB7CisgIGlmIChtX3BGb2N1c0Fubm90ID09IHBBbm5vdCkKKyAgICByZXR1cm4gVFJVRTsKKworICBDUERGU0RLX0Fubm90KiBwTGFzdEZvY3VzQW5ub3QgPSBtX3BGb2N1c0Fubm90OworCisgIGlmIChtX3BGb2N1c0Fubm90KSB7CisgICAgaWYgKCFLaWxsRm9jdXNBbm5vdChuRmxhZykpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gTlVMTDsKKyAgaWYgKHBBbm5vdCkKKyAgICBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7CisgIGlmIChwQW5ub3QgJiYgcFBhZ2VWaWV3LT5Jc1ZhbGlkKCkpIHsKKyAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlciA9IG1fcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisKKyAgICBpZiAocEFubm90SGFuZGxlciAmJiAhbV9wRm9jdXNBbm5vdCkgeworICAgICAgaWYgKCFwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbkNoYW5nZUZvY3VzKHBBbm5vdCwgcExhc3RGb2N1c0Fubm90KSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgRlhfQk9PTCBiUmV0ID0gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25SQnV0dG9uRG93bih0aGlzLCBwRlhBbm5vdCwgbkZsYWcscG9pbnQpOwotICAgIGlmIChiUmV0KQotICAgIHsKLSAgICAgICAgU2V0Rm9jdXNBbm5vdChwRlhBbm5vdCk7CisgICAgICBpZiAoIXBBbm5vdEhhbmRsZXItPkFubm90X09uU2V0Rm9jdXMocEFubm90LCBuRmxhZykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGlmICghbV9wRm9jdXNBbm5vdCkgeworICAgICAgICBtX3BGb2N1c0Fubm90ID0gcEFubm90OworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZykKLXsKLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLSAgICBBU1NFUlQocEVudik7Ci0gICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLSAgICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7CitGWF9CT09MIENQREZTREtfRG9jdW1lbnQ6OktpbGxGb2N1c0Fubm90KEZYX1VJTlQgbkZsYWcpIHsKKyAgaWYgKG1fcEZvY3VzQW5ub3QpIHsKKyAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlciA9IG1fcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisgICAgaWYgKHBBbm5vdEhhbmRsZXIpIHsKKyAgICAgIENQREZTREtfQW5ub3QqIHBGb2N1c0Fubm90ID0gbV9wRm9jdXNBbm5vdDsKKyAgICAgIG1fcEZvY3VzQW5ub3QgPSBOVUxMOwogCi0gICAgQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSk7Ci0KLSAgICBpZiAocEZYQW5ub3QgPT0gTlVMTCkKKyAgICAgIGlmICghcEFubm90SGFuZGxlci0+QW5ub3RfT25DaGFuZ2VGb2N1cyhOVUxMLCBwRm9jdXNBbm5vdCkpCiAgICAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIEZYX0JPT0wgYlJldCA9IHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uUkJ1dHRvblVwKHRoaXMsIHBGWEFubm90LCBuRmxhZyxwb2ludCk7Ci0gICAgaWYgKGJSZXQpCi0gICAgewotICAgICAgICBTZXRGb2N1c0Fubm90KHBGWEFubm90KTsKKyAgICAgIGlmIChwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbktpbGxGb2N1cyhwRm9jdXNBbm5vdCwgbkZsYWcpKSB7CisgICAgICAgIGlmIChwRm9jdXNBbm5vdC0+R2V0VHlwZSgpID09IEZYX0JTVFJDKCJXaWRnZXQiKSkgeworICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwRm9jdXNBbm5vdDsKKyAgICAgICAgICBpbnQgbkZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOworICAgICAgICAgIGlmIChGSUVMRFRZUEVfVEVYVEZJRUxEID09IG5GaWVsZFR5cGUgfHwKKyAgICAgICAgICAgICAgRklFTERUWVBFX0NPTUJPQk9YID09IG5GaWVsZFR5cGUpCisgICAgICAgICAgICBtX3BFbnYtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhOVUxMLCBOVUxMLCAwLCBGQUxTRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1fcEZvY3VzQW5ub3QpCisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX3BGb2N1c0Fubm90ID0gcEZvY3VzQW5ub3Q7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpCi17Ci0gICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7Ci0gICAgQVNTRVJUKHBFbnYpOworRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpEZWxldGVQYWdlcyhpbnQgblN0YXJ0LCBpbnQgbkNvdW50KSB7CisgIGlmIChuU3RhcnQgPCAwIHx8IG5TdGFydCA+PSBHZXRQYWdlQ291bnQoKSB8fCBuQ291bnQgPD0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIENQREZYRkFfUGFnZSogcFRlbXBQYWdlID0gTlVMTDsKKyAgZm9yIChpbnQgaSA9IG5Db3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgcFRlbXBQYWdlID0gR2V0UGFnZShuU3RhcnQgKyBpKTsKKyAgICBpZiAocFRlbXBQYWdlICE9IE5VTEwpIHsKKyAgICAgIFJlTW92ZVBhZ2VWaWV3KHBUZW1wUGFnZSk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCit2b2lkIENQREZTREtfRG9jdW1lbnQ6Ok9uQ2xvc2VEb2N1bWVudCgpIHsKKyAgS2lsbEZvY3VzQW5ub3QoKTsKK30KKworRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpHZXRQZXJtaXNzaW9ucyhpbnQgbkZsYWcpIHsKKyAgRlhfRFdPUkQgZHdQZXJtaXNzaW9ucyA9IG1fcERvYy0+R2V0UERGRG9jKCktPkdldFVzZXJQZXJtaXNzaW9ucygpOworICByZXR1cm4gZHdQZXJtaXNzaW9ucyAmIG5GbGFnOworfQorCitJRlhKU19SdW50aW1lKiBDUERGU0RLX0RvY3VtZW50OjpHZXRKc1J1bnRpbWUoKSB7CisgIEFTU0VSVChtX3BFbnYgIT0gTlVMTCk7CisgIHJldHVybiBtX3BFbnYtPkdldEpTUnVudGltZSgpOworfQorCitDRlhfV2lkZVN0cmluZyBDUERGU0RLX0RvY3VtZW50OjpHZXRQYXRoKCkgeworICBBU1NFUlQobV9wRW52ICE9IE5VTEwpOworICByZXR1cm4gbV9wRW52LT5KU19kb2NHZXRGaWxlUGF0aCgpOworfQorCitDUERGU0RLX1BhZ2VWaWV3OjpDUERGU0RLX1BhZ2VWaWV3KENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZYRkFfUGFnZSogcGFnZSkKKyAgICA6IG1fcGFnZShwYWdlKSwgbV9wU0RLRG9jKHBTREtEb2MpIHsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwU0RLRG9jLT5HZXRJbnRlckZvcm0oKTsKKyAgaWYgKHBJbnRlckZvcm0pIHsKKyAgICBDUERGX0ludGVyRm9ybSogcFBERkludGVyRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworICAgIGlmIChwYWdlLT5HZXRQREZQYWdlKCkpCisgICAgICBwUERGSW50ZXJGb3JtLT5GaXhQYWdlRmllbGRzKHBhZ2UtPkdldFBERlBhZ2UoKSk7CisgIH0KKyAgbV9meEFubm90QXJyYXkuUmVtb3ZlQWxsKCk7CisKKyAgbV9iRW50ZXJXaWRnZXQgPSBGQUxTRTsKKyAgbV9iRXhpdFdpZGdldCA9IEZBTFNFOworICBtX2JPbldpZGdldCA9IEZBTFNFOworICBtX0NhcHR1cmVXaWRnZXQgPSBOVUxMOworICBtX2JWYWxpZCA9IEZBTFNFOworICBtX2JMb2NrZWQgPSBGQUxTRTsKKyAgbV9wQW5ub3RMaXN0ID0gTlVMTDsKK30KKworQ1BERlNES19QYWdlVmlldzo6fkNQREZTREtfUGFnZVZpZXcoKSB7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICBpbnQgbkFubm90Q291bnQgPSBtX2Z4QW5ub3RBcnJheS5HZXRTaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkFubm90Q291bnQ7IGkrKykgeworICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IChDUERGU0RLX0Fubm90KiltX2Z4QW5ub3RBcnJheS5HZXRBdChpKTsKKyAgICAvLyBpZiB0aGVyZSBpcyBhIGZvY3VzZWQgYW5ub3Qgb24gdGhlIHBhZ2UsIHdlIHNob3VsZCBraWxsIHRoZSBmb2N1cyBmaXJzdC4KKyAgICBpZiAocEFubm90ID09IG1fcFNES0RvYy0+R2V0Rm9jdXNBbm5vdCgpKQorICAgICAgS2lsbEZvY3VzQW5ub3QoKTsKICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwogICAgIEFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKLSAgICBDUERGU0RLX0Fubm90KiBwRlhBbm5vdCA9IEdldEZYV2lkZ2V0QXRQb2ludChwb2ludC54LCBwb2ludC55KTsKLSAgICBDUERGU0RLX0Fubm90KiBwRm9jdXNBbm5vdCA9IEdldEZvY3VzQW5ub3QoKTsKLSAgICBGWF9CT09MIGJSZXQgID0gRkFMU0U7Ci0gICAgaWYocEZvY3VzQW5ub3QgJiYgcEZvY3VzQW5ub3QgIT0gcEZYQW5ub3QpCi0gICAgewotICAgICAgICAvL0xhc3QgZm9jdXMgQW5ub3QgZ2V0cyBhIGNoYW5jZSB0byBoYW5kbGUgdGhlIGV2ZW50LgotICAgICAgICBiUmV0ID0gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25MQnV0dG9uVXAodGhpcywgcEZvY3VzQW5ub3QsIG5GbGFnLHBvaW50KTsKKyAgICBwQW5ub3RIYW5kbGVyTWdyLT5SZWxlYXNlQW5ub3QocEFubm90KTsKKyAgfQorICBtX2Z4QW5ub3RBcnJheS5SZW1vdmVBbGwoKTsKKworICBkZWxldGUgbV9wQW5ub3RMaXN0OworICBtX3BBbm5vdExpc3QgPSBOVUxMOworfQorCit2b2lkIENQREZTREtfUGFnZVZpZXc6OlBhZ2VWaWV3X09uRHJhdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUKiBwQ2xpcCkgeworICBtX2N1ck1hdHJpeCA9ICpwVXNlcjJEZXZpY2U7CisgIC8vICBtX3BBbm5vdExpc3QtPkRpc3BsYXlBbm5vdHMobV9wYWdlLCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIEZBTFNFLAorICAvLyAgcE9wdGlvbnMpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IEdldFBERlhGQVBhZ2UoKTsKKworICBpZiAocFBhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgaWYgKHBQYWdlLT5HZXREb2N1bWVudCgpLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9EWU5JTUlDX1hGQSkgeworICAgIENGWF9HcmFwaGljcyBnczsKKyAgICBncy5DcmVhdGUocERldmljZSk7CisgICAgaWYgKHBDbGlwKSB7CisgICAgICBDRlhfUmVjdEYgcmVjdENsaXA7CisgICAgICByZWN0Q2xpcC5TZXQoc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBDbGlwLT5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4ocENsaXAtPnRvcCksCisgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBDbGlwLT5XaWR0aCgpKSwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4ocENsaXAtPkhlaWdodCgpKSk7CisgICAgICBncy5TZXRDbGlwUmVjdChyZWN0Q2xpcCk7CiAgICAgfQotICAgIGlmKHBGWEFubm90ICYmICFiUmV0KQotICAgIHsKLSAgICAgICAgYlJldCA9IHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTEJ1dHRvblVwKHRoaXMsIHBGWEFubm90LCBuRmxhZyxwb2ludCk7Ci0gICAgICAgIHJldHVybiBiUmV0OworICAgIElYRkFfUmVuZGVyQ29udGV4dCogcFJlbmRlckNvbnRleHQgPSBYRkFfUmVuZGVyQ29udGV4dF9DcmVhdGUoKTsKKyAgICBpZiAoIXBSZW5kZXJDb250ZXh0KQorICAgICAgcmV0dXJuOworICAgIENYRkFfUmVuZGVyT3B0aW9ucyByZW5kZXJPcHRpb25zOworICAgIHJlbmRlck9wdGlvbnMubV9iSGlnaGxpZ2h0ID0gVFJVRTsKKyAgICBwUmVuZGVyQ29udGV4dC0+U3RhcnRSZW5kZXIocFBhZ2UtPkdldFhGQVBhZ2VWaWV3KCksICZncywgKnBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyT3B0aW9ucyk7CisgICAgcFJlbmRlckNvbnRleHQtPkRvUmVuZGVyKCk7CisgICAgcFJlbmRlckNvbnRleHQtPlN0b3BSZW5kZXIoKTsKKyAgICBwUmVuZGVyQ29udGV4dC0+UmVsZWFzZSgpOworICAgIHJldHVybjsKKyAgfQorICAvLyBmb3IgcGRmL3N0YXRpYyB4ZmEuCisgIENQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIFRSVUUpOworICBDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBOVUxMOworICBpbnQgaW5kZXggPSAtMTsKKyAgcFNES0Fubm90ID0gYW5ub3RJdGVyYXRvci5OZXh0KGluZGV4KTsKKyAgd2hpbGUgKHBTREtBbm5vdCkgeworICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisgICAgQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOworICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uRHJhdyh0aGlzLCBwU0RLQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgMCk7CisgICAgcFNES0Fubm90ID0gYW5ub3RJdGVyYXRvci5OZXh0KGluZGV4KTsKKyAgfQorfQorQ1BERl9Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6R2V0UERGQW5ub3RBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHBhZ2VZKSB7CisgIGludCBuQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICBDUERGX0Fubm90KiBwQW5ub3QgPSBtX3BBbm5vdExpc3QtPkdldEF0KGkpOworICAgIENGWF9GbG9hdFJlY3QgYW5ub3RSZWN0OworICAgIHBBbm5vdC0+R2V0UmVjdChhbm5vdFJlY3QpOworICAgIGlmIChhbm5vdFJlY3QuQ29udGFpbnMocGFnZVgsIHBhZ2VZKSkKKyAgICAgIHJldHVybiBwQW5ub3Q7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK0NQREZfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldFBERldpZGdldEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHBhZ2VZKSB7CisgIGludCBuQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICBDUERGX0Fubm90KiBwQW5ub3QgPSBtX3BBbm5vdExpc3QtPkdldEF0KGkpOworICAgIGlmIChwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0IikgeworICAgICAgQ0ZYX0Zsb2F0UmVjdCBhbm5vdFJlY3Q7CisgICAgICBwQW5ub3QtPkdldFJlY3QoYW5ub3RSZWN0KTsKKyAgICAgIGlmIChhbm5vdFJlY3QuQ29udGFpbnMocGFnZVgsIHBhZ2VZKSkKKyAgICAgICAgcmV0dXJuIHBBbm5vdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK0NQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldEZYQW5ub3RBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcGFnZVkpIHsKKyAgQ1BERlNES19Bbm5vdEl0ZXJhdG9yIGFubm90SXRlcmF0b3IodGhpcywgRkFMU0UpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdE1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICBDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBOVUxMOworICBpbnQgaW5kZXggPSAtMTsKKyAgcFNES0Fubm90ID0gYW5ub3RJdGVyYXRvci5OZXh0KGluZGV4KTsKKyAgd2hpbGUgKHBTREtBbm5vdCkgeworICAgIENQREZfUmVjdCByYyA9IHBBbm5vdE1nci0+QW5ub3RfT25HZXRWaWV3QkJveCh0aGlzLCBwU0RLQW5ub3QpOworICAgIGlmIChyYy5Db250YWlucyhwYWdlWCwgcGFnZVkpKQorICAgICAgcmV0dXJuIHBTREtBbm5vdDsKKyAgICBwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK0NQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldEZYV2lkZ2V0QXRQb2ludChGWF9GTE9BVCBwYWdlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwYWdlWSkgeworICBDUERGU0RLX0Fubm90SXRlcmF0b3IgYW5ub3RJdGVyYXRvcih0aGlzLCBGQUxTRSk7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90TWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisgIENQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9IE5VTEw7CisgIGludCBpbmRleCA9IC0xOworICBwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpOworICB3aGlsZSAocFNES0Fubm90KSB7CisgICAgaWYgKHBTREtBbm5vdC0+R2V0VHlwZSgpID09ICJXaWRnZXQiIHx8CisgICAgICAgIHBTREtBbm5vdC0+R2V0VHlwZSgpID09IEZTREtfWEZBV0lER0VUX1RZUEVOQU1FKSB7CisgICAgICBwQW5ub3RNZ3ItPkFubm90X09uR2V0Vmlld0JCb3godGhpcywgcFNES0Fubm90KTsKKyAgICAgIENQREZfUG9pbnQgcG9pbnQocGFnZVgsIHBhZ2VZKTsKKyAgICAgIGlmIChwQW5ub3RNZ3ItPkFubm90X09uSGl0VGVzdCh0aGlzLCBwU0RLQW5ub3QsIHBvaW50KSkKKyAgICAgICAgcmV0dXJuIHBTREtBbm5vdDsKKyAgICB9CisgICAgcFNES0Fubm90ID0gYW5ub3RJdGVyYXRvci5OZXh0KGluZGV4KTsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6OkFubm90X0hhc0FwcGVhcmFuY2UoQ1BERl9Bbm5vdCogcEFubm90KSB7CisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljID0gcEFubm90LT5HZXRBbm5vdERpY3QoKTsKKyAgaWYgKHBBbm5vdERpYykKKyAgICByZXR1cm4gcEFubm90RGljLT5LZXlFeGlzdCgiQVMiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitDUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpBZGRBbm5vdChDUERGX0Fubm90KiBwUERGQW5ub3QpIHsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CisgIEFTU0VSVChwRW52KTsKKyAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXIgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKKworICBDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBOVUxMOworCisgIGlmIChwQW5ub3RIYW5kbGVyKSB7CisgICAgcFNES0Fubm90ID0gcEFubm90SGFuZGxlci0+TmV3QW5ub3QocFBERkFubm90LCB0aGlzKTsKKyAgfQorICBpZiAoIXBTREtBbm5vdCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtX2Z4QW5ub3RBcnJheS5BZGQocFNES0Fubm90KTsKKworICBpZiAocEFubm90SGFuZGxlcikgeworICAgIHBBbm5vdEhhbmRsZXItPkFubm90X09uQ3JlYXRlKHBTREtBbm5vdCk7CisgIH0KKworICByZXR1cm4gcFNES0Fubm90OworfQorCitDUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpBZGRBbm5vdChJWEZBX1dpZGdldCogcFBERkFubm90KSB7CisgIGlmICghcFBERkFubm90KQorICAgIHJldHVybiBOVUxMOworCisgIENQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9IEdldEFubm90QnlYRkFXaWRnZXQocFBERkFubm90KTsKKyAgaWYgKHBTREtBbm5vdCkKKyAgICByZXR1cm4gcFNES0Fubm90OworCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICBBU1NFUlQocEVudik7CisgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisKKyAgcFNES0Fubm90ID0gTlVMTDsKKworICBpZiAocEFubm90SGFuZGxlcikgeworICAgIHBTREtBbm5vdCA9IHBBbm5vdEhhbmRsZXItPk5ld0Fubm90KHBQREZBbm5vdCwgdGhpcyk7CisgIH0KKyAgaWYgKCFwU0RLQW5ub3QpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbV9meEFubm90QXJyYXkuQWRkKHBTREtBbm5vdCk7CisKKyAgcmV0dXJuIHBTREtBbm5vdDsKK30KKworQ1BERlNES19Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6QWRkQW5ub3QoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgeworICByZXR1cm4gcERpY3QgPyBBZGRBbm5vdChwRGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIiksIHBEaWN0KSA6IG51bGxwdHI7Cit9CisKK0NQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkFkZEFubm90KGNvbnN0IEZYX0NIQVIqIGxwU3ViVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QpIHsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6RGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIGlmICghcEFubm90KQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBBbm5vdC0+R2V0UERGWEZBUGFnZSgpOworICBpZiAoIXBQYWdlIHx8IChwUGFnZS0+R2V0RG9jdW1lbnQoKS0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfU1RBVElDX1hGQSAmJgorICAgICAgICAgICAgICAgICBwUGFnZS0+R2V0RG9jdW1lbnQoKS0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfRFlOSU1JQ19YRkEpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpbnQgaW5kZXggPSBtX2Z4QW5ub3RBcnJheS5GaW5kKHBBbm5vdCk7CisgIG1fZnhBbm5vdEFycmF5LlJlbW92ZUF0KGluZGV4KTsKKyAgaWYgKG1fQ2FwdHVyZVdpZGdldCA9PSBwQW5ub3QpCisgICAgbV9DYXB0dXJlV2lkZ2V0ID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworQ1BERl9Eb2N1bWVudCogQ1BERlNES19QYWdlVmlldzo6R2V0UERGRG9jdW1lbnQoKSB7CisgIGlmIChtX3BhZ2UpIHsKKyAgICByZXR1cm4gbV9wYWdlLT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworQ1BERl9QYWdlKiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZQYWdlKCkgeworICBpZiAobV9wYWdlKSB7CisgICAgcmV0dXJuIG1fcGFnZS0+R2V0UERGUGFnZSgpOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBDUERGU0RLX1BhZ2VWaWV3OjpDb3VudEFubm90cygpIHsKKyAgcmV0dXJuIG1fZnhBbm5vdEFycmF5LkdldFNpemUoKTsKK30KKworQ1BERlNES19Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6R2V0QW5ub3QoaW50IG5JbmRleCkgeworICBpbnQgbkNvdW50ID0gbV9meEFubm90QXJyYXkuR2V0U2l6ZSgpOworICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbkNvdW50KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gKENQREZTREtfQW5ub3QqKW1fZnhBbm5vdEFycmF5LkdldEF0KG5JbmRleCk7Cit9CisKK0NQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldEFubm90QnlEaWN0KENQREZfRGljdGlvbmFyeSogcERpY3QpIHsKKyAgaW50IG5Db3VudCA9IG1fZnhBbm5vdEFycmF5LkdldFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IChDUERGU0RLX0Fubm90KiltX2Z4QW5ub3RBcnJheS5HZXRBdChpKTsKKyAgICBpZiAocERpY3QgPT0gcEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRBbm5vdERpY3QoKSkKKyAgICAgIHJldHVybiBwQW5ub3Q7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitDUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRBbm5vdEJ5WEZBV2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7CisgIGlmIChoV2lkZ2V0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGludCBhbm5vdENvdW50ID0gbV9meEFubm90QXJyYXkuR2V0U2l6ZSgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RDb3VudDsgaSsrKSB7CisgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gKENQREZTREtfQW5ub3QqKW1fZnhBbm5vdEFycmF5LkdldEF0KGkpOworICAgIGlmIChwQW5ub3QtPkdldFhGQVdpZGdldCgpID09IGhXaWRnZXQpCisgICAgICByZXR1cm4gcEFubm90OworICB9CisgIHJldHVybiBOVUxMOworfQorCitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZykgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBDUERGU0RLX0Fubm90KiBwRlhBbm5vdCA9IEdldEZYV2lkZ2V0QXRQb2ludChwb2ludC54LCBwb2ludC55KTsKKyAgaWYgKCFwRlhBbm5vdCkgeworICAgIEtpbGxGb2N1c0Fubm90KG5GbGFnKTsKKyAgfSBlbHNlIHsKKyAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICAgIEFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKKworICAgIEZYX0JPT0wgYlJldCA9CisgICAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTEJ1dHRvbkRvd24odGhpcywgcEZYQW5ub3QsIG5GbGFnLCBwb2ludCk7CisgICAgaWYgKGJSZXQpIHsKKyAgICAgIFNldEZvY3VzQW5ub3QocEZYQW5ub3QpOwogICAgIH0KICAgICByZXR1cm4gYlJldDsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBpbnQgbkZsYWcpCi17CitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uUkJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZykgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7CiAKKyAgQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSk7CisKKyAgaWYgKHBGWEFubm90ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEZYX0JPT0wgYlJldCA9CisgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PblJCdXR0b25Eb3duKHRoaXMsIHBGWEFubm90LCBuRmxhZywgcG9pbnQpOworICBpZiAoYlJldCkgeworICAgIFNldEZvY3VzQW5ub3QocEZYQW5ub3QpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9VSU5UIG5GbGFnKSB7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICBBU1NFUlQocEVudik7CisgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisgIEFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKKworICBDUERGU0RLX0Fubm90KiBwRlhBbm5vdCA9IEdldEZYV2lkZ2V0QXRQb2ludChwb2ludC54LCBwb2ludC55KTsKKworICBpZiAocEZYQW5ub3QgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgRlhfQk9PTCBiUmV0ID0KKyAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uUkJ1dHRvblVwKHRoaXMsIHBGWEFubm90LCBuRmxhZywgcG9pbnQpOworICBpZiAoYlJldCkgeworICAgIFNldEZvY3VzQW5ub3QocEZYQW5ub3QpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9VSU5UIG5GbGFnKSB7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICBBU1NFUlQocEVudik7CisgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisgIEFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKKyAgQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSk7CisgIENQREZTREtfQW5ub3QqIHBGb2N1c0Fubm90ID0gR2V0Rm9jdXNBbm5vdCgpOworICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgaWYgKHBGb2N1c0Fubm90ICYmIHBGb2N1c0Fubm90ICE9IHBGWEFubm90KSB7CisgICAgLy8gTGFzdCBmb2N1cyBBbm5vdCBnZXRzIGEgY2hhbmNlIHRvIGhhbmRsZSB0aGUgZXZlbnQuCisgICAgYlJldCA9IHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTEJ1dHRvblVwKHRoaXMsIHBGb2N1c0Fubm90LCBuRmxhZywgcG9pbnQpOworICB9CisgIGlmIChwRlhBbm5vdCAmJiAhYlJldCkgeworICAgIGJSZXQgPSBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbkxCdXR0b25VcCh0aGlzLCBwRlhBbm5vdCwgbkZsYWcsIHBvaW50KTsKKyAgICByZXR1cm4gYlJldDsKKyAgfQorICByZXR1cm4gYlJldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwgaW50IG5GbGFnKSB7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7CisgIGlmIChDUERGU0RLX0Fubm90KiBwRlhBbm5vdCA9IEdldEZYV2lkZ2V0QXRQb2ludChwb2ludC54LCBwb2ludC55KSkgeworICAgIGlmIChtX0NhcHR1cmVXaWRnZXQgJiYgbV9DYXB0dXJlV2lkZ2V0ICE9IHBGWEFubm90KSB7CisgICAgICBtX2JFeGl0V2lkZ2V0ID0gVFJVRTsKKyAgICAgIG1fYkVudGVyV2lkZ2V0ID0gRkFMU0U7CisgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlRXhpdCh0aGlzLCBtX0NhcHR1cmVXaWRnZXQsIG5GbGFnKTsKKyAgICB9CisgICAgbV9DYXB0dXJlV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwRlhBbm5vdDsKKyAgICBtX2JPbldpZGdldCA9IFRSVUU7CisgICAgaWYgKCFtX2JFbnRlcldpZGdldCkgeworICAgICAgbV9iRW50ZXJXaWRnZXQgPSBUUlVFOworICAgICAgbV9iRXhpdFdpZGdldCA9IEZBTFNFOworICAgICAgcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZUVudGVyKHRoaXMsIHBGWEFubm90LCBuRmxhZyk7CisgICAgfQorICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VNb3ZlKHRoaXMsIHBGWEFubm90LCBuRmxhZywgcG9pbnQpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChtX2JPbldpZGdldCkgeworICAgIG1fYk9uV2lkZ2V0ID0gRkFMU0U7CisgICAgbV9iRXhpdFdpZGdldCA9IFRSVUU7CisgICAgbV9iRW50ZXJXaWRnZXQgPSBGQUxTRTsKKyAgICBpZiAobV9DYXB0dXJlV2lkZ2V0KSB7CisgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlRXhpdCh0aGlzLCBtX0NhcHR1cmVXaWRnZXQsIG5GbGFnKTsKKyAgICAgIG1fQ2FwdHVyZVdpZGdldCA9IE5VTEw7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbk1vdXNlV2hlZWwoZG91YmxlIGRlbHRhWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZWx0YVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRmxhZykgeworICBpZiAoQ1BERlNES19Bbm5vdCogcEFubm90ID0gR2V0RlhXaWRnZXRBdFBvaW50KHBvaW50LngsIHBvaW50LnkpKSB7CiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CiAgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKICAgICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7Ci0gICAgaWYoQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSkpCi0gICAgewotICAgICAgICBpZihtX0NhcHR1cmVXaWRnZXQgJiYgbV9DYXB0dXJlV2lkZ2V0ICE9IHBGWEFubm90KQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2JFeGl0V2lkZ2V0ID0gVFJVRTsKLSAgICAgICAgICAgIG1fYkVudGVyV2lkZ2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlRXhpdCh0aGlzLCBtX0NhcHR1cmVXaWRnZXQsIG5GbGFnKTsKLSAgICAgICAgfQotICAgICAgICBtX0NhcHR1cmVXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBGWEFubm90OwotICAgICAgICBtX2JPbldpZGdldCA9IFRSVUU7Ci0gICAgICAgIGlmKCFtX2JFbnRlcldpZGdldCkKLSAgICAgICAgewotICAgICAgICAgICAgbV9iRW50ZXJXaWRnZXQgPSBUUlVFOwotICAgICAgICAgICAgbV9iRXhpdFdpZGdldCA9IEZBTFNFOwotICAgICAgICAgICAgcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZUVudGVyKHRoaXMsIHBGWEFubm90LG5GbGFnKTsKLSAgICAgICAgfQotICAgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlTW92ZSh0aGlzLCBwRlhBbm5vdCwgbkZsYWcsIHBvaW50KTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmKG1fYk9uV2lkZ2V0KQotICAgIHsKLSAgICAgICAgbV9iT25XaWRnZXQgPSBGQUxTRTsKLSAgICAgICAgbV9iRXhpdFdpZGdldCA9IFRSVUU7Ci0gICAgICAgIG1fYkVudGVyV2lkZ2V0ID0gRkFMU0U7Ci0gICAgICAgIGlmKG1fQ2FwdHVyZVdpZGdldCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZUV4aXQodGhpcywgbV9DYXB0dXJlV2lkZ2V0LCBuRmxhZyk7Ci0gICAgICAgICAgICBtX0NhcHR1cmVXaWRnZXQgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZVdoZWVsKHRoaXMsIHBBbm5vdCwgbkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWRlbHRhWSwgcG9pbnQpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbk1vdXNlV2hlZWwoZG91YmxlIGRlbHRhWCwgZG91YmxlIGRlbHRhWSxjb25zdCBDUERGX1BvaW50JiBwb2ludCwgaW50IG5GbGFnKQotewotICAgIGlmKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IEdldEZYV2lkZ2V0QXRQb2ludChwb2ludC54LCBwb2ludC55KSkKLSAgICB7Ci0gICAgICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwotICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotICAgICAgICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7Ci0gICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlV2hlZWwodGhpcywgcEFubm90LCBuRmxhZywgKGludClkZWx0YVksIHBvaW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotCi19Ci0KLUZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25DaGFyKGludCBuQ2hhciwgRlhfVUlOVCBuRmxhZykKLXsKLSAgICBpZihDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBHZXRGb2N1c0Fubm90KCkpCi0gICAgewotICAgICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLSAgICAgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLSAgICAgICAgQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOwotICAgICAgICByZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25LZXlEb3duKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQotewotICAgIGlmKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IEdldEZvY3VzQW5ub3QoKSkKLSAgICB7Ci0gICAgICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwotICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotICAgICAgICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7Ci0gICAgICAgIHJldHVybiBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWcpOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25LZXlVcChpbnQgbktleUNvZGUsIGludCBuRmxhZykKLXsKLS8vICBpZihDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBHZXRGb2N1c0Fubm90KCkpCi0vLyAgewotLy8gICAgICBDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBnX3BGb3JtRmlsbEFwcC0+R2V0SUZvcm1GaWxsZXIoKTsKLS8vICAgICAgcmV0dXJuIHBJRm9ybUZpbGxlci0+T25LZXlVcChwQW5ub3QsIG5LZXlDb2RlLCBuRmxhZyk7Ci0vLyAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotZXh0ZXJuIHZvaWQgQ2hlY2tVblN1cHBvcnRBbm5vdChDUERGX0RvY3VtZW50ICogcERvYywgQ1BERl9Bbm5vdCogcFBERkFubm90KTsKLQotdm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpMb2FkRlhBbm5vdHMoKQotewotICAgIEFTU0VSVChtX3BhZ2UgIT0gTlVMTCk7Ci0KK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25DaGFyKGludCBuQ2hhciwgRlhfVUlOVCBuRmxhZykgeworICBpZiAoQ1BERlNES19Bbm5vdCogcEFubm90ID0gR2V0Rm9jdXNBbm5vdCgpKSB7CiAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7Ci0gICAgQVNTRVJUKHBFbnYgIT0gTlVMTCk7Ci0KICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotICAgIEFTU0VSVChwQW5ub3RIYW5kbGVyTWdyICE9IE5VTEwpOworICAgIEFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKKyAgICByZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFnKTsKKyAgfQogCi0gICAgU2V0TG9jayhUUlVFKTsKLSAgICBtX3BhZ2UtPkFkZFJlZigpOwotICAgIGlmIChtX3BTREtEb2MtPkdldERvY3VtZW50KCktPkdldERvY1R5cGUoKSA9PSBET0NUWVBFX0RZTklNSUNfWEZBKQotICAgIHsKLSAgICAgICAgSVhGQV9QYWdlVmlldyogcGFnZVZpZXcgPSBOVUxMOwotICAgICAgICBwYWdlVmlldyA9IG1fcGFnZS0+R2V0WEZBUGFnZVZpZXcoKTsKLSAgICAgICAgQVNTRVJUKHBhZ2VWaWV3ICE9IE5VTEwpOwotCi0gICAgICAgIElYRkFfV2lkZ2V0SXRlcmF0b3IqIHBXaWRnZXRIYW5kZXIgPSBwYWdlVmlldy0+Q3JlYXRlV2lkZ2V0SXRlcmF0b3IoWEZBX1RSQVZFUlNFV0FZX0Zvcm0sIFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZXxYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlfFhGQV9XSURHRVRGSUxURVJfQWxsVHlwZSk7Ci0gICAgICAgIGlmICghcFdpZGdldEhhbmRlcikKLSAgICAgICAgewotICAgICAgICAgICAgbV9wYWdlLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICBTZXRMb2NrKEZBTFNFKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElYRkFfV2lkZ2V0KiBwWEZBQW5ub3QgPSBwV2lkZ2V0SGFuZGVyLT5Nb3ZlVG9OZXh0KCk7Ci0gICAgICAgIHdoaWxlIChwWEZBQW5ub3QpIHsKLSAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHBBbm5vdEhhbmRsZXJNZ3ItPk5ld0Fubm90KHBYRkFBbm5vdCwgdGhpcyk7Ci0gICAgICAgICAgICBpZighcEFubm90KSB7Ci0gICAgICAgICAgICAgICAgcFhGQUFubm90ID0gcFdpZGdldEhhbmRlci0+TW92ZVRvTmV4dCgpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9meEFubm90QXJyYXkuQWRkKHBBbm5vdCk7Ci0KLSAgICAgICAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTG9hZChwQW5ub3QpOwotCi0gICAgICAgICAgICBwWEZBQW5ub3QgPSBwV2lkZ2V0SGFuZGVyLT5Nb3ZlVG9OZXh0KCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHBXaWRnZXRIYW5kZXItPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ1BERl9QYWdlKiBwUGFnZSA9IG1fcGFnZS0+R2V0UERGUGFnZSgpOwotICAgICAgICBBU1NFUlQocFBhZ2UgIT0gTlVMTCk7Ci0KLSAgICAgICAgRlhfQk9PTCBlbmFibGVBUFVwZGF0ZSA9IENQREZfSW50ZXJGb3JtOjpVcGRhdGluZ0FQRW5hYmxlZCgpOwotICAgICAgICAvL0Rpc2FibGUgdGhlIGRlZmF1bHQgQVAgY29uc3RydWN0aW9uLgotICAgICAgICBDUERGX0ludGVyRm9ybTo6RW5hYmxlVXBkYXRlQVAoRkFMU0UpOwotICAgICAgICBtX3BBbm5vdExpc3QgPSBuZXcgQ1BERl9Bbm5vdExpc3QocFBhZ2UpOwotICAgICAgICBDUERGX0ludGVyRm9ybTo6RW5hYmxlVXBkYXRlQVAoZW5hYmxlQVBVcGRhdGUpOwotCi0gICAgICAgIGludCBuQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPG5Db3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUERGX0Fubm90KiBwUERGQW5ub3QgPSBtX3BBbm5vdExpc3QtPkdldEF0KGkpOwotICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCAqIHBEb2MgPSBHZXRQREZEb2N1bWVudCgpOwotCi0gICAgICAgICAgICBDaGVja1VuU3VwcG9ydEFubm90KHBEb2MsIHBQREZBbm5vdCk7Ci0KLSAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHBBbm5vdEhhbmRsZXJNZ3ItPk5ld0Fubm90KHBQREZBbm5vdCwgdGhpcyk7Ci0gICAgICAgICAgICBpZighcEFubm90KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgbV9meEFubm90QXJyYXkuQWRkKHBBbm5vdCk7Ci0KLSAgICAgICAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTG9hZChwQW5ub3QpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgbV9wYWdlLT5SZWxlYXNlKCk7Ci0gICAgU2V0TG9jayhGQUxTRSk7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCAgICBDUERGU0RLX1BhZ2VWaWV3OjpVcGRhdGVSZWN0cyhDRlhfUmVjdEFycmF5JiByZWN0cykKLXsKLSAgICBmb3IoaW50IGk9MDsgaTxyZWN0cy5HZXRTaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICAgIENQREZfUmVjdCByYyA9IHJlY3RzLkdldEF0KGkpOwotICAgICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLSAgICAgICAgcEVudi0+RkZJX0ludmFsaWRhdGUobV9wYWdlLCByYy5sZWZ0LCByYy50b3AsIHJjLnJpZ2h0LCByYy5ib3R0b20pOwotICAgIH0KLX0KLQotdm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpVcGRhdGVWaWV3KENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLSAgICBDUERGX1JlY3QgcmNXaW5kb3cgPSBwQW5ub3QtPkdldFJlY3QoKTsKK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25LZXlEb3duKGludCBuS2V5Q29kZSwgaW50IG5GbGFnKSB7CisgIGlmIChDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBHZXRGb2N1c0Fubm90KCkpIHsKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLSAgICBwRW52LT5GRklfSW52YWxpZGF0ZSgKLSAgICAgICAgbV9wYWdlLCByY1dpbmRvdy5sZWZ0LCByY1dpbmRvdy50b3AsIHJjV2luZG93LnJpZ2h0LCByY1dpbmRvdy5ib3R0b20pOworICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisgICAgQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWcpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotaW50IENQREZTREtfUGFnZVZpZXc6OkdldFBhZ2VJbmRleCgpCi17Ci0gICAgaWYobV9wYWdlKQotICAgIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljID0gbV9wYWdlLT5HZXRQREZQYWdlKCktPm1fcEZvcm1EaWN0OwotICAgICAgICBDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gbV9wU0RLRG9jLT5HZXREb2N1bWVudCgpOwotICAgICAgICBpZihwRG9jICYmIHBEaWMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwRG9jLT5HZXRQREZEb2MoKS0+R2V0UGFnZUluZGV4KHBEaWMtPkdldE9iak51bSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTE7CitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uS2V5VXAoaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpIHsKKyAgLy8gIGlmKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IEdldEZvY3VzQW5ub3QoKSkKKyAgLy8gIHsKKyAgLy8gICAgICBDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBnX3BGb3JtRmlsbEFwcC0+R2V0SUZvcm1GaWxsZXIoKTsKKyAgLy8gICAgICByZXR1cm4gcElGb3JtRmlsbGVyLT5PbktleVVwKHBBbm5vdCwgbktleUNvZGUsIG5GbGFnKTsKKyAgLy8gIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6OklzVmFsaWRBbm5vdCh2b2lkKiBwKQotewotICAgIGlmIChwID09IE5VTEwpIHJldHVybiBGQUxTRTsKLSAgICBpbnQgaUNvdW50ID0gbV9wQW5ub3RMaXN0LT5Db3VudCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspCi0gICAgewotICAgICAgICBpZiAobV9wQW5ub3RMaXN0LT5HZXRBdChpKSA9PSBwKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CitleHRlcm4gdm9pZCBDaGVja1VuU3VwcG9ydEFubm90KENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQW5ub3QqIHBQREZBbm5vdCk7CisKK3ZvaWQgQ1BERlNES19QYWdlVmlldzo6TG9hZEZYQW5ub3RzKCkgeworICBBU1NFUlQobV9wYWdlICE9IE5VTEwpOworCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICBBU1NFUlQocEVudiAhPSBOVUxMKTsKKworICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICBBU1NFUlQocEFubm90SGFuZGxlck1nciAhPSBOVUxMKTsKKworICBTZXRMb2NrKFRSVUUpOworICBtX3BhZ2UtPkFkZFJlZigpOworICBpZiAobV9wU0RLRG9jLT5HZXREb2N1bWVudCgpLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9EWU5JTUlDX1hGQSkgeworICAgIElYRkFfUGFnZVZpZXcqIHBhZ2VWaWV3ID0gTlVMTDsKKyAgICBwYWdlVmlldyA9IG1fcGFnZS0+R2V0WEZBUGFnZVZpZXcoKTsKKyAgICBBU1NFUlQocGFnZVZpZXcgIT0gTlVMTCk7CisKKyAgICBJWEZBX1dpZGdldEl0ZXJhdG9yKiBwV2lkZ2V0SGFuZGVyID0gcGFnZVZpZXctPkNyZWF0ZVdpZGdldEl0ZXJhdG9yKAorICAgICAgICBYRkFfVFJBVkVSU0VXQVlfRm9ybSwgWEZBX1dJREdFVEZJTFRFUl9WaXNpYmxlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV0lER0VURklMVEVSX0FsbFR5cGUpOworICAgIGlmICghcFdpZGdldEhhbmRlcikgeworICAgICAgbV9wYWdlLT5SZWxlYXNlKCk7CisgICAgICBTZXRMb2NrKEZBTFNFKTsKKyAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBJWEZBX1dpZGdldCogcFhGQUFubm90ID0gcFdpZGdldEhhbmRlci0+TW92ZVRvTmV4dCgpOworICAgIHdoaWxlIChwWEZBQW5ub3QpIHsKKyAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHBBbm5vdEhhbmRsZXJNZ3ItPk5ld0Fubm90KHBYRkFBbm5vdCwgdGhpcyk7CisgICAgICBpZiAoIXBBbm5vdCkgeworICAgICAgICBwWEZBQW5ub3QgPSBwV2lkZ2V0SGFuZGVyLT5Nb3ZlVG9OZXh0KCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgbV9meEFubm90QXJyYXkuQWRkKHBBbm5vdCk7CisKKyAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTG9hZChwQW5ub3QpOworCisgICAgICBwWEZBQW5ub3QgPSBwV2lkZ2V0SGFuZGVyLT5Nb3ZlVG9OZXh0KCk7CisgICAgfQorCisgICAgcFdpZGdldEhhbmRlci0+UmVsZWFzZSgpOworICB9IGVsc2UgeworICAgIENQREZfUGFnZSogcFBhZ2UgPSBtX3BhZ2UtPkdldFBERlBhZ2UoKTsKKyAgICBBU1NFUlQocFBhZ2UgIT0gTlVMTCk7CisKKyAgICBGWF9CT09MIGVuYWJsZUFQVXBkYXRlID0gQ1BERl9JbnRlckZvcm06OlVwZGF0aW5nQVBFbmFibGVkKCk7CisgICAgLy8gRGlzYWJsZSB0aGUgZGVmYXVsdCBBUCBjb25zdHJ1Y3Rpb24uCisgICAgQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKEZBTFNFKTsKKyAgICBtX3BBbm5vdExpc3QgPSBuZXcgQ1BERl9Bbm5vdExpc3QocFBhZ2UpOworICAgIENQREZfSW50ZXJGb3JtOjpFbmFibGVVcGRhdGVBUChlbmFibGVBUFVwZGF0ZSk7CisKKyAgICBpbnQgbkNvdW50ID0gbV9wQW5ub3RMaXN0LT5Db3VudCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICAgIENQREZfQW5ub3QqIHBQREZBbm5vdCA9IG1fcEFubm90TGlzdC0+R2V0QXQoaSk7CisgICAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gR2V0UERGRG9jdW1lbnQoKTsKKworICAgICAgQ2hlY2tVblN1cHBvcnRBbm5vdChwRG9jLCBwUERGQW5ub3QpOworCisgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBwQW5ub3RIYW5kbGVyTWdyLT5OZXdBbm5vdChwUERGQW5ub3QsIHRoaXMpOworICAgICAgaWYgKCFwQW5ub3QpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgbV9meEFubm90QXJyYXkuQWRkKHBBbm5vdCk7CisKKyAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTG9hZChwQW5ub3QpOworICAgIH0KKyAgfQorICBtX3BhZ2UtPlJlbGVhc2UoKTsKKyAgU2V0TG9jayhGQUxTRSk7Cit9CisKK3ZvaWQgQ1BERlNES19QYWdlVmlldzo6VXBkYXRlUmVjdHMoQ0ZYX1JlY3RBcnJheSYgcmVjdHMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWN0cy5HZXRTaXplKCk7IGkrKykgeworICAgIENQREZfUmVjdCByYyA9IHJlY3RzLkdldEF0KGkpOworICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICAgIHBFbnYtPkZGSV9JbnZhbGlkYXRlKG1fcGFnZSwgcmMubGVmdCwgcmMudG9wLCByYy5yaWdodCwgcmMuYm90dG9tKTsKKyAgfQorfQorCit2b2lkIENQREZTREtfUGFnZVZpZXc6OlVwZGF0ZVZpZXcoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIENQREZfUmVjdCByY1dpbmRvdyA9IHBBbm5vdC0+R2V0UmVjdCgpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgcEVudi0+RkZJX0ludmFsaWRhdGUobV9wYWdlLCByY1dpbmRvdy5sZWZ0LCByY1dpbmRvdy50b3AsIHJjV2luZG93LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICByY1dpbmRvdy5ib3R0b20pOworfQorCitpbnQgQ1BERlNES19QYWdlVmlldzo6R2V0UGFnZUluZGV4KCkgeworICBpZiAobV9wYWdlKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljID0gbV9wYWdlLT5HZXRQREZQYWdlKCktPm1fcEZvcm1EaWN0OworICAgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBtX3BTREtEb2MtPkdldERvY3VtZW50KCk7CisgICAgaWYgKHBEb2MgJiYgcERpYykgeworICAgICAgcmV0dXJuIHBEb2MtPkdldFBERkRvYygpLT5HZXRQYWdlSW5kZXgocERpYy0+R2V0T2JqTnVtKCkpOworICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6SXNWYWxpZEFubm90KHZvaWQqIHApIHsKKyAgaWYgKHAgPT0gTlVMTCkKICAgICByZXR1cm4gRkFMU0U7CisgIGludCBpQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICBpZiAobV9wQW5ub3RMaXN0LT5HZXRBdChpKSA9PSBwKQorICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi0KLUNQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldEZvY3VzQW5ub3QoKQotewotICAgIENQREZTREtfQW5ub3QqIHBGb2N1c0Fubm90ID0gbV9wU0RLRG9jLT5HZXRGb2N1c0Fubm90KCk7Ci0gICAgaWYoIXBGb2N1c0Fubm90KQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGZvcihpbnQgaT0wOyBpPG1fZnhBbm5vdEFycmF5LkdldFNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gKENQREZTREtfQW5ub3QqKW1fZnhBbm5vdEFycmF5LkdldEF0KGkpOwotICAgICAgICBpZihwQW5ub3QgPT0gcEZvY3VzQW5ub3QpCi0gICAgICAgICAgICByZXR1cm4gcEFubm90OwotICAgIH0KK0NQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldEZvY3VzQW5ub3QoKSB7CisgIENQREZTREtfQW5ub3QqIHBGb2N1c0Fubm90ID0gbV9wU0RLRG9jLT5HZXRGb2N1c0Fubm90KCk7CisgIGlmICghcEZvY3VzQW5ub3QpCiAgICAgcmV0dXJuIE5VTEw7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2Z4QW5ub3RBcnJheS5HZXRTaXplKCk7IGkrKykgeworICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IChDUERGU0RLX0Fubm90KiltX2Z4QW5ub3RBcnJheS5HZXRBdChpKTsKKyAgICBpZiAocEFubm90ID09IHBGb2N1c0Fubm90KQorICAgICAgcmV0dXJuIHBBbm5vdDsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfcmVuZGVyY29udGV4dC5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX3JlbmRlcmNvbnRleHQuY3BwCmluZGV4IGY5NmRiOTQuLjEzMjA4MjQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfcmVuZGVyY29udGV4dC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19yZW5kZXJjb250ZXh0LmNwcApAQCAtNiw0MiArNiwzOSBAQAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX3JlbmRlcmNvbnRleHQuaCIKIAotdm9pZCBDUmVuZGVyQ29udGV4dDo6Q2xlYXIoKQotewotICAgIG1fcERldmljZSA9IE5VTEw7Ci0gICAgbV9wQ29udGV4dCA9IE5VTEw7Ci0gICAgbV9wUmVuZGVyZXIgPSBOVUxMOwotICAgIG1fcEFubm90cyA9IE5VTEw7Ci0gICAgbV9wT3B0aW9ucyAgPSBOVUxMOwordm9pZCBDUmVuZGVyQ29udGV4dDo6Q2xlYXIoKSB7CisgIG1fcERldmljZSA9IE5VTEw7CisgIG1fcENvbnRleHQgPSBOVUxMOworICBtX3BSZW5kZXJlciA9IE5VTEw7CisgIG1fcEFubm90cyA9IE5VTEw7CisgIG1fcE9wdGlvbnMgPSBOVUxMOwogI2lmZGVmIF9XSU4zMl9XQ0UKLSAgICBtX3BCaXRtYXAgPSBOVUxMOwotICAgIG1faEJpdG1hcCA9IE5VTEw7CisgIG1fcEJpdG1hcCA9IE5VTEw7CisgIG1faEJpdG1hcCA9IE5VTEw7CiAjZW5kaWYKIH0KIAotQ1JlbmRlckNvbnRleHQ6On5DUmVuZGVyQ29udGV4dCgpCi17Ci0gICAgZGVsZXRlIG1fcFJlbmRlcmVyOwotICAgIGRlbGV0ZSBtX3BDb250ZXh0OwotICAgIGRlbGV0ZSBtX3BEZXZpY2U7Ci0gICAgZGVsZXRlIG1fcEFubm90czsKLSAgICBkZWxldGUgbV9wT3B0aW9ucy0+bV9wT0NDb250ZXh0OwotICAgIGRlbGV0ZSBtX3BPcHRpb25zOworQ1JlbmRlckNvbnRleHQ6On5DUmVuZGVyQ29udGV4dCgpIHsKKyAgZGVsZXRlIG1fcFJlbmRlcmVyOworICBkZWxldGUgbV9wQ29udGV4dDsKKyAgZGVsZXRlIG1fcERldmljZTsKKyAgZGVsZXRlIG1fcEFubm90czsKKyAgZGVsZXRlIG1fcE9wdGlvbnMtPm1fcE9DQ29udGV4dDsKKyAgZGVsZXRlIG1fcE9wdGlvbnM7CiAjaWZkZWYgX1dJTjMyX1dDRQotICAgIGRlbGV0ZSBtX3BCaXRtYXA7Ci0gICAgaWYgKG1faEJpdG1hcCkgRGVsZXRlT2JqZWN0KG1faEJpdG1hcCk7CisgIGRlbGV0ZSBtX3BCaXRtYXA7CisgIGlmIChtX2hCaXRtYXApCisgICAgRGVsZXRlT2JqZWN0KG1faEJpdG1hcCk7CiAjZW5kaWYKIH0KIAotSUZTREtfUEFVU0VfQWRhcHRlcjo6SUZTREtfUEFVU0VfQWRhcHRlcihJRlNES19QQVVTRSogSVBhdXNlICkKLXsKLSAgICBtX0lQYXVzZSA9IElQYXVzZTsKK0lGU0RLX1BBVVNFX0FkYXB0ZXI6OklGU0RLX1BBVVNFX0FkYXB0ZXIoSUZTREtfUEFVU0UqIElQYXVzZSkgeworICBtX0lQYXVzZSA9IElQYXVzZTsKIH0KIAotRlhfQk9PTCBJRlNES19QQVVTRV9BZGFwdGVyOjpOZWVkVG9QYXVzZU5vdygpCi17Ci0gICAgaWYgKG1fSVBhdXNlLT5OZWVkVG9QYXVzZU5vdykgewotICAgICAgICByZXR1cm4gbV9JUGF1c2UtPk5lZWRUb1BhdXNlTm93KG1fSVBhdXNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBJRlNES19QQVVTRV9BZGFwdGVyOjpOZWVkVG9QYXVzZU5vdygpIHsKKyAgaWYgKG1fSVBhdXNlLT5OZWVkVG9QYXVzZU5vdykgeworICAgIHJldHVybiBtX0lQYXVzZS0+TmVlZFRvUGF1c2VOb3cobV9JUGF1c2UpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2FwLmNwcCBiL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2FwLmNwcAppbmRleCAzMDlhOThmLi5iOTkwMGQ4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9hcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfYXAuY3BwCkBAIC04LDIxOCArOCwyMDYgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgiCiAKLUNGWF9CeXRlU3RyaW5nIEdldFBERldvcmRTdHJpbmcoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwLCBpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgV29yZCwgRlhfV09SRCBTdWJXb3JkKQotewotCUFTU0VSVCAocEZvbnRNYXAgIT0gTlVMTCk7CitDRlhfQnl0ZVN0cmluZyBHZXRQREZXb3JkU3RyaW5nKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBTdWJXb3JkKSB7CisgIEFTU0VSVChwRm9udE1hcCAhPSBOVUxMKTsKIAotCUNGWF9CeXRlU3RyaW5nIHNXb3JkOworICBDRlhfQnl0ZVN0cmluZyBzV29yZDsKIAotCWlmIChDUERGX0ZvbnQgKiBwUERGRm9udCA9IHBGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKQotCXsKLQkJaWYgKFN1YldvcmQgPiAwKQotCQl7Ci0JCQlXb3JkID0gU3ViV29yZDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZYX0RXT1JEIGR3Q2hhckNvZGUgPSAtMTsKKyAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkgeworICAgIGlmIChTdWJXb3JkID4gMCkgeworICAgICAgV29yZCA9IFN1YldvcmQ7CisgICAgfSBlbHNlIHsKKyAgICAgIEZYX0RXT1JEIGR3Q2hhckNvZGUgPSAtMTsKIAotCQkJaWYgKHBQREZGb250LT5Jc1VuaWNvZGVDb21wYXRpYmxlKCkpCi0JCQkJZHdDaGFyQ29kZSA9IHBQREZGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKFdvcmQpOwotCQkJZWxzZQotCQkJCWR3Q2hhckNvZGUgPSBwRm9udE1hcC0+Q2hhckNvZGVGcm9tVW5pY29kZShuRm9udEluZGV4LCBXb3JkKTsKKyAgICAgIGlmIChwUERGRm9udC0+SXNVbmljb2RlQ29tcGF0aWJsZSgpKQorICAgICAgICBkd0NoYXJDb2RlID0gcFBERkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUoV29yZCk7CisgICAgICBlbHNlCisgICAgICAgIGR3Q2hhckNvZGUgPSBwRm9udE1hcC0+Q2hhckNvZGVGcm9tVW5pY29kZShuRm9udEluZGV4LCBXb3JkKTsKIAotCQkJaWYgKGR3Q2hhckNvZGUgPiAwICkKLQkJCXsKLQkJCQlwUERGRm9udC0+QXBwZW5kQ2hhcihzV29yZCwgZHdDaGFyQ29kZSk7Ci0JCQkJcmV0dXJuIHNXb3JkOwotCQkJfQotCQl9CisgICAgICBpZiAoZHdDaGFyQ29kZSA+IDApIHsKKyAgICAgICAgcFBERkZvbnQtPkFwcGVuZENoYXIoc1dvcmQsIGR3Q2hhckNvZGUpOworICAgICAgICByZXR1cm4gc1dvcmQ7CisgICAgICB9CisgICAgfQogCi0JCXBQREZGb250LT5BcHBlbmRDaGFyKHNXb3JkLCBXb3JkKTsKLQl9CisgICAgcFBERkZvbnQtPkFwcGVuZENoYXIoc1dvcmQsIFdvcmQpOworICB9CiAKLQlyZXR1cm4gc1dvcmQ7CisgIHJldHVybiBzV29yZDsKIH0KIAotc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldFdvcmRSZW5kZXJTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJiBzdHJXb3JkcykKLXsKLQlpZiAoc3RyV29yZHMuR2V0TGVuZ3RoKCkgPiAwKQotCQlyZXR1cm4gUERGX0VuY29kZVN0cmluZyhzdHJXb3JkcykgKyAiIFRqXG4iOworc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldFdvcmRSZW5kZXJTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cldvcmRzKSB7CisgIGlmIChzdHJXb3Jkcy5HZXRMZW5ndGgoKSA+IDApCisgICAgcmV0dXJuIFBERl9FbmNvZGVTdHJpbmcoc3RyV29yZHMpICsgIiBUalxuIjsKIAotCXJldHVybiAiIjsKKyAgcmV0dXJuICIiOwogfQogCi1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0Rm9udFNldFN0cmluZyhJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAsIGludDMyX3QgbkZvbnRJbmRleCwgRlhfRkxPQVQgZkZvbnRTaXplKQotewotCUNGWF9CeXRlVGV4dEJ1ZiBzUmV0Oworc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEZvbnRTZXRTdHJpbmcoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CiAKLQlpZiAocEZvbnRNYXApCi0JewotCQlDRlhfQnl0ZVN0cmluZyBzRm9udEFsaWFzID0gcEZvbnRNYXAtPkdldFBERkZvbnRBbGlhcyhuRm9udEluZGV4KTsKKyAgaWYgKHBGb250TWFwKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRBbGlhcyA9IHBGb250TWFwLT5HZXRQREZGb250QWxpYXMobkZvbnRJbmRleCk7CiAKLQkJaWYgKHNGb250QWxpYXMuR2V0TGVuZ3RoKCkgPiAwICYmIGZGb250U2l6ZSA+IDAgKQotCQkJc1JldCA8PCAiLyIgPDwgc0ZvbnRBbGlhcyA8PCAiICIgPDwgZkZvbnRTaXplIDw8ICIgVGZcbiI7Ci0JfQorICAgIGlmIChzRm9udEFsaWFzLkdldExlbmd0aCgpID4gMCAmJiBmRm9udFNpemUgPiAwKQorICAgICAgc1JldCA8PCAiLyIgPDwgc0ZvbnRBbGlhcyA8PCAiICIgPDwgZkZvbnRTaXplIDw8ICIgVGZcbiI7CisgIH0KIAotCXJldHVybiBzUmV0LkdldEJ5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIHNSZXQuR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBJRlhfRWRpdDo6R2V0RWRpdEFwcGVhcmFuY2VTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsCi0JCQkJCQkJCQkJCQkgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UgLyogPSBOVUxMKi8sIEZYX0JPT0wgYkNvbnRpbnVvdXMvKiA9IFRSVUUqLywgRlhfV09SRCBTdWJXb3JkLyogPSAwKi8pCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNFZGl0U3RyZWFtLCBzV29yZHM7CitDRlhfQnl0ZVN0cmluZyBJRlhfRWRpdDo6R2V0RWRpdEFwcGVhcmFuY2VTdHJlYW0oCisgICAgSUZYX0VkaXQqIHBFZGl0LAorICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgLyogPSBOVUxMKi8sCisgICAgRlhfQk9PTCBiQ29udGludW91cyAvKiA9IFRSVUUqLywKKyAgICBGWF9XT1JEIFN1YldvcmQgLyogPSAwKi8pIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNFZGl0U3RyZWFtLCBzV29yZHM7CiAKLQlDUERGX1BvaW50IHB0T2xkKDAuMGYsMC4wZikscHROZXcoMC4wZiwwLjBmKTsKLQlpbnQzMl90IG5DdXJGb250SW5kZXggPSAtMTsKKyAgQ1BERl9Qb2ludCBwdE9sZCgwLjBmLCAwLjBmKSwgcHROZXcoMC4wZiwgMC4wZik7CisgIGludDMyX3QgbkN1ckZvbnRJbmRleCA9IC0xOwogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCWlmIChwUmFuZ2UpCi0JCQlwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOwotCQllbHNlCi0JCQlwSXRlcmF0b3ItPlNldEF0KDApOworICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgaWYgKHBSYW5nZSkKKyAgICAgIHBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7CisgICAgZWxzZQorICAgICAgcEl0ZXJhdG9yLT5TZXRBdCgwKTsKIAotCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKKyAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKIAotCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQotCQl7Ci0JCQlDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKIAotCQkJaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApIGJyZWFrOworICAgICAgaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApCisgICAgICAgIGJyZWFrOwogCi0JCQlpZiAoYkNvbnRpbnVvdXMpCi0JCQl7Ci0JCQkJaWYgKHBsYWNlLkxpbmVDbXAob2xkcGxhY2UpICE9IDApCi0JCQkJewotCQkJCQlpZiAoc1dvcmRzLkdldFNpemUoKSA+IDApCi0JCQkJCXsKLQkJCQkJCXNFZGl0U3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoc1dvcmRzLkdldEJ5dGVTdHJpbmcoKSk7Ci0JCQkJCQlzV29yZHMuQ2xlYXIoKTsKLQkJCQkJfQorICAgICAgaWYgKGJDb250aW51b3VzKSB7CisgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKG9sZHBsYWNlKSAhPSAwKSB7CisgICAgICAgICAgaWYgKHNXb3Jkcy5HZXRTaXplKCkgPiAwKSB7CisgICAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKHNXb3Jkcy5HZXRCeXRlU3RyaW5nKCkpOworICAgICAgICAgICAgc1dvcmRzLkNsZWFyKCk7CisgICAgICAgICAgfQogCi0JCQkJCUNQVlRfV29yZCB3b3JkOwotCQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCQl7Ci0JCQkJCQlwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNQVlRfTGluZSBsaW5lOwotCQkJCQkJcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOwotCQkJCQkJcHROZXcgPSBDUERGX1BvaW50KGxpbmUucHRMaW5lLnggKyBwdE9mZnNldC54LCBsaW5lLnB0TGluZS55ICsgcHRPZmZzZXQueSk7Ci0JCQkJCX0KKyAgICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgICBwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5wdFdvcmQueSArIHB0T2Zmc2V0LnkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDUFZUX0xpbmUgbGluZTsKKyAgICAgICAgICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5lKTsKKyAgICAgICAgICAgIHB0TmV3ID0gQ1BERl9Qb2ludChsaW5lLnB0TGluZS54ICsgcHRPZmZzZXQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnB0TGluZS55ICsgcHRPZmZzZXQueSk7CisgICAgICAgICAgfQogCi0JCQkJCWlmIChwdE5ldy54ICE9IHB0T2xkLnggfHwgcHROZXcueSAhPSBwdE9sZC55KQotCQkJCQl7Ci0JCQkJCQlzRWRpdFN0cmVhbSA8PCBwdE5ldy54IC0gcHRPbGQueCA8PCAiICIgPDwgcHROZXcueSAtIHB0T2xkLnkgPDwgIiBUZFxuIjsKKyAgICAgICAgICBpZiAocHROZXcueCAhPSBwdE9sZC54IHx8IHB0TmV3LnkgIT0gcHRPbGQueSkgeworICAgICAgICAgICAgc0VkaXRTdHJlYW0gPDwgcHROZXcueCAtIHB0T2xkLnggPDwgIiAiIDw8IHB0TmV3LnkgLSBwdE9sZC55CisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFRkXG4iOwogCi0JCQkJCQlwdE9sZCA9IHB0TmV3OwotCQkJCQl9Ci0JCQkJfQorICAgICAgICAgICAgcHRPbGQgPSBwdE5ldzsKKyAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJCUNQVlRfV29yZCB3b3JkOwotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCQkJewotCQkJCQlpZiAod29yZC5uRm9udEluZGV4ICE9IG5DdXJGb250SW5kZXgpCi0JCQkJCXsKLQkJCQkJCWlmIChzV29yZHMuR2V0U2l6ZSgpID4gMCkKLQkJCQkJCXsKLQkJCQkJCQlzRWRpdFN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKHNXb3Jkcy5HZXRCeXRlU3RyaW5nKCkpOwotCQkJCQkJCXNXb3Jkcy5DbGVhcigpOwotCQkJCQkJfQotCQkJCQkJc0VkaXRTdHJlYW0gPDwgR2V0Rm9udFNldFN0cmluZyhwRWRpdC0+R2V0Rm9udE1hcCgpLHdvcmQubkZvbnRJbmRleCx3b3JkLmZGb250U2l6ZSk7Ci0JCQkJCQluQ3VyRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OwotCQkJCQl9CisgICAgICAgIENQVlRfV29yZCB3b3JkOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgaWYgKHdvcmQubkZvbnRJbmRleCAhPSBuQ3VyRm9udEluZGV4KSB7CisgICAgICAgICAgICBpZiAoc1dvcmRzLkdldFNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgc0VkaXRTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhzV29yZHMuR2V0Qnl0ZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgc1dvcmRzLkNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRGb250U2V0U3RyaW5nKHBFZGl0LT5HZXRGb250TWFwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQubkZvbnRJbmRleCwgd29yZC5mRm9udFNpemUpOworICAgICAgICAgICAgbkN1ckZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKKyAgICAgICAgICB9CiAKLQkJCQkJc1dvcmRzIDw8IEdldFBERldvcmRTdHJpbmcocEVkaXQtPkdldEZvbnRNYXAoKSxuQ3VyRm9udEluZGV4LHdvcmQuV29yZCxTdWJXb3JkKTsKLQkJCQl9CisgICAgICAgICAgc1dvcmRzIDw8IEdldFBERldvcmRTdHJpbmcocEVkaXQtPkdldEZvbnRNYXAoKSwgbkN1ckZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLldvcmQsIFN1YldvcmQpOworICAgICAgICB9CiAKLQkJCQlvbGRwbGFjZSA9IHBsYWNlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUNQVlRfV29yZCB3b3JkOwotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCQkJewotCQkJCQlwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KTsKKyAgICAgICAgb2xkcGxhY2UgPSBwbGFjZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENQVlRfV29yZCB3b3JkOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgcHROZXcgPSBDUERGX1BvaW50KHdvcmQucHRXb3JkLnggKyBwdE9mZnNldC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC55ICsgcHRPZmZzZXQueSk7CiAKLQkJCQkJaWYgKHB0TmV3LnggIT0gcHRPbGQueCB8fCBwdE5ldy55ICE9IHB0T2xkLnkpCi0JCQkJCXsKLQkJCQkJCXNFZGl0U3RyZWFtIDw8IHB0TmV3LnggLSBwdE9sZC54IDw8ICIgIiA8PCBwdE5ldy55IC0gcHRPbGQueSA8PCAiIFRkXG4iOwotCQkJCQkJcHRPbGQgPSBwdE5ldzsKLQkJCQkJfQorICAgICAgICAgIGlmIChwdE5ldy54ICE9IHB0T2xkLnggfHwgcHROZXcueSAhPSBwdE9sZC55KSB7CisgICAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBwdE5ldy54IC0gcHRPbGQueCA8PCAiICIgPDwgcHROZXcueSAtIHB0T2xkLnkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgVGRcbiI7CisgICAgICAgICAgICBwdE9sZCA9IHB0TmV3OworICAgICAgICAgIH0KIAotCQkJCQlpZiAod29yZC5uRm9udEluZGV4ICE9IG5DdXJGb250SW5kZXgpCi0JCQkJCXsKLQkJCQkJCXNFZGl0U3RyZWFtIDw8IEdldEZvbnRTZXRTdHJpbmcocEVkaXQtPkdldEZvbnRNYXAoKSx3b3JkLm5Gb250SW5kZXgsd29yZC5mRm9udFNpemUpOwotCQkJCQkJbkN1ckZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKLQkJCQkJfQorICAgICAgICAgIGlmICh3b3JkLm5Gb250SW5kZXggIT0gbkN1ckZvbnRJbmRleCkgeworICAgICAgICAgICAgc0VkaXRTdHJlYW0gPDwgR2V0Rm9udFNldFN0cmluZyhwRWRpdC0+R2V0Rm9udE1hcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLm5Gb250SW5kZXgsIHdvcmQuZkZvbnRTaXplKTsKKyAgICAgICAgICAgIG5DdXJGb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7CisgICAgICAgICAgfQogCi0JCQkJCXNFZGl0U3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoR2V0UERGV29yZFN0cmluZyhwRWRpdC0+R2V0Rm9udE1hcCgpLG5DdXJGb250SW5kZXgsd29yZC5Xb3JkLFN1YldvcmQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKEdldFBERldvcmRTdHJpbmcoCisgICAgICAgICAgICAgIHBFZGl0LT5HZXRGb250TWFwKCksIG5DdXJGb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQogCi0JCWlmIChzV29yZHMuR2V0U2l6ZSgpID4gMCkKLQkJewotCQkJc0VkaXRTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhzV29yZHMuR2V0Qnl0ZVN0cmluZygpKTsKLQkJCXNXb3Jkcy5DbGVhcigpOwotCQl9Ci0JfQorICAgIGlmIChzV29yZHMuR2V0U2l6ZSgpID4gMCkgeworICAgICAgc0VkaXRTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhzV29yZHMuR2V0Qnl0ZVN0cmluZygpKTsKKyAgICAgIHNXb3Jkcy5DbGVhcigpOworICAgIH0KKyAgfQogCi0JQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07Ci0JaWYgKHNFZGl0U3RyZWFtLkdldFNpemUoKSA+IDApCi0JewotCQlpbnQzMl90IG5Ib3J6U2NhbGUgPSBwRWRpdC0+R2V0SG9yelNjYWxlKCk7Ci0JCWlmIChuSG9yelNjYWxlICE9IDEwMCkKLQkJewotCQkJc0FwcFN0cmVhbSA8PCBuSG9yelNjYWxlIDw8ICIgVHpcbiI7Ci0JCX0KKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CisgIGlmIChzRWRpdFN0cmVhbS5HZXRTaXplKCkgPiAwKSB7CisgICAgaW50MzJfdCBuSG9yelNjYWxlID0gcEVkaXQtPkdldEhvcnpTY2FsZSgpOworICAgIGlmIChuSG9yelNjYWxlICE9IDEwMCkgeworICAgICAgc0FwcFN0cmVhbSA8PCBuSG9yelNjYWxlIDw8ICIgVHpcbiI7CisgICAgfQogCi0JCUZYX0ZMT0FUIGZDaGFyU3BhY2UgPSBwRWRpdC0+R2V0Q2hhclNwYWNlKCk7Ci0JCWlmICghRlhfRURJVF9Jc0Zsb2F0WmVybyhmQ2hhclNwYWNlKSkKLQkJewotCQkJc0FwcFN0cmVhbSA8PCBmQ2hhclNwYWNlIDw8ICIgVGNcbiI7Ci0JCX0KKyAgICBGWF9GTE9BVCBmQ2hhclNwYWNlID0gcEVkaXQtPkdldENoYXJTcGFjZSgpOworICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0WmVybyhmQ2hhclNwYWNlKSkgeworICAgICAgc0FwcFN0cmVhbSA8PCBmQ2hhclNwYWNlIDw8ICIgVGNcbiI7CisgICAgfQogCi0JCXNBcHBTdHJlYW0gPDwgc0VkaXRTdHJlYW07Ci0JfQorICAgIHNBcHBTdHJlYW0gPDwgc0VkaXRTdHJlYW07CisgIH0KIAotCXJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIHNBcHBTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBJRlhfRWRpdDo6R2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShJRlhfRWRpdCogcEVkaXQsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwKLQkJCQkJCQljb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSAvKj0gTlVMTCovKQotewotCUNGWF9CeXRlVGV4dEJ1ZiBzUmV0OworQ0ZYX0J5dGVTdHJpbmcgSUZYX0VkaXQ6OkdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0oCisgICAgSUZYX0VkaXQqIHBFZGl0LAorICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgLyo9IE5VTEwqLykgeworICBDRlhfQnl0ZVRleHRCdWYgc1JldDsKIAotCWlmIChwUmFuZ2UgJiYgcFJhbmdlLT5Jc0V4aXN0KCkpCi0JewotCQlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKQotCQl7Ci0JCQlwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOworICBpZiAocFJhbmdlICYmIHBSYW5nZS0+SXNFeGlzdCgpKSB7CisgICAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKIAotCQkJd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLQkJCXsKLQkJCQlDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CiAKLQkJCQlpZiAocFJhbmdlICYmIHBsYWNlLldvcmRDbXAocFJhbmdlLT5FbmRQb3MpID4gMCkgYnJlYWs7CisgICAgICAgIGlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKQorICAgICAgICAgIGJyZWFrOwogCi0JCQkJQ1BWVF9Xb3JkIHdvcmQ7Ci0JCQkJQ1BWVF9MaW5lIGxpbmU7Ci0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSAmJiBwSXRlcmF0b3ItPkdldExpbmUobGluZSkpCi0JCQkJewotCQkJCQkvL0NQREZfUmVjdCByY1dvcmRTZWwgPSBDUERGX1JlY3Qod29yZC5wdFdvcmQueCxsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZURlc2NlbnQsCi0JCQkJCS8vCQl3b3JkLnB0V29yZC54K3dvcmQuZldpZHRoLGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50KTsKKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpICYmIHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkgeworICAgICAgICAgIC8vIENQREZfUmVjdCByY1dvcmRTZWwgPSBDUERGX1JlY3Qod29yZC5wdFdvcmQueCxsaW5lLnB0TGluZS55ICsKKyAgICAgICAgICAvLyBsaW5lLmZMaW5lRGVzY2VudCwKKyAgICAgICAgICAvLwkJd29yZC5wdFdvcmQueCt3b3JkLmZXaWR0aCxsaW5lLnB0TGluZS55ICsKKyAgICAgICAgICAvL2xpbmUuZkxpbmVBc2NlbnQpOwogCi0JCQkJCXNSZXQgPDwgd29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LnggPDwgIiAiIDw8IGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudAotCQkJCQkJPDwgIiAiIDw8IHdvcmQuZldpZHRoIDw8ICIgIiA8PCBsaW5lLmZMaW5lQXNjZW50IC0gbGluZS5mTGluZURlc2NlbnQgPDwgIiByZVxuZlxuIjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgc1JldCA8PCB3b3JkLnB0V29yZC54ICsgcHRPZmZzZXQueCA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudCA8PCAiICIgPDwgd29yZC5mV2lkdGggPDwgIiAiCisgICAgICAgICAgICAgICA8PCBsaW5lLmZMaW5lQXNjZW50IC0gbGluZS5mTGluZURlc2NlbnQgPDwgIiByZVxuZlxuIjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogCi0JcmV0dXJuIHNSZXQuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2VkaXQuY3BwIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAKaW5kZXggNjMxMTVjMi4uZWZlZjJjYSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAKQEAgLTcsMTQ5NSArNywxMzEyIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9zdHViLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgiCiAKLSNkZWZpbmUgRlhfRURJVF9VTkRPX01BWElURU0gICAgICAgICAgICAgICAgMTAwMDAKKyNkZWZpbmUgRlhfRURJVF9VTkRPX01BWElURU0gMTAwMDAKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfRWRpdF9JdGVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X0l0ZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCi1DRlhfRWRpdF9JdGVyYXRvcjo6Q0ZYX0VkaXRfSXRlcmF0b3IoQ0ZYX0VkaXQgKiBwRWRpdCxJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBWVEl0ZXJhdG9yKSA6Ci0gICAgbV9wRWRpdChwRWRpdCksCi0gICAgbV9wVlRJdGVyYXRvcihwVlRJdGVyYXRvcikKLXsKK0NGWF9FZGl0X0l0ZXJhdG9yOjpDRlhfRWRpdF9JdGVyYXRvcihDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBWVEl0ZXJhdG9yKQorICAgIDogbV9wRWRpdChwRWRpdCksIG1fcFZUSXRlcmF0b3IocFZUSXRlcmF0b3IpIHt9CisKK0NGWF9FZGl0X0l0ZXJhdG9yOjp+Q0ZYX0VkaXRfSXRlcmF0b3IoKSB7fQorCitGWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpOZXh0V29yZCgpIHsKKyAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPk5leHRXb3JkKCk7CiB9CiAKLUNGWF9FZGl0X0l0ZXJhdG9yOjp+Q0ZYX0VkaXRfSXRlcmF0b3IoKQoteworRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dExpbmUoKSB7CisgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5OZXh0TGluZSgpOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpOZXh0V29yZCgpCi17Ci0gICAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPk5leHRXb3JkKCk7CitGWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpOZXh0U2VjdGlvbigpIHsKKyAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPk5leHRTZWN0aW9uKCk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6Ok5leHRMaW5lKCkKLXsKLSAgICByZXR1cm4gbV9wVlRJdGVyYXRvci0+TmV4dExpbmUoKTsKK0ZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZXb3JkKCkgeworICByZXR1cm4gbV9wVlRJdGVyYXRvci0+UHJldldvcmQoKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dFNlY3Rpb24oKQotewotICAgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5OZXh0U2VjdGlvbigpOworRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6UHJldkxpbmUoKSB7CisgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5QcmV2TGluZSgpOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpQcmV2V29yZCgpCi17Ci0gICAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPlByZXZXb3JkKCk7CitGWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpQcmV2U2VjdGlvbigpIHsKKyAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPlByZXZTZWN0aW9uKCk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZMaW5lKCkKLXsKLSAgICByZXR1cm4gbV9wVlRJdGVyYXRvci0+UHJldkxpbmUoKTsKK0ZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFdvcmQoQ1BWVF9Xb3JkJiB3b3JkKSBjb25zdCB7CisgIEFTU0VSVChtX3BFZGl0KTsKKworICBpZiAobV9wVlRJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgIHdvcmQucHRXb3JkID0gbV9wRWRpdC0+VlRUb0VkaXQod29yZC5wdFdvcmQpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6UHJldlNlY3Rpb24oKQotewotICAgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5QcmV2U2VjdGlvbigpOworRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6R2V0TGluZShDUFZUX0xpbmUmIGxpbmUpIGNvbnN0IHsKKyAgQVNTRVJUKG1fcEVkaXQpOworCisgIGlmIChtX3BWVEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKSB7CisgICAgbGluZS5wdExpbmUgPSBtX3BFZGl0LT5WVFRvRWRpdChsaW5lLnB0TGluZSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcEVkaXQpOworRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6R2V0U2VjdGlvbihDUFZUX1NlY3Rpb24mIHNlY3Rpb24pIGNvbnN0IHsKKyAgQVNTRVJUKG1fcEVkaXQpOwogCi0gICAgaWYgKG1fcFZUSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0gICAgewotICAgICAgICB3b3JkLnB0V29yZCA9IG1fcEVkaXQtPlZUVG9FZGl0KHdvcmQucHRXb3JkKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKG1fcFZUSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjdGlvbikpIHsKKyAgICBzZWN0aW9uLnJjU2VjdGlvbiA9IG1fcEVkaXQtPlZUVG9FZGl0KHNlY3Rpb24ucmNTZWN0aW9uKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldExpbmUoQ1BWVF9MaW5lICYgbGluZSkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wRWRpdCk7Ci0KLSAgICBpZiAobV9wVlRJdGVyYXRvci0+R2V0TGluZShsaW5lKSkKLSAgICB7Ci0gICAgICAgIGxpbmUucHRMaW5lID0gbV9wRWRpdC0+VlRUb0VkaXQobGluZS5wdExpbmUpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwordm9pZCBDRlhfRWRpdF9JdGVyYXRvcjo6U2V0QXQoaW50MzJfdCBuV29yZEluZGV4KSB7CisgIG1fcFZUSXRlcmF0b3ItPlNldEF0KG5Xb3JkSW5kZXgpOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcEVkaXQpOwotCi0gICAgaWYgKG1fcFZUSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjdGlvbikpCi0gICAgewotICAgICAgICBzZWN0aW9uLnJjU2VjdGlvbiA9IG1fcEVkaXQtPlZUVG9FZGl0KHNlY3Rpb24ucmNTZWN0aW9uKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKK3ZvaWQgQ0ZYX0VkaXRfSXRlcmF0b3I6OlNldEF0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgeworICBtX3BWVEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXRfSXRlcmF0b3I6OlNldEF0KGludDMyX3QgbldvcmRJbmRleCkKLXsKLSAgICBtX3BWVEl0ZXJhdG9yLT5TZXRBdChuV29yZEluZGV4KTsKK2NvbnN0IENQVlRfV29yZFBsYWNlJiBDRlhfRWRpdF9JdGVyYXRvcjo6R2V0QXQoKSBjb25zdCB7CisgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5HZXRBdCgpOwogfQogCi12b2lkIENGWF9FZGl0X0l0ZXJhdG9yOjpTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKQotewotICAgIG1fcFZUSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKK0lGWF9FZGl0KiBDRlhfRWRpdF9JdGVyYXRvcjo6R2V0RWRpdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEVkaXQ7CiB9CiAKLWNvbnN0IENQVlRfV29yZFBsYWNlICYgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldEF0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wVlRJdGVyYXRvci0+R2V0QXQoKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfRWRpdF9Qcm92aWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworQ0ZYX0VkaXRfUHJvdmlkZXI6OkNGWF9FZGl0X1Byb3ZpZGVyKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwKQorICAgIDogbV9wRm9udE1hcChwRm9udE1hcCkgeworICBBU1NFUlQobV9wRm9udE1hcCAhPSBOVUxMKTsKIH0KIAotSUZYX0VkaXQqIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRFZGl0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wRWRpdDsKK0NGWF9FZGl0X1Byb3ZpZGVyOjp+Q0ZYX0VkaXRfUHJvdmlkZXIoKSB7fQorCitJRlhfRWRpdF9Gb250TWFwKiBDRlhfRWRpdF9Qcm92aWRlcjo6R2V0Rm9udE1hcCgpIHsKKyAgcmV0dXJuIG1fcEZvbnRNYXA7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfRWRpdF9Qcm92aWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitpbnQzMl90IENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRDaGFyV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Xb3JkU3R5bGUpIHsKKyAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7CisgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSB3b3JkOwogCi1DRlhfRWRpdF9Qcm92aWRlcjo6Q0ZYX0VkaXRfUHJvdmlkZXIoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwKSA6IG1fcEZvbnRNYXAocEZvbnRNYXApCi17Ci0gICAgQVNTRVJUKG1fcEZvbnRNYXAgIT0gTlVMTCk7CisgICAgaWYgKHBQREZGb250LT5Jc1VuaWNvZGVDb21wYXRpYmxlKCkpCisgICAgICBjaGFyY29kZSA9IHBQREZGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdvcmQpOworICAgIGVsc2UKKyAgICAgIGNoYXJjb2RlID0gbV9wRm9udE1hcC0+Q2hhckNvZGVGcm9tVW5pY29kZShuRm9udEluZGV4LCB3b3JkKTsKKworICAgIGlmIChjaGFyY29kZSAhPSAtMSkKKyAgICAgIHJldHVybiBwUERGRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyY29kZSk7CisgIH0KKworICByZXR1cm4gMDsKIH0KIAotQ0ZYX0VkaXRfUHJvdmlkZXI6On5DRlhfRWRpdF9Qcm92aWRlcigpCi17CitpbnQzMl90IENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRUeXBlQXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgeworICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCkpCisgICAgcmV0dXJuIHBQREZGb250LT5HZXRUeXBlQXNjZW50KCk7CisKKyAgcmV0dXJuIDA7CiB9CiAKLUlGWF9FZGl0X0ZvbnRNYXAqIENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRGb250TWFwKCkKLXsKLSAgICByZXR1cm4gbV9wRm9udE1hcDsKK2ludDMyX3QgQ0ZYX0VkaXRfUHJvdmlkZXI6OkdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgeworICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCkpCisgICAgcmV0dXJuIHBQREZGb250LT5HZXRUeXBlRGVzY2VudCgpOworCisgIHJldHVybiAwOwogfQogCi1pbnQzMl90IENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRDaGFyV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQsIGludDMyX3QgbldvcmRTdHlsZSkKLXsKLSAgICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCkpCi0gICAgewotICAgICAgICBGWF9EV09SRCBjaGFyY29kZSA9IHdvcmQ7Ci0KLSAgICAgICAgaWYgKHBQREZGb250LT5Jc1VuaWNvZGVDb21wYXRpYmxlKCkpCi0gICAgICAgICAgICBjaGFyY29kZSA9IHBQREZGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdvcmQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjaGFyY29kZSA9IG1fcEZvbnRNYXAtPkNoYXJDb2RlRnJvbVVuaWNvZGUobkZvbnRJbmRleCwgd29yZCk7Ci0KLSAgICAgICAgaWYgKGNoYXJjb2RlICE9IC0xKQotICAgICAgICAgICAgcmV0dXJuIHBQREZGb250LT5HZXRDaGFyV2lkdGhGKGNoYXJjb2RlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKK2ludDMyX3QgQ0ZYX0VkaXRfUHJvdmlkZXI6OkdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCkgeworICByZXR1cm4gbV9wRm9udE1hcC0+R2V0V29yZEZvbnRJbmRleCh3b3JkLCBjaGFyc2V0LCBuRm9udEluZGV4KTsKIH0KIAotaW50MzJfdCBDRlhfRWRpdF9Qcm92aWRlcjo6R2V0VHlwZUFzY2VudChpbnQzMl90IG5Gb250SW5kZXgpCi17Ci0gICAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKQotICAgICAgICByZXR1cm4gcFBERkZvbnQtPkdldFR5cGVBc2NlbnQoKTsKLQotICAgIHJldHVybiAwOworaW50MzJfdCBDRlhfRWRpdF9Qcm92aWRlcjo6R2V0RGVmYXVsdEZvbnRJbmRleCgpIHsKKyAgcmV0dXJuIDA7CiB9CiAKLWludDMyX3QgQ0ZYX0VkaXRfUHJvdmlkZXI6OkdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkKLXsKLSAgICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCkpCi0gICAgICAgIHJldHVybiBwUERGRm9udC0+R2V0VHlwZURlc2NlbnQoKTsKLQotICAgIHJldHVybiAwOworRlhfQk9PTCBDRlhfRWRpdF9Qcm92aWRlcjo6SXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKSB7CisgIHJldHVybiBGWF9FRElUX0lTTEFUSU5XT1JEKHdvcmQpOwogfQogCi1pbnQzMl90IENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBpbnQzMl90IG5Gb250SW5kZXgpCi17Ci0gICAgcmV0dXJuIG1fcEZvbnRNYXAtPkdldFdvcmRGb250SW5kZXgod29yZCxjaGFyc2V0LG5Gb250SW5kZXgpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X1JlZnJlc2gKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDRlhfRWRpdF9SZWZyZXNoOjpDRlhfRWRpdF9SZWZyZXNoKCkge30KKworQ0ZYX0VkaXRfUmVmcmVzaDo6fkNGWF9FZGl0X1JlZnJlc2goKSB7fQorCit2b2lkIENGWF9FZGl0X1JlZnJlc2g6OkJlZ2luUmVmcmVzaCgpIHsKKyAgbV9SZWZyZXNoUmVjdHMuRW1wdHkoKTsKKyAgbV9PbGRMaW5lUmVjdHMgPSBtX05ld0xpbmVSZWN0czsKIH0KIAotaW50MzJfdCBDRlhfRWRpdF9Qcm92aWRlcjo6R2V0RGVmYXVsdEZvbnRJbmRleCgpCi17Ci0gICAgcmV0dXJuIDA7Cit2b2lkIENGWF9FZGl0X1JlZnJlc2g6OlB1c2goY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIGxpbmVyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsKKyAgbV9OZXdMaW5lUmVjdHMuQWRkKGxpbmVyYW5nZSwgcmVjdCk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfUHJvdmlkZXI6OklzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkKLXsKLSAgICByZXR1cm4gRlhfRURJVF9JU0xBVElOV09SRCh3b3JkKTsKK3ZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6Tm9BbmFseXNlKCkgeworICB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fT2xkTGluZVJlY3RzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgICBpZiAoQ0ZYX0VkaXRfTGluZVJlY3QqIHBPbGRSZWN0ID0gbV9PbGRMaW5lUmVjdHMuR2V0QXQoaSkpCisgICAgICAgIG1fUmVmcmVzaFJlY3RzLkFkZChwT2xkUmVjdC0+bV9yY0xpbmUpOworICB9CisKKyAgeworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX05ld0xpbmVSZWN0cy5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgICAgaWYgKENGWF9FZGl0X0xpbmVSZWN0KiBwTmV3UmVjdCA9IG1fTmV3TGluZVJlY3RzLkdldEF0KGkpKQorICAgICAgICBtX1JlZnJlc2hSZWN0cy5BZGQocE5ld1JlY3QtPm1fcmNMaW5lKTsKKyAgfQogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXRfUmVmcmVzaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6QW5hbHlzZShpbnQzMl90IG5BbGlnbm1lbnQpIHsKKyAgRlhfQk9PTCBiTGluZVRvcENoYW5nZWQgPSBGQUxTRTsKKyAgQ1BERl9SZWN0IHJjUmVzdWx0OworICBGWF9GTE9BVCBmV2lkdGhEaWZmOwogCi1DRlhfRWRpdF9SZWZyZXNoOjpDRlhfRWRpdF9SZWZyZXNoKCkKLXsKLX0KKyAgaW50MzJfdCBzek1heCA9CisgICAgICBGWF9FRElUX01BWChtX09sZExpbmVSZWN0cy5HZXRTaXplKCksIG1fTmV3TGluZVJlY3RzLkdldFNpemUoKSk7CisgIGludDMyX3QgaSA9IDA7CiAKLUNGWF9FZGl0X1JlZnJlc2g6On5DRlhfRWRpdF9SZWZyZXNoKCkKLXsKLX0KKyAgd2hpbGUgKGkgPCBzek1heCkgeworICAgIENGWF9FZGl0X0xpbmVSZWN0KiBwT2xkUmVjdCA9IG1fT2xkTGluZVJlY3RzLkdldEF0KGkpOworICAgIENGWF9FZGl0X0xpbmVSZWN0KiBwTmV3UmVjdCA9IG1fTmV3TGluZVJlY3RzLkdldEF0KGkpOwogCi12b2lkIENGWF9FZGl0X1JlZnJlc2g6OkJlZ2luUmVmcmVzaCgpCi17Ci0gICAgbV9SZWZyZXNoUmVjdHMuRW1wdHkoKTsKLSAgICBtX09sZExpbmVSZWN0cyA9IG1fTmV3TGluZVJlY3RzOwotfQorICAgIGlmIChwT2xkUmVjdCkgeworICAgICAgaWYgKHBOZXdSZWN0KSB7CisgICAgICAgIGlmIChiTGluZVRvcENoYW5nZWQpIHsKKyAgICAgICAgICByY1Jlc3VsdCA9IHBPbGRSZWN0LT5tX3JjTGluZTsKKyAgICAgICAgICByY1Jlc3VsdC5VbmlvbihwTmV3UmVjdC0+bV9yY0xpbmUpOworICAgICAgICAgIG1fUmVmcmVzaFJlY3RzLkFkZChyY1Jlc3VsdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCpwTmV3UmVjdCAhPSAqcE9sZFJlY3QpIHsKKyAgICAgICAgICAgIGlmICghcE5ld1JlY3QtPklzU2FtZVRvcCgqcE9sZFJlY3QpIHx8CisgICAgICAgICAgICAgICAgIXBOZXdSZWN0LT5Jc1NhbWVIZWlnaHQoKnBPbGRSZWN0KSkgeworICAgICAgICAgICAgICBiTGluZVRvcENoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KIAotdm9pZCBDRlhfRWRpdF9SZWZyZXNoOjpQdXNoKGNvbnN0IENQVlRfV29yZFJhbmdlICYgbGluZXJhbmdlLGNvbnN0IENQREZfUmVjdCAmIHJlY3QpCi17Ci0gICAgbV9OZXdMaW5lUmVjdHMuQWRkKGxpbmVyYW5nZSxyZWN0KTsKLX0KLQotdm9pZCBDRlhfRWRpdF9SZWZyZXNoOjpOb0FuYWx5c2UoKQotewotICAgIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fT2xkTGluZVJlY3RzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0gICAgICAgICAgICBpZiAoQ0ZYX0VkaXRfTGluZVJlY3QgKiBwT2xkUmVjdCA9IG1fT2xkTGluZVJlY3RzLkdldEF0KGkpKQotICAgICAgICAgICAgICAgIG1fUmVmcmVzaFJlY3RzLkFkZChwT2xkUmVjdC0+bV9yY0xpbmUpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fTmV3TGluZVJlY3RzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0gICAgICAgICAgICBpZiAoQ0ZYX0VkaXRfTGluZVJlY3QgKiBwTmV3UmVjdCA9IG1fTmV3TGluZVJlY3RzLkdldEF0KGkpKQotICAgICAgICAgICAgICAgIG1fUmVmcmVzaFJlY3RzLkFkZChwTmV3UmVjdC0+bV9yY0xpbmUpOwotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdF9SZWZyZXNoOjpBbmFseXNlKGludDMyX3QgbkFsaWdubWVudCkKLXsKLSAgICBGWF9CT09MIGJMaW5lVG9wQ2hhbmdlZCA9IEZBTFNFOwotICAgIENQREZfUmVjdCByY1Jlc3VsdDsKLSAgICBGWF9GTE9BVCBmV2lkdGhEaWZmOwotCi0gICAgaW50MzJfdCBzek1heCA9IEZYX0VESVRfTUFYKG1fT2xkTGluZVJlY3RzLkdldFNpemUoKSxtX05ld0xpbmVSZWN0cy5HZXRTaXplKCkpOwotICAgIGludDMyX3QgaSA9IDA7Ci0KLSAgICB3aGlsZSAoaSA8IHN6TWF4KQotICAgIHsKLSAgICAgICAgQ0ZYX0VkaXRfTGluZVJlY3QgKiBwT2xkUmVjdCA9IG1fT2xkTGluZVJlY3RzLkdldEF0KGkpOwotICAgICAgICBDRlhfRWRpdF9MaW5lUmVjdCAqIHBOZXdSZWN0ID0gbV9OZXdMaW5lUmVjdHMuR2V0QXQoaSk7Ci0KLSAgICAgICAgaWYgKHBPbGRSZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocE5ld1JlY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGJMaW5lVG9wQ2hhbmdlZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJjUmVzdWx0ID0gcE9sZFJlY3QtPm1fcmNMaW5lOwotICAgICAgICAgICAgICAgICAgICByY1Jlc3VsdC5VbmlvbihwTmV3UmVjdC0+bV9yY0xpbmUpOwotICAgICAgICAgICAgICAgICAgICBtX1JlZnJlc2hSZWN0cy5BZGQocmNSZXN1bHQpOworICAgICAgICAgICAgaWYgKG5BbGlnbm1lbnQgPT0gMCkgeworICAgICAgICAgICAgICBpZiAocE5ld1JlY3QtPm1fd3JMaW5lLkJlZ2luUG9zICE9IHBPbGRSZWN0LT5tX3dyTGluZS5CZWdpblBvcykgeworICAgICAgICAgICAgICAgIHJjUmVzdWx0ID0gcE9sZFJlY3QtPm1fcmNMaW5lOworICAgICAgICAgICAgICAgIHJjUmVzdWx0LlVuaW9uKHBOZXdSZWN0LT5tX3JjTGluZSk7CisgICAgICAgICAgICAgICAgbV9SZWZyZXNoUmVjdHMuQWRkKHJjUmVzdWx0KTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBOZXdSZWN0LT5Jc1NhbWVMZWZ0KCpwT2xkUmVjdCkpIHsKKyAgICAgICAgICAgICAgICAgIHJjUmVzdWx0ID0gcE9sZFJlY3QtPm1fcmNMaW5lOworICAgICAgICAgICAgICAgICAgcmNSZXN1bHQuVW5pb24ocE5ld1JlY3QtPm1fcmNMaW5lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgZldpZHRoRGlmZiA9CisgICAgICAgICAgICAgICAgICAgICAgcE5ld1JlY3QtPm1fcmNMaW5lLldpZHRoKCkgLSBwT2xkUmVjdC0+bV9yY0xpbmUuV2lkdGgoKTsKKyAgICAgICAgICAgICAgICAgIHJjUmVzdWx0ID0gcE5ld1JlY3QtPm1fcmNMaW5lOworICAgICAgICAgICAgICAgICAgaWYgKGZXaWR0aERpZmYgPiAwLjBmKQorICAgICAgICAgICAgICAgICAgICByY1Jlc3VsdC5sZWZ0ID0gcmNSZXN1bHQucmlnaHQgLSBmV2lkdGhEaWZmOworICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJjUmVzdWx0LmxlZnQgPSByY1Jlc3VsdC5yaWdodDsKKyAgICAgICAgICAgICAgICAgICAgcmNSZXN1bHQucmlnaHQgKz0gKC1mV2lkdGhEaWZmKTsKKyAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCpwTmV3UmVjdCAhPSAqcE9sZFJlY3QpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcE5ld1JlY3QtPklzU2FtZVRvcCgqcE9sZFJlY3QpIHx8ICFwTmV3UmVjdC0+SXNTYW1lSGVpZ2h0KCpwT2xkUmVjdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxpbmVUb3BDaGFuZ2VkID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5BbGlnbm1lbnQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE5ld1JlY3QtPm1fd3JMaW5lLkJlZ2luUG9zICE9IHBPbGRSZWN0LT5tX3dyTGluZS5CZWdpblBvcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjUmVzdWx0ID0gcE9sZFJlY3QtPm1fcmNMaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY1Jlc3VsdC5VbmlvbihwTmV3UmVjdC0+bV9yY0xpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1JlZnJlc2hSZWN0cy5BZGQocmNSZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBOZXdSZWN0LT5Jc1NhbWVMZWZ0KCpwT2xkUmVjdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjUmVzdWx0ID0gcE9sZFJlY3QtPm1fcmNMaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNSZXN1bHQuVW5pb24ocE5ld1JlY3QtPm1fcmNMaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aERpZmYgPSBwTmV3UmVjdC0+bV9yY0xpbmUuV2lkdGgoKSAtIHBPbGRSZWN0LT5tX3JjTGluZS5XaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNSZXN1bHQgPSBwTmV3UmVjdC0+bV9yY0xpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZldpZHRoRGlmZiA+IDAuMGYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNSZXN1bHQubGVmdCA9IHJjUmVzdWx0LnJpZ2h0IC0gZldpZHRoRGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY1Jlc3VsdC5sZWZ0ID0gcmNSZXN1bHQucmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNSZXN1bHQucmlnaHQgKz0gKC1mV2lkdGhEaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1JlZnJlc2hSZWN0cy5BZGQocmNSZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByY1Jlc3VsdCA9IHBPbGRSZWN0LT5tX3JjTGluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByY1Jlc3VsdC5VbmlvbihwTmV3UmVjdC0+bV9yY0xpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fUmVmcmVzaFJlY3RzLkFkZChyY1Jlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtX1JlZnJlc2hSZWN0cy5BZGQocmNSZXN1bHQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByY1Jlc3VsdCA9IHBPbGRSZWN0LT5tX3JjTGluZTsKKyAgICAgICAgICAgICAgcmNSZXN1bHQuVW5pb24ocE5ld1JlY3QtPm1fcmNMaW5lKTsKKyAgICAgICAgICAgICAgbV9SZWZyZXNoUmVjdHMuQWRkKHJjUmVzdWx0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX1JlZnJlc2hSZWN0cy5BZGQocE9sZFJlY3QtPm1fcmNMaW5lKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwTmV3UmVjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX1JlZnJlc2hSZWN0cy5BZGQocE5ld1JlY3QtPm1fcmNMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL2Vycm9yCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaSsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9SZWZyZXNoUmVjdHMuQWRkKHBPbGRSZWN0LT5tX3JjTGluZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChwTmV3UmVjdCkgeworICAgICAgICBtX1JlZnJlc2hSZWN0cy5BZGQocE5ld1JlY3QtPm1fcmNMaW5lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGVycm9yCisgICAgICB9CiAgICAgfQorICAgIGkrKzsKKyAgfQogfQogCi12b2lkIENGWF9FZGl0X1JlZnJlc2g6OkFkZFJlZnJlc2goY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLXsKLSAgICBtX1JlZnJlc2hSZWN0cy5BZGQocmVjdCk7Cit2b2lkIENGWF9FZGl0X1JlZnJlc2g6OkFkZFJlZnJlc2goY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7CisgIG1fUmVmcmVzaFJlY3RzLkFkZChyZWN0KTsKIH0KIAotY29uc3QgQ0ZYX0VkaXRfUmVjdEFycmF5ICogQ0ZYX0VkaXRfUmVmcmVzaDo6R2V0UmVmcmVzaFJlY3RzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gJm1fUmVmcmVzaFJlY3RzOworY29uc3QgQ0ZYX0VkaXRfUmVjdEFycmF5KiBDRlhfRWRpdF9SZWZyZXNoOjpHZXRSZWZyZXNoUmVjdHMoKSBjb25zdCB7CisgIHJldHVybiAmbV9SZWZyZXNoUmVjdHM7CiB9CiAKLXZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6RW5kUmVmcmVzaCgpCi17Ci0gICAgbV9SZWZyZXNoUmVjdHMuRW1wdHkoKTsKK3ZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6RW5kUmVmcmVzaCgpIHsKKyAgbV9SZWZyZXNoUmVjdHMuRW1wdHkoKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfRWRpdF9VbmRvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXRfVW5kbworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DRlhfRWRpdF9VbmRvOjpDRlhfRWRpdF9VbmRvKGludDMyX3QgbkJ1ZnNpemUpIDogbV9uQ3VyVW5kb1BvcygwKSwKLSAgICBtX25CdWZTaXplKG5CdWZzaXplKSwKLSAgICBtX2JNb2RpZmllZChGQUxTRSksCi0gICAgbV9iVmlyZ2luKFRSVUUpLAotICAgIG1fYldvcmtpbmcoRkFMU0UpCi17CitDRlhfRWRpdF9VbmRvOjpDRlhfRWRpdF9VbmRvKGludDMyX3QgbkJ1ZnNpemUpCisgICAgOiBtX25DdXJVbmRvUG9zKDApLAorICAgICAgbV9uQnVmU2l6ZShuQnVmc2l6ZSksCisgICAgICBtX2JNb2RpZmllZChGQUxTRSksCisgICAgICBtX2JWaXJnaW4oVFJVRSksCisgICAgICBtX2JXb3JraW5nKEZBTFNFKSB7fQorCitDRlhfRWRpdF9VbmRvOjp+Q0ZYX0VkaXRfVW5kbygpIHsKKyAgUmVzZXQoKTsKIH0KIAotQ0ZYX0VkaXRfVW5kbzo6fkNGWF9FZGl0X1VuZG8oKQotewotICAgIFJlc2V0KCk7CitGWF9CT09MIENGWF9FZGl0X1VuZG86OkNhblVuZG8oKSBjb25zdCB7CisgIHJldHVybiBtX25DdXJVbmRvUG9zID4gMDsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9VbmRvOjpDYW5VbmRvKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9uQ3VyVW5kb1BvcyA+IDA7Ci19Cit2b2lkIENGWF9FZGl0X1VuZG86OlVuZG8oKSB7CisgIG1fYldvcmtpbmcgPSBUUlVFOwogCi12b2lkIENGWF9FZGl0X1VuZG86OlVuZG8oKQotewotICAgIG1fYldvcmtpbmcgPSBUUlVFOwotCi0gICAgaWYgKG1fbkN1clVuZG9Qb3MgPiAwKQotICAgIHsKLSAgICAgICAgSUZYX0VkaXRfVW5kb0l0ZW0gKiBwSXRlbSA9IG1fVW5kb0l0ZW1TdGFjay5HZXRBdChtX25DdXJVbmRvUG9zLTEpOwotICAgICAgICBBU1NFUlQocEl0ZW0gIT0gTlVMTCk7Ci0KLSAgICAgICAgcEl0ZW0tPlVuZG8oKTsKLQotICAgICAgICBtX25DdXJVbmRvUG9zLS07Ci0gICAgICAgIG1fYk1vZGlmaWVkID0gKG1fbkN1clVuZG9Qb3MgIT0gMCk7Ci0gICAgfQotCi0gICAgbV9iV29ya2luZyA9IEZBTFNFOwotfQotCi1GWF9CT09MIENGWF9FZGl0X1VuZG86OkNhblJlZG8oKSBjb25zdAotewotICAgIHJldHVybiBtX25DdXJVbmRvUG9zIDwgbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKTsKLX0KLQotdm9pZCBDRlhfRWRpdF9VbmRvOjpSZWRvKCkKLXsKLSAgICBtX2JXb3JraW5nID0gVFJVRTsKLQotICAgIGludDMyX3QgblN0YWNrU2l6ZSA9IG1fVW5kb0l0ZW1TdGFjay5HZXRTaXplKCk7Ci0KLSAgICBpZiAobV9uQ3VyVW5kb1BvcyA8IG5TdGFja1NpemUpCi0gICAgewotICAgICAgICBJRlhfRWRpdF9VbmRvSXRlbSAqIHBJdGVtID0gbV9VbmRvSXRlbVN0YWNrLkdldEF0KG1fbkN1clVuZG9Qb3MpOwotICAgICAgICBBU1NFUlQocEl0ZW0gIT0gTlVMTCk7Ci0KLSAgICAgICAgcEl0ZW0tPlJlZG8oKTsKLQotICAgICAgICBtX25DdXJVbmRvUG9zKys7Ci0gICAgICAgIG1fYk1vZGlmaWVkID0gKG1fbkN1clVuZG9Qb3MgIT0gMCk7Ci0gICAgfQotCi0gICAgbV9iV29ya2luZyA9IEZBTFNFOwotfQotCi1GWF9CT09MIENGWF9FZGl0X1VuZG86OklzV29ya2luZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYldvcmtpbmc7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXRfVW5kbzo6QWRkSXRlbShJRlhfRWRpdF9VbmRvSXRlbSogcEl0ZW0pCi17Ci0gICAgQVNTRVJUKCFtX2JXb3JraW5nKTsKKyAgaWYgKG1fbkN1clVuZG9Qb3MgPiAwKSB7CisgICAgSUZYX0VkaXRfVW5kb0l0ZW0qIHBJdGVtID0gbV9VbmRvSXRlbVN0YWNrLkdldEF0KG1fbkN1clVuZG9Qb3MgLSAxKTsKICAgICBBU1NFUlQocEl0ZW0gIT0gTlVMTCk7Ci0gICAgQVNTRVJUKG1fbkJ1ZlNpemUgPiAxKTsKIAotICAgIGlmIChtX25DdXJVbmRvUG9zIDwgbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKSkKLSAgICAgICAgUmVtb3ZlVGFpbHMoKTsKKyAgICBwSXRlbS0+VW5kbygpOwogCi0gICAgaWYgKG1fVW5kb0l0ZW1TdGFjay5HZXRTaXplKCkgPj0gbV9uQnVmU2l6ZSkKLSAgICB7Ci0gICAgICAgIFJlbW92ZUhlYWRzKCk7Ci0gICAgICAgIG1fYlZpcmdpbiA9IEZBTFNFOwotICAgIH0KLQotICAgIG1fVW5kb0l0ZW1TdGFjay5BZGQocEl0ZW0pOwotICAgIG1fbkN1clVuZG9Qb3MgPSBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOwotCisgICAgbV9uQ3VyVW5kb1Bvcy0tOwogICAgIG1fYk1vZGlmaWVkID0gKG1fbkN1clVuZG9Qb3MgIT0gMCk7CisgIH0KKworICBtX2JXb3JraW5nID0gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfVW5kbzo6SXNNb2RpZmllZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYlZpcmdpbiA/IG1fYk1vZGlmaWVkIDogVFJVRTsKK0ZYX0JPT0wgQ0ZYX0VkaXRfVW5kbzo6Q2FuUmVkbygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fbkN1clVuZG9Qb3MgPCBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOwogfQogCi1JRlhfRWRpdF9VbmRvSXRlbSogQ0ZYX0VkaXRfVW5kbzo6R2V0SXRlbShpbnQzMl90IG5JbmRleCkKLXsKLSAgICBpZiAobkluZGV4Pj0wICYmIG5JbmRleCA8IG1fVW5kb0l0ZW1TdGFjay5HZXRTaXplKCkpCi0gICAgICAgIHJldHVybiBtX1VuZG9JdGVtU3RhY2suR2V0QXQobkluZGV4KTsKK3ZvaWQgQ0ZYX0VkaXRfVW5kbzo6UmVkbygpIHsKKyAgbV9iV29ya2luZyA9IFRSVUU7CiAKLSAgICByZXR1cm4gTlVMTDsKKyAgaW50MzJfdCBuU3RhY2tTaXplID0gbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKTsKKworICBpZiAobV9uQ3VyVW5kb1BvcyA8IG5TdGFja1NpemUpIHsKKyAgICBJRlhfRWRpdF9VbmRvSXRlbSogcEl0ZW0gPSBtX1VuZG9JdGVtU3RhY2suR2V0QXQobV9uQ3VyVW5kb1Bvcyk7CisgICAgQVNTRVJUKHBJdGVtICE9IE5VTEwpOworCisgICAgcEl0ZW0tPlJlZG8oKTsKKworICAgIG1fbkN1clVuZG9Qb3MrKzsKKyAgICBtX2JNb2RpZmllZCA9IChtX25DdXJVbmRvUG9zICE9IDApOworICB9CisKKyAgbV9iV29ya2luZyA9IEZBTFNFOwogfQogCi12b2lkIENGWF9FZGl0X1VuZG86OlJlbW92ZUhlYWRzKCkKLXsKLSAgICBBU1NFUlQobV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKSA+IDEpOwotCi0gICAgZGVsZXRlIG1fVW5kb0l0ZW1TdGFjay5HZXRBdCgwKTsKLSAgICBtX1VuZG9JdGVtU3RhY2suUmVtb3ZlQXQoMCk7CitGWF9CT09MIENGWF9FZGl0X1VuZG86OklzV29ya2luZygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYldvcmtpbmc7CiB9CiAKLXZvaWQgQ0ZYX0VkaXRfVW5kbzo6UmVtb3ZlVGFpbHMoKQotewotICAgIGZvciAoaW50MzJfdCBpID0gbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKS0xOyBpID49IG1fbkN1clVuZG9Qb3M7IGktLSkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSBtX1VuZG9JdGVtU3RhY2suR2V0QXQoaSk7Ci0gICAgICAgIG1fVW5kb0l0ZW1TdGFjay5SZW1vdmVBdChpKTsKLSAgICB9Cit2b2lkIENGWF9FZGl0X1VuZG86OkFkZEl0ZW0oSUZYX0VkaXRfVW5kb0l0ZW0qIHBJdGVtKSB7CisgIEFTU0VSVCghbV9iV29ya2luZyk7CisgIEFTU0VSVChwSXRlbSAhPSBOVUxMKTsKKyAgQVNTRVJUKG1fbkJ1ZlNpemUgPiAxKTsKKworICBpZiAobV9uQ3VyVW5kb1BvcyA8IG1fVW5kb0l0ZW1TdGFjay5HZXRTaXplKCkpCisgICAgUmVtb3ZlVGFpbHMoKTsKKworICBpZiAobV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKSA+PSBtX25CdWZTaXplKSB7CisgICAgUmVtb3ZlSGVhZHMoKTsKKyAgICBtX2JWaXJnaW4gPSBGQUxTRTsKKyAgfQorCisgIG1fVW5kb0l0ZW1TdGFjay5BZGQocEl0ZW0pOworICBtX25DdXJVbmRvUG9zID0gbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKTsKKworICBtX2JNb2RpZmllZCA9IChtX25DdXJVbmRvUG9zICE9IDApOwogfQogCi12b2lkIENGWF9FZGl0X1VuZG86OlJlc2V0KCkKLXsKLSAgICBmb3IgKGludDMyX3QgaT0wLCBzej1tX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSBtX1VuZG9JdGVtU3RhY2suR2V0QXQoaSk7Ci0gICAgfQotICAgIG1fbkN1clVuZG9Qb3MgPSAwOwotICAgIG1fVW5kb0l0ZW1TdGFjay5SZW1vdmVBbGwoKTsKK0ZYX0JPT0wgQ0ZYX0VkaXRfVW5kbzo6SXNNb2RpZmllZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYlZpcmdpbiA/IG1fYk1vZGlmaWVkIDogVFJVRTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworSUZYX0VkaXRfVW5kb0l0ZW0qIENGWF9FZGl0X1VuZG86OkdldEl0ZW0oaW50MzJfdCBuSW5kZXgpIHsKKyAgaWYgKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IG1fVW5kb0l0ZW1TdGFjay5HZXRTaXplKCkpCisgICAgcmV0dXJuIG1fVW5kb0l0ZW1TdGFjay5HZXRBdChuSW5kZXgpOwogCi1DRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpDRlhfRWRpdF9Hcm91cFVuZG9JdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGl0bGUpIDogbV9zVGl0bGUoc1RpdGxlKQoteworICByZXR1cm4gTlVMTDsKIH0KIAotQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbTo6fkNGWF9FZGl0X0dyb3VwVW5kb0l0ZW0oKQotewotICAgIGZvciAoaW50IGk9MCxzej1tX0l0ZW1zLkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgIHsKLSAgICAgICAgZGVsZXRlIG1fSXRlbXNbaV07Ci0gICAgfQordm9pZCBDRlhfRWRpdF9VbmRvOjpSZW1vdmVIZWFkcygpIHsKKyAgQVNTRVJUKG1fVW5kb0l0ZW1TdGFjay5HZXRTaXplKCkgPiAxKTsKIAotICAgIG1fSXRlbXMuUmVtb3ZlQWxsKCk7CisgIGRlbGV0ZSBtX1VuZG9JdGVtU3RhY2suR2V0QXQoMCk7CisgIG1fVW5kb0l0ZW1TdGFjay5SZW1vdmVBdCgwKTsKIH0KIAotdm9pZCBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpBZGRVbmRvSXRlbShDRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKQotewordm9pZCBDRlhfRWRpdF9VbmRvOjpSZW1vdmVUYWlscygpIHsKKyAgZm9yIChpbnQzMl90IGkgPSBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpIC0gMTsgaSA+PSBtX25DdXJVbmRvUG9zOyBpLS0pIHsKKyAgICBkZWxldGUgbV9VbmRvSXRlbVN0YWNrLkdldEF0KGkpOworICAgIG1fVW5kb0l0ZW1TdGFjay5SZW1vdmVBdChpKTsKKyAgfQorfQorCit2b2lkIENGWF9FZGl0X1VuZG86OlJlc2V0KCkgeworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBkZWxldGUgbV9VbmRvSXRlbVN0YWNrLkdldEF0KGkpOworICB9CisgIG1fbkN1clVuZG9Qb3MgPSAwOworICBtX1VuZG9JdGVtU3RhY2suUmVtb3ZlQWxsKCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW0KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0NGWF9FZGl0X0dyb3VwVW5kb0l0ZW06OkNGWF9FZGl0X0dyb3VwVW5kb0l0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUaXRsZSkKKyAgICA6IG1fc1RpdGxlKHNUaXRsZSkge30KKworQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbTo6fkNGWF9FZGl0X0dyb3VwVW5kb0l0ZW0oKSB7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fSXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGRlbGV0ZSBtX0l0ZW1zW2ldOworICB9CisKKyAgbV9JdGVtcy5SZW1vdmVBbGwoKTsKK30KKwordm9pZCBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpBZGRVbmRvSXRlbShDRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKSB7CisgIEFTU0VSVChwVW5kb0l0ZW0gIT0gTlVMTCk7CisKKyAgcFVuZG9JdGVtLT5TZXRGaXJzdChGQUxTRSk7CisgIHBVbmRvSXRlbS0+U2V0TGFzdChGQUxTRSk7CisKKyAgbV9JdGVtcy5BZGQocFVuZG9JdGVtKTsKKworICBpZiAobV9zVGl0bGUuSXNFbXB0eSgpKQorICAgIG1fc1RpdGxlID0gcFVuZG9JdGVtLT5HZXRVbmRvVGl0bGUoKTsKK30KKwordm9pZCBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpVcGRhdGVJdGVtcygpIHsKKyAgaWYgKG1fSXRlbXMuR2V0U2l6ZSgpID4gMCkgeworICAgIENGWF9FZGl0X1VuZG9JdGVtKiBwRmlyc3RJdGVtID0gbV9JdGVtc1swXTsKKyAgICBBU1NFUlQocEZpcnN0SXRlbSAhPSBOVUxMKTsKKyAgICBwRmlyc3RJdGVtLT5TZXRGaXJzdChUUlVFKTsKKworICAgIENGWF9FZGl0X1VuZG9JdGVtKiBwTGFzdEl0ZW0gPSBtX0l0ZW1zW21fSXRlbXMuR2V0U2l6ZSgpIC0gMV07CisgICAgQVNTRVJUKHBMYXN0SXRlbSAhPSBOVUxMKTsKKyAgICBwTGFzdEl0ZW0tPlNldExhc3QoVFJVRSk7CisgIH0KK30KKwordm9pZCBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpVbmRvKCkgeworICBmb3IgKGludCBpID0gbV9JdGVtcy5HZXRTaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgIENGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0gPSBtX0l0ZW1zW2ldOwogICAgIEFTU0VSVChwVW5kb0l0ZW0gIT0gTlVMTCk7CiAKLSAgICBwVW5kb0l0ZW0tPlNldEZpcnN0KEZBTFNFKTsKLSAgICBwVW5kb0l0ZW0tPlNldExhc3QoRkFMU0UpOwotCi0gICAgbV9JdGVtcy5BZGQocFVuZG9JdGVtKTsKLQotICAgIGlmIChtX3NUaXRsZS5Jc0VtcHR5KCkpCi0gICAgICAgIG1fc1RpdGxlID0gcFVuZG9JdGVtLT5HZXRVbmRvVGl0bGUoKTsKKyAgICBwVW5kb0l0ZW0tPlVuZG8oKTsKKyAgfQogfQogCi12b2lkIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW06OlVwZGF0ZUl0ZW1zKCkKLXsKLSAgICBpZiAobV9JdGVtcy5HZXRTaXplKCkgPiAwKQotICAgIHsKLSAgICAgICAgQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBGaXJzdEl0ZW0gPSBtX0l0ZW1zWzBdOwotICAgICAgICBBU1NFUlQocEZpcnN0SXRlbSAhPSBOVUxMKTsKLSAgICAgICAgcEZpcnN0SXRlbS0+U2V0Rmlyc3QoVFJVRSk7Cit2b2lkIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW06OlJlZG8oKSB7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fSXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIENGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0gPSBtX0l0ZW1zW2ldOworICAgIEFTU0VSVChwVW5kb0l0ZW0gIT0gTlVMTCk7CiAKLSAgICAgICAgQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBMYXN0SXRlbSA9IG1fSXRlbXNbbV9JdGVtcy5HZXRTaXplKCkgLSAxXTsKLSAgICAgICAgQVNTRVJUKHBMYXN0SXRlbSAhPSBOVUxMKTsKLSAgICAgICAgcExhc3RJdGVtLT5TZXRMYXN0KFRSVUUpOwotICAgIH0KKyAgICBwVW5kb0l0ZW0tPlJlZG8oKTsKKyAgfQogfQogCi12b2lkIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW06OlVuZG8oKQotewotICAgIGZvciAoaW50IGk9bV9JdGVtcy5HZXRTaXplKCktMTsgaT49MDsgaS0tKQotICAgIHsKLSAgICAgICAgQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSA9IG1fSXRlbXNbaV07Ci0gICAgICAgIEFTU0VSVChwVW5kb0l0ZW0gIT0gTlVMTCk7Ci0KLSAgICAgICAgcFVuZG9JdGVtLT5VbmRvKCk7Ci0gICAgfQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbTo6R2V0VW5kb1RpdGxlKCkgeworICByZXR1cm4gbV9zVGl0bGU7CiB9CiAKLXZvaWQgQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbTo6UmVkbygpCi17Ci0gICAgZm9yIChpbnQgaT0wLHN6PW1fSXRlbXMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgICBDRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtID0gbV9JdGVtc1tpXTsKLSAgICAgICAgQVNTRVJUKHBVbmRvSXRlbSAhPSBOVUxMKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXRfVW5kb0l0ZW0gZGVyaXZlZCBjbGFzc2VzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSAgICAgICAgcFVuZG9JdGVtLT5SZWRvKCk7Ci0gICAgfQorQ0ZYRVVfSW5zZXJ0V29yZDo6Q0ZYRVVfSW5zZXJ0V29yZChDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKQorICAgIDogbV9wRWRpdChwRWRpdCksCisgICAgICBtX3dwT2xkKHdwT2xkUGxhY2UpLAorICAgICAgbV93cE5ldyh3cE5ld1BsYWNlKSwKKyAgICAgIG1fV29yZCh3b3JkKSwKKyAgICAgIG1fbkNoYXJzZXQoY2hhcnNldCksCisgICAgICBtX1dvcmRQcm9wcygpIHsKKyAgaWYgKHBXb3JkUHJvcHMpCisgICAgbV9Xb3JkUHJvcHMgPSAqcFdvcmRQcm9wczsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbTo6R2V0VW5kb1RpdGxlKCkKLXsKLSAgICByZXR1cm4gbV9zVGl0bGU7CitDRlhFVV9JbnNlcnRXb3JkOjp+Q0ZYRVVfSW5zZXJ0V29yZCgpIHt9CisKK3ZvaWQgQ0ZYRVVfSW5zZXJ0V29yZDo6UmVkbygpIHsKKyAgaWYgKG1fcEVkaXQpIHsKKyAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7CisgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsIG1fbkNoYXJzZXQsICZtX1dvcmRQcm9wcywgRkFMU0UsIFRSVUUpOworICB9CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXRfVW5kb0l0ZW0gZGVyaXZlZCBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ0ZYRVVfSW5zZXJ0V29yZDo6Q0ZYRVVfSW5zZXJ0V29yZChDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpCi0gICAgOiBtX3BFZGl0KHBFZGl0KSwgbV93cE9sZCh3cE9sZFBsYWNlKSwgbV93cE5ldyh3cE5ld1BsYWNlKSwgbV9Xb3JkKHdvcmQpLCBtX25DaGFyc2V0KGNoYXJzZXQpLCBtX1dvcmRQcm9wcygpCi17Ci0gICAgaWYgKHBXb3JkUHJvcHMpCi0gICAgICAgIG1fV29yZFByb3BzID0gKnBXb3JkUHJvcHM7Ci19Ci0KLUNGWEVVX0luc2VydFdvcmQ6On5DRlhFVV9JbnNlcnRXb3JkKCkKLXsKLX0KLQotdm9pZCBDRlhFVV9JbnNlcnRXb3JkOjpSZWRvKCkKLXsKLSAgICBpZiAobV9wRWRpdCkKLSAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7Ci0gICAgICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLG1fbkNoYXJzZXQsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOwotICAgIH0KLX0KLQotdm9pZCBDRlhFVV9JbnNlcnRXb3JkOjpVbmRvKCkKLXsKLSAgICBpZiAobV9wRWRpdCkKLSAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7Ci0gICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZShGQUxTRSxUUlVFKTsKLSAgICB9Cit2b2lkIENGWEVVX0luc2VydFdvcmQ6OlVuZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOworICAgIG1fcEVkaXQtPkJhY2tzcGFjZShGQUxTRSwgVFJVRSk7CisgIH0KIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ0ZYRVVfSW5zZXJ0UmV0dXJuOjpDRlhFVV9JbnNlcnRSZXR1cm4oQ0ZYX0VkaXQgKiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE9sZFBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3UGxhY2UsCi0gICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzKSA6Ci0gICAgICAgICAgICBtX3BFZGl0KHBFZGl0KSwKLSAgICAgICAgICAgIG1fd3BPbGQod3BPbGRQbGFjZSksCi0gICAgICAgICAgICBtX3dwTmV3KHdwTmV3UGxhY2UpLAotICAgICAgICAgICAgbV9TZWNQcm9wcygpLAotICAgICAgICAgICAgbV9Xb3JkUHJvcHMoKQotewotICAgIGlmIChwU2VjUHJvcHMpCi0gICAgICAgIG1fU2VjUHJvcHMgPSAqcFNlY1Byb3BzOwotICAgIGlmIChwV29yZFByb3BzKQotICAgICAgICBtX1dvcmRQcm9wcyA9ICpwV29yZFByb3BzOworQ0ZYRVVfSW5zZXJ0UmV0dXJuOjpDRlhFVV9JbnNlcnRSZXR1cm4oQ0ZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKQorICAgIDogbV9wRWRpdChwRWRpdCksCisgICAgICBtX3dwT2xkKHdwT2xkUGxhY2UpLAorICAgICAgbV93cE5ldyh3cE5ld1BsYWNlKSwKKyAgICAgIG1fU2VjUHJvcHMoKSwKKyAgICAgIG1fV29yZFByb3BzKCkgeworICBpZiAocFNlY1Byb3BzKQorICAgIG1fU2VjUHJvcHMgPSAqcFNlY1Byb3BzOworICBpZiAocFdvcmRQcm9wcykKKyAgICBtX1dvcmRQcm9wcyA9ICpwV29yZFByb3BzOwogfQogCi1DRlhFVV9JbnNlcnRSZXR1cm46On5DRlhFVV9JbnNlcnRSZXR1cm4oKQoteworQ0ZYRVVfSW5zZXJ0UmV0dXJuOjp+Q0ZYRVVfSW5zZXJ0UmV0dXJuKCkge30KKwordm9pZCBDRlhFVV9JbnNlcnRSZXR1cm46OlJlZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOworICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywgJm1fV29yZFByb3BzLCBGQUxTRSwgVFJVRSk7CisgIH0KIH0KIAotdm9pZCBDRlhFVV9JbnNlcnRSZXR1cm46OlJlZG8oKQotewotICAgIGlmIChtX3BFZGl0KQotICAgIHsKLSAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKLSAgICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCZtX1dvcmRQcm9wcyxGQUxTRSxUUlVFKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ0ZYRVVfSW5zZXJ0UmV0dXJuOjpVbmRvKCkKLXsKLSAgICBpZiAobV9wRWRpdCkKLSAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7Ci0gICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZShGQUxTRSxUUlVFKTsKLSAgICB9Cit2b2lkIENGWEVVX0luc2VydFJldHVybjo6VW5kbygpIHsKKyAgaWYgKG1fcEVkaXQpIHsKKyAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7CisgICAgbV9wRWRpdC0+QmFja3NwYWNlKEZBTFNFLCBUUlVFKTsKKyAgfQogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLy9DRlhFVV9CYWNrc3BhY2UKKy8vIENGWEVVX0JhY2tzcGFjZQogCi1DRlhFVV9CYWNrc3BhY2U6OkNGWEVVX0JhY2tzcGFjZShDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICYgU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgV29yZFByb3BzKSA6Ci0gICAgICAgICAgICBtX3BFZGl0KHBFZGl0KSwKLSAgICAgICAgICAgIG1fd3BPbGQod3BPbGRQbGFjZSksCi0gICAgICAgICAgICBtX3dwTmV3KHdwTmV3UGxhY2UpLAotICAgICAgICAgICAgbV9Xb3JkKHdvcmQpLAotICAgICAgICAgICAgbV9uQ2hhcnNldChjaGFyc2V0KSwKLSAgICAgICAgICAgIG1fU2VjUHJvcHMoU2VjUHJvcHMpLAotICAgICAgICAgICAgbV9Xb3JkUHJvcHMoV29yZFByb3BzKQoteworQ0ZYRVVfQmFja3NwYWNlOjpDRlhFVV9CYWNrc3BhY2UoQ0ZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMmIFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIFdvcmRQcm9wcykKKyAgICA6IG1fcEVkaXQocEVkaXQpLAorICAgICAgbV93cE9sZCh3cE9sZFBsYWNlKSwKKyAgICAgIG1fd3BOZXcod3BOZXdQbGFjZSksCisgICAgICBtX1dvcmQod29yZCksCisgICAgICBtX25DaGFyc2V0KGNoYXJzZXQpLAorICAgICAgbV9TZWNQcm9wcyhTZWNQcm9wcyksCisgICAgICBtX1dvcmRQcm9wcyhXb3JkUHJvcHMpIHt9CisKK0NGWEVVX0JhY2tzcGFjZTo6fkNGWEVVX0JhY2tzcGFjZSgpIHt9CisKK3ZvaWQgQ0ZYRVVfQmFja3NwYWNlOjpSZWRvKCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKKyAgICBtX3BFZGl0LT5CYWNrc3BhY2UoRkFMU0UsIFRSVUUpOworICB9CiB9CiAKLUNGWEVVX0JhY2tzcGFjZTo6fkNGWEVVX0JhY2tzcGFjZSgpCi17Ci19Ci0KLXZvaWQgQ0ZYRVVfQmFja3NwYWNlOjpSZWRvKCkKLXsKLSAgICBpZiAobV9wRWRpdCkKLSAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7Ci0gICAgICAgIG1fcEVkaXQtPkJhY2tzcGFjZShGQUxTRSxUUlVFKTsKK3ZvaWQgQ0ZYRVVfQmFja3NwYWNlOjpVbmRvKCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwTmV3KTsKKyAgICBpZiAobV93cE5ldy5TZWNDbXAobV93cE9sZCkgIT0gMCkgeworICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCAmbV9Xb3JkUHJvcHMsIEZBTFNFLCBUUlVFKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsIG1fbkNoYXJzZXQsICZtX1dvcmRQcm9wcywgRkFMU0UsIFRSVUUpOwogICAgIH0KLX0KLQotdm9pZCBDRlhFVV9CYWNrc3BhY2U6OlVuZG8oKQotewotICAgIGlmIChtX3BFZGl0KQotICAgIHsKLSAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwTmV3KTsKLSAgICAgICAgaWYgKG1fd3BOZXcuU2VjQ21wKG1fd3BPbGQpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywmbV9Xb3JkUHJvcHMsRkFMU0UsVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCxtX25DaGFyc2V0LCZtX1dvcmRQcm9wcyxGQUxTRSxUUlVFKTsKLSAgICAgICAgfQotICAgIH0KKyAgfQogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLy9DRlhFVV9EZWxldGUKKy8vIENGWEVVX0RlbGV0ZQogCi1DRlhFVV9EZWxldGU6OkNGWEVVX0RlbGV0ZShDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsIGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICYgU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgV29yZFByb3BzLCBGWF9CT09MIGJTZWNFbmQpIDoKLSAgICAgICAgICAgIG1fcEVkaXQocEVkaXQpLAotICAgICAgICAgICAgbV93cE9sZCh3cE9sZFBsYWNlKSwKLSAgICAgICAgICAgIG1fd3BOZXcod3BOZXdQbGFjZSksCi0gICAgICAgICAgICBtX1dvcmQod29yZCksCi0gICAgICAgICAgICBtX25DaGFyc2V0KGNoYXJzZXQpLAotICAgICAgICAgICAgbV9TZWNQcm9wcyhTZWNQcm9wcyksCi0gICAgICAgICAgICBtX1dvcmRQcm9wcyhXb3JkUHJvcHMpLAotICAgICAgICAgICAgbV9iU2VjRW5kKGJTZWNFbmQpCi17CitDRlhFVV9EZWxldGU6OkNGWEVVX0RlbGV0ZShDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGRQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE5ld1BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyYgU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyYgV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VjRW5kKQorICAgIDogbV9wRWRpdChwRWRpdCksCisgICAgICBtX3dwT2xkKHdwT2xkUGxhY2UpLAorICAgICAgbV93cE5ldyh3cE5ld1BsYWNlKSwKKyAgICAgIG1fV29yZCh3b3JkKSwKKyAgICAgIG1fbkNoYXJzZXQoY2hhcnNldCksCisgICAgICBtX1NlY1Byb3BzKFNlY1Byb3BzKSwKKyAgICAgIG1fV29yZFByb3BzKFdvcmRQcm9wcyksCisgICAgICBtX2JTZWNFbmQoYlNlY0VuZCkge30KKworQ0ZYRVVfRGVsZXRlOjp+Q0ZYRVVfRGVsZXRlKCkge30KKwordm9pZCBDRlhFVV9EZWxldGU6OlJlZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOworICAgIG1fcEVkaXQtPkRlbGV0ZShGQUxTRSwgVFJVRSk7CisgIH0KIH0KIAotQ0ZYRVVfRGVsZXRlOjp+Q0ZYRVVfRGVsZXRlKCkKLXsKLX0KLQotdm9pZCBDRlhFVV9EZWxldGU6OlJlZG8oKQotewotICAgIGlmIChtX3BFZGl0KQotICAgIHsKLSAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKLSAgICAgICAgbV9wRWRpdC0+RGVsZXRlKEZBTFNFLFRSVUUpOwordm9pZCBDRlhFVV9EZWxldGU6OlVuZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOworICAgIGlmIChtX2JTZWNFbmQpIHsKKyAgICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywgJm1fV29yZFByb3BzLCBGQUxTRSwgVFJVRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLCBtX25DaGFyc2V0LCAmbV9Xb3JkUHJvcHMsIEZBTFNFLCBUUlVFKTsKICAgICB9Ci19Ci0KLXZvaWQgQ0ZYRVVfRGVsZXRlOjpVbmRvKCkKLXsKLSAgICBpZiAobV9wRWRpdCkKLSAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7Ci0gICAgICAgIGlmIChtX2JTZWNFbmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywmbV9Xb3JkUHJvcHMsRkFMU0UsVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCxtX25DaGFyc2V0LCZtX1dvcmRQcm9wcyxGQUxTRSxUUlVFKTsKLSAgICAgICAgfQotICAgIH0KKyAgfQogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLy9DRlhFVV9DbGVhcgorLy8gQ0ZYRVVfQ2xlYXIKIAotQ0ZYRVVfQ2xlYXI6OkNGWEVVX0NsZWFyKENGWF9FZGl0ICogcEVkaXQsICBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyU2VsLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmIHN3VGV4dCkgOgotICAgICAgICAgICAgbV9wRWRpdChwRWRpdCksCi0gICAgICAgICAgICBtX3dyU2VsKHdyU2VsKSwKLSAgICAgICAgICAgIG1fc3dUZXh0KHN3VGV4dCkKLXsKK0NGWEVVX0NsZWFyOjpDRlhFVV9DbGVhcihDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyU2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd1RleHQpCisgICAgOiBtX3BFZGl0KHBFZGl0KSwgbV93clNlbCh3clNlbCksIG1fc3dUZXh0KHN3VGV4dCkge30KKworQ0ZYRVVfQ2xlYXI6On5DRlhFVV9DbGVhcigpIHt9CisKK3ZvaWQgQ0ZYRVVfQ2xlYXI6OlJlZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgIG1fcEVkaXQtPlNldFNlbChtX3dyU2VsLkJlZ2luUG9zLCBtX3dyU2VsLkVuZFBvcyk7CisgICAgbV9wRWRpdC0+Q2xlYXIoRkFMU0UsIFRSVUUpOworICB9CiB9CiAKLUNGWEVVX0NsZWFyOjp+Q0ZYRVVfQ2xlYXIoKQotewotfQotCi12b2lkIENGWEVVX0NsZWFyOjpSZWRvKCkKLXsKLSAgICBpZiAobV9wRWRpdCkKLSAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsbV93clNlbC5FbmRQb3MpOwotICAgICAgICBtX3BFZGl0LT5DbGVhcihGQUxTRSxUUlVFKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ0ZYRVVfQ2xlYXI6OlVuZG8oKQotewotICAgIGlmIChtX3BFZGl0KQotICAgIHsKLSAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotICAgICAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dyU2VsLkJlZ2luUG9zKTsKLSAgICAgICAgbV9wRWRpdC0+SW5zZXJ0VGV4dChtX3N3VGV4dC5jX3N0cigpLCBERUZBVUxUX0NIQVJTRVQsIE5VTEwsIE5VTEwsIEZBTFNFLCBUUlVFKTsKLSAgICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsbV93clNlbC5FbmRQb3MpOwotICAgIH0KK3ZvaWQgQ0ZYRVVfQ2xlYXI6OlVuZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3JTZWwuQmVnaW5Qb3MpOworICAgIG1fcEVkaXQtPkluc2VydFRleHQobV9zd1RleHQuY19zdHIoKSwgREVGQVVMVF9DSEFSU0VULCBOVUxMLCBOVUxMLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworICAgIG1fcEVkaXQtPlNldFNlbChtX3dyU2VsLkJlZ2luUG9zLCBtX3dyU2VsLkVuZFBvcyk7CisgIH0KIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8vQ0ZYRVVfQ2xlYXJSaWNoCisvLyBDRlhFVV9DbGVhclJpY2gKIAotQ0ZYRVVfQ2xlYXJSaWNoOjpDRlhFVV9DbGVhclJpY2goQ0ZYX0VkaXQgKiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE9sZFBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3UGxhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3clNlbCwgRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAmIFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIFdvcmRQcm9wcykgOgotICAgICAgICAgICAgbV9wRWRpdChwRWRpdCksCi0gICAgICAgICAgICBtX3dwT2xkKHdwT2xkUGxhY2UpLAotICAgICAgICAgICAgbV93cE5ldyh3cE5ld1BsYWNlKSwKLSAgICAgICAgICAgIG1fd3JTZWwod3JTZWwpLAotICAgICAgICAgICAgbV9Xb3JkKHdvcmQpLAotICAgICAgICAgICAgbV9uQ2hhcnNldChjaGFyc2V0KSwKLSAgICAgICAgICAgIG1fU2VjUHJvcHMoU2VjUHJvcHMpLAotICAgICAgICAgICAgbV9Xb3JkUHJvcHMoV29yZFByb3BzKQoteworQ0ZYRVVfQ2xlYXJSaWNoOjpDRlhFVV9DbGVhclJpY2goQ0ZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3clNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMmIFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIFdvcmRQcm9wcykKKyAgICA6IG1fcEVkaXQocEVkaXQpLAorICAgICAgbV93cE9sZCh3cE9sZFBsYWNlKSwKKyAgICAgIG1fd3BOZXcod3BOZXdQbGFjZSksCisgICAgICBtX3dyU2VsKHdyU2VsKSwKKyAgICAgIG1fV29yZCh3b3JkKSwKKyAgICAgIG1fbkNoYXJzZXQoY2hhcnNldCksCisgICAgICBtX1NlY1Byb3BzKFNlY1Byb3BzKSwKKyAgICAgIG1fV29yZFByb3BzKFdvcmRQcm9wcykge30KKworQ0ZYRVVfQ2xlYXJSaWNoOjp+Q0ZYRVVfQ2xlYXJSaWNoKCkge30KKwordm9pZCBDRlhFVV9DbGVhclJpY2g6OlJlZG8oKSB7CisgIGlmIChtX3BFZGl0ICYmIElzTGFzdCgpKSB7CisgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgIG1fcEVkaXQtPlNldFNlbChtX3dyU2VsLkJlZ2luUG9zLCBtX3dyU2VsLkVuZFBvcyk7CisgICAgbV9wRWRpdC0+Q2xlYXIoRkFMU0UsIFRSVUUpOworICB9CiB9CiAKLUNGWEVVX0NsZWFyUmljaDo6fkNGWEVVX0NsZWFyUmljaCgpCi17Ci19Ci0KLXZvaWQgQ0ZYRVVfQ2xlYXJSaWNoOjpSZWRvKCkKLXsKLSAgICBpZiAobV9wRWRpdCAmJiBJc0xhc3QoKSkKLSAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsbV93clNlbC5FbmRQb3MpOwotICAgICAgICBtX3BFZGl0LT5DbGVhcihGQUxTRSxUUlVFKTsKK3ZvaWQgQ0ZYRVVfQ2xlYXJSaWNoOjpVbmRvKCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKKyAgICBpZiAobV93cE5ldy5TZWNDbXAobV93cE9sZCkgIT0gMCkgeworICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCAmbV9Xb3JkUHJvcHMsIEZBTFNFLCBGQUxTRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLCBtX25DaGFyc2V0LCAmbV9Xb3JkUHJvcHMsIEZBTFNFLCBGQUxTRSk7CiAgICAgfQotfQogCi12b2lkIENGWEVVX0NsZWFyUmljaDo6VW5kbygpCi17Ci0gICAgaWYgKG1fcEVkaXQpCi0gICAgewotICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0gICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwotICAgICAgICBpZiAobV93cE5ldy5TZWNDbXAobV93cE9sZCkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCZtX1dvcmRQcm9wcyxGQUxTRSxGQUxTRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCxtX25DaGFyc2V0LCZtX1dvcmRQcm9wcyxGQUxTRSxGQUxTRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoSXNGaXJzdCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3BFZGl0LT5QYWludEluc2VydFRleHQobV93clNlbC5CZWdpblBvcyxtX3dyU2VsLkVuZFBvcyk7Ci0gICAgICAgICAgICBtX3BFZGl0LT5TZXRTZWwobV93clNlbC5CZWdpblBvcyxtX3dyU2VsLkVuZFBvcyk7Ci0gICAgICAgIH0KKyAgICBpZiAoSXNGaXJzdCgpKSB7CisgICAgICBtX3BFZGl0LT5QYWludEluc2VydFRleHQobV93clNlbC5CZWdpblBvcywgbV93clNlbC5FbmRQb3MpOworICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsIG1fd3JTZWwuRW5kUG9zKTsKICAgICB9CisgIH0KIH0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vL0NGWEVVX0luc2VydFRleHQKKy8vIENGWEVVX0luc2VydFRleHQKIAotQ0ZYRVVfSW5zZXJ0VGV4dDo6Q0ZYRVVfSW5zZXJ0VGV4dChDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmIHN3VGV4dCwgaW50MzJfdCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcykgOgotICAgICAgICAgICAgbV9wRWRpdChwRWRpdCksCi0gICAgICAgICAgICBtX3dwT2xkKHdwT2xkUGxhY2UpLAotICAgICAgICAgICAgbV93cE5ldyh3cE5ld1BsYWNlKSwKLSAgICAgICAgICAgIG1fc3dUZXh0KHN3VGV4dCksCi0gICAgICAgICAgICBtX25DaGFyc2V0KGNoYXJzZXQpLAotICAgICAgICAgICAgbV9TZWNQcm9wcygpLAotICAgICAgICAgICAgbV9Xb3JkUHJvcHMoKQotewotICAgIGlmIChwU2VjUHJvcHMpCi0gICAgICAgIG1fU2VjUHJvcHMgPSAqcFNlY1Byb3BzOwotICAgIGlmIChwV29yZFByb3BzKQotICAgICAgICBtX1dvcmRQcm9wcyA9ICpwV29yZFByb3BzOworQ0ZYRVVfSW5zZXJ0VGV4dDo6Q0ZYRVVfSW5zZXJ0VGV4dChDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3VGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKQorICAgIDogbV9wRWRpdChwRWRpdCksCisgICAgICBtX3dwT2xkKHdwT2xkUGxhY2UpLAorICAgICAgbV93cE5ldyh3cE5ld1BsYWNlKSwKKyAgICAgIG1fc3dUZXh0KHN3VGV4dCksCisgICAgICBtX25DaGFyc2V0KGNoYXJzZXQpLAorICAgICAgbV9TZWNQcm9wcygpLAorICAgICAgbV9Xb3JkUHJvcHMoKSB7CisgIGlmIChwU2VjUHJvcHMpCisgICAgbV9TZWNQcm9wcyA9ICpwU2VjUHJvcHM7CisgIGlmIChwV29yZFByb3BzKQorICAgIG1fV29yZFByb3BzID0gKnBXb3JkUHJvcHM7CiB9CiAKLUNGWEVVX0luc2VydFRleHQ6On5DRlhFVV9JbnNlcnRUZXh0KCkKLXsKK0NGWEVVX0luc2VydFRleHQ6On5DRlhFVV9JbnNlcnRUZXh0KCkge30KKwordm9pZCBDRlhFVV9JbnNlcnRUZXh0OjpSZWRvKCkgeworICBpZiAobV9wRWRpdCAmJiBJc0xhc3QoKSkgeworICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKKyAgICBtX3BFZGl0LT5JbnNlcnRUZXh0KG1fc3dUZXh0LmNfc3RyKCksIG1fbkNoYXJzZXQsICZtX1NlY1Byb3BzLCAmbV9Xb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgVFJVRSk7CisgIH0KIH0KIAotdm9pZCBDRlhFVV9JbnNlcnRUZXh0OjpSZWRvKCkKLXsKLSAgICBpZiAobV9wRWRpdCAmJiBJc0xhc3QoKSkKLSAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICAgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7Ci0gICAgICAgIG1fcEVkaXQtPkluc2VydFRleHQobV9zd1RleHQuY19zdHIoKSwgbV9uQ2hhcnNldCwgJm1fU2VjUHJvcHMsICZtX1dvcmRQcm9wcywgRkFMU0UsIFRSVUUpOwotICAgIH0KLX0KLQotdm9pZCBDRlhFVV9JbnNlcnRUZXh0OjpVbmRvKCkKLXsKLSAgICBpZiAobV9wRWRpdCkKLSAgICB7Ci0gICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3BPbGQsbV93cE5ldyk7Ci0gICAgICAgIG1fcEVkaXQtPkNsZWFyKEZBTFNFLFRSVUUpOwotICAgIH0KK3ZvaWQgQ0ZYRVVfSW5zZXJ0VGV4dDo6VW5kbygpIHsKKyAgaWYgKG1fcEVkaXQpIHsKKyAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3BPbGQsIG1fd3BOZXcpOworICAgIG1fcEVkaXQtPkNsZWFyKEZBTFNFLCBUUlVFKTsKKyAgfQogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DRlhFVV9TZXRTZWNQcm9wczo6Q0ZYRVVfU2V0U2VjUHJvcHMoQ0ZYX0VkaXQgKiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRURJVF9QUk9QU19FIGVwLAotICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICYgb2xkc2VjcHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgb2xkd29yZHByb3BzLAotICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICYgbmV3c2VjcHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgbmV3d29yZHByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHJhbmdlKQotICAgICAgICA6IG1fcEVkaXQocEVkaXQpLAotICAgICAgICBtX3dwUGxhY2UocGxhY2UpLAotICAgICAgICBtX3dyUGxhY2UocmFuZ2UpLAotICAgICAgICBtX2VQcm9wcyhlcCksCi0gICAgICAgIG1fT2xkU2VjUHJvcHMob2xkc2VjcHJvcHMpLAotICAgICAgICBtX05ld1NlY1Byb3BzKG5ld3NlY3Byb3BzKSwKLSAgICAgICAgbV9PbGRXb3JkUHJvcHMob2xkd29yZHByb3BzKSwKLSAgICAgICAgbV9OZXdXb3JkUHJvcHMobmV3d29yZHByb3BzKQotewotfQorQ0ZYRVVfU2V0U2VjUHJvcHM6OkNGWEVVX1NldFNlY1Byb3BzKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURJVF9QUk9QU19FIGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMmIG9sZHNlY3Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBvbGR3b3JkcHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyYgbmV3c2VjcHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIG5ld3dvcmRwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpCisgICAgOiBtX3BFZGl0KHBFZGl0KSwKKyAgICAgIG1fd3BQbGFjZShwbGFjZSksCisgICAgICBtX3dyUGxhY2UocmFuZ2UpLAorICAgICAgbV9lUHJvcHMoZXApLAorICAgICAgbV9PbGRTZWNQcm9wcyhvbGRzZWNwcm9wcyksCisgICAgICBtX05ld1NlY1Byb3BzKG5ld3NlY3Byb3BzKSwKKyAgICAgIG1fT2xkV29yZFByb3BzKG9sZHdvcmRwcm9wcyksCisgICAgICBtX05ld1dvcmRQcm9wcyhuZXd3b3JkcHJvcHMpIHt9CiAKLUNGWEVVX1NldFNlY1Byb3BzOjp+Q0ZYRVVfU2V0U2VjUHJvcHMoKQotewotfQorQ0ZYRVVfU2V0U2VjUHJvcHM6On5DRlhFVV9TZXRTZWNQcm9wcygpIHt9CiAKLXZvaWQgQ0ZYRVVfU2V0U2VjUHJvcHM6OlJlZG8oKQotewotICAgIGlmIChtX3BFZGl0KQotICAgIHsKLSAgICAgICAgbV9wRWRpdC0+U2V0U2VjUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX05ld1NlY1Byb3BzLCZtX05ld1dvcmRQcm9wcyxtX3dyUGxhY2UsRkFMU0UpOwotICAgICAgICBpZiAoSXNMYXN0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICAgICAgICAgIG1fcEVkaXQtPlBhaW50U2V0UHJvcHMobV9lUHJvcHMsbV93clBsYWNlKTsKLSAgICAgICAgICAgIG1fcEVkaXQtPlNldFNlbChtX3dyUGxhY2UuQmVnaW5Qb3MsbV93clBsYWNlLkVuZFBvcyk7Ci0gICAgICAgIH0KK3ZvaWQgQ0ZYRVVfU2V0U2VjUHJvcHM6OlJlZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2V0U2VjUHJvcHMobV9lUHJvcHMsIG1fd3BQbGFjZSwgJm1fTmV3U2VjUHJvcHMsICZtX05ld1dvcmRQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3dyUGxhY2UsIEZBTFNFKTsKKyAgICBpZiAoSXNMYXN0KCkpIHsKKyAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgICAgIG1fcEVkaXQtPlBhaW50U2V0UHJvcHMobV9lUHJvcHMsIG1fd3JQbGFjZSk7CisgICAgICBtX3BFZGl0LT5TZXRTZWwobV93clBsYWNlLkJlZ2luUG9zLCBtX3dyUGxhY2UuRW5kUG9zKTsKICAgICB9CisgIH0KIH0KIAotdm9pZCBDRlhFVV9TZXRTZWNQcm9wczo6VW5kbygpCi17Ci0gICAgaWYgKG1fcEVkaXQpCi0gICAgewotICAgICAgICBtX3BFZGl0LT5TZXRTZWNQcm9wcyhtX2VQcm9wcyxtX3dwUGxhY2UsJm1fT2xkU2VjUHJvcHMsJm1fT2xkV29yZFByb3BzLG1fd3JQbGFjZSxGQUxTRSk7Ci0gICAgICAgIGlmIChJc0ZpcnN0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICAgICAgICAgIG1fcEVkaXQtPlBhaW50U2V0UHJvcHMobV9lUHJvcHMsbV93clBsYWNlKTsKLSAgICAgICAgICAgIG1fcEVkaXQtPlNldFNlbChtX3dyUGxhY2UuQmVnaW5Qb3MsbV93clBsYWNlLkVuZFBvcyk7Ci0gICAgICAgIH0KK3ZvaWQgQ0ZYRVVfU2V0U2VjUHJvcHM6OlVuZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2V0U2VjUHJvcHMobV9lUHJvcHMsIG1fd3BQbGFjZSwgJm1fT2xkU2VjUHJvcHMsICZtX09sZFdvcmRQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3dyUGxhY2UsIEZBTFNFKTsKKyAgICBpZiAoSXNGaXJzdCgpKSB7CisgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgICBtX3BFZGl0LT5QYWludFNldFByb3BzKG1fZVByb3BzLCBtX3dyUGxhY2UpOworICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JQbGFjZS5CZWdpblBvcywgbV93clBsYWNlLkVuZFBvcyk7CiAgICAgfQorICB9CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNGWEVVX1NldFdvcmRQcm9wczo6Q0ZYRVVfU2V0V29yZFByb3BzKENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEVESVRfUFJPUFNfRSBlcCwKLSAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiBvbGRwcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiBuZXdwcm9wcywgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSkKLSAgICAgICAgOiBtX3BFZGl0KHBFZGl0KSwKLSAgICAgICAgbV93cFBsYWNlKHBsYWNlKSwKLSAgICAgICAgbV93clBsYWNlKHJhbmdlKSwKLSAgICAgICAgbV9lUHJvcHMoZXApLAotICAgICAgICBtX09sZFdvcmRQcm9wcyhvbGRwcm9wcyksCi0gICAgICAgIG1fTmV3V29yZFByb3BzKG5ld3Byb3BzKQotewotfQorQ0ZYRVVfU2V0V29yZFByb3BzOjpDRlhFVV9TZXRXb3JkUHJvcHMoQ0ZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURJVF9QUk9QU19FIGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIG9sZHByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIG5ld3Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKQorICAgIDogbV9wRWRpdChwRWRpdCksCisgICAgICBtX3dwUGxhY2UocGxhY2UpLAorICAgICAgbV93clBsYWNlKHJhbmdlKSwKKyAgICAgIG1fZVByb3BzKGVwKSwKKyAgICAgIG1fT2xkV29yZFByb3BzKG9sZHByb3BzKSwKKyAgICAgIG1fTmV3V29yZFByb3BzKG5ld3Byb3BzKSB7fQogCi1DRlhFVV9TZXRXb3JkUHJvcHM6On5DRlhFVV9TZXRXb3JkUHJvcHMoKQotewotfQorQ0ZYRVVfU2V0V29yZFByb3BzOjp+Q0ZYRVVfU2V0V29yZFByb3BzKCkge30KIAotdm9pZCBDRlhFVV9TZXRXb3JkUHJvcHM6OlJlZG8oKQotewotICAgIGlmIChtX3BFZGl0KQotICAgIHsKLSAgICAgICAgbV9wRWRpdC0+U2V0V29yZFByb3BzKG1fZVByb3BzLG1fd3BQbGFjZSwmbV9OZXdXb3JkUHJvcHMsbV93clBsYWNlLEZBTFNFKTsKLSAgICAgICAgaWYgKElzTGFzdCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0gICAgICAgICAgICBtX3BFZGl0LT5QYWludFNldFByb3BzKG1fZVByb3BzLG1fd3JQbGFjZSk7Ci0gICAgICAgICAgICBtX3BFZGl0LT5TZXRTZWwobV93clBsYWNlLkJlZ2luUG9zLG1fd3JQbGFjZS5FbmRQb3MpOwotICAgICAgICB9Cit2b2lkIENGWEVVX1NldFdvcmRQcm9wczo6UmVkbygpIHsKKyAgaWYgKG1fcEVkaXQpIHsKKyAgICBtX3BFZGl0LT5TZXRXb3JkUHJvcHMobV9lUHJvcHMsIG1fd3BQbGFjZSwgJm1fTmV3V29yZFByb3BzLCBtX3dyUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKyAgICBpZiAoSXNMYXN0KCkpIHsKKyAgICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgICAgIG1fcEVkaXQtPlBhaW50U2V0UHJvcHMobV9lUHJvcHMsIG1fd3JQbGFjZSk7CisgICAgICBtX3BFZGl0LT5TZXRTZWwobV93clBsYWNlLkJlZ2luUG9zLCBtX3dyUGxhY2UuRW5kUG9zKTsKICAgICB9CisgIH0KIH0KIAotdm9pZCBDRlhFVV9TZXRXb3JkUHJvcHM6OlVuZG8oKQotewotICAgIGlmIChtX3BFZGl0KQotICAgIHsKLSAgICAgICAgbV9wRWRpdC0+U2V0V29yZFByb3BzKG1fZVByb3BzLG1fd3BQbGFjZSwmbV9PbGRXb3JkUHJvcHMsbV93clBsYWNlLEZBTFNFKTsKLSAgICAgICAgaWYgKElzRmlyc3QoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotICAgICAgICAgICAgbV9wRWRpdC0+UGFpbnRTZXRQcm9wcyhtX2VQcm9wcyxtX3dyUGxhY2UpOwotICAgICAgICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JQbGFjZS5CZWdpblBvcyxtX3dyUGxhY2UuRW5kUG9zKTsKLSAgICAgICAgfQordm9pZCBDRlhFVV9TZXRXb3JkUHJvcHM6OlVuZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2V0V29yZFByb3BzKG1fZVByb3BzLCBtX3dwUGxhY2UsICZtX09sZFdvcmRQcm9wcywgbV93clBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgICAgaWYgKElzRmlyc3QoKSkgeworICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgICAgbV9wRWRpdC0+UGFpbnRTZXRQcm9wcyhtX2VQcm9wcywgbV93clBsYWNlKTsKKyAgICAgIG1fcEVkaXQtPlNldFNlbChtX3dyUGxhY2UuQmVnaW5Qb3MsIG1fd3JQbGFjZS5FbmRQb3MpOwogICAgIH0KKyAgfQogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ0ZYX0VkaXQ6OkNGWF9FZGl0KElQREZfVmFyaWFibGVUZXh0ICogcFZUKSA6Ci0gICAgbV9wVlQocFZUKSwKLSAgICBtX3BOb3RpZnkoTlVMTCksCi0gICAgbV9wT3ByTm90aWZ5KE5VTEwpLAotICAgIG1fcFZUUHJvdmlkZShOVUxMKSwKLSAgICBtX3dwQ2FyZXQoLTEsLTEsLTEpLAotICAgIG1fd3BPbGRDYXJldCgtMSwtMSwtMSksCi0gICAgbV9TZWxTdGF0ZSgpLAotICAgIG1fcHRTY3JvbGxQb3MoMCwwKSwKLSAgICBtX3B0UmVmcmVzaFNjcm9sbFBvcygwLDApLAotICAgIG1fYkVuYWJsZVNjcm9sbChGQUxTRSksCi0gICAgbV9wSXRlcmF0b3IoTlVMTCksCi0gICAgbV9wdENhcmV0KDAuMGYsMC4wZiksCi0gICAgbV9VbmRvKEZYX0VESVRfVU5ET19NQVhJVEVNKSwKLSAgICBtX25BbGlnbm1lbnQoMCksCi0gICAgbV9iTm90aWZ5RmxhZyhGQUxTRSksCi0gICAgbV9iRW5hYmxlT3ZlcmZsb3coRkFMU0UpLAotICAgIG1fYkVuYWJsZVJlZnJlc2goVFJVRSksCi0gICAgbV9yY09sZENvbnRlbnQoMC4wZiwwLjBmLDAuMGYsMC4wZiksCi0gICAgbV9iRW5hYmxlVW5kbyhUUlVFKSwKLSAgICBtX2JOb3RpZnkoVFJVRSksCi0gICAgbV9iT3ByTm90aWZ5KEZBTFNFKSwKLSAgICBtX3BHcm91cFVuZG9JdGVtKE5VTEwpCi17Ci0gICAgQVNTRVJUKHBWVCAhPSBOVUxMKTsKK0NGWF9FZGl0OjpDRlhfRWRpdChJUERGX1ZhcmlhYmxlVGV4dCogcFZUKQorICAgIDogbV9wVlQocFZUKSwKKyAgICAgIG1fcE5vdGlmeShOVUxMKSwKKyAgICAgIG1fcE9wck5vdGlmeShOVUxMKSwKKyAgICAgIG1fcFZUUHJvdmlkZShOVUxMKSwKKyAgICAgIG1fd3BDYXJldCgtMSwgLTEsIC0xKSwKKyAgICAgIG1fd3BPbGRDYXJldCgtMSwgLTEsIC0xKSwKKyAgICAgIG1fU2VsU3RhdGUoKSwKKyAgICAgIG1fcHRTY3JvbGxQb3MoMCwgMCksCisgICAgICBtX3B0UmVmcmVzaFNjcm9sbFBvcygwLCAwKSwKKyAgICAgIG1fYkVuYWJsZVNjcm9sbChGQUxTRSksCisgICAgICBtX3BJdGVyYXRvcihOVUxMKSwKKyAgICAgIG1fcHRDYXJldCgwLjBmLCAwLjBmKSwKKyAgICAgIG1fVW5kbyhGWF9FRElUX1VORE9fTUFYSVRFTSksCisgICAgICBtX25BbGlnbm1lbnQoMCksCisgICAgICBtX2JOb3RpZnlGbGFnKEZBTFNFKSwKKyAgICAgIG1fYkVuYWJsZU92ZXJmbG93KEZBTFNFKSwKKyAgICAgIG1fYkVuYWJsZVJlZnJlc2goVFJVRSksCisgICAgICBtX3JjT2xkQ29udGVudCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSwKKyAgICAgIG1fYkVuYWJsZVVuZG8oVFJVRSksCisgICAgICBtX2JOb3RpZnkoVFJVRSksCisgICAgICBtX2JPcHJOb3RpZnkoRkFMU0UpLAorICAgICAgbV9wR3JvdXBVbmRvSXRlbShOVUxMKSB7CisgIEFTU0VSVChwVlQgIT0gTlVMTCk7CiB9CiAKLUNGWF9FZGl0Ojp+Q0ZYX0VkaXQoKQotewotICAgIGRlbGV0ZSBtX3BWVFByb3ZpZGU7Ci0gICAgbV9wVlRQcm92aWRlID0gTlVMTDsKLSAgICBkZWxldGUgbV9wSXRlcmF0b3I7Ci0gICAgbV9wSXRlcmF0b3IgPSBOVUxMOwotICAgIEFTU0VSVChtX3BHcm91cFVuZG9JdGVtID09IE5VTEwpOworQ0ZYX0VkaXQ6On5DRlhfRWRpdCgpIHsKKyAgZGVsZXRlIG1fcFZUUHJvdmlkZTsKKyAgbV9wVlRQcm92aWRlID0gTlVMTDsKKyAgZGVsZXRlIG1fcEl0ZXJhdG9yOworICBtX3BJdGVyYXRvciA9IE5VTEw7CisgIEFTU0VSVChtX3BHcm91cFVuZG9JdGVtID09IE5VTEwpOwogfQogCiAvLyBwdWJsaWMgbWV0aG9kcwogCi12b2lkIENGWF9FZGl0OjpJbml0aWFsaXplKCkKLXsKLSAgICBtX3BWVC0+SW5pdGlhbGl6ZSgpOwotICAgIFNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKLSAgICBTZXRDYXJldE9yaWdpbigpOwordm9pZCBDRlhfRWRpdDo6SW5pdGlhbGl6ZSgpIHsKKyAgbV9wVlQtPkluaXRpYWxpemUoKTsKKyAgU2V0Q2FyZXQobV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpOworICBTZXRDYXJldE9yaWdpbigpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRGb250TWFwKElGWF9FZGl0X0ZvbnRNYXAgKiBwRm9udE1hcCkKLXsKLSAgICBkZWxldGUgbV9wVlRQcm92aWRlOwotICAgIG1fcFZULT5TZXRQcm92aWRlcihtX3BWVFByb3ZpZGUgPSBuZXcgQ0ZYX0VkaXRfUHJvdmlkZXIocEZvbnRNYXApKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXApIHsKKyAgZGVsZXRlIG1fcFZUUHJvdmlkZTsKKyAgbV9wVlQtPlNldFByb3ZpZGVyKG1fcFZUUHJvdmlkZSA9IG5ldyBDRlhfRWRpdF9Qcm92aWRlcihwRm9udE1hcCkpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRWVFByb3ZpZGVyKElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBwUHJvdmlkZXIpCi17Ci0gICAgbV9wVlQtPlNldFByb3ZpZGVyKHBQcm92aWRlcik7Cit2b2lkIENGWF9FZGl0OjpTZXRWVFByb3ZpZGVyKElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBwUHJvdmlkZXIpIHsKKyAgbV9wVlQtPlNldFByb3ZpZGVyKHBQcm92aWRlcik7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldE5vdGlmeShJRlhfRWRpdF9Ob3RpZnkqIHBOb3RpZnkpCi17Ci0gICAgbV9wTm90aWZ5ID0gcE5vdGlmeTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldE5vdGlmeShJRlhfRWRpdF9Ob3RpZnkqIHBOb3RpZnkpIHsKKyAgbV9wTm90aWZ5ID0gcE5vdGlmeTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0T3ByTm90aWZ5KElGWF9FZGl0X09wck5vdGlmeSogcE9wck5vdGlmeSkKLXsKLSAgICBtX3BPcHJOb3RpZnkgPSBwT3ByTm90aWZ5Owordm9pZCBDRlhfRWRpdDo6U2V0T3ByTm90aWZ5KElGWF9FZGl0X09wck5vdGlmeSogcE9wck5vdGlmeSkgeworICBtX3BPcHJOb3RpZnkgPSBwT3ByTm90aWZ5OwogfQogCi1JRlhfRWRpdF9JdGVyYXRvciAqIENGWF9FZGl0OjpHZXRJdGVyYXRvcigpCi17Ci0gICAgaWYgKCFtX3BJdGVyYXRvcikKLSAgICAgICAgbV9wSXRlcmF0b3IgPSBuZXcgQ0ZYX0VkaXRfSXRlcmF0b3IodGhpcyxtX3BWVC0+R2V0SXRlcmF0b3IoKSk7CitJRlhfRWRpdF9JdGVyYXRvciogQ0ZYX0VkaXQ6OkdldEl0ZXJhdG9yKCkgeworICBpZiAoIW1fcEl0ZXJhdG9yKQorICAgIG1fcEl0ZXJhdG9yID0gbmV3IENGWF9FZGl0X0l0ZXJhdG9yKHRoaXMsIG1fcFZULT5HZXRJdGVyYXRvcigpKTsKIAotICAgIHJldHVybiBtX3BJdGVyYXRvcjsKKyAgcmV0dXJuIG1fcEl0ZXJhdG9yOwogfQogCi1JUERGX1ZhcmlhYmxlVGV4dCAqIENGWF9FZGl0OjpHZXRWYXJpYWJsZVRleHQoKQotewotICAgIHJldHVybiBtX3BWVDsKK0lQREZfVmFyaWFibGVUZXh0KiBDRlhfRWRpdDo6R2V0VmFyaWFibGVUZXh0KCkgeworICByZXR1cm4gbV9wVlQ7CiB9CiAKLUlGWF9FZGl0X0ZvbnRNYXAqIENGWF9FZGl0OjpHZXRGb250TWFwKCkKLXsKLSAgICBpZiAobV9wVlRQcm92aWRlKQotICAgICAgICByZXR1cm4gbV9wVlRQcm92aWRlLT5HZXRGb250TWFwKCk7CitJRlhfRWRpdF9Gb250TWFwKiBDRlhfRWRpdDo6R2V0Rm9udE1hcCgpIHsKKyAgaWYgKG1fcFZUUHJvdmlkZSkKKyAgICByZXR1cm4gbV9wVlRQcm92aWRlLT5HZXRGb250TWFwKCk7CiAKLSAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewotICAgIG1fcFZULT5TZXRQbGF0ZVJlY3QocmVjdCk7Ci0gICAgbV9wdFNjcm9sbFBvcyA9IENQREZfUG9pbnQocmVjdC5sZWZ0LHJlY3QudG9wKTsKLSAgICBpZiAoYlBhaW50KSBQYWludCgpOwordm9pZCBDRlhfRWRpdDo6U2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCwgRlhfQk9PTCBiUGFpbnQgLyogPSBUUlVFKi8pIHsKKyAgbV9wVlQtPlNldFBsYXRlUmVjdChyZWN0KTsKKyAgbV9wdFNjcm9sbFBvcyA9IENQREZfUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCk7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0QWxpZ25tZW50SChpbnQzMl90IG5Gb3JtYXQvKiA9MCAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLSAgICBtX3BWVC0+U2V0QWxpZ25tZW50KG5Gb3JtYXQpOwotICAgIGlmIChiUGFpbnQpIFBhaW50KCk7Cit2b2lkIENGWF9FZGl0OjpTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdCAvKiA9MCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQgLyogPSBUUlVFKi8pIHsKKyAgbV9wVlQtPlNldEFsaWdubWVudChuRm9ybWF0KTsKKyAgaWYgKGJQYWludCkKKyAgICBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdC8qID0wICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewotICAgIG1fbkFsaWdubWVudCA9IG5Gb3JtYXQ7Ci0gICAgaWYgKGJQYWludCkgUGFpbnQoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEFsaWdubWVudFYoaW50MzJfdCBuRm9ybWF0IC8qID0wICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCAvKiA9IFRSVUUqLykgeworICBtX25BbGlnbm1lbnQgPSBuRm9ybWF0OworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkLyogPScqJyAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLSAgICBtX3BWVC0+U2V0UGFzc3dvcmRDaGFyKHdTdWJXb3JkKTsKLSAgICBpZiAoYlBhaW50KSBQYWludCgpOwordm9pZCBDRlhfRWRpdDo6U2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQgLyogPScqJyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCAvKiA9IFRSVUUqLykgeworICBtX3BWVC0+U2V0UGFzc3dvcmRDaGFyKHdTdWJXb3JkKTsKKyAgaWYgKGJQYWludCkKKyAgICBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyLyogPTAgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0gICAgbV9wVlQtPlNldExpbWl0Q2hhcihuTGltaXRDaGFyKTsKLSAgICBpZiAoYlBhaW50KSBQYWludCgpOwordm9pZCBDRlhfRWRpdDo6U2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhciAvKiA9MCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCAvKiA9IFRSVUUqLykgeworICBtX3BWVC0+U2V0TGltaXRDaGFyKG5MaW1pdENoYXIpOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkvKiA9MCAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLSAgICBtX3BWVC0+U2V0Q2hhckFycmF5KG5DaGFyQXJyYXkpOwotICAgIGlmIChiUGFpbnQpIFBhaW50KCk7Cit2b2lkIENGWF9FZGl0OjpTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5IC8qID0wICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50IC8qID0gVFJVRSovKSB7CisgIG1fcFZULT5TZXRDaGFyQXJyYXkobkNoYXJBcnJheSk7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UvKiA9MC4wZiAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLSAgICBtX3BWVC0+U2V0Q2hhclNwYWNlKGZDaGFyU3BhY2UpOwotICAgIGlmIChiUGFpbnQpIFBhaW50KCk7Cit2b2lkIENGWF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSAvKiA9MC4wZiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCAvKiA9IFRSVUUqLykgeworICBtX3BWVC0+U2V0Q2hhclNwYWNlKGZDaGFyU3BhY2UpOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUvKiA9MTAwICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewotICAgIG1fcFZULT5TZXRIb3J6U2NhbGUobkhvcnpTY2FsZSk7Ci0gICAgaWYgKGJQYWludCkgUGFpbnQoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgLyogPTEwMCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCAvKiA9IFRSVUUqLykgeworICBtX3BWVC0+U2V0SG9yelNjYWxlKG5Ib3J6U2NhbGUpOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUvKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLSAgICBtX3BWVC0+U2V0TXVsdGlMaW5lKGJNdWx0aUxpbmUpOwotICAgIGlmIChiUGFpbnQpIFBhaW50KCk7Cit2b2lkIENGWF9FZGl0OjpTZXRNdWx0aUxpbmUoRlhfQk9PTCBiTXVsdGlMaW5lIC8qID1UUlVFICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50IC8qID0gVFJVRSovKSB7CisgIG1fcFZULT5TZXRNdWx0aUxpbmUoYk11bHRpTGluZSk7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0QXV0b1JldHVybihGWF9CT09MIGJBdXRvLyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0gICAgbV9wVlQtPlNldEF1dG9SZXR1cm4oYkF1dG8pOwotICAgIGlmIChiUGFpbnQpIFBhaW50KCk7Cit2b2lkIENGWF9FZGl0OjpTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8gLyogPVRSVUUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50IC8qID0gVFJVRSovKSB7CisgIG1fcFZULT5TZXRBdXRvUmV0dXJuKGJBdXRvKTsKKyAgaWYgKGJQYWludCkKKyAgICBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcvKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLSAgICBtX3BWVC0+U2V0TGluZUxlYWRpbmcoZkxpbmVMZWFkaW5nKTsKLSAgICBpZiAoYlBhaW50KSBQYWludCgpOwordm9pZCBDRlhfRWRpdDo6U2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nIC8qID1UUlVFICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQgLyogPSBUUlVFKi8pIHsKKyAgbV9wVlQtPlNldExpbmVMZWFkaW5nKGZMaW5lTGVhZGluZyk7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8vKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLSAgICBtX3BWVC0+U2V0QXV0b0ZvbnRTaXplKGJBdXRvKTsKLSAgICBpZiAoYlBhaW50KSBQYWludCgpOwordm9pZCBDRlhfRWRpdDo6U2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8gLyogPVRSVUUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQgLyogPSBUUlVFKi8pIHsKKyAgbV9wVlQtPlNldEF1dG9Gb250U2l6ZShiQXV0byk7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewotICAgIG1fcFZULT5TZXRGb250U2l6ZShmRm9udFNpemUpOwotICAgIGlmIChiUGFpbnQpIFBhaW50KCk7Cit2b2lkIENGWF9FZGl0OjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYlBhaW50IC8qID0gVFJVRSovKSB7CisgIG1fcFZULT5TZXRGb250U2l6ZShmRm9udFNpemUpOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9TY3JvbGwoRlhfQk9PTCBiQXV0by8qID1UUlVFICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewotICAgIG1fYkVuYWJsZVNjcm9sbCA9IGJBdXRvOwotICAgIGlmIChiUGFpbnQpIFBhaW50KCk7Cit2b2lkIENGWF9FZGl0OjpTZXRBdXRvU2Nyb2xsKEZYX0JPT0wgYkF1dG8gLyogPVRSVUUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50IC8qID0gVFJVRSovKSB7CisgIG1fYkVuYWJsZVNjcm9sbCA9IGJBdXRvOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFRleHRPdmVyZmxvdyhGWF9CT09MIGJBbGxvd2VkIC8qPSBGQUxTRSovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewotICAgIG1fYkVuYWJsZU92ZXJmbG93ID0gYkFsbG93ZWQ7Ci0gICAgaWYgKGJQYWludCkgUGFpbnQoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFRleHRPdmVyZmxvdyhGWF9CT09MIGJBbGxvd2VkIC8qPSBGQUxTRSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50IC8qID0gVFJVRSovKSB7CisgIG1fYkVuYWJsZU92ZXJmbG93ID0gYkFsbG93ZWQ7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0U2VsKGludDMyX3QgblN0YXJ0Q2hhcixpbnQzMl90IG5FbmRDaGFyKQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgaWYgKG5TdGFydENoYXIgPT0gMCAmJiBuRW5kQ2hhciA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlbGVjdEFsbCgpOwordm9pZCBDRlhfRWRpdDo6U2V0U2VsKGludDMyX3QgblN0YXJ0Q2hhciwgaW50MzJfdCBuRW5kQ2hhcikgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmIChuU3RhcnRDaGFyID09IDAgJiYgbkVuZENoYXIgPCAwKSB7CisgICAgICBTZWxlY3RBbGwoKTsKKyAgICB9IGVsc2UgaWYgKG5TdGFydENoYXIgPCAwKSB7CisgICAgICBTZWxlY3ROb25lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChuU3RhcnRDaGFyIDwgbkVuZENoYXIpIHsKKyAgICAgICAgU2V0U2VsKG1fcFZULT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuU3RhcnRDaGFyKSwKKyAgICAgICAgICAgICAgIG1fcFZULT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuRW5kQ2hhcikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU2V0U2VsKG1fcFZULT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuRW5kQ2hhciksCisgICAgICAgICAgICAgICBtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UoblN0YXJ0Q2hhcikpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIENGWF9FZGl0OjpTZXRTZWwoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgU2VsZWN0Tm9uZSgpOworCisgICAgbV9TZWxTdGF0ZS5TZXQoYmVnaW4sIGVuZCk7CisKKyAgICBTZXRDYXJldChtX1NlbFN0YXRlLkVuZFBvcyk7CisKKyAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpIHsKKyAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgIENQVlRfV29yZFJhbmdlIHdyKG1fU2VsU3RhdGUuQmVnaW5Qb3MsIG1fU2VsU3RhdGUuRW5kUG9zKTsKKyAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3cik7CisgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICB9IGVsc2UgeworICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0ZYX0VkaXQ6OkdldFNlbChpbnQzMl90JiBuU3RhcnRDaGFyLCBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3QgeworICBuU3RhcnRDaGFyID0gLTE7CisgIG5FbmRDaGFyID0gLTE7CisKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpIHsKKyAgICAgIGlmIChtX1NlbFN0YXRlLkJlZ2luUG9zLldvcmRDbXAobV9TZWxTdGF0ZS5FbmRQb3MpIDwgMCkgeworICAgICAgICBuU3RhcnRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOworICAgICAgICBuRW5kQ2hhciA9IG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX1NlbFN0YXRlLkVuZFBvcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBuU3RhcnRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuRW5kUG9zKTsKKyAgICAgICAgbkVuZENoYXIgPSBtX3BWVC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgobV9TZWxTdGF0ZS5CZWdpblBvcyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG5TdGFydENoYXIgPSBtX3BWVC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgobV93cENhcmV0KTsKKyAgICAgIG5FbmRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fd3BDYXJldCk7CisgICAgfQorICB9Cit9CisKK2ludDMyX3QgQ0ZYX0VkaXQ6OkdldENhcmV0KCkgY29uc3QgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkKKyAgICByZXR1cm4gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fd3BDYXJldCk7CisKKyAgcmV0dXJuIC0xOworfQorCitDUFZUX1dvcmRQbGFjZSBDRlhfRWRpdDo6R2V0Q2FyZXRXb3JkUGxhY2UoKSBjb25zdCB7CisgIHJldHVybiBtX3dwQ2FyZXQ7Cit9CisKK0NGWF9XaWRlU3RyaW5nIENGWF9FZGl0OjpHZXRUZXh0KCkgY29uc3QgeworICBDRlhfV2lkZVN0cmluZyBzd1JldDsKKworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICAgIEZYX0JPT0wgYlJpY2ggPSBtX3BWVC0+SXNSaWNoVGV4dCgpOworCisgICAgICBwSXRlcmF0b3ItPlNldEF0KDApOworCisgICAgICBDUFZUX1dvcmQgd29yZGluZm87CisgICAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykpIHsKKyAgICAgICAgICBpZiAoYlJpY2gpIHsKKyAgICAgICAgICAgIHN3UmV0ICs9IHdvcmRpbmZvLldvcmQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3UmV0ICs9IHdvcmRpbmZvLldvcmQ7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5TdGFydENoYXIgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWxlY3ROb25lKCk7CisKKyAgICAgICAgaWYgKG9sZHBsYWNlLlNlY0NtcChwbGFjZSkgIT0gMCkgeworICAgICAgICAgIHN3UmV0ICs9IDB4MEQ7CisgICAgICAgICAgc3dSZXQgKz0gMHgwQTsKICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuU3RhcnRDaGFyIDwgbkVuZENoYXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0U2VsKG1fcFZULT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuU3RhcnRDaGFyKSxtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UobkVuZENoYXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRTZWwobV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5FbmRDaGFyKSxtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UoblN0YXJ0Q2hhcikpOwotICAgICAgICAgICAgfQorCisgICAgICAgIG9sZHBsYWNlID0gcGxhY2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN3UmV0OworfQorCitDRlhfV2lkZVN0cmluZyBDRlhfRWRpdDo6R2V0UmFuZ2VUZXh0KGNvbnN0IENQVlRfV29yZFJhbmdlJiByYW5nZSkgY29uc3QgeworICBDRlhfV2lkZVN0cmluZyBzd1JldDsKKworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIEZYX0JPT0wgYlJpY2ggPSBtX3BWVC0+SXNSaWNoVGV4dCgpOworCisgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkgeworICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3JUZW1wID0gcmFuZ2U7CisgICAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdyVGVtcC5CZWdpblBvcyk7CisgICAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdyVGVtcC5FbmRQb3MpOworICAgICAgcEl0ZXJhdG9yLT5TZXRBdCh3clRlbXAuQmVnaW5Qb3MpOworCisgICAgICBDUFZUX1dvcmQgd29yZGluZm87CisgICAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IHdyVGVtcC5CZWdpblBvczsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgIGlmIChwbGFjZS5Xb3JkQ21wKHdyVGVtcC5FbmRQb3MpID4gMCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKSkgeworICAgICAgICAgIGlmIChiUmljaCkgeworICAgICAgICAgICAgc3dSZXQgKz0gd29yZGluZm8uV29yZDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dSZXQgKz0gd29yZGluZm8uV29yZDsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci19CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFNlbChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGJlZ2luLGNvbnN0IENQVlRfV29yZFBsYWNlICYgZW5kKQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgU2VsZWN0Tm9uZSgpOwotCi0gICAgICAgIG1fU2VsU3RhdGUuU2V0KGJlZ2luLGVuZCk7Ci0KLSAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOwotCi0gICAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3IobV9TZWxTdGF0ZS5CZWdpblBvcyxtX1NlbFN0YXRlLkVuZFBvcyk7Ci0gICAgICAgICAgICBSZWZyZXNoKFJQX09QVElPTkFMLCZ3cik7Ci0gICAgICAgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICAgICAgaWYgKG9sZHBsYWNlLlNlY0NtcChwbGFjZSkgIT0gMCkgeworICAgICAgICAgIHN3UmV0ICs9IDB4MEQ7CisgICAgICAgICAgc3dSZXQgKz0gMHgwQTsKICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgICB9CisKKyAgICAgICAgb2xkcGxhY2UgPSBwbGFjZTsKKyAgICAgIH0KICAgICB9CisgIH0KKworICByZXR1cm4gc3dSZXQ7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OkdldFNlbChpbnQzMl90ICYgblN0YXJ0Q2hhciwgaW50MzJfdCAmIG5FbmRDaGFyKSBjb25zdAotewotICAgIG5TdGFydENoYXIgPSAtMTsKLSAgICBuRW5kQ2hhciA9IC0xOworQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0VkaXQ6OkdldFNlbFRleHQoKSBjb25zdCB7CisgIHJldHVybiBHZXRSYW5nZVRleHQobV9TZWxTdGF0ZS5Db252ZXJ0VG9Xb3JkUmFuZ2UoKSk7Cit9CiAKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1fU2VsU3RhdGUuQmVnaW5Qb3MuV29yZENtcChtX1NlbFN0YXRlLkVuZFBvcyk8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuU3RhcnRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOwotICAgICAgICAgICAgICAgIG5FbmRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuRW5kUG9zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuU3RhcnRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuRW5kUG9zKTsKLSAgICAgICAgICAgICAgICBuRW5kQ2hhciA9IG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX1NlbFN0YXRlLkJlZ2luUG9zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5TdGFydENoYXIgPSBtX3BWVC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgobV93cENhcmV0KTsKLSAgICAgICAgICAgIG5FbmRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fd3BDYXJldCk7Ci0gICAgICAgIH0KK2ludDMyX3QgQ0ZYX0VkaXQ6OkdldFRvdGFsV29yZHMoKSBjb25zdCB7CisgIHJldHVybiBtX3BWVC0+R2V0VG90YWxXb3JkcygpOworfQorCitpbnQzMl90IENGWF9FZGl0OjpHZXRUb3RhbExpbmVzKCkgY29uc3QgeworICBpbnQzMl90IG5MaW5lcyA9IDA7CisKKyAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkgeworICAgIHBJdGVyYXRvci0+U2V0QXQoMCk7CisgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dExpbmUoKSkKKyAgICAgIG5MaW5lcysrOworICB9CisKKyAgcmV0dXJuIG5MaW5lcyArIDE7Cit9CisKK0NQVlRfV29yZFJhbmdlIENGWF9FZGl0OjpHZXRTZWxlY3RXb3JkUmFuZ2UoKSBjb25zdCB7CisgIHJldHVybiBtX1NlbFN0YXRlLkNvbnZlcnRUb1dvcmRSYW5nZSgpOworfQorCitDUFZUX1dvcmRSYW5nZSBDRlhfRWRpdDo6Q29tYmluZVdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMikgeworICBDUFZUX1dvcmRSYW5nZSB3clJldDsKKworICBpZiAod3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkJlZ2luUG9zKSA8IDApIHsKKyAgICB3clJldC5CZWdpblBvcyA9IHdyMS5CZWdpblBvczsKKyAgfSBlbHNlIHsKKyAgICB3clJldC5CZWdpblBvcyA9IHdyMi5CZWdpblBvczsKKyAgfQorCisgIGlmICh3cjEuRW5kUG9zLldvcmRDbXAod3IyLkVuZFBvcykgPCAwKSB7CisgICAgd3JSZXQuRW5kUG9zID0gd3IyLkVuZFBvczsKKyAgfSBlbHNlIHsKKyAgICB3clJldC5FbmRQb3MgPSB3cjEuRW5kUG9zOworICB9CisKKyAgcmV0dXJuIHdyUmV0OworfQorCitGWF9CT09MIENGWF9FZGl0OjpJc1JpY2hUZXh0KCkgY29uc3QgeworICByZXR1cm4gbV9wVlQtPklzUmljaFRleHQoKTsKK30KKwordm9pZCBDRlhfRWRpdDo6U2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQgLyogPVRSVUUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCAvKiA9IFRSVUUqLykgeworICBtX3BWVC0+U2V0UmljaFRleHQoYlJpY2hUZXh0KTsKKyAgaWYgKGJQYWludCkKKyAgICBQYWludCgpOworfQorCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoRm9udEluZGV4KGludDMyX3QgbkZvbnRJbmRleCkgeworICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CisgIFdvcmRQcm9wcy5uRm9udEluZGV4ID0gbkZvbnRJbmRleDsKKyAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfRk9OVElOREVYLCBOVUxMLCAmV29yZFByb3BzKTsKK30KKworRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CisgIFdvcmRQcm9wcy5mRm9udFNpemUgPSBmRm9udFNpemU7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0ZPTlRTSVpFLCBOVUxMLCAmV29yZFByb3BzKTsKK30KKworRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRDb2xvcihGWF9DT0xPUlJFRiBkd0NvbG9yKSB7CisgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKKyAgV29yZFByb3BzLmR3V29yZENvbG9yID0gZHdDb2xvcjsKKyAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfV09SRENPTE9SLCBOVUxMLCAmV29yZFByb3BzKTsKK30KKworRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRTY3JpcHQoaW50MzJfdCBuU2NyaXB0VHlwZSkgeworICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CisgIFdvcmRQcm9wcy5uU2NyaXB0VHlwZSA9IG5TY3JpcHRUeXBlOworICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9TQ1JJUFRUWVBFLCBOVUxMLCAmV29yZFByb3BzKTsKK30KKworRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRCb2xkKEZYX0JPT0wgYkJvbGQpIHsKKyAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOworICBpZiAoYkJvbGQpCisgICAgV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9CT0xEOworICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9CT0xELCBOVUxMLCAmV29yZFByb3BzKTsKK30KKworRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRJdGFsaWMoRlhfQk9PTCBiSXRhbGljKSB7CisgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKKyAgaWYgKGJJdGFsaWMpCisgICAgV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9JVEFMSUM7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0lUQUxJQywgTlVMTCwgJldvcmRQcm9wcyk7Cit9CisKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0VW5kZXJsaW5lKEZYX0JPT0wgYlVuZGVybGluZSkgeworICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CisgIGlmIChiVW5kZXJsaW5lKQorICAgIFdvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FOworICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9VTkRFUkxJTkUsIE5VTEwsICZXb3JkUHJvcHMpOworfQorCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dENyb3Nzb3V0KEZYX0JPT0wgYkNyb3Nzb3V0KSB7CisgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKKyAgaWYgKGJDcm9zc291dCkKKyAgICBXb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0NST1NTT1VUOworICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9DUk9TU09VVCwgTlVMTCwgJldvcmRQcm9wcyk7Cit9CisKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpIHsKKyAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOworICBXb3JkUHJvcHMuZkNoYXJTcGFjZSA9IGZDaGFyU3BhY2U7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0NIQVJTUEFDRSwgTlVMTCwgJldvcmRQcm9wcyk7Cit9CisKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSAvKj0gMTAwKi8pIHsKKyAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOworICBXb3JkUHJvcHMubkhvcnpTY2FsZSA9IG5Ib3J6U2NhbGU7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0hPUlpTQ0FMRSwgTlVMTCwgJldvcmRQcm9wcyk7Cit9CisKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKSB7CisgIENQVlRfU2VjUHJvcHMgU2VjUHJvcHM7CisgIFNlY1Byb3BzLmZMaW5lTGVhZGluZyA9IGZMaW5lTGVhZGluZzsKKyAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfTElORUxFQURJTkcsICZTZWNQcm9wcywgTlVMTCk7Cit9CisKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCkgeworICBDUFZUX1NlY1Byb3BzIFNlY1Byb3BzOworICBTZWNQcm9wcy5mTGluZUluZGVudCA9IGZMaW5lSW5kZW50OworICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9MSU5FSU5ERU5ULCAmU2VjUHJvcHMsIE5VTEwpOworfQorCitGWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dEFsaWdubWVudChpbnQzMl90IG5BbGlnbm1lbnQpIHsKKyAgQ1BWVF9TZWNQcm9wcyBTZWNQcm9wczsKKyAgU2VjUHJvcHMubkFsaWdubWVudCA9IG5BbGlnbm1lbnQ7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0FMSUdOTUVOVCwgJlNlY1Byb3BzLCBOVUxMKTsKK30KKworRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKSB7CisgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICBGWF9CT09MIGJTZXQxLCBiU2V0MjsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkgJiYgbV9wVlQtPklzUmljaFRleHQoKSkgeworICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICAgIENQVlRfV29yZFJhbmdlIHdyVGVtcCA9IG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCk7CisKKyAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkJlZ2luUG9zKTsKKyAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkVuZFBvcyk7CisgICAgICBwSXRlcmF0b3ItPlNldEF0KHdyVGVtcC5CZWdpblBvcyk7CisKKyAgICAgIEJlZ2luR3JvdXBVbmRvKEwiIik7CisgICAgICA7CisKKyAgICAgIGJTZXQgPSBTZXRTZWNQcm9wcyhlUHJvcHMsIHdyVGVtcC5CZWdpblBvcywgcFNlY1Byb3BzLCBwV29yZFByb3BzLCB3clRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgIGlmIChwbGFjZS5Xb3JkQ21wKHdyVGVtcC5FbmRQb3MpID4gMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgYlNldDEgPSBTZXRTZWNQcm9wcyhlUHJvcHMsIHBsYWNlLCBwU2VjUHJvcHMsIHBXb3JkUHJvcHMsIHdyVGVtcCwgVFJVRSk7CisgICAgICAgIGJTZXQyID0gU2V0V29yZFByb3BzKGVQcm9wcywgcGxhY2UsIHBXb3JkUHJvcHMsIHdyVGVtcCwgVFJVRSk7CisKKyAgICAgICAgaWYgKCFiU2V0KQorICAgICAgICAgIGJTZXQgPSAoYlNldDEgfHwgYlNldDIpOworICAgICAgfQorCisgICAgICBFbmRHcm91cFVuZG8oKTsKKworICAgICAgaWYgKGJTZXQpIHsKKyAgICAgICAgUGFpbnRTZXRQcm9wcyhlUHJvcHMsIHdyVGVtcCk7CisgICAgICB9CiAgICAgfQorICB9CisKKyAgcmV0dXJuIGJTZXQ7CiB9CiAKLWludDMyX3QgQ0ZYX0VkaXQ6OkdldENhcmV0KCkgY29uc3QKLXsKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICAgICAgcmV0dXJuIG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX3dwQ2FyZXQpOwotCi0gICAgcmV0dXJuIC0xOwotfQotCi1DUFZUX1dvcmRQbGFjZSBDRlhfRWRpdDo6R2V0Q2FyZXRXb3JkUGxhY2UoKSBjb25zdAotewotICAgIHJldHVybiBtX3dwQ2FyZXQ7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENGWF9FZGl0OjpHZXRUZXh0KCkgY29uc3QKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBzd1JldDsKLQotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlJpY2ggPSBtX3BWVC0+SXNSaWNoVGV4dCgpOwotCi0gICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KDApOwotCi0gICAgICAgICAgICBDUFZUX1dvcmQgd29yZGluZm87Ci0gICAgICAgICAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLSAgICAgICAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiUmljaCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dSZXQgKz0gd29yZGluZm8uV29yZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3UmV0ICs9IHdvcmRpbmZvLldvcmQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob2xkcGxhY2UuU2VjQ21wKHBsYWNlKSAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3dSZXQgKz0gMHgwRDsKLSAgICAgICAgICAgICAgICAgICAgc3dSZXQgKz0gMHgwQTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvbGRwbGFjZSA9IHBsYWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN3UmV0OwotfQotCi1DRlhfV2lkZVN0cmluZyBDRlhfRWRpdDo6R2V0UmFuZ2VUZXh0KGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpIGNvbnN0Ci17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7Ci0KLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIEZYX0JPT0wgYlJpY2ggPSBtX3BWVC0+SXNSaWNoVGV4dCgpOwotCi0gICAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUFZUX1dvcmRSYW5nZSB3clRlbXAgPSByYW5nZTsKLSAgICAgICAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkJlZ2luUG9zKTsKLSAgICAgICAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkVuZFBvcyk7Ci0gICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHdyVGVtcC5CZWdpblBvcyk7Ci0KLSAgICAgICAgICAgIENQVlRfV29yZCB3b3JkaW5mbzsKLSAgICAgICAgICAgIENQVlRfV29yZFBsYWNlIG9sZHBsYWNlID0gd3JUZW1wLkJlZ2luUG9zOwotICAgICAgICAgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGxhY2UuV29yZENtcCh3clRlbXAuRW5kUG9zKSA+IDApYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiUmljaCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dSZXQgKz0gd29yZGluZm8uV29yZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3UmV0ICs9IHdvcmRpbmZvLldvcmQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob2xkcGxhY2UuU2VjQ21wKHBsYWNlKSAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3dSZXQgKz0gMHgwRDsKLSAgICAgICAgICAgICAgICAgICAgc3dSZXQgKz0gMHgwQTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvbGRwbGFjZSA9IHBsYWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN3UmV0OwotfQotCi1DRlhfV2lkZVN0cmluZyBDRlhfRWRpdDo6R2V0U2VsVGV4dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEdldFJhbmdlVGV4dChtX1NlbFN0YXRlLkNvbnZlcnRUb1dvcmRSYW5nZSgpKTsKLX0KLQotaW50MzJfdCBDRlhfRWRpdDo6R2V0VG90YWxXb3JkcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcFZULT5HZXRUb3RhbFdvcmRzKCk7Ci19Ci0KLWludDMyX3QgQ0ZYX0VkaXQ6OkdldFRvdGFsTGluZXMoKSBjb25zdAotewotICAgIGludDMyX3QgbkxpbmVzID0gMDsKLQotICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotICAgIHsKLSAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdCgwKTsKLSAgICAgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dExpbmUoKSkKLSAgICAgICAgICAgIG5MaW5lcysrOwotICAgIH0KLQotICAgIHJldHVybiBuTGluZXMrMTsKLX0KLQotQ1BWVF9Xb3JkUmFuZ2UgQ0ZYX0VkaXQ6OkdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCk7Ci19Ci0KLUNQVlRfV29yZFJhbmdlIENGWF9FZGl0OjpDb21iaW5lV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IxLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyMikKLXsKLSAgICBDUFZUX1dvcmRSYW5nZSB3clJldDsKLQotICAgIGlmICh3cjEuQmVnaW5Qb3MuV29yZENtcCh3cjIuQmVnaW5Qb3MpIDwgMCkKLSAgICB7Ci0gICAgICAgIHdyUmV0LkJlZ2luUG9zID0gd3IxLkJlZ2luUG9zOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB3clJldC5CZWdpblBvcyA9IHdyMi5CZWdpblBvczsKLSAgICB9Ci0KLSAgICBpZiAod3IxLkVuZFBvcy5Xb3JkQ21wKHdyMi5FbmRQb3MpIDwgMCkKLSAgICB7Ci0gICAgICAgIHdyUmV0LkVuZFBvcyA9IHdyMi5FbmRQb3M7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHdyUmV0LkVuZFBvcyA9IHdyMS5FbmRQb3M7Ci0gICAgfQotCi0gICAgcmV0dXJuIHdyUmV0OwotfQotCi1GWF9CT09MIENGWF9FZGl0OjpJc1JpY2hUZXh0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wVlQtPklzUmljaFRleHQoKTsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQvKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLSAgICBtX3BWVC0+U2V0UmljaFRleHQoYlJpY2hUZXh0KTsKLSAgICBpZiAoYlBhaW50KSBQYWludCgpOwotfQotCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoRm9udEluZGV4KGludDMyX3QgbkZvbnRJbmRleCkKLXsKLSAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7Ci0gICAgV29yZFByb3BzLm5Gb250SW5kZXggPSBuRm9udEluZGV4OwotICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0ZPTlRJTkRFWCxOVUxMLCZXb3JkUHJvcHMpOwotfQotCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQotewotICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKLSAgICBXb3JkUHJvcHMuZkZvbnRTaXplID0gZkZvbnRTaXplOwotICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0ZPTlRTSVpFLE5VTEwsJldvcmRQcm9wcyk7Ci19Ci0KLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Q29sb3IoRlhfQ09MT1JSRUYgZHdDb2xvcikKLXsKLSAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7Ci0gICAgV29yZFByb3BzLmR3V29yZENvbG9yID0gZHdDb2xvcjsKLSAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9XT1JEQ09MT1IsTlVMTCwmV29yZFByb3BzKTsKLX0KLQotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRTY3JpcHQoaW50MzJfdCBuU2NyaXB0VHlwZSkKLXsKLSAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7Ci0gICAgV29yZFByb3BzLm5TY3JpcHRUeXBlID0gblNjcmlwdFR5cGU7Ci0gICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfU0NSSVBUVFlQRSxOVUxMLCZXb3JkUHJvcHMpOwotfQotCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dEJvbGQoRlhfQk9PTCBiQm9sZCkKLXsKLSAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7Ci0gICAgaWYgKGJCb2xkKQotICAgICAgICBXb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0JPTEQ7Ci0gICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQk9MRCxOVUxMLCZXb3JkUHJvcHMpOwotfQotCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dEl0YWxpYyhGWF9CT09MIGJJdGFsaWMpCi17Ci0gICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwotICAgIGlmIChiSXRhbGljKQotICAgICAgICBXb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0lUQUxJQzsKLSAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9JVEFMSUMsTlVMTCwmV29yZFByb3BzKTsKLX0KLQotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRVbmRlcmxpbmUoRlhfQk9PTCBiVW5kZXJsaW5lKQotewotICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKLSAgICBpZiAoYlVuZGVybGluZSkKLSAgICAgICAgV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9VTkRFUkxJTkU7Ci0gICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfVU5ERVJMSU5FLE5VTEwsJldvcmRQcm9wcyk7Ci19Ci0KLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Q3Jvc3NvdXQoRlhfQk9PTCBiQ3Jvc3NvdXQpCi17Ci0gICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwotICAgIGlmIChiQ3Jvc3NvdXQpCi0gICAgICAgIFdvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7Ci0gICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQ1JPU1NPVVQsTlVMTCwmV29yZFByb3BzKTsKLX0KLQotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkKLXsKLSAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7Ci0gICAgV29yZFByb3BzLmZDaGFyU3BhY2UgPSBmQ2hhclNwYWNlOwotICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0NIQVJTUEFDRSxOVUxMLCZXb3JkUHJvcHMpOwotfQotCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgLyo9IDEwMCovKQotewotICAgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKLSAgICBXb3JkUHJvcHMubkhvcnpTY2FsZSA9IG5Ib3J6U2NhbGU7Ci0gICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfSE9SWlNDQUxFLE5VTEwsJldvcmRQcm9wcyk7Ci19Ci0KLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKQotewotICAgIENQVlRfU2VjUHJvcHMgU2VjUHJvcHM7Ci0gICAgU2VjUHJvcHMuZkxpbmVMZWFkaW5nID0gZkxpbmVMZWFkaW5nOwotICAgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0xJTkVMRUFESU5HLCZTZWNQcm9wcyxOVUxMKTsKLX0KLQotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRMaW5lSW5kZW50KEZYX0ZMT0FUIGZMaW5lSW5kZW50KQotewotICAgIENQVlRfU2VjUHJvcHMgU2VjUHJvcHM7Ci0gICAgU2VjUHJvcHMuZkxpbmVJbmRlbnQgPSBmTGluZUluZGVudDsKLSAgICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9MSU5FSU5ERU5ULCZTZWNQcm9wcyxOVUxMKTsKLX0KLQotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRBbGlnbm1lbnQoaW50MzJfdCBuQWxpZ25tZW50KQotewotICAgIENQVlRfU2VjUHJvcHMgU2VjUHJvcHM7Ci0gICAgU2VjUHJvcHMubkFsaWdubWVudCA9IG5BbGlnbm1lbnQ7Ci0gICAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQUxJR05NRU5ULCZTZWNQcm9wcyxOVUxMKTsKLX0KLQotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpCi17Ci0gICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiU2V0MSxiU2V0MjsKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSAmJiBtX3BWVC0+SXNSaWNoVGV4dCgpKQotICAgIHsKLSAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENQVlRfV29yZFJhbmdlIHdyVGVtcCA9IG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCk7Ci0KLSAgICAgICAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkJlZ2luUG9zKTsKLSAgICAgICAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkVuZFBvcyk7Ci0gICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHdyVGVtcC5CZWdpblBvcyk7Ci0KLSAgICAgICAgICAgIEJlZ2luR3JvdXBVbmRvKEwiIik7OwotCi0gICAgICAgICAgICBiU2V0ID0gU2V0U2VjUHJvcHMoZVByb3BzLHdyVGVtcC5CZWdpblBvcyxwU2VjUHJvcHMscFdvcmRQcm9wcyx3clRlbXAsVFJVRSk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBsYWNlLldvcmRDbXAod3JUZW1wLkVuZFBvcykgPiAwKSBicmVhazsKLSAgICAgICAgICAgICAgICBiU2V0MSA9IFNldFNlY1Byb3BzKGVQcm9wcyxwbGFjZSxwU2VjUHJvcHMscFdvcmRQcm9wcyx3clRlbXAsVFJVRSk7Ci0gICAgICAgICAgICAgICAgYlNldDIgPSBTZXRXb3JkUHJvcHMoZVByb3BzLHBsYWNlLHBXb3JkUHJvcHMsd3JUZW1wLFRSVUUpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFiU2V0KQotICAgICAgICAgICAgICAgICAgICBiU2V0ID0gKGJTZXQxIHx8IGJTZXQyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRW5kR3JvdXBVbmRvKCk7Ci0KLSAgICAgICAgICAgIGlmIChiU2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhaW50U2V0UHJvcHMoZVByb3BzLHdyVGVtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYlNldDsKLX0KLQotdm9pZCBDRlhfRWRpdDo6UGFpbnRTZXRQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKQotewotICAgIHN3aXRjaChlUHJvcHMpCi0gICAgewordm9pZCBDRlhfRWRpdDo6UGFpbnRTZXRQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpIHsKKyAgc3dpdGNoIChlUHJvcHMpIHsKICAgICBjYXNlIEVQX0xJTkVMRUFESU5HOgogICAgIGNhc2UgRVBfTElORUlOREVOVDoKICAgICBjYXNlIEVQX0FMSUdOTUVOVDoKLSAgICAgICAgUmVhcnJhbmdlUGFydCh3cik7Ci0gICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgICAgUmVmcmVzaChSUF9BTkFMWVNFKTsKLSAgICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKLSAgICAgICAgU2V0Q2FyZXRJbmZvKCk7Ci0gICAgICAgIGJyZWFrOworICAgICAgUmVhcnJhbmdlUGFydCh3cik7CisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBSZWZyZXNoKFJQX0FOQUxZU0UpOworICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBFUF9XT1JEQ09MT1I6CiAgICAgY2FzZSBFUF9VTkRFUkxJTkU6CiAgICAgY2FzZSBFUF9DUk9TU09VVDoKLSAgICAgICAgUmVmcmVzaChSUF9PUFRJT05BTCwmd3IpOwotICAgICAgICBicmVhazsKKyAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3cik7CisgICAgICBicmVhazsKICAgICBjYXNlIEVQX0ZPTlRJTkRFWDoKICAgICBjYXNlIEVQX0ZPTlRTSVpFOgogICAgIGNhc2UgRVBfU0NSSVBUVFlQRToKQEAgLTE1MDMsMjA1MyArMTMyMCwxODE0IEBACiAgICAgY2FzZSBFUF9IT1JaU0NBTEU6CiAgICAgY2FzZSBFUF9CT0xEOgogICAgIGNhc2UgRVBfSVRBTElDOgotICAgICAgICBSZWFycmFuZ2VQYXJ0KHdyKTsKLSAgICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgUmVhcnJhbmdlUGFydCh3cik7CisgICAgICBTY3JvbGxUb0NhcmV0KCk7CiAKLSAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3JSZWZyZXNoKG1fcFZULT5HZXRTZWN0aW9uQmVnaW5QbGFjZSh3ci5CZWdpblBvcyksCi0gICAgICAgICAgICBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKHdyLkVuZFBvcykpOwotICAgICAgICBSZWZyZXNoKFJQX0FOQUxZU0UsJndyUmVmcmVzaCk7CisgICAgICBDUFZUX1dvcmRSYW5nZSB3clJlZnJlc2gobV9wVlQtPkdldFNlY3Rpb25CZWdpblBsYWNlKHdyLkJlZ2luUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKHdyLkVuZFBvcykpOworICAgICAgUmVmcmVzaChSUF9BTkFMWVNFLCAmd3JSZWZyZXNoKTsKIAotICAgICAgICBTZXRDYXJldE9yaWdpbigpOwotICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgYnJlYWs7CisgIH0KIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0U2VjUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ciwgRlhfQk9PTCBiQWRkVW5kbykKLXsKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSAmJiBtX3BWVC0+SXNSaWNoVGV4dCgpKQotICAgIHsKLSAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOwotICAgICAgICAgICAgQ1BWVF9TZWN0aW9uIHNlY2luZm87Ci0gICAgICAgICAgICBDUFZUX1NlY3Rpb24gT2xkU2VjaW5mbzsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFNlY1Byb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkZFVuZG8pIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkgJiYgbV9wVlQtPklzUmljaFRleHQoKSkgeworICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgQ1BWVF9TZWN0aW9uIHNlY2luZm87CisgICAgICBDUFZUX1NlY3Rpb24gT2xkU2VjaW5mbzsKIAotICAgICAgICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKIAotICAgICAgICAgICAgaWYgKGVQcm9wcyA9PSBFUF9MSU5FTEVBRElORyB8fCBlUHJvcHMgPT0gRVBfTElORUlOREVOVCB8fCBlUHJvcHMgPT0gRVBfQUxJR05NRU5UKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwU2VjUHJvcHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWNpbmZvKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJBZGRVbmRvKSBPbGRTZWNpbmZvID0gc2VjaW5mbzsKKyAgICAgIGlmIChlUHJvcHMgPT0gRVBfTElORUxFQURJTkcgfHwgZVByb3BzID09IEVQX0xJTkVJTkRFTlQgfHwKKyAgICAgICAgICBlUHJvcHMgPT0gRVBfQUxJR05NRU5UKSB7CisgICAgICAgIGlmIChwU2VjUHJvcHMpIHsKKyAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKKyAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY2luZm8pKSB7CisgICAgICAgICAgICBpZiAoYkFkZFVuZG8pCisgICAgICAgICAgICAgIE9sZFNlY2luZm8gPSBzZWNpbmZvOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZVByb3BzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9MSU5FTEVBRElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHNlY2luZm8uU2VjUHJvcHMuZkxpbmVMZWFkaW5nLHBTZWNQcm9wcy0+ZkxpbmVMZWFkaW5nKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uU2VjUHJvcHMuZkxpbmVMZWFkaW5nID0gcFNlY1Byb3BzLT5mTGluZUxlYWRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfTElORUlOREVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHNlY2luZm8uU2VjUHJvcHMuZkxpbmVJbmRlbnQscFNlY1Byb3BzLT5mTGluZUluZGVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLlNlY1Byb3BzLmZMaW5lSW5kZW50ID0gcFNlY1Byb3BzLT5mTGluZUluZGVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9BTElHTk1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uU2VjUHJvcHMubkFsaWdubWVudCAhPSBwU2VjUHJvcHMtPm5BbGlnbm1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLlNlY1Byb3BzLm5BbGlnbm1lbnQgPSBwU2VjUHJvcHMtPm5BbGlnbm1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoZVByb3BzKSB7CisgICAgICAgICAgICAgIGNhc2UgRVBfTElORUxFQURJTkc6CisgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChzZWNpbmZvLlNlY1Byb3BzLmZMaW5lTGVhZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWNQcm9wcy0+ZkxpbmVMZWFkaW5nKSkgeworICAgICAgICAgICAgICAgICAgc2VjaW5mby5TZWNQcm9wcy5mTGluZUxlYWRpbmcgPSBwU2VjUHJvcHMtPmZMaW5lTGVhZGluZzsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocFdvcmRQcm9wcyAmJiBwbGFjZSA9PSBtX3BWVC0+R2V0U2VjdGlvbkJlZ2luUGxhY2UocGxhY2UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjaW5mbykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiQWRkVW5kbykgT2xkU2VjaW5mbyA9IHNlY2luZm87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChlUHJvcHMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0ZPTlRJTkRFWDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjaW5mby5Xb3JkUHJvcHMubkZvbnRJbmRleCAhPSBwV29yZFByb3BzLT5uRm9udEluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubkZvbnRJbmRleCA9IHBXb3JkUHJvcHMtPm5Gb250SW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfRk9OVFNJWkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChzZWNpbmZvLldvcmRQcm9wcy5mRm9udFNpemUscFdvcmRQcm9wcy0+ZkZvbnRTaXplKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLmZGb250U2l6ZSA9IHBXb3JkUHJvcHMtPmZGb250U2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9XT1JEQ09MT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uV29yZFByb3BzLmR3V29yZENvbG9yICE9IHBXb3JkUHJvcHMtPmR3V29yZENvbG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IgPSBwV29yZFByb3BzLT5kd1dvcmRDb2xvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9TQ1JJUFRUWVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNpbmZvLldvcmRQcm9wcy5uU2NyaXB0VHlwZSAhPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5TY3JpcHRUeXBlID0gcFdvcmRQcm9wcy0+blNjcmlwdFR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfQ0hBUlNQQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5Xb3JkUHJvcHMuZkNoYXJTcGFjZSxwV29yZFByb3BzLT5mQ2hhclNwYWNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLmZDaGFyU3BhY2UgPSBwV29yZFByb3BzLT5mQ2hhclNwYWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0hPUlpTQ0FMRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjaW5mby5Xb3JkUHJvcHMubkhvcnpTY2FsZSAhPSBwV29yZFByb3BzLT5uSG9yelNjYWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubkhvcnpTY2FsZSA9IHBXb3JkUHJvcHMtPm5Ib3J6U2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfVU5ERVJMSU5FOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9DUk9TU09VVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdvcmRQcm9wcy0+bldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0NST1NTT1VUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0JPTEQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9CT0xEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0JPTEQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfSVRBTElDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0lUQUxJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfSVRBTElDKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0lUQUxJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVQX0xJTkVJTkRFTlQ6CisgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChzZWNpbmZvLlNlY1Byb3BzLmZMaW5lSW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlY1Byb3BzLT5mTGluZUluZGVudCkpIHsKKyAgICAgICAgICAgICAgICAgIHNlY2luZm8uU2VjUHJvcHMuZkxpbmVJbmRlbnQgPSBwU2VjUHJvcHMtPmZMaW5lSW5kZW50OworICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYlNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwSXRlcmF0b3ItPlNldFNlY3Rpb24oc2VjaW5mbyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfU2V0U2VjUHJvcHMKLSAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLHBsYWNlLGVQcm9wcyxPbGRTZWNpbmZvLlNlY1Byb3BzLE9sZFNlY2luZm8uV29yZFByb3BzLHNlY2luZm8uU2VjUHJvcHMsc2VjaW5mby5Xb3JkUHJvcHMsd3IpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFUF9BTElHTk1FTlQ6CisgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uU2VjUHJvcHMubkFsaWdubWVudCAhPSBwU2VjUHJvcHMtPm5BbGlnbm1lbnQpIHsKKyAgICAgICAgICAgICAgICAgIHNlY2luZm8uU2VjUHJvcHMubkFsaWdubWVudCA9IHBTZWNQcm9wcy0+bkFsaWdubWVudDsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChvbGRwbGFjZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBiU2V0OworICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwV29yZFByb3BzICYmIHBsYWNlID09IG1fcFZULT5HZXRTZWN0aW9uQmVnaW5QbGFjZShwbGFjZSkpIHsKKyAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKKyAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY2luZm8pKSB7CisgICAgICAgICAgICBpZiAoYkFkZFVuZG8pCisgICAgICAgICAgICAgIE9sZFNlY2luZm8gPSBzZWNpbmZvOwogCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGWF9FZGl0OjpTZXRXb3JkUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyLCBGWF9CT09MIGJBZGRVbmRvKQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpICYmIG1fcFZULT5Jc1JpY2hUZXh0KCkpCi0gICAgewotICAgICAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBDUFZUX1dvcmQgd29yZGluZm87Ci0gICAgICAgICAgICBDUFZUX1dvcmQgT2xkV29yZGluZm87Ci0KLSAgICAgICAgICAgIENQVlRfV29yZFBsYWNlIG9sZHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCi0gICAgICAgICAgICBpZiAocFdvcmRQcm9wcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiQWRkVW5kbykgT2xkV29yZGluZm8gPSB3b3JkaW5mbzsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZVByb3BzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfRk9OVElOREVYOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRpbmZvLldvcmRQcm9wcy5uRm9udEluZGV4ICE9IHBXb3JkUHJvcHMtPm5Gb250SW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwID0gR2V0Rm9udE1hcCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Gb250SW5kZXggPSBwRm9udE1hcC0+R2V0V29yZEZvbnRJbmRleCh3b3JkaW5mby5Xb3JkLHdvcmRpbmZvLm5DaGFyc2V0LHBXb3JkUHJvcHMtPm5Gb250SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0ZPTlRTSVpFOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbCh3b3JkaW5mby5Xb3JkUHJvcHMuZkZvbnRTaXplLHBXb3JkUHJvcHMtPmZGb250U2l6ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmZGb250U2l6ZSA9IHBXb3JkUHJvcHMtPmZGb250U2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX1dPUkRDT0xPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JkaW5mby5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IgIT0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3IpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmR3V29yZENvbG9yID0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFUF9TQ1JJUFRUWVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRpbmZvLldvcmRQcm9wcy5uU2NyaXB0VHlwZSAhPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMublNjcmlwdFR5cGUgPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEVQX0NIQVJTUEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwod29yZGluZm8uV29yZFByb3BzLmZDaGFyU3BhY2UscFdvcmRQcm9wcy0+ZkNoYXJTcGFjZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmZDaGFyU3BhY2UgPSBwV29yZFByb3BzLT5mQ2hhclNwYWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfSE9SWlNDQUxFOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRpbmZvLldvcmRQcm9wcy5uSG9yelNjYWxlICE9IHBXb3JkUHJvcHMtPm5Ib3J6U2NhbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Ib3J6U2NhbGUgPSBwV29yZFByb3BzLT5uSG9yelNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfVU5ERVJMSU5FOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX1VOREVSTElORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfQ1JPU1NPVVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdvcmRQcm9wcy0+bldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0NST1NTT1VUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmPSB+UFZUV09SRF9TVFlMRV9DUk9TU09VVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfQk9MRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0JPTEQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfQk9MRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRVBfSVRBTElDOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0lUQUxJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0lUQUxJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChlUHJvcHMpIHsKKyAgICAgICAgICAgICAgY2FzZSBFUF9GT05USU5ERVg6CisgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uV29yZFByb3BzLm5Gb250SW5kZXggIT0gcFdvcmRQcm9wcy0+bkZvbnRJbmRleCkgeworICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubkZvbnRJbmRleCA9IHBXb3JkUHJvcHMtPm5Gb250SW5kZXg7CisgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChiU2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBJdGVyYXRvci0+U2V0V29yZCh3b3JkaW5mbyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfU2V0V29yZFByb3BzCi0gICAgICAgICAgICAgICAgICAgICAgICAodGhpcyxwbGFjZSxlUHJvcHMsT2xkV29yZGluZm8uV29yZFByb3BzLHdvcmRpbmZvLldvcmRQcm9wcyx3cikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVQX0ZPTlRTSVpFOgorICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5Xb3JkUHJvcHMuZkZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmRQcm9wcy0+ZkZvbnRTaXplKSkgeworICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMuZkZvbnRTaXplID0gcFdvcmRQcm9wcy0+ZkZvbnRTaXplOworICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVQX1dPUkRDT0xPUjoKKyAgICAgICAgICAgICAgICBpZiAoc2VjaW5mby5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IgIT0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3IpIHsKKyAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLmR3V29yZENvbG9yID0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3I7CisgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRVBfU0NSSVBUVFlQRToKKyAgICAgICAgICAgICAgICBpZiAoc2VjaW5mby5Xb3JkUHJvcHMublNjcmlwdFR5cGUgIT0gcFdvcmRQcm9wcy0+blNjcmlwdFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5TY3JpcHRUeXBlID0gcFdvcmRQcm9wcy0+blNjcmlwdFR5cGU7CisgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRVBfQ0hBUlNQQUNFOgorICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5Xb3JkUHJvcHMuZkNoYXJTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JkUHJvcHMtPmZDaGFyU3BhY2UpKSB7CisgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5mQ2hhclNwYWNlID0gcFdvcmRQcm9wcy0+ZkNoYXJTcGFjZTsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFUF9IT1JaU0NBTEU6CisgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uV29yZFByb3BzLm5Ib3J6U2NhbGUgIT0gcFdvcmRQcm9wcy0+bkhvcnpTY2FsZSkgeworICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubkhvcnpTY2FsZSA9IHBXb3JkUHJvcHMtPm5Ib3J6U2NhbGU7CisgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRVBfVU5ERVJMSU5FOgorICAgICAgICAgICAgICAgIGlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmCisgICAgICAgICAgICAgICAgICAgICAgIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9VTkRFUkxJTkU7CisgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJgorICAgICAgICAgICAgICAgICAgICAgICBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX1VOREVSTElORTsKKyAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVQX0NST1NTT1VUOgorICAgICAgICAgICAgICAgIGlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgeworICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9DUk9TU09VVDsKKyAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpICE9CisgICAgICAgICAgICAgICAgICAgICAgMCkgeworICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0NST1NTT1VUOworICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRVBfQk9MRDoKKyAgICAgICAgICAgICAgICBpZiAocFdvcmRQcm9wcy0+bldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQk9MRCkgeworICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSA9PQorICAgICAgICAgICAgICAgICAgICAgIDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0JPTEQ7CisgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpICE9CisgICAgICAgICAgICAgICAgICAgICAgMCkgeworICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0JPTEQ7CisgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFUF9JVEFMSUM6CisgICAgICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykgeworICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpID09CisgICAgICAgICAgICAgICAgICAgICAgMCkgeworICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfSVRBTElDOworICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpICE9CisgICAgICAgICAgICAgICAgICAgICAgMCkgeworICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0lUQUxJQzsKKyAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KG9sZHBsYWNlKTsKLSAgICAgICAgICAgIHJldHVybiBiU2V0OworICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoYlNldCkgeworICAgICAgICBwSXRlcmF0b3ItPlNldFNlY3Rpb24oc2VjaW5mbyk7CisKKyAgICAgICAgaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pIHsKKyAgICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX1NldFNlY1Byb3BzKAorICAgICAgICAgICAgICB0aGlzLCBwbGFjZSwgZVByb3BzLCBPbGRTZWNpbmZvLlNlY1Byb3BzLCBPbGRTZWNpbmZvLldvcmRQcm9wcywKKyAgICAgICAgICAgICAgc2VjaW5mby5TZWNQcm9wcywgc2VjaW5mby5Xb3JkUHJvcHMsIHdyKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcEl0ZXJhdG9yLT5TZXRBdChvbGRwbGFjZSk7CisKKyAgICAgIHJldHVybiBiU2V0OwogICAgIH0KKyAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsaW50MzJfdCBjaGFyc2V0IC8qPSBERUZBVUxUX0NIQVJTRVQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgLyo9IE5VTEwqLyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgLyo9IE5VTEwqLykKLXsKLSAgICBTZXRUZXh0KHRleHQsY2hhcnNldCxwU2VjUHJvcHMscFdvcmRQcm9wcyxUUlVFLFRSVUUpOworRlhfQk9PTCBDRlhfRWRpdDo6U2V0V29yZFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGRVbmRvKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpICYmIG1fcFZULT5Jc1JpY2hUZXh0KCkpIHsKKyAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKKyAgICAgIENQVlRfV29yZCB3b3JkaW5mbzsKKyAgICAgIENQVlRfV29yZCBPbGRXb3JkaW5mbzsKKworICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisKKyAgICAgIGlmIChwV29yZFByb3BzKSB7CisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQocGxhY2UpOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKSkgeworICAgICAgICAgIGlmIChiQWRkVW5kbykKKyAgICAgICAgICAgIE9sZFdvcmRpbmZvID0gd29yZGluZm87CisKKyAgICAgICAgICBzd2l0Y2ggKGVQcm9wcykgeworICAgICAgICAgICAgY2FzZSBFUF9GT05USU5ERVg6CisgICAgICAgICAgICAgIGlmICh3b3JkaW5mby5Xb3JkUHJvcHMubkZvbnRJbmRleCAhPSBwV29yZFByb3BzLT5uRm9udEluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwID0gR2V0Rm9udE1hcCgpKSB7CisgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubkZvbnRJbmRleCA9IHBGb250TWFwLT5HZXRXb3JkRm9udEluZGV4KAorICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmQsIHdvcmRpbmZvLm5DaGFyc2V0LCBwV29yZFByb3BzLT5uRm9udEluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVQX0ZPTlRTSVpFOgorICAgICAgICAgICAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHdvcmRpbmZvLldvcmRQcm9wcy5mRm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmRQcm9wcy0+ZkZvbnRTaXplKSkgeworICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5mRm9udFNpemUgPSBwV29yZFByb3BzLT5mRm9udFNpemU7CisgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVQX1dPUkRDT0xPUjoKKyAgICAgICAgICAgICAgaWYgKHdvcmRpbmZvLldvcmRQcm9wcy5kd1dvcmRDb2xvciAhPSBwV29yZFByb3BzLT5kd1dvcmRDb2xvcikgeworICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5kd1dvcmRDb2xvciA9IHBXb3JkUHJvcHMtPmR3V29yZENvbG9yOworICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFUF9TQ1JJUFRUWVBFOgorICAgICAgICAgICAgICBpZiAod29yZGluZm8uV29yZFByb3BzLm5TY3JpcHRUeXBlICE9IHBXb3JkUHJvcHMtPm5TY3JpcHRUeXBlKSB7CisgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5TY3JpcHRUeXBlID0gcFdvcmRQcm9wcy0+blNjcmlwdFR5cGU7CisgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVQX0NIQVJTUEFDRToKKyAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbCh3b3JkaW5mby5Xb3JkUHJvcHMuZkNoYXJTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yZFByb3BzLT5mQ2hhclNwYWNlKSkgeworICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5mQ2hhclNwYWNlID0gcFdvcmRQcm9wcy0+ZkNoYXJTcGFjZTsKKyAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVBfSE9SWlNDQUxFOgorICAgICAgICAgICAgICBpZiAod29yZGluZm8uV29yZFByb3BzLm5Ib3J6U2NhbGUgIT0gcFdvcmRQcm9wcy0+bkhvcnpTY2FsZSkgeworICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uSG9yelNjYWxlID0gcFdvcmRQcm9wcy0+bkhvcnpTY2FsZTsKKyAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVBfVU5ERVJMSU5FOgorICAgICAgICAgICAgICBpZiAocFdvcmRQcm9wcy0+bldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKSB7CisgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKSA9PQorICAgICAgICAgICAgICAgICAgICAwKSB7CisgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX1VOREVSTElORTsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpICE9CisgICAgICAgICAgICAgICAgICAgIDApIHsKKyAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX1VOREVSTElORTsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVBfQ1JPU1NPVVQ6CisgICAgICAgICAgICAgIGlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgeworICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKSA9PQorICAgICAgICAgICAgICAgICAgICAwKSB7CisgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0NST1NTT1VUOworICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKSAhPQorICAgICAgICAgICAgICAgICAgICAwKSB7CisgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmPSB+UFZUV09SRF9TVFlMRV9DUk9TU09VVDsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVBfQk9MRDoKKyAgICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0JPTEQ7CisgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQk9MRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfQk9MRDsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVBfSVRBTElDOgorICAgICAgICAgICAgICBpZiAocFdvcmRQcm9wcy0+bldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfSVRBTElDKSB7CisgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfSVRBTElDKSA9PQorICAgICAgICAgICAgICAgICAgICAwKSB7CisgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0lUQUxJQzsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpICE9CisgICAgICAgICAgICAgICAgICAgIDApIHsKKyAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0lUQUxJQzsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoYlNldCkgeworICAgICAgICBwSXRlcmF0b3ItPlNldFdvcmQod29yZGluZm8pOworCisgICAgICAgIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKSB7CisgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9TZXRXb3JkUHJvcHModGhpcywgcGxhY2UsIGVQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGRXb3JkaW5mby5Xb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLCB3cikpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHBJdGVyYXRvci0+U2V0QXQob2xkcGxhY2UpOworICAgICAgcmV0dXJuIGJTZXQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0IC8qPSBERUZBVUxUX0NIQVJTRVQqLywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCi17Ci0gICAgcmV0dXJuIEluc2VydFdvcmQod29yZCxjaGFyc2V0LHBXb3JkUHJvcHMsVFJVRSxUUlVFKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCAvKj0gREVGQVVMVF9DSEFSU0VUKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcyAvKj0gTlVMTCovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyAvKj0gTlVMTCovKSB7CisgIFNldFRleHQodGV4dCwgY2hhcnNldCwgcFNlY1Byb3BzLCBwV29yZFByb3BzLCBUUlVFLCBUUlVFKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgLyo9IE5VTEwqLyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgLyo9IE5VTEwqLykKLXsKLSAgICByZXR1cm4gSW5zZXJ0UmV0dXJuKHBTZWNQcm9wcyxwV29yZFByb3BzLFRSVUUsVFJVRSk7CitGWF9CT09MIENGWF9FZGl0OjpJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0IC8qPSBERUZBVUxUX0NIQVJTRVQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgLyo9IE5VTEwqLykgeworICByZXR1cm4gSW5zZXJ0V29yZCh3b3JkLCBjaGFyc2V0LCBwV29yZFByb3BzLCBUUlVFLCBUUlVFKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6QmFja3NwYWNlKCkKLXsKLSAgICByZXR1cm4gQmFja3NwYWNlKFRSVUUsVFJVRSk7CitGWF9CT09MIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzIC8qPSBOVUxMKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgLyo9IE5VTEwqLykgeworICByZXR1cm4gSW5zZXJ0UmV0dXJuKHBTZWNQcm9wcywgcFdvcmRQcm9wcywgVFJVRSwgVFJVRSk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OkRlbGV0ZSgpCi17Ci0gICAgcmV0dXJuIERlbGV0ZShUUlVFLFRSVUUpOworRlhfQk9PTCBDRlhfRWRpdDo6QmFja3NwYWNlKCkgeworICByZXR1cm4gQmFja3NwYWNlKFRSVUUsIFRSVUUpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpDbGVhcigpCi17Ci0gICAgcmV0dXJuIENsZWFyKFRSVUUsVFJVRSk7CitGWF9CT09MIENGWF9FZGl0OjpEZWxldGUoKSB7CisgIHJldHVybiBEZWxldGUoVFJVRSwgVFJVRSk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6Okluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCAvKj0gREVGQVVMVF9DSEFSU0VUKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgLyo9IE5VTEwqLyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgLyo9IE5VTEwqLykKLXsKLSAgICByZXR1cm4gSW5zZXJ0VGV4dCh0ZXh0LGNoYXJzZXQscFNlY1Byb3BzLHBXb3JkUHJvcHMsVFJVRSxUUlVFKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OkNsZWFyKCkgeworICByZXR1cm4gQ2xlYXIoVFJVRSwgVFJVRSk7CiB9CiAKLUZYX0ZMT0FUIENGWF9FZGl0OjpHZXRGb250U2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcFZULT5HZXRGb250U2l6ZSgpOworRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0IC8qPSBERUZBVUxUX0NIQVJTRVQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzIC8qPSBOVUxMKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pIHsKKyAgcmV0dXJuIEluc2VydFRleHQodGV4dCwgY2hhcnNldCwgcFNlY1Byb3BzLCBwV29yZFByb3BzLCBUUlVFLCBUUlVFKTsKIH0KIAotRlhfV09SRCBDRlhfRWRpdDo6R2V0UGFzc3dvcmRDaGFyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wVlQtPkdldFBhc3N3b3JkQ2hhcigpOworRlhfRkxPQVQgQ0ZYX0VkaXQ6OkdldEZvbnRTaXplKCkgY29uc3QgeworICByZXR1cm4gbV9wVlQtPkdldEZvbnRTaXplKCk7CiB9CiAKLWludDMyX3QgQ0ZYX0VkaXQ6OkdldENoYXJBcnJheSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcFZULT5HZXRDaGFyQXJyYXkoKTsKK0ZYX1dPUkQgQ0ZYX0VkaXQ6OkdldFBhc3N3b3JkQ2hhcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZULT5HZXRQYXNzd29yZENoYXIoKTsKIH0KIAotQ1BERl9SZWN0IENGWF9FZGl0OjpHZXRQbGF0ZVJlY3QoKSBjb25zdAotewotICAgIHJldHVybiBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CitpbnQzMl90IENGWF9FZGl0OjpHZXRDaGFyQXJyYXkoKSBjb25zdCB7CisgIHJldHVybiBtX3BWVC0+R2V0Q2hhckFycmF5KCk7CiB9CiAKLUNQREZfUmVjdCBDRlhfRWRpdDo6R2V0Q29udGVudFJlY3QoKSBjb25zdAotewotICAgIHJldHVybiBWVFRvRWRpdChtX3BWVC0+R2V0Q29udGVudFJlY3QoKSk7CitDUERGX1JlY3QgQ0ZYX0VkaXQ6OkdldFBsYXRlUmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKIH0KIAotaW50MzJfdCBDRlhfRWRpdDo6R2V0SG9yelNjYWxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wVlQtPkdldEhvcnpTY2FsZSgpOworQ1BERl9SZWN0IENGWF9FZGl0OjpHZXRDb250ZW50UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIFZUVG9FZGl0KG1fcFZULT5HZXRDb250ZW50UmVjdCgpKTsKIH0KIAotRlhfRkxPQVQgQ0ZYX0VkaXQ6OkdldENoYXJTcGFjZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcFZULT5HZXRDaGFyU3BhY2UoKTsKK2ludDMyX3QgQ0ZYX0VkaXQ6OkdldEhvcnpTY2FsZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZULT5HZXRIb3J6U2NhbGUoKTsKK30KKworRlhfRkxPQVQgQ0ZYX0VkaXQ6OkdldENoYXJTcGFjZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZULT5HZXRDaGFyU3BhY2UoKTsKIH0KIAogLy8gaW5uZXIgbWV0aG9kcwogCi1DUFZUX1dvcmRSYW5nZSBDRlhfRWRpdDo6R2V0V2hvbGVXb3JkUmFuZ2UoKSBjb25zdAotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgICAgICByZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCksbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKTsKK0NQVlRfV29yZFJhbmdlIENGWF9FZGl0OjpHZXRXaG9sZVdvcmRSYW5nZSgpIGNvbnN0IHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpLCBtX3BWVC0+R2V0RW5kV29yZFBsYWNlKCkpOwogCi0gICAgcmV0dXJuIENQVlRfV29yZFJhbmdlKCk7CisgIHJldHVybiBDUFZUX1dvcmRSYW5nZSgpOwogfQogCi1DUFZUX1dvcmRSYW5nZSBDRlhfRWRpdDo6R2V0VmlzaWJsZVdvcmRSYW5nZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fYkVuYWJsZU92ZXJmbG93KSByZXR1cm4gR2V0V2hvbGVXb3JkUmFuZ2UoKTsKK0NQVlRfV29yZFJhbmdlIENGWF9FZGl0OjpHZXRWaXNpYmxlV29yZFJhbmdlKCkgY29uc3QgeworICBpZiAobV9iRW5hYmxlT3ZlcmZsb3cpCisgICAgcmV0dXJuIEdldFdob2xlV29yZFJhbmdlKCk7CiAKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIENQREZfUmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOwotCi0gICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlMSA9IG1fcFZULT5TZWFyY2hXb3JkUGxhY2UoRWRpdFRvVlQoQ1BERl9Qb2ludChyY1BsYXRlLmxlZnQscmNQbGF0ZS50b3ApKSk7Ci0gICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlMiA9IG1fcFZULT5TZWFyY2hXb3JkUGxhY2UoRWRpdFRvVlQoQ1BERl9Qb2ludChyY1BsYXRlLnJpZ2h0LHJjUGxhdGUuYm90dG9tKSkpOwotCi0gICAgICAgIHJldHVybiBDUFZUX1dvcmRSYW5nZShwbGFjZTEscGxhY2UyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UoKTsKLX0KLQotQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OlNlYXJjaFdvcmRQbGFjZShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QKLXsKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BWVC0+U2VhcmNoV29yZFBsYWNlKEVkaXRUb1ZUKHBvaW50KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIENQVlRfV29yZFBsYWNlKCk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlBhaW50KCkKLXsKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIFJlYXJyYW5nZUFsbCgpOwotICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgIFJlZnJlc2goUlBfTk9BTkFMWVNFKTsKLSAgICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKLSAgICAgICAgU2V0Q2FyZXRJbmZvKCk7Ci0gICAgfQotfQotCi12b2lkIENGWF9FZGl0OjpSZWFycmFuZ2VBbGwoKQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotICAgICAgICBtX3BWVC0+UmVhcnJhbmdlQWxsKCk7Ci0gICAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKLSAgICAgICAgU2V0U2Nyb2xsSW5mbygpOwotICAgICAgICBTZXRDb250ZW50Q2hhbmdlZCgpOwotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6UmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHJhbmdlKQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotICAgICAgICBtX3BWVC0+UmVhcnJhbmdlUGFydChyYW5nZSk7Ci0gICAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKLSAgICAgICAgU2V0U2Nyb2xsSW5mbygpOwotICAgICAgICBTZXRDb250ZW50Q2hhbmdlZCgpOwotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0Q29udGVudENoYW5nZWQoKQotewotICAgIGlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KQotICAgIHsKLSAgICAgICAgQ1BERl9SZWN0IHJjQ29udGVudCA9IG1fcFZULT5HZXRDb250ZW50UmVjdCgpOwotICAgICAgICBpZiAocmNDb250ZW50LldpZHRoKCkgIT0gbV9yY09sZENvbnRlbnQuV2lkdGgoKSB8fAotICAgICAgICAgICAgcmNDb250ZW50LkhlaWdodCgpICE9IG1fcmNPbGRDb250ZW50LkhlaWdodCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25Db250ZW50Q2hhbmdlKHJjQ29udGVudCk7Ci0gICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9yY09sZENvbnRlbnQgPSByY0NvbnRlbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNlbGVjdEFsbCgpCi17Ci0gICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBtX1NlbFN0YXRlID0gR2V0V2hvbGVXb3JkUmFuZ2UoKTsKLSAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOwotCi0gICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3JWaXNpYmxlID0gR2V0VmlzaWJsZVdvcmRSYW5nZSgpOwotICAgICAgICBSZWZyZXNoKFJQX09QVElPTkFMLCZ3clZpc2libGUpOwotICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNlbGVjdE5vbmUoKQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUFZUX1dvcmRSYW5nZSB3clRlbXAgPSBtX1NlbFN0YXRlLkNvbnZlcnRUb1dvcmRSYW5nZSgpOwotICAgICAgICAgICAgbV9TZWxTdGF0ZS5EZWZhdWx0KCk7Ci0gICAgICAgICAgICBSZWZyZXNoKFJQX09QVElPTkFMLCZ3clRlbXApOwotICAgICAgICB9Ci0gICAgfQotfQotCi1GWF9CT09MIENGWF9FZGl0OjpJc1NlbGVjdGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9TZWxTdGF0ZS5Jc0V4aXN0KCk7Ci19Ci0KLUNQREZfUG9pbnQgQ0ZYX0VkaXQ6OlZUVG9FZGl0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLSAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CiAgICAgQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CiAKLSAgICBGWF9GTE9BVCBmUGFkZGluZyA9IDAuMGY7CisgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UxID0KKyAgICAgICAgbV9wVlQtPlNlYXJjaFdvcmRQbGFjZShFZGl0VG9WVChDUERGX1BvaW50KHJjUGxhdGUubGVmdCwgcmNQbGF0ZS50b3ApKSk7CisgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UyID0gbV9wVlQtPlNlYXJjaFdvcmRQbGFjZSgKKyAgICAgICAgRWRpdFRvVlQoQ1BERl9Qb2ludChyY1BsYXRlLnJpZ2h0LCByY1BsYXRlLmJvdHRvbSkpKTsKIAotICAgIHN3aXRjaCAobV9uQWxpZ25tZW50KQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIGZQYWRkaW5nID0gMC4wZjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgICBmUGFkZGluZyA9IChyY1BsYXRlLkhlaWdodCgpIC0gcmNDb250ZW50LkhlaWdodCgpKSAqIDAuNWY7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgZlBhZGRpbmcgPSByY1BsYXRlLkhlaWdodCgpIC0gcmNDb250ZW50LkhlaWdodCgpOwotICAgICAgICBicmVhazsKLSAgICB9CisgICAgcmV0dXJuIENQVlRfV29yZFJhbmdlKHBsYWNlMSwgcGxhY2UyKTsKKyAgfQogCi0gICAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCAtIChtX3B0U2Nyb2xsUG9zLnggLSByY1BsYXRlLmxlZnQpLAotICAgICAgICBwb2ludC55IC0gKG1fcHRTY3JvbGxQb3MueSArIGZQYWRkaW5nIC0gcmNQbGF0ZS50b3ApKTsKKyAgcmV0dXJuIENQVlRfV29yZFJhbmdlKCk7CiB9CiAKLUNQREZfUG9pbnQgQ0ZYX0VkaXQ6OkVkaXRUb1ZUKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLSAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7Ci0gICAgQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CitDUFZUX1dvcmRQbGFjZSBDRlhfRWRpdDo6U2VhcmNoV29yZFBsYWNlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgcmV0dXJuIG1fcFZULT5TZWFyY2hXb3JkUGxhY2UoRWRpdFRvVlQocG9pbnQpKTsKKyAgfQogCi0gICAgRlhfRkxPQVQgZlBhZGRpbmcgPSAwLjBmOwotCi0gICAgc3dpdGNoIChtX25BbGlnbm1lbnQpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgICAgZlBhZGRpbmcgPSAwLjBmOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICAgIGZQYWRkaW5nID0gKHJjUGxhdGUuSGVpZ2h0KCkgLSByY0NvbnRlbnQuSGVpZ2h0KCkpICogMC41ZjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgICBmUGFkZGluZyA9IHJjUGxhdGUuSGVpZ2h0KCkgLSByY0NvbnRlbnQuSGVpZ2h0KCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBDUERGX1BvaW50KHBvaW50LnggKyAobV9wdFNjcm9sbFBvcy54IC0gcmNQbGF0ZS5sZWZ0KSwKLSAgICAgICAgcG9pbnQueSArIChtX3B0U2Nyb2xsUG9zLnkgKyBmUGFkZGluZyAtIHJjUGxhdGUudG9wKSk7CisgIHJldHVybiBDUFZUX1dvcmRQbGFjZSgpOwogfQogCi1DUERGX1JlY3QgQ0ZYX0VkaXQ6OlZUVG9FZGl0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpIGNvbnN0Ci17Ci0gICAgQ1BERl9Qb2ludCBwdExlZnRCb3R0b20gPSBWVFRvRWRpdChDUERGX1BvaW50KHJlY3QubGVmdCxyZWN0LmJvdHRvbSkpOwotICAgIENQREZfUG9pbnQgcHRSaWdodFRvcCA9IFZUVG9FZGl0KENQREZfUG9pbnQocmVjdC5yaWdodCxyZWN0LnRvcCkpOwotCi0gICAgcmV0dXJuIENQREZfUmVjdChwdExlZnRCb3R0b20ueCxwdExlZnRCb3R0b20ueSxwdFJpZ2h0VG9wLngscHRSaWdodFRvcC55KTsKLX0KLQotQ1BERl9SZWN0IENGWF9FZGl0OjpFZGl0VG9WVChjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdAotewotICAgIENQREZfUG9pbnQgcHRMZWZ0Qm90dG9tID0gRWRpdFRvVlQoQ1BERl9Qb2ludChyZWN0LmxlZnQscmVjdC5ib3R0b20pKTsKLSAgICBDUERGX1BvaW50IHB0UmlnaHRUb3AgPSBFZGl0VG9WVChDUERGX1BvaW50KHJlY3QucmlnaHQscmVjdC50b3ApKTsKLQotICAgIHJldHVybiBDUERGX1JlY3QocHRMZWZ0Qm90dG9tLngscHRMZWZ0Qm90dG9tLnkscHRSaWdodFRvcC54LHB0UmlnaHRUb3AueSk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldFNjcm9sbEluZm8oKQotewotICAgIGlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KQotICAgIHsKLSAgICAgICAgQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7Ci0gICAgICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSBtX3BWVC0+R2V0Q29udGVudFJlY3QoKTsKLQotICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOwotICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxJbmZvWChyY1BsYXRlLmxlZnQsIHJjUGxhdGUucmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ29udGVudC5sZWZ0LCByY0NvbnRlbnQucmlnaHQsIHJjUGxhdGUuV2lkdGgoKSAvIDMsIHJjUGxhdGUuV2lkdGgoKSk7Ci0KLSAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsSW5mb1kocmNQbGF0ZS5ib3R0b20sIHJjUGxhdGUudG9wLAotICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQuYm90dG9tLCByY0NvbnRlbnQudG9wLCByY1BsYXRlLkhlaWdodCgpIC8gMywgcmNQbGF0ZS5IZWlnaHQoKSk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldFNjcm9sbFBvc1goRlhfRkxPQVQgZngpCi17Ci0gICAgaWYgKCFtX2JFbmFibGVTY3JvbGwpIHJldHVybjsKLQotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChtX3B0U2Nyb2xsUG9zLngsZngpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3B0U2Nyb2xsUG9zLnggPSBmeDsKLSAgICAgICAgICAgIFJlZnJlc2goUlBfTk9BTkFMWVNFKTsKLQotICAgICAgICAgICAgaWYgKG1fYk5vdGlmeSAmJiBtX3BOb3RpZnkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsUG9zWChmeCk7Ci0gICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpCi17Ci0gICAgaWYgKCFtX2JFbmFibGVTY3JvbGwpIHJldHVybjsKLQotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChtX3B0U2Nyb2xsUG9zLnksZnkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3B0U2Nyb2xsUG9zLnkgPSBmeTsKLSAgICAgICAgICAgIFJlZnJlc2goUlBfTk9BTkFMWVNFKTsKLQotICAgICAgICAgICAgaWYgKG1fYk5vdGlmeSAmJiBtX3BOb3RpZnkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsUG9zWShmeSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCi17Ci0gICAgU2V0U2Nyb2xsUG9zWChwb2ludC54KTsKLSAgICBTZXRTY3JvbGxQb3NZKHBvaW50LnkpOwotICAgIFNldFNjcm9sbExpbWl0KCk7Cit2b2lkIENGWF9FZGl0OjpQYWludCgpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBSZWFycmFuZ2VBbGwoKTsKKyAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgUmVmcmVzaChSUF9OT0FOQUxZU0UpOworICAgIFNldENhcmV0T3JpZ2luKCk7CiAgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0KIH0KIAotQ1BERl9Qb2ludCBDRlhfRWRpdDo6R2V0U2Nyb2xsUG9zKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wdFNjcm9sbFBvczsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0U2Nyb2xsTGltaXQoKQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgQ1BERl9SZWN0IHJjQ29udGVudCA9IG1fcFZULT5HZXRDb250ZW50UmVjdCgpOwotICAgICAgICBDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKLQotICAgICAgICBpZiAocmNQbGF0ZS5XaWR0aCgpID4gcmNDb250ZW50LldpZHRoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldFNjcm9sbFBvc1gocmNQbGF0ZS5sZWZ0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKG1fcHRTY3JvbGxQb3MueCwgcmNDb250ZW50LmxlZnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFNjcm9sbFBvc1gocmNDb250ZW50LmxlZnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKG1fcHRTY3JvbGxQb3MueCwgcmNDb250ZW50LnJpZ2h0IC0gcmNQbGF0ZS5XaWR0aCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRTY3JvbGxQb3NYKHJjQ29udGVudC5yaWdodCAtIHJjUGxhdGUuV2lkdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmNQbGF0ZS5IZWlnaHQoKSA+IHJjQ29udGVudC5IZWlnaHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0U2Nyb2xsUG9zWShyY1BsYXRlLnRvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihtX3B0U2Nyb2xsUG9zLnksIHJjQ29udGVudC5ib3R0b20gKyByY1BsYXRlLkhlaWdodCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRTY3JvbGxQb3NZKHJjQ29udGVudC5ib3R0b20gKyByY1BsYXRlLkhlaWdodCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihtX3B0U2Nyb2xsUG9zLnksIHJjQ29udGVudC50b3ApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFNjcm9sbFBvc1kocmNDb250ZW50LnRvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNjcm9sbFRvQ2FyZXQoKQotewotICAgIFNldFNjcm9sbExpbWl0KCk7Ci0KLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIENQREZfUG9pbnQgcHRIZWFkKDAsMCk7Ci0gICAgICAgIENQREZfUG9pbnQgcHRGb290KDAsMCk7Ci0KLSAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJdGVyYXRvci0+U2V0QXQobV93cENhcmV0KTsKLQotICAgICAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7Ci0gICAgICAgICAgICBDUFZUX0xpbmUgbGluZTsKLSAgICAgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHRIZWFkLnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7Ci0gICAgICAgICAgICAgICAgcHRIZWFkLnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mQXNjZW50OwotICAgICAgICAgICAgICAgIHB0Rm9vdC54ID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOwotICAgICAgICAgICAgICAgIHB0Rm9vdC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwSXRlcmF0b3ItPkdldExpbmUobGluZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHRIZWFkLnggPSBsaW5lLnB0TGluZS54OwotICAgICAgICAgICAgICAgIHB0SGVhZC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQ7Ci0gICAgICAgICAgICAgICAgcHRGb290LnggPSBsaW5lLnB0TGluZS54OwotICAgICAgICAgICAgICAgIHB0Rm9vdC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ1BERl9Qb2ludCBwdEhlYWRFZGl0ID0gVlRUb0VkaXQocHRIZWFkKTsKLSAgICAgICAgQ1BERl9Qb2ludCBwdEZvb3RFZGl0ID0gVlRUb0VkaXQocHRGb290KTsKLQotICAgICAgICBDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKLQotICAgICAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHJjUGxhdGUubGVmdCxyY1BsYXRlLnJpZ2h0KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIocHRIZWFkRWRpdC54LCByY1BsYXRlLmxlZnQpIHx8Ci0gICAgICAgICAgICAgICAgRlhfRURJVF9Jc0Zsb2F0RXF1YWwocHRIZWFkRWRpdC54LCByY1BsYXRlLmxlZnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFNjcm9sbFBvc1gocHRIZWFkLngpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHB0SGVhZEVkaXQueCwgcmNQbGF0ZS5yaWdodCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0U2Nyb2xsUG9zWChwdEhlYWQueCAtIHJjUGxhdGUuV2lkdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHJjUGxhdGUudG9wLHJjUGxhdGUuYm90dG9tKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIocHRGb290RWRpdC55LCByY1BsYXRlLmJvdHRvbSkgfHwKLSAgICAgICAgICAgICAgICBGWF9FRElUX0lzRmxvYXRFcXVhbChwdEZvb3RFZGl0LnksIHJjUGxhdGUuYm90dG9tKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihwdEhlYWRFZGl0LnksIHJjUGxhdGUudG9wKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldFNjcm9sbFBvc1kocHRGb290LnkgKyByY1BsYXRlLkhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocHRIZWFkRWRpdC55LCByY1BsYXRlLnRvcCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihwdEZvb3RFZGl0LnksIHJjUGxhdGUuYm90dG9tKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldFNjcm9sbFBvc1kocHRIZWFkLnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6UmVmcmVzaChSRUZSRVNIX1BMQU5fRSBlUGxhbixjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZTEsY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UyKQotewotICAgIGlmIChtX2JFbmFibGVSZWZyZXNoICYmIG1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBtX1JlZnJlc2guQmVnaW5SZWZyZXNoKCk7Ci0gICAgICAgIFJlZnJlc2hQdXNoTGluZVJlY3RzKEdldFZpc2libGVXb3JkUmFuZ2UoKSk7Ci0KLS8vICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChtX3B0UmVmcmVzaFNjcm9sbFBvcy54LG1fcHRTY3JvbGxQb3MueCkgfHwKLS8vICAgICAgICAgICFGWF9FRElUX0lzRmxvYXRFcXVhbChtX3B0UmVmcmVzaFNjcm9sbFBvcy55LG1fcHRTY3JvbGxQb3MueSkpCi0vLyAgICAgIHsKLSAgICAgICAgICAgIG1fUmVmcmVzaC5Ob0FuYWx5c2UoKTsKLSAgICAgICAgICAgIG1fcHRSZWZyZXNoU2Nyb2xsUG9zID0gbV9wdFNjcm9sbFBvczsKLS8vICAgICAgfQotLy8gICAgICBlbHNlCi0vLyAgICAgIHsKLS8vICAgICAgICAgIHN3aXRjaCAoZVBsYW4pCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICBjYXNlIFJQX0FOQUxZU0U6Ci0vLyAgICAgICAgICAgICAgbV9SZWZyZXNoLkFuYWx5c2UobV9wVlQtPkdldEFsaWdubWVudCgpKTsKLS8vCi0vLyAgICAgICAgICAgICAgaWYgKHBSYW5nZTEpIFJlZnJlc2hQdXNoUmFuZG9tUmVjdHMoKnBSYW5nZTEpOwotLy8gICAgICAgICAgICAgIGlmIChwUmFuZ2UyKSBSZWZyZXNoUHVzaFJhbmRvbVJlY3RzKCpwUmFuZ2UyKTsKLS8vICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgIGNhc2UgUlBfTk9BTkFMWVNFOgotLy8gICAgICAgICAgICAgIG1fUmVmcmVzaC5Ob0FuYWx5c2UoKTsKLS8vICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgIGNhc2UgUlBfT1BUSU9OQUw6Ci0vLyAgICAgICAgICAgICAgaWYgKHBSYW5nZTEpIFJlZnJlc2hQdXNoUmFuZG9tUmVjdHMoKnBSYW5nZTEpOwotLy8gICAgICAgICAgICAgIGlmIChwUmFuZ2UyKSBSZWZyZXNoUHVzaFJhbmRvbVJlY3RzKCpwUmFuZ2UyKTsKLS8vICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgIH0KLS8vICAgICAgfQotCi0gICAgICAgIGlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnN0IENGWF9FZGl0X1JlY3RBcnJheSAqIHBSZWN0cyA9IG1fUmVmcmVzaC5HZXRSZWZyZXNoUmVjdHMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBwUmVjdHMtPkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KHBSZWN0cy0+R2V0QXQoaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtX1JlZnJlc2guRW5kUmVmcmVzaCgpOwotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6UmVmcmVzaFB1c2hMaW5lUmVjdHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cikKLXsKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUFZUX1dvcmRQbGFjZSB3cEJlZ2luID0gd3IuQmVnaW5Qb3M7Ci0gICAgICAgICAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdwQmVnaW4pOwotICAgICAgICAgICAgQ1BWVF9Xb3JkUGxhY2Ugd3BFbmQgPSB3ci5FbmRQb3M7Ci0gICAgICAgICAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdwRW5kKTsKLSAgICAgICAgICAgIHBJdGVyYXRvci0+U2V0QXQod3BCZWdpbik7Ci0KLSAgICAgICAgICAgIENQVlRfTGluZSBsaW5laW5mbzsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwSXRlcmF0b3ItPkdldExpbmUobGluZWluZm8pKWJyZWFrOwotICAgICAgICAgICAgICAgIGlmIChsaW5laW5mby5saW5lcGxhY2UuTGluZUNtcCh3cEVuZCkgPiAwKWJyZWFrOwotCi0gICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjTGluZShsaW5laW5mby5wdExpbmUueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVEZXNjZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnggKyBsaW5laW5mby5mTGluZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZUFzY2VudCk7Ci0KLSAgICAgICAgICAgICAgICBtX1JlZnJlc2guUHVzaChDUFZUX1dvcmRSYW5nZShsaW5laW5mby5saW5lcGxhY2UsbGluZWluZm8ubGluZUVuZCksVlRUb0VkaXQocmNMaW5lKSk7Ci0KLSAgICAgICAgICAgIH13aGlsZSAocEl0ZXJhdG9yLT5OZXh0TGluZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6UmVmcmVzaFB1c2hSYW5kb21SZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENQVlRfV29yZFJhbmdlIHdyVGVtcCA9IHdyOwotCi0gICAgICAgICAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdyVGVtcC5CZWdpblBvcyk7Ci0gICAgICAgICAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdyVGVtcC5FbmRQb3MpOwotICAgICAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdCh3clRlbXAuQmVnaW5Qb3MpOwotCi0gICAgICAgICAgICBDUFZUX1dvcmQgd29yZGluZm87Ci0gICAgICAgICAgICBDUFZUX0xpbmUgbGluZWluZm87Ci0gICAgICAgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZTsKLQotICAgICAgICAgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGxhY2UuV29yZENtcCh3clRlbXAuRW5kUG9zKSA+IDApIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKTsKLSAgICAgICAgICAgICAgICBwSXRlcmF0b3ItPkdldExpbmUobGluZWluZm8pOwotCi0gICAgICAgICAgICAgICAgaWYgKHBsYWNlLkxpbmVDbXAod3JUZW1wLkJlZ2luUG9zKSA9PSAwIHx8IHBsYWNlLkxpbmVDbXAod3JUZW1wLkVuZFBvcykgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCByY1dvcmQod29yZGluZm8ucHRXb3JkLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZURlc2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8ucHRXb3JkLnggKyB3b3JkaW5mby5mV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZUFzY2VudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbV9SZWZyZXNoLkFkZFJlZnJlc2goVlRUb0VkaXQocmNXb3JkKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCByY0xpbmUobGluZWluZm8ucHRMaW5lLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZURlc2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnggKyBsaW5laW5mby5mTGluZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVBc2NlbnQpOwotCi0gICAgICAgICAgICAgICAgICAgIG1fUmVmcmVzaC5BZGRSZWZyZXNoKFZUVG9FZGl0KHJjTGluZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIHBJdGVyYXRvci0+TmV4dExpbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlJlZnJlc2hXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyKQotewotICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotICAgIHsKLSAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3JUZW1wID0gd3I7Ci0KLSAgICAgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuQmVnaW5Qb3MpOwotICAgICAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdyVGVtcC5FbmRQb3MpOwotICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHdyVGVtcC5CZWdpblBvcyk7Ci0KLSAgICAgICAgQ1BWVF9Xb3JkIHdvcmRpbmZvOwotICAgICAgICBDUFZUX0xpbmUgbGluZWluZm87Ci0gICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlOwotCi0gICAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotICAgICAgICAgICAgaWYgKHBsYWNlLldvcmRDbXAod3JUZW1wLkVuZFBvcykgPiAwKSBicmVhazsKLQotICAgICAgICAgICAgcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKTsKLSAgICAgICAgICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5laW5mbyk7Ci0KLSAgICAgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKHdyVGVtcC5CZWdpblBvcykgPT0gMCB8fCBwbGFjZS5MaW5lQ21wKHdyVGVtcC5FbmRQb3MpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjV29yZCh3b3JkaW5mby5wdFdvcmQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVEZXNjZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8ucHRXb3JkLnggKyB3b3JkaW5mby5mV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lQXNjZW50KTsKLQotICAgICAgICAgICAgICAgIGlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCByY1JlZnJlc2ggPSBWVFRvRWRpdChyY1dvcmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNMaW5lKGxpbmVpbmZvLnB0TGluZS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZURlc2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueCArIGxpbmVpbmZvLmZMaW5lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lQXNjZW50KTsKLQotICAgICAgICAgICAgICAgIGlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCByY1JlZnJlc2ggPSBWVFRvRWRpdChyY0xpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBJdGVyYXRvci0+TmV4dExpbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0Q2FyZXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKLXsKLSAgICBtX3dwT2xkQ2FyZXQgPSBtX3dwQ2FyZXQ7Ci0gICAgbV93cENhcmV0ID0gcGxhY2U7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldENhcmV0SW5mbygpCi17Ci0gICAgaWYgKG1fYk5vdGlmeSAmJiBtX3BOb3RpZnkpCi0gICAgewotICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENQREZfUG9pbnQgcHRIZWFkKDAuMGYsMC4wZikscHRGb290KDAuMGYsMC4wZik7Ci0KLSAgICAgICAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBJdGVyYXRvci0+U2V0QXQobV93cENhcmV0KTsKLSAgICAgICAgICAgICAgICBDUFZUX1dvcmQgd29yZDsKLSAgICAgICAgICAgICAgICBDUFZUX0xpbmUgbGluZTsKLSAgICAgICAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHRIZWFkLnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHB0SGVhZC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkFzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgcHRGb290LnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHB0Rm9vdC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB0SGVhZC54ID0gbGluZS5wdExpbmUueDsKLSAgICAgICAgICAgICAgICAgICAgcHRIZWFkLnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgcHRGb290LnggPSBsaW5lLnB0TGluZS54OwotICAgICAgICAgICAgICAgICAgICBwdEZvb3QueSA9IGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOwotICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25TZXRDYXJldCghbV9TZWxTdGF0ZS5Jc0V4aXN0KCksVlRUb0VkaXQocHRIZWFkKSxWVFRvRWRpdChwdEZvb3QpLCBtX3dwQ2FyZXQpOwotICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU2V0Q2FyZXRDaGFuZ2UoKTsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0Q2FyZXRDaGFuZ2UoKQotewotICAgIGlmIChtX3dwQ2FyZXQgPT0gbV93cE9sZENhcmV0KSByZXR1cm47Ci0KLSAgICBpZiAobV9iTm90aWZ5ICYmIG1fcFZULT5Jc1JpY2hUZXh0KCkgJiYgbV9wTm90aWZ5KQotICAgIHsKLSAgICAgICAgQ1BWVF9TZWNQcm9wcyBTZWNQcm9wczsKLSAgICAgICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwotCi0gICAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KG1fd3BDYXJldCk7Ci0gICAgICAgICAgICBDUFZUX1dvcmQgd29yZDsKLSAgICAgICAgICAgIENQVlRfU2VjdGlvbiBzZWN0aW9uOwotCi0gICAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNlY1Byb3BzID0gc2VjdGlvbi5TZWNQcm9wczsKLSAgICAgICAgICAgICAgICBXb3JkUHJvcHMgPSBzZWN0aW9uLldvcmRQcm9wczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXb3JkUHJvcHMgPSB3b3JkLldvcmRQcm9wczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0gICAgICAgICAgICBtX3BOb3RpZnktPklPbkNhcmV0Q2hhbmdlKFNlY1Byb3BzLFdvcmRQcm9wcyk7Ci0gICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldENhcmV0KGludDMyX3QgblBvcykKLXsKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIFNlbGVjdE5vbmUoKTsKLSAgICAgICAgU2V0Q2FyZXQobV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5Qb3MpKTsKLSAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LG1fd3BDYXJldCk7Ci0KLSAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICBTZXRDYXJldE9yaWdpbigpOwotICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6Ok9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgU2VsZWN0Tm9uZSgpOwotICAgICAgICBTZXRDYXJldChtX3BWVC0+U2VhcmNoV29yZFBsYWNlKEVkaXRUb1ZUKHBvaW50KSkpOwotICAgICAgICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsbV93cENhcmV0KTsKLQotICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgIFNldENhcmV0T3JpZ2luKCk7Ci0gICAgICAgIFNldENhcmV0SW5mbygpOwotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCi17Ci0gICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBTZXRDYXJldChtX3BWVC0+U2VhcmNoV29yZFBsYWNlKEVkaXRUb1ZUKHBvaW50KSkpOwotCi0gICAgICAgIGlmIChtX3dwQ2FyZXQgIT0gbV93cE9sZENhcmV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBtX1NlbFN0YXRlLlNldEVuZFBvcyhtX3dwQ2FyZXQpOwotCi0gICAgICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsbV93cENhcmV0KTsKLSAgICAgICAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsJndyKTsKLSAgICAgICAgICAgIFNldENhcmV0T3JpZ2luKCk7Ci0gICAgICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6T25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldFVwV29yZFBsYWNlKG1fd3BDYXJldCxtX3B0Q2FyZXQpKTsKLQotICAgICAgICBpZiAoYlNoaWZ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0gICAgICAgICAgICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsbV93cENhcmV0KTsKLQotICAgICAgICAgICAgaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICAgICAgICAgIENQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKLSAgICAgICAgICAgICAgICBSZWZyZXNoKFJQX09QVElPTkFMLCAmd3IpOwotICAgICAgICAgICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU2VsZWN0Tm9uZSgpOwotCi0gICAgICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6T25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCi17Ci0gICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0RG93bldvcmRQbGFjZShtX3dwQ2FyZXQsbV9wdENhcmV0KSk7Ci0KLSAgICAgICAgaWYgKGJTaGlmdCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotICAgICAgICAgICAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LG1fd3BDYXJldCk7Ci0KLSAgICAgICAgICAgIGlmIChtX3dwT2xkQ2FyZXQgIT0gbV93cENhcmV0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgICAgICAgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsbV93cENhcmV0KTsKLSAgICAgICAgICAgICAgICBSZWZyZXNoKFJQX09QVElPTkFMLCAmd3IpOwotICAgICAgICAgICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU2VsZWN0Tm9uZSgpOwotCi0gICAgICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6T25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCi17Ci0gICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBpZiAoYlNoaWZ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShtX3dwQ2FyZXQpICYmCi0gICAgICAgICAgICAgICAgbV93cENhcmV0ICE9IG1fcFZULT5HZXRTZWN0aW9uQmVnaW5QbGFjZShtX3dwQ2FyZXQpKQotICAgICAgICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCkpOwotCi0gICAgICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwQ2FyZXQpKTsKLQotICAgICAgICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotICAgICAgICAgICAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOwotCi0gICAgICAgICAgICBpZiAobV93cE9sZENhcmV0ICE9IG1fd3BDYXJldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgICAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3IobV93cE9sZENhcmV0LG1fd3BDYXJldCk7Ci0gICAgICAgICAgICAgICAgUmVmcmVzaChSUF9PUFRJT05BTCwmd3IpOwotICAgICAgICAgICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtX1NlbFN0YXRlLkJlZ2luUG9zLldvcmRDbXAobV9TZWxTdGF0ZS5FbmRQb3MpPDApCi0gICAgICAgICAgICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOwotCi0gICAgICAgICAgICAgICAgU2VsZWN0Tm9uZSgpOwotICAgICAgICAgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgICAgICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShtX3dwQ2FyZXQpICYmCi0gICAgICAgICAgICAgICAgICAgIG1fd3BDYXJldCAhPSBtX3BWVC0+R2V0U2VjdGlvbkJlZ2luUGxhY2UobV93cENhcmV0KSkKLSAgICAgICAgICAgICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV93cENhcmV0KSk7Ci0KLSAgICAgICAgICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwQ2FyZXQpKTsKLQotICAgICAgICAgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgICAgICAgICAgICBTZXRDYXJldE9yaWdpbigpOwotICAgICAgICAgICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENGWF9FZGl0OjpPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCi17Ci0gICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBpZiAoYlNoaWZ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0TmV4dFdvcmRQbGFjZShtX3dwQ2FyZXQpKTsKLQotICAgICAgICAgICAgaWYgKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0TGluZUVuZFBsYWNlKG1fd3BDYXJldCkgJiYKLSAgICAgICAgICAgICAgICBtX3dwQ2FyZXQgIT0gbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKQotICAgICAgICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fd3BDYXJldCkpOwotCi0gICAgICAgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0gICAgICAgICAgICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsbV93cENhcmV0KTsKLQotICAgICAgICAgICAgaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICAgICAgICAgIENQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCxtX3dwQ2FyZXQpOwotICAgICAgICAgICAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsJndyKTsKLSAgICAgICAgICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobV9TZWxTdGF0ZS5CZWdpblBvcy5Xb3JkQ21wKG1fU2VsU3RhdGUuRW5kUG9zKT4wKQotICAgICAgICAgICAgICAgICAgICBTZXRDYXJldChtX1NlbFN0YXRlLkJlZ2luUG9zKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKLQotICAgICAgICAgICAgICAgIFNlbGVjdE5vbmUoKTsKLSAgICAgICAgICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgICAgICAgICAgU2V0Q2FyZXRJbmZvKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV93cENhcmV0KSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRMaW5lRW5kUGxhY2UobV93cENhcmV0KSAmJgotICAgICAgICAgICAgICAgICAgICBtX3dwQ2FyZXQgIT0gbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKQotICAgICAgICAgICAgICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0TmV4dFdvcmRQbGFjZShtX3dwQ2FyZXQpKTsKLQotICAgICAgICAgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgICAgICAgICAgICBTZXRDYXJldE9yaWdpbigpOwotICAgICAgICAgICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENGWF9FZGl0OjpPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIGlmIChiU2hpZnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiQ3RybCkKLSAgICAgICAgICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldExpbmVCZWdpblBsYWNlKG1fd3BDYXJldCkpOwotCi0gICAgICAgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0gICAgICAgICAgICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsbV93cENhcmV0KTsKLQotICAgICAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3IobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOwotICAgICAgICAgICAgUmVmcmVzaChSUF9PUFRJT05BTCwgJndyKTsKLSAgICAgICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtX1NlbFN0YXRlLkJlZ2luUG9zLldvcmRDbXAobV9TZWxTdGF0ZS5FbmRQb3MpPDApCi0gICAgICAgICAgICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOwotCi0gICAgICAgICAgICAgICAgU2VsZWN0Tm9uZSgpOwotICAgICAgICAgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgICAgICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYkN0cmwpCi0gICAgICAgICAgICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShtX3dwQ2FyZXQpKTsKLQotICAgICAgICAgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgICAgICAgICAgICBTZXRDYXJldE9yaWdpbigpOwotICAgICAgICAgICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENGWF9FZGl0OjpPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgaWYgKGJTaGlmdCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJDdHJsKQotICAgICAgICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRFbmRXb3JkUGxhY2UoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldExpbmVFbmRQbGFjZShtX3dwQ2FyZXQpKTsKLQotICAgICAgICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotICAgICAgICAgICAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOwotCi0gICAgICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7Ci0gICAgICAgICAgICBSZWZyZXNoKFJQX09QVElPTkFMLCAmd3IpOwotICAgICAgICAgICAgU2V0Q2FyZXRJbmZvKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fU2VsU3RhdGUuQmVnaW5Qb3MuV29yZENtcChtX1NlbFN0YXRlLkVuZFBvcyk+MCkKLSAgICAgICAgICAgICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5CZWdpblBvcyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBTZXRDYXJldChtX1NlbFN0YXRlLkVuZFBvcyk7Ci0KLSAgICAgICAgICAgICAgICBTZWxlY3ROb25lKCk7Ci0gICAgICAgICAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICAgICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiQ3RybCkKLSAgICAgICAgICAgICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRMaW5lRW5kUGxhY2UobV93cENhcmV0KSk7Ci0KLSAgICAgICAgICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgICAgICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKLSAgICAgICAgICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCxpbnQzMl90IGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcywgRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCi17Ci0gICAgRW1wdHkoKTsKLSAgICBEb0luc2VydFRleHQoQ1BWVF9Xb3JkUGxhY2UoMCwwLC0xKSwgdGV4dCwgY2hhcnNldCwgcFNlY1Byb3BzLCBwV29yZFByb3BzKTsKLSAgICBpZiAoYlBhaW50KSBQYWludCgpOwotICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQotICAgICAgICBtX3BPcHJOb3RpZnktPk9uU2V0VGV4dChtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7Ci0gICAgLy9pZiAoYkFkZFVuZG8pCi19Ci0KLUZYX0JPT0wgQ0ZYX0VkaXQ6Okluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcywgRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCi17Ci0gICAgaWYgKElzVGV4dE92ZXJmbG93KCkpIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotCi0gICAgICAgIFNldENhcmV0KG1fcFZULT5JbnNlcnRXb3JkKG1fd3BDYXJldCx3b3JkLEdldENoYXJTZXRGcm9tVW5pY29kZSh3b3JkLCBjaGFyc2V0KSxwV29yZFByb3BzKSk7Ci0gICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCxtX3dwQ2FyZXQpOwotCi0gICAgICAgIGlmIChtX3dwQ2FyZXQgIT0gbV93cE9sZENhcmV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0luc2VydFdvcmQodGhpcyxtX3dwT2xkQ2FyZXQsbV93cENhcmV0LHdvcmQsY2hhcnNldCxwV29yZFByb3BzKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChiUGFpbnQpCi0gICAgICAgICAgICAgICAgUGFpbnRJbnNlcnRUZXh0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKLQotICAgICAgICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCi0gICAgICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5Pbkluc2VydFdvcmQobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwotCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQotewotICAgIGlmIChJc1RleHRPdmVyZmxvdygpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKLSAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkluc2VydFNlY3Rpb24obV93cENhcmV0LHBTZWNQcm9wcyxwV29yZFByb3BzKSk7Ci0gICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCxtX3dwQ2FyZXQpOwotCi0gICAgICAgIGlmIChtX3dwQ2FyZXQgIT0gbV93cE9sZENhcmV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0luc2VydFJldHVybih0aGlzLG1fd3BPbGRDYXJldCxtX3dwQ2FyZXQscFNlY1Byb3BzLHBXb3JkUHJvcHMpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJQYWludCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWFycmFuZ2VQYXJ0KENQVlRfV29yZFJhbmdlKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KSk7Ci0gICAgICAgICAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICAgICAgICAgIENQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCwgR2V0VmlzaWJsZVdvcmRSYW5nZSgpLkVuZFBvcyk7Ci0gICAgICAgICAgICAgICAgUmVmcmVzaChSUF9BTkFMWVNFLCAmd3IpOwotICAgICAgICAgICAgICAgIFNldENhcmV0T3JpZ2luKCk7Ci0gICAgICAgICAgICAgICAgU2V0Q2FyZXRJbmZvKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQotICAgICAgICAgICAgICAgIG1fcE9wck5vdGlmeS0+T25JbnNlcnRSZXR1cm4obV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwotCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDRlhfRWRpdDo6QmFja3NwYWNlKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgaWYgKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQVlRfU2VjdGlvbiBzZWN0aW9uOwotICAgICAgICBDUFZUX1dvcmQgd29yZDsKLQotICAgICAgICBpZiAoYkFkZFVuZG8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBJdGVyYXRvci0+U2V0QXQobV93cENhcmV0KTsKLSAgICAgICAgICAgICAgICBwSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjdGlvbik7Ci0gICAgICAgICAgICAgICAgcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotICAgICAgICBTZXRDYXJldChtX3BWVC0+QmFja1NwYWNlV29yZChtX3dwQ2FyZXQpKTsKLSAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LG1fd3BDYXJldCk7Ci0KLSAgICAgICAgaWYgKG1fd3BDYXJldCAhPSBtX3dwT2xkQ2FyZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtX3dwQ2FyZXQuU2VjQ21wKG1fd3BPbGRDYXJldCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9CYWNrc3BhY2UodGhpcyxtX3dwT2xkQ2FyZXQsbV93cENhcmV0LHdvcmQuV29yZCx3b3JkLm5DaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5TZWNQcm9wcyxzZWN0aW9uLldvcmRQcm9wcykpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9CYWNrc3BhY2UodGhpcyxtX3dwT2xkQ2FyZXQsbV93cENhcmV0LHdvcmQuV29yZCx3b3JkLm5DaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5TZWNQcm9wcyx3b3JkLldvcmRQcm9wcykpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYlBhaW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlYXJyYW5nZVBhcnQoQ1BWVF9Xb3JkUmFuZ2UobV93cENhcmV0LG1fd3BPbGRDYXJldCkpOwotICAgICAgICAgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLQotICAgICAgICAgICAgICAgIENQVlRfV29yZFJhbmdlIHdyOwotICAgICAgICAgICAgICAgIGlmIChtX3dwQ2FyZXQuU2VjQ21wKG1fd3BPbGRDYXJldCkgIT0wKQotICAgICAgICAgICAgICAgICAgICB3ciA9IENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCksR2V0VmlzaWJsZVdvcmRSYW5nZSgpLkVuZFBvcyk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobV93cENhcmV0LkxpbmVDbXAobV93cE9sZENhcmV0KSAhPTApCi0gICAgICAgICAgICAgICAgICAgIHdyID0gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldExpbmVCZWdpblBsYWNlKG1fd3BDYXJldCksbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHdyID0gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV93cENhcmV0KSxtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOwotCi0gICAgICAgICAgICAgICAgUmVmcmVzaChSUF9BTkFMWVNFLCAmd3IpOwotCi0gICAgICAgICAgICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKLSAgICAgICAgICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCi0gICAgICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5PbkJhY2tTcGFjZShtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGWF9FZGl0OjpEZWxldGUoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCi17Ci0gICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRFbmRXb3JkUGxhY2UoKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQVlRfU2VjdGlvbiBzZWN0aW9uOwotICAgICAgICBDUFZUX1dvcmQgd29yZDsKLQotICAgICAgICBpZiAoYkFkZFVuZG8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBJdGVyYXRvci0+U2V0QXQobV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV93cENhcmV0KSk7Ci0gICAgICAgICAgICAgICAgcEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pOwotICAgICAgICAgICAgICAgIHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKLSAgICAgICAgRlhfQk9PTCBiU2VjRW5kID0gKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOwotCi0gICAgICAgIFNldENhcmV0KG1fcFZULT5EZWxldGVXb3JkKG1fd3BDYXJldCkpOwotICAgICAgICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsbV93cENhcmV0KTsKLQotICAgICAgICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJTZWNFbmQpCi0gICAgICAgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9EZWxldGUodGhpcyxtX3dwT2xkQ2FyZXQsbV93cENhcmV0LHdvcmQuV29yZCx3b3JkLm5DaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLlNlY1Byb3BzLHNlY3Rpb24uV29yZFByb3BzLGJTZWNFbmQpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0RlbGV0ZSh0aGlzLG1fd3BPbGRDYXJldCxtX3dwQ2FyZXQsd29yZC5Xb3JkLHdvcmQubkNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uU2VjUHJvcHMsd29yZC5Xb3JkUHJvcHMsYlNlY0VuZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJQYWludCkKLSAgICAgICAgewotICAgICAgICAgICAgUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZShtX3dwT2xkQ2FyZXQsbV93cENhcmV0KSk7Ci0gICAgICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0KLSAgICAgICAgICAgIENQVlRfV29yZFJhbmdlIHdyOwotICAgICAgICAgICAgaWYgKGJTZWNFbmQpCi0gICAgICAgICAgICAgICAgd3IgPSBDUFZUX1dvcmRSYW5nZShtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwT2xkQ2FyZXQpLEdldFZpc2libGVXb3JkUmFuZ2UoKS5FbmRQb3MpOwotICAgICAgICAgICAgZWxzZSBpZiAobV93cENhcmV0LkxpbmVDbXAobV93cE9sZENhcmV0KSAhPTApCi0gICAgICAgICAgICAgICAgd3IgPSBDUFZUX1dvcmRSYW5nZShtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UobV93cENhcmV0KSxtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHdyID0gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV93cE9sZENhcmV0KSxtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOwotCi0gICAgICAgICAgICBSZWZyZXNoKFJQX0FOQUxZU0UsICZ3cik7Ci0KLSAgICAgICAgICAgIFNldENhcmV0T3JpZ2luKCk7Ci0gICAgICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQotICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5PbkRlbGV0ZShtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7Ci0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGWF9FZGl0OjpFbXB0eSgpCi17Ci0gICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBtX3BWVC0+RGVsZXRlV29yZHMoR2V0V2hvbGVXb3JkUmFuZ2UoKSk7Ci0gICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKLQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0ZYX0VkaXQ6OkNsZWFyKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQotewotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUFZUX1dvcmRSYW5nZSByYW5nZSA9IG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCk7Ci0KLSAgICAgICAgICAgIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtX3BWVC0+SXNSaWNoVGV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQmVnaW5Hcm91cFVuZG8oTCIiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChyYW5nZS5FbmRQb3MpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBDUFZUX1dvcmQgd29yZGluZm87Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUFZUX1NlY3Rpb24gc2VjaW5mbzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYWNlLldvcmRDbXAocmFuZ2UuQmVnaW5Qb3MpIDw9IDApYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKHBsYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRwbGFjZS5TZWNDbXAocGxhY2UpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY2luZm8pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0NsZWFyUmljaCh0aGlzLG9sZHBsYWNlLHBsYWNlLHJhbmdlLHdvcmRpbmZvLldvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8ubkNoYXJzZXQsc2VjaW5mby5TZWNQcm9wcyxzZWNpbmZvLldvcmRQcm9wcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRwbGFjZSA9IG1fcFZULT5BanVzdExpbmVIZWFkZXIob2xkcGxhY2UsVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IG1fcFZULT5BanVzdExpbmVIZWFkZXIocGxhY2UsVFJVRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfQ2xlYXJSaWNoKHRoaXMsb2xkcGxhY2UscGxhY2UscmFuZ2Usd29yZGluZm8uV29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5uQ2hhcnNldCxzZWNpbmZvLlNlY1Byb3BzLHdvcmRpbmZvLldvcmRQcm9wcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlIChwSXRlcmF0b3ItPlByZXZXb3JkKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEVuZEdyb3VwVW5kbygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0NsZWFyKHRoaXMscmFuZ2UsR2V0U2VsVGV4dCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTZWxlY3ROb25lKCk7Ci0gICAgICAgICAgICBTZXRDYXJldChtX3BWVC0+RGVsZXRlV29yZHMocmFuZ2UpKTsKLSAgICAgICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCxtX3dwQ2FyZXQpOwotCi0gICAgICAgICAgICBpZiAoYlBhaW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlYXJyYW5nZVBhcnQocmFuZ2UpOwotICAgICAgICAgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLQotICAgICAgICAgICAgICAgIENQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCwgR2V0VmlzaWJsZVdvcmRSYW5nZSgpLkVuZFBvcyk7Ci0gICAgICAgICAgICAgICAgUmVmcmVzaChSUF9BTkFMWVNFLCAmd3IpOwotCi0gICAgICAgICAgICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKLSAgICAgICAgICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCi0gICAgICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5PbkNsZWFyKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKLQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0ZYX0VkaXQ6Okluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsIGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCkKLXsKLSAgICBpZiAoSXNUZXh0T3ZlcmZsb3coKSkgcmV0dXJuIEZBTFNFOwotCit2b2lkIENGWF9FZGl0OjpSZWFycmFuZ2VBbGwoKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CiAgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotICAgIFNldENhcmV0KERvSW5zZXJ0VGV4dChtX3dwQ2FyZXQsIHRleHQsIGNoYXJzZXQsIHBTZWNQcm9wcywgcFdvcmRQcm9wcykpOwotICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCxtX3dwQ2FyZXQpOwotCi0gICAgaWYgKG1fd3BDYXJldCAhPSBtX3dwT2xkQ2FyZXQpCi0gICAgewotICAgICAgICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9JbnNlcnRUZXh0KHRoaXMsbV93cE9sZENhcmV0LG1fd3BDYXJldCx0ZXh0LGNoYXJzZXQscFNlY1Byb3BzLHBXb3JkUHJvcHMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiUGFpbnQpCi0gICAgICAgICAgICBQYWludEluc2VydFRleHQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOwotCi0gICAgICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQotICAgICAgICAgICAgbV9wT3ByTm90aWZ5LT5Pbkluc2VydFRleHQobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwotCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgbV9wVlQtPlJlYXJyYW5nZUFsbCgpOworICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKKyAgICBTZXRTY3JvbGxJbmZvKCk7CisgICAgU2V0Q29udGVudENoYW5nZWQoKTsKKyAgfQogfQogCi12b2lkIENGWF9FZGl0OjpQYWludEluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE9sZCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ldykKLXsKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIFJlYXJyYW5nZVBhcnQoQ1BWVF9Xb3JkUmFuZ2Uod3BPbGQsd3BOZXcpKTsKLSAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwordm9pZCBDRlhfRWRpdDo6UmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CisgICAgbV9wVlQtPlJlYXJyYW5nZVBhcnQocmFuZ2UpOworICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKKyAgICBTZXRTY3JvbGxJbmZvKCk7CisgICAgU2V0Q29udGVudENoYW5nZWQoKTsKKyAgfQorfQogCi0gICAgICAgIENQVlRfV29yZFJhbmdlIHdyOwotICAgICAgICBpZiAobV93cENhcmV0LkxpbmVDbXAod3BPbGQpICE9MCkKLSAgICAgICAgICAgIHdyID0gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldExpbmVCZWdpblBsYWNlKHdwT2xkKSxtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKHdwTmV3KSk7Cit2b2lkIENGWF9FZGl0OjpTZXRDb250ZW50Q2hhbmdlZCgpIHsKKyAgaWYgKG1fYk5vdGlmeSAmJiBtX3BOb3RpZnkpIHsKKyAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7CisgICAgaWYgKHJjQ29udGVudC5XaWR0aCgpICE9IG1fcmNPbGRDb250ZW50LldpZHRoKCkgfHwKKyAgICAgICAgcmNDb250ZW50LkhlaWdodCgpICE9IG1fcmNPbGRDb250ZW50LkhlaWdodCgpKSB7CisgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKKyAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgIG1fcE5vdGlmeS0+SU9uQ29udGVudENoYW5nZShyY0NvbnRlbnQpOworICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICB9CisgICAgICBtX3JjT2xkQ29udGVudCA9IHJjQ29udGVudDsKKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfRWRpdDo6U2VsZWN0QWxsKCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIG1fU2VsU3RhdGUgPSBHZXRXaG9sZVdvcmRSYW5nZSgpOworICAgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKKworICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICBDUFZUX1dvcmRSYW5nZSB3clZpc2libGUgPSBHZXRWaXNpYmxlV29yZFJhbmdlKCk7CisgICAgUmVmcmVzaChSUF9PUFRJT05BTCwgJndyVmlzaWJsZSk7CisgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0KK30KKwordm9pZCBDRlhfRWRpdDo6U2VsZWN0Tm9uZSgpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpIHsKKyAgICAgIENQVlRfV29yZFJhbmdlIHdyVGVtcCA9IG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCk7CisgICAgICBtX1NlbFN0YXRlLkRlZmF1bHQoKTsKKyAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3clRlbXApOworICAgIH0KKyAgfQorfQorCitGWF9CT09MIENGWF9FZGl0OjpJc1NlbGVjdGVkKCkgY29uc3QgeworICByZXR1cm4gbV9TZWxTdGF0ZS5Jc0V4aXN0KCk7Cit9CisKK0NQREZfUG9pbnQgQ0ZYX0VkaXQ6OlZUVG9FZGl0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgIENQREZfUmVjdCByY0NvbnRlbnQgPSBtX3BWVC0+R2V0Q29udGVudFJlY3QoKTsKKyAgQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CisKKyAgRlhfRkxPQVQgZlBhZGRpbmcgPSAwLjBmOworCisgIHN3aXRjaCAobV9uQWxpZ25tZW50KSB7CisgICAgY2FzZSAwOgorICAgICAgZlBhZGRpbmcgPSAwLjBmOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgZlBhZGRpbmcgPSAocmNQbGF0ZS5IZWlnaHQoKSAtIHJjQ29udGVudC5IZWlnaHQoKSkgKiAwLjVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgZlBhZGRpbmcgPSByY1BsYXRlLkhlaWdodCgpIC0gcmNDb250ZW50LkhlaWdodCgpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gQ1BERl9Qb2ludChwb2ludC54IC0gKG1fcHRTY3JvbGxQb3MueCAtIHJjUGxhdGUubGVmdCksCisgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgLSAobV9wdFNjcm9sbFBvcy55ICsgZlBhZGRpbmcgLSByY1BsYXRlLnRvcCkpOworfQorCitDUERGX1BvaW50IENGWF9FZGl0OjpFZGl0VG9WVChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7CisgIENQREZfUmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOworCisgIEZYX0ZMT0FUIGZQYWRkaW5nID0gMC4wZjsKKworICBzd2l0Y2ggKG1fbkFsaWdubWVudCkgeworICAgIGNhc2UgMDoKKyAgICAgIGZQYWRkaW5nID0gMC4wZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGZQYWRkaW5nID0gKHJjUGxhdGUuSGVpZ2h0KCkgLSByY0NvbnRlbnQuSGVpZ2h0KCkpICogMC41ZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGZQYWRkaW5nID0gcmNQbGF0ZS5IZWlnaHQoKSAtIHJjQ29udGVudC5IZWlnaHQoKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIChtX3B0U2Nyb2xsUG9zLnggLSByY1BsYXRlLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICBwb2ludC55ICsgKG1fcHRTY3JvbGxQb3MueSArIGZQYWRkaW5nIC0gcmNQbGF0ZS50b3ApKTsKK30KKworQ1BERl9SZWN0IENGWF9FZGl0OjpWVFRvRWRpdChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0IHsKKyAgQ1BERl9Qb2ludCBwdExlZnRCb3R0b20gPSBWVFRvRWRpdChDUERGX1BvaW50KHJlY3QubGVmdCwgcmVjdC5ib3R0b20pKTsKKyAgQ1BERl9Qb2ludCBwdFJpZ2h0VG9wID0gVlRUb0VkaXQoQ1BERl9Qb2ludChyZWN0LnJpZ2h0LCByZWN0LnRvcCkpOworCisgIHJldHVybiBDUERGX1JlY3QocHRMZWZ0Qm90dG9tLngsIHB0TGVmdEJvdHRvbS55LCBwdFJpZ2h0VG9wLngsIHB0UmlnaHRUb3AueSk7Cit9CisKK0NQREZfUmVjdCBDRlhfRWRpdDo6RWRpdFRvVlQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdCB7CisgIENQREZfUG9pbnQgcHRMZWZ0Qm90dG9tID0gRWRpdFRvVlQoQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QuYm90dG9tKSk7CisgIENQREZfUG9pbnQgcHRSaWdodFRvcCA9IEVkaXRUb1ZUKENQREZfUG9pbnQocmVjdC5yaWdodCwgcmVjdC50b3ApKTsKKworICByZXR1cm4gQ1BERl9SZWN0KHB0TGVmdEJvdHRvbS54LCBwdExlZnRCb3R0b20ueSwgcHRSaWdodFRvcC54LCBwdFJpZ2h0VG9wLnkpOworfQorCit2b2lkIENGWF9FZGl0OjpTZXRTY3JvbGxJbmZvKCkgeworICBpZiAobV9iTm90aWZ5ICYmIG1fcE5vdGlmeSkgeworICAgIENQREZfUmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOworICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSBtX3BWVC0+R2V0Q29udGVudFJlY3QoKTsKKworICAgIGlmICghbV9iTm90aWZ5RmxhZykgeworICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICBtX3BOb3RpZnktPklPblNldFNjcm9sbEluZm9YKHJjUGxhdGUubGVmdCwgcmNQbGF0ZS5yaWdodCwgcmNDb250ZW50LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ29udGVudC5yaWdodCwgcmNQbGF0ZS5XaWR0aCgpIC8gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNQbGF0ZS5XaWR0aCgpKTsKKworICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxJbmZvWShyY1BsYXRlLmJvdHRvbSwgcmNQbGF0ZS50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ29udGVudC5ib3R0b20sIHJjQ29udGVudC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjUGxhdGUuSGVpZ2h0KCkgLyAzLCByY1BsYXRlLkhlaWdodCgpKTsKKyAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfRWRpdDo6U2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCkgeworICBpZiAoIW1fYkVuYWJsZVNjcm9sbCkKKyAgICByZXR1cm47CisKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKG1fcHRTY3JvbGxQb3MueCwgZngpKSB7CisgICAgICBtX3B0U2Nyb2xsUG9zLnggPSBmeDsKKyAgICAgIFJlZnJlc2goUlBfTk9BTkFMWVNFKTsKKworICAgICAgaWYgKG1fYk5vdGlmeSAmJiBtX3BOb3RpZnkpIHsKKyAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxQb3NYKGZ4KTsKKyAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfRWRpdDo6U2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSkgeworICBpZiAoIW1fYkVuYWJsZVNjcm9sbCkKKyAgICByZXR1cm47CisKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKG1fcHRTY3JvbGxQb3MueSwgZnkpKSB7CisgICAgICBtX3B0U2Nyb2xsUG9zLnkgPSBmeTsKKyAgICAgIFJlZnJlc2goUlBfTk9BTkFMWVNFKTsKKworICAgICAgaWYgKG1fYk5vdGlmeSAmJiBtX3BOb3RpZnkpIHsKKyAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxQb3NZKGZ5KTsKKyAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfRWRpdDo6U2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIFNldFNjcm9sbFBvc1gocG9pbnQueCk7CisgIFNldFNjcm9sbFBvc1kocG9pbnQueSk7CisgIFNldFNjcm9sbExpbWl0KCk7CisgIFNldENhcmV0SW5mbygpOworfQorCitDUERGX1BvaW50IENGWF9FZGl0OjpHZXRTY3JvbGxQb3MoKSBjb25zdCB7CisgIHJldHVybiBtX3B0U2Nyb2xsUG9zOworfQorCit2b2lkIENGWF9FZGl0OjpTZXRTY3JvbGxMaW1pdCgpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7CisgICAgQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CisKKyAgICBpZiAocmNQbGF0ZS5XaWR0aCgpID4gcmNDb250ZW50LldpZHRoKCkpIHsKKyAgICAgIFNldFNjcm9sbFBvc1gocmNQbGF0ZS5sZWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIobV9wdFNjcm9sbFBvcy54LCByY0NvbnRlbnQubGVmdCkpIHsKKyAgICAgICAgU2V0U2Nyb2xsUG9zWChyY0NvbnRlbnQubGVmdCk7CisgICAgICB9IGVsc2UgaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihtX3B0U2Nyb2xsUG9zLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQucmlnaHQgLSByY1BsYXRlLldpZHRoKCkpKSB7CisgICAgICAgIFNldFNjcm9sbFBvc1gocmNDb250ZW50LnJpZ2h0IC0gcmNQbGF0ZS5XaWR0aCgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmNQbGF0ZS5IZWlnaHQoKSA+IHJjQ29udGVudC5IZWlnaHQoKSkgeworICAgICAgU2V0U2Nyb2xsUG9zWShyY1BsYXRlLnRvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKG1fcHRTY3JvbGxQb3MueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ29udGVudC5ib3R0b20gKyByY1BsYXRlLkhlaWdodCgpKSkgeworICAgICAgICBTZXRTY3JvbGxQb3NZKHJjQ29udGVudC5ib3R0b20gKyByY1BsYXRlLkhlaWdodCgpKTsKKyAgICAgIH0gZWxzZSBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKG1fcHRTY3JvbGxQb3MueSwgcmNDb250ZW50LnRvcCkpIHsKKyAgICAgICAgU2V0U2Nyb2xsUG9zWShyY0NvbnRlbnQudG9wKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfRWRpdDo6U2Nyb2xsVG9DYXJldCgpIHsKKyAgU2V0U2Nyb2xsTGltaXQoKTsKKworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIENQREZfUG9pbnQgcHRIZWFkKDAsIDApOworICAgIENQREZfUG9pbnQgcHRGb290KDAsIDApOworCisgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkgeworICAgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3dwQ2FyZXQpOworCisgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICBwdEhlYWQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKKyAgICAgICAgcHRIZWFkLnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mQXNjZW50OworICAgICAgICBwdEZvb3QueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKKyAgICAgICAgcHRGb290LnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudDsKKyAgICAgIH0gZWxzZSBpZiAocEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKSB7CisgICAgICAgIHB0SGVhZC54ID0gbGluZS5wdExpbmUueDsKKyAgICAgICAgcHRIZWFkLnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudDsKKyAgICAgICAgcHRGb290LnggPSBsaW5lLnB0TGluZS54OworICAgICAgICBwdEZvb3QueSA9IGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBDUERGX1BvaW50IHB0SGVhZEVkaXQgPSBWVFRvRWRpdChwdEhlYWQpOworICAgIENQREZfUG9pbnQgcHRGb290RWRpdCA9IFZUVG9FZGl0KHB0Rm9vdCk7CisKKyAgICBDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKKworICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwocmNQbGF0ZS5sZWZ0LCByY1BsYXRlLnJpZ2h0KSkgeworICAgICAgaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIocHRIZWFkRWRpdC54LCByY1BsYXRlLmxlZnQpIHx8CisgICAgICAgICAgRlhfRURJVF9Jc0Zsb2F0RXF1YWwocHRIZWFkRWRpdC54LCByY1BsYXRlLmxlZnQpKSB7CisgICAgICAgIFNldFNjcm9sbFBvc1gocHRIZWFkLngpOworICAgICAgfSBlbHNlIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocHRIZWFkRWRpdC54LCByY1BsYXRlLnJpZ2h0KSkgeworICAgICAgICBTZXRTY3JvbGxQb3NYKHB0SGVhZC54IC0gcmNQbGF0ZS5XaWR0aCgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHJjUGxhdGUudG9wLCByY1BsYXRlLmJvdHRvbSkpIHsKKyAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKHB0Rm9vdEVkaXQueSwgcmNQbGF0ZS5ib3R0b20pIHx8CisgICAgICAgICAgRlhfRURJVF9Jc0Zsb2F0RXF1YWwocHRGb290RWRpdC55LCByY1BsYXRlLmJvdHRvbSkpIHsKKyAgICAgICAgaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIocHRIZWFkRWRpdC55LCByY1BsYXRlLnRvcCkpIHsKKyAgICAgICAgICBTZXRTY3JvbGxQb3NZKHB0Rm9vdC55ICsgcmNQbGF0ZS5IZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHB0SGVhZEVkaXQueSwgcmNQbGF0ZS50b3ApKSB7CisgICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocHRGb290RWRpdC55LCByY1BsYXRlLmJvdHRvbSkpIHsKKyAgICAgICAgICBTZXRTY3JvbGxQb3NZKHB0SGVhZC55KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIENGWF9FZGl0OjpSZWZyZXNoKFJFRlJFU0hfUExBTl9FIGVQbGFuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZTIpIHsKKyAgaWYgKG1fYkVuYWJsZVJlZnJlc2ggJiYgbV9wVlQtPklzVmFsaWQoKSkgeworICAgIG1fUmVmcmVzaC5CZWdpblJlZnJlc2goKTsKKyAgICBSZWZyZXNoUHVzaExpbmVSZWN0cyhHZXRWaXNpYmxlV29yZFJhbmdlKCkpOworCisgICAgLy8gICAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKG1fcHRSZWZyZXNoU2Nyb2xsUG9zLngsbV9wdFNjcm9sbFBvcy54KSB8fAorICAgIC8vICAgICAgICAgICFGWF9FRElUX0lzRmxvYXRFcXVhbChtX3B0UmVmcmVzaFNjcm9sbFBvcy55LG1fcHRTY3JvbGxQb3MueSkpCisgICAgLy8gICAgICB7CisgICAgbV9SZWZyZXNoLk5vQW5hbHlzZSgpOworICAgIG1fcHRSZWZyZXNoU2Nyb2xsUG9zID0gbV9wdFNjcm9sbFBvczsKKyAgICAvLyAgICAgIH0KKyAgICAvLyAgICAgIGVsc2UKKyAgICAvLyAgICAgIHsKKyAgICAvLyAgICAgICAgICBzd2l0Y2ggKGVQbGFuKQorICAgIC8vICAgICAgICAgIHsKKyAgICAvLyAgICAgICAgICBjYXNlIFJQX0FOQUxZU0U6CisgICAgLy8gICAgICAgICAgICAgIG1fUmVmcmVzaC5BbmFseXNlKG1fcFZULT5HZXRBbGlnbm1lbnQoKSk7CisgICAgLy8KKyAgICAvLyAgICAgICAgICAgICAgaWYgKHBSYW5nZTEpIFJlZnJlc2hQdXNoUmFuZG9tUmVjdHMoKnBSYW5nZTEpOworICAgIC8vICAgICAgICAgICAgICBpZiAocFJhbmdlMikgUmVmcmVzaFB1c2hSYW5kb21SZWN0cygqcFJhbmdlMik7CisgICAgLy8gICAgICAgICAgICAgIGJyZWFrOworICAgIC8vICAgICAgICAgIGNhc2UgUlBfTk9BTkFMWVNFOgorICAgIC8vICAgICAgICAgICAgICBtX1JlZnJlc2guTm9BbmFseXNlKCk7CisgICAgLy8gICAgICAgICAgICAgIGJyZWFrOworICAgIC8vICAgICAgICAgIGNhc2UgUlBfT1BUSU9OQUw6CisgICAgLy8gICAgICAgICAgICAgIGlmIChwUmFuZ2UxKSBSZWZyZXNoUHVzaFJhbmRvbVJlY3RzKCpwUmFuZ2UxKTsKKyAgICAvLyAgICAgICAgICAgICAgaWYgKHBSYW5nZTIpIFJlZnJlc2hQdXNoUmFuZG9tUmVjdHMoKnBSYW5nZTIpOworICAgIC8vICAgICAgICAgICAgICBicmVhazsKKyAgICAvLyAgICAgICAgICB9CisgICAgLy8gICAgICB9CisKKyAgICBpZiAobV9iTm90aWZ5ICYmIG1fcE5vdGlmeSkgeworICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOworICAgICAgICBpZiAoY29uc3QgQ0ZYX0VkaXRfUmVjdEFycmF5KiBwUmVjdHMgPSBtX1JlZnJlc2guR2V0UmVmcmVzaFJlY3RzKCkpIHsKKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gcFJlY3RzLT5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdChwUmVjdHMtPkdldEF0KGkpKTsKKyAgICAgICAgfQorICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICB9CisgICAgfQorCisgICAgbV9SZWZyZXNoLkVuZFJlZnJlc2goKTsKKyAgfQorfQorCit2b2lkIENGWF9FZGl0OjpSZWZyZXNoUHVzaExpbmVSZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICBDUFZUX1dvcmRQbGFjZSB3cEJlZ2luID0gd3IuQmVnaW5Qb3M7CisgICAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdwQmVnaW4pOworICAgICAgQ1BWVF9Xb3JkUGxhY2Ugd3BFbmQgPSB3ci5FbmRQb3M7CisgICAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdwRW5kKTsKKyAgICAgIHBJdGVyYXRvci0+U2V0QXQod3BCZWdpbik7CisKKyAgICAgIENQVlRfTGluZSBsaW5laW5mbzsKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKCFwSXRlcmF0b3ItPkdldExpbmUobGluZWluZm8pKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAobGluZWluZm8ubGluZXBsYWNlLkxpbmVDbXAod3BFbmQpID4gMCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBDUERGX1JlY3QgcmNMaW5lKGxpbmVpbmZvLnB0TGluZS54LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVEZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS54ICsgbGluZWluZm8uZkxpbmVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lQXNjZW50KTsKKworICAgICAgICBtX1JlZnJlc2guUHVzaChDUFZUX1dvcmRSYW5nZShsaW5laW5mby5saW5lcGxhY2UsIGxpbmVpbmZvLmxpbmVFbmQpLAorICAgICAgICAgICAgICAgICAgICAgICBWVFRvRWRpdChyY0xpbmUpKTsKKworICAgICAgfSB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0TGluZSgpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfRWRpdDo6UmVmcmVzaFB1c2hSYW5kb21SZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICBDUFZUX1dvcmRSYW5nZSB3clRlbXAgPSB3cjsKKworICAgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuQmVnaW5Qb3MpOworICAgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuRW5kUG9zKTsKKyAgICAgIHBJdGVyYXRvci0+U2V0QXQod3JUZW1wLkJlZ2luUG9zKTsKKworICAgICAgQ1BWVF9Xb3JkIHdvcmRpbmZvOworICAgICAgQ1BWVF9MaW5lIGxpbmVpbmZvOworICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2U7CisKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgIGlmIChwbGFjZS5Xb3JkQ21wKHdyVGVtcC5FbmRQb3MpID4gMCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pOworICAgICAgICBwSXRlcmF0b3ItPkdldExpbmUobGluZWluZm8pOworCisgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKHdyVGVtcC5CZWdpblBvcykgPT0gMCB8fAorICAgICAgICAgICAgcGxhY2UuTGluZUNtcCh3clRlbXAuRW5kUG9zKSA9PSAwKSB7CisgICAgICAgICAgQ1BERl9SZWN0IHJjV29yZCh3b3JkaW5mby5wdFdvcmQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVEZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8ucHRXb3JkLnggKyB3b3JkaW5mby5mV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lQXNjZW50KTsKKworICAgICAgICAgIG1fUmVmcmVzaC5BZGRSZWZyZXNoKFZUVG9FZGl0KHJjV29yZCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENQREZfUmVjdCByY0xpbmUobGluZWluZm8ucHRMaW5lLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lRGVzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS54ICsgbGluZWluZm8uZkxpbmVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVBc2NlbnQpOworCisgICAgICAgICAgbV9SZWZyZXNoLkFkZFJlZnJlc2goVlRUb0VkaXQocmNMaW5lKSk7CisKKyAgICAgICAgICBwSXRlcmF0b3ItPk5leHRMaW5lKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfRWRpdDo6UmVmcmVzaFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpIHsKKyAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkgeworICAgIENQVlRfV29yZFJhbmdlIHdyVGVtcCA9IHdyOworCisgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuQmVnaW5Qb3MpOworICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkVuZFBvcyk7CisgICAgcEl0ZXJhdG9yLT5TZXRBdCh3clRlbXAuQmVnaW5Qb3MpOworCisgICAgQ1BWVF9Xb3JkIHdvcmRpbmZvOworICAgIENQVlRfTGluZSBsaW5laW5mbzsKKyAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZTsKKworICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgaWYgKHBsYWNlLldvcmRDbXAod3JUZW1wLkVuZFBvcykgPiAwKQorICAgICAgICBicmVhazsKKworICAgICAgcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKTsKKyAgICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5laW5mbyk7CisKKyAgICAgIGlmIChwbGFjZS5MaW5lQ21wKHdyVGVtcC5CZWdpblBvcykgPT0gMCB8fAorICAgICAgICAgIHBsYWNlLkxpbmVDbXAod3JUZW1wLkVuZFBvcykgPT0gMCkgeworICAgICAgICBDUERGX1JlY3QgcmNXb3JkKHdvcmRpbmZvLnB0V29yZC54LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVEZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLnB0V29yZC54ICsgd29yZGluZm8uZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVBc2NlbnQpOworCisgICAgICAgIGlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KSB7CisgICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgICAgIENQREZfUmVjdCByY1JlZnJlc2ggPSBWVFRvRWRpdChyY1dvcmQpOworICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKKyAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENQREZfUmVjdCByY0xpbmUobGluZWluZm8ucHRMaW5lLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZURlc2NlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnggKyBsaW5laW5mby5mTGluZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVBc2NlbnQpOworCisgICAgICAgIGlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KSB7CisgICAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgICAgIENQREZfUmVjdCByY1JlZnJlc2ggPSBWVFRvRWRpdChyY0xpbmUpOworICAgICAgICAgICAgbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKKyAgICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwSXRlcmF0b3ItPk5leHRMaW5lKCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0ZYX0VkaXQ6OlNldENhcmV0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgeworICBtX3dwT2xkQ2FyZXQgPSBtX3dwQ2FyZXQ7CisgIG1fd3BDYXJldCA9IHBsYWNlOworfQorCit2b2lkIENGWF9FZGl0OjpTZXRDYXJldEluZm8oKSB7CisgIGlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KSB7CisgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICBDUERGX1BvaW50IHB0SGVhZCgwLjBmLCAwLjBmKSwgcHRGb290KDAuMGYsIDAuMGYpOworCisgICAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQobV93cENhcmV0KTsKKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgcHRIZWFkLnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7CisgICAgICAgICAgcHRIZWFkLnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mQXNjZW50OworICAgICAgICAgIHB0Rm9vdC54ID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOworICAgICAgICAgIHB0Rm9vdC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQ7CisgICAgICAgIH0gZWxzZSBpZiAocEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKSB7CisgICAgICAgICAgcHRIZWFkLnggPSBsaW5lLnB0TGluZS54OworICAgICAgICAgIHB0SGVhZC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQ7CisgICAgICAgICAgcHRGb290LnggPSBsaW5lLnB0TGluZS54OworICAgICAgICAgIHB0Rm9vdC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOworICAgICAgbV9wTm90aWZ5LT5JT25TZXRDYXJldCghbV9TZWxTdGF0ZS5Jc0V4aXN0KCksIFZUVG9FZGl0KHB0SGVhZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZUVG9FZGl0KHB0Rm9vdCksIG1fd3BDYXJldCk7CisgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgU2V0Q2FyZXRDaGFuZ2UoKTsKK30KKwordm9pZCBDRlhfRWRpdDo6U2V0Q2FyZXRDaGFuZ2UoKSB7CisgIGlmIChtX3dwQ2FyZXQgPT0gbV93cE9sZENhcmV0KQorICAgIHJldHVybjsKKworICBpZiAobV9iTm90aWZ5ICYmIG1fcFZULT5Jc1JpY2hUZXh0KCkgJiYgbV9wTm90aWZ5KSB7CisgICAgQ1BWVF9TZWNQcm9wcyBTZWNQcm9wczsKKyAgICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CisKKyAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICBwSXRlcmF0b3ItPlNldEF0KG1fd3BDYXJldCk7CisgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgIENQVlRfU2VjdGlvbiBzZWN0aW9uOworCisgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pKSB7CisgICAgICAgIFNlY1Byb3BzID0gc2VjdGlvbi5TZWNQcm9wczsKKyAgICAgICAgV29yZFByb3BzID0gc2VjdGlvbi5Xb3JkUHJvcHM7CisgICAgICB9CisKKyAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgV29yZFByb3BzID0gd29yZC5Xb3JkUHJvcHM7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgIG1fcE5vdGlmeS0+SU9uQ2FyZXRDaGFuZ2UoU2VjUHJvcHMsIFdvcmRQcm9wcyk7CisgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0ZYX0VkaXQ6OlNldENhcmV0KGludDMyX3QgblBvcykgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIFNlbGVjdE5vbmUoKTsKKyAgICBTZXRDYXJldChtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UoblBvcykpOworICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCwgbV93cENhcmV0KTsKKworICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICBTZXRDYXJldE9yaWdpbigpOworICAgIFNldENhcmV0SW5mbygpOworICB9Cit9CisKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDdHJsKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgU2VsZWN0Tm9uZSgpOworICAgIFNldENhcmV0KG1fcFZULT5TZWFyY2hXb3JkUGxhY2UoRWRpdFRvVlQocG9pbnQpKSk7CisgICAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LCBtX3dwQ2FyZXQpOworCisgICAgU2Nyb2xsVG9DYXJldCgpOworICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0KK30KKwordm9pZCBDRlhfRWRpdDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkN0cmwpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBTZXRDYXJldChtX3BWVC0+U2VhcmNoV29yZFBsYWNlKEVkaXRUb1ZUKHBvaW50KSkpOworCisgICAgaWYgKG1fd3BDYXJldCAhPSBtX3dwT2xkQ2FyZXQpIHsKKyAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7CisKKyAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgIENQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKKyAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3cik7CisgICAgICBTZXRDYXJldE9yaWdpbigpOworICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfVVAoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBTZXRDYXJldChtX3BWVC0+R2V0VXBXb3JkUGxhY2UobV93cENhcmV0LCBtX3B0Q2FyZXQpKTsKKworICAgIGlmIChiU2hpZnQpIHsKKyAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKKyAgICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOworCisgICAgICBpZiAobV93cE9sZENhcmV0ICE9IG1fd3BDYXJldCkgeworICAgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICAgIENQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKKyAgICAgICAgUmVmcmVzaChSUF9PUFRJT05BTCwgJndyKTsKKyAgICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFNlbGVjdE5vbmUoKTsKKworICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfRE9XTihGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIFNldENhcmV0KG1fcFZULT5HZXREb3duV29yZFBsYWNlKG1fd3BDYXJldCwgbV9wdENhcmV0KSk7CisKKyAgICBpZiAoYlNoaWZ0KSB7CisgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCisgICAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7CisgICAgICBlbHNlCisgICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKKworICAgICAgaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpIHsKKyAgICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3cik7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBTZWxlY3ROb25lKCk7CisKKyAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgIFNldENhcmV0SW5mbygpOworICAgIH0KKyAgfQorfQorCit2b2lkIENGWF9FZGl0OjpPblZLX0xFRlQoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoYlNoaWZ0KSB7CisgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShtX3dwQ2FyZXQpICYmCisgICAgICAgICAgbV93cENhcmV0ICE9IG1fcFZULT5HZXRTZWN0aW9uQmVnaW5QbGFjZShtX3dwQ2FyZXQpKQorICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwQ2FyZXQpKTsKKworICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV93cENhcmV0KSk7CisKKyAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKKyAgICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOworCisgICAgICBpZiAobV93cE9sZENhcmV0ICE9IG1fd3BDYXJldCkgeworICAgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICAgIENQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKKyAgICAgICAgUmVmcmVzaChSUF9PUFRJT05BTCwgJndyKTsKKyAgICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkgeworICAgICAgICBpZiAobV9TZWxTdGF0ZS5CZWdpblBvcy5Xb3JkQ21wKG1fU2VsU3RhdGUuRW5kUG9zKSA8IDApCisgICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5CZWdpblBvcyk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHdyID0gQ1BWVF9Xb3JkUmFuZ2Uod3BPbGQsbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZSh3cE5ldykpOworICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKKworICAgICAgICBTZWxlY3ROb25lKCk7CisgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShtX3dwQ2FyZXQpICYmCisgICAgICAgICAgICBtX3dwQ2FyZXQgIT0gbV9wVlQtPkdldFNlY3Rpb25CZWdpblBsYWNlKG1fd3BDYXJldCkpCisgICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV93cENhcmV0KSk7CisKKyAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV93cENhcmV0KSk7CisKKyAgICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgICBTZXRDYXJldE9yaWdpbigpOworICAgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfRWRpdDo6T25WS19SSUdIVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmIChiU2hpZnQpIHsKKyAgICAgIFNldENhcmV0KG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fd3BDYXJldCkpOworCisgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRMaW5lRW5kUGxhY2UobV93cENhcmV0KSAmJgorICAgICAgICAgIG1fd3BDYXJldCAhPSBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpCisgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fd3BDYXJldCkpOworCisgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCisgICAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7CisgICAgICBlbHNlCisgICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKKworICAgICAgaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpIHsKKyAgICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3cik7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpIHsKKyAgICAgICAgaWYgKG1fU2VsU3RhdGUuQmVnaW5Qb3MuV29yZENtcChtX1NlbFN0YXRlLkVuZFBvcykgPiAwKQorICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOworCisgICAgICAgIFNlbGVjdE5vbmUoKTsKKyAgICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fd3BDYXJldCkpOworCisgICAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldExpbmVFbmRQbGFjZShtX3dwQ2FyZXQpICYmCisgICAgICAgICAgICBtX3dwQ2FyZXQgIT0gbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKQorICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fd3BDYXJldCkpOworCisgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfSE9NRShGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmIChiU2hpZnQpIHsKKyAgICAgIGlmIChiQ3RybCkKKyAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpOworICAgICAgZWxzZQorICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UobV93cENhcmV0KSk7CisKKyAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKKyAgICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOworCisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgICBSZWZyZXNoKFJQX09QVElPTkFMLCAmd3IpOworICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkgeworICAgICAgICBpZiAobV9TZWxTdGF0ZS5CZWdpblBvcy5Xb3JkQ21wKG1fU2VsU3RhdGUuRW5kUG9zKSA8IDApCisgICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5CZWdpblBvcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBTZXRDYXJldChtX1NlbFN0YXRlLkVuZFBvcyk7CisKKyAgICAgICAgU2VsZWN0Tm9uZSgpOworICAgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJDdHJsKQorICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShtX3dwQ2FyZXQpKTsKKworICAgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIENGWF9FZGl0OjpPblZLX0VORChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmIChiU2hpZnQpIHsKKyAgICAgIGlmIChiQ3RybCkKKyAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldExpbmVFbmRQbGFjZShtX3dwQ2FyZXQpKTsKKworICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQorICAgICAgICBtX1NlbFN0YXRlLlNldEVuZFBvcyhtX3dwQ2FyZXQpOworICAgICAgZWxzZQorICAgICAgICBtX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisKKyAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgIENQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKKyAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3cik7CisgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKSB7CisgICAgICAgIGlmIChtX1NlbFN0YXRlLkJlZ2luUG9zLldvcmRDbXAobV9TZWxTdGF0ZS5FbmRQb3MpID4gMCkKKyAgICAgICAgICBTZXRDYXJldChtX1NlbFN0YXRlLkJlZ2luUG9zKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKKworICAgICAgICBTZWxlY3ROb25lKCk7CisgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYkN0cmwpCisgICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRMaW5lRW5kUGxhY2UobV93cENhcmV0KSk7CisKKyAgICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgICBTZXRDYXJldE9yaWdpbigpOworICAgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfRWRpdDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGRVbmRvLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCkgeworICBFbXB0eSgpOworICBEb0luc2VydFRleHQoQ1BWVF9Xb3JkUGxhY2UoMCwgMCwgLTEpLCB0ZXh0LCBjaGFyc2V0LCBwU2VjUHJvcHMsIHBXb3JkUHJvcHMpOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CisgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQorICAgIG1fcE9wck5vdGlmeS0+T25TZXRUZXh0KG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKKyAgLy8gaWYgKGJBZGRVbmRvKQorfQorCitGWF9CT09MIENGWF9FZGl0OjpJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWRkVW5kbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQpIHsKKyAgaWYgKElzVGV4dE92ZXJmbG93KCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOworCisgICAgU2V0Q2FyZXQobV9wVlQtPkluc2VydFdvcmQoCisgICAgICAgIG1fd3BDYXJldCwgd29yZCwgR2V0Q2hhclNldEZyb21Vbmljb2RlKHdvcmQsIGNoYXJzZXQpLCBwV29yZFByb3BzKSk7CisgICAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LCBtX3dwQ2FyZXQpOworCisgICAgaWYgKG1fd3BDYXJldCAhPSBtX3dwT2xkQ2FyZXQpIHsKKyAgICAgIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKSB7CisgICAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfSW5zZXJ0V29yZCh0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQsIGNoYXJzZXQsIHBXb3JkUHJvcHMpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGJQYWludCkKKyAgICAgICAgUGFpbnRJbnNlcnRUZXh0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKKworICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCisgICAgICAgIG1fcE9wck5vdGlmeS0+T25JbnNlcnRXb3JkKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkZFVuZG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQpIHsKKyAgaWYgKElzVGV4dE92ZXJmbG93KCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOworICAgIFNldENhcmV0KG1fcFZULT5JbnNlcnRTZWN0aW9uKG1fd3BDYXJldCwgcFNlY1Byb3BzLCBwV29yZFByb3BzKSk7CisgICAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LCBtX3dwQ2FyZXQpOworCisgICAgaWYgKG1fd3BDYXJldCAhPSBtX3dwT2xkQ2FyZXQpIHsKKyAgICAgIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKSB7CisgICAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfSW5zZXJ0UmV0dXJuKHRoaXMsIG1fd3BPbGRDYXJldCwgbV93cENhcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VjUHJvcHMsIHBXb3JkUHJvcHMpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGJQYWludCkgeworICAgICAgICBSZWFycmFuZ2VQYXJ0KENQVlRfV29yZFJhbmdlKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KSk7CisgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3IobV93cE9sZENhcmV0LCBHZXRWaXNpYmxlV29yZFJhbmdlKCkuRW5kUG9zKTsKICAgICAgICAgUmVmcmVzaChSUF9BTkFMWVNFLCAmd3IpOwogICAgICAgICBTZXRDYXJldE9yaWdpbigpOwogICAgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICAgIH0KKworICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCisgICAgICAgIG1fcE9wck5vdGlmeS0+T25JbnNlcnRSZXR1cm4obV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOworCisgICAgICByZXR1cm4gVFJVRTsKICAgICB9CisgIH0KKworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlJlZG8oKQotewotICAgIGlmIChtX2JFbmFibGVVbmRvKQotICAgIHsKLSAgICAgICAgaWYgKG1fVW5kby5DYW5SZWRvKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fVW5kby5SZWRvKCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQorRlhfQk9PTCBDRlhfRWRpdDo6QmFja3NwYWNlKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgaWYgKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQVlRfU2VjdGlvbiBzZWN0aW9uOworICAgIENQVlRfV29yZCB3b3JkOworCisgICAgaWYgKGJBZGRVbmRvKSB7CisgICAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQobV93cENhcmV0KTsKKyAgICAgICAgcEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pOworICAgICAgICBwSXRlcmF0b3ItPkdldFdvcmQod29yZCk7CisgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKKyAgICBTZXRDYXJldChtX3BWVC0+QmFja1NwYWNlV29yZChtX3dwQ2FyZXQpKTsKKyAgICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7CisKKyAgICBpZiAobV93cENhcmV0ICE9IG1fd3BPbGRDYXJldCkgeworICAgICAgaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pIHsKKyAgICAgICAgaWYgKG1fd3BDYXJldC5TZWNDbXAobV93cE9sZENhcmV0KSAhPSAwKQorICAgICAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfQmFja3NwYWNlKAorICAgICAgICAgICAgICB0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwgd29yZC5Xb3JkLCB3b3JkLm5DaGFyc2V0LAorICAgICAgICAgICAgICBzZWN0aW9uLlNlY1Byb3BzLCBzZWN0aW9uLldvcmRQcm9wcykpOworICAgICAgICBlbHNlCisgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9CYWNrc3BhY2UoCisgICAgICAgICAgICAgIHRoaXMsIG1fd3BPbGRDYXJldCwgbV93cENhcmV0LCB3b3JkLldvcmQsIHdvcmQubkNoYXJzZXQsCisgICAgICAgICAgICAgIHNlY3Rpb24uU2VjUHJvcHMsIHdvcmQuV29yZFByb3BzKSk7CisgICAgICB9CisKKyAgICAgIGlmIChiUGFpbnQpIHsKKyAgICAgICAgUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZShtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCkpOworICAgICAgICBTY3JvbGxUb0NhcmV0KCk7CisKKyAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3I7CisgICAgICAgIGlmIChtX3dwQ2FyZXQuU2VjQ21wKG1fd3BPbGRDYXJldCkgIT0gMCkKKyAgICAgICAgICB3ciA9IENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRWaXNpYmxlV29yZFJhbmdlKCkuRW5kUG9zKTsKKyAgICAgICAgZWxzZSBpZiAobV93cENhcmV0LkxpbmVDbXAobV93cE9sZENhcmV0KSAhPSAwKQorICAgICAgICAgIHdyID0gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldExpbmVCZWdpblBsYWNlKG1fd3BDYXJldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgd3IgPSBDUFZUX1dvcmRSYW5nZShtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwQ2FyZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKTsKKworICAgICAgICBSZWZyZXNoKFJQX0FOQUxZU0UsICZ3cik7CisKKyAgICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgICB9CisKKyAgICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQorICAgICAgICBtX3BPcHJOb3RpZnktPk9uQmFja1NwYWNlKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpVbmRvKCkKLXsKLSAgICBpZiAobV9iRW5hYmxlVW5kbykKLSAgICB7Ci0gICAgICAgIGlmIChtX1VuZG8uQ2FuVW5kbygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX1VuZG8uVW5kbygpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KK0ZYX0JPT0wgQ0ZYX0VkaXQ6OkRlbGV0ZShGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BWVF9TZWN0aW9uIHNlY3Rpb247CisgICAgQ1BWVF9Xb3JkIHdvcmQ7CisKKyAgICBpZiAoYkFkZFVuZG8pIHsKKyAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3BWVC0+R2V0TmV4dFdvcmRQbGFjZShtX3dwQ2FyZXQpKTsKKyAgICAgICAgcEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pOworICAgICAgICBwSXRlcmF0b3ItPkdldFdvcmQod29yZCk7CisgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIEZBTFNFOwotfQorICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKKyAgICBGWF9CT09MIGJTZWNFbmQgPSAobV93cENhcmV0ID09IG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UobV93cENhcmV0KSk7CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldENhcmV0T3JpZ2luKCkKLXsKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KG1fd3BDYXJldCk7Ci0gICAgICAgICAgICBDUFZUX1dvcmQgd29yZDsKLSAgICAgICAgICAgIENQVlRfTGluZSBsaW5lOwotICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3B0Q2FyZXQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKLSAgICAgICAgICAgICAgICBtX3B0Q2FyZXQueSA9IHdvcmQucHRXb3JkLnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwSXRlcmF0b3ItPkdldExpbmUobGluZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV9wdENhcmV0LnggPSBsaW5lLnB0TGluZS54OwotICAgICAgICAgICAgICAgIG1fcHRDYXJldC55ID0gbGluZS5wdExpbmUueTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KKyAgICBTZXRDYXJldChtX3BWVC0+RGVsZXRlV29yZChtX3dwQ2FyZXQpKTsKKyAgICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7CiAKLWludDMyX3QgQ0ZYX0VkaXQ6OldvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgICAgIHJldHVybiBtX3BWVC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgocGxhY2UpOwotCi0gICAgcmV0dXJuIC0xOwotfQotCi1DUFZUX1dvcmRQbGFjZSBDRlhfRWRpdDo6V29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3QKLXsKLSAgICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICAgICAgcmV0dXJuIG1fcFZULT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShpbmRleCk7Ci0KLSAgICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoKTsKLX0KLQotRlhfQk9PTCBDRlhfRWRpdDo6SXNUZXh0RnVsbCgpIGNvbnN0Ci17Ci0gICAgaW50MzJfdCBuVG90YWxXb3JkcyA9IG1fcFZULT5HZXRUb3RhbFdvcmRzKCk7Ci0gICAgaW50MzJfdCBuTGltaXRDaGFyID0gbV9wVlQtPkdldExpbWl0Q2hhcigpOwotICAgIGludDMyX3QgbkNoYXJBcnJheSA9IG1fcFZULT5HZXRDaGFyQXJyYXkoKTsKLQotICAgIHJldHVybiBJc1RleHRPdmVyZmxvdygpIHx8IChuTGltaXRDaGFyPjAgJiYgblRvdGFsV29yZHMgPj0gbkxpbWl0Q2hhcikKLSAgICAgICAgfHwgKG5DaGFyQXJyYXk+MCAmJiBuVG90YWxXb3JkcyA+PSBuQ2hhckFycmF5KTsKLX0KLQotRlhfQk9PTCBDRlhfRWRpdDo6SXNUZXh0T3ZlcmZsb3coKSBjb25zdAotewotICAgIGlmICghbV9iRW5hYmxlU2Nyb2xsICYmICFtX2JFbmFibGVPdmVyZmxvdykKLSAgICB7Ci0gICAgICAgIENQREZfUmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOwotICAgICAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7Ci0KLSAgICAgICAgaWYgKG1fcFZULT5Jc011bHRpTGluZSgpICYmIEdldFRvdGFsTGluZXMoKSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNDb250ZW50LkhlaWdodCgpLHJjUGxhdGUuSGVpZ2h0KCkpKSByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNDb250ZW50LldpZHRoKCkscmNQbGF0ZS5XaWR0aCgpKSkgcmV0dXJuIFRSVUU7CisgICAgaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pIHsKKyAgICAgIGlmIChiU2VjRW5kKQorICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0RlbGV0ZSgKKyAgICAgICAgICAgIHRoaXMsIG1fd3BPbGRDYXJldCwgbV93cENhcmV0LCB3b3JkLldvcmQsIHdvcmQubkNoYXJzZXQsCisgICAgICAgICAgICBzZWN0aW9uLlNlY1Byb3BzLCBzZWN0aW9uLldvcmRQcm9wcywgYlNlY0VuZCkpOworICAgICAgZWxzZQorICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0RlbGV0ZSgKKyAgICAgICAgICAgIHRoaXMsIG1fd3BPbGRDYXJldCwgbV93cENhcmV0LCB3b3JkLldvcmQsIHdvcmQubkNoYXJzZXQsCisgICAgICAgICAgICBzZWN0aW9uLlNlY1Byb3BzLCB3b3JkLldvcmRQcm9wcywgYlNlY0VuZCkpOwogICAgIH0KIAotICAgIHJldHVybiBGQUxTRTsKLX0KKyAgICBpZiAoYlBhaW50KSB7CisgICAgICBSZWFycmFuZ2VQYXJ0KENQVlRfV29yZFJhbmdlKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KSk7CisgICAgICBTY3JvbGxUb0NhcmV0KCk7CiAKLUNQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIHJldHVybiBtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UocGxhY2UpOwotfQorICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3I7CisgICAgICBpZiAoYlNlY0VuZCkKKyAgICAgICAgd3IgPSBDUFZUX1dvcmRSYW5nZShtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwT2xkQ2FyZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFZpc2libGVXb3JkUmFuZ2UoKS5FbmRQb3MpOworICAgICAgZWxzZSBpZiAobV93cENhcmV0LkxpbmVDbXAobV93cE9sZENhcmV0KSAhPSAwKQorICAgICAgICB3ciA9IENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShtX3dwQ2FyZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UobV93cENhcmV0KSk7CisgICAgICBlbHNlCisgICAgICAgIHdyID0gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV93cE9sZENhcmV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOwogCi1DUFZUX1dvcmRQbGFjZSBDRlhfRWRpdDo6R2V0TGluZUVuZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcFZULT5HZXRMaW5lRW5kUGxhY2UocGxhY2UpOwotfQorICAgICAgUmVmcmVzaChSUF9BTkFMWVNFLCAmd3IpOwogCi1DUFZUX1dvcmRQbGFjZSBDRlhfRWRpdDo6R2V0U2VjdGlvbkJlZ2luUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wVlQtPkdldFNlY3Rpb25CZWdpblBsYWNlKHBsYWNlKTsKLX0KLQotQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OkdldFNlY3Rpb25FbmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIHJldHVybiBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKHBsYWNlKTsKLX0KLQotRlhfQk9PTCBDRlhfRWRpdDo6Q2FuVW5kbygpIGNvbnN0Ci17Ci0gICAgaWYgKG1fYkVuYWJsZVVuZG8pCi0gICAgewotICAgICAgICByZXR1cm4gbV9VbmRvLkNhblVuZG8oKTsKKyAgICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgICBTZXRDYXJldEluZm8oKTsKICAgICB9CiAKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0ZYX0VkaXQ6OkNhblJlZG8oKSBjb25zdAotewotICAgIGlmIChtX2JFbmFibGVVbmRvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fVW5kby5DYW5SZWRvKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGWF9FZGl0OjpJc01vZGlmaWVkKCkgY29uc3QKLXsKLSAgICBpZiAobV9iRW5hYmxlVW5kbykKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1VuZG8uSXNNb2RpZmllZCgpOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBDRlhfRWRpdDo6RW5hYmxlUmVmcmVzaChGWF9CT09MIGJSZWZyZXNoKQotewotICAgIG1fYkVuYWJsZVJlZnJlc2ggPSBiUmVmcmVzaDsKLX0KLQotdm9pZCBDRlhfRWRpdDo6RW5hYmxlVW5kbyhGWF9CT09MIGJVbmRvKQotewotICAgIG1fYkVuYWJsZVVuZG8gPSBiVW5kbzsKLX0KLQotdm9pZCBDRlhfRWRpdDo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkKLXsKLSAgICBtX2JOb3RpZnkgPSBiTm90aWZ5OwotfQotCi12b2lkIENGWF9FZGl0OjpFbmFibGVPcHJOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KQotewotICAgIG1fYk9wck5vdGlmeSA9IGJOb3RpZnk7Ci19Ci0KLUZYX0ZMT0FUIENGWF9FZGl0OjpHZXRMaW5lVG9wKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QKLXsKLSAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotICAgIHsKLSAgICAgICAgQ1BWVF9Xb3JkUGxhY2Ugd3BPbGQgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0KLSAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7Ci0gICAgICAgIENQVlRfTGluZSBsaW5lOwotICAgICAgICBwSXRlcmF0b3ItPkdldExpbmUobGluZSk7Ci0KLSAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdCh3cE9sZCk7Ci0KLSAgICAgICAgcmV0dXJuIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50OwotICAgIH0KLQotICAgIHJldHVybiAwLjBmOwotfQotCi1GWF9GTE9BVCBDRlhfRWRpdDo6R2V0TGluZUJvdHRvbShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0Ci17Ci0gICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKLSAgICB7Ci0gICAgICAgIENQVlRfV29yZFBsYWNlIHdwT2xkID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCi0gICAgICAgIHBJdGVyYXRvci0+U2V0QXQocGxhY2UpOwotICAgICAgICBDUFZUX0xpbmUgbGluZTsKLSAgICAgICAgcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOwotCi0gICAgICAgIHBJdGVyYXRvci0+U2V0QXQod3BPbGQpOwotCi0gICAgICAgIHJldHVybiBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZURlc2NlbnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIDAuMGY7Ci19Ci0KLUNQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpEb0luc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBGWF9XQ0hBUiogdGV4dCwgaW50MzJfdCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpCi17Ci0gICAgQ1BWVF9Xb3JkUGxhY2Ugd3AgPSBwbGFjZTsKLQotICAgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc1RleHQgPSB0ZXh0OwotCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBzVGV4dC5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZYX1dPUkQgd29yZCA9IHNUZXh0W2ldOwotICAgICAgICAgICAgc3dpdGNoICh3b3JkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAweDBEOgotICAgICAgICAgICAgICAgIHdwID0gbV9wVlQtPkluc2VydFNlY3Rpb24od3AscFNlY1Byb3BzLHBXb3JkUHJvcHMpOwotICAgICAgICAgICAgICAgIGlmIChzVGV4dFtpKzFdID09IDB4MEEpCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMHgwQToKLSAgICAgICAgICAgICAgICB3cCA9IG1fcFZULT5JbnNlcnRTZWN0aW9uKHdwLHBTZWNQcm9wcyxwV29yZFByb3BzKTsKLSAgICAgICAgICAgICAgICBpZiAoc1RleHRbaSsxXSA9PSAweDBEKQotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDB4MDk6Ci0gICAgICAgICAgICAgICAgd29yZCA9IDB4MjA7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHdwID0gbV9wVlQtPkluc2VydFdvcmQod3Asd29yZCxHZXRDaGFyU2V0RnJvbVVuaWNvZGUod29yZCwgY2hhcnNldCkscFdvcmRQcm9wcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gd3A7Ci19Ci0KLWludDMyX3QgQ0ZYX0VkaXQ6OkdldENoYXJTZXRGcm9tVW5pY29kZShGWF9XT1JEIHdvcmQsIGludDMyX3Qgbk9sZENoYXJzZXQpCi17Ci0gICAgaWYgKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwID0gR2V0Rm9udE1hcCgpKQotICAgICAgICByZXR1cm4gcEZvbnRNYXAtPkNoYXJTZXRGcm9tVW5pY29kZSh3b3JkLCBuT2xkQ2hhcnNldCk7Ci0gICAgcmV0dXJuIG5PbGRDaGFyc2V0OwotfQotCi12b2lkIENGWF9FZGl0OjpCZWdpbkdyb3VwVW5kbyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RpdGxlKQotewotICAgIEFTU0VSVChtX3BHcm91cFVuZG9JdGVtID09IE5VTEwpOwotCi0gICAgbV9wR3JvdXBVbmRvSXRlbSA9IG5ldyBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtKHNUaXRsZSk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OkVuZEdyb3VwVW5kbygpCi17Ci0gICAgQVNTRVJUKG1fcEdyb3VwVW5kb0l0ZW0gIT0gTlVMTCk7Ci0KLSAgICBtX3BHcm91cFVuZG9JdGVtLT5VcGRhdGVJdGVtcygpOwotICAgIG1fVW5kby5BZGRJdGVtKG1fcEdyb3VwVW5kb0l0ZW0pOwogICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQotICAgICAgICBtX3BPcHJOb3RpZnktPk9uQWRkVW5kbyhtX3BHcm91cFVuZG9JdGVtKTsKLSAgICBtX3BHcm91cFVuZG9JdGVtID0gTlVMTDsKKyAgICAgIG1fcE9wck5vdGlmeS0+T25EZWxldGUobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOworCisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OkFkZEVkaXRVbmRvSXRlbShDRlhfRWRpdF9VbmRvSXRlbSogcEVkaXRVbmRvSXRlbSkKLXsKLSAgICBpZiAobV9wR3JvdXBVbmRvSXRlbSkKLSAgICAgICAgbV9wR3JvdXBVbmRvSXRlbS0+QWRkVW5kb0l0ZW0ocEVkaXRVbmRvSXRlbSk7CitGWF9CT09MIENGWF9FZGl0OjpFbXB0eSgpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBtX3BWVC0+RGVsZXRlV29yZHMoR2V0V2hvbGVXb3JkUmFuZ2UoKSk7CisgICAgU2V0Q2FyZXQobV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpOworCisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OkNsZWFyKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKSB7CisgICAgICBDUFZUX1dvcmRSYW5nZSByYW5nZSA9IG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCk7CisKKyAgICAgIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKSB7CisgICAgICAgIGlmIChtX3BWVC0+SXNSaWNoVGV4dCgpKSB7CisgICAgICAgICAgQmVnaW5Hcm91cFVuZG8oTCIiKTsKKworICAgICAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICAgICAgICAgIHBJdGVyYXRvci0+U2V0QXQocmFuZ2UuRW5kUG9zKTsKKworICAgICAgICAgICAgQ1BWVF9Xb3JkIHdvcmRpbmZvOworICAgICAgICAgICAgQ1BWVF9TZWN0aW9uIHNlY2luZm87CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgICAgICAgICBpZiAocGxhY2UuV29yZENtcChyYW5nZS5CZWdpblBvcykgPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKHBsYWNlKTsKKworICAgICAgICAgICAgICBpZiAob2xkcGxhY2UuU2VjQ21wKHBsYWNlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWNpbmZvKSkgeworICAgICAgICAgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9DbGVhclJpY2goCisgICAgICAgICAgICAgICAgICAgICAgdGhpcywgb2xkcGxhY2UsIHBsYWNlLCByYW5nZSwgd29yZGluZm8uV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5uQ2hhcnNldCwgc2VjaW5mby5TZWNQcm9wcywgc2VjaW5mby5Xb3JkUHJvcHMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykpIHsKKyAgICAgICAgICAgICAgICAgIG9sZHBsYWNlID0gbV9wVlQtPkFqdXN0TGluZUhlYWRlcihvbGRwbGFjZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICBwbGFjZSA9IG1fcFZULT5BanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpOworCisgICAgICAgICAgICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0NsZWFyUmljaCgKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBvbGRwbGFjZSwgcGxhY2UsIHJhbmdlLCB3b3JkaW5mby5Xb3JkLAorICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLm5DaGFyc2V0LCBzZWNpbmZvLlNlY1Byb3BzLCB3b3JkaW5mby5Xb3JkUHJvcHMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHBJdGVyYXRvci0+UHJldldvcmQoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIEVuZEdyb3VwVW5kbygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfQ2xlYXIodGhpcywgcmFuZ2UsIEdldFNlbFRleHQoKSkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIFNlbGVjdE5vbmUoKTsKKyAgICAgIFNldENhcmV0KG1fcFZULT5EZWxldGVXb3JkcyhyYW5nZSkpOworICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LCBtX3dwQ2FyZXQpOworCisgICAgICBpZiAoYlBhaW50KSB7CisgICAgICAgIFJlYXJyYW5nZVBhcnQocmFuZ2UpOworICAgICAgICBTY3JvbGxUb0NhcmV0KCk7CisKKyAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3IobV93cE9sZENhcmV0LCBHZXRWaXNpYmxlV29yZFJhbmdlKCkuRW5kUG9zKTsKKyAgICAgICAgUmVmcmVzaChSUF9BTkFMWVNFLCAmd3IpOworCisgICAgICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfQorCisgICAgICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKKyAgICAgICAgbV9wT3ByTm90aWZ5LT5PbkNsZWFyKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENGWF9FZGl0OjpJbnNlcnRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkZFVuZG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50KSB7CisgIGlmIChJc1RleHRPdmVyZmxvdygpKQorICAgIHJldHVybiBGQUxTRTsKKworICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CisgIFNldENhcmV0KERvSW5zZXJ0VGV4dChtX3dwQ2FyZXQsIHRleHQsIGNoYXJzZXQsIHBTZWNQcm9wcywgcFdvcmRQcm9wcykpOworICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7CisKKyAgaWYgKG1fd3BDYXJldCAhPSBtX3dwT2xkQ2FyZXQpIHsKKyAgICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykgeworICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9JbnNlcnRUZXh0KHRoaXMsIG1fd3BPbGRDYXJldCwgbV93cENhcmV0LCB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQsIHBTZWNQcm9wcywgcFdvcmRQcm9wcykpOworICAgIH0KKworICAgIGlmIChiUGFpbnQpCisgICAgICBQYWludEluc2VydFRleHQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOworCisgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCisgICAgICBtX3BPcHJOb3RpZnktPk9uSW5zZXJ0VGV4dChtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CisKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQgQ0ZYX0VkaXQ6OlBhaW50SW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3KSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZSh3cE9sZCwgd3BOZXcpKTsKKyAgICBTY3JvbGxUb0NhcmV0KCk7CisKKyAgICBDUFZUX1dvcmRSYW5nZSB3cjsKKyAgICBpZiAobV93cENhcmV0LkxpbmVDbXAod3BPbGQpICE9IDApCisgICAgICB3ciA9IENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZSh3cE9sZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2Uod3BOZXcpKTsKICAgICBlbHNlCi0gICAgewotICAgICAgICBtX1VuZG8uQWRkSXRlbShwRWRpdFVuZG9JdGVtKTsKLSAgICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCi0gICAgICAgICAgICBtX3BPcHJOb3RpZnktPk9uQWRkVW5kbyhwRWRpdFVuZG9JdGVtKTsKKyAgICAgIHdyID0gQ1BWVF9Xb3JkUmFuZ2Uod3BPbGQsIG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2Uod3BOZXcpKTsKKyAgICBSZWZyZXNoKFJQX0FOQUxZU0UsICZ3cik7CisgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICBTZXRDYXJldEluZm8oKTsKKyAgfQorfQorCitGWF9CT09MIENGWF9FZGl0OjpSZWRvKCkgeworICBpZiAobV9iRW5hYmxlVW5kbykgeworICAgIGlmIChtX1VuZG8uQ2FuUmVkbygpKSB7CisgICAgICBtX1VuZG8uUmVkbygpOworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENGWF9FZGl0OjpBZGRVbmRvSXRlbShJRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKQotewotICAgIG1fVW5kby5BZGRJdGVtKHBVbmRvSXRlbSk7CitGWF9CT09MIENGWF9FZGl0OjpVbmRvKCkgeworICBpZiAobV9iRW5hYmxlVW5kbykgeworICAgIGlmIChtX1VuZG8uQ2FuVW5kbygpKSB7CisgICAgICBtX1VuZG8uVW5kbygpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkIENGWF9FZGl0OjpTZXRDYXJldE9yaWdpbigpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICBwSXRlcmF0b3ItPlNldEF0KG1fd3BDYXJldCk7CisgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICBtX3B0Q2FyZXQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKKyAgICAgICAgbV9wdENhcmV0LnkgPSB3b3JkLnB0V29yZC55OworICAgICAgfSBlbHNlIGlmIChwSXRlcmF0b3ItPkdldExpbmUobGluZSkpIHsKKyAgICAgICAgbV9wdENhcmV0LnggPSBsaW5lLnB0TGluZS54OworICAgICAgICBtX3B0Q2FyZXQueSA9IGxpbmUucHRMaW5lLnk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2ludDMyX3QgQ0ZYX0VkaXQ6OldvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkKKyAgICByZXR1cm4gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KHBsYWNlKTsKKworICByZXR1cm4gLTE7Cit9CisKK0NQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpXb3JkSW5kZXhUb1dvcmRQbGFjZShpbnQzMl90IGluZGV4KSBjb25zdCB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQorICAgIHJldHVybiBtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UoaW5kZXgpOworCisgIHJldHVybiBDUFZUX1dvcmRQbGFjZSgpOworfQorCitGWF9CT09MIENGWF9FZGl0OjpJc1RleHRGdWxsKCkgY29uc3QgeworICBpbnQzMl90IG5Ub3RhbFdvcmRzID0gbV9wVlQtPkdldFRvdGFsV29yZHMoKTsKKyAgaW50MzJfdCBuTGltaXRDaGFyID0gbV9wVlQtPkdldExpbWl0Q2hhcigpOworICBpbnQzMl90IG5DaGFyQXJyYXkgPSBtX3BWVC0+R2V0Q2hhckFycmF5KCk7CisKKyAgcmV0dXJuIElzVGV4dE92ZXJmbG93KCkgfHwgKG5MaW1pdENoYXIgPiAwICYmIG5Ub3RhbFdvcmRzID49IG5MaW1pdENoYXIpIHx8CisgICAgICAgICAobkNoYXJBcnJheSA+IDAgJiYgblRvdGFsV29yZHMgPj0gbkNoYXJBcnJheSk7Cit9CisKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OklzVGV4dE92ZXJmbG93KCkgY29uc3QgeworICBpZiAoIW1fYkVuYWJsZVNjcm9sbCAmJiAhbV9iRW5hYmxlT3ZlcmZsb3cpIHsKKyAgICBDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7CisKKyAgICBpZiAobV9wVlQtPklzTXVsdGlMaW5lKCkgJiYgR2V0VG90YWxMaW5lcygpID4gMSkgeworICAgICAgaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihyY0NvbnRlbnQuSGVpZ2h0KCksIHJjUGxhdGUuSGVpZ2h0KCkpKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5XaWR0aCgpLCByY1BsYXRlLldpZHRoKCkpKQorICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0NQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShwbGFjZSk7Cit9CisKK0NQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIHJldHVybiBtX3BWVC0+R2V0TGluZUVuZFBsYWNlKHBsYWNlKTsKK30KKworQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OkdldFNlY3Rpb25CZWdpblBsYWNlKAorICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICByZXR1cm4gbV9wVlQtPkdldFNlY3Rpb25CZWdpblBsYWNlKHBsYWNlKTsKK30KKworQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OkdldFNlY3Rpb25FbmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UocGxhY2UpOworfQorCitGWF9CT09MIENGWF9FZGl0OjpDYW5VbmRvKCkgY29uc3QgeworICBpZiAobV9iRW5hYmxlVW5kbykgeworICAgIHJldHVybiBtX1VuZG8uQ2FuVW5kbygpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENGWF9FZGl0OjpDYW5SZWRvKCkgY29uc3QgeworICBpZiAobV9iRW5hYmxlVW5kbykgeworICAgIHJldHVybiBtX1VuZG8uQ2FuUmVkbygpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENGWF9FZGl0OjpJc01vZGlmaWVkKCkgY29uc3QgeworICBpZiAobV9iRW5hYmxlVW5kbykgeworICAgIHJldHVybiBtX1VuZG8uSXNNb2RpZmllZCgpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkIENGWF9FZGl0OjpFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpIHsKKyAgbV9iRW5hYmxlUmVmcmVzaCA9IGJSZWZyZXNoOworfQorCit2b2lkIENGWF9FZGl0OjpFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pIHsKKyAgbV9iRW5hYmxlVW5kbyA9IGJVbmRvOworfQorCit2b2lkIENGWF9FZGl0OjpFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KSB7CisgIG1fYk5vdGlmeSA9IGJOb3RpZnk7Cit9CisKK3ZvaWQgQ0ZYX0VkaXQ6OkVuYWJsZU9wck5vdGlmeShGWF9CT09MIGJOb3RpZnkpIHsKKyAgbV9iT3ByTm90aWZ5ID0gYk5vdGlmeTsKK30KKworRlhfRkxPQVQgQ0ZYX0VkaXQ6OkdldExpbmVUb3AoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICBDUFZUX1dvcmRQbGFjZSB3cE9sZCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKworICAgIHBJdGVyYXRvci0+U2V0QXQocGxhY2UpOworICAgIENQVlRfTGluZSBsaW5lOworICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5lKTsKKworICAgIHBJdGVyYXRvci0+U2V0QXQod3BPbGQpOworCisgICAgcmV0dXJuIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50OworICB9CisKKyAgcmV0dXJuIDAuMGY7Cit9CisKK0ZYX0ZMT0FUIENGWF9FZGl0OjpHZXRMaW5lQm90dG9tKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgQ1BWVF9Xb3JkUGxhY2Ugd3BPbGQgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisKKyAgICBwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKKyAgICBDUFZUX0xpbmUgbGluZTsKKyAgICBwSXRlcmF0b3ItPkdldExpbmUobGluZSk7CisKKyAgICBwSXRlcmF0b3ItPlNldEF0KHdwT2xkKTsKKworICAgIHJldHVybiBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZURlc2NlbnQ7CisgIH0KKworICByZXR1cm4gMC4wZjsKK30KKworQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OkRvSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpIHsKKyAgQ1BWVF9Xb3JkUGxhY2Ugd3AgPSBwbGFjZTsKKworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIENGWF9XaWRlU3RyaW5nIHNUZXh0ID0gdGV4dDsKKworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBzVGV4dC5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIEZYX1dPUkQgd29yZCA9IHNUZXh0W2ldOworICAgICAgc3dpdGNoICh3b3JkKSB7CisgICAgICAgIGNhc2UgMHgwRDoKKyAgICAgICAgICB3cCA9IG1fcFZULT5JbnNlcnRTZWN0aW9uKHdwLCBwU2VjUHJvcHMsIHBXb3JkUHJvcHMpOworICAgICAgICAgIGlmIChzVGV4dFtpICsgMV0gPT0gMHgwQSkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDBBOgorICAgICAgICAgIHdwID0gbV9wVlQtPkluc2VydFNlY3Rpb24od3AsIHBTZWNQcm9wcywgcFdvcmRQcm9wcyk7CisgICAgICAgICAgaWYgKHNUZXh0W2kgKyAxXSA9PSAweDBEKQorICAgICAgICAgICAgaSsrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDk6CisgICAgICAgICAgd29yZCA9IDB4MjA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgd3AgPSBtX3BWVC0+SW5zZXJ0V29yZCh3cCwgd29yZCwgR2V0Q2hhclNldEZyb21Vbmljb2RlKHdvcmQsIGNoYXJzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmRQcm9wcyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHdwOworfQorCitpbnQzMl90IENGWF9FZGl0OjpHZXRDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KSB7CisgIGlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IEdldEZvbnRNYXAoKSkKKyAgICByZXR1cm4gcEZvbnRNYXAtPkNoYXJTZXRGcm9tVW5pY29kZSh3b3JkLCBuT2xkQ2hhcnNldCk7CisgIHJldHVybiBuT2xkQ2hhcnNldDsKK30KKwordm9pZCBDRlhfRWRpdDo6QmVnaW5Hcm91cFVuZG8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUaXRsZSkgeworICBBU1NFUlQobV9wR3JvdXBVbmRvSXRlbSA9PSBOVUxMKTsKKworICBtX3BHcm91cFVuZG9JdGVtID0gbmV3IENGWF9FZGl0X0dyb3VwVW5kb0l0ZW0oc1RpdGxlKTsKK30KKwordm9pZCBDRlhfRWRpdDo6RW5kR3JvdXBVbmRvKCkgeworICBBU1NFUlQobV9wR3JvdXBVbmRvSXRlbSAhPSBOVUxMKTsKKworICBtX3BHcm91cFVuZG9JdGVtLT5VcGRhdGVJdGVtcygpOworICBtX1VuZG8uQWRkSXRlbShtX3BHcm91cFVuZG9JdGVtKTsKKyAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCisgICAgbV9wT3ByTm90aWZ5LT5PbkFkZFVuZG8obV9wR3JvdXBVbmRvSXRlbSk7CisgIG1fcEdyb3VwVW5kb0l0ZW0gPSBOVUxMOworfQorCit2b2lkIENGWF9FZGl0OjpBZGRFZGl0VW5kb0l0ZW0oQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBFZGl0VW5kb0l0ZW0pIHsKKyAgaWYgKG1fcEdyb3VwVW5kb0l0ZW0pCisgICAgbV9wR3JvdXBVbmRvSXRlbS0+QWRkVW5kb0l0ZW0ocEVkaXRVbmRvSXRlbSk7CisgIGVsc2UgeworICAgIG1fVW5kby5BZGRJdGVtKHBFZGl0VW5kb0l0ZW0pOwogICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQotICAgICAgICBtX3BPcHJOb3RpZnktPk9uQWRkVW5kbyhwVW5kb0l0ZW0pOworICAgICAgbV9wT3ByTm90aWZ5LT5PbkFkZFVuZG8ocEVkaXRVbmRvSXRlbSk7CisgIH0KIH0KIAordm9pZCBDRlhfRWRpdDo6QWRkVW5kb0l0ZW0oSUZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSkgeworICBtX1VuZG8uQWRkSXRlbShwVW5kb0l0ZW0pOworICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKKyAgICBtX3BPcHJOb3RpZnktPk9uQWRkVW5kbyhwVW5kb0l0ZW0pOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcAppbmRleCBkOTRjYzE2Li43MGRjOGQ1IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcApAQCAtOCwxMDA0ICs4LDgyOSBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oIgogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9MaXN0SXRlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9MaXN0SXRlbQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DRlhfTGlzdEl0ZW06OkNGWF9MaXN0SXRlbSgpIDogbV9wRWRpdChOVUxMKSwKLQltX2JTZWxlY3RlZChGQUxTRSksCi0JbV9iQ2FyZXQoRkFMU0UpLAotCW1fcmNMaXN0SXRlbSgwLjBmLDAuMGYsMC4wZiwwLjBmKQotewotCW1fcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpOwotCUFTU0VSVChtX3BFZGl0ICE9IE5VTEwpOworQ0ZYX0xpc3RJdGVtOjpDRlhfTGlzdEl0ZW0oKQorICAgIDogbV9wRWRpdChOVUxMKSwKKyAgICAgIG1fYlNlbGVjdGVkKEZBTFNFKSwKKyAgICAgIG1fYkNhcmV0KEZBTFNFKSwKKyAgICAgIG1fcmNMaXN0SXRlbSgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSB7CisgIG1fcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpOworICBBU1NFUlQobV9wRWRpdCAhPSBOVUxMKTsKIAotCW1fcEVkaXQtPlNldEFsaWdubWVudFYoMSk7Ci0JbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOworICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEpOworICBtX3BFZGl0LT5Jbml0aWFsaXplKCk7CiB9CiAKLUNGWF9MaXN0SXRlbTo6fkNGWF9MaXN0SXRlbSgpCi17Ci0JSUZYX0VkaXQ6OkRlbEVkaXQobV9wRWRpdCk7CitDRlhfTGlzdEl0ZW06On5DRlhfTGlzdEl0ZW0oKSB7CisgIElGWF9FZGl0OjpEZWxFZGl0KG1fcEVkaXQpOwogfQogCi12b2lkIENGWF9MaXN0SXRlbTo6U2V0Rm9udE1hcChJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXApCi17Ci0JaWYgKG1fcEVkaXQpCi0JCW1fcEVkaXQtPlNldEZvbnRNYXAocEZvbnRNYXApOwordm9pZCBDRlhfTGlzdEl0ZW06OlNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXApIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+U2V0Rm9udE1hcChwRm9udE1hcCk7CiB9CiAKLUlGWF9FZGl0KiBDRlhfTGlzdEl0ZW06OkdldEVkaXQoKSBjb25zdAotewotCXJldHVybiBtX3BFZGl0OworSUZYX0VkaXQqIENGWF9MaXN0SXRlbTo6R2V0RWRpdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEVkaXQ7CiB9CiAKLUlGWF9FZGl0X0l0ZXJhdG9yKglDRlhfTGlzdEl0ZW06OkdldEl0ZXJhdG9yKCkgY29uc3QKLXsKLQlpZiAobV9wRWRpdCkKLQkJcmV0dXJuIG1fcEVkaXQtPkdldEl0ZXJhdG9yKCk7CitJRlhfRWRpdF9JdGVyYXRvciogQ0ZYX0xpc3RJdGVtOjpHZXRJdGVyYXRvcigpIGNvbnN0IHsKKyAgaWYgKG1fcEVkaXQpCisgICAgcmV0dXJuIG1fcEVkaXQtPkdldEl0ZXJhdG9yKCk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRSZWN0KGNvbnN0IENMU1RfUmVjdCAmIHJlY3QpCi17Ci0JbV9yY0xpc3RJdGVtID0gcmVjdDsKK3ZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRSZWN0KGNvbnN0IENMU1RfUmVjdCYgcmVjdCkgeworICBtX3JjTGlzdEl0ZW0gPSByZWN0OwogfQogCi1DTFNUX1JlY3QgQ0ZYX0xpc3RJdGVtOjpHZXRSZWN0KCkgY29uc3QKLXsKLQlyZXR1cm4gbV9yY0xpc3RJdGVtOworQ0xTVF9SZWN0IENGWF9MaXN0SXRlbTo6R2V0UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcmNMaXN0SXRlbTsKIH0KIAotRlhfQk9PTCBDRlhfTGlzdEl0ZW06OklzU2VsZWN0ZWQoKSBjb25zdAotewotCXJldHVybiBtX2JTZWxlY3RlZDsKK0ZYX0JPT0wgQ0ZYX0xpc3RJdGVtOjpJc1NlbGVjdGVkKCkgY29uc3QgeworICByZXR1cm4gbV9iU2VsZWN0ZWQ7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRTZWxlY3QoRlhfQk9PTCBiU2VsZWN0ZWQpCi17Ci0JbV9iU2VsZWN0ZWQgPSBiU2VsZWN0ZWQ7Cit2b2lkIENGWF9MaXN0SXRlbTo6U2V0U2VsZWN0KEZYX0JPT0wgYlNlbGVjdGVkKSB7CisgIG1fYlNlbGVjdGVkID0gYlNlbGVjdGVkOwogfQogCi1GWF9CT09MIENGWF9MaXN0SXRlbTo6SXNDYXJldCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fYkNhcmV0OworRlhfQk9PTCBDRlhfTGlzdEl0ZW06OklzQ2FyZXQoKSBjb25zdCB7CisgIHJldHVybiBtX2JDYXJldDsKIH0KIAotdm9pZCBDRlhfTGlzdEl0ZW06OlNldENhcmV0KEZYX0JPT0wgYkNhcmV0KQotewotCW1fYkNhcmV0ID0gYkNhcmV0Owordm9pZCBDRlhfTGlzdEl0ZW06OlNldENhcmV0KEZYX0JPT0wgYkNhcmV0KSB7CisgIG1fYkNhcmV0ID0gYkNhcmV0OwogfQogCi12b2lkIENGWF9MaXN0SXRlbTo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCkKLXsKLQlpZiAobV9wRWRpdCkKLQkJbV9wRWRpdC0+U2V0VGV4dCh0ZXh0KTsKK3ZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0KSB7CisgIGlmIChtX3BFZGl0KQorICAgIG1fcEVkaXQtPlNldFRleHQodGV4dCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0JaWYgKG1fcEVkaXQpCi0JCW1fcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Cit2b2lkIENGWF9MaXN0SXRlbTo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIGlmIChtX3BFZGl0KQorICAgIG1fcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiB9CiAKLUZYX0ZMT0FUIENGWF9MaXN0SXRlbTo6R2V0SXRlbUhlaWdodCgpIGNvbnN0Ci17Ci0JaWYgKG1fcEVkaXQpCi0JCXJldHVybiBtX3BFZGl0LT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOworRlhfRkxPQVQgQ0ZYX0xpc3RJdGVtOjpHZXRJdGVtSGVpZ2h0KCkgY29uc3QgeworICBpZiAobV9wRWRpdCkKKyAgICByZXR1cm4gbV9wRWRpdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAotCXJldHVybiAwLjBmOworICByZXR1cm4gMC4wZjsKIH0KIAotRlhfV09SRCBDRlhfTGlzdEl0ZW06OkdldEZpcnN0Q2hhcigpIGNvbnN0Ci17Ci0JQ1BWVF9Xb3JkIHdvcmQ7CitGWF9XT1JEIENGWF9MaXN0SXRlbTo6R2V0Rmlyc3RDaGFyKCkgY29uc3QgeworICBDUFZUX1dvcmQgd29yZDsKIAotCWlmIChJRlhfRWRpdF9JdGVyYXRvcioJcEl0ZXJhdG9yID0gR2V0SXRlcmF0b3IoKSkKLQl7Ci0JCXBJdGVyYXRvci0+U2V0QXQoMSk7Ci0JCXBJdGVyYXRvci0+R2V0V29yZCh3b3JkKTsKLQl9CisgIGlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gR2V0SXRlcmF0b3IoKSkgeworICAgIHBJdGVyYXRvci0+U2V0QXQoMSk7CisgICAgcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpOworICB9CiAKLQlyZXR1cm4gd29yZC5Xb3JkOworICByZXR1cm4gd29yZC5Xb3JkOwogfQogCi1DRlhfV2lkZVN0cmluZyBDRlhfTGlzdEl0ZW06OkdldFRleHQoKSBjb25zdAotewotCWlmIChtX3BFZGl0KQotCQlyZXR1cm4gbV9wRWRpdC0+R2V0VGV4dCgpOworQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0xpc3RJdGVtOjpHZXRUZXh0KCkgY29uc3QgeworICBpZiAobV9wRWRpdCkKKyAgICByZXR1cm4gbV9wRWRpdC0+R2V0VGV4dCgpOwogCi0JcmV0dXJuIEwiIjsKKyAgcmV0dXJuIEwiIjsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9MaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9MaXN0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ0ZYX0xpc3Q6OkNGWF9MaXN0KCkgOiBtX2ZGb250U2l6ZSgwLjBmKSwgbV9wRm9udE1hcChOVUxMKSwgbV9iTXVsdGlwbGUoRkFMU0UpCi17Ci19CitDRlhfTGlzdDo6Q0ZYX0xpc3QoKQorICAgIDogbV9mRm9udFNpemUoMC4wZiksIG1fcEZvbnRNYXAoTlVMTCksIG1fYk11bHRpcGxlKEZBTFNFKSB7fQogCi1DRlhfTGlzdDo6fkNGWF9MaXN0KCkKLXsKLQlFbXB0eSgpOworQ0ZYX0xpc3Q6On5DRlhfTGlzdCgpIHsKKyAgRW1wdHkoKTsKIH0KIAotdm9pZCBDRlhfTGlzdDo6RW1wdHkoKQotewotCWZvciAoaW50MzJfdCBpPTAsc3o9bV9hTGlzdEl0ZW1zLkdldFNpemUoKTsgaTxzejsgaSsrKQotCQlkZWxldGUgbV9hTGlzdEl0ZW1zLkdldEF0KGkpOwordm9pZCBDRlhfTGlzdDo6RW1wdHkoKSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICBkZWxldGUgbV9hTGlzdEl0ZW1zLkdldEF0KGkpOwogCi0JbV9hTGlzdEl0ZW1zLlJlbW92ZUFsbCgpOworICBtX2FMaXN0SXRlbXMuUmVtb3ZlQWxsKCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3Q6OlNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwKQotewotCW1fcEZvbnRNYXAgPSBwRm9udE1hcDsKK3ZvaWQgQ0ZYX0xpc3Q6OlNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXApIHsKKyAgbV9wRm9udE1hcCA9IHBGb250TWFwOwogfQogCi12b2lkIENGWF9MaXN0OjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0JbV9mRm9udFNpemUgPSBmRm9udFNpemU7Cit2b2lkIENGWF9MaXN0OjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsKKyAgbV9mRm9udFNpemUgPSBmRm9udFNpemU7CiB9CiAKLXZvaWQgQ0ZYX0xpc3Q6OkFkZEl0ZW0oY29uc3QgRlhfV0NIQVIqIHN0cikKLXsKLQlpZiAoQ0ZYX0xpc3RJdGVtICogcExpc3RJdGVtID0gbmV3IENGWF9MaXN0SXRlbSgpKQotCXsKLQkJcExpc3RJdGVtLT5TZXRGb250TWFwKG1fcEZvbnRNYXApOwotCQlwTGlzdEl0ZW0tPlNldEZvbnRTaXplKG1fZkZvbnRTaXplKTsKLQkJcExpc3RJdGVtLT5TZXRUZXh0KHN0cik7Ci0JCW1fYUxpc3RJdGVtcy5BZGQocExpc3RJdGVtKTsKLQl9Cit2b2lkIENGWF9MaXN0OjpBZGRJdGVtKGNvbnN0IEZYX1dDSEFSKiBzdHIpIHsKKyAgaWYgKENGWF9MaXN0SXRlbSogcExpc3RJdGVtID0gbmV3IENGWF9MaXN0SXRlbSgpKSB7CisgICAgcExpc3RJdGVtLT5TZXRGb250TWFwKG1fcEZvbnRNYXApOworICAgIHBMaXN0SXRlbS0+U2V0Rm9udFNpemUobV9mRm9udFNpemUpOworICAgIHBMaXN0SXRlbS0+U2V0VGV4dChzdHIpOworICAgIG1fYUxpc3RJdGVtcy5BZGQocExpc3RJdGVtKTsKKyAgfQogfQogCi12b2lkIENGWF9MaXN0OjpSZUFycmFuZ2UoaW50MzJfdCBuSXRlbUluZGV4KQotewotCUZYX0ZMT0FUIGZQb3NZID0gMC4wZjsKK3ZvaWQgQ0ZYX0xpc3Q6OlJlQXJyYW5nZShpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgRlhfRkxPQVQgZlBvc1kgPSAwLjBmOwogCi0JaWYgKENGWF9MaXN0SXRlbSAqIHBQcmV2SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSXRlbUluZGV4IC0gMSkpCi0JCWZQb3NZID0gcFByZXZJdGVtLT5HZXRSZWN0KCkuYm90dG9tOworICBpZiAoQ0ZYX0xpc3RJdGVtKiBwUHJldkl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkl0ZW1JbmRleCAtIDEpKQorICAgIGZQb3NZID0gcFByZXZJdGVtLT5HZXRSZWN0KCkuYm90dG9tOwogCi0JZm9yIChpbnQzMl90IGk9bkl0ZW1JbmRleCxzej1tX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JewotCQlpZiAoQ0ZYX0xpc3RJdGVtICogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KGkpKQotCQl7Ci0JCQlGWF9GTE9BVCBmTGlzdEl0ZW1IZWlnaHQgPSBwTGlzdEl0ZW0tPkdldEl0ZW1IZWlnaHQoKTsKLQkJCXBMaXN0SXRlbS0+U2V0UmVjdChDTFNUX1JlY3QoMC4wZixmUG9zWSwwLjBmLGZQb3NZICsgZkxpc3RJdGVtSGVpZ2h0KSk7Ci0JCQlmUG9zWSArPSBmTGlzdEl0ZW1IZWlnaHQ7Ci0JCX0KLQl9CisgIGZvciAoaW50MzJfdCBpID0gbkl0ZW1JbmRleCwgc3ogPSBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChpKSkgeworICAgICAgRlhfRkxPQVQgZkxpc3RJdGVtSGVpZ2h0ID0gcExpc3RJdGVtLT5HZXRJdGVtSGVpZ2h0KCk7CisgICAgICBwTGlzdEl0ZW0tPlNldFJlY3QoQ0xTVF9SZWN0KDAuMGYsIGZQb3NZLCAwLjBmLCBmUG9zWSArIGZMaXN0SXRlbUhlaWdodCkpOworICAgICAgZlBvc1kgKz0gZkxpc3RJdGVtSGVpZ2h0OworICAgIH0KKyAgfQogCi0JU2V0Q29udGVudFJlY3QoQ0xTVF9SZWN0KDAuMGYsMC4wZiwwLjBmLGZQb3NZKSk7CisgIFNldENvbnRlbnRSZWN0KENMU1RfUmVjdCgwLjBmLCAwLjBmLCAwLjBmLCBmUG9zWSkpOwogfQogCi1JRlhfRWRpdCAqIENGWF9MaXN0OjpHZXRJdGVtRWRpdChpbnQzMl90IG5JbmRleCkgY29uc3QKLXsKLQlpZiAoQ0ZYX0xpc3RJdGVtICogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JbmRleCkpCi0JewotCQlyZXR1cm4gcExpc3RJdGVtLT5HZXRFZGl0KCk7Ci0JfQorSUZYX0VkaXQqIENGWF9MaXN0OjpHZXRJdGVtRWRpdChpbnQzMl90IG5JbmRleCkgY29uc3QgeworICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkluZGV4KSkgeworICAgIHJldHVybiBwTGlzdEl0ZW0tPkdldEVkaXQoKTsKKyAgfQogCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi1pbnQzMl90IENGWF9MaXN0OjpHZXRDb3VudCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fYUxpc3RJdGVtcy5HZXRTaXplKCk7CitpbnQzMl90IENGWF9MaXN0OjpHZXRDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYUxpc3RJdGVtcy5HZXRTaXplKCk7CiB9CiAKLUNQREZfUmVjdCBDRlhfTGlzdDo6R2V0UGxhdGVSZWN0KCkgY29uc3QKLXsKLQlyZXR1cm4gQ0ZYX0xpc3RDb250YWluZXI6OkdldFBsYXRlUmVjdCgpOworQ1BERl9SZWN0IENGWF9MaXN0OjpHZXRQbGF0ZVJlY3QoKSBjb25zdCB7CisgIHJldHVybiBDRlhfTGlzdENvbnRhaW5lcjo6R2V0UGxhdGVSZWN0KCk7CiB9CiAKLUNQREZfUmVjdCBDRlhfTGlzdDo6R2V0Q29udGVudFJlY3QoKSBjb25zdAotewotCXJldHVybiBJbm5lclRvT3V0ZXIoQ0ZYX0xpc3RDb250YWluZXI6OkdldENvbnRlbnRSZWN0KCkpOworQ1BERl9SZWN0IENGWF9MaXN0OjpHZXRDb250ZW50UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIElubmVyVG9PdXRlcihDRlhfTGlzdENvbnRhaW5lcjo6R2V0Q29udGVudFJlY3QoKSk7CiB9CiAKLUZYX0ZMT0FUIENGWF9MaXN0OjpHZXRGb250U2l6ZSgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fZkZvbnRTaXplOworRlhfRkxPQVQgQ0ZYX0xpc3Q6OkdldEZvbnRTaXplKCkgY29uc3QgeworICByZXR1cm4gbV9mRm9udFNpemU7CiB9CiAKLWludDMyX3QgQ0ZYX0xpc3Q6OkdldEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci17Ci0JQ1BERl9Qb2ludCBwdCA9IE91dGVyVG9Jbm5lcihwb2ludCk7CitpbnQzMl90IENGWF9MaXN0OjpHZXRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgQ1BERl9Qb2ludCBwdCA9IE91dGVyVG9Jbm5lcihwb2ludCk7CiAKLQlGWF9CT09MIGJGaXJzdCA9IFRSVUU7Ci0JRlhfQk9PTCBiTGFzdCA9IFRSVUU7CisgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsKKyAgRlhfQk9PTCBiTGFzdCA9IFRSVUU7CiAKLQlmb3IgKGludDMyX3QgaT0wLHN6PW1fYUxpc3RJdGVtcy5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQoaSkpCi0JCXsKLQkJCUNMU1RfUmVjdCByY0xpc3RJdGVtID0gcExpc3RJdGVtLT5HZXRSZWN0KCk7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChpKSkgeworICAgICAgQ0xTVF9SZWN0IHJjTGlzdEl0ZW0gPSBwTGlzdEl0ZW0tPkdldFJlY3QoKTsKIAotCQkJaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihwdC55LCByY0xpc3RJdGVtLnRvcCkpCi0JCQl7Ci0JCQkJYkZpcnN0ID0gRkFMU0U7Ci0JCQl9CisgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHB0LnksIHJjTGlzdEl0ZW0udG9wKSkgeworICAgICAgICBiRmlyc3QgPSBGQUxTRTsKKyAgICAgIH0KIAotCQkJaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIocHQueSwgcmNMaXN0SXRlbS5ib3R0b20pKQotCQkJewotCQkJCWJMYXN0ID0gRkFMU0U7Ci0JCQl9CisgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihwdC55LCByY0xpc3RJdGVtLmJvdHRvbSkpIHsKKyAgICAgICAgYkxhc3QgPSBGQUxTRTsKKyAgICAgIH0KIAotCQkJaWYgKHB0LnkgPj0gcmNMaXN0SXRlbS50b3AgJiYgcHQueSA8IHJjTGlzdEl0ZW0uYm90dG9tKQotCQkJewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JfQorICAgICAgaWYgKHB0LnkgPj0gcmNMaXN0SXRlbS50b3AgJiYgcHQueSA8IHJjTGlzdEl0ZW0uYm90dG9tKSB7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorICAgIH0KKyAgfQogCi0JaWYgKGJGaXJzdCkgcmV0dXJuIDA7Ci0JaWYgKGJMYXN0KSByZXR1cm4gbV9hTGlzdEl0ZW1zLkdldFNpemUoKS0xOworICBpZiAoYkZpcnN0KQorICAgIHJldHVybiAwOworICBpZiAoYkxhc3QpCisgICAgcmV0dXJuIG1fYUxpc3RJdGVtcy5HZXRTaXplKCkgLSAxOwogCi0JcmV0dXJuIC0xOworICByZXR1cm4gLTE7CiB9CiAKLUZYX0ZMT0FUIENGWF9MaXN0OjpHZXRGaXJzdEhlaWdodCgpIGNvbnN0Ci17Ci0JaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdCgwKSkKLQl7Ci0JCXJldHVybiBwTGlzdEl0ZW0tPkdldEl0ZW1IZWlnaHQoKTsKLQl9CitGWF9GTE9BVCBDRlhfTGlzdDo6R2V0Rmlyc3RIZWlnaHQoKSBjb25zdCB7CisgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdCgwKSkgeworICAgIHJldHVybiBwTGlzdEl0ZW0tPkdldEl0ZW1IZWlnaHQoKTsKKyAgfQogCi0JcmV0dXJuIDEuMGY7CisgIHJldHVybiAxLjBmOwogfQogCi1pbnQzMl90IENGWF9MaXN0OjpHZXRGaXJzdFNlbGVjdGVkKCkgY29uc3QKLXsKLQlmb3IgKGludDMyX3QgaT0wLHN6PW1fYUxpc3RJdGVtcy5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQoaSkpCi0JCXsKLQkJCWlmIChwTGlzdEl0ZW0tPklzU2VsZWN0ZWQoKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gLTE7CitpbnQzMl90IENGWF9MaXN0OjpHZXRGaXJzdFNlbGVjdGVkKCkgY29uc3QgeworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hTGlzdEl0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQoaSkpIHsKKyAgICAgIGlmIChwTGlzdEl0ZW0tPklzU2VsZWN0ZWQoKSkKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKIH0KIAotaW50MzJfdCBDRlhfTGlzdDo6R2V0TGFzdFNlbGVjdGVkKCkgY29uc3QKLXsKLQlmb3IgKGludDMyX3QgaT1tX2FMaXN0SXRlbXMuR2V0U2l6ZSgpLTE7IGk+PTA7IGktLSkKLQl7Ci0JCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQoaSkpCi0JCXsKLQkJCWlmIChwTGlzdEl0ZW0tPklzU2VsZWN0ZWQoKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gLTE7CitpbnQzMl90IENGWF9MaXN0OjpHZXRMYXN0U2VsZWN0ZWQoKSBjb25zdCB7CisgIGZvciAoaW50MzJfdCBpID0gbV9hTGlzdEl0ZW1zLkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKENGWF9MaXN0SXRlbSogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KGkpKSB7CisgICAgICBpZiAocExpc3RJdGVtLT5Jc1NlbGVjdGVkKCkpCisgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorICByZXR1cm4gLTE7CiB9CiAKLUZYX1dDSEFSIENGWF9MaXN0OjpUb3VwcGVyKEZYX1dDSEFSIGMpIGNvbnN0Ci17Ci0JaWYgKCAoYyA+PSAnYScpICYmIChjIDw9ICd6JykgKQotCQljID0gYyAtICgnYScgLSAnQScpOwotCXJldHVybiBjOworRlhfV0NIQVIgQ0ZYX0xpc3Q6OlRvdXBwZXIoRlhfV0NIQVIgYykgY29uc3QgeworICBpZiAoKGMgPj0gJ2EnKSAmJiAoYyA8PSAneicpKQorICAgIGMgPSBjIC0gKCdhJyAtICdBJyk7CisgIHJldHVybiBjOwogfQogCi1pbnQzMl90IENGWF9MaXN0OjpGaW5kTmV4dChpbnQzMl90IG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3QKLXsKLQlpbnQzMl90IG5DaXJjbGVJbmRleCA9IG5JbmRleDsKK2ludDMyX3QgQ0ZYX0xpc3Q6OkZpbmROZXh0KGludDMyX3QgbkluZGV4LCBGWF9XQ0hBUiBuQ2hhcikgY29uc3QgeworICBpbnQzMl90IG5DaXJjbGVJbmRleCA9IG5JbmRleDsKIAotCWZvciAoaW50MzJfdCBpPTAsc3o9bV9hTGlzdEl0ZW1zLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJbkNpcmNsZUluZGV4ICsrOwotCQlpZiAobkNpcmNsZUluZGV4ID49IHN6KSBuQ2lyY2xlSW5kZXggPSAwOworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hTGlzdEl0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBuQ2lyY2xlSW5kZXgrKzsKKyAgICBpZiAobkNpcmNsZUluZGV4ID49IHN6KQorICAgICAgbkNpcmNsZUluZGV4ID0gMDsKIAotCQlpZiAoQ0ZYX0xpc3RJdGVtICogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5DaXJjbGVJbmRleCkpCi0JCXsKLQkJCWlmIChUb3VwcGVyKHBMaXN0SXRlbS0+R2V0Rmlyc3RDaGFyKCkpID09IFRvdXBwZXIobkNoYXIpKQotCQkJCXJldHVybiBuQ2lyY2xlSW5kZXg7Ci0JCX0KLQl9CisgICAgaWYgKENGWF9MaXN0SXRlbSogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5DaXJjbGVJbmRleCkpIHsKKyAgICAgIGlmIChUb3VwcGVyKHBMaXN0SXRlbS0+R2V0Rmlyc3RDaGFyKCkpID09IFRvdXBwZXIobkNoYXIpKQorICAgICAgICByZXR1cm4gbkNpcmNsZUluZGV4OworICAgIH0KKyAgfQogCi0JcmV0dXJuIG5DaXJjbGVJbmRleDsKKyAgcmV0dXJuIG5DaXJjbGVJbmRleDsKIH0KIAotQ1BERl9SZWN0IENGWF9MaXN0OjpHZXRJdGVtUmVjdChpbnQzMl90IG5JbmRleCkgY29uc3QKLXsKLQlpZiAoQ0ZYX0xpc3RJdGVtICogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JbmRleCkpCi0JewotCQlDUERGX1JlY3QgcmNJdGVtID0gcExpc3RJdGVtLT5HZXRSZWN0KCk7Ci0JCXJjSXRlbS5sZWZ0ID0gMC4wZjsKLQkJcmNJdGVtLnJpZ2h0ID0gR2V0UGxhdGVSZWN0KCkuV2lkdGgoKTsKLQkJcmV0dXJuIElubmVyVG9PdXRlcihyY0l0ZW0pOwotCX0KK0NQREZfUmVjdCBDRlhfTGlzdDo6R2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsKKyAgaWYgKENGWF9MaXN0SXRlbSogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JbmRleCkpIHsKKyAgICBDUERGX1JlY3QgcmNJdGVtID0gcExpc3RJdGVtLT5HZXRSZWN0KCk7CisgICAgcmNJdGVtLmxlZnQgPSAwLjBmOworICAgIHJjSXRlbS5yaWdodCA9IEdldFBsYXRlUmVjdCgpLldpZHRoKCk7CisgICAgcmV0dXJuIElubmVyVG9PdXRlcihyY0l0ZW0pOworICB9CiAKLQlyZXR1cm4gQ1BERl9SZWN0KCk7CisgIHJldHVybiBDUERGX1JlY3QoKTsKIH0KIAotRlhfQk9PTCBDRlhfTGlzdDo6SXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0Ci17Ci0JaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSW5kZXgpKQotCXsKLQkJcmV0dXJuIHBMaXN0SXRlbS0+SXNTZWxlY3RlZCgpOwotCX0KK0ZYX0JPT0wgQ0ZYX0xpc3Q6OklzSXRlbVNlbGVjdGVkKGludDMyX3QgbkluZGV4KSBjb25zdCB7CisgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSW5kZXgpKSB7CisgICAgcmV0dXJuIHBMaXN0SXRlbS0+SXNTZWxlY3RlZCgpOworICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDRlhfTGlzdDo6U2V0SXRlbVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKQotewotCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkl0ZW1JbmRleCkpCi0JewotCQlwTGlzdEl0ZW0tPlNldFNlbGVjdChiU2VsZWN0ZWQpOwotCX0KK3ZvaWQgQ0ZYX0xpc3Q6OlNldEl0ZW1TZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCkgeworICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkl0ZW1JbmRleCkpIHsKKyAgICBwTGlzdEl0ZW0tPlNldFNlbGVjdChiU2VsZWN0ZWQpOworICB9CiB9CiAKLXZvaWQgQ0ZYX0xpc3Q6OlNldEl0ZW1DYXJldChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYkNhcmV0KQotewotCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkl0ZW1JbmRleCkpCi0JewotCQlwTGlzdEl0ZW0tPlNldENhcmV0KGJDYXJldCk7Ci0JfQordm9pZCBDRlhfTGlzdDo6U2V0SXRlbUNhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiQ2FyZXQpIHsKKyAgaWYgKENGWF9MaXN0SXRlbSogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JdGVtSW5kZXgpKSB7CisgICAgcExpc3RJdGVtLT5TZXRDYXJldChiQ2FyZXQpOworICB9CiB9CiAKLXZvaWQgQ0ZYX0xpc3Q6OlNldE11bHRpcGxlU2VsKEZYX0JPT0wgYk11bHRpcGxlKQotewotCW1fYk11bHRpcGxlID0gYk11bHRpcGxlOwordm9pZCBDRlhfTGlzdDo6U2V0TXVsdGlwbGVTZWwoRlhfQk9PTCBiTXVsdGlwbGUpIHsKKyAgbV9iTXVsdGlwbGUgPSBiTXVsdGlwbGU7CiB9CiAKLUZYX0JPT0wgQ0ZYX0xpc3Q6OklzTXVsdGlwbGVTZWwoKSBjb25zdAotewotCXJldHVybiBtX2JNdWx0aXBsZTsKK0ZYX0JPT0wgQ0ZYX0xpc3Q6OklzTXVsdGlwbGVTZWwoKSBjb25zdCB7CisgIHJldHVybiBtX2JNdWx0aXBsZTsKIH0KIAotRlhfQk9PTCBDRlhfTGlzdDo6SXNWYWxpZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0Ci17Ci0JcmV0dXJuIG5JdGVtSW5kZXggPj0gMCAmJiBuSXRlbUluZGV4IDwgbV9hTGlzdEl0ZW1zLkdldFNpemUoKTsKK0ZYX0JPT0wgQ0ZYX0xpc3Q6OklzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdCB7CisgIHJldHVybiBuSXRlbUluZGV4ID49IDAgJiYgbkl0ZW1JbmRleCA8IG1fYUxpc3RJdGVtcy5HZXRTaXplKCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENGWF9MaXN0OjpHZXRJdGVtVGV4dChpbnQzMl90IG5JbmRleCkgY29uc3QKLXsKLQlpZiAoQ0ZYX0xpc3RJdGVtICogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JbmRleCkpCi0JewotCQlyZXR1cm4gcExpc3RJdGVtLT5HZXRUZXh0KCk7Ci0JfQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0xpc3Q6OkdldEl0ZW1UZXh0KGludDMyX3QgbkluZGV4KSBjb25zdCB7CisgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSW5kZXgpKSB7CisgICAgcmV0dXJuIHBMaXN0SXRlbS0+R2V0VGV4dCgpOworICB9CiAKLQlyZXR1cm4gTCIiOworICByZXR1cm4gTCIiOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BMU1RfU2VsZWN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUExTVF9TZWxlY3QKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BMU1RfU2VsZWN0OjpDUExTVF9TZWxlY3QoKQotewotfQorQ1BMU1RfU2VsZWN0OjpDUExTVF9TZWxlY3QoKSB7fQogCi1DUExTVF9TZWxlY3Q6On5DUExTVF9TZWxlY3QoKQotewotCWZvciAoaW50MzJfdCBpPTAsc3o9bV9hSXRlbXMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCWRlbGV0ZSBtX2FJdGVtcy5HZXRBdChpKTsKK0NQTFNUX1NlbGVjdDo6fkNQTFNUX1NlbGVjdCgpIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUl0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgZGVsZXRlIG1fYUl0ZW1zLkdldEF0KGkpOwogCi0JbV9hSXRlbXMuUmVtb3ZlQWxsKCk7CisgIG1fYUl0ZW1zLlJlbW92ZUFsbCgpOwogfQogCi12b2lkIENQTFNUX1NlbGVjdDo6QWRkKGludDMyX3Qgbkl0ZW1JbmRleCkKLXsKLQlpbnQzMl90IG5JbmRleCA9IEZpbmQobkl0ZW1JbmRleCk7Cit2b2lkIENQTFNUX1NlbGVjdDo6QWRkKGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpbnQzMl90IG5JbmRleCA9IEZpbmQobkl0ZW1JbmRleCk7CiAKLQlpZiAobkluZGV4IDwgMCkKLQkJbV9hSXRlbXMuQWRkKG5ldyBDUExTVF9TZWxlY3RfSXRlbShuSXRlbUluZGV4LDEpKTsKLQllbHNlCi0JewotCQlpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0gKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KG5JbmRleCkpCi0JCXsKLQkJCXBJdGVtLT5uU3RhdGUgPSAxOwotCQl9Ci0JfQorICBpZiAobkluZGV4IDwgMCkKKyAgICBtX2FJdGVtcy5BZGQobmV3IENQTFNUX1NlbGVjdF9JdGVtKG5JdGVtSW5kZXgsIDEpKTsKKyAgZWxzZSB7CisgICAgaWYgKENQTFNUX1NlbGVjdF9JdGVtKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KG5JbmRleCkpIHsKKyAgICAgIHBJdGVtLT5uU3RhdGUgPSAxOworICAgIH0KKyAgfQogfQogCi12b2lkIENQTFNUX1NlbGVjdDo6QWRkKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KQotewotCWlmIChuQmVnaW5JbmRleCA+IG5FbmRJbmRleCkKLQl7Ci0JCWludDMyX3QgblRlbXAgPSBuRW5kSW5kZXg7Ci0JCW5FbmRJbmRleCA9IG5CZWdpbkluZGV4OwotCQluQmVnaW5JbmRleCA9IG5UZW1wOwotCX0KK3ZvaWQgQ1BMU1RfU2VsZWN0OjpBZGQoaW50MzJfdCBuQmVnaW5JbmRleCwgaW50MzJfdCBuRW5kSW5kZXgpIHsKKyAgaWYgKG5CZWdpbkluZGV4ID4gbkVuZEluZGV4KSB7CisgICAgaW50MzJfdCBuVGVtcCA9IG5FbmRJbmRleDsKKyAgICBuRW5kSW5kZXggPSBuQmVnaW5JbmRleDsKKyAgICBuQmVnaW5JbmRleCA9IG5UZW1wOworICB9CiAKLQlmb3IgKGludDMyX3QgaT1uQmVnaW5JbmRleDsgaTw9bkVuZEluZGV4OyBpKyspCUFkZChpKTsKKyAgZm9yIChpbnQzMl90IGkgPSBuQmVnaW5JbmRleDsgaSA8PSBuRW5kSW5kZXg7IGkrKykKKyAgICBBZGQoaSk7CiB9CiAKLXZvaWQgQ1BMU1RfU2VsZWN0OjpTdWIoaW50MzJfdCBuSXRlbUluZGV4KQotewotCWZvciAoaW50MzJfdCBpPW1fYUl0ZW1zLkdldFNpemUoKS0xOyBpPj0wOyBpLS0pCi0JewotCQlpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0gKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KGkpKQotCQkJaWYgKHBJdGVtLT5uSXRlbUluZGV4ID09IG5JdGVtSW5kZXgpCi0JCQkJcEl0ZW0tPm5TdGF0ZSA9IC0xOwotCX0KK3ZvaWQgQ1BMU1RfU2VsZWN0OjpTdWIoaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIGZvciAoaW50MzJfdCBpID0gbV9hSXRlbXMuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0qIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQoaSkpCisgICAgICBpZiAocEl0ZW0tPm5JdGVtSW5kZXggPT0gbkl0ZW1JbmRleCkKKyAgICAgICAgcEl0ZW0tPm5TdGF0ZSA9IC0xOworICB9CiB9CiAKLXZvaWQgQ1BMU1RfU2VsZWN0OjpTdWIoaW50MzJfdCBuQmVnaW5JbmRleCwgaW50MzJfdCBuRW5kSW5kZXgpCi17Ci0JaWYgKG5CZWdpbkluZGV4ID4gbkVuZEluZGV4KQotCXsKLQkJaW50MzJfdCBuVGVtcCA9IG5FbmRJbmRleDsKLQkJbkVuZEluZGV4ID0gbkJlZ2luSW5kZXg7Ci0JCW5CZWdpbkluZGV4ID0gblRlbXA7Ci0JfQordm9pZCBDUExTVF9TZWxlY3Q6OlN1YihpbnQzMl90IG5CZWdpbkluZGV4LCBpbnQzMl90IG5FbmRJbmRleCkgeworICBpZiAobkJlZ2luSW5kZXggPiBuRW5kSW5kZXgpIHsKKyAgICBpbnQzMl90IG5UZW1wID0gbkVuZEluZGV4OworICAgIG5FbmRJbmRleCA9IG5CZWdpbkluZGV4OworICAgIG5CZWdpbkluZGV4ID0gblRlbXA7CisgIH0KIAotCWZvciAoaW50MzJfdCBpPW5CZWdpbkluZGV4OyBpPD1uRW5kSW5kZXg7IGkrKykJU3ViKGkpOworICBmb3IgKGludDMyX3QgaSA9IG5CZWdpbkluZGV4OyBpIDw9IG5FbmRJbmRleDsgaSsrKQorICAgIFN1YihpKTsKIH0KIAotaW50MzJfdCBDUExTVF9TZWxlY3Q6OkZpbmQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAotewotCWZvciAoaW50MzJfdCBpPTAsc3o9bV9hSXRlbXMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JewotCQlpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0gKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KGkpKQotCQl7Ci0JCQlpZiAocEl0ZW0tPm5JdGVtSW5kZXggPT0gbkl0ZW1JbmRleCkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCX0KK2ludDMyX3QgQ1BMU1RfU2VsZWN0OjpGaW5kKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QgeworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hSXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDUExTVF9TZWxlY3RfSXRlbSogcEl0ZW0gPSBtX2FJdGVtcy5HZXRBdChpKSkgeworICAgICAgaWYgKHBJdGVtLT5uSXRlbUluZGV4ID09IG5JdGVtSW5kZXgpCisgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQogCi0JcmV0dXJuIC0xOworICByZXR1cm4gLTE7CiB9CiAKLUZYX0JPT0wgQ1BMU1RfU2VsZWN0OjpJc0V4aXN0KGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QKLXsKLQlyZXR1cm4gRmluZChuSXRlbUluZGV4KSA+PSAwOworRlhfQk9PTCBDUExTVF9TZWxlY3Q6OklzRXhpc3QoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdCB7CisgIHJldHVybiBGaW5kKG5JdGVtSW5kZXgpID49IDA7CiB9CiAKLWludDMyX3QgQ1BMU1RfU2VsZWN0OjpHZXRDb3VudCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fYUl0ZW1zLkdldFNpemUoKTsKK2ludDMyX3QgQ1BMU1RfU2VsZWN0OjpHZXRDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYUl0ZW1zLkdldFNpemUoKTsKIH0KIAotaW50MzJfdCBDUExTVF9TZWxlY3Q6OkdldEl0ZW1JbmRleChpbnQzMl90IG5JbmRleCkgY29uc3QKLXsKLQlpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9hSXRlbXMuR2V0U2l6ZSgpKQotCQlpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0gKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KG5JbmRleCkpCi0JCQlyZXR1cm4gcEl0ZW0tPm5JdGVtSW5kZXg7CitpbnQzMl90IENQTFNUX1NlbGVjdDo6R2V0SXRlbUluZGV4KGludDMyX3QgbkluZGV4KSBjb25zdCB7CisgIGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBtX2FJdGVtcy5HZXRTaXplKCkpCisgICAgaWYgKENQTFNUX1NlbGVjdF9JdGVtKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KG5JbmRleCkpCisgICAgICByZXR1cm4gcEl0ZW0tPm5JdGVtSW5kZXg7CiAKLQlyZXR1cm4gLTE7CisgIHJldHVybiAtMTsKIH0KIAotaW50MzJfdCBDUExTVF9TZWxlY3Q6OkdldFN0YXRlKGludDMyX3QgbkluZGV4KSBjb25zdAotewotCWlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBtX2FJdGVtcy5HZXRTaXplKCkpCi0JCWlmIChDUExTVF9TZWxlY3RfSXRlbSAqIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQobkluZGV4KSkKLQkJCXJldHVybiBwSXRlbS0+blN0YXRlOworaW50MzJfdCBDUExTVF9TZWxlY3Q6OkdldFN0YXRlKGludDMyX3QgbkluZGV4KSBjb25zdCB7CisgIGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBtX2FJdGVtcy5HZXRTaXplKCkpCisgICAgaWYgKENQTFNUX1NlbGVjdF9JdGVtKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KG5JbmRleCkpCisgICAgICByZXR1cm4gcEl0ZW0tPm5TdGF0ZTsKIAotCXJldHVybiAwOworICByZXR1cm4gMDsKIH0KIAotdm9pZCBDUExTVF9TZWxlY3Q6OkRlc2VsZWN0QWxsKCkKLXsKLQlmb3IgKGludDMyX3QgaT0wLHN6PW1fYUl0ZW1zLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENQTFNUX1NlbGVjdF9JdGVtICogcEl0ZW0gPSBtX2FJdGVtcy5HZXRBdChpKSkKLQkJewotCQkJcEl0ZW0tPm5TdGF0ZSA9IC0xOwotCQl9Ci0JfQordm9pZCBDUExTVF9TZWxlY3Q6OkRlc2VsZWN0QWxsKCkgeworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hSXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDUExTVF9TZWxlY3RfSXRlbSogcEl0ZW0gPSBtX2FJdGVtcy5HZXRBdChpKSkgeworICAgICAgcEl0ZW0tPm5TdGF0ZSA9IC0xOworICAgIH0KKyAgfQogfQogCi12b2lkIENQTFNUX1NlbGVjdDo6RG9uZSgpCi17Ci0JZm9yIChpbnQzMl90IGk9bV9hSXRlbXMuR2V0U2l6ZSgpLTE7IGk+PTA7IGktLSkKLQl7Ci0JCWlmIChDUExTVF9TZWxlY3RfSXRlbSAqIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQoaSkpCi0JCXsKLQkJCWlmIChwSXRlbS0+blN0YXRlID09IC0xKQotCQkJewotCQkJCWRlbGV0ZSBwSXRlbTsKLQkJCQltX2FJdGVtcy5SZW1vdmVBdChpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwSXRlbS0+blN0YXRlID0gMDsKLQkJCX0KLQkJfQotCX0KK3ZvaWQgQ1BMU1RfU2VsZWN0OjpEb25lKCkgeworICBmb3IgKGludDMyX3QgaSA9IG1fYUl0ZW1zLkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKENQTFNUX1NlbGVjdF9JdGVtKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KGkpKSB7CisgICAgICBpZiAocEl0ZW0tPm5TdGF0ZSA9PSAtMSkgeworICAgICAgICBkZWxldGUgcEl0ZW07CisgICAgICAgIG1fYUl0ZW1zLlJlbW92ZUF0KGkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcEl0ZW0tPm5TdGF0ZSA9IDA7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfTGlzdEN0cmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0xpc3RDdHJsCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ0ZYX0xpc3RDdHJsOjpDRlhfTGlzdEN0cmwoKSA6IG1fcE5vdGlmeShOVUxMKSwKLQltX2JOb3RpZnlGbGFnKEZBTFNFKSwKLQltX3B0U2Nyb2xsUG9zKDAuMGYsMC4wZiksCi0JbV9uU2VsSXRlbSgtMSksCi0JbV9uRm9vdEluZGV4KC0xKSwKLQltX2JDdHJsU2VsKEZBTFNFKSwKLQltX25DYXJldEluZGV4KC0xKQotewotfQorQ0ZYX0xpc3RDdHJsOjpDRlhfTGlzdEN0cmwoKQorICAgIDogbV9wTm90aWZ5KE5VTEwpLAorICAgICAgbV9iTm90aWZ5RmxhZyhGQUxTRSksCisgICAgICBtX3B0U2Nyb2xsUG9zKDAuMGYsIDAuMGYpLAorICAgICAgbV9uU2VsSXRlbSgtMSksCisgICAgICBtX25Gb290SW5kZXgoLTEpLAorICAgICAgbV9iQ3RybFNlbChGQUxTRSksCisgICAgICBtX25DYXJldEluZGV4KC0xKSB7fQogCi1DRlhfTGlzdEN0cmw6On5DRlhfTGlzdEN0cmwoKQotewotfQorQ0ZYX0xpc3RDdHJsOjp+Q0ZYX0xpc3RDdHJsKCkge30KIAotdm9pZCBDRlhfTGlzdEN0cmw6OlNldE5vdGlmeShJRlhfTGlzdF9Ob3RpZnkgKiBwTm90aWZ5KQotewotCW1fcE5vdGlmeSA9IHBOb3RpZnk7Cit2b2lkIENGWF9MaXN0Q3RybDo6U2V0Tm90aWZ5KElGWF9MaXN0X05vdGlmeSogcE5vdGlmeSkgeworICBtX3BOb3RpZnkgPSBwTm90aWZ5OwogfQogCi1DUERGX1BvaW50IENGWF9MaXN0Q3RybDo6SW5Ub091dChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci17Ci0JQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRQbGF0ZVJlY3QoKTsKK0NQREZfUG9pbnQgQ0ZYX0xpc3RDdHJsOjpJblRvT3V0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgIENQREZfUmVjdCByY1BsYXRlID0gR2V0UGxhdGVSZWN0KCk7CiAKLQlyZXR1cm4gQ1BERl9Qb2ludChwb2ludC54IC0gKG1fcHRTY3JvbGxQb3MueCAtIHJjUGxhdGUubGVmdCksCi0JCXBvaW50LnkgLSAobV9wdFNjcm9sbFBvcy55IC0gcmNQbGF0ZS50b3ApKTsKKyAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCAtIChtX3B0U2Nyb2xsUG9zLnggLSByY1BsYXRlLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICBwb2ludC55IC0gKG1fcHRTY3JvbGxQb3MueSAtIHJjUGxhdGUudG9wKSk7CiB9CiAKLUNQREZfUG9pbnQgQ0ZYX0xpc3RDdHJsOjpPdXRUb0luKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLQlDUERGX1JlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOworQ1BERl9Qb2ludCBDRlhfTGlzdEN0cmw6Ok91dFRvSW4oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRQbGF0ZVJlY3QoKTsKIAotCXJldHVybiBDUERGX1BvaW50KHBvaW50LnggKyAobV9wdFNjcm9sbFBvcy54IC0gcmNQbGF0ZS5sZWZ0KSwKLQkJcG9pbnQueSArIChtX3B0U2Nyb2xsUG9zLnkgLSByY1BsYXRlLnRvcCkpOworICByZXR1cm4gQ1BERl9Qb2ludChwb2ludC54ICsgKG1fcHRTY3JvbGxQb3MueCAtIHJjUGxhdGUubGVmdCksCisgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgKyAobV9wdFNjcm9sbFBvcy55IC0gcmNQbGF0ZS50b3ApKTsKIH0KIAotQ1BERl9SZWN0IENGWF9MaXN0Q3RybDo6SW5Ub091dChjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdAotewotCUNQREZfUG9pbnQgcHRMZWZ0Qm90dG9tID0gSW5Ub091dChDUERGX1BvaW50KHJlY3QubGVmdCxyZWN0LmJvdHRvbSkpOwotCUNQREZfUG9pbnQgcHRSaWdodFRvcCA9IEluVG9PdXQoQ1BERl9Qb2ludChyZWN0LnJpZ2h0LHJlY3QudG9wKSk7CitDUERGX1JlY3QgQ0ZYX0xpc3RDdHJsOjpJblRvT3V0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICBDUERGX1BvaW50IHB0TGVmdEJvdHRvbSA9IEluVG9PdXQoQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QuYm90dG9tKSk7CisgIENQREZfUG9pbnQgcHRSaWdodFRvcCA9IEluVG9PdXQoQ1BERl9Qb2ludChyZWN0LnJpZ2h0LCByZWN0LnRvcCkpOwogCi0JcmV0dXJuIENQREZfUmVjdChwdExlZnRCb3R0b20ueCxwdExlZnRCb3R0b20ueSxwdFJpZ2h0VG9wLngscHRSaWdodFRvcC55KTsKKyAgcmV0dXJuIENQREZfUmVjdChwdExlZnRCb3R0b20ueCwgcHRMZWZ0Qm90dG9tLnksIHB0UmlnaHRUb3AueCwgcHRSaWdodFRvcC55KTsKIH0KIAotQ1BERl9SZWN0IENGWF9MaXN0Q3RybDo6T3V0VG9Jbihjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdAotewotCUNQREZfUG9pbnQgcHRMZWZ0Qm90dG9tID0gT3V0VG9JbihDUERGX1BvaW50KHJlY3QubGVmdCxyZWN0LmJvdHRvbSkpOwotCUNQREZfUG9pbnQgcHRSaWdodFRvcCA9IE91dFRvSW4oQ1BERl9Qb2ludChyZWN0LnJpZ2h0LHJlY3QudG9wKSk7CitDUERGX1JlY3QgQ0ZYX0xpc3RDdHJsOjpPdXRUb0luKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICBDUERGX1BvaW50IHB0TGVmdEJvdHRvbSA9IE91dFRvSW4oQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QuYm90dG9tKSk7CisgIENQREZfUG9pbnQgcHRSaWdodFRvcCA9IE91dFRvSW4oQ1BERl9Qb2ludChyZWN0LnJpZ2h0LCByZWN0LnRvcCkpOwogCi0JcmV0dXJuIENQREZfUmVjdChwdExlZnRCb3R0b20ueCxwdExlZnRCb3R0b20ueSxwdFJpZ2h0VG9wLngscHRSaWdodFRvcC55KTsKKyAgcmV0dXJuIENQREZfUmVjdChwdExlZnRCb3R0b20ueCwgcHRMZWZ0Qm90dG9tLnksIHB0UmlnaHRUb3AueCwgcHRSaWdodFRvcC55KTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQotewotCWludDMyX3QgbkhpdEluZGV4ID0gR2V0SXRlbUluZGV4KHBvaW50KTsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDdHJsKSB7CisgIGludDMyX3QgbkhpdEluZGV4ID0gR2V0SXRlbUluZGV4KHBvaW50KTsKIAotCWlmIChJc011bHRpcGxlU2VsKCkpCi0JewotCQlpZiAoYkN0cmwpCi0JCXsKLQkJCWlmIChJc0l0ZW1TZWxlY3RlZChuSGl0SW5kZXgpKQotCQkJewotCQkJCW1fYVNlbEl0ZW1zLlN1YihuSGl0SW5kZXgpOwotCQkJCVNlbGVjdEl0ZW1zKCk7Ci0JCQkJbV9iQ3RybFNlbCA9IEZBTFNFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCW1fYVNlbEl0ZW1zLkFkZChuSGl0SW5kZXgpOwotCQkJCVNlbGVjdEl0ZW1zKCk7Ci0JCQkJbV9iQ3RybFNlbCA9IFRSVUU7Ci0JCQl9CisgIGlmIChJc011bHRpcGxlU2VsKCkpIHsKKyAgICBpZiAoYkN0cmwpIHsKKyAgICAgIGlmIChJc0l0ZW1TZWxlY3RlZChuSGl0SW5kZXgpKSB7CisgICAgICAgIG1fYVNlbEl0ZW1zLlN1YihuSGl0SW5kZXgpOworICAgICAgICBTZWxlY3RJdGVtcygpOworICAgICAgICBtX2JDdHJsU2VsID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX2FTZWxJdGVtcy5BZGQobkhpdEluZGV4KTsKKyAgICAgICAgU2VsZWN0SXRlbXMoKTsKKyAgICAgICAgbV9iQ3RybFNlbCA9IFRSVUU7CisgICAgICB9CiAKLQkJCW1fbkZvb3RJbmRleCA9IG5IaXRJbmRleDsKLQkJfQotCQllbHNlIGlmIChiU2hpZnQpCi0JCXsKLQkJCW1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7Ci0JCQltX2FTZWxJdGVtcy5BZGQobV9uRm9vdEluZGV4LG5IaXRJbmRleCk7Ci0JCQlTZWxlY3RJdGVtcygpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbV9hU2VsSXRlbXMuRGVzZWxlY3RBbGwoKTsKLQkJCW1fYVNlbEl0ZW1zLkFkZChuSGl0SW5kZXgpOwotCQkJU2VsZWN0SXRlbXMoKTsKKyAgICAgIG1fbkZvb3RJbmRleCA9IG5IaXRJbmRleDsKKyAgICB9IGVsc2UgaWYgKGJTaGlmdCkgeworICAgICAgbV9hU2VsSXRlbXMuRGVzZWxlY3RBbGwoKTsKKyAgICAgIG1fYVNlbEl0ZW1zLkFkZChtX25Gb290SW5kZXgsIG5IaXRJbmRleCk7CisgICAgICBTZWxlY3RJdGVtcygpOworICAgIH0gZWxzZSB7CisgICAgICBtX2FTZWxJdGVtcy5EZXNlbGVjdEFsbCgpOworICAgICAgbV9hU2VsSXRlbXMuQWRkKG5IaXRJbmRleCk7CisgICAgICBTZWxlY3RJdGVtcygpOwogCi0JCQltX25Gb290SW5kZXggPSBuSGl0SW5kZXg7Ci0JCX0KKyAgICAgIG1fbkZvb3RJbmRleCA9IG5IaXRJbmRleDsKKyAgICB9CiAKLQkJU2V0Q2FyZXQobkhpdEluZGV4KTsKLQl9Ci0JZWxzZQotCXsKLQkJU2V0U2luZ2xlU2VsZWN0KG5IaXRJbmRleCk7Ci0JfQorICAgIFNldENhcmV0KG5IaXRJbmRleCk7CisgIH0gZWxzZSB7CisgICAgU2V0U2luZ2xlU2VsZWN0KG5IaXRJbmRleCk7CisgIH0KIAotCWlmICghSXNJdGVtVmlzaWJsZShuSGl0SW5kZXgpKQotCQlTY3JvbGxUb0xpc3RJdGVtKG5IaXRJbmRleCk7CisgIGlmICghSXNJdGVtVmlzaWJsZShuSGl0SW5kZXgpKQorICAgIFNjcm9sbFRvTGlzdEl0ZW0obkhpdEluZGV4KTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQotewotCWludDMyX3QgbkhpdEluZGV4ID0gR2V0SXRlbUluZGV4KHBvaW50KTsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDdHJsKSB7CisgIGludDMyX3QgbkhpdEluZGV4ID0gR2V0SXRlbUluZGV4KHBvaW50KTsKIAotCWlmIChJc011bHRpcGxlU2VsKCkpCi0JewotCQlpZiAoYkN0cmwpCi0JCXsKLQkJCWlmIChtX2JDdHJsU2VsKQotCQkJCW1fYVNlbEl0ZW1zLkFkZChtX25Gb290SW5kZXgsbkhpdEluZGV4KTsKLQkJCWVsc2UKLQkJCQltX2FTZWxJdGVtcy5TdWIobV9uRm9vdEluZGV4LG5IaXRJbmRleCk7CisgIGlmIChJc011bHRpcGxlU2VsKCkpIHsKKyAgICBpZiAoYkN0cmwpIHsKKyAgICAgIGlmIChtX2JDdHJsU2VsKQorICAgICAgICBtX2FTZWxJdGVtcy5BZGQobV9uRm9vdEluZGV4LCBuSGl0SW5kZXgpOworICAgICAgZWxzZQorICAgICAgICBtX2FTZWxJdGVtcy5TdWIobV9uRm9vdEluZGV4LCBuSGl0SW5kZXgpOwogCi0JCQlTZWxlY3RJdGVtcygpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbV9hU2VsSXRlbXMuRGVzZWxlY3RBbGwoKTsKLQkJCW1fYVNlbEl0ZW1zLkFkZChtX25Gb290SW5kZXgsbkhpdEluZGV4KTsKLQkJCVNlbGVjdEl0ZW1zKCk7Ci0JCX0KKyAgICAgIFNlbGVjdEl0ZW1zKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7CisgICAgICBtX2FTZWxJdGVtcy5BZGQobV9uRm9vdEluZGV4LCBuSGl0SW5kZXgpOworICAgICAgU2VsZWN0SXRlbXMoKTsKKyAgICB9CiAKLQkJU2V0Q2FyZXQobkhpdEluZGV4KTsKLQl9Ci0JZWxzZQotCXsKLQkJU2V0U2luZ2xlU2VsZWN0KG5IaXRJbmRleCk7Ci0JfQorICAgIFNldENhcmV0KG5IaXRJbmRleCk7CisgIH0gZWxzZSB7CisgICAgU2V0U2luZ2xlU2VsZWN0KG5IaXRJbmRleCk7CisgIH0KIAotCWlmICghSXNJdGVtVmlzaWJsZShuSGl0SW5kZXgpKQotCQlTY3JvbGxUb0xpc3RJdGVtKG5IaXRJbmRleCk7CisgIGlmICghSXNJdGVtVmlzaWJsZShuSGl0SW5kZXgpKQorICAgIFNjcm9sbFRvTGlzdEl0ZW0obkhpdEluZGV4KTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVksoaW50MzJfdCBuSXRlbUluZGV4LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCi17Ci0JaWYgKElzTXVsdGlwbGVTZWwoKSkKLQl7Ci0JCWlmIChuSXRlbUluZGV4ID49IDAgJiYgbkl0ZW1JbmRleCA8IEdldENvdW50KCkpCi0JCXsKLQkJCWlmIChiQ3RybCkKLQkJCXsKLQkJCX0KLQkJCWVsc2UgaWYgKGJTaGlmdCkKLQkJCXsKLQkJCQltX2FTZWxJdGVtcy5EZXNlbGVjdEFsbCgpOwotCQkJCW1fYVNlbEl0ZW1zLkFkZChtX25Gb290SW5kZXgsbkl0ZW1JbmRleCk7Ci0JCQkJU2VsZWN0SXRlbXMoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQltX2FTZWxJdGVtcy5EZXNlbGVjdEFsbCgpOwotCQkJCW1fYVNlbEl0ZW1zLkFkZChuSXRlbUluZGV4KTsKLQkJCQlTZWxlY3RJdGVtcygpOwotCQkJCW1fbkZvb3RJbmRleCA9IG5JdGVtSW5kZXg7Ci0JCQl9Cit2b2lkIENGWF9MaXN0Q3RybDo6T25WSyhpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSB7CisgIGlmIChJc011bHRpcGxlU2VsKCkpIHsKKyAgICBpZiAobkl0ZW1JbmRleCA+PSAwICYmIG5JdGVtSW5kZXggPCBHZXRDb3VudCgpKSB7CisgICAgICBpZiAoYkN0cmwpIHsKKyAgICAgIH0gZWxzZSBpZiAoYlNoaWZ0KSB7CisgICAgICAgIG1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7CisgICAgICAgIG1fYVNlbEl0ZW1zLkFkZChtX25Gb290SW5kZXgsIG5JdGVtSW5kZXgpOworICAgICAgICBTZWxlY3RJdGVtcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9hU2VsSXRlbXMuRGVzZWxlY3RBbGwoKTsKKyAgICAgICAgbV9hU2VsSXRlbXMuQWRkKG5JdGVtSW5kZXgpOworICAgICAgICBTZWxlY3RJdGVtcygpOworICAgICAgICBtX25Gb290SW5kZXggPSBuSXRlbUluZGV4OworICAgICAgfQogCi0JCQlTZXRDYXJldChuSXRlbUluZGV4KTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlTZXRTaW5nbGVTZWxlY3Qobkl0ZW1JbmRleCk7Ci0JfQorICAgICAgU2V0Q2FyZXQobkl0ZW1JbmRleCk7CisgICAgfQorICB9IGVsc2UgeworICAgIFNldFNpbmdsZVNlbGVjdChuSXRlbUluZGV4KTsKKyAgfQogCi0JaWYgKCFJc0l0ZW1WaXNpYmxlKG5JdGVtSW5kZXgpKQotCQlTY3JvbGxUb0xpc3RJdGVtKG5JdGVtSW5kZXgpOworICBpZiAoIUlzSXRlbVZpc2libGUobkl0ZW1JbmRleCkpCisgICAgU2Nyb2xsVG9MaXN0SXRlbShuSXRlbUluZGV4KTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfVVAoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlPblZLKElzTXVsdGlwbGVTZWwoKSA/IEdldENhcmV0KCktMSA6IEdldFNlbGVjdCgpLTEsIGJTaGlmdCwgYkN0cmwpOwordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfVVAoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgT25WSyhJc011bHRpcGxlU2VsKCkgPyBHZXRDYXJldCgpIC0gMSA6IEdldFNlbGVjdCgpIC0gMSwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlPblZLKElzTXVsdGlwbGVTZWwoKSA/IEdldENhcmV0KCkrMSA6IEdldFNlbGVjdCgpKzEsIGJTaGlmdCwgYkN0cmwpOwordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfRE9XTihGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgeworICBPblZLKElzTXVsdGlwbGVTZWwoKSA/IEdldENhcmV0KCkgKyAxIDogR2V0U2VsZWN0KCkgKyAxLCBiU2hpZnQsIGJDdHJsKTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfTEVGVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQotewotCU9uVksoMCwgYlNoaWZ0LCBiQ3RybCk7Cit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSB7CisgIE9uVksoMCwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCi17Ci0JT25WSyhHZXRDb3VudCgpLTEsIGJTaGlmdCwgYkN0cmwpOwordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgT25WSyhHZXRDb3VudCgpIC0gMSwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlPblZLKDAsIGJTaGlmdCwgYkN0cmwpOwordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfSE9NRShGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgeworICBPblZLKDAsIGJTaGlmdCwgYkN0cmwpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6T25WS19FTkQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlPblZLKEdldENvdW50KCktMSwgYlNoaWZ0LCBiQ3RybCk7Cit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19FTkQoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgT25WSyhHZXRDb3VudCgpIC0gMSwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLUZYX0JPT0wJQ0ZYX0xpc3RDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhcixGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQotewotCWludDMyX3QgbkluZGV4ID0gR2V0TGFzdFNlbGVjdGVkKCk7Ci0JaW50MzJfdCBuRmluZEluZGV4ID0gRmluZE5leHQobkluZGV4LG5DaGFyKTsKK0ZYX0JPT0wgQ0ZYX0xpc3RDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgaW50MzJfdCBuSW5kZXggPSBHZXRMYXN0U2VsZWN0ZWQoKTsKKyAgaW50MzJfdCBuRmluZEluZGV4ID0gRmluZE5leHQobkluZGV4LCBuQ2hhcik7CiAKLQlpZiAobkZpbmRJbmRleCAhPSBuSW5kZXgpCi0JewotCQlPblZLKG5GaW5kSW5kZXgsIGJTaGlmdCwgYkN0cmwpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworICBpZiAobkZpbmRJbmRleCAhPSBuSW5kZXgpIHsKKyAgICBPblZLKG5GaW5kSW5kZXgsIGJTaGlmdCwgYkN0cmwpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAogLyogLS0tLS0tLS0gaW5uZXIgbWV0aG9kcyAtLS0tLS0tICovCiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLXsKLQlDRlhfTGlzdENvbnRhaW5lcjo6U2V0UGxhdGVSZWN0KHJlY3QpOwotCW1fcHRTY3JvbGxQb3MueCA9IHJlY3QubGVmdDsKLQlTZXRTY3JvbGxQb3MoQ1BERl9Qb2ludChyZWN0LmxlZnQscmVjdC50b3ApKTsKLQlSZUFycmFuZ2UoMCk7Ci0JSW52YWxpZGF0ZUl0ZW0oLTEpOwordm9pZCBDRlhfTGlzdEN0cmw6OlNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsKKyAgQ0ZYX0xpc3RDb250YWluZXI6OlNldFBsYXRlUmVjdChyZWN0KTsKKyAgbV9wdFNjcm9sbFBvcy54ID0gcmVjdC5sZWZ0OworICBTZXRTY3JvbGxQb3MoQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSk7CisgIFJlQXJyYW5nZSgwKTsKKyAgSW52YWxpZGF0ZUl0ZW0oLTEpOwogfQogCi1DUERGX1JlY3QgQ0ZYX0xpc3RDdHJsOjpHZXRJdGVtUmVjdChpbnQzMl90IG5JbmRleCkgY29uc3QKLXsKLQlyZXR1cm4gSW5Ub091dChDRlhfTGlzdDo6R2V0SXRlbVJlY3QobkluZGV4KSk7CitDUERGX1JlY3QgQ0ZYX0xpc3RDdHJsOjpHZXRJdGVtUmVjdChpbnQzMl90IG5JbmRleCkgY29uc3QgeworICByZXR1cm4gSW5Ub091dChDRlhfTGlzdDo6R2V0SXRlbVJlY3QobkluZGV4KSk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZykKLXsKLQlBZGRJdGVtKHN0cmluZyk7Ci0JUmVBcnJhbmdlKEdldENvdW50KCkgLSAxKTsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZykgeworICBBZGRJdGVtKHN0cmluZyk7CisgIFJlQXJyYW5nZShHZXRDb3VudCgpIC0gMSk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRNdWx0aXBsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKQotewotCWlmICghSXNWYWxpZChuSXRlbUluZGV4KSkgcmV0dXJuOwordm9pZCBDRlhfTGlzdEN0cmw6OlNldE11bHRpcGxlU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpIHsKKyAgaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKQorICAgIHJldHVybjsKIAotCWlmIChiU2VsZWN0ZWQgIT0gSXNJdGVtU2VsZWN0ZWQobkl0ZW1JbmRleCkpCi0JewotCQlpZiAoYlNlbGVjdGVkKQotCQl7Ci0JCQlTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsVFJVRSk7Ci0JCQlJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCxGQUxTRSk7Ci0JCQlJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKLQkJfQotCX0KKyAgaWYgKGJTZWxlY3RlZCAhPSBJc0l0ZW1TZWxlY3RlZChuSXRlbUluZGV4KSkgeworICAgIGlmIChiU2VsZWN0ZWQpIHsKKyAgICAgIFNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCwgVFJVRSk7CisgICAgICBJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LCBGQUxTRSk7CisgICAgICBJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6OlNldFNpbmdsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpCi17Ci0JaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKSByZXR1cm47Cit2b2lkIENGWF9MaXN0Q3RybDo6U2V0U2luZ2xlU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpCisgICAgcmV0dXJuOwogCi0JaWYgKG1fblNlbEl0ZW0gIT0gbkl0ZW1JbmRleCkKLQl7Ci0JCWlmIChtX25TZWxJdGVtID49IDApCi0JCXsKLQkJCVNldEl0ZW1TZWxlY3QobV9uU2VsSXRlbSxGQUxTRSk7Ci0JCQlJbnZhbGlkYXRlSXRlbShtX25TZWxJdGVtKTsKLQkJfQorICBpZiAobV9uU2VsSXRlbSAhPSBuSXRlbUluZGV4KSB7CisgICAgaWYgKG1fblNlbEl0ZW0gPj0gMCkgeworICAgICAgU2V0SXRlbVNlbGVjdChtX25TZWxJdGVtLCBGQUxTRSk7CisgICAgICBJbnZhbGlkYXRlSXRlbShtX25TZWxJdGVtKTsKKyAgICB9CiAKLQkJU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LFRSVUUpOwotCQlJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKLQkJbV9uU2VsSXRlbSA9IG5JdGVtSW5kZXg7Ci0JfQorICAgIFNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCwgVFJVRSk7CisgICAgSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7CisgICAgbV9uU2VsSXRlbSA9IG5JdGVtSW5kZXg7CisgIH0KIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6OlNldENhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCkKLXsKLQlpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpIHJldHVybjsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRDYXJldChpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKQorICAgIHJldHVybjsKIAotCWlmIChJc011bHRpcGxlU2VsKCkpCi0JewotCQlpbnQzMl90IG5PbGRJbmRleCA9IG1fbkNhcmV0SW5kZXg7CisgIGlmIChJc011bHRpcGxlU2VsKCkpIHsKKyAgICBpbnQzMl90IG5PbGRJbmRleCA9IG1fbkNhcmV0SW5kZXg7CiAKLQkJaWYgKG5PbGRJbmRleCAhPSBuSXRlbUluZGV4KQotCQl7Ci0JCQltX25DYXJldEluZGV4ID0gbkl0ZW1JbmRleDsKKyAgICBpZiAobk9sZEluZGV4ICE9IG5JdGVtSW5kZXgpIHsKKyAgICAgIG1fbkNhcmV0SW5kZXggPSBuSXRlbUluZGV4OwogCi0JCQlTZXRJdGVtQ2FyZXQobk9sZEluZGV4LCBGQUxTRSk7Ci0JCQlTZXRJdGVtQ2FyZXQobkl0ZW1JbmRleCxUUlVFKTsKKyAgICAgIFNldEl0ZW1DYXJldChuT2xkSW5kZXgsIEZBTFNFKTsKKyAgICAgIFNldEl0ZW1DYXJldChuSXRlbUluZGV4LCBUUlVFKTsKIAotCQkJSW52YWxpZGF0ZUl0ZW0obk9sZEluZGV4KTsKLQkJCUludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOwotCQl9Ci0JfQorICAgICAgSW52YWxpZGF0ZUl0ZW0obk9sZEluZGV4KTsKKyAgICAgIEludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOworICAgIH0KKyAgfQogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6SW52YWxpZGF0ZUl0ZW0oaW50MzJfdCBuSXRlbUluZGV4KQotewotCWlmIChtX3BOb3RpZnkpCi0JewotCQlpZiAobkl0ZW1JbmRleCA9PSAtMSkKLQkJewotCQkJaWYgKCFtX2JOb3RpZnlGbGFnKQotCQkJewotCQkJCW1fYk5vdGlmeUZsYWcgPSBUUlVFOwotCQkJCUNQREZfUmVjdCByY1JlZnJlc2ggPSBHZXRQbGF0ZVJlY3QoKTsKLQkJCQltX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOwotCQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICghbV9iTm90aWZ5RmxhZykKLQkJCXsKLQkJCQltX2JOb3RpZnlGbGFnID0gVFJVRTsKLQkJCQlDUERGX1JlY3QgcmNSZWZyZXNoID0gR2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7Ci0JCQkJcmNSZWZyZXNoLmxlZnQgLT0gMS4wZjsKLQkJCQlyY1JlZnJlc2gucmlnaHQgKz0gMS4wZjsKLQkJCQlyY1JlZnJlc2guYm90dG9tIC09IDEuMGY7Ci0JCQkJcmNSZWZyZXNoLnRvcCArPSAxLjBmOwordm9pZCBDRlhfTGlzdEN0cmw6OkludmFsaWRhdGVJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAobV9wTm90aWZ5KSB7CisgICAgaWYgKG5JdGVtSW5kZXggPT0gLTEpIHsKKyAgICAgIGlmICghbV9iTm90aWZ5RmxhZykgeworICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgQ1BERl9SZWN0IHJjUmVmcmVzaCA9IEdldFBsYXRlUmVjdCgpOworICAgICAgICBtX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOworICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghbV9iTm90aWZ5RmxhZykgeworICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgQ1BERl9SZWN0IHJjUmVmcmVzaCA9IEdldEl0ZW1SZWN0KG5JdGVtSW5kZXgpOworICAgICAgICByY1JlZnJlc2gubGVmdCAtPSAxLjBmOworICAgICAgICByY1JlZnJlc2gucmlnaHQgKz0gMS4wZjsKKyAgICAgICAgcmNSZWZyZXNoLmJvdHRvbSAtPSAxLjBmOworICAgICAgICByY1JlZnJlc2gudG9wICs9IDEuMGY7CiAKLQkJCQltX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOwotCQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKKyAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6U2VsZWN0SXRlbXMoKQotewotCWZvciAoaW50MzJfdCBpPTAsc3o9bV9hU2VsSXRlbXMuR2V0Q291bnQoKTsgaTxzejsgaSsrKQotCXsKLQkJaW50MzJfdCBuSXRlbUluZGV4ID0gbV9hU2VsSXRlbXMuR2V0SXRlbUluZGV4KGkpOwotCQlpbnQzMl90IG5TdGF0ZSA9IG1fYVNlbEl0ZW1zLkdldFN0YXRlKGkpOwordm9pZCBDRlhfTGlzdEN0cmw6OlNlbGVjdEl0ZW1zKCkgeworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hU2VsSXRlbXMuR2V0Q291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpbnQzMl90IG5JdGVtSW5kZXggPSBtX2FTZWxJdGVtcy5HZXRJdGVtSW5kZXgoaSk7CisgICAgaW50MzJfdCBuU3RhdGUgPSBtX2FTZWxJdGVtcy5HZXRTdGF0ZShpKTsKIAotCQlzd2l0Y2goblN0YXRlKQotCQl7Ci0JCWNhc2UgMToKLQkJCVNldE11bHRpcGxlU2VsZWN0KG5JdGVtSW5kZXgsIFRSVUUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgLTE6Ci0JCQlTZXRNdWx0aXBsZVNlbGVjdChuSXRlbUluZGV4LCBGQUxTRSk7Ci0JCQlicmVhazsKLQkJfQotCX0KKyAgICBzd2l0Y2ggKG5TdGF0ZSkgeworICAgICAgY2FzZSAxOgorICAgICAgICBTZXRNdWx0aXBsZVNlbGVjdChuSXRlbUluZGV4LCBUUlVFKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIC0xOgorICAgICAgICBTZXRNdWx0aXBsZVNlbGVjdChuSXRlbUluZGV4LCBGQUxTRSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQogCi0JbV9hU2VsSXRlbXMuRG9uZSgpOworICBtX2FTZWxJdGVtcy5Eb25lKCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KQotewotCWlmICghSXNWYWxpZChuSXRlbUluZGV4KSkgcmV0dXJuOwordm9pZCBDRlhfTGlzdEN0cmw6OlNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKQorICAgIHJldHVybjsKIAotCWlmIChJc011bHRpcGxlU2VsKCkpCi0JewotCQltX2FTZWxJdGVtcy5BZGQobkl0ZW1JbmRleCk7Ci0JCVNlbGVjdEl0ZW1zKCk7Ci0JfQotCWVsc2UKLQkJU2V0U2luZ2xlU2VsZWN0KG5JdGVtSW5kZXgpOworICBpZiAoSXNNdWx0aXBsZVNlbCgpKSB7CisgICAgbV9hU2VsSXRlbXMuQWRkKG5JdGVtSW5kZXgpOworICAgIFNlbGVjdEl0ZW1zKCk7CisgIH0gZWxzZQorICAgIFNldFNpbmdsZVNlbGVjdChuSXRlbUluZGV4KTsKIH0KIAotRlhfQk9PTAlDRlhfTGlzdEN0cmw6OklzSXRlbVZpc2libGUoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAotewotCUNQREZfUmVjdCByY1BsYXRlID0gR2V0UGxhdGVSZWN0KCk7Ci0JQ1BERl9SZWN0IHJjSXRlbSA9IEdldEl0ZW1SZWN0KG5JdGVtSW5kZXgpOworRlhfQk9PTCBDRlhfTGlzdEN0cmw6OklzSXRlbVZpc2libGUoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdCB7CisgIENQREZfUmVjdCByY1BsYXRlID0gR2V0UGxhdGVSZWN0KCk7CisgIENQREZfUmVjdCByY0l0ZW0gPSBHZXRJdGVtUmVjdChuSXRlbUluZGV4KTsKIAotCXJldHVybiByY0l0ZW0uYm90dG9tID49IHJjUGxhdGUuYm90dG9tICYmIHJjSXRlbS50b3AgPD0gcmNQbGF0ZS50b3A7CisgIHJldHVybiByY0l0ZW0uYm90dG9tID49IHJjUGxhdGUuYm90dG9tICYmIHJjSXRlbS50b3AgPD0gcmNQbGF0ZS50b3A7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTY3JvbGxUb0xpc3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCkKLXsKLQlpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpIHJldHVybjsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpTY3JvbGxUb0xpc3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpCisgICAgcmV0dXJuOwogCi0JQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRQbGF0ZVJlY3QoKTsKLQlDUERGX1JlY3QgcmNJdGVtID0gQ0ZYX0xpc3Q6OkdldEl0ZW1SZWN0KG5JdGVtSW5kZXgpOwotCUNQREZfUmVjdCByY0l0ZW1DdHJsID0gR2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7CisgIENQREZfUmVjdCByY1BsYXRlID0gR2V0UGxhdGVSZWN0KCk7CisgIENQREZfUmVjdCByY0l0ZW0gPSBDRlhfTGlzdDo6R2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7CisgIENQREZfUmVjdCByY0l0ZW1DdHJsID0gR2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7CiAKLQlpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihyY0l0ZW1DdHJsLmJvdHRvbSwgcmNQbGF0ZS5ib3R0b20pKQotCXsKLQkJaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIocmNJdGVtQ3RybC50b3AsIHJjUGxhdGUudG9wKSkKLQkJewotCQkJU2V0U2Nyb2xsUG9zWShyY0l0ZW0uYm90dG9tICsgcmNQbGF0ZS5IZWlnaHQoKSk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjSXRlbUN0cmwudG9wLCByY1BsYXRlLnRvcCkpCi0JewotCQlpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjSXRlbUN0cmwuYm90dG9tLCByY1BsYXRlLmJvdHRvbSkpCi0JCXsKLQkJCVNldFNjcm9sbFBvc1kocmNJdGVtLnRvcCk7Ci0JCX0KLQl9CisgIGlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKHJjSXRlbUN0cmwuYm90dG9tLCByY1BsYXRlLmJvdHRvbSkpIHsKKyAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihyY0l0ZW1DdHJsLnRvcCwgcmNQbGF0ZS50b3ApKSB7CisgICAgICBTZXRTY3JvbGxQb3NZKHJjSXRlbS5ib3R0b20gKyByY1BsYXRlLkhlaWdodCgpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjSXRlbUN0cmwudG9wLCByY1BsYXRlLnRvcCkpIHsKKyAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjSXRlbUN0cmwuYm90dG9tLCByY1BsYXRlLmJvdHRvbSkpIHsKKyAgICAgIFNldFNjcm9sbFBvc1kocmNJdGVtLnRvcCk7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRTY3JvbGxJbmZvKCkKLXsKLQlpZiAobV9wTm90aWZ5KQotCXsKLQkJQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRQbGF0ZVJlY3QoKTsKLQkJQ1BERl9SZWN0IHJjQ29udGVudCA9IENGWF9MaXN0OjpHZXRDb250ZW50UmVjdCgpOwordm9pZCBDRlhfTGlzdEN0cmw6OlNldFNjcm9sbEluZm8oKSB7CisgIGlmIChtX3BOb3RpZnkpIHsKKyAgICBDUERGX1JlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOworICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSBDRlhfTGlzdDo6R2V0Q29udGVudFJlY3QoKTsKIAotCQlpZiAoIW1fYk5vdGlmeUZsYWcpCi0JCXsKLQkJCW1fYk5vdGlmeUZsYWcgPSBUUlVFOwotCQkJbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxJbmZvWShyY1BsYXRlLmJvdHRvbSwgcmNQbGF0ZS50b3AsCi0JCQkJCXJjQ29udGVudC5ib3R0b20sIHJjQ29udGVudC50b3AsIEdldEZpcnN0SGVpZ2h0KCksIHJjUGxhdGUuSGVpZ2h0KCkpOwotCQkJbV9iTm90aWZ5RmxhZyA9IEZBTFNFOwotCQl9Ci0JfQorICAgIGlmICghbV9iTm90aWZ5RmxhZykgeworICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICBtX3BOb3RpZnktPklPblNldFNjcm9sbEluZm9ZKHJjUGxhdGUuYm90dG9tLCByY1BsYXRlLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDb250ZW50LmJvdHRvbSwgcmNDb250ZW50LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Rmlyc3RIZWlnaHQoKSwgcmNQbGF0ZS5IZWlnaHQoKSk7CisgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotewotCVNldFNjcm9sbFBvc1kocG9pbnQueSk7Cit2b2lkIENGWF9MaXN0Q3RybDo6U2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIFNldFNjcm9sbFBvc1kocG9pbnQueSk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KQotewotCWlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwobV9wdFNjcm9sbFBvcy55LGZ5KSkKLQl7Ci0JCUNQREZfUmVjdCByY1BsYXRlID0gR2V0UGxhdGVSZWN0KCk7Ci0JCUNQREZfUmVjdCByY0NvbnRlbnQgPSBDRlhfTGlzdDo6R2V0Q29udGVudFJlY3QoKTsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KSB7CisgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwobV9wdFNjcm9sbFBvcy55LCBmeSkpIHsKKyAgICBDUERGX1JlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOworICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSBDRlhfTGlzdDo6R2V0Q29udGVudFJlY3QoKTsKIAotCQlpZiAocmNQbGF0ZS5IZWlnaHQoKSA+IHJjQ29udGVudC5IZWlnaHQoKSkKLQkJewotCQkJZnkgPSByY1BsYXRlLnRvcDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKGZ5IC0gcmNQbGF0ZS5IZWlnaHQoKSwgcmNDb250ZW50LmJvdHRvbSkpCi0JCQl7Ci0JCQkJZnkgPSByY0NvbnRlbnQuYm90dG9tICsgcmNQbGF0ZS5IZWlnaHQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihmeSwgcmNDb250ZW50LnRvcCkpCi0JCQl7Ci0JCQkJZnkgPSByY0NvbnRlbnQudG9wOwotCQkJfQotCQl9CisgICAgaWYgKHJjUGxhdGUuSGVpZ2h0KCkgPiByY0NvbnRlbnQuSGVpZ2h0KCkpIHsKKyAgICAgIGZ5ID0gcmNQbGF0ZS50b3A7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKGZ5IC0gcmNQbGF0ZS5IZWlnaHQoKSwgcmNDb250ZW50LmJvdHRvbSkpIHsKKyAgICAgICAgZnkgPSByY0NvbnRlbnQuYm90dG9tICsgcmNQbGF0ZS5IZWlnaHQoKTsKKyAgICAgIH0gZWxzZSBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKGZ5LCByY0NvbnRlbnQudG9wKSkgeworICAgICAgICBmeSA9IHJjQ29udGVudC50b3A7CisgICAgICB9CisgICAgfQogCi0JCW1fcHRTY3JvbGxQb3MueSA9IGZ5OwotCQlJbnZhbGlkYXRlSXRlbSgtMSk7CisgICAgbV9wdFNjcm9sbFBvcy55ID0gZnk7CisgICAgSW52YWxpZGF0ZUl0ZW0oLTEpOwogCi0JCWlmIChtX3BOb3RpZnkpCi0JCXsKLQkJCWlmICghbV9iTm90aWZ5RmxhZykKLQkJCXsKLQkJCQltX2JOb3RpZnlGbGFnID0gVFJVRTsKLQkJCQltX3BOb3RpZnktPklPblNldFNjcm9sbFBvc1koZnkpOwotCQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKLQkJCX0KLQkJfQotCX0KKyAgICBpZiAobV9wTm90aWZ5KSB7CisgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKKyAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsUG9zWShmeSk7CisgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotQ1BERl9SZWN0IENGWF9MaXN0Q3RybDo6R2V0Q29udGVudFJlY3QoKSBjb25zdAotewotCXJldHVybiBJblRvT3V0KENGWF9MaXN0OjpHZXRDb250ZW50UmVjdCgpKTsKK0NQREZfUmVjdCBDRlhfTGlzdEN0cmw6OkdldENvbnRlbnRSZWN0KCkgY29uc3QgeworICByZXR1cm4gSW5Ub091dChDRlhfTGlzdDo6R2V0Q29udGVudFJlY3QoKSk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpSZUFycmFuZ2UoaW50MzJfdCBuSXRlbUluZGV4KQotewotCUNGWF9MaXN0OjpSZUFycmFuZ2Uobkl0ZW1JbmRleCk7Ci0JU2V0U2Nyb2xsSW5mbygpOwordm9pZCBDRlhfTGlzdEN0cmw6OlJlQXJyYW5nZShpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgQ0ZYX0xpc3Q6OlJlQXJyYW5nZShuSXRlbUluZGV4KTsKKyAgU2V0U2Nyb2xsSW5mbygpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6U2V0VG9wSXRlbShpbnQzMl90IG5JbmRleCkKLXsKLQlpZiAoSXNWYWxpZChuSW5kZXgpKQotCXsKLQkJR2V0UGxhdGVSZWN0KCk7Ci0JCUNQREZfUmVjdCByY0l0ZW0gPSBDRlhfTGlzdDo6R2V0SXRlbVJlY3QobkluZGV4KTsKLQkJU2V0U2Nyb2xsUG9zWShyY0l0ZW0udG9wKTsKLQl9Cit2b2lkIENGWF9MaXN0Q3RybDo6U2V0VG9wSXRlbShpbnQzMl90IG5JbmRleCkgeworICBpZiAoSXNWYWxpZChuSW5kZXgpKSB7CisgICAgR2V0UGxhdGVSZWN0KCk7CisgICAgQ1BERl9SZWN0IHJjSXRlbSA9IENGWF9MaXN0OjpHZXRJdGVtUmVjdChuSW5kZXgpOworICAgIFNldFNjcm9sbFBvc1kocmNJdGVtLnRvcCk7CisgIH0KIH0KIAotaW50MzJfdCBDRlhfTGlzdEN0cmw6OkdldFRvcEl0ZW0oKSBjb25zdAotewotCWludDMyX3Qgbkl0ZW1JbmRleCA9IEdldEl0ZW1JbmRleChHZXRCVFBvaW50KCkpOworaW50MzJfdCBDRlhfTGlzdEN0cmw6OkdldFRvcEl0ZW0oKSBjb25zdCB7CisgIGludDMyX3Qgbkl0ZW1JbmRleCA9IEdldEl0ZW1JbmRleChHZXRCVFBvaW50KCkpOwogCi0JaWYgKCFJc0l0ZW1WaXNpYmxlKG5JdGVtSW5kZXgpICYmIElzSXRlbVZpc2libGUobkl0ZW1JbmRleCArIDEpKQotCQkJbkl0ZW1JbmRleCArPSAxOworICBpZiAoIUlzSXRlbVZpc2libGUobkl0ZW1JbmRleCkgJiYgSXNJdGVtVmlzaWJsZShuSXRlbUluZGV4ICsgMSkpCisgICAgbkl0ZW1JbmRleCArPSAxOwogCi0JcmV0dXJuIG5JdGVtSW5kZXg7CisgIHJldHVybiBuSXRlbUluZGV4OwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6RW1wdHkoKQotewotCUNGWF9MaXN0OjpFbXB0eSgpOwotCUludmFsaWRhdGVJdGVtKC0xKTsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpFbXB0eSgpIHsKKyAgQ0ZYX0xpc3Q6OkVtcHR5KCk7CisgIEludmFsaWRhdGVJdGVtKC0xKTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6OkNhbmNlbCgpCi17Ci0JbV9hU2VsSXRlbXMuRGVzZWxlY3RBbGwoKTsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpDYW5jZWwoKSB7CisgIG1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7CiB9CiAKLWludDMyX3QgQ0ZYX0xpc3RDdHJsOjpHZXRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdAotewotCXJldHVybiBDRlhfTGlzdDo6R2V0SXRlbUluZGV4KE91dFRvSW4ocG9pbnQpKTsKK2ludDMyX3QgQ0ZYX0xpc3RDdHJsOjpHZXRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgcmV0dXJuIENGWF9MaXN0OjpHZXRJdGVtSW5kZXgoT3V0VG9Jbihwb2ludCkpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDRlhfTGlzdEN0cmw6OkdldFRleHQoKSBjb25zdAotewotICAgIGlmIChJc011bHRpcGxlU2VsKCkpCi0gICAgICAgIHJldHVybiBHZXRJdGVtVGV4dChtX25DYXJldEluZGV4KTsKLSAgICByZXR1cm4gR2V0SXRlbVRleHQobV9uU2VsSXRlbSk7CitDRlhfV2lkZVN0cmluZyBDRlhfTGlzdEN0cmw6OkdldFRleHQoKSBjb25zdCB7CisgIGlmIChJc011bHRpcGxlU2VsKCkpCisgICAgcmV0dXJuIEdldEl0ZW1UZXh0KG1fbkNhcmV0SW5kZXgpOworICByZXR1cm4gR2V0SXRlbVRleHQobV9uU2VsSXRlbSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X21vZHVsZS5jcHAgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9tb2R1bGUuY3BwCmluZGV4IGQxNDIxNjQuLjVjMDA4NmFlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9tb2R1bGUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X21vZHVsZS5jcHAKQEAgLTEwLDM3ICsxMCwzMCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElGWF9FZGl0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotSUZYX0VkaXQqIElGWF9FZGl0OjpOZXdFZGl0KCkKLXsKLQlpZiAoSVBERl9WYXJpYWJsZVRleHQgKiBwVlQgPSBJUERGX1ZhcmlhYmxlVGV4dDo6TmV3VmFyaWFibGVUZXh0KCkpCi0JewotCQlyZXR1cm4gbmV3IENGWF9FZGl0KHBWVCk7Ci0JfQorSUZYX0VkaXQqIElGWF9FZGl0OjpOZXdFZGl0KCkgeworICBpZiAoSVBERl9WYXJpYWJsZVRleHQqIHBWVCA9IElQREZfVmFyaWFibGVUZXh0OjpOZXdWYXJpYWJsZVRleHQoKSkgeworICAgIHJldHVybiBuZXcgQ0ZYX0VkaXQocFZUKTsKKyAgfQogCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIElGWF9FZGl0OjpEZWxFZGl0KElGWF9FZGl0KiBwRWRpdCkKLXsKLQlBU1NFUlQocEVkaXQgIT0gTlVMTCk7Cit2b2lkIElGWF9FZGl0OjpEZWxFZGl0KElGWF9FZGl0KiBwRWRpdCkgeworICBBU1NFUlQocEVkaXQgIT0gTlVMTCk7CiAKLQlJUERGX1ZhcmlhYmxlVGV4dDo6RGVsVmFyaWFibGVUZXh0KHBFZGl0LT5HZXRWYXJpYWJsZVRleHQoKSk7CisgIElQREZfVmFyaWFibGVUZXh0OjpEZWxWYXJpYWJsZVRleHQocEVkaXQtPkdldFZhcmlhYmxlVGV4dCgpKTsKIAotCWRlbGV0ZSAoQ0ZYX0VkaXQqKXBFZGl0OworICBkZWxldGUgKENGWF9FZGl0KilwRWRpdDsKIH0KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElGWF9MaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotSUZYX0xpc3QqIElGWF9MaXN0OjpOZXdMaXN0KCkKLXsKLQlyZXR1cm4gbmV3IENGWF9MaXN0Q3RybCgpOworSUZYX0xpc3QqIElGWF9MaXN0OjpOZXdMaXN0KCkgeworICByZXR1cm4gbmV3IENGWF9MaXN0Q3RybCgpOwogfQogCi12b2lkIElGWF9MaXN0OjpEZWxMaXN0KElGWF9MaXN0KiBwTGlzdCkKLXsKLQlBU1NFUlQocExpc3QgIT0gTlVMTCk7Cit2b2lkIElGWF9MaXN0OjpEZWxMaXN0KElGWF9MaXN0KiBwTGlzdCkgeworICBBU1NFUlQocExpc3QgIT0gTlVMTCk7CiAKLQlkZWxldGUgKENGWF9MaXN0Q3RybCopcExpc3Q7CisgIGRlbGV0ZSAoQ0ZYX0xpc3RDdHJsKilwTGlzdDsKIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfcGFnZW9ianMuY3BwIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfcGFnZW9ianMuY3BwCmluZGV4IDFjMDI2OWIuLjFmYjY2OWIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X3BhZ2VvYmpzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9wYWdlb2Jqcy5jcHAKQEAgLTgsNjM0ICs4LDY2NSBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhlZGl0L2Z4X2VkaXQuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaCIKIAotI2RlZmluZSBGWF9FRElUX1VOREVSTElORUhBTEZXSURUSAkJCQkwLjVmCi0jZGVmaW5lIEZYX0VESVRfQ1JPU1NPVVRIQUxGV0lEVEgJCQkJMC41ZgorI2RlZmluZSBGWF9FRElUX1VOREVSTElORUhBTEZXSURUSCAwLjVmCisjZGVmaW5lIEZYX0VESVRfQ1JPU1NPVVRIQUxGV0lEVEggMC41ZgogCi1leHRlcm4gQ0ZYX0J5dGVTdHJpbmcgR2V0UERGV29yZFN0cmluZyhJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAsIGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCBXb3JkLCBGWF9XT1JEIFN1YldvcmQpOworZXh0ZXJuIENGWF9CeXRlU3RyaW5nIEdldFBERldvcmRTdHJpbmcoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIFdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIFN1YldvcmQpOwogCi1DUERGX1JlY3QgR2V0VW5kZXJMaW5lUmVjdChjb25zdCBDUFZUX1dvcmQmIHdvcmQpCi17Ci0JcmV0dXJuIENQREZfUmVjdCh3b3JkLnB0V29yZC54LCB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudCAqIDAuNWYsCi0JCQkJCQl3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGgsIHdvcmQucHRXb3JkLnkgKyB3b3JkLmZEZXNjZW50ICogMC4yNWYpOworQ1BERl9SZWN0IEdldFVuZGVyTGluZVJlY3QoY29uc3QgQ1BWVF9Xb3JkJiB3b3JkKSB7CisgIHJldHVybiBDUERGX1JlY3Qod29yZC5wdFdvcmQueCwgd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQgKiAwLjVmLAorICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudCAqIDAuMjVmKTsKIH0KIAotQ1BERl9SZWN0IEdldENyb3Nzb3V0UmVjdChjb25zdCBDUFZUX1dvcmQmIHdvcmQpCi17Ci0JcmV0dXJuIENQREZfUmVjdCh3b3JkLnB0V29yZC54LCB3b3JkLnB0V29yZC55ICsgKHdvcmQuZkFzY2VudCArIHdvcmQuZkRlc2NlbnQpICogMC41ZiArIHdvcmQuZkRlc2NlbnQgKiAwLjI1ZiwKLQkJCQkJCQl3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGgsIHdvcmQucHRXb3JkLnkgKyAod29yZC5mQXNjZW50ICsgd29yZC5mRGVzY2VudCkgKiAwLjVmKTsKK0NQREZfUmVjdCBHZXRDcm9zc291dFJlY3QoY29uc3QgQ1BWVF9Xb3JkJiB3b3JkKSB7CisgIHJldHVybiBDUERGX1JlY3Qod29yZC5wdFdvcmQueCwKKyAgICAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC55ICsgKHdvcmQuZkFzY2VudCArIHdvcmQuZkRlc2NlbnQpICogMC41ZiArCisgICAgICAgICAgICAgICAgICAgICAgIHdvcmQuZkRlc2NlbnQgKiAwLjI1ZiwKKyAgICAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGgsCisgICAgICAgICAgICAgICAgICAgd29yZC5wdFdvcmQueSArICh3b3JkLmZBc2NlbnQgKyB3b3JkLmZEZXNjZW50KSAqIDAuNWYpOwogfQogCi1zdGF0aWMgdm9pZCBEcmF3VGV4dFN0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX1BvaW50JiBwdCwgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZkZvbnRTaXplLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsIEZYX0FSR0IgY3JUZXh0RmlsbCwgRlhfQVJHQiBjclRleHRTdHJva2UsIGludDMyX3QgbkhvcnpTY2FsZSkKLXsKLQlGWF9GTE9BVCB4ID0gcHQueCwgeSA9IHB0Lnk7Ci0JcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0oeCwgeSk7CitzdGF0aWMgdm9pZCBEcmF3VGV4dFN0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyVGV4dEZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyVGV4dFN0cm9rZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkhvcnpTY2FsZSkgeworICBGWF9GTE9BVCB4ID0gcHQueCwgeSA9IHB0Lnk7CisgIHBVc2VyMkRldmljZS0+VHJhbnNmb3JtKHgsIHkpOwogCi0JaWYgKHBGb250KQotCXsKLQkJaWYgKG5Ib3J6U2NhbGUgIT0gMTAwKQotCQl7Ci0JCQlDUERGX01hdHJpeCBtdChuSG9yelNjYWxlLzEwMC4wZiwwLDAsMSwwLDApOwotCQkJbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOworICBpZiAocEZvbnQpIHsKKyAgICBpZiAobkhvcnpTY2FsZSAhPSAxMDApIHsKKyAgICAgIENQREZfTWF0cml4IG10KG5Ib3J6U2NhbGUgLyAxMDAuMGYsIDAsIDAsIDEsIDAsIDApOworICAgICAgbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOwogCi0JCQlDUERGX1JlbmRlck9wdGlvbnMgcm87Ci0JCQlyby5tX0ZsYWdzID0gUkVOREVSX0NMRUFSVFlQRTsKLQkJCXJvLm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX05PUk1BTDsKKyAgICAgIENQREZfUmVuZGVyT3B0aW9ucyBybzsKKyAgICAgIHJvLm1fRmxhZ3MgPSBSRU5ERVJfQ0xFQVJUWVBFOworICAgICAgcm8ubV9Db2xvck1vZGUgPSBSRU5ERVJfQ09MT1JfTk9STUFMOwogCi0JCQlpZiAoY3JUZXh0U3Ryb2tlICE9IDApCi0JCQl7Ci0JCQkJQ1BERl9Qb2ludCBwdDEoMCwwKSwgcHQyKDEsMCk7Ci0JCQkJcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocHQxLngsIHB0MS55KTsKLQkJCQlwVXNlcjJEZXZpY2UtPlRyYW5zZm9ybShwdDIueCwgcHQyLnkpOwotCQkJCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JCQkJZ3NkLm1fTGluZVdpZHRoID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMoKHB0Mi54ICsgcHQyLnkpIC0gKHB0MS54ICsgcHQxLnkpKTsKKyAgICAgIGlmIChjclRleHRTdHJva2UgIT0gMCkgeworICAgICAgICBDUERGX1BvaW50IHB0MSgwLCAwKSwgcHQyKDEsIDApOworICAgICAgICBwVXNlcjJEZXZpY2UtPlRyYW5zZm9ybShwdDEueCwgcHQxLnkpOworICAgICAgICBwVXNlcjJEZXZpY2UtPlRyYW5zZm9ybShwdDIueCwgcHQyLnkpOworICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICAgICAgICBnc2QubV9MaW5lV2lkdGggPQorICAgICAgICAgICAgKEZYX0ZMT0FUKUZYU1lTX2ZhYnMoKHB0Mi54ICsgcHQyLnkpIC0gKHB0MS54ICsgcHQxLnkpKTsKIAotCQkJCUNQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFN0cmluZyhwRGV2aWNlLHgsIHksIHBGb250LCBmRm9udFNpemUsICZtdCwgc3RyLCBjclRleHRGaWxsLCBjclRleHRTdHJva2UsICZnc2QsICZybyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0U3RyaW5nKHBEZXZpY2UseCwgeSwgcEZvbnQsIGZGb250U2l6ZSwgJm10LCBzdHIsIGNyVGV4dEZpbGwsIDAsIE5VTEwsICZybyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlDUERGX1JlbmRlck9wdGlvbnMgcm87Ci0JCQlyby5tX0ZsYWdzID0gUkVOREVSX0NMRUFSVFlQRTsKLQkJCXJvLm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX05PUk1BTDsKKyAgICAgICAgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0U3RyaW5nKHBEZXZpY2UsIHgsIHksIHBGb250LCBmRm9udFNpemUsICZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgY3JUZXh0RmlsbCwgY3JUZXh0U3Ryb2tlLCAmZ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJvKTsKKyAgICAgIH0gZWxzZQorICAgICAgICBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcocERldmljZSwgeCwgeSwgcEZvbnQsIGZGb250U2l6ZSwgJm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBjclRleHRGaWxsLCAwLCBOVUxMLCAmcm8pOworICAgIH0gZWxzZSB7CisgICAgICBDUERGX1JlbmRlck9wdGlvbnMgcm87CisgICAgICByby5tX0ZsYWdzID0gUkVOREVSX0NMRUFSVFlQRTsKKyAgICAgIHJvLm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX05PUk1BTDsKIAotCQkJaWYgKGNyVGV4dFN0cm9rZSAhPSAwKQotCQkJewotCQkJCUNQREZfUG9pbnQgcHQxKDAsMCksIHB0MigxLDApOwotCQkJCXBVc2VyMkRldmljZS0+VHJhbnNmb3JtKHB0MS54LCBwdDEueSk7Ci0JCQkJcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocHQyLngsIHB0Mi55KTsKLQkJCQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCQkJCWdzZC5tX0xpbmVXaWR0aCA9IChGWF9GTE9BVClGWFNZU19mYWJzKChwdDIueCArIHB0Mi55KSAtIChwdDEueCArIHB0MS55KSk7CisgICAgICBpZiAoY3JUZXh0U3Ryb2tlICE9IDApIHsKKyAgICAgICAgQ1BERl9Qb2ludCBwdDEoMCwgMCksIHB0MigxLCAwKTsKKyAgICAgICAgcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocHQxLngsIHB0MS55KTsKKyAgICAgICAgcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocHQyLngsIHB0Mi55KTsKKyAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgICAgICAgZ3NkLm1fTGluZVdpZHRoID0KKyAgICAgICAgICAgIChGWF9GTE9BVClGWFNZU19mYWJzKChwdDIueCArIHB0Mi55KSAtIChwdDEueCArIHB0MS55KSk7CiAKLQkJCQlDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcocERldmljZSx4LCB5LCBwRm9udCwgZkZvbnRTaXplLCBwVXNlcjJEZXZpY2UsIHN0ciwgY3JUZXh0RmlsbCwgY3JUZXh0U3Ryb2tlLCAmZ3NkLCAmcm8pOwotCQkJfQotCQkJZWxzZQotCQkJCUNQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFN0cmluZyhwRGV2aWNlLHgsIHksIHBGb250LCBmRm9udFNpemUsIHBVc2VyMkRldmljZSwgc3RyLCBjclRleHRGaWxsLCAwLCBOVUxMLCAmcm8pOwotCQl9Ci0JfQorICAgICAgICBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcocERldmljZSwgeCwgeSwgcEZvbnQsIGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyMkRldmljZSwgc3RyLCBjclRleHRGaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JUZXh0U3Ryb2tlLCAmZ3NkLCAmcm8pOworICAgICAgfSBlbHNlCisgICAgICAgIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFN0cmluZyhwRGV2aWNlLCB4LCB5LCBwRm9udCwgZkZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXIyRGV2aWNlLCBzdHIsIGNyVGV4dEZpbGwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcm8pOworICAgIH0KKyAgfQogfQogCi12b2lkIElGWF9FZGl0OjpEcmF3VW5kZXJsaW5lKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsIElGWF9FZGl0KiBwRWRpdCwgRlhfQ09MT1JSRUYgY29sb3IsCi0JCQkJCQkJCWNvbnN0IENQREZfUmVjdCYgcmNDbGlwLCBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSkKLXsKLQlwRGV2aWNlLT5TYXZlU3RhdGUoKTsKK3ZvaWQgSUZYX0VkaXQ6OkRyYXdVbmRlcmxpbmUoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0xPUlJFRiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlKSB7CisgIHBEZXZpY2UtPlNhdmVTdGF0ZSgpOwogCi0JaWYgKCFyY0NsaXAuSXNFbXB0eSgpKQotCXsKLQkJQ1BERl9SZWN0IHJjVGVtcCA9IHJjQ2xpcDsKLQkJcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm1SZWN0KHJjVGVtcCk7Ci0JCUZYX1JFQ1QgcmNEZXZDbGlwOwotCQlyY0RldkNsaXAubGVmdCA9IChpbnQzMl90KXJjVGVtcC5sZWZ0OwotCQlyY0RldkNsaXAucmlnaHQgPSAoaW50MzJfdClyY1RlbXAucmlnaHQ7Ci0JCXJjRGV2Q2xpcC50b3AgPSAoaW50MzJfdClyY1RlbXAudG9wOwotCQlyY0RldkNsaXAuYm90dG9tID0gKGludDMyX3QpcmNUZW1wLmJvdHRvbTsKLQkJcERldmljZS0+U2V0Q2xpcF9SZWN0KCZyY0RldkNsaXApOwotCX0KKyAgaWYgKCFyY0NsaXAuSXNFbXB0eSgpKSB7CisgICAgQ1BERl9SZWN0IHJjVGVtcCA9IHJjQ2xpcDsKKyAgICBwVXNlcjJEZXZpY2UtPlRyYW5zZm9ybVJlY3QocmNUZW1wKTsKKyAgICBGWF9SRUNUIHJjRGV2Q2xpcDsKKyAgICByY0RldkNsaXAubGVmdCA9IChpbnQzMl90KXJjVGVtcC5sZWZ0OworICAgIHJjRGV2Q2xpcC5yaWdodCA9IChpbnQzMl90KXJjVGVtcC5yaWdodDsKKyAgICByY0RldkNsaXAudG9wID0gKGludDMyX3QpcmNUZW1wLnRvcDsKKyAgICByY0RldkNsaXAuYm90dG9tID0gKGludDMyX3QpcmNUZW1wLmJvdHRvbTsKKyAgICBwRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJjRGV2Q2xpcCk7CisgIH0KIAotCWlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gcEVkaXQtPkdldEl0ZXJhdG9yKCkpCi0JewotCQlpZiAocEVkaXQtPkdldEZvbnRNYXAoKSkKLQkJewotCQkJaWYgKHBSYW5nZSkKLQkJCQlwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOwotCQkJZWxzZQotCQkJCXBJdGVyYXRvci0+U2V0QXQoMCk7CisgIGlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gcEVkaXQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICBpZiAocEVkaXQtPkdldEZvbnRNYXAoKSkgeworICAgICAgaWYgKHBSYW5nZSkKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdCgwKTsKIAotCQkJd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLQkJCXsKLQkJCQlDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLQkJCQlpZiAocFJhbmdlICYmIHBsYWNlLldvcmRDbXAocFJhbmdlLT5FbmRQb3MpID4gMCkgYnJlYWs7CisgICAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgICBpZiAocFJhbmdlICYmIHBsYWNlLldvcmRDbXAocFJhbmdlLT5FbmRQb3MpID4gMCkKKyAgICAgICAgICBicmVhazsKIAotCQkJCUNQVlRfV29yZCB3b3JkOwotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCQkJewotCQkJCQlDRlhfUGF0aERhdGEgcGF0aFVuZGVybGluZTsKLQkJCQkJQ1BERl9SZWN0IHJjVW5kZXJsaW5lID0gR2V0VW5kZXJMaW5lUmVjdCh3b3JkKTsKLQkJCQkJcmNVbmRlcmxpbmUubGVmdCArPSBwdE9mZnNldC54OwotCQkJCQlyY1VuZGVybGluZS5yaWdodCArPSBwdE9mZnNldC54OwotCQkJCQlyY1VuZGVybGluZS50b3AgKz0gcHRPZmZzZXQueTsKLQkJCQkJcmNVbmRlcmxpbmUuYm90dG9tICs9IHB0T2Zmc2V0Lnk7Ci0JCQkJCXBhdGhVbmRlcmxpbmUuQXBwZW5kUmVjdChyY1VuZGVybGluZS5sZWZ0LCByY1VuZGVybGluZS5ib3R0b20sIHJjVW5kZXJsaW5lLnJpZ2h0LCByY1VuZGVybGluZS50b3ApOworICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoVW5kZXJsaW5lOworICAgICAgICAgIENQREZfUmVjdCByY1VuZGVybGluZSA9IEdldFVuZGVyTGluZVJlY3Qod29yZCk7CisgICAgICAgICAgcmNVbmRlcmxpbmUubGVmdCArPSBwdE9mZnNldC54OworICAgICAgICAgIHJjVW5kZXJsaW5lLnJpZ2h0ICs9IHB0T2Zmc2V0Lng7CisgICAgICAgICAgcmNVbmRlcmxpbmUudG9wICs9IHB0T2Zmc2V0Lnk7CisgICAgICAgICAgcmNVbmRlcmxpbmUuYm90dG9tICs9IHB0T2Zmc2V0Lnk7CisgICAgICAgICAgcGF0aFVuZGVybGluZS5BcHBlbmRSZWN0KHJjVW5kZXJsaW5lLmxlZnQsIHJjVW5kZXJsaW5lLmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNVbmRlcmxpbmUucmlnaHQsIHJjVW5kZXJsaW5lLnRvcCk7CiAKLQkJCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGhVbmRlcmxpbmUsIHBVc2VyMkRldmljZSwgTlVMTCwgY29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGhVbmRlcmxpbmUsIHBVc2VyMkRldmljZSwgTlVMTCwgY29sb3IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiAKLQlwRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyAgcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CiB9CiAKLXZvaWQgSUZYX0VkaXQ6OkRyYXdFZGl0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsIElGWF9FZGl0KiBwRWRpdCwgRlhfQ09MT1JSRUYgY3JUZXh0RmlsbCwgRlhfQ09MT1JSRUYgY3JUZXh0U3Ryb2tlLAotCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsIHZvaWQqIHBGRkxEYXRhKQotewordm9pZCBJRlhfRWRpdDo6RHJhd0VkaXQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0xPUlJFRiBjclRleHRGaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09MT1JSRUYgY3JUZXh0U3Ryb2tlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRkZMRGF0YSkgeworICBGWF9CT09MIGJDb250aW51b3VzID0gcEVkaXQtPkdldENoYXJBcnJheSgpID09IDA7CisgIGlmIChwRWRpdC0+R2V0Q2hhclNwYWNlKCkgPiAwLjBmKQorICAgIGJDb250aW51b3VzID0gRkFMU0U7CiAKLQlGWF9CT09MIGJDb250aW51b3VzID0gcEVkaXQtPkdldENoYXJBcnJheSgpID09IDA7Ci0JaWYgKHBFZGl0LT5HZXRDaGFyU3BhY2UoKSA+IDAuMGYpCi0JCWJDb250aW51b3VzID0gRkFMU0U7CisgIEZYX1dPUkQgU3ViV29yZCA9IHBFZGl0LT5HZXRQYXNzd29yZENoYXIoKTsKKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gcEVkaXQtPkdldEZvbnRTaXplKCk7CisgIENQVlRfV29yZFJhbmdlIHdyU2VsZWN0ID0gcEVkaXQtPkdldFNlbGVjdFdvcmRSYW5nZSgpOworICBpbnQzMl90IG5Ib3J6U2NhbGUgPSBwRWRpdC0+R2V0SG9yelNjYWxlKCk7CiAKLQlGWF9XT1JEIFN1YldvcmQgPSBwRWRpdC0+R2V0UGFzc3dvcmRDaGFyKCk7Ci0JRlhfRkxPQVQgZkZvbnRTaXplID0gcEVkaXQtPkdldEZvbnRTaXplKCk7Ci0JQ1BWVF9Xb3JkUmFuZ2Ugd3JTZWxlY3QgPSBwRWRpdC0+R2V0U2VsZWN0V29yZFJhbmdlKCk7Ci0JaW50MzJfdCBuSG9yelNjYWxlID0gcEVkaXQtPkdldEhvcnpTY2FsZSgpOworICBGWF9DT0xPUlJFRiBjckN1ckZpbGwgPSBjclRleHRGaWxsOworICBGWF9DT0xPUlJFRiBjck9sZEZpbGwgPSBjckN1ckZpbGw7CiAKLQlGWF9DT0xPUlJFRiBjckN1ckZpbGwgPSBjclRleHRGaWxsOwotCUZYX0NPTE9SUkVGIGNyT2xkRmlsbCA9IGNyQ3VyRmlsbDsKKyAgRlhfQk9PTCBiU2VsZWN0ID0gRkFMU0U7CisgIGNvbnN0IEZYX0NPTE9SUkVGIGNyV2hpdGUgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisgIGNvbnN0IEZYX0NPTE9SUkVGIGNyU2VsQksgPSBBcmdiRW5jb2RlKDI1NSwgMCwgNTEsIDExMyk7CiAKLQlGWF9CT09MIGJTZWxlY3QgPSBGQUxTRTsKLQljb25zdCBGWF9DT0xPUlJFRiBjcldoaXRlID0gQXJnYkVuY29kZSgyNTUsMjU1LDI1NSwyNTUpOwotCWNvbnN0IEZYX0NPTE9SUkVGIGNyU2VsQksgPSBBcmdiRW5jb2RlKDI1NSwwLDUxLDExMyk7CisgIENGWF9CeXRlVGV4dEJ1ZiBzVGV4dEJ1ZjsKKyAgaW50MzJfdCBuRm9udEluZGV4ID0gLTE7CisgIENQREZfUG9pbnQgcHRCVCgwLjBmLCAwLjBmKTsKIAotCUNGWF9CeXRlVGV4dEJ1ZiBzVGV4dEJ1ZjsKLQlpbnQzMl90IG5Gb250SW5kZXggPSAtMTsKLQlDUERGX1BvaW50IHB0QlQoMC4wZiwwLjBmKTsKKyAgcERldmljZS0+U2F2ZVN0YXRlKCk7CiAKLQlwRGV2aWNlLT5TYXZlU3RhdGUoKTsKKyAgaWYgKCFyY0NsaXAuSXNFbXB0eSgpKSB7CisgICAgQ1BERl9SZWN0IHJjVGVtcCA9IHJjQ2xpcDsKKyAgICBwVXNlcjJEZXZpY2UtPlRyYW5zZm9ybVJlY3QocmNUZW1wKTsKKyAgICBGWF9SRUNUIHJjRGV2Q2xpcDsKKyAgICByY0RldkNsaXAubGVmdCA9IChpbnQzMl90KXJjVGVtcC5sZWZ0OworICAgIHJjRGV2Q2xpcC5yaWdodCA9IChpbnQzMl90KXJjVGVtcC5yaWdodDsKKyAgICByY0RldkNsaXAudG9wID0gKGludDMyX3QpcmNUZW1wLnRvcDsKKyAgICByY0RldkNsaXAuYm90dG9tID0gKGludDMyX3QpcmNUZW1wLmJvdHRvbTsKKyAgICBwRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJjRGV2Q2xpcCk7CisgIH0KIAotCWlmICghcmNDbGlwLklzRW1wdHkoKSkKLQl7Ci0JCUNQREZfUmVjdCByY1RlbXAgPSByY0NsaXA7Ci0JCXBVc2VyMkRldmljZS0+VHJhbnNmb3JtUmVjdChyY1RlbXApOwotCQlGWF9SRUNUIHJjRGV2Q2xpcDsKLQkJcmNEZXZDbGlwLmxlZnQgPSAoaW50MzJfdClyY1RlbXAubGVmdDsKLQkJcmNEZXZDbGlwLnJpZ2h0ID0gKGludDMyX3QpcmNUZW1wLnJpZ2h0OwotCQlyY0RldkNsaXAudG9wID0gKGludDMyX3QpcmNUZW1wLnRvcDsKLQkJcmNEZXZDbGlwLmJvdHRvbSA9IChpbnQzMl90KXJjVGVtcC5ib3R0b207Ci0JCXBEZXZpY2UtPlNldENsaXBfUmVjdCgmcmNEZXZDbGlwKTsKLQl9CisgIGlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gcEVkaXQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICBpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBwRWRpdC0+R2V0Rm9udE1hcCgpKSB7CisgICAgICBpZiAocFJhbmdlKQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOworICAgICAgZWxzZQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KDApOwogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCWlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IHBFZGl0LT5HZXRGb250TWFwKCkpCi0JCXsKLQkJCWlmIChwUmFuZ2UpCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKLQkJCWVsc2UKLQkJCQlwSXRlcmF0b3ItPlNldEF0KDApOworICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7CiAKLQkJCUNQVlRfV29yZFBsYWNlIG9sZHBsYWNlOworICAgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgeworICAgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgICAgaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApCisgICAgICAgICAgYnJlYWs7CiAKLQkJCXdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCi0JCQl7Ci0JCQkJQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0JCQkJaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApIGJyZWFrOworICAgICAgICBpZiAod3JTZWxlY3QuSXNFeGlzdCgpKSB7CisgICAgICAgICAgYlNlbGVjdCA9IHBsYWNlLldvcmRDbXAod3JTZWxlY3QuQmVnaW5Qb3MpID4gMCAmJgorICAgICAgICAgICAgICAgICAgICBwbGFjZS5Xb3JkQ21wKHdyU2VsZWN0LkVuZFBvcykgPD0gMDsKKyAgICAgICAgICBpZiAoYlNlbGVjdCkgeworICAgICAgICAgICAgY3JDdXJGaWxsID0gY3JXaGl0ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3JDdXJGaWxsID0gY3JUZXh0RmlsbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBTeXN0ZW1IYW5kbGVyICYmIHBTeXN0ZW1IYW5kbGVyLT5Jc1NlbGVjdGlvbkltcGxlbWVudGVkKCkpIHsKKyAgICAgICAgICBjckN1ckZpbGwgPSBjclRleHRGaWxsOworICAgICAgICAgIGNyT2xkRmlsbCA9IGNyQ3VyRmlsbDsKKyAgICAgICAgfQorICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIGlmIChiU2VsZWN0KSB7CisgICAgICAgICAgICBDUFZUX0xpbmUgbGluZTsKKyAgICAgICAgICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5lKTsKIAotCQkJCWlmICh3clNlbGVjdC5Jc0V4aXN0KCkpCi0JCQkJewotCQkJCQliU2VsZWN0ID0gcGxhY2UuV29yZENtcCh3clNlbGVjdC5CZWdpblBvcykgPiAwICYmIHBsYWNlLldvcmRDbXAod3JTZWxlY3QuRW5kUG9zKSA8PSAwOwotCQkJCQlpZiAoYlNlbGVjdCkKLQkJCQkJewotCQkJCQkJY3JDdXJGaWxsID0gY3JXaGl0ZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWNyQ3VyRmlsbCA9IGNyVGV4dEZpbGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYocFN5c3RlbUhhbmRsZXIgJiYgcFN5c3RlbUhhbmRsZXItPklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSkKLQkJCQl7Ci0JCQkJCWNyQ3VyRmlsbCA9IGNyVGV4dEZpbGw7Ci0gCQkJCQljck9sZEZpbGwgPSBjckN1ckZpbGw7Ci0JCQkJfQotCQkJCUNQVlRfV29yZCB3b3JkOwotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCQkJeworICAgICAgICAgICAgaWYgKHBTeXN0ZW1IYW5kbGVyICYmIHBTeXN0ZW1IYW5kbGVyLT5Jc1NlbGVjdGlvbkltcGxlbWVudGVkKCkpIHsKKyAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjKHdvcmQucHRXb3JkLngsIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50KTsKKyAgICAgICAgICAgICAgcmMuSW50ZXJzZWN0KHJjQ2xpcCk7CisgICAgICAgICAgICAgIC8vIENGWF9FZGl0KiBwRXQgPSAoQ0ZYX0VkaXQqKXBFZGl0OworICAgICAgICAgICAgICAvLyBDUERGX1JlY3QgcmNFZGl0ID0gcEV0LT5WVFRvRWRpdChyYyk7CisgICAgICAgICAgICAgIHBTeXN0ZW1IYW5kbGVyLT5PdXRwdXRTZWxlY3RlZFJlY3QocEZGTERhdGEsIHJjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoU2VsQks7CisgICAgICAgICAgICAgIHBhdGhTZWxCSy5BcHBlbmRSZWN0KHdvcmQucHRXb3JkLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudCk7CiAKLQkJCQkJaWYgKGJTZWxlY3QpCi0JCQkJCXsKKyAgICAgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGhTZWxCSywgcFVzZXIyRGV2aWNlLCBOVUxMLCBjclNlbEJLLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQogCi0JCQkJCQlDUFZUX0xpbmUgbGluZTsKLQkJCQkJCXBJdGVyYXRvci0+R2V0TGluZShsaW5lKTsKKyAgICAgICAgICBpZiAoYkNvbnRpbnVvdXMpIHsKKyAgICAgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKG9sZHBsYWNlKSAhPSAwIHx8IHdvcmQubkZvbnRJbmRleCAhPSBuRm9udEluZGV4IHx8CisgICAgICAgICAgICAgICAgY3JPbGRGaWxsICE9IGNyQ3VyRmlsbCkgeworICAgICAgICAgICAgICBpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgRHJhd1RleHRTdHJpbmcocERldmljZSwgQ1BERl9Qb2ludChwdEJULnggKyBwdE9mZnNldC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRCVC55ICsgcHRPZmZzZXQueSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCksIGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlcjJEZXZpY2UsIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjck9sZEZpbGwsIGNyVGV4dFN0cm9rZSwgbkhvcnpTY2FsZSk7CiAKLQkJCQkJCWlmKHBTeXN0ZW1IYW5kbGVyICYmIHBTeXN0ZW1IYW5kbGVyLT5Jc1NlbGVjdGlvbkltcGxlbWVudGVkKCkpCi0JCQkJCQl7Ci0JCQkJCQkJQ1BERl9SZWN0IHJjKHdvcmQucHRXb3JkLngsbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50LAotCQkJCQkJCQl3b3JkLnB0V29yZC54K3dvcmQuZldpZHRoLGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50KTsKLQkJCQkJCQlyYy5JbnRlcnNlY3QocmNDbGlwKTsKLQkJCQkJCQkvL0NGWF9FZGl0KiBwRXQgPSAoQ0ZYX0VkaXQqKXBFZGl0OwotCQkJCQkJCS8vQ1BERl9SZWN0IHJjRWRpdCA9IHBFdC0+VlRUb0VkaXQocmMpOwotCQkJCQkJCXBTeXN0ZW1IYW5kbGVyLT5PdXRwdXRTZWxlY3RlZFJlY3QocEZGTERhdGEscmMpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotIAkJCQkJCQlDRlhfUGF0aERhdGEgcGF0aFNlbEJLOwotIAkJCQkJCQlwYXRoU2VsQksuQXBwZW5kUmVjdCh3b3JkLnB0V29yZC54LGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudCwKLSAJCQkJCQkJCXdvcmQucHRXb3JkLngrd29yZC5mV2lkdGgsbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQpOworICAgICAgICAgICAgICAgIHNUZXh0QnVmLkNsZWFyKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbkZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKKyAgICAgICAgICAgICAgcHRCVCA9IHdvcmQucHRXb3JkOworICAgICAgICAgICAgICBjck9sZEZpbGwgPSBjckN1ckZpbGw7CisgICAgICAgICAgICB9CiAKLSAJCQkJCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGhTZWxCSywgcFVzZXIyRGV2aWNlLCBOVUxMLCBjclNlbEJLLCAwLCBGWEZJTExfV0lORElORyk7Ci0JCQkJCQl9Ci0JCQkJCX0KKyAgICAgICAgICAgIHNUZXh0QnVmIDw8IEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIHdvcmQubkZvbnRJbmRleCwgd29yZC5Xb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJXb3JkKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRHJhd1RleHRTdHJpbmcoCisgICAgICAgICAgICAgICAgcERldmljZSwgQ1BERl9Qb2ludCh3b3JkLnB0V29yZC54ICsgcHRPZmZzZXQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KSwKKyAgICAgICAgICAgICAgICBwRm9udE1hcC0+R2V0UERGRm9udCh3b3JkLm5Gb250SW5kZXgpLCBmRm9udFNpemUsIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICBHZXRQREZXb3JkU3RyaW5nKHBGb250TWFwLCB3b3JkLm5Gb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCksCisgICAgICAgICAgICAgICAgY3JDdXJGaWxsLCBjclRleHRTdHJva2UsIG5Ib3J6U2NhbGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBvbGRwbGFjZSA9IHBsYWNlOworICAgICAgICB9CisgICAgICB9CiAKLQkJCQkJaWYgKGJDb250aW51b3VzKQotCQkJCQl7Ci0JCQkJCQlpZiAocGxhY2UuTGluZUNtcChvbGRwbGFjZSkgIT0gMCB8fCB3b3JkLm5Gb250SW5kZXggIT0gbkZvbnRJbmRleCB8fAotCQkJCQkJCWNyT2xkRmlsbCAhPSBjckN1ckZpbGwpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKHNUZXh0QnVmLkdldExlbmd0aCgpID4gMCkKLQkJCQkJCQl7Ci0JCQkJCQkJCURyYXdUZXh0U3RyaW5nKHBEZXZpY2UsIENQREZfUG9pbnQocHRCVC54K3B0T2Zmc2V0LngsIHB0QlQueStwdE9mZnNldC55KSwgcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCksCi0JCQkJCQkJCQlmRm9udFNpemUsIHBVc2VyMkRldmljZSwgc1RleHRCdWYuR2V0Qnl0ZVN0cmluZygpLCBjck9sZEZpbGwsIGNyVGV4dFN0cm9rZSwgbkhvcnpTY2FsZSk7CisgICAgICBpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIERyYXdUZXh0U3RyaW5nKAorICAgICAgICAgICAgcERldmljZSwgQ1BERl9Qb2ludChwdEJULnggKyBwdE9mZnNldC54LCBwdEJULnkgKyBwdE9mZnNldC55KSwKKyAgICAgICAgICAgIHBGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpLCBmRm9udFNpemUsIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSwgY3JPbGRGaWxsLCBjclRleHRTdHJva2UsIG5Ib3J6U2NhbGUpOworICAgICAgfQorICAgIH0KKyAgfQogCi0JCQkJCQkJCXNUZXh0QnVmLkNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCW5Gb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7Ci0JCQkJCQkJcHRCVCA9IHdvcmQucHRXb3JkOwotCQkJCQkJCWNyT2xkRmlsbCA9IGNyQ3VyRmlsbDsKLQkJCQkJCX0KLQotCQkJCQkJc1RleHRCdWYgPDwgR2V0UERGV29yZFN0cmluZyhwRm9udE1hcCwgd29yZC5uRm9udEluZGV4LCB3b3JkLldvcmQsIFN1YldvcmQpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJRHJhd1RleHRTdHJpbmcocERldmljZSxDUERGX1BvaW50KHdvcmQucHRXb3JkLngrcHRPZmZzZXQueCwgd29yZC5wdFdvcmQueStwdE9mZnNldC55KSwgcEZvbnRNYXAtPkdldFBERkZvbnQod29yZC5uRm9udEluZGV4KSwKLQkJCQkJCQlmRm9udFNpemUsIHBVc2VyMkRldmljZSwgR2V0UERGV29yZFN0cmluZyhwRm9udE1hcCwgd29yZC5uRm9udEluZGV4LCB3b3JkLldvcmQsIFN1YldvcmQpLCBjckN1ckZpbGwsIGNyVGV4dFN0cm9rZSwgbkhvcnpTY2FsZSk7Ci0KLQkJCQkJfQotCQkJCQlvbGRwbGFjZSA9IHBsYWNlOwotCi0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJRHJhd1RleHRTdHJpbmcocERldmljZSwgQ1BERl9Qb2ludChwdEJULngrcHRPZmZzZXQueCwgcHRCVC55K3B0T2Zmc2V0LnkpLCBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSwKLQkJCQkJZkZvbnRTaXplLCBwVXNlcjJEZXZpY2UsIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSwgY3JPbGRGaWxsLCBjclRleHRTdHJva2UsIG5Ib3J6U2NhbGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogfQogCi12b2lkIElGWF9FZGl0OjpEcmF3UmljaEVkaXQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgSUZYX0VkaXQqIHBFZGl0LAotCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlKQotewotCS8vRlhfRkxPQVQgZkZvbnRTaXplID0gcEVkaXQtPkdldEZvbnRTaXplKCk7Ci0JQ1BWVF9Xb3JkUmFuZ2Ugd3JTZWxlY3QgPSBwRWRpdC0+R2V0U2VsZWN0V29yZFJhbmdlKCk7Cit2b2lkIElGWF9FZGl0OjpEcmF3UmljaEVkaXQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlKSB7CisgIC8vIEZYX0ZMT0FUIGZGb250U2l6ZSA9IHBFZGl0LT5HZXRGb250U2l6ZSgpOworICBDUFZUX1dvcmRSYW5nZSB3clNlbGVjdCA9IHBFZGl0LT5HZXRTZWxlY3RXb3JkUmFuZ2UoKTsKIAotCUZYX0NPTE9SUkVGIGNyQ3VyVGV4dCA9IEFyZ2JFbmNvZGUoMjU1LCAwLDAsMCk7Ci0JRlhfQ09MT1JSRUYgY3JPbGQgPSBjckN1clRleHQ7Ci0JRlhfQk9PTCBiU2VsZWN0ID0gRkFMU0U7Ci0JY29uc3QgRlhfQ09MT1JSRUYgY3JXaGl0ZSA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwyNTUsMjU1KTsKLQljb25zdCBGWF9DT0xPUlJFRiBjclNlbEJLID0gQXJnYkVuY29kZSgyNTUsMCw1MSwxMTMpOworICBGWF9DT0xPUlJFRiBjckN1clRleHQgPSBBcmdiRW5jb2RlKDI1NSwgMCwgMCwgMCk7CisgIEZYX0NPTE9SUkVGIGNyT2xkID0gY3JDdXJUZXh0OworICBGWF9CT09MIGJTZWxlY3QgPSBGQUxTRTsKKyAgY29uc3QgRlhfQ09MT1JSRUYgY3JXaGl0ZSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKyAgY29uc3QgRlhfQ09MT1JSRUYgY3JTZWxCSyA9IEFyZ2JFbmNvZGUoMjU1LCAwLCA1MSwgMTEzKTsKIAotCUNGWF9CeXRlVGV4dEJ1ZiBzVGV4dEJ1ZjsKLQlDUFZUX1dvcmRQcm9wcyB3cDsKLQlDUERGX1BvaW50IHB0QlQoMC4wZiwwLjBmKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNUZXh0QnVmOworICBDUFZUX1dvcmRQcm9wcyB3cDsKKyAgQ1BERl9Qb2ludCBwdEJUKDAuMGYsIDAuMGYpOwogCi0JcERldmljZS0+U2F2ZVN0YXRlKCk7CisgIHBEZXZpY2UtPlNhdmVTdGF0ZSgpOwogCi0JaWYgKCFyY0NsaXAuSXNFbXB0eSgpKQotCXsKLQkJQ1BERl9SZWN0IHJjVGVtcCA9IHJjQ2xpcDsKLQkJcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm1SZWN0KHJjVGVtcCk7Ci0JCUZYX1JFQ1QgcmNEZXZDbGlwOwotCQlyY0RldkNsaXAubGVmdCA9IChpbnQzMl90KXJjVGVtcC5sZWZ0OwotCQlyY0RldkNsaXAucmlnaHQgPSAoaW50MzJfdClyY1RlbXAucmlnaHQ7Ci0JCXJjRGV2Q2xpcC50b3AgPSAoaW50MzJfdClyY1RlbXAudG9wOwotCQlyY0RldkNsaXAuYm90dG9tID0gKGludDMyX3QpcmNUZW1wLmJvdHRvbTsKLQkJcERldmljZS0+U2V0Q2xpcF9SZWN0KCZyY0RldkNsaXApOwotCX0KKyAgaWYgKCFyY0NsaXAuSXNFbXB0eSgpKSB7CisgICAgQ1BERl9SZWN0IHJjVGVtcCA9IHJjQ2xpcDsKKyAgICBwVXNlcjJEZXZpY2UtPlRyYW5zZm9ybVJlY3QocmNUZW1wKTsKKyAgICBGWF9SRUNUIHJjRGV2Q2xpcDsKKyAgICByY0RldkNsaXAubGVmdCA9IChpbnQzMl90KXJjVGVtcC5sZWZ0OworICAgIHJjRGV2Q2xpcC5yaWdodCA9IChpbnQzMl90KXJjVGVtcC5yaWdodDsKKyAgICByY0RldkNsaXAudG9wID0gKGludDMyX3QpcmNUZW1wLnRvcDsKKyAgICByY0RldkNsaXAuYm90dG9tID0gKGludDMyX3QpcmNUZW1wLmJvdHRvbTsKKyAgICBwRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJjRGV2Q2xpcCk7CisgIH0KIAotCWlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gcEVkaXQtPkdldEl0ZXJhdG9yKCkpCi0JewotCQlpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBwRWRpdC0+R2V0Rm9udE1hcCgpKQotCQl7Ci0JCQlpZiAocFJhbmdlKQotCQkJCXBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7Ci0JCQllbHNlCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdCgwKTsKKyAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgIGlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IHBFZGl0LT5HZXRGb250TWFwKCkpIHsKKyAgICAgIGlmIChwUmFuZ2UpCisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7CisgICAgICBlbHNlCisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQoMCk7CiAKLQkJCUNQVlRfV29yZFBsYWNlIG9sZHBsYWNlOworICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7CiAKLQkJCXdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCi0JCQl7Ci0JCQkJQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0JCQkJaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApIGJyZWFrOworICAgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgeworICAgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgICAgaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApCisgICAgICAgICAgYnJlYWs7CiAKLQkJCQlDUFZUX1dvcmQgd29yZDsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCXsKLQkJCQkJd29yZC5Xb3JkUHJvcHMuZkZvbnRTaXplID0gd29yZC5mRm9udFNpemU7CisgICAgICAgIENQVlRfV29yZCB3b3JkOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgd29yZC5Xb3JkUHJvcHMuZkZvbnRTaXplID0gd29yZC5mRm9udFNpemU7CiAKLQkJCQkJY3JDdXJUZXh0ID0gQXJnYkVuY29kZSgyNTUsd29yZC5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IpOworICAgICAgICAgIGNyQ3VyVGV4dCA9IEFyZ2JFbmNvZGUoMjU1LCB3b3JkLldvcmRQcm9wcy5kd1dvcmRDb2xvcik7CiAKLQkJCQkJaWYgKHdyU2VsZWN0LklzRXhpc3QoKSkKLQkJCQkJewotCQkJCQkJYlNlbGVjdCA9IHBsYWNlLldvcmRDbXAod3JTZWxlY3QuQmVnaW5Qb3MpID4gMCAmJiBwbGFjZS5Xb3JkQ21wKHdyU2VsZWN0LkVuZFBvcykgPD0gMDsKLQkJCQkJCWlmIChiU2VsZWN0KQotCQkJCQkJewotCQkJCQkJCWNyQ3VyVGV4dCA9IGNyV2hpdGU7Ci0JCQkJCQl9Ci0JCQkJCX0KKyAgICAgICAgICBpZiAod3JTZWxlY3QuSXNFeGlzdCgpKSB7CisgICAgICAgICAgICBiU2VsZWN0ID0gcGxhY2UuV29yZENtcCh3clNlbGVjdC5CZWdpblBvcykgPiAwICYmCisgICAgICAgICAgICAgICAgICAgICAgcGxhY2UuV29yZENtcCh3clNlbGVjdC5FbmRQb3MpIDw9IDA7CisgICAgICAgICAgICBpZiAoYlNlbGVjdCkgeworICAgICAgICAgICAgICBjckN1clRleHQgPSBjcldoaXRlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KIAotCQkJCQlpZiAoYlNlbGVjdCkKLQkJCQkJewotCQkJCQkJQ1BWVF9MaW5lIGxpbmU7Ci0JCQkJCQlwSXRlcmF0b3ItPkdldExpbmUobGluZSk7CisgICAgICAgICAgaWYgKGJTZWxlY3QpIHsKKyAgICAgICAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgICAgICAgcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOwogCi0JCQkJCQlDRlhfUGF0aERhdGEgcGF0aFNlbEJLOwotCQkJCQkJcGF0aFNlbEJLLkFwcGVuZFJlY3Qod29yZC5wdFdvcmQueAkJKyBwdE9mZnNldC54LAotCQkJCQkJCWxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudAkrIHB0T2Zmc2V0LnksCi0JCQkJCQkJd29yZC5wdFdvcmQueCt3b3JkLmZXaWR0aAkJCSsgcHRPZmZzZXQueCwKLQkJCQkJCQlsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudAkrIHB0T2Zmc2V0LnkpOworICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGhTZWxCSzsKKyAgICAgICAgICAgIHBhdGhTZWxCSy5BcHBlbmRSZWN0KHdvcmQucHRXb3JkLnggKyBwdE9mZnNldC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50ICsgcHRPZmZzZXQueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aCArIHB0T2Zmc2V0LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudCArIHB0T2Zmc2V0LnkpOwogCi0JCQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aFNlbEJLLCBwVXNlcjJEZXZpY2UsIE5VTEwsIGNyU2VsQkssIDAsIEZYRklMTF9XSU5ESU5HKTsKLQkJCQkJfQorICAgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGhTZWxCSywgcFVzZXIyRGV2aWNlLCBOVUxMLCBjclNlbEJLLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcpOworICAgICAgICAgIH0KIAotCQkJCQlpZiAocGxhY2UuTGluZUNtcChvbGRwbGFjZSkgIT0gMCB8fCB3b3JkLldvcmRQcm9wcy5mQ2hhclNwYWNlID4gMC4wZiB8fCB3b3JkLldvcmRQcm9wcy5uSG9yelNjYWxlICE9IDEwMCB8fAotCQkJCQkJRlhTWVNfbWVtY21wKCZ3b3JkLldvcmRQcm9wcywgJndwLCBzaXplb2YoQ1BWVF9Xb3JkUHJvcHMpKSAhPSAwIHx8Ci0JCQkJCQljck9sZCAhPSBjckN1clRleHQpCi0JCQkJCXsKLQkJCQkJCWlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApCi0JCQkJCQl7Ci0JCQkJCQkJRHJhd1RleHRTdHJpbmcocERldmljZSwgQ1BERl9Qb2ludChwdEJULngrcHRPZmZzZXQueCwgcHRCVC55K3B0T2Zmc2V0LnkpLCBwRm9udE1hcC0+R2V0UERGRm9udCh3cC5uRm9udEluZGV4KSwKLQkJCQkJCQkJd3AuZkZvbnRTaXplLCBwVXNlcjJEZXZpY2UsIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSwgY3JPbGQsIDAsIHdwLm5Ib3J6U2NhbGUpOworICAgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKG9sZHBsYWNlKSAhPSAwIHx8CisgICAgICAgICAgICAgIHdvcmQuV29yZFByb3BzLmZDaGFyU3BhY2UgPiAwLjBmIHx8CisgICAgICAgICAgICAgIHdvcmQuV29yZFByb3BzLm5Ib3J6U2NhbGUgIT0gMTAwIHx8CisgICAgICAgICAgICAgIEZYU1lTX21lbWNtcCgmd29yZC5Xb3JkUHJvcHMsICZ3cCwgc2l6ZW9mKENQVlRfV29yZFByb3BzKSkgIT0gMCB8fAorICAgICAgICAgICAgICBjck9sZCAhPSBjckN1clRleHQpIHsKKyAgICAgICAgICAgIGlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgRHJhd1RleHRTdHJpbmcoCisgICAgICAgICAgICAgICAgICBwRGV2aWNlLCBDUERGX1BvaW50KHB0QlQueCArIHB0T2Zmc2V0LngsIHB0QlQueSArIHB0T2Zmc2V0LnkpLAorICAgICAgICAgICAgICAgICAgcEZvbnRNYXAtPkdldFBERkZvbnQod3AubkZvbnRJbmRleCksIHdwLmZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgIHBVc2VyMkRldmljZSwgc1RleHRCdWYuR2V0Qnl0ZVN0cmluZygpLCBjck9sZCwgMCwKKyAgICAgICAgICAgICAgICAgIHdwLm5Ib3J6U2NhbGUpOwogCi0JCQkJCQkJc1RleHRCdWYuQ2xlYXIoKTsKLQkJCQkJCX0KLQkJCQkJCXdwID0gd29yZC5Xb3JkUHJvcHM7Ci0JCQkJCQlwdEJUID0gd29yZC5wdFdvcmQ7Ci0JCQkJCQljck9sZCA9IGNyQ3VyVGV4dDsKLQkJCQkJfQorICAgICAgICAgICAgICBzVGV4dEJ1Zi5DbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3AgPSB3b3JkLldvcmRQcm9wczsKKyAgICAgICAgICAgIHB0QlQgPSB3b3JkLnB0V29yZDsKKyAgICAgICAgICAgIGNyT2xkID0gY3JDdXJUZXh0OworICAgICAgICAgIH0KIAotCQkJCQlzVGV4dEJ1ZiA8PCBHZXRQREZXb3JkU3RyaW5nKHBGb250TWFwLCB3b3JkLldvcmRQcm9wcy5uRm9udEluZGV4LCB3b3JkLldvcmQsIDApOworICAgICAgICAgIHNUZXh0QnVmIDw8IEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIHdvcmQuV29yZFByb3BzLm5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLldvcmQsIDApOwogCi0JCQkJCWlmICh3b3JkLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpCi0JCQkJCXsKLQkJCQkJCUNGWF9QYXRoRGF0YSBwYXRoVW5kZXJsaW5lOwotCQkJCQkJQ1BERl9SZWN0IHJjVW5kZXJsaW5lID0gR2V0VW5kZXJMaW5lUmVjdCh3b3JkKTsKLQkJCQkJCXBhdGhVbmRlcmxpbmUuQXBwZW5kUmVjdChyY1VuZGVybGluZS5sZWZ0LCByY1VuZGVybGluZS5ib3R0b20sIHJjVW5kZXJsaW5lLnJpZ2h0LCByY1VuZGVybGluZS50b3ApOworICAgICAgICAgIGlmICh3b3JkLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpIHsKKyAgICAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoVW5kZXJsaW5lOworICAgICAgICAgICAgQ1BERl9SZWN0IHJjVW5kZXJsaW5lID0gR2V0VW5kZXJMaW5lUmVjdCh3b3JkKTsKKyAgICAgICAgICAgIHBhdGhVbmRlcmxpbmUuQXBwZW5kUmVjdChyY1VuZGVybGluZS5sZWZ0LCByY1VuZGVybGluZS5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNVbmRlcmxpbmUucmlnaHQsIHJjVW5kZXJsaW5lLnRvcCk7CiAKLQkJCQkJCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoVW5kZXJsaW5lLCBwVXNlcjJEZXZpY2UsIE5VTEwsIGNyQ3VyVGV4dCwgMCwgRlhGSUxMX1dJTkRJTkcpOwotCQkJCQl9CisgICAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aFVuZGVybGluZSwgcFVzZXIyRGV2aWNlLCBOVUxMLCBjckN1clRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORyk7CisgICAgICAgICAgfQogCi0JCQkJCWlmICh3b3JkLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkKLQkJCQkJewotCQkJCQkJQ0ZYX1BhdGhEYXRhIHBhdGhDcm9zc291dDsKLQkJCQkJCUNQREZfUmVjdCByY0Nyb3Nzb3V0ID0gR2V0Q3Jvc3NvdXRSZWN0KHdvcmQpOwotCQkJCQkJcGF0aENyb3Nzb3V0LkFwcGVuZFJlY3QocmNDcm9zc291dC5sZWZ0LCByY0Nyb3Nzb3V0LmJvdHRvbSwgcmNDcm9zc291dC5yaWdodCwgcmNDcm9zc291dC50b3ApOworICAgICAgICAgIGlmICh3b3JkLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgeworICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGhDcm9zc291dDsKKyAgICAgICAgICAgIENQREZfUmVjdCByY0Nyb3Nzb3V0ID0gR2V0Q3Jvc3NvdXRSZWN0KHdvcmQpOworICAgICAgICAgICAgcGF0aENyb3Nzb3V0LkFwcGVuZFJlY3QocmNDcm9zc291dC5sZWZ0LCByY0Nyb3Nzb3V0LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ3Jvc3NvdXQucmlnaHQsIHJjQ3Jvc3NvdXQudG9wKTsKIAotCQkJCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGhDcm9zc291dCwgcFVzZXIyRGV2aWNlLCBOVUxMLCBjckN1clRleHQsIDAsIEZYRklMTF9XSU5ESU5HKTsKLQkJCQkJfQorICAgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGhDcm9zc291dCwgcFVzZXIyRGV2aWNlLCBOVUxMLCBjckN1clRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORyk7CisgICAgICAgICAgfQogCi0JCQkJCW9sZHBsYWNlID0gcGxhY2U7Ci0JCQkJfQotCQkJfQorICAgICAgICAgIG9sZHBsYWNlID0gcGxhY2U7CisgICAgICAgIH0KKyAgICAgIH0KIAotCQkJaWYgKHNUZXh0QnVmLkdldExlbmd0aCgpID4gMCkKLQkJCXsKLQkJCQlEcmF3VGV4dFN0cmluZyhwRGV2aWNlLCBDUERGX1BvaW50KHB0QlQueCtwdE9mZnNldC54LCBwdEJULnkrcHRPZmZzZXQueSksIHBGb250TWFwLT5HZXRQREZGb250KHdwLm5Gb250SW5kZXgpLAotCQkJCQl3cC5mRm9udFNpemUsIHBVc2VyMkRldmljZSwgc1RleHRCdWYuR2V0Qnl0ZVN0cmluZygpLCBjck9sZCwgMCwgd3AubkhvcnpTY2FsZSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICBpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIERyYXdUZXh0U3RyaW5nKAorICAgICAgICAgICAgcERldmljZSwgQ1BERl9Qb2ludChwdEJULnggKyBwdE9mZnNldC54LCBwdEJULnkgKyBwdE9mZnNldC55KSwKKyAgICAgICAgICAgIHBGb250TWFwLT5HZXRQREZGb250KHdwLm5Gb250SW5kZXgpLCB3cC5mRm9udFNpemUsIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSwgY3JPbGQsIDAsIHdwLm5Ib3J6U2NhbGUpOworICAgICAgfQorICAgIH0KKyAgfQogCi0JcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogfQogCi1zdGF0aWMgdm9pZCBBZGRSZWN0VG9QYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9ianMsIEZYX0NPTE9SUkVGIGNyRmlsbCwgY29uc3QgQ1BERl9SZWN0JiByY0ZpbGwpCi17Ci0JQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiA9IG5ldyBDUERGX1BhdGhPYmplY3Q7Ci0JQ1BERl9QYXRoRGF0YSogcFBhdGhEYXRhID0gcFBhdGhPYmotPm1fUGF0aC5HZXRNb2RpZnkoKTsKLQlwUGF0aERhdGEtPkFwcGVuZFJlY3QocmNGaWxsLmxlZnQscmNGaWxsLmJvdHRvbSxyY0ZpbGwucmlnaHQscmNGaWxsLnRvcCk7CitzdGF0aWMgdm9pZCBBZGRSZWN0VG9QYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9ianMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0xPUlJFRiBjckZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjRmlsbCkgeworICBDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqID0gbmV3IENQREZfUGF0aE9iamVjdDsKKyAgQ1BERl9QYXRoRGF0YSogcFBhdGhEYXRhID0gcFBhdGhPYmotPm1fUGF0aC5HZXRNb2RpZnkoKTsKKyAgcFBhdGhEYXRhLT5BcHBlbmRSZWN0KHJjRmlsbC5sZWZ0LCByY0ZpbGwuYm90dG9tLCByY0ZpbGwucmlnaHQsIHJjRmlsbC50b3ApOwogCi0JRlhfRkxPQVQgcmdiWzNdOwotCXJnYlswXSA9IEZYQVJHQl9SKGNyRmlsbCkgLyAyNTUuMGYgOwotCXJnYlsxXSA9IEZYQVJHQl9HKGNyRmlsbCkgLyAyNTUuMGY7Ci0JcmdiWzJdID0gRlhBUkdCX0IoY3JGaWxsKSAvIDI1NS4wZjsKLQlwUGF0aE9iai0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcihDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKSwgcmdiLCAzKTsKKyAgRlhfRkxPQVQgcmdiWzNdOworICByZ2JbMF0gPSBGWEFSR0JfUihjckZpbGwpIC8gMjU1LjBmOworICByZ2JbMV0gPSBGWEFSR0JfRyhjckZpbGwpIC8gMjU1LjBmOworICByZ2JbMl0gPSBGWEFSR0JfQihjckZpbGwpIC8gMjU1LjBmOworICBwUGF0aE9iai0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcigKKyAgICAgIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpLCByZ2IsIDMpOwogCi0JcFBhdGhPYmotPm1fRmlsbFR5cGUgPSBGWEZJTExfQUxURVJOQVRFOwotCXBQYXRoT2JqLT5tX2JTdHJva2UgPSBGQUxTRTsKKyAgcFBhdGhPYmotPm1fRmlsbFR5cGUgPSBGWEZJTExfQUxURVJOQVRFOworICBwUGF0aE9iai0+bV9iU3Ryb2tlID0gRkFMU0U7CiAKLQlwUGFnZU9ianMtPkluc2VydE9iamVjdChwUGFnZU9ianMtPkdldExhc3RPYmplY3RQb3NpdGlvbigpLHBQYXRoT2JqKTsKKyAgcFBhZ2VPYmpzLT5JbnNlcnRPYmplY3QocFBhZ2VPYmpzLT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKSwgcFBhdGhPYmopOwogfQogCi1zdGF0aWMgQ1BERl9UZXh0T2JqZWN0KiBBZGRUZXh0T2JqVG9QYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9ianMsIEZYX0NPTE9SUkVGIGNyVGV4dCwKLQkJCQkJCQkgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9GTE9BVCBmQ2hhclNwYWNlLCBpbnQzMl90IG5Ib3J6U2NhbGUsCi0JCQkJCQkJIGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgdGV4dCkKLXsKLQlDUERGX1RleHRPYmplY3QqIHBUeHRPYmogPSBuZXcgQ1BERl9UZXh0T2JqZWN0Oworc3RhdGljIENQREZfVGV4dE9iamVjdCogQWRkVGV4dE9ialRvUGFnZU9iamVjdHMoQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09MT1JSRUYgY3JUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDaGFyU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Ib3J6U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiB0ZXh0KSB7CisgIENQREZfVGV4dE9iamVjdCogcFR4dE9iaiA9IG5ldyBDUERGX1RleHRPYmplY3Q7CiAKLQlDUERGX1RleHRTdGF0ZURhdGEqIHBUZXh0U3RhdGVEYXRhID0gcFR4dE9iai0+bV9UZXh0U3RhdGUuR2V0TW9kaWZ5KCk7Ci0JcFRleHRTdGF0ZURhdGEtPm1fcEZvbnQgPSBwRm9udDsKLQlwVGV4dFN0YXRlRGF0YS0+bV9Gb250U2l6ZSA9IGZGb250U2l6ZTsKLQlwVGV4dFN0YXRlRGF0YS0+bV9DaGFyU3BhY2UgPSBmQ2hhclNwYWNlOwotCXBUZXh0U3RhdGVEYXRhLT5tX1dvcmRTcGFjZSA9IDA7Ci0JcFRleHRTdGF0ZURhdGEtPm1fVGV4dE1vZGUgID0gMDsKLQlwVGV4dFN0YXRlRGF0YS0+bV9NYXRyaXhbMF0gPSBuSG9yelNjYWxlIC8gMTAwLjBmOwotCXBUZXh0U3RhdGVEYXRhLT5tX01hdHJpeFsxXSA9IDA7Ci0JcFRleHRTdGF0ZURhdGEtPm1fTWF0cml4WzJdID0gMDsKLQlwVGV4dFN0YXRlRGF0YS0+bV9NYXRyaXhbM10gPSAxOworICBDUERGX1RleHRTdGF0ZURhdGEqIHBUZXh0U3RhdGVEYXRhID0gcFR4dE9iai0+bV9UZXh0U3RhdGUuR2V0TW9kaWZ5KCk7CisgIHBUZXh0U3RhdGVEYXRhLT5tX3BGb250ID0gcEZvbnQ7CisgIHBUZXh0U3RhdGVEYXRhLT5tX0ZvbnRTaXplID0gZkZvbnRTaXplOworICBwVGV4dFN0YXRlRGF0YS0+bV9DaGFyU3BhY2UgPSBmQ2hhclNwYWNlOworICBwVGV4dFN0YXRlRGF0YS0+bV9Xb3JkU3BhY2UgPSAwOworICBwVGV4dFN0YXRlRGF0YS0+bV9UZXh0TW9kZSA9IDA7CisgIHBUZXh0U3RhdGVEYXRhLT5tX01hdHJpeFswXSA9IG5Ib3J6U2NhbGUgLyAxMDAuMGY7CisgIHBUZXh0U3RhdGVEYXRhLT5tX01hdHJpeFsxXSA9IDA7CisgIHBUZXh0U3RhdGVEYXRhLT5tX01hdHJpeFsyXSA9IDA7CisgIHBUZXh0U3RhdGVEYXRhLT5tX01hdHJpeFszXSA9IDE7CiAKLQlGWF9GTE9BVCByZ2JbM107Ci0JcmdiWzBdID0gRlhBUkdCX1IoY3JUZXh0KSAvIDI1NS4wZiA7Ci0JcmdiWzFdID0gRlhBUkdCX0coY3JUZXh0KSAvIDI1NS4wZjsKLQlyZ2JbMl0gPSBGWEFSR0JfQihjclRleHQpIC8gMjU1LjBmOwotCXBUeHRPYmotPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IoQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQikscmdiLCAzKTsKLQlwVHh0T2JqLT5tX0NvbG9yU3RhdGUuU2V0U3Ryb2tlQ29sb3IoQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQikscmdiLCAzKTsKKyAgRlhfRkxPQVQgcmdiWzNdOworICByZ2JbMF0gPSBGWEFSR0JfUihjclRleHQpIC8gMjU1LjBmOworICByZ2JbMV0gPSBGWEFSR0JfRyhjclRleHQpIC8gMjU1LjBmOworICByZ2JbMl0gPSBGWEFSR0JfQihjclRleHQpIC8gMjU1LjBmOworICBwVHh0T2JqLT5tX0NvbG9yU3RhdGUuU2V0RmlsbENvbG9yKAorICAgICAgQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQiksIHJnYiwgMyk7CisgIHBUeHRPYmotPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VDb2xvcigKKyAgICAgIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpLCByZ2IsIDMpOwogCi0JcFR4dE9iai0+U2V0UG9zaXRpb24ocG9pbnQueCxwb2ludC55KTsKLQlwVHh0T2JqLT5TZXRUZXh0KHRleHQpOworICBwVHh0T2JqLT5TZXRQb3NpdGlvbihwb2ludC54LCBwb2ludC55KTsKKyAgcFR4dE9iai0+U2V0VGV4dCh0ZXh0KTsKIAotCXBQYWdlT2Jqcy0+SW5zZXJ0T2JqZWN0KHBQYWdlT2Jqcy0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCkscFR4dE9iaik7CisgIHBQYWdlT2Jqcy0+SW5zZXJ0T2JqZWN0KHBQYWdlT2Jqcy0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCksIHBUeHRPYmopOwogCi0JcmV0dXJuIHBUeHRPYmo7CisgIHJldHVybiBwVHh0T2JqOwogfQogCi12b2lkIElGWF9FZGl0OjpHZW5lcmF0ZVBhZ2VPYmplY3RzKENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywgSUZYX0VkaXQqIHBFZGl0LAotCQkJCQkJCQkgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwgRlhfQ09MT1JSRUYgY3JUZXh0LCBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1RleHRPYmplY3QqPiYgT2JqQXJyYXkpCi17Ci0JRlhfRkxPQVQgZkZvbnRTaXplID0gcEVkaXQtPkdldEZvbnRTaXplKCk7Cit2b2lkIElGWF9FZGl0OjpHZW5lcmF0ZVBhZ2VPYmplY3RzKAorICAgIENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywKKyAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwKKyAgICBGWF9DT0xPUlJFRiBjclRleHQsCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9UZXh0T2JqZWN0Kj4mIE9iakFycmF5KSB7CisgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IHBFZGl0LT5HZXRGb250U2l6ZSgpOwogCi0JaW50MzJfdCBuT2xkRm9udEluZGV4ID0gLTE7CisgIGludDMyX3Qgbk9sZEZvbnRJbmRleCA9IC0xOwogCi0JQ0ZYX0J5dGVUZXh0QnVmIHNUZXh0QnVmOwotCUNQREZfUG9pbnQgcHRCVCgwLjBmLDAuMGYpOworICBDRlhfQnl0ZVRleHRCdWYgc1RleHRCdWY7CisgIENQREZfUG9pbnQgcHRCVCgwLjBmLCAwLjBmKTsKIAotCU9iakFycmF5LlJlbW92ZUFsbCgpOworICBPYmpBcnJheS5SZW1vdmVBbGwoKTsKIAotCWlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gcEVkaXQtPkdldEl0ZXJhdG9yKCkpCi0JewotCQlpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBwRWRpdC0+R2V0Rm9udE1hcCgpKQotCQl7Ci0JCQlpZiAocFJhbmdlKQotCQkJCXBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7Ci0JCQllbHNlCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdCgwKTsKKyAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgIGlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IHBFZGl0LT5HZXRGb250TWFwKCkpIHsKKyAgICAgIGlmIChwUmFuZ2UpCisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7CisgICAgICBlbHNlCisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQoMCk7CiAKLQkJCUNQVlRfV29yZFBsYWNlIG9sZHBsYWNlOworICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7CiAKLQkJCXdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCi0JCQl7Ci0JCQkJQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0JCQkJaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApIGJyZWFrOworICAgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgeworICAgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgICAgaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApCisgICAgICAgICAgYnJlYWs7CiAKLQkJCQlDUFZUX1dvcmQgd29yZDsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCXsKLQkJCQkJaWYgKHBsYWNlLkxpbmVDbXAob2xkcGxhY2UpICE9IDAgfHwgbk9sZEZvbnRJbmRleCAhPSB3b3JkLm5Gb250SW5kZXgpCi0JCQkJCXsKLQkJCQkJCWlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApCi0JCQkJCQl7Ci0JCQkJCQkJT2JqQXJyYXkuQWRkKEFkZFRleHRPYmpUb1BhZ2VPYmplY3RzKHBQYWdlT2JqZWN0cywgY3JUZXh0LCBwRm9udE1hcC0+R2V0UERGRm9udChuT2xkRm9udEluZGV4KSwgZkZvbnRTaXplLCAwLjBmLCAxMDAsCi0JCQkJCQkJCUNQREZfUG9pbnQocHRCVC54K3B0T2Zmc2V0LngsIHB0QlQueStwdE9mZnNldC55KSwgc1RleHRCdWYuR2V0Qnl0ZVN0cmluZygpKSk7CisgICAgICAgIENQVlRfV29yZCB3b3JkOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgaWYgKHBsYWNlLkxpbmVDbXAob2xkcGxhY2UpICE9IDAgfHwKKyAgICAgICAgICAgICAgbk9sZEZvbnRJbmRleCAhPSB3b3JkLm5Gb250SW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgT2JqQXJyYXkuQWRkKEFkZFRleHRPYmpUb1BhZ2VPYmplY3RzKAorICAgICAgICAgICAgICAgICAgcFBhZ2VPYmplY3RzLCBjclRleHQsIHBGb250TWFwLT5HZXRQREZGb250KG5PbGRGb250SW5kZXgpLAorICAgICAgICAgICAgICAgICAgZkZvbnRTaXplLCAwLjBmLCAxMDAsCisgICAgICAgICAgICAgICAgICBDUERGX1BvaW50KHB0QlQueCArIHB0T2Zmc2V0LngsIHB0QlQueSArIHB0T2Zmc2V0LnkpLAorICAgICAgICAgICAgICAgICAgc1RleHRCdWYuR2V0Qnl0ZVN0cmluZygpKSk7CiAKLQkJCQkJCQlzVGV4dEJ1Zi5DbGVhcigpOwotCQkJCQkJfQorICAgICAgICAgICAgICBzVGV4dEJ1Zi5DbGVhcigpOworICAgICAgICAgICAgfQogCi0JCQkJCQlwdEJUID0gd29yZC5wdFdvcmQ7Ci0JCQkJCQluT2xkRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OwotCQkJCQl9CisgICAgICAgICAgICBwdEJUID0gd29yZC5wdFdvcmQ7CisgICAgICAgICAgICBuT2xkRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OworICAgICAgICAgIH0KIAotCQkJCQlzVGV4dEJ1ZiA8PCBHZXRQREZXb3JkU3RyaW5nKHBGb250TWFwLCB3b3JkLm5Gb250SW5kZXgsIHdvcmQuV29yZCwgMCk7Ci0JCQkJCW9sZHBsYWNlID0gcGxhY2U7Ci0JCQkJfQotCQkJfQorICAgICAgICAgIHNUZXh0QnVmIDw8IEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIHdvcmQubkZvbnRJbmRleCwgd29yZC5Xb3JkLCAwKTsKKyAgICAgICAgICBvbGRwbGFjZSA9IHBsYWNlOworICAgICAgICB9CisgICAgICB9CiAKLQkJCWlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJT2JqQXJyYXkuQWRkKEFkZFRleHRPYmpUb1BhZ2VPYmplY3RzKHBQYWdlT2JqZWN0cywgY3JUZXh0LCBwRm9udE1hcC0+R2V0UERGRm9udChuT2xkRm9udEluZGV4KSwgZkZvbnRTaXplLCAwLjBmLCAxMDAsCi0JCQkJCUNQREZfUG9pbnQocHRCVC54K3B0T2Zmc2V0LngsIHB0QlQueStwdE9mZnNldC55KSwgc1RleHRCdWYuR2V0Qnl0ZVN0cmluZygpKSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICBpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIE9iakFycmF5LkFkZChBZGRUZXh0T2JqVG9QYWdlT2JqZWN0cygKKyAgICAgICAgICAgIHBQYWdlT2JqZWN0cywgY3JUZXh0LCBwRm9udE1hcC0+R2V0UERGRm9udChuT2xkRm9udEluZGV4KSwKKyAgICAgICAgICAgIGZGb250U2l6ZSwgMC4wZiwgMTAwLAorICAgICAgICAgICAgQ1BERl9Qb2ludChwdEJULnggKyBwdE9mZnNldC54LCBwdEJULnkgKyBwdE9mZnNldC55KSwKKyAgICAgICAgICAgIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSkpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi12b2lkIElGWF9FZGl0OjpHZW5lcmF0ZVJpY2hQYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsIElGWF9FZGl0KiBwRWRpdCwKLQkJCQkJCQkJICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsIENGWF9BcnJheVRlbXBsYXRlPENQREZfVGV4dE9iamVjdCo+JiBPYmpBcnJheSkKLXsKK3ZvaWQgSUZYX0VkaXQ6OkdlbmVyYXRlUmljaFBhZ2VPYmplY3RzKAorICAgIENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywKKyAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwKKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1RleHRPYmplY3QqPiYgT2JqQXJyYXkpIHsKKyAgRlhfQ09MT1JSRUYgY3JDdXJUZXh0ID0gQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApOworICBGWF9DT0xPUlJFRiBjck9sZCA9IGNyQ3VyVGV4dDsKIAorICBDRlhfQnl0ZVRleHRCdWYgc1RleHRCdWY7CisgIENQVlRfV29yZFByb3BzIHdwOworICBDUERGX1BvaW50IHB0QlQoMC4wZiwgMC4wZik7CiAKLQlGWF9DT0xPUlJFRiBjckN1clRleHQgPSBBcmdiRW5jb2RlKDI1NSwgMCwgMCwgMCk7Ci0JRlhfQ09MT1JSRUYgY3JPbGQgPSBjckN1clRleHQ7CisgIE9iakFycmF5LlJlbW92ZUFsbCgpOwogCisgIGlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gcEVkaXQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICBpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBwRWRpdC0+R2V0Rm9udE1hcCgpKSB7CisgICAgICBpZiAocFJhbmdlKQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOworICAgICAgZWxzZQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KDApOwogCi0JQ0ZYX0J5dGVUZXh0QnVmIHNUZXh0QnVmOwotCUNQVlRfV29yZFByb3BzIHdwOwotCUNQREZfUG9pbnQgcHRCVCgwLjBmLDAuMGYpOworICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7CiAKLQlPYmpBcnJheS5SZW1vdmVBbGwoKTsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgIGlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKQorICAgICAgICAgIGJyZWFrOwogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCWlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IHBFZGl0LT5HZXRGb250TWFwKCkpCi0JCXsKLQkJCWlmIChwUmFuZ2UpCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKLQkJCWVsc2UKLQkJCQlwSXRlcmF0b3ItPlNldEF0KDApOworICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIHdvcmQuV29yZFByb3BzLmZGb250U2l6ZSA9IHdvcmQuZkZvbnRTaXplOwogCi0JCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKKyAgICAgICAgICBjckN1clRleHQgPSBBcmdiRW5jb2RlKDI1NSwgd29yZC5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IpOwogCi0JCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQotCQkJewotCQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCQkJCWlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKSBicmVhazsKKyAgICAgICAgICBpZiAocGxhY2UuTGluZUNtcChvbGRwbGFjZSkgIT0gMCB8fAorICAgICAgICAgICAgICB3b3JkLldvcmRQcm9wcy5mQ2hhclNwYWNlID4gMC4wZiB8fAorICAgICAgICAgICAgICB3b3JkLldvcmRQcm9wcy5uSG9yelNjYWxlICE9IDEwMCB8fAorICAgICAgICAgICAgICBGWFNZU19tZW1jbXAoJndvcmQuV29yZFByb3BzLCAmd3AsIHNpemVvZihDUFZUX1dvcmRQcm9wcykpICE9IDAgfHwKKyAgICAgICAgICAgICAgY3JPbGQgIT0gY3JDdXJUZXh0KSB7CisgICAgICAgICAgICBpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgIE9iakFycmF5LkFkZChBZGRUZXh0T2JqVG9QYWdlT2JqZWN0cygKKyAgICAgICAgICAgICAgICAgIHBQYWdlT2JqZWN0cywgY3JPbGQsIHBGb250TWFwLT5HZXRQREZGb250KHdwLm5Gb250SW5kZXgpLAorICAgICAgICAgICAgICAgICAgd3AuZkZvbnRTaXplLCB3cC5mQ2hhclNwYWNlLCB3cC5uSG9yelNjYWxlLAorICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChwdEJULnggKyBwdE9mZnNldC54LCBwdEJULnkgKyBwdE9mZnNldC55KSwKKyAgICAgICAgICAgICAgICAgIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSkpOwogCi0JCQkJQ1BWVF9Xb3JkIHdvcmQ7Ci0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJCQl7Ci0JCQkJCXdvcmQuV29yZFByb3BzLmZGb250U2l6ZSA9IHdvcmQuZkZvbnRTaXplOworICAgICAgICAgICAgICBzVGV4dEJ1Zi5DbGVhcigpOworICAgICAgICAgICAgfQogCi0JCQkJCWNyQ3VyVGV4dCA9IEFyZ2JFbmNvZGUoMjU1LHdvcmQuV29yZFByb3BzLmR3V29yZENvbG9yKTsKKyAgICAgICAgICAgIHdwID0gd29yZC5Xb3JkUHJvcHM7CisgICAgICAgICAgICBwdEJUID0gd29yZC5wdFdvcmQ7CisgICAgICAgICAgICBjck9sZCA9IGNyQ3VyVGV4dDsKKyAgICAgICAgICB9CiAKLQkJCQkJaWYgKHBsYWNlLkxpbmVDbXAob2xkcGxhY2UpICE9IDAgfHwgd29yZC5Xb3JkUHJvcHMuZkNoYXJTcGFjZSA+IDAuMGYgfHwgd29yZC5Xb3JkUHJvcHMubkhvcnpTY2FsZSAhPSAxMDAgfHwKLQkJCQkJCUZYU1lTX21lbWNtcCgmd29yZC5Xb3JkUHJvcHMsICZ3cCwgc2l6ZW9mKENQVlRfV29yZFByb3BzKSkgIT0gMCB8fAotCQkJCQkJY3JPbGQgIT0gY3JDdXJUZXh0KQotCQkJCQl7Ci0JCQkJCQlpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKQotCQkJCQkJewotCQkJCQkJCU9iakFycmF5LkFkZChBZGRUZXh0T2JqVG9QYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsIGNyT2xkLCBwRm9udE1hcC0+R2V0UERGRm9udCh3cC5uRm9udEluZGV4KSwgd3AuZkZvbnRTaXplLCB3cC5mQ2hhclNwYWNlLCB3cC5uSG9yelNjYWxlLAotCQkJCQkJCQlDUERGX1BvaW50KHB0QlQueCtwdE9mZnNldC54LCBwdEJULnkrcHRPZmZzZXQueSksIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSkpOworICAgICAgICAgIHNUZXh0QnVmIDw8IEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIHdvcmQuV29yZFByb3BzLm5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLldvcmQsIDApOwogCi0JCQkJCQkJc1RleHRCdWYuQ2xlYXIoKTsKLQkJCQkJCX0KLQotCQkJCQkJd3AgPSB3b3JkLldvcmRQcm9wczsKLQkJCQkJCXB0QlQgPSB3b3JkLnB0V29yZDsKLQkJCQkJCWNyT2xkID0gY3JDdXJUZXh0OwotCi0JCQkJCX0KLQotCQkJCQlzVGV4dEJ1ZiA8PCBHZXRQREZXb3JkU3RyaW5nKHBGb250TWFwLCB3b3JkLldvcmRQcm9wcy5uRm9udEluZGV4LCB3b3JkLldvcmQsIDApOwotCi0JCQkJCWlmICh3b3JkLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpCi0JCQkJCXsvKgotCQkJCQkJQWRkTGluZVRvUGFnZU9iamVjdHMocFBhZ2VPYmplY3RzLCBjckN1clRleHQsCi0JCQkJCQkJQ1BERl9Qb2ludCh3b3JkLnB0V29yZC54LCB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudCAqIDAuNGYpLAotCQkJCQkJCUNQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoLCB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudCAqIDAuNGYpKTsKKyAgICAgICAgICBpZiAod29yZC5Xb3JkUHJvcHMubldvcmRTdHlsZSAmCisgICAgICAgICAgICAgIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKSB7IC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRMaW5lVG9QYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQ3VyVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludCh3b3JkLnB0V29yZC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BvaW50KHdvcmQucHRXb3JkLngKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3b3JkLmZXaWR0aCwgd29yZC5wdFdvcmQueSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQuZkRlc2NlbnQgKiAwLjRmKSk7CiAqLwotCQkJCQkJQ1BERl9SZWN0IHJjVW5kZXJsaW5lID0gR2V0VW5kZXJMaW5lUmVjdCh3b3JkKTsKLQkJCQkJCXJjVW5kZXJsaW5lLmxlZnQgKz0gcHRPZmZzZXQueDsKLQkJCQkJCXJjVW5kZXJsaW5lLnJpZ2h0ICs9IHB0T2Zmc2V0Lng7Ci0JCQkJCQlyY1VuZGVybGluZS50b3AgKz0gcHRPZmZzZXQueTsKLQkJCQkJCXJjVW5kZXJsaW5lLmJvdHRvbSArPSBwdE9mZnNldC55OworICAgICAgICAgICAgQ1BERl9SZWN0IHJjVW5kZXJsaW5lID0gR2V0VW5kZXJMaW5lUmVjdCh3b3JkKTsKKyAgICAgICAgICAgIHJjVW5kZXJsaW5lLmxlZnQgKz0gcHRPZmZzZXQueDsKKyAgICAgICAgICAgIHJjVW5kZXJsaW5lLnJpZ2h0ICs9IHB0T2Zmc2V0Lng7CisgICAgICAgICAgICByY1VuZGVybGluZS50b3AgKz0gcHRPZmZzZXQueTsKKyAgICAgICAgICAgIHJjVW5kZXJsaW5lLmJvdHRvbSArPSBwdE9mZnNldC55OwogCi0JCQkJCQlBZGRSZWN0VG9QYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsIGNyQ3VyVGV4dCwgcmNVbmRlcmxpbmUpOwotCQkJCQl9CisgICAgICAgICAgICBBZGRSZWN0VG9QYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsIGNyQ3VyVGV4dCwgcmNVbmRlcmxpbmUpOworICAgICAgICAgIH0KIAotCQkJCQlpZiAod29yZC5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpCi0JCQkJCXsKLQkJCQkJCUNQREZfUmVjdCByY0Nyb3Nzb3V0ID0gR2V0Q3Jvc3NvdXRSZWN0KHdvcmQpOwotCQkJCQkJcmNDcm9zc291dC5sZWZ0ICs9IHB0T2Zmc2V0Lng7Ci0JCQkJCQlyY0Nyb3Nzb3V0LnJpZ2h0ICs9IHB0T2Zmc2V0Lng7Ci0JCQkJCQlyY0Nyb3Nzb3V0LnRvcCArPSBwdE9mZnNldC55OwotCQkJCQkJcmNDcm9zc291dC5ib3R0b20gKz0gcHRPZmZzZXQueTsKKyAgICAgICAgICBpZiAod29yZC5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpIHsKKyAgICAgICAgICAgIENQREZfUmVjdCByY0Nyb3Nzb3V0ID0gR2V0Q3Jvc3NvdXRSZWN0KHdvcmQpOworICAgICAgICAgICAgcmNDcm9zc291dC5sZWZ0ICs9IHB0T2Zmc2V0Lng7CisgICAgICAgICAgICByY0Nyb3Nzb3V0LnJpZ2h0ICs9IHB0T2Zmc2V0Lng7CisgICAgICAgICAgICByY0Nyb3Nzb3V0LnRvcCArPSBwdE9mZnNldC55OworICAgICAgICAgICAgcmNDcm9zc291dC5ib3R0b20gKz0gcHRPZmZzZXQueTsKIAotCQkJCQkJQWRkUmVjdFRvUGFnZU9iamVjdHMocFBhZ2VPYmplY3RzLCBjckN1clRleHQsIHJjQ3Jvc3NvdXQpOwotCQkJCQl9CisgICAgICAgICAgICBBZGRSZWN0VG9QYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsIGNyQ3VyVGV4dCwgcmNDcm9zc291dCk7CisgICAgICAgICAgfQogCi0JCQkJCW9sZHBsYWNlID0gcGxhY2U7Ci0JCQkJfQotCQkJfQorICAgICAgICAgIG9sZHBsYWNlID0gcGxhY2U7CisgICAgICAgIH0KKyAgICAgIH0KIAotCQkJaWYgKHNUZXh0QnVmLkdldExlbmd0aCgpID4gMCkKLQkJCXsKLQkJCQlPYmpBcnJheS5BZGQoQWRkVGV4dE9ialRvUGFnZU9iamVjdHMocFBhZ2VPYmplY3RzLCBjck9sZCwgcEZvbnRNYXAtPkdldFBERkZvbnQod3AubkZvbnRJbmRleCksIHdwLmZGb250U2l6ZSwgd3AuZkNoYXJTcGFjZSwgd3AubkhvcnpTY2FsZSwKLQkJCQkJQ1BERl9Qb2ludChwdEJULngrcHRPZmZzZXQueCwgcHRCVC55K3B0T2Zmc2V0LnkpLCBzVGV4dEJ1Zi5HZXRCeXRlU3RyaW5nKCkpKTsKLQkJCX0KLQkJfQotCX0KKyAgICAgIGlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgT2JqQXJyYXkuQWRkKEFkZFRleHRPYmpUb1BhZ2VPYmplY3RzKAorICAgICAgICAgICAgcFBhZ2VPYmplY3RzLCBjck9sZCwgcEZvbnRNYXAtPkdldFBERkZvbnQod3AubkZvbnRJbmRleCksCisgICAgICAgICAgICB3cC5mRm9udFNpemUsIHdwLmZDaGFyU3BhY2UsIHdwLm5Ib3J6U2NhbGUsCisgICAgICAgICAgICBDUERGX1BvaW50KHB0QlQueCArIHB0T2Zmc2V0LngsIHB0QlQueSArIHB0T2Zmc2V0LnkpLAorICAgICAgICAgICAgc1RleHRCdWYuR2V0Qnl0ZVN0cmluZygpKSk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgSUZYX0VkaXQ6OkdlbmVyYXRlVW5kZXJsaW5lT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsIElGWF9FZGl0KiBwRWRpdCwKLQkJCQkJCQkJICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsIEZYX0NPTE9SUkVGIGNvbG9yKQotewordm9pZCBJRlhfRWRpdDo6R2VuZXJhdGVVbmRlcmxpbmVPYmplY3RzKENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0xPUlJFRiBjb2xvcikgeworICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgaWYgKHBFZGl0LT5HZXRGb250TWFwKCkpIHsKKyAgICAgIGlmIChwUmFuZ2UpCisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7CisgICAgICBlbHNlCisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQoMCk7CiAKKyAgICAgIENQVlRfV29yZFBsYWNlIG9sZHBsYWNlOwogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCWlmIChwRWRpdC0+R2V0Rm9udE1hcCgpKQotCQl7Ci0JCQlpZiAocFJhbmdlKQotCQkJCXBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7Ci0JCQllbHNlCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdCgwKTsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgIGlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKQorICAgICAgICAgIGJyZWFrOwogCi0JCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKLQotCQkJd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLQkJCXsKLQkJCQlDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLQkJCQlpZiAocFJhbmdlICYmIHBsYWNlLldvcmRDbXAocFJhbmdlLT5FbmRQb3MpID4gMCkgYnJlYWs7Ci0KLQkJCQlDUFZUX1dvcmQgd29yZDsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCXsKLQkJCQkJQ1BERl9SZWN0IHJjVW5kZXJsaW5lID0gR2V0VW5kZXJMaW5lUmVjdCh3b3JkKTsKLQkJCQkJcmNVbmRlcmxpbmUubGVmdCArPSBwdE9mZnNldC54OwotCQkJCQlyY1VuZGVybGluZS5yaWdodCArPSBwdE9mZnNldC54OwotCQkJCQlyY1VuZGVybGluZS50b3AgKz0gcHRPZmZzZXQueTsKLQkJCQkJcmNVbmRlcmxpbmUuYm90dG9tICs9IHB0T2Zmc2V0Lnk7Ci0JCQkJCUFkZFJlY3RUb1BhZ2VPYmplY3RzKHBQYWdlT2JqZWN0cywgY29sb3IsIHJjVW5kZXJsaW5lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIENQVlRfV29yZCB3b3JkOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgQ1BERl9SZWN0IHJjVW5kZXJsaW5lID0gR2V0VW5kZXJMaW5lUmVjdCh3b3JkKTsKKyAgICAgICAgICByY1VuZGVybGluZS5sZWZ0ICs9IHB0T2Zmc2V0Lng7CisgICAgICAgICAgcmNVbmRlcmxpbmUucmlnaHQgKz0gcHRPZmZzZXQueDsKKyAgICAgICAgICByY1VuZGVybGluZS50b3AgKz0gcHRPZmZzZXQueTsKKyAgICAgICAgICByY1VuZGVybGluZS5ib3R0b20gKz0gcHRPZmZzZXQueTsKKyAgICAgICAgICBBZGRSZWN0VG9QYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsIGNvbG9yLCByY1VuZGVybGluZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Db25zdHMuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Db25zdHMuY3BwCmluZGV4IDllZGI2ZjQuLmNhOGQ3ODcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvQ29uc3RzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0NvbnN0cy5jcHAKQEAgLTE0LDIzNCArMTQsMjUxIEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYm9yZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX0JvcmRlcikKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKHMsCXNvbGlkKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoYiwJYmV2ZWxlZCkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKGQsCWRhc2hlZCkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKGksCWluc2V0KQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcodSwJdW5kZXJsaW5lKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhzLCBzb2xpZCkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoYiwgYmV2ZWxlZCkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoZCwgZGFzaGVkKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhpLCBpbnNldCkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcodSwgdW5kZXJsaW5lKQogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKLUlNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfQm9yZGVyLGJvcmRlcikKK0lNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfQm9yZGVyLCBib3JkZXIpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkaXNwbGF5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX0Rpc3BsYXkpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUih2aXNpYmxlLAkwKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoaGlkZGVuLAkxKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIobm9QcmludCwJMikKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKG5vVmlldywJMykKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIodmlzaWJsZSwgMCkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoaGlkZGVuLCAxKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihub1ByaW50LCAyKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihub1ZpZXcsIDMpCiBFTkRfSlNfU1RBVElDX0NPTlNUKCkKIAotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19EaXNwbGF5LGRpc3BsYXkpCitJTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1QoQ0pTX0Rpc3BsYXksIGRpc3BsYXkpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmb250IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX0ZvbnQpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhUaW1lcywJCVRpbWVzLVJvbWFuKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoVGltZXNCLAlUaW1lcy1Cb2xkKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoVGltZXNJLAlUaW1lcy1JdGFsaWMpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhUaW1lc0JJLAlUaW1lcy1Cb2xkSXRhbGljKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoSGVsdiwJCUhlbHZldGljYSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEhlbHZCLAkJSGVsdmV0aWNhLUJvbGQpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhIZWx2SSwJCUhlbHZldGljYS1PYmxpcXVlKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoSGVsdkJJLAlIZWx2ZXRpY2EtQm9sZE9ibGlxdWUpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhDb3VyLAkJQ291cmllcikKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKENvdXJCLAkJQ291cmllci1Cb2xkKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoQ291ckksCQlDb3VyaWVyLU9ibGlxdWUpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhDb3VyQkksCUNvdXJpZXItQm9sZE9ibGlxdWUpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhTeW1ib2wsCVN5bWJvbCkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKFphcGZELAkJWmFwZkRpbmdiYXRzKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhUaW1lcywgVGltZXMtUm9tYW4pCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKFRpbWVzQiwgVGltZXMtQm9sZCkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoVGltZXNJLCBUaW1lcy1JdGFsaWMpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKFRpbWVzQkksIFRpbWVzLUJvbGRJdGFsaWMpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEhlbHYsIEhlbHZldGljYSkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoSGVsdkIsIEhlbHZldGljYS1Cb2xkKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhIZWx2SSwgSGVsdmV0aWNhLU9ibGlxdWUpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEhlbHZCSSwgSGVsdmV0aWNhLUJvbGRPYmxpcXVlKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhDb3VyLCBDb3VyaWVyKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhDb3VyQiwgQ291cmllci1Cb2xkKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhDb3VySSwgQ291cmllci1PYmxpcXVlKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhDb3VyQkksIENvdXJpZXItQm9sZE9ibGlxdWUpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKFN5bWJvbCwgU3ltYm9sKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhaYXBmRCwgWmFwZkRpbmdiYXRzKQogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKLUlNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfRm9udCxmb250KQorSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19Gb250LCBmb250KQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGlnaGxpZ2h0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX0hpZ2hsaWdodCkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKG4sCW5vbmUpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhpLAlpbnZlcnQpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhwLAlwdXNoKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcobywJb3V0bGluZSkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcobiwgbm9uZSkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoaSwgaW52ZXJ0KQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhwLCBwdXNoKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhvLCBvdXRsaW5lKQogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKLUlNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfSGlnaGxpZ2h0LGhpZ2hsaWdodCkKK0lNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfSGlnaGxpZ2h0LCBoaWdobGlnaHQpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwb3NpdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogQkVHSU5fSlNfU1RBVElDX0NPTlNUKENKU19Qb3NpdGlvbikKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKHRleHRPbmx5LAkJMCkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKGljb25Pbmx5LAkJMSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKGljb25UZXh0ViwJCTIpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUih0ZXh0SWNvblYsCQkzKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoaWNvblRleHRILAkJNCkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKHRleHRJY29uSCwJCTUpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihvdmVybGF5LAkJNikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIodGV4dE9ubHksIDApCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKGljb25Pbmx5LCAxKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihpY29uVGV4dFYsIDIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKHRleHRJY29uViwgMykKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoaWNvblRleHRILCA0KQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUih0ZXh0SWNvbkgsIDUpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKG92ZXJsYXksIDYpCiBFTkRfSlNfU1RBVElDX0NPTlNUKCkKIAotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19Qb3NpdGlvbixwb3NpdGlvbikKK0lNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfUG9zaXRpb24sIHBvc2l0aW9uKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2NhbGVIb3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIEJFR0lOX0pTX1NUQVRJQ19DT05TVChDSlNfU2NhbGVIb3cpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihwcm9wb3J0aW9uYWwsCTApCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihhbmFtb3JwaGljLAkxKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihwcm9wb3J0aW9uYWwsIDApCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKGFuYW1vcnBoaWMsIDEpCiBFTkRfSlNfU1RBVElDX0NPTlNUKCkKIAotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19TY2FsZUhvdyxzY2FsZUhvdykKK0lNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfU2NhbGVIb3csIHNjYWxlSG93KQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2NhbGVXaGVuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX1NjYWxlV2hlbikKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKGFsd2F5cywJMCkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKG5ldmVyLAkJMSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKHRvb0JpZywJMikKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKHRvb1NtYWxsLAkzKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihhbHdheXMsIDApCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKG5ldmVyLCAxKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUih0b29CaWcsIDIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKHRvb1NtYWxsLCAzKQogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKLUlNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfU2NhbGVXaGVuLHNjYWxlV2hlbikKK0lNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfU2NhbGVXaGVuLCBzY2FsZVdoZW4pCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdHlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogQkVHSU5fSlNfU1RBVElDX0NPTlNUKENKU19TdHlsZSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKGNoLAljaGVjaykKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKGNyLAljcm9zcykKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKGRpLAlkaWFtb25kKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoY2ksCWNpcmNsZSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKHN0LAlzdGFyKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoc3EsCXNxdWFyZSkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoY2gsIGNoZWNrKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhjciwgY3Jvc3MpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKGRpLCBkaWFtb25kKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhjaSwgY2lyY2xlKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhzdCwgc3RhcikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoc3EsIHNxdWFyZSkKIEVORF9KU19TVEFUSUNfQ09OU1QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1QoQ0pTX1N0eWxlLHN0eWxlKQotCitJTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1QoQ0pTX1N0eWxlLCBzdHlsZSkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHpvb210eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX1pvb210eXBlKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcobm9uZSwJTm9WYXJ5KQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoZml0UCwJRml0UGFnZSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKGZpdFcsCUZpdFdpZHRoKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoZml0SCwJRml0SGVpZ2h0KQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoZml0ViwJRml0VmlzaWJsZVdpZHRoKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcocHJlZiwJUHJlZmVycmVkKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcocmVmVywJUmVmbG93V2lkdGgpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKG5vbmUsIE5vVmFyeSkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoZml0UCwgRml0UGFnZSkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoZml0VywgRml0V2lkdGgpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKGZpdEgsIEZpdEhlaWdodCkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoZml0ViwgRml0VmlzaWJsZVdpZHRoKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhwcmVmLCBQcmVmZXJyZWQpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKHJlZlcsIFJlZmxvd1dpZHRoKQogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKLUlNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfWm9vbXR5cGUsem9vbXR5cGUpCitJTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1QoQ0pTX1pvb210eXBlLCB6b29tdHlwZSkKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19HbG9iYWxDb25zdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX0dsb2JhbENvbnN0cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWludAlDSlNfR2xvYmFsQ29uc3RzOjpJbml0KElKU19SdW50aW1lKiBwUnVudGltZSkKLXsKLQlERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBJRFNfR1JFQVRFUl9USEFOICwgSW52YWxpZCB2YWx1ZTogbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMuKTsKLQlERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBJRFNfR1RfQU5EX0xULEludmFsaWQgdmFsdWU6IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMuKTsKLQlERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBJRFNfTEVTU19USEFOLEludmFsaWQgdmFsdWU6IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzLik7Ci0JREVGSU5FX0dMT0JBTF9DT05TVChwUnVudGltZSwgSURTX0lOVkFMSURfTU9OVEgsKiogSW52YWxpZCAqKik7Ci0JREVGSU5FX0dMT0JBTF9DT05TVChwUnVudGltZSwgSURTX0lOVkFMSURfREFURSxJbnZhbGlkIGRhdGUvdGltZTogcGxlYXNlIGVuc3VyZSB0aGF0IHRoZSBkYXRlL3RpbWUgZXhpc3RzLiBGaWVsZCk7Ci0JREVGSU5FX0dMT0JBTF9DT05TVChwUnVudGltZSwgSURTX0lOVkFMSURfVkFMVUUsVGhlIHZhbHVlIGVudGVyZWQgZG9lcyBub3QgbWF0Y2ggdGhlIGZvcm1hdCBvZiB0aGUgZmllbGQpOwotCURFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIElEU19BTSxhbSk7Ci0JREVGSU5FX0dMT0JBTF9DT05TVChwUnVudGltZSwgSURTX1BNLHBtKTsKLQlERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBJRFNfTU9OVEhfSU5GTyxKYW51YXJ5WzFdRmVicnVhcnlbMl1NYXJjaFszXUFwcmlsWzRdTWF5WzVdSnVuZVs2XUp1bHlbN11BdWd1c3RbOF1TZXB0ZW1iZXJbOV1PY3RvYmVyWzEwXU5vdmVtYmVyWzExXURlY2VtYmVyWzEyXVNlcHRbOV1KYW5bMV1GZWJbMl1NYXJbM11BcHJbNF1KdW5bNl1KdWxbN11BdWdbOF1TZXBbOV1PY3RbMTBdTm92WzExXURlY1sxMl0pOwotCURFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIElEU19TVEFSVFVQX0NPTlNPTEVfTVNHLCAqKiBeX14gKiopOworaW50IENKU19HbG9iYWxDb25zdHM6OkluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIERFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIElEU19HUkVBVEVSX1RIQU4sIEludmFsaWQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICA6IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICUgcy4pOworICBERUZJTkVfR0xPQkFMX0NPTlNUKAorICAgICAgcFJ1bnRpbWUsIElEU19HVF9BTkRfTFQsIEludmFsaWQgdmFsdWUKKyAgICAgIDogbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJSBzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJSBzLik7CisgIERFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIElEU19MRVNTX1RIQU4sIEludmFsaWQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICA6IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICUgcy4pOworICBERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBJRFNfSU5WQUxJRF9NT05USCwgKipJbnZhbGlkKiopOworICBERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBJRFNfSU5WQUxJRF9EQVRFLCBJbnZhbGlkIGRhdGUgLyB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgOiBwbGVhc2UgZW5zdXJlIHRoYXQgdGhlIGRhdGUgLyB0aW1lIGV4aXN0cy5GaWVsZCk7CisgIERFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIElEU19JTlZBTElEX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBlbnRlcmVkIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXQgb2YgdGhlIGZpZWxkKTsKKyAgREVGSU5FX0dMT0JBTF9DT05TVChwUnVudGltZSwgSURTX0FNLCBhbSk7CisgIERFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIElEU19QTSwgcG0pOworICBERUZJTkVfR0xPQkFMX0NPTlNUKAorICAgICAgcFJ1bnRpbWUsIElEU19NT05USF9JTkZPLAorICAgICAgSmFudWFyeVsxXSBGZWJydWFyeVsyXSBNYXJjaFszXSBBcHJpbFs0XSBNYXlbNV0gSnVuZVs2XSBKdWx5WzddIEF1Z3VzdAorICAgICAgICAgIFs4XSBTZXB0ZW1iZXJbOV0gT2N0b2JlclsxMF0gTm92ZW1iZXJbMTFdIERlY2VtYmVyWzEyXSBTZXB0WzldIEphbgorICAgICAgICAgICAgICBbMV0gRmViWzJdIE1hclszXSBBcHJbNF0gSnVuWzZdIEp1bFs3XSBBdWdbOF0gU2VwWzldIE9jdFsxMF0gTm92CisgICAgICAgICAgICAgICAgICBbMTFdIERlY1sxMl0pOworICBERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBJRFNfU1RBUlRVUF9DT05TT0xFX01TRywgKiogXiBfIF4gKiopOwogCi0JcmV0dXJuIDA7CisgIHJldHVybiAwOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX0dsb2JhbEFycmF5cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfR2xvYmFsQXJyYXlzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotaW50CUNKU19HbG9iYWxBcnJheXM6OkluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKQotewotCXsKLQkJY29uc3QgRlhfV0NIQVIqIEFycmF5TmFtZSA9IEwiUkVfTlVNQkVSX0VOVFJZX0RPVF9TRVAiOwotCQljb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7TCJbKy1dP1xcZCpcXC4/XFxkKiJ9OwotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9CitpbnQgQ0pTX0dsb2JhbEFycmF5czo6SW5pdChJSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgeworICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheU5hbWUgPSBMIlJFX05VTUJFUl9FTlRSWV9ET1RfU0VQIjsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7TCJbKy1dP1xcZCpcXC4/XFxkKiJ9OworICAgIERFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpOworICB9CiAKLQl7Ci0JCWNvbnN0IEZYX1dDSEFSKiBBcnJheU5hbWUgPSBMIlJFX05VTUJFUl9DT01NSVRfRE9UX1NFUCI7Ci0JCWNvbnN0IEZYX1dDSEFSKiBBcnJheUNvbnRlbnRbXSA9IHsgTCJbKy1dP1xcZCsoXFwuXFxkKyk/IiwgICAgICAgICAgICAgICAgLyogLTEuMCBvciAtMSAqLwotCQkJCQkJCQkJICBMIlsrLV0/XFwuXFxkKyIsICAgICAgICAgICAgICAgICAgICAgICAvKiAtLjEgKi8KLQkJCQkJCQkJCSAgTCJbKy1dP1xcZCtcXC4iICAgICAgICAgICAgICAgICAgICAgICAgLyogLTEuICovCi0JCQkJCQkJCQl9OwotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9CisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9OVU1CRVJfQ09NTUlUX0RPVF9TRVAiOworICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheUNvbnRlbnRbXSA9IHsKKyAgICAgICAgTCJbKy1dP1xcZCsoXFwuXFxkKyk/IiwgLyogLTEuMCBvciAtMSAqLworICAgICAgICBMIlsrLV0/XFwuXFxkKyIsICAgICAgICAvKiAtLjEgKi8KKyAgICAgICAgTCJbKy1dP1xcZCtcXC4iICAgICAgICAgLyogLTEuICovCisgICAgfTsKKyAgICBERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKKyAgfQogCi0JewotCQljb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9OVU1CRVJfRU5UUllfQ09NTUFfU0VQIjsKLQkJY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0ge0wiWystXT9cXGQqLD9cXGQqIn07CisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9OVU1CRVJfRU5UUllfQ09NTUFfU0VQIjsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7TCJbKy1dP1xcZCosP1xcZCoifTsKIAotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9CisgICAgREVGSU5FX0dMT0JBTF9BUlJBWShwUnVudGltZSk7CisgIH0KIAotCXsKLQkJY29uc3QgRlhfV0NIQVIqIEFycmF5TmFtZSA9IEwiUkVfTlVNQkVSX0NPTU1JVF9DT01NQV9TRVAiOwotCQljb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7IEwiWystXT9cXGQrKFsuLF1cXGQrKT8iLCAgICAgICAgICAgICAgIC8qIC0xLDAgb3IgLTEgKi8KLQkJCQkJCQkJCSAgTCJbKy1dP1suLF1cXGQrIiwgICAgICAgICAgICAgICAgICAgLyogLSwxICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiWystXT9cXGQrWy4sXSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLTEsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9CisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9OVU1CRVJfQ09NTUlUX0NPTU1BX1NFUCI7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0geworICAgICAgICBMIlsrLV0/XFxkKyhbLixdXFxkKyk/IiwgLyogLTEsMCBvciAtMSAqLworICAgICAgICBMIlsrLV0/Wy4sXVxcZCsiLCAgICAgICAgLyogLSwxICovCisgICAgICAgIEwiWystXT9cXGQrWy4sXSIgICAgICAgICAvKiAtMSwgKi8KKyAgICB9OworICAgIERFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpOworICB9CiAKLQl7Ci0JCWNvbnN0IEZYX1dDSEFSKiBBcnJheU5hbWUgPSBMIlJFX1pJUF9FTlRSWSI7Ci0gICAgICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheUNvbnRlbnRbXSA9IHtMIlxcZHswLDV9In07Ci0JCURFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpOwotCX0KKyAgeworICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheU5hbWUgPSBMIlJFX1pJUF9FTlRSWSI7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0ge0wiXFxkezAsNX0ifTsKKyAgICBERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKKyAgfQogCi0JewotCQljb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9aSVBfQ09NTUlUIjsKLQkJY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0ge0wiXFxkezV9In07Ci0JCURFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpOwotCX0KKyAgeworICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheU5hbWUgPSBMIlJFX1pJUF9DT01NSVQiOworICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheUNvbnRlbnRbXSA9IHtMIlxcZHs1fSJ9OworICAgIERFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpOworICB9CiAKLQl7Ci0JCWNvbnN0IEZYX1dDSEFSKiBBcnJheU5hbWUgPSBMIlJFX1pJUDRfRU5UUlkiOwotCQljb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7TCJcXGR7MCw1fShcXC58Wy0gXSk/XFxkezAsNH0ifTsKLQkJREVGSU5FX0dMT0JBTF9BUlJBWShwUnVudGltZSk7Ci0JfQorICB7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5TmFtZSA9IEwiUkVfWklQNF9FTlRSWSI7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0ge0wiXFxkezAsNX0oXFwufFstIF0pP1xcZHswLDR9In07CisgICAgREVGSU5FX0dMT0JBTF9BUlJBWShwUnVudGltZSk7CisgIH0KIAotCXsKLQkJY29uc3QgRlhfV0NIQVIqIEFycmF5TmFtZSA9IEwiUkVfWklQNF9DT01NSVQiOwotCQljb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7TCJcXGR7NX0oXFwufFstIF0pP1xcZHs0fSJ9OwotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9CisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9aSVA0X0NPTU1JVCI7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0ge0wiXFxkezV9KFxcLnxbLSBdKT9cXGR7NH0ifTsKKyAgICBERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKKyAgfQogCi0JewotCQljb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9QSE9ORV9FTlRSWSI7Ci0JCWNvbnN0IEZYX1dDSEFSKiBBcnJheUNvbnRlbnRbXSA9IHsKLQkJCQlMIlxcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsNH0iLAkJLyogNTU1LTEyMzQgb3IgNDA4IDU1NS0xMjM0ICovCi0JCQkJTCJcXChcXGR7MCwzfSIsCQkJCQkJCQkJCQkvKiAoNDA4ICovCi0JCQkJTCJcXChcXGR7MCwzfVxcKShcXC58Wy0gXSk/XFxkezAsM30oXFwufFstIF0pP1xcZHswLDR9IiwJLyogKDQwOCkgNTU1LTEyMzQgKi8KLQkJCQkJLyogKGFsbG93IHRoZSBhZGRpdGlvbiBvZiBwYXJlbnMgYXMgYW4gYWZ0ZXJ0aG91Z2h0KSAqLwotCQkJCUwiXFwoXFxkezAsM30oXFwufFstIF0pP1xcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCw0fSIsCS8qICg0MDggNTU1LTEyMzQgKi8KLQkJCQlMIlxcZHswLDN9XFwpKFxcLnxbLSBdKT9cXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsNH0iLAkvKiA0MDgpIDU1NS0xMjM0ICovCi0JCQkJTCIwMTEoXFwufFstIFxcZF0pKiIJCQkJCQkJCQkJLyogaW50ZXJuYXRpb25hbCAqLwotCQkJfTsKLQkJREVGSU5FX0dMT0JBTF9BUlJBWShwUnVudGltZSk7Ci0JfQorICB7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5TmFtZSA9IEwiUkVfUEhPTkVfRU5UUlkiOworICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheUNvbnRlbnRbXSA9IHsKKyAgICAgICAgTCJcXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsM30oXFwufFstIF0pP1xcZHswLDR9IiwgLyogNTU1LTEyMzQgb3IgNDA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NS0xMjM0ICovCisgICAgICAgIEwiXFwoXFxkezAsM30iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICg0MDggKi8KKyAgICAgICAgTCJcXChcXGR7MCwzfVxcKShcXC58Wy0gXSk/XFxkezAsM30oXFwufFstIF0pP1xcZHswLDR9IiwgLyogKDQwOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU1LTEyMzQgKi8KKyAgICAgICAgLyogKGFsbG93IHRoZSBhZGRpdGlvbiBvZiBwYXJlbnMgYXMgYW4gYWZ0ZXJ0aG91Z2h0KSAqLworICAgICAgICBMIlxcKFxcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsNH0iLCAvKiAoNDA4IDU1NS0xMjM0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIEwiXFxkezAsM31cXCkoXFwufFstIF0pP1xcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCw0fSIsIC8qIDQwOCkgNTU1LTEyMzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgTCIwMTEoXFwufFstIFxcZF0pKiIgLyogaW50ZXJuYXRpb25hbCAqLworICAgIH07CisgICAgREVGSU5FX0dMT0JBTF9BUlJBWShwUnVudGltZSk7CisgIH0KIAotCXsKLQkJY29uc3QgRlhfV0NIQVIqIEFycmF5TmFtZSA9IEwiUkVfUEhPTkVfQ09NTUlUIjsKLQkJY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0gewotCQkJCQlMIlxcZHszfShcXC58Wy0gXSk/XFxkezR9IiwJCQkJCQkJLyogNTU1LTEyMzQgKi8KLQkJCQkJTCJcXGR7M30oXFwufFstIF0pP1xcZHszfShcXC58Wy0gXSk/XFxkezR9IiwJCQkvKiA0MDggNTU1LTEyMzQgKi8KLQkJCQkJTCJcXChcXGR7M31cXCkoXFwufFstIF0pP1xcZHszfShcXC58Wy0gXSk/XFxkezR9IiwJLyogKDQwOCkgNTU1LTEyMzQgKi8KLQkJCQkJTCIwMTEoXFwufFstIFxcZF0pKiIJCQkJCQkJCQkvKiBpbnRlcm5hdGlvbmFsICovCi0JCQkJfTsKLQkJREVGSU5FX0dMT0JBTF9BUlJBWShwUnVudGltZSk7Ci0JfQorICB7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5TmFtZSA9IEwiUkVfUEhPTkVfQ09NTUlUIjsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7CisgICAgICAgIEwiXFxkezN9KFxcLnxbLSBdKT9cXGR7NH0iLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU1NS0xMjM0ICovCisgICAgICAgIEwiXFxkezN9KFxcLnxbLSBdKT9cXGR7M30oXFwufFstIF0pP1xcZHs0fSIsICAgICAgIC8qIDQwOCA1NTUtMTIzNCAqLworICAgICAgICBMIlxcKFxcZHszfVxcKShcXC58Wy0gXSk/XFxkezN9KFxcLnxbLSBdKT9cXGR7NH0iLCAvKiAoNDA4KSA1NTUtMTIzNCAqLworICAgICAgICBMIjAxMShcXC58Wy0gXFxkXSkqIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcm5hdGlvbmFsICovCisgICAgfTsKKyAgICBERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKKyAgfQogCi0JewotCQljb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9TU05fRU5UUlkiOwotCQljb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7TCJcXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsMn0oXFwufFstIF0pP1xcZHswLDR9In07Ci0JCURFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpOwotCX0KKyAgeworICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheU5hbWUgPSBMIlJFX1NTTl9FTlRSWSI7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0geworICAgICAgICBMIlxcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCwyfShcXC58Wy0gXSk/XFxkezAsNH0ifTsKKyAgICBERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKKyAgfQogCi0JewotCQljb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9TU05fQ09NTUlUIjsKLQkJY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0ge0wiXFxkezN9KFxcLnxbLSBdKT9cXGR7Mn0oXFwufFstIF0pP1xcZHs0fSJ9OwotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9CisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9TU05fQ09NTUlUIjsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7CisgICAgICAgIEwiXFxkezN9KFxcLnxbLSBdKT9cXGR7Mn0oXFwufFstIF0pP1xcZHs0fSJ9OworICAgIERFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpOworICB9CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAKaW5kZXggMGZhNjEyYy4uOWQyMzE1OCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAKQEAgLTIwLDE1ICsyMCwxNCBAQAogCiAjaW5jbHVkZSAiLi4vLi4vLi4vdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKIAotc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElGWEpTX0NvbnRleHQqIGNjKQotewotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKK3N0YXRpYyB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZShJRlhKU19Db250ZXh0KiBjYykgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0gICAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAotICAgIHJldHVybiBwUnVudGltZS0+R2V0SXNvbGF0ZSgpOworICByZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKIH0KIAogQkVHSU5fSlNfU1RBVElDX0NPTlNUKENKU19QcmludFBhcmFtc09iaikKQEAgLTQzLDE3NDUgKzQyLDE3NTUgQEAKIElNUExFTUVOVF9KU19DTEFTUyhDSlNfUHJpbnRQYXJhbXNPYmosIFByaW50UGFyYW1zT2JqKQogCiBQcmludFBhcmFtc09iajo6UHJpbnRQYXJhbXNPYmooQ0pTX09iamVjdCogcEpTT2JqZWN0KQotOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KQotewotICAgIGJVSSA9IFRSVUU7Ci0gICAgblN0YXJ0ID0gMDsKLSAgICBuRW5kID0gMDsKLSAgICBiU2lsZW50ID0gRkFMU0U7Ci0gICAgYlNocmlua1RvRml0ID0gRkFMU0U7Ci0gICAgYlByaW50QXNJbWFnZSA9IEZBTFNFOwotICAgIGJSZXZlcnNlID0gRkFMU0U7Ci0gICAgYkFubm90YXRpb25zID0gVFJVRTsKKyAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpIHsKKyAgYlVJID0gVFJVRTsKKyAgblN0YXJ0ID0gMDsKKyAgbkVuZCA9IDA7CisgIGJTaWxlbnQgPSBGQUxTRTsKKyAgYlNocmlua1RvRml0ID0gRkFMU0U7CisgIGJQcmludEFzSW1hZ2UgPSBGQUxTRTsKKyAgYlJldmVyc2UgPSBGQUxTRTsKKyAgYkFubm90YXRpb25zID0gVFJVRTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEb2N1bWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNkZWZpbmUgTUlOV0lEVEggIDUuMGYKKyNkZWZpbmUgTUlOV0lEVEggNS4wZgogI2RlZmluZSBNSU5IRUlHSFQgNS4wZgogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX0RvY3VtZW50KQogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19QUk9QKENKU19Eb2N1bWVudCkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShBREJFKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGF1dGhvcikKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShiYXNlVVJMKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGJvb2ttYXJrUm9vdCkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShjYWxjdWxhdGUpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoQ29sbGFiKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGNyZWF0aW9uRGF0ZSkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShjcmVhdG9yKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGRlbGF5KQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGRpcnR5KQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGRvY3VtZW50RmlsZU5hbWUpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoZXh0ZXJuYWwpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoZmlsZXNpemUpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoaWNvbnMpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoaW5mbykKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShrZXl3b3JkcykKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShsYXlvdXQpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkobWVkaWEpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkobW9kRGF0ZSkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShtb3VzZVgpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkobW91c2VZKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKG51bUZpZWxkcykKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShudW1QYWdlcykKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShwYWdlTnVtKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHBhZ2VXaW5kb3dSZWN0KQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHBhdGgpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkocHJvZHVjZXIpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoc3ViamVjdCkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWSh0aXRsZSkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWSh6b29tKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHpvb21UeXBlKQorSlNfU1RBVElDX1BST1BfRU5UUlkoQURCRSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGF1dGhvcikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGJhc2VVUkwpCitKU19TVEFUSUNfUFJPUF9FTlRSWShib29rbWFya1Jvb3QpCitKU19TVEFUSUNfUFJPUF9FTlRSWShjYWxjdWxhdGUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShDb2xsYWIpCitKU19TVEFUSUNfUFJPUF9FTlRSWShjcmVhdGlvbkRhdGUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShjcmVhdG9yKQorSlNfU1RBVElDX1BST1BfRU5UUlkoZGVsYXkpCitKU19TVEFUSUNfUFJPUF9FTlRSWShkaXJ0eSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGRvY3VtZW50RmlsZU5hbWUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShleHRlcm5hbCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGZpbGVzaXplKQorSlNfU1RBVElDX1BST1BfRU5UUlkoaWNvbnMpCitKU19TVEFUSUNfUFJPUF9FTlRSWShpbmZvKQorSlNfU1RBVElDX1BST1BfRU5UUlkoa2V5d29yZHMpCitKU19TVEFUSUNfUFJPUF9FTlRSWShsYXlvdXQpCitKU19TVEFUSUNfUFJPUF9FTlRSWShtZWRpYSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG1vZERhdGUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShtb3VzZVgpCitKU19TVEFUSUNfUFJPUF9FTlRSWShtb3VzZVkpCitKU19TVEFUSUNfUFJPUF9FTlRSWShudW1GaWVsZHMpCitKU19TVEFUSUNfUFJPUF9FTlRSWShudW1QYWdlcykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHBhZ2VOdW0pCitKU19TVEFUSUNfUFJPUF9FTlRSWShwYWdlV2luZG93UmVjdCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHBhdGgpCitKU19TVEFUSUNfUFJPUF9FTlRSWShwcm9kdWNlcikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHN1YmplY3QpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh0aXRsZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHpvb20pCitKU19TVEFUSUNfUFJPUF9FTlRSWSh6b29tVHlwZSkKIEVORF9KU19TVEFUSUNfUFJPUCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19NRVRIT0QoQ0pTX0RvY3VtZW50KQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYWRkQW5ub3QpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShhZGRGaWVsZCkKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGFkZExpbmspCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShhZGRJY29uKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoY2FsY3VsYXRlTm93KQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoY2xvc2VEb2MpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShjcmVhdGVEYXRhT2JqZWN0KQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZGVsZXRlUGFnZXMpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShleHBvcnRBc1RleHQpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShleHBvcnRBc0ZERikKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGV4cG9ydEFzWEZERikKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGV4dHJhY3RQYWdlcykKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEFubm90KQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0QW5ub3RzKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0QW5ub3QzRCkKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEFubm90czNEKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0RmllbGQpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRJY29uKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0TGlua3MpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXROdGhGaWVsZE5hbWUpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRPQ0dzKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0UGFnZUJveCkKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldFBhZ2VOdGhXb3JkKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0UGFnZU50aFdvcmRRdWFkcykKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldFBhZ2VOdW1Xb3JkcykKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldFByaW50UGFyYW1zKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0VVJMKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoaW1wb3J0QW5GREYpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShpbXBvcnRBblhGREYpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShpbXBvcnRUZXh0RGF0YSkKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGluc2VydFBhZ2VzKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkobWFpbEZvcm0pCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShwcmludCkKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHJlbW92ZUZpZWxkKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkocmVwbGFjZVBhZ2VzKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkocmVzZXRGb3JtKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkocmVtb3ZlSWNvbikKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNhdmVBcykKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHN1Ym1pdEZvcm0pCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShtYWlsRG9jKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShhZGRBbm5vdCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYWRkRmllbGQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGFkZExpbmspCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGFkZEljb24pCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNhbGN1bGF0ZU5vdykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoY2xvc2VEb2MpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNyZWF0ZURhdGFPYmplY3QpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGRlbGV0ZVBhZ2VzKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShleHBvcnRBc1RleHQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGV4cG9ydEFzRkRGKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShleHBvcnRBc1hGREYpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGV4dHJhY3RQYWdlcykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0QW5ub3QpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEFubm90cykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0QW5ub3QzRCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0QW5ub3RzM0QpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEZpZWxkKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRJY29uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRMaW5rcykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0TnRoRmllbGROYW1lKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRPQ0dzKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRQYWdlQm94KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRQYWdlTnRoV29yZCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0UGFnZU50aFdvcmRRdWFkcykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0UGFnZU51bVdvcmRzKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRQcmludFBhcmFtcykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0VVJMKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShpbXBvcnRBbkZERikKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoaW1wb3J0QW5YRkRGKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShpbXBvcnRUZXh0RGF0YSkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoaW5zZXJ0UGFnZXMpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG1haWxGb3JtKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShwcmludCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkocmVtb3ZlRmllbGQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHJlcGxhY2VQYWdlcykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkocmVzZXRGb3JtKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShyZW1vdmVJY29uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzYXZlQXMpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHN1Ym1pdEZvcm0pCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG1haWxEb2MpCiBFTkRfSlNfU1RBVElDX01FVEhPRCgpCiAKIElNUExFTUVOVF9KU19DTEFTUyhDSlNfRG9jdW1lbnQsIERvY3VtZW50KQogCi1GWF9CT09MIENKU19Eb2N1bWVudDo6SW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKQotewotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0gICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworRlhfQk9PTCBDSlNfRG9jdW1lbnQ6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICBEb2N1bWVudCogcERvYyA9IChEb2N1bWVudCopR2V0RW1iZWRPYmplY3QoKTsKLSAgICBBU1NFUlQocERvYyAhPSBOVUxMKTsKKyAgRG9jdW1lbnQqIHBEb2MgPSAoRG9jdW1lbnQqKUdldEVtYmVkT2JqZWN0KCk7CisgIEFTU0VSVChwRG9jICE9IE5VTEwpOwogCi0gICAgcERvYy0+QXR0YWNoRG9jKHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpKTsKLSAgICBwRG9jLT5TZXRJc29sYXRlKHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKS0+R2V0SXNvbGF0ZSgpKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgcERvYy0+QXR0YWNoRG9jKHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpKTsKKyAgcERvYy0+U2V0SXNvbGF0ZShwQ29udGV4dC0+R2V0SlNSdW50aW1lKCktPkdldElzb2xhdGUoKSk7CisgIHJldHVybiBUUlVFOwogfTsKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERvY3VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERvY3VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKLURvY3VtZW50OjpEb2N1bWVudChDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksCi0gICAgbV9pc29sYXRlKE5VTEwpLAotICAgIG1fcEljb25UcmVlKE5VTEwpLAotICAgIG1fcERvY3VtZW50KE5VTEwpLAotICAgIG1fY3dCYXNlVVJMKEwiIiksCi0gICAgbV9iRGVsYXkoRkFMU0UpCi17Ci19CitEb2N1bWVudDo6RG9jdW1lbnQoQ0pTX09iamVjdCogcEpTT2JqZWN0KQorICAgIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksCisgICAgICBtX2lzb2xhdGUoTlVMTCksCisgICAgICBtX3BJY29uVHJlZShOVUxMKSwKKyAgICAgIG1fcERvY3VtZW50KE5VTEwpLAorICAgICAgbV9jd0Jhc2VVUkwoTCIiKSwKKyAgICAgIG1fYkRlbGF5KEZBTFNFKSB7fQogCi1Eb2N1bWVudDo6fkRvY3VtZW50KCkKLXsKLSAgICBpZiAobV9wSWNvblRyZWUpCi0gICAgewotICAgICAgICBtX3BJY29uVHJlZS0+RGVsZXRlSWNvblRyZWUoKTsKLSAgICAgICAgZGVsZXRlIG1fcEljb25UcmVlOwotICAgICAgICBtX3BJY29uVHJlZSA9IE5VTEw7CitEb2N1bWVudDo6fkRvY3VtZW50KCkgeworICBpZiAobV9wSWNvblRyZWUpIHsKKyAgICBtX3BJY29uVHJlZS0+RGVsZXRlSWNvblRyZWUoKTsKKyAgICBkZWxldGUgbV9wSWNvblRyZWU7CisgICAgbV9wSWNvblRyZWUgPSBOVUxMOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9EZWxheURhdGEuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoQ0pTX0RlbGF5RGF0YSogcERhdGEgPSBtX0RlbGF5RGF0YS5HZXRBdChpKSkgeworICAgICAgZGVsZXRlIHBEYXRhOworICAgICAgcERhdGEgPSBOVUxMOworICAgICAgbV9EZWxheURhdGEuU2V0QXQoaSwgTlVMTCk7CiAgICAgfQotICAgIGZvciAoaW50IGk9MDsgaTxtX0RlbGF5RGF0YS5HZXRTaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChDSlNfRGVsYXlEYXRhKiBwRGF0YSA9IG1fRGVsYXlEYXRhLkdldEF0KGkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGUgcERhdGE7Ci0gICAgICAgICAgICBwRGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICBtX0RlbGF5RGF0YS5TZXRBdChpLCBOVUxMKTsKKyAgfQogCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX0RlbGF5RGF0YS5SZW1vdmVBbGwoKTsKLSAgICBtX0RlbGF5QW5ub3REYXRhLlJlbW92ZUFsbCgpOworICBtX0RlbGF5RGF0YS5SZW1vdmVBbGwoKTsKKyAgbV9EZWxheUFubm90RGF0YS5SZW1vdmVBbGwoKTsKIH0KIAotLy90aGUgdG90YWwgbnVtYmVyIG9mIGZpbGVkcyBpbiBkb2N1bWVudC4KLUZYX0JPT0wgRG9jdW1lbnQ6Om51bUZpZWxkcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOwotICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JFQURPTkxZKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGU0RLX0ludGVyRm9ybSAqcEludGVyRm9ybSA9IG1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLSAgICBDUERGX0ludGVyRm9ybSAqcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgICB2cCA8PCAoaW50KXBQREZGb3JtLT5Db3VudEZpZWxkcygpOwotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpkaXJ0eShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzR2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKG1fcERvY3VtZW50LT5HZXRDaGFuZ2VNYXJrKCkpCi0gICAgICAgICAgICB2cCA8PCB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cCA8PCBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYm9vbCBiQ2hhbmdlZCA9IGZhbHNlOwotCi0gICAgICAgIHZwID4+IGJDaGFuZ2VkOwotCi0gICAgICAgIGlmIChiQ2hhbmdlZCkKLSAgICAgICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1fcERvY3VtZW50LT5DbGVhckNoYW5nZU1hcmsoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6QURCRShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzR2V0dGluZygpKQotICAgIHsKLSAgICAgICAgdnAuU2V0TnVsbCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpwYWdlTnVtKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAodnAuSXNHZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldEN1cnJlbnRWaWV3KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwIDw8IHBQYWdlVmlldy0+R2V0UGFnZUluZGV4KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW50IGlQYWdlQ291bnQgPSBtX3BEb2N1bWVudC0+R2V0UGFnZUNvdW50KCk7Ci0gICAgICAgIGludCBpUGFnZU51bSA9IDA7Ci0gICAgICAgIHZwID4+IGlQYWdlTnVtOwotCi0gICAgICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7Ci0gICAgICAgIGlmIChpUGFnZU51bSA+PSAwICYmIGlQYWdlTnVtIDwgaVBhZ2VDb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgIHBFbnYtPkpTX2RvY2dvdG9QYWdlKGlQYWdlTnVtKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpUGFnZU51bSA+PSBpUGFnZUNvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICAgcEVudi0+SlNfZG9jZ290b1BhZ2UoaVBhZ2VDb3VudC0xKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpUGFnZU51bSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICBwRW52LT5KU19kb2Nnb3RvUGFnZSgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpQYXJzZXJQYXJhbXMoSlNPYmplY3QqIHBPYmosQ0pTX0Fubm90T2JqJiBhbm5vdG9iaikKLXsKLSAgICAvLyBOb3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjphZGRBbm5vdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIC8vIE5vdCBzdXBwb3J0ZWQuCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmFkZEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgLy8gTm90IHN1cHBvcnRlZC4KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6ZXhwb3J0QXNUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpleHBvcnRBc0ZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6ZXhwb3J0QXNYRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiBUUlVFOwotfQotCi0vL01hcHMgYSBmaWVsZCBvYmplY3QgaW4gUERGIGRvY3VtZW50IHRvIGEgSmF2YVNjcmlwdCB2YXJpYWJsZQotLy9jb21tZW50OgotLy9ub3RlOiB0aGUgcGFyZW10ZXIgY05hbWUsIHRoaXMgaXMgY2x1ZSBob3cgdG8gdHJlYXQgaWYgdGhlIGNOYW1lIGlzIG5vdCBhIHZhbGlhYmxlIGZpbGVkIG5hbWUgaW4gdGhpcyBkb2N1bWVudAotCi1GWF9CT09MIERvY3VtZW50OjpnZXRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0gICAgaWYgKHBhcmFtcy5zaXplKCkgPCAxKSB7Ci0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQotICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotICAgIENQREZfSW50ZXJGb3JtKiBwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwotICAgIGlmIChwUERGRm9ybS0+Q291bnRGaWVsZHMod2lkZU5hbWUpIDw9IDApCi0gICAgewotICAgICAgICB2UmV0LlNldE51bGwoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotICAgIEpTRlhPYmplY3QgcEZpZWxkT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgcENvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7Ci0KLSAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwotICAgIENKU19GaWVsZCogcEpTRmllbGQgPSAoQ0pTX0ZpZWxkKilKU19HZXRQcml2YXRlKGlzb2xhdGUscEZpZWxkT2JqKTsKLSAgICBGaWVsZCogcEZpZWxkID0gKEZpZWxkICopcEpTRmllbGQtPkdldEVtYmVkT2JqZWN0KCk7Ci0gICAgcEZpZWxkLT5BdHRhY2hGaWVsZCh0aGlzLCB3aWRlTmFtZSk7Ci0KLSAgICB2UmV0ID0gcEpTRmllbGQ7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vR2V0cyB0aGUgbmFtZSBvZiB0aGUgbnRoIGZpZWxkIGluIHRoZSBkb2N1bWVudAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0TnRoRmllbGROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLSAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7Ci0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpbnQgbkluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0gICAgaWYgKG5JbmRleCA8IDApIHsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNWQUxVRUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotICAgIENQREZfSW50ZXJGb3JtKiBwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwotICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwUERGRm9ybS0+R2V0RmllbGQobkluZGV4KTsKLSAgICBpZiAoIXBGaWVsZCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgdlJldCA9IHBGaWVsZC0+R2V0RnVsbE5hbWUoKS5jX3N0cigpOwotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjppbXBvcnRBbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6aW1wb3J0QW5YRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjppbXBvcnRUZXh0RGF0YShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy9leHBvcnRzIHRoZSBmb3JtIGRhdGEgYW5kIG1haWxzIHRoZSByZXN1bHRpbmcgZmRmIGZpbGUgYXMgYW4gYXR0YWNobWVudCB0byBhbGwgcmVjaXBpZW50cy4KLS8vY29tbWVudDogbmVlZCByZWFkZXIgc3VwcG9ydHMKLS8vbm90ZToKLS8vaW50IENQREZTREtfRG9jdW1lbnQ6Om1haWxGb3JtKEZYX0JPT0wgYlVJLFN0cmluZyBjdG8sc3RyaW5nIGNjYyxzdHJpbmcgY2JjYyxzdHJpbmcgY1N1YmplY3Qsc3RyaW5nIGNtcyk7Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6Om1haWxGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpbnQgaUxlbmd0aCA9IHBhcmFtcy5zaXplKCk7Ci0KLSAgICBGWF9CT09MIGJVSSA9IGlMZW5ndGggPiAwID8gcGFyYW1zWzBdLlRvQm9vbCgpIDogVFJVRTsKLSAgICBDRlhfV2lkZVN0cmluZyBjVG8gPSBpTGVuZ3RoID4gMSA/IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKLSAgICBDRlhfV2lkZVN0cmluZyBjQ2MgPSBpTGVuZ3RoID4gMiA/IHBhcmFtc1syXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKLSAgICBDRlhfV2lkZVN0cmluZyBjQmNjID0gaUxlbmd0aCA+IDMgPyBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkgOiBMIiI7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY1N1YmplY3QgPSBpTGVuZ3RoID4gNCA/IHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKLSAgICBDRlhfV2lkZVN0cmluZyBjTXNnID0gaUxlbmd0aCA+IDUgPyBwYXJhbXNbNV0uVG9DRlhXaWRlU3RyaW5nKCkgOiBMIiI7Ci0KLSAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgQ0ZYX0J5dGVUZXh0QnVmIHRleHRCdWY7Ci0gICAgaWYgKCFwSW50ZXJGb3JtLT5FeHBvcnRGb3JtVG9GREZUZXh0QnVmKHRleHRCdWYpKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLSAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOwotICAgIEFTU0VSVChwRW52ICE9IE5VTEwpOwotICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLSAgICBBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7Ci0KLSAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOwotICAgIHBFbnYtPkpTX2RvY21haWxGb3JtKHRleHRCdWYuR2V0QnVmZmVyKCksIHRleHRCdWYuR2V0TGVuZ3RoKCksIGJVSSwgY1RvLmNfc3RyKCksIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLCBjQmNjLmNfc3RyKCksIGNNc2cuY19zdHIoKSk7Ci0gICAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OnByaW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLSAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0gICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKLQotICAgIEZYX0JPT0wgYlVJID0gVFJVRTsKLSAgICBpbnQgblN0YXJ0ID0gMDsKLSAgICBpbnQgbkVuZCA9IDA7Ci0gICAgRlhfQk9PTCBiU2lsZW50ID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiU2hyaW5rVG9GaXQgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJQcmludEFzSW1hZ2UgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJSZXZlcnNlID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiQW5ub3RhdGlvbnMgPSBGQUxTRTsKLQotICAgIGludCBubGVuZ3RoID0gcGFyYW1zLnNpemUoKTsKLSAgICBpZihubGVuZ3RoID09OSkKLSAgICB7Ci0gICAgICAgIGlmIChwYXJhbXNbOF0uR2V0VHlwZSgpID09IFZUX2Z4b2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBKU0ZYT2JqZWN0IHBPYmogPSBwYXJhbXNbOF0uVG9WOE9iamVjdCgpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChKU19HZXRPYmpEZWZuSUQocE9iaikgPT0gSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJQcmludFBhcmFtc09iaiIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKENKU19PYmplY3QqIHBKU09iaiA9IHBhcmFtc1s4XS5Ub0NKU09iamVjdCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByaW50UGFyYW1zT2JqKiBwcHJpbnRwYXJhbXNPYmogPSAoUHJpbnRQYXJhbXNPYmoqKXBKU09iai0+R2V0RW1iZWRPYmplY3QoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVSSA9IHBwcmludHBhcmFtc09iai0+YlVJOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU3RhcnQgPSBwcHJpbnRwYXJhbXNPYmotPm5TdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkVuZCA9IHBwcmludHBhcmFtc09iai0+bkVuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNpbGVudCA9IHBwcmludHBhcmFtc09iai0+YlNpbGVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNocmlua1RvRml0ID0gcHByaW50cGFyYW1zT2JqLT5iU2hyaW5rVG9GaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcmludEFzSW1hZ2UgPSBwcHJpbnRwYXJhbXNPYmotPmJQcmludEFzSW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXZlcnNlID0gcHByaW50cGFyYW1zT2JqLT5iUmV2ZXJzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFubm90YXRpb25zID0gcHByaW50cGFyYW1zT2JqLT5iQW5ub3RhdGlvbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKG5sZW5ndGggPj0gMSkKLSAgICAgICAgICAgIGJVSSA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKLSAgICAgICAgaWYobmxlbmd0aCA+PSAyKQotICAgICAgICAgICAgblN0YXJ0ID0gcGFyYW1zWzFdLlRvSW50KCk7Ci0gICAgICAgIGlmKG5sZW5ndGggPj0gMykKLSAgICAgICAgICAgIG5FbmQgPSBwYXJhbXNbMl0uVG9JbnQoKTsKLSAgICAgICAgaWYobmxlbmd0aCA+PSA0KQotICAgICAgICAgICAgYlNpbGVudCA9IHBhcmFtc1szXS5Ub0Jvb2woKTsKLSAgICAgICAgaWYobmxlbmd0aCA+PSA1KQotICAgICAgICAgICAgYlNocmlua1RvRml0ID0gcGFyYW1zWzRdLlRvQm9vbCgpOwotICAgICAgICBpZihubGVuZ3RoID49IDYpCi0gICAgICAgICAgICBiUHJpbnRBc0ltYWdlID0gcGFyYW1zWzVdLlRvQm9vbCgpOwotICAgICAgICBpZihubGVuZ3RoID49IDcpCi0gICAgICAgICAgICBiUmV2ZXJzZSA9IHBhcmFtc1s2XS5Ub0Jvb2woKTsKLSAgICAgICAgaWYobmxlbmd0aCA+PSA4KQotICAgICAgICAgICAgYkFubm90YXRpb25zID0gcGFyYW1zWzddLlRvQm9vbCgpOwotICAgIH0KLQotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmIChDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpKQotICAgIHsKLSAgICAgICAgcEVudi0+SlNfZG9jcHJpbnQoYlVJLCBuU3RhcnQsIG5FbmQsIGJTaWxlbnQsIGJTaHJpbmtUb0ZpdCwgYlByaW50QXNJbWFnZSwgYlJldmVyc2UsIGJBbm5vdGF0aW9ucyk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KKy8vIHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZWRzIGluIGRvY3VtZW50LgorRlhfQk9PTCBEb2N1bWVudDo6bnVtRmllbGRzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgdnAgPDwgKGludClwUERGRm9ybS0+Q291bnRGaWVsZHMoKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLS8vcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGZpZWxkIGZyb20gdGhlIGRvY3VtZW50LgotLy9jb21tZW50OgotLy9ub3RlOiBpZiB0aGUgZmlsZWQgbmFtZSBpcyBub3QgcmV0aW9uYWwsIGFkb2JlIGlzIGR1bWIgZm9yIGl0LgorRlhfQk9PTCBEb2N1bWVudDo6ZGlydHkoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi1GWF9CT09MIERvY3VtZW50OjpyZW1vdmVGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICghKG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSkpIHJldHVybiBGQUxTRTsKLQotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0gICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewotICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc0ZpZWxkTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLSAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgQ0ZYX1B0ckFycmF5IHdpZGdldHM7Ci0gICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0cyhzRmllbGROYW1lLCB3aWRnZXRzKTsKLQotICAgIGludCBuU2l6ZSA9IHdpZGdldHMuR2V0U2l6ZSgpOwotCi0gICAgaWYgKG5TaXplID4gMCkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxuU2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopd2lkZ2V0c1tpXTsKLSAgICAgICAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwotCi0gICAgICAgICAgICBDUERGX1JlY3QgcmNBbm5vdCA9IHBXaWRnZXQtPkdldFJlY3QoKTsKLSAgICAgICAgICAgIHJjQW5ub3QubGVmdCAtPSAxOwotICAgICAgICAgICAgcmNBbm5vdC5ib3R0b20gLT0gMTsKLSAgICAgICAgICAgIHJjQW5ub3QucmlnaHQgKz0gMTsKLSAgICAgICAgICAgIHJjQW5ub3QudG9wICs9IDE7Ci0KLSAgICAgICAgICAgIENGWF9SZWN0QXJyYXkgYVJlZnJlc2g7Ci0gICAgICAgICAgICBhUmVmcmVzaC5BZGQocmNBbm5vdCk7Ci0KLQkJCUNQREZYRkFfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZYRkFQYWdlKCk7Ci0JCQlBU1NFUlQocFBhZ2UgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhwUGFnZSk7Ci0gICAgICAgICAgICBwUGFnZVZpZXctPkRlbGV0ZUFubm90KHBXaWRnZXQpOwotCi0gICAgICAgICAgICBwUGFnZVZpZXctPlVwZGF0ZVJlY3RzKGFSZWZyZXNoKTsKLSAgICAgICAgfQotICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vL3Jlc2V0IGZpbGVkIHZhbHVlcyB3aXRoaW4gYSBkb2N1bWVudC4KLS8vY29tbWVudDoKLS8vbm90ZTogaWYgdGhlIGZpZWxkcyBuYW1lcyByIG5vdCByYXRpb25hbCwgYW9kYmUgaXMgZHVtYiBmb3IgaXQuCi0KLUZYX0JPT0wgRG9jdW1lbnQ6OnJlc2V0Rm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICghKG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSB8fAotICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpIHJldHVybiBGQUxTRTsKLQotICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLSAgICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgICBBU1NFUlQocFBERkZvcm0gIT0gTlVMTCk7Ci0KLSAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwotICAgIENKU19BcnJheSBhTmFtZShpc29sYXRlKTsKLQotICAgIGlmIChwYXJhbXMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAocGFyYW1zWzBdLkdldFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYU5hbWUuQXR0YWNoKHBhcmFtc1swXS5Ub1Y4QXJyYXkoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWVF9zdHJpbmc6Ci0gICAgICAgICAgICBhTmFtZS5TZXRFbGVtZW50KDAscGFyYW1zWzBdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0ZYX1B0ckFycmF5IGFGaWVsZHM7Ci0KLSAgICAgICAgZm9yIChpbnQgaT0wLGlzej1hTmFtZS5HZXRMZW5ndGgoKTsgaTxpc3o7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQ0pTX1ZhbHVlIHZhbEVsZW1lbnQoaXNvbGF0ZSk7Ci0gICAgICAgICAgICBhTmFtZS5HZXRFbGVtZW50KGksdmFsRWxlbWVudCk7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbCA9IHZhbEVsZW1lbnQuVG9DRlhXaWRlU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3o9cFBERkZvcm0tPkNvdW50RmllbGRzKHN3VmFsKTsgajxqc3o7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhRmllbGRzLkFkZCgodm9pZCopcFBERkZvcm0tPkdldEZpZWxkKGosc3dWYWwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhRmllbGRzLkdldFNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQREZGb3JtLT5SZXNldEZvcm0oYUZpZWxkcywgVFJVRSwgVFJVRSk7Ci0gICAgICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotCi0gICAgICAgIH0KLSAgICB9CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIGlmIChtX3BEb2N1bWVudC0+R2V0Q2hhbmdlTWFyaygpKQorICAgICAgdnAgPDwgdHJ1ZTsKICAgICBlbHNlCi0gICAgewotICAgICAgICBwUERGRm9ybS0+UmVzZXRGb3JtKFRSVUUpOwotICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOworICAgICAgdnAgPDwgZmFsc2U7CisgIH0gZWxzZSB7CisgICAgYm9vbCBiQ2hhbmdlZCA9IGZhbHNlOwogCi0gICAgfQorICAgIHZwID4+IGJDaGFuZ2VkOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKGJDaGFuZ2VkKQorICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKKyAgICBlbHNlCisgICAgICBtX3BEb2N1bWVudC0+Q2xlYXJDaGFuZ2VNYXJrKCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAorRlhfQk9PTCBEb2N1bWVudDo6QURCRShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi1GWF9CT09MIERvY3VtZW50OjpzYXZlQXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAuU2V0TnVsbCgpOworICB9IGVsc2UgeworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OnBhZ2VOdW0oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKKyAgICBpZiAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldEN1cnJlbnRWaWV3KCkpIHsKKyAgICAgIHZwIDw8IHBQYWdlVmlldy0+R2V0UGFnZUluZGV4KCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGludCBpUGFnZUNvdW50ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOworICAgIGludCBpUGFnZU51bSA9IDA7CisgICAgdnAgPj4gaVBhZ2VOdW07CisKKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOworICAgIGlmIChpUGFnZU51bSA+PSAwICYmIGlQYWdlTnVtIDwgaVBhZ2VDb3VudCkgeworICAgICAgcEVudi0+SlNfZG9jZ290b1BhZ2UoaVBhZ2VOdW0pOworICAgIH0gZWxzZSBpZiAoaVBhZ2VOdW0gPj0gaVBhZ2VDb3VudCkgeworICAgICAgcEVudi0+SlNfZG9jZ290b1BhZ2UoaVBhZ2VDb3VudCAtIDEpOworICAgIH0gZWxzZSBpZiAoaVBhZ2VOdW0gPCAwKSB7CisgICAgICBwRW52LT5KU19kb2Nnb3RvUGFnZSgwKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6UGFyc2VyUGFyYW1zKEpTT2JqZWN0KiBwT2JqLCBDSlNfQW5ub3RPYmomIGFubm90b2JqKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjphZGRBbm5vdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjphZGRGaWVsZChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpleHBvcnRBc1RleHQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCiAgIHJldHVybiBUUlVFOwogfQogCitGWF9CT09MIERvY3VtZW50OjpleHBvcnRBc0ZERihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIFRSVUU7Cit9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnN1Ym1pdEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLSAgICBpbnQgblNpemUgPSBwYXJhbXMuc2l6ZSgpOwotICAgIGlmIChuU2l6ZSA8IDEpIHsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KK0ZYX0JPT0wgRG9jdW1lbnQ6OmV4cG9ydEFzWEZERihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIFRSVUU7Cit9CiAKLSAgICBDRlhfV2lkZVN0cmluZyBzdHJVUkw7Ci0gICAgRlhfQk9PTCBiRkRGID0gVFJVRTsKLSAgICBGWF9CT09MIGJFbXB0eSA9IEZBTFNFOwotICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7Ci0gICAgQ0pTX0FycmF5IGFGaWVsZHMoaXNvbGF0ZSk7CisvLyBNYXBzIGEgZmllbGQgb2JqZWN0IGluIFBERiBkb2N1bWVudCB0byBhIEphdmFTY3JpcHQgdmFyaWFibGUKKy8vIGNvbW1lbnQ6CisvLyBub3RlOiB0aGUgcGFyZW10ZXIgY05hbWUsIHRoaXMgaXMgY2x1ZSBob3cgdG8gdHJlYXQgaWYgdGhlIGNOYW1lIGlzIG5vdCBhCisvLyB2YWxpYWJsZSBmaWxlZCBuYW1lIGluIHRoaXMgZG9jdW1lbnQKIAotICAgIENKU19WYWx1ZSB2ID0gcGFyYW1zWzBdOwotICAgIGlmICh2LkdldFR5cGUoKSA9PSBWVF9zdHJpbmcpCi0gICAgewotICAgICAgICBzdHJVUkwgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0gICAgICAgIGlmIChuU2l6ZSA+IDEpCi0gICAgICAgICAgICBiRkRGID0gcGFyYW1zWzFdLlRvQm9vbCgpOwotICAgICAgICBpZiAoblNpemUgPiAyKQotICAgICAgICAgICAgYkVtcHR5ID0gcGFyYW1zWzJdLlRvQm9vbCgpOwotICAgICAgICBpZiAoblNpemUgPiAzKQotICAgICAgICAgICAgYUZpZWxkcy5BdHRhY2gocGFyYW1zWzNdLlRvVjhBcnJheSgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodi5HZXRUeXBlKCkgPT0gVlRfb2JqZWN0KQotICAgIHsKLSAgICAgICAgSlNPYmplY3QgcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KCk7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjVVJMIik7Ci0gICAgICAgIGlmICghcFZhbHVlLklzRW1wdHkoKSkKLSAgICAgICAgICAgIHN0clVSTCA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgICAgICBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiYkZERiIpOwotICAgICAgICBiRkRGID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9Cb29sKCk7Ci0gICAgICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJiRW1wdHkiKTsKLSAgICAgICAgYkVtcHR5ID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9Cb29sKCk7Ci0gICAgICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaixMImFGaWVsZHMiKTsKLSAgICAgICAgYUZpZWxkcy5BdHRhY2goQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9WOEFycmF5KCkpOwotICAgIH0KK0ZYX0JPT0wgRG9jdW1lbnQ6OmdldEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPCAxKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLSAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotICAgIENQREZfSW50ZXJGb3JtKiBwUERGSW50ZXJGb3JtID0gcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgRlhfQk9PTCBiQWxsID0gKGFGaWVsZHMuR2V0TGVuZ3RoKCkgPT0gMCk7Ci0gICAgaWYgKGJBbGwgJiYgYkVtcHR5KQotICAgIHsKLSAgICAgICAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKLSAgICAgICAgICAgIHBJbnRlckZvcm0tPlN1Ym1pdEZvcm0oc3RyVVJMLCBGQUxTRSk7Ci0gICAgICAgICAgICBwUnVudGltZS0+RW5kQmxvY2soKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZU5hbWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CisKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfSW50ZXJGb3JtKiBwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworICBpZiAocFBERkZvcm0tPkNvdW50RmllbGRzKHdpZGVOYW1lKSA8PSAwKSB7CisgICAgdlJldC5TZXROdWxsKCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIEpTRlhPYmplY3QgcEZpZWxkT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKAorICAgICAgKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJGaWVsZCIpKTsKKworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOworICBDSlNfRmllbGQqIHBKU0ZpZWxkID0gKENKU19GaWVsZCopSlNfR2V0UHJpdmF0ZShpc29sYXRlLCBwRmllbGRPYmopOworICBGaWVsZCogcEZpZWxkID0gKEZpZWxkKilwSlNGaWVsZC0+R2V0RW1iZWRPYmplY3QoKTsKKyAgcEZpZWxkLT5BdHRhY2hGaWVsZCh0aGlzLCB3aWRlTmFtZSk7CisKKyAgdlJldCA9IHBKU0ZpZWxkOworICByZXR1cm4gVFJVRTsKK30KKworLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgbnRoIGZpZWxkIGluIHRoZSBkb2N1bWVudAorRlhfQk9PTCBEb2N1bWVudDo6Z2V0TnRoRmllbGROYW1lKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaW50IG5JbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOworICBpZiAobkluZGV4IDwgMCkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfSW50ZXJGb3JtKiBwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcFBERkZvcm0tPkdldEZpZWxkKG5JbmRleCk7CisgIGlmICghcEZpZWxkKQorICAgIHJldHVybiBGQUxTRTsKKworICB2UmV0ID0gcEZpZWxkLT5HZXRGdWxsTmFtZSgpLmNfc3RyKCk7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjppbXBvcnRBbkZERihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OmltcG9ydEFuWEZERihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OmltcG9ydFRleHREYXRhKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgorICByZXR1cm4gVFJVRTsKK30KKworLy8gZXhwb3J0cyB0aGUgZm9ybSBkYXRhIGFuZCBtYWlscyB0aGUgcmVzdWx0aW5nIGZkZiBmaWxlIGFzIGFuIGF0dGFjaG1lbnQgdG8KKy8vIGFsbCByZWNpcGllbnRzLgorLy8gY29tbWVudDogbmVlZCByZWFkZXIgc3VwcG9ydHMKKy8vIG5vdGU6CisvLyBpbnQgQ1BERlNES19Eb2N1bWVudDo6bWFpbEZvcm0oRlhfQk9PTCBiVUksU3RyaW5nIGN0byxzdHJpbmcgY2NjLHN0cmluZworLy8gY2JjYyxzdHJpbmcgY1N1YmplY3Qsc3RyaW5nIGNtcyk7CisKK0ZYX0JPT0wgRG9jdW1lbnQ6Om1haWxGb3JtKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaW50IGlMZW5ndGggPSBwYXJhbXMuc2l6ZSgpOworCisgIEZYX0JPT0wgYlVJID0gaUxlbmd0aCA+IDAgPyBwYXJhbXNbMF0uVG9Cb29sKCkgOiBUUlVFOworICBDRlhfV2lkZVN0cmluZyBjVG8gPSBpTGVuZ3RoID4gMSA/IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgY0NjID0gaUxlbmd0aCA+IDIgPyBwYXJhbXNbMl0uVG9DRlhXaWRlU3RyaW5nKCkgOiBMIiI7CisgIENGWF9XaWRlU3RyaW5nIGNCY2MgPSBpTGVuZ3RoID4gMyA/IHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgY1N1YmplY3QgPSBpTGVuZ3RoID4gNCA/IHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgY01zZyA9IGlMZW5ndGggPiA1ID8gcGFyYW1zWzVdLlRvQ0ZYV2lkZVN0cmluZygpIDogTCIiOworCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKKworICBDRlhfQnl0ZVRleHRCdWYgdGV4dEJ1ZjsKKyAgaWYgKCFwSW50ZXJGb3JtLT5FeHBvcnRGb3JtVG9GREZUZXh0QnVmKHRleHRCdWYpKQorICAgIHJldHVybiBGQUxTRTsKKworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwQ29udGV4dC0+R2V0UmVhZGVyQXBwKCk7CisgIEFTU0VSVChwRW52ICE9IE5VTEwpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKworICBwUnVudGltZS0+QmVnaW5CbG9jaygpOworICBwRW52LT5KU19kb2NtYWlsRm9ybSh0ZXh0QnVmLkdldEJ1ZmZlcigpLCB0ZXh0QnVmLkdldExlbmd0aCgpLCBiVUksCisgICAgICAgICAgICAgICAgICAgICAgIGNUby5jX3N0cigpLCBjU3ViamVjdC5jX3N0cigpLCBjQ2MuY19zdHIoKSwgY0JjYy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICBjTXNnLmNfc3RyKCkpOworICBwUnVudGltZS0+RW5kQmxvY2soKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OnByaW50KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKworICBGWF9CT09MIGJVSSA9IFRSVUU7CisgIGludCBuU3RhcnQgPSAwOworICBpbnQgbkVuZCA9IDA7CisgIEZYX0JPT0wgYlNpbGVudCA9IEZBTFNFOworICBGWF9CT09MIGJTaHJpbmtUb0ZpdCA9IEZBTFNFOworICBGWF9CT09MIGJQcmludEFzSW1hZ2UgPSBGQUxTRTsKKyAgRlhfQk9PTCBiUmV2ZXJzZSA9IEZBTFNFOworICBGWF9CT09MIGJBbm5vdGF0aW9ucyA9IEZBTFNFOworCisgIGludCBubGVuZ3RoID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKG5sZW5ndGggPT0gOSkgeworICAgIGlmIChwYXJhbXNbOF0uR2V0VHlwZSgpID09IFZUX2Z4b2JqZWN0KSB7CisgICAgICBKU0ZYT2JqZWN0IHBPYmogPSBwYXJhbXNbOF0uVG9WOE9iamVjdCgpOworICAgICAgeworICAgICAgICBpZiAoSlNfR2V0T2JqRGVmbklEKHBPYmopID09CisgICAgICAgICAgICBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIlByaW50UGFyYW1zT2JqIikpIHsKKyAgICAgICAgICBpZiAoQ0pTX09iamVjdCogcEpTT2JqID0gcGFyYW1zWzhdLlRvQ0pTT2JqZWN0KCkpIHsKKyAgICAgICAgICAgIGlmIChQcmludFBhcmFtc09iaiogcHByaW50cGFyYW1zT2JqID0KKyAgICAgICAgICAgICAgICAgICAgKFByaW50UGFyYW1zT2JqKilwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpIHsKKyAgICAgICAgICAgICAgYlVJID0gcHByaW50cGFyYW1zT2JqLT5iVUk7CisgICAgICAgICAgICAgIG5TdGFydCA9IHBwcmludHBhcmFtc09iai0+blN0YXJ0OworICAgICAgICAgICAgICBuRW5kID0gcHByaW50cGFyYW1zT2JqLT5uRW5kOworICAgICAgICAgICAgICBiU2lsZW50ID0gcHByaW50cGFyYW1zT2JqLT5iU2lsZW50OworICAgICAgICAgICAgICBiU2hyaW5rVG9GaXQgPSBwcHJpbnRwYXJhbXNPYmotPmJTaHJpbmtUb0ZpdDsKKyAgICAgICAgICAgICAgYlByaW50QXNJbWFnZSA9IHBwcmludHBhcmFtc09iai0+YlByaW50QXNJbWFnZTsKKyAgICAgICAgICAgICAgYlJldmVyc2UgPSBwcHJpbnRwYXJhbXNPYmotPmJSZXZlcnNlOworICAgICAgICAgICAgICBiQW5ub3RhdGlvbnMgPSBwcHJpbnRwYXJhbXNPYmotPmJBbm5vdGF0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChubGVuZ3RoID49IDEpCisgICAgICBiVUkgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CisgICAgaWYgKG5sZW5ndGggPj0gMikKKyAgICAgIG5TdGFydCA9IHBhcmFtc1sxXS5Ub0ludCgpOworICAgIGlmIChubGVuZ3RoID49IDMpCisgICAgICBuRW5kID0gcGFyYW1zWzJdLlRvSW50KCk7CisgICAgaWYgKG5sZW5ndGggPj0gNCkKKyAgICAgIGJTaWxlbnQgPSBwYXJhbXNbM10uVG9Cb29sKCk7CisgICAgaWYgKG5sZW5ndGggPj0gNSkKKyAgICAgIGJTaHJpbmtUb0ZpdCA9IHBhcmFtc1s0XS5Ub0Jvb2woKTsKKyAgICBpZiAobmxlbmd0aCA+PSA2KQorICAgICAgYlByaW50QXNJbWFnZSA9IHBhcmFtc1s1XS5Ub0Jvb2woKTsKKyAgICBpZiAobmxlbmd0aCA+PSA3KQorICAgICAgYlJldmVyc2UgPSBwYXJhbXNbNl0uVG9Cb29sKCk7CisgICAgaWYgKG5sZW5ndGggPj0gOCkKKyAgICAgIGJBbm5vdGF0aW9ucyA9IHBhcmFtc1s3XS5Ub0Jvb2woKTsKKyAgfQorCisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAoQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKSkgeworICAgIHBFbnYtPkpTX2RvY3ByaW50KGJVSSwgblN0YXJ0LCBuRW5kLCBiU2lsZW50LCBiU2hyaW5rVG9GaXQsIGJQcmludEFzSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgYlJldmVyc2UsIGJBbm5vdGF0aW9ucyk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCisvLyByZW1vdmVzIHRoZSBzcGVjaWZpZWQgZmllbGQgZnJvbSB0aGUgZG9jdW1lbnQuCisvLyBjb21tZW50OgorLy8gbm90ZTogaWYgdGhlIGZpbGVkIG5hbWUgaXMgbm90IHJldGlvbmFsLCBhZG9iZSBpcyBkdW1iIGZvciBpdC4KKworRlhfQk9PTCBEb2N1bWVudDo6cmVtb3ZlRmllbGQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKCEobV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKKyAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgc0ZpZWxkTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPQorICAgICAgKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworCisgIENGWF9QdHJBcnJheSB3aWRnZXRzOworICBwSW50ZXJGb3JtLT5HZXRXaWRnZXRzKHNGaWVsZE5hbWUsIHdpZGdldHMpOworCisgIGludCBuU2l6ZSA9IHdpZGdldHMuR2V0U2l6ZSgpOworCisgIGlmIChuU2l6ZSA+IDApIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5TaXplOyBpKyspIHsKKyAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0Kil3aWRnZXRzW2ldOworICAgICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CisKKyAgICAgIENQREZfUmVjdCByY0Fubm90ID0gcFdpZGdldC0+R2V0UmVjdCgpOworICAgICAgcmNBbm5vdC5sZWZ0IC09IDE7CisgICAgICByY0Fubm90LmJvdHRvbSAtPSAxOworICAgICAgcmNBbm5vdC5yaWdodCArPSAxOworICAgICAgcmNBbm5vdC50b3AgKz0gMTsKKworICAgICAgQ0ZYX1JlY3RBcnJheSBhUmVmcmVzaDsKKyAgICAgIGFSZWZyZXNoLkFkZChyY0Fubm90KTsKKworICAgICAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBXaWRnZXQtPkdldFBERlhGQVBhZ2UoKTsKKyAgICAgIEFTU0VSVChwUGFnZSAhPSBOVUxMKTsKKworICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VWaWV3KHBQYWdlKTsKKyAgICAgIHBQYWdlVmlldy0+RGVsZXRlQW5ub3QocFdpZGdldCk7CisKKyAgICAgIHBQYWdlVmlldy0+VXBkYXRlUmVjdHMoYVJlZnJlc2gpOworICAgIH0KKyAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIHJlc2V0IGZpbGVkIHZhbHVlcyB3aXRoaW4gYSBkb2N1bWVudC4KKy8vIGNvbW1lbnQ6CisvLyBub3RlOiBpZiB0aGUgZmllbGRzIG5hbWVzIHIgbm90IHJhdGlvbmFsLCBhb2RiZSBpcyBkdW1iIGZvciBpdC4KKworRlhfQk9PTCBEb2N1bWVudDo6cmVzZXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGlmICghKG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8CisgICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSB8fAorICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKKworICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBQREZGb3JtICE9IE5VTEwpOworCisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CisgIENKU19BcnJheSBhTmFtZShpc29sYXRlKTsKKworICBpZiAocGFyYW1zLnNpemUoKSA+IDApIHsKKyAgICBzd2l0Y2ggKHBhcmFtc1swXS5HZXRUeXBlKCkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGFOYW1lLkF0dGFjaChwYXJhbXNbMF0uVG9WOEFycmF5KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVlRfc3RyaW5nOgorICAgICAgICBhTmFtZS5TZXRFbGVtZW50KDAsIHBhcmFtc1swXSk7CisgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIENGWF9QdHJBcnJheSBmaWVsZE9iamVjdHM7Ci0gICAgZm9yIChpbnQgaT0wLHN6PWFGaWVsZHMuR2V0TGVuZ3RoKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICAgIENKU19WYWx1ZSB2YWxOYW1lKGlzb2xhdGUpOwotICAgICAgICBhRmllbGRzLkdldEVsZW1lbnQoaSwgdmFsTmFtZSk7CisgICAgQ0ZYX1B0ckFycmF5IGFGaWVsZHM7CiAKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc05hbWUgPSB2YWxOYW1lLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgICAgICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDAsIGpzeiA9IHBQREZGb3JtLT5Db3VudEZpZWxkcyhzTmFtZSk7IGogPCBqc3o7ICsraikKLSAgICAgICAgewotICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IHBQREZGb3JtLT5HZXRGaWVsZChqLCBzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoIWJFbXB0eSAmJiBwRmllbGQtPkdldFZhbHVlKCkuSXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgIGZvciAoaW50IGkgPSAwLCBpc3ogPSBhTmFtZS5HZXRMZW5ndGgoKTsgaSA8IGlzejsgaSsrKSB7CisgICAgICBDSlNfVmFsdWUgdmFsRWxlbWVudChpc29sYXRlKTsKKyAgICAgIGFOYW1lLkdldEVsZW1lbnQoaSwgdmFsRWxlbWVudCk7CisgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbCA9IHZhbEVsZW1lbnQuVG9DRlhXaWRlU3RyaW5nKCk7CiAKLSAgICAgICAgICAgIGZpZWxkT2JqZWN0cy5BZGQocEZpZWxkKTsKLSAgICAgICAgfQorICAgICAgZm9yIChpbnQgaiA9IDAsIGpzeiA9IHBQREZGb3JtLT5Db3VudEZpZWxkcyhzd1ZhbCk7IGogPCBqc3o7IGorKykgeworICAgICAgICBhRmllbGRzLkFkZCgodm9pZCopcFBERkZvcm0tPkdldEZpZWxkKGosIHN3VmFsKSk7CisgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoJmZpZWxkT2JqZWN0cywgVFJVRSkpCi0gICAgewotICAgICAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOwotICAgICAgICBwSW50ZXJGb3JtLT5TdWJtaXRGaWVsZHMoc3RyVVJMLCBmaWVsZE9iamVjdHMsIFRSVUUsICFiRkRGKTsKLSAgICAgICAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CisgICAgaWYgKGFGaWVsZHMuR2V0U2l6ZSgpID4gMCkgeworICAgICAgcFBERkZvcm0tPlJlc2V0Rm9ybShhRmllbGRzLCBUUlVFLCBUUlVFKTsKKyAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHBQREZGb3JtLT5SZXNldEZvcm0oVFJVRSk7CisgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpzYXZlQXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpzdWJtaXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBpbnQgblNpemUgPSBwYXJhbXMuc2l6ZSgpOworICBpZiAoblNpemUgPCAxKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBDRlhfV2lkZVN0cmluZyBzdHJVUkw7CisgIEZYX0JPT0wgYkZERiA9IFRSVUU7CisgIEZYX0JPT0wgYkVtcHR5ID0gRkFMU0U7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CisgIENKU19BcnJheSBhRmllbGRzKGlzb2xhdGUpOworCisgIENKU19WYWx1ZSB2ID0gcGFyYW1zWzBdOworICBpZiAodi5HZXRUeXBlKCkgPT0gVlRfc3RyaW5nKSB7CisgICAgc3RyVVJMID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIGlmIChuU2l6ZSA+IDEpCisgICAgICBiRkRGID0gcGFyYW1zWzFdLlRvQm9vbCgpOworICAgIGlmIChuU2l6ZSA+IDIpCisgICAgICBiRW1wdHkgPSBwYXJhbXNbMl0uVG9Cb29sKCk7CisgICAgaWYgKG5TaXplID4gMykKKyAgICAgIGFGaWVsZHMuQXR0YWNoKHBhcmFtc1szXS5Ub1Y4QXJyYXkoKSk7CisgIH0gZWxzZSBpZiAodi5HZXRUeXBlKCkgPT0gVlRfb2JqZWN0KSB7CisgICAgSlNPYmplY3QgcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KCk7CisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNVUkwiKTsKKyAgICBpZiAoIXBWYWx1ZS5Jc0VtcHR5KCkpCisgICAgICBzdHJVUkwgPQorICAgICAgICAgIENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJiRkRGIik7CisgICAgYkZERiA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQm9vbCgpOworICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJiRW1wdHkiKTsKKyAgICBiRW1wdHkgPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0Jvb2woKTsKKyAgICBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiYUZpZWxkcyIpOworICAgIGFGaWVsZHMuQXR0YWNoKAorICAgICAgICBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub1Y4QXJyYXkoKSk7CisgIH0KKworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBDUERGX0ludGVyRm9ybSogcFBERkludGVyRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworICBGWF9CT09MIGJBbGwgPSAoYUZpZWxkcy5HZXRMZW5ndGgoKSA9PSAwKTsKKyAgaWYgKGJBbGwgJiYgYkVtcHR5KSB7CisgICAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoKSkgeworICAgICAgcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKKyAgICAgIHBJbnRlckZvcm0tPlN1Ym1pdEZvcm0oc3RyVVJMLCBGQUxTRSk7CisgICAgICBwUnVudGltZS0+RW5kQmxvY2soKTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBDRlhfUHRyQXJyYXkgZmllbGRPYmplY3RzOworICBmb3IgKGludCBpID0gMCwgc3ogPSBhRmllbGRzLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgeworICAgIENKU19WYWx1ZSB2YWxOYW1lKGlzb2xhdGUpOworICAgIGFGaWVsZHMuR2V0RWxlbWVudChpLCB2YWxOYW1lKTsKKworICAgIENGWF9XaWRlU3RyaW5nIHNOYW1lID0gdmFsTmFtZS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgICBmb3IgKGludCBqID0gMCwganN6ID0gcFBERkZvcm0tPkNvdW50RmllbGRzKHNOYW1lKTsgaiA8IGpzejsgKytqKSB7CisgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcFBERkZvcm0tPkdldEZpZWxkKGosIHNOYW1lKTsKKyAgICAgIGlmICghYkVtcHR5ICYmIHBGaWVsZC0+R2V0VmFsdWUoKS5Jc0VtcHR5KCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBmaWVsZE9iamVjdHMuQWRkKHBGaWVsZCk7CisgICAgfQorICB9CisKKyAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoJmZpZWxkT2JqZWN0cywgVFJVRSkpIHsKKyAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOworICAgIHBJbnRlckZvcm0tPlN1Ym1pdEZpZWxkcyhzdHJVUkwsIGZpZWxkT2JqZWN0cywgVFJVRSwgIWJGREYpOworICAgIHBSdW50aW1lLT5FbmRCbG9jaygpOworICB9CisgIHJldHVybiBUUlVFOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXZvaWQgRG9jdW1lbnQ6OkF0dGFjaERvYyhDUERGU0RLX0RvY3VtZW50ICpwRG9jKQotewotICAgIG1fcERvY3VtZW50ID0gcERvYzsKK3ZvaWQgRG9jdW1lbnQ6OkF0dGFjaERvYyhDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIG1fcERvY3VtZW50ID0gcERvYzsKIH0KIAotQ1BERlNES19Eb2N1bWVudCAqIERvY3VtZW50OjpHZXRSZWFkZXJEb2MoKQotewotICAgIHJldHVybiBtX3BEb2N1bWVudDsKK0NQREZTREtfRG9jdW1lbnQqIERvY3VtZW50OjpHZXRSZWFkZXJEb2MoKSB7CisgIHJldHVybiBtX3BEb2N1bWVudDsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6RXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQgKnBEb2MsQ0ZYX0J5dGVTdHJpbmcgJnN0ckZpbGVOYW1lKQoteworRlhfQk9PTCBEb2N1bWVudDo6RXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZpbGVOYW1lKSB7CisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6RXh0cmFjdEZvbGRlck5hbWUoQ1BERlNES19Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJGb2xkZXJOYW1lKSB7CisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6Ym9va21hcmtSb290KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6Om1haWxEb2MoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgRlhfQk9PTCBiVUkgPSBUUlVFOworICBDRlhfV2lkZVN0cmluZyBjVG8gPSBMIiI7CisgIENGWF9XaWRlU3RyaW5nIGNDYyA9IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgY0JjYyA9IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgY1N1YmplY3QgPSBMIiI7CisgIENGWF9XaWRlU3RyaW5nIGNNc2cgPSBMIiI7CisKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMSkKKyAgICBiVUkgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CisgIGlmIChwYXJhbXMuc2l6ZSgpID49IDIpCisgICAgY1RvID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOworICBpZiAocGFyYW1zLnNpemUoKSA+PSAzKQorICAgIGNDYyA9IHBhcmFtc1syXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gNCkKKyAgICBjQmNjID0gcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpOworICBpZiAocGFyYW1zLnNpemUoKSA+PSA1KQorICAgIGNTdWJqZWN0ID0gcGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZygpOworICBpZiAocGFyYW1zLnNpemUoKSA+PSA2KQorICAgIGNNc2cgPSBwYXJhbXNbNV0uVG9DRlhXaWRlU3RyaW5nKCk7CisKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKKworICBpZiAocGFyYW1zLnNpemUoKSA+PSAxICYmIHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfb2JqZWN0KSB7CisgICAgSlNPYmplY3QgcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KCk7CisKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiYlVJIik7CisgICAgYlVJID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9JbnQoKTsKKworICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjVG8iKTsKKyAgICBjVG8gPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKKworICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjQ2MiKTsKKyAgICBjQ2MgPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKKworICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjQmNjIik7CisgICAgY0JjYyA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworCisgICAgcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNTdWJqZWN0Iik7CisgICAgY1N1YmplY3QgPQorICAgICAgICBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKKworICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjTXNnIik7CisgICAgY01zZyA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworICB9CisKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKworICBwUnVudGltZS0+QmVnaW5CbG9jaygpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcFJ1bnRpbWUtPkdldFJlYWRlckFwcCgpOworICBwRW52LT5KU19kb2NtYWlsRm9ybShOVUxMLCAwLCBiVUksIGNUby5jX3N0cigpLCBjU3ViamVjdC5jX3N0cigpLCBjQ2MuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY0JjYy5jX3N0cigpLCBjTXNnLmNfc3RyKCkpOworICBwUnVudGltZS0+RW5kQmxvY2soKTsKKworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6YXV0aG9yKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPQorICAgICAgbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpLT5HZXRJbmZvKCk7CisgIGlmICghcERpY3Rpb25hcnkpCiAgICAgcmV0dXJuIEZBTFNFOwotfQogCi1GWF9CT09MIERvY3VtZW50OjpFeHRyYWN0Rm9sZGVyTmFtZShDUERGU0RLX0RvY3VtZW50ICpwRG9jLENGWF9CeXRlU3RyaW5nICZzdHJGb2xkZXJOYW1lKQotewotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6Ym9va21hcmtSb290KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJBdXRob3IiKTsKICAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NBdXRob3I7CisgICAgdnAgPj4gY3NBdXRob3I7CisgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJBdXRob3IiLCBQREZfRW5jb2RlVGV4dChjc0F1dGhvcikpOworICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6bWFpbERvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmluZm8oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAotICAgIEZYX0JPT0wgYlVJID0gVFJVRTsKLSAgICBDRlhfV2lkZVN0cmluZyBjVG8gPSBMIiI7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY0NjID0gTCIiOwotICAgIENGWF9XaWRlU3RyaW5nIGNCY2MgPSBMIiI7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY1N1YmplY3QgPSBMIiI7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY01zZyA9IEwiIjsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9CisgICAgICBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCktPkdldEluZm8oKTsKKyAgaWYgKCFwRGljdGlvbmFyeSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBpZiAocGFyYW1zLnNpemUoKSA+PSAxKQotICAgICAgICBiVUkgPSBwYXJhbXNbMF0uVG9Cb29sKCk7Ci0gICAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMikKLSAgICAgICAgY1RvID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgIGlmIChwYXJhbXMuc2l6ZSgpID49IDMpCi0gICAgICAgIGNDYyA9IHBhcmFtc1syXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLSAgICBpZiAocGFyYW1zLnNpemUoKSA+PSA0KQotICAgICAgICBjQmNjID0gcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgIGlmIChwYXJhbXMuc2l6ZSgpID49IDUpCi0gICAgICAgIGNTdWJqZWN0ID0gcGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgIGlmIChwYXJhbXMuc2l6ZSgpID49IDYpCi0gICAgICAgIGNNc2cgPSBwYXJhbXNbNV0uVG9DRlhXaWRlU3RyaW5nKCk7CisgIENGWF9XaWRlU3RyaW5nIGN3QXV0aG9yID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJBdXRob3IiKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgY3dUaXRsZSA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiVGl0bGUiKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgY3dTdWJqZWN0ID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJTdWJqZWN0Iik7CisgIENGWF9XaWRlU3RyaW5nIGN3S2V5d29yZHMgPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIktleXdvcmRzIik7CisgIENGWF9XaWRlU3RyaW5nIGN3Q3JlYXRvciA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQ3JlYXRvciIpOworICBDRlhfV2lkZVN0cmluZyBjd1Byb2R1Y2VyID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJQcm9kdWNlciIpOworICBDRlhfV2lkZVN0cmluZyBjd0NyZWF0aW9uRGF0ZSA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQ3JlYXRpb25EYXRlIik7CisgIENGWF9XaWRlU3RyaW5nIGN3TW9kRGF0ZSA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiTW9kRGF0ZSIpOworICBDRlhfV2lkZVN0cmluZyBjd1RyYXBwZWQgPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIlRyYXBwZWQiKTsKIAotICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7Ci0KLSAgICBpZihwYXJhbXMuc2l6ZSgpID49IDEgJiYgcGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9vYmplY3QpCi0gICAgewotICAgICAgICBKU09iamVjdCBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKLQotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUscE9iaiwgTCJiVUkiKTsKLSAgICAgICAgYlVJID0gQ0pTX1ZhbHVlKGlzb2xhdGUscFZhbHVlLEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvSW50KCk7Ci0KLSAgICAgICAgcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLHBPYmosIEwiY1RvIik7Ci0gICAgICAgIGNUbyA9IENKU19WYWx1ZShpc29sYXRlLHBWYWx1ZSxHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQotICAgICAgICBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUscE9iaiwgTCJjQ2MiKTsKLSAgICAgICAgY0NjID0gQ0pTX1ZhbHVlKGlzb2xhdGUscFZhbHVlLEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwotCi0gICAgICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSxwT2JqLCBMImNCY2MiKTsKLSAgICAgICAgY0JjYyA9IENKU19WYWx1ZShpc29sYXRlLHBWYWx1ZSxHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQotICAgICAgICBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUscE9iaiwgTCJjU3ViamVjdCIpOwotICAgICAgICBjU3ViamVjdCA9IENKU19WYWx1ZShpc29sYXRlLHBWYWx1ZSxHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQotICAgICAgICBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUscE9iaiwgTCJjTXNnIik7Ci0gICAgICAgIGNNc2cgPSBDSlNfVmFsdWUoaXNvbGF0ZSxwVmFsdWUsR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7Ci0KLSAgICB9Ci0KKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CiAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLSAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0gICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKLQotICAgIHBSdW50aW1lLT5CZWdpbkJsb2NrKCk7Ci0gICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBSdW50aW1lLT5HZXRSZWFkZXJBcHAoKTsKLSAgICBwRW52LT5KU19kb2NtYWlsRm9ybShOVUxMLCAwLCBiVUksIGNUby5jX3N0cigpLCBjU3ViamVjdC5jX3N0cigpLCBjQ2MuY19zdHIoKSwgY0JjYy5jX3N0cigpLCBjTXNnLmNfc3RyKCkpOwotICAgIHBSdW50aW1lLT5FbmRCbG9jaygpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmF1dGhvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKS0+R2V0SW5mbygpOwotCWlmICghcERpY3Rpb25hcnkpcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKHZwLklzR2V0dGluZygpKQotICAgIHsKLSAgICAgICAgdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJBdXRob3IiKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0F1dGhvcjsKLSAgICAgICAgdnAgPj4gY3NBdXRob3I7Ci0gICAgICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiQXV0aG9yIiwgUERGX0VuY29kZVRleHQoY3NBdXRob3IpKTsKLSAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotfQotCi1GWF9CT09MIERvY3VtZW50OjppbmZvKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpLT5HZXRJbmZvKCk7Ci0JaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gRkFMU0U7Ci0KLQlDRlhfV2lkZVN0cmluZyBjd0F1dGhvcgkJCT0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJBdXRob3IiKTsKLQlDRlhfV2lkZVN0cmluZyBjd1RpdGxlCQkJPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIlRpdGxlIik7Ci0JQ0ZYX1dpZGVTdHJpbmcgY3dTdWJqZWN0CQk9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiU3ViamVjdCIpOwotCUNGWF9XaWRlU3RyaW5nIGN3S2V5d29yZHMJCT0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJLZXl3b3JkcyIpOwotCUNGWF9XaWRlU3RyaW5nIGN3Q3JlYXRvcgkJPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIkNyZWF0b3IiKTsKLQlDRlhfV2lkZVN0cmluZyBjd1Byb2R1Y2VyCQk9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiUHJvZHVjZXIiKTsKLQlDRlhfV2lkZVN0cmluZyBjd0NyZWF0aW9uRGF0ZQk9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQ3JlYXRpb25EYXRlIik7Ci0JQ0ZYX1dpZGVTdHJpbmcgY3dNb2REYXRlCQk9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiTW9kRGF0ZSIpOwotCUNGWF9XaWRlU3RyaW5nIGN3VHJhcHBlZAkJPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIlRyYXBwZWQiKTsKLQotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7Ci0JaWYgKHZwLklzR2V0dGluZygpKQotCXsKLQkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQotCQlKU0ZYT2JqZWN0ICBwT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgcENvbnRleHQsIC0xKTsKLQotCQlKU19QdXRPYmplY3RTdHJpbmcoaXNvbGF0ZSwgcE9iaiwgTCJBdXRob3IiLCBjd0F1dGhvci5jX3N0cigpKTsKLQkJSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiVGl0bGUiLCBjd1RpdGxlLmNfc3RyKCkpOwotCQlKU19QdXRPYmplY3RTdHJpbmcoaXNvbGF0ZSwgcE9iaiwgTCJTdWJqZWN0IiwgY3dTdWJqZWN0LmNfc3RyKCkpOwotCQlKU19QdXRPYmplY3RTdHJpbmcoaXNvbGF0ZSwgcE9iaiwgTCJLZXl3b3JkcyIsIGN3S2V5d29yZHMuY19zdHIoKSk7Ci0JCUpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIkNyZWF0b3IiLCBjd0NyZWF0b3IuY19zdHIoKSk7Ci0JCUpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIlByb2R1Y2VyIiwgY3dQcm9kdWNlci5jX3N0cigpKTsKLQkJSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiQ3JlYXRpb25EYXRlIiwgY3dDcmVhdGlvbkRhdGUuY19zdHIoKSk7Ci0JCUpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIk1vZERhdGUiLCBjd01vZERhdGUuY19zdHIoKSk7Ci0JCUpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIlRyYXBwZWQiLCBjd1RyYXBwZWQuY19zdHIoKSk7Ci0KLS8vIEl0J3MgdG8gYmUgY29tcGF0aWJsZSB0byBub24tc3RhbmRhcmQgaW5mbyBkaWN0aW9uYXJ5LgotCQlGWF9QT1NJVElPTiBwb3MgPSBwRGljdGlvbmFyeS0+R2V0U3RhcnRQb3MoKTsKLQkJd2hpbGUocG9zKQotCQl7Ci0JCQlDRlhfQnl0ZVN0cmluZyBic0tleTsKLQkJCUNQREZfT2JqZWN0KiBwVmFsdWVPYmogPSBwRGljdGlvbmFyeS0+R2V0TmV4dEVsZW1lbnQocG9zLCBic0tleSk7Ci0JCQlDRlhfV2lkZVN0cmluZyB3c0tleSAgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNLZXksIGJzS2V5LkdldExlbmd0aCgpKTsKLQkJCWlmKChwVmFsdWVPYmotPkdldFR5cGUoKT09UERGT0JKX1NUUklORykgfHwgKHBWYWx1ZU9iai0+R2V0VHlwZSgpPT1QREZPQkpfTkFNRSkgKQotCQkJCUpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCB3c0tleS5jX3N0cigpLCBwVmFsdWVPYmotPkdldFVuaWNvZGVUZXh0KCkuY19zdHIoKSk7Ci0JCQlpZihwVmFsdWVPYmotPkdldFR5cGUoKT09UERGT0JKX05VTUJFUikKLQkJCQlKU19QdXRPYmplY3ROdW1iZXIoaXNvbGF0ZSxwT2JqLCB3c0tleS5jX3N0cigpLCAoZmxvYXQpcFZhbHVlT2JqLT5HZXROdW1iZXIoKSk7Ci0JCQlpZihwVmFsdWVPYmotPkdldFR5cGUoKT09UERGT0JKX0JPT0xFQU4pCi0JCQkJSlNfUHV0T2JqZWN0Qm9vbGVhbihpc29sYXRlLHBPYmosIHdzS2V5LmNfc3RyKCksIChib29sKXBWYWx1ZU9iai0+R2V0SW50ZWdlcigpKTsKLQkJfQotCi0JCXZwIDw8IHBPYmo7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gVFJVRTsKLQl9Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmNyZWF0aW9uRGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKS0+R2V0SW5mbygpOwotCWlmICghcERpY3Rpb25hcnkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQ3JlYXRpb25EYXRlIik7Ci0JfQotCWVsc2UKLQl7Ci0gICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NDcmVhdGlvbkRhdGU7Ci0gICAgICAgIHZwID4+IGNzQ3JlYXRpb25EYXRlOwotICAgICAgICBwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIkNyZWF0aW9uRGF0ZSIsIFBERl9FbmNvZGVUZXh0KGNzQ3JlYXRpb25EYXRlKSk7Ci0gICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpjcmVhdG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpLT5HZXRJbmZvKCk7Ci0JaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKHZwLklzR2V0dGluZygpKQotICAgIHsKLSAgICAgICAgdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJDcmVhdG9yIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NDcmVhdG9yOwotICAgICAgICB2cCA+PiBjc0NyZWF0b3I7Ci0gICAgICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiQ3JlYXRvciIsIFBERl9FbmNvZGVUZXh0KGNzQ3JlYXRvcikpOwotICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6ZGVsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IG1fYkRlbGF5OwotCX0KLQllbHNlCi0JewotCQlpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCXZwID4+IG1fYkRlbGF5OwotCQlpZiAobV9iRGVsYXkpCi0JCXsKLQkJCWZvciAoaW50IGk9MCxzej1tX0RlbGF5RGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCQlkZWxldGUgbV9EZWxheURhdGEuR2V0QXQoaSk7Ci0KLQkJCW1fRGVsYXlEYXRhLlJlbW92ZUFsbCgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZm9yIChpbnQgaT0wLHN6PW1fRGVsYXlEYXRhLkdldFNpemUoKTsgaTxzejsgaSsrKQotCQkJewotCQkJCWlmIChDSlNfRGVsYXlEYXRhKiBwRGF0YSA9IG1fRGVsYXlEYXRhLkdldEF0KGkpKQotCQkJCXsKLQkJCQkJRmllbGQ6OkRvRGVsYXkobV9wRG9jdW1lbnQsIHBEYXRhKTsKLQkJCQkJZGVsZXRlIG1fRGVsYXlEYXRhLkdldEF0KGkpOwotCQkJCX0KLQkJCX0KLQkJCW1fRGVsYXlEYXRhLlJlbW92ZUFsbCgpOwotCQl9Ci0KLQl9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmtleXdvcmRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpLT5HZXRJbmZvKCk7Ci0gICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKHZwLklzR2V0dGluZygpKQotICAgIHsKLSAgICAgICAgdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJLZXl3b3JkcyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzS2V5d29yZHM7Ci0gICAgICAgIHZwID4+IGNzS2V5d29yZHM7Ci0gICAgICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiS2V5d29yZHMiLCBQREZfRW5jb2RlVGV4dChjc0tleXdvcmRzKSk7Ci0gICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50Ojptb2REYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpLT5HZXRJbmZvKCk7Ci0gICAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKHZwLklzR2V0dGluZygpKQotICAgIHsKLSAgICAgICAgdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJNb2REYXRlIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3Ntb2REYXRlOwotICAgICAgICB2cCA+PiBjc21vZERhdGU7Ci0gICAgICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiTW9kRGF0ZSIsIFBERl9FbmNvZGVUZXh0KGNzbW9kRGF0ZSkpOwotICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6cHJvZHVjZXIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCktPkdldEluZm8oKTsKLSAgICBpZiAoIXBEaWN0aW9uYXJ5KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAodnAuSXNHZXR0aW5nKCkpCi0gICAgewotICAgICAgICB2cCA8PCBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIlByb2R1Y2VyIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3Nwcm9kdWNlcjsKLSAgICAgICAgdnAgPj4gY3Nwcm9kdWNlcjsKLSAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJQcm9kdWNlciIsIFBERl9FbmNvZGVUZXh0KGNzcHJvZHVjZXIpKTsKLSAgICAgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OnN1YmplY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCktPkdldEluZm8oKTsKLSAgICBpZiAoIXBEaWN0aW9uYXJ5KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAodnAuSXNHZXR0aW5nKCkpCi0gICAgewotICAgICAgICB2cCA8PCBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIlN1YmplY3QiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc3N1YmplY3Q7Ci0gICAgICAgIHZwID4+IGNzc3ViamVjdDsKLSAgICAgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJTdWJqZWN0IiwgUERGX0VuY29kZVRleHQoY3NzdWJqZWN0KSk7Ci0gICAgICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50Ojp0aXRsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgaWYgKG1fcERvY3VtZW50ID09IE5VTEwgfHwgbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKS0+R2V0SW5mbygpOwotICAgIGlmICghcERpY3Rpb25hcnkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGlmICh2cC5Jc0dldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIHZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiVGl0bGUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc3RpdGxlOwotICAgICAgICB2cCA+PiBjc3RpdGxlOwotICAgICAgICBwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIlRpdGxlIiwgUERGX0VuY29kZVRleHQoY3N0aXRsZSkpOwotICAgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6bnVtUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdnAgPDwgbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOwotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpleHRlcm5hbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgLy9JbiBDaHJvbWUgY2FzZSxzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlLgotICAgIGlmICh2cC5Jc0dldHRpbmcoKSkgewotICAgICAgICB2cCA8PCB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6ZmlsZXNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdnAgPDwgMDsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6bW91c2VYKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6bW91c2VZKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6YmFzZVVSTChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgaWYgKHZwLklzR2V0dGluZygpKQotICAgIHsKLSAgICAgICAgdnAgPDwgbV9jd0Jhc2VVUkw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZwID4+IG1fY3dCYXNlVVJMOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6Y2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzR2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKHBJbnRlckZvcm0tPklzQ2FsY3VsYXRlRW5hYmxlZCgpKQotICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdnAgPDwgZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGJvb2wgYkNhbGN1bGF0ZTsKLSAgICAgICAgdnAgPj4gYkNhbGN1bGF0ZTsKLQotICAgICAgICBwSW50ZXJGb3JtLT5FbmFibGVDYWxjdWxhdGUoYkNhbGN1bGF0ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmRvY3VtZW50RmlsZU5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aCA9IG1fcERvY3VtZW50LT5HZXRQYXRoKCk7Ci0gICAgaW50MzJfdCBpID0gd3NGaWxlUGF0aC5HZXRMZW5ndGgoKSAtIDE7Ci0gICAgZm9yICggOyBpID49IDA7IGktLSApCi0gICAgewotICAgICAgICBpZiAoIHdzRmlsZVBhdGguR2V0QXQoIGkgKSA9PSBMJ1xcJyB8fCB3c0ZpbGVQYXRoLkdldEF0KCBpICkgPT0gTCcvJyApCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKCBpID49IDAgJiYgaSA8IHdzRmlsZVBhdGguR2V0TGVuZ3RoKCkgLSAxICkKLSAgICB7Ci0gICAgICAgIHZwIDw8ICggd3NGaWxlUGF0aC5HZXRCdWZmZXIoIHdzRmlsZVBhdGguR2V0TGVuZ3RoKCkgKSArIGkgKyAxICk7Ci0gICAgfWVsc2V7Ci0gICAgICAgIHZwIDw8IEwiIjsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIERvY3VtZW50OjpSZXZlcnNhbFN0cihDRlhfV2lkZVN0cmluZyBjYkZyb20pCi17Ci0gICAgc2l6ZV90IGlMZW5ndGggPSBjYkZyb20uR2V0TGVuZ3RoKCk7Ci0gICAgICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8c2l6ZV90PiBpU2l6ZSA9IHNpemVvZih3Y2hhcl90KTsKLSAgICBpU2l6ZSAqPSAoaUxlbmd0aCArIDEpOwotICAgIHdjaGFyX3QqIHBSZXN1bHQgPSAod2NoYXJfdCopbWFsbG9jKGlTaXplLlZhbHVlT3JEaWUoKSk7Ci0gICAgd2NoYXJfdCogcEZyb20gPSAod2NoYXJfdCopY2JGcm9tLkdldEJ1ZmZlcihpTGVuZ3RoKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaUxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgICAgcFJlc3VsdFtpXSA9ICoocEZyb20gKyBpTGVuZ3RoIC0gaSAtIDEpOwotICAgIH0KLSAgICBwUmVzdWx0W2lMZW5ndGhdID0gTCdcMCc7Ci0KLSAgICBjYkZyb20uUmVsZWFzZUJ1ZmZlcigpOwotICAgIENGWF9XaWRlU3RyaW5nIGNiUmV0ID0gQ0ZYX1dpZGVTdHJpbmcocFJlc3VsdCk7Ci0gICAgZnJlZShwUmVzdWx0KTsKLSAgICBwUmVzdWx0ID0gTlVMTDsKLSAgICByZXR1cm4gY2JSZXQ7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIERvY3VtZW50OjpDdXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcgY2JGcm9tKQotewotICAgIHNpemVfdCBpTGVuZ3RoID0gY2JGcm9tLkdldExlbmd0aCgpOwotICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8c2l6ZV90PiBpU2l6ZSA9IHNpemVvZih3Y2hhcl90KTsKLSAgICBpU2l6ZSAqPSAoaUxlbmd0aCArIDEpOwotICAgIHdjaGFyX3QqIHBSZXN1bHQgPSAod2NoYXJfdCopbWFsbG9jKGlTaXplLlZhbHVlT3JEaWUoKSk7Ci0gICAgd2NoYXJfdCogcEZyb20gPSAod2NoYXJfdCopY2JGcm9tLkdldEJ1ZmZlcihpTGVuZ3RoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBGcm9tW2ldID09IEwnXFwnIHx8IHBGcm9tW2ldID09IEwnLycpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSZXN1bHRbaV0gPSBMJ1wwJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBSZXN1bHRbaV0gPSBwRnJvbVtpXTsKLSAgICB9Ci0gICAgcFJlc3VsdFtpTGVuZ3RoXSA9IEwnXDAnOwotCi0gICAgY2JGcm9tLlJlbGVhc2VCdWZmZXIoKTsKLSAgICBDRlhfV2lkZVN0cmluZyBjYlJldCA9IENGWF9XaWRlU3RyaW5nKHBSZXN1bHQpOwotICAgIGZyZWUocFJlc3VsdCk7Ci0gICAgcFJlc3VsdCA9IE5VTEw7Ci0gICAgcmV0dXJuIGNiUmV0OwotfQotCi1GWF9CT09MIERvY3VtZW50OjpwYXRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7Ci0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHZwIDw8IGFwcDo6U3lzUGF0aFRvUERGUGF0aChtX3BEb2N1bWVudC0+R2V0UGF0aCgpKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6cGFnZVdpbmRvd1JlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpsYXlvdXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjphZGRMaW5rKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmNsb3NlRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpnZXRQYWdlQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmdldEFubm90KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmdldEFubm90cyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHZSZXQuU2V0TnVsbCgpOwotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpnZXRBbm5vdDNEKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgdlJldC5TZXROdWxsKCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmdldEFubm90czNEKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgdlJldCA9IFZUX3VuZGVmaW5lZDsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6Z2V0T0NHcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpnZXRMaW5rcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sIERvY3VtZW50OjpJc0VuY2xvc2VkSW5SZWN0KENGWF9GbG9hdFJlY3QgcmVjdCwgQ0ZYX0Zsb2F0UmVjdCBMaW5rUmVjdCkKLXsKLSAgICByZXR1cm4gKHJlY3QubGVmdCA8PSBMaW5rUmVjdC5sZWZ0ICYmCi0gICAgICAgICAgICByZWN0LnRvcCA8PSBMaW5rUmVjdC50b3AgJiYKLSAgICAgICAgICAgIHJlY3QucmlnaHQgPj0gTGlua1JlY3QucmlnaHQgJiYKLSAgICAgICAgICAgIHJlY3QuYm90dG9tID49IExpbmtSZWN0LmJvdHRvbSk7Ci19Ci0KLXZvaWQgSWNvblRyZWU6Okluc2VydEljb25FbGVtZW50KEljb25FbGVtZW50KiBwTmV3SWNvbikKLXsKLSAgICBpZiAoIXBOZXdJY29uKXJldHVybjsKLQotICAgIGlmIChtX3BIZWFkID09IE5VTEwgJiYgbV9wRW5kID09IE5VTEwpCi0gICAgewotICAgICAgICBtX3BIZWFkID0gbV9wRW5kID0gcE5ld0ljb247Ci0gICAgICAgIG1faUxlbmd0aCsrOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtX3BFbmQtPk5leHRJY29uID0gcE5ld0ljb247Ci0gICAgICAgIG1fcEVuZCA9IHBOZXdJY29uOwotICAgICAgICBtX2lMZW5ndGgrKzsKLSAgICB9Ci19Ci0KLXZvaWQgSWNvblRyZWU6OkRlbGV0ZUljb25UcmVlKCkKLXsKLSAgICBpZiAoIW1fcEhlYWQgfHwgIW1fcEVuZClyZXR1cm47Ci0KLSAgICBJY29uRWxlbWVudCogcFRlbXAgPSBOVUxMOwotICAgIHdoaWxlKG1fcEVuZCAhPSBtX3BIZWFkKQotICAgIHsKLSAgICAgICAgcFRlbXAgPSBtX3BIZWFkOwotICAgICAgICBtX3BIZWFkID0gbV9wSGVhZC0+TmV4dEljb247Ci0gICAgICAgIGRlbGV0ZSBwVGVtcDsKLSAgICB9Ci0KLSAgICBkZWxldGUgbV9wRW5kOwotICAgIG1fcEhlYWQgPSBOVUxMOwotICAgIG1fcEVuZCA9IE5VTEw7Ci19Ci0KLWludCBJY29uVHJlZTo6R2V0TGVuZ3RoKCkKLXsKLSAgICByZXR1cm4gbV9pTGVuZ3RoOwotfQotCi1JY29uRWxlbWVudCogSWNvblRyZWU6Om9wZXJhdG9yIFtdKGludCBpSW5kZXgpCi17Ci0gICAgaWYgKGlJbmRleCA+PSAwICYmIGlJbmRleCA8PSBtX2lMZW5ndGgpCi0gICAgewotICAgICAgICBJY29uRWxlbWVudCogcFRlbXAgPSBtX3BIZWFkOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlJbmRleDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVGVtcCA9IHBUZW1wLT5OZXh0SWNvbjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcFRlbXA7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIEljb25UcmVlOjpEZWxldGVJY29uRWxlbWVudChDRlhfV2lkZVN0cmluZyBzd0ljb25OYW1lKQotewotCUljb25FbGVtZW50KiBwVGVtcCA9IG1fcEhlYWQ7Ci0JaW50IGlMb29wQ291bnQgPSBtX2lMZW5ndGg7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpTG9vcENvdW50IC0gMTsgaSsrKQotCXsKLQkJaWYgKHBUZW1wID09IG1fcEVuZCkKLQkJCWJyZWFrOwotCi0JCWlmIChtX3BIZWFkLT5JY29uTmFtZSA9PSBzd0ljb25OYW1lKQotCQl7Ci0JCQltX3BIZWFkID0gbV9wSGVhZC0+TmV4dEljb247Ci0JCQlkZWxldGUgcFRlbXA7Ci0JCQltX2lMZW5ndGgtLTsKLQkJCXBUZW1wID0gbV9wSGVhZDsKLQkJfQotCQlpZiAocFRlbXAtPk5leHRJY29uLT5JY29uTmFtZSA9PSBzd0ljb25OYW1lKQotCQl7Ci0JCQlpZiAocFRlbXAtPk5leHRJY29uID09IG1fcEVuZCkKLQkJCXsKLQkJCQltX3BFbmQgPSBwVGVtcDsKLQkJCQlkZWxldGUgcFRlbXAtPk5leHRJY29uOwotCQkJCW1faUxlbmd0aC0tOwotCQkJCXBUZW1wLT5OZXh0SWNvbiA9IE5VTEw7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJSWNvbkVsZW1lbnQqIHBFbGVtZW50ID0gcFRlbXAtPk5leHRJY29uOwotCQkJCXBUZW1wLT5OZXh0SWNvbiA9IHBUZW1wLT5OZXh0SWNvbi0+TmV4dEljb247Ci0JCQkJZGVsZXRlIHBFbGVtZW50OwotCQkJCW1faUxlbmd0aC0tOwotCQkJCXBFbGVtZW50ID0gTlVMTDsKLQkJCX0KLQotCQkJY29udGludWU7Ci0JCX0KLQotCQlwVGVtcCA9IHBUZW1wLT5OZXh0SWNvbjsKLQl9Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmFkZEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nIHN3SWNvbk5hbWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0gICAgSlNGWE9iamVjdCBwSlNJY29uID0gcGFyYW1zWzFdLlRvVjhPYmplY3QoKTsKLQotICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLSAgICBpZiAoSlNfR2V0T2JqRGVmbklEKHBKU0ljb24pICE9IEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiSWNvbiIpKSB7Ci0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVFlQRUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIENKU19FbWJlZE9iaiogcEVtYmVkT2JqID0gcGFyYW1zWzFdLlRvQ0pTT2JqZWN0KCktPkdldEVtYmVkT2JqZWN0KCk7Ci0gICAgaWYgKCFwRW1iZWRPYmopIHsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNUWVBFRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgSWNvbiogcEljb24gPSAoSWNvbiopcEVtYmVkT2JqOwotICAgIGlmICghbV9wSWNvblRyZWUpCi0gICAgICAgIG1fcEljb25UcmVlID0gbmV3IEljb25UcmVlKCk7Ci0KLSAgICBJY29uRWxlbWVudCogcE5ld0ljb24gPSBuZXcgSWNvbkVsZW1lbnQoKTsKLSAgICBwTmV3SWNvbi0+SWNvbk5hbWUgPSBzd0ljb25OYW1lOwotICAgIHBOZXdJY29uLT5OZXh0SWNvbiA9IE5VTEw7Ci0gICAgcE5ld0ljb24tPkljb25TdHJlYW0gPSBwSWNvbjsKLSAgICBtX3BJY29uVHJlZS0+SW5zZXJ0SWNvbkVsZW1lbnQocE5ld0ljb24pOwotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjppY29ucyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOwotICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JFQURPTkxZKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmICghbV9wSWNvblRyZWUpCi0gICAgewotICAgICAgICB2cC5TZXROdWxsKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIENKU19BcnJheSBJY29ucyhtX2lzb2xhdGUpOwotICAgIEljb25FbGVtZW50KiBwSWNvbkVsZW1lbnQgPSBOVUxMOwotICAgIGludCBpSWNvblRyZWVMZW5ndGggPSBtX3BJY29uVHJlZS0+R2V0TGVuZ3RoKCk7Ci0KLSAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CiAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlJY29uVHJlZUxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgICAgcEljb25FbGVtZW50ID0gKCptX3BJY29uVHJlZSlbaV07CisgICAgSlNGWE9iamVjdCBwT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgcENvbnRleHQsIC0xKTsKIAotICAgICAgICBKU0ZYT2JqZWN0ICBwT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgcENvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiSWNvbiIpKTsKLSAgICAgICAgaWYgKHBPYmouSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7CisgICAgSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiQXV0aG9yIiwgY3dBdXRob3IuY19zdHIoKSk7CisgICAgSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiVGl0bGUiLCBjd1RpdGxlLmNfc3RyKCkpOworICAgIEpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIlN1YmplY3QiLCBjd1N1YmplY3QuY19zdHIoKSk7CisgICAgSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiS2V5d29yZHMiLCBjd0tleXdvcmRzLmNfc3RyKCkpOworICAgIEpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIkNyZWF0b3IiLCBjd0NyZWF0b3IuY19zdHIoKSk7CisgICAgSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiUHJvZHVjZXIiLCBjd1Byb2R1Y2VyLmNfc3RyKCkpOworICAgIEpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIkNyZWF0aW9uRGF0ZSIsIGN3Q3JlYXRpb25EYXRlLmNfc3RyKCkpOworICAgIEpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIk1vZERhdGUiLCBjd01vZERhdGUuY19zdHIoKSk7CisgICAgSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiVHJhcHBlZCIsIGN3VHJhcHBlZC5jX3N0cigpKTsKIAotICAgICAgICBDSlNfSWNvbiAqIHBKU19JY29uID0gKENKU19JY29uICopSlNfR2V0UHJpdmF0ZShwT2JqKTsKLSAgICAgICAgaWYgKCFwSlNfSWNvbikgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIEljb24qIHBJY29uID0gKEljb24qKXBKU19JY29uLT5HZXRFbWJlZE9iamVjdCgpOwotICAgICAgICBpZiAoIXBJY29uKXJldHVybiBGQUxTRTsKLQotICAgICAgICBwSWNvbi0+U2V0U3RyZWFtKHBJY29uRWxlbWVudC0+SWNvblN0cmVhbS0+R2V0U3RyZWFtKCkpOwotICAgICAgICBwSWNvbi0+U2V0SWNvbk5hbWUocEljb25FbGVtZW50LT5JY29uTmFtZSk7Ci0gICAgICAgIEljb25zLlNldEVsZW1lbnQoaSwgQ0pTX1ZhbHVlKG1faXNvbGF0ZSxwSlNfSWNvbikpOworICAgIC8vIEl0J3MgdG8gYmUgY29tcGF0aWJsZSB0byBub24tc3RhbmRhcmQgaW5mbyBkaWN0aW9uYXJ5LgorICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBEaWN0aW9uYXJ5LT5HZXRTdGFydFBvcygpOworICAgIHdoaWxlIChwb3MpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5OworICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZU9iaiA9IHBEaWN0aW9uYXJ5LT5HZXROZXh0RWxlbWVudChwb3MsIGJzS2V5KTsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzS2V5ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzS2V5LCBic0tleS5HZXRMZW5ndGgoKSk7CisgICAgICBpZiAoKHBWYWx1ZU9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHx8CisgICAgICAgICAgKHBWYWx1ZU9iai0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSkKKyAgICAgICAgSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIHdzS2V5LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWVPYmotPkdldFVuaWNvZGVUZXh0KCkuY19zdHIoKSk7CisgICAgICBpZiAocFZhbHVlT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikKKyAgICAgICAgSlNfUHV0T2JqZWN0TnVtYmVyKGlzb2xhdGUsIHBPYmosIHdzS2V5LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpcFZhbHVlT2JqLT5HZXROdW1iZXIoKSk7CisgICAgICBpZiAocFZhbHVlT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0JPT0xFQU4pCisgICAgICAgIEpTX1B1dE9iamVjdEJvb2xlYW4oaXNvbGF0ZSwgcE9iaiwgd3NLZXkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYm9vbClwVmFsdWVPYmotPkdldEludGVnZXIoKSk7CiAgICAgfQogCi0gICAgdnAgPDwgSWNvbnM7CisgICAgdnAgPDwgcE9iajsKICAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0gICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewotICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYoIW1fcEljb25UcmVlKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dJY29uTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLSAgICBpbnQgaUljb25Db3VudHMgPSBtX3BJY29uVHJlZS0+R2V0TGVuZ3RoKCk7Ci0KLSAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlJY29uQ291bnRzOyBpKyspCi0gICAgewotICAgICAgICBpZiAoKCptX3BJY29uVHJlZSlbaV0tPkljb25OYW1lID09IHN3SWNvbk5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEljb24qIHBSZXRJY29uID0gKCptX3BJY29uVHJlZSlbaV0tPkljb25TdHJlYW07Ci0KLSAgICAgICAgICAgIEpTRlhPYmplY3QgIHBPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJJY29uIikpOwotICAgICAgICAgICAgaWYgKHBPYmouSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgIENKU19JY29uICogcEpTX0ljb24gPSAoQ0pTX0ljb24gKilKU19HZXRQcml2YXRlKHBPYmopOwotICAgICAgICAgICAgaWYgKCFwSlNfSWNvbikgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgICAgICBJY29uKiBwSWNvbiA9IChJY29uKilwSlNfSWNvbi0+R2V0RW1iZWRPYmplY3QoKTsKLSAgICAgICAgICAgIGlmICghcEljb24pcmV0dXJuIEZBTFNFOwotCi0gICAgICAgICAgICBwSWNvbi0+U2V0SWNvbk5hbWUoc3dJY29uTmFtZSk7Ci0gICAgICAgICAgICBwSWNvbi0+U2V0U3RyZWFtKHBSZXRJY29uLT5HZXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICB2UmV0ID0gcEpTX0ljb247Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQorRlhfQk9PTCBEb2N1bWVudDo6Y3JlYXRpb25EYXRlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9CisgICAgICBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCktPkdldEluZm8oKTsKKyAgaWYgKCFwRGljdGlvbmFyeSkKICAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJDcmVhdGlvbkRhdGUiKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NDcmVhdGlvbkRhdGU7CisgICAgdnAgPj4gY3NDcmVhdGlvbkRhdGU7CisgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJDcmVhdGlvbkRhdGUiLCBQREZfRW5jb2RlVGV4dChjc0NyZWF0aW9uRGF0ZSkpOworICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnJlbW92ZUljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKLQlpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9CitGWF9CT09MIERvY3VtZW50OjpjcmVhdG9yKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0KKyAgICAgIG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKS0+R2V0SW5mbygpOworICBpZiAoIXBEaWN0aW9uYXJ5KQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmKCFtX3BJY29uVHJlZSkKLQkJcmV0dXJuIEZBTFNFOwotCUNGWF9XaWRlU3RyaW5nIHN3SWNvbk5hbWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JcmV0dXJuIFRSVUU7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQ3JlYXRvciIpOworICB9IGVsc2UgeworICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDRlhfV2lkZVN0cmluZyBjc0NyZWF0b3I7CisgICAgdnAgPj4gY3NDcmVhdG9yOworICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiQ3JlYXRvciIsIFBERl9FbmNvZGVUZXh0KGNzQ3JlYXRvcikpOworICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmNyZWF0ZURhdGFPYmplY3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmRlbGF5KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IG1fYkRlbGF5OworICB9IGVsc2UgeworICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICB2cCA+PiBtX2JEZWxheTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fRGVsYXlEYXRhLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgICAgIGRlbGV0ZSBtX0RlbGF5RGF0YS5HZXRBdChpKTsKKworICAgICAgbV9EZWxheURhdGEuUmVtb3ZlQWxsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fRGVsYXlEYXRhLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgaWYgKENKU19EZWxheURhdGEqIHBEYXRhID0gbV9EZWxheURhdGEuR2V0QXQoaSkpIHsKKyAgICAgICAgICBGaWVsZDo6RG9EZWxheShtX3BEb2N1bWVudCwgcERhdGEpOworICAgICAgICAgIGRlbGV0ZSBtX0RlbGF5RGF0YS5HZXRBdChpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbV9EZWxheURhdGEuUmVtb3ZlQWxsKCk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjprZXl3b3JkcyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0KKyAgICAgIG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKS0+R2V0SW5mbygpOworICBpZiAoIXBEaWN0aW9uYXJ5KQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKKyAgICB2cCA8PCBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIktleXdvcmRzIik7CisgIH0gZWxzZSB7CisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENGWF9XaWRlU3RyaW5nIGNzS2V5d29yZHM7CisgICAgdnAgPj4gY3NLZXl3b3JkczsKKyAgICBwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIktleXdvcmRzIiwgUERGX0VuY29kZVRleHQoY3NLZXl3b3JkcykpOworICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6Om1vZERhdGUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPQorICAgICAgbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpLT5HZXRJbmZvKCk7CisgIGlmICghcERpY3Rpb25hcnkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiTW9kRGF0ZSIpOworICB9IGVsc2UgeworICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDRlhfV2lkZVN0cmluZyBjc21vZERhdGU7CisgICAgdnAgPj4gY3Ntb2REYXRlOworICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiTW9kRGF0ZSIsIFBERl9FbmNvZGVUZXh0KGNzbW9kRGF0ZSkpOworICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OnByb2R1Y2VyKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPQorICAgICAgbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpLT5HZXRJbmZvKCk7CisgIGlmICghcERpY3Rpb25hcnkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiUHJvZHVjZXIiKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ0ZYX1dpZGVTdHJpbmcgY3Nwcm9kdWNlcjsKKyAgICB2cCA+PiBjc3Byb2R1Y2VyOworICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiUHJvZHVjZXIiLCBQREZfRW5jb2RlVGV4dChjc3Byb2R1Y2VyKSk7CisgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6c3ViamVjdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9CisgICAgICBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCktPkdldEluZm8oKTsKKyAgaWYgKCFwRGljdGlvbmFyeSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJTdWJqZWN0Iik7CisgIH0gZWxzZSB7CisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENGWF9XaWRlU3RyaW5nIGNzc3ViamVjdDsKKyAgICB2cCA+PiBjc3N1YmplY3Q7CisgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJTdWJqZWN0IiwgUERGX0VuY29kZVRleHQoY3NzdWJqZWN0KSk7CisgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6dGl0bGUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKG1fcERvY3VtZW50ID09IE5VTEwgfHwgbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9CisgICAgICBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCktPkdldEluZm8oKTsKKyAgaWYgKCFwRGljdGlvbmFyeSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJUaXRsZSIpOworICB9IGVsc2UgeworICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDRlhfV2lkZVN0cmluZyBjc3RpdGxlOworICAgIHZwID4+IGNzdGl0bGU7CisgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJUaXRsZSIsIFBERl9FbmNvZGVUZXh0KGNzdGl0bGUpKTsKKyAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpudW1QYWdlcyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JFQURPTkxZKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdnAgPDwgbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6ZXh0ZXJuYWwoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgLy8gSW4gQ2hyb21lIGNhc2Usc2hvdWxkIGFsd2F5cyByZXR1cm4gdHJ1ZS4KKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAgPDwgdHJ1ZTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6ZmlsZXNpemUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHZwIDw8IDA7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50Ojptb3VzZVgoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6bW91c2VZKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OmJhc2VVUkwoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IG1fY3dCYXNlVVJMOworICB9IGVsc2UgeworICAgIHZwID4+IG1fY3dCYXNlVVJMOworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpjYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPQorICAgICAgKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworCisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIGlmIChwSW50ZXJGb3JtLT5Jc0NhbGN1bGF0ZUVuYWJsZWQoKSkKKyAgICAgIHZwIDw8IHRydWU7CisgICAgZWxzZQorICAgICAgdnAgPDwgZmFsc2U7CisgIH0gZWxzZSB7CisgICAgYm9vbCBiQ2FsY3VsYXRlOworICAgIHZwID4+IGJDYWxjdWxhdGU7CisKKyAgICBwSW50ZXJGb3JtLT5FbmFibGVDYWxjdWxhdGUoYkNhbGN1bGF0ZSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6ZG9jdW1lbnRGaWxlTmFtZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9XaWRlU3RyaW5nIHdzRmlsZVBhdGggPSBtX3BEb2N1bWVudC0+R2V0UGF0aCgpOworICBpbnQzMl90IGkgPSB3c0ZpbGVQYXRoLkdldExlbmd0aCgpIC0gMTsKKyAgZm9yICg7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKHdzRmlsZVBhdGguR2V0QXQoaSkgPT0gTCdcXCcgfHwgd3NGaWxlUGF0aC5HZXRBdChpKSA9PSBMJy8nKQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKGkgPj0gMCAmJiBpIDwgd3NGaWxlUGF0aC5HZXRMZW5ndGgoKSAtIDEpIHsKKyAgICB2cCA8PCAod3NGaWxlUGF0aC5HZXRCdWZmZXIod3NGaWxlUGF0aC5HZXRMZW5ndGgoKSkgKyBpICsgMSk7CisgIH0gZWxzZSB7CisgICAgdnAgPDwgTCIiOworICB9CisgIHJldHVybiBUUlVFOworfQorCitDRlhfV2lkZVN0cmluZyBEb2N1bWVudDo6UmV2ZXJzYWxTdHIoQ0ZYX1dpZGVTdHJpbmcgY2JGcm9tKSB7CisgIHNpemVfdCBpTGVuZ3RoID0gY2JGcm9tLkdldExlbmd0aCgpOworICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPHNpemVfdD4gaVNpemUgPSBzaXplb2Yod2NoYXJfdCk7CisgIGlTaXplICo9IChpTGVuZ3RoICsgMSk7CisgIHdjaGFyX3QqIHBSZXN1bHQgPSAod2NoYXJfdCopbWFsbG9jKGlTaXplLlZhbHVlT3JEaWUoKSk7CisgIHdjaGFyX3QqIHBGcm9tID0gKHdjaGFyX3QqKWNiRnJvbS5HZXRCdWZmZXIoaUxlbmd0aCk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsKKyAgICBwUmVzdWx0W2ldID0gKihwRnJvbSArIGlMZW5ndGggLSBpIC0gMSk7CisgIH0KKyAgcFJlc3VsdFtpTGVuZ3RoXSA9IEwnXDAnOworCisgIGNiRnJvbS5SZWxlYXNlQnVmZmVyKCk7CisgIENGWF9XaWRlU3RyaW5nIGNiUmV0ID0gQ0ZYX1dpZGVTdHJpbmcocFJlc3VsdCk7CisgIGZyZWUocFJlc3VsdCk7CisgIHBSZXN1bHQgPSBOVUxMOworICByZXR1cm4gY2JSZXQ7Cit9CisKK0NGWF9XaWRlU3RyaW5nIERvY3VtZW50OjpDdXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcgY2JGcm9tKSB7CisgIHNpemVfdCBpTGVuZ3RoID0gY2JGcm9tLkdldExlbmd0aCgpOworICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPHNpemVfdD4gaVNpemUgPSBzaXplb2Yod2NoYXJfdCk7CisgIGlTaXplICo9IChpTGVuZ3RoICsgMSk7CisgIHdjaGFyX3QqIHBSZXN1bHQgPSAod2NoYXJfdCopbWFsbG9jKGlTaXplLlZhbHVlT3JEaWUoKSk7CisgIHdjaGFyX3QqIHBGcm9tID0gKHdjaGFyX3QqKWNiRnJvbS5HZXRCdWZmZXIoaUxlbmd0aCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsKKyAgICBpZiAocEZyb21baV0gPT0gTCdcXCcgfHwgcEZyb21baV0gPT0gTCcvJykgeworICAgICAgcFJlc3VsdFtpXSA9IEwnXDAnOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBSZXN1bHRbaV0gPSBwRnJvbVtpXTsKKyAgfQorICBwUmVzdWx0W2lMZW5ndGhdID0gTCdcMCc7CisKKyAgY2JGcm9tLlJlbGVhc2VCdWZmZXIoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgY2JSZXQgPSBDRlhfV2lkZVN0cmluZyhwUmVzdWx0KTsKKyAgZnJlZShwUmVzdWx0KTsKKyAgcFJlc3VsdCA9IE5VTEw7CisgIHJldHVybiBjYlJldDsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6cGF0aChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHZwIDw8IGFwcDo6U3lzUGF0aFRvUERGUGF0aChtX3BEb2N1bWVudC0+R2V0UGF0aCgpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OnBhZ2VXaW5kb3dSZWN0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpsYXlvdXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6YWRkTGluayhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpjbG9zZURvYyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VCb3goSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3QoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3RzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgdlJldC5TZXROdWxsKCk7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpnZXRBbm5vdDNEKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgdlJldC5TZXROdWxsKCk7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpnZXRBbm5vdHMzRChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHZSZXQgPSBWVF91bmRlZmluZWQ7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpnZXRPQ0dzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OmdldExpbmtzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OklzRW5jbG9zZWRJblJlY3QoQ0ZYX0Zsb2F0UmVjdCByZWN0LCBDRlhfRmxvYXRSZWN0IExpbmtSZWN0KSB7CisgIHJldHVybiAocmVjdC5sZWZ0IDw9IExpbmtSZWN0LmxlZnQgJiYgcmVjdC50b3AgPD0gTGlua1JlY3QudG9wICYmCisgICAgICAgICAgcmVjdC5yaWdodCA+PSBMaW5rUmVjdC5yaWdodCAmJiByZWN0LmJvdHRvbSA+PSBMaW5rUmVjdC5ib3R0b20pOworfQorCit2b2lkIEljb25UcmVlOjpJbnNlcnRJY29uRWxlbWVudChJY29uRWxlbWVudCogcE5ld0ljb24pIHsKKyAgaWYgKCFwTmV3SWNvbikKKyAgICByZXR1cm47CisKKyAgaWYgKG1fcEhlYWQgPT0gTlVMTCAmJiBtX3BFbmQgPT0gTlVMTCkgeworICAgIG1fcEhlYWQgPSBtX3BFbmQgPSBwTmV3SWNvbjsKKyAgICBtX2lMZW5ndGgrKzsKKyAgfSBlbHNlIHsKKyAgICBtX3BFbmQtPk5leHRJY29uID0gcE5ld0ljb247CisgICAgbV9wRW5kID0gcE5ld0ljb247CisgICAgbV9pTGVuZ3RoKys7CisgIH0KK30KKwordm9pZCBJY29uVHJlZTo6RGVsZXRlSWNvblRyZWUoKSB7CisgIGlmICghbV9wSGVhZCB8fCAhbV9wRW5kKQorICAgIHJldHVybjsKKworICBJY29uRWxlbWVudCogcFRlbXAgPSBOVUxMOworICB3aGlsZSAobV9wRW5kICE9IG1fcEhlYWQpIHsKKyAgICBwVGVtcCA9IG1fcEhlYWQ7CisgICAgbV9wSGVhZCA9IG1fcEhlYWQtPk5leHRJY29uOworICAgIGRlbGV0ZSBwVGVtcDsKKyAgfQorCisgIGRlbGV0ZSBtX3BFbmQ7CisgIG1fcEhlYWQgPSBOVUxMOworICBtX3BFbmQgPSBOVUxMOworfQorCitpbnQgSWNvblRyZWU6OkdldExlbmd0aCgpIHsKKyAgcmV0dXJuIG1faUxlbmd0aDsKK30KKworSWNvbkVsZW1lbnQqIEljb25UcmVlOjpvcGVyYXRvcltdKGludCBpSW5kZXgpIHsKKyAgaWYgKGlJbmRleCA+PSAwICYmIGlJbmRleCA8PSBtX2lMZW5ndGgpIHsKKyAgICBJY29uRWxlbWVudCogcFRlbXAgPSBtX3BIZWFkOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUluZGV4OyBpKyspIHsKKyAgICAgIHBUZW1wID0gcFRlbXAtPk5leHRJY29uOworICAgIH0KKyAgICByZXR1cm4gcFRlbXA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgSWNvblRyZWU6OkRlbGV0ZUljb25FbGVtZW50KENGWF9XaWRlU3RyaW5nIHN3SWNvbk5hbWUpIHsKKyAgSWNvbkVsZW1lbnQqIHBUZW1wID0gbV9wSGVhZDsKKyAgaW50IGlMb29wQ291bnQgPSBtX2lMZW5ndGg7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaUxvb3BDb3VudCAtIDE7IGkrKykgeworICAgIGlmIChwVGVtcCA9PSBtX3BFbmQpCisgICAgICBicmVhazsKKworICAgIGlmIChtX3BIZWFkLT5JY29uTmFtZSA9PSBzd0ljb25OYW1lKSB7CisgICAgICBtX3BIZWFkID0gbV9wSGVhZC0+TmV4dEljb247CisgICAgICBkZWxldGUgcFRlbXA7CisgICAgICBtX2lMZW5ndGgtLTsKKyAgICAgIHBUZW1wID0gbV9wSGVhZDsKKyAgICB9CisgICAgaWYgKHBUZW1wLT5OZXh0SWNvbi0+SWNvbk5hbWUgPT0gc3dJY29uTmFtZSkgeworICAgICAgaWYgKHBUZW1wLT5OZXh0SWNvbiA9PSBtX3BFbmQpIHsKKyAgICAgICAgbV9wRW5kID0gcFRlbXA7CisgICAgICAgIGRlbGV0ZSBwVGVtcC0+TmV4dEljb247CisgICAgICAgIG1faUxlbmd0aC0tOworICAgICAgICBwVGVtcC0+TmV4dEljb24gPSBOVUxMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgSWNvbkVsZW1lbnQqIHBFbGVtZW50ID0gcFRlbXAtPk5leHRJY29uOworICAgICAgICBwVGVtcC0+TmV4dEljb24gPSBwVGVtcC0+TmV4dEljb24tPk5leHRJY29uOworICAgICAgICBkZWxldGUgcEVsZW1lbnQ7CisgICAgICAgIG1faUxlbmd0aC0tOworICAgICAgICBwRWxlbWVudCA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHBUZW1wID0gcFRlbXAtPk5leHRJY29uOworICB9Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OmFkZEljb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBDRlhfV2lkZVN0cmluZyBzd0ljb25OYW1lID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOworICBKU0ZYT2JqZWN0IHBKU0ljb24gPSBwYXJhbXNbMV0uVG9WOE9iamVjdCgpOworCisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKKyAgaWYgKEpTX0dldE9iakRlZm5JRChwSlNJY29uKSAhPSBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVFlQRUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBDSlNfRW1iZWRPYmoqIHBFbWJlZE9iaiA9IHBhcmFtc1sxXS5Ub0NKU09iamVjdCgpLT5HZXRFbWJlZE9iamVjdCgpOworICBpZiAoIXBFbWJlZE9iaikgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVFlQRUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBJY29uKiBwSWNvbiA9IChJY29uKilwRW1iZWRPYmo7CisgIGlmICghbV9wSWNvblRyZWUpCisgICAgbV9wSWNvblRyZWUgPSBuZXcgSWNvblRyZWUoKTsKKworICBJY29uRWxlbWVudCogcE5ld0ljb24gPSBuZXcgSWNvbkVsZW1lbnQoKTsKKyAgcE5ld0ljb24tPkljb25OYW1lID0gc3dJY29uTmFtZTsKKyAgcE5ld0ljb24tPk5leHRJY29uID0gTlVMTDsKKyAgcE5ld0ljb24tPkljb25TdHJlYW0gPSBwSWNvbjsKKyAgbV9wSWNvblRyZWUtPkluc2VydEljb25FbGVtZW50KHBOZXdJY29uKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6Omljb25zKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghbV9wSWNvblRyZWUpIHsKKyAgICB2cC5TZXROdWxsKCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBDSlNfQXJyYXkgSWNvbnMobV9pc29sYXRlKTsKKyAgSWNvbkVsZW1lbnQqIHBJY29uRWxlbWVudCA9IE5VTEw7CisgIGludCBpSWNvblRyZWVMZW5ndGggPSBtX3BJY29uVHJlZS0+R2V0TGVuZ3RoKCk7CisKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaUljb25UcmVlTGVuZ3RoOyBpKyspIHsKKyAgICBwSWNvbkVsZW1lbnQgPSAoKm1fcEljb25UcmVlKVtpXTsKKworICAgIEpTRlhPYmplY3QgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSk7CisgICAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ0pTX0ljb24qIHBKU19JY29uID0gKENKU19JY29uKilKU19HZXRQcml2YXRlKHBPYmopOworICAgIGlmICghcEpTX0ljb24pCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBJY29uKiBwSWNvbiA9IChJY29uKilwSlNfSWNvbi0+R2V0RW1iZWRPYmplY3QoKTsKKyAgICBpZiAoIXBJY29uKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEljb24tPlNldFN0cmVhbShwSWNvbkVsZW1lbnQtPkljb25TdHJlYW0tPkdldFN0cmVhbSgpKTsKKyAgICBwSWNvbi0+U2V0SWNvbk5hbWUocEljb25FbGVtZW50LT5JY29uTmFtZSk7CisgICAgSWNvbnMuU2V0RWxlbWVudChpLCBDSlNfVmFsdWUobV9pc29sYXRlLCBwSlNfSWNvbikpOworICB9CisKKyAgdnAgPDwgSWNvbnM7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpnZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFtX3BJY29uVHJlZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENGWF9XaWRlU3RyaW5nIHN3SWNvbk5hbWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CisgIGludCBpSWNvbkNvdW50cyA9IG1fcEljb25UcmVlLT5HZXRMZW5ndGgoKTsKKworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpSWNvbkNvdW50czsgaSsrKSB7CisgICAgaWYgKCgqbV9wSWNvblRyZWUpW2ldLT5JY29uTmFtZSA9PSBzd0ljb25OYW1lKSB7CisgICAgICBJY29uKiBwUmV0SWNvbiA9ICgqbV9wSWNvblRyZWUpW2ldLT5JY29uU3RyZWFtOworCisgICAgICBKU0ZYT2JqZWN0IHBPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSk7CisgICAgICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgQ0pTX0ljb24qIHBKU19JY29uID0gKENKU19JY29uKilKU19HZXRQcml2YXRlKHBPYmopOworICAgICAgaWYgKCFwSlNfSWNvbikKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBJY29uKiBwSWNvbiA9IChJY29uKilwSlNfSWNvbi0+R2V0RW1iZWRPYmplY3QoKTsKKyAgICAgIGlmICghcEljb24pCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgcEljb24tPlNldEljb25OYW1lKHN3SWNvbk5hbWUpOworICAgICAgcEljb24tPlNldFN0cmVhbShwUmV0SWNvbi0+R2V0U3RyZWFtKCkpOworICAgICAgdlJldCA9IHBKU19JY29uOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIERvY3VtZW50OjpyZW1vdmVJY29uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFtX3BJY29uVHJlZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENGWF9XaWRlU3RyaW5nIHN3SWNvbk5hbWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpjcmVhdGVEYXRhT2JqZWN0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICAgLy8gVW5zYWZlLCBub3QgaW1wbGVtZW50ZWQuCiAgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjptZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIERvY3VtZW50OjptZWRpYShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Y2FsY3VsYXRlTm93KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBEb2N1bWVudDo6Y2FsY3VsYXRlTm93KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKCEobV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKKyAgaWYgKCEobV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9GSUxMX0ZPUk0pKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLSAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLSAgICBwSW50ZXJGb3JtLT5PbkNhbGN1bGF0ZSgpOwotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpDb2xsYWIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpnZXRQYWdlTnRoV29yZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgaW50IG5QYWdlTm8gPSBwYXJhbXMuR2V0U2l6ZSgpID4gMCA/IHBhcmFtc1swXS5Ub0ludCgpIDogMDsKLSAgICBpbnQgbldvcmRObyA9IHBhcmFtcy5HZXRTaXplKCkgPiAxID8gcGFyYW1zWzFdLlRvSW50KCkgOiAwOwotICAgIGJvb2wgYlN0cmlwID0gcGFyYW1zLkdldFNpemUoKSA+IDIgPyBwYXJhbXNbMl0uVG9Cb29sKCkgOiB0cnVlOwotCi0JQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpOwotCWlmICghcERvY3VtZW50KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKLSAgICBpZiAoblBhZ2VObyA8IDAgfHwgblBhZ2VObyA+PSBwRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpKQotICAgIHsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNWQUxVRUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvY3VtZW50LT5HZXRQYWdlKG5QYWdlTm8pOwotICAgIGlmICghcFBhZ2VEaWN0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICBDUERGX1BhZ2UgcGFnZTsKLSAgICBwYWdlLkxvYWQocERvY3VtZW50LCBwUGFnZURpY3QpOwotICAgIHBhZ2UuU3RhcnRQYXJzZSgpOwotICAgIHBhZ2UuUGFyc2VDb250ZW50KCk7Ci0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwYWdlLkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKLQotICAgIGludCBuV29yZHMgPSAwOwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7Ci0KLSAgICB3aGlsZSAocG9zKQotICAgIHsKLSAgICAgICAgaWYgKENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSBwYWdlLkdldE5leHRPYmplY3QocG9zKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9URVhUKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBuT2JqV29yZHMgPSBDb3VudFdvcmRzKChDUERGX1RleHRPYmplY3QqKXBQYWdlT2JqKTsKLQotICAgICAgICAgICAgICAgIGlmIChuV29yZHMgKyBuT2JqV29yZHMgPj0gbldvcmRObykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3UmV0ID0gR2V0T2JqV29yZFN0cigoQ1BERl9UZXh0T2JqZWN0KilwUGFnZU9iaiwgbldvcmRObyAtIG5Xb3Jkcyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG5Xb3JkcyArPSBuT2JqV29yZHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYlN0cmlwKQotICAgIHsKLSAgICAgICAgc3dSZXQuVHJpbUxlZnQoKTsKLSAgICAgICAgc3dSZXQuVHJpbVJpZ2h0KCk7Ci0gICAgfQotCi0gICAgdlJldCA9IHN3UmV0LmNfc3RyKCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBGQUxTRTsKLQorICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpCiAgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKKyAgcEludGVyRm9ybS0+T25DYWxjdWxhdGUoKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdW1Xb3JkcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgaW50IG5QYWdlTm8gPSBwYXJhbXMuR2V0U2l6ZSgpID4gMCA/IHBhcmFtc1swXS5Ub0ludCgpIDogMDsKLQlDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCk7Ci0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7Ci0gICAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkKLSAgICB7Ci0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBEb2N1bWVudC0+R2V0UGFnZShuUGFnZU5vKTsKLSAgICBpZiAoIXBQYWdlRGljdCkgcmV0dXJuIEZBTFNFOwotCi0gICAgQ1BERl9QYWdlIHBhZ2U7Ci0gICAgcGFnZS5Mb2FkKHBEb2N1bWVudCwgcFBhZ2VEaWN0KTsKLSAgICBwYWdlLlN0YXJ0UGFyc2UoKTsKLSAgICBwYWdlLlBhcnNlQ29udGVudCgpOwotCi0gICAgRlhfUE9TSVRJT04gcG9zID0gcGFnZS5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0KLSAgICBpbnQgbldvcmRzID0gMDsKLQotICAgIHdoaWxlIChwb3MpCi0gICAgewotICAgICAgICBpZiAoQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IHBhZ2UuR2V0TmV4dE9iamVjdChwb3MpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX1RFWFQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IChDUERGX1RleHRPYmplY3QqKXBQYWdlT2JqOwotICAgICAgICAgICAgICAgIG5Xb3JkcyArPSBDb3VudFdvcmRzKHBUZXh0T2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZSZXQgPSBuV29yZHM7Ci0KLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OkNvbGxhYihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRQcmludFBhcmFtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0gICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotICAgIEpTRlhPYmplY3QgcFJldE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIlByaW50UGFyYW1zT2JqIikpOworRlhfQk9PTCBEb2N1bWVudDo6Z2V0UGFnZU50aFdvcmQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0LgorICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgdlJldCA9IHBSZXRPYmo7Ci0gICAgcmV0dXJuIFRSVUU7Ci19CisgIGludCBuUGFnZU5vID0gcGFyYW1zLkdldFNpemUoKSA+IDAgPyBwYXJhbXNbMF0uVG9JbnQoKSA6IDA7CisgIGludCBuV29yZE5vID0gcGFyYW1zLkdldFNpemUoKSA+IDEgPyBwYXJhbXNbMV0uVG9JbnQoKSA6IDA7CisgIGJvb2wgYlN0cmlwID0gcGFyYW1zLkdldFNpemUoKSA+IDIgPyBwYXJhbXNbMl0uVG9Cb29sKCkgOiB0cnVlOwogCi0jZGVmaW5lIElTTEFUSU5XT1JEKHUpICAodSAhPSAweDIwICYmIHUgPD0gMHgyOEZGKQorICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0UERGRG9jKCk7CisgIGlmICghcERvY3VtZW50KQorICAgIHJldHVybiBGQUxTRTsKIAotaW50IERvY3VtZW50OjpDb3VudFdvcmRzKENQREZfVGV4dE9iamVjdCogcFRleHRPYmopCi17Ci0gICAgaWYgKCFwVGV4dE9iaikgcmV0dXJuIDA7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOworICBpZiAoblBhZ2VObyA8IDAgfHwgblBhZ2VObyA+PSBwRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNWQUxVRUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotICAgIGludCBuV29yZHMgPSAwOworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBEb2N1bWVudC0+R2V0UGFnZShuUGFnZU5vKTsKKyAgaWYgKCFwUGFnZURpY3QpCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgQ1BERl9Gb250KiBwRm9udCA9IHBUZXh0T2JqLT5HZXRGb250KCk7Ci0gICAgaWYgKCFwRm9udCkgcmV0dXJuIDA7CisgIENQREZfUGFnZSBwYWdlOworICBwYWdlLkxvYWQocERvY3VtZW50LCBwUGFnZURpY3QpOworICBwYWdlLlN0YXJ0UGFyc2UoKTsKKyAgcGFnZS5QYXJzZUNvbnRlbnQoKTsKIAotICAgIEZYX0JPT0wgYklzTGF0aW4gPSBGQUxTRTsKKyAgRlhfUE9TSVRJT04gcG9zID0gcGFnZS5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CiAKLSAgICBmb3IgKGludCBpPTAsIHN6PXBUZXh0T2JqLT5Db3VudENoYXJzKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gLTE7Ci0gICAgICAgIEZYX0ZMT0FUIGtlcm5pbmc7CisgIGludCBuV29yZHMgPSAwOwogCi0gICAgICAgIHBUZXh0T2JqLT5HZXRDaGFySW5mbyhpLCBjaGFyY29kZSwga2VybmluZyk7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VW5pY29kZSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7CiAKLSAgICAgICAgRlhfV09SRCB1bmljb2RlID0gMDsKLSAgICAgICAgaWYgKHN3VW5pY29kZS5HZXRMZW5ndGgoKSA+IDApCi0gICAgICAgICAgICB1bmljb2RlID0gc3dVbmljb2RlWzBdOworICB3aGlsZSAocG9zKSB7CisgICAgaWYgKENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSBwYWdlLkdldE5leHRPYmplY3QocG9zKSkgeworICAgICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9URVhUKSB7CisgICAgICAgIGludCBuT2JqV29yZHMgPSBDb3VudFdvcmRzKChDUERGX1RleHRPYmplY3QqKXBQYWdlT2JqKTsKIAotICAgICAgICBpZiAoSVNMQVRJTldPUkQodW5pY29kZSkgJiYgYklzTGF0aW4pCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBiSXNMYXRpbiA9IElTTEFUSU5XT1JEKHVuaWNvZGUpOwotICAgICAgICBpZiAodW5pY29kZSAhPSAweDIwKQotICAgICAgICAgICAgbldvcmRzKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5Xb3JkczsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgRG9jdW1lbnQ6OkdldE9ialdvcmRTdHIoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwgaW50IG5Xb3JkSW5kZXgpCi17Ci0gICAgQVNTRVJUKHBUZXh0T2JqICE9IE5VTEwpOwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7Ci0KLSAgICBDUERGX0ZvbnQqIHBGb250ID0gcFRleHRPYmotPkdldEZvbnQoKTsKLSAgICBpZiAoIXBGb250KSByZXR1cm4gTCIiOwotCi0gICAgaW50IG5Xb3JkcyA9IDA7Ci0gICAgRlhfQk9PTCBiSXNMYXRpbiA9IEZBTFNFOwotCi0gICAgZm9yIChpbnQgaT0wLCBzej1wVGV4dE9iai0+Q291bnRDaGFycygpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgICBGWF9EV09SRCBjaGFyY29kZSA9IC0xOwotICAgICAgICBGWF9GTE9BVCBrZXJuaW5nOwotCi0gICAgICAgIHBUZXh0T2JqLT5HZXRDaGFySW5mbyhpLCBjaGFyY29kZSwga2VybmluZyk7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VW5pY29kZSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLQotICAgICAgICBGWF9XT1JEIHVuaWNvZGUgPSAwOwotICAgICAgICBpZiAoc3dVbmljb2RlLkdldExlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHVuaWNvZGUgPSBzd1VuaWNvZGVbMF07Ci0KLSAgICAgICAgaWYgKElTTEFUSU5XT1JEKHVuaWNvZGUpICYmIGJJc0xhdGluKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiSXNMYXRpbiA9IElTTEFUSU5XT1JEKHVuaWNvZGUpOwotICAgICAgICAgICAgaWYgKHVuaWNvZGUgIT0gMHgyMCkKLSAgICAgICAgICAgICAgICBuV29yZHMrKzsKKyAgICAgICAgaWYgKG5Xb3JkcyArIG5PYmpXb3JkcyA+PSBuV29yZE5vKSB7CisgICAgICAgICAgc3dSZXQgPSBHZXRPYmpXb3JkU3RyKChDUERGX1RleHRPYmplY3QqKXBQYWdlT2JqLCBuV29yZE5vIC0gbldvcmRzKTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChuV29yZHMtMSA9PSBuV29yZEluZGV4KQotICAgICAgICAgICAgc3dSZXQgKz0gdW5pY29kZTsKKyAgICAgICAgbldvcmRzICs9IG5PYmpXb3JkczsKKyAgICAgIH0KICAgICB9CisgIH0KIAotICAgIHJldHVybiBzd1JldDsKKyAgaWYgKGJTdHJpcCkgeworICAgIHN3UmV0LlRyaW1MZWZ0KCk7CisgICAgc3dSZXQuVHJpbVJpZ2h0KCk7CisgIH0KKworICB2UmV0ID0gc3dSZXQuY19zdHIoKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6Onpvb20oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQoteworRlhfQk9PTCBEb2N1bWVudDo6Z2V0UGFnZU50aFdvcmRRdWFkcyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAotICAgIHJldHVybiBUUlVFOworICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6Z2V0UGFnZU51bVdvcmRzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaW50IG5QYWdlTm8gPSBwYXJhbXMuR2V0U2l6ZSgpID4gMCA/IHBhcmFtc1swXS5Ub0ludCgpIDogMDsKKyAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldFBERkRvYygpOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKKyAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwRG9jdW1lbnQtPkdldFBhZ2UoblBhZ2VObyk7CisgIGlmICghcFBhZ2VEaWN0KQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX1BhZ2UgcGFnZTsKKyAgcGFnZS5Mb2FkKHBEb2N1bWVudCwgcFBhZ2VEaWN0KTsKKyAgcGFnZS5TdGFydFBhcnNlKCk7CisgIHBhZ2UuUGFyc2VDb250ZW50KCk7CisKKyAgRlhfUE9TSVRJT04gcG9zID0gcGFnZS5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CisKKyAgaW50IG5Xb3JkcyA9IDA7CisKKyAgd2hpbGUgKHBvcykgeworICAgIGlmIChDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gcGFnZS5HZXROZXh0T2JqZWN0KHBvcykpIHsKKyAgICAgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgeworICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gKENQREZfVGV4dE9iamVjdCopcFBhZ2VPYmo7CisgICAgICAgIG5Xb3JkcyArPSBDb3VudFdvcmRzKHBUZXh0T2JqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2UmV0ID0gbldvcmRzOworCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpnZXRQcmludFBhcmFtcyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKKyAgSlNGWE9iamVjdCBwUmV0T2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKAorICAgICAgKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJQcmludFBhcmFtc09iaiIpKTsKKworICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0LgorCisgIHZSZXQgPSBwUmV0T2JqOworICByZXR1cm4gVFJVRTsKK30KKworI2RlZmluZSBJU0xBVElOV09SRCh1KSAodSAhPSAweDIwICYmIHUgPD0gMHgyOEZGKQorCitpbnQgRG9jdW1lbnQ6OkNvdW50V29yZHMoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaikgeworICBpZiAoIXBUZXh0T2JqKQorICAgIHJldHVybiAwOworCisgIGludCBuV29yZHMgPSAwOworCisgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOworICBpZiAoIXBGb250KQorICAgIHJldHVybiAwOworCisgIEZYX0JPT0wgYklzTGF0aW4gPSBGQUxTRTsKKworICBmb3IgKGludCBpID0gMCwgc3ogPSBwVGV4dE9iai0+Q291bnRDaGFycygpOyBpIDwgc3o7IGkrKykgeworICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gLTE7CisgICAgRlhfRkxPQVQga2VybmluZzsKKworICAgIHBUZXh0T2JqLT5HZXRDaGFySW5mbyhpLCBjaGFyY29kZSwga2VybmluZyk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3dVbmljb2RlID0gcEZvbnQtPlVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworCisgICAgRlhfV09SRCB1bmljb2RlID0gMDsKKyAgICBpZiAoc3dVbmljb2RlLkdldExlbmd0aCgpID4gMCkKKyAgICAgIHVuaWNvZGUgPSBzd1VuaWNvZGVbMF07CisKKyAgICBpZiAoSVNMQVRJTldPUkQodW5pY29kZSkgJiYgYklzTGF0aW4pCisgICAgICBjb250aW51ZTsKKworICAgIGJJc0xhdGluID0gSVNMQVRJTldPUkQodW5pY29kZSk7CisgICAgaWYgKHVuaWNvZGUgIT0gMHgyMCkKKyAgICAgIG5Xb3JkcysrOworICB9CisKKyAgcmV0dXJuIG5Xb3JkczsKK30KKworQ0ZYX1dpZGVTdHJpbmcgRG9jdW1lbnQ6OkdldE9ialdvcmRTdHIoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuV29yZEluZGV4KSB7CisgIEFTU0VSVChwVGV4dE9iaiAhPSBOVUxMKTsKKworICBDRlhfV2lkZVN0cmluZyBzd1JldDsKKworICBDUERGX0ZvbnQqIHBGb250ID0gcFRleHRPYmotPkdldEZvbnQoKTsKKyAgaWYgKCFwRm9udCkKKyAgICByZXR1cm4gTCIiOworCisgIGludCBuV29yZHMgPSAwOworICBGWF9CT09MIGJJc0xhdGluID0gRkFMU0U7CisKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcFRleHRPYmotPkNvdW50Q2hhcnMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBGWF9EV09SRCBjaGFyY29kZSA9IC0xOworICAgIEZYX0ZMT0FUIGtlcm5pbmc7CisKKyAgICBwVGV4dE9iai0+R2V0Q2hhckluZm8oaSwgY2hhcmNvZGUsIGtlcm5pbmcpOworICAgIENGWF9XaWRlU3RyaW5nIHN3VW5pY29kZSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKworICAgIEZYX1dPUkQgdW5pY29kZSA9IDA7CisgICAgaWYgKHN3VW5pY29kZS5HZXRMZW5ndGgoKSA+IDApCisgICAgICB1bmljb2RlID0gc3dVbmljb2RlWzBdOworCisgICAgaWYgKElTTEFUSU5XT1JEKHVuaWNvZGUpICYmIGJJc0xhdGluKSB7CisgICAgfSBlbHNlIHsKKyAgICAgIGJJc0xhdGluID0gSVNMQVRJTldPUkQodW5pY29kZSk7CisgICAgICBpZiAodW5pY29kZSAhPSAweDIwKQorICAgICAgICBuV29yZHMrKzsKKyAgICB9CisKKyAgICBpZiAobldvcmRzIC0gMSA9PSBuV29yZEluZGV4KQorICAgICAgc3dSZXQgKz0gdW5pY29kZTsKKyAgfQorCisgIHJldHVybiBzd1JldDsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6em9vbShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qKgpAQCAtMTc5NCwxMzMgKzE4MDMsMTMzIEBACiAocmVmVywgIFJlZmxvd1dpZHRoKQogKi8KIAotRlhfQk9PTCBEb2N1bWVudDo6em9vbVR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpkZWxldGVQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JaWYgKCEobV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKLQkJbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FTU0VNQkxFKSkpIHJldHVybiBGQUxTRTsKLQotCWludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0KLQlpbnQgblN0YXJ0ID0gMDsKLQlpbnQgbkVuZCA9IDA7Ci0KLQlpZiAoaVNpemUgPCAxKQotCXsKLQl9Ci0JZWxzZSBpZiAoaVNpemUgPT0gMSkKLQl7Ci0JCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX29iamVjdCkKLQkJewotCQkJSlNPYmplY3QgcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KCk7Ci0JCQl2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiblN0YXJ0Iik7Ci0gICAgICAgICAgICBuU3RhcnQgPSBDSlNfVmFsdWUobV9pc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvSW50KCk7Ci0KLQkJCXBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJuRW5kIik7Ci0JCQluRW5kID0gQ0pTX1ZhbHVlKG1faXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0ludCgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJblN0YXJ0ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJblN0YXJ0ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0JCW5FbmQgPSBwYXJhbXNbMV0uVG9JbnQoKTsKLQl9Ci0KLQlpbnQgblRvdGFsID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOwotCi0JaWYgKG5TdGFydCA8IDApCW5TdGFydCA9IDA7Ci0JaWYgKG5TdGFydCA+PSBuVG90YWwpIG5TdGFydCA9IG5Ub3RhbCAtIDE7Ci0KLQlpZiAobkVuZCA8IDApIG5FbmQgPSAwOwotCWlmIChuRW5kID49IG5Ub3RhbCkgbkVuZCA9IG5Ub3RhbCAtIDE7Ci0KLQlpZiAobkVuZCA8IG5TdGFydCkgbkVuZCA9IG5TdGFydDsKLQotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6ZXh0cmFjdFBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KK0ZYX0JPT0wgRG9jdW1lbnQ6Onpvb21UeXBlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjppbnNlcnRQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiBUUlVFOwotfQorRlhfQk9PTCBEb2N1bWVudDo6ZGVsZXRlUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnJlcGxhY2VQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiBUUlVFOwotfQorICBpZiAoIShtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSB8fAorICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fQVNTRU1CTEUpKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFVSTChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiBUUlVFOwotfQorICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwogCi12b2lkIERvY3VtZW50OjpBZGREZWxheURhdGEoQ0pTX0RlbGF5RGF0YSogcERhdGEpCi17Ci0gICAgbV9EZWxheURhdGEuQWRkKHBEYXRhKTsKLX0KKyAgaW50IG5TdGFydCA9IDA7CisgIGludCBuRW5kID0gMDsKIAotdm9pZCBEb2N1bWVudDo6RG9GaWVsZERlbGF5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCkKLXsKLQlDRlhfRFdvcmRBcnJheSBEZWxBcnJheTsKKyAgaWYgKGlTaXplIDwgMSkgeworICB9IGVsc2UgaWYgKGlTaXplID09IDEpIHsKKyAgICBpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9vYmplY3QpIHsKKyAgICAgIEpTT2JqZWN0IHBPYmogPSBwYXJhbXNbMF0uVG9WOE9iamVjdCgpOworICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlID0KKyAgICAgICAgICBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiblN0YXJ0Iik7CisgICAgICBuU3RhcnQgPSBDSlNfVmFsdWUobV9pc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvSW50KCk7CiAKLQlmb3IgKGludCBpPTAsc3o9bV9EZWxheURhdGEuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JewotCQlpZiAoQ0pTX0RlbGF5RGF0YSogcERhdGEgPSBtX0RlbGF5RGF0YS5HZXRBdChpKSkKLQkJewotCQkJaWYgKHBEYXRhLT5zRmllbGROYW1lID09IHNGaWVsZE5hbWUgJiYgcERhdGEtPm5Db250cm9sSW5kZXggPT0gbkNvbnRyb2xJbmRleCkKLQkJCXsKLQkJCQlGaWVsZDo6RG9EZWxheShtX3BEb2N1bWVudCwgcERhdGEpOwotCQkJCWRlbGV0ZSBwRGF0YTsKLQkJCQltX0RlbGF5RGF0YS5TZXRBdChpLCBOVUxMKTsKLQkJCQlEZWxBcnJheS5BZGQoaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlmb3IgKGludCBqPURlbEFycmF5LkdldFNpemUoKS0xOyBqPj0wOyBqLS0pCi0JewotCQltX0RlbGF5RGF0YS5SZW1vdmVBdChEZWxBcnJheVtqXSk7Ci0JfQotfQotCi12b2lkIERvY3VtZW50OjpBZGREZWxheUFubm90RGF0YShDSlNfQW5ub3RPYmogKnBEYXRhKQotewotICAgIG1fRGVsYXlBbm5vdERhdGEuQWRkKHBEYXRhKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6RG9Bbm5vdERlbGF5KCkKLXsKLSAgICBDRlhfRFdvcmRBcnJheSBEZWxBcnJheTsKLQotICAgIGZvciAoaW50IGo9RGVsQXJyYXkuR2V0U2l6ZSgpLTE7IGo+PTA7IGotLSkKLSAgICB7Ci0gICAgICAgIG1fRGVsYXlEYXRhLlJlbW92ZUF0KERlbEFycmF5W2pdKTsKKyAgICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJuRW5kIik7CisgICAgICBuRW5kID0gQ0pTX1ZhbHVlKG1faXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0ludCgpOworICAgIH0gZWxzZSB7CisgICAgICBuU3RhcnQgPSBwYXJhbXNbMF0uVG9JbnQoKTsKICAgICB9CisgIH0gZWxzZSB7CisgICAgblN0YXJ0ID0gcGFyYW1zWzBdLlRvSW50KCk7CisgICAgbkVuZCA9IHBhcmFtc1sxXS5Ub0ludCgpOworICB9CisKKyAgaW50IG5Ub3RhbCA9IG1fcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKTsKKworICBpZiAoblN0YXJ0IDwgMCkKKyAgICBuU3RhcnQgPSAwOworICBpZiAoblN0YXJ0ID49IG5Ub3RhbCkKKyAgICBuU3RhcnQgPSBuVG90YWwgLSAxOworCisgIGlmIChuRW5kIDwgMCkKKyAgICBuRW5kID0gMDsKKyAgaWYgKG5FbmQgPj0gblRvdGFsKQorICAgIG5FbmQgPSBuVG90YWwgLSAxOworCisgIGlmIChuRW5kIDwgblN0YXJ0KQorICAgIG5FbmQgPSBuU3RhcnQ7CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUNKU19Eb2N1bWVudCogRG9jdW1lbnQ6OkdldENKU0RvYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENKU19Eb2N1bWVudCo+KG1fcEpTT2JqZWN0KTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmV4dHJhY3RQYWdlcyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6Omluc2VydFBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgorICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6cmVwbGFjZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgorICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBEb2N1bWVudDo6Z2V0VVJMKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgorICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBEb2N1bWVudDo6QWRkRGVsYXlEYXRhKENKU19EZWxheURhdGEqIHBEYXRhKSB7CisgIG1fRGVsYXlEYXRhLkFkZChwRGF0YSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OkRvRmllbGREZWxheShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCkgeworICBDRlhfRFdvcmRBcnJheSBEZWxBcnJheTsKKworICBmb3IgKGludCBpID0gMCwgc3ogPSBtX0RlbGF5RGF0YS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENKU19EZWxheURhdGEqIHBEYXRhID0gbV9EZWxheURhdGEuR2V0QXQoaSkpIHsKKyAgICAgIGlmIChwRGF0YS0+c0ZpZWxkTmFtZSA9PSBzRmllbGROYW1lICYmCisgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXggPT0gbkNvbnRyb2xJbmRleCkgeworICAgICAgICBGaWVsZDo6RG9EZWxheShtX3BEb2N1bWVudCwgcERhdGEpOworICAgICAgICBkZWxldGUgcERhdGE7CisgICAgICAgIG1fRGVsYXlEYXRhLlNldEF0KGksIE5VTEwpOworICAgICAgICBEZWxBcnJheS5BZGQoaSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaiA9IERlbEFycmF5LkdldFNpemUoKSAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgbV9EZWxheURhdGEuUmVtb3ZlQXQoRGVsQXJyYXlbal0pOworICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OkFkZERlbGF5QW5ub3REYXRhKENKU19Bbm5vdE9iaiogcERhdGEpIHsKKyAgbV9EZWxheUFubm90RGF0YS5BZGQocERhdGEpOworfQorCit2b2lkIERvY3VtZW50OjpEb0Fubm90RGVsYXkoKSB7CisgIENGWF9EV29yZEFycmF5IERlbEFycmF5OworCisgIGZvciAoaW50IGogPSBEZWxBcnJheS5HZXRTaXplKCkgLSAxOyBqID49IDA7IGotLSkgeworICAgIG1fRGVsYXlEYXRhLlJlbW92ZUF0KERlbEFycmF5W2pdKTsKKyAgfQorfQorCitDSlNfRG9jdW1lbnQqIERvY3VtZW50OjpHZXRDSlNEb2MoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDSlNfRG9jdW1lbnQqPihtX3BKU09iamVjdCk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRmllbGQuY3BwCmluZGV4IDM4NTdlODAuLmUzYzQ0ZTkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRmllbGQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRmllbGQuY3BwCkBAIC0xOCwxNjcgKzE4LDg2MiBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0ljb24uaCIKIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpZWxkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogQkVHSU5fSlNfU1RBVElDX0NPTlNUKENKU19GaWVsZCkKIEVORF9KU19TVEFUSUNfQ09OU1QoKQogCiBCRUdJTl9KU19TVEFUSUNfUFJPUChDSlNfRmllbGQpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoYWxpZ25tZW50KQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGJvcmRlclN0eWxlKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvbkFsaWduWCkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShidXR0b25BbGlnblkpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoYnV0dG9uRml0Qm91bmRzKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvblBvc2l0aW9uKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvblNjYWxlSG93KQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvblNjYWxlV2hlbikKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShjYWxjT3JkZXJJbmRleCkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShjaGFyTGltaXQpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoY29tYikKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShjb21taXRPblNlbENoYW5nZSkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShjdXJyZW50VmFsdWVJbmRpY2VzKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGRlZmF1bHRTdHlsZSkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShkZWZhdWx0VmFsdWUpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoZG9Ob3RTY3JvbGwpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoZG9Ob3RTcGVsbENoZWNrKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGRlbGF5KQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGRpc3BsYXkpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoZG9jKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGVkaXRhYmxlKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGV4cG9ydFZhbHVlcykKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShoaWRkZW4pCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkoZmlsZVNlbGVjdCkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShmaWxsQ29sb3IpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkobGluZVdpZHRoKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKGhpZ2hsaWdodCkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShtdWx0aWxpbmUpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkobXVsdGlwbGVTZWxlY3Rpb24pCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkobmFtZSkKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShudW1JdGVtcykKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShwYWdlKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHBhc3N3b3JkKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHByaW50KQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHJhZGlvc0luVW5pc29uKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHJlYWRvbmx5KQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHJlY3QpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkocmVxdWlyZWQpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkocmljaFRleHQpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkocmljaFZhbHVlKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHJvdGF0aW9uKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHN0cm9rZUNvbG9yKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHN0eWxlKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHN1Ym1pdE5hbWUpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkodGV4dENvbG9yKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHRleHRGb250KQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHRleHRTaXplKQotICAgIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHR5cGUpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkodXNlck5hbWUpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkodmFsdWUpCi0gICAgSlNfU1RBVElDX1BST1BfRU5UUlkodmFsdWVBc1N0cmluZykKLSAgICBKU19TVEFUSUNfUFJPUF9FTlRSWShzb3VyY2UpCitKU19TVEFUSUNfUFJPUF9FTlRSWShhbGlnbm1lbnQpCitKU19TVEFUSUNfUFJPUF9FTlRSWShib3JkZXJTdHlsZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvbkFsaWduWCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvbkFsaWduWSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvbkZpdEJvdW5kcykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvblBvc2l0aW9uKQorSlNfU1RBVElDX1BST1BfRU5UUlkoYnV0dG9uU2NhbGVIb3cpCitKU19TVEFUSUNfUFJPUF9FTlRSWShidXR0b25TY2FsZVdoZW4pCitKU19TVEFUSUNfUFJPUF9FTlRSWShjYWxjT3JkZXJJbmRleCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGNoYXJMaW1pdCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGNvbWIpCitKU19TVEFUSUNfUFJPUF9FTlRSWShjb21taXRPblNlbENoYW5nZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGN1cnJlbnRWYWx1ZUluZGljZXMpCitKU19TVEFUSUNfUFJPUF9FTlRSWShkZWZhdWx0U3R5bGUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShkZWZhdWx0VmFsdWUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShkb05vdFNjcm9sbCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGRvTm90U3BlbGxDaGVjaykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGRlbGF5KQorSlNfU1RBVElDX1BST1BfRU5UUlkoZGlzcGxheSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGRvYykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGVkaXRhYmxlKQorSlNfU1RBVElDX1BST1BfRU5UUlkoZXhwb3J0VmFsdWVzKQorSlNfU1RBVElDX1BST1BfRU5UUlkoaGlkZGVuKQorSlNfU1RBVElDX1BST1BfRU5UUlkoZmlsZVNlbGVjdCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGZpbGxDb2xvcikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGxpbmVXaWR0aCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGhpZ2hsaWdodCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG11bHRpbGluZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG11bHRpcGxlU2VsZWN0aW9uKQorSlNfU1RBVElDX1BST1BfRU5UUlkobmFtZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG51bUl0ZW1zKQorSlNfU1RBVElDX1BST1BfRU5UUlkocGFnZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHBhc3N3b3JkKQorSlNfU1RBVElDX1BST1BfRU5UUlkocHJpbnQpCitKU19TVEFUSUNfUFJPUF9FTlRSWShyYWRpb3NJblVuaXNvbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHJlYWRvbmx5KQorSlNfU1RBVElDX1BST1BfRU5UUlkocmVjdCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHJlcXVpcmVkKQorSlNfU1RBVElDX1BST1BfRU5UUlkocmljaFRleHQpCitKU19TVEFUSUNfUFJPUF9FTlRSWShyaWNoVmFsdWUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShyb3RhdGlvbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHN0cm9rZUNvbG9yKQorSlNfU1RBVElDX1BST1BfRU5UUlkoc3R5bGUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShzdWJtaXROYW1lKQorSlNfU1RBVElDX1BST1BfRU5UUlkodGV4dENvbG9yKQorSlNfU1RBVElDX1BST1BfRU5UUlkodGV4dEZvbnQpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh0ZXh0U2l6ZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHR5cGUpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh1c2VyTmFtZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHZhbHVlKQorSlNfU1RBVElDX1BST1BfRU5UUlkodmFsdWVBc1N0cmluZykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHNvdXJjZSkKIEVORF9KU19TVEFUSUNfUFJPUCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19NRVRIT0QoQ0pTX0ZpZWxkKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYnJvd3NlRm9yRmlsZVRvU3VibWl0KQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYnV0dG9uR2V0Q2FwdGlvbikKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGJ1dHRvbkdldEljb24pCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25JbXBvcnRJY29uKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYnV0dG9uU2V0Q2FwdGlvbikKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGJ1dHRvblNldEljb24pCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShjaGVja1RoaXNCb3gpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShjbGVhckl0ZW1zKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZGVmYXVsdElzQ2hlY2tlZCkKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGRlbGV0ZUl0ZW1BdCkKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEFycmF5ICkKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEl0ZW1BdCkKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldExvY2spCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShpbnNlcnRJdGVtQXQpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShpc0JveENoZWNrZWQpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShpc0RlZmF1bHRDaGVja2VkKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0QWN0aW9uKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0Rm9jdXMpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShzZXRJdGVtcykKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNldExvY2spCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2lnbmF0dXJlR2V0U2VlZFZhbHVlKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2lnbmF0dXJlSW5mbykKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNpZ25hdHVyZVNldFNlZWRWYWx1ZSkKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNpZ25hdHVyZVNpZ24pCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShzaWduYXR1cmVWYWxpZGF0ZSkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYnJvd3NlRm9yRmlsZVRvU3VibWl0KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25HZXRDYXB0aW9uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25HZXRJY29uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25JbXBvcnRJY29uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25TZXRDYXB0aW9uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25TZXRJY29uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShjaGVja1RoaXNCb3gpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNsZWFySXRlbXMpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGRlZmF1bHRJc0NoZWNrZWQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGRlbGV0ZUl0ZW1BdCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0QXJyYXkpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEl0ZW1BdCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0TG9jaykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoaW5zZXJ0SXRlbUF0KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShpc0JveENoZWNrZWQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGlzRGVmYXVsdENoZWNrZWQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNldEFjdGlvbikKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0Rm9jdXMpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNldEl0ZW1zKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzZXRMb2NrKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzaWduYXR1cmVHZXRTZWVkVmFsdWUpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNpZ25hdHVyZUluZm8pCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNpZ25hdHVyZVNldFNlZWRWYWx1ZSkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2lnbmF0dXJlU2lnbikKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2lnbmF0dXJlVmFsaWRhdGUpCiBFTkRfSlNfU1RBVElDX01FVEhPRCgpCiAKIElNUExFTUVOVF9KU19DTEFTUyhDSlNfRmllbGQsIEZpZWxkKQogCi1GWF9CT09MIENKU19GaWVsZDo6SW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKQotewotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0gICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworRlhfQk9PTCBDSlNfRmllbGQ6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICBGaWVsZCogcEZpZWxkID0gKEZpZWxkKilHZXRFbWJlZE9iamVjdCgpOwotICAgIEFTU0VSVChwRmllbGQgIT0gTlVMTCk7CisgIEZpZWxkKiBwRmllbGQgPSAoRmllbGQqKUdldEVtYmVkT2JqZWN0KCk7CisgIEFTU0VSVChwRmllbGQgIT0gTlVMTCk7CiAKLSAgICBwRmllbGQtPlNldElzb2xhdGUocENvbnRleHQtPkdldEpTUnVudGltZSgpLT5HZXRJc29sYXRlKCkpOworICBwRmllbGQtPlNldElzb2xhdGUocENvbnRleHQtPkdldEpTUnVudGltZSgpLT5HZXRJc29sYXRlKCkpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfTsKIAotRmllbGQ6OkZpZWxkKENKU19PYmplY3QqIHBKU09iamVjdCk6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLAotICAgIG1fcEpTRG9jKE5VTEwpLAotICAgIG1fcERvY3VtZW50KE5VTEwpLAotICAgIG1fbkZvcm1Db250cm9sSW5kZXgoLTEpLAotICAgIG1fYkNhblNldChGQUxTRSksCi0gICAgbV9iRGVsYXkoRkFMU0UpLAotICAgIG1faXNvbGF0ZShOVUxMKQoteworRmllbGQ6OkZpZWxkKENKU19PYmplY3QqIHBKU09iamVjdCkKKyAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLAorICAgICAgbV9wSlNEb2MoTlVMTCksCisgICAgICBtX3BEb2N1bWVudChOVUxMKSwKKyAgICAgIG1fbkZvcm1Db250cm9sSW5kZXgoLTEpLAorICAgICAgbV9iQ2FuU2V0KEZBTFNFKSwKKyAgICAgIG1fYkRlbGF5KEZBTFNFKSwKKyAgICAgIG1faXNvbGF0ZShOVUxMKSB7fQorCitGaWVsZDo6fkZpZWxkKCkge30KKworLy8gbm90ZTogaUNvbnRyb2xObyA9IC0xLCBtZWFucyBub3QgYSB3aWRnZXQuCit2b2lkIEZpZWxkOjpQYXJzZUZpZWxkTmFtZShjb25zdCBzdGQ6OndzdHJpbmcmIHN0ckZpZWxkTmFtZVBhcnNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6d3N0cmluZyYgc3RyRmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpQ29udHJvbE5vKSB7CisgIGludCBpU3RhcnQgPSBzdHJGaWVsZE5hbWVQYXJzZWQuZmluZF9sYXN0X29mKEwnLicpOworICBpZiAoaVN0YXJ0ID09IC0xKSB7CisgICAgc3RyRmllbGROYW1lID0gc3RyRmllbGROYW1lUGFyc2VkOworICAgIGlDb250cm9sTm8gPSAtMTsKKyAgICByZXR1cm47CisgIH0KKyAgc3RkOjp3c3RyaW5nIHN1ZmZpeGFsID0gc3RyRmllbGROYW1lUGFyc2VkLnN1YnN0cihpU3RhcnQgKyAxKTsKKyAgaUNvbnRyb2xObyA9IEZYU1lTX3d0b2koc3VmZml4YWwuY19zdHIoKSk7CisgIGlmIChpQ29udHJvbE5vID09IDApIHsKKyAgICBpbnQgaVN0YXJ0OworICAgIHdoaWxlICgoaVN0YXJ0ID0gc3VmZml4YWwuZmluZF9sYXN0X29mKEwiICIpKSAhPSAtMSkgeworICAgICAgc3VmZml4YWwuZXJhc2UoaVN0YXJ0LCAxKTsKKyAgICB9CisKKyAgICBpZiAoc3VmZml4YWwuY29tcGFyZShMIjAiKSAhPSAwKSB7CisgICAgICBzdHJGaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWVQYXJzZWQ7CisgICAgICBpQ29udHJvbE5vID0gLTE7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIHN0ckZpZWxkTmFtZSA9IHN0ckZpZWxkTmFtZVBhcnNlZC5zdWJzdHIoMCwgaVN0YXJ0KTsKIH0KIAotRmllbGQ6On5GaWVsZCgpCi17CitGWF9CT09MIEZpZWxkOjpBdHRhY2hGaWVsZChEb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSB7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CisgIG1fcEpTRG9jID0gcERvY3VtZW50OworCisgIG1fcERvY3VtZW50ID0gcERvY3VtZW50LT5HZXRSZWFkZXJEb2MoKTsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIG1fYkNhblNldCA9IG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9GSUxMX0ZPUk0pIHx8CisgICAgICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSB8fAorICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKTsKKworICBDUERGU0RLX0ludGVyRm9ybSogcFJESW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBBU1NFUlQocFJESW50ZXJGb3JtICE9IE5VTEwpOworCisgIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJESW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dGaWVsZE5hbWVUZW1wID0gY3NGaWVsZE5hbWU7CisgIHN3RmllbGROYW1lVGVtcC5SZXBsYWNlKEwiLi4iLCBMIi4iKTsKKworICBpZiAocEludGVyRm9ybS0+Q291bnRGaWVsZHMoc3dGaWVsZE5hbWVUZW1wKSA8PSAwKSB7CisgICAgc3RkOjp3c3RyaW5nIHN0ckZpZWxkTmFtZTsKKyAgICBpbnQgaUNvbnRyb2xObyA9IC0xOworICAgIFBhcnNlRmllbGROYW1lKHN3RmllbGROYW1lVGVtcC5jX3N0cigpLCBzdHJGaWVsZE5hbWUsIGlDb250cm9sTm8pOworICAgIGlmIChpQ29udHJvbE5vID09IC0xKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgbV9GaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWUuY19zdHIoKTsKKyAgICBtX25Gb3JtQ29udHJvbEluZGV4ID0gaUNvbnRyb2xObzsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIG1fRmllbGROYW1lID0gc3dGaWVsZE5hbWVUZW1wOworICBtX25Gb3JtQ29udHJvbEluZGV4ID0gLTE7CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLS8vbm90ZTogaUNvbnRyb2xObyA9IC0xLCBtZWFucyBub3QgYSB3aWRnZXQuCi12b2lkIEZpZWxkOjpQYXJzZUZpZWxkTmFtZShjb25zdCBzdGQ6OndzdHJpbmcgJnN0ckZpZWxkTmFtZVBhcnNlZCxzdGQ6OndzdHJpbmcgJnN0ckZpZWxkTmFtZSxpbnQgJiBpQ29udHJvbE5vKQotewotICAgIGludCBpU3RhcnQgPSBzdHJGaWVsZE5hbWVQYXJzZWQuZmluZF9sYXN0X29mKEwnLicpOwotICAgIGlmIChpU3RhcnQgPT0gLTEpCi0gICAgewotICAgICAgICBzdHJGaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWVQYXJzZWQ7Ci0gICAgICAgIGlDb250cm9sTm8gPSAtMTsKK3ZvaWQgRmllbGQ6OkdldEZvcm1GaWVsZHMoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSYgRmllbGRBcnJheSkgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworCisgIENQREZTREtfSW50ZXJGb3JtKiBwUmVhZGVySW50ZXJGb3JtID0gcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBSZWFkZXJJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwUmVhZGVySW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgQVNTRVJUKEZpZWxkQXJyYXkuR2V0U2l6ZSgpID09IDApOworCisgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBJbnRlckZvcm0tPkNvdW50RmllbGRzKGNzRmllbGROYW1lKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwSW50ZXJGb3JtLT5HZXRGaWVsZChpLCBjc0ZpZWxkTmFtZSkpCisgICAgICBGaWVsZEFycmF5LkFkZCgodm9pZCopcEZvcm1GaWVsZCk7CisgIH0KK30KKwordm9pZCBGaWVsZDo6R2V0Rm9ybUZpZWxkcyhjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSYgRmllbGRBcnJheSkgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgRmllbGQ6OkdldEZvcm1GaWVsZHMobV9wRG9jdW1lbnQsIGNzRmllbGROYW1lLCBGaWVsZEFycmF5KTsKK30KKwordm9pZCBGaWVsZDo6VXBkYXRlRm9ybUZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFuZ2VNYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc2V0QVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVmcmVzaCkgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgQ0ZYX1B0ckFycmF5IHdpZGdldHM7CisgIHBJbnRlckZvcm0tPkdldFdpZGdldHMocEZvcm1GaWVsZCwgd2lkZ2V0cyk7CisKKyAgaWYgKGJSZXNldEFQKSB7CisgICAgaW50IG5GaWVsZFR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKKyAgICBpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSB3aWRnZXRzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXdpZGdldHMuR2V0QXQoaSk7CisgICAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOworCisgICAgICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBXaWRnZXQtPk9uRm9ybWF0KGJGb3JtYXRlZCk7CisgICAgICAgIGlmIChiRm9ybWF0ZWQpCisgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZS5jX3N0cigpLCBGQUxTRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgRkFMU0UpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSB3aWRnZXRzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXdpZGdldHMuR2V0QXQoaSk7CisgICAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOworCisgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBGQUxTRSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGJSZWZyZXNoKSB7CisgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gd2lkZ2V0cy5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopd2lkZ2V0cy5HZXRBdChpKTsKKyAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOworCisgICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBXaWRnZXQtPkdldEludGVyRm9ybSgpOworICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IHBJbnRlckZvcm0tPkdldERvY3VtZW50KCk7CisgICAgICAvLyAgICAgICAgICBDUmVhZGVyX1BhZ2UqIHBQYWdlID0gcFdpZGdldC0+R2V0UGFnZSgpOworICAgICAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7CisgICAgICBwRG9jLT5VcGRhdGVBbGxWaWV3cyhOVUxMLCBwV2lkZ2V0KTsKKyAgICB9CisgIH0KKworICBpZiAoYkNoYW5nZU1hcmspCisgICAgcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Cit9CisKK3ZvaWQgRmllbGQ6OlVwZGF0ZUZvcm1Db250cm9sKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYW5nZU1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXNldEFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVmcmVzaCkgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworICBBU1NFUlQocEZvcm1Db250cm9sICE9IE5VTEwpOworCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKKworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpOworCisgIGlmIChwV2lkZ2V0KSB7CisgICAgaWYgKGJSZXNldEFQKSB7CisgICAgICBpbnQgbkZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOworICAgICAgaWYgKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8CisgICAgICAgICAgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7CisgICAgICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBXaWRnZXQtPk9uRm9ybWF0KGJGb3JtYXRlZCk7CisgICAgICAgIGlmIChiRm9ybWF0ZWQpCisgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZS5jX3N0cigpLCBGQUxTRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgRkFMU0UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYlJlZnJlc2gpIHsKKyAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFdpZGdldC0+R2V0SW50ZXJGb3JtKCk7CisgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKKyAgICAgIEFTU0VSVChwRG9jICE9IE5VTEwpOworICAgICAgcERvYy0+VXBkYXRlQWxsVmlld3MoTlVMTCwgcFdpZGdldCk7CisgICAgfQorICB9CisKKyAgaWYgKGJDaGFuZ2VNYXJrKQorICAgIHBEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOworfQorCitDUERGU0RLX1dpZGdldCogRmllbGQ6OkdldFdpZGdldChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKKyAgQVNTRVJUKHBGb3JtQ29udHJvbCAhPSBOVUxMKTsKKworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpOworfQorCitGWF9CT09MIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCkgeworICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoY3NPcHRMYWJlbC5Db21wYXJlKHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKGkpKSA9PSAwKQorICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0NQREZfRm9ybUNvbnRyb2wqIEZpZWxkOjpHZXRTbWFydEZpZWxkQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCkgeworICBpZiAoIXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSB8fAorICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPCAwKQorICAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRDb250cm9sKDApOworCisgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3BlcnR5CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0ZYX0JPT0wgRmllbGQ6OmFsaWdubWVudChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENGWF9CeXRlU3RyaW5nIGFsaWduU3RyOworICAgIHZwID4+IGFsaWduU3RyOworCisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9TdHJpbmcoRlBfQUxJR05NRU5ULCBhbGlnblN0cik7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRBbGlnbm1lbnQobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnblN0cik7CisgICAgfQorICB9IGVsc2UgeworICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOworICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHN3aXRjaCAocEZvcm1Db250cm9sLT5HZXRDb250cm9sQWxpZ25tZW50KCkpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgdnAgPDwgTCJjZW50ZXIiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgdnAgPDwgTCJsZWZ0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIHZwIDw8IEwicmlnaHQiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHZwIDw8IEwiIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBGaWVsZDo6U2V0QWxpZ25tZW50KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykgeworICAvLyBOb3Qgc3VwcG9ydGVkLgorfQorCitGWF9CT09MIEZpZWxkOjpib3JkZXJTdHlsZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHJUeXBlID0gIiI7CisgICAgdnAgPj4gc3RyVHlwZTsKKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfU3RyaW5nKEZQX0JPUkRFUlNUWUxFLCBzdHJUeXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldEJvcmRlclN0eWxlKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJUeXBlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgaWYgKCFwRm9ybUZpZWxkKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPQorICAgICAgICBHZXRXaWRnZXQobV9wRG9jdW1lbnQsIEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKKyAgICBpZiAoIXBXaWRnZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpbnQgbkJvcmRlcnN0eWxlID0gcFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKTsKKworICAgIHN3aXRjaCAobkJvcmRlcnN0eWxlKSB7CisgICAgICBjYXNlIEJCU19TT0xJRDoKKyAgICAgICAgdnAgPDwgTCJzb2xpZCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCQlNfREFTSDoKKyAgICAgICAgdnAgPDwgTCJkYXNoZWQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQkJTX0JFVkVMRUQ6CisgICAgICAgIHZwIDw8IEwiYmV2ZWxlZCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCQlNfSU5TRVQ6CisgICAgICAgIHZwIDw8IEwiaW5zZXQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQkJTX1VOREVSTElORToKKyAgICAgICAgdnAgPDwgTCJ1bmRlcmxpbmUiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHZwIDw8IEwiIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgRmllbGQ6OlNldEJvcmRlclN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworCisgIGludCBuQm9yZGVyU3R5bGUgPSAwOworCisgIGlmIChzdHJpbmcgPT0gInNvbGlkIikKKyAgICBuQm9yZGVyU3R5bGUgPSBCQlNfU09MSUQ7CisgIGVsc2UgaWYgKHN0cmluZyA9PSAiYmV2ZWxlZCIpCisgICAgbkJvcmRlclN0eWxlID0gQkJTX0JFVkVMRUQ7CisgIGVsc2UgaWYgKHN0cmluZyA9PSAiZGFzaGVkIikKKyAgICBuQm9yZGVyU3R5bGUgPSBCQlNfREFTSDsKKyAgZWxzZSBpZiAoc3RyaW5nID09ICJpbnNldCIpCisgICAgbkJvcmRlclN0eWxlID0gQkJTX0lOU0VUOworICBlbHNlIGlmIChzdHJpbmcgPT0gInVuZGVybGluZSIpCisgICAgbkJvcmRlclN0eWxlID0gQkJTX1VOREVSTElORTsKKyAgZWxzZQorICAgIHJldHVybjsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhwRG9jdW1lbnQsIHN3RmllbGROYW1lLCBGaWVsZEFycmF5KTsKKworICBmb3IgKGludCBpID0gMCwgaXN6ID0gRmllbGRBcnJheS5HZXRTaXplKCk7IGkgPCBpc3o7IGkrKykgeworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdChpKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CisgICAgICBmb3IgKGludCBqID0gMCwganN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqIDwganN6OyBqKyspIHsKKyAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0KKyAgICAgICAgICAgICAgICBHZXRXaWRnZXQocERvY3VtZW50LCBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGopKSkgeworICAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRCb3JkZXJTdHlsZSgpICE9IG5Cb3JkZXJTdHlsZSkgeworICAgICAgICAgICAgcFdpZGdldC0+U2V0Qm9yZGVyU3R5bGUobkJvcmRlclN0eWxlKTsKKyAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGJTZXQpCisgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCiAgICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RkOjp3c3RyaW5nIHN1ZmZpeGFsID0gc3RyRmllbGROYW1lUGFyc2VkLnN1YnN0cihpU3RhcnQrMSk7Ci0gICAgaUNvbnRyb2xObyA9IEZYU1lTX3d0b2koc3VmZml4YWwuY19zdHIoKSk7Ci0gICAgaWYgKGlDb250cm9sTm8gPT0gMCkKLSAgICB7Ci0gICAgICAgIGludCBpU3RhcnQ7Ci0gICAgICAgIHdoaWxlKChpU3RhcnQgPSBzdWZmaXhhbC5maW5kX2xhc3Rfb2YoTCIgIikpICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdWZmaXhhbC5lcmFzZShpU3RhcnQsMSk7CisgICAgICBpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0KKyAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChuQ29udHJvbEluZGV4KSkgeworICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBHZXRXaWRnZXQocERvY3VtZW50LCBwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgaWYgKHBXaWRnZXQtPkdldEJvcmRlclN0eWxlKCkgIT0gbkJvcmRlclN0eWxlKSB7CisgICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJTdHlsZShuQm9yZGVyU3R5bGUpOworICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGlmIChzdWZmaXhhbC5jb21wYXJlKEwiMCIpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0ckZpZWxkTmFtZSA9IHN0ckZpZWxkTmFtZVBhcnNlZDsKLSAgICAgICAgICAgIGlDb250cm9sTm8gPSAtMTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCisgICAgICB9CiAgICAgfQotICAgIHN0ckZpZWxkTmFtZSA9IHN0ckZpZWxkTmFtZVBhcnNlZC5zdWJzdHIoMCxpU3RhcnQpOworICB9CiB9CiAKLUZYX0JPT0wgRmllbGQ6OkF0dGFjaEZpZWxkKERvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSkKLXsKLSAgICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotICAgIG1fcEpTRG9jID0gcERvY3VtZW50OworRlhfQk9PTCBGaWVsZDo6YnV0dG9uQWxpZ25YKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgbV9wRG9jdW1lbnQgPSBwRG9jdW1lbnQtPkdldFJlYWRlckRvYygpOwotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBtX2JDYW5TZXQgPSBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSB8fAotICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fQU5OT1RfRk9STSkgfHwKLSAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSk7CisgICAgaW50IG5WUDsKKyAgICB2cCA+PiBuVlA7CisKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0ludChGUF9CVVRUT05BTElHTlgsIG5WUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRCdXR0b25BbGlnblgobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKKworICAgIEZYX0ZMT0FUIGZMZWZ0LCBmQm90dG9tOworICAgIEljb25GaXQuR2V0SWNvblBvc2l0aW9uKGZMZWZ0LCBmQm90dG9tKTsKKworICAgIHZwIDw8IChpbnQzMl90KWZMZWZ0OworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgRmllbGQ6OlNldEJ1dHRvbkFsaWduWChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KK30KKworRlhfQk9PTCBGaWVsZDo6YnV0dG9uQWxpZ25ZKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaW50IG5WUDsKKyAgICB2cCA+PiBuVlA7CisKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0ludChGUF9CVVRUT05BTElHTlksIG5WUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRCdXR0b25BbGlnblkobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKKworICAgIEZYX0ZMT0FUIGZMZWZ0LCBmQm90dG9tOworICAgIEljb25GaXQuR2V0SWNvblBvc2l0aW9uKGZMZWZ0LCBmQm90dG9tKTsKKworICAgIHZwIDw8IChpbnQzMl90KWZCb3R0b207CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBGaWVsZDo6U2V0QnV0dG9uQWxpZ25ZKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgeworICAvLyBOb3Qgc3VwcG9ydGVkLgorfQorCitGWF9CT09MIEZpZWxkOjpidXR0b25GaXRCb3VuZHMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CisKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0Jvb2woRlBfQlVUVE9ORklUQk9VTkRTLCBiVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0QnV0dG9uRml0Qm91bmRzKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfSWNvbkZpdCBJY29uRml0ID0gcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCk7CisgICAgdnAgPDwgSWNvbkZpdC5HZXRGaXR0aW5nQm91bmRzKCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBGaWVsZDo6U2V0QnV0dG9uRml0Qm91bmRzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCit9CisKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGludCBuVlA7CisgICAgdnAgPj4gblZQOworCisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9JbnQoRlBfQlVUVE9OUE9TSVRJT04sIG5WUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRCdXR0b25Qb3NpdGlvbihtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHZwIDw8IHBGb3JtQ29udHJvbC0+R2V0VGV4dFBvc2l0aW9uKCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgRmllbGQ6OlNldEJ1dHRvblBvc2l0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgeworICAvLyBOb3Qgc3VwcG9ydGVkLgorfQorCitGWF9CT09MIEZpZWxkOjpidXR0b25TY2FsZUhvdyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpbnQgblZQOworICAgIHZwID4+IG5WUDsKKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfSW50KEZQX0JVVFRPTlNDQUxFSE9XLCBuVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0QnV0dG9uU2NhbGVIb3cobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WUCk7CisgICAgfQorICB9IGVsc2UgeworICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOworICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOworICAgIGlmIChJY29uRml0LklzUHJvcG9ydGlvbmFsU2NhbGUoKSkKKyAgICAgIHZwIDw8IChpbnQzMl90KTA7CisgICAgZWxzZQorICAgICAgdnAgPDwgKGludDMyX3QpMTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkIEZpZWxkOjpTZXRCdXR0b25TY2FsZUhvdyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KK30KKworRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2NhbGVXaGVuKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaW50IG5WUDsKKyAgICB2cCA+PiBuVlA7CisKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0ludChGUF9CVVRUT05TQ0FMRVdIRU4sIG5WUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRCdXR0b25TY2FsZVdoZW4obV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKKyAgICBpbnQgU2NhbGVNID0gSWNvbkZpdC5HZXRTY2FsZU1ldGhvZCgpOworICAgIHN3aXRjaCAoU2NhbGVNKSB7CisgICAgICBjYXNlIENQREZfSWNvbkZpdDo6QWx3YXlzOgorICAgICAgICB2cCA8PCAoaW50MzJfdClDUERGX0ljb25GaXQ6OkFsd2F5czsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENQREZfSWNvbkZpdDo6QmlnZ2VyOgorICAgICAgICB2cCA8PCAoaW50MzJfdClDUERGX0ljb25GaXQ6OkJpZ2dlcjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENQREZfSWNvbkZpdDo6TmV2ZXI6CisgICAgICAgIHZwIDw8IChpbnQzMl90KUNQREZfSWNvbkZpdDo6TmV2ZXI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDUERGX0ljb25GaXQ6OlNtYWxsZXI6CisgICAgICAgIHZwIDw8IChpbnQzMl90KUNQREZfSWNvbkZpdDo6U21hbGxlcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgRmllbGQ6OlNldEJ1dHRvblNjYWxlV2hlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KK30KKworRlhfQk9PTCBGaWVsZDo6Y2FsY09yZGVySW5kZXgoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaW50IG5WUDsKKyAgICB2cCA+PiBuVlA7CisKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0ludChGUF9DQUxDT1JERVJJTkRFWCwgblZQKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldENhbGNPcmRlckluZGV4KG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYKKyAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENQREZTREtfSW50ZXJGb3JtKiBwUkRJbnRlckZvcm0gPSBtX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAgICAgQVNTRVJUKHBSREludGVyRm9ybSAhPSBOVUxMKTsKQEAgLTE4NiwzMjgwICs4ODEsMjQ3MiBAQAogICAgIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJESW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKICAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHN3RmllbGROYW1lVGVtcCA9IGNzRmllbGROYW1lOwotICAgIHN3RmllbGROYW1lVGVtcC5SZXBsYWNlKEwiLi4iLCBMIi4iKTsKKyAgICB2cCA8PCAoaW50MzJfdClwSW50ZXJGb3JtLT5GaW5kRmllbGRJbkNhbGN1bGF0aW9uT3JkZXIocEZvcm1GaWVsZCk7CisgIH0KIAotICAgIGlmIChwSW50ZXJGb3JtLT5Db3VudEZpZWxkcyhzd0ZpZWxkTmFtZVRlbXApIDw9IDApCi0gICAgewotICAgICAgICBzdGQ6OndzdHJpbmcgc3RyRmllbGROYW1lOwotICAgICAgICBpbnQgaUNvbnRyb2xObyA9IC0xOwotICAgICAgICBQYXJzZUZpZWxkTmFtZShzd0ZpZWxkTmFtZVRlbXAuY19zdHIoKSwgc3RyRmllbGROYW1lLCBpQ29udHJvbE5vKTsKLSAgICAgICAgaWYgKGlDb250cm9sTm8gPT0gLTEpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBtX0ZpZWxkTmFtZSA9IHN0ckZpZWxkTmFtZS5jX3N0cigpOwotICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4ID0gaUNvbnRyb2xObzsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgbV9GaWVsZE5hbWUgPSBzd0ZpZWxkTmFtZVRlbXA7Ci0gICAgbV9uRm9ybUNvbnRyb2xJbmRleCA9IC0xOwotCi0gICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIEZpZWxkOjpHZXRGb3JtRmllbGRzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIEZpZWxkQXJyYXkpCi17Ci0gICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIENQREZTREtfSW50ZXJGb3JtKiBwUmVhZGVySW50ZXJGb3JtID0gcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLSAgICBBU1NFUlQocFJlYWRlckludGVyRm9ybSAhPSBOVUxMKTsKLQotICAgIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLSAgICBBU1NFUlQoRmllbGRBcnJheS5HZXRTaXplKCkgPT0gMCk7Ci0KLSAgICBmb3IgKGludCBpPTAsc3o9cEludGVyRm9ybS0+Q291bnRGaWVsZHMoY3NGaWVsZE5hbWUpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgICBpZiAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwSW50ZXJGb3JtLT5HZXRGaWVsZChpLCBjc0ZpZWxkTmFtZSkpCi0gICAgICAgICAgICBGaWVsZEFycmF5LkFkZCgodm9pZCopcEZvcm1GaWVsZCk7Ci0gICAgfQordm9pZCBGaWVsZDo6U2V0Q2FsY09yZGVySW5kZXgoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLXZvaWQgRmllbGQ6OkdldEZvcm1GaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIEZpZWxkQXJyYXkpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6Y2hhckxpbWl0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi0gICAgRmllbGQ6OkdldEZvcm1GaWVsZHMobV9wRG9jdW1lbnQsIGNzRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLX0KKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLXZvaWQgRmllbGQ6OlVwZGF0ZUZvcm1GaWVsZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYW5nZU1hcmssIEZYX0JPT0wgYlJlc2V0QVAsIEZYX0JPT0wgYlJlZnJlc2gpCi17Ci0gICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLSAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBpbnQgblZQOworICAgIHZwID4+IG5WUDsKIAotICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgQ0ZYX1B0ckFycmF5IHdpZGdldHM7Ci0gICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0cyhwRm9ybUZpZWxkLCB3aWRnZXRzKTsKLQotICAgIGlmIChiUmVzZXRBUCkKLSAgICB7Ci0gICAgICAgIGludCBuRmllbGRUeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7Ci0gICAgICAgIGlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MCxzej13aWRnZXRzLkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0Kil3aWRnZXRzLkdldEF0KGkpOwotICAgICAgICAgICAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwotCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9ybWF0ZWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwV2lkZ2V0LT5PbkZvcm1hdChiRm9ybWF0ZWQpOwotICAgICAgICAgICAgICAgIGlmIChiRm9ybWF0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUuY19zdHIoKSwgRkFMU0UpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MCxzej13aWRnZXRzLkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0Kil3aWRnZXRzLkdldEF0KGkpOwotICAgICAgICAgICAgICAgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwotCi0gICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfSW50KEZQX0NIQVJMSU1JVCwgblZQKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldENoYXJMaW1pdChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7CiAgICAgfQotCi0gICAgaWYgKGJSZWZyZXNoKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wLHN6PXdpZGdldHMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0Kil3aWRnZXRzLkdldEF0KGkpOwotICAgICAgICAgICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgIENQREZTREtfSW50ZXJGb3JtICogcEludGVyRm9ybSA9IHBXaWRnZXQtPkdldEludGVyRm9ybSgpOwotICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IHBJbnRlckZvcm0tPkdldERvY3VtZW50KCk7Ci0vLyAgICAgICAgICBDUmVhZGVyX1BhZ2UqIHBQYWdlID0gcFdpZGdldC0+R2V0UGFnZSgpOwotICAgICAgICAgICAgQVNTRVJUKHBEb2MgIT0gTlVMTCk7Ci0gICAgICAgICAgICBwRG9jLT5VcGRhdGVBbGxWaWV3cyhOVUxMLCBwV2lkZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChiQ2hhbmdlTWFyaykKLSAgICAgICAgcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci19Ci0KLXZvaWQgRmllbGQ6OlVwZGF0ZUZvcm1Db250cm9sKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYW5nZU1hcmssIEZYX0JPT0wgYlJlc2V0QVAsIEZYX0JPT0wgYlJlZnJlc2gpCi17Ci0gICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLSAgICBBU1NFUlQocEZvcm1Db250cm9sICE9IE5VTEwpOwotCi0gICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLSAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpOwotCi0gICAgaWYgKHBXaWRnZXQpCi0gICAgewotICAgICAgICBpZiAoYlJlc2V0QVApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcFdpZGdldC0+T25Gb3JtYXQoYkZvcm1hdGVkKTsKLSAgICAgICAgICAgICAgICBpZiAoYkZvcm1hdGVkKQotICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2Uoc1ZhbHVlLmNfc3RyKCksIEZBTFNFKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiUmVmcmVzaCkKLSAgICAgICAgewotICAgICAgICAgICAgQ1BERlNES19JbnRlckZvcm0gKiBwSW50ZXJGb3JtID0gcFdpZGdldC0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIEFTU0VSVChwRG9jICE9IE5VTEwpOwotICAgICAgICAgICAgcERvYy0+VXBkYXRlQWxsVmlld3MoTlVMTCwgcFdpZGdldCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIGlmIChiQ2hhbmdlTWFyaykKLSAgICAgICAgcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci19Ci0KLUNQREZTREtfV2lkZ2V0KiBGaWVsZDo6R2V0V2lkZ2V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKQotewotICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgQVNTRVJUKHBGb3JtQ29udHJvbCAhPSBOVUxMKTsKLQotICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgcmV0dXJuIHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpOwotfQotCi1GWF9CT09MIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpCi17Ci0gICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICBmb3IgKGludCBpPTAsc3ogPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspCi0gICAgewotICAgICAgICBpZiAoY3NPcHRMYWJlbC5Db21wYXJlKHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKGkpKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1DUERGX0Zvcm1Db250cm9sKiBGaWVsZDo6R2V0U21hcnRGaWVsZENvbnRyb2woQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQpCi17Ci0gICAgaWYgKCFwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkgfHwgbV9uRm9ybUNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPCAwKQotICAgICAgICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKTsKLQotICAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3BlcnR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotRlhfQk9PTCBGaWVsZDo6YWxpZ25tZW50KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGFsaWduU3RyOwotICAgICAgICB2cCA+PiBhbGlnblN0cjsKLQotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X1N0cmluZyhGUF9BTElHTk1FTlQsIGFsaWduU3RyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXRBbGlnbm1lbnQobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBhbGlnblN0cik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKLQotICAgICAgICBzd2l0Y2ggKHBGb3JtQ29udHJvbC0+R2V0Q29udHJvbEFsaWdubWVudCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgdnAgPDwgTCJjZW50ZXIiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHZwIDw8IEwibGVmdCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgdnAgPDwgTCJyaWdodCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHZwIDw8IEwiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRBbGlnbm1lbnQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpCi17Ci0gICAgLy9Ob3Qgc3VwcG9ydGVkLgotfQotCi1GWF9CT09MIEZpZWxkOjpib3JkZXJTdHlsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHJUeXBlID0gIiI7Ci0gICAgICAgIHZwID4+IHN0clR5cGU7Ci0KLSAgICAgICAgaWYgKG1fYkRlbGF5KQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGREZWxheV9TdHJpbmcoRlBfQk9SREVSU1RZTEUsIHN0clR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldEJvcmRlclN0eWxlKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgc3RyVHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgaWYgKCFwRm9ybUZpZWxkKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBHZXRXaWRnZXQobV9wRG9jdW1lbnQsIEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaW50IG5Cb3JkZXJzdHlsZSA9IHBXaWRnZXQtPkdldEJvcmRlclN0eWxlKCk7Ci0KLSAgICAgICAgc3dpdGNoIChuQm9yZGVyc3R5bGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQkJTX1NPTElEOgotICAgICAgICAgICAgICAgIHZwIDw8IEwic29saWQiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCQlNfREFTSDoKLSAgICAgICAgICAgICAgICB2cCA8PCBMImRhc2hlZCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJCU19CRVZFTEVEOgotICAgICAgICAgICAgICAgIHZwIDw8IEwiYmV2ZWxlZCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJCU19JTlNFVDoKLSAgICAgICAgICAgICAgICB2cCA8PCBMImluc2V0IjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQkJTX1VOREVSTElORToKLSAgICAgICAgICAgICAgICB2cCA8PCBMInVuZGVybGluZSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHZwIDw8IEwiIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRCb3JkZXJTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKQotewotICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpbnQgbkJvcmRlclN0eWxlID0gMDsKLQotICAgIGlmIChzdHJpbmcgPT0gInNvbGlkIikKLSAgICAgICAgbkJvcmRlclN0eWxlID0gQkJTX1NPTElEOwotICAgIGVsc2UgaWYgKHN0cmluZyA9PSAiYmV2ZWxlZCIpCi0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IEJCU19CRVZFTEVEOwotICAgIGVsc2UgaWYgKHN0cmluZyA9PSAiZGFzaGVkIikKLSAgICAgICAgbkJvcmRlclN0eWxlID0gQkJTX0RBU0g7Ci0gICAgZWxzZSBpZiAoc3RyaW5nID09ICJpbnNldCIpCi0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IEJCU19JTlNFVDsKLSAgICBlbHNlIGlmIChzdHJpbmcgPT0gInVuZGVybGluZSIpCi0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IEJCU19VTkRFUkxJTkU7Ci0gICAgZWxzZSByZXR1cm47Ci0KLSAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICBHZXRGb3JtRmllbGRzKHBEb2N1bWVudCwgc3dGaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotCi0gICAgZm9yIChpbnQgaT0wLGlzej1GaWVsZEFycmF5LkdldFNpemUoKTsgaTxpc3o7IGkrKykKLSAgICB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdChpKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKG5Db250cm9sSW5kZXggPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGo8anN6OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBEb2N1bWVudCwgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKSAhPSBuQm9yZGVyU3R5bGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlclN0eWxlKG5Cb3JkZXJTdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiU2V0KSBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKG5Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm47Ci0gICAgICAgICAgICBpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChuQ29udHJvbEluZGV4KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBHZXRXaWRnZXQocERvY3VtZW50LCBwRm9ybUNvbnRyb2wpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBXaWRnZXQtPkdldEJvcmRlclN0eWxlKCkgIT0gbkJvcmRlclN0eWxlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJTdHlsZShuQm9yZGVyU3R5bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1GWF9CT09MIEZpZWxkOjpidXR0b25BbGlnblgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaW50IG5WUDsKLSAgICAgICAgdnAgPj4gblZQOwotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfSW50KEZQX0JVVFRPTkFMSUdOWCwgblZQKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXRCdXR0b25BbGlnblgobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKLQotICAgICAgICBGWF9GTE9BVCBmTGVmdCxmQm90dG9tOwotICAgICAgICBJY29uRml0LkdldEljb25Qb3NpdGlvbihmTGVmdCxmQm90dG9tKTsKLQotICAgICAgICB2cCA8PCAoaW50MzJfdClmTGVmdDsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0QnV0dG9uQWxpZ25YKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6OmJ1dHRvbkFsaWduWShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBpbnQgblZQOwotICAgICAgICB2cCA+PiBuVlA7Ci0KLSAgICAgICAgaWYgKG1fYkRlbGF5KQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGREZWxheV9JbnQoRlBfQlVUVE9OQUxJR05ZLCBuVlApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldEJ1dHRvbkFsaWduWShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKLQotICAgICAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOwotCi0gICAgICAgIEZYX0ZMT0FUIGZMZWZ0LGZCb3R0b207Ci0gICAgICAgIEljb25GaXQuR2V0SWNvblBvc2l0aW9uKGZMZWZ0LGZCb3R0b20pOwotCi0gICAgICAgIHZwIDw8ICAoaW50MzJfdClmQm90dG9tOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRCdXR0b25BbGlnblkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQotewotICAgIC8vTm90IHN1cHBvcnRlZC4KLX0KLQotRlhfQk9PTCBGaWVsZDo6YnV0dG9uRml0Qm91bmRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGJvb2wgYlZQOwotICAgICAgICB2cCA+PiBiVlA7Ci0KLSAgICAgICAgaWYgKG1fYkRlbGF5KQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGREZWxheV9Cb29sKEZQX0JVVFRPTkZJVEJPVU5EUywgYlZQKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXRCdXR0b25GaXRCb3VuZHMobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKLSAgICAgICAgdnAgPDwgSWNvbkZpdC5HZXRGaXR0aW5nQm91bmRzKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldEJ1dHRvbkZpdEJvdW5kcyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6OmJ1dHRvblBvc2l0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGludCBuVlA7Ci0gICAgICAgIHZwID4+IG5WUDsKLQotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X0ludChGUF9CVVRUT05QT1NJVElPTiwgblZQKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXRCdXR0b25Qb3NpdGlvbihtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKLQotICAgICAgICB2cCA8PCAgcEZvcm1Db250cm9sLT5HZXRUZXh0UG9zaXRpb24oKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldEJ1dHRvblBvc2l0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6OmJ1dHRvblNjYWxlSG93KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGludCBuVlA7Ci0gICAgICAgIHZwID4+IG5WUDsKLQotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X0ludChGUF9CVVRUT05TQ0FMRUhPVywgblZQKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXRCdXR0b25TY2FsZUhvdyhtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKLSAgICAgICAgaWYgKEljb25GaXQuSXNQcm9wb3J0aW9uYWxTY2FsZSgpKQotICAgICAgICAgICAgdnAgPDwgKGludDMyX3QpMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdnAgPDwgKGludDMyX3QpMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0QnV0dG9uU2NhbGVIb3coQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQotewotICAgIC8vTm90IHN1cHBvcnRlZC4KLX0KLQotRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2NhbGVXaGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGludCBuVlA7Ci0gICAgICAgIHZwID4+IG5WUDsKLQotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X0ludChGUF9CVVRUT05TQ0FMRVdIRU4sIG5WUCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZDo6U2V0QnV0dG9uU2NhbGVXaGVuKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgblZQKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopIEZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKLSAgICAgICAgaW50IFNjYWxlTSA9IEljb25GaXQuR2V0U2NhbGVNZXRob2QoKTsKLSAgICAgICAgc3dpdGNoIChTY2FsZU0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgQ1BERl9JY29uRml0OjpBbHdheXMgOgotICAgICAgICAgICAgICAgIHZwIDw8ICAoaW50MzJfdCkgQ1BERl9JY29uRml0OjpBbHdheXM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENQREZfSWNvbkZpdDo6QmlnZ2VyIDoKLSAgICAgICAgICAgICAgICB2cCA8PCAgKGludDMyX3QpIENQREZfSWNvbkZpdDo6QmlnZ2VyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDUERGX0ljb25GaXQ6Ok5ldmVyIDoKLSAgICAgICAgICAgICAgICB2cCA8PCAgKGludDMyX3QpIENQREZfSWNvbkZpdDo6TmV2ZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENQREZfSWNvbkZpdDo6U21hbGxlciA6Ci0gICAgICAgICAgICAgICAgdnAgPDwgIChpbnQzMl90KSBDUERGX0ljb25GaXQ6OlNtYWxsZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0QnV0dG9uU2NhbGVXaGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6OmNhbGNPcmRlckluZGV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGludCBuVlA7Ci0gICAgICAgIHZwID4+IG5WUDsKLQotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X0ludChGUF9DQUxDT1JERVJJTkRFWCwgblZQKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXRDYWxjT3JkZXJJbmRleChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCAmJiBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwUkRJbnRlckZvcm0gPSBtX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgICAgIEFTU0VSVChwUkRJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLSAgICAgICAgQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwUkRJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwotICAgICAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotICAgICAgICB2cCA8PCAoaW50MzJfdClwSW50ZXJGb3JtLT5GaW5kRmllbGRJbkNhbGN1bGF0aW9uT3JkZXIocEZvcm1GaWVsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldENhbGNPcmRlckluZGV4KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6OmNoYXJMaW1pdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBpbnQgblZQOwotICAgICAgICB2cCA+PiBuVlA7Ci0KLSAgICAgICAgaWYgKG1fYkRlbGF5KQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGREZWxheV9JbnQoRlBfQ0hBUkxJTUlULCBuVlApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldENoYXJMaW1pdChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgdnAgPDwgKGludDMyX3QpcEZvcm1GaWVsZC0+R2V0TWF4TGVuKCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRDaGFyTGltaXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQotewotICAgIC8vTm90IHN1cHBvcnRlZC4KLX0KLQotRlhfQk9PTCBGaWVsZDo6Y29tYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBib29sIGJWUDsKLSAgICAgICAgdnAgPj4gYlZQOwotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfQm9vbChGUF9DT01CLCBiVlApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldENvbWIobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19DT01CKQotICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdnAgPDwgZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldENvbWIoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCi17Ci0gICAgLy9Ob3Qgc3VwcG9ydGVkLgotfQotCi1GWF9CT09MIEZpZWxkOjpjb21taXRPblNlbENoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBib29sIGJWUDsKLSAgICAgICAgdnAgPj4gYlZQOwotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfQm9vbChGUF9DT01NSVRPTlNFTENIQU5HRSwgYlZQKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXRDb21taXRPblNlbENoYW5nZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGJWUCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YICYmIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfQ09NTUlUT05TRUxDSEFOR0UpCi0gICAgICAgICAgICB2cCA8PCB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cCA8PCBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0Q29tbWl0T25TZWxDaGFuZ2UoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCi17Ci0gICAgLy9Ob3Qgc3VwcG9ydGVkLgotfQotCi1GWF9CT09MIEZpZWxkOjpjdXJyZW50VmFsdWVJbmRpY2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENGWF9EV29yZEFycmF5IGFycmF5OwotCi0gICAgICAgIGlmICh2cC5HZXRUeXBlKCkgPT0gVlRfbnVtYmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaVNlbGVjdGluZyA9IDA7Ci0gICAgICAgICAgICB2cCA+PiBpU2VsZWN0aW5nOwotICAgICAgICAgICAgYXJyYXkuQWRkKGlTZWxlY3RpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHZwLklzQXJyYXlPYmplY3QoKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ0pTX0FycmF5IFNlbEFycmF5KG1faXNvbGF0ZSk7Ci0gICAgICAgICAgICBDSlNfVmFsdWUgU2VsVmFsdWUobV9pc29sYXRlKTsKLSAgICAgICAgICAgIGludCBpU2VsZWN0aW5nOwotICAgICAgICAgICAgdnAgPj4gU2VsQXJyYXk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTAsc3o9U2VsQXJyYXkuR2V0TGVuZ3RoKCk7IGk8c3o7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZWxBcnJheS5HZXRFbGVtZW50KGksU2VsVmFsdWUpOwotICAgICAgICAgICAgICAgIGlTZWxlY3RpbmcgPSBTZWxWYWx1ZS5Ub0ludCgpOwotICAgICAgICAgICAgICAgIGFycmF5LkFkZChpU2VsZWN0aW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfV29yZEFycmF5KEZQX0NVUlJFTlRWQUxVRUlORElDRVMsIGFycmF5KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXRDdXJyZW50VmFsdWVJbmRpY2VzKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgYXJyYXkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCAmJiBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfTElTVEJPWCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBpZiAocEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCkgPT0gMSkKLSAgICAgICAgICAgIHZwIDw8IHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoMCk7Ci0gICAgICAgIGVsc2UgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKLSAgICAgICAgewotICAgICAgICAgICAgQ0pTX0FycmF5IFNlbEFycmF5KG1faXNvbGF0ZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTAsc3o9cEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7IGk8c3o7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZWxBcnJheS5TZXRFbGVtZW50KGksIENKU19WYWx1ZShtX2lzb2xhdGUscEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChpKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdnAgPDwgU2VsQXJyYXk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdnAgPDwgLTE7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldEN1cnJlbnRWYWx1ZUluZGljZXMoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRFdvcmRBcnJheSYgYXJyYXkpCi17Ci0gICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgIEdldEZvcm1GaWVsZHMocERvY3VtZW50LCBzd0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0KLSAgICBmb3IgKGludCBpPTAsaXN6PUZpZWxkQXJyYXkuR2V0U2l6ZSgpOyBpPGlzejsgaSsrKQotICAgIHsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBpbnQgbkZpZWxkVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOwotICAgICAgICBpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfTElTVEJPWCkKLSAgICAgICAgewotICAgICAgICAgICAgRlhfRFdPUkQgZHdGaWVsZEZsYWdzID0gcEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpOwotICAgICAgICAgICAgcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oVFJVRSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGk9MCxzej1hcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaT4wICYmICEoZHdGaWVsZEZsYWdzICYgKDE8PDIxKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgaVNlbGVjdGluZyA9IChpbnQzMl90KWFycmF5LkdldEF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChpU2VsZWN0aW5nIDwgcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCkgJiYgIXBGb3JtRmllbGQtPklzSXRlbVNlbGVjdGVkKGlTZWxlY3RpbmcpKQotICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlTZWxlY3RpbmcsIFRSVUUpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotRlhfQk9PTCBGaWVsZDo6ZGVmYXVsdFN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICAvLyBNUUcgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19OT1RTVVBQT1JUKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0RGVmYXVsdFN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCkKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6OmRlZmF1bHRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDRlhfV2lkZVN0cmluZyBXaWRlU3RyOwotICAgICAgICB2cCA+PiBXaWRlU3RyOwotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfV2lkZVN0cmluZyhGUF9ERUZBVUxUVkFMVUUsIFdpZGVTdHIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldERlZmF1bHRWYWx1ZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIFdpZGVTdHIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OIHx8Ci0gICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfU0lHTkFUVVJFKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIHZwIDw8IHBGb3JtRmllbGQtPkdldERlZmF1bHRWYWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0RGVmYXVsdFZhbHVlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKQotewotICAgIC8vTm90IHN1cHBvcnRlZC4KLX0KLQotRlhfQk9PTCBGaWVsZDo6ZG9Ob3RTY3JvbGwoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgYm9vbCBiVlA7Ci0gICAgICAgIHZwID4+IGJWUDsKLQotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X0Jvb2woRlBfRE9OT1RTQ1JPTEwsIGJWUCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZDo6U2V0RG9Ob3RTY3JvbGwobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19ET05PVFNDUk9MTCkKLSAgICAgICAgICAgIHZwIDw8IHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwIDw8IGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXREb05vdFNjcm9sbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6OmRvTm90U3BlbGxDaGVjayhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBib29sIGJWUDsKLSAgICAgICAgdnAgPj4gYlZQOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEICYmCi0gICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1gpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19ET05PVFNQRUxMQ0hFQ0spCi0gICAgICAgICAgICB2cCA8PCB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cCA8PCBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0RGVsYXkoRlhfQk9PTCBiRGVsYXkpCi17Ci0gICAgbV9iRGVsYXkgPSBiRGVsYXk7Ci0KLSAgICBpZiAoIW1fYkRlbGF5KQotICAgIHsKLSAgICAgICAgaWYgKG1fcEpTRG9jKQotICAgICAgICAgICAgbV9wSlNEb2MtPkRvRmllbGREZWxheShtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCk7Ci0gICAgfQotfQotCi1GWF9CT09MIEZpZWxkOjpkZWxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBib29sIGJWUDsKLSAgICAgICAgdnAgPj4gYlZQOwotCi0gICAgICAgIFNldERlbGF5KGJWUCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZwIDw8IG1fYkRlbGF5OwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBGaWVsZDo6ZGlzcGxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBpbnQgblZQOwotICAgICAgICB2cCA+PiBuVlA7Ci0KLSAgICAgICAgaWYgKG1fYkRlbGF5KQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGREZWxheV9JbnQoRlBfRElTUExBWSwgblZQKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXREaXNwbGF5KG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgblZQKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KXJldHVybiBGQUxTRTsKLQotICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwotCi0gICAgICAgIGlmIChBTk5PVEZMQUdfSU5WSVNJQkxFICYgZHdGbGFnIHx8IEFOTk9URkxBR19ISURERU4gJiBkd0ZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwIDw8IChpbnQzMl90KTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoQU5OT1RGTEFHX1BSSU5UICYgZHdGbGFnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChBTk5PVEZMQUdfTk9WSUVXICYgZHdGbGFnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdnAgPDwgKGludDMyX3QpMzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdnAgPDwgKGludDMyX3QpMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdnAgPDwgKGludDMyX3QpMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXREaXNwbGF5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKLXsKLSAgICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLSAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICBHZXRGb3JtRmllbGRzKHBEb2N1bWVudCwgc3dGaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotCi0gICAgZm9yIChpbnQgaT0wLGlzej1GaWVsZEFycmF5LkdldFNpemUoKTsgaTxpc3o7IGkrKykKLSAgICB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdChpKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKG5Db250cm9sSW5kZXggPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGo8anN6OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQocEZvcm1Db250cm9sICE9IE5VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG51bWJlcikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19ISURERU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX05PVklFVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWcgfD0gQU5OT1RGTEFHX1BSSU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX05PVklFVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWcgfD0gKEFOTk9URkxBR19ISURERU4gfCBBTk5PVEZMQUdfUFJJTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX1BSSU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19ISURERU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX05PVklFVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnIHw9IEFOTk9URkxBR19OT1ZJRVc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWcgfD0gQU5OT1RGTEFHX1BSSU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0hJRERFTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkd0ZsYWcgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHJldHVybjsKLSAgICAgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG51bWJlcikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19ISURERU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX05PVklFVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWcgfD0gQU5OT1RGTEFHX1BSSU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX05PVklFVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWcgfD0gKEFOTk9URkxBR19ISURERU4gfCBBTk5PVEZMQUdfUFJJTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX1BSSU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19ISURERU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX05PVklFVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnIHw9IEFOTk9URkxBR19OT1ZJRVc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWcgfD0gQU5OT1RGTEFHX1BSSU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0hJRERFTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZHdGbGFnICE9IHBXaWRnZXQtPkdldEZsYWdzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgVFJVRSwgRkFMU0UsIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1GWF9CT09MIEZpZWxkOjpkb2MoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB2cCA8PCBtX3BKU0RvYy0+R2V0Q0pTRG9jKCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRmllbGQ6OmVkaXRhYmxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBib29sIGJWUDsKLSAgICAgICAgdnAgPj4gYlZQOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRURJVCkKLSAgICAgICAgICAgIHZwIDw8IHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwIDw8IGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIEZpZWxkOjpleHBvcnRWYWx1ZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NIRUNLQk9YICYmCi0gICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENKU19BcnJheSBFeHBvcnRWYWx1c0FycmF5KG1faXNvbGF0ZSk7Ci0gICAgICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4IDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaT0wLHN6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaTxzejsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7Ci0gICAgICAgICAgICAgICAgRXhwb3J0VmFsdXNBcnJheS5TZXRFbGVtZW50KGksIENKU19WYWx1ZShtX2lzb2xhdGUscEZvcm1Db250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCk7Ci0gICAgICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgIEV4cG9ydFZhbHVzQXJyYXkuU2V0RWxlbWVudCgwLCBDSlNfVmFsdWUobV9pc29sYXRlLHBGb3JtQ29udHJvbC0+R2V0RXhwb3J0VmFsdWUoKS5jX3N0cigpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdnAgPDwgRXhwb3J0VmFsdXNBcnJheTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRmllbGQ6OmZpbGVTZWxlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQorICB9IGVsc2UgewogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwogICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgYm9vbCBiVlA7Ci0gICAgICAgIHZwID4+IGJWUDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19GSUxFU0VMRUNUKQotICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdnAgPDwgZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHZwIDw8IChpbnQzMl90KXBGb3JtRmllbGQtPkdldE1heExlbigpOworICB9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIEZpZWxkOjpmaWxsQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK3ZvaWQgRmllbGQ6OlNldENoYXJMaW1pdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KK30KIAotICAgIENKU19BcnJheSBjckFycmF5KG1faXNvbGF0ZSk7CitGWF9CT09MIEZpZWxkOjpjb21iKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CisKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0Jvb2woRlBfQ09NQiwgYlZQKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldENvbWIobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOworICAgIH0KKyAgfSBlbHNlIHsKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOworICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCi0gICAgICAgIGlmICghdnAuSXNBcnJheU9iamVjdCgpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgICAgIHZwID4+IGNyQXJyYXk7Ci0KLSAgICAgICAgQ1BXTF9Db2xvciBjb2xvcjsKLSAgICAgICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoY3JBcnJheSwgY29sb3IpOwotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X0NvbG9yKEZQX0ZJTExDT0xPUiwgY29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldEZpbGxDb2xvcihtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGNvbG9yKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0NPTUIpCisgICAgICB2cCA8PCB0cnVlOwogICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgICAgICB2cCA8PCBmYWxzZTsKKyAgfQogCi0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBpbnQgaUNvbG9yVHlwZTsKLSAgICAgICAgcEZvcm1Db250cm9sLT5HZXRCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSk7Ci0KLSAgICAgICAgQ1BXTF9Db2xvciBjb2xvcjsKLSAgICAgICAgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9HUkFZKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1JHQikKLSAgICAgICAgewotICAgICAgICAgICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMCksCi0gICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigxKSwKLSAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDIpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9DTVlLKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMCksCi0gICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigxKSwKLSAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDIpLAotICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBjb2xvcjo6Q29udmVydFBXTENvbG9yVG9BcnJheShjb2xvciwgY3JBcnJheSk7Ci0gICAgICAgIHZwICA8PCAgY3JBcnJheTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldEZpbGxDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQotewotICAgIC8vTm90IHN1cHBvcnRlZC4KK3ZvaWQgRmllbGQ6OlNldENvbWIoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICBib29sIGIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6aGlkZGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpjb21taXRPblNlbENoYW5nZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotICAgICAgICBib29sIGJWUDsKLSAgICAgICAgdnAgPj4gYlZQOworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKIAotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X0Jvb2woRlBfSElEREVOLCBiVlApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldEhpZGRlbihtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGJWUCk7Ci0gICAgICAgIH0KKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0Jvb2woRlBfQ09NTUlUT05TRUxDSEFOR0UsIGJWUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRDb21taXRPblNlbENoYW5nZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZQKTsKICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotICAgICAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKSk7Ci0gICAgICAgIGlmICghcFdpZGdldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwotCi0gICAgICAgIGlmIChBTk5PVEZMQUdfSU5WSVNJQkxFICYgZHdGbGFncyB8fCBBTk5PVEZMQUdfSElEREVOICYgZHdGbGFncykKLSAgICAgICAgewotICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cCA8PCBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0SGlkZGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQotewotICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLSAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgIEdldEZvcm1GaWVsZHMocERvY3VtZW50LCBzd0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0KLSAgICBmb3IgKGludCBpPTAsaXN6PUZpZWxkQXJyYXkuR2V0U2l6ZSgpOyBpPGlzejsgaSsrKQotICAgIHsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOwotICAgICAgICAgICAgZm9yIChpbnQgaj0wLGpzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgajxqc3o7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyB8PSAoQU5OT1RGTEFHX0hJRERFTiB8IEFOTk9URkxBR19QUklOVCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzICY9ICh+QU5OT1RGTEFHX0hJRERFTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzICY9ICh+QU5OT1RGTEFHX05PVklFVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEFOTk9URkxBR19QUklOVDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkd0ZsYWdzICE9IHBXaWRnZXQtPkdldEZsYWdzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChiU2V0KQotICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIEZBTFNFLCBUUlVFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKG5Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm47Ci0gICAgICAgICAgICBpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChuQ29udHJvbEluZGV4KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChiKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzICY9ICh+QU5OT1RGTEFHX05PVklFVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzIHw9IChBTk5PVEZMQUdfSElEREVOIHwgQU5OT1RGTEFHX1BSSU5UKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfSElEREVOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MgfD0gQU5OT1RGTEFHX1BSSU5UOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgVFJVRSwgRkFMU0UsIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1GWF9CT09MIEZpZWxkOjpoaWdobGlnaHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyTW9kZTsKLSAgICAgICAgdnAgPj4gc3RyTW9kZTsKLQotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X1N0cmluZyhGUF9ISUdITElHSFQsIHN0ck1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldEhpZ2hsaWdodChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIHN0ck1vZGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGludCBlSE0gPSBwRm9ybUNvbnRyb2wtPkdldEhpZ2hsaWdodGluZ01vZGUoKTsKLSAgICAgICAgc3dpdGNoIChlSE0pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBDUERGX0Zvcm1Db250cm9sOjpOb25lOgotICAgICAgICAgICAgdnAgIDw8ICBMIm5vbmUiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1BERl9Gb3JtQ29udHJvbDo6UHVzaDoKLSAgICAgICAgICAgIHZwICA8PCAgTCJwdXNoIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENQREZfRm9ybUNvbnRyb2w6OkludmVydDoKLSAgICAgICAgICAgIHZwICA8PCAgTCJpbnZlcnQiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1BERl9Gb3JtQ29udHJvbDo6T3V0bGluZToKLSAgICAgICAgICAgIHZwICA8PCAgTCJvdXRsaW5lIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENQREZfRm9ybUNvbnRyb2w6OlRvZ2dsZToKLSAgICAgICAgICAgICB2cCAgPDwgIEwidG9nZ2xlIjsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRIaWdobGlnaHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKQotewotICAgIC8vTm90IHN1cHBvcnRlZC4KLX0KLQotRlhfQk9PTCBGaWVsZDo6bGluZVdpZHRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGludCBpV2lkdGg7Ci0gICAgICAgIHZwID4+IGlXaWR0aDsKLQotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X0ludChGUF9MSU5FV0lEVEgsIGlXaWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZDo6U2V0TGluZVdpZHRoKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgaVdpZHRoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgICAgIGlmKCFwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUZpZWxkLT5HZXRDb250cm9sKDApKTsKLSAgICAgICAgaWYgKCFwV2lkZ2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgdnAgPDwgKGludDMyX3QpcFdpZGdldC0+R2V0Qm9yZGVyV2lkdGgoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0TGluZVdpZHRoKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKLXsKLSAgICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLSAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICBHZXRGb3JtRmllbGRzKHBEb2N1bWVudCwgc3dGaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotCi0gICAgZm9yIChpbnQgaT0wLGlzej1GaWVsZEFycmF5LkdldFNpemUoKTsgaTxpc3o7IGkrKykKLSAgICB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdChpKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKG5Db250cm9sSW5kZXggPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3o9cEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqPGpzejsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaik7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHBGb3JtQ29udHJvbCAhPSBOVUxMKTsKLQotICAgICAgICAgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlciAhPSBwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJXaWR0aChudW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihuQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkgcmV0dXJuOwotICAgICAgICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2wobkNvbnRyb2xJbmRleCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyICE9IHBXaWRnZXQtPkdldEJvcmRlcldpZHRoKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlcldpZHRoKG51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgVFJVRSwgVFJVRSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUZYX0JPT0wgRmllbGQ6Om11bHRpbGluZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBib29sIGJWUDsKLSAgICAgICAgdnAgPj4gYlZQOwotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfQm9vbChGUF9NVUxUSUxJTkUsIGJWUCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZDo6U2V0TXVsdGlsaW5lKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgYlZQKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJTElORSkKLSAgICAgICAgICAgIHZwIDw8IHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwIDw8IGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRNdWx0aWxpbmUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCi17Ci0gICAgLy9Ob3Qgc3VwcG9ydGVkLgotfQotCi1GWF9CT09MIEZpZWxkOjptdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBib29sIGJWUDsKLSAgICAgICAgdnAgPj4gYlZQOwotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfQm9vbChGUF9NVUxUSVBMRVNFTEVDVElPTiwgYlZQKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXRNdWx0aXBsZVNlbGVjdGlvbihtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGJWUCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkKLSAgICAgICAgICAgIHZwIDw8IHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwIDw8IGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRNdWx0aXBsZVNlbGVjdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6Om5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBGQUxTRTsKLQorICB9IGVsc2UgewogICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwogICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICB2cCA8PCBtX0ZpZWxkTmFtZTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIEZpZWxkOjpudW1JdGVtcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYKICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0NPTU1JVE9OU0VMQ0hBTkdFKQorICAgICAgdnAgPDwgdHJ1ZTsKKyAgICBlbHNlCisgICAgICB2cCA8PCBmYWxzZTsKKyAgfQogCi0gICAgdnAgPDwgKGludDMyX3QpcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCk7Ci0KLSAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnBhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBGQUxTRTsKK3ZvaWQgRmllbGQ6OlNldENvbW1pdE9uU2VsQ2hhbmdlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCit9CiAKK0ZYX0JPT0wgRmllbGQ6OmN1cnJlbnRWYWx1ZUluZGljZXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENGWF9EV29yZEFycmF5IGFycmF5OworCisgICAgaWYgKHZwLkdldFR5cGUoKSA9PSBWVF9udW1iZXIpIHsKKyAgICAgIGludCBpU2VsZWN0aW5nID0gMDsKKyAgICAgIHZwID4+IGlTZWxlY3Rpbmc7CisgICAgICBhcnJheS5BZGQoaVNlbGVjdGluZyk7CisgICAgfSBlbHNlIGlmICh2cC5Jc0FycmF5T2JqZWN0KCkpIHsKKyAgICAgIENKU19BcnJheSBTZWxBcnJheShtX2lzb2xhdGUpOworICAgICAgQ0pTX1ZhbHVlIFNlbFZhbHVlKG1faXNvbGF0ZSk7CisgICAgICBpbnQgaVNlbGVjdGluZzsKKyAgICAgIHZwID4+IFNlbEFycmF5OworICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gU2VsQXJyYXkuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIFNlbEFycmF5LkdldEVsZW1lbnQoaSwgU2VsVmFsdWUpOworICAgICAgICBpU2VsZWN0aW5nID0gU2VsVmFsdWUuVG9JbnQoKTsKKyAgICAgICAgYXJyYXkuQWRkKGlTZWxlY3RpbmcpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfV29yZEFycmF5KEZQX0NVUlJFTlRWQUxVRUlORElDRVMsIGFycmF5KTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldEN1cnJlbnRWYWx1ZUluZGljZXMobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCwgYXJyYXkpOworICAgIH0KKyAgfSBlbHNlIHsKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgIGlmICghcEZvcm1GaWVsZCkgcmV0dXJuIEZBTFNFOwotCi0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLSAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotICAgIENGWF9QdHJBcnJheSB3aWRnZXRBcnJheTsKLSAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXRzKHBGb3JtRmllbGQsIHdpZGdldEFycmF5KTsKLQotICAgIGlmICh3aWRnZXRBcnJheS5HZXRTaXplKCkgPiAwKQotICAgIHsKLSAgICAgICAgQ0pTX0FycmF5IFBhZ2VBcnJheShtX2lzb2xhdGUpOwotCi0gICAgICAgIGZvciAoaW50IGk9MCxzej13aWRnZXRBcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXdpZGdldEFycmF5LkdldEF0KGkpOwotICAgICAgICAgICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBXaWRnZXQtPkdldFBhZ2VWaWV3KCk7Ci0gICAgICAgICAgICBpZighcFBhZ2VWaWV3KQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICAgICAgUGFnZUFycmF5LlNldEVsZW1lbnQoaSwgQ0pTX1ZhbHVlKG1faXNvbGF0ZSwoaW50MzJfdClwUGFnZVZpZXctPkdldFBhZ2VJbmRleCgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2cCA8PCBQYWdlQXJyYXk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZwIDw8IChpbnQzMl90KSAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBGaWVsZDo6cGFzc3dvcmQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgYm9vbCBiVlA7Ci0gICAgICAgIHZwID4+IGJWUDsKLQotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X0Jvb2woRlBfUEFTU1dPUkQsIGJWUCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZDo6U2V0UGFzc3dvcmQobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19QQVNTV09SRCkKLSAgICAgICAgICAgIHZwIDw8IHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwIDw8IGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRQYXNzd29yZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6OnByaW50KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0gICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgYm9vbCBiVlA7Ci0gICAgICAgIHZwID4+IGJWUDsKLQotICAgICAgICBmb3IgKGludCBpPTAsaXN6PUZpZWxkQXJyYXkuR2V0U2l6ZSgpOyBpPGlzejsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICAgICAgaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MCxqc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGo8anN6OyBqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJWUCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEFOTk9URkxBR19QUklOVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzICY9IH5BTk5PVEZMQUdfUFJJTlQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkd0ZsYWdzICE9IHBXaWRnZXQtPkdldEZsYWdzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYlNldCkKLSAgICAgICAgICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobV9uRm9ybUNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICBpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChtX25Gb3JtQ29udHJvbEluZGV4KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiVlApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyB8PSBBTk5PVEZMQUdfUFJJTlQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyAmPSB+QU5OT1RGTEFHX1BSSU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHdGbGFncyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpLCBUUlVFLCBGQUxTRSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKSk7Ci0gICAgICAgIGlmICghcFdpZGdldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGlmIChwV2lkZ2V0LT5HZXRGbGFncygpICYgQU5OT1RGTEFHX1BSSU5UKQotICAgICAgICAgICAgdnAgPDwgdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdnAgPDwgZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRmllbGQ6OnJhZGlvc0luVW5pc29uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGJvb2wgYlZQOwotICAgICAgICB2cCA+PiBiVlA7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkFESU9TSU5VTklTT04pCi0gICAgICAgICAgICB2cCA8PCB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cCA8PCBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBGaWVsZDo6cmVhZG9ubHkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgYm9vbCBiVlA7Ci0gICAgICAgIHZwID4+IGJWUDsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkVBRE9OTFkpCi0gICAgICAgICAgICB2cCA8PCB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cCA8PCBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBGaWVsZDo6cmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENKU19BcnJheSByY0FycmF5KG1faXNvbGF0ZSk7Ci0gICAgICAgIHZwID4+IHJjQXJyYXk7Ci0gICAgICAgIENKU19WYWx1ZSBVcHBlcl9MZWZ0eChtX2lzb2xhdGUpLCBVcHBlcl9MZWZ0eShtX2lzb2xhdGUpLCBMb3dlcl9SaWdodHgobV9pc29sYXRlKSwgTG93ZXJfUmlnaHR5KG1faXNvbGF0ZSk7Ci0gICAgICAgIHJjQXJyYXkuR2V0RWxlbWVudCgwLCBVcHBlcl9MZWZ0eCk7Ci0gICAgICAgIHJjQXJyYXkuR2V0RWxlbWVudCgxLCBVcHBlcl9MZWZ0eSk7Ci0gICAgICAgIHJjQXJyYXkuR2V0RWxlbWVudCgyLCBMb3dlcl9SaWdodHgpOwotICAgICAgICByY0FycmF5LkdldEVsZW1lbnQoMywgTG93ZXJfUmlnaHR5KTsKLQotICAgICAgICBGWF9GTE9BVCBwQXJyYXlbNF0gPSB7MC4wZiwwLjBmLDAuMGYsMC4wZn07Ci0gICAgICAgIHBBcnJheVswXSA9IChGWF9GTE9BVClVcHBlcl9MZWZ0eC5Ub0ludCgpOwotICAgICAgICBwQXJyYXlbMV0gPSAoRlhfRkxPQVQpTG93ZXJfUmlnaHR5LlRvSW50KCk7Ci0gICAgICAgIHBBcnJheVsyXSA9IChGWF9GTE9BVClMb3dlcl9SaWdodHguVG9JbnQoKTsKLSAgICAgICAgcEFycmF5WzNdID0gKEZYX0ZMT0FUKVVwcGVyX0xlZnR5LlRvSW50KCk7Ci0KLSAgICAgICAgQ1BERl9SZWN0IGNyUmVjdChwQXJyYXkpOwotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfUmVjdChGUF9SRUNULCBjclJlY3QpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldFJlY3QobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBjclJlY3QpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLSAgICAgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLSAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOwotICAgICAgICBpZiAoIXBXaWRnZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDRlhfRmxvYXRSZWN0IGNyUmVjdCA9IHBXaWRnZXQtPkdldFJlY3QoKTsKLSAgICAgICAgQ0pTX1ZhbHVlIFVwcGVyX0xlZnR4KG1faXNvbGF0ZSksVXBwZXJfTGVmdHkobV9pc29sYXRlKSxMb3dlcl9SaWdodHgobV9pc29sYXRlKSxMb3dlcl9SaWdodHkobV9pc29sYXRlKTsKLSAgICAgICAgVXBwZXJfTGVmdHggPSAoaW50MzJfdCljclJlY3QubGVmdDsKLSAgICAgICAgVXBwZXJfTGVmdHkgPSAoaW50MzJfdCljclJlY3QudG9wOwotICAgICAgICBMb3dlcl9SaWdodHggPSAoaW50MzJfdCljclJlY3QucmlnaHQ7Ci0gICAgICAgIExvd2VyX1JpZ2h0eSA9IChpbnQzMl90KWNyUmVjdC5ib3R0b207Ci0KLSAgICAgICAgQ0pTX0FycmF5IHJjQXJyYXkobV9pc29sYXRlKTsKLSAgICAgICAgcmNBcnJheS5TZXRFbGVtZW50KDAsVXBwZXJfTGVmdHgpOwotICAgICAgICByY0FycmF5LlNldEVsZW1lbnQoMSxVcHBlcl9MZWZ0eSk7Ci0gICAgICAgIHJjQXJyYXkuU2V0RWxlbWVudCgyLExvd2VyX1JpZ2h0eCk7Ci0gICAgICAgIHJjQXJyYXkuU2V0RWxlbWVudCgzLExvd2VyX1JpZ2h0eSk7Ci0KLSAgICAgICAgdnAgIDw8ICByY0FycmF5OwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRSZWN0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ1BERl9SZWN0JiByZWN0KQotewotICAgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLSAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgIEdldEZvcm1GaWVsZHMocERvY3VtZW50LCBzd0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0KLSAgICBmb3IgKGludCBpPTAsaXN6PUZpZWxkQXJyYXkuR2V0U2l6ZSgpOyBpPGlzejsgaSsrKQotICAgIHsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOwotICAgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wLCBzej1wRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGk8c3o7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOwotICAgICAgICAgICAgICAgIEFTU0VSVChwRm9ybUNvbnRyb2wgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCBjclJlY3QgPSByZWN0OwotCi0gICAgICAgICAgICAgICAgICAgIENQREZfUGFnZSogcFBERlBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVChwUERGUGFnZSAhPSBOVUxMKTsKLQotLy8gICAgICAgICAgICAgICAgICBDUERGX1BhZ2UqIHBQREZQYWdlID0gcFBhZ2UtPkdldFBhZ2UoKTsKLS8vICAgICAgICAgICAgICAgICAgQVNTRVJUKHBQREZQYWdlICE9IE5VTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIGNyUmVjdC5JbnRlcnNlY3QocFBERlBhZ2UtPkdldFBhZ2VCQm94KCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghY3JSZWN0LklzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjT2xkID0gcFdpZGdldC0+R2V0UmVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyUmVjdC5sZWZ0ICE9IHJjT2xkLmxlZnQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjclJlY3QucmlnaHQgIT0gcmNPbGQucmlnaHQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjclJlY3QudG9wICE9IHJjT2xkLnRvcCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmVjdC5ib3R0b20gIT0gcmNPbGQuYm90dG9tKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXQtPlNldFJlY3QoY3JSZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHJldHVybjsKLSAgICAgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IGNyUmVjdCA9IHJlY3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlKiBwUERGUGFnZSA9IHBXaWRnZXQtPkdldFBERlBhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHBQREZQYWdlICE9IE5VTEwpOwotCi0vLyAgICAgICAgICAgICAgICAgIENQREZfUGFnZSogcFBERlBhZ2UgPSBwUGFnZS0+R2V0UGFnZSgpOwotLy8gICAgICAgICAgICAgICAgICBBU1NFUlQocFBERlBhZ2UgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY3JSZWN0LkludGVyc2VjdChwUERGUGFnZS0+R2V0UGFnZUJCb3goKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjclJlY3QuSXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNPbGQgPSBwV2lkZ2V0LT5HZXRSZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JSZWN0LmxlZnQgIT0gcmNPbGQubGVmdCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmVjdC5yaWdodCAhPSByY09sZC5yaWdodCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmVjdC50b3AgIT0gcmNPbGQudG9wIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JSZWN0LmJvdHRvbSAhPSByY09sZC5ib3R0b20pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0UmVjdChjclJlY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCBUUlVFLCBUUlVFLCBUUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotRlhfQk9PTCBGaWVsZDo6cmVxdWlyZWQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLQotICAgICAgICBib29sIGJWUDsKLSAgICAgICAgdnAgPj4gYlZQOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkVRVUlSRUQpCi0gICAgICAgICAgICB2cCA8PCB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cCA8PCBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBGaWVsZDo6cmljaFRleHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgYm9vbCBiVlA7Ci0gICAgICAgIHZwID4+IGJWUDsKLQotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X0Jvb2woRlBfUklDSFRFWFQsIGJWUCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZDo6U2V0UmljaFRleHQobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19SSUNIVEVYVCkKLSAgICAgICAgICAgIHZwIDw8IHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwIDw8IGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRSaWNoVGV4dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6OnJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLSAgICAgICAgOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICA7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRSaWNoVmFsdWUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4KQotewotICAgIC8vTm90IHN1cHBvcnRlZC4KLX0KLQotRlhfQk9PTCBGaWVsZDo6cm90YXRpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaW50IG5WUDsKLSAgICAgICAgdnAgPj4gblZQOwotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfSW50KEZQX1JPVEFUSU9OLCBuVlApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldFJvdGF0aW9uKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgblZQKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgdnAgPDwgKGludDMyX3QpcEZvcm1Db250cm9sLT5HZXRSb3RhdGlvbigpOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRSb3RhdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCi17Ci0gICAgLy9Ob3Qgc3VwcG9ydGVkLgotfQotCi1GWF9CT09MIEZpZWxkOjpzdHJva2VDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSlyZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKLSAgICAgICAgdnAgPj4gY3JBcnJheTsKLQotICAgICAgICBDUFdMX0NvbG9yIGNvbG9yOwotICAgICAgICBjb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihjckFycmF5LCBjb2xvcik7Ci0KLSAgICAgICAgaWYgKG1fYkRlbGF5KQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGREZWxheV9Db2xvcihGUF9TVFJPS0VDT0xPUiwgY29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldFN0cm9rZUNvbG9yKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgY29sb3IpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKLQotICAgICAgICBpbnQgaUNvbG9yVHlwZTsKLSAgICAgICAgcEZvcm1Db250cm9sLT5HZXRCb3JkZXJDb2xvcihpQ29sb3JUeXBlKTsKLQotICAgICAgICBDUFdMX0NvbG9yIGNvbG9yOwotCi0gICAgICAgIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkKLSAgICAgICAgewotICAgICAgICAgICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9UUkFOU1BBUkVOVCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaUNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfR1JBWSkKLSAgICAgICAgewotICAgICAgICAgICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1JHQikKLSAgICAgICAgewotICAgICAgICAgICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigwKSwKLSAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMSksCi0gICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDIpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9DTVlLKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigwKSwKLSAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMSksCi0gICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDIpLAotICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENKU19BcnJheSBjckFycmF5KG1faXNvbGF0ZSk7Ci0gICAgICAgIGNvbG9yOjpDb252ZXJ0UFdMQ29sb3JUb0FycmF5KGNvbG9yLCBjckFycmF5KTsKLSAgICAgICAgdnAgIDw8ICBjckFycmF5OwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRTdHJva2VDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQotewotICAgIC8vTm90IHN1cHBvcnRlZC4KLX0KLQotRlhfQk9PTCBGaWVsZDo6c3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCQ2FwdGlvbjsKLSAgICAgICAgdnAgPj4gY3NCQ2FwdGlvbjsKLQotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X1N0cmluZyhGUF9TVFlMRSwgY3NCQ2FwdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZDo6U2V0U3R5bGUobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBjc0JDYXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUkFESU9CVVRUT04gJiYKLSAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DSEVDS0JPWCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1dDYXB0aW9uID0gcEZvcm1Db250cm9sLT5HZXROb3JtYWxDYXB0aW9uKCk7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNzQkNhcHRpb247Ci0KLSAgICAgICAgc3dpdGNoIChjc1dDYXB0aW9uWzBdKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEwnbCc6Ci0gICAgICAgICAgICAgICAgY3NCQ2FwdGlvbiA9ICJjaXJjbGUiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMJzgnOgotICAgICAgICAgICAgICAgIGNzQkNhcHRpb24gPSAiY3Jvc3MiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMJ3UnOgotICAgICAgICAgICAgICAgIGNzQkNhcHRpb24gPSAiZGlhbW9uZCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEwnbic6Ci0gICAgICAgICAgICAgICAgY3NCQ2FwdGlvbiA9ICJzcXVhcmUiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMJ0gnOgotICAgICAgICAgICAgICAgIGNzQkNhcHRpb24gPSAic3RhciI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiAvL0wnNCcKLSAgICAgICAgICAgICAgICBjc0JDYXB0aW9uID0gImNoZWNrIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB2cCA8PCBjc0JDYXB0aW9uOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKQotewotICAgIC8vTm90IHN1cHBvcnRlZC4KLX0KLQotRlhfQk9PTCBGaWVsZDo6c3VibWl0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRmllbGQ6OnRleHRDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDSlNfQXJyYXkgY3JBcnJheShtX2lzb2xhdGUpOwotICAgICAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSlyZXR1cm4gRkFMU0U7Ci0gICAgICAgIHZwID4+IGNyQXJyYXk7Ci0KLSAgICAgICAgQ1BXTF9Db2xvciBjb2xvcjsKLSAgICAgICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoY3JBcnJheSwgY29sb3IpOwotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfQ29sb3IoRlBfVEVYVENPTE9SLCBjb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZDo6U2V0VGV4dENvbG9yKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgY29sb3IpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKLQotICAgICAgICBpbnQgaUNvbG9yVHlwZTsKLSAgICAgICAgRlhfQVJHQiBjb2xvcjsKLSAgICAgICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBGaWVsZEFwcGVhcmFuY2UgPSBwRm9ybUNvbnRyb2wtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0gICAgICAgIEZpZWxkQXBwZWFyYW5jZS5HZXRDb2xvcihjb2xvciwgaUNvbG9yVHlwZSk7Ci0gICAgICAgIGludDMyX3QgYSxyLGcsYjsKLSAgICAgICAgQXJnYkRlY29kZShjb2xvciwgYSwgciwgZywgYik7Ci0KLSAgICAgICAgQ1BXTF9Db2xvciBjclJldCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgciAvIDI1NS4wZiwKLSAgICAgICAgICAgICAgICBnIC8gMjU1LjBmLAotICAgICAgICAgICAgICAgIGIgLyAyNTUuMGYpOwotCi0gICAgICAgIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkKLSAgICAgICAgICAgIGNyUmV0ID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfVFJBTlNQQVJFTlQpOwotCi0gICAgICAgIENKU19BcnJheSBjckFycmF5KG1faXNvbGF0ZSk7Ci0gICAgICAgIGNvbG9yOjpDb252ZXJ0UFdMQ29sb3JUb0FycmF5KGNyUmV0LCBjckFycmF5KTsKLSAgICAgICAgdnAgIDw8ICBjckFycmF5OwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIEZpZWxkOjpTZXRUZXh0Q29sb3IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6OnRleHRGb250KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWU7Ci0gICAgICAgIHZwID4+IGNzRm9udE5hbWU7Ci0gICAgICAgIGlmIChjc0ZvbnROYW1lLklzRW1wdHkoKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfU3RyaW5nKEZQX1RFWFRGT05ULCBjc0ZvbnROYW1lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXRUZXh0Rm9udChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGNzRm9udE5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgICAgIGlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKLQotICAgICAgICBpbnQgbkZpZWxkVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOwotCi0gICAgICAgIGlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OIHx8Ci0gICAgICAgICAgICBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fAotICAgICAgICAgICAgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfTElTVEJPWCB8fAotICAgICAgICAgICAgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUERGX0ZvbnQgKiBwRm9udCA9IHBGb3JtQ29udHJvbC0+R2V0RGVmYXVsdENvbnRyb2xGb250KCk7Ci0gICAgICAgICAgICBpZiAoIXBGb250KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgIHZwIDw8IHBGb250LT5HZXRCYXNlRm9udCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0VGV4dEZvbnQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKQotewotICAgIC8vTm90IHN1cHBvcnRlZC4KLX0KLQotRlhfQk9PTCBGaWVsZDo6dGV4dFNpemUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaW50IG5WUDsKLSAgICAgICAgdnAgPj4gblZQOwotCi0gICAgICAgIGlmIChtX2JEZWxheSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkRGVsYXlfSW50KEZQX1RFWFRTSVpFLCBuVlApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldFRleHRTaXplKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgblZQKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgICAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBGaWVsZEFwcGVhcmFuY2UgPSBwRm9ybUNvbnRyb2wtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZVRhZzsKLSAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplOwotICAgICAgICBGaWVsZEFwcGVhcmFuY2UuR2V0Rm9udChjc0ZvbnROYW1lVGFnLGZGb250U2l6ZSk7Ci0KLSAgICAgICAgdnAgPDwgKGludClmRm9udFNpemU7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldFRleHRTaXplKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKLXsKLSAgICAvL05vdCBzdXBwb3J0ZWQuCi19Ci0KLUZYX0JPT0wgRmllbGQ6OnR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotICAgIGlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBGQUxTRTsKLQotICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAogICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAotICAgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpCi0gICAgewotICAgICAgICBjYXNlIEZJRUxEVFlQRV9VTktOT1dOOgotICAgICAgICAgICAgdnAgPDwgTCJ1bmtub3duIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgotICAgICAgICAgICAgdnAgPDwgTCJidXR0b24iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotICAgICAgICAgICAgdnAgPDwgTCJjaGVja2JveCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046Ci0gICAgICAgICAgICB2cCA8PCBMInJhZGlvYnV0dG9uIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKLSAgICAgICAgICAgIHZwIDw8IEwiY29tYm9ib3giOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6Ci0gICAgICAgICAgICB2cCA8PCBMImxpc3Rib3giOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKLSAgICAgICAgICAgIHZwIDw8IEwidGV4dCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGSUVMRFRZUEVfU0lHTkFUVVJFOgotICAgICAgICAgICAgdnAgPDwgTCJzaWduYXR1cmUiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgdnAgPDwgTCJ1bmtub3duIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YICYmCisgICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID09IDEpCisgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KDApOworICAgIGVsc2UgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkgeworICAgICAgQ0pTX0FycmF5IFNlbEFycmF5KG1faXNvbGF0ZSk7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgU2VsQXJyYXkuU2V0RWxlbWVudCgKKyAgICAgICAgICAgIGksIENKU19WYWx1ZShtX2lzb2xhdGUsIHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaSkpKTsKKyAgICAgIH0KKyAgICAgIHZwIDw8IFNlbEFycmF5OworICAgIH0gZWxzZQorICAgICAgdnAgPDwgLTE7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6dXNlck5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK3ZvaWQgRmllbGQ6OlNldEN1cnJlbnRWYWx1ZUluZGljZXMoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRFdvcmRBcnJheSYgYXJyYXkpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIAotICAgIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB7Ci0gICAgICAgIGlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICBHZXRGb3JtRmllbGRzKHBEb2N1bWVudCwgc3dGaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwogCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHN3TmFtZTsKLSAgICAgICAgdnAgPj4gc3dOYW1lOworICBmb3IgKGludCBpID0gMCwgaXN6ID0gRmllbGRBcnJheS5HZXRTaXplKCk7IGkgPCBpc3o7IGkrKykgeworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdChpKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAotICAgICAgICBpZiAobV9iRGVsYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERlbGF5X1dpZGVTdHJpbmcoRlBfVVNFUk5BTUUsIHN3TmFtZSk7CisgICAgaW50IG5GaWVsZFR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKKyAgICBpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfTElTVEJPWCkgeworICAgICAgRlhfRFdPUkQgZHdGaWVsZEZsYWdzID0gcEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpOworICAgICAgcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oVFJVRSk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IGFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgaWYgKGkgPiAwICYmICEoZHdGaWVsZEZsYWdzICYgKDEgPDwgMjEpKSkgeworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGQ6OlNldFVzZXJOYW1lKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgc3dOYW1lKTsKLSAgICAgICAgfQorCisgICAgICAgIGludCBpU2VsZWN0aW5nID0gKGludDMyX3QpYXJyYXkuR2V0QXQoaSk7CisgICAgICAgIGlmIChpU2VsZWN0aW5nIDwgcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCkgJiYKKyAgICAgICAgICAgICFwRm9ybUZpZWxkLT5Jc0l0ZW1TZWxlY3RlZChpU2VsZWN0aW5nKSkKKyAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlTZWxlY3RpbmcsIFRSVUUpOworICAgICAgfQorICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7CiAgICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgICAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgdnAgPDwgKENGWF9XaWRlU3RyaW5nKXBGb3JtRmllbGQtPkdldEFsdGVybmF0ZU5hbWUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKKyAgfQogfQogCi12b2lkIEZpZWxkOjpTZXRVc2VyTmFtZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpCi17Ci0gICAgLy9Ob3Qgc3VwcG9ydGVkLgorRlhfQk9PTCBGaWVsZDo6ZGVmYXVsdFN0eWxlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgLy8gTVFHIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfTk9UU1VQUE9SVCk7CisgIHJldHVybiBGQUxTRTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIDsKKyAgfSBlbHNlIHsKKyAgICA7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgewotICAgICAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIENKU19XaWRlU3RyaW5nQXJyYXkgc3RyQXJyYXk7Ci0KLSAgICAgICAgaWYgKHZwLklzQXJyYXlPYmplY3QoKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ0pTX0FycmF5IFZhbHVlQXJyYXkobV9pc29sYXRlKTsKLSAgICAgICAgICAgIHZwLkNvbnZlcnRUb0FycmF5KFZhbHVlQXJyYXkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsc3ogPSBWYWx1ZUFycmF5LkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSlNfVmFsdWUgRWxlbWVudFZhbHVlKG1faXNvbGF0ZSk7Ci0gICAgICAgICAgICAgICAgVmFsdWVBcnJheS5HZXRFbGVtZW50KGksIEVsZW1lbnRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgc3RyQXJyYXkuQWRkKEVsZW1lbnRWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlOwotICAgICAgICAgICAgdnAgPj4gc3dWYWx1ZTsKLQotICAgICAgICAgICAgc3RyQXJyYXkuQWRkKHN3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fYkRlbGF5KQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGREZWxheV9XaWRlU3RyaW5nQXJyYXkoRlBfVkFMVUUsIHN0ckFycmF5KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkOjpTZXRWYWx1ZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIHN0ckFycmF5KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICAgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICAgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0KLQotICAgICAgICBzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgotICAgICAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZSA9IHBGb3JtRmllbGQtPkdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBkb3VibGUgZFJldDsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJEb3Q7Ci0gICAgICAgICAgICAgICAgaWYgKENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoc3dWYWx1ZS5jX3N0cigpLCBkUmV0LCBiRG90KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiRG90KQotICAgICAgICAgICAgICAgICAgICAgICAgdnAgPDwgZFJldDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdnAgPDwgZFJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB2cCA8PCBzd1ZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENKU19BcnJheSBWYWx1ZUFycmF5KG1faXNvbGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSBFbGVtZW50VmFsdWUobV9pc29sYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGlJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7IGkgPCBzejsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpSW5kZXggPSBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudFZhbHVlID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uVmFsdWUoaUluZGV4KS5jX3N0cigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZYU1lTX3djc2xlbihFbGVtZW50VmFsdWUuVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50VmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChpSW5kZXgpLmNfc3RyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFycmF5LlNldEVsZW1lbnQoaSwgRWxlbWVudFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2cCA8PCBWYWx1ZUFycmF5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFJldDsKLSAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRG90OwotICAgICAgICAgICAgICAgICAgICBpZiAoQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihzd1ZhbHVlLmNfc3RyKCksIGRSZXQsIGJEb3QpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkRvdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cCA8PCBkUmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwIDw8IGRSZXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdnAgPDwgc3dWYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpLT5Jc0NoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZSA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSktPkdldEV4cG9ydFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFJldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRvdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDSlNfUHVibGljTWV0aG9kczo6Q29udmVydFN0cmluZ1RvTnVtYmVyKHN3VmFsdWUuY19zdHIoKSwgZFJldCwgYkRvdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJEb3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwIDw8IGRSZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cCA8PCBkUmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwIDw8IHN3VmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWJGaW5kKQotICAgICAgICAgICAgICAgICAgICB2cCA8PCBMIk9mZiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHZwIDw8IHBGb3JtRmllbGQtPkdldFZhbHVlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwordm9pZCBGaWVsZDo6U2V0RGVmYXVsdFN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KIAotdm9pZCBGaWVsZDo6U2V0VmFsdWUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0pTX1dpZGVTdHJpbmdBcnJheSYgc3RyQXJyYXkpCi17Ci0gICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OmRlZmF1bHRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAotICAgIGlmIChzdHJBcnJheS5HZXRTaXplKCkgPCAxKSByZXR1cm47CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCisgICAgQ0ZYX1dpZGVTdHJpbmcgV2lkZVN0cjsKKyAgICB2cCA+PiBXaWRlU3RyOworCisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9XaWRlU3RyaW5nKEZQX0RFRkFVTFRWQUxVRSwgV2lkZVN0cik7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXREZWZhdWx0VmFsdWUobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyKTsKKyAgICB9CisgIH0gZWxzZSB7CiAgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgR2V0Rm9ybUZpZWxkcyhwRG9jdW1lbnQsIHN3RmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIGZvciAoaW50IGk9MCxpc3o9RmllbGRBcnJheS5HZXRTaXplKCk7IGk8aXN6OyBpKyspCi0gICAgewotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoaSk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0RnVsbE5hbWUoKS5Db21wYXJlKHN3RmllbGROYW1lKSAhPSAwKQotICAgICAgICAgICAgY29udGludWU7CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OIHx8CisgICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9TSUdOQVRVUkUpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICAgICAgc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6Ci0gICAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgotICAgICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldFZhbHVlKCkgIT0gc3RyQXJyYXkuR2V0QXQoMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgV2lkZVN0cmluZyA9IHN0ckFycmF5LkdldEF0KDApOwotICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKHN0ckFycmF5LkdldEF0KDApLCBUUlVFKTsKLSAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6IC8vbWFudGlzOiAwMDA0NDkzCi0gICAgICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpICE9IHN0ckFycmF5LkdldEF0KDApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXkuR2V0QXQoMCksIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MCxzej1zdHJBcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpSW5kZXggPSBwRm9ybUZpZWxkLT5GaW5kT3B0aW9uKHN0ckFycmF5LkdldEF0KGkpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBGb3JtRmllbGQtPklzSXRlbVNlbGVjdGVkKGlJbmRleCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJNb2RpZmllZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChiTW9kaWZpZWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbihUUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wLHN6PXN0ckFycmF5LkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUluZGV4ID0gcEZvcm1GaWVsZC0+RmluZE9wdGlvbihzdHJBcnJheS5HZXRBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KKyAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXREZWZhdWx0VmFsdWUoKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6dmFsdWVBc1N0cmluZyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwordm9pZCBGaWVsZDo6U2V0RGVmYXVsdFZhbHVlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykgeworICAvLyBOb3Qgc3VwcG9ydGVkLgorfQogCi0gICAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBGaWVsZDo6ZG9Ob3RTY3JvbGwoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgYm9vbCBiVlA7CisgICAgdnAgPj4gYlZQOworCisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9Cb29sKEZQX0RPTk9UU0NST0xMLCBiVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0RG9Ob3RTY3JvbGwobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOworICAgIH0KKyAgfSBlbHNlIHsKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRE9OT1RTQ1JPTEwpCisgICAgICB2cCA8PCB0cnVlOworICAgIGVsc2UKKyAgICAgIHZwIDw8IGZhbHNlOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgRmllbGQ6OlNldERvTm90U2Nyb2xsKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCit9CisKK0ZYX0JPT0wgRmllbGQ6OmRvTm90U3BlbGxDaGVjayhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKKyAgfSBlbHNlIHsKKyAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEICYmCisgICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRE9OT1RTUEVMTENIRUNLKQorICAgICAgdnAgPDwgdHJ1ZTsKKyAgICBlbHNlCisgICAgICB2cCA8PCBmYWxzZTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkIEZpZWxkOjpTZXREZWxheShGWF9CT09MIGJEZWxheSkgeworICBtX2JEZWxheSA9IGJEZWxheTsKKworICBpZiAoIW1fYkRlbGF5KSB7CisgICAgaWYgKG1fcEpTRG9jKQorICAgICAgbV9wSlNEb2MtPkRvRmllbGREZWxheShtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCk7CisgIH0KK30KKworRlhfQk9PTCBGaWVsZDo6ZGVsYXkoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CisKKyAgICBTZXREZWxheShiVlApOworICB9IGVsc2UgeworICAgIHZwIDw8IG1fYkRlbGF5OworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIEZpZWxkOjpkaXNwbGF5KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpbnQgblZQOworICAgIHZwID4+IG5WUDsKKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfSW50KEZQX0RJU1BMQVksIG5WUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXREaXNwbGF5KG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgblZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9CisgICAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworCisgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPQorICAgICAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOworICAgIGlmICghcFdpZGdldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIEZYX0RXT1JEIGR3RmxhZyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CisKKyAgICBpZiAoQU5OT1RGTEFHX0lOVklTSUJMRSAmIGR3RmxhZyB8fCBBTk5PVEZMQUdfSElEREVOICYgZHdGbGFnKSB7CisgICAgICB2cCA8PCAoaW50MzJfdCkxOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoQU5OT1RGTEFHX1BSSU5UICYgZHdGbGFnKSB7CisgICAgICAgIGlmIChBTk5PVEZMQUdfTk9WSUVXICYgZHdGbGFnKSB7CisgICAgICAgICAgdnAgPDwgKGludDMyX3QpMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2cCA8PCAoaW50MzJfdCkwOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2cCA8PCAoaW50MzJfdCkyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkIEZpZWxkOjpTZXREaXNwbGF5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhwRG9jdW1lbnQsIHN3RmllbGROYW1lLCBGaWVsZEFycmF5KTsKKworICBmb3IgKGludCBpID0gMCwgaXN6ID0gRmllbGRBcnJheS5HZXRTaXplKCk7IGkgPCBpc3o7IGkrKykgeworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdChpKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CisgICAgICBmb3IgKGludCBqID0gMCwganN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqIDwganN6OyBqKyspIHsKKyAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKTsKKyAgICAgICAgQVNTRVJUKHBGb3JtQ29udHJvbCAhPSBOVUxMKTsKKworICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkgeworICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CisgICAgICAgICAgc3dpdGNoIChudW1iZXIpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19ISURERU4pOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKKyAgICAgICAgICAgICAgZHdGbGFnIHw9IEFOTk9URkxBR19QUklOVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKKyAgICAgICAgICAgICAgZHdGbGFnIHw9IChBTk5PVEZMQUdfSElEREVOIHwgQU5OT1RGTEFHX1BSSU5UKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfUFJJTlQpOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSElEREVOKTsKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX05PVklFVyk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICBkd0ZsYWcgfD0gQU5OT1RGTEFHX05PVklFVzsKKyAgICAgICAgICAgICAgZHdGbGFnIHw9IEFOTk9URkxBR19QUklOVDsKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0hJRERFTik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChkd0ZsYWcgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkgeworICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFnKTsKKyAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoYlNldCkKKyAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPQorICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKSB7CisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKKyAgICAgICAgICBzd2l0Y2ggKG51bWJlcikgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0hJRERFTik7CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOworICAgICAgICAgICAgICBkd0ZsYWcgfD0gQU5OT1RGTEFHX1BSSU5UOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOworICAgICAgICAgICAgICBkd0ZsYWcgfD0gKEFOTk9URkxBR19ISURERU4gfCBBTk5PVEZMQUdfUFJJTlQpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19QUklOVCk7CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19ISURERU4pOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgIGR3RmxhZyB8PSBBTk5PVEZMQUdfTk9WSUVXOworICAgICAgICAgICAgICBkd0ZsYWcgfD0gQU5OT1RGTEFHX1BSSU5UOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSElEREVOKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChkd0ZsYWcgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkgeworICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFnKTsKKyAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK0ZYX0JPT0wgRmllbGQ6OmRvYyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghdnAuSXNHZXR0aW5nKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdnAgPDwgbV9wSlNEb2MtPkdldENKU0RvYygpOworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBGaWVsZDo6ZWRpdGFibGUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKKyAgfSBlbHNlIHsKKyAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1gpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0VESVQpCisgICAgICB2cCA8PCB0cnVlOworICAgIGVsc2UKKyAgICAgIHZwIDw8IGZhbHNlOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRmllbGQ6OmV4cG9ydFZhbHVlcyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ0hFQ0tCT1ggJiYKKyAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBDSlNfQXJyYXkgRXhwb3J0VmFsdXNBcnJheShtX2lzb2xhdGUpOworICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7IGkrKykgeworICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOworICAgICAgICBFeHBvcnRWYWx1c0FycmF5LlNldEVsZW1lbnQoCisgICAgICAgICAgICBpLCBDSlNfVmFsdWUobV9pc29sYXRlLCBwRm9ybUNvbnRyb2wtPkdldEV4cG9ydFZhbHVlKCkuY19zdHIoKSkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9uRm9ybUNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0KKyAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpOworICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgRXhwb3J0VmFsdXNBcnJheS5TZXRFbGVtZW50KAorICAgICAgICAgIDAsIENKU19WYWx1ZShtX2lzb2xhdGUsIHBGb3JtQ29udHJvbC0+R2V0RXhwb3J0VmFsdWUoKS5jX3N0cigpKSk7CisgICAgfQorICAgIHZwIDw8IEV4cG9ydFZhbHVzQXJyYXk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRmllbGQ6OmZpbGVTZWxlY3QoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKKyAgfSBlbHNlIHsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0ZJTEVTRUxFQ1QpCisgICAgICB2cCA8PCB0cnVlOworICAgIGVsc2UKKyAgICAgIHZwIDw8IGZhbHNlOworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIEZpZWxkOjpmaWxsQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmICghdnAuSXNBcnJheU9iamVjdCgpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgdnAgPj4gY3JBcnJheTsKKworICAgIENQV0xfQ29sb3IgY29sb3I7CisgICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoY3JBcnJheSwgY29sb3IpOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfQ29sb3IoRlBfRklMTENPTE9SLCBjb2xvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRGaWxsQ29sb3IobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBjb2xvcik7CisgICAgfQorICB9IGVsc2UgeworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaW50IGlDb2xvclR5cGU7CisgICAgcEZvcm1Db250cm9sLT5HZXRCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSk7CisKKyAgICBDUFdMX0NvbG9yIGNvbG9yOworICAgIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkgeworICAgICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9UUkFOU1BBUkVOVCk7CisgICAgfSBlbHNlIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9HUkFZKSB7CisgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigwKSk7CisgICAgfSBlbHNlIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9SR0IpIHsKKyAgICAgIGNvbG9yID0KKyAgICAgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMCksCisgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDEpLAorICAgICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigyKSk7CisgICAgfSBlbHNlIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9DTVlLKSB7CisgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssCisgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigzKSk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBjb2xvcjo6Q29udmVydFBXTENvbG9yVG9BcnJheShjb2xvciwgY3JBcnJheSk7CisgICAgdnAgPDwgY3JBcnJheTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkIEZpZWxkOjpTZXRGaWxsQ29sb3IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgeworICAvLyBOb3Qgc3VwcG9ydGVkLgorfQorCitGWF9CT09MIEZpZWxkOjpoaWRkZW4oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CisKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0Jvb2woRlBfSElEREVOLCBiVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0SGlkZGVuKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgYlZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9CisgICAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICAgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworCisgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPQorICAgICAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOworICAgIGlmICghcFdpZGdldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwV2lkZ2V0LT5HZXRGbGFncygpOworCisgICAgaWYgKEFOTk9URkxBR19JTlZJU0lCTEUgJiBkd0ZsYWdzIHx8IEFOTk9URkxBR19ISURERU4gJiBkd0ZsYWdzKSB7CisgICAgICB2cCA8PCB0cnVlOworICAgIH0gZWxzZQorICAgICAgdnAgPDwgZmFsc2U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBGaWVsZDo6U2V0SGlkZGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKSB7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIEFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworCisgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICBHZXRGb3JtRmllbGRzKHBEb2N1bWVudCwgc3dGaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworCisgIGZvciAoaW50IGkgPSAwLCBpc3ogPSBGaWVsZEFycmF5LkdldFNpemUoKTsgaSA8IGlzejsgaSsrKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOworICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgICAgaWYgKG5Db250cm9sSW5kZXggPCAwKSB7CisgICAgICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKKyAgICAgIGZvciAoaW50IGogPSAwLCBqc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGogPCBqc3o7IGorKykgeworICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPQorICAgICAgICAgICAgICAgIHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUZpZWxkLT5HZXRDb250cm9sKGopKSkgeworICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwV2lkZ2V0LT5HZXRGbGFncygpOworCisgICAgICAgICAgaWYgKGIpIHsKKyAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKKyAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKKyAgICAgICAgICAgIGR3RmxhZ3MgfD0gKEFOTk9URkxBR19ISURERU4gfCBBTk5PVEZMQUdfUFJJTlQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkd0ZsYWdzICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7CisgICAgICAgICAgICBkd0ZsYWdzICY9ICh+QU5OT1RGTEFHX0hJRERFTik7CisgICAgICAgICAgICBkd0ZsYWdzICY9ICh+QU5OT1RGTEFHX05PVklFVyk7CisgICAgICAgICAgICBkd0ZsYWdzIHw9IEFOTk9URkxBR19QUklOVDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZHdGbGFncyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKSB7CisgICAgICAgICAgICBwV2lkZ2V0LT5TZXRGbGFncyhkd0ZsYWdzKTsKKyAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoYlNldCkKKyAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPQorICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKSB7CisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CisKKyAgICAgICAgICBpZiAoYikgeworICAgICAgICAgICAgZHdGbGFncyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOworICAgICAgICAgICAgZHdGbGFncyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOworICAgICAgICAgICAgZHdGbGFncyB8PSAoQU5OT1RGTEFHX0hJRERFTiB8IEFOTk9URkxBR19QUklOVCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKKyAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfSElEREVOKTsKKyAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKKyAgICAgICAgICAgIGR3RmxhZ3MgfD0gQU5OT1RGTEFHX1BSSU5UOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChkd0ZsYWdzICE9IHBXaWRnZXQtPkdldEZsYWdzKCkpIHsKKyAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOworICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworRlhfQk9PTCBGaWVsZDo6aGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyTW9kZTsKKyAgICB2cCA+PiBzdHJNb2RlOworCisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9TdHJpbmcoRlBfSElHSExJR0hULCBzdHJNb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldEhpZ2hsaWdodChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ck1vZGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaW50IGVITSA9IHBGb3JtQ29udHJvbC0+R2V0SGlnaGxpZ2h0aW5nTW9kZSgpOworICAgIHN3aXRjaCAoZUhNKSB7CisgICAgICBjYXNlIENQREZfRm9ybUNvbnRyb2w6Ok5vbmU6CisgICAgICAgIHZwIDw8IEwibm9uZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDUERGX0Zvcm1Db250cm9sOjpQdXNoOgorICAgICAgICB2cCA8PCBMInB1c2giOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ1BERl9Gb3JtQ29udHJvbDo6SW52ZXJ0OgorICAgICAgICB2cCA8PCBMImludmVydCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDUERGX0Zvcm1Db250cm9sOjpPdXRsaW5lOgorICAgICAgICB2cCA8PCBMIm91dGxpbmUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ1BERl9Gb3JtQ29udHJvbDo6VG9nZ2xlOgorICAgICAgICB2cCA8PCBMInRvZ2dsZSI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkIEZpZWxkOjpTZXRIaWdobGlnaHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCit9CisKK0ZYX0JPT0wgRmllbGQ6OmxpbmVXaWR0aChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGludCBpV2lkdGg7CisgICAgdnAgPj4gaVdpZHRoOworCisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9JbnQoRlBfTElORVdJRFRILCBpV2lkdGgpOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0TGluZVdpZHRoKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaVdpZHRoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgICAgKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgICBpZiAoIXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtRmllbGQtPkdldENvbnRyb2woMCkpOworICAgIGlmICghcFdpZGdldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHZwIDw8IChpbnQzMl90KXBXaWRnZXQtPkdldEJvcmRlcldpZHRoKCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBGaWVsZDo6U2V0TGluZVdpZHRoKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhwRG9jdW1lbnQsIHN3RmllbGROYW1lLCBGaWVsZEFycmF5KTsKKworICBmb3IgKGludCBpID0gMCwgaXN6ID0gRmllbGRBcnJheS5HZXRTaXplKCk7IGkgPCBpc3o7IGkrKykgeworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdChpKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CisgICAgICBmb3IgKGludCBqID0gMCwganN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqIDwganN6OyBqKyspIHsKKyAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKTsKKyAgICAgICAgQVNTRVJUKHBGb3JtQ29udHJvbCAhPSBOVUxMKTsKKworICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkgeworICAgICAgICAgIGlmIChudW1iZXIgIT0gcFdpZGdldC0+R2V0Qm9yZGVyV2lkdGgoKSkgeworICAgICAgICAgICAgcFdpZGdldC0+U2V0Qm9yZGVyV2lkdGgobnVtYmVyKTsKKyAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGJTZXQpCisgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPQorICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKSB7CisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgaWYgKG51bWJlciAhPSBwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpKSB7CisgICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJXaWR0aChudW1iZXIpOworICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitGWF9CT09MIEZpZWxkOjptdWx0aWxpbmUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CisKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0Jvb2woRlBfTVVMVElMSU5FLCBiVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0TXVsdGlsaW5lKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgYlZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElMSU5FKQorICAgICAgdnAgPDwgdHJ1ZTsKKyAgICBlbHNlCisgICAgICB2cCA8PCBmYWxzZTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkIEZpZWxkOjpTZXRNdWx0aWxpbmUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KK30KKworRlhfQk9PTCBGaWVsZDo6bXVsdGlwbGVTZWxlY3Rpb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgYm9vbCBiVlA7CisgICAgdnAgPj4gYlZQOworCisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9Cb29sKEZQX01VTFRJUExFU0VMRUNUSU9OLCBiVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0TXVsdGlwbGVTZWxlY3Rpb24obV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWUCk7CisgICAgfQorICB9IGVsc2UgeworICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOworICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkKKyAgICAgIHZwIDw8IHRydWU7CisgICAgZWxzZQorICAgICAgdnAgPDwgZmFsc2U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBGaWVsZDo6U2V0TXVsdGlwbGVTZWxlY3Rpb24oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KK30KKworRlhfQk9PTCBGaWVsZDo6bmFtZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdnAgPDwgbV9GaWVsZE5hbWU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRmllbGQ6Om51bUl0ZW1zKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCAmJgorICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghdnAuSXNHZXR0aW5nKCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHZwIDw8IChpbnQzMl90KXBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOworCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIEZpZWxkOjpwYWdlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIGlmICghcEZvcm1GaWVsZCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKKworICBDRlhfUHRyQXJyYXkgd2lkZ2V0QXJyYXk7CisgIHBJbnRlckZvcm0tPkdldFdpZGdldHMocEZvcm1GaWVsZCwgd2lkZ2V0QXJyYXkpOworCisgIGlmICh3aWRnZXRBcnJheS5HZXRTaXplKCkgPiAwKSB7CisgICAgQ0pTX0FycmF5IFBhZ2VBcnJheShtX2lzb2xhdGUpOworCisgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gd2lkZ2V0QXJyYXkuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXdpZGdldEFycmF5LkdldEF0KGkpOworICAgICAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CisKKyAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBXaWRnZXQtPkdldFBhZ2VWaWV3KCk7CisgICAgICBpZiAoIXBQYWdlVmlldykKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBQYWdlQXJyYXkuU2V0RWxlbWVudCgKKyAgICAgICAgICBpLCBDSlNfVmFsdWUobV9pc29sYXRlLCAoaW50MzJfdClwUGFnZVZpZXctPkdldFBhZ2VJbmRleCgpKSk7CisgICAgfQorCisgICAgdnAgPDwgUGFnZUFycmF5OworICB9IGVsc2UgeworICAgIHZwIDw8IChpbnQzMl90KS0xOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRmllbGQ6OnBhc3N3b3JkKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfQm9vbChGUF9QQVNTV09SRCwgYlZQKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldFBhc3N3b3JkKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgYlZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUEFTU1dPUkQpCisgICAgICB2cCA8PCB0cnVlOworICAgIGVsc2UKKyAgICAgIHZwIDw8IGZhbHNlOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgRmllbGQ6OlNldFBhc3N3b3JkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCit9CisKK0ZYX0JPT0wgRmllbGQ6OnByaW50KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9CisgICAgICAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CisKKyAgICBmb3IgKGludCBpID0gMCwgaXN6ID0gRmllbGRBcnJheS5HZXRTaXplKCk7IGkgPCBpc3o7IGkrKykgeworICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOworICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDAsIGpzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaiA8IGpzejsgaisrKSB7CisgICAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0KKyAgICAgICAgICAgICAgICAgIHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUZpZWxkLT5HZXRDb250cm9sKGopKSkgeworICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CisgICAgICAgICAgICBpZiAoYlZQKQorICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEFOTk9URkxBR19QUklOVDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZHdGbGFncyAmPSB+QU5OT1RGTEFHX1BSSU5UOworCisgICAgICAgICAgICBpZiAoZHdGbGFncyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKSB7CisgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOworICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYlNldCkKKyAgICAgICAgICBVcGRhdGVGb3JtRmllbGQobV9wRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIEZBTFNFLCBUUlVFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPQorICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCkpIHsKKyAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkgeworICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CisgICAgICAgICAgICBpZiAoYlZQKQorICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEFOTk9URkxBR19QUklOVDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZHdGbGFncyAmPSB+QU5OT1RGTEFHX1BSSU5UOworCisgICAgICAgICAgICBpZiAoZHdGbGFncyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKSB7CisgICAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOworICAgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChtX3BEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChtX25Gb3JtQ29udHJvbEluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9CisgICAgICAgIHBJbnRlckZvcm0tPkdldFdpZGdldChHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKSk7CisgICAgaWYgKCFwV2lkZ2V0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKHBXaWRnZXQtPkdldEZsYWdzKCkgJiBBTk5PVEZMQUdfUFJJTlQpCisgICAgICB2cCA8PCB0cnVlOworICAgIGVsc2UKKyAgICAgIHZwIDw8IGZhbHNlOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRmllbGQ6OnJhZGlvc0luVW5pc29uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKKworICB9IGVsc2UgeworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUkFESU9CVVRUT04pCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1JBRElPU0lOVU5JU09OKQorICAgICAgdnAgPDwgdHJ1ZTsKKyAgICBlbHNlCisgICAgICB2cCA8PCBmYWxzZTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIEZpZWxkOjpyZWFkb25seShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CisKKyAgfSBlbHNlIHsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1JFQURPTkxZKQorICAgICAgdnAgPDwgdHJ1ZTsKKyAgICBlbHNlCisgICAgICB2cCA8PCBmYWxzZTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIEZpZWxkOjpyZWN0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDSlNfQXJyYXkgcmNBcnJheShtX2lzb2xhdGUpOworICAgIHZwID4+IHJjQXJyYXk7CisgICAgQ0pTX1ZhbHVlIFVwcGVyX0xlZnR4KG1faXNvbGF0ZSksIFVwcGVyX0xlZnR5KG1faXNvbGF0ZSksCisgICAgICAgIExvd2VyX1JpZ2h0eChtX2lzb2xhdGUpLCBMb3dlcl9SaWdodHkobV9pc29sYXRlKTsKKyAgICByY0FycmF5LkdldEVsZW1lbnQoMCwgVXBwZXJfTGVmdHgpOworICAgIHJjQXJyYXkuR2V0RWxlbWVudCgxLCBVcHBlcl9MZWZ0eSk7CisgICAgcmNBcnJheS5HZXRFbGVtZW50KDIsIExvd2VyX1JpZ2h0eCk7CisgICAgcmNBcnJheS5HZXRFbGVtZW50KDMsIExvd2VyX1JpZ2h0eSk7CisKKyAgICBGWF9GTE9BVCBwQXJyYXlbNF0gPSB7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn07CisgICAgcEFycmF5WzBdID0gKEZYX0ZMT0FUKVVwcGVyX0xlZnR4LlRvSW50KCk7CisgICAgcEFycmF5WzFdID0gKEZYX0ZMT0FUKUxvd2VyX1JpZ2h0eS5Ub0ludCgpOworICAgIHBBcnJheVsyXSA9IChGWF9GTE9BVClMb3dlcl9SaWdodHguVG9JbnQoKTsKKyAgICBwQXJyYXlbM10gPSAoRlhfRkxPQVQpVXBwZXJfTGVmdHkuVG9JbnQoKTsKKworICAgIENQREZfUmVjdCBjclJlY3QocEFycmF5KTsKKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfUmVjdChGUF9SRUNULCBjclJlY3QpOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0UmVjdChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGNyUmVjdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOworICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPQorICAgICAgICAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKKworICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0KKyAgICAgICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKKyAgICBpZiAoIXBXaWRnZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDRlhfRmxvYXRSZWN0IGNyUmVjdCA9IHBXaWRnZXQtPkdldFJlY3QoKTsKKyAgICBDSlNfVmFsdWUgVXBwZXJfTGVmdHgobV9pc29sYXRlKSwgVXBwZXJfTGVmdHkobV9pc29sYXRlKSwKKyAgICAgICAgTG93ZXJfUmlnaHR4KG1faXNvbGF0ZSksIExvd2VyX1JpZ2h0eShtX2lzb2xhdGUpOworICAgIFVwcGVyX0xlZnR4ID0gKGludDMyX3QpY3JSZWN0LmxlZnQ7CisgICAgVXBwZXJfTGVmdHkgPSAoaW50MzJfdCljclJlY3QudG9wOworICAgIExvd2VyX1JpZ2h0eCA9IChpbnQzMl90KWNyUmVjdC5yaWdodDsKKyAgICBMb3dlcl9SaWdodHkgPSAoaW50MzJfdCljclJlY3QuYm90dG9tOworCisgICAgQ0pTX0FycmF5IHJjQXJyYXkobV9pc29sYXRlKTsKKyAgICByY0FycmF5LlNldEVsZW1lbnQoMCwgVXBwZXJfTGVmdHgpOworICAgIHJjQXJyYXkuU2V0RWxlbWVudCgxLCBVcHBlcl9MZWZ0eSk7CisgICAgcmNBcnJheS5TZXRFbGVtZW50KDIsIExvd2VyX1JpZ2h0eCk7CisgICAgcmNBcnJheS5TZXRFbGVtZW50KDMsIExvd2VyX1JpZ2h0eSk7CisKKyAgICB2cCA8PCByY0FycmF5OworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgRmllbGQ6OlNldFJlY3QoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKKworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisKKyAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgIEdldEZvcm1GaWVsZHMocERvY3VtZW50LCBzd0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisKKyAgZm9yIChpbnQgaSA9IDAsIGlzeiA9IEZpZWxkQXJyYXkuR2V0U2l6ZSgpOyBpIDwgaXN6OyBpKyspIHsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoaSk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApIHsKKyAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7IGkrKykgeworICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOworICAgICAgICBBU1NFUlQocEZvcm1Db250cm9sICE9IE5VTEwpOworCisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgQ1BERl9SZWN0IGNyUmVjdCA9IHJlY3Q7CisKKyAgICAgICAgICBDUERGX1BhZ2UqIHBQREZQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOworICAgICAgICAgIEFTU0VSVChwUERGUGFnZSAhPSBOVUxMKTsKKworICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlKiBwUERGUGFnZSA9IHBQYWdlLT5HZXRQYWdlKCk7CisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICBBU1NFUlQocFBERlBhZ2UgIT0gTlVMTCk7CisKKyAgICAgICAgICBjclJlY3QuSW50ZXJzZWN0KHBQREZQYWdlLT5HZXRQYWdlQkJveCgpKTsKKworICAgICAgICAgIGlmICghY3JSZWN0LklzRW1wdHkoKSkgeworICAgICAgICAgICAgQ1BERl9SZWN0IHJjT2xkID0gcFdpZGdldC0+R2V0UmVjdCgpOworICAgICAgICAgICAgaWYgKGNyUmVjdC5sZWZ0ICE9IHJjT2xkLmxlZnQgfHwgY3JSZWN0LnJpZ2h0ICE9IHJjT2xkLnJpZ2h0IHx8CisgICAgICAgICAgICAgICAgY3JSZWN0LnRvcCAhPSByY09sZC50b3AgfHwgY3JSZWN0LmJvdHRvbSAhPSByY09sZC5ib3R0b20pIHsKKyAgICAgICAgICAgICAgcFdpZGdldC0+U2V0UmVjdChjclJlY3QpOworICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGJTZXQpCisgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPQorICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKSB7CisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgQ1BERl9SZWN0IGNyUmVjdCA9IHJlY3Q7CisKKyAgICAgICAgICBDUERGX1BhZ2UqIHBQREZQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOworICAgICAgICAgIEFTU0VSVChwUERGUGFnZSAhPSBOVUxMKTsKKworICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlKiBwUERGUGFnZSA9IHBQYWdlLT5HZXRQYWdlKCk7CisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICBBU1NFUlQocFBERlBhZ2UgIT0gTlVMTCk7CisKKyAgICAgICAgICBjclJlY3QuSW50ZXJzZWN0KHBQREZQYWdlLT5HZXRQYWdlQkJveCgpKTsKKworICAgICAgICAgIGlmICghY3JSZWN0LklzRW1wdHkoKSkgeworICAgICAgICAgICAgQ1BERl9SZWN0IHJjT2xkID0gcFdpZGdldC0+R2V0UmVjdCgpOworICAgICAgICAgICAgaWYgKGNyUmVjdC5sZWZ0ICE9IHJjT2xkLmxlZnQgfHwgY3JSZWN0LnJpZ2h0ICE9IHJjT2xkLnJpZ2h0IHx8CisgICAgICAgICAgICAgICAgY3JSZWN0LnRvcCAhPSByY09sZC50b3AgfHwgY3JSZWN0LmJvdHRvbSAhPSByY09sZC5ib3R0b20pIHsKKyAgICAgICAgICAgICAgcFdpZGdldC0+U2V0UmVjdChjclJlY3QpOworICAgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgVFJVRSwgVFJVRSwgVFJVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK0ZYX0JPT0wgRmllbGQ6OnJlcXVpcmVkKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKKworICB9IGVsc2UgeworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKwogICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9DSEVDS0JPWCkKLSAgICB7Ci0gICAgICAgIGlmKCFwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKS0+SXNDaGVja2VkKCkpCi0gICAgICAgICAgICB2cCA8PCBMIlllcyI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZwIDw8IEwiT2ZmIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OICYmICEocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1JBRElPU0lOVU5JU09OKSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MCwgc3o9cEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpPHN6OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpLT5Jc0NoZWNrZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdnAgPDwgTCJPZmYiOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9MSVNUQk9YICYmIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA+IDEpKQotICAgIHsKLSAgICAgICAgdnAgPDwgTCIiOwotICAgIH0KKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1JFUVVJUkVEKQorICAgICAgdnAgPDwgdHJ1ZTsKICAgICBlbHNlCi0gICAgICAgIHZwIDw8IHBGb3JtRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKTsKKyAgICAgIHZwIDw8IGZhbHNlOworICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworRlhfQk9PTCBGaWVsZDo6cmljaFRleHQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi1GWF9CT09MIEZpZWxkOjpicm93c2VGb3JGaWxlVG9TdWJtaXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCisgICAgYm9vbCBiVlA7CisgICAgdnAgPj4gYlZQOworCisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9Cb29sKEZQX1JJQ0hURVhULCBiVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0UmljaFRleHQobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOworICAgIH0KKyAgfSBlbHNlIHsKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKICAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCi0gICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKLSAgICBBU1NFUlQocEFwcCAhPSBOVUxMKTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0ZJTEVTRUxFQ1QpICYmCi0gICAgICAgIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKSkKLSAgICB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRmlsZU5hbWUgPSBwQXBwLT5KU19maWVsZEJyb3dzZSgpOwotICAgICAgICBpZighd3NGaWxlTmFtZS5Jc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKHdzRmlsZU5hbWUpOwotICAgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKLSAgICAgICAgIH0KLSAgICB9CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19SSUNIVEVYVCkKKyAgICAgIHZwIDw8IHRydWU7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB2cCA8PCBmYWxzZTsKKyAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCit2b2lkIEZpZWxkOjpTZXRSaWNoVGV4dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYikgeworICAvLyBOb3Qgc3VwcG9ydGVkLgorfQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25HZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6cmljaFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIDsKKyAgfSBlbHNlIHsKKyAgICA7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CiAKLSAgICBpbnQgbmZhY2UgPSAwOwotICAgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0gICAgaWYgKGlTaXplID49IDEpCi0gICAgICAgIG5mYWNlID0gcGFyYW1zWzBdLlRvSW50KCk7Cit2b2lkIEZpZWxkOjpTZXRSaWNoVmFsdWUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCkgeworICAvLyBOb3Qgc3VwcG9ydGVkLgorfQogCitGWF9CT09MIEZpZWxkOjpyb3RhdGlvbihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpbnQgblZQOworICAgIHZwID4+IG5WUDsKKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfSW50KEZQX1JPVEFUSU9OLCBuVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0Um90YXRpb24obV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOworICAgIH0KKyAgfSBlbHNlIHsKICAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CiAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKLSAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHZwIDw8IChpbnQzMl90KXBGb3JtQ29udHJvbC0+R2V0Um90YXRpb24oKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkIEZpZWxkOjpTZXRSb3RhdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KK30KKworRlhfQk9PTCBGaWVsZDo6c3Ryb2tlQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDSlNfQXJyYXkgY3JBcnJheShtX2lzb2xhdGUpOworICAgIHZwID4+IGNyQXJyYXk7CisKKyAgICBDUFdMX0NvbG9yIGNvbG9yOworICAgIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGNyQXJyYXksIGNvbG9yKTsKKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfQ29sb3IoRlBfU1RST0tFQ09MT1IsIGNvbG9yKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldFN0cm9rZUNvbG9yKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcik7CisgICAgfQorICB9IGVsc2UgeworICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOworICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCiAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKG5mYWNlID09IDApCi0gICAgICAgIHZSZXQgPSBwRm9ybUNvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKS5jX3N0cigpOwotICAgIGVsc2UgaWYgKG5mYWNlID09IDEpCi0gICAgICAgIHZSZXQgPSBwRm9ybUNvbnRyb2wtPkdldERvd25DYXB0aW9uKCkuY19zdHIoKTsKLSAgICBlbHNlIGlmIChuZmFjZSA9PSAyKQotICAgICAgICB2UmV0ID0gcEZvcm1Db250cm9sLT5HZXRSb2xsb3ZlckNhcHRpb24oKS5jX3N0cigpOwotICAgIGVsc2UKKyAgICBpbnQgaUNvbG9yVHlwZTsKKyAgICBwRm9ybUNvbnRyb2wtPkdldEJvcmRlckNvbG9yKGlDb2xvclR5cGUpOworCisgICAgQ1BXTF9Db2xvciBjb2xvcjsKKworICAgIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkgeworICAgICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9UUkFOU1BBUkVOVCk7CisgICAgfSBlbHNlIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9HUkFZKSB7CisgICAgICBjb2xvciA9CisgICAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDApKTsKKyAgICB9IGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1JHQikgeworICAgICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDIpKTsKKyAgICB9IGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX0NNWUspIHsKKyAgICAgIGNvbG9yID0KKyAgICAgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9DTVlLLCBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMCksCisgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMSksCisgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMiksCisgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMykpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKKyAgICBjb2xvcjo6Q29udmVydFBXTENvbG9yVG9BcnJheShjb2xvciwgY3JBcnJheSk7CisgICAgdnAgPDwgY3JBcnJheTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkIEZpZWxkOjpTZXRTdHJva2VDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCit9CisKK0ZYX0JPT0wgRmllbGQ6OnN0eWxlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENGWF9CeXRlU3RyaW5nIGNzQkNhcHRpb247CisgICAgdnAgPj4gY3NCQ2FwdGlvbjsKKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfU3RyaW5nKEZQX1NUWUxFLCBjc0JDYXB0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldFN0eWxlKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBjc0JDYXB0aW9uKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OICYmCisgICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DSEVDS0JPWCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NXQ2FwdGlvbiA9IHBGb3JtQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOworICAgIENGWF9CeXRlU3RyaW5nIGNzQkNhcHRpb247CisKKyAgICBzd2l0Y2ggKGNzV0NhcHRpb25bMF0pIHsKKyAgICAgIGNhc2UgTCdsJzoKKyAgICAgICAgY3NCQ2FwdGlvbiA9ICJjaXJjbGUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCc4JzoKKyAgICAgICAgY3NCQ2FwdGlvbiA9ICJjcm9zcyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMJ3UnOgorICAgICAgICBjc0JDYXB0aW9uID0gImRpYW1vbmQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCduJzoKKyAgICAgICAgY3NCQ2FwdGlvbiA9ICJzcXVhcmUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCdIJzoKKyAgICAgICAgY3NCQ2FwdGlvbiA9ICJzdGFyIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgLy8gTCc0JworICAgICAgICBjc0JDYXB0aW9uID0gImNoZWNrIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHZwIDw8IGNzQkNhcHRpb247CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBGaWVsZDo6U2V0U3R5bGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCit9CisKK0ZYX0JPT0wgRmllbGQ6OnN1Ym1pdE5hbWUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIEZpZWxkOjp0ZXh0Q29sb3IoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDSlNfQXJyYXkgY3JBcnJheShtX2lzb2xhdGUpOworICAgIGlmICghdnAuSXNBcnJheU9iamVjdCgpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIHZwID4+IGNyQXJyYXk7CisKKyAgICBDUFdMX0NvbG9yIGNvbG9yOworICAgIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGNyQXJyYXksIGNvbG9yKTsKKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfQ29sb3IoRlBfVEVYVENPTE9SLCBjb2xvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRUZXh0Q29sb3IobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBjb2xvcik7CisgICAgfQorICB9IGVsc2UgeworICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOworICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpbnQgaUNvbG9yVHlwZTsKKyAgICBGWF9BUkdCIGNvbG9yOworICAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgRmllbGRBcHBlYXJhbmNlID0KKyAgICAgICAgcEZvcm1Db250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOworICAgIEZpZWxkQXBwZWFyYW5jZS5HZXRDb2xvcihjb2xvciwgaUNvbG9yVHlwZSk7CisgICAgaW50MzJfdCBhLCByLCBnLCBiOworICAgIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHIsIGcsIGIpOworCisgICAgQ1BXTF9Db2xvciBjclJldCA9CisgICAgICAgIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgciAvIDI1NS4wZiwgZyAvIDI1NS4wZiwgYiAvIDI1NS4wZik7CisKKyAgICBpZiAoaUNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQpCisgICAgICBjclJldCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKKworICAgIENKU19BcnJheSBjckFycmF5KG1faXNvbGF0ZSk7CisgICAgY29sb3I6OkNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY3JSZXQsIGNyQXJyYXkpOworICAgIHZwIDw8IGNyQXJyYXk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBGaWVsZDo6U2V0VGV4dENvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KK30KKworRlhfQk9PTCBGaWVsZDo6dGV4dEZvbnQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZTsKKyAgICB2cCA+PiBjc0ZvbnROYW1lOworICAgIGlmIChjc0ZvbnROYW1lLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfU3RyaW5nKEZQX1RFWFRGT05ULCBjc0ZvbnROYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldFRleHRGb250KG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjc0ZvbnROYW1lKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGludCBuRmllbGRUeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7CisKKyAgICBpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTiB8fAorICAgICAgICBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9MSVNUQk9YIHx8CisgICAgICAgIG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkgeworICAgICAgQ1BERl9Gb250KiBwRm9udCA9IHBGb3JtQ29udHJvbC0+R2V0RGVmYXVsdENvbnRyb2xGb250KCk7CisgICAgICBpZiAoIXBGb250KQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICAgIHZwIDw8IHBGb250LT5HZXRCYXNlRm9udCgpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgRmllbGQ6OlNldFRleHRGb250KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykgeworICAvLyBOb3Qgc3VwcG9ydGVkLgorfQorCitGWF9CT09MIEZpZWxkOjp0ZXh0U2l6ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpbnQgblZQOworICAgIHZwID4+IG5WUDsKKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfSW50KEZQX1RFWFRTSVpFLCBuVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0VGV4dFNpemUobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBGaWVsZEFwcGVhcmFuY2UgPQorICAgICAgICBwRm9ybUNvbnRyb2wtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisKKyAgICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lVGFnOworICAgIEZYX0ZMT0FUIGZGb250U2l6ZTsKKyAgICBGaWVsZEFwcGVhcmFuY2UuR2V0Rm9udChjc0ZvbnROYW1lVGFnLCBmRm9udFNpemUpOworCisgICAgdnAgPDwgKGludClmRm9udFNpemU7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBGaWVsZDo6U2V0VGV4dFNpemUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCit9CisKK0ZYX0JPT0wgRmllbGQ6OnR5cGUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpIHsKKyAgICBjYXNlIEZJRUxEVFlQRV9VTktOT1dOOgorICAgICAgdnAgPDwgTCJ1bmtub3duIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CisgICAgICB2cCA8PCBMImJ1dHRvbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKKyAgICAgIHZwIDw8IEwiY2hlY2tib3giOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CisgICAgICB2cCA8PCBMInJhZGlvYnV0dG9uIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgorICAgICAgdnAgPDwgTCJjb21ib2JveCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgorICAgICAgdnAgPDwgTCJsaXN0Ym94IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKKyAgICAgIHZwIDw8IEwidGV4dCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9TSUdOQVRVUkU6CisgICAgICB2cCA8PCBMInNpZ25hdHVyZSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdnAgPDwgTCJ1bmtub3duIjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRmllbGQ6OnVzZXJOYW1lKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENGWF9XaWRlU3RyaW5nIHN3TmFtZTsKKyAgICB2cCA+PiBzd05hbWU7CisKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X1dpZGVTdHJpbmcoRlBfVVNFUk5BTUUsIHN3TmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRVc2VyTmFtZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIHN3TmFtZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOworICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgICAgdnAgPDwgKENGWF9XaWRlU3RyaW5nKXBGb3JtRmllbGQtPkdldEFsdGVybmF0ZU5hbWUoKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkIEZpZWxkOjpTZXRVc2VyTmFtZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KK30KKworRlhfQk9PTCBGaWVsZDo6dmFsdWUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ0pTX1dpZGVTdHJpbmdBcnJheSBzdHJBcnJheTsKKworICAgIGlmICh2cC5Jc0FycmF5T2JqZWN0KCkpIHsKKyAgICAgIENKU19BcnJheSBWYWx1ZUFycmF5KG1faXNvbGF0ZSk7CisgICAgICB2cC5Db252ZXJ0VG9BcnJheShWYWx1ZUFycmF5KTsKKyAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IFZhbHVlQXJyYXkuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIENKU19WYWx1ZSBFbGVtZW50VmFsdWUobV9pc29sYXRlKTsKKyAgICAgICAgVmFsdWVBcnJheS5HZXRFbGVtZW50KGksIEVsZW1lbnRWYWx1ZSk7CisgICAgICAgIHN0ckFycmF5LkFkZChFbGVtZW50VmFsdWUuVG9DRlhXaWRlU3RyaW5nKCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlOworICAgICAgdnAgPj4gc3dWYWx1ZTsKKworICAgICAgc3RyQXJyYXkuQWRkKHN3VmFsdWUpOworICAgIH0KKworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfV2lkZVN0cmluZ0FycmF5KEZQX1ZBTFVFLCBzdHJBcnJheSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRWYWx1ZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIHN0ckFycmF5KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgICBzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKSB7CisgICAgICBjYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBjYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKKyAgICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDogeworICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKKworICAgICAgICBkb3VibGUgZFJldDsKKyAgICAgICAgRlhfQk9PTCBiRG90OworICAgICAgICBpZiAoQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihzd1ZhbHVlLmNfc3RyKCksIGRSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEb3QpKSB7CisgICAgICAgICAgaWYgKGJEb3QpCisgICAgICAgICAgICB2cCA8PCBkUmV0OworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZwIDw8IGRSZXQ7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHZwIDw8IHN3VmFsdWU7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogeworICAgICAgICBpZiAocEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCkgPiAxKSB7CisgICAgICAgICAgQ0pTX0FycmF5IFZhbHVlQXJyYXkobV9pc29sYXRlKTsKKyAgICAgICAgICBDSlNfVmFsdWUgRWxlbWVudFZhbHVlKG1faXNvbGF0ZSk7CisgICAgICAgICAgaW50IGlJbmRleDsKKyAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICAgIGlJbmRleCA9IHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaSk7CisgICAgICAgICAgICBFbGVtZW50VmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25WYWx1ZShpSW5kZXgpLmNfc3RyKCk7CisgICAgICAgICAgICBpZiAoRlhTWVNfd2NzbGVuKEVsZW1lbnRWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKSA9PSAwKQorICAgICAgICAgICAgICBFbGVtZW50VmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChpSW5kZXgpLmNfc3RyKCk7CisgICAgICAgICAgICBWYWx1ZUFycmF5LlNldEVsZW1lbnQoaSwgRWxlbWVudFZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdnAgPDwgVmFsdWVBcnJheTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKKworICAgICAgICAgIGRvdWJsZSBkUmV0OworICAgICAgICAgIEZYX0JPT0wgYkRvdDsKKyAgICAgICAgICBpZiAoQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihzd1ZhbHVlLmNfc3RyKCksIGRSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRvdCkpIHsKKyAgICAgICAgICAgIGlmIChiRG90KQorICAgICAgICAgICAgICB2cCA8PCBkUmV0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB2cCA8PCBkUmV0OworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdnAgPDwgc3dWYWx1ZTsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgorICAgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046IHsKKyAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOworICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2woaSktPklzQ2hlY2tlZCgpKSB7CisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0KKyAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpLT5HZXRFeHBvcnRWYWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIGRSZXQ7CisgICAgICAgICAgICBGWF9CT09MIGJEb3Q7CisgICAgICAgICAgICBpZiAoQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihzd1ZhbHVlLmNfc3RyKCksIGRSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRG90KSkgeworICAgICAgICAgICAgICBpZiAoYkRvdCkKKyAgICAgICAgICAgICAgICB2cCA8PCBkUmV0OworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdnAgPDwgZFJldDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICB2cCA8PCBzd1ZhbHVlOworCisgICAgICAgICAgICBiRmluZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICghYkZpbmQpCisgICAgICAgICAgdnAgPDwgTCJPZmYiOworICAgICAgfSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHZwIDw8IHBGb3JtRmllbGQtPkdldFZhbHVlKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkIEZpZWxkOjpTZXRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19XaWRlU3RyaW5nQXJyYXkmIHN0ckFycmF5KSB7CisgIEFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKHN0ckFycmF5LkdldFNpemUoKSA8IDEpCisgICAgcmV0dXJuOworCisgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICBHZXRGb3JtRmllbGRzKHBEb2N1bWVudCwgc3dGaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworCisgIGZvciAoaW50IGkgPSAwLCBpc3ogPSBGaWVsZEFycmF5LkdldFNpemUoKTsgaSA8IGlzejsgaSsrKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOworICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZ1bGxOYW1lKCkuQ29tcGFyZShzd0ZpZWxkTmFtZSkgIT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkgeworICAgICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgorICAgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6CisgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpICE9IHN0ckFycmF5LkdldEF0KDApKSB7CisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgV2lkZVN0cmluZyA9IHN0ckFycmF5LkdldEF0KDApOworICAgICAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKHN0ckFycmF5LkdldEF0KDApLCBUUlVFKTsKKyAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDogIC8vIG1hbnRpczogMDAwNDQ5MworICAgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046IHsKKyAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldFZhbHVlKCkgIT0gc3RyQXJyYXkuR2V0QXQoMCkpIHsKKyAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRWYWx1ZShzdHJBcnJheS5HZXRBdCgwKSwgVFJVRSk7CisgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogeworICAgICAgICBGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFOworCisgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHN0ckFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICBpbnQgaUluZGV4ID0gcEZvcm1GaWVsZC0+RmluZE9wdGlvbihzdHJBcnJheS5HZXRBdChpKSk7CisKKyAgICAgICAgICBpZiAoIXBGb3JtRmllbGQtPklzSXRlbVNlbGVjdGVkKGlJbmRleCkpIHsKKyAgICAgICAgICAgIGJNb2RpZmllZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYk1vZGlmaWVkKSB7CisgICAgICAgICAgcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oVFJVRSk7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gc3RyQXJyYXkuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgICAgICAgICAgaW50IGlJbmRleCA9IHBGb3JtRmllbGQtPkZpbmRPcHRpb24oc3RyQXJyYXkuR2V0QXQoaSkpOworICAgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIFRSVUUsIFRSVUUpOworICAgICAgICAgIH0KKworICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitGWF9CT09MIEZpZWxkOjp2YWx1ZUFzU3RyaW5nKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOworICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1BVU0hCVVRUT04pCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpIHsKKyAgICBpZiAoIXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKDApLT5Jc0NoZWNrZWQoKSkKKyAgICAgIHZwIDw8IEwiWWVzIjsKKyAgICBlbHNlCisgICAgICB2cCA8PCBMIk9mZiI7CisgIH0gZWxzZSBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OICYmCisgICAgICAgICAgICAgIShwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkFESU9TSU5VTklTT04pKSB7CisgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7IGkrKykgeworICAgICAgaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2woaSktPklzQ2hlY2tlZCgpKSB7CisgICAgICAgIHZwIDw8IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSktPkdldEV4cG9ydFZhbHVlKCkuY19zdHIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UKKyAgICAgICAgdnAgPDwgTCJPZmYiOworICAgIH0KKyAgfSBlbHNlIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfTElTVEJPWCAmJgorICAgICAgICAgICAgIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA+IDEpKSB7CisgICAgdnAgPDwgTCIiOworICB9IGVsc2UKKyAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK0ZYX0JPT0wgRmllbGQ6OmJyb3dzZUZvckZpbGVUb1N1Ym1pdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7CisgIEFTU0VSVChwQXBwICE9IE5VTEwpOworCisgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0ZJTEVTRUxFQ1QpICYmCisgICAgICAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkpIHsKKyAgICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVOYW1lID0gcEFwcC0+SlNfZmllbGRCcm93c2UoKTsKKyAgICBpZiAoIXdzRmlsZU5hbWUuSXNFbXB0eSgpKSB7CisgICAgICBwRm9ybUZpZWxkLT5TZXRWYWx1ZSh3c0ZpbGVOYW1lKTsKKyAgICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7CisgICAgfQorICB9IGVsc2UKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvbkdldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaW50IG5mYWNlID0gMDsKKyAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKGlTaXplID49IDEpCisgICAgbmZhY2UgPSBwYXJhbXNbMF0uVG9JbnQoKTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgIGlmICghcEZvcm1Db250cm9sKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobmZhY2UgPT0gMCkKKyAgICB2UmV0ID0gcEZvcm1Db250cm9sLT5HZXROb3JtYWxDYXB0aW9uKCkuY19zdHIoKTsKKyAgZWxzZSBpZiAobmZhY2UgPT0gMSkKKyAgICB2UmV0ID0gcEZvcm1Db250cm9sLT5HZXREb3duQ2FwdGlvbigpLmNfc3RyKCk7CisgIGVsc2UgaWYgKG5mYWNlID09IDIpCisgICAgdlJldCA9IHBGb3JtQ29udHJvbC0+R2V0Um9sbG92ZXJDYXB0aW9uKCkuY19zdHIoKTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKIH0KIAogLy8jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDgwMCkKIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uR2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvbkdldEljb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICBpbnQgbmZhY2UgPSAwOwotICAgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0gICAgaWYgKGlTaXplID49IDEpCi0gICAgICAgIG5mYWNlID0gcGFyYW1zWzBdLlRvSW50KCk7CisgIGludCBuZmFjZSA9IDA7CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA+PSAxKQorICAgIG5mYWNlID0gcGFyYW1zWzBdLlRvSW50KCk7CiAKLSAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCi0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogCi0gICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOworICBBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CiAKLSAgICBKU0ZYT2JqZWN0IHBPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJJY29uIikpOwotICAgIEFTU0VSVChwT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7CisgIEpTRlhPYmplY3QgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJJY29uIikpOworICBBU1NFUlQocE9iai5Jc0VtcHR5KCkgPT0gRkFMU0UpOwogCi0gICAgQ0pTX0ljb24qIHBKU19JY29uID0gKENKU19JY29uKilKU19HZXRQcml2YXRlKHBPYmopOwotICAgIEFTU0VSVChwSlNfSWNvbiAhPSBOVUxMKTsKKyAgQ0pTX0ljb24qIHBKU19JY29uID0gKENKU19JY29uKilKU19HZXRQcml2YXRlKHBPYmopOworICBBU1NFUlQocEpTX0ljb24gIT0gTlVMTCk7CiAKLSAgICBJY29uKiBwSWNvbiA9IChJY29uKilwSlNfSWNvbi0+R2V0RW1iZWRPYmplY3QoKTsKLSAgICBBU1NFUlQocEljb24gIT0gTlVMTCk7CisgIEljb24qIHBJY29uID0gKEljb24qKXBKU19JY29uLT5HZXRFbWJlZE9iamVjdCgpOworICBBU1NFUlQocEljb24gIT0gTlVMTCk7CiAKLSAgICBDUERGX1N0cmVhbSogcEljb25TdHJlYW0gPSBOVUxMOwotICAgIGlmIChuZmFjZSA9PSAwKQotICAgICAgICBwSWNvblN0cmVhbSA9IHBGb3JtQ29udHJvbC0+R2V0Tm9ybWFsSWNvbigpOwotICAgIGVsc2UgaWYgKG5mYWNlID09IDEpCi0gICAgICAgIHBJY29uU3RyZWFtID0gcEZvcm1Db250cm9sLT5HZXREb3duSWNvbigpOwotICAgIGVsc2UgaWYgKG5mYWNlID09IDIpCi0gICAgICAgIHBJY29uU3RyZWFtID0gcEZvcm1Db250cm9sLT5HZXRSb2xsb3Zlckljb24oKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERl9TdHJlYW0qIHBJY29uU3RyZWFtID0gTlVMTDsKKyAgaWYgKG5mYWNlID09IDApCisgICAgcEljb25TdHJlYW0gPSBwRm9ybUNvbnRyb2wtPkdldE5vcm1hbEljb24oKTsKKyAgZWxzZSBpZiAobmZhY2UgPT0gMSkKKyAgICBwSWNvblN0cmVhbSA9IHBGb3JtQ29udHJvbC0+R2V0RG93bkljb24oKTsKKyAgZWxzZSBpZiAobmZhY2UgPT0gMikKKyAgICBwSWNvblN0cmVhbSA9IHBGb3JtQ29udHJvbC0+R2V0Um9sbG92ZXJJY29uKCk7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBwSWNvbi0+U2V0U3RyZWFtKHBJY29uU3RyZWFtKTsKLSAgICB2UmV0ID0gcEpTX0ljb247CisgIHBJY29uLT5TZXRTdHJlYW0ocEljb25TdHJlYW0pOworICB2UmV0ID0gcEpTX0ljb247CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKIC8vI3ByYWdtYSB3YXJuaW5nKGRlZmF1bHQ6IDQ4MDApCiAKLUZYX0JPT0wgRmllbGQ6OmJ1dHRvbkltcG9ydEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvbkltcG9ydEljb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogI2lmIDAKICAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKQEAgLTM0OTcsNjIwICszMzg0LDY4MSBAQAogICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOwogCiAgICAgdlJldCA9IDA7Ci0jZW5kaWYgLy8gMAotICAgIHJldHVybiBUUlVFOworI2VuZGlmICAvLyAwCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25TZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17CitGWF9CT09MIEZpZWxkOjpidXR0b25TZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIEZpZWxkOjpidXR0b25TZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIEZpZWxkOjpjaGVja1RoaXNCb3goSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgaWYgKCFtX2JDYW5TZXQpCiAgICAgcmV0dXJuIEZBTFNFOwotfQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25TZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA8IDEpCiAgICAgcmV0dXJuIEZBTFNFOworCisgIGludCBuV2lkZ2V0ID0gcGFyYW1zWzBdLlRvSW50KCk7CisKKyAgRlhfQk9PTCBiQ2hlY2tpdCA9IFRSVUU7CisgIGlmIChpU2l6ZSA+PSAyKQorICAgIGJDaGVja2l0ID0gcGFyYW1zWzFdLlRvQm9vbCgpOworCisgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DSEVDS0JPWCAmJgorICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKG5XaWRnZXQgPCAwIHx8IG5XaWRnZXQgPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKKyAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wobldpZGdldCwgYkNoZWNraXQsIFRSVUUpOworICBlbHNlCisgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKG5XaWRnZXQsIGJDaGVja2l0LCBUUlVFKTsKKworICBVcGRhdGVGb3JtRmllbGQobV9wRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6Y2hlY2tUaGlzQm94KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6Y2xlYXJJdGVtcyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOworfQogCi0gICAgaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgRmllbGQ6OmRlZmF1bHRJc0NoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotICAgIGlmIChpU2l6ZSA8IDEpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFtX2JDYW5TZXQpCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgaW50IG5XaWRnZXQgPSBwYXJhbXNbMF0uVG9JbnQoKTsKKyAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKGlTaXplIDwgMSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBGWF9CT09MIGJDaGVja2l0ID0gVFJVRTsKLSAgICBpZiAoaVNpemUgPj0gMikKLSAgICAgICAgYkNoZWNraXQgPSBwYXJhbXNbMV0uVG9Cb29sKCk7CisgIGludCBuV2lkZ2V0ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAKLSAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OworICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgIGlmIChuV2lkZ2V0IDwgMCB8fCBuV2lkZ2V0ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkgeworICAgIHZSZXQgPSBGQUxTRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpIHx8CisgICAgICAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSkgeworICAgIHZSZXQgPSBUUlVFOworICB9IGVsc2UKKyAgICB2UmV0ID0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRmllbGQ6OmRlbGV0ZUl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgSlNfQ09NUEFSRVNUUklORyhDRlhfV2lkZVN0cmluZyogcHMxLCBDRlhfV2lkZVN0cmluZyogcHMyKSB7CisgIEFTU0VSVChwczEgIT0gTlVMTCk7CisgIEFTU0VSVChwczIgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHBzMS0+Q29tcGFyZSgqcHMyKTsKK30KKworRlhfQk9PTCBGaWVsZDo6Z2V0QXJyYXkoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7CisgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOworICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ0dXX0FycmF5VGVtcGxhdGU8Q0ZYX1dpZGVTdHJpbmcqPiBzd1NvcnQ7CisKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gRmllbGRBcnJheS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOwogICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCi0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DSEVDS0JPWCAmJiBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUkFESU9CVVRUT04pCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBpZihuV2lkZ2V0IDwwIHx8IG5XaWRnZXQgPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKLSAgICAgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKG5XaWRnZXQsIGJDaGVja2l0LCBUUlVFKTsKKyAgICBzd1NvcnQuQWRkKG5ldyBDRlhfV2lkZVN0cmluZyhwRm9ybUZpZWxkLT5HZXRGdWxsTmFtZSgpKSk7CisgIH0KKyAgc3dTb3J0LlNvcnQoSlNfQ09NUEFSRVNUUklORyk7CisKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKworICBDSlNfQXJyYXkgRm9ybUZpZWxkQXJyYXkobV9pc29sYXRlKTsKKyAgZm9yIChpbnQgaiA9IDAsIGpzeiA9IHN3U29ydC5HZXRTaXplKCk7IGogPCBqc3o7IGorKykgeworICAgIENGWF9XaWRlU3RyaW5nKiBwU3RyID0gc3dTb3J0LkdldEF0KGopOworCisgICAgSlNGWE9iamVjdCBwT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7CisgICAgQVNTRVJUKHBPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKKworICAgIENKU19GaWVsZCogcEpTRmllbGQgPSAoQ0pTX0ZpZWxkKilKU19HZXRQcml2YXRlKHBPYmopOworICAgIEFTU0VSVChwSlNGaWVsZCAhPSBOVUxMKTsKKworICAgIEZpZWxkKiBwRmllbGQgPSAoRmllbGQqKXBKU0ZpZWxkLT5HZXRFbWJlZE9iamVjdCgpOworICAgIEFTU0VSVChwRmllbGQgIT0gTlVMTCk7CisKKyAgICBwRmllbGQtPkF0dGFjaEZpZWxkKG1fcEpTRG9jLCAqcFN0cik7CisKKyAgICBDSlNfVmFsdWUgRm9ybUZpZWxkVmFsdWUobV9pc29sYXRlKTsKKyAgICBGb3JtRmllbGRWYWx1ZSA9IHBKU0ZpZWxkOworICAgIEZvcm1GaWVsZEFycmF5LlNldEVsZW1lbnQoaiwgRm9ybUZpZWxkVmFsdWUpOworCisgICAgZGVsZXRlIHBTdHI7CisgIH0KKworICB2UmV0ID0gRm9ybUZpZWxkQXJyYXk7CisgIHN3U29ydC5SZW1vdmVBbGwoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRmllbGQ6OmdldEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKyAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKKworICBpbnQgbklkeCA9IC0xOworICBpZiAoaVNpemUgPj0gMSkKKyAgICBuSWR4ID0gcGFyYW1zWzBdLlRvSW50KCk7CisKKyAgRlhfQk9PTCBiRXhwb3J0ID0gVFJVRTsKKyAgaWYgKGlTaXplID49IDIpCisgICAgYkV4cG9ydCA9IHBhcmFtc1sxXS5Ub0Jvb2woKTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0xJU1RCT1gpIHx8CisgICAgICAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NPTUJPQk9YKSkgeworICAgIGlmIChuSWR4ID09IC0xIHx8IG5JZHggPiBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSkKKyAgICAgIG5JZHggPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSAtIDE7CisgICAgaWYgKGJFeHBvcnQpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN0cnZhbCA9IHBGb3JtRmllbGQtPkdldE9wdGlvblZhbHVlKG5JZHgpOworICAgICAgaWYgKHN0cnZhbC5Jc0VtcHR5KCkpCisgICAgICAgIHZSZXQgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChuSWR4KS5jX3N0cigpOworICAgICAgZWxzZQorICAgICAgICB2UmV0ID0gc3RydmFsLmNfc3RyKCk7CisgICAgfSBlbHNlCisgICAgICB2UmV0ID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwobklkeCkuY19zdHIoKTsKKyAgfSBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIEZpZWxkOjpnZXRMb2NrKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIEZpZWxkOjppbnNlcnRJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBGaWVsZDo6aXNCb3hDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworCisgIGludCBuSW5kZXggPSAtMTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMSkKKyAgICBuSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKKworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworCisgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHsKKyAgICB2UmV0ID0gRkFMU0U7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpIHx8CisgICAgICAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSkgeworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5JbmRleCktPklzQ2hlY2tlZCgpICE9IDApCisgICAgICB2UmV0ID0gVFJVRTsKICAgICBlbHNlCi0gICAgICAgIHBGb3JtRmllbGQtPkNoZWNrQ29udHJvbChuV2lkZ2V0LCBiQ2hlY2tpdCwgVFJVRSk7CisgICAgICB2UmV0ID0gRkFMU0U7CisgIH0gZWxzZQorICAgIHZSZXQgPSBGQUxTRTsKIAotICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIEZpZWxkOjpjbGVhckl0ZW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci19CitGWF9CT09MIEZpZWxkOjppc0RlZmF1bHRDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwogCi1GWF9CT09MIEZpZWxkOjpkZWZhdWx0SXNDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworICBpbnQgbkluZGV4ID0gLTE7CisgIGlmIChwYXJhbXMuc2l6ZSgpID49IDEpCisgICAgbkluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAKLSAgICBpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKIAotICAgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0gICAgaWYgKGlTaXplIDwgMSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCi0gICAgaW50IG5XaWRnZXQgPSBwYXJhbXNbMF0uVG9JbnQoKTsKLQotICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgIGlmKG5XaWRnZXQgPDAgfHwgbldpZGdldCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCi0gICAgewotICAgICAgICB2UmV0ID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpCi0gICAgICAgIHx8IChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pKQotICAgIHsKLQotICAgICAgICB2UmV0ID0gVFJVRTsKLSAgICB9CisgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHsKKyAgICB2UmV0ID0gRkFMU0U7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YKSB8fAorICAgICAgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikpIHsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbChuSW5kZXgpLT5Jc0RlZmF1bHRDaGVja2VkKCkgIT0gMCkKKyAgICAgIHZSZXQgPSBUUlVFOwogICAgIGVsc2UKLSAgICAgICAgdlJldCA9IEZBTFNFOworICAgICAgdlJldCA9IEZBTFNFOworICB9IGVsc2UKKyAgICB2UmV0ID0gRkFMU0U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmRlbGV0ZUl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBGaWVsZDo6c2V0QWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLWludCBKU19DT01QQVJFU1RSSU5HKENGWF9XaWRlU3RyaW5nKiBwczEsIENGWF9XaWRlU3RyaW5nKiBwczIpCi17Ci0gICAgQVNTRVJUKHBzMSAhPSBOVUxMKTsKLSAgICBBU1NFUlQocHMyICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6c2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CiAKLSAgICByZXR1cm4gcHMxLT5Db21wYXJlKCpwczIpOwotfQorICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKKyAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKIAorICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7CisgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwogCi1GWF9CT09MIEZpZWxkOjpnZXRBcnJheShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKyAgaW50MzJfdCBuQ291bnQgPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7CiAKLSAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgIGlmIChuQ291bnQgPCAxKQorICAgIHJldHVybiBGQUxTRTsKIAotICAgIENHV19BcnJheVRlbXBsYXRlPENGWF9XaWRlU3RyaW5nKj4gc3dTb3J0OworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9CisgICAgICAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAKLSAgICBmb3IgKGludCBpPTAsc3o9RmllbGRBcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdChpKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICAgICAgc3dTb3J0LkFkZChuZXcgQ0ZYX1dpZGVTdHJpbmcocEZvcm1GaWVsZC0+R2V0RnVsbE5hbWUoKSkpOwotCi0gICAgfQotICAgIHN3U29ydC5Tb3J0KEpTX0NPTVBBUkVTVFJJTkcpOwotCi0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLSAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0gICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKLQotICAgIENKU19BcnJheSBGb3JtRmllbGRBcnJheShtX2lzb2xhdGUpOwotICAgIGZvciAoaW50IGo9MCxqc3ogPSBzd1NvcnQuR2V0U2l6ZSgpOyBqPGpzejsgaisrKQotICAgIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBTdHIgPSBzd1NvcnQuR2V0QXQoaik7Ci0KLSAgICAgICAgSlNGWE9iamVjdCBwT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgcENvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7Ci0gICAgICAgIEFTU0VSVChwT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7Ci0KLSAgICAgICAgQ0pTX0ZpZWxkKiBwSlNGaWVsZCA9IChDSlNfRmllbGQqKUpTX0dldFByaXZhdGUocE9iaik7Ci0gICAgICAgIEFTU0VSVChwSlNGaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBGaWVsZCogcEZpZWxkID0gKEZpZWxkKilwSlNGaWVsZC0+R2V0RW1iZWRPYmplY3QoKTsKLSAgICAgICAgQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKLQotICAgICAgICBwRmllbGQtPkF0dGFjaEZpZWxkKG1fcEpTRG9jLCAqcFN0cik7Ci0KLSAgICAgICAgQ0pTX1ZhbHVlIEZvcm1GaWVsZFZhbHVlKG1faXNvbGF0ZSk7Ci0gICAgICAgIEZvcm1GaWVsZFZhbHVlID0gcEpTRmllbGQ7Ci0gICAgICAgIEZvcm1GaWVsZEFycmF5LlNldEVsZW1lbnQoaiwgRm9ybUZpZWxkVmFsdWUpOwotCi0gICAgICAgIGRlbGV0ZSBwU3RyOwotICAgIH0KLQotICAgIHZSZXQgPSBGb3JtRmllbGRBcnJheTsKLSAgICBzd1NvcnQuUmVtb3ZlQWxsKCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRmllbGQ6OmdldEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLSAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotCi0gICAgaW50IG5JZHggPSAtMTsKLSAgICBpZiAoaVNpemUgPj0gMSkKLSAgICAgICAgbklkeCA9IHBhcmFtc1swXS5Ub0ludCgpOwotCi0gICAgRlhfQk9PTCBiRXhwb3J0ID0gVFJVRTsKLSAgICBpZiAoaVNpemUgPj0gMikKLSAgICAgICAgYkV4cG9ydCA9IHBhcmFtc1sxXS5Ub0Jvb2woKTsKLQotICAgIENGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotICAgIEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLSAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotICAgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0xJU1RCT1gpCi0gICAgICAgIHx8IChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ09NQk9CT1gpKQotICAgIHsKLSAgICAgICAgaWYgKG5JZHggPT0gLTEgfHwgbklkeCA+IHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpKQotICAgICAgICAgICAgbklkeCA9IHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpIC0xOwotICAgICAgICBpZiAoYkV4cG9ydCkKLSAgICAgICAgewotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RydmFsID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uVmFsdWUobklkeCk7Ci0gICAgICAgICAgICBpZiAoc3RydmFsLklzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB2UmV0ID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwobklkeCkuY19zdHIoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2UmV0ID0gc3RydmFsLmNfc3RyKCk7CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsKKyAgaWYgKG5Db3VudCA9PSAxKSB7CisgICAgcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUZpZWxkLT5HZXRDb250cm9sKDApKTsKKyAgfSBlbHNlIHsKKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOworICAgIEFTU0VSVChwRW52KTsKKyAgICBDUERGWEZBX1BhZ2UqIHBQYWdlID0KKyAgICAgICAgKENQREZYRkFfUGFnZSopcEVudi0+RkZJX0dldEN1cnJlbnRQYWdlKG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpKTsKKyAgICBpZiAoIXBQYWdlKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwQ3VyUGFnZVZpZXcgPSBtX3BEb2N1bWVudC0+R2V0UGFnZVZpZXcocFBhZ2UpKSB7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBUZW1wV2lkZ2V0ID0KKyAgICAgICAgICAgICAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKSkpIHsKKyAgICAgICAgICBpZiAocFRlbXBXaWRnZXQtPkdldFBERlBhZ2UoKSA9PSBwQ3VyUGFnZVZpZXctPkdldFBERlBhZ2UoKSkgeworICAgICAgICAgICAgcFdpZGdldCA9IHBUZW1wV2lkZ2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZSZXQgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChuSWR4KS5jX3N0cigpOworICAgICAgfQogICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgIGlmIChwV2lkZ2V0KSB7CisgICAgbV9wRG9jdW1lbnQtPlNldEZvY3VzQW5ub3QocFdpZGdldCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6Z2V0TG9jayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgRmllbGQ6OnNldEl0ZW1zKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6Omluc2VydEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBGaWVsZDo6c2V0TG9jayhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6aXNCb3hDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0gICAgaW50IG5JbmRleCA9IC0xOwotICAgIGlmIChwYXJhbXMuc2l6ZSgpID49IDEpCi0gICAgICAgIG5JbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwotCi0gICAgQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0gICAgR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLSAgICBpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotICAgIEFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gICAgaWYobkluZGV4IDwwIHx8IG5JbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCi0gICAgewotICAgICAgICB2UmV0ID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9DSEVDS0JPWCkKLSAgICAgICAgfHwgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikpCi0gICAgewotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbChuSW5kZXgpLT5Jc0NoZWNrZWQoKSAhPTAgKQotICAgICAgICAgICAgdlJldCA9IFRSVUU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZSZXQgPSBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICB2UmV0ID0gRkFMU0U7Ci0KLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRmllbGQ6OnNpZ25hdHVyZUdldE1vZGlmaWNhdGlvbnMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmlzRGVmYXVsdENoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLSAgICBpbnQgbkluZGV4ID0gLTE7Ci0gICAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMSkKLSAgICAgICAgbkluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0KLSAgICBDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLSAgICBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotICAgIGlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0gICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLSAgICBpZihuSW5kZXggPDAgfHwgbkluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKLSAgICB7Ci0gICAgICAgIHZSZXQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9DSEVDS0JPWCkKLSAgICAgICAgfHwgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikpCi0gICAgewotICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbChuSW5kZXgpLT5Jc0RlZmF1bHRDaGVja2VkKCkgIT0gMCkKLSAgICAgICAgICAgIHZSZXQgPSBUUlVFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2UmV0ID0gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgdlJldCA9IEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIEZpZWxkOjpzaWduYXR1cmVHZXRTZWVkVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnNldEFjdGlvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlSW5mbyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCWlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQlpbnQzMl90IG5Db3VudCA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsKLQotCWlmIChuQ291bnQgPCAxKSByZXR1cm4gRkFMU0U7Ci0KLQlDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0JQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBOVUxMOwotCWlmIChuQ291bnQgPT0gMSkKLQl7Ci0JCXBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7Ci0JCUFTU0VSVChwRW52KTsKLQkJQ1BERlhGQV9QYWdlKiBwUGFnZSA9IChDUERGWEZBX1BhZ2UqKXBFbnYtPkZGSV9HZXRDdXJyZW50UGFnZShtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKSk7Ci0JCWlmKCFwUGFnZSkKLQkJCXJldHVybiBGQUxTRTsKLQkJaWYgKENQREZTREtfUGFnZVZpZXcqIHBDdXJQYWdlVmlldyA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhwUGFnZSkpCi0JCXsKLQkJCWZvciAoaW50MzJfdCBpPTA7IGk8bkNvdW50OyBpKyspCi0JCQl7Ci0JCQkJaWYgKENQREZTREtfV2lkZ2V0KiBwVGVtcFdpZGdldCA9ICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKSkpCi0JCQkJewotCQkJCQlpZiAocFRlbXBXaWRnZXQtPkdldFBERlBhZ2UoKSA9PSBwQ3VyUGFnZVZpZXctPkdldFBERlBhZ2UoKSkKLQkJCQkJewotCQkJCQkJcFdpZGdldCA9IHBUZW1wV2lkZ2V0OwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAocFdpZGdldCkKLQl7Ci0JCW1fcERvY3VtZW50LT5TZXRGb2N1c0Fubm90KHBXaWRnZXQpOwotCX0KLQotCXJldHVybiBUUlVFOworRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlU2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIEZpZWxkOjpzZXRJdGVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlU2lnbihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2V0TG9jayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgRmllbGQ6OnNpZ25hdHVyZVZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIEZpZWxkOjpzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBGaWVsZDo6c291cmNlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAgPDwgKENKU19PYmplY3QqKU5VTEw7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlR2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIEZBTFNFOworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBkZWxheQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgRmllbGQ6OkFkZERlbGF5X0ludChlbnVtIEZJRUxEX1BST1AgcHJvcCwgaW50MzJfdCBuKSB7CisgIEFTU0VSVChtX3BKU0RvYyAhPSBOVUxMKTsKKworICBDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9IG5ldyBDSlNfRGVsYXlEYXRhOworICBwTmV3RGF0YS0+c0ZpZWxkTmFtZSA9IG1fRmllbGROYW1lOworICBwTmV3RGF0YS0+bkNvbnRyb2xJbmRleCA9IG1fbkZvcm1Db250cm9sSW5kZXg7CisgIHBOZXdEYXRhLT5lUHJvcCA9IHByb3A7CisgIHBOZXdEYXRhLT5udW0gPSBuOworCisgIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwogfQogCi1GWF9CT09MIEZpZWxkOjpzaWduYXR1cmVJbmZvKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIEZBTFNFOwordm9pZCBGaWVsZDo6QWRkRGVsYXlfQm9vbChlbnVtIEZJRUxEX1BST1AgcHJvcCwgYm9vbCBiKSB7CisgIEFTU0VSVChtX3BKU0RvYyAhPSBOVUxMKTsKKworICBDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9IG5ldyBDSlNfRGVsYXlEYXRhOworICBwTmV3RGF0YS0+c0ZpZWxkTmFtZSA9IG1fRmllbGROYW1lOworICBwTmV3RGF0YS0+bkNvbnRyb2xJbmRleCA9IG1fbkZvcm1Db250cm9sSW5kZXg7CisgIHBOZXdEYXRhLT5lUHJvcCA9IHByb3A7CisgIHBOZXdEYXRhLT5iID0gYjsKKworICBtX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlU2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIEZBTFNFOwordm9pZCBGaWVsZDo6QWRkRGVsYXlfU3RyaW5nKGVudW0gRklFTERfUFJPUCBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpIHsKKyAgQVNTRVJUKG1fcEpTRG9jICE9IE5VTEwpOworCisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7CisgIHBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7CisgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKKyAgcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKKyAgcE5ld0RhdGEtPnN0cmluZyA9IHN0cmluZzsKKworICBtX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlU2lnbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBGQUxTRTsKK3ZvaWQgRmllbGQ6OkFkZERlbGF5X1dpZGVTdHJpbmcoZW51bSBGSUVMRF9QUk9QIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpIHsKKyAgQVNTRVJUKG1fcEpTRG9jICE9IE5VTEwpOworCisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7CisgIHBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7CisgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKKyAgcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKKyAgcE5ld0RhdGEtPndpZGVzdHJpbmcgPSBzdHJpbmc7CisKKyAgbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnNpZ25hdHVyZVZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgcmV0dXJuIEZBTFNFOwordm9pZCBGaWVsZDo6QWRkRGVsYXlfUmVjdChlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7CisgIEFTU0VSVChtX3BKU0RvYyAhPSBOVUxMKTsKKworICBDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9IG5ldyBDSlNfRGVsYXlEYXRhOworICBwTmV3RGF0YS0+c0ZpZWxkTmFtZSA9IG1fRmllbGROYW1lOworICBwTmV3RGF0YS0+bkNvbnRyb2xJbmRleCA9IG1fbkZvcm1Db250cm9sSW5kZXg7CisgIHBOZXdEYXRhLT5lUHJvcCA9IHByb3A7CisgIHBOZXdEYXRhLT5yZWN0ID0gcmVjdDsKKworICBtX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBpZiAodnAuSXNHZXR0aW5nKCkpCi0gICAgewotICAgICAgICB2cCA8PCAoQ0pTX09iamVjdCopTlVMTDsKLSAgICB9Cit2b2lkIEZpZWxkOjpBZGREZWxheV9Db2xvcihlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgQVNTRVJUKG1fcEpTRG9jICE9IE5VTEwpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7CisgIHBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7CisgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKKyAgcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKKyAgcE5ld0RhdGEtPmNvbG9yID0gY29sb3I7CisKKyAgbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7CiB9CiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZGVsYXkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2b2lkIEZpZWxkOjpBZGREZWxheV9Xb3JkQXJyYXkoZW51bSBGSUVMRF9QUk9QIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RXb3JkQXJyYXkmIGFycmF5KSB7CisgIEFTU0VSVChtX3BKU0RvYyAhPSBOVUxMKTsKIAotdm9pZCBGaWVsZDo6QWRkRGVsYXlfSW50KGVudW0gRklFTERfUFJPUCBwcm9wLCBpbnQzMl90IG4pCi17Ci0gICAgQVNTRVJUKG1fcEpTRG9jICE9IE5VTEwpOworICBDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9IG5ldyBDSlNfRGVsYXlEYXRhOworICBwTmV3RGF0YS0+c0ZpZWxkTmFtZSA9IG1fRmllbGROYW1lOworICBwTmV3RGF0YS0+bkNvbnRyb2xJbmRleCA9IG1fbkZvcm1Db250cm9sSW5kZXg7CisgIHBOZXdEYXRhLT5lUHJvcCA9IHByb3A7CiAKLSAgICBDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9IG5ldyBDSlNfRGVsYXlEYXRhOwotICAgIHBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7Ci0gICAgcE5ld0RhdGEtPm5Db250cm9sSW5kZXggPSBtX25Gb3JtQ29udHJvbEluZGV4OwotICAgIHBOZXdEYXRhLT5lUHJvcCA9IHByb3A7Ci0gICAgcE5ld0RhdGEtPm51bSA9IG47CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IGFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgcE5ld0RhdGEtPndvcmRhcnJheS5BZGQoYXJyYXkuR2V0QXQoaSkpOwogCi0gICAgbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7CisgIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwogfQogCi12b2lkIEZpZWxkOjpBZGREZWxheV9Cb29sKGVudW0gRklFTERfUFJPUCBwcm9wLGJvb2wgYikKLXsKLSAgICBBU1NFUlQobV9wSlNEb2MgIT0gTlVMTCk7Cit2b2lkIEZpZWxkOjpBZGREZWxheV9XaWRlU3RyaW5nQXJyYXkoZW51bSBGSUVMRF9QUk9QIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1dpZGVTdHJpbmdBcnJheSYgYXJyYXkpIHsKKyAgQVNTRVJUKG1fcEpTRG9jICE9IE5VTEwpOwogCi0gICAgQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPSBuZXcgQ0pTX0RlbGF5RGF0YTsKLSAgICBwTmV3RGF0YS0+c0ZpZWxkTmFtZSA9IG1fRmllbGROYW1lOwotICAgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKLSAgICBwTmV3RGF0YS0+ZVByb3AgPSBwcm9wOwotICAgIHBOZXdEYXRhLT5iID0gYjsKKyAgQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPSBuZXcgQ0pTX0RlbGF5RGF0YTsKKyAgcE5ld0RhdGEtPnNGaWVsZE5hbWUgPSBtX0ZpZWxkTmFtZTsKKyAgcE5ld0RhdGEtPm5Db250cm9sSW5kZXggPSBtX25Gb3JtQ29udHJvbEluZGV4OworICBwTmV3RGF0YS0+ZVByb3AgPSBwcm9wOworICBmb3IgKGludCBpID0gMCwgc3ogPSBhcnJheS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgIHBOZXdEYXRhLT53aWRlc3RyaW5nYXJyYXkuQWRkKGFycmF5LkdldEF0KGkpKTsKIAotICAgIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOworICBtX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKIH0KIAotdm9pZCBGaWVsZDo6QWRkRGVsYXlfU3RyaW5nKGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKQotewotICAgIEFTU0VSVChtX3BKU0RvYyAhPSBOVUxMKTsKK3ZvaWQgRmllbGQ6OkRvRGVsYXkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDSlNfRGVsYXlEYXRhKiBwRGF0YSkgeworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworICBBU1NFUlQocERhdGEgIT0gTlVMTCk7CiAKLSAgICBDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9IG5ldyBDSlNfRGVsYXlEYXRhOwotICAgIHBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7Ci0gICAgcE5ld0RhdGEtPm5Db250cm9sSW5kZXggPSBtX25Gb3JtQ29udHJvbEluZGV4OwotICAgIHBOZXdEYXRhLT5lUHJvcCA9IHByb3A7Ci0gICAgcE5ld0RhdGEtPnN0cmluZyA9IHN0cmluZzsKLQotICAgIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwotfQotCi12b2lkIEZpZWxkOjpBZGREZWxheV9XaWRlU3RyaW5nKGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKQotewotICAgIEFTU0VSVChtX3BKU0RvYyAhPSBOVUxMKTsKLQotICAgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7Ci0gICAgcE5ld0RhdGEtPnNGaWVsZE5hbWUgPSBtX0ZpZWxkTmFtZTsKLSAgICBwTmV3RGF0YS0+bkNvbnRyb2xJbmRleCA9IG1fbkZvcm1Db250cm9sSW5kZXg7Ci0gICAgcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKLSAgICBwTmV3RGF0YS0+d2lkZXN0cmluZyA9IHN0cmluZzsKLQotICAgIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwotfQotCi12b2lkIEZpZWxkOjpBZGREZWxheV9SZWN0KGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDUERGX1JlY3QmIHJlY3QpCi17Ci0gICAgQVNTRVJUKG1fcEpTRG9jICE9IE5VTEwpOwotCi0gICAgQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPSBuZXcgQ0pTX0RlbGF5RGF0YTsKLSAgICBwTmV3RGF0YS0+c0ZpZWxkTmFtZSA9IG1fRmllbGROYW1lOwotICAgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKLSAgICBwTmV3RGF0YS0+ZVByb3AgPSBwcm9wOwotICAgIHBOZXdEYXRhLT5yZWN0ID0gcmVjdDsKLQotICAgIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwotfQotCi12b2lkIEZpZWxkOjpBZGREZWxheV9Db2xvcihlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0gICAgQVNTRVJUKG1fcEpTRG9jICE9IE5VTEwpOwotCi0gICAgQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPSBuZXcgQ0pTX0RlbGF5RGF0YTsKLSAgICBwTmV3RGF0YS0+c0ZpZWxkTmFtZSA9IG1fRmllbGROYW1lOwotICAgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKLSAgICBwTmV3RGF0YS0+ZVByb3AgPSBwcm9wOwotICAgIHBOZXdEYXRhLT5jb2xvciA9IGNvbG9yOwotCi0gICAgbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7Ci19Ci0KLXZvaWQgRmllbGQ6OkFkZERlbGF5X1dvcmRBcnJheShlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0ZYX0RXb3JkQXJyYXkmIGFycmF5KQotewotICAgIEFTU0VSVChtX3BKU0RvYyAhPSBOVUxMKTsKLQotICAgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7Ci0gICAgcE5ld0RhdGEtPnNGaWVsZE5hbWUgPSBtX0ZpZWxkTmFtZTsKLSAgICBwTmV3RGF0YS0+bkNvbnRyb2xJbmRleCA9IG1fbkZvcm1Db250cm9sSW5kZXg7Ci0gICAgcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKLQotICAgIGZvciAoaW50IGk9MCxzej1hcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICAgICAgcE5ld0RhdGEtPndvcmRhcnJheS5BZGQoYXJyYXkuR2V0QXQoaSkpOwotCi0gICAgbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7Ci19Ci0KLXZvaWQgRmllbGQ6OkFkZERlbGF5X1dpZGVTdHJpbmdBcnJheShlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0pTX1dpZGVTdHJpbmdBcnJheSYgYXJyYXkpCi17Ci0gICAgQVNTRVJUKG1fcEpTRG9jICE9IE5VTEwpOwotCi0gICAgQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPSBuZXcgQ0pTX0RlbGF5RGF0YTsKLSAgICBwTmV3RGF0YS0+c0ZpZWxkTmFtZSA9IG1fRmllbGROYW1lOwotICAgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKLSAgICBwTmV3RGF0YS0+ZVByb3AgPSBwcm9wOwotICAgIGZvciAoaW50IGk9MCxzej1hcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICAgICAgcE5ld0RhdGEtPndpZGVzdHJpbmdhcnJheS5BZGQoYXJyYXkuR2V0QXQoaSkpOwotCi0gICAgbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7Ci19Ci0KLXZvaWQgRmllbGQ6OkRvRGVsYXkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDSlNfRGVsYXlEYXRhKiBwRGF0YSkKLXsKLSAgICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotICAgIEFTU0VSVChwRGF0YSAhPSBOVUxMKTsKLQotICAgIHN3aXRjaCAocERhdGEtPmVQcm9wKQotICAgIHsKKyAgc3dpdGNoIChwRGF0YS0+ZVByb3ApIHsKICAgICBjYXNlIEZQX0FMSUdOTUVOVDoKLSAgICAgICAgRmllbGQ6OlNldEFsaWdubWVudChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPnN0cmluZyk7Ci0gICAgICAgIGJyZWFrOworICAgICAgRmllbGQ6OlNldEFsaWdubWVudChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPnN0cmluZyk7CisgICAgICBicmVhazsKICAgICBjYXNlIEZQX0JPUkRFUlNUWUxFOgotICAgICAgICBGaWVsZDo6U2V0Qm9yZGVyU3R5bGUocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5zdHJpbmcpOwotICAgICAgICBicmVhazsKKyAgICAgIEZpZWxkOjpTZXRCb3JkZXJTdHlsZShwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+c3RyaW5nKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfQlVUVE9OQUxJR05YOgotICAgICAgICBGaWVsZDo6U2V0QnV0dG9uQWxpZ25YKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBGaWVsZDo6U2V0QnV0dG9uQWxpZ25YKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bnVtKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfQlVUVE9OQUxJR05ZOgotICAgICAgICBGaWVsZDo6U2V0QnV0dG9uQWxpZ25ZKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBGaWVsZDo6U2V0QnV0dG9uQWxpZ25ZKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bnVtKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfQlVUVE9ORklUQk9VTkRTOgotICAgICAgICBGaWVsZDo6U2V0QnV0dG9uRml0Qm91bmRzKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Yik7Ci0gICAgICAgIGJyZWFrOworICAgICAgRmllbGQ6OlNldEJ1dHRvbkZpdEJvdW5kcyhwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPmIpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9CVVRUT05QT1NJVElPTjoKLSAgICAgICAgRmllbGQ6OlNldEJ1dHRvblBvc2l0aW9uKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBGaWVsZDo6U2V0QnV0dG9uUG9zaXRpb24ocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPm51bSk7CisgICAgICBicmVhazsKICAgICBjYXNlIEZQX0JVVFRPTlNDQUxFSE9XOgotICAgICAgICBGaWVsZDo6U2V0QnV0dG9uU2NhbGVIb3cocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOwotICAgICAgICBicmVhazsKKyAgICAgIEZpZWxkOjpTZXRCdXR0b25TY2FsZUhvdyhwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfQlVUVE9OU0NBTEVXSEVOOgotICAgICAgICBGaWVsZDo6U2V0QnV0dG9uU2NhbGVXaGVuKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBGaWVsZDo6U2V0QnV0dG9uU2NhbGVXaGVuKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfQ0FMQ09SREVSSU5ERVg6Ci0gICAgICAgIEZpZWxkOjpTZXRDYWxjT3JkZXJJbmRleChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPm51bSk7Ci0gICAgICAgIGJyZWFrOworICAgICAgRmllbGQ6OlNldENhbGNPcmRlckluZGV4KHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9DSEFSTElNSVQ6Ci0gICAgICAgIEZpZWxkOjpTZXRDaGFyTGltaXQocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOwotICAgICAgICBicmVhazsKKyAgICAgIEZpZWxkOjpTZXRDaGFyTGltaXQocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5udW0pOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9DT01COgotICAgICAgICBGaWVsZDo6U2V0Q29tYihwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPmIpOwotICAgICAgICBicmVhazsKKyAgICAgIEZpZWxkOjpTZXRDb21iKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmIpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9DT01NSVRPTlNFTENIQU5HRToKLSAgICAgICAgRmllbGQ6OlNldENvbW1pdE9uU2VsQ2hhbmdlKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Yik7Ci0gICAgICAgIGJyZWFrOworICAgICAgRmllbGQ6OlNldENvbW1pdE9uU2VsQ2hhbmdlKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5iKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfQ1VSUkVOVFZBTFVFSU5ESUNFUzoKLSAgICAgICAgRmllbGQ6OlNldEN1cnJlbnRWYWx1ZUluZGljZXMocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT53b3JkYXJyYXkpOwotICAgICAgICBicmVhazsKKyAgICAgIEZpZWxkOjpTZXRDdXJyZW50VmFsdWVJbmRpY2VzKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPndvcmRhcnJheSk7CisgICAgICBicmVhazsKICAgICBjYXNlIEZQX0RFRkFVTFRWQUxVRToKLSAgICAgICAgRmllbGQ6OlNldERlZmF1bHRWYWx1ZShwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPndpZGVzdHJpbmcpOwotICAgICAgICBicmVhazsKKyAgICAgIEZpZWxkOjpTZXREZWZhdWx0VmFsdWUocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT53aWRlc3RyaW5nKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfRE9OT1RTQ1JPTEw6Ci0gICAgICAgIEZpZWxkOjpTZXREb05vdFNjcm9sbChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPmIpOwotICAgICAgICBicmVhazsKKyAgICAgIEZpZWxkOjpTZXREb05vdFNjcm9sbChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+Yik7CisgICAgICBicmVhazsKICAgICBjYXNlIEZQX0RJU1BMQVk6Ci0gICAgICAgIEZpZWxkOjpTZXREaXNwbGF5KHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBGaWVsZDo6U2V0RGlzcGxheShwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5udW0pOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9GSUxMQ09MT1I6Ci0gICAgICAgIEZpZWxkOjpTZXRGaWxsQ29sb3IocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5jb2xvcik7Ci0gICAgICAgIGJyZWFrOworICAgICAgRmllbGQ6OlNldEZpbGxDb2xvcihwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmNvbG9yKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfSElEREVOOgotICAgICAgICBGaWVsZDo6U2V0SGlkZGVuKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Yik7Ci0gICAgICAgIGJyZWFrOworICAgICAgRmllbGQ6OlNldEhpZGRlbihwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmIpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9ISUdITElHSFQ6Ci0gICAgICAgIEZpZWxkOjpTZXRIaWdobGlnaHQocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5zdHJpbmcpOwotICAgICAgICBicmVhazsKKyAgICAgIEZpZWxkOjpTZXRIaWdobGlnaHQocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5zdHJpbmcpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9MSU5FV0lEVEg6Ci0gICAgICAgIEZpZWxkOjpTZXRMaW5lV2lkdGgocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOwotICAgICAgICBicmVhazsKKyAgICAgIEZpZWxkOjpTZXRMaW5lV2lkdGgocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5udW0pOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9NVUxUSUxJTkU6Ci0gICAgICAgIEZpZWxkOjpTZXRNdWx0aWxpbmUocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5iKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBGaWVsZDo6U2V0TXVsdGlsaW5lKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+Yik7CisgICAgICBicmVhazsKICAgICBjYXNlIEZQX01VTFRJUExFU0VMRUNUSU9OOgotICAgICAgICBGaWVsZDo6U2V0TXVsdGlwbGVTZWxlY3Rpb24ocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5iKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBGaWVsZDo6U2V0TXVsdGlwbGVTZWxlY3Rpb24ocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPmIpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9QQVNTV09SRDoKLSAgICAgICAgRmllbGQ6OlNldFBhc3N3b3JkKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Yik7Ci0gICAgICAgIGJyZWFrOworICAgICAgRmllbGQ6OlNldFBhc3N3b3JkKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfUkVDVDoKLSAgICAgICAgRmllbGQ6OlNldFJlY3QocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5yZWN0KTsKLSAgICAgICAgYnJlYWs7CisgICAgICBGaWVsZDo6U2V0UmVjdChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5yZWN0KTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfUklDSFRFWFQ6Ci0gICAgICAgIEZpZWxkOjpTZXRSaWNoVGV4dChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPmIpOwotICAgICAgICBicmVhazsKKyAgICAgIEZpZWxkOjpTZXRSaWNoVGV4dChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+Yik7CisgICAgICBicmVhazsKICAgICBjYXNlIEZQX1JJQ0hWQUxVRToKLSAgICAgICAgYnJlYWs7CisgICAgICBicmVhazsKICAgICBjYXNlIEZQX1JPVEFUSU9OOgotICAgICAgICBGaWVsZDo6U2V0Um90YXRpb24ocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOwotICAgICAgICBicmVhazsKKyAgICAgIEZpZWxkOjpTZXRSb3RhdGlvbihwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bnVtKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfU1RST0tFQ09MT1I6Ci0gICAgICAgIEZpZWxkOjpTZXRTdHJva2VDb2xvcihwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPmNvbG9yKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBGaWVsZDo6U2V0U3Ryb2tlQ29sb3IocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmNvbG9yKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfU1RZTEU6Ci0gICAgICAgIEZpZWxkOjpTZXRTdHlsZShwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPnN0cmluZyk7Ci0gICAgICAgIGJyZWFrOworICAgICAgRmllbGQ6OlNldFN0eWxlKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5zdHJpbmcpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9URVhUQ09MT1I6Ci0gICAgICAgIEZpZWxkOjpTZXRUZXh0Q29sb3IocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5jb2xvcik7Ci0gICAgICAgIGJyZWFrOworICAgICAgRmllbGQ6OlNldFRleHRDb2xvcihwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmNvbG9yKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRlBfVEVYVEZPTlQ6Ci0gICAgICAgIEZpZWxkOjpTZXRUZXh0Rm9udChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPnN0cmluZyk7Ci0gICAgICAgIGJyZWFrOworICAgICAgRmllbGQ6OlNldFRleHRGb250KHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5zdHJpbmcpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9URVhUU0laRToKLSAgICAgICAgRmllbGQ6OlNldFRleHRTaXplKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBGaWVsZDo6U2V0VGV4dFNpemUocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm51bSk7CisgICAgICBicmVhazsKICAgICBjYXNlIEZQX1VTRVJOQU1FOgotICAgICAgICBGaWVsZDo6U2V0VXNlck5hbWUocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT53aWRlc3RyaW5nKTsKLSAgICAgICAgYnJlYWs7CisgICAgICBGaWVsZDo6U2V0VXNlck5hbWUocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPndpZGVzdHJpbmcpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBGUF9WQUxVRToKLSAgICAgICAgRmllbGQ6OlNldFZhbHVlKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+d2lkZXN0cmluZ2FycmF5KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgICAgRmllbGQ6OlNldFZhbHVlKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT53aWRlc3RyaW5nYXJyYXkpOworICAgICAgYnJlYWs7CisgIH0KIH0KIAotI2RlZmluZSBKU19GSUVMRF9NSU5XSURUSCAgIDEKLSNkZWZpbmUgSlNfRklFTERfTUlOSEVJR0hUICAxCisjZGVmaW5lIEpTX0ZJRUxEX01JTldJRFRIIDEKKyNkZWZpbmUgSlNfRklFTERfTUlOSEVJR0hUIDEKIAotdm9pZCBGaWVsZDo6QWRkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBpbnQgblBhZ2VJbmRleCwgaW50IG5GaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUsIGNvbnN0IENQREZfUmVjdCYgcmNDb29yZHMpCi17Ci0gICAgLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6QWRkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgaW50IG5QYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbkZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNDb29yZHMpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9JY29uLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSWNvbi5jcHAKaW5kZXggNmIzZTAyZS4uMGU5NmEwNSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9JY29uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ljb24uY3BwCkBAIC0xNyw1MSArMTcsNDIgQEAKIEVORF9KU19TVEFUSUNfQ09OU1QoKQogCiBCRUdJTl9KU19TVEFUSUNfUFJPUChDSlNfSWNvbikKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShuYW1lKQorSlNfU1RBVElDX1BST1BfRU5UUlkobmFtZSkKIEVORF9KU19TVEFUSUNfUFJPUCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19NRVRIT0QoQ0pTX0ljb24pCiBFTkRfSlNfU1RBVElDX01FVEhPRCgpCiAKLUlNUExFTUVOVF9KU19DTEFTUyhDSlNfSWNvbixJY29uKQorSU1QTEVNRU5UX0pTX0NMQVNTKENKU19JY29uLCBJY29uKQogCi1JY29uOjpJY29uKENKU19PYmplY3QqIHBKU09iamVjdCkgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSwKLQltX3BJY29uU3RyZWFtKE5VTEwpLAotCW1fc3dJY29uTmFtZShMIiIpCi17CitJY29uOjpJY29uKENKU19PYmplY3QqIHBKU09iamVjdCkKKyAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLCBtX3BJY29uU3RyZWFtKE5VTEwpLCBtX3N3SWNvbk5hbWUoTCIiKSB7fQorCitJY29uOjp+SWNvbigpIHt9CisKK3ZvaWQgSWNvbjo6U2V0U3RyZWFtKENQREZfU3RyZWFtKiBwSWNvblN0cmVhbSkgeworICBpZiAocEljb25TdHJlYW0pCisgICAgbV9wSWNvblN0cmVhbSA9IHBJY29uU3RyZWFtOwogfQogCi1JY29uOjp+SWNvbigpCi17Ci0KK0NQREZfU3RyZWFtKiBJY29uOjpHZXRTdHJlYW0oKSB7CisgIHJldHVybiBtX3BJY29uU3RyZWFtOwogfQogCi12b2lkIEljb246OlNldFN0cmVhbShDUERGX1N0cmVhbSogcEljb25TdHJlYW0pCi17Ci0JaWYocEljb25TdHJlYW0pCi0JCW1fcEljb25TdHJlYW0gPSBwSWNvblN0cmVhbTsKK3ZvaWQgSWNvbjo6U2V0SWNvbk5hbWUoQ0ZYX1dpZGVTdHJpbmcgbmFtZSkgeworICBtX3N3SWNvbk5hbWUgPSBuYW1lOwogfQogCi1DUERGX1N0cmVhbSogSWNvbjo6R2V0U3RyZWFtKCkKLXsKLQlyZXR1cm4gbV9wSWNvblN0cmVhbTsKK0NGWF9XaWRlU3RyaW5nIEljb246OkdldEljb25OYW1lKCkgeworICByZXR1cm4gbV9zd0ljb25OYW1lOwogfQogCi12b2lkIEljb246OlNldEljb25OYW1lKENGWF9XaWRlU3RyaW5nIG5hbWUpCi17Ci0JbV9zd0ljb25OYW1lID0gbmFtZTsKK0ZYX0JPT0wgSWNvbjo6bmFtZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghdnAuSXNHZXR0aW5nKCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHZwIDw8IG1fc3dJY29uTmFtZTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci0KLUNGWF9XaWRlU3RyaW5nIEljb246OkdldEljb25OYW1lKCkKLXsKLQlyZXR1cm4gbV9zd0ljb25OYW1lOwotfQotCi1GWF9CT09MIEljb246Om5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7Ci0KLQl2cCA8PCBtX3N3SWNvbk5hbWU7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0NvbnRleHQuY3BwCmluZGV4IGU3ODk2NTcuLjljMTQyZTYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmNwcApAQCAtMTQsMzM4ICsxNCwzNDYgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX0NvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ0pTX0NvbnRleHQ6OkNKU19Db250ZXh0KENKU19SdW50aW1lKiBwUnVudGltZSkgOgotCW1fcFJ1bnRpbWUocFJ1bnRpbWUpLAotCW1fYkJ1c3koRkFMU0UpLAotCW1fYk1zZ0JveEVuYWJsZShUUlVFKQotewotCW1fcEV2ZW50SGFuZGxlciA9IG5ldyBDSlNfRXZlbnRIYW5kbGVyKHRoaXMpOworQ0pTX0NvbnRleHQ6OkNKU19Db250ZXh0KENKU19SdW50aW1lKiBwUnVudGltZSkKKyAgICA6IG1fcFJ1bnRpbWUocFJ1bnRpbWUpLCBtX2JCdXN5KEZBTFNFKSwgbV9iTXNnQm94RW5hYmxlKFRSVUUpIHsKKyAgbV9wRXZlbnRIYW5kbGVyID0gbmV3IENKU19FdmVudEhhbmRsZXIodGhpcyk7CiB9CiAKLUNKU19Db250ZXh0Ojp+Q0pTX0NvbnRleHQodm9pZCkKLXsKLSAgICBkZWxldGUgbV9wRXZlbnRIYW5kbGVyOworQ0pTX0NvbnRleHQ6On5DSlNfQ29udGV4dCh2b2lkKSB7CisgIGRlbGV0ZSBtX3BFdmVudEhhbmRsZXI7CiB9CiAKLUNQREZTREtfRG9jdW1lbnQqIENKU19Db250ZXh0OjpHZXRSZWFkZXJEb2N1bWVudCgpCi17Ci0JQVNTRVJUKG1fcFJ1bnRpbWUgIT0gTlVMTCk7CitDUERGU0RLX0RvY3VtZW50KiBDSlNfQ29udGV4dDo6R2V0UmVhZGVyRG9jdW1lbnQoKSB7CisgIEFTU0VSVChtX3BSdW50aW1lICE9IE5VTEwpOwogCi0JcmV0dXJuIG1fcFJ1bnRpbWUtPkdldFJlYWRlckRvY3VtZW50KCk7CisgIHJldHVybiBtX3BSdW50aW1lLT5HZXRSZWFkZXJEb2N1bWVudCgpOwogfQogCi1DUERGRG9jX0Vudmlyb25tZW50KiBDSlNfQ29udGV4dDo6R2V0UmVhZGVyQXBwKCkKLXsKLQlBU1NFUlQobV9wUnVudGltZSAhPSBOVUxMKTsKK0NQREZEb2NfRW52aXJvbm1lbnQqIENKU19Db250ZXh0OjpHZXRSZWFkZXJBcHAoKSB7CisgIEFTU0VSVChtX3BSdW50aW1lICE9IE5VTEwpOwogCi0JcmV0dXJuIG1fcFJ1bnRpbWUtPkdldFJlYWRlckFwcCgpOworICByZXR1cm4gbV9wUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7CiB9CiAKLUZYX0JPT0wgQ0pTX0NvbnRleHQ6OkRvSm9iKGludCBuTW9kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pCi17Ci0JaWYgKG1fYkJ1c3kpCi0JewotCQlpbmZvID0gSlNHZXRTdHJpbmdGcm9tSUQodGhpcywgSURTX1NUUklOR19KU0JVU1kpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQorRlhfQk9PTCBDSlNfQ29udGV4dDo6RG9Kb2IoaW50IG5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBpbmZvKSB7CisgIGlmIChtX2JCdXN5KSB7CisgICAgaW5mbyA9IEpTR2V0U3RyaW5nRnJvbUlEKHRoaXMsIElEU19TVFJJTkdfSlNCVVNZKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCW1fYkJ1c3kgPSBUUlVFOworICBtX2JCdXN5ID0gVFJVRTsKIAotCUFTU0VSVChtX3BSdW50aW1lICE9IE5VTEwpOwotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlci0+SXNWYWxpZCgpKTsKKyAgQVNTRVJUKG1fcFJ1bnRpbWUgIT0gTlVMTCk7CisgIEFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CisgIEFTU0VSVChtX3BFdmVudEhhbmRsZXItPklzVmFsaWQoKSk7CiAKLQlpZiAoIW1fcFJ1bnRpbWUtPkFkZEV2ZW50VG9Mb29wKG1fcEV2ZW50SGFuZGxlci0+VGFyZ2V0TmFtZSgpLCBtX3BFdmVudEhhbmRsZXItPkV2ZW50VHlwZSgpKSkKLQl7Ci0JCWluZm8gPSBKU0dldFN0cmluZ0Zyb21JRCh0aGlzLCBJRFNfU1RSSU5HX0pTRVZFTlQpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICBpZiAoIW1fcFJ1bnRpbWUtPkFkZEV2ZW50VG9Mb29wKG1fcEV2ZW50SGFuZGxlci0+VGFyZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEV2ZW50SGFuZGxlci0+RXZlbnRUeXBlKCkpKSB7CisgICAgaW5mbyA9IEpTR2V0U3RyaW5nRnJvbUlEKHRoaXMsIElEU19TVFJJTkdfSlNFVkVOVCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlGWEpTRXJyIGVycm9yID17TlVMTCxOVUxMLCAwfTsKLQlpbnQgblJldCA9IDA7CisgIEZYSlNFcnIgZXJyb3IgPSB7TlVMTCwgTlVMTCwgMH07CisgIGludCBuUmV0ID0gMDsKIAotCWlmIChzY3JpcHQuR2V0TGVuZ3RoKCkgPiAwKQotCXsKLQkJaWYgKG5Nb2RlID09IDApCi0JCXsKLQkJCW5SZXQgPSBKU19FeGVjdXRlKCptX3BSdW50aW1lLCB0aGlzLCBzY3JpcHQuY19zdHIoKSwgc2NyaXB0LkdldExlbmd0aCgpLCAmZXJyb3IpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJblJldCA9IEpTX1BhcnNlKCptX3BSdW50aW1lLCB0aGlzLCBzY3JpcHQuY19zdHIoKSwgc2NyaXB0LkdldExlbmd0aCgpLCAmZXJyb3IpOwotCQl9Ci0JfQorICBpZiAoc2NyaXB0LkdldExlbmd0aCgpID4gMCkgeworICAgIGlmIChuTW9kZSA9PSAwKSB7CisgICAgICBuUmV0ID0gSlNfRXhlY3V0ZSgqbV9wUnVudGltZSwgdGhpcywgc2NyaXB0LmNfc3RyKCksIHNjcmlwdC5HZXRMZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIG5SZXQgPSBKU19QYXJzZSgqbV9wUnVudGltZSwgdGhpcywgc2NyaXB0LmNfc3RyKCksIHNjcmlwdC5HZXRMZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgIH0KKyAgfQogCi0JaWYgKG5SZXQgPCAwKQotCXsKLQkJQ0ZYX1dpZGVTdHJpbmcgc0xpbmU7Ci0JCXNMaW5lLkZvcm1hdChMIlsgTGluZTogJTA1ZCB7ICVzIH0gXSA6ICVzIixlcnJvci5saW5udW0tMSxlcnJvci5zcmNsaW5lLGVycm9yLm1lc3NhZ2UpOworICBpZiAoblJldCA8IDApIHsKKyAgICBDRlhfV2lkZVN0cmluZyBzTGluZTsKKyAgICBzTGluZS5Gb3JtYXQoTCJbIExpbmU6ICUwNWQgeyAlcyB9IF0gOiAlcyIsIGVycm9yLmxpbm51bSAtIDEsIGVycm9yLnNyY2xpbmUsCisgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOwogCi0vLwkJCVRSQUNFKEwiLyogLS0tLS0tLS0tLS0tLS0gSlMgRXJyb3IgLS0tLS0tLS0tLS0tLS0gKi9cbiIpOwotLy8JCQlUUkFDRShzTGluZSk7Ci0vLwkJCVRSQUNFKEwiXG4iKTsKLQkJLy9DRlhfQnl0ZVN0cmluZyBzVGVtcCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShlcnJvci5tZXNzYWdlKTsKLQkJaW5mbyArPSBzTGluZTsKLQl9Ci0JZWxzZQotCXsKLQkJaW5mbyA9IEpTR2V0U3RyaW5nRnJvbUlEKHRoaXMsIElEU19TVFJJTkdfUlVOKTsKLQl9CisgICAgLy8JCQlUUkFDRShMIi8qIC0tLS0tLS0tLS0tLS0tIEpTIEVycm9yIC0tLS0tLS0tLS0tLS0tCisgICAgLy8qL1xuIik7CisgICAgLy8JCQlUUkFDRShzTGluZSk7CisgICAgLy8JCQlUUkFDRShMIlxuIik7CisgICAgLy8gQ0ZYX0J5dGVTdHJpbmcgc1RlbXAgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoZXJyb3IubWVzc2FnZSk7CisgICAgaW5mbyArPSBzTGluZTsKKyAgfSBlbHNlIHsKKyAgICBpbmZvID0gSlNHZXRTdHJpbmdGcm9tSUQodGhpcywgSURTX1NUUklOR19SVU4pOworICB9CiAKLQltX3BSdW50aW1lLT5SZW1vdmVFdmVudEluTG9vcChtX3BFdmVudEhhbmRsZXItPlRhcmdldE5hbWUoKSwgbV9wRXZlbnRIYW5kbGVyLT5FdmVudFR5cGUoKSk7CisgIG1fcFJ1bnRpbWUtPlJlbW92ZUV2ZW50SW5Mb29wKG1fcEV2ZW50SGFuZGxlci0+VGFyZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BFdmVudEhhbmRsZXItPkV2ZW50VHlwZSgpKTsKIAotCW1fcEV2ZW50SGFuZGxlci0+RGVzdHJveSgpOwotCW1fYkJ1c3kgPSBGQUxTRTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5EZXN0cm95KCk7CisgIG1fYkJ1c3kgPSBGQUxTRTsKIAotCXJldHVybiBuUmV0ID49IDA7CisgIHJldHVybiBuUmV0ID49IDA7CiB9CiAKLUZYX0JPT0wgQ0pTX0NvbnRleHQ6OlJ1blNjcmlwdChjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbykKLXsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOwotCXY4OjpMb2NrZXIgbG9ja2VyKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOwotCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IG1fcFJ1bnRpbWUtPk5ld0pTQ29udGV4dCgpOwotCXY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOworRlhfQk9PTCBDSlNfQ29udGV4dDo6UnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUobV9wUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkxvY2tlciBsb2NrZXIobV9wUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBtX3BSdW50aW1lLT5OZXdKU0NvbnRleHQoKTsKKyAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7CiAKLQlyZXR1cm4gRG9Kb2IoMCwgc2NyaXB0LCBpbmZvKTsKKyAgcmV0dXJuIERvSm9iKDAsIHNjcmlwdCwgaW5mbyk7CiB9CiAKLUZYX0JPT0wgQ0pTX0NvbnRleHQ6OkNvbXBpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pCi17Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUobV9wUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKLQl2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7Ci0Jdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9wUnVudGltZS0+TmV3SlNDb250ZXh0KCk7Ci0Jdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7CitGWF9CT09MIENKU19Db250ZXh0OjpDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBpbmZvKSB7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUobV9wUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9wUnVudGltZS0+TmV3SlNDb250ZXh0KCk7CisgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwogCi0JcmV0dXJuIERvSm9iKDEsIHNjcmlwdCwgaW5mbyk7CisgIHJldHVybiBEb0pvYigxLCBzY3JpcHQsIGluZm8pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkFwcF9Jbml0KCkKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25BcHBfSW5pdCgpOwordm9pZCBDSlNfQ29udGV4dDo6T25BcHBfSW5pdCgpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkFwcF9Jbml0KCk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRG9jX09wZW4oQ1BERlNES19Eb2N1bWVudCogcERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnN0clRhcmdldE5hbWUpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRG9jX09wZW4ocERvYyxzdHJUYXJnZXROYW1lKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRG9jX09wZW4oQ1BERlNES19Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkRvY19PcGVuKHBEb2MsIHN0clRhcmdldE5hbWUpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkRvY19XaWxsUHJpbnQoQ1BERlNES19Eb2N1bWVudCogcERvYykKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25Eb2NfV2lsbFByaW50KHBEb2MpOwordm9pZCBDSlNfQ29udGV4dDo6T25Eb2NfV2lsbFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkRvY19XaWxsUHJpbnQocERvYyk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRG9jX0RpZFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRG9jX0RpZFByaW50KHBEb2MpOwordm9pZCBDSlNfQ29udGV4dDo6T25Eb2NfRGlkUHJpbnQoQ1BERlNES19Eb2N1bWVudCogcERvYykgeworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOworICBtX3BFdmVudEhhbmRsZXItPk9uRG9jX0RpZFByaW50KHBEb2MpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkRvY19XaWxsU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkRvY19XaWxsU2F2ZShwRG9jKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRG9jX1dpbGxTYXZlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkRvY19XaWxsU2F2ZShwRG9jKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25Eb2NfRGlkU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkRvY19EaWRTYXZlKHBEb2MpOwordm9pZCBDSlNfQ29udGV4dDo6T25Eb2NfRGlkU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIEFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CisgIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfRGlkU2F2ZShwRG9jKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25Eb2NfV2lsbENsb3NlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRG9jX1dpbGxDbG9zZShwRG9jKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRG9jX1dpbGxDbG9zZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIEFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CisgIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfV2lsbENsb3NlKHBEb2MpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblBhZ2VfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PblBhZ2VfT3BlbihwVGFyZ2V0KTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uUGFnZV9PcGVuKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblBhZ2VfT3BlbihwVGFyZ2V0KTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25QYWdlX0Nsb3NlKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uUGFnZV9DbG9zZShwVGFyZ2V0KTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uUGFnZV9DbG9zZShDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSB7CisgIEFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CisgIG1fcEV2ZW50SGFuZGxlci0+T25QYWdlX0Nsb3NlKHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblBhZ2VfSW5WaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uUGFnZV9JblZpZXcocFRhcmdldCk7Cit2b2lkIENKU19Db250ZXh0OjpPblBhZ2VfSW5WaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblBhZ2VfSW5WaWV3KHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblBhZ2VfT3V0VmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PblBhZ2VfT3V0VmlldyhwVGFyZ2V0KTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblBhZ2VfT3V0VmlldyhwVGFyZ2V0KTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSB7CisgIEFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCkKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZUVudGVyKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0KTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgeworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOworICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfTW91c2VFbnRlcihiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfTW91c2VFeGl0KGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0KTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgeworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOworICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfTW91c2VFeGl0KGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0KTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfTW91c2VVcChiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCk7Cit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlVXAoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Gb2N1cyhiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCwgVmFsdWUpOwordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0ZvY3VzKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfQmx1cihiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCwgVmFsdWUpOwordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgeworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOworICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfQmx1cihiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCwgVmFsdWUpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0NhbGN1bGF0ZShwU291cmNlLCBwVGFyZ2V0LCBWYWx1ZSwgYlJjKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0NhbGN1bGF0ZShwU291cmNlLCBwVGFyZ2V0LCBWYWx1ZSwgYlJjKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCkKLXsKLSAgICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfRm9ybWF0KHBUYXJnZXQsIFZhbHVlLCBiV2lsbENvbW1pdCk7Cit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpbGxDb21taXQpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0Zvcm1hdChwVGFyZ2V0LCBWYWx1ZSwgYldpbGxDb21taXQpOwogfQogCi0KLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKLQkJCQkJCQkJCUZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLCBpbnQgJm5TZWxFbmQsaW50ICZuU2VsU3RhcnQsCi0JCQkJCQkJCQlGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKLQkJCQkJCQkJCUZYX0JPT0wgYldpbGxDb21taXQsIEZYX0JPT0wgYkZpZWxkRnVsbCwgRlhfQk9PTCYgYlJjKQotewotICAgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9LZXlzdHJva2UoCi0gICAgICAgIHN0ckNoYW5nZSwgc3RyQ2hhbmdlRXgsIGJLZXlEb3duLCBiTW9kaWZpZXIsIG5TZWxFbmQsIG5TZWxTdGFydCwKLSAgICAgICAgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSwgYldpbGxDb21taXQsIGJGaWVsZEZ1bGwsIGJSYyk7Cit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0tleXN0cm9rZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lsbENvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpZWxkRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYykgeworICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfS2V5c3Ryb2tlKAorICAgICAgc3RyQ2hhbmdlLCBzdHJDaGFuZ2VFeCwgYktleURvd24sIGJNb2RpZmllciwgblNlbEVuZCwgblNlbFN0YXJ0LCBiU2hpZnQsCisgICAgICBwVGFyZ2V0LCBWYWx1ZSwgYldpbGxDb21taXQsIGJGaWVsZEZ1bGwsIGJSYyk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSxjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCi0JCQkJCQkJCSAgIEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0JCQkJCQkJCSAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX1ZhbGlkYXRlKHN0ckNoYW5nZSwgc3RyQ2hhbmdlRXgsIGJLZXlEb3duLCBiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCwgVmFsdWUsIGJSYyk7Cit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX1ZhbGlkYXRlKHN0ckNoYW5nZSwgc3RyQ2hhbmdlRXgsIGJLZXlEb3duLCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2hpZnQsIHBUYXJnZXQsIFZhbHVlLCBiUmMpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX0ZvY3VzKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIEFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CisgIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fRm9jdXMoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fQmx1cihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOworICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX0JsdXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fT3BlbihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOworICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX09wZW4oYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9DbG9zZShGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX0Nsb3NlKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIEFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CisgIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fQ2xvc2UoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fTW91c2VEb3duKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VVcChiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOworICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX01vdXNlVXAoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VFbnRlcihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOworICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX01vdXNlRW50ZXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZUV4aXQoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZUV4aXQoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9JblZpZXcoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9JblZpZXcoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fT3V0VmlldyhiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOworICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX091dFZpZXcoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkJvb2ttYXJrX01vdXNlVXAocEJvb2tNYXJrKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkJvb2ttYXJrX01vdXNlVXAocEJvb2tNYXJrKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25MaW5rX01vdXNlVXAoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25MaW5rX01vdXNlVXAocFRhcmdldCk7Cit2b2lkIENKU19Db250ZXh0OjpPbkxpbmtfTW91c2VVcChDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSB7CisgIEFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7CisgIG1fcEV2ZW50SGFuZGxlci0+T25MaW5rX01vdXNlVXAocFRhcmdldCk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uQ29uc29sZV9FeGVjKCkKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25Db25zb2xlX0V4ZWMoKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uQ29uc29sZV9FeGVjKCkgeworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOworICBtX3BFdmVudEhhbmRsZXItPk9uQ29uc29sZV9FeGVjKCk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRXh0ZXJuYWxfRXhlYygpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRXh0ZXJuYWxfRXhlYygpOwordm9pZCBDSlNfQ29udGV4dDo6T25FeHRlcm5hbF9FeGVjKCkgeworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOworICBtX3BFdmVudEhhbmRsZXItPk9uRXh0ZXJuYWxfRXhlYygpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkJhdGNoRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkJhdGNoRXhlYyhwVGFyZ2V0KTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uQmF0Y2hFeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkJhdGNoRXhlYyhwVGFyZ2V0KTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25NZW51X0V4ZWMoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCxjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25NZW51X0V4ZWMocFRhcmdldCwgc3RyVGFyZ2V0TmFtZSk7Cit2b2lkIENKU19Db250ZXh0OjpPbk1lbnVfRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpIHsKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5Pbk1lbnVfRXhlYyhwVGFyZ2V0LCBzdHJUYXJnZXROYW1lKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuY3BwCmluZGV4IDE3NjllMzAuLjFlZWU5MmQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAKQEAgLTE3LDUxMSArMTcsNTM2IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX0V2ZW50SGFuZGxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNKU19FdmVudEhhbmRsZXI6OkNKU19FdmVudEhhbmRsZXIoQ0pTX0NvbnRleHQgKiBwQ29udGV4dCkgICA6Ci0gICAgbV9wSlNDb250ZXh0KHBDb250ZXh0KSwKLSAgICBtX2VFdmVudFR5cGUoSkVUX1VOS05PV04pLAotICAgIG1fYlZhbGlkKEZBTFNFKSwKLSAgICBtX3BXaWRlU3RyQ2hhbmdlKE5VTEwpLAotICAgIG1fbkNvbW1pdEtleSgtMSksCi0gICAgbV9iS2V5RG93bihGQUxTRSksCi0gICAgbV9iTW9kaWZpZXIoRkFMU0UpLAotICAgIG1fYlNoaWZ0KEZBTFNFKSwKLSAgICBtX3BJU2VsRW5kKE5VTEwpLAotICAgIG1fblNlbEVuZER1KDApLAotICAgIG1fcElTZWxTdGFydChOVUxMKSwKLSAgICBtX25TZWxTdGFydER1KDApLAotICAgIG1fYldpbGxDb21taXQoRkFMU0UpLAotICAgIG1fcFZhbHVlKE5VTEwpLAotICAgIG1fYkZpZWxkRnVsbChGQUxTRSksCi0gICAgbV9wYlJjKE5VTEwpLAotICAgIG1fYlJjRHUoRkFMU0UpLAotICAgIG1fcFNvdXJjZURvYyhOVUxMKSwKLSAgICBtX3BUYXJnZXRCb29rTWFyayhOVUxMKSwKLSAgICBtX3BUYXJnZXREb2MoTlVMTCksCi0gICAgbV9wVGFyZ2V0QW5ub3QoTlVMTCkKLXsKK0NKU19FdmVudEhhbmRsZXI6OkNKU19FdmVudEhhbmRsZXIoQ0pTX0NvbnRleHQqIHBDb250ZXh0KQorICAgIDogbV9wSlNDb250ZXh0KHBDb250ZXh0KSwKKyAgICAgIG1fZUV2ZW50VHlwZShKRVRfVU5LTk9XTiksCisgICAgICBtX2JWYWxpZChGQUxTRSksCisgICAgICBtX3BXaWRlU3RyQ2hhbmdlKE5VTEwpLAorICAgICAgbV9uQ29tbWl0S2V5KC0xKSwKKyAgICAgIG1fYktleURvd24oRkFMU0UpLAorICAgICAgbV9iTW9kaWZpZXIoRkFMU0UpLAorICAgICAgbV9iU2hpZnQoRkFMU0UpLAorICAgICAgbV9wSVNlbEVuZChOVUxMKSwKKyAgICAgIG1fblNlbEVuZER1KDApLAorICAgICAgbV9wSVNlbFN0YXJ0KE5VTEwpLAorICAgICAgbV9uU2VsU3RhcnREdSgwKSwKKyAgICAgIG1fYldpbGxDb21taXQoRkFMU0UpLAorICAgICAgbV9wVmFsdWUoTlVMTCksCisgICAgICBtX2JGaWVsZEZ1bGwoRkFMU0UpLAorICAgICAgbV9wYlJjKE5VTEwpLAorICAgICAgbV9iUmNEdShGQUxTRSksCisgICAgICBtX3BTb3VyY2VEb2MoTlVMTCksCisgICAgICBtX3BUYXJnZXRCb29rTWFyayhOVUxMKSwKKyAgICAgIG1fcFRhcmdldERvYyhOVUxMKSwKKyAgICAgIG1fcFRhcmdldEFubm90KE5VTEwpIHt9CisKK0NKU19FdmVudEhhbmRsZXI6On5DSlNfRXZlbnRIYW5kbGVyKCkge30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkFwcF9Jbml0KCkgeworICBJbml0aWFsKEpFVF9BUFBfSU5JVCk7CiB9CiAKLUNKU19FdmVudEhhbmRsZXI6On5DSlNfRXZlbnRIYW5kbGVyKCkKLXsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSB7CisgIEluaXRpYWwoSkVUX0RPQ19PUEVOKTsKKworICBtX3BUYXJnZXREb2MgPSBwRG9jOworICBtX3N0clRhcmdldE5hbWUgPSBzdHJUYXJnZXROYW1lOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uQXBwX0luaXQoKQotewotICAgIEluaXRpYWwoSkVUX0FQUF9JTklUKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfV2lsbFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpIHsKKyAgSW5pdGlhbChKRVRfRE9DX1dJTExQUklOVCk7CisKKyAgbV9wVGFyZ2V0RG9jID0gcERvYzsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkRvY19PcGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKQotewotICAgIEluaXRpYWwoSkVUX0RPQ19PUEVOKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfRGlkUHJpbnQoQ1BERlNES19Eb2N1bWVudCogcERvYykgeworICBJbml0aWFsKEpFVF9ET0NfRElEUFJJTlQpOwogCi0gICAgbV9wVGFyZ2V0RG9jID0gcERvYzsKLSAgICBtX3N0clRhcmdldE5hbWUgPSBzdHJUYXJnZXROYW1lOworICBtX3BUYXJnZXREb2MgPSBwRG9jOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX1dpbGxQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotICAgIEluaXRpYWwoSkVUX0RPQ19XSUxMUFJJTlQpOwotCi0gICAgbV9wVGFyZ2V0RG9jID0gcERvYzsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfV2lsbFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYykgeworICBJbml0aWFsKEpFVF9ET0NfV0lMTFNBVkUpOworICBtX3BUYXJnZXREb2MgPSBwRG9jOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX0RpZFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpCi17Ci0gICAgSW5pdGlhbChKRVRfRE9DX0RJRFBSSU5UKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfRGlkU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIEluaXRpYWwoSkVUX0RPQ19ESURTQVZFKTsKIAotICAgIG1fcFRhcmdldERvYyA9IHBEb2M7CisgIG1fcFRhcmdldERvYyA9IHBEb2M7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfV2lsbFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYykKLXsKLSAgICBJbml0aWFsKEpFVF9ET0NfV0lMTFNBVkUpOwotICAgIG1fcFRhcmdldERvYyA9IHBEb2M7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX1dpbGxDbG9zZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIEluaXRpYWwoSkVUX0RPQ19XSUxMQ0xPU0UpOworCisgIG1fcFRhcmdldERvYyA9IHBEb2M7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfRGlkU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotICAgIEluaXRpYWwoSkVUX0RPQ19ESURTQVZFKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25QYWdlX09wZW4oQ1BERlNES19Eb2N1bWVudCogcERvYykgeworICBJbml0aWFsKEpFVF9QQUdFX09QRU4pOwogCi0gICAgbV9wVGFyZ2V0RG9jID0gcERvYzsKKyAgbV9wVGFyZ2V0RG9jID0gcERvYzsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcERvYykKLXsKLSAgICBJbml0aWFsKEpFVF9ET0NfV0lMTENMT1NFKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25QYWdlX0Nsb3NlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpIHsKKyAgSW5pdGlhbChKRVRfUEFHRV9DTE9TRSk7CiAKLSAgICBtX3BUYXJnZXREb2MgPSBwRG9jOworICBtX3BUYXJnZXREb2MgPSBwRG9jOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uUGFnZV9PcGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2MpCi17Ci0gICAgSW5pdGlhbChKRVRfUEFHRV9PUEVOKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIEluaXRpYWwoSkVUX1BBR0VfSU5WSUVXKTsKIAotICAgIG1fcFRhcmdldERvYyA9IHBEb2M7CisgIG1fcFRhcmdldERvYyA9IHBEb2M7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25QYWdlX0Nsb3NlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpCi17Ci0gICAgSW5pdGlhbChKRVRfUEFHRV9DTE9TRSk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBEb2MpIHsKKyAgSW5pdGlhbChKRVRfUEFHRV9PVVRWSUVXKTsKIAotICAgIG1fcFRhcmdldERvYyA9IHBEb2M7CisgIG1fcFRhcmdldERvYyA9IHBEb2M7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotICAgIEluaXRpYWwoSkVUX1BBR0VfSU5WSUVXKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgeworICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRUVOVEVSKTsKIAotICAgIG1fcFRhcmdldERvYyA9IHBEb2M7CisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKworICBBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblBhZ2VfT3V0VmlldyhDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotICAgIEluaXRpYWwoSkVUX1BBR0VfT1VUVklFVyk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIHsKKyAgSW5pdGlhbChKRVRfRklFTERfTU9VU0VFWElUKTsKIAotICAgIG1fcFRhcmdldERvYyA9IHBEb2M7CisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgQVNTRVJUKHBUYXJnZXQgIT0gTlVMTCk7CisgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpCi17Ci0gICAgSW5pdGlhbChKRVRfRklFTERfTU9VU0VFTlRFUik7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VEb3duKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIHsKKyAgSW5pdGlhbChKRVRfRklFTERfTU9VU0VET1dOKTsKKyAgbV9lRXZlbnRUeXBlID0gSkVUX0ZJRUxEX01PVVNFRE9XTjsKIAotICAgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICAgIG1fYlNoaWZ0ID0gYlNoaWZ0OwotCi0gICAgQVNTRVJUKHBUYXJnZXQgIT0gTlVMTCk7Ci0gICAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQotewotICAgIEluaXRpYWwoSkVUX0ZJRUxEX01PVVNFRVhJVCk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIHsKKyAgSW5pdGlhbChKRVRfRklFTERfTU9VU0VVUCk7CiAKLSAgICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgICBBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKLSAgICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIEFTU0VSVChwVGFyZ2V0ICE9IE5VTEwpOworICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VEb3duKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpCi17Ci0gICAgSW5pdGlhbChKRVRfRklFTERfTU9VU0VET1dOKTsKLSAgICBtX2VFdmVudFR5cGUgPSBKRVRfRklFTERfTU9VU0VET1dOOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgeworICBJbml0aWFsKEpFVF9GSUVMRF9GT0NVUyk7CiAKLSAgICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgICBBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKLSAgICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIEFTU0VSVChwVGFyZ2V0ICE9IE5VTEwpOworICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOworICBtX3BWYWx1ZSA9IChDRlhfV2lkZVN0cmluZyopJlZhbHVlOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQotewotICAgIEluaXRpYWwoSkVUX0ZJRUxEX01PVVNFVVApOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSB7CisgIEluaXRpYWwoSkVUX0ZJRUxEX0JMVVIpOwogCi0gICAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0gICAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0gICAgQVNTRVJUKHBUYXJnZXQgIT0gTlVMTCk7Ci0gICAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmcqKSZWYWx1ZTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKQotewotICAgIEluaXRpYWwoSkVUX0ZJRUxEX0ZPQ1VTKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEtleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgblNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lsbENvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmllbGRGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpIHsKKyAgSW5pdGlhbChKRVRfRklFTERfS0VZU1RST0tFKTsKIAotICAgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICAgIG1fYlNoaWZ0ID0gYlNoaWZ0OwotICAgIEFTU0VSVChwVGFyZ2V0ICE9IE5VTEwpOwotICAgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Ci0gICAgbV9wVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmcqKSZWYWx1ZTsKKyAgbV9uQ29tbWl0S2V5ID0gMDsKKyAgbV9wV2lkZVN0ckNoYW5nZSA9ICZzdHJDaGFuZ2U7CisgIG1fV2lkZVN0ckNoYW5nZUV4ID0gc3RyQ2hhbmdlRXg7CisgIG1fYktleURvd24gPSBLZXlEb3duOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9wSVNlbEVuZCA9ICZuU2VsRW5kOworICBtX3BJU2VsU3RhcnQgPSAmblNlbFN0YXJ0OworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgQVNTRVJUKHBUYXJnZXQgIT0gTlVMTCk7CisgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7CisgIG1fcFZhbHVlID0gJlZhbHVlOworICBtX2JXaWxsQ29tbWl0ID0gYldpbGxDb21taXQ7CisgIG1fcGJSYyA9ICZiUmM7CisgIG1fYkZpZWxkRnVsbCA9IGJGaWVsZEZ1bGw7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCi17Ci0gICAgSW5pdGlhbChKRVRfRklFTERfQkxVUik7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJjKSB7CisgIEluaXRpYWwoSkVUX0ZJRUxEX1ZBTElEQVRFKTsKIAotICAgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICAgIG1fYlNoaWZ0ID0gYlNoaWZ0OwotICAgIEFTU0VSVChwVGFyZ2V0ICE9IE5VTEwpOwotICAgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Ci0gICAgbV9wVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmcqKSZWYWx1ZTsKKyAgbV9wV2lkZVN0ckNoYW5nZSA9ICZzdHJDaGFuZ2U7CisgIG1fV2lkZVN0ckNoYW5nZUV4ID0gc3RyQ2hhbmdlRXg7CisgIG1fYktleURvd24gPSBiS2V5RG93bjsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAmVmFsdWU7CisgIG1fcGJSYyA9ICZiUmM7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcgJnN0ckNoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIEtleURvd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLCBpbnQmIG5TZWxFbmQsIGludCYgblNlbFN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpZWxkRnVsbCwgRlhfQk9PTCYgYlJjKQotewotICAgIEluaXRpYWwoSkVUX0ZJRUxEX0tFWVNUUk9LRSk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpIHsKKyAgSW5pdGlhbChKRVRfRklFTERfQ0FMQ1VMQVRFKTsKIAotICAgIG1fbkNvbW1pdEtleSA9IDA7Ci0gICAgbV9wV2lkZVN0ckNoYW5nZSA9ICZzdHJDaGFuZ2U7Ci0gICAgbV9XaWRlU3RyQ2hhbmdlRXggPSBzdHJDaGFuZ2VFeDsKLSAgICBtX2JLZXlEb3duID0gS2V5RG93bjsKLSAgICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgICBtX3BJU2VsRW5kID0gJm5TZWxFbmQ7Ci0gICAgbV9wSVNlbFN0YXJ0ID0gJm5TZWxTdGFydDsKLSAgICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgICBBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKLSAgICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOwotICAgIG1fcFZhbHVlID0gJlZhbHVlOwotICAgIG1fYldpbGxDb21taXQgPSBiV2lsbENvbW1pdDsKLSAgICBtX3BiUmMgPSAmYlJjOwotICAgIG1fYkZpZWxkRnVsbCA9IGJGaWVsZEZ1bGw7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYykKLXsKLSAgICBJbml0aWFsKEpFVF9GSUVMRF9WQUxJREFURSk7Ci0KLSAgICBtX3BXaWRlU3RyQ2hhbmdlID0gJnN0ckNoYW5nZTsKLSAgICBtX1dpZGVTdHJDaGFuZ2VFeCA9IHN0ckNoYW5nZUV4OwotICAgIG1fYktleURvd24gPSBiS2V5RG93bjsKLSAgICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgICBBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKLSAgICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOwotICAgIG1fcFZhbHVlID0gJlZhbHVlOwotICAgIG1fcGJSYyA9ICZiUmM7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYykKLXsKLSAgICBJbml0aWFsKEpFVF9GSUVMRF9DQUxDVUxBVEUpOwotCi0gICAgaWYgKHBTb3VyY2UpCi0gICAgICAgIG1fc3RyU291cmNlTmFtZSA9IHBTb3VyY2UtPkdldEZ1bGxOYW1lKCk7Ci0gICAgQVNTRVJUKHBUYXJnZXQgIT0gTlVMTCk7Ci0gICAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKLSAgICBtX3BWYWx1ZSA9ICZWYWx1ZTsKLSAgICBtX3BiUmMgPSAmYlJjOworICBpZiAocFNvdXJjZSkKKyAgICBtX3N0clNvdXJjZU5hbWUgPSBwU291cmNlLT5HZXRGdWxsTmFtZSgpOworICBBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAmVmFsdWU7CisgIG1fcGJSYyA9ICZiUmM7CiB9CiAKIHZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lsbENvbW1pdCkKLXsKLSAgICBJbml0aWFsKEpFVF9GSUVMRF9GT1JNQVQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWxsQ29tbWl0KSB7CisgIEluaXRpYWwoSkVUX0ZJRUxEX0ZPUk1BVCk7CiAKLSAgICBtX25Db21taXRLZXkgPSAwOwotICAgIEFTU0VSVChwVGFyZ2V0ICE9IE5VTEwpOwotICAgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Ci0gICAgbV9wVmFsdWUgPSAmVmFsdWU7Ci0gICAgbV9iV2lsbENvbW1pdCA9IGJXaWxsQ29tbWl0OworICBtX25Db21taXRLZXkgPSAwOworICBBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAmVmFsdWU7CisgIG1fYldpbGxDb21taXQgPSBiV2lsbENvbW1pdDsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0gICAgSW5pdGlhbChKRVRfU0NSRUVOX0ZPQ1VTKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIEluaXRpYWwoSkVUX1NDUkVFTl9GT0NVUyk7CiAKLSAgICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQotewotICAgIEluaXRpYWwoSkVUX1NDUkVFTl9CTFVSKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fQmx1cihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIEluaXRpYWwoSkVUX1NDUkVFTl9CTFVSKTsKIAotICAgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICAgIG1fYlNoaWZ0ID0gYlNoaWZ0OwotICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fT3BlbihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0gICAgSW5pdGlhbChKRVRfU0NSRUVOX09QRU4pOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgSW5pdGlhbChKRVRfU0NSRUVOX09QRU4pOwogCi0gICAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0gICAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0gICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9DbG9zZShGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0gICAgSW5pdGlhbChKRVRfU0NSRUVOX0NMT1NFKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIEluaXRpYWwoSkVUX1NDUkVFTl9DTE9TRSk7CiAKLSAgICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0gICAgSW5pdGlhbChKRVRfU0NSRUVOX01PVVNFRE9XTik7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VET1dOKTsKIAotICAgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICAgIG1fYlNoaWZ0ID0gYlNoaWZ0OwotICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0gICAgSW5pdGlhbChKRVRfU0NSRUVOX01PVVNFVVApOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgSW5pdGlhbChKRVRfU0NSRUVOX01PVVNFVVApOwogCi0gICAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0gICAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0gICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLSAgICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VFTlRFUik7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VFTlRFUik7CiAKLSAgICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0gICAgSW5pdGlhbChKRVRfU0NSRUVOX01PVVNFRVhJVCk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VFWElUKTsKIAotICAgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICAgIG1fYlNoaWZ0ID0gYlNoaWZ0OwotICAgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLSAgICBJbml0aWFsKEpFVF9TQ1JFRU5fSU5WSUVXKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIEluaXRpYWwoSkVUX1NDUkVFTl9JTlZJRVcpOwogCi0gICAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0gICAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0gICAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLSAgICBJbml0aWFsKEpFVF9TQ1JFRU5fT1VUVklFVyk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX091dFZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fT1VUVklFVyk7CiAKLSAgICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpCi17Ci0gICAgSW5pdGlhbChKRVRfTElOS19NT1VTRVVQKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25MaW5rX01vdXNlVXAoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgeworICBJbml0aWFsKEpFVF9MSU5LX01PVVNFVVApOwogCi0gICAgbV9wVGFyZ2V0RG9jID0gcFRhcmdldDsKKyAgbV9wVGFyZ2V0RG9jID0gcFRhcmdldDsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKQotewotICAgIEluaXRpYWwoSkVUX0JPT0tNQVJLX01PVVNFVVApOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKSB7CisgIEluaXRpYWwoSkVUX0JPT0tNQVJLX01PVVNFVVApOwogCi0gICAgbV9wVGFyZ2V0Qm9va01hcmsgPSBwQm9va01hcms7CisgIG1fcFRhcmdldEJvb2tNYXJrID0gcEJvb2tNYXJrOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uTWVudV9FeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKQotewotICAgIEluaXRpYWwoSkVUX01FTlVfRVhFQyk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uTWVudV9FeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSB7CisgIEluaXRpYWwoSkVUX01FTlVfRVhFQyk7CiAKLSAgICBtX3BUYXJnZXREb2MgPSBwVGFyZ2V0OwotICAgIG1fc3RyVGFyZ2V0TmFtZSA9IHN0clRhcmdldE5hbWU7CisgIG1fcFRhcmdldERvYyA9IHBUYXJnZXQ7CisgIG1fc3RyVGFyZ2V0TmFtZSA9IHN0clRhcmdldE5hbWU7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25FeHRlcm5hbF9FeGVjKCkKLXsKLSAgICBJbml0aWFsKEpFVF9FWFRFUk5BTF9FWEVDKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25FeHRlcm5hbF9FeGVjKCkgeworICBJbml0aWFsKEpFVF9FWFRFUk5BTF9FWEVDKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkJhdGNoRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KQotewotICAgIEluaXRpYWwoSkVUX0JBVENIX0VYRUMpOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkJhdGNoRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSB7CisgIEluaXRpYWwoSkVUX0JBVENIX0VYRUMpOwogCi0gICAgbV9wVGFyZ2V0RG9jID0gcFRhcmdldDsKKyAgbV9wVGFyZ2V0RG9jID0gcFRhcmdldDsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkNvbnNvbGVfRXhlYygpCi17Ci0gICAgSW5pdGlhbChKRVRfQ09OU09MRV9FWEVDKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Db25zb2xlX0V4ZWMoKSB7CisgIEluaXRpYWwoSkVUX0NPTlNPTEVfRVhFQyk7CiB9CiAKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6SW5pdGlhbChKU19FVkVOVF9UIHR5cGUpIHsKKyAgbV9lRXZlbnRUeXBlID0gdHlwZTsKIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpJbml0aWFsKEpTX0VWRU5UX1QgdHlwZSkKLXsKLSAgICBtX2VFdmVudFR5cGUgPSB0eXBlOworICBtX3N0clRhcmdldE5hbWUgPSBMIiI7CisgIG1fc3RyU291cmNlTmFtZSA9IEwiIjsKKyAgbV9wV2lkZVN0ckNoYW5nZSA9IE5VTEw7CisgIG1fV2lkZVN0ckNoYW5nZUR1ID0gTCIiOworICBtX1dpZGVTdHJDaGFuZ2VFeCA9IEwiIjsKKyAgbV9uQ29tbWl0S2V5ID0gLTE7CisgIG1fYktleURvd24gPSBGQUxTRTsKKyAgbV9iTW9kaWZpZXIgPSBGQUxTRTsKKyAgbV9iU2hpZnQgPSBGQUxTRTsKKyAgbV9wSVNlbEVuZCA9IE5VTEw7CisgIG1fblNlbEVuZER1ID0gMDsKKyAgbV9wSVNlbFN0YXJ0ID0gTlVMTDsKKyAgbV9uU2VsU3RhcnREdSA9IDA7CisgIG1fYldpbGxDb21taXQgPSBGQUxTRTsKKyAgbV9wVmFsdWUgPSBOVUxMOworICBtX2JGaWVsZEZ1bGwgPSBGQUxTRTsKKyAgbV9wYlJjID0gTlVMTDsKKyAgbV9iUmNEdSA9IEZBTFNFOwogCi0gICAgbV9zdHJUYXJnZXROYW1lID0gTCIiOwotICAgIG1fc3RyU291cmNlTmFtZSA9IEwiIjsKLSAgICBtX3BXaWRlU3RyQ2hhbmdlID0gTlVMTDsKLSAgICBtX1dpZGVTdHJDaGFuZ2VEdSA9IEwiIjsKLSAgICBtX1dpZGVTdHJDaGFuZ2VFeCA9IEwiIjsKLSAgICBtX25Db21taXRLZXkgPSAtMTsKLSAgICBtX2JLZXlEb3duID0gRkFMU0U7Ci0gICAgbV9iTW9kaWZpZXIgPSBGQUxTRTsKLSAgICBtX2JTaGlmdCA9IEZBTFNFOwotICAgIG1fcElTZWxFbmQgPSBOVUxMOwotICAgIG1fblNlbEVuZER1ID0gMDsKLSAgICBtX3BJU2VsU3RhcnQgPSBOVUxMOwotICAgIG1fblNlbFN0YXJ0RHUgPSAwOwotICAgIG1fYldpbGxDb21taXQgPSBGQUxTRTsKLSAgICBtX3BWYWx1ZSA9IE5VTEw7Ci0gICAgbV9iRmllbGRGdWxsID0gRkFMU0U7Ci0gICAgbV9wYlJjID0gTlVMTDsKLSAgICBtX2JSY0R1ID0gRkFMU0U7CisgIG1fcFNvdXJjZURvYyA9IE5VTEw7CisgIG1fcFRhcmdldEJvb2tNYXJrID0gTlVMTDsKKyAgbV9wVGFyZ2V0RG9jID0gTlVMTDsKKyAgbV9wVGFyZ2V0QW5ub3QgPSBOVUxMOwogCi0gICAgbV9wU291cmNlRG9jID0gTlVMTDsKLSAgICBtX3BUYXJnZXRCb29rTWFyayA9IE5VTEw7Ci0gICAgbV9wVGFyZ2V0RG9jID0gTlVMTDsKLSAgICBtX3BUYXJnZXRBbm5vdCA9IE5VTEw7Ci0KLSAgICBtX2JWYWxpZCA9IFRSVUU7CisgIG1fYlZhbGlkID0gVFJVRTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpEZXN0cm95KCkKLXsKLSAgICBtX2JWYWxpZCA9IEZBTFNFOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpEZXN0cm95KCkgeworICBtX2JWYWxpZCA9IEZBTFNFOwogfQogCi1GWF9CT09MIENKU19FdmVudEhhbmRsZXI6OklzVmFsaWQoKQotewotICAgIHJldHVybiBtX2JWYWxpZDsKK0ZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6SXNWYWxpZCgpIHsKKyAgcmV0dXJuIG1fYlZhbGlkOwogfQogCi1DRlhfV2lkZVN0cmluZyAmIENKU19FdmVudEhhbmRsZXI6OkNoYW5nZSgpCi17Ci0gICAgaWYgKG1fcFdpZGVTdHJDaGFuZ2UpIHsKLSAgICAgICAgcmV0dXJuICptX3BXaWRlU3RyQ2hhbmdlOwotICAgIH0KLSAgICByZXR1cm4gbV9XaWRlU3RyQ2hhbmdlRHU7CitDRlhfV2lkZVN0cmluZyYgQ0pTX0V2ZW50SGFuZGxlcjo6Q2hhbmdlKCkgeworICBpZiAobV9wV2lkZVN0ckNoYW5nZSkgeworICAgIHJldHVybiAqbV9wV2lkZVN0ckNoYW5nZTsKKyAgfQorICByZXR1cm4gbV9XaWRlU3RyQ2hhbmdlRHU7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENKU19FdmVudEhhbmRsZXI6OkNoYW5nZUV4KCkKLXsKLSAgICByZXR1cm4gbV9XaWRlU3RyQ2hhbmdlRXg7CitDRlhfV2lkZVN0cmluZyBDSlNfRXZlbnRIYW5kbGVyOjpDaGFuZ2VFeCgpIHsKKyAgcmV0dXJuIG1fV2lkZVN0ckNoYW5nZUV4OwogfQogCi1pbnQgQ0pTX0V2ZW50SGFuZGxlcjo6Q29tbWl0S2V5KCkKLXsKLSAgICByZXR1cm4gbV9uQ29tbWl0S2V5OworaW50IENKU19FdmVudEhhbmRsZXI6OkNvbW1pdEtleSgpIHsKKyAgcmV0dXJuIG1fbkNvbW1pdEtleTsKIH0KIAotRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpGaWVsZEZ1bGwoKQotewotICAgIHJldHVybiBtX2JGaWVsZEZ1bGw7CitGWF9CT09MIENKU19FdmVudEhhbmRsZXI6OkZpZWxkRnVsbCgpIHsKKyAgcmV0dXJuIG1fYkZpZWxkRnVsbDsKIH0KIAotRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpLZXlEb3duKCkKLXsKLSAgICByZXR1cm4gbV9iS2V5RG93bjsKK0ZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6S2V5RG93bigpIHsKKyAgcmV0dXJuIG1fYktleURvd247CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6TW9kaWZpZXIoKQotewotICAgIHJldHVybiBtX2JNb2RpZmllcjsKK0ZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6TW9kaWZpZXIoKSB7CisgIHJldHVybiBtX2JNb2RpZmllcjsKIH0KIAotY29uc3QgRlhfV0NIQVIqIENKU19FdmVudEhhbmRsZXI6Ok5hbWUoKQotewotICAgIHN3aXRjaCAobV9lRXZlbnRUeXBlKQotICAgIHsKLSAgICBjYXNlIEpFVF9BUFBfSU5JVDogICAgICAgICAgcmV0dXJuIEwiSW5pdCI7Ci0gICAgY2FzZSBKRVRfQkFUQ0hfRVhFQzogICAgICAgIHJldHVybiBMIkV4ZWMiOwotICAgIGNhc2UgSkVUX0JPT0tNQVJLX01PVVNFVVA6ICByZXR1cm4gTCJNb3VzZSBVcCI7Ci0gICAgY2FzZSBKRVRfQ09OU09MRV9FWEVDOiAgICAgIHJldHVybiBMIkV4ZWMiOwotICAgIGNhc2UgSkVUX0RPQ19ESURQUklOVDogICAgICByZXR1cm4gTCJEaWRQcmludCI7Ci0gICAgY2FzZSBKRVRfRE9DX0RJRFNBVkU6ICAgICAgIHJldHVybiBMIkRpZFNhdmUiOwotICAgIGNhc2UgSkVUX0RPQ19PUEVOOiAgICAgICAgICByZXR1cm4gTCJPcGVuIjsKLSAgICBjYXNlIEpFVF9ET0NfV0lMTENMT1NFOiAgICAgcmV0dXJuIEwiV2lsbENsb3NlIjsKLSAgICBjYXNlIEpFVF9ET0NfV0lMTFBSSU5UOiAgICAgcmV0dXJuIEwiV2lsbFByaW50IjsKLSAgICBjYXNlIEpFVF9ET0NfV0lMTFNBVkU6ICAgICAgcmV0dXJuIEwiV2lsbFNhdmUiOwotICAgIGNhc2UgSkVUX0VYVEVSTkFMX0VYRUM6ICAgICByZXR1cm4gTCJFeGVjIjsKK2NvbnN0IEZYX1dDSEFSKiBDSlNfRXZlbnRIYW5kbGVyOjpOYW1lKCkgeworICBzd2l0Y2ggKG1fZUV2ZW50VHlwZSkgeworICAgIGNhc2UgSkVUX0FQUF9JTklUOgorICAgICAgcmV0dXJuIEwiSW5pdCI7CisgICAgY2FzZSBKRVRfQkFUQ0hfRVhFQzoKKyAgICAgIHJldHVybiBMIkV4ZWMiOworICAgIGNhc2UgSkVUX0JPT0tNQVJLX01PVVNFVVA6CisgICAgICByZXR1cm4gTCJNb3VzZSBVcCI7CisgICAgY2FzZSBKRVRfQ09OU09MRV9FWEVDOgorICAgICAgcmV0dXJuIEwiRXhlYyI7CisgICAgY2FzZSBKRVRfRE9DX0RJRFBSSU5UOgorICAgICAgcmV0dXJuIEwiRGlkUHJpbnQiOworICAgIGNhc2UgSkVUX0RPQ19ESURTQVZFOgorICAgICAgcmV0dXJuIEwiRGlkU2F2ZSI7CisgICAgY2FzZSBKRVRfRE9DX09QRU46CisgICAgICByZXR1cm4gTCJPcGVuIjsKKyAgICBjYXNlIEpFVF9ET0NfV0lMTENMT1NFOgorICAgICAgcmV0dXJuIEwiV2lsbENsb3NlIjsKKyAgICBjYXNlIEpFVF9ET0NfV0lMTFBSSU5UOgorICAgICAgcmV0dXJuIEwiV2lsbFByaW50IjsKKyAgICBjYXNlIEpFVF9ET0NfV0lMTFNBVkU6CisgICAgICByZXR1cm4gTCJXaWxsU2F2ZSI7CisgICAgY2FzZSBKRVRfRVhURVJOQUxfRVhFQzoKKyAgICAgIHJldHVybiBMIkV4ZWMiOwogICAgIGNhc2UgSkVUX0ZJRUxEX0ZPQ1VTOgotICAgIGNhc2UgSkVUX1NDUkVFTl9GT0NVUzogICAgICByZXR1cm4gTCJGb2N1cyI7CisgICAgY2FzZSBKRVRfU0NSRUVOX0ZPQ1VTOgorICAgICAgcmV0dXJuIEwiRm9jdXMiOwogICAgIGNhc2UgSkVUX0ZJRUxEX0JMVVI6Ci0gICAgY2FzZSBKRVRfU0NSRUVOX0JMVVI6ICAgICAgIHJldHVybiBMIkJsdXIiOworICAgIGNhc2UgSkVUX1NDUkVFTl9CTFVSOgorICAgICAgcmV0dXJuIEwiQmx1ciI7CiAgICAgY2FzZSBKRVRfRklFTERfTU9VU0VET1dOOgotICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRURPV046ICByZXR1cm4gTCJNb3VzZSBEb3duIjsKKyAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VET1dOOgorICAgICAgcmV0dXJuIEwiTW91c2UgRG93biI7CiAgICAgY2FzZSBKRVRfRklFTERfTU9VU0VVUDoKLSAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VVUDogICAgcmV0dXJuIEwiTW91c2UgVXAiOworICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRVVQOgorICAgICAgcmV0dXJuIEwiTW91c2UgVXAiOwogICAgIGNhc2UgSkVUX0ZJRUxEX01PVVNFRU5URVI6Ci0gICAgY2FzZSBKRVRfU0NSRUVOX01PVVNFRU5URVI6IHJldHVybiBMIk1vdXNlIEVudGVyIjsKKyAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VFTlRFUjoKKyAgICAgIHJldHVybiBMIk1vdXNlIEVudGVyIjsKICAgICBjYXNlIEpFVF9GSUVMRF9NT1VTRUVYSVQ6Ci0gICAgY2FzZSBKRVRfU0NSRUVOX01PVVNFRVhJVDogIHJldHVybiBMIk1vdXNlIEV4aXQiOwotICAgIGNhc2UgSkVUX0ZJRUxEX0NBTENVTEFURTogICByZXR1cm4gTCJDYWxjdWxhdGUiOwotICAgIGNhc2UgSkVUX0ZJRUxEX0ZPUk1BVDogICAgICByZXR1cm4gTCJGb3JtYXQiOwotICAgIGNhc2UgSkVUX0ZJRUxEX0tFWVNUUk9LRTogICByZXR1cm4gTCJLZXlzdHJva2UiOwotICAgIGNhc2UgSkVUX0ZJRUxEX1ZBTElEQVRFOiAgICByZXR1cm4gTCJWYWxpZGF0ZSI7Ci0gICAgY2FzZSBKRVRfTElOS19NT1VTRVVQOiAgICAgIHJldHVybiBMIk1vdXNlIFVwIjsKLSAgICBjYXNlIEpFVF9NRU5VX0VYRUM6ICAgICAgICAgcmV0dXJuIEwiRXhlYyI7CisgICAgY2FzZSBKRVRfU0NSRUVOX01PVVNFRVhJVDoKKyAgICAgIHJldHVybiBMIk1vdXNlIEV4aXQiOworICAgIGNhc2UgSkVUX0ZJRUxEX0NBTENVTEFURToKKyAgICAgIHJldHVybiBMIkNhbGN1bGF0ZSI7CisgICAgY2FzZSBKRVRfRklFTERfRk9STUFUOgorICAgICAgcmV0dXJuIEwiRm9ybWF0IjsKKyAgICBjYXNlIEpFVF9GSUVMRF9LRVlTVFJPS0U6CisgICAgICByZXR1cm4gTCJLZXlzdHJva2UiOworICAgIGNhc2UgSkVUX0ZJRUxEX1ZBTElEQVRFOgorICAgICAgcmV0dXJuIEwiVmFsaWRhdGUiOworICAgIGNhc2UgSkVUX0xJTktfTU9VU0VVUDoKKyAgICAgIHJldHVybiBMIk1vdXNlIFVwIjsKKyAgICBjYXNlIEpFVF9NRU5VX0VYRUM6CisgICAgICByZXR1cm4gTCJFeGVjIjsKICAgICBjYXNlIEpFVF9QQUdFX09QRU46Ci0gICAgY2FzZSBKRVRfU0NSRUVOX09QRU46ICAgICAgIHJldHVybiBMIk9wZW4iOworICAgIGNhc2UgSkVUX1NDUkVFTl9PUEVOOgorICAgICAgcmV0dXJuIEwiT3BlbiI7CiAgICAgY2FzZSBKRVRfUEFHRV9DTE9TRToKLSAgICBjYXNlIEpFVF9TQ1JFRU5fQ0xPU0U6ICAgICAgcmV0dXJuIEwiQ2xvc2UiOworICAgIGNhc2UgSkVUX1NDUkVFTl9DTE9TRToKKyAgICAgIHJldHVybiBMIkNsb3NlIjsKICAgICBjYXNlIEpFVF9TQ1JFRU5fSU5WSUVXOgotICAgIGNhc2UgSkVUX1BBR0VfSU5WSUVXOiAgICAgICByZXR1cm4gTCJJblZpZXciOworICAgIGNhc2UgSkVUX1BBR0VfSU5WSUVXOgorICAgICAgcmV0dXJuIEwiSW5WaWV3IjsKICAgICBjYXNlIEpFVF9QQUdFX09VVFZJRVc6Ci0gICAgY2FzZSBKRVRfU0NSRUVOX09VVFZJRVc6ICAgIHJldHVybiBMIk91dFZpZXciOworICAgIGNhc2UgSkVUX1NDUkVFTl9PVVRWSUVXOgorICAgICAgcmV0dXJuIEwiT3V0VmlldyI7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9CisgICAgICByZXR1cm4gTCIiOworICB9CiAKLSAgICByZXR1cm4gTCIiOworICByZXR1cm4gTCIiOwogfQogCi1jb25zdCBGWF9XQ0hBUiogQ0pTX0V2ZW50SGFuZGxlcjo6VHlwZSgpCi17Ci0gICAgc3dpdGNoIChtX2VFdmVudFR5cGUpCi0gICAgewotICAgIGNhc2UgSkVUX0FQUF9JTklUOiAgICAgICAgICByZXR1cm4gTCJBcHAiOwotICAgIGNhc2UgSkVUX0JBVENIX0VYRUM6ICAgICAgICByZXR1cm4gTCJCYXRjaCI7Ci0gICAgY2FzZSBKRVRfQk9PS01BUktfTU9VU0VVUDogIHJldHVybiBMIkJvb2tNYXJrIjsKLSAgICBjYXNlIEpFVF9DT05TT0xFX0VYRUM6ICAgICAgcmV0dXJuIEwiQ29uc29sZSI7Citjb25zdCBGWF9XQ0hBUiogQ0pTX0V2ZW50SGFuZGxlcjo6VHlwZSgpIHsKKyAgc3dpdGNoIChtX2VFdmVudFR5cGUpIHsKKyAgICBjYXNlIEpFVF9BUFBfSU5JVDoKKyAgICAgIHJldHVybiBMIkFwcCI7CisgICAgY2FzZSBKRVRfQkFUQ0hfRVhFQzoKKyAgICAgIHJldHVybiBMIkJhdGNoIjsKKyAgICBjYXNlIEpFVF9CT09LTUFSS19NT1VTRVVQOgorICAgICAgcmV0dXJuIEwiQm9va01hcmsiOworICAgIGNhc2UgSkVUX0NPTlNPTEVfRVhFQzoKKyAgICAgIHJldHVybiBMIkNvbnNvbGUiOwogICAgIGNhc2UgSkVUX0RPQ19ESURQUklOVDoKICAgICBjYXNlIEpFVF9ET0NfRElEU0FWRToKICAgICBjYXNlIEpFVF9ET0NfT1BFTjoKICAgICBjYXNlIEpFVF9ET0NfV0lMTENMT1NFOgogICAgIGNhc2UgSkVUX0RPQ19XSUxMUFJJTlQ6Ci0gICAgY2FzZSBKRVRfRE9DX1dJTExTQVZFOiAgICAgIHJldHVybiBMIkRvYyI7Ci0gICAgY2FzZSBKRVRfRVhURVJOQUxfRVhFQzogICAgIHJldHVybiBMIkV4dGVybmFsIjsKKyAgICBjYXNlIEpFVF9ET0NfV0lMTFNBVkU6CisgICAgICByZXR1cm4gTCJEb2MiOworICAgIGNhc2UgSkVUX0VYVEVSTkFMX0VYRUM6CisgICAgICByZXR1cm4gTCJFeHRlcm5hbCI7CiAgICAgY2FzZSBKRVRfRklFTERfQkxVUjoKICAgICBjYXNlIEpFVF9GSUVMRF9GT0NVUzoKICAgICBjYXNlIEpFVF9GSUVMRF9NT1VTRURPV046CkBAIC01MzEsNyArNTU2LDggQEAKICAgICBjYXNlIEpFVF9GSUVMRF9DQUxDVUxBVEU6CiAgICAgY2FzZSBKRVRfRklFTERfRk9STUFUOgogICAgIGNhc2UgSkVUX0ZJRUxEX0tFWVNUUk9LRToKLSAgICBjYXNlIEpFVF9GSUVMRF9WQUxJREFURTogICAgcmV0dXJuIEwiRmllbGQiOworICAgIGNhc2UgSkVUX0ZJRUxEX1ZBTElEQVRFOgorICAgICAgcmV0dXJuIEwiRmllbGQiOwogICAgIGNhc2UgSkVUX1NDUkVFTl9GT0NVUzoKICAgICBjYXNlIEpFVF9TQ1JFRU5fQkxVUjoKICAgICBjYXNlIEpFVF9TQ1JFRU5fT1BFTjoKQEAgLTU0MSwxMjQgKzU2NywxMjMgQEAKICAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VFTlRFUjoKICAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VFWElUOgogICAgIGNhc2UgSkVUX1NDUkVFTl9JTlZJRVc6Ci0gICAgY2FzZSBKRVRfU0NSRUVOX09VVFZJRVc6ICAgIHJldHVybiBMIlNjcmVlbiI7Ci0gICAgY2FzZSBKRVRfTElOS19NT1VTRVVQOiAgICAgIHJldHVybiBMIkxpbmsiOwotICAgIGNhc2UgSkVUX01FTlVfRVhFQzogICAgICAgICByZXR1cm4gTCJNZW51IjsKKyAgICBjYXNlIEpFVF9TQ1JFRU5fT1VUVklFVzoKKyAgICAgIHJldHVybiBMIlNjcmVlbiI7CisgICAgY2FzZSBKRVRfTElOS19NT1VTRVVQOgorICAgICAgcmV0dXJuIEwiTGluayI7CisgICAgY2FzZSBKRVRfTUVOVV9FWEVDOgorICAgICAgcmV0dXJuIEwiTWVudSI7CiAgICAgY2FzZSBKRVRfUEFHRV9PUEVOOgogICAgIGNhc2UgSkVUX1BBR0VfQ0xPU0U6CiAgICAgY2FzZSBKRVRfUEFHRV9JTlZJRVc6Ci0gICAgY2FzZSBKRVRfUEFHRV9PVVRWSUVXOnJldHVybiBMIlBhZ2UiOworICAgIGNhc2UgSkVUX1BBR0VfT1VUVklFVzoKKyAgICAgIHJldHVybiBMIlBhZ2UiOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBMIiI7Ci0gICAgfQorICAgICAgcmV0dXJuIEwiIjsKKyAgfQogCi0gICAgcmV0dXJuIEwiIjsKKyAgcmV0dXJuIEwiIjsKIH0KIAotRlhfQk9PTCYgQ0pTX0V2ZW50SGFuZGxlcjo6UmMoKQotewotICAgIGlmIChtX3BiUmMpIHsKLSAgICAgICAgcmV0dXJuICptX3BiUmM7Ci0gICAgfQotICAgIHJldHVybiBtX2JSY0R1OworRlhfQk9PTCYgQ0pTX0V2ZW50SGFuZGxlcjo6UmMoKSB7CisgIGlmIChtX3BiUmMpIHsKKyAgICByZXR1cm4gKm1fcGJSYzsKKyAgfQorICByZXR1cm4gbV9iUmNEdTsKIH0KIAotaW50ICYgQ0pTX0V2ZW50SGFuZGxlcjo6U2VsRW5kKCkKLXsKLSAgICBpZiAobV9wSVNlbEVuZCkgewotICAgICAgICByZXR1cm4gKm1fcElTZWxFbmQ7Ci0gICAgfQotICAgIHJldHVybiBtX25TZWxFbmREdTsKK2ludCYgQ0pTX0V2ZW50SGFuZGxlcjo6U2VsRW5kKCkgeworICBpZiAobV9wSVNlbEVuZCkgeworICAgIHJldHVybiAqbV9wSVNlbEVuZDsKKyAgfQorICByZXR1cm4gbV9uU2VsRW5kRHU7CiB9CiAKLWludCAmIENKU19FdmVudEhhbmRsZXI6OlNlbFN0YXJ0KCkKLXsKLSAgICBpZiAobV9wSVNlbFN0YXJ0KSB7Ci0gICAgICAgIHJldHVybiAqbV9wSVNlbFN0YXJ0OwotICAgIH0KLSAgICByZXR1cm4gbV9uU2VsU3RhcnREdTsKK2ludCYgQ0pTX0V2ZW50SGFuZGxlcjo6U2VsU3RhcnQoKSB7CisgIGlmIChtX3BJU2VsU3RhcnQpIHsKKyAgICByZXR1cm4gKm1fcElTZWxTdGFydDsKKyAgfQorICByZXR1cm4gbV9uU2VsU3RhcnREdTsKIH0KIAotRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpTaGlmdCgpCi17Ci0gICAgcmV0dXJuIG1fYlNoaWZ0OworRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpTaGlmdCgpIHsKKyAgcmV0dXJuIG1fYlNoaWZ0OwogfQogCi1GaWVsZCogQ0pTX0V2ZW50SGFuZGxlcjo6U291cmNlKCkKLXsKLSAgICBBU1NFUlQobV9wSlNDb250ZXh0ICE9IE5VTEwpOworRmllbGQqIENKU19FdmVudEhhbmRsZXI6OlNvdXJjZSgpIHsKKyAgQVNTRVJUKG1fcEpTQ29udGV4dCAhPSBOVUxMKTsKIAotICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IG1fcEpTQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IG1fcEpTQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CiAKLSAgICBKU0ZYT2JqZWN0ICBwRG9jT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgbV9wSlNDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkRvY3VtZW50IikpOwotICAgIEFTU0VSVChwRG9jT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7Ci0gICAgSlNGWE9iamVjdCAgcEZpZWxkT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgbV9wSlNDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkZpZWxkIikpOwotICAgIEFTU0VSVChwRmllbGRPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKKyAgSlNGWE9iamVjdCBwRG9jT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKAorICAgICAgKnBSdW50aW1lLCBtX3BKU0NvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRG9jdW1lbnQiKSk7CisgIEFTU0VSVChwRG9jT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7CisgIEpTRlhPYmplY3QgcEZpZWxkT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKAorICAgICAgKnBSdW50aW1lLCBtX3BKU0NvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7CisgIEFTU0VSVChwRmllbGRPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKIAotICAgIENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPSAoQ0pTX0RvY3VtZW50KilKU19HZXRQcml2YXRlKHBEb2NPYmopOwotICAgIEFTU0VSVChwSlNEb2N1bWVudCAhPSBOVUxMKTsKLSAgICBEb2N1bWVudCogcERvY3VtZW50ID0gKERvY3VtZW50KilwSlNEb2N1bWVudC0+R2V0RW1iZWRPYmplY3QoKTsKLSAgICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotICAgIGlmIChtX3BUYXJnZXREb2MgIT0gTlVMTCkKLSAgICAgICAgcERvY3VtZW50LT5BdHRhY2hEb2MobV9wVGFyZ2V0RG9jKTsKLSAgICBlbHNlCi0gICAgICAgIHBEb2N1bWVudC0+QXR0YWNoRG9jKG1fcEpTQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKSk7CisgIENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPSAoQ0pTX0RvY3VtZW50KilKU19HZXRQcml2YXRlKHBEb2NPYmopOworICBBU1NFUlQocEpTRG9jdW1lbnQgIT0gTlVMTCk7CisgIERvY3VtZW50KiBwRG9jdW1lbnQgPSAoRG9jdW1lbnQqKXBKU0RvY3VtZW50LT5HZXRFbWJlZE9iamVjdCgpOworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworICBpZiAobV9wVGFyZ2V0RG9jICE9IE5VTEwpCisgICAgcERvY3VtZW50LT5BdHRhY2hEb2MobV9wVGFyZ2V0RG9jKTsKKyAgZWxzZQorICAgIHBEb2N1bWVudC0+QXR0YWNoRG9jKG1fcEpTQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKSk7CiAKLSAgICAvL2lmIChtX3BTb3VyY2VGaWVsZCA9PSBOVUxMKQotICAgIC8vICByZXR1cm4gTlVMTDsKLSAgICAvL0NSQU9fV2lkZ2V0ICpwV2lkZ2V0ID0gSUJDTF9XaWRnZXQ6OkdldFdpZGdldChtX3BTb3VyY2VGaWVsZCk7Ci0gICAgLy9DUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpOwotICAgIC8vQVNTRVJUKHBGb3JtRmllbGQpOwotICAgIC8vQ0ZYX1dpZGVTdHJpbmcgY3NGaWVsZE5hbWUgPSBwRm9ybUZpZWxkLT5HZXRGdWxsTmFtZSgpOwotICAgIENKU19GaWVsZCAqIHBKU0ZpZWxkID0gKENKU19GaWVsZCopSlNfR2V0UHJpdmF0ZShwRmllbGRPYmopOwotICAgIEFTU0VSVChwSlNGaWVsZCAhPSBOVUxMKTsKLSAgICBGaWVsZCAqIHBGaWVsZCA9IChGaWVsZCAqKXBKU0ZpZWxkLT5HZXRFbWJlZE9iamVjdCgpOwotICAgIEFTU0VSVChwRmllbGQgIT0gTlVMTCk7Ci0gICAgcEZpZWxkLT5BdHRhY2hGaWVsZChwRG9jdW1lbnQsIG1fc3RyU291cmNlTmFtZSk7Ci0gICAgcmV0dXJuIHBGaWVsZDsKKyAgLy8gaWYgKG1fcFNvdXJjZUZpZWxkID09IE5VTEwpCisgIC8vICByZXR1cm4gTlVMTDsKKyAgLy8gQ1JBT19XaWRnZXQgKnBXaWRnZXQgPSBJQkNMX1dpZGdldDo6R2V0V2lkZ2V0KG1fcFNvdXJjZUZpZWxkKTsKKyAgLy8gQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKTsKKyAgLy8gQVNTRVJUKHBGb3JtRmllbGQpOworICAvLyBDRlhfV2lkZVN0cmluZyBjc0ZpZWxkTmFtZSA9IHBGb3JtRmllbGQtPkdldEZ1bGxOYW1lKCk7CisgIENKU19GaWVsZCogcEpTRmllbGQgPSAoQ0pTX0ZpZWxkKilKU19HZXRQcml2YXRlKHBGaWVsZE9iaik7CisgIEFTU0VSVChwSlNGaWVsZCAhPSBOVUxMKTsKKyAgRmllbGQqIHBGaWVsZCA9IChGaWVsZCopcEpTRmllbGQtPkdldEVtYmVkT2JqZWN0KCk7CisgIEFTU0VSVChwRmllbGQgIT0gTlVMTCk7CisgIHBGaWVsZC0+QXR0YWNoRmllbGQocERvY3VtZW50LCBtX3N0clNvdXJjZU5hbWUpOworICByZXR1cm4gcEZpZWxkOwogfQogCi1GaWVsZCogQ0pTX0V2ZW50SGFuZGxlcjo6VGFyZ2V0X0ZpZWxkKCkKLXsKLSAgICBBU1NFUlQobV9wSlNDb250ZXh0ICE9IE5VTEwpOworRmllbGQqIENKU19FdmVudEhhbmRsZXI6OlRhcmdldF9GaWVsZCgpIHsKKyAgQVNTRVJUKG1fcEpTQ29udGV4dCAhPSBOVUxMKTsKIAotICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IG1fcEpTQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IG1fcEpTQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CiAKLSAgICBKU0ZYT2JqZWN0IHBEb2NPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBtX3BKU0NvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRG9jdW1lbnQiKSk7Ci0gICAgQVNTRVJUKHBEb2NPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKLSAgICBKU0ZYT2JqZWN0IHBGaWVsZE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIG1fcEpTQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJGaWVsZCIpKTsKLSAgICBBU1NFUlQocEZpZWxkT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7CisgIEpTRlhPYmplY3QgcERvY09iaiA9IEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgICpwUnVudGltZSwgbV9wSlNDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkRvY3VtZW50IikpOworICBBU1NFUlQocERvY09iai5Jc0VtcHR5KCkgPT0gRkFMU0UpOworICBKU0ZYT2JqZWN0IHBGaWVsZE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgICpwUnVudGltZSwgbV9wSlNDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkZpZWxkIikpOworICBBU1NFUlQocEZpZWxkT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7CiAKLSAgICBDSlNfRG9jdW1lbnQqIHBKU0RvY3VtZW50ID0gKENKU19Eb2N1bWVudCopSlNfR2V0UHJpdmF0ZShwRG9jT2JqKTsKLSAgICBBU1NFUlQocEpTRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgRG9jdW1lbnQqIHBEb2N1bWVudCA9IChEb2N1bWVudCopcEpTRG9jdW1lbnQtPkdldEVtYmVkT2JqZWN0KCk7Ci0gICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLSAgICBpZiAobV9wVGFyZ2V0RG9jICE9IE5VTEwpCi0gICAgICAgIHBEb2N1bWVudC0+QXR0YWNoRG9jKG1fcFRhcmdldERvYyk7Ci0gICAgZWxzZQotICAgICAgICBwRG9jdW1lbnQtPkF0dGFjaERvYyhtX3BKU0NvbnRleHQtPkdldFJlYWRlckRvY3VtZW50KCkpOworICBDSlNfRG9jdW1lbnQqIHBKU0RvY3VtZW50ID0gKENKU19Eb2N1bWVudCopSlNfR2V0UHJpdmF0ZShwRG9jT2JqKTsKKyAgQVNTRVJUKHBKU0RvY3VtZW50ICE9IE5VTEwpOworICBEb2N1bWVudCogcERvY3VtZW50ID0gKERvY3VtZW50KilwSlNEb2N1bWVudC0+R2V0RW1iZWRPYmplY3QoKTsKKyAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKKyAgaWYgKG1fcFRhcmdldERvYyAhPSBOVUxMKQorICAgIHBEb2N1bWVudC0+QXR0YWNoRG9jKG1fcFRhcmdldERvYyk7CisgIGVsc2UKKyAgICBwRG9jdW1lbnQtPkF0dGFjaERvYyhtX3BKU0NvbnRleHQtPkdldFJlYWRlckRvY3VtZW50KCkpOwogCi0gICAgQ0pTX0ZpZWxkKiBwSlNGaWVsZCA9IChDSlNfRmllbGQqKUpTX0dldFByaXZhdGUocEZpZWxkT2JqKTsKLSAgICBBU1NFUlQocEpTRmllbGQgIT0gTlVMTCk7CisgIENKU19GaWVsZCogcEpTRmllbGQgPSAoQ0pTX0ZpZWxkKilKU19HZXRQcml2YXRlKHBGaWVsZE9iaik7CisgIEFTU0VSVChwSlNGaWVsZCAhPSBOVUxMKTsKIAotICAgIEZpZWxkKiBwRmllbGQgPSAoRmllbGQgKilwSlNGaWVsZC0+R2V0RW1iZWRPYmplY3QoKTsKLSAgICBBU1NFUlQocEZpZWxkICE9IE5VTEwpOworICBGaWVsZCogcEZpZWxkID0gKEZpZWxkKilwSlNGaWVsZC0+R2V0RW1iZWRPYmplY3QoKTsKKyAgQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKIAotICAgIHBGaWVsZC0+QXR0YWNoRmllbGQocERvY3VtZW50LCBtX3N0clRhcmdldE5hbWUpOwotICAgIHJldHVybiBwRmllbGQ7CisgIHBGaWVsZC0+QXR0YWNoRmllbGQocERvY3VtZW50LCBtX3N0clRhcmdldE5hbWUpOworICByZXR1cm4gcEZpZWxkOwogfQogCi1DRlhfV2lkZVN0cmluZyYgQ0pTX0V2ZW50SGFuZGxlcjo6VmFsdWUoKQotewotICAgIHJldHVybiAqbV9wVmFsdWU7CitDRlhfV2lkZVN0cmluZyYgQ0pTX0V2ZW50SGFuZGxlcjo6VmFsdWUoKSB7CisgIHJldHVybiAqbV9wVmFsdWU7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6V2lsbENvbW1pdCgpCi17Ci0gICAgcmV0dXJuIG1fYldpbGxDb21taXQ7CitGWF9CT09MIENKU19FdmVudEhhbmRsZXI6OldpbGxDb21taXQoKSB7CisgIHJldHVybiBtX2JXaWxsQ29tbWl0OwogfQogCi1DRlhfV2lkZVN0cmluZyBDSlNfRXZlbnRIYW5kbGVyOjpUYXJnZXROYW1lKCkKLXsKLSAgICByZXR1cm4gbV9zdHJUYXJnZXROYW1lOworQ0ZYX1dpZGVTdHJpbmcgQ0pTX0V2ZW50SGFuZGxlcjo6VGFyZ2V0TmFtZSgpIHsKKyAgcmV0dXJuIG1fc3RyVGFyZ2V0TmFtZTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuY3BwCmluZGV4IDJiNDI0OGMuLjcxNTM3NGQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcApAQCAtOSw0NDkgKzksMzkzIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaCIKIAotI2RlZmluZSBKU19NQVhHTE9CQUxEQVRBICAgICAgICAgICAgKDEwMjQgKiA0IC0gOCkKKyNkZWZpbmUgSlNfTUFYR0xPQkFMREFUQSAoMTAyNCAqIDQgLSA4KQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNKU19HbG9iYWxWYXJpYWJsZUFycmF5OjpDSlNfR2xvYmFsVmFyaWFibGVBcnJheSgpCi17CitDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6Q0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkoKSB7fQorCitDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6fkNKU19HbG9iYWxWYXJpYWJsZUFycmF5KCkgeworICBFbXB0eSgpOwogfQogCi1DSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6fkNKU19HbG9iYWxWYXJpYWJsZUFycmF5KCkKLXsKLSAgICBFbXB0eSgpOwotfQordm9pZCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6Q29weShjb25zdCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpIHsKKyAgRW1wdHkoKTsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gYXJyYXkuQ291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDSlNfS2V5VmFsdWUqIHBPbGRPYmpEYXRhID0gYXJyYXkuR2V0QXQoaSk7CisgICAgQVNTRVJUKHBPbGRPYmpEYXRhICE9IE5VTEwpOwogCi12b2lkIENKU19HbG9iYWxWYXJpYWJsZUFycmF5OjpDb3B5KGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSkKLXsKLSAgICBFbXB0eSgpOwotICAgIGZvciAoaW50IGk9MCxzej1hcnJheS5Db3VudCgpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgICBDSlNfS2V5VmFsdWUqIHBPbGRPYmpEYXRhID0gYXJyYXkuR2V0QXQoaSk7Ci0gICAgICAgIEFTU0VSVChwT2xkT2JqRGF0YSAhPSBOVUxMKTsKLQotICAgICAgICBzd2l0Y2ggKHBPbGRPYmpEYXRhLT5uVHlwZSkKLSAgICAgICAgewotICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0pTX0tleVZhbHVlKiBwTmV3T2JqRGF0YSA9IG5ldyBDSlNfS2V5VmFsdWU7Ci0gICAgICAgICAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKLSAgICAgICAgICAgICAgICBwTmV3T2JqRGF0YS0+blR5cGUgPSBwT2xkT2JqRGF0YS0+blR5cGU7Ci0gICAgICAgICAgICAgICAgcE5ld09iakRhdGEtPmREYXRhID0gcE9sZE9iakRhdGEtPmREYXRhOwotICAgICAgICAgICAgICAgIEFkZChwTmV3T2JqRGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSlNfS2V5VmFsdWUqIHBOZXdPYmpEYXRhID0gbmV3IENKU19LZXlWYWx1ZTsKLSAgICAgICAgICAgICAgICBwTmV3T2JqRGF0YS0+c0tleSA9IHBPbGRPYmpEYXRhLT5zS2V5OwotICAgICAgICAgICAgICAgIHBOZXdPYmpEYXRhLT5uVHlwZSA9IHBPbGRPYmpEYXRhLT5uVHlwZTsKLSAgICAgICAgICAgICAgICBwTmV3T2JqRGF0YS0+YkRhdGEgPSBwT2xkT2JqRGF0YS0+YkRhdGE7Ci0gICAgICAgICAgICAgICAgQWRkKHBOZXdPYmpEYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0pTX0tleVZhbHVlKiBwTmV3T2JqRGF0YSA9IG5ldyBDSlNfS2V5VmFsdWU7Ci0gICAgICAgICAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKLSAgICAgICAgICAgICAgICBwTmV3T2JqRGF0YS0+blR5cGUgPSBwT2xkT2JqRGF0YS0+blR5cGU7Ci0gICAgICAgICAgICAgICAgcE5ld09iakRhdGEtPnNEYXRhID0gcE9sZE9iakRhdGEtPnNEYXRhOwotICAgICAgICAgICAgICAgIEFkZChwTmV3T2JqRGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENKU19LZXlWYWx1ZSogcE5ld09iakRhdGEgPSBuZXcgQ0pTX0tleVZhbHVlOwotICAgICAgICAgICAgICAgIHBOZXdPYmpEYXRhLT5zS2V5ID0gcE9sZE9iakRhdGEtPnNLZXk7Ci0gICAgICAgICAgICAgICAgcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOwotICAgICAgICAgICAgICAgIHBOZXdPYmpEYXRhLT5vYmpEYXRhLkNvcHkocE9sZE9iakRhdGEtPm9iakRhdGEpOwotICAgICAgICAgICAgICAgIEFkZChwTmV3T2JqRGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0pTX0tleVZhbHVlKiBwTmV3T2JqRGF0YSA9IG5ldyBDSlNfS2V5VmFsdWU7Ci0gICAgICAgICAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKLSAgICAgICAgICAgICAgICBwTmV3T2JqRGF0YS0+blR5cGUgPSBwT2xkT2JqRGF0YS0+blR5cGU7Ci0gICAgICAgICAgICAgICAgQWRkKHBOZXdPYmpEYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIHN3aXRjaCAocE9sZE9iakRhdGEtPm5UeXBlKSB7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6IHsKKyAgICAgICAgQ0pTX0tleVZhbHVlKiBwTmV3T2JqRGF0YSA9IG5ldyBDSlNfS2V5VmFsdWU7CisgICAgICAgIHBOZXdPYmpEYXRhLT5zS2V5ID0gcE9sZE9iakRhdGEtPnNLZXk7CisgICAgICAgIHBOZXdPYmpEYXRhLT5uVHlwZSA9IHBPbGRPYmpEYXRhLT5uVHlwZTsKKyAgICAgICAgcE5ld09iakRhdGEtPmREYXRhID0gcE9sZE9iakRhdGEtPmREYXRhOworICAgICAgICBBZGQocE5ld09iakRhdGEpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46IHsKKyAgICAgICAgQ0pTX0tleVZhbHVlKiBwTmV3T2JqRGF0YSA9IG5ldyBDSlNfS2V5VmFsdWU7CisgICAgICAgIHBOZXdPYmpEYXRhLT5zS2V5ID0gcE9sZE9iakRhdGEtPnNLZXk7CisgICAgICAgIHBOZXdPYmpEYXRhLT5uVHlwZSA9IHBPbGRPYmpEYXRhLT5uVHlwZTsKKyAgICAgICAgcE5ld09iakRhdGEtPmJEYXRhID0gcE9sZE9iakRhdGEtPmJEYXRhOworICAgICAgICBBZGQocE5ld09iakRhdGEpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzogeworICAgICAgICBDSlNfS2V5VmFsdWUqIHBOZXdPYmpEYXRhID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKKyAgICAgICAgcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOworICAgICAgICBwTmV3T2JqRGF0YS0+c0RhdGEgPSBwT2xkT2JqRGF0YS0+c0RhdGE7CisgICAgICAgIEFkZChwTmV3T2JqRGF0YSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOiB7CisgICAgICAgIENKU19LZXlWYWx1ZSogcE5ld09iakRhdGEgPSBuZXcgQ0pTX0tleVZhbHVlOworICAgICAgICBwTmV3T2JqRGF0YS0+c0tleSA9IHBPbGRPYmpEYXRhLT5zS2V5OworICAgICAgICBwTmV3T2JqRGF0YS0+blR5cGUgPSBwT2xkT2JqRGF0YS0+blR5cGU7CisgICAgICAgIHBOZXdPYmpEYXRhLT5vYmpEYXRhLkNvcHkocE9sZE9iakRhdGEtPm9iakRhdGEpOworICAgICAgICBBZGQocE5ld09iakRhdGEpOworICAgICAgfQorICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDogeworICAgICAgICBDSlNfS2V5VmFsdWUqIHBOZXdPYmpEYXRhID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKKyAgICAgICAgcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOworICAgICAgICBBZGQocE5ld09iakRhdGEpOworICAgICAgfQogICAgIH0KKyAgfQogfQogCi12b2lkIENKU19HbG9iYWxWYXJpYWJsZUFycmF5OjpBZGQoQ0pTX0tleVZhbHVlKiBwKQotewotICAgIGFycmF5LkFkZChwKTsKK3ZvaWQgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk6OkFkZChDSlNfS2V5VmFsdWUqIHApIHsKKyAgYXJyYXkuQWRkKHApOwogfQogCi1pbnQgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk6OkNvdW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gYXJyYXkuR2V0U2l6ZSgpOworaW50IENKU19HbG9iYWxWYXJpYWJsZUFycmF5OjpDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGFycmF5LkdldFNpemUoKTsKIH0KIAotQ0pTX0tleVZhbHVlKiBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6R2V0QXQoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBhcnJheS5HZXRBdChpbmRleCk7CitDSlNfS2V5VmFsdWUqIENKU19HbG9iYWxWYXJpYWJsZUFycmF5OjpHZXRBdChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGFycmF5LkdldEF0KGluZGV4KTsKIH0KIAotdm9pZCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6RW1wdHkoKQotewotICAgIGZvciAoaW50IGk9MCxzej1hcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICAgICAgZGVsZXRlIGFycmF5LkdldEF0KGkpOwotICAgIGFycmF5LlJlbW92ZUFsbCgpOwordm9pZCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6RW1wdHkoKSB7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IGFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgZGVsZXRlIGFycmF5LkdldEF0KGkpOworICBhcnJheS5SZW1vdmVBbGwoKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX0dsb2JhbERhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2RlZmluZSBSRUFERVJfSlNfR0xPQkFMREFUQV9GSUxFTkFNRSAgICAgICAgICAgICAgIEwiUmVhZGVyX0pzR2xvYmFsLkRhdGEiCi0jZGVmaW5lIFBIQU5UT01fSlNfR0xPQkFMREFUQV9GSUxFTkFNRSAgICAgICAgICAgICAgTCJQaGFudG9tX0pzR2xvYmFsLkRhdGEiCi0jZGVmaW5lIFNES19KU19HTE9CQUxEQVRBX0ZJTEVOQU1FICAgICAgICAgICAgICAgICAgTCJTREtfSnNHbG9iYWwuRGF0YSIKKyNkZWZpbmUgUkVBREVSX0pTX0dMT0JBTERBVEFfRklMRU5BTUUgTCJSZWFkZXJfSnNHbG9iYWwuRGF0YSIKKyNkZWZpbmUgUEhBTlRPTV9KU19HTE9CQUxEQVRBX0ZJTEVOQU1FIEwiUGhhbnRvbV9Kc0dsb2JhbC5EYXRhIgorI2RlZmluZSBTREtfSlNfR0xPQkFMREFUQV9GSUxFTkFNRSBMIlNES19Kc0dsb2JhbC5EYXRhIgogCi1zdGF0aWMgY29uc3QgdWludDhfdCBKU19SQzRLRVlbXSA9IHsweDE5LDB4YTgsMHhlOCwweDAxLDB4ZjYsMHhhOCwweGI2LDB4NGQsMHg4MiwweDA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDUsMHg2ZCwweGI0LDB4Y2YsMHhkNywweDc3LDB4NjcsMHhmOSwweDc1LDB4OWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMCwweGUwLDB4MWUsMHg1MSwweGVlLDB4NDYsMHhmZCwweDBiLDB4YzksMHg5MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI1LDB4NTUsMHg0YSwweGVlLDB4ZTAsMHgxNiwweGQwLDB4ZGYsMHg4YywweGZhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MmEsMHhhOSwweDQ5LDB4ZmQsMHg5NywweDFjLDB4MGUsMHgyMiwweDEzLDB4MjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3YywweGFmLDB4YzQsMHhmYywweDljLDB4MTIsMHg2NSwweDhjLDB4NGUsMHg1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0LDB4NzUsMHg4OSwweGM5LDB4YjEsMHhlZCwweDUwLDB4Y2EsMHg5NiwweDZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWEsMHg3YSwweGZlLDB4NTgsMHg1ZCwweGVjLDB4MTksMHg0YSwweGY2LDB4MzUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2YSwweDk3LDB4MTQsMHgwMCwweDBlLDB4ZDAsMHg2YiwweGJiLDB4ZDUsMHg3NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU1LDB4OGIsMHg2ZSwweDZiLDB4MTksMHhhMCwweGY4LDB4NzcsMHhkNSwweGEzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IEpTX1JDNEtFWVtdID0geworICAgIDB4MTksIDB4YTgsIDB4ZTgsIDB4MDEsIDB4ZjYsIDB4YTgsIDB4YjYsIDB4NGQsIDB4ODIsIDB4MDQsIDB4NDUsIDB4NmQsCisgICAgMHhiNCwgMHhjZiwgMHhkNywgMHg3NywgMHg2NywgMHhmOSwgMHg3NSwgMHg5ZiwgMHhmMCwgMHhlMCwgMHgxZSwgMHg1MSwKKyAgICAweGVlLCAweDQ2LCAweGZkLCAweDBiLCAweGM5LCAweDkzLCAweDI1LCAweDU1LCAweDRhLCAweGVlLCAweGUwLCAweDE2LAorICAgIDB4ZDAsIDB4ZGYsIDB4OGMsIDB4ZmEsIDB4MmEsIDB4YTksIDB4NDksIDB4ZmQsIDB4OTcsIDB4MWMsIDB4MGUsIDB4MjIsCisgICAgMHgxMywgMHgyOCwgMHg3YywgMHhhZiwgMHhjNCwgMHhmYywgMHg5YywgMHgxMiwgMHg2NSwgMHg4YywgMHg0ZSwgMHg1YiwKKyAgICAweDA0LCAweDc1LCAweDg5LCAweGM5LCAweGIxLCAweGVkLCAweDUwLCAweGNhLCAweDk2LCAweDZmLCAweDFhLCAweDdhLAorICAgIDB4ZmUsIDB4NTgsIDB4NWQsIDB4ZWMsIDB4MTksIDB4NGEsIDB4ZjYsIDB4MzUsIDB4NmEsIDB4OTcsIDB4MTQsIDB4MDAsCisgICAgMHgwZSwgMHhkMCwgMHg2YiwgMHhiYiwgMHhkNSwgMHg3NSwgMHg1NSwgMHg4YiwgMHg2ZSwgMHg2YiwgMHgxOSwgMHhhMCwKKyAgICAweGY4LCAweDc3LCAweGQ1LCAweGEzfTsKIAotQ0pTX0dsb2JhbERhdGE6OkNKU19HbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApIDogbV9wQXBwKHBBcHApCi17Ci0vLyAgSUJhc2VBbm5vdCogcEJhc2VBbm5vdCA9IElCYXNlQW5ub3Q6OkdldEJhc2VBbm5vdChtX3BBcHApOwotLy8gIEFTU0VSVChwQmFzZUFubm90ICE9IE5VTEwpOwotLy8KLS8vICBtX3NGaWxlUGF0aCA9IHBCYXNlQW5ub3QtPkdldFVzZXJQYXRoKCk7Ci0gICAgbV9zRmlsZVBhdGggKz0gU0RLX0pTX0dMT0JBTERBVEFfRklMRU5BTUU7CitDSlNfR2xvYmFsRGF0YTo6Q0pTX0dsb2JhbERhdGEoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkgOiBtX3BBcHAocEFwcCkgeworICAvLyAgSUJhc2VBbm5vdCogcEJhc2VBbm5vdCA9IElCYXNlQW5ub3Q6OkdldEJhc2VBbm5vdChtX3BBcHApOworICAvLyAgQVNTRVJUKHBCYXNlQW5ub3QgIT0gTlVMTCk7CisgIC8vCisgIC8vICBtX3NGaWxlUGF0aCA9IHBCYXNlQW5ub3QtPkdldFVzZXJQYXRoKCk7CisgIG1fc0ZpbGVQYXRoICs9IFNES19KU19HTE9CQUxEQVRBX0ZJTEVOQU1FOwogCi0gICAgTG9hZEdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKKyAgTG9hZEdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKIH0KIAotQ0pTX0dsb2JhbERhdGE6On5DSlNfR2xvYmFsRGF0YSgpCi17Ci0gICAgU2F2ZUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7CitDSlNfR2xvYmFsRGF0YTo6fkNKU19HbG9iYWxEYXRhKCkgeworICBTYXZlR2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKTsKIAotICAgIGZvciAoaW50IGk9MCxzej1tX2FycmF5R2xvYmFsRGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICAgICAgZGVsZXRlIG1fYXJyYXlHbG9iYWxEYXRhLkdldEF0KGkpOworICBmb3IgKGludCBpID0gMCwgc3ogPSBtX2FycmF5R2xvYmFsRGF0YS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgIGRlbGV0ZSBtX2FycmF5R2xvYmFsRGF0YS5HZXRBdChpKTsKIAotICAgIG1fYXJyYXlHbG9iYWxEYXRhLlJlbW92ZUFsbCgpOworICBtX2FycmF5R2xvYmFsRGF0YS5SZW1vdmVBbGwoKTsKIH0KIAotaW50IENKU19HbG9iYWxEYXRhOjpGaW5kR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpCi17Ci0gICAgQVNTRVJUKHByb3BuYW1lICE9IE5VTEwpOworaW50IENKU19HbG9iYWxEYXRhOjpGaW5kR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpIHsKKyAgQVNTRVJUKHByb3BuYW1lICE9IE5VTEwpOwogCi0gICAgaW50IG5SZXQgPSAtMTsKKyAgaW50IG5SZXQgPSAtMTsKIAotICAgIGZvciAoaW50IGk9MCxzej1tX2FycmF5R2xvYmFsRGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBUZW1wID0gbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaSk7Ci0gICAgICAgIGlmIChwVGVtcC0+ZGF0YS5zS2V5WzBdID09ICpwcm9wbmFtZSAmJiBwVGVtcC0+ZGF0YS5zS2V5ID09IHByb3BuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBuUmV0ID0gaTsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9hcnJheUdsb2JhbERhdGEuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBUZW1wID0gbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaSk7CisgICAgaWYgKHBUZW1wLT5kYXRhLnNLZXlbMF0gPT0gKnByb3BuYW1lICYmIHBUZW1wLT5kYXRhLnNLZXkgPT0gcHJvcG5hbWUpIHsKKyAgICAgIG5SZXQgPSBpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG5SZXQ7Cit9CisKK0NKU19HbG9iYWxEYXRhX0VsZW1lbnQqIENKU19HbG9iYWxEYXRhOjpHZXRHbG9iYWxWYXJpYWJsZSgKKyAgICBjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSkgeworICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CisKKyAgaW50IG5GaW5kID0gRmluZEdsb2JhbFZhcmlhYmxlKHByb3BuYW1lKTsKKyAgaWYgKG5GaW5kID49IDApCisgICAgcmV0dXJuIG1fYXJyYXlHbG9iYWxEYXRhLkdldEF0KG5GaW5kKTsKKworICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVOdW1iZXIoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZERhdGEpIHsKKyAgQVNTRVJUKHByb3BuYW1lICE9IE5VTEwpOworCisgIENGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZSA9IHByb3BuYW1lOworICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKKyAgc1Byb3BOYW1lLlRyaW1SaWdodCgpOworICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApCisgICAgcmV0dXJuOworCisgIGlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpIHsKKyAgICBwRGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI7CisgICAgcERhdGEtPmRhdGEuZERhdGEgPSBkRGF0YTsKKyAgfSBlbHNlIHsKKyAgICBDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwTmV3RGF0YSA9IG5ldyBDSlNfR2xvYmFsRGF0YV9FbGVtZW50OworICAgIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7CisgICAgcE5ld0RhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOworICAgIHBOZXdEYXRhLT5kYXRhLmREYXRhID0gZERhdGE7CisgICAgbV9hcnJheUdsb2JhbERhdGEuQWRkKHBOZXdEYXRhKTsKKyAgfQorfQorCit2b2lkIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZUJvb2xlYW4oY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGF0YSkgeworICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZSA9IHByb3BuYW1lOworCisgIHNQcm9wTmFtZS5UcmltTGVmdCgpOworICBzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7CisKKyAgaWYgKHNQcm9wTmFtZS5HZXRMZW5ndGgoKSA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKSB7CisgICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjsKKyAgICBwRGF0YS0+ZGF0YS5iRGF0YSA9IGJEYXRhOworICB9IGVsc2UgeworICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBOZXdEYXRhID0gbmV3IENKU19HbG9iYWxEYXRhX0VsZW1lbnQ7CisgICAgcE5ld0RhdGEtPmRhdGEuc0tleSA9IHNQcm9wTmFtZTsKKyAgICBwTmV3RGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOworICAgIHBOZXdEYXRhLT5kYXRhLmJEYXRhID0gYkRhdGE7CisKKyAgICBtX2FycmF5R2xvYmFsRGF0YS5BZGQocE5ld0RhdGEpOworICB9Cit9CisKK3ZvaWQgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlU3RyaW5nKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNEYXRhKSB7CisgIEFTU0VSVChwcm9wbmFtZSAhPSBOVUxMKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7CisKKyAgc1Byb3BOYW1lLlRyaW1MZWZ0KCk7CisgIHNQcm9wTmFtZS5UcmltUmlnaHQoKTsKKworICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApCisgICAgcmV0dXJuOworCisgIGlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpIHsKKyAgICBwRGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc7CisgICAgcERhdGEtPmRhdGEuc0RhdGEgPSBzRGF0YTsKKyAgfSBlbHNlIHsKKyAgICBDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwTmV3RGF0YSA9IG5ldyBDSlNfR2xvYmFsRGF0YV9FbGVtZW50OworICAgIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7CisgICAgcE5ld0RhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOworICAgIHBOZXdEYXRhLT5kYXRhLnNEYXRhID0gc0RhdGE7CisKKyAgICBtX2FycmF5R2xvYmFsRGF0YS5BZGQocE5ld0RhdGEpOworICB9Cit9CisKK3ZvaWQgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlT2JqZWN0KAorICAgIGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLAorICAgIGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSkgeworICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZSA9IHByb3BuYW1lOworCisgIHNQcm9wTmFtZS5UcmltTGVmdCgpOworICBzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7CisKKyAgaWYgKHNQcm9wTmFtZS5HZXRMZW5ndGgoKSA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKSB7CisgICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOworICAgIHBEYXRhLT5kYXRhLm9iakRhdGEuQ29weShhcnJheSk7CisgIH0gZWxzZSB7CisgICAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcE5ld0RhdGEgPSBuZXcgQ0pTX0dsb2JhbERhdGFfRWxlbWVudDsKKyAgICBwTmV3RGF0YS0+ZGF0YS5zS2V5ID0gc1Byb3BOYW1lOworICAgIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDsKKyAgICBwTmV3RGF0YS0+ZGF0YS5vYmpEYXRhLkNvcHkoYXJyYXkpOworCisgICAgbV9hcnJheUdsb2JhbERhdGEuQWRkKHBOZXdEYXRhKTsKKyAgfQorfQorCit2b2lkIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZU51bGwoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpIHsKKyAgQVNTRVJUKHByb3BuYW1lICE9IE5VTEwpOworICBDRlhfQnl0ZVN0cmluZyBzUHJvcE5hbWUgPSBwcm9wbmFtZTsKKworICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKKyAgc1Byb3BOYW1lLlRyaW1SaWdodCgpOworCisgIGlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gR2V0R2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKSkgeworICAgIHBEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX05VTEw7CisgIH0gZWxzZSB7CisgICAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcE5ld0RhdGEgPSBuZXcgQ0pTX0dsb2JhbERhdGFfRWxlbWVudDsKKyAgICBwTmV3RGF0YS0+ZGF0YS5zS2V5ID0gc1Byb3BOYW1lOworICAgIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX05VTEw7CisKKyAgICBtX2FycmF5R2xvYmFsRGF0YS5BZGQocE5ld0RhdGEpOworICB9Cit9CisKK0ZYX0JPT0wgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQZXJzaXN0ZW50KSB7CisgIEFTU0VSVChwcm9wbmFtZSAhPSBOVUxMKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7CisKKyAgc1Byb3BOYW1lLlRyaW1MZWZ0KCk7CisgIHNQcm9wTmFtZS5UcmltUmlnaHQoKTsKKworICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpIHsKKyAgICBwRGF0YS0+YlBlcnNpc3RlbnQgPSBiUGVyc2lzdGVudDsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDSlNfR2xvYmFsRGF0YTo6RGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpIHsKKyAgQVNTRVJUKHByb3BuYW1lICE9IE5VTEwpOworICBDRlhfQnl0ZVN0cmluZyBzUHJvcE5hbWUgPSBwcm9wbmFtZTsKKworICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKKyAgc1Byb3BOYW1lLlRyaW1SaWdodCgpOworCisgIGlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaW50IG5GaW5kID0gRmluZEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSk7CisKKyAgaWYgKG5GaW5kID49IDApIHsKKyAgICBkZWxldGUgbV9hcnJheUdsb2JhbERhdGEuR2V0QXQobkZpbmQpOworICAgIG1fYXJyYXlHbG9iYWxEYXRhLlJlbW92ZUF0KG5GaW5kKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworaW50MzJfdCBDSlNfR2xvYmFsRGF0YTo6R2V0U2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYXJyYXlHbG9iYWxEYXRhLkdldFNpemUoKTsKK30KKworQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogQ0pTX0dsb2JhbERhdGE6OkdldEF0KGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaW5kZXgpOworfQorCit2b2lkIENKU19HbG9iYWxEYXRhOjpMb2FkR2xvYmFsUGVyc2lzdGVudFZhcmlhYmxlcygpIHsKKyAgdWludDhfdCogcEJ1ZmZlciA9IE5VTEw7CisgIGludDMyX3Qgbkxlbmd0aCA9IDA7CisKKyAgTG9hZEZpbGVCdWZmZXIobV9zRmlsZVBhdGguY19zdHIoKSwgcEJ1ZmZlciwgbkxlbmd0aCk7CisgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHBCdWZmZXIsIG5MZW5ndGgsIEpTX1JDNEtFWSwgc2l6ZW9mKEpTX1JDNEtFWSkpOworCisgIGlmIChwQnVmZmVyKSB7CisgICAgdWludDhfdCogcCA9IHBCdWZmZXI7CisgICAgRlhfV09SRCB3VHlwZSA9ICooKEZYX1dPUkQqKXApOworICAgIHAgKz0gc2l6ZW9mKEZYX1dPUkQpOworCisgICAgLy8gRlhfV09SRCB3VGVtcCA9IChGWF9XT1JEKSgoJ1gnIDw8IDgpIHwgJ0YnKTsKKworICAgIGlmICh3VHlwZSA9PSAoRlhfV09SRCkoKCdYJyA8PCA4KSB8ICdGJykpIHsKKyAgICAgIEZYX1dPUkQgd1ZlcnNpb24gPSAqKChGWF9XT1JEKilwKTsKKyAgICAgIHAgKz0gc2l6ZW9mKEZYX1dPUkQpOworCisgICAgICBBU1NFUlQod1ZlcnNpb24gPD0gMik7CisKKyAgICAgIEZYX0RXT1JEIGR3Q291bnQgPSAqKChGWF9EV09SRCopcCk7CisgICAgICBwICs9IHNpemVvZihGWF9EV09SRCk7CisKKyAgICAgIEZYX0RXT1JEIGR3U2l6ZSA9ICooKEZYX0RXT1JEKilwKTsKKyAgICAgIHAgKz0gc2l6ZW9mKEZYX0RXT1JEKTsKKworICAgICAgaWYgKGR3U2l6ZSA9PSBuTGVuZ3RoIC0gc2l6ZW9mKEZYX1dPUkQpICogMiAtIHNpemVvZihGWF9EV09SRCkgKiAyKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBkd0NvdW50OyBpIDwgc3o7IGkrKykgeworICAgICAgICAgIGlmIChwID4gcEJ1ZmZlciArIG5MZW5ndGgpCiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KIAotICAgIHJldHVybiBuUmV0OwotfQorICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUxlbiA9ICooKEZYX0RXT1JEKilwKTsKKyAgICAgICAgICBwICs9IHNpemVvZihGWF9EV09SRCk7CiAKLUNKU19HbG9iYWxEYXRhX0VsZW1lbnQqIENKU19HbG9iYWxEYXRhOjpHZXRHbG9iYWxWYXJpYWJsZShjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSkKLXsKLSAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CisgICAgICAgICAgaWYgKHAgKyBkd05hbWVMZW4gPiBwQnVmZmVyICsgbkxlbmd0aCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgaW50IG5GaW5kID0gRmluZEdsb2JhbFZhcmlhYmxlKHByb3BuYW1lKTsKLSAgICBpZiAobkZpbmQgPj0gMCkKLSAgICAgICAgcmV0dXJuIG1fYXJyYXlHbG9iYWxEYXRhLkdldEF0KG5GaW5kKTsKKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzRW50cnkgPSBDRlhfQnl0ZVN0cmluZyhwLCBkd05hbWVMZW4pOworICAgICAgICAgIHAgKz0gc2l6ZW9mKGNoYXIpICogZHdOYW1lTGVuOwogCi0gICAgcmV0dXJuIE5VTEw7Ci19CisgICAgICAgICAgRlhfV09SRCB3RGF0YVR5cGUgPSAqKChGWF9XT1JEKilwKTsKKyAgICAgICAgICBwICs9IHNpemVvZihGWF9XT1JEKTsKIAotdm9pZCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVOdW1iZXIoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGRvdWJsZSBkRGF0YSkKLXsKLSAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CisgICAgICAgICAgc3dpdGNoICh3RGF0YVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUjogeworICAgICAgICAgICAgICBkb3VibGUgZERhdGEgPSAwOworICAgICAgICAgICAgICBzd2l0Y2ggKHdWZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiB7CisgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0RhdGEgPSAqKChGWF9EV09SRCopcCk7CisgICAgICAgICAgICAgICAgICBwICs9IHNpemVvZihGWF9EV09SRCk7CisgICAgICAgICAgICAgICAgICBkRGF0YSA9IGR3RGF0YTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogeworICAgICAgICAgICAgICAgICAgZERhdGEgPSAqKChkb3VibGUqKXApOworICAgICAgICAgICAgICAgICAgcCArPSBzaXplb2YoZG91YmxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKHNFbnRyeSwgZERhdGEpOworICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCBUUlVFKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOiB7CisgICAgICAgICAgICAgIEZYX1dPUkQgd0RhdGEgPSAqKChGWF9XT1JEKilwKTsKKyAgICAgICAgICAgICAgcCArPSBzaXplb2YoRlhfV09SRCk7CisgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlQm9vbGVhbihzRW50cnksIChib29sKSh3RGF0YSA9PSAxKSk7CisgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIFRSVUUpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzogeworICAgICAgICAgICAgICBGWF9EV09SRCBkd0xlbmd0aCA9ICooKEZYX0RXT1JEKilwKTsKKyAgICAgICAgICAgICAgcCArPSBzaXplb2YoRlhfRFdPUkQpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7Ci0gICAgc1Byb3BOYW1lLlRyaW1MZWZ0KCk7Ci0gICAgc1Byb3BOYW1lLlRyaW1SaWdodCgpOwotICAgIGlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICBpZiAocCArIGR3TGVuZ3RoID4gcEJ1ZmZlciArIG5MZW5ndGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKQotICAgIHsKLSAgICAgICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOwotICAgICAgICBwRGF0YS0+ZGF0YS5kRGF0YSA9IGREYXRhOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwTmV3RGF0YSA9IG5ldyBDSlNfR2xvYmFsRGF0YV9FbGVtZW50OwotICAgICAgICBwTmV3RGF0YS0+ZGF0YS5zS2V5ID0gc1Byb3BOYW1lOwotICAgICAgICBwTmV3RGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI7Ci0gICAgICAgIHBOZXdEYXRhLT5kYXRhLmREYXRhID0gZERhdGE7Ci0gICAgICAgIG1fYXJyYXlHbG9iYWxEYXRhLkFkZChwTmV3RGF0YSk7Ci0gICAgfQotfQotCi12b2lkIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZUJvb2xlYW4oY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGJvb2wgYkRhdGEpCi17Ci0gICAgQVNTRVJUKHByb3BuYW1lICE9IE5VTEwpOwotICAgIENGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZSA9IHByb3BuYW1lOwotCi0gICAgc1Byb3BOYW1lLlRyaW1MZWZ0KCk7Ci0gICAgc1Byb3BOYW1lLlRyaW1SaWdodCgpOwotCi0gICAgaWYgKHNQcm9wTmFtZS5HZXRMZW5ndGgoKSA9PSAwKSByZXR1cm47Ci0KLSAgICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKQotICAgIHsKLSAgICAgICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjsKLSAgICAgICAgcERhdGEtPmRhdGEuYkRhdGEgPSBiRGF0YTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcE5ld0RhdGEgPSBuZXcgQ0pTX0dsb2JhbERhdGFfRWxlbWVudDsKLSAgICAgICAgcE5ld0RhdGEtPmRhdGEuc0tleSA9IHNQcm9wTmFtZTsKLSAgICAgICAgcE5ld0RhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjsKLSAgICAgICAgcE5ld0RhdGEtPmRhdGEuYkRhdGEgPSBiRGF0YTsKLQotICAgICAgICBtX2FycmF5R2xvYmFsRGF0YS5BZGQocE5ld0RhdGEpOwotICAgIH0KLX0KLQotdm9pZCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVTdHJpbmcoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSkKLXsKLSAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7Ci0KLSAgICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKLSAgICBzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7Ci0KLSAgICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybjsKLQotICAgIGlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpCi0gICAgewotICAgICAgICBwRGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc7Ci0gICAgICAgIHBEYXRhLT5kYXRhLnNEYXRhID0gc0RhdGE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBOZXdEYXRhID0gbmV3IENKU19HbG9iYWxEYXRhX0VsZW1lbnQ7Ci0gICAgICAgIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7Ci0gICAgICAgIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzsKLSAgICAgICAgcE5ld0RhdGEtPmRhdGEuc0RhdGEgPSBzRGF0YTsKLQotICAgICAgICBtX2FycmF5R2xvYmFsRGF0YS5BZGQocE5ld0RhdGEpOwotICAgIH0KLX0KLQotdm9pZCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVPYmplY3QoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSkKLXsKLSAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7Ci0KLSAgICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKLSAgICBzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7Ci0KLSAgICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybjsKLQotICAgIGlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpCi0gICAgewotICAgICAgICBwRGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q7Ci0gICAgICAgIHBEYXRhLT5kYXRhLm9iakRhdGEuQ29weShhcnJheSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBOZXdEYXRhID0gbmV3IENKU19HbG9iYWxEYXRhX0VsZW1lbnQ7Ci0gICAgICAgIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7Ci0gICAgICAgIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDsKLSAgICAgICAgcE5ld0RhdGEtPmRhdGEub2JqRGF0YS5Db3B5KGFycmF5KTsKLQotICAgICAgICBtX2FycmF5R2xvYmFsRGF0YS5BZGQocE5ld0RhdGEpOwotICAgIH0KLX0KLQotdm9pZCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVOdWxsKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lKQotewotICAgIEFTU0VSVChwcm9wbmFtZSAhPSBOVUxMKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBzUHJvcE5hbWUgPSBwcm9wbmFtZTsKLQotICAgIHNQcm9wTmFtZS5UcmltTGVmdCgpOwotICAgIHNQcm9wTmFtZS5UcmltUmlnaHQoKTsKLQotICAgIGlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCi0gICAgaWYgKENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gR2V0R2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKSkKLSAgICB7Ci0gICAgICAgIHBEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX05VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBOZXdEYXRhID0gbmV3IENKU19HbG9iYWxEYXRhX0VsZW1lbnQ7Ci0gICAgICAgIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7Ci0gICAgICAgIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX05VTEw7Ci0KLSAgICAgICAgbV9hcnJheUdsb2JhbERhdGEuQWRkKHBOZXdEYXRhKTsKLSAgICB9Ci19Ci0KLUZYX0JPT0wgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgRlhfQk9PTCBiUGVyc2lzdGVudCkKLXsKLSAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7Ci0KLSAgICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKLSAgICBzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7Ci0KLSAgICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpCi0gICAgewotICAgICAgICBwRGF0YS0+YlBlcnNpc3RlbnQgPSBiUGVyc2lzdGVudDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENKU19HbG9iYWxEYXRhOjpEZWxldGVHbG9iYWxWYXJpYWJsZShjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSkKLXsKLSAgICBBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7Ci0KLSAgICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKLSAgICBzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7Ci0KLSAgICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybiBGQUxTRTsKLQotICAgIGludCBuRmluZCA9IEZpbmRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpOwotCi0gICAgaWYgKG5GaW5kID49IDApCi0gICAgewotICAgICAgICBkZWxldGUgbV9hcnJheUdsb2JhbERhdGEuR2V0QXQobkZpbmQpOwotICAgICAgICBtX2FycmF5R2xvYmFsRGF0YS5SZW1vdmVBdChuRmluZCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotaW50MzJfdCBDSlNfR2xvYmFsRGF0YTo6R2V0U2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYXJyYXlHbG9iYWxEYXRhLkdldFNpemUoKTsKLX0KLQotQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogQ0pTX0dsb2JhbERhdGE6OkdldEF0KGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaW5kZXgpOwotfQotCi12b2lkIENKU19HbG9iYWxEYXRhOjpMb2FkR2xvYmFsUGVyc2lzdGVudFZhcmlhYmxlcygpCi17Ci0gICAgdWludDhfdCogcEJ1ZmZlciA9IE5VTEw7Ci0gICAgaW50MzJfdCBuTGVuZ3RoID0gMDsKLQotICAgIExvYWRGaWxlQnVmZmVyKG1fc0ZpbGVQYXRoLmNfc3RyKCksIHBCdWZmZXIsIG5MZW5ndGgpOwotICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHBCdWZmZXIsIG5MZW5ndGgsIEpTX1JDNEtFWSwgc2l6ZW9mKEpTX1JDNEtFWSkpOwotCi0gICAgaWYgKHBCdWZmZXIpCi0gICAgewotICAgICAgICB1aW50OF90KiBwID0gcEJ1ZmZlcjsKLSAgICAgICAgRlhfV09SRCB3VHlwZSA9ICooKEZYX1dPUkQqKXApOwotICAgICAgICBwICs9IHNpemVvZihGWF9XT1JEKTsKLQotICAgICAgICAvL0ZYX1dPUkQgd1RlbXAgPSAoRlhfV09SRCkoKCdYJyA8PCA4KSB8ICdGJyk7Ci0KLSAgICAgICAgaWYgKHdUeXBlID09IChGWF9XT1JEKSgoJ1gnIDw8IDgpIHwgJ0YnKSkKLSAgICAgICAgewotICAgICAgICAgICAgRlhfV09SRCB3VmVyc2lvbiA9ICooKEZYX1dPUkQqKXApOwotICAgICAgICAgICAgcCArPSBzaXplb2YoRlhfV09SRCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVCh3VmVyc2lvbiA8PSAyKTsKLQotICAgICAgICAgICAgRlhfRFdPUkQgZHdDb3VudCA9ICooKEZYX0RXT1JEKilwKTsKLSAgICAgICAgICAgIHAgKz0gc2l6ZW9mKEZYX0RXT1JEKTsKLQotICAgICAgICAgICAgRlhfRFdPUkQgZHdTaXplID0gKigoRlhfRFdPUkQqKXApOwotICAgICAgICAgICAgcCArPSBzaXplb2YoRlhfRFdPUkQpOwotCi0gICAgICAgICAgICBpZiAoZHdTaXplID09IG5MZW5ndGggLSBzaXplb2YoRlhfV09SRCkgKiAyIC0gc2l6ZW9mKEZYX0RXT1JEKSogMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaT0wLHN6PWR3Q291bnQ7IGk8c3o7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwID4gcEJ1ZmZlciArIG5MZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd05hbWVMZW4gPSAqKChGWF9EV09SRCopcCk7Ci0gICAgICAgICAgICAgICAgICAgIHAgKz0gc2l6ZW9mKEZYX0RXT1JEKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocCArIGR3TmFtZUxlbiA+IHBCdWZmZXIgKyBuTGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0VudHJ5ID0gQ0ZYX0J5dGVTdHJpbmcocCwgZHdOYW1lTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgcCArPSBzaXplb2YoY2hhcikgKiBkd05hbWVMZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3RGF0YVR5cGUgPSAqKChGWF9XT1JEKilwKTsKLSAgICAgICAgICAgICAgICAgICAgcCArPSBzaXplb2YoRlhfV09SRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3RGF0YVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkRGF0YSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3VmVyc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0RhdGEgPSAqKChGWF9EV09SRCopcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IHNpemVvZihGWF9EV09SRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGF0YSA9IGR3RGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGREYXRhID0gKigoZG91YmxlKilwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gc2l6ZW9mKGRvdWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKHNFbnRyeSwgZERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3RGF0YSA9ICooKEZYX1dPUkQqKXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gc2l6ZW9mKEZYX1dPUkQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlQm9vbGVhbihzRW50cnksIChib29sKSh3RGF0YSA9PSAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TGVuZ3RoID0gKigoRlhfRFdPUkQqKXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gc2l6ZW9mKEZYX0RXT1JEKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwICsgZHdMZW5ndGggPiBwQnVmZmVyICsgbkxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVN0cmluZyhzRW50cnksIENGWF9CeXRlU3RyaW5nKHAsIGR3TGVuZ3RoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBzaXplb2YoY2hhcikgKiBkd0xlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlTnVsbChzRW50cnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVN0cmluZyhzRW50cnksIENGWF9CeXRlU3RyaW5nKHAsIGR3TGVuZ3RoKSk7CisgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIFRSVUUpOworICAgICAgICAgICAgICBwICs9IHNpemVvZihjaGFyKSAqIGR3TGVuZ3RoOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6IHsKKyAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVOdWxsKHNFbnRyeSk7CisgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIFRSVUUpOwogICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBGWF9GcmVlKHBCdWZmZXIpOworICAgICAgfQogICAgIH0KKyAgICBGWF9GcmVlKHBCdWZmZXIpOworICB9CiB9CiAKIC8qCkBAIC00NzEsMTA0ICs0MTUsOTYgQEAKIH07CiAqLwogCi12b2lkIENKU19HbG9iYWxEYXRhOjpTYXZlR2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKQotewotICAgIEZYX0RXT1JEIG5Db3VudCA9IDA7Ci0gICAgQ0ZYX0JpbmFyeUJ1ZiBzRGF0YTsKK3ZvaWQgQ0pTX0dsb2JhbERhdGE6OlNhdmVHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpIHsKKyAgRlhfRFdPUkQgbkNvdW50ID0gMDsKKyAgQ0ZYX0JpbmFyeUJ1ZiBzRGF0YTsKIAotICAgIGZvciAoaW50IGk9MCxzej1tX2FycmF5R2xvYmFsRGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBFbGVtZW50ID0gbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaSk7Ci0gICAgICAgIEFTU0VSVChwRWxlbWVudCAhPSBOVUxMKTsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9hcnJheUdsb2JhbERhdGEuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBFbGVtZW50ID0gbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaSk7CisgICAgQVNTRVJUKHBFbGVtZW50ICE9IE5VTEwpOwogCi0gICAgICAgIGlmIChwRWxlbWVudC0+YlBlcnNpc3RlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENGWF9CaW5hcnlCdWYgc0VsZW1lbnQ7Ci0gICAgICAgICAgICBNYWtlQnl0ZVN0cmluZyhwRWxlbWVudC0+ZGF0YS5zS2V5LCAmcEVsZW1lbnQtPmRhdGEsIHNFbGVtZW50KTsKKyAgICBpZiAocEVsZW1lbnQtPmJQZXJzaXN0ZW50KSB7CisgICAgICBDRlhfQmluYXJ5QnVmIHNFbGVtZW50OworICAgICAgTWFrZUJ5dGVTdHJpbmcocEVsZW1lbnQtPmRhdGEuc0tleSwgJnBFbGVtZW50LT5kYXRhLCBzRWxlbWVudCk7CiAKLSAgICAgICAgICAgIGlmIChzRGF0YS5HZXRTaXplKCkgKyBzRWxlbWVudC5HZXRTaXplKCkgPiBKU19NQVhHTE9CQUxEQVRBKQotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKHNEYXRhLkdldFNpemUoKSArIHNFbGVtZW50LkdldFNpemUoKSA+IEpTX01BWEdMT0JBTERBVEEpCisgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBzRGF0YS5BcHBlbmRCbG9jayhzRWxlbWVudC5HZXRCdWZmZXIoKSwgc0VsZW1lbnQuR2V0U2l6ZSgpKTsKLSAgICAgICAgICAgIG5Db3VudCsrOwotICAgICAgICB9CisgICAgICBzRGF0YS5BcHBlbmRCbG9jayhzRWxlbWVudC5HZXRCdWZmZXIoKSwgc0VsZW1lbnQuR2V0U2l6ZSgpKTsKKyAgICAgIG5Db3VudCsrOwogICAgIH0KKyAgfQogCi0gICAgQ0ZYX0JpbmFyeUJ1ZiBzRmlsZTsKKyAgQ0ZYX0JpbmFyeUJ1ZiBzRmlsZTsKIAotICAgIEZYX1dPUkQgd1R5cGUgPSAoRlhfV09SRCkoKCdYJyA8PCA4KSB8ICdGJyk7Ci0gICAgc0ZpbGUuQXBwZW5kQmxvY2soJndUeXBlLCBzaXplb2YoRlhfV09SRCkpOwotICAgIEZYX1dPUkQgd1ZlcnNpb24gPSAyOwotICAgIHNGaWxlLkFwcGVuZEJsb2NrKCZ3VmVyc2lvbiwgc2l6ZW9mKEZYX1dPUkQpKTsKLSAgICBzRmlsZS5BcHBlbmRCbG9jaygmbkNvdW50LCBzaXplb2YoRlhfRFdPUkQpKTsKLSAgICBGWF9EV09SRCBkd1NpemUgPSBzRGF0YS5HZXRTaXplKCk7Ci0gICAgc0ZpbGUuQXBwZW5kQmxvY2soJmR3U2l6ZSwgc2l6ZW9mKEZYX0RXT1JEKSk7CisgIEZYX1dPUkQgd1R5cGUgPSAoRlhfV09SRCkoKCdYJyA8PCA4KSB8ICdGJyk7CisgIHNGaWxlLkFwcGVuZEJsb2NrKCZ3VHlwZSwgc2l6ZW9mKEZYX1dPUkQpKTsKKyAgRlhfV09SRCB3VmVyc2lvbiA9IDI7CisgIHNGaWxlLkFwcGVuZEJsb2NrKCZ3VmVyc2lvbiwgc2l6ZW9mKEZYX1dPUkQpKTsKKyAgc0ZpbGUuQXBwZW5kQmxvY2soJm5Db3VudCwgc2l6ZW9mKEZYX0RXT1JEKSk7CisgIEZYX0RXT1JEIGR3U2l6ZSA9IHNEYXRhLkdldFNpemUoKTsKKyAgc0ZpbGUuQXBwZW5kQmxvY2soJmR3U2l6ZSwgc2l6ZW9mKEZYX0RXT1JEKSk7CiAKLSAgICBzRmlsZS5BcHBlbmRCbG9jayhzRGF0YS5HZXRCdWZmZXIoKSwgc0RhdGEuR2V0U2l6ZSgpKTsKKyAgc0ZpbGUuQXBwZW5kQmxvY2soc0RhdGEuR2V0QnVmZmVyKCksIHNEYXRhLkdldFNpemUoKSk7CiAKLSAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhzRmlsZS5HZXRCdWZmZXIoKSwgc0ZpbGUuR2V0U2l6ZSgpLCBKU19SQzRLRVksIHNpemVvZihKU19SQzRLRVkpKTsKLSAgICBXcml0ZUZpbGVCdWZmZXIobV9zRmlsZVBhdGguY19zdHIoKSwgKGNvbnN0IEZYX0NIQVIqKXNGaWxlLkdldEJ1ZmZlcigpLCBzRmlsZS5HZXRTaXplKCkpOworICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhzRmlsZS5HZXRCdWZmZXIoKSwgc0ZpbGUuR2V0U2l6ZSgpLCBKU19SQzRLRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKU19SQzRLRVkpKTsKKyAgV3JpdGVGaWxlQnVmZmVyKG1fc0ZpbGVQYXRoLmNfc3RyKCksIChjb25zdCBGWF9DSEFSKilzRmlsZS5HZXRCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgIHNGaWxlLkdldFNpemUoKSk7CiB9CiAKLXZvaWQgQ0pTX0dsb2JhbERhdGE6OkxvYWRGaWxlQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBzRmlsZVBhdGgsIHVpbnQ4X3QqJiBwQnVmZmVyLCBpbnQzMl90JiBuTGVuZ3RoKQotewotLy9VblN1cHBvcnQuCit2b2lkIENKU19HbG9iYWxEYXRhOjpMb2FkRmlsZUJ1ZmZlcihjb25zdCBGWF9XQ0hBUiogc0ZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuTGVuZ3RoKSB7CisgIC8vIFVuU3VwcG9ydC4KIH0KIAotdm9pZCBDSlNfR2xvYmFsRGF0YTo6V3JpdGVGaWxlQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBzRmlsZVBhdGgsIGNvbnN0IEZYX0NIQVIqIHBCdWZmZXIsIGludDMyX3Qgbkxlbmd0aCkKLXsKLS8vVW5TdXBwb3J0Lgordm9pZCBDSlNfR2xvYmFsRGF0YTo6V3JpdGVGaWxlQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBzRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpIHsKKyAgLy8gVW5TdXBwb3J0LgogfQogCi12b2lkIENKU19HbG9iYWxEYXRhOjpNYWtlQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ0pTX0tleVZhbHVlKiBwRGF0YSwgQ0ZYX0JpbmFyeUJ1ZiYgc0RhdGEpCi17Ci0gICAgRlhfV09SRCB3VHlwZSA9IChGWF9XT1JEKXBEYXRhLT5uVHlwZTsKLSAgICBzd2l0Y2ggKHdUeXBlKQotICAgIHsKLSAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUxlbiA9IChGWF9EV09SRCluYW1lLkdldExlbmd0aCgpOwotICAgICAgICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJmR3TmFtZUxlbiwgc2l6ZW9mKEZYX0RXT1JEKSk7Ci0gICAgICAgICAgICBzRGF0YS5BcHBlbmRTdHJpbmcobmFtZSk7Ci0gICAgICAgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmd1R5cGUsIHNpemVvZihGWF9XT1JEKSk7Cit2b2lkIENKU19HbG9iYWxEYXRhOjpNYWtlQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19LZXlWYWx1ZSogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBzRGF0YSkgeworICBGWF9XT1JEIHdUeXBlID0gKEZYX1dPUkQpcERhdGEtPm5UeXBlOworICBzd2l0Y2ggKHdUeXBlKSB7CisgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOiB7CisgICAgICBGWF9EV09SRCBkd05hbWVMZW4gPSAoRlhfRFdPUkQpbmFtZS5HZXRMZW5ndGgoKTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZkd05hbWVMZW4sIHNpemVvZihGWF9EV09SRCkpOworICAgICAgc0RhdGEuQXBwZW5kU3RyaW5nKG5hbWUpOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJndUeXBlLCBzaXplb2YoRlhfV09SRCkpOwogCi0gICAgICAgICAgICBkb3VibGUgZERhdGEgPSBwRGF0YS0+ZERhdGE7Ci0gICAgICAgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmZERhdGEsIHNpemVvZihkb3VibGUpKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOgotICAgICAgICB7Ci0gICAgICAgICAgICBGWF9EV09SRCBkd05hbWVMZW4gPSAoRlhfRFdPUkQpbmFtZS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZkd05hbWVMZW4sIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICAgICAgc0RhdGEuQXBwZW5kU3RyaW5nKG5hbWUpOwotICAgICAgICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJndUeXBlLCBzaXplb2YoRlhfV09SRCkpOworICAgICAgZG91YmxlIGREYXRhID0gcERhdGEtPmREYXRhOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJmREYXRhLCBzaXplb2YoZG91YmxlKSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOiB7CisgICAgICBGWF9EV09SRCBkd05hbWVMZW4gPSAoRlhfRFdPUkQpbmFtZS5HZXRMZW5ndGgoKTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZkd05hbWVMZW4sIHNpemVvZihGWF9EV09SRCkpOworICAgICAgc0RhdGEuQXBwZW5kU3RyaW5nKG5hbWUpOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJndUeXBlLCBzaXplb2YoRlhfV09SRCkpOwogCi0gICAgICAgICAgICBGWF9XT1JEIHdEYXRhID0gKEZYX1dPUkQpcERhdGEtPmJEYXRhOwotICAgICAgICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJndEYXRhLCBzaXplb2YoRlhfV09SRCkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzoKLSAgICAgICAgewotICAgICAgICAgICAgRlhfRFdPUkQgZHdOYW1lTGVuID0gKEZYX0RXT1JEKW5hbWUuR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmZHdOYW1lTGVuLCBzaXplb2YoRlhfRFdPUkQpKTsKLSAgICAgICAgICAgIHNEYXRhLkFwcGVuZFN0cmluZyhuYW1lKTsKLSAgICAgICAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZ3VHlwZSwgc2l6ZW9mKEZYX1dPUkQpKTsKKyAgICAgIEZYX1dPUkQgd0RhdGEgPSAoRlhfV09SRClwRGF0YS0+YkRhdGE7CisgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmd0RhdGEsIHNpemVvZihGWF9XT1JEKSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6IHsKKyAgICAgIEZYX0RXT1JEIGR3TmFtZUxlbiA9IChGWF9EV09SRCluYW1lLkdldExlbmd0aCgpOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJmR3TmFtZUxlbiwgc2l6ZW9mKEZYX0RXT1JEKSk7CisgICAgICBzRGF0YS5BcHBlbmRTdHJpbmcobmFtZSk7CisgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmd1R5cGUsIHNpemVvZihGWF9XT1JEKSk7CiAKLSAgICAgICAgICAgIEZYX0RXT1JEIGR3RGF0YUxlbiA9IChGWF9EV09SRClwRGF0YS0+c0RhdGEuR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmZHdEYXRhTGVuLCBzaXplb2YoRlhfRFdPUkQpKTsKLSAgICAgICAgICAgIHNEYXRhLkFwcGVuZFN0cmluZyhwRGF0YS0+c0RhdGEpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUxlbiA9IChGWF9EV09SRCluYW1lLkdldExlbmd0aCgpOwotICAgICAgICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJmR3TmFtZUxlbiwgc2l6ZW9mKEZYX0RXT1JEKSk7Ci0gICAgICAgICAgICBzRGF0YS5BcHBlbmRTdHJpbmcobmFtZSk7Ci0gICAgICAgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmd1R5cGUsIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgRlhfRFdPUkQgZHdEYXRhTGVuID0gKEZYX0RXT1JEKXBEYXRhLT5zRGF0YS5HZXRMZW5ndGgoKTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZkd0RhdGFMZW4sIHNpemVvZihGWF9EV09SRCkpOworICAgICAgc0RhdGEuQXBwZW5kU3RyaW5nKHBEYXRhLT5zRGF0YSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOiB7CisgICAgICBGWF9EV09SRCBkd05hbWVMZW4gPSAoRlhfRFdPUkQpbmFtZS5HZXRMZW5ndGgoKTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZkd05hbWVMZW4sIHNpemVvZihGWF9EV09SRCkpOworICAgICAgc0RhdGEuQXBwZW5kU3RyaW5nKG5hbWUpOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJndUeXBlLCBzaXplb2YoRlhfRFdPUkQpKTsKKyAgICB9IGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKyAgICAgIGJyZWFrOworICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfT2JqZWN0LmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfT2JqZWN0LmNwcAppbmRleCAyZWUyM2Y4Li5lYjA4OWVkIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX09iamVjdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19PYmplY3QuY3BwCkBAIC0xMCwxMzcgKzEwLDEzMCBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIgogCi1KU19USU1FUl9NQVBBUlJBWSYgR2V0VGltZU1hcCgpCi17CitKU19USU1FUl9NQVBBUlJBWSYgR2V0VGltZU1hcCgpIHsKICAgLy8gTGVhayB0aGUgdGltZXIgYXJyYXkgYXQgc2h1dGRvd24uCiAgIHN0YXRpYyBhdXRvKiB0aW1lTWFwID0gbmV3IEpTX1RJTUVSX01BUEFSUkFZOwogICByZXR1cm4gKnRpbWVNYXA7CiB9CiAKLWludCBGWEpTX01zZ0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IEZYX1dDSEFSKiBzd01zZywgY29uc3QgRlhfV0NIQVIqIHN3VGl0bGUsIEZYX1VJTlQgblR5cGUsIEZYX1VJTlQgbkljb24pCi17Ci0gICAgaWYgKCFwQXBwKQotICAgICAgICByZXR1cm4gMDsKK2ludCBGWEpTX01zZ0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLAorICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3dNc2csCisgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN3VGl0bGUsCisgICAgICAgICAgICAgICAgRlhfVUlOVCBuVHlwZSwKKyAgICAgICAgICAgICAgICBGWF9VSU5UIG5JY29uKSB7CisgIGlmICghcEFwcCkKKyAgICByZXR1cm4gMDsKIAotICAgIGlmIChDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gcEFwcC0+R2V0U0RLRG9jdW1lbnQoKSkKLSAgICAgICAgcERvYy0+S2lsbEZvY3VzQW5ub3QoKTsKKyAgaWYgKENQREZTREtfRG9jdW1lbnQqIHBEb2MgPSBwQXBwLT5HZXRTREtEb2N1bWVudCgpKQorICAgIHBEb2MtPktpbGxGb2N1c0Fubm90KCk7CiAKLSAgICByZXR1cm4gcEFwcC0+SlNfYXBwQWxlcnQoc3dNc2csIHN3VGl0bGUsIG5UeXBlLCBuSWNvbik7CisgIHJldHVybiBwQXBwLT5KU19hcHBBbGVydChzd01zZywgc3dUaXRsZSwgblR5cGUsIG5JY29uKTsKIH0KIAotQ1BERlNES19QYWdlVmlldyogRlhKU19HZXRQYWdlVmlldyhJRlhKU19Db250ZXh0KiBjYykKLXsKLSAgICBpZiAoQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2MpCi0gICAgewotICAgICAgICBpZiAocENvbnRleHQtPkdldFJlYWRlckRvY3VtZW50KCkpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CitDUERGU0RLX1BhZ2VWaWV3KiBGWEpTX0dldFBhZ2VWaWV3KElGWEpTX0NvbnRleHQqIGNjKSB7CisgIGlmIChDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjKSB7CisgICAgaWYgKHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgQ0pTX0VtYmVkT2JqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBDSlNfRW1iZWRPYmoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DSlNfRW1iZWRPYmo6OkNKU19FbWJlZE9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDoKLSAgICBtX3BKU09iamVjdChwSlNPYmplY3QpCi17CitDSlNfRW1iZWRPYmo6OkNKU19FbWJlZE9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogbV9wSlNPYmplY3QocEpTT2JqZWN0KSB7fQorCitDSlNfRW1iZWRPYmo6On5DSlNfRW1iZWRPYmooKSB7CisgIG1fcEpTT2JqZWN0ID0gTlVMTDsKIH0KIAotQ0pTX0VtYmVkT2JqOjp+Q0pTX0VtYmVkT2JqKCkKLXsKLSAgICBtX3BKU09iamVjdCA9IE5VTEw7Ci0KK0NQREZTREtfUGFnZVZpZXcqIENKU19FbWJlZE9iajo6SlNHZXRQYWdlVmlldyhJRlhKU19Db250ZXh0KiBjYykgeworICByZXR1cm4gRlhKU19HZXRQYWdlVmlldyhjYyk7CiB9CiAKLUNQREZTREtfUGFnZVZpZXcqIENKU19FbWJlZE9iajo6SlNHZXRQYWdlVmlldyhJRlhKU19Db250ZXh0KiBjYykKLXsKLSAgICByZXR1cm4gRlhKU19HZXRQYWdlVmlldyhjYyk7CitpbnQgQ0pTX0VtYmVkT2JqOjpNc2dCb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN3TXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzd1RpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuSWNvbikgeworICByZXR1cm4gRlhKU19Nc2dCb3gocEFwcCwgcFBhZ2VWaWV3LCBzd01zZywgc3dUaXRsZSwgblR5cGUsIG5JY29uKTsKIH0KIAotaW50IENKU19FbWJlZE9iajo6TXNnQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxjb25zdCBGWF9XQ0hBUiogc3dNc2csY29uc3QgRlhfV0NIQVIqIHN3VGl0bGUsRlhfVUlOVCBuVHlwZSxGWF9VSU5UIG5JY29uKQotewotICAgIHJldHVybiBGWEpTX01zZ0JveChwQXBwLCBwUGFnZVZpZXcsIHN3TXNnLCBzd1RpdGxlLCBuVHlwZSwgbkljb24pOwordm9pZCBDSlNfRW1iZWRPYmo6OkFsZXJ0KENKU19Db250ZXh0KiBwQ29udGV4dCwgY29uc3QgRlhfV0NIQVIqIHN3TXNnKSB7CisgIENKU19PYmplY3Q6OkFsZXJ0KHBDb250ZXh0LCBzd01zZyk7CiB9CiAKLXZvaWQgQ0pTX0VtYmVkT2JqOjpBbGVydChDSlNfQ29udGV4dCogcENvbnRleHQsIGNvbnN0IEZYX1dDSEFSKiBzd01zZykKLXsKLSAgICBDSlNfT2JqZWN0OjpBbGVydChwQ29udGV4dCwgc3dNc2cpOworQ0pTX1RpbWVyKiBDSlNfRW1iZWRPYmo6OkJlZ2luVGltZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkVsYXBzZSkgeworICBDSlNfVGltZXIqIHBUaW1lciA9IG5ldyBDSlNfVGltZXIodGhpcywgcEFwcCk7CisgIHBUaW1lci0+U2V0SlNUaW1lcihuRWxhcHNlKTsKKworICByZXR1cm4gcFRpbWVyOwogfQogCi1DSlNfVGltZXIqIENKU19FbWJlZE9iajo6QmVnaW5UaW1lcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBGWF9VSU5UIG5FbGFwc2UpCi17Ci0gICAgQ0pTX1RpbWVyKiBwVGltZXIgPSBuZXcgQ0pTX1RpbWVyKHRoaXMscEFwcCk7Ci0gICAgcFRpbWVyLT5TZXRKU1RpbWVyKG5FbGFwc2UpOwotCi0gICAgcmV0dXJuIHBUaW1lcjsKK3ZvaWQgQ0pTX0VtYmVkT2JqOjpFbmRUaW1lcihDSlNfVGltZXIqIHBUaW1lcikgeworICBBU1NFUlQocFRpbWVyICE9IE5VTEwpOworICBwVGltZXItPktpbGxKU1RpbWVyKCk7CisgIGRlbGV0ZSBwVGltZXI7CiB9CiAKLXZvaWQgQ0pTX0VtYmVkT2JqOjpFbmRUaW1lcihDSlNfVGltZXIqIHBUaW1lcikKLXsKLSAgICBBU1NFUlQocFRpbWVyICE9IE5VTEwpOwotICAgIHBUaW1lci0+S2lsbEpTVGltZXIoKTsKLSAgICBkZWxldGUgcFRpbWVyOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBDSlNfT2JqZWN0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgRnJlZU9iamVjdChjb25zdCB2ODo6V2Vha0NhbGxiYWNrSW5mbzxDSlNfT2JqZWN0PiYgZGF0YSkgeworICBDSlNfT2JqZWN0KiBwSlNPYmogPSBkYXRhLkdldFBhcmFtZXRlcigpOworICBwSlNPYmotPkV4aXRJbnN0YW5jZSgpOworICBkZWxldGUgcEpTT2JqOworICBKU19GcmVlUHJpdmF0ZShkYXRhLkdldEludGVybmFsRmllbGQoMCkpOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIENKU19PYmplY3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkICBGcmVlT2JqZWN0KGNvbnN0IHY4OjpXZWFrQ2FsbGJhY2tJbmZvPENKU19PYmplY3Q+JiBkYXRhKQotewotICAgIENKU19PYmplY3QqIHBKU09iaiAgPSBkYXRhLkdldFBhcmFtZXRlcigpOwotICAgICAgICBwSlNPYmotPkV4aXRJbnN0YW5jZSgpOwotICAgICAgICBkZWxldGUgcEpTT2JqOwotICAgIEpTX0ZyZWVQcml2YXRlKGRhdGEuR2V0SW50ZXJuYWxGaWVsZCgwKSk7Cit2b2lkIERpc3Bvc2VPYmplY3QoY29uc3Qgdjg6OldlYWtDYWxsYmFja0luZm88Q0pTX09iamVjdD4mIGRhdGEpIHsKKyAgQ0pTX09iamVjdCogcEpTT2JqID0gZGF0YS5HZXRQYXJhbWV0ZXIoKTsKKyAgcEpTT2JqLT5EaXNwb3NlKCk7CisgIGRhdGEuU2V0U2Vjb25kUGFzc0NhbGxiYWNrKEZyZWVPYmplY3QpOwogfQogCi12b2lkICBEaXNwb3NlT2JqZWN0KGNvbnN0IHY4OjpXZWFrQ2FsbGJhY2tJbmZvPENKU19PYmplY3Q+JiBkYXRhKQotewotICAgIENKU19PYmplY3QqIHBKU09iaiAgPSBkYXRhLkdldFBhcmFtZXRlcigpOwotICAgICAgICBwSlNPYmotPkRpc3Bvc2UoKTsKLSAgICAgICAgZGF0YS5TZXRTZWNvbmRQYXNzQ2FsbGJhY2soRnJlZU9iamVjdCk7Ci19Ci0KLUNKU19PYmplY3Q6OkNKU19PYmplY3QoSlNGWE9iamVjdCBwT2JqZWN0KSA6bV9wRW1iZWRPYmooTlVMTCkKLXsKLSAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwT2JqZWN0LT5DcmVhdGlvbkNvbnRleHQoKTsKLSAgICBtX3BJc29sYXRlID0gY29udGV4dC0+R2V0SXNvbGF0ZSgpOwotICAgIG1fcE9iamVjdC5SZXNldChtX3BJc29sYXRlLCBwT2JqZWN0KTsKK0NKU19PYmplY3Q6OkNKU19PYmplY3QoSlNGWE9iamVjdCBwT2JqZWN0KSA6IG1fcEVtYmVkT2JqKE5VTEwpIHsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcE9iamVjdC0+Q3JlYXRpb25Db250ZXh0KCk7CisgIG1fcElzb2xhdGUgPSBjb250ZXh0LT5HZXRJc29sYXRlKCk7CisgIG1fcE9iamVjdC5SZXNldChtX3BJc29sYXRlLCBwT2JqZWN0KTsKIH07CiAKLUNKU19PYmplY3Q6On5DSlNfT2JqZWN0KHZvaWQpCi17Ci0gICAgZGVsZXRlIG1fcEVtYmVkT2JqOwotICAgIG1fcEVtYmVkT2JqID0gTlVMTDsKK0NKU19PYmplY3Q6On5DSlNfT2JqZWN0KHZvaWQpIHsKKyAgZGVsZXRlIG1fcEVtYmVkT2JqOworICBtX3BFbWJlZE9iaiA9IE5VTEw7CiAKLSAgICBtX3BPYmplY3QuUmVzZXQoKTsKKyAgbV9wT2JqZWN0LlJlc2V0KCk7CiB9OwogCi12b2lkICAgIENKU19PYmplY3Q6Ok1ha2VXZWFrKCkKLXsKLSAgICBtX3BPYmplY3QuU2V0V2VhaygKLSAgICAgICAgICAgIHRoaXMsIERpc3Bvc2VPYmplY3QsIHY4OjpXZWFrQ2FsbGJhY2tUeXBlOjprSW50ZXJuYWxGaWVsZHMpOwordm9pZCBDSlNfT2JqZWN0OjpNYWtlV2VhaygpIHsKKyAgbV9wT2JqZWN0LlNldFdlYWsodGhpcywgRGlzcG9zZU9iamVjdCwgdjg6OldlYWtDYWxsYmFja1R5cGU6OmtJbnRlcm5hbEZpZWxkcyk7CiB9CiAKLXZvaWQgICAgQ0pTX09iamVjdDo6RGlzcG9zZSgpCi17Ci0gICAgICAgIG1fcE9iamVjdC5SZXNldCgpOwordm9pZCBDSlNfT2JqZWN0OjpEaXNwb3NlKCkgeworICBtX3BPYmplY3QuUmVzZXQoKTsKIH0KIAotQ1BERlNES19QYWdlVmlldyogQ0pTX09iamVjdDo6SlNHZXRQYWdlVmlldyhJRlhKU19Db250ZXh0KiBjYykKLXsKLSAgICByZXR1cm4gRlhKU19HZXRQYWdlVmlldyhjYyk7CitDUERGU0RLX1BhZ2VWaWV3KiBDSlNfT2JqZWN0OjpKU0dldFBhZ2VWaWV3KElGWEpTX0NvbnRleHQqIGNjKSB7CisgIHJldHVybiBGWEpTX0dldFBhZ2VWaWV3KGNjKTsKIH0KIAotaW50IENKU19PYmplY3Q6Ok1zZ0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IEZYX1dDSEFSKiBzd01zZywgY29uc3QgRlhfV0NIQVIqIHN3VGl0bGUsIEZYX1VJTlQgblR5cGUsIEZYX1VJTlQgbkljb24pCi17Ci0gICAgcmV0dXJuIEZYSlNfTXNnQm94KHBBcHAsIHBQYWdlVmlldywgc3dNc2csIHN3VGl0bGUsIG5UeXBlLCBuSWNvbik7CitpbnQgQ0pTX09iamVjdDo6TXNnQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN3TXNnLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3dUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuSWNvbikgeworICByZXR1cm4gRlhKU19Nc2dCb3gocEFwcCwgcFBhZ2VWaWV3LCBzd01zZywgc3dUaXRsZSwgblR5cGUsIG5JY29uKTsKIH0KIAotdm9pZCBDSlNfT2JqZWN0OjpBbGVydChDSlNfQ29udGV4dCogcENvbnRleHQsIGNvbnN0IEZYX1dDSEFSKiBzd01zZykKLXsKLSAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Cit2b2lkIENKU19PYmplY3Q6OkFsZXJ0KENKU19Db250ZXh0KiBwQ29udGV4dCwgY29uc3QgRlhfV0NIQVIqIHN3TXNnKSB7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKIAotICAgIGlmIChwQ29udGV4dC0+SXNNc2dCb3hFbmFibGVkKCkpCi0gICAgewotICAgICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOwotICAgICAgICBpZihwQXBwKQotICAgICAgICAgICAgcEFwcC0+SlNfYXBwQWxlcnQoc3dNc2csIE5VTEwsIDAsIDMpOwotICAgIH0KKyAgaWYgKHBDb250ZXh0LT5Jc01zZ0JveEVuYWJsZWQoKSkgeworICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwQ29udGV4dC0+R2V0UmVhZGVyQXBwKCk7CisgICAgaWYgKHBBcHApCisgICAgICBwQXBwLT5KU19hcHBBbGVydChzd01zZywgTlVMTCwgMCwgMyk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuY3BwCmluZGV4IGQ2OGIyNjguLjdkZmUzMjYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19SdW50aW1lLmNwcApAQCAtMjksMzc2ICsyOSwzNzIgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCIKICNpbmNsdWRlICIuLi8uLi8uLi94ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5oIgogCi1DSlNfUnVudGltZUZhY3Rvcnk6On5DSlNfUnVudGltZUZhY3RvcnkoKQotewotfQorQ0pTX1J1bnRpbWVGYWN0b3J5Ojp+Q0pTX1J1bnRpbWVGYWN0b3J5KCkge30KIAotSUZYSlNfUnVudGltZSogICAgICAgICAgICAgICAgICBDSlNfUnVudGltZUZhY3Rvcnk6Ok5ld0pTUnVudGltZShDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKQotewotCWlmICghbV9iSW5pdCkKLQl7Ci0JCXVuc2lnbmVkIGludCBlbWJlZGRlckRhdGFTbG90ID0gMDsKLQkJaWYgKHBBcHAtPkdldEZvcm1GaWxsSW5mbygpLT5tX3BKc1BsYXRmb3JtLT52ZXJzaW9uID49IDIpIHsKLQkJCWVtYmVkZGVyRGF0YVNsb3QgPSBwQXBwLT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybS0+bV92OEVtYmVkZGVyU2xvdDsKLSAgICAgICAgICAgICAgICB9Ci0JCUpTX0luaXRpYWwoZW1iZWRkZXJEYXRhU2xvdCk7Ci0JCW1fYkluaXQgPSBUUlVFOwotCX0KLQlyZXR1cm4gbmV3IENKU19SdW50aW1lKHBBcHApOwotfQotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUnVudGltZUZhY3Rvcnk6OkFkZFJlZigpCi17Ci0gICAgLy90byBkby5TaG91bGQgYmUgaW1wbGVtZW50ZWQgYXMgYXRvbSBtYW5pcHVsYXRpb24uCi0gICAgbV9uUmVmKys7Ci19Ci12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19SdW50aW1lRmFjdG9yeTo6UmVsZWFzZSgpCi17Ci0gICAgaWYobV9iSW5pdCkKLSAgICB7Ci0gICAgICAgIC8vdG8gZG8uU2hvdWxkIGJlIGltcGxlbWVudGVkIGFzIGF0b20gbWFuaXB1bGF0aW9uLgotICAgICAgICBpZiAoLS1tX25SZWYgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgSlNfUmVsZWFzZSgpOwotICAgICAgICAgICAgUmVsZWFzZUdsb2JhbERhdGEoKTsKLSAgICAgICAgICAgIG1fYkluaXQgPSBGQUxTRTsKLSAgICAgICAgfQorSUZYSlNfUnVudGltZSogQ0pTX1J1bnRpbWVGYWN0b3J5OjpOZXdKU1J1bnRpbWUoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkgeworICBpZiAoIW1fYkluaXQpIHsKKyAgICB1bnNpZ25lZCBpbnQgZW1iZWRkZXJEYXRhU2xvdCA9IDA7CisgICAgaWYgKHBBcHAtPkdldEZvcm1GaWxsSW5mbygpLT5tX3BKc1BsYXRmb3JtLT52ZXJzaW9uID49IDIpIHsKKyAgICAgIGVtYmVkZGVyRGF0YVNsb3QgPQorICAgICAgICAgIHBBcHAtPkdldEZvcm1GaWxsSW5mbygpLT5tX3BKc1BsYXRmb3JtLT5tX3Y4RW1iZWRkZXJTbG90OwogICAgIH0KKyAgICBKU19Jbml0aWFsKGVtYmVkZGVyRGF0YVNsb3QpOworICAgIG1fYkluaXQgPSBUUlVFOworICB9CisgIHJldHVybiBuZXcgQ0pTX1J1bnRpbWUocEFwcCk7CiB9Ci0KLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1J1bnRpbWVGYWN0b3J5OjpEZWxldGVKU1J1bnRpbWUoSUZYSlNfUnVudGltZSogcFJ1bnRpbWUpCi17Ci0gICAgZGVsZXRlIChDSlNfUnVudGltZSopcFJ1bnRpbWU7Cit2b2lkIENKU19SdW50aW1lRmFjdG9yeTo6QWRkUmVmKCkgeworICAvLyB0byBkby5TaG91bGQgYmUgaW1wbGVtZW50ZWQgYXMgYXRvbSBtYW5pcHVsYXRpb24uCisgIG1fblJlZisrOwogfQotCi1DSlNfR2xvYmFsRGF0YSogQ0pTX1J1bnRpbWVGYWN0b3J5OjpOZXdHbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApCi17Ci0gICAgaWYgKG1fcEdsb2JhbERhdGEpCi0gICAgewotICAgICAgICBtX25HbG9iYWxEYXRhQ291bnQrKzsKLSAgICAgICAgcmV0dXJuIG1fcEdsb2JhbERhdGE7Cit2b2lkIENKU19SdW50aW1lRmFjdG9yeTo6UmVsZWFzZSgpIHsKKyAgaWYgKG1fYkluaXQpIHsKKyAgICAvLyB0byBkby5TaG91bGQgYmUgaW1wbGVtZW50ZWQgYXMgYXRvbSBtYW5pcHVsYXRpb24uCisgICAgaWYgKC0tbV9uUmVmID09IDApIHsKKyAgICAgIEpTX1JlbGVhc2UoKTsKKyAgICAgIFJlbGVhc2VHbG9iYWxEYXRhKCk7CisgICAgICBtX2JJbml0ID0gRkFMU0U7CiAgICAgfQotICAgIG1fbkdsb2JhbERhdGFDb3VudCA9IDE7Ci0gICAgbV9wR2xvYmFsRGF0YSA9IG5ldyBDSlNfR2xvYmFsRGF0YShwQXBwKTsKKyAgfQorfQorCit2b2lkIENKU19SdW50aW1lRmFjdG9yeTo6RGVsZXRlSlNSdW50aW1lKElGWEpTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIGRlbGV0ZSAoQ0pTX1J1bnRpbWUqKXBSdW50aW1lOworfQorCitDSlNfR2xvYmFsRGF0YSogQ0pTX1J1bnRpbWVGYWN0b3J5OjpOZXdHbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApIHsKKyAgaWYgKG1fcEdsb2JhbERhdGEpIHsKKyAgICBtX25HbG9iYWxEYXRhQ291bnQrKzsKICAgICByZXR1cm4gbV9wR2xvYmFsRGF0YTsKKyAgfQorICBtX25HbG9iYWxEYXRhQ291bnQgPSAxOworICBtX3BHbG9iYWxEYXRhID0gbmV3IENKU19HbG9iYWxEYXRhKHBBcHApOworICByZXR1cm4gbV9wR2xvYmFsRGF0YTsKIH0KIAotdm9pZCBDSlNfUnVudGltZUZhY3Rvcnk6OlJlbGVhc2VHbG9iYWxEYXRhKCkKLXsKLSAgICBtX25HbG9iYWxEYXRhQ291bnQtLTsKK3ZvaWQgQ0pTX1J1bnRpbWVGYWN0b3J5OjpSZWxlYXNlR2xvYmFsRGF0YSgpIHsKKyAgbV9uR2xvYmFsRGF0YUNvdW50LS07CiAKLSAgICBpZiAobV9uR2xvYmFsRGF0YUNvdW50IDw9IDApCi0gICAgewotICAgICAgICBkZWxldGUgbV9wR2xvYmFsRGF0YTsKLSAgICAgICAgbV9wR2xvYmFsRGF0YSA9IE5VTEw7Ci0gICAgfQorICBpZiAobV9uR2xvYmFsRGF0YUNvdW50IDw9IDApIHsKKyAgICBkZWxldGUgbV9wR2xvYmFsRGF0YTsKKyAgICBtX3BHbG9iYWxEYXRhID0gTlVMTDsKKyAgfQogfQogCiB2b2lkKiBDSlNfQXJyYXlCdWZmZXJBbGxvY2F0b3I6OkFsbG9jYXRlKHNpemVfdCBsZW5ndGgpIHsKLSAgICByZXR1cm4gY2FsbG9jKDEsIGxlbmd0aCk7CisgIHJldHVybiBjYWxsb2MoMSwgbGVuZ3RoKTsKIH0KIAogdm9pZCogQ0pTX0FycmF5QnVmZmVyQWxsb2NhdG9yOjpBbGxvY2F0ZVVuaW5pdGlhbGl6ZWQoc2l6ZV90IGxlbmd0aCkgewotICAgIHJldHVybiBtYWxsb2MobGVuZ3RoKTsKKyAgcmV0dXJuIG1hbGxvYyhsZW5ndGgpOwogfQogCiB2b2lkIENKU19BcnJheUJ1ZmZlckFsbG9jYXRvcjo6RnJlZSh2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgZnJlZShkYXRhKTsKKyAgZnJlZShkYXRhKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19SdW50aW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotZXh0ZXJuIHY4OjpHbG9iYWw8djg6Ok9iamVjdFRlbXBsYXRlPiYgX2dldEdsb2JhbE9iamVjdFRlbXBsYXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lKTsKLUNKU19SdW50aW1lOjpDSlNfUnVudGltZShDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKSA6Ci0JbV9wQXBwKHBBcHApLAotCW1fcERvY3VtZW50KE5VTEwpLAotCW1fYkJsb2NraW5nKEZBTFNFKSwKLQltX3BGaWVsZEV2ZW50UGF0aChOVUxMKSwKLSAgICAgICAgbV9pc29sYXRlKE5VTEwpCi17Ci0JaWYgKENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRKU0VSdW50aW1lKCkpIHsKLQkJLy8gVE9ETyh0c2VwZXopOiBDUERGWEZBX0FwcCBzaG91bGQgYWxzbyB1c2UgdGhlIGVtYmVkZGVyIHByb3ZpZGVkIGlzb2xhdGUuCi0JCW1faXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldEpTRVJ1bnRpbWUoKTsKLQl9IGVsc2UgaWYgKG1fcEFwcC0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm0tPnZlcnNpb24gPj0gMikgewotCQltX2lzb2xhdGUgPSByZWludGVycHJldF9jYXN0PHY4OjpJc29sYXRlKj4obV9wQXBwLT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybS0+bV9pc29sYXRlKTsKLQl9Ci0JaWYgKCFtX2lzb2xhdGUpIHsKLQkJbV9wQXJyYXlCdWZmZXJBbGxvY2F0b3IucmVzZXQobmV3IENKU19BcnJheUJ1ZmZlckFsbG9jYXRvcigpKTsKK2V4dGVybiB2ODo6R2xvYmFsPHY4OjpPYmplY3RUZW1wbGF0ZT4mIF9nZXRHbG9iYWxPYmplY3RUZW1wbGF0ZSgKKyAgICBJSlNfUnVudGltZSogcEpTUnVudGltZSk7CitDSlNfUnVudGltZTo6Q0pTX1J1bnRpbWUoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkKKyAgICA6IG1fcEFwcChwQXBwKSwKKyAgICAgIG1fcERvY3VtZW50KE5VTEwpLAorICAgICAgbV9iQmxvY2tpbmcoRkFMU0UpLAorICAgICAgbV9wRmllbGRFdmVudFBhdGgoTlVMTCksCisgICAgICBtX2lzb2xhdGUoTlVMTCkgeworICBpZiAoQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldEpTRVJ1bnRpbWUoKSkgeworICAgIC8vIFRPRE8odHNlcGV6KTogQ1BERlhGQV9BcHAgc2hvdWxkIGFsc28gdXNlIHRoZSBlbWJlZGRlciBwcm92aWRlZCBpc29sYXRlLgorICAgIG1faXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldEpTRVJ1bnRpbWUoKTsKKyAgfSBlbHNlIGlmIChtX3BBcHAtPkdldEZvcm1GaWxsSW5mbygpLT5tX3BKc1BsYXRmb3JtLT52ZXJzaW9uID49IDIpIHsKKyAgICBtX2lzb2xhdGUgPSByZWludGVycHJldF9jYXN0PHY4OjpJc29sYXRlKj4oCisgICAgICAgIG1fcEFwcC0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm0tPm1faXNvbGF0ZSk7CisgIH0KKyAgaWYgKCFtX2lzb2xhdGUpIHsKKyAgICBtX3BBcnJheUJ1ZmZlckFsbG9jYXRvci5yZXNldChuZXcgQ0pTX0FycmF5QnVmZmVyQWxsb2NhdG9yKCkpOwogCi0JCXY4OjpJc29sYXRlOjpDcmVhdGVQYXJhbXMgcGFyYW1zOwotCQlwYXJhbXMuYXJyYXlfYnVmZmVyX2FsbG9jYXRvciA9IG1fcEFycmF5QnVmZmVyQWxsb2NhdG9yLmdldCgpOwotCQltX2lzb2xhdGUgPSB2ODo6SXNvbGF0ZTo6TmV3KHBhcmFtcyk7Ci0gICAgICAgIH0KKyAgICB2ODo6SXNvbGF0ZTo6Q3JlYXRlUGFyYW1zIHBhcmFtczsKKyAgICBwYXJhbXMuYXJyYXlfYnVmZmVyX2FsbG9jYXRvciA9IG1fcEFycmF5QnVmZmVyQWxsb2NhdG9yLmdldCgpOworICAgIG1faXNvbGF0ZSA9IHY4OjpJc29sYXRlOjpOZXcocGFyYW1zKTsKKyAgfQogCi0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBtX2lzb2xhdGU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OkxvY2tlciBsb2NrZXIoaXNvbGF0ZSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKLQlpZiAoQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkluaXRSdW50aW1lKEZBTFNFKSkgewotCQlDSlNfQ29udGV4dCAqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KilOZXdDb250ZXh0KCk7Ci0JCUpTX0luaXRpYWxSdW50aW1lKCp0aGlzLCB0aGlzLCBwQ29udGV4dCwgbV9jb250ZXh0KTsKLQkJUmVsZWFzZUNvbnRleHQocENvbnRleHQpOwotCQlyZXR1cm47Ci0JfQotCi0gICAgSW5pdEpTT2JqZWN0cygpOwotCi0gICAgQ0pTX0NvbnRleHQgKiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopTmV3Q29udGV4dCgpOworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IG1faXNvbGF0ZTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CisgIHY4OjpMb2NrZXIgbG9ja2VyKGlzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOworICBpZiAoQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkluaXRSdW50aW1lKEZBTFNFKSkgeworICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopTmV3Q29udGV4dCgpOwogICAgIEpTX0luaXRpYWxSdW50aW1lKCp0aGlzLCB0aGlzLCBwQ29udGV4dCwgbV9jb250ZXh0KTsKICAgICBSZWxlYXNlQ29udGV4dChwQ29udGV4dCk7CisgICAgcmV0dXJuOworICB9CisKKyAgSW5pdEpTT2JqZWN0cygpOworCisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopTmV3Q29udGV4dCgpOworICBKU19Jbml0aWFsUnVudGltZSgqdGhpcywgdGhpcywgcENvbnRleHQsIG1fY29udGV4dCk7CisgIFJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKIH0KIAotQ0pTX1J1bnRpbWU6On5DSlNfUnVudGltZSgpCi17Ci0JaW50IHNpemUgPSBtX0NvbnRleHRBcnJheS5HZXRTaXplKCk7Ci0JZm9yIChpbnQgaT0wO2kgPCBzaXplOyBpKyspCi0JCWRlbGV0ZSBtX0NvbnRleHRBcnJheS5HZXRBdChpKTsKK0NKU19SdW50aW1lOjp+Q0pTX1J1bnRpbWUoKSB7CisgIGludCBzaXplID0gbV9Db250ZXh0QXJyYXkuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICBkZWxldGUgbV9Db250ZXh0QXJyYXkuR2V0QXQoaSk7CiAKLSAgICBtX0NvbnRleHRBcnJheS5SZW1vdmVBbGwoKTsKKyAgbV9Db250ZXh0QXJyYXkuUmVtb3ZlQWxsKCk7CiAKLSAgICBSZW1vdmVFdmVudHNJbkxvb3AobV9wRmllbGRFdmVudFBhdGgpOworICBSZW1vdmVFdmVudHNJbkxvb3AobV9wRmllbGRFdmVudFBhdGgpOwogCi0gICAgbV9wQXBwID0gTlVMTDsKLSAgICBtX3BEb2N1bWVudCA9IE5VTEw7Ci0gICAgbV9wRmllbGRFdmVudFBhdGggPSBOVUxMOwotICAgIG1fY29udGV4dC5SZXNldCgpOworICBtX3BBcHAgPSBOVUxMOworICBtX3BEb2N1bWVudCA9IE5VTEw7CisgIG1fcEZpZWxkRXZlbnRQYXRoID0gTlVMTDsKKyAgbV9jb250ZXh0LlJlc2V0KCk7CiAKLQltX2lzb2xhdGUgPSBOVUxMOworICBtX2lzb2xhdGUgPSBOVUxMOwogfQogCi1GWF9CT09MIENKU19SdW50aW1lOjpJbml0SlNPYmplY3RzKCkKLXsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShHZXRJc29sYXRlKCkpOwotCXY4OjpMb2NrZXIgbG9ja2VyKEdldElzb2xhdGUoKSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOwotCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpOZXcoR2V0SXNvbGF0ZSgpKTsKLQl2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKLQkvLzAgLSA4Ci0JaWYgKENKU19Cb3JkZXI6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0JaWYgKENKU19EaXNwbGF5OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotCWlmIChDSlNfRm9udDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX0hpZ2hsaWdodDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX1Bvc2l0aW9uOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotCWlmIChDSlNfU2NhbGVIb3c6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0JaWYgKENKU19TY2FsZVdoZW46OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0JaWYgKENKU19TdHlsZTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX1pvb210eXBlOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDSlNfUnVudGltZTo6SW5pdEpTT2JqZWN0cygpIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkxvY2tlciBsb2NrZXIoR2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6TmV3KEdldElzb2xhdGUoKSk7CisgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOworICAvLyAwIC0gOAorICBpZiAoQ0pTX0JvcmRlcjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoQ0pTX0Rpc3BsYXk6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKENKU19Gb250OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChDSlNfSGlnaGxpZ2h0OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChDSlNfUG9zaXRpb246OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKENKU19TY2FsZUhvdzo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoQ0pTX1NjYWxlV2hlbjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoQ0pTX1N0eWxlOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChDSlNfWm9vbXR5cGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKQorICAgIHJldHVybiBGQUxTRTsKIAotCS8vOSAtIDExCi0JaWYgKENKU19BcHA6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0JaWYgKENKU19Db2xvcjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX0NvbnNvbGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7CisgIC8vIDkgLSAxMQorICBpZiAoQ0pTX0FwcDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoQ0pTX0NvbG9yOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChDSlNfQ29uc29sZTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOwogCi0JLy8xMiAtIDE0Ci0JaWYgKENKU19Eb2N1bWVudDo6SW5pdCgqdGhpcywgSlNfRFlOQU1JQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0JaWYgKENKU19FdmVudDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX0ZpZWxkOjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8IDApIHJldHVybiBGQUxTRTsKKyAgLy8gMTIgLSAxNAorICBpZiAoQ0pTX0RvY3VtZW50OjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoQ0pTX0V2ZW50OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChDSlNfRmllbGQ6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQkvLzE1IC0gMTcKLQlpZiAoQ0pTX0dsb2JhbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX0ljb246OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotCWlmIChDSlNfVXRpbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKKyAgLy8gMTUgLSAxNworICBpZiAoQ0pTX0dsb2JhbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoQ0pTX0ljb246OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChDSlNfVXRpbDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKENKU19QdWJsaWNNZXRob2RzOjpJbml0KCp0aGlzKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX0dsb2JhbENvbnN0czo6SW5pdCgqdGhpcykgPCAwKSByZXR1cm4gRkFMU0U7Ci0JaWYgKENKU19HbG9iYWxBcnJheXM6OkluaXQoKnRoaXMpIDwgMCkgcmV0dXJuIEZBTFNFOworICBpZiAoQ0pTX1B1YmxpY01ldGhvZHM6OkluaXQoKnRoaXMpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChDSlNfR2xvYmFsQ29uc3RzOjpJbml0KCp0aGlzKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoQ0pTX0dsb2JhbEFycmF5czo6SW5pdCgqdGhpcykgPCAwKQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmIChDSlNfVGltZXJPYmo6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotCWlmIChDSlNfUHJpbnRQYXJhbXNPYmo6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwwKSByZXR1cm4gRkFMU0U7CisgIGlmIChDSlNfVGltZXJPYmo6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChDSlNfUHJpbnRQYXJhbXNPYmo6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUlGWEpTX0NvbnRleHQqIENKU19SdW50aW1lOjpOZXdDb250ZXh0KCkKLXsKLSAgICBDSlNfQ29udGV4dCAqIHAgPSBuZXcgQ0pTX0NvbnRleHQodGhpcyk7Ci0gICAgbV9Db250ZXh0QXJyYXkuQWRkKHApOwotICAgIHJldHVybiBwOworSUZYSlNfQ29udGV4dCogQ0pTX1J1bnRpbWU6Ok5ld0NvbnRleHQoKSB7CisgIENKU19Db250ZXh0KiBwID0gbmV3IENKU19Db250ZXh0KHRoaXMpOworICBtX0NvbnRleHRBcnJheS5BZGQocCk7CisgIHJldHVybiBwOwogfQogCi12b2lkIENKU19SdW50aW1lOjpSZWxlYXNlQ29udGV4dChJRlhKU19Db250ZXh0ICogcENvbnRleHQpCi17Ci0gICAgQ0pTX0NvbnRleHQqIHBKU0NvbnRleHQgPSAoQ0pTX0NvbnRleHQqKXBDb250ZXh0Owordm9pZCBDSlNfUnVudGltZTo6UmVsZWFzZUNvbnRleHQoSUZYSlNfQ29udGV4dCogcENvbnRleHQpIHsKKyAgQ0pTX0NvbnRleHQqIHBKU0NvbnRleHQgPSAoQ0pTX0NvbnRleHQqKXBDb250ZXh0OwogCi0gICAgZm9yIChpbnQgaT0wLCBzej1tX0NvbnRleHRBcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwSlNDb250ZXh0ID09IG1fQ29udGV4dEFycmF5LkdldEF0KGkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGUgcEpTQ29udGV4dDsKLSAgICAgICAgICAgIG1fQ29udGV4dEFycmF5LlJlbW92ZUF0KGkpOwotICAgICAgICAgICAgYnJlYWs7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fQ29udGV4dEFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAocEpTQ29udGV4dCA9PSBtX0NvbnRleHRBcnJheS5HZXRBdChpKSkgeworICAgICAgZGVsZXRlIHBKU0NvbnRleHQ7CisgICAgICBtX0NvbnRleHRBcnJheS5SZW1vdmVBdChpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitJRlhKU19Db250ZXh0KiBDSlNfUnVudGltZTo6R2V0Q3VycmVudENvbnRleHQoKSB7CisgIGlmICghbV9Db250ZXh0QXJyYXkuR2V0U2l6ZSgpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gbV9Db250ZXh0QXJyYXkuR2V0QXQobV9Db250ZXh0QXJyYXkuR2V0U2l6ZSgpIC0gMSk7Cit9CisKK3ZvaWQgQ0pTX1J1bnRpbWU6OlNldFJlYWRlckRvY3VtZW50KENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MpIHsKKyAgaWYgKG1fcERvY3VtZW50ICE9IHBSZWFkZXJEb2MpIHsKKyAgICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShtX2lzb2xhdGUpOworICAgIHY4OjpMb2NrZXIgbG9ja2VyKG1faXNvbGF0ZSk7CisgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX2lzb2xhdGUpOworICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9CisgICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX2lzb2xhdGUsIG1fY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7CisKKyAgICBtX3BEb2N1bWVudCA9IHBSZWFkZXJEb2M7CisKKyAgICBpZiAocFJlYWRlckRvYykgeworICAgICAgSlNPYmplY3QgcFRoaXMgPSBKU19HZXRUaGlzT2JqKCp0aGlzKTsKKyAgICAgIGlmICghcFRoaXMuSXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChKU19HZXRPYmpEZWZuSUQocFRoaXMpID09IEpTX0dldE9iakRlZm5JRCgqdGhpcywgTCJEb2N1bWVudCIpKSB7CisgICAgICAgICAgaWYgKENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPSAoQ0pTX0RvY3VtZW50KilKU19HZXRQcml2YXRlKHBUaGlzKSkgeworICAgICAgICAgICAgaWYgKERvY3VtZW50KiBwRG9jdW1lbnQgPSAoRG9jdW1lbnQqKXBKU0RvY3VtZW50LT5HZXRFbWJlZE9iamVjdCgpKQorICAgICAgICAgICAgICBwRG9jdW1lbnQtPkF0dGFjaERvYyhwUmVhZGVyRG9jKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEpTX1NldFRoaXNPYmooKnRoaXMsIEpTX0dldE9iakRlZm5JRCgqdGhpcywgTCJEb2N1bWVudCIpKTsKKyAgICB9IGVsc2UgeworICAgICAgSlNfU2V0VGhpc09iaigqdGhpcywgSlNfR2V0T2JqRGVmbklEKCp0aGlzLCBMImFwcCIpKTsKICAgICB9CisgIH0KIH0KIAotSUZYSlNfQ29udGV4dCogIENKU19SdW50aW1lOjpHZXRDdXJyZW50Q29udGV4dCgpCi17Ci0gICAgaWYoIW1fQ29udGV4dEFycmF5LkdldFNpemUoKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIG1fQ29udGV4dEFycmF5LkdldEF0KG1fQ29udGV4dEFycmF5LkdldFNpemUoKS0xKTsKLX0KLQotdm9pZCBDSlNfUnVudGltZTo6U2V0UmVhZGVyRG9jdW1lbnQoQ1BERlNES19Eb2N1bWVudCogcFJlYWRlckRvYykKLXsKLQlpZiAobV9wRG9jdW1lbnQgIT0gcFJlYWRlckRvYykKLQl7Ci0JCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1faXNvbGF0ZSk7Ci0JCXY4OjpMb2NrZXIgbG9ja2VyKG1faXNvbGF0ZSk7Ci0JCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUobV9pc29sYXRlKTsKLQkJdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID12ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcobV9pc29sYXRlLCBtX2NvbnRleHQpOwotCQl2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKLQotCQltX3BEb2N1bWVudCA9IHBSZWFkZXJEb2M7Ci0KLQkJaWYgKHBSZWFkZXJEb2MpCi0JCXsKLQkJCUpTT2JqZWN0IHBUaGlzID0gSlNfR2V0VGhpc09iaigqdGhpcyk7Ci0JCQlpZighcFRoaXMuSXNFbXB0eSgpKQotCQkJewotCQkJCWlmIChKU19HZXRPYmpEZWZuSUQocFRoaXMpID09IEpTX0dldE9iakRlZm5JRCgqdGhpcywgTCJEb2N1bWVudCIpKQotCQkJCXsKLQkJCQkJaWYgKENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPSAoQ0pTX0RvY3VtZW50KilKU19HZXRQcml2YXRlKHBUaGlzKSkKLQkJCQkJewotCQkJCQkJaWYgKERvY3VtZW50ICogcERvY3VtZW50ID0gKERvY3VtZW50KilwSlNEb2N1bWVudC0+R2V0RW1iZWRPYmplY3QoKSkKLQkJCQkJCQlwRG9jdW1lbnQtPkF0dGFjaERvYyhwUmVhZGVyRG9jKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUpTX1NldFRoaXNPYmooKnRoaXMsIEpTX0dldE9iakRlZm5JRCgqdGhpcywgTCJEb2N1bWVudCIpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUpTX1NldFRoaXNPYmooKnRoaXMsIEpTX0dldE9iakRlZm5JRCgqdGhpcywgTCJhcHAiKSk7Ci0JCX0KLQl9Ci19Ci0KLUZYX0JPT0wgQ0pTX1J1bnRpbWU6OkFkZEV2ZW50VG9Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwgSlNfRVZFTlRfVCBlRXZlbnRUeXBlKQotewotICAgIGlmIChtX3BGaWVsZEV2ZW50UGF0aCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgbV9wRmllbGRFdmVudFBhdGggPSBuZXcgQ0pTX0ZpZWxkRXZlbnQ7Ci0gICAgICAgIG1fcEZpZWxkRXZlbnRQYXRoLT5zVGFyZ2V0TmFtZSA9IHNUYXJnZXROYW1lOwotICAgICAgICBtX3BGaWVsZEV2ZW50UGF0aC0+ZUV2ZW50VHlwZSA9IGVFdmVudFR5cGU7Ci0gICAgICAgIG1fcEZpZWxkRXZlbnRQYXRoLT5wTmV4dCA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgLy90byBzZWFyY2gKLSAgICBDSlNfRmllbGRFdmVudCogcCA9IG1fcEZpZWxkRXZlbnRQYXRoOwotICAgIENKU19GaWVsZEV2ZW50KiBwTGFzdCA9IG1fcEZpZWxkRXZlbnRQYXRoOwotICAgIHdoaWxlIChwKQotICAgIHsKLSAgICAgICAgaWYgKHAtPmVFdmVudFR5cGUgPT0gZUV2ZW50VHlwZSAmJiBwLT5zVGFyZ2V0TmFtZSA9PSBzVGFyZ2V0TmFtZSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBwTGFzdCA9IHA7Ci0gICAgICAgIHAgPSBwLT5wTmV4dDsKLSAgICB9Ci0KLSAgICAvL3RvIGFkZAotICAgIENKU19GaWVsZEV2ZW50KiBwTmV3ID0gbmV3IENKU19GaWVsZEV2ZW50OwotICAgIHBOZXctPnNUYXJnZXROYW1lID0gc1RhcmdldE5hbWU7Ci0gICAgcE5ldy0+ZUV2ZW50VHlwZSA9IGVFdmVudFR5cGU7Ci0gICAgcE5ldy0+cE5leHQgPSBOVUxMOwotCi0gICAgcExhc3QtPnBOZXh0ID0gcE5ldzsKK0ZYX0JPT0wgQ0pTX1J1bnRpbWU6OkFkZEV2ZW50VG9Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSkgeworICBpZiAobV9wRmllbGRFdmVudFBhdGggPT0gTlVMTCkgeworICAgIG1fcEZpZWxkRXZlbnRQYXRoID0gbmV3IENKU19GaWVsZEV2ZW50OworICAgIG1fcEZpZWxkRXZlbnRQYXRoLT5zVGFyZ2V0TmFtZSA9IHNUYXJnZXROYW1lOworICAgIG1fcEZpZWxkRXZlbnRQYXRoLT5lRXZlbnRUeXBlID0gZUV2ZW50VHlwZTsKKyAgICBtX3BGaWVsZEV2ZW50UGF0aC0+cE5leHQgPSBOVUxMOwogCiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICAvLyB0byBzZWFyY2gKKyAgQ0pTX0ZpZWxkRXZlbnQqIHAgPSBtX3BGaWVsZEV2ZW50UGF0aDsKKyAgQ0pTX0ZpZWxkRXZlbnQqIHBMYXN0ID0gbV9wRmllbGRFdmVudFBhdGg7CisgIHdoaWxlIChwKSB7CisgICAgaWYgKHAtPmVFdmVudFR5cGUgPT0gZUV2ZW50VHlwZSAmJiBwLT5zVGFyZ2V0TmFtZSA9PSBzVGFyZ2V0TmFtZSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBMYXN0ID0gcDsKKyAgICBwID0gcC0+cE5leHQ7CisgIH0KKworICAvLyB0byBhZGQKKyAgQ0pTX0ZpZWxkRXZlbnQqIHBOZXcgPSBuZXcgQ0pTX0ZpZWxkRXZlbnQ7CisgIHBOZXctPnNUYXJnZXROYW1lID0gc1RhcmdldE5hbWU7CisgIHBOZXctPmVFdmVudFR5cGUgPSBlRXZlbnRUeXBlOworICBwTmV3LT5wTmV4dCA9IE5VTEw7CisKKyAgcExhc3QtPnBOZXh0ID0gcE5ldzsKKworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDSlNfUnVudGltZTo6UmVtb3ZlRXZlbnRJbkxvb3AoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUYXJnZXROYW1lLCBKU19FVkVOVF9UIGVFdmVudFR5cGUpCi17Ci0gICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOwordm9pZCBDSlNfUnVudGltZTo6UmVtb3ZlRXZlbnRJbkxvb3AoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUYXJnZXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNfRVZFTlRfVCBlRXZlbnRUeXBlKSB7CisgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKIAotICAgIENKU19GaWVsZEV2ZW50KiBwID0gbV9wRmllbGRFdmVudFBhdGg7Ci0gICAgQ0pTX0ZpZWxkRXZlbnQqIHBMYXN0ID0gTlVMTDsKLSAgICB3aGlsZSAocCkKLSAgICB7Ci0gICAgICAgIGlmIChwLT5lRXZlbnRUeXBlID09IGVFdmVudFR5cGUgJiYgcC0+c1RhcmdldE5hbWUgPT0gc1RhcmdldE5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcExhc3QgPSBwOwotICAgICAgICBwID0gcC0+cE5leHQ7CisgIENKU19GaWVsZEV2ZW50KiBwID0gbV9wRmllbGRFdmVudFBhdGg7CisgIENKU19GaWVsZEV2ZW50KiBwTGFzdCA9IE5VTEw7CisgIHdoaWxlIChwKSB7CisgICAgaWYgKHAtPmVFdmVudFR5cGUgPT0gZUV2ZW50VHlwZSAmJiBwLT5zVGFyZ2V0TmFtZSA9PSBzVGFyZ2V0TmFtZSkgeworICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKGJGaW5kKQotICAgIHsKLSAgICAgICAgUmVtb3ZlRXZlbnRzSW5Mb29wKHApOworICAgIHBMYXN0ID0gcDsKKyAgICBwID0gcC0+cE5leHQ7CisgIH0KIAotICAgICAgICBpZiAocCA9PSBtX3BGaWVsZEV2ZW50UGF0aCkKLSAgICAgICAgICAgIG1fcEZpZWxkRXZlbnRQYXRoID0gTlVMTDsKKyAgaWYgKGJGaW5kKSB7CisgICAgUmVtb3ZlRXZlbnRzSW5Mb29wKHApOwogCi0gICAgICAgIGlmIChwTGFzdCkKLSAgICAgICAgICAgIHBMYXN0LT5wTmV4dCA9IE5VTEw7Ci0gICAgfQorICAgIGlmIChwID09IG1fcEZpZWxkRXZlbnRQYXRoKQorICAgICAgbV9wRmllbGRFdmVudFBhdGggPSBOVUxMOworCisgICAgaWYgKHBMYXN0KQorICAgICAgcExhc3QtPnBOZXh0ID0gTlVMTDsKKyAgfQogfQogCi12b2lkIENKU19SdW50aW1lOjpSZW1vdmVFdmVudHNJbkxvb3AoQ0pTX0ZpZWxkRXZlbnQqIHBTdGFydCkKLXsKLSAgICBDSlNfRmllbGRFdmVudCogcCA9IHBTdGFydDsKK3ZvaWQgQ0pTX1J1bnRpbWU6OlJlbW92ZUV2ZW50c0luTG9vcChDSlNfRmllbGRFdmVudCogcFN0YXJ0KSB7CisgIENKU19GaWVsZEV2ZW50KiBwID0gcFN0YXJ0OwogCi0gICAgd2hpbGUgKHApCi0gICAgewotICAgICAgICBDSlNfRmllbGRFdmVudCogcE9sZCA9IHA7Ci0gICAgICAgIHAgPSBwT2xkLT5wTmV4dDsKKyAgd2hpbGUgKHApIHsKKyAgICBDSlNfRmllbGRFdmVudCogcE9sZCA9IHA7CisgICAgcCA9IHBPbGQtPnBOZXh0OwogCi0gICAgICAgIGRlbGV0ZSBwT2xkOwotICAgIH0KKyAgICBkZWxldGUgcE9sZDsKKyAgfQogfQogCi12ODo6TG9jYWw8djg6OkNvbnRleHQ+ICBDSlNfUnVudGltZTo6TmV3SlNDb250ZXh0KCkKLXsKLSAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1faXNvbGF0ZSwgbV9jb250ZXh0KTsKK3Y4OjpMb2NhbDx2ODo6Q29udGV4dD4gQ0pTX1J1bnRpbWU6Ok5ld0pTQ29udGV4dCgpIHsKKyAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX2lzb2xhdGUsIG1fY29udGV4dCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENoYW5nZU9iak5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBzUmV0ID0gc3RyOwotICAgIHNSZXQuUmVwbGFjZShMIl8iLCBMIi4iKTsKLSAgICByZXR1cm4gc1JldDsKK0NGWF9XaWRlU3RyaW5nIENoYW5nZU9iak5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgeworICBDRlhfV2lkZVN0cmluZyBzUmV0ID0gc3RyOworICBzUmV0LlJlcGxhY2UoTCJfIiwgTCIuIik7CisgIHJldHVybiBzUmV0OwogfQotRlhfQk9PTAlDSlNfUnVudGltZTo6R2V0SFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpCi17Ci0JY29uc3QgRlhfQ0hBUiogbmFtZSA9IHV0ZjhOYW1lLkdldENTdHIoKTsKK0ZYX0JPT0wgQ0pTX1J1bnRpbWU6OkdldEhWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsKKyAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IHV0ZjhOYW1lLkdldENTdHIoKTsKIAotCXY4OjpMb2NrZXIgbG9jayhHZXRJc29sYXRlKCkpOwotICAgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7Ci0gICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOwotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhHZXRJc29sYXRlKCksIG1fY29udGV4dCk7Ci0gICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7CisgIHY4OjpMb2NrZXIgbG9jayhHZXRJc29sYXRlKCkpOworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShHZXRJc29sYXRlKCkpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9CisgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcoR2V0SXNvbGF0ZSgpLCBtX2NvbnRleHQpOworICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKIAorICAvLyB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHRtcENvdGV4dCA9CisgIC8vIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhHZXRJc29sYXRlKCksIG1fY29udGV4dCk7CisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3B2YWx1ZSA9CisgICAgICBjb250ZXh0LT5HbG9iYWwoKS0+R2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KAorICAgICAgICAgIEdldElzb2xhdGUoKSwgbmFtZSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgdXRmOE5hbWUuR2V0TGVuZ3RoKCkpKTsKIAotCS8vdjg6OkxvY2FsPHY4OjpDb250ZXh0PiB0bXBDb3RleHQgPSB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcoR2V0SXNvbGF0ZSgpLCBtX2NvbnRleHQpOwotCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3B2YWx1ZSA9IGNvbnRleHQtPkdsb2JhbCgpLT5HZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoR2V0SXNvbGF0ZSgpLCBuYW1lLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLCB1dGY4TmFtZS5HZXRMZW5ndGgoKSkpOworICBpZiAocHJvcHZhbHVlLklzRW1wdHkoKSkgeworICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChoVmFsdWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAoKENGWEpTRV9WYWx1ZSopaFZhbHVlKS0+Rm9yY2VTZXRWYWx1ZShwcm9wdmFsdWUpOwogCi0JaWYgKHByb3B2YWx1ZS5Jc0VtcHR5KCkpIHsKLQkJRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkKGhWYWx1ZSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JKChDRlhKU0VfVmFsdWUqKWhWYWx1ZSktPkZvcmNlU2V0VmFsdWUocHJvcHZhbHVlKTsKLQotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wJQ0pTX1J1bnRpbWU6OlNldEhWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKQotewotCWlmICh1dGY4TmFtZS5Jc0VtcHR5KCkgfHwgaFZhbHVlID09IE5VTEwpCi0JCXJldHVybiBGQUxTRTsKLQljb25zdCBGWF9DSEFSKiBuYW1lID0gdXRmOE5hbWUuR2V0Q1N0cigpOwotCXY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IEdldElzb2xhdGUoKTsKLQl2ODo6TG9ja2VyIGxvY2socElzb2xhdGUpOwotICAgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKLSAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKHBJc29sYXRlKTsKLSAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPQotICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcocElzb2xhdGUsIG1fY29udGV4dCk7Ci0gICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7CitGWF9CT09MIENKU19SdW50aW1lOjpTZXRIVmFsdWVCeU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSB7CisgIGlmICh1dGY4TmFtZS5Jc0VtcHR5KCkgfHwgaFZhbHVlID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICBjb25zdCBGWF9DSEFSKiBuYW1lID0gdXRmOE5hbWUuR2V0Q1N0cigpOworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBHZXRJc29sYXRlKCk7CisgIHY4OjpMb2NrZXIgbG9jayhwSXNvbGF0ZSk7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShwSXNvbGF0ZSk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9CisgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcocElzb2xhdGUsIG1fY29udGV4dCk7CisgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwogCi0JLy92ODo6TG9jYWw8djg6OkNvbnRleHQ+IHRtcENvdGV4dCA9IHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhHZXRJc29sYXRlKCksIG1fY29udGV4dCk7Ci0Jdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcHJvcHZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhHZXRJc29sYXRlKCksKChDRlhKU0VfVmFsdWUqKWhWYWx1ZSktPkRpcmVjdEdldFZhbHVlKCkpOwotCWNvbnRleHQtPkdsb2JhbCgpLT5TZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIG5hbWUsIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsIHV0ZjhOYW1lLkdldExlbmd0aCgpKSwgcHJvcHZhbHVlKTsKKyAgLy8gdjg6OkxvY2FsPHY4OjpDb250ZXh0PiB0bXBDb3RleHQgPQorICAvLyB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcoR2V0SXNvbGF0ZSgpLCBtX2NvbnRleHQpOworICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wdmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KAorICAgICAgR2V0SXNvbGF0ZSgpLCAoKENGWEpTRV9WYWx1ZSopaFZhbHVlKS0+RGlyZWN0R2V0VmFsdWUoKSk7CisgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXQoCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgbmFtZSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjhOYW1lLkdldExlbmd0aCgpKSwKKyAgICAgIHByb3B2YWx1ZSk7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1ZhbHVlLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCmluZGV4IDA1OGYyZWEuLmZhYTFlZWIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCkBAIC0xMiw2NTEgKzEyLDU3NyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19WYWx1ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlKSA6IG1fZVR5cGUoVlRfdW5rbm93biksbV9pc29sYXRlKGlzb2xhdGUpCi17Ci19Ci1DSlNfVmFsdWU6OkNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlLEZYSlNWQUxVRVRZUEUgdCkgOgotCW1fcFZhbHVlKHBWYWx1ZSksIG1fZVR5cGUodCksIG1faXNvbGF0ZShpc29sYXRlKQoteworQ0pTX1ZhbHVlOjpDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUpCisgICAgOiBtX2VUeXBlKFZUX3Vua25vd24pLCBtX2lzb2xhdGUoaXNvbGF0ZSkge30KK0NKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgRlhKU1ZBTFVFVFlQRSB0KQorICAgIDogbV9wVmFsdWUocFZhbHVlKSwgbV9lVHlwZSh0KSwgbV9pc29sYXRlKGlzb2xhdGUpIHt9CisKK0NKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBpbnQmIGlWYWx1ZSkKKyAgICA6IG1faXNvbGF0ZShpc29sYXRlKSB7CisgIG9wZXJhdG9yPShpVmFsdWUpOwogfQogCi1DSlNfVmFsdWU6OkNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3QgaW50ICZpVmFsdWUpOm1faXNvbGF0ZShpc29sYXRlKQotewotCW9wZXJhdG9yID0oaVZhbHVlKTsKK0NKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBib29sJiBiVmFsdWUpCisgICAgOiBtX2lzb2xhdGUoaXNvbGF0ZSkgeworICBvcGVyYXRvcj0oYlZhbHVlKTsKIH0KIAotQ0pTX1ZhbHVlOjpDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IGJvb2wgJmJWYWx1ZSk6bV9pc29sYXRlKGlzb2xhdGUpCi17Ci0Jb3BlcmF0b3IgPShiVmFsdWUpOworQ0pTX1ZhbHVlOjpDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IGZsb2F0JiBmVmFsdWUpCisgICAgOiBtX2lzb2xhdGUoaXNvbGF0ZSkgeworICBvcGVyYXRvcj0oZlZhbHVlKTsKIH0KIAotQ0pTX1ZhbHVlOjpDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IGZsb2F0ICZmVmFsdWUpOm1faXNvbGF0ZShpc29sYXRlKQotewotCW9wZXJhdG9yID0oZlZhbHVlKTsKK0NKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBkb3VibGUmIGRWYWx1ZSkKKyAgICA6IG1faXNvbGF0ZShpc29sYXRlKSB7CisgIG9wZXJhdG9yPShkVmFsdWUpOwogfQogCi1DSlNfVmFsdWU6OkNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3QgZG91YmxlICZkVmFsdWUpOm1faXNvbGF0ZShpc29sYXRlKQotewotCW9wZXJhdG9yID0oZFZhbHVlKTsKK0NKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBKU0ZYT2JqZWN0IHBKc09iaikKKyAgICA6IG1faXNvbGF0ZShpc29sYXRlKSB7CisgIG9wZXJhdG9yPShwSnNPYmopOwogfQogCi1DSlNfVmFsdWU6OkNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgSlNGWE9iamVjdCAgcEpzT2JqKTptX2lzb2xhdGUoaXNvbGF0ZSkKLXsKLQlvcGVyYXRvciA9KHBKc09iaik7CitDSlNfVmFsdWU6OkNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgQ0pTX09iamVjdCogcEpzT2JqKQorICAgIDogbV9pc29sYXRlKGlzb2xhdGUpIHsKKyAgb3BlcmF0b3I9KHBKc09iaik7CiB9CiAKLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBDSlNfT2JqZWN0KiBwSnNPYmopOm1faXNvbGF0ZShpc29sYXRlKQotewotCW9wZXJhdG9yID0ocEpzT2JqKTsKK0NKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBDSlNfRG9jdW1lbnQqIHBKc0RvYykKKyAgICA6IG1faXNvbGF0ZShpc29sYXRlKSB7CisgIG1fZVR5cGUgPSBWVF9vYmplY3Q7CisgIGlmIChwSnNEb2MpCisgICAgbV9wVmFsdWUgPSAoSlNGWE9iamVjdCkqcEpzRG9jOwogfQogCi1DSlNfVmFsdWU6OkNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgQ0pTX0RvY3VtZW50KiBwSnNEb2MpOm1faXNvbGF0ZShpc29sYXRlKQotewotCW1fZVR5cGUgPSBWVF9vYmplY3Q7Ci0JaWYgKHBKc0RvYykKLQkJbV9wVmFsdWUgPSAoSlNGWE9iamVjdCkqcEpzRG9jOworQ0pTX1ZhbHVlOjpDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IEZYX1dDSEFSKiBwV3N0cikKKyAgICA6IG1faXNvbGF0ZShpc29sYXRlKSB7CisgIG9wZXJhdG9yPShwV3N0cik7CiB9CiAKLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBGWF9XQ0hBUiogcFdzdHIpOm1faXNvbGF0ZShpc29sYXRlKQotewotCW9wZXJhdG9yID0ocFdzdHIpOworQ0pTX1ZhbHVlOjpDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IEZYX0NIQVIqIHBTdHIpCisgICAgOiBtX2lzb2xhdGUoaXNvbGF0ZSkgeworICBvcGVyYXRvcj0ocFN0cik7CiB9CiAKLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBGWF9DSEFSKiBwU3RyKTptX2lzb2xhdGUoaXNvbGF0ZSkKLXsKLQlvcGVyYXRvciA9IChwU3RyKTsKK0NKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBDSlNfQXJyYXkmIGFycmF5KQorICAgIDogbV9pc29sYXRlKGlzb2xhdGUpIHsKKyAgb3BlcmF0b3I9KGFycmF5KTsKIH0KIAotQ0pTX1ZhbHVlOjpDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19BcnJheSYgYXJyYXkpOm1faXNvbGF0ZShpc29sYXRlKQotewotCW9wZXJhdG9yID0gKGFycmF5KTsKK0NKU19WYWx1ZTo6fkNKU19WYWx1ZSgpIHt9CisKK3ZvaWQgQ0pTX1ZhbHVlOjpBdHRhY2godjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlLCBGWEpTVkFMVUVUWVBFIHQpIHsKKyAgbV9wVmFsdWUgPSBwVmFsdWU7CisgIG1fZVR5cGUgPSB0OwogfQogCi1DSlNfVmFsdWU6On5DSlNfVmFsdWUoKQotewordm9pZCBDSlNfVmFsdWU6OkF0dGFjaChDSlNfVmFsdWUqIHBWYWx1ZSkgeworICBpZiAocFZhbHVlKQorICAgIEF0dGFjaChwVmFsdWUtPlRvVjhWYWx1ZSgpLCBwVmFsdWUtPkdldFR5cGUoKSk7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpBdHRhY2godjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlLEZYSlNWQUxVRVRZUEUgdCkKLXsKLQltX3BWYWx1ZSA9IHBWYWx1ZTsKLQltX2VUeXBlID0gdDsKK3ZvaWQgQ0pTX1ZhbHVlOjpEZXRhY2goKSB7CisgIG1fcFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgbV9lVHlwZSA9IFZUX3Vua25vd247CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpBdHRhY2goQ0pTX1ZhbHVlICpwVmFsdWUpCi17Ci0JaWYgKHBWYWx1ZSkKLQkJQXR0YWNoKHBWYWx1ZS0+VG9WOFZhbHVlKCksIHBWYWx1ZS0+R2V0VHlwZSgpKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitpbnQgQ0pTX1ZhbHVlOjpUb0ludCgpIGNvbnN0IHsKKyAgcmV0dXJuIEpTX1RvSW50MzIobV9pc29sYXRlLCBtX3BWYWx1ZSk7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpEZXRhY2goKQotewotCW1fcFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKLQltX2VUeXBlID0gVlRfdW5rbm93bjsKK2Jvb2wgQ0pTX1ZhbHVlOjpUb0Jvb2woKSBjb25zdCB7CisgIHJldHVybiBKU19Ub0Jvb2xlYW4obV9pc29sYXRlLCBtX3BWYWx1ZSk7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotaW50IENKU19WYWx1ZTo6VG9JbnQoKSBjb25zdAotewotCXJldHVybiBKU19Ub0ludDMyKG1faXNvbGF0ZSwgbV9wVmFsdWUpOworZG91YmxlIENKU19WYWx1ZTo6VG9Eb3VibGUoKSBjb25zdCB7CisgIHJldHVybiBKU19Ub051bWJlcihtX2lzb2xhdGUsIG1fcFZhbHVlKTsKIH0KIAotYm9vbCBDSlNfVmFsdWU6OlRvQm9vbCgpIGNvbnN0Ci17Ci0JcmV0dXJuIEpTX1RvQm9vbGVhbihtX2lzb2xhdGUsIG1fcFZhbHVlKTsKK2Zsb2F0IENKU19WYWx1ZTo6VG9GbG9hdCgpIGNvbnN0IHsKKyAgcmV0dXJuIChmbG9hdClUb0RvdWJsZSgpOwogfQogCi1kb3VibGUgQ0pTX1ZhbHVlOjpUb0RvdWJsZSgpIGNvbnN0Ci17Ci0JcmV0dXJuIEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wVmFsdWUpOworQ0pTX09iamVjdCogQ0pTX1ZhbHVlOjpUb0NKU09iamVjdCgpIGNvbnN0IHsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBKU19Ub09iamVjdChtX2lzb2xhdGUsIG1fcFZhbHVlKTsKKyAgcmV0dXJuIChDSlNfT2JqZWN0KilKU19HZXRQcml2YXRlKG1faXNvbGF0ZSwgcE9iaik7CiB9CiAKLWZsb2F0IENKU19WYWx1ZTo6VG9GbG9hdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIChmbG9hdClUb0RvdWJsZSgpOwordjg6OkxvY2FsPHY4OjpPYmplY3Q+IENKU19WYWx1ZTo6VG9WOE9iamVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIEpTX1RvT2JqZWN0KG1faXNvbGF0ZSwgbV9wVmFsdWUpOwogfQogCi1DSlNfT2JqZWN0KiBDSlNfVmFsdWU6OlRvQ0pTT2JqZWN0KCkgY29uc3QKLXsKLQl2ODo6TG9jYWw8djg6Ok9iamVjdD4JcE9iaiA9IEpTX1RvT2JqZWN0KG1faXNvbGF0ZSwgbV9wVmFsdWUpOwotCXJldHVybiAoQ0pTX09iamVjdCopSlNfR2V0UHJpdmF0ZShtX2lzb2xhdGUsIHBPYmopOworQ0ZYX1dpZGVTdHJpbmcgQ0pTX1ZhbHVlOjpUb0NGWFdpZGVTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiBKU19Ub1N0cmluZyhtX2lzb2xhdGUsIG1fcFZhbHVlKTsKIH0KIAotdjg6OkxvY2FsPHY4OjpPYmplY3Q+IENKU19WYWx1ZTo6VG9WOE9iamVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIEpTX1RvT2JqZWN0KG1faXNvbGF0ZSwgbV9wVmFsdWUpOworQ0ZYX0J5dGVTdHJpbmcgQ0pTX1ZhbHVlOjpUb0NGWEJ5dGVTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVG9DRlhXaWRlU3RyaW5nKCkpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDSlNfVmFsdWU6OlRvQ0ZYV2lkZVN0cmluZygpIGNvbnN0Ci17Ci0JcmV0dXJuIEpTX1RvU3RyaW5nKG1faXNvbGF0ZSwgbV9wVmFsdWUpOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gQ0pTX1ZhbHVlOjpUb1Y4VmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBtX3BWYWx1ZTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ0pTX1ZhbHVlOjpUb0NGWEJ5dGVTdHJpbmcoKSBjb25zdAotewotCXJldHVybiBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVG9DRlhXaWRlU3RyaW5nKCkpOwordjg6OkxvY2FsPHY4OjpBcnJheT4gQ0pTX1ZhbHVlOjpUb1Y4QXJyYXkoKSBjb25zdCB7CisgIGlmIChJc0FycmF5T2JqZWN0KCkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+OjpDYXN0KEpTX1RvT2JqZWN0KG1faXNvbGF0ZSwgbV9wVmFsdWUpKTsKKyAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+KCk7CiB9CiAKLXY4OjpMb2NhbDx2ODo6VmFsdWU+IENKU19WYWx1ZTo6VG9WOFZhbHVlKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wVmFsdWU7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKwordm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yPShpbnQgaVZhbHVlKSB7CisgIG1fcFZhbHVlID0gSlNfTmV3TnVtYmVyKG1faXNvbGF0ZSwgaVZhbHVlKTsKKworICBtX2VUeXBlID0gVlRfbnVtYmVyOwogfQogCi12ODo6TG9jYWw8djg6OkFycmF5PkNKU19WYWx1ZTo6VG9WOEFycmF5KCkgY29uc3QKLXsKLQlpZiAoSXNBcnJheU9iamVjdCgpKQotCQlyZXR1cm4gdjg6OkxvY2FsPHY4OjpBcnJheT46OkNhc3QoSlNfVG9PYmplY3QobV9pc29sYXRlLCBtX3BWYWx1ZSkpOwotCXJldHVybiB2ODo6TG9jYWw8djg6OkFycmF5PigpOwordm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yPShib29sIGJWYWx1ZSkgeworICBtX3BWYWx1ZSA9IEpTX05ld0Jvb2xlYW4obV9pc29sYXRlLCBiVmFsdWUpOworCisgIG1fZVR5cGUgPSBWVF9ib29sZWFuOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIENKU19WYWx1ZTo6b3BlcmF0b3I9KGRvdWJsZSBkVmFsdWUpIHsKKyAgbV9wVmFsdWUgPSBKU19OZXdOdW1iZXIobV9pc29sYXRlLCBkVmFsdWUpOwogCi12b2lkIENKU19WYWx1ZTo6b3BlcmF0b3IgPShpbnQgaVZhbHVlKQotewotCW1fcFZhbHVlID0gSlNfTmV3TnVtYmVyKG1faXNvbGF0ZSwgaVZhbHVlKTsKLQotCW1fZVR5cGUgPSBWVF9udW1iZXI7CisgIG1fZVR5cGUgPSBWVF9udW1iZXI7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvciA9KGJvb2wgYlZhbHVlKQotewotCW1fcFZhbHVlID0gSlNfTmV3Qm9vbGVhbihtX2lzb2xhdGUsIGJWYWx1ZSk7Ci0KLQltX2VUeXBlID0gVlRfYm9vbGVhbjsKK3ZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oZmxvYXQgZlZhbHVlKSB7CisgIG1fcFZhbHVlID0gSlNfTmV3TnVtYmVyKG1faXNvbGF0ZSwgZlZhbHVlKTsKKyAgbV9lVHlwZSA9IFZUX251bWJlcjsKIH0KIAotdm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yID0oZG91YmxlIGRWYWx1ZSkKLXsKLQltX3BWYWx1ZSA9IEpTX05ld051bWJlcihtX2lzb2xhdGUsZFZhbHVlKTsKK3ZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0odjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopIHsKKyAgbV9wVmFsdWUgPSBKU19OZXdPYmplY3QobV9pc29sYXRlLCBwT2JqKTsKIAotCW1fZVR5cGUgPSBWVF9udW1iZXI7CisgIG1fZVR5cGUgPSBWVF9meG9iamVjdDsKIH0KIAotdm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yID0gKGZsb2F0IGZWYWx1ZSkKLXsKLQltX3BWYWx1ZSA9IEpTX05ld051bWJlcihtX2lzb2xhdGUsZlZhbHVlKTsKLQltX2VUeXBlID0gVlRfbnVtYmVyOwordm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yPShDSlNfT2JqZWN0KiBwT2JqKSB7CisgIGlmIChwT2JqKQorICAgIG9wZXJhdG9yPSgoSlNGWE9iamVjdCkqcE9iaik7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvciA9KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKQotewotCi0JbV9wVmFsdWUgPSBKU19OZXdPYmplY3QobV9pc29sYXRlLHBPYmopOwotCi0JbV9lVHlwZSA9IFZUX2Z4b2JqZWN0Owordm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yPShDSlNfRG9jdW1lbnQqIHBKc0RvYykgeworICBtX2VUeXBlID0gVlRfb2JqZWN0OworICBpZiAocEpzRG9jKSB7CisgICAgbV9wVmFsdWUgPSBzdGF0aWNfY2FzdDxKU0ZYT2JqZWN0PigqcEpzRG9jKTsKKyAgfQogfQogCi12b2lkIENKU19WYWx1ZTo6b3BlcmF0b3IgPShDSlNfT2JqZWN0ICogcE9iaikKLXsKLQlpZiAocE9iaikKLQkJb3BlcmF0b3IgPSAoKEpTRlhPYmplY3QpKnBPYmopOwordm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yPShjb25zdCBGWF9XQ0hBUiogcFdzdHIpIHsKKyAgbV9wVmFsdWUgPSBKU19OZXdTdHJpbmcobV9pc29sYXRlLCAod2NoYXJfdCopcFdzdHIpOworCisgIG1fZVR5cGUgPSBWVF9zdHJpbmc7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvciA9IChDSlNfRG9jdW1lbnQqIHBKc0RvYykKLXsKLQltX2VUeXBlID0gVlRfb2JqZWN0OwotCWlmIChwSnNEb2MpIHsKLQkJbV9wVmFsdWUgPSBzdGF0aWNfY2FzdDxKU0ZYT2JqZWN0PigqcEpzRG9jKTsKLQl9Cit2b2lkIENKU19WYWx1ZTo6U2V0TnVsbCgpIHsKKyAgbV9wVmFsdWUgPSBKU19OZXdOdWxsKCk7CisKKyAgbV9lVHlwZSA9IFZUX251bGw7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvciA9KGNvbnN0IEZYX1dDSEFSKiBwV3N0cikKLXsKLQltX3BWYWx1ZSA9IEpTX05ld1N0cmluZyhtX2lzb2xhdGUsKHdjaGFyX3QgKilwV3N0cik7Ci0KLQltX2VUeXBlID0gVlRfc3RyaW5nOwordm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yPShjb25zdCBGWF9DSEFSKiBwU3RyKSB7CisgIG9wZXJhdG9yPShDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBTdHIpLmNfc3RyKCkpOwogfQogCi12b2lkIENKU19WYWx1ZTo6U2V0TnVsbCgpCi17Ci0JbV9wVmFsdWUgPSBKU19OZXdOdWxsKCk7Cit2b2lkIENKU19WYWx1ZTo6b3BlcmF0b3I9KENKU19BcnJheSYgYXJyYXkpIHsKKyAgbV9wVmFsdWUgPSBKU19OZXdPYmplY3QyKG1faXNvbGF0ZSwgKHY4OjpMb2NhbDx2ODo6QXJyYXk+KWFycmF5KTsKIAotCW1fZVR5cGUgPSBWVF9udWxsOworICBtX2VUeXBlID0gVlRfb2JqZWN0OwogfQogCi12b2lkIENKU19WYWx1ZTo6b3BlcmF0b3IgPSAoY29uc3QgRlhfQ0hBUiogcFN0cikKLXsKLQlvcGVyYXRvciA9IChDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBTdHIpLmNfc3RyKCkpOwordm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yPShDSlNfRGF0ZSYgZGF0ZSkgeworICBtX3BWYWx1ZSA9IEpTX05ld0RhdGUobV9pc29sYXRlLCAoZG91YmxlKWRhdGUpOworCisgIG1fZVR5cGUgPSBWVF9kYXRlOwogfQogCi12b2lkIENKU19WYWx1ZTo6b3BlcmF0b3IgPSAoQ0pTX0FycmF5ICYgYXJyYXkpCi17Ci0JbV9wVmFsdWUgPSBKU19OZXdPYmplY3QyKG1faXNvbGF0ZSwodjg6OkxvY2FsPHY4OjpBcnJheT4pYXJyYXkpOwordm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yPShDSlNfVmFsdWUgdmFsdWUpIHsKKyAgbV9wVmFsdWUgPSB2YWx1ZS5Ub1Y4VmFsdWUoKTsKIAotCW1fZVR5cGUgPSBWVF9vYmplY3Q7CisgIG1fZVR5cGUgPSB2YWx1ZS5tX2VUeXBlOworICBtX2lzb2xhdGUgPSB2YWx1ZS5tX2lzb2xhdGU7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvciA9IChDSlNfRGF0ZSAmIGRhdGUpCi17Ci0JbV9wVmFsdWUgPSBKU19OZXdEYXRlKG1faXNvbGF0ZSwgKGRvdWJsZSlkYXRlKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCi0JbV9lVHlwZSA9IFZUX2RhdGU7CitGWEpTVkFMVUVUWVBFIENKU19WYWx1ZTo6R2V0VHlwZSgpIGNvbnN0IHsKKyAgaWYgKG1fcFZhbHVlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gVlRfdW5rbm93bjsKKyAgaWYgKG1fcFZhbHVlLT5Jc1N0cmluZygpKQorICAgIHJldHVybiBWVF9zdHJpbmc7CisgIGlmIChtX3BWYWx1ZS0+SXNOdW1iZXIoKSkKKyAgICByZXR1cm4gVlRfbnVtYmVyOworICBpZiAobV9wVmFsdWUtPklzQm9vbGVhbigpKQorICAgIHJldHVybiBWVF9ib29sZWFuOworICBpZiAobV9wVmFsdWUtPklzRGF0ZSgpKQorICAgIHJldHVybiBWVF9kYXRlOworICBpZiAobV9wVmFsdWUtPklzT2JqZWN0KCkpCisgICAgcmV0dXJuIFZUX29iamVjdDsKKyAgaWYgKG1fcFZhbHVlLT5Jc051bGwoKSkKKyAgICByZXR1cm4gVlRfbnVsbDsKKyAgaWYgKG1fcFZhbHVlLT5Jc1VuZGVmaW5lZCgpKQorICAgIHJldHVybiBWVF91bmRlZmluZWQ7CisgIHJldHVybiBWVF91bmtub3duOwogfQogCi12b2lkIENKU19WYWx1ZTo6b3BlcmF0b3IgPSAoQ0pTX1ZhbHVlIHZhbHVlKQotewotCW1fcFZhbHVlID0gdmFsdWUuVG9WOFZhbHVlKCk7Ci0KLQltX2VUeXBlID0gdmFsdWUubV9lVHlwZTsKLSAgICAgICAgbV9pc29sYXRlID0gdmFsdWUubV9pc29sYXRlOworRlhfQk9PTCBDSlNfVmFsdWU6OklzQXJyYXlPYmplY3QoKSBjb25zdCB7CisgIGlmIChtX3BWYWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gbV9wVmFsdWUtPklzQXJyYXkoKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1GWEpTVkFMVUVUWVBFIENKU19WYWx1ZTo6R2V0VHlwZSgpIGNvbnN0Ci17Ci0JaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gVlRfdW5rbm93bjsKLQlpZihtX3BWYWx1ZS0+SXNTdHJpbmcoKSkgcmV0dXJuIFZUX3N0cmluZzsKLQlpZihtX3BWYWx1ZS0+SXNOdW1iZXIoKSkgcmV0dXJuIFZUX251bWJlcjsKLQlpZihtX3BWYWx1ZS0+SXNCb29sZWFuKCkpIHJldHVybiBWVF9ib29sZWFuOwotCWlmKG1fcFZhbHVlLT5Jc0RhdGUoKSkgcmV0dXJuIFZUX2RhdGU7Ci0JaWYobV9wVmFsdWUtPklzT2JqZWN0KCkpIHJldHVybiBWVF9vYmplY3Q7Ci0JaWYobV9wVmFsdWUtPklzTnVsbCgpKSByZXR1cm4gVlRfbnVsbDsKLQlpZihtX3BWYWx1ZS0+SXNVbmRlZmluZWQoKSkgcmV0dXJuIFZUX3VuZGVmaW5lZDsKLQlyZXR1cm4gVlRfdW5rbm93bjsKK0ZYX0JPT0wgQ0pTX1ZhbHVlOjpJc0RhdGVPYmplY3QoKSBjb25zdCB7CisgIGlmIChtX3BWYWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gbV9wVmFsdWUtPklzRGF0ZSgpOwogfQogCi1GWF9CT09MIENKU19WYWx1ZTo6SXNBcnJheU9iamVjdCgpIGNvbnN0Ci17Ci0JaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIG1fcFZhbHVlLT5Jc0FycmF5KCk7CisvLyBDSlNfVmFsdWU6Om9wZXJhdG9yIENKU19BcnJheSgpCitGWF9CT09MIENKU19WYWx1ZTo6Q29udmVydFRvQXJyYXkoQ0pTX0FycmF5JiBhcnJheSkgY29uc3QgeworICBpZiAoSXNBcnJheU9iamVjdCgpKSB7CisgICAgYXJyYXkuQXR0YWNoKEpTX1RvQXJyYXkobV9pc29sYXRlLCBtX3BWYWx1ZSkpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENKU19WYWx1ZTo6SXNEYXRlT2JqZWN0KCkgY29uc3QKLXsKLQlpZihtX3BWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gbV9wVmFsdWUtPklzRGF0ZSgpOwotfQorRlhfQk9PTCBDSlNfVmFsdWU6OkNvbnZlcnRUb0RhdGUoQ0pTX0RhdGUmIGRhdGUpIGNvbnN0IHsKKyAgLy8gCWlmIChHZXRUeXBlKCkgPT0gVlRfZGF0ZSkKKyAgLy8gCXsKKyAgLy8gCQlkYXRlID0gKGRvdWJsZSkoKnRoaXMpOworICAvLyAJCXJldHVybiBUUlVFOworICAvLyAJfQogCi0vL0NKU19WYWx1ZTo6b3BlcmF0b3IgQ0pTX0FycmF5KCkKLUZYX0JPT0wgQ0pTX1ZhbHVlOjpDb252ZXJ0VG9BcnJheShDSlNfQXJyYXkgJmFycmF5KSBjb25zdAotewotCWlmIChJc0FycmF5T2JqZWN0KCkpCi0JewotCQlhcnJheS5BdHRhY2goSlNfVG9BcnJheShtX2lzb2xhdGUsIG1fcFZhbHVlKSk7Ci0JCXJldHVybiBUUlVFOwotCX0KKyAgaWYgKElzRGF0ZU9iamVjdCgpKSB7CisgICAgZGF0ZS5BdHRhY2gobV9wVmFsdWUpOworICAgIHJldHVybiBUUlVFOworICB9CiAKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0pTX1ZhbHVlOjpDb252ZXJ0VG9EYXRlKENKU19EYXRlICZkYXRlKSBjb25zdAotewotLy8gCWlmIChHZXRUeXBlKCkgPT0gVlRfZGF0ZSkKLS8vIAl7Ci0vLyAJCWRhdGUgPSAoZG91YmxlKSgqdGhpcyk7Ci0vLyAJCXJldHVybiBUUlVFOwotLy8gCX0KLQotCWlmIChJc0RhdGVPYmplY3QoKSkKLQl7Ci0JCWRhdGUuQXR0YWNoKG1fcFZhbHVlKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX1Byb3BWYWx1ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNKU19Qcm9wVmFsdWU6OkNKU19Qcm9wVmFsdWUoY29uc3QgQ0pTX1ZhbHVlICZ2YWx1ZSkgOgotCUNKU19WYWx1ZSh2YWx1ZSksCi0JbV9iSXNTZXR0aW5nKDApCi17CitDSlNfUHJvcFZhbHVlOjpDSlNfUHJvcFZhbHVlKGNvbnN0IENKU19WYWx1ZSYgdmFsdWUpCisgICAgOiBDSlNfVmFsdWUodmFsdWUpLCBtX2JJc1NldHRpbmcoMCkge30KKworQ0pTX1Byb3BWYWx1ZTo6Q0pTX1Byb3BWYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSkKKyAgICA6IENKU19WYWx1ZShpc29sYXRlKSwgbV9iSXNTZXR0aW5nKDApIHt9CisKK0NKU19Qcm9wVmFsdWU6On5DSlNfUHJvcFZhbHVlKCkge30KKworRlhfQk9PTCBDSlNfUHJvcFZhbHVlOjpJc1NldHRpbmcoKSB7CisgIHJldHVybiBtX2JJc1NldHRpbmc7CiB9CiAKLUNKU19Qcm9wVmFsdWU6OkNKU19Qcm9wVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUpIDogQ0pTX1ZhbHVlKGlzb2xhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSXNTZXR0aW5nKDApCi17CitGWF9CT09MIENKU19Qcm9wVmFsdWU6OklzR2V0dGluZygpIHsKKyAgcmV0dXJuICFtX2JJc1NldHRpbmc7CiB9CiAKLUNKU19Qcm9wVmFsdWU6On5DSlNfUHJvcFZhbHVlKCkKLXsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChpbnQgaVZhbHVlKSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oaVZhbHVlKTsKIH0KIAotRlhfQk9PTCBDSlNfUHJvcFZhbHVlOjpJc1NldHRpbmcoKQotewotCXJldHVybiBtX2JJc1NldHRpbmc7Cit2b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPj4oaW50JiBpVmFsdWUpIGNvbnN0IHsKKyAgQVNTRVJUKG1fYklzU2V0dGluZyk7CisgIGlWYWx1ZSA9IENKU19WYWx1ZTo6VG9JbnQoKTsKIH0KIAotRlhfQk9PTCBDSlNfUHJvcFZhbHVlOjpJc0dldHRpbmcoKQotewotCXJldHVybiAhbV9iSXNTZXR0aW5nOwordm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KGJvb2wgYlZhbHVlKSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oYlZhbHVlKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA8PChpbnQgaVZhbHVlKQotewotCUFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLQlDSlNfVmFsdWU6Om9wZXJhdG9yID0oaVZhbHVlKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+Pihib29sJiBiVmFsdWUpIGNvbnN0IHsKKyAgQVNTRVJUKG1fYklzU2V0dGluZyk7CisgIGJWYWx1ZSA9IENKU19WYWx1ZTo6VG9Cb29sKCk7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3IgPj4oaW50ICYgaVZhbHVlKSBjb25zdAotewotCUFTU0VSVChtX2JJc1NldHRpbmcpOwotCWlWYWx1ZSA9IENKU19WYWx1ZTo6VG9JbnQoKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChkb3VibGUgZFZhbHVlKSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oZFZhbHVlKTsKIH0KIAotCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yIDw8KGJvb2wgYlZhbHVlKQotewotCUFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLQlDSlNfVmFsdWU6Om9wZXJhdG9yID0oYlZhbHVlKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+Pihkb3VibGUmIGRWYWx1ZSkgY29uc3QgeworICBBU1NFUlQobV9iSXNTZXR0aW5nKTsKKyAgZFZhbHVlID0gQ0pTX1ZhbHVlOjpUb0RvdWJsZSgpOwogfQogCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yID4+KGJvb2wmIGJWYWx1ZSkgY29uc3QKLXsKLQlBU1NFUlQobV9iSXNTZXR0aW5nKTsKLQliVmFsdWUgPSBDSlNfVmFsdWU6OlRvQm9vbCgpOwordm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KENKU19PYmplY3QqIHBPYmopIHsKKyAgQVNTRVJUKCFtX2JJc1NldHRpbmcpOworICBDSlNfVmFsdWU6Om9wZXJhdG9yPShwT2JqKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA8PChkb3VibGUgZFZhbHVlKQotewotCUFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLQlDSlNfVmFsdWU6Om9wZXJhdG9yID0oZFZhbHVlKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihDSlNfT2JqZWN0KiYgcHBPYmopIGNvbnN0IHsKKyAgQVNTRVJUKG1fYklzU2V0dGluZyk7CisgIHBwT2JqID0gQ0pTX1ZhbHVlOjpUb0NKU09iamVjdCgpOwogfQogCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yID4+KGRvdWJsZSYgZFZhbHVlKSBjb25zdAotewotCUFTU0VSVChtX2JJc1NldHRpbmcpOwotCWRWYWx1ZSA9IENKU19WYWx1ZTo6VG9Eb3VibGUoKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChDSlNfRG9jdW1lbnQqIHBKc0RvYykgeworICBBU1NFUlQoIW1fYklzU2V0dGluZyk7CisgIENKU19WYWx1ZTo6b3BlcmF0b3I9KHBKc0RvYyk7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3IgPDwoQ0pTX09iamVjdCogcE9iaikKLXsKLQlBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0JQ0pTX1ZhbHVlOjpvcGVyYXRvciA9IChwT2JqKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihDSlNfRG9jdW1lbnQqJiBwcEpzRG9jKSBjb25zdCB7CisgIEFTU0VSVChtX2JJc1NldHRpbmcpOworICBwcEpzRG9jID0gc3RhdGljX2Nhc3Q8Q0pTX0RvY3VtZW50Kj4oQ0pTX1ZhbHVlOjpUb0NKU09iamVjdCgpKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA+PihDSlNfT2JqZWN0KiYgcHBPYmopIGNvbnN0Ci17Ci0JQVNTRVJUKG1fYklzU2V0dGluZyk7Ci0JcHBPYmogPSBDSlNfVmFsdWU6OlRvQ0pTT2JqZWN0KCk7Cit2b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPDwoSlNGWE9iamVjdCBwT2JqKSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0ocE9iaik7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3IgPDwoQ0pTX0RvY3VtZW50KiBwSnNEb2MpCi17Ci0JQVNTRVJUKCFtX2JJc1NldHRpbmcpOwotCUNKU19WYWx1ZTo6b3BlcmF0b3IgPSAocEpzRG9jKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihKU0ZYT2JqZWN0JiBwcE9iaikgY29uc3QgeworICBBU1NFUlQobV9iSXNTZXR0aW5nKTsKKyAgcHBPYmogPSBDSlNfVmFsdWU6OlRvVjhPYmplY3QoKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA+PihDSlNfRG9jdW1lbnQqJiBwcEpzRG9jKSBjb25zdAotewotCUFTU0VSVChtX2JJc1NldHRpbmcpOwotCXBwSnNEb2MgPSBzdGF0aWNfY2FzdDxDSlNfRG9jdW1lbnQqPihDSlNfVmFsdWU6OlRvQ0pTT2JqZWN0KCkpOwordm9pZCBDSlNfUHJvcFZhbHVlOjpTdGFydFNldHRpbmcoKSB7CisgIG1fYklzU2V0dGluZyA9IDE7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChKU0ZYT2JqZWN0IHBPYmopCi17Ci0JQVNTRVJUKCFtX2JJc1NldHRpbmcpOwotCUNKU19WYWx1ZTo6b3BlcmF0b3IgPSAocE9iaik7Cit2b2lkIENKU19Qcm9wVmFsdWU6OlN0YXJ0R2V0dGluZygpIHsKKyAgbV9iSXNTZXR0aW5nID0gMDsKK30KK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChDRlhfQnl0ZVN0cmluZyBzdHJpbmcpIHsKKyAgQVNTRVJUKCFtX2JJc1NldHRpbmcpOworICBDSlNfVmFsdWU6Om9wZXJhdG9yPShzdHJpbmcuY19zdHIoKSk7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihKU0ZYT2JqZWN0ICZwcE9iaikgY29uc3QKLXsKLQlBU1NFUlQobV9iSXNTZXR0aW5nKTsKLQlwcE9iaiA9IENKU19WYWx1ZTo6VG9WOE9iamVjdCgpOwordm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcj4+KENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpIGNvbnN0IHsKKyAgQVNTRVJUKG1fYklzU2V0dGluZyk7CisgIHN0cmluZyA9IENKU19WYWx1ZTo6VG9DRlhCeXRlU3RyaW5nKCk7CiB9CiAKLQotdm9pZCBDSlNfUHJvcFZhbHVlOjpTdGFydFNldHRpbmcoKQotewotCW1fYklzU2V0dGluZyA9IDE7Cit2b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPDwoY29uc3QgRlhfV0NIQVIqIGNfc3RyaW5nKSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oY19zdHJpbmcpOwogfQogCi12b2lkIENKU19Qcm9wVmFsdWU6OlN0YXJ0R2V0dGluZygpCi17Ci0JbV9iSXNTZXR0aW5nID0gMDsKLX0KLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3IgPDwoQ0ZYX0J5dGVTdHJpbmcgc3RyaW5nKQotewotCUFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLQlDSlNfVmFsdWU6Om9wZXJhdG9yID0gKHN0cmluZy5jX3N0cigpKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihDRlhfV2lkZVN0cmluZyYgd2lkZV9zdHJpbmcpIGNvbnN0IHsKKyAgQVNTRVJUKG1fYklzU2V0dGluZyk7CisgIHdpZGVfc3RyaW5nID0gQ0pTX1ZhbHVlOjpUb0NGWFdpZGVTdHJpbmcoKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA+PihDRlhfQnl0ZVN0cmluZyAmc3RyaW5nKSBjb25zdAotewotCUFTU0VSVChtX2JJc1NldHRpbmcpOwotCXN0cmluZyA9IENKU19WYWx1ZTo6VG9DRlhCeXRlU3RyaW5nKCk7Cit2b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPDwoQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcpIHsKKyAgQVNTRVJUKCFtX2JJc1NldHRpbmcpOworICBDSlNfVmFsdWU6Om9wZXJhdG9yPSh3aWRlX3N0cmluZy5jX3N0cigpKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA8PChjb25zdCBGWF9XQ0hBUiogY19zdHJpbmcpCi17Ci0JQVNTRVJUKCFtX2JJc1NldHRpbmcpOwotCUNKU19WYWx1ZTo6b3BlcmF0b3IgPShjX3N0cmluZyk7Cit2b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPj4oQ0pTX0FycmF5JiBhcnJheSkgY29uc3QgeworICBBU1NFUlQobV9iSXNTZXR0aW5nKTsKKyAgQ29udmVydFRvQXJyYXkoYXJyYXkpOwogfQogCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yID4+KENGWF9XaWRlU3RyaW5nICZ3aWRlX3N0cmluZykgY29uc3QKLXsKLQlBU1NFUlQobV9iSXNTZXR0aW5nKTsKLQl3aWRlX3N0cmluZyA9IENKU19WYWx1ZTo6VG9DRlhXaWRlU3RyaW5nKCk7Cit2b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPDwoQ0pTX0FycmF5JiBhcnJheSkgeworICBBU1NFUlQoIW1fYklzU2V0dGluZyk7CisgIENKU19WYWx1ZTo6b3BlcmF0b3I9KGFycmF5KTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA8PChDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZykKLXsKLQlBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0JQ0pTX1ZhbHVlOjpvcGVyYXRvciA9ICh3aWRlX3N0cmluZy5jX3N0cigpKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihDSlNfRGF0ZSYgZGF0ZSkgY29uc3QgeworICBBU1NFUlQobV9iSXNTZXR0aW5nKTsKKyAgQ29udmVydFRvRGF0ZShkYXRlKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA+PihDSlNfQXJyYXkgJmFycmF5KSBjb25zdAotewotCUFTU0VSVChtX2JJc1NldHRpbmcpOwotCUNvbnZlcnRUb0FycmF5KGFycmF5KTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChDSlNfRGF0ZSYgZGF0ZSkgeworICBBU1NFUlQoIW1fYklzU2V0dGluZyk7CisgIENKU19WYWx1ZTo6b3BlcmF0b3I9KGRhdGUpOwogfQogCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yIDw8KENKU19BcnJheSAmYXJyYXkpCi17Ci0JQVNTRVJUKCFtX2JJc1NldHRpbmcpOwotCUNKU19WYWx1ZTo6b3BlcmF0b3I9KGFycmF5KTsKK0NKU19Qcm9wVmFsdWU6Om9wZXJhdG9yIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCkgY29uc3QgeworICByZXR1cm4gbV9wVmFsdWU7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihDSlNfRGF0ZSAmZGF0ZSkgY29uc3QKLXsKLQlBU1NFUlQobV9iSXNTZXR0aW5nKTsKLQlDb252ZXJ0VG9EYXRlKGRhdGUpOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDSlNfQXJyYXkKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitDSlNfQXJyYXk6OkNKU19BcnJheSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSkgOiBtX2lzb2xhdGUoaXNvbGF0ZSkge30KKworQ0pTX0FycmF5Ojp+Q0pTX0FycmF5KCkge30KKwordm9pZCBDSlNfQXJyYXk6OkF0dGFjaCh2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXkpIHsKKyAgbV9wQXJyYXkgPSBwQXJyYXk7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChDSlNfRGF0ZSAmZGF0ZSkKLXsKLQlBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0JQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oZGF0ZSk7CitGWF9CT09MIENKU19BcnJheTo6SXNBdHRhY2hlZCgpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1DSlNfUHJvcFZhbHVlOjpvcGVyYXRvciB2ODo6TG9jYWw8djg6OlZhbHVlPigpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fcFZhbHVlOwordm9pZCBDSlNfQXJyYXk6OkdldEVsZW1lbnQodW5zaWduZWQgaW5kZXgsIENKU19WYWx1ZSYgdmFsdWUpIHsKKyAgaWYgKG1fcEFycmF5LklzRW1wdHkoKSkKKyAgICByZXR1cm47CisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHAgPSBKU19HZXRBcnJheUVsZW1lbnQobV9pc29sYXRlLCBtX3BBcnJheSwgaW5kZXgpOworICB2YWx1ZS5BdHRhY2gocCwgVlRfb2JqZWN0KTsKIH0KIAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDSlNfQXJyYXkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLUNKU19BcnJheTo6Q0pTX0FycmF5KHY4OjpJc29sYXRlKiBpc29sYXRlKTptX2lzb2xhdGUoaXNvbGF0ZSkKLXsKK3ZvaWQgQ0pTX0FycmF5OjpTZXRFbGVtZW50KHVuc2lnbmVkIGluZGV4LCBDSlNfVmFsdWUgdmFsdWUpIHsKKyAgaWYgKG1fcEFycmF5LklzRW1wdHkoKSkKKyAgICBtX3BBcnJheSA9IEpTX05ld0FycmF5KG1faXNvbGF0ZSk7CisKKyAgSlNfUHV0QXJyYXlFbGVtZW50KG1faXNvbGF0ZSwgbV9wQXJyYXksIGluZGV4LCB2YWx1ZS5Ub1Y4VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlLkdldFR5cGUoKSk7CiB9CiAKLUNKU19BcnJheTo6fkNKU19BcnJheSgpCi17CitpbnQgQ0pTX0FycmF5OjpHZXRMZW5ndGgoKSB7CisgIGlmIChtX3BBcnJheS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBKU19HZXRBcnJheUxlbmd0aChtX3BBcnJheSk7CiB9CiAKLXZvaWQgQ0pTX0FycmF5OjpBdHRhY2godjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5KQotewotCW1fcEFycmF5ID0gcEFycmF5OworQ0pTX0FycmF5OjpvcGVyYXRvciB2ODo6TG9jYWw8djg6OkFycmF5PigpIHsKKyAgaWYgKG1fcEFycmF5LklzRW1wdHkoKSkKKyAgICBtX3BBcnJheSA9IEpTX05ld0FycmF5KG1faXNvbGF0ZSk7CisKKyAgcmV0dXJuIG1fcEFycmF5OwogfQogCi1GWF9CT09MIENKU19BcnJheTo6SXNBdHRhY2hlZCgpCi17Ci0JcmV0dXJuIEZBTFNFOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDSlNfRGF0ZQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworQ0pTX0RhdGU6OkNKU19EYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlKSA6IG1faXNvbGF0ZShpc29sYXRlKSB7fQorCitDSlNfRGF0ZTo6Q0pTX0RhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIGRvdWJsZSBkTXNlY190aW1lKSB7CisgIG1faXNvbGF0ZSA9IGlzb2xhdGU7CisgIG1fcERhdGUgPSBKU19OZXdEYXRlKGlzb2xhdGUsIGRNc2VjX3RpbWUpOwogfQogCi12b2lkIENKU19BcnJheTo6R2V0RWxlbWVudCh1bnNpZ25lZCBpbmRleCxDSlNfVmFsdWUgJnZhbHVlKQotewotCWlmIChtX3BBcnJheS5Jc0VtcHR5KCkpCi0JCXJldHVybjsKLQl2ODo6TG9jYWw8djg6OlZhbHVlPiAgcCA9IEpTX0dldEFycmF5RWxlbWVudChtX2lzb2xhdGUsIG1fcEFycmF5LGluZGV4KTsKLQl2YWx1ZS5BdHRhY2gocCxWVF9vYmplY3QpOworQ0pTX0RhdGU6OkNKU19EYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlLAorICAgICAgICAgICAgICAgICAgIGludCB5ZWFyLAorICAgICAgICAgICAgICAgICAgIGludCBtb24sCisgICAgICAgICAgICAgICAgICAgaW50IGRheSwKKyAgICAgICAgICAgICAgICAgICBpbnQgaG91ciwKKyAgICAgICAgICAgICAgICAgICBpbnQgbWluLAorICAgICAgICAgICAgICAgICAgIGludCBzZWMpIHsKKyAgbV9pc29sYXRlID0gaXNvbGF0ZTsKKyAgbV9wRGF0ZSA9IEpTX05ld0RhdGUoaXNvbGF0ZSwgTWFrZURhdGUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjLCAwKSk7CiB9CiAKLXZvaWQgQ0pTX0FycmF5OjpTZXRFbGVtZW50KHVuc2lnbmVkIGluZGV4LENKU19WYWx1ZSB2YWx1ZSkKLXsKLQlpZiAobV9wQXJyYXkuSXNFbXB0eSgpKQotCQltX3BBcnJheSA9IEpTX05ld0FycmF5KG1faXNvbGF0ZSk7Ci0KLQlKU19QdXRBcnJheUVsZW1lbnQobV9pc29sYXRlLCBtX3BBcnJheSwgaW5kZXgsIHZhbHVlLlRvVjhWYWx1ZSgpLCB2YWx1ZS5HZXRUeXBlKCkpOworZG91YmxlIENKU19EYXRlOjpNYWtlRGF0ZShpbnQgeWVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtcykgeworICByZXR1cm4gSlNfTWFrZURhdGUoSlNfTWFrZURheSh5ZWFyLCBtb24sIGRheSksCisgICAgICAgICAgICAgICAgICAgICBKU19NYWtlVGltZShob3VyLCBtaW4sIHNlYywgbXMpKTsKIH0KIAotaW50IENKU19BcnJheTo6R2V0TGVuZ3RoKCkKLXsKLQlpZiAobV9wQXJyYXkuSXNFbXB0eSgpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gSlNfR2V0QXJyYXlMZW5ndGgobV9wQXJyYXkpOworQ0pTX0RhdGU6On5DSlNfRGF0ZSgpIHt9CisKK0ZYX0JPT0wgQ0pTX0RhdGU6OklzVmFsaWREYXRlKCkgeworICBpZiAobV9wRGF0ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gIUpTX1BvcnRJc05hbihKU19Ub051bWJlcihtX2lzb2xhdGUsIG1fcERhdGUpKTsKIH0KIAotQ0pTX0FycmF5Ojogb3BlcmF0b3Igdjg6OkxvY2FsPHY4OjpBcnJheT4oKQotewotCWlmIChtX3BBcnJheS5Jc0VtcHR5KCkpCi0JCW1fcEFycmF5ID0gSlNfTmV3QXJyYXkobV9pc29sYXRlKTsKLQotCXJldHVybiBtX3BBcnJheTsKK3ZvaWQgQ0pTX0RhdGU6OkF0dGFjaCh2ODo6TG9jYWw8djg6OlZhbHVlPiBwRGF0ZSkgeworICBtX3BEYXRlID0gcERhdGU7CiB9CiAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ0pTX0RhdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBDSlNfRGF0ZTo6R2V0WWVhcigpIHsKKyAgaWYgKElzVmFsaWREYXRlKCkpCisgICAgcmV0dXJuIEpTX0dldFllYXJGcm9tVGltZShKU19Mb2NhbFRpbWUoSlNfVG9OdW1iZXIobV9pc29sYXRlLCBtX3BEYXRlKSkpOwogCi1DSlNfRGF0ZTo6Q0pTX0RhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUpIDptX2lzb2xhdGUoaXNvbGF0ZSkKLXsKKyAgcmV0dXJuIDA7CiB9CiAKLUNKU19EYXRlOjpDSlNfRGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSxkb3VibGUgZE1zZWNfdGltZSkKLXsKLQltX2lzb2xhdGUgPSBpc29sYXRlOwotCW1fcERhdGUgPSBKU19OZXdEYXRlKGlzb2xhdGUsZE1zZWNfdGltZSk7Cit2b2lkIENKU19EYXRlOjpTZXRZZWFyKGludCBpWWVhcikgeworICBkb3VibGUgZGF0ZSA9IE1ha2VEYXRlKGlZZWFyLCBHZXRNb250aCgpLCBHZXREYXkoKSwgR2V0SG91cnMoKSwgR2V0TWludXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNlY29uZHMoKSwgMCk7CisgIEpTX1ZhbHVlQ29weShtX3BEYXRlLCBKU19OZXdEYXRlKG1faXNvbGF0ZSwgZGF0ZSkpOwogfQogCi1DSlNfRGF0ZTo6Q0pTX0RhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUsaW50IHllYXIsIGludCBtb24sIGludCBkYXksaW50IGhvdXIsIGludCBtaW4sIGludCBzZWMpCi17Ci0JbV9pc29sYXRlID0gaXNvbGF0ZTsKLQltX3BEYXRlID0gSlNfTmV3RGF0ZShpc29sYXRlLE1ha2VEYXRlKHllYXIsbW9uLGRheSxob3VyLG1pbixzZWMsMCkpOworaW50IENKU19EYXRlOjpHZXRNb250aCgpIHsKKyAgaWYgKElzVmFsaWREYXRlKCkpCisgICAgcmV0dXJuIEpTX0dldE1vbnRoRnJvbVRpbWUoSlNfTG9jYWxUaW1lKEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wRGF0ZSkpKTsKKworICByZXR1cm4gMDsKIH0KIAotZG91YmxlIENKU19EYXRlOjpNYWtlRGF0ZShpbnQgeWVhciwgaW50IG1vbiwgaW50IGRheSxpbnQgaG91ciwgaW50IG1pbiwgaW50IHNlYyxpbnQgbXMpCi17Ci0JcmV0dXJuIEpTX01ha2VEYXRlKEpTX01ha2VEYXkoeWVhcixtb24sZGF5KSwgSlNfTWFrZVRpbWUoaG91cixtaW4sc2VjLG1zKSk7Cit2b2lkIENKU19EYXRlOjpTZXRNb250aChpbnQgaU1vbnRoKSB7CisgIGRvdWJsZSBkYXRlID0gTWFrZURhdGUoR2V0WWVhcigpLCBpTW9udGgsIEdldERheSgpLCBHZXRIb3VycygpLCBHZXRNaW51dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2Vjb25kcygpLCAwKTsKKyAgSlNfVmFsdWVDb3B5KG1fcERhdGUsIEpTX05ld0RhdGUobV9pc29sYXRlLCBkYXRlKSk7CiB9CiAKLUNKU19EYXRlOjp+Q0pTX0RhdGUoKQoteworaW50IENKU19EYXRlOjpHZXREYXkoKSB7CisgIGlmIChJc1ZhbGlkRGF0ZSgpKQorICAgIHJldHVybiBKU19HZXREYXlGcm9tVGltZShKU19Mb2NhbFRpbWUoSlNfVG9OdW1iZXIobV9pc29sYXRlLCBtX3BEYXRlKSkpOworCisgIHJldHVybiAwOwogfQogCi1GWF9CT09MCUNKU19EYXRlOjpJc1ZhbGlkRGF0ZSgpCi17Ci0JaWYobV9wRGF0ZS5Jc0VtcHR5KCkpIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gIUpTX1BvcnRJc05hbihKU19Ub051bWJlcihtX2lzb2xhdGUsIG1fcERhdGUpKTsKK3ZvaWQgQ0pTX0RhdGU6OlNldERheShpbnQgaURheSkgeworICBkb3VibGUgZGF0ZSA9IE1ha2VEYXRlKEdldFllYXIoKSwgR2V0TW9udGgoKSwgaURheSwgR2V0SG91cnMoKSwgR2V0TWludXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNlY29uZHMoKSwgMCk7CisgIEpTX1ZhbHVlQ29weShtX3BEYXRlLCBKU19OZXdEYXRlKG1faXNvbGF0ZSwgZGF0ZSkpOwogfQogCi12b2lkIENKU19EYXRlOjpBdHRhY2godjg6OkxvY2FsPHY4OjpWYWx1ZT4gcERhdGUpCi17Ci0JbV9wRGF0ZSA9IHBEYXRlOworaW50IENKU19EYXRlOjpHZXRIb3VycygpIHsKKyAgaWYgKElzVmFsaWREYXRlKCkpCisgICAgcmV0dXJuIEpTX0dldEhvdXJGcm9tVGltZShKU19Mb2NhbFRpbWUoSlNfVG9OdW1iZXIobV9pc29sYXRlLCBtX3BEYXRlKSkpOworCisgIHJldHVybiAwOwogfQogCi1pbnQgQ0pTX0RhdGU6OkdldFllYXIoKQotewotCWlmIChJc1ZhbGlkRGF0ZSgpKQotCQlyZXR1cm4gSlNfR2V0WWVhckZyb21UaW1lKEpTX0xvY2FsVGltZShKU19Ub051bWJlcihtX2lzb2xhdGUsIG1fcERhdGUpKSk7Ci0KLQlyZXR1cm4gMDsKK3ZvaWQgQ0pTX0RhdGU6OlNldEhvdXJzKGludCBpSG91cnMpIHsKKyAgZG91YmxlIGRhdGUgPSBNYWtlRGF0ZShHZXRZZWFyKCksIEdldE1vbnRoKCksIEdldERheSgpLCBpSG91cnMsIEdldE1pbnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTZWNvbmRzKCksIDApOworICBKU19WYWx1ZUNvcHkobV9wRGF0ZSwgSlNfTmV3RGF0ZShtX2lzb2xhdGUsIGRhdGUpKTsKIH0KIAotdm9pZCBDSlNfRGF0ZTo6U2V0WWVhcihpbnQgaVllYXIpCi17Ci0JZG91YmxlIGRhdGUgPSBNYWtlRGF0ZShpWWVhcixHZXRNb250aCgpLEdldERheSgpLEdldEhvdXJzKCksR2V0TWludXRlcygpLEdldFNlY29uZHMoKSwwKTsKLQlKU19WYWx1ZUNvcHkobV9wRGF0ZSwgSlNfTmV3RGF0ZShtX2lzb2xhdGUsZGF0ZSkpOworaW50IENKU19EYXRlOjpHZXRNaW51dGVzKCkgeworICBpZiAoSXNWYWxpZERhdGUoKSkKKyAgICByZXR1cm4gSlNfR2V0TWluRnJvbVRpbWUoSlNfTG9jYWxUaW1lKEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wRGF0ZSkpKTsKKworICByZXR1cm4gMDsKIH0KIAotaW50IENKU19EYXRlOjpHZXRNb250aCgpCi17Ci0JaWYgKElzVmFsaWREYXRlKCkpCi0JCXJldHVybiBKU19HZXRNb250aEZyb21UaW1lKEpTX0xvY2FsVGltZShKU19Ub051bWJlcihtX2lzb2xhdGUsIG1fcERhdGUpKSk7Ci0KLQlyZXR1cm4gMDsKK3ZvaWQgQ0pTX0RhdGU6OlNldE1pbnV0ZXMoaW50IG1pbnV0ZXMpIHsKKyAgZG91YmxlIGRhdGUgPSBNYWtlRGF0ZShHZXRZZWFyKCksIEdldE1vbnRoKCksIEdldERheSgpLCBHZXRIb3VycygpLCBtaW51dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNlY29uZHMoKSwgMCk7CisgIEpTX1ZhbHVlQ29weShtX3BEYXRlLCBKU19OZXdEYXRlKG1faXNvbGF0ZSwgZGF0ZSkpOwogfQogCi12b2lkIENKU19EYXRlOjpTZXRNb250aChpbnQgaU1vbnRoKQoteworaW50IENKU19EYXRlOjpHZXRTZWNvbmRzKCkgeworICBpZiAoSXNWYWxpZERhdGUoKSkKKyAgICByZXR1cm4gSlNfR2V0U2VjRnJvbVRpbWUoSlNfTG9jYWxUaW1lKEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wRGF0ZSkpKTsKIAotCWRvdWJsZSBkYXRlID0gTWFrZURhdGUoR2V0WWVhcigpLGlNb250aCxHZXREYXkoKSxHZXRIb3VycygpLEdldE1pbnV0ZXMoKSxHZXRTZWNvbmRzKCksMCk7Ci0JSlNfVmFsdWVDb3B5KG1fcERhdGUsIEpTX05ld0RhdGUobV9pc29sYXRlLGRhdGUpKTsKLQorICByZXR1cm4gMDsKIH0KIAotaW50IENKU19EYXRlOjpHZXREYXkoKQotewotCWlmIChJc1ZhbGlkRGF0ZSgpKQotCQlyZXR1cm4gSlNfR2V0RGF5RnJvbVRpbWUoSlNfTG9jYWxUaW1lKEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wRGF0ZSkpKTsKLQotCXJldHVybiAwOwordm9pZCBDSlNfRGF0ZTo6U2V0U2Vjb25kcyhpbnQgc2Vjb25kcykgeworICBkb3VibGUgZGF0ZSA9IE1ha2VEYXRlKEdldFllYXIoKSwgR2V0TW9udGgoKSwgR2V0RGF5KCksIEdldEhvdXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TWludXRlcygpLCBzZWNvbmRzLCAwKTsKKyAgSlNfVmFsdWVDb3B5KG1fcERhdGUsIEpTX05ld0RhdGUobV9pc29sYXRlLCBkYXRlKSk7CiB9CiAKLXZvaWQgQ0pTX0RhdGU6OlNldERheShpbnQgaURheSkKLXsKLQotCWRvdWJsZSBkYXRlID0gTWFrZURhdGUoR2V0WWVhcigpLEdldE1vbnRoKCksaURheSxHZXRIb3VycygpLEdldE1pbnV0ZXMoKSxHZXRTZWNvbmRzKCksMCk7Ci0JSlNfVmFsdWVDb3B5KG1fcERhdGUsSlNfTmV3RGF0ZShtX2lzb2xhdGUsZGF0ZSkpOwotCitDSlNfRGF0ZTo6b3BlcmF0b3Igdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKSB7CisgIHJldHVybiBtX3BEYXRlOwogfQogCi1pbnQgQ0pTX0RhdGU6OkdldEhvdXJzKCkKLXsKLQlpZiAoSXNWYWxpZERhdGUoKSkKLQkJcmV0dXJuIEpTX0dldEhvdXJGcm9tVGltZShKU19Mb2NhbFRpbWUoSlNfVG9OdW1iZXIobV9pc29sYXRlLCBtX3BEYXRlKSkpOwotCi0JcmV0dXJuIDA7CitDSlNfRGF0ZTo6b3BlcmF0b3IgZG91YmxlKCkgY29uc3QgeworICBpZiAobV9wRGF0ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIDAuMDsKKyAgcmV0dXJuIEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wRGF0ZSk7CiB9CiAKLXZvaWQgQ0pTX0RhdGU6OlNldEhvdXJzKGludCBpSG91cnMpCi17Ci0JZG91YmxlIGRhdGUgPSBNYWtlRGF0ZShHZXRZZWFyKCksR2V0TW9udGgoKSxHZXREYXkoKSxpSG91cnMsR2V0TWludXRlcygpLEdldFNlY29uZHMoKSwwKTsKLQlKU19WYWx1ZUNvcHkobV9wRGF0ZSxKU19OZXdEYXRlKG1faXNvbGF0ZSxkYXRlKSk7Ci19Ci0KLWludCBDSlNfRGF0ZTo6R2V0TWludXRlcygpCi17Ci0JaWYgKElzVmFsaWREYXRlKCkpCi0JCXJldHVybiBKU19HZXRNaW5Gcm9tVGltZShKU19Mb2NhbFRpbWUoSlNfVG9OdW1iZXIobV9pc29sYXRlLCBtX3BEYXRlKSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQ0pTX0RhdGU6OlNldE1pbnV0ZXMoaW50IG1pbnV0ZXMpCi17Ci0JZG91YmxlIGRhdGUgPSBNYWtlRGF0ZShHZXRZZWFyKCksR2V0TW9udGgoKSxHZXREYXkoKSxHZXRIb3VycygpLG1pbnV0ZXMsR2V0U2Vjb25kcygpLDApOwotCUpTX1ZhbHVlQ29weShtX3BEYXRlLEpTX05ld0RhdGUobV9pc29sYXRlLGRhdGUpKTsKLX0KLQotaW50IENKU19EYXRlOjpHZXRTZWNvbmRzKCkKLXsKLQlpZiAoSXNWYWxpZERhdGUoKSkKLQkJcmV0dXJuIEpTX0dldFNlY0Zyb21UaW1lKEpTX0xvY2FsVGltZShKU19Ub051bWJlcihtX2lzb2xhdGUsIG1fcERhdGUpKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBDSlNfRGF0ZTo6U2V0U2Vjb25kcyhpbnQgc2Vjb25kcykKLXsKLQlkb3VibGUgZGF0ZSA9IE1ha2VEYXRlKEdldFllYXIoKSxHZXRNb250aCgpLEdldERheSgpLEdldEhvdXJzKCksR2V0TWludXRlcygpLHNlY29uZHMsMCk7Ci0JSlNfVmFsdWVDb3B5KG1fcERhdGUsSlNfTmV3RGF0ZShtX2lzb2xhdGUsZGF0ZSkpOwotfQotCi1DSlNfRGF0ZTo6b3BlcmF0b3Igdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKQotewotCXJldHVybiBtX3BEYXRlOwotfQotCi1DSlNfRGF0ZTo6b3BlcmF0b3IgZG91YmxlKCkgY29uc3QKLXsKLQlpZihtX3BEYXRlLklzRW1wdHkoKSkKLQkJcmV0dXJuIDAuMDsKLQlyZXR1cm4gSlNfVG9OdW1iZXIobV9pc29sYXRlLCBtX3BEYXRlKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0pTX0RhdGU6OlRvU3RyaW5nKCkgY29uc3QKLXsKLQlpZihtX3BEYXRlLklzRW1wdHkoKSkKLQkJcmV0dXJuIEwiIjsKLQlyZXR1cm4gSlNfVG9TdHJpbmcobV9pc29sYXRlLCBtX3BEYXRlKTsKK0NGWF9XaWRlU3RyaW5nIENKU19EYXRlOjpUb1N0cmluZygpIGNvbnN0IHsKKyAgaWYgKG1fcERhdGUuSXNFbXB0eSgpKQorICAgIHJldHVybiBMIiI7CisgIHJldHVybiBKU19Ub1N0cmluZyhtX2lzb2xhdGUsIG1fcERhdGUpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5jcHAKaW5kZXggYWJiOTVmMC4uOGQ3ZDIwNyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwCkBAIC0xOSwyMjU3ICsxOSwyMTI1IEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaCIKIAotc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElGWEpTX0NvbnRleHQqIGNjKQotewotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKK3N0YXRpYyB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZShJRlhKU19Db250ZXh0KiBjYykgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0gICAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAotICAgIHJldHVybiBwUnVudGltZS0+R2V0SXNvbGF0ZSgpOworICByZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKIH0KIAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX1B1YmxpY01ldGhvZHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19QdWJsaWNNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNkZWZpbmUgRE9VQkxFX0NPUlJFQ1QgIDAuMDAwMDAwMDAwMDAwMDAxCisjZGVmaW5lIERPVUJMRV9DT1JSRUNUIDAuMDAwMDAwMDAwMDAwMDAxCiAKIEJFR0lOX0pTX1NUQVRJQ19HTE9CQUxfRlVOKENKU19QdWJsaWNNZXRob2RzKQotICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0Zvcm1hdCkKLSAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9LZXlzdHJva2UpCi0gICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0Zvcm1hdCkKLSAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBlcmNlbnRfS2V5c3Ryb2tlKQotICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXRFeCkKLSAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfS2V5c3Ryb2tlRXgpCi0gICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdCkKLSAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfS2V5c3Ryb2tlKQotICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9Gb3JtYXRFeCkKLSAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlRXgpCi0gICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0Zvcm1hdCkKLSAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlKQotICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9Gb3JtYXQpCi0gICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTcGVjaWFsX0tleXN0cm9rZSkKLSAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlRXgpCi0gICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTaW1wbGUpCi0gICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNYWtlTnVtYmVyKQotICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlX0NhbGN1bGF0ZSkKLSAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlJhbmdlX1ZhbGlkYXRlKQotICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTWVyZ2VDaGFuZ2UpCi0gICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQYXJzZURhdGVFeCkKLSAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkV4dHJhY3ROdW1zKQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZOdW1iZXJfRm9ybWF0KQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZOdW1iZXJfS2V5c3Ryb2tlKQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0Zvcm1hdCkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUGVyY2VudF9LZXlzdHJva2UpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfRm9ybWF0RXgpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfS2V5c3Ryb2tlRXgpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfRm9ybWF0KQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0tleXN0cm9rZSkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9Gb3JtYXRFeCkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9LZXlzdHJva2VFeCkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9Gb3JtYXQpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlKQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTcGVjaWFsX0Zvcm1hdCkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9LZXlzdHJva2UpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlRXgpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNpbXBsZSkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTWFrZU51bWJlcikKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlX0NhbGN1bGF0ZSkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUmFuZ2VfVmFsaWRhdGUpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk1lcmdlQ2hhbmdlKQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQYXJzZURhdGVFeCkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRXh0cmFjdE51bXMpCiBFTkRfSlNfU1RBVElDX0dMT0JBTF9GVU4oKQogCiBJTVBMRU1FTlRfSlNfU1RBVElDX0dMT0JBTF9GVU4oQ0pTX1B1YmxpY01ldGhvZHMpCiAKLXN0YXRpYyBjb25zdCBGWF9XQ0hBUiogbW9udGhzW10gPQotewotICAgIEwiSmFuIiwgTCJGZWIiLCBMIk1hciIsIEwiQXByIiwgTCJNYXkiLCBMIkp1biIsIEwiSnVsIiwgTCJBdWciLCBMIlNlcCIsIEwiT2N0IiwgTCJOb3YiLCBMIkRlYyIKLX07CitzdGF0aWMgY29uc3QgRlhfV0NIQVIqIG1vbnRoc1tdID0ge0wiSmFuIiwgTCJGZWIiLCBMIk1hciIsIEwiQXByIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJNYXkiLCBMIkp1biIsIEwiSnVsIiwgTCJBdWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlNlcCIsIEwiT2N0IiwgTCJOb3YiLCBMIkRlYyJ9OwogCi1zdGF0aWMgY29uc3QgRlhfV0NIQVIqIGNvbnN0IGZ1bGxtb250aHNbXSA9Ci17Ci0gICAgTCJKYW51YXJ5IiwgTCJGZWJydWFyeSIsIEwiTWFyY2giLCBMIkFwcmlsIiwgTCJNYXkiLCBMIkp1bmUiLCBMIkp1bHkiLCBMIkF1Z3VzdCIsIEwiU2VwdGVtYmVyIiwgTCJPY3RvYmVyIiwgTCJOb3ZlbWJlciIsIEwiRGVjZW1iZXIiCi19Oworc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBjb25zdCBmdWxsbW9udGhzW10gPSB7CisgICAgTCJKYW51YXJ5IiwgICBMIkZlYnJ1YXJ5IiwgTCJNYXJjaCIsICAgIEwiQXByaWwiLAorICAgIEwiTWF5IiwgICAgICAgTCJKdW5lIiwgICAgIEwiSnVseSIsICAgICBMIkF1Z3VzdCIsCisgICAgTCJTZXB0ZW1iZXIiLCBMIk9jdG9iZXIiLCAgTCJOb3ZlbWJlciIsIEwiRGVjZW1iZXIifTsKIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN0cmluZykKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBzVHJpbSA9IFN0clRyaW0oc3RyaW5nKTsKLSAgICBjb25zdCBGWF9XQ0hBUiogcFRyaW0gPSBzVHJpbS5jX3N0cigpOwotICAgIGNvbnN0IEZYX1dDSEFSKiBwID0gcFRyaW07CitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc051bWJlcihjb25zdCBGWF9XQ0hBUiogc3RyaW5nKSB7CisgIENGWF9XaWRlU3RyaW5nIHNUcmltID0gU3RyVHJpbShzdHJpbmcpOworICBjb25zdCBGWF9XQ0hBUiogcFRyaW0gPSBzVHJpbS5jX3N0cigpOworICBjb25zdCBGWF9XQ0hBUiogcCA9IHBUcmltOwogCisgIEZYX0JPT0wgYkRvdCA9IEZBTFNFOworICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CiAKLSAgICBGWF9CT09MIGJEb3QgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CisgIHdjaGFyX3QgYzsKKyAgd2hpbGUgKChjID0gKnApKSB7CisgICAgaWYgKGMgPT0gJy4nIHx8IGMgPT0gJywnKSB7CisgICAgICBpZiAoYkRvdCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYkRvdCA9IFRSVUU7CisgICAgfSBlbHNlIGlmIChjID09ICctJyB8fCBjID09ICcrJykgeworICAgICAgaWYgKHAgIT0gcFRyaW0pCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IGVsc2UgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKSB7CisgICAgICBpZiAoYktYSlMpCisgICAgICAgIHJldHVybiBGQUxTRTsKIAotICAgIHdjaGFyX3QgYzsKLSAgICB3aGlsZSAoKGMgPSAqcCkpCi0gICAgewotICAgICAgICBpZiAoYyA9PSAnLicgfHwgYyA9PSAnLCcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiRG90KSByZXR1cm4gRkFMU0U7CisgICAgICBwKys7CisgICAgICBjID0gKnA7CisgICAgICBpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpIHsKKyAgICAgICAgYktYSlMgPSBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIUlzRGlnaXQoYykpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcCsrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzRGlnaXQod2NoYXJfdCBjaCkgeworICByZXR1cm4gKGNoID49IEwnMCcgJiYgY2ggPD0gTCc5Jyk7Cit9CisKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzRGlnaXQoY2hhciBjaCkgeworICByZXR1cm4gKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOworfQorCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0FscGhhYmV0aWMod2NoYXJfdCBjaCkgeworICByZXR1cm4gKChjaCA+PSBMJ2EnICYmIGNoIDw9IEwneicpIHx8IChjaCA+PSBMJ0EnICYmIGNoIDw9IEwnWicpKTsKK30KKworRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNBbHBoYU51bWVyaWMod2NoYXJfdCBjaCkgeworICByZXR1cm4gKElzRGlnaXQoY2gpIHx8IElzQWxwaGFiZXRpYyhjaCkpOworfQorCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjptYXNrU2F0aXNmaWVkKHdjaGFyX3QgY19DaGFuZ2UsIHdjaGFyX3QgY19NYXNrKSB7CisgIHN3aXRjaCAoY19NYXNrKSB7CisgICAgY2FzZSBMJzknOgorICAgICAgcmV0dXJuIElzRGlnaXQoY19DaGFuZ2UpOworICAgIGNhc2UgTCdBJzoKKyAgICAgIHJldHVybiBJc0FscGhhYmV0aWMoY19DaGFuZ2UpOworICAgIGNhc2UgTCdPJzoKKyAgICAgIHJldHVybiBJc0FscGhhTnVtZXJpYyhjX0NoYW5nZSk7CisgICAgY2FzZSBMJ1gnOgorICAgICAgcmV0dXJuIFRSVUU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoY19DaGFuZ2UgPT0gY19NYXNrKTsKKyAgfQorfQorCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjppc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCkgeworICByZXR1cm4gY2ggPT0gTCc5JyB8fCBjaCA9PSBMJ0EnIHx8IGNoID09IEwnTycgfHwgY2ggPT0gTCdYJzsKK30KKworZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpBRl9TaW1wbGUoY29uc3QgRlhfV0NIQVIqIHNGdWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFZhbHVlMikgeworICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJBVkciKSA9PSAwIHx8CisgICAgICBGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIlNVTSIpID09IDApIHsKKyAgICByZXR1cm4gZFZhbHVlMSArIGRWYWx1ZTI7CisgIH0KKyAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiUFJEIikgPT0gMCkgeworICAgIHJldHVybiBkVmFsdWUxICogZFZhbHVlMjsKKyAgfQorICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJNSU4iKSA9PSAwKSB7CisgICAgcmV0dXJuIEZYX01JTihkVmFsdWUxLCBkVmFsdWUyKTsKKyAgfQorICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJNQVgiKSA9PSAwKSB7CisgICAgcmV0dXJuIEZYX01BWChkVmFsdWUxLCBkVmFsdWUyKTsKKyAgfQorICByZXR1cm4gZFZhbHVlMTsKK30KKworQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0ckxUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKSB7CisgIHdoaWxlICgqcFN0ciAmJiAqcFN0ciA9PSBMJyAnKQorICAgIHBTdHIrKzsKKworICByZXR1cm4gcFN0cjsKK30KKworQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKSB7CisgIGNvbnN0IEZYX1dDSEFSKiBwID0gcFN0cjsKKyAgd2hpbGUgKCpwKQorICAgIHArKzsKKyAgd2hpbGUgKHAgPiBwU3RyICYmICoocCAtIDEpID09IEwnICcpCisgICAgcC0tOworCisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhwU3RyLCBwIC0gcFN0cik7Cit9CisKK0NGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKSB7CisgIHJldHVybiBTdHJSVHJpbShTdHJMVHJpbShwU3RyKS5jX3N0cigpKTsKK30KKworQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0ckxUcmltKGNvbnN0IEZYX0NIQVIqIHBTdHIpIHsKKyAgd2hpbGUgKCpwU3RyICYmICpwU3RyID09ICcgJykKKyAgICBwU3RyKys7CisKKyAgcmV0dXJuIHBTdHI7Cit9CisKK0NGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJSVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKSB7CisgIGNvbnN0IEZYX0NIQVIqIHAgPSBwU3RyOworICB3aGlsZSAoKnApCisgICAgcCsrOworICB3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykKKyAgICBwLS07CisKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHBTdHIsIHAgLSBwU3RyKTsKK30KKworQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cikgeworICByZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikpOworfQorCitkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkFsbERpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkRvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlNpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJLWEpTKSB7CisgIGJEb3QgPSBGQUxTRTsKKyAgYlNpZ24gPSBGQUxTRTsKKyAgYktYSlMgPSBGQUxTRTsKKworICBGWF9CT09MIGJEaWdpdEV4aXN0ID0gRkFMU0U7CisKKyAgY29uc3QgRlhfV0NIQVIqIHAgPSBzd1NvdXJjZTsKKyAgd2NoYXJfdCBjOworCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBOVUxMOworICBjb25zdCBGWF9XQ0hBUiogcEVuZCA9IE5VTEw7CisKKyAgd2hpbGUgKChjID0gKnApKSB7CisgICAgaWYgKCFwU3RhcnQgJiYgYyAhPSBMJyAnKSB7CisgICAgICBwU3RhcnQgPSBwOworICAgIH0KKworICAgIHBFbmQgPSBwOworICAgIHArKzsKKyAgfQorCisgIGlmICghcFN0YXJ0KSB7CisgICAgYkFsbERpZ2l0cyA9IEZBTFNFOworICAgIHJldHVybiAwOworICB9CisKKyAgd2hpbGUgKHBFbmQgIT0gcFN0YXJ0KSB7CisgICAgaWYgKCpwRW5kID09IEwnICcpCisgICAgICBwRW5kLS07CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKworICBkb3VibGUgZFJldCA9IDA7CisgIHAgPSBwU3RhcnQ7CisgIGJBbGxEaWdpdHMgPSBUUlVFOworICBDRlhfV2lkZVN0cmluZyBzd0RpZ2l0czsKKworICB3aGlsZSAocCA8PSBwRW5kKSB7CisgICAgYyA9ICpwOworCisgICAgaWYgKElzRGlnaXQoYykpIHsKKyAgICAgIHN3RGlnaXRzICs9IGM7CisgICAgICBiRGlnaXRFeGlzdCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlIEwnICc6CisgICAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEwnLic6CisgICAgICAgIGNhc2UgTCcsJzoKKyAgICAgICAgICBpZiAoIWJEb3QpIHsKKyAgICAgICAgICAgIGlmIChiRGlnaXRFeGlzdCkgeworICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJy4nOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcwJzsKKyAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcuJzsKKyAgICAgICAgICAgICAgYkRpZ2l0RXhpc3QgPSBUUlVFOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBiRG90ID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjID09ICctJyB8fCBjID09ICcrJykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHAgIT0gcFRyaW0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYktYSlMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICBpZiAoIWJLWEpTKSB7CiAgICAgICAgICAgICBwKys7CiAgICAgICAgICAgICBjID0gKnA7Ci0gICAgICAgICAgICBpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYktYSlMgPSBUUlVFOworICAgICAgICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKSB7CisgICAgICAgICAgICAgIGJLWEpTID0gVFJVRTsKKyAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gJ2UnOworICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBjOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghSXNEaWdpdChjKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHArKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdCh3Y2hhcl90IGNoKQotewotICAgIHJldHVybiAoY2ggPj0gTCcwJyAmJiBjaCA8PSBMJzknKTsKLX0KLQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKQotewotICAgIHJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7Ci19Ci0KLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKQotewotICAgIHJldHVybiAoKGNoID49IEwnYScgJiYgY2ggPD0gTCd6JykgfHwgKGNoID49IEwnQScgJiYgY2ggPD0gTCdaJykpOwotfQotCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0FscGhhTnVtZXJpYyh3Y2hhcl90IGNoKQotewotICAgIHJldHVybiAoSXNEaWdpdChjaCkgfHwgSXNBbHBoYWJldGljKGNoKSk7Ci19Ci0KLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzaykKLXsKLSAgICBzd2l0Y2ggKGNfTWFzaykKLSAgICB7Ci0gICAgY2FzZSBMJzknOgotICAgICAgICByZXR1cm4gSXNEaWdpdChjX0NoYW5nZSk7Ci0gICAgY2FzZSBMJ0EnOgotICAgICAgICByZXR1cm4gSXNBbHBoYWJldGljKGNfQ2hhbmdlKTsKLSAgICBjYXNlIEwnTyc6Ci0gICAgICAgIHJldHVybiBJc0FscGhhTnVtZXJpYyhjX0NoYW5nZSk7Ci0gICAgY2FzZSBMJ1gnOgotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gKGNfQ2hhbmdlID09IGNfTWFzayk7Ci0gICAgfQotfQotCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjppc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCkKLXsKLSAgICByZXR1cm4gY2ggPT0gTCc5JyB8fCBjaCA9PSBMJ0EnIHx8IGNoID09IEwnTycgfHwgY2ggPT0gTCdYJzsKLX0KLQotZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpBRl9TaW1wbGUoY29uc3QgRlhfV0NIQVIqIHNGdWN0aW9uLCBkb3VibGUgZFZhbHVlMSwgZG91YmxlIGRWYWx1ZTIpCi17Ci0gICAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJBVkciKSA9PSAwIHx8IEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJTVU0iKSA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRWYWx1ZTEgKyBkVmFsdWUyOwotICAgIH0KLSAgICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJQUkQiKSA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRWYWx1ZTEgKiBkVmFsdWUyOwotICAgIH0KLSAgICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIk1JTiIpID09IDApCi0gICAgewotICAgICAgICByZXR1cm4gRlhfTUlOKGRWYWx1ZTEsIGRWYWx1ZTIpOwotICAgIH0KLSAgICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIk1BWCIpID09IDApCi0gICAgewotICAgICAgICByZXR1cm4gRlhfTUFYKGRWYWx1ZTEsIGRWYWx1ZTIpOwotICAgIH0KLSAgICByZXR1cm4gZFZhbHVlMTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0ckxUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKQotewotICAgIHdoaWxlICgqcFN0ciAmJiAqcFN0ciA9PSBMJyAnKSBwU3RyKys7Ci0KLSAgICByZXR1cm4gcFN0cjsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKQotewotICAgIGNvbnN0IEZYX1dDSEFSKiBwID0gcFN0cjsKLSAgICB3aGlsZSAoKnApIHArKzsKLSAgICB3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykgcC0tOwotCi0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHBTdHIsIHAgLSBwU3RyKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clRyaW0oY29uc3QgRlhfV0NIQVIqIHBTdHIpCi17Ci0gICAgcmV0dXJuIFN0clJUcmltKFN0ckxUcmltKHBTdHIpLmNfc3RyKCkpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyTFRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cikKLXsKLSAgICB3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gJyAnKSBwU3RyKys7Ci0KLSAgICAgICAgcmV0dXJuIHBTdHI7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJSVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKQotewotICAgIGNvbnN0IEZYX0NIQVIqIHAgPSBwU3RyOwotICAgIHdoaWxlICgqcCkgcCsrOwotICAgIHdoaWxlIChwID4gcFN0ciAmJiAqKHAgLSAxKSA9PSBMJyAnKSBwLS07Ci0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcocFN0cixwLXBTdHIpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKQotewotICAgIHJldHVybiBTdHJSVHJpbShTdHJMVHJpbShwU3RyKSk7Ci19Ci0KLWRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBGWF9CT09MJiBiQWxsRGlnaXRzLCBGWF9CT09MJiBiRG90LCBGWF9CT09MJiBiU2lnbiwgRlhfQk9PTCYgYktYSlMpCi17Ci0gICAgYkRvdCA9IEZBTFNFOwotICAgIGJTaWduID0gRkFMU0U7Ci0gICAgYktYSlMgPSBGQUxTRTsKLQotICAgIEZYX0JPT0wgYkRpZ2l0RXhpc3QgPSBGQUxTRTsKLQotICAgIGNvbnN0IEZYX1dDSEFSKiBwID0gc3dTb3VyY2U7Ci0gICAgd2NoYXJfdCBjOwotCi0gICAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IE5VTEw7Ci0gICAgY29uc3QgRlhfV0NIQVIqIHBFbmQgPSBOVUxMOwotCi0gICAgd2hpbGUgKChjID0gKnApKQotICAgIHsKLSAgICAgICAgaWYgKCFwU3RhcnQgJiYgYyAhPSBMJyAnKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3RhcnQgPSBwOwotICAgICAgICB9Ci0KLSAgICAgICAgcEVuZCA9IHA7Ci0gICAgICAgIHArKzsKLSAgICB9Ci0KLSAgICBpZiAoIXBTdGFydCkKLSAgICB7Ci0gICAgICAgIGJBbGxEaWdpdHMgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgd2hpbGUgKHBFbmQgIT0gcFN0YXJ0KQotICAgIHsKLSAgICAgICAgaWYgKCpwRW5kID09IEwnICcpCi0gICAgICAgICAgICBwRW5kIC0tOwotICAgICAgICBlbHNlCiAgICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkb3VibGUgZFJldCA9IDA7Ci0gICAgcCA9IHBTdGFydDsKLSAgICBiQWxsRGlnaXRzID0gVFJVRTsKLSAgICBDRlhfV2lkZVN0cmluZyBzd0RpZ2l0czsKLQotICAgIHdoaWxlIChwIDw9IHBFbmQpCi0gICAgewotICAgICAgICBjID0gKnA7Ci0KLSAgICAgICAgaWYgKElzRGlnaXQoYykpCi0gICAgICAgIHsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgTCctJzoKKyAgICAgICAgICBpZiAoIWJEaWdpdEV4aXN0ICYmICFiU2lnbikgewogICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKLSAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTCcgJzoKLSAgICAgICAgICAgICAgICBiQWxsRGlnaXRzID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEwnLic6Ci0gICAgICAgICAgICBjYXNlIEwnLCc6Ci0gICAgICAgICAgICAgICAgaWYgKCFiRG90KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJEaWdpdEV4aXN0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJy4nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBiRG90ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAnZSc6Ci0gICAgICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgICAgICAgICBpZiAoIWJLWEpTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcCsrOwotICAgICAgICAgICAgICAgICAgICBjID0gKnA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcrJyB8fCBjID09ICctJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYktYSlMgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gJ2UnOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEwnLSc6Ci0gICAgICAgICAgICAgICAgaWYgKCFiRGlnaXRFeGlzdCAmJiAhYlNpZ24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBjOwotICAgICAgICAgICAgICAgICAgICBiU2lnbiA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOwotCi0gICAgICAgICAgICAgICAgaWYgKHAgIT0gcFN0YXJ0ICYmICFiRG90ICYmIGJEaWdpdEV4aXN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcuJzsKLSAgICAgICAgICAgICAgICAgICAgYkRvdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJEb3QgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYkRpZ2l0RXhpc3QgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgPSBMIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcCsrOwotICAgIH0KLQotICAgIGlmIChzd0RpZ2l0cy5HZXRMZW5ndGgoKSA+IDAgJiYgc3dEaWdpdHMuR2V0TGVuZ3RoKCkgPCAxNykKLSAgICB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHNEaWdpdHMgPSBzd0RpZ2l0cy5VVEY4RW5jb2RlKCk7Ci0KLSAgICAgICAgaWYgKGJLWEpTKQotICAgICAgICB7Ci0gICAgICAgICAgICBkUmV0ID0gYXRvZihzRGlnaXRzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiRG90KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIqIHBTdG9wU3RyaW5nOwotICAgICAgICAgICAgICAgIGRSZXQgPSA6OnN0cnRvZChzRGlnaXRzLCAmcFN0b3BTdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRSZXQgPSBhdG9sKHNEaWdpdHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gZFJldDsKLX0KLQotZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ1RvTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSkKLXsKLSAgICBGWF9CT09MIGJBbGxEaWdpdHMgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJEb3QgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJTaWduID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwotCi0gICAgcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwotfQotCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBkb3VibGUgJiBkUmV0LCBGWF9CT09MICYgYkRvdCkKLXsKLSAgICBGWF9CT09MIGJBbGxEaWdpdHMgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJTaWduID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwotCi0gICAgZFJldCA9IFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwotCi0gICAgcmV0dXJuIGJBbGxEaWdpdHM7Ci19Ci0KLUNKU19BcnJheSBDSlNfUHVibGljTWV0aG9kczo6QUZfTWFrZUFycmF5RnJvbUxpc3Qodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19WYWx1ZSB2YWwpCi17Ci0gICAgQ0pTX0FycmF5IFN0ckFycmF5KGlzb2xhdGUpOwotICAgIGlmKHZhbC5Jc0FycmF5T2JqZWN0KCkpCi0gICAgewotICAgICAgICB2YWwuQ29udmVydFRvQXJyYXkoU3RyQXJyYXkpOwotICAgICAgICByZXR1cm4gU3RyQXJyYXk7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHdzU3RyID0gdmFsLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgIENGWF9CeXRlU3RyaW5nIHQgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUod3NTdHIpOwotICAgIGNvbnN0IGNoYXIgKiBwID0gKGNvbnN0IGNoYXIgKil0OwotCi0KLSAgICBpbnQgY2ggPSAnLCcgOwotICAgIGludCBuSW5kZXggPSAwOwotCi0gICAgd2hpbGUgKCpwKQotICAgIHsKLSAgICAgICAgY29uc3QgY2hhciAqIHBUZW1wID0gc3RyY2hyKHAsIGNoKTsKLSAgICAgICAgaWYgKHBUZW1wID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgU3RyVHJpbShwKS5jX3N0cigpKSk7CisgICAgICAgICAgICBiU2lnbiA9IFRSVUU7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgKiBwU3ViID0gbmV3IGNoYXJbcFRlbXAgLSBwICsgMV07Ci0gICAgICAgICAgICBzdHJuY3B5KHBTdWIsIHAsIHBUZW1wIC0gcCk7Ci0gICAgICAgICAgICAqKHBTdWIgKyAocFRlbXAgLSBwKSkgPSAnXDAnOworICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBiQWxsRGlnaXRzID0gRkFMU0U7CiAKLSAgICAgICAgICAgIFN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgU3RyVHJpbShwU3ViKS5jX3N0cigpKSk7Ci0gICAgICAgICAgICBkZWxldGUgW11wU3ViOwotCi0gICAgICAgICAgICBuSW5kZXggKys7Ci0gICAgICAgICAgICBwID0gKytwVGVtcDsKLSAgICAgICAgfQotCisgICAgICAgICAgaWYgKHAgIT0gcFN0YXJ0ICYmICFiRG90ICYmIGJEaWdpdEV4aXN0KSB7CisgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJy4nOworICAgICAgICAgICAgYkRvdCA9IFRSVUU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJEb3QgPSBGQUxTRTsKKyAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gRkFMU0U7CisgICAgICAgICAgICBzd0RpZ2l0cyA9IEwiIjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQorCisgICAgcCsrOworICB9CisKKyAgaWYgKHN3RGlnaXRzLkdldExlbmd0aCgpID4gMCAmJiBzd0RpZ2l0cy5HZXRMZW5ndGgoKSA8IDE3KSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc0RpZ2l0cyA9IHN3RGlnaXRzLlVURjhFbmNvZGUoKTsKKworICAgIGlmIChiS1hKUykgeworICAgICAgZFJldCA9IGF0b2Yoc0RpZ2l0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChiRG90KSB7CisgICAgICAgIGNoYXIqIHBTdG9wU3RyaW5nOworICAgICAgICBkUmV0ID0gOjpzdHJ0b2Qoc0RpZ2l0cywgJnBTdG9wU3RyaW5nKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRSZXQgPSBhdG9sKHNEaWdpdHMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBkUmV0OworfQorCitkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlKSB7CisgIEZYX0JPT0wgYkFsbERpZ2l0cyA9IEZBTFNFOworICBGWF9CT09MIGJEb3QgPSBGQUxTRTsKKyAgRlhfQk9PTCBiU2lnbiA9IEZBTFNFOworICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CisKKyAgcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOworfQorCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSYgZFJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRG90KSB7CisgIEZYX0JPT0wgYkFsbERpZ2l0cyA9IEZBTFNFOworICBGWF9CT09MIGJTaWduID0gRkFMU0U7CisgIEZYX0JPT0wgYktYSlMgPSBGQUxTRTsKKworICBkUmV0ID0gUGFyc2VOdW1iZXIoc3dTb3VyY2UsIGJBbGxEaWdpdHMsIGJEb3QsIGJTaWduLCBiS1hKUyk7CisKKyAgcmV0dXJuIGJBbGxEaWdpdHM7Cit9CisKK0NKU19BcnJheSBDSlNfUHVibGljTWV0aG9kczo6QUZfTWFrZUFycmF5RnJvbUxpc3Qodjg6Oklzb2xhdGUqIGlzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSB2YWwpIHsKKyAgQ0pTX0FycmF5IFN0ckFycmF5KGlzb2xhdGUpOworICBpZiAodmFsLklzQXJyYXlPYmplY3QoKSkgeworICAgIHZhbC5Db252ZXJ0VG9BcnJheShTdHJBcnJheSk7CiAgICAgcmV0dXJuIFN0ckFycmF5OworICB9CisgIENGWF9XaWRlU3RyaW5nIHdzU3RyID0gdmFsLlRvQ0ZYV2lkZVN0cmluZygpOworICBDRlhfQnl0ZVN0cmluZyB0ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzU3RyKTsKKyAgY29uc3QgY2hhciogcCA9IChjb25zdCBjaGFyKil0OworCisgIGludCBjaCA9ICcsJzsKKyAgaW50IG5JbmRleCA9IDA7CisKKyAgd2hpbGUgKCpwKSB7CisgICAgY29uc3QgY2hhciogcFRlbXAgPSBzdHJjaHIocCwgY2gpOworICAgIGlmIChwVGVtcCA9PSBOVUxMKSB7CisgICAgICBTdHJBcnJheS5TZXRFbGVtZW50KG5JbmRleCwgQ0pTX1ZhbHVlKGlzb2xhdGUsIFN0clRyaW0ocCkuY19zdHIoKSkpOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGNoYXIqIHBTdWIgPSBuZXcgY2hhcltwVGVtcCAtIHAgKyAxXTsKKyAgICAgIHN0cm5jcHkocFN1YiwgcCwgcFRlbXAgLSBwKTsKKyAgICAgICoocFN1YiArIChwVGVtcCAtIHApKSA9ICdcMCc7CisKKyAgICAgIFN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgU3RyVHJpbShwU3ViKS5jX3N0cigpKSk7CisgICAgICBkZWxldGVbXSBwU3ViOworCisgICAgICBuSW5kZXgrKzsKKyAgICAgIHAgPSArK3BUZW1wOworICAgIH0KKyAgfQorICByZXR1cm4gU3RyQXJyYXk7CiB9CiAKLWludCBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdJbnRlZ2VyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcsaW50IG5TdGFydCxpbnQmIG5Ta2lwLCBpbnQgbk1heFN0ZXApCi17Ci0gICAgaW50IG5SZXQgPSAwOwotICAgIG5Ta2lwID0gMDsKLSAgICBmb3IgKGludCBpPW5TdGFydCwgc3o9c3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChpLW5TdGFydCA+IDEwKQotICAgICAgICAgICAgYnJlYWs7CitpbnQgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nSW50ZWdlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgblNraXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk1heFN0ZXApIHsKKyAgaW50IG5SZXQgPSAwOworICBuU2tpcCA9IDA7CisgIGZvciAoaW50IGkgPSBuU3RhcnQsIHN6ID0gc3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChpIC0gblN0YXJ0ID4gMTApCisgICAgICBicmVhazsKIAotICAgICAgICBGWF9XQ0hBUiBjID0gc3RyaW5nLkdldEF0KGkpOwotICAgICAgICBpZiAoSXNEaWdpdCgod2NoYXJfdCljKSkKLSAgICAgICAgewotICAgICAgICAgICAgblJldCA9IG5SZXQgKiAxMCArIChjIC0gJzAnKTsKLSAgICAgICAgICAgIG5Ta2lwID0gaSAtIG5TdGFydCArIDE7Ci0gICAgICAgICAgICBpZiAoblNraXAgPj0gbk1heFN0ZXApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgIEZYX1dDSEFSIGMgPSBzdHJpbmcuR2V0QXQoaSk7CisgICAgaWYgKElzRGlnaXQoKHdjaGFyX3QpYykpIHsKKyAgICAgIG5SZXQgPSBuUmV0ICogMTAgKyAoYyAtICcwJyk7CisgICAgICBuU2tpcCA9IGkgLSBuU3RhcnQgKyAxOworICAgICAgaWYgKG5Ta2lwID49IG5NYXhTdGVwKQorICAgICAgICBicmVhazsKKyAgICB9IGVsc2UKKyAgICAgIGJyZWFrOworICB9CiAKLSAgICByZXR1cm4gblJldDsKKyAgcmV0dXJuIG5SZXQ7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ1N0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nLCBpbnQgblN0YXJ0LCBpbnQmIG5Ta2lwKQotewotICAgIENGWF9XaWRlU3RyaW5nIHN3UmV0OwotICAgIG5Ta2lwID0gMDsKLSAgICBmb3IgKGludCBpPW5TdGFydCwgc3o9c3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykKLSAgICB7Ci0gICAgICAgIEZYX1dDSEFSIGMgPSBzdHJpbmcuR2V0QXQoaSk7Ci0gICAgICAgIGlmICgoYyA+PSBMJ2EnICYmIGMgPD0gTCd6JykgfHwgKGMgPj0gTCdBJyAmJiBjIDw9IEwnWicpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd1JldCArPSBjOwotICAgICAgICAgICAgblNraXAgPSBpIC0gblN0YXJ0ICsgMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBicmVhazsKLSAgICB9CitDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdTdHJpbmcoCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywKKyAgICBpbnQgblN0YXJ0LAorICAgIGludCYgblNraXApIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7CisgIG5Ta2lwID0gMDsKKyAgZm9yIChpbnQgaSA9IG5TdGFydCwgc3ogPSBzdHJpbmcuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7CisgICAgRlhfV0NIQVIgYyA9IHN0cmluZy5HZXRBdChpKTsKKyAgICBpZiAoKGMgPj0gTCdhJyAmJiBjIDw9IEwneicpIHx8IChjID49IEwnQScgJiYgYyA8PSBMJ1onKSkgeworICAgICAgc3dSZXQgKz0gYzsKKyAgICAgIG5Ta2lwID0gaSAtIG5TdGFydCArIDE7CisgICAgfSBlbHNlCisgICAgICBicmVhazsKKyAgfQogCi0gICAgcmV0dXJuIHN3UmV0OworICByZXR1cm4gc3dSZXQ7CiB9CiAKLWRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VOb3JtYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIEZYX0JPT0wmIGJXcm9uZ0Zvcm1hdCkKLXsKLSAgICBkb3VibGUgZHQgPSBKU19HZXREYXRlVGltZSgpOworZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU5vcm1hbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYldyb25nRm9ybWF0KSB7CisgIGRvdWJsZSBkdCA9IEpTX0dldERhdGVUaW1lKCk7CiAKLSAgICBpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOwotICAgIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7Ci0gICAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7Ci0gICAgaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKLSAgICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKLSAgICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKKyAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsKKyAgaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZHQpICsgMTsKKyAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7CisgIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7CisgIGludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZHQpOworICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKIAotICAgIGludCBudW1iZXJbM107CisgIGludCBudW1iZXJbM107CiAKLSAgICBpbnQgblNraXAgPSAwOwotICAgIGludCBuTGVuID0gdmFsdWUuR2V0TGVuZ3RoKCk7Ci0gICAgaW50IG5JbmRleCA9IDA7Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChpIDwgbkxlbikKLSAgICB7Ci0gICAgICAgIGlmIChuSW5kZXggPiAyKSBicmVhazsKKyAgaW50IG5Ta2lwID0gMDsKKyAgaW50IG5MZW4gPSB2YWx1ZS5HZXRMZW5ndGgoKTsKKyAgaW50IG5JbmRleCA9IDA7CisgIGludCBpID0gMDsKKyAgd2hpbGUgKGkgPCBuTGVuKSB7CisgICAgaWYgKG5JbmRleCA+IDIpCisgICAgICBicmVhazsKIAotICAgICAgICBGWF9XQ0hBUiBjID0gdmFsdWUuR2V0QXQoaSk7Ci0gICAgICAgIGlmIChJc0RpZ2l0KCh3Y2hhcl90KWMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBudW1iZXJbbkluZGV4KytdID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBpLCBuU2tpcCwgNCk7Ci0gICAgICAgICAgICBpICs9IG5Ta2lwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaSArKzsKLSAgICAgICAgfQorICAgIEZYX1dDSEFSIGMgPSB2YWx1ZS5HZXRBdChpKTsKKyAgICBpZiAoSXNEaWdpdCgod2NoYXJfdCljKSkgeworICAgICAgbnVtYmVyW25JbmRleCsrXSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaSwgblNraXAsIDQpOworICAgICAgaSArPSBuU2tpcDsKKyAgICB9IGVsc2UgeworICAgICAgaSsrOworICAgIH0KKyAgfQorCisgIGlmIChuSW5kZXggPT0gMikgeworICAgIC8vIGNhc2UyOiBtb250aC9kYXkKKyAgICAvLyBjYXNlMzogZGF5L21vbnRoCisgICAgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMTIpICYmCisgICAgICAgIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMzEpKSB7CisgICAgICBuTW9udGggPSBudW1iZXJbMF07CisgICAgICBuRGF5ID0gbnVtYmVyWzFdOworICAgIH0gZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYKKyAgICAgICAgICAgICAgIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpKSB7CisgICAgICBuRGF5ID0gbnVtYmVyWzBdOworICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOwogICAgIH0KIAotICAgIGlmIChuSW5kZXggPT0gMikKLSAgICB7Ci0gICAgICAgIC8vIGNhc2UyOiBtb250aC9kYXkKLSAgICAgICAgLy8gY2FzZTM6IGRheS9tb250aAotICAgICAgICBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5Nb250aCA9IG51bWJlclswXTsKLSAgICAgICAgICAgIG5EYXkgPSBudW1iZXJbMV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5EYXkgPSBudW1iZXJbMF07Ci0gICAgICAgICAgICBuTW9udGggPSBudW1iZXJbMV07Ci0gICAgICAgIH0KLQotICAgICAgICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobkluZGV4ID09IDMpCi0gICAgewotICAgICAgICAvLyBjYXNlMTogeWVhci9tb250aC9kYXkKLSAgICAgICAgLy8gY2FzZTI6IG1vbnRoL2RheS95ZWFyCi0gICAgICAgIC8vIGNhc2UzOiBkYXkvbW9udGgveWVhcgotCi0gICAgICAgIGlmIChudW1iZXJbMF0gPiAxMiAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSAmJiAobnVtYmVyWzJdID49IDEgJiYgbnVtYmVyWzJdIDw9IDMxKSkKLSAgICAgICAgewotICAgICAgICAgICAgblllYXIgPSBudW1iZXJbMF07Ci0gICAgICAgICAgICBuTW9udGggPSBudW1iZXJbMV07Ci0gICAgICAgICAgICBuRGF5ID0gbnVtYmVyWzJdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMTIpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMzEpICYmIG51bWJlclsyXSA+IDMxKQotICAgICAgICB7Ci0gICAgICAgICAgICBuTW9udGggPSBudW1iZXJbMF07Ci0gICAgICAgICAgICBuRGF5ID0gbnVtYmVyWzFdOwotICAgICAgICAgICAgblllYXIgPSBudW1iZXJbMl07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYgbnVtYmVyWzJdID4gMzEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5EYXkgPSBudW1iZXJbMF07Ci0gICAgICAgICAgICBuTW9udGggPSBudW1iZXJbMV07Ci0gICAgICAgICAgICBuWWVhciA9IG51bWJlclsyXTsKLSAgICAgICAgfQotCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwotICAgICAgICByZXR1cm4gZHQ7Ci0gICAgfQotCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wOwotICAgIHN3VGVtcC5Gb3JtYXQoTCIlZC8lZC8lZCAlZDolZDolZCIsbk1vbnRoLG5EYXksblllYXIsbkhvdXIsbk1pbixuU2VjKTsKLSAgICByZXR1cm4gSlNfRGF0ZVBhcnNlKHN3VGVtcC5jX3N0cigpKTsKLX0KLQotZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBmb3JtYXQsIEZYX0JPT0wmIGJXcm9uZ0Zvcm1hdCkKLXsKLSAgICBkb3VibGUgZHQgPSBKU19HZXREYXRlVGltZSgpOwotCi0gICAgaWYgKGZvcm1hdC5Jc0VtcHR5KCkgfHwgdmFsdWUuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZHQ7Ci0KLSAgICBpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOwotICAgIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7Ci0gICAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7Ci0gICAgaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKLSAgICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKLSAgICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKLQotICAgIGludCBuWWVhclN1YiA9IDk5OyAvL25ZZWFyIC0gMjAwMDsKLQotICAgIEZYX0JPT0wgYlBtID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwogICAgIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOworICB9IGVsc2UgaWYgKG5JbmRleCA9PSAzKSB7CisgICAgLy8gY2FzZTE6IHllYXIvbW9udGgvZGF5CisgICAgLy8gY2FzZTI6IG1vbnRoL2RheS95ZWFyCisgICAgLy8gY2FzZTM6IGRheS9tb250aC95ZWFyCiAKLSAgICBpbnQgaT0wOwotICAgIGludCBqPTA7Ci0KLSAgICB3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkKLSAgICB7Ci0gICAgICAgIGlmIChiRXhpdCkgYnJlYWs7Ci0KLSAgICAgICAgRlhfV0NIQVIgYyA9IGZvcm1hdC5HZXRBdChpKTsKLSAgICAgICAgc3dpdGNoIChjKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICc6JzoKLSAgICAgICAgICAgIGNhc2UgJy4nOgotICAgICAgICAgICAgY2FzZSAnLSc6Ci0gICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICBjYXNlICcvJzoKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlICd5JzoKLSAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICBjYXNlICdIJzoKLSAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgY2FzZSAnTSc6Ci0gICAgICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9sZGogPSBqOwotICAgICAgICAgICAgICAgICAgICBpbnQgblNraXAgPSAwOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gZm9ybWF0LkdldExlbmd0aCgpIC0gaSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwIHx8IGZvcm1hdC5HZXRBdChpKzEpICE9IGMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd5JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkRheSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ00nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTWluID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZWMgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBtID0gKGogPCB2YWx1ZS5HZXRMZW5ndGgoKSAmJiB2YWx1ZS5HZXRBdChqKSA9PSAncCcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nID09IDEgfHwgZm9ybWF0LkdldEF0KGkrMikgIT0gYykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3knOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuWWVhciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkRheSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ00nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTWluID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZWMgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBtID0gKGogKyAxIDwgdmFsdWUuR2V0TGVuZ3RoKCkgJiYgdmFsdWUuR2V0QXQoaikgPT0gJ3AnICYmIHZhbHVlLkdldEF0KGorMSkgPT0gJ20nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpKzMpICE9IGMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc01vbnRoLkNvbXBhcmVOb0Nhc2UobW9udGhzW21dKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1vbnRoID0gbSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorPW5Ta2lwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiRmluZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKz0zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorPTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmluZyA9PSAzIHx8IGZvcm1hdC5HZXRBdChpKzQpICE9IGMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ZZWFyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNNb250aC5NYWtlTG93ZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNGdWxsTW9udGhzID0gZnVsbG1vbnRoc1ttXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRnVsbE1vbnRocy5NYWtlTG93ZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzRnVsbE1vbnRocy5GaW5kKHNNb250aC5jX3N0cigpLCAwKSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJGaW5kKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA+PSB2YWx1ZS5HZXRMZW5ndGgoKSB8fCBmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAob2xkaiA9PSBqKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgIGlmIChudW1iZXJbMF0gPiAxMiAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSAmJgorICAgICAgICAobnVtYmVyWzJdID49IDEgJiYgbnVtYmVyWzJdIDw9IDMxKSkgeworICAgICAgblllYXIgPSBudW1iZXJbMF07CisgICAgICBuTW9udGggPSBudW1iZXJbMV07CisgICAgICBuRGF5ID0gbnVtYmVyWzJdOworICAgIH0gZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYKKyAgICAgICAgICAgICAgIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMzEpICYmIG51bWJlclsyXSA+IDMxKSB7CisgICAgICBuTW9udGggPSBudW1iZXJbMF07CisgICAgICBuRGF5ID0gbnVtYmVyWzFdOworICAgICAgblllYXIgPSBudW1iZXJbMl07CisgICAgfSBlbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDMxKSAmJgorICAgICAgICAgICAgICAgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYgbnVtYmVyWzJdID4gMzEpIHsKKyAgICAgIG5EYXkgPSBudW1iZXJbMF07CisgICAgICBuTW9udGggPSBudW1iZXJbMV07CisgICAgICBuWWVhciA9IG51bWJlclsyXTsKICAgICB9CiAKLSAgICBpZiAoYlBtKSBuSG91ciArPSAxMjsKKyAgICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOworICAgIHJldHVybiBkdDsKKyAgfQogCi0gICAgaWYgKG5ZZWFyID49IDAgJiYgblllYXIgPD0gblllYXJTdWIpCi0gICAgICAgIG5ZZWFyICs9IDIwMDA7Ci0KLSAgICBpZiAobk1vbnRoIDwgMSB8fCBuTW9udGggPiAxMikKLSAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKLQotICAgIGlmIChuRGF5IDwgMSB8fCBuRGF5ID4gMzEpCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7Ci0KLSAgICBpZiAobkhvdXIgPCAwIHx8IG5Ib3VyID4gMjQpCi0gICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7Ci0KLSAgICBpZiAobk1pbiA8IDAgfHwgbk1pbiA+IDYwKQotICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwotCi0gICAgaWYgKG5TZWMgPCAwIHx8IG5TZWMgPiA2MCkKLSAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKLQotICAgIGRvdWJsZSBkUmV0ID0gMDsKLQotICAgIGlmIChiV3JvbmdGb3JtYXQpCi0gICAgewotICAgICAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhcixuTW9udGggLSAxLG5EYXkpLEpTX01ha2VUaW1lKG5Ib3VyLCBuTWluLCBuU2VjLCAwKSk7Ci0KLSAgICAgICAgaWYgKEpTX1BvcnRJc05hbihkUmV0KSkKLSAgICAgICAgewotICAgICAgICAgICAgZFJldCA9IEpTX0RhdGVQYXJzZSh2YWx1ZS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChKU19Qb3J0SXNOYW4oZFJldCkpCi0gICAgewotICAgICAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwotICAgIH0KLQotICAgIHJldHVybiBkUmV0OwotCisgIENGWF9XaWRlU3RyaW5nIHN3VGVtcDsKKyAgc3dUZW1wLkZvcm1hdChMIiVkLyVkLyVkICVkOiVkOiVkIiwgbk1vbnRoLCBuRGF5LCBuWWVhciwgbkhvdXIsIG5NaW4sIG5TZWMpOworICByZXR1cm4gSlNfRGF0ZVBhcnNlKHN3VGVtcC5jX3N0cigpKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKGRvdWJsZSBkRGF0ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBmb3JtYXQpCi17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc1JldCA9IEwiIixzUGFydCA9IEwiIjsKK2RvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiV3JvbmdGb3JtYXQpIHsKKyAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKIAotICAgIGludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkRGF0ZSk7Ci0gICAgaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZERhdGUpICsgMTsKLSAgICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGREYXRlKTsKLSAgICBpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZERhdGUpOwotICAgIGludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZERhdGUpOwotICAgIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZERhdGUpOworICBpZiAoZm9ybWF0LklzRW1wdHkoKSB8fCB2YWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGR0OwogCi0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChpIDwgZm9ybWF0LkdldExlbmd0aCgpKQotICAgIHsKLSAgICAgICAgICAgIEZYX1dDSEFSIGMgPSBmb3JtYXQuR2V0QXQoaSk7Ci0gICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGZvcm1hdC5HZXRMZW5ndGgoKSAtIGkgLSAxOwotICAgICAgICBzUGFydCA9IEwiIjsKLSAgICAgICAgc3dpdGNoIChjKQotICAgICAgICB7CisgIGludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkdCk7CisgIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7CisgIGludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOworICBpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZHQpOworICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKKyAgaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7CisKKyAgaW50IG5ZZWFyU3ViID0gOTk7ICAvLyBuWWVhciAtIDIwMDA7CisKKyAgRlhfQk9PTCBiUG0gPSBGQUxTRTsKKyAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKKworICBpbnQgaSA9IDA7CisgIGludCBqID0gMDsKKworICB3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkgeworICAgIGlmIChiRXhpdCkKKyAgICAgIGJyZWFrOworCisgICAgRlhfV0NIQVIgYyA9IGZvcm1hdC5HZXRBdChpKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgJzonOgorICAgICAgY2FzZSAnLic6CisgICAgICBjYXNlICctJzoKKyAgICAgIGNhc2UgJ1xcJzoKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBpKys7CisgICAgICAgIGorKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ3knOgorICAgICAgY2FzZSAnbSc6CisgICAgICBjYXNlICdkJzoKKyAgICAgIGNhc2UgJ0gnOgorICAgICAgY2FzZSAnaCc6CisgICAgICBjYXNlICdNJzoKKyAgICAgIGNhc2UgJ3MnOgorICAgICAgY2FzZSAndCc6IHsKKyAgICAgICAgaW50IG9sZGogPSBqOworICAgICAgICBpbnQgblNraXAgPSAwOworICAgICAgICBpbnQgcmVtYWluaW5nID0gZm9ybWF0LkdldExlbmd0aCgpIC0gaSAtIDE7CisKKyAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwIHx8IGZvcm1hdC5HZXRBdChpICsgMSkgIT0gYykgeworICAgICAgICAgIHN3aXRjaCAoYykgewogICAgICAgICAgICAgY2FzZSAneSc6CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICBuRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdIJzoKKyAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnTSc6CisgICAgICAgICAgICAgIG5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICBuU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkrMSkgIT0gYykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuTW9udGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLG5EYXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLG5Ib3VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuSG91cj4xMj9uSG91ciAtIDEyOm5Ib3VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ00nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuTWluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuU2VjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0ICs9IG5Ib3VyPjEyPydwJzonYSc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBiUG0gPSAoaiA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyk7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDEgfHwgZm9ybWF0LkdldEF0KGkgKyAyKSAhPSBjKSB7CisgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICBuRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdIJzoKKyAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnTSc6CisgICAgICAgICAgICAgIG5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICBuU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgYlBtID0gKGogKyAxIDwgdmFsdWUuR2V0TGVuZ3RoKCkgJiYgdmFsdWUuR2V0QXQoaikgPT0gJ3AnICYmCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5HZXRBdChqICsgMSkgPT0gJ20nKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMiB8fCBmb3JtYXQuR2V0QXQoaSArIDMpICE9IGMpIHsKKyAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ20nOiB7CisgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7CisgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNNb250aC5Db21wYXJlTm9DYXNlKG1vbnRoc1ttXSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgbk1vbnRoID0gbSArIDE7CisgICAgICAgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmluZyA9PSAxIHx8IGZvcm1hdC5HZXRBdChpKzIpICE9IGMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3knOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLG5ZZWFyIC0gKG5ZZWFyIC8gMTAwKSAqIDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIixuTW9udGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsbkRheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdIJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIixuSG91cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIixuSG91cj4xMj9uSG91ciAtIDEyOm5Ib3VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ00nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLG5NaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsblNlYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCA9IG5Ib3VyPjEyPyBMInBtIjogTCJhbSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSs9MjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nID09IDIgfHwgZm9ybWF0LkdldEF0KGkrMykgIT0gYykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSs9MzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobk1vbnRoID4gMCYmbk1vbnRoIDw9IDEyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCArPSBtb250aHNbbk1vbnRoIC0gMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCArPSBjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkrNCkgIT0gYykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTA0ZCIsblllYXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5Nb250aCA+IDAmJm5Nb250aCA8PSAxMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gZnVsbG1vbnRoc1tuTW9udGggLSAxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCArPSBjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICBzUGFydCArPSBjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICghYkZpbmQpIHsKKyAgICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAzKTsKKyAgICAgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgICAgICAgaiArPSAzOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkgKyA0KSAhPSBjKSB7CisgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOiB7CisgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKKworICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzTW9udGggPSBQYXJzZVN0cmluZ1N0cmluZyh2YWx1ZSwgaiwgblNraXApOworICAgICAgICAgICAgICBzTW9udGguTWFrZUxvd2VyKCk7CisKKyAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKSB7CisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0Z1bGxNb250aHMgPSBmdWxsbW9udGhzW21dOworICAgICAgICAgICAgICAgIHNGdWxsTW9udGhzLk1ha2VMb3dlcigpOworCisgICAgICAgICAgICAgICAgaWYgKHNGdWxsTW9udGhzLkZpbmQoc01vbnRoLmNfc3RyKCksIDApICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICBuTW9udGggPSBtICsgMTsKKyAgICAgICAgICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoIWJGaW5kKSB7CisgICAgICAgICAgICAgICAgbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CisgICAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpICs9IDQ7CisgICAgICAgICAgICAgIGogKz0gNDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChqID49IHZhbHVlLkdldExlbmd0aCgpIHx8IGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkgeworICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKKyAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgICAgaSsrOworICAgICAgICAgIGorKzsKICAgICAgICAgfQogCi0gICAgICAgIHNSZXQgKz0gc1BhcnQ7CisgICAgICAgIGlmIChvbGRqID09IGopIHsKKyAgICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOworICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKSB7CisgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkgeworICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CisgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgaSsrOworICAgICAgICBqKys7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChiUG0pCisgICAgbkhvdXIgKz0gMTI7CisKKyAgaWYgKG5ZZWFyID49IDAgJiYgblllYXIgPD0gblllYXJTdWIpCisgICAgblllYXIgKz0gMjAwMDsKKworICBpZiAobk1vbnRoIDwgMSB8fCBuTW9udGggPiAxMikKKyAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOworCisgIGlmIChuRGF5IDwgMSB8fCBuRGF5ID4gMzEpCisgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKKworICBpZiAobkhvdXIgPCAwIHx8IG5Ib3VyID4gMjQpCisgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKKworICBpZiAobk1pbiA8IDAgfHwgbk1pbiA+IDYwKQorICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CisKKyAgaWYgKG5TZWMgPCAwIHx8IG5TZWMgPiA2MCkKKyAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOworCisgIGRvdWJsZSBkUmV0ID0gMDsKKworICBpZiAoYldyb25nRm9ybWF0KSB7CisgICAgZFJldCA9IFBhcnNlTm9ybWFsRGF0ZSh2YWx1ZSwgYldyb25nRm9ybWF0KTsKKyAgfSBlbHNlIHsKKyAgICBkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhciwgbk1vbnRoIC0gMSwgbkRheSksCisgICAgICAgICAgICAgICAgICAgICAgIEpTX01ha2VUaW1lKG5Ib3VyLCBuTWluLCBuU2VjLCAwKSk7CisKKyAgICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKSB7CisgICAgICBkUmV0ID0gSlNfRGF0ZVBhcnNlKHZhbHVlLmNfc3RyKCkpOworICAgIH0KKyAgfQorCisgIGlmIChKU19Qb3J0SXNOYW4oZFJldCkpIHsKKyAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOworICB9CisKKyAgcmV0dXJuIGRSZXQ7Cit9CisKK0NGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZShkb3VibGUgZERhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZvcm1hdCkgeworICBDRlhfV2lkZVN0cmluZyBzUmV0ID0gTCIiLCBzUGFydCA9IEwiIjsKKworICBpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZERhdGUpOworICBpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkRGF0ZSkgKyAxOworICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGREYXRlKTsKKyAgaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGREYXRlKTsKKyAgaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkRGF0ZSk7CisgIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZERhdGUpOworCisgIGludCBpID0gMDsKKyAgd2hpbGUgKGkgPCBmb3JtYXQuR2V0TGVuZ3RoKCkpIHsKKyAgICBGWF9XQ0hBUiBjID0gZm9ybWF0LkdldEF0KGkpOworICAgIGludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKKyAgICBzUGFydCA9IEwiIjsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgJ3knOgorICAgICAgY2FzZSAnbSc6CisgICAgICBjYXNlICdkJzoKKyAgICAgIGNhc2UgJ0gnOgorICAgICAgY2FzZSAnaCc6CisgICAgICBjYXNlICdNJzoKKyAgICAgIGNhc2UgJ3MnOgorICAgICAgY2FzZSAndCc6CisgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCB8fCBmb3JtYXQuR2V0QXQoaSArIDEpICE9IGMpIHsKKyAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5Nb250aCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgbkRheSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnSCc6CisgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgbkhvdXIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5Ib3VyID4gMTIgPyBuSG91ciAtIDEyIDogbkhvdXIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5NaW4pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5TZWMpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICBzUGFydCArPSBuSG91ciA+IDEyID8gJ3AnIDogJ2EnOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaSsrOworICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAxIHx8IGZvcm1hdC5HZXRBdChpICsgMikgIT0gYykgeworICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAneSc6CisgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuWWVhciAtIChuWWVhciAvIDEwMCkgKiAxMDApOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbk1vbnRoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5EYXkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbkhvdXIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbkhvdXIgPiAxMiA/IG5Ib3VyIC0gMTIgOiBuSG91cik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnTSc6CisgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuTWluKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5TZWMpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICBzUGFydCA9IG5Ib3VyID4gMTIgPyBMInBtIiA6IEwiYW0iOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaSArPSAyOworICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpICsgMykgIT0gYykgeworICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgICAgICAgaWYgKG5Nb250aCA+IDAgJiYgbk1vbnRoIDw9IDEyKQorICAgICAgICAgICAgICAgIHNQYXJ0ICs9IG1vbnRoc1tuTW9udGggLSAxXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXQuR2V0QXQoaSArIDQpICE9IGMpIHsKKyAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDRkIiwgblllYXIpOworICAgICAgICAgICAgICBpICs9IDQ7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgICAgICAgaWYgKG5Nb250aCA+IDAgJiYgbk1vbnRoIDw9IDEyKQorICAgICAgICAgICAgICAgIHNQYXJ0ICs9IGZ1bGxtb250aHNbbk1vbnRoIC0gMV07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaSsrOworICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpKys7CisgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHJldHVybiBzUmV0OworICAgIHNSZXQgKz0gc1BhcnQ7CisgIH0KKworICByZXR1cm4gc1JldDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLy9mdW5jdGlvbiBBRk51bWJlcl9Gb3JtYXQobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LCBiQ3VycmVuY3lQcmVwZW5kKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17CisvLyBmdW5jdGlvbiBBRk51bWJlcl9Gb3JtYXQobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LAorLy8gYkN1cnJlbmN5UHJlcGVuZCkKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8KLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCi0JaWYgKHBhcmFtcy5zaXplKCkgIT0gNikKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0JCXJldHVybiBGQUxTRTsKLQlDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc3RyVmFsdWUgPSBTdHJUcmltKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOworICBpZiAocGFyYW1zLnNpemUoKSAhPSA2KSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQorICAgIHJldHVybiBGQUxTRTsKKyAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOworICBDRlhfQnl0ZVN0cmluZyBzdHJWYWx1ZSA9IFN0clRyaW0oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKSk7CiAKLQlpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gVFJVRTsKLQotCWludCBpRGVjID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0JaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwotCWludCBpTmVnU3R5bGUgPSBwYXJhbXNbMl0uVG9JbnQoKTsKLQkvLyBwYXJhbXNbM10gaXMgaUN1cnJTdHlsZSwgaXQncyBub3QgdXNlZC4KLQlzdGQ6OndzdHJpbmcgd3N0ckN1cnJlbmN5KHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKLQlGWF9CT09MIGJDdXJyZW5jeVByZXBlbmQgPSBwYXJhbXNbNV0uVG9Cb29sKCk7Ci0KLQlpZiAoaURlYyA8IDApIGlEZWMgPSAtaURlYzsKLQotCWlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCi0JCWlTZXBTdHlsZSA9IDA7Ci0KLQlpZiAoaU5lZ1N0eWxlIDwgMCB8fCBpTmVnU3R5bGUgPiAzKQotCQlpTmVnU3R5bGUgPSAwOwotCi0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvL2ZvciBwcm9jZXNzaW5nIGRlY2ltYWwgcGxhY2VzCi0Jc3RyVmFsdWUuUmVwbGFjZSgiLCIsICIuIik7Ci0JZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOwotCWlmIChpRGVjID4gMCkKLQkJZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOy8vCi0KLQlpbnQgaURlYzI7Ci0JaW50IGlOZWdhdGl2ZSA9IDA7Ci0KLQlzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwotCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCi0JewotCQlkVmFsdWUgPSAwOwotCQlzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwotCQlpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotCQl7Ci0JCQlzdHJWYWx1ZSA9ICIwIjsKLQkJCWlEZWMyID0gMTsKLQkJfQotCi0JfQotCi0JaWYgKGlEZWMyIDwgMCkKLQl7Ci0JCWZvciAoaW50IGlOdW0gPSAwO2lOdW0gPCBhYnMoaURlYzIpO2lOdW0rKykKLQkJewotCQkJc3RyVmFsdWUgPSAiMCIgKyBzdHJWYWx1ZTsKLQkJfQotCQlpRGVjMiA9IDA7Ci0KLQl9Ci0JaW50IGlNYXggPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKLQlpZiAoaURlYzIgPiBpTWF4KQotCXsKLQkJZm9yIChpbnQgaU51bSA9IDA7aU51bSA8PSBpRGVjMiAtIGlNYXggO2lOdW0rKykKLQkJewotCQkJc3RyVmFsdWUgKz0gIjAiOwotCQl9Ci0JCWlNYXggPSBpRGVjMisxOwotCX0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy9mb3IgcHJvY2Vzc2luZyBzZXBlcmF0b3Igc3R5bGUKLQlpZiAoaURlYzIgPCBpTWF4KQotCXsKLQkJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKQotCQl7Ci0JCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcuJyk7Ci0JCQlpTWF4Kys7Ci0JCX0KLQkJZWxzZSBpZiAoaVNlcFN0eWxlID09IDIgfHwgaVNlcFN0eWxlID09IDMpCi0JCXsKLQkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJywnKTsKLQkJCWlNYXgrKzsKLQkJfQotCi0JCWlmIChpRGVjMiA9PSAwKQotCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwotCX0KLQlpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDIpCi0JewotCQljaGFyIGNTZXBlcmF0b3I7Ci0JCWlmIChpU2VwU3R5bGUgPT0gMCkKLQkJCWNTZXBlcmF0b3IgPSAnLCc7Ci0JCWVsc2UKLQkJCWNTZXBlcmF0b3IgPSAnLic7Ci0KLQkJaW50IGlEZWNQb3NpdGl2ZSxpRGVjTmVnYXRpdmU7Ci0JCWlEZWNQb3NpdGl2ZSA9IGlEZWMyOwotCQlpRGVjTmVnYXRpdmUgPSBpRGVjMjsKLQotCQlmb3IgKGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0zOyBpRGVjUG9zaXRpdmUgPiAwO2lEZWNQb3NpdGl2ZSAtPSAzKQotCQl7Ci0JCQlzdHJWYWx1ZS5JbnNlcnQoaURlY1Bvc2l0aXZlLCBjU2VwZXJhdG9yKTsKLQkJCWlNYXgrKzsKLQkJfQotCX0KLQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvL2ZvciBwcm9jZXNzaW5nIGN1cnJlbmN5IHN0cmluZwotCi0JVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsKLQlzdGQ6OndzdHJpbmcgc3RyVmFsdWUyID0gVmFsdWUuY19zdHIoKTsKLQotCWlmIChiQ3VycmVuY3lQcmVwZW5kKQotCQlzdHJWYWx1ZTIgPSB3c3RyQ3VycmVuY3kgKyBzdHJWYWx1ZTI7Ci0JZWxzZQotCQlzdHJWYWx1ZTIgPSBzdHJWYWx1ZTIgKyB3c3RyQ3VycmVuY3k7Ci0KLQotCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vZm9yIHByb2Nlc3NpbmcgbmVnYXRpdmUgc3R5bGUKLQlpZiAoaU5lZ2F0aXZlKQotCXsKLQkJaWYgKGlOZWdTdHlsZSA9PSAwKQotCQl7Ci0JCQlzdHJWYWx1ZTIuaW5zZXJ0KDAsTCItIik7Ci0JCX0KLQkJaWYgKGlOZWdTdHlsZSA9PSAyIHx8IGlOZWdTdHlsZSA9PSAzKQotCQl7Ci0JCQlzdHJWYWx1ZTIuaW5zZXJ0KDAsTCIoIik7Ci0JCQlzdHJWYWx1ZTIuaW5zZXJ0KHN0clZhbHVlMi5sZW5ndGgoKSxMIikiKTsKLQkJfQotCQlpZiAoaU5lZ1N0eWxlID09IDEgfHwgaU5lZ1N0eWxlID09IDMpCi0JCXsKLQkJCWlmIChGaWVsZCAqIGZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKQotCQkJewotCQkJCUNKU19BcnJheSBhckNvbG9yKGlzb2xhdGUpOwotCQkJCUNKU19WYWx1ZSB2Q29sRWxtKGlzb2xhdGUpOwotCQkJCXZDb2xFbG0gPSBMIlJHQiI7Ci0JCQkJYXJDb2xvci5TZXRFbGVtZW50KDAsdkNvbEVsbSk7Ci0JCQkJdkNvbEVsbSA9IDE7Ci0JCQkJYXJDb2xvci5TZXRFbGVtZW50KDEsdkNvbEVsbSk7Ci0JCQkJdkNvbEVsbSA9IDA7Ci0JCQkJYXJDb2xvci5TZXRFbGVtZW50KDIsdkNvbEVsbSk7Ci0KLQkJCQlhckNvbG9yLlNldEVsZW1lbnQoMyx2Q29sRWxtKTsKLQotCQkJCUNKU19Qcm9wVmFsdWUgdlByb3AoaXNvbGF0ZSk7Ci0JCQkJdlByb3AuU3RhcnRHZXR0aW5nKCk7Ci0JCQkJdlByb3A8PGFyQ29sb3I7Ci0JCQkJdlByb3AuU3RhcnRTZXR0aW5nKCk7Ci0JCQkJZlRhcmdldC0+dGV4dENvbG9yKGNjLHZQcm9wLHNFcnJvcik7Ly8gcmVkCi0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKQotCQl7Ci0JCQlpZiAoRmllbGQgKmZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKQotCQkJewotCQkJCUNKU19BcnJheSBhckNvbG9yKGlzb2xhdGUpOwotCQkJCUNKU19WYWx1ZSB2Q29sRWxtKGlzb2xhdGUpOwotCQkJCXZDb2xFbG0gPSBMIlJHQiI7Ci0JCQkJYXJDb2xvci5TZXRFbGVtZW50KDAsdkNvbEVsbSk7Ci0JCQkJdkNvbEVsbSA9IDA7Ci0JCQkJYXJDb2xvci5TZXRFbGVtZW50KDEsdkNvbEVsbSk7Ci0JCQkJYXJDb2xvci5TZXRFbGVtZW50KDIsdkNvbEVsbSk7Ci0JCQkJYXJDb2xvci5TZXRFbGVtZW50KDMsdkNvbEVsbSk7Ci0KLQkJCQlDSlNfUHJvcFZhbHVlIHZQcm9wKGlzb2xhdGUpOwotCQkJCXZQcm9wLlN0YXJ0R2V0dGluZygpOwotCQkJCWZUYXJnZXQtPnRleHRDb2xvcihjYyx2UHJvcCxzRXJyb3IpOwotCi0JCQkJQ0pTX0FycmF5IGFQcm9wKGlzb2xhdGUpOwotCQkJCXZQcm9wLkNvbnZlcnRUb0FycmF5KGFQcm9wKTsKLQotCQkJCUNQV0xfQ29sb3IgY3JQcm9wOwotCQkJCUNQV0xfQ29sb3IgY3JDb2xvcjsKLQkJCQljb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihhUHJvcCwgY3JQcm9wKTsKLQkJCQljb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihhckNvbG9yLCBjckNvbG9yKTsKLQotCQkJCWlmIChjckNvbG9yICE9IGNyUHJvcCkKLQkJCQl7Ci0JCQkJCUNKU19Qcm9wVmFsdWUgdlByb3AyKGlzb2xhdGUpOwotCQkJCQl2UHJvcDIuU3RhcnRHZXR0aW5nKCk7Ci0JCQkJCXZQcm9wMjw8YXJDb2xvcjsKLQkJCQkJdlByb3AyLlN0YXJ0U2V0dGluZygpOwotICAgICAJCQkJZlRhcmdldC0+dGV4dENvbG9yKGNjLHZQcm9wMixzRXJyb3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlWYWx1ZSA9IHN0clZhbHVlMi5jX3N0cigpOwotI2VuZGlmCisgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIFRSVUU7CisKKyAgaW50IGlEZWMgPSBwYXJhbXNbMF0uVG9JbnQoKTsKKyAgaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOworICBpbnQgaU5lZ1N0eWxlID0gcGFyYW1zWzJdLlRvSW50KCk7CisgIC8vIHBhcmFtc1szXSBpcyBpQ3VyclN0eWxlLCBpdCdzIG5vdCB1c2VkLgorICBzdGQ6OndzdHJpbmcgd3N0ckN1cnJlbmN5KHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKKyAgRlhfQk9PTCBiQ3VycmVuY3lQcmVwZW5kID0gcGFyYW1zWzVdLlRvQm9vbCgpOworCisgIGlmIChpRGVjIDwgMCkKKyAgICBpRGVjID0gLWlEZWM7CisKKyAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKKyAgICBpU2VwU3R5bGUgPSAwOworCisgIGlmIChpTmVnU3R5bGUgPCAwIHx8IGlOZWdTdHlsZSA+IDMpCisgICAgaU5lZ1N0eWxlID0gMDsKKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKKyAgc3RyVmFsdWUuUmVwbGFjZSgiLCIsICIuIik7CisgIGRvdWJsZSBkVmFsdWUgPSBhdG9mKHN0clZhbHVlKTsKKyAgaWYgKGlEZWMgPiAwKQorICAgIGRWYWx1ZSArPSBET1VCTEVfQ09SUkVDVDsgIC8vCisKKyAgaW50IGlEZWMyOworICBpbnQgaU5lZ2F0aXZlID0gMDsKKworICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOworICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSB7CisgICAgZFZhbHVlID0gMDsKKyAgICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOworICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICAgIHN0clZhbHVlID0gIjAiOworICAgICAgaURlYzIgPSAxOworICAgIH0KKyAgfQorCisgIGlmIChpRGVjMiA8IDApIHsKKyAgICBmb3IgKGludCBpTnVtID0gMDsgaU51bSA8IGFicyhpRGVjMik7IGlOdW0rKykgeworICAgICAgc3RyVmFsdWUgPSAiMCIgKyBzdHJWYWx1ZTsKKyAgICB9CisgICAgaURlYzIgPSAwOworICB9CisgIGludCBpTWF4ID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CisgIGlmIChpRGVjMiA+IGlNYXgpIHsKKyAgICBmb3IgKGludCBpTnVtID0gMDsgaU51bSA8PSBpRGVjMiAtIGlNYXg7IGlOdW0rKykgeworICAgICAgc3RyVmFsdWUgKz0gIjAiOworICAgIH0KKyAgICBpTWF4ID0gaURlYzIgKyAxOworICB9CisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCisgIGlmIChpRGVjMiA8IGlNYXgpIHsKKyAgICBpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDEpIHsKKyAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsKKyAgICAgIGlNYXgrKzsKKyAgICB9IGVsc2UgaWYgKGlTZXBTdHlsZSA9PSAyIHx8IGlTZXBTdHlsZSA9PSAzKSB7CisgICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcsJyk7CisgICAgICBpTWF4Kys7CisgICAgfQorCisgICAgaWYgKGlEZWMyID09IDApCisgICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7CisgIH0KKyAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKSB7CisgICAgY2hhciBjU2VwZXJhdG9yOworICAgIGlmIChpU2VwU3R5bGUgPT0gMCkKKyAgICAgIGNTZXBlcmF0b3IgPSAnLCc7CisgICAgZWxzZQorICAgICAgY1NlcGVyYXRvciA9ICcuJzsKKworICAgIGludCBpRGVjUG9zaXRpdmUsIGlEZWNOZWdhdGl2ZTsKKyAgICBpRGVjUG9zaXRpdmUgPSBpRGVjMjsKKyAgICBpRGVjTmVnYXRpdmUgPSBpRGVjMjsKKworICAgIGZvciAoaURlY1Bvc2l0aXZlID0gaURlYzIgLSAzOyBpRGVjUG9zaXRpdmUgPiAwOyBpRGVjUG9zaXRpdmUgLT0gMykgeworICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWNQb3NpdGl2ZSwgY1NlcGVyYXRvcik7CisgICAgICBpTWF4Kys7CisgICAgfQorICB9CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBmb3IgcHJvY2Vzc2luZyBjdXJyZW5jeSBzdHJpbmcKKworICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOworICBzdGQ6OndzdHJpbmcgc3RyVmFsdWUyID0gVmFsdWUuY19zdHIoKTsKKworICBpZiAoYkN1cnJlbmN5UHJlcGVuZCkKKyAgICBzdHJWYWx1ZTIgPSB3c3RyQ3VycmVuY3kgKyBzdHJWYWx1ZTI7CisgIGVsc2UKKyAgICBzdHJWYWx1ZTIgPSBzdHJWYWx1ZTIgKyB3c3RyQ3VycmVuY3k7CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBmb3IgcHJvY2Vzc2luZyBuZWdhdGl2ZSBzdHlsZQorICBpZiAoaU5lZ2F0aXZlKSB7CisgICAgaWYgKGlOZWdTdHlsZSA9PSAwKSB7CisgICAgICBzdHJWYWx1ZTIuaW5zZXJ0KDAsIEwiLSIpOworICAgIH0KKyAgICBpZiAoaU5lZ1N0eWxlID09IDIgfHwgaU5lZ1N0eWxlID09IDMpIHsKKyAgICAgIHN0clZhbHVlMi5pbnNlcnQoMCwgTCIoIik7CisgICAgICBzdHJWYWx1ZTIuaW5zZXJ0KHN0clZhbHVlMi5sZW5ndGgoKSwgTCIpIik7CisgICAgfQorICAgIGlmIChpTmVnU3R5bGUgPT0gMSB8fCBpTmVnU3R5bGUgPT0gMykgeworICAgICAgaWYgKEZpZWxkKiBmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkgeworICAgICAgICBDSlNfQXJyYXkgYXJDb2xvcihpc29sYXRlKTsKKyAgICAgICAgQ0pTX1ZhbHVlIHZDb2xFbG0oaXNvbGF0ZSk7CisgICAgICAgIHZDb2xFbG0gPSBMIlJHQiI7CisgICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgwLCB2Q29sRWxtKTsKKyAgICAgICAgdkNvbEVsbSA9IDE7CisgICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgxLCB2Q29sRWxtKTsKKyAgICAgICAgdkNvbEVsbSA9IDA7CisgICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgyLCB2Q29sRWxtKTsKKworICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMywgdkNvbEVsbSk7CisKKyAgICAgICAgQ0pTX1Byb3BWYWx1ZSB2UHJvcChpc29sYXRlKTsKKyAgICAgICAgdlByb3AuU3RhcnRHZXR0aW5nKCk7CisgICAgICAgIHZQcm9wIDw8IGFyQ29sb3I7CisgICAgICAgIHZQcm9wLlN0YXJ0U2V0dGluZygpOworICAgICAgICBmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsIHZQcm9wLCBzRXJyb3IpOyAgLy8gcmVkCisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChpTmVnU3R5bGUgPT0gMSB8fCBpTmVnU3R5bGUgPT0gMykgeworICAgICAgaWYgKEZpZWxkKiBmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkgeworICAgICAgICBDSlNfQXJyYXkgYXJDb2xvcihpc29sYXRlKTsKKyAgICAgICAgQ0pTX1ZhbHVlIHZDb2xFbG0oaXNvbGF0ZSk7CisgICAgICAgIHZDb2xFbG0gPSBMIlJHQiI7CisgICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgwLCB2Q29sRWxtKTsKKyAgICAgICAgdkNvbEVsbSA9IDA7CisgICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgxLCB2Q29sRWxtKTsKKyAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDIsIHZDb2xFbG0pOworICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMywgdkNvbEVsbSk7CisKKyAgICAgICAgQ0pTX1Byb3BWYWx1ZSB2UHJvcChpc29sYXRlKTsKKyAgICAgICAgdlByb3AuU3RhcnRHZXR0aW5nKCk7CisgICAgICAgIGZUYXJnZXQtPnRleHRDb2xvcihjYywgdlByb3AsIHNFcnJvcik7CisKKyAgICAgICAgQ0pTX0FycmF5IGFQcm9wKGlzb2xhdGUpOworICAgICAgICB2UHJvcC5Db252ZXJ0VG9BcnJheShhUHJvcCk7CisKKyAgICAgICAgQ1BXTF9Db2xvciBjclByb3A7CisgICAgICAgIENQV0xfQ29sb3IgY3JDb2xvcjsKKyAgICAgICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYVByb3AsIGNyUHJvcCk7CisgICAgICAgIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFyQ29sb3IsIGNyQ29sb3IpOworCisgICAgICAgIGlmIChjckNvbG9yICE9IGNyUHJvcCkgeworICAgICAgICAgIENKU19Qcm9wVmFsdWUgdlByb3AyKGlzb2xhdGUpOworICAgICAgICAgIHZQcm9wMi5TdGFydEdldHRpbmcoKTsKKyAgICAgICAgICB2UHJvcDIgPDwgYXJDb2xvcjsKKyAgICAgICAgICB2UHJvcDIuU3RhcnRTZXR0aW5nKCk7CisgICAgICAgICAgZlRhcmdldC0+dGV4dENvbG9yKGNjLCB2UHJvcDIsIHNFcnJvcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgVmFsdWUgPSBzdHJWYWx1ZTIuY19zdHIoKTsKKyNlbmRpZgorICByZXR1cm4gVFJVRTsKIH0KIAotLy9mdW5jdGlvbiBBRk51bWJlcl9LZXlzdHJva2UobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LCBiQ3VycmVuY3lQcmVwZW5kKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0gICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotICAgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLSAgICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworLy8gZnVuY3Rpb24gQUZOdW1iZXJfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwKKy8vIGJDdXJyZW5jeVByZXBlbmQpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAotICAgIGlmKHBhcmFtcy5zaXplKCkgPCAyKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOworICBpZiAocGFyYW1zLnNpemUoKSA8IDIpCisgICAgcmV0dXJuIEZBTFNFOworICBpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CiAKLSAgICBpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQotICAgICAgICBpU2VwU3R5bGUgPSAwOwotICAgIGlmKCFwRXZlbnQtPm1fcFZhbHVlKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgJiB3X3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd19zdHJWYWx1ZSA9IHZhbDsKKyAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKKyAgICBpU2VwU3R5bGUgPSAwOworICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCisgICAgcmV0dXJuIEZBTFNFOworICBDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOworICBDRlhfV2lkZVN0cmluZyYgd19zdHJDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOworICBDRlhfV2lkZVN0cmluZyB3X3N0clZhbHVlID0gdmFsOwogCi0gICAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQotICAgIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckNoYW5nZSA9IHdfc3RyQ2hhbmdlOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSBTdHJMVHJpbSh3X3N0clZhbHVlLmNfc3RyKCkpOwotICAgICAgICBpZiAod3N0clZhbHVlLklzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpIHsKKyAgICBDRlhfV2lkZVN0cmluZyB3c3RyQ2hhbmdlID0gd19zdHJDaGFuZ2U7CisgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0clZhbHVlID0gU3RyTFRyaW0od19zdHJWYWx1ZS5jX3N0cigpKTsKKyAgICBpZiAod3N0clZhbHVlLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBUUlVFOwogCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VGVtcCA9IHdzdHJWYWx1ZTsKLSAgICAgICAgc3dUZW1wLlJlcGxhY2UoTCIsIiwgTCIuIik7Ci0gICAgICAgIGlmICghSXNOdW1iZXIoc3dUZW1wLmNfc3RyKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKLSAgICAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsKLSAgICAgICAgICAgIEFsZXJ0KHBDb250ZXh0LCBzRXJyb3IuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAorICAgIENGWF9XaWRlU3RyaW5nIHN3VGVtcCA9IHdzdHJWYWx1ZTsKKyAgICBzd1RlbXAuUmVwbGFjZShMIiwiLCBMIi4iKTsKKyAgICBpZiAoIUlzTnVtYmVyKHN3VGVtcC5jX3N0cigpKSkgeworICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CisgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSk7CisgICAgICBBbGVydChwQ29udGV4dCwgc0Vycm9yLmNfc3RyKCkpOworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQorICAgIHJldHVybiBUUlVFOyAgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAorICB9CiAKLSAgICBzdGQ6OndzdHJpbmcgd19zdHJWYWx1ZTIgPSB3X3N0clZhbHVlLmNfc3RyKCk7Ci0gICAgc3RkOjp3c3RyaW5nIHdfc3RyQ2hhbmdlMiA9IHdfc3RyQ2hhbmdlLmNfc3RyKCk7Ci0gICAgc3RkOjp3c3RyaW5nIHdfc3RyU2VsZWN0ZWQ7Ci0gICAgaWYoLTEgIT0gcEV2ZW50LT5TZWxTdGFydCgpKQotICAgICAgICB3X3N0clNlbGVjdGVkID0gd19zdHJWYWx1ZTIuc3Vic3RyKHBFdmVudC0+U2VsU3RhcnQoKSwocEV2ZW50LT5TZWxFbmQoKSAtIHBFdmVudC0+U2VsU3RhcnQoKSkpOwotICAgIEZYX0JPT0wgYkhhc1NpZ24gPSAod19zdHJWYWx1ZTIuZmluZCgnLScpICE9IC0xKSAmJiAod19zdHJTZWxlY3RlZC5maW5kKCctJykgPT0gLTEpOwotICAgIGlmIChiSGFzU2lnbikKLSAgICB7Ci0gICAgICAgIC8vY2FuJ3QgaW5zZXJ0ICJjaGFuZ2UiIGluIGZyb250IHRvIHNpZ24gcG9zdGlvbi4KLSAgICAgICAgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7Ci0gICAgICAgICAgICBiUmMgPSBGQUxTRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9CisgIHN0ZDo6d3N0cmluZyB3X3N0clZhbHVlMiA9IHdfc3RyVmFsdWUuY19zdHIoKTsKKyAgc3RkOjp3c3RyaW5nIHdfc3RyQ2hhbmdlMiA9IHdfc3RyQ2hhbmdlLmNfc3RyKCk7CisgIHN0ZDo6d3N0cmluZyB3X3N0clNlbGVjdGVkOworICBpZiAoLTEgIT0gcEV2ZW50LT5TZWxTdGFydCgpKQorICAgIHdfc3RyU2VsZWN0ZWQgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBFdmVudC0+U2VsRW5kKCkgLSBwRXZlbnQtPlNlbFN0YXJ0KCkpKTsKKyAgRlhfQk9PTCBiSGFzU2lnbiA9CisgICAgICAod19zdHJWYWx1ZTIuZmluZCgnLScpICE9IC0xKSAmJiAod19zdHJTZWxlY3RlZC5maW5kKCctJykgPT0gLTEpOworICBpZiAoYkhhc1NpZ24pIHsKKyAgICAvLyBjYW4ndCBpbnNlcnQgImNoYW5nZSIgaW4gZnJvbnQgdG8gc2lnbiBwb3N0aW9uLgorICAgIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgPT0gMCkgeworICAgICAgRlhfQk9PTCYgYlJjID0gcEV2ZW50LT5SYygpOworICAgICAgYlJjID0gRkFMU0U7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9CisgIH0KIAotICAgIGNoYXIgY1NlcCA9IEwnLic7CisgIGNoYXIgY1NlcCA9IEwnLic7CiAKLSAgICBzd2l0Y2ggKGlTZXBTdHlsZSkKLSAgICB7CisgIHN3aXRjaCAoaVNlcFN0eWxlKSB7CiAgICAgY2FzZSAwOgogICAgIGNhc2UgMToKLSAgICAgICAgY1NlcCA9IEwnLic7Ci0gICAgICAgIGJyZWFrOworICAgICAgY1NlcCA9IEwnLic7CisgICAgICBicmVhazsKICAgICBjYXNlIDI6CiAgICAgY2FzZSAzOgotICAgICAgICBjU2VwID0gTCcsJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgICAgY1NlcCA9IEwnLCc7CisgICAgICBicmVhazsKKyAgfQogCi0gICAgRlhfQk9PTCBiSGFzU2VwID0gKHdfc3RyVmFsdWUyLmZpbmQoY1NlcCkgIT0gLTEpOwotICAgIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdfc3RyQ2hhbmdlMi5iZWdpbigpOyBpdCAhPSB3X3N0ckNoYW5nZTIuZW5kKCk7IGl0KyspCi0gICAgewotICAgICAgICBpZiAoKml0ID09IGNTZXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiSGFzU2VwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgICAgICAgICBiUmMgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJIYXNTZXAgPSBUUlVFOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCppdCA9PSBMJy0nKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYkhhc1NpZ24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwotICAgICAgICAgICAgICAgIGJSYyA9IEZBTFNFOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGl0ICE9IHdfc3RyQ2hhbmdlMi5iZWdpbigpKSAvL3NpZ24ncyBwb3NpdGlvbiBpcyBub3QgY29ycmVjdAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgICAgICAgICBiUmMgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7Ci0gICAgICAgICAgICAgICAgYlJjID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiSGFzU2lnbiA9IFRSVUU7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghSXNEaWdpdCgqaXQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7Ci0gICAgICAgICAgICBiUmMgPSBGQUxTRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBzdGQ6OndzdHJpbmcgd19wcmVmaXggPSB3X3N0clZhbHVlMi5zdWJzdHIoMCxwRXZlbnQtPlNlbFN0YXJ0KCkpOwotICAgIHN0ZDo6d3N0cmluZyB3X3Bvc3RmaXg7Ci0gICAgaWYgKHBFdmVudC0+U2VsRW5kKCk8KGludCl3X3N0clZhbHVlMi5sZW5ndGgoKSkKLSAgICAgICAgd19wb3N0Zml4ICA9IHdfc3RyVmFsdWUyLnN1YnN0cihwRXZlbnQtPlNlbEVuZCgpKTsKLSAgICB3X3N0clZhbHVlMiA9IHdfcHJlZml4ICsgd19zdHJDaGFuZ2UyICsgd19wb3N0Zml4OwotICAgIHdfc3RyVmFsdWUgPSB3X3N0clZhbHVlMi5jX3N0cigpOwotICAgIHZhbCA9IHdfc3RyVmFsdWU7Ci0gICAgcmV0dXJuIFRSVUU7Ci0KLX0KLQotLy9mdW5jdGlvbiBBRlBlcmNlbnRfRm9ybWF0KG5EZWMsIHNlcFN0eWxlKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCi0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0gICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotICAgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLSAgICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwotCi0gICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0JCXJldHVybiBGQUxTRTsKLQotCUNGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKLQlDRlhfQnl0ZVN0cmluZyBzdHJWYWx1ZSA9IFN0clRyaW0oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKSk7Ci0JaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKLQkJcmV0dXJuIFRSVUU7Ci0KLQlpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludCgpOwotCWlmIChpRGVjIDwgMCkKLQkJaURlYyA9IC1pRGVjOwotCi0JaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwotCWlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCi0JCWlTZXBTdHlsZSA9IDA7Ci0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvL2ZvciBwcm9jZXNzaW5nIGRlY2ltYWwgcGxhY2VzCi0JZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOwotCWRWYWx1ZSAqPSAxMDA7Ci0JaWYgKGlEZWMgPiAwKQotCQlkVmFsdWUgKz0gRE9VQkxFX0NPUlJFQ1Q7Ly/Qo9X9Ci0KLQlpbnQgaURlYzI7Ci0JaW50IGlOZWdhdGl2ZSA9IDA7Ci0Jc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmaU5lZ2F0aXZlKTsKLSAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotCXsKLQkJZFZhbHVlID0gMDsKLQkJc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmaU5lZ2F0aXZlKTsKLQl9Ci0KLQlpZiAoaURlYzIgPCAwKQotCXsKLQkJZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPCBhYnMoaURlYzIpOyBpTnVtKyspCi0JCXsKLQkJCXN0clZhbHVlID0gIjAiICsgc3RyVmFsdWU7Ci0JCX0KLQkJaURlYzIgPSAwOwotCi0JfQotCWludCBpTWF4ID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7Ci0JaWYgKGlEZWMyID4gaU1heCkKLQl7Ci0JCWZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDw9IGlEZWMyIC0gaU1heDsgaU51bSsrKQotCQl7Ci0JCQlzdHJWYWx1ZSArPSAiMCI7Ci0JCX0KLQkJaU1heCA9IGlEZWMyKzE7Ci0JfQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvL2ZvciBwcm9jZXNzaW5nIHNlcGVyYXRvciBzdHlsZQotCWlmIChpRGVjMiA8IGlNYXgpCi0JewotCQlpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDEpCi0JCXsKLQkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsKLQkJCWlNYXgrKzsKLQkJfQotCQllbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykKLQkJewotCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLCcpOwotCQkJaU1heCsrOwotCQl9Ci0KLQkJaWYgKGlEZWMyID09IDApCi0JCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7Ci0JfQotCWlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMikKLQl7Ci0JCWNoYXIgY1NlcGVyYXRvcjsKLQkJaWYgKGlTZXBTdHlsZSA9PSAwKQotCQkJY1NlcGVyYXRvciA9ICcsJzsKLQkJZWxzZQotCQkJY1NlcGVyYXRvciA9ICcuJzsKLQotCQlpbnQgaURlY1Bvc2l0aXZlLGlEZWNOZWdhdGl2ZTsKLQkJaURlY1Bvc2l0aXZlID0gaURlYzI7Ci0JCWlEZWNOZWdhdGl2ZSA9IGlEZWMyOwotCi0JCWZvciAoaURlY1Bvc2l0aXZlID0gaURlYzIgLTM7IGlEZWNQb3NpdGl2ZSA+IDA7IGlEZWNQb3NpdGl2ZSAtPSAzKQotCQl7Ci0JCQlzdHJWYWx1ZS5JbnNlcnQoaURlY1Bvc2l0aXZlLGNTZXBlcmF0b3IpOwotCQkJaU1heCsrOwotCQl9Ci0JfQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy9uZWdhdGl2ZSBtYXJrCi0JaWYgKGlOZWdhdGl2ZSkKLQkJc3RyVmFsdWUgPSAiLSIgKyBzdHJWYWx1ZTsKLQlzdHJWYWx1ZSArPSAiJSI7Ci0JVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsKLSNlbmRpZgotICAgIHJldHVybiBUUlVFOwotfQotLy9BRlBlcmNlbnRfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBBRk51bWJlcl9LZXlzdHJva2UoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsKLX0KLQotLy9mdW5jdGlvbiBBRkRhdGVfRm9ybWF0RXgoY0Zvcm1hdCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLSAgICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0gICAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKLQotICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCi0gICAgewotICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmKCFwRXZlbnQtPm1fcFZhbHVlKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwotICAgIENGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gdmFsOwotICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCisgIEZYX0JPT0wgYkhhc1NlcCA9ICh3X3N0clZhbHVlMi5maW5kKGNTZXApICE9IC0xKTsKKyAgZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd19zdHJDaGFuZ2UyLmJlZ2luKCk7CisgICAgICAgaXQgIT0gd19zdHJDaGFuZ2UyLmVuZCgpOyBpdCsrKSB7CisgICAgaWYgKCppdCA9PSBjU2VwKSB7CisgICAgICBpZiAoYkhhc1NlcCkgeworICAgICAgICBGWF9CT09MJiBiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJIYXNTZXAgPSBUUlVFOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICgqaXQgPT0gTCctJykgeworICAgICAgaWYgKGJIYXNTaWduKSB7CisgICAgICAgIEZYX0JPT0wmIGJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgICAgYlJjID0gRkFMU0U7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgaWYgKGl0ICE9IHdfc3RyQ2hhbmdlMi5iZWdpbigpKSAgLy8gc2lnbidzIHBvc2l0aW9uIGlzIG5vdCBjb3JyZWN0CisgICAgICB7CisgICAgICAgIEZYX0JPT0wmIGJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgICAgYlJjID0gRkFMU0U7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSAhPSAwKSB7CisgICAgICAgIEZYX0JPT0wmIGJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgICAgYlJjID0gRkFMU0U7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgYkhhc1NpZ24gPSBUUlVFOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCFJc0RpZ2l0KCppdCkpIHsKKyAgICAgIEZYX0JPT0wmIGJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgIGJSYyA9IEZBTFNFOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgc3RkOjp3c3RyaW5nIHdfcHJlZml4ID0gd19zdHJWYWx1ZTIuc3Vic3RyKDAsIHBFdmVudC0+U2VsU3RhcnQoKSk7CisgIHN0ZDo6d3N0cmluZyB3X3Bvc3RmaXg7CisgIGlmIChwRXZlbnQtPlNlbEVuZCgpIDwgKGludCl3X3N0clZhbHVlMi5sZW5ndGgoKSkKKyAgICB3X3Bvc3RmaXggPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxFbmQoKSk7CisgIHdfc3RyVmFsdWUyID0gd19wcmVmaXggKyB3X3N0ckNoYW5nZTIgKyB3X3Bvc3RmaXg7CisgIHdfc3RyVmFsdWUgPSB3X3N0clZhbHVlMi5jX3N0cigpOworICB2YWwgPSB3X3N0clZhbHVlOworICByZXR1cm4gVFJVRTsKK30KKworLy8gZnVuY3Rpb24gQUZQZXJjZW50X0Zvcm1hdChuRGVjLCBzZXBTdHlsZSkKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworCisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyVmFsdWUgPSBTdHJUcmltKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOworICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBUUlVFOworCisgIGludCBpRGVjID0gcGFyYW1zWzBdLlRvSW50KCk7CisgIGlmIChpRGVjIDwgMCkKKyAgICBpRGVjID0gLWlEZWM7CisKKyAgaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOworICBpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQorICAgIGlTZXBTdHlsZSA9IDA7CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vIGZvciBwcm9jZXNzaW5nIGRlY2ltYWwgcGxhY2VzCisgIGRvdWJsZSBkVmFsdWUgPSBhdG9mKHN0clZhbHVlKTsKKyAgZFZhbHVlICo9IDEwMDsKKyAgaWYgKGlEZWMgPiAwKQorICAgIGRWYWx1ZSArPSBET1VCTEVfQ09SUkVDVDsgIC8v0KPV/QorCisgIGludCBpRGVjMjsKKyAgaW50IGlOZWdhdGl2ZSA9IDA7CisgIHN0clZhbHVlID0gZmN2dChkVmFsdWUsIGlEZWMsICZpRGVjMiwgJmlOZWdhdGl2ZSk7CisgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICBkVmFsdWUgPSAwOworICAgIHN0clZhbHVlID0gZmN2dChkVmFsdWUsIGlEZWMsICZpRGVjMiwgJmlOZWdhdGl2ZSk7CisgIH0KKworICBpZiAoaURlYzIgPCAwKSB7CisgICAgZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPCBhYnMoaURlYzIpOyBpTnVtKyspIHsKKyAgICAgIHN0clZhbHVlID0gIjAiICsgc3RyVmFsdWU7CisgICAgfQorICAgIGlEZWMyID0gMDsKKyAgfQorICBpbnQgaU1heCA9IHN0clZhbHVlLkdldExlbmd0aCgpOworICBpZiAoaURlYzIgPiBpTWF4KSB7CisgICAgZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPD0gaURlYzIgLSBpTWF4OyBpTnVtKyspIHsKKyAgICAgIHN0clZhbHVlICs9ICIwIjsKKyAgICB9CisgICAgaU1heCA9IGlEZWMyICsgMTsKKyAgfQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vIGZvciBwcm9jZXNzaW5nIHNlcGVyYXRvciBzdHlsZQorICBpZiAoaURlYzIgPCBpTWF4KSB7CisgICAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKSB7CisgICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcuJyk7CisgICAgICBpTWF4Kys7CisgICAgfSBlbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykgeworICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLCcpOworICAgICAgaU1heCsrOworICAgIH0KKworICAgIGlmIChpRGVjMiA9PSAwKQorICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOworICB9CisgIGlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMikgeworICAgIGNoYXIgY1NlcGVyYXRvcjsKKyAgICBpZiAoaVNlcFN0eWxlID09IDApCisgICAgICBjU2VwZXJhdG9yID0gJywnOworICAgIGVsc2UKKyAgICAgIGNTZXBlcmF0b3IgPSAnLic7CisKKyAgICBpbnQgaURlY1Bvc2l0aXZlLCBpRGVjTmVnYXRpdmU7CisgICAgaURlY1Bvc2l0aXZlID0gaURlYzI7CisgICAgaURlY05lZ2F0aXZlID0gaURlYzI7CisKKyAgICBmb3IgKGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0gMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpIHsKKyAgICAgIHN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBlcmF0b3IpOworICAgICAgaU1heCsrOworICAgIH0KKyAgfQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBuZWdhdGl2ZSBtYXJrCisgIGlmIChpTmVnYXRpdmUpCisgICAgc3RyVmFsdWUgPSAiLSIgKyBzdHJWYWx1ZTsKKyAgc3RyVmFsdWUgKz0gIiUiOworICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfQorLy8gQUZQZXJjZW50X0tleXN0cm9rZShuRGVjLCBzZXBTdHlsZSkKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKGNjLCBwYXJhbXMsIHZSZXQsIHNFcnJvcik7Cit9CisKKy8vIGZ1bmN0aW9uIEFGRGF0ZV9Gb3JtYXRFeChjRm9ybWF0KQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CisKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUgPSB2YWw7CisgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKKyAgZG91YmxlIGREYXRlID0gMC4wZjsKKworICBpZiAoc3RyVmFsdWUuRmluZChMIkdNVCIpICE9IC0xKSB7CisgICAgLy8gZm9yIEdNVCBmb3JtYXQgdGltZQorICAgIC8vIHN1Y2ggYXMgIlR1ZSBBdWcgMTEgMTQ6MjQ6MTYgR01UKzA4MDAyMDA5IgorICAgIGREYXRlID0gTWFrZUludGVyRGF0ZShzdHJWYWx1ZSk7CisgIH0gZWxzZSB7CisgICAgZERhdGUgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsIHNGb3JtYXQsIGJXcm9uZ0Zvcm1hdCk7CisgIH0KKworICBpZiAoSlNfUG9ydElzTmFuKGREYXRlKSkgeworICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOworICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgc0Zvcm1hdC5jX3N0cigpKTsKKyAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgdmFsID0gTWFrZUZvcm1hdERhdGUoZERhdGUsIHNGb3JtYXQpOworICByZXR1cm4gVFJVRTsKK30KKworZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlSW50ZXJEYXRlKENGWF9XaWRlU3RyaW5nIHN0clZhbHVlKSB7CisgIGludCBuSG91cjsKKyAgaW50IG5NaW47CisgIGludCBuU2VjOworICBpbnQgblllYXI7CisgIGludCBuTW9udGg7CisgIGludCBuRGF5OworCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NBcnJheTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gTCIiOworICBDRlhfV2lkZVN0cmluZyBzVGVtcCA9IEwiIjsKKyAgaW50IG5TaXplID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2l6ZTsgaSsrKSB7CisgICAgRlhfV0NIQVIgYyA9IHN0clZhbHVlLkdldEF0KGkpOworICAgIGlmIChjID09IEwnICcgfHwgYyA9PSBMJzonKSB7CisgICAgICB3c0FycmF5LkFkZChzVGVtcCk7CisgICAgICBzVGVtcCA9IEwiIjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHNUZW1wICs9IGM7CisgIH0KKworICB3c0FycmF5LkFkZChzVGVtcCk7CisgIGlmICh3c0FycmF5LkdldFNpemUoKSAhPSA4KQorICAgIHJldHVybiAwOworCisgIHNUZW1wID0gd3NBcnJheVsxXTsKKyAgaWYgKHNUZW1wLkNvbXBhcmUoTCJKYW4iKSA9PSAwKQorICAgIG5Nb250aCA9IDE7CisgIGlmIChzVGVtcC5Db21wYXJlKEwiRmViIikgPT0gMCkKKyAgICBuTW9udGggPSAyOworICBpZiAoc1RlbXAuQ29tcGFyZShMIk1hciIpID09IDApCisgICAgbk1vbnRoID0gMzsKKyAgaWYgKHNUZW1wLkNvbXBhcmUoTCJBcHIiKSA9PSAwKQorICAgIG5Nb250aCA9IDQ7CisgIGlmIChzVGVtcC5Db21wYXJlKEwiTWF5IikgPT0gMCkKKyAgICBuTW9udGggPSA1OworICBpZiAoc1RlbXAuQ29tcGFyZShMIkp1biIpID09IDApCisgICAgbk1vbnRoID0gNjsKKyAgaWYgKHNUZW1wLkNvbXBhcmUoTCJKdWwiKSA9PSAwKQorICAgIG5Nb250aCA9IDc7CisgIGlmIChzVGVtcC5Db21wYXJlKEwiQXVnIikgPT0gMCkKKyAgICBuTW9udGggPSA4OworICBpZiAoc1RlbXAuQ29tcGFyZShMIlNlcCIpID09IDApCisgICAgbk1vbnRoID0gOTsKKyAgaWYgKHNUZW1wLkNvbXBhcmUoTCJPY3QiKSA9PSAwKQorICAgIG5Nb250aCA9IDEwOworICBpZiAoc1RlbXAuQ29tcGFyZShMIk5vdiIpID09IDApCisgICAgbk1vbnRoID0gMTE7CisgIGlmIChzVGVtcC5Db21wYXJlKEwiRGVjIikgPT0gMCkKKyAgICBuTW9udGggPSAxMjsKKworICBuRGF5ID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbMl0uY19zdHIoKSk7CisgIG5Ib3VyID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbM10uY19zdHIoKSk7CisgIG5NaW4gPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs0XS5jX3N0cigpKTsKKyAgblNlYyA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzVdLmNfc3RyKCkpOworICBuWWVhciA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzddLmNfc3RyKCkpOworCisgIGRvdWJsZSBkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhciwgbk1vbnRoIC0gMSwgbkRheSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKKworICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKSB7CisgICAgZFJldCA9IEpTX0RhdGVQYXJzZShzdHJWYWx1ZS5jX3N0cigpKTsKKyAgfQorCisgIHJldHVybiBkUmV0OworfQorCisvLyBBRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworCisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKSB7CisgICAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIENGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOworICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCisgICAgICByZXR1cm4gVFJVRTsKIAogICAgIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgICAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKLSAgICBkb3VibGUgZERhdGUgPSAwLjBmOwotCi0gICAgaWYoc3RyVmFsdWUuRmluZChMIkdNVCIpICE9IC0xKQotICAgIHsKLSAgICAgICAgLy9mb3IgR01UIGZvcm1hdCB0aW1lCi0gICAgICAgIC8vc3VjaCBhcyAiVHVlIEF1ZyAxMSAxNDoyNDoxNiBHTVQrMDgwMDIwMDkiCi0gICAgICAgIGREYXRlID0gTWFrZUludGVyRGF0ZShzdHJWYWx1ZSk7CisgICAgZG91YmxlIGRSZXQgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsIHNGb3JtYXQsIGJXcm9uZ0Zvcm1hdCk7CisgICAgaWYgKGJXcm9uZ0Zvcm1hdCB8fCBKU19Qb3J0SXNOYW4oZFJldCkpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOworICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIHNGb3JtYXQuY19zdHIoKSk7CisgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CisgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzdHJWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7Ci0gICAgfQotCi0gICAgaWYgKEpTX1BvcnRJc05hbihkRGF0ZSkpCi0gICAgewotICAgICAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKLSAgICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLCBzRm9ybWF0LmNfc3RyKCkpOwotICAgICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICB2YWwgPSAgTWFrZUZvcm1hdERhdGUoZERhdGUsc0Zvcm1hdCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLWRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUludGVyRGF0ZShDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSkKLXsKLSAgICBpbnQgbkhvdXI7Ci0gICAgaW50IG5NaW47Ci0gICAgaW50IG5TZWM7Ci0gICAgaW50IG5ZZWFyOwotICAgIGludCBuTW9udGg7Ci0gICAgaW50IG5EYXk7CitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c0FycmF5OwotICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IEwiIjsKLSAgICBDRlhfV2lkZVN0cmluZyBzVGVtcCA9IEwiIjsKLSAgICBpbnQgblNpemUgPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKLQotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgRlhfV0NIQVIgYyA9IHN0clZhbHVlLkdldEF0KGkpOwotICAgICAgICBpZihjID09IEwnICcgfHwgYyA9PSBMJzonKQotICAgICAgICB7Ci0gICAgICAgICAgICB3c0FycmF5LkFkZChzVGVtcCk7Ci0gICAgICAgICAgICBzVGVtcCA9IEwiIjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc1RlbXAgKz0gYzsKLSAgICB9Ci0KLSAgICB3c0FycmF5LkFkZChzVGVtcCk7Ci0gICAgaWYod3NBcnJheS5HZXRTaXplKCkgIT0gOClyZXR1cm4gMDsKLQotICAgIHNUZW1wID0gd3NBcnJheVsxXTsKLSAgICBpZihzVGVtcC5Db21wYXJlKEwiSmFuIikgPT0gMCkgbk1vbnRoID0gMTsKLSAgICBpZihzVGVtcC5Db21wYXJlKEwiRmViIikgPT0gMCkgbk1vbnRoID0gMjsKLSAgICBpZihzVGVtcC5Db21wYXJlKEwiTWFyIikgPT0gMCkgbk1vbnRoID0gMzsKLSAgICBpZihzVGVtcC5Db21wYXJlKEwiQXByIikgPT0gMCkgbk1vbnRoID0gNDsKLSAgICBpZihzVGVtcC5Db21wYXJlKEwiTWF5IikgPT0gMCkgbk1vbnRoID0gNTsKLSAgICBpZihzVGVtcC5Db21wYXJlKEwiSnVuIikgPT0gMCkgbk1vbnRoID0gNjsKLSAgICBpZihzVGVtcC5Db21wYXJlKEwiSnVsIikgPT0gMCkgbk1vbnRoID0gNzsKLSAgICBpZihzVGVtcC5Db21wYXJlKEwiQXVnIikgPT0gMCkgbk1vbnRoID0gODsKLSAgICBpZihzVGVtcC5Db21wYXJlKEwiU2VwIikgPT0gMCkgbk1vbnRoID0gOTsKLSAgICBpZihzVGVtcC5Db21wYXJlKEwiT2N0IikgPT0gMCkgbk1vbnRoID0gMTA7Ci0gICAgaWYoc1RlbXAuQ29tcGFyZShMIk5vdiIpID09IDApIG5Nb250aCA9IDExOwotICAgIGlmKHNUZW1wLkNvbXBhcmUoTCJEZWMiKSA9PSAwKSBuTW9udGggPSAxMjsKLQotICAgIG5EYXkgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVsyXS5jX3N0cigpKTsKLSAgICBuSG91ciA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzNdLmNfc3RyKCkpOwotICAgIG5NaW4gPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs0XS5jX3N0cigpKTsKLSAgICBuU2VjID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbNV0uY19zdHIoKSk7Ci0gICAgblllYXIgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs3XS5jX3N0cigpKTsKLQotICAgIGRvdWJsZSBkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhcixuTW9udGggLSAxLG5EYXkpLEpTX01ha2VUaW1lKG5Ib3VyLCBuTWluLCBuU2VjLCAwKSk7Ci0KLSAgICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQotICAgIHsKLSAgICAgICAgZFJldCA9IEpTX0RhdGVQYXJzZShzdHJWYWx1ZS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZFJldDsKLX0KLQotLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLSAgICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0gICAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKLQotICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCi0gICAgewotICAgICAgICBzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpCi0gICAgewotICAgICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7Ci0gICAgICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLQotICAgICAgICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgICAgICBGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwotICAgICAgICBkb3VibGUgZFJldCA9IE1ha2VSZWd1bGFyRGF0ZShzdHJWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7Ci0gICAgICAgIGlmIChiV3JvbmdGb3JtYXQgfHwgSlNfUG9ydElzTmFuKGRSZXQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKLSAgICAgICAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKLSAgICAgICAgICAgIEFsZXJ0KHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKLSAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7Ci0KLSAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQotICAgIHsKLSAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLSAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCi0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0gICAgY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSAge0wibS9kIiwgTCJtL2QveXkiLCBMIm1tL2RkL3l5IiwgTCJtbS95eSIsIEwiZC1tbW0iLCBMImQtbW1tLXl5IiwgTCJkZC1tbW0teXkiLAotICAgICAgICBMInl5LW1tLWRkIiwgTCJtbW0teXkiLCBMIm1tbW0teXkiLCBMIm1tbSBkLCB5eXl5IiwgTCJtbW1tIGQsIHl5eXkiLAotICAgICAgICBMIm0vZC95eSBoOk1NIHR0IiwgTCJtL2QveXkgSEg6TU0iIH07Ci0KLSAgICBBU1NFUlQoaUluZGV4IDwgRlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7Ci0KLSAgICBpZiAoaUluZGV4IDwgMCkKLSAgICAgICAgaUluZGV4ID0gMDsKLSAgICBpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCi0gICAgICAgIGlJbmRleCA9IDA7Ci0gICAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwotICAgIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKLSAgICBuZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7Ci0gICAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwotfQotCi0vL0FGRGF0ZV9LZXlzdHJva2VFeChjRm9ybWF0KQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKLQotICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCi0gICAgewotICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0KLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKLSAgICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9ICB7TCJtL2QiLCBMIm0vZC95eSIsIEwibW0vZGQveXkiLCBMIm1tL3l5IiwgTCJkLW1tbSIsIEwiZC1tbW0teXkiLCBMImRkLW1tbS15eSIsCi0gICAgICAgIEwieXktbW0tZGQiLCBMIm1tbS15eSIsIEwibW1tbS15eSIsIEwibW1tIGQsIHl5eXkiLCBMIm1tbW0gZCwgeXl5eSIsCi0gICAgICAgIEwibS9kL3l5IGg6TU0gdHQiLCBMIm0vZC95eSBISDpNTSIgfTsKLQotICAgIEFTU0VSVChpSW5kZXg8RlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7Ci0KLSAgICBpZiAoaUluZGV4IDwgMCkKLSAgICAgICAgaUluZGV4ID0gMDsKLSAgICBpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCi0gICAgICAgIGlJbmRleCA9IDA7Ci0gICAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwotICAgIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKLSAgICBuZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7Ci0gICAgcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwotfQotCi0vL2Z1bmN0aW9uIEFGVGltZV9Gb3JtYXQocHRmKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKLQotICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCi0gICAgewotICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0gICAgY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLCBMImg6TU06c3MgdHQifTsKLQotICAgIEFTU0VSVChpSW5kZXg8RlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7Ci0KLSAgICBpZiAoaUluZGV4IDwgMCkKLSAgICAgICAgaUluZGV4ID0gMDsKLSAgICBpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCi0gICAgICAgIGlJbmRleCA9IDA7Ci0gICAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwotICAgIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKLSAgICBuZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7Ci0gICAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwotfQotCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwotICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCi0gICAgewotICAgICAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0gICAgY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLCBMImg6TU06c3MgdHQifTsKLQotICAgIEFTU0VSVChpSW5kZXg8RlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7Ci0KLSAgICBpZiAoaUluZGV4IDwgMCkKLSAgICAgICAgaUluZGV4ID0gMDsKLSAgICBpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCi0gICAgICAgIGlJbmRleCA9IDA7Ci0gICAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwotICAgIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKLSAgICBuZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7Ci0gICAgcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwotfQotCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Ci19Ci0KLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsKLX0KLQotLy9mdW5jdGlvbiBBRlNwZWNpYWxfRm9ybWF0KHBzZikKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogCi0gICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKLSAgICB7Ci0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQ7Ci0gICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOworICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CisgIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wibS9kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tL2RkL3l5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS95eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZC1tbW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImQtbW1tLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkZC1tbW0teXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInl5LW1tLWRkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW0teXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbW0teXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbSBkLCB5eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW1tIGQsIHl5eXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSBoOk1NIHR0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkgSEg6TU0ifTsKIAotICAgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLSAgICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworICBBU1NFUlQoaUluZGV4IDwgRlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7CiAKLSAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKLSAgICBzdGQ6OnN0cmluZyBzdHJTcmMgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpLmNfc3RyKCk7CisgIGlmIChpSW5kZXggPCAwKQorICAgIGlJbmRleCA9IDA7CisgIGlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKKyAgICBpSW5kZXggPSAwOworICBDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CisgIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSwgY0Zvcm1hdHNbaUluZGV4XSk7CisgIG5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKKyAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYywgbmV3UGFyYW1zLCB2UmV0LCBzRXJyb3IpOworfQogCi0gICAgc3dpdGNoIChpSW5kZXgpCi0gICAgeworLy8gQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOworCisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOworICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIm0vZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS9kZC95eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW0veXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImQtbW1tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbS15eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZGQtbW1tLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJ5eS1tbS1kZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW1tLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW0gZCwgeXl5eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbSBkLCB5eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkgaDpNTSB0dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IEhIOk1NIn07CisKKyAgQVNTRVJUKGlJbmRleCA8IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOworCisgIGlmIChpSW5kZXggPCAwKQorICAgIGlJbmRleCA9IDA7CisgIGlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKKyAgICBpSW5kZXggPSAwOworICBDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CisgIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSwgY0Zvcm1hdHNbaUluZGV4XSk7CisgIG5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKKyAgcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYywgbmV3UGFyYW1zLCB2UmV0LCBzRXJyb3IpOworfQorCisvLyBmdW5jdGlvbiBBRlRpbWVfRm9ybWF0KHB0ZikKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CisKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOworICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIkhIOk1NIiwgTCJoOk1NIHR0IiwgTCJISDpNTTpzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiaDpNTTpzcyB0dCJ9OworCisgIEFTU0VSVChpSW5kZXggPCBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKKworICBpZiAoaUluZGV4IDwgMCkKKyAgICBpSW5kZXggPSAwOworICBpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCisgICAgaUluZGV4ID0gMDsKKyAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOworICBDSlNfVmFsdWUgdmFsKGlzb2xhdGUsIGNGb3JtYXRzW2lJbmRleF0pOworICBuZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CisgIHJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsIG5ld1BhcmFtcywgdlJldCwgc0Vycm9yKTsKK30KKworRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOworICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIkhIOk1NIiwgTCJoOk1NIHR0IiwgTCJISDpNTTpzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiaDpNTTpzcyB0dCJ9OworCisgIEFTU0VSVChpSW5kZXggPCBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKKworICBpZiAoaUluZGV4IDwgMCkKKyAgICBpSW5kZXggPSAwOworICBpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCisgICAgaUluZGV4ID0gMDsKKyAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOworICBDSlNfVmFsdWUgdmFsKGlzb2xhdGUsIGNGb3JtYXRzW2lJbmRleF0pOworICBuZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CisgIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsIG5ld1BhcmFtcywgdlJldCwgc0Vycm9yKTsKK30KKworRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYywgcGFyYW1zLCB2UmV0LCBzRXJyb3IpOworfQorCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLCBwYXJhbXMsIHZSZXQsIHNFcnJvcik7Cit9CisKKy8vIGZ1bmN0aW9uIEFGU3BlY2lhbF9Gb3JtYXQocHNmKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzdGQ6OnN0cmluZyBjRm9ybWF0OworICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CisKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworCisgIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKKyAgc3RkOjpzdHJpbmcgc3RyU3JjID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKS5jX3N0cigpOworCisgIHN3aXRjaCAoaUluZGV4KSB7CiAgICAgY2FzZSAwOgotICAgICAgICBjRm9ybWF0ID0gIjk5OTk5IjsKLSAgICAgICAgYnJlYWs7CisgICAgICBjRm9ybWF0ID0gIjk5OTk5IjsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgMToKLSAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OS05OTk5IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgICB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBOdW1iZXJTdHI7Ci0gICAgICAgICAgICB1dGlsOjpwcmludHgoIjk5OTk5OTk5OTkiLCBzdHJTcmMsTnVtYmVyU3RyKTsKLSAgICAgICAgICAgIGlmIChOdW1iZXJTdHIubGVuZ3RoKCkgPj0gMTAgKQotICAgICAgICAgICAgICAgIGNGb3JtYXQgPSAiKDk5OSkgOTk5LTk5OTkiOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNGb3JtYXQgPSAiOTk5LTk5OTkiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICAgIGNGb3JtYXQgPSAiOTk5OTktOTk5OSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6IHsKKyAgICAgIHN0ZDo6c3RyaW5nIE51bWJlclN0cjsKKyAgICAgIHV0aWw6OnByaW50eCgiOTk5OTk5OTk5OSIsIHN0clNyYywgTnVtYmVyU3RyKTsKKyAgICAgIGlmIChOdW1iZXJTdHIubGVuZ3RoKCkgPj0gMTApCisgICAgICAgIGNGb3JtYXQgPSAiKDk5OSkgOTk5LTk5OTkiOworICAgICAgZWxzZQorICAgICAgICBjRm9ybWF0ID0gIjk5OS05OTk5IjsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICBjYXNlIDM6Ci0gICAgICAgIGNGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOworICAgICAgY0Zvcm1hdCA9ICI5OTktOTktOTk5OSI7CisgICAgICBicmVhazsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHN0ckRlczsKKyAgdXRpbDo6cHJpbnR4KGNGb3JtYXQsIHN0clNyYywgc3RyRGVzKTsKKyAgVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0ckRlcy5jX3N0cigpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIGZ1bmN0aW9uIEFGU3BlY2lhbF9LZXlzdHJva2VFeChtYXNrKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisKKyAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKKworICBpZiAocGFyYW1zLnNpemUoKSA8IDEpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENGWF9XaWRlU3RyaW5nJiB2YWxFdmVudCA9IHBFdmVudC0+VmFsdWUoKTsKKworICBDRlhfV2lkZVN0cmluZyB3c3RyTWFzayA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgaWYgKHdzdHJNYXNrLklzRW1wdHkoKSkKKyAgICByZXR1cm4gVFJVRTsKKworICBzdGQ6OndzdHJpbmcgd3N0clZhbHVlID0gdmFsRXZlbnQuY19zdHIoKTsKKworICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpIHsKKyAgICBpZiAod3N0clZhbHVlLmVtcHR5KCkpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBpbnQgaUluZGV4TWFzayA9IDA7CisgICAgZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd3N0clZhbHVlLmJlZ2luKCk7IGl0ICE9IHdzdHJWYWx1ZS5lbmQoKTsKKyAgICAgICAgIGl0KyspIHsKKyAgICAgIHdjaGFyX3Qgd19WYWx1ZSA9ICppdDsKKyAgICAgIGlmICghbWFza1NhdGlzZmllZCh3X1ZhbHVlLCB3c3RyTWFza1tpSW5kZXhNYXNrXSkpCiAgICAgICAgIGJyZWFrOworICAgICAgaUluZGV4TWFzaysrOwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIHN0ckRlczsKLSAgICB1dGlsOjpwcmludHgoY0Zvcm1hdCxzdHJTcmMsc3RyRGVzKTsKLSAgICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyRGVzLmNfc3RyKCkpOworICAgIGlmIChpSW5kZXhNYXNrICE9IHdzdHJNYXNrLkdldExlbmd0aCgpIHx8CisgICAgICAgIChpSW5kZXhNYXNrICE9IHdzdHJWYWx1ZS5zaXplKCkgJiYgd3N0ck1hc2suR2V0TGVuZ3RoKCkgIT0gMCkpIHsKKyAgICAgIEFsZXJ0KAorICAgICAgICAgIHBDb250ZXh0LAorICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKS5jX3N0cigpKTsKKyAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgIH0KICAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIENGWF9XaWRlU3RyaW5nJiB3aWRlQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKKyAgc3RkOjp3c3RyaW5nIHdDaGFuZ2UgPSB3aWRlQ2hhbmdlLmNfc3RyKCk7CisgIGlmICh3Q2hhbmdlLmVtcHR5KCkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaW50IGlJbmRleE1hc2sgPSBwRXZlbnQtPlNlbFN0YXJ0KCk7CisKKyAgaWYgKHdzdHJWYWx1ZS5sZW5ndGgoKSAtIChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKSArCisgICAgICAgICAgd0NoYW5nZS5sZW5ndGgoKSA+CisgICAgICAoRlhfRFdPUkQpd3N0ck1hc2suR2V0TGVuZ3RoKCkpIHsKKyAgICBBbGVydChwQ29udGV4dCwKKyAgICAgICAgICBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOworICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgJiYgKCF3Q2hhbmdlLmVtcHR5KCkpKSB7CisgICAgQWxlcnQocENvbnRleHQsCisgICAgICAgICAgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKKyAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdDaGFuZ2UuYmVnaW4oKTsgaXQgIT0gd0NoYW5nZS5lbmQoKTsgaXQrKykgeworICAgIGlmIChpSW5kZXhNYXNrID49IHdzdHJNYXNrLkdldExlbmd0aCgpKSB7CisgICAgICBBbGVydChwQ29udGV4dCwKKyAgICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7CisgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICB3Y2hhcl90IHdfTWFzayA9IHdzdHJNYXNrW2lJbmRleE1hc2tdOworICAgIGlmICghaXNSZXNlcnZlZE1hc2tDaGFyKHdfTWFzaykpIHsKKyAgICAgICppdCA9IHdfTWFzazsKKyAgICB9CisgICAgd2NoYXJfdCB3X0NoYW5nZSA9ICppdDsKKyAgICBpZiAoIW1hc2tTYXRpc2ZpZWQod19DaGFuZ2UsIHdfTWFzaykpIHsKKyAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGlJbmRleE1hc2srKzsKKyAgfQorCisgIHdpZGVDaGFuZ2UgPSB3Q2hhbmdlLmNfc3RyKCk7CisgIHJldHVybiBUUlVFOwogfQogCisvLyBmdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlKHBzZikKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAKLS8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZUV4KG1hc2spCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKLSAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0gICAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAotICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0gICAgaWYgKHBhcmFtcy5zaXplKCkgPCAxKQotICAgIHsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKyAgc3RkOjpzdHJpbmcgY0Zvcm1hdDsKKyAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogCi0gICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBDRlhfV2lkZVN0cmluZyYgdmFsRXZlbnQgPSBwRXZlbnQtPlZhbHVlKCk7CisgIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIC8vIENKU19WYWx1ZSB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CisgIENGWF9XaWRlU3RyaW5nJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CisgIHN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh2YWwpLmNfc3RyKCk7CisgIHN0ZDo6d3N0cmluZyB3c3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKS5jX3N0cigpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ck1hc2sgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0gICAgaWYgKHdzdHJNYXNrLklzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBzdGQ6OndzdHJpbmcgd3N0clZhbHVlID0gdmFsRXZlbnQuY19zdHIoKTsKLQotICAgIGlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKLSAgICB7Ci0gICAgICAgIGlmICh3c3RyVmFsdWUuZW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICBpbnQgaUluZGV4TWFzayA9IDA7Ci0gICAgICAgIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdzdHJWYWx1ZS5iZWdpbigpOyBpdCAhPSB3c3RyVmFsdWUuZW5kKCk7IGl0KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdjaGFyX3Qgd19WYWx1ZSA9ICppdDsKLSAgICAgICAgICAgIGlmICghbWFza1NhdGlzZmllZCh3X1ZhbHVlLHdzdHJNYXNrW2lJbmRleE1hc2tdKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlJbmRleE1hc2srKzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpSW5kZXhNYXNrICE9IHdzdHJNYXNrLkdldExlbmd0aCgpIHx8IChpSW5kZXhNYXNrICE9IHdzdHJWYWx1ZS5zaXplKCkgJiYgd3N0ck1hc2suR2V0TGVuZ3RoKCkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSkuY19zdHIoKSk7Ci0gICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICBDRlhfV2lkZVN0cmluZyAmd2lkZUNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCk7Ci0gICAgc3RkOjp3c3RyaW5nIHdDaGFuZ2UgPSB3aWRlQ2hhbmdlLmNfc3RyKCk7Ci0gICAgaWYgKHdDaGFuZ2UuZW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBpbnQgaUluZGV4TWFzayA9IHBFdmVudC0+U2VsU3RhcnQoKTsKLQotICAgIGlmICh3c3RyVmFsdWUubGVuZ3RoKCkgLSAocEV2ZW50LT5TZWxFbmQoKS1wRXZlbnQtPlNlbFN0YXJ0KCkpICsgd0NoYW5nZS5sZW5ndGgoKSA+IChGWF9EV09SRCl3c3RyTWFzay5HZXRMZW5ndGgoKSkKLSAgICB7Ci0gICAgICAgIEFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwotICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgJiYgKCF3Q2hhbmdlLmVtcHR5KCkpKQotICAgIHsKLSAgICAgICAgQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7Ci0gICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICBmb3IgKHN0ZDo6d3N0cmluZzo6aXRlcmF0b3IgaXQgPSB3Q2hhbmdlLmJlZ2luKCk7IGl0ICE9IHdDaGFuZ2UuZW5kKCk7IGl0KyspCi0gICAgewotICAgICAgICBpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSkKLSAgICAgICAgewotICAgICAgICAgICAgQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7Ci0gICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHdjaGFyX3Qgd19NYXNrID0gd3N0ck1hc2tbaUluZGV4TWFza107Ci0gICAgICAgIGlmICghaXNSZXNlcnZlZE1hc2tDaGFyKHdfTWFzaykpCi0gICAgICAgIHsKLSAgICAgICAgICAgICppdCA9IHdfTWFzazsKLSAgICAgICAgfQotICAgICAgICB3Y2hhcl90IHdfQ2hhbmdlID0gKml0OwotICAgICAgICBpZiAoIW1hc2tTYXRpc2ZpZWQod19DaGFuZ2Usd19NYXNrKSkKLSAgICAgICAgewotICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpSW5kZXhNYXNrKys7Ci0gICAgfQotCi0gICAgd2lkZUNoYW5nZSA9IHdDaGFuZ2UuY19zdHIoKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vL2Z1bmN0aW9uIEFGU3BlY2lhbF9LZXlzdHJva2UocHNmKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKLQotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLSAgICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0gICAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKLQotICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCi0gICAgewotICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgY0Zvcm1hdDsKLSAgICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0KLSAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8vQ0pTX1ZhbHVlIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKLSAgICBDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwotICAgIHN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh2YWwpLmNfc3RyKCk7Ci0gICAgc3RkOjp3c3RyaW5nIHdzdHJDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpLmNfc3RyKCk7Ci0KLSAgICBzd2l0Y2ggKGlJbmRleCkKLSAgICB7CisgIHN3aXRjaCAoaUluZGV4KSB7CiAgICAgY2FzZSAwOgotICAgICAgICBjRm9ybWF0ID0gIjk5OTk5IjsKLSAgICAgICAgYnJlYWs7CisgICAgICBjRm9ybWF0ID0gIjk5OTk5IjsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgMToKLSAgICAgICAgLy9jRm9ybWF0ID0gIjk5OTk5LTk5OTkiOwotICAgICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OSI7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgTnVtYmVyU3RyOwotICAgICAgICAgICAgdXRpbDo6cHJpbnR4KCI5OTk5OTk5OTk5Iiwgc3RyU3JjLE51bWJlclN0cik7Ci0gICAgICAgICAgICBpZiAoc3RyU3JjLmxlbmd0aCgpICsgd3N0ckNoYW5nZS5sZW5ndGgoKSA+IDcgKQotICAgICAgICAgICAgICAgIC8vY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7Ci0gICAgICAgICAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTk5IjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAvL2NGb3JtYXQgPSAiOTk5LTk5OTkiOwotICAgICAgICAgICAgICAgIGNGb3JtYXQgPSAiOTk5OTk5OSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgICAgLy8gY0Zvcm1hdCA9ICI5OTk5OS05OTk5IjsKKyAgICAgIGNGb3JtYXQgPSAiOTk5OTk5OTk5IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjogeworICAgICAgc3RkOjpzdHJpbmcgTnVtYmVyU3RyOworICAgICAgdXRpbDo6cHJpbnR4KCI5OTk5OTk5OTk5Iiwgc3RyU3JjLCBOdW1iZXJTdHIpOworICAgICAgaWYgKHN0clNyYy5sZW5ndGgoKSArIHdzdHJDaGFuZ2UubGVuZ3RoKCkgPiA3KQorICAgICAgICAvLyBjRm9ybWF0ID0gIig5OTkpIDk5OS05OTk5IjsKKyAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTk5IjsKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gY0Zvcm1hdCA9ICI5OTktOTk5OSI7CisgICAgICAgIGNGb3JtYXQgPSAiOTk5OTk5OSI7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgY2FzZSAzOgotICAgICAgICAvL2NGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOwotICAgICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OSI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKyAgICAgIC8vIGNGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOworICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOworICAgICAgYnJlYWs7CisgIH0KIAotICAgIENKU19QYXJhbWV0ZXJzIHBhcmFtczI7Ci0gICAgQ0pTX1ZhbHVlIHZNYXNrKGlzb2xhdGUsIGNGb3JtYXQuY19zdHIoKSk7Ci0gICAgcGFyYW1zMi5wdXNoX2JhY2sodk1hc2spOworICBDSlNfUGFyYW1ldGVycyBwYXJhbXMyOworICBDSlNfVmFsdWUgdk1hc2soaXNvbGF0ZSwgY0Zvcm1hdC5jX3N0cigpKTsKKyAgcGFyYW1zMi5wdXNoX2JhY2sodk1hc2spOwogCi0gICAgcmV0dXJuIEFGU3BlY2lhbF9LZXlzdHJva2VFeChjYyxwYXJhbXMyLHZSZXQsc0Vycm9yKTsKKyAgcmV0dXJuIEFGU3BlY2lhbF9LZXlzdHJva2VFeChjYywgcGFyYW1zMiwgdlJldCwgc0Vycm9yKTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZNZXJnZUNoYW5nZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLSAgICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnRIYW5kbGVyID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotICAgIEFTU0VSVChwRXZlbnRIYW5kbGVyICE9IE5VTEwpOworRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZNZXJnZUNoYW5nZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50SGFuZGxlciA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgQVNTRVJUKHBFdmVudEhhbmRsZXIgIT0gTlVMTCk7CiAKLSAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQotICAgIHsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLSAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlOwotICAgIGlmIChwRXZlbnRIYW5kbGVyLT5tX3BWYWx1ZSAhPSBOVUxMKQotICAgICAgICBzd1ZhbHVlID0gcEV2ZW50SGFuZGxlci0+VmFsdWUoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZTsKKyAgaWYgKHBFdmVudEhhbmRsZXItPm1fcFZhbHVlICE9IE5VTEwpCisgICAgc3dWYWx1ZSA9IHBFdmVudEhhbmRsZXItPlZhbHVlKCk7CiAKLSAgICBpZiAocEV2ZW50SGFuZGxlci0+V2lsbENvbW1pdCgpKQotICAgIHsKLSAgICAgICAgdlJldCA9IHN3VmFsdWUuY19zdHIoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgQ0ZYX1dpZGVTdHJpbmcgcHJlZml4LHBvc3RmaXg7Ci0KLSAgICBpZiAocEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSA+PSAwKQotICAgICAgICBwcmVmaXggPSBzd1ZhbHVlLk1pZCgwLHBFdmVudEhhbmRsZXItPlNlbFN0YXJ0KCkpOwotICAgIGVsc2UKLSAgICAgICAgcHJlZml4ID0gTCIiOwotCi0KLSAgICBpZiAocEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPj0gMCAmJiBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA8PSBzd1ZhbHVlLkdldExlbmd0aCgpKQotICAgICAgICBwb3N0Zml4ID0gc3dWYWx1ZS5NaWQocEV2ZW50SGFuZGxlci0+U2VsRW5kKCksIHN3VmFsdWUuR2V0TGVuZ3RoKCkgLSBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSk7Ci0gICAgZWxzZSBwb3N0Zml4ID0gTCIiOwotCi0gICAgdlJldCA9IChwcmVmaXggKyBwRXZlbnRIYW5kbGVyLT5DaGFuZ2UoKSArIHBvc3RmaXgpLmNfc3RyKCk7Ci0KKyAgaWYgKHBFdmVudEhhbmRsZXItPldpbGxDb21taXQoKSkgeworICAgIHZSZXQgPSBzd1ZhbHVlLmNfc3RyKCk7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBDRlhfV2lkZVN0cmluZyBwcmVmaXgsIHBvc3RmaXg7CisKKyAgaWYgKHBFdmVudEhhbmRsZXItPlNlbFN0YXJ0KCkgPj0gMCkKKyAgICBwcmVmaXggPSBzd1ZhbHVlLk1pZCgwLCBwRXZlbnRIYW5kbGVyLT5TZWxTdGFydCgpKTsKKyAgZWxzZQorICAgIHByZWZpeCA9IEwiIjsKKworICBpZiAocEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPj0gMCAmJgorICAgICAgcEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPD0gc3dWYWx1ZS5HZXRMZW5ndGgoKSkKKyAgICBwb3N0Zml4ID0gc3dWYWx1ZS5NaWQocEV2ZW50SGFuZGxlci0+U2VsRW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN3VmFsdWUuR2V0TGVuZ3RoKCkgLSBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSk7CisgIGVsc2UKKyAgICBwb3N0Zml4ID0gTCIiOworCisgIHZSZXQgPSAocHJlZml4ICsgcEV2ZW50SGFuZGxlci0+Q2hhbmdlKCkgKyBwb3N0Zml4KS5jX3N0cigpOworCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBhcnNlRGF0ZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBhcnNlRGF0ZUV4KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworCisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKworICBGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOworICBkb3VibGUgZERhdGUgPSBNYWtlUmVndWxhckRhdGUoc1ZhbHVlLCBzRm9ybWF0LCBiV3JvbmdGb3JtYXQpOworCisgIGlmIChKU19Qb3J0SXNOYW4oZERhdGUpKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CisgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBzRm9ybWF0LmNfc3RyKCkpOworICAgIEFsZXJ0KChDSlNfQ29udGV4dCopY2MsIHN3TXNnLmNfc3RyKCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHZSZXQgPSBkRGF0ZTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMykgeworICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogCi0gICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKLSAgICB7Ci0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLSAgICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwotCi0gICAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKLSAgICBkb3VibGUgZERhdGUgPSBNYWtlUmVndWxhckRhdGUoc1ZhbHVlLHNGb3JtYXQsYldyb25nRm9ybWF0KTsKLQotICAgIGlmIChKU19Qb3J0SXNOYW4oZERhdGUpKQotICAgIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7Ci0gICAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKLSAgICAgICAgQWxlcnQoKENKU19Db250ZXh0ICopY2MsIHN3TXNnLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgdlJldCA9IGREYXRlOwotICAgIHJldHVybiBUUlVFOworICB2UmV0ID0gKGRvdWJsZSlBRl9TaW1wbGUocGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9Eb3VibGUoKSwgcGFyYW1zWzJdLlRvRG91YmxlKCkpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAzKQotICAgIHsKLSAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0gICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQotICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgdlJldCA9IChkb3VibGUpQUZfU2ltcGxlKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLCBwYXJhbXNbMV0uVG9Eb3VibGUoKSwgcGFyYW1zWzJdLlRvRG91YmxlKCkpOwotICAgIHJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1ha2VOdW1iZXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQotICAgIHsKLSAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0gICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQotICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHZSZXQgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwotCi0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1ha2VOdW1iZXIoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQotICAgIHsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB2UmV0ID0gUGFyc2VTdHJpbmdUb051bWJlcihwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CisgIHJldHVybiBUUlVFOworfQogCi0gICAgQ0pTX1ZhbHVlIHBhcmFtczEgPSBwYXJhbXNbMV07CitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZV9DYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAKLSAgICBpZiAoIXBhcmFtczEuSXNBcnJheU9iamVjdCgpICYmIHBhcmFtczEuR2V0VHlwZSgpICE9IFZUX3N0cmluZykKLSAgICB7Ci0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKIAotICAgIENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKLSAgICBBU1NFUlQocFJlYWRlckRvYyAhPSBOVUxMKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLSAgICBDUERGU0RLX0ludGVyRm9ybSogcFJlYWRlckludGVyRm9ybSA9IHBSZWFkZXJEb2MtPkdldEludGVyRm9ybSgpOwotICAgIEFTU0VSVChwUmVhZGVySW50ZXJGb3JtICE9IE5VTEwpOworICBDSlNfVmFsdWUgcGFyYW1zMSA9IHBhcmFtc1sxXTsKIAotICAgIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisgIGlmICghcGFyYW1zMS5Jc0FycmF5T2JqZWN0KCkgJiYgcGFyYW1zMS5HZXRUeXBlKCkgIT0gVlRfc3RyaW5nKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotICAgIGRvdWJsZSBkVmFsdWU7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc0Z1bmN0aW9uID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgIGlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiUFJEIikgPT0gMCkKLSAgICAgICAgZFZhbHVlID0gMS4wOwotICAgIGVsc2UKLSAgICAgICAgZFZhbHVlID0gMC4wOworICBDUERGU0RLX0RvY3VtZW50KiBwUmVhZGVyRG9jID0gcENvbnRleHQtPkdldFJlYWRlckRvY3VtZW50KCk7CisgIEFTU0VSVChwUmVhZGVyRG9jICE9IE5VTEwpOwogCi0gICAgQ0pTX0FycmF5IEZpZWxkTmFtZUFycmF5ID0gQUZfTWFrZUFycmF5RnJvbUxpc3QoaXNvbGF0ZSxwYXJhbXMxKTsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBSZWFkZXJJbnRlckZvcm0gPSBwUmVhZGVyRG9jLT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBSZWFkZXJJbnRlckZvcm0gIT0gTlVMTCk7CiAKLSAgICBpbnQgbkZpZWxkc0NvdW50ID0gMDsKKyAgQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwUmVhZGVySW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CiAKLSAgICBmb3IgKGludCBpPTAsaXN6PUZpZWxkTmFtZUFycmF5LkdldExlbmd0aCgpOyBpPGlzejsgaSsrKQotICAgIHsKLSAgICAgICAgQ0pTX1ZhbHVlIGpzVmFsdWUoaXNvbGF0ZSk7Ci0gICAgICAgIEZpZWxkTmFtZUFycmF5LkdldEVsZW1lbnQoaSxqc1ZhbHVlKTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZE5hbWUgPSBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpOworICBkb3VibGUgZFZhbHVlOworICBDRlhfV2lkZVN0cmluZyBzRnVuY3Rpb24gPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CisgIGlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiUFJEIikgPT0gMCkKKyAgICBkVmFsdWUgPSAxLjA7CisgIGVsc2UKKyAgICBkVmFsdWUgPSAwLjA7CiAKLSAgICAgICAgZm9yIChpbnQgaj0wLGpzej1wSW50ZXJGb3JtLT5Db3VudEZpZWxkcyh3c0ZpZWxkTmFtZSk7IGo8anN6OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBJbnRlckZvcm0tPkdldEZpZWxkKGosIHdzRmllbGROYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgZFRlbXAgPSAwLjA7CisgIENKU19BcnJheSBGaWVsZE5hbWVBcnJheSA9IEFGX01ha2VBcnJheUZyb21MaXN0KGlzb2xhdGUsIHBhcmFtczEpOwogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgotICAgICAgICAgICAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkVGVtcCA9IFBhcnNlU3RyaW5nVG9OdW1iZXIocEZvcm1GaWVsZC0+R2V0VmFsdWUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZFRlbXAgPSAwLjA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotICAgICAgICAgICAgICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkVGVtcCA9IDAuMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGM9MCxjc3o9cEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBjPGNzejsgYysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGMpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBGb3JtQ3RybC0+SXNDaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRUZW1wICs9IFBhcnNlU3RyaW5nVG9OdW1iZXIocEZvcm1DdHJsLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkVGVtcCA9IDAuMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA+IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZFRlbXAgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisgIGludCBuRmllbGRzQ291bnQgPSAwOwogCi0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBqID09IDAgJiYgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNSU4iKSA9PSAwIHx8IHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNQVgiKSA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgZFZhbHVlID0gZFRlbXA7CisgIGZvciAoaW50IGkgPSAwLCBpc3ogPSBGaWVsZE5hbWVBcnJheS5HZXRMZW5ndGgoKTsgaSA8IGlzejsgaSsrKSB7CisgICAgQ0pTX1ZhbHVlIGpzVmFsdWUoaXNvbGF0ZSk7CisgICAgRmllbGROYW1lQXJyYXkuR2V0RWxlbWVudChpLCBqc1ZhbHVlKTsKKyAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkTmFtZSA9IGpzVmFsdWUuVG9DRlhXaWRlU3RyaW5nKCk7CiAKLSAgICAgICAgICAgICAgICBkVmFsdWUgPSBBRl9TaW1wbGUoc0Z1bmN0aW9uLmNfc3RyKCksIGRWYWx1ZSwgZFRlbXApOworICAgIGZvciAoaW50IGogPSAwLCBqc3ogPSBwSW50ZXJGb3JtLT5Db3VudEZpZWxkcyh3c0ZpZWxkTmFtZSk7IGogPCBqc3o7IGorKykgeworICAgICAgaWYgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gcEludGVyRm9ybS0+R2V0RmllbGQoaiwgd3NGaWVsZE5hbWUpKSB7CisgICAgICAgIGRvdWJsZSBkVGVtcCA9IDAuMDsKIAotICAgICAgICAgICAgICAgIG5GaWVsZHNDb3VudCsrOworICAgICAgICBzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKSB7CisgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgorICAgICAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOiB7CisgICAgICAgICAgICBkVGVtcCA9IFBhcnNlU3RyaW5nVG9OdW1iZXIocEZvcm1GaWVsZC0+R2V0VmFsdWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOiB7CisgICAgICAgICAgICBkVGVtcCA9IDAuMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKKyAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjogeworICAgICAgICAgICAgZFRlbXAgPSAwLjA7CisgICAgICAgICAgICBmb3IgKGludCBjID0gMCwgY3N6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBjIDwgY3N6OyBjKyspIHsKKyAgICAgICAgICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woYykpIHsKKyAgICAgICAgICAgICAgICBpZiAocEZvcm1DdHJsLT5Jc0NoZWNrZWQoKSkgeworICAgICAgICAgICAgICAgICAgZFRlbXAgKz0KKyAgICAgICAgICAgICAgICAgICAgICBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtQ3RybC0+R2V0RXhwb3J0VmFsdWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9MSVNUQk9YOiB7CisgICAgICAgICAgICBkVGVtcCA9IDAuMDsKKyAgICAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA+IDEpCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPT0gMCAmJiBqID09IDAgJiYgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNSU4iKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUFYIikgPT0gMCkpCisgICAgICAgICAgZFZhbHVlID0gZFRlbXA7CisKKyAgICAgICAgZFZhbHVlID0gQUZfU2ltcGxlKHNGdW5jdGlvbi5jX3N0cigpLCBkVmFsdWUsIGRUZW1wKTsKKworICAgICAgICBuRmllbGRzQ291bnQrKzsKKyAgICAgIH0KICAgICB9CisgIH0KIAotICAgIGlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiQVZHIikgPT0gMCAmJiBuRmllbGRzQ291bnQgPiAwKQotICAgICAgICBkVmFsdWUgLz0gbkZpZWxkc0NvdW50OworICBpZiAod2NzY21wKHNGdW5jdGlvbi5jX3N0cigpLCBMIkFWRyIpID09IDAgJiYgbkZpZWxkc0NvdW50ID4gMCkKKyAgICBkVmFsdWUgLz0gbkZpZWxkc0NvdW50OwogCi0gICAgZFZhbHVlID0gKGRvdWJsZSlmbG9vcihkVmFsdWUgKiBGWFNZU19wb3coKGRvdWJsZSkxMCwoZG91YmxlKTYpICsgMC40OSkgLyBGWFNZU19wb3coKGRvdWJsZSkxMCwoZG91YmxlKTYpOwotICAgIENKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUsZFZhbHVlKTsKLSAgICBpZigoQ0pTX0V2ZW50SGFuZGxlciopcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5tX3BWYWx1ZSkKLSAgICAgICAgKChDSlNfRXZlbnRIYW5kbGVyKilwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCkpLT5WYWx1ZSgpID0ganNWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgZFZhbHVlID0gKGRvdWJsZSlmbG9vcihkVmFsdWUgKiBGWFNZU19wb3coKGRvdWJsZSkxMCwgKGRvdWJsZSk2KSArIDAuNDkpIC8KKyAgICAgICAgICAgRlhTWVNfcG93KChkb3VibGUpMTAsIChkb3VibGUpNik7CisgIENKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUsIGRWYWx1ZSk7CisgIGlmICgoQ0pTX0V2ZW50SGFuZGxlciopcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5tX3BWYWx1ZSkKKyAgICAoKENKU19FdmVudEhhbmRsZXIqKXBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKSktPlZhbHVlKCkgPQorICAgICAgICBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgY3VycmVudCBldmVudCB0byBlbnN1cmUgdGhhdCBpdHMgdmFsdWUgaXMKICoqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0gICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotICAgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLSAgICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZSYW5nZV9WYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCi0gICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gNCkKLSAgICB7Ci0gICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDQpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0gICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBpZiAocEV2ZW50LT5WYWx1ZSgpLklzRW1wdHkoKSApCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIGRvdWJsZSBkRWVudFZhbHVlID0gYXRvZihDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocEV2ZW50LT5WYWx1ZSgpKSk7Ci0gICAgRlhfQk9PTCBiR3JlYXRlclRoYW4gPSBwYXJhbXNbMF0uVG9Cb29sKCk7Ci0gICAgZG91YmxlIGRHcmVhdGVyVGhhbiA9IHBhcmFtc1sxXS5Ub0RvdWJsZSgpOwotICAgIEZYX0JPT0wgYkxlc3NUaGFuID0gcGFyYW1zWzJdLlRvQm9vbCgpOwotICAgIGRvdWJsZSBkTGVzc1RoYW4gPSBwYXJhbXNbM10uVG9Eb3VibGUoKTsKLSAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKLQotICAgIGlmIChiR3JlYXRlclRoYW4gJiYgYkxlc3NUaGFuKQotICAgIHsKLSAgICAgICAgaWYgKGRFZW50VmFsdWUgPCBkR3JlYXRlclRoYW4gfHwgZEVlbnRWYWx1ZSA+IGRMZXNzVGhhbikKLSAgICAgICAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGJHcmVhdGVyVGhhbikKLSAgICB7Ci0gICAgICAgIGlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuKQotICAgICAgICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkFOR0UyKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYkxlc3NUaGFuKQotICAgIHsKLSAgICAgICAgaWYgKGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCi0gICAgICAgICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTMpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwotICAgIH0KLQotICAgIGlmICghc3dNc2cuSXNFbXB0eSgpKQotICAgIHsKLSAgICAgICAgQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwotICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKLSAgICB9CisgIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChwRXZlbnQtPlZhbHVlKCkuSXNFbXB0eSgpKQogICAgIHJldHVybiBUUlVFOworICBkb3VibGUgZEVlbnRWYWx1ZSA9IGF0b2YoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBFdmVudC0+VmFsdWUoKSkpOworICBGWF9CT09MIGJHcmVhdGVyVGhhbiA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKyAgZG91YmxlIGRHcmVhdGVyVGhhbiA9IHBhcmFtc1sxXS5Ub0RvdWJsZSgpOworICBGWF9CT09MIGJMZXNzVGhhbiA9IHBhcmFtc1syXS5Ub0Jvb2woKTsKKyAgZG91YmxlIGRMZXNzVGhhbiA9IHBhcmFtc1szXS5Ub0RvdWJsZSgpOworICBDRlhfV2lkZVN0cmluZyBzd01zZzsKKworICBpZiAoYkdyZWF0ZXJUaGFuICYmIGJMZXNzVGhhbikgeworICAgIGlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuIHx8IGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCisgICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTEpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOworICB9IGVsc2UgaWYgKGJHcmVhdGVyVGhhbikgeworICAgIGlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuKQorICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkFOR0UyKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKKyAgfSBlbHNlIGlmIChiTGVzc1RoYW4pIHsKKyAgICBpZiAoZEVlbnRWYWx1ZSA+IGRMZXNzVGhhbikKKyAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMykuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CisgIH0KKworICBpZiAoIXN3TXNnLklzRW1wdHkoKSkgeworICAgIEFsZXJ0KHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKKyAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZFeHRyYWN0TnVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKLSAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKIAotICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCi0gICAgewotICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIENKU19BcnJheSBudW1zKGlzb2xhdGUpOworCisgIENGWF9XaWRlU3RyaW5nIHN0ciA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc1BhcnQ7CisKKyAgaWYgKHN0ci5HZXRBdCgwKSA9PSBMJy4nIHx8IHN0ci5HZXRBdCgwKSA9PSBMJywnKQorICAgIHN0ciA9IEwiMCIgKyBzdHI7CisKKyAgaW50IG5JbmRleCA9IDA7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IHN0ci5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBGWF9XQ0hBUiB3YyA9IHN0ci5HZXRBdChpKTsKKyAgICBpZiAoSXNEaWdpdCgod2NoYXJfdCl3YykpIHsKKyAgICAgIHNQYXJ0ICs9IHdjOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIG51bXMuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBzUGFydC5jX3N0cigpKSk7CisgICAgICAgIHNQYXJ0ID0gTCIiOworICAgICAgICBuSW5kZXgrKzsKKyAgICAgIH0KICAgICB9CisgIH0KIAotICAgIENKU19BcnJheSBudW1zKGlzb2xhdGUpOworICBpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgbnVtcy5TZXRFbGVtZW50KG5JbmRleCwgQ0pTX1ZhbHVlKGlzb2xhdGUsIHNQYXJ0LmNfc3RyKCkpKTsKKyAgfQogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgIENGWF9XaWRlU3RyaW5nIHNQYXJ0OworICBpZiAobnVtcy5HZXRMZW5ndGgoKSA+IDApCisgICAgdlJldCA9IG51bXM7CisgIGVsc2UKKyAgICB2UmV0LlNldE51bGwoKTsKIAotICAgIGlmIChzdHIuR2V0QXQoMCkgPT0gTCcuJyB8fCBzdHIuR2V0QXQoMCkgPT0gTCcsJykKLSAgICAgICAgc3RyID0gTCIwIiArIHN0cjsKLQotICAgIGludCBuSW5kZXggPSAwOwotICAgIGZvciAoaW50IGk9MCwgc3o9c3RyLkdldExlbmd0aCgpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgICBGWF9XQ0hBUiB3YyA9IHN0ci5HZXRBdChpKTsKLSAgICAgICAgaWYgKElzRGlnaXQoKHdjaGFyX3Qpd2MpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzUGFydCArPSB3YzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzUGFydC5HZXRMZW5ndGgoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbnVtcy5TZXRFbGVtZW50KG5JbmRleCxDSlNfVmFsdWUoaXNvbGF0ZSxzUGFydC5jX3N0cigpKSk7Ci0gICAgICAgICAgICAgICAgc1BhcnQgPSBMIiI7Ci0gICAgICAgICAgICAgICAgbkluZGV4ICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICAgIG51bXMuU2V0RWxlbWVudChuSW5kZXgsQ0pTX1ZhbHVlKGlzb2xhdGUsc1BhcnQuY19zdHIoKSkpOwotICAgIH0KLQotICAgIGlmIChudW1zLkdldExlbmd0aCgpID4gMCkKLSAgICAgICAgdlJldCA9IG51bXM7Ci0gICAgZWxzZQotICAgICAgICB2UmV0LlNldE51bGwoKTsKLQotICAgIHJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvYXBwLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvYXBwLmNwcAppbmRleCBjNTEzOTY5Li5lZDFhN2NhIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9hcHAuY3BwCkBAIC0xNiwxNiArMTYsMTQgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9Eb2N1bWVudC5oIgogCitzdGF0aWMgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoSUZYSlNfQ29udGV4dCogY2MpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogCi1zdGF0aWMgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoSUZYSlNfQ29udGV4dCogY2MpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAotCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7Ci0KLQlyZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKKyAgcmV0dXJuIHBSdW50aW1lLT5HZXRJc29sYXRlKCk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGltZXJPYmogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNDIsMzYgKzQwLDI4IEBACiBJTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX1RpbWVyT2JqLCBUaW1lck9iaikKIAogVGltZXJPYmo6OlRpbWVyT2JqKENKU19PYmplY3QqIHBKU09iamVjdCkKLTogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksCi1tX3BUaW1lcihOVUxMKQoteworICAgIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksIG1fcFRpbWVyKE5VTEwpIHt9CiAKK1RpbWVyT2JqOjp+VGltZXJPYmooKSB7fQorCit2b2lkIFRpbWVyT2JqOjpTZXRUaW1lcihDSlNfVGltZXIqIHBUaW1lcikgeworICBtX3BUaW1lciA9IHBUaW1lcjsKIH0KIAotVGltZXJPYmo6On5UaW1lck9iaigpCi17CitDSlNfVGltZXIqIFRpbWVyT2JqOjpHZXRUaW1lcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFRpbWVyOwogfQogCi12b2lkIFRpbWVyT2JqOjpTZXRUaW1lcihDSlNfVGltZXIqIHBUaW1lcikKLXsKLQltX3BUaW1lciA9IHBUaW1lcjsKLX0KKyNkZWZpbmUgSlNfU1RSX1ZJRVdFUlRZUEVfUkVBREVSIEwiUmVhZGVyIgorI2RlZmluZSBKU19TVFJfVklFV0VSVFlQRV9TVEFOREFSRCBMIkV4Y2hhbmdlIgorI2RlZmluZSBKU19TVFJfVklFV0VSVkFSSUFUSU9OIEwiRnVsbCIKKyNkZWZpbmUgSlNfU1RSX1BMQVRGT1JNIEwiV0lOIgorI2RlZmluZSBKU19TVFJfTEFOR1VBTkdFIEwiRU5VIgorI2RlZmluZSBKU19TVFJfVklFV0VSVkVSU0lPTiA4CisjZGVmaW5lIEpTX1NUUl9WSUVXRVJWRVJTSU9OX1hGQSAxMQorI2RlZmluZSBKU19OVU1fRk9STVNWRVJTSU9OIDcKIAotQ0pTX1RpbWVyKiBUaW1lck9iajo6R2V0VGltZXIoKSBjb25zdAotewotCXJldHVybiBtX3BUaW1lcjsKLX0KLQotI2RlZmluZSBKU19TVFJfVklFV0VSVFlQRV9SRUFERVIJCUwiUmVhZGVyIgotI2RlZmluZSBKU19TVFJfVklFV0VSVFlQRV9TVEFOREFSRAkJTCJFeGNoYW5nZSIKLSNkZWZpbmUgSlNfU1RSX1ZJRVdFUlZBUklBVElPTgkJCUwiRnVsbCIKLSNkZWZpbmUgSlNfU1RSX1BMQVRGT1JNCQkJCQlMIldJTiIKLSNkZWZpbmUgSlNfU1RSX0xBTkdVQU5HRQkJCQlMIkVOVSIKLSNkZWZpbmUgSlNfU1RSX1ZJRVdFUlZFUlNJT04JCQk4Ci0jZGVmaW5lIEpTX1NUUl9WSUVXRVJWRVJTSU9OX1hGQQkJMTEKLSNkZWZpbmUgSlNfTlVNX0ZPUk1TVkVSU0lPTgkJCQk3Ci0KLSNkZWZpbmUgSlNfRklMRVBBVEhfTUFYTEVOCQkJCTIwMDAKKyNkZWZpbmUgSlNfRklMRVBBVEhfTUFYTEVOIDIwMDAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhcHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC03OSw4MjEgKzY5LDgxNiBAQAogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19QUk9QKENKU19BcHApCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoYWN0aXZlRG9jcykKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShjYWxjdWxhdGUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoZm9ybXNWZXJzaW9uKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGZzKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGZ1bGxzY3JlZW4pCi0JSlNfU1RBVElDX1BST1BfRU5UUlkobGFuZ3VhZ2UpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkobWVkaWEpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkocGxhdGZvcm0pCi0JSlNfU1RBVElDX1BST1BfRU5UUlkocnVudGltZUhpZ2hsaWdodCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWSh2aWV3ZXJUeXBlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHZpZXdlclZhcmlhdGlvbikKLQlKU19TVEFUSUNfUFJPUF9FTlRSWSh2aWV3ZXJWZXJzaW9uKQorSlNfU1RBVElDX1BST1BfRU5UUlkoYWN0aXZlRG9jcykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGNhbGN1bGF0ZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGZvcm1zVmVyc2lvbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGZzKQorSlNfU1RBVElDX1BST1BfRU5UUlkoZnVsbHNjcmVlbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGxhbmd1YWdlKQorSlNfU1RBVElDX1BST1BfRU5UUlkobWVkaWEpCitKU19TVEFUSUNfUFJPUF9FTlRSWShwbGF0Zm9ybSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHJ1bnRpbWVIaWdobGlnaHQpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh2aWV3ZXJUeXBlKQorSlNfU1RBVElDX1BST1BfRU5UUlkodmlld2VyVmFyaWF0aW9uKQorSlNfU1RBVElDX1BST1BfRU5UUlkodmlld2VyVmVyc2lvbikKIEVORF9KU19TVEFUSUNfUFJPUCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19NRVRIT0QoQ0pTX0FwcCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGFsZXJ0KQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYmVlcCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGJyb3dzZUZvckRvYykKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNsZWFySW50ZXJ2YWwpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShjbGVhclRpbWVPdXQpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShleGVjRGlhbG9nKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZXhlY01lbnVJdGVtKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZmluZENvbXBvbmVudCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdvQmFjaykKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdvRm9yd2FyZCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGxhdW5jaFVSTCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG1haWxNc2cpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShuZXdGREYpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShuZXdEb2MpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShvcGVuRG9jKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkob3BlbkZERikKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHBvcFVwTWVudUV4KQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkocG9wVXBNZW51KQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkocmVzcG9uc2UpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShzZXRJbnRlcnZhbCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNldFRpbWVPdXQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGFsZXJ0KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShiZWVwKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShicm93c2VGb3JEb2MpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNsZWFySW50ZXJ2YWwpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNsZWFyVGltZU91dCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZXhlY0RpYWxvZykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZXhlY01lbnVJdGVtKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShmaW5kQ29tcG9uZW50KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnb0JhY2spCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdvRm9yd2FyZCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkobGF1bmNoVVJMKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShtYWlsTXNnKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShuZXdGREYpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG5ld0RvYykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkob3BlbkRvYykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkob3BlbkZERikKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkocG9wVXBNZW51RXgpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHBvcFVwTWVudSkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkocmVzcG9uc2UpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNldEludGVydmFsKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzZXRUaW1lT3V0KQogRU5EX0pTX1NUQVRJQ19NRVRIT0QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0FwcCxhcHApCitJTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0FwcCwgYXBwKQogCi1hcHA6OmFwcChDSlNfT2JqZWN0ICogcEpTT2JqZWN0KQotICAgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSwKLSAgICAgbV9iQ2FsY3VsYXRlKHRydWUpLAotICAgICBtX2JSdW50aW1lSGlnaExpZ2h0KGZhbHNlKQoteworYXBwOjphcHAoQ0pTX09iamVjdCogcEpTT2JqZWN0KQorICAgIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksIG1fYkNhbGN1bGF0ZSh0cnVlKSwgbV9iUnVudGltZUhpZ2hMaWdodChmYWxzZSkge30KKworYXBwOjp+YXBwKHZvaWQpIHsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9hVGltZXIuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICBkZWxldGUgbV9hVGltZXJbaV07CisKKyAgbV9hVGltZXIuUmVtb3ZlQWxsKCk7CiB9CiAKLWFwcDo6fmFwcCh2b2lkKQotewotCWZvciAoaW50IGk9MCxzej1tX2FUaW1lci5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJZGVsZXRlIG1fYVRpbWVyW2ldOworRlhfQk9PTCBhcHA6OmFjdGl2ZURvY3MoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQltX2FUaW1lci5SZW1vdmVBbGwoKTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKTsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOworICBDUERGU0RLX0RvY3VtZW50KiBwQ3VyRG9jID0gcENvbnRleHQtPkdldFJlYWRlckRvY3VtZW50KCk7CisgIENKU19BcnJheSBhRG9jcyhwUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKKyAgaWYgKENQREZTREtfRG9jdW1lbnQqIHBEb2MgPSBwQXBwLT5HZXRTREtEb2N1bWVudCgpKSB7CisgICAgQ0pTX0RvY3VtZW50KiBwSlNEb2N1bWVudCA9IE5VTEw7CisgICAgaWYgKHBEb2MgPT0gcEN1ckRvYykgeworICAgICAgSlNGWE9iamVjdCBwT2JqID0gSlNfR2V0VGhpc09iaigqcFJ1bnRpbWUpOworICAgICAgaWYgKEpTX0dldE9iakRlZm5JRChwT2JqKSA9PSBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkRvY3VtZW50IikpCisgICAgICAgIHBKU0RvY3VtZW50ID0KKyAgICAgICAgICAgIChDSlNfRG9jdW1lbnQqKUpTX0dldFByaXZhdGUocFJ1bnRpbWUtPkdldElzb2xhdGUoKSwgcE9iaik7CisgICAgfSBlbHNlIHsKKyAgICAgIEpTRlhPYmplY3QgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgICAgICAqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkRvY3VtZW50IikpOworICAgICAgcEpTRG9jdW1lbnQgPSAoQ0pTX0RvY3VtZW50KilKU19HZXRQcml2YXRlKHBSdW50aW1lLT5HZXRJc29sYXRlKCksIHBPYmopOworICAgICAgQVNTRVJUKHBKU0RvY3VtZW50ICE9IE5VTEwpOworICAgIH0KKyAgICBhRG9jcy5TZXRFbGVtZW50KDAsIENKU19WYWx1ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwSlNEb2N1bWVudCkpOworICB9CisgIGlmIChhRG9jcy5HZXRMZW5ndGgoKSA+IDApCisgICAgdnAgPDwgYURvY3M7CisgIGVsc2UKKyAgICB2cC5TZXROdWxsKCk7CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgYXBwOjphY3RpdmVEb2NzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBpZiAoIXZwLklzR2V0dGluZygpKQotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIGFwcDo6Y2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CisgICAgbV9iQ2FsY3VsYXRlID0gKEZYX0JPT0wpYlZQOwogCi0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CisgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOwogICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLSAgICBDUERGU0RLX0RvY3VtZW50KiBwQ3VyRG9jID0gcENvbnRleHQtPkdldFJlYWRlckRvY3VtZW50KCk7CiAgICAgQ0pTX0FycmF5IGFEb2NzKHBSdW50aW1lLT5HZXRJc29sYXRlKCkpOwogICAgIGlmIChDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gcEFwcC0+R2V0U0RLRG9jdW1lbnQoKSkKLSAgICB7Ci0gICAgICAgIENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPSBOVUxMOwotICAgICAgICBpZiAocERvYyA9PSBwQ3VyRG9jKQotICAgICAgICB7Ci0gICAgICAgICAgICBKU0ZYT2JqZWN0IHBPYmogPSBKU19HZXRUaGlzT2JqKCpwUnVudGltZSk7Ci0gICAgICAgICAgICBpZiAoSlNfR2V0T2JqRGVmbklEKHBPYmopID09IEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRG9jdW1lbnQiKSkKLSAgICAgICAgICAgICAgICBwSlNEb2N1bWVudCA9IChDSlNfRG9jdW1lbnQqKUpTX0dldFByaXZhdGUocFJ1bnRpbWUtPkdldElzb2xhdGUoKSxwT2JqKTsKKyAgICAgIHBEb2MtPkdldEludGVyRm9ybSgpLT5FbmFibGVDYWxjdWxhdGUoKEZYX0JPT0wpbV9iQ2FsY3VsYXRlKTsKKyAgfSBlbHNlIHsKKyAgICB2cCA8PCAoYm9vbCltX2JDYWxjdWxhdGU7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgYXBwOjpmb3Jtc1ZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IEpTX05VTV9GT1JNU1ZFUlNJT047CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgYXBwOjp2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IEwidW5rbm93biI7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgYXBwOjp2aWV3ZXJWYXJpYXRpb24oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IEpTX1NUUl9WSUVXRVJWQVJJQVRJT047CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgYXBwOjp2aWV3ZXJWZXJzaW9uKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghdnAuSXNHZXR0aW5nKCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIENQREZTREtfRG9jdW1lbnQqIHBDdXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBDdXJEb2MtPkdldERvY3VtZW50KCk7CisgIGlmIChwRG9jLT5HZXREb2NUeXBlKCkgPT0gMSB8fCBwRG9jLT5HZXREb2NUeXBlKCkgPT0gMikKKyAgICB2cCA8PCBKU19TVFJfVklFV0VSVkVSU0lPTl9YRkE7CisgIGVsc2UKKyAgICB2cCA8PCBKU19TVFJfVklFV0VSVkVSU0lPTjsKKworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBhcHA6OnBsYXRmb3JtKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAgPDwgSlNfU1RSX1BMQVRGT1JNOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIGFwcDo6bGFuZ3VhZ2UoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKKyAgICB2cCA8PCBKU19TVFJfTEFOR1VBTkdFOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvLyBjcmVhdGVzIGEgbmV3IGZkZiBvYmplY3QgdGhhdCBjb250YWlucyBubyBkYXRhCisvLyBjb21tZW50OiBuZWVkIHJlYWRlciBzdXBwb3J0CisvLyBub3RlOgorLy8gQ0ZERl9Eb2N1bWVudCAqIENQREZEb2NfRW52aXJvbm1lbnQ6Ok5ld0ZERigpOworRlhfQk9PTCBhcHA6Om5ld0ZERihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOworfQorLy8gb3BlbnMgYSBzcGVjaWZpZWQgcGRmIGRvY3VtZW50IGFuZCByZXR1cm5zIGl0cyBkb2N1bWVudCBvYmplY3QKKy8vIGNvbW1lbnQ6bmVlZCByZWFkZXIgc3VwcG9ydAorLy8gbm90ZTogYXMgZGVmaW5lZCBpbiBqcyByZWZlcmVuY2UsIHRoZSBwcm90byBvZiB0aGlzIGZ1bmN0aW9uJ3MgZm91cnRoCisvLyBwYXJtZXRlcnMsIGhvdyBvbGQgYW4gZmRmIGRvY3VtZW50IHdoaWxlIGRvIG5vdCBzaG93IGl0LgorLy8gQ0ZERl9Eb2N1bWVudCAqIENQREZEb2NfRW52aXJvbm1lbnQ6Ok9wZW5GREYoc3RyaW5nIHN0clBhdGgsYm9vbCBiVXNlckNvbnYpOworCitGWF9CT09MIGFwcDo6b3BlbkZERihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIGFwcDo6YWxlcnQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOworICBpZiAoaVNpemUgPCAxKQorICAgIHJldHVybiBGQUxTRTsKKworICBDRlhfV2lkZVN0cmluZyBzd01zZyA9IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dUaXRsZSA9IEwiIjsKKyAgaW50IGlJY29uID0gMDsKKyAgaW50IGlUeXBlID0gMDsKKworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOworCisgIGlmIChpU2l6ZSA9PSAxKSB7CisgICAgaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfb2JqZWN0KSB7CisgICAgICBKU09iamVjdCBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKKyAgICAgIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlID0KKyAgICAgICAgICAgIEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjTXNnIik7CisgICAgICAgIHN3TXNnID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgVlRfdW5rbm93bikuVG9DRlhXaWRlU3RyaW5nKCk7CisKKyAgICAgICAgcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNUaXRsZSIpOworICAgICAgICBzd1RpdGxlID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgVlRfdW5rbm93bikuVG9DRlhXaWRlU3RyaW5nKCk7CisKKyAgICAgICAgcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMIm5JY29uIik7CisgICAgICAgIGlJY29uID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgVlRfdW5rbm93bikuVG9JbnQoKTsKKworICAgICAgICBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiblR5cGUiKTsKKyAgICAgICAgaVR5cGUgPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBWVF91bmtub3duKS5Ub0ludCgpOworICAgICAgfQorCisgICAgICBpZiAoc3dNc2cgPT0gTCIiKSB7CisgICAgICAgIENKU19BcnJheSBjYXJyYXkoaXNvbGF0ZSk7CisgICAgICAgIGlmIChwYXJhbXNbMF0uQ29udmVydFRvQXJyYXkoY2FycmF5KSkgeworICAgICAgICAgIGludCBpTGVudGggPSBjYXJyYXkuR2V0TGVuZ3RoKCk7CisgICAgICAgICAgQ0pTX1ZhbHVlKiBwVmFsdWUgPSBuZXcgQ0pTX1ZhbHVlKGlzb2xhdGUpOworICAgICAgICAgIC8vCQkJCQlpZiAoaUxlbnRoID09IDEpCisgICAgICAgICAgLy8JCQkJCQlwVmFsdWUgPSBuZXcKKyAgICAgICAgICAvL0NKU19WYWx1ZShpc29sYXRlKTsKKyAgICAgICAgICAvLwkJCQkJZWxzZSBpZiAoaUxlbnRoID4gMSkKKyAgICAgICAgICAvLwkJCQkJCXBWYWx1ZSA9IG5ldworICAgICAgICAgIC8vQ0pTX1ZhbHVlW2lMZW50aF07CisKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlMZW50aDsgaSsrKSB7CisgICAgICAgICAgICBjYXJyYXkuR2V0RWxlbWVudChpLCAqcFZhbHVlKTsKKyAgICAgICAgICAgIHN3TXNnICs9ICgqcFZhbHVlKS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChpIDwgaUxlbnRoIC0gMSkKKyAgICAgICAgICAgICAgc3dNc2cgKz0gTCIsICAiOworICAgICAgICAgIH0KKworICAgICAgICAgIGRlbGV0ZSBwVmFsdWU7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBKU0ZYT2JqZWN0IHBPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSxMIkRvY3VtZW50IikpOwotICAgICAgICAgICAgcEpTRG9jdW1lbnQgPSAoQ0pTX0RvY3VtZW50KilKU19HZXRQcml2YXRlKHBSdW50aW1lLT5HZXRJc29sYXRlKCkscE9iaik7Ci0gICAgICAgICAgICBBU1NFUlQocEpTRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgYURvY3MuU2V0RWxlbWVudCgwLENKU19WYWx1ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpLHBKU0RvY3VtZW50KSk7CisgICAgICB9CisKKyAgICAgIGlmIChzd1RpdGxlID09IEwiIikKKyAgICAgICAgc3dUaXRsZSA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNBTEVSVCk7CisgICAgfSBlbHNlIGlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX2Jvb2xlYW4pIHsKKyAgICAgIEZYX0JPT0wgYkdldCA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKyAgICAgIGlmIChiR2V0KQorICAgICAgICBzd01zZyA9IEwidHJ1ZSI7CisgICAgICBlbHNlCisgICAgICAgIHN3TXNnID0gTCJmYWxzZSI7CisKKyAgICAgIHN3VGl0bGUgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTQUxFUlQpOworICAgIH0gZWxzZSB7CisgICAgICBzd01zZyA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICAgIHN3VGl0bGUgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTQUxFUlQpOwogICAgIH0KLSAgICBpZiAoYURvY3MuR2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICB2cCA8PCBhRG9jczsKLSAgICBlbHNlCi0gICAgICAgIHZwLlNldE51bGwoKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9ib29sZWFuKSB7CisgICAgICBGWF9CT09MIGJHZXQgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CisgICAgICBpZiAoYkdldCkKKyAgICAgICAgc3dNc2cgPSBMInRydWUiOworICAgICAgZWxzZQorICAgICAgICBzd01zZyA9IEwiZmFsc2UiOworICAgIH0gZWxzZSB7CisgICAgICBzd01zZyA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICB9CisgICAgc3dUaXRsZSA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNBTEVSVCk7CiAKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGlTaXplOyBpKyspIHsKKyAgICAgIGlmIChpID09IDEpCisgICAgICAgIGlJY29uID0gcGFyYW1zW2ldLlRvSW50KCk7CisgICAgICBpZiAoaSA9PSAyKQorICAgICAgICBpVHlwZSA9IHBhcmFtc1tpXS5Ub0ludCgpOworICAgICAgaWYgKGkgPT0gMykKKyAgICAgICAgc3dUaXRsZSA9IHBhcmFtc1tpXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICB9CisgIH0KKworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKKyAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworICBwUnVudGltZS0+QmVnaW5CbG9jaygpOworICB2UmV0ID0gTXNnQm94KHBSdW50aW1lLT5HZXRSZWFkZXJBcHAoKSwgSlNHZXRQYWdlVmlldyhjYyksIHN3TXNnLmNfc3RyKCksCisgICAgICAgICAgICAgICAgc3dUaXRsZS5jX3N0cigpLCBpVHlwZSwgaUljb24pOworICBwUnVudGltZS0+RW5kQmxvY2soKTsKKworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBhcHA6OmJlZXAoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAocGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBSdW50aW1lLT5HZXRSZWFkZXJBcHAoKTsKKyAgICBwRW52LT5KU19hcHBCZWVwKHBhcmFtc1swXS5Ub0ludCgpKTsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIGFwcDo6Y2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlib29sIGJWUDsKLQkJdnAgPj4gYlZQOwotCQltX2JDYWxjdWxhdGUgPSAoRlhfQk9PTCliVlA7Ci0KLQkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQkJQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKTsKLQkJQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCQlDSlNfQXJyYXkgYURvY3MocFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7Ci0JCWlmIChDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gcEFwcC0+R2V0U0RLRG9jdW1lbnQoKSkKLQkJCXBEb2MtPkdldEludGVyRm9ybSgpLT5FbmFibGVDYWxjdWxhdGUoKEZYX0JPT0wpbV9iQ2FsY3VsYXRlKTsKLQl9Ci0JZWxzZQotCXsKLQkJdnAgPDwgKGJvb2wpbV9iQ2FsY3VsYXRlOwotCX0KLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgYXBwOjpmaW5kQ29tcG9uZW50KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgYXBwOjpmb3Jtc1ZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IEpTX05VTV9GT1JNU1ZFUlNJT047Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgYXBwOjpwb3BVcE1lbnVFeChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBhcHA6OnZpZXdlclR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IEwidW5rbm93biI7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgYXBwOjpmcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIGFwcDo6dmlld2VyVmFyaWF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAodnAuSXNHZXR0aW5nKCkpCi0JewotCQl2cCA8PCBKU19TVFJfVklFV0VSVkFSSUFUSU9OOwotCQlyZXR1cm4gVFJVRTsKLQl9CitGWF9CT09MIGFwcDo6c2V0SW50ZXJ2YWwoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBpZiAocGFyYW1zLnNpemUoKSA+IDIgfHwgcGFyYW1zLnNpemUoKSA9PSAwKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCXJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBhcHA6OnZpZXdlclZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICghdnAuSXNHZXR0aW5nKCkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotICAgIENQREZTREtfRG9jdW1lbnQqIHBDdXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKLSAgICBDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcEN1ckRvYy0+R2V0RG9jdW1lbnQoKTsKLSAgICBpZiAocERvYy0+R2V0RG9jVHlwZSgpID09IDEgfHwgcERvYy0+R2V0RG9jVHlwZSgpID09IDIpCi0gICAgICAgIHZwIDw8IEpTX1NUUl9WSUVXRVJWRVJTSU9OX1hGQTsKLSAgICBlbHNlCi0gICAgICAgIHZwIDw8IEpTX1NUUl9WSUVXRVJWRVJTSU9OOwotCisgIENGWF9XaWRlU3RyaW5nIHNjcmlwdCA9IHBhcmFtcy5zaXplKCkgPiAwID8gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpIDogTCIiOworICBpZiAoc2NyaXB0LklzRW1wdHkoKSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKKyAgRlhfRFdPUkQgZHdJbnRlcnZhbCA9IHBhcmFtcy5zaXplKCkgPiAxID8gcGFyYW1zWzFdLlRvSW50KCkgOiAxMDAwOworCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7CisgIEFTU0VSVChwQXBwKTsKKyAgQ0pTX1RpbWVyKiBwVGltZXIgPSBuZXcgQ0pTX1RpbWVyKHRoaXMsIHBBcHApOworICBtX2FUaW1lci5BZGQocFRpbWVyKTsKKworICBwVGltZXItPlNldFR5cGUoMCk7CisgIHBUaW1lci0+U2V0UnVudGltZShwUnVudGltZSk7CisgIHBUaW1lci0+U2V0SlNjcmlwdChzY3JpcHQpOworICBwVGltZXItPlNldFRpbWVPdXQoMCk7CisgIC8vCXBUaW1lci0+U2V0U3RhcnRUaW1lKEdldFRpY2tDb3VudCgpKTsKKyAgcFRpbWVyLT5TZXRKU1RpbWVyKGR3SW50ZXJ2YWwpOworCisgIEpTRlhPYmplY3QgcFJldE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgICpwUnVudGltZSwgcENvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiVGltZXJPYmoiKSk7CisKKyAgQ0pTX1RpbWVyT2JqKiBwSlNfVGltZXJPYmogPQorICAgICAgKENKU19UaW1lck9iaiopSlNfR2V0UHJpdmF0ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwUmV0T2JqKTsKKyAgQVNTRVJUKHBKU19UaW1lck9iaiAhPSBOVUxMKTsKKworICBUaW1lck9iaiogcFRpbWVyT2JqID0gKFRpbWVyT2JqKilwSlNfVGltZXJPYmotPkdldEVtYmVkT2JqZWN0KCk7CisgIEFTU0VSVChwVGltZXJPYmogIT0gTlVMTCk7CisKKyAgcFRpbWVyT2JqLT5TZXRUaW1lcihwVGltZXIpOworCisgIHZSZXQgPSBwUmV0T2JqOworCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6cGxhdGZvcm0oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IEpTX1NUUl9QTEFURk9STTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQorRlhfQk9PTCBhcHA6OnNldFRpbWVPdXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAocGFyYW1zLnNpemUoKSA+IDIgfHwgcGFyYW1zLnNpemUoKSA9PSAwKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKKyAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworCisgIENGWF9XaWRlU3RyaW5nIHNjcmlwdCA9IHBhcmFtcy5zaXplKCkgPiAwID8gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpIDogTCIiOworICBpZiAoc2NyaXB0LklzRW1wdHkoKSkgeworICAgIHNFcnJvciA9CisgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgRlhfRFdPUkQgZHdUaW1lT3V0ID0gcGFyYW1zLnNpemUoKSA+IDEgPyBwYXJhbXNbMV0uVG9JbnQoKSA6IDEwMDA7CisKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBSdW50aW1lLT5HZXRSZWFkZXJBcHAoKTsKKyAgQVNTRVJUKHBBcHApOworCisgIENKU19UaW1lciogcFRpbWVyID0gbmV3IENKU19UaW1lcih0aGlzLCBwQXBwKTsKKyAgbV9hVGltZXIuQWRkKHBUaW1lcik7CisKKyAgcFRpbWVyLT5TZXRUeXBlKDEpOworICBwVGltZXItPlNldFJ1bnRpbWUocFJ1bnRpbWUpOworICBwVGltZXItPlNldEpTY3JpcHQoc2NyaXB0KTsKKyAgcFRpbWVyLT5TZXRUaW1lT3V0KGR3VGltZU91dCk7CisgIHBUaW1lci0+U2V0SlNUaW1lcihkd1RpbWVPdXQpOworCisgIEpTRlhPYmplY3QgcFJldE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgICpwUnVudGltZSwgcENvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiVGltZXJPYmoiKSk7CisKKyAgQ0pTX1RpbWVyT2JqKiBwSlNfVGltZXJPYmogPQorICAgICAgKENKU19UaW1lck9iaiopSlNfR2V0UHJpdmF0ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwUmV0T2JqKTsKKyAgQVNTRVJUKHBKU19UaW1lck9iaiAhPSBOVUxMKTsKKworICBUaW1lck9iaiogcFRpbWVyT2JqID0gKFRpbWVyT2JqKilwSlNfVGltZXJPYmotPkdldEVtYmVkT2JqZWN0KCk7CisgIEFTU0VSVChwVGltZXJPYmogIT0gTlVMTCk7CisKKyAgcFRpbWVyT2JqLT5TZXRUaW1lcihwVGltZXIpOworCisgIHZSZXQgPSBwUmV0T2JqOworCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6bGFuZ3VhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IEpTX1NUUl9MQU5HVUFOR0U7Ci0JCXJldHVybiBUUlVFOwotCX0KK0ZYX0JPT0wgYXBwOjpjbGVhclRpbWVPdXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKKyAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwogCi0JcmV0dXJuIEZBTFNFOworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX2Z4b2JqZWN0KSB7CisgICAgSlNGWE9iamVjdCBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKKyAgICB7CisgICAgICBpZiAoSlNfR2V0T2JqRGVmbklEKHBPYmopID09IEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiVGltZXJPYmoiKSkgeworICAgICAgICBpZiAoQ0pTX09iamVjdCogcEpTT2JqID0gcGFyYW1zWzBdLlRvQ0pTT2JqZWN0KCkpIHsKKyAgICAgICAgICBpZiAoVGltZXJPYmoqIHBUaW1lck9iaiA9IChUaW1lck9iaiopcEpTT2JqLT5HZXRFbWJlZE9iamVjdCgpKSB7CisgICAgICAgICAgICBpZiAoQ0pTX1RpbWVyKiBwVGltZXIgPSBwVGltZXJPYmotPkdldFRpbWVyKCkpIHsKKyAgICAgICAgICAgICAgcFRpbWVyLT5LaWxsSlNUaW1lcigpOworCisgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fYVRpbWVyLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobV9hVGltZXJbaV0gPT0gcFRpbWVyKSB7CisgICAgICAgICAgICAgICAgICBtX2FUaW1lci5SZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGRlbGV0ZSBwVGltZXI7CisgICAgICAgICAgICAgIHBUaW1lck9iai0+U2V0VGltZXIoTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLS8vY3JlYXRlcyBhIG5ldyBmZGYgb2JqZWN0IHRoYXQgY29udGFpbnMgbm8gZGF0YQotLy9jb21tZW50OiBuZWVkIHJlYWRlciBzdXBwb3J0Ci0vL25vdGU6Ci0vL0NGREZfRG9jdW1lbnQgKiBDUERGRG9jX0Vudmlyb25tZW50OjpOZXdGREYoKTsKLUZYX0JPT0wgYXBwOjpuZXdGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gVFJVRTsKLX0KLS8vb3BlbnMgYSBzcGVjaWZpZWQgcGRmIGRvY3VtZW50IGFuZCByZXR1cm5zIGl0cyBkb2N1bWVudCBvYmplY3QKLS8vY29tbWVudDpuZWVkIHJlYWRlciBzdXBwb3J0Ci0vL25vdGU6IGFzIGRlZmluZWQgaW4ganMgcmVmZXJlbmNlLCB0aGUgcHJvdG8gb2YgdGhpcyBmdW5jdGlvbidzIGZvdXJ0aCBwYXJtZXRlcnMsIGhvdyBvbGQgYW4gZmRmIGRvY3VtZW50IHdoaWxlIGRvIG5vdCBzaG93IGl0LgotLy9DRkRGX0RvY3VtZW50ICogQ1BERkRvY19FbnZpcm9ubWVudDo6T3BlbkZERihzdHJpbmcgc3RyUGF0aCxib29sIGJVc2VyQ29udik7CitGWF9CT09MIGFwcDo6Y2xlYXJJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOworICBBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CiAKLUZYX0JPT0wgYXBwOjpvcGVuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfZnhvYmplY3QpIHsKKyAgICBKU0ZYT2JqZWN0IHBPYmogPSBwYXJhbXNbMF0uVG9WOE9iamVjdCgpOworICAgIHsKKyAgICAgIGlmIChKU19HZXRPYmpEZWZuSUQocE9iaikgPT0gSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJUaW1lck9iaiIpKSB7CisgICAgICAgIGlmIChDSlNfT2JqZWN0KiBwSlNPYmogPSBwYXJhbXNbMF0uVG9DSlNPYmplY3QoKSkgeworICAgICAgICAgIGlmIChUaW1lck9iaiogcFRpbWVyT2JqID0gKFRpbWVyT2JqKilwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpIHsKKyAgICAgICAgICAgIGlmIChDSlNfVGltZXIqIHBUaW1lciA9IHBUaW1lck9iai0+R2V0VGltZXIoKSkgeworICAgICAgICAgICAgICBwVGltZXItPktpbGxKU1RpbWVyKCk7CisKKyAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9hVGltZXIuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtX2FUaW1lcltpXSA9PSBwVGltZXIpIHsKKyAgICAgICAgICAgICAgICAgIG1fYVRpbWVyLlJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZGVsZXRlIHBUaW1lcjsKKyAgICAgICAgICAgICAgcFRpbWVyT2JqLT5TZXRUaW1lcihOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBhcHA6OmFsZXJ0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaVNpemUgPCAxKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlDRlhfV2lkZVN0cmluZyBzd01zZyA9IEwiIjsKLQlDRlhfV2lkZVN0cmluZyBzd1RpdGxlID0gTCIiOwotCWludCBpSWNvbiA9IDA7Ci0JaW50IGlUeXBlID0gMDsKLQotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7Ci0KLQlpZiAoaVNpemUgPT0gMSkKLQl7Ci0JCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX29iamVjdCkKLQkJewotCQkJSlNPYmplY3QgcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KCk7Ci0JCQl7Ci0JCQkJdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNNc2ciKTsKLQkJCQlzd01zZyA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIFZUX3Vua25vd24pLlRvQ0ZYV2lkZVN0cmluZygpOwotCi0JCQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNUaXRsZSIpOwotCQkJCXN3VGl0bGUgPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBWVF91bmtub3duKS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQotCQkJCXBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJuSWNvbiIpOwotCQkJCWlJY29uID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgVlRfdW5rbm93bikuVG9JbnQoKTsKLQotCQkJCXBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJuVHlwZSIpOwotCQkJCWlUeXBlID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgVlRfdW5rbm93bikuVG9JbnQoKTsKLQkJCX0KLQotCQkJaWYgKHN3TXNnID09IEwiIikKLQkJCXsKLQkJCQlDSlNfQXJyYXkgY2FycmF5KGlzb2xhdGUpOwotCQkJCWlmIChwYXJhbXNbMF0uQ29udmVydFRvQXJyYXkoY2FycmF5KSkKLQkJCQl7Ci0JCQkJCWludCBpTGVudGggPSBjYXJyYXkuR2V0TGVuZ3RoKCk7Ci0JCQkJCUNKU19WYWx1ZSogcFZhbHVlID0gbmV3IENKU19WYWx1ZShpc29sYXRlKTsKLS8vCQkJCQlpZiAoaUxlbnRoID09IDEpCi0vLwkJCQkJCXBWYWx1ZSA9IG5ldyBDSlNfVmFsdWUoaXNvbGF0ZSk7Ci0vLwkJCQkJZWxzZSBpZiAoaUxlbnRoID4gMSkKLS8vCQkJCQkJcFZhbHVlID0gbmV3IENKU19WYWx1ZVtpTGVudGhdOwotCi0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBpTGVudGg7IGkrKykKLQkJCQkJewotCQkJCQkJY2FycmF5LkdldEVsZW1lbnQoaSwgKnBWYWx1ZSk7Ci0JCQkJCQlzd01zZyArPSAoKnBWYWx1ZSkuVG9DRlhXaWRlU3RyaW5nKCk7Ci0JCQkJCQlpZiAoaSA8IGlMZW50aCAtIDEpCi0JCQkJCQkJc3dNc2cgKz0gTCIsICAiOwotCQkJCQl9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFZhbHVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHN3VGl0bGUgPT0gTCIiKQotCQkJCXN3VGl0bGUgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTQUxFUlQpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfYm9vbGVhbikKLQkJewotCQkJRlhfQk9PTCBiR2V0ID0gcGFyYW1zWzBdLlRvQm9vbCgpOwotCQkJaWYgKGJHZXQpCi0JCQkJc3dNc2cgPSBMInRydWUiOwotCQkJZWxzZQotCQkJCXN3TXNnID0gTCJmYWxzZSI7Ci0KLQkJCXN3VGl0bGUgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTQUxFUlQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3dNc2cgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JCQlzd1RpdGxlID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU0FMRVJUKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9ib29sZWFuKQotCQl7Ci0JCQlGWF9CT09MIGJHZXQgPSBwYXJhbXNbMF0uVG9Cb29sKCk7Ci0JCQlpZiAoYkdldCkKLQkJCQlzd01zZyA9IEwidHJ1ZSI7Ci0JCQllbHNlCi0JCQkJc3dNc2cgPSBMImZhbHNlIjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN3TXNnID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotCQl9Ci0JCXN3VGl0bGUgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTQUxFUlQpOwotCi0JCWZvcihpbnQgaSA9IDE7aTxpU2l6ZTtpKyspCi0JCXsKLQkJCWlmIChpID09IDEpCi0JCQkJaUljb24gPSBwYXJhbXNbaV0uVG9JbnQoKTsKLQkJCWlmIChpID09IDIpCi0JCQkJaVR5cGUgPSBwYXJhbXNbaV0uVG9JbnQoKTsKLQkJCWlmIChpID09IDMpCi0JCQkJc3dUaXRsZSA9IHBhcmFtc1tpXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQkJfQotCX0KLQotCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKLQlwUnVudGltZS0+QmVnaW5CbG9jaygpOwotCXZSZXQgPSBNc2dCb3gocFJ1bnRpbWUtPkdldFJlYWRlckFwcCgpLCBKU0dldFBhZ2VWaWV3KGNjKSwgc3dNc2cuY19zdHIoKSwgc3dUaXRsZS5jX3N0cigpLCBpVHlwZSwgaUljb24pOwotCXBSdW50aW1lLT5FbmRCbG9jaygpOwotCi0JcmV0dXJuIFRSVUU7CitGWF9CT09MIGFwcDo6ZXhlY01lbnVJdGVtKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCit2b2lkIGFwcDo6VGltZXJQcm9jKENKU19UaW1lciogcFRpbWVyKSB7CisgIEFTU0VSVChwVGltZXIgIT0gTlVMTCk7CiAKLUZYX0JPT0wgYXBwOjpiZWVwKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHBhcmFtcy5zaXplKCkgPT0gMSkKLQl7Ci0JCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQkJQ1BERkRvY19FbnZpcm9ubWVudCAqIHBFbnYgPSBwUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7Ci0JCXBFbnYtPkpTX2FwcEJlZXAocGFyYW1zWzBdLlRvSW50KCkpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JcmV0dXJuIEZBTFNFOworICBzd2l0Y2ggKHBUaW1lci0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSAwOiAgLy8gaW50ZXJ2YWwKKyAgICAgIFJ1bkpzU2NyaXB0KHBUaW1lci0+R2V0UnVudGltZSgpLCBwVGltZXItPkdldEpTY3JpcHQoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBpZiAocFRpbWVyLT5HZXRUaW1lT3V0KCkgPiAwKSB7CisgICAgICAgIFJ1bkpzU2NyaXB0KHBUaW1lci0+R2V0UnVudGltZSgpLCBwVGltZXItPkdldEpTY3JpcHQoKSk7CisgICAgICAgIHBUaW1lci0+S2lsbEpTVGltZXIoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CiB9CiAKLUZYX0JPT0wgYXBwOjpmaW5kQ29tcG9uZW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7Cit2b2lkIGFwcDo6UnVuSnNTY3JpcHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTY3JpcHQpIHsKKyAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworCisgIGlmICghcFJ1bnRpbWUtPklzQmxvY2tpbmcoKSkgeworICAgIElGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKKyAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgICAgcENvbnRleHQtPk9uRXh0ZXJuYWxfRXhlYygpOworICAgIENGWF9XaWRlU3RyaW5nIHd0SW5mbzsKKyAgICBwQ29udGV4dC0+UnVuU2NyaXB0KHdzU2NyaXB0LCB3dEluZm8pOworICAgIHBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7CisgIH0KIH0KIAotRlhfQk9PTCBhcHA6OnBvcFVwTWVudUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIGFwcDo6ZnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBhcHA6OnNldEludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlpZiAocGFyYW1zLnNpemUoKSA+IDIgfHwgcGFyYW1zLnNpemUoKSA9PSAwKQotCXsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCUNGWF9XaWRlU3RyaW5nIHNjcmlwdCA9IHBhcmFtcy5zaXplKCkgPiAwID8gIHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKLQlpZiAoc2NyaXB0LklzRW1wdHkoKSkKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCUZYX0RXT1JEIGR3SW50ZXJ2YWwgPSBwYXJhbXMuc2l6ZSgpID4gMSA/IHBhcmFtc1sxXS5Ub0ludCgpIDogMTAwMDsKLQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7Ci0JQVNTRVJUKHBBcHApOwotCUNKU19UaW1lciogcFRpbWVyID0gbmV3IENKU19UaW1lcih0aGlzLCBwQXBwKTsKLQltX2FUaW1lci5BZGQocFRpbWVyKTsKLQotCXBUaW1lci0+U2V0VHlwZSgwKTsKLQlwVGltZXItPlNldFJ1bnRpbWUocFJ1bnRpbWUpOwotCXBUaW1lci0+U2V0SlNjcmlwdChzY3JpcHQpOwotCXBUaW1lci0+U2V0VGltZU91dCgwKTsKLS8vCXBUaW1lci0+U2V0U3RhcnRUaW1lKEdldFRpY2tDb3VudCgpKTsKLQlwVGltZXItPlNldEpTVGltZXIoZHdJbnRlcnZhbCk7Ci0KLQlKU0ZYT2JqZWN0IHBSZXRPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJUaW1lck9iaiIpKTsKLQotCUNKU19UaW1lck9iaiogcEpTX1RpbWVyT2JqID0gKENKU19UaW1lck9iaiopSlNfR2V0UHJpdmF0ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpLHBSZXRPYmopOwotCUFTU0VSVChwSlNfVGltZXJPYmogIT0gTlVMTCk7Ci0KLQlUaW1lck9iaiogcFRpbWVyT2JqID0gKFRpbWVyT2JqKilwSlNfVGltZXJPYmotPkdldEVtYmVkT2JqZWN0KCk7Ci0JQVNTRVJUKHBUaW1lck9iaiAhPSBOVUxMKTsKLQotCXBUaW1lck9iai0+U2V0VGltZXIocFRpbWVyKTsKLQotCXZSZXQgPSBwUmV0T2JqOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgYXBwOjpzZXRUaW1lT3V0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHBhcmFtcy5zaXplKCkgPiAyIHx8IHBhcmFtcy5zaXplKCkgPT0gMCkKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7Ci0KLQlDRlhfV2lkZVN0cmluZyBzY3JpcHQgPSBwYXJhbXMuc2l6ZSgpID4gMCA/IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKLQlpZiAoc2NyaXB0LklzRW1wdHkoKSkKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlGWF9EV09SRCBkd1RpbWVPdXQgPSBwYXJhbXMuc2l6ZSgpID4gMSA/IHBhcmFtc1sxXS5Ub0ludCgpIDogMTAwMDsKLQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7Ci0JQVNTRVJUKHBBcHApOwotCi0JQ0pTX1RpbWVyKiBwVGltZXIgPSBuZXcgQ0pTX1RpbWVyKHRoaXMsIHBBcHApOwotCW1fYVRpbWVyLkFkZChwVGltZXIpOwotCi0JcFRpbWVyLT5TZXRUeXBlKDEpOwotCXBUaW1lci0+U2V0UnVudGltZShwUnVudGltZSk7Ci0JcFRpbWVyLT5TZXRKU2NyaXB0KHNjcmlwdCk7Ci0JcFRpbWVyLT5TZXRUaW1lT3V0KGR3VGltZU91dCk7Ci0JcFRpbWVyLT5TZXRKU1RpbWVyKGR3VGltZU91dCk7Ci0KLQlKU0ZYT2JqZWN0IHBSZXRPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJUaW1lck9iaiIpKTsKLQotCUNKU19UaW1lck9iaiogcEpTX1RpbWVyT2JqID0gKENKU19UaW1lck9iaiopSlNfR2V0UHJpdmF0ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpLHBSZXRPYmopOwotCUFTU0VSVChwSlNfVGltZXJPYmogIT0gTlVMTCk7Ci0KLQlUaW1lck9iaiogcFRpbWVyT2JqID0gKFRpbWVyT2JqKilwSlNfVGltZXJPYmotPkdldEVtYmVkT2JqZWN0KCk7Ci0JQVNTRVJUKHBUaW1lck9iaiAhPSBOVUxMKTsKLQotCXBUaW1lck9iai0+U2V0VGltZXIocFRpbWVyKTsKLQotCXZSZXQgPSBwUmV0T2JqOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgYXBwOjpjbGVhclRpbWVPdXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0JQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwotCi0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX2Z4b2JqZWN0KQotCXsKLQkJSlNGWE9iamVjdCBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKLQkJewotCQkJaWYgKEpTX0dldE9iakRlZm5JRChwT2JqKSA9PSBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIlRpbWVyT2JqIikpCi0JCQl7Ci0JCQkJaWYgKENKU19PYmplY3QqIHBKU09iaiA9IHBhcmFtc1swXS5Ub0NKU09iamVjdCgpKQotCQkJCXsKLQkJCQkJaWYgKFRpbWVyT2JqKiBwVGltZXJPYmogPSAoVGltZXJPYmoqKXBKU09iai0+R2V0RW1iZWRPYmplY3QoKSkKLQkJCQkJewotCQkJCQkJaWYgKENKU19UaW1lciogcFRpbWVyID0gcFRpbWVyT2JqLT5HZXRUaW1lcigpKQotCQkJCQkJewotCQkJCQkJCXBUaW1lci0+S2lsbEpTVGltZXIoKTsKLQotCQkJCQkJCWZvciAoaW50IGk9MCxzej1tX2FUaW1lci5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCQkJCQl7Ci0JCQkJCQkJCWlmIChtX2FUaW1lcltpXSA9PSBwVGltZXIpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCW1fYVRpbWVyLlJlbW92ZUF0KGkpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCQlkZWxldGUgcFRpbWVyOwotCQkJCQkJCXBUaW1lck9iai0+U2V0VGltZXIoTlVMTCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBhcHA6OmNsZWFySW50ZXJ2YWwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0JQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwotCi0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX2Z4b2JqZWN0KQotCXsKLQkJSlNGWE9iamVjdCBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKLQkJewotCQkJaWYgKEpTX0dldE9iakRlZm5JRChwT2JqKSA9PSBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIlRpbWVyT2JqIikpCi0JCQl7Ci0JCQkJaWYgKENKU19PYmplY3QqIHBKU09iaiA9IHBhcmFtc1swXS5Ub0NKU09iamVjdCgpKQotCQkJCXsKLQkJCQkJaWYgKFRpbWVyT2JqKiBwVGltZXJPYmogPSAoVGltZXJPYmoqKXBKU09iai0+R2V0RW1iZWRPYmplY3QoKSkKLQkJCQkJewotCQkJCQkJaWYgKENKU19UaW1lciogcFRpbWVyID0gcFRpbWVyT2JqLT5HZXRUaW1lcigpKQotCQkJCQkJewotCQkJCQkJCXBUaW1lci0+S2lsbEpTVGltZXIoKTsKLQotCQkJCQkJCWZvciAoaW50IGk9MCxzej1tX2FUaW1lci5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCQkJCQl7Ci0JCQkJCQkJCWlmIChtX2FUaW1lcltpXSA9PSBwVGltZXIpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCW1fYVRpbWVyLlJlbW92ZUF0KGkpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCQlkZWxldGUgcFRpbWVyOwotCQkJCQkJCXBUaW1lck9iai0+U2V0VGltZXIoTlVMTCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBhcHA6OmV4ZWNNZW51SXRlbShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBhcHA6OlRpbWVyUHJvYyhDSlNfVGltZXIqIHBUaW1lcikKLXsKLQlBU1NFUlQocFRpbWVyICE9IE5VTEwpOwotCi0Jc3dpdGNoIChwVGltZXItPkdldFR5cGUoKSkKLQl7Ci0JY2FzZSAwOiAvL2ludGVydmFsCi0JCVJ1bkpzU2NyaXB0KHBUaW1lci0+R2V0UnVudGltZSgpLCBwVGltZXItPkdldEpTY3JpcHQoKSk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJaWYgKHBUaW1lci0+R2V0VGltZU91dCgpID4gMCkKLQkJewotCQkJUnVuSnNTY3JpcHQocFRpbWVyLT5HZXRSdW50aW1lKCksIHBUaW1lci0+R2V0SlNjcmlwdCgpKTsKLQkJCXBUaW1lci0+S2lsbEpTVGltZXIoKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLX0KLQotdm9pZCBhcHA6OlJ1bkpzU2NyaXB0KENKU19SdW50aW1lKiBwUnVudGltZSxjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTY3JpcHQpCi17Ci0JQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwotCi0JaWYgKCFwUnVudGltZS0+SXNCbG9ja2luZygpKQotCXsKLQkJSUZYSlNfQ29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+TmV3Q29udGV4dCgpOwotCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JCXBDb250ZXh0LT5PbkV4dGVybmFsX0V4ZWMoKTsKLQkJQ0ZYX1dpZGVTdHJpbmcgd3RJbmZvOwotCQlwQ29udGV4dC0+UnVuU2NyaXB0KHdzU2NyaXB0LHd0SW5mbyk7Ci0JCXBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7Ci0JfQotfQotCi1GWF9CT09MIGFwcDo6Z29CYWNrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17CitGWF9CT09MIGFwcDo6Z29CYWNrKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICAgLy8gTm90IHN1cHBvcnRlZC4KICAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgYXBwOjpnb0ZvcndhcmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKK0ZYX0JPT0wgYXBwOjpnb0ZvcndhcmQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogICAvLyBOb3Qgc3VwcG9ydGVkLgogICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBhcHA6Om1haWxNc2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CitGWF9CT09MIGFwcDo6bWFpbE1zZyhJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CiAKLQlGWF9CT09MIGJVSSA9IFRSVUU7Ci0JQ0ZYX1dpZGVTdHJpbmcgY1RvID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIGNDYyA9IEwiIjsKLQlDRlhfV2lkZVN0cmluZyBjQmNjID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIGNTdWJqZWN0ID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIGNNc2cgPSBMIiI7CisgIEZYX0JPT0wgYlVJID0gVFJVRTsKKyAgQ0ZYX1dpZGVTdHJpbmcgY1RvID0gTCIiOworICBDRlhfV2lkZVN0cmluZyBjQ2MgPSBMIiI7CisgIENGWF9XaWRlU3RyaW5nIGNCY2MgPSBMIiI7CisgIENGWF9XaWRlU3RyaW5nIGNTdWJqZWN0ID0gTCIiOworICBDRlhfV2lkZVN0cmluZyBjTXNnID0gTCIiOwogCi0JaWYgKHBhcmFtcy5zaXplKCkgPCAxKQotCQlyZXR1cm4gRkFMU0U7CisgIGlmIChwYXJhbXMuc2l6ZSgpIDwgMSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9vYmplY3QpCi0JewotCQlKU09iamVjdCBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKKyAgaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfb2JqZWN0KSB7CisgICAgSlNPYmplY3QgcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KCk7CiAKLQkJdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImJVSSIpOwotCQliVUkgPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0Jvb2woKTsKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiYlVJIik7CisgICAgYlVJID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9Cb29sKCk7CiAKLQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNUbyIpOwotCQljVG8gPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY1RvIik7CisgICAgY1RvID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CiAKLQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNDYyIpOwotCQljQ2MgPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY0NjIik7CisgICAgY0NjID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CiAKLQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNCY2MiKTsKLQkJY0JjYyA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjQmNjIik7CisgICAgY0JjYyA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwogCi0JCXBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjU3ViamVjdCIpOwotCQljU3ViamVjdCA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjU3ViamVjdCIpOworICAgIGNTdWJqZWN0ID0KKyAgICAgICAgQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CiAKLQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNNc2ciKTsKLQkJY01zZyA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwotCX0gZWxzZSB7Ci0JCWlmIChwYXJhbXMuc2l6ZSgpIDwgMikKLQkJCXJldHVybiBGQUxTRTsKKyAgICBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY01zZyIpOworICAgIGNNc2cgPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAocGFyYW1zLnNpemUoKSA8IDIpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJYlVJID0gcGFyYW1zWzBdLlRvQm9vbCgpOwotCQljVG8gPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7CisgICAgYlVJID0gcGFyYW1zWzBdLlRvQm9vbCgpOworICAgIGNUbyA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKIAotCQlpZiAocGFyYW1zLnNpemUoKSA+PSAzKQotCQkJY0NjID0gcGFyYW1zWzJdLlRvQ0ZYV2lkZVN0cmluZygpOwotCQlpZiAocGFyYW1zLnNpemUoKSA+PSA0KQotCQkJY0JjYyA9IHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQkJaWYgKHBhcmFtcy5zaXplKCkgPj0gNSkKLQkJCWNTdWJqZWN0ID0gcGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZygpOwotCQlpZiAocGFyYW1zLnNpemUoKSA+PSA2KQotCQkJY01zZyA9IHBhcmFtc1s1XS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQl9CisgICAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMykKKyAgICAgIGNDYyA9IHBhcmFtc1syXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICBpZiAocGFyYW1zLnNpemUoKSA+PSA0KQorICAgICAgY0JjYyA9IHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICBpZiAocGFyYW1zLnNpemUoKSA+PSA1KQorICAgICAgY1N1YmplY3QgPSBwYXJhbXNbNF0uVG9DRlhXaWRlU3RyaW5nKCk7CisgICAgaWYgKHBhcmFtcy5zaXplKCkgPj0gNikKKyAgICAgIGNNc2cgPSBwYXJhbXNbNV0uVG9DRlhXaWRlU3RyaW5nKCk7CisgIH0KIAotCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKKyAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwogCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKTsKLQlBU1NFUlQocEFwcCAhPSBOVUxMKTsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKTsKKyAgQVNTRVJUKHBBcHAgIT0gTlVMTCk7CiAKLQlwUnVudGltZS0+QmVnaW5CbG9jaygpOwotCXBBcHAtPkpTX2RvY21haWxGb3JtKE5VTEwsIDAsIGJVSSwgY1RvLmNfc3RyKCksIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLCBjQmNjLmNfc3RyKCksIGNNc2cuY19zdHIoKSk7Ci0JcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CisgIHBSdW50aW1lLT5CZWdpbkJsb2NrKCk7CisgIHBBcHAtPkpTX2RvY21haWxGb3JtKE5VTEwsIDAsIGJVSSwgY1RvLmNfc3RyKCksIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICBjQmNjLmNfc3RyKCksIGNNc2cuY19zdHIoKSk7CisgIHBSdW50aW1lLT5FbmRCbG9jaygpOwogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgYXBwOjpsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKK0ZYX0JPT0wgYXBwOjpsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCiAgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6cnVudGltZUhpZ2hsaWdodChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJdnA+Pm1fYlJ1bnRpbWVIaWdoTGlnaHQ7Ci0JfQotCWVsc2UKLQl7Ci0JCXZwPDxtX2JSdW50aW1lSGlnaExpZ2h0OwotCX0KK0ZYX0JPT0wgYXBwOjpydW50aW1lSGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIHZwID4+IG1fYlJ1bnRpbWVIaWdoTGlnaHQ7CisgIH0gZWxzZSB7CisgICAgdnAgPDwgbV9iUnVudGltZUhpZ2hMaWdodDsKKyAgfQogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6ZnVsbHNjcmVlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBhcHA6OmZ1bGxzY3JlZW4oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIGFwcDo6cG9wVXBNZW51KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBhcHA6OnBvcFVwTWVudShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotCi1GWF9CT09MIGFwcDo6YnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17CitGWF9CT09MIGFwcDo6YnJvd3NlRm9yRG9jKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgogICByZXR1cm4gVFJVRTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgYXBwOjpTeXNQYXRoVG9QREZQYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzT2xkUGF0aCkKLXsKLQlDRlhfV2lkZVN0cmluZyBzUmV0ID0gTCIvIjsKK0NGWF9XaWRlU3RyaW5nIGFwcDo6U3lzUGF0aFRvUERGUGF0aChjb25zdCBDRlhfV2lkZVN0cmluZyYgc09sZFBhdGgpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc1JldCA9IEwiLyI7CiAKLQlmb3IgKGludCBpPTAsc3o9c09sZFBhdGguR2V0TGVuZ3RoKCk7IGk8c3o7IGkrKykKLQl7Ci0JCXdjaGFyX3QgYyA9IHNPbGRQYXRoLkdldEF0KGkpOwotCQlpZiAoYyA9PSBMJzonKQotCQl7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoYyA9PSBMJ1xcJykKLQkJCXsKLQkJCQlzUmV0ICs9IEwiLyI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJc1JldCArPSBjOwotCQkJfQotCQl9Ci0JfQorICBmb3IgKGludCBpID0gMCwgc3ogPSBzT2xkUGF0aC5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKKyAgICB3Y2hhcl90IGMgPSBzT2xkUGF0aC5HZXRBdChpKTsKKyAgICBpZiAoYyA9PSBMJzonKSB7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChjID09IEwnXFwnKSB7CisgICAgICAgIHNSZXQgKz0gTCIvIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNSZXQgKz0gYzsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotCXJldHVybiBzUmV0OworICByZXR1cm4gc1JldDsKIH0KIAotRlhfQk9PTCBhcHA6Om5ld0RvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgYXBwOjpuZXdEb2MoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgYXBwOjpvcGVuRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBhcHA6Om9wZW5Eb2MoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgYXBwOjpyZXNwb25zZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNGWF9XaWRlU3RyaW5nIHN3UXVlc3Rpb24gPSBMIiI7Ci0JQ0ZYX1dpZGVTdHJpbmcgc3dMYWJlbCA9IEwiIjsKLQlDRlhfV2lkZVN0cmluZyBzd1RpdGxlID0gTCJQREYiOwotCUNGWF9XaWRlU3RyaW5nIHN3RGVmYXVsdCA9IEwiIjsKLQlib29sIGJQYXNzV29yZCA9IGZhbHNlOworRlhfQk9PTCBhcHA6OnJlc3BvbnNlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dRdWVzdGlvbiA9IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dMYWJlbCA9IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dUaXRsZSA9IEwiUERGIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dEZWZhdWx0ID0gTCIiOworICBib29sIGJQYXNzV29yZCA9IGZhbHNlOwogCi0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKIAotCWludCBpTGVuZ3RoID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaUxlbmd0aCA+IDAgJiYgcGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9vYmplY3QpCi0JewotCQlKU09iamVjdCBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKLQkJdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLHBPYmosTCJjUXVlc3Rpb24iKTsKLQkJc3dRdWVzdGlvbiA9IENKU19WYWx1ZShpc29sYXRlLHBWYWx1ZSxHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgaW50IGlMZW5ndGggPSBwYXJhbXMuc2l6ZSgpOworICBpZiAoaUxlbmd0aCA+IDAgJiYgcGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9vYmplY3QpIHsKKyAgICBKU09iamVjdCBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUgPQorICAgICAgICBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY1F1ZXN0aW9uIik7CisgICAgc3dRdWVzdGlvbiA9CisgICAgICAgIENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwogCi0JCXBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSxwT2JqLEwiY1RpdGxlIik7Ci0JCXN3VGl0bGUgPSBDSlNfVmFsdWUoaXNvbGF0ZSxwVmFsdWUsR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CisgICAgcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNUaXRsZSIpOworICAgIHN3VGl0bGUgPQorICAgICAgICBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKIAotCQlwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUscE9iaixMImNEZWZhdWx0Iik7Ci0JCXN3RGVmYXVsdCA9IENKU19WYWx1ZShpc29sYXRlLHBWYWx1ZSxHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY0RlZmF1bHQiKTsKKyAgICBzd0RlZmF1bHQgPQorICAgICAgICBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKIAotCQlwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUscE9iaixMImNMYWJlbCIpOwotCQlzd0xhYmVsID0gQ0pTX1ZhbHVlKGlzb2xhdGUscFZhbHVlLEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjTGFiZWwiKTsKKyAgICBzd0xhYmVsID0KKyAgICAgICAgQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CiAKLQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLHBPYmosTCJiUGFzc3dvcmQiKTsKLQkJYlBhc3NXb3JkID0gQ0pTX1ZhbHVlKGlzb2xhdGUscFZhbHVlLEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQm9vbCgpOwotCX0KLQllbHNlCi0JewotCQlzd2l0Y2goaUxlbmd0aCkKLQkJewotCQljYXNlIDU6Ci0JCQlzd0xhYmVsID0gcGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZygpOwotCQkJLy8gRkFMTFRIUk9VR0gKLQkJY2FzZSA0OgotCQkJYlBhc3NXb3JkID0gcGFyYW1zWzNdLlRvQm9vbCgpOwotCQkJLy8gRkFMTFRIUk9VR0gKLQkJY2FzZSAzOgotCQkJc3dEZWZhdWx0ID0gcGFyYW1zWzJdLlRvQ0ZYV2lkZVN0cmluZygpOwotCQkJLy8gRkFMTFRIUk9VR0gKLQkJY2FzZSAyOgotCQkJc3dUaXRsZSA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQkJCS8vIEZBTExUSFJPVUdICi0JCWNhc2UgMToKLQkJCXN3UXVlc3Rpb24gPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JCQkvLyBGQUxMVEhST1VHSAotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImJQYXNzd29yZCIpOworICAgIGJQYXNzV29yZCA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQm9vbCgpOworICB9IGVsc2UgeworICAgIHN3aXRjaCAoaUxlbmd0aCkgeworICAgICAgY2FzZSA1OgorICAgICAgICBzd0xhYmVsID0gcGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZygpOworICAgICAgLy8gRkFMTFRIUk9VR0gKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgYlBhc3NXb3JkID0gcGFyYW1zWzNdLlRvQm9vbCgpOworICAgICAgLy8gRkFMTFRIUk9VR0gKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgc3dEZWZhdWx0ID0gcGFyYW1zWzJdLlRvQ0ZYV2lkZVN0cmluZygpOworICAgICAgLy8gRkFMTFRIUk9VR0gKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgc3dUaXRsZSA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICAgIC8vIEZBTExUSFJPVUdICisgICAgICBjYXNlIDE6CisgICAgICAgIHN3UXVlc3Rpb24gPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CisgICAgICAvLyBGQUxMVEhST1VHSAorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CiAKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKIAotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwQ29udGV4dC0+R2V0UmVhZGVyQXBwKCk7Ci0JQVNTRVJUKHBBcHAgIT0gTlVMTCk7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwQ29udGV4dC0+R2V0UmVhZGVyQXBwKCk7CisgIEFTU0VSVChwQXBwICE9IE5VTEwpOwogCi0JY29uc3QgaW50IE1BWF9JTlBVVF9CWVRFUyA9IDIwNDg7Ci0JY2hhciogcEJ1ZmYgPSBuZXcgY2hhcltNQVhfSU5QVVRfQllURVMgKyAyXTsKLQlpZiAoIXBCdWZmKQotCQlyZXR1cm4gRkFMU0U7CisgIGNvbnN0IGludCBNQVhfSU5QVVRfQllURVMgPSAyMDQ4OworICBjaGFyKiBwQnVmZiA9IG5ldyBjaGFyW01BWF9JTlBVVF9CWVRFUyArIDJdOworICBpZiAoIXBCdWZmKQorICAgIHJldHVybiBGQUxTRTsKIAotCW1lbXNldChwQnVmZiwgMCwgTUFYX0lOUFVUX0JZVEVTICsgMik7Ci0JaW50IG5MZW5ndGhCeXRlcyA9IHBBcHAtPkpTX2FwcFJlc3BvbnNlKHN3UXVlc3Rpb24uY19zdHIoKSwgc3dUaXRsZS5jX3N0cigpLCBzd0RlZmF1bHQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dMYWJlbC5jX3N0cigpLCBiUGFzc1dvcmQsIHBCdWZmLCBNQVhfSU5QVVRfQllURVMpOwotCWlmIChuTGVuZ3RoQnl0ZXMgPD0gMCkKLQl7Ci0JCXZSZXQuU2V0TnVsbCgpOwotCQlkZWxldGVbXSBwQnVmZjsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlpZiAobkxlbmd0aEJ5dGVzID4gTUFYX0lOUFVUX0JZVEVTKQotCQluTGVuZ3RoQnl0ZXMgPSBNQVhfSU5QVVRfQllURVM7CisgIG1lbXNldChwQnVmZiwgMCwgTUFYX0lOUFVUX0JZVEVTICsgMik7CisgIGludCBuTGVuZ3RoQnl0ZXMgPSBwQXBwLT5KU19hcHBSZXNwb25zZShzd1F1ZXN0aW9uLmNfc3RyKCksIHN3VGl0bGUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3RGVmYXVsdC5jX3N0cigpLCBzd0xhYmVsLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFzc1dvcmQsIHBCdWZmLCBNQVhfSU5QVVRfQllURVMpOworICBpZiAobkxlbmd0aEJ5dGVzIDw9IDApIHsKKyAgICB2UmV0LlNldE51bGwoKTsKKyAgICBkZWxldGVbXSBwQnVmZjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG5MZW5ndGhCeXRlcyA+IE1BWF9JTlBVVF9CWVRFUykKKyAgICBuTGVuZ3RoQnl0ZXMgPSBNQVhfSU5QVVRfQllURVM7CiAKLQl2UmV0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKCh1bnNpZ25lZCBzaG9ydCopcEJ1ZmYsIG5MZW5ndGhCeXRlcyAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpLmNfc3RyKCk7Ci0JZGVsZXRlW10gcEJ1ZmY7Ci0JcmV0dXJuIFRSVUU7CisgIHZSZXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoKHVuc2lnbmVkIHNob3J0KilwQnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTGVuZ3RoQnl0ZXMgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpKQorICAgICAgICAgICAgIC5jX3N0cigpOworICBkZWxldGVbXSBwQnVmZjsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgYXBwOjptZWRpYShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBhcHA6Om1lZGlhKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIGFwcDo6ZXhlY0RpYWxvZyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBhcHA6OmV4ZWNEaWFsb2coSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29sb3IuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb2xvci5jcHAKaW5kZXggYTJiYmFkYy4uMDY1OWFiOSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb2xvci5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb2xvci5jcHAKQEAgLTE0LDE1ICsxNCwxNCBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19Db250ZXh0LmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaCIKIAotc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElGWEpTX0NvbnRleHQqIGNjKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKK3N0YXRpYyB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZShJRlhKU19Db250ZXh0KiBjYykgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKLQlDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0JQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAotCXJldHVybiBwUnVudGltZS0+R2V0SXNvbGF0ZSgpOworICByZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKIH0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTMwLDE0OSArMjksMTMyIEBACiBFTkRfSlNfU1RBVElDX0NPTlNUKCkKIAogQkVHSU5fSlNfU1RBVElDX1BST1AoQ0pTX0NvbG9yKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGJsYWNrKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGJsdWUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoY3lhbikKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShka0dyYXkpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoZ3JheSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShncmVlbikKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShsdEdyYXkpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkobWFnZW50YSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShyZWQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkodHJhbnNwYXJlbnQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkod2hpdGUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoeWVsbG93KQorSlNfU1RBVElDX1BST1BfRU5UUlkoYmxhY2spCitKU19TVEFUSUNfUFJPUF9FTlRSWShibHVlKQorSlNfU1RBVElDX1BST1BfRU5UUlkoY3lhbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGRrR3JheSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGdyYXkpCitKU19TVEFUSUNfUFJPUF9FTlRSWShncmVlbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGx0R3JheSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG1hZ2VudGEpCitKU19TVEFUSUNfUFJPUF9FTlRSWShyZWQpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh0cmFuc3BhcmVudCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHdoaXRlKQorSlNfU1RBVElDX1BST1BfRU5UUlkoeWVsbG93KQogRU5EX0pTX1NUQVRJQ19QUk9QKCkKIAogQkVHSU5fSlNfU1RBVElDX01FVEhPRChDSlNfQ29sb3IpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShjb252ZXJ0KQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZXF1YWwpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNvbnZlcnQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGVxdWFsKQogRU5EX0pTX1NUQVRJQ19NRVRIT0QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0NvbG9yLGNvbG9yKQorSU1QTEVNRU5UX0pTX0NMQVNTKENKU19Db2xvciwgY29sb3IpCiAKLWNvbG9yOjpjb2xvcihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KQotewotCW1fY3JUcmFuc3BhcmVudCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKLQltX2NyQmxhY2sgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKLQltX2NyV2hpdGUgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKLQltX2NyUmVkID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAxLCAwICwwKTsKLQltX2NyR3JlZW4gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDAsIDEgLDApOwotCW1fY3JCbHVlID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAwLCAwICwxKTsKLQltX2NyQ3lhbiA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIDEsIDAgLDAsIDApOwotCW1fY3JNYWdlbnRhID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfQ01ZSywgMCwgMSAsMCwgMCk7Ci0JbV9jclllbGxvdyA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIDAsIDAgLDEsIDApOwotCW1fY3JES0dyYXkgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjI1KTsKLQltX2NyR3JheSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNSk7Ci0JbV9jckxUR3JheSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNzUpOworY29sb3I6OmNvbG9yKENKU19PYmplY3QqIHBKU09iamVjdCkgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSB7CisgIG1fY3JUcmFuc3BhcmVudCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKKyAgbV9jckJsYWNrID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCk7CisgIG1fY3JXaGl0ZSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOworICBtX2NyUmVkID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAxLCAwLCAwKTsKKyAgbV9jckdyZWVuID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAwLCAxLCAwKTsKKyAgbV9jckJsdWUgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDAsIDAsIDEpOworICBtX2NyQ3lhbiA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIDEsIDAsIDAsIDApOworICBtX2NyTWFnZW50YSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIDAsIDEsIDAsIDApOworICBtX2NyWWVsbG93ID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfQ01ZSywgMCwgMCwgMSwgMCk7CisgIG1fY3JES0dyYXkgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjI1KTsKKyAgbV9jckdyYXkgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjUpOworICBtX2NyTFRHcmF5ID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC43NSk7CiB9CiAKLWNvbG9yOjp+Y29sb3Iodm9pZCkKLXsKK2NvbG9yOjp+Y29sb3Iodm9pZCkge30KKwordm9pZCBjb2xvcjo6Q29udmVydFBXTENvbG9yVG9BcnJheShjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwgQ0pTX0FycmF5JiBhcnJheSkgeworICBzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpIHsKKyAgICBjYXNlIENPTE9SVFlQRV9UUkFOU1BBUkVOVDoKKyAgICAgIGFycmF5LlNldEVsZW1lbnQoMCwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSwgIlQiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgorICAgICAgYXJyYXkuU2V0RWxlbWVudCgwLCBDSlNfVmFsdWUoYXJyYXkuR2V0SXNvbGF0ZSgpLCAiRyIpKTsKKyAgICAgIGFycmF5LlNldEVsZW1lbnQoMSwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSwgY29sb3IuZkNvbG9yMSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUlRZUEVfUkdCOgorICAgICAgYXJyYXkuU2V0RWxlbWVudCgwLCBDSlNfVmFsdWUoYXJyYXkuR2V0SXNvbGF0ZSgpLCAiUkdCIikpOworICAgICAgYXJyYXkuU2V0RWxlbWVudCgxLCBDSlNfVmFsdWUoYXJyYXkuR2V0SXNvbGF0ZSgpLCBjb2xvci5mQ29sb3IxKSk7CisgICAgICBhcnJheS5TZXRFbGVtZW50KDIsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksIGNvbG9yLmZDb2xvcjIpKTsKKyAgICAgIGFycmF5LlNldEVsZW1lbnQoMywgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSwgY29sb3IuZkNvbG9yMykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUlRZUEVfQ01ZSzoKKyAgICAgIGFycmF5LlNldEVsZW1lbnQoMCwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSwgIkNNWUsiKSk7CisgICAgICBhcnJheS5TZXRFbGVtZW50KDEsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksIGNvbG9yLmZDb2xvcjEpKTsKKyAgICAgIGFycmF5LlNldEVsZW1lbnQoMiwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSwgY29sb3IuZkNvbG9yMikpOworICAgICAgYXJyYXkuU2V0RWxlbWVudCgzLCBDSlNfVmFsdWUoYXJyYXkuR2V0SXNvbGF0ZSgpLCBjb2xvci5mQ29sb3IzKSk7CisgICAgICBhcnJheS5TZXRFbGVtZW50KDQsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksIGNvbG9yLmZDb2xvcjQpKTsKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLXZvaWQgY29sb3I6OkNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsIENKU19BcnJheSYgYXJyYXkpCi17Ci0Jc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKQotCXsKLQljYXNlIENPTE9SVFlQRV9UUkFOU1BBUkVOVDoKLQkJYXJyYXkuU2V0RWxlbWVudCgwLCBDSlNfVmFsdWUoYXJyYXkuR2V0SXNvbGF0ZSgpLCAiVCIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDT0xPUlRZUEVfR1JBWToKLQkJYXJyYXkuU2V0RWxlbWVudCgwLCBDSlNfVmFsdWUoYXJyYXkuR2V0SXNvbGF0ZSgpLCJHIikpOwotCQlhcnJheS5TZXRFbGVtZW50KDEsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksY29sb3IuZkNvbG9yMSkpOwotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9SR0I6Ci0JCWFycmF5LlNldEVsZW1lbnQoMCwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSwiUkdCIikpOwotCQlhcnJheS5TZXRFbGVtZW50KDEsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksY29sb3IuZkNvbG9yMSkpOwotCQlhcnJheS5TZXRFbGVtZW50KDIsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksY29sb3IuZkNvbG9yMikpOwotCQlhcnJheS5TZXRFbGVtZW50KDMsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksY29sb3IuZkNvbG9yMykpOwotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9DTVlLOgotCQlhcnJheS5TZXRFbGVtZW50KDAsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksIkNNWUsiKSk7Ci0JCWFycmF5LlNldEVsZW1lbnQoMSwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSxjb2xvci5mQ29sb3IxKSk7Ci0JCWFycmF5LlNldEVsZW1lbnQoMiwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSxjb2xvci5mQ29sb3IyKSk7Ci0JCWFycmF5LlNldEVsZW1lbnQoMywgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSxjb2xvci5mQ29sb3IzKSk7Ci0JCWFycmF5LlNldEVsZW1lbnQoNCwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSxjb2xvci5mQ29sb3I0KSk7Ci0JCWJyZWFrOwotCX0KK3ZvaWQgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoQ0pTX0FycmF5JiBhcnJheSwgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgaW50IG5BcnJheUxlbiA9IGFycmF5LkdldExlbmd0aCgpOworICBpZiAobkFycmF5TGVuIDwgMSkKKyAgICByZXR1cm47CisKKyAgQ0pTX1ZhbHVlIHZhbHVlKGFycmF5LkdldElzb2xhdGUoKSk7CisgIGFycmF5LkdldEVsZW1lbnQoMCwgdmFsdWUpOworICBDRlhfQnl0ZVN0cmluZyBzU3BhY2UgPSB2YWx1ZS5Ub0NGWEJ5dGVTdHJpbmcoKTsKKworICBkb3VibGUgZDEgPSAwOworICBkb3VibGUgZDIgPSAwOworICBkb3VibGUgZDMgPSAwOworICBkb3VibGUgZDQgPSAwOworCisgIGlmIChuQXJyYXlMZW4gPiAxKSB7CisgICAgYXJyYXkuR2V0RWxlbWVudCgxLCB2YWx1ZSk7CisgICAgZDEgPSB2YWx1ZS5Ub0RvdWJsZSgpOworICB9CisKKyAgaWYgKG5BcnJheUxlbiA+IDIpIHsKKyAgICBhcnJheS5HZXRFbGVtZW50KDIsIHZhbHVlKTsKKyAgICBkMiA9IHZhbHVlLlRvRG91YmxlKCk7CisgIH0KKworICBpZiAobkFycmF5TGVuID4gMykgeworICAgIGFycmF5LkdldEVsZW1lbnQoMywgdmFsdWUpOworICAgIGQzID0gdmFsdWUuVG9Eb3VibGUoKTsKKyAgfQorCisgIGlmIChuQXJyYXlMZW4gPiA0KSB7CisgICAgYXJyYXkuR2V0RWxlbWVudCg0LCB2YWx1ZSk7CisgICAgZDQgPSB2YWx1ZS5Ub0RvdWJsZSgpOworICB9CisKKyAgaWYgKHNTcGFjZSA9PSAiVCIpIHsKKyAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKKyAgfSBlbHNlIGlmIChzU3BhY2UgPT0gIkciKSB7CisgICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAoRlhfRkxPQVQpZDEpOworICB9IGVsc2UgaWYgKHNTcGFjZSA9PSAiUkdCIikgeworICAgIGNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAoRlhfRkxPQVQpZDEsIChGWF9GTE9BVClkMiwgKEZYX0ZMT0FUKWQzKTsKKyAgfSBlbHNlIGlmIChzU3BhY2UgPT0gIkNNWUsiKSB7CisgICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9DTVlLLCAoRlhfRkxPQVQpZDEsIChGWF9GTE9BVClkMiwgKEZYX0ZMT0FUKWQzLAorICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpZDQpOworICB9CiB9CiAKLXZvaWQgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoQ0pTX0FycmF5JiBhcnJheSwgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0JaW50IG5BcnJheUxlbiA9IGFycmF5LkdldExlbmd0aCgpOwotCWlmIChuQXJyYXlMZW4gPCAxKSByZXR1cm47Ci0KLQlDSlNfVmFsdWUgdmFsdWUoYXJyYXkuR2V0SXNvbGF0ZSgpKTsKLQlhcnJheS5HZXRFbGVtZW50KDAsIHZhbHVlKTsKLQlDRlhfQnl0ZVN0cmluZyBzU3BhY2UgPSB2YWx1ZS5Ub0NGWEJ5dGVTdHJpbmcoKTsKLQotCWRvdWJsZSBkMSA9IDA7Ci0JZG91YmxlIGQyID0gMDsKLQlkb3VibGUgZDMgPSAwOwotCWRvdWJsZSBkNCA9IDA7Ci0KLQlpZiAobkFycmF5TGVuID4gMSkKLQl7Ci0JCWFycmF5LkdldEVsZW1lbnQoMSwgdmFsdWUpOwotCQlkMSA9IHZhbHVlLlRvRG91YmxlKCk7Ci0JfQotCi0JaWYgKG5BcnJheUxlbiA+IDIpCi0JewotCQlhcnJheS5HZXRFbGVtZW50KDIsIHZhbHVlKTsKLQkJZDIgPSB2YWx1ZS5Ub0RvdWJsZSgpOwotCX0KLQotCWlmIChuQXJyYXlMZW4gPiAzKQotCXsKLQkJYXJyYXkuR2V0RWxlbWVudCgzLCB2YWx1ZSk7Ci0JCWQzID0gdmFsdWUuVG9Eb3VibGUoKTsKLQl9Ci0KLQlpZiAobkFycmF5TGVuID4gNCkKLQl7Ci0JCWFycmF5LkdldEVsZW1lbnQoNCwgdmFsdWUpOwotCQlkNCA9IHZhbHVlLlRvRG91YmxlKCk7Ci0JfQotCi0JaWYgKHNTcGFjZSA9PSAiVCIpCi0JewotCQljb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKLQl9Ci0JZWxzZSBpZiAoc1NwYWNlID09ICJHIikKLQl7Ci0JCWNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgKEZYX0ZMT0FUKWQxKTsKLQl9Ci0JZWxzZSBpZiAoc1NwYWNlID09ICJSR0IiKQotCXsKLQkJY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIChGWF9GTE9BVClkMSwgKEZYX0ZMT0FUKWQyLCAoRlhfRkxPQVQpZDMpOwotCX0KLQllbHNlIGlmIChzU3BhY2UgPT0gIkNNWUsiKQotCXsKLQkJY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9DTVlLLCAoRlhfRkxPQVQpZDEsIChGWF9GTE9BVClkMiwgKEZYX0ZMT0FUKWQzLCAoRlhfRkxPQVQpZDQpOwotCX0KLX0KLQotI2RlZmluZSBKU19JTVBMRU1FTlRfQ09MT1JQUk9QKHByb3AsIHZhcilcCi1GWF9CT09MIGNvbG9yOjpwcm9wKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcilcCi17XAotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7XAotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpLT5HZXRJc29sYXRlKCk7XAotCWlmICh2cC5Jc0dldHRpbmcoKSlcCi0Je1wKLQkJQ0pTX0FycmF5IGFycmF5KGlzb2xhdGUpO1wKLQkJQ29udmVydFBXTENvbG9yVG9BcnJheSh2YXIsIGFycmF5KTtcCi0JCXZwIDw8IGFycmF5O1wKLQl9XAotCWVsc2VcCi0Je1wKLQkJQ0pTX0FycmF5IGFycmF5KGlzb2xhdGUpO1wKLQkJaWYgKCF2cC5Db252ZXJ0VG9BcnJheShhcnJheSkpIHJldHVybiBGQUxTRTtcCi0JCUNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJyYXksIHZhcik7XAotCX1cCi0JcmV0dXJuIFRSVUU7XAotfQorI2RlZmluZSBKU19JTVBMRU1FTlRfQ09MT1JQUk9QKHByb3AsIHZhcikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlhfQk9PTCBjb2xvcjo6cHJvcChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeyAgICAgICAgICAgICAgICAgICAgXAorICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKS0+R2V0SXNvbGF0ZSgpOyBcCisgICAgaWYgKHZwLklzR2V0dGluZygpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0pTX0FycmF5IGFycmF5KGlzb2xhdGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENvbnZlcnRQV0xDb2xvclRvQXJyYXkodmFyLCBhcnJheSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2cCA8PCBhcnJheTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENKU19BcnJheSBhcnJheShpc29sYXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoIXZwLkNvbnZlcnRUb0FycmF5KGFycmF5KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJyYXksIHZhcik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBUUlVFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCiBKU19JTVBMRU1FTlRfQ09MT1JQUk9QKHRyYW5zcGFyZW50LCBtX2NyVHJhbnNwYXJlbnQpCiBKU19JTVBMRU1FTlRfQ09MT1JQUk9QKGJsYWNrLCBtX2NyQmxhY2spCkBAIC0xODcsNjUgKzE2OSw2NiBAQAogSlNfSU1QTEVNRU5UX0NPTE9SUFJPUChncmF5LCBtX2NyR3JheSkKIEpTX0lNUExFTUVOVF9DT0xPUlBST1AobHRHcmF5LCBtX2NyTFRHcmF5KQogCi1GWF9CT09MIGNvbG9yOjpjb252ZXJ0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKLQlpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotCWlmIChpU2l6ZSA8IDIpIHJldHVybiBGQUxTRTsKLQlDSlNfQXJyYXkgYVNvdXJjZShpc29sYXRlKTsKLQlpZiAoIXBhcmFtc1swXS5Db252ZXJ0VG9BcnJheShhU291cmNlKSkgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBjb2xvcjo6Y29udmVydChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA8IDIpCisgICAgcmV0dXJuIEZBTFNFOworICBDSlNfQXJyYXkgYVNvdXJjZShpc29sYXRlKTsKKyAgaWYgKCFwYXJhbXNbMF0uQ29udmVydFRvQXJyYXkoYVNvdXJjZSkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BXTF9Db2xvciBjclNvdXJjZTsKLQlDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFTb3VyY2UsIGNyU291cmNlKTsKKyAgQ1BXTF9Db2xvciBjclNvdXJjZTsKKyAgQ29udmVydEFycmF5VG9QV0xDb2xvcihhU291cmNlLCBjclNvdXJjZSk7CiAKLQlDRlhfQnl0ZVN0cmluZyBzRGVzdFNwYWNlID0gcGFyYW1zWzFdLlRvQ0ZYQnl0ZVN0cmluZygpOwotCWludCBuQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworICBDRlhfQnl0ZVN0cmluZyBzRGVzdFNwYWNlID0gcGFyYW1zWzFdLlRvQ0ZYQnl0ZVN0cmluZygpOworICBpbnQgbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKIAotCWlmIChzRGVzdFNwYWNlID09ICJUIikKLQl7Ci0JCW5Db2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7Ci0JfQotCWVsc2UgaWYgKHNEZXN0U3BhY2UgPT0gIkciKQotCXsKLQkJbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9HUkFZOwotCX0KLQllbHNlIGlmIChzRGVzdFNwYWNlID09ICJSR0IiKQotCXsKLQkJbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7Ci0JfQotCWVsc2UgaWYgKHNEZXN0U3BhY2UgPT0gIkNNWUsiKQotCXsKLQkJbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9DTVlLOwotCX0KKyAgaWYgKHNEZXN0U3BhY2UgPT0gIlQiKSB7CisgICAgbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKKyAgfSBlbHNlIGlmIChzRGVzdFNwYWNlID09ICJHIikgeworICAgIG5Db2xvclR5cGUgPSBDT0xPUlRZUEVfR1JBWTsKKyAgfSBlbHNlIGlmIChzRGVzdFNwYWNlID09ICJSR0IiKSB7CisgICAgbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7CisgIH0gZWxzZSBpZiAoc0Rlc3RTcGFjZSA9PSAiQ01ZSyIpIHsKKyAgICBuQ29sb3JUeXBlID0gQ09MT1JUWVBFX0NNWUs7CisgIH0KIAotCUNKU19BcnJheSBhRGVzdChpc29sYXRlKTsKLQlDUFdMX0NvbG9yIGNyRGVzdCA9IGNyU291cmNlOwotCWNyRGVzdC5Db252ZXJ0Q29sb3JUeXBlKG5Db2xvclR5cGUpOwotCUNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY3JEZXN0LCBhRGVzdCk7Ci0JdlJldCA9IGFEZXN0OworICBDSlNfQXJyYXkgYURlc3QoaXNvbGF0ZSk7CisgIENQV0xfQ29sb3IgY3JEZXN0ID0gY3JTb3VyY2U7CisgIGNyRGVzdC5Db252ZXJ0Q29sb3JUeXBlKG5Db2xvclR5cGUpOworICBDb252ZXJ0UFdMQ29sb3JUb0FycmF5KGNyRGVzdCwgYURlc3QpOworICB2UmV0ID0gYURlc3Q7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgY29sb3I6OmVxdWFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKLQlpZiAocGFyYW1zLnNpemUoKSA8IDIpIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgY29sb3I6OmVxdWFsKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPCAyKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNKU19BcnJheSBhcnJheTEoaXNvbGF0ZSksIGFycmF5Mihpc29sYXRlKTsKKyAgQ0pTX0FycmF5IGFycmF5MShpc29sYXRlKSwgYXJyYXkyKGlzb2xhdGUpOwogCi0JaWYgKCFwYXJhbXNbMF0uQ29udmVydFRvQXJyYXkoYXJyYXkxKSkgcmV0dXJuIEZBTFNFOwotCWlmICghcGFyYW1zWzFdLkNvbnZlcnRUb0FycmF5KGFycmF5MikpIHJldHVybiBGQUxTRTsKKyAgaWYgKCFwYXJhbXNbMF0uQ29udmVydFRvQXJyYXkoYXJyYXkxKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghcGFyYW1zWzFdLkNvbnZlcnRUb0FycmF5KGFycmF5MikpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BXTF9Db2xvciBjb2xvcjE7Ci0JQ1BXTF9Db2xvciBjb2xvcjI7CisgIENQV0xfQ29sb3IgY29sb3IxOworICBDUFdMX0NvbG9yIGNvbG9yMjsKIAotCUNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJyYXkxLCBjb2xvcjEpOwotCUNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJyYXkyLCBjb2xvcjIpOworICBDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFycmF5MSwgY29sb3IxKTsKKyAgQ29udmVydEFycmF5VG9QV0xDb2xvcihhcnJheTIsIGNvbG9yMik7CiAKLQljb2xvcjEuQ29udmVydENvbG9yVHlwZShjb2xvcjIubkNvbG9yVHlwZSk7CisgIGNvbG9yMS5Db252ZXJ0Q29sb3JUeXBlKGNvbG9yMi5uQ29sb3JUeXBlKTsKIAotCXZSZXQgPSBjb2xvcjEgPT0gY29sb3IyOwotCXJldHVybiBUUlVFOworICB2UmV0ID0gY29sb3IxID09IGNvbG9yMjsKKyAgcmV0dXJuIFRSVUU7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29uc29sZS5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwCmluZGV4IGVkOWIxZmIuLmNjNjRlMTAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29uc29sZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb25zb2xlLmNwcApAQCAtMjIsNDUgKzIyLDQ1IEBACiBFTkRfSlNfU1RBVElDX1BST1AoKQogCiBCRUdJTl9KU19TVEFUSUNfTUVUSE9EKENKU19Db25zb2xlKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoY2xlYXIpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShoaWRlKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkocHJpbnRsbikKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNob3cpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNsZWFyKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShoaWRlKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShwcmludGxuKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzaG93KQogRU5EX0pTX1NUQVRJQ19NRVRIT0QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0NvbnNvbGUsY29uc29sZSkKK0lNUExFTUVOVF9KU19DTEFTUyhDSlNfQ29uc29sZSwgY29uc29sZSkKIAotY29uc29sZTo6Y29uc29sZShDSlNfT2JqZWN0KiBwSlNPYmplY3QpOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KQoteworY29uc29sZTo6Y29uc29sZShDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCkge30KKworY29uc29sZTo6fmNvbnNvbGUoKSB7fQorCitGWF9CT09MIGNvbnNvbGU6OmNsZWFyKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLWNvbnNvbGU6On5jb25zb2xlKCkKLXsKK0ZYX0JPT0wgY29uc29sZTo6aGlkZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGNvbnNvbGU6OmNsZWFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7CitGWF9CT09MIGNvbnNvbGU6OnByaW50bG4oSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAocGFyYW1zLnNpemUoKSA8IDEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgY29uc29sZTo6aGlkZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBjb25zb2xlOjpzaG93KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9Ci0KLUZYX0JPT0wgY29uc29sZTo6cHJpbnRsbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmIChwYXJhbXMuc2l6ZSgpIDwgMSkKLQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgY29uc29sZTo6c2hvdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2V2ZW50LmNwcAppbmRleCBmNTdiMWZiLi40YmNkY2NlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2V2ZW50LmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2V2ZW50LmNwcApAQCAtMjEsMzU5ICsyMSwzNTkgQEAKIEVORF9KU19TVEFUSUNfQ09OU1QoKQogCiBCRUdJTl9KU19TVEFUSUNfUFJPUChDSlNfRXZlbnQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoY2hhbmdlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGNoYW5nZUV4KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGNvbW1pdEtleSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShmaWVsZEZ1bGwpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoa2V5RG93bikKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShtb2RpZmllcikKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShuYW1lKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHJjKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHJpY2hDaGFuZ2UpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkocmljaENoYW5nZUV4KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHJpY2hWYWx1ZSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShzZWxFbmQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoc2VsU3RhcnQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoc2hpZnQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoc291cmNlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHRhcmdldCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWSh0YXJnZXROYW1lKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHR5cGUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkodmFsdWUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkod2lsbENvbW1pdCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGNoYW5nZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGNoYW5nZUV4KQorSlNfU1RBVElDX1BST1BfRU5UUlkoY29tbWl0S2V5KQorSlNfU1RBVElDX1BST1BfRU5UUlkoZmllbGRGdWxsKQorSlNfU1RBVElDX1BST1BfRU5UUlkoa2V5RG93bikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG1vZGlmaWVyKQorSlNfU1RBVElDX1BST1BfRU5UUlkobmFtZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHJjKQorSlNfU1RBVElDX1BST1BfRU5UUlkocmljaENoYW5nZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHJpY2hDaGFuZ2VFeCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHJpY2hWYWx1ZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHNlbEVuZCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHNlbFN0YXJ0KQorSlNfU1RBVElDX1BST1BfRU5UUlkoc2hpZnQpCitKU19TVEFUSUNfUFJPUF9FTlRSWShzb3VyY2UpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh0YXJnZXQpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh0YXJnZXROYW1lKQorSlNfU1RBVElDX1BST1BfRU5UUlkodHlwZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHZhbHVlKQorSlNfU1RBVElDX1BST1BfRU5UUlkod2lsbENvbW1pdCkKIEVORF9KU19TVEFUSUNfUFJPUCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19NRVRIT0QoQ0pTX0V2ZW50KQogRU5EX0pTX1NUQVRJQ19NRVRIT0QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0V2ZW50LGV2ZW50KQorSU1QTEVNRU5UX0pTX0NMQVNTKENKU19FdmVudCwgZXZlbnQpCiAKLWV2ZW50OjpldmVudChDSlNfT2JqZWN0ICogcEpzT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSnNPYmplY3QpCi17CitldmVudDo6ZXZlbnQoQ0pTX09iamVjdCogcEpzT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSnNPYmplY3QpIHt9CisKK2V2ZW50Ojp+ZXZlbnQodm9pZCkge30KKworRlhfQk9PTCBldmVudDo6Y2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CisKKyAgQ0ZYX1dpZGVTdHJpbmcmIHdDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAodnAuR2V0VHlwZSgpID09IFZUX3N0cmluZykKKyAgICAgIHZwID4+IHdDaGFuZ2U7CisgIH0gZWxzZSB7CisgICAgdnAgPDwgd0NoYW5nZTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotZXZlbnQ6On5ldmVudCh2b2lkKQoteworRlhfQk9PTCBldmVudDo6Y2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CisKKyAgdnAgPDwgcEV2ZW50LT5DaGFuZ2VFeCgpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6Y2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgZXZlbnQ6OmNvbW1pdEtleShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghdnAuSXNHZXR0aW5nKCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0ZYX1dpZGVTdHJpbmcgJndDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOwotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICh2cC5HZXRUeXBlKCkgPT0gVlRfc3RyaW5nKQotCQkJdnAgPj4gd0NoYW5nZTsKLQl9Ci0JZWxzZQotCXsKLQkJdnAgPDwgd0NoYW5nZTsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworCisgIHZwIDw8IHBFdmVudC0+Q29tbWl0S2V5KCk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGV2ZW50OjpjaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGV2ZW50OjpmaWVsZEZ1bGwoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworICBpZiAoIXZwLklzR2V0dGluZygpICYmCisgICAgICB3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+TmFtZSgpLCBMIktleXN0cm9rZSIpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOwogCi0JdnAgPDwgcEV2ZW50LT5DaGFuZ2VFeCgpOwotCXJldHVybiBUUlVFOworICBpZiAocEV2ZW50LT5GaWVsZEZ1bGwoKSkKKyAgICB2cCA8PCBUUlVFOworICBlbHNlCisgICAgdnAgPDwgRkFMU0U7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGV2ZW50Ojpjb21taXRLZXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworRlhfQk9PTCBldmVudDo6a2V5RG93bihJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKLQl2cCA8PCBwRXZlbnQtPkNvbW1pdEtleSgpOwotCXJldHVybiBUUlVFOworICBpZiAocEV2ZW50LT5LZXlEb3duKCkpCisgICAgdnAgPDwgVFJVRTsKKyAgZWxzZQorICAgIHZwIDw8IEZBTFNFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6ZmllbGRGdWxsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgZXZlbnQ6Om1vZGlmaWVyKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghdnAuSXNHZXR0aW5nKCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKCF2cC5Jc0dldHRpbmcoKSAmJiB3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+TmFtZSgpLEwiS2V5c3Ryb2tlIikgIT0gMCkKLQkJcmV0dXJuIEZBTFNFOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAotCWlmIChwRXZlbnQtPkZpZWxkRnVsbCgpKQotCQl2cCA8PCBUUlVFOwotCWVsc2UKLQkJdnAgPDwgRkFMU0U7Ci0JcmV0dXJuIFRSVUU7CisgIGlmIChwRXZlbnQtPk1vZGlmaWVyKCkpCisgICAgdnAgPDwgVFJVRTsKKyAgZWxzZQorICAgIHZwIDw8IEZBTFNFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6a2V5RG93bihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGV2ZW50OjpuYW1lKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAotCWlmIChwRXZlbnQtPktleURvd24oKSkKLQkJdnAgPDwgVFJVRTsKLQllbHNlCi0JCXZwIDw8IEZBTFNFOwotCXJldHVybiBUUlVFOworICB2cCA8PCBwRXZlbnQtPk5hbWUoKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6Om1vZGlmaWVyKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgZXZlbnQ6OnJjKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7Ci0KLQlpZiAocEV2ZW50LT5Nb2RpZmllcigpKQotCQl2cCA8PCBUUlVFOwotCWVsc2UKLQkJdnAgPDwgRkFMU0U7Ci0JcmV0dXJuIFRSVUU7CisgIEZYX0JPT0wmIGJSYyA9IHBFdmVudC0+UmMoKTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgdnAgPj4gYlJjOworICB9IGVsc2UgeworICAgIHZwIDw8IGJSYzsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6bmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7Ci0KLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKLQotCXZwIDw8IHBFdmVudC0+TmFtZSgpOwotCXJldHVybiBUUlVFOworRlhfQk9PTCBldmVudDo6cmljaENoYW5nZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICB9IGVsc2UgeworICAgIDsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6cmMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwotCi0gICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCXZwPj5iUmM7Ci0JfQotCWVsc2UKLQl7Ci0JCXZwPDxiUmM7Ci0JfQotCXJldHVybiBUUlVFOworRlhfQk9PTCBldmVudDo6cmljaENoYW5nZUV4KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICB9IGVsc2UgeworICAgIDsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6cmljaENoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7Ci0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQl9Ci0JZWxzZQotCXsKLQkJOwotCX0KLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgZXZlbnQ6OnJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgfSBlbHNlIHsKKyAgICA7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnJpY2hDaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7Ci0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQl9Ci0JZWxzZQotCXsKLQkJOwotCX0KLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgZXZlbnQ6OnNlbEVuZChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworCisgIGlmICh3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+TmFtZSgpLCBMIktleXN0cm9rZSIpICE9IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGludCYgaVNlbEVuZCA9IHBFdmVudC0+U2VsRW5kKCk7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIHZwID4+IGlTZWxFbmQ7CisgIH0gZWxzZSB7CisgICAgdnAgPDwgaVNlbEVuZDsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAorRlhfQk9PTCBldmVudDo6c2VsU3RhcnQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKLUZYX0JPT0wgZXZlbnQ6OnJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7Ci0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQl9Ci0JZWxzZQotCXsKLQkJOwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgaWYgKHdjc2NtcCgoY29uc3Qgd2NoYXJfdCopcEV2ZW50LT5OYW1lKCksIEwiS2V5c3Ryb2tlIikgIT0gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGludCYgaVNlbFN0YXJ0ID0gcEV2ZW50LT5TZWxTdGFydCgpOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICB2cCA+PiBpU2VsU3RhcnQ7CisgIH0gZWxzZSB7CisgICAgdnAgPDwgaVNlbFN0YXJ0OworICB9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGV2ZW50OjpzZWxFbmQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworRlhfQk9PTCBldmVudDo6c2hpZnQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSxMIktleXN0cm9rZSIpICE9IDApCi0JewotCQlyZXR1cm4gVFJVRTsKLQl9CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCi0JaW50ICZpU2VsRW5kID0gcEV2ZW50LT5TZWxFbmQoKTsKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQl2cCA+PiBpU2VsRW5kOwotCX0KLQllbHNlCi0JewotCQl2cCA8PCBpU2VsRW5kOwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgaWYgKHBFdmVudC0+U2hpZnQoKSkKKyAgICB2cCA8PCBUUlVFOworICBlbHNlCisgICAgdnAgPDwgRkFMU0U7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGV2ZW50OjpzZWxTdGFydChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CitGWF9CT09MIGV2ZW50Ojpzb3VyY2UoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmICh3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+TmFtZSgpLEwiS2V5c3Ryb2tlIikgIT0gMCkKLQl7Ci0JCXJldHVybiBUUlVFOwotCX0KLQlpbnQgJmlTZWxTdGFydCA9IHBFdmVudC0+U2VsU3RhcnQoKTsKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQl2cCA+PiBpU2VsU3RhcnQ7Ci0JfQotCWVsc2UKLQl7Ci0JCXZwIDw8IGlTZWxTdGFydDsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworCisgIHZwIDw8IHBFdmVudC0+U291cmNlKCktPkdldEpTT2JqZWN0KCk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGV2ZW50OjpzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGV2ZW50Ojp0YXJnZXQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAotCWlmIChwRXZlbnQtPlNoaWZ0KCkpCi0JCXZwIDw8IFRSVUU7Ci0JZWxzZQotCQl2cCA8PCBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKKyAgdnAgPDwgcEV2ZW50LT5UYXJnZXRfRmllbGQoKS0+R2V0SlNPYmplY3QoKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGV2ZW50Ojp0YXJnZXROYW1lKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAotCXZwIDw8IHBFdmVudC0+U291cmNlKCktPkdldEpTT2JqZWN0KCk7Ci0JcmV0dXJuIFRSVUU7CisgIHZwIDw8IHBFdmVudC0+VGFyZ2V0TmFtZSgpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6dGFyZ2V0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgZXZlbnQ6OnR5cGUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghdnAuSXNHZXR0aW5nKCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwogCi0JdnA8PHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCktPkdldEpTT2JqZWN0KCk7Ci0JcmV0dXJuIFRSVUU7CisgIHZwIDw8IHBFdmVudC0+VHlwZSgpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6dGFyZ2V0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGV2ZW50Ojp2YWx1ZShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKIAotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwotCi0JdnAgPDwgcEV2ZW50LT5UYXJnZXROYW1lKCk7Ci0JcmV0dXJuIFRSVUU7CisgIGlmICh3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+VHlwZSgpLCBMIkZpZWxkIikgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENGWF9XaWRlU3RyaW5nJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIHZwID4+IHZhbDsKKyAgfSBlbHNlIHsKKyAgICB2cCA8PCB2YWw7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworRlhfQk9PTCBldmVudDo6d2lsbENvbW1pdChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CiAKLQl2cCA8PCBwRXZlbnQtPlR5cGUoKTsKLQlyZXR1cm4gVFJVRTsKKyAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQorICAgIHZwIDw8IFRSVUU7CisgIGVsc2UKKyAgICB2cCA8PCBGQUxTRTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci0KLUZYX0JPT0wgZXZlbnQ6OnZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKLQotCWlmICh3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+VHlwZSgpLEwiRmllbGQiKSAhPSAwKQotCQlyZXR1cm4gRkFMU0U7Ci0JaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0JCXJldHVybiBGQUxTRTsKLQlDRlhfV2lkZVN0cmluZyAmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQl2cCA+PiB2YWw7Ci0JfQotCWVsc2UKLQl7Ci0JCXZwIDw8IHZhbDsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgZXZlbnQ6OndpbGxDb21taXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOwotCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7Ci0KLQlpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpCi0JCXZwIDw8IFRSVUU7Ci0JZWxzZQotCQl2cCA8PCBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9nbG9iYWwuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9nbG9iYWwuY3BwCmluZGV4IDk3MzNkODEuLmMzYmY4MzcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZ2xvYmFsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAKQEAgLTQwLDUxICs0MCw0NiBAQAogfTsKIAogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBKU0NPTlNUX25TdHJpbmdIYXNoID0KLSAgQ0hhc2g8J3MnLCd0JywncicsJ2knLCduJywnZyc+Ojp2YWx1ZTsKKyAgICBDSGFzaDwncycsICd0JywgJ3InLCAnaScsICduJywgJ2cnPjo6dmFsdWU7CiBleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IEpTQ09OU1Rfbk51bWJlckhhc2ggPQotICBDSGFzaDwnbicsJ3UnLCdtJywnYicsJ2UnLCdyJz46OnZhbHVlOworICAgIENIYXNoPCduJywgJ3UnLCAnbScsICdiJywgJ2UnLCAncic+Ojp2YWx1ZTsKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgSlNDT05TVF9uQm9vbEhhc2ggPQotICBDSGFzaDwnYicsJ28nLCdvJywnbCcsJ2UnLCdhJywnbic+Ojp2YWx1ZTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgSlNDT05TVF9uRGF0ZUhhc2ggPQotICBDSGFzaDwnZCcsJ2EnLCd0JywnZSc+Ojp2YWx1ZTsKKyAgICBDSGFzaDwnYicsICdvJywgJ28nLCAnbCcsICdlJywgJ2EnLCAnbic+Ojp2YWx1ZTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgSlNDT05TVF9uRGF0ZUhhc2ggPSBDSGFzaDwnZCcsICdhJywgJ3QnLCAnZSc+Ojp2YWx1ZTsKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgSlNDT05TVF9uT2JqZWN0SGFzaCA9Ci0gIENIYXNoPCdvJywnYicsJ2onLCdlJywnYycsJ3QnPjo6dmFsdWU7CisgICAgQ0hhc2g8J28nLCAnYicsICdqJywgJ2UnLCAnYycsICd0Jz46OnZhbHVlOwogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBKU0NPTlNUX25GWG9iakhhc2ggPQotICBDSGFzaDwnZicsJ3gnLCdvJywnYicsJ2onPjo6dmFsdWU7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50IEpTQ09OU1Rfbk51bGxIYXNoID0KLSAgQ0hhc2g8J24nLCd1JywnbCcsJ2wnPjo6dmFsdWU7CisgICAgQ0hhc2g8J2YnLCAneCcsICdvJywgJ2InLCAnaic+Ojp2YWx1ZTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgSlNDT05TVF9uTnVsbEhhc2ggPSBDSGFzaDwnbicsICd1JywgJ2wnLCAnbCc+Ojp2YWx1ZTsKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgSlNDT05TVF9uVW5kZWZIYXNoID0KLSAgQ0hhc2g8J3UnLCduJywnZCcsJ2UnLCdmJywnaScsJ24nLCdlJywnZCc+Ojp2YWx1ZTsKKyAgICBDSGFzaDwndScsICduJywgJ2QnLCAnZScsICdmJywgJ2knLCAnbicsICdlJywgJ2QnPjo6dmFsdWU7CiAKICNpZmRlZiBfREVCVUcKLWNsYXNzIEhhc2hWZXJpZnkKLXsKLXB1YmxpYzoKK2NsYXNzIEhhc2hWZXJpZnkgeworIHB1YmxpYzoKICAgSGFzaFZlcmlmeSgpOwogfSBnX2hhc2hWZXJpZnk7CiAKLUhhc2hWZXJpZnk6Okhhc2hWZXJpZnkoKQoteworSGFzaFZlcmlmeTo6SGFzaFZlcmlmeSgpIHsKICAgQVNTRVJUKEpTQ09OU1RfblN0cmluZ0hhc2ggPT0KLSAgICBKU19DYWxjSGFzaChWQUxVRV9OQU1FX1NUUklORyx3Y3NsZW4oVkFMVUVfTkFNRV9TVFJJTkcpKSk7CisgICAgICAgICBKU19DYWxjSGFzaChWQUxVRV9OQU1FX1NUUklORywgd2NzbGVuKFZBTFVFX05BTUVfU1RSSU5HKSkpOwogICBBU1NFUlQoSlNDT05TVF9uTnVtYmVySGFzaCA9PQotICAgIEpTX0NhbGNIYXNoKFZBTFVFX05BTUVfTlVNQkVSLHdjc2xlbihWQUxVRV9OQU1FX05VTUJFUikpKTsKKyAgICAgICAgIEpTX0NhbGNIYXNoKFZBTFVFX05BTUVfTlVNQkVSLCB3Y3NsZW4oVkFMVUVfTkFNRV9OVU1CRVIpKSk7CiAgIEFTU0VSVChKU0NPTlNUX25Cb29sSGFzaCA9PQotICAgIEpTX0NhbGNIYXNoKFZBTFVFX05BTUVfQk9PTEVBTix3Y3NsZW4oVkFMVUVfTkFNRV9CT09MRUFOKSkpOworICAgICAgICAgSlNfQ2FsY0hhc2goVkFMVUVfTkFNRV9CT09MRUFOLCB3Y3NsZW4oVkFMVUVfTkFNRV9CT09MRUFOKSkpOwogICBBU1NFUlQoSlNDT05TVF9uRGF0ZUhhc2ggPT0KLSAgICBKU19DYWxjSGFzaChWQUxVRV9OQU1FX0RBVEUsd2NzbGVuKFZBTFVFX05BTUVfREFURSkpKTsKKyAgICAgICAgIEpTX0NhbGNIYXNoKFZBTFVFX05BTUVfREFURSwgd2NzbGVuKFZBTFVFX05BTUVfREFURSkpKTsKICAgQVNTRVJUKEpTQ09OU1Rfbk9iamVjdEhhc2ggPT0KLSAgICBKU19DYWxjSGFzaChWQUxVRV9OQU1FX09CSkVDVCx3Y3NsZW4oVkFMVUVfTkFNRV9PQkpFQ1QpKSk7CisgICAgICAgICBKU19DYWxjSGFzaChWQUxVRV9OQU1FX09CSkVDVCwgd2NzbGVuKFZBTFVFX05BTUVfT0JKRUNUKSkpOwogICBBU1NFUlQoSlNDT05TVF9uRlhvYmpIYXNoID09Ci0gICAgSlNfQ2FsY0hhc2goVkFMVUVfTkFNRV9GWE9CSix3Y3NsZW4oVkFMVUVfTkFNRV9GWE9CSikpKTsKKyAgICAgICAgIEpTX0NhbGNIYXNoKFZBTFVFX05BTUVfRlhPQkosIHdjc2xlbihWQUxVRV9OQU1FX0ZYT0JKKSkpOwogICBBU1NFUlQoSlNDT05TVF9uTnVsbEhhc2ggPT0KLSAgICBKU19DYWxjSGFzaChWQUxVRV9OQU1FX05VTEwsd2NzbGVuKFZBTFVFX05BTUVfTlVMTCkpKTsKKyAgICAgICAgIEpTX0NhbGNIYXNoKFZBTFVFX05BTUVfTlVMTCwgd2NzbGVuKFZBTFVFX05BTUVfTlVMTCkpKTsKICAgQVNTRVJUKEpTQ09OU1RfblVuZGVmSGFzaCA9PQotICAgIEpTX0NhbGNIYXNoKFZBTFVFX05BTUVfVU5ERUZJTkVELHdjc2xlbihWQUxVRV9OQU1FX1VOREVGSU5FRCkpKTsKKyAgICAgICAgIEpTX0NhbGNIYXNoKFZBTFVFX05BTUVfVU5ERUZJTkVELCB3Y3NsZW4oVkFMVUVfTkFNRV9VTkRFRklORUQpKSk7CiB9CiAjZW5kaWYKIAotCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX0dsb2JhbCkKIEVORF9KU19TVEFUSUNfQ09OU1QoKQogCkBAIC05Miw1MDAgKzg3LDQ2NSBAQAogRU5EX0pTX1NUQVRJQ19QUk9QKCkKIAogQkVHSU5fSlNfU1RBVElDX01FVEhPRChDSlNfR2xvYmFsKQotICAgIEpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0UGVyc2lzdGVudCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0UGVyc2lzdGVudCkKIEVORF9KU19TVEFUSUNfTUVUSE9EKCkKIAogSU1QTEVNRU5UX1NQRUNJQUxfSlNfQ0xBU1MoQ0pTX0dsb2JhbCwgZ2xvYmFsX2FsdGVybmF0ZSwgZ2xvYmFsKTsKIAotRlhfQk9PTCBDSlNfR2xvYmFsOjpJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpCi17Ci0gICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLSAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CitGWF9CT09MIENKU19HbG9iYWw6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICBnbG9iYWxfYWx0ZXJuYXRlKiBwR2xvYmFsID0gKGdsb2JhbF9hbHRlcm5hdGUqKUdldEVtYmVkT2JqZWN0KCk7Ci0gICAgQVNTRVJUKHBHbG9iYWwgIT0gTlVMTCk7CisgIGdsb2JhbF9hbHRlcm5hdGUqIHBHbG9iYWwgPSAoZ2xvYmFsX2FsdGVybmF0ZSopR2V0RW1iZWRPYmplY3QoKTsKKyAgQVNTRVJUKHBHbG9iYWwgIT0gTlVMTCk7CiAKLSAgICBwR2xvYmFsLT5Jbml0aWFsKHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKSk7CisgIHBHbG9iYWwtPkluaXRpYWwocENvbnRleHQtPkdldFJlYWRlckFwcCgpKTsKIAotICAgIHJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH07CiAKIGdsb2JhbF9hbHRlcm5hdGU6Omdsb2JhbF9hbHRlcm5hdGUoQ0pTX09iamVjdCogcEpTT2JqZWN0KQotICAgIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksCi0gICAgbV9wQXBwKE5VTEwpCi17CisgICAgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSwgbV9wQXBwKE5VTEwpIHt9CisKK2dsb2JhbF9hbHRlcm5hdGU6On5nbG9iYWxfYWx0ZXJuYXRlKHZvaWQpIHsKKyAgRGVzdHJveUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7CisgIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRSdW50aW1lRmFjdG9yeSgpLT5SZWxlYXNlR2xvYmFsRGF0YSgpOwogfQogCi1nbG9iYWxfYWx0ZXJuYXRlOjp+Z2xvYmFsX2FsdGVybmF0ZSh2b2lkKQotewotCURlc3Ryb3lHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOwotCUNQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRSdW50aW1lRmFjdG9yeSgpLT5SZWxlYXNlR2xvYmFsRGF0YSgpOwordm9pZCBnbG9iYWxfYWx0ZXJuYXRlOjpJbml0aWFsKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApIHsKKyAgbV9wQXBwID0gcEFwcDsKKyAgbV9wR2xvYmFsRGF0YSA9CisgICAgICBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0UnVudGltZUZhY3RvcnkoKS0+TmV3R2xvYmFsRGF0YShwQXBwKTsKKyAgVXBkYXRlR2xvYmFsUGVyc2lzdGVudFZhcmlhYmxlcygpOwogfQogCi12b2lkIGdsb2JhbF9hbHRlcm5hdGU6OkluaXRpYWwoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkKLXsKLQltX3BBcHAgPSBwQXBwOwotCW1fcEdsb2JhbERhdGEgPSBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0UnVudGltZUZhY3RvcnkoKS0+TmV3R2xvYmFsRGF0YShwQXBwKTsKLQlVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7CitGWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OlF1ZXJ5UHJvcGVydHkoY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lKSB7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhwcm9wbmFtZSkgIT0gTCJzZXRQZXJzaXN0ZW50IjsKIH0KIAotRlhfQk9PTCBnbG9iYWxfYWx0ZXJuYXRlOjpRdWVyeVByb3BlcnR5KGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSkKLXsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcocHJvcG5hbWUpICE9IEwic2V0UGVyc2lzdGVudCI7CitGWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OkRlbFByb3BlcnR5KElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAganNfZ2xvYmFsX2RhdGEqIHBEYXRhID0gTlVMTDsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHByb3BuYW1lKTsKKworICBpZiAobV9tYXBHbG9iYWwuTG9va3VwKHNQcm9wTmFtZSwgKHZvaWQqJilwRGF0YSkpIHsKKyAgICBwRGF0YS0+YkRlbGV0ZWQgPSBUUlVFOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OkRlbFByb3BlcnR5KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAganNfZ2xvYmFsX2RhdGEqIHBEYXRhID0gTlVMTDsKK0ZYX0JPT0wgZ2xvYmFsX2FsdGVybmF0ZTo6RG9Qcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKICAgICBDRlhfQnl0ZVN0cmluZyBzUHJvcE5hbWUgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocHJvcG5hbWUpOwotCi0gICAgaWYgKG1fbWFwR2xvYmFsLkxvb2t1cChzUHJvcE5hbWUsICh2b2lkKiYpcERhdGEpKQotICAgIHsKLSAgICAgICAgcERhdGEtPmJEZWxldGVkID0gVFJVRTsKKyAgICBzd2l0Y2ggKHZwLkdldFR5cGUoKSkgeworICAgICAgY2FzZSBWVF9udW1iZXI6IHsKKyAgICAgICAgZG91YmxlIGREYXRhOworICAgICAgICB2cCA+PiBkRGF0YTsKKyAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVIsIGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVlRfYm9vbGVhbjogeworICAgICAgICBib29sIGJEYXRhOworICAgICAgICB2cCA+PiBiRGF0YTsKKyAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEYXRhLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVlRfc3RyaW5nOiB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIHNEYXRhOworICAgICAgICB2cCA+PiBzRGF0YTsKKyAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkcsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHNEYXRhLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgRkFMU0UpOworICAgICAgfQorICAgICAgY2FzZSBWVF9vYmplY3Q6IHsKKyAgICAgICAgSlNPYmplY3QgcERhdGE7CisgICAgICAgIHZwID4+IHBEYXRhOworICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgIiIsIHBEYXRhLCBGQUxTRSk7CisgICAgICB9CisgICAgICBjYXNlIFZUX251bGw6IHsKKyAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVlRfdW5kZWZpbmVkOiB7CisgICAgICAgIERlbFByb3BlcnR5KGNjLCBwcm9wbmFtZSwgc0Vycm9yKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKICAgICB9CisgIH0gZWxzZSB7CisgICAgdm9pZCogcFZvaWQgPSBudWxscHRyOworICAgIGlmICghbV9tYXBHbG9iYWwuTG9va3VwKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwcm9wbmFtZSksIHBWb2lkKSkgeworICAgICAgdnAuU2V0TnVsbCgpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGlmICghcFZvaWQpIHsKKyAgICAgIHZwLlNldE51bGwoKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBqc19nbG9iYWxfZGF0YSogcERhdGEgPSAoanNfZ2xvYmFsX2RhdGEqKXBWb2lkOworICAgIGlmIChwRGF0YS0+YkRlbGV0ZWQpCisgICAgICByZXR1cm4gVFJVRTsKIAorICAgIHN3aXRjaCAocERhdGEtPm5UeXBlKSB7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6CisgICAgICAgIHZwIDw8IHBEYXRhLT5kRGF0YTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOgorICAgICAgICB2cCA8PCBwRGF0YS0+YkRhdGE7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgorICAgICAgICB2cCA8PCBwRGF0YS0+c0RhdGE7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOiB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmogPQorICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcodnAuR2V0SXNvbGF0ZSgpLCBwRGF0YS0+cERhdGEpOworICAgICAgICB2cCA8PCBvYmo7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKKyAgICAgICAgdnAuU2V0TnVsbCgpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgZ2xvYmFsX2FsdGVybmF0ZTo6c2V0UGVyc2lzdGVudChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOworICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBDRlhfQnl0ZVN0cmluZyBzTmFtZSA9IHBhcmFtc1swXS5Ub0NGWEJ5dGVTdHJpbmcoKTsKKworICBqc19nbG9iYWxfZGF0YSogcERhdGEgPSBOVUxMOworICBpZiAobV9tYXBHbG9iYWwuTG9va3VwKHNOYW1lLCAodm9pZComKXBEYXRhKSkgeworICAgIGlmIChwRGF0YSAmJiAhcERhdGEtPmJEZWxldGVkKSB7CisgICAgICBwRGF0YS0+YlBlcnNpc3RlbnQgPSBwYXJhbXNbMV0uVG9Cb29sKCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU05PR0xPQkFMKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OkRvUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHByb3BuYW1lKTsKLSAgICAgICAgc3dpdGNoICh2cC5HZXRUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBWVF9udW1iZXI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGREYXRhOwotICAgICAgICAgICAgICAgIHZwID4+IGREYXRhOwotICAgICAgICAgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSLCBkRGF0YSwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgRkFMU0UpOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFZUX2Jvb2xlYW46Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbCBiRGF0YTsKLSAgICAgICAgICAgICAgICB2cCA+PiBiRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4sIDAsIGJEYXRhLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBWVF9zdHJpbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0RhdGE7Ci0gICAgICAgICAgICAgICAgdnAgPj4gc0RhdGE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBzRGF0YSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBWVF9vYmplY3Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSlNPYmplY3QgcERhdGE7Ci0gICAgICAgICAgICAgICAgdnAgPj4gcERhdGE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1QsIDAsIGZhbHNlLCAiIiwgcERhdGEsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBWVF9udWxsOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTCwgMCwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgRkFMU0UpOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFZUX3VuZGVmaW5lZDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEZWxQcm9wZXJ0eShjYywgcHJvcG5hbWUsIHNFcnJvcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2b2lkKiBwVm9pZCA9IG51bGxwdHI7Ci0gICAgICAgIGlmICghbV9tYXBHbG9iYWwuTG9va3VwKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwcm9wbmFtZSksIHBWb2lkKSkKLSAgICAgICAgewotICAgICAgICAgICAgdnAuU2V0TnVsbCgpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwVm9pZCkKLSAgICAgICAgewotICAgICAgICAgICAgdnAuU2V0TnVsbCgpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAganNfZ2xvYmFsX2RhdGEqIHBEYXRhID0gKGpzX2dsb2JhbF9kYXRhKilwVm9pZDsKLSAgICAgICAgaWYgKHBEYXRhLT5iRGVsZXRlZCkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwordm9pZCBnbG9iYWxfYWx0ZXJuYXRlOjpVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCkgeworICBBU1NFUlQobV9wR2xvYmFsRGF0YSAhPSBOVUxMKTsKIAotICAgICAgICBzd2l0Y2ggKHBEYXRhLT5uVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgotICAgICAgICAgICAgICAgIHZwIDw8IHBEYXRhLT5kRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46Ci0gICAgICAgICAgICAgICAgdnAgPDwgcERhdGEtPmJEYXRhOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgotICAgICAgICAgICAgICAgIHZwIDw8IHBEYXRhLT5zRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmogPSB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyh2cC5HZXRJc29sYXRlKCkscERhdGEtPnBEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgdnAgPDwgb2JqOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOgotICAgICAgICAgICAgICAgIHZwLlNldE51bGwoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OnNldFBlcnNpc3RlbnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKLSAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQotICAgIHsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIENGWF9CeXRlU3RyaW5nIHNOYW1lID0gcGFyYW1zWzBdLlRvQ0ZYQnl0ZVN0cmluZygpOwotCi0gICAganNfZ2xvYmFsX2RhdGEqIHBEYXRhID0gTlVMTDsKLSAgICBpZiAobV9tYXBHbG9iYWwuTG9va3VwKHNOYW1lLCAodm9pZComKXBEYXRhKSkKLSAgICB7Ci0gICAgICAgIGlmIChwRGF0YSAmJiAhcERhdGEtPmJEZWxldGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRGF0YS0+YlBlcnNpc3RlbnQgPSBwYXJhbXNbMV0uVG9Cb29sKCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTTk9HTE9CQUwpOwotICAgIHJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBnbG9iYWxfYWx0ZXJuYXRlOjpVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCkKLXsKLSAgICBBU1NFUlQobV9wR2xvYmFsRGF0YSAhPSBOVUxMKTsKLQotICAgIGZvciAoaW50IGk9MCxzej1tX3BHbG9iYWxEYXRhLT5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gbV9wR2xvYmFsRGF0YS0+R2V0QXQoaSk7Ci0gICAgICAgIEFTU0VSVChwRGF0YSAhPSBOVUxMKTsKLQotICAgICAgICBzd2l0Y2ggKHBEYXRhLT5kYXRhLm5UeXBlKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUjoKLSAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlcyhwRGF0YS0+ZGF0YS5zS2V5LCBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSLCBwRGF0YS0+ZGF0YS5kRGF0YSwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOwotICAgICAgICAgICAgSlNfUHV0T2JqZWN0TnVtYmVyKE5VTEwsKEpTRlhPYmplY3QpKCptX3BKU09iamVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmRhdGEuc0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSwgcERhdGEtPmRhdGEuZERhdGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46Ci0gICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4sIDAsIChib29sKShwRGF0YS0+ZGF0YS5iRGF0YSA9PSAxKSwgIiIsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7Ci0gICAgICAgICAgICBKU19QdXRPYmplY3RCb29sZWFuKE5VTEwsKEpTRlhPYmplY3QpKCptX3BKU09iamVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5kYXRhLnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksIChib29sKShwRGF0YS0+ZGF0YS5iRGF0YSA9PSAxKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgotICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBwRGF0YS0+ZGF0YS5zRGF0YSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIHBEYXRhLT5iUGVyc2lzdGVudCA9PSAxKTsKLSAgICAgICAgICAgIEpTX1B1dE9iamVjdFN0cmluZyhOVUxMLCAoSlNGWE9iamVjdCkoKm1fcEpTT2JqZWN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5kYXRhLnNEYXRhLlVURjhEZWNvZGUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUpTX1J1bnRpbWUqIHBSdW50aW1lID0gSlNfR2V0UnVudGltZSgoSlNGWE9iamVjdCkoKm1fcEpTT2JqZWN0KSk7Ci0gICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBKU19OZXdGeER5bmFtaWNPYmoocFJ1bnRpbWUsIE5VTEwsIC0xKTsKLQotICAgICAgICAgICAgICAgIFB1dE9iamVjdFByb3BlcnR5KHBPYmosICZwRGF0YS0+ZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVCwgMCwgZmFsc2UsICIiLAotICAgICAgICAgICAgICAgICAgICAoSlNPYmplY3QpcE9iaiwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOwotICAgICAgICAgICAgICAgIEpTX1B1dE9iamVjdE9iamVjdChOVUxMLChKU0ZYT2JqZWN0KSgqbV9wSlNPYmplY3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLCAoSlNPYmplY3QpcE9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKLSAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlcyhwRGF0YS0+ZGF0YS5zS2V5LCBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTCwgMCwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOwotICAgICAgICAgICAgSlNfUHV0T2JqZWN0TnVsbChOVUxMLChKU0ZYT2JqZWN0KSgqbV9wSlNPYmplY3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIGdsb2JhbF9hbHRlcm5hdGU6OkNvbW1pdEdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCkKLXsKLSAgICBBU1NFUlQobV9wR2xvYmFsRGF0YSAhPSBOVUxMKTsKLQotICAgIEZYX1BPU0lUSU9OICBwb3MgPSBtX21hcEdsb2JhbC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykKLSAgICB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWU7Ci0gICAgICAgIGpzX2dsb2JhbF9kYXRhKiBwRGF0YSA9IE5VTEw7Ci0gICAgICAgIG1fbWFwR2xvYmFsLkdldE5leHRBc3NvYyhwb3MsIG5hbWUsICh2b2lkKiYpcERhdGEpOwotCi0gICAgICAgIGlmIChwRGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBEYXRhLT5iRGVsZXRlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5EZWxldGVHbG9iYWxWYXJpYWJsZShuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHBEYXRhLT5uVHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgotICAgICAgICAgICAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZU51bWJlcihuYW1lLCBwRGF0YS0+ZERhdGEpOwotICAgICAgICAgICAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQobmFtZSwgcERhdGEtPmJQZXJzaXN0ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjoKLSAgICAgICAgICAgICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKG5hbWUsIHBEYXRhLT5iRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLCBwRGF0YS0+YlBlcnNpc3RlbnQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICAgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlU3RyaW5nKG5hbWUsIHBEYXRhLT5zRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLCBwRGF0YS0+YlBlcnNpc3RlbnQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIC8vaWYgKHBEYXRhLT5wRGF0YSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkgYXJyYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqID0gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcoR2V0SlNPYmplY3QoKS0+R2V0SXNvbGF0ZSgpLHBEYXRhLT5wRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RUb0FycmF5KG9iaiwgYXJyYXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVPYmplY3QobmFtZSwgYXJyYXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KG5hbWUsIHBEYXRhLT5iUGVyc2lzdGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKLSAgICAgICAgICAgICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVOdWxsKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQobmFtZSwgcERhdGEtPmJQZXJzaXN0ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIGdsb2JhbF9hbHRlcm5hdGU6Ok9iamVjdFRvQXJyYXkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSkKLXsKLSAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwT2JqLT5DcmVhdGlvbkNvbnRleHQoKTsKLSAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IGNvbnRleHQtPkdldElzb2xhdGUoKTsKLSAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBwS2V5TGlzdCA9IEpTX0dldE9iamVjdEVsZW1lbnROYW1lcyhpc29sYXRlLCBwT2JqKTsKLSAgICBpbnQgbk9iakVsZW1lbnRzID0gcEtleUxpc3QtPkxlbmd0aCgpOwotCi0gICAgZm9yIChpbnQgaT0wOyBpPG5PYmpFbGVtZW50czsgaSsrKQotICAgIHsKLQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3cyA9IEpTX1RvU3RyaW5nKGlzb2xhdGUsIEpTX0dldEFycmF5RWxlbWVudChpc29sYXRlLCBwS2V5TGlzdCwgaSkpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzS2V5ID0gd3MuVVRGOEVuY29kZSgpOwotCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIHdzLmNfc3RyKCkpOwotICAgICAgICBGWEpTVkFMVUVUWVBFIHZ0ID0gR0VUX1ZBTFVFX1RZUEUodik7Ci0gICAgICAgIHN3aXRjaCAodnQpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBWVF9udW1iZXI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0pTX0tleVZhbHVlKiBwT2JqRWxlbWVudCA9IG5ldyBDSlNfS2V5VmFsdWU7Ci0gICAgICAgICAgICAgICAgcE9iakVsZW1lbnQtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUjsKLSAgICAgICAgICAgICAgICBwT2JqRWxlbWVudC0+c0tleSA9IHNLZXk7Ci0gICAgICAgICAgICAgICAgcE9iakVsZW1lbnQtPmREYXRhID0gSlNfVG9OdW1iZXIoaXNvbGF0ZSwgdik7Ci0gICAgICAgICAgICAgICAgYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZUX2Jvb2xlYW46Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0pTX0tleVZhbHVlKiBwT2JqRWxlbWVudCA9IG5ldyBDSlNfS2V5VmFsdWU7Ci0gICAgICAgICAgICAgICAgcE9iakVsZW1lbnQtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU47Ci0gICAgICAgICAgICAgICAgcE9iakVsZW1lbnQtPnNLZXkgPSBzS2V5OwotICAgICAgICAgICAgICAgIHBPYmpFbGVtZW50LT5kRGF0YSA9IEpTX1RvQm9vbGVhbihpc29sYXRlLCB2KTsKLSAgICAgICAgICAgICAgICBhcnJheS5BZGQocE9iakVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVlRfc3RyaW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNWYWx1ZSA9IENKU19WYWx1ZShpc29sYXRlLCB2LCBWVF9zdHJpbmcpLlRvQ0ZYQnl0ZVN0cmluZygpOwotICAgICAgICAgICAgICAgIENKU19LZXlWYWx1ZSogcE9iakVsZW1lbnQgPSBuZXcgQ0pTX0tleVZhbHVlOwotICAgICAgICAgICAgICAgIHBPYmpFbGVtZW50LT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc7Ci0gICAgICAgICAgICAgICAgcE9iakVsZW1lbnQtPnNLZXkgPSBzS2V5OwotICAgICAgICAgICAgICAgIHBPYmpFbGVtZW50LT5zRGF0YSA9IHNWYWx1ZTsKLSAgICAgICAgICAgICAgICBhcnJheS5BZGQocE9iakVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVlRfb2JqZWN0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENKU19LZXlWYWx1ZSogcE9iakVsZW1lbnQgPSBuZXcgQ0pTX0tleVZhbHVlOwotICAgICAgICAgICAgICAgIHBPYmpFbGVtZW50LT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q7Ci0gICAgICAgICAgICAgICAgcE9iakVsZW1lbnQtPnNLZXkgPSBzS2V5OwotICAgICAgICAgICAgICAgIE9iamVjdFRvQXJyYXkoSlNfVG9PYmplY3QoaXNvbGF0ZSwgdiksIHBPYmpFbGVtZW50LT5vYmpEYXRhKTsKLSAgICAgICAgICAgICAgICBhcnJheS5BZGQocE9iakVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVlRfbnVsbDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSlNfS2V5VmFsdWUqIHBPYmpFbGVtZW50ID0gbmV3IENKU19LZXlWYWx1ZTsKLSAgICAgICAgICAgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDsKLSAgICAgICAgICAgICAgICBwT2JqRWxlbWVudC0+c0tleSA9IHNLZXk7Ci0gICAgICAgICAgICAgICAgYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgZ2xvYmFsX2FsdGVybmF0ZTo6UHV0T2JqZWN0UHJvcGVydHkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIENKU19LZXlWYWx1ZSogcERhdGEpCi17CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fcEdsb2JhbERhdGEtPkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IG1fcEdsb2JhbERhdGEtPkdldEF0KGkpOwogICAgIEFTU0VSVChwRGF0YSAhPSBOVUxMKTsKIAotICAgIGZvciAoaW50IGk9MCxzej1wRGF0YS0+b2JqRGF0YS5Db3VudCgpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgICBDSlNfS2V5VmFsdWUqIHBPYmpEYXRhID0gcERhdGEtPm9iakRhdGEuR2V0QXQoaSk7Ci0gICAgICAgIEFTU0VSVChwT2JqRGF0YSAhPSBOVUxMKTsKKyAgICBzd2l0Y2ggKHBEYXRhLT5kYXRhLm5UeXBlKSB7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6CisgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlcyhwRGF0YS0+ZGF0YS5zS2V5LCBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmRhdGEuZERhdGEsIGZhbHNlLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CisgICAgICAgIEpTX1B1dE9iamVjdE51bWJlcihOVUxMLCAoSlNGWE9iamVjdCkoKm1fcEpTT2JqZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5kYXRhLnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZGF0YS5kRGF0YSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjoKKyAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvb2wpKHBEYXRhLT5kYXRhLmJEYXRhID09IDEpLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CisgICAgICAgIEpTX1B1dE9iamVjdEJvb2xlYW4oTlVMTCwgKEpTRlhPYmplY3QpKCptX3BKU09iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmRhdGEuc0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYm9vbCkocERhdGEtPmRhdGEuYkRhdGEgPT0gMSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzoKKyAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkcsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgcERhdGEtPmRhdGEuc0RhdGEsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOworICAgICAgICBKU19QdXRPYmplY3RTdHJpbmcoTlVMTCwgKEpTRlhPYmplY3QpKCptX3BKU09iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmRhdGEuc0RhdGEuVVRGOERlY29kZSgpLmNfc3RyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDogeworICAgICAgICBJSlNfUnVudGltZSogcFJ1bnRpbWUgPSBKU19HZXRSdW50aW1lKChKU0ZYT2JqZWN0KSgqbV9wSlNPYmplY3QpKTsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBKU19OZXdGeER5bmFtaWNPYmoocFJ1bnRpbWUsIE5VTEwsIC0xKTsKIAotICAgICAgICBzd2l0Y2ggKHBPYmpEYXRhLT5uVHlwZSkKLSAgICAgICAgewotICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6Ci0gICAgICAgICAgICBKU19QdXRPYmplY3ROdW1iZXIoTlVMTCwoSlNPYmplY3QpcE9iaiwgcE9iakRhdGEtPnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksIHBPYmpEYXRhLT5kRGF0YSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjoKLSAgICAgICAgICAgIEpTX1B1dE9iamVjdEJvb2xlYW4oTlVMTCwoSlNPYmplY3QpcE9iaiwgcE9iakRhdGEtPnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksIChib29sKShwT2JqRGF0YS0+YkRhdGEgPT0gMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzoKLSAgICAgICAgICAgIEpTX1B1dE9iamVjdFN0cmluZyhOVUxMLChKU09iamVjdClwT2JqLCBwT2JqRGF0YS0+c0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSwgcE9iakRhdGEtPnNEYXRhLlVURjhEZWNvZGUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUpTX1J1bnRpbWUqIHBSdW50aW1lID0gSlNfR2V0UnVudGltZSgoSlNGWE9iamVjdCkoKm1fcEpTT2JqZWN0KSk7Ci0gICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBOZXdPYmogPSBKU19OZXdGeER5bmFtaWNPYmoocFJ1bnRpbWUsIE5VTEwsIC0xKTsKLSAgICAgICAgICAgICAgICBQdXRPYmplY3RQcm9wZXJ0eShwTmV3T2JqLCBwT2JqRGF0YSk7Ci0gICAgICAgICAgICAgICAgSlNfUHV0T2JqZWN0T2JqZWN0KE5VTEwsIChKU09iamVjdClwT2JqLCBwT2JqRGF0YS0+c0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSwgKEpTT2JqZWN0KXBOZXdPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6Ci0gICAgICAgICAgICBKU19QdXRPYmplY3ROdWxsKE5VTEwsKEpTT2JqZWN0KXBPYmosIHBPYmpEYXRhLT5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIFB1dE9iamVjdFByb3BlcnR5KHBPYmosICZwRGF0YS0+ZGF0YSk7CisKKyAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1QsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgIiIsIChKU09iamVjdClwT2JqLCBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CisgICAgICAgIEpTX1B1dE9iamVjdE9iamVjdChOVUxMLCAoSlNGWE9iamVjdCkoKm1fcEpTT2JqZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5kYXRhLnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoSlNPYmplY3QpcE9iaik7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKKyAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCA9PSAxKTsKKyAgICAgICAgSlNfUHV0T2JqZWN0TnVsbChOVUxMLCAoSlNGWE9iamVjdCkoKm1fcEpTT2JqZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpKTsKKyAgICAgICAgYnJlYWs7CiAgICAgfQorICB9CiB9CiAKLXZvaWQgZ2xvYmFsX2FsdGVybmF0ZTo6RGVzdHJveUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCkKLXsKLSAgICBGWF9QT1NJVElPTiAgcG9zID0gbV9tYXBHbG9iYWwuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpCi0gICAgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lOwotICAgICAgICBqc19nbG9iYWxfZGF0YSogcERhdGEgPSBOVUxMOwotICAgICAgICBtX21hcEdsb2JhbC5HZXROZXh0QXNzb2MocG9zLCBuYW1lLCAodm9pZComKXBEYXRhKTsKLSAgICAgICAgZGVsZXRlIHBEYXRhOwotICAgIH0KK3ZvaWQgZ2xvYmFsX2FsdGVybmF0ZTo6Q29tbWl0R2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKSB7CisgIEFTU0VSVChtX3BHbG9iYWxEYXRhICE9IE5VTEwpOwogCi0gICAgbV9tYXBHbG9iYWwuUmVtb3ZlQWxsKCk7CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fbWFwR2xvYmFsLkdldFN0YXJ0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENGWF9CeXRlU3RyaW5nIG5hbWU7CisgICAganNfZ2xvYmFsX2RhdGEqIHBEYXRhID0gTlVMTDsKKyAgICBtX21hcEdsb2JhbC5HZXROZXh0QXNzb2MocG9zLCBuYW1lLCAodm9pZComKXBEYXRhKTsKKworICAgIGlmIChwRGF0YSkgeworICAgICAgaWYgKHBEYXRhLT5iRGVsZXRlZCkgeworICAgICAgICBtX3BHbG9iYWxEYXRhLT5EZWxldGVHbG9iYWxWYXJpYWJsZShuYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAocERhdGEtPm5UeXBlKSB7CisgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgorICAgICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVOdW1iZXIobmFtZSwgcERhdGEtPmREYXRhKTsKKyAgICAgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOgorICAgICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKG5hbWUsIHBEYXRhLT5iRGF0YSk7CisgICAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YlBlcnNpc3RlbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgorICAgICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVTdHJpbmcobmFtZSwgcERhdGEtPnNEYXRhKTsKKyAgICAgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q6CisgICAgICAgICAgICAvLyBpZiAocERhdGEtPnBEYXRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSBhcnJheTsKKyAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaiA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KAorICAgICAgICAgICAgICAgICAgR2V0SlNPYmplY3QoKS0+R2V0SXNvbGF0ZSgpLCBwRGF0YS0+cERhdGEpOworICAgICAgICAgICAgICBPYmplY3RUb0FycmF5KG9iaiwgYXJyYXkpOworICAgICAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZU9iamVjdChuYW1lLCBhcnJheSk7CisgICAgICAgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJQZXJzaXN0ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6CisgICAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZU51bGwobmFtZSk7CisgICAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YlBlcnNpc3RlbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAordm9pZCBnbG9iYWxfYWx0ZXJuYXRlOjpPYmplY3RUb0FycmF5KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSkgeworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwT2JqLT5DcmVhdGlvbkNvbnRleHQoKTsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBjb250ZXh0LT5HZXRJc29sYXRlKCk7CisgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBLZXlMaXN0ID0gSlNfR2V0T2JqZWN0RWxlbWVudE5hbWVzKGlzb2xhdGUsIHBPYmopOworICBpbnQgbk9iakVsZW1lbnRzID0gcEtleUxpc3QtPkxlbmd0aCgpOwogCi1GWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OlNldEdsb2JhbFZhcmlhYmxlcyhjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwgaW50IG5UeXBlLAotICAgICAgICAgICAgICAgIGRvdWJsZSBkRGF0YSwgYm9vbCBiRGF0YSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNEYXRhLCBKU09iamVjdCBwRGF0YSwgYm9vbCBiRGVmYXVsdFBlcnNpc3RlbnQpCi17Ci0gICAgaWYgKHByb3BuYW1lID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuT2JqRWxlbWVudHM7IGkrKykgeworICAgIENGWF9XaWRlU3RyaW5nIHdzID0KKyAgICAgICAgSlNfVG9TdHJpbmcoaXNvbGF0ZSwgSlNfR2V0QXJyYXlFbGVtZW50KGlzb2xhdGUsIHBLZXlMaXN0LCBpKSk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc0tleSA9IHdzLlVURjhFbmNvZGUoKTsKIAotICAgIGpzX2dsb2JhbF9kYXRhKiBwVGVtcCA9IE5VTEw7Ci0gICAgbV9tYXBHbG9iYWwuTG9va3VwKHByb3BuYW1lLCAodm9pZComKXBUZW1wKTsKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2ID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCB3cy5jX3N0cigpKTsKKyAgICBGWEpTVkFMVUVUWVBFIHZ0ID0gR0VUX1ZBTFVFX1RZUEUodik7CisgICAgc3dpdGNoICh2dCkgeworICAgICAgY2FzZSBWVF9udW1iZXI6IHsKKyAgICAgICAgQ0pTX0tleVZhbHVlKiBwT2JqRWxlbWVudCA9IG5ldyBDSlNfS2V5VmFsdWU7CisgICAgICAgIHBPYmpFbGVtZW50LT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI7CisgICAgICAgIHBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKKyAgICAgICAgcE9iakVsZW1lbnQtPmREYXRhID0gSlNfVG9OdW1iZXIoaXNvbGF0ZSwgdik7CisgICAgICAgIGFycmF5LkFkZChwT2JqRWxlbWVudCk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBWVF9ib29sZWFuOiB7CisgICAgICAgIENKU19LZXlWYWx1ZSogcE9iakVsZW1lbnQgPSBuZXcgQ0pTX0tleVZhbHVlOworICAgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjsKKyAgICAgICAgcE9iakVsZW1lbnQtPnNLZXkgPSBzS2V5OworICAgICAgICBwT2JqRWxlbWVudC0+ZERhdGEgPSBKU19Ub0Jvb2xlYW4oaXNvbGF0ZSwgdik7CisgICAgICAgIGFycmF5LkFkZChwT2JqRWxlbWVudCk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBWVF9zdHJpbmc6IHsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc1ZhbHVlID0KKyAgICAgICAgICAgIENKU19WYWx1ZShpc29sYXRlLCB2LCBWVF9zdHJpbmcpLlRvQ0ZYQnl0ZVN0cmluZygpOworICAgICAgICBDSlNfS2V5VmFsdWUqIHBPYmpFbGVtZW50ID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE9iakVsZW1lbnQtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzsKKyAgICAgICAgcE9iakVsZW1lbnQtPnNLZXkgPSBzS2V5OworICAgICAgICBwT2JqRWxlbWVudC0+c0RhdGEgPSBzVmFsdWU7CisgICAgICAgIGFycmF5LkFkZChwT2JqRWxlbWVudCk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBWVF9vYmplY3Q6IHsKKyAgICAgICAgQ0pTX0tleVZhbHVlKiBwT2JqRWxlbWVudCA9IG5ldyBDSlNfS2V5VmFsdWU7CisgICAgICAgIHBPYmpFbGVtZW50LT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q7CisgICAgICAgIHBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKKyAgICAgICAgT2JqZWN0VG9BcnJheShKU19Ub09iamVjdChpc29sYXRlLCB2KSwgcE9iakVsZW1lbnQtPm9iakRhdGEpOworICAgICAgICBhcnJheS5BZGQocE9iakVsZW1lbnQpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgVlRfbnVsbDogeworICAgICAgICBDSlNfS2V5VmFsdWUqIHBPYmpFbGVtZW50ID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE9iakVsZW1lbnQtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX05VTEw7CisgICAgICAgIHBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKKyAgICAgICAgYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KIAotICAgIGlmIChwVGVtcCkKLSAgICB7Ci0gICAgICAgIGlmIChwVGVtcC0+YkRlbGV0ZWQgfHwgcFRlbXAtPm5UeXBlICE9IG5UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVGVtcC0+ZERhdGEgPSAwOwotICAgICAgICAgICAgcFRlbXAtPmJEYXRhID0gMDsKLSAgICAgICAgICAgIHBUZW1wLT5zRGF0YSA9ICIiOwotICAgICAgICAgICAgcFRlbXAtPm5UeXBlID0gblR5cGU7Ci0gICAgICAgIH0KK3ZvaWQgZ2xvYmFsX2FsdGVybmF0ZTo6UHV0T2JqZWN0UHJvcGVydHkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19LZXlWYWx1ZSogcERhdGEpIHsKKyAgQVNTRVJUKHBEYXRhICE9IE5VTEwpOwogCi0gICAgICAgIHBUZW1wLT5iRGVsZXRlZCA9IEZBTFNFOworICBmb3IgKGludCBpID0gMCwgc3ogPSBwRGF0YS0+b2JqRGF0YS5Db3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgIENKU19LZXlWYWx1ZSogcE9iakRhdGEgPSBwRGF0YS0+b2JqRGF0YS5HZXRBdChpKTsKKyAgICBBU1NFUlQocE9iakRhdGEgIT0gTlVMTCk7CiAKLSAgICAgICAgc3dpdGNoIChuVHlwZSkKLSAgICAgICAgewotICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFRlbXAtPmREYXRhID0gZERhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwVGVtcC0+YkRhdGEgPSBiRGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFRlbXAtPnNEYXRhID0gc0RhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBUZW1wLT5wRGF0YS5SZXNldChKU19HZXRSdW50aW1lKHBEYXRhKSwgcERhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQorICAgIHN3aXRjaCAocE9iakRhdGEtPm5UeXBlKSB7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6CisgICAgICAgIEpTX1B1dE9iamVjdE51bWJlcihOVUxMLCAoSlNPYmplY3QpcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmpEYXRhLT5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iakRhdGEtPmREYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOgorICAgICAgICBKU19QdXRPYmplY3RCb29sZWFuKE5VTEwsIChKU09iamVjdClwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmpEYXRhLT5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChib29sKShwT2JqRGF0YS0+YkRhdGEgPT0gMSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzoKKyAgICAgICAgSlNfUHV0T2JqZWN0U3RyaW5nKE5VTEwsIChKU09iamVjdClwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iakRhdGEtPnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqRGF0YS0+c0RhdGEuVVRGOERlY29kZSgpLmNfc3RyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDogeworICAgICAgICBJSlNfUnVudGltZSogcFJ1bnRpbWUgPSBKU19HZXRSdW50aW1lKChKU0ZYT2JqZWN0KSgqbV9wSlNPYmplY3QpKTsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBOZXdPYmogPSBKU19OZXdGeER5bmFtaWNPYmoocFJ1bnRpbWUsIE5VTEwsIC0xKTsKKyAgICAgICAgUHV0T2JqZWN0UHJvcGVydHkocE5ld09iaiwgcE9iakRhdGEpOworICAgICAgICBKU19QdXRPYmplY3RPYmplY3QoTlVMTCwgKEpTT2JqZWN0KXBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqRGF0YS0+c0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChKU09iamVjdClwTmV3T2JqKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOgorICAgICAgICBKU19QdXRPYmplY3ROdWxsKE5VTEwsIChKU09iamVjdClwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmpEYXRhLT5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CiAKLSAgICAgICAgcmV0dXJuIFRSVUU7Cit2b2lkIGdsb2JhbF9hbHRlcm5hdGU6OkRlc3Ryb3lHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpIHsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9tYXBHbG9iYWwuR2V0U3RhcnRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZTsKKyAgICBqc19nbG9iYWxfZGF0YSogcERhdGEgPSBOVUxMOworICAgIG1fbWFwR2xvYmFsLkdldE5leHRBc3NvYyhwb3MsIG5hbWUsICh2b2lkKiYpcERhdGEpOworICAgIGRlbGV0ZSBwRGF0YTsKKyAgfQorCisgIG1fbWFwR2xvYmFsLlJlbW92ZUFsbCgpOworfQorCitGWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OlNldEdsb2JhbFZhcmlhYmxlcyhjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09iamVjdCBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRlZmF1bHRQZXJzaXN0ZW50KSB7CisgIGlmIChwcm9wbmFtZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBqc19nbG9iYWxfZGF0YSogcFRlbXAgPSBOVUxMOworICBtX21hcEdsb2JhbC5Mb29rdXAocHJvcG5hbWUsICh2b2lkKiYpcFRlbXApOworCisgIGlmIChwVGVtcCkgeworICAgIGlmIChwVGVtcC0+YkRlbGV0ZWQgfHwgcFRlbXAtPm5UeXBlICE9IG5UeXBlKSB7CisgICAgICBwVGVtcC0+ZERhdGEgPSAwOworICAgICAgcFRlbXAtPmJEYXRhID0gMDsKKyAgICAgIHBUZW1wLT5zRGF0YSA9ICIiOworICAgICAgcFRlbXAtPm5UeXBlID0gblR5cGU7CiAgICAgfQogCi0gICAganNfZ2xvYmFsX2RhdGEqIHBOZXdEYXRhID0gTlVMTDsKKyAgICBwVGVtcC0+YkRlbGV0ZWQgPSBGQUxTRTsKIAotICAgIHN3aXRjaCAoblR5cGUpCi0gICAgewotICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUjoKLSAgICAgICAgewotICAgICAgICAgICAgcE5ld0RhdGEgPSBuZXcganNfZ2xvYmFsX2RhdGE7Ci0gICAgICAgICAgICBwTmV3RGF0YS0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOwotICAgICAgICAgICAgcE5ld0RhdGEtPmREYXRhID0gZERhdGE7Ci0gICAgICAgICAgICBwTmV3RGF0YS0+YlBlcnNpc3RlbnQgPSBiRGVmYXVsdFBlcnNpc3RlbnQ7Ci0gICAgICAgIH0KKyAgICBzd2l0Y2ggKG5UeXBlKSB7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6IHsKKyAgICAgICAgcFRlbXAtPmREYXRhID0gZERhdGE7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjogeworICAgICAgICBwVGVtcC0+YkRhdGEgPSBiRGF0YTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6IHsKKyAgICAgICAgcFRlbXAtPnNEYXRhID0gc0RhdGE7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOiB7CisgICAgICAgIHBUZW1wLT5wRGF0YS5SZXNldChKU19HZXRSdW50aW1lKHBEYXRhKSwgcERhdGEpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBOZXdEYXRhID0gbmV3IGpzX2dsb2JhbF9kYXRhOwotICAgICAgICAgICAgcE5ld0RhdGEtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU47Ci0gICAgICAgICAgICBwTmV3RGF0YS0+YkRhdGEgPSBiRGF0YTsKLSAgICAgICAgICAgIHBOZXdEYXRhLT5iUGVyc2lzdGVudCA9IGJEZWZhdWx0UGVyc2lzdGVudDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBOZXdEYXRhID0gbmV3IGpzX2dsb2JhbF9kYXRhOwotICAgICAgICAgICAgcE5ld0RhdGEtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzsKLSAgICAgICAgICAgIHBOZXdEYXRhLT5zRGF0YSA9IHNEYXRhOwotICAgICAgICAgICAgcE5ld0RhdGEtPmJQZXJzaXN0ZW50ID0gYkRlZmF1bHRQZXJzaXN0ZW50OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDoKLSAgICAgICAgewotICAgICAgICAgICAgcE5ld0RhdGEgPSBuZXcganNfZ2xvYmFsX2RhdGE7Ci0gICAgICAgICAgICBwTmV3RGF0YS0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOwotICAgICAgICAgICAgcE5ld0RhdGEtPnBEYXRhLlJlc2V0KEpTX0dldFJ1bnRpbWUocERhdGEpLCBwRGF0YSk7Ci0gICAgICAgICAgICBwTmV3RGF0YS0+YlBlcnNpc3RlbnQgPSBiRGVmYXVsdFBlcnNpc3RlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKLSAgICAgICAgewotICAgICAgICAgICAgcE5ld0RhdGEgPSBuZXcganNfZ2xvYmFsX2RhdGE7Ci0gICAgICAgICAgICBwTmV3RGF0YS0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDsKLSAgICAgICAgICAgIHBOZXdEYXRhLT5iUGVyc2lzdGVudCA9IGJEZWZhdWx0UGVyc2lzdGVudDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgorICAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIG1fbWFwR2xvYmFsLlNldEF0KHByb3BuYW1lLCAodm9pZCopcE5ld0RhdGEpOwotCiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBqc19nbG9iYWxfZGF0YSogcE5ld0RhdGEgPSBOVUxMOworCisgIHN3aXRjaCAoblR5cGUpIHsKKyAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6IHsKKyAgICAgIHBOZXdEYXRhID0gbmV3IGpzX2dsb2JhbF9kYXRhOworICAgICAgcE5ld0RhdGEtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUjsKKyAgICAgIHBOZXdEYXRhLT5kRGF0YSA9IGREYXRhOworICAgICAgcE5ld0RhdGEtPmJQZXJzaXN0ZW50ID0gYkRlZmF1bHRQZXJzaXN0ZW50OworICAgIH0gYnJlYWs7CisgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjogeworICAgICAgcE5ld0RhdGEgPSBuZXcganNfZ2xvYmFsX2RhdGE7CisgICAgICBwTmV3RGF0YS0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjsKKyAgICAgIHBOZXdEYXRhLT5iRGF0YSA9IGJEYXRhOworICAgICAgcE5ld0RhdGEtPmJQZXJzaXN0ZW50ID0gYkRlZmF1bHRQZXJzaXN0ZW50OworICAgIH0gYnJlYWs7CisgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOiB7CisgICAgICBwTmV3RGF0YSA9IG5ldyBqc19nbG9iYWxfZGF0YTsKKyAgICAgIHBOZXdEYXRhLT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc7CisgICAgICBwTmV3RGF0YS0+c0RhdGEgPSBzRGF0YTsKKyAgICAgIHBOZXdEYXRhLT5iUGVyc2lzdGVudCA9IGJEZWZhdWx0UGVyc2lzdGVudDsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDogeworICAgICAgcE5ld0RhdGEgPSBuZXcganNfZ2xvYmFsX2RhdGE7CisgICAgICBwTmV3RGF0YS0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOworICAgICAgcE5ld0RhdGEtPnBEYXRhLlJlc2V0KEpTX0dldFJ1bnRpbWUocERhdGEpLCBwRGF0YSk7CisgICAgICBwTmV3RGF0YS0+YlBlcnNpc3RlbnQgPSBiRGVmYXVsdFBlcnNpc3RlbnQ7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOiB7CisgICAgICBwTmV3RGF0YSA9IG5ldyBqc19nbG9iYWxfZGF0YTsKKyAgICAgIHBOZXdEYXRhLT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOworICAgICAgcE5ld0RhdGEtPmJQZXJzaXN0ZW50ID0gYkRlZmF1bHRQZXJzaXN0ZW50OworICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIG1fbWFwR2xvYmFsLlNldEF0KHByb3BuYW1lLCAodm9pZCopcE5ld0RhdGEpOworCisgIHJldHVybiBUUlVFOwogfQogCi1GWEpTVkFMVUVUWVBFIEdFVF9WQUxVRV9UWVBFKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHApCi17CitGWEpTVkFMVUVUWVBFIEdFVF9WQUxVRV9UWVBFKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHApIHsKICAgY29uc3QgdW5zaWduZWQgaW50IG5IYXNoID0gSlNfQ2FsY0hhc2goSlNfR2V0VHlwZW9mKHApKTsKIAogICBpZiAobkhhc2ggPT0gSlNDT05TVF9uVW5kZWZIYXNoKQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9yZXBvcnQuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9yZXBvcnQuY3BwCmluZGV4IDE0NzhmZWIuLjczMmFlNmQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3JlcG9ydC5jcHAKQEAgLTIwLDMwICsyMCwyOCBAQAogRU5EX0pTX1NUQVRJQ19QUk9QKCkKIAogQkVHSU5fSlNfU1RBVElDX01FVEhPRChDSlNfUmVwb3J0KQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2F2ZSkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHdyaXRlVGV4dCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2F2ZSkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkod3JpdGVUZXh0KQogRU5EX0pTX1NUQVRJQ19NRVRIT0QoKQogCiBJTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX1JlcG9ydCwgUmVwb3J0KQogCi1SZXBvcnQ6OlJlcG9ydChDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCkKLXsKK1JlcG9ydDo6UmVwb3J0KENKU19PYmplY3QqIHBKU09iamVjdCkgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSB7fQogCi19CitSZXBvcnQ6On5SZXBvcnQoKSB7fQogCi1SZXBvcnQ6On5SZXBvcnQoKQotewotCi19Ci0KLUZYX0JPT0wgUmVwb3J0Ojp3cml0ZVRleHQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKK0ZYX0JPT0wgUmVwb3J0Ojp3cml0ZVRleHQoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCiAgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIFJlcG9ydDo6c2F2ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQoteworRlhfQk9PTCBSZXBvcnQ6OnNhdmUoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCiAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9yZXNvdXJjZS5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3Jlc291cmNlLmNwcAppbmRleCA0Mzc1ZGEzLi41YjZiZDQ4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3Jlc291cmNlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3Jlc291cmNlLmNwcApAQCAtNiw2MSArNiw1OSBAQAogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3Jlc291cmNlLmgiCiAKLUNGWF9XaWRlU3RyaW5nIEpTR2V0U3RyaW5nRnJvbUlEKENKU19Db250ZXh0KiBwQ29udGV4dCwgRlhfVUlOVCBpZCkKLXsKLSAgICBzd2l0Y2ggKGlkKQotICAgIHsKK0NGWF9XaWRlU3RyaW5nIEpTR2V0U3RyaW5nRnJvbUlEKENKU19Db250ZXh0KiBwQ29udGV4dCwgRlhfVUlOVCBpZCkgeworICBzd2l0Y2ggKGlkKSB7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTQUxFUlQ6Ci0gICAgICAgIHJldHVybiBMIkFsZXJ0IjsKKyAgICAgIHJldHVybiBMIkFsZXJ0IjsKICAgICBjYXNlIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SOgotICAgICAgICByZXR1cm4gTCJJbmNvcnJlY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGZ1bmN0aW9uLiI7CisgICAgICByZXR1cm4gTCJJbmNvcnJlY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGZ1bmN0aW9uLiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFOgotICAgICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgaXMgaW52YWxpZC4iOworICAgICAgcmV0dXJuIEwiVGhlIGlucHV0IHZhbHVlIGlzIGludmFsaWQuIjsKICAgICBjYXNlIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HOgotICAgICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgaXMgdG9vIGxvbmcuIjsKKyAgICAgIHJldHVybiBMIlRoZSBpbnB1dCB2YWx1ZSBpcyB0b28gbG9uZy4iOwogICAgIGNhc2UgSURTX1NUUklOR19KU1BBUlNFREFURToKLSAgICAgICAgcmV0dXJuIEwiVGhlIGlucHV0IHZhbHVlIGNhbid0IGJlIHBhcnNlZCBhcyBhIHZhbGlkIGRhdGUvdGltZSAoJXMpLiI7CisgICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgY2FuJ3QgYmUgcGFyc2VkIGFzIGEgdmFsaWQgZGF0ZS90aW1lICglcykuIjsKICAgICBjYXNlIElEU19TVFJJTkdfSlNSQU5HRTE6Ci0gICAgICAgIHJldHVybiBMIlRoZSBpbnB1dCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyIKLSAgICAgICAgICAgICAgIEwiIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMuIjsKKyAgICAgIHJldHVybiBMIlRoZSBpbnB1dCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyIKKyAgICAgICAgICAgICBMIiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzLiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTUkFOR0UyOgotICAgICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMuIjsKKyAgICAgIHJldHVybiBMIlRoZSBpbnB1dCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcy4iOwogICAgIGNhc2UgSURTX1NUUklOR19KU1JBTkdFMzoKLSAgICAgICAgcmV0dXJuIEwiVGhlIGlucHV0IHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzLiI7CisgICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMuIjsKICAgICBjYXNlIElEU19TVFJJTkdfTk9UU1VQUE9SVDoKLSAgICAgICAgcmV0dXJuIEwiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQuIjsKKyAgICAgIHJldHVybiBMIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkLiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTQlVTWToKLSAgICAgICAgcmV0dXJuIEwiU3lzdGVtIGlzIGJ1c3kuIjsKKyAgICAgIHJldHVybiBMIlN5c3RlbSBpcyBidXN5LiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTRVZFTlQ6Ci0gICAgICAgIHJldHVybiBMIkR1cGxpY2F0ZSBmb3JtZmllbGQgZXZlbnQgZm91bmQuIjsKKyAgICAgIHJldHVybiBMIkR1cGxpY2F0ZSBmb3JtZmllbGQgZXZlbnQgZm91bmQuIjsKICAgICBjYXNlIElEU19TVFJJTkdfUlVOOgotICAgICAgICByZXR1cm4gTCJTY3JpcHQgcmFuIHN1Y2Nlc3NmdWxseS4iOworICAgICAgcmV0dXJuIEwiU2NyaXB0IHJhbiBzdWNjZXNzZnVsbHkuIjsKICAgICBjYXNlIElEU19TVFJJTkdfSlNQUklOVDE6Ci0gICAgICAgIHJldHVybiBMIlRoZSBzZWNvbmQgcGFyYW1ldGVyIGNhbid0IGJlIGNvbnZlcnRlZCB0byBhIERhdGUuIjsKKyAgICAgIHJldHVybiBMIlRoZSBzZWNvbmQgcGFyYW1ldGVyIGNhbid0IGJlIGNvbnZlcnRlZCB0byBhIERhdGUuIjsKICAgICBjYXNlIElEU19TVFJJTkdfSlNQUklOVDI6Ci0gICAgICAgIHJldHVybiBMIlRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGFuIGludmFsaWQgRGF0ZSEiOworICAgICAgcmV0dXJuIEwiVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYW4gaW52YWxpZCBEYXRlISI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTTk9HTE9CQUw6Ci0gICAgICAgIHJldHVybiBMIkdsb2JhbCB2YWx1ZSBub3QgZm91bmQuIjsKKyAgICAgIHJldHVybiBMIkdsb2JhbCB2YWx1ZSBub3QgZm91bmQuIjsKICAgICBjYXNlIElEU19TVFJJTkdfSlNSRUFET05MWToKLSAgICAgICAgcmV0dXJuIEwiQ2Fubm90IGFzc2lnbiB0byByZWFkb25seSBwcm9wZXJ0eS4iOworICAgICAgcmV0dXJuIEwiQ2Fubm90IGFzc2lnbiB0byByZWFkb25seSBwcm9wZXJ0eS4iOwogICAgIGNhc2UgSURTX1NUUklOR19KU1RZUEVFUlJPUjoKLSAgICAgICAgcmV0dXJuIEwiSW5jb3JyZWN0IHBhcmFtZXRlciB0eXBlLiI7CisgICAgICByZXR1cm4gTCJJbmNvcnJlY3QgcGFyYW1ldGVyIHR5cGUuIjsKICAgICBjYXNlIElEU19TVFJJTkdfSlNWQUxVRUVSUk9SOgotICAgICAgICByZXR1cm4gTCJJbmNvcnJlY3QgcGFyYW1ldGVyIHZhbHVlLiI7CisgICAgICByZXR1cm4gTCJJbmNvcnJlY3QgcGFyYW1ldGVyIHZhbHVlLiI7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9CisgICAgICByZXR1cm4gTCIiOworICB9CiB9CiAKIENGWF9XaWRlU3RyaW5nIEpTRm9ybWF0RXJyb3JTdHJpbmcoY29uc3QgY2hhciogY2xhc3NfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcGVydHlfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGRldGFpbHMpIHsKLSAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGNsYXNzX25hbWUpOwotICAgIGlmIChwcm9wZXJ0eV9uYW1lKSB7Ci0gICAgICAgIHJlc3VsdCArPSBMIi4iOwotICAgICAgICByZXN1bHQgKz0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwcm9wZXJ0eV9uYW1lKTsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IEwiOiAiOwotICAgIHJlc3VsdCArPSBkZXRhaWxzOwotICAgIHJldHVybiByZXN1bHQ7CisgIENGWF9XaWRlU3RyaW5nIHJlc3VsdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoY2xhc3NfbmFtZSk7CisgIGlmIChwcm9wZXJ0eV9uYW1lKSB7CisgICAgcmVzdWx0ICs9IEwiLiI7CisgICAgcmVzdWx0ICs9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocHJvcGVydHlfbmFtZSk7CisgIH0KKyAgcmVzdWx0ICs9IEwiOiAiOworICByZXN1bHQgKz0gZGV0YWlsczsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3V0aWwuY3BwCmluZGV4IDQwODNlZDUuLjg1OGFmMDAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC91dGlsLmNwcApAQCAtMTYsMTkgKzE2LDE4IEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgiCiAKLSNpZiBfRlhfT1NfICA9PSBfRlhfQU5EUk9JRF8KKyNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXwogI2luY2x1ZGUgPGN0eXBlLmg+CiAjZW5kaWYKIAotc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElGWEpTX0NvbnRleHQqIGNjKQotewotICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKK3N0YXRpYyB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZShJRlhKU19Db250ZXh0KiBjYykgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0gICAgQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKIAotICAgIHJldHVybiBwUnVudGltZS0+R2V0SXNvbGF0ZSgpOworICByZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKIH0KIAogQkVHSU5fSlNfU1RBVElDX0NPTlNUKENKU19VdGlsKQpAQCAtMzgsMzUwICszNywyMzUgQEAKIEVORF9KU19TVEFUSUNfUFJPUCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19NRVRIT0QoQ0pTX1V0aWwpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShwcmludGQpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShwcmludGYpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShwcmludHgpCi0gICAgSlNfU1RBVElDX01FVEhPRF9FTlRSWShzY2FuZCkKLSAgICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGJ5dGVUb0NoYXIpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHByaW50ZCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkocHJpbnRmKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShwcmludHgpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNjYW5kKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShieXRlVG9DaGFyKQogRU5EX0pTX1NUQVRJQ19NRVRIT0QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX1V0aWwsdXRpbCkKK0lNUExFTUVOVF9KU19DTEFTUyhDSlNfVXRpbCwgdXRpbCkKIAotdXRpbDo6dXRpbChDSlNfT2JqZWN0ICpwSlNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCkKLXsKLX0KK3V0aWw6OnV0aWwoQ0pTX09iamVjdCogcEpTT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpIHt9CiAKLXV0aWw6On51dGlsKHZvaWQpCi17Ci19Cit1dGlsOjp+dXRpbCh2b2lkKSB7fQogCi0KLXN0cnVjdCBzdHJ1X1RiQ29udmVydAotewotICAgIGNvbnN0IEZYX1dDSEFSKiBscHN6SlNNYXJrOwotICAgIGNvbnN0IEZYX1dDSEFSKiBscHN6Q3BwTWFyazsKK3N0cnVjdCBzdHJ1X1RiQ29udmVydCB7CisgIGNvbnN0IEZYX1dDSEFSKiBscHN6SlNNYXJrOworICBjb25zdCBGWF9XQ0hBUiogbHBzekNwcE1hcms7CiB9OwogCiBjb25zdCBzdHJ1X1RiQ29udmVydCBmY1RhYmxlW10gPSB7Ci0gICAgeyBMIm1tbW0iLCBMIiVCIiB9LAotICAgIHsgTCJtbW0iLCBMIiViIiB9LAotICAgIHsgTCJtbSIsICBMIiVtIiB9LAorICAgIHtMIm1tbW0iLCBMIiVCIn0sCisgICAge0wibW1tIiwgTCIlYiJ9LAorICAgIHtMIm1tIiwgTCIlbSJ9LAogICAgIC8vIm0iCi0gICAgeyBMImRkZGQiLCBMIiVBIiB9LAotICAgIHsgTCJkZGQiLCBMIiVhIiB9LAotICAgIHsgTCJkZCIsICBMIiVkIiB9LAorICAgIHtMImRkZGQiLCBMIiVBIn0sCisgICAge0wiZGRkIiwgTCIlYSJ9LAorICAgIHtMImRkIiwgTCIlZCJ9LAogICAgIC8vImQiLCAgICIldyIsCi0gICAgeyBMInl5eXkiLCBMIiVZIiB9LAotICAgIHsgTCJ5eSIsICBMIiV5IiB9LAotICAgIHsgTCJISCIsICBMIiVIIiB9LAorICAgIHtMInl5eXkiLCBMIiVZIn0sCisgICAge0wieXkiLCBMIiV5In0sCisgICAge0wiSEgiLCBMIiVIIn0sCiAgICAgLy8iSCIKLSAgICB7IEwiaGgiLCAgTCIlSSIgfSwKKyAgICB7TCJoaCIsIEwiJUkifSwKICAgICAvLyJoIgotICAgIHsgTCJNTSIsICBMIiVNIiB9LAorICAgIHtMIk1NIiwgTCIlTSJ9LAogICAgIC8vIk0iCi0gICAgeyBMInNzIiwgIEwiJVMiIH0sCisgICAge0wic3MiLCBMIiVTIn0sCiAgICAgLy8icwotICAgIHsgTCJUVCIsICBMIiVwIiB9LAotICAgIC8vInQiCisgICAge0wiVFQiLCBMIiVwIn0sCisvLyJ0IgogI2lmIGRlZmluZWQoX1dJTjMyKQotICAgIHsgTCJ0dCIsICBMIiVwIiB9LAotICAgIHsgTCJoIiwgIEwiJSNJIiB9LAorICAgIHtMInR0IiwgTCIlcCJ9LAorICAgIHtMImgiLCBMIiUjSSJ9LAogI2Vsc2UKLSAgICB7IEwidHQiLCAgTCIlUCIgfSwKLSAgICB7IEwiaCIsICBMIiVsIiB9LAorICAgIHtMInR0IiwgTCIlUCJ9LAorICAgIHtMImgiLCBMIiVsIn0sCiAjZW5kaWYKIH07CiAKLSNkZWZpbmUgVVRJTF9JTlQgICAgICAgICAgICAwCi0jZGVmaW5lIFVUSUxfRE9VQkxFICAgICAgICAgMQotI2RlZmluZSBVVElMX1NUUklORyAgICAgICAgIDIKKyNkZWZpbmUgVVRJTF9JTlQgMAorI2RlZmluZSBVVElMX0RPVUJMRSAxCisjZGVmaW5lIFVUSUxfU1RSSU5HIDIKIAotaW50IHV0aWw6OlBhcnN0RGF0YVR5cGUoc3RkOjp3c3RyaW5nKiBzRm9ybWF0KQotewotICAgIGJvb2wgYlBlcmNlbnQgPSBGQUxTRTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNGb3JtYXQtPmxlbmd0aCgpOyArK2kpCi0gICAgewotICAgICAgICB3Y2hhcl90IGMgPSAoKnNGb3JtYXQpW2ldOwotICAgICAgICBpZiAoYyA9PSBMJyUnKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUGVyY2VudCA9IHRydWU7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiUGVyY2VudCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGMgPT0gTCdjJyB8fCBjID09IEwnQycgfHwgYyA9PSBMJ2QnIHx8IGMgPT0gTCdpJyB8fCBjID09IEwnbycgfHwgYyA9PSBMJ3UnIHx8IGMgPT0gTCd4JyB8fCBjID09IEwnWCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVUSUxfSU5UOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGMgPT0gTCdlJyB8fCBjID09IEwnRScgfHwgYyA9PSBMJ2YnIHx8IGMgPT0gTCdnJyB8fCBjID09IEwnRycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVUSUxfRE9VQkxFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGMgPT0gTCdzJyB8fCBjID09IEwnUycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTWFwIHMgdG8gUyBzaW5jZSB3ZSBhbHdheXMgZGVhbCBpbnRlcm5hbGx5Ci0gICAgICAgICAgICAgICAgLy8gd2l0aCB3Y2hhcl90IHN0cmluZ3MuCi0gICAgICAgICAgICAgICAgKCpzRm9ybWF0KVtpXSA9IEwnUyc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVUSUxfU1RSSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGMgPT0gTCcuJyB8fCBjID09IEwnKycgfHwgYyA9PSBMJy0nIHx8IGMgPT0gTCcjJyB8fCBjID09IEwnICcgfHwgQ0pTX1B1YmxpY01ldGhvZHM6OklzRGlnaXQoYykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQoraW50IHV0aWw6OlBhcnN0RGF0YVR5cGUoc3RkOjp3c3RyaW5nKiBzRm9ybWF0KSB7CisgIGJvb2wgYlBlcmNlbnQgPSBGQUxTRTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzRm9ybWF0LT5sZW5ndGgoKTsgKytpKSB7CisgICAgd2NoYXJfdCBjID0gKCpzRm9ybWF0KVtpXTsKKyAgICBpZiAoYyA9PSBMJyUnKSB7CisgICAgICBiUGVyY2VudCA9IHRydWU7CisgICAgICBjb250aW51ZTsKICAgICB9CiAKLSAgICByZXR1cm4gLTE7CisgICAgaWYgKGJQZXJjZW50KSB7CisgICAgICBpZiAoYyA9PSBMJ2MnIHx8IGMgPT0gTCdDJyB8fCBjID09IEwnZCcgfHwgYyA9PSBMJ2knIHx8IGMgPT0gTCdvJyB8fAorICAgICAgICAgIGMgPT0gTCd1JyB8fCBjID09IEwneCcgfHwgYyA9PSBMJ1gnKSB7CisgICAgICAgIHJldHVybiBVVElMX0lOVDsKKyAgICAgIH0KKyAgICAgIGlmIChjID09IEwnZScgfHwgYyA9PSBMJ0UnIHx8IGMgPT0gTCdmJyB8fCBjID09IEwnZycgfHwgYyA9PSBMJ0cnKSB7CisgICAgICAgIHJldHVybiBVVElMX0RPVUJMRTsKKyAgICAgIH0KKyAgICAgIGlmIChjID09IEwncycgfHwgYyA9PSBMJ1MnKSB7CisgICAgICAgIC8vIE1hcCBzIHRvIFMgc2luY2Ugd2UgYWx3YXlzIGRlYWwgaW50ZXJuYWxseQorICAgICAgICAvLyB3aXRoIHdjaGFyX3Qgc3RyaW5ncy4KKyAgICAgICAgKCpzRm9ybWF0KVtpXSA9IEwnUyc7CisgICAgICAgIHJldHVybiBVVElMX1NUUklORzsKKyAgICAgIH0KKyAgICAgIGlmIChjID09IEwnLicgfHwgYyA9PSBMJysnIHx8IGMgPT0gTCctJyB8fCBjID09IEwnIycgfHwgYyA9PSBMJyAnIHx8CisgICAgICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6OklzRGlnaXQoYykpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gLTE7CiB9CiAKLUZYX0JPT0wgdXRpbDo6cHJpbnRmKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0gICAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLSAgICBpZiAoaVNpemUgPCAxKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgc3RkOjp3c3RyaW5nIGNfQ29udkNoYXIocGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6d3N0cmluZz4gY19zdHJDb252ZXJzOwotICAgIGludCBpT2Zmc2V0ID0gMDsKLSAgICBpbnQgaU9mZmVuZCA9IDA7Ci0gICAgY19Db252Q2hhci5pbnNlcnQoY19Db252Q2hhci5iZWdpbigpLEwnUycpOwotICAgIHdoaWxlKGlPZmZzZXQgIT0gLTEpCi0gICAgewotICAgICAgICBpT2ZmZW5kID0gY19Db252Q2hhci5maW5kKEwiJSIsaU9mZnNldCsxKTsKLSAgICAgICAgc3RkOjp3c3RyaW5nIHN0clN1YjsKLSAgICAgICAgaWYgKGlPZmZlbmQgPT0gLTEpCi0gICAgICAgICAgICBzdHJTdWIgPSBjX0NvbnZDaGFyLnN1YnN0cihpT2Zmc2V0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyU3ViID0gY19Db252Q2hhci5zdWJzdHIoaU9mZnNldCAsaU9mZmVuZCAtIGlPZmZzZXQpOwotICAgICAgICBjX3N0ckNvbnZlcnMucHVzaF9iYWNrKHN0clN1Yik7Ci0gICAgICAgIGlPZmZzZXQgPSBpT2ZmZW5kIDsKLSAgICB9Ci0KLSAgICBzdGQ6OndzdHJpbmcgY19zdHJSZXN1bHQ7Ci0KLSAgICAvL2ZvcihpbnQgaUluZGV4ID0gMTtpSW5kZXggPCBwYXJhbXMuc2l6ZSgpO2lJbmRleCsrKQotICAgIHN0ZDo6d3N0cmluZyBjX3N0ckZvcm1hdDsKLSAgICBmb3IoaW50IGlJbmRleCA9IDA7aUluZGV4IDwgKGludCljX3N0ckNvbnZlcnMuc2l6ZSgpO2lJbmRleCsrKQotICAgIHsKLSAgICAgICAgY19zdHJGb3JtYXQgPSBjX3N0ckNvbnZlcnNbaUluZGV4XTsKLSAgICAgICAgaWYgKGlJbmRleCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjX3N0clJlc3VsdCA9IGNfc3RyRm9ybWF0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHN0clNlZ21lbnQ7Ci0gICAgICAgIGlmIChpSW5kZXggPj0gaVNpemUpIHsKLSAgICAgICAgICAgIGNfc3RyUmVzdWx0ICs9IGNfc3RyRm9ybWF0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKFBhcnN0RGF0YVR5cGUoJmNfc3RyRm9ybWF0KSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBVVElMX0lOVDoKLSAgICAgICAgICAgICAgICBzdHJTZWdtZW50LkZvcm1hdChjX3N0ckZvcm1hdC5jX3N0cigpLCBwYXJhbXNbaUluZGV4XS5Ub0ludCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVVRJTF9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgc3RyU2VnbWVudC5Gb3JtYXQoY19zdHJGb3JtYXQuY19zdHIoKSwgcGFyYW1zW2lJbmRleF0uVG9Eb3VibGUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFVUSUxfU1RSSU5HOgotICAgICAgICAgICAgICAgIHN0clNlZ21lbnQuRm9ybWF0KGNfc3RyRm9ybWF0LmNfc3RyKCksIHBhcmFtc1tpSW5kZXhdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzdHJTZWdtZW50LkZvcm1hdChMIiVTIiwgY19zdHJGb3JtYXQuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY19zdHJSZXN1bHQgKz0gc3RyU2VnbWVudC5HZXRCdWZmZXIoc3RyU2VnbWVudC5HZXRMZW5ndGgoKSsxKTsKLSAgICB9Ci0KLSAgICBjX3N0clJlc3VsdC5lcmFzZShjX3N0clJlc3VsdC5iZWdpbigpKTsKLSAgICB2UmV0ID0gY19zdHJSZXN1bHQuY19zdHIoKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCB1dGlsOjpwcmludGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwotCi0gICAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLSAgICBpZiAoaVNpemUgPCAyKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBDSlNfVmFsdWUgcDEoaXNvbGF0ZSk7Ci0gICAgcDEgPSBwYXJhbXNbMF07Ci0KLSAgICBDSlNfVmFsdWUgcDIgPSBwYXJhbXNbMV07Ci0gICAgQ0pTX0RhdGUganNEYXRlKGlzb2xhdGUpOwotICAgIGlmICghcDIuQ29udmVydFRvRGF0ZShqc0RhdGUpKQotICAgIHsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BSSU5UMSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoIWpzRGF0ZS5Jc1ZhbGlkRGF0ZSgpKQotICAgIHsKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BSSU5UMik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAocDEuR2V0VHlwZSgpID09IFZUX251bWJlcikKLSAgICB7Ci0gICAgICAgIGludCBuRm9ybWF0ID0gcDEuVG9JbnQoKTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXN1bHQ7Ci0KLSAgICAgICAgc3dpdGNoIChuRm9ybWF0KQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHN3UmVzdWx0LkZvcm1hdChMIkQ6JTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwKLSAgICAgICAgICAgICAgICBqc0RhdGUuR2V0WWVhcigpLAotICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRNb250aCgpICsgMSwKLSAgICAgICAgICAgICAgICBqc0RhdGUuR2V0RGF5KCksCi0gICAgICAgICAgICAgICAganNEYXRlLkdldEhvdXJzKCksCi0gICAgICAgICAgICAgICAganNEYXRlLkdldE1pbnV0ZXMoKSwKLSAgICAgICAgICAgICAgICBqc0RhdGUuR2V0U2Vjb25kcygpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBzd1Jlc3VsdC5Gb3JtYXQoTCIlMDRkLiUwMmQuJTAyZCAlMDJkOiUwMmQ6JTAyZCIsCi0gICAgICAgICAgICAgICAganNEYXRlLkdldFllYXIoKSwKLSAgICAgICAgICAgICAgICBqc0RhdGUuR2V0TW9udGgoKSArIDEsCi0gICAgICAgICAgICAgICAganNEYXRlLkdldERheSgpLAotICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRIb3VycygpLAotICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRNaW51dGVzKCksCi0gICAgICAgICAgICAgICAganNEYXRlLkdldFNlY29uZHMoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgc3dSZXN1bHQuRm9ybWF0KEwiJTA0ZC8lMDJkLyUwMmQgJTAyZDolMDJkOiUwMmQiLAotICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRZZWFyKCksCi0gICAgICAgICAgICAgICAganNEYXRlLkdldE1vbnRoKCkgKyAxLAotICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXREYXkoKSwKLSAgICAgICAgICAgICAgICBqc0RhdGUuR2V0SG91cnMoKSwKLSAgICAgICAgICAgICAgICBqc0RhdGUuR2V0TWludXRlcygpLAotICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRTZWNvbmRzKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICB2UmV0ID0gc3dSZXN1bHQuY19zdHIoKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChwMS5HZXRUeXBlKCkgPT0gVlRfc3RyaW5nKQotICAgIHsKLSAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8d2NoYXJfdD4gY0Zvcm1hdCA9IHAxLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCk7Ci0KLSAgICAgICAgYm9vbCBiWEZBUGljdHVyZSA9IGZhbHNlOwotICAgICAgICBpZiAoaVNpemUgPiAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBiWEZBUGljdHVyZSA9IHBhcmFtc1syXS5Ub0Jvb2woKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiWEZBUGljdHVyZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAvL2N1cnJlbnRseSwgaXQgZG9lc24ndCBzdXBwb3J0IFhGQVBpY3R1cmUuCi0gICAgICAgIH0KLQotICAgICAgICBpbnQgaUluZGV4OwotICAgICAgICBmb3IoaUluZGV4ID0gMDtpSW5kZXg8c2l6ZW9mKGZjVGFibGUpL3NpemVvZihzdHJ1X1RiQ29udmVydCk7aUluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpU3RhcnQgPSAwOwotICAgICAgICAgICAgaW50IGlFbmQ7Ci0gICAgICAgICAgICB3aGlsZSgoaUVuZCA9IGNGb3JtYXQuZmluZChmY1RhYmxlW2lJbmRleF0ubHBzekpTTWFyaywgaVN0YXJ0KSkgIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY0Zvcm1hdC5yZXBsYWNlKGlFbmQsIEZYU1lTX3djc2xlbihmY1RhYmxlW2lJbmRleF0ubHBzekpTTWFyayksIGZjVGFibGVbaUluZGV4XS5scHN6Q3BwTWFyayk7Ci0gICAgICAgICAgICAgICAgaVN0YXJ0ID0gaUVuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBpWWVhcixpTW9udGgsaURheSxpSG91cixpTWluLGlTZWM7Ci0gICAgICAgIGlZZWFyID0ganNEYXRlLkdldFllYXIoKTsKLSAgICAgICAgaU1vbnRoID0ganNEYXRlLkdldE1vbnRoKCk7Ci0gICAgICAgIGlEYXkgPSBqc0RhdGUuR2V0RGF5KCk7Ci0gICAgICAgIGlIb3VyID0ganNEYXRlLkdldEhvdXJzKCk7Ci0gICAgICAgIGlNaW4gPSBqc0RhdGUuR2V0TWludXRlcygpOwotICAgICAgICBpU2VjID0ganNEYXRlLkdldFNlY29uZHMoKTsKLQotICAgICAgICBzdHJ1Y3QgdG0gdGltZSA9IHt9OwotICAgICAgICB0aW1lLnRtX3llYXIgPSBpWWVhci0xOTAwOwotICAgICAgICB0aW1lLnRtX21vbiA9IGlNb250aDsKLSAgICAgICAgdGltZS50bV9tZGF5ID0gaURheTsKLSAgICAgICAgdGltZS50bV9ob3VyID0gaUhvdXI7Ci0gICAgICAgIHRpbWUudG1fbWluID0gaU1pbjsKLSAgICAgICAgdGltZS50bV9zZWMgPSBpU2VjOwotCi0gICAgICAgIHN0cnVjdCBzdHJ1X1RiQ29udmVydEFkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscHN6SlNNYXJrOwotICAgICAgICAgICAgaW50ICAgICBpVmFsdWU7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RydV9UYkNvbnZlcnRBZCBjVGFibGVBZFtdID17Ci0gICAgICAgICAgICB7IEwibSIsIGlNb250aCsxIH0sCi0gICAgICAgICAgICB7IEwiZCIsIGlEYXkgfSwKLSAgICAgICAgICAgIHsgTCJIIiwgaUhvdXIgfSwKLSAgICAgICAgICAgIHsgTCJoIiwgaUhvdXI+MTI/aUhvdXItMTI6aUhvdXIgfSwKLSAgICAgICAgICAgIHsgTCJNIiwgaU1pbiB9LAotICAgICAgICAgICAgeyBMInMiLCBpU2VjIH0sCi0gICAgICAgIH07Ci0KLSAgICAgICAgZm9yKGlJbmRleCA9IDA7aUluZGV4PHNpemVvZihjVGFibGVBZCkvc2l6ZW9mKHN0cnVfVGJDb252ZXJ0QWQpO2lJbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB3Y2hhcl90IHRzelZhbHVlWzEwXTsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZTsKLSAgICAgICAgICAgIHNWYWx1ZS5Gb3JtYXQoTCIlZCIsY1RhYmxlQWRbaUluZGV4XS5pVmFsdWUpOwotICAgICAgICAgICAgbWVtY3B5KHRzelZhbHVlLCAod2NoYXJfdCAqKXNWYWx1ZS5HZXRCdWZmZXIoc1ZhbHVlLkdldExlbmd0aCgpKzEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzVmFsdWUuR2V0TGVuZ3RoKCkrMSkqc2l6ZW9mKHdjaGFyX3QpKTsKLQotICAgICAgICAgICAgaW50IGlTdGFydCA9IDA7Ci0gICAgICAgICAgICBpbnQgaUVuZDsKLSAgICAgICAgICAgIHdoaWxlKChpRW5kID0gY0Zvcm1hdC5maW5kKGNUYWJsZUFkW2lJbmRleF0ubHBzekpTTWFyaywgaVN0YXJ0KSkgIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGlFbmQgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNGb3JtYXRbaUVuZC0xXSA9PSBMJyUnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnQgPSBpRW5kKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjRm9ybWF0LnJlcGxhY2UoaUVuZCwgRlhTWVNfd2NzbGVuKGNUYWJsZUFkW2lJbmRleF0ubHBzekpTTWFyayksIHRzelZhbHVlKTsKLSAgICAgICAgICAgICAgICBpU3RhcnQgPSBpRW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyRm9ybWF0OwotICAgICAgICB3Y2hhcl90IGJ1Zls2NF0gPSB7fTsKLSAgICAgICAgc3RyRm9ybWF0ID0gd2NzZnRpbWUoYnVmLCA2NCwgY0Zvcm1hdC5jX3N0cigpLCAmdGltZSk7Ci0gICAgICAgIGNGb3JtYXQgPSBidWY7Ci0gICAgICAgIHZSZXQgPSBjRm9ybWF0LmNfc3RyKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KK0ZYX0JPT0wgdXRpbDo6cHJpbnRmKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKGlTaXplIDwgMSkKICAgICByZXR1cm4gRkFMU0U7CisgIHN0ZDo6d3N0cmluZyBjX0NvbnZDaGFyKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp3c3RyaW5nPiBjX3N0ckNvbnZlcnM7CisgIGludCBpT2Zmc2V0ID0gMDsKKyAgaW50IGlPZmZlbmQgPSAwOworICBjX0NvbnZDaGFyLmluc2VydChjX0NvbnZDaGFyLmJlZ2luKCksIEwnUycpOworICB3aGlsZSAoaU9mZnNldCAhPSAtMSkgeworICAgIGlPZmZlbmQgPSBjX0NvbnZDaGFyLmZpbmQoTCIlIiwgaU9mZnNldCArIDEpOworICAgIHN0ZDo6d3N0cmluZyBzdHJTdWI7CisgICAgaWYgKGlPZmZlbmQgPT0gLTEpCisgICAgICBzdHJTdWIgPSBjX0NvbnZDaGFyLnN1YnN0cihpT2Zmc2V0KTsKKyAgICBlbHNlCisgICAgICBzdHJTdWIgPSBjX0NvbnZDaGFyLnN1YnN0cihpT2Zmc2V0LCBpT2ZmZW5kIC0gaU9mZnNldCk7CisgICAgY19zdHJDb252ZXJzLnB1c2hfYmFjayhzdHJTdWIpOworICAgIGlPZmZzZXQgPSBpT2ZmZW5kOworICB9CisKKyAgc3RkOjp3c3RyaW5nIGNfc3RyUmVzdWx0OworCisgIC8vIGZvcihpbnQgaUluZGV4ID0gMTtpSW5kZXggPCBwYXJhbXMuc2l6ZSgpO2lJbmRleCsrKQorICBzdGQ6OndzdHJpbmcgY19zdHJGb3JtYXQ7CisgIGZvciAoaW50IGlJbmRleCA9IDA7IGlJbmRleCA8IChpbnQpY19zdHJDb252ZXJzLnNpemUoKTsgaUluZGV4KyspIHsKKyAgICBjX3N0ckZvcm1hdCA9IGNfc3RyQ29udmVyc1tpSW5kZXhdOworICAgIGlmIChpSW5kZXggPT0gMCkgeworICAgICAgY19zdHJSZXN1bHQgPSBjX3N0ckZvcm1hdDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIENGWF9XaWRlU3RyaW5nIHN0clNlZ21lbnQ7CisgICAgaWYgKGlJbmRleCA+PSBpU2l6ZSkgeworICAgICAgY19zdHJSZXN1bHQgKz0gY19zdHJGb3JtYXQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKFBhcnN0RGF0YVR5cGUoJmNfc3RyRm9ybWF0KSkgeworICAgICAgY2FzZSBVVElMX0lOVDoKKyAgICAgICAgc3RyU2VnbWVudC5Gb3JtYXQoY19zdHJGb3JtYXQuY19zdHIoKSwgcGFyYW1zW2lJbmRleF0uVG9JbnQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVVElMX0RPVUJMRToKKyAgICAgICAgc3RyU2VnbWVudC5Gb3JtYXQoY19zdHJGb3JtYXQuY19zdHIoKSwgcGFyYW1zW2lJbmRleF0uVG9Eb3VibGUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVVElMX1NUUklORzoKKyAgICAgICAgc3RyU2VnbWVudC5Gb3JtYXQoY19zdHJGb3JtYXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2lJbmRleF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3RyU2VnbWVudC5Gb3JtYXQoTCIlUyIsIGNfc3RyRm9ybWF0LmNfc3RyKCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY19zdHJSZXN1bHQgKz0gc3RyU2VnbWVudC5HZXRCdWZmZXIoc3RyU2VnbWVudC5HZXRMZW5ndGgoKSArIDEpOworICB9CisKKyAgY19zdHJSZXN1bHQuZXJhc2UoY19zdHJSZXN1bHQuYmVnaW4oKSk7CisgIHZSZXQgPSBjX3N0clJlc3VsdC5jX3N0cigpOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCB1dGlsOjpwcmludGQoY29uc3Qgc3RkOjp3c3RyaW5nICZjRm9ybWF0MiwgQ0pTX0RhdGUganNEYXRlLCBib29sIGJYRkFQaWN0dXJlLCBzdGQ6OndzdHJpbmcgJmNQdXJwb3NlKQotewotICAgIHN0ZDo6d3N0cmluZyBjRm9ybWF0ID0gY0Zvcm1hdDI7CitGWF9CT09MIHV0aWw6OnByaW50ZChJRlhKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CiAKLSAgICBpZiAoYlhGQVBpY3R1cmUpCi0gICAgewotICAgICAgICByZXR1cm4gOyAvL2N1cnJlbnRseSwgaXQgZG9lc24ndCBzdXBwb3J0IFhGQVBpY3R1cmUuCisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA8IDIpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENKU19WYWx1ZSBwMShpc29sYXRlKTsKKyAgcDEgPSBwYXJhbXNbMF07CisKKyAgQ0pTX1ZhbHVlIHAyID0gcGFyYW1zWzFdOworICBDSlNfRGF0ZSBqc0RhdGUoaXNvbGF0ZSk7CisgIGlmICghcDIuQ29udmVydFRvRGF0ZShqc0RhdGUpKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BSSU5UMSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFqc0RhdGUuSXNWYWxpZERhdGUoKSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQUklOVDIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChwMS5HZXRUeXBlKCkgPT0gVlRfbnVtYmVyKSB7CisgICAgaW50IG5Gb3JtYXQgPSBwMS5Ub0ludCgpOworICAgIENGWF9XaWRlU3RyaW5nIHN3UmVzdWx0OworCisgICAgc3dpdGNoIChuRm9ybWF0KSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHN3UmVzdWx0LkZvcm1hdChMIkQ6JTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwganNEYXRlLkdldFllYXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRNb250aCgpICsgMSwganNEYXRlLkdldERheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAganNEYXRlLkdldEhvdXJzKCksIGpzRGF0ZS5HZXRNaW51dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0U2Vjb25kcygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIHN3UmVzdWx0LkZvcm1hdChMIiUwNGQuJTAyZC4lMDJkICUwMmQ6JTAyZDolMDJkIiwganNEYXRlLkdldFllYXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRNb250aCgpICsgMSwganNEYXRlLkdldERheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAganNEYXRlLkdldEhvdXJzKCksIGpzRGF0ZS5HZXRNaW51dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0U2Vjb25kcygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIHN3UmVzdWx0LkZvcm1hdChMIiUwNGQvJTAyZC8lMDJkICUwMmQ6JTAyZDolMDJkIiwganNEYXRlLkdldFllYXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRNb250aCgpICsgMSwganNEYXRlLkdldERheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAganNEYXRlLkdldEhvdXJzKCksIGpzRGF0ZS5HZXRNaW51dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0U2Vjb25kcygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgdlJldCA9IHN3UmVzdWx0LmNfc3RyKCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKHAxLkdldFR5cGUoKSA9PSBWVF9zdHJpbmcpIHsKKyAgICBzdGQ6OmJhc2ljX3N0cmluZzx3Y2hhcl90PiBjRm9ybWF0ID0gcDEuVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKTsKKworICAgIGJvb2wgYlhGQVBpY3R1cmUgPSBmYWxzZTsKKyAgICBpZiAoaVNpemUgPiAyKSB7CisgICAgICBiWEZBUGljdHVyZSA9IHBhcmFtc1syXS5Ub0Jvb2woKTsKKyAgICB9CisKKyAgICBpZiAoYlhGQVBpY3R1cmUpIHsKKyAgICAgIHJldHVybiBGQUxTRTsgIC8vIGN1cnJlbnRseSwgaXQgZG9lc24ndCBzdXBwb3J0IFhGQVBpY3R1cmUuCiAgICAgfQogCiAgICAgaW50IGlJbmRleDsKLSAgICBmb3IoaUluZGV4ID0gMDtpSW5kZXg8c2l6ZW9mKGZjVGFibGUpL3NpemVvZihzdHJ1X1RiQ29udmVydCk7aUluZGV4KyspCi0gICAgewotICAgICAgICBpbnQgaVN0YXJ0ID0gMDsKLSAgICAgICAgaW50IGlFbmQ7Ci0gICAgICAgIHdoaWxlKChpRW5kID0gY0Zvcm1hdC5maW5kKGZjVGFibGVbaUluZGV4XS5scHN6SlNNYXJrLCBpU3RhcnQpKSAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgY0Zvcm1hdC5yZXBsYWNlKGlFbmQsRlhTWVNfd2NzbGVuKGZjVGFibGVbaUluZGV4XS5scHN6SlNNYXJrKSwgZmNUYWJsZVtpSW5kZXhdLmxwc3pDcHBNYXJrKTsKLSAgICAgICAgICAgIGlTdGFydCA9IGlFbmQ7Ci0gICAgICAgIH0KKyAgICBmb3IgKGlJbmRleCA9IDA7IGlJbmRleCA8IHNpemVvZihmY1RhYmxlKSAvIHNpemVvZihzdHJ1X1RiQ29udmVydCk7CisgICAgICAgICBpSW5kZXgrKykgeworICAgICAgaW50IGlTdGFydCA9IDA7CisgICAgICBpbnQgaUVuZDsKKyAgICAgIHdoaWxlICgoaUVuZCA9IGNGb3JtYXQuZmluZChmY1RhYmxlW2lJbmRleF0ubHBzekpTTWFyaywgaVN0YXJ0KSkgIT0gLTEpIHsKKyAgICAgICAgY0Zvcm1hdC5yZXBsYWNlKGlFbmQsIEZYU1lTX3djc2xlbihmY1RhYmxlW2lJbmRleF0ubHBzekpTTWFyayksCisgICAgICAgICAgICAgICAgICAgICAgICBmY1RhYmxlW2lJbmRleF0ubHBzekNwcE1hcmspOworICAgICAgICBpU3RhcnQgPSBpRW5kOworICAgICAgfQogICAgIH0KIAotICAgIGludCBpWWVhcixpTW9udGgsaURheSxpSG91cixpTWluLGlTZWM7CisgICAgaW50IGlZZWFyLCBpTW9udGgsIGlEYXksIGlIb3VyLCBpTWluLCBpU2VjOwogICAgIGlZZWFyID0ganNEYXRlLkdldFllYXIoKTsKICAgICBpTW9udGggPSBqc0RhdGUuR2V0TW9udGgoKTsKICAgICBpRGF5ID0ganNEYXRlLkdldERheSgpOwpAQCAtMzkwLDI0MyArMjc0LDMwOSBAQAogICAgIGlTZWMgPSBqc0RhdGUuR2V0U2Vjb25kcygpOwogCiAgICAgc3RydWN0IHRtIHRpbWUgPSB7fTsKLSAgICB0aW1lLnRtX3llYXIgPSBpWWVhci0xOTAwOworICAgIHRpbWUudG1feWVhciA9IGlZZWFyIC0gMTkwMDsKICAgICB0aW1lLnRtX21vbiA9IGlNb250aDsKICAgICB0aW1lLnRtX21kYXkgPSBpRGF5OwogICAgIHRpbWUudG1faG91ciA9IGlIb3VyOwogICAgIHRpbWUudG1fbWluID0gaU1pbjsKICAgICB0aW1lLnRtX3NlYyA9IGlTZWM7Ci0vLyAgQ09sZURhdGVUaW1lIGNwcFRtKGlZZWFyLGlNb250aCsxLGlEYXksaUhvdXIsaU1pbixpU2VjKTsKLSAgICAvL0NTdHJpbmcgc3RyRm9ybWF0ID0gY3BwVG0uRm9ybWF0KGNGb3JtYXQuY19zdHIoKSk7CiAKLSAgICBzdHJ1Y3Qgc3RydV9UYkNvbnZlcnRBZAotICAgIHsKLSAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwc3pKU01hcms7Ci0gICAgICAgIGludCAgICAgaVZhbHVlOworICAgIHN0cnVjdCBzdHJ1X1RiQ29udmVydEFkIHsKKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBscHN6SlNNYXJrOworICAgICAgaW50IGlWYWx1ZTsKICAgICB9OwogCi0gICAgc3RydV9UYkNvbnZlcnRBZCBjVGFibGVBZFtdID17Ci0gICAgICAgIHsgTCJtIiwgaU1vbnRoKzEgfSwKLSAgICAgICAgeyBMImQiLCBpRGF5IH0sCi0gICAgICAgIHsgTCJIIiwgaUhvdXIgfSwKLSAgICAgICAgeyBMImgiLCBpSG91cj4xMj9pSG91ci0xMjppSG91ciB9LAotICAgICAgICB7IEwiTSIsIGlNaW4gfSwKLSAgICAgICAgeyBMInMiLCBpU2VjIH0sCisgICAgc3RydV9UYkNvbnZlcnRBZCBjVGFibGVBZFtdID0geworICAgICAgICB7TCJtIiwgaU1vbnRoICsgMX0sIHtMImQiLCBpRGF5fSwKKyAgICAgICAge0wiSCIsIGlIb3VyfSwgICAgICB7TCJoIiwgaUhvdXIgPiAxMiA/IGlIb3VyIC0gMTIgOiBpSG91cn0sCisgICAgICAgIHtMIk0iLCBpTWlufSwgICAgICAge0wicyIsIGlTZWN9LAogICAgIH07CiAKLSAgICAvL2NGb3JtYXQgPSBzdHJGb3JtYXQuR2V0QnVmZmVyKHN0ckZvcm1hdC5HZXRMZW5ndGgoKSsxKTsKLSAgICBmb3IoaUluZGV4ID0gMDtpSW5kZXg8c2l6ZW9mKGNUYWJsZUFkKS9zaXplb2Yoc3RydV9UYkNvbnZlcnRBZCk7aUluZGV4KyspCi0gICAgewotICAgICAgICB3Y2hhcl90IHRzelZhbHVlWzEwXTsKLSAgICAgICAgLy9faXRvdChjVGFibGVBZFtpSW5kZXhdLmlWYWx1ZSx0c3pWYWx1ZSwxMCk7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZTsKLSAgICAgICAgc1ZhbHVlLkZvcm1hdChMIiVkIixjVGFibGVBZFtpSW5kZXhdLmlWYWx1ZSk7Ci0gICAgICAgIG1lbWNweSh0c3pWYWx1ZSwgKHdjaGFyX3QgKilzVmFsdWUuR2V0QnVmZmVyKHNWYWx1ZS5HZXRMZW5ndGgoKSsxKSxzVmFsdWUuR2V0TGVuZ3RoKCkqc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICBmb3IgKGlJbmRleCA9IDA7IGlJbmRleCA8IHNpemVvZihjVGFibGVBZCkgLyBzaXplb2Yoc3RydV9UYkNvbnZlcnRBZCk7CisgICAgICAgICBpSW5kZXgrKykgeworICAgICAgd2NoYXJfdCB0c3pWYWx1ZVsxMF07CisgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7CisgICAgICBzVmFsdWUuRm9ybWF0KEwiJWQiLCBjVGFibGVBZFtpSW5kZXhdLmlWYWx1ZSk7CisgICAgICBtZW1jcHkodHN6VmFsdWUsICh3Y2hhcl90KilzVmFsdWUuR2V0QnVmZmVyKHNWYWx1ZS5HZXRMZW5ndGgoKSArIDEpLAorICAgICAgICAgICAgIChzVmFsdWUuR2V0TGVuZ3RoKCkgKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7CiAKLQotICAgICAgICAvL3N0ckZvcm1hdC5SZXBsYWNlKGNUYWJsZUFkW2lJbmRleF0ubHBzekpTTWFyaywiJWQiKTsKLSAgICAgICAgLy9zdHJGb3JtYXQuRm9ybWF0KHN0ckZvcm1hdCxjVGFibGVBZFtpSW5kZXhdLmlWYWx1ZSk7Ci0gICAgICAgIGludCBpU3RhcnQgPSAwOwotICAgICAgICBpbnQgaUVuZDsKLSAgICAgICAgd2hpbGUoKGlFbmQgPSBjRm9ybWF0LmZpbmQoY1RhYmxlQWRbaUluZGV4XS5scHN6SlNNYXJrLCBpU3RhcnQpKSAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlFbmQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjRm9ybWF0W2lFbmQtMV0gPT0gTCclJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlTdGFydCA9IGlFbmQrMTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY0Zvcm1hdC5yZXBsYWNlKGlFbmQsRlhTWVNfd2NzbGVuKGNUYWJsZUFkW2lJbmRleF0ubHBzekpTTWFyayksdHN6VmFsdWUpOwotICAgICAgICAgICAgaVN0YXJ0ID0gaUVuZDsKKyAgICAgIGludCBpU3RhcnQgPSAwOworICAgICAgaW50IGlFbmQ7CisgICAgICB3aGlsZSAoKGlFbmQgPSBjRm9ybWF0LmZpbmQoY1RhYmxlQWRbaUluZGV4XS5scHN6SlNNYXJrLCBpU3RhcnQpKSAhPSAtMSkgeworICAgICAgICBpZiAoaUVuZCA+IDApIHsKKyAgICAgICAgICBpZiAoY0Zvcm1hdFtpRW5kIC0gMV0gPT0gTCclJykgeworICAgICAgICAgICAgaVN0YXJ0ID0gaUVuZCArIDE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgY0Zvcm1hdC5yZXBsYWNlKGlFbmQsIEZYU1lTX3djc2xlbihjVGFibGVBZFtpSW5kZXhdLmxwc3pKU01hcmspLAorICAgICAgICAgICAgICAgICAgICAgICAgdHN6VmFsdWUpOworICAgICAgICBpU3RhcnQgPSBpRW5kOworICAgICAgfQogICAgIH0KIAogICAgIENGWF9XaWRlU3RyaW5nIHN0ckZvcm1hdDsKICAgICB3Y2hhcl90IGJ1Zls2NF0gPSB7fTsKICAgICBzdHJGb3JtYXQgPSB3Y3NmdGltZShidWYsIDY0LCBjRm9ybWF0LmNfc3RyKCksICZ0aW1lKTsKICAgICBjRm9ybWF0ID0gYnVmOwotICAgIGNQdXJwb3NlID0gY0Zvcm1hdDsKLX0KLQotRlhfQk9PTCB1dGlsOjpwcmludHgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotICAgIGlmIChpU2l6ZTwyKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLSAgICBDRlhfV2lkZVN0cmluZyBzU291cmNlID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwotICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoc0Zvcm1hdCkuY19zdHIoKTsKLSAgICBzdGQ6OnN0cmluZyBjU291cmNlID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHNTb3VyY2UpLmNfc3RyKCk7Ci0gICAgc3RkOjpzdHJpbmcgY0Rlc3Q7Ci0gICAgcHJpbnR4KGNGb3JtYXQsY1NvdXJjZSxjRGVzdCk7Ci0gICAgdlJldCA9IGNEZXN0LmNfc3RyKCk7CisgICAgdlJldCA9IGNGb3JtYXQuY19zdHIoKTsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgdXRpbDo6cHJpbnR4KGNvbnN0IHN0ZDo6c3RyaW5nICZjRm9ybWF0LGNvbnN0IHN0ZDo6c3RyaW5nICZjU291cmNlMixzdGQ6OnN0cmluZyAmY1B1cnBvc2UpCi17Ci0gICAgc3RkOjpzdHJpbmcgY1NvdXJjZShjU291cmNlMik7Ci0gICAgaWYgKCFjUHVycG9zZS5lbXB0eSgpKQotICAgICAgICAvL2NQdXJwb3NlLmNsZWFyKCk7Ci0gICAgICAgIGNQdXJwb3NlLmVyYXNlKCk7Ci0gICAgaW50IGl0U291cmNlID0gMDsKLSAgICBpbnQgaVNpemUgPSBjU291cmNlLnNpemUoKTsKLSAgICBmb3IoaW50IGlJbmRleCA9IDA7IGlJbmRleCA8IChpbnQpY0Zvcm1hdC5zaXplKCkgJiYgaXRTb3VyY2U8aVNpemU7IGlJbmRleCsrKQotICAgIHsKLSAgICAgICAgY2hhciBsZXR0ZXIgPSBjRm9ybWF0W2lJbmRleF07Ci0gICAgICAgIHN3aXRjaChsZXR0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAnPyc6Ci0gICAgICAgICAgICAvL2NQdXJwb3NlLnB1c2hfYmFjayhjU291cmNlW2l0U291cmNlXSk7Cit2b2lkIHV0aWw6OnByaW50ZChjb25zdCBzdGQ6OndzdHJpbmcmIGNGb3JtYXQyLAorICAgICAgICAgICAgICAgICAgQ0pTX0RhdGUganNEYXRlLAorICAgICAgICAgICAgICAgICAgYm9vbCBiWEZBUGljdHVyZSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6d3N0cmluZyYgY1B1cnBvc2UpIHsKKyAgc3RkOjp3c3RyaW5nIGNGb3JtYXQgPSBjRm9ybWF0MjsKKworICBpZiAoYlhGQVBpY3R1cmUpIHsKKyAgICByZXR1cm47ICAvLyBjdXJyZW50bHksIGl0IGRvZXNuJ3Qgc3VwcG9ydCBYRkFQaWN0dXJlLgorICB9CisKKyAgaW50IGlJbmRleDsKKyAgZm9yIChpSW5kZXggPSAwOyBpSW5kZXggPCBzaXplb2YoZmNUYWJsZSkgLyBzaXplb2Yoc3RydV9UYkNvbnZlcnQpOworICAgICAgIGlJbmRleCsrKSB7CisgICAgaW50IGlTdGFydCA9IDA7CisgICAgaW50IGlFbmQ7CisgICAgd2hpbGUgKChpRW5kID0gY0Zvcm1hdC5maW5kKGZjVGFibGVbaUluZGV4XS5scHN6SlNNYXJrLCBpU3RhcnQpKSAhPSAtMSkgeworICAgICAgY0Zvcm1hdC5yZXBsYWNlKGlFbmQsIEZYU1lTX3djc2xlbihmY1RhYmxlW2lJbmRleF0ubHBzekpTTWFyayksCisgICAgICAgICAgICAgICAgICAgICAgZmNUYWJsZVtpSW5kZXhdLmxwc3pDcHBNYXJrKTsKKyAgICAgIGlTdGFydCA9IGlFbmQ7CisgICAgfQorICB9CisKKyAgaW50IGlZZWFyLCBpTW9udGgsIGlEYXksIGlIb3VyLCBpTWluLCBpU2VjOworICBpWWVhciA9IGpzRGF0ZS5HZXRZZWFyKCk7CisgIGlNb250aCA9IGpzRGF0ZS5HZXRNb250aCgpOworICBpRGF5ID0ganNEYXRlLkdldERheSgpOworICBpSG91ciA9IGpzRGF0ZS5HZXRIb3VycygpOworICBpTWluID0ganNEYXRlLkdldE1pbnV0ZXMoKTsKKyAgaVNlYyA9IGpzRGF0ZS5HZXRTZWNvbmRzKCk7CisKKyAgc3RydWN0IHRtIHRpbWUgPSB7fTsKKyAgdGltZS50bV95ZWFyID0gaVllYXIgLSAxOTAwOworICB0aW1lLnRtX21vbiA9IGlNb250aDsKKyAgdGltZS50bV9tZGF5ID0gaURheTsKKyAgdGltZS50bV9ob3VyID0gaUhvdXI7CisgIHRpbWUudG1fbWluID0gaU1pbjsKKyAgdGltZS50bV9zZWMgPSBpU2VjOworICAvLyAgQ09sZURhdGVUaW1lIGNwcFRtKGlZZWFyLGlNb250aCsxLGlEYXksaUhvdXIsaU1pbixpU2VjKTsKKyAgLy8gQ1N0cmluZyBzdHJGb3JtYXQgPSBjcHBUbS5Gb3JtYXQoY0Zvcm1hdC5jX3N0cigpKTsKKworICBzdHJ1Y3Qgc3RydV9UYkNvbnZlcnRBZCB7CisgICAgY29uc3QgRlhfV0NIQVIqIGxwc3pKU01hcms7CisgICAgaW50IGlWYWx1ZTsKKyAgfTsKKworICBzdHJ1X1RiQ29udmVydEFkIGNUYWJsZUFkW10gPSB7CisgICAgICB7TCJtIiwgaU1vbnRoICsgMX0sIHtMImQiLCBpRGF5fSwKKyAgICAgIHtMIkgiLCBpSG91cn0sICAgICAge0wiaCIsIGlIb3VyID4gMTIgPyBpSG91ciAtIDEyIDogaUhvdXJ9LAorICAgICAge0wiTSIsIGlNaW59LCAgICAgICB7TCJzIiwgaVNlY30sCisgIH07CisKKyAgLy8gY0Zvcm1hdCA9IHN0ckZvcm1hdC5HZXRCdWZmZXIoc3RyRm9ybWF0LkdldExlbmd0aCgpKzEpOworICBmb3IgKGlJbmRleCA9IDA7IGlJbmRleCA8IHNpemVvZihjVGFibGVBZCkgLyBzaXplb2Yoc3RydV9UYkNvbnZlcnRBZCk7CisgICAgICAgaUluZGV4KyspIHsKKyAgICB3Y2hhcl90IHRzelZhbHVlWzEwXTsKKyAgICAvL19pdG90KGNUYWJsZUFkW2lJbmRleF0uaVZhbHVlLHRzelZhbHVlLDEwKTsKKyAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7CisgICAgc1ZhbHVlLkZvcm1hdChMIiVkIiwgY1RhYmxlQWRbaUluZGV4XS5pVmFsdWUpOworICAgIG1lbWNweSh0c3pWYWx1ZSwgKHdjaGFyX3QqKXNWYWx1ZS5HZXRCdWZmZXIoc1ZhbHVlLkdldExlbmd0aCgpICsgMSksCisgICAgICAgICAgIHNWYWx1ZS5HZXRMZW5ndGgoKSAqIHNpemVvZih3Y2hhcl90KSk7CisKKyAgICAvLyBzdHJGb3JtYXQuUmVwbGFjZShjVGFibGVBZFtpSW5kZXhdLmxwc3pKU01hcmssIiVkIik7CisgICAgLy8gc3RyRm9ybWF0LkZvcm1hdChzdHJGb3JtYXQsY1RhYmxlQWRbaUluZGV4XS5pVmFsdWUpOworICAgIGludCBpU3RhcnQgPSAwOworICAgIGludCBpRW5kOworICAgIHdoaWxlICgoaUVuZCA9IGNGb3JtYXQuZmluZChjVGFibGVBZFtpSW5kZXhdLmxwc3pKU01hcmssIGlTdGFydCkpICE9IC0xKSB7CisgICAgICBpZiAoaUVuZCA+IDApIHsKKyAgICAgICAgaWYgKGNGb3JtYXRbaUVuZCAtIDFdID09IEwnJScpIHsKKyAgICAgICAgICBpU3RhcnQgPSBpRW5kICsgMTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY0Zvcm1hdC5yZXBsYWNlKGlFbmQsIEZYU1lTX3djc2xlbihjVGFibGVBZFtpSW5kZXhdLmxwc3pKU01hcmspLAorICAgICAgICAgICAgICAgICAgICAgIHRzelZhbHVlKTsKKyAgICAgIGlTdGFydCA9IGlFbmQ7CisgICAgfQorICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyRm9ybWF0OworICB3Y2hhcl90IGJ1Zls2NF0gPSB7fTsKKyAgc3RyRm9ybWF0ID0gd2NzZnRpbWUoYnVmLCA2NCwgY0Zvcm1hdC5jX3N0cigpLCAmdGltZSk7CisgIGNGb3JtYXQgPSBidWY7CisgIGNQdXJwb3NlID0gY0Zvcm1hdDsKK30KKworRlhfQk9PTCB1dGlsOjpwcmludHgoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOworICBpZiAoaVNpemUgPCAyKQorICAgIHJldHVybiBGQUxTRTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc1NvdXJjZSA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgc3RkOjpzdHJpbmcgY0Zvcm1hdCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShzRm9ybWF0KS5jX3N0cigpOworICBzdGQ6OnN0cmluZyBjU291cmNlID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHNTb3VyY2UpLmNfc3RyKCk7CisgIHN0ZDo6c3RyaW5nIGNEZXN0OworICBwcmludHgoY0Zvcm1hdCwgY1NvdXJjZSwgY0Rlc3QpOworICB2UmV0ID0gY0Rlc3QuY19zdHIoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgdXRpbDo6cHJpbnR4KGNvbnN0IHN0ZDo6c3RyaW5nJiBjRm9ybWF0LAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNTb3VyY2UyLAorICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcmIGNQdXJwb3NlKSB7CisgIHN0ZDo6c3RyaW5nIGNTb3VyY2UoY1NvdXJjZTIpOworICBpZiAoIWNQdXJwb3NlLmVtcHR5KCkpCisgICAgLy8gY1B1cnBvc2UuY2xlYXIoKTsKKyAgICBjUHVycG9zZS5lcmFzZSgpOworICBpbnQgaXRTb3VyY2UgPSAwOworICBpbnQgaVNpemUgPSBjU291cmNlLnNpemUoKTsKKyAgZm9yIChpbnQgaUluZGV4ID0gMDsgaUluZGV4IDwgKGludCljRm9ybWF0LnNpemUoKSAmJiBpdFNvdXJjZSA8IGlTaXplOworICAgICAgIGlJbmRleCsrKSB7CisgICAgY2hhciBsZXR0ZXIgPSBjRm9ybWF0W2lJbmRleF07CisgICAgc3dpdGNoIChsZXR0ZXIpIHsKKyAgICAgIGNhc2UgJz8nOgorICAgICAgICAvLyBjUHVycG9zZS5wdXNoX2JhY2soY1NvdXJjZVtpdFNvdXJjZV0pOworICAgICAgICBjUHVycG9zZSArPSBjU291cmNlW2l0U291cmNlXTsKKyAgICAgICAgaXRTb3VyY2UrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdYJzogeworICAgICAgICB3aGlsZSAoaXRTb3VyY2UgPCBpU2l6ZSkgeworICAgICAgICAgIGlmICgoY1NvdXJjZVtpdFNvdXJjZV0gPj0gJzAnICYmIGNTb3VyY2VbaXRTb3VyY2VdIDw9ICc5JykgfHwKKyAgICAgICAgICAgICAgKGNTb3VyY2VbaXRTb3VyY2VdID49ICdhJyAmJiBjU291cmNlW2l0U291cmNlXSA8PSAneicpIHx8CisgICAgICAgICAgICAgIChjU291cmNlW2l0U291cmNlXSA+PSAnQScgJiYgY1NvdXJjZVtpdFNvdXJjZV0gPD0gJ1onKSkgeworICAgICAgICAgICAgLy8gY1B1cnBvc2UucHVzaF9iYWNrKGNTb3VyY2VbaXRTb3VyY2VdKTsKICAgICAgICAgICAgIGNQdXJwb3NlICs9IGNTb3VyY2VbaXRTb3VyY2VdOwogICAgICAgICAgICAgaXRTb3VyY2UrKzsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdYJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZShpdFNvdXJjZSA8IGlTaXplKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjU291cmNlW2l0U291cmNlXT49JzAnJiZjU291cmNlW2l0U291cmNlXTw9JzknKSB8fCAoY1NvdXJjZVtpdFNvdXJjZV0+PSdhJyAmJiBjU291cmNlW2l0U291cmNlXTw9J3onKSB8fCAoY1NvdXJjZVtpdFNvdXJjZV0+PSdBJyAmJiBjU291cmNlW2l0U291cmNlXTw9J1onKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9jUHVycG9zZS5wdXNoX2JhY2soY1NvdXJjZVtpdFNvdXJjZV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1B1cnBvc2UgKz0gY1NvdXJjZVtpdFNvdXJjZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdFNvdXJjZSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaXRTb3VyY2UrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUoaXRTb3VyY2UgPCBpU2l6ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoY1NvdXJjZVtpdFNvdXJjZV0+PSdhJyAmJiBjU291cmNlW2l0U291cmNlXTw9J3onKSB8fCAoY1NvdXJjZVtpdFNvdXJjZV0+PSdBJyAmJiBjU291cmNlW2l0U291cmNlXTw9J1onKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9jUHVycG9zZS5wdXNoX2JhY2soY1NvdXJjZVtpdFNvdXJjZV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1B1cnBvc2UgKz0gY1NvdXJjZVtpdFNvdXJjZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdFNvdXJjZSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaXRTb3VyY2UrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUoaXRTb3VyY2UgPCBpU2l6ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjU291cmNlW2l0U291cmNlXT49JzAnJiZjU291cmNlW2l0U291cmNlXTw9JzknKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2NQdXJwb3NlLnB1c2hfYmFjayhjU291cmNlW2l0U291cmNlXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjUHVycG9zZSArPSBjU291cmNlW2l0U291cmNlXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0U291cmNlKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpdFNvdXJjZSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAnKic6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY1B1cnBvc2UuYXBwZW5kKGNTb3VyY2UsaXRTb3VyY2UsaVNpemUtaXRTb3VyY2UpOwotICAgICAgICAgICAgICAgIGl0U291cmNlID0gaVNpemUtMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcihzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaXQgPSBjU291cmNlLmJlZ2luKCk7aXQgIT0gY1NvdXJjZS5lbmQoKTsgaXQrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICppdCA9IHRvdXBwZXIoKml0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcihzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaXQgPSBjU291cmNlLmJlZ2luKCk7aXQgIT0gY1NvdXJjZS5lbmQoKTsgaXQrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICppdCA9IHRvbG93ZXIoKml0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgJz0nOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvL2NQdXJwb3NlLnB1c2hfYmFjayhsZXR0ZXIpOwotICAgICAgICAgICAgY1B1cnBvc2UgKz0gbGV0dGVyOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGl0U291cmNlKys7CiAgICAgICAgIH0KLSAgICB9Ci19Ci0KLUZYX0JPT0wgdXRpbDo6c2NhbmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLSAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwotICAgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0gICAgaWYgKGlTaXplIDwgMikKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLSAgICBDRlhfV2lkZVN0cmluZyBzRGF0ZSA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLSAgICBkb3VibGUgZERhdGUgPSBKU19HZXREYXRlVGltZSgpOwotICAgIGlmIChzRGF0ZS5HZXRMZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgICBGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwotICAgICAgICBkRGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoc0RhdGUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwotICAgIH0KLQotICAgIGlmICghSlNfUG9ydElzTmFuKGREYXRlKSkKLSAgICB7Ci0gICAgICAgIENKU19EYXRlIGRhdGUoaXNvbGF0ZSxkRGF0ZSk7Ci0gICAgICAgIHZSZXQgPSBkYXRlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2UmV0LlNldE51bGwoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotaW50NjRfdCBGWF9hdG9pNjQoY29uc3QgY2hhciAqbnB0cikKLXsKLSAgICAgICAgaW50IGM7ICAgICAgICAgICAgICAvKiBjdXJyZW50IGNoYXIgKi8KLSAgICAgICAgaW50NjRfdCB0b3RhbDsgICAgICAvKiBjdXJyZW50IHRvdGFsICovCi0gICAgICAgIGludCBzaWduOyAgICAgICAgICAgLyogaWYgJy0nLCB0aGVuIG5lZ2F0aXZlLCBvdGhlcndpc2UgcG9zaXRpdmUgKi8KLQotICAgICAgICAvKiBza2lwIHdoaXRlc3BhY2UgKi8KLSAgICAgICAgd2hpbGUgKCBpc3NwYWNlKChpbnQpKHVuc2lnbmVkIGNoYXIpKm5wdHIpICkKLSAgICAgICAgICAgICsrbnB0cjsKLQotICAgICAgICBjID0gKGludCkodW5zaWduZWQgY2hhcikqbnB0cisrOwotICAgICAgICBzaWduID0gYzsgICAgICAgICAgIC8qIHNhdmUgc2lnbiBpbmRpY2F0aW9uICovCi0gICAgICAgIGlmIChjID09ICctJyB8fCBjID09ICcrJykKLSAgICAgICAgICAgIGMgPSAoaW50KSh1bnNpZ25lZCBjaGFyKSpucHRyKys7ICAgIC8qIHNraXAgc2lnbiAqLwotCi0gICAgICAgIHRvdGFsID0gMDsKLQotICAgICAgICB3aGlsZSAoaXNkaWdpdChjKSkgewotICAgICAgICAgICAgdG90YWwgPSAxMCAqIHRvdGFsICsgKGMgLSAnMCcpOyAgICAgLyogYWNjdW11bGF0ZSBkaWdpdCAqLwotICAgICAgICAgICAgYyA9IChpbnQpKHVuc2lnbmVkIGNoYXIpKm5wdHIrKzsgICAgLyogZ2V0IG5leHQgY2hhciAqLworICAgICAgICBicmVhazsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlICdBJzogeworICAgICAgICB3aGlsZSAoaXRTb3VyY2UgPCBpU2l6ZSkgeworICAgICAgICAgIGlmICgoY1NvdXJjZVtpdFNvdXJjZV0gPj0gJ2EnICYmIGNTb3VyY2VbaXRTb3VyY2VdIDw9ICd6JykgfHwKKyAgICAgICAgICAgICAgKGNTb3VyY2VbaXRTb3VyY2VdID49ICdBJyAmJiBjU291cmNlW2l0U291cmNlXSA8PSAnWicpKSB7CisgICAgICAgICAgICAvLyBjUHVycG9zZS5wdXNoX2JhY2soY1NvdXJjZVtpdFNvdXJjZV0pOworICAgICAgICAgICAgY1B1cnBvc2UgKz0gY1NvdXJjZVtpdFNvdXJjZV07CisgICAgICAgICAgICBpdFNvdXJjZSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGl0U291cmNlKys7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2lnbiA9PSAnLScgPyAtdG90YWwgOiB0b3RhbDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAnOSc6IHsKKyAgICAgICAgd2hpbGUgKGl0U291cmNlIDwgaVNpemUpIHsKKyAgICAgICAgICBpZiAoY1NvdXJjZVtpdFNvdXJjZV0gPj0gJzAnICYmIGNTb3VyY2VbaXRTb3VyY2VdIDw9ICc5JykgeworICAgICAgICAgICAgLy8gY1B1cnBvc2UucHVzaF9iYWNrKGNTb3VyY2VbaXRTb3VyY2VdKTsKKyAgICAgICAgICAgIGNQdXJwb3NlICs9IGNTb3VyY2VbaXRTb3VyY2VdOworICAgICAgICAgICAgaXRTb3VyY2UrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpdFNvdXJjZSsrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnKic6IHsKKyAgICAgICAgY1B1cnBvc2UuYXBwZW5kKGNTb3VyY2UsIGl0U291cmNlLCBpU2l6ZSAtIGl0U291cmNlKTsKKyAgICAgICAgaXRTb3VyY2UgPSBpU2l6ZSAtIDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnXFwnOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz4nOiB7CisgICAgICAgIGZvciAoc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gY1NvdXJjZS5iZWdpbigpOyBpdCAhPSBjU291cmNlLmVuZCgpOworICAgICAgICAgICAgIGl0KyspIHsKKyAgICAgICAgICAqaXQgPSB0b3VwcGVyKCppdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICc8JzogeworICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nOjppdGVyYXRvciBpdCA9IGNTb3VyY2UuYmVnaW4oKTsgaXQgIT0gY1NvdXJjZS5lbmQoKTsKKyAgICAgICAgICAgICBpdCsrKSB7CisgICAgICAgICAgKml0ID0gdG9sb3dlcigqaXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnPSc6CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gY1B1cnBvc2UucHVzaF9iYWNrKGxldHRlcik7CisgICAgICAgIGNQdXJwb3NlICs9IGxldHRlcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CiB9CiAKLUZYX0JPT0wgdXRpbDo6Ynl0ZVRvQ2hhcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotICAgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0gICAgaWYgKGlTaXplID09IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBpbnQgbkJ5dGUgPSBwYXJhbXNbMF0uVG9JbnQoKTsKLSAgICB1bnNpZ25lZCBjaGFyIGNCeXRlID0gKHVuc2lnbmVkIGNoYXIpbkJ5dGU7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKLSAgICBjc1ZhbHVlLkZvcm1hdChMIiVjIiwgY0J5dGUpOwotICAgIHZSZXQgPSBjc1ZhbHVlLmNfc3RyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIHV0aWw6OnNjYW5kKElGWEpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKKyAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKGlTaXplIDwgMikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc0RhdGUgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7CisgIGRvdWJsZSBkRGF0ZSA9IEpTX0dldERhdGVUaW1lKCk7CisgIGlmIChzRGF0ZS5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOworICAgIGREYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShzRGF0ZSwgc0Zvcm1hdCwgYldyb25nRm9ybWF0KTsKKyAgfQorCisgIGlmICghSlNfUG9ydElzTmFuKGREYXRlKSkgeworICAgIENKU19EYXRlIGRhdGUoaXNvbGF0ZSwgZERhdGUpOworICAgIHZSZXQgPSBkYXRlOworICB9IGVsc2UgeworICAgIHZSZXQuU2V0TnVsbCgpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludDY0X3QgRlhfYXRvaTY0KGNvbnN0IGNoYXIqIG5wdHIpIHsKKyAgaW50IGM7ICAgICAgICAgLyogY3VycmVudCBjaGFyICovCisgIGludDY0X3QgdG90YWw7IC8qIGN1cnJlbnQgdG90YWwgKi8KKyAgaW50IHNpZ247ICAgICAgLyogaWYgJy0nLCB0aGVuIG5lZ2F0aXZlLCBvdGhlcndpc2UgcG9zaXRpdmUgKi8KKworICAvKiBza2lwIHdoaXRlc3BhY2UgKi8KKyAgd2hpbGUgKGlzc3BhY2UoKGludCkodW5zaWduZWQgY2hhcikqbnB0cikpCisgICAgKytucHRyOworCisgIGMgPSAoaW50KSh1bnNpZ25lZCBjaGFyKSpucHRyKys7CisgIHNpZ24gPSBjOyAvKiBzYXZlIHNpZ24gaW5kaWNhdGlvbiAqLworICBpZiAoYyA9PSAnLScgfHwgYyA9PSAnKycpCisgICAgYyA9IChpbnQpKHVuc2lnbmVkIGNoYXIpKm5wdHIrKzsgLyogc2tpcCBzaWduICovCisKKyAgdG90YWwgPSAwOworCisgIHdoaWxlIChpc2RpZ2l0KGMpKSB7CisgICAgdG90YWwgPSAxMCAqIHRvdGFsICsgKGMgLSAnMCcpOyAgLyogYWNjdW11bGF0ZSBkaWdpdCAqLworICAgIGMgPSAoaW50KSh1bnNpZ25lZCBjaGFyKSpucHRyKys7IC8qIGdldCBuZXh0IGNoYXIgKi8KKyAgfQorCisgIHJldHVybiBzaWduID09ICctJyA/IC10b3RhbCA6IHRvdGFsOworfQorCitGWF9CT09MIHV0aWw6OmJ5dGVUb0NoYXIoSUZYSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOworICBpZiAoaVNpemUgPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGludCBuQnl0ZSA9IHBhcmFtc1swXS5Ub0ludCgpOworICB1bnNpZ25lZCBjaGFyIGNCeXRlID0gKHVuc2lnbmVkIGNoYXIpbkJ5dGU7CisgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWU7CisgIGNzVmFsdWUuRm9ybWF0KEwiJWMiLCBjQnl0ZSk7CisgIHZSZXQgPSBjc1ZhbHVlLmNfc3RyKCk7CisgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvanNhcGkvZnhqc192OC5jcHAgYi9mcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcAppbmRleCBjM2IxYjkyLi40Yzc1ZjFhIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcAorKysgYi9mcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcApAQCAtMTIsNzc3ICsxMiw5MDIgQEAKICNpbmNsdWRlIDxjbWF0aD4KICNpbmNsdWRlIDxsaW1pdHM+CiAKLSNkZWZpbmUgVkFMVUVfTkFNRV9TVFJJTkcJCUwic3RyaW5nIgotI2RlZmluZSBWQUxVRV9OQU1FX05VTUJFUgkJTCJudW1iZXIiCi0jZGVmaW5lIFZBTFVFX05BTUVfQk9PTEVBTgkJTCJib29sZWFuIgotI2RlZmluZSBWQUxVRV9OQU1FX0RBVEUJCQlMImRhdGUiCi0jZGVmaW5lIFZBTFVFX05BTUVfT0JKRUNUCQlMIm9iamVjdCIKLSNkZWZpbmUgVkFMVUVfTkFNRV9GWE9CSgkJTCJmeG9iaiIKLSNkZWZpbmUgVkFMVUVfTkFNRV9OVUxMCQkJTCJudWxsIgotI2RlZmluZSBWQUxVRV9OQU1FX1VOREVGSU5FRAlMInVuZGVmaW5lZCIKKyNkZWZpbmUgVkFMVUVfTkFNRV9TVFJJTkcgTCJzdHJpbmciCisjZGVmaW5lIFZBTFVFX05BTUVfTlVNQkVSIEwibnVtYmVyIgorI2RlZmluZSBWQUxVRV9OQU1FX0JPT0xFQU4gTCJib29sZWFuIgorI2RlZmluZSBWQUxVRV9OQU1FX0RBVEUgTCJkYXRlIgorI2RlZmluZSBWQUxVRV9OQU1FX09CSkVDVCBMIm9iamVjdCIKKyNkZWZpbmUgVkFMVUVfTkFNRV9GWE9CSiBMImZ4b2JqIgorI2RlZmluZSBWQUxVRV9OQU1FX05VTEwgTCJudWxsIgorI2RlZmluZSBWQUxVRV9OQU1FX1VOREVGSU5FRCBMInVuZGVmaW5lZCIKIAotY29uc3Qgc3RhdGljIEZYX0RXT1JEIGdfbmFuWzJdID0gezAsMHg3RkY4MDAwMCB9Owotc3RhdGljIGRvdWJsZSBHZXROYW4oKQoteworY29uc3Qgc3RhdGljIEZYX0RXT1JEIGdfbmFuWzJdID0gezAsIDB4N0ZGODAwMDB9Oworc3RhdGljIGRvdWJsZSBHZXROYW4oKSB7CiAgIHJldHVybiAqKGRvdWJsZSopZ19uYW47CiB9CiBzdGF0aWMgdW5zaWduZWQgaW50IGdfZW1iZWRkZXJEYXRhU2xvdCA9IDB1OwogCi0KLWNsYXNzIENKU19Qcml2YXRlRGF0YQotewotcHVibGljOgotCUNKU19Qcml2YXRlRGF0YSgpOk9iakRlZklEKC0xKSwgcFByaXZhdGUoTlVMTCkge30KLQlpbnQgT2JqRGVmSUQ7Ci0Jdm9pZCoJcFByaXZhdGU7CitjbGFzcyBDSlNfUHJpdmF0ZURhdGEgeworIHB1YmxpYzoKKyAgQ0pTX1ByaXZhdGVEYXRhKCkgOiBPYmpEZWZJRCgtMSksIHBQcml2YXRlKE5VTEwpIHt9CisgIGludCBPYmpEZWZJRDsKKyAgdm9pZCogcFByaXZhdGU7CiB9OwogCitjbGFzcyBDSlNfT2JqRGVmaW50aW9uIHsKKyBwdWJsaWM6CisgIENKU19PYmpEZWZpbnRpb24odjg6Oklzb2xhdGUqIGlzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc09iak5hbWUsCisgICAgICAgICAgICAgICAgICAgRlhKU09CSlRZUEUgZU9ialR5cGUsCisgICAgICAgICAgICAgICAgICAgTFBfQ09OU1RSVUNUT1IgcENvbnN0cnVjdG9yLAorICAgICAgICAgICAgICAgICAgIExQX0RFU1RSVUNUT1IgcERlc3RydWN0b3IpCisgICAgICA6IG9iak5hbWUoc09iak5hbWUpLAorICAgICAgICBvYmpUeXBlKGVPYmpUeXBlKSwKKyAgICAgICAgbV9wQ29uc3RydWN0b3IocENvbnN0cnVjdG9yKSwKKyAgICAgICAgbV9wRGVzdHJ1Y3RvcihwRGVzdHJ1Y3RvciksCisgICAgICAgIG1fYlNldEFzR2xvYmFsT2JqZWN0KEZBTFNFKSB7CisgICAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CisgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKIAotY2xhc3MgQ0pTX09iakRlZmludGlvbgotewotcHVibGljOgotCUNKU19PYmpEZWZpbnRpb24odjg6Oklzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IHdjaGFyX3QqIHNPYmpOYW1lLCBGWEpTT0JKVFlQRSBlT2JqVHlwZSwgTFBfQ09OU1RSVUNUT1IgcENvbnN0cnVjdG9yLCBMUF9ERVNUUlVDVE9SIHBEZXN0cnVjdG9yKToKLQkgIG9iak5hbWUoc09iak5hbWUpLCBvYmpUeXBlKGVPYmpUeXBlKSwgbV9wQ29uc3RydWN0b3IocENvbnN0cnVjdG9yKSwgbV9wRGVzdHJ1Y3RvcihwRGVzdHJ1Y3RvciksbV9iU2V0QXNHbG9iYWxPYmplY3QoRkFMU0UpCi0JICB7Ci0JCSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0JCSAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wbGF0ZSA9CisgICAgICAgIHY4OjpPYmplY3RUZW1wbGF0ZTo6TmV3KGlzb2xhdGUpOworICAgIG9ialRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoMik7CisgICAgbV9vYmpUZW1wbGF0ZS5SZXNldChpc29sYXRlLCBvYmpUZW1wbGF0ZSk7CiAKLQkJICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wbGF0ZSA9IHY4OjpPYmplY3RUZW1wbGF0ZTo6TmV3KGlzb2xhdGUpOwotCQkgIG9ialRlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoMik7Ci0JCSAgbV9vYmpUZW1wbGF0ZS5SZXNldChpc29sYXRlLCBvYmpUZW1wbGF0ZSk7CisgICAgLy8gRG9jdW1lbnQgYXMgdGhlIGdsb2JhbCBvYmplY3QuCisgICAgaWYgKEZYU1lTX3djc2NtcChzT2JqTmFtZSwgTCJEb2N1bWVudCIpID09IDApIHsKKyAgICAgIG1fYlNldEFzR2xvYmFsT2JqZWN0ID0gVFJVRTsKKyAgICB9CisgIH0KKyAgfkNKU19PYmpEZWZpbnRpb24oKSB7CisgICAgbV9vYmpUZW1wbGF0ZS5SZXNldCgpOworICAgIG1fU3RhdGljT2JqLlJlc2V0KCk7CisgIH0KIAotCQkgLy9Eb2N1bWVudCBhcyB0aGUgZ2xvYmFsIG9iamVjdC4KLQkJICBpZihGWFNZU193Y3NjbXAoc09iak5hbWUsIEwiRG9jdW1lbnQiKSA9PSAwKQotCQkgIHsKLQkJCSBtX2JTZXRBc0dsb2JhbE9iamVjdCA9IFRSVUU7Ci0JCSAgfQorIHB1YmxpYzoKKyAgY29uc3Qgd2NoYXJfdCogb2JqTmFtZTsKKyAgRlhKU09CSlRZUEUgb2JqVHlwZTsKKyAgTFBfQ09OU1RSVUNUT1IgbV9wQ29uc3RydWN0b3I7CisgIExQX0RFU1RSVUNUT1IgbV9wRGVzdHJ1Y3RvcjsKKyAgRlhfQk9PTCBtX2JTZXRBc0dsb2JhbE9iamVjdDsKIAotCSAgfQotCSAgfkNKU19PYmpEZWZpbnRpb24oKQotCSAgewotCQkgIG1fb2JqVGVtcGxhdGUuUmVzZXQoKTsKLQkJICBtX1N0YXRpY09iai5SZXNldCgpOwotCSAgfQotcHVibGljOgotCWNvbnN0IHdjaGFyX3QqIG9iak5hbWU7Ci0JRlhKU09CSlRZUEUgb2JqVHlwZTsKLQlMUF9DT05TVFJVQ1RPUiBtX3BDb25zdHJ1Y3RvcjsKLQlMUF9ERVNUUlVDVE9SIG1fcERlc3RydWN0b3I7Ci0JRlhfQk9PTAltX2JTZXRBc0dsb2JhbE9iamVjdDsKLQotCXY4OjpHbG9iYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBtX29ialRlbXBsYXRlOwotCXY4OjpHbG9iYWw8djg6Ok9iamVjdD4gbV9TdGF0aWNPYmo7CisgIHY4OjpHbG9iYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBtX29ialRlbXBsYXRlOworICB2ODo6R2xvYmFsPHY4OjpPYmplY3Q+IG1fU3RhdGljT2JqOwogfTsKIAotaW50IEpTX0RlZmluZU9iaihJSlNfUnVudGltZSogcEpTUnVudGltZSwgY29uc3Qgd2NoYXJfdCogc09iak5hbWUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlLCBMUF9DT05TVFJVQ1RPUiBwQ29uc3RydWN0b3IsIExQX0RFU1RSVUNUT1IgcERlc3RydWN0b3IpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoZ19lbWJlZGRlckRhdGFTbG90KTsKLQlpZighcEFycmF5KQotCXsKLQkJcEFycmF5ID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOwotCQlpc29sYXRlLT5TZXREYXRhKGdfZW1iZWRkZXJEYXRhU2xvdCwgcEFycmF5KTsKLQl9Ci0JQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IEZYX05FVyBDSlNfT2JqRGVmaW50aW9uKGlzb2xhdGUsIHNPYmpOYW1lLCBlT2JqVHlwZSwgcENvbnN0cnVjdG9yLCBwRGVzdHJ1Y3Rvcik7Ci0JcEFycmF5LT5BZGQocE9iakRlZik7Ci0JcmV0dXJuIHBBcnJheS0+R2V0U2l6ZSgpLTE7CitpbnQgSlNfRGVmaW5lT2JqKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzT2JqTmFtZSwKKyAgICAgICAgICAgICAgICAgRlhKU09CSlRZUEUgZU9ialR5cGUsCisgICAgICAgICAgICAgICAgIExQX0NPTlNUUlVDVE9SIHBDb25zdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgTFBfREVTVFJVQ1RPUiBwRGVzdHJ1Y3RvcikgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7CisgIENGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YShnX2VtYmVkZGVyRGF0YVNsb3QpOworICBpZiAoIXBBcnJheSkgeworICAgIHBBcnJheSA9IEZYX05FVyBDRlhfUHRyQXJyYXkoKTsKKyAgICBpc29sYXRlLT5TZXREYXRhKGdfZW1iZWRkZXJEYXRhU2xvdCwgcEFycmF5KTsKKyAgfQorICBDSlNfT2JqRGVmaW50aW9uKiBwT2JqRGVmID0gRlhfTkVXIENKU19PYmpEZWZpbnRpb24oCisgICAgICBpc29sYXRlLCBzT2JqTmFtZSwgZU9ialR5cGUsIHBDb25zdHJ1Y3RvciwgcERlc3RydWN0b3IpOworICBwQXJyYXktPkFkZChwT2JqRGVmKTsKKyAgcmV0dXJuIHBBcnJheS0+R2V0U2l6ZSgpIC0gMTsKIH0KIAotaW50IEpTX0RlZmluZU9iak1ldGhvZChJSlNfUnVudGltZSogcEpTUnVudGltZSwgaW50IG5PYmpEZWZuSUQsIGNvbnN0IHdjaGFyX3QqIHNNZXRob2ROYW1lLCB2ODo6RnVuY3Rpb25DYWxsYmFjayBwTWV0aG9kQ2FsbCkKLXsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKLQl2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOworaW50IEpTX0RlZmluZU9iak1ldGhvZChJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5PYmpEZWZuSUQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNNZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb25DYWxsYmFjayBwTWV0aG9kQ2FsbCkgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7CiAKLQlDRlhfV2lkZVN0cmluZyB3cyA9IENGWF9XaWRlU3RyaW5nKHNNZXRob2ROYW1lKTsKLQlDRlhfQnl0ZVN0cmluZyBic01ldGhvZE5hbWUgPSB3cy5VVEY4RW5jb2RlKCk7CisgIENGWF9XaWRlU3RyaW5nIHdzID0gQ0ZYX1dpZGVTdHJpbmcoc01ldGhvZE5hbWUpOworICBDRlhfQnl0ZVN0cmluZyBic01ldGhvZE5hbWUgPSB3cy5VVEY4RW5jb2RlKCk7CiAKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoZ19lbWJlZGRlckRhdGFTbG90KTsKLQlpZighcEFycmF5KSByZXR1cm4gMDsKKyAgQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKGdfZW1iZWRkZXJEYXRhU2xvdCk7CisgIGlmICghcEFycmF5KQorICAgIHJldHVybiAwOwogCi0JaWYobk9iakRlZm5JRDwwIHx8IG5PYmpEZWZuSUQ+PSBwQXJyYXktPkdldFNpemUoKSkgcmV0dXJuIDA7Ci0JQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KG5PYmpEZWZuSUQpOwotCXY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IG9ialRlbXAgPSB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPjo6TmV3KGlzb2xhdGUsIHBPYmpEZWYtPm1fb2JqVGVtcGxhdGUpOwotCW9ialRlbXAtPlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChpc29sYXRlLCBic01ldGhvZE5hbWUuY19zdHIoKSwgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpLlRvTG9jYWxDaGVja2VkKCksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoaXNvbGF0ZSwgcE1ldGhvZENhbGwpLCB2ODo6UmVhZE9ubHkpOwotCXBPYmpEZWYtPm1fb2JqVGVtcGxhdGUuUmVzZXQoaXNvbGF0ZSxvYmpUZW1wKTsKLQlyZXR1cm4gMDsKKyAgaWYgKG5PYmpEZWZuSUQgPCAwIHx8IG5PYmpEZWZuSUQgPj0gcEFycmF5LT5HZXRTaXplKCkpCisgICAgcmV0dXJuIDA7CisgIENKU19PYmpEZWZpbnRpb24qIHBPYmpEZWYgPSAoQ0pTX09iakRlZmludGlvbiopcEFycmF5LT5HZXRBdChuT2JqRGVmbklEKTsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gb2JqVGVtcCA9CisgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPjo6TmV3KGlzb2xhdGUsIHBPYmpEZWYtPm1fb2JqVGVtcGxhdGUpOworICBvYmpUZW1wLT5TZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoaXNvbGF0ZSwgYnNNZXRob2ROYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCkKKyAgICAgICAgICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKSwKKyAgICAgICAgICAgICAgIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoaXNvbGF0ZSwgcE1ldGhvZENhbGwpLCB2ODo6UmVhZE9ubHkpOworICBwT2JqRGVmLT5tX29ialRlbXBsYXRlLlJlc2V0KGlzb2xhdGUsIG9ialRlbXApOworICByZXR1cm4gMDsKIH0KIAotaW50IEpTX0RlZmluZU9ialByb3BlcnR5KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBpbnQgbk9iakRlZm5JRCwgY29uc3Qgd2NoYXJfdCogc1Byb3BOYW1lLCB2ODo6QWNjZXNzb3JHZXR0ZXJDYWxsYmFjayBwUHJvcEdldCwgdjg6OkFjY2Vzc29yU2V0dGVyQ2FsbGJhY2sgcFByb3BQdXQpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKK2ludCBKU19EZWZpbmVPYmpQcm9wZXJ0eShJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9iakRlZm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzUHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkFjY2Vzc29yR2V0dGVyQ2FsbGJhY2sgcFByb3BHZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkFjY2Vzc29yU2V0dGVyQ2FsbGJhY2sgcFByb3BQdXQpIHsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwogCi0JQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZyhzUHJvcE5hbWUpOwotCUNGWF9CeXRlU3RyaW5nIGJzUHJvcGVydHlOYW1lID0gd3MuVVRGOEVuY29kZSgpOworICBDRlhfV2lkZVN0cmluZyB3cyA9IENGWF9XaWRlU3RyaW5nKHNQcm9wTmFtZSk7CisgIENGWF9CeXRlU3RyaW5nIGJzUHJvcGVydHlOYW1lID0gd3MuVVRGOEVuY29kZSgpOwogCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKGdfZW1iZWRkZXJEYXRhU2xvdCk7Ci0JaWYoIXBBcnJheSkgcmV0dXJuIDA7CisgIENGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YShnX2VtYmVkZGVyRGF0YVNsb3QpOworICBpZiAoIXBBcnJheSkKKyAgICByZXR1cm4gMDsKIAotCWlmKG5PYmpEZWZuSUQ8MCB8fCBuT2JqRGVmbklEPj0gcEFycmF5LT5HZXRTaXplKCkpIHJldHVybiAwOwotCUNKU19PYmpEZWZpbnRpb24qIHBPYmpEZWYgPSAoQ0pTX09iakRlZmludGlvbiopcEFycmF5LT5HZXRBdChuT2JqRGVmbklEKTsKLQl2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wID0gdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBwT2JqRGVmLT5tX29ialRlbXBsYXRlKTsKLQlvYmpUZW1wLT5TZXRBY2Nlc3Nvcih2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChpc29sYXRlLCBic1Byb3BlcnR5TmFtZS5jX3N0cigpLCB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCkuVG9Mb2NhbENoZWNrZWQoKSwgcFByb3BHZXQsIHBQcm9wUHV0KTsKLQlwT2JqRGVmLT5tX29ialRlbXBsYXRlLlJlc2V0KGlzb2xhdGUsb2JqVGVtcCk7Ci0JcmV0dXJuIDA7CisgIGlmIChuT2JqRGVmbklEIDwgMCB8fCBuT2JqRGVmbklEID49IHBBcnJheS0+R2V0U2l6ZSgpKQorICAgIHJldHVybiAwOworICBDSlNfT2JqRGVmaW50aW9uKiBwT2JqRGVmID0gKENKU19PYmpEZWZpbnRpb24qKXBBcnJheS0+R2V0QXQobk9iakRlZm5JRCk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IG9ialRlbXAgPQorICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBwT2JqRGVmLT5tX29ialRlbXBsYXRlKTsKKyAgb2JqVGVtcC0+U2V0QWNjZXNzb3Iodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoaXNvbGF0ZSwgYnNQcm9wZXJ0eU5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFByb3BHZXQsIHBQcm9wUHV0KTsKKyAgcE9iakRlZi0+bV9vYmpUZW1wbGF0ZS5SZXNldChpc29sYXRlLCBvYmpUZW1wKTsKKyAgcmV0dXJuIDA7CiB9CiAKLWludAlKU19EZWZpbmVPYmpBbGxQcm9wZXJ0aWVzKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBpbnQgbk9iakRlZm5JRCwgdjg6Ok5hbWVkUHJvcGVydHlRdWVyeUNhbGxiYWNrIHBQcm9wUXVyZXksIHY4OjpOYW1lZFByb3BlcnR5R2V0dGVyQ2FsbGJhY2sgcFByb3BHZXQsIHY4OjpOYW1lZFByb3BlcnR5U2V0dGVyQ2FsbGJhY2sgcFByb3BQdXQsIHY4OjpOYW1lZFByb3BlcnR5RGVsZXRlckNhbGxiYWNrIHBQcm9wRGVsKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOwotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwotCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7CitpbnQgSlNfRGVmaW5lT2JqQWxsUHJvcGVydGllcyhJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuT2JqRGVmbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5hbWVkUHJvcGVydHlRdWVyeUNhbGxiYWNrIHBQcm9wUXVyZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TmFtZWRQcm9wZXJ0eUdldHRlckNhbGxiYWNrIHBQcm9wR2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5hbWVkUHJvcGVydHlTZXR0ZXJDYWxsYmFjayBwUHJvcFB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOYW1lZFByb3BlcnR5RGVsZXRlckNhbGxiYWNrIHBQcm9wRGVsKSB7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKIAotCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YShnX2VtYmVkZGVyRGF0YVNsb3QpOwotCWlmKCFwQXJyYXkpIHJldHVybiAwOworICBDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoZ19lbWJlZGRlckRhdGFTbG90KTsKKyAgaWYgKCFwQXJyYXkpCisgICAgcmV0dXJuIDA7CiAKLQlpZihuT2JqRGVmbklEPDAgfHwgbk9iakRlZm5JRD49IHBBcnJheS0+R2V0U2l6ZSgpKSByZXR1cm4gMDsKLQlDSlNfT2JqRGVmaW50aW9uKiBwT2JqRGVmID0gKENKU19PYmpEZWZpbnRpb24qKXBBcnJheS0+R2V0QXQobk9iakRlZm5JRCk7Ci0Jdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gb2JqVGVtcCA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+OjpOZXcoaXNvbGF0ZSwgcE9iakRlZi0+bV9vYmpUZW1wbGF0ZSk7Ci0Jb2JqVGVtcC0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIocFByb3BHZXQsIHBQcm9wUHV0LCBwUHJvcFF1cmV5LCBwUHJvcERlbCk7Ci0JcE9iakRlZi0+bV9vYmpUZW1wbGF0ZS5SZXNldChpc29sYXRlLG9ialRlbXApOwotCXJldHVybiAwOworICBpZiAobk9iakRlZm5JRCA8IDAgfHwgbk9iakRlZm5JRCA+PSBwQXJyYXktPkdldFNpemUoKSkKKyAgICByZXR1cm4gMDsKKyAgQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KG5PYmpEZWZuSUQpOworICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wID0KKyAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+OjpOZXcoaXNvbGF0ZSwgcE9iakRlZi0+bV9vYmpUZW1wbGF0ZSk7CisgIG9ialRlbXAtPlNldE5hbWVkUHJvcGVydHlIYW5kbGVyKHBQcm9wR2V0LCBwUHJvcFB1dCwgcFByb3BRdXJleSwgcFByb3BEZWwpOworICBwT2JqRGVmLT5tX29ialRlbXBsYXRlLlJlc2V0KGlzb2xhdGUsIG9ialRlbXApOworICByZXR1cm4gMDsKIH0KIAotaW50IEpTX0RlZmluZU9iakNvbnN0KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBpbnQgbk9iakRlZm5JRCwgY29uc3Qgd2NoYXJfdCogc0NvbnN0TmFtZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcERlZmF1bHQpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKK2ludCBKU19EZWZpbmVPYmpDb25zdChJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9iakRlZm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzQ29uc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBEZWZhdWx0KSB7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKIAotCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YShnX2VtYmVkZGVyRGF0YVNsb3QpOwotCWlmKCFwQXJyYXkpIHJldHVybiAwOworICBDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoZ19lbWJlZGRlckRhdGFTbG90KTsKKyAgaWYgKCFwQXJyYXkpCisgICAgcmV0dXJuIDA7CiAKLQlDRlhfV2lkZVN0cmluZyB3cyA9IENGWF9XaWRlU3RyaW5nKHNDb25zdE5hbWUpOwotCUNGWF9CeXRlU3RyaW5nIGJzQ29uc3ROYW1lID0gd3MuVVRGOEVuY29kZSgpOworICBDRlhfV2lkZVN0cmluZyB3cyA9IENGWF9XaWRlU3RyaW5nKHNDb25zdE5hbWUpOworICBDRlhfQnl0ZVN0cmluZyBic0NvbnN0TmFtZSA9IHdzLlVURjhFbmNvZGUoKTsKIAotCWlmKG5PYmpEZWZuSUQ8MCB8fCBuT2JqRGVmbklEPj0gcEFycmF5LT5HZXRTaXplKCkpIHJldHVybiAwOwotCUNKU19PYmpEZWZpbnRpb24qIHBPYmpEZWYgPSAoQ0pTX09iakRlZmludGlvbiopcEFycmF5LT5HZXRBdChuT2JqRGVmbklEKTsKLQl2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wID0gdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBwT2JqRGVmLT5tX29ialRlbXBsYXRlKTsKLQlvYmpUZW1wLT5TZXQoaXNvbGF0ZSwgYnNDb25zdE5hbWUuY19zdHIoKSwgcERlZmF1bHQpOwotCXBPYmpEZWYtPm1fb2JqVGVtcGxhdGUuUmVzZXQoaXNvbGF0ZSxvYmpUZW1wKTsKLQlyZXR1cm4gMDsKKyAgaWYgKG5PYmpEZWZuSUQgPCAwIHx8IG5PYmpEZWZuSUQgPj0gcEFycmF5LT5HZXRTaXplKCkpCisgICAgcmV0dXJuIDA7CisgIENKU19PYmpEZWZpbnRpb24qIHBPYmpEZWYgPSAoQ0pTX09iakRlZmludGlvbiopcEFycmF5LT5HZXRBdChuT2JqRGVmbklEKTsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gb2JqVGVtcCA9CisgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPjo6TmV3KGlzb2xhdGUsIHBPYmpEZWYtPm1fb2JqVGVtcGxhdGUpOworICBvYmpUZW1wLT5TZXQoaXNvbGF0ZSwgYnNDb25zdE5hbWUuY19zdHIoKSwgcERlZmF1bHQpOworICBwT2JqRGVmLT5tX29ialRlbXBsYXRlLlJlc2V0KGlzb2xhdGUsIG9ialRlbXApOworICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHY4OjpHbG9iYWw8djg6Ok9iamVjdFRlbXBsYXRlPiYgX2dldEdsb2JhbE9iamVjdFRlbXBsYXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOwotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwotCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7CitzdGF0aWMgdjg6Okdsb2JhbDx2ODo6T2JqZWN0VGVtcGxhdGU+JiBfZ2V0R2xvYmFsT2JqZWN0VGVtcGxhdGUoCisgICAgSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUpIHsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwogCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKGdfZW1iZWRkZXJEYXRhU2xvdCk7Ci0JQVNTRVJUKHBBcnJheSAhPSBOVUxMKTsKLQlmb3IoaW50IGk9MDsgaTxwQXJyYXktPkdldFNpemUoKTsgaSsrKQotCXsKLQkJQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KGkpOwotCQlpZihwT2JqRGVmLT5tX2JTZXRBc0dsb2JhbE9iamVjdCkKLQkJCXJldHVybiBwT2JqRGVmLT5tX29ialRlbXBsYXRlOwotCX0KLQlzdGF0aWMgdjg6Okdsb2JhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGdsb2FiYWxPYmplY3RUZW1wbGF0ZTsKLQlyZXR1cm4gZ2xvYWJhbE9iamVjdFRlbXBsYXRlOworICBDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoZ19lbWJlZGRlckRhdGFTbG90KTsKKyAgQVNTRVJUKHBBcnJheSAhPSBOVUxMKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwQXJyYXktPkdldFNpemUoKTsgaSsrKSB7CisgICAgQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KGkpOworICAgIGlmIChwT2JqRGVmLT5tX2JTZXRBc0dsb2JhbE9iamVjdCkKKyAgICAgIHJldHVybiBwT2JqRGVmLT5tX29ialRlbXBsYXRlOworICB9CisgIHN0YXRpYyB2ODo6R2xvYmFsPHY4OjpPYmplY3RUZW1wbGF0ZT4gZ2xvYWJhbE9iamVjdFRlbXBsYXRlOworICByZXR1cm4gZ2xvYWJhbE9iamVjdFRlbXBsYXRlOwogfQogCi1pbnQgSlNfRGVmaW5lR2xvYmFsTWV0aG9kKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBjb25zdCB3Y2hhcl90KiBzTWV0aG9kTmFtZSwgdjg6OkZ1bmN0aW9uQ2FsbGJhY2sgcE1ldGhvZENhbGwpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKK2ludCBKU19EZWZpbmVHbG9iYWxNZXRob2QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNNZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb25DYWxsYmFjayBwTWV0aG9kQ2FsbCkgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7CiAKLQlDRlhfV2lkZVN0cmluZyB3cyA9IENGWF9XaWRlU3RyaW5nKHNNZXRob2ROYW1lKTsKLQlDRlhfQnl0ZVN0cmluZyBic01ldGhvZE5hbWUgPSB3cy5VVEY4RW5jb2RlKCk7CisgIENGWF9XaWRlU3RyaW5nIHdzID0gQ0ZYX1dpZGVTdHJpbmcoc01ldGhvZE5hbWUpOworICBDRlhfQnl0ZVN0cmluZyBic01ldGhvZE5hbWUgPSB3cy5VVEY4RW5jb2RlKCk7CiAKLQl2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGZ1blRlbXBsID0gdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhpc29sYXRlLCBwTWV0aG9kQ2FsbCk7Ci0Jdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gb2JqVGVtcDsKKyAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBmdW5UZW1wbCA9CisgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KGlzb2xhdGUsIHBNZXRob2RDYWxsKTsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gb2JqVGVtcDsKIAotCXY4OjpHbG9iYWw8djg6Ok9iamVjdFRlbXBsYXRlPiYgZ2xvYmFsT2JqVGVtcCA9IF9nZXRHbG9iYWxPYmplY3RUZW1wbGF0ZShwSlNSdW50aW1lKTsKLQlpZihnbG9iYWxPYmpUZW1wLklzRW1wdHkoKSkKLQkJb2JqVGVtcCA9IHY4OjpPYmplY3RUZW1wbGF0ZTo6TmV3KGlzb2xhdGUpOwotCWVsc2UKLQkJb2JqVGVtcCA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+OjpOZXcoaXNvbGF0ZSwgZ2xvYmFsT2JqVGVtcCk7Ci0Jb2JqVGVtcC0+U2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsIGJzTWV0aG9kTmFtZS5jX3N0cigpLCB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCkuVG9Mb2NhbENoZWNrZWQoKSwgZnVuVGVtcGwsIHY4OjpSZWFkT25seSk7CisgIHY4OjpHbG9iYWw8djg6Ok9iamVjdFRlbXBsYXRlPiYgZ2xvYmFsT2JqVGVtcCA9CisgICAgICBfZ2V0R2xvYmFsT2JqZWN0VGVtcGxhdGUocEpTUnVudGltZSk7CisgIGlmIChnbG9iYWxPYmpUZW1wLklzRW1wdHkoKSkKKyAgICBvYmpUZW1wID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoaXNvbGF0ZSk7CisgIGVsc2UKKyAgICBvYmpUZW1wID0gdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBnbG9iYWxPYmpUZW1wKTsKKyAgb2JqVGVtcC0+U2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsIGJzTWV0aG9kTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCksCisgICAgICAgICAgICAgICBmdW5UZW1wbCwgdjg6OlJlYWRPbmx5KTsKIAotCWdsb2JhbE9ialRlbXAuUmVzZXQoaXNvbGF0ZSxvYmpUZW1wKTsKKyAgZ2xvYmFsT2JqVGVtcC5SZXNldChpc29sYXRlLCBvYmpUZW1wKTsKIAotCXJldHVybiAwOworICByZXR1cm4gMDsKIH0KIAotaW50IEpTX0RlZmluZUdsb2JhbENvbnN0KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBjb25zdCB3Y2hhcl90KiBzQ29uc3ROYW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwRGVmYXVsdCkKLXsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKLQl2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOworaW50IEpTX0RlZmluZUdsb2JhbENvbnN0KElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNDb25zdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcERlZmF1bHQpIHsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwogCi0JQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZyhzQ29uc3ROYW1lKTsKLQlDRlhfQnl0ZVN0cmluZyBic0NvbnN0PSB3cy5VVEY4RW5jb2RlKCk7CisgIENGWF9XaWRlU3RyaW5nIHdzID0gQ0ZYX1dpZGVTdHJpbmcoc0NvbnN0TmFtZSk7CisgIENGWF9CeXRlU3RyaW5nIGJzQ29uc3QgPSB3cy5VVEY4RW5jb2RlKCk7CiAKLQl2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wOworICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wOwogCi0Jdjg6Okdsb2JhbDx2ODo6T2JqZWN0VGVtcGxhdGU+JiBnbG9iYWxPYmpUZW1wID0gX2dldEdsb2JhbE9iamVjdFRlbXBsYXRlKHBKU1J1bnRpbWUpOwotCWlmKGdsb2JhbE9ialRlbXAuSXNFbXB0eSgpKQotCQlvYmpUZW1wID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoaXNvbGF0ZSk7Ci0JZWxzZQotCQlvYmpUZW1wID0gdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBnbG9iYWxPYmpUZW1wKTsKLQlvYmpUZW1wLT5TZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoaXNvbGF0ZSwgYnNDb25zdC5jX3N0cigpLCB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCkuVG9Mb2NhbENoZWNrZWQoKSwgcERlZmF1bHQsIHY4OjpSZWFkT25seSk7CisgIHY4OjpHbG9iYWw8djg6Ok9iamVjdFRlbXBsYXRlPiYgZ2xvYmFsT2JqVGVtcCA9CisgICAgICBfZ2V0R2xvYmFsT2JqZWN0VGVtcGxhdGUocEpTUnVudGltZSk7CisgIGlmIChnbG9iYWxPYmpUZW1wLklzRW1wdHkoKSkKKyAgICBvYmpUZW1wID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoaXNvbGF0ZSk7CisgIGVsc2UKKyAgICBvYmpUZW1wID0gdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBnbG9iYWxPYmpUZW1wKTsKKyAgb2JqVGVtcC0+U2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsIGJzQ29uc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKQorICAgICAgICAgICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpLAorICAgICAgICAgICAgICAgcERlZmF1bHQsIHY4OjpSZWFkT25seSk7CiAKLQlnbG9iYWxPYmpUZW1wLlJlc2V0KGlzb2xhdGUsb2JqVGVtcCk7CisgIGdsb2JhbE9ialRlbXAuUmVzZXQoaXNvbGF0ZSwgb2JqVGVtcCk7CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9CiAKK3ZvaWQgSlNfSW5pdGlhbFJ1bnRpbWUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIElGWEpTX1J1bnRpbWUqIHBGWFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIElGWEpTX0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIHY4OjpHbG9iYWw8djg6OkNvbnRleHQ+JiB2OFBlcnNpc3RlbnRDb250ZXh0KSB7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKKyAgdjg6OkxvY2tlciBsb2NrZXIoaXNvbGF0ZSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7CiAKLXZvaWQgSlNfSW5pdGlhbFJ1bnRpbWUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsSUZYSlNfUnVudGltZSogcEZYUnVudGltZSwgSUZYSlNfQ29udGV4dCogY29udGV4dCwgdjg6Okdsb2JhbDx2ODo6Q29udGV4dD4mIHY4UGVyc2lzdGVudENvbnRleHQpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OkxvY2tlciBsb2NrZXIoaXNvbGF0ZSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKKyAgdjg6Okdsb2JhbDx2ODo6T2JqZWN0VGVtcGxhdGU+JiBnbG9iYWxPYmpUZW1wID0KKyAgICAgIF9nZXRHbG9iYWxPYmplY3RUZW1wbGF0ZShwSlNSdW50aW1lKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSB2ODo6Q29udGV4dDo6TmV3KAorICAgICAgaXNvbGF0ZSwgTlVMTCwKKyAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+OjpOZXcoaXNvbGF0ZSwgZ2xvYmFsT2JqVGVtcCkpOworICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZSh2OENvbnRleHQpOwogCi0Jdjg6Okdsb2JhbDx2ODo6T2JqZWN0VGVtcGxhdGU+JiBnbG9iYWxPYmpUZW1wID0gX2dldEdsb2JhbE9iamVjdFRlbXBsYXRlKHBKU1J1bnRpbWUpOwotCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gdjhDb250ZXh0ID0gdjg6OkNvbnRleHQ6Ok5ldyhpc29sYXRlLCBOVUxMLCB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPjo6TmV3KGlzb2xhdGUsIGdsb2JhbE9ialRlbXApKTsKLQl2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZSh2OENvbnRleHQpOworICAvLyB2ODo6TG9jYWw8RXh0ZXJuYWw+IHB0ciA9IEV4dGVybmFsOjpOZXcoaXNvbGF0ZSwgcEZYUnVudGltZSk7CisgIC8vIHY4Q29udGV4dC0+U2V0RW1iZWRkZXJEYXRhKDEsIHB0cik7CisgIC8vIFRPRE8odHNlcGV6KTogRG9uJ3QgdXNlIG1vcmUgdGhhbiBvbmUgZW1iZWRkZXIgZGF0YSBzbG90LgorICBpc29sYXRlLT5TZXREYXRhKDIsIHBGWFJ1bnRpbWUpOwogCi0JLy92ODo6TG9jYWw8RXh0ZXJuYWw+IHB0ciA9IEV4dGVybmFsOjpOZXcoaXNvbGF0ZSwgcEZYUnVudGltZSk7Ci0JLy92OENvbnRleHQtPlNldEVtYmVkZGVyRGF0YSgxLCBwdHIpOwotCS8vIFRPRE8odHNlcGV6KTogRG9uJ3QgdXNlIG1vcmUgdGhhbiBvbmUgZW1iZWRkZXIgZGF0YSBzbG90LgotCWlzb2xhdGUtPlNldERhdGEoMiwgcEZYUnVudGltZSk7CisgIENGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YShnX2VtYmVkZGVyRGF0YVNsb3QpOworICBpZiAoIXBBcnJheSkKKyAgICByZXR1cm47CiAKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoZ19lbWJlZGRlckRhdGFTbG90KTsKLQlpZighcEFycmF5KSByZXR1cm47CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcEFycmF5LT5HZXRTaXplKCk7IGkrKykgeworICAgIENKU19PYmpEZWZpbnRpb24qIHBPYmpEZWYgPSAoQ0pTX09iakRlZmludGlvbiopcEFycmF5LT5HZXRBdChpKTsKKyAgICBDRlhfV2lkZVN0cmluZyB3cyA9IENGWF9XaWRlU3RyaW5nKHBPYmpEZWYtPm9iak5hbWUpOworICAgIENGWF9CeXRlU3RyaW5nIGJzID0gd3MuVVRGOEVuY29kZSgpOworICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBvYmpOYW1lID0KKyAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoaXNvbGF0ZSwgYnMuY19zdHIoKSwgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzLkdldExlbmd0aCgpKQorICAgICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCk7CiAKLQlmb3IoaW50IGk9MDsgaTxwQXJyYXktPkdldFNpemUoKTsgaSsrKQotCXsKLQkJQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KGkpOwotCQlDRlhfV2lkZVN0cmluZyB3cyA9IENGWF9XaWRlU3RyaW5nKHBPYmpEZWYtPm9iak5hbWUpOwotCQlDRlhfQnl0ZVN0cmluZyBicyA9IHdzLlVURjhFbmNvZGUoKTsKLQkJdjg6OkxvY2FsPHY4OjpTdHJpbmc+IG9iak5hbWUgPSB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChpc29sYXRlLCBicy5jX3N0cigpLCB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCwgYnMuR2V0TGVuZ3RoKCkpLlRvTG9jYWxDaGVja2VkKCk7CisgICAgaWYgKHBPYmpEZWYtPm9ialR5cGUgPT0gSlNfRFlOQU1JQykgeworICAgICAgLy8gRG9jdW1lbnQgaXMgc2V0IGFzIGdsb2JhbCBvYmplY3QsIG5lZWQgdG8gY29uc3RydWN0IGl0IGZpcnN0LgorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTdHJpbmcoTCJEb2N1bWVudCIpOworICAgICAgaWYgKHdzLkVxdWFsKHdzU3RyaW5nKSkgeworICAgICAgICBDSlNfUHJpdmF0ZURhdGEqIHBQcml2YXRlRGF0YSA9IEZYX05FVyBDSlNfUHJpdmF0ZURhdGE7CisgICAgICAgIHBQcml2YXRlRGF0YS0+T2JqRGVmSUQgPSBpOwogCisgICAgICAgIHY4Q29udGV4dC0+R2xvYmFsKCkKKyAgICAgICAgICAgIC0+R2V0UHJvdG90eXBlKCkKKyAgICAgICAgICAgIC0+VG9PYmplY3QodjhDb250ZXh0KQorICAgICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCkKKyAgICAgICAgICAgIC0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgcFByaXZhdGVEYXRhKTsKIAotCQlpZihwT2JqRGVmLT5vYmpUeXBlID09IEpTX0RZTkFNSUMpCi0JCXsKLQkJCS8vRG9jdW1lbnQgaXMgc2V0IGFzIGdsb2JhbCBvYmplY3QsIG5lZWQgdG8gY29uc3RydWN0IGl0IGZpcnN0LgotCQkJQ0ZYX1dpZGVTdHJpbmcgd3NTdHJpbmcoTCJEb2N1bWVudCIpOwotCQkJaWYod3MuRXF1YWwod3NTdHJpbmcpKQotCQkJewotCi0JCQkJQ0pTX1ByaXZhdGVEYXRhKiBwUHJpdmF0ZURhdGEgPSBGWF9ORVcgQ0pTX1ByaXZhdGVEYXRhOwotCQkJCXBQcml2YXRlRGF0YS0+T2JqRGVmSUQgPSBpOwotCi0JCQkJdjhDb250ZXh0LT5HbG9iYWwoKS0+R2V0UHJvdG90eXBlKCktPlRvT2JqZWN0KHY4Q29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKS0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgcFByaXZhdGVEYXRhKTsKLQotCQkJCWlmKHBPYmpEZWYtPm1fcENvbnN0cnVjdG9yKQotCQkJCQlwT2JqRGVmLT5tX3BDb25zdHJ1Y3Rvcihjb250ZXh0LCB2OENvbnRleHQtPkdsb2JhbCgpLT5HZXRQcm90b3R5cGUoKS0+VG9PYmplY3QodjhDb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLCB2OENvbnRleHQtPkdsb2JhbCgpLT5HZXRQcm90b3R5cGUoKS0+VG9PYmplY3QodjhDb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmogPSBKU19OZXdGeER5bmFtaWNPYmoocEpTUnVudGltZSwgY29udGV4dCwgaSk7Ci0JCQl2OENvbnRleHQtPkdsb2JhbCgpLT5TZXQodjhDb250ZXh0LCBvYmpOYW1lLCBvYmopLkZyb21KdXN0KCk7Ci0JCQlwT2JqRGVmLT5tX1N0YXRpY09iai5SZXNldChpc29sYXRlLCBvYmopOwotCQl9Ci0JfQotCXY4UGVyc2lzdGVudENvbnRleHQuUmVzZXQoaXNvbGF0ZSwgdjhDb250ZXh0KTsKKyAgICAgICAgaWYgKHBPYmpEZWYtPm1fcENvbnN0cnVjdG9yKQorICAgICAgICAgIHBPYmpEZWYtPm1fcENvbnN0cnVjdG9yKGNvbnRleHQsIHY4Q29udGV4dC0+R2xvYmFsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRQcm90b3R5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRvT2JqZWN0KHY4Q29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjhDb250ZXh0LT5HbG9iYWwoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFByb3RvdHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VG9PYmplY3QodjhDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmogPSBKU19OZXdGeER5bmFtaWNPYmoocEpTUnVudGltZSwgY29udGV4dCwgaSk7CisgICAgICB2OENvbnRleHQtPkdsb2JhbCgpLT5TZXQodjhDb250ZXh0LCBvYmpOYW1lLCBvYmopLkZyb21KdXN0KCk7CisgICAgICBwT2JqRGVmLT5tX1N0YXRpY09iai5SZXNldChpc29sYXRlLCBvYmopOworICAgIH0KKyAgfQorICB2OFBlcnNpc3RlbnRDb250ZXh0LlJlc2V0KGlzb2xhdGUsIHY4Q29udGV4dCk7CiB9CiAKLXZvaWQgSlNfUmVsZWFzZVJ1bnRpbWUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpHbG9iYWw8djg6OkNvbnRleHQ+JiB2OFBlcnNpc3RlbnRDb250ZXh0KQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOwotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwotCXY4OjpMb2NrZXIgbG9ja2VyKGlzb2xhdGUpOwotCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7Cit2b2lkIEpTX1JlbGVhc2VSdW50aW1lKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiYgdjhQZXJzaXN0ZW50Q29udGV4dCkgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CisgIHY4OjpMb2NrZXIgbG9ja2VyKGlzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwogCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKGdfZW1iZWRkZXJEYXRhU2xvdCk7Ci0JaWYoIXBBcnJheSkgcmV0dXJuIDsKKyAgQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKGdfZW1iZWRkZXJEYXRhU2xvdCk7CisgIGlmICghcEFycmF5KQorICAgIHJldHVybjsKIAotCWZvcihpbnQgaT0wOyBpPHBBcnJheS0+R2V0U2l6ZSgpOyBpKyspCi0JewotCQlDSlNfT2JqRGVmaW50aW9uKiBwT2JqRGVmID0gKENKU19PYmpEZWZpbnRpb24qKXBBcnJheS0+R2V0QXQoaSk7Ci0JCWlmKCFwT2JqRGVmLT5tX1N0YXRpY09iai5Jc0VtcHR5KCkpCi0JCXsKLQkJCXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcoaXNvbGF0ZSwgcE9iakRlZi0+bV9TdGF0aWNPYmopOwotCQkJaWYocE9iakRlZi0+bV9wRGVzdHJ1Y3RvcikKLQkJCQlwT2JqRGVmLT5tX3BEZXN0cnVjdG9yKHBPYmopOwotCQkJSlNfRnJlZVByaXZhdGUocE9iaik7Ci0JCX0KLQkJZGVsZXRlIHBPYmpEZWY7Ci0JfQotCWRlbGV0ZSBwQXJyYXk7Ci0JaXNvbGF0ZS0+U2V0RGF0YSgxLE5VTEwpOwotCWlzb2xhdGUtPlNldERhdGEoZ19lbWJlZGRlckRhdGFTbG90LE5VTEwpOwotCS8vIFRPRE8odHNlcGV6KTogRG9uJ3QgdXNlIG1vcmUgdGhhbiBvbmUgZW1iZWRkZXIgZGF0YSBzbG90LgotCWlzb2xhdGUtPlNldERhdGEoMixOVUxMKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwQXJyYXktPkdldFNpemUoKTsgaSsrKSB7CisgICAgQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KGkpOworICAgIGlmICghcE9iakRlZi0+bV9TdGF0aWNPYmouSXNFbXB0eSgpKSB7CisgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9CisgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcoaXNvbGF0ZSwgcE9iakRlZi0+bV9TdGF0aWNPYmopOworICAgICAgaWYgKHBPYmpEZWYtPm1fcERlc3RydWN0b3IpCisgICAgICAgIHBPYmpEZWYtPm1fcERlc3RydWN0b3IocE9iaik7CisgICAgICBKU19GcmVlUHJpdmF0ZShwT2JqKTsKKyAgICB9CisgICAgZGVsZXRlIHBPYmpEZWY7CisgIH0KKyAgZGVsZXRlIHBBcnJheTsKKyAgaXNvbGF0ZS0+U2V0RGF0YSgxLCBOVUxMKTsKKyAgaXNvbGF0ZS0+U2V0RGF0YShnX2VtYmVkZGVyRGF0YVNsb3QsIE5VTEwpOworICAvLyBUT0RPKHRzZXBleik6IERvbid0IHVzZSBtb3JlIHRoYW4gb25lIGVtYmVkZGVyIGRhdGEgc2xvdC4KKyAgaXNvbGF0ZS0+U2V0RGF0YSgyLCBOVUxMKTsKIH0KIAotdm9pZCBKU19Jbml0aWFsKHVuc2lnbmVkIGludCBlbWJlZGRlckRhdGFTbG90KQotewotCWdfZW1iZWRkZXJEYXRhU2xvdCA9IGVtYmVkZGVyRGF0YVNsb3Q7Cit2b2lkIEpTX0luaXRpYWwodW5zaWduZWQgaW50IGVtYmVkZGVyRGF0YVNsb3QpIHsKKyAgZ19lbWJlZGRlckRhdGFTbG90ID0gZW1iZWRkZXJEYXRhU2xvdDsKIH0KLXZvaWQgSlNfUmVsZWFzZSgpCi17Cit2b2lkIEpTX1JlbGVhc2UoKSB7fQoraW50IEpTX1BhcnNlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgIElGWEpTX0NvbnRleHQqIHBKU0NvbnRleHQsCisgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc2NyaXB0LAorICAgICAgICAgICAgIGxvbmcgbGVuZ3RoLAorICAgICAgICAgICAgIEZYSlNFcnIqIHBlcnJvcikgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CisgIHY4OjpUcnlDYXRjaCB0cnlfY2F0Y2goaXNvbGF0ZSk7CiAKLX0KLWludCBKU19QYXJzZShJSlNfUnVudGltZSogcEpTUnVudGltZSwgSUZYSlNfQ29udGV4dCogcEpTQ29udGV4dCwgY29uc3Qgd2NoYXJfdCogc2NyaXB0LCBsb25nIGxlbmd0aCwgRlhKU0VyciogcGVycm9yKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOwotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwotCXY4OjpUcnlDYXRjaCB0cnlfY2F0Y2goaXNvbGF0ZSk7CisgIENGWF9XaWRlU3RyaW5nIHdzU2NyaXB0KHNjcmlwdCk7CisgIENGWF9CeXRlU3RyaW5nIGJzU2NyaXB0ID0gd3NTY3JpcHQuVVRGOEVuY29kZSgpOwogCi0JQ0ZYX1dpZGVTdHJpbmcgd3NTY3JpcHQoc2NyaXB0KTsKLQlDRlhfQnl0ZVN0cmluZyBic1NjcmlwdCA9IHdzU2NyaXB0LlVURjhFbmNvZGUoKTsKLQotCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0Jdjg6OkxvY2FsPHY4OjpTY3JpcHQ+IGNvbXBpbGVkX3NjcmlwdDsKLSAgICAgICAgaWYgKCF2ODo6U2NyaXB0OjpDb21waWxlKGNvbnRleHQsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsIGJzU2NyaXB0LmNfc3RyKCksIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsLCBic1NjcmlwdC5HZXRMZW5ndGgoKSkuVG9Mb2NhbENoZWNrZWQoKSkuVG9Mb2NhbCgmY29tcGlsZWRfc2NyaXB0KSkgewotCQl2ODo6U3RyaW5nOjpVdGY4VmFsdWUgZXJyb3IodHJ5X2NhdGNoLkV4Y2VwdGlvbigpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gaXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgdjg6OkxvY2FsPHY4OjpTY3JpcHQ+IGNvbXBpbGVkX3NjcmlwdDsKKyAgaWYgKCF2ODo6U2NyaXB0OjpDb21waWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChpc29sYXRlLCBic1NjcmlwdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic1NjcmlwdC5HZXRMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKSkKKyAgICAgICAgICAgLlRvTG9jYWwoJmNvbXBpbGVkX3NjcmlwdCkpIHsKKyAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgZXJyb3IodHJ5X2NhdGNoLkV4Y2VwdGlvbigpKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7CiB9CiAKLWludCBKU19FeGVjdXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBJRlhKU19Db250ZXh0KiBwSlNDb250ZXh0LCBjb25zdCB3Y2hhcl90KiBzY3JpcHQsIGxvbmcgbGVuZ3RoLCBGWEpTRXJyKiBwZXJyb3IpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OlRyeUNhdGNoIHRyeV9jYXRjaChpc29sYXRlKTsKK2ludCBKU19FeGVjdXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgSUZYSlNfQ29udGV4dCogcEpTQ29udGV4dCwKKyAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNjcmlwdCwKKyAgICAgICAgICAgICAgIGxvbmcgbGVuZ3RoLAorICAgICAgICAgICAgICAgRlhKU0VyciogcGVycm9yKSB7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKKyAgdjg6OlRyeUNhdGNoIHRyeV9jYXRjaChpc29sYXRlKTsKIAotCUNGWF9XaWRlU3RyaW5nIHdzU2NyaXB0KHNjcmlwdCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgYnNTY3JpcHQgPSB3c1NjcmlwdC5VVEY4RW5jb2RlKCk7CisgIENGWF9XaWRlU3RyaW5nIHdzU2NyaXB0KHNjcmlwdCk7CisgIENGWF9CeXRlU3RyaW5nIGJzU2NyaXB0ID0gd3NTY3JpcHQuVVRGOEVuY29kZSgpOwogCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6U2NyaXB0PiBjb21waWxlZF9zY3JpcHQ7Ci0gICAgICAgIGlmICghdjg6OlNjcmlwdDo6Q29tcGlsZShjb250ZXh0LCB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChpc29sYXRlLCBic1NjcmlwdC5jX3N0cigpLCB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCwgYnNTY3JpcHQuR2V0TGVuZ3RoKCkpLlRvTG9jYWxDaGVja2VkKCkpLlRvTG9jYWwoJmNvbXBpbGVkX3NjcmlwdCkpIHsKLQkJdjg6OlN0cmluZzo6VXRmOFZhbHVlIGVycm9yKHRyeV9jYXRjaC5FeGNlcHRpb24oKSk7Ci0JCXJldHVybiAtMTsKLQl9CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIHY4OjpMb2NhbDx2ODo6U2NyaXB0PiBjb21waWxlZF9zY3JpcHQ7CisgIGlmICghdjg6OlNjcmlwdDo6Q29tcGlsZShjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoaXNvbGF0ZSwgYnNTY3JpcHQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNTY3JpcHQuR2V0TGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCkpCisgICAgICAgICAgIC5Ub0xvY2FsKCZjb21waWxlZF9zY3JpcHQpKSB7CisgICAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIGVycm9yKHRyeV9jYXRjaC5FeGNlcHRpb24oKSk7CisgICAgcmV0dXJuIC0xOworICB9CiAKLQl2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQ7Ci0gICAgICAgIGlmICghY29tcGlsZWRfc2NyaXB0LT5SdW4oY29udGV4dCkuVG9Mb2NhbCgmcmVzdWx0KSkgewotCQl2ODo6U3RyaW5nOjpVdGY4VmFsdWUgZXJyb3IodHJ5X2NhdGNoLkV4Y2VwdGlvbigpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0OworICBpZiAoIWNvbXBpbGVkX3NjcmlwdC0+UnVuKGNvbnRleHQpLlRvTG9jYWwoJnJlc3VsdCkpIHsKKyAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgZXJyb3IodHJ5X2NhdGNoLkV4Y2VwdGlvbigpKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7CiB9CiAKLXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBKU19OZXdGeER5bmFtaWNPYmooSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIElGWEpTX0NvbnRleHQqIHBKU0NvbnRleHQsIGludCBuT2JqRGVmbklEKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOwotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwotICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwotCWlmKC0xID09IG5PYmpEZWZuSUQpCi0JewotCQl2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wbCA9IHY4OjpPYmplY3RUZW1wbGF0ZTo6TmV3KGlzb2xhdGUpOwotICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmo7Ci0gICAgICAgICAgICAgICAgaWYgKG9ialRlbXBsLT5OZXdJbnN0YW5jZShjb250ZXh0KS5Ub0xvY2FsKCZvYmopKSByZXR1cm4gb2JqOwotICAgICAgICAgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKLQl9Cit2ODo6TG9jYWw8djg6Ok9iamVjdD4gSlNfTmV3RnhEeW5hbWljT2JqKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhKU19Db250ZXh0KiBwSlNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9iakRlZm5JRCkgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIGlmICgtMSA9PSBuT2JqRGVmbklEKSB7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gb2JqVGVtcGwgPSB2ODo6T2JqZWN0VGVtcGxhdGU6Ok5ldyhpc29sYXRlKTsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqOworICAgIGlmIChvYmpUZW1wbC0+TmV3SW5zdGFuY2UoY29udGV4dCkuVG9Mb2NhbCgmb2JqKSkKKyAgICAgIHJldHVybiBvYmo7CisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOworICB9CiAKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoZ19lbWJlZGRlckRhdGFTbG90KTsKLQlpZighcEFycmF5KSByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCk7CisgIENGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YShnX2VtYmVkZGVyRGF0YVNsb3QpOworICBpZiAoIXBBcnJheSkKKyAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCk7CiAKKyAgaWYgKG5PYmpEZWZuSUQgPCAwIHx8IG5PYmpEZWZuSUQgPj0gcEFycmF5LT5HZXRTaXplKCkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOworICBDSlNfT2JqRGVmaW50aW9uKiBwT2JqRGVmID0gKENKU19PYmpEZWZpbnRpb24qKXBBcnJheS0+R2V0QXQobk9iakRlZm5JRCk7CiAKLQlpZihuT2JqRGVmbklEPDAgfHwgbk9iakRlZm5JRD49IHBBcnJheS0+R2V0U2l6ZSgpKSByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCk7Ci0JQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KG5PYmpEZWZuSUQpOworICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wID0KKyAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+OjpOZXcoaXNvbGF0ZSwgcE9iakRlZi0+bV9vYmpUZW1wbGF0ZSk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmo7CisgIGlmICghb2JqVGVtcC0+TmV3SW5zdGFuY2UoY29udGV4dCkuVG9Mb2NhbCgmb2JqKSkKKyAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCk7CisgIENKU19Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0gRlhfTkVXIENKU19Qcml2YXRlRGF0YTsKKyAgcFByaXZhdGVEYXRhLT5PYmpEZWZJRCA9IG5PYmpEZWZuSUQ7CiAKLQl2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wID0gdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBwT2JqRGVmLT5tX29ialRlbXBsYXRlKTsKLQl2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqOwotICAgICAgICBpZiAoIW9ialRlbXAtPk5ld0luc3RhbmNlKGNvbnRleHQpLlRvTG9jYWwoJm9iaikpIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKLQlDSlNfUHJpdmF0ZURhdGEqIHBQcml2YXRlRGF0YSA9IEZYX05FVyBDSlNfUHJpdmF0ZURhdGE7Ci0JcFByaXZhdGVEYXRhLT5PYmpEZWZJRCA9IG5PYmpEZWZuSUQ7CisgIG9iai0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgcFByaXZhdGVEYXRhKTsKKyAgaWYgKHBPYmpEZWYtPm1fcENvbnN0cnVjdG9yKQorICAgIHBPYmpEZWYtPm1fcENvbnN0cnVjdG9yKAorICAgICAgICBwSlNDb250ZXh0LCBvYmosCisgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5HZXRQcm90b3R5cGUoKS0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKSk7CiAKLQlvYmotPlNldEFsaWduZWRQb2ludGVySW5JbnRlcm5hbEZpZWxkKDAsIHBQcml2YXRlRGF0YSk7Ci0JaWYocE9iakRlZi0+bV9wQ29uc3RydWN0b3IpCi0JCXBPYmpEZWYtPm1fcENvbnN0cnVjdG9yKHBKU0NvbnRleHQsIG9iaiwgY29udGV4dC0+R2xvYmFsKCktPkdldFByb3RvdHlwZSgpLT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpKTsKLQotCXJldHVybiBvYmo7CisgIHJldHVybiBvYmo7CiB9CiAKLXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBKU19HZXRTdGF0aWNPYmooSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuT2JqRGVmbklEKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOwotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwordjg6OkxvY2FsPHY4OjpPYmplY3Q+IEpTX0dldFN0YXRpY09iaihJSlNfUnVudGltZSogcEpTUnVudGltZSwgaW50IG5PYmpEZWZuSUQpIHsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwogCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKGdfZW1iZWRkZXJEYXRhU2xvdCk7Ci0JaWYoIXBBcnJheSkgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOworICBDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoZ19lbWJlZGRlckRhdGFTbG90KTsKKyAgaWYgKCFwQXJyYXkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOwogCi0JaWYobk9iakRlZm5JRDwwIHx8IG5PYmpEZWZuSUQ+PSBwQXJyYXktPkdldFNpemUoKSkgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOwotCUNKU19PYmpEZWZpbnRpb24qIHBPYmpEZWYgPSAoQ0pTX09iakRlZmludGlvbiopcEFycmF5LT5HZXRBdChuT2JqRGVmbklEKTsKLQl2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqID0gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcoaXNvbGF0ZSxwT2JqRGVmLT5tX1N0YXRpY09iaik7Ci0JcmV0dXJuIG9iajsKKyAgaWYgKG5PYmpEZWZuSUQgPCAwIHx8IG5PYmpEZWZuSUQgPj0gcEFycmF5LT5HZXRTaXplKCkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOworICBDSlNfT2JqRGVmaW50aW9uKiBwT2JqRGVmID0gKENKU19PYmpEZWZpbnRpb24qKXBBcnJheS0+R2V0QXQobk9iakRlZm5JRCk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmogPQorICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcoaXNvbGF0ZSwgcE9iakRlZi0+bV9TdGF0aWNPYmopOworICByZXR1cm4gb2JqOwogfQogCi12b2lkIEpTX1NldFRoaXNPYmooSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuVGhpc09iaklEKQotewotCS8vRG8gbm90aGluZy4KK3ZvaWQgSlNfU2V0VGhpc09iaihJSlNfUnVudGltZSogcEpTUnVudGltZSwgaW50IG5UaGlzT2JqSUQpIHsKKyAgLy8gRG8gbm90aGluZy4KIH0KLXY4OjpMb2NhbDx2ODo6T2JqZWN0PglKU19HZXRUaGlzT2JqKElKU19SdW50aW1lICogcEpTUnVudGltZSkKLXsKLQkvL1JldHVybiB0aGUgZ2xvYmFsIG9iamVjdC4KLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKK3Y4OjpMb2NhbDx2ODo6T2JqZWN0PiBKU19HZXRUaGlzT2JqKElKU19SdW50aW1lKiBwSlNSdW50aW1lKSB7CisgIC8vIFJldHVybiB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwogCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKGdfZW1iZWRkZXJEYXRhU2xvdCk7Ci0JaWYoIXBBcnJheSkgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOworICBDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoZ19lbWJlZGRlckRhdGFTbG90KTsKKyAgaWYgKCFwQXJyYXkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOwogCi0Jdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gaXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLQlyZXR1cm4gY29udGV4dC0+R2xvYmFsKCktPkdldFByb3RvdHlwZSgpLT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICByZXR1cm4gY29udGV4dC0+R2xvYmFsKCktPkdldFByb3RvdHlwZSgpLT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpOwogfQogCi1pbnQJSlNfR2V0T2JqRGVmbklEKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKQotewotCWlmKHBPYmouSXNFbXB0eSgpIHx8ICFwT2JqLT5JbnRlcm5hbEZpZWxkQ291bnQoKSkgcmV0dXJuIC0xOwotCUNKU19Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0gKENKU19Qcml2YXRlRGF0YSopcE9iai0+R2V0QWxpZ25lZFBvaW50ZXJGcm9tSW50ZXJuYWxGaWVsZCgwKTsKLQlpZihwUHJpdmF0ZURhdGEpCi0JCXJldHVybiBwUHJpdmF0ZURhdGEtPk9iakRlZklEOwotCXJldHVybiAtMTsKK2ludCBKU19HZXRPYmpEZWZuSUQodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpIHx8ICFwT2JqLT5JbnRlcm5hbEZpZWxkQ291bnQoKSkKKyAgICByZXR1cm4gLTE7CisgIENKU19Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0KKyAgICAgIChDSlNfUHJpdmF0ZURhdGEqKXBPYmotPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCk7CisgIGlmIChwUHJpdmF0ZURhdGEpCisgICAgcmV0dXJuIHBQcml2YXRlRGF0YS0+T2JqRGVmSUQ7CisgIHJldHVybiAtMTsKIH0KIAotSUpTX1J1bnRpbWUqIEpTX0dldFJ1bnRpbWUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopCi17Ci0JaWYocE9iai5Jc0VtcHR5KCkpIHJldHVybiBOVUxMOwotCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBPYmotPkNyZWF0aW9uQ29udGV4dCgpOwotCWlmKGNvbnRleHQuSXNFbXB0eSgpKSByZXR1cm4gTlVMTDsKLQlyZXR1cm4gY29udGV4dC0+R2V0SXNvbGF0ZSgpOworSUpTX1J1bnRpbWUqIEpTX0dldFJ1bnRpbWUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiBOVUxMOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwT2JqLT5DcmVhdGlvbkNvbnRleHQoKTsKKyAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gY29udGV4dC0+R2V0SXNvbGF0ZSgpOwogfQogCi1pbnQgSlNfR2V0T2JqRGVmbklEKElKU19SdW50aW1lICogcEpTUnVudGltZSwgY29uc3Qgd2NoYXJfdCogcE9iak5hbWUpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CitpbnQgSlNfR2V0T2JqRGVmbklEKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBjb25zdCB3Y2hhcl90KiBwT2JqTmFtZSkgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CiAKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoZ19lbWJlZGRlckRhdGFTbG90KTsKLQlpZighcEFycmF5KSByZXR1cm4gLTE7CisgIENGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YShnX2VtYmVkZGVyRGF0YVNsb3QpOworICBpZiAoIXBBcnJheSkKKyAgICByZXR1cm4gLTE7CiAKLQlmb3IoaW50IGk9MDsgaTxwQXJyYXktPkdldFNpemUoKTsgaSsrKQotCXsKLQkJQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KGkpOwotCQlpZihGWFNZU193Y3NjbXAocE9iakRlZi0+b2JqTmFtZSwgcE9iak5hbWUpID09IDApCi0JCQlyZXR1cm4gaTsKLQl9Ci0JcmV0dXJuIC0xOworICBmb3IgKGludCBpID0gMDsgaSA8IHBBcnJheS0+R2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDSlNfT2JqRGVmaW50aW9uKiBwT2JqRGVmID0gKENKU19PYmpEZWZpbnRpb24qKXBBcnJheS0+R2V0QXQoaSk7CisgICAgaWYgKEZYU1lTX3djc2NtcChwT2JqRGVmLT5vYmpOYW1lLCBwT2JqTmFtZSkgPT0gMCkKKyAgICAgIHJldHVybiBpOworICB9CisgIHJldHVybiAtMTsKIH0KIAotdm9pZCBKU19FcnJvcih2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG1lc3NhZ2UpCi17Ci0gICAgLy8gQ29udmVyc2lvbiBmcm9tIHBkZml1bSdzIHdjaGFyX3Qgd2lkZS1zdHJpbmdzIHRvIHY4J3MgdWludDE2X3QKLSAgICAvLyB3aWRlLXN0cmluZ3MgaXNuJ3QgaGFuZGxlZCBieSB2OCwgc28gdXNlIFVURjggYXMgYSBjb21tb24KLSAgICAvLyBpbnRlcm1lZGlhdGUgZm9ybWF0LgotICAgIENGWF9CeXRlU3RyaW5nIHV0ZjhfbWVzc2FnZSA9IG1lc3NhZ2UuVVRGOEVuY29kZSgpOwotICAgIGlzb2xhdGUtPlRocm93RXhjZXB0aW9uKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmOF9tZXNzYWdlLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpLlRvTG9jYWxDaGVja2VkKCkpOwordm9pZCBKU19FcnJvcih2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG1lc3NhZ2UpIHsKKyAgLy8gQ29udmVyc2lvbiBmcm9tIHBkZml1bSdzIHdjaGFyX3Qgd2lkZS1zdHJpbmdzIHRvIHY4J3MgdWludDE2X3QKKyAgLy8gd2lkZS1zdHJpbmdzIGlzbid0IGhhbmRsZWQgYnkgdjgsIHNvIHVzZSBVVEY4IGFzIGEgY29tbW9uCisgIC8vIGludGVybWVkaWF0ZSBmb3JtYXQuCisgIENGWF9CeXRlU3RyaW5nIHV0ZjhfbWVzc2FnZSA9IG1lc3NhZ2UuVVRGOEVuY29kZSgpOworICBpc29sYXRlLT5UaHJvd0V4Y2VwdGlvbih2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChpc29sYXRlLCB1dGY4X21lc3NhZ2UuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKSk7CiB9CiAKLXVuc2lnbmVkIEpTX0NhbGNIYXNoKGNvbnN0IHdjaGFyX3QqIG1haW4sIHVuc2lnbmVkIG5MZW4pCi17Ci0JcmV0dXJuICh1bnNpZ25lZClGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VygoY29uc3QgRlhfV0NIQVIqKW1haW4sIG5MZW4pOwordW5zaWduZWQgSlNfQ2FsY0hhc2goY29uc3Qgd2NoYXJfdCogbWFpbiwgdW5zaWduZWQgbkxlbikgeworICByZXR1cm4gKHVuc2lnbmVkKUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKChjb25zdCBGWF9XQ0hBUiopbWFpbiwgbkxlbik7CiB9CiAKLXVuc2lnbmVkIEpTX0NhbGNIYXNoKGNvbnN0IHdjaGFyX3QqIG1haW4pCi17Ci0JcmV0dXJuICh1bnNpZ25lZClGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VygoY29uc3QgRlhfV0NIQVIqKW1haW4sIEZYU1lTX3djc2xlbihtYWluKSk7Cit1bnNpZ25lZCBKU19DYWxjSGFzaChjb25zdCB3Y2hhcl90KiBtYWluKSB7CisgIHJldHVybiAodW5zaWduZWQpRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoKGNvbnN0IEZYX1dDSEFSKiltYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3djc2xlbihtYWluKSk7CiB9Ci1jb25zdCB3Y2hhcl90KglKU19HZXRUeXBlb2Yodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcE9iaikKLXsKLQlpZihwT2JqLklzRW1wdHkoKSkgcmV0dXJuIE5VTEw7Ci0JaWYocE9iai0+SXNTdHJpbmcoKSkKLQkJcmV0dXJuIFZBTFVFX05BTUVfU1RSSU5HOwotCWlmKHBPYmotPklzTnVtYmVyKCkpCi0JCXJldHVybiBWQUxVRV9OQU1FX05VTUJFUjsKLQlpZihwT2JqLT5Jc0Jvb2xlYW4oKSkKLQkJcmV0dXJuIFZBTFVFX05BTUVfQk9PTEVBTjsKLQlpZihwT2JqLT5Jc0RhdGUoKSkKLQkJcmV0dXJuIFZBTFVFX05BTUVfREFURTsKLQlpZihwT2JqLT5Jc09iamVjdCgpKQotCQlyZXR1cm4gVkFMVUVfTkFNRV9PQkpFQ1Q7Ci0JaWYocE9iai0+SXNOdWxsKCkpCi0JCXJldHVybiBWQUxVRV9OQU1FX05VTEw7Ci0JaWYocE9iai0+SXNVbmRlZmluZWQoKSkKLQkJcmV0dXJuIFZBTFVFX05BTUVfVU5ERUZJTkVEOwotCXJldHVybiBOVUxMOwotCitjb25zdCB3Y2hhcl90KiBKU19HZXRUeXBlb2Yodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcE9iaikgeworICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChwT2JqLT5Jc1N0cmluZygpKQorICAgIHJldHVybiBWQUxVRV9OQU1FX1NUUklORzsKKyAgaWYgKHBPYmotPklzTnVtYmVyKCkpCisgICAgcmV0dXJuIFZBTFVFX05BTUVfTlVNQkVSOworICBpZiAocE9iai0+SXNCb29sZWFuKCkpCisgICAgcmV0dXJuIFZBTFVFX05BTUVfQk9PTEVBTjsKKyAgaWYgKHBPYmotPklzRGF0ZSgpKQorICAgIHJldHVybiBWQUxVRV9OQU1FX0RBVEU7CisgIGlmIChwT2JqLT5Jc09iamVjdCgpKQorICAgIHJldHVybiBWQUxVRV9OQU1FX09CSkVDVDsKKyAgaWYgKHBPYmotPklzTnVsbCgpKQorICAgIHJldHVybiBWQUxVRV9OQU1FX05VTEw7CisgIGlmIChwT2JqLT5Jc1VuZGVmaW5lZCgpKQorICAgIHJldHVybiBWQUxVRV9OQU1FX1VOREVGSU5FRDsKKyAgcmV0dXJuIE5VTEw7CiB9Ci12b2lkIEpTX1NldFByaXZhdGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIHZvaWQqIHApCi17Ci0JSlNfU2V0UHJpdmF0ZShOVUxMLCBwT2JqLCBwKTsKK3ZvaWQgSlNfU2V0UHJpdmF0ZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgdm9pZCogcCkgeworICBKU19TZXRQcml2YXRlKE5VTEwsIHBPYmosIHApOwogfQogCi12b2lkKiBKU19HZXRQcml2YXRlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKQotewotCXJldHVybiBKU19HZXRQcml2YXRlKE5VTEwscE9iaik7Cit2b2lkKiBKU19HZXRQcml2YXRlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKSB7CisgIHJldHVybiBKU19HZXRQcml2YXRlKE5VTEwsIHBPYmopOwogfQogCi12b2lkIEpTX1NldFByaXZhdGUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCB2b2lkKiBwKQotewotCWlmKHBPYmouSXNFbXB0eSgpIHx8ICFwT2JqLT5JbnRlcm5hbEZpZWxkQ291bnQoKSkgcmV0dXJuOwotCUNKU19Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhICA9IChDSlNfUHJpdmF0ZURhdGEqKXBPYmotPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCk7Ci0JaWYoIXBQcml2YXRlRGF0YSkgcmV0dXJuOwotCXBQcml2YXRlRGF0YS0+cFByaXZhdGUgPSBwOwordm9pZCBKU19TZXRQcml2YXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIHApIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpIHx8ICFwT2JqLT5JbnRlcm5hbEZpZWxkQ291bnQoKSkKKyAgICByZXR1cm47CisgIENKU19Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0KKyAgICAgIChDSlNfUHJpdmF0ZURhdGEqKXBPYmotPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCk7CisgIGlmICghcFByaXZhdGVEYXRhKQorICAgIHJldHVybjsKKyAgcFByaXZhdGVEYXRhLT5wUHJpdmF0ZSA9IHA7CiB9CiAKLXZvaWQqIEpTX0dldFByaXZhdGUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKQotewotCWlmKHBPYmouSXNFbXB0eSgpKSByZXR1cm4gTlVMTDsKLQlDSlNfUHJpdmF0ZURhdGEqIHBQcml2YXRlRGF0YSAgPSBOVUxMOwotCWlmKHBPYmotPkludGVybmFsRmllbGRDb3VudCgpKQotICAgICAgICAgICAgICAgIHBQcml2YXRlRGF0YSA9IChDSlNfUHJpdmF0ZURhdGEqKXBPYmotPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCk7Ci0JZWxzZQotCXsKLQkJLy9JdCBjb3VsZCBiZSBhIGdsb2JhbCBwcm94eSBvYmplY3QuCi0JCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBwT2JqLT5HZXRQcm90b3R5cGUoKTsKLSAgICAgICAgICAgICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLSAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwotCQlpZih2LT5Jc09iamVjdCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGVEYXRhID0gKENKU19Qcml2YXRlRGF0YSopdi0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKS0+R2V0QWxpZ25lZFBvaW50ZXJGcm9tSW50ZXJuYWxGaWVsZCgwKTsKLQl9Ci0JaWYoIXBQcml2YXRlRGF0YSkgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHBQcml2YXRlRGF0YS0+cFByaXZhdGU7Cit2b2lkKiBKU19HZXRQcml2YXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaikgeworICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIE5VTEw7CisgIENKU19Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0gTlVMTDsKKyAgaWYgKHBPYmotPkludGVybmFsRmllbGRDb3VudCgpKQorICAgIHBQcml2YXRlRGF0YSA9CisgICAgICAgIChDSlNfUHJpdmF0ZURhdGEqKXBPYmotPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCk7CisgIGVsc2UgeworICAgIC8vIEl0IGNvdWxkIGJlIGEgZ2xvYmFsIHByb3h5IG9iamVjdC4KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2ID0gcE9iai0+R2V0UHJvdG90eXBlKCk7CisgICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7CisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gaXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgICBpZiAodi0+SXNPYmplY3QoKSkKKyAgICAgIHBQcml2YXRlRGF0YSA9IChDSlNfUHJpdmF0ZURhdGEqKXYtPlRvT2JqZWN0KGNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCk7CisgIH0KKyAgaWYgKCFwUHJpdmF0ZURhdGEpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwUHJpdmF0ZURhdGEtPnBQcml2YXRlOwogfQogCi12b2lkIEpTX0ZyZWVQcml2YXRlKHZvaWQqIHBQcml2YXRlRGF0YSkKLXsKLSAgICAgICAgZGVsZXRlIChDSlNfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKK3ZvaWQgSlNfRnJlZVByaXZhdGUodm9pZCogcFByaXZhdGVEYXRhKSB7CisgIGRlbGV0ZSAoQ0pTX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7CiB9CiAKLXZvaWQgSlNfRnJlZVByaXZhdGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopCi17Ci0JaWYocE9iai5Jc0VtcHR5KCkgfHwgIXBPYmotPkludGVybmFsRmllbGRDb3VudCgpKSByZXR1cm47Ci0JSlNfRnJlZVByaXZhdGUocE9iai0+R2V0QWxpZ25lZFBvaW50ZXJGcm9tSW50ZXJuYWxGaWVsZCgwKSk7Ci0JcE9iai0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgTlVMTCk7Cit2b2lkIEpTX0ZyZWVQcml2YXRlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKSB7CisgIGlmIChwT2JqLklzRW1wdHkoKSB8fCAhcE9iai0+SW50ZXJuYWxGaWVsZENvdW50KCkpCisgICAgcmV0dXJuOworICBKU19GcmVlUHJpdmF0ZShwT2JqLT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApKTsKKyAgcE9iai0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgTlVMTCk7CiB9CiAKLQotdjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfR2V0T2JqZWN0VmFsdWUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopCi17Ci0JcmV0dXJuIHBPYmo7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBKU19HZXRPYmplY3RWYWx1ZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaikgeworICByZXR1cm4gcE9iajsKIH0KIAotdjg6OkxvY2FsPHY4OjpTdHJpbmc+IFdTVG9KU1N0cmluZyhJSlNfUnVudGltZSogcEpTUnVudGltZSwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLCBpbnQgTGVuID0gLTEpCi17Ci0JQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZyhQcm9wZXJ0eU5hbWUsTGVuKTsKLQlDRlhfQnl0ZVN0cmluZyBicyA9IHdzLlVURjhFbmNvZGUoKTsKLQlpZighcEpTUnVudGltZSkgcEpTUnVudGltZSA9IHY4OjpJc29sYXRlOjpHZXRDdXJyZW50KCk7Ci0JcmV0dXJuIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBKU1J1bnRpbWUsIGJzLmNfc3RyKCksIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKS5Ub0xvY2FsQ2hlY2tlZCgpOwordjg6OkxvY2FsPHY4OjpTdHJpbmc+IFdTVG9KU1N0cmluZyhJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTGVuID0gLTEpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZyhQcm9wZXJ0eU5hbWUsIExlbik7CisgIENGWF9CeXRlU3RyaW5nIGJzID0gd3MuVVRGOEVuY29kZSgpOworICBpZiAoIXBKU1J1bnRpbWUpCisgICAgcEpTUnVudGltZSA9IHY4OjpJc29sYXRlOjpHZXRDdXJyZW50KCk7CisgIHJldHVybiB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSlNSdW50aW1lLCBicy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCisgICAgICAuVG9Mb2NhbENoZWNrZWQoKTsKIH0KIAotdjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfR2V0T2JqZWN0RWxlbWVudChJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lKQordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfR2V0T2JqZWN0RWxlbWVudChJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSkgeworICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbDsKKyAgaWYgKCFwT2JqLT5HZXQocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsIFByb3BlcnR5TmFtZSkpCisgICAgICAgICAgIC5Ub0xvY2FsKCZ2YWwpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworICByZXR1cm4gdmFsOworfQorCit2ODo6TG9jYWw8djg6OkFycmF5PiBKU19HZXRPYmplY3RFbGVtZW50TmFtZXMoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OkFycmF5PigpOworICB2ODo6TG9jYWw8djg6OkFycmF5PiB2YWw7CisgIGlmICghcE9iai0+R2V0UHJvcGVydHlOYW1lcyhwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpKS5Ub0xvY2FsKCZ2YWwpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OkFycmF5PigpOworICByZXR1cm4gdmFsOworfQorCit2b2lkIEpTX1B1dE9iamVjdFN0cmluZyhJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc1ZhbHVlKSAgLy8gVlRfc3RyaW5nCiB7Ci0JaWYocE9iai5Jc0VtcHR5KCkpIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOwotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWw7Ci0JaWYgKCFwT2JqLT5HZXQocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSwgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsUHJvcGVydHlOYW1lKSkuVG9Mb2NhbCgmdmFsKSkgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisgIHBPYmotPlNldChwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpLAorICAgICAgICAgICAgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsIFByb3BlcnR5TmFtZSksCisgICAgICAgICAgICBXU1RvSlNTdHJpbmcocEpTUnVudGltZSwgc1ZhbHVlKSkKKyAgICAgIC5Gcm9tSnVzdCgpOworfQorCit2b2lkIEpTX1B1dE9iamVjdE51bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5WYWx1ZSkgeworICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworICBwT2JqLT5TZXQocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSwKKyAgICAgICAgICAgIFdTVG9KU1N0cmluZyhwSlNSdW50aW1lLCBQcm9wZXJ0eU5hbWUpLAorICAgICAgICAgICAgdjg6OkludDMyOjpOZXcocEpTUnVudGltZSwgblZhbHVlKSkKKyAgICAgIC5Gcm9tSnVzdCgpOworfQorCit2b2lkIEpTX1B1dE9iamVjdE51bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZlZhbHVlKSB7CisgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisgIHBPYmotPlNldChwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpLAorICAgICAgICAgICAgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsIFByb3BlcnR5TmFtZSksCisgICAgICAgICAgICB2ODo6TnVtYmVyOjpOZXcocEpTUnVudGltZSwgKGRvdWJsZSlmVmFsdWUpKQorICAgICAgLkZyb21KdXN0KCk7Cit9CisKK3ZvaWQgSlNfUHV0T2JqZWN0TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFZhbHVlKSB7CisgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisgIHBPYmotPlNldChwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpLAorICAgICAgICAgICAgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsIFByb3BlcnR5TmFtZSksCisgICAgICAgICAgICB2ODo6TnVtYmVyOjpOZXcocEpTUnVudGltZSwgKGRvdWJsZSlkVmFsdWUpKQorICAgICAgLkZyb21KdXN0KCk7Cit9CisKK3ZvaWQgSlNfUHV0T2JqZWN0Qm9vbGVhbihJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmFsdWUpIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybjsKKyAgcE9iai0+U2V0KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksCisgICAgICAgICAgICBXU1RvSlNTdHJpbmcocEpTUnVudGltZSwgUHJvcGVydHlOYW1lKSwKKyAgICAgICAgICAgIHY4OjpCb29sZWFuOjpOZXcocEpTUnVudGltZSwgYlZhbHVlKSkKKyAgICAgIC5Gcm9tSnVzdCgpOworfQorCit2b2lkIEpTX1B1dE9iamVjdE9iamVjdChJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBQdXQpIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybjsKKyAgcE9iai0+U2V0KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksCisgICAgICAgICAgICBXU1RvSlNTdHJpbmcocEpTUnVudGltZSwgUHJvcGVydHlOYW1lKSwgcFB1dCkKKyAgICAgIC5Gcm9tSnVzdCgpOworfQorCit2b2lkIEpTX1B1dE9iamVjdE51bGwoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lKSB7CisgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisgIHBPYmotPlNldChwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpLAorICAgICAgICAgICAgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsIFByb3BlcnR5TmFtZSksIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpKQorICAgICAgLkZyb21KdXN0KCk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6QXJyYXk+IEpTX05ld0FycmF5KElKU19SdW50aW1lKiBwSlNSdW50aW1lKSB7CisgIHJldHVybiB2ODo6QXJyYXk6Ok5ldyhwSlNSdW50aW1lKTsKK30KKwordW5zaWduZWQgSlNfUHV0QXJyYXlFbGVtZW50KElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU1ZBTFVFVFlQRSBlVHlwZSkgeworICBpZiAocEFycmF5LklzRW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHBBcnJheS0+U2V0KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksIGluZGV4LCBwVmFsdWUpLklzTm90aGluZygpKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfR2V0QXJyYXlFbGVtZW50KElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCkgeworICBpZiAocEFycmF5LklzRW1wdHkoKSkKKyAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsOworICBpZiAocEFycmF5LT5HZXQocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSwgaW5kZXgpLlRvTG9jYWwoJnZhbCkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgIHJldHVybiB2YWw7Cit9CisKK3Vuc2lnbmVkIEpTX0dldEFycmF5TGVuZ3RoKHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSkgeworICBpZiAocEFycmF5LklzRW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHBBcnJheS0+TGVuZ3RoKCk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld051bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSwgaW50IG51bWJlcikgeworICByZXR1cm4gdjg6OkludDMyOjpOZXcocEpTUnVudGltZSwgbnVtYmVyKTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBkb3VibGUgbnVtYmVyKSB7CisgIHJldHVybiB2ODo6TnVtYmVyOjpOZXcocEpTUnVudGltZSwgbnVtYmVyKTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBmbG9hdCBudW1iZXIpIHsKKyAgcmV0dXJuIHY4OjpOdW1iZXI6Ok5ldyhwSlNSdW50aW1lLCAoZmxvYXQpbnVtYmVyKTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3Qm9vbGVhbihJSlNfUnVudGltZSogcEpTUnVudGltZSwgYm9vbCBiKSB7CisgIHJldHVybiB2ODo6Qm9vbGVhbjo6TmV3KHBKU1J1bnRpbWUsIGIpOworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdPYmplY3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworICByZXR1cm4gcE9iai0+Q2xvbmUoKTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3T2JqZWN0MihJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gcE9iaikgeworICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgIHJldHVybiBwT2JqLT5DbG9uZSgpOworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdTdHJpbmcoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc3RyaW5nKSB7CisgIHJldHVybiBXU1RvSlNTdHJpbmcocEpTUnVudGltZSwgc3RyaW5nKTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3U3RyaW5nKElKU19SdW50aW1lKiBwSlNSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBuTGVuKSB7CisgIHJldHVybiBXU1RvSlNTdHJpbmcocEpTUnVudGltZSwgc3RyaW5nLCBuTGVuKTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3TnVsbCgpIHsKKyAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld0RhdGUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGRvdWJsZSBkKSB7CisgIHJldHVybiB2ODo6RGF0ZTo6TmV3KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksIGQpLlRvTG9jYWxDaGVja2VkKCk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld1ZhbHVlKElKU19SdW50aW1lKiBwSlNSdW50aW1lKSB7CisgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBKU19HZXRMaXN0VmFsdWUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIGlmICghcExpc3QuSXNFbXB0eSgpICYmIHBMaXN0LT5Jc09iamVjdCgpKSB7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iajsKKyAgICBpZiAocExpc3QtPlRvT2JqZWN0KGNvbnRleHQpLlRvTG9jYWwoJm9iaikpIHsKKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbDsKKyAgICAgIGlmIChvYmotPkdldChjb250ZXh0LCBpbmRleCkuVG9Mb2NhbCgmdmFsKSkKICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CiB9CiAKLXY4OjpMb2NhbDx2ODo6QXJyYXk+IEpTX0dldE9iamVjdEVsZW1lbnROYW1lcyhJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopCi17Ci0JaWYocE9iai5Jc0VtcHR5KCkpIHJldHVybiB2ODo6TG9jYWw8djg6OkFycmF5PigpOwotICAgICAgICB2ODo6TG9jYWw8djg6OkFycmF5PiB2YWw7Ci0JaWYgKCFwT2JqLT5HZXRQcm9wZXJ0eU5hbWVzKHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCkpLlRvTG9jYWwoJnZhbCkpIHJldHVybiB2ODo6TG9jYWw8djg6OkFycmF5PigpOwotICAgICAgICByZXR1cm4gdmFsOworaW50IEpTX1RvSW50MzIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkgeworICBpZiAocFZhbHVlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgcmV0dXJuIHBWYWx1ZS0+VG9JbnQzMihjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLT5WYWx1ZSgpOwogfQogCi12b2lkIEpTX1B1dE9iamVjdFN0cmluZyhJSlNfUnVudGltZSogcEpTUnVudGltZSx2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLCBjb25zdCB3Y2hhcl90KiBzVmFsdWUpIC8vVlRfc3RyaW5nCi17Ci0JaWYocE9iai5Jc0VtcHR5KCkpIHJldHVybjsKLQlwT2JqLT5TZXQocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSwgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsIFByb3BlcnR5TmFtZSksIFdTVG9KU1N0cmluZyhwSlNSdW50aW1lLCBzVmFsdWUpKS5Gcm9tSnVzdCgpOworYm9vbCBKU19Ub0Jvb2xlYW4oSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkgeworICBpZiAocFZhbHVlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIHJldHVybiBwVmFsdWUtPlRvQm9vbGVhbihjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLT5WYWx1ZSgpOwogfQogCi12b2lkIEpTX1B1dE9iamVjdE51bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSx2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLCBpbnQgblZhbHVlKQotewotCWlmKHBPYmouSXNFbXB0eSgpKSByZXR1cm47Ci0JcE9iai0+U2V0KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksIFdTVG9KU1N0cmluZyhwSlNSdW50aW1lLFByb3BlcnR5TmFtZSksdjg6OkludDMyOjpOZXcocEpTUnVudGltZSwgblZhbHVlKSkuRnJvbUp1c3QoKTsKK2RvdWJsZSBKU19Ub051bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKSB7CisgIGlmIChwVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiAwLjA7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIHJldHVybiBwVmFsdWUtPlRvTnVtYmVyKGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCktPlZhbHVlKCk7CiB9CiAKLXZvaWQgSlNfUHV0T2JqZWN0TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsIGZsb2F0IGZWYWx1ZSkKLXsKLQlpZihwT2JqLklzRW1wdHkoKSkgcmV0dXJuOwotCXBPYmotPlNldChwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpLCBXU1RvSlNTdHJpbmcocEpTUnVudGltZSxQcm9wZXJ0eU5hbWUpLHY4OjpOdW1iZXI6Ok5ldyhwSlNSdW50aW1lLCAoZG91YmxlKWZWYWx1ZSkpLkZyb21KdXN0KCk7Cit2ODo6TG9jYWw8djg6Ok9iamVjdD4gSlNfVG9PYmplY3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKSB7CisgIGlmIChwVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgcmV0dXJuIHBWYWx1ZS0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKTsKIH0KIAotdm9pZCBKU19QdXRPYmplY3ROdW1iZXIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwgZG91YmxlIGRWYWx1ZSkKLXsKLQlpZihwT2JqLklzRW1wdHkoKSkgcmV0dXJuOwotCXBPYmotPlNldChwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpLCBXU1RvSlNTdHJpbmcocEpTUnVudGltZSxQcm9wZXJ0eU5hbWUpLHY4OjpOdW1iZXI6Ok5ldyhwSlNSdW50aW1lLCAoZG91YmxlKWRWYWx1ZSkpLkZyb21KdXN0KCk7CitDRlhfV2lkZVN0cmluZyBKU19Ub1N0cmluZyhJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkgeworICBpZiAocFZhbHVlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gTCIiOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOworICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgcyhwVmFsdWUtPlRvU3RyaW5nKGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCkpOworICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCpzLCBzLmxlbmd0aCgpKTsKIH0KIAotdm9pZCBKU19QdXRPYmplY3RCb29sZWFuKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsIGJvb2wgYlZhbHVlKQotewotCWlmKHBPYmouSXNFbXB0eSgpKSByZXR1cm47Ci0JcE9iai0+U2V0KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksIFdTVG9KU1N0cmluZyhwSlNSdW50aW1lLFByb3BlcnR5TmFtZSksdjg6OkJvb2xlYW46Ok5ldyhwSlNSdW50aW1lLCBiVmFsdWUpKS5Gcm9tSnVzdCgpOwordjg6OkxvY2FsPHY4OjpBcnJheT4gSlNfVG9BcnJheShJSlNfUnVudGltZSogcEpTUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKSB7CisgIGlmIChwVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OkFycmF5PigpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOworICByZXR1cm4gdjg6OkxvY2FsPHY4OjpBcnJheT46OkNhc3QocFZhbHVlLT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpKTsKIH0KIAotdm9pZCBKU19QdXRPYmplY3RPYmplY3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBQdXQpCi17Ci0JaWYocE9iai5Jc0VtcHR5KCkpIHJldHVybjsKLQlwT2JqLT5TZXQocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSwgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsUHJvcGVydHlOYW1lKSxwUHV0KS5Gcm9tSnVzdCgpOwordm9pZCBKU19WYWx1ZUNvcHkodjg6OkxvY2FsPHY4OjpWYWx1ZT4mIHBUbywgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcEZyb20pIHsKKyAgcFRvID0gcEZyb207CiB9CiAKLXZvaWQgSlNfUHV0T2JqZWN0TnVsbChJSlNfUnVudGltZSogcEpTUnVudGltZSx2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lKQotewotCWlmKHBPYmouSXNFbXB0eSgpKSByZXR1cm47Ci0JcE9iai0+U2V0KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksIFdTVG9KU1N0cmluZyhwSlNSdW50aW1lLFByb3BlcnR5TmFtZSksdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCkpLkZyb21KdXN0KCk7Ci19CisvLyBKYXZhU2NyaXB0IHRpbWUgaW1wbGVtZW50IGJlZ2luLgogCi12ODo6TG9jYWw8djg6OkFycmF5PiBKU19OZXdBcnJheShJSlNfUnVudGltZSogcEpTUnVudGltZSkKLXsKLQlyZXR1cm4gdjg6OkFycmF5OjpOZXcocEpTUnVudGltZSk7Ci19Ci0KLXVuc2lnbmVkIEpTX1B1dEFycmF5RWxlbWVudChJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5LHVuc2lnbmVkIGluZGV4LHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSxGWEpTVkFMVUVUWVBFIGVUeXBlKQotewotCWlmKHBBcnJheS5Jc0VtcHR5KCkpIHJldHVybiAwOwotCWlmIChwQXJyYXktPlNldChwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpLCBpbmRleCwgcFZhbHVlKS5Jc05vdGhpbmcoKSkgcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX0dldEFycmF5RWxlbWVudChJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5LHVuc2lnbmVkIGluZGV4KQotewotCWlmKHBBcnJheS5Jc0VtcHR5KCkpIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOwotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWw7Ci0JaWYgKHBBcnJheS0+R2V0KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksIGluZGV4KS5Ub0xvY2FsKCZ2YWwpKSByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKLSAgICAgICAgcmV0dXJuIHZhbDsKLX0KLQotdW5zaWduZWQgSlNfR2V0QXJyYXlMZW5ndGgodjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5KQotewotCWlmKHBBcnJheS5Jc0VtcHR5KCkpIHJldHVybiAwOwotCXJldHVybiBwQXJyYXktPkxlbmd0aCgpOwotfQotCi12ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdOdW1iZXIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsaW50IG51bWJlcikKLXsKLQlyZXR1cm4gdjg6OkludDMyOjpOZXcocEpTUnVudGltZSwgbnVtYmVyKTsKLX0KLQotdjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLGRvdWJsZSBudW1iZXIpCi17Ci0JcmV0dXJuIHY4OjpOdW1iZXI6Ok5ldyhwSlNSdW50aW1lLCBudW1iZXIpOwotfQotCi12ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdOdW1iZXIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsZmxvYXQgbnVtYmVyKQotewotCXJldHVybiB2ODo6TnVtYmVyOjpOZXcocEpTUnVudGltZSwgKGZsb2F0KW51bWJlcik7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld0Jvb2xlYW4oSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsYm9vbCBiKQotewotCXJldHVybiB2ODo6Qm9vbGVhbjo6TmV3KHBKU1J1bnRpbWUsIGIpOwotfQotCi12ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdPYmplY3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopCi17Ci0JaWYocE9iai5Jc0VtcHR5KCkpIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOwotCXJldHVybiBwT2JqLT5DbG9uZSgpOwotfQotCi12ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdPYmplY3QyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBPYmopCi17Ci0JaWYocE9iai5Jc0VtcHR5KCkpIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOwotCXJldHVybiBwT2JqLT5DbG9uZSgpOwotfQotCi0KLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld1N0cmluZyhJSlNfUnVudGltZSogcEpTUnVudGltZSxjb25zdCB3Y2hhcl90KiBzdHJpbmcpCi17Ci0JcmV0dXJuIFdTVG9KU1N0cmluZyhwSlNSdW50aW1lLCBzdHJpbmcpOwotfQotCi12ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdTdHJpbmcoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsY29uc3Qgd2NoYXJfdCogc3RyaW5nLCB1bnNpZ25lZCBuTGVuKQotewotCXJldHVybiBXU1RvSlNTdHJpbmcocEpTUnVudGltZSwgc3RyaW5nLCBuTGVuKTsKLX0KLQotdjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3TnVsbCgpCi17Ci0JcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld0RhdGUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsZG91YmxlIGQpCi17Ci0JcmV0dXJuIHY4OjpEYXRlOjpOZXcocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSwgZCkuVG9Mb2NhbENoZWNrZWQoKTsKLX0KLQotdjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3VmFsdWUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUpCi17Ci0JcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX0dldExpc3RWYWx1ZShJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcExpc3QsIGludCBpbmRleCkKLXsKLQotICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwotCWlmKCFwTGlzdC5Jc0VtcHR5KCkgJiYgcExpc3QtPklzT2JqZWN0KCkpCi0JewotCQl2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqOwotICAgICAgICAgICAgICAgIGlmIChwTGlzdC0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbCgmb2JqKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqLT5HZXQoY29udGV4dCwgaW5kZXgpLlRvTG9jYWwoJnZhbCkpIHJldHVybiB2YWw7Ci0gICAgICAgICAgICAgICAgfQotCX0KLQlyZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKLX0KLQotaW50CUpTX1RvSW50MzIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkKLXsKLQlpZihwVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gMDsKLSAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLQlyZXR1cm4gcFZhbHVlLT5Ub0ludDMyKGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCktPlZhbHVlKCk7Ci19Ci0KLWJvb2wgSlNfVG9Cb29sZWFuKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpCi17Ci0JaWYocFZhbHVlLklzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwotCXJldHVybiBwVmFsdWUtPlRvQm9vbGVhbihjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLT5WYWx1ZSgpOwotfQotCi1kb3VibGUgSlNfVG9OdW1iZXIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkKLXsKLQlpZihwVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gMC4wOwotICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwotCXJldHVybiBwVmFsdWUtPlRvTnVtYmVyKGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCktPlZhbHVlKCk7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBKU19Ub09iamVjdChJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKQotewotCWlmKHBWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKLSAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLQlyZXR1cm4gcFZhbHVlLT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpOwotfQotCi1DRlhfV2lkZVN0cmluZwlKU19Ub1N0cmluZyhJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKQotewotCWlmKHBWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiBMIiI7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0Jdjg6OlN0cmluZzo6VXRmOFZhbHVlIHMocFZhbHVlLT5Ub1N0cmluZyhjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpKTsKLQlyZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCpzLCBzLmxlbmd0aCgpKTsKLX0KLQotdjg6OkxvY2FsPHY4OjpBcnJheT4gSlNfVG9BcnJheShJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKQotewotCWlmKHBWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiB2ODo6TG9jYWw8djg6OkFycmF5PigpOwotICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwotCXJldHVybiB2ODo6TG9jYWw8djg6OkFycmF5Pjo6Q2FzdChwVmFsdWUtPlRvT2JqZWN0KGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCkpOwotfQotCi12b2lkIEpTX1ZhbHVlQ29weSh2ODo6TG9jYWw8djg6OlZhbHVlPiYgcFRvLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwRnJvbSkKLXsKLQlwVG8gPSBwRnJvbTsKLX0KLQotCi0vL0phdmFTY3JpcHQgdGltZSBpbXBsZW1lbnQgYmVnaW4uCi0KLWRvdWJsZSBfZ2V0TG9jYWxUWkEoKQotewotCWlmKCFGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTKSkKLQkJcmV0dXJuIDA7Ci0JdGltZV90IHQgPSAwOwotCXRpbWUoJnQpOwotCWxvY2FsdGltZSgmdCk7Citkb3VibGUgX2dldExvY2FsVFpBKCkgeworICBpZiAoIUZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQorICAgIHJldHVybiAwOworICB0aW1lX3QgdCA9IDA7CisgIHRpbWUoJnQpOworICBsb2NhbHRpbWUoJnQpOwogI2lmIF9NU0NfVkVSID49IDE5MDAKICAgLy8gSW4gZ2NjIGFuZCBpbiBWaXN1YWwgU3R1ZGlvIHByaW9yIHRvIFZTIDIwMTUgJ3RpbWV6b25lJyBpcyBhIGdsb2JhbAogICAvLyB2YXJpYWJsZSBkZWNsYXJlZCBpbiB0aW1lLmguIFRoYXQgdmFyaWFibGUgd2FzIGRlcHJlY2F0ZWQgYW5kIGluIFZTIDIwMTUKQEAgLTc5MCwyODYgKzkxNSwyNzIgQEAKICAgbG9uZyB0aW1lem9uZSA9IDA7CiAgIF9nZXRfdGltZXpvbmUoJnRpbWV6b25lKTsKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSgtKHRpbWV6b25lICogMTAwMCkpOworICByZXR1cm4gKGRvdWJsZSkoLSh0aW1lem9uZSAqIDEwMDApKTsKIH0KIAotaW50IF9nZXREYXlsaWdodFNhdmluZ1RBKGRvdWJsZSBkKQotewotCWlmKCFGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTKSkKLQkJcmV0dXJuIDA7Ci0JdGltZV90IHQgPSAodGltZV90KShkLzEwMDApOwotCXN0cnVjdCB0bSAqIHRtcCA9IGxvY2FsdGltZSgmdCk7Ci0JaWYgKHRtcCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlpZiAodG1wLT50bV9pc2RzdCA+IDApCi0JCS8vT25lIGhvdXIuCi0JCXJldHVybiAoaW50KTYwKjYwKjEwMDA7Ci0JcmV0dXJuIDA7CitpbnQgX2dldERheWxpZ2h0U2F2aW5nVEEoZG91YmxlIGQpIHsKKyAgaWYgKCFGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTKSkKKyAgICByZXR1cm4gMDsKKyAgdGltZV90IHQgPSAodGltZV90KShkIC8gMTAwMCk7CisgIHN0cnVjdCB0bSogdG1wID0gbG9jYWx0aW1lKCZ0KTsKKyAgaWYgKHRtcCA9PSBOVUxMKQorICAgIHJldHVybiAwOworICBpZiAodG1wLT50bV9pc2RzdCA+IDApCisgICAgLy8gT25lIGhvdXIuCisgICAgcmV0dXJuIChpbnQpNjAgKiA2MCAqIDEwMDA7CisgIHJldHVybiAwOwogfQogCi1kb3VibGUgX01vZChkb3VibGUgeCwgZG91YmxlIHkpCi17Ci0JZG91YmxlIHIgPSBmbW9kKHgsIHkpOwotCWlmIChyIDwgMCkgciArPSB5OwotCXJldHVybiByOworZG91YmxlIF9Nb2QoZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIGRvdWJsZSByID0gZm1vZCh4LCB5KTsKKyAgaWYgKHIgPCAwKQorICAgIHIgKz0geTsKKyAgcmV0dXJuIHI7CiB9CiAKLWludCBfaXNmaW5pdGUoZG91YmxlIHYpCi17CitpbnQgX2lzZmluaXRlKGRvdWJsZSB2KSB7CiAjaWYgX01TQ19WRVIKLQlyZXR1cm4gOjpfZmluaXRlKHYpOworICByZXR1cm4gOjpfZmluaXRlKHYpOwogI2Vsc2UKLQlyZXR1cm4gc3RkOjpmYWJzKHYpIDwgc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgoKTsKKyAgcmV0dXJuIHN0ZDo6ZmFicyh2KSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4KCk7CiAjZW5kaWYKIH0KIAotZG91YmxlIF90b0ludGVnZXIoZG91YmxlIG4pCi17Ci0JcmV0dXJuIChuID49IDApPyBGWFNZU19mbG9vcihuKTogLUZYU1lTX2Zsb29yKC1uKTsKK2RvdWJsZSBfdG9JbnRlZ2VyKGRvdWJsZSBuKSB7CisgIHJldHVybiAobiA+PSAwKSA/IEZYU1lTX2Zsb29yKG4pIDogLUZYU1lTX2Zsb29yKC1uKTsKIH0KIAotYm9vbCBfaXNMZWFwWWVhcihpbnQgeWVhcikKLXsKLQlyZXR1cm4gKHllYXIlND09MCkmJigoeWVhciUxMDAhPTApfHwoeWVhciU0MDAhPTApKTsKK2Jvb2wgX2lzTGVhcFllYXIoaW50IHllYXIpIHsKKyAgcmV0dXJuICh5ZWFyICUgNCA9PSAwKSAmJiAoKHllYXIgJSAxMDAgIT0gMCkgfHwgKHllYXIgJSA0MDAgIT0gMCkpOwogfQogCi1pbnQgX0RheUZyb21ZZWFyKGludCB5KQotewotCXJldHVybiAoaW50KSgzNjUqKHkgLSAxOTcwLjApICsgRlhTWVNfZmxvb3IoKHkgLSAxOTY5LjApLzQpIC0gRlhTWVNfZmxvb3IoKHkgLSAxOTAxLjApLzEwMCkrRlhTWVNfZmxvb3IoKHkgLSAxNjAxLjApLzQwMCkpOworaW50IF9EYXlGcm9tWWVhcihpbnQgeSkgeworICByZXR1cm4gKGludCkoMzY1ICogKHkgLSAxOTcwLjApICsgRlhTWVNfZmxvb3IoKHkgLSAxOTY5LjApIC8gNCkgLQorICAgICAgICAgICAgICAgRlhTWVNfZmxvb3IoKHkgLSAxOTAxLjApIC8gMTAwKSArCisgICAgICAgICAgICAgICBGWFNZU19mbG9vcigoeSAtIDE2MDEuMCkgLyA0MDApKTsKIH0KIAotZG91YmxlIF9UaW1lRnJvbVllYXIoaW50IHkpCi17Ci0JcmV0dXJuICAoKGRvdWJsZSk4NjQwMDAwMCkgKiBfRGF5RnJvbVllYXIoeSk7Citkb3VibGUgX1RpbWVGcm9tWWVhcihpbnQgeSkgeworICByZXR1cm4gKChkb3VibGUpODY0MDAwMDApICogX0RheUZyb21ZZWFyKHkpOwogfQogCi1kb3VibGUgX1RpbWVGcm9tWWVhck1vbnRoKGludCB5LCBpbnQgbSkKLXsKLQlzdGF0aWMgaW50IGRheXNNb250aFsxMl0gPXsgMCwzMSw1OSw5MCwxMjAsMTUxLDE4MSwyMTIsMjQzLDI3MywzMDQsMzM0fTsKLQlzdGF0aWMgaW50IGxlYXBEYXlzTW9udGhbMTJdID0geyAwLDMxLDYwLDkxLDEyMSwxNTIsMTgyLDIxMywyNDQsMjc0LDMwNSwzMzV9OwotCWludCogcE1vbnRoID0gZGF5c01vbnRoOwotCWlmKF9pc0xlYXBZZWFyKHkpKQotCQlwTW9udGggPSBsZWFwRGF5c01vbnRoOwotCXJldHVybiBfVGltZUZyb21ZZWFyKHkpICsgKChkb3VibGUpcE1vbnRoW21dKSo4NjQwMDAwMDsKK2RvdWJsZSBfVGltZUZyb21ZZWFyTW9udGgoaW50IHksIGludCBtKSB7CisgIHN0YXRpYyBpbnQgZGF5c01vbnRoWzEyXSA9IHswLCAgIDMxLCAgNTksICA5MCwgIDEyMCwgMTUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNH07CisgIHN0YXRpYyBpbnQgbGVhcERheXNNb250aFsxMl0gPSB7MCwgICAzMSwgIDYwLCAgOTEsICAxMjEsIDE1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1fTsKKyAgaW50KiBwTW9udGggPSBkYXlzTW9udGg7CisgIGlmIChfaXNMZWFwWWVhcih5KSkKKyAgICBwTW9udGggPSBsZWFwRGF5c01vbnRoOworICByZXR1cm4gX1RpbWVGcm9tWWVhcih5KSArICgoZG91YmxlKXBNb250aFttXSkgKiA4NjQwMDAwMDsKIH0KIAotaW50IF9EYXkoZG91YmxlIHQpCi17Ci0JcmV0dXJuIChpbnQpRlhTWVNfZmxvb3IodCAvIDg2NDAwMDAwKTsKK2ludCBfRGF5KGRvdWJsZSB0KSB7CisgIHJldHVybiAoaW50KUZYU1lTX2Zsb29yKHQgLyA4NjQwMDAwMCk7CiB9CiAKLWludCBfWWVhckZyb21UaW1lKGRvdWJsZSB0KQotewotCS8vZXN0aW1hdGUgdGhlIHRpbWUuCi0JaW50IHkgPSAxOTcwICsoaW50KSh0LygzNjUuMCo4NjQwMDAwMCkpOwotCWlmIChfVGltZUZyb21ZZWFyKHkpIDw9IHQpCi0JewotCQl3aGlsZShfVGltZUZyb21ZZWFyKHkrMSkgPD0gdCkgeSsrOwotCX0KLQllbHNlCi0JCXdoaWxlKF9UaW1lRnJvbVllYXIoeS0xKSA+IHQpIHktLTsKLQlyZXR1cm4geTsKK2ludCBfWWVhckZyb21UaW1lKGRvdWJsZSB0KSB7CisgIC8vIGVzdGltYXRlIHRoZSB0aW1lLgorICBpbnQgeSA9IDE5NzAgKyAoaW50KSh0IC8gKDM2NS4wICogODY0MDAwMDApKTsKKyAgaWYgKF9UaW1lRnJvbVllYXIoeSkgPD0gdCkgeworICAgIHdoaWxlIChfVGltZUZyb21ZZWFyKHkgKyAxKSA8PSB0KQorICAgICAgeSsrOworICB9IGVsc2UKKyAgICB3aGlsZSAoX1RpbWVGcm9tWWVhcih5IC0gMSkgPiB0KQorICAgICAgeS0tOworICByZXR1cm4geTsKIH0KIAotaW50IF9EYXlXaXRoaW5ZZWFyKGRvdWJsZSB0KQotewotCWludCB5ZWFyID0gX1llYXJGcm9tVGltZSh0KTsKLQlpbnQgZGF5ID0gX0RheSh0KTsKLQlyZXR1cm4gZGF5LV9EYXlGcm9tWWVhcih5ZWFyKTsKK2ludCBfRGF5V2l0aGluWWVhcihkb3VibGUgdCkgeworICBpbnQgeWVhciA9IF9ZZWFyRnJvbVRpbWUodCk7CisgIGludCBkYXkgPSBfRGF5KHQpOworICByZXR1cm4gZGF5IC0gX0RheUZyb21ZZWFyKHllYXIpOwogfQogCi1pbnQgX01vbnRoRnJvbVRpbWUoZG91YmxlIHQpCi17Ci0JaW50IGRheSA9IF9EYXlXaXRoaW5ZZWFyKHQpOwotCWludCB5ZWFyID0gX1llYXJGcm9tVGltZSh0KTsKLQlpZigwPD1kYXkgJiYgZGF5IDwzMSkKLQkJcmV0dXJuIDA7Ci0JaWYoMzE8PWRheSAmJiBkYXk8IDU5K19pc0xlYXBZZWFyKHllYXIpKQotCQlyZXR1cm4gMTsKLQlpZigoNTkrX2lzTGVhcFllYXIoeWVhcikpPD1kYXkgJiYgZGF5PCg5MCtfaXNMZWFwWWVhcih5ZWFyKSkpCi0JCXJldHVybiAyOwotCWlmKCg5MCtfaXNMZWFwWWVhcih5ZWFyKSk8PWRheSAmJiBkYXk8KDEyMCtfaXNMZWFwWWVhcih5ZWFyKSkpCi0JCXJldHVybiAzOwotCWlmKCgxMjArX2lzTGVhcFllYXIoeWVhcikpPD1kYXkgJiYgZGF5PCgxNTErX2lzTGVhcFllYXIoeWVhcikpKQotCQlyZXR1cm4gNDsKLQlpZigoMTUxK19pc0xlYXBZZWFyKHllYXIpKTw9ZGF5ICYmIGRheTwoMTgxK19pc0xlYXBZZWFyKHllYXIpKSkKLQkJcmV0dXJuIDU7Ci0JaWYoKDE4MStfaXNMZWFwWWVhcih5ZWFyKSk8PWRheSAmJiBkYXk8KDIxMitfaXNMZWFwWWVhcih5ZWFyKSkpCi0JCXJldHVybiA2OwotCWlmKCgyMTIrX2lzTGVhcFllYXIoeWVhcikpPD1kYXkgJiYgZGF5PCgyNDMrX2lzTGVhcFllYXIoeWVhcikpKQotCQlyZXR1cm4gNzsKLQlpZigoMjQzK19pc0xlYXBZZWFyKHllYXIpKTw9ZGF5ICYmIGRheTwoMjczK19pc0xlYXBZZWFyKHllYXIpKSkKLQkJcmV0dXJuIDg7Ci0JaWYoKDI3MytfaXNMZWFwWWVhcih5ZWFyKSk8PWRheSAmJiBkYXk8KDMwNCtfaXNMZWFwWWVhcih5ZWFyKSkpCi0JCXJldHVybiA5OwotCWlmKCgzMDQrX2lzTGVhcFllYXIoeWVhcikpPD1kYXkgJiYgZGF5PCgzMzQrX2lzTGVhcFllYXIoeWVhcikpKQotCQlyZXR1cm4gMTA7Ci0JaWYoKDMzNCtfaXNMZWFwWWVhcih5ZWFyKSk8PWRheSAmJiBkYXk8KDM2NStfaXNMZWFwWWVhcih5ZWFyKSkpCi0JCXJldHVybiAxMTsKK2ludCBfTW9udGhGcm9tVGltZShkb3VibGUgdCkgeworICBpbnQgZGF5ID0gX0RheVdpdGhpblllYXIodCk7CisgIGludCB5ZWFyID0gX1llYXJGcm9tVGltZSh0KTsKKyAgaWYgKDAgPD0gZGF5ICYmIGRheSA8IDMxKQorICAgIHJldHVybiAwOworICBpZiAoMzEgPD0gZGF5ICYmIGRheSA8IDU5ICsgX2lzTGVhcFllYXIoeWVhcikpCisgICAgcmV0dXJuIDE7CisgIGlmICgoNTkgKyBfaXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICg5MCArIF9pc0xlYXBZZWFyKHllYXIpKSkKKyAgICByZXR1cm4gMjsKKyAgaWYgKCg5MCArIF9pc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDEyMCArIF9pc0xlYXBZZWFyKHllYXIpKSkKKyAgICByZXR1cm4gMzsKKyAgaWYgKCgxMjAgKyBfaXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgxNTEgKyBfaXNMZWFwWWVhcih5ZWFyKSkpCisgICAgcmV0dXJuIDQ7CisgIGlmICgoMTUxICsgX2lzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoMTgxICsgX2lzTGVhcFllYXIoeWVhcikpKQorICAgIHJldHVybiA1OworICBpZiAoKDE4MSArIF9pc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDIxMiArIF9pc0xlYXBZZWFyKHllYXIpKSkKKyAgICByZXR1cm4gNjsKKyAgaWYgKCgyMTIgKyBfaXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgyNDMgKyBfaXNMZWFwWWVhcih5ZWFyKSkpCisgICAgcmV0dXJuIDc7CisgIGlmICgoMjQzICsgX2lzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoMjczICsgX2lzTGVhcFllYXIoeWVhcikpKQorICAgIHJldHVybiA4OworICBpZiAoKDI3MyArIF9pc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDMwNCArIF9pc0xlYXBZZWFyKHllYXIpKSkKKyAgICByZXR1cm4gOTsKKyAgaWYgKCgzMDQgKyBfaXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgzMzQgKyBfaXNMZWFwWWVhcih5ZWFyKSkpCisgICAgcmV0dXJuIDEwOworICBpZiAoKDMzNCArIF9pc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDM2NSArIF9pc0xlYXBZZWFyKHllYXIpKSkKKyAgICByZXR1cm4gMTE7CiAKLQlyZXR1cm4gLTE7CisgIHJldHVybiAtMTsKIH0KIAotaW50IF9EYXRlRnJvbVRpbWUoZG91YmxlIHQpCi17Ci0JaW50IGRheSA9IF9EYXlXaXRoaW5ZZWFyKHQpOwotCWludCB5ZWFyID0gX1llYXJGcm9tVGltZSh0KTsKLQlib29sIGxlYXAgPSBfaXNMZWFwWWVhcih5ZWFyKTsKLQlpbnQgbW9udGggPSBfTW9udGhGcm9tVGltZSh0KTsKLQlzd2l0Y2ggKG1vbnRoKQotCXsKLQljYXNlIDA6Ci0JCXJldHVybiBkYXkrMTsKLQljYXNlIDE6Ci0JCXJldHVybiBkYXktMzA7Ci0JY2FzZSAyOgotCQlyZXR1cm4gZGF5LTU4LWxlYXA7Ci0JY2FzZSAzOgotCQlyZXR1cm4gZGF5LTg5LWxlYXA7Ci0JY2FzZSA0OgotCQlyZXR1cm4gZGF5LTExOS1sZWFwOwotCWNhc2UgNToKLQkJcmV0dXJuIGRheS0xNTAtbGVhcDsKLQljYXNlIDY6Ci0JCXJldHVybiBkYXktMTgwLWxlYXA7Ci0JY2FzZSA3OgotCQlyZXR1cm4gZGF5LTIxMS1sZWFwOwotCWNhc2UgODoKLQkJcmV0dXJuIGRheS0yNDItbGVhcDsKLQljYXNlIDk6Ci0JCXJldHVybiBkYXktMjcyLWxlYXA7Ci0JY2FzZSAxMDoKLQkJcmV0dXJuIGRheS0zMDMtbGVhcDsKLQljYXNlIDExOgotCQlyZXR1cm4gZGF5LTMzMy1sZWFwOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KK2ludCBfRGF0ZUZyb21UaW1lKGRvdWJsZSB0KSB7CisgIGludCBkYXkgPSBfRGF5V2l0aGluWWVhcih0KTsKKyAgaW50IHllYXIgPSBfWWVhckZyb21UaW1lKHQpOworICBib29sIGxlYXAgPSBfaXNMZWFwWWVhcih5ZWFyKTsKKyAgaW50IG1vbnRoID0gX01vbnRoRnJvbVRpbWUodCk7CisgIHN3aXRjaCAobW9udGgpIHsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gZGF5ICsgMTsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gZGF5IC0gMzA7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIGRheSAtIDU4IC0gbGVhcDsKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gZGF5IC0gODkgLSBsZWFwOworICAgIGNhc2UgNDoKKyAgICAgIHJldHVybiBkYXkgLSAxMTkgLSBsZWFwOworICAgIGNhc2UgNToKKyAgICAgIHJldHVybiBkYXkgLSAxNTAgLSBsZWFwOworICAgIGNhc2UgNjoKKyAgICAgIHJldHVybiBkYXkgLSAxODAgLSBsZWFwOworICAgIGNhc2UgNzoKKyAgICAgIHJldHVybiBkYXkgLSAyMTEgLSBsZWFwOworICAgIGNhc2UgODoKKyAgICAgIHJldHVybiBkYXkgLSAyNDIgLSBsZWFwOworICAgIGNhc2UgOToKKyAgICAgIHJldHVybiBkYXkgLSAyNzIgLSBsZWFwOworICAgIGNhc2UgMTA6CisgICAgICByZXR1cm4gZGF5IC0gMzAzIC0gbGVhcDsKKyAgICBjYXNlIDExOgorICAgICAgcmV0dXJuIGRheSAtIDMzMyAtIGxlYXA7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICB9CiB9CiAKLWRvdWJsZSBKU19HZXREYXRlVGltZSgpCi17Ci0JaWYoIUZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQotCQlyZXR1cm4gMDsKLQl0aW1lX3QgdCA9IHRpbWUoTlVMTCk7Ci0Jc3RydWN0IHRtKiBwVG0gPSBsb2NhbHRpbWUoJnQpOworZG91YmxlIEpTX0dldERhdGVUaW1lKCkgeworICBpZiAoIUZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQorICAgIHJldHVybiAwOworICB0aW1lX3QgdCA9IHRpbWUoTlVMTCk7CisgIHN0cnVjdCB0bSogcFRtID0gbG9jYWx0aW1lKCZ0KTsKIAotCWludCB5ZWFyID0gcFRtLT50bV95ZWFyKzE5MDA7Ci0JZG91YmxlIHQxID0gX1RpbWVGcm9tWWVhcih5ZWFyKTsKKyAgaW50IHllYXIgPSBwVG0tPnRtX3llYXIgKyAxOTAwOworICBkb3VibGUgdDEgPSBfVGltZUZyb21ZZWFyKHllYXIpOwogCi0JcmV0dXJuIHQxICsgcFRtLT50bV95ZGF5Kjg2NDAwMDAwLjAgKyBwVG0tPnRtX2hvdXIqMzYwMDAwMC4wK3BUbS0+dG1fbWluKjYwMDAwLjArcFRtLT50bV9zZWMqMTAwMC4wOworICByZXR1cm4gdDEgKyBwVG0tPnRtX3lkYXkgKiA4NjQwMDAwMC4wICsgcFRtLT50bV9ob3VyICogMzYwMDAwMC4wICsKKyAgICAgICAgIHBUbS0+dG1fbWluICogNjAwMDAuMCArIHBUbS0+dG1fc2VjICogMTAwMC4wOwogfQogCi1pbnQgSlNfR2V0WWVhckZyb21UaW1lKGRvdWJsZSBkdCkKLXsKLQlyZXR1cm4gX1llYXJGcm9tVGltZShkdCk7CitpbnQgSlNfR2V0WWVhckZyb21UaW1lKGRvdWJsZSBkdCkgeworICByZXR1cm4gX1llYXJGcm9tVGltZShkdCk7CiB9CiAKLWludCBKU19HZXRNb250aEZyb21UaW1lKGRvdWJsZSBkdCkKLXsKLQlyZXR1cm4gX01vbnRoRnJvbVRpbWUoZHQpOworaW50IEpTX0dldE1vbnRoRnJvbVRpbWUoZG91YmxlIGR0KSB7CisgIHJldHVybiBfTW9udGhGcm9tVGltZShkdCk7CiB9CiAKLWludCBKU19HZXREYXlGcm9tVGltZShkb3VibGUgZHQpCi17Ci0JcmV0dXJuIF9EYXRlRnJvbVRpbWUoZHQpOworaW50IEpTX0dldERheUZyb21UaW1lKGRvdWJsZSBkdCkgeworICByZXR1cm4gX0RhdGVGcm9tVGltZShkdCk7CiB9CiAKLWludCBKU19HZXRIb3VyRnJvbVRpbWUoZG91YmxlIGR0KQotewotCXJldHVybiAoaW50KV9Nb2QoRlhTWVNfZmxvb3IoKGRvdWJsZSkoZHQvKDYwKjYwKjEwMDApKSksIDI0KTsKK2ludCBKU19HZXRIb3VyRnJvbVRpbWUoZG91YmxlIGR0KSB7CisgIHJldHVybiAoaW50KV9Nb2QoRlhTWVNfZmxvb3IoKGRvdWJsZSkoZHQgLyAoNjAgKiA2MCAqIDEwMDApKSksIDI0KTsKIH0KIAotaW50IEpTX0dldE1pbkZyb21UaW1lKGRvdWJsZSBkdCkKLXsKLQlyZXR1cm4gKGludClfTW9kKEZYU1lTX2Zsb29yKChkb3VibGUpKGR0Lyg2MCoxMDAwKSkpLCA2MCk7CitpbnQgSlNfR2V0TWluRnJvbVRpbWUoZG91YmxlIGR0KSB7CisgIHJldHVybiAoaW50KV9Nb2QoRlhTWVNfZmxvb3IoKGRvdWJsZSkoZHQgLyAoNjAgKiAxMDAwKSkpLCA2MCk7CiB9CiAKLWludCBKU19HZXRTZWNGcm9tVGltZShkb3VibGUgZHQpCi17Ci0JcmV0dXJuIChpbnQpX01vZChGWFNZU19mbG9vcigoZG91YmxlKShkdC8xMDAwKSksIDYwKTsKK2ludCBKU19HZXRTZWNGcm9tVGltZShkb3VibGUgZHQpIHsKKyAgcmV0dXJuIChpbnQpX01vZChGWFNZU19mbG9vcigoZG91YmxlKShkdCAvIDEwMDApKSwgNjApOwogfQogCi1kb3VibGUgSlNfRGF0ZVBhcnNlKGNvbnN0IHdjaGFyX3QqIHN0cmluZykKLXsKLQl2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSB2ODo6SXNvbGF0ZTo6R2V0Q3VycmVudCgpOwotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKLQl2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOworZG91YmxlIEpTX0RhdGVQYXJzZShjb25zdCB3Y2hhcl90KiBzdHJpbmcpIHsKKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gdjg6Oklzb2xhdGU6OkdldEN1cnJlbnQoKTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUocElzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOwogCi0Jdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwogCi0JLy9Vc2UgdGhlIGJ1aWx0LWluIG9iamVjdCBtZXRob2QuCi0Jdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdiA9IGNvbnRleHQtPkdsb2JhbCgpLT5HZXQoY29udGV4dCwgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJEYXRlIiwgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpLlRvTG9jYWxDaGVja2VkKCkpLlRvTG9jYWxDaGVja2VkKCk7Ci0JaWYodi0+SXNPYmplY3QoKSkKLQl7Ci0JCXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvID0gdi0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKTsKLQkJdiA9IG8tPkdldChjb250ZXh0LHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAicGFyc2UiLCB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCkuVG9Mb2NhbENoZWNrZWQoKSkuVG9Mb2NhbENoZWNrZWQoKTsKLQkJaWYodi0+SXNGdW5jdGlvbigpKQotCQl7Ci0JCQl2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBmdW5DID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3Qodik7CisgIC8vIFVzZSB0aGUgYnVpbHQtaW4gb2JqZWN0IG1ldGhvZC4KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdiA9CisgICAgICBjb250ZXh0LT5HbG9iYWwoKQorICAgICAgICAgIC0+R2V0KGNvbnRleHQsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiRGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpKQorICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpOworICBpZiAodi0+SXNPYmplY3QoKSkgeworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvID0gdi0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKTsKKyAgICB2ID0gby0+R2V0KGNvbnRleHQsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAicGFyc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCkpCisgICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKTsKKyAgICBpZiAodi0+SXNGdW5jdGlvbigpKSB7CisgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBmdW5DID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3Qodik7CiAKLQkJCWNvbnN0IGludCBhcmdjID0gMTsKLQkJCXY4OjpMb2NhbDx2ODo6U3RyaW5nPiB0aW1lU3RyID0gV1NUb0pTU3RyaW5nKHBJc29sYXRlLCBzdHJpbmcpOwotCQkJdjg6OkxvY2FsPHY4OjpWYWx1ZT4gYXJndlthcmdjXSA9IHt0aW1lU3RyfTsKLQkJCXYgPSBmdW5DLT5DYWxsKGNvbnRleHQsIGNvbnRleHQtPkdsb2JhbCgpLCBhcmdjLCBhcmd2KS5Ub0xvY2FsQ2hlY2tlZCgpOwotCQkJaWYodi0+SXNOdW1iZXIoKSkKLQkJCXsKLQkJCQlkb3VibGUgZGF0ZSA9ICB2LT5Ub051bWJlcihjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLT5WYWx1ZSgpOwotCQkJCWlmKCFfaXNmaW5pdGUoZGF0ZSkpIHJldHVybiBkYXRlOwotCQkJCXJldHVybiBkYXRlICsgX2dldExvY2FsVFpBKCkgKyBfZ2V0RGF5bGlnaHRTYXZpbmdUQShkYXRlKTsKLQkJCX0KLQotCQl9Ci0JfQotCXJldHVybiAwOworICAgICAgY29uc3QgaW50IGFyZ2MgPSAxOworICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHRpbWVTdHIgPSBXU1RvSlNTdHJpbmcocElzb2xhdGUsIHN0cmluZyk7CisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBhcmd2W2FyZ2NdID0ge3RpbWVTdHJ9OworICAgICAgdiA9IGZ1bkMtPkNhbGwoY29udGV4dCwgY29udGV4dC0+R2xvYmFsKCksIGFyZ2MsIGFyZ3YpLlRvTG9jYWxDaGVja2VkKCk7CisgICAgICBpZiAodi0+SXNOdW1iZXIoKSkgeworICAgICAgICBkb3VibGUgZGF0ZSA9IHYtPlRvTnVtYmVyKGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCktPlZhbHVlKCk7CisgICAgICAgIGlmICghX2lzZmluaXRlKGRhdGUpKQorICAgICAgICAgIHJldHVybiBkYXRlOworICAgICAgICByZXR1cm4gZGF0ZSArIF9nZXRMb2NhbFRaQSgpICsgX2dldERheWxpZ2h0U2F2aW5nVEEoZGF0ZSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOwogfQogCi1kb3VibGUgSlNfTWFrZURheShpbnQgblllYXIsIGludCBuTW9udGgsIGludCBuRGF0ZSkKLXsKLQlpZiAoIV9pc2Zpbml0ZShuWWVhcikgfHwgIV9pc2Zpbml0ZShuTW9udGgpIHx8IV9pc2Zpbml0ZShuRGF0ZSkpCi0JCXJldHVybiBHZXROYW4oKTsKLQlkb3VibGUgeSA9IF90b0ludGVnZXIoblllYXIpOwotCWRvdWJsZSBtID0gX3RvSW50ZWdlcihuTW9udGgpOwotCWRvdWJsZSBkdCA9IF90b0ludGVnZXIobkRhdGUpOwotCWRvdWJsZSB5bSA9IHkgKyBGWFNZU19mbG9vcigoZG91YmxlKW0vMTIpOwotCWRvdWJsZSBtbiA9IF9Nb2QobSAsMTIpOworZG91YmxlIEpTX01ha2VEYXkoaW50IG5ZZWFyLCBpbnQgbk1vbnRoLCBpbnQgbkRhdGUpIHsKKyAgaWYgKCFfaXNmaW5pdGUoblllYXIpIHx8ICFfaXNmaW5pdGUobk1vbnRoKSB8fCAhX2lzZmluaXRlKG5EYXRlKSkKKyAgICByZXR1cm4gR2V0TmFuKCk7CisgIGRvdWJsZSB5ID0gX3RvSW50ZWdlcihuWWVhcik7CisgIGRvdWJsZSBtID0gX3RvSW50ZWdlcihuTW9udGgpOworICBkb3VibGUgZHQgPSBfdG9JbnRlZ2VyKG5EYXRlKTsKKyAgZG91YmxlIHltID0geSArIEZYU1lTX2Zsb29yKChkb3VibGUpbSAvIDEyKTsKKyAgZG91YmxlIG1uID0gX01vZChtLCAxMik7CiAKLQlkb3VibGUgdCA9IF9UaW1lRnJvbVllYXJNb250aCgoaW50KXltLChpbnQpbW4pOworICBkb3VibGUgdCA9IF9UaW1lRnJvbVllYXJNb250aCgoaW50KXltLCAoaW50KW1uKTsKIAotCWlmIChfWWVhckZyb21UaW1lKHQpICE9IHltIHx8IF9Nb250aEZyb21UaW1lKHQpICE9IG1uIHx8X0RhdGVGcm9tVGltZSh0KSAhPSAxKQotCQlyZXR1cm4gR2V0TmFuKCk7Ci0JcmV0dXJuIF9EYXkodCkrZHQtMTsKKyAgaWYgKF9ZZWFyRnJvbVRpbWUodCkgIT0geW0gfHwgX01vbnRoRnJvbVRpbWUodCkgIT0gbW4gfHwKKyAgICAgIF9EYXRlRnJvbVRpbWUodCkgIT0gMSkKKyAgICByZXR1cm4gR2V0TmFuKCk7CisgIHJldHVybiBfRGF5KHQpICsgZHQgLSAxOwogfQogCi1kb3VibGUgSlNfTWFrZVRpbWUoaW50IG5Ib3VyLCBpbnQgbk1pbiwgaW50IG5TZWMsIGludCBuTXMpCi17Ci0JaWYgKCFfaXNmaW5pdGUobkhvdXIpIHx8IV9pc2Zpbml0ZShuTWluKSB8fCFfaXNmaW5pdGUoblNlYykgfHwhX2lzZmluaXRlKG5NcykpCi0JCXJldHVybiBHZXROYW4oKTsKK2RvdWJsZSBKU19NYWtlVGltZShpbnQgbkhvdXIsIGludCBuTWluLCBpbnQgblNlYywgaW50IG5NcykgeworICBpZiAoIV9pc2Zpbml0ZShuSG91cikgfHwgIV9pc2Zpbml0ZShuTWluKSB8fCAhX2lzZmluaXRlKG5TZWMpIHx8CisgICAgICAhX2lzZmluaXRlKG5NcykpCisgICAgcmV0dXJuIEdldE5hbigpOwogCi0JZG91YmxlIGggPSBfdG9JbnRlZ2VyKG5Ib3VyKTsKLQlkb3VibGUgbSA9IF90b0ludGVnZXIobk1pbik7Ci0JZG91YmxlIHMgPSBfdG9JbnRlZ2VyKG5TZWMpOwotCWRvdWJsZSBtaWxsaSA9IF90b0ludGVnZXIobk1zKTsKKyAgZG91YmxlIGggPSBfdG9JbnRlZ2VyKG5Ib3VyKTsKKyAgZG91YmxlIG0gPSBfdG9JbnRlZ2VyKG5NaW4pOworICBkb3VibGUgcyA9IF90b0ludGVnZXIoblNlYyk7CisgIGRvdWJsZSBtaWxsaSA9IF90b0ludGVnZXIobk1zKTsKIAotCXJldHVybiBoICogMzYwMDAwMCArIG0gKiA2MDAwMCArIHMgKiAxMDAwICsgbWlsbGk7CisgIHJldHVybiBoICogMzYwMDAwMCArIG0gKiA2MDAwMCArIHMgKiAxMDAwICsgbWlsbGk7CiB9CiAKLWRvdWJsZSBKU19NYWtlRGF0ZShkb3VibGUgZGF5LCBkb3VibGUgdGltZSkKLXsKLQlpZiAoIV9pc2Zpbml0ZShkYXkpIHx8IV9pc2Zpbml0ZSh0aW1lKSkKLQkJcmV0dXJuIEdldE5hbigpOworZG91YmxlIEpTX01ha2VEYXRlKGRvdWJsZSBkYXksIGRvdWJsZSB0aW1lKSB7CisgIGlmICghX2lzZmluaXRlKGRheSkgfHwgIV9pc2Zpbml0ZSh0aW1lKSkKKyAgICByZXR1cm4gR2V0TmFuKCk7CiAKLQlyZXR1cm4gZGF5ICogODY0MDAwMDAgKyB0aW1lOworICByZXR1cm4gZGF5ICogODY0MDAwMDAgKyB0aW1lOwogfQogCi1ib29sIEpTX1BvcnRJc05hbihkb3VibGUgZCkKLXsKLQlyZXR1cm4gZCAhPSBkOworYm9vbCBKU19Qb3J0SXNOYW4oZG91YmxlIGQpIHsKKyAgcmV0dXJuIGQgIT0gZDsKIH0KIAotZG91YmxlIEpTX0xvY2FsVGltZShkb3VibGUgZCkKLXsKLQlyZXR1cm4gSlNfR2V0RGF0ZVRpbWUoKSArIF9nZXREYXlsaWdodFNhdmluZ1RBKGQpOworZG91YmxlIEpTX0xvY2FsVGltZShkb3VibGUgZCkgeworICByZXR1cm4gSlNfR2V0RGF0ZVRpbWUoKSArIF9nZXREYXlsaWdodFNhdmluZ1RBKGQpOwogfQogCi0vL0phdmFTY3JpcHQgdGltZSBpbXBsZW1lbnQgRW5kLgorLy8gSmF2YVNjcmlwdCB0aW1lIGltcGxlbWVudCBFbmQuCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5jcHAKaW5kZXggODQ5NjIyOC4uOWVjYTEwYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9CdXR0b24uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQnV0dG9uLmNwcApAQCAtOSw0NSArOSwzNyBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0J1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfQnV0dG9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNQV0xfQnV0dG9uOjpDUFdMX0J1dHRvbigpIDoKLQltX2JNb3VzZURvd24oRkFMU0UpCi17CitDUFdMX0J1dHRvbjo6Q1BXTF9CdXR0b24oKSA6IG1fYk1vdXNlRG93bihGQUxTRSkge30KKworQ1BXTF9CdXR0b246On5DUFdMX0J1dHRvbigpIHsKKyAgLy8JUFdMX1RSQUNFKCJ+Q1BXTF9CdXR0b25cbiIpOwogfQogCi1DUFdMX0J1dHRvbjo6fkNQV0xfQnV0dG9uKCkKLXsKLS8vCVBXTF9UUkFDRSgifkNQV0xfQnV0dG9uXG4iKTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfQnV0dG9uOjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9CdXR0b24iOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0J1dHRvbjo6R2V0Q2xhc3NOYW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gIkNQV0xfQnV0dG9uIjsKK3ZvaWQgQ1BXTF9CdXR0b246Ok9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgY3AuZUN1cnNvclR5cGUgPSBGWENUX0hBTkQ7CiB9CiAKLXZvaWQgQ1BXTF9CdXR0b246Ok9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCWNwLmVDdXJzb3JUeXBlID0gRlhDVF9IQU5EOworRlhfQk9PTCBDUFdMX0J1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKKworICBtX2JNb3VzZURvd24gPSBUUlVFOworICBTZXRDYXB0dXJlKCk7CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOworRlhfQk9PTCBDUFdMX0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCwgbkZsYWcpOwogCi0JbV9iTW91c2VEb3duID0gVFJVRTsKLQlTZXRDYXB0dXJlKCk7CisgIFJlbGVhc2VDYXB0dXJlKCk7CisgIG1fYk1vdXNlRG93biA9IEZBTFNFOwogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQotCi1GWF9CT09MIENQV0xfQnV0dG9uOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCwgbkZsYWcpOwotCi0JUmVsZWFzZUNhcHR1cmUoKTsKLQltX2JNb3VzZURvd24gPSBGQUxTRTsKLQotCXJldHVybiBUUlVFOwotfQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ2FyZXQuY3BwCmluZGV4IDg0YThiM2QuLmYzNTM4NWUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ2FyZXQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ2FyZXQuY3BwCkBAIC05LDE4OSArOSwxNTcgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKIAotI2RlZmluZSBQV0xfQ0FSRVRfRkxBU0hJTlRFUlZBTAkJNTAwCisjZGVmaW5lIFBXTF9DQVJFVF9GTEFTSElOVEVSVkFMIDUwMAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBDb25zdHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotQ1BXTF9DYXJldDo6Q1BXTF9DYXJldCgpIDoKLQltX2JGbGFzaChGQUxTRSksCi0JbV9wdEhlYWQoMCwwKSwKLQltX3B0Rm9vdCgwLDApLAotCW1fZldpZHRoKDAuNGYpLAotCW1fbkRlbGF5KDApCi17CitDUFdMX0NhcmV0OjpDUFdMX0NhcmV0KCkKKyAgICA6IG1fYkZsYXNoKEZBTFNFKSwKKyAgICAgIG1fcHRIZWFkKDAsIDApLAorICAgICAgbV9wdEZvb3QoMCwgMCksCisgICAgICBtX2ZXaWR0aCgwLjRmKSwKKyAgICAgIG1fbkRlbGF5KDApIHt9CisKK0NQV0xfQ2FyZXQ6On5DUFdMX0NhcmV0KCkge30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9DYXJldDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfQ2FyZXQiOwogfQogCi1DUFdMX0NhcmV0Ojp+Q1BXTF9DYXJldCgpCi17Cit2b2lkIENQV0xfQ2FyZXQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgeworICBHZXRDYXJldEFwcChzQXBwU3RyZWFtLCBDUERGX1BvaW50KDAuMGYsIDAuMGYpKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9DYXJldDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gIkNQV0xfQ2FyZXQiOwordm9pZCBDUFdMX0NhcmV0OjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgaWYgKElzVmlzaWJsZSgpICYmIG1fYkZsYXNoKSB7CisgICAgQ1BERl9SZWN0IHJjUmVjdCA9IEdldENhcmV0UmVjdCgpOworICAgIENQREZfUmVjdCByY0NsaXAgPSBHZXRDbGlwUmVjdCgpOworCisgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisKKyAgICBwYXRoLlNldFBvaW50Q291bnQoMik7CisKKyAgICBGWF9GTE9BVCBmQ2FyZXRYID0gcmNSZWN0LmxlZnQgKyBtX2ZXaWR0aCAqIDAuNWY7CisgICAgRlhfRkxPQVQgZkNhcmV0VG9wID0gcmNSZWN0LnRvcDsKKyAgICBGWF9GTE9BVCBmQ2FyZXRCb3R0b20gPSByY1JlY3QuYm90dG9tOworCisgICAgaWYgKCFyY0NsaXAuSXNFbXB0eSgpKSB7CisgICAgICByY1JlY3QuSW50ZXJzZWN0KHJjQ2xpcCk7CisgICAgICBpZiAoIXJjUmVjdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgZkNhcmV0VG9wID0gcmNSZWN0LnRvcDsKKyAgICAgICAgZkNhcmV0Qm90dG9tID0gcmNSZWN0LmJvdHRvbTsKKyAgICAgICAgcGF0aC5TZXRQb2ludCgwLCBmQ2FyZXRYLCBmQ2FyZXRCb3R0b20sIEZYUFRfTU9WRVRPKTsKKyAgICAgICAgcGF0aC5TZXRQb2ludCgxLCBmQ2FyZXRYLCBmQ2FyZXRUb3AsIEZYUFRfTElORVRPKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcGF0aC5TZXRQb2ludCgwLCBmQ2FyZXRYLCBmQ2FyZXRCb3R0b20sIEZYUFRfTU9WRVRPKTsKKyAgICAgIHBhdGguU2V0UG9pbnQoMSwgZkNhcmV0WCwgZkNhcmV0VG9wLCBGWFBUX0xJTkVUTyk7CisgICAgfQorCisgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgICBnc2QubV9MaW5lV2lkdGggPSBtX2ZXaWR0aDsKKworICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIEFyZ2JFbmNvZGUoMjU1LCAwLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFKTsKKyAgfQogfQogCi12b2lkIENQV0xfQ2FyZXQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pCi17Ci0JR2V0Q2FyZXRBcHAoc0FwcFN0cmVhbSxDUERGX1BvaW50KDAuMGYsMC4wZikpOwordm9pZCBDUFdMX0NhcmV0OjpHZXRDYXJldEFwcChDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0KSB7CisgIGlmIChJc1Zpc2libGUoKSAmJiBtX2JGbGFzaCkgeworICAgIENGWF9CeXRlVGV4dEJ1ZiBzQ2FyZXQ7CisKKyAgICBDUERGX1JlY3QgcmNSZWN0ID0gR2V0Q2FyZXRSZWN0KCk7CisgICAgQ1BERl9SZWN0IHJjQ2xpcCA9IEdldENsaXBSZWN0KCk7CisKKyAgICByY1JlY3QgPSBDUFdMX1V0aWxzOjpPZmZzZXRSZWN0KHJjUmVjdCwgcHRPZmZzZXQueCwgcHRPZmZzZXQueSk7CisgICAgcmNDbGlwID0gQ1BXTF9VdGlsczo6T2Zmc2V0UmVjdChyY0NsaXAsIHB0T2Zmc2V0LngsIHB0T2Zmc2V0LnkpOworCisgICAgc0NhcmV0IDw8ICJxXG4iOworICAgIGlmICghcmNDbGlwLklzRW1wdHkoKSkgeworICAgICAgc0NhcmV0IDw8IHJjQ2xpcC5sZWZ0IDw8ICIgIiA8PCByY0NsaXAuYm90dG9tICsgMi41ZiA8PCAiICIKKyAgICAgICAgICAgICA8PCByY0NsaXAucmlnaHQgLSByY0NsaXAubGVmdCA8PCAiICIKKyAgICAgICAgICAgICA8PCByY0NsaXAudG9wIC0gcmNDbGlwLmJvdHRvbSAtIDQuNWYgPDwgIiByZSBXIG5cbiI7CisgICAgfQorICAgIHNDYXJldCA8PCBtX2ZXaWR0aCA8PCAiIHdcbjAgR1xuIjsKKyAgICBzQ2FyZXQgPDwgcmNSZWN0LmxlZnQgKyBtX2ZXaWR0aCAvIDIgPDwgIiAiIDw8IHJjUmVjdC5ib3R0b20gPDwgIiBtXG4iOworICAgIHNDYXJldCA8PCByY1JlY3QubGVmdCArIG1fZldpZHRoIC8gMiA8PCAiICIgPDwgcmNSZWN0LnRvcCA8PCAiIGwgU1xuUVxuIjsKKworICAgIHNBcHBTdHJlYW0gPDwgc0NhcmV0OworICB9CiB9CiAKLXZvaWQgQ1BXTF9DYXJldDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCi17Ci0JaWYgKElzVmlzaWJsZSgpICYmIG1fYkZsYXNoKQotCXsKLQkJQ1BERl9SZWN0IHJjUmVjdCA9IEdldENhcmV0UmVjdCgpOwotCQlDUERGX1JlY3QgcmNDbGlwID0gR2V0Q2xpcFJlY3QoKTsKLQotCQlDRlhfUGF0aERhdGEgcGF0aDsKLQotCQlwYXRoLlNldFBvaW50Q291bnQoMik7Ci0KLQkJRlhfRkxPQVQgZkNhcmV0WCA9IHJjUmVjdC5sZWZ0ICsgbV9mV2lkdGggKiAwLjVmOwotCQlGWF9GTE9BVCBmQ2FyZXRUb3AgPSByY1JlY3QudG9wOwotCQlGWF9GTE9BVCBmQ2FyZXRCb3R0b20gPSByY1JlY3QuYm90dG9tOwotCi0JCWlmICghcmNDbGlwLklzRW1wdHkoKSkKLQkJewotCQkJcmNSZWN0LkludGVyc2VjdChyY0NsaXApOwotCQkJaWYgKCFyY1JlY3QuSXNFbXB0eSgpKQotCQkJewotCQkJCWZDYXJldFRvcCA9IHJjUmVjdC50b3A7Ci0JCQkJZkNhcmV0Qm90dG9tID0gcmNSZWN0LmJvdHRvbTsKLQkJCQlwYXRoLlNldFBvaW50KDAsIGZDYXJldFgsIGZDYXJldEJvdHRvbSwgRlhQVF9NT1ZFVE8pOwotCQkJCXBhdGguU2V0UG9pbnQoMSwgZkNhcmV0WCwgZkNhcmV0VG9wLCBGWFBUX0xJTkVUTyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJcGF0aC5TZXRQb2ludCgwLCBmQ2FyZXRYLCBmQ2FyZXRCb3R0b20sIEZYUFRfTU9WRVRPKTsKLQkJCXBhdGguU2V0UG9pbnQoMSwgZkNhcmV0WCwgZkNhcmV0VG9wLCBGWFBUX0xJTkVUTyk7Ci0JCX0KLQotCQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCQlnc2QubV9MaW5lV2lkdGggPSBtX2ZXaWR0aDsKLQotCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLDAsICBBcmdiRW5jb2RlKDI1NSwwLDAsMCksIEZYRklMTF9BTFRFUk5BVEUpOwotCX0KK0NGWF9CeXRlU3RyaW5nIENQV0xfQ2FyZXQ6OkdldENhcmV0QXBwZWFyYW5jZVN0cmVhbSgKKyAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCkgeworICBDRlhfQnl0ZVRleHRCdWYgc0NhcmV0OworICBHZXRDYXJldEFwcChzQ2FyZXQsIHB0T2Zmc2V0KTsKKyAgcmV0dXJuIHNDYXJldC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLXZvaWQgQ1BXTF9DYXJldDo6R2V0Q2FyZXRBcHAoQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSxjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpCi17Ci0JaWYgKElzVmlzaWJsZSgpICYmIG1fYkZsYXNoKQotCXsKLQkJQ0ZYX0J5dGVUZXh0QnVmIHNDYXJldDsKLQotCQlDUERGX1JlY3QgcmNSZWN0ID0gR2V0Q2FyZXRSZWN0KCk7Ci0JCUNQREZfUmVjdCByY0NsaXAgPSBHZXRDbGlwUmVjdCgpOwotCi0JCXJjUmVjdCA9IENQV0xfVXRpbHM6Ok9mZnNldFJlY3QocmNSZWN0LHB0T2Zmc2V0LngscHRPZmZzZXQueSk7Ci0JCXJjQ2xpcCA9IENQV0xfVXRpbHM6Ok9mZnNldFJlY3QocmNDbGlwLHB0T2Zmc2V0LngscHRPZmZzZXQueSk7Ci0KLQkJc0NhcmV0IDw8ICJxXG4iOwotCQlpZiAoIXJjQ2xpcC5Jc0VtcHR5KCkpCi0JCXsKLQkJCXNDYXJldCA8PCByY0NsaXAubGVmdCA8PCAiICIgPDwgcmNDbGlwLmJvdHRvbSArIDIuNWYgPDwgIiAiCi0JCQkJPDwgcmNDbGlwLnJpZ2h0IC0gcmNDbGlwLmxlZnQgPDwgIiAiIDw8IHJjQ2xpcC50b3AgLSByY0NsaXAuYm90dG9tIC0gNC41ZiA8PCAiIHJlIFcgblxuIjsKLQkJfQotCQlzQ2FyZXQgPDwgbV9mV2lkdGggPDwgIiB3XG4wIEdcbiI7Ci0JCXNDYXJldCA8PCByY1JlY3QubGVmdCArIG1fZldpZHRoLzIgPDwgIiAiIDw8IHJjUmVjdC5ib3R0b20gPDwgIiBtXG4iOwotCQlzQ2FyZXQgPDwgcmNSZWN0LmxlZnQgKyBtX2ZXaWR0aC8yIDw8ICIgIiA8PCByY1JlY3QudG9wIDw8ICIgbCBTXG5RXG4iOwotCi0JCXNBcHBTdHJlYW0gPDwgc0NhcmV0OwotCX0KK3ZvaWQgQ1BXTF9DYXJldDo6VGltZXJQcm9jKCkgeworICBpZiAobV9uRGVsYXkgPiAwKSB7CisgICAgbV9uRGVsYXktLTsKKyAgfSBlbHNlIHsKKyAgICBtX2JGbGFzaCA9ICFtX2JGbGFzaDsKKyAgICBJbnZhbGlkYXRlUmVjdCgpOworICB9CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfQ2FyZXQ6OkdldENhcmV0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNDYXJldDsKLQlHZXRDYXJldEFwcChzQ2FyZXQscHRPZmZzZXQpOwotCXJldHVybiBzQ2FyZXQuR2V0Qnl0ZVN0cmluZygpOworQ1BERl9SZWN0IENQV0xfQ2FyZXQ6OkdldENhcmV0UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIENQREZfUmVjdChtX3B0Rm9vdC54LCBtX3B0Rm9vdC55LCBtX3B0SGVhZC54ICsgbV9mV2lkdGgsIG1fcHRIZWFkLnkpOwogfQogCi12b2lkIENQV0xfQ2FyZXQ6OlRpbWVyUHJvYygpCi17Ci0JaWYgKG1fbkRlbGF5ID4gMCkKLQl7Ci0JCW1fbkRlbGF5LS07Ci0JfQotCWVsc2UKLQl7Ci0JCW1fYkZsYXNoID0gIW1fYkZsYXNoOwotCQlJbnZhbGlkYXRlUmVjdCgpOwotCX0KK3ZvaWQgQ1BXTF9DYXJldDo6U2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRIZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdEZvb3QpIHsKKyAgaWYgKGJWaXNpYmxlKSB7CisgICAgaWYgKElzVmlzaWJsZSgpKSB7CisgICAgICBpZiAobV9wdEhlYWQueCAhPSBwdEhlYWQueCB8fCBtX3B0SGVhZC55ICE9IHB0SGVhZC55IHx8CisgICAgICAgICAgbV9wdEZvb3QueCAhPSBwdEZvb3QueCB8fCBtX3B0Rm9vdC55ICE9IHB0Rm9vdC55KSB7CisgICAgICAgIG1fcHRIZWFkID0gcHRIZWFkOworICAgICAgICBtX3B0Rm9vdCA9IHB0Rm9vdDsKKworICAgICAgICBtX2JGbGFzaCA9IFRSVUU7CisgICAgICAgIC8vIE1vdmUoR2V0Q2FyZXRSZWN0KCksRkFMU0UsVFJVRSk7CisgICAgICAgIE1vdmUobV9yY0ludmFsaWQsIEZBTFNFLCBUUlVFKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbV9wdEhlYWQgPSBwdEhlYWQ7CisgICAgICBtX3B0Rm9vdCA9IHB0Rm9vdDsKKworICAgICAgRW5kVGltZXIoKTsKKyAgICAgIEJlZ2luVGltZXIoUFdMX0NBUkVUX0ZMQVNISU5URVJWQUwpOworCisgICAgICBDUFdMX1duZDo6U2V0VmlzaWJsZShUUlVFKTsKKyAgICAgIG1fYkZsYXNoID0gVFJVRTsKKworICAgICAgLy8gTW92ZShHZXRDYXJldFJlY3QoKSxGQUxTRSxUUlVFKTsKKyAgICAgIE1vdmUobV9yY0ludmFsaWQsIEZBTFNFLCBUUlVFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbV9wdEhlYWQgPSBDUERGX1BvaW50KDAsIDApOworICAgIG1fcHRGb290ID0gQ1BERl9Qb2ludCgwLCAwKTsKKworICAgIG1fYkZsYXNoID0gRkFMU0U7CisgICAgaWYgKElzVmlzaWJsZSgpKSB7CisgICAgICBFbmRUaW1lcigpOworICAgICAgQ1BXTF9XbmQ6OlNldFZpc2libGUoRkFMU0UpOworICAgIH0KKyAgfQogfQogCi1DUERGX1JlY3QgQ1BXTF9DYXJldDo6R2V0Q2FyZXRSZWN0KCkgY29uc3QKLXsKLQlyZXR1cm4gQ1BERl9SZWN0KG1fcHRGb290LngsCi0JCQltX3B0Rm9vdC55LAotCQkJbV9wdEhlYWQueCArIG1fZldpZHRoLAotCQkJbV9wdEhlYWQueSk7Cit2b2lkIENQV0xfQ2FyZXQ6OkludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QpIHsKKyAgaWYgKHBSZWN0KSB7CisgICAgQ1BERl9SZWN0IHJjUmVmcmVzaCA9IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KCpwUmVjdCwgMC41Zik7CisgICAgcmNSZWZyZXNoLnRvcCArPSAxOworICAgIHJjUmVmcmVzaC5ib3R0b20gLT0gMTsKKworICAgIENQV0xfV25kOjpJbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKKyAgfSBlbHNlCisgICAgQ1BXTF9XbmQ6OkludmFsaWRhdGVSZWN0KHBSZWN0KTsKIH0KLQotdm9pZCBDUFdMX0NhcmV0OjpTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KQotewotCWlmIChiVmlzaWJsZSkKLQl7Ci0JCWlmIChJc1Zpc2libGUoKSkKLQkJewotCQkJaWYgKG1fcHRIZWFkLnggIT0gcHRIZWFkLnggfHwgbV9wdEhlYWQueSAhPSBwdEhlYWQueSB8fAotCQkJCQltX3B0Rm9vdC54ICE9IHB0Rm9vdC54IHx8IG1fcHRGb290LnkgIT0gcHRGb290LnkpCi0JCQl7Ci0JCQkJbV9wdEhlYWQgPSBwdEhlYWQ7Ci0JCQkJbV9wdEZvb3QgPSBwdEZvb3Q7Ci0KLQkJCQltX2JGbGFzaCA9IFRSVUU7Ci0JCQkJLy9Nb3ZlKEdldENhcmV0UmVjdCgpLEZBTFNFLFRSVUUpOwotCQkJCU1vdmUobV9yY0ludmFsaWQsIEZBTFNFLCBUUlVFKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCW1fcHRIZWFkID0gcHRIZWFkOwotCQkJbV9wdEZvb3QgPSBwdEZvb3Q7Ci0KLQkJCUVuZFRpbWVyKCk7Ci0JCQlCZWdpblRpbWVyKFBXTF9DQVJFVF9GTEFTSElOVEVSVkFMKTsKLQotCQkJQ1BXTF9XbmQ6OlNldFZpc2libGUoVFJVRSk7Ci0JCQltX2JGbGFzaCA9IFRSVUU7Ci0KLQkJCS8vTW92ZShHZXRDYXJldFJlY3QoKSxGQUxTRSxUUlVFKTsKLQkJCU1vdmUobV9yY0ludmFsaWQsIEZBTFNFLCBUUlVFKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQltX3B0SGVhZCA9IENQREZfUG9pbnQoMCwgMCk7Ci0JCW1fcHRGb290ID0gQ1BERl9Qb2ludCgwLCAwKTsKLQotCQltX2JGbGFzaCA9IEZBTFNFOwotCQlpZiAoSXNWaXNpYmxlKCkpCi0JCXsKLQkJCUVuZFRpbWVyKCk7Ci0JCQlDUFdMX1duZDo6U2V0VmlzaWJsZShGQUxTRSk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgQ1BXTF9DYXJldDo6SW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0ICogcFJlY3QpCi17Ci0JaWYgKHBSZWN0KQotCXsKLQkJQ1BERl9SZWN0IHJjUmVmcmVzaCA9IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KCpwUmVjdCwwLjVmKTsKLQkJcmNSZWZyZXNoLnRvcCArPSAxOwotCQlyY1JlZnJlc2guYm90dG9tIC09IDE7Ci0KLQkJQ1BXTF9XbmQ6OkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOwotCX0KLQllbHNlCi0JCUNQV0xfV25kOjpJbnZhbGlkYXRlUmVjdChwUmVjdCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Db21ib0JveC5jcHAKaW5kZXggODAxMTVhYi4uOTMyZjhjNSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Db21ib0JveC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Db21ib0JveC5jcHAKQEAgLTEyLDY4MiArMTIsNjQzIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgiCiAKLSNkZWZpbmUgUFdMQ0JfREVGQVVMVEZPTlRTSVpFICAxMi4wZgorI2RlZmluZSBQV0xDQl9ERUZBVUxURk9OVFNJWkUgMTIuMGYKIAotI2RlZmluZSBJc0Zsb2F0WmVybyhmKSAgICAgICAgICAgICAgICAgICAgICAoKGYpIDwgMC4wMDAxICYmIChmKSA+IC0wLjAwMDEpCi0jZGVmaW5lIElzRmxvYXRCaWdnZXIoZmEsZmIpICAgICAgICAgICAgICAgICgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSxmYikgICAgICAgICAgICAgICAoKGZhKSA8IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKLSNkZWZpbmUgSXNGbG9hdEVxdWFsKGZhLGZiKSAgICAgICAgICAgICAgICAgSXNGbG9hdFplcm8oKGZhKS0oZmIpKQotCisjZGVmaW5lIElzRmxvYXRaZXJvKGYpICgoZikgPCAwLjAwMDEgJiYgKGYpID4gLTAuMDAwMSkKKyNkZWZpbmUgSXNGbG9hdEJpZ2dlcihmYSwgZmIpICgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSwgZmIpICgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsIGZiKSBJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NCTGlzdEJveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LG5GbGFnKTsKK0ZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAotICAgIGlmIChtX2JNb3VzZURvd24pCi0gICAgewotICAgICAgICBSZWxlYXNlQ2FwdHVyZSgpOwotICAgICAgICBtX2JNb3VzZURvd24gPSBGQUxTRTsKKyAgaWYgKG1fYk1vdXNlRG93bikgeworICAgIFJlbGVhc2VDYXB0dXJlKCk7CisgICAgbV9iTW91c2VEb3duID0gRkFMU0U7CiAKLSAgICAgICAgaWYgKENsaWVudEhpdFRlc3QocG9pbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcyxQTk1fTEJVVFRPTlVQLDAsUFdMX01BS0VEV09SRChwb2ludC54LHBvaW50LnkpKTsKLSAgICAgICAgICAgIH0KKyAgICBpZiAoQ2xpZW50SGl0VGVzdChwb2ludCkpIHsKKyAgICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9MQlVUVE9OVVAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9NQUtFRFdPUkQocG9pbnQueCwgcG9pbnQueSkpOworICAgICAgfQogCi0gICAgICAgICAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0gICAgICAgICAgICBPbk5vdGlmeVNlbENoYW5nZWQoRkFMU0UsYkV4aXQsIG5GbGFnKTsKLSAgICAgICAgICAgIGlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uS2V5RG93bldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7Ci0KLSAgICBzd2l0Y2ggKG5DaGFyKQotICAgIHsKLSAgICBkZWZhdWx0OgorICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICAgICAgT25Ob3RpZnlTZWxDaGFuZ2VkKEZBTFNFLCBiRXhpdCwgbkZsYWcpOworICAgICAgaWYgKGJFeGl0KQogICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgY2FzZSBGV0xfVktFWV9VcDoKLSAgICBjYXNlIEZXTF9WS0VZX0Rvd246Ci0gICAgY2FzZSBGV0xfVktFWV9Ib21lOgotICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKLSAgICBjYXNlIEZXTF9WS0VZX0VuZDoKLSAgICBjYXNlIEZXTF9WS0VZX1JpZ2h0OgotICAgICAgICBicmVhazsKICAgICB9CisgIH0KIAotICAgIHN3aXRjaCAobkNoYXIpCi0gICAgewotICAgIGNhc2UgRldMX1ZLRVlfVXA6Ci0gICAgICAgIG1fcExpc3QtPk9uVktfVVAoSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9Eb3duOgotICAgICAgICBtX3BMaXN0LT5PblZLX0RPV04oSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9Ib21lOgotICAgICAgICBtX3BMaXN0LT5PblZLX0hPTUUoSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9MZWZ0OgotICAgICAgICBtX3BMaXN0LT5PblZLX0xFRlQoSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9FbmQ6Ci0gICAgICAgIG1fcExpc3QtPk9uVktfRU5EKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6Ci0gICAgICAgIG1fcExpc3QtPk9uVktfUklHSFQoSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9EZWxldGU6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIE9uTm90aWZ5U2VsQ2hhbmdlZChUUlVFLGJFeGl0LCBuRmxhZyk7Ci0KLSAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uQ2hhcldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQV0xfQ0JMaXN0Qm94OjpPbktleURvd25XaXRoRXhpdChGWF9XT1JEIG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fcExpc3QpCisgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKCFtX3BMaXN0LT5PbkNoYXIobkNoYXIsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKSkgcmV0dXJuIEZBTFNFOworICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CisgICAgY2FzZSBGV0xfVktFWV9MZWZ0OgorICAgIGNhc2UgRldMX1ZLRVlfRW5kOgorICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6CisgICAgICBicmVhazsKKyAgfQogCi0gICAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQYXJlbnRXaW5kb3coKSkKLSAgICB7Ci0gICAgICAgIHBDb21ib0JveC0+U2V0U2VsZWN0VGV4dCgpOwotICAgIH0KKyAgc3dpdGNoIChuQ2hhcikgeworICAgIGNhc2UgRldMX1ZLRVlfVXA6CisgICAgICBtX3BMaXN0LT5PblZLX1VQKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9Eb3duOgorICAgICAgbV9wTGlzdC0+T25WS19ET1dOKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9Ib21lOgorICAgICAgbV9wTGlzdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9MZWZ0OgorICAgICAgbV9wTGlzdC0+T25WS19MRUZUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9FbmQ6CisgICAgICBtX3BMaXN0LT5PblZLX0VORChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6CisgICAgICBtX3BMaXN0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9EZWxldGU6CisgICAgICBicmVhazsKKyAgfQogCi0gICAgT25Ob3RpZnlTZWxDaGFuZ2VkKFRSVUUsYkV4aXQsbkZsYWcpOworICBPbk5vdGlmeVNlbENoYW5nZWQoVFJVRSwgYkV4aXQsIG5GbGFnKTsKIAotICAgIHJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBDUFdMX0NCTGlzdEJveDo6T25DaGFyV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKCFtX3BMaXN0KQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIW1fcExpc3QtPk9uQ2hhcihuQ2hhciwgSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICBwQ29tYm9Cb3gtPlNldFNlbGVjdFRleHQoKTsKKyAgfQorCisgIE9uTm90aWZ5U2VsQ2hhbmdlZChUUlVFLCBiRXhpdCwgbkZsYWcpOworCisgIHJldHVybiBUUlVFOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfQ0JCdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi12b2lkIENQV0xfQ0JCdXR0b246OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pCi17Ci0gICAgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOwordm9pZCBDUFdMX0NCQnV0dG9uOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKKyAgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOwogCi0gICAgQ1BERl9SZWN0IHJlY3RXbmQgPSBDUFdMX1duZDo6R2V0V2luZG93UmVjdCgpOworICBDUERGX1JlY3QgcmVjdFduZCA9IENQV0xfV25kOjpHZXRXaW5kb3dSZWN0KCk7CiAKLSAgICBpZiAoSXNWaXNpYmxlKCkgJiYgIXJlY3RXbmQuSXNFbXB0eSgpKQotICAgIHsKLSAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmIHNCdXR0b247CisgIGlmIChJc1Zpc2libGUoKSAmJiAhcmVjdFduZC5Jc0VtcHR5KCkpIHsKKyAgICBDRlhfQnl0ZVRleHRCdWYgc0J1dHRvbjsKIAotICAgICAgICBDUERGX1BvaW50IHB0Q2VudGVyID0gR2V0Q2VudGVyUG9pbnQoKTsKKyAgICBDUERGX1BvaW50IHB0Q2VudGVyID0gR2V0Q2VudGVyUG9pbnQoKTsKIAotICAgICAgICBDUERGX1BvaW50IHB0MShwdENlbnRlci54IC0gUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4scHRDZW50ZXIueSArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7Ci0gICAgICAgIENQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTixwdENlbnRlci55ICsgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLSAgICAgICAgQ1BERl9Qb2ludCBwdDMocHRDZW50ZXIueCxwdENlbnRlci55IC0gUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKKyAgICBDUERGX1BvaW50IHB0MShwdENlbnRlci54IC0gUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4sCisgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CisgICAgQ1BERl9Qb2ludCBwdDIocHRDZW50ZXIueCArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOLAorICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOworICAgIENQREZfUG9pbnQgcHQzKHB0Q2VudGVyLngsCisgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSAtIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CiAKLSAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCxQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDIpCi0gICAgICAgICAgICAmJgotICAgICAgICAgICAgSXNGbG9hdEJpZ2dlcihyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tLFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOKQotICAgICAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzQnV0dG9uIDw8ICIwIGdcbiI7Ci0gICAgICAgICAgICBzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7Ci0gICAgICAgICAgICBzQnV0dG9uIDw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGxcbiI7Ci0gICAgICAgICAgICBzQnV0dG9uIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGxcbiI7Ci0gICAgICAgICAgICBzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGwgZlxuIjsKKyAgICBpZiAoSXNGbG9hdEJpZ2dlcihyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMikgJiYKKyAgICAgICAgSXNGbG9hdEJpZ2dlcihyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOKSkgeworICAgICAgc0J1dHRvbiA8PCAiMCBnXG4iOworICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOworICAgICAgc0J1dHRvbiA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOworICAgICAgc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOworICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsIGZcbiI7CiAKLSAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0J1dHRvbiA8PCAiUVxuIjsKLSAgICAgICAgfQorICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uIDw8ICJRXG4iOwogICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfQ0JCdXR0b246OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotICAgIENQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSxwVXNlcjJEZXZpY2UpOwordm9pZCBDUFdMX0NCQnV0dG9uOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOwogCi0gICAgQ1BERl9SZWN0IHJlY3RXbmQgPSBDUFdMX1duZDo6R2V0V2luZG93UmVjdCgpOworICBDUERGX1JlY3QgcmVjdFduZCA9IENQV0xfV25kOjpHZXRXaW5kb3dSZWN0KCk7CiAKLSAgICBpZiAoSXNWaXNpYmxlKCkgJiYgIXJlY3RXbmQuSXNFbXB0eSgpKQotICAgIHsKLSAgICAgICAgQ1BERl9Qb2ludCBwdENlbnRlciA9IEdldENlbnRlclBvaW50KCk7CisgIGlmIChJc1Zpc2libGUoKSAmJiAhcmVjdFduZC5Jc0VtcHR5KCkpIHsKKyAgICBDUERGX1BvaW50IHB0Q2VudGVyID0gR2V0Q2VudGVyUG9pbnQoKTsKIAotICAgICAgICBDUERGX1BvaW50IHB0MShwdENlbnRlci54IC0gUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4scHRDZW50ZXIueSArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7Ci0gICAgICAgIENQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTixwdENlbnRlci55ICsgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLSAgICAgICAgQ1BERl9Qb2ludCBwdDMocHRDZW50ZXIueCxwdENlbnRlci55IC0gUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKKyAgICBDUERGX1BvaW50IHB0MShwdENlbnRlci54IC0gUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4sCisgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CisgICAgQ1BERl9Qb2ludCBwdDIocHRDZW50ZXIueCArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOLAorICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOworICAgIENQREZfUG9pbnQgcHQzKHB0Q2VudGVyLngsCisgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSAtIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CiAKLSAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCxQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDIpCi0gICAgICAgICAgICAmJgotICAgICAgICAgICAgSXNGbG9hdEJpZ2dlcihyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tLFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOKQotICAgICAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgICBpZiAoSXNGbG9hdEJpZ2dlcihyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMikgJiYKKyAgICAgICAgSXNGbG9hdEJpZ2dlcihyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOKSkgeworICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CiAKLSAgICAgICAgICAgIHBhdGguU2V0UG9pbnRDb3VudCg0KTsKLSAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMCwgcHQxLngsIHB0MS55LCBGWFBUX01PVkVUTyk7Ci0gICAgICAgICAgICBwYXRoLlNldFBvaW50KDEsIHB0Mi54LCBwdDIueSwgRlhQVF9MSU5FVE8pOwotICAgICAgICAgICAgcGF0aC5TZXRQb2ludCgyLCBwdDMueCwgcHQzLnksIEZYUFRfTElORVRPKTsKLSAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMywgcHQxLngsIHB0MS55LCBGWFBUX0xJTkVUTyk7CisgICAgICBwYXRoLlNldFBvaW50Q291bnQoNCk7CisgICAgICBwYXRoLlNldFBvaW50KDAsIHB0MS54LCBwdDEueSwgRlhQVF9NT1ZFVE8pOworICAgICAgcGF0aC5TZXRQb2ludCgxLCBwdDIueCwgcHQyLnksIEZYUFRfTElORVRPKTsKKyAgICAgIHBhdGguU2V0UG9pbnQoMiwgcHQzLngsIHB0My55LCBGWFBUX0xJTkVUTyk7CisgICAgICBwYXRoLlNldFBvaW50KDMsIHB0MS54LCBwdDEueSwgRlhQVF9MSU5FVE8pOwogCi0gICAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLAotICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IsR2V0VHJhbnNwYXJlbmN5KCkpLAotICAgICAgICAgICAgICAgIDAsIEZYRklMTF9BTFRFUk5BVEUpOwotICAgICAgICB9CisgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRyYW5zcGFyZW5jeSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIEZYRklMTF9BTFRFUk5BVEUpOwogICAgIH0KKyAgfQogfQogCi1GWF9CT09MIENQV0xfQ0JCdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLSAgICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CitGWF9CT09MIENQV0xfQ0JCdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7CiAKLSAgICBTZXRDYXB0dXJlKCk7CisgIFNldENhcHR1cmUoKTsKIAotICAgIGlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKLSAgICB7Ci0gICAgICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsUE5NX0xCVVRUT05ET1dOLDAsUFdMX01BS0VEV09SRChwb2ludC54LHBvaW50LnkpKTsKLSAgICB9CisgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX0xCVVRUT05ET1dOLCAwLAorICAgICAgICAgICAgICAgICAgICAgIFBXTF9NQUtFRFdPUkQocG9pbnQueCwgcG9pbnQueSkpOworICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLSAgICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKK0ZYX0JPT0wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCwgbkZsYWcpOwogCi0gICAgUmVsZWFzZUNhcHR1cmUoKTsKKyAgUmVsZWFzZUNhcHR1cmUoKTsKIAotICAgIHJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NvbWJvQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9Db21ib0JveDo6Q1BXTF9Db21ib0JveCgpIDogbV9wRWRpdChOVUxMKSwKLSAgICBtX3BCdXR0b24oTlVMTCksCi0gICAgbV9wTGlzdChOVUxMKSwKLSAgICBtX2JQb3B1cChGQUxTRSksCi0gICAgbV9uUG9wdXBXaGVyZSgwKSwKLSAgICBtX25TZWxlY3RJdGVtKC0xKSwKLSAgICBtX3BGaWxsZXJOb3RpZnkoTlVMTCkKLXsKK0NQV0xfQ29tYm9Cb3g6OkNQV0xfQ29tYm9Cb3goKQorICAgIDogbV9wRWRpdChOVUxMKSwKKyAgICAgIG1fcEJ1dHRvbihOVUxMKSwKKyAgICAgIG1fcExpc3QoTlVMTCksCisgICAgICBtX2JQb3B1cChGQUxTRSksCisgICAgICBtX25Qb3B1cFdoZXJlKDApLAorICAgICAgbV9uU2VsZWN0SXRlbSgtMSksCisgICAgICBtX3BGaWxsZXJOb3RpZnkoTlVMTCkge30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Db21ib0JveDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfQ29tYm9Cb3giOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0NvbWJvQm94OjpHZXRDbGFzc05hbWUoKSBjb25zdAotewotICAgIHJldHVybiAiQ1BXTF9Db21ib0JveCI7Cit2b2lkIENQV0xfQ29tYm9Cb3g6Ok9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgY3AuZHdGbGFncyAmPSB+UFdTX0hTQ1JPTEw7CisgIGNwLmR3RmxhZ3MgJj0gflBXU19WU0NST0xMOwogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6Ok9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotICAgIGNwLmR3RmxhZ3MgJj0gflBXU19IU0NST0xMOwotICAgIGNwLmR3RmxhZ3MgJj0gflBXU19WU0NST0xMOwordm9pZCBDUFdMX0NvbWJvQm94OjpTZXRGb2N1cygpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+U2V0Rm9jdXMoKTsKIH0KIAotdm9pZCBDUFdMX0NvbWJvQm94OjpTZXRGb2N1cygpCi17Ci0gICAgaWYgKG1fcEVkaXQpCi0gICAgICAgIG1fcEVkaXQtPlNldEZvY3VzKCk7Cit2b2lkIENQV0xfQ29tYm9Cb3g6OktpbGxGb2N1cygpIHsKKyAgU2V0UG9wdXAoRkFMU0UpOworICBDUFdMX1duZDo6S2lsbEZvY3VzKCk7CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6S2lsbEZvY3VzKCkKLXsKLSAgICBTZXRQb3B1cChGQUxTRSk7Ci0gICAgQ1BXTF9XbmQ6OktpbGxGb2N1cygpOworQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9Db21ib0JveDo6R2V0VGV4dCgpIGNvbnN0IHsKKyAgaWYgKG1fcEVkaXQpIHsKKyAgICByZXR1cm4gbV9wRWRpdC0+R2V0VGV4dCgpOworICB9CisgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUFdMX0NvbWJvQm94OjpHZXRUZXh0KCkgY29uc3QKLXsKLSAgICBpZiAobV9wRWRpdCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwordm9pZCBDUFdMX0NvbWJvQm94OjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0KSB7CisgIGlmIChtX3BFZGl0KQorICAgIG1fcEVkaXQtPlNldFRleHQodGV4dCk7CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCkKLXsKLSAgICBpZiAobV9wRWRpdCkKLSAgICAgICAgbV9wRWRpdC0+U2V0VGV4dCh0ZXh0KTsKK3ZvaWQgQ1BXTF9Db21ib0JveDo6QWRkU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpIHsKKyAgaWYgKG1fcExpc3QpCisgICAgbV9wTGlzdC0+QWRkU3RyaW5nKHN0cmluZyk7CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6QWRkU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpCi17Ci0gICAgaWYgKG1fcExpc3QpCi0gICAgICAgIG1fcExpc3QtPkFkZFN0cmluZyhzdHJpbmcpOworaW50MzJfdCBDUFdMX0NvbWJvQm94OjpHZXRTZWxlY3QoKSBjb25zdCB7CisgIHJldHVybiBtX25TZWxlY3RJdGVtOwogfQogCi1pbnQzMl90IENQV0xfQ29tYm9Cb3g6OkdldFNlbGVjdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fblNlbGVjdEl0ZW07Cit2b2lkIENQV0xfQ29tYm9Cb3g6OlNldFNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgaWYgKG1fcExpc3QpCisgICAgbV9wTGlzdC0+U2VsZWN0KG5JdGVtSW5kZXgpOworCisgIG1fcEVkaXQtPlNldFRleHQobV9wTGlzdC0+R2V0VGV4dCgpLmNfc3RyKCkpOworCisgIG1fblNlbGVjdEl0ZW0gPSBuSXRlbUluZGV4OwogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6OlNldFNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpCi17Ci0gICAgaWYgKG1fcExpc3QpCi0gICAgICAgIG1fcExpc3QtPlNlbGVjdChuSXRlbUluZGV4KTsKLQotICAgIG1fcEVkaXQtPlNldFRleHQobV9wTGlzdC0+R2V0VGV4dCgpLmNfc3RyKCkpOwotCi0gICAgbV9uU2VsZWN0SXRlbSA9IG5JdGVtSW5kZXg7Cit2b2lkIENQV0xfQ29tYm9Cb3g6OlNldEVkaXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2V0U2VsKG5TdGFydENoYXIsIG5FbmRDaGFyKTsKKyAgfQogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6OlNldEVkaXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLGludDMyX3QgbkVuZENoYXIpCi17Ci0gICAgaWYgKG1fcEVkaXQpCi0gICAgewotICAgICAgICBtX3BFZGl0LT5TZXRTZWwoblN0YXJ0Q2hhcixuRW5kQ2hhcik7Ci0gICAgfQordm9pZCBDUFdMX0NvbWJvQm94OjpHZXRFZGl0U2VsKGludDMyX3QmIG5TdGFydENoYXIsIGludDMyX3QmIG5FbmRDaGFyKSBjb25zdCB7CisgIG5TdGFydENoYXIgPSAtMTsKKyAgbkVuZENoYXIgPSAtMTsKKworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPkdldFNlbChuU3RhcnRDaGFyLCBuRW5kQ2hhcik7CisgIH0KIH0KIAotdm9pZCBDUFdMX0NvbWJvQm94OjpHZXRFZGl0U2VsKGludDMyX3QgJiBuU3RhcnRDaGFyLCBpbnQzMl90ICYgbkVuZENoYXIpIGNvbnN0Ci17Ci0gICAgblN0YXJ0Q2hhciA9IC0xOwotICAgIG5FbmRDaGFyID0gLTE7Ci0KLSAgICBpZiAobV9wRWRpdCkKLSAgICB7Ci0gICAgICAgIG1fcEVkaXQtPkdldFNlbChuU3RhcnRDaGFyLG5FbmRDaGFyKTsKLSAgICB9Cit2b2lkIENQV0xfQ29tYm9Cb3g6OkNsZWFyKCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPkNsZWFyKCk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0NvbWJvQm94OjpDbGVhcigpCi17Ci0gICAgaWYgKG1fcEVkaXQpCi0gICAgewotICAgICAgICBtX3BFZGl0LT5DbGVhcigpOwotICAgIH0KK3ZvaWQgQ1BXTF9Db21ib0JveDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBDcmVhdGVFZGl0KGNwKTsKKyAgQ3JlYXRlQnV0dG9uKGNwKTsKKyAgQ3JlYXRlTGlzdEJveChjcCk7CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0gICAgQ3JlYXRlRWRpdChjcCk7Ci0gICAgQ3JlYXRlQnV0dG9uKGNwKTsKLSAgICBDcmVhdGVMaXN0Qm94KGNwKTsKK3ZvaWQgQ1BXTF9Db21ib0JveDo6Q3JlYXRlRWRpdChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIGlmICghbV9wRWRpdCkgeworICAgIG1fcEVkaXQgPSBuZXcgQ1BXTF9DQkVkaXQ7CisgICAgbV9wRWRpdC0+QXR0YWNoRkZMRGF0YShtX3BGb3JtRmlsbGVyKTsKKworICAgIFBXTF9DUkVBVEVQQVJBTSBlY3AgPSBjcDsKKyAgICBlY3AucFBhcmVudFduZCA9IHRoaXM7CisgICAgZWNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBXU19CT1JERVIgfCBQRVNfQ0VOVEVSIHwKKyAgICAgICAgICAgICAgICAgIFBFU19BVVRPU0NST0xMIHwgUEVTX1VORE87CisKKyAgICBpZiAoSGFzRmxhZyhQV1NfQVVUT0ZPTlRTSVpFKSkKKyAgICAgIGVjcC5kd0ZsYWdzIHw9IFBXU19BVVRPRk9OVFNJWkU7CisKKyAgICBpZiAoIUhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQorICAgICAgZWNwLmR3RmxhZ3MgfD0gUFdTX1JFQURPTkxZOworCisgICAgZWNwLnJjUmVjdFduZCA9IENQREZfUmVjdCgwLCAwLCAwLCAwKTsKKyAgICBlY3AuZHdCb3JkZXJXaWR0aCA9IDA7CisgICAgZWNwLm5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKKworICAgIG1fcEVkaXQtPkNyZWF0ZShlY3ApOworICB9CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6Q3JlYXRlRWRpdChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLSAgICBpZiAoIW1fcEVkaXQpCi0gICAgewotICAgICAgICBtX3BFZGl0ID0gbmV3IENQV0xfQ0JFZGl0OwotICAgICAgICBtX3BFZGl0LT5BdHRhY2hGRkxEYXRhKG1fcEZvcm1GaWxsZXIpOwordm9pZCBDUFdMX0NvbWJvQm94OjpDcmVhdGVCdXR0b24oY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBpZiAoIW1fcEJ1dHRvbikgeworICAgIG1fcEJ1dHRvbiA9IG5ldyBDUFdMX0NCQnV0dG9uOwogCi0gICAgICAgIFBXTF9DUkVBVEVQQVJBTSBlY3AgPSBjcDsKLSAgICAgICAgZWNwLnBQYXJlbnRXbmQgPSB0aGlzOwotICAgICAgICBlY3AuZHdGbGFncyA9ICBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBXU19CT1JERVIgfCBQRVNfQ0VOVEVSIHwgUEVTX0FVVE9TQ1JPTEwgfCBQRVNfVU5ETzsKKyAgICBQV0xfQ1JFQVRFUEFSQU0gYmNwID0gY3A7CisgICAgYmNwLnBQYXJlbnRXbmQgPSB0aGlzOworICAgIGJjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSIHwgUFdTX0JBQ0tHUk9VTkQ7CisgICAgYmNwLnNCYWNrZ3JvdW5kQ29sb3IgPSBQV0xfU0NST0xMQkFSX0JLQ09MT1I7CisgICAgYmNwLnNCb3JkZXJDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7CisgICAgYmNwLmR3Qm9yZGVyV2lkdGggPSAyOworICAgIGJjcC5uQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKKyAgICBiY3AuZUN1cnNvclR5cGUgPSBGWENUX0FSUk9XOwogCi0gICAgICAgIGlmIChIYXNGbGFnKFBXU19BVVRPRk9OVFNJWkUpKQotICAgICAgICAgICAgZWNwLmR3RmxhZ3MgfD0gUFdTX0FVVE9GT05UU0laRTsKLQotICAgICAgICBpZiAoIUhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQotICAgICAgICAgICAgZWNwLmR3RmxhZ3MgfD0gUFdTX1JFQURPTkxZOwotCi0gICAgICAgIGVjcC5yY1JlY3RXbmQgPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0gICAgICAgIGVjcC5kd0JvcmRlcldpZHRoID0gMDsKLSAgICAgICAgZWNwLm5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKLQotICAgICAgICBtX3BFZGl0LT5DcmVhdGUoZWNwKTsKLSAgICB9CisgICAgbV9wQnV0dG9uLT5DcmVhdGUoYmNwKTsKKyAgfQogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6OkNyZWF0ZUJ1dHRvbihjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLSAgICBpZiAoIW1fcEJ1dHRvbikKLSAgICB7Ci0gICAgICAgIG1fcEJ1dHRvbiA9IG5ldyBDUFdMX0NCQnV0dG9uOwordm9pZCBDUFdMX0NvbWJvQm94OjpDcmVhdGVMaXN0Qm94KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgaWYgKCFtX3BMaXN0KSB7CisgICAgbV9wTGlzdCA9IG5ldyBDUFdMX0NCTGlzdEJveDsKKyAgICBtX3BMaXN0LT5BdHRhY2hGRkxEYXRhKG1fcEZvcm1GaWxsZXIpOworICAgIFBXTF9DUkVBVEVQQVJBTSBsY3AgPSBjcDsKKyAgICBsY3AucFBhcmVudFduZCA9IHRoaXM7CisgICAgbGNwLmR3RmxhZ3MgPQorICAgICAgICBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSIHwgUFdTX0JBQ0tHUk9VTkQgfCBQTEJTX0hPVkVSU0VMIHwgUFdTX1ZTQ1JPTEw7CisgICAgbGNwLm5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKKyAgICBsY3AuZHdCb3JkZXJXaWR0aCA9IDE7CisgICAgbGNwLmVDdXJzb3JUeXBlID0gRlhDVF9BUlJPVzsKKyAgICBsY3AucmNSZWN0V25kID0gQ1BERl9SZWN0KDAsIDAsIDAsIDApOwogCi0gICAgICAgIFBXTF9DUkVBVEVQQVJBTSBiY3AgPSBjcDsKLSAgICAgICAgYmNwLnBQYXJlbnRXbmQgPSB0aGlzOwotICAgICAgICBiY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEIHwgUFdTX0JPUkRFUiB8IFBXU19CQUNLR1JPVU5EOwotICAgICAgICBiY3Auc0JhY2tncm91bmRDb2xvciA9IFBXTF9TQ1JPTExCQVJfQktDT0xPUjsKLSAgICAgICAgYmNwLnNCb3JkZXJDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7Ci0gICAgICAgIGJjcC5kd0JvcmRlcldpZHRoID0gMjsKLSAgICAgICAgYmNwLm5Cb3JkZXJTdHlsZSA9IFBCU19CRVZFTEVEOwotICAgICAgICBiY3AuZUN1cnNvclR5cGUgPSBGWENUX0FSUk9XOwotCi0gICAgICAgIG1fcEJ1dHRvbi0+Q3JlYXRlKGJjcCk7Ci0gICAgfQotfQotCi12b2lkIENQV0xfQ29tYm9Cb3g6OkNyZWF0ZUxpc3RCb3goY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0gICAgaWYgKCFtX3BMaXN0KQotICAgIHsKLSAgICAgICAgbV9wTGlzdCA9IG5ldyBDUFdMX0NCTGlzdEJveDsKLSAgICAgICAgbV9wTGlzdC0+QXR0YWNoRkZMRGF0YShtX3BGb3JtRmlsbGVyKTsKLSAgICAgICAgUFdMX0NSRUFURVBBUkFNIGxjcCA9IGNwOwotICAgICAgICBsY3AucFBhcmVudFduZCA9IHRoaXM7Ci0gICAgICAgIGxjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX0JPUkRFUiB8IFBXU19CQUNLR1JPVU5EIHwgUExCU19IT1ZFUlNFTCB8IFBXU19WU0NST0xMOwotICAgICAgICBsY3AubkJvcmRlclN0eWxlID0gUEJTX1NPTElEOwotICAgICAgICBsY3AuZHdCb3JkZXJXaWR0aCA9IDE7Ci0gICAgICAgIGxjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7Ci0gICAgICAgIGxjcC5yY1JlY3RXbmQgPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0KLSAgICAgICAgaWYgKGNwLmR3RmxhZ3MgJiBQV1NfQVVUT0ZPTlRTSVpFKQotICAgICAgICAgICAgbGNwLmZGb250U2l6ZSA9IFBXTENCX0RFRkFVTFRGT05UU0laRTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGNwLmZGb250U2l6ZSA9IGNwLmZGb250U2l6ZTsKLQotICAgICAgICBpZiAoY3Auc0JvcmRlckNvbG9yLm5Db2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKQotICAgICAgICAgICAgbGNwLnNCb3JkZXJDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7Ci0KLSAgICAgICAgaWYgKGNwLnNCYWNrZ3JvdW5kQ29sb3IubkNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQpCi0gICAgICAgICAgICBsY3Auc0JhY2tncm91bmRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7Ci0KLSAgICAgICAgbV9wTGlzdC0+Q3JlYXRlKGxjcCk7Ci0gICAgfQotfQotCi12b2lkIENQV0xfQ29tYm9Cb3g6OlJlUG9zQ2hpbGRXbmQoKQotewotICAgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotICAgIGlmIChtX2JQb3B1cCkKLSAgICB7Ci0gICAgICAgIENQREZfUmVjdCByY2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotICAgICAgICBDUERGX1JlY3QgcmNCdXR0b24gPSByY2xpZW50OwotICAgICAgICBDUERGX1JlY3QgcmNFZGl0ID0gcmNDbGllbnQ7Ci0gICAgICAgIENQREZfUmVjdCByY0xpc3QgPSBDUFdMX1duZDo6R2V0V2luZG93UmVjdCgpOwotCi0gICAgICAgIEZYX0ZMT0FUIGZPbGRXaW5kb3dIZWlnaHQgPSBtX3JjT2xkV2luZG93LkhlaWdodCgpOwotICAgICAgICBGWF9GTE9BVCBmT2xkQ2xpZW50SGVpZ2h0ID0gZk9sZFdpbmRvd0hlaWdodCAtIEdldEJvcmRlcldpZHRoKCkgKiAyOwotCi0gICAgICAgIHN3aXRjaCAobV9uUG9wdXBXaGVyZSkKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByY0J1dHRvbi5sZWZ0ID0gcmNCdXR0b24ucmlnaHQgLSBQV0xfQ09NQk9CT1hfQlVUVE9OX1dJRFRIOwotCi0gICAgICAgICAgICBpZiAocmNCdXR0b24ubGVmdCA8IHJjbGllbnQubGVmdCkKLSAgICAgICAgICAgICAgICByY0J1dHRvbi5sZWZ0ID0gcmNsaWVudC5sZWZ0OwotCi0gICAgICAgICAgICByY0J1dHRvbi5ib3R0b20gPSByY0J1dHRvbi50b3AgLSBmT2xkQ2xpZW50SGVpZ2h0OwotCi0gICAgICAgICAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0IC0gMS4wZjsKLQotICAgICAgICAgICAgaWYgKHJjRWRpdC5sZWZ0IDwgcmNsaWVudC5sZWZ0KQotICAgICAgICAgICAgICAgIHJjRWRpdC5sZWZ0ID0gcmNsaWVudC5sZWZ0OwotCi0gICAgICAgICAgICBpZiAocmNFZGl0LnJpZ2h0IDwgcmNFZGl0LmxlZnQpCi0gICAgICAgICAgICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNFZGl0LmxlZnQ7Ci0KLSAgICAgICAgICAgIHJjRWRpdC5ib3R0b20gPSByY0VkaXQudG9wIC0gZk9sZENsaWVudEhlaWdodDsKLQotICAgICAgICAgICAgcmNMaXN0LnRvcCAtPSBmT2xkV2luZG93SGVpZ2h0OwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmNCdXR0b24ubGVmdCA9IHJjQnV0dG9uLnJpZ2h0IC0gUFdMX0NPTUJPQk9YX0JVVFRPTl9XSURUSDsKLQotICAgICAgICAgICAgaWYgKHJjQnV0dG9uLmxlZnQgPCByY2xpZW50LmxlZnQpCi0gICAgICAgICAgICAgICAgcmNCdXR0b24ubGVmdCA9IHJjbGllbnQubGVmdDsKLQotICAgICAgICAgICAgcmNCdXR0b24udG9wID0gcmNCdXR0b24uYm90dG9tICsgZk9sZENsaWVudEhlaWdodDsKLQotICAgICAgICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNCdXR0b24ubGVmdCAtIDEuMGY7Ci0KLSAgICAgICAgICAgIGlmIChyY0VkaXQubGVmdCA8IHJjbGllbnQubGVmdCkKLSAgICAgICAgICAgICAgICByY0VkaXQubGVmdCA9IHJjbGllbnQubGVmdDsKLQotICAgICAgICAgICAgaWYgKHJjRWRpdC5yaWdodCA8IHJjRWRpdC5sZWZ0KQotICAgICAgICAgICAgICAgIHJjRWRpdC5yaWdodCA9IHJjRWRpdC5sZWZ0OwotCi0gICAgICAgICAgICByY0VkaXQudG9wID0gcmNFZGl0LmJvdHRvbSArIGZPbGRDbGllbnRIZWlnaHQ7Ci0KLSAgICAgICAgICAgIHJjTGlzdC5ib3R0b20gKz0gZk9sZFdpbmRvd0hlaWdodDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV9wQnV0dG9uKQotICAgICAgICAgICAgbV9wQnV0dG9uLT5Nb3ZlKHJjQnV0dG9uLFRSVUUsRkFMU0UpOwotCi0gICAgICAgIGlmIChtX3BFZGl0KQotICAgICAgICAgICAgbV9wRWRpdC0+TW92ZShyY0VkaXQsVFJVRSxGQUxTRSk7Ci0KLSAgICAgICAgaWYgKG1fcExpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcExpc3QtPlNldFZpc2libGUoVFJVRSk7Ci0gICAgICAgICAgICBtX3BMaXN0LT5Nb3ZlKHJjTGlzdCxUUlVFLEZBTFNFKTsKLSAgICAgICAgICAgIG1fcExpc3QtPlNjcm9sbFRvTGlzdEl0ZW0obV9uU2VsZWN0SXRlbSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgaWYgKGNwLmR3RmxhZ3MgJiBQV1NfQVVUT0ZPTlRTSVpFKQorICAgICAgbGNwLmZGb250U2l6ZSA9IFBXTENCX0RFRkFVTFRGT05UU0laRTsKICAgICBlbHNlCi0gICAgewotICAgICAgICBDUERGX1JlY3QgcmNCdXR0b24gPSByY0NsaWVudDsKKyAgICAgIGxjcC5mRm9udFNpemUgPSBjcC5mRm9udFNpemU7CiAKKyAgICBpZiAoY3Auc0JvcmRlckNvbG9yLm5Db2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKQorICAgICAgbGNwLnNCb3JkZXJDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7CisKKyAgICBpZiAoY3Auc0JhY2tncm91bmRDb2xvci5uQ29sb3JUeXBlID09IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkKKyAgICAgIGxjcC5zQmFja2dyb3VuZENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKKworICAgIG1fcExpc3QtPkNyZWF0ZShsY3ApOworICB9Cit9CisKK3ZvaWQgQ1BXTF9Db21ib0JveDo6UmVQb3NDaGlsZFduZCgpIHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworCisgIGlmIChtX2JQb3B1cCkgeworICAgIENQREZfUmVjdCByY2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICAgIENQREZfUmVjdCByY0J1dHRvbiA9IHJjbGllbnQ7CisgICAgQ1BERl9SZWN0IHJjRWRpdCA9IHJjQ2xpZW50OworICAgIENQREZfUmVjdCByY0xpc3QgPSBDUFdMX1duZDo6R2V0V2luZG93UmVjdCgpOworCisgICAgRlhfRkxPQVQgZk9sZFdpbmRvd0hlaWdodCA9IG1fcmNPbGRXaW5kb3cuSGVpZ2h0KCk7CisgICAgRlhfRkxPQVQgZk9sZENsaWVudEhlaWdodCA9IGZPbGRXaW5kb3dIZWlnaHQgLSBHZXRCb3JkZXJXaWR0aCgpICogMjsKKworICAgIHN3aXRjaCAobV9uUG9wdXBXaGVyZSkgeworICAgICAgY2FzZSAwOgogICAgICAgICByY0J1dHRvbi5sZWZ0ID0gcmNCdXR0b24ucmlnaHQgLSBQV0xfQ09NQk9CT1hfQlVUVE9OX1dJRFRIOwogCi0gICAgICAgIGlmIChyY0J1dHRvbi5sZWZ0IDwgcmNDbGllbnQubGVmdCkKLSAgICAgICAgICAgIHJjQnV0dG9uLmxlZnQgPSByY0NsaWVudC5sZWZ0OworICAgICAgICBpZiAocmNCdXR0b24ubGVmdCA8IHJjbGllbnQubGVmdCkKKyAgICAgICAgICByY0J1dHRvbi5sZWZ0ID0gcmNsaWVudC5sZWZ0OwogCi0gICAgICAgIGlmIChtX3BCdXR0b24pCi0gICAgICAgICAgICBtX3BCdXR0b24tPk1vdmUocmNCdXR0b24sVFJVRSxGQUxTRSk7CisgICAgICAgIHJjQnV0dG9uLmJvdHRvbSA9IHJjQnV0dG9uLnRvcCAtIGZPbGRDbGllbnRIZWlnaHQ7CiAKLSAgICAgICAgQ1BERl9SZWN0IHJjRWRpdCA9IHJjQ2xpZW50OwogICAgICAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0IC0gMS4wZjsKIAotICAgICAgICBpZiAocmNFZGl0LmxlZnQgPCByY0NsaWVudC5sZWZ0KQotICAgICAgICAgICAgcmNFZGl0LmxlZnQgPSByY0NsaWVudC5sZWZ0OworICAgICAgICBpZiAocmNFZGl0LmxlZnQgPCByY2xpZW50LmxlZnQpCisgICAgICAgICAgcmNFZGl0LmxlZnQgPSByY2xpZW50LmxlZnQ7CiAKICAgICAgICAgaWYgKHJjRWRpdC5yaWdodCA8IHJjRWRpdC5sZWZ0KQotICAgICAgICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNFZGl0LmxlZnQ7CisgICAgICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNFZGl0LmxlZnQ7CiAKLSAgICAgICAgaWYgKG1fcEVkaXQpCi0gICAgICAgICAgICBtX3BFZGl0LT5Nb3ZlKHJjRWRpdCxUUlVFLEZBTFNFKTsKKyAgICAgICAgcmNFZGl0LmJvdHRvbSA9IHJjRWRpdC50b3AgLSBmT2xkQ2xpZW50SGVpZ2h0OwogCi0gICAgICAgIGlmIChtX3BMaXN0KQotICAgICAgICAgICAgbV9wTGlzdC0+U2V0VmlzaWJsZShGQUxTRSk7Ci0gICAgfQotfQorICAgICAgICByY0xpc3QudG9wIC09IGZPbGRXaW5kb3dIZWlnaHQ7CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6U2VsZWN0QWxsKCkKLXsKLSAgICBpZiAobV9wRWRpdCAmJiBIYXNGbGFnKFBDQlNfQUxMT1dDVVNUT01URVhUKSkKLSAgICAgICAgbV9wRWRpdC0+U2VsZWN0QWxsKCk7Ci19Ci0KLUNQREZfUmVjdCBDUFdMX0NvbWJvQm94OjpHZXRGb2N1c1JlY3QoKSBjb25zdAotewotICAgIHJldHVybiBDUERGX1JlY3QoKTsKLX0KLQotdm9pZCBDUFdMX0NvbWJvQm94OjpTZXRQb3B1cChGWF9CT09MIGJQb3B1cCkKLXsKLQlpZiAoIW1fcExpc3QpIHJldHVybjsKLQlpZiAoYlBvcHVwID09IG1fYlBvcHVwKSByZXR1cm47Ci0JRlhfRkxPQVQgZkxpc3RIZWlnaHQgPSBtX3BMaXN0LT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwotCWlmICghSXNGbG9hdEJpZ2dlcihmTGlzdEhlaWdodCwwLjBmKSkgcmV0dXJuOwotCi0JaWYgKGJQb3B1cCkKLQl7Ci0JCWlmIChtX3BGaWxsZXJOb3RpZnkpCi0JCXsKLQkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQkJCW1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFByZU9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCAwKTsKLQkJCWlmIChiRXhpdCkgcmV0dXJuOwotCi0JCQlpbnQzMl90IG5XaGVyZSA9IDA7Ci0JCQlGWF9GTE9BVCBmUG9wdXBSZXQgPSAwLjBmOwotCQkJRlhfRkxPQVQgZlBvcHVwTWluID0gMC4wZjsKLQkJCWlmIChtX3BMaXN0LT5HZXRDb3VudCgpID4gMykKLQkJCQlmUG9wdXBNaW4gPSBtX3BMaXN0LT5HZXRGaXJzdEhlaWdodCgpICogMyArIG1fcExpc3QtPkdldEJvcmRlcldpZHRoKCkgKiAyOwotCQkJRlhfRkxPQVQgZlBvcHVwTWF4ID0gZkxpc3RIZWlnaHQgKyBtX3BMaXN0LT5HZXRCb3JkZXJXaWR0aCgpICogMjsKLQkJCW1fcEZpbGxlck5vdGlmeS0+UXVlcnlXaGVyZVBvcHVwKEdldEF0dGFjaGVkRGF0YSgpLCBmUG9wdXBNaW4sZlBvcHVwTWF4LG5XaGVyZSxmUG9wdXBSZXQpOwotCi0JCQlpZiAoSXNGbG9hdEJpZ2dlcihmUG9wdXBSZXQsMC4wZikpCi0JCQl7Ci0JCQkJbV9iUG9wdXAgPSBiUG9wdXA7Ci0KLQkJCQlDUERGX1JlY3QgcmNXaW5kb3cgPSBDUFdMX1duZDo6R2V0V2luZG93UmVjdCgpOwotCQkJCW1fcmNPbGRXaW5kb3cgPSByY1dpbmRvdzsKLQkJCQlzd2l0Y2ggKG5XaGVyZSkKLQkJCQl7Ci0JCQkJZGVmYXVsdDoKLQkJCQljYXNlIDA6Ci0JCQkJCXJjV2luZG93LmJvdHRvbSAtPSBmUG9wdXBSZXQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJcmNXaW5kb3cudG9wICs9IGZQb3B1cFJldDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJbV9uUG9wdXBXaGVyZSA9IG5XaGVyZTsKLQkJCQlNb3ZlKHJjV2luZG93LCBUUlVFLCBUUlVFKTsKLQotCQkJCWJFeGl0ID0gRkFMU0U7Ci0JCQkJbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUG9zdE9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCAwKTsKLQkJCQlpZiAoYkV4aXQpIHJldHVybjsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQltX2JQb3B1cCA9IGJQb3B1cDsKLQkJTW92ZShtX3JjT2xkV2luZG93LCBUUlVFLCBUUlVFKTsKLQl9Ci19Ci0KLUZYX0JPT0wgQ1BXTF9Db21ib0JveDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOwotCWlmICghbV9wRWRpdCkgcmV0dXJuIEZBTFNFOwotCi0JbV9uU2VsZWN0SXRlbSA9IC0xOwotCi0Jc3dpdGNoIChuQ2hhcikKLQl7Ci0JY2FzZSBGV0xfVktFWV9VcDoKLQkJaWYgKG1fcExpc3QtPkdldEN1clNlbCgpID4gMCkKLQkJewotCQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCi0JCQlpZiAobV9wRmlsbGVyTm90aWZ5KQotCQkJewotCQkJCW1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFByZU9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCBuRmxhZyk7Ci0JCQkJaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7Ci0JCQkJYkV4aXQgPSBGQUxTRTsKLQkJCQltX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQb3N0T3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIG5GbGFnKTsKLQkJCQlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKLQkJCX0KLQkJCWlmIChtX3BMaXN0LT5PbktleURvd25XaXRoRXhpdChuQ2hhcixiRXhpdCxuRmxhZykpCi0JCQl7Ci0JCQkJaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7Ci0JCQkJU2V0U2VsZWN0VGV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBUUlVFOwotCWNhc2UgRldMX1ZLRVlfRG93bjoKLQkJaWYgKG1fcExpc3QtPkdldEN1clNlbCgpIDwgbV9wTGlzdC0+R2V0Q291bnQoKSAtIDEpCi0JCXsKLQkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQotCQkJaWYgKG1fcEZpbGxlck5vdGlmeSkKLQkJCXsKLQkJCQltX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQcmVPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgbkZsYWcpOwotCQkJCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOwotCQkJCWJFeGl0ID0gRkFMU0U7Ci0JCQkJbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUG9zdE9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCBuRmxhZyk7Ci0JCQkJaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7Ci0JCQl9Ci0JCQlpZiAobV9wTGlzdC0+T25LZXlEb3duV2l0aEV4aXQobkNoYXIsYkV4aXQsbkZsYWcpKQotCQkJewotCQkJCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOwotCQkJCVNldFNlbGVjdFRleHQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlpZiAoSGFzRmxhZyhQQ0JTX0FMTE9XQ1VTVE9NVEVYVCkpCi0JCXJldHVybiBtX3BFZGl0LT5PbktleURvd24obkNoYXIsbkZsYWcpOwotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENQV0xfQ29tYm9Cb3g6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKLXsKLSAgICBpZiAoIW1fcExpc3QpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGlmICghbV9wRWRpdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgbV9uU2VsZWN0SXRlbSA9IC0xOwotCWlmIChIYXNGbGFnKFBDQlNfQUxMT1dDVVNUT01URVhUKSkKLQkJcmV0dXJuIG1fcEVkaXQtPk9uQ2hhcihuQ2hhcixuRmxhZyk7Ci0KLSAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0gICAgaWYgKG1fcEZpbGxlck5vdGlmeSkKLSAgICB7Ci0gICAgICAgIG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFByZU9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCBuRmxhZyk7Ci0gICAgICAgIGlmIChiRXhpdCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBtX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQb3N0T3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIG5GbGFnKTsKLSAgICAgICAgaWYgKGJFeGl0KQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wTGlzdC0+T25DaGFyV2l0aEV4aXQobkNoYXIsYkV4aXQsbkZsYWcpKQotICAgICAgICByZXR1cm4gYkV4aXQ7Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgQ1BXTF9Db21ib0JveDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCi17Ci0gICAgc3dpdGNoIChtc2cpCi0gICAgewotICAgIGNhc2UgUE5NX0xCVVRUT05ET1dOOgotICAgICAgICBpZiAocFduZCA9PSBtX3BCdXR0b24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldFBvcHVwKCFtX2JQb3B1cCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQTk1fTEJVVFRPTlVQOgotICAgICAgICBpZiAobV9wRWRpdCAmJiBtX3BMaXN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFduZCA9PSBtX3BMaXN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFNlbGVjdFRleHQoKTsKLSAgICAgICAgICAgICAgICBTZWxlY3RBbGwoKTsKLSAgICAgICAgICAgICAgICBtX3BFZGl0LT5TZXRGb2N1cygpOwotICAgICAgICAgICAgICAgIFNldFBvcHVwKEZBTFNFKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIGNhc2UgMToKKyAgICAgICAgcmNCdXR0b24ubGVmdCA9IHJjQnV0dG9uLnJpZ2h0IC0gUFdMX0NPTUJPQk9YX0JVVFRPTl9XSURUSDsKKworICAgICAgICBpZiAocmNCdXR0b24ubGVmdCA8IHJjbGllbnQubGVmdCkKKyAgICAgICAgICByY0J1dHRvbi5sZWZ0ID0gcmNsaWVudC5sZWZ0OworCisgICAgICAgIHJjQnV0dG9uLnRvcCA9IHJjQnV0dG9uLmJvdHRvbSArIGZPbGRDbGllbnRIZWlnaHQ7CisKKyAgICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNCdXR0b24ubGVmdCAtIDEuMGY7CisKKyAgICAgICAgaWYgKHJjRWRpdC5sZWZ0IDwgcmNsaWVudC5sZWZ0KQorICAgICAgICAgIHJjRWRpdC5sZWZ0ID0gcmNsaWVudC5sZWZ0OworCisgICAgICAgIGlmIChyY0VkaXQucmlnaHQgPCByY0VkaXQubGVmdCkKKyAgICAgICAgICByY0VkaXQucmlnaHQgPSByY0VkaXQubGVmdDsKKworICAgICAgICByY0VkaXQudG9wID0gcmNFZGl0LmJvdHRvbSArIGZPbGRDbGllbnRIZWlnaHQ7CisKKyAgICAgICAgcmNMaXN0LmJvdHRvbSArPSBmT2xkV2luZG93SGVpZ2h0OworCisgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIENQV0xfV25kOjpPbk5vdGlmeShwV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKKyAgICBpZiAobV9wQnV0dG9uKQorICAgICAgbV9wQnV0dG9uLT5Nb3ZlKHJjQnV0dG9uLCBUUlVFLCBGQUxTRSk7CisKKyAgICBpZiAobV9wRWRpdCkKKyAgICAgIG1fcEVkaXQtPk1vdmUocmNFZGl0LCBUUlVFLCBGQUxTRSk7CisKKyAgICBpZiAobV9wTGlzdCkgeworICAgICAgbV9wTGlzdC0+U2V0VmlzaWJsZShUUlVFKTsKKyAgICAgIG1fcExpc3QtPk1vdmUocmNMaXN0LCBUUlVFLCBGQUxTRSk7CisgICAgICBtX3BMaXN0LT5TY3JvbGxUb0xpc3RJdGVtKG1fblNlbGVjdEl0ZW0pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDUERGX1JlY3QgcmNCdXR0b24gPSByY0NsaWVudDsKKworICAgIHJjQnV0dG9uLmxlZnQgPSByY0J1dHRvbi5yaWdodCAtIFBXTF9DT01CT0JPWF9CVVRUT05fV0lEVEg7CisKKyAgICBpZiAocmNCdXR0b24ubGVmdCA8IHJjQ2xpZW50LmxlZnQpCisgICAgICByY0J1dHRvbi5sZWZ0ID0gcmNDbGllbnQubGVmdDsKKworICAgIGlmIChtX3BCdXR0b24pCisgICAgICBtX3BCdXR0b24tPk1vdmUocmNCdXR0b24sIFRSVUUsIEZBTFNFKTsKKworICAgIENQREZfUmVjdCByY0VkaXQgPSByY0NsaWVudDsKKyAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0IC0gMS4wZjsKKworICAgIGlmIChyY0VkaXQubGVmdCA8IHJjQ2xpZW50LmxlZnQpCisgICAgICByY0VkaXQubGVmdCA9IHJjQ2xpZW50LmxlZnQ7CisKKyAgICBpZiAocmNFZGl0LnJpZ2h0IDwgcmNFZGl0LmxlZnQpCisgICAgICByY0VkaXQucmlnaHQgPSByY0VkaXQubGVmdDsKKworICAgIGlmIChtX3BFZGl0KQorICAgICAgbV9wRWRpdC0+TW92ZShyY0VkaXQsIFRSVUUsIEZBTFNFKTsKKworICAgIGlmIChtX3BMaXN0KQorICAgICAgbV9wTGlzdC0+U2V0VmlzaWJsZShGQUxTRSk7CisgIH0KIH0KIAotRlhfQk9PTCBDUFdMX0NvbWJvQm94OjpJc1BvcHVwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9iUG9wdXA7Ci19Ci0KLXZvaWQgQ1BXTF9Db21ib0JveDo6U2V0U2VsZWN0VGV4dCgpCi17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gbV9wTGlzdC0+R2V0VGV4dCgpOwordm9pZCBDUFdMX0NvbWJvQm94OjpTZWxlY3RBbGwoKSB7CisgIGlmIChtX3BFZGl0ICYmIEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQogICAgIG1fcEVkaXQtPlNlbGVjdEFsbCgpOwotICAgIG1fcEVkaXQtPlJlcGxhY2VTZWwobV9wTGlzdC0+R2V0VGV4dCgpLmNfc3RyKCkpOwotICAgIG1fcEVkaXQtPlNlbGVjdEFsbCgpOwotCi0gICAgbV9uU2VsZWN0SXRlbSA9IG1fcExpc3QtPkdldEN1clNlbCgpOwogfQogCi1GWF9CT09MIENQV0xfQ29tYm9Cb3g6OklzTW9kaWZpZWQoKSBjb25zdAotewotICAgIHJldHVybiBtX3BFZGl0LT5Jc01vZGlmaWVkKCk7CitDUERGX1JlY3QgQ1BXTF9Db21ib0JveDo6R2V0Rm9jdXNSZWN0KCkgY29uc3QgeworICByZXR1cm4gQ1BERl9SZWN0KCk7CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6U2V0RmlsbGVyTm90aWZ5KElQV0xfRmlsbGVyX05vdGlmeSogcE5vdGlmeSkKLXsKLSAgICAgbV9wRmlsbGVyTm90aWZ5ID0gcE5vdGlmeTsKK3ZvaWQgQ1BXTF9Db21ib0JveDo6U2V0UG9wdXAoRlhfQk9PTCBiUG9wdXApIHsKKyAgaWYgKCFtX3BMaXN0KQorICAgIHJldHVybjsKKyAgaWYgKGJQb3B1cCA9PSBtX2JQb3B1cCkKKyAgICByZXR1cm47CisgIEZYX0ZMT0FUIGZMaXN0SGVpZ2h0ID0gbV9wTGlzdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKKyAgaWYgKCFJc0Zsb2F0QmlnZ2VyKGZMaXN0SGVpZ2h0LCAwLjBmKSkKKyAgICByZXR1cm47CiAKLSAgICAgaWYgKG1fcEVkaXQpCi0gICAgICAgICBtX3BFZGl0LT5TZXRGaWxsZXJOb3RpZnkocE5vdGlmeSk7CisgIGlmIChiUG9wdXApIHsKKyAgICBpZiAobV9wRmlsbGVyTm90aWZ5KSB7CisgICAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgICAgICBtX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQcmVPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgMCk7CisgICAgICBpZiAoYkV4aXQpCisgICAgICAgIHJldHVybjsKIAotICAgICBpZiAobV9wTGlzdCkKLSAgICAgICAgIG1fcExpc3QtPlNldEZpbGxlck5vdGlmeShwTm90aWZ5KTsKKyAgICAgIGludDMyX3QgbldoZXJlID0gMDsKKyAgICAgIEZYX0ZMT0FUIGZQb3B1cFJldCA9IDAuMGY7CisgICAgICBGWF9GTE9BVCBmUG9wdXBNaW4gPSAwLjBmOworICAgICAgaWYgKG1fcExpc3QtPkdldENvdW50KCkgPiAzKQorICAgICAgICBmUG9wdXBNaW4gPQorICAgICAgICAgICAgbV9wTGlzdC0+R2V0Rmlyc3RIZWlnaHQoKSAqIDMgKyBtX3BMaXN0LT5HZXRCb3JkZXJXaWR0aCgpICogMjsKKyAgICAgIEZYX0ZMT0FUIGZQb3B1cE1heCA9IGZMaXN0SGVpZ2h0ICsgbV9wTGlzdC0+R2V0Qm9yZGVyV2lkdGgoKSAqIDI7CisgICAgICBtX3BGaWxsZXJOb3RpZnktPlF1ZXJ5V2hlcmVQb3B1cChHZXRBdHRhY2hlZERhdGEoKSwgZlBvcHVwTWluLCBmUG9wdXBNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuV2hlcmUsIGZQb3B1cFJldCk7CisKKyAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKGZQb3B1cFJldCwgMC4wZikpIHsKKyAgICAgICAgbV9iUG9wdXAgPSBiUG9wdXA7CisKKyAgICAgICAgQ1BERl9SZWN0IHJjV2luZG93ID0gQ1BXTF9XbmQ6OkdldFdpbmRvd1JlY3QoKTsKKyAgICAgICAgbV9yY09sZFdpbmRvdyA9IHJjV2luZG93OworICAgICAgICBzd2l0Y2ggKG5XaGVyZSkgeworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcmNXaW5kb3cuYm90dG9tIC09IGZQb3B1cFJldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJjV2luZG93LnRvcCArPSBmUG9wdXBSZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1fblBvcHVwV2hlcmUgPSBuV2hlcmU7CisgICAgICAgIE1vdmUocmNXaW5kb3csIFRSVUUsIFRSVUUpOworCisgICAgICAgIGJFeGl0ID0gRkFMU0U7CisgICAgICAgIG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFBvc3RPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgMCk7CisgICAgICAgIGlmIChiRXhpdCkKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIG1fYlBvcHVwID0gYlBvcHVwOworICAgIE1vdmUobV9yY09sZFdpbmRvdywgVFJVRSwgVFJVRSk7CisgIH0KK30KKworRlhfQk9PTCBDUFdMX0NvbWJvQm94OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKCFtX3BMaXN0KQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFtX3BFZGl0KQorICAgIHJldHVybiBGQUxTRTsKKworICBtX25TZWxlY3RJdGVtID0gLTE7CisKKyAgc3dpdGNoIChuQ2hhcikgeworICAgIGNhc2UgRldMX1ZLRVlfVXA6CisgICAgICBpZiAobV9wTGlzdC0+R2V0Q3VyU2VsKCkgPiAwKSB7CisgICAgICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKworICAgICAgICBpZiAobV9wRmlsbGVyTm90aWZ5KSB7CisgICAgICAgICAgbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUHJlT3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIG5GbGFnKTsKKyAgICAgICAgICBpZiAoYkV4aXQpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgYkV4aXQgPSBGQUxTRTsKKyAgICAgICAgICBtX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQb3N0T3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIG5GbGFnKTsKKyAgICAgICAgICBpZiAoYkV4aXQpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fcExpc3QtPk9uS2V5RG93bldpdGhFeGl0KG5DaGFyLCBiRXhpdCwgbkZsYWcpKSB7CisgICAgICAgICAgaWYgKGJFeGl0KQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIFNldFNlbGVjdFRleHQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBGV0xfVktFWV9Eb3duOgorICAgICAgaWYgKG1fcExpc3QtPkdldEN1clNlbCgpIDwgbV9wTGlzdC0+R2V0Q291bnQoKSAtIDEpIHsKKyAgICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworCisgICAgICAgIGlmIChtX3BGaWxsZXJOb3RpZnkpIHsKKyAgICAgICAgICBtX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQcmVPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgbkZsYWcpOworICAgICAgICAgIGlmIChiRXhpdCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBiRXhpdCA9IEZBTFNFOworICAgICAgICAgIG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFBvc3RPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgbkZsYWcpOworICAgICAgICAgIGlmIChiRXhpdCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9wTGlzdC0+T25LZXlEb3duV2l0aEV4aXQobkNoYXIsIGJFeGl0LCBuRmxhZykpIHsKKyAgICAgICAgICBpZiAoYkV4aXQpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgU2V0U2VsZWN0VGV4dCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmIChIYXNGbGFnKFBDQlNfQUxMT1dDVVNUT01URVhUKSkKKyAgICByZXR1cm4gbV9wRWRpdC0+T25LZXlEb3duKG5DaGFyLCBuRmxhZyk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitGWF9CT09MIENQV0xfQ29tYm9Cb3g6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fcExpc3QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbV9wRWRpdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbV9uU2VsZWN0SXRlbSA9IC0xOworICBpZiAoSGFzRmxhZyhQQ0JTX0FMTE9XQ1VTVE9NVEVYVCkpCisgICAgcmV0dXJuIG1fcEVkaXQtPk9uQ2hhcihuQ2hhciwgbkZsYWcpOworCisgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyAgaWYgKG1fcEZpbGxlck5vdGlmeSkgeworICAgIG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFByZU9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCBuRmxhZyk7CisgICAgaWYgKGJFeGl0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUG9zdE9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCBuRmxhZyk7CisgICAgaWYgKGJFeGl0KQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BMaXN0LT5PbkNoYXJXaXRoRXhpdChuQ2hhciwgYkV4aXQsIG5GbGFnKSkKKyAgICByZXR1cm4gYkV4aXQ7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkIENQV0xfQ29tYm9Cb3g6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7CisgIHN3aXRjaCAobXNnKSB7CisgICAgY2FzZSBQTk1fTEJVVFRPTkRPV046CisgICAgICBpZiAocFduZCA9PSBtX3BCdXR0b24pIHsKKyAgICAgICAgU2V0UG9wdXAoIW1fYlBvcHVwKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQTk1fTEJVVFRPTlVQOgorICAgICAgaWYgKG1fcEVkaXQgJiYgbV9wTGlzdCkgeworICAgICAgICBpZiAocFduZCA9PSBtX3BMaXN0KSB7CisgICAgICAgICAgU2V0U2VsZWN0VGV4dCgpOworICAgICAgICAgIFNlbGVjdEFsbCgpOworICAgICAgICAgIG1fcEVkaXQtPlNldEZvY3VzKCk7CisgICAgICAgICAgU2V0UG9wdXAoRkFMU0UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICB9CisKKyAgQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworfQorCitGWF9CT09MIENQV0xfQ29tYm9Cb3g6OklzUG9wdXAoKSBjb25zdCB7CisgIHJldHVybiBtX2JQb3B1cDsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpTZXRTZWxlY3RUZXh0KCkgeworICBDRlhfV2lkZVN0cmluZyBzd1RleHQgPSBtX3BMaXN0LT5HZXRUZXh0KCk7CisgIG1fcEVkaXQtPlNlbGVjdEFsbCgpOworICBtX3BFZGl0LT5SZXBsYWNlU2VsKG1fcExpc3QtPkdldFRleHQoKS5jX3N0cigpKTsKKyAgbV9wRWRpdC0+U2VsZWN0QWxsKCk7CisKKyAgbV9uU2VsZWN0SXRlbSA9IG1fcExpc3QtPkdldEN1clNlbCgpOworfQorCitGWF9CT09MIENQV0xfQ29tYm9Cb3g6OklzTW9kaWZpZWQoKSBjb25zdCB7CisgIHJldHVybiBtX3BFZGl0LT5Jc01vZGlmaWVkKCk7Cit9CisKK3ZvaWQgQ1BXTF9Db21ib0JveDo6U2V0RmlsbGVyTm90aWZ5KElQV0xfRmlsbGVyX05vdGlmeSogcE5vdGlmeSkgeworICBtX3BGaWxsZXJOb3RpZnkgPSBwTm90aWZ5OworCisgIGlmIChtX3BFZGl0KQorICAgIG1fcEVkaXQtPlNldEZpbGxlck5vdGlmeShwTm90aWZ5KTsKKworICBpZiAobV9wTGlzdCkKKyAgICBtX3BMaXN0LT5TZXRGaWxsZXJOb3RpZnkocE5vdGlmeSk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXQuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0LmNwcAppbmRleCA1OGQ4YTc5Li5lZGVmZDdlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRWRpdC5jcHAKQEAgLTE3LDEzMDEgKzE3LDEyMDkgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0VkaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNQV0xfRWRpdDo6Q1BXTF9FZGl0KCkgOiBtX3BGaWxsZXJOb3RpZnkoTlVMTCksCi0JbV9wU3BlbGxDaGVjayhOVUxMKSwKLQltX2JGb2N1cyhGQUxTRSkKLXsKLQltX3BGb3JtRmlsbGVyID0gTlVMTDsKK0NQV0xfRWRpdDo6Q1BXTF9FZGl0KCkKKyAgICA6IG1fcEZpbGxlck5vdGlmeShOVUxMKSwgbV9wU3BlbGxDaGVjayhOVUxMKSwgbV9iRm9jdXMoRkFMU0UpIHsKKyAgbV9wRm9ybUZpbGxlciA9IE5VTEw7CiB9CiAKLUNQV0xfRWRpdDo6fkNQV0xfRWRpdCgpCi17Ci0JQVNTRVJUKG1fYkZvY3VzID09IEZBTFNFKTsKK0NQV0xfRWRpdDo6fkNQV0xfRWRpdCgpIHsKKyAgQVNTRVJUKG1fYkZvY3VzID09IEZBTFNFKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9FZGl0OjpHZXRDbGFzc05hbWUoKSBjb25zdAotewotCXJldHVybiBQV0xfQ0xBU1NOQU1FX0VESVQ7CitDRlhfQnl0ZVN0cmluZyBDUFdMX0VkaXQ6OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIFBXTF9DTEFTU05BTUVfRURJVDsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6Ok9uRGVzdHJveSgpCi17Cit2b2lkIENQV0xfRWRpdDo6T25EZXN0cm95KCkge30KKwordm9pZCBDUFdMX0VkaXQ6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCkgeworICBDRlhfV2lkZVN0cmluZyBzd1RleHQgPSBjc1RleHQ7CisKKyAgaWYgKEhhc0ZsYWcoUEVTX1JJQ0gpKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc1ZhbHVlID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHN3VGV4dCk7CisKKyAgICBpZiAoQ1hNTF9FbGVtZW50KiBwWE1MID0KKyAgICAgICAgICAgIENYTUxfRWxlbWVudDo6UGFyc2Uoc1ZhbHVlLmNfc3RyKCksIHNWYWx1ZS5HZXRMZW5ndGgoKSkpIHsKKyAgICAgIGludDMyX3QgbkNvdW50ID0gcFhNTC0+Q291bnRDaGlsZHJlbigpOworICAgICAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOworCisgICAgICBzd1RleHQuRW1wdHkoKTsKKworICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKENYTUxfRWxlbWVudCogcFN1YkVsZW1lbnQgPSBwWE1MLT5HZXRFbGVtZW50KGkpKSB7CisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdGFnID0gcFN1YkVsZW1lbnQtPkdldFRhZ05hbWUoKTsKKyAgICAgICAgICBpZiAodGFnLkVxdWFsTm9DYXNlKCJwIikpIHsKKyAgICAgICAgICAgIGludCBuQ2hpbGQgPSBwU3ViRWxlbWVudC0+Q291bnRDaGlsZHJlbigpOworICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dTZWN0aW9uOworICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbkNoaWxkOyBqKyspIHsKKyAgICAgICAgICAgICAgc3dTZWN0aW9uICs9IHBTdWJFbGVtZW50LT5HZXRDb250ZW50KGopOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYkZpcnN0KQorICAgICAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgc3dUZXh0ICs9IEZXTF9WS0VZX1JldHVybjsKKyAgICAgICAgICAgIHN3VGV4dCArPSBzd1NlY3Rpb247CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGRlbGV0ZSBwWE1MOworICAgIH0KKyAgfQorCisgIG1fcEVkaXQtPlNldFRleHQoc3dUZXh0LmNfc3RyKCkpOwogfQogCi12b2lkIENQV0xfRWRpdDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KQotewotCUNGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IGNzVGV4dDsKK3ZvaWQgQ1BXTF9FZGl0OjpSZVBvc0NoaWxkV25kKCkgeworICBpZiAoQ1BXTF9TY3JvbGxCYXIqIHBWU0IgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKKyAgICBDUERGX1JlY3QgcmNXaW5kb3cgPSBtX3JjT2xkV2luZG93OworICAgIENQREZfUmVjdCByY1ZTY3JvbGwgPQorICAgICAgICBDUERGX1JlY3QocmNXaW5kb3cucmlnaHQsIHJjV2luZG93LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgIHJjV2luZG93LnJpZ2h0ICsgUFdMX1NDUk9MTEJBUl9XSURUSCwgcmNXaW5kb3cudG9wKTsKKyAgICBwVlNCLT5Nb3ZlKHJjVlNjcm9sbCwgVFJVRSwgRkFMU0UpOworICB9CiAKLQlpZiAoSGFzRmxhZyhQRVNfUklDSCkpCi0JewotCQlDRlhfQnl0ZVN0cmluZyBzVmFsdWUgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoc3dUZXh0KTsKKyAgaWYgKG1fcEVkaXRDYXJldCAmJiAhSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKKyAgICBtX3BFZGl0Q2FyZXQtPlNldENsaXBSZWN0KENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KAorICAgICAgICBHZXRDbGllbnRSZWN0KCksIDEuMGYpKTsgIC8vKzEgZm9yIGNhcmV0IGJlc2lkZSBib3JkZXIKIAotCQlpZiAoQ1hNTF9FbGVtZW50ICogcFhNTCA9IENYTUxfRWxlbWVudDo6UGFyc2Uoc1ZhbHVlLmNfc3RyKCksIHNWYWx1ZS5HZXRMZW5ndGgoKSkpCi0JCXsKLQkJCWludDMyX3QgbkNvdW50ID0gcFhNTC0+Q291bnRDaGlsZHJlbigpOwotCQkJRlhfQk9PTCBiRmlyc3QgPSBUUlVFOwotCi0JCQlzd1RleHQuRW1wdHkoKTsKLQotCQkJZm9yIChpbnQzMl90IGk9MDsgaTxuQ291bnQ7IGkrKykKLQkJCXsKLQkJCQlpZiAoQ1hNTF9FbGVtZW50ICogcFN1YkVsZW1lbnQgPSBwWE1MLT5HZXRFbGVtZW50KGkpKQotCQkJCXsKLQkJCQkJQ0ZYX0J5dGVTdHJpbmcgdGFnPXBTdWJFbGVtZW50LT5HZXRUYWdOYW1lKCk7Ci0JCSAgIAkJCWlmICh0YWcuRXF1YWxOb0Nhc2UoInAiKSkKLQkJCQkJewotCQkJCQkJaW50IG5DaGlsZCA9IHBTdWJFbGVtZW50LT5Db3VudENoaWxkcmVuKCk7Ci0JCQkJCQlDRlhfV2lkZVN0cmluZyBzd1NlY3Rpb247Ci0JCQkJCQlmb3IoaW50MzJfdCBqPTA7IGo8bkNoaWxkOyBqKyspCi0JCQkJCQl7Ci0JCQkJCQkJc3dTZWN0aW9uICs9IHBTdWJFbGVtZW50LT5HZXRDb250ZW50KGopOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoYkZpcnN0KWJGaXJzdCA9IEZBTFNFOwotCQkJCQkJZWxzZQotCQkJCQkJCXN3VGV4dCArPSBGV0xfVktFWV9SZXR1cm47Ci0JCQkJCQlzd1RleHQgKz0gc3dTZWN0aW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlkZWxldGUgcFhNTDsKLQkJfQotCX0KLQotCW1fcEVkaXQtPlNldFRleHQoc3dUZXh0LmNfc3RyKCkpOworICBDUFdMX0VkaXRDdHJsOjpSZVBvc0NoaWxkV25kKCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpSZVBvc0NoaWxkV25kKCkKLXsKLSAgICBpZiAoQ1BXTF9TY3JvbGxCYXIgKiBwVlNCID0gR2V0VlNjcm9sbEJhcigpKSB7Ci0gICAgICAgIENQREZfUmVjdCByY1dpbmRvdyA9IG1fcmNPbGRXaW5kb3c7Ci0gICAgICAgIENQREZfUmVjdCByY1ZTY3JvbGwgPSBDUERGX1JlY3QocmNXaW5kb3cucmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNXaW5kb3cuYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjV2luZG93LnJpZ2h0ICsgUFdMX1NDUk9MTEJBUl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY1dpbmRvdy50b3ApOwotICAgICAgICBwVlNCLT5Nb3ZlKHJjVlNjcm9sbCwgVFJVRSwgRkFMU0UpOworQ1BERl9SZWN0IENQV0xfRWRpdDo6R2V0Q2xpZW50UmVjdCgpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoCisgICAgICBHZXRXaW5kb3dSZWN0KCksIChGWF9GTE9BVCkoR2V0Qm9yZGVyV2lkdGgoKSArIEdldElubmVyQm9yZGVyV2lkdGgoKSkpOworCisgIGlmIChDUFdMX1Njcm9sbEJhciogcFZTQiA9IEdldFZTY3JvbGxCYXIoKSkgeworICAgIGlmIChwVlNCLT5Jc1Zpc2libGUoKSkgeworICAgICAgcmNDbGllbnQucmlnaHQgLT0gUFdMX1NDUk9MTEJBUl9XSURUSDsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmNDbGllbnQ7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRBbGlnbkZvcm1hdEgoUFdMX0VESVRfQUxJR05GT1JNQVRfSCBuRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCAvKiA9IFRSVUUqLykgeworICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRIKChpbnQzMl90KW5Gb3JtYXQsIGJQYWludCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRBbGlnbkZvcm1hdFYoUFdMX0VESVRfQUxJR05GT1JNQVRfViBuRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCAvKiA9IFRSVUUqLykgeworICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKChpbnQzMl90KW5Gb3JtYXQsIGJQYWludCk7Cit9CisKK0ZYX0JPT0wgQ1BXTF9FZGl0OjpDYW5TZWxlY3RBbGwoKSBjb25zdCB7CisgIHJldHVybiBHZXRTZWxlY3RXb3JkUmFuZ2UoKSAhPSBtX3BFZGl0LT5HZXRXaG9sZVdvcmRSYW5nZSgpOworfQorCitGWF9CT09MIENQV0xfRWRpdDo6Q2FuQ2xlYXIoKSBjb25zdCB7CisgIHJldHVybiAhSXNSZWFkT25seSgpICYmIG1fcEVkaXQtPklzU2VsZWN0ZWQoKTsKK30KKworRlhfQk9PTCBDUFdMX0VkaXQ6OkNhbkNvcHkoKSBjb25zdCB7CisgIHJldHVybiAhSGFzRmxhZyhQRVNfUEFTU1dPUkQpICYmICFIYXNGbGFnKFBFU19OT1JFQUQpICYmCisgICAgICAgICBtX3BFZGl0LT5Jc1NlbGVjdGVkKCk7Cit9CisKK0ZYX0JPT0wgQ1BXTF9FZGl0OjpDYW5DdXQoKSBjb25zdCB7CisgIHJldHVybiBDYW5Db3B5KCkgJiYgIUlzUmVhZE9ubHkoKTsKK30KKworRlhfQk9PTCBDUFdMX0VkaXQ6OkNhblBhc3RlKCkgY29uc3QgeworICBpZiAoSXNSZWFkT25seSgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBDRlhfV2lkZVN0cmluZyBzd0NsaXBib2FyZDsKKyAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCisgICAgc3dDbGlwYm9hcmQgPSBwU0gtPkdldENsaXBib2FyZFRleHQoR2V0QXR0YWNoZWRIV25kKCkpOworCisgIHJldHVybiAhc3dDbGlwYm9hcmQuSXNFbXB0eSgpOworfQorCit2b2lkIENQV0xfRWRpdDo6Q29weVRleHQoKSB7CisgIGlmICghQ2FuQ29weSgpKQorICAgIHJldHVybjsKKworICBDRlhfV2lkZVN0cmluZyBzdHIgPSBtX3BFZGl0LT5HZXRTZWxUZXh0KCk7CisKKyAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCisgICAgcFNILT5TZXRDbGlwYm9hcmRUZXh0KEdldEF0dGFjaGVkSFduZCgpLCBzdHIpOworfQorCit2b2lkIENQV0xfRWRpdDo6UGFzdGVUZXh0KCkgeworICBpZiAoIUNhblBhc3RlKCkpCisgICAgcmV0dXJuOworCisgIENGWF9XaWRlU3RyaW5nIHN3Q2xpcGJvYXJkOworICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKKyAgICBzd0NsaXBib2FyZCA9IHBTSC0+R2V0Q2xpcGJvYXJkVGV4dChHZXRBdHRhY2hlZEhXbmQoKSk7CisKKyAgaWYgKG1fcEZpbGxlck5vdGlmeSkgeworICAgIEZYX0JPT0wgYlJDID0gVFJVRTsKKyAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ2hhbmdlRXg7CisgICAgaW50IG5TZWxTdGFydCA9IDA7CisgICAgaW50IG5TZWxFbmQgPSAwOworICAgIEdldFNlbChuU2VsU3RhcnQsIG5TZWxFbmQpOworICAgIG1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoVFJVRSwgR2V0QXR0YWNoZWREYXRhKCksIDAsIHN3Q2xpcGJvYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSQywgYkV4aXQsIDApOworICAgIGlmICghYlJDKQorICAgICAgcmV0dXJuOworICAgIGlmIChiRXhpdCkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzd0NsaXBib2FyZC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBDbGVhcigpOworICAgIEluc2VydFRleHQoc3dDbGlwYm9hcmQuY19zdHIoKSk7CisgIH0KKworICBpZiAobV9wRmlsbGVyTm90aWZ5KSB7CisgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICAgIG1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZShUUlVFLCBHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIDApOworICAgIGlmIChiRXhpdCkKKyAgICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIENQV0xfRWRpdDo6Q3V0VGV4dCgpIHsKKyAgaWYgKCFDYW5DdXQoKSkKKyAgICByZXR1cm47CisKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gbV9wRWRpdC0+R2V0U2VsVGV4dCgpOworCisgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKQorICAgIHBTSC0+U2V0Q2xpcGJvYXJkVGV4dChHZXRBdHRhY2hlZEhXbmQoKSwgc3RyKTsKKworICBtX3BFZGl0LT5DbGVhcigpOworfQorCit2b2lkIENQV0xfRWRpdDo6T25DcmVhdGVkKCkgeworICBDUFdMX0VkaXRDdHJsOjpPbkNyZWF0ZWQoKTsKKworICBpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGwgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKKyAgICBwU2Nyb2xsLT5SZW1vdmVGbGFnKFBXU19BVVRPVFJBTlNQQVJFTlQpOworICAgIHBTY3JvbGwtPlNldFRyYW5zcGFyZW5jeSgyNTUpOworICB9CisKKyAgU2V0UGFyYW1CeUZsYWcoKTsKKworICBtX3JjT2xkV2luZG93ID0gR2V0V2luZG93UmVjdCgpOworCisgIG1fcEVkaXQtPlNldE9wck5vdGlmeSh0aGlzKTsKKyAgbV9wRWRpdC0+RW5hYmxlT3ByTm90aWZ5KFRSVUUpOworfQorCit2b2lkIENQV0xfRWRpdDo6U2V0UGFyYW1CeUZsYWcoKSB7CisgIGlmIChIYXNGbGFnKFBFU19SSUdIVCkpIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDIsIEZBTFNFKTsKKyAgfSBlbHNlIGlmIChIYXNGbGFnKFBFU19NSURETEUpKSB7CisgICAgbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgxLCBGQUxTRSk7CisgIH0gZWxzZSB7CisgICAgbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgwLCBGQUxTRSk7CisgIH0KKworICBpZiAoSGFzRmxhZyhQRVNfQk9UVE9NKSkgeworICAgIG1fcEVkaXQtPlNldEFsaWdubWVudFYoMiwgRkFMU0UpOworICB9IGVsc2UgaWYgKEhhc0ZsYWcoUEVTX0NFTlRFUikpIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEsIEZBTFNFKTsKKyAgfSBlbHNlIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDAsIEZBTFNFKTsKKyAgfQorCisgIGlmIChIYXNGbGFnKFBFU19QQVNTV09SRCkpIHsKKyAgICBtX3BFZGl0LT5TZXRQYXNzd29yZENoYXIoJyonLCBGQUxTRSk7CisgIH0KKworICBtX3BFZGl0LT5TZXRNdWx0aUxpbmUoSGFzRmxhZyhQRVNfTVVMVElMSU5FKSwgRkFMU0UpOworICBtX3BFZGl0LT5TZXRBdXRvUmV0dXJuKEhhc0ZsYWcoUEVTX0FVVE9SRVRVUk4pLCBGQUxTRSk7CisgIG1fcEVkaXQtPlNldEF1dG9Gb250U2l6ZShIYXNGbGFnKFBXU19BVVRPRk9OVFNJWkUpLCBGQUxTRSk7CisgIG1fcEVkaXQtPlNldEF1dG9TY3JvbGwoSGFzRmxhZyhQRVNfQVVUT1NDUk9MTCksIEZBTFNFKTsKKyAgbV9wRWRpdC0+RW5hYmxlVW5kbyhIYXNGbGFnKFBFU19VTkRPKSk7CisKKyAgaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpIHsKKyAgICBTZXRDbGlwUmVjdChDUERGX1JlY3QoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOworICAgIG1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyhUUlVFLCBGQUxTRSk7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEVkaXRDYXJldCkgeworICAgICAgbV9wRWRpdENhcmV0LT5TZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdCgKKyAgICAgICAgICBHZXRDbGllbnRSZWN0KCksIDEuMGYpKTsgIC8vKzEgZm9yIGNhcmV0IGJlc2lkZSBib3JkZXIKKyAgICB9CisgIH0KKworICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKKyAgICBtX3BTcGVsbENoZWNrID0gR2V0Q3JlYXRpb25QYXJhbSgpLnBTcGVsbENoZWNrOworICB9Cit9CisKK3ZvaWQgQ1BXTF9FZGl0OjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKKyAgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOworCisgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNMaW5lOworCisgIGludDMyX3QgbkNoYXJBcnJheSA9IG1fcEVkaXQtPkdldENoYXJBcnJheSgpOworCisgIGlmIChuQ2hhckFycmF5ID4gMCkgeworICAgIHN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkgeworICAgICAgY2FzZSBQQlNfU09MSUQ6IHsKKyAgICAgICAgc0xpbmUgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKKyAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyQ29sb3IoKSwgRkFMU0UpCisgICAgICAgICAgICAgIDw8ICIgMiBKIDAgalxuIjsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBuQ2hhckFycmF5OyBpKyspIHsKKyAgICAgICAgICBzTGluZSA8PCByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbkNoYXJBcnJheSkgKiBpCisgICAgICAgICAgICAgICAgPDwgIiAiIDw8IHJjQ2xpZW50LmJvdHRvbSA8PCAiIG1cbiIKKyAgICAgICAgICAgICAgICA8PCByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbkNoYXJBcnJheSkgKiBpCisgICAgICAgICAgICAgICAgPDwgIiAiIDw8IHJjQ2xpZW50LnRvcCA8PCAiIGwgU1xuIjsKKyAgICAgICAgfQorCisgICAgICAgIHNMaW5lIDw8ICJRXG4iOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgUEJTX0RBU0g6IHsKKyAgICAgICAgc0xpbmUgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKKyAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyQ29sb3IoKSwgRkFMU0UpCisgICAgICAgICAgICAgIDw8ICIgMiBKIDAgalxuIgorICAgICAgICAgICAgICA8PCAiWyIgPDwgR2V0Qm9yZGVyRGFzaCgpLm5EYXNoIDw8ICIgIiA8PCBHZXRCb3JkZXJEYXNoKCkubkdhcAorICAgICAgICAgICAgICA8PCAiXSAiIDw8IEdldEJvcmRlckRhc2goKS5uUGhhc2UgPDwgIiBkXG4iOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IG5DaGFyQXJyYXk7IGkrKykgeworICAgICAgICAgIHNMaW5lIDw8IHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgICAgICAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkgLyBuQ2hhckFycmF5KSAqIGkKKyAgICAgICAgICAgICAgICA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgbVxuIgorICAgICAgICAgICAgICAgIDw8IHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgICAgICAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkgLyBuQ2hhckFycmF5KSAqIGkKKyAgICAgICAgICAgICAgICA8PCAiICIgPDwgcmNDbGllbnQudG9wIDw8ICIgbCBTXG4iOworICAgICAgICB9CisKKyAgICAgICAgc0xpbmUgPDwgIlFcbiI7CisgICAgICB9IGJyZWFrOworICAgIH0KKyAgfQorCisgIHNBcHBTdHJlYW0gPDwgc0xpbmU7CisKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNUZXh0OworCisgIENQREZfUG9pbnQgcHRPZmZzZXQgPSBDUERGX1BvaW50KDAuMGYsIDAuMGYpOworCisgIENQVlRfV29yZFJhbmdlIHdyV2hvbGUgPSBtX3BFZGl0LT5HZXRXaG9sZVdvcmRSYW5nZSgpOworICBDUFZUX1dvcmRSYW5nZSB3clNlbGVjdCA9IEdldFNlbGVjdFdvcmRSYW5nZSgpOworICBDUFZUX1dvcmRSYW5nZSB3clZpc2libGUgPQorICAgICAgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgPyB3cldob2xlIDogbV9wRWRpdC0+R2V0VmlzaWJsZVdvcmRSYW5nZSgpKTsKKyAgQ1BWVF9Xb3JkUmFuZ2Ugd3JTZWxCZWZvcmUod3JXaG9sZS5CZWdpblBvcywgd3JTZWxlY3QuQmVnaW5Qb3MpOworICBDUFZUX1dvcmRSYW5nZSB3clNlbEFmdGVyKHdyU2VsZWN0LkVuZFBvcywgd3JXaG9sZS5FbmRQb3MpOworCisgIENQVlRfV29yZFJhbmdlIHdyVGVtcCA9CisgICAgICBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKEdldFNlbGVjdFdvcmRSYW5nZSgpLCB3clZpc2libGUpOworICBDRlhfQnl0ZVN0cmluZyBzRWRpdFNlbCA9CisgICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0U2VsQXBwU3RyZWFtKG1fcEVkaXQsIHB0T2Zmc2V0LCAmd3JUZW1wKTsKKworICBpZiAoc0VkaXRTZWwuR2V0TGVuZ3RoKCkgPiAwKQorICAgIHNUZXh0IDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKFBXTF9ERUZBVUxUX1NFTEJBQ0tDT0xPUikKKyAgICAgICAgICA8PCBzRWRpdFNlbDsKKworICB3clRlbXAgPSBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKHdyVmlzaWJsZSwgd3JTZWxCZWZvcmUpOworICBDRlhfQnl0ZVN0cmluZyBzRWRpdEJlZm9yZSA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0oCisgICAgICBtX3BFZGl0LCBwdE9mZnNldCwgJndyVGVtcCwgIUhhc0ZsYWcoUEVTX0NIQVJBUlJBWSksCisgICAgICBtX3BFZGl0LT5HZXRQYXNzd29yZENoYXIoKSk7CisKKyAgaWYgKHNFZGl0QmVmb3JlLkdldExlbmd0aCgpID4gMCkKKyAgICBzVGV4dCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0VGV4dENvbG9yKCkpCisgICAgICAgICAgPDwgc0VkaXRCZWZvcmUgPDwgIkVUXG4iOworCisgIHdyVGVtcCA9IENQV0xfVXRpbHM6Ok92ZXJsYXBXb3JkUmFuZ2Uod3JWaXNpYmxlLCB3clNlbGVjdCk7CisgIENGWF9CeXRlU3RyaW5nIHNFZGl0TWlkID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbSgKKyAgICAgIG1fcEVkaXQsIHB0T2Zmc2V0LCAmd3JUZW1wLCAhSGFzRmxhZyhQRVNfQ0hBUkFSUkFZKSwKKyAgICAgIG1fcEVkaXQtPkdldFBhc3N3b3JkQ2hhcigpKTsKKworICBpZiAoc0VkaXRNaWQuR2V0TGVuZ3RoKCkgPiAwKQorICAgIHNUZXh0IDw8ICJCVFxuIgorICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpKQorICAgICAgICAgIDw8IHNFZGl0TWlkIDw8ICJFVFxuIjsKKworICB3clRlbXAgPSBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKHdyVmlzaWJsZSwgd3JTZWxBZnRlcik7CisgIENGWF9CeXRlU3RyaW5nIHNFZGl0QWZ0ZXIgPSBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKAorICAgICAgbV9wRWRpdCwgcHRPZmZzZXQsICZ3clRlbXAsICFIYXNGbGFnKFBFU19DSEFSQVJSQVkpLAorICAgICAgbV9wRWRpdC0+R2V0UGFzc3dvcmRDaGFyKCkpOworCisgIGlmIChzRWRpdEFmdGVyLkdldExlbmd0aCgpID4gMCkKKyAgICBzVGV4dCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0VGV4dENvbG9yKCkpCisgICAgICAgICAgPDwgc0VkaXRBZnRlciA8PCAiRVRcbiI7CisKKyAgaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc1NwZWxsQ2hlY2sgPSBDUFdMX1V0aWxzOjpHZXRTcGVsbENoZWNrQXBwU3RyZWFtKAorICAgICAgICBtX3BFZGl0LCBtX3BTcGVsbENoZWNrLCBwdE9mZnNldCwgJndyVmlzaWJsZSk7CisgICAgaWYgKHNTcGVsbENoZWNrLkdldExlbmd0aCgpID4gMCkKKyAgICAgIHNUZXh0IDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMSwgMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSkKKyAgICAgICAgICAgIDw8IHNTcGVsbENoZWNrOworICB9CisKKyAgaWYgKHNUZXh0LkdldExlbmd0aCgpID4gMCkgeworICAgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKyAgICBzQXBwU3RyZWFtIDw8ICJxXG4vVHggQk1DXG4iOworCisgICAgaWYgKCFIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKQorICAgICAgc0FwcFN0cmVhbSA8PCByY0NsaWVudC5sZWZ0IDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8IHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgcmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tIDw8ICIgcmUgVyBuXG4iOworCisgICAgc0FwcFN0cmVhbSA8PCBzVGV4dDsKKworICAgIHNBcHBTdHJlYW0gPDwgIkVNQ1xuUVxuIjsKKyAgfQorfQorCit2b2lkIENQV0xfRWRpdDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOworCisgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNMaW5lOworCisgIGludDMyX3QgbkNoYXJBcnJheSA9IG1fcEVkaXQtPkdldENoYXJBcnJheSgpOworICBGWF9TQUZFX0lOVDMyIG5DaGFyQXJyYXlTYWZlID0gbkNoYXJBcnJheTsKKyAgbkNoYXJBcnJheVNhZmUgLT0gMTsKKyAgbkNoYXJBcnJheVNhZmUgKj0gMjsKKworICBpZiAobkNoYXJBcnJheSA+IDAgJiYgbkNoYXJBcnJheVNhZmUuSXNWYWxpZCgpKSB7CisgICAgc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKSB7CisgICAgICBjYXNlIFBCU19TT0xJRDogeworICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICAgICAgICBnc2QubV9MaW5lV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKKworICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgICAgICAgcGF0aC5TZXRQb2ludENvdW50KG5DaGFyQXJyYXlTYWZlLlZhbHVlT3JEaWUoKSk7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNoYXJBcnJheSAtIDE7IGkrKykgeworICAgICAgICAgIHBhdGguU2V0UG9pbnQoCisgICAgICAgICAgICAgIGkgKiAyLAorICAgICAgICAgICAgICByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogKGkgKyAxKSwKKyAgICAgICAgICAgICAgcmNDbGllbnQuYm90dG9tLCBGWFBUX01PVkVUTyk7CisgICAgICAgICAgcGF0aC5TZXRQb2ludCgKKyAgICAgICAgICAgICAgaSAqIDIgKyAxLAorICAgICAgICAgICAgICByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogKGkgKyAxKSwKKyAgICAgICAgICAgICAgcmNDbGllbnQudG9wLCBGWFBUX0xJTkVUTyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhdGguR2V0UG9pbnRDb3VudCgpID4gMCkKKyAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgKKyAgICAgICAgICAgICAgJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwKKyAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0Qm9yZGVyQ29sb3IoKSwgMjU1KSwKKyAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBQQlNfREFTSDogeworICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICAgICAgICBnc2QubV9MaW5lV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKKworICAgICAgICBnc2QuU2V0RGFzaENvdW50KDIpOworICAgICAgICBnc2QubV9EYXNoQXJyYXlbMF0gPSAoRlhfRkxPQVQpR2V0Qm9yZGVyRGFzaCgpLm5EYXNoOworICAgICAgICBnc2QubV9EYXNoQXJyYXlbMV0gPSAoRlhfRkxPQVQpR2V0Qm9yZGVyRGFzaCgpLm5HYXA7CisgICAgICAgIGdzZC5tX0Rhc2hQaGFzZSA9IChGWF9GTE9BVClHZXRCb3JkZXJEYXNoKCkublBoYXNlOworCisgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOworICAgICAgICBwYXRoLlNldFBvaW50Q291bnQobkNoYXJBcnJheVNhZmUuVmFsdWVPckRpZSgpKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ2hhckFycmF5IC0gMTsgaSsrKSB7CisgICAgICAgICAgcGF0aC5TZXRQb2ludCgKKyAgICAgICAgICAgICAgaSAqIDIsCisgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbkNoYXJBcnJheSkgKiAoaSArIDEpLAorICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20sIEZYUFRfTU9WRVRPKTsKKyAgICAgICAgICBwYXRoLlNldFBvaW50KAorICAgICAgICAgICAgICBpICogMiArIDEsCisgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbkNoYXJBcnJheSkgKiAoaSArIDEpLAorICAgICAgICAgICAgICByY0NsaWVudC50b3AsIEZYUFRfTElORVRPKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGF0aC5HZXRQb2ludENvdW50KCkgPiAwKQorICAgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKAorICAgICAgICAgICAgICAmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLAorICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRCb3JkZXJDb2xvcigpLCAyNTUpLAorICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFKTsKKyAgICAgIH0gYnJlYWs7CisgICAgfQorICB9CisKKyAgQ1BERl9SZWN0IHJjQ2xpcDsKKyAgQ1BWVF9Xb3JkUmFuZ2Ugd3JSYW5nZSA9IG1fcEVkaXQtPkdldFZpc2libGVXb3JkUmFuZ2UoKTsKKyAgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEw7CisKKyAgaWYgKCFIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKSB7CisgICAgcmNDbGlwID0gR2V0Q2xpZW50UmVjdCgpOworICAgIHBSYW5nZSA9ICZ3clJhbmdlOworICB9CisgIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKTsKKyAgSUZYX0VkaXQ6OkRyYXdFZGl0KAorICAgICAgcERldmljZSwgcFVzZXIyRGV2aWNlLCBtX3BFZGl0LAorICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwKKyAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRTdHJva2VDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksCisgICAgICByY0NsaXAsIENQREZfUG9pbnQoMC4wZiwgMC4wZiksIHBSYW5nZSwgcFN5c0hhbmRsZXIsIG1fcEZvcm1GaWxsZXIpOworCisgIGlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkgeworICAgIENQV0xfVXRpbHM6OkRyYXdFZGl0U3BlbGxDaGVjayhwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fcEVkaXQsIHJjQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludCgwLjBmLCAwLjBmKSwgcFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDcmVhdGlvblBhcmFtKCkucFNwZWxsQ2hlY2spOworICB9Cit9CisKK0ZYX0JPT0wgQ1BXTF9FZGl0OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOworCisgIGlmIChIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpIHx8IENsaWVudEhpdFRlc3QocG9pbnQpKSB7CisgICAgaWYgKG1fYk1vdXNlRG93bikKKyAgICAgIEludmFsaWRhdGVSZWN0KCk7CisKKyAgICBtX2JNb3VzZURvd24gPSBUUlVFOworICAgIFNldENhcHR1cmUoKTsKKworICAgIG1fcEVkaXQtPk9uTW91c2VEb3duKHBvaW50LCBJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQV0xfRWRpdDo6T25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uRGJsQ2xrKHBvaW50LCBuRmxhZyk7CisKKyAgaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgfHwgQ2xpZW50SGl0VGVzdChwb2ludCkpIHsKKyAgICBtX3BFZGl0LT5TZWxlY3RBbGwoKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZGVmaW5lIFdNX1BXTEVESVRfVU5ETyAweDAxCisjZGVmaW5lIFdNX1BXTEVESVRfUkVETyAweDAyCisjZGVmaW5lIFdNX1BXTEVESVRfQ1VUIDB4MDMKKyNkZWZpbmUgV01fUFdMRURJVF9DT1BZIDB4MDQKKyNkZWZpbmUgV01fUFdMRURJVF9QQVNURSAweDA1CisjZGVmaW5lIFdNX1BXTEVESVRfREVMRVRFIDB4MDYKKyNkZWZpbmUgV01fUFdMRURJVF9TRUxFQ1RBTEwgMHgwNworI2RlZmluZSBXTV9QV0xFRElUX1NVR0dFU1QgMHgwOAorCitGWF9CT09MIENQV0xfRWRpdDo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmIChtX2JNb3VzZURvd24pCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQV0xfV25kOjpPblJCdXR0b25VcChwb2ludCwgbkZsYWcpOworCisgIGlmICghSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSAmJiAhQ2xpZW50SGl0VGVzdChwb2ludCkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKTsKKyAgaWYgKCFwU0gpCisgICAgcmV0dXJuIEZBTFNFOworCisgIFNldEZvY3VzKCk7CisKKyAgQ1BWVF9Xb3JkUmFuZ2Ugd3JMYXRpbiA9IEdldExhdGluV29yZHNSYW5nZShwb2ludCk7CisgIENGWF9XaWRlU3RyaW5nIHN3TGF0aW4gPSBtX3BFZGl0LT5HZXRSYW5nZVRleHQod3JMYXRpbik7CisKKyAgRlhfSE1FTlUgaFBvcHVwID0gcFNILT5DcmVhdGVQb3B1cE1lbnUoKTsKKyAgaWYgKCFoUG9wdXApCisgICAgcmV0dXJuIEZBTFNFOworCisgIENGWF9CeXRlU3RyaW5nQXJyYXkgc1N1Z2dlc3RXb3JkczsKKyAgQ1BERl9Qb2ludCBwdFBvcHVwID0gcG9pbnQ7CisKKyAgaWYgKCFJc1JlYWRPbmx5KCkpIHsKKyAgICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykgJiYgIXN3TGF0aW4uSXNFbXB0eSgpKSB7CisgICAgICBpZiAobV9wU3BlbGxDaGVjaykgeworICAgICAgICBDRlhfQnl0ZVN0cmluZyBzTGF0aW4gPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoc3dMYXRpbik7CisKKyAgICAgICAgaWYgKCFtX3BTcGVsbENoZWNrLT5DaGVja1dvcmQoc0xhdGluKSkgeworICAgICAgICAgIG1fcFNwZWxsQ2hlY2stPlN1Z2dlc3RXb3JkcyhzTGF0aW4sIHNTdWdnZXN0V29yZHMpOworCisgICAgICAgICAgaW50MzJfdCBuU3VnZ2VzdCA9IHNTdWdnZXN0V29yZHMuR2V0U2l6ZSgpOworCisgICAgICAgICAgZm9yIChpbnQzMl90IG5Xb3JkID0gMDsgbldvcmQgPCBuU3VnZ2VzdDsgbldvcmQrKykgeworICAgICAgICAgICAgcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfU1VHR0VTVCArIG5Xb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzU3VnZ2VzdFdvcmRzW25Xb3JkXS5VVEY4RGVjb2RlKCkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChuU3VnZ2VzdCA+IDApCisgICAgICAgICAgICBwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgMCwgTCIiKTsKKworICAgICAgICAgIHB0UG9wdXAgPSBHZXRXb3JkUmlnaHRCb3R0b21Qb2ludCh3ckxhdGluLkVuZFBvcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBJUFdMX1Byb3ZpZGVyKiBwUHJvdmlkZXIgPSBHZXRQcm92aWRlcigpOworCisgIGlmIChIYXNGbGFnKFBFU19VTkRPKSkgeworICAgIHBTSC0+QXBwZW5kTWVudUl0ZW0oCisgICAgICAgIGhQb3B1cCwgV01fUFdMRURJVF9VTkRPLAorICAgICAgICBwUHJvdmlkZXIgPyBwUHJvdmlkZXItPkxvYWRQb3B1cE1lbnVTdHJpbmcoMCkgOiBMIiZVbmRvIik7CisgICAgcFNILT5BcHBlbmRNZW51SXRlbSgKKyAgICAgICAgaFBvcHVwLCBXTV9QV0xFRElUX1JFRE8sCisgICAgICAgIHBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZygxKSA6IEwiJlJlZG8iKTsKKyAgICBwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgMCwgTCIiKTsKKworICAgIGlmICghbV9wRWRpdC0+Q2FuVW5kbygpKQorICAgICAgcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfVU5ETywgRkFMU0UpOworICAgIGlmICghbV9wRWRpdC0+Q2FuUmVkbygpKQorICAgICAgcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUkVETywgRkFMU0UpOworICB9CisKKyAgcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULAorICAgICAgICAgICAgICAgICAgICAgIHBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZygyKSA6IEwiQ3UmdCIpOworICBwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLAorICAgICAgICAgICAgICAgICAgICAgIHBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZygzKSA6IEwiJkNvcHkiKTsKKyAgcFNILT5BcHBlbmRNZW51SXRlbSgKKyAgICAgIGhQb3B1cCwgV01fUFdMRURJVF9QQVNURSwKKyAgICAgIHBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZyg0KSA6IEwiJlBhc3RlIik7CisgIHBTSC0+QXBwZW5kTWVudUl0ZW0oCisgICAgICBoUG9wdXAsIFdNX1BXTEVESVRfREVMRVRFLAorICAgICAgcFByb3ZpZGVyID8gcFByb3ZpZGVyLT5Mb2FkUG9wdXBNZW51U3RyaW5nKDUpIDogTCImRGVsZXRlIik7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gcFNILT5HZXRDbGlwYm9hcmRUZXh0KEdldEF0dGFjaGVkSFduZCgpKTsKKyAgaWYgKHN3VGV4dC5Jc0VtcHR5KCkpCisgICAgcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsIEZBTFNFKTsKKworICBpZiAoIW1fcEVkaXQtPklzU2VsZWN0ZWQoKSkgeworICAgIHBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgRkFMU0UpOworICAgIHBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIEZBTFNFKTsKKyAgICBwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9ERUxFVEUsIEZBTFNFKTsKKyAgfQorCisgIGlmIChJc1JlYWRPbmx5KCkpIHsKKyAgICBwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsIEZBTFNFKTsKKyAgICBwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9ERUxFVEUsIEZBTFNFKTsKKyAgICBwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9QQVNURSwgRkFMU0UpOworICB9CisKKyAgaWYgKEhhc0ZsYWcoUEVTX1BBU1NXT1JEKSkgeworICAgIHBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgRkFMU0UpOworICAgIHBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIEZBTFNFKTsKKyAgfQorCisgIGlmIChIYXNGbGFnKFBFU19OT1JFQUQpKSB7CisgICAgcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBGQUxTRSk7CisgICAgcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ09QWSwgRkFMU0UpOworICB9CisKKyAgcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIDAsIEwiIik7CisgIHBTSC0+QXBwZW5kTWVudUl0ZW0oCisgICAgICBoUG9wdXAsIFdNX1BXTEVESVRfU0VMRUNUQUxMLAorICAgICAgcFByb3ZpZGVyID8gcFByb3ZpZGVyLT5Mb2FkUG9wdXBNZW51U3RyaW5nKDYpIDogTCImU2VsZWN0IEFsbCIpOworCisgIGlmIChtX3BFZGl0LT5HZXRUb3RhbFdvcmRzKCkgPT0gMCkgeworICAgIHBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1NFTEVDVEFMTCwgRkFMU0UpOworICB9CisKKyAgaW50MzJfdCB4LCB5OworICBQV0x0b1duZChwdFBvcHVwLCB4LCB5KTsKKyAgcFNILT5DbGllbnRUb1NjcmVlbihHZXRBdHRhY2hlZEhXbmQoKSwgeCwgeSk7CisgIHBTSC0+U2V0Q3Vyc29yKEZYQ1RfQVJST1cpOworICBpbnQzMl90IG5DbWQgPSBwU0gtPlRyYWNrUG9wdXBNZW51KGhQb3B1cCwgeCwgeSwgR2V0QXR0YWNoZWRIV25kKCkpOworCisgIHN3aXRjaCAobkNtZCkgeworICAgIGNhc2UgV01fUFdMRURJVF9VTkRPOgorICAgICAgVW5kbygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9QV0xFRElUX1JFRE86CisgICAgICBSZWRvKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdNX1BXTEVESVRfQ1VUOgorICAgICAgQ3V0VGV4dCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9QV0xFRElUX0NPUFk6CisgICAgICBDb3B5VGV4dCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9QV0xFRElUX1BBU1RFOgorICAgICAgUGFzdGVUZXh0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdNX1BXTEVESVRfREVMRVRFOgorICAgICAgQ2xlYXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV01fUFdMRURJVF9TRUxFQ1RBTEw6CisgICAgICBTZWxlY3RBbGwoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV01fUFdMRURJVF9TVUdHRVNUICsgMDoKKyAgICAgIFNldFNlbChtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkJlZ2luUG9zKSwKKyAgICAgICAgICAgICBtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkVuZFBvcykpOworICAgICAgUmVwbGFjZVNlbChzU3VnZ2VzdFdvcmRzWzBdLlVURjhEZWNvZGUoKS5jX3N0cigpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV01fUFdMRURJVF9TVUdHRVNUICsgMToKKyAgICAgIFNldFNlbChtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkJlZ2luUG9zKSwKKyAgICAgICAgICAgICBtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkVuZFBvcykpOworICAgICAgUmVwbGFjZVNlbChzU3VnZ2VzdFdvcmRzWzFdLlVURjhEZWNvZGUoKS5jX3N0cigpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV01fUFdMRURJVF9TVUdHRVNUICsgMjoKKyAgICAgIFNldFNlbChtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkJlZ2luUG9zKSwKKyAgICAgICAgICAgICBtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkVuZFBvcykpOworICAgICAgUmVwbGFjZVNlbChzU3VnZ2VzdFdvcmRzWzJdLlVURjhEZWNvZGUoKS5jX3N0cigpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV01fUFdMRURJVF9TVUdHRVNUICsgMzoKKyAgICAgIFNldFNlbChtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkJlZ2luUG9zKSwKKyAgICAgICAgICAgICBtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkVuZFBvcykpOworICAgICAgUmVwbGFjZVNlbChzU3VnZ2VzdFdvcmRzWzNdLlVURjhEZWNvZGUoKS5jX3N0cigpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV01fUFdMRURJVF9TVUdHRVNUICsgNDoKKyAgICAgIFNldFNlbChtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkJlZ2luUG9zKSwKKyAgICAgICAgICAgICBtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkVuZFBvcykpOworICAgICAgUmVwbGFjZVNlbChzU3VnZ2VzdFdvcmRzWzRdLlVURjhEZWNvZGUoKS5jX3N0cigpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHBTSC0+RGVzdHJveU1lbnUoaFBvcHVwKTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBDUFdMX0VkaXQ6Ok9uU2V0Rm9jdXMoKSB7CisgIFNldEVkaXRDYXJldChUUlVFKTsKKworICBpZiAoIUlzUmVhZE9ubHkoKSkgeworICAgIGlmIChJUFdMX0ZvY3VzSGFuZGxlciogcEZvY3VzSGFuZGxlciA9IEdldEZvY3VzSGFuZGxlcigpKQorICAgICAgcEZvY3VzSGFuZGxlci0+T25TZXRGb2N1cyh0aGlzKTsKKyAgfQorCisgIG1fYkZvY3VzID0gVFJVRTsKK30KKwordm9pZCBDUFdMX0VkaXQ6Ok9uS2lsbEZvY3VzKCkgeworICBTaG93VlNjcm9sbEJhcihGQUxTRSk7CisKKyAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICBTZXRDYXJldChGQUxTRSwgQ1BERl9Qb2ludCgwLjBmLCAwLjBmKSwgQ1BERl9Qb2ludCgwLjBmLCAwLjBmKSk7CisKKyAgU2V0Q2hhclNldCgwKTsKKworICBpZiAoIUlzUmVhZE9ubHkoKSkgeworICAgIGlmIChJUFdMX0ZvY3VzSGFuZGxlciogcEZvY3VzSGFuZGxlciA9IEdldEZvY3VzSGFuZGxlcigpKQorICAgICAgcEZvY3VzSGFuZGxlci0+T25LaWxsRm9jdXModGhpcyk7CisgIH0KKworICBtX2JGb2N1cyA9IEZBTFNFOworfQorCit2b2lkIENQV0xfRWRpdDo6U2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSwgRlhfQk9PTCBiUGFpbnQgLyogPSBUUlVFKi8pIHsKKyAgbV9wRWRpdC0+U2V0SG9yelNjYWxlKG5Ib3J6U2NhbGUsIGJQYWludCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSwgRlhfQk9PTCBiUGFpbnQgLyogPSBUUlVFKi8pIHsKKyAgbV9wRWRpdC0+U2V0Q2hhclNwYWNlKGZDaGFyU3BhY2UsIGJQYWludCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQgLyogPSBUUlVFKi8pIHsKKyAgbV9wRWRpdC0+U2V0TGluZUxlYWRpbmcoZkxpbmVMZWFkaW5nLCBiUGFpbnQpOworfQorCitDRlhfQnl0ZVN0cmluZyBDUFdMX0VkaXQ6OkdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0oCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpIGNvbnN0IHsKKyAgQ1BWVF9Xb3JkUmFuZ2Ugd3IgPSBHZXRTZWxlY3RXb3JkUmFuZ2UoKTsKKyAgcmV0dXJuIENQV0xfVXRpbHM6OkdldEVkaXRTZWxBcHBTdHJlYW0obV9wRWRpdCwgcHRPZmZzZXQsICZ3cik7Cit9CisKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3QgeworICBpZiAobV9wRWRpdC0+SXNTZWxlY3RlZCgpKSB7CisgICAgaW50MzJfdCBuU3RhcnQgPSAtMTsKKyAgICBpbnQzMl90IG5FbmQgPSAtMTsKKworICAgIG1fcEVkaXQtPkdldFNlbChuU3RhcnQsIG5FbmQpOworCisgICAgQ1BWVF9Xb3JkUGxhY2Ugd3BTdGFydCA9IG1fcEVkaXQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5TdGFydCk7CisgICAgQ1BWVF9Xb3JkUGxhY2Ugd3BFbmQgPSBtX3BFZGl0LT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuRW5kKTsKKworICAgIHJldHVybiBDUFZUX1dvcmRSYW5nZSh3cFN0YXJ0LCB3cEVuZCk7CisgIH0KKworICByZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UoKTsKK30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9FZGl0OjpHZXRUZXh0QXBwZWFyYW5jZVN0cmVhbSgKKyAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCkgY29uc3QgeworICBDRlhfQnl0ZVRleHRCdWYgc1JldDsKKyAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXQgPSBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKG1fcEVkaXQsIHB0T2Zmc2V0KTsKKworICBpZiAoc0VkaXQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgc1JldCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0VGV4dENvbG9yKCkpIDw8IHNFZGl0CisgICAgICAgICA8PCAiRVRcbiI7CisgIH0KKworICByZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7Cit9CisKK0NGWF9CeXRlU3RyaW5nIENQV0xfRWRpdDo6R2V0Q2FyZXRBcHBlYXJhbmNlU3RyZWFtKAorICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0KSBjb25zdCB7CisgIGlmIChtX3BFZGl0Q2FyZXQpCisgICAgcmV0dXJuIG1fcEVkaXRDYXJldC0+R2V0Q2FyZXRBcHBlYXJhbmNlU3RyZWFtKHB0T2Zmc2V0KTsKKworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKK30KKworQ1BERl9Qb2ludCBDUFdMX0VkaXQ6OkdldFdvcmRSaWdodEJvdHRvbVBvaW50KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cFdvcmQpIHsKKyAgQ1BERl9Qb2ludCBwdCgwLjBmLCAwLjBmKTsKKworICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcEVkaXQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICBDUFZUX1dvcmRQbGFjZSB3cE9sZCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICBwSXRlcmF0b3ItPlNldEF0KHdwV29yZCk7CisgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgcHQgPSBDUERGX1BvaW50KHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudCk7CiAgICAgfQogCi0JaWYgKG1fcEVkaXRDYXJldCAmJiAhSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKLQkJbV9wRWRpdENhcmV0LT5TZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChHZXRDbGllbnRSZWN0KCksMS4wZikpOyAvLysxIGZvciBjYXJldCBiZXNpZGUgYm9yZGVyCisgICAgcEl0ZXJhdG9yLT5TZXRBdCh3cE9sZCk7CisgIH0KIAotCUNQV0xfRWRpdEN0cmw6OlJlUG9zQ2hpbGRXbmQoKTsKKyAgcmV0dXJuIHB0OwogfQogCi1DUERGX1JlY3QgQ1BXTF9FZGl0OjpHZXRDbGllbnRSZWN0KCkgY29uc3QKLXsKLQlDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChHZXRXaW5kb3dSZWN0KCksKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpK0dldElubmVyQm9yZGVyV2lkdGgoKSkpOwotCi0JaWYgKENQV0xfU2Nyb2xsQmFyICogcFZTQiA9IEdldFZTY3JvbGxCYXIoKSkKLQl7Ci0JCWlmIChwVlNCLT5Jc1Zpc2libGUoKSkKLQkJewotCQkJcmNDbGllbnQucmlnaHQgLT0gUFdMX1NDUk9MTEJBUl9XSURUSDsKLQkJfQotCX0KLQotCXJldHVybiByY0NsaWVudDsKK0ZYX0JPT0wgQ1BXTF9FZGl0OjpJc1RleHRGdWxsKCkgY29uc3QgeworICByZXR1cm4gbV9wRWRpdC0+SXNUZXh0RnVsbCgpOwogfQogCi12b2lkIENQV0xfRWRpdDo6U2V0QWxpZ25Gb3JtYXRIKFBXTF9FRElUX0FMSUdORk9STUFUX0ggbkZvcm1hdCwgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLQltX3BFZGl0LT5TZXRBbGlnbm1lbnRIKChpbnQzMl90KW5Gb3JtYXQsIGJQYWludCk7CitGWF9GTE9BVCBDUFdMX0VkaXQ6OkdldENoYXJBcnJheUF1dG9Gb250U2l6ZShDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY1BsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhckFycmF5KSB7CisgIGlmIChwRm9udCAmJiAhcEZvbnQtPklzU3RhbmRhcmRGb250KCkpIHsKKyAgICBGWF9SRUNUIHJjQkJveDsKKyAgICBwRm9udC0+R2V0Rm9udEJCb3gocmNCQm94KTsKKworICAgIENQREZfUmVjdCByY0NlbGwgPSByY1BsYXRlOworICAgIEZYX0ZMT0FUIHhkaXYgPSByY0NlbGwuV2lkdGgoKSAvIG5DaGFyQXJyYXkgKiAxMDAwLjBmIC8gcmNCQm94LldpZHRoKCk7CisgICAgRlhfRkxPQVQgeWRpdiA9IC1yY0NlbGwuSGVpZ2h0KCkgKiAxMDAwLjBmIC8gcmNCQm94LkhlaWdodCgpOworCisgICAgcmV0dXJuIHhkaXYgPCB5ZGl2ID8geGRpdiA6IHlkaXY7CisgIH0KKworICByZXR1cm4gMC4wZjsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQsIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9wRWRpdC0+U2V0QWxpZ25tZW50VigoaW50MzJfdCluRm9ybWF0LCBiUGFpbnQpOwordm9pZCBDUFdMX0VkaXQ6OlNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkpIHsKKyAgaWYgKEhhc0ZsYWcoUEVTX0NIQVJBUlJBWSkgJiYgbkNoYXJBcnJheSA+IDApIHsKKyAgICBtX3BFZGl0LT5TZXRDaGFyQXJyYXkobkNoYXJBcnJheSk7CisgICAgbV9wRWRpdC0+U2V0VGV4dE92ZXJmbG93KFRSVUUpOworCisgICAgaWYgKEhhc0ZsYWcoUFdTX0FVVE9GT05UU0laRSkpIHsKKyAgICAgIGlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IEdldEZvbnRNYXAoKSkgeworICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoCisgICAgICAgICAgICBwRm9udE1hcC0+R2V0UERGRm9udCgwKSwgR2V0Q2xpZW50UmVjdCgpLCBuQ2hhckFycmF5KTsKKyAgICAgICAgaWYgKGZGb250U2l6ZSA+IDAuMGYpIHsKKyAgICAgICAgICBtX3BFZGl0LT5TZXRBdXRvRm9udFNpemUoRkFMU0UpOworICAgICAgICAgIG1fcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotRlhfQk9PTAlDUFdMX0VkaXQ6OkNhblNlbGVjdEFsbCgpIGNvbnN0Ci17Ci0JcmV0dXJuICBHZXRTZWxlY3RXb3JkUmFuZ2UoKSAhPSBtX3BFZGl0LT5HZXRXaG9sZVdvcmRSYW5nZSgpOwordm9pZCBDUFdMX0VkaXQ6OlNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIpIHsKKyAgbV9wRWRpdC0+U2V0TGltaXRDaGFyKG5MaW1pdENoYXIpOwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6Q2FuQ2xlYXIoKSBjb25zdAotewotCXJldHVybiAhSXNSZWFkT25seSgpICYmIG1fcEVkaXQtPklzU2VsZWN0ZWQoKTsKK3ZvaWQgQ1BXTF9FZGl0OjpSZXBsYWNlU2VsKGNvbnN0IEZYX1dDSEFSKiBjc1RleHQpIHsKKyAgbV9wRWRpdC0+Q2xlYXIoKTsKKyAgbV9wRWRpdC0+SW5zZXJ0VGV4dChjc1RleHQpOwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6Q2FuQ29weSgpIGNvbnN0Ci17Ci0JcmV0dXJuIAkhSGFzRmxhZyhQRVNfUEFTU1dPUkQpICYmICFIYXNGbGFnKFBFU19OT1JFQUQpICYmIG1fcEVkaXQtPklzU2VsZWN0ZWQoKTsKK0NQREZfUmVjdCBDUFdMX0VkaXQ6OkdldEZvY3VzUmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIENQREZfUmVjdCgpOwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6Q2FuQ3V0KCkgY29uc3QKLXsKLQlyZXR1cm4gCUNhbkNvcHkoKSAmJiAhSXNSZWFkT25seSgpOwordm9pZCBDUFdMX0VkaXQ6OlNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpIHsKKyAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsID0gR2V0VlNjcm9sbEJhcigpKSB7CisgICAgaWYgKGJTaG93KSB7CisgICAgICBpZiAoIXBTY3JvbGwtPklzVmlzaWJsZSgpKSB7CisgICAgICAgIHBTY3JvbGwtPlNldFZpc2libGUoVFJVRSk7CisgICAgICAgIENQREZfUmVjdCByY1dpbmRvdyA9IEdldFdpbmRvd1JlY3QoKTsKKyAgICAgICAgbV9yY09sZFdpbmRvdyA9IHJjV2luZG93OworICAgICAgICByY1dpbmRvdy5yaWdodCArPSBQV0xfU0NST0xMQkFSX1dJRFRIOworICAgICAgICBNb3ZlKHJjV2luZG93LCBUUlVFLCBUUlVFKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHBTY3JvbGwtPklzVmlzaWJsZSgpKSB7CisgICAgICAgIHBTY3JvbGwtPlNldFZpc2libGUoRkFMU0UpOworICAgICAgICBNb3ZlKG1fcmNPbGRXaW5kb3csIFRSVUUsIFRSVUUpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6Q2FuUGFzdGUoKSBjb25zdAotewotCWlmIChJc1JlYWRPbmx5KCkpIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BXTF9FZGl0OjpJc1ZTY3JvbGxCYXJWaXNpYmxlKCkgY29uc3QgeworICBpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGwgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKKyAgICByZXR1cm4gcFNjcm9sbC0+SXNWaXNpYmxlKCk7CisgIH0KIAotCUNGWF9XaWRlU3RyaW5nIHN3Q2xpcGJvYXJkOwotCWlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKQotCQlzd0NsaXBib2FyZCA9IHBTSC0+R2V0Q2xpcGJvYXJkVGV4dChHZXRBdHRhY2hlZEhXbmQoKSk7Ci0KLQlyZXR1cm4gIXN3Q2xpcGJvYXJkLklzRW1wdHkoKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQV0xfRWRpdDo6Q29weVRleHQoKQotewotCWlmICghQ2FuQ29weSgpKSByZXR1cm47Ci0KLQlDRlhfV2lkZVN0cmluZyBzdHIgPSBtX3BFZGl0LT5HZXRTZWxUZXh0KCk7Ci0KLQlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKLQkJcFNILT5TZXRDbGlwYm9hcmRUZXh0KEdldEF0dGFjaGVkSFduZCgpLCBzdHIpOwordm9pZCBDUFdMX0VkaXQ6OkVuYWJsZVNwZWxsQ2hlY2soRlhfQk9PTCBiRW5hYmxlZCkgeworICBpZiAoYkVuYWJsZWQpCisgICAgQWRkRmxhZyhQRVNfU1BFTExDSEVDSyk7CisgIGVsc2UKKyAgICBSZW1vdmVGbGFnKFBFU19TUEVMTENIRUNLKTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlBhc3RlVGV4dCgpCi17Ci0JaWYgKCFDYW5QYXN0ZSgpKSByZXR1cm47CitGWF9CT09MIENQV0xfRWRpdDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmIChtX2JNb3VzZURvd24pCisgICAgcmV0dXJuIFRSVUU7CiAKLQlDRlhfV2lkZVN0cmluZyBzd0NsaXBib2FyZDsKLQlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKLQkJc3dDbGlwYm9hcmQgPSBwU0gtPkdldENsaXBib2FyZFRleHQoR2V0QXR0YWNoZWRIV25kKCkpOworICBpZiAobkNoYXIgPT0gRldMX1ZLRVlfRGVsZXRlKSB7CisgICAgaWYgKG1fcEZpbGxlck5vdGlmeSkgeworICAgICAgRlhfQk9PTCBiUkMgPSBUUlVFOworICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ2hhbmdlOworICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ2hhbmdlRXg7CiAKLQlpZiAobV9wRmlsbGVyTm90aWZ5KQotCXsKLQkJRlhfQk9PTCBiUkMgPSBUUlVFOwotCQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0JCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OwotCQlpbnQgblNlbFN0YXJ0ID0gMDsKLQkJaW50IG5TZWxFbmQgPSAwOwotCQlHZXRTZWwoblNlbFN0YXJ0LCBuU2VsRW5kKTsKLQkJbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShUUlVFLCBHZXRBdHRhY2hlZERhdGEoKSwgMCAsIHN3Q2xpcGJvYXJkLCBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLCBUUlVFLCBiUkMsIGJFeGl0LCAwKTsKLQkJaWYgKCFiUkMpIHJldHVybjsKLQkJaWYgKGJFeGl0KSByZXR1cm47Ci0JfQorICAgICAgaW50IG5TZWxTdGFydCA9IDA7CisgICAgICBpbnQgblNlbEVuZCA9IDA7CisgICAgICBHZXRTZWwoblNlbFN0YXJ0LCBuU2VsRW5kKTsKIAotCWlmIChzd0NsaXBib2FyZC5HZXRMZW5ndGgoKSA+IDApCi0JewotCQlDbGVhcigpOwotCQlJbnNlcnRUZXh0KHN3Q2xpcGJvYXJkLmNfc3RyKCkpOwotCX0KKyAgICAgIGlmIChuU2VsU3RhcnQgPT0gblNlbEVuZCkKKyAgICAgICAgblNlbEVuZCA9IG5TZWxTdGFydCArIDE7CisgICAgICBtX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKAorICAgICAgICAgIFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBGV0xfVktFWV9EZWxldGUsIHN0ckNoYW5nZSwgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgblNlbFN0YXJ0LCBuU2VsRW5kLCBUUlVFLCBiUkMsIGJFeGl0LCBuRmxhZyk7CisgICAgICBpZiAoIWJSQykKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgaWYgKGJFeGl0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CiAKLQlpZiAobV9wRmlsbGVyTm90aWZ5KQotCXsKLQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UoVFJVRSwgR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LDApOwotCQlpZiAoYkV4aXQpIHJldHVybjsKLQl9Ci19CisgIEZYX0JPT0wgYlJldCA9IENQV0xfRWRpdEN0cmw6Ok9uS2V5RG93bihuQ2hhciwgbkZsYWcpOwogCi12b2lkIENQV0xfRWRpdDo6Q3V0VGV4dCgpCi17Ci0JaWYgKCFDYW5DdXQoKSkgcmV0dXJuOworICBpZiAobkNoYXIgPT0gRldMX1ZLRVlfRGVsZXRlKSB7CisgICAgaWYgKG1fcEZpbGxlck5vdGlmeSkgeworICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICAgICAgbV9wRmlsbGVyTm90aWZ5LT5PbkFmdGVyS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgbkZsYWcpOworICAgICAgaWYgKGJFeGl0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CiAKLQlDRlhfV2lkZVN0cmluZyBzdHIgPSBtX3BFZGl0LT5HZXRTZWxUZXh0KCk7CisgIC8vIEluIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgorICBpZiAoSXNQcm9jZWVkdG9PbkNoYXIobkNoYXIsIG5GbGFnKSkKKyAgICByZXR1cm4gVFJVRTsKIAotCWlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKQotCQlwU0gtPlNldENsaXBib2FyZFRleHQoR2V0QXR0YWNoZWRIV25kKCksIHN0cik7Ci0KLQltX3BFZGl0LT5DbGVhcigpOwotfQotCi12b2lkIENQV0xfRWRpdDo6T25DcmVhdGVkKCkKLXsKLQlDUFdMX0VkaXRDdHJsOjpPbkNyZWF0ZWQoKTsKLQotCWlmIChDUFdMX1Njcm9sbEJhciAqIHBTY3JvbGwgPSBHZXRWU2Nyb2xsQmFyKCkpCi0JewotCQlwU2Nyb2xsLT5SZW1vdmVGbGFnKFBXU19BVVRPVFJBTlNQQVJFTlQpOwotCQlwU2Nyb2xsLT5TZXRUcmFuc3BhcmVuY3koMjU1KTsKLQl9Ci0KLQlTZXRQYXJhbUJ5RmxhZygpOwotCi0JbV9yY09sZFdpbmRvdyA9IEdldFdpbmRvd1JlY3QoKTsKLQotCW1fcEVkaXQtPlNldE9wck5vdGlmeSh0aGlzKTsKLQltX3BFZGl0LT5FbmFibGVPcHJOb3RpZnkoVFJVRSk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0OjpTZXRQYXJhbUJ5RmxhZygpCi17Ci0JaWYgKEhhc0ZsYWcoUEVTX1JJR0hUKSkKLQl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMiwgRkFMU0UpOwotCX0KLQllbHNlIGlmIChIYXNGbGFnKFBFU19NSURETEUpKQotCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgxLCBGQUxTRSk7Ci0JfQotCWVsc2UKLQl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMCwgRkFMU0UpOwotCX0KLQotCWlmIChIYXNGbGFnKFBFU19CT1RUT00pKQotCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigyLCBGQUxTRSk7Ci0JfQotCWVsc2UgaWYgKEhhc0ZsYWcoUEVTX0NFTlRFUikpCi0JewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEsIEZBTFNFKTsKLQl9Ci0JZWxzZQotCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigwLCBGQUxTRSk7Ci0JfQotCi0JaWYgKEhhc0ZsYWcoUEVTX1BBU1NXT1JEKSkKLQl7Ci0JCW1fcEVkaXQtPlNldFBhc3N3b3JkQ2hhcignKicsIEZBTFNFKTsKLQl9Ci0KLQltX3BFZGl0LT5TZXRNdWx0aUxpbmUoSGFzRmxhZyhQRVNfTVVMVElMSU5FKSwgRkFMU0UpOwotCW1fcEVkaXQtPlNldEF1dG9SZXR1cm4oSGFzRmxhZyhQRVNfQVVUT1JFVFVSTiksIEZBTFNFKTsKLQltX3BFZGl0LT5TZXRBdXRvRm9udFNpemUoSGFzRmxhZyhQV1NfQVVUT0ZPTlRTSVpFKSwgRkFMU0UpOwotCW1fcEVkaXQtPlNldEF1dG9TY3JvbGwoSGFzRmxhZyhQRVNfQVVUT1NDUk9MTCksIEZBTFNFKTsKLQltX3BFZGl0LT5FbmFibGVVbmRvKEhhc0ZsYWcoUEVTX1VORE8pKTsKLQotCWlmIChIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKQotCXsKLQkJU2V0Q2xpcFJlY3QoQ1BERl9SZWN0KDAuMGYsMC4wZiwwLjBmLDAuMGYpKTsKLQkJbV9wRWRpdC0+U2V0VGV4dE92ZXJmbG93KFRSVUUsIEZBTFNFKTsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKG1fcEVkaXRDYXJldCkKLQkJewotCQkJbV9wRWRpdENhcmV0LT5TZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChHZXRDbGllbnRSZWN0KCksMS4wZikpOyAvLysxIGZvciBjYXJldCBiZXNpZGUgYm9yZGVyCi0JCX0KLQl9Ci0KLQlpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpCi0JewotCQltX3BTcGVsbENoZWNrID0gR2V0Q3JlYXRpb25QYXJhbSgpLnBTcGVsbENoZWNrOwotCX0KLX0KLQotdm9pZCBDUFdMX0VkaXQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pCi17Ci0JQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOwotCi0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCUNGWF9CeXRlVGV4dEJ1ZiBzTGluZTsKLQotCWludDMyX3QgbkNoYXJBcnJheSA9IG1fcEVkaXQtPkdldENoYXJBcnJheSgpOwotCi0JaWYgKG5DaGFyQXJyYXkgPiAwKQotCXsKLQkJc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKQotCQl7Ci0JCWNhc2UgUEJTX1NPTElEOgotCQkJewotCQkJCXNMaW5lIDw8ICJxXG4iIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCi0JCQkJCTw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlckNvbG9yKCksRkFMU0UpIDw8ICIgMiBKIDAgalxuIjsKLQotCQkJCWZvciAoaW50MzJfdCBpPTE7aTxuQ2hhckFycmF5O2krKykKLQkJCQl7Ci0JCQkJCXNMaW5lIDw8IHJjQ2xpZW50LmxlZnQgKyAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkvbkNoYXJBcnJheSkqaSA8PCAiICIKLQkJCQkJCTw8IHJjQ2xpZW50LmJvdHRvbSA8PCAiIG1cbiIKLQkJCQkJCTw8IHJjQ2xpZW50LmxlZnQgKyAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkvbkNoYXJBcnJheSkqaSA8PCAiICIKLQkJCQkJCTw8IHJjQ2xpZW50LnRvcCA8PCAiIGwgU1xuIjsKLQkJCQl9Ci0KLQkJCQlzTGluZSA8PCAiUVxuIjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBCU19EQVNIOgotCQkJewotCQkJCXNMaW5lIDw8ICJxXG4iIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCi0JCQkJCTw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlckNvbG9yKCksRkFMU0UpIDw8ICIgMiBKIDAgalxuIgotCQkJCQk8PCAiWyIgPDwgR2V0Qm9yZGVyRGFzaCgpLm5EYXNoIDw8ICIgIgotCQkJCQk8PCBHZXRCb3JkZXJEYXNoKCkubkdhcCA8PCAiXSAiCi0JCQkJCTw8IEdldEJvcmRlckRhc2goKS5uUGhhc2UgPDwgIiBkXG4iOwotCi0JCQkJZm9yIChpbnQzMl90IGk9MTtpPG5DaGFyQXJyYXk7aSsrKQotCQkJCXsKLQkJCQkJc0xpbmUgPDwgcmNDbGllbnQubGVmdCArICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KS9uQ2hhckFycmF5KSppIDw8ICIgIgotCQkJCQkJPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgbVxuIgotCQkJCQkJPDwgcmNDbGllbnQubGVmdCArICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KS9uQ2hhckFycmF5KSppIDw8ICIgIgotCQkJCQkJPDwgcmNDbGllbnQudG9wIDw8ICIgbCBTXG4iOwotCQkJCX0KLQotCQkJCXNMaW5lIDw8ICJRXG4iOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlzQXBwU3RyZWFtIDw8IHNMaW5lOwotCi0JQ0ZYX0J5dGVUZXh0QnVmIHNUZXh0OwotCi0JQ1BERl9Qb2ludCBwdE9mZnNldCA9IENQREZfUG9pbnQoMC4wZiwwLjBmKTsKLQotCUNQVlRfV29yZFJhbmdlIHdyV2hvbGUgPSBtX3BFZGl0LT5HZXRXaG9sZVdvcmRSYW5nZSgpOwotCUNQVlRfV29yZFJhbmdlIHdyU2VsZWN0ID0gR2V0U2VsZWN0V29yZFJhbmdlKCk7Ci0JQ1BWVF9Xb3JkUmFuZ2Ugd3JWaXNpYmxlID0gKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgPyB3cldob2xlIDogbV9wRWRpdC0+R2V0VmlzaWJsZVdvcmRSYW5nZSgpKTsKLQlDUFZUX1dvcmRSYW5nZSB3clNlbEJlZm9yZSh3cldob2xlLkJlZ2luUG9zLHdyU2VsZWN0LkJlZ2luUG9zKTsKLQlDUFZUX1dvcmRSYW5nZSB3clNlbEFmdGVyKHdyU2VsZWN0LkVuZFBvcyx3cldob2xlLkVuZFBvcyk7Ci0KLQlDUFZUX1dvcmRSYW5nZSB3clRlbXAgPSBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKEdldFNlbGVjdFdvcmRSYW5nZSgpLHdyVmlzaWJsZSk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc0VkaXRTZWwgPSBDUFdMX1V0aWxzOjpHZXRFZGl0U2VsQXBwU3RyZWFtKG1fcEVkaXQsIHB0T2Zmc2V0LAotCQkJJndyVGVtcCk7Ci0KLQlpZiAoc0VkaXRTZWwuR2V0TGVuZ3RoKCkgPiAwKQotCQlzVGV4dCA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShQV0xfREVGQVVMVF9TRUxCQUNLQ09MT1IpIDw8IHNFZGl0U2VsIDsKLQotCXdyVGVtcCA9IENQV0xfVXRpbHM6Ok92ZXJsYXBXb3JkUmFuZ2Uod3JWaXNpYmxlLHdyU2VsQmVmb3JlKTsKLQlDRlhfQnl0ZVN0cmluZyBzRWRpdEJlZm9yZSA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0obV9wRWRpdCwgcHRPZmZzZXQsCi0JCQkmd3JUZW1wLCAhSGFzRmxhZyhQRVNfQ0hBUkFSUkFZKSwgbV9wRWRpdC0+R2V0UGFzc3dvcmRDaGFyKCkpOwotCi0JaWYgKHNFZGl0QmVmb3JlLkdldExlbmd0aCgpID4gMCkKLQkJc1RleHQgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldFRleHRDb2xvcigpKSA8PCBzRWRpdEJlZm9yZSA8PCAiRVRcbiI7Ci0KLQl3clRlbXAgPSBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKHdyVmlzaWJsZSx3clNlbGVjdCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc0VkaXRNaWQgPSBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKG1fcEVkaXQsIHB0T2Zmc2V0LAotCQkJJndyVGVtcCwgIUhhc0ZsYWcoUEVTX0NIQVJBUlJBWSksIG1fcEVkaXQtPkdldFBhc3N3b3JkQ2hhcigpKTsKLQotCWlmIChzRWRpdE1pZC5HZXRMZW5ndGgoKSA+IDApCi0JCXNUZXh0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpKSA8PCBzRWRpdE1pZCA8PCAiRVRcbiI7Ci0KLQl3clRlbXAgPSBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKHdyVmlzaWJsZSx3clNlbEFmdGVyKTsKLQlDRlhfQnl0ZVN0cmluZyBzRWRpdEFmdGVyID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShtX3BFZGl0LCBwdE9mZnNldCwKLQkJCSZ3clRlbXAsICFIYXNGbGFnKFBFU19DSEFSQVJSQVkpLCBtX3BFZGl0LT5HZXRQYXNzd29yZENoYXIoKSk7Ci0KLQlpZiAoc0VkaXRBZnRlci5HZXRMZW5ndGgoKSA+IDApCi0JCXNUZXh0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRUZXh0Q29sb3IoKSkgPDwgc0VkaXRBZnRlcjw8ICJFVFxuIjsKLQotCWlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkKLQl7Ci0JCUNGWF9CeXRlU3RyaW5nIHNTcGVsbENoZWNrID0gQ1BXTF9VdGlsczo6R2V0U3BlbGxDaGVja0FwcFN0cmVhbShtX3BFZGl0LCBtX3BTcGVsbENoZWNrLCBwdE9mZnNldCwgJndyVmlzaWJsZSk7Ci0JCWlmIChzU3BlbGxDaGVjay5HZXRMZW5ndGgoKSA+IDApCi0JCQlzVGV4dCA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMSwwLDApLEZBTFNFKSA8PCBzU3BlbGxDaGVjazsKLQl9Ci0KLQlpZiAoc1RleHQuR2V0TGVuZ3RoKCkgPiAwKQotCXsKLQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCQlzQXBwU3RyZWFtIDw8ICJxXG4vVHggQk1DXG4iOwotCi0JCWlmICghSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKLQkJCXNBcHBTdHJlYW0gPDwgcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgIgotCQkJCTw8IHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tIDw8ICIgcmUgVyBuXG4iOwotCi0JCXNBcHBTdHJlYW0gPDwgc1RleHQ7Ci0KLQkJc0FwcFN0cmVhbSA8PCAiRU1DXG5RXG4iOwotCX0KLX0KLQotdm9pZCBDUFdMX0VkaXQ6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSxwVXNlcjJEZXZpY2UpOwotCi0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCUNGWF9CeXRlVGV4dEJ1ZiBzTGluZTsKLQotCWludDMyX3QgbkNoYXJBcnJheSA9IG1fcEVkaXQtPkdldENoYXJBcnJheSgpOwotCUZYX1NBRkVfSU5UMzIgbkNoYXJBcnJheVNhZmUgPSBuQ2hhckFycmF5OwotCW5DaGFyQXJyYXlTYWZlIC09IDE7Ci0JbkNoYXJBcnJheVNhZmUgKj0gMjsKLQotCWlmIChuQ2hhckFycmF5ID4gMCAmJiBuQ2hhckFycmF5U2FmZS5Jc1ZhbGlkKCkpCi0JewotCQlzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpCi0JCXsKLQkJY2FzZSBQQlNfU09MSUQ6Ci0JCQl7Ci0JCQkJQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLQkJCQlnc2QubV9MaW5lV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKLQotCQkJCUNGWF9QYXRoRGF0YSBwYXRoOwotCQkJCXBhdGguU2V0UG9pbnRDb3VudChuQ2hhckFycmF5U2FmZS5WYWx1ZU9yRGllKCkpOwotCi0JCQkJZm9yIChpbnQzMl90IGk9MDsgaTxuQ2hhckFycmF5LTE7IGkrKykKLQkJCQl7Ci0JCQkJCXBhdGguU2V0UG9pbnQoaSoyLCByY0NsaWVudC5sZWZ0ICsgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpL25DaGFyQXJyYXkpKihpKzEpLAotCQkJCQkJcmNDbGllbnQuYm90dG9tLCBGWFBUX01PVkVUTyk7Ci0JCQkJCXBhdGguU2V0UG9pbnQoaSoyKzEsIHJjQ2xpZW50LmxlZnQgKyAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkvbkNoYXJBcnJheSkqKGkrMSksCi0JCQkJCQlyY0NsaWVudC50b3AsIEZYUFRfTElORVRPKTsKLQkJCQl9Ci0JCQkJaWYgKHBhdGguR2V0UG9pbnRDb3VudCgpID4gMCkKLQkJCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwwLAotCQkJCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0Qm9yZGVyQ29sb3IoKSwyNTUpLCBGWEZJTExfQUxURVJOQVRFKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBCU19EQVNIOgotCQkJewotCQkJCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JCQkJZ3NkLm1fTGluZVdpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0KLQkJCQlnc2QuU2V0RGFzaENvdW50KDIpOwotCQkJCWdzZC5tX0Rhc2hBcnJheVswXSA9IChGWF9GTE9BVClHZXRCb3JkZXJEYXNoKCkubkRhc2g7Ci0JCQkJZ3NkLm1fRGFzaEFycmF5WzFdID0gKEZYX0ZMT0FUKUdldEJvcmRlckRhc2goKS5uR2FwOwotCQkJCWdzZC5tX0Rhc2hQaGFzZSA9IChGWF9GTE9BVClHZXRCb3JkZXJEYXNoKCkublBoYXNlOwotCi0JCQkJQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0JCQkJcGF0aC5TZXRQb2ludENvdW50KG5DaGFyQXJyYXlTYWZlLlZhbHVlT3JEaWUoKSk7Ci0KLQkJCQlmb3IgKGludDMyX3QgaT0wOyBpPG5DaGFyQXJyYXktMTsgaSsrKQotCQkJCXsKLQkJCQkJcGF0aC5TZXRQb2ludChpKjIsIHJjQ2xpZW50LmxlZnQgKyAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkvbkNoYXJBcnJheSkqKGkrMSksCi0JCQkJCQlyY0NsaWVudC5ib3R0b20sIEZYUFRfTU9WRVRPKTsKLQkJCQkJcGF0aC5TZXRQb2ludChpKjIrMSwgcmNDbGllbnQubGVmdCArICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KS9uQ2hhckFycmF5KSooaSsxKSwKLQkJCQkJCXJjQ2xpZW50LnRvcCwgRlhQVF9MSU5FVE8pOwotCQkJCX0KLQkJCQlpZiAocGF0aC5HZXRQb2ludENvdW50KCkgPiAwKQotCQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLDAsCi0JCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRCb3JkZXJDb2xvcigpLDI1NSksIEZYRklMTF9BTFRFUk5BVEUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlDUERGX1JlY3QgcmNDbGlwOwotCUNQVlRfV29yZFJhbmdlIHdyUmFuZ2UgPSBtX3BFZGl0LT5HZXRWaXNpYmxlV29yZFJhbmdlKCk7Ci0JQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEw7Ci0KLQlpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpCi0JewotCQlyY0NsaXAgPSBHZXRDbGllbnRSZWN0KCk7Ci0JCXBSYW5nZSA9ICZ3clJhbmdlOwotCX0KLUlGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKTsKLQlJRlhfRWRpdDo6RHJhd0VkaXQocERldmljZSxwVXNlcjJEZXZpY2UsbV9wRWRpdCwKLQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwKLQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dFN0cm9rZUNvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwKLQkJcmNDbGlwLENQREZfUG9pbnQoMC4wZiwwLjBmKSxwUmFuZ2UsIHBTeXNIYW5kbGVyLCBtX3BGb3JtRmlsbGVyKTsKLQotCWlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkKLQl7Ci0JCUNQV0xfVXRpbHM6OkRyYXdFZGl0U3BlbGxDaGVjayhwRGV2aWNlLHBVc2VyMkRldmljZSxtX3BFZGl0LHJjQ2xpcCwKLQkJCUNQREZfUG9pbnQoMC4wZiwwLjBmKSxwUmFuZ2UsIEdldENyZWF0aW9uUGFyYW0oKS5wU3BlbGxDaGVjayk7Ci0JfQotfQotCi1GWF9CT09MIENQV0xfRWRpdDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LG5GbGFnKTsKLQotCWlmIChIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpIHx8IENsaWVudEhpdFRlc3QocG9pbnQpKQotCXsKLQkJaWYgKG1fYk1vdXNlRG93bikKLQkJCUludmFsaWRhdGVSZWN0KCk7Ci0KLQkJbV9iTW91c2VEb3duID0gVFJVRTsKLQkJU2V0Q2FwdHVyZSgpOwotCi0JCW1fcEVkaXQtPk9uTW91c2VEb3duKHBvaW50LElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wJQ1BXTF9FZGl0OjpPbkxCdXR0b25EYmxDbGsoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlDUFdMX1duZDo6T25MQnV0dG9uRGJsQ2xrKHBvaW50LCBuRmxhZyk7Ci0KLQlpZiAoSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSB8fCBDbGllbnRIaXRUZXN0KHBvaW50KSkKLQl7Ci0JCW1fcEVkaXQtPlNlbGVjdEFsbCgpOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0jZGVmaW5lIFdNX1BXTEVESVRfVU5ETwkJCQkJMHgwMQotI2RlZmluZSBXTV9QV0xFRElUX1JFRE8JCQkJCTB4MDIKLSNkZWZpbmUgV01fUFdMRURJVF9DVVQJCQkJCTB4MDMKLSNkZWZpbmUgV01fUFdMRURJVF9DT1BZCQkJCQkweDA0Ci0jZGVmaW5lIFdNX1BXTEVESVRfUEFTVEUJCQkJMHgwNQotI2RlZmluZSBXTV9QV0xFRElUX0RFTEVURQkJCQkweDA2Ci0jZGVmaW5lIFdNX1BXTEVESVRfU0VMRUNUQUxMCQkJMHgwNwotI2RlZmluZSBXTV9QV0xFRElUX1NVR0dFU1QJCQkJMHgwOAotCi1GWF9CT09MIENQV0xfRWRpdDo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlpZiAobV9iTW91c2VEb3duKSByZXR1cm4gRkFMU0U7Ci0KLQlDUFdMX1duZDo6T25SQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKLQotCWlmICghSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSAmJiAhQ2xpZW50SGl0VGVzdChwb2ludCkpIHJldHVybiBUUlVFOwotCi0JSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKTsKLQlpZiAoIXBTSCkgcmV0dXJuIEZBTFNFOwotCi0JU2V0Rm9jdXMoKTsKLQotCUNQVlRfV29yZFJhbmdlIHdyTGF0aW4gPSBHZXRMYXRpbldvcmRzUmFuZ2UocG9pbnQpOwotCUNGWF9XaWRlU3RyaW5nIHN3TGF0aW4gPSBtX3BFZGl0LT5HZXRSYW5nZVRleHQod3JMYXRpbik7Ci0KLQlGWF9ITUVOVSBoUG9wdXAgPSBwU0gtPkNyZWF0ZVBvcHVwTWVudSgpOwotCWlmICghaFBvcHVwKSByZXR1cm4gRkFMU0U7Ci0KLQlDRlhfQnl0ZVN0cmluZ0FycmF5IHNTdWdnZXN0V29yZHM7Ci0JQ1BERl9Qb2ludCBwdFBvcHVwID0gcG9pbnQ7Ci0KLQlpZiAoIUlzUmVhZE9ubHkoKSkKLQl7Ci0JCWlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSAmJiAhc3dMYXRpbi5Jc0VtcHR5KCkpCi0JCXsKLQkJCWlmIChtX3BTcGVsbENoZWNrKQotCQkJewotCQkJCUNGWF9CeXRlU3RyaW5nIHNMYXRpbiA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShzd0xhdGluKTsKLQotCQkJCWlmICghbV9wU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNMYXRpbikpCi0JCQkJewotCQkJCQltX3BTcGVsbENoZWNrLT5TdWdnZXN0V29yZHMoc0xhdGluLHNTdWdnZXN0V29yZHMpOwotCi0JCQkJCWludDMyX3QgblN1Z2dlc3QgPSBzU3VnZ2VzdFdvcmRzLkdldFNpemUoKTsKLQotCQkJCQlmb3IgKGludDMyX3QgbldvcmQ9MDsgbldvcmQ8blN1Z2dlc3Q7IG5Xb3JkKyspCi0JCQkJCXsKLQkJCQkJCXBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1NVR0dFU1QrbldvcmQsIHNTdWdnZXN0V29yZHNbbldvcmRdLlVURjhEZWNvZGUoKSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoblN1Z2dlc3QgPiAwKQotCQkJCQkJcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIDAsIEwiIik7Ci0KLQkJCQkJcHRQb3B1cCA9IEdldFdvcmRSaWdodEJvdHRvbVBvaW50KHdyTGF0aW4uRW5kUG9zKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlJUFdMX1Byb3ZpZGVyKiBwUHJvdmlkZXIgPSBHZXRQcm92aWRlcigpOwotCi0JaWYgKEhhc0ZsYWcoUEVTX1VORE8pKQotCXsKLQkJcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfVU5ETywKLQkJCXBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZygwKSA6IEwiJlVuZG8iKTsKLQkJcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUkVETywKLQkJCXBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZygxKSA6IEwiJlJlZG8iKTsKLQkJcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIDAsIEwiIik7Ci0KLQkJaWYgKCFtX3BFZGl0LT5DYW5VbmRvKCkpCi0JCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9VTkRPLCBGQUxTRSk7Ci0JCWlmICghbV9wRWRpdC0+Q2FuUmVkbygpKQotCQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUkVETywgRkFMU0UpOwotCX0KLQotCXBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwKLQkJcFByb3ZpZGVyID8gcFByb3ZpZGVyLT5Mb2FkUG9wdXBNZW51U3RyaW5nKDIpIDogTCJDdSZ0Iik7Ci0JcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ09QWSwKLQkJcFByb3ZpZGVyID8gcFByb3ZpZGVyLT5Mb2FkUG9wdXBNZW51U3RyaW5nKDMpIDogTCImQ29weSIpOwotCXBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1BBU1RFLAotCQlwUHJvdmlkZXIgPyBwUHJvdmlkZXItPkxvYWRQb3B1cE1lbnVTdHJpbmcoNCkgOiBMIiZQYXN0ZSIpOwotCXBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0RFTEVURSwKLQkJcFByb3ZpZGVyID8gcFByb3ZpZGVyLT5Mb2FkUG9wdXBNZW51U3RyaW5nKDUpIDogTCImRGVsZXRlIik7Ci0KLQlDRlhfV2lkZVN0cmluZyBzd1RleHQgPSBwU0gtPkdldENsaXBib2FyZFRleHQoR2V0QXR0YWNoZWRIV25kKCkpOwotCWlmIChzd1RleHQuSXNFbXB0eSgpKQotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9QQVNURSwgRkFMU0UpOwotCi0JaWYgKCFtX3BFZGl0LT5Jc1NlbGVjdGVkKCkpCi0JewotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsIEZBTFNFKTsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ09QWSwgRkFMU0UpOwotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9ERUxFVEUsIEZBTFNFKTsKLQl9Ci0KLQlpZiAoSXNSZWFkT25seSgpKQotCXsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBGQUxTRSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0RFTEVURSwgRkFMU0UpOwotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9QQVNURSwgRkFMU0UpOwotCX0KLQotCWlmIChIYXNGbGFnKFBFU19QQVNTV09SRCkpCi0JewotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsIEZBTFNFKTsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ09QWSwgRkFMU0UpOwotCX0KLQotCWlmIChIYXNGbGFnKFBFU19OT1JFQUQpKQotCXsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBGQUxTRSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIEZBTFNFKTsKLQl9Ci0KLQlwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgMCwgTCIiKTsKLQlwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9TRUxFQ1RBTEwsCi0JCXBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZyg2KSA6IEwiJlNlbGVjdCBBbGwiKTsKLQotCWlmIChtX3BFZGl0LT5HZXRUb3RhbFdvcmRzKCkgPT0gMCkKLQl7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1NFTEVDVEFMTCwgRkFMU0UpOwotCX0KLQotCWludDMyX3QgeCwgeTsKLQlQV0x0b1duZChwdFBvcHVwLCB4LCB5KTsKLQlwU0gtPkNsaWVudFRvU2NyZWVuKEdldEF0dGFjaGVkSFduZCgpLCB4LCB5KTsKLQlwU0gtPlNldEN1cnNvcihGWENUX0FSUk9XKTsKLQlpbnQzMl90IG5DbWQgPSBwU0gtPlRyYWNrUG9wdXBNZW51KGhQb3B1cCwKLQkJCQkJIHgsCi0JCQkJCSB5LAotCQkJCQkgR2V0QXR0YWNoZWRIV25kKCkpOwotCi0KLQlzd2l0Y2ggKG5DbWQpCi0JewotCWNhc2UgV01fUFdMRURJVF9VTkRPOgotCQlVbmRvKCk7Ci0JCWJyZWFrOwotCWNhc2UgV01fUFdMRURJVF9SRURPOgotCQlSZWRvKCk7Ci0JCWJyZWFrOwotCWNhc2UgV01fUFdMRURJVF9DVVQ6Ci0JCUN1dFRleHQoKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTV9QV0xFRElUX0NPUFk6Ci0JCUNvcHlUZXh0KCk7Ci0JCWJyZWFrOwotCWNhc2UgV01fUFdMRURJVF9QQVNURToKLQkJUGFzdGVUZXh0KCk7Ci0JCWJyZWFrOwotCWNhc2UgV01fUFdMRURJVF9ERUxFVEU6Ci0JCUNsZWFyKCk7Ci0JCWJyZWFrOwotCWNhc2UgV01fUFdMRURJVF9TRUxFQ1RBTEw6Ci0JCVNlbGVjdEFsbCgpOwotCQlicmVhazsKLQljYXNlIFdNX1BXTEVESVRfU1VHR0VTVCArIDA6Ci0JCVNldFNlbChtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkJlZ2luUG9zKSxtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkVuZFBvcykpOwotCQlSZXBsYWNlU2VsKHNTdWdnZXN0V29yZHNbMF0uVVRGOERlY29kZSgpLmNfc3RyKCkpOwotCQlicmVhazsKLQljYXNlIFdNX1BXTEVESVRfU1VHR0VTVCArIDE6Ci0JCVNldFNlbChtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkJlZ2luUG9zKSxtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkVuZFBvcykpOwotCQlSZXBsYWNlU2VsKHNTdWdnZXN0V29yZHNbMV0uVVRGOERlY29kZSgpLmNfc3RyKCkpOwotCQlicmVhazsKLQljYXNlIFdNX1BXTEVESVRfU1VHR0VTVCArIDI6Ci0JCVNldFNlbChtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkJlZ2luUG9zKSxtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkVuZFBvcykpOwotCQlSZXBsYWNlU2VsKHNTdWdnZXN0V29yZHNbMl0uVVRGOERlY29kZSgpLmNfc3RyKCkpOwotCQlicmVhazsKLQljYXNlIFdNX1BXTEVESVRfU1VHR0VTVCArIDM6Ci0JCVNldFNlbChtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkJlZ2luUG9zKSxtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkVuZFBvcykpOwotCQlSZXBsYWNlU2VsKHNTdWdnZXN0V29yZHNbM10uVVRGOERlY29kZSgpLmNfc3RyKCkpOwotCQlicmVhazsKLQljYXNlIFdNX1BXTEVESVRfU1VHR0VTVCArIDQ6Ci0JCVNldFNlbChtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkJlZ2luUG9zKSxtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCh3ckxhdGluLkVuZFBvcykpOwotCQlSZXBsYWNlU2VsKHNTdWdnZXN0V29yZHNbNF0uVVRGOERlY29kZSgpLmNfc3RyKCkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlwU0gtPkRlc3Ryb3lNZW51KGhQb3B1cCk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBDUFdMX0VkaXQ6Ok9uU2V0Rm9jdXMoKQotewotCVNldEVkaXRDYXJldChUUlVFKTsKLQotCWlmICghSXNSZWFkT25seSgpKQotCXsKLQkJaWYgKElQV0xfRm9jdXNIYW5kbGVyKiBwRm9jdXNIYW5kbGVyID0gR2V0Rm9jdXNIYW5kbGVyKCkpCi0JCQlwRm9jdXNIYW5kbGVyLT5PblNldEZvY3VzKHRoaXMpOwotCX0KLQotCW1fYkZvY3VzID0gVFJVRTsKLX0KLQotdm9pZCBDUFdMX0VkaXQ6Ok9uS2lsbEZvY3VzKCkKLXsKLQlTaG93VlNjcm9sbEJhcihGQUxTRSk7Ci0KLQltX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0JU2V0Q2FyZXQoRkFMU0UsIENQREZfUG9pbnQoMC4wZiwwLjBmKSwgQ1BERl9Qb2ludCgwLjBmLDAuMGYpKTsKLQotCVNldENoYXJTZXQoMCk7Ci0KLQlpZiAoIUlzUmVhZE9ubHkoKSkKLQl7Ci0JCWlmIChJUFdMX0ZvY3VzSGFuZGxlciogcEZvY3VzSGFuZGxlciA9IEdldEZvY3VzSGFuZGxlcigpKQotCQkJcEZvY3VzSGFuZGxlci0+T25LaWxsRm9jdXModGhpcyk7Ci0JfQotCi0JbV9iRm9jdXMgPSBGQUxTRTsKLX0KLQotdm9pZCBDUFdMX0VkaXQ6OlNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUsIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9wRWRpdC0+U2V0SG9yelNjYWxlKG5Ib3J6U2NhbGUsIGJQYWludCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSwgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLQltX3BFZGl0LT5TZXRDaGFyU3BhY2UoZkNoYXJTcGFjZSwgYlBhaW50KTsKLX0KLQotdm9pZCBDUFdMX0VkaXQ6OlNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLQltX3BFZGl0LT5TZXRMaW5lTGVhZGluZyhmTGluZUxlYWRpbmcsIGJQYWludCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfRWRpdDo6R2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpIGNvbnN0Ci17Ci0JQ1BWVF9Xb3JkUmFuZ2Ugd3IgPSBHZXRTZWxlY3RXb3JkUmFuZ2UoKTsKLQlyZXR1cm4gQ1BXTF9VdGlsczo6R2V0RWRpdFNlbEFwcFN0cmVhbShtX3BFZGl0LHB0T2Zmc2V0LCZ3cik7Ci19Ci0KLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3QKLXsKLQlpZiAobV9wRWRpdC0+SXNTZWxlY3RlZCgpKQotCXsKLQkJaW50MzJfdCBuU3RhcnQgPSAtMTsKLQkJaW50MzJfdCBuRW5kID0gLTE7Ci0KLQkJbV9wRWRpdC0+R2V0U2VsKG5TdGFydCwgbkVuZCk7Ci0KLQkJQ1BWVF9Xb3JkUGxhY2Ugd3BTdGFydCA9IG1fcEVkaXQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5TdGFydCk7Ci0JCUNQVlRfV29yZFBsYWNlIHdwRW5kID0gbV9wRWRpdC0+V29yZEluZGV4VG9Xb3JkUGxhY2UobkVuZCk7Ci0KLQkJcmV0dXJuIENQVlRfV29yZFJhbmdlKHdwU3RhcnQsd3BFbmQpOwotCX0KLQotCXJldHVybiBDUFZUX1dvcmRSYW5nZSgpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0VkaXQ6OkdldFRleHRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCkgY29uc3QKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc1JldDsKLQlDRlhfQnl0ZVN0cmluZyBzRWRpdCA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0obV9wRWRpdCxwdE9mZnNldCk7Ci0KLQlpZiAoc0VkaXQuR2V0TGVuZ3RoKCkgPiAwKQotCXsKLQkJc1JldCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0VGV4dENvbG9yKCkpIDw8IHNFZGl0IDw8ICJFVFxuIjsKLQl9Ci0KLQlyZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfRWRpdDo6R2V0Q2FyZXRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCkgY29uc3QKLXsKLQlpZiAobV9wRWRpdENhcmV0KQotCQlyZXR1cm4gbV9wRWRpdENhcmV0LT5HZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0ocHRPZmZzZXQpOwotCi0JcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci19Ci0KLUNQREZfUG9pbnQgQ1BXTF9FZGl0OjpHZXRXb3JkUmlnaHRCb3R0b21Qb2ludChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BXb3JkKQotewotCUNQREZfUG9pbnQgcHQoMC4wZiwgMC4wZik7Ci0KLQlpZiAoSUZYX0VkaXRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpKQotCXsKLQkJQ1BWVF9Xb3JkUGxhY2Ugd3BPbGQgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0JCXBJdGVyYXRvci0+U2V0QXQod3BXb3JkKTsKLQkJQ1BWVF9Xb3JkIHdvcmQ7Ci0JCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCXsKLQkJCXB0ID0gQ1BERl9Qb2ludCh3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGgsIHdvcmQucHRXb3JkLnkgKyB3b3JkLmZEZXNjZW50KTsKLQkJfQotCi0JCXBJdGVyYXRvci0+U2V0QXQod3BPbGQpOwotCX0KLQotCXJldHVybiBwdDsKLX0KLQotRlhfQk9PTAlDUFdMX0VkaXQ6OklzVGV4dEZ1bGwoKSBjb25zdAotewotCXJldHVybiBtX3BFZGl0LT5Jc1RleHRGdWxsKCk7Ci19Ci0KLUZYX0ZMT0FUIENQV0xfRWRpdDo6R2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKENQREZfRm9udCogcEZvbnQsIGNvbnN0IENQREZfUmVjdCYgcmNQbGF0ZSwgaW50MzJfdCBuQ2hhckFycmF5KQotewotCWlmIChwRm9udCAmJiAhcEZvbnQtPklzU3RhbmRhcmRGb250KCkpCi0JewotCQlGWF9SRUNUIHJjQkJveDsKLQkJcEZvbnQtPkdldEZvbnRCQm94KHJjQkJveCk7Ci0KLQkJQ1BERl9SZWN0IHJjQ2VsbCA9IHJjUGxhdGU7Ci0JCUZYX0ZMT0FUIHhkaXYgPSByY0NlbGwuV2lkdGgoKSAvIG5DaGFyQXJyYXkgKiAxMDAwLjBmIC8gcmNCQm94LldpZHRoKCk7Ci0JCUZYX0ZMT0FUIHlkaXYgPSAtIHJjQ2VsbC5IZWlnaHQoKSAqIDEwMDAuMGYgLyByY0JCb3guSGVpZ2h0KCk7Ci0KLQkJcmV0dXJuIHhkaXYgPCB5ZGl2ID8geGRpdiA6IHlkaXY7Ci0JfQotCi0JcmV0dXJuIDAuMGY7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0OjpTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5KQotewotCWlmIChIYXNGbGFnKFBFU19DSEFSQVJSQVkpICYmIG5DaGFyQXJyYXkgPiAwKQotCXsKLQkJbV9wRWRpdC0+U2V0Q2hhckFycmF5KG5DaGFyQXJyYXkpOwotCQltX3BFZGl0LT5TZXRUZXh0T3ZlcmZsb3coVFJVRSk7Ci0KLQkJaWYgKEhhc0ZsYWcoUFdTX0FVVE9GT05UU0laRSkpCi0JCXsKLQkJCWlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IEdldEZvbnRNYXAoKSkKLQkJCXsKLQkJCQlGWF9GTE9BVCBmRm9udFNpemUgPSBHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUocEZvbnRNYXAtPkdldFBERkZvbnQoMCksIEdldENsaWVudFJlY3QoKSwgbkNoYXJBcnJheSk7Ci0JCQkJaWYgKGZGb250U2l6ZSA+IDAuMGYpCi0JCQkJewotCQkJCQltX3BFZGl0LT5TZXRBdXRvRm9udFNpemUoRkFMU0UpOwotCQkJCQltX3BFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotdm9pZCBDUFdMX0VkaXQ6OlNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIpCi17Ci0JbV9wRWRpdC0+U2V0TGltaXRDaGFyKG5MaW1pdENoYXIpOwotfQotCi12b2lkIENQV0xfRWRpdDo6UmVwbGFjZVNlbChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KQotewotCW1fcEVkaXQtPkNsZWFyKCk7Ci0JbV9wRWRpdC0+SW5zZXJ0VGV4dChjc1RleHQpOwotfQotCi1DUERGX1JlY3QgQ1BXTF9FZGl0OjpHZXRGb2N1c1JlY3QoKSBjb25zdAotewotCXJldHVybiBDUERGX1JlY3QoKTsKLX0KLQotdm9pZCBDUFdMX0VkaXQ6OlNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpCi17Ci0JaWYgKENQV0xfU2Nyb2xsQmFyICogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKSkKLQl7Ci0JCWlmIChiU2hvdykKLQkJewotCQkJaWYgKCFwU2Nyb2xsLT5Jc1Zpc2libGUoKSkKLQkJCXsKLQkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKFRSVUUpOwotCQkJCUNQREZfUmVjdCByY1dpbmRvdyA9IEdldFdpbmRvd1JlY3QoKTsKLQkJCQltX3JjT2xkV2luZG93ID0gcmNXaW5kb3c7Ci0JCQkJcmNXaW5kb3cucmlnaHQgKz0gUFdMX1NDUk9MTEJBUl9XSURUSDsKLQkJCQlNb3ZlKHJjV2luZG93LCBUUlVFLCBUUlVFKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChwU2Nyb2xsLT5Jc1Zpc2libGUoKSkKLQkJCXsKLQkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKEZBTFNFKTsKLQkJCQlNb3ZlKG1fcmNPbGRXaW5kb3csIFRSVUUsIFRSVUUpOwotCQkJfQotCQl9Ci0JfQotfQotCi1GWF9CT09MCUNQV0xfRWRpdDo6SXNWU2Nyb2xsQmFyVmlzaWJsZSgpIGNvbnN0Ci17Ci0JaWYgKENQV0xfU2Nyb2xsQmFyICogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKSkKLQl7Ci0JCXJldHVybiBwU2Nyb2xsLT5Jc1Zpc2libGUoKTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0OjpFbmFibGVTcGVsbENoZWNrKEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0JaWYgKGJFbmFibGVkKQotCQlBZGRGbGFnKFBFU19TUEVMTENIRUNLKTsKLQllbHNlCi0JCVJlbW92ZUZsYWcoUEVTX1NQRUxMQ0hFQ0spOwotfQotCi1GWF9CT09MIENQV0xfRWRpdDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmIChtX2JNb3VzZURvd24pIHJldHVybiBUUlVFOwotCi0JaWYgKG5DaGFyID09IEZXTF9WS0VZX0RlbGV0ZSkKLQl7Ci0JCWlmIChtX3BGaWxsZXJOb3RpZnkpCi0JCXsKLQkJCUZYX0JPT0wgYlJDID0gVFJVRTsKLQkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQkJCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZTsKLQkJCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OwotCi0JCQlpbnQgblNlbFN0YXJ0ID0gMDsKLQkJCWludCBuU2VsRW5kID0gMDsKLQkJCUdldFNlbChuU2VsU3RhcnQsIG5TZWxFbmQpOwotCi0JCQlpZiAoblNlbFN0YXJ0ID09IG5TZWxFbmQpCi0JCQkJblNlbEVuZCA9IG5TZWxTdGFydCArIDE7Ci0JCQltX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBGV0xfVktFWV9EZWxldGUsIHN0ckNoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgVFJVRSwgYlJDLCBiRXhpdCwgbkZsYWcpOwotCQkJaWYgKCFiUkMpIHJldHVybiBGQUxTRTsKLQkJCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOwotCQl9Ci0JfQotCi0JRlhfQk9PTCBiUmV0ID0gQ1BXTF9FZGl0Q3RybDo6T25LZXlEb3duKG5DaGFyLCAgbkZsYWcpOwotCi0JaWYgKG5DaGFyID09IEZXTF9WS0VZX0RlbGV0ZSkKLQl7Ci0JCWlmIChtX3BGaWxsZXJOb3RpZnkpCi0JCXsKLQkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQkJCW1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZShUUlVFLCBHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsbkZsYWcpOwotCQkJaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7Ci0JCX0KLQl9Ci0KLQkvL0luIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgotCWlmKElzUHJvY2VlZHRvT25DaGFyKG5DaGFyLCBuRmxhZykpCi0JCQlyZXR1cm4gVFJVRTsKLQotCXJldHVybiBiUmV0OworICByZXR1cm4gYlJldDsKIH0KIAogLyoqCiAqSW4gY2FzZSBvZiBpbXBsZW1lbnRhdGlvbiBzd2FsbG93IHRoZSBPbktleURvd24gZXZlbnQuCi0qSWYgdGhlIGV2ZW50IGlzIHN3YWxsb3dlZCwgaW1wbGVtZW50YXRpb24gbWF5IGRvIG90aGVyIHVuZXhwZWN0ZWQgdGhpbmdzLCB3aGljaCBpcyBub3QgdGhlIGNvbnRyb2wgbWVhbnMgdG8gZG8uCisqSWYgdGhlIGV2ZW50IGlzIHN3YWxsb3dlZCwgaW1wbGVtZW50YXRpb24gbWF5IGRvIG90aGVyIHVuZXhwZWN0ZWQgdGhpbmdzLCB3aGljaAorKmlzIG5vdCB0aGUgY29udHJvbCBtZWFucyB0byBkby4KICovCi1GWF9CT09MIENQV0xfRWRpdDo6SXNQcm9jZWVkdG9PbkNoYXIoRlhfV09SRCBuS2V5Q29kZSwgRlhfRFdPUkQgbkZsYWcpCi17Ci0KLQlGWF9CT09MIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7Ci0JRlhfQk9PTCBiQWx0ID0gSXNBTFRwcmVzc2VkKG5GbGFnKTsKLQlpZihiQ3RybCAmJiAhYkFsdCkKLQl7Ci0JLy9ob3Qga2V5cyBmb3IgZWRpdCBjb250cm9sLgotCQlzd2l0Y2gobktleUNvZGUpCi0JCXsKLQkJY2FzZSAnQyc6Ci0JCWNhc2UgJ1YnOgotCQljYXNlICdYJzoKLQkJY2FzZSAnQSc6Ci0JCWNhc2UgJ1onOgotCQkJcmV0dXJuIFRSVUU7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQkvL2NvbnRyb2wgY2hhcmFjdGVycy4KLQlzd2l0Y2gobktleUNvZGUpCi0JewotCWNhc2UgRldMX1ZLRVlfRXNjYXBlOgotCWNhc2UgRldMX1ZLRVlfQmFjazoKLQljYXNlIEZXTF9WS0VZX1JldHVybjoKLQljYXNlIEZXTF9WS0VZX1NwYWNlOgotCQlyZXR1cm4gVFJVRTsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIEZBTFNFOwotCitGWF9CT09MIENQV0xfRWRpdDo6SXNQcm9jZWVkdG9PbkNoYXIoRlhfV09SRCBuS2V5Q29kZSwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgRlhfQk9PTCBiQ3RybCA9IElzQ1RSTHByZXNzZWQobkZsYWcpOworICBGWF9CT09MIGJBbHQgPSBJc0FMVHByZXNzZWQobkZsYWcpOworICBpZiAoYkN0cmwgJiYgIWJBbHQpIHsKKyAgICAvLyBob3Qga2V5cyBmb3IgZWRpdCBjb250cm9sLgorICAgIHN3aXRjaCAobktleUNvZGUpIHsKKyAgICAgIGNhc2UgJ0MnOgorICAgICAgY2FzZSAnVic6CisgICAgICBjYXNlICdYJzoKKyAgICAgIGNhc2UgJ0EnOgorICAgICAgY2FzZSAnWic6CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8vIGNvbnRyb2wgY2hhcmFjdGVycy4KKyAgc3dpdGNoIChuS2V5Q29kZSkgeworICAgIGNhc2UgRldMX1ZLRVlfRXNjYXBlOgorICAgIGNhc2UgRldMX1ZLRVlfQmFjazoKKyAgICBjYXNlIEZXTF9WS0VZX1JldHVybjoKKyAgICBjYXNlIEZXTF9WS0VZX1NwYWNlOgorICAgICAgcmV0dXJuIFRSVUU7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDUFdMX0VkaXQ6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKLXsKLQlpZiAobV9iTW91c2VEb3duKSByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BXTF9FZGl0OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKG1fYk1vdXNlRG93bikKKyAgICByZXR1cm4gVFJVRTsKIAotCUZYX0JPT0wgYlJDID0gVFJVRTsKLQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgIEZYX0JPT0wgYlJDID0gVFJVRTsKKyAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwogCi0JRlhfQk9PTCBiQ3RybCA9IElzQ1RSTHByZXNzZWQobkZsYWcpOwotCWlmICghYkN0cmwpCi0JewotCQlpZiAobV9wRmlsbGVyTm90aWZ5KQotCQl7Ci0JCQlDRlhfV2lkZVN0cmluZyBzd0NoYW5nZTsKLQkJCWludDMyX3QgbktleUNvZGU7CisgIEZYX0JPT0wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKKyAgaWYgKCFiQ3RybCkgeworICAgIGlmIChtX3BGaWxsZXJOb3RpZnkpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3Q2hhbmdlOworICAgICAgaW50MzJfdCBuS2V5Q29kZTsKIAotCQkJaW50IG5TZWxTdGFydCA9IDA7Ci0JCQlpbnQgblNlbEVuZCA9IDA7Ci0JCQlHZXRTZWwoblNlbFN0YXJ0LCBuU2VsRW5kKTsKKyAgICAgIGludCBuU2VsU3RhcnQgPSAwOworICAgICAgaW50IG5TZWxFbmQgPSAwOworICAgICAgR2V0U2VsKG5TZWxTdGFydCwgblNlbEVuZCk7CiAKLQkJCXN3aXRjaCAobkNoYXIpCi0JCQl7Ci0JCQljYXNlIEZXTF9WS0VZX0JhY2s6Ci0JCQkJbktleUNvZGUgPSBuQ2hhcjsKLQkJCQlpZiAoblNlbFN0YXJ0ID09IG5TZWxFbmQpCi0JCQkJCW5TZWxTdGFydCA9IG5TZWxFbmQgLSAxOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGV0xfVktFWV9SZXR1cm46Ci0JCQkJbktleUNvZGUgPSBuQ2hhcjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJbktleUNvZGUgPSAwOwotCQkJCXN3Q2hhbmdlICs9IG5DaGFyOwotCQkJCWJyZWFrOwotCQkJfQorICAgICAgc3dpdGNoIChuQ2hhcikgeworICAgICAgICBjYXNlIEZXTF9WS0VZX0JhY2s6CisgICAgICAgICAgbktleUNvZGUgPSBuQ2hhcjsKKyAgICAgICAgICBpZiAoblNlbFN0YXJ0ID09IG5TZWxFbmQpCisgICAgICAgICAgICBuU2VsU3RhcnQgPSBuU2VsRW5kIC0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46CisgICAgICAgICAgbktleUNvZGUgPSBuQ2hhcjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBuS2V5Q29kZSA9IDA7CisgICAgICAgICAgc3dDaGFuZ2UgKz0gbkNoYXI7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CiAKLQkJCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OwotCQkJbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShUUlVFLCBHZXRBdHRhY2hlZERhdGEoKSwgbktleUNvZGUsIHN3Q2hhbmdlLCBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLCBUUlVFLCBiUkMsIGJFeGl0LCBuRmxhZyk7Ci0JCX0KLQl9CisgICAgICBDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2VFeDsKKyAgICAgIG1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoVFJVRSwgR2V0QXR0YWNoZWREYXRhKCksIG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd0NoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNlbEVuZCwgVFJVRSwgYlJDLCBiRXhpdCwgbkZsYWcpOworICAgIH0KKyAgfQogCi0JaWYgKCFiUkMpIHJldHVybiBUUlVFOwotCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOworICBpZiAoIWJSQykKKyAgICByZXR1cm4gVFJVRTsKKyAgaWYgKGJFeGl0KQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmIChJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpCi0JewotCQlpbnQzMl90IG5PbGRDaGFyU2V0ID0gR2V0Q2hhclNldCgpOwotCQlpbnQzMl90IG5OZXdDaGFyU2V0ID0gcEZvbnRNYXAtPkNoYXJTZXRGcm9tVW5pY29kZShuQ2hhciwgREVGQVVMVF9DSEFSU0VUKTsKLQkJaWYobk9sZENoYXJTZXQgIT0gbk5ld0NoYXJTZXQpCi0JCXsKLQkJCVNldENoYXJTZXQobk5ld0NoYXJTZXQpOwotCQl9Ci0JfQotCUZYX0JPT0wgYlJldCA9IENQV0xfRWRpdEN0cmw6Ok9uQ2hhcihuQ2hhcixuRmxhZyk7CisgIGlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IEdldEZvbnRNYXAoKSkgeworICAgIGludDMyX3Qgbk9sZENoYXJTZXQgPSBHZXRDaGFyU2V0KCk7CisgICAgaW50MzJfdCBuTmV3Q2hhclNldCA9IHBGb250TWFwLT5DaGFyU2V0RnJvbVVuaWNvZGUobkNoYXIsIERFRkFVTFRfQ0hBUlNFVCk7CisgICAgaWYgKG5PbGRDaGFyU2V0ICE9IG5OZXdDaGFyU2V0KSB7CisgICAgICBTZXRDaGFyU2V0KG5OZXdDaGFyU2V0KTsKKyAgICB9CisgIH0KKyAgRlhfQk9PTCBiUmV0ID0gQ1BXTF9FZGl0Q3RybDo6T25DaGFyKG5DaGFyLCBuRmxhZyk7CiAKLQlpZiAoIWJDdHJsKQotCXsKLQkJaWYgKG1fcEZpbGxlck5vdGlmeSkKLQkJewotCQkJbV9wRmlsbGVyTm90aWZ5LT5PbkFmdGVyS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCxuRmxhZyk7Ci0JCQlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKLQkJfQotCX0KKyAgaWYgKCFiQ3RybCkgeworICAgIGlmIChtX3BGaWxsZXJOb3RpZnkpIHsKKyAgICAgIG1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZShUUlVFLCBHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIG5GbGFnKTsKKyAgICAgIGlmIChiRXhpdCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQogCi0JcmV0dXJuIGJSZXQ7CisgIHJldHVybiBiUmV0OwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlpZiAoSGFzRmxhZyhQRVNfTVVMVElMSU5FKSkKLQl7Ci0JCUNQREZfUG9pbnQgcHRTY3JvbGwgPSBHZXRTY3JvbGxQb3MoKTsKK0ZYX0JPT0wgQ1BXTF9FZGl0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKEhhc0ZsYWcoUEVTX01VTFRJTElORSkpIHsKKyAgICBDUERGX1BvaW50IHB0U2Nyb2xsID0gR2V0U2Nyb2xsUG9zKCk7CiAKLQkJaWYgKHpEZWx0YSA+IDApCi0JCXsKLQkJCXB0U2Nyb2xsLnkgKz0gR2V0Rm9udFNpemUoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXB0U2Nyb2xsLnkgLT0gR2V0Rm9udFNpemUoKTsKLQkJfQotCQlTZXRTY3JvbGxQb3MocHRTY3JvbGwpOworICAgIGlmICh6RGVsdGEgPiAwKSB7CisgICAgICBwdFNjcm9sbC55ICs9IEdldEZvbnRTaXplKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHB0U2Nyb2xsLnkgLT0gR2V0Rm9udFNpemUoKTsKKyAgICB9CisgICAgU2V0U2Nyb2xsUG9zKHB0U2Nyb2xsKTsKIAotCQlyZXR1cm4gVFJVRTsKLQl9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQV0xfRWRpdDo6T25JbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpCi17Ci0JaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKQotCXsKLQkJbV9wRWRpdC0+UmVmcmVzaFdvcmRSYW5nZShDb21iaW5lV29yZFJhbmdlKEdldExhdGluV29yZHNSYW5nZShvbGRwbGFjZSksR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOwotCX0KK3ZvaWQgQ1BXTF9FZGl0OjpPbkluc2VydFJldHVybihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSB7CisgIGlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkgeworICAgIG1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMYXRpbldvcmRzUmFuZ2UocGxhY2UpKSk7CisgIH0KIAotCWlmIChtX3BFZGl0Tm90aWZ5KQotCXsKLQkJbV9wRWRpdE5vdGlmeS0+T25JbnNlcnRSZXR1cm4ocGxhY2UsIG9sZHBsYWNlKTsKLQl9CisgIGlmIChtX3BFZGl0Tm90aWZ5KSB7CisgICAgbV9wRWRpdE5vdGlmeS0+T25JbnNlcnRSZXR1cm4ocGxhY2UsIG9sZHBsYWNlKTsKKyAgfQogfQogCi12b2lkIENQV0xfRWRpdDo6T25CYWNrU3BhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpCi17Ci0JaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKQotCXsKLQkJbV9wRWRpdC0+UmVmcmVzaFdvcmRSYW5nZShDb21iaW5lV29yZFJhbmdlKEdldExhdGluV29yZHNSYW5nZShvbGRwbGFjZSksR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOwotCX0KK3ZvaWQgQ1BXTF9FZGl0OjpPbkJhY2tTcGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSB7CisgIGlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkgeworICAgIG1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMYXRpbldvcmRzUmFuZ2UocGxhY2UpKSk7CisgIH0KIAotCWlmIChtX3BFZGl0Tm90aWZ5KQotCXsKLQkJbV9wRWRpdE5vdGlmeS0+T25CYWNrU3BhY2UocGxhY2UsIG9sZHBsYWNlKTsKLQl9CisgIGlmIChtX3BFZGl0Tm90aWZ5KSB7CisgICAgbV9wRWRpdE5vdGlmeS0+T25CYWNrU3BhY2UocGxhY2UsIG9sZHBsYWNlKTsKKyAgfQogfQogCi12b2lkIENQV0xfRWRpdDo6T25EZWxldGUoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpCi17Ci0JaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKQotCXsKLQkJbV9wRWRpdC0+UmVmcmVzaFdvcmRSYW5nZShDb21iaW5lV29yZFJhbmdlKEdldExhdGluV29yZHNSYW5nZShvbGRwbGFjZSksR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOwotCX0KK3ZvaWQgQ1BXTF9FZGl0OjpPbkRlbGV0ZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSB7CisgIGlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkgeworICAgIG1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMYXRpbldvcmRzUmFuZ2UocGxhY2UpKSk7CisgIH0KIAotCWlmIChtX3BFZGl0Tm90aWZ5KQotCXsKLQkJbV9wRWRpdE5vdGlmeS0+T25EZWxldGUocGxhY2UsIG9sZHBsYWNlKTsKLQl9CisgIGlmIChtX3BFZGl0Tm90aWZ5KSB7CisgICAgbV9wRWRpdE5vdGlmeS0+T25EZWxldGUocGxhY2UsIG9sZHBsYWNlKTsKKyAgfQogfQogCi12b2lkIENQV0xfRWRpdDo6T25DbGVhcihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkKLXsKLQlpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpCi0JewotCQltX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSxHZXRMYXRpbldvcmRzUmFuZ2UocGxhY2UpKSk7Ci0JfQordm9pZCBDUFdMX0VkaXQ6Ok9uQ2xlYXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSB7CisgIGlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkgeworICAgIG1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMYXRpbldvcmRzUmFuZ2UocGxhY2UpKSk7CisgIH0KIAotCWlmIChtX3BFZGl0Tm90aWZ5KQotCXsKLQkJbV9wRWRpdE5vdGlmeS0+T25DbGVhcihwbGFjZSwgb2xkcGxhY2UpOwotCX0KKyAgaWYgKG1fcEVkaXROb3RpZnkpIHsKKyAgICBtX3BFZGl0Tm90aWZ5LT5PbkNsZWFyKHBsYWNlLCBvbGRwbGFjZSk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXQ6Ok9uSW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkKLXsKLQlpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpCi0JewotCQltX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSxHZXRMYXRpbldvcmRzUmFuZ2UocGxhY2UpKSk7Ci0JfQordm9pZCBDUFdMX0VkaXQ6Ok9uSW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgeworICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKKyAgICBtX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOworICB9CiAKLQlpZiAobV9wRWRpdE5vdGlmeSkKLQl7Ci0JCW1fcEVkaXROb3RpZnktPk9uSW5zZXJ0V29yZChwbGFjZSwgb2xkcGxhY2UpOwotCX0KKyAgaWYgKG1fcEVkaXROb3RpZnkpIHsKKyAgICBtX3BFZGl0Tm90aWZ5LT5Pbkluc2VydFdvcmQocGxhY2UsIG9sZHBsYWNlKTsKKyAgfQogfQogCi12b2lkIENQV0xfRWRpdDo6T25TZXRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKQotewordm9pZCBDUFdMX0VkaXQ6Ok9uU2V0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkge30KKwordm9pZCBDUFdMX0VkaXQ6Ok9uSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgeworICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKKyAgICBtX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOworICB9CisKKyAgaWYgKG1fcEVkaXROb3RpZnkpIHsKKyAgICBtX3BFZGl0Tm90aWZ5LT5Pbkluc2VydFRleHQocGxhY2UsIG9sZHBsYWNlKTsKKyAgfQogfQogCi12b2lkIENQV0xfRWRpdDo6T25JbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKQotewotCWlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkKLQl7Ci0JCW1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLEdldExhdGluV29yZHNSYW5nZShwbGFjZSkpKTsKLQl9Ci0KLQlpZiAobV9wRWRpdE5vdGlmeSkKLQl7Ci0JCW1fcEVkaXROb3RpZnktPk9uSW5zZXJ0VGV4dChwbGFjZSwgb2xkcGxhY2UpOwotCX0KK3ZvaWQgQ1BXTF9FZGl0OjpPbkFkZFVuZG8oSUZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSkgeworICBpZiAobV9wRWRpdE5vdGlmeSkgeworICAgIG1fcEVkaXROb3RpZnktPk9uQWRkVW5kbyh0aGlzKTsKKyAgfQogfQogCi12b2lkIENQV0xfRWRpdDo6T25BZGRVbmRvKElGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0pCi17Ci0JaWYgKG1fcEVkaXROb3RpZnkpCi0JewotCQltX3BFZGl0Tm90aWZ5LT5PbkFkZFVuZG8odGhpcyk7Ci0JfQorQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpDb21iaW5lV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMikgeworICBDUFZUX1dvcmRSYW5nZSB3clJldDsKKworICBpZiAod3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkJlZ2luUG9zKSA8IDApIHsKKyAgICB3clJldC5CZWdpblBvcyA9IHdyMS5CZWdpblBvczsKKyAgfSBlbHNlIHsKKyAgICB3clJldC5CZWdpblBvcyA9IHdyMi5CZWdpblBvczsKKyAgfQorCisgIGlmICh3cjEuRW5kUG9zLldvcmRDbXAod3IyLkVuZFBvcykgPCAwKSB7CisgICAgd3JSZXQuRW5kUG9zID0gd3IyLkVuZFBvczsKKyAgfSBlbHNlIHsKKyAgICB3clJldC5FbmRQb3MgPSB3cjEuRW5kUG9zOworICB9CisKKyAgcmV0dXJuIHdyUmV0OwogfQogCi1DUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkNvbWJpbmVXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMSwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMikKLXsKLQlDUFZUX1dvcmRSYW5nZSB3clJldDsKLQotCWlmICh3cjEuQmVnaW5Qb3MuV29yZENtcCh3cjIuQmVnaW5Qb3MpIDwgMCkKLQl7Ci0JCXdyUmV0LkJlZ2luUG9zID0gd3IxLkJlZ2luUG9zOwotCX0KLQllbHNlCi0JewotCQl3clJldC5CZWdpblBvcyA9IHdyMi5CZWdpblBvczsKLQl9Ci0KLQlpZiAod3IxLkVuZFBvcy5Xb3JkQ21wKHdyMi5FbmRQb3MpIDwgMCkKLQl7Ci0JCXdyUmV0LkVuZFBvcyA9IHdyMi5FbmRQb3M7Ci0JfQotCWVsc2UKLQl7Ci0JCXdyUmV0LkVuZFBvcyA9IHdyMS5FbmRQb3M7Ci0JfQotCi0JcmV0dXJuIHdyUmV0OworQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFNhbWVXb3Jkc1JhbmdlKG1fcEVkaXQtPlNlYXJjaFdvcmRQbGFjZShwb2ludCksIFRSVUUsIEZBTFNFKTsKIH0KIAotQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0Ci17Ci0JcmV0dXJuIEdldFNhbWVXb3Jkc1JhbmdlKG1fcEVkaXQtPlNlYXJjaFdvcmRQbGFjZShwb2ludCksIFRSVUUsIEZBTFNFKTsKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0TGF0aW5Xb3Jkc1JhbmdlKAorICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICByZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UocGxhY2UsIFRSVUUsIEZBTFNFKTsKIH0KIAotQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLQlyZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UocGxhY2UsIFRSVUUsIEZBTFNFKTsKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0QXJhYmljV29yZHNSYW5nZSgKKyAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFNhbWVXb3Jkc1JhbmdlKHBsYWNlLCBGQUxTRSwgVFJVRSk7CiB9CiAKLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0QXJhYmljV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotCXJldHVybiBHZXRTYW1lV29yZHNSYW5nZShwbGFjZSwgRkFMU0UsIFRSVUUpOworI2RlZmluZSBQV0xfSVNBUkFCSUNXT1JEKHdvcmQpIFwKKyAgKCh3b3JkID49IDB4MDYwMCAmJiB3b3JkIDw9IDB4MDZGRikgfHwgKHdvcmQgPj0gMHhGQjUwICYmIHdvcmQgPD0gMHhGRUZDKSkKKworQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpHZXRTYW1lV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxhdGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBcmFiaWMpIGNvbnN0IHsKKyAgQ1BWVF9Xb3JkUmFuZ2UgcmFuZ2U7CisKKyAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgQ1BWVF9Xb3JkIHdvcmRpbmZvOworICAgIENQVlRfV29yZFBsYWNlIHdwU3RhcnQocGxhY2UpLCB3cEVuZChwbGFjZSk7CisgICAgcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CisKKyAgICBpZiAoYkxhdGluKSB7CisgICAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pICYmCisgICAgICAgICAgICBGWF9FRElUX0lTTEFUSU5XT1JEKHdvcmRpbmZvLldvcmQpKSB7CisgICAgICAgICAgd3BFbmQgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGJyZWFrOworICAgICAgfTsKKyAgICB9IGVsc2UgaWYgKGJBcmFiaWMpIHsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykgJiYgUFdMX0lTQVJBQklDV09SRCh3b3JkaW5mby5Xb3JkKSkgeworICAgICAgICAgIHdwRW5kID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBicmVhazsKKyAgICAgIH07CisgICAgfQorCisgICAgcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CisKKyAgICBpZiAoYkxhdGluKSB7CisgICAgICBkbyB7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pICYmCisgICAgICAgICAgICBGWF9FRElUX0lTTEFUSU5XT1JEKHdvcmRpbmZvLldvcmQpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgd3BTdGFydCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAocEl0ZXJhdG9yLT5QcmV2V29yZCgpKTsKKyAgICB9IGVsc2UgaWYgKGJBcmFiaWMpIHsKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykgJiYgUFdMX0lTQVJBQklDV09SRCh3b3JkaW5mby5Xb3JkKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdwU3RhcnQgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHBJdGVyYXRvci0+UHJldldvcmQoKSk7CisgICAgfQorCisgICAgcmFuZ2UuU2V0KHdwU3RhcnQsIHdwRW5kKTsKKyAgfQorCisgIHJldHVybiByYW5nZTsKIH0KIAotI2RlZmluZSBQV0xfSVNBUkFCSUNXT1JEKHdvcmQpICgod29yZCA+PSAweDA2MDAgJiYgd29yZCA8PSAweDA2RkYpIHx8ICh3b3JkID49IDB4RkI1MCAmJiB3b3JkIDw9IDB4RkVGQykpCit2b2lkIENQV0xfRWRpdDo6QWp1c3RBcmFiaWNXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpIHt9CiAKLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2FtZVdvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiTGF0aW4sIEZYX0JPT0wgYkFyYWJpYykgY29uc3QKLXsKLQlDUFZUX1dvcmRSYW5nZSByYW5nZTsKLQotCWlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCUNQVlRfV29yZCB3b3JkaW5mbzsKLQkJQ1BWVF9Xb3JkUGxhY2Ugd3BTdGFydChwbGFjZSksd3BFbmQocGxhY2UpOwotCQlwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKLQotCQlpZiAoYkxhdGluKQotCQl7Ci0JCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQotCQkJewotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pICYmIEZYX0VESVRfSVNMQVRJTldPUkQod29yZGluZm8uV29yZCkpCi0JCQkJewotCQkJCQl3cEVuZCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJYnJlYWs7Ci0JCQl9OwotCQl9Ci0JCWVsc2UgaWYgKGJBcmFiaWMpCi0JCXsKLQkJCXdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCi0JCQl7Ci0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykgJiYgUFdMX0lTQVJBQklDV09SRCh3b3JkaW5mby5Xb3JkKSkKLQkJCQl7Ci0JCQkJCXdwRW5kID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlicmVhazsKLQkJCX07Ci0JCX0KLQotCQlwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKLQotCQlpZiAoYkxhdGluKQotCQl7Ci0JCQlkbwotCQkJewotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pICYmIEZYX0VESVRfSVNMQVRJTldPUkQod29yZGluZm8uV29yZCkpCi0JCQkJewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJd3BTdGFydCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJd2hpbGUgKHBJdGVyYXRvci0+UHJldldvcmQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoYkFyYWJpYykKLQkJewotCQkJZG8KLQkJCXsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKSAmJiBQV0xfSVNBUkFCSUNXT1JEKHdvcmRpbmZvLldvcmQpKQotCQkJCXsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXdwU3RhcnQgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXdoaWxlIChwSXRlcmF0b3ItPlByZXZXb3JkKCkpOwotCQl9Ci0KLQkJcmFuZ2UuU2V0KHdwU3RhcnQsd3BFbmQpOwotCX0KLQotCXJldHVybiByYW5nZTsKLX0KLQotdm9pZCBDUFdMX0VkaXQ6OkFqdXN0QXJhYmljV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyKQotewordm9pZCBDUFdMX0VkaXQ6OkdlbmVyYXRlUGFnZU9iamVjdHMoCisgICAgQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmplY3RzLAorICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfVGV4dE9iamVjdCo+JiBPYmpBcnJheSkgeworICBJRlhfRWRpdDo6R2VuZXJhdGVQYWdlT2JqZWN0cygKKyAgICAgIHBQYWdlT2JqZWN0cywgbV9wRWRpdCwgcHRPZmZzZXQsIE5VTEwsCisgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpLAorICAgICAgT2JqQXJyYXkpOwogfQogCiB2b2lkIENQV0xfRWRpdDo6R2VuZXJhdGVQYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsCi0JCQkJCQkJCQkJY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIENGWF9BcnJheVRlbXBsYXRlPENQREZfVGV4dE9iamVjdCo+JiBPYmpBcnJheSkKLXsKLQlJRlhfRWRpdDo6R2VuZXJhdGVQYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsIG1fcEVkaXQsIHB0T2Zmc2V0LCBOVUxMLCBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSxHZXRUcmFuc3BhcmVuY3koKSksIE9iakFycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0KSB7CisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfVGV4dE9iamVjdCo+IE9iakFycmF5OworICBJRlhfRWRpdDo6R2VuZXJhdGVQYWdlT2JqZWN0cygKKyAgICAgIHBQYWdlT2JqZWN0cywgbV9wRWRpdCwgcHRPZmZzZXQsIE5VTEwsCisgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpLAorICAgICAgT2JqQXJyYXkpOwogfQotCi12b2lkIENQV0xfRWRpdDo6R2VuZXJhdGVQYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsCi0JCQkJCQkJCQljb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCkKLXsKLQlDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1RleHRPYmplY3QqPiBPYmpBcnJheTsKLQlJRlhfRWRpdDo6R2VuZXJhdGVQYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsIG1fcEVkaXQsIHB0T2Zmc2V0LCBOVUxMLCBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSxHZXRUcmFuc3BhcmVuY3koKSksIE9iakFycmF5KTsKLX0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcAppbmRleCAwZDE0NTg3Li5lYjYzMjRlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcApAQCAtMTIsMTcyICsxMiwxNDYgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIgogCi0jZGVmaW5lIElzRmxvYXRaZXJvKGYpICAgICAgICAgICAgICAgICAgICAgICgoZikgPCAwLjAwMDEgJiYgKGYpID4gLTAuMDAwMSkKLSNkZWZpbmUgSXNGbG9hdEJpZ2dlcihmYSxmYikgICAgICAgICAgICAgICAgKChmYSkgPiAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCi0jZGVmaW5lIElzRmxvYXRTbWFsbGVyKGZhLGZiKSAgICAgICAgICAgICAgICgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsZmIpICAgICAgICAgICAgICAgICBJc0Zsb2F0WmVybygoZmEpLShmYikpCisjZGVmaW5lIElzRmxvYXRaZXJvKGYpICgoZikgPCAwLjAwMDEgJiYgKGYpID4gLTAuMDAwMSkKKyNkZWZpbmUgSXNGbG9hdEJpZ2dlcihmYSwgZmIpICgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSwgZmIpICgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsIGZiKSBJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0VkaXRDdHJsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX0VkaXRDdHJsOjpDUFdMX0VkaXRDdHJsKCkgOgotICAgIG1fcEVkaXQoTlVMTCksCi0gICAgbV9wRWRpdENhcmV0KE5VTEwpLAotICAgIG1fYk1vdXNlRG93bihGQUxTRSksCi0gICAgbV9wRWRpdE5vdGlmeShOVUxMKSwKLSAgICBtX25DaGFyU2V0KERFRkFVTFRfQ0hBUlNFVCksCi0gICAgbV9uQ29kZVBhZ2UoMCkKLXsKLSAgICBtX3BFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKTsKLSAgICBBU1NFUlQobV9wRWRpdCAhPSBOVUxMKTsKK0NQV0xfRWRpdEN0cmw6OkNQV0xfRWRpdEN0cmwoKQorICAgIDogbV9wRWRpdChOVUxMKSwKKyAgICAgIG1fcEVkaXRDYXJldChOVUxMKSwKKyAgICAgIG1fYk1vdXNlRG93bihGQUxTRSksCisgICAgICBtX3BFZGl0Tm90aWZ5KE5VTEwpLAorICAgICAgbV9uQ2hhclNldChERUZBVUxUX0NIQVJTRVQpLAorICAgICAgbV9uQ29kZVBhZ2UoMCkgeworICBtX3BFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKTsKKyAgQVNTRVJUKG1fcEVkaXQgIT0gTlVMTCk7CiB9CiAKLUNQV0xfRWRpdEN0cmw6On5DUFdMX0VkaXRDdHJsKCkKLXsKLSAgICBJRlhfRWRpdDo6RGVsRWRpdChtX3BFZGl0KTsKK0NQV0xfRWRpdEN0cmw6On5DUFdMX0VkaXRDdHJsKCkgeworICBJRlhfRWRpdDo6RGVsRWRpdChtX3BFZGl0KTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKQotewotICAgIGNwLmVDdXJzb3JUeXBlID0gRlhDVF9WQkVBTTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfVkJFQU07CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6T25DcmVhdGVkKCkKLXsKLSAgICBTZXRGb250U2l6ZShHZXRDcmVhdGlvblBhcmFtKCkuZkZvbnRTaXplKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6T25DcmVhdGVkKCkgeworICBTZXRGb250U2l6ZShHZXRDcmVhdGlvblBhcmFtKCkuZkZvbnRTaXplKTsKIAotICAgIG1fcEVkaXQtPlNldEZvbnRNYXAoR2V0Rm9udE1hcCgpKTsKLSAgICBtX3BFZGl0LT5TZXROb3RpZnkodGhpcyk7Ci0gICAgbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOworICBtX3BFZGl0LT5TZXRGb250TWFwKEdldEZvbnRNYXAoKSk7CisgIG1fcEVkaXQtPlNldE5vdGlmeSh0aGlzKTsKKyAgbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOwogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6OklzV25kSG9yVigpCi17Ci0gICAgQ1BERl9NYXRyaXggbXQgPSBHZXRXaW5kb3dNYXRyaXgoKTsKLSAgICBDUERGX1BvaW50IHBvaW50MSgwLDEpOwotICAgIENQREZfUG9pbnQgcG9pbnQyKDEsMSk7CitGWF9CT09MIENQV0xfRWRpdEN0cmw6OklzV25kSG9yVigpIHsKKyAgQ1BERl9NYXRyaXggbXQgPSBHZXRXaW5kb3dNYXRyaXgoKTsKKyAgQ1BERl9Qb2ludCBwb2ludDEoMCwgMSk7CisgIENQREZfUG9pbnQgcG9pbnQyKDEsIDEpOwogCi0gICAgbXQuVHJhbnNmb3JtKHBvaW50MS54LCBwb2ludDEueSk7Ci0gICAgbXQuVHJhbnNmb3JtKHBvaW50Mi54LCBwb2ludDIueSk7CisgIG10LlRyYW5zZm9ybShwb2ludDEueCwgcG9pbnQxLnkpOworICBtdC5UcmFuc2Zvcm0ocG9pbnQyLngsIHBvaW50Mi55KTsKIAotICAgIHJldHVybiBwb2ludDIueSA9PSBwb2ludDEueTsKKyAgcmV0dXJuIHBvaW50Mi55ID09IHBvaW50MS55OwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlNldEN1cnNvcigpCi17Ci0gICAgaWYgKElzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoSXNXbmRIb3JWKCkpCi0gICAgICAgICAgICAgICAgcFNILT5TZXRDdXJzb3IoRlhDVF9WQkVBTSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcFNILT5TZXRDdXJzb3IoRlhDVF9IQkVBTSk7Ci0gICAgICAgIH0KK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0Q3Vyc29yKCkgeworICBpZiAoSXNWYWxpZCgpKSB7CisgICAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpIHsKKyAgICAgIGlmIChJc1duZEhvclYoKSkKKyAgICAgICAgcFNILT5TZXRDdXJzb3IoRlhDVF9WQkVBTSk7CisgICAgICBlbHNlCisgICAgICAgIHBTSC0+U2V0Q3Vyc29yKEZYQ1RfSEJFQU0pOwogICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlJlUG9zQ2hpbGRXbmQoKQotewotICAgIG1fcEVkaXQtPlNldFBsYXRlUmVjdChHZXRDbGllbnRSZWN0KCkpOwordm9pZCBDUFdMX0VkaXRDdHJsOjpSZVBvc0NoaWxkV25kKCkgeworICBtX3BFZGl0LT5TZXRQbGF0ZVJlY3QoR2V0Q2xpZW50UmVjdCgpKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0sIGludHB0cl90IGxQYXJhbSkKLXsKLSAgICBDUFdMX1duZDo6T25Ob3RpZnkocFduZCxtc2csd1BhcmFtLGxQYXJhbSk7Cit2b2lkIENQV0xfRWRpdEN0cmw6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7CisgIENQV0xfV25kOjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKIAotICAgIHN3aXRjaCAobXNnKQotICAgIHsKLSAgICAgICAgY2FzZSBQTk1fU0VUU0NST0xMSU5GTzoKLSAgICAgICAgICAgIHN3aXRjaCAod1BhcmFtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDUFdMX1duZCAqIHBDaGlsZCA9IEdldFZTY3JvbGxCYXIoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkLT5Pbk5vdGlmeShwV25kLFBOTV9TRVRTQ1JPTExJTkZPLHdQYXJhbSxsUGFyYW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUE5NX1NFVFNDUk9MTFBPUzoKLSAgICAgICAgICAgIHN3aXRjaCAod1BhcmFtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDUFdMX1duZCAqIHBDaGlsZCA9IEdldFZTY3JvbGxCYXIoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkLT5Pbk5vdGlmeShwV25kLFBOTV9TRVRTQ1JPTExQT1Msd1BhcmFtLGxQYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQTk1fU0NST0xMV0lORE9XOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQb3MgPSAqKEZYX0ZMT0FUKilsUGFyYW07Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3UGFyYW0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFNCVF9WU0NST0xMOgotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRWRpdC0+U2V0U2Nyb2xsUG9zKENQREZfUG9pbnQobV9wRWRpdC0+R2V0U2Nyb2xsUG9zKCkueCxmUG9zKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQTk1fU0VUQ0FSRVRJTkZPOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChQV0xfQ0FSRVRfSU5GTyAqIHBDYXJldEluZm8gPSAoUFdMX0NBUkVUX0lORk8gKil3UGFyYW0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRDYXJldChwQ2FyZXRJbmZvLT5iVmlzaWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDYXJldEluZm8tPnB0SGVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDYXJldEluZm8tPnB0Rm9vdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQorICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgUE5NX1NFVFNDUk9MTElORk86CisgICAgICBzd2l0Y2ggKHdQYXJhbSkgeworICAgICAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gR2V0VlNjcm9sbEJhcigpKSB7CisgICAgICAgICAgICBwQ2hpbGQtPk9uTm90aWZ5KHBXbmQsIFBOTV9TRVRTQ1JPTExJTkZPLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQTk1fU0VUU0NST0xMUE9TOgorICAgICAgc3dpdGNoICh3UGFyYW0pIHsKKyAgICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IEdldFZTY3JvbGxCYXIoKSkgeworICAgICAgICAgICAgcENoaWxkLT5Pbk5vdGlmeShwV25kLCBQTk1fU0VUU0NST0xMUE9TLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQTk1fU0NST0xMV0lORE9XOiB7CisgICAgICBGWF9GTE9BVCBmUG9zID0gKihGWF9GTE9BVCopbFBhcmFtOworICAgICAgc3dpdGNoICh3UGFyYW0pIHsKKyAgICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgICAgICBtX3BFZGl0LT5TZXRTY3JvbGxQb3MoQ1BERl9Qb2ludChtX3BFZGl0LT5HZXRTY3JvbGxQb3MoKS54LCBmUG9zKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIFBOTV9TRVRDQVJFVElORk86IHsKKyAgICAgIGlmIChQV0xfQ0FSRVRfSU5GTyogcENhcmV0SW5mbyA9IChQV0xfQ0FSRVRfSU5GTyopd1BhcmFtKSB7CisgICAgICAgIFNldENhcmV0KHBDYXJldEluZm8tPmJWaXNpYmxlLCBwQ2FyZXRJbmZvLT5wdEhlYWQsIHBDYXJldEluZm8tPnB0Rm9vdCk7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgfQogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotICAgIGlmICghSXNSZWFkT25seSgpKQotICAgICAgICBDcmVhdGVFZGl0Q2FyZXQoY3ApOwordm9pZCBDUFdMX0VkaXRDdHJsOjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIGlmICghSXNSZWFkT25seSgpKQorICAgIENyZWF0ZUVkaXRDYXJldChjcCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6Q3JlYXRlRWRpdENhcmV0KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotICAgIGlmICghbV9wRWRpdENhcmV0KQotICAgIHsKLSAgICAgICAgbV9wRWRpdENhcmV0ID0gbmV3IENQV0xfQ2FyZXQ7Ci0gICAgICAgIG1fcEVkaXRDYXJldC0+U2V0SW52YWxpZFJlY3QoR2V0Q2xpZW50UmVjdCgpKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6Q3JlYXRlRWRpdENhcmV0KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgaWYgKCFtX3BFZGl0Q2FyZXQpIHsKKyAgICBtX3BFZGl0Q2FyZXQgPSBuZXcgQ1BXTF9DYXJldDsKKyAgICBtX3BFZGl0Q2FyZXQtPlNldEludmFsaWRSZWN0KEdldENsaWVudFJlY3QoKSk7CiAKLSAgICAgICAgUFdMX0NSRUFURVBBUkFNIGVjcCA9IGNwOwotICAgICAgICBlY3AucFBhcmVudFduZCA9IHRoaXM7Ci0gICAgICAgIGVjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX05PUkVGUkVTSENMSVA7Ci0gICAgICAgIGVjcC5kd0JvcmRlcldpZHRoID0gMDsKLSAgICAgICAgZWNwLm5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKLSAgICAgICAgZWNwLnJjUmVjdFduZCA9IENQREZfUmVjdCgwLDAsMCwwKTsKKyAgICBQV0xfQ1JFQVRFUEFSQU0gZWNwID0gY3A7CisgICAgZWNwLnBQYXJlbnRXbmQgPSB0aGlzOworICAgIGVjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX05PUkVGUkVTSENMSVA7CisgICAgZWNwLmR3Qm9yZGVyV2lkdGggPSAwOworICAgIGVjcC5uQm9yZGVyU3R5bGUgPSBQQlNfU09MSUQ7CisgICAgZWNwLnJjUmVjdFduZCA9IENQREZfUmVjdCgwLCAwLCAwLCAwKTsKIAotICAgICAgICBtX3BFZGl0Q2FyZXQtPkNyZWF0ZShlY3ApOwotICAgIH0KKyAgICBtX3BFZGl0Q2FyZXQtPkNyZWF0ZShlY3ApOworICB9CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQotewotICAgIG1fcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Cit2b2lkIENQV0xfRWRpdEN0cmw6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICBtX3BFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwogfQogCi1GWF9GTE9BVCBDUFdMX0VkaXRDdHJsOjpHZXRGb250U2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcEVkaXQtPkdldEZvbnRTaXplKCk7CitGWF9GTE9BVCBDUFdMX0VkaXRDdHJsOjpHZXRGb250U2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEVkaXQtPkdldEZvbnRTaXplKCk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQotewotICAgIGlmIChtX2JNb3VzZURvd24pIHJldHVybiBUUlVFOworRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKG1fYk1vdXNlRG93bikKKyAgICByZXR1cm4gVFJVRTsKIAotICAgIEZYX0JPT0wgYlJldCA9IENQV0xfV25kOjpPbktleURvd24obkNoYXIsbkZsYWcpOworICBGWF9CT09MIGJSZXQgPSBDUFdMX1duZDo6T25LZXlEb3duKG5DaGFyLCBuRmxhZyk7CiAKLSAgICAvL0ZJTFRFUgotICAgIHN3aXRjaCAobkNoYXIpCi0gICAgeworICAvLyBGSUxURVIKKyAgc3dpdGNoIChuQ2hhcikgewogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICBjYXNlIEZXTF9WS0VZX0RlbGV0ZToKICAgICBjYXNlIEZXTF9WS0VZX1VwOgogICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKQEAgLTE5Niw1MjcgKzE3MCw0NjAgQEAKICAgICBjYXNlICd4JzoKICAgICBjYXNlICdhJzoKICAgICBjYXNlICd6JzoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgICAgYnJlYWs7CisgIH0KIAotICAgIGlmIChuQ2hhciA9PSBGV0xfVktFWV9EZWxldGUpCi0gICAgewotICAgICAgICBpZiAobV9wRWRpdC0+SXNTZWxlY3RlZCgpKQotICAgICAgICAgICAgbkNoYXIgPSBGV0xfVktFWV9Vbmtub3duOwotICAgIH0KKyAgaWYgKG5DaGFyID09IEZXTF9WS0VZX0RlbGV0ZSkgeworICAgIGlmIChtX3BFZGl0LT5Jc1NlbGVjdGVkKCkpCisgICAgICBuQ2hhciA9IEZXTF9WS0VZX1Vua25vd247CisgIH0KIAotICAgIHN3aXRjaCAobkNoYXIpCi0gICAgewotICAgICAgICBjYXNlIEZXTF9WS0VZX0RlbGV0ZToKLSAgICAgICAgICAgIERlbGV0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIGNhc2UgRldMX1ZLRVlfSW5zZXJ0OgotICAgICAgICAgICAgaWYgKElzU0hJRlRwcmVzc2VkKG5GbGFnKSkKLSAgICAgICAgICAgICAgICBQYXN0ZVRleHQoKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICBjYXNlIEZXTF9WS0VZX1VwOgotICAgICAgICAgICAgbV9wRWRpdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKLSAgICAgICAgICAgIG1fcEVkaXQtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKLSAgICAgICAgICAgIG1fcEVkaXQtPk9uVktfTEVGVChJc1NISUZUcHJlc3NlZChuRmxhZyksRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6Ci0gICAgICAgICAgICBtX3BFZGl0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxGQUxTRSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgY2FzZSBGV0xfVktFWV9Ib21lOgotICAgICAgICAgICAgbV9wRWRpdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgY2FzZSBGV0xfVktFWV9FbmQ6Ci0gICAgICAgICAgICBtX3BFZGl0LT5PblZLX0VORChJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIGNhc2UgRldMX1ZLRVlfVW5rbm93bjoKLSAgICAgICAgICAgIGlmICghSXNTSElGVHByZXNzZWQobkZsYWcpKQotICAgICAgICAgICAgICAgIENsZWFyKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQ3V0VGV4dCgpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gYlJldDsKLX0KLQotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgaWYgKG1fYk1vdXNlRG93bikgcmV0dXJuIFRSVUU7Ci0KLSAgICBDUFdMX1duZDo6T25DaGFyKG5DaGFyLG5GbGFnKTsKLQotICAgIC8vRklMVEVSCi0gICAgc3dpdGNoIChuQ2hhcikKLSAgICB7Ci0gICAgICAgIGNhc2UgMHgwQToKLSAgICAgICAgY2FzZSAweDFCOgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgRlhfQk9PTCBiQ3RybCA9IElzQ1RSTHByZXNzZWQobkZsYWcpOwotICAgIEZYX0JPT0wgYkFsdCA9IElzQUxUcHJlc3NlZChuRmxhZyk7Ci0gICAgRlhfQk9PTCBiU2hpZnQgPSBJc1NISUZUcHJlc3NlZChuRmxhZyk7Ci0KLSAgICBGWF9XT1JEIHdvcmQgPSBuQ2hhcjsKLQotICAgIGlmIChiQ3RybCAmJiAhYkFsdCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAobkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgJ0MnIC0gJ0EnICsgMToKLSAgICAgICAgICAgICAgICBDb3B5VGV4dCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgY2FzZSAnVicgLSAnQScgKyAxOgotICAgICAgICAgICAgICAgIFBhc3RlVGV4dCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgY2FzZSAnWCcgLSAnQScgKyAxOgotICAgICAgICAgICAgICAgIEN1dFRleHQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIGNhc2UgJ0EnIC0gJ0EnICsgMToKLSAgICAgICAgICAgICAgICBTZWxlY3RBbGwoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIGNhc2UgJ1onIC0gJ0EnICsgMToKLSAgICAgICAgICAgICAgICBpZiAoYlNoaWZ0KQotICAgICAgICAgICAgICAgICAgICBSZWRvKCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBVbmRvKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmIChuQ2hhciA8IDMyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoSXNSZWFkT25seSgpKSByZXR1cm4gVFJVRTsKLQotICAgIGlmIChtX3BFZGl0LT5Jc1NlbGVjdGVkKCkgJiYgd29yZCA9PSAgRldMX1ZLRVlfQmFjaykKLSAgICAgICAgd29yZCA9IEZXTF9WS0VZX1Vua25vd247Ci0KLSAgICBDbGVhcigpOwotCi0gICAgc3dpdGNoICh3b3JkKQotICAgIHsKLSAgICBjYXNlIEZXTF9WS0VZX0JhY2s6Ci0gICAgICAgIEJhY2tzcGFjZSgpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZXTF9WS0VZX1JldHVybjoKLSAgICAgICAgSW5zZXJ0UmV0dXJuKCk7Ci0gICAgICAgIGJyZWFrOworICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSBGV0xfVktFWV9EZWxldGU6CisgICAgICBEZWxldGUoKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRldMX1ZLRVlfSW5zZXJ0OgorICAgICAgaWYgKElzU0hJRlRwcmVzc2VkKG5GbGFnKSkKKyAgICAgICAgUGFzdGVUZXh0KCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgICAgbV9wRWRpdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksIEZBTFNFKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICAgIG1fcEVkaXQtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksIEZBTFNFKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKKyAgICAgIG1fcEVkaXQtPk9uVktfTEVGVChJc1NISUZUcHJlc3NlZChuRmxhZyksIEZBTFNFKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6CisgICAgICBtX3BFZGl0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgRkFMU0UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBGV0xfVktFWV9Ib21lOgorICAgICAgbV9wRWRpdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBGV0xfVktFWV9FbmQ6CisgICAgICBtX3BFZGl0LT5PblZLX0VORChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIGNhc2UgRldMX1ZLRVlfVW5rbm93bjoKLSAgICAgICAgYnJlYWs7CisgICAgICBpZiAoIUlzU0hJRlRwcmVzc2VkKG5GbGFnKSkKKyAgICAgICAgQ2xlYXIoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgQ3V0VGV4dCgpOworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKElzSU5TRVJUcHJlc3NlZChuRmxhZykpCi0gICAgICAgICAgICBEZWxldGUoKTsKLSAgICAgICAgSW5zZXJ0V29yZCh3b3JkLCBHZXRDaGFyU2V0KCkpOwotICAgICAgICBicmVhazsKLSAgICB9CisgICAgICBicmVhazsKKyAgfQogCi0gICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBiUmV0OwogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLSAgICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7Ci0KLSAgICBpZiAoQ2xpZW50SGl0VGVzdChwb2ludCkpCi0gICAgewotICAgICAgICBpZiAobV9iTW91c2VEb3duKQotICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QoKTsKLQotICAgICAgICBtX2JNb3VzZURvd24gPSBUUlVFOwotICAgICAgICBTZXRDYXB0dXJlKCk7Ci0KLSAgICAgICAgbV9wRWRpdC0+T25Nb3VzZURvd24ocG9pbnQsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLSAgICB9Ci0KK0ZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmIChtX2JNb3VzZURvd24pCiAgICAgcmV0dXJuIFRSVUU7CisKKyAgQ1BXTF9XbmQ6Ok9uQ2hhcihuQ2hhciwgbkZsYWcpOworCisgIC8vIEZJTFRFUgorICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSAweDBBOgorICAgIGNhc2UgMHgxQjoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBGWF9CT09MIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7CisgIEZYX0JPT0wgYkFsdCA9IElzQUxUcHJlc3NlZChuRmxhZyk7CisgIEZYX0JPT0wgYlNoaWZ0ID0gSXNTSElGVHByZXNzZWQobkZsYWcpOworCisgIEZYX1dPUkQgd29yZCA9IG5DaGFyOworCisgIGlmIChiQ3RybCAmJiAhYkFsdCkgeworICAgIHN3aXRjaCAobkNoYXIpIHsKKyAgICAgIGNhc2UgJ0MnIC0gJ0EnICsgMToKKyAgICAgICAgQ29weVRleHQoKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBjYXNlICdWJyAtICdBJyArIDE6CisgICAgICAgIFBhc3RlVGV4dCgpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGNhc2UgJ1gnIC0gJ0EnICsgMToKKyAgICAgICAgQ3V0VGV4dCgpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGNhc2UgJ0EnIC0gJ0EnICsgMToKKyAgICAgICAgU2VsZWN0QWxsKCk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgY2FzZSAnWicgLSAnQScgKyAxOgorICAgICAgICBpZiAoYlNoaWZ0KQorICAgICAgICAgIFJlZG8oKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFVuZG8oKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAobkNoYXIgPCAzMikKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisKKyAgaWYgKElzUmVhZE9ubHkoKSkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAobV9wRWRpdC0+SXNTZWxlY3RlZCgpICYmIHdvcmQgPT0gRldMX1ZLRVlfQmFjaykKKyAgICB3b3JkID0gRldMX1ZLRVlfVW5rbm93bjsKKworICBDbGVhcigpOworCisgIHN3aXRjaCAod29yZCkgeworICAgIGNhc2UgRldMX1ZLRVlfQmFjazoKKyAgICAgIEJhY2tzcGFjZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46CisgICAgICBJbnNlcnRSZXR1cm4oKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfVW5rbm93bjoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoSXNJTlNFUlRwcmVzc2VkKG5GbGFnKSkKKyAgICAgICAgRGVsZXRlKCk7CisgICAgICBJbnNlcnRXb3JkKHdvcmQsIEdldENoYXJTZXQoKSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LG5GbGFnKTsKK0ZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKIAorICBpZiAoQ2xpZW50SGl0VGVzdChwb2ludCkpIHsKICAgICBpZiAobV9iTW91c2VEb3duKQotICAgIHsKLSAgICAgICAgLy9jYW4gcmVjZWl2ZSBrZXlib3JkIG1lc3NhZ2UKLSAgICAgICAgaWYgKENsaWVudEhpdFRlc3QocG9pbnQpICYmICFJc0ZvY3VzZWQoKSkKLSAgICAgICAgICAgIFNldEZvY3VzKCk7CisgICAgICBJbnZhbGlkYXRlUmVjdCgpOwogCi0gICAgICAgIFJlbGVhc2VDYXB0dXJlKCk7Ci0gICAgICAgIG1fYk1vdXNlRG93biA9IEZBTFNFOworICAgIG1fYk1vdXNlRG93biA9IFRSVUU7CisgICAgU2V0Q2FwdHVyZSgpOworCisgICAgbV9wRWRpdC0+T25Nb3VzZURvd24ocG9pbnQsIElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCwgbkZsYWcpOworCisgIGlmIChtX2JNb3VzZURvd24pIHsKKyAgICAvLyBjYW4gcmVjZWl2ZSBrZXlib3JkIG1lc3NhZ2UKKyAgICBpZiAoQ2xpZW50SGl0VGVzdChwb2ludCkgJiYgIUlzRm9jdXNlZCgpKQorICAgICAgU2V0Rm9jdXMoKTsKKworICAgIFJlbGVhc2VDYXB0dXJlKCk7CisgICAgbV9iTW91c2VEb3duID0gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTW91c2VNb3ZlKHBvaW50LCBuRmxhZyk7CisKKyAgaWYgKG1fYk1vdXNlRG93bikKKyAgICBtX3BFZGl0LT5Pbk1vdXNlTW92ZShwb2ludCwgRkFMU0UsIEZBTFNFKTsKKworICByZXR1cm4gVFJVRTsKK30KKworQ1BERl9SZWN0IENQV0xfRWRpdEN0cmw6OkdldENvbnRlbnRSZWN0KCkgY29uc3QgeworICByZXR1cm4gbV9wRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRFZGl0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSkgeworICBDUERGX1BvaW50IHB0SGVhZCgwLCAwKSwgcHRGb290KDAsIDApOworCisgIGlmIChiVmlzaWJsZSkgeworICAgIEdldENhcmV0SW5mbyhwdEhlYWQsIHB0Rm9vdCk7CisgIH0KKworICBDUFZUX1dvcmRQbGFjZSB3cFRlbXAgPSBtX3BFZGl0LT5HZXRDYXJldFdvcmRQbGFjZSgpOworICBJT25TZXRDYXJldChiVmlzaWJsZSwgcHRIZWFkLCBwdEZvb3QsIHdwVGVtcCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6R2V0Q2FyZXRJbmZvKENQREZfUG9pbnQmIHB0SGVhZCwgQ1BERl9Qb2ludCYgcHRGb290KSBjb25zdCB7CisgIGlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgIHBJdGVyYXRvci0+U2V0QXQobV9wRWRpdC0+R2V0Q2FyZXQoKSk7CisgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgQ1BWVF9MaW5lIGxpbmU7CisgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgcHRIZWFkLnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7CisgICAgICBwdEhlYWQueSA9IHdvcmQucHRXb3JkLnkgKyB3b3JkLmZBc2NlbnQ7CisgICAgICBwdEZvb3QueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKKyAgICAgIHB0Rm9vdC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQ7CisgICAgfSBlbHNlIGlmIChwSXRlcmF0b3ItPkdldExpbmUobGluZSkpIHsKKyAgICAgIHB0SGVhZC54ID0gbGluZS5wdExpbmUueDsKKyAgICAgIHB0SGVhZC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQ7CisgICAgICBwdEZvb3QueCA9IGxpbmUucHRMaW5lLng7CisgICAgICBwdEZvb3QueSA9IGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudDsKICAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKKyAgfQogfQogCi1GWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0gICAgQ1BXTF9XbmQ6Ok9uTW91c2VNb3ZlKHBvaW50LG5GbGFnKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6R2V0Q2FyZXRQb3MoaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgY29uc3QgeworICBDUERGX1BvaW50IHB0SGVhZCgwLCAwKSwgcHRGb290KDAsIDApOwogCi0gICAgaWYgKG1fYk1vdXNlRG93bikKLSAgICAgICAgbV9wRWRpdC0+T25Nb3VzZU1vdmUocG9pbnQsRkFMU0UsRkFMU0UpOworICBHZXRDYXJldEluZm8ocHRIZWFkLCBwdEZvb3QpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgIFBXTHRvV25kKHB0SGVhZCwgeCwgeSk7CiB9CiAKLUNQREZfUmVjdCBDUFdMX0VkaXRDdHJsOjpHZXRDb250ZW50UmVjdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7Cit2b2lkIENQV0xfRWRpdEN0cmw6OlNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0SGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRGb290KSB7CisgIGlmIChtX3BFZGl0Q2FyZXQpIHsKKyAgICBpZiAoIUlzRm9jdXNlZCgpIHx8IG1fcEVkaXQtPklzU2VsZWN0ZWQoKSkKKyAgICAgIGJWaXNpYmxlID0gRkFMU0U7CisKKyAgICBtX3BFZGl0Q2FyZXQtPlNldENhcmV0KGJWaXNpYmxlLCBwdEhlYWQsIHB0Rm9vdCk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRFZGl0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSkKLXsKLSAgICBDUERGX1BvaW50IHB0SGVhZCgwLDApLHB0Rm9vdCgwLDApOworRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpJc01vZGlmaWVkKCkgY29uc3QgeworICByZXR1cm4gbV9wRWRpdC0+SXNNb2RpZmllZCgpOworfQogCi0gICAgaWYgKGJWaXNpYmxlKQotICAgIHsKLSAgICAgICAgR2V0Q2FyZXRJbmZvKHB0SGVhZCxwdEZvb3QpOworQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9FZGl0Q3RybDo6R2V0VGV4dCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKSB7CisgIG1fcEVkaXQtPlNldFNlbChuU3RhcnRDaGFyLCBuRW5kQ2hhcik7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6R2V0U2VsKGludDMyX3QmIG5TdGFydENoYXIsIGludDMyX3QmIG5FbmRDaGFyKSBjb25zdCB7CisgIG1fcEVkaXQtPkdldFNlbChuU3RhcnRDaGFyLCBuRW5kQ2hhcik7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6Q2xlYXIoKSB7CisgIGlmICghSXNSZWFkT25seSgpKQorICAgIG1fcEVkaXQtPkNsZWFyKCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2VsZWN0QWxsKCkgeworICBtX3BFZGl0LT5TZWxlY3RBbGwoKTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpQYWludCgpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+UGFpbnQoKTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+RW5hYmxlUmVmcmVzaChiUmVmcmVzaCk7Cit9CisKK2ludDMyX3QgQ1BXTF9FZGl0Q3RybDo6R2V0Q2FyZXQoKSBjb25zdCB7CisgIGlmIChtX3BFZGl0KQorICAgIHJldHVybiBtX3BFZGl0LT5HZXRDYXJldCgpOworCisgIHJldHVybiAtMTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRDYXJldChpbnQzMl90IG5Qb3MpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+U2V0Q2FyZXQoblBvcyk7Cit9CisKK2ludDMyX3QgQ1BXTF9FZGl0Q3RybDo6R2V0VG90YWxXb3JkcygpIGNvbnN0IHsKKyAgaWYgKG1fcEVkaXQpCisgICAgcmV0dXJuIG1fcEVkaXQtPkdldFRvdGFsV29yZHMoKTsKKworICByZXR1cm4gMDsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+U2V0U2Nyb2xsUG9zKHBvaW50KTsKK30KKworQ1BERl9Qb2ludCBDUFdMX0VkaXRDdHJsOjpHZXRTY3JvbGxQb3MoKSBjb25zdCB7CisgIGlmIChtX3BFZGl0KQorICAgIHJldHVybiBtX3BFZGl0LT5HZXRTY3JvbGxQb3MoKTsKKworICByZXR1cm4gQ1BERl9Qb2ludCgwLjBmLCAwLjBmKTsKK30KKworQ1BERl9Gb250KiBDUFdMX0VkaXRDdHJsOjpHZXRDYXJldEZvbnQoKSBjb25zdCB7CisgIGludDMyX3QgbkZvbnRJbmRleCA9IDA7CisKKyAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3BFZGl0LT5HZXRDYXJldCgpKTsKKyAgICBDUFZUX1dvcmQgd29yZDsKKyAgICBDUFZUX1NlY3Rpb24gc2VjdGlvbjsKKyAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICBuRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OworICAgIH0gZWxzZSBpZiAoSGFzRmxhZyhQRVNfUklDSCkpIHsKKyAgICAgIGlmIChwSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjdGlvbikpIHsKKyAgICAgICAgbkZvbnRJbmRleCA9IHNlY3Rpb24uV29yZFByb3BzLm5Gb250SW5kZXg7CisgICAgICB9CiAgICAgfQorICB9CiAKLSAgICBDUFZUX1dvcmRQbGFjZSB3cFRlbXAgPSBtX3BFZGl0LT5HZXRDYXJldFdvcmRQbGFjZSgpOwotICAgIElPblNldENhcmV0KGJWaXNpYmxlLHB0SGVhZCxwdEZvb3Qsd3BUZW1wKTsKKyAgaWYgKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwID0gR2V0Rm9udE1hcCgpKQorICAgIHJldHVybiBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KTsKKworICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpHZXRDYXJldEluZm8oQ1BERl9Qb2ludCAmIHB0SGVhZCwgQ1BERl9Qb2ludCAmIHB0Rm9vdCkgY29uc3QKLXsKLSAgICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpKQotICAgIHsKLSAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3BFZGl0LT5HZXRDYXJldCgpKTsKLSAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7Ci0gICAgICAgIENQVlRfTGluZSBsaW5lOwotICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdEhlYWQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKLSAgICAgICAgICAgIHB0SGVhZC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkFzY2VudDsKLSAgICAgICAgICAgIHB0Rm9vdC54ID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOwotICAgICAgICAgICAgcHRGb290LnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwSXRlcmF0b3ItPkdldExpbmUobGluZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB0SGVhZC54ID0gbGluZS5wdExpbmUueDsKLSAgICAgICAgICAgIHB0SGVhZC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQ7Ci0gICAgICAgICAgICBwdEZvb3QueCA9IGxpbmUucHRMaW5lLng7Ci0gICAgICAgICAgICBwdEZvb3QueSA9IGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudDsKLSAgICAgICAgfQorRlhfRkxPQVQgQ1BXTF9FZGl0Q3RybDo6R2V0Q2FyZXRGb250U2l6ZSgpIGNvbnN0IHsKKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKKworICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcEVkaXQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICBwSXRlcmF0b3ItPlNldEF0KG1fcEVkaXQtPkdldENhcmV0KCkpOworICAgIENQVlRfV29yZCB3b3JkOworICAgIENQVlRfU2VjdGlvbiBzZWN0aW9uOworICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgIGZGb250U2l6ZSA9IHdvcmQuZkZvbnRTaXplOworICAgIH0gZWxzZSBpZiAoSGFzRmxhZyhQRVNfUklDSCkpIHsKKyAgICAgIGlmIChwSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjdGlvbikpIHsKKyAgICAgICAgZkZvbnRTaXplID0gc2VjdGlvbi5Xb3JkUHJvcHMuZkZvbnRTaXplOworICAgICAgfQogICAgIH0KKyAgfQorCisgIHJldHVybiBmRm9udFNpemU7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6R2V0Q2FyZXRQb3MoaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgY29uc3QKLXsKLSAgICBDUERGX1BvaW50IHB0SGVhZCgwLDApLCBwdEZvb3QoMCwwKTsKLQotICAgIEdldENhcmV0SW5mbyhwdEhlYWQscHRGb290KTsKLQotICAgIFBXTHRvV25kKHB0SGVhZCwgeCwgeSk7Cit2b2lkIENQV0xfRWRpdEN0cmw6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCkgeworICBtX3BFZGl0LT5TZXRUZXh0KGNzVGV4dCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwgY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCkKLXsKLSAgICBpZiAobV9wRWRpdENhcmV0KQotICAgIHsKLSAgICAgICAgaWYgKCFJc0ZvY3VzZWQoKSB8fCBtX3BFZGl0LT5Jc1NlbGVjdGVkKCkpCi0gICAgICAgICAgICBiVmlzaWJsZSA9IEZBTFNFOwordm9pZCBDUFdMX0VkaXRDdHJsOjpDb3B5VGV4dCgpIHt9CiAKLSAgICAgICAgbV9wRWRpdENhcmV0LT5TZXRDYXJldChiVmlzaWJsZSwgcHRIZWFkLCBwdEZvb3QpOwordm9pZCBDUFdMX0VkaXRDdHJsOjpQYXN0ZVRleHQoKSB7fQorCit2b2lkIENQV0xfRWRpdEN0cmw6OkN1dFRleHQoKSB7fQorCit2b2lkIENQV0xfRWRpdEN0cmw6OlNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpIHt9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6SW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KSB7CisgIGlmICghSXNSZWFkT25seSgpKQorICAgIG1fcEVkaXQtPkluc2VydFRleHQoY3NUZXh0KTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgaW50MzJfdCBuQ2hhcnNldCkgeworICBpZiAoIUlzUmVhZE9ubHkoKSkKKyAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKHdvcmQsIG5DaGFyc2V0KTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpJbnNlcnRSZXR1cm4oKSB7CisgIGlmICghSXNSZWFkT25seSgpKQorICAgIG1fcEVkaXQtPkluc2VydFJldHVybigpOworfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OkRlbGV0ZSgpIHsKKyAgaWYgKCFJc1JlYWRPbmx5KCkpCisgICAgbV9wRWRpdC0+RGVsZXRlKCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6QmFja3NwYWNlKCkgeworICBpZiAoIUlzUmVhZE9ubHkoKSkKKyAgICBtX3BFZGl0LT5CYWNrc3BhY2UoKTsKK30KKworRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpDYW5VbmRvKCkgY29uc3QgeworICByZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5DYW5VbmRvKCk7Cit9CisKK0ZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6Q2FuUmVkbygpIGNvbnN0IHsKKyAgcmV0dXJuICFJc1JlYWRPbmx5KCkgJiYgbV9wRWRpdC0+Q2FuUmVkbygpOworfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OlJlZG8oKSB7CisgIGlmIChDYW5SZWRvKCkpCisgICAgbV9wRWRpdC0+UmVkbygpOworfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OlVuZG8oKSB7CisgIGlmIChDYW5VbmRvKCkpCisgICAgbV9wRWRpdC0+VW5kbygpOworfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OklPblNldFNjcm9sbEluZm9ZKEZYX0ZMT0FUIGZQbGF0ZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBsYXRlTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTbWFsbFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZCaWdTdGVwKSB7CisgIFBXTF9TQ1JPTExfSU5GTyBJbmZvOworCisgIEluZm8uZlBsYXRlV2lkdGggPSBmUGxhdGVNYXggLSBmUGxhdGVNaW47CisgIEluZm8uZkNvbnRlbnRNaW4gPSBmQ29udGVudE1pbjsKKyAgSW5mby5mQ29udGVudE1heCA9IGZDb250ZW50TWF4OworICBJbmZvLmZTbWFsbFN0ZXAgPSBmU21hbGxTdGVwOworICBJbmZvLmZCaWdTdGVwID0gZkJpZ1N0ZXA7CisKKyAgT25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTElORk8sIFNCVF9WU0NST0xMLCAoaW50cHRyX3QpJkluZm8pOworCisgIGlmIChJc0Zsb2F0QmlnZ2VyKEluZm8uZlBsYXRlV2lkdGgsIEluZm8uZkNvbnRlbnRNYXggLSBJbmZvLmZDb250ZW50TWluKSB8fAorICAgICAgSXNGbG9hdEVxdWFsKEluZm8uZlBsYXRlV2lkdGgsIEluZm8uZkNvbnRlbnRNYXggLSBJbmZvLmZDb250ZW50TWluKSkgeworICAgIFNob3dWU2Nyb2xsQmFyKEZBTFNFKTsKKyAgfSBlbHNlIHsKKyAgICBTaG93VlNjcm9sbEJhcihUUlVFKTsKKyAgfQorfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OklPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpIHsKKyAgT25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmZnkpOworfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OklPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0SGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRGb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKKyAgUFdMX0NBUkVUX0lORk8gY0luZm87CisgIGNJbmZvLmJWaXNpYmxlID0gYlZpc2libGU7CisgIGNJbmZvLnB0SGVhZCA9IHB0SGVhZDsKKyAgY0luZm8ucHRGb290ID0gcHRGb290OworCisgIE9uTm90aWZ5KHRoaXMsIFBOTV9TRVRDQVJFVElORk8sIChpbnRwdHJfdCkmY0luZm8sIChpbnRwdHJfdClOVUxMKTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpJT25DYXJldENoYW5nZShjb25zdCBDUFZUX1NlY1Byb3BzJiBzZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIHdvcmRQcm9wcykge30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpJT25Db250ZW50Q2hhbmdlKGNvbnN0IENQREZfUmVjdCYgcmNDb250ZW50KSB7CisgIGlmIChJc1ZhbGlkKCkpIHsKKyAgICBpZiAobV9wRWRpdE5vdGlmeSkgeworICAgICAgbV9wRWRpdE5vdGlmeS0+T25Db250ZW50Q2hhbmdlKHJjQ29udGVudCk7CiAgICAgfQorICB9CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6SXNNb2RpZmllZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcEVkaXQtPklzTW9kaWZpZWQoKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0KiBwUmVjdCkgeworICBJbnZhbGlkYXRlUmVjdChwUmVjdCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQV0xfRWRpdEN0cmw6OkdldFRleHQoKSBjb25zdAotewotICAgIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0KCk7CitpbnQzMl90IENQV0xfRWRpdEN0cmw6OkdldENoYXJTZXQoKSBjb25zdCB7CisgIHJldHVybiBtX25DaGFyU2V0IDwgMCA/IERFRkFVTFRfQ0hBUlNFVCA6IG1fbkNoYXJTZXQ7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0U2VsKGludDMyX3QgblN0YXJ0Q2hhcixpbnQzMl90IG5FbmRDaGFyKQotewotICAgIG1fcEVkaXQtPlNldFNlbChuU3RhcnRDaGFyLCBuRW5kQ2hhcik7Cit2b2lkIENQV0xfRWRpdEN0cmw6OkdldFRleHRSYW5nZShjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuU3RhcnRDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0IHsKKyAgblN0YXJ0Q2hhciA9IG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KAorICAgICAgbV9wRWRpdC0+U2VhcmNoV29yZFBsYWNlKENQREZfUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkpKTsKKyAgbkVuZENoYXIgPSBtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCgKKyAgICAgIG1fcEVkaXQtPlNlYXJjaFdvcmRQbGFjZShDUERGX1BvaW50KHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKSkpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OkdldFNlbChpbnQzMl90ICYgblN0YXJ0Q2hhciwgaW50MzJfdCAmIG5FbmRDaGFyICkgY29uc3QKLXsKLSAgICBtX3BFZGl0LT5HZXRTZWwoblN0YXJ0Q2hhciwgbkVuZENoYXIpOworQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9FZGl0Q3RybDo6R2V0VGV4dChpbnQzMl90JiBuU3RhcnRDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3QgeworICBDUFZUX1dvcmRQbGFjZSB3cFN0YXJ0ID0gbV9wRWRpdC0+V29yZEluZGV4VG9Xb3JkUGxhY2UoblN0YXJ0Q2hhcik7CisgIENQVlRfV29yZFBsYWNlIHdwRW5kID0gbV9wRWRpdC0+V29yZEluZGV4VG9Xb3JkUGxhY2UobkVuZENoYXIpOworICByZXR1cm4gbV9wRWRpdC0+R2V0UmFuZ2VUZXh0KENQVlRfV29yZFJhbmdlKHdwU3RhcnQsIHdwRW5kKSk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6Q2xlYXIoKQotewotICAgIGlmICghSXNSZWFkT25seSgpKQotICAgICAgICBtX3BFZGl0LT5DbGVhcigpOwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OlNlbGVjdEFsbCgpCi17Ci0gICAgbV9wRWRpdC0+U2VsZWN0QWxsKCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6UGFpbnQoKQotewotICAgIGlmIChtX3BFZGl0KQotICAgICAgICBtX3BFZGl0LT5QYWludCgpOwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OkVuYWJsZVJlZnJlc2goRlhfQk9PTCBiUmVmcmVzaCkKLXsKLSAgICBpZiAobV9wRWRpdCkKLSAgICAgICAgbV9wRWRpdC0+RW5hYmxlUmVmcmVzaChiUmVmcmVzaCk7Ci19Ci0KLWludDMyX3QgQ1BXTF9FZGl0Q3RybDo6R2V0Q2FyZXQoKSBjb25zdAotewotICAgIGlmIChtX3BFZGl0KQotICAgICAgICByZXR1cm4gbV9wRWRpdC0+R2V0Q2FyZXQoKTsKLQotICAgIHJldHVybiAtMTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRDYXJldChpbnQzMl90IG5Qb3MpCi17Ci0gICAgaWYgKG1fcEVkaXQpCi0gICAgICAgIG1fcEVkaXQtPlNldENhcmV0KG5Qb3MpOwotfQotCi1pbnQzMl90IENQV0xfRWRpdEN0cmw6OkdldFRvdGFsV29yZHMoKSBjb25zdAotewotICAgIGlmIChtX3BFZGl0KQotICAgICAgICByZXR1cm4gbV9wRWRpdC0+R2V0VG90YWxXb3JkcygpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotICAgIGlmIChtX3BFZGl0KQotICAgICAgICBtX3BFZGl0LT5TZXRTY3JvbGxQb3MocG9pbnQpOwotfQotCi1DUERGX1BvaW50IENQV0xfRWRpdEN0cmw6OkdldFNjcm9sbFBvcygpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcEVkaXQpCi0gICAgICAgIHJldHVybiBtX3BFZGl0LT5HZXRTY3JvbGxQb3MoKTsKLQotICAgIHJldHVybiBDUERGX1BvaW50KDAuMGYsIDAuMGYpOwotfQotCi1DUERGX0ZvbnQgKiBDUFdMX0VkaXRDdHJsOjpHZXRDYXJldEZvbnQoKSBjb25zdAotewotICAgIGludDMyX3QgbkZvbnRJbmRleCA9IDA7Ci0KLSAgICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpKQotICAgIHsKLSAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3BFZGl0LT5HZXRDYXJldCgpKTsKLSAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7Ci0gICAgICAgIENQVlRfU2VjdGlvbiBzZWN0aW9uOwotICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBuRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKEhhc0ZsYWcoUEVTX1JJQ0gpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5Gb250SW5kZXggPSBzZWN0aW9uLldvcmRQcm9wcy5uRm9udEluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwID0gR2V0Rm9udE1hcCgpKQotICAgICAgICByZXR1cm4gcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotRlhfRkxPQVQgQ1BXTF9FZGl0Q3RybDo6R2V0Q2FyZXRGb250U2l6ZSgpIGNvbnN0Ci17Ci0gICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKLQotICAgIGlmIChJRlhfRWRpdF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcEVkaXQtPkdldEl0ZXJhdG9yKCkpCi0gICAgewotICAgICAgICBwSXRlcmF0b3ItPlNldEF0KG1fcEVkaXQtPkdldENhcmV0KCkpOwotICAgICAgICBDUFZUX1dvcmQgd29yZDsKLSAgICAgICAgQ1BWVF9TZWN0aW9uIHNlY3Rpb247Ci0gICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZGb250U2l6ZSA9IHdvcmQuZkZvbnRTaXplOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKEhhc0ZsYWcoUEVTX1JJQ0gpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZGb250U2l6ZSA9IHNlY3Rpb24uV29yZFByb3BzLmZGb250U2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmRm9udFNpemU7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KQotewotICAgIG1fcEVkaXQtPlNldFRleHQoY3NUZXh0KTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpDb3B5VGV4dCgpCi17Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6UGFzdGVUZXh0KCkKLXsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpDdXRUZXh0KCkKLXsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KQotewotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6Okluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCkKLXsKLSAgICBpZiAoIUlzUmVhZE9ubHkoKSkKLSAgICAgICAgbV9wRWRpdC0+SW5zZXJ0VGV4dChjc1RleHQpOwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6Okluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5DaGFyc2V0KQotewotICAgIGlmICghSXNSZWFkT25seSgpKQotICAgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKHdvcmQsIG5DaGFyc2V0KTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpJbnNlcnRSZXR1cm4oKQotewotICAgIGlmICghSXNSZWFkT25seSgpKQotICAgICAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oKTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpEZWxldGUoKQotewotICAgIGlmICghSXNSZWFkT25seSgpKQotICAgICAgICBtX3BFZGl0LT5EZWxldGUoKTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpCYWNrc3BhY2UoKQotewotICAgIGlmICghSXNSZWFkT25seSgpKQotICAgICAgICBtX3BFZGl0LT5CYWNrc3BhY2UoKTsKLX0KLQotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpDYW5VbmRvKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5DYW5VbmRvKCk7Ci19Ci0KLUZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6Q2FuUmVkbygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICFJc1JlYWRPbmx5KCkgJiYgbV9wRWRpdC0+Q2FuUmVkbygpOwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OlJlZG8oKQotewotICAgIGlmIChDYW5SZWRvKCkpCi0gICAgICAgIG1fcEVkaXQtPlJlZG8oKTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpVbmRvKCkKLXsKLSAgICBpZiAoQ2FuVW5kbygpKQotICAgICAgICBtX3BFZGl0LT5VbmRvKCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1pbiwgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCkKLXsKLSAgICBQV0xfU0NST0xMX0lORk8gSW5mbzsKLQotICAgIEluZm8uZlBsYXRlV2lkdGggPSBmUGxhdGVNYXggLSBmUGxhdGVNaW47Ci0gICAgSW5mby5mQ29udGVudE1pbiA9IGZDb250ZW50TWluOwotICAgIEluZm8uZkNvbnRlbnRNYXggPSBmQ29udGVudE1heDsKLSAgICBJbmZvLmZTbWFsbFN0ZXAgPSBmU21hbGxTdGVwOwotICAgIEluZm8uZkJpZ1N0ZXAgPSBmQmlnU3RlcDsKLQotICAgIE9uTm90aWZ5KHRoaXMsUE5NX1NFVFNDUk9MTElORk8sU0JUX1ZTQ1JPTEwsKGludHB0cl90KSZJbmZvKTsKLQotICAgIGlmIChJc0Zsb2F0QmlnZ2VyKEluZm8uZlBsYXRlV2lkdGgsSW5mby5mQ29udGVudE1heC1JbmZvLmZDb250ZW50TWluKQotICAgICAgICB8fCBJc0Zsb2F0RXF1YWwoSW5mby5mUGxhdGVXaWR0aCxJbmZvLmZDb250ZW50TWF4LUluZm8uZkNvbnRlbnRNaW4pKQotICAgIHsKLSAgICAgICAgU2hvd1ZTY3JvbGxCYXIoRkFMU0UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTaG93VlNjcm9sbEJhcihUUlVFKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSkKLXsKLSAgICBPbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMUE9TLFNCVF9WU0NST0xMLCAoaW50cHRyX3QpJmZ5KTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpJT25TZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpCi17Ci0gICAgUFdMX0NBUkVUX0lORk8gY0luZm87Ci0gICAgY0luZm8uYlZpc2libGUgPSBiVmlzaWJsZTsKLSAgICBjSW5mby5wdEhlYWQgPSBwdEhlYWQ7Ci0gICAgY0luZm8ucHRGb290ID0gcHRGb290OwotCi0gICAgT25Ob3RpZnkodGhpcywgUE5NX1NFVENBUkVUSU5GTywgKGludHB0cl90KSZjSW5mbywgKGludHB0cl90KU5VTEwpOwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OklPbkNhcmV0Q2hhbmdlKGNvbnN0IENQVlRfU2VjUHJvcHMgJiBzZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiB3b3JkUHJvcHMpCi17Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uQ29udGVudENoYW5nZShjb25zdCBDUERGX1JlY3QmIHJjQ29udGVudCkKLXsKLSAgICBpZiAoSXNWYWxpZCgpKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEVkaXROb3RpZnkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcEVkaXROb3RpZnktPk9uQ29udGVudENoYW5nZShyY0NvbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OklPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCAqIHBSZWN0KQotewotICAgIEludmFsaWRhdGVSZWN0KHBSZWN0KTsKLX0KLQotaW50MzJfdCBDUFdMX0VkaXRDdHJsOjpHZXRDaGFyU2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9uQ2hhclNldCA8IDAgPyBERUZBVUxUX0NIQVJTRVQgOiBtX25DaGFyU2V0OwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OkdldFRleHRSYW5nZShjb25zdCBDUERGX1JlY3QmIHJlY3QsIGludDMyX3QgJiBuU3RhcnRDaGFyLCBpbnQzMl90ICYgbkVuZENoYXIpIGNvbnN0Ci17Ci0gICAgblN0YXJ0Q2hhciA9IG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fcEVkaXQtPlNlYXJjaFdvcmRQbGFjZShDUERGX1BvaW50KHJlY3QubGVmdCwgcmVjdC50b3ApKSk7Ci0gICAgbkVuZENoYXIgPSBtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX3BFZGl0LT5TZWFyY2hXb3JkUGxhY2UoQ1BERl9Qb2ludChyZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSkpKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9FZGl0Q3RybDo6R2V0VGV4dChpbnQzMl90ICYgblN0YXJ0Q2hhciwgaW50MzJfdCAmIG5FbmRDaGFyKSBjb25zdAotewotICAgIENQVlRfV29yZFBsYWNlIHdwU3RhcnQgPSBtX3BFZGl0LT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuU3RhcnRDaGFyKTsKLSAgICBDUFZUX1dvcmRQbGFjZSB3cEVuZCA9IG1fcEVkaXQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5FbmRDaGFyKTsKLSAgICByZXR1cm4gbV9wRWRpdC0+R2V0UmFuZ2VUZXh0KENQVlRfV29yZFJhbmdlKHdwU3RhcnQsIHdwRW5kKSk7Ci19Ci0KLXZvaWQgICAgQ1BXTF9FZGl0Q3RybDo6U2V0UmVhZHlUb0lucHV0KCkKLXsKLSAgICBpZiAobV9iTW91c2VEb3duKQotICAgIHsKLSAgICAgICAgUmVsZWFzZUNhcHR1cmUoKTsKLSAgICAgICAgbV9iTW91c2VEb3duID0gRkFMU0U7Ci0gICAgfQordm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRSZWFkeVRvSW5wdXQoKSB7CisgIGlmIChtX2JNb3VzZURvd24pIHsKKyAgICBSZWxlYXNlQ2FwdHVyZSgpOworICAgIG1fYk1vdXNlRG93biA9IEZBTFNFOworICB9CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Gb250TWFwLmNwcAppbmRleCA1ZmI5Yzk5Li42NWZjOWE2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRm9udE1hcC5jcHAKQEAgLTgsMTkxICs4LDE1OCBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIgogCi0jZGVmaW5lIERFRkFVTFRfRk9OVF9OQU1FICAgICAgICAgICAiSGVsdmV0aWNhIgorI2RlZmluZSBERUZBVUxUX0ZPTlRfTkFNRSAiSGVsdmV0aWNhIgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Gb250TWFwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX0ZvbnRNYXA6OkNQV0xfRm9udE1hcChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpIDoKLSAgICBtX3BQREZEb2MoTlVMTCksCi0gICAgbV9wU3lzdGVtSGFuZGxlcihwU3lzdGVtSGFuZGxlcikKLXsKLSAgICBBU1NFUlQobV9wU3lzdGVtSGFuZGxlciAhPSBOVUxMKTsKK0NQV0xfRm9udE1hcDo6Q1BXTF9Gb250TWFwKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcikKKyAgICA6IG1fcFBERkRvYyhOVUxMKSwgbV9wU3lzdGVtSGFuZGxlcihwU3lzdGVtSGFuZGxlcikgeworICBBU1NFUlQobV9wU3lzdGVtSGFuZGxlciAhPSBOVUxMKTsKIH0KIAotQ1BXTF9Gb250TWFwOjp+Q1BXTF9Gb250TWFwKCkKLXsKLSAgICBkZWxldGUgbV9wUERGRG9jOwotICAgIG1fcFBERkRvYyA9IE5VTEw7CitDUFdMX0ZvbnRNYXA6On5DUFdMX0ZvbnRNYXAoKSB7CisgIGRlbGV0ZSBtX3BQREZEb2M7CisgIG1fcFBERkRvYyA9IE5VTEw7CiAKLSAgICBFbXB0eSgpOworICBFbXB0eSgpOwogfQogCi12b2lkIENQV0xfRm9udE1hcDo6U2V0U3lzdGVtSGFuZGxlcihJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpCi17Ci0gICAgbV9wU3lzdGVtSGFuZGxlciA9IHBTeXN0ZW1IYW5kbGVyOwordm9pZCBDUFdMX0ZvbnRNYXA6OlNldFN5c3RlbUhhbmRsZXIoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKSB7CisgIG1fcFN5c3RlbUhhbmRsZXIgPSBwU3lzdGVtSGFuZGxlcjsKIH0KIAotQ1BERl9Eb2N1bWVudCogQ1BXTF9Gb250TWFwOjpHZXREb2N1bWVudCgpCi17Ci0JaWYgKCFtX3BQREZEb2MpCi0JewotCQlpZiAoQ1BERl9Nb2R1bGVNZ3I6OkdldCgpKQotCQl7Ci0JCQltX3BQREZEb2MgPSBGWF9ORVcgQ1BERl9Eb2N1bWVudDsKLQkJCW1fcFBERkRvYy0+Q3JlYXRlTmV3RG9jKCk7Ci0JCX0KLQl9CitDUERGX0RvY3VtZW50KiBDUFdMX0ZvbnRNYXA6OkdldERvY3VtZW50KCkgeworICBpZiAoIW1fcFBERkRvYykgeworICAgIGlmIChDUERGX01vZHVsZU1ncjo6R2V0KCkpIHsKKyAgICAgIG1fcFBERkRvYyA9IEZYX05FVyBDUERGX0RvY3VtZW50OworICAgICAgbV9wUERGRG9jLT5DcmVhdGVOZXdEb2MoKTsKKyAgICB9CisgIH0KIAotICAgIHJldHVybiBtX3BQREZEb2M7CisgIHJldHVybiBtX3BQREZEb2M7CiB9CiAKLUNQREZfRm9udCogQ1BXTF9Gb250TWFwOjpHZXRQREZGb250KGludDMyX3QgbkZvbnRJbmRleCkKLXsKLSAgICBpZiAobkZvbnRJbmRleCA+PTAgJiYgbkZvbnRJbmRleCA8IG1fYURhdGEuR2V0U2l6ZSgpKQotICAgIHsKLSAgICAgICAgaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwRGF0YS0+cEZvbnQ7Ci0gICAgICAgIH0KK0NQREZfRm9udCogQ1BXTF9Gb250TWFwOjpHZXRQREZGb250KGludDMyX3QgbkZvbnRJbmRleCkgeworICBpZiAobkZvbnRJbmRleCA+PSAwICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkgeworICAgIGlmIChDUFdMX0ZvbnRNYXBfRGF0YSogcERhdGEgPSBtX2FEYXRhLkdldEF0KG5Gb250SW5kZXgpKSB7CisgICAgICByZXR1cm4gcERhdGEtPnBGb250OwogICAgIH0KKyAgfQogCi0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkdldFBERkZvbnRBbGlhcyhpbnQzMl90IG5Gb250SW5kZXgpCi17Ci0gICAgaWYgKG5Gb250SW5kZXggPj0wICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkKLSAgICB7Ci0gICAgICAgIGlmIChDUFdMX0ZvbnRNYXBfRGF0YSogcERhdGEgPSBtX2FEYXRhLkdldEF0KG5Gb250SW5kZXgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcERhdGEtPnNGb250TmFtZTsKLSAgICAgICAgfQorQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KSB7CisgIGlmIChuRm9udEluZGV4ID49IDAgJiYgbkZvbnRJbmRleCA8IG1fYURhdGEuR2V0U2l6ZSgpKSB7CisgICAgaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpIHsKKyAgICAgIHJldHVybiBwRGF0YS0+c0ZvbnROYW1lOwogICAgIH0KKyAgfQogCi0gICAgcmV0dXJuICIiOworICByZXR1cm4gIiI7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Gb250TWFwOjpLbm93V29yZChpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCkKLXsKLSAgICBpZiAobkZvbnRJbmRleCA+PTAgJiYgbkZvbnRJbmRleCA8IG1fYURhdGEuR2V0U2l6ZSgpKQotICAgIHsKLSAgICAgICAgaWYgKG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDaGFyQ29kZUZyb21Vbmljb2RlKG5Gb250SW5kZXgsIHdvcmQpID49IDA7Ci0gICAgICAgIH0KK0ZYX0JPT0wgQ1BXTF9Gb250TWFwOjpLbm93V29yZChpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCkgeworICBpZiAobkZvbnRJbmRleCA+PSAwICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkgeworICAgIGlmIChtX2FEYXRhLkdldEF0KG5Gb250SW5kZXgpKSB7CisgICAgICByZXR1cm4gQ2hhckNvZGVGcm9tVW5pY29kZShuRm9udEluZGV4LCB3b3JkKSA+PSAwOwogICAgIH0KKyAgfQogCi0gICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLWludDMyX3QgQ1BXTF9Gb250TWFwOjpHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBuQ2hhcnNldCwgaW50MzJfdCBuRm9udEluZGV4KQotewotICAgIGlmIChuRm9udEluZGV4ID4gMCkKLSAgICB7Ci0gICAgICAgIGlmIChLbm93V29yZChuRm9udEluZGV4LCB3b3JkKSkKLSAgICAgICAgICAgIHJldHVybiBuRm9udEluZGV4OworaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCkgeworICBpZiAobkZvbnRJbmRleCA+IDApIHsKKyAgICBpZiAoS25vd1dvcmQobkZvbnRJbmRleCwgd29yZCkpCisgICAgICByZXR1cm4gbkZvbnRJbmRleDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY29uc3QgQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gR2V0Rm9udE1hcERhdGEoMCkpIHsKKyAgICAgIGlmIChuQ2hhcnNldCA9PSBERUZBVUxUX0NIQVJTRVQgfHwgcERhdGEtPm5DaGFyc2V0ID09IFNZTUJPTF9DSEFSU0VUIHx8CisgICAgICAgICAgbkNoYXJzZXQgPT0gcERhdGEtPm5DaGFyc2V0KSB7CisgICAgICAgIGlmIChLbm93V29yZCgwLCB3b3JkKSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGNvbnN0IENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IEdldEZvbnRNYXBEYXRhKDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobkNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUIHx8Ci0gICAgICAgICAgICAgICAgcERhdGEtPm5DaGFyc2V0ID09IFNZTUJPTF9DSEFSU0VUIHx8Ci0gICAgICAgICAgICAgICAgbkNoYXJzZXQgPT0gcERhdGEtPm5DaGFyc2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChLbm93V29yZCgwLCB3b3JkKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgIH0KIAotICAgIGludDMyX3Qgbk5ld0ZvbnRJbmRleCA9IEdldEZvbnRJbmRleChHZXROYXRpdmVGb250TmFtZShuQ2hhcnNldCksIG5DaGFyc2V0LCBUUlVFKTsKLSAgICBpZiAobk5ld0ZvbnRJbmRleCA+PSAwKQotICAgIHsKLSAgICAgICAgaWYgKEtub3dXb3JkKG5OZXdGb250SW5kZXgsIHdvcmQpKQotICAgICAgICAgICAgcmV0dXJuIG5OZXdGb250SW5kZXg7Ci0gICAgfQotICAgIG5OZXdGb250SW5kZXggPSBHZXRGb250SW5kZXgoIkFyaWFsIFVuaWNvZGUgTVMiLCBERUZBVUxUX0NIQVJTRVQsIEZBTFNFKTsKLSAgICBpZiAobk5ld0ZvbnRJbmRleCA+PSAwKQotICAgIHsKLSAgICAgICAgaWYgKEtub3dXb3JkKG5OZXdGb250SW5kZXgsIHdvcmQpKQotICAgICAgICAgICAgcmV0dXJuIG5OZXdGb250SW5kZXg7Ci0gICAgfQotICAgIHJldHVybiAtMTsKKyAgaW50MzJfdCBuTmV3Rm9udEluZGV4ID0KKyAgICAgIEdldEZvbnRJbmRleChHZXROYXRpdmVGb250TmFtZShuQ2hhcnNldCksIG5DaGFyc2V0LCBUUlVFKTsKKyAgaWYgKG5OZXdGb250SW5kZXggPj0gMCkgeworICAgIGlmIChLbm93V29yZChuTmV3Rm9udEluZGV4LCB3b3JkKSkKKyAgICAgIHJldHVybiBuTmV3Rm9udEluZGV4OworICB9CisgIG5OZXdGb250SW5kZXggPSBHZXRGb250SW5kZXgoIkFyaWFsIFVuaWNvZGUgTVMiLCBERUZBVUxUX0NIQVJTRVQsIEZBTFNFKTsKKyAgaWYgKG5OZXdGb250SW5kZXggPj0gMCkgeworICAgIGlmIChLbm93V29yZChuTmV3Rm9udEluZGV4LCB3b3JkKSkKKyAgICAgIHJldHVybiBuTmV3Rm9udEluZGV4OworICB9CisgIHJldHVybiAtMTsKIH0KIAotaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkNoYXJDb2RlRnJvbVVuaWNvZGUoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpCi17Ci0gICAgaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpCi0gICAgewotICAgICAgICBpZiAocERhdGEtPnBGb250KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocERhdGEtPnBGb250LT5Jc1VuaWNvZGVDb21wYXRpYmxlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IG5DaGFyQ29kZSA9IHBEYXRhLT5wRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3b3JkKTsKLSAgICAgICAgICAgICAgICBwRGF0YS0+cEZvbnQtPkdseXBoRnJvbUNoYXJDb2RlKG5DaGFyQ29kZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5DaGFyQ29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3b3JkIDwgMHhGRikKLSAgICAgICAgICAgICAgICByZXR1cm4gd29yZDsKLSAgICAgICAgfQoraW50MzJfdCBDUFdMX0ZvbnRNYXA6OkNoYXJDb2RlRnJvbVVuaWNvZGUoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpIHsKKyAgaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpIHsKKyAgICBpZiAocERhdGEtPnBGb250KSB7CisgICAgICBpZiAocERhdGEtPnBGb250LT5Jc1VuaWNvZGVDb21wYXRpYmxlKCkpIHsKKyAgICAgICAgaW50IG5DaGFyQ29kZSA9IHBEYXRhLT5wRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3b3JkKTsKKyAgICAgICAgcERhdGEtPnBGb250LT5HbHlwaEZyb21DaGFyQ29kZShuQ2hhckNvZGUpOworICAgICAgICByZXR1cm4gbkNoYXJDb2RlOworICAgICAgfQorICAgICAgaWYgKHdvcmQgPCAweEZGKQorICAgICAgICByZXR1cm4gd29yZDsKICAgICB9Ci0gICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAtMTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXROYXRpdmVGb250TmFtZShpbnQzMl90IG5DaGFyc2V0KQotewotICAgIC8vc2VhcmNoaW5nIG5hdGl2ZSBmb250IGlzIHNsb3csIHNvIHdlIG11c3Qgc2F2ZSB0aW1lCi0gICAgZm9yIChpbnQzMl90IGk9MCxzej1tX2FOYXRpdmVGb250LkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKENQV0xfRm9udE1hcF9OYXRpdmUqIHBEYXRhID0gbV9hTmF0aXZlRm9udC5HZXRBdChpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBEYXRhLT5uQ2hhcnNldCA9PSBuQ2hhcnNldCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcERhdGEtPnNGb250TmFtZTsKLSAgICAgICAgfQorQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXROYXRpdmVGb250TmFtZShpbnQzMl90IG5DaGFyc2V0KSB7CisgIC8vIHNlYXJjaGluZyBuYXRpdmUgZm9udCBpcyBzbG93LCBzbyB3ZSBtdXN0IHNhdmUgdGltZQorICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hTmF0aXZlRm9udC5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENQV0xfRm9udE1hcF9OYXRpdmUqIHBEYXRhID0gbV9hTmF0aXZlRm9udC5HZXRBdChpKSkgeworICAgICAgaWYgKHBEYXRhLT5uQ2hhcnNldCA9PSBuQ2hhcnNldCkKKyAgICAgICAgcmV0dXJuIHBEYXRhLT5zRm9udE5hbWU7CiAgICAgfQorICB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBzTmV3ID0gR2V0TmF0aXZlRm9udChuQ2hhcnNldCk7CisgIENGWF9CeXRlU3RyaW5nIHNOZXcgPSBHZXROYXRpdmVGb250KG5DaGFyc2V0KTsKIAotICAgIGlmICghc05ldy5Jc0VtcHR5KCkpCi0gICAgewotICAgICAgICBDUFdMX0ZvbnRNYXBfTmF0aXZlKiBwTmV3RGF0YSA9IG5ldyBDUFdMX0ZvbnRNYXBfTmF0aXZlOwotICAgICAgICBwTmV3RGF0YS0+bkNoYXJzZXQgPSBuQ2hhcnNldDsKLSAgICAgICAgcE5ld0RhdGEtPnNGb250TmFtZSA9IHNOZXc7CisgIGlmICghc05ldy5Jc0VtcHR5KCkpIHsKKyAgICBDUFdMX0ZvbnRNYXBfTmF0aXZlKiBwTmV3RGF0YSA9IG5ldyBDUFdMX0ZvbnRNYXBfTmF0aXZlOworICAgIHBOZXdEYXRhLT5uQ2hhcnNldCA9IG5DaGFyc2V0OworICAgIHBOZXdEYXRhLT5zRm9udE5hbWUgPSBzTmV3OwogCi0gICAgICAgIG1fYU5hdGl2ZUZvbnQuQWRkKHBOZXdEYXRhKTsKLSAgICB9CisgICAgbV9hTmF0aXZlRm9udC5BZGQocE5ld0RhdGEpOworICB9CiAKLSAgICByZXR1cm4gc05ldzsKKyAgcmV0dXJuIHNOZXc7CiB9CiAKLXZvaWQgQ1BXTF9Gb250TWFwOjpFbXB0eSgpCi17Ci0gICAgewotICAgICAgICBmb3IgKGludDMyX3QgaT0wLCBzej1tX2FEYXRhLkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgICAgICAgICAgZGVsZXRlIG1fYURhdGEuR2V0QXQoaSk7Cit2b2lkIENQV0xfRm9udE1hcDo6RW1wdHkoKSB7CisgIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hRGF0YS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgICAgZGVsZXRlIG1fYURhdGEuR2V0QXQoaSk7CiAKLSAgICAgICAgbV9hRGF0YS5SZW1vdmVBbGwoKTsKLSAgICB9Ci0gICAgewotICAgICAgICBmb3IgKGludDMyX3QgaT0wLCBzej1tX2FOYXRpdmVGb250LkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgICAgICAgICAgZGVsZXRlIG1fYU5hdGl2ZUZvbnQuR2V0QXQoaSk7CisgICAgbV9hRGF0YS5SZW1vdmVBbGwoKTsKKyAgfQorICB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYU5hdGl2ZUZvbnQuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICAgIGRlbGV0ZSBtX2FOYXRpdmVGb250LkdldEF0KGkpOwogCi0gICAgICAgIG1fYU5hdGl2ZUZvbnQuUmVtb3ZlQWxsKCk7Ci0gICAgfQorICAgIG1fYU5hdGl2ZUZvbnQuUmVtb3ZlQWxsKCk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0ZvbnRNYXA6OkluaXRpYWwoY29uc3QgRlhfQ0hBUiogZm9udG5hbWUpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnROYW1lID0gZm9udG5hbWU7Cit2b2lkIENQV0xfRm9udE1hcDo6SW5pdGlhbChjb25zdCBGWF9DSEFSKiBmb250bmFtZSkgeworICBDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWUgPSBmb250bmFtZTsKIAotICAgIGlmIChzRm9udE5hbWUuSXNFbXB0eSgpKQotICAgICAgICBzRm9udE5hbWUgPSBERUZBVUxUX0ZPTlRfTkFNRTsKKyAgaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkpCisgICAgc0ZvbnROYW1lID0gREVGQVVMVF9GT05UX05BTUU7CiAKLSAgICBHZXRGb250SW5kZXgoc0ZvbnROYW1lLCBBTlNJX0NIQVJTRVQsIEZBTFNFKTsKKyAgR2V0Rm9udEluZGV4KHNGb250TmFtZSwgQU5TSV9DSEFSU0VULCBGQUxTRSk7CiB9CiAKLQogLyoKIExpc3Qgb2YgY3VycmVudGx5IHN1cHBvcnRlZCBzdGFuZGFyZCBmb250czoKIENvdXJpZXIsIENvdXJpZXItQm9sZCwgQ291cmllci1Cb2xkT2JsaXF1ZSwgQ291cmllci1PYmxpcXVlCkBAIC0yMDEsMzY4ICsxNjgsMzUwIEBACiBTeW1ib2wsIFphcGZEaW5nYmF0cwogKi8KIAotY29uc3QgY2hhciogZ19zREVTdGFuZGFyZEZvbnROYW1lW10gPSB7IkNvdXJpZXIiLCAiQ291cmllci1Cb2xkIiwgIkNvdXJpZXItQm9sZE9ibGlxdWUiLCAiQ291cmllci1PYmxpcXVlIiwKLSAgICAiSGVsdmV0aWNhIiwgIkhlbHZldGljYS1Cb2xkIiwgIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsICJIZWx2ZXRpY2EtT2JsaXF1ZSIsCi0gICAgIlRpbWVzLVJvbWFuIiwgIlRpbWVzLUJvbGQiLCAiVGltZXMtSXRhbGljIiwgIlRpbWVzLUJvbGRJdGFsaWMiLAotICAgICJTeW1ib2wiLCAiWmFwZkRpbmdiYXRzIn07Citjb25zdCBjaGFyKiBnX3NERVN0YW5kYXJkRm9udE5hbWVbXSA9IHsiQ291cmllciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291cmllci1Cb2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VyaWVyLUJvbGRPYmxpcXVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VyaWVyLU9ibGlxdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHZldGljYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsdmV0aWNhLUJvbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsdmV0aWNhLU9ibGlxdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVzLVJvbWFuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lcy1Cb2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lcy1JdGFsaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVzLUJvbGRJdGFsaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN5bWJvbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmFwZkRpbmdiYXRzIn07CiAKLUZYX0JPT0wgQ1BXTF9Gb250TWFwOjpJc1N0YW5kYXJkRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKQotewotICAgIGZvciAoaW50MzJfdCBpPTA7IGk8MTQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChzRm9udE5hbWUgPT0gZ19zREVTdGFuZGFyZEZvbnROYW1lW2ldKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQorRlhfQk9PTCBDUFdMX0ZvbnRNYXA6OklzU3RhbmRhcmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTQ7IGkrKykgeworICAgIGlmIChzRm9udE5hbWUgPT0gZ19zREVTdGFuZGFyZEZvbnROYW1lW2ldKQorICAgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1pbnQzMl90IENQV0xfRm9udE1hcDo6RmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCkKLXsKLSAgICBmb3IgKGludDMyX3QgaT0wLHN6PW1fYURhdGEuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgICBpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5DaGFyc2V0ID09IERFRkFVTFRfQ0hBUlNFVCB8fCBuQ2hhcnNldCA9PSBwRGF0YS0+bkNoYXJzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkgfHwgcERhdGEtPnNGb250TmFtZSA9PSBzRm9udE5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9CitpbnQzMl90IENQV0xfRm9udE1hcDo6RmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0KSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FEYXRhLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChpKSkgeworICAgICAgaWYgKG5DaGFyc2V0ID09IERFRkFVTFRfQ0hBUlNFVCB8fCBuQ2hhcnNldCA9PSBwRGF0YS0+bkNoYXJzZXQpIHsKKyAgICAgICAgaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkgfHwgcERhdGEtPnNGb250TmFtZSA9PSBzRm9udE5hbWUpCisgICAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CiAgICAgfQorICB9CiAKKyAgcmV0dXJuIC0xOworfQorCitpbnQzMl90IENQV0xfRm9udE1hcDo6R2V0Rm9udEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQpIHsKKyAgaW50MzJfdCBuRm9udEluZGV4ID0gRmluZEZvbnQoRW5jb2RlRm9udEFsaWFzKHNGb250TmFtZSwgbkNoYXJzZXQpLCBuQ2hhcnNldCk7CisgIGlmIChuRm9udEluZGV4ID49IDApCisgICAgcmV0dXJuIG5Gb250SW5kZXg7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgc0FsaWFzOworICBDUERGX0ZvbnQqIHBGb250ID0gTlVMTDsKKyAgaWYgKGJGaW5kKQorICAgIHBGb250ID0gRmluZEZvbnRTYW1lQ2hhcnNldChzQWxpYXMsIG5DaGFyc2V0KTsKKworICBpZiAoIXBGb250KSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc1RlbXAgPSBzRm9udE5hbWU7CisgICAgcEZvbnQgPSBBZGRGb250VG9Eb2N1bWVudChHZXREb2N1bWVudCgpLCBzVGVtcCwgbkNoYXJzZXQpOworICAgIHNBbGlhcyA9IEVuY29kZUZvbnRBbGlhcyhzVGVtcCwgbkNoYXJzZXQpOworICB9CisgIEFkZGVkRm9udChwRm9udCwgc0FsaWFzKTsKKyAgcmV0dXJuIEFkZEZvbnREYXRhKHBGb250LCBzQWxpYXMsIG5DaGFyc2V0KTsKK30KKworaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkdldFBXTEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQpIHsKKyAgaW50MzJfdCBuRmluZCA9IC0xOworCisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FEYXRhLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChpKSkgeworICAgICAgaWYgKHBEYXRhLT5uQ2hhcnNldCA9PSBuQ2hhcnNldCkgeworICAgICAgICBuRmluZCA9IGk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIENQREZfRm9udCogcE5ld0ZvbnQgPSBHZXRQREZGb250KG5GaW5kKTsKKworICBpZiAoIXBOZXdGb250KQogICAgIHJldHVybiAtMTsKKworICAvKgorICBpZiAoQ1BERl9Gb250KiBwRm9udCA9IEdldFBERkZvbnQobkZpbmQpKQorICB7CisgICAgICBQV0xGb250LkFkZFdvcmRUb0ZvbnREaWN0KHBGb250RGljdCwgd29yZCk7CisgIH0KKyAgKi8KKworICBDRlhfQnl0ZVN0cmluZyBzQWxpYXMgPSBFbmNvZGVGb250QWxpYXMoIkFyaWFsX0Nocm9tZSIsIG5DaGFyc2V0KTsKKyAgQWRkZWRGb250KHBOZXdGb250LCBzQWxpYXMpOworCisgIHJldHVybiBBZGRGb250RGF0YShwTmV3Rm9udCwgc0FsaWFzLCBuQ2hhcnNldCk7CiB9CiAKLWludDMyX3QgQ1BXTF9Gb250TWFwOjpHZXRGb250SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCwgRlhfQk9PTCBiRmluZCkKLXsKLSAgICBpbnQzMl90IG5Gb250SW5kZXggPSBGaW5kRm9udChFbmNvZGVGb250QWxpYXMoc0ZvbnROYW1lLCBuQ2hhcnNldCksIG5DaGFyc2V0KTsKLSAgICBpZiAobkZvbnRJbmRleCA+PSAwKQotICAgICAgICByZXR1cm4gbkZvbnRJbmRleDsKLQotICAgIENGWF9CeXRlU3RyaW5nIHNBbGlhczsKLSAgICBDUERGX0ZvbnQqIHBGb250ID0gTlVMTDsKLSAgICBpZiAoYkZpbmQpCi0gICAgICAgIHBGb250ID0gRmluZEZvbnRTYW1lQ2hhcnNldChzQWxpYXMsIG5DaGFyc2V0KTsKLQotICAgIGlmICghcEZvbnQpCi0gICAgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzVGVtcCA9IHNGb250TmFtZTsKLSAgICAgICAgcEZvbnQgPSBBZGRGb250VG9Eb2N1bWVudChHZXREb2N1bWVudCgpLCBzVGVtcCwgbkNoYXJzZXQpOwotICAgICAgICBzQWxpYXMgPSBFbmNvZGVGb250QWxpYXMoc1RlbXAsIG5DaGFyc2V0KTsKLSAgICB9Ci0gICAgQWRkZWRGb250KHBGb250LCBzQWxpYXMpOwotICAgIHJldHVybiBBZGRGb250RGF0YShwRm9udCwgc0FsaWFzLCBuQ2hhcnNldCk7CitDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6RmluZEZvbnRTYW1lQ2hhcnNldChDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQpIHsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLWludDMyX3QgQ1BXTF9Gb250TWFwOjpHZXRQV0xGb250SW5kZXgoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5DaGFyc2V0KQotewotICAgIGludDMyX3QgbkZpbmQgPSAtMTsKK2ludDMyX3QgQ1BXTF9Gb250TWFwOjpBZGRGb250RGF0YShDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQpIHsKKyAgQ1BXTF9Gb250TWFwX0RhdGEqIHBOZXdEYXRhID0gbmV3IENQV0xfRm9udE1hcF9EYXRhOworICBwTmV3RGF0YS0+cEZvbnQgPSBwRm9udDsKKyAgcE5ld0RhdGEtPnNGb250TmFtZSA9IHNGb250QWxpYXM7CisgIHBOZXdEYXRhLT5uQ2hhcnNldCA9IG5DaGFyc2V0OwogCi0gICAgZm9yIChpbnQzMl90IGk9MCxzej1tX2FEYXRhLkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQoaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwRGF0YS0+bkNoYXJzZXQgPT0gbkNoYXJzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbkZpbmQgPSBpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorICBtX2FEYXRhLkFkZChwTmV3RGF0YSk7CiAKLSAgICBDUERGX0ZvbnQqIHBOZXdGb250ID0gR2V0UERGRm9udChuRmluZCk7Ci0KLSAgICBpZiAoIXBOZXdGb250KSByZXR1cm4gLTE7Ci0KLSAgICAvKgotICAgIGlmIChDUERGX0ZvbnQqIHBGb250ID0gR2V0UERGRm9udChuRmluZCkpCi0gICAgewotICAgICAgICBQV0xGb250LkFkZFdvcmRUb0ZvbnREaWN0KHBGb250RGljdCwgd29yZCk7Ci0gICAgfQotICAgICovCi0KLSAgICBDRlhfQnl0ZVN0cmluZyBzQWxpYXMgPSBFbmNvZGVGb250QWxpYXMoIkFyaWFsX0Nocm9tZSIsIG5DaGFyc2V0KTsKLSAgICBBZGRlZEZvbnQocE5ld0ZvbnQsIHNBbGlhcyk7Ci0KLSAgICByZXR1cm4gQWRkRm9udERhdGEocE5ld0ZvbnQsIHNBbGlhcywgbkNoYXJzZXQpOworICByZXR1cm4gbV9hRGF0YS5HZXRTaXplKCkgLSAxOwogfQogCi1DUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6RmluZEZvbnRTYW1lQ2hhcnNldChDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywgaW50MzJfdCBuQ2hhcnNldCkKLXsKK3ZvaWQgQ1BXTF9Gb250TWFwOjpBZGRlZEZvbnQoQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMpIHt9CisKK0NGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0Rm9udE5hbWUoaW50MzJfdCBuRm9udEluZGV4KSB7CisgIGlmIChuRm9udEluZGV4ID49IDAgJiYgbkZvbnRJbmRleCA8IG1fYURhdGEuR2V0U2l6ZSgpKSB7CisgICAgaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpIHsKKyAgICAgIHJldHVybiBwRGF0YS0+c0ZvbnROYW1lOworICAgIH0KKyAgfQorCisgIHJldHVybiAiIjsKK30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXROYXRpdmVGb250KGludDMyX3QgbkNoYXJzZXQpIHsKKyAgaWYgKG5DaGFyc2V0ID09IERFRkFVTFRfQ0hBUlNFVCkKKyAgICBuQ2hhcnNldCA9IEdldE5hdGl2ZUNoYXJzZXQoKTsKKworICBDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWUgPSBHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChuQ2hhcnNldCk7CisgIGlmIChtX3BTeXN0ZW1IYW5kbGVyKSB7CisgICAgaWYgKG1fcFN5c3RlbUhhbmRsZXItPkZpbmROYXRpdmVUcnVlVHlwZUZvbnQobkNoYXJzZXQsIHNGb250TmFtZSkpCisgICAgICByZXR1cm4gc0ZvbnROYW1lOworCisgICAgc0ZvbnROYW1lID0gbV9wU3lzdGVtSGFuZGxlci0+R2V0TmF0aXZlVHJ1ZVR5cGVGb250KG5DaGFyc2V0KTsKKyAgfQorICByZXR1cm4gc0ZvbnROYW1lOworfQorCitDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkRm9udFRvRG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbkNoYXJzZXQpIHsKKyAgaWYgKElzU3RhbmRhcmRGb250KHNGb250TmFtZSkpCisgICAgcmV0dXJuIEFkZFN0YW5kYXJkRm9udChwRG9jLCBzRm9udE5hbWUpOworCisgIHJldHVybiBBZGRTeXN0ZW1Gb250KHBEb2MsIHNGb250TmFtZSwgbkNoYXJzZXQpOworfQorCitDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkU3RhbmRhcmRGb250KENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpIHsKKyAgaWYgKCFwRG9jKQogICAgIHJldHVybiBOVUxMOworCisgIENQREZfRm9udCogcEZvbnQgPSBOVUxMOworCisgIGlmIChzRm9udE5hbWUgPT0gIlphcGZEaW5nYmF0cyIpCisgICAgcEZvbnQgPSBwRG9jLT5BZGRTdGFuZGFyZEZvbnQoc0ZvbnROYW1lLCBOVUxMKTsKKyAgZWxzZSB7CisgICAgQ1BERl9Gb250RW5jb2RpbmcgZmUoUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKTsKKyAgICBwRm9udCA9IHBEb2MtPkFkZFN0YW5kYXJkRm9udChzRm9udE5hbWUsICZmZSk7CisgIH0KKworICByZXR1cm4gcEZvbnQ7CiB9CiAKLWludDMyX3QgQ1BXTF9Gb250TWFwOjpBZGRGb250RGF0YShDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywgaW50MzJfdCBuQ2hhcnNldCkKLXsKLSAgICBDUFdMX0ZvbnRNYXBfRGF0YSogcE5ld0RhdGEgPSBuZXcgQ1BXTF9Gb250TWFwX0RhdGE7Ci0gICAgcE5ld0RhdGEtPnBGb250ID0gcEZvbnQ7Ci0gICAgcE5ld0RhdGEtPnNGb250TmFtZSA9IHNGb250QWxpYXM7Ci0gICAgcE5ld0RhdGEtPm5DaGFyc2V0ID0gbkNoYXJzZXQ7Ci0KLSAgICBtX2FEYXRhLkFkZChwTmV3RGF0YSk7Ci0KLSAgICByZXR1cm4gbV9hRGF0YS5HZXRTaXplKCkgLTE7Ci19Ci0KLXZvaWQgQ1BXTF9Gb250TWFwOjpBZGRlZEZvbnQoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMpCi17Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0Rm9udE5hbWUoaW50MzJfdCBuRm9udEluZGV4KQotewotICAgIGlmIChuRm9udEluZGV4ID49MCAmJiBuRm9udEluZGV4IDwgbV9hRGF0YS5HZXRTaXplKCkpCi0gICAgewotICAgICAgICBpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChuRm9udEluZGV4KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBEYXRhLT5zRm9udE5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gIiI7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0TmF0aXZlRm9udChpbnQzMl90IG5DaGFyc2V0KQotewotCi0gICAgaWYgKG5DaGFyc2V0ID09IERFRkFVTFRfQ0hBUlNFVCkKLSAgICAgICAgbkNoYXJzZXQgPSBHZXROYXRpdmVDaGFyc2V0KCk7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWUgPSBHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChuQ2hhcnNldCk7Ci0gICAgaWYgKG1fcFN5c3RlbUhhbmRsZXIpCi0gICAgewotICAgICAgICBpZiAobV9wU3lzdGVtSGFuZGxlci0+RmluZE5hdGl2ZVRydWVUeXBlRm9udChuQ2hhcnNldCwgc0ZvbnROYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBzRm9udE5hbWU7Ci0KLSAgICAgICAgc0ZvbnROYW1lID0gbV9wU3lzdGVtSGFuZGxlci0+R2V0TmF0aXZlVHJ1ZVR5cGVGb250KG5DaGFyc2V0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHNGb250TmFtZTsKLX0KLQotQ1BERl9Gb250KiBDUFdMX0ZvbnRNYXA6OkFkZEZvbnRUb0RvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIHVpbnQ4X3QgbkNoYXJzZXQpCi17Ci0gICAgaWYgKElzU3RhbmRhcmRGb250KHNGb250TmFtZSkpCi0gICAgICAgIHJldHVybiBBZGRTdGFuZGFyZEZvbnQocERvYywgc0ZvbnROYW1lKTsKLQotICAgIHJldHVybiBBZGRTeXN0ZW1Gb250KHBEb2MsIHNGb250TmFtZSwgbkNoYXJzZXQpOwotfQotCi1DUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkU3RhbmRhcmRGb250KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpCi17Ci0gICAgaWYgKCFwRG9jKSByZXR1cm4gTlVMTDsKLQotICAgIENQREZfRm9udCogcEZvbnQgPSBOVUxMOwotCi0gICAgaWYgKHNGb250TmFtZSA9PSAiWmFwZkRpbmdiYXRzIikKLSAgICAgICAgcEZvbnQgPSBwRG9jLT5BZGRTdGFuZGFyZEZvbnQoc0ZvbnROYW1lLCBOVUxMKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBDUERGX0ZvbnRFbmNvZGluZyBmZShQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpOwotICAgICAgICBwRm9udCA9IHBEb2MtPkFkZFN0YW5kYXJkRm9udChzRm9udE5hbWUsICZmZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBGb250OwotfQotCi1DUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkU3lzdGVtRm9udChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLCB1aW50OF90IG5DaGFyc2V0KQotewotICAgIGlmICghcERvYykgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSkgc0ZvbnROYW1lID0gR2V0TmF0aXZlRm9udChuQ2hhcnNldCk7Ci0gICAgaWYgKG5DaGFyc2V0ID09IERFRkFVTFRfQ0hBUlNFVCkgbkNoYXJzZXQgPSBHZXROYXRpdmVDaGFyc2V0KCk7Ci0KLSAgICBpZiAobV9wU3lzdGVtSGFuZGxlcikKLSAgICAgICAgcmV0dXJuIG1fcFN5c3RlbUhhbmRsZXItPkFkZE5hdGl2ZVRydWVUeXBlRm9udFRvUERGKHBEb2MsIHNGb250TmFtZSwgbkNoYXJzZXQpOwotCitDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkU3lzdGVtRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbkNoYXJzZXQpIHsKKyAgaWYgKCFwRG9jKQogICAgIHJldHVybiBOVUxMOworCisgIGlmIChzRm9udE5hbWUuSXNFbXB0eSgpKQorICAgIHNGb250TmFtZSA9IEdldE5hdGl2ZUZvbnQobkNoYXJzZXQpOworICBpZiAobkNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUKQorICAgIG5DaGFyc2V0ID0gR2V0TmF0aXZlQ2hhcnNldCgpOworCisgIGlmIChtX3BTeXN0ZW1IYW5kbGVyKQorICAgIHJldHVybiBtX3BTeXN0ZW1IYW5kbGVyLT5BZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERihwRG9jLCBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFyc2V0KTsKKworICByZXR1cm4gTlVMTDsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpFbmNvZGVGb250QWxpYXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBzUG9zdGZpeDsKLSAgICBzUG9zdGZpeC5Gb3JtYXQoIl8lMDJYIiwgbkNoYXJzZXQpOwotICAgIHJldHVybiBFbmNvZGVGb250QWxpYXMoc0ZvbnROYW1lKSArIHNQb3N0Zml4OworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpFbmNvZGVGb250QWxpYXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1Bvc3RmaXg7CisgIHNQb3N0Zml4LkZvcm1hdCgiXyUwMlgiLCBuQ2hhcnNldCk7CisgIHJldHVybiBFbmNvZGVGb250QWxpYXMoc0ZvbnROYW1lKSArIHNQb3N0Zml4OwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkVuY29kZUZvbnRBbGlhcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKQotewotICAgIENGWF9CeXRlU3RyaW5nIHNSZXQgPSBzRm9udE5hbWU7Ci0gICAgc1JldC5SZW1vdmUoJyAnKTsKLSAgICByZXR1cm4gc1JldDsKK0NGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6RW5jb2RlRm9udEFsaWFzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1JldCA9IHNGb250TmFtZTsKKyAgc1JldC5SZW1vdmUoJyAnKTsKKyAgcmV0dXJuIHNSZXQ7CiB9CiAKLWludDMyX3QgQ1BXTF9Gb250TWFwOjpHZXRGb250TWFwQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiBtX2FEYXRhLkdldFNpemUoKTsKK2ludDMyX3QgQ1BXTF9Gb250TWFwOjpHZXRGb250TWFwQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBtX2FEYXRhLkdldFNpemUoKTsKIH0KIAotY29uc3QgQ1BXTF9Gb250TWFwX0RhdGEqIENQV0xfRm9udE1hcDo6R2V0Rm9udE1hcERhdGEoaW50MzJfdCBuSW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKG5JbmRleCA+PTAgJiYgbkluZGV4IDwgbV9hRGF0YS5HZXRTaXplKCkpCi0gICAgewotICAgICAgICByZXR1cm4gbV9hRGF0YS5HZXRBdChuSW5kZXgpOwotICAgIH0KK2NvbnN0IENQV0xfRm9udE1hcF9EYXRhKiBDUFdMX0ZvbnRNYXA6OkdldEZvbnRNYXBEYXRhKGludDMyX3QgbkluZGV4KSBjb25zdCB7CisgIGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkgeworICAgIHJldHVybiBtX2FEYXRhLkdldEF0KG5JbmRleCk7CisgIH0KIAotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gTlVMTDsKIH0KIAotaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkdldE5hdGl2ZUNoYXJzZXQoKQotewotICAgIHVpbnQ4X3QgbkNoYXJzZXQgPSBBTlNJX0NIQVJTRVQ7Ci0gICAgaW50MzJfdCBpQ29kZVBhZ2UgPSBGWFNZU19HZXRBQ1AoKTsKLSAgICBzd2l0Y2ggKGlDb2RlUGFnZSkKLSAgICB7Ci0gICAgY2FzZSA5MzI6Ly9KYXBhbgotICAgICAgICBuQ2hhcnNldCA9IFNISUZUSklTX0NIQVJTRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgOTM2Oi8vQ2hpbmVzZSAoUFJDLCBTaW5nYXBvcmUpCi0gICAgICAgIG5DaGFyc2V0ID0gR0IyMzEyX0NIQVJTRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgOTUwOi8vQ2hpbmVzZSAoVGFpd2FuOyBIb25nIEtvbmcgU0FSLCBQUkMpCi0gICAgICAgIG5DaGFyc2V0ID0gR0IyMzEyX0NIQVJTRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1MjovL1dpbmRvd3MgMy4xIExhdGluIDEgKFVTLCBXZXN0ZXJuIEV1cm9wZSkKLSAgICAgICAgbkNoYXJzZXQgPSBBTlNJX0NIQVJTRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgODc0Oi8vVGhhaQotICAgICAgICBuQ2hhcnNldCA9IFRIQUlfQ0hBUlNFVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NDk6Ly9Lb3JlYW4KLSAgICAgICAgbkNoYXJzZXQgPSBIQU5HVUxfQ0hBUlNFVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjAwOi8vVW5pY29kZSAoQk1QIG9mIElTTyAxMDY0NikKLSAgICAgICAgbkNoYXJzZXQgPSBBTlNJX0NIQVJTRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1MDovL1dpbmRvd3MgMy4xIEVhc3Rlcm4gRXVyb3BlYW4KLSAgICAgICAgbkNoYXJzZXQgPSBFQVNURVVST1BFX0NIQVJTRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1MTovL1dpbmRvd3MgMy4xIEN5cmlsbGljCi0gICAgICAgIG5DaGFyc2V0ID0gUlVTU0lBTl9DSEFSU0VUOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDEyNTM6Ly9XaW5kb3dzIDMuMSBHcmVlawotICAgICAgICBuQ2hhcnNldCA9IEdSRUVLX0NIQVJTRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1NDovL1dpbmRvd3MgMy4xIFR1cmtpc2gKLSAgICAgICAgbkNoYXJzZXQgPSBUVVJLSVNIX0NIQVJTRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1NTovL0hlYnJldwotICAgICAgICBuQ2hhcnNldCA9IEhFQlJFV19DSEFSU0VUOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDEyNTY6Ly9BcmFiaWMKLSAgICAgICAgbkNoYXJzZXQgPSBBUkFCSUNfQ0hBUlNFVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjU3Oi8vQmFsdGljCi0gICAgICAgIG5DaGFyc2V0ID0gQkFMVElDX0NIQVJTRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1ODovL1ZpZXRuYW1lc2UKLSAgICAgICAgbkNoYXJzZXQgPSBWSUVUTkFNRVNFX0NIQVJTRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTM2MTovL0tvcmVhbihKb2hhYikKLSAgICAgICAgbkNoYXJzZXQgPSBKT0hBQl9DSEFSU0VUOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIG5DaGFyc2V0OworaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkdldE5hdGl2ZUNoYXJzZXQoKSB7CisgIHVpbnQ4X3QgbkNoYXJzZXQgPSBBTlNJX0NIQVJTRVQ7CisgIGludDMyX3QgaUNvZGVQYWdlID0gRlhTWVNfR2V0QUNQKCk7CisgIHN3aXRjaCAoaUNvZGVQYWdlKSB7CisgICAgY2FzZSA5MzI6ICAvLyBKYXBhbgorICAgICAgbkNoYXJzZXQgPSBTSElGVEpJU19DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5MzY6ICAvLyBDaGluZXNlIChQUkMsIFNpbmdhcG9yZSkKKyAgICAgIG5DaGFyc2V0ID0gR0IyMzEyX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDk1MDogIC8vIENoaW5lc2UgKFRhaXdhbjsgSG9uZyBLb25nIFNBUiwgUFJDKQorICAgICAgbkNoYXJzZXQgPSBHQjIzMTJfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1MjogIC8vIFdpbmRvd3MgMy4xIExhdGluIDEgKFVTLCBXZXN0ZXJuIEV1cm9wZSkKKyAgICAgIG5DaGFyc2V0ID0gQU5TSV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4NzQ6ICAvLyBUaGFpCisgICAgICBuQ2hhcnNldCA9IFRIQUlfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTQ5OiAgLy8gS29yZWFuCisgICAgICBuQ2hhcnNldCA9IEhBTkdVTF9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjAwOiAgLy8gVW5pY29kZSAoQk1QIG9mIElTTyAxMDY0NikKKyAgICAgIG5DaGFyc2V0ID0gQU5TSV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjUwOiAgLy8gV2luZG93cyAzLjEgRWFzdGVybiBFdXJvcGVhbgorICAgICAgbkNoYXJzZXQgPSBFQVNURVVST1BFX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTE6ICAvLyBXaW5kb3dzIDMuMSBDeXJpbGxpYworICAgICAgbkNoYXJzZXQgPSBSVVNTSUFOX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTM6ICAvLyBXaW5kb3dzIDMuMSBHcmVlaworICAgICAgbkNoYXJzZXQgPSBHUkVFS19DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjU0OiAgLy8gV2luZG93cyAzLjEgVHVya2lzaAorICAgICAgbkNoYXJzZXQgPSBUVVJLSVNIX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTU6ICAvLyBIZWJyZXcKKyAgICAgIG5DaGFyc2V0ID0gSEVCUkVXX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTY6ICAvLyBBcmFiaWMKKyAgICAgIG5DaGFyc2V0ID0gQVJBQklDX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTc6ICAvLyBCYWx0aWMKKyAgICAgIG5DaGFyc2V0ID0gQkFMVElDX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTg6ICAvLyBWaWV0bmFtZXNlCisgICAgICBuQ2hhcnNldCA9IFZJRVROQU1FU0VfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM2MTogIC8vIEtvcmVhbihKb2hhYikKKyAgICAgIG5DaGFyc2V0ID0gSk9IQUJfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBuQ2hhcnNldDsKIH0KIAogY29uc3QgQ1BXTF9Gb250TWFwOjpDaGFyc2V0Rm9udE1hcCBDUFdMX0ZvbnRNYXA6OmRlZmF1bHRUVEZNYXBbXSA9IHsKLSAgICB7IEFOU0lfQ0hBUlNFVCwgIkhlbHZldGljYSIgfSwKLSAgICB7IEdCMjMxMl9DSEFSU0VULCAiU2ltU3VuIiB9LAotICAgIHsgQ0hJTkVTRUJJRzVfQ0hBUlNFVCwgIk1pbmdMaVUiIH0sCi0gICAgeyBTSElGVEpJU19DSEFSU0VULCAiTVMgR290aGljIiB9LAotICAgIHsgSEFOR1VMX0NIQVJTRVQsICJCYXRhbmciIH0sCi0gICAgeyBSVVNTSUFOX0NIQVJTRVQsICJBcmlhbCIgfSwKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0xJTlVYXyB8fCBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgIHsgRUFTVEVVUk9QRV9DSEFSU0VULCAiQXJpYWwiIH0sCisgICAge0FOU0lfQ0hBUlNFVCwgIkhlbHZldGljYSJ9LCAgICAgIHtHQjIzMTJfQ0hBUlNFVCwgIlNpbVN1biJ9LAorICAgIHtDSElORVNFQklHNV9DSEFSU0VULCAiTWluZ0xpVSJ9LCB7U0hJRlRKSVNfQ0hBUlNFVCwgIk1TIEdvdGhpYyJ9LAorICAgIHtIQU5HVUxfQ0hBUlNFVCwgIkJhdGFuZyJ9LCAgICAgICB7UlVTU0lBTl9DSEFSU0VULCAiQXJpYWwifSwKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0xJTlVYXyB8fCBcCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgICB7RUFTVEVVUk9QRV9DSEFSU0VULCAiQXJpYWwifSwKICNlbHNlCi0gICAgeyBFQVNURVVST1BFX0NIQVJTRVQsICJUYWhvbWEiIH0sCisgICAge0VBU1RFVVJPUEVfQ0hBUlNFVCwgIlRhaG9tYSJ9LAogI2VuZGlmCi0gICAgeyBBUkFCSUNfQ0hBUlNFVCwgIkFyaWFsIiB9LAotICAgIHsgLTEsIE5VTEwgfQotfTsKKyAgICB7QVJBQklDX0NIQVJTRVQsICJBcmlhbCJ9LCAgICAgICAgey0xLCBOVUxMfX07CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0RGVmYXVsdEZvbnRCeUNoYXJzZXQoaW50MzJfdCBuQ2hhcnNldCkKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgd2hpbGUgKGRlZmF1bHRUVEZNYXBbaV0uY2hhcnNldCAhPSAtMSkgewotICAgICAgICBpZiAobkNoYXJzZXQgPT0gZGVmYXVsdFRURk1hcFtpXS5jaGFyc2V0KQotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRUVEZNYXBbaV0uZm9udG5hbWU7Ci0gICAgICAgICsraTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChpbnQzMl90IG5DaGFyc2V0KSB7CisgIGludCBpID0gMDsKKyAgd2hpbGUgKGRlZmF1bHRUVEZNYXBbaV0uY2hhcnNldCAhPSAtMSkgeworICAgIGlmIChuQ2hhcnNldCA9PSBkZWZhdWx0VFRGTWFwW2ldLmNoYXJzZXQpCisgICAgICByZXR1cm4gZGVmYXVsdFRURk1hcFtpXS5mb250bmFtZTsKKyAgICArK2k7CisgIH0KKyAgcmV0dXJuICIiOwogfQogCi1pbnQzMl90IENQV0xfRm9udE1hcDo6Q2hhclNldEZyb21Vbmljb2RlKEZYX1dPUkQgd29yZCwgaW50MzJfdCBuT2xkQ2hhcnNldCkKLXsKLSAgICBpZihtX3BTeXN0ZW1IYW5kbGVyICYmICgtMSAhPSBtX3BTeXN0ZW1IYW5kbGVyLT5HZXRDaGFyU2V0KCkpKQotICAgICAgICByZXR1cm4gbV9wU3lzdGVtSGFuZGxlci0+R2V0Q2hhclNldCgpOwotICAgIC8vdG8gYXZvaWQgQ0pLIEZvbnQgdG8gc2hvdyBBU0NJSQotICAgIGlmICh3b3JkIDwgMHg3RikgcmV0dXJuIEFOU0lfQ0hBUlNFVDsKLSAgICAvL2ZvbGxvdyB0aGUgb2xkIGNoYXJzZXQKLSAgICBpZiAobk9sZENoYXJzZXQgIT0gREVGQVVMVF9DSEFSU0VUKSByZXR1cm4gbk9sZENoYXJzZXQ7Ci0KLSAgICAvL2ZpbmQgbmV3IGNoYXJzZXQKLSAgICBpZiAoKHdvcmQgPj0gMHg0RTAwICYmIHdvcmQgPD0gMHg5RkE1KSB8fAotICAgICAgICAod29yZCA+PSAweEU3QzcgJiYgd29yZCA8PSAweEU3RjMpIHx8Ci0gICAgICAgICh3b3JkID49IDB4MzAwMCAmJiB3b3JkIDw9IDB4MzAzRikgfHwKLSAgICAgICAgKHdvcmQgPj0gMHgyMDAwICYmIHdvcmQgPD0gMHgyMDZGKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHQjIzMTJfQ0hBUlNFVDsKLSAgICB9Ci0KLSAgICBpZiAoKCh3b3JkID49IDB4MzA0MCkgJiYgKHdvcmQgPD0gMHgzMDlGKSkgfHwKLSAgICAgICAgKCh3b3JkID49IDB4MzBBMCkgJiYgKHdvcmQgPD0gMHgzMEZGKSkgfHwKLSAgICAgICAgKCh3b3JkID49IDB4MzFGMCkgJiYgKHdvcmQgPD0gMHgzMUZGKSkgfHwKLSAgICAgICAgKCh3b3JkID49IDB4RkYwMCkgJiYgKHdvcmQgPD0gMHhGRkVGKSkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFNISUZUSklTX0NIQVJTRVQ7Ci0gICAgfQotCi0gICAgaWYgKCgod29yZCA+PSAweEFDMDApICYmICh3b3JkIDw9IDB4RDdBRikpIHx8Ci0gICAgICAgICgod29yZCA+PSAweDExMDApICYmICh3b3JkIDw9IDB4MTFGRikpIHx8Ci0gICAgICAgICgod29yZCA+PSAweDMxMzApICYmICh3b3JkIDw9IDB4MzE4RikpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEhBTkdVTF9DSEFSU0VUOwotICAgIH0KLQotICAgIGlmICh3b3JkID49IDB4MEUwMCAmJiB3b3JkIDw9IDB4MEU3RikKLSAgICAgICAgcmV0dXJuIFRIQUlfQ0hBUlNFVDsKLQotICAgIGlmICgod29yZCA+PSAweDAzNzAgJiYgd29yZCA8PSAweDAzRkYpIHx8Ci0gICAgICAgICh3b3JkID49IDB4MUYwMCAmJiB3b3JkIDw9IDB4MUZGRikpCi0gICAgICAgIHJldHVybiBHUkVFS19DSEFSU0VUOwotCi0gICAgaWYgKCh3b3JkID49IDB4MDYwMCAmJiB3b3JkIDw9IDB4MDZGRikgfHwKLSAgICAgICAgKHdvcmQgPj0gMHhGQjUwICYmIHdvcmQgPD0gMHhGRUZDKSkKLSAgICAgICAgcmV0dXJuIEFSQUJJQ19DSEFSU0VUOwotCi0gICAgaWYgKHdvcmQgPj0gMHgwNTkwICYmIHdvcmQgPD0gMHgwNUZGKQotICAgICAgICByZXR1cm4gSEVCUkVXX0NIQVJTRVQ7Ci0KLSAgICBpZiAod29yZCA+PSAweDA0MDAgJiYgd29yZCA8PSAweDA0RkYpCi0gICAgICAgIHJldHVybiBSVVNTSUFOX0NIQVJTRVQ7Ci0KLSAgICBpZiAod29yZCA+PSAweDAxMDAgJiYgd29yZCA8PSAweDAyNEYpCi0gICAgICAgIHJldHVybiBFQVNURVVST1BFX0NIQVJTRVQ7Ci0KLSAgICBpZiAod29yZCA+PSAweDFFMDAgJiYgd29yZCA8PSAweDFFRkYpCi0gICAgICAgIHJldHVybiBWSUVUTkFNRVNFX0NIQVJTRVQ7Ci0KK2ludDMyX3QgQ1BXTF9Gb250TWFwOjpDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KSB7CisgIGlmIChtX3BTeXN0ZW1IYW5kbGVyICYmICgtMSAhPSBtX3BTeXN0ZW1IYW5kbGVyLT5HZXRDaGFyU2V0KCkpKQorICAgIHJldHVybiBtX3BTeXN0ZW1IYW5kbGVyLT5HZXRDaGFyU2V0KCk7CisgIC8vIHRvIGF2b2lkIENKSyBGb250IHRvIHNob3cgQVNDSUkKKyAgaWYgKHdvcmQgPCAweDdGKQogICAgIHJldHVybiBBTlNJX0NIQVJTRVQ7CisgIC8vIGZvbGxvdyB0aGUgb2xkIGNoYXJzZXQKKyAgaWYgKG5PbGRDaGFyc2V0ICE9IERFRkFVTFRfQ0hBUlNFVCkKKyAgICByZXR1cm4gbk9sZENoYXJzZXQ7CisKKyAgLy8gZmluZCBuZXcgY2hhcnNldAorICBpZiAoKHdvcmQgPj0gMHg0RTAwICYmIHdvcmQgPD0gMHg5RkE1KSB8fAorICAgICAgKHdvcmQgPj0gMHhFN0M3ICYmIHdvcmQgPD0gMHhFN0YzKSB8fAorICAgICAgKHdvcmQgPj0gMHgzMDAwICYmIHdvcmQgPD0gMHgzMDNGKSB8fAorICAgICAgKHdvcmQgPj0gMHgyMDAwICYmIHdvcmQgPD0gMHgyMDZGKSkgeworICAgIHJldHVybiBHQjIzMTJfQ0hBUlNFVDsKKyAgfQorCisgIGlmICgoKHdvcmQgPj0gMHgzMDQwKSAmJiAod29yZCA8PSAweDMwOUYpKSB8fAorICAgICAgKCh3b3JkID49IDB4MzBBMCkgJiYgKHdvcmQgPD0gMHgzMEZGKSkgfHwKKyAgICAgICgod29yZCA+PSAweDMxRjApICYmICh3b3JkIDw9IDB4MzFGRikpIHx8CisgICAgICAoKHdvcmQgPj0gMHhGRjAwKSAmJiAod29yZCA8PSAweEZGRUYpKSkgeworICAgIHJldHVybiBTSElGVEpJU19DSEFSU0VUOworICB9CisKKyAgaWYgKCgod29yZCA+PSAweEFDMDApICYmICh3b3JkIDw9IDB4RDdBRikpIHx8CisgICAgICAoKHdvcmQgPj0gMHgxMTAwKSAmJiAod29yZCA8PSAweDExRkYpKSB8fAorICAgICAgKCh3b3JkID49IDB4MzEzMCkgJiYgKHdvcmQgPD0gMHgzMThGKSkpIHsKKyAgICByZXR1cm4gSEFOR1VMX0NIQVJTRVQ7CisgIH0KKworICBpZiAod29yZCA+PSAweDBFMDAgJiYgd29yZCA8PSAweDBFN0YpCisgICAgcmV0dXJuIFRIQUlfQ0hBUlNFVDsKKworICBpZiAoKHdvcmQgPj0gMHgwMzcwICYmIHdvcmQgPD0gMHgwM0ZGKSB8fCAod29yZCA+PSAweDFGMDAgJiYgd29yZCA8PSAweDFGRkYpKQorICAgIHJldHVybiBHUkVFS19DSEFSU0VUOworCisgIGlmICgod29yZCA+PSAweDA2MDAgJiYgd29yZCA8PSAweDA2RkYpIHx8ICh3b3JkID49IDB4RkI1MCAmJiB3b3JkIDw9IDB4RkVGQykpCisgICAgcmV0dXJuIEFSQUJJQ19DSEFSU0VUOworCisgIGlmICh3b3JkID49IDB4MDU5MCAmJiB3b3JkIDw9IDB4MDVGRikKKyAgICByZXR1cm4gSEVCUkVXX0NIQVJTRVQ7CisKKyAgaWYgKHdvcmQgPj0gMHgwNDAwICYmIHdvcmQgPD0gMHgwNEZGKQorICAgIHJldHVybiBSVVNTSUFOX0NIQVJTRVQ7CisKKyAgaWYgKHdvcmQgPj0gMHgwMTAwICYmIHdvcmQgPD0gMHgwMjRGKQorICAgIHJldHVybiBFQVNURVVST1BFX0NIQVJTRVQ7CisKKyAgaWYgKHdvcmQgPj0gMHgxRTAwICYmIHdvcmQgPD0gMHgxRUZGKQorICAgIHJldHVybiBWSUVUTkFNRVNFX0NIQVJTRVQ7CisKKyAgcmV0dXJuIEFOU0lfQ0hBUlNFVDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfRG9jRm9udE1hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9Eb2NGb250TWFwOjpDUFdMX0RvY0ZvbnRNYXAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyLCBDUERGX0RvY3VtZW50KiBwQXR0YWNoZWREb2MpCi0gICAgOiBDUFdMX0ZvbnRNYXAocFN5c3RlbUhhbmRsZXIpLAotICAgIG1fcEF0dGFjaGVkRG9jKHBBdHRhY2hlZERvYykKLXsKLX0KK0NQV0xfRG9jRm9udE1hcDo6Q1BXTF9Eb2NGb250TWFwKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBBdHRhY2hlZERvYykKKyAgICA6IENQV0xfRm9udE1hcChwU3lzdGVtSGFuZGxlciksIG1fcEF0dGFjaGVkRG9jKHBBdHRhY2hlZERvYykge30KIAotQ1BXTF9Eb2NGb250TWFwOjp+Q1BXTF9Eb2NGb250TWFwKCkKLXsKLX0KK0NQV0xfRG9jRm9udE1hcDo6fkNQV0xfRG9jRm9udE1hcCgpIHt9CiAKLUNQREZfRG9jdW1lbnQqIENQV0xfRG9jRm9udE1hcDo6R2V0RG9jdW1lbnQoKQotewotICAgIHJldHVybiBtX3BBdHRhY2hlZERvYzsKK0NQREZfRG9jdW1lbnQqIENQV0xfRG9jRm9udE1hcDo6R2V0RG9jdW1lbnQoKSB7CisgIHJldHVybiBtX3BBdHRhY2hlZERvYzsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbi5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ljb24uY3BwCmluZGV4IDcxMTc0ZGYuLjI5ZTBhYTggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbi5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uLmNwcApAQCAtOSwyNTQgKzksMjIyIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb24uaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0ltYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9JbWFnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAotQ1BXTF9JbWFnZTo6Q1BXTF9JbWFnZSgpIDogbV9wUERGU3RyZWFtKE5VTEwpCi17CitDUFdMX0ltYWdlOjpDUFdMX0ltYWdlKCkgOiBtX3BQREZTdHJlYW0oTlVMTCkge30KKworQ1BXTF9JbWFnZTo6fkNQV0xfSW1hZ2UoKSB7fQorCitDRlhfQnl0ZVN0cmluZyBDUFdMX0ltYWdlOjpHZXRJbWFnZUFwcFN0cmVhbSgpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CisKKyAgQ0ZYX0J5dGVTdHJpbmcgc0FsaWFzID0gR2V0SW1hZ2VBbGlhcygpOworICBDUERGX1JlY3QgcmNQbGF0ZSA9IEdldENsaWVudFJlY3QoKTsKKyAgQ1BERl9NYXRyaXggbXQ7CisgIG10LlNldFJldmVyc2UoR2V0SW1hZ2VNYXRyaXgoKSk7CisKKyAgRlhfRkxPQVQgZkhTY2FsZSA9IDEuMGY7CisgIEZYX0ZMT0FUIGZWU2NhbGUgPSAxLjBmOworICBHZXRTY2FsZShmSFNjYWxlLCBmVlNjYWxlKTsKKworICBGWF9GTE9BVCBmeCA9IDAuMGY7CisgIEZYX0ZMT0FUIGZ5ID0gMC4wZjsKKyAgR2V0SW1hZ2VPZmZzZXQoZngsIGZ5KTsKKworICBpZiAobV9wUERGU3RyZWFtICYmIHNBbGlhcy5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBzQXBwU3RyZWFtIDw8ICJxXG4iOworICAgIHNBcHBTdHJlYW0gPDwgcmNQbGF0ZS5sZWZ0IDw8ICIgIiA8PCByY1BsYXRlLmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IHJjUGxhdGUucmlnaHQgLSByY1BsYXRlLmxlZnQgPDwgIiAiCisgICAgICAgICAgICAgICA8PCByY1BsYXRlLnRvcCAtIHJjUGxhdGUuYm90dG9tIDw8ICIgcmUgVyBuXG4iOworCisgICAgc0FwcFN0cmVhbSA8PCBmSFNjYWxlIDw8ICIgMCAwICIgPDwgZlZTY2FsZSA8PCAiICIgPDwgcmNQbGF0ZS5sZWZ0ICsgZngKKyAgICAgICAgICAgICAgIDw8ICIgIiA8PCByY1BsYXRlLmJvdHRvbSArIGZ5IDw8ICIgY21cbiI7CisgICAgc0FwcFN0cmVhbSA8PCBtdC5HZXRBKCkgPDwgIiAiIDw8IG10LkdldEIoKSA8PCAiICIgPDwgbXQuR2V0QygpIDw8ICIgIgorICAgICAgICAgICAgICAgPDwgbXQuR2V0RCgpIDw8ICIgIiA8PCBtdC5HZXRFKCkgPDwgIiAiIDw8IG10LkdldEYoKSA8PCAiIGNtXG4iOworCisgICAgc0FwcFN0cmVhbSA8PCAiMCBnIDAgRyAxIHcgLyIgPDwgc0FsaWFzIDw8ICIgRG9cbiIKKyAgICAgICAgICAgICAgIDw8ICJRXG4iOworICB9CisKKyAgcmV0dXJuIHNBcHBTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DUFdMX0ltYWdlOjp+Q1BXTF9JbWFnZSgpCi17Cit2b2lkIENQV0xfSW1hZ2U6OlNldFBERlN0cmVhbShDUERGX1N0cmVhbSogcFN0cmVhbSkgeworICBtX3BQREZTdHJlYW0gPSBwU3RyZWFtOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0ltYWdlOjpHZXRJbWFnZUFwcFN0cmVhbSgpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07Ci0KLQlDRlhfQnl0ZVN0cmluZyBzQWxpYXMgPSBHZXRJbWFnZUFsaWFzKCk7Ci0JQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRDbGllbnRSZWN0KCk7Ci0JQ1BERl9NYXRyaXggbXQ7Ci0JbXQuU2V0UmV2ZXJzZShHZXRJbWFnZU1hdHJpeCgpKTsKLQotCUZYX0ZMT0FUIGZIU2NhbGUgPSAxLjBmOwotCUZYX0ZMT0FUIGZWU2NhbGUgPSAxLjBmOwotCUdldFNjYWxlKGZIU2NhbGUsZlZTY2FsZSk7Ci0KLQlGWF9GTE9BVCBmeCA9IDAuMGY7Ci0JRlhfRkxPQVQgZnkgPSAwLjBmOwotCUdldEltYWdlT2Zmc2V0KGZ4LGZ5KTsKLQotCWlmIChtX3BQREZTdHJlYW0gJiYgc0FsaWFzLkdldExlbmd0aCgpPjApCi0JewotCQlzQXBwU3RyZWFtIDw8ICJxXG4iOwotCQlzQXBwU3RyZWFtIDw8IHJjUGxhdGUubGVmdCA8PCAiICIgPDwgcmNQbGF0ZS5ib3R0b20gPDwgIiAiCi0JCQk8PCByY1BsYXRlLnJpZ2h0IC0gcmNQbGF0ZS5sZWZ0IDw8ICIgIiA8PCByY1BsYXRlLnRvcCAtIHJjUGxhdGUuYm90dG9tIDw8ICIgcmUgVyBuXG4iOwotCi0JCXNBcHBTdHJlYW0gPDwgZkhTY2FsZSA8PCAiIDAgMCAiIDw8IGZWU2NhbGUgPDwgIiAiIDw8IHJjUGxhdGUubGVmdCArIGZ4IDw8ICIgIiA8PCByY1BsYXRlLmJvdHRvbSArIGZ5IDw8ICIgY21cbiI7Ci0JCXNBcHBTdHJlYW0gPDwgbXQuR2V0QSgpIDw8ICIgIiA8PCBtdC5HZXRCKCkgPDwgIiAiIDw8IG10LkdldEMoKSA8PCAiICIgPDwgbXQuR2V0RCgpIDw8ICIgIiA8PCBtdC5HZXRFKCkgPDwgIiAiIDw8IG10LkdldEYoKSA8PCAiIGNtXG4iOwotCi0JCXNBcHBTdHJlYW0gPDwgIjAgZyAwIEcgMSB3IC8iIDw8IHNBbGlhcyA8PCAiIERvXG4iIDw8ICJRXG4iOwotCX0KLQotCXJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKK0NQREZfU3RyZWFtKiBDUFdMX0ltYWdlOjpHZXRQREZTdHJlYW0oKSB7CisgIHJldHVybiBtX3BQREZTdHJlYW07CiB9CiAKLXZvaWQgQ1BXTF9JbWFnZTo6U2V0UERGU3RyZWFtKENQREZfU3RyZWFtICogcFN0cmVhbSkKLXsKLQltX3BQREZTdHJlYW0gPSBwU3RyZWFtOwordm9pZCBDUFdMX0ltYWdlOjpHZXRJbWFnZVNpemUoRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZIZWlnaHQpIHsKKyAgZldpZHRoID0gMC4wZjsKKyAgZkhlaWdodCA9IDAuMGY7CisKKyAgaWYgKG1fcFBERlN0cmVhbSkgeworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wUERGU3RyZWFtLT5HZXREaWN0KCkpIHsKKyAgICAgIENQREZfUmVjdCByZWN0ID0gcERpY3QtPkdldFJlY3QoIkJCb3giKTsKKworICAgICAgZldpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKKyAgICAgIGZIZWlnaHQgPSByZWN0LnRvcCAtIHJlY3QuYm90dG9tOworICAgIH0KKyAgfQogfQogCi1DUERGX1N0cmVhbSAqIENQV0xfSW1hZ2U6OkdldFBERlN0cmVhbSgpCi17Ci0JcmV0dXJuIG1fcFBERlN0cmVhbTsKK0NQREZfTWF0cml4IENQV0xfSW1hZ2U6OkdldEltYWdlTWF0cml4KCkgeworICBpZiAobV9wUERGU3RyZWFtKSB7CisgICAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQREZTdHJlYW0tPkdldERpY3QoKSkgeworICAgICAgcmV0dXJuIHBEaWN0LT5HZXRNYXRyaXgoIk1hdHJpeCIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBDUERGX01hdHJpeCgpOwogfQogCi12b2lkIENQV0xfSW1hZ2U6OkdldEltYWdlU2l6ZShGWF9GTE9BVCAmIGZXaWR0aCxGWF9GTE9BVCAmIGZIZWlnaHQpCi17Ci0JZldpZHRoID0gMC4wZjsKLQlmSGVpZ2h0ID0gMC4wZjsKK0NGWF9CeXRlU3RyaW5nIENQV0xfSW1hZ2U6OkdldEltYWdlQWxpYXMoKSB7CisgIGlmIChtX3NJbWFnZUFsaWFzLklzRW1wdHkoKSkgeworICAgIGlmIChtX3BQREZTdHJlYW0pIHsKKyAgICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wUERGU3RyZWFtLT5HZXREaWN0KCkpIHsKKyAgICAgICAgcmV0dXJuIHBEaWN0LT5HZXRTdHJpbmcoIk5hbWUiKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZQorICAgIHJldHVybiBtX3NJbWFnZUFsaWFzOwogCi0JaWYgKG1fcFBERlN0cmVhbSkKLQl7Ci0JCWlmIChDUERGX0RpY3Rpb25hcnkgKiBwRGljdCA9IG1fcFBERlN0cmVhbS0+R2V0RGljdCgpKQotCQl7Ci0JCQlDUERGX1JlY3QgcmVjdCA9IHBEaWN0LT5HZXRSZWN0KCJCQm94Iik7Ci0KLQkJCWZXaWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7Ci0JCQlmSGVpZ2h0ID0gcmVjdC50b3AgLSByZWN0LmJvdHRvbTsKLQkJfQotCX0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CiB9CiAKLUNQREZfTWF0cml4CUNQV0xfSW1hZ2U6OkdldEltYWdlTWF0cml4KCkKLXsKLQlpZiAobV9wUERGU3RyZWFtKQotCXsKLQkJaWYgKENQREZfRGljdGlvbmFyeSAqIHBEaWN0ID0gbV9wUERGU3RyZWFtLT5HZXREaWN0KCkpCi0JCXsKLQkJCXJldHVybiBwRGljdC0+R2V0TWF0cml4KCJNYXRyaXgiKTsKLQkJfQotCX0KLQotCXJldHVybiBDUERGX01hdHJpeCgpOwordm9pZCBDUFdMX0ltYWdlOjpTZXRJbWFnZUFsaWFzKGNvbnN0IEZYX0NIQVIqIHNJbWFnZUFsaWFzKSB7CisgIG1fc0ltYWdlQWxpYXMgPSBzSW1hZ2VBbGlhczsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9JbWFnZTo6R2V0SW1hZ2VBbGlhcygpCi17Ci0JaWYgKG1fc0ltYWdlQWxpYXMuSXNFbXB0eSgpKQotCXsKLQkJaWYgKG1fcFBERlN0cmVhbSkKLQkJewotCQkJaWYgKENQREZfRGljdGlvbmFyeSAqIHBEaWN0ID0gbV9wUERGU3RyZWFtLT5HZXREaWN0KCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHBEaWN0LT5HZXRTdHJpbmcoIk5hbWUiKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JCXJldHVybiBtX3NJbWFnZUFsaWFzOwotCi0JcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Cit2b2lkIENQV0xfSW1hZ2U6OkdldFNjYWxlKEZYX0ZMT0FUJiBmSFNjYWxlLCBGWF9GTE9BVCYgZlZTY2FsZSkgeworICBmSFNjYWxlID0gMS4wZjsKKyAgZlZTY2FsZSA9IDEuMGY7CiB9CiAKLXZvaWQgQ1BXTF9JbWFnZTo6U2V0SW1hZ2VBbGlhcyhjb25zdCBGWF9DSEFSKiBzSW1hZ2VBbGlhcykKLXsKLQltX3NJbWFnZUFsaWFzID0gc0ltYWdlQWxpYXM7Cit2b2lkIENQV0xfSW1hZ2U6OkdldEltYWdlT2Zmc2V0KEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSkgeworICB4ID0gMC4wZjsKKyAgeSA9IDAuMGY7CiB9CiAKLXZvaWQgQ1BXTF9JbWFnZTo6R2V0U2NhbGUoRlhfRkxPQVQgJiBmSFNjYWxlLEZYX0ZMT0FUICYgZlZTY2FsZSkKLXsKLQlmSFNjYWxlID0gMS4wZjsKLQlmVlNjYWxlID0gMS4wZjsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9JY29uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitDUFdMX0ljb246OkNQV0xfSWNvbigpIDogbV9wSWNvbkZpdChOVUxMKSB7fQorCitDUFdMX0ljb246On5DUFdMX0ljb24oKSB7fQorCitpbnQzMl90IENQV0xfSWNvbjo6R2V0U2NhbGVNZXRob2QoKSB7CisgIGlmIChtX3BJY29uRml0KQorICAgIHJldHVybiBtX3BJY29uRml0LT5HZXRTY2FsZU1ldGhvZCgpOworCisgIHJldHVybiAwOwogfQogCitGWF9CT09MIENQV0xfSWNvbjo6SXNQcm9wb3J0aW9uYWxTY2FsZSgpIHsKKyAgaWYgKG1fcEljb25GaXQpCisgICAgcmV0dXJuIG1fcEljb25GaXQtPklzUHJvcG9ydGlvbmFsU2NhbGUoKTsKIAotdm9pZCBDUFdMX0ltYWdlOjpHZXRJbWFnZU9mZnNldChGWF9GTE9BVCAmIHgsRlhfRkxPQVQgJiB5KQotewotCXggPSAwLjBmOwotCXkgPSAwLjBmOworICByZXR1cm4gRkFMU0U7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9JY29uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ1BXTF9JY29uOjpDUFdMX0ljb24oKSA6IG1fcEljb25GaXQoTlVMTCkKLXsKK3ZvaWQgQ1BXTF9JY29uOjpHZXRJY29uUG9zaXRpb24oRlhfRkxPQVQmIGZMZWZ0LCBGWF9GTE9BVCYgZkJvdHRvbSkgeworICBpZiAobV9wSWNvbkZpdCkgeworICAgIC8vIG1fcEljb25GaXQtPkdldEljb25Qb3NpdGlvbihmTGVmdCxmQm90dG9tKTsKKyAgICBmTGVmdCA9IDAuMGY7CisgICAgZkJvdHRvbSA9IDAuMGY7CisgICAgQ1BERl9BcnJheSogcEEgPQorICAgICAgICBtX3BJY29uRml0LT5tX3BEaWN0ID8gbV9wSWNvbkZpdC0+bV9wRGljdC0+R2V0QXJyYXkoIkEiKSA6IE5VTEw7CisgICAgaWYgKHBBICE9IE5VTEwpIHsKKyAgICAgIEZYX0RXT1JEIGR3Q291bnQgPSBwQS0+R2V0Q291bnQoKTsKKyAgICAgIGlmIChkd0NvdW50ID4gMCkKKyAgICAgICAgZkxlZnQgPSBwQS0+R2V0TnVtYmVyKDApOworICAgICAgaWYgKGR3Q291bnQgPiAxKQorICAgICAgICBmQm90dG9tID0gcEEtPkdldE51bWJlcigxKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZkxlZnQgPSAwLjBmOworICAgIGZCb3R0b20gPSAwLjBmOworICB9CiB9CiAKLUNQV0xfSWNvbjo6fkNQV0xfSWNvbigpCi17CitGWF9CT09MIENQV0xfSWNvbjo6R2V0Rml0dGluZ0JvdW5kcygpIHsKKyAgaWYgKG1fcEljb25GaXQpCisgICAgcmV0dXJuIG1fcEljb25GaXQtPkdldEZpdHRpbmdCb3VuZHMoKTsKKworICByZXR1cm4gRkFMU0U7CiB9CiAKLWludDMyX3QgQ1BXTF9JY29uOjpHZXRTY2FsZU1ldGhvZCgpCi17Ci0JaWYgKG1fcEljb25GaXQpCi0JCXJldHVybiBtX3BJY29uRml0LT5HZXRTY2FsZU1ldGhvZCgpOwordm9pZCBDUFdMX0ljb246OkdldFNjYWxlKEZYX0ZMT0FUJiBmSFNjYWxlLCBGWF9GTE9BVCYgZlZTY2FsZSkgeworICBmSFNjYWxlID0gMS4wZjsKKyAgZlZTY2FsZSA9IDEuMGY7CiAKLQlyZXR1cm4gMDsKKyAgaWYgKG1fcFBERlN0cmVhbSkgeworICAgIEZYX0ZMT0FUIGZJbWFnZVdpZHRoLCBmSW1hZ2VIZWlnaHQ7CisgICAgRlhfRkxPQVQgZlBsYXRlV2lkdGgsIGZQbGF0ZUhlaWdodDsKKworICAgIENQREZfUmVjdCByY1BsYXRlID0gR2V0Q2xpZW50UmVjdCgpOworICAgIGZQbGF0ZVdpZHRoID0gcmNQbGF0ZS5yaWdodCAtIHJjUGxhdGUubGVmdDsKKyAgICBmUGxhdGVIZWlnaHQgPSByY1BsYXRlLnRvcCAtIHJjUGxhdGUuYm90dG9tOworCisgICAgR2V0SW1hZ2VTaXplKGZJbWFnZVdpZHRoLCBmSW1hZ2VIZWlnaHQpOworCisgICAgaW50MzJfdCBuU2NhbGVNZXRob2QgPSBHZXRTY2FsZU1ldGhvZCgpOworCisgICAgc3dpdGNoIChuU2NhbGVNZXRob2QpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBjYXNlIDA6CisgICAgICAgIGZIU2NhbGUgPSBmUGxhdGVXaWR0aCAvIFBXTF9NQVgoZkltYWdlV2lkdGgsIDEuMGYpOworICAgICAgICBmVlNjYWxlID0gZlBsYXRlSGVpZ2h0IC8gUFdMX01BWChmSW1hZ2VIZWlnaHQsIDEuMGYpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGZQbGF0ZVdpZHRoIDwgZkltYWdlV2lkdGgpCisgICAgICAgICAgZkhTY2FsZSA9IGZQbGF0ZVdpZHRoIC8gUFdMX01BWChmSW1hZ2VXaWR0aCwgMS4wZik7CisgICAgICAgIGlmIChmUGxhdGVIZWlnaHQgPCBmSW1hZ2VIZWlnaHQpCisgICAgICAgICAgZlZTY2FsZSA9IGZQbGF0ZUhlaWdodCAvIFBXTF9NQVgoZkltYWdlSGVpZ2h0LCAxLjBmKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChmUGxhdGVXaWR0aCA+IGZJbWFnZVdpZHRoKQorICAgICAgICAgIGZIU2NhbGUgPSBmUGxhdGVXaWR0aCAvIFBXTF9NQVgoZkltYWdlV2lkdGgsIDEuMGYpOworICAgICAgICBpZiAoZlBsYXRlSGVpZ2h0ID4gZkltYWdlSGVpZ2h0KQorICAgICAgICAgIGZWU2NhbGUgPSBmUGxhdGVIZWlnaHQgLyBQV0xfTUFYKGZJbWFnZUhlaWdodCwgMS4wZik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBGWF9GTE9BVCBmTWluU2NhbGU7CisgICAgaWYgKElzUHJvcG9ydGlvbmFsU2NhbGUoKSkgeworICAgICAgZk1pblNjYWxlID0gUFdMX01JTihmSFNjYWxlLCBmVlNjYWxlKTsKKyAgICAgIGZIU2NhbGUgPSBmTWluU2NhbGU7CisgICAgICBmVlNjYWxlID0gZk1pblNjYWxlOworICAgIH0KKyAgfQogfQogCi1GWF9CT09MCUNQV0xfSWNvbjo6SXNQcm9wb3J0aW9uYWxTY2FsZSgpCi17Ci0JaWYgKG1fcEljb25GaXQpCi0JCXJldHVybiBtX3BJY29uRml0LT5Jc1Byb3BvcnRpb25hbFNjYWxlKCk7Cit2b2lkIENQV0xfSWNvbjo6R2V0SW1hZ2VPZmZzZXQoRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KSB7CisgIEZYX0ZMT0FUIGZMZWZ0LCBmQm90dG9tOwogCi0JcmV0dXJuIEZBTFNFOworICBHZXRJY29uUG9zaXRpb24oZkxlZnQsIGZCb3R0b20pOworICB4ID0gMC4wZjsKKyAgeSA9IDAuMGY7CisKKyAgRlhfRkxPQVQgZkltYWdlV2lkdGgsIGZJbWFnZUhlaWdodDsKKyAgR2V0SW1hZ2VTaXplKGZJbWFnZVdpZHRoLCBmSW1hZ2VIZWlnaHQpOworCisgIEZYX0ZMT0FUIGZIU2NhbGUsIGZWU2NhbGU7CisgIEdldFNjYWxlKGZIU2NhbGUsIGZWU2NhbGUpOworCisgIEZYX0ZMT0FUIGZJbWFnZUZhY3RXaWR0aCA9IGZJbWFnZVdpZHRoICogZkhTY2FsZTsKKyAgRlhfRkxPQVQgZkltYWdlRmFjdEhlaWdodCA9IGZJbWFnZUhlaWdodCAqIGZWU2NhbGU7CisKKyAgRlhfRkxPQVQgZlBsYXRlV2lkdGgsIGZQbGF0ZUhlaWdodDsKKyAgQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRDbGllbnRSZWN0KCk7CisgIGZQbGF0ZVdpZHRoID0gcmNQbGF0ZS5yaWdodCAtIHJjUGxhdGUubGVmdDsKKyAgZlBsYXRlSGVpZ2h0ID0gcmNQbGF0ZS50b3AgLSByY1BsYXRlLmJvdHRvbTsKKworICB4ID0gKGZQbGF0ZVdpZHRoIC0gZkltYWdlRmFjdFdpZHRoKSAqIGZMZWZ0OworICB5ID0gKGZQbGF0ZUhlaWdodCAtIGZJbWFnZUZhY3RIZWlnaHQpICogZkJvdHRvbTsKIH0KLQotdm9pZCBDUFdMX0ljb246OkdldEljb25Qb3NpdGlvbihGWF9GTE9BVCAmIGZMZWZ0LCBGWF9GTE9BVCAmIGZCb3R0b20pCi17Ci0JaWYgKG1fcEljb25GaXQpCi0JewotCQkvL21fcEljb25GaXQtPkdldEljb25Qb3NpdGlvbihmTGVmdCxmQm90dG9tKTsKLQkJZkxlZnQgPSAwLjBmOwotCQlmQm90dG9tID0gMC4wZjsKLQkJQ1BERl9BcnJheSogcEEgPSBtX3BJY29uRml0LT5tX3BEaWN0ID8gbV9wSWNvbkZpdC0+bV9wRGljdC0+R2V0QXJyYXkoIkEiKSA6IE5VTEw7Ci0JCWlmIChwQSAhPSBOVUxMKQotCQl7Ci0JCQlGWF9EV09SRCBkd0NvdW50ID0gcEEtPkdldENvdW50KCk7Ci0JCQlpZiAoZHdDb3VudCA+IDApIGZMZWZ0ID0gcEEtPkdldE51bWJlcigwKTsKLQkJCWlmIChkd0NvdW50ID4gMSkgZkJvdHRvbSA9IHBBLT5HZXROdW1iZXIoMSk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJZkxlZnQgPSAwLjBmOwotCQlmQm90dG9tID0gMC4wZjsKLQl9Ci19Ci0KLUZYX0JPT0wgQ1BXTF9JY29uOjpHZXRGaXR0aW5nQm91bmRzKCkKLXsKLQlpZiAobV9wSWNvbkZpdCkKLQkJcmV0dXJuIG1fcEljb25GaXQtPkdldEZpdHRpbmdCb3VuZHMoKTsKLQotCXJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBDUFdMX0ljb246OkdldFNjYWxlKEZYX0ZMT0FUICYgZkhTY2FsZSxGWF9GTE9BVCAmIGZWU2NhbGUpCi17Ci0JZkhTY2FsZSA9IDEuMGY7Ci0JZlZTY2FsZSA9IDEuMGY7Ci0KLQlpZiAobV9wUERGU3RyZWFtKQotCXsKLQkJRlhfRkxPQVQgZkltYWdlV2lkdGgsZkltYWdlSGVpZ2h0OwotCQlGWF9GTE9BVCBmUGxhdGVXaWR0aCxmUGxhdGVIZWlnaHQ7Ci0KLQkJQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRDbGllbnRSZWN0KCk7Ci0JCWZQbGF0ZVdpZHRoID0gcmNQbGF0ZS5yaWdodCAtIHJjUGxhdGUubGVmdDsKLQkJZlBsYXRlSGVpZ2h0ID0gcmNQbGF0ZS50b3AgLSByY1BsYXRlLmJvdHRvbTsKLQotCQlHZXRJbWFnZVNpemUoZkltYWdlV2lkdGgsZkltYWdlSGVpZ2h0KTsKLQotCQlpbnQzMl90IG5TY2FsZU1ldGhvZCA9IEdldFNjYWxlTWV0aG9kKCk7Ci0KLQkJc3dpdGNoIChuU2NhbGVNZXRob2QpCi0JCXsKLQkJZGVmYXVsdDoKLQkJY2FzZSAwOgotCQkJZkhTY2FsZSA9IGZQbGF0ZVdpZHRoIC8gUFdMX01BWChmSW1hZ2VXaWR0aCwxLjBmKTsKLQkJCWZWU2NhbGUgPSBmUGxhdGVIZWlnaHQgLyBQV0xfTUFYKGZJbWFnZUhlaWdodCwxLjBmKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlpZiAoZlBsYXRlV2lkdGggPCBmSW1hZ2VXaWR0aCkKLQkJCQlmSFNjYWxlID0gZlBsYXRlV2lkdGggLyBQV0xfTUFYKGZJbWFnZVdpZHRoLDEuMGYpOwotCQkJaWYgKGZQbGF0ZUhlaWdodCA8IGZJbWFnZUhlaWdodCkKLQkJCQlmVlNjYWxlID0gZlBsYXRlSGVpZ2h0IC8gUFdMX01BWChmSW1hZ2VIZWlnaHQsMS4wZik7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJaWYgKGZQbGF0ZVdpZHRoID4gZkltYWdlV2lkdGgpCi0JCQkJZkhTY2FsZSA9IGZQbGF0ZVdpZHRoIC8gUFdMX01BWChmSW1hZ2VXaWR0aCwxLjBmKTsKLQkJCWlmIChmUGxhdGVIZWlnaHQgPiBmSW1hZ2VIZWlnaHQpCi0JCQkJZlZTY2FsZSA9IGZQbGF0ZUhlaWdodCAvIFBXTF9NQVgoZkltYWdlSGVpZ2h0LDEuMGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJRlhfRkxPQVQgZk1pblNjYWxlOwotCQlpZiAoSXNQcm9wb3J0aW9uYWxTY2FsZSgpKQotCQl7Ci0JCQlmTWluU2NhbGUgPSBQV0xfTUlOKGZIU2NhbGUsZlZTY2FsZSk7Ci0JCQlmSFNjYWxlID0gZk1pblNjYWxlOwotCQkJZlZTY2FsZSA9IGZNaW5TY2FsZTsKLQkJfQotCX0KLX0KLQotdm9pZCBDUFdMX0ljb246OkdldEltYWdlT2Zmc2V0KEZYX0ZMT0FUICYgeCxGWF9GTE9BVCAmIHkpCi17Ci0JRlhfRkxPQVQgZkxlZnQsZkJvdHRvbTsKLQotCUdldEljb25Qb3NpdGlvbihmTGVmdCwgZkJvdHRvbSk7Ci0JeCA9IDAuMGY7Ci0JeSA9IDAuMGY7Ci0KLQlGWF9GTE9BVCBmSW1hZ2VXaWR0aCxmSW1hZ2VIZWlnaHQ7Ci0JR2V0SW1hZ2VTaXplKGZJbWFnZVdpZHRoLGZJbWFnZUhlaWdodCk7Ci0KLQlGWF9GTE9BVCBmSFNjYWxlLGZWU2NhbGU7Ci0JR2V0U2NhbGUoZkhTY2FsZSxmVlNjYWxlKTsKLQotCUZYX0ZMT0FUIGZJbWFnZUZhY3RXaWR0aCA9IGZJbWFnZVdpZHRoICogZkhTY2FsZTsKLQlGWF9GTE9BVCBmSW1hZ2VGYWN0SGVpZ2h0ID0gZkltYWdlSGVpZ2h0ICogZlZTY2FsZTsKLQotCUZYX0ZMT0FUIGZQbGF0ZVdpZHRoLGZQbGF0ZUhlaWdodDsKLQlDUERGX1JlY3QgcmNQbGF0ZSA9IEdldENsaWVudFJlY3QoKTsKLQlmUGxhdGVXaWR0aCA9IHJjUGxhdGUucmlnaHQgLSByY1BsYXRlLmxlZnQ7Ci0JZlBsYXRlSGVpZ2h0ID0gcmNQbGF0ZS50b3AgLSByY1BsYXRlLmJvdHRvbTsKLQotCXggPSAoZlBsYXRlV2lkdGggLSBmSW1hZ2VGYWN0V2lkdGgpICogZkxlZnQ7Ci0JeSA9IChmUGxhdGVIZWlnaHQgLSBmSW1hZ2VGYWN0SGVpZ2h0KSAgKiBmQm90dG9tOwotfQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ljb25MaXN0LmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuY3BwCmluZGV4IDE1N2ViYTYuLjI0ZDJkYWQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuY3BwCkBAIC0xMiw1ODEgKzEyLDQ5NCBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGFiZWwuaCIKIAotI2RlZmluZSBQV0xfSWNvbkxpc3RfSVRFTV9JQ09OX0xFRlRNQVJHSU4JCTEwLjBmCi0jZGVmaW5lIFBXTF9JY29uTGlzdF9JVEVNX1dJRFRICQkJCQkyMC4wZgotI2RlZmluZSBQV0xfSWNvbkxpc3RfSVRFTV9IRUlHSFQJCQkJMjAuMGYKLSNkZWZpbmUgUFdMX0ljb25MaXN0X0lURU1fU1BBQ0UJCQkJCTQuMGYKKyNkZWZpbmUgUFdMX0ljb25MaXN0X0lURU1fSUNPTl9MRUZUTUFSR0lOIDEwLjBmCisjZGVmaW5lIFBXTF9JY29uTGlzdF9JVEVNX1dJRFRIIDIwLjBmCisjZGVmaW5lIFBXTF9JY29uTGlzdF9JVEVNX0hFSUdIVCAyMC4wZgorI2RlZmluZSBQV0xfSWNvbkxpc3RfSVRFTV9TUEFDRSA0LjBmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0ljb25MaXN0X0l0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX0ljb25MaXN0X0l0ZW06OkNQV0xfSWNvbkxpc3RfSXRlbSgpIDoKLQltX25JY29uSW5kZXgoLTEpLAotCW1fcERhdGEoTlVMTCksCi0JbV9iU2VsZWN0ZWQoRkFMU0UpLAotCW1fcFRleHQoTlVMTCkKLXsKK0NQV0xfSWNvbkxpc3RfSXRlbTo6Q1BXTF9JY29uTGlzdF9JdGVtKCkKKyAgICA6IG1fbkljb25JbmRleCgtMSksIG1fcERhdGEoTlVMTCksIG1fYlNlbGVjdGVkKEZBTFNFKSwgbV9wVGV4dChOVUxMKSB7fQorCitDUFdMX0ljb25MaXN0X0l0ZW06On5DUFdMX0ljb25MaXN0X0l0ZW0oKSB7fQorCitDRlhfQnl0ZVN0cmluZyBDUFdMX0ljb25MaXN0X0l0ZW06OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJDUFdMX0ljb25MaXN0X0l0ZW0iOwogfQogCi1DUFdMX0ljb25MaXN0X0l0ZW06On5DUFdMX0ljb25MaXN0X0l0ZW0oKQoteworRlhfRkxPQVQgQ1BXTF9JY29uTGlzdF9JdGVtOjpHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKSB7CisgIHJldHVybiBQV0xfSWNvbkxpc3RfSVRFTV9IRUlHSFQ7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfSWNvbkxpc3RfSXRlbTo6R2V0Q2xhc3NOYW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gIkNQV0xfSWNvbkxpc3RfSXRlbSI7Cit2b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworCisgIGlmIChtX2JTZWxlY3RlZCkgeworICAgIGlmIChJc0VuYWJsZWQoKSkgeworICAgICAgQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KAorICAgICAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNDbGllbnQsCisgICAgICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfU0VMQkFDS0NPTE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRyYW5zcGFyZW5jeSgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdCgKKyAgICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjQ2xpZW50LAorICAgICAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKFBXTF9ERUZBVUxUX0xJR0hUR1JBWUNPTE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRyYW5zcGFyZW5jeSgpKSk7CisgICAgfQorICB9CisKKyAgQ1BERl9SZWN0IHJjSWNvbiA9IHJjQ2xpZW50OworICByY0ljb24ubGVmdCArPSBQV0xfSWNvbkxpc3RfSVRFTV9JQ09OX0xFRlRNQVJHSU47CisgIHJjSWNvbi5yaWdodCA9IHJjSWNvbi5sZWZ0ICsgUFdMX0ljb25MaXN0X0lURU1fV0lEVEg7CisKKyAgQ1BXTF9VdGlsczo6RHJhd0ljb25BcHBTdHJlYW0ocERldmljZSwgcFVzZXIyRGV2aWNlLCBtX25JY29uSW5kZXgsIHJjSWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jckljb24sIG1fcFRleHQtPkdldFRleHRDb2xvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUcmFuc3BhcmVuY3koKSk7CiB9CiAKLUZYX0ZMT0FUIENQV0xfSWNvbkxpc3RfSXRlbTo6R2V0SXRlbUhlaWdodChGWF9GTE9BVCBmTGltaXRXaWR0aCkKLXsKLQlyZXR1cm4gUFdMX0ljb25MaXN0X0lURU1fSEVJR0hUOwordm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlNldFNlbGVjdChGWF9CT09MIGJTZWxlY3RlZCkgeworICBtX2JTZWxlY3RlZCA9IGJTZWxlY3RlZDsKKworICBpZiAoYlNlbGVjdGVkKQorICAgIG1fcFRleHQtPlNldFRleHRDb2xvcihQV0xfREVGQVVMVF9XSElURUNPTE9SKTsKKyAgZWxzZQorICAgIG1fcFRleHQtPlNldFRleHRDb2xvcihQV0xfREVGQVVMVF9CTEFDS0NPTE9SKTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotCWlmIChtX2JTZWxlY3RlZCkKLQl7Ci0JCWlmIChJc0VuYWJsZWQoKSkKLQkJewotCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNDbGllbnQsCi0JCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfU0VMQkFDS0NPTE9SLCBHZXRUcmFuc3BhcmVuY3koKSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNDbGllbnQsCi0JCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfTElHSFRHUkFZQ09MT1IsIEdldFRyYW5zcGFyZW5jeSgpKSk7Ci0JCX0KLQl9Ci0KLQlDUERGX1JlY3QgcmNJY29uID0gcmNDbGllbnQ7Ci0JcmNJY29uLmxlZnQgKz0gUFdMX0ljb25MaXN0X0lURU1fSUNPTl9MRUZUTUFSR0lOOwotCXJjSWNvbi5yaWdodCA9IHJjSWNvbi5sZWZ0ICsgUFdMX0ljb25MaXN0X0lURU1fV0lEVEg7Ci0KLQlDUFdMX1V0aWxzOjpEcmF3SWNvbkFwcFN0cmVhbShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fbkljb25JbmRleCwgcmNJY29uLAotCQltX2NySWNvbiwgbV9wVGV4dC0+R2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKTsKK0ZYX0JPT0wgQ1BXTF9JY29uTGlzdF9JdGVtOjpJc1NlbGVjdGVkKCkgY29uc3QgeworICByZXR1cm4gbV9iU2VsZWN0ZWQ7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXRTZWxlY3QoRlhfQk9PTCBiU2VsZWN0ZWQpCi17Ci0JbV9iU2VsZWN0ZWQgPSBiU2VsZWN0ZWQ7Cit2b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBtX3BUZXh0ID0gbmV3IENQV0xfTGFiZWw7CiAKLQlpZiAoYlNlbGVjdGVkKQotCQltX3BUZXh0LT5TZXRUZXh0Q29sb3IoUFdMX0RFRkFVTFRfV0hJVEVDT0xPUik7Ci0JZWxzZQotCQltX3BUZXh0LT5TZXRUZXh0Q29sb3IoUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUik7Ci0KKyAgUFdMX0NSRUFURVBBUkFNIGxjcCA9IGNwOworICBsY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGxjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEUgfCBQRVNfTEVGVCB8IFBFU19DRU5URVI7CisgIGxjcC5zVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKKyAgbGNwLmZGb250U2l6ZSA9IDEyOworICBtX3BUZXh0LT5DcmVhdGUobGNwKTsKIH0KIAotRlhfQk9PTAlDUFdMX0ljb25MaXN0X0l0ZW06OklzU2VsZWN0ZWQoKSBjb25zdAotewotCXJldHVybiBtX2JTZWxlY3RlZDsKK3ZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXREYXRhKHZvaWQqIHBEYXRhKSB7CisgIG1fcERhdGEgPSBwRGF0YTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCW1fcFRleHQgPSBuZXcgQ1BXTF9MYWJlbDsKLQotCVBXTF9DUkVBVEVQQVJBTSBsY3AgPSBjcDsKLQlsY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JbGNwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBFU19MRUZUIHwgUEVTX0NFTlRFUjsKLQlsY3Auc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7Ci0JbGNwLmZGb250U2l6ZSA9IDEyOwotCW1fcFRleHQtPkNyZWF0ZShsY3ApOwordm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlNldEljb24oaW50MzJfdCBuSWNvbkluZGV4KSB7CisgIG1fbkljb25JbmRleCA9IG5JY29uSW5kZXg7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXREYXRhKHZvaWQqIHBEYXRhKQotewotCW1fcERhdGEgPSBwRGF0YTsKK3ZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgbV9wVGV4dC0+U2V0VGV4dChzdHIuY19zdHIoKSk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXRJY29uKGludDMyX3Qgbkljb25JbmRleCkKLXsKLQltX25JY29uSW5kZXggPSBuSWNvbkluZGV4OworQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9JY29uTGlzdF9JdGVtOjpHZXRUZXh0KCkgY29uc3QgeworICByZXR1cm4gbV9wVGV4dC0+R2V0VGV4dCgpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKQotewotCW1fcFRleHQtPlNldFRleHQoc3RyLmNfc3RyKCkpOwordm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlJlUG9zQ2hpbGRXbmQoKSB7CisgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKworICByY0NsaWVudC5sZWZ0ICs9CisgICAgICAoUFdMX0ljb25MaXN0X0lURU1fSUNPTl9MRUZUTUFSR0lOICsgUFdMX0ljb25MaXN0X0lURU1fV0lEVEggKworICAgICAgIFBXTF9JY29uTGlzdF9JVEVNX0lDT05fTEVGVE1BUkdJTik7CisKKyAgbV9wVGV4dC0+TW92ZShyY0NsaWVudCwgVFJVRSwgRkFMU0UpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUFdMX0ljb25MaXN0X0l0ZW06OkdldFRleHQoKSBjb25zdAotewotCXJldHVybiBtX3BUZXh0LT5HZXRUZXh0KCk7Cit2b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6U2V0SWNvbkZpbGxDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgeworICBtX2NySWNvbiA9IGNvbG9yOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6UmVQb3NDaGlsZFduZCgpCi17Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwordm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06Ok9uRW5hYmxlZCgpIHsKKyAgaWYgKG1fYlNlbGVjdGVkKQorICAgIG1fcFRleHQtPlNldFRleHRDb2xvcihQV0xfREVGQVVMVF9XSElURUNPTE9SKTsKKyAgZWxzZQorICAgIG1fcFRleHQtPlNldFRleHRDb2xvcihQV0xfREVGQVVMVF9CTEFDS0NPTE9SKTsKIAotCXJjQ2xpZW50LmxlZnQgKz0gKFBXTF9JY29uTGlzdF9JVEVNX0lDT05fTEVGVE1BUkdJTiArIFBXTF9JY29uTGlzdF9JVEVNX1dJRFRIICsgUFdMX0ljb25MaXN0X0lURU1fSUNPTl9MRUZUTUFSR0lOKTsKLQotCW1fcFRleHQtPk1vdmUocmNDbGllbnQsIFRSVUUsIEZBTFNFKTsKKyAgSW52YWxpZGF0ZVJlY3QoKTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlNldEljb25GaWxsQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0JbV9jckljb24gPSBjb2xvcjsKLX0KK3ZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpPbkRpc2FibGVkKCkgeworICBtX3BUZXh0LT5TZXRUZXh0Q29sb3IoUFdMX0RFRkFVTFRfSEVBVllHUkFZQ09MT1IpOwogCi12b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6T25FbmFibGVkKCkKLXsKLQlpZiAobV9iU2VsZWN0ZWQpCi0JCW1fcFRleHQtPlNldFRleHRDb2xvcihQV0xfREVGQVVMVF9XSElURUNPTE9SKTsKLQllbHNlCi0JCW1fcFRleHQtPlNldFRleHRDb2xvcihQV0xfREVGQVVMVF9CTEFDS0NPTE9SKTsKLQotCUludmFsaWRhdGVSZWN0KCk7Ci19Ci0KLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpPbkRpc2FibGVkKCkKLXsKLQltX3BUZXh0LT5TZXRUZXh0Q29sb3IoUFdMX0RFRkFVTFRfSEVBVllHUkFZQ09MT1IpOwotCi0JSW52YWxpZGF0ZVJlY3QoKTsKKyAgSW52YWxpZGF0ZVJlY3QoKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9JY29uTGlzdF9Db250ZW50IC0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNQV0xfSWNvbkxpc3RfQ29udGVudDo6Q1BXTF9JY29uTGlzdF9Db250ZW50KGludDMyX3Qgbkxpc3RDb3VudCkgOgotCW1fblNlbGVjdEluZGV4KC0xKSwKLQltX3BOb3RpZnkoTlVMTCksCi0JbV9iRW5hYmxlTm90aWZ5KFRSVUUpLAotCW1fYk1vdXNlRG93bihGQUxTRSksCi0JbV9uTGlzdENvdW50KG5MaXN0Q291bnQpCi17CitDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OkNQV0xfSWNvbkxpc3RfQ29udGVudChpbnQzMl90IG5MaXN0Q291bnQpCisgICAgOiBtX25TZWxlY3RJbmRleCgtMSksCisgICAgICBtX3BOb3RpZnkoTlVMTCksCisgICAgICBtX2JFbmFibGVOb3RpZnkoVFJVRSksCisgICAgICBtX2JNb3VzZURvd24oRkFMU0UpLAorICAgICAgbV9uTGlzdENvdW50KG5MaXN0Q291bnQpIHt9CisKK0NQV0xfSWNvbkxpc3RfQ29udGVudDo6fkNQV0xfSWNvbkxpc3RfQ29udGVudCgpIHt9CisKK3ZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fbkxpc3RDb3VudDsgaSsrKSB7CisgICAgQ1BXTF9JY29uTGlzdF9JdGVtKiBwTmV3SXRlbSA9IG5ldyBDUFdMX0ljb25MaXN0X0l0ZW0oKTsKKworICAgIFBXTF9DUkVBVEVQQVJBTSBpY3AgPSBjcDsKKyAgICBpY3AucFBhcmVudFduZCA9IHRoaXM7CisgICAgaWNwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBXU19OT1JFRlJFU0hDTElQOworICAgIHBOZXdJdGVtLT5DcmVhdGUoaWNwKTsKKyAgfQorCisgIFNldEl0ZW1TcGFjZShQV0xfSWNvbkxpc3RfSVRFTV9TUEFDRSk7CisgIFJlc2V0Q29udGVudCgwKTsKKworICBpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkgeworICAgIENQREZfUmVjdCByY1Njcm9sbCA9IEdldFNjcm9sbEFyZWEoKTsKKyAgICBHZXRTY3JvbGxQb3MoKTsKKworICAgIFBXTF9TQ1JPTExfSU5GTyBzSW5mbzsKKyAgICBzSW5mby5mQ29udGVudE1pbiA9IHJjU2Nyb2xsLmJvdHRvbTsKKyAgICBzSW5mby5mQ29udGVudE1heCA9IHJjU2Nyb2xsLnRvcDsKKyAgICBzSW5mby5mUGxhdGVXaWR0aCA9IEdldENsaWVudFJlY3QoKS5IZWlnaHQoKTsKKyAgICBzSW5mby5mU21hbGxTdGVwID0gMTMuMGY7CisgICAgc0luZm8uZkJpZ1N0ZXAgPSBzSW5mby5mUGxhdGVXaWR0aDsKKworICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExJTkZPLCBTQlRfVlNDUk9MTCwgKGludHB0cl90KSZzSW5mbyk7CisgIH0KIH0KIAotQ1BXTF9JY29uTGlzdF9Db250ZW50Ojp+Q1BXTF9JY29uTGlzdF9Db250ZW50KCkKLXsKK0ZYX0JPT0wgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgU2V0Rm9jdXMoKTsKKworICBTZXRDYXB0dXJlKCk7CisgIG1fYk1vdXNlRG93biA9IFRSVUU7CisKKyAgaW50MzJfdCBuSXRlbUluZGV4ID0gRmluZEl0ZW1JbmRleChwb2ludCk7CisgIFNldFNlbGVjdChuSXRlbUluZGV4KTsKKyAgU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOworCisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JZm9yIChpbnQzMl90IGk9MDsgaTxtX25MaXN0Q291bnQ7IGkrKykKLQl7Ci0JCUNQV0xfSWNvbkxpc3RfSXRlbSogcE5ld0l0ZW0gPSBuZXcgQ1BXTF9JY29uTGlzdF9JdGVtKCk7CitGWF9CT09MIENQV0xfSWNvbkxpc3RfQ29udGVudDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgbV9iTW91c2VEb3duID0gRkFMU0U7CisgIFJlbGVhc2VDYXB0dXJlKCk7CiAKLQkJUFdMX0NSRUFURVBBUkFNIGljcCA9IGNwOwotCQlpY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JCWljcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEUgfCBQV1NfTk9SRUZSRVNIQ0xJUDsKLQkJcE5ld0l0ZW0tPkNyZWF0ZShpY3ApOwotCX0KLQotCVNldEl0ZW1TcGFjZShQV0xfSWNvbkxpc3RfSVRFTV9TUEFDRSk7Ci0JUmVzZXRDb250ZW50KDApOwotCi0JaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQotCXsKLQkJQ1BERl9SZWN0IHJjU2Nyb2xsID0gR2V0U2Nyb2xsQXJlYSgpOwotCQlHZXRTY3JvbGxQb3MoKTsKLQotCQlQV0xfU0NST0xMX0lORk8gc0luZm87Ci0JCXNJbmZvLmZDb250ZW50TWluID0gcmNTY3JvbGwuYm90dG9tOwotCQlzSW5mby5mQ29udGVudE1heCA9IHJjU2Nyb2xsLnRvcDsKLQkJc0luZm8uZlBsYXRlV2lkdGggPSBHZXRDbGllbnRSZWN0KCkuSGVpZ2h0KCk7Ci0JCXNJbmZvLmZTbWFsbFN0ZXAgPSAxMy4wZjsKLQkJc0luZm8uZkJpZ1N0ZXAgPSBzSW5mby5mUGxhdGVXaWR0aDsKLQotCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMSU5GTywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmc0luZm8pOwotCX0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wJQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JU2V0Rm9jdXMoKTsKK0ZYX0JPT0wgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBpZiAobV9iTW91c2VEb3duKSB7CisgICAgaW50MzJfdCBuSXRlbUluZGV4ID0gRmluZEl0ZW1JbmRleChwb2ludCk7CisgICAgU2V0U2VsZWN0KG5JdGVtSW5kZXgpOworICAgIFNjcm9sbFRvSXRlbShuSXRlbUluZGV4KTsKKyAgfQogCi0JU2V0Q2FwdHVyZSgpOwotCW1fYk1vdXNlRG93biA9IFRSVUU7Ci0KLQlpbnQzMl90IG5JdGVtSW5kZXggPSBGaW5kSXRlbUluZGV4KHBvaW50KTsKLQlTZXRTZWxlY3Qobkl0ZW1JbmRleCk7Ci0JU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MCUNQV0xfSWNvbkxpc3RfQ29udGVudDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQltX2JNb3VzZURvd24gPSBGQUxTRTsKLQlSZWxlYXNlQ2FwdHVyZSgpOworRlhfQk9PTCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgeworICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSBGV0xfVktFWV9VcDoKKyAgICAgIGlmIChtX25TZWxlY3RJbmRleCA+IDApIHsKKyAgICAgICAgaW50MzJfdCBuSXRlbUluZGV4ID0gbV9uU2VsZWN0SW5kZXggLSAxOworICAgICAgICBTZXRTZWxlY3Qobkl0ZW1JbmRleCk7CisgICAgICAgIFNjcm9sbFRvSXRlbShuSXRlbUluZGV4KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICAgIGlmIChtX25TZWxlY3RJbmRleCA8IG1fbkxpc3RDb3VudCAtIDEpIHsKKyAgICAgICAgaW50MzJfdCBuSXRlbUluZGV4ID0gbV9uU2VsZWN0SW5kZXggKyAxOworICAgICAgICBTZXRTZWxlY3Qobkl0ZW1JbmRleCk7CisgICAgICAgIFNjcm9sbFRvSXRlbShuSXRlbUluZGV4KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBUUlVFOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENQV0xfSWNvbkxpc3RfQ29udGVudDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlpZiAobV9iTW91c2VEb3duKQotCXsKLQkJaW50MzJfdCBuSXRlbUluZGV4ID0gRmluZEl0ZW1JbmRleChwb2ludCk7Ci0JCVNldFNlbGVjdChuSXRlbUluZGV4KTsKLQkJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwotCX0KK2ludDMyX3QgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpGaW5kSXRlbUluZGV4KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGludDMyX3QgbkluZGV4ID0gMDsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICBDUERGX1JlY3QgcmNXbmQgPSBwQ2hpbGQtPkNoaWxkVG9QYXJlbnQocENoaWxkLT5HZXRXaW5kb3dSZWN0KCkpOwogCi0JcmV0dXJuIFRSVUU7CisgICAgICBpZiAocG9pbnQueSA8IHJjV25kLnRvcCkgeworICAgICAgICBuSW5kZXggPSBpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBuSW5kZXg7CiB9CiAKLUZYX0JPT0wJQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCi17Ci0Jc3dpdGNoIChuQ2hhcikKLQl7Ci0JY2FzZSBGV0xfVktFWV9VcDoKLQkJaWYgKG1fblNlbGVjdEluZGV4ID4gMCkKLQkJewotCQkJaW50MzJfdCBuSXRlbUluZGV4ID0gbV9uU2VsZWN0SW5kZXggLSAxOwotCQkJU2V0U2VsZWN0KG5JdGVtSW5kZXgpOwotCQkJU2Nyb2xsVG9JdGVtKG5JdGVtSW5kZXgpOwotCQl9Ci0JCXJldHVybiBUUlVFOwotCWNhc2UgRldMX1ZLRVlfRG93bjoKLQkJaWYgKG1fblNlbGVjdEluZGV4IDwgbV9uTGlzdENvdW50LTEpCi0JCXsKLQkJCWludDMyX3Qgbkl0ZW1JbmRleCA9IG1fblNlbGVjdEluZGV4ICsgMTsKLQkJCVNldFNlbGVjdChuSXRlbUluZGV4KTsKLQkJCVNjcm9sbFRvSXRlbShuSXRlbUluZGV4KTsKLQkJfQotCQlyZXR1cm4gVFJVRTsKLQl9Cit2b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2Nyb2xsVG9JdGVtKGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKLQlyZXR1cm4gRkFMU0U7CisgIGlmIChDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gR2V0TGlzdEl0ZW0obkl0ZW1JbmRleCkpIHsKKyAgICBDUERGX1JlY3QgcmNPcmlnaW4gPSBwSXRlbS0+R2V0V2luZG93UmVjdCgpOworICAgIENQREZfUmVjdCByY1duZCA9IHBJdGVtLT5DaGlsZFRvUGFyZW50KHJjT3JpZ2luKTsKKworICAgIGlmICghKHJjV25kLmJvdHRvbSA+IHJjQ2xpZW50LmJvdHRvbSAmJiByY1duZC50b3AgPCByY0NsaWVudC50b3ApKSB7CisgICAgICBDUERGX1BvaW50IHB0U2Nyb2xsID0gR2V0U2Nyb2xsUG9zKCk7CisKKyAgICAgIGlmIChyY1duZC50b3AgPiByY0NsaWVudC50b3ApIHsKKyAgICAgICAgcHRTY3JvbGwueSA9IHJjT3JpZ2luLnRvcDsKKyAgICAgIH0gZWxzZSBpZiAocmNXbmQuYm90dG9tIDwgcmNDbGllbnQuYm90dG9tKSB7CisgICAgICAgIHB0U2Nyb2xsLnkgPSByY09yaWdpbi5ib3R0b20gKyByY0NsaWVudC5IZWlnaHQoKTsKKyAgICAgIH0KKworICAgICAgU2V0U2Nyb2xsUG9zKHB0U2Nyb2xsKTsKKyAgICAgIFJlc2V0RmFjZSgpOworICAgICAgSW52YWxpZGF0ZVJlY3QoKTsKKyAgICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpJnB0U2Nyb2xsLnkpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi1pbnQzMl90IENQV0xfSWNvbkxpc3RfQ29udGVudDo6RmluZEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlpbnQzMl90IG5JbmRleCA9IDA7Ci0JZm9yIChpbnQzMl90IGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotCQl7Ci0JCQlDUERGX1JlY3QgcmNXbmQgPSBwQ2hpbGQtPkNoaWxkVG9QYXJlbnQocENoaWxkLT5HZXRXaW5kb3dSZWN0KCkpOwordm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNldFNlbGVjdChpbnQzMl90IG5JbmRleCkgeworICBpZiAobV9uU2VsZWN0SW5kZXggIT0gbkluZGV4KSB7CisgICAgU2VsZWN0SXRlbShtX25TZWxlY3RJbmRleCwgRkFMU0UpOworICAgIFNlbGVjdEl0ZW0obkluZGV4LCBUUlVFKTsKKyAgICBtX25TZWxlY3RJbmRleCA9IG5JbmRleDsKIAotCQkJaWYgKHBvaW50LnkgPCByY1duZC50b3ApCi0JCQl7Ci0JCQkJbkluZGV4ID0gaTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBuSW5kZXg7CisgICAgaWYgKElQV0xfSWNvbkxpc3RfTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90aWZ5KCkpCisgICAgICBwTm90aWZ5LT5Pbk5vdGVMaXN0U2VsQ2hhbmdlZChuSW5kZXgpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpTY3JvbGxUb0l0ZW0oaW50MzJfdCBuSXRlbUluZGV4KQotewotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotCWlmIChDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gR2V0TGlzdEl0ZW0obkl0ZW1JbmRleCkpCi0JewotCQlDUERGX1JlY3QgcmNPcmlnaW4gPSBwSXRlbS0+R2V0V2luZG93UmVjdCgpOwotCQlDUERGX1JlY3QgcmNXbmQgPSBwSXRlbS0+Q2hpbGRUb1BhcmVudChyY09yaWdpbik7Ci0KLQkJaWYgKCEocmNXbmQuYm90dG9tID4gcmNDbGllbnQuYm90dG9tICYmIHJjV25kLnRvcCA8IHJjQ2xpZW50LnRvcCkpCi0JCXsKLQkJCUNQREZfUG9pbnQgcHRTY3JvbGwgPSBHZXRTY3JvbGxQb3MoKTsKLQotCQkJaWYgKHJjV25kLnRvcCA+IHJjQ2xpZW50LnRvcCkKLQkJCXsKLQkJCQlwdFNjcm9sbC55ID0gcmNPcmlnaW4udG9wOwotCQkJfQotCQkJZWxzZSBpZiAocmNXbmQuYm90dG9tIDwgcmNDbGllbnQuYm90dG9tKQotCQkJewotCQkJCXB0U2Nyb2xsLnkgPSByY09yaWdpbi5ib3R0b20gKyByY0NsaWVudC5IZWlnaHQoKTsKLQkJCX0KLQotCQkJU2V0U2Nyb2xsUG9zKHB0U2Nyb2xsKTsKLQkJCVJlc2V0RmFjZSgpOwotCQkJSW52YWxpZGF0ZVJlY3QoKTsKLQkJCWlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQotCQkJewotCQkJCXBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLCAoaW50cHRyX3QpJnB0U2Nyb2xsLnkpOwotCQkJfQotCQl9Ci0JfQoraW50MzJfdCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OkdldFNlbGVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fblNlbGVjdEluZGV4OwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2V0U2VsZWN0KGludDMyX3QgbkluZGV4KQotewotCWlmIChtX25TZWxlY3RJbmRleCAhPSBuSW5kZXgpCi0JewotCQlTZWxlY3RJdGVtKG1fblNlbGVjdEluZGV4LCBGQUxTRSk7Ci0JCVNlbGVjdEl0ZW0obkluZGV4LCBUUlVFKTsKLQkJbV9uU2VsZWN0SW5kZXggPSBuSW5kZXg7Ci0KLQkJaWYgKElQV0xfSWNvbkxpc3RfTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90aWZ5KCkpCi0JCQlwTm90aWZ5LT5Pbk5vdGVMaXN0U2VsQ2hhbmdlZChuSW5kZXgpOwotCX0KK0lQV0xfSWNvbkxpc3RfTm90aWZ5KiBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OkdldE5vdGlmeSgpIGNvbnN0IHsKKyAgaWYgKG1fYkVuYWJsZU5vdGlmeSkKKyAgICByZXR1cm4gbV9wTm90aWZ5OworICByZXR1cm4gTlVMTDsKIH0KIAotaW50MzJfdCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OkdldFNlbGVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fblNlbGVjdEluZGV4Owordm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNldE5vdGlmeShJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSkgeworICBtX3BOb3RpZnkgPSBwTm90aWZ5OwogfQogCi1JUFdMX0ljb25MaXN0X05vdGlmeSogQ1BXTF9JY29uTGlzdF9Db250ZW50OjpHZXROb3RpZnkoKSBjb25zdAotewotCWlmIChtX2JFbmFibGVOb3RpZnkpCi0JCXJldHVybiBtX3BOb3RpZnk7Ci0JcmV0dXJuIE5VTEw7Cit2b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkgeworICBtX2JFbmFibGVOb3RpZnkgPSBiTm90aWZ5OwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2V0Tm90aWZ5KElQV0xfSWNvbkxpc3RfTm90aWZ5KiBwTm90aWZ5KQotewotCW1fcE5vdGlmeSA9IHBOb3RpZnk7Cit2b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2VsZWN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdCkgeworICBpZiAoQ1BXTF9JY29uTGlzdF9JdGVtKiBwSXRlbSA9IEdldExpc3RJdGVtKG5JdGVtSW5kZXgpKSB7CisgICAgcEl0ZW0tPlNldFNlbGVjdChiU2VsZWN0KTsKKyAgICBwSXRlbS0+SW52YWxpZGF0ZVJlY3QoKTsKKyAgfQogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkKLXsKLQltX2JFbmFibGVOb3RpZnkgPSBiTm90aWZ5OworQ1BXTF9JY29uTGlzdF9JdGVtKiBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OkdldExpc3RJdGVtKAorICAgIGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QgeworICBpZiAobkl0ZW1JbmRleCA+PSAwICYmIG5JdGVtSW5kZXggPCBtX2FDaGlsZHJlbi5HZXRTaXplKCkpIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KG5JdGVtSW5kZXgpKSB7CisgICAgICBpZiAocENoaWxkLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9JY29uTGlzdF9JdGVtIikgeworICAgICAgICByZXR1cm4gKENQV0xfSWNvbkxpc3RfSXRlbSopcENoaWxkOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2VsZWN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdCkKLXsKLQlpZiAoQ1BXTF9JY29uTGlzdF9JdGVtKiBwSXRlbSA9IEdldExpc3RJdGVtKG5JdGVtSW5kZXgpKQotCXsKLQkJcEl0ZW0tPlNldFNlbGVjdChiU2VsZWN0KTsKLQkJcEl0ZW0tPkludmFsaWRhdGVSZWN0KCk7Ci0JfQordm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNldExpc3REYXRhKGludDMyX3Qgbkl0ZW1JbmRleCwgdm9pZCogcERhdGEpIHsKKyAgaWYgKENQV0xfSWNvbkxpc3RfSXRlbSogcEl0ZW0gPSBHZXRMaXN0SXRlbShuSXRlbUluZGV4KSkKKyAgICBwSXRlbS0+U2V0RGF0YShwRGF0YSk7CiB9CiAKLUNQV0xfSWNvbkxpc3RfSXRlbSogQ1BXTF9JY29uTGlzdF9Db250ZW50OjpHZXRMaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0Ci17Ci0JaWYgKG5JdGVtSW5kZXggPj0gMCAmJiBuSXRlbUluZGV4PG1fYUNoaWxkcmVuLkdldFNpemUoKSkKLQl7Ci0JCWlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KG5JdGVtSW5kZXgpKQotCQl7Ci0JCQlpZiAocENoaWxkLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9JY29uTGlzdF9JdGVtIikKLQkJCXsKLQkJCQlyZXR1cm4gKENQV0xfSWNvbkxpc3RfSXRlbSopcENoaWxkOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIE5VTEw7Cit2b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2V0TGlzdEljb24oaW50MzJfdCBuSXRlbUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkljb25JbmRleCkgeworICBpZiAoQ1BXTF9JY29uTGlzdF9JdGVtKiBwSXRlbSA9IEdldExpc3RJdGVtKG5JdGVtSW5kZXgpKQorICAgIHBJdGVtLT5TZXRJY29uKG5JY29uSW5kZXgpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2V0TGlzdERhdGEoaW50MzJfdCBuSXRlbUluZGV4LCB2b2lkKiBwRGF0YSkKLXsKLQlpZiAoQ1BXTF9JY29uTGlzdF9JdGVtKiBwSXRlbSA9IEdldExpc3RJdGVtKG5JdGVtSW5kZXgpKQotCQlwSXRlbS0+U2V0RGF0YShwRGF0YSk7Cit2b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2V0TGlzdFN0cmluZyhpbnQzMl90IG5JdGVtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSB7CisgIGlmIChDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gR2V0TGlzdEl0ZW0obkl0ZW1JbmRleCkpCisgICAgcEl0ZW0tPlNldFRleHQoc3RyKTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNldExpc3RJY29uKGludDMyX3Qgbkl0ZW1JbmRleCwgaW50MzJfdCBuSWNvbkluZGV4KQotewotCWlmIChDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gR2V0TGlzdEl0ZW0obkl0ZW1JbmRleCkpCi0JCXBJdGVtLT5TZXRJY29uKG5JY29uSW5kZXgpOworQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpHZXRMaXN0U3RyaW5nKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QgeworICBpZiAoQ1BXTF9JY29uTGlzdF9JdGVtKiBwSXRlbSA9IEdldExpc3RJdGVtKG5JdGVtSW5kZXgpKQorICAgIHJldHVybiBwSXRlbS0+R2V0VGV4dCgpOworCisgIHJldHVybiBMIiI7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpTZXRMaXN0U3RyaW5nKGludDMyX3Qgbkl0ZW1JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLXsKLQlpZiAoQ1BXTF9JY29uTGlzdF9JdGVtKiBwSXRlbSA9IEdldExpc3RJdGVtKG5JdGVtSW5kZXgpKQotCQlwSXRlbS0+U2V0VGV4dChzdHIpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OkdldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdAotewotCWlmIChDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gR2V0TGlzdEl0ZW0obkl0ZW1JbmRleCkpCi0JCXJldHVybiBwSXRlbS0+R2V0VGV4dCgpOwotCi0JcmV0dXJuIEwiIjsKLX0KLQotdm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNldEljb25GaWxsQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0JZm9yIChpbnQzMl90IGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotCQl7Ci0JCQlpZiAocENoaWxkLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9JY29uTGlzdF9JdGVtIikKLQkJCXsKLQkJCQlDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gKENQV0xfSWNvbkxpc3RfSXRlbSopcENoaWxkOwotCQkJCXBJdGVtLT5TZXRJY29uRmlsbENvbG9yKGNvbG9yKTsKLQkJCQlwSXRlbS0+SW52YWxpZGF0ZVJlY3QoKTsKLQkJCX0KLQkJfQotCX0KLQordm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNldEljb25GaWxsQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICBpZiAocENoaWxkLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9JY29uTGlzdF9JdGVtIikgeworICAgICAgICBDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gKENQV0xfSWNvbkxpc3RfSXRlbSopcENoaWxkOworICAgICAgICBwSXRlbS0+U2V0SWNvbkZpbGxDb2xvcihjb2xvcik7CisgICAgICAgIHBJdGVtLT5JbnZhbGlkYXRlUmVjdCgpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0ljb25MaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX0ljb25MaXN0OjpDUFdMX0ljb25MaXN0KGludDMyX3Qgbkxpc3RDb3VudCkgOgotCW1fcExpc3RDb250ZW50KE5VTEwpLAotCW1fbkxpc3RDb3VudChuTGlzdENvdW50KQoteworQ1BXTF9JY29uTGlzdDo6Q1BXTF9JY29uTGlzdChpbnQzMl90IG5MaXN0Q291bnQpCisgICAgOiBtX3BMaXN0Q29udGVudChOVUxMKSwgbV9uTGlzdENvdW50KG5MaXN0Q291bnQpIHt9CisKK0NQV0xfSWNvbkxpc3Q6On5DUFdMX0ljb25MaXN0KCkge30KKwordm9pZCBDUFdMX0ljb25MaXN0OjpSZVBvc0NoaWxkV25kKCkgeworICBDUFdMX1duZDo6UmVQb3NDaGlsZFduZCgpOworCisgIGlmIChtX3BMaXN0Q29udGVudCkKKyAgICBtX3BMaXN0Q29udGVudC0+TW92ZShHZXRDbGllbnRSZWN0KCksIFRSVUUsIEZBTFNFKTsKIH0KIAotQ1BXTF9JY29uTGlzdDo6fkNQV0xfSWNvbkxpc3QoKQotewordm9pZCBDUFdMX0ljb25MaXN0OjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIG1fcExpc3RDb250ZW50ID0gbmV3IENQV0xfSWNvbkxpc3RfQ29udGVudChtX25MaXN0Q291bnQpOworCisgIFBXTF9DUkVBVEVQQVJBTSBjY3AgPSBjcDsKKyAgY2NwLnBQYXJlbnRXbmQgPSB0aGlzOworICBjY3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFOworICBtX3BMaXN0Q29udGVudC0+Q3JlYXRlKGNjcCk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdDo6UmVQb3NDaGlsZFduZCgpCi17Ci0JQ1BXTF9XbmQ6OlJlUG9zQ2hpbGRXbmQoKTsKLQotCWlmIChtX3BMaXN0Q29udGVudCkKLQkJbV9wTGlzdENvbnRlbnQtPk1vdmUoR2V0Q2xpZW50UmVjdCgpLCBUUlVFLCBGQUxTRSk7Cit2b2lkIENQV0xfSWNvbkxpc3Q6Ok9uQ3JlYXRlZCgpIHsKKyAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0gR2V0VlNjcm9sbEJhcigpKSB7CisgICAgcFNjcm9sbEJhci0+UmVtb3ZlRmxhZyhQV1NfQVVUT1RSQU5TUEFSRU5UKTsKKyAgICBwU2Nyb2xsQmFyLT5TZXRUcmFuc3BhcmVuY3koMjU1KTsKKyAgICBwU2Nyb2xsQmFyLT5TZXROb3RpZnlGb3JldmVyKFRSVUUpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JbV9wTGlzdENvbnRlbnQgPSBuZXcgQ1BXTF9JY29uTGlzdF9Db250ZW50KG1fbkxpc3RDb3VudCk7Cit2b2lkIENQV0xfSWNvbkxpc3Q6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7CisgIENQV0xfV25kOjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKIAotCVBXTF9DUkVBVEVQQVJBTSBjY3AgPSBjcDsKLQljY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JY2NwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRTsKLQltX3BMaXN0Q29udGVudC0+Q3JlYXRlKGNjcCk7CisgIGlmICh3UGFyYW0gPT0gU0JUX1ZTQ1JPTEwpIHsKKyAgICBzd2l0Y2ggKG1zZykgeworICAgICAgY2FzZSBQTk1fU0VUU0NST0xMSU5GTzoKKyAgICAgICAgaWYgKFBXTF9TQ1JPTExfSU5GTyogcEluZm8gPSAoUFdMX1NDUk9MTF9JTkZPKilsUGFyYW0pIHsKKyAgICAgICAgICBpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKKyAgICAgICAgICAgIGlmIChwSW5mby0+ZkNvbnRlbnRNYXggLSBwSW5mby0+ZkNvbnRlbnRNaW4gPiBwSW5mby0+ZlBsYXRlV2lkdGgpIHsKKyAgICAgICAgICAgICAgaWYgKCFwU2Nyb2xsQmFyLT5Jc1Zpc2libGUoKSkgeworICAgICAgICAgICAgICAgIHBTY3JvbGxCYXItPlNldFZpc2libGUoVFJVRSk7CisgICAgICAgICAgICAgICAgUmVQb3NDaGlsZFduZCgpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAocFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBwU2Nyb2xsQmFyLT5TZXRWaXNpYmxlKEZBTFNFKTsKKyAgICAgICAgICAgICAgICBSZVBvc0NoaWxkV25kKCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAobV9wTGlzdENvbnRlbnQpCisgICAgICAgICAgICAgICAgbV9wTGlzdENvbnRlbnQtPlNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAuMGYsIDAuMGYpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcFNjcm9sbEJhci0+T25Ob3RpZnkocFduZCwgUE5NX1NFVFNDUk9MTElORk8sIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBQTk1fU0NST0xMV0lORE9XOgorICAgICAgICBpZiAobV9wTGlzdENvbnRlbnQpIHsKKyAgICAgICAgICBtX3BMaXN0Q29udGVudC0+U2V0U2Nyb2xsUG9zKENQREZfUG9pbnQoMC4wZiwgKihGWF9GTE9BVCopbFBhcmFtKSk7CisgICAgICAgICAgbV9wTGlzdENvbnRlbnQtPlJlc2V0RmFjZSgpOworICAgICAgICAgIG1fcExpc3RDb250ZW50LT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICBjYXNlIFBOTV9TRVRTQ1JPTExQT1M6CisgICAgICAgIGlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbEJhciA9IEdldFZTY3JvbGxCYXIoKSkKKyAgICAgICAgICBwU2Nyb2xsQmFyLT5Pbk5vdGlmeShwV25kLCBQTk1fU0VUU0NST0xMUE9TLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0OjpPbkNyZWF0ZWQoKQotewotCWlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbEJhciA9IEdldFZTY3JvbGxCYXIoKSkKLQl7Ci0JCXBTY3JvbGxCYXItPlJlbW92ZUZsYWcoUFdTX0FVVE9UUkFOU1BBUkVOVCk7Ci0JCXBTY3JvbGxCYXItPlNldFRyYW5zcGFyZW5jeSgyNTUpOwotCQlwU2Nyb2xsQmFyLT5TZXROb3RpZnlGb3JldmVyKFRSVUUpOwotCX0KK3ZvaWQgQ1BXTF9JY29uTGlzdDo6U2V0U2VsZWN0KGludDMyX3QgbkluZGV4KSB7CisgIG1fcExpc3RDb250ZW50LT5TZXRTZWxlY3QobkluZGV4KTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0OjpPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0sIGludHB0cl90IGxQYXJhbSkKLXsKLQlDUFdMX1duZDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7Ci0KLQlpZiAod1BhcmFtID09IFNCVF9WU0NST0xMKQotCXsKLQkJc3dpdGNoIChtc2cpCi0JCXsKLQkJY2FzZSBQTk1fU0VUU0NST0xMSU5GTzoKLQkJCWlmIChQV0xfU0NST0xMX0lORk8qIHBJbmZvID0gKFBXTF9TQ1JPTExfSU5GTyopbFBhcmFtKQotCQkJewotCQkJCWlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbEJhciA9IEdldFZTY3JvbGxCYXIoKSkKLQkJCQl7Ci0JCQkJCWlmIChwSW5mby0+ZkNvbnRlbnRNYXggLSBwSW5mby0+ZkNvbnRlbnRNaW4gPiBwSW5mby0+ZlBsYXRlV2lkdGgpCi0JCQkJCXsKLQkJCQkJCWlmICghcFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpCi0JCQkJCQl7Ci0JCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShUUlVFKTsKLQkJCQkJCQlSZVBvc0NoaWxkV25kKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlpZiAocFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpCi0JCQkJCQl7Ci0JCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShGQUxTRSk7Ci0JCQkJCQkJUmVQb3NDaGlsZFduZCgpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobV9wTGlzdENvbnRlbnQpCi0JCQkJCQkJbV9wTGlzdENvbnRlbnQtPlNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAuMGYsMC4wZikpOwotCQkJCQl9Ci0KLQkJCQkJcFNjcm9sbEJhci0+T25Ob3RpZnkocFduZCxQTk1fU0VUU0NST0xMSU5GTyx3UGFyYW0sbFBhcmFtKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCWNhc2UgUE5NX1NDUk9MTFdJTkRPVzoKLQkJCWlmIChtX3BMaXN0Q29udGVudCkKLQkJCXsKLQkJCQltX3BMaXN0Q29udGVudC0+U2V0U2Nyb2xsUG9zKENQREZfUG9pbnQoMC4wZiwgKihGWF9GTE9BVCopbFBhcmFtKSk7Ci0JCQkJbV9wTGlzdENvbnRlbnQtPlJlc2V0RmFjZSgpOwotCQkJCW1fcExpc3RDb250ZW50LT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBQTk1fU0VUU0NST0xMUE9TOgotCQkJaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0gR2V0VlNjcm9sbEJhcigpKQotCQkJCXBTY3JvbGxCYXItPk9uTm90aWZ5KHBXbmQsUE5NX1NFVFNDUk9MTFBPUyx3UGFyYW0sbFBhcmFtKTsKLQkJCXJldHVybjsKLQkJfQotCX0KK3ZvaWQgQ1BXTF9JY29uTGlzdDo6U2V0VG9wSXRlbShpbnQzMl90IG5JbmRleCkgeworICBtX3BMaXN0Q29udGVudC0+U2Nyb2xsVG9JdGVtKG5JbmRleCk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdDo6U2V0U2VsZWN0KGludDMyX3QgbkluZGV4KQotewotCW1fcExpc3RDb250ZW50LT5TZXRTZWxlY3QobkluZGV4KTsKK2ludDMyX3QgQ1BXTF9JY29uTGlzdDo6R2V0U2VsZWN0KCkgY29uc3QgeworICByZXR1cm4gbV9wTGlzdENvbnRlbnQtPkdldFNlbGVjdCgpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3Q6OlNldFRvcEl0ZW0oaW50MzJfdCBuSW5kZXgpCi17Ci0JbV9wTGlzdENvbnRlbnQtPlNjcm9sbFRvSXRlbShuSW5kZXgpOwordm9pZCBDUFdMX0ljb25MaXN0OjpTZXROb3RpZnkoSVBXTF9JY29uTGlzdF9Ob3RpZnkqIHBOb3RpZnkpIHsKKyAgbV9wTGlzdENvbnRlbnQtPlNldE5vdGlmeShwTm90aWZ5KTsKIH0KIAotaW50MzJfdCBDUFdMX0ljb25MaXN0OjpHZXRTZWxlY3QoKSBjb25zdAotewotCXJldHVybiBtX3BMaXN0Q29udGVudC0+R2V0U2VsZWN0KCk7Cit2b2lkIENQV0xfSWNvbkxpc3Q6OkVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpIHsKKyAgbV9wTGlzdENvbnRlbnQtPkVuYWJsZU5vdGlmeShiTm90aWZ5KTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0OjpTZXROb3RpZnkoSVBXTF9JY29uTGlzdF9Ob3RpZnkqIHBOb3RpZnkpCi17Ci0JbV9wTGlzdENvbnRlbnQtPlNldE5vdGlmeShwTm90aWZ5KTsKK3ZvaWQgQ1BXTF9JY29uTGlzdDo6U2V0TGlzdERhdGEoaW50MzJfdCBuSXRlbUluZGV4LCB2b2lkKiBwRGF0YSkgeworICBtX3BMaXN0Q29udGVudC0+U2V0TGlzdERhdGEobkl0ZW1JbmRleCwgcERhdGEpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3Q6OkVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpCi17Ci0JbV9wTGlzdENvbnRlbnQtPkVuYWJsZU5vdGlmeShiTm90aWZ5KTsKK3ZvaWQgQ1BXTF9JY29uTGlzdDo6U2V0TGlzdEljb24oaW50MzJfdCBuSXRlbUluZGV4LCBpbnQzMl90IG5JY29uSW5kZXgpIHsKKyAgbV9wTGlzdENvbnRlbnQtPlNldExpc3RJY29uKG5JdGVtSW5kZXgsIG5JY29uSW5kZXgpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3Q6OlNldExpc3REYXRhKGludDMyX3Qgbkl0ZW1JbmRleCwgdm9pZCogcERhdGEpCi17Ci0JbV9wTGlzdENvbnRlbnQtPlNldExpc3REYXRhKG5JdGVtSW5kZXgsIHBEYXRhKTsKK3ZvaWQgQ1BXTF9JY29uTGlzdDo6U2V0TGlzdFN0cmluZyhpbnQzMl90IG5JdGVtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgeworICBtX3BMaXN0Q29udGVudC0+U2V0TGlzdFN0cmluZyhuSXRlbUluZGV4LCBzdHIpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3Q6OlNldExpc3RJY29uKGludDMyX3Qgbkl0ZW1JbmRleCwgaW50MzJfdCBuSWNvbkluZGV4KQotewotCW1fcExpc3RDb250ZW50LT5TZXRMaXN0SWNvbihuSXRlbUluZGV4LCBuSWNvbkluZGV4KTsKK0NGWF9XaWRlU3RyaW5nIENQV0xfSWNvbkxpc3Q6OkdldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdCB7CisgIHJldHVybiBtX3BMaXN0Q29udGVudC0+R2V0TGlzdFN0cmluZyhuSXRlbUluZGV4KTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0OjpTZXRMaXN0U3RyaW5nKGludDMyX3Qgbkl0ZW1JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLXsKLQltX3BMaXN0Q29udGVudC0+U2V0TGlzdFN0cmluZyhuSXRlbUluZGV4LCBzdHIpOwordm9pZCBDUFdMX0ljb25MaXN0OjpTZXRJY29uRmlsbENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIG1fcExpc3RDb250ZW50LT5TZXRJY29uRmlsbENvbG9yKGNvbG9yKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9JY29uTGlzdDo6R2V0TGlzdFN0cmluZyhpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fcExpc3RDb250ZW50LT5HZXRMaXN0U3RyaW5nKG5JdGVtSW5kZXgpOworRlhfQk9PTCBDUFdMX0ljb25MaXN0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBDUERGX1BvaW50IHB0U2Nyb2xsID0gbV9wTGlzdENvbnRlbnQtPkdldFNjcm9sbFBvcygpOworICBDUERGX1JlY3QgcmNTY3JvbGwgPSBtX3BMaXN0Q29udGVudC0+R2V0U2Nyb2xsQXJlYSgpOworICBDUERGX1JlY3QgcmNDb250ZW50cyA9IG1fcExpc3RDb250ZW50LT5HZXRDbGllbnRSZWN0KCk7CisKKyAgaWYgKHJjU2Nyb2xsLnRvcCAtIHJjU2Nyb2xsLmJvdHRvbSA+IHJjQ29udGVudHMuSGVpZ2h0KCkpIHsKKyAgICBDUERGX1BvaW50IHB0TmV3ID0gcHRTY3JvbGw7CisKKyAgICBpZiAoekRlbHRhID4gMCkKKyAgICAgIHB0TmV3LnkgKz0gMzA7CisgICAgZWxzZQorICAgICAgcHROZXcueSAtPSAzMDsKKworICAgIGlmIChwdE5ldy55ID4gcmNTY3JvbGwudG9wKQorICAgICAgcHROZXcueSA9IHJjU2Nyb2xsLnRvcDsKKyAgICBpZiAocHROZXcueSA8IHJjU2Nyb2xsLmJvdHRvbSArIHJjQ29udGVudHMuSGVpZ2h0KCkpCisgICAgICBwdE5ldy55ID0gcmNTY3JvbGwuYm90dG9tICsgcmNDb250ZW50cy5IZWlnaHQoKTsKKyAgICBpZiAocHROZXcueSA8IHJjU2Nyb2xsLmJvdHRvbSkKKyAgICAgIHB0TmV3LnkgPSByY1Njcm9sbC5ib3R0b207CisKKyAgICBpZiAocHROZXcueSAhPSBwdFNjcm9sbC55KSB7CisgICAgICBtX3BMaXN0Q29udGVudC0+U2V0U2Nyb2xsUG9zKHB0TmV3KTsKKyAgICAgIG1fcExpc3RDb250ZW50LT5SZXNldEZhY2UoKTsKKyAgICAgIG1fcExpc3RDb250ZW50LT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKKworICAgICAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0gR2V0VlNjcm9sbEJhcigpKQorICAgICAgICBwU2Nyb2xsQmFyLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMUE9TLCBTQlRfVlNDUk9MTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludHB0cl90KSZwdE5ldy55KTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQotCi12b2lkIENQV0xfSWNvbkxpc3Q6OlNldEljb25GaWxsQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0JbV9wTGlzdENvbnRlbnQtPlNldEljb25GaWxsQ29sb3IoY29sb3IpOwotfQotCi1GWF9CT09MCUNQV0xfSWNvbkxpc3Q6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BERl9Qb2ludCBwdFNjcm9sbCA9IG1fcExpc3RDb250ZW50LT5HZXRTY3JvbGxQb3MoKTsKLQlDUERGX1JlY3QgcmNTY3JvbGwgPSBtX3BMaXN0Q29udGVudC0+R2V0U2Nyb2xsQXJlYSgpOwotCUNQREZfUmVjdCByY0NvbnRlbnRzID0gbV9wTGlzdENvbnRlbnQtPkdldENsaWVudFJlY3QoKTsKLQotCWlmIChyY1Njcm9sbC50b3AgLSByY1Njcm9sbC5ib3R0b20gPiByY0NvbnRlbnRzLkhlaWdodCgpKQotCXsKLQkJQ1BERl9Qb2ludCBwdE5ldyA9IHB0U2Nyb2xsOwotCi0JCWlmICh6RGVsdGEgPiAwKQotCQkJcHROZXcueSArPSAzMDsKLQkJZWxzZQotCQkJcHROZXcueSAtPSAzMDsKLQotCQlpZiAocHROZXcueSA+IHJjU2Nyb2xsLnRvcCkKLQkJCXB0TmV3LnkgPSByY1Njcm9sbC50b3A7Ci0JCWlmIChwdE5ldy55IDwgcmNTY3JvbGwuYm90dG9tICsgcmNDb250ZW50cy5IZWlnaHQoKSkKLQkJCXB0TmV3LnkgPSByY1Njcm9sbC5ib3R0b20gKyByY0NvbnRlbnRzLkhlaWdodCgpOwotCQlpZiAocHROZXcueSA8IHJjU2Nyb2xsLmJvdHRvbSkKLQkJCXB0TmV3LnkgPSByY1Njcm9sbC5ib3R0b207Ci0KLQkJaWYgKHB0TmV3LnkgIT0gcHRTY3JvbGwueSkKLQkJewotCQkJbV9wTGlzdENvbnRlbnQtPlNldFNjcm9sbFBvcyhwdE5ldyk7Ci0JCQltX3BMaXN0Q29udGVudC0+UmVzZXRGYWNlKCk7Ci0JCQltX3BMaXN0Q29udGVudC0+SW52YWxpZGF0ZVJlY3QoTlVMTCk7Ci0KLQkJCWlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbEJhciA9IEdldFZTY3JvbGxCYXIoKSkKLQkJCQlwU2Nyb2xsQmFyLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMUE9TLCBTQlRfVlNDUk9MTCwgKGludHB0cl90KSZwdE5ldy55KTsKLQotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGFiZWwuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MYWJlbC5jcHAKaW5kZXggZTE3ODBjNi4uNzk3MjcwZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MYWJlbC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MYWJlbC5jcHAKQEAgLTExLDE3NyArMTEsMTQ0IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9MYWJlbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9MYWJlbDo6Q1BXTF9MYWJlbCgpIDogbV9wRWRpdChOVUxMKQotewotCW1fcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpOworQ1BXTF9MYWJlbDo6Q1BXTF9MYWJlbCgpIDogbV9wRWRpdChOVUxMKSB7CisgIG1fcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpOwogCi0JQVNTRVJUKG1fcEVkaXQgIT0gTlVMTCk7CisgIEFTU0VSVChtX3BFZGl0ICE9IE5VTEwpOwogfQogCi1DUFdMX0xhYmVsOjp+Q1BXTF9MYWJlbCgpCi17Ci0JSUZYX0VkaXQ6OkRlbEVkaXQobV9wRWRpdCk7CitDUFdMX0xhYmVsOjp+Q1BXTF9MYWJlbCgpIHsKKyAgSUZYX0VkaXQ6OkRlbEVkaXQobV9wRWRpdCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfTGFiZWw6OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICJDUFdMX0xhYmVsIjsKK0NGWF9CeXRlU3RyaW5nIENQV0xfTGFiZWw6OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJDUFdMX0xhYmVsIjsKIH0KIAotdm9pZCBDUFdMX0xhYmVsOjpPbkNyZWF0ZWQoKQotewotCVNldFBhcmFtQnlGbGFnKCk7Ci0JU2V0Rm9udFNpemUoR2V0Q3JlYXRpb25QYXJhbSgpLmZGb250U2l6ZSk7Cit2b2lkIENQV0xfTGFiZWw6Ok9uQ3JlYXRlZCgpIHsKKyAgU2V0UGFyYW1CeUZsYWcoKTsKKyAgU2V0Rm9udFNpemUoR2V0Q3JlYXRpb25QYXJhbSgpLmZGb250U2l6ZSk7CiAKLQltX3BFZGl0LT5TZXRGb250TWFwKEdldEZvbnRNYXAoKSk7Ci0JbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOworICBtX3BFZGl0LT5TZXRGb250TWFwKEdldEZvbnRNYXAoKSk7CisgIG1fcEVkaXQtPkluaXRpYWxpemUoKTsKIAotCWlmIChIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKQotCXsKLQkJU2V0Q2xpcFJlY3QoQ1BERl9SZWN0KDAuMGYsMC4wZiwwLjBmLDAuMGYpKTsKLQkJbV9wRWRpdC0+U2V0VGV4dE92ZXJmbG93KFRSVUUpOwotCX0KKyAgaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpIHsKKyAgICBTZXRDbGlwUmVjdChDUERGX1JlY3QoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOworICAgIG1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyhUUlVFKTsKKyAgfQogfQogCi12b2lkIENQV0xfTGFiZWw6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCkKLXsKLQltX3BFZGl0LT5TZXRUZXh0KGNzVGV4dCk7Cit2b2lkIENQV0xfTGFiZWw6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCkgeworICBtX3BFZGl0LT5TZXRUZXh0KGNzVGV4dCk7CiB9CiAKLXZvaWQgQ1BXTF9MYWJlbDo6UmVQb3NDaGlsZFduZCgpCi17Ci0JbV9wRWRpdC0+U2V0UGxhdGVSZWN0KEdldENsaWVudFJlY3QoKSk7Cit2b2lkIENQV0xfTGFiZWw6OlJlUG9zQ2hpbGRXbmQoKSB7CisgIG1fcEVkaXQtPlNldFBsYXRlUmVjdChHZXRDbGllbnRSZWN0KCkpOwogfQogCi12b2lkIENQV0xfTGFiZWw6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkKLXsKLQltX3BFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwordm9pZCBDUFdMX0xhYmVsOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsKKyAgbV9wRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIH0KIAotRlhfRkxPQVQgQ1BXTF9MYWJlbDo6R2V0Rm9udFNpemUoKSBjb25zdAotewotCXJldHVybiBtX3BFZGl0LT5HZXRGb250U2l6ZSgpOworRlhfRkxPQVQgQ1BXTF9MYWJlbDo6R2V0Rm9udFNpemUoKSBjb25zdCB7CisgIHJldHVybiBtX3BFZGl0LT5HZXRGb250U2l6ZSgpOwogfQogCi12b2lkIENQV0xfTGFiZWw6OlNldFBhcmFtQnlGbGFnKCkKLXsKLQlpZiAoSGFzRmxhZyhQRVNfTEVGVCkpCi0JewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDApOwotCX0KLQllbHNlIGlmIChIYXNGbGFnKFBFU19NSURETEUpKQotCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgxKTsKLQl9Ci0JZWxzZSBpZiAoSGFzRmxhZyhQRVNfUklHSFQpKQotCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgyKTsKLQl9Ci0JZWxzZQotCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgwKTsKLQl9Cit2b2lkIENQV0xfTGFiZWw6OlNldFBhcmFtQnlGbGFnKCkgeworICBpZiAoSGFzRmxhZyhQRVNfTEVGVCkpIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDApOworICB9IGVsc2UgaWYgKEhhc0ZsYWcoUEVTX01JRERMRSkpIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDEpOworICB9IGVsc2UgaWYgKEhhc0ZsYWcoUEVTX1JJR0hUKSkgeworICAgIG1fcEVkaXQtPlNldEFsaWdubWVudEgoMik7CisgIH0gZWxzZSB7CisgICAgbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgwKTsKKyAgfQogCi0JaWYgKEhhc0ZsYWcoUEVTX1RPUCkpCi0JewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDApOwotCX0KLQllbHNlIGlmIChIYXNGbGFnKFBFU19DRU5URVIpKQotCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigxKTsKLQl9Ci0JZWxzZSBpZiAoSGFzRmxhZyhQRVNfQk9UVE9NKSkKLQl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudFYoMik7Ci0JfQotCWVsc2UKLQl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudFYoMCk7Ci0JfQorICBpZiAoSGFzRmxhZyhQRVNfVE9QKSkgeworICAgIG1fcEVkaXQtPlNldEFsaWdubWVudFYoMCk7CisgIH0gZWxzZSBpZiAoSGFzRmxhZyhQRVNfQ0VOVEVSKSkgeworICAgIG1fcEVkaXQtPlNldEFsaWdubWVudFYoMSk7CisgIH0gZWxzZSBpZiAoSGFzRmxhZyhQRVNfQk9UVE9NKSkgeworICAgIG1fcEVkaXQtPlNldEFsaWdubWVudFYoMik7CisgIH0gZWxzZSB7CisgICAgbV9wRWRpdC0+U2V0QWxpZ25tZW50VigwKTsKKyAgfQogCi0JaWYgKEhhc0ZsYWcoUEVTX1BBU1NXT1JEKSkKLQl7Ci0JCW1fcEVkaXQtPlNldFBhc3N3b3JkQ2hhcignKicpOwotCX0KKyAgaWYgKEhhc0ZsYWcoUEVTX1BBU1NXT1JEKSkgeworICAgIG1fcEVkaXQtPlNldFBhc3N3b3JkQ2hhcignKicpOworICB9CiAKLQltX3BFZGl0LT5TZXRNdWx0aUxpbmUoSGFzRmxhZyhQRVNfTVVMVElMSU5FKSk7Ci0JbV9wRWRpdC0+U2V0QXV0b1JldHVybihIYXNGbGFnKFBFU19BVVRPUkVUVVJOKSk7Ci0JbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEhhc0ZsYWcoUFdTX0FVVE9GT05UU0laRSkpOwotCW1fcEVkaXQtPlNldEF1dG9TY3JvbGwoSGFzRmxhZyhQRVNfQVVUT1NDUk9MTCkpOworICBtX3BFZGl0LT5TZXRNdWx0aUxpbmUoSGFzRmxhZyhQRVNfTVVMVElMSU5FKSk7CisgIG1fcEVkaXQtPlNldEF1dG9SZXR1cm4oSGFzRmxhZyhQRVNfQVVUT1JFVFVSTikpOworICBtX3BFZGl0LT5TZXRBdXRvRm9udFNpemUoSGFzRmxhZyhQV1NfQVVUT0ZPTlRTSVpFKSk7CisgIG1fcEVkaXQtPlNldEF1dG9TY3JvbGwoSGFzRmxhZyhQRVNfQVVUT1NDUk9MTCkpOwogfQogCi12b2lkIENQV0xfTGFiZWw6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSxwVXNlcjJEZXZpY2UpOwordm9pZCBDUFdMX0xhYmVsOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOwogCi0JR2V0Q2xpZW50UmVjdCgpOworICBHZXRDbGllbnRSZWN0KCk7CiAKLQlDUERGX1JlY3QgcmNDbGlwOwotCUNQVlRfV29yZFJhbmdlIHdyUmFuZ2UgPSBtX3BFZGl0LT5HZXRWaXNpYmxlV29yZFJhbmdlKCk7Ci0JQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEw7CisgIENQREZfUmVjdCByY0NsaXA7CisgIENQVlRfV29yZFJhbmdlIHdyUmFuZ2UgPSBtX3BFZGl0LT5HZXRWaXNpYmxlV29yZFJhbmdlKCk7CisgIENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgPSBOVUxMOwogCi0JaWYgKCFIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKQotCXsKLQkJcmNDbGlwID0gR2V0Q2xpZW50UmVjdCgpOwotCQlwUmFuZ2UgPSAmd3JSYW5nZTsKLQl9Ci1JRlhfU3lzdGVtSGFuZGxlciogcFN5c0hhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0JSUZYX0VkaXQ6OkRyYXdFZGl0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9wRWRpdCwKLQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwKLQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dFN0cm9rZUNvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwKLQkJcmNDbGlwLCBDUERGX1BvaW50KDAuMGYsMC4wZiksIHBSYW5nZSxwU3lzSGFuZGxlciwgTlVMTCk7CisgIGlmICghSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkgeworICAgIHJjQ2xpcCA9IEdldENsaWVudFJlY3QoKTsKKyAgICBwUmFuZ2UgPSAmd3JSYW5nZTsKKyAgfQorICBJRlhfU3lzdGVtSGFuZGxlciogcFN5c0hhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7CisgIElGWF9FZGl0OjpEcmF3RWRpdCgKKyAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9wRWRpdCwKKyAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksCisgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0U3Ryb2tlQ29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpLAorICAgICAgcmNDbGlwLCBDUERGX1BvaW50KDAuMGYsIDAuMGYpLCBwUmFuZ2UsIHBTeXNIYW5kbGVyLCBOVUxMKTsKIH0KIAotdm9pZCBDUFdMX0xhYmVsOjpTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlKQotewotCW1fcEVkaXQtPlNldEhvcnpTY2FsZShuSG9yelNjYWxlKTsKK3ZvaWQgQ1BXTF9MYWJlbDo6U2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSkgeworICBtX3BFZGl0LT5TZXRIb3J6U2NhbGUobkhvcnpTY2FsZSk7CiB9CiAKLXZvaWQgQ1BXTF9MYWJlbDo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpCi17Ci0JbV9wRWRpdC0+U2V0Q2hhclNwYWNlKGZDaGFyU3BhY2UpOwordm9pZCBDUFdMX0xhYmVsOjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkgeworICBtX3BFZGl0LT5TZXRDaGFyU3BhY2UoZkNoYXJTcGFjZSk7CiB9CiAKLUNQREZfUmVjdCBDUFdMX0xhYmVsOjpHZXRDb250ZW50UmVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7CitDUERGX1JlY3QgQ1BXTF9MYWJlbDo6R2V0Q29udGVudFJlY3QoKSBjb25zdCB7CisgIHJldHVybiBtX3BFZGl0LT5HZXRDb250ZW50UmVjdCgpOwogfQogCi12b2lkIENQV0xfTGFiZWw6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pCi17Ci0JQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOwordm9pZCBDUFdMX0xhYmVsOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKKyAgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOwogCi0Jc0FwcFN0cmVhbSA8PCBHZXRUZXh0QXBwZWFyYW5jZVN0cmVhbShDUERGX1BvaW50KDAuMGYsIDAuMGYpKTsKKyAgc0FwcFN0cmVhbSA8PCBHZXRUZXh0QXBwZWFyYW5jZVN0cmVhbShDUERGX1BvaW50KDAuMGYsIDAuMGYpKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9MYWJlbDo6R2V0VGV4dEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KSBjb25zdAotewotCUNGWF9CeXRlVGV4dEJ1ZiBzUmV0OwotCUNGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShtX3BFZGl0LHB0T2Zmc2V0KTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfTGFiZWw6OkdldFRleHRBcHBlYXJhbmNlU3RyZWFtKAorICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0KSBjb25zdCB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzUmV0OworICBDRlhfQnl0ZVN0cmluZyBzRWRpdCA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0obV9wRWRpdCwgcHRPZmZzZXQpOwogCi0JaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkKLQl7Ci0JCXNSZXQgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldFRleHRDb2xvcigpKSA8PCBzRWRpdCA8PCAiRVRcbiI7Ci0JfQorICBpZiAoc0VkaXQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgc1JldCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0VGV4dENvbG9yKCkpIDw8IHNFZGl0CisgICAgICAgICA8PCAiRVRcbiI7CisgIH0KIAotCXJldHVybiBzUmV0LkdldEJ5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIHNSZXQuR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUFdMX0xhYmVsOjpHZXRUZXh0KCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wRWRpdC0+R2V0VGV4dCgpOworQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9MYWJlbDo6R2V0VGV4dCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKIH0KIAotdm9pZCBDUFdMX0xhYmVsOjpTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyKQotewotCW1fcEVkaXQtPlNldExpbWl0Q2hhcihuTGltaXRDaGFyKTsKK3ZvaWQgQ1BXTF9MYWJlbDo6U2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhcikgeworICBtX3BFZGl0LT5TZXRMaW1pdENoYXIobkxpbWl0Q2hhcik7CiB9CiAKLWludDMyX3QgQ1BXTF9MYWJlbDo6R2V0VG90YWxXb3JkcygpCi17Ci0JaWYgKG1fcEVkaXQpCi0JCXJldHVybiBtX3BFZGl0LT5HZXRUb3RhbFdvcmRzKCk7CitpbnQzMl90IENQV0xfTGFiZWw6OkdldFRvdGFsV29yZHMoKSB7CisgIGlmIChtX3BFZGl0KQorICAgIHJldHVybiBtX3BFZGl0LT5HZXRUb3RhbFdvcmRzKCk7CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guY3BwCmluZGV4IDQ4ZmI0MDkuLmJhNzVlNTUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Qm94LmNwcApAQCAtMTIsNTg3ICsxMiw1MzEgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdC5oIgogCi0jZGVmaW5lIElzRmxvYXRaZXJvKGYpCQkJCQkJKChmKSA8IDAuMDAwMSAmJiAoZikgPiAtMC4wMDAxKQotI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLGZiKQkJCQkoKGZhKSA+IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKLSNkZWZpbmUgSXNGbG9hdFNtYWxsZXIoZmEsZmIpCQkJCSgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsZmIpCQkJCQlJc0Zsb2F0WmVybygoZmEpLShmYikpCisjZGVmaW5lIElzRmxvYXRaZXJvKGYpICgoZikgPCAwLjAwMDEgJiYgKGYpID4gLTAuMDAwMSkKKyNkZWZpbmUgSXNGbG9hdEJpZ2dlcihmYSwgZmIpICgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSwgZmIpICgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsIGZiKSBJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTGlzdF9Ob3RpZnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9MaXN0X05vdGlmeTo6Q1BXTF9MaXN0X05vdGlmeShDUFdMX0xpc3RCb3gqIHBMaXN0KSA6IG1fcExpc3QocExpc3QpCi17Ci0JQVNTRVJUKG1fcExpc3QgIT0gTlVMTCk7CitDUFdMX0xpc3RfTm90aWZ5OjpDUFdMX0xpc3RfTm90aWZ5KENQV0xfTGlzdEJveCogcExpc3QpIDogbV9wTGlzdChwTGlzdCkgeworICBBU1NFUlQobV9wTGlzdCAhPSBOVUxMKTsKIH0KIAotQ1BXTF9MaXN0X05vdGlmeTo6fkNQV0xfTGlzdF9Ob3RpZnkoKQoteworQ1BXTF9MaXN0X05vdGlmeTo6fkNQV0xfTGlzdF9Ob3RpZnkoKSB7fQorCit2b2lkIENQV0xfTGlzdF9Ob3RpZnk6OklPblNldFNjcm9sbEluZm9ZKEZYX0ZMT0FUIGZQbGF0ZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBsYXRlTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTbWFsbFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZCaWdTdGVwKSB7CisgIFBXTF9TQ1JPTExfSU5GTyBJbmZvOworCisgIEluZm8uZlBsYXRlV2lkdGggPSBmUGxhdGVNYXggLSBmUGxhdGVNaW47CisgIEluZm8uZkNvbnRlbnRNaW4gPSBmQ29udGVudE1pbjsKKyAgSW5mby5mQ29udGVudE1heCA9IGZDb250ZW50TWF4OworICBJbmZvLmZTbWFsbFN0ZXAgPSBmU21hbGxTdGVwOworICBJbmZvLmZCaWdTdGVwID0gZkJpZ1N0ZXA7CisKKyAgbV9wTGlzdC0+T25Ob3RpZnkobV9wTGlzdCwgUE5NX1NFVFNDUk9MTElORk8sIFNCVF9WU0NST0xMLCAoaW50cHRyX3QpJkluZm8pOworCisgIGlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbCA9IG1fcExpc3QtPkdldFZTY3JvbGxCYXIoKSkgeworICAgIGlmIChJc0Zsb2F0QmlnZ2VyKEluZm8uZlBsYXRlV2lkdGgsIEluZm8uZkNvbnRlbnRNYXggLSBJbmZvLmZDb250ZW50TWluKSB8fAorICAgICAgICBJc0Zsb2F0RXF1YWwoSW5mby5mUGxhdGVXaWR0aCwgSW5mby5mQ29udGVudE1heCAtIEluZm8uZkNvbnRlbnRNaW4pKSB7CisgICAgICBpZiAocFNjcm9sbC0+SXNWaXNpYmxlKCkpIHsKKyAgICAgICAgcFNjcm9sbC0+U2V0VmlzaWJsZShGQUxTRSk7CisgICAgICAgIG1fcExpc3QtPlJlUG9zQ2hpbGRXbmQoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFwU2Nyb2xsLT5Jc1Zpc2libGUoKSkgeworICAgICAgICBwU2Nyb2xsLT5TZXRWaXNpYmxlKFRSVUUpOworICAgICAgICBtX3BMaXN0LT5SZVBvc0NoaWxkV25kKCk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9MaXN0X05vdGlmeTo6SU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmQ29udGVudE1pbiwgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCkKLXsKLQlQV0xfU0NST0xMX0lORk8gSW5mbzsKLQotCUluZm8uZlBsYXRlV2lkdGggPSBmUGxhdGVNYXggLSBmUGxhdGVNaW47Ci0JSW5mby5mQ29udGVudE1pbiA9IGZDb250ZW50TWluOwotCUluZm8uZkNvbnRlbnRNYXggPSBmQ29udGVudE1heDsKLQlJbmZvLmZTbWFsbFN0ZXAgPSBmU21hbGxTdGVwOwotCUluZm8uZkJpZ1N0ZXAgPSBmQmlnU3RlcDsKLQotCW1fcExpc3QtPk9uTm90aWZ5KG1fcExpc3QsUE5NX1NFVFNDUk9MTElORk8sU0JUX1ZTQ1JPTEwsKGludHB0cl90KSZJbmZvKTsKLQotCWlmIChDUFdMX1Njcm9sbEJhciAqIHBTY3JvbGwgPSBtX3BMaXN0LT5HZXRWU2Nyb2xsQmFyKCkpCi0JewotCQlpZiAoSXNGbG9hdEJpZ2dlcihJbmZvLmZQbGF0ZVdpZHRoLEluZm8uZkNvbnRlbnRNYXgtSW5mby5mQ29udGVudE1pbikKLQkJCXx8IElzRmxvYXRFcXVhbChJbmZvLmZQbGF0ZVdpZHRoLEluZm8uZkNvbnRlbnRNYXgtSW5mby5mQ29udGVudE1pbikpCi0JCXsKLQkJCWlmIChwU2Nyb2xsLT5Jc1Zpc2libGUoKSkKLQkJCXsKLQkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKEZBTFNFKTsKLQkJCQltX3BMaXN0LT5SZVBvc0NoaWxkV25kKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoIXBTY3JvbGwtPklzVmlzaWJsZSgpKQotCQkJewotCQkJCXBTY3JvbGwtPlNldFZpc2libGUoVFJVRSk7Ci0JCQkJbV9wTGlzdC0+UmVQb3NDaGlsZFduZCgpOwotCQkJfQotCQl9Ci0JfQordm9pZCBDUFdMX0xpc3RfTm90aWZ5OjpJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KSB7CisgIG1fcExpc3QtPk9uTm90aWZ5KG1fcExpc3QsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLCAoaW50cHRyX3QpJmZ5KTsKIH0KIAotdm9pZCBDUFdMX0xpc3RfTm90aWZ5OjpJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KQotewotCW1fcExpc3QtPk9uTm90aWZ5KG1fcExpc3QsUE5NX1NFVFNDUk9MTFBPUyxTQlRfVlNDUk9MTCwoaW50cHRyX3QpJmZ5KTsKLX0KLQotdm9pZCBDUFdMX0xpc3RfTm90aWZ5OjpJT25JbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCkKLXsKLQltX3BMaXN0LT5JbnZhbGlkYXRlUmVjdChwUmVjdCk7Cit2b2lkIENQV0xfTGlzdF9Ob3RpZnk6OklPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QpIHsKKyAgbV9wTGlzdC0+SW52YWxpZGF0ZVJlY3QocFJlY3QpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9MaXN0Qm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9MaXN0Qm94OjpDUFdMX0xpc3RCb3goKSA6Ci0JbV9wTGlzdChOVUxMKSwKLQltX3BMaXN0Tm90aWZ5KE5VTEwpLAotCW1fYk1vdXNlRG93bihGQUxTRSksCi0JbV9iSG92ZXJTZWwoRkFMU0UpLAotCW1fcEZpbGxlck5vdGlmeShOVUxMKQotewotCW1fcExpc3QgPSBJRlhfTGlzdDo6TmV3TGlzdCgpOworQ1BXTF9MaXN0Qm94OjpDUFdMX0xpc3RCb3goKQorICAgIDogbV9wTGlzdChOVUxMKSwKKyAgICAgIG1fcExpc3ROb3RpZnkoTlVMTCksCisgICAgICBtX2JNb3VzZURvd24oRkFMU0UpLAorICAgICAgbV9iSG92ZXJTZWwoRkFMU0UpLAorICAgICAgbV9wRmlsbGVyTm90aWZ5KE5VTEwpIHsKKyAgbV9wTGlzdCA9IElGWF9MaXN0OjpOZXdMaXN0KCk7CiAKLQlBU1NFUlQobV9wTGlzdCAhPSBOVUxMKTsKKyAgQVNTRVJUKG1fcExpc3QgIT0gTlVMTCk7CiB9CiAKLUNQV0xfTGlzdEJveDo6fkNQV0xfTGlzdEJveCgpCi17Ci0gICAgSUZYX0xpc3Q6OkRlbExpc3QobV9wTGlzdCk7CitDUFdMX0xpc3RCb3g6On5DUFdMX0xpc3RCb3goKSB7CisgIElGWF9MaXN0OjpEZWxMaXN0KG1fcExpc3QpOworICBkZWxldGUgbV9wTGlzdE5vdGlmeTsKKyAgbV9wTGlzdE5vdGlmeSA9IE5VTEw7Cit9CisKK0NGWF9CeXRlU3RyaW5nIENQV0xfTGlzdEJveDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfTGlzdEJveCI7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpPbkNyZWF0ZWQoKSB7CisgIGlmIChtX3BMaXN0KSB7CiAgICAgZGVsZXRlIG1fcExpc3ROb3RpZnk7Ci0gICAgbV9wTGlzdE5vdGlmeSA9IE5VTEw7CisKKyAgICBtX3BMaXN0LT5TZXRGb250TWFwKEdldEZvbnRNYXAoKSk7CisgICAgbV9wTGlzdC0+U2V0Tm90aWZ5KG1fcExpc3ROb3RpZnkgPSBuZXcgQ1BXTF9MaXN0X05vdGlmeSh0aGlzKSk7CisKKyAgICBTZXRIb3ZlclNlbChIYXNGbGFnKFBMQlNfSE9WRVJTRUwpKTsKKyAgICBtX3BMaXN0LT5TZXRNdWx0aXBsZVNlbChIYXNGbGFnKFBMQlNfTVVMVElQTEVTRUwpKTsKKyAgICBtX3BMaXN0LT5TZXRGb250U2l6ZShHZXRDcmVhdGlvblBhcmFtKCkuZkZvbnRTaXplKTsKKworICAgIG1fYkhvdmVyU2VsID0gSGFzRmxhZyhQTEJTX0hPVkVSU0VMKTsKKyAgfQogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0xpc3RCb3g6OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICJDUFdMX0xpc3RCb3giOwordm9pZCBDUFdMX0xpc3RCb3g6Ok9uRGVzdHJveSgpIHsKKyAgZGVsZXRlIG1fcExpc3ROb3RpZnk7CisgIG1fcExpc3ROb3RpZnkgPSBOVUxMOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6T25DcmVhdGVkKCkKLXsKLQlpZiAobV9wTGlzdCkKLQl7Ci0JCWRlbGV0ZSBtX3BMaXN0Tm90aWZ5Owordm9pZCBDUFdMX0xpc3RCb3g6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgeworICBDUFdMX1duZDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7CiAKLQkJbV9wTGlzdC0+U2V0Rm9udE1hcChHZXRGb250TWFwKCkpOwotCQltX3BMaXN0LT5TZXROb3RpZnkobV9wTGlzdE5vdGlmeSA9IG5ldyBDUFdMX0xpc3RfTm90aWZ5KHRoaXMpKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNMaXN0SXRlbXM7CiAKLQkJU2V0SG92ZXJTZWwoSGFzRmxhZyhQTEJTX0hPVkVSU0VMKSk7Ci0JCW1fcExpc3QtPlNldE11bHRpcGxlU2VsKEhhc0ZsYWcoUExCU19NVUxUSVBMRVNFTCkpOwotCQltX3BMaXN0LT5TZXRGb250U2l6ZShHZXRDcmVhdGlvblBhcmFtKCkuZkZvbnRTaXplKTsKKyAgaWYgKG1fcExpc3QpIHsKKyAgICBDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcExpc3QtPkdldFBsYXRlUmVjdCgpOworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX3BMaXN0LT5HZXRDb3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgICAgQ1BERl9SZWN0IHJjSXRlbSA9IG1fcExpc3QtPkdldEl0ZW1SZWN0KGkpOwogCi0JCW1fYkhvdmVyU2VsID0gSGFzRmxhZyhQTEJTX0hPVkVSU0VMKTsKLQl9CisgICAgICBpZiAocmNJdGVtLmJvdHRvbSA+IHJjUGxhdGUudG9wIHx8IHJjSXRlbS50b3AgPCByY1BsYXRlLmJvdHRvbSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIENQREZfUG9pbnQgcHRPZmZzZXQocmNJdGVtLmxlZnQsIChyY0l0ZW0udG9wICsgcmNJdGVtLmJvdHRvbSkgKiAwLjVmKTsKKyAgICAgIGlmIChtX3BMaXN0LT5Jc0l0ZW1TZWxlY3RlZChpKSkgeworICAgICAgICBzTGlzdEl0ZW1zIDw8IENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKAorICAgICAgICAgICAgcmNJdGVtLCBQV0xfREVGQVVMVF9TRUxCQUNLQ09MT1IpOworICAgICAgICBDRlhfQnl0ZVN0cmluZyBzSXRlbSA9CisgICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKG1fcExpc3QtPkdldEl0ZW1FZGl0KGkpLCBwdE9mZnNldCk7CisgICAgICAgIGlmIChzSXRlbS5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzTGlzdEl0ZW1zIDw8ICJCVFxuIgorICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oUFdMX0RFRkFVTFRfU0VMVEVYVENPTE9SKQorICAgICAgICAgICAgICAgICAgICAgPDwgc0l0ZW0gPDwgIkVUXG4iOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBDRlhfQnl0ZVN0cmluZyBzSXRlbSA9CisgICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKG1fcExpc3QtPkdldEl0ZW1FZGl0KGkpLCBwdE9mZnNldCk7CisgICAgICAgIGlmIChzSXRlbS5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzTGlzdEl0ZW1zIDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRUZXh0Q29sb3IoKSkKKyAgICAgICAgICAgICAgICAgICAgIDw8IHNJdGVtIDw8ICJFVFxuIjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChzTGlzdEl0ZW1zLkdldExlbmd0aCgpID4gMCkgeworICAgIENGWF9CeXRlVGV4dEJ1ZiBzQ2xpcDsKKyAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisKKyAgICBzQ2xpcCA8PCAicVxuIjsKKyAgICBzQ2xpcCA8PCByY0NsaWVudC5sZWZ0IDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiAiCisgICAgICAgICAgPDwgcmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0IDw8ICIgIgorICAgICAgICAgIDw8IHJjQ2xpZW50LnRvcCAtIHJjQ2xpZW50LmJvdHRvbSA8PCAiIHJlIFcgblxuIjsKKworICAgIHNDbGlwIDw8IHNMaXN0SXRlbXMgPDwgIlFcbiI7CisKKyAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iIDw8IHNDbGlwIDw8ICJFTUNcbiI7CisgIH0KIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6Ok9uRGVzdHJveSgpCi17Ci0gICAgZGVsZXRlIG1fcExpc3ROb3RpZnk7Ci0gICAgbV9wTGlzdE5vdGlmeSA9IE5VTEw7Cit2b2lkIENQV0xfTGlzdEJveDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOworCisgIGlmIChtX3BMaXN0KSB7CisgICAgQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BMaXN0LT5HZXRQbGF0ZVJlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNMaXN0ID0gR2V0TGlzdFJlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisKKyAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9wTGlzdC0+R2V0Q291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIENQREZfUmVjdCByY0l0ZW0gPSBtX3BMaXN0LT5HZXRJdGVtUmVjdChpKTsKKyAgICAgIGlmIChyY0l0ZW0uYm90dG9tID4gcmNQbGF0ZS50b3AgfHwgcmNJdGVtLnRvcCA8IHJjUGxhdGUuYm90dG9tKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgQ1BERl9Qb2ludCBwdE9mZnNldChyY0l0ZW0ubGVmdCwgKHJjSXRlbS50b3AgKyByY0l0ZW0uYm90dG9tKSAqIDAuNWYpOworICAgICAgaWYgKElGWF9FZGl0KiBwRWRpdCA9IG1fcExpc3QtPkdldEl0ZW1FZGl0KGkpKSB7CisgICAgICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSBwRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKKyAgICAgICAgaWYgKHJjQ29udGVudC5XaWR0aCgpID4gcmNDbGllbnQuV2lkdGgoKSkKKyAgICAgICAgICByY0l0ZW0uSW50ZXJzZWN0KHJjTGlzdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByY0l0ZW0uSW50ZXJzZWN0KHJjQ2xpZW50KTsKKyAgICAgIH0KKworICAgICAgaWYgKG1fcExpc3QtPklzSXRlbVNlbGVjdGVkKGkpKSB7CisgICAgICAgIC8vCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjSXRlbSwKKyAgICAgICAgLy9BcmdiRW5jb2RlKDI1NSwwLDUxLDExMykpOworICAgICAgICBJRlhfU3lzdGVtSGFuZGxlciogcFN5c0hhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7CisgICAgICAgIGlmIChwU3lzSGFuZGxlciAmJiBwU3lzSGFuZGxlci0+SXNTZWxlY3Rpb25JbXBsZW1lbnRlZCgpKSB7CisgICAgICAgICAgSUZYX0VkaXQ6OkRyYXdFZGl0KAorICAgICAgICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fcExpc3QtPkdldEl0ZW1FZGl0KGkpLAorICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSksCisgICAgICAgICAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRTdHJva2VDb2xvcigpKSwgcmNMaXN0LAorICAgICAgICAgICAgICBwdE9mZnNldCwgTlVMTCwgcFN5c0hhbmRsZXIsIG1fcEZvcm1GaWxsZXIpOworICAgICAgICAgIHBTeXNIYW5kbGVyLT5PdXRwdXRTZWxlY3RlZFJlY3QobV9wRm9ybUZpbGxlciwgcmNJdGVtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0l0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoMjU1LCAwLCA1MSwgMTEzKSk7CisgICAgICAgICAgSUZYX0VkaXQ6OkRyYXdFZGl0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgMCwgcmNMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdE9mZnNldCwgTlVMTCwgcFN5c0hhbmRsZXIsIG1fcEZvcm1GaWxsZXIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBJRlhfU3lzdGVtSGFuZGxlciogcFN5c0hhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7CisgICAgICAgIElGWF9FZGl0OjpEcmF3RWRpdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fcExpc3QtPkdldEl0ZW1FZGl0KGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dFN0cm9rZUNvbG9yKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNMaXN0LCBwdE9mZnNldCwgTlVMTCwgcFN5c0hhbmRsZXIsIE5VTEwpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfTGlzdEJveDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLQlDUFdMX1duZDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7CitGWF9CT09MIENQV0xfTGlzdEJveDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbktleURvd24obkNoYXIsIG5GbGFnKTsKIAotCUNGWF9CeXRlVGV4dEJ1ZiBzTGlzdEl0ZW1zOworICBpZiAoIW1fcExpc3QpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKG1fcExpc3QpCi0JewotCQlDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcExpc3QtPkdldFBsYXRlUmVjdCgpOwotCQlmb3IgKGludDMyX3QgaT0wLHN6PW1fcExpc3QtPkdldENvdW50KCk7IGk8c3o7IGkrKykKLQkJewotCQkJQ1BERl9SZWN0IHJjSXRlbSA9IG1fcExpc3QtPkdldEl0ZW1SZWN0KGkpOworICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CisgICAgY2FzZSBGV0xfVktFWV9MZWZ0OgorICAgIGNhc2UgRldMX1ZLRVlfRW5kOgorICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6CisgICAgICBicmVhazsKKyAgfQogCi0JCQlpZiAocmNJdGVtLmJvdHRvbSA+IHJjUGxhdGUudG9wIHx8IHJjSXRlbS50b3AgPCByY1BsYXRlLmJvdHRvbSkgY29udGludWU7CisgIHN3aXRjaCAobkNoYXIpIHsKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgICAgbV9wTGlzdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICAgIG1fcExpc3QtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfSG9tZToKKyAgICAgIG1fcExpc3QtPk9uVktfSE9NRShJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKKyAgICAgIG1fcExpc3QtPk9uVktfTEVGVChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfRW5kOgorICAgICAgbV9wTGlzdC0+T25WS19FTkQoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX1JpZ2h0OgorICAgICAgbV9wTGlzdC0+T25WS19SSUdIVChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfRGVsZXRlOgorICAgICAgYnJlYWs7CisgIH0KIAotCQkJQ1BERl9Qb2ludCBwdE9mZnNldChyY0l0ZW0ubGVmdCwgKHJjSXRlbS50b3AgKyByY0l0ZW0uYm90dG9tKSAqIDAuNWYpOwotCQkJaWYgKG1fcExpc3QtPklzSXRlbVNlbGVjdGVkKGkpKQotCQkJewotCQkJCXNMaXN0SXRlbXMgPDwgQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0ocmNJdGVtLFBXTF9ERUZBVUxUX1NFTEJBQ0tDT0xPUik7Ci0JCQkJQ0ZYX0J5dGVTdHJpbmcgc0l0ZW0gPSBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKG1fcExpc3QtPkdldEl0ZW1FZGl0KGkpLCBwdE9mZnNldCk7Ci0JCQkJaWYgKHNJdGVtLkdldExlbmd0aCgpID4gMCkKLQkJCQl7Ci0JCQkJCXNMaXN0SXRlbXMgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKFBXTF9ERUZBVUxUX1NFTFRFWFRDT0xPUikgPDwgc0l0ZW0gPDwgIkVUXG4iOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlDRlhfQnl0ZVN0cmluZyBzSXRlbSA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0obV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksIHB0T2Zmc2V0KTsKLQkJCQlpZiAoc0l0ZW0uR2V0TGVuZ3RoKCkgPiAwKQotCQkJCXsKLQkJCQkJc0xpc3RJdGVtcyA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0VGV4dENvbG9yKCkpIDw8IHNJdGVtIDw8ICJFVFxuIjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyAgT25Ob3RpZnlTZWxDaGFuZ2VkKFRSVUUsIGJFeGl0LCBuRmxhZyk7CiAKLQlpZiAoc0xpc3RJdGVtcy5HZXRMZW5ndGgoKSA+IDApCi0JewotCQlDRlhfQnl0ZVRleHRCdWYgc0NsaXA7Ci0JCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotCQlzQ2xpcCA8PCAicVxuIjsKLQkJc0NsaXAgPDwgcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgIgotCQkJPDwgcmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0IDw8ICIgIiA8PAlyY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20gPDwgIiByZSBXIG5cbiI7Ci0KLQkJc0NsaXAgPDwgc0xpc3RJdGVtcyA8PCAiUVxuIjsKLQotCQlzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iIDw8IHNDbGlwIDw8ICJFTUNcbiI7Ci0JfQorICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSxwVXNlcjJEZXZpY2UpOworRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25DaGFyKG5DaGFyLCBuRmxhZyk7CiAKLQlpZiAobV9wTGlzdCkKLQl7Ci0JCUNQREZfUmVjdCByY1BsYXRlID0gbV9wTGlzdC0+R2V0UGxhdGVSZWN0KCk7Ci0JCUNQREZfUmVjdCByY0xpc3QgPSBHZXRMaXN0UmVjdCgpOwotCQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgIGlmICghbV9wTGlzdCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQkJZm9yIChpbnQzMl90IGk9MCxzej1tX3BMaXN0LT5HZXRDb3VudCgpOyBpPHN6OyBpKyspCi0JCXsKLQkJCUNQREZfUmVjdCByY0l0ZW0gPSBtX3BMaXN0LT5HZXRJdGVtUmVjdChpKTsKLQkJCWlmIChyY0l0ZW0uYm90dG9tID4gcmNQbGF0ZS50b3AgfHwgcmNJdGVtLnRvcCA8IHJjUGxhdGUuYm90dG9tKSBjb250aW51ZTsKKyAgaWYgKCFtX3BMaXN0LT5PbkNoYXIobkNoYXIsIElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpKQorICAgIHJldHVybiBGQUxTRTsKIAotCQkJQ1BERl9Qb2ludCBwdE9mZnNldChyY0l0ZW0ubGVmdCwgKHJjSXRlbS50b3AgKyByY0l0ZW0uYm90dG9tKSAqIDAuNWYpOwotCQkJaWYgKElGWF9FZGl0KiBwRWRpdCA9IG1fcExpc3QtPkdldEl0ZW1FZGl0KGkpKQotCQkJewotCQkJCUNQREZfUmVjdCByY0NvbnRlbnQgPSBwRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKLQkJCQlpZiAocmNDb250ZW50LldpZHRoKCkgPiByY0NsaWVudC5XaWR0aCgpKQotCQkJCQlyY0l0ZW0uSW50ZXJzZWN0KHJjTGlzdCk7Ci0JCQkJZWxzZQotCQkJCQlyY0l0ZW0uSW50ZXJzZWN0KHJjQ2xpZW50KTsKLQkJCX0KKyAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICBPbk5vdGlmeVNlbENoYW5nZWQoVFJVRSwgYkV4aXQsIG5GbGFnKTsKIAotCQkJaWYgKG1fcExpc3QtPklzSXRlbVNlbGVjdGVkKGkpKQotCQkJewotCQkJLy8JQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNJdGVtLCBBcmdiRW5jb2RlKDI1NSwwLDUxLDExMykpOwotCQkJCUlGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKTsKLQkJCQlpZihwU3lzSGFuZGxlciAmJiBwU3lzSGFuZGxlci0+SXNTZWxlY3Rpb25JbXBsZW1lbnRlZCgpKQotCQkJCXsKLQkJCQkJSUZYX0VkaXQ6OkRyYXdFZGl0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpKSwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dFN0cm9rZUNvbG9yKCkpLAotCQkJCQkJcmNMaXN0LCBwdE9mZnNldCwgTlVMTCxwU3lzSGFuZGxlciwgbV9wRm9ybUZpbGxlcik7Ci0JCQkJCXBTeXNIYW5kbGVyLT5PdXRwdXRTZWxlY3RlZFJlY3QobV9wRm9ybUZpbGxlciwgcmNJdGVtKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNJdGVtLCBBcmdiRW5jb2RlKDI1NSwwLDUxLDExMykpOwotCQkJCQlJRlhfRWRpdDo6RHJhd0VkaXQocERldmljZSwgcFVzZXIyRGV2aWNlLCBtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSwgQXJnYkVuY29kZSgyNTUsMjU1LDI1NSwyNTUpLCAwLAotCQkJCQkJcmNMaXN0LCBwdE9mZnNldCwgTlVMTCwgcFN5c0hhbmRsZXIsIG1fcEZvcm1GaWxsZXIpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlJRlhfU3lzdGVtSGFuZGxlciogcFN5c0hhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0JCQkJSUZYX0VkaXQ6OkRyYXdFZGl0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksCi0JCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSksCi0JCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0U3Ryb2tlQ29sb3IoKSksCi0JCQkJCQlyY0xpc3QsIHB0T2Zmc2V0LCBOVUxMLHBTeXNIYW5kbGVyLCBOVUxMKTsKLQotCQkJfQotCQl9Ci0JfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKLXsKLQlDUFdMX1duZDo6T25LZXlEb3duKG5DaGFyLCBuRmxhZyk7CitGWF9CT09MIENQV0xfTGlzdEJveDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKIAotCWlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOworICBpZiAoQ2xpZW50SGl0VGVzdChwb2ludCkpIHsKKyAgICBtX2JNb3VzZURvd24gPSBUUlVFOworICAgIFNldEZvY3VzKCk7CisgICAgU2V0Q2FwdHVyZSgpOwogCi0Jc3dpdGNoIChuQ2hhcikKLQl7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIEZBTFNFOwotCWNhc2UgRldMX1ZLRVlfVXA6Ci0JY2FzZSBGV0xfVktFWV9Eb3duOgotCWNhc2UgRldMX1ZLRVlfSG9tZToKLQljYXNlIEZXTF9WS0VZX0xlZnQ6Ci0JY2FzZSBGV0xfVktFWV9FbmQ6Ci0JY2FzZSBGV0xfVktFWV9SaWdodDoKLQkJYnJlYWs7Ci0JfQorICAgIGlmIChtX3BMaXN0KQorICAgICAgbV9wTGlzdC0+T25Nb3VzZURvd24ocG9pbnQsIElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICB9CiAKLQlzd2l0Y2ggKG5DaGFyKQotCXsKLQljYXNlIEZXTF9WS0VZX1VwOgotCQltX3BMaXN0LT5PblZLX1VQKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JCWJyZWFrOwotCWNhc2UgRldMX1ZLRVlfRG93bjoKLQkJbV9wTGlzdC0+T25WS19ET1dOKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JCWJyZWFrOwotCWNhc2UgRldMX1ZLRVlfSG9tZToKLQkJbV9wTGlzdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JCWJyZWFrOwotCWNhc2UgRldMX1ZLRVlfTGVmdDoKLQkJbV9wTGlzdC0+T25WS19MRUZUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JCWJyZWFrOwotCWNhc2UgRldMX1ZLRVlfRW5kOgotCQltX3BMaXN0LT5PblZLX0VORChJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwotCQlicmVhazsKLQljYXNlIEZXTF9WS0VZX1JpZ2h0OgotCQltX3BMaXN0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JCWJyZWFrOwotCWNhc2UgRldMX1ZLRVlfRGVsZXRlOgotCQlicmVhazsKLQl9Ci0KLQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0JT25Ob3RpZnlTZWxDaGFuZ2VkKFRSVUUsYkV4aXQsbkZsYWcpOwotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQV0xfTGlzdEJveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbkNoYXIobkNoYXIsbkZsYWcpOworRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAotCWlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOworICBpZiAobV9iTW91c2VEb3duKSB7CisgICAgUmVsZWFzZUNhcHR1cmUoKTsKKyAgICBtX2JNb3VzZURvd24gPSBGQUxTRTsKKyAgfQogCi0JaWYgKCFtX3BMaXN0LT5PbkNoYXIobkNoYXIsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKSkgcmV0dXJuIEZBTFNFOworICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgIE9uTm90aWZ5U2VsQ2hhbmdlZChGQUxTRSwgYkV4aXQsIG5GbGFnKTsKIAotCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQlPbk5vdGlmeVNlbENoYW5nZWQoVFJVRSxiRXhpdCwgbkZsYWcpOwotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQV0xfTGlzdEJveDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LG5GbGFnKTsKLQotCWlmIChDbGllbnRIaXRUZXN0KHBvaW50KSkKLQl7Ci0JCW1fYk1vdXNlRG93biA9IFRSVUU7Ci0JCVNldEZvY3VzKCk7Ci0JCVNldENhcHR1cmUoKTsKLQotCQlpZiAobV9wTGlzdCkKLQkJCW1fcExpc3QtPk9uTW91c2VEb3duKHBvaW50LElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Cit2b2lkIENQV0xfTGlzdEJveDo6U2V0SG92ZXJTZWwoRlhfQk9PTCBiSG92ZXJTZWwpIHsKKyAgbV9iSG92ZXJTZWwgPSBiSG92ZXJTZWw7CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCxuRmxhZyk7CitGWF9CT09MIENQV0xfTGlzdEJveDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbk1vdXNlTW92ZShwb2ludCwgbkZsYWcpOwogCi0JaWYgKG1fYk1vdXNlRG93bikKLQl7Ci0JCVJlbGVhc2VDYXB0dXJlKCk7Ci0JCW1fYk1vdXNlRG93biA9IEZBTFNFOwotCX0KKyAgaWYgKG1fYkhvdmVyU2VsICYmICFJc0NhcHR1cmVNb3VzZSgpICYmIENsaWVudEhpdFRlc3QocG9pbnQpKSB7CisgICAgaWYgKG1fcExpc3QpCisgICAgICBtX3BMaXN0LT5TZWxlY3QobV9wTGlzdC0+R2V0SXRlbUluZGV4KHBvaW50KSk7CisgIH0KIAotCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQlPbk5vdGlmeVNlbENoYW5nZWQoRkFMU0UsYkV4aXQsbkZsYWcpOworICBpZiAobV9iTW91c2VEb3duKSB7CisgICAgaWYgKG1fcExpc3QpCisgICAgICBtX3BMaXN0LT5Pbk1vdXNlTW92ZShwb2ludCwgSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6OlNldEhvdmVyU2VsKEZYX0JPT0wgYkhvdmVyU2VsKQotewotCW1fYkhvdmVyU2VsID0gYkhvdmVyU2VsOwordm9pZCBDUFdMX0xpc3RCb3g6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7CisgIENQV0xfV25kOjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKworICBGWF9GTE9BVCBmUG9zOworCisgIHN3aXRjaCAobXNnKSB7CisgICAgY2FzZSBQTk1fU0VUU0NST0xMSU5GTzoKKyAgICAgIHN3aXRjaCAod1BhcmFtKSB7CisgICAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICAgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKKyAgICAgICAgICAgIHBDaGlsZC0+T25Ob3RpZnkocFduZCwgUE5NX1NFVFNDUk9MTElORk8sIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBOTV9TRVRTQ1JPTExQT1M6CisgICAgICBzd2l0Y2ggKHdQYXJhbSkgeworICAgICAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gR2V0VlNjcm9sbEJhcigpKSB7CisgICAgICAgICAgICBwQ2hpbGQtPk9uTm90aWZ5KHBXbmQsIFBOTV9TRVRTQ1JPTExQT1MsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBOTV9TQ1JPTExXSU5ET1c6CisgICAgICBmUG9zID0gKihGWF9GTE9BVCopbFBhcmFtOworICAgICAgc3dpdGNoICh3UGFyYW0pIHsKKyAgICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgICAgICBpZiAobV9wTGlzdCkKKyAgICAgICAgICAgIG1fcExpc3QtPlNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAsIGZQb3MpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbk1vdXNlTW92ZShwb2ludCwgbkZsYWcpOwotCi0JaWYgKG1fYkhvdmVyU2VsICYmICFJc0NhcHR1cmVNb3VzZSgpICYmIENsaWVudEhpdFRlc3QocG9pbnQpKQotCXsKLQkJaWYgKG1fcExpc3QpCi0JCQltX3BMaXN0LT5TZWxlY3QobV9wTGlzdC0+R2V0SXRlbUluZGV4KHBvaW50KSk7Ci0JfQotCi0JaWYgKG1fYk1vdXNlRG93bikKLQl7Ci0JCWlmIChtX3BMaXN0KQotCQkJbV9wTGlzdC0+T25Nb3VzZU1vdmUocG9pbnQsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpLaWxsRm9jdXMoKSB7CisgIENQV0xfV25kOjpLaWxsRm9jdXMoKTsKIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIGludHB0cl90IHdQYXJhbSwgaW50cHRyX3QgbFBhcmFtKQotewotCUNQV0xfV25kOjpPbk5vdGlmeShwV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpSZVBvc0NoaWxkV25kKCkgeworICBDUFdMX1duZDo6UmVQb3NDaGlsZFduZCgpOwogCi0JRlhfRkxPQVQgZlBvczsKLQotCXN3aXRjaCAobXNnKQotCXsKLQljYXNlIFBOTV9TRVRTQ1JPTExJTkZPOgotCQlzd2l0Y2ggKHdQYXJhbSkKLQkJewotCQljYXNlIFNCVF9WU0NST0xMOgotCQkJaWYgKENQV0xfV25kICogcENoaWxkID0gR2V0VlNjcm9sbEJhcigpKQotCQkJewotCQkJCXBDaGlsZC0+T25Ob3RpZnkocFduZCxQTk1fU0VUU0NST0xMSU5GTyx3UGFyYW0sbFBhcmFtKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUE5NX1NFVFNDUk9MTFBPUzoKLQkJc3dpdGNoICh3UGFyYW0pCi0JCXsKLQkJY2FzZSBTQlRfVlNDUk9MTDoKLQkJCWlmIChDUFdMX1duZCAqIHBDaGlsZCA9IEdldFZTY3JvbGxCYXIoKSkKLQkJCXsKLQkJCQlwQ2hpbGQtPk9uTm90aWZ5KHBXbmQsUE5NX1NFVFNDUk9MTFBPUyx3UGFyYW0sbFBhcmFtKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUE5NX1NDUk9MTFdJTkRPVzoKLQkJZlBvcyA9ICooRlhfRkxPQVQqKWxQYXJhbTsKLQkJc3dpdGNoICh3UGFyYW0pCi0JCXsKLQkJY2FzZSBTQlRfVlNDUk9MTDoKLQkJCWlmIChtX3BMaXN0KQotCQkJCW1fcExpc3QtPlNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAsZlBvcykpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorICBpZiAobV9wTGlzdCkKKyAgICBtX3BMaXN0LT5TZXRQbGF0ZVJlY3QoR2V0TGlzdFJlY3QoKSk7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Qm94OjpLaWxsRm9jdXMoKQotewotICAgIENQV0xfV25kOjpLaWxsRm9jdXMoKTsKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpPbk5vdGlmeVNlbENoYW5nZWQoRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmIChtX3BGaWxsZXJOb3RpZnkpIHsKKyAgICBGWF9CT09MIGJSQyA9IFRSVUU7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3dDaGFuZ2UgPSBHZXRUZXh0KCk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ2hhbmdlRXg7CisgICAgaW50IG5TZWxTdGFydCA9IDA7CisgICAgaW50IG5TZWxFbmQgPSBzd0NoYW5nZS5HZXRMZW5ndGgoKTsKKyAgICBtX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKEZBTFNFLCBHZXRBdHRhY2hlZERhdGEoKSwgMCwgc3dDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYktleURvd24sIGJSQywgYkV4aXQsIG5GbGFnKTsKKyAgICBpZiAoYkV4aXQpCisgICAgICByZXR1cm47CisKKyAgICBtX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UoRkFMU0UsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgbkZsYWcpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Qm94OjpSZVBvc0NoaWxkV25kKCkKLXsKLQlDUFdMX1duZDo6UmVQb3NDaGlsZFduZCgpOworQ1BERl9SZWN0IENQV0xfTGlzdEJveDo6R2V0Rm9jdXNSZWN0KCkgY29uc3QgeworICBpZiAobV9wTGlzdCAmJiBtX3BMaXN0LT5Jc011bHRpcGxlU2VsKCkpIHsKKyAgICBDUERGX1JlY3QgcmNDYXJldCA9IG1fcExpc3QtPkdldEl0ZW1SZWN0KG1fcExpc3QtPkdldENhcmV0KCkpOworICAgIHJjQ2FyZXQuSW50ZXJzZWN0KEdldENsaWVudFJlY3QoKSk7CisgICAgcmV0dXJuIHJjQ2FyZXQ7CisgIH0KIAotCWlmIChtX3BMaXN0KQotCQltX3BMaXN0LT5TZXRQbGF0ZVJlY3QoR2V0TGlzdFJlY3QoKSk7CisgIHJldHVybiBDUFdMX1duZDo6R2V0Rm9jdXNSZWN0KCk7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Qm94OjpPbk5vdGlmeVNlbENoYW5nZWQoRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCAmIGJFeGl0LCAgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKG1fcEZpbGxlck5vdGlmeSkKLQl7Ci0JCUZYX0JPT0wgYlJDID0gVFJVRTsKLQkJQ0ZYX1dpZGVTdHJpbmcgc3dDaGFuZ2UgPSBHZXRUZXh0KCk7Ci0JCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OwotCQlpbnQgblNlbFN0YXJ0ID0gMDsKLQkJaW50IG5TZWxFbmQgPSBzd0NoYW5nZS5HZXRMZW5ndGgoKTsKLQkJbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShGQUxTRSwgR2V0QXR0YWNoZWREYXRhKCksIDAsIHN3Q2hhbmdlLCBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLCBiS2V5RG93biwgYlJDLCBiRXhpdCwgbkZsYWcpOwotCQlpZiAoYkV4aXQpIHJldHVybjsKLQotCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UoRkFMU0UsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCxuRmxhZyk7Ci0JfQordm9pZCBDUFdMX0xpc3RCb3g6OkFkZFN0cmluZyhjb25zdCBGWF9XQ0hBUiogc3RyaW5nKSB7CisgIGlmIChtX3BMaXN0KSB7CisgICAgbV9wTGlzdC0+QWRkU3RyaW5nKHN0cmluZyk7CisgIH0KIH0KIAotQ1BERl9SZWN0IENQV0xfTGlzdEJveDo6R2V0Rm9jdXNSZWN0KCkgY29uc3QKLXsKLQlpZiAobV9wTGlzdCAmJiBtX3BMaXN0LT5Jc011bHRpcGxlU2VsKCkpCi0JewotCQlDUERGX1JlY3QgcmNDYXJldCA9IG1fcExpc3QtPkdldEl0ZW1SZWN0KG1fcExpc3QtPkdldENhcmV0KCkpOwotCQlyY0NhcmV0LkludGVyc2VjdChHZXRDbGllbnRSZWN0KCkpOwotCQlyZXR1cm4gcmNDYXJldDsKLQl9CitDRlhfV2lkZVN0cmluZyBDUFdMX0xpc3RCb3g6OkdldFRleHQoKSBjb25zdCB7CisgIGlmIChtX3BMaXN0KQorICAgIHJldHVybiBtX3BMaXN0LT5HZXRUZXh0KCk7CiAKLQlyZXR1cm4gQ1BXTF9XbmQ6OkdldEZvY3VzUmVjdCgpOworICByZXR1cm4gTCIiOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6QWRkU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpCi17Ci0JaWYgKG1fcExpc3QpCi0JewotCQltX3BMaXN0LT5BZGRTdHJpbmcoc3RyaW5nKTsKLQl9Cit2b2lkIENQV0xfTGlzdEJveDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIGlmIChtX3BMaXN0KQorICAgIG1fcExpc3QtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQV0xfTGlzdEJveDo6R2V0VGV4dCgpIGNvbnN0Ci17Ci0JaWYgKG1fcExpc3QpCi0JCXJldHVybiBtX3BMaXN0LT5HZXRUZXh0KCk7Ci0KLQlyZXR1cm4gTCIiOworRlhfRkxPQVQgQ1BXTF9MaXN0Qm94OjpHZXRGb250U2l6ZSgpIGNvbnN0IHsKKyAgaWYgKG1fcExpc3QpCisgICAgcmV0dXJuIG1fcExpc3QtPkdldEZvbnRTaXplKCk7CisgIHJldHVybiAwLjBmOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQotewotCWlmIChtX3BMaXN0KQotCQltX3BMaXN0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwordm9pZCBDUFdMX0xpc3RCb3g6OlNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgaWYgKG1fcExpc3QpCisgICAgbV9wTGlzdC0+U2VsZWN0KG5JdGVtSW5kZXgpOwogfQogCi1GWF9GTE9BVCBDUFdMX0xpc3RCb3g6OkdldEZvbnRTaXplKCkgY29uc3QKLXsKLQlpZiAobV9wTGlzdCkKLQkJcmV0dXJuIG1fcExpc3QtPkdldEZvbnRTaXplKCk7Ci0JcmV0dXJuIDAuMGY7Cit2b2lkIENQV0xfTGlzdEJveDo6U2V0Q2FyZXQoaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIGlmIChtX3BMaXN0KQorICAgIG1fcExpc3QtPlNldENhcmV0KG5JdGVtSW5kZXgpOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6U2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkKLXsKLQlpZiAobV9wTGlzdCkKLQkJbV9wTGlzdC0+U2VsZWN0KG5JdGVtSW5kZXgpOwordm9pZCBDUFdMX0xpc3RCb3g6OlNldFRvcFZpc2libGVJbmRleChpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgaWYgKG1fcExpc3QpCisgICAgbV9wTGlzdC0+U2V0VG9wSXRlbShuSXRlbUluZGV4KTsKIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6OlNldENhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCkKLXsKLQlpZiAobV9wTGlzdCkKLQkJbV9wTGlzdC0+U2V0Q2FyZXQobkl0ZW1JbmRleCk7Cit2b2lkIENQV0xfTGlzdEJveDo6U2Nyb2xsVG9MaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgaWYgKG1fcExpc3QpCisgICAgbV9wTGlzdC0+U2Nyb2xsVG9MaXN0SXRlbShuSXRlbUluZGV4KTsKIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6OlNldFRvcFZpc2libGVJbmRleChpbnQzMl90IG5JdGVtSW5kZXgpCi17Ci0JaWYgKG1fcExpc3QpCi0JCW1fcExpc3QtPlNldFRvcEl0ZW0obkl0ZW1JbmRleCk7Cit2b2lkIENQV0xfTGlzdEJveDo6UmVzZXRDb250ZW50KCkgeworICBpZiAobV9wTGlzdCkKKyAgICBtX3BMaXN0LT5FbXB0eSgpOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6U2Nyb2xsVG9MaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpCi17Ci0JaWYgKG1fcExpc3QpCi0JCW1fcExpc3QtPlNjcm9sbFRvTGlzdEl0ZW0obkl0ZW1JbmRleCk7Cit2b2lkIENQV0xfTGlzdEJveDo6UmVzZXQoKSB7CisgIGlmIChtX3BMaXN0KQorICAgIG1fcExpc3QtPkNhbmNlbCgpOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6UmVzZXRDb250ZW50KCkKLXsKLQlpZiAobV9wTGlzdCkKLQkJbV9wTGlzdC0+RW1wdHkoKTsKK0ZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpJc011bHRpcGxlU2VsKCkgY29uc3QgeworICBpZiAobV9wTGlzdCkKKyAgICByZXR1cm4gbV9wTGlzdC0+SXNNdWx0aXBsZVNlbCgpOworCisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6OlJlc2V0KCkKLXsKLQlpZiAobV9wTGlzdCkKLQkJbV9wTGlzdC0+Q2FuY2VsKCk7CitpbnQzMl90IENQV0xfTGlzdEJveDo6R2V0Q2FyZXRJbmRleCgpIGNvbnN0IHsKKyAgaWYgKG1fcExpc3QpCisgICAgcmV0dXJuIG1fcExpc3QtPkdldENhcmV0KCk7CisKKyAgcmV0dXJuIC0xOwogfQogCi1GWF9CT09MIENQV0xfTGlzdEJveDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0Ci17Ci0JaWYgKG1fcExpc3QpCi0JCXJldHVybiBtX3BMaXN0LT5Jc011bHRpcGxlU2VsKCk7CitpbnQzMl90IENQV0xfTGlzdEJveDo6R2V0Q3VyU2VsKCkgY29uc3QgeworICBpZiAobV9wTGlzdCkKKyAgICByZXR1cm4gbV9wTGlzdC0+R2V0U2VsZWN0KCk7CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiAtMTsKIH0KIAotaW50MzJfdCBDUFdMX0xpc3RCb3g6OkdldENhcmV0SW5kZXgoKSBjb25zdAotewotCWlmIChtX3BMaXN0KQotCQlyZXR1cm4gbV9wTGlzdC0+R2V0Q2FyZXQoKTsKK0ZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0IHsKKyAgaWYgKG1fcExpc3QpCisgICAgcmV0dXJuIG1fcExpc3QtPklzSXRlbVNlbGVjdGVkKG5JdGVtSW5kZXgpOwogCi0JcmV0dXJuIC0xOworICByZXR1cm4gRkFMU0U7CiB9CiAKLWludDMyX3QgQ1BXTF9MaXN0Qm94OjpHZXRDdXJTZWwoKSBjb25zdAotewotCWlmIChtX3BMaXN0KQotCQlyZXR1cm4gbV9wTGlzdC0+R2V0U2VsZWN0KCk7CitpbnQzMl90IENQV0xfTGlzdEJveDo6R2V0VG9wVmlzaWJsZUluZGV4KCkgY29uc3QgeworICBpZiAobV9wTGlzdCkgeworICAgIG1fcExpc3QtPlNjcm9sbFRvTGlzdEl0ZW0obV9wTGlzdC0+R2V0Rmlyc3RTZWxlY3RlZCgpKTsKKyAgICByZXR1cm4gbV9wTGlzdC0+R2V0VG9wSXRlbSgpOworICB9CiAKLQlyZXR1cm4gLTE7CisgIHJldHVybiAtMTsKIH0KIAotRlhfQk9PTCBDUFdMX0xpc3RCb3g6OklzSXRlbVNlbGVjdGVkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QKLXsKLQlpZiAobV9wTGlzdCkKLQkJcmV0dXJuIG1fcExpc3QtPklzSXRlbVNlbGVjdGVkKG5JdGVtSW5kZXgpOworaW50MzJfdCBDUFdMX0xpc3RCb3g6OkdldENvdW50KCkgY29uc3QgeworICBpZiAobV9wTGlzdCkKKyAgICByZXR1cm4gbV9wTGlzdC0+R2V0Q291bnQoKTsKIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIDA7CiB9CiAKLWludDMyX3QgQ1BXTF9MaXN0Qm94OjpHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdAotewotCWlmIChtX3BMaXN0KQotCXsKLQkJbV9wTGlzdC0+U2Nyb2xsVG9MaXN0SXRlbShtX3BMaXN0LT5HZXRGaXJzdFNlbGVjdGVkKCkpOwotCQlyZXR1cm4gbV9wTGlzdC0+R2V0VG9wSXRlbSgpOwotCX0KK2ludDMyX3QgQ1BXTF9MaXN0Qm94OjpGaW5kTmV4dChpbnQzMl90IG5JbmRleCwgRlhfV0NIQVIgbkNoYXIpIGNvbnN0IHsKKyAgaWYgKG1fcExpc3QpCisgICAgcmV0dXJuIG1fcExpc3QtPkZpbmROZXh0KG5JbmRleCwgbkNoYXIpOwogCi0JcmV0dXJuIC0xOworICByZXR1cm4gbkluZGV4OwogfQogCi1pbnQzMl90IENQV0xfTGlzdEJveDo6R2V0Q291bnQoKSBjb25zdAotewotCWlmIChtX3BMaXN0KQotCQlyZXR1cm4gbV9wTGlzdC0+R2V0Q291bnQoKTsKK0NQREZfUmVjdCBDUFdMX0xpc3RCb3g6OkdldENvbnRlbnRSZWN0KCkgY29uc3QgeworICBpZiAobV9wTGlzdCkKKyAgICByZXR1cm4gbV9wTGlzdC0+R2V0Q29udGVudFJlY3QoKTsKIAotCXJldHVybiAwOworICByZXR1cm4gQ1BERl9SZWN0KCk7CiB9CiAKLWludDMyX3QgQ1BXTF9MaXN0Qm94OjpGaW5kTmV4dChpbnQzMl90IG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3QKLXsKLQlpZiAobV9wTGlzdCkKLQkJcmV0dXJuIG1fcExpc3QtPkZpbmROZXh0KG5JbmRleCxuQ2hhcik7CitGWF9GTE9BVCBDUFdMX0xpc3RCb3g6OkdldEZpcnN0SGVpZ2h0KCkgY29uc3QgeworICBpZiAobV9wTGlzdCkKKyAgICByZXR1cm4gbV9wTGlzdC0+R2V0Rmlyc3RIZWlnaHQoKTsKIAotCXJldHVybiBuSW5kZXg7CisgIHJldHVybiAwLjBmOwogfQogCi1DUERGX1JlY3QgQ1BXTF9MaXN0Qm94OjpHZXRDb250ZW50UmVjdCgpIGNvbnN0Ci17Ci0JaWYgKG1fcExpc3QpCi0JCXJldHVybiBtX3BMaXN0LT5HZXRDb250ZW50UmVjdCgpOwotCi0JcmV0dXJuIENQREZfUmVjdCgpOworQ1BERl9SZWN0IENQV0xfTGlzdEJveDo6R2V0TGlzdFJlY3QoKSBjb25zdCB7CisgIHJldHVybiBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdCgKKyAgICAgIEdldFdpbmRvd1JlY3QoKSwgKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpICsgR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7CiB9CiAKLUZYX0ZMT0FUIENQV0xfTGlzdEJveDo6R2V0Rmlyc3RIZWlnaHQoKSBjb25zdAotewotCWlmIChtX3BMaXN0KQotCQlyZXR1cm4gbV9wTGlzdC0+R2V0Rmlyc3RIZWlnaHQoKTsKK0ZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKCFtX3BMaXN0KQorICAgIHJldHVybiBGQUxTRTsKIAotCXJldHVybiAwLjBmOworICBpZiAoekRlbHRhIDwgMCkgeworICAgIG1fcExpc3QtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgfSBlbHNlIHsKKyAgICBtX3BMaXN0LT5PblZLX1VQKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICB9CisKKyAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICBPbk5vdGlmeVNlbENoYW5nZWQoRkFMU0UsIGJFeGl0LCBuRmxhZyk7CisgIHJldHVybiBUUlVFOwogfQotCi1DUERGX1JlY3QgQ1BXTF9MaXN0Qm94OjpHZXRMaXN0UmVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkrR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7Ci19Ci0KLUZYX0JPT0wJQ1BXTF9MaXN0Qm94OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOwotCi0JaWYgKHpEZWx0YSA8IDApCi0JewotCQltX3BMaXN0LT5PblZLX0RPV04oSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLQl9Ci0JZWxzZQotCXsKLQkJbV9wTGlzdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwotCX0KLQotCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQlPbk5vdGlmeVNlbENoYW5nZWQoRkFMU0UsYkV4aXQsIG5GbGFnKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmNwcAppbmRleCAzMDc3ZTYyLi5lMDFjZTVjIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmNwcApAQCAtMTAsMjM2ICsxMCwxOTkgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0xpc3RDdHJsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9MaXN0Q3RybDo6Q1BXTF9MaXN0Q3RybCgpIDoKLQltX3JjQ29udGVudCgwLDAsMCwwKSwKLQltX3B0U2Nyb2xsKDAsMCksCi0JbV9mSXRlbVNwYWNlKDAuMGYpLAotCW1fZlRvcFNwYWNlKDAuMGYpLAotCW1fZkJvdHRvbVNwYWNlKDAuMGYpCi17CitDUFdMX0xpc3RDdHJsOjpDUFdMX0xpc3RDdHJsKCkKKyAgICA6IG1fcmNDb250ZW50KDAsIDAsIDAsIDApLAorICAgICAgbV9wdFNjcm9sbCgwLCAwKSwKKyAgICAgIG1fZkl0ZW1TcGFjZSgwLjBmKSwKKyAgICAgIG1fZlRvcFNwYWNlKDAuMGYpLAorICAgICAgbV9mQm90dG9tU3BhY2UoMC4wZikge30KKworQ1BXTF9MaXN0Q3RybDo6fkNQV0xfTGlzdEN0cmwoKSB7fQorCit2b2lkIENQV0xfTGlzdEN0cmw6OlNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBtX3B0U2Nyb2xsID0gcG9pbnQ7CisKKyAgaWYgKG1fcHRTY3JvbGwueCA8IG1fcmNDb250ZW50LmxlZnQpCisgICAgbV9wdFNjcm9sbC54ID0gbV9yY0NvbnRlbnQubGVmdDsKKworICBpZiAobV9wdFNjcm9sbC54ID4gbV9yY0NvbnRlbnQucmlnaHQpCisgICAgbV9wdFNjcm9sbC54ID0gbV9yY0NvbnRlbnQucmlnaHQ7CisKKyAgaWYgKG1fcHRTY3JvbGwueSA+IG1fcmNDb250ZW50LnRvcCkKKyAgICBtX3B0U2Nyb2xsLnkgPSBtX3JjQ29udGVudC50b3A7CisKKyAgaWYgKG1fcHRTY3JvbGwueSA8IG1fcmNDb250ZW50LmJvdHRvbSkKKyAgICBtX3B0U2Nyb2xsLnkgPSBtX3JjQ29udGVudC5ib3R0b207CiB9CiAKLUNQV0xfTGlzdEN0cmw6On5DUFdMX0xpc3RDdHJsKCkKLXsKK0NQREZfUG9pbnQgQ1BXTF9MaXN0Q3RybDo6R2V0U2Nyb2xsUG9zKCkgY29uc3QgeworICByZXR1cm4gbV9wdFNjcm9sbDsKIH0KIAotdm9pZCBDUFdMX0xpc3RDdHJsOjpTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JbV9wdFNjcm9sbCA9IHBvaW50OwotCi0JaWYgKG1fcHRTY3JvbGwueCA8IG1fcmNDb250ZW50LmxlZnQpCi0JCW1fcHRTY3JvbGwueCA9IG1fcmNDb250ZW50LmxlZnQ7Ci0KLQlpZiAobV9wdFNjcm9sbC54ID4gbV9yY0NvbnRlbnQucmlnaHQpCi0JCW1fcHRTY3JvbGwueCA9IG1fcmNDb250ZW50LnJpZ2h0OwotCi0JaWYgKG1fcHRTY3JvbGwueSA+IG1fcmNDb250ZW50LnRvcCkKLQkJbV9wdFNjcm9sbC55ID0gbV9yY0NvbnRlbnQudG9wOwotCi0JaWYgKG1fcHRTY3JvbGwueSA8IG1fcmNDb250ZW50LmJvdHRvbSkKLQkJbV9wdFNjcm9sbC55ID0gbV9yY0NvbnRlbnQuYm90dG9tOworQ1BERl9SZWN0IENQV0xfTGlzdEN0cmw6OkdldFNjcm9sbEFyZWEoKSBjb25zdCB7CisgIHJldHVybiBtX3JjQ29udGVudDsKIH0KIAotQ1BERl9Qb2ludCBDUFdMX0xpc3RDdHJsOjpHZXRTY3JvbGxQb3MoKSBjb25zdAotewotCXJldHVybiBtX3B0U2Nyb2xsOwordm9pZCBDUFdMX0xpc3RDdHJsOjpSZXNldEZhY2UoKSB7CisgIFJlc2V0QWxsKEZBTFNFLCAwKTsKIH0KIAotQ1BERl9SZWN0IENQV0xfTGlzdEN0cmw6OkdldFNjcm9sbEFyZWEoKSBjb25zdAotewotCXJldHVybiBtX3JjQ29udGVudDsKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVzZXRDb250ZW50KGludDMyX3QgblN0YXJ0KSB7CisgIGlmIChuU3RhcnQgPCAwKQorICAgIG5TdGFydCA9IDA7CisgIGlmIChuU3RhcnQgPj0gMCAmJiBuU3RhcnQgPCBtX2FDaGlsZHJlbi5HZXRTaXplKCkpCisgICAgUmVzZXRBbGwoVFJVRSwgblN0YXJ0KTsKIH0KIAotdm9pZCBDUFdMX0xpc3RDdHJsOjpSZXNldEZhY2UoKQotewotCVJlc2V0QWxsKEZBTFNFLCAwKTsKK0ZYX0ZMT0FUIENQV0xfTGlzdEN0cmw6OkdldENvbnRlbnRzSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKSB7CisgIEZYX0ZMT0FUIGZSZXQgPSBtX2ZUb3BTcGFjZTsKKworICBGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKKworICBpZiAoZkxpbWl0V2lkdGggPiBmQm9yZGVyV2lkdGggKiAyKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpIHsKKyAgICAgICAgRlhfRkxPQVQgZkxlZnQgPSBwQ2hpbGQtPkdldEl0ZW1MZWZ0TWFyZ2luKCk7CisgICAgICAgIEZYX0ZMT0FUIGZSaWdodCA9IHBDaGlsZC0+R2V0SXRlbVJpZ2h0TWFyZ2luKCk7CisKKyAgICAgICAgZlJldCArPSBwQ2hpbGQtPkdldEl0ZW1IZWlnaHQoZkxpbWl0V2lkdGggLSBmQm9yZGVyV2lkdGggKiAyIC0gZkxlZnQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmlnaHQpOworICAgICAgICBmUmV0ICs9IG1fZkl0ZW1TcGFjZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmUmV0IC09IG1fZkl0ZW1TcGFjZTsKKyAgfQorCisgIGZSZXQgKz0gbV9mQm90dG9tU3BhY2U7CisKKyAgcmV0dXJuIGZSZXQ7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVzZXRDb250ZW50KGludDMyX3QgblN0YXJ0KQotewotCWlmIChuU3RhcnQgPCAwKQotCQluU3RhcnQgPSAwOwotCWlmIChuU3RhcnQgPj0gMCAmJiBuU3RhcnQgPCBtX2FDaGlsZHJlbi5HZXRTaXplKCkpCi0JCVJlc2V0QWxsKFRSVUUsIG5TdGFydCk7Cit2b2lkIENQV0xfTGlzdEN0cmw6OlJlc2V0QWxsKEZYX0JPT0wgYk1vdmUsIGludDMyX3QgblN0YXJ0KSB7CisgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKworICBGWF9GTE9BVCBmV2lkdGggPSByY0NsaWVudC5XaWR0aCgpOworCisgIEZYX0ZMT0FUIGZ5ID0gMC4wZiAtIG1fZlRvcFNwYWNlOworCisgIGlmIChuU3RhcnQgLSAxID49IDAgJiYgblN0YXJ0IC0gMSA8IG1fYUNoaWxkcmVuLkdldFNpemUoKSkKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KG5TdGFydCAtIDEpKQorICAgICAgZnkgPSBwQ2hpbGQtPkdldFdpbmRvd1JlY3QoKS5ib3R0b20gLSBtX2ZJdGVtU3BhY2U7CisKKyAgZm9yIChpbnQzMl90IGkgPSBuU3RhcnQsIHN6ID0gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpIHsKKyAgICAgIEZYX0ZMT0FUIGZMZWZ0ID0gcENoaWxkLT5HZXRJdGVtTGVmdE1hcmdpbigpOworICAgICAgRlhfRkxPQVQgZlJpZ2h0ID0gcENoaWxkLT5HZXRJdGVtUmlnaHRNYXJnaW4oKTsKKworICAgICAgcENoaWxkLT5TZXRDaGlsZE1hdHJpeChDUERGX01hdHJpeCgxLCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5sZWZ0IC0gbV9wdFNjcm9sbC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC50b3AgLSBtX3B0U2Nyb2xsLnkpKTsKKworICAgICAgaWYgKGJNb3ZlKSB7CisgICAgICAgIEZYX0ZMT0FUIGZJdGVtSGVpZ2h0ID0gcENoaWxkLT5HZXRJdGVtSGVpZ2h0KGZXaWR0aCAtIGZMZWZ0IC0gZlJpZ2h0KTsKKyAgICAgICAgcENoaWxkLT5Nb3ZlKENQREZfUmVjdChmTGVmdCwgZnkgLSBmSXRlbUhlaWdodCwgZldpZHRoIC0gZlJpZ2h0LCBmeSksCisgICAgICAgICAgICAgICAgICAgICBUUlVFLCBGQUxTRSk7CisgICAgICAgIGZ5IC09IGZJdGVtSGVpZ2h0OworICAgICAgICBmeSAtPSBtX2ZJdGVtU3BhY2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnkgKz0gbV9mSXRlbVNwYWNlOworCisgIGZ5IC09IG1fZkJvdHRvbVNwYWNlOworCisgIGlmIChiTW92ZSkgeworICAgIG1fcmNDb250ZW50LmxlZnQgPSAwOworICAgIG1fcmNDb250ZW50LnRvcCA9IDA7CisgICAgbV9yY0NvbnRlbnQucmlnaHQgPSBmV2lkdGg7CisgICAgbV9yY0NvbnRlbnQuYm90dG9tID0gZnk7CisgIH0KIH0KIAotRlhfRkxPQVQgQ1BXTF9MaXN0Q3RybDo6R2V0Q29udGVudHNIZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpCi17Ci0JRlhfRkxPQVQgZlJldCA9IG1fZlRvcFNwYWNlOwotCi0JRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0KLQlpZiAoZkxpbWl0V2lkdGggPiBmQm9yZGVyV2lkdGgqIDIpCi0JewotCQlmb3IgKGludDMyX3QgaT0wLHN6PW1fYUNoaWxkcmVuLkdldFNpemUoKTsgaTxzejsgaSsrKQotCQl7Ci0JCQlpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotCQkJewotCQkJCUZYX0ZMT0FUIGZMZWZ0ID0gcENoaWxkLT5HZXRJdGVtTGVmdE1hcmdpbigpOwotCQkJCUZYX0ZMT0FUIGZSaWdodCA9IHBDaGlsZC0+R2V0SXRlbVJpZ2h0TWFyZ2luKCk7Ci0KLQkJCQlmUmV0ICs9IHBDaGlsZC0+R2V0SXRlbUhlaWdodChmTGltaXRXaWR0aCAtIGZCb3JkZXJXaWR0aCogMiAtIGZMZWZ0IC0gZlJpZ2h0KTsKLQkJCQlmUmV0ICs9IG1fZkl0ZW1TcGFjZTsKLQkJCX0KLQkJfQotCi0JCWZSZXQgLT0gbV9mSXRlbVNwYWNlOwotCX0KLQotCWZSZXQgKz0gbV9mQm90dG9tU3BhY2U7Ci0KLQlyZXR1cm4gZlJldDsKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6U2V0SXRlbVNwYWNlKEZYX0ZMT0FUIGZTcGFjZSkgeworICBtX2ZJdGVtU3BhY2UgPSBmU3BhY2U7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVzZXRBbGwoRlhfQk9PTCBiTW92ZSwgaW50MzJfdCBuU3RhcnQpCi17Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCi0JRlhfRkxPQVQgZldpZHRoID0gcmNDbGllbnQuV2lkdGgoKTsKLQotCUZYX0ZMT0FUIGZ5ID0gMC4wZiAtIG1fZlRvcFNwYWNlOwotCi0JaWYgKG5TdGFydC0xID49IDAgJiYgblN0YXJ0LTEgPCBtX2FDaGlsZHJlbi5HZXRTaXplKCkpCi0JCWlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoblN0YXJ0LTEpKQotCQkJZnkgPSBwQ2hpbGQtPkdldFdpbmRvd1JlY3QoKS5ib3R0b20gLSBtX2ZJdGVtU3BhY2U7Ci0KLQlmb3IgKGludDMyX3QgaT1uU3RhcnQsc3o9bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JewotCQlpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotCQl7Ci0JCQlGWF9GTE9BVCBmTGVmdCA9IHBDaGlsZC0+R2V0SXRlbUxlZnRNYXJnaW4oKTsKLQkJCUZYX0ZMT0FUIGZSaWdodCA9IHBDaGlsZC0+R2V0SXRlbVJpZ2h0TWFyZ2luKCk7Ci0KLQkJCXBDaGlsZC0+U2V0Q2hpbGRNYXRyaXgoCi0JCQkJQ1BERl9NYXRyaXgoMSwwLDAsMSwKLQkJCQlyY0NsaWVudC5sZWZ0IC0gbV9wdFNjcm9sbC54LAotCQkJCXJjQ2xpZW50LnRvcCAtIG1fcHRTY3JvbGwueSkKLQkJCQkpOwotCi0JCQlpZiAoYk1vdmUpCi0JCQl7Ci0JCQkJRlhfRkxPQVQgZkl0ZW1IZWlnaHQgPSBwQ2hpbGQtPkdldEl0ZW1IZWlnaHQoZldpZHRoIC0gZkxlZnQgLSBmUmlnaHQpOwotCQkJCXBDaGlsZC0+TW92ZShDUERGX1JlY3QoZkxlZnQsIGZ5LWZJdGVtSGVpZ2h0LCBmV2lkdGggLSBmUmlnaHQsIGZ5KSwgVFJVRSwgRkFMU0UpOwotCQkJCWZ5IC09IGZJdGVtSGVpZ2h0OwotCQkJCWZ5IC09IG1fZkl0ZW1TcGFjZTsKLQkJCX0KLQkJfQotCX0KLQotCWZ5ICs9IG1fZkl0ZW1TcGFjZTsKLQotCWZ5IC09IG1fZkJvdHRvbVNwYWNlOwotCi0JaWYgKGJNb3ZlKQotCXsKLQkJbV9yY0NvbnRlbnQubGVmdCA9IDA7Ci0JCW1fcmNDb250ZW50LnRvcCA9IDA7Ci0JCW1fcmNDb250ZW50LnJpZ2h0ID0gZldpZHRoOwotCQltX3JjQ29udGVudC5ib3R0b20gPSBmeTsKLQl9Cit2b2lkIENQV0xfTGlzdEN0cmw6OlNldFRvcFNwYWNlKEZYX0ZMT0FUIGZTcGFjZSkgeworICBtX2ZUb3BTcGFjZSA9IGZTcGFjZTsKIH0KIAotdm9pZCBDUFdMX0xpc3RDdHJsOjpTZXRJdGVtU3BhY2UoRlhfRkxPQVQgZlNwYWNlKQotewotCW1fZkl0ZW1TcGFjZSA9IGZTcGFjZTsKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6U2V0Qm90dG9tU3BhY2UoRlhfRkxPQVQgZlNwYWNlKSB7CisgIG1fZkJvdHRvbVNwYWNlID0gZlNwYWNlOwogfQogCi12b2lkIENQV0xfTGlzdEN0cmw6OlNldFRvcFNwYWNlKEZYX0ZMT0FUIGZTcGFjZSkKLXsKLQltX2ZUb3BTcGFjZSA9IGZTcGFjZTsKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVQb3NDaGlsZFduZCgpIHsKKyAgUmVzZXRGYWNlKCk7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Q3RybDo6U2V0Qm90dG9tU3BhY2UoRlhfRkxPQVQgZlNwYWNlKQotewotCW1fZkJvdHRvbVNwYWNlID0gZlNwYWNlOwordm9pZCBDUFdMX0xpc3RDdHJsOjpEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBwRGV2aWNlLT5TYXZlU3RhdGUoKTsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICBDUERGX1JlY3QgcmNUZW1wID0gcmNDbGllbnQ7CisgIHBVc2VyMkRldmljZS0+VHJhbnNmb3JtUmVjdChyY1RlbXApOworICBGWF9SRUNUIHJjQ2xpcCgoaW50MzJfdClyY1RlbXAubGVmdCwgKGludDMyX3QpcmNUZW1wLmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgKGludDMyX3QpcmNUZW1wLnJpZ2h0LCAoaW50MzJfdClyY1RlbXAudG9wKTsKKworICBwRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJjQ2xpcCk7CisKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICBDUERGX1JlY3QgcmNDaGlsZCA9IHBDaGlsZC0+Q2hpbGRUb1BhcmVudChwQ2hpbGQtPkdldFdpbmRvd1JlY3QoKSk7CisgICAgICBpZiAoIShyY0NoaWxkLnRvcCA8IHJjQ2xpZW50LmJvdHRvbSB8fCByY0NoaWxkLmJvdHRvbSA+IHJjQ2xpZW50LnRvcCkpIHsKKyAgICAgICAgQ1BERl9NYXRyaXggbXQgPSBwQ2hpbGQtPkdldENoaWxkTWF0cml4KCk7CisgICAgICAgIGlmIChtdC5Jc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICBwQ2hpbGQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOworICAgICAgICAgIHBDaGlsZC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgJm10KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogfQogCi12b2lkIENQV0xfTGlzdEN0cmw6OlJlUG9zQ2hpbGRXbmQoKQotewotCVJlc2V0RmFjZSgpOworaW50MzJfdCBDUFdMX0xpc3RDdHJsOjpHZXRJdGVtSW5kZXgoQ1BXTF9XbmQqIHBJdGVtKSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKHBJdGVtID09IG1fYUNoaWxkcmVuLkdldEF0KGkpKQorICAgICAgcmV0dXJuIGk7CisgIH0KKworICByZXR1cm4gLTE7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Q3RybDo6RHJhd0NoaWxkQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCXBEZXZpY2UtPlNhdmVTdGF0ZSgpOwotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQlDUERGX1JlY3QgcmNUZW1wID0gcmNDbGllbnQ7Ci0JcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm1SZWN0KHJjVGVtcCk7Ci0JRlhfUkVDVCByY0NsaXAoKGludDMyX3QpcmNUZW1wLmxlZnQsCi0JCShpbnQzMl90KXJjVGVtcC5ib3R0b20sCi0JCShpbnQzMl90KXJjVGVtcC5yaWdodCwKLQkJKGludDMyX3QpcmNUZW1wLnRvcCk7CitDUERGX1BvaW50IENQV0xfTGlzdEN0cmw6OkluVG9PdXQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JcERldmljZS0+U2V0Q2xpcF9SZWN0KCZyY0NsaXApOwotCi0JZm9yIChpbnQzMl90IGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotCQl7Ci0JCQlDUERGX1JlY3QgcmNDaGlsZCA9IHBDaGlsZC0+Q2hpbGRUb1BhcmVudChwQ2hpbGQtPkdldFdpbmRvd1JlY3QoKSk7Ci0JCQlpZiAoIShyY0NoaWxkLnRvcCA8IHJjQ2xpZW50LmJvdHRvbSB8fCByY0NoaWxkLmJvdHRvbSA+IHJjQ2xpZW50LnRvcCkpCi0JCQl7Ci0JCQkJQ1BERl9NYXRyaXggbXQgPSBwQ2hpbGQtPkdldENoaWxkTWF0cml4KCk7Ci0JCQkJaWYgKG10LklzSWRlbnRpdHkoKSkKLQkJCQl7Ci0JCQkJCXBDaGlsZC0+RHJhd0FwcGVhcmFuY2UocERldmljZSxwVXNlcjJEZXZpY2UpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQltdC5Db25jYXQoKnBVc2VyMkRldmljZSk7Ci0JCQkJCXBDaGlsZC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwmbXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOworICByZXR1cm4gQ1BERl9Qb2ludChwb2ludC54ICsgcmNDbGllbnQubGVmdCAtIG1fcHRTY3JvbGwueCwKKyAgICAgICAgICAgICAgICAgICAgcG9pbnQueSArIHJjQ2xpZW50LnRvcCAtIG1fcHRTY3JvbGwueSk7CiB9CiAKLWludDMyX3QgQ1BXTF9MaXN0Q3RybDo6R2V0SXRlbUluZGV4KENQV0xfV25kKiBwSXRlbSkKLXsKLQlmb3IgKGludDMyX3QgaT0wLCBzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChwSXRlbSA9PSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJCXJldHVybiBpOwotCX0KK0NQREZfUG9pbnQgQ1BXTF9MaXN0Q3RybDo6T3V0VG9Jbihjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKLQlyZXR1cm4gLTE7CisgIHJldHVybiBDUERGX1BvaW50KHBvaW50LnggLSByY0NsaWVudC5sZWZ0ICsgbV9wdFNjcm9sbC54LAorICAgICAgICAgICAgICAgICAgICBwb2ludC55IC0gcmNDbGllbnQudG9wICsgbV9wdFNjcm9sbC55KTsKIH0KIAotQ1BERl9Qb2ludCBDUFdMX0xpc3RDdHJsOjpJblRvT3V0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdAotewotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKK0NQREZfUmVjdCBDUFdMX0xpc3RDdHJsOjpJblRvT3V0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKLQlyZXR1cm4gQ1BERl9Qb2ludChwb2ludC54ICsgcmNDbGllbnQubGVmdCAtIG1fcHRTY3JvbGwueCwKLQkJcG9pbnQueSArIHJjQ2xpZW50LnRvcCAtIG1fcHRTY3JvbGwueSk7CisgIHJldHVybiBDUERGX1JlY3QocmVjdC5sZWZ0ICsgcmNDbGllbnQubGVmdCAtIG1fcHRTY3JvbGwueCwKKyAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSArIHJjQ2xpZW50LnRvcCAtIG1fcHRTY3JvbGwueSwKKyAgICAgICAgICAgICAgICAgICByZWN0LnJpZ2h0ICsgcmNDbGllbnQubGVmdCAtIG1fcHRTY3JvbGwueCwKKyAgICAgICAgICAgICAgICAgICByZWN0LnRvcCArIHJjQ2xpZW50LnRvcCAtIG1fcHRTY3JvbGwueSk7CiB9CiAKLUNQREZfUG9pbnQgQ1BXTF9MaXN0Q3RybDo6T3V0VG9Jbihjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QKLXsKLQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CitDUERGX1JlY3QgQ1BXTF9MaXN0Q3RybDo6T3V0VG9Jbihjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCAtIHJjQ2xpZW50LmxlZnQgKyBtX3B0U2Nyb2xsLngsCi0JCXBvaW50LnkgLSByY0NsaWVudC50b3AgKyBtX3B0U2Nyb2xsLnkpOworICByZXR1cm4gQ1BERl9SZWN0KHJlY3QubGVmdCAtIHJjQ2xpZW50LmxlZnQgKyBtX3B0U2Nyb2xsLngsCisgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gLSByY0NsaWVudC50b3AgKyBtX3B0U2Nyb2xsLnksCisgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgKyBtX3B0U2Nyb2xsLngsCisgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgLSByY0NsaWVudC50b3AgKyBtX3B0U2Nyb2xsLnkpOwogfQotCi1DUERGX1JlY3QgQ1BXTF9MaXN0Q3RybDo6SW5Ub091dChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0Ci17Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCi0JcmV0dXJuIENQREZfUmVjdChyZWN0LmxlZnQgKyByY0NsaWVudC5sZWZ0IC0gbV9wdFNjcm9sbC54LAotCQlyZWN0LmJvdHRvbSArIHJjQ2xpZW50LnRvcCAtIG1fcHRTY3JvbGwueSwKLQkJcmVjdC5yaWdodCArIHJjQ2xpZW50LmxlZnQgLSBtX3B0U2Nyb2xsLngsCi0JCXJlY3QudG9wICsgcmNDbGllbnQudG9wIC0gbV9wdFNjcm9sbC55KTsKLX0KLQotQ1BERl9SZWN0IENQV0xfTGlzdEN0cmw6Ok91dFRvSW4oY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdAotewotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotCXJldHVybiBDUERGX1JlY3QocmVjdC5sZWZ0IC0gcmNDbGllbnQubGVmdCArIG1fcHRTY3JvbGwueCwKLQkJcmVjdC5ib3R0b20gLSByY0NsaWVudC50b3AgKyBtX3B0U2Nyb2xsLnksCi0JCXJlY3QucmlnaHQgLSByY0NsaWVudC5sZWZ0ICsgbV9wdFNjcm9sbC54LAotCQlyZWN0LnRvcCAtIHJjQ2xpZW50LnRvcCArIG1fcHRTY3JvbGwueSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTm90ZS5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX05vdGUuY3BwCmluZGV4IDdlZDExMTUuLjZiMDVkZGUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTm90ZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Ob3RlLmNwcApAQCAtMTgsMTc1MyArMTgsMTU5OCBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9DYXJldC5oIgogCi0jZGVmaW5lIFBPUFVQX0lURU1fSEVBRF9CT1RUT00JCQkJCTMuMGYKLSNkZWZpbmUgUE9QVVBfSVRFTV9CT1RUT01XSURUSAkJCQkJMS4wZgotI2RlZmluZSBQT1BVUF9JVEVNX1NJREVNQVJHSU4JCQkJCTMuMGYKLSNkZWZpbmUgUE9QVVBfSVRFTV9TUEFDRQkJCQkJCTQuMGYKLSNkZWZpbmUgUE9QVVBfSVRFTV9URVhUX0lOREVOVAkJCQkJMi4wZgotI2RlZmluZSBQT1BVUF9JVEVNX0JPUkRFUkNPTE9SCQkJCQlDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDgwLzI1NS4wZiwgODAvMjU1LjBmLCA4MC8yNTUuMGYpCisjZGVmaW5lIFBPUFVQX0lURU1fSEVBRF9CT1RUT00gMy4wZgorI2RlZmluZSBQT1BVUF9JVEVNX0JPVFRPTVdJRFRIIDEuMGYKKyNkZWZpbmUgUE9QVVBfSVRFTV9TSURFTUFSR0lOIDMuMGYKKyNkZWZpbmUgUE9QVVBfSVRFTV9TUEFDRSA0LjBmCisjZGVmaW5lIFBPUFVQX0lURU1fVEVYVF9JTkRFTlQgMi4wZgorI2RlZmluZSBQT1BVUF9JVEVNX0JPUkRFUkNPTE9SIFwKKyAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCA4MCAvIDI1NS4wZiwgODAgLyAyNTUuMGYsIDgwIC8gMjU1LjBmKQogCi0jZGVmaW5lIElzRmxvYXRaZXJvKGYpCQkJCQkJKChmKSA8IDAuMDAwMSAmJiAoZikgPiAtMC4wMDAxKQotI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLGZiKQkJCQkoKGZhKSA+IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKLSNkZWZpbmUgSXNGbG9hdFNtYWxsZXIoZmEsZmIpCQkJCSgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsZmIpCQkJCQlJc0Zsb2F0WmVybygoZmEpLShmYikpCisjZGVmaW5lIElzRmxvYXRaZXJvKGYpICgoZikgPCAwLjAwMDEgJiYgKGYpID4gLTAuMDAwMSkKKyNkZWZpbmUgSXNGbG9hdEJpZ2dlcihmYSwgZmIpICgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSwgZmIpICgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsIGZiKSBJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkKIAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX05vdGVfT3B0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZV9PcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NQV0xfTm90ZV9PcHRpb25zOjpDUFdMX05vdGVfT3B0aW9ucygpIDogbV9wVGV4dChOVUxMKSB7fQogCi1DUFdMX05vdGVfT3B0aW9uczo6Q1BXTF9Ob3RlX09wdGlvbnMoKSA6IG1fcFRleHQoTlVMTCkKLXsKLX0KLQotQ1BXTF9Ob3RlX09wdGlvbnM6On5DUFdMX05vdGVfT3B0aW9ucygpCi17Ci19CitDUFdMX05vdGVfT3B0aW9uczo6fkNQV0xfTm90ZV9PcHRpb25zKCkge30KIAotdm9pZCBDUFdMX05vdGVfT3B0aW9uczo6U2V0VGV4dENvbG9yKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcikKLXsKLQlDUFdMX1duZDo6U2V0VGV4dENvbG9yKGNvbG9yKTsKK3ZvaWQgQ1BXTF9Ob3RlX09wdGlvbnM6OlNldFRleHRDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgeworICBDUFdMX1duZDo6U2V0VGV4dENvbG9yKGNvbG9yKTsKIAotCWlmIChtX3BUZXh0KQotCQltX3BUZXh0LT5TZXRUZXh0Q29sb3IoY29sb3IpOworICBpZiAobV9wVGV4dCkKKyAgICBtX3BUZXh0LT5TZXRUZXh0Q29sb3IoY29sb3IpOwogfQogCi12b2lkIENQV0xfTm90ZV9PcHRpb25zOjpSZVBvc0NoaWxkV25kKCkKLXsKLQlpZiAoSXNWYWxpZCgpKQotCXsKLQkJQVNTRVJUKG1fcFRleHQgIT0gTlVMTCk7Cit2b2lkIENQV0xfTm90ZV9PcHRpb25zOjpSZVBvc0NoaWxkV25kKCkgeworICBpZiAoSXNWYWxpZCgpKSB7CisgICAgQVNTRVJUKG1fcFRleHQgIT0gTlVMTCk7CiAKLQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICAgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKIAotCQlpZiAocmNDbGllbnQuV2lkdGgoKSA+IDE1LjBmKQotCQl7Ci0JCQlyY0NsaWVudC5yaWdodCAtPSAxNS4wZjsKLQkJCW1fcFRleHQtPk1vdmUocmNDbGllbnQsIFRSVUUsIEZBTFNFKTsKLQkJCW1fcFRleHQtPlNldFZpc2libGUoVFJVRSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQltX3BUZXh0LT5Nb3ZlKENQREZfUmVjdCgwLDAsMCwwKSwgVFJVRSwgRkFMU0UpOwotCQkJbV9wVGV4dC0+U2V0VmlzaWJsZShGQUxTRSk7Ci0JCX0KLQl9CisgICAgaWYgKHJjQ2xpZW50LldpZHRoKCkgPiAxNS4wZikgeworICAgICAgcmNDbGllbnQucmlnaHQgLT0gMTUuMGY7CisgICAgICBtX3BUZXh0LT5Nb3ZlKHJjQ2xpZW50LCBUUlVFLCBGQUxTRSk7CisgICAgICBtX3BUZXh0LT5TZXRWaXNpYmxlKFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICBtX3BUZXh0LT5Nb3ZlKENQREZfUmVjdCgwLCAwLCAwLCAwKSwgVFJVRSwgRkFMU0UpOworICAgICAgbV9wVGV4dC0+U2V0VmlzaWJsZShGQUxTRSk7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlX09wdGlvbnM6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCW1fcFRleHQgPSBuZXcgQ1BXTF9MYWJlbDsKLQlQV0xfQ1JFQVRFUEFSQU0gdGNwID0gY3A7Ci0JdGNwLnBQYXJlbnRXbmQgPSB0aGlzOwotCXRjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEU7Ci0JbV9wVGV4dC0+Q3JlYXRlKHRjcCk7Cit2b2lkIENQV0xfTm90ZV9PcHRpb25zOjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIG1fcFRleHQgPSBuZXcgQ1BXTF9MYWJlbDsKKyAgUFdMX0NSRUFURVBBUkFNIHRjcCA9IGNwOworICB0Y3AucFBhcmVudFduZCA9IHRoaXM7CisgIHRjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEU7CisgIG1fcFRleHQtPkNyZWF0ZSh0Y3ApOwogfQogCi12b2lkIENQV0xfTm90ZV9PcHRpb25zOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCkKLXsKLQltX3BUZXh0LT5TZXRUZXh0KHNUZXh0LmNfc3RyKCkpOwordm9pZCBDUFdMX05vdGVfT3B0aW9uczo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpIHsKKyAgbV9wVGV4dC0+U2V0VGV4dChzVGV4dC5jX3N0cigpKTsKIH0KIAotdm9pZCBDUFdMX05vdGVfT3B0aW9uczo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCi17Ci0JQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOwordm9pZCBDUFdMX05vdGVfT3B0aW9uczo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7CiAKLQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0JcmNDbGllbnQubGVmdCA9IHJjQ2xpZW50LnJpZ2h0IC0gMTUuMGY7CisgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKyAgcmNDbGllbnQubGVmdCA9IHJjQ2xpZW50LnJpZ2h0IC0gMTUuMGY7CiAKLQlDUERGX1BvaW50IHB0Q2VudGVyID0gQ1BERl9Qb2ludCgocmNDbGllbnQubGVmdCArIHJjQ2xpZW50LnJpZ2h0KSAqIDAuNWYsIChyY0NsaWVudC50b3AgKyByY0NsaWVudC5ib3R0b20pICogMC41Zik7CisgIENQREZfUG9pbnQgcHRDZW50ZXIgPSBDUERGX1BvaW50KChyY0NsaWVudC5sZWZ0ICsgcmNDbGllbnQucmlnaHQpICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJjQ2xpZW50LnRvcCArIHJjQ2xpZW50LmJvdHRvbSkgKiAwLjVmKTsKIAotCUNQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSAyLjBmLCBwdENlbnRlci55ICsgMi4wZiAqIDAuNWYpOwotCUNQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyAyLjBmLCBwdENlbnRlci55ICsgMi4wZiAqIDAuNWYpOwotCUNQREZfUG9pbnQgcHQzKHB0Q2VudGVyLngsIHB0Q2VudGVyLnkgLSAzLjBmICogMC41Zik7CisgIENQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSAyLjBmLCBwdENlbnRlci55ICsgMi4wZiAqIDAuNWYpOworICBDUERGX1BvaW50IHB0MihwdENlbnRlci54ICsgMi4wZiwgcHRDZW50ZXIueSArIDIuMGYgKiAwLjVmKTsKKyAgQ1BERl9Qb2ludCBwdDMocHRDZW50ZXIueCwgcHRDZW50ZXIueSAtIDMuMGYgKiAwLjVmKTsKIAotCUNGWF9QYXRoRGF0YSBwYXRoOworICBDRlhfUGF0aERhdGEgcGF0aDsKIAotCXBhdGguU2V0UG9pbnRDb3VudCg0KTsKLQlwYXRoLlNldFBvaW50KDAsIHB0MS54LCBwdDEueSwgRlhQVF9NT1ZFVE8pOwotCXBhdGguU2V0UG9pbnQoMSwgcHQyLngsIHB0Mi55LCBGWFBUX0xJTkVUTyk7Ci0JcGF0aC5TZXRQb2ludCgyLCBwdDMueCwgcHQzLnksIEZYUFRfTElORVRPKTsKLQlwYXRoLlNldFBvaW50KDMsIHB0MS54LCBwdDEueSwgRlhQVF9MSU5FVE8pOworICBwYXRoLlNldFBvaW50Q291bnQoNCk7CisgIHBhdGguU2V0UG9pbnQoMCwgcHQxLngsIHB0MS55LCBGWFBUX01PVkVUTyk7CisgIHBhdGguU2V0UG9pbnQoMSwgcHQyLngsIHB0Mi55LCBGWFBUX0xJTkVUTyk7CisgIHBhdGguU2V0UG9pbnQoMiwgcHQzLngsIHB0My55LCBGWFBUX0xJTkVUTyk7CisgIHBhdGguU2V0UG9pbnQoMywgcHQxLngsIHB0MS55LCBGWFBUX0xJTkVUTyk7CiAKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLAotCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSxHZXRUcmFuc3BhcmVuY3koKSksCi0JCTAsIEZYRklMTF9BTFRFUk5BVEUpOworICBwRGV2aWNlLT5EcmF3UGF0aCgKKyAgICAgICZwYXRoLCBwVXNlcjJEZXZpY2UsIE5VTEwsCisgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpLCAwLAorICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CiB9CiAKLUNQREZfUmVjdCBDUFdMX05vdGVfT3B0aW9uczo6R2V0Q29udGVudFJlY3QoKSBjb25zdAotewotCUFTU0VSVChtX3BUZXh0ICE9IE5VTEwpOworQ1BERl9SZWN0IENQV0xfTm90ZV9PcHRpb25zOjpHZXRDb250ZW50UmVjdCgpIGNvbnN0IHsKKyAgQVNTRVJUKG1fcFRleHQgIT0gTlVMTCk7CiAKLQlDUERGX1JlY3QgcmNUZXh0ID0gbV9wVGV4dC0+R2V0Q29udGVudFJlY3QoKTsKLQlyY1RleHQucmlnaHQgKz0gMTUuMGY7Ci0JcmV0dXJuIHJjVGV4dDsKKyAgQ1BERl9SZWN0IHJjVGV4dCA9IG1fcFRleHQtPkdldENvbnRlbnRSZWN0KCk7CisgIHJjVGV4dC5yaWdodCArPSAxNS4wZjsKKyAgcmV0dXJuIHJjVGV4dDsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX05vdGVfRWRpdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlX0VkaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAotQ1BXTF9Ob3RlX0VkaXQ6OkNQV0xfTm90ZV9FZGl0KCkgOiBtX2JFbmFibGVOb3RpZnkoVFJVRSksCi0JbV9mT2xkSXRlbUhlaWdodCgwLjBmKSwKLQltX2JTaXplQ2hhbmdlZChGQUxTRSksCi0JbV9mT2xkTWluKDAuMGYpLAotCW1fZk9sZE1heCgwLjBmKQotewotfQorQ1BXTF9Ob3RlX0VkaXQ6OkNQV0xfTm90ZV9FZGl0KCkKKyAgICA6IG1fYkVuYWJsZU5vdGlmeShUUlVFKSwKKyAgICAgIG1fZk9sZEl0ZW1IZWlnaHQoMC4wZiksCisgICAgICBtX2JTaXplQ2hhbmdlZChGQUxTRSksCisgICAgICBtX2ZPbGRNaW4oMC4wZiksCisgICAgICBtX2ZPbGRNYXgoMC4wZikge30KIAotQ1BXTF9Ob3RlX0VkaXQ6On5DUFdMX05vdGVfRWRpdCgpCi17Ci19CitDUFdMX05vdGVfRWRpdDo6fkNQV0xfTm90ZV9FZGl0KCkge30KIAotdm9pZCBDUFdMX05vdGVfRWRpdDo6UmVQb3NDaGlsZFduZCgpCi17Ci0JbV9iRW5hYmxlTm90aWZ5ID0gRkFMU0U7Ci0JQ1BXTF9FZGl0OjpSZVBvc0NoaWxkV25kKCk7Ci0JbV9iRW5hYmxlTm90aWZ5ID0gVFJVRTsKK3ZvaWQgQ1BXTF9Ob3RlX0VkaXQ6OlJlUG9zQ2hpbGRXbmQoKSB7CisgIG1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOworICBDUFdMX0VkaXQ6OlJlUG9zQ2hpbGRXbmQoKTsKKyAgbV9iRW5hYmxlTm90aWZ5ID0gVFJVRTsKIAotCW1fZk9sZEl0ZW1IZWlnaHQgPSBHZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOworICBtX2ZPbGRJdGVtSGVpZ2h0ID0gR2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIH0KIAotdm9pZCBDUFdMX05vdGVfRWRpdDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KQotewotCW1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOwotCUNQV0xfRWRpdDo6U2V0VGV4dChjc1RleHQpOwotCW1fYkVuYWJsZU5vdGlmeSA9IFRSVUU7Ci0JbV9mT2xkSXRlbUhlaWdodCA9IEdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7Cit2b2lkIENQV0xfTm90ZV9FZGl0OjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiBjc1RleHQpIHsKKyAgbV9iRW5hYmxlTm90aWZ5ID0gRkFMU0U7CisgIENQV0xfRWRpdDo6U2V0VGV4dChjc1RleHQpOworICBtX2JFbmFibGVOb3RpZnkgPSBUUlVFOworICBtX2ZPbGRJdGVtSGVpZ2h0ID0gR2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIH0KIAotdm9pZCBDUFdMX05vdGVfRWRpdDo6T25TZXRGb2N1cygpCi17Ci0JbV9iRW5hYmxlTm90aWZ5ID0gRkFMU0U7Ci0JQ1BXTF9FZGl0OjpPblNldEZvY3VzKCk7Ci0JbV9iRW5hYmxlTm90aWZ5ID0gVFJVRTsKK3ZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uU2V0Rm9jdXMoKSB7CisgIG1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOworICBDUFdMX0VkaXQ6Ok9uU2V0Rm9jdXMoKTsKKyAgbV9iRW5hYmxlTm90aWZ5ID0gVFJVRTsKIAotCUVuYWJsZVNwZWxsQ2hlY2soVFJVRSk7CisgIEVuYWJsZVNwZWxsQ2hlY2soVFJVRSk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uS2lsbEZvY3VzKCkKLXsKLQlFbmFibGVTcGVsbENoZWNrKEZBTFNFKTsKK3ZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uS2lsbEZvY3VzKCkgeworICBFbmFibGVTcGVsbENoZWNrKEZBTFNFKTsKIAotCWlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQotCXsKLQkJaWYgKENQV0xfV25kKiBwR3JhbmQgPSBwUGFyZW50LT5HZXRQYXJlbnRXaW5kb3coKSkKLQkJewotCQkJQVNTRVJUKHBHcmFuZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKTsKKyAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBHcmFuZCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICBBU1NFUlQocEdyYW5kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOwogCi0JCQlDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcEdyYW5kOworICAgICAgQ1BXTF9Ob3RlSXRlbSogcE5vdGVJdGVtID0gKENQV0xfTm90ZUl0ZW0qKXBHcmFuZDsKIAotCQkJcE5vdGVJdGVtLT5PbkNvbnRlbnRzVmFsaWRhdGUoKTsKLQkJfQotCX0KKyAgICAgIHBOb3RlSXRlbS0+T25Db250ZW50c1ZhbGlkYXRlKCk7CisgICAgfQorICB9CiAKLQlDUFdMX0VkaXQ6Ok9uS2lsbEZvY3VzKCk7CisgIENQV0xfRWRpdDo6T25LaWxsRm9jdXMoKTsKIH0KIAotdm9pZCBDUFdMX05vdGVfRWRpdDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCi17Ci0JaWYgKG1fYkVuYWJsZU5vdGlmeSkKLQl7Ci0JCWlmICh3UGFyYW0gPT0gU0JUX1ZTQ1JPTEwpCi0JCXsKLQkJCXN3aXRjaCAobXNnKQotCQkJewotCQkJY2FzZSBQTk1fU0VUU0NST0xMSU5GTzoKLQkJCQlpZiAoUFdMX1NDUk9MTF9JTkZPKiBwSW5mbyA9IChQV0xfU0NST0xMX0lORk8qKWxQYXJhbSkKLQkJCQl7Ci0JCQkJCWlmICghSXNGbG9hdEVxdWFsKHBJbmZvLT5mQ29udGVudE1heCwgbV9mT2xkTWF4KSB8fAotCQkJCQkJIUlzRmxvYXRFcXVhbChwSW5mby0+ZkNvbnRlbnRNaW4sIG1fZk9sZE1pbikpCi0JCQkJCXsKLQkJCQkJCW1fYlNpemVDaGFuZ2VkID0gVFJVRTsKLQkJCQkJCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKLQkJCQkJCXsKLQkJCQkJCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKLQkJCQkJCX0KK3ZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7CisgIGlmIChtX2JFbmFibGVOb3RpZnkpIHsKKyAgICBpZiAod1BhcmFtID09IFNCVF9WU0NST0xMKSB7CisgICAgICBzd2l0Y2ggKG1zZykgeworICAgICAgICBjYXNlIFBOTV9TRVRTQ1JPTExJTkZPOgorICAgICAgICAgIGlmIChQV0xfU0NST0xMX0lORk8qIHBJbmZvID0gKFBXTF9TQ1JPTExfSU5GTyopbFBhcmFtKSB7CisgICAgICAgICAgICBpZiAoIUlzRmxvYXRFcXVhbChwSW5mby0+ZkNvbnRlbnRNYXgsIG1fZk9sZE1heCkgfHwKKyAgICAgICAgICAgICAgICAhSXNGbG9hdEVxdWFsKHBJbmZvLT5mQ29udGVudE1pbiwgbV9mT2xkTWluKSkgeworICAgICAgICAgICAgICBtX2JTaXplQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgICAgICAgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7CisgICAgICAgICAgICAgIH0KIAotCQkJCQkJbV9mT2xkTWF4ID0gcEluZm8tPmZDb250ZW50TWF4OwotCQkJCQkJbV9mT2xkTWluID0gcEluZm8tPmZDb250ZW50TWluOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgICBtX2ZPbGRNYXggPSBwSW5mby0+ZkNvbnRlbnRNYXg7CisgICAgICAgICAgICAgIG1fZk9sZE1pbiA9IHBJbmZvLT5mQ29udGVudE1pbjsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KIAotCUNQV0xfRWRpdDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CisgIENQV0xfRWRpdDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CiAKLQlpZiAobV9iRW5hYmxlTm90aWZ5KQotCXsKLQkJc3dpdGNoIChtc2cpCi0JCXsKLQkJY2FzZSBQTk1fU0VUQ0FSRVRJTkZPOgotCQkJaWYgKFBXTF9DQVJFVF9JTkZPICogcEluZm8gPSAoUFdMX0NBUkVUX0lORk8qKXdQYXJhbSkKLQkJCXsKLQkJCQlQV0xfQ0FSRVRfSU5GTyBuZXdJbmZvID0gKnBJbmZvOwotCQkJCW5ld0luZm8uYlZpc2libGUgPSBUUlVFOwotCQkJCW5ld0luZm8ucHRIZWFkID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRIZWFkKTsKLQkJCQluZXdJbmZvLnB0Rm9vdCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0Rm9vdCk7CisgIGlmIChtX2JFbmFibGVOb3RpZnkpIHsKKyAgICBzd2l0Y2ggKG1zZykgeworICAgICAgY2FzZSBQTk1fU0VUQ0FSRVRJTkZPOgorICAgICAgICBpZiAoUFdMX0NBUkVUX0lORk8qIHBJbmZvID0gKFBXTF9DQVJFVF9JTkZPKil3UGFyYW0pIHsKKyAgICAgICAgICBQV0xfQ0FSRVRfSU5GTyBuZXdJbmZvID0gKnBJbmZvOworICAgICAgICAgIG5ld0luZm8uYlZpc2libGUgPSBUUlVFOworICAgICAgICAgIG5ld0luZm8ucHRIZWFkID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRIZWFkKTsKKyAgICAgICAgICBuZXdJbmZvLnB0Rm9vdCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0Rm9vdCk7CiAKLQkJCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCi0JCQkJewotCQkJCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUQ0FSRVRJTkZPLCAoaW50cHRyX3QpJm5ld0luZm8sIDApOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgICAgICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgICAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUQ0FSRVRJTkZPLCAoaW50cHRyX3QpJm5ld0luZm8sIDApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIH0KIAotRlhfRkxPQVQgQ1BXTF9Ob3RlX0VkaXQ6OkdldEl0ZW1IZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpCi17Ci0JaWYgKGZMaW1pdFdpZHRoID4gMCkKLQl7Ci0JCWlmICghbV9iU2l6ZUNoYW5nZWQpCi0JCQlyZXR1cm4gbV9mT2xkSXRlbUhlaWdodDsKK0ZYX0ZMT0FUIENQV0xfTm90ZV9FZGl0OjpHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKSB7CisgIGlmIChmTGltaXRXaWR0aCA+IDApIHsKKyAgICBpZiAoIW1fYlNpemVDaGFuZ2VkKQorICAgICAgcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQ7CiAKLQkJbV9iU2l6ZUNoYW5nZWQgPSBGQUxTRTsKKyAgICBtX2JTaXplQ2hhbmdlZCA9IEZBTFNFOwogCi0JCUVuYWJsZU5vdGlmeShGQUxTRSk7Ci0JCUVuYWJsZVJlZnJlc2goRkFMU0UpOwotCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOworICAgIEVuYWJsZU5vdGlmeShGQUxTRSk7CisgICAgRW5hYmxlUmVmcmVzaChGQUxTRSk7CisgICAgbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKIAotCQlNb3ZlKENQREZfUmVjdCgwLDAsZkxpbWl0V2lkdGgsMCksIFRSVUUsIEZBTFNFKTsKLQkJRlhfRkxPQVQgZlJldCA9IEdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgTW92ZShDUERGX1JlY3QoMCwgMCwgZkxpbWl0V2lkdGgsIDApLCBUUlVFLCBGQUxTRSk7CisgICAgRlhfRkxPQVQgZlJldCA9IEdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CiAKLQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOwotCQlFbmFibGVOb3RpZnkoVFJVRSk7Ci0JCUVuYWJsZVJlZnJlc2goVFJVRSk7CisgICAgbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOworICAgIEVuYWJsZU5vdGlmeShUUlVFKTsKKyAgICBFbmFibGVSZWZyZXNoKFRSVUUpOwogCi0JCXJldHVybiBmUmV0OwotCX0KKyAgICByZXR1cm4gZlJldDsKKyAgfQogCi0JcmV0dXJuIDA7CisgIHJldHVybiAwOwogfQogCi1GWF9GTE9BVCBDUFdMX05vdGVfRWRpdDo6R2V0SXRlbUxlZnRNYXJnaW4oKQotewotCXJldHVybiBQT1BVUF9JVEVNX1RFWFRfSU5ERU5UOworRlhfRkxPQVQgQ1BXTF9Ob3RlX0VkaXQ6OkdldEl0ZW1MZWZ0TWFyZ2luKCkgeworICByZXR1cm4gUE9QVVBfSVRFTV9URVhUX0lOREVOVDsKIH0KIAotRlhfRkxPQVQgQ1BXTF9Ob3RlX0VkaXQ6OkdldEl0ZW1SaWdodE1hcmdpbigpCi17Ci0JcmV0dXJuIFBPUFVQX0lURU1fVEVYVF9JTkRFTlQ7CitGWF9GTE9BVCBDUFdMX05vdGVfRWRpdDo6R2V0SXRlbVJpZ2h0TWFyZ2luKCkgeworICByZXR1cm4gUE9QVVBfSVRFTV9URVhUX0lOREVOVDsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlX0xCQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZV9MQkJveAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1DUFdMX05vdGVfTEJCb3g6OkNQV0xfTm90ZV9MQkJveCgpCi17Ci19CitDUFdMX05vdGVfTEJCb3g6OkNQV0xfTm90ZV9MQkJveCgpIHt9CiAKLUNQV0xfTm90ZV9MQkJveDo6fkNQV0xfTm90ZV9MQkJveCgpCi17Ci19CitDUFdMX05vdGVfTEJCb3g6On5DUFdMX05vdGVfTEJCb3goKSB7fQogCi12b2lkIENQV0xfTm90ZV9MQkJveDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCi17Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwordm9pZCBDUFdMX05vdGVfTEJCb3g6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKIAotCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JZ3NkLm1fTGluZVdpZHRoID0gMS4wZjsKKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgZ3NkLm1fTGluZVdpZHRoID0gMS4wZjsKIAotCUNGWF9QYXRoRGF0YSBwYXRoQ3Jvc3M7CisgIENGWF9QYXRoRGF0YSBwYXRoQ3Jvc3M7CiAKLQlwYXRoQ3Jvc3MuU2V0UG9pbnRDb3VudCg0KTsKLQlwYXRoQ3Jvc3MuU2V0UG9pbnQoMCwgcmNDbGllbnQubGVmdCwgcmNDbGllbnQudG9wLCBGWFBUX01PVkVUTyk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDEsIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC5ib3R0b20sIEZYUFRfTElORVRPKTsKLQlwYXRoQ3Jvc3MuU2V0UG9pbnQoMiwgcmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tICsgcmNDbGllbnQuSGVpZ2h0KCkgKiAwLjVmLCBGWFBUX01PVkVUTyk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDMsIHJjQ2xpZW50LmxlZnQgKyByY0NsaWVudC5XaWR0aCgpICogMC41ZiwgcmNDbGllbnQuYm90dG9tLCBGWFBUX0xJTkVUTyk7CisgIHBhdGhDcm9zcy5TZXRQb2ludENvdW50KDQpOworICBwYXRoQ3Jvc3MuU2V0UG9pbnQoMCwgcmNDbGllbnQubGVmdCwgcmNDbGllbnQudG9wLCBGWFBUX01PVkVUTyk7CisgIHBhdGhDcm9zcy5TZXRQb2ludCgxLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQuYm90dG9tLCBGWFBUX0xJTkVUTyk7CisgIHBhdGhDcm9zcy5TZXRQb2ludCgyLCByY0NsaWVudC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQuYm90dG9tICsgcmNDbGllbnQuSGVpZ2h0KCkgKiAwLjVmLCBGWFBUX01PVkVUTyk7CisgIHBhdGhDcm9zcy5TZXRQb2ludCgzLCByY0NsaWVudC5sZWZ0ICsgcmNDbGllbnQuV2lkdGgoKSAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20sIEZYUFRfTElORVRPKTsKIAotCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoQ3Jvc3MsIHBVc2VyMkRldmljZSwgJmdzZCwKLQkJMCwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwgRlhGSUxMX0FMVEVSTkFURSk7CisgIHBEZXZpY2UtPkRyYXdQYXRoKAorICAgICAgJnBhdGhDcm9zcywgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLAorICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwKKyAgICAgIEZYRklMTF9BTFRFUk5BVEUpOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX05vdGVfUkJCb3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlX1JCQm94CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLUNQV0xfTm90ZV9SQkJveDo6Q1BXTF9Ob3RlX1JCQm94KCkKLXsKLX0KK0NQV0xfTm90ZV9SQkJveDo6Q1BXTF9Ob3RlX1JCQm94KCkge30KIAotQ1BXTF9Ob3RlX1JCQm94Ojp+Q1BXTF9Ob3RlX1JCQm94KCkKLXsKLX0KK0NQV0xfTm90ZV9SQkJveDo6fkNQV0xfTm90ZV9SQkJveCgpIHt9CiAKLXZvaWQgQ1BXTF9Ob3RlX1JCQm94OjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkKLXsKLQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Cit2b2lkIENQV0xfTm90ZV9SQkJveDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLQlnc2QubV9MaW5lV2lkdGggPSAxLjBmOworICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICBnc2QubV9MaW5lV2lkdGggPSAxLjBmOwogCi0JQ0ZYX1BhdGhEYXRhIHBhdGhDcm9zczsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGhDcm9zczsKIAotCXBhdGhDcm9zcy5TZXRQb2ludENvdW50KDQpOwotCXBhdGhDcm9zcy5TZXRQb2ludCgwLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wLCBGWFBUX01PVkVUTyk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDEsIHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LmJvdHRvbSwgRlhQVF9MSU5FVE8pOwotCXBhdGhDcm9zcy5TZXRQb2ludCgyLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQuYm90dG9tICsgcmNDbGllbnQuSGVpZ2h0KCkgKiAwLjVmLCBGWFBUX01PVkVUTyk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDMsIHJjQ2xpZW50LmxlZnQgKyByY0NsaWVudC5XaWR0aCgpICogMC41ZiwgcmNDbGllbnQuYm90dG9tLCBGWFBUX0xJTkVUTyk7CisgIHBhdGhDcm9zcy5TZXRQb2ludENvdW50KDQpOworICBwYXRoQ3Jvc3MuU2V0UG9pbnQoMCwgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LnRvcCwgRlhQVF9NT1ZFVE8pOworICBwYXRoQ3Jvc3MuU2V0UG9pbnQoMSwgcmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tLCBGWFBUX0xJTkVUTyk7CisgIHBhdGhDcm9zcy5TZXRQb2ludCgyLCByY0NsaWVudC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmJvdHRvbSArIHJjQ2xpZW50LkhlaWdodCgpICogMC41ZiwgRlhQVF9NT1ZFVE8pOworICBwYXRoQ3Jvc3MuU2V0UG9pbnQoMywgcmNDbGllbnQubGVmdCArIHJjQ2xpZW50LldpZHRoKCkgKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQuYm90dG9tLCBGWFBUX0xJTkVUTyk7CiAKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aENyb3NzLCBwVXNlcjJEZXZpY2UsICZnc2QsCi0JCTAsIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksIEZYRklMTF9BTFRFUk5BVEUpOworICBwRGV2aWNlLT5EcmF3UGF0aCgKKyAgICAgICZwYXRoQ3Jvc3MsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwKKyAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksCisgICAgICBGWEZJTExfQUxURVJOQVRFKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZV9JY29uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX05vdGVfSWNvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX05vdGVfSWNvbjo6Q1BXTF9Ob3RlX0ljb24oKSA6IG1fblR5cGUoMCkKLXsKLX0KK0NQV0xfTm90ZV9JY29uOjpDUFdMX05vdGVfSWNvbigpIDogbV9uVHlwZSgwKSB7fQogCi1DUFdMX05vdGVfSWNvbjo6fkNQV0xfTm90ZV9JY29uKCkKLXsKLX0KK0NQV0xfTm90ZV9JY29uOjp+Q1BXTF9Ob3RlX0ljb24oKSB7fQogCi12b2lkIENQV0xfTm90ZV9JY29uOjpTZXRJY29uVHlwZShpbnQzMl90IG5UeXBlKQotewotCW1fblR5cGUgPSBuVHlwZTsKK3ZvaWQgQ1BXTF9Ob3RlX0ljb246OlNldEljb25UeXBlKGludDMyX3QgblR5cGUpIHsKKyAgbV9uVHlwZSA9IG5UeXBlOwogfQogCi12b2lkIENQV0xfTm90ZV9JY29uOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkKLXsKLQlDUFdMX1V0aWxzOjpEcmF3SWNvbkFwcFN0cmVhbShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fblR5cGUsIEdldENsaWVudFJlY3QoKSwKLQkJR2V0QmFja2dyb3VuZENvbG9yKCksIFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IsIEdldFRyYW5zcGFyZW5jeSgpKTsKK3ZvaWQgQ1BXTF9Ob3RlX0ljb246OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgQ1BXTF9VdGlsczo6RHJhd0ljb25BcHBTdHJlYW0ocERldmljZSwgcFVzZXIyRGV2aWNlLCBtX25UeXBlLCBHZXRDbGllbnRSZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJhY2tncm91bmRDb2xvcigpLCBQV0xfREVGQVVMVF9CTEFDS0NPTE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUcmFuc3BhcmVuY3koKSk7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX05vdGVfQ2xvc2VCb3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZV9DbG9zZUJveAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX05vdGVfQ2xvc2VCb3g6OkNQV0xfTm90ZV9DbG9zZUJveCgpIDogbV9iTW91c2VEb3duKEZBTFNFKQotewotfQorQ1BXTF9Ob3RlX0Nsb3NlQm94OjpDUFdMX05vdGVfQ2xvc2VCb3goKSA6IG1fYk1vdXNlRG93bihGQUxTRSkge30KIAotQ1BXTF9Ob3RlX0Nsb3NlQm94Ojp+Q1BXTF9Ob3RlX0Nsb3NlQm94KCkKLXsKLX0KK0NQV0xfTm90ZV9DbG9zZUJveDo6fkNQV0xfTm90ZV9DbG9zZUJveCgpIHt9CiAKLXZvaWQgQ1BXTF9Ob3RlX0Nsb3NlQm94OjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkKLXsKLQlDUFdMX0J1dHRvbjo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7Cit2b2lkIENQV0xfTm90ZV9DbG9zZUJveDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgQ1BXTF9CdXR0b246OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOwogCi0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCXJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmNDbGllbnQsIDIuMGYpOworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgIHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmNDbGllbnQsIDIuMGYpOwogCi0JQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLQlnc2QubV9MaW5lV2lkdGggPSAxLjBmOworICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICBnc2QubV9MaW5lV2lkdGggPSAxLjBmOwogCi0JQ0ZYX1BhdGhEYXRhIHBhdGhDcm9zczsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGhDcm9zczsKIAotCWlmIChtX2JNb3VzZURvd24pCi0JewotCQlyY0NsaWVudC5sZWZ0ICs9IDAuNWY7Ci0JCXJjQ2xpZW50LnJpZ2h0ICs9IDAuNWY7Ci0JCXJjQ2xpZW50LnRvcCAtPSAwLjVmOwotCQlyY0NsaWVudC5ib3R0b20gLT0gMC41ZjsKLQl9CisgIGlmIChtX2JNb3VzZURvd24pIHsKKyAgICByY0NsaWVudC5sZWZ0ICs9IDAuNWY7CisgICAgcmNDbGllbnQucmlnaHQgKz0gMC41ZjsKKyAgICByY0NsaWVudC50b3AgLT0gMC41ZjsKKyAgICByY0NsaWVudC5ib3R0b20gLT0gMC41ZjsKKyAgfQogCi0JcGF0aENyb3NzLlNldFBvaW50Q291bnQoNCk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDAsIHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LmJvdHRvbSwgRlhQVF9NT1ZFVE8pOwotCXBhdGhDcm9zcy5TZXRQb2ludCgxLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wLCBGWFBUX0xJTkVUTyk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDIsIHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LnRvcCwgRlhQVF9NT1ZFVE8pOwotCXBhdGhDcm9zcy5TZXRQb2ludCgzLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQuYm90dG9tLCBGWFBUX0xJTkVUTyk7CisgIHBhdGhDcm9zcy5TZXRQb2ludENvdW50KDQpOworICBwYXRoQ3Jvc3MuU2V0UG9pbnQoMCwgcmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tLCBGWFBUX01PVkVUTyk7CisgIHBhdGhDcm9zcy5TZXRQb2ludCgxLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wLCBGWFBUX0xJTkVUTyk7CisgIHBhdGhDcm9zcy5TZXRQb2ludCgyLCByY0NsaWVudC5sZWZ0LCByY0NsaWVudC50b3AsIEZYUFRfTU9WRVRPKTsKKyAgcGF0aENyb3NzLlNldFBvaW50KDMsIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC5ib3R0b20sIEZYUFRfTElORVRPKTsKIAotCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoQ3Jvc3MsIHBVc2VyMkRldmljZSwgJmdzZCwKLQkJMCwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwgRlhGSUxMX0FMVEVSTkFURSk7CisgIHBEZXZpY2UtPkRyYXdQYXRoKAorICAgICAgJnBhdGhDcm9zcywgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLAorICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwKKyAgICAgIEZYRklMTF9BTFRFUk5BVEUpOwogfQogCi1GWF9CT09MIENQV0xfTm90ZV9DbG9zZUJveDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCVNldEJvcmRlclN0eWxlKFBCU19JTlNFVCk7Ci0JSW52YWxpZGF0ZVJlY3QoTlVMTCk7CitGWF9CT09MIENQV0xfTm90ZV9DbG9zZUJveDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIFNldEJvcmRlclN0eWxlKFBCU19JTlNFVCk7CisgIEludmFsaWRhdGVSZWN0KE5VTEwpOwogCi0JbV9iTW91c2VEb3duID0gVFJVRTsKKyAgbV9iTW91c2VEb3duID0gVFJVRTsKIAotCXJldHVybiBDUFdMX0J1dHRvbjo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CisgIHJldHVybiBDUFdMX0J1dHRvbjo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOwogfQogCi1GWF9CT09MCUNQV0xfTm90ZV9DbG9zZUJveDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQltX2JNb3VzZURvd24gPSBGQUxTRTsKK0ZYX0JPT0wgQ1BXTF9Ob3RlX0Nsb3NlQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBtX2JNb3VzZURvd24gPSBGQUxTRTsKIAotCVNldEJvcmRlclN0eWxlKFBCU19CRVZFTEVEKTsKLQlJbnZhbGlkYXRlUmVjdChOVUxMKTsKKyAgU2V0Qm9yZGVyU3R5bGUoUEJTX0JFVkVMRUQpOworICBJbnZhbGlkYXRlUmVjdChOVUxMKTsKIAotCXJldHVybiBDUFdMX0J1dHRvbjo6T25MQnV0dG9uVXAocG9pbnQsbkZsYWcpOworICByZXR1cm4gQ1BXTF9CdXR0b246Ok9uTEJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX05vdGVfQ29udGVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZV9Db250ZW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX05vdGVfQ29udGVudHM6OkNQV0xfTm90ZV9Db250ZW50cygpIDogbV9wRWRpdChOVUxMKQotewotfQorQ1BXTF9Ob3RlX0NvbnRlbnRzOjpDUFdMX05vdGVfQ29udGVudHMoKSA6IG1fcEVkaXQoTlVMTCkge30KIAotQ1BXTF9Ob3RlX0NvbnRlbnRzOjp+Q1BXTF9Ob3RlX0NvbnRlbnRzKCkKLXsKLX0KK0NQV0xfTm90ZV9Db250ZW50czo6fkNQV0xfTm90ZV9Db250ZW50cygpIHt9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfTm90ZV9Db250ZW50czo6R2V0Q2xhc3NOYW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gIkNQV0xfTm90ZV9Db250ZW50cyI7CitDRlhfQnl0ZVN0cmluZyBDUFdMX05vdGVfQ29udGVudHM6OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJDUFdMX05vdGVfQ29udGVudHMiOwogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JbV9wRWRpdCA9IG5ldyBDUFdMX05vdGVfRWRpdDsKLQlQV0xfQ1JFQVRFUEFSQU0gZWNwID0gY3A7Ci0JZWNwLnBQYXJlbnRXbmQgPSB0aGlzOwotCWVjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQRVNfTVVMVElMSU5FIHwgUEVTX0FVVE9SRVRVUk4gfCBQRVNfVEVYVE9WRVJGTE9XIHwgUEVTX1VORE8gfCBQRVNfU1BFTExDSEVDSzsKK3ZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIG1fcEVkaXQgPSBuZXcgQ1BXTF9Ob3RlX0VkaXQ7CisgIFBXTF9DUkVBVEVQQVJBTSBlY3AgPSBjcDsKKyAgZWNwLnBQYXJlbnRXbmQgPSB0aGlzOworICBlY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEIHwgUEVTX01VTFRJTElORSB8IFBFU19BVVRPUkVUVVJOIHwKKyAgICAgICAgICAgICAgICBQRVNfVEVYVE9WRVJGTE9XIHwgUEVTX1VORE8gfCBQRVNfU1BFTExDSEVDSzsKIAotCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7Ci0JbV9wRWRpdC0+Q3JlYXRlKGVjcCk7Ci0JbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOworICBtX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOworICBtX3BFZGl0LT5DcmVhdGUoZWNwKTsKKyAgbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOwogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpCi17Ci0JaWYgKG1fcEVkaXQpCi0JewotCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOwotCQltX3BFZGl0LT5TZXRUZXh0KHNUZXh0LmNfc3RyKCkpOwotCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7Ci0JCU9uTm90aWZ5KG1fcEVkaXQsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIDApOwotCX0KK3ZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CisgICAgbV9wRWRpdC0+U2V0VGV4dChzVGV4dC5jX3N0cigpKTsKKyAgICBtX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7CisgICAgT25Ob3RpZnkobV9wRWRpdCwgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7CisgIH0KIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpHZXRUZXh0KCkgY29uc3QKLXsKLQlpZiAobV9wRWRpdCkKLQkJcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKK0NGWF9XaWRlU3RyaW5nIENQV0xfTm90ZV9Db250ZW50czo6R2V0VGV4dCgpIGNvbnN0IHsKKyAgaWYgKG1fcEVkaXQpCisgICAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKIAotCXJldHVybiBMIiI7CisgIHJldHVybiBMIiI7CiB9CiAKLUNQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZV9Db250ZW50czo6Q3JlYXRlU3ViSXRlbSgpCi17Ci0JQ1BXTF9Ob3RlSXRlbSogcE5vdGVJdGVtID0gbmV3IENQV0xfTm90ZUl0ZW07Ci0JUFdMX0NSRUFURVBBUkFNIGljcCA9IEdldENyZWF0aW9uUGFyYW0oKTsKLQlpY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JaWNwLmR3RmxhZ3MgPSAgUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEUgfCBQV1NfQkFDS0dST1VORDsKLQlwTm90ZUl0ZW0tPkNyZWF0ZShpY3ApOworQ1BXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlX0NvbnRlbnRzOjpDcmVhdGVTdWJJdGVtKCkgeworICBDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSBuZXcgQ1BXTF9Ob3RlSXRlbTsKKyAgUFdMX0NSRUFURVBBUkFNIGljcCA9IEdldENyZWF0aW9uUGFyYW0oKTsKKyAgaWNwLnBQYXJlbnRXbmQgPSB0aGlzOworICBpY3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFIHwgUFdTX0JBQ0tHUk9VTkQ7CisgIHBOb3RlSXRlbS0+Q3JlYXRlKGljcCk7CiAKLQlwTm90ZUl0ZW0tPk9uQ3JlYXRlTm90ZUl0ZW0oKTsKKyAgcE5vdGVJdGVtLT5PbkNyZWF0ZU5vdGVJdGVtKCk7CiAKLQlwTm90ZUl0ZW0tPlJlc2V0U3ViamVjdE5hbWUobV9hQ2hpbGRyZW4uR2V0U2l6ZSgpIC0gMSk7CisgIHBOb3RlSXRlbS0+UmVzZXRTdWJqZWN0TmFtZShtX2FDaGlsZHJlbi5HZXRTaXplKCkgLSAxKTsKIAotCUZYX1NZU1RFTVRJTUUgc3Q7Ci0JaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0JCXN0ID0gcFNILT5HZXRMb2NhbFRpbWUoKTsKLQlwTm90ZUl0ZW0tPlNldERhdGVUaW1lKHN0KTsKKyAgRlhfU1lTVEVNVElNRSBzdDsKKyAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCisgICAgc3QgPSBwU0gtPkdldExvY2FsVGltZSgpOworICBwTm90ZUl0ZW0tPlNldERhdGVUaW1lKHN0KTsKIAotCXBOb3RlSXRlbS0+U2V0Q29udGVudHMoTCIiKTsKKyAgcE5vdGVJdGVtLT5TZXRDb250ZW50cyhMIiIpOwogCi0JT25Ob3RpZnkocE5vdGVJdGVtLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKKyAgT25Ob3RpZnkocE5vdGVJdGVtLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKIAotCXJldHVybiBwTm90ZUl0ZW07CisgIHJldHVybiBwTm90ZUl0ZW07CiB9CiAKLWludDMyX3QgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpDb3VudFN1Ykl0ZW1zKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpIC0gMTsKK2ludDMyX3QgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpDb3VudFN1Ykl0ZW1zKCkgY29uc3QgeworICByZXR1cm4gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpIC0gMTsKIH0KIAotSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlX0NvbnRlbnRzOjpHZXRTdWJJdGVtcyhpbnQzMl90IGluZGV4KSBjb25zdAotewotCWludDMyX3QgbkluZGV4ID0gaW5kZXggKyAxOworSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlX0NvbnRlbnRzOjpHZXRTdWJJdGVtcyhpbnQzMl90IGluZGV4KSBjb25zdCB7CisgIGludDMyX3QgbkluZGV4ID0gaW5kZXggKyAxOwogCi0JaWYgKG5JbmRleCA+IDAgJiYgbkluZGV4IDwgbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpKQotCQlpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KG5JbmRleCkpCi0JCXsKLQkJCUFTU0VSVChwQ2hpbGQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIik7Ci0JCQlDUFdMX05vdGVJdGVtKiBwSXRlbSA9IChDUFdMX05vdGVJdGVtKilwQ2hpbGQ7Ci0JCQlyZXR1cm4gcEl0ZW07Ci0JCX0KLQlyZXR1cm4gTlVMTDsKKyAgaWYgKG5JbmRleCA+IDAgJiYgbkluZGV4IDwgbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpKQorICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQobkluZGV4KSkgeworICAgICAgQVNTRVJUKHBDaGlsZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKTsKKyAgICAgIENQV0xfTm90ZUl0ZW0qIHBJdGVtID0gKENQV0xfTm90ZUl0ZW0qKXBDaGlsZDsKKyAgICAgIHJldHVybiBwSXRlbTsKKyAgICB9CisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6RGVsZXRlU3ViSXRlbShJUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0pCi17Ci0JaW50MzJfdCBuSW5kZXggPSBHZXRJdGVtSW5kZXgoKENQV0xfTm90ZUl0ZW0qKXBOb3RlSXRlbSk7Cit2b2lkIENQV0xfTm90ZV9Db250ZW50czo6RGVsZXRlU3ViSXRlbShJUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0pIHsKKyAgaW50MzJfdCBuSW5kZXggPSBHZXRJdGVtSW5kZXgoKENQV0xfTm90ZUl0ZW0qKXBOb3RlSXRlbSk7CiAKLQlpZiAobkluZGV4ID4gMCkKLQl7Ci0JCWlmIChDUFdMX05vdGVJdGVtKiBwUFdMTm90ZUl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcE5vdGVJdGVtKQotCQl7Ci0JCQlwUFdMTm90ZUl0ZW0tPktpbGxGb2N1cygpOwotCQkJcFBXTE5vdGVJdGVtLT5EZXN0cm95KCk7Ci0JCQlkZWxldGUgcFBXTE5vdGVJdGVtOwotCQl9CisgIGlmIChuSW5kZXggPiAwKSB7CisgICAgaWYgKENQV0xfTm90ZUl0ZW0qIHBQV0xOb3RlSXRlbSA9IChDUFdMX05vdGVJdGVtKilwTm90ZUl0ZW0pIHsKKyAgICAgIHBQV0xOb3RlSXRlbS0+S2lsbEZvY3VzKCk7CisgICAgICBwUFdMTm90ZUl0ZW0tPkRlc3Ryb3koKTsKKyAgICAgIGRlbGV0ZSBwUFdMTm90ZUl0ZW07CisgICAgfQogCi0JCWZvciAoaW50MzJfdCBpPW5JbmRleCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJewotCQkJaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJCXsKLQkJCQlBU1NFUlQocENoaWxkLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOwotCQkJCUNQV0xfTm90ZUl0ZW0qIHBJdGVtID0gKENQV0xfTm90ZUl0ZW0qKXBDaGlsZDsKLQkJCQlwSXRlbS0+UmVzZXRTdWJqZWN0TmFtZShpKTsKLQkJCX0KLQkJfQorICAgIGZvciAoaW50MzJfdCBpID0gbkluZGV4LCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpIHsKKyAgICAgICAgQVNTRVJUKHBDaGlsZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKTsKKyAgICAgICAgQ1BXTF9Ob3RlSXRlbSogcEl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcENoaWxkOworICAgICAgICBwSXRlbS0+UmVzZXRTdWJqZWN0TmFtZShpKTsKKyAgICAgIH0KKyAgICB9CiAKLQkJT25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7Ci0JfQorICAgIE9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIDApOworICB9CiB9CiAKLUlQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZV9Db250ZW50czo6R2V0SGl0Tm90ZUl0ZW0oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JQ1BERl9Qb2ludCBwdCA9IFBhcmVudFRvQ2hpbGQocG9pbnQpOworSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlX0NvbnRlbnRzOjpHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBDUERGX1BvaW50IHB0ID0gUGFyZW50VG9DaGlsZChwb2ludCk7CiAKLQlmb3IgKGludDMyX3QgaT0wLHN6PW1fYUNoaWxkcmVuLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJewotCQkJaWYgKHBDaGlsZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKQotCQkJewotCQkJCUNQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSA9IChDUFdMX05vdGVJdGVtKilwQ2hpbGQ7Ci0JCQkJaWYgKElQV0xfTm90ZUl0ZW0qIHBSZXQgPSBwTm90ZUl0ZW0tPkdldEhpdE5vdGVJdGVtKHB0KSkKLQkJCQkJcmV0dXJuIHBSZXQ7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeworICAgICAgaWYgKHBDaGlsZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKSB7CisgICAgICAgIENQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSA9IChDUFdMX05vdGVJdGVtKilwQ2hpbGQ7CisgICAgICAgIGlmIChJUFdMX05vdGVJdGVtKiBwUmV0ID0gcE5vdGVJdGVtLT5HZXRIaXROb3RlSXRlbShwdCkpCisgICAgICAgICAgcmV0dXJuIHBSZXQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCi17Ci0Jc3dpdGNoIChtc2cpCi0JewotCWNhc2UgUE5NX05PVEVFRElUQ0hBTkdFRDoKLQkJewotCQkJaW50MzJfdCBuSW5kZXggPSBHZXRJdGVtSW5kZXgocFduZCk7Ci0JCQlpZiAobkluZGV4IDwgMCkgbkluZGV4ID0gMDsKK3ZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpPbk5vdGlmeShDUFdMX1duZCogcFduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSkgeworICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgUE5NX05PVEVFRElUQ0hBTkdFRDogeworICAgICAgaW50MzJfdCBuSW5kZXggPSBHZXRJdGVtSW5kZXgocFduZCk7CisgICAgICBpZiAobkluZGV4IDwgMCkKKyAgICAgICAgbkluZGV4ID0gMDsKIAotCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKLQkJCVJlc2V0Q29udGVudChuSW5kZXgpOwotCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOworICAgICAgbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKKyAgICAgIFJlc2V0Q29udGVudChuSW5kZXgpOworICAgICAgbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOwogCi0JCQlmb3IgKGludDMyX3QgaT1uSW5kZXgrMSwgc3o9bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCQl7Ci0JCQkJaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJCQkJcENoaWxkLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKLQkJCX0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gbkluZGV4ICsgMSwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCisgICAgICAgICAgcENoaWxkLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKKyAgICAgIH0KIAotCQkJaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQotCQkJewotCQkJCXBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIDApOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQljYXNlIFBOTV9TQ1JPTExXSU5ET1c6Ci0JCVNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAuMGYsICooRlhfRkxPQVQqKWxQYXJhbSkpOwotCQlSZXNldEZhY2UoKTsKLQkJSW52YWxpZGF0ZVJlY3QoTlVMTCk7Ci0JCXJldHVybjsKLQljYXNlIFBOTV9TRVRDQVJFVElORk86Ci0JCWlmIChQV0xfQ0FSRVRfSU5GTyAqIHBJbmZvID0gKFBXTF9DQVJFVF9JTkZPKil3UGFyYW0pCi0JCXsKLQkJCVBXTF9DQVJFVF9JTkZPIG5ld0luZm8gPSAqcEluZm87Ci0JCQluZXdJbmZvLmJWaXNpYmxlID0gVFJVRTsKLQkJCW5ld0luZm8ucHRIZWFkID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRIZWFkKTsKLQkJCW5ld0luZm8ucHRGb290ID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRGb290KTsKKyAgICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIDApOworICAgICAgfQorICAgIH0KKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFBOTV9TQ1JPTExXSU5ET1c6CisgICAgICBTZXRTY3JvbGxQb3MoQ1BERl9Qb2ludCgwLjBmLCAqKEZYX0ZMT0FUKilsUGFyYW0pKTsKKyAgICAgIFJlc2V0RmFjZSgpOworICAgICAgSW52YWxpZGF0ZVJlY3QoTlVMTCk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBQTk1fU0VUQ0FSRVRJTkZPOgorICAgICAgaWYgKFBXTF9DQVJFVF9JTkZPKiBwSW5mbyA9IChQV0xfQ0FSRVRfSU5GTyopd1BhcmFtKSB7CisgICAgICAgIFBXTF9DQVJFVF9JTkZPIG5ld0luZm8gPSAqcEluZm87CisgICAgICAgIG5ld0luZm8uYlZpc2libGUgPSBUUlVFOworICAgICAgICBuZXdJbmZvLnB0SGVhZCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0SGVhZCk7CisgICAgICAgIG5ld0luZm8ucHRGb290ID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRGb290KTsKIAotCQkJaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQotCQkJewotCQkJCXBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRDQVJFVElORk8sIChpbnRwdHJfdCkmbmV3SW5mbywgMCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCWNhc2UgUE5NX05PVEVSRVNFVDoKLQkJewotCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKLQkJCVJlc2V0Q29udGVudCgwKTsKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKKyAgICAgICAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICAgICAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUQ0FSRVRJTkZPLCAoaW50cHRyX3QpJm5ld0luZm8sIDApOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgY2FzZSBQTk1fTk9URVJFU0VUOiB7CisgICAgICBtX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOworICAgICAgUmVzZXRDb250ZW50KDApOworICAgICAgbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOwogCi0JCQlmb3IgKGludDMyX3QgaT0xLCBzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCXsKLQkJCQlpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotCQkJCQlwQ2hpbGQtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOwotCQkJfQorICAgICAgZm9yIChpbnQzMl90IGkgPSAxLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKKyAgICAgICAgICBwQ2hpbGQtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOworICAgICAgfQogCi0JCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOwotCQkJUmVzZXRDb250ZW50KDApOwotCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOwotCQl9Ci0JCXJldHVybjsKLQl9CisgICAgICBtX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOworICAgICAgUmVzZXRDb250ZW50KDApOworICAgICAgbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOworICAgIH0KKyAgICAgIHJldHVybjsKKyAgfQogCi0JQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworICBDUFdMX1duZDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9Ob3RlX0NvbnRlbnRzOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LG5GbGFnKSkgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQV0xfTm90ZV9Db250ZW50czo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmIChDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpKQorICAgIHJldHVybiBUUlVFOwogCi0JaWYgKCFtX3BFZGl0LT5Jc0ZvY3VzZWQoKSkKLQl7Ci0JCW1fcEVkaXQtPlNldEZvY3VzKCk7Ci0JfQorICBpZiAoIW1fcEVkaXQtPklzRm9jdXNlZCgpKSB7CisgICAgbV9wRWRpdC0+U2V0Rm9jdXMoKTsKKyAgfQogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6U2V0RWRpdEZvY3VzKEZYX0JPT0wgYkxhc3QpCi17Ci0JaWYgKCFtX3BFZGl0LT5Jc0ZvY3VzZWQoKSkKLQl7Ci0JCW1fcEVkaXQtPlNldEZvY3VzKCk7Ci0JCW1fcEVkaXQtPlNldENhcmV0KGJMYXN0ID8gbV9wRWRpdC0+R2V0VG90YWxXb3JkcygpIDogMCk7Ci0JfQordm9pZCBDUFdMX05vdGVfQ29udGVudHM6OlNldEVkaXRGb2N1cyhGWF9CT09MIGJMYXN0KSB7CisgIGlmICghbV9wRWRpdC0+SXNGb2N1c2VkKCkpIHsKKyAgICBtX3BFZGl0LT5TZXRGb2N1cygpOworICAgIG1fcEVkaXQtPlNldENhcmV0KGJMYXN0ID8gbV9wRWRpdC0+R2V0VG90YWxXb3JkcygpIDogMCk7CisgIH0KIH0KIAotQ1BXTF9FZGl0KiBDUFdMX05vdGVfQ29udGVudHM6OkdldEVkaXQoKSBjb25zdAotewotCXJldHVybiBtX3BFZGl0OworQ1BXTF9FZGl0KiBDUFdMX05vdGVfQ29udGVudHM6OkdldEVkaXQoKSBjb25zdCB7CisgIHJldHVybiBtX3BFZGl0OwogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0JaWYgKCFiRW5hYmxlZCkKLQkJbV9wRWRpdC0+QWRkRmxhZyhQV1NfUkVBRE9OTFkpOwotCWVsc2UKLQkJbV9wRWRpdC0+UmVtb3ZlRmxhZyhQV1NfUkVBRE9OTFkpOwordm9pZCBDUFdMX05vdGVfQ29udGVudHM6OkVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKSB7CisgIGlmICghYkVuYWJsZWQpCisgICAgbV9wRWRpdC0+QWRkRmxhZyhQV1NfUkVBRE9OTFkpOworICBlbHNlCisgICAgbV9wRWRpdC0+UmVtb3ZlRmxhZyhQV1NfUkVBRE9OTFkpOwogCi0JZm9yIChpbnQzMl90IGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0JCXsKLQkJCWlmIChwQ2hpbGQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIikKLQkJCXsKLQkJCQlDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcENoaWxkOwotCQkJCXBOb3RlSXRlbS0+RW5hYmxlTW9kaWZ5KGJFbmFibGVkKTsKLQkJCX0KLQkJfQotCX0KKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICBpZiAocENoaWxkLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpIHsKKyAgICAgICAgQ1BXTF9Ob3RlSXRlbSogcE5vdGVJdGVtID0gKENQV0xfTm90ZUl0ZW0qKXBDaGlsZDsKKyAgICAgICAgcE5vdGVJdGVtLT5FbmFibGVNb2RpZnkoYkVuYWJsZWQpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlUmVhZChGWF9CT09MIGJFbmFibGVkKQotewotCWlmICghYkVuYWJsZWQpCi0JCW1fcEVkaXQtPkFkZEZsYWcoUEVTX05PUkVBRCk7Ci0JZWxzZQotCQltX3BFZGl0LT5SZW1vdmVGbGFnKFBFU19OT1JFQUQpOwordm9pZCBDUFdMX05vdGVfQ29udGVudHM6OkVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCkgeworICBpZiAoIWJFbmFibGVkKQorICAgIG1fcEVkaXQtPkFkZEZsYWcoUEVTX05PUkVBRCk7CisgIGVsc2UKKyAgICBtX3BFZGl0LT5SZW1vdmVGbGFnKFBFU19OT1JFQUQpOwogCi0JZm9yIChpbnQzMl90IGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0JCXsKLQkJCWlmIChwQ2hpbGQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIikKLQkJCXsKLQkJCQlDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcENoaWxkOwotCQkJCXBOb3RlSXRlbS0+RW5hYmxlUmVhZChiRW5hYmxlZCk7Ci0JCQl9Ci0JCX0KLQl9CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeworICAgICAgaWYgKHBDaGlsZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKSB7CisgICAgICAgIENQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSA9IChDUFdMX05vdGVJdGVtKilwQ2hpbGQ7CisgICAgICAgIHBOb3RlSXRlbS0+RW5hYmxlUmVhZChiRW5hYmxlZCk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlSXRlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZUl0ZW0KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9Ob3RlSXRlbTo6Q1BXTF9Ob3RlSXRlbSgpIDoKLQltX3BTdWJqZWN0KE5VTEwpLAotCW1fcERhdGVUaW1lKE5VTEwpLAotCW1fcENvbnRlbnRzKE5VTEwpLAotCW1fcFByaXZhdGVEYXRhKE5VTEwpLAotCW1fc0F1dGhvcihMIiIpLAotCW1fZk9sZEl0ZW1IZWlnaHQoMC4wZiksCi0JbV9iU2l6ZUNoYW5nZWQoRkFMU0UpLAotCW1fYkFsbG93TW9kaWZ5KFRSVUUpCi17Ci19CitDUFdMX05vdGVJdGVtOjpDUFdMX05vdGVJdGVtKCkKKyAgICA6IG1fcFN1YmplY3QoTlVMTCksCisgICAgICBtX3BEYXRlVGltZShOVUxMKSwKKyAgICAgIG1fcENvbnRlbnRzKE5VTEwpLAorICAgICAgbV9wUHJpdmF0ZURhdGEoTlVMTCksCisgICAgICBtX3NBdXRob3IoTCIiKSwKKyAgICAgIG1fZk9sZEl0ZW1IZWlnaHQoMC4wZiksCisgICAgICBtX2JTaXplQ2hhbmdlZChGQUxTRSksCisgICAgICBtX2JBbGxvd01vZGlmeShUUlVFKSB7fQogCi1DUFdMX05vdGVJdGVtOjp+Q1BXTF9Ob3RlSXRlbSgpCi17Ci19CitDUFdMX05vdGVJdGVtOjp+Q1BXTF9Ob3RlSXRlbSgpIHt9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfTm90ZUl0ZW06OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICJDUFdMX05vdGVJdGVtIjsKK0NGWF9CeXRlU3RyaW5nIENQV0xfTm90ZUl0ZW06OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJDUFdMX05vdGVJdGVtIjsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQlDUFdMX0NvbG9yIHNUZXh0Q29sb3I7Cit2b2lkIENQV0xfTm90ZUl0ZW06OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgQ1BXTF9Db2xvciBzVGV4dENvbG9yOwogCi0JaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKEdldEJhY2tncm91bmRDb2xvcigpKSkKLQkJc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7Ci0JZWxzZQotCQlzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKKyAgaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKEdldEJhY2tncm91bmRDb2xvcigpKSkKKyAgICBzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKKyAgZWxzZQorICAgIHNUZXh0Q29sb3IgPSBQV0xfREVGQVVMVF9CTEFDS0NPTE9SOwogCi0JbV9wU3ViamVjdCA9IG5ldyBDUFdMX0xhYmVsOwotCVBXTF9DUkVBVEVQQVJBTSBzY3AgPSBjcDsKLQlzY3AucFBhcmVudFduZCA9IHRoaXM7Ci0Jc2NwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBFU19MRUZUIHwgUEVTX1RPUDsKLQlzY3Auc1RleHRDb2xvciA9IHNUZXh0Q29sb3I7Ci0JbV9wU3ViamVjdC0+Q3JlYXRlKHNjcCk7CisgIG1fcFN1YmplY3QgPSBuZXcgQ1BXTF9MYWJlbDsKKyAgUFdMX0NSRUFURVBBUkFNIHNjcCA9IGNwOworICBzY3AucFBhcmVudFduZCA9IHRoaXM7CisgIHNjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQRVNfTEVGVCB8IFBFU19UT1A7CisgIHNjcC5zVGV4dENvbG9yID0gc1RleHRDb2xvcjsKKyAgbV9wU3ViamVjdC0+Q3JlYXRlKHNjcCk7CiAKLQltX3BEYXRlVGltZSA9IG5ldyBDUFdMX0xhYmVsOwotCVBXTF9DUkVBVEVQQVJBTSBkY3AgPSBjcDsKLQlkY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JZGNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBFU19SSUdIVCB8IFBFU19UT1A7Ci0JZGNwLnNUZXh0Q29sb3IgPSBzVGV4dENvbG9yOwotCW1fcERhdGVUaW1lLT5DcmVhdGUoZGNwKTsKKyAgbV9wRGF0ZVRpbWUgPSBuZXcgQ1BXTF9MYWJlbDsKKyAgUFdMX0NSRUFURVBBUkFNIGRjcCA9IGNwOworICBkY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGRjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQRVNfUklHSFQgfCBQRVNfVE9QOworICBkY3Auc1RleHRDb2xvciA9IHNUZXh0Q29sb3I7CisgIG1fcERhdGVUaW1lLT5DcmVhdGUoZGNwKTsKIAotCW1fcENvbnRlbnRzID0gbmV3IENQV0xfTm90ZV9Db250ZW50czsKLQlQV0xfQ1JFQVRFUEFSQU0gY2NwID0gY3A7Ci0JY2NwLnBQYXJlbnRXbmQgPSB0aGlzOwotCS8vY2NwLnNCYWNrZ3JvdW5kQ29sb3IgPSBQV0xfREVGQVVMVF9XSElURUNPTE9SOwotCWNjcC5zQmFja2dyb3VuZENvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAyNDAvMjU1LjBmLCAyNDAvMjU1LjBmLCAyNDAvMjU1LjBmKTsKLQljY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEIHwgUFdTX0JBQ0tHUk9VTkQ7Ci0JbV9wQ29udGVudHMtPkNyZWF0ZShjY3ApOwotCW1fcENvbnRlbnRzLT5TZXRJdGVtU3BhY2UoUE9QVVBfSVRFTV9TUEFDRSk7Ci0JbV9wQ29udGVudHMtPlNldFRvcFNwYWNlKFBPUFVQX0lURU1fU1BBQ0UpOwotCW1fcENvbnRlbnRzLT5TZXRCb3R0b21TcGFjZShQT1BVUF9JVEVNX1NQQUNFKTsKKyAgbV9wQ29udGVudHMgPSBuZXcgQ1BXTF9Ob3RlX0NvbnRlbnRzOworICBQV0xfQ1JFQVRFUEFSQU0gY2NwID0gY3A7CisgIGNjcC5wUGFyZW50V25kID0gdGhpczsKKyAgLy8gY2NwLnNCYWNrZ3JvdW5kQ29sb3IgPSBQV0xfREVGQVVMVF9XSElURUNPTE9SOworICBjY3Auc0JhY2tncm91bmRDb2xvciA9CisgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDI0MCAvIDI1NS4wZiwgMjQwIC8gMjU1LjBmLCAyNDAgLyAyNTUuMGYpOworICBjY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEIHwgUFdTX0JBQ0tHUk9VTkQ7CisgIG1fcENvbnRlbnRzLT5DcmVhdGUoY2NwKTsKKyAgbV9wQ29udGVudHMtPlNldEl0ZW1TcGFjZShQT1BVUF9JVEVNX1NQQUNFKTsKKyAgbV9wQ29udGVudHMtPlNldFRvcFNwYWNlKFBPUFVQX0lURU1fU1BBQ0UpOworICBtX3BDb250ZW50cy0+U2V0Qm90dG9tU3BhY2UoUE9QVVBfSVRFTV9TUEFDRSk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlSXRlbTo6UmVQb3NDaGlsZFduZCgpCi17Ci0JaWYgKElzVmFsaWQoKSkKLQl7Ci0JCUFTU0VSVChtX3BTdWJqZWN0ICE9IE5VTEwpOwotCQlBU1NFUlQobV9wRGF0ZVRpbWUgIT0gTlVMTCk7Ci0JCUFTU0VSVChtX3BDb250ZW50cyAhPSBOVUxMKTsKK3ZvaWQgQ1BXTF9Ob3RlSXRlbTo6UmVQb3NDaGlsZFduZCgpIHsKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIEFTU0VSVChtX3BTdWJqZWN0ICE9IE5VTEwpOworICAgIEFTU0VSVChtX3BEYXRlVGltZSAhPSBOVUxMKTsKKyAgICBBU1NFUlQobV9wQ29udGVudHMgIT0gTlVMTCk7CiAKLQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICAgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKIAotCQlDUERGX1JlY3QgcmNTdWJqZWN0ID0gcmNDbGllbnQ7Ci0JCXJjU3ViamVjdC5sZWZ0ICs9IFBPUFVQX0lURU1fVEVYVF9JTkRFTlQ7Ci0JCXJjU3ViamVjdC50b3AgPSByY0NsaWVudC50b3A7Ci0JCXJjU3ViamVjdC5yaWdodCA9IFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCkgKyAxLjBmLCByY0NsaWVudC5yaWdodCk7Ci0JCXJjU3ViamVjdC5ib3R0b20gPSByY1N1YmplY3QudG9wIC0gbV9wU3ViamVjdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKLQkJcmNTdWJqZWN0Lk5vcm1hbGl6ZSgpOwotCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgVFJVRSwgRkFMU0UpOwotCQltX3BTdWJqZWN0LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNTdWJqZWN0KSk7CisgICAgQ1BERl9SZWN0IHJjU3ViamVjdCA9IHJjQ2xpZW50OworICAgIHJjU3ViamVjdC5sZWZ0ICs9IFBPUFVQX0lURU1fVEVYVF9JTkRFTlQ7CisgICAgcmNTdWJqZWN0LnRvcCA9IHJjQ2xpZW50LnRvcDsKKyAgICByY1N1YmplY3QucmlnaHQgPQorICAgICAgICBQV0xfTUlOKHJjU3ViamVjdC5sZWZ0ICsgbV9wU3ViamVjdC0+R2V0Q29udGVudFJlY3QoKS5XaWR0aCgpICsgMS4wZiwKKyAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCk7CisgICAgcmNTdWJqZWN0LmJvdHRvbSA9IHJjU3ViamVjdC50b3AgLSBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOworICAgIHJjU3ViamVjdC5Ob3JtYWxpemUoKTsKKyAgICBtX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgVFJVRSwgRkFMU0UpOworICAgIG1fcFN1YmplY3QtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY1N1YmplY3QpKTsKIAotCQlDUERGX1JlY3QgcmNEYXRlID0gcmNDbGllbnQ7Ci0JCXJjRGF0ZS5yaWdodCAtPSBQT1BVUF9JVEVNX1RFWFRfSU5ERU5UOwotCQlyY0RhdGUubGVmdCA9IFBXTF9NQVgocmNEYXRlLnJpZ2h0IC0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSAtIDEuMGYsIHJjU3ViamVjdC5yaWdodCk7Ci0JCXJjRGF0ZS5ib3R0b20gPSByY0RhdGUudG9wIC0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7Ci0JCXJjRGF0ZS5Ob3JtYWxpemUoKTsKLQkJbV9wRGF0ZVRpbWUtPk1vdmUocmNEYXRlLCBUUlVFLCBGQUxTRSk7Ci0JCW1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CisgICAgQ1BERl9SZWN0IHJjRGF0ZSA9IHJjQ2xpZW50OworICAgIHJjRGF0ZS5yaWdodCAtPSBQT1BVUF9JVEVNX1RFWFRfSU5ERU5UOworICAgIHJjRGF0ZS5sZWZ0ID0KKyAgICAgICAgUFdMX01BWChyY0RhdGUucmlnaHQgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5XaWR0aCgpIC0gMS4wZiwKKyAgICAgICAgICAgICAgICByY1N1YmplY3QucmlnaHQpOworICAgIHJjRGF0ZS5ib3R0b20gPSByY0RhdGUudG9wIC0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgcmNEYXRlLk5vcm1hbGl6ZSgpOworICAgIG1fcERhdGVUaW1lLT5Nb3ZlKHJjRGF0ZSwgVFJVRSwgRkFMU0UpOworICAgIG1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CiAKLQkJQ1BERl9SZWN0IHJjQ29udGVudHMgPSByY0NsaWVudDsKLQkJcmNDb250ZW50cy5sZWZ0ICs9IDEuMGY7Ci0JCXJjQ29udGVudHMucmlnaHQgLT0gMS4wZjsKLQkJcmNDb250ZW50cy50b3AgPSByY0RhdGUuYm90dG9tIC0gUE9QVVBfSVRFTV9IRUFEX0JPVFRPTTsKLQkJcmNDb250ZW50cy5ib3R0b20gKz0gUE9QVVBfSVRFTV9CT1RUT01XSURUSDsKLQkJcmNDb250ZW50cy5Ob3JtYWxpemUoKTsKLQkJbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgVFJVRSwgRkFMU0UpOwotCQltX3BDb250ZW50cy0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjQ29udGVudHMpKTsKLQl9CisgICAgQ1BERl9SZWN0IHJjQ29udGVudHMgPSByY0NsaWVudDsKKyAgICByY0NvbnRlbnRzLmxlZnQgKz0gMS4wZjsKKyAgICByY0NvbnRlbnRzLnJpZ2h0IC09IDEuMGY7CisgICAgcmNDb250ZW50cy50b3AgPSByY0RhdGUuYm90dG9tIC0gUE9QVVBfSVRFTV9IRUFEX0JPVFRPTTsKKyAgICByY0NvbnRlbnRzLmJvdHRvbSArPSBQT1BVUF9JVEVNX0JPVFRPTVdJRFRIOworICAgIHJjQ29udGVudHMuTm9ybWFsaXplKCk7CisgICAgbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgVFJVRSwgRkFMU0UpOworICAgIG1fcENvbnRlbnRzLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNDb250ZW50cykpOworICB9CiAKLQlTZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChHZXRXaW5kb3dSZWN0KCksMS4wZikpOworICBTZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChHZXRXaW5kb3dSZWN0KCksIDEuMGYpKTsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpTZXRQcml2YXRlRGF0YSh2b2lkKiBwRGF0YSkKLXsKLQltX3BQcml2YXRlRGF0YSA9IHBEYXRhOwordm9pZCBDUFdMX05vdGVJdGVtOjpTZXRQcml2YXRlRGF0YSh2b2lkKiBwRGF0YSkgeworICBtX3BQcml2YXRlRGF0YSA9IHBEYXRhOwogfQogCi12b2lkIENQV0xfTm90ZUl0ZW06OlNldEJrQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0JQ1BXTF9Db2xvciBzQksgPSBjb2xvcjsKLQlTZXRCYWNrZ3JvdW5kQ29sb3Ioc0JLKTsKK3ZvaWQgQ1BXTF9Ob3RlSXRlbTo6U2V0QmtDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgeworICBDUFdMX0NvbG9yIHNCSyA9IGNvbG9yOworICBTZXRCYWNrZ3JvdW5kQ29sb3Ioc0JLKTsKIAotCUNQV0xfQ29sb3Igc1RleHRDb2xvcjsKKyAgQ1BXTF9Db2xvciBzVGV4dENvbG9yOwogCi0JaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKHNCSykpCi0JCXNUZXh0Q29sb3IgPSBQV0xfREVGQVVMVF9XSElURUNPTE9SOwotCWVsc2UKLQkJc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7CisgIGlmIChDUFdMX1V0aWxzOjpJc0JsYWNrT3JXaGl0ZShzQkspKQorICAgIHNUZXh0Q29sb3IgPSBQV0xfREVGQVVMVF9XSElURUNPTE9SOworICBlbHNlCisgICAgc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7CiAKLQlTZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7Ci0JaWYgKG1fcFN1YmplY3QpCi0JCW1fcFN1YmplY3QtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKLQlpZiAobV9wRGF0ZVRpbWUpCi0JCW1fcERhdGVUaW1lLT5TZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7CisgIFNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKKyAgaWYgKG1fcFN1YmplY3QpCisgICAgbV9wU3ViamVjdC0+U2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOworICBpZiAobV9wRGF0ZVRpbWUpCisgICAgbV9wRGF0ZVRpbWUtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKIAotCUludmFsaWRhdGVSZWN0KG51bGxwdHIpOworICBJbnZhbGlkYXRlUmVjdChudWxscHRyKTsKIAotCWlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpCi0JewotCQlwTm90aWZ5LT5PblNldEJrQ29sb3IodGhpcyk7Ci0JfQorICBpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKSB7CisgICAgcE5vdGlmeS0+T25TZXRCa0NvbG9yKHRoaXMpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlSXRlbTo6U2V0U3ViamVjdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKQotewotCWlmIChtX3BTdWJqZWN0KQotCXsKLQkJbV9wU3ViamVjdC0+U2V0VGV4dChzTmFtZS5jX3N0cigpKTsKLQl9Cit2b2lkIENQV0xfTm90ZUl0ZW06OlNldFN1YmplY3ROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkgeworICBpZiAobV9wU3ViamVjdCkgeworICAgIG1fcFN1YmplY3QtPlNldFRleHQoc05hbWUuY19zdHIoKSk7CisgIH0KIAotCWlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpCi0JewotCQlwTm90aWZ5LT5PblNldFN1YmplY3ROYW1lKHRoaXMpOwotCX0KKyAgaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkgeworICAgIHBOb3RpZnktPk9uU2V0U3ViamVjdE5hbWUodGhpcyk7CisgIH0KIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpTZXRBdXRob3JOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkKLXsKLQltX3NBdXRob3IgPSBzTmFtZTsKLQlSZXNldFN1YmplY3ROYW1lKC0xKTsKK3ZvaWQgQ1BXTF9Ob3RlSXRlbTo6U2V0QXV0aG9yTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpIHsKKyAgbV9zQXV0aG9yID0gc05hbWU7CisgIFJlc2V0U3ViamVjdE5hbWUoLTEpOwogCi0JaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKLQl7Ci0JCXBOb3RpZnktPk9uU2V0QXV0aG9yTmFtZSh0aGlzKTsKLQl9CisgIGlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpIHsKKyAgICBwTm90aWZ5LT5PblNldEF1dGhvck5hbWUodGhpcyk7CisgIH0KIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpSZXNldFN1YmplY3ROYW1lKGludDMyX3Qgbkl0ZW1JbmRleCkKLXsKLQlpZiAobkl0ZW1JbmRleCA8IDApCi0JewotCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKLQkJewotCQkJQVNTRVJUKHBQYXJlbnQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVfQ29udGVudHMiKTsKK3ZvaWQgQ1BXTF9Ob3RlSXRlbTo6UmVzZXRTdWJqZWN0TmFtZShpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgaWYgKG5JdGVtSW5kZXggPCAwKSB7CisgICAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICAgIEFTU0VSVChwUGFyZW50LT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlX0NvbnRlbnRzIik7CiAKLQkJCUNQV0xfTm90ZV9Db250ZW50cyogcENvbnRlbnRzID0gKENQV0xfTm90ZV9Db250ZW50cyopcFBhcmVudDsKLQkJCW5JdGVtSW5kZXggPSBwQ29udGVudHMtPkdldEl0ZW1JbmRleCh0aGlzKTsKLQkJfQotCX0KKyAgICAgIENQV0xfTm90ZV9Db250ZW50cyogcENvbnRlbnRzID0gKENQV0xfTm90ZV9Db250ZW50cyopcFBhcmVudDsKKyAgICAgIG5JdGVtSW5kZXggPSBwQ29udGVudHMtPkdldEl0ZW1JbmRleCh0aGlzKTsKKyAgICB9CisgIH0KIAotCWNvbnN0IENQV0xfTm90ZSogcE5vdGUgPSBHZXROb3RlKCk7Ci0JQVNTRVJUKHBOb3RlICE9IE5VTEwpOworICBjb25zdCBDUFdMX05vdGUqIHBOb3RlID0gR2V0Tm90ZSgpOworICBBU1NFUlQocE5vdGUgIT0gTlVMTCk7CiAKLQlDRlhfV2lkZVN0cmluZyBzU3ViamVjdDsKLQlzU3ViamVjdC5Gb3JtYXQocE5vdGUtPkdldFJlcGx5U3RyaW5nKCkuY19zdHIoKSwgbkl0ZW1JbmRleCk7CisgIENGWF9XaWRlU3RyaW5nIHNTdWJqZWN0OworICBzU3ViamVjdC5Gb3JtYXQocE5vdGUtPkdldFJlcGx5U3RyaW5nKCkuY19zdHIoKSwgbkl0ZW1JbmRleCk7CiAKLQlpZiAoIW1fc0F1dGhvci5Jc0VtcHR5KCkpCi0JewotCQlzU3ViamVjdCArPSBMIiAtICI7Ci0JCXNTdWJqZWN0ICs9IG1fc0F1dGhvcjsKLQl9Ci0JU2V0U3ViamVjdE5hbWUoc1N1YmplY3QpOwotCVJlUG9zQ2hpbGRXbmQoKTsKKyAgaWYgKCFtX3NBdXRob3IuSXNFbXB0eSgpKSB7CisgICAgc1N1YmplY3QgKz0gTCIgLSAiOworICAgIHNTdWJqZWN0ICs9IG1fc0F1dGhvcjsKKyAgfQorICBTZXRTdWJqZWN0TmFtZShzU3ViamVjdCk7CisgIFJlUG9zQ2hpbGRXbmQoKTsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpTZXREYXRlVGltZShGWF9TWVNURU1USU1FIHRpbWUpCi17Ci0JbV9kdE5vdGUgPSB0aW1lOwordm9pZCBDUFdMX05vdGVJdGVtOjpTZXREYXRlVGltZShGWF9TWVNURU1USU1FIHRpbWUpIHsKKyAgbV9kdE5vdGUgPSB0aW1lOwogCi0JQ0ZYX1dpZGVTdHJpbmcgc3dUaW1lOwotCXN3VGltZS5Gb3JtYXQoTCIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsIHRpbWUud1llYXIsIHRpbWUud01vbnRoLCB0aW1lLndEYXksIHRpbWUud0hvdXIsIHRpbWUud01pbnV0ZSwgdGltZS53U2Vjb25kKTsKLQlpZiAobV9wRGF0ZVRpbWUpCi0JewotCQltX3BEYXRlVGltZS0+U2V0VGV4dChzd1RpbWUuY19zdHIoKSk7Ci0JfQorICBDRlhfV2lkZVN0cmluZyBzd1RpbWU7CisgIHN3VGltZS5Gb3JtYXQoTCIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsIHRpbWUud1llYXIsIHRpbWUud01vbnRoLAorICAgICAgICAgICAgICAgIHRpbWUud0RheSwgdGltZS53SG91ciwgdGltZS53TWludXRlLCB0aW1lLndTZWNvbmQpOworICBpZiAobV9wRGF0ZVRpbWUpIHsKKyAgICBtX3BEYXRlVGltZS0+U2V0VGV4dChzd1RpbWUuY19zdHIoKSk7CisgIH0KIAotCVJlUG9zQ2hpbGRXbmQoKTsKKyAgUmVQb3NDaGlsZFduZCgpOwogCi0JaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKLQl7Ci0JCXBOb3RpZnktPk9uU2V0RGF0ZVRpbWUodGhpcyk7Ci0JfQorICBpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKSB7CisgICAgcE5vdGlmeS0+T25TZXREYXRlVGltZSh0aGlzKTsKKyAgfQogfQogCi12b2lkIENQV0xfTm90ZUl0ZW06OlNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpCi17Ci0JaWYgKG1fcENvbnRlbnRzKQotCXsKLQkJbV9wQ29udGVudHMtPlNldFRleHQoc0NvbnRlbnRzKTsKLQl9Cit2b2lkIENQV0xfTm90ZUl0ZW06OlNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpIHsKKyAgaWYgKG1fcENvbnRlbnRzKSB7CisgICAgbV9wQ29udGVudHMtPlNldFRleHQoc0NvbnRlbnRzKTsKKyAgfQogCi0JaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKLQl7Ci0JCXBOb3RpZnktPk9uU2V0Q29udGVudHModGhpcyk7Ci0JfQorICBpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKSB7CisgICAgcE5vdGlmeS0+T25TZXRDb250ZW50cyh0aGlzKTsKKyAgfQogfQogCi1DUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpHZXRQYXJlbnROb3RlSXRlbSgpIGNvbnN0Ci17Ci0JaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCi0JewotCQlpZiAoQ1BXTF9XbmQqIHBHcmFuZCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpKQotCQl7Ci0JCQlBU1NFUlQocEdyYW5kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOwotCQkJcmV0dXJuIChDUFdMX05vdGVJdGVtKilwR3JhbmQ7Ci0JCX0KLQl9CitDUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpHZXRQYXJlbnROb3RlSXRlbSgpIGNvbnN0IHsKKyAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBHcmFuZCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICBBU1NFUlQocEdyYW5kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOworICAgICAgcmV0dXJuIChDUFdMX05vdGVJdGVtKilwR3JhbmQ7CisgICAgfQorICB9CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLUlQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZUl0ZW06OkdldFBhcmVudEl0ZW0oKSBjb25zdAotewotCXJldHVybiBHZXRQYXJlbnROb3RlSXRlbSgpOworSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlSXRlbTo6R2V0UGFyZW50SXRlbSgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFBhcmVudE5vdGVJdGVtKCk7CiB9CiAKLUNQV0xfRWRpdCogQ1BXTF9Ob3RlSXRlbTo6R2V0RWRpdCgpIGNvbnN0Ci17Ci0JaWYgKG1fcENvbnRlbnRzKQotCQlyZXR1cm4gbV9wQ29udGVudHMtPkdldEVkaXQoKTsKLQlyZXR1cm4gTlVMTDsKK0NQV0xfRWRpdCogQ1BXTF9Ob3RlSXRlbTo6R2V0RWRpdCgpIGNvbnN0IHsKKyAgaWYgKG1fcENvbnRlbnRzKQorICAgIHJldHVybiBtX3BDb250ZW50cy0+R2V0RWRpdCgpOworICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCogQ1BXTF9Ob3RlSXRlbTo6R2V0UHJpdmF0ZURhdGEoKSBjb25zdAotewotCXJldHVybiBtX3BQcml2YXRlRGF0YTsKK3ZvaWQqIENQV0xfTm90ZUl0ZW06OkdldFByaXZhdGVEYXRhKCkgY29uc3QgeworICByZXR1cm4gbV9wUHJpdmF0ZURhdGE7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQV0xfTm90ZUl0ZW06OkdldEF1dGhvck5hbWUoKSBjb25zdAotewotCXJldHVybiBtX3NBdXRob3I7CitDRlhfV2lkZVN0cmluZyBDUFdMX05vdGVJdGVtOjpHZXRBdXRob3JOYW1lKCkgY29uc3QgeworICByZXR1cm4gbV9zQXV0aG9yOwogfQogCi1DUFdMX0NvbG9yIENQV0xfTm90ZUl0ZW06OkdldEJrQ29sb3IoKSBjb25zdAotewotCXJldHVybiBHZXRCYWNrZ3JvdW5kQ29sb3IoKTsKK0NQV0xfQ29sb3IgQ1BXTF9Ob3RlSXRlbTo6R2V0QmtDb2xvcigpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEJhY2tncm91bmRDb2xvcigpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUFdMX05vdGVJdGVtOjpHZXRDb250ZW50cygpIGNvbnN0Ci17Ci0JaWYgKG1fcENvbnRlbnRzKQotCQlyZXR1cm4gbV9wQ29udGVudHMtPkdldFRleHQoKTsKK0NGWF9XaWRlU3RyaW5nIENQV0xfTm90ZUl0ZW06OkdldENvbnRlbnRzKCkgY29uc3QgeworICBpZiAobV9wQ29udGVudHMpCisgICAgcmV0dXJuIG1fcENvbnRlbnRzLT5HZXRUZXh0KCk7CiAKLQlyZXR1cm4gTCIiOworICByZXR1cm4gTCIiOwogfQogCi1GWF9TWVNURU1USU1FIENQV0xfTm90ZUl0ZW06OkdldERhdGVUaW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9kdE5vdGU7CitGWF9TWVNURU1USU1FIENQV0xfTm90ZUl0ZW06OkdldERhdGVUaW1lKCkgY29uc3QgeworICByZXR1cm4gbV9kdE5vdGU7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQV0xfTm90ZUl0ZW06OkdldFN1YmplY3ROYW1lKCkgY29uc3QKLXsKLQlpZiAobV9wU3ViamVjdCkKLQkJcmV0dXJuIG1fcFN1YmplY3QtPkdldFRleHQoKTsKK0NGWF9XaWRlU3RyaW5nIENQV0xfTm90ZUl0ZW06OkdldFN1YmplY3ROYW1lKCkgY29uc3QgeworICBpZiAobV9wU3ViamVjdCkKKyAgICByZXR1cm4gbV9wU3ViamVjdC0+R2V0VGV4dCgpOwogCi0JcmV0dXJuIEwiIjsKKyAgcmV0dXJuIEwiIjsKIH0KIAotQ1BXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlSXRlbTo6Q3JlYXRlTm90ZUl0ZW0oKQotewotCWlmIChtX3BDb250ZW50cykKLQkJcmV0dXJuIG1fcENvbnRlbnRzLT5DcmVhdGVTdWJJdGVtKCk7CitDUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpDcmVhdGVOb3RlSXRlbSgpIHsKKyAgaWYgKG1fcENvbnRlbnRzKQorICAgIHJldHVybiBtX3BDb250ZW50cy0+Q3JlYXRlU3ViSXRlbSgpOwogCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi1JUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpDcmVhdGVTdWJJdGVtKCkKLXsKLQlyZXR1cm4gQ3JlYXRlTm90ZUl0ZW0oKTsKK0lQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZUl0ZW06OkNyZWF0ZVN1Ykl0ZW0oKSB7CisgIHJldHVybiBDcmVhdGVOb3RlSXRlbSgpOwogfQogCi1pbnQzMl90IENQV0xfTm90ZUl0ZW06OkNvdW50U3ViSXRlbXMoKSBjb25zdAotewotCWlmIChtX3BDb250ZW50cykKLQkJcmV0dXJuIG1fcENvbnRlbnRzLT5Db3VudFN1Ykl0ZW1zKCk7CitpbnQzMl90IENQV0xfTm90ZUl0ZW06OkNvdW50U3ViSXRlbXMoKSBjb25zdCB7CisgIGlmIChtX3BDb250ZW50cykKKyAgICByZXR1cm4gbV9wQ29udGVudHMtPkNvdW50U3ViSXRlbXMoKTsKIAotCXJldHVybiAwOworICByZXR1cm4gMDsKIH0KIAotSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlSXRlbTo6R2V0U3ViSXRlbXMoaW50MzJfdCBpbmRleCkgY29uc3QKLXsKLQlpZiAobV9wQ29udGVudHMpCi0JCXJldHVybiBtX3BDb250ZW50cy0+R2V0U3ViSXRlbXMoaW5kZXgpOworSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlSXRlbTo6R2V0U3ViSXRlbXMoaW50MzJfdCBpbmRleCkgY29uc3QgeworICBpZiAobV9wQ29udGVudHMpCisgICAgcmV0dXJuIG1fcENvbnRlbnRzLT5HZXRTdWJJdGVtcyhpbmRleCk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlSXRlbTo6RGVsZXRlU3ViSXRlbShJUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0pCi17Ci0JS2lsbEZvY3VzKCk7Cit2b2lkIENQV0xfTm90ZUl0ZW06OkRlbGV0ZVN1Ykl0ZW0oSVBXTF9Ob3RlSXRlbSogcE5vdGVJdGVtKSB7CisgIEtpbGxGb2N1cygpOwogCi0JaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKLQl7Ci0JCXBOb3RpZnktPk9uSXRlbURlbGV0ZShwTm90ZUl0ZW0pOwotCX0KKyAgaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkgeworICAgIHBOb3RpZnktPk9uSXRlbURlbGV0ZShwTm90ZUl0ZW0pOworICB9CiAKLQlpZiAobV9wQ29udGVudHMpCi0JCW1fcENvbnRlbnRzLT5EZWxldGVTdWJJdGVtKHBOb3RlSXRlbSk7CisgIGlmIChtX3BDb250ZW50cykKKyAgICBtX3BDb250ZW50cy0+RGVsZXRlU3ViSXRlbShwTm90ZUl0ZW0pOwogfQogCi1JUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlDUERGX1BvaW50IHB0ID0gUGFyZW50VG9DaGlsZChwb2ludCk7CitJUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBDUERGX1BvaW50IHB0ID0gUGFyZW50VG9DaGlsZChwb2ludCk7CiAKLQlpZiAoV25kSGl0VGVzdChwdCkpCi0JewotCQlpZiAobV9wQ29udGVudHMpCi0JCXsKLQkJCWlmIChJUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSBtX3BDb250ZW50cy0+R2V0SGl0Tm90ZUl0ZW0ocHQpKQotCQkJCXJldHVybiBwTm90ZUl0ZW07Ci0JCX0KKyAgaWYgKFduZEhpdFRlc3QocHQpKSB7CisgICAgaWYgKG1fcENvbnRlbnRzKSB7CisgICAgICBpZiAoSVBXTF9Ob3RlSXRlbSogcE5vdGVJdGVtID0gbV9wQ29udGVudHMtPkdldEhpdE5vdGVJdGVtKHB0KSkKKyAgICAgICAgcmV0dXJuIHBOb3RlSXRlbTsKKyAgICB9CiAKLQkJcmV0dXJuIHRoaXM7Ci0JfQorICAgIHJldHVybiB0aGlzOworICB9CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLUlQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZUl0ZW06OkdldEZvY3VzZWROb3RlSXRlbSgpIGNvbnN0Ci17Ci0JaWYgKGNvbnN0IENQV0xfV25kKiBwV25kID0gR2V0Rm9jdXNlZCgpKQotCXsKLQkJaWYgKHBXbmQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX0VkaXQiKQotCQl7Ci0JCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBwV25kLT5HZXRQYXJlbnRXaW5kb3coKSkKLQkJCXsKLQkJCQlBU1NFUlQocFBhcmVudC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZV9Db250ZW50cyIpOworSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlSXRlbTo6R2V0Rm9jdXNlZE5vdGVJdGVtKCkgY29uc3QgeworICBpZiAoY29uc3QgQ1BXTF9XbmQqIHBXbmQgPSBHZXRGb2N1c2VkKCkpIHsKKyAgICBpZiAocFduZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfRWRpdCIpIHsKKyAgICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IHBXbmQtPkdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgIEFTU0VSVChwUGFyZW50LT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlX0NvbnRlbnRzIik7CiAKLQkJCQlpZiAoQ1BXTF9XbmQqIHBHcmFuZCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpKQotCQkJCXsKLQkJCQkJQVNTRVJUKHBHcmFuZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKTsKLQkJCQkJcmV0dXJuIChDUFdMX05vdGVJdGVtKilwR3JhbmQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICBpZiAoQ1BXTF9XbmQqIHBHcmFuZCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgICAgQVNTRVJUKHBHcmFuZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKTsKKyAgICAgICAgICByZXR1cm4gKENQV0xfTm90ZUl0ZW0qKXBHcmFuZDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi1GWF9GTE9BVCBDUFdMX05vdGVJdGVtOjpHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKQotewotCWlmIChmTGltaXRXaWR0aCA+IDApCi0JewotCQlpZiAoIW1fYlNpemVDaGFuZ2VkKQotCQkJcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQ7CitGWF9GTE9BVCBDUFdMX05vdGVJdGVtOjpHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKSB7CisgIGlmIChmTGltaXRXaWR0aCA+IDApIHsKKyAgICBpZiAoIW1fYlNpemVDaGFuZ2VkKQorICAgICAgcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQ7CiAKLQkJbV9iU2l6ZUNoYW5nZWQgPSBGQUxTRTsKKyAgICBtX2JTaXplQ2hhbmdlZCA9IEZBTFNFOwogCi0JCUFTU0VSVChtX3BTdWJqZWN0ICE9IE5VTEwpOwotCQlBU1NFUlQobV9wRGF0ZVRpbWUgIT0gTlVMTCk7Ci0JCUFTU0VSVChtX3BDb250ZW50cyAhPSBOVUxMKTsKKyAgICBBU1NFUlQobV9wU3ViamVjdCAhPSBOVUxMKTsKKyAgICBBU1NFUlQobV9wRGF0ZVRpbWUgIT0gTlVMTCk7CisgICAgQVNTRVJUKG1fcENvbnRlbnRzICE9IE5VTEwpOwogCi0JCUZYX0ZMT0FUIGZSZXQgPSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKLQkJRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0JCWlmIChmTGltaXRXaWR0aCA+IGZCb3JkZXJXaWR0aCAqIDIpCi0JCQlmUmV0ICs9IG1fcENvbnRlbnRzLT5HZXRDb250ZW50c0hlaWdodChmTGltaXRXaWR0aCAtIGZCb3JkZXJXaWR0aCAqIDIpOwotCQlmUmV0ICs9IFBPUFVQX0lURU1fSEVBRF9CT1RUT00gKyBQT1BVUF9JVEVNX0JPVFRPTVdJRFRIICsgZkJvcmRlcldpZHRoICogMjsKKyAgICBGWF9GTE9BVCBmUmV0ID0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7CisgICAgaWYgKGZMaW1pdFdpZHRoID4gZkJvcmRlcldpZHRoICogMikKKyAgICAgIGZSZXQgKz0gbV9wQ29udGVudHMtPkdldENvbnRlbnRzSGVpZ2h0KGZMaW1pdFdpZHRoIC0gZkJvcmRlcldpZHRoICogMik7CisgICAgZlJldCArPSBQT1BVUF9JVEVNX0hFQURfQk9UVE9NICsgUE9QVVBfSVRFTV9CT1RUT01XSURUSCArIGZCb3JkZXJXaWR0aCAqIDI7CiAKLQkJcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQgPSBmUmV0OwotCX0KKyAgICByZXR1cm4gbV9mT2xkSXRlbUhlaWdodCA9IGZSZXQ7CisgIH0KIAotCXJldHVybiAwOworICByZXR1cm4gMDsKIH0KIAotRlhfRkxPQVQgQ1BXTF9Ob3RlSXRlbTo6R2V0SXRlbUxlZnRNYXJnaW4oKQotewotCXJldHVybiBQT1BVUF9JVEVNX1NJREVNQVJHSU47CitGWF9GTE9BVCBDUFdMX05vdGVJdGVtOjpHZXRJdGVtTGVmdE1hcmdpbigpIHsKKyAgcmV0dXJuIFBPUFVQX0lURU1fU0lERU1BUkdJTjsKIH0KIAotRlhfRkxPQVQgQ1BXTF9Ob3RlSXRlbTo6R2V0SXRlbVJpZ2h0TWFyZ2luKCkKLXsKLQlyZXR1cm4gUE9QVVBfSVRFTV9TSURFTUFSR0lOOworRlhfRkxPQVQgQ1BXTF9Ob3RlSXRlbTo6R2V0SXRlbVJpZ2h0TWFyZ2luKCkgeworICByZXR1cm4gUE9QVVBfSVRFTV9TSURFTUFSR0lOOwogfQogCi1GWF9CT09MCUNQV0xfTm90ZUl0ZW06Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmICghbV9wQ29udGVudHMtPlduZEhpdFRlc3QobV9wQ29udGVudHMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKLQl7Ci0JCVNldE5vdGVGb2N1cyhGQUxTRSk7Ci0JfQorRlhfQk9PTCBDUFdMX05vdGVJdGVtOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fcENvbnRlbnRzLT5XbmRIaXRUZXN0KG1fcENvbnRlbnRzLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpIHsKKyAgICBTZXROb3RlRm9jdXMoRkFMU0UpOworICB9CiAKLQlDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CisgIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wJQ1BXTF9Ob3RlSXRlbTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlpZiAoIW1fcENvbnRlbnRzLT5XbmRIaXRUZXN0KG1fcENvbnRlbnRzLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpCi0JewotCQlTZXROb3RlRm9jdXMoRkFMU0UpOwotCQlQb3B1cE5vdGVJdGVtTWVudShwb2ludCk7CitGWF9CT09MIENQV0xfTm90ZUl0ZW06Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fcENvbnRlbnRzLT5XbmRIaXRUZXN0KG1fcENvbnRlbnRzLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpIHsKKyAgICBTZXROb3RlRm9jdXMoRkFMU0UpOworICAgIFBvcHVwTm90ZUl0ZW1NZW51KHBvaW50KTsKIAotCQlyZXR1cm4gVFJVRTsKLQl9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotCXJldHVybiBDUFdMX1duZDo6T25SQnV0dG9uVXAocG9pbnQsbkZsYWcpOworICByZXR1cm4gQ1BXTF9XbmQ6Ok9uUkJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlSXRlbTo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCi17Ci0Jc3dpdGNoIChtc2cpCi0JewotCWNhc2UgUE5NX05PVEVFRElUQ0hBTkdFRDoKLQkJbV9iU2l6ZUNoYW5nZWQgPSBUUlVFOwordm9pZCBDUFdMX05vdGVJdGVtOjpPbk5vdGlmeShDUFdMX1duZCogcFduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSkgeworICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgUE5NX05PVEVFRElUQ0hBTkdFRDoKKyAgICAgIG1fYlNpemVDaGFuZ2VkID0gVFJVRTsKIAotCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKLQkJewotCQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7Ci0JCX0KLQkJcmV0dXJuOwotCWNhc2UgUE5NX1NFVENBUkVUSU5GTzoKLQkJaWYgKFBXTF9DQVJFVF9JTkZPICogcEluZm8gPSAoUFdMX0NBUkVUX0lORk8qKXdQYXJhbSkKLQkJewotCQkJUFdMX0NBUkVUX0lORk8gbmV3SW5mbyA9ICpwSW5mbzsKLQkJCW5ld0luZm8uYlZpc2libGUgPSBUUlVFOwotCQkJbmV3SW5mby5wdEhlYWQgPSBDaGlsZFRvUGFyZW50KHBJbmZvLT5wdEhlYWQpOwotCQkJbmV3SW5mby5wdEZvb3QgPSBDaGlsZFRvUGFyZW50KHBJbmZvLT5wdEZvb3QpOworICAgICAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICAgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgY2FzZSBQTk1fU0VUQ0FSRVRJTkZPOgorICAgICAgaWYgKFBXTF9DQVJFVF9JTkZPKiBwSW5mbyA9IChQV0xfQ0FSRVRfSU5GTyopd1BhcmFtKSB7CisgICAgICAgIFBXTF9DQVJFVF9JTkZPIG5ld0luZm8gPSAqcEluZm87CisgICAgICAgIG5ld0luZm8uYlZpc2libGUgPSBUUlVFOworICAgICAgICBuZXdJbmZvLnB0SGVhZCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0SGVhZCk7CisgICAgICAgIG5ld0luZm8ucHRGb290ID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRGb290KTsKIAotCQkJaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQotCQkJewotCQkJCXBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRDQVJFVElORk8sIChpbnRwdHJfdCkmbmV3SW5mbywgMCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCWNhc2UgUE5NX05PVEVSRVNFVDoKLQkJbV9iU2l6ZUNoYW5nZWQgPSBUUlVFOwotCQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVSRVNFVCwgMCwgMCk7CisgICAgICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX1NFVENBUkVUSU5GTywgKGludHB0cl90KSZuZXdJbmZvLCAwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIGNhc2UgUE5NX05PVEVSRVNFVDoKKyAgICAgIG1fYlNpemVDaGFuZ2VkID0gVFJVRTsKKyAgICAgIG1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKIAotCQlyZXR1cm47Ci0JfQorICAgICAgcmV0dXJuOworICB9CiAKLQlDUFdMX1duZDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CisgIENQV0xfV25kOjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpQb3B1cE5vdGVJdGVtTWVudShjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKQotCXsKLQkJaW50MzJfdCB4LHk7Ci0JCVBXTHRvV25kKHBvaW50LCB4LCB5KTsKLQkJaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0JCQlwU0gtPkNsaWVudFRvU2NyZWVuKEdldEF0dGFjaGVkSFduZCgpLCB4LCB5KTsKLQkJcE5vdGlmeS0+T25Qb3B1cE1lbnUodGhpcywgeCwgeSk7Ci0JfQordm9pZCBDUFdMX05vdGVJdGVtOjpQb3B1cE5vdGVJdGVtTWVudShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKSB7CisgICAgaW50MzJfdCB4LCB5OworICAgIFBXTHRvV25kKHBvaW50LCB4LCB5KTsKKyAgICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKKyAgICAgIHBTSC0+Q2xpZW50VG9TY3JlZW4oR2V0QXR0YWNoZWRIV25kKCksIHgsIHkpOworICAgIHBOb3RpZnktPk9uUG9wdXBNZW51KHRoaXMsIHgsIHkpOworICB9CiB9CiAKLWNvbnN0IENQV0xfTm90ZSogQ1BXTF9Ob3RlSXRlbTo6R2V0Tm90ZSgpIGNvbnN0Ci17Ci0JaWYgKGNvbnN0IENQV0xfV25kKiBwUm9vdCA9IEdldFJvb3RXbmQoKSkKLQl7Ci0JCUFTU0VSVChwUm9vdC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKTsKLQkJQ1BXTF9Ob3RlSXRlbSogcE5vdGVJdGVtID0gKENQV0xfTm90ZUl0ZW0qKXBSb290OwotCQlpZiAocE5vdGVJdGVtLT5Jc1RvcEl0ZW0oKSkKLQkJewotCQkJcmV0dXJuIChDUFdMX05vdGUqKXBOb3RlSXRlbTsKLQkJfQotCX0KK2NvbnN0IENQV0xfTm90ZSogQ1BXTF9Ob3RlSXRlbTo6R2V0Tm90ZSgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IENQV0xfV25kKiBwUm9vdCA9IEdldFJvb3RXbmQoKSkgeworICAgIEFTU0VSVChwUm9vdC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKTsKKyAgICBDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcFJvb3Q7CisgICAgaWYgKHBOb3RlSXRlbS0+SXNUb3BJdGVtKCkpIHsKKyAgICAgIHJldHVybiAoQ1BXTF9Ob3RlKilwTm90ZUl0ZW07CisgICAgfQorICB9CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLUlQV0xfTm90ZU5vdGlmeSogQ1BXTF9Ob3RlSXRlbTo6R2V0Tm90ZU5vdGlmeSgpIGNvbnN0Ci17Ci0JaWYgKGNvbnN0IENQV0xfTm90ZSogcE5vdGUgPSBHZXROb3RlKCkpCi0JCXJldHVybiBwTm90ZS0+R2V0Tm90ZU5vdGlmeSgpOworSVBXTF9Ob3RlTm90aWZ5KiBDUFdMX05vdGVJdGVtOjpHZXROb3RlTm90aWZ5KCkgY29uc3QgeworICBpZiAoY29uc3QgQ1BXTF9Ob3RlKiBwTm90ZSA9IEdldE5vdGUoKSkKKyAgICByZXR1cm4gcE5vdGUtPkdldE5vdGVOb3RpZnkoKTsKIAotCXJldHVybiBOVUxMOworICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpPbkNyZWF0ZU5vdGVJdGVtKCkKLXsKLQlpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKQotCXsKLQkJcE5vdGlmeS0+T25JdGVtQ3JlYXRlKHRoaXMpOwotCX0KK3ZvaWQgQ1BXTF9Ob3RlSXRlbTo6T25DcmVhdGVOb3RlSXRlbSgpIHsKKyAgaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkgeworICAgIHBOb3RpZnktPk9uSXRlbUNyZWF0ZSh0aGlzKTsKKyAgfQogfQogCi12b2lkIENQV0xfTm90ZUl0ZW06Ok9uQ29udGVudHNWYWxpZGF0ZSgpCi17Ci0JaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKLQl7Ci0JCXBOb3RpZnktPk9uU2V0Q29udGVudHModGhpcyk7Ci0JfQordm9pZCBDUFdMX05vdGVJdGVtOjpPbkNvbnRlbnRzVmFsaWRhdGUoKSB7CisgIGlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpIHsKKyAgICBwTm90aWZ5LT5PblNldENvbnRlbnRzKHRoaXMpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlSXRlbTo6U2V0Tm90ZUZvY3VzKEZYX0JPT0wgYkxhc3QpCi17Ci0JbV9wQ29udGVudHMtPlNldEVkaXRGb2N1cyhiTGFzdCk7Cit2b2lkIENQV0xfTm90ZUl0ZW06OlNldE5vdGVGb2N1cyhGWF9CT09MIGJMYXN0KSB7CisgIG1fcENvbnRlbnRzLT5TZXRFZGl0Rm9jdXMoYkxhc3QpOwogfQogCi12b2lkIENQV0xfTm90ZUl0ZW06OkVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKQotewotCW1fcENvbnRlbnRzLT5FbmFibGVNb2RpZnkoYkVuYWJsZWQpOwotCW1fYkFsbG93TW9kaWZ5ID0gYkVuYWJsZWQ7Cit2b2lkIENQV0xfTm90ZUl0ZW06OkVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKSB7CisgIG1fcENvbnRlbnRzLT5FbmFibGVNb2RpZnkoYkVuYWJsZWQpOworICBtX2JBbGxvd01vZGlmeSA9IGJFbmFibGVkOwogfQogCi12b2lkIENQV0xfTm90ZUl0ZW06OkVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCkKLXsKLQltX3BDb250ZW50cy0+RW5hYmxlUmVhZChiRW5hYmxlZCk7Cit2b2lkIENQV0xfTm90ZUl0ZW06OkVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCkgeworICBtX3BDb250ZW50cy0+RW5hYmxlUmVhZChiRW5hYmxlZCk7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNQV0xfTm90ZTo6Q1BXTF9Ob3RlKElQb3B1cF9Ob3RlKiBwUG9wdXBOb3RlLCBJUFdMX05vdGVOb3RpZnkqIHBOb3RlTm90aWZ5LCBJUFdMX05vdGVIYW5kbGVyKiBwTm90ZUhhbmRsZXIpIDoKLQltX3BBdXRob3IoTlVMTCksCi0JbV9wSWNvbihOVUxMKSwKLQltX3BDbG9zZUJveChOVUxMKSwKLQltX3BMQkJveChOVUxMKSwKLQltX3BSQkJveChOVUxMKSwKLQltX3BDb250ZW50c0JhcihOVUxMKSwKLQltX3BPcHRpb25zKE5VTEwpLAotCW1fcE5vdGVOb3RpZnkocE5vdGVOb3RpZnkpLAotCW1fYlJlc2l6aW5nKEZBTFNFKSwKLQltX3JjQ2FwdGlvbigwLDAsMCwwKSwKLQltX2JFbmFsYmxlTm90aWZ5KFRSVUUpLAotCW1fcFBvcHVwTm90ZShwUG9wdXBOb3RlKQotewotfQorQ1BXTF9Ob3RlOjpDUFdMX05vdGUoSVBvcHVwX05vdGUqIHBQb3B1cE5vdGUsCisgICAgICAgICAgICAgICAgICAgICBJUFdMX05vdGVOb3RpZnkqIHBOb3RlTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgSVBXTF9Ob3RlSGFuZGxlciogcE5vdGVIYW5kbGVyKQorICAgIDogbV9wQXV0aG9yKE5VTEwpLAorICAgICAgbV9wSWNvbihOVUxMKSwKKyAgICAgIG1fcENsb3NlQm94KE5VTEwpLAorICAgICAgbV9wTEJCb3goTlVMTCksCisgICAgICBtX3BSQkJveChOVUxMKSwKKyAgICAgIG1fcENvbnRlbnRzQmFyKE5VTEwpLAorICAgICAgbV9wT3B0aW9ucyhOVUxMKSwKKyAgICAgIG1fcE5vdGVOb3RpZnkocE5vdGVOb3RpZnkpLAorICAgICAgbV9iUmVzaXppbmcoRkFMU0UpLAorICAgICAgbV9yY0NhcHRpb24oMCwgMCwgMCwgMCksCisgICAgICBtX2JFbmFsYmxlTm90aWZ5KFRSVUUpLAorICAgICAgbV9wUG9wdXBOb3RlKHBQb3B1cE5vdGUpIHt9CiAKLUNQV0xfTm90ZTo6fkNQV0xfTm90ZSgpCi17Ci19CitDUFdMX05vdGU6On5DUFdMX05vdGUoKSB7fQogCi1JUFdMX05vdGVJdGVtKiBDUFdMX05vdGU6OlJlcGx5KCkKLXsKLQlyZXR1cm4gQ3JlYXRlTm90ZUl0ZW0oKTsKK0lQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZTo6UmVwbHkoKSB7CisgIHJldHVybiBDcmVhdGVOb3RlSXRlbSgpOwogfQogCi12b2lkIENQV0xfTm90ZTo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0JbV9iRW5hbGJsZU5vdGlmeSA9IGJFbmFibGVkOwordm9pZCBDUFdMX05vdGU6OkVuYWJsZU5vdGlmeShGWF9CT09MIGJFbmFibGVkKSB7CisgIG1fYkVuYWxibGVOb3RpZnkgPSBiRW5hYmxlZDsKIH0KIAotdm9pZCBDUFdMX05vdGU6OlJlUG9zQ2hpbGRXbmQoKQotewotCVJlUG9zTm90ZUNoaWxkcmVuKCk7Ci0JbV9wQ29udGVudHMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOwotCVJlc2V0U2Nyb2xsQmFyKCk7Ci0JbV9wQ29udGVudHMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOwotCU9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIDApOwotCWlmIChjb25zdCBDUFdMX1duZCogcFduZCA9IEdldEZvY3VzZWQoKSkKLQl7Ci0JCWlmIChwV25kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9FZGl0IikKLQkJewotCQkJQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKXBXbmQ7Ci0JCQlwRWRpdC0+U2V0Q2FyZXQocEVkaXQtPkdldENhcmV0KCkpOwotCQl9Ci0JfQordm9pZCBDUFdMX05vdGU6OlJlUG9zQ2hpbGRXbmQoKSB7CisgIFJlUG9zTm90ZUNoaWxkcmVuKCk7CisgIG1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKKyAgUmVzZXRTY3JvbGxCYXIoKTsKKyAgbV9wQ29udGVudHMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOworICBPbk5vdGlmeSh0aGlzLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKKyAgaWYgKGNvbnN0IENQV0xfV25kKiBwV25kID0gR2V0Rm9jdXNlZCgpKSB7CisgICAgaWYgKHBXbmQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX0VkaXQiKSB7CisgICAgICBDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopcFduZDsKKyAgICAgIHBFZGl0LT5TZXRDYXJldChwRWRpdC0+R2V0Q2FyZXQoKSk7CisgICAgfQorICB9CiB9CiAKLUZYX0JPT0wgQ1BXTF9Ob3RlOjpSZXNldFNjcm9sbEJhcigpCi17Ci0JRlhfQk9PTCBiU2Nyb2xsQ2hhbmdlZCA9IEZBTFNFOworRlhfQk9PTCBDUFdMX05vdGU6OlJlc2V0U2Nyb2xsQmFyKCkgeworICBGWF9CT09MIGJTY3JvbGxDaGFuZ2VkID0gRkFMU0U7CiAKLQlpZiAoU2Nyb2xsQmFyU2hvdWxkVmlzaWJsZSgpKQotCXsKLQkJaWYgKCFtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCi0JCXsKLQkJCW1fcENvbnRlbnRzQmFyLT5TZXRWaXNpYmxlKFRSVUUpOwotCQkJaWYgKG1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKLQkJCXsKLQkJCQltX3BDb250ZW50c0Jhci0+SW52YWxpZGF0ZVJlY3QoTlVMTCk7Ci0JCQkJYlNjcm9sbENoYW5nZWQgPSBUUlVFOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCi0JCXsKLQkJCW1fcENvbnRlbnRzQmFyLT5TZXRWaXNpYmxlKEZBTFNFKTsKLQkJCW1fcENvbnRlbnRzQmFyLT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKKyAgaWYgKFNjcm9sbEJhclNob3VsZFZpc2libGUoKSkgeworICAgIGlmICghbV9wQ29udGVudHNCYXItPklzVmlzaWJsZSgpKSB7CisgICAgICBtX3BDb250ZW50c0Jhci0+U2V0VmlzaWJsZShUUlVFKTsKKyAgICAgIGlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpIHsKKyAgICAgICAgbV9wQ29udGVudHNCYXItPkludmFsaWRhdGVSZWN0KE5VTEwpOworICAgICAgICBiU2Nyb2xsQ2hhbmdlZCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpIHsKKyAgICAgIG1fcENvbnRlbnRzQmFyLT5TZXRWaXNpYmxlKEZBTFNFKTsKKyAgICAgIG1fcENvbnRlbnRzQmFyLT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKIAotCQkJYlNjcm9sbENoYW5nZWQgPSBUUlVFOwotCQl9Ci0JfQorICAgICAgYlNjcm9sbENoYW5nZWQgPSBUUlVFOworICAgIH0KKyAgfQogCi0JaWYgKGJTY3JvbGxDaGFuZ2VkKQotCXsKLQkJQ1BERl9SZWN0IHJjTm90ZSA9IEdldENsaWVudFJlY3QoKTsKLQkJQ1BERl9SZWN0IHJjQ29udGVudHMgPSBtX3BDb250ZW50cy0+R2V0V2luZG93UmVjdCgpOwotCQlyY0NvbnRlbnRzLnJpZ2h0ID0gcmNOb3RlLnJpZ2h0IC0gMy4wZjsKLQkJaWYgKG1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKLQkJCXJjQ29udGVudHMucmlnaHQgLT0gUFdMX1NDUk9MTEJBUl9XSURUSDsKLQkJbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgVFJVRSwgVFJVRSk7Ci0JCW1fcENvbnRlbnRzLT5TZXRTY3JvbGxQb3MoQ1BERl9Qb2ludCgwLjBmLDAuMGYpKTsKLQkJbV9wQ29udGVudHMtPkludmFsaWRhdGVSZWN0KE5VTEwpOwotCX0KKyAgaWYgKGJTY3JvbGxDaGFuZ2VkKSB7CisgICAgQ1BERl9SZWN0IHJjTm90ZSA9IEdldENsaWVudFJlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNDb250ZW50cyA9IG1fcENvbnRlbnRzLT5HZXRXaW5kb3dSZWN0KCk7CisgICAgcmNDb250ZW50cy5yaWdodCA9IHJjTm90ZS5yaWdodCAtIDMuMGY7CisgICAgaWYgKG1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKKyAgICAgIHJjQ29udGVudHMucmlnaHQgLT0gUFdMX1NDUk9MTEJBUl9XSURUSDsKKyAgICBtX3BDb250ZW50cy0+TW92ZShyY0NvbnRlbnRzLCBUUlVFLCBUUlVFKTsKKyAgICBtX3BDb250ZW50cy0+U2V0U2Nyb2xsUG9zKENQREZfUG9pbnQoMC4wZiwgMC4wZikpOworICAgIG1fcENvbnRlbnRzLT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKKyAgfQogCi0JcmV0dXJuIGJTY3JvbGxDaGFuZ2VkOworICByZXR1cm4gYlNjcm9sbENoYW5nZWQ7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Ob3RlOjpTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkKLXsKLQlDUERGX1JlY3QgcmNDb250ZW50c0ZhY3QgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsQXJlYSgpOwotCUNQREZfUmVjdCByY0NvbnRlbnRzQ2xpZW50ID0gbV9wQ29udGVudHMtPkdldENsaWVudFJlY3QoKTsKK0ZYX0JPT0wgQ1BXTF9Ob3RlOjpTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkgeworICBDUERGX1JlY3QgcmNDb250ZW50c0ZhY3QgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsQXJlYSgpOworICBDUERGX1JlY3QgcmNDb250ZW50c0NsaWVudCA9IG1fcENvbnRlbnRzLT5HZXRDbGllbnRSZWN0KCk7CiAKLQlyZXR1cm4gcmNDb250ZW50c0ZhY3QuSGVpZ2h0KCkgPiByY0NvbnRlbnRzQ2xpZW50LkhlaWdodCgpOworICByZXR1cm4gcmNDb250ZW50c0ZhY3QuSGVpZ2h0KCkgPiByY0NvbnRlbnRzQ2xpZW50LkhlaWdodCgpOwogfQogCi12b2lkIENQV0xfTm90ZTo6U2V0T3B0aW9uc1RleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUZXh0KQotewotCWlmIChtX3BPcHRpb25zKQotCQltX3BPcHRpb25zLT5TZXRUZXh0KHNUZXh0KTsKK3ZvaWQgQ1BXTF9Ob3RlOjpTZXRPcHRpb25zVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpIHsKKyAgaWYgKG1fcE9wdGlvbnMpCisgICAgbV9wT3B0aW9ucy0+U2V0VGV4dChzVGV4dCk7CiAKLQlSZVBvc05vdGVDaGlsZHJlbigpOworICBSZVBvc05vdGVDaGlsZHJlbigpOwogfQogCi12b2lkIENQV0xfTm90ZTo6UmVQb3NOb3RlQ2hpbGRyZW4oKQotewotCWlmIChtX2JSZXNpemluZykgcmV0dXJuOwordm9pZCBDUFdMX05vdGU6OlJlUG9zTm90ZUNoaWxkcmVuKCkgeworICBpZiAobV9iUmVzaXppbmcpCisgICAgcmV0dXJuOwogCi0JbV9iUmVzaXppbmcgPSBUUlVFOworICBtX2JSZXNpemluZyA9IFRSVUU7CiAKLQlpZiAoSXNWYWxpZCgpKQotCXsKLQkJQVNTRVJUKG1fcFN1YmplY3QgIT0gTlVMTCk7Ci0JCUFTU0VSVChtX3BEYXRlVGltZSAhPSBOVUxMKTsKLQkJQVNTRVJUKG1fcENvbnRlbnRzICE9IE5VTEwpOwotCQlBU1NFUlQobV9wQXV0aG9yICE9IE5VTEwpOwotCQlBU1NFUlQobV9wQ2xvc2VCb3ggIT0gTlVMTCk7Ci0JCUFTU0VSVChtX3BJY29uICE9IE5VTEwpOwotCQlBU1NFUlQobV9wTEJCb3ggIT0gTlVMTCk7Ci0JCUFTU0VSVChtX3BSQkJveCAhPSBOVUxMKTsKLQkJQVNTRVJUKG1fcENvbnRlbnRzQmFyICE9IE5VTEwpOwotCQlBU1NFUlQobV9wT3B0aW9ucyAhPSBOVUxMKTsKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIEFTU0VSVChtX3BTdWJqZWN0ICE9IE5VTEwpOworICAgIEFTU0VSVChtX3BEYXRlVGltZSAhPSBOVUxMKTsKKyAgICBBU1NFUlQobV9wQ29udGVudHMgIT0gTlVMTCk7CisgICAgQVNTRVJUKG1fcEF1dGhvciAhPSBOVUxMKTsKKyAgICBBU1NFUlQobV9wQ2xvc2VCb3ggIT0gTlVMTCk7CisgICAgQVNTRVJUKG1fcEljb24gIT0gTlVMTCk7CisgICAgQVNTRVJUKG1fcExCQm94ICE9IE5VTEwpOworICAgIEFTU0VSVChtX3BSQkJveCAhPSBOVUxMKTsKKyAgICBBU1NFUlQobV9wQ29udGVudHNCYXIgIT0gTlVMTCk7CisgICAgQVNTRVJUKG1fcE9wdGlvbnMgIT0gTlVMTCk7CiAKLQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICAgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKIAotCQlDUERGX1JlY3QgcmNJY29uID0gcmNDbGllbnQ7Ci0JCXJjSWNvbi50b3AgLT0gMi4wZjsKLQkJcmNJY29uLnJpZ2h0ID0gcmNJY29uLmxlZnQgKyAxNC4wZjsKLQkJcmNJY29uLmJvdHRvbSA9IHJjSWNvbi50b3AgLSAxNC4wZjsKLQkJcmNJY29uLk5vcm1hbGl6ZSgpOwotCQltX3BJY29uLT5Nb3ZlKHJjSWNvbiwgVFJVRSwgRkFMU0UpOwotCQltX3BJY29uLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNJY29uKSk7CisgICAgQ1BERl9SZWN0IHJjSWNvbiA9IHJjQ2xpZW50OworICAgIHJjSWNvbi50b3AgLT0gMi4wZjsKKyAgICByY0ljb24ucmlnaHQgPSByY0ljb24ubGVmdCArIDE0LjBmOworICAgIHJjSWNvbi5ib3R0b20gPSByY0ljb24udG9wIC0gMTQuMGY7CisgICAgcmNJY29uLk5vcm1hbGl6ZSgpOworICAgIG1fcEljb24tPk1vdmUocmNJY29uLCBUUlVFLCBGQUxTRSk7CisgICAgbV9wSWNvbi0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjSWNvbikpOwogCi0JCUNQREZfUmVjdCByY0Nsb3NlQm94ID0gcmNDbGllbnQ7Ci0JCXJjQ2xvc2VCb3gucmlnaHQgLT0gMS4wZjsKLQkJcmNDbG9zZUJveC50b3AgLT0gMS4wZjsKLQkJcmNDbG9zZUJveC5sZWZ0ID0gcmNDbG9zZUJveC5yaWdodCAtIDE0LjBmOwotCQlyY0Nsb3NlQm94LmJvdHRvbSA9IHJjQ2xvc2VCb3gudG9wIC0gMTQuMGY7Ci0JCXJjQ2xvc2VCb3guTm9ybWFsaXplKCk7Ci0JCW1fcENsb3NlQm94LT5Nb3ZlKHJjQ2xvc2VCb3gsIFRSVUUsIEZBTFNFKTsKLQkJbV9wQ2xvc2VCb3gtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0Nsb3NlQm94KSk7CisgICAgQ1BERl9SZWN0IHJjQ2xvc2VCb3ggPSByY0NsaWVudDsKKyAgICByY0Nsb3NlQm94LnJpZ2h0IC09IDEuMGY7CisgICAgcmNDbG9zZUJveC50b3AgLT0gMS4wZjsKKyAgICByY0Nsb3NlQm94LmxlZnQgPSByY0Nsb3NlQm94LnJpZ2h0IC0gMTQuMGY7CisgICAgcmNDbG9zZUJveC5ib3R0b20gPSByY0Nsb3NlQm94LnRvcCAtIDE0LjBmOworICAgIHJjQ2xvc2VCb3guTm9ybWFsaXplKCk7CisgICAgbV9wQ2xvc2VCb3gtPk1vdmUocmNDbG9zZUJveCwgVFJVRSwgRkFMU0UpOworICAgIG1fcENsb3NlQm94LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNDbG9zZUJveCkpOwogCi0JCUNQREZfUmVjdCByY0RhdGUgPSByY0NsaWVudDsKLQkJcmNEYXRlLnJpZ2h0ID0gcmNDbG9zZUJveC5sZWZ0IC0gUE9QVVBfSVRFTV9URVhUX0lOREVOVDsKLQkJcmNEYXRlLmxlZnQgPSBQV0xfTUFYKHJjRGF0ZS5yaWdodCAtIG1fcERhdGVUaW1lLT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCkgLSAxLjBmLCByY0ljb24ucmlnaHQgKyAxLjBmKTsKLQkJcmNEYXRlLnRvcCA9IHJjQ2xpZW50LnRvcCAtIDIuMGY7Ci0JCXJjRGF0ZS5ib3R0b20gPSByY0RhdGUudG9wIC0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7Ci0JCXJjRGF0ZS5Ob3JtYWxpemUoKTsKLQkJbV9wRGF0ZVRpbWUtPk1vdmUocmNEYXRlLCBUUlVFLCBGQUxTRSk7Ci0JCW1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CisgICAgQ1BERl9SZWN0IHJjRGF0ZSA9IHJjQ2xpZW50OworICAgIHJjRGF0ZS5yaWdodCA9IHJjQ2xvc2VCb3gubGVmdCAtIFBPUFVQX0lURU1fVEVYVF9JTkRFTlQ7CisgICAgcmNEYXRlLmxlZnQgPQorICAgICAgICBQV0xfTUFYKHJjRGF0ZS5yaWdodCAtIG1fcERhdGVUaW1lLT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCkgLSAxLjBmLAorICAgICAgICAgICAgICAgIHJjSWNvbi5yaWdodCArIDEuMGYpOworICAgIHJjRGF0ZS50b3AgPSByY0NsaWVudC50b3AgLSAyLjBmOworICAgIHJjRGF0ZS5ib3R0b20gPSByY0RhdGUudG9wIC0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgcmNEYXRlLk5vcm1hbGl6ZSgpOworICAgIG1fcERhdGVUaW1lLT5Nb3ZlKHJjRGF0ZSwgVFJVRSwgRkFMU0UpOworICAgIG1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CiAKLQkJQ1BERl9SZWN0IHJjU3ViamVjdCA9IHJjQ2xpZW50OwotCQlyY1N1YmplY3QudG9wID0gcmNDbGllbnQudG9wIC0gMi4wZjsKLQkJcmNTdWJqZWN0LmxlZnQgPSByY0ljb24ucmlnaHQgKyBQT1BVUF9JVEVNX1RFWFRfSU5ERU5UOwotCQlyY1N1YmplY3QucmlnaHQgPSBQV0xfTUlOKHJjU3ViamVjdC5sZWZ0ICsgbV9wU3ViamVjdC0+R2V0Q29udGVudFJlY3QoKS5XaWR0aCgpICsgMS4wZiwgcmNEYXRlLmxlZnQgLSAxLjBmKTsKLQkJcmNTdWJqZWN0LmJvdHRvbSA9IHJjU3ViamVjdC50b3AgLSBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwotCQlyY1N1YmplY3QuTm9ybWFsaXplKCk7Ci0JCW1fcFN1YmplY3QtPk1vdmUocmNTdWJqZWN0LCBUUlVFLCBGQUxTRSk7Ci0JCW1fcFN1YmplY3QtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY1N1YmplY3QpKTsKKyAgICBDUERGX1JlY3QgcmNTdWJqZWN0ID0gcmNDbGllbnQ7CisgICAgcmNTdWJqZWN0LnRvcCA9IHJjQ2xpZW50LnRvcCAtIDIuMGY7CisgICAgcmNTdWJqZWN0LmxlZnQgPSByY0ljb24ucmlnaHQgKyBQT1BVUF9JVEVNX1RFWFRfSU5ERU5UOworICAgIHJjU3ViamVjdC5yaWdodCA9CisgICAgICAgIFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCkgKyAxLjBmLAorICAgICAgICAgICAgICAgIHJjRGF0ZS5sZWZ0IC0gMS4wZik7CisgICAgcmNTdWJqZWN0LmJvdHRvbSA9IHJjU3ViamVjdC50b3AgLSBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOworICAgIHJjU3ViamVjdC5Ob3JtYWxpemUoKTsKKyAgICBtX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgVFJVRSwgRkFMU0UpOworICAgIG1fcFN1YmplY3QtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY1N1YmplY3QpKTsKIAotCQlDUERGX1JlY3QgcmNPcHRpb25zID0gcmNDbGllbnQ7Ci0JCXJjT3B0aW9ucy5sZWZ0ID0gUFdMX01BWChyY09wdGlvbnMucmlnaHQgLSBtX3BPcHRpb25zLT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCksIHJjSWNvbi5yaWdodCArIDEuMGYpOwotCQlyY09wdGlvbnMudG9wID0gcmNTdWJqZWN0LmJvdHRvbSAtIDQuMGY7Ci0JCXJjT3B0aW9ucy5ib3R0b20gPSByY09wdGlvbnMudG9wIC0gbV9wT3B0aW9ucy0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKLQkJcmNPcHRpb25zLk5vcm1hbGl6ZSgpOwotCQltX3BPcHRpb25zLT5Nb3ZlKHJjT3B0aW9ucywgVFJVRSwgRkFMU0UpOwotCQltX3BPcHRpb25zLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNPcHRpb25zKSk7CisgICAgQ1BERl9SZWN0IHJjT3B0aW9ucyA9IHJjQ2xpZW50OworICAgIHJjT3B0aW9ucy5sZWZ0ID0KKyAgICAgICAgUFdMX01BWChyY09wdGlvbnMucmlnaHQgLSBtX3BPcHRpb25zLT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCksCisgICAgICAgICAgICAgICAgcmNJY29uLnJpZ2h0ICsgMS4wZik7CisgICAgcmNPcHRpb25zLnRvcCA9IHJjU3ViamVjdC5ib3R0b20gLSA0LjBmOworICAgIHJjT3B0aW9ucy5ib3R0b20gPSByY09wdGlvbnMudG9wIC0gbV9wT3B0aW9ucy0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKKyAgICByY09wdGlvbnMuTm9ybWFsaXplKCk7CisgICAgbV9wT3B0aW9ucy0+TW92ZShyY09wdGlvbnMsIFRSVUUsIEZBTFNFKTsKKyAgICBtX3BPcHRpb25zLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNPcHRpb25zKSk7CiAKLQkJQ1BERl9SZWN0IHJjQXV0aG9yID0gcmNDbGllbnQ7Ci0JCXJjQXV0aG9yLnRvcCA9IHJjU3ViamVjdC5ib3R0b20gLSA0LjBmOwotCQlyY0F1dGhvci5sZWZ0ID0gcmNTdWJqZWN0LmxlZnQ7Ci0JCXJjQXV0aG9yLnJpZ2h0ID0gUFdMX01JTihyY1N1YmplY3QubGVmdCArIG1fcEF1dGhvci0+R2V0Q29udGVudFJlY3QoKS5XaWR0aCgpICsgMS4wZiwgcmNPcHRpb25zLmxlZnQgLSAxLjBmKTsKLQkJcmNBdXRob3IuYm90dG9tID0gcmNBdXRob3IudG9wIC0gbV9wQXV0aG9yLT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwotCQlyY0F1dGhvci5Ob3JtYWxpemUoKTsKLQkJbV9wQXV0aG9yLT5Nb3ZlKHJjQXV0aG9yLCBUUlVFLCBGQUxTRSk7Ci0JCW1fcEF1dGhvci0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjQXV0aG9yKSk7CisgICAgQ1BERl9SZWN0IHJjQXV0aG9yID0gcmNDbGllbnQ7CisgICAgcmNBdXRob3IudG9wID0gcmNTdWJqZWN0LmJvdHRvbSAtIDQuMGY7CisgICAgcmNBdXRob3IubGVmdCA9IHJjU3ViamVjdC5sZWZ0OworICAgIHJjQXV0aG9yLnJpZ2h0ID0KKyAgICAgICAgUFdMX01JTihyY1N1YmplY3QubGVmdCArIG1fcEF1dGhvci0+R2V0Q29udGVudFJlY3QoKS5XaWR0aCgpICsgMS4wZiwKKyAgICAgICAgICAgICAgICByY09wdGlvbnMubGVmdCAtIDEuMGYpOworICAgIHJjQXV0aG9yLmJvdHRvbSA9IHJjQXV0aG9yLnRvcCAtIG1fcEF1dGhvci0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKKyAgICByY0F1dGhvci5Ob3JtYWxpemUoKTsKKyAgICBtX3BBdXRob3ItPk1vdmUocmNBdXRob3IsIFRSVUUsIEZBTFNFKTsKKyAgICBtX3BBdXRob3ItPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0F1dGhvcikpOwogCi0JCUNQREZfUmVjdCByY0xCQm94ID0gcmNDbGllbnQ7Ci0JCXJjTEJCb3gudG9wID0gcmNMQkJveC5ib3R0b20gKyA3LjBmOwotCQlyY0xCQm94LnJpZ2h0ID0gcmNMQkJveC5sZWZ0ICsgNy4wZjsKLQkJcmNMQkJveC5Ob3JtYWxpemUoKTsKLQkJbV9wTEJCb3gtPk1vdmUocmNMQkJveCwgVFJVRSwgRkFMU0UpOwotCQltX3BMQkJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjTEJCb3gpKTsKKyAgICBDUERGX1JlY3QgcmNMQkJveCA9IHJjQ2xpZW50OworICAgIHJjTEJCb3gudG9wID0gcmNMQkJveC5ib3R0b20gKyA3LjBmOworICAgIHJjTEJCb3gucmlnaHQgPSByY0xCQm94LmxlZnQgKyA3LjBmOworICAgIHJjTEJCb3guTm9ybWFsaXplKCk7CisgICAgbV9wTEJCb3gtPk1vdmUocmNMQkJveCwgVFJVRSwgRkFMU0UpOworICAgIG1fcExCQm94LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNMQkJveCkpOwogCi0JCUNQREZfUmVjdCByY1JCQm94ID0gcmNDbGllbnQ7Ci0JCXJjUkJCb3gudG9wID0gcmNSQkJveC5ib3R0b20gKyA3LjBmOwotCQlyY1JCQm94LmxlZnQgPSByY1JCQm94LnJpZ2h0IC0gNy4wZjsKLQkJcmNSQkJveC5Ob3JtYWxpemUoKTsKLQkJbV9wUkJCb3gtPk1vdmUocmNSQkJveCwgVFJVRSwgRkFMU0UpOwotCQltX3BSQkJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjUkJCb3gpKTsKKyAgICBDUERGX1JlY3QgcmNSQkJveCA9IHJjQ2xpZW50OworICAgIHJjUkJCb3gudG9wID0gcmNSQkJveC5ib3R0b20gKyA3LjBmOworICAgIHJjUkJCb3gubGVmdCA9IHJjUkJCb3gucmlnaHQgLSA3LjBmOworICAgIHJjUkJCb3guTm9ybWFsaXplKCk7CisgICAgbV9wUkJCb3gtPk1vdmUocmNSQkJveCwgVFJVRSwgRkFMU0UpOworICAgIG1fcFJCQm94LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNSQkJveCkpOwogCi0JCUNQREZfUmVjdCByY0NvbnRlbnRzID0gcmNDbGllbnQ7Ci0JCXJjQ29udGVudHMudG9wID0gcmNBdXRob3IuYm90dG9tIC0gUE9QVVBfSVRFTV9IRUFEX0JPVFRPTTsKLQkJcmNDb250ZW50cy5sZWZ0ICs9IDMuMGY7Ci0JCXJjQ29udGVudHMucmlnaHQgLT0gMy4wZjsKLQkJaWYgKG1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKLQkJCXJjQ29udGVudHMucmlnaHQgLT0gUFdMX1NDUk9MTEJBUl9XSURUSDsKLQkJcmNDb250ZW50cy5ib3R0b20gKz0gMTQuMGY7Ci0JCXJjQ29udGVudHMuTm9ybWFsaXplKCk7Ci0JCW1fcENvbnRlbnRzLT5Nb3ZlKHJjQ29udGVudHMsIEZBTFNFLCBGQUxTRSk7Ci0JCW1fcENvbnRlbnRzLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNDb250ZW50cykpOworICAgIENQREZfUmVjdCByY0NvbnRlbnRzID0gcmNDbGllbnQ7CisgICAgcmNDb250ZW50cy50b3AgPSByY0F1dGhvci5ib3R0b20gLSBQT1BVUF9JVEVNX0hFQURfQk9UVE9NOworICAgIHJjQ29udGVudHMubGVmdCArPSAzLjBmOworICAgIHJjQ29udGVudHMucmlnaHQgLT0gMy4wZjsKKyAgICBpZiAobV9wQ29udGVudHNCYXItPklzVmlzaWJsZSgpKQorICAgICAgcmNDb250ZW50cy5yaWdodCAtPSBQV0xfU0NST0xMQkFSX1dJRFRIOworICAgIHJjQ29udGVudHMuYm90dG9tICs9IDE0LjBmOworICAgIHJjQ29udGVudHMuTm9ybWFsaXplKCk7CisgICAgbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgRkFMU0UsIEZBTFNFKTsKKyAgICBtX3BDb250ZW50cy0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjQ29udGVudHMpKTsKIAotCQlDUERGX1JlY3QgcmNDb250ZW50c0JhciA9IHJjQ29udGVudHM7Ci0JCXJjQ29udGVudHNCYXIucmlnaHQgPSByY0NsaWVudC5yaWdodCAtIDMuMGY7Ci0JCXJjQ29udGVudHNCYXIubGVmdCA9IHJjQ29udGVudHNCYXIucmlnaHQgLSBQV0xfU0NST0xMQkFSX1dJRFRIOwotCQlyY0NvbnRlbnRzQmFyLk5vcm1hbGl6ZSgpOwotCQltX3BDb250ZW50c0Jhci0+TW92ZShyY0NvbnRlbnRzQmFyLCBUUlVFLCBGQUxTRSk7CisgICAgQ1BERl9SZWN0IHJjQ29udGVudHNCYXIgPSByY0NvbnRlbnRzOworICAgIHJjQ29udGVudHNCYXIucmlnaHQgPSByY0NsaWVudC5yaWdodCAtIDMuMGY7CisgICAgcmNDb250ZW50c0Jhci5sZWZ0ID0gcmNDb250ZW50c0Jhci5yaWdodCAtIFBXTF9TQ1JPTExCQVJfV0lEVEg7CisgICAgcmNDb250ZW50c0Jhci5Ob3JtYWxpemUoKTsKKyAgICBtX3BDb250ZW50c0Jhci0+TW92ZShyY0NvbnRlbnRzQmFyLCBUUlVFLCBGQUxTRSk7CiAKLQkJbV9yY0NhcHRpb24gPSByY0NsaWVudDsKLQkJbV9yY0NhcHRpb24uYm90dG9tID0gcmNDb250ZW50cy50b3A7Ci0JfQorICAgIG1fcmNDYXB0aW9uID0gcmNDbGllbnQ7CisgICAgbV9yY0NhcHRpb24uYm90dG9tID0gcmNDb250ZW50cy50b3A7CisgIH0KIAotCW1fYlJlc2l6aW5nID0gRkFMU0U7CisgIG1fYlJlc2l6aW5nID0gRkFMU0U7CiB9CiAKLS8vMC1ub3JtYWwgLyAxLWNhcHRpb24gLyAyLWxlZnRib3R0b20gY29ybmVyIC8gMy1yaWdodGJvdHRvbSBjb3JuZXIgLyA0LWNsb3NlIC8gNS1vcHRpb25zCi1pbnQzMl90IENQV0xfTm90ZTo6Tm90ZUhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcFN1YmplY3QgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcERhdGVUaW1lICE9IE5VTEwpOwotCUFTU0VSVChtX3BDb250ZW50cyAhPSBOVUxMKTsKLQlBU1NFUlQobV9wQXV0aG9yICE9IE5VTEwpOwotCUFTU0VSVChtX3BJY29uICE9IE5VTEwpOwotCUFTU0VSVChtX3BDb250ZW50c0JhciAhPSBOVUxMKTsKKy8vIDAtbm9ybWFsIC8gMS1jYXB0aW9uIC8gMi1sZWZ0Ym90dG9tIGNvcm5lciAvIDMtcmlnaHRib3R0b20gY29ybmVyIC8gNC1jbG9zZSAvCisvLyA1LW9wdGlvbnMKK2ludDMyX3QgQ1BXTF9Ob3RlOjpOb3RlSGl0VGVzdChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBBU1NFUlQobV9wU3ViamVjdCAhPSBOVUxMKTsKKyAgQVNTRVJUKG1fcERhdGVUaW1lICE9IE5VTEwpOworICBBU1NFUlQobV9wQ29udGVudHMgIT0gTlVMTCk7CisgIEFTU0VSVChtX3BBdXRob3IgIT0gTlVMTCk7CisgIEFTU0VSVChtX3BJY29uICE9IE5VTEwpOworICBBU1NFUlQobV9wQ29udGVudHNCYXIgIT0gTlVMTCk7CiAKLQlBU1NFUlQobV9wQ2xvc2VCb3ggIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcExCQm94ICE9IE5VTEwpOwotCUFTU0VSVChtX3BSQkJveCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wT3B0aW9ucyAhPSBOVUxMKTsKKyAgQVNTRVJUKG1fcENsb3NlQm94ICE9IE5VTEwpOworICBBU1NFUlQobV9wTEJCb3ggIT0gTlVMTCk7CisgIEFTU0VSVChtX3BSQkJveCAhPSBOVUxMKTsKKyAgQVNTRVJUKG1fcE9wdGlvbnMgIT0gTlVMTCk7CiAKLQlHZXRDbGllbnRSZWN0KCk7CisgIEdldENsaWVudFJlY3QoKTsKIAotCWlmIChtX3BTdWJqZWN0LT5XbmRIaXRUZXN0KG1fcFN1YmplY3QtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgcmV0dXJuIDE7Ci0JaWYgKG1fcERhdGVUaW1lLT5XbmRIaXRUZXN0KG1fcERhdGVUaW1lLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpIHJldHVybiAxOwotCWlmIChtX3BBdXRob3ItPlduZEhpdFRlc3QobV9wQXV0aG9yLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpIHJldHVybiAxOwotCWlmIChtX3BJY29uLT5XbmRIaXRUZXN0KG1fcEljb24tPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgcmV0dXJuIDE7CisgIGlmIChtX3BTdWJqZWN0LT5XbmRIaXRUZXN0KG1fcFN1YmplY3QtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKG1fcERhdGVUaW1lLT5XbmRIaXRUZXN0KG1fcERhdGVUaW1lLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpCisgICAgcmV0dXJuIDE7CisgIGlmIChtX3BBdXRob3ItPlduZEhpdFRlc3QobV9wQXV0aG9yLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpCisgICAgcmV0dXJuIDE7CisgIGlmIChtX3BJY29uLT5XbmRIaXRUZXN0KG1fcEljb24tPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKKyAgICByZXR1cm4gMTsKIAotCWlmIChtX3BDb250ZW50cy0+V25kSGl0VGVzdChtX3BDb250ZW50cy0+UGFyZW50VG9DaGlsZChwb2ludCkpKSByZXR1cm4gMDsKLQlpZiAobV9wQ29udGVudHNCYXItPlduZEhpdFRlc3QobV9wQ29udGVudHNCYXItPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgcmV0dXJuIDA7CisgIGlmIChtX3BDb250ZW50cy0+V25kSGl0VGVzdChtX3BDb250ZW50cy0+UGFyZW50VG9DaGlsZChwb2ludCkpKQorICAgIHJldHVybiAwOworICBpZiAobV9wQ29udGVudHNCYXItPlduZEhpdFRlc3QobV9wQ29udGVudHNCYXItPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKKyAgICByZXR1cm4gMDsKIAotCWlmIChtX3BDbG9zZUJveC0+V25kSGl0VGVzdChtX3BDbG9zZUJveC0+UGFyZW50VG9DaGlsZChwb2ludCkpKSByZXR1cm4gNDsKLQlpZiAobV9wTEJCb3gtPlduZEhpdFRlc3QobV9wTEJCb3gtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgcmV0dXJuIDI7Ci0JaWYgKG1fcFJCQm94LT5XbmRIaXRUZXN0KG1fcFJCQm94LT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpIHJldHVybiAzOwotCWlmIChtX3BPcHRpb25zLT5XbmRIaXRUZXN0KG1fcE9wdGlvbnMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgcmV0dXJuIDU7CisgIGlmIChtX3BDbG9zZUJveC0+V25kSGl0VGVzdChtX3BDbG9zZUJveC0+UGFyZW50VG9DaGlsZChwb2ludCkpKQorICAgIHJldHVybiA0OworICBpZiAobV9wTEJCb3gtPlduZEhpdFRlc3QobV9wTEJCb3gtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKKyAgICByZXR1cm4gMjsKKyAgaWYgKG1fcFJCQm94LT5XbmRIaXRUZXN0KG1fcFJCQm94LT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpCisgICAgcmV0dXJuIDM7CisgIGlmIChtX3BPcHRpb25zLT5XbmRIaXRUZXN0KG1fcE9wdGlvbnMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKKyAgICByZXR1cm4gNTsKIAotCXJldHVybiAxOworICByZXR1cm4gMTsKIH0KIAotdm9pZCBDUFdMX05vdGU6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCUNQV0xfTm90ZUl0ZW06OkNyZWF0ZUNoaWxkV25kKGNwKTsKK3ZvaWQgQ1BXTF9Ob3RlOjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIENQV0xfTm90ZUl0ZW06OkNyZWF0ZUNoaWxkV25kKGNwKTsKIAotCUNQV0xfQ29sb3Igc1RleHRDb2xvcjsKKyAgQ1BXTF9Db2xvciBzVGV4dENvbG9yOwogCi0JaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKEdldEJhY2tncm91bmRDb2xvcigpKSkKLQkJc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7Ci0JZWxzZQotCQlzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKKyAgaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKEdldEJhY2tncm91bmRDb2xvcigpKSkKKyAgICBzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKKyAgZWxzZQorICAgIHNUZXh0Q29sb3IgPSBQV0xfREVGQVVMVF9CTEFDS0NPTE9SOwogCi0JbV9wQXV0aG9yID0gbmV3IENQV0xfTGFiZWw7Ci0JUFdMX0NSRUFURVBBUkFNIGFjcCA9IGNwOwotCWFjcC5wUGFyZW50V25kID0gdGhpczsKLQlhY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEIHwgUEVTX0xFRlQgfCBQRVNfVE9QOwotCWFjcC5zVGV4dENvbG9yID0gc1RleHRDb2xvcjsKLQltX3BBdXRob3ItPkNyZWF0ZShhY3ApOworICBtX3BBdXRob3IgPSBuZXcgQ1BXTF9MYWJlbDsKKyAgUFdMX0NSRUFURVBBUkFNIGFjcCA9IGNwOworICBhY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGFjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQRVNfTEVGVCB8IFBFU19UT1A7CisgIGFjcC5zVGV4dENvbG9yID0gc1RleHRDb2xvcjsKKyAgbV9wQXV0aG9yLT5DcmVhdGUoYWNwKTsKIAotCW1fcENsb3NlQm94ID0gbmV3IENQV0xfTm90ZV9DbG9zZUJveDsKLQlQV0xfQ1JFQVRFUEFSQU0gY2NwID0gY3A7Ci0JY2NwLnBQYXJlbnRXbmQgPSB0aGlzOwotCWNjcC5kd0JvcmRlcldpZHRoID0gMjsKLQljY3AubkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7Ci0JY2NwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBXU19CT1JERVI7Ci0JY2NwLnNUZXh0Q29sb3IgPSBzVGV4dENvbG9yOwotCW1fcENsb3NlQm94LT5DcmVhdGUoY2NwKTsKKyAgbV9wQ2xvc2VCb3ggPSBuZXcgQ1BXTF9Ob3RlX0Nsb3NlQm94OworICBQV0xfQ1JFQVRFUEFSQU0gY2NwID0gY3A7CisgIGNjcC5wUGFyZW50V25kID0gdGhpczsKKyAgY2NwLmR3Qm9yZGVyV2lkdGggPSAyOworICBjY3AubkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7CisgIGNjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSOworICBjY3Auc1RleHRDb2xvciA9IHNUZXh0Q29sb3I7CisgIG1fcENsb3NlQm94LT5DcmVhdGUoY2NwKTsKIAotCW1fcEljb24gPSBuZXcgQ1BXTF9Ob3RlX0ljb247Ci0JUFdMX0NSRUFURVBBUkFNIGljcCA9IGNwOwotCWljcC5wUGFyZW50V25kID0gdGhpczsKLQlpY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEOwotCW1fcEljb24tPkNyZWF0ZShpY3ApOworICBtX3BJY29uID0gbmV3IENQV0xfTm90ZV9JY29uOworICBQV0xfQ1JFQVRFUEFSQU0gaWNwID0gY3A7CisgIGljcC5wUGFyZW50V25kID0gdGhpczsKKyAgaWNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRDsKKyAgbV9wSWNvbi0+Q3JlYXRlKGljcCk7CiAKLQltX3BPcHRpb25zID0gbmV3IENQV0xfTm90ZV9PcHRpb25zOwotCVBXTF9DUkVBVEVQQVJBTSBvY3AgPSBjcDsKLQlvY3AucFBhcmVudFduZCA9IHRoaXM7Ci0Jb2NwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRTsKLQlvY3Auc1RleHRDb2xvciA9IHNUZXh0Q29sb3I7Ci0JbV9wT3B0aW9ucy0+Q3JlYXRlKG9jcCk7CisgIG1fcE9wdGlvbnMgPSBuZXcgQ1BXTF9Ob3RlX09wdGlvbnM7CisgIFBXTF9DUkVBVEVQQVJBTSBvY3AgPSBjcDsKKyAgb2NwLnBQYXJlbnRXbmQgPSB0aGlzOworICBvY3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFOworICBvY3Auc1RleHRDb2xvciA9IHNUZXh0Q29sb3I7CisgIG1fcE9wdGlvbnMtPkNyZWF0ZShvY3ApOwogCi0JbV9wTEJCb3ggPSBuZXcgQ1BXTF9Ob3RlX0xCQm94OwotCVBXTF9DUkVBVEVQQVJBTSBsY3AgPSBjcDsKLQlsY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JbGNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRDsKLQlsY3AuZUN1cnNvclR5cGUgPSBGWENUX05FU1c7Ci0JbGNwLnNUZXh0Q29sb3IgPSBzVGV4dENvbG9yOwotCW1fcExCQm94LT5DcmVhdGUobGNwKTsKKyAgbV9wTEJCb3ggPSBuZXcgQ1BXTF9Ob3RlX0xCQm94OworICBQV0xfQ1JFQVRFUEFSQU0gbGNwID0gY3A7CisgIGxjcC5wUGFyZW50V25kID0gdGhpczsKKyAgbGNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRDsKKyAgbGNwLmVDdXJzb3JUeXBlID0gRlhDVF9ORVNXOworICBsY3Auc1RleHRDb2xvciA9IHNUZXh0Q29sb3I7CisgIG1fcExCQm94LT5DcmVhdGUobGNwKTsKIAotCW1fcFJCQm94ID0gbmV3IENQV0xfTm90ZV9SQkJveDsKLQlQV0xfQ1JFQVRFUEFSQU0gcmNwID0gY3A7Ci0JcmNwLnBQYXJlbnRXbmQgPSB0aGlzOwotCXJjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQ7Ci0JcmNwLmVDdXJzb3JUeXBlID0gRlhDVF9OV1NFOwotCXJjcC5zVGV4dENvbG9yID0gc1RleHRDb2xvcjsKLQltX3BSQkJveC0+Q3JlYXRlKHJjcCk7CisgIG1fcFJCQm94ID0gbmV3IENQV0xfTm90ZV9SQkJveDsKKyAgUFdMX0NSRUFURVBBUkFNIHJjcCA9IGNwOworICByY3AucFBhcmVudFduZCA9IHRoaXM7CisgIHJjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQ7CisgIHJjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfTldTRTsKKyAgcmNwLnNUZXh0Q29sb3IgPSBzVGV4dENvbG9yOworICBtX3BSQkJveC0+Q3JlYXRlKHJjcCk7CiAKLQltX3BDb250ZW50c0JhciA9IG5ldyBDUFdMX1Njcm9sbEJhcihTQlRfVlNDUk9MTCk7Ci0JUFdMX0NSRUFURVBBUkFNIHNjcCA9IGNwOwotCXNjcC5wUGFyZW50V25kID0gdGhpczsKLQlzY3Auc0JhY2tncm91bmRDb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMjQwLzI1NS4wZiwgMjQwLzI1NS4wZiwgMjQwLzI1NS4wZik7Ci0Jc2NwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBXU19CQUNLR1JPVU5EOwotCW1fcENvbnRlbnRzQmFyLT5DcmVhdGUoc2NwKTsKLQltX3BDb250ZW50c0Jhci0+U2V0Tm90aWZ5Rm9yZXZlcihUUlVFKTsKKyAgbV9wQ29udGVudHNCYXIgPSBuZXcgQ1BXTF9TY3JvbGxCYXIoU0JUX1ZTQ1JPTEwpOworICBQV0xfQ1JFQVRFUEFSQU0gc2NwID0gY3A7CisgIHNjcC5wUGFyZW50V25kID0gdGhpczsKKyAgc2NwLnNCYWNrZ3JvdW5kQ29sb3IgPQorICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAyNDAgLyAyNTUuMGYsIDI0MCAvIDI1NS4wZiwgMjQwIC8gMjU1LjBmKTsKKyAgc2NwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBXU19CQUNLR1JPVU5EOworICBtX3BDb250ZW50c0Jhci0+Q3JlYXRlKHNjcCk7CisgIG1fcENvbnRlbnRzQmFyLT5TZXROb3RpZnlGb3JldmVyKFRSVUUpOwogfQogCi12b2lkIENQV0xfTm90ZTo6U2V0U3ViamVjdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKQotewotCUNQV0xfTm90ZUl0ZW06OlNldFN1YmplY3ROYW1lKHNOYW1lKTsKLQlSZVBvc0NoaWxkV25kKCk7Cit2b2lkIENQV0xfTm90ZTo6U2V0U3ViamVjdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKSB7CisgIENQV0xfTm90ZUl0ZW06OlNldFN1YmplY3ROYW1lKHNOYW1lKTsKKyAgUmVQb3NDaGlsZFduZCgpOwogfQogCi12b2lkIENQV0xfTm90ZTo6U2V0QXV0aG9yTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpCi17Ci0JaWYgKG1fcEF1dGhvcikKLQl7Ci0JCW1fcEF1dGhvci0+U2V0VGV4dChzTmFtZS5jX3N0cigpKTsKLQkJUmVQb3NDaGlsZFduZCgpOwotCX0KK3ZvaWQgQ1BXTF9Ob3RlOjpTZXRBdXRob3JOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkgeworICBpZiAobV9wQXV0aG9yKSB7CisgICAgbV9wQXV0aG9yLT5TZXRUZXh0KHNOYW1lLmNfc3RyKCkpOworICAgIFJlUG9zQ2hpbGRXbmQoKTsKKyAgfQogCi0JaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKLQl7Ci0JCXBOb3RpZnktPk9uU2V0QXV0aG9yTmFtZSh0aGlzKTsKLQl9CisgIGlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpIHsKKyAgICBwTm90aWZ5LT5PblNldEF1dGhvck5hbWUodGhpcyk7CisgIH0KIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9Ob3RlOjpHZXRBdXRob3JOYW1lKCkgY29uc3QKLXsKLQlpZiAobV9wQXV0aG9yKQotCQlyZXR1cm4gbV9wQXV0aG9yLT5HZXRUZXh0KCk7CitDRlhfV2lkZVN0cmluZyBDUFdMX05vdGU6OkdldEF1dGhvck5hbWUoKSBjb25zdCB7CisgIGlmIChtX3BBdXRob3IpCisgICAgcmV0dXJuIG1fcEF1dGhvci0+R2V0VGV4dCgpOwogCi0JcmV0dXJuIEwiIjsKKyAgcmV0dXJuIEwiIjsKIH0KIAotRlhfQk9PTCBDUFdMX05vdGU6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BERl9Qb2ludCBwdFNjcm9sbCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxQb3MoKTsKLQlDUERGX1JlY3QgcmNTY3JvbGwgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsQXJlYSgpOwotCUNQREZfUmVjdCByY0NvbnRlbnRzID0gbV9wQ29udGVudHMtPkdldENsaWVudFJlY3QoKTsKK0ZYX0JPT0wgQ1BXTF9Ob3RlOjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BERl9Qb2ludCBwdFNjcm9sbCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxQb3MoKTsKKyAgQ1BERl9SZWN0IHJjU2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbEFyZWEoKTsKKyAgQ1BERl9SZWN0IHJjQ29udGVudHMgPSBtX3BDb250ZW50cy0+R2V0Q2xpZW50UmVjdCgpOwogCi0JaWYgKHJjU2Nyb2xsLnRvcCAtIHJjU2Nyb2xsLmJvdHRvbSA+IHJjQ29udGVudHMuSGVpZ2h0KCkpCi0JewotCQlDUERGX1BvaW50IHB0TmV3ID0gcHRTY3JvbGw7CisgIGlmIChyY1Njcm9sbC50b3AgLSByY1Njcm9sbC5ib3R0b20gPiByY0NvbnRlbnRzLkhlaWdodCgpKSB7CisgICAgQ1BERl9Qb2ludCBwdE5ldyA9IHB0U2Nyb2xsOwogCi0JCWlmICh6RGVsdGEgPiAwKQotCQkJcHROZXcueSArPSAzMDsKLQkJZWxzZQotCQkJcHROZXcueSAtPSAzMDsKKyAgICBpZiAoekRlbHRhID4gMCkKKyAgICAgIHB0TmV3LnkgKz0gMzA7CisgICAgZWxzZQorICAgICAgcHROZXcueSAtPSAzMDsKIAotCQlpZiAocHROZXcueSA+IHJjU2Nyb2xsLnRvcCkKLQkJCXB0TmV3LnkgPSByY1Njcm9sbC50b3A7Ci0JCWlmIChwdE5ldy55IDwgcmNTY3JvbGwuYm90dG9tICsgcmNDb250ZW50cy5IZWlnaHQoKSkKLQkJCXB0TmV3LnkgPSByY1Njcm9sbC5ib3R0b20gKyByY0NvbnRlbnRzLkhlaWdodCgpOwotCQlpZiAocHROZXcueSA8IHJjU2Nyb2xsLmJvdHRvbSkKLQkJCXB0TmV3LnkgPSByY1Njcm9sbC5ib3R0b207CisgICAgaWYgKHB0TmV3LnkgPiByY1Njcm9sbC50b3ApCisgICAgICBwdE5ldy55ID0gcmNTY3JvbGwudG9wOworICAgIGlmIChwdE5ldy55IDwgcmNTY3JvbGwuYm90dG9tICsgcmNDb250ZW50cy5IZWlnaHQoKSkKKyAgICAgIHB0TmV3LnkgPSByY1Njcm9sbC5ib3R0b20gKyByY0NvbnRlbnRzLkhlaWdodCgpOworICAgIGlmIChwdE5ldy55IDwgcmNTY3JvbGwuYm90dG9tKQorICAgICAgcHROZXcueSA9IHJjU2Nyb2xsLmJvdHRvbTsKIAotCQlpZiAocHROZXcueSAhPSBwdFNjcm9sbC55KQotCQl7Ci0JCQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVSRVNFVCwgMCwgMCk7Ci0JCQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX1NDUk9MTFdJTkRPVywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7Ci0JCQltX3BDb250ZW50c0Jhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7CisgICAgaWYgKHB0TmV3LnkgIT0gcHRTY3JvbGwueSkgeworICAgICAgbV9wQ29udGVudHMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOworICAgICAgbV9wQ29udGVudHMtPk9uTm90aWZ5KHRoaXMsIFBOTV9TQ1JPTExXSU5ET1csIFNCVF9WU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRwdHJfdCkmcHROZXcueSk7CisgICAgICBtX3BDb250ZW50c0Jhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludHB0cl90KSZwdE5ldy55KTsKIAotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQl9CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQV0xfTm90ZTo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCi17Ci0Jc3dpdGNoIChtc2cpCi0JewotCWNhc2UgUE5NX05PVEVFRElUQ0hBTkdFRDoKLQkJewotCQkJQ1BERl9SZWN0IHJjU2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbEFyZWEoKTsKK3ZvaWQgQ1BXTF9Ob3RlOjpPbk5vdGlmeShDUFdMX1duZCogcFduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSkgeworICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgUE5NX05PVEVFRElUQ0hBTkdFRDogeworICAgICAgQ1BERl9SZWN0IHJjU2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbEFyZWEoKTsKIAorICAgICAgUFdMX1NDUk9MTF9JTkZPIHNJbmZvOworICAgICAgc0luZm8uZkNvbnRlbnRNaW4gPSByY1Njcm9sbC5ib3R0b207CisgICAgICBzSW5mby5mQ29udGVudE1heCA9IHJjU2Nyb2xsLnRvcDsKKyAgICAgIHNJbmZvLmZQbGF0ZVdpZHRoID0gbV9wQ29udGVudHMtPkdldENsaWVudFJlY3QoKS5IZWlnaHQoKTsKKyAgICAgIHNJbmZvLmZTbWFsbFN0ZXAgPSAxMy4wZjsKKyAgICAgIHNJbmZvLmZCaWdTdGVwID0gc0luZm8uZlBsYXRlV2lkdGg7CiAKLQkJCVBXTF9TQ1JPTExfSU5GTyBzSW5mbzsKLQkJCXNJbmZvLmZDb250ZW50TWluID0gcmNTY3JvbGwuYm90dG9tOwotCQkJc0luZm8uZkNvbnRlbnRNYXggPSByY1Njcm9sbC50b3A7Ci0JCQlzSW5mby5mUGxhdGVXaWR0aCA9IG1fcENvbnRlbnRzLT5HZXRDbGllbnRSZWN0KCkuSGVpZ2h0KCk7Ci0JCQlzSW5mby5mU21hbGxTdGVwID0gMTMuMGY7Ci0JCQlzSW5mby5mQmlnU3RlcCA9IHNJbmZvLmZQbGF0ZVdpZHRoOworICAgICAgaWYgKEZYU1lTX21lbWNtcCgmbV9PbGRTY3JvbGxJbmZvLCAmc0luZm8sIHNpemVvZihQV0xfU0NST0xMX0lORk8pKSAhPQorICAgICAgICAgIDApIHsKKyAgICAgICAgRlhfQk9PTCBiU2Nyb2xsQ2hhbmdlZCA9IEZBTFNFOwogCi0JCQlpZiAoRlhTWVNfbWVtY21wKCZtX09sZFNjcm9sbEluZm8sICZzSW5mbywgc2l6ZW9mKFBXTF9TQ1JPTExfSU5GTykpICE9IDApCi0JCQl7Ci0JCQkJRlhfQk9PTCBiU2Nyb2xsQ2hhbmdlZCA9IEZBTFNFOworICAgICAgICBpZiAobFBhcmFtIDwgMykgIC8vt8DWucvA0a27tyBtYW50aXM6MTU3NTkKKyAgICAgICAgeworICAgICAgICAgIGJTY3JvbGxDaGFuZ2VkID0gUmVzZXRTY3JvbGxCYXIoKTsKKyAgICAgICAgICBpZiAoYlNjcm9sbENoYW5nZWQpIHsKKyAgICAgICAgICAgIGxQYXJhbSsrOworICAgICAgICAgICAgbV9wQ29udGVudHMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOworICAgICAgICAgICAgT25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgbFBhcmFtKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJCWlmIChsUGFyYW0gPCAzKSAvL7fA1rnLwNGtu7cgbWFudGlzOjE1NzU5Ci0JCQkJewotCQkJCQliU2Nyb2xsQ2hhbmdlZCA9IFJlc2V0U2Nyb2xsQmFyKCk7Ci0JCQkJCWlmIChiU2Nyb2xsQ2hhbmdlZCkKLQkJCQkJewotCQkJCQkJbFBhcmFtKys7Ci0JCQkJCQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVSRVNFVCwgMCwgMCk7Ci0JCQkJCQlPbk5vdGlmeSh0aGlzLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCBsUGFyYW0pOwotCQkJCQl9Ci0JCQkJfQorICAgICAgICBpZiAoIWJTY3JvbGxDaGFuZ2VkKSB7CisgICAgICAgICAgaWYgKG1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkgeworICAgICAgICAgICAgbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHBXbmQsIFBOTV9TRVRTQ1JPTExJTkZPLCBTQlRfVlNDUk9MTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpJnNJbmZvKTsKKyAgICAgICAgICAgIG1fT2xkU2Nyb2xsSW5mbyA9IHNJbmZvOwogCi0JCQkJaWYgKCFiU2Nyb2xsQ2hhbmdlZCkKLQkJCQl7Ci0JCQkJCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCi0JCQkJCXsKLQkJCQkJCW1fcENvbnRlbnRzQmFyLT5Pbk5vdGlmeShwV25kLCBQTk1fU0VUU0NST0xMSU5GTywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmc0luZm8pOwotCQkJCQkJbV9PbGRTY3JvbGxJbmZvID0gc0luZm87CisgICAgICAgICAgICBDUERGX1BvaW50IHB0U2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbFBvcygpOworICAgICAgICAgICAgQ1BERl9Qb2ludCBwdE9sZCA9IHB0U2Nyb2xsOwogCi0JCQkJCQlDUERGX1BvaW50IHB0U2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbFBvcygpOwotCQkJCQkJQ1BERl9Qb2ludCBwdE9sZCA9IHB0U2Nyb2xsOworICAgICAgICAgICAgaWYgKHB0U2Nyb2xsLnkgPiBzSW5mby5mQ29udGVudE1heCkKKyAgICAgICAgICAgICAgcHRTY3JvbGwueSA9IHNJbmZvLmZDb250ZW50TWF4OworICAgICAgICAgICAgaWYgKHB0U2Nyb2xsLnkgPCBzSW5mby5mQ29udGVudE1pbiArIHNJbmZvLmZQbGF0ZVdpZHRoKQorICAgICAgICAgICAgICBwdFNjcm9sbC55ID0gc0luZm8uZkNvbnRlbnRNaW4gKyBzSW5mby5mUGxhdGVXaWR0aDsKKyAgICAgICAgICAgIGlmIChwdFNjcm9sbC55IDwgc0luZm8uZkNvbnRlbnRNaW4pCisgICAgICAgICAgICAgIHB0U2Nyb2xsLnkgPSBzSW5mby5mQ29udGVudE1pbjsKIAotCQkJCQkJaWYgKHB0U2Nyb2xsLnkgPiBzSW5mby5mQ29udGVudE1heCkKLQkJCQkJCQlwdFNjcm9sbC55ID0gc0luZm8uZkNvbnRlbnRNYXg7Ci0JCQkJCQlpZiAocHRTY3JvbGwueSA8IHNJbmZvLmZDb250ZW50TWluICsgc0luZm8uZlBsYXRlV2lkdGgpCi0JCQkJCQkJcHRTY3JvbGwueSA9IHNJbmZvLmZDb250ZW50TWluICsgc0luZm8uZlBsYXRlV2lkdGg7Ci0JCQkJCQlpZiAocHRTY3JvbGwueSA8IHNJbmZvLmZDb250ZW50TWluKQotCQkJCQkJCXB0U2Nyb2xsLnkgPSBzSW5mby5mQ29udGVudE1pbjsKKyAgICAgICAgICAgIGlmIChwdE9sZC55ICE9IHB0U2Nyb2xsLnkpIHsKKyAgICAgICAgICAgICAgbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludHB0cl90KSZwdFNjcm9sbC55KTsKKyAgICAgICAgICAgICAgbV9wQ29udGVudHNCYXItPkludmFsaWRhdGVSZWN0KE5VTEwpOworICAgICAgICAgICAgICBtX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX1NDUk9MTFdJTkRPVywgU0JUX1ZTQ1JPTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpJnB0U2Nyb2xsLnkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KIAotCQkJCQkJaWYgKHB0T2xkLnkgIT0gcHRTY3JvbGwueSkKLQkJCQkJCXsKLQkJCQkJCQltX3BDb250ZW50c0Jhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHRTY3JvbGwueSk7Ci0JCQkJCQkJbV9wQ29udGVudHNCYXItPkludmFsaWRhdGVSZWN0KE5VTEwpOwotCQkJCQkJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0NST0xMV0lORE9XLCBTQlRfVlNDUk9MTCwgKGludHB0cl90KSZwdFNjcm9sbC55KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgbV9wQ29udGVudHMtPkludmFsaWRhdGVSZWN0KE5VTEwpOwogCi0JCW1fcENvbnRlbnRzLT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFBOTV9TQ1JPTExXSU5ET1c6CisgICAgICBpZiAobV9wQ29udGVudHMpCisgICAgICAgIG1fcENvbnRlbnRzLT5Pbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFBOTV9TRVRTQ1JPTExQT1M6CisgICAgICBpZiAobV9wQ29udGVudHNCYXIpCisgICAgICAgIG1fcENvbnRlbnRzQmFyLT5Pbk5vdGlmeShwV25kLCBQTk1fU0VUU0NST0xMUE9TLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICByZXR1cm47CisgIH0KIAotCQlyZXR1cm47Ci0JY2FzZSBQTk1fU0NST0xMV0lORE9XOgotCQlpZiAobV9wQ29udGVudHMpCi0JCQltX3BDb250ZW50cy0+T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCXJldHVybjsKLQljYXNlIFBOTV9TRVRTQ1JPTExQT1M6Ci0JCWlmIChtX3BDb250ZW50c0JhcikKLQkJCW1fcENvbnRlbnRzQmFyLT5Pbk5vdGlmeShwV25kLFBOTV9TRVRTQ1JPTExQT1Msd1BhcmFtLGxQYXJhbSk7Ci0JCXJldHVybjsKLQl9CisgIGlmIChtc2cgPT0gUE5NX1NFVENBUkVUSU5GTyAmJiBJc1ZhbGlkKCkpIHsKKyAgICBpZiAoUFdMX0NBUkVUX0lORk8qIHBJbmZvID0gKFBXTF9DQVJFVF9JTkZPKil3UGFyYW0pIHsKKyAgICAgIGlmIChtX3BDb250ZW50cykgeworICAgICAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBtX3BDb250ZW50cy0+R2V0Q2xpZW50UmVjdCgpOworICAgICAgICBpZiAocEluZm8tPnB0SGVhZC55ID4gcmNDbGllbnQudG9wKSB7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdCA9IG1fcENvbnRlbnRzLT5PdXRUb0luKHBJbmZvLT5wdEhlYWQpOworICAgICAgICAgIG1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0NST0xMV0lORE9XLCBTQlRfVlNDUk9MTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludHB0cl90KSZwdC55KTsKIAotCWlmIChtc2cgPT0gUE5NX1NFVENBUkVUSU5GTyAmJiBJc1ZhbGlkKCkpCi0JewotCQlpZiAoUFdMX0NBUkVUX0lORk8gKiBwSW5mbyA9IChQV0xfQ0FSRVRfSU5GTyopd1BhcmFtKQotCQl7Ci0JCQlpZiAobV9wQ29udGVudHMpCi0JCQl7Ci0JCQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gbV9wQ29udGVudHMtPkdldENsaWVudFJlY3QoKTsKLQkJCQlpZiAocEluZm8tPnB0SGVhZC55ID4gcmNDbGllbnQudG9wKQotCQkJCXsKLQkJCQkJQ1BERl9Qb2ludCBwdCA9IG1fcENvbnRlbnRzLT5PdXRUb0luKHBJbmZvLT5wdEhlYWQpOwotCQkJCQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX1NDUk9MTFdJTkRPVywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHQueSk7Ci0KLQkJCQkJQ1BERl9Qb2ludCBwdFNjcm9sbCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxQb3MoKTsKLQkJCQkJbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLCAoaW50cHRyX3QpJnB0U2Nyb2xsLnkpOworICAgICAgICAgIENQREZfUG9pbnQgcHRTY3JvbGwgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsUG9zKCk7CisgICAgICAgICAgbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpJnB0U2Nyb2xsLnkpOwogCi0JCQkJCXJldHVybjsKLQkJCQl9CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJCQlpZiAocEluZm8tPnB0Rm9vdC55IDwgcmNDbGllbnQuYm90dG9tKQotCQkJCXsKLQkJCQkJQ1BERl9Qb2ludCBwdCA9IG1fcENvbnRlbnRzLT5PdXRUb0luKHBJbmZvLT5wdEZvb3QpOwotCQkJCQlwdC55ICs9IHJjQ2xpZW50LkhlaWdodCgpOwotCQkJCQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX1NDUk9MTFdJTkRPVywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHQueSk7CisgICAgICAgIGlmIChwSW5mby0+cHRGb290LnkgPCByY0NsaWVudC5ib3R0b20pIHsKKyAgICAgICAgICBDUERGX1BvaW50IHB0ID0gbV9wQ29udGVudHMtPk91dFRvSW4ocEluZm8tPnB0Rm9vdCk7CisgICAgICAgICAgcHQueSArPSByY0NsaWVudC5IZWlnaHQoKTsKKyAgICAgICAgICBtX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX1NDUk9MTFdJTkRPVywgU0JUX1ZTQ1JPTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRwdHJfdCkmcHQueSk7CiAKLQkJCQkJQ1BERl9Qb2ludCBwdFNjcm9sbCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxQb3MoKTsKLQkJCQkJbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLCAoaW50cHRyX3QpJnB0U2Nyb2xsLnkpOworICAgICAgICAgIENQREZfUG9pbnQgcHRTY3JvbGwgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsUG9zKCk7CisgICAgICAgICAgbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpJnB0U2Nyb2xsLnkpOwogCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiAKLQlDUFdMX05vdGVJdGVtOjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgQ1BXTF9Ob3RlSXRlbTo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlOjpTZXRCa0NvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQotewotCUNQV0xfTm90ZUl0ZW06OlNldEJrQ29sb3IoY29sb3IpOwordm9pZCBDUFdMX05vdGU6OlNldEJrQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgQ1BXTF9Ob3RlSXRlbTo6U2V0QmtDb2xvcihjb2xvcik7CiAKLQlDUFdMX0NvbG9yIHNCSyA9IGNvbG9yOwotCUNQV0xfQ29sb3Igc1RleHRDb2xvcjsKLQlpZiAoQ1BXTF9VdGlsczo6SXNCbGFja09yV2hpdGUoc0JLKSkKLQkJc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7Ci0JZWxzZQotCQlzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKKyAgQ1BXTF9Db2xvciBzQksgPSBjb2xvcjsKKyAgQ1BXTF9Db2xvciBzVGV4dENvbG9yOworICBpZiAoQ1BXTF9VdGlsczo6SXNCbGFja09yV2hpdGUoc0JLKSkKKyAgICBzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKKyAgZWxzZQorICAgIHNUZXh0Q29sb3IgPSBQV0xfREVGQVVMVF9CTEFDS0NPTE9SOwogCi0JaWYgKG1fcENsb3NlQm94KQotCQltX3BDbG9zZUJveC0+U2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOwotCWlmIChtX3BBdXRob3IpCi0JCW1fcEF1dGhvci0+U2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOwotCWlmIChtX3BPcHRpb25zKQotCQltX3BPcHRpb25zLT5TZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7Ci0JaWYgKG1fcExCQm94KQotCQltX3BMQkJveC0+U2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOwotCWlmIChtX3BSQkJveCkKLQkJbV9wUkJCb3gtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKKyAgaWYgKG1fcENsb3NlQm94KQorICAgIG1fcENsb3NlQm94LT5TZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7CisgIGlmIChtX3BBdXRob3IpCisgICAgbV9wQXV0aG9yLT5TZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7CisgIGlmIChtX3BPcHRpb25zKQorICAgIG1fcE9wdGlvbnMtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKKyAgaWYgKG1fcExCQm94KQorICAgIG1fcExCQm94LT5TZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7CisgIGlmIChtX3BSQkJveCkKKyAgICBtX3BSQkJveC0+U2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOwogfQogCi1GWF9CT09MCUNQV0xfTm90ZTo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKG1fcE9wdGlvbnMtPlduZEhpdFRlc3QobV9wT3B0aW9ucy0+UGFyZW50VG9DaGlsZChwb2ludCkpKQotCXsKLQkJaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKLQkJewotCQkJaW50MzJfdCB4LCB5OwotCQkJUFdMdG9XbmQocG9pbnQsIHgsIHkpOwotCQkJaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0JCQkJcFNILT5DbGllbnRUb1NjcmVlbihHZXRBdHRhY2hlZEhXbmQoKSwgeCwgeSk7Ci0JCQlLaWxsRm9jdXMoKTsKLQkJCXBOb3RpZnktPk9uUG9wdXBNZW51KHgsIHkpOworRlhfQk9PTCBDUFdMX05vdGU6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmIChtX3BPcHRpb25zLT5XbmRIaXRUZXN0KG1fcE9wdGlvbnMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgeworICAgIGlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpIHsKKyAgICAgIGludDMyX3QgeCwgeTsKKyAgICAgIFBXTHRvV25kKHBvaW50LCB4LCB5KTsKKyAgICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKQorICAgICAgICBwU0gtPkNsaWVudFRvU2NyZWVuKEdldEF0dGFjaGVkSFduZCgpLCB4LCB5KTsKKyAgICAgIEtpbGxGb2N1cygpOworICAgICAgcE5vdGlmeS0+T25Qb3B1cE1lbnUoeCwgeSk7CiAKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CiAKLQlyZXR1cm4gQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOworICByZXR1cm4gQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKIH0KIAotRlhfQk9PTAlDUFdMX05vdGU6Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JcmV0dXJuIENQV0xfV25kOjpPblJCdXR0b25VcChwb2ludCxuRmxhZyk7CitGWF9CT09MIENQV0xfTm90ZTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIHJldHVybiBDUFdMX1duZDo6T25SQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIH0KIAotY29uc3QgQ1BXTF9Ob3RlKiBDUFdMX05vdGU6OkdldE5vdGUoKSBjb25zdAotewotCXJldHVybiB0aGlzOworY29uc3QgQ1BXTF9Ob3RlKiBDUFdMX05vdGU6OkdldE5vdGUoKSBjb25zdCB7CisgIHJldHVybiB0aGlzOwogfQogCi1JUFdMX05vdGVOb3RpZnkqIENQV0xfTm90ZTo6R2V0Tm90ZU5vdGlmeSgpIGNvbnN0Ci17Ci0JaWYgKG1fYkVuYWxibGVOb3RpZnkpCi0JCXJldHVybiBtX3BOb3RlTm90aWZ5OworSVBXTF9Ob3RlTm90aWZ5KiBDUFdMX05vdGU6OkdldE5vdGVOb3RpZnkoKSBjb25zdCB7CisgIGlmIChtX2JFbmFsYmxlTm90aWZ5KQorICAgIHJldHVybiBtX3BOb3RlTm90aWZ5OwogCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENQV0xfTm90ZTo6U2V0SWNvblR5cGUoaW50MzJfdCBuVHlwZSkKLXsKLQlpZiAobV9wSWNvbikKLQkJbV9wSWNvbi0+U2V0SWNvblR5cGUoblR5cGUpOwordm9pZCBDUFdMX05vdGU6OlNldEljb25UeXBlKGludDMyX3QgblR5cGUpIHsKKyAgaWYgKG1fcEljb24pCisgICAgbV9wSWNvbi0+U2V0SWNvblR5cGUoblR5cGUpOwogfQogCi12b2lkIENQV0xfTm90ZTo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0JbV9wQ29udGVudHMtPkVuYWJsZU1vZGlmeShiRW5hYmxlZCk7Cit2b2lkIENQV0xfTm90ZTo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpIHsKKyAgbV9wQ29udGVudHMtPkVuYWJsZU1vZGlmeShiRW5hYmxlZCk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlOjpFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0JbV9wQ29udGVudHMtPkVuYWJsZVJlYWQoYkVuYWJsZWQpOwordm9pZCBDUFdMX05vdGU6OkVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCkgeworICBtX3BDb250ZW50cy0+RW5hYmxlUmVhZChiRW5hYmxlZCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQV0xfTm90ZTo6R2V0UmVwbHlTdHJpbmcoKSBjb25zdAotewotCXJldHVybiBtX3NSZXBseVN0cmluZzsKK0NGWF9XaWRlU3RyaW5nIENQV0xfTm90ZTo6R2V0UmVwbHlTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiBtX3NSZXBseVN0cmluZzsKIH0KIAotdm9pZCBDUFdMX05vdGU6OlNldFJlcGx5U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpCi17Ci0JbV9zUmVwbHlTdHJpbmcgPSBzdHJpbmc7Cit2b2lkIENQV0xfTm90ZTo6U2V0UmVwbHlTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykgeworICBtX3NSZXBseVN0cmluZyA9IHN0cmluZzsKIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuY3BwCmluZGV4IDZkNjE3MDUuLmM3NjJiNGMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5jcHAKQEAgLTksMTI5NSArOSwxMjAxIEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgogCi0jZGVmaW5lIElzRmxvYXRaZXJvKGYpCQkJCQkJKChmKSA8IDAuMDAwMSAmJiAoZikgPiAtMC4wMDAxKQotI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLGZiKQkJCQkoKGZhKSA+IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKLSNkZWZpbmUgSXNGbG9hdFNtYWxsZXIoZmEsZmIpCQkJCSgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsZmIpCQkJCQlJc0Zsb2F0WmVybygoZmEpLShmYikpCisjZGVmaW5lIElzRmxvYXRaZXJvKGYpICgoZikgPCAwLjAwMDEgJiYgKGYpID4gLTAuMDAwMSkKKyNkZWZpbmUgSXNGbG9hdEJpZ2dlcihmYSwgZmIpICgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSwgZmIpICgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsIGZiKSBJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkKIAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQV0xfRkxPQVRSQU5HRQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBXTF9GTE9BVFJBTkdFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotUFdMX0ZMT0FUUkFOR0U6OlBXTF9GTE9BVFJBTkdFKCkKLXsKLQlEZWZhdWx0KCk7CitQV0xfRkxPQVRSQU5HRTo6UFdMX0ZMT0FUUkFOR0UoKSB7CisgIERlZmF1bHQoKTsKIH0KIAotUFdMX0ZMT0FUUkFOR0U6OlBXTF9GTE9BVFJBTkdFKEZYX0ZMT0FUIG1pbixGWF9GTE9BVCBtYXgpCi17Ci0JU2V0KG1pbixtYXgpOworUFdMX0ZMT0FUUkFOR0U6OlBXTF9GTE9BVFJBTkdFKEZYX0ZMT0FUIG1pbiwgRlhfRkxPQVQgbWF4KSB7CisgIFNldChtaW4sIG1heCk7CiB9CiAKLXZvaWQgUFdMX0ZMT0FUUkFOR0U6OkRlZmF1bHQoKQotewotCWZNaW4gPSAwOwotCWZNYXggPSAwOwordm9pZCBQV0xfRkxPQVRSQU5HRTo6RGVmYXVsdCgpIHsKKyAgZk1pbiA9IDA7CisgIGZNYXggPSAwOwogfQogCi12b2lkIFBXTF9GTE9BVFJBTkdFOjpTZXQoRlhfRkxPQVQgbWluLEZYX0ZMT0FUIG1heCkKLXsKLQlpZiAobWluID4gbWF4KQotCXsKLQkJZk1pbiA9IG1heDsKLQkJZk1heCA9IG1pbjsKLQl9Ci0JZWxzZQotCXsKLQkJZk1pbiA9IG1pbjsKLQkJZk1heCA9IG1heDsKLQl9Cit2b2lkIFBXTF9GTE9BVFJBTkdFOjpTZXQoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpIHsKKyAgaWYgKG1pbiA+IG1heCkgeworICAgIGZNaW4gPSBtYXg7CisgICAgZk1heCA9IG1pbjsKKyAgfSBlbHNlIHsKKyAgICBmTWluID0gbWluOworICAgIGZNYXggPSBtYXg7CisgIH0KIH0KIAotRlhfQk9PTAlQV0xfRkxPQVRSQU5HRTo6SW4oRlhfRkxPQVQgeCkgY29uc3QKLXsKLQlyZXR1cm4gKElzRmxvYXRCaWdnZXIoeCxmTWluKSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1pbikpICYmCi0JCShJc0Zsb2F0U21hbGxlcih4LCBmTWF4KSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1heCkpOworRlhfQk9PTCBQV0xfRkxPQVRSQU5HRTo6SW4oRlhfRkxPQVQgeCkgY29uc3QgeworICByZXR1cm4gKElzRmxvYXRCaWdnZXIoeCwgZk1pbikgfHwgSXNGbG9hdEVxdWFsKHgsIGZNaW4pKSAmJgorICAgICAgICAgKElzRmxvYXRTbWFsbGVyKHgsIGZNYXgpIHx8IElzRmxvYXRFcXVhbCh4LCBmTWF4KSk7CiB9CiAKLUZYX0ZMT0FUIFBXTF9GTE9BVFJBTkdFOjpHZXRXaWR0aCgpIGNvbnN0Ci17Ci0JcmV0dXJuIGZNYXggLSBmTWluOworRlhfRkxPQVQgUFdMX0ZMT0FUUkFOR0U6OkdldFdpZHRoKCkgY29uc3QgeworICByZXR1cm4gZk1heCAtIGZNaW47CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFdMX1NDUk9MTF9QUklWQVRFREFUQSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBXTF9TQ1JPTExfUFJJVkFURURBVEEKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6UFdMX1NDUk9MTF9QUklWQVRFREFUQSgpCi17Ci0JRGVmYXVsdCgpOworUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6UFdMX1NDUk9MTF9QUklWQVRFREFUQSgpIHsKKyAgRGVmYXVsdCgpOwogfQogCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OkRlZmF1bHQoKQotewotCVNjcm9sbFJhbmdlLkRlZmF1bHQoKTsKLQlmU2Nyb2xsUG9zID0gU2Nyb2xsUmFuZ2UuZk1pbjsKLQlmQ2xpZW50V2lkdGggPSAwOwotCWZCaWdTdGVwID0gMTA7Ci0JZlNtYWxsU3RlcCA9IDE7Cit2b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OkRlZmF1bHQoKSB7CisgIFNjcm9sbFJhbmdlLkRlZmF1bHQoKTsKKyAgZlNjcm9sbFBvcyA9IFNjcm9sbFJhbmdlLmZNaW47CisgIGZDbGllbnRXaWR0aCA9IDA7CisgIGZCaWdTdGVwID0gMTA7CisgIGZTbWFsbFN0ZXAgPSAxOwogfQogCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFNjcm9sbFJhbmdlKEZYX0ZMT0FUIG1pbixGWF9GTE9BVCBtYXgpCi17Ci0JU2Nyb2xsUmFuZ2UuU2V0KG1pbixtYXgpOwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRTY3JvbGxSYW5nZShGWF9GTE9BVCBtaW4sIEZYX0ZMT0FUIG1heCkgeworICBTY3JvbGxSYW5nZS5TZXQobWluLCBtYXgpOwogCi0JaWYgKElzRmxvYXRTbWFsbGVyKGZTY3JvbGxQb3MsIFNjcm9sbFJhbmdlLmZNaW4pKQotCQlmU2Nyb2xsUG9zID0gU2Nyb2xsUmFuZ2UuZk1pbjsKLQlpZiAoSXNGbG9hdEJpZ2dlcihmU2Nyb2xsUG9zLCBTY3JvbGxSYW5nZS5mTWF4KSkKLQkJZlNjcm9sbFBvcyA9IFNjcm9sbFJhbmdlLmZNYXg7CisgIGlmIChJc0Zsb2F0U21hbGxlcihmU2Nyb2xsUG9zLCBTY3JvbGxSYW5nZS5mTWluKSkKKyAgICBmU2Nyb2xsUG9zID0gU2Nyb2xsUmFuZ2UuZk1pbjsKKyAgaWYgKElzRmxvYXRCaWdnZXIoZlNjcm9sbFBvcywgU2Nyb2xsUmFuZ2UuZk1heCkpCisgICAgZlNjcm9sbFBvcyA9IFNjcm9sbFJhbmdlLmZNYXg7CiB9CiAKLXZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U2V0Q2xpZW50V2lkdGgoRlhfRkxPQVQgd2lkdGgpCi17Ci0JZkNsaWVudFdpZHRoID0gd2lkdGg7Cit2b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldENsaWVudFdpZHRoKEZYX0ZMT0FUIHdpZHRoKSB7CisgIGZDbGllbnRXaWR0aCA9IHdpZHRoOwogfQogCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFNtYWxsU3RlcChGWF9GTE9BVCBzdGVwKQotewotCWZTbWFsbFN0ZXAgPSBzdGVwOwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRTbWFsbFN0ZXAoRlhfRkxPQVQgc3RlcCkgeworICBmU21hbGxTdGVwID0gc3RlcDsKIH0KIAotdm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRCaWdTdGVwKEZYX0ZMT0FUIHN0ZXApCi17Ci0JZkJpZ1N0ZXAgPSBzdGVwOwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRCaWdTdGVwKEZYX0ZMT0FUIHN0ZXApIHsKKyAgZkJpZ1N0ZXAgPSBzdGVwOwogfQogCi1GWF9CT09MIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFBvcyhGWF9GTE9BVCBwb3MpCi17Ci0JaWYgKFNjcm9sbFJhbmdlLkluKHBvcykpCi0JewotCQlmU2Nyb2xsUG9zID0gcG9zOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRQb3MoRlhfRkxPQVQgcG9zKSB7CisgIGlmIChTY3JvbGxSYW5nZS5Jbihwb3MpKSB7CisgICAgZlNjcm9sbFBvcyA9IHBvczsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6QWRkU21hbGwoKQotewotCWlmICghU2V0UG9zKGZTY3JvbGxQb3MgKyBmU21hbGxTdGVwKSkKLQkJU2V0UG9zKFNjcm9sbFJhbmdlLmZNYXgpOwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpBZGRTbWFsbCgpIHsKKyAgaWYgKCFTZXRQb3MoZlNjcm9sbFBvcyArIGZTbWFsbFN0ZXApKQorICAgIFNldFBvcyhTY3JvbGxSYW5nZS5mTWF4KTsKIH0KIAotdm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTdWJTbWFsbCgpCi17Ci0JaWYgKCFTZXRQb3MoZlNjcm9sbFBvcyAtIGZTbWFsbFN0ZXApKQotCQlTZXRQb3MoU2Nyb2xsUmFuZ2UuZk1pbik7Cit2b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlN1YlNtYWxsKCkgeworICBpZiAoIVNldFBvcyhmU2Nyb2xsUG9zIC0gZlNtYWxsU3RlcCkpCisgICAgU2V0UG9zKFNjcm9sbFJhbmdlLmZNaW4pOwogfQogCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OkFkZEJpZygpCi17Ci0JaWYgKCFTZXRQb3MoZlNjcm9sbFBvcyArIGZCaWdTdGVwKSkKLQkJU2V0UG9zKFNjcm9sbFJhbmdlLmZNYXgpOwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpBZGRCaWcoKSB7CisgIGlmICghU2V0UG9zKGZTY3JvbGxQb3MgKyBmQmlnU3RlcCkpCisgICAgU2V0UG9zKFNjcm9sbFJhbmdlLmZNYXgpOwogfQogCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlN1YkJpZygpCi17Ci0JaWYgKCFTZXRQb3MoZlNjcm9sbFBvcyAtIGZCaWdTdGVwKSkKLQkJU2V0UG9zKFNjcm9sbFJhbmdlLmZNaW4pOwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTdWJCaWcoKSB7CisgIGlmICghU2V0UG9zKGZTY3JvbGxQb3MgLSBmQmlnU3RlcCkpCisgICAgU2V0UG9zKFNjcm9sbFJhbmdlLmZNaW4pOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfU0JCdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX1NCQnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCi1DUFdMX1NCQnV0dG9uOjpDUFdMX1NCQnV0dG9uKFBXTF9TQ1JPTExCQVJfVFlQRSBlU2Nyb2xsQmFyVHlwZSxQV0xfU0JCVVRUT05fVFlQRSBlQnV0dG9uVHlwZSkKLXsKLQltX2VTY3JvbGxCYXJUeXBlID0gZVNjcm9sbEJhclR5cGU7Ci0JbV9lU0JCdXR0b25UeXBlID0gZUJ1dHRvblR5cGU7CitDUFdMX1NCQnV0dG9uOjpDUFdMX1NCQnV0dG9uKFBXTF9TQ1JPTExCQVJfVFlQRSBlU2Nyb2xsQmFyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX1NCQlVUVE9OX1RZUEUgZUJ1dHRvblR5cGUpIHsKKyAgbV9lU2Nyb2xsQmFyVHlwZSA9IGVTY3JvbGxCYXJUeXBlOworICBtX2VTQkJ1dHRvblR5cGUgPSBlQnV0dG9uVHlwZTsKIAotCW1fYk1vdXNlRG93biA9IEZBTFNFOworICBtX2JNb3VzZURvd24gPSBGQUxTRTsKIH0KIAotQ1BXTF9TQkJ1dHRvbjo6fkNQV0xfU0JCdXR0b24oKQoteworQ1BXTF9TQkJ1dHRvbjo6fkNQV0xfU0JCdXR0b24oKSB7fQogCitDRlhfQnl0ZVN0cmluZyBDUFdMX1NCQnV0dG9uOjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9TQkJ1dHRvbiI7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfU0JCdXR0b246OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICJDUFdMX1NCQnV0dG9uIjsKK3ZvaWQgQ1BXTF9TQkJ1dHRvbjo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7CiB9CiAKLXZvaWQgQ1BXTF9TQkJ1dHRvbjo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JY3AuZUN1cnNvclR5cGUgPSBGWENUX0FSUk9XOwordm9pZCBDUFdMX1NCQnV0dG9uOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKKyAgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOworCisgIGlmICghSXNWaXNpYmxlKCkpCisgICAgcmV0dXJuOworCisgIENGWF9CeXRlVGV4dEJ1ZiBzQnV0dG9uOworCisgIENQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOworCisgIGlmIChyZWN0V25kLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgc0FwcFN0cmVhbSA8PCAicVxuIjsKKworICBDUERGX1BvaW50IHB0Q2VudGVyID0gR2V0Q2VudGVyUG9pbnQoKTsKKworICBzd2l0Y2ggKG1fZVNjcm9sbEJhclR5cGUpIHsKKyAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgc3dpdGNoIChtX2VTQkJ1dHRvblR5cGUpIHsKKyAgICAgICAgY2FzZSBQU0JUX01JTjogeworICAgICAgICAgIENQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYsIHB0Q2VudGVyLnkpOworICAgICAgICAgIENQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSArIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MyhwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgLSBQV0xfVFJJQU5HTEVfSEFMRkxFTik7CisKKyAgICAgICAgICBpZiAocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICogMiAmJgorICAgICAgICAgICAgICByZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4pIHsKKyAgICAgICAgICAgIHNCdXR0b24gPDwgIjAgZ1xuIjsKKyAgICAgICAgICAgIHNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKKyAgICAgICAgICAgIHNCdXR0b24gPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55IDw8ICIgbFxuIjsKKyAgICAgICAgICAgIHNCdXR0b24gPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IDw8ICIgbFxuIjsKKyAgICAgICAgICAgIHNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbCBmXG4iOworCisgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNCdXR0b247CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFBTQlRfTUFYOiB7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdDEocHRDZW50ZXIueCArIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZiwgcHRDZW50ZXIueSk7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdDIocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4pOworICAgICAgICAgIENQREZfUG9pbnQgcHQzKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKKworICAgICAgICAgIGlmIChyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0ID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAyICYmCisgICAgICAgICAgICAgIHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTikgeworICAgICAgICAgICAgc0J1dHRvbiA8PCAiMCBnXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsIGZcbiI7CisKKyAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0J1dHRvbjsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgc3dpdGNoIChtX2VTQkJ1dHRvblR5cGUpIHsKKyAgICAgICAgY2FzZSBQU0JUX01JTjogeworICAgICAgICAgIENQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MihwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdDMocHRDZW50ZXIueCwgcHRDZW50ZXIueSArIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CisKKyAgICAgICAgICBpZiAocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICogMiAmJgorICAgICAgICAgICAgICByZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4pIHsKKyAgICAgICAgICAgIHNCdXR0b24gPDwgIjAgZ1xuIjsKKyAgICAgICAgICAgIHNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKKyAgICAgICAgICAgIHNCdXR0b24gPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55IDw8ICIgbFxuIjsKKyAgICAgICAgICAgIHNCdXR0b24gPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IDw8ICIgbFxuIjsKKyAgICAgICAgICAgIHNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbCBmXG4iOworCisgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNCdXR0b247CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFBTQlRfTUFYOiB7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdDEocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOworICAgICAgICAgIENQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MyhwdENlbnRlci54LCBwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKKworICAgICAgICAgIGlmIChyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0ID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAyICYmCisgICAgICAgICAgICAgIHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTikgeworICAgICAgICAgICAgc0J1dHRvbiA8PCAiMCBnXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsIGZcbiI7CisKKyAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0J1dHRvbjsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBzQXBwU3RyZWFtIDw8ICJRXG4iOwogfQogCi12b2lkIENQV0xfU0JCdXR0b246OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pCi17Ci0JQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOwordm9pZCBDUFdMX1NCQnV0dG9uOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgaWYgKCFJc1Zpc2libGUoKSkKKyAgICByZXR1cm47CiAKLQlpZiAoIUlzVmlzaWJsZSgpKSByZXR1cm47CisgIENQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOworICBpZiAocmVjdFduZC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOwogCi0JQ0ZYX0J5dGVUZXh0QnVmIHNCdXR0b247CisgIENQREZfUG9pbnQgcHRDZW50ZXIgPSBHZXRDZW50ZXJQb2ludCgpOworICBpbnQzMl90IG5UcmFuc3BhcmFuY3kgPSBHZXRUcmFuc3BhcmVuY3koKTsKIAotCUNQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOworICBzd2l0Y2ggKG1fZVNjcm9sbEJhclR5cGUpIHsKKyAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOworICAgICAgc3dpdGNoIChtX2VTQkJ1dHRvblR5cGUpIHsKKyAgICAgICAgY2FzZSBQU0JUX01JTjogeworICAgICAgICAgIENQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYsIHB0Q2VudGVyLnkpOworICAgICAgICAgIENQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSArIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MyhwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgLSBQV0xfVFJJQU5HTEVfSEFMRkxFTik7CiAKLQlpZiAocmVjdFduZC5Jc0VtcHR5KCkpIHJldHVybjsKKyAgICAgICAgICBpZiAocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICogMiAmJgorICAgICAgICAgICAgICByZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4pIHsKKyAgICAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwogCi0Jc0FwcFN0cmVhbSA8PCAicVxuIjsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnRDb3VudCg0KTsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMCwgcHQxLngsIHB0MS55LCBGWFBUX01PVkVUTyk7CisgICAgICAgICAgICBwYXRoLlNldFBvaW50KDEsIHB0Mi54LCBwdDIueSwgRlhQVF9MSU5FVE8pOworICAgICAgICAgICAgcGF0aC5TZXRQb2ludCgyLCBwdDMueCwgcHQzLnksIEZYUFRfTElORVRPKTsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMywgcHQxLngsIHB0MS55LCBGWFBUX0xJTkVUTyk7CiAKLQlDUERGX1BvaW50IHB0Q2VudGVyID0gR2V0Q2VudGVyUG9pbnQoKTsKKyAgICAgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfREVGQVVMVF9CTEFDS0NPTE9SLCBuVHJhbnNwYXJhbmN5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEZYRklMTF9BTFRFUk5BVEUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBQU0JUX01BWDogeworICAgICAgICAgIENQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYsIHB0Q2VudGVyLnkpOworICAgICAgICAgIENQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSArIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MyhwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgLSBQV0xfVFJJQU5HTEVfSEFMRkxFTik7CiAKLQlzd2l0Y2ggKG1fZVNjcm9sbEJhclR5cGUpCi0JewotCQljYXNlIFNCVF9IU0NST0xMOgotCQkJc3dpdGNoIChtX2VTQkJ1dHRvblR5cGUpCi0JCQl7Ci0JCQkJY2FzZSBQU0JUX01JTjoKLQkJCQkJewotCQkJCQkJQ1BERl9Qb2ludCBwdDEocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZixwdENlbnRlci55KTsKLQkJCQkJCUNQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYscHRDZW50ZXIueSArIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKLQkJCQkJCUNQREZfUG9pbnQgcHQzKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYscHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKKyAgICAgICAgICBpZiAocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICogMiAmJgorICAgICAgICAgICAgICByZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4pIHsKKyAgICAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwogCi0JCQkJCQlpZiAocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICogMiAmJgotCQkJCQkJCXJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiApCi0JCQkJCQl7Ci0JCQkJCQkJc0J1dHRvbiA8PCAiMCBnXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKLQkJCQkJCQlzQnV0dG9uIDw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGxcbiI7Ci0JCQkJCQkJc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbCBmXG4iOworICAgICAgICAgICAgcGF0aC5TZXRQb2ludENvdW50KDQpOworICAgICAgICAgICAgcGF0aC5TZXRQb2ludCgwLCBwdDEueCwgcHQxLnksIEZYUFRfTU9WRVRPKTsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMSwgcHQyLngsIHB0Mi55LCBGWFBUX0xJTkVUTyk7CisgICAgICAgICAgICBwYXRoLlNldFBvaW50KDIsIHB0My54LCBwdDMueSwgRlhQVF9MSU5FVE8pOworICAgICAgICAgICAgcGF0aC5TZXRQb2ludCgzLCBwdDEueCwgcHQxLnksIEZYUFRfTElORVRPKTsKIAotCQkJCQkJCXNBcHBTdHJlYW0gPDwgc0J1dHRvbjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFBTQlRfTUFYOgotCQkJCQl7Ci0JCQkJCQlDUERGX1BvaW50IHB0MShwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLHB0Q2VudGVyLnkpOwotCQkJCQkJQ1BERl9Qb2ludCBwdDIocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZixwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4pOwotCQkJCQkJQ1BERl9Qb2ludCBwdDMocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZixwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4pOworICAgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IsIG5UcmFuc3BhcmFuY3kpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgIHN3aXRjaCAobV9lU0JCdXR0b25UeXBlKSB7CisgICAgICAgIGNhc2UgUFNCVF9NSU46IHsKKyAgICAgICAgICAvLyBkcmF3IGJvcmRlcgorICAgICAgICAgIENQREZfUmVjdCByY0RyYXcgPSByZWN0V25kOworICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMTAwLCAxMDAsIDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZik7CiAKLQkJCQkJCWlmIChyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0ID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAyICYmCi0JCQkJCQkJcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICkKLQkJCQkJCXsKLQkJCQkJCQlzQnV0dG9uIDw8ICIwIGdcbiI7Ci0JCQkJCQkJc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55IDw8ICIgbFxuIjsKLQkJCQkJCQlzQnV0dG9uIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGxcbiI7Ci0JCQkJCQkJc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsIGZcbiI7CisgICAgICAgICAgLy8gZHJhdyBpbm5lciBib3JkZXIKKyAgICAgICAgICByY0RyYXcgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0V25kLCAwLjVmKTsKKyAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksIDI1NSwgMjU1LCAyNTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOwogCi0JCQkJCQkJc0FwcFN0cmVhbSA8PCBzQnV0dG9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCQlzd2l0Y2ggKG1fZVNCQnV0dG9uVHlwZSkKLQkJCXsKLQkJCQljYXNlIFBTQlRfTUlOOgotCQkJCQl7Ci0JCQkJCQlDUERGX1BvaW50IHB0MShwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4scHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7Ci0JCQkJCQlDUERGX1BvaW50IHB0MihwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4scHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7Ci0JCQkJCQlDUERGX1BvaW50IHB0MyhwdENlbnRlci54LHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOworICAgICAgICAgIC8vIGRyYXcgYmFja2dyb3VuZAogCi0JCQkJCQlpZiAocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICogMiAmJgotCQkJCQkJCXJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiApCi0JCQkJCQl7Ci0JCQkJCQkJc0J1dHRvbiA8PCAiMCBnXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKLQkJCQkJCQlzQnV0dG9uIDw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGxcbiI7Ci0JCQkJCQkJc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbCBmXG4iOworICAgICAgICAgIHJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsIDEuMGYpOwogCi0JCQkJCQkJc0FwcFN0cmVhbSA8PCBzQnV0dG9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUFNCVF9NQVg6Ci0JCQkJCXsKLQkJCQkJCUNQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTixwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLQkJCQkJCUNQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTixwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLQkJCQkJCUNQREZfUG9pbnQgcHQzKHB0Q2VudGVyLngscHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CisgICAgICAgICAgaWYgKElzRW5hYmxlZCgpKQorICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1NoYWRvdyhwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIFRSVUUsIEZBTFNFLCByY0RyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5UcmFuc3BhcmFuY3ksIDgwLCAyMjApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSkpOwogCi0JCQkJCQlpZiAocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICogMiAmJgotCQkJCQkJCXJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiApCi0JCQkJCQl7Ci0JCQkJCQkJc0J1dHRvbiA8PCAiMCBnXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKLQkJCQkJCQlzQnV0dG9uIDw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGxcbiI7Ci0JCQkJCQkJc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbCBmXG4iOworICAgICAgICAgIC8vIGRyYXcgYXJyb3cKIAotCQkJCQkJCXNBcHBTdHJlYW0gPDwgc0J1dHRvbjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQorICAgICAgICAgIGlmIChyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4gNi4wZikgeworICAgICAgICAgICAgRlhfRkxPQVQgZlggPSByZWN0V25kLmxlZnQgKyAxLjVmOworICAgICAgICAgICAgRlhfRkxPQVQgZlkgPSByZWN0V25kLmJvdHRvbTsKKyAgICAgICAgICAgIENQREZfUG9pbnQgcHRzWzddID0ge0NQREZfUG9pbnQoZlggKyAyLjVmLCBmWSArIDQuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChmWCArIDIuNWYsIGZZICsgMy4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BvaW50KGZYICsgNC41ZiwgZlkgKyA1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQoZlggKyA2LjVmLCBmWSArIDMuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChmWCArIDYuNWYsIGZZICsgNC4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BvaW50KGZYICsgNC41ZiwgZlkgKyA2LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQoZlggKyAyLjVmLCBmWSArIDQuMGYpfTsKIAotCXNBcHBTdHJlYW0gPDwgIlFcbiI7CisgICAgICAgICAgICBpZiAoSXNFbmFibGVkKCkpCisgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsQXJlYSgKKyAgICAgICAgICAgICAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRzLCA3LAorICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAyNTUsIDI1NSwgMjU1KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsQXJlYShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0cywgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SLCAyNTUpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgUFNCVF9NQVg6IHsKKyAgICAgICAgICAvLyBkcmF3IGJvcmRlcgorICAgICAgICAgIENQREZfUmVjdCByY0RyYXcgPSByZWN0V25kOworICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMTAwLCAxMDAsIDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZik7CisKKyAgICAgICAgICAvLyBkcmF3IGlubmVyIGJvcmRlcgorICAgICAgICAgIHJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsIDAuNWYpOworICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMjU1LCAyNTUsIDI1NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7CisKKyAgICAgICAgICAvLyBkcmF3IGJhY2tncm91bmQKKyAgICAgICAgICByY0RyYXcgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0V25kLCAxLjBmKTsKKyAgICAgICAgICBpZiAoSXNFbmFibGVkKCkpCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U2hhZG93KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgVFJVRSwgRkFMU0UsIHJjRHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblRyYW5zcGFyYW5jeSwgODAsIDIyMCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSk7CisKKyAgICAgICAgICAvLyBkcmF3IGFycm93CisKKyAgICAgICAgICBpZiAocmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IDYuMGYpIHsKKyAgICAgICAgICAgIEZYX0ZMT0FUIGZYID0gcmVjdFduZC5sZWZ0ICsgMS41ZjsKKyAgICAgICAgICAgIEZYX0ZMT0FUIGZZID0gcmVjdFduZC5ib3R0b207CisKKyAgICAgICAgICAgIENQREZfUG9pbnQgcHRzWzddID0ge0NQREZfUG9pbnQoZlggKyAyLjVmLCBmWSArIDUuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChmWCArIDIuNWYsIGZZICsgNi4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BvaW50KGZYICsgNC41ZiwgZlkgKyA0LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQoZlggKyA2LjVmLCBmWSArIDYuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChmWCArIDYuNWYsIGZZICsgNS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BvaW50KGZYICsgNC41ZiwgZlkgKyAzLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQoZlggKyAyLjVmLCBmWSArIDUuMGYpfTsKKworICAgICAgICAgICAgaWYgKElzRW5hYmxlZCgpKQorICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEoCisgICAgICAgICAgICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0cywgNywKKyAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMjU1LCAyNTUsIDI1NSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdHMsIDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfREVGQVVMVF9IRUFWWUdSQVlDT0xPUiwgMjU1KSk7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFBTQlRfUE9TOiB7CisgICAgICAgICAgLy8gQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLHBVc2VyMkRldmljZSk7CisKKyAgICAgICAgICAvLyBkcmF3IGJvcmRlcgorICAgICAgICAgIENQREZfUmVjdCByY0RyYXcgPSByZWN0V25kOworICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMTAwLCAxMDAsIDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZik7CisKKyAgICAgICAgICAvLyBkcmF3IGlubmVyIGJvcmRlcgorICAgICAgICAgIHJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsIDAuNWYpOworICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMjU1LCAyNTUsIDI1NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7CisKKyAgICAgICAgICBpZiAoSXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIC8vIGRyYXcgc2hhZG93IGVmZmVjdAorCisgICAgICAgICAgICBDUERGX1BvaW50IHB0VG9wID0gQ1BERl9Qb2ludChyZWN0V25kLmxlZnQsIHJlY3RXbmQudG9wIC0gMS4wZik7CisgICAgICAgICAgICBDUERGX1BvaW50IHB0Qm90dG9tID0KKyAgICAgICAgICAgICAgICBDUERGX1BvaW50KHJlY3RXbmQubGVmdCwgcmVjdFduZC5ib3R0b20gKyAxLjBmKTsKKworICAgICAgICAgICAgcHRUb3AueCArPSAxLjVmOworICAgICAgICAgICAgcHRCb3R0b20ueCArPSAxLjVmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMjEwLCAyMTAsIDIxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKworICAgICAgICAgICAgcHRUb3AueCArPSAxLjBmOworICAgICAgICAgICAgcHRCb3R0b20ueCArPSAxLjBmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMjIwLCAyMjAsIDIyMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKworICAgICAgICAgICAgcHRUb3AueCArPSAxLjBmOworICAgICAgICAgICAgcHRCb3R0b20ueCArPSAxLjBmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMjQwLCAyNDAsIDI0MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKworICAgICAgICAgICAgcHRUb3AueCArPSAxLjBmOworICAgICAgICAgICAgcHRCb3R0b20ueCArPSAxLjBmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMjQwLCAyNDAsIDI0MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKworICAgICAgICAgICAgcHRUb3AueCArPSAxLjBmOworICAgICAgICAgICAgcHRCb3R0b20ueCArPSAxLjBmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMjEwLCAyMTAsIDIxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKworICAgICAgICAgICAgcHRUb3AueCArPSAxLjBmOworICAgICAgICAgICAgcHRCb3R0b20ueCArPSAxLjBmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMTgwLCAxODAsIDE4MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKworICAgICAgICAgICAgcHRUb3AueCArPSAxLjBmOworICAgICAgICAgICAgcHRCb3R0b20ueCArPSAxLjBmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMTUwLCAxNTAsIDE1MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKworICAgICAgICAgICAgcHRUb3AueCArPSAxLjBmOworICAgICAgICAgICAgcHRCb3R0b20ueCArPSAxLjBmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMTUwLCAxNTAsIDE1MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKworICAgICAgICAgICAgcHRUb3AueCArPSAxLjBmOworICAgICAgICAgICAgcHRCb3R0b20ueCArPSAxLjBmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMTgwLCAxODAsIDE4MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKworICAgICAgICAgICAgcHRUb3AueCArPSAxLjBmOworICAgICAgICAgICAgcHRCb3R0b20ueCArPSAxLjBmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMjEwLCAyMTAsIDIxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gZHJhdyBmcmljdGlvbgorCisgICAgICAgICAgaWYgKHJlY3RXbmQuSGVpZ2h0KCkgPiA4LjBmKSB7CisgICAgICAgICAgICBGWF9DT0xPUlJFRiBjclN0cm9rZSA9IEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMTIwLCAxMjAsIDEyMCk7CisgICAgICAgICAgICBpZiAoIUlzRW5hYmxlZCgpKQorICAgICAgICAgICAgICBjclN0cm9rZSA9IENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKAorICAgICAgICAgICAgICAgICAgUFdMX0RFRkFVTFRfSEVBVllHUkFZQ09MT1IsIDI1NSk7CisKKyAgICAgICAgICAgIEZYX0ZMT0FUIG5GcmljdGlvbldpZHRoID0gNS4wZjsKKyAgICAgICAgICAgIEZYX0ZMT0FUIG5GcmljdGlvbkhlaWdodCA9IDUuNWY7CisKKyAgICAgICAgICAgIENQREZfUG9pbnQgcHRMZWZ0ID0KKyAgICAgICAgICAgICAgICBDUERGX1BvaW50KHB0Q2VudGVyLnggLSBuRnJpY3Rpb25XaWR0aCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0gbkZyaWN0aW9uSGVpZ2h0IC8gMi4wZiArIDAuNWYpOworICAgICAgICAgICAgQ1BERl9Qb2ludCBwdFJpZ2h0ID0KKyAgICAgICAgICAgICAgICBDUERGX1BvaW50KHB0Q2VudGVyLnggKyBuRnJpY3Rpb25XaWR0aCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0gbkZyaWN0aW9uSGVpZ2h0IC8gMi4wZiArIDAuNWYpOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0TGVmdCwgcHRSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyU3Ryb2tlLCAxLjBmKTsKKworICAgICAgICAgICAgcHRMZWZ0LnkgKz0gMi4wZjsKKyAgICAgICAgICAgIHB0UmlnaHQueSArPSAyLjBmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0TGVmdCwgcHRSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyU3Ryb2tlLCAxLjBmKTsKKworICAgICAgICAgICAgcHRMZWZ0LnkgKz0gMi4wZjsKKyAgICAgICAgICAgIHB0UmlnaHQueSArPSAyLjBmOworCisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0TGVmdCwgcHRSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyU3Ryb2tlLCAxLjBmKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIHB0TGVmdC55ICs9IDEuNWY7CisgICAgICAgICAgICBwdFJpZ2h0LnkgKz0gMS41ZjsKKworICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdExlZnQsIHB0UmlnaHQsCisgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxNTAsMTUwLDE1MCksMS4wZik7CisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLXZvaWQgQ1BXTF9TQkJ1dHRvbjo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCi17Ci0JaWYgKCFJc1Zpc2libGUoKSkgcmV0dXJuOworRlhfQk9PTCBDUFdMX1NCQnV0dG9uOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOwogCi0JQ1BERl9SZWN0IHJlY3RXbmQgPSBHZXRXaW5kb3dSZWN0KCk7Ci0JaWYgKHJlY3RXbmQuSXNFbXB0eSgpKSByZXR1cm47CisgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQorICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9MQlVUVE9ORE9XTiwgMCwgKGludHB0cl90KSZwb2ludCk7CiAKLQlDUERGX1BvaW50IHB0Q2VudGVyID0gR2V0Q2VudGVyUG9pbnQoKTsKLQlpbnQzMl90IG5UcmFuc3BhcmFuY3kgPSBHZXRUcmFuc3BhcmVuY3koKTsKKyAgbV9iTW91c2VEb3duID0gVFJVRTsKKyAgU2V0Q2FwdHVyZSgpOwogCi0Jc3dpdGNoIChtX2VTY3JvbGxCYXJUeXBlKQotCXsKLQljYXNlIFNCVF9IU0NST0xMOgotCQlDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UscFVzZXIyRGV2aWNlKTsKLQkJc3dpdGNoIChtX2VTQkJ1dHRvblR5cGUpCi0JCXsKLQkJY2FzZSBQU0JUX01JTjoKLQkJCXsKLQkJCQlDUERGX1BvaW50IHB0MShwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLHB0Q2VudGVyLnkpOwotCQkJCUNQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYscHRDZW50ZXIueSArIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKLQkJCQlDUERGX1BvaW50IHB0MyhwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLHB0Q2VudGVyLnkgLSBQV0xfVFJJQU5HTEVfSEFMRkxFTik7Ci0KLQkJCQlpZiAocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICogMiAmJgotCQkJCQlyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKQotCQkJCXsKLQkJCQkJQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0KLQkJCQkJcGF0aC5TZXRQb2ludENvdW50KDQpOwotCQkJCQlwYXRoLlNldFBvaW50KDAsIHB0MS54LCBwdDEueSwgRlhQVF9NT1ZFVE8pOwotCQkJCQlwYXRoLlNldFBvaW50KDEsIHB0Mi54LCBwdDIueSwgRlhQVF9MSU5FVE8pOwotCQkJCQlwYXRoLlNldFBvaW50KDIsIHB0My54LCBwdDMueSwgRlhQVF9MSU5FVE8pOwotCQkJCQlwYXRoLlNldFBvaW50KDMsIHB0MS54LCBwdDEueSwgRlhQVF9MSU5FVE8pOwotCi0JCQkJCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsIE5VTEwsCi0JCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihQV0xfREVGQVVMVF9CTEFDS0NPTE9SLG5UcmFuc3BhcmFuY3kpLAotCQkJCQkJMCwgRlhGSUxMX0FMVEVSTkFURSk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUFNCVF9NQVg6Ci0JCQl7Ci0JCQkJQ1BERl9Qb2ludCBwdDEocHRDZW50ZXIueCArIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZixwdENlbnRlci55KTsKLQkJCQlDUERGX1BvaW50IHB0MihwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTik7Ci0JCQkJQ1BERl9Qb2ludCBwdDMocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZixwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4pOwotCi0JCQkJaWYgKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQgPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDIgJiYKLQkJCQkJcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICkKLQkJCQl7Ci0JCQkJCUNGWF9QYXRoRGF0YSBwYXRoOwotCi0JCQkJCXBhdGguU2V0UG9pbnRDb3VudCg0KTsKLQkJCQkJcGF0aC5TZXRQb2ludCgwLCBwdDEueCwgcHQxLnksIEZYUFRfTU9WRVRPKTsKLQkJCQkJcGF0aC5TZXRQb2ludCgxLCBwdDIueCwgcHQyLnksIEZYUFRfTElORVRPKTsKLQkJCQkJcGF0aC5TZXRQb2ludCgyLCBwdDMueCwgcHQzLnksIEZYUFRfTElORVRPKTsKLQkJCQkJcGF0aC5TZXRQb2ludCgzLCBwdDEueCwgcHQxLnksIEZYUFRfTElORVRPKTsKLQotCQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLAotCQkJCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUixuVHJhbnNwYXJhbmN5KSwKLQkJCQkJCTAsIEZYRklMTF9BTFRFUk5BVEUpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTQlRfVlNDUk9MTDoKLQkJc3dpdGNoIChtX2VTQkJ1dHRvblR5cGUpCi0JCXsKLQkJY2FzZSBQU0JUX01JTjoKLQkJCXsKLQkJCQkvL2RyYXcgYm9yZGVyCi0JCQkJQ1BERl9SZWN0IHJjRHJhdyA9IHJlY3RXbmQ7Ci0JCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsCi0JCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxMDAsMTAwLDEwMCksMC4wZik7Ci0KLQkJCQkvL2RyYXcgaW5uZXIgYm9yZGVyCi0JCQkJcmNEcmF3ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdFduZCwwLjVmKTsKLQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKLQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDI1NSwyNTUsMjU1KSwxLjBmKTsKLQotCQkJCS8vZHJhdyBiYWNrZ3JvdW5kCi0KLQkJCQlyY0RyYXcgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0V25kLDEuMGYpOwotCi0JCQkJaWYgKElzRW5hYmxlZCgpKQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U2hhZG93KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgVFJVRSwgRkFMU0UsIHJjRHJhdywgblRyYW5zcGFyYW5jeSwgODAsIDIyMCk7Ci0JCQkJZWxzZQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsIEFyZ2JFbmNvZGUoMjU1LDI1NSwyNTUsMjU1KSk7Ci0KLQkJCQkvL2RyYXcgYXJyb3cKLQotCQkJCWlmIChyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4gNi4wZiApCi0JCQkJewotCQkJCQlGWF9GTE9BVCBmWCA9IHJlY3RXbmQubGVmdCArIDEuNWY7Ci0JCQkJCUZYX0ZMT0FUIGZZID0gcmVjdFduZC5ib3R0b207Ci0JCQkJCUNQREZfUG9pbnQgcHRzWzddID0gewotCQkJCQkJCQlDUERGX1BvaW50KGZYKzIuNWYsIGZZKzQuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzIuNWYsIGZZKzMuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzQuNWYsIGZZKzUuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzYuNWYsIGZZKzMuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzYuNWYsIGZZKzQuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzQuNWYsIGZZKzYuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzIuNWYsIGZZKzQuMGYpfTsKLQotCi0JCQkJCWlmIChJc0VuYWJsZWQoKSkKLQkJCQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsQXJlYShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0cywgNywgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDI1NSwyNTUsMjU1KSk7Ci0JCQkJCWVsc2UKLQkJCQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsQXJlYShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0cywgNywKLQkJCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihQV0xfREVGQVVMVF9IRUFWWUdSQVlDT0xPUiwyNTUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQU0JUX01BWDoKLQkJCXsKLQkJCQkvL2RyYXcgYm9yZGVyCi0JCQkJQ1BERl9SZWN0IHJjRHJhdyA9IHJlY3RXbmQ7Ci0JCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsCi0JCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxMDAsMTAwLDEwMCksMC4wZik7Ci0KLQkJCQkvL2RyYXcgaW5uZXIgYm9yZGVyCi0JCQkJcmNEcmF3ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdFduZCwwLjVmKTsKLQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKLQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDI1NSwyNTUsMjU1KSwxLjBmKTsKLQotCQkJCS8vZHJhdyBiYWNrZ3JvdW5kCi0JCQkJcmNEcmF3ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdFduZCwxLjBmKTsKLQkJCQlpZiAoSXNFbmFibGVkKCkpCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTaGFkb3cocERldmljZSwgcFVzZXIyRGV2aWNlLCBUUlVFLCBGQUxTRSwgcmNEcmF3LCBuVHJhbnNwYXJhbmN5LCA4MCwgMjIwKTsKLQkJCQllbHNlCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywgQXJnYkVuY29kZSgyNTUsMjU1LDI1NSwyNTUpKTsKLQotCQkJCS8vZHJhdyBhcnJvdwotCi0JCQkJaWYgKHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiA2LjBmICkKLQkJCQl7Ci0JCQkJCUZYX0ZMT0FUIGZYID0gcmVjdFduZC5sZWZ0ICsgMS41ZjsKLQkJCQkJRlhfRkxPQVQgZlkgPSByZWN0V25kLmJvdHRvbTsKLQotCQkJCQlDUERGX1BvaW50IHB0c1s3XSA9IHsKLQkJCQkJCQkJQ1BERl9Qb2ludChmWCsyLjVmLCBmWSs1LjBmKSwKLQkJCQkJCQkJQ1BERl9Qb2ludChmWCsyLjVmLCBmWSs2LjBmKSwKLQkJCQkJCQkJQ1BERl9Qb2ludChmWCs0LjVmLCBmWSs0LjBmKSwKLQkJCQkJCQkJQ1BERl9Qb2ludChmWCs2LjVmLCBmWSs2LjBmKSwKLQkJCQkJCQkJQ1BERl9Qb2ludChmWCs2LjVmLCBmWSs1LjBmKSwKLQkJCQkJCQkJQ1BERl9Qb2ludChmWCs0LjVmLCBmWSszLjBmKSwKLQkJCQkJCQkJQ1BERl9Qb2ludChmWCsyLjVmLCBmWSs1LjBmKX07Ci0KLQotCQkJCQlpZiAoSXNFbmFibGVkKCkpCi0JCQkJCQlDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdHMsIDcsIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwyNTUsMjU1LDI1NSkpOwotCQkJCQllbHNlCi0JCQkJCQlDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdHMsIDcsCi0JCQkJCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfSEVBVllHUkFZQ09MT1IsMjU1KSk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUFNCVF9QT1M6Ci0JCQl7Ci0JCQkJLy9DUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UscFVzZXIyRGV2aWNlKTsKLQotCQkJCS8vZHJhdyBib3JkZXIKLQkJCQlDUERGX1JlY3QgcmNEcmF3ID0gcmVjdFduZDsKLQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKLQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDEwMCwxMDAsMTAwKSwwLjBmKTsKLQotCQkJCS8vZHJhdyBpbm5lciBib3JkZXIKLQkJCQlyY0RyYXcgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0V25kLDAuNWYpOwotCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAotCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjU1LDI1NSwyNTUpLDEuMGYpOwotCi0JCQkJaWYgKElzRW5hYmxlZCgpKQotCQkJCXsKLQkJCQkJLy9kcmF3IHNoYWRvdyBlZmZlY3QKLQotCQkJCQlDUERGX1BvaW50IHB0VG9wID0gQ1BERl9Qb2ludChyZWN0V25kLmxlZnQscmVjdFduZC50b3AtMS4wZik7Ci0JCQkJCUNQREZfUG9pbnQgcHRCb3R0b20gPSBDUERGX1BvaW50KHJlY3RXbmQubGVmdCxyZWN0V25kLmJvdHRvbSsxLjBmKTsKLQotCQkJCQlwdFRvcC54ICs9IDEuNWY7Ci0JCQkJCXB0Qm90dG9tLnggKz0gMS41ZjsKLQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKLQkJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwyMTAsMjEwLDIxMCksMS4wZik7Ci0KLQkJCQkJcHRUb3AueCArPSAxLjBmOwotCQkJCQlwdEJvdHRvbS54ICs9IDEuMGY7Ci0KLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0JCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjIwLDIyMCwyMjApLDEuMGYpOwotCi0JCQkJCXB0VG9wLnggKz0gMS4wZjsKLQkJCQkJcHRCb3R0b20ueCArPSAxLjBmOwotCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAotCQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDI0MCwyNDAsMjQwKSwxLjBmKTsKLQotCQkJCQlwdFRvcC54ICs9IDEuMGY7Ci0JCQkJCXB0Qm90dG9tLnggKz0gMS4wZjsKLQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKLQkJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwyNDAsMjQwLDI0MCksMS4wZik7Ci0KLQkJCQkJcHRUb3AueCArPSAxLjBmOwotCQkJCQlwdEJvdHRvbS54ICs9IDEuMGY7Ci0KLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0JCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjEwLDIxMCwyMTApLDEuMGYpOwotCi0JCQkJCXB0VG9wLnggKz0gMS4wZjsKLQkJCQkJcHRCb3R0b20ueCArPSAxLjBmOwotCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAotCQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDE4MCwxODAsMTgwKSwxLjBmKTsKLQotCQkJCQlwdFRvcC54ICs9IDEuMGY7Ci0JCQkJCXB0Qm90dG9tLnggKz0gMS4wZjsKLQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKLQkJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxNTAsMTUwLDE1MCksMS4wZik7Ci0KLQkJCQkJcHRUb3AueCArPSAxLjBmOwotCQkJCQlwdEJvdHRvbS54ICs9IDEuMGY7Ci0KLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0JCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMTUwLDE1MCwxNTApLDEuMGYpOwotCi0JCQkJCXB0VG9wLnggKz0gMS4wZjsKLQkJCQkJcHRCb3R0b20ueCArPSAxLjBmOwotCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAotCQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDE4MCwxODAsMTgwKSwxLjBmKTsKLQotCQkJCQlwdFRvcC54ICs9IDEuMGY7Ci0JCQkJCXB0Qm90dG9tLnggKz0gMS4wZjsKLQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKLQkJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwyMTAsMjEwLDIxMCksMS4wZik7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywgQXJnYkVuY29kZSgyNTUsMjU1LDI1NSwyNTUpKTsKLQkJCQl9Ci0KLQkJCQkvL2RyYXcgZnJpY3Rpb24KLQotCQkJCWlmIChyZWN0V25kLkhlaWdodCgpID4gOC4wZikKLQkJCQl7Ci0JCQkJCUZYX0NPTE9SUkVGIGNyU3Ryb2tlID0gQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDEyMCwxMjAsMTIwKTsKLQkJCQkJaWYgKCFJc0VuYWJsZWQoKSkKLQkJCQkJCWNyU3Ryb2tlID0gQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfSEVBVllHUkFZQ09MT1IsMjU1KTsKLQotCQkJCQlGWF9GTE9BVCBuRnJpY3Rpb25XaWR0aCA9IDUuMGY7Ci0JCQkJCUZYX0ZMT0FUIG5GcmljdGlvbkhlaWdodCA9IDUuNWY7Ci0KLQkJCQkJQ1BERl9Qb2ludCBwdExlZnQgPSBDUERGX1BvaW50KHB0Q2VudGVyLnggLSBuRnJpY3Rpb25XaWR0aCAvIDIuMGYsIHB0Q2VudGVyLnkgLSBuRnJpY3Rpb25IZWlnaHQgLyAyLjBmICsgMC41Zik7Ci0JCQkJCUNQREZfUG9pbnQgcHRSaWdodCA9IENQREZfUG9pbnQocHRDZW50ZXIueCArIG5GcmljdGlvbldpZHRoIC8gMi4wZiwgcHRDZW50ZXIueSAtIG5GcmljdGlvbkhlaWdodCAvIDIuMGYgKyAwLjVmKTsKLQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0TGVmdCwgcHRSaWdodCwKLQkJCQkJCWNyU3Ryb2tlLDEuMGYpOwotCi0JCQkJCXB0TGVmdC55ICs9IDIuMGY7Ci0JCQkJCXB0UmlnaHQueSArPSAyLjBmOwotCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRMZWZ0LCBwdFJpZ2h0LAotCQkJCQkJY3JTdHJva2UsMS4wZik7Ci0KLQkJCQkJcHRMZWZ0LnkgKz0gMi4wZjsKLQkJCQkJcHRSaWdodC55ICs9IDIuMGY7Ci0KLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdExlZnQsIHB0UmlnaHQsCi0JCQkJCQljclN0cm9rZSwxLjBmKTsKLQotCQkJCQkvKgotCQkJCQlwdExlZnQueSArPSAxLjVmOwotCQkJCQlwdFJpZ2h0LnkgKz0gMS41ZjsKLQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0TGVmdCwgcHRSaWdodCwKLQkJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxNTAsMTUwLDE1MCksMS4wZik7Ci0JCQkJCQkqLwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDUFdMX1NCQnV0dG9uOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOworRlhfQk9PTCBDUFdMX1NCQnV0dG9uOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CiAKLQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCi0JCXBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsUE5NX0xCVVRUT05ET1dOLDAsKGludHB0cl90KSZwb2ludCk7CisgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQorICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9MQlVUVE9OVVAsIDAsIChpbnRwdHJfdCkmcG9pbnQpOwogCi0JbV9iTW91c2VEb3duID0gVFJVRTsKLQlTZXRDYXB0dXJlKCk7CisgIG1fYk1vdXNlRG93biA9IEZBTFNFOworICBSZWxlYXNlQ2FwdHVyZSgpOwogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LG5GbGFnKTsKK0ZYX0JPT0wgQ1BXTF9TQkJ1dHRvbjo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbk1vdXNlTW92ZShwb2ludCwgbkZsYWcpOwogCi0JaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQotCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9OVVAsMCwoaW50cHRyX3QpJnBvaW50KTsKKyAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fTU9VU0VNT1ZFLCAwLCAoaW50cHRyX3QpJnBvaW50KTsKIAotCW1fYk1vdXNlRG93biA9IEZBTFNFOwotCVJlbGVhc2VDYXB0dXJlKCk7CisgICAgLyoKKyAgICBpZiAobV9iTW91c2VEb3duICYmIChtX2VTQkJ1dHRvblR5cGUgPT0gUFNCVF9NSU4gfHwgbV9lU0JCdXR0b25UeXBlID09CisgICAgUFNCVF9NQVgpKQorICAgIHsKKyAgICAgICAgICAgIGlmCisgICAgKCFwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTixuRmxhZ3MsKGludHB0cl90KSZwb2ludCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgKi8KKyAgfQogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQV0xfU0JCdXR0b246Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTW91c2VNb3ZlKHBvaW50LG5GbGFnKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9TY3JvbGxCYXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKLQl7Ci0JCXBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsUE5NX01PVVNFTU9WRSwwLChpbnRwdHJfdCkmcG9pbnQpOworQ1BXTF9TY3JvbGxCYXI6OkNQV0xfU2Nyb2xsQmFyKFBXTF9TQ1JPTExCQVJfVFlQRSBzYlR5cGUpCisgICAgOiBtX3NiVHlwZShzYlR5cGUpLAorICAgICAgbV9wTWluQnV0dG9uKE5VTEwpLAorICAgICAgbV9wTWF4QnV0dG9uKE5VTEwpLAorICAgICAgbV9wUG9zQnV0dG9uKE5VTEwpLAorICAgICAgbV9iTW91c2VEb3duKEZBTFNFKSwKKyAgICAgIG1fYk1pbk9yTWF4KEZBTFNFKSwKKyAgICAgIG1fYk5vdGlmeUZvcmV2ZXIoVFJVRSkge30KIAotCQkvKgotCQlpZiAobV9iTW91c2VEb3duICYmIChtX2VTQkJ1dHRvblR5cGUgPT0gUFNCVF9NSU4gfHwgbV9lU0JCdXR0b25UeXBlID09IFBTQlRfTUFYKSkKLQkJewotCQkJaWYgKCFwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTixuRmxhZ3MsKGludHB0cl90KSZwb2ludCkpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCSovCi0JfQorQ1BXTF9TY3JvbGxCYXI6On5DUFdMX1Njcm9sbEJhcigpIHt9CiAKLQlyZXR1cm4gVFJVRTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfU2Nyb2xsQmFyOjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9TY3JvbGxCYXIiOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfU2Nyb2xsQmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ1BXTF9TY3JvbGxCYXI6OkNQV0xfU2Nyb2xsQmFyKFBXTF9TQ1JPTExCQVJfVFlQRSBzYlR5cGUpOgotCW1fc2JUeXBlKHNiVHlwZSksCi0JbV9wTWluQnV0dG9uKE5VTEwpLAotCW1fcE1heEJ1dHRvbihOVUxMKSwKLQltX3BQb3NCdXR0b24oTlVMTCksCi0JbV9iTW91c2VEb3duKEZBTFNFKSwKLQltX2JNaW5Pck1heChGQUxTRSksCi0JbV9iTm90aWZ5Rm9yZXZlcihUUlVFKQotewordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7CiB9CiAKLUNQV0xfU2Nyb2xsQmFyOjp+Q1BXTF9TY3JvbGxCYXIoKQotewordm9pZCBDUFdMX1Njcm9sbEJhcjo6UmVQb3NDaGlsZFduZCgpIHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICBDUERGX1JlY3QgcmNNaW5CdXR0b24sIHJjTWF4QnV0dG9uOworICBGWF9GTE9BVCBmQldpZHRoID0gMDsKKworICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgIGlmIChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgPgorICAgICAgICAgIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRIICogMiArIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIICsKKyAgICAgICAgICAgICAgMikgeworICAgICAgICByY01pbkJ1dHRvbiA9CisgICAgICAgICAgICBDUERGX1JlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKyBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCwgcmNDbGllbnQudG9wKTsKKyAgICAgICAgcmNNYXhCdXR0b24gPSBDUERGX1JlY3QocmNDbGllbnQucmlnaHQgLSBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQuYm90dG9tLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZCV2lkdGggPSAocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0IC0KKyAgICAgICAgICAgICAgICAgICBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSCAtIDIpIC8KKyAgICAgICAgICAgICAgICAgIDI7CisKKyAgICAgICAgaWYgKGZCV2lkdGggPiAwKSB7CisgICAgICAgICAgcmNNaW5CdXR0b24gPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKyBmQldpZHRoLCByY0NsaWVudC50b3ApOworICAgICAgICAgIHJjTWF4QnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LnJpZ2h0IC0gZkJXaWR0aCwgcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3ApOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBTZXRWaXNpYmxlKEZBTFNFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICBpZiAoSXNGbG9hdEJpZ2dlcihyY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCAqIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIICsgMikpIHsKKyAgICAgICAgcmNNaW5CdXR0b24gPQorICAgICAgICAgICAgQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LnRvcCAtIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3ApOworICAgICAgICByY01heEJ1dHRvbiA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20sIHJjQ2xpZW50LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20gKyBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmQldpZHRoID0gKHJjQ2xpZW50LnRvcCAtIHJjQ2xpZW50LmJvdHRvbSAtCisgICAgICAgICAgICAgICAgICAgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEggLSAyKSAvCisgICAgICAgICAgICAgICAgICAyOworCisgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKGZCV2lkdGgsIDApKSB7CisgICAgICAgICAgcmNNaW5CdXR0b24gPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQudG9wIC0gZkJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wKTsKKyAgICAgICAgICByY01heEJ1dHRvbiA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LmJvdHRvbSArIGZCV2lkdGgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBTZXRWaXNpYmxlKEZBTFNFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKG1fcE1pbkJ1dHRvbikKKyAgICBtX3BNaW5CdXR0b24tPk1vdmUocmNNaW5CdXR0b24sIFRSVUUsIEZBTFNFKTsKKyAgaWYgKG1fcE1heEJ1dHRvbikKKyAgICBtX3BNYXhCdXR0b24tPk1vdmUocmNNYXhCdXR0b24sIFRSVUUsIEZBTFNFKTsKKyAgTW92ZVBvc0J1dHRvbihGQUxTRSk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfU2Nyb2xsQmFyOjpHZXRDbGFzc05hbWUoKSBjb25zdAotewotCXJldHVybiAiQ1BXTF9TY3JvbGxCYXIiOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSB7CisgIENQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOworCisgIGlmIChJc1Zpc2libGUoKSAmJiAhcmVjdFduZC5Jc0VtcHR5KCkpIHsKKyAgICBDRlhfQnl0ZVRleHRCdWYgc0J1dHRvbjsKKworICAgIHNCdXR0b24gPDwgInFcbiI7CisgICAgc0J1dHRvbiA8PCAiMCB3XG4iCisgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCYWNrZ3JvdW5kQ29sb3IoKSwgVFJVRSk7CisgICAgc0J1dHRvbiA8PCByZWN0V25kLmxlZnQgPDwgIiAiIDw8IHJlY3RXbmQuYm90dG9tIDw8ICIgIgorICAgICAgICAgICAgPDwgcmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA8PCAiICIKKyAgICAgICAgICAgIDw8IHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPDwgIiByZSBiIFFcbiI7CisKKyAgICBzQXBwU3RyZWFtIDw8IHNCdXR0b247CisgIH0KIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JY3AuZUN1cnNvclR5cGUgPSBGWENUX0FSUk9XOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBDUERGX1JlY3QgcmVjdFduZCA9IEdldFdpbmRvd1JlY3QoKTsKKworICBpZiAoSXNWaXNpYmxlKCkgJiYgIXJlY3RXbmQuSXNFbXB0eSgpKSB7CisgICAgQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmVjdFduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0QmFja2dyb3VuZENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKTsKKworICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKAorICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsCisgICAgICAgIENQREZfUG9pbnQocmVjdFduZC5sZWZ0ICsgMi4wZiwgcmVjdFduZC50b3AgLSAyLjBmKSwKKyAgICAgICAgQ1BERl9Qb2ludChyZWN0V25kLmxlZnQgKyAyLjBmLCByZWN0V25kLmJvdHRvbSArIDIuMGYpLAorICAgICAgICBBcmdiRW5jb2RlKEdldFRyYW5zcGFyZW5jeSgpLCAxMDAsIDEwMCwgMTAwKSwgMS4wZik7CisKKyAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZSgKKyAgICAgICAgcERldmljZSwgcFVzZXIyRGV2aWNlLAorICAgICAgICBDUERGX1BvaW50KHJlY3RXbmQucmlnaHQgLSAyLjBmLCByZWN0V25kLnRvcCAtIDIuMGYpLAorICAgICAgICBDUERGX1BvaW50KHJlY3RXbmQucmlnaHQgLSAyLjBmLCByZWN0V25kLmJvdHRvbSArIDIuMGYpLAorICAgICAgICBBcmdiRW5jb2RlKEdldFRyYW5zcGFyZW5jeSgpLCAxMDAsIDEwMCwgMTAwKSwgMS4wZik7CisgIH0KIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6UmVQb3NDaGlsZFduZCgpCi17Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCUNQREZfUmVjdCByY01pbkJ1dHRvbixyY01heEJ1dHRvbjsKLQlGWF9GTE9BVCBmQldpZHRoID0gMDsKK0ZYX0JPT0wgQ1BXTF9TY3JvbGxCYXI6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7CiAKLQlzd2l0Y2ggKG1fc2JUeXBlKQotCXsKLQljYXNlIFNCVF9IU0NST0xMOgotCQlpZiAocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0ID4gUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEggKiAyICsgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEggKyAyKQotCQl7Ci0JCQlyY01pbkJ1dHRvbiA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LHJjQ2xpZW50LmJvdHRvbSwKLQkJCQlyY0NsaWVudC5sZWZ0ICsgUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgscmNDbGllbnQudG9wKTsKLQkJCXJjTWF4QnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LnJpZ2h0IC0gUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgscmNDbGllbnQuYm90dG9tLAotCQkJCXJjQ2xpZW50LnJpZ2h0LHJjQ2xpZW50LnRvcCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmQldpZHRoID0gKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCAtIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIIC0gMikgLyAyOworICBpZiAoSGFzRmxhZyhQV1NfQVVUT1RSQU5TUEFSRU5UKSkgeworICAgIGlmIChHZXRUcmFuc3BhcmVuY3koKSAhPSAyNTUpIHsKKyAgICAgIFNldFRyYW5zcGFyZW5jeSgyNTUpOworICAgICAgSW52YWxpZGF0ZVJlY3QoKTsKKyAgICB9CisgIH0KIAotCQkJaWYgKGZCV2lkdGggPiAwKQotCQkJewotCQkJCXJjTWluQnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQscmNDbGllbnQuYm90dG9tLAotCQkJCQlyY0NsaWVudC5sZWZ0ICsgZkJXaWR0aCxyY0NsaWVudC50b3ApOwotCQkJCXJjTWF4QnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LnJpZ2h0IC0gZkJXaWR0aCxyY0NsaWVudC5ib3R0b20sCi0JCQkJCXJjQ2xpZW50LnJpZ2h0LHJjQ2xpZW50LnRvcCk7Ci0JCQl9Ci0JCQllbHNlIFNldFZpc2libGUoRkFMU0UpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCWlmIChJc0Zsb2F0QmlnZ2VyKHJjQ2xpZW50LnRvcCAtIHJjQ2xpZW50LmJvdHRvbSwgUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEggKiAyICsgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEggKyAyKSkKLQkJewotCQkJcmNNaW5CdXR0b24gPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCxyY0NsaWVudC50b3AgLSBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCwKLQkJCQlyY0NsaWVudC5yaWdodCxyY0NsaWVudC50b3ApOwotCQkJcmNNYXhCdXR0b24gPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCxyY0NsaWVudC5ib3R0b20sCi0JCQkJcmNDbGllbnQucmlnaHQscmNDbGllbnQuYm90dG9tICsgUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZkJXaWR0aCA9IChyY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20gLSBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSCAtIDIpIC8gMjsKKyAgQ1BERl9SZWN0IHJjTWluQXJlYSwgcmNNYXhBcmVhOwogCi0JCQlpZiAoSXNGbG9hdEJpZ2dlcihmQldpZHRoLCAwKSkKLQkJCXsKLQkJCQlyY01pbkJ1dHRvbiA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LHJjQ2xpZW50LnRvcCAtIGZCV2lkdGgsCi0JCQkJCXJjQ2xpZW50LnJpZ2h0LHJjQ2xpZW50LnRvcCk7Ci0JCQkJcmNNYXhCdXR0b24gPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCxyY0NsaWVudC5ib3R0b20sCi0JCQkJCXJjQ2xpZW50LnJpZ2h0LHJjQ2xpZW50LmJvdHRvbSArIGZCV2lkdGgpOwotCQkJfQotCQkJZWxzZSBTZXRWaXNpYmxlKEZBTFNFKTsKLQkJfQotCQlicmVhazsKLQl9CisgIGlmIChtX3BQb3NCdXR0b24gJiYgbV9wUG9zQnV0dG9uLT5Jc1Zpc2libGUoKSkgeworICAgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNQb3NCdXR0b24gPSBtX3BQb3NCdXR0b24tPkdldFdpbmRvd1JlY3QoKTsKIAotICAgIGlmIChtX3BNaW5CdXR0b24pCi0gICAgICAgIG1fcE1pbkJ1dHRvbi0+TW92ZShyY01pbkJ1dHRvbiwgVFJVRSwgRkFMU0UpOwotICAgIGlmIChtX3BNYXhCdXR0b24pCi0gICAgICAgIG1fcE1heEJ1dHRvbi0+TW92ZShyY01heEJ1dHRvbiwgVFJVRSwgRkFMU0UpOwotICAgIE1vdmVQb3NCdXR0b24oRkFMU0UpOworICAgIHN3aXRjaCAobV9zYlR5cGUpIHsKKyAgICAgIGNhc2UgU0JUX0hTQ1JPTEw6CisgICAgICAgIHJjTWluQXJlYSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0ICsgUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20sIHJjUG9zQnV0dG9uLmxlZnQsIHJjQ2xpZW50LnRvcCk7CisgICAgICAgIHJjTWF4QXJlYSA9IENQREZfUmVjdChyY1Bvc0J1dHRvbi5yaWdodCwgcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQucmlnaHQgLSBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnRvcCk7CisKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgICByY01pbkFyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCwgcmNQb3NCdXR0b24udG9wLCByY0NsaWVudC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnRvcCAtIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRIKTsKKyAgICAgICAgcmNNYXhBcmVhID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20gKyBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY1Bvc0J1dHRvbi5ib3R0b20pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByY01pbkFyZWEuTm9ybWFsaXplKCk7CisgICAgcmNNYXhBcmVhLk5vcm1hbGl6ZSgpOworCisgICAgaWYgKHJjTWluQXJlYS5Db250YWlucyhwb2ludC54LCBwb2ludC55KSkgeworICAgICAgbV9zRGF0YS5TdWJCaWcoKTsKKyAgICAgIE1vdmVQb3NCdXR0b24oVFJVRSk7CisgICAgICBOb3RpZnlTY3JvbGxXaW5kb3coKTsKKyAgICB9CisKKyAgICBpZiAocmNNYXhBcmVhLkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKSB7CisgICAgICBtX3NEYXRhLkFkZEJpZygpOworICAgICAgTW92ZVBvc0J1dHRvbihUUlVFKTsKKyAgICAgIE5vdGlmeVNjcm9sbFdpbmRvdygpOworICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKQotewotCUNQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOworRlhfQk9PTCBDUFdMX1Njcm9sbEJhcjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCwgbkZsYWcpOwogCi0JaWYgKElzVmlzaWJsZSgpICYmICFyZWN0V25kLklzRW1wdHkoKSkKLQl7Ci0JCUNGWF9CeXRlVGV4dEJ1ZiBzQnV0dG9uOworICBpZiAoSGFzRmxhZyhQV1NfQVVUT1RSQU5TUEFSRU5UKSkgeworICAgIGlmIChHZXRUcmFuc3BhcmVuY3koKSAhPSBQV0xfU0NST0xMQkFSX1RSQU5TUEFSQU5DWSkgeworICAgICAgU2V0VHJhbnNwYXJlbmN5KFBXTF9TQ1JPTExCQVJfVFJBTlNQQVJBTkNZKTsKKyAgICAgIEludmFsaWRhdGVSZWN0KCk7CisgICAgfQorICB9CiAKLQkJc0J1dHRvbiA8PCAicVxuIjsKLQkJc0J1dHRvbiA8PCAiMCB3XG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJhY2tncm91bmRDb2xvcigpLFRSVUUpOwotCQlzQnV0dG9uIDw8IHJlY3RXbmQubGVmdCA8PCAiICIgPDwgcmVjdFduZC5ib3R0b20gPDwgIiAiCi0JCQkJPDwgcmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA8PCAiICIgPDwgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA8PCAiIHJlIGIgUVxuIjsKKyAgRW5kVGltZXIoKTsKKyAgbV9iTW91c2VEb3duID0gRkFMU0U7CiAKLQkJc0FwcFN0cmVhbSA8PCBzQnV0dG9uOwotCX0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0pIHsKKyAgQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwogCi0JaWYgKElzVmlzaWJsZSgpICYmICFyZWN0V25kLklzRW1wdHkoKSkKLQl7Ci0JCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJlY3RXbmQsIEdldEJhY2tncm91bmRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSk7CisgIHN3aXRjaCAobXNnKSB7CisgICAgY2FzZSBQTk1fTEJVVFRPTkRPV046CisgICAgICBpZiAocFduZCA9PSBtX3BNaW5CdXR0b24pIHsKKyAgICAgICAgT25NaW5CdXR0b25MQkRvd24oKihDUERGX1BvaW50KilsUGFyYW0pOworICAgICAgfQogCi0JCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwKLQkJCUNQREZfUG9pbnQocmVjdFduZC5sZWZ0KzIuMGYscmVjdFduZC50b3AtMi4wZiksIENQREZfUG9pbnQocmVjdFduZC5sZWZ0KzIuMGYscmVjdFduZC5ib3R0b20rMi4wZiksCi0JCQlBcmdiRW5jb2RlKEdldFRyYW5zcGFyZW5jeSgpLCAxMDAsIDEwMCwgMTAwKSwgMS4wZik7CisgICAgICBpZiAocFduZCA9PSBtX3BNYXhCdXR0b24pIHsKKyAgICAgICAgT25NYXhCdXR0b25MQkRvd24oKihDUERGX1BvaW50KilsUGFyYW0pOworICAgICAgfQogCi0JCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwKLQkJCUNQREZfUG9pbnQocmVjdFduZC5yaWdodC0yLjBmLHJlY3RXbmQudG9wLTIuMGYpLCBDUERGX1BvaW50KHJlY3RXbmQucmlnaHQtMi4wZixyZWN0V25kLmJvdHRvbSsyLjBmKSwKLQkJCUFyZ2JFbmNvZGUoR2V0VHJhbnNwYXJlbmN5KCksIDEwMCwgMTAwLCAxMDApLDEuMGYpOwotCX0KKyAgICAgIGlmIChwV25kID09IG1fcFBvc0J1dHRvbikgeworICAgICAgICBPblBvc0J1dHRvbkxCRG93bigqKENQREZfUG9pbnQqKWxQYXJhbSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBOTV9MQlVUVE9OVVA6CisgICAgICBpZiAocFduZCA9PSBtX3BNaW5CdXR0b24pIHsKKyAgICAgICAgT25NaW5CdXR0b25MQlVwKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBXbmQgPT0gbV9wTWF4QnV0dG9uKSB7CisgICAgICAgIE9uTWF4QnV0dG9uTEJVcCgqKENQREZfUG9pbnQqKWxQYXJhbSk7CisgICAgICB9CisKKyAgICAgIGlmIChwV25kID09IG1fcFBvc0J1dHRvbikgeworICAgICAgICBPblBvc0J1dHRvbkxCVXAoKihDUERGX1BvaW50KilsUGFyYW0pOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQTk1fTU9VU0VNT1ZFOgorICAgICAgaWYgKHBXbmQgPT0gbV9wTWluQnV0dG9uKSB7CisgICAgICAgIE9uTWluQnV0dG9uTW91c2VNb3ZlKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBXbmQgPT0gbV9wTWF4QnV0dG9uKSB7CisgICAgICAgIE9uTWF4QnV0dG9uTW91c2VNb3ZlKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBXbmQgPT0gbV9wUG9zQnV0dG9uKSB7CisgICAgICAgIE9uUG9zQnV0dG9uTW91c2VNb3ZlKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUE5NX1NFVFNDUk9MTElORk86IHsKKyAgICAgIGlmIChQV0xfU0NST0xMX0lORk8qIHBJbmZvID0gKFBXTF9TQ1JPTExfSU5GTyopbFBhcmFtKSB7CisgICAgICAgIGlmIChGWFNZU19tZW1jbXAoJm1fT3JpZ2luSW5mbywgcEluZm8sIHNpemVvZihQV0xfU0NST0xMX0lORk8pKSAhPSAwKSB7CisgICAgICAgICAgbV9PcmlnaW5JbmZvID0gKnBJbmZvOworICAgICAgICAgIEZYX0ZMT0FUIGZNYXggPQorICAgICAgICAgICAgICBwSW5mby0+ZkNvbnRlbnRNYXggLSBwSW5mby0+ZkNvbnRlbnRNaW4gLSBwSW5mby0+ZlBsYXRlV2lkdGg7CisgICAgICAgICAgZk1heCA9IGZNYXggPiAwLjBmID8gZk1heCA6IDAuMGY7CisgICAgICAgICAgU2V0U2Nyb2xsUmFuZ2UoMCwgZk1heCwgcEluZm8tPmZQbGF0ZVdpZHRoKTsKKyAgICAgICAgICBTZXRTY3JvbGxTdGVwKHBJbmZvLT5mQmlnU3RlcCwgcEluZm8tPmZTbWFsbFN0ZXApOworICAgICAgICB9CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIFBOTV9TRVRTQ1JPTExQT1M6IHsKKyAgICAgIEZYX0ZMT0FUIGZQb3MgPSAqKEZYX0ZMT0FUKilsUGFyYW07CisgICAgICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgICAgIGNhc2UgU0JUX0hTQ1JPTEw6CisgICAgICAgICAgZlBvcyA9IGZQb3MgLSBtX09yaWdpbkluZm8uZkNvbnRlbnRNaW47CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICAgICAgZlBvcyA9IG1fT3JpZ2luSW5mby5mQ29udGVudE1heCAtIGZQb3M7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBTZXRTY3JvbGxQb3MoZlBvcyk7CisgICAgfSBicmVhazsKKyAgfQogfQogCi1GWF9CT09MIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6Q3JlYXRlQnV0dG9ucyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIFBXTF9DUkVBVEVQQVJBTSBzY3AgPSBjcDsKKyAgc2NwLnBQYXJlbnRXbmQgPSB0aGlzOworICBzY3AuZHdCb3JkZXJXaWR0aCA9IDI7CisgIHNjcC5uQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKIAotCWlmIChIYXNGbGFnKFBXU19BVVRPVFJBTlNQQVJFTlQpKQotCXsKLQkJaWYgKEdldFRyYW5zcGFyZW5jeSgpICE9IDI1NSkKLQkJewotCQkJU2V0VHJhbnNwYXJlbmN5KDI1NSk7Ci0JCQlJbnZhbGlkYXRlUmVjdCgpOwotCQl9Ci0JfQorICBzY3AuZHdGbGFncyA9CisgICAgICBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBXU19CT1JERVIgfCBQV1NfQkFDS0dST1VORCB8IFBXU19OT1JFRlJFU0hDTElQOwogCi0JQ1BERl9SZWN0IHJjTWluQXJlYSxyY01heEFyZWE7CisgIGlmICghbV9wTWluQnV0dG9uKSB7CisgICAgbV9wTWluQnV0dG9uID0gbmV3IENQV0xfU0JCdXR0b24obV9zYlR5cGUsIFBTQlRfTUlOKTsKKyAgICBtX3BNaW5CdXR0b24tPkNyZWF0ZShzY3ApOworICB9CiAKLQlpZiAobV9wUG9zQnV0dG9uICYmIG1fcFBvc0J1dHRvbi0+SXNWaXNpYmxlKCkpCi0JewotCQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0JCUNQREZfUmVjdCByY1Bvc0J1dHRvbiA9IG1fcFBvc0J1dHRvbi0+R2V0V2luZG93UmVjdCgpOworICBpZiAoIW1fcE1heEJ1dHRvbikgeworICAgIG1fcE1heEJ1dHRvbiA9IG5ldyBDUFdMX1NCQnV0dG9uKG1fc2JUeXBlLCBQU0JUX01BWCk7CisgICAgbV9wTWF4QnV0dG9uLT5DcmVhdGUoc2NwKTsKKyAgfQogCi0JCXN3aXRjaCAobV9zYlR5cGUpCi0JCXsKLQkJY2FzZSBTQlRfSFNDUk9MTDoKLQkJCXJjTWluQXJlYSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0ICsgUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgscmNDbGllbnQuYm90dG9tLAotCQkJCQkJCXJjUG9zQnV0dG9uLmxlZnQscmNDbGllbnQudG9wKTsKLQkJCXJjTWF4QXJlYSA9IENQREZfUmVjdChyY1Bvc0J1dHRvbi5yaWdodCxyY0NsaWVudC5ib3R0b20sCi0JCQkJCQkJcmNDbGllbnQucmlnaHQgLSBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCxyY0NsaWVudC50b3ApOwotCi0JCQlicmVhazsKLQkJY2FzZSBTQlRfVlNDUk9MTDoKLQkJCXJjTWluQXJlYSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LHJjUG9zQnV0dG9uLnRvcCwKLQkJCQkJCQlyY0NsaWVudC5yaWdodCxyY0NsaWVudC50b3AgLSBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCk7Ci0JCQlyY01heEFyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCxyY0NsaWVudC5ib3R0b20gKyBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCwKLQkJCQkJCQlyY0NsaWVudC5yaWdodCxyY1Bvc0J1dHRvbi5ib3R0b20pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyY01pbkFyZWEuTm9ybWFsaXplKCk7Ci0JCXJjTWF4QXJlYS5Ob3JtYWxpemUoKTsKLQotCQlpZiAocmNNaW5BcmVhLkNvbnRhaW5zKHBvaW50LngscG9pbnQueSkpCi0JCXsKLQkJCW1fc0RhdGEuU3ViQmlnKCk7Ci0JCQlNb3ZlUG9zQnV0dG9uKFRSVUUpOwotCQkJTm90aWZ5U2Nyb2xsV2luZG93KCk7Ci0JCX0KLQotCQlpZiAocmNNYXhBcmVhLkNvbnRhaW5zKHBvaW50LngscG9pbnQueSkpCi0JCXsKLQkJCW1fc0RhdGEuQWRkQmlnKCk7Ci0JCQlNb3ZlUG9zQnV0dG9uKFRSVUUpOwotCQkJTm90aWZ5U2Nyb2xsV2luZG93KCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gVFJVRTsKKyAgaWYgKCFtX3BQb3NCdXR0b24pIHsKKyAgICBtX3BQb3NCdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSwgUFNCVF9QT1MpOworICAgIG1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShGQUxTRSk7CisgICAgbV9wUG9zQnV0dG9uLT5DcmVhdGUoc2NwKTsKKyAgfQogfQogCi1GWF9CT09MIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCxuRmxhZyk7CitGWF9GTE9BVCBDUFdMX1Njcm9sbEJhcjo6R2V0U2Nyb2xsQmFyV2lkdGgoKSBjb25zdCB7CisgIGlmICghSXNWaXNpYmxlKCkpCisgICAgcmV0dXJuIDA7CiAKLQlpZiAoSGFzRmxhZyhQV1NfQVVUT1RSQU5TUEFSRU5UKSkKLQl7Ci0JCWlmIChHZXRUcmFuc3BhcmVuY3koKSAhPSBQV0xfU0NST0xMQkFSX1RSQU5TUEFSQU5DWSkKLQkJewotCQkJU2V0VHJhbnNwYXJlbmN5KFBXTF9TQ1JPTExCQVJfVFJBTlNQQVJBTkNZKTsKLQkJCUludmFsaWRhdGVSZWN0KCk7Ci0JCX0KLQl9Ci0KLQlFbmRUaW1lcigpOwotCW1fYk1vdXNlRG93biA9IEZBTFNFOwotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBQV0xfU0NST0xMQkFSX1dJRFRIOwogfQogCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0sIGludHB0cl90IGxQYXJhbSkKLXsKLQlDUFdMX1duZDo6T25Ob3RpZnkocFduZCxtc2csd1BhcmFtLGxQYXJhbSk7Cit2b2lkIENQV0xfU2Nyb2xsQmFyOjpTZXRTY3JvbGxSYW5nZShGWF9GTE9BVCBmTWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDbGllbnRXaWR0aCkgeworICBpZiAobV9wUG9zQnV0dG9uKSB7CisgICAgbV9zRGF0YS5TZXRTY3JvbGxSYW5nZShmTWluLCBmTWF4KTsKKyAgICBtX3NEYXRhLlNldENsaWVudFdpZHRoKGZDbGllbnRXaWR0aCk7CiAKLQlzd2l0Y2ggKG1zZykKLQl7Ci0JY2FzZSBQTk1fTEJVVFRPTkRPV046Ci0JCWlmIChwV25kID09IG1fcE1pbkJ1dHRvbikKLQkJewotCQkJT25NaW5CdXR0b25MQkRvd24oKihDUERGX1BvaW50KilsUGFyYW0pOwotCQl9Ci0KLQkJaWYgKHBXbmQgPT0gbV9wTWF4QnV0dG9uKQotCQl7Ci0JCQlPbk1heEJ1dHRvbkxCRG93bigqKENQREZfUG9pbnQqKWxQYXJhbSk7Ci0JCX0KLQotCQlpZiAocFduZCA9PSBtX3BQb3NCdXR0b24pCi0JCXsKLQkJCU9uUG9zQnV0dG9uTEJEb3duKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFBOTV9MQlVUVE9OVVA6Ci0JCWlmIChwV25kID09IG1fcE1pbkJ1dHRvbikKLQkJewotCQkJT25NaW5CdXR0b25MQlVwKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKLQkJfQotCi0JCWlmIChwV25kID09IG1fcE1heEJ1dHRvbikKLQkJewotCQkJT25NYXhCdXR0b25MQlVwKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKLQkJfQotCi0JCWlmIChwV25kID09IG1fcFBvc0J1dHRvbikKLQkJewotCQkJT25Qb3NCdXR0b25MQlVwKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFBOTV9NT1VTRU1PVkU6Ci0JCWlmIChwV25kID09IG1fcE1pbkJ1dHRvbikKLQkJewotCQkJT25NaW5CdXR0b25Nb3VzZU1vdmUoKihDUERGX1BvaW50KilsUGFyYW0pOwotCQl9Ci0KLQkJaWYgKHBXbmQgPT0gbV9wTWF4QnV0dG9uKQotCQl7Ci0JCQlPbk1heEJ1dHRvbk1vdXNlTW92ZSgqKENQREZfUG9pbnQqKWxQYXJhbSk7Ci0JCX0KLQotCQlpZiAocFduZCA9PSBtX3BQb3NCdXR0b24pCi0JCXsKLQkJCU9uUG9zQnV0dG9uTW91c2VNb3ZlKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFBOTV9TRVRTQ1JPTExJTkZPOgotCQl7Ci0JCQlpZiAoUFdMX1NDUk9MTF9JTkZPICogcEluZm8gPSAoUFdMX1NDUk9MTF9JTkZPKilsUGFyYW0pCi0JCQl7Ci0JCQkJaWYgKEZYU1lTX21lbWNtcCgmbV9PcmlnaW5JbmZvLCBwSW5mbywgc2l6ZW9mKFBXTF9TQ1JPTExfSU5GTykpICE9IDApCi0JCQkJewotCQkJCQltX09yaWdpbkluZm8gPSAqcEluZm87Ci0JCQkJCUZYX0ZMT0FUIGZNYXggPSBwSW5mby0+ZkNvbnRlbnRNYXggLSBwSW5mby0+ZkNvbnRlbnRNaW4gLSBwSW5mby0+ZlBsYXRlV2lkdGg7Ci0JCQkJCWZNYXggPSBmTWF4ID4gMC4wZiA/IGZNYXggOiAwLjBmOwotCQkJCQlTZXRTY3JvbGxSYW5nZSgwLCBmTWF4LCBwSW5mby0+ZlBsYXRlV2lkdGgpOwotCQkJCQlTZXRTY3JvbGxTdGVwKHBJbmZvLT5mQmlnU3RlcCwgcEluZm8tPmZTbWFsbFN0ZXApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIFBOTV9TRVRTQ1JPTExQT1M6Ci0JCXsKLQkJCUZYX0ZMT0FUIGZQb3MgPSAqKEZYX0ZMT0FUKilsUGFyYW07Ci0JCQlzd2l0Y2ggKG1fc2JUeXBlKQotCQkJewotCQkJY2FzZSBTQlRfSFNDUk9MTDoKLQkJCQlmUG9zID0gZlBvcyAtIG1fT3JpZ2luSW5mby5mQ29udGVudE1pbjsKLQkJCQlicmVhazsKLQkJCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCQkJZlBvcyA9IG1fT3JpZ2luSW5mby5mQ29udGVudE1heCAtIGZQb3M7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlTZXRTY3JvbGxQb3MoZlBvcyk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorICAgIGlmIChJc0Zsb2F0U21hbGxlcihtX3NEYXRhLlNjcm9sbFJhbmdlLkdldFdpZHRoKCksIDAuMGYpKSB7CisgICAgICBtX3BQb3NCdXR0b24tPlNldFZpc2libGUoRkFMU0UpOworICAgIH0gZWxzZSB7CisgICAgICBtX3BQb3NCdXR0b24tPlNldFZpc2libGUoVFJVRSk7CisgICAgICBNb3ZlUG9zQnV0dG9uKFRSVUUpOworICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpDcmVhdGVCdXR0b25zKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCVBXTF9DUkVBVEVQQVJBTQlzY3AgPSBjcDsKLQlzY3AucFBhcmVudFduZCA9IHRoaXM7Ci0Jc2NwLmR3Qm9yZGVyV2lkdGggPSAyOwotCXNjcC5uQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6OlNldFNjcm9sbFBvcyhGWF9GTE9BVCBmUG9zKSB7CisgIEZYX0ZMT0FUIGZPbGRQb3MgPSBtX3NEYXRhLmZTY3JvbGxQb3M7CiAKLQlzY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEIHwgUFdTX0JPUkRFUiB8IFBXU19CQUNLR1JPVU5EIHwgUFdTX05PUkVGUkVTSENMSVA7CisgIG1fc0RhdGEuU2V0UG9zKGZQb3MpOwogCi0JaWYgKCFtX3BNaW5CdXR0b24pCi0JewotCQltX3BNaW5CdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSxQU0JUX01JTik7Ci0JCW1fcE1pbkJ1dHRvbi0+Q3JlYXRlKHNjcCk7Ci0JfQotCi0JaWYgKCFtX3BNYXhCdXR0b24pCi0JewotCQltX3BNYXhCdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSxQU0JUX01BWCk7Ci0JCW1fcE1heEJ1dHRvbi0+Q3JlYXRlKHNjcCk7Ci0JfQotCi0JaWYgKCFtX3BQb3NCdXR0b24pCi0JewotCQltX3BQb3NCdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSxQU0JUX1BPUyk7Ci0JCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShGQUxTRSk7Ci0JCW1fcFBvc0J1dHRvbi0+Q3JlYXRlKHNjcCk7Ci0JfQorICBpZiAoIUlzRmxvYXRFcXVhbChtX3NEYXRhLmZTY3JvbGxQb3MsIGZPbGRQb3MpKQorICAgIE1vdmVQb3NCdXR0b24oVFJVRSk7CiB9CiAKLUZYX0ZMT0FUIENQV0xfU2Nyb2xsQmFyOjpHZXRTY3JvbGxCYXJXaWR0aCgpIGNvbnN0Ci17Ci0JaWYgKCFJc1Zpc2libGUoKSkgcmV0dXJuIDA7Ci0KLQlyZXR1cm4gUFdMX1NDUk9MTEJBUl9XSURUSDsKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6OlNldFNjcm9sbFN0ZXAoRlhfRkxPQVQgZkJpZ1N0ZXAsIEZYX0ZMT0FUIGZTbWFsbFN0ZXApIHsKKyAgbV9zRGF0YS5TZXRCaWdTdGVwKGZCaWdTdGVwKTsKKyAgbV9zRGF0YS5TZXRTbWFsbFN0ZXAoZlNtYWxsU3RlcCk7CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6OlNldFNjcm9sbFJhbmdlKEZYX0ZMT0FUIGZNaW4sRlhfRkxPQVQgZk1heCxGWF9GTE9BVCBmQ2xpZW50V2lkdGgpCi17Ci0JaWYgKG1fcFBvc0J1dHRvbikKLQl7Ci0JCW1fc0RhdGEuU2V0U2Nyb2xsUmFuZ2UoZk1pbixmTWF4KTsKLQkJbV9zRGF0YS5TZXRDbGllbnRXaWR0aChmQ2xpZW50V2lkdGgpOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6TW92ZVBvc0J1dHRvbihGWF9CT09MIGJSZWZyZXNoKSB7CisgIEFTU0VSVChtX3BQb3NCdXR0b24gIT0gTlVMTCk7CisgIEFTU0VSVChtX3BNaW5CdXR0b24gIT0gTlVMTCk7CisgIEFTU0VSVChtX3BNYXhCdXR0b24gIT0gTlVMTCk7CiAKLQkJaWYgKElzRmxvYXRTbWFsbGVyKG1fc0RhdGEuU2Nyb2xsUmFuZ2UuR2V0V2lkdGgoKSwgMC4wZikpCi0JCXsKLQkJCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShGQUxTRSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQltX3BQb3NCdXR0b24tPlNldFZpc2libGUoVFJVRSk7Ci0JCQlNb3ZlUG9zQnV0dG9uKFRSVUUpOwotCQl9Ci0JfQorICBpZiAobV9wUG9zQnV0dG9uLT5Jc1Zpc2libGUoKSkgeworICAgIENQREZfUmVjdCByY0NsaWVudDsKKyAgICBDUERGX1JlY3QgcmNQb3NBcmVhLCByY1Bvc0J1dHRvbjsKKworICAgIHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICAgIHJjUG9zQXJlYSA9IEdldFNjcm9sbEFyZWEoKTsKKworICAgIEZYX0ZMT0FUIGZMZWZ0LCBmUmlnaHQsIGZUb3AsIGZCb3R0b207CisKKyAgICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgICBmTGVmdCA9IFRydWVUb0ZhY2UobV9zRGF0YS5mU2Nyb2xsUG9zKTsKKyAgICAgICAgZlJpZ2h0ID0gVHJ1ZVRvRmFjZShtX3NEYXRhLmZTY3JvbGxQb3MgKyBtX3NEYXRhLmZDbGllbnRXaWR0aCk7CisKKyAgICAgICAgaWYgKGZSaWdodCAtIGZMZWZ0IDwgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEgpCisgICAgICAgICAgZlJpZ2h0ID0gZkxlZnQgKyBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSDsKKworICAgICAgICBpZiAoZlJpZ2h0ID4gcmNQb3NBcmVhLnJpZ2h0KSB7CisgICAgICAgICAgZlJpZ2h0ID0gcmNQb3NBcmVhLnJpZ2h0OworICAgICAgICAgIGZMZWZ0ID0gZlJpZ2h0IC0gUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEg7CisgICAgICAgIH0KKworICAgICAgICByY1Bvc0J1dHRvbiA9IENQREZfUmVjdChmTGVmdCwgcmNQb3NBcmVhLmJvdHRvbSwgZlJpZ2h0LCByY1Bvc0FyZWEudG9wKTsKKworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICAgIGZCb3R0b20gPSBUcnVlVG9GYWNlKG1fc0RhdGEuZlNjcm9sbFBvcyArIG1fc0RhdGEuZkNsaWVudFdpZHRoKTsKKyAgICAgICAgZlRvcCA9IFRydWVUb0ZhY2UobV9zRGF0YS5mU2Nyb2xsUG9zKTsKKworICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIoZlRvcCAtIGZCb3R0b20sIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIKSkKKyAgICAgICAgICBmQm90dG9tID0gZlRvcCAtIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIOworCisgICAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihmQm90dG9tLCByY1Bvc0FyZWEuYm90dG9tKSkgeworICAgICAgICAgIGZCb3R0b20gPSByY1Bvc0FyZWEuYm90dG9tOworICAgICAgICAgIGZUb3AgPSBmQm90dG9tICsgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEg7CisgICAgICAgIH0KKworICAgICAgICByY1Bvc0J1dHRvbiA9IENQREZfUmVjdChyY1Bvc0FyZWEubGVmdCwgZkJvdHRvbSwgcmNQb3NBcmVhLnJpZ2h0LCBmVG9wKTsKKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBtX3BQb3NCdXR0b24tPk1vdmUocmNQb3NCdXR0b24sIFRSVUUsIGJSZWZyZXNoKTsKKyAgfQogfQogCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpTZXRTY3JvbGxQb3MoRlhfRkxPQVQgZlBvcykKLXsKLQlGWF9GTE9BVCBmT2xkUG9zID0gbV9zRGF0YS5mU2Nyb2xsUG9zOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NaW5CdXR0b25MQkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgbV9zRGF0YS5TdWJTbWFsbCgpOworICBNb3ZlUG9zQnV0dG9uKFRSVUUpOworICBOb3RpZnlTY3JvbGxXaW5kb3coKTsKIAotCW1fc0RhdGEuU2V0UG9zKGZQb3MpOworICBtX2JNaW5Pck1heCA9IFRSVUU7CiAKLQlpZiAoIUlzRmxvYXRFcXVhbChtX3NEYXRhLmZTY3JvbGxQb3MsIGZPbGRQb3MpKQotCQlNb3ZlUG9zQnV0dG9uKFRSVUUpOworICBFbmRUaW1lcigpOworICBCZWdpblRpbWVyKDEwMCk7CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6OlNldFNjcm9sbFN0ZXAoRlhfRkxPQVQgZkJpZ1N0ZXAsRlhfRkxPQVQgZlNtYWxsU3RlcCkKLXsKLQltX3NEYXRhLlNldEJpZ1N0ZXAoZkJpZ1N0ZXApOwotCW1fc0RhdGEuU2V0U21hbGxTdGVwKGZTbWFsbFN0ZXApOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NaW5CdXR0b25MQlVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7fQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1pbkJ1dHRvbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCkge30KKwordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NYXhCdXR0b25MQkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgbV9zRGF0YS5BZGRTbWFsbCgpOworICBNb3ZlUG9zQnV0dG9uKFRSVUUpOworICBOb3RpZnlTY3JvbGxXaW5kb3coKTsKKworICBtX2JNaW5Pck1heCA9IEZBTFNFOworCisgIEVuZFRpbWVyKCk7CisgIEJlZ2luVGltZXIoMTAwKTsKIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6TW92ZVBvc0J1dHRvbihGWF9CT09MIGJSZWZyZXNoKQotewotCUFTU0VSVCAobV9wUG9zQnV0dG9uICE9IE5VTEwpOwotCUFTU0VSVCAobV9wTWluQnV0dG9uICE9IE5VTEwpOwotCUFTU0VSVCAobV9wTWF4QnV0dG9uICE9IE5VTEwpOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NYXhCdXR0b25MQlVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7fQogCi0JaWYgKG1fcFBvc0J1dHRvbi0+SXNWaXNpYmxlKCkpCi0Jewordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NYXhCdXR0b25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHt9CiAKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uUG9zQnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIG1fYk1vdXNlRG93biA9IFRSVUU7CiAKKyAgaWYgKG1fcFBvc0J1dHRvbikgeworICAgIENQREZfUmVjdCByY1Bvc0J1dHRvbiA9IG1fcFBvc0J1dHRvbi0+R2V0V2luZG93UmVjdCgpOwogCi0KLQkJQ1BERl9SZWN0IHJjQ2xpZW50OwotCQlDUERGX1JlY3QgcmNQb3NBcmVhLHJjUG9zQnV0dG9uOwotCi0JCXJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCQlyY1Bvc0FyZWEgPSBHZXRTY3JvbGxBcmVhKCk7Ci0KLQkJRlhfRkxPQVQgZkxlZnQsZlJpZ2h0LGZUb3AsZkJvdHRvbTsKLQotCQlzd2l0Y2ggKG1fc2JUeXBlKQotCQl7Ci0JCWNhc2UgU0JUX0hTQ1JPTEw6Ci0JCQlmTGVmdCA9IFRydWVUb0ZhY2UobV9zRGF0YS5mU2Nyb2xsUG9zKTsKLQkJCWZSaWdodCA9IFRydWVUb0ZhY2UobV9zRGF0YS5mU2Nyb2xsUG9zICsgbV9zRGF0YS5mQ2xpZW50V2lkdGgpOwotCi0JCQlpZiAoZlJpZ2h0IC0gZkxlZnQgPCBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSCkKLQkJCQlmUmlnaHQgPSBmTGVmdCArIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIOwotCi0JCQlpZiAoZlJpZ2h0ID4gcmNQb3NBcmVhLnJpZ2h0KQotCQkJewotCQkJCWZSaWdodCA9IHJjUG9zQXJlYS5yaWdodDsKLQkJCQlmTGVmdCA9IGZSaWdodCAtIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIOwotCQkJfQotCi0JCQlyY1Bvc0J1dHRvbiA9IENQREZfUmVjdChmTGVmdCAsCi0JCQkJCQkJCXJjUG9zQXJlYS5ib3R0b20sCi0JCQkJCQkJCWZSaWdodCAsCi0JCQkJCQkJCXJjUG9zQXJlYS50b3ApOwotCi0JCQlicmVhazsKLQkJY2FzZSBTQlRfVlNDUk9MTDoKLQkJCWZCb3R0b20gPSBUcnVlVG9GYWNlKG1fc0RhdGEuZlNjcm9sbFBvcyArIG1fc0RhdGEuZkNsaWVudFdpZHRoKTsKLQkJCWZUb3AgPSBUcnVlVG9GYWNlKG1fc0RhdGEuZlNjcm9sbFBvcyk7Ci0KLQkJCWlmIChJc0Zsb2F0U21hbGxlcihmVG9wIC0gZkJvdHRvbSwgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEgpKQotCQkJCWZCb3R0b20gPSBmVG9wIC0gUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEg7Ci0KLQkJCWlmIChJc0Zsb2F0U21hbGxlcihmQm90dG9tLCByY1Bvc0FyZWEuYm90dG9tKSkKLQkJCXsKLQkJCQlmQm90dG9tID0gcmNQb3NBcmVhLmJvdHRvbTsKLQkJCQlmVG9wID0gZkJvdHRvbSArIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIOwotCQkJfQotCi0JCQlyY1Bvc0J1dHRvbiA9IENQREZfUmVjdChyY1Bvc0FyZWEubGVmdCwKLQkJCQkJCQkJZkJvdHRvbSwKLQkJCQkJCQkJcmNQb3NBcmVhLnJpZ2h0LAotCQkJCQkJCQlmVG9wKTsKLQotCQkJYnJlYWs7Ci0JCX0KLQotCQltX3BQb3NCdXR0b24tPk1vdmUocmNQb3NCdXR0b24sVFJVRSxiUmVmcmVzaCk7Ci0JfQorICAgIHN3aXRjaCAobV9zYlR5cGUpIHsKKyAgICAgIGNhc2UgU0JUX0hTQ1JPTEw6CisgICAgICAgIG1fbk9sZFBvcyA9IHBvaW50Lng7CisgICAgICAgIG1fZk9sZFBvc0J1dHRvbiA9IHJjUG9zQnV0dG9uLmxlZnQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgICAgbV9uT2xkUG9zID0gcG9pbnQueTsKKyAgICAgICAgbV9mT2xkUG9zQnV0dG9uID0gcmNQb3NCdXR0b24udG9wOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NaW5CdXR0b25MQkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotewotCW1fc0RhdGEuU3ViU21hbGwoKTsKLQlNb3ZlUG9zQnV0dG9uKFRSVUUpOwotCU5vdGlmeVNjcm9sbFdpbmRvdygpOwotCi0JbV9iTWluT3JNYXggPSBUUlVFOwotCi0JRW5kVGltZXIoKTsKLQlCZWdpblRpbWVyKDEwMCk7Cit2b2lkIENQV0xfU2Nyb2xsQmFyOjpPblBvc0J1dHRvbkxCVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKG1fYk1vdXNlRG93bikgeworICAgIGlmICghbV9iTm90aWZ5Rm9yZXZlcikKKyAgICAgIE5vdGlmeVNjcm9sbFdpbmRvdygpOworICB9CisgIG1fYk1vdXNlRG93biA9IEZBTFNFOwogfQogCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1pbkJ1dHRvbkxCVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotewordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25Qb3NCdXR0b25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgRlhfRkxPQVQgZk9sZFNjcm9sbFBvcyA9IG1fc0RhdGEuZlNjcm9sbFBvczsKKworICBGWF9GTE9BVCBmTmV3UG9zID0gMDsKKworICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgIGlmIChGWFNZU19mYWJzKHBvaW50LnggLSBtX25PbGRQb3MpIDwgMSkKKyAgICAgICAgcmV0dXJuOworICAgICAgZk5ld1BvcyA9IEZhY2VUb1RydWUobV9mT2xkUG9zQnV0dG9uICsgcG9pbnQueCAtIG1fbk9sZFBvcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgaWYgKEZYU1lTX2ZhYnMocG9pbnQueSAtIG1fbk9sZFBvcykgPCAxKQorICAgICAgICByZXR1cm47CisgICAgICBmTmV3UG9zID0gRmFjZVRvVHJ1ZShtX2ZPbGRQb3NCdXR0b24gKyBwb2ludC55IC0gbV9uT2xkUG9zKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKG1fYk1vdXNlRG93bikgeworICAgIHN3aXRjaCAobV9zYlR5cGUpIHsKKyAgICAgIGNhc2UgU0JUX0hTQ1JPTEw6CisKKyAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbikpIHsKKyAgICAgICAgICBmTmV3UG9zID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWluOworICAgICAgICB9CisKKyAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIoZk5ld1BvcywgbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWF4KSkgeworICAgICAgICAgIGZOZXdQb3MgPSBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNYXg7CisgICAgICAgIH0KKworICAgICAgICBtX3NEYXRhLlNldFBvcyhmTmV3UG9zKTsKKworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisKKyAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbikpIHsKKyAgICAgICAgICBmTmV3UG9zID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWluOworICAgICAgICB9CisKKyAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIoZk5ld1BvcywgbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWF4KSkgeworICAgICAgICAgIGZOZXdQb3MgPSBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNYXg7CisgICAgICAgIH0KKworICAgICAgICBtX3NEYXRhLlNldFBvcyhmTmV3UG9zKTsKKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIUlzRmxvYXRFcXVhbChmT2xkU2Nyb2xsUG9zLCBtX3NEYXRhLmZTY3JvbGxQb3MpKSB7CisgICAgICBNb3ZlUG9zQnV0dG9uKFRSVUUpOworCisgICAgICBpZiAobV9iTm90aWZ5Rm9yZXZlcikKKyAgICAgICAgTm90aWZ5U2Nyb2xsV2luZG93KCk7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWluQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKLXsKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok5vdGlmeVNjcm9sbFdpbmRvdygpIHsKKyAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICBGWF9GTE9BVCBmUG9zOworICAgIHN3aXRjaCAobV9zYlR5cGUpIHsKKyAgICAgIGNhc2UgU0JUX0hTQ1JPTEw6CisgICAgICAgIGZQb3MgPSBtX09yaWdpbkluZm8uZkNvbnRlbnRNaW4gKyBtX3NEYXRhLmZTY3JvbGxQb3M7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgICAgZlBvcyA9IG1fT3JpZ2luSW5mby5mQ29udGVudE1heCAtIG1fc0RhdGEuZlNjcm9sbFBvczsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9TQ1JPTExXSU5ET1csIChpbnRwdHJfdCltX3NiVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpJmZQb3MpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWF4QnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKLXsKLQltX3NEYXRhLkFkZFNtYWxsKCk7Ci0JTW92ZVBvc0J1dHRvbihUUlVFKTsKLQlOb3RpZnlTY3JvbGxXaW5kb3coKTsKK0NQREZfUmVjdCBDUFdMX1Njcm9sbEJhcjo6R2V0U2Nyb2xsQXJlYSgpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICBDUERGX1JlY3QgcmNBcmVhOwogCi0JbV9iTWluT3JNYXggPSBGQUxTRTsKKyAgaWYgKCFtX3BNaW5CdXR0b24gfHwgIW1fcE1heEJ1dHRvbikKKyAgICByZXR1cm4gcmNDbGllbnQ7CiAKLQlFbmRUaW1lcigpOwotCUJlZ2luVGltZXIoMTAwKTsKKyAgQ1BERl9SZWN0IHJjTWluID0gbV9wTWluQnV0dG9uLT5HZXRXaW5kb3dSZWN0KCk7CisgIENQREZfUmVjdCByY01heCA9IG1fcE1heEJ1dHRvbi0+R2V0V2luZG93UmVjdCgpOworCisgIEZYX0ZMT0FUIGZNaW5XaWR0aCA9IHJjTWluLnJpZ2h0IC0gcmNNaW4ubGVmdDsKKyAgRlhfRkxPQVQgZk1pbkhlaWdodCA9IHJjTWluLnRvcCAtIHJjTWluLmJvdHRvbTsKKyAgRlhfRkxPQVQgZk1heFdpZHRoID0gcmNNYXgucmlnaHQgLSByY01heC5sZWZ0OworICBGWF9GTE9BVCBmTWF4SGVpZ2h0ID0gcmNNYXgudG9wIC0gcmNNYXguYm90dG9tOworCisgIHN3aXRjaCAobV9zYlR5cGUpIHsKKyAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgaWYgKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCA+IGZNaW5XaWR0aCArIGZNYXhXaWR0aCArIDIpIHsKKyAgICAgICAgcmNBcmVhID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQgKyBmTWluV2lkdGggKyAxLCByY0NsaWVudC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCAtIGZNYXhXaWR0aCAtIDEsIHJjQ2xpZW50LnRvcCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByY0FyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCArIGZNaW5XaWR0aCArIDEsIHJjQ2xpZW50LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKyBmTWluV2lkdGggKyAxLCByY0NsaWVudC50b3ApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgIGlmIChyY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20gPiBmTWluSGVpZ2h0ICsgZk1heEhlaWdodCArIDIpIHsKKyAgICAgICAgcmNBcmVhID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LmJvdHRvbSArIGZNaW5IZWlnaHQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LnRvcCAtIGZNYXhIZWlnaHQgLSAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJjQXJlYSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20gKyBmTWluSGVpZ2h0ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC5ib3R0b20gKyBmTWluSGVpZ2h0ICsgMSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIHJjQXJlYS5Ob3JtYWxpemUoKTsKKworICByZXR1cm4gcmNBcmVhOwogfQogCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1heEJ1dHRvbkxCVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQoteworRlhfRkxPQVQgQ1BXTF9TY3JvbGxCYXI6OlRydWVUb0ZhY2UoRlhfRkxPQVQgZlRydWUpIHsKKyAgQ1BERl9SZWN0IHJjUG9zQXJlYTsKKyAgcmNQb3NBcmVhID0gR2V0U2Nyb2xsQXJlYSgpOworCisgIEZYX0ZMT0FUIGZGYWN0V2lkdGggPSBtX3NEYXRhLlNjcm9sbFJhbmdlLkdldFdpZHRoKCkgKyBtX3NEYXRhLmZDbGllbnRXaWR0aDsKKyAgZkZhY3RXaWR0aCA9IGZGYWN0V2lkdGggPT0gMCA/IDEgOiBmRmFjdFdpZHRoOworCisgIEZYX0ZMT0FUIGZGYWNlID0gMDsKKworICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgIGZGYWNlID0gcmNQb3NBcmVhLmxlZnQgKworICAgICAgICAgICAgICBmVHJ1ZSAqIChyY1Bvc0FyZWEucmlnaHQgLSByY1Bvc0FyZWEubGVmdCkgLyBmRmFjdFdpZHRoOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgIGZGYWNlID0gcmNQb3NBcmVhLnRvcCAtCisgICAgICAgICAgICAgIGZUcnVlICogKHJjUG9zQXJlYS50b3AgLSByY1Bvc0FyZWEuYm90dG9tKSAvIGZGYWN0V2lkdGg7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBmRmFjZTsKIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NYXhCdXR0b25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQoteworRlhfRkxPQVQgQ1BXTF9TY3JvbGxCYXI6OkZhY2VUb1RydWUoRlhfRkxPQVQgZkZhY2UpIHsKKyAgQ1BERl9SZWN0IHJjUG9zQXJlYTsKKyAgcmNQb3NBcmVhID0gR2V0U2Nyb2xsQXJlYSgpOworCisgIEZYX0ZMT0FUIGZGYWN0V2lkdGggPSBtX3NEYXRhLlNjcm9sbFJhbmdlLkdldFdpZHRoKCkgKyBtX3NEYXRhLmZDbGllbnRXaWR0aDsKKyAgZkZhY3RXaWR0aCA9IGZGYWN0V2lkdGggPT0gMCA/IDEgOiBmRmFjdFdpZHRoOworCisgIEZYX0ZMT0FUIGZUcnVlID0gMDsKKworICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgIGZUcnVlID0gKGZGYWNlIC0gcmNQb3NBcmVhLmxlZnQpICogZkZhY3RXaWR0aCAvCisgICAgICAgICAgICAgIChyY1Bvc0FyZWEucmlnaHQgLSByY1Bvc0FyZWEubGVmdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgZlRydWUgPSAocmNQb3NBcmVhLnRvcCAtIGZGYWNlKSAqIGZGYWN0V2lkdGggLworICAgICAgICAgICAgICAocmNQb3NBcmVhLnRvcCAtIHJjUG9zQXJlYS5ib3R0b20pOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZlRydWU7CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uUG9zQnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKLXsKLQltX2JNb3VzZURvd24gPSBUUlVFOwotCi0JaWYgKG1fcFBvc0J1dHRvbikKLQl7Ci0JCUNQREZfUmVjdCByY1Bvc0J1dHRvbiA9IG1fcFBvc0J1dHRvbi0+R2V0V2luZG93UmVjdCgpOwotCi0JCXN3aXRjaChtX3NiVHlwZSkKLQkJewotCQljYXNlIFNCVF9IU0NST0xMOgotCQkJbV9uT2xkUG9zID0gcG9pbnQueDsKLQkJCW1fZk9sZFBvc0J1dHRvbiA9IHJjUG9zQnV0dG9uLmxlZnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBTQlRfVlNDUk9MTDoKLQkJCW1fbk9sZFBvcyA9IHBvaW50Lnk7Ci0JCQltX2ZPbGRQb3NCdXR0b24gPSByY1Bvc0J1dHRvbi50b3A7Ci0JCQlicmVhazsKLQkJfQotCX0KK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgQ3JlYXRlQnV0dG9ucyhjcCk7CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uUG9zQnV0dG9uTEJVcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCi17Ci0JaWYgKG1fYk1vdXNlRG93bikKLQl7Ci0JCWlmICghbV9iTm90aWZ5Rm9yZXZlcikKLQkJCU5vdGlmeVNjcm9sbFdpbmRvdygpOwotCX0KLQltX2JNb3VzZURvd24gPSBGQUxTRTsKLX0KK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6OlRpbWVyUHJvYygpIHsKKyAgUFdMX1NDUk9MTF9QUklWQVRFREFUQSBzVGVtcCA9IG1fc0RhdGE7CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uUG9zQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKLXsKLQlGWF9GTE9BVCBmT2xkU2Nyb2xsUG9zID0gbV9zRGF0YS5mU2Nyb2xsUG9zOworICBpZiAobV9iTWluT3JNYXgpCisgICAgbV9zRGF0YS5TdWJTbWFsbCgpOworICBlbHNlCisgICAgbV9zRGF0YS5BZGRTbWFsbCgpOwogCi0JRlhfRkxPQVQgZk5ld1BvcyA9IDA7Ci0KLQlzd2l0Y2ggKG1fc2JUeXBlKQotCXsKLQljYXNlIFNCVF9IU0NST0xMOgotCQlpZiAoRlhTWVNfZmFicyhwb2ludC54IC0gbV9uT2xkUG9zKSA8IDEpIHJldHVybjsKLQkJZk5ld1BvcyA9IEZhY2VUb1RydWUobV9mT2xkUG9zQnV0dG9uICsgcG9pbnQueCAtIG1fbk9sZFBvcyk7Ci0JCWJyZWFrOwotCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCWlmIChGWFNZU19mYWJzKHBvaW50LnkgLSBtX25PbGRQb3MpIDwgMSkgcmV0dXJuOwotCQlmTmV3UG9zID0gRmFjZVRvVHJ1ZShtX2ZPbGRQb3NCdXR0b24gKyBwb2ludC55IC0gbV9uT2xkUG9zKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKG1fYk1vdXNlRG93bikKLQl7Ci0JCXN3aXRjaCAobV9zYlR5cGUpCi0JCXsKLQkJY2FzZSBTQlRfSFNDUk9MTDoKLQotCQkJaWYgKElzRmxvYXRTbWFsbGVyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbikpCi0JCQl7Ci0JCQkJZk5ld1BvcyA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbjsKLQkJCX0KLQotCQkJaWYgKElzRmxvYXRCaWdnZXIoZk5ld1BvcywgbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWF4KSkKLQkJCXsKLQkJCQlmTmV3UG9zID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWF4OwotCQkJfQotCi0JCQltX3NEYXRhLlNldFBvcyhmTmV3UG9zKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0KLQkJCWlmIChJc0Zsb2F0U21hbGxlcihmTmV3UG9zLCBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNaW4pKQotCQkJewotCQkJCWZOZXdQb3MgPSBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNaW47Ci0JCQl9Ci0KLQkJCWlmIChJc0Zsb2F0QmlnZ2VyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1heCkpCi0JCQl7Ci0JCQkJZk5ld1BvcyA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1heDsKLQkJCX0KLQotCQkJbV9zRGF0YS5TZXRQb3MoZk5ld1Bvcyk7Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKCFJc0Zsb2F0RXF1YWwoZk9sZFNjcm9sbFBvcywgbV9zRGF0YS5mU2Nyb2xsUG9zKSkKLQkJewotCQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKLQotCQkJaWYgKG1fYk5vdGlmeUZvcmV2ZXIpCi0JCQkJTm90aWZ5U2Nyb2xsV2luZG93KCk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok5vdGlmeVNjcm9sbFdpbmRvdygpCi17Ci0JaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQotCXsKLQkJRlhfRkxPQVQgZlBvczsKLQkJc3dpdGNoIChtX3NiVHlwZSkKLQkJewotCQljYXNlIFNCVF9IU0NST0xMOgotCQkJZlBvcyA9IG1fT3JpZ2luSW5mby5mQ29udGVudE1pbiArIG1fc0RhdGEuZlNjcm9sbFBvczsKLQkJCWJyZWFrOwotCQljYXNlIFNCVF9WU0NST0xMOgotCQkJZlBvcyA9IG1fT3JpZ2luSW5mby5mQ29udGVudE1heCAtIG1fc0RhdGEuZlNjcm9sbFBvczsKLQkJCWJyZWFrOwotCQl9Ci0JCXBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsUE5NX1NDUk9MTFdJTkRPVywoaW50cHRyX3QpbV9zYlR5cGUsKGludHB0cl90KSZmUG9zKTsKLQl9Ci19Ci0KLUNQREZfUmVjdCBDUFdMX1Njcm9sbEJhcjo6R2V0U2Nyb2xsQXJlYSgpIGNvbnN0Ci17Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCUNQREZfUmVjdCByY0FyZWE7Ci0KLQlpZiAoIW1fcE1pbkJ1dHRvbiB8fCAhbV9wTWF4QnV0dG9uKXJldHVybiByY0NsaWVudDsKLQotCUNQREZfUmVjdCByY01pbiA9IG1fcE1pbkJ1dHRvbi0+R2V0V2luZG93UmVjdCgpOwotCUNQREZfUmVjdCByY01heCA9IG1fcE1heEJ1dHRvbi0+R2V0V2luZG93UmVjdCgpOwotCi0JRlhfRkxPQVQgZk1pbldpZHRoID0gcmNNaW4ucmlnaHQgLSByY01pbi5sZWZ0OwotCUZYX0ZMT0FUIGZNaW5IZWlnaHQgPSByY01pbi50b3AgLSByY01pbi5ib3R0b207Ci0JRlhfRkxPQVQgZk1heFdpZHRoID0gcmNNYXgucmlnaHQgLSByY01heC5sZWZ0OwotCUZYX0ZMT0FUIGZNYXhIZWlnaHQgPSByY01heC50b3AgLSByY01heC5ib3R0b207Ci0KLQlzd2l0Y2gobV9zYlR5cGUpCi0JewotCWNhc2UgU0JUX0hTQ1JPTEw6Ci0JCWlmIChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgPiBmTWluV2lkdGggKyBmTWF4V2lkdGggKyAyKQotCQl7Ci0JCQlyY0FyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCArIGZNaW5XaWR0aCArIDEscmNDbGllbnQuYm90dG9tLAotCQkJCQkJcmNDbGllbnQucmlnaHQgLSBmTWF4V2lkdGggLSAxLHJjQ2xpZW50LnRvcCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyY0FyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCArIGZNaW5XaWR0aCArIDEscmNDbGllbnQuYm90dG9tLAotCQkJCQkJcmNDbGllbnQubGVmdCArIGZNaW5XaWR0aCArIDEscmNDbGllbnQudG9wKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNCVF9WU0NST0xMOgotCQlpZiAocmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tID4gZk1pbkhlaWdodCArIGZNYXhIZWlnaHQgKyAyKQotCQl7Ci0JCQlyY0FyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCxyY0NsaWVudC5ib3R0b20gKyBmTWluSGVpZ2h0ICsgMSwKLQkJCQkJCXJjQ2xpZW50LnJpZ2h0LHJjQ2xpZW50LnRvcCAtIGZNYXhIZWlnaHQgLSAxKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJjQXJlYSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LHJjQ2xpZW50LmJvdHRvbSArIGZNaW5IZWlnaHQgKyAxLAotCQkJCQkJcmNDbGllbnQucmlnaHQscmNDbGllbnQuYm90dG9tICsgZk1pbkhlaWdodCArIDEpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJjQXJlYS5Ob3JtYWxpemUoKTsKLQotCXJldHVybiByY0FyZWE7Ci19Ci0KLUZYX0ZMT0FUIENQV0xfU2Nyb2xsQmFyOjpUcnVlVG9GYWNlKEZYX0ZMT0FUIGZUcnVlKQotewotCUNQREZfUmVjdCByY1Bvc0FyZWE7Ci0JcmNQb3NBcmVhID0gR2V0U2Nyb2xsQXJlYSgpOwotCi0JRlhfRkxPQVQgZkZhY3RXaWR0aCA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuR2V0V2lkdGgoKSArIG1fc0RhdGEuZkNsaWVudFdpZHRoOwotCWZGYWN0V2lkdGggPSBmRmFjdFdpZHRoID09IDAgPyAxIDogZkZhY3RXaWR0aDsKLQotCUZYX0ZMT0FUIGZGYWNlID0gMDsKLQotCXN3aXRjaChtX3NiVHlwZSkKLQl7Ci0JY2FzZSBTQlRfSFNDUk9MTDoKLQkJZkZhY2UgPSByY1Bvc0FyZWEubGVmdCArIGZUcnVlICogKHJjUG9zQXJlYS5yaWdodCAtIHJjUG9zQXJlYS5sZWZ0KSAvIGZGYWN0V2lkdGg7Ci0JCWJyZWFrOwotCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCWZGYWNlID0gcmNQb3NBcmVhLnRvcCAtIGZUcnVlICogKHJjUG9zQXJlYS50b3AgLSByY1Bvc0FyZWEuYm90dG9tKSAvIGZGYWN0V2lkdGg7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBmRmFjZTsKLX0KLQotRlhfRkxPQVQgQ1BXTF9TY3JvbGxCYXI6OkZhY2VUb1RydWUoRlhfRkxPQVQgZkZhY2UpCi17Ci0JQ1BERl9SZWN0IHJjUG9zQXJlYTsKLQlyY1Bvc0FyZWEgPSBHZXRTY3JvbGxBcmVhKCk7Ci0KLQlGWF9GTE9BVCBmRmFjdFdpZHRoID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5HZXRXaWR0aCgpICsgbV9zRGF0YS5mQ2xpZW50V2lkdGg7Ci0JZkZhY3RXaWR0aCA9IGZGYWN0V2lkdGggPT0gMCA/IDEgOiBmRmFjdFdpZHRoOwotCi0JRlhfRkxPQVQgZlRydWUgPSAwOwotCi0Jc3dpdGNoKG1fc2JUeXBlKQotCXsKLQljYXNlIFNCVF9IU0NST0xMOgotCQlmVHJ1ZSA9ICAoZkZhY2UgLSByY1Bvc0FyZWEubGVmdCkgKiBmRmFjdFdpZHRoIC8gKHJjUG9zQXJlYS5yaWdodCAtIHJjUG9zQXJlYS5sZWZ0KTsKLQkJYnJlYWs7Ci0JY2FzZSBTQlRfVlNDUk9MTDoKLQkJZlRydWUgPSAocmNQb3NBcmVhLnRvcCAtIGZGYWNlKSAqIGZGYWN0V2lkdGggLyAocmNQb3NBcmVhLnRvcCAtIHJjUG9zQXJlYS5ib3R0b20pOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZlRydWU7Ci19Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCUNyZWF0ZUJ1dHRvbnMoY3ApOwotfQotCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpUaW1lclByb2MoKQotewotCVBXTF9TQ1JPTExfUFJJVkFURURBVEEgc1RlbXAgPSBtX3NEYXRhOwotCi0JaWYgKG1fYk1pbk9yTWF4KW1fc0RhdGEuU3ViU21hbGwoKTsKLQllbHNlIG1fc0RhdGEuQWRkU21hbGwoKTsKLQotCWlmIChGWFNZU19tZW1jbXAoJm1fc0RhdGEsICZzVGVtcCwgc2l6ZW9mKFBXTF9TQ1JPTExfUFJJVkFURURBVEEpKSAhPSAwKQotCXsKLQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKLQkJTm90aWZ5U2Nyb2xsV2luZG93KCk7Ci0JfQorICBpZiAoRlhTWVNfbWVtY21wKCZtX3NEYXRhLCAmc1RlbXAsIHNpemVvZihQV0xfU0NST0xMX1BSSVZBVEVEQVRBKSkgIT0gMCkgeworICAgIE1vdmVQb3NCdXR0b24oVFJVRSk7CisgICAgTm90aWZ5U2Nyb2xsV2luZG93KCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmNwcAppbmRleCA3NmIyYmQzLi5iZmUzMmFlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuY3BwCkBAIC0xMSwyMTAgKzExLDE5NCBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MYWJlbC5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9TaWduYXR1cmVfSW1hZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9TaWduYXR1cmVfSW1hZ2UKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX1NpZ25hdHVyZV9JbWFnZTo6Q1BXTF9TaWduYXR1cmVfSW1hZ2UoKSA6IG1fcEltYWdlKE5VTEwpCi17CitDUFdMX1NpZ25hdHVyZV9JbWFnZTo6Q1BXTF9TaWduYXR1cmVfSW1hZ2UoKSA6IG1fcEltYWdlKE5VTEwpIHt9CisKK0NQV0xfU2lnbmF0dXJlX0ltYWdlOjp+Q1BXTF9TaWduYXR1cmVfSW1hZ2UoKSB7fQorCit2b2lkIENQV0xfU2lnbmF0dXJlX0ltYWdlOjpTZXRJbWFnZShDRlhfRElCU291cmNlKiBwSW1hZ2UpIHsKKyAgbV9wSW1hZ2UgPSBwSW1hZ2U7CiB9CiAKLUNQV0xfU2lnbmF0dXJlX0ltYWdlOjp+Q1BXTF9TaWduYXR1cmVfSW1hZ2UoKQoteworQ0ZYX0RJQlNvdXJjZSogQ1BXTF9TaWduYXR1cmVfSW1hZ2U6OkdldEltYWdlKCkgeworICByZXR1cm4gbV9wSW1hZ2U7CiB9CiAKLXZvaWQgQ1BXTF9TaWduYXR1cmVfSW1hZ2U6OlNldEltYWdlKENGWF9ESUJTb3VyY2UqIHBJbWFnZSkKLXsKLQltX3BJbWFnZSA9IHBJbWFnZTsKK3ZvaWQgQ1BXTF9TaWduYXR1cmVfSW1hZ2U6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOworCisgIGlmIChtX3BJbWFnZSkgeworICAgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKworICAgIEZYX0ZMT0FUIHgsIHk7CisgICAgcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocmNDbGllbnQubGVmdCwgcmNDbGllbnQudG9wLCB4LCB5KTsKKworICAgIHBEZXZpY2UtPlN0cmV0Y2hESUJpdHMobV9wSW1hZ2UsIChpbnQzMl90KXgsIChpbnQzMl90KXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClyY0NsaWVudC5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpcmNDbGllbnQuSGVpZ2h0KCkpOworICB9CiB9CiAKLUNGWF9ESUJTb3VyY2UqIENQV0xfU2lnbmF0dXJlX0ltYWdlOjpHZXRJbWFnZSgpCi17Ci0JcmV0dXJuIG1fcEltYWdlOwordm9pZCBDUFdMX1NpZ25hdHVyZV9JbWFnZTo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oCisgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSB7CisgIHNBcHBTdHJlYW0gPDwgQ1BXTF9JbWFnZTo6R2V0SW1hZ2VBcHBTdHJlYW0oKTsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZV9JbWFnZTo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCi17Ci0JQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOwordm9pZCBDUFdMX1NpZ25hdHVyZV9JbWFnZTo6R2V0U2NhbGUoRlhfRkxPQVQmIGZIU2NhbGUsIEZYX0ZMT0FUJiBmVlNjYWxlKSB7CisgIEZYX0ZMT0FUIGZJbWFnZVcsIGZJbWFnZUg7CiAKLQlpZiAobV9wSW1hZ2UpCi0JewotCQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgIEdldEltYWdlU2l6ZShmSW1hZ2VXLCBmSW1hZ2VIKTsKIAotCQlGWF9GTE9BVCB4LCB5OwotCQlwVXNlcjJEZXZpY2UtPlRyYW5zZm9ybShyY0NsaWVudC5sZWZ0LCByY0NsaWVudC50b3AsIHgsIHkpOworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKLQkJcERldmljZS0+U3RyZXRjaERJQml0cyhtX3BJbWFnZSwgKGludDMyX3QpeCwgKGludDMyX3QpeSwKLQkJCShpbnQzMl90KXJjQ2xpZW50LldpZHRoKCksIChpbnQzMl90KXJjQ2xpZW50LkhlaWdodCgpKTsKLQl9CisgIGZIU2NhbGUgPSByY0NsaWVudC5XaWR0aCgpIC8gZkltYWdlVzsKKyAgZlZTY2FsZSA9IHJjQ2xpZW50LkhlaWdodCgpIC8gZkltYWdlSDsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZV9JbWFnZTo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLQlzQXBwU3RyZWFtIDw8IENQV0xfSW1hZ2U6OkdldEltYWdlQXBwU3RyZWFtKCk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9TaWduYXR1cmUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDUFdMX1NpZ25hdHVyZTo6Q1BXTF9TaWduYXR1cmUoKQorICAgIDogbV9wVGV4dChOVUxMKSwKKyAgICAgIG1fcERlc2NyaXB0aW9uKE5VTEwpLAorICAgICAgbV9wSW1hZ2UoTlVMTCksCisgICAgICBtX2JUZXh0RXhpc3QoVFJVRSksCisgICAgICBtX2JJbWFnZUV4aXN0KEZBTFNFKSwKKyAgICAgIG1fYkZsYWdFeGlzdChUUlVFKSB7fQorCitDUFdMX1NpZ25hdHVyZTo6fkNQV0xfU2lnbmF0dXJlKCkge30KKwordm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0VGV4dEZsYWcoRlhfQk9PTCBiVGV4dEV4aXN0KSB7CisgIG1fYlRleHRFeGlzdCA9IGJUZXh0RXhpc3Q7CisKKyAgUmVQb3NDaGlsZFduZCgpOwogfQogCi12b2lkIENQV0xfU2lnbmF0dXJlX0ltYWdlOjpHZXRTY2FsZShGWF9GTE9BVCAmIGZIU2NhbGUsRlhfRkxPQVQgJiBmVlNjYWxlKQotewotCUZYX0ZMT0FUIGZJbWFnZVcsIGZJbWFnZUg7Cit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRJbWFnZUZsYWcoRlhfQk9PTCBiSW1hZ2VFeGlzdCkgeworICBtX2JJbWFnZUV4aXN0ID0gYkltYWdlRXhpc3Q7CiAKLQlHZXRJbWFnZVNpemUoZkltYWdlVywgZkltYWdlSCk7Ci0KLQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0KLQlmSFNjYWxlID0gcmNDbGllbnQuV2lkdGgoKSAvIGZJbWFnZVc7Ci0JZlZTY2FsZSA9IHJjQ2xpZW50LkhlaWdodCgpIC8gZkltYWdlSDsKKyAgUmVQb3NDaGlsZFduZCgpOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9TaWduYXR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUNQV0xfU2lnbmF0dXJlOjpDUFdMX1NpZ25hdHVyZSgpIDoKLQltX3BUZXh0KE5VTEwpLAotCW1fcERlc2NyaXB0aW9uKE5VTEwpLAotCW1fcEltYWdlKE5VTEwpLAotCW1fYlRleHRFeGlzdChUUlVFKSwKLQltX2JJbWFnZUV4aXN0KEZBTFNFKSwKLQltX2JGbGFnRXhpc3QoVFJVRSkKLXsKK3ZvaWQgQ1BXTF9TaWduYXR1cmU6OlNldEZveGl0RmxhZyhGWF9CT09MIGJGbGFnRXhpc3QpIHsKKyAgbV9iRmxhZ0V4aXN0ID0gYkZsYWdFeGlzdDsKIH0KIAotQ1BXTF9TaWduYXR1cmU6On5DUFdMX1NpZ25hdHVyZSgpCi17Cit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiBzVGV4dCkgeworICBtX3BUZXh0LT5TZXRUZXh0KHNUZXh0KTsKKworICBSZVBvc0NoaWxkV25kKCk7CiB9CiAKLXZvaWQgQ1BXTF9TaWduYXR1cmU6OlNldFRleHRGbGFnKEZYX0JPT0wgYlRleHRFeGlzdCkKLXsKLQltX2JUZXh0RXhpc3QgPSBiVGV4dEV4aXN0Owordm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0RGVzY3JpcHRpb24oY29uc3QgRlhfV0NIQVIqIHN0cmluZykgeworICBtX3BEZXNjcmlwdGlvbi0+U2V0VGV4dChzdHJpbmcpOwogCi0JUmVQb3NDaGlsZFduZCgpOworICBSZVBvc0NoaWxkV25kKCk7CiB9CiAKLXZvaWQgQ1BXTF9TaWduYXR1cmU6OlNldEltYWdlRmxhZyhGWF9CT09MIGJJbWFnZUV4aXN0KQotewotCW1fYkltYWdlRXhpc3QgPSBiSW1hZ2VFeGlzdDsKK3ZvaWQgQ1BXTF9TaWduYXR1cmU6OlNldEltYWdlKENGWF9ESUJTb3VyY2UqIHBJbWFnZSkgeworICBtX3BJbWFnZS0+U2V0SW1hZ2UocEltYWdlKTsKIAotCVJlUG9zQ2hpbGRXbmQoKTsKKyAgUmVQb3NDaGlsZFduZCgpOwogfQogCi12b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRGb3hpdEZsYWcoRlhfQk9PTCBiRmxhZ0V4aXN0KQotewotCW1fYkZsYWdFeGlzdCA9IGJGbGFnRXhpc3Q7Cit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRJbWFnZVN0cmVhbShDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHNJbWFnZUFsaWFzKSB7CisgIG1fcEltYWdlLT5TZXRQREZTdHJlYW0ocFN0cmVhbSk7CisgIG1fcEltYWdlLT5TZXRJbWFnZUFsaWFzKHNJbWFnZUFsaWFzKTsKKworICBSZVBvc0NoaWxkV25kKCk7CiB9CiAKLXZvaWQgQ1BXTF9TaWduYXR1cmU6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHNUZXh0KQotewotCW1fcFRleHQtPlNldFRleHQoc1RleHQpOwordm9pZCBDUFdMX1NpZ25hdHVyZTo6UmVQb3NDaGlsZFduZCgpIHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JUmVQb3NDaGlsZFduZCgpOworICBDUERGX1JlY3QgcmNUZXh0ID0gcmNDbGllbnQ7CisgIENQREZfUmVjdCByY0Rlc2NyaXB0aW9uID0gcmNDbGllbnQ7CisKKyAgRlhfQk9PTCBiVGV4dFZpc2libGUgPSBtX2JUZXh0RXhpc3QgJiYgbV9wVGV4dC0+R2V0VGV4dCgpLkdldExlbmd0aCgpID4gMDsKKworICBpZiAoKGJUZXh0VmlzaWJsZSB8fCBtX2JJbWFnZUV4aXN0KSAmJgorICAgICAgbV9wRGVzY3JpcHRpb24tPkdldFRleHQoKS5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBpZiAocmNDbGllbnQuV2lkdGgoKSA+PSByY0NsaWVudC5IZWlnaHQoKSkgeworICAgICAgcmNUZXh0LnJpZ2h0ID0gcmNUZXh0LmxlZnQgKyByY0NsaWVudC5XaWR0aCgpIC8gMi4wZjsKKyAgICAgIHJjRGVzY3JpcHRpb24ubGVmdCA9IHJjRGVzY3JpcHRpb24ucmlnaHQgLSByY0NsaWVudC5XaWR0aCgpIC8gMi4wZjsKKyAgICB9IGVsc2UgeworICAgICAgcmNUZXh0LmJvdHRvbSA9IHJjVGV4dC50b3AgLSByY0NsaWVudC5IZWlnaHQoKSAvIDIuMGY7CisgICAgICByY0Rlc2NyaXB0aW9uLnRvcCA9IHJjRGVzY3JpcHRpb24uYm90dG9tICsgcmNDbGllbnQuSGVpZ2h0KCkgLyAyLjBmOworICAgIH0KKyAgfQorCisgIG1fcFRleHQtPlNldFZpc2libGUoYlRleHRWaXNpYmxlKTsKKyAgbV9wSW1hZ2UtPlNldFZpc2libGUobV9iSW1hZ2VFeGlzdCk7CisKKyAgbV9wVGV4dC0+TW92ZShyY1RleHQsIFRSVUUsIEZBTFNFKTsKKyAgbV9wSW1hZ2UtPk1vdmUocmNUZXh0LCBUUlVFLCBGQUxTRSk7CisgIG1fcERlc2NyaXB0aW9uLT5Nb3ZlKHJjRGVzY3JpcHRpb24sIFRSVUUsIEZBTFNFKTsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0RGVzY3JpcHRpb24oY29uc3QgRlhfV0NIQVIqIHN0cmluZykKLXsKLQltX3BEZXNjcmlwdGlvbi0+U2V0VGV4dChzdHJpbmcpOwordm9pZCBDUFdMX1NpZ25hdHVyZTo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBtX3BJbWFnZSA9IG5ldyBDUFdMX1NpZ25hdHVyZV9JbWFnZTsKKyAgUFdMX0NSRUFURVBBUkFNIGljcCA9IGNwOworICBpY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGljcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEU7CisgIGljcC5zVGV4dENvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCk7CisgIG1fcEltYWdlLT5DcmVhdGUoaWNwKTsKIAotCVJlUG9zQ2hpbGRXbmQoKTsKKyAgbV9wVGV4dCA9IG5ldyBDUFdMX0xhYmVsOworICBQV0xfQ1JFQVRFUEFSQU0gYWNwID0gY3A7CisgIGFjcC5wUGFyZW50V25kID0gdGhpczsKKyAgYWNwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBXU19BVVRPRk9OVFNJWkUgfCBQRVNfTVVMVElMSU5FIHwKKyAgICAgICAgICAgICAgICBQRVNfQVVUT1JFVFVSTiB8IFBFU19NSURETEUgfCBQRVNfQ0VOVEVSOworICBhY3Auc1RleHRDb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDApOworICBtX3BUZXh0LT5DcmVhdGUoYWNwKTsKKworICBtX3BEZXNjcmlwdGlvbiA9IG5ldyBDUFdMX0xhYmVsOworICBQV0xfQ1JFQVRFUEFSQU0gZGNwID0gY3A7CisgIGRjcC5wUGFyZW50V25kID0gdGhpczsKKyAgZGNwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBXU19BVVRPRk9OVFNJWkUgfCBQRVNfTVVMVElMSU5FIHwKKyAgICAgICAgICAgICAgICBQRVNfQVVUT1JFVFVSTiB8IFBFU19MRUZUIHwgUEVTX0NFTlRFUjsKKyAgZGNwLnNUZXh0Q29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKKyAgbV9wRGVzY3JpcHRpb24tPkNyZWF0ZShkY3ApOwogfQogCi12b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRJbWFnZShDRlhfRElCU291cmNlKiBwSW1hZ2UpCi17Ci0JbV9wSW1hZ2UtPlNldEltYWdlKHBJbWFnZSk7Cit2b2lkIENQV0xfU2lnbmF0dXJlOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgIENQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKIAotCVJlUG9zQ2hpbGRXbmQoKTsKKyAgaWYgKG1fYkZsYWdFeGlzdCkKKyAgICBDUFdMX1V0aWxzOjpEcmF3SWNvbkFwcFN0cmVhbSgKKyAgICAgICAgcERldmljZSwgcFVzZXIyRGV2aWNlLCBQV0xfSUNPTlRZUEVfRk9YSVQsCisgICAgICAgIENQV0xfVXRpbHM6OkdldENlbnRlclNxdWFyZShHZXRDbGllbnRSZWN0KCkpLAorICAgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDAuOTFmLCAwLjg1NWYsIDAuOTJmKSwKKyAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfVFJBTlNQQVJFTlQpLCAyNTUpOworCisgIC8qCisgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKworICBDRlhfUGF0aERhdGEgcGF0aDsKKworICBwYXRoLlNldFBvaW50Q291bnQoMik7CisgIHBhdGguU2V0UG9pbnQoMCwgcmNDbGllbnQubGVmdCwgKHJjQ2xpZW50LnRvcCArIHJjQ2xpZW50LmJvdHRvbSkgKiAwLjVmLAorICBGWFBUX01PVkVUTyk7CisgIHBhdGguU2V0UG9pbnQoMSwgcmNDbGllbnQucmlnaHQsIChyY0NsaWVudC50b3AgKyByY0NsaWVudC5ib3R0b20pICogMC41ZiwKKyAgRlhQVF9MSU5FVE8pOworCisgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgIGdzZC5TZXREYXNoQ291bnQoMik7CisgIGdzZC5tX0Rhc2hBcnJheVswXSA9IDYuMGY7CisgIGdzZC5tX0Rhc2hBcnJheVsxXSA9IDYuMGY7CisgIGdzZC5tX0Rhc2hQaGFzZSA9IDA7CisKKyAgZ3NkLm1fTGluZVdpZHRoID0gMTAuMGY7CisgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIEFyZ2JFbmNvZGUoMjU1LDI1NSwwLDApLAorICBGWEZJTExfQUxURVJOQVRFKTsKKyAgKi8KIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0SW1hZ2VTdHJlYW0oQ1BERl9TdHJlYW0gKiBwU3RyZWFtLCBjb25zdCBGWF9DSEFSKiBzSW1hZ2VBbGlhcykKLXsKLQltX3BJbWFnZS0+U2V0UERGU3RyZWFtKHBTdHJlYW0pOwotCW1fcEltYWdlLT5TZXRJbWFnZUFsaWFzKHNJbWFnZUFsaWFzKTsKLQotCVJlUG9zQ2hpbGRXbmQoKTsKK3ZvaWQgQ1BXTF9TaWduYXR1cmU6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgeworICBDUFdMX1duZDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7CiB9Ci0KLXZvaWQgQ1BXTF9TaWduYXR1cmU6OlJlUG9zQ2hpbGRXbmQoKQotewotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotCUNQREZfUmVjdCByY1RleHQgPSByY0NsaWVudDsKLQlDUERGX1JlY3QgcmNEZXNjcmlwdGlvbiA9IHJjQ2xpZW50OwotCi0JRlhfQk9PTCBiVGV4dFZpc2libGUgPSBtX2JUZXh0RXhpc3QgJiYgbV9wVGV4dC0+R2V0VGV4dCgpLkdldExlbmd0aCgpID4gMDsKLQotCWlmICgoYlRleHRWaXNpYmxlIHx8IG1fYkltYWdlRXhpc3QpICYmCi0JCW1fcERlc2NyaXB0aW9uLT5HZXRUZXh0KCkuR2V0TGVuZ3RoKCkgPiAwKQotCXsKLQkJaWYgKHJjQ2xpZW50LldpZHRoKCkgPj0gcmNDbGllbnQuSGVpZ2h0KCkpCi0JCXsKLQkJCXJjVGV4dC5yaWdodCA9IHJjVGV4dC5sZWZ0ICsgcmNDbGllbnQuV2lkdGgoKSAvIDIuMGY7Ci0JCQlyY0Rlc2NyaXB0aW9uLmxlZnQgPSByY0Rlc2NyaXB0aW9uLnJpZ2h0IC0gcmNDbGllbnQuV2lkdGgoKSAvIDIuMGY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyY1RleHQuYm90dG9tID0gcmNUZXh0LnRvcCAtIHJjQ2xpZW50LkhlaWdodCgpIC8gMi4wZjsKLQkJCXJjRGVzY3JpcHRpb24udG9wID0gcmNEZXNjcmlwdGlvbi5ib3R0b20gKyByY0NsaWVudC5IZWlnaHQoKSAvIDIuMGY7Ci0JCX0KLQl9Ci0KLQltX3BUZXh0LT5TZXRWaXNpYmxlKGJUZXh0VmlzaWJsZSk7Ci0JbV9wSW1hZ2UtPlNldFZpc2libGUobV9iSW1hZ2VFeGlzdCk7Ci0KLQltX3BUZXh0LT5Nb3ZlKHJjVGV4dCwgVFJVRSwgRkFMU0UpOwotCW1fcEltYWdlLT5Nb3ZlKHJjVGV4dCwgVFJVRSwgRkFMU0UpOwotCW1fcERlc2NyaXB0aW9uLT5Nb3ZlKHJjRGVzY3JpcHRpb24sIFRSVUUsIEZBTFNFKTsKLX0KLQotdm9pZCBDUFdMX1NpZ25hdHVyZTo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JbV9wSW1hZ2UgPSBuZXcgQ1BXTF9TaWduYXR1cmVfSW1hZ2U7Ci0JUFdMX0NSRUFURVBBUkFNIGljcCA9IGNwOwotCWljcC5wUGFyZW50V25kID0gdGhpczsKLQlpY3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFOwotCWljcC5zVGV4dENvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCk7Ci0JbV9wSW1hZ2UtPkNyZWF0ZShpY3ApOwotCi0JbV9wVGV4dCA9IG5ldyBDUFdMX0xhYmVsOwotCVBXTF9DUkVBVEVQQVJBTSBhY3AgPSBjcDsKLQlhY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JYWNwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBXU19BVVRPRk9OVFNJWkUgfCBQRVNfTVVMVElMSU5FIHwgUEVTX0FVVE9SRVRVUk4gfCBQRVNfTUlERExFIHwgUEVTX0NFTlRFUjsKLQlhY3Auc1RleHRDb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDApOwotCW1fcFRleHQtPkNyZWF0ZShhY3ApOwotCi0JbV9wRGVzY3JpcHRpb24gPSBuZXcgQ1BXTF9MYWJlbDsKLQlQV0xfQ1JFQVRFUEFSQU0gZGNwID0gY3A7Ci0JZGNwLnBQYXJlbnRXbmQgPSB0aGlzOwotCWRjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEUgfCBQV1NfQVVUT0ZPTlRTSVpFIHwgUEVTX01VTFRJTElORSB8IFBFU19BVVRPUkVUVVJOIHwgUEVTX0xFRlQgfCBQRVNfQ0VOVEVSOwotCWRjcC5zVGV4dENvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCk7Ci0JbV9wRGVzY3JpcHRpb24tPkNyZWF0ZShkY3ApOwotfQotCi12b2lkIENQV0xfU2lnbmF0dXJlOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkKLXsKLQlDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7Ci0KLQlpZiAobV9iRmxhZ0V4aXN0KQotCQlDUFdMX1V0aWxzOjpEcmF3SWNvbkFwcFN0cmVhbShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIFBXTF9JQ09OVFlQRV9GT1hJVCwgQ1BXTF9VdGlsczo6R2V0Q2VudGVyU3F1YXJlKEdldENsaWVudFJlY3QoKSksCi0JCQlDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMC45MWYsMC44NTVmLDAuOTJmKSwgQ1BXTF9Db2xvcihDT0xPUlRZUEVfVFJBTlNQQVJFTlQpLCAyNTUpOwotCi0JLyoKLQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0KLQlDRlhfUGF0aERhdGEgcGF0aDsKLQotCXBhdGguU2V0UG9pbnRDb3VudCgyKTsKLQlwYXRoLlNldFBvaW50KDAsIHJjQ2xpZW50LmxlZnQsIChyY0NsaWVudC50b3AgKyByY0NsaWVudC5ib3R0b20pICogMC41ZiwgRlhQVF9NT1ZFVE8pOwotCXBhdGguU2V0UG9pbnQoMSwgcmNDbGllbnQucmlnaHQsIChyY0NsaWVudC50b3AgKyByY0NsaWVudC5ib3R0b20pICogMC41ZiwgRlhQVF9MSU5FVE8pOwotCi0JQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLQlnc2QuU2V0RGFzaENvdW50KDIpOwotCWdzZC5tX0Rhc2hBcnJheVswXSA9IDYuMGY7Ci0JZ3NkLm1fRGFzaEFycmF5WzFdID0gNi4wZjsKLQlnc2QubV9EYXNoUGhhc2UgPSAwOwotCi0JZ3NkLm1fTGluZVdpZHRoID0gMTAuMGY7Ci0JcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwgQXJnYkVuY29kZSgyNTUsMjU1LDAsMCksIEZYRklMTF9BTFRFUk5BVEUpOwotCSovCi19Ci0KLXZvaWQgQ1BXTF9TaWduYXR1cmU6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pCi17Ci0JQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOwotfQotCi0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uY3BwCmluZGV4IDkwZmE4ZjguLjdmMTI1YWQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcApAQCAtMTIsOTkgKzEyLDc2IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX1B1c2hCdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX1B1c2hCdXR0b246OkNQV0xfUHVzaEJ1dHRvbigpCi17CitDUFdMX1B1c2hCdXR0b246OkNQV0xfUHVzaEJ1dHRvbigpIHt9CisKK0NQV0xfUHVzaEJ1dHRvbjo6fkNQV0xfUHVzaEJ1dHRvbigpIHt9CisKK0NGWF9CeXRlU3RyaW5nIENQV0xfUHVzaEJ1dHRvbjo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfUHVzaEJ1dHRvbiI7CiB9CiAKLUNQV0xfUHVzaEJ1dHRvbjo6fkNQV0xfUHVzaEJ1dHRvbigpCi17Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfUHVzaEJ1dHRvbjo6R2V0Q2xhc3NOYW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gIkNQV0xfUHVzaEJ1dHRvbiI7Ci19Ci0KLUNQREZfUmVjdCBDUFdMX1B1c2hCdXR0b246OkdldEZvY3VzUmVjdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwgKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCkpOworQ1BERl9SZWN0IENQV0xfUHVzaEJ1dHRvbjo6R2V0Rm9jdXNSZWN0KCkgY29uc3QgeworICByZXR1cm4gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoR2V0V2luZG93UmVjdCgpLCAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKSk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NoZWNrQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9DaGVja0JveDo6Q1BXTF9DaGVja0JveCgpIDogbV9iQ2hlY2tlZChGQUxTRSkKLXsKK0NQV0xfQ2hlY2tCb3g6OkNQV0xfQ2hlY2tCb3goKSA6IG1fYkNoZWNrZWQoRkFMU0UpIHt9CisKK0NQV0xfQ2hlY2tCb3g6On5DUFdMX0NoZWNrQm94KCkge30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9DaGVja0JveDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfQ2hlY2tCb3giOwogfQogCi1DUFdMX0NoZWNrQm94Ojp+Q1BXTF9DaGVja0JveCgpCi17Cit2b2lkIENQV0xfQ2hlY2tCb3g6OlNldENoZWNrKEZYX0JPT0wgYkNoZWNrKSB7CisgIG1fYkNoZWNrZWQgPSBiQ2hlY2s7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfQ2hlY2tCb3g6OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICJDUFdMX0NoZWNrQm94IjsKK0ZYX0JPT0wgQ1BXTF9DaGVja0JveDo6SXNDaGVja2VkKCkgY29uc3QgeworICByZXR1cm4gbV9iQ2hlY2tlZDsKIH0KIAotdm9pZCBDUFdMX0NoZWNrQm94OjpTZXRDaGVjayhGWF9CT09MIGJDaGVjaykKLXsKLQltX2JDaGVja2VkID0gYkNoZWNrOworRlhfQk9PTCBDUFdMX0NoZWNrQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKElzUmVhZE9ubHkoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgU2V0Q2hlY2soIUlzQ2hlY2tlZCgpKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9DaGVja0JveDo6SXNDaGVja2VkKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9iQ2hlY2tlZDsKLX0KLQotRlhfQk9PTCBDUFdMX0NoZWNrQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmIChJc1JlYWRPbmx5KCkpIHJldHVybiBGQUxTRTsKLQotCVNldENoZWNrKCFJc0NoZWNrZWQoKSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgQ1BXTF9DaGVja0JveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQotewotCVNldENoZWNrKCFJc0NoZWNrZWQoKSk7Ci0JcmV0dXJuIFRSVUU7CitGWF9CT09MIENQV0xfQ2hlY2tCb3g6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgeworICBTZXRDaGVjayghSXNDaGVja2VkKCkpOworICByZXR1cm4gVFJVRTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfUmFkaW9CdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX1JhZGlvQnV0dG9uOjpDUFdMX1JhZGlvQnV0dG9uKCkgOiBtX2JDaGVja2VkKEZBTFNFKQoteworQ1BXTF9SYWRpb0J1dHRvbjo6Q1BXTF9SYWRpb0J1dHRvbigpIDogbV9iQ2hlY2tlZChGQUxTRSkge30KKworQ1BXTF9SYWRpb0J1dHRvbjo6fkNQV0xfUmFkaW9CdXR0b24oKSB7fQorCitDRlhfQnl0ZVN0cmluZyBDUFdMX1JhZGlvQnV0dG9uOjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9SYWRpb0J1dHRvbiI7CiB9CiAKLUNQV0xfUmFkaW9CdXR0b246On5DUFdMX1JhZGlvQnV0dG9uKCkKLXsKK0ZYX0JPT0wgQ1BXTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmIChJc1JlYWRPbmx5KCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIFNldENoZWNrKFRSVUUpOworICByZXR1cm4gVFJVRTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9SYWRpb0J1dHRvbjo6R2V0Q2xhc3NOYW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gIkNQV0xfUmFkaW9CdXR0b24iOwordm9pZCBDUFdMX1JhZGlvQnV0dG9uOjpTZXRDaGVjayhGWF9CT09MIGJDaGVjaykgeworICBtX2JDaGVja2VkID0gYkNoZWNrOwogfQogCi1GWF9CT09MCUNQV0xfUmFkaW9CdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKElzUmVhZE9ubHkoKSkgcmV0dXJuIEZBTFNFOwotCi0JU2V0Q2hlY2soVFJVRSk7Ci0JcmV0dXJuIFRSVUU7CitGWF9CT09MIENQV0xfUmFkaW9CdXR0b246OklzQ2hlY2tlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYkNoZWNrZWQ7CiB9CiAKLXZvaWQgQ1BXTF9SYWRpb0J1dHRvbjo6U2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spCi17Ci0JbV9iQ2hlY2tlZCA9IGJDaGVjazsKK0ZYX0JPT0wgQ1BXTF9SYWRpb0J1dHRvbjo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKSB7CisgIFNldENoZWNrKFRSVUUpOworICByZXR1cm4gVFJVRTsKIH0KLQotRlhfQk9PTCBDUFdMX1JhZGlvQnV0dG9uOjpJc0NoZWNrZWQoKSBjb25zdAotewotCXJldHVybiBtX2JDaGVja2VkOwotfQotCi1GWF9CT09MIENQV0xfUmFkaW9CdXR0b246Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykKLXsKLQlTZXRDaGVjayhUUlVFKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9VdGlscy5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcAppbmRleCBiOWJhNzY2Li41MmIyMmI1IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcApAQCAtOSwyODE5ICs5LDM3MDUgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbi5oIgogCi0jZGVmaW5lIElzRmxvYXRaZXJvKGYpCQkJCQkJKChmKSA8IDAuMDAwMSAmJiAoZikgPiAtMC4wMDAxKQotI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLGZiKQkJCQkoKGZhKSA+IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKLSNkZWZpbmUgSXNGbG9hdFNtYWxsZXIoZmEsZmIpCQkJCSgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsZmIpCQkJCQlJc0Zsb2F0WmVybygoZmEpLShmYikpCisjZGVmaW5lIElzRmxvYXRaZXJvKGYpICgoZikgPCAwLjAwMDEgJiYgKGYpID4gLTAuMDAwMSkKKyNkZWZpbmUgSXNGbG9hdEJpZ2dlcihmYSwgZmIpICgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSwgZmIpICgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsIGZiKSBJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX1V0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoY29uc3QgQ1BXTF9QYXRoRGF0YSogcFBhdGhEYXRhLCBpbnQzMl90IG5Db3VudCkKLXsKLQlDRlhfQnl0ZVRleHRCdWYgY3NBUDsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbUZyb21BcnJheShjb25zdCBDUFdMX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CiAKLQlmb3IgKGludDMyX3QgaT0wOyBpPG5Db3VudDsgaSsrKQotCXsKLQkJc3dpdGNoIChwUGF0aERhdGFbaV0udHlwZSkKLQkJewotCQljYXNlIFBXTFBUX01PVkVUTzoKLQkJCWNzQVAgPDwgcFBhdGhEYXRhW2ldLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpXS5wb2ludC55IDw8ICIgbVxuIjsKLQkJCWJyZWFrOwotCQljYXNlIFBXTFBUX0xJTkVUTzoKLQkJCWNzQVAgPDwgcFBhdGhEYXRhW2ldLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpXS5wb2ludC55IDw8ICIgbFxuIjsKLQkJCWJyZWFrOwotCQljYXNlIFBXTFBUX0JFWklFUlRPOgotCQkJY3NBUCA8PCBwUGF0aERhdGFbaV0ucG9pbnQueCA8PCAiICIgPDwgcFBhdGhEYXRhW2ldLnBvaW50LnkgPDwgIiAiCi0JCQkJIDw8IHBQYXRoRGF0YVtpKzFdLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpKzFdLnBvaW50LnkgPDwgIiAiCi0JCQkJIDw8IHBQYXRoRGF0YVtpKzJdLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpKzJdLnBvaW50LnkgPDwgIiBjXG4iOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgIHN3aXRjaCAocFBhdGhEYXRhW2ldLnR5cGUpIHsKKyAgICAgIGNhc2UgUFdMUFRfTU9WRVRPOgorICAgICAgICBjc0FQIDw8IHBQYXRoRGF0YVtpXS5wb2ludC54IDw8ICIgIiA8PCBwUGF0aERhdGFbaV0ucG9pbnQueSA8PCAiIG1cbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQV0xQVF9MSU5FVE86CisgICAgICAgIGNzQVAgPDwgcFBhdGhEYXRhW2ldLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpXS5wb2ludC55IDw8ICIgbFxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBXTFBUX0JFWklFUlRPOgorICAgICAgICBjc0FQIDw8IHBQYXRoRGF0YVtpXS5wb2ludC54IDw8ICIgIiA8PCBwUGF0aERhdGFbaV0ucG9pbnQueSA8PCAiICIKKyAgICAgICAgICAgICA8PCBwUGF0aERhdGFbaSArIDFdLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpICsgMV0ucG9pbnQueQorICAgICAgICAgICAgIDw8ICIgIiA8PCBwUGF0aERhdGFbaSArIDJdLnBvaW50LnggPDwgIiAiCisgICAgICAgICAgICAgPDwgcFBhdGhEYXRhW2kgKyAyXS5wb2ludC55IDw8ICIgY1xuIjsKIAotCQkJaSArPSAyOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KKyAgICAgICAgaSArPSAyOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQogCi0JcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0UGF0aERhdGFGcm9tQXJyYXkoQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUFdMX1BhdGhEYXRhKiBwUGF0aERhdGEsIGludDMyX3QgbkNvdW50KQotewotCXBhdGguU2V0UG9pbnRDb3VudChuQ291bnQpOwordm9pZCBDUFdMX1V0aWxzOjpHZXRQYXRoRGF0YUZyb21BcnJheShDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQpIHsKKyAgcGF0aC5TZXRQb2ludENvdW50KG5Db3VudCk7CiAKLQlmb3IgKGludDMyX3QgaT0wOyBpPG5Db3VudDsgaSsrKQotCXsKLQkJc3dpdGNoIChwUGF0aERhdGFbaV0udHlwZSkKLQkJewotCQljYXNlIFBXTFBUX01PVkVUTzoKLQkJCXBhdGguU2V0UG9pbnQoaSwgcFBhdGhEYXRhW2ldLnBvaW50LngsIHBQYXRoRGF0YVtpXS5wb2ludC55LCBGWFBUX01PVkVUTyk7Ci0JCQlicmVhazsKLQkJY2FzZSBQV0xQVF9MSU5FVE86Ci0JCQlwYXRoLlNldFBvaW50KGksIHBQYXRoRGF0YVtpXS5wb2ludC54LCBwUGF0aERhdGFbaV0ucG9pbnQueSwgRlhQVF9MSU5FVE8pOwotCQkJYnJlYWs7Ci0JCWNhc2UgUFdMUFRfQkVaSUVSVE86Ci0JCQlwYXRoLlNldFBvaW50KGksIHBQYXRoRGF0YVtpXS5wb2ludC54LCBwUGF0aERhdGFbaV0ucG9pbnQueSwgRlhQVF9CRVpJRVJUTyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgIHN3aXRjaCAocFBhdGhEYXRhW2ldLnR5cGUpIHsKKyAgICAgIGNhc2UgUFdMUFRfTU9WRVRPOgorICAgICAgICBwYXRoLlNldFBvaW50KGksIHBQYXRoRGF0YVtpXS5wb2ludC54LCBwUGF0aERhdGFbaV0ucG9pbnQueSwKKyAgICAgICAgICAgICAgICAgICAgICBGWFBUX01PVkVUTyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQV0xQVF9MSU5FVE86CisgICAgICAgIHBhdGguU2V0UG9pbnQoaSwgcFBhdGhEYXRhW2ldLnBvaW50LngsIHBQYXRoRGF0YVtpXS5wb2ludC55LAorICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBXTFBUX0JFWklFUlRPOgorICAgICAgICBwYXRoLlNldFBvaW50KGksIHBQYXRoRGF0YVtpXS5wb2ludC54LCBwUGF0aERhdGFbaV0ucG9pbnQueSwKKyAgICAgICAgICAgICAgICAgICAgICBGWFBUX0JFWklFUlRPKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIH0KIAorQ1BERl9SZWN0IENQV0xfVXRpbHM6Ok1heFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0MSwgY29uc3QgQ1BERl9SZWN0JiByZWN0MikgeworICBDUERGX1JlY3QgcmNSZXQ7CiAKLUNQREZfUmVjdCBDUFdMX1V0aWxzOjpNYXhSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QxLGNvbnN0IENQREZfUmVjdCAmIHJlY3QyKQotewotCUNQREZfUmVjdCByY1JldDsKLQotCXJjUmV0LmxlZnQgPSBQV0xfTUlOKHJlY3QxLmxlZnQscmVjdDIubGVmdCk7Ci0JcmNSZXQuYm90dG9tID0gUFdMX01JTihyZWN0MS5ib3R0b20scmVjdDIuYm90dG9tKTsKLQlyY1JldC5yaWdodCA9IFBXTF9NQVgocmVjdDEucmlnaHQscmVjdDIucmlnaHQpOwotCXJjUmV0LnRvcCA9IFBXTF9NQVgocmVjdDEudG9wLHJlY3QyLnRvcCk7CisgIHJjUmV0LmxlZnQgPSBQV0xfTUlOKHJlY3QxLmxlZnQsIHJlY3QyLmxlZnQpOworICByY1JldC5ib3R0b20gPSBQV0xfTUlOKHJlY3QxLmJvdHRvbSwgcmVjdDIuYm90dG9tKTsKKyAgcmNSZXQucmlnaHQgPSBQV0xfTUFYKHJlY3QxLnJpZ2h0LCByZWN0Mi5yaWdodCk7CisgIHJjUmV0LnRvcCA9IFBXTF9NQVgocmVjdDEudG9wLCByZWN0Mi50b3ApOwogCi0JcmV0dXJuIHJjUmV0OworICByZXR1cm4gcmNSZXQ7CiB9CiAKLUNQREZfUmVjdCBDUFdMX1V0aWxzOjpPZmZzZXRSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QsRlhfRkxPQVQgeCxGWF9GTE9BVCB5KQotewotCXJldHVybiBDUERGX1JlY3QocmVjdC5sZWZ0ICsgeCxyZWN0LmJvdHRvbSArIHksCi0JCXJlY3QucmlnaHQgKyB4LHJlY3QudG9wICsgeSk7CitDUERGX1JlY3QgQ1BXTF9VdGlsczo6T2Zmc2V0UmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSkgeworICByZXR1cm4gQ1BERl9SZWN0KHJlY3QubGVmdCArIHgsIHJlY3QuYm90dG9tICsgeSwgcmVjdC5yaWdodCArIHgsCisgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgKyB5KTsKIH0KIAotRlhfQk9PTCBDUFdMX1V0aWxzOjpDb250YWluc1JlY3QoY29uc3QgQ1BERl9SZWN0JiByY1BhcmVudCwgY29uc3QgQ1BERl9SZWN0JiByY0NoaWxkKQotewotCXJldHVybiByY0NoaWxkLmxlZnQgPj0gcmNQYXJlbnQubGVmdCAmJiByY0NoaWxkLmJvdHRvbSA+PSByY1BhcmVudC5ib3R0b20gJiYKLQkJCXJjQ2hpbGQucmlnaHQgPD0gcmNQYXJlbnQucmlnaHQgJiYgcmNDaGlsZC50b3AgPD0gcmNQYXJlbnQudG9wOworRlhfQk9PTCBDUFdMX1V0aWxzOjpDb250YWluc1JlY3QoY29uc3QgQ1BERl9SZWN0JiByY1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCkgeworICByZXR1cm4gcmNDaGlsZC5sZWZ0ID49IHJjUGFyZW50LmxlZnQgJiYgcmNDaGlsZC5ib3R0b20gPj0gcmNQYXJlbnQuYm90dG9tICYmCisgICAgICAgICByY0NoaWxkLnJpZ2h0IDw9IHJjUGFyZW50LnJpZ2h0ICYmIHJjQ2hpbGQudG9wIDw9IHJjUGFyZW50LnRvcDsKIH0KIAotRlhfQk9PTCBDUFdMX1V0aWxzOjpJbnRlcnNlY3RSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsIGNvbnN0IENQREZfUmVjdCYgcmVjdDIpCi17Ci0JRlhfRkxPQVQgbGVmdCA9IHJlY3QxLmxlZnQgPiByZWN0Mi5sZWZ0ID8gcmVjdDEubGVmdCA6IHJlY3QyLmxlZnQ7Ci0JRlhfRkxPQVQgcmlnaHQgPSByZWN0MS5yaWdodCA8IHJlY3QyLnJpZ2h0ID8gcmVjdDEucmlnaHQgOiByZWN0Mi5yaWdodDsKLQlGWF9GTE9BVCBib3R0b20gPSByZWN0MS5ib3R0b20gPiByZWN0Mi5ib3R0b20gPyByZWN0MS5ib3R0b20gOiByZWN0Mi5ib3R0b207Ci0JRlhfRkxPQVQgdG9wID0gcmVjdDEudG9wIDwgcmVjdDIudG9wID8gcmVjdDEudG9wIDogcmVjdDIudG9wOworRlhfQk9PTCBDUFdMX1V0aWxzOjpJbnRlcnNlY3RSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByZWN0MikgeworICBGWF9GTE9BVCBsZWZ0ID0gcmVjdDEubGVmdCA+IHJlY3QyLmxlZnQgPyByZWN0MS5sZWZ0IDogcmVjdDIubGVmdDsKKyAgRlhfRkxPQVQgcmlnaHQgPSByZWN0MS5yaWdodCA8IHJlY3QyLnJpZ2h0ID8gcmVjdDEucmlnaHQgOiByZWN0Mi5yaWdodDsKKyAgRlhfRkxPQVQgYm90dG9tID0gcmVjdDEuYm90dG9tID4gcmVjdDIuYm90dG9tID8gcmVjdDEuYm90dG9tIDogcmVjdDIuYm90dG9tOworICBGWF9GTE9BVCB0b3AgPSByZWN0MS50b3AgPCByZWN0Mi50b3AgPyByZWN0MS50b3AgOiByZWN0Mi50b3A7CiAKLQlyZXR1cm4gbGVmdCA8IHJpZ2h0ICYmIGJvdHRvbSA8IHRvcDsKKyAgcmV0dXJuIGxlZnQgPCByaWdodCAmJiBib3R0b20gPCB0b3A7CiB9CiAKLUNQREZfUG9pbnQgQ1BXTF9VdGlsczo6T2Zmc2V0UG9pbnQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsRlhfRkxPQVQgeCxGWF9GTE9BVCB5KQotewotCXJldHVybiBDUERGX1BvaW50KHBvaW50LnggKyB4LHBvaW50LnkgKyB5KTsKK0NQREZfUG9pbnQgQ1BXTF9VdGlsczo6T2Zmc2V0UG9pbnQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkpIHsKKyAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIHgsIHBvaW50LnkgKyB5KTsKIH0KIAotQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9VdGlsczo6T3ZlcmxhcFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyMSwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cjIpCi17Ci0JQ1BWVF9Xb3JkUmFuZ2Ugd3JSZXQ7CitDUFZUX1dvcmRSYW5nZSBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpIHsKKyAgQ1BWVF9Xb3JkUmFuZ2Ugd3JSZXQ7CiAKLQlpZiAod3IyLkVuZFBvcy5Xb3JkQ21wKHdyMS5CZWdpblBvcykgPCAwIHx8IHdyMi5CZWdpblBvcy5Xb3JkQ21wKHdyMS5FbmRQb3MpID4gMCkgcmV0dXJuIHdyUmV0OwotCWlmICh3cjEuRW5kUG9zLldvcmRDbXAod3IyLkJlZ2luUG9zKSA8IDAgfHwgd3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkVuZFBvcykgPiAwKSByZXR1cm4gd3JSZXQ7CisgIGlmICh3cjIuRW5kUG9zLldvcmRDbXAod3IxLkJlZ2luUG9zKSA8IDAgfHwKKyAgICAgIHdyMi5CZWdpblBvcy5Xb3JkQ21wKHdyMS5FbmRQb3MpID4gMCkKKyAgICByZXR1cm4gd3JSZXQ7CisgIGlmICh3cjEuRW5kUG9zLldvcmRDbXAod3IyLkJlZ2luUG9zKSA8IDAgfHwKKyAgICAgIHdyMS5CZWdpblBvcy5Xb3JkQ21wKHdyMi5FbmRQb3MpID4gMCkKKyAgICByZXR1cm4gd3JSZXQ7CiAKLQlpZiAod3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkJlZ2luUG9zKSA8IDApCi0JewotCQl3clJldC5CZWdpblBvcyA9IHdyMi5CZWdpblBvczsKLQl9Ci0JZWxzZQotCXsKLQkJd3JSZXQuQmVnaW5Qb3MgPSB3cjEuQmVnaW5Qb3M7Ci0JfQorICBpZiAod3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkJlZ2luUG9zKSA8IDApIHsKKyAgICB3clJldC5CZWdpblBvcyA9IHdyMi5CZWdpblBvczsKKyAgfSBlbHNlIHsKKyAgICB3clJldC5CZWdpblBvcyA9IHdyMS5CZWdpblBvczsKKyAgfQogCi0JaWYgKHdyMS5FbmRQb3MuV29yZENtcCh3cjIuRW5kUG9zKSA8IDApCi0JewotCQl3clJldC5FbmRQb3MgPSB3cjEuRW5kUG9zOwotCX0KLQllbHNlCi0JewotCQl3clJldC5FbmRQb3MgPSB3cjIuRW5kUG9zOwotCX0KKyAgaWYgKHdyMS5FbmRQb3MuV29yZENtcCh3cjIuRW5kUG9zKSA8IDApIHsKKyAgICB3clJldC5FbmRQb3MgPSB3cjEuRW5kUG9zOworICB9IGVsc2UgeworICAgIHdyUmV0LkVuZFBvcyA9IHdyMi5FbmRQb3M7CisgIH0KIAotCXJldHVybiB3clJldDsKKyAgcmV0dXJuIHdyUmV0OwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9DaGVjayhjb25zdCBDUERGX1JlY3QgJiBjckJCb3gpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9DaGVjayhjb25zdCBDUERGX1JlY3QmIGNyQkJveCkgeworICBDRlhfQnl0ZVRleHRCdWYgY3NBUDsKIAotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCWNvbnN0IGludDMyX3QgbnVtID0gODsKKyAgY29uc3QgaW50MzJfdCBudW0gPSA4OwogCi0JQ1BXTF9Qb2ludCBwdHNbbnVtKjNdID0KLQl7Ci0JCS8vMQotCQlDUFdMX1BvaW50KDAuMjhmLCAwLjUyZiksCi0JCUNQV0xfUG9pbnQoMC4yN2YsIDAuNDhmKSwKLQkJQ1BXTF9Qb2ludCgwLjI5ZiwgMC40MGYpLAorICBDUFdMX1BvaW50IHB0c1tudW0gKiAzXSA9IHsvLyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC4yOGYsIDAuNTJmKSwgQ1BXTF9Qb2ludCgwLjI3ZiwgMC40OGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1BvaW50KDAuMjlmLCAwLjQwZiksCiAKLQkJLy8yCi0JCUNQV0xfUG9pbnQoMC4zMGYsIDAuMzNmKSwKLQkJQ1BXTF9Qb2ludCgwLjMxZiwgMC4yOWYpLAotCQlDUFdMX1BvaW50KDAuMzFmLCAwLjI4ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Qb2ludCgwLjMwZiwgMC4zM2YpLCBDUFdMX1BvaW50KDAuMzFmLCAwLjI5ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC4zMWYsIDAuMjhmKSwKIAotCQkvLzMKLQkJQ1BXTF9Qb2ludCgwLjM5ZiwgMC4yOGYpLAotCQlDUFdMX1BvaW50KDAuNDlmLCAwLjI5ZiksCi0JCUNQV0xfUG9pbnQoMC43N2YsIDAuNjdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1BvaW50KDAuMzlmLCAwLjI4ZiksIENQV0xfUG9pbnQoMC40OWYsIDAuMjlmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Qb2ludCgwLjc3ZiwgMC42N2YpLAogCi0JCS8vNAotCQlDUFdMX1BvaW50KDAuNzZmLCAwLjY4ZiksCi0JCUNQV0xfUG9pbnQoMC43OGYsIDAuNjlmKSwKLQkJQ1BXTF9Qb2ludCgwLjc2ZiwgMC43NWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC43NmYsIDAuNjhmKSwgQ1BXTF9Qb2ludCgwLjc4ZiwgMC42OWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1BvaW50KDAuNzZmLCAwLjc1ZiksCiAKLQkJLy81Ci0JCUNQV0xfUG9pbnQoMC43NmYsIDAuNzVmKSwKLQkJQ1BXTF9Qb2ludCgwLjczZiwgMC44MGYpLAotCQlDUFdMX1BvaW50KDAuNjhmLCAwLjc1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Qb2ludCgwLjc2ZiwgMC43NWYpLCBDUFdMX1BvaW50KDAuNzNmLCAwLjgwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC42OGYsIDAuNzVmKSwKIAotCQkvLzYKLQkJQ1BXTF9Qb2ludCgwLjY4ZiwgMC43NGYpLAotCQlDUFdMX1BvaW50KDAuNjhmLCAwLjc0ZiksCi0JCUNQV0xfUG9pbnQoMC40NGYsIDAuNDdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1BvaW50KDAuNjhmLCAwLjc0ZiksIENQV0xfUG9pbnQoMC42OGYsIDAuNzRmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Qb2ludCgwLjQ0ZiwgMC40N2YpLAogCi0JCS8vNwotCQlDUFdMX1BvaW50KDAuNDNmLCAwLjQ3ZiksCi0JCUNQV0xfUG9pbnQoMC40MGYsIDAuNDdmKSwKLQkJQ1BXTF9Qb2ludCgwLjQxZiwgMC41OGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC40M2YsIDAuNDdmKSwgQ1BXTF9Qb2ludCgwLjQwZiwgMC40N2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1BvaW50KDAuNDFmLCAwLjU4ZiksCiAKLQkJLy84Ci0JCUNQV0xfUG9pbnQoMC40MGYsIDAuNjBmKSwKLQkJQ1BXTF9Qb2ludCgwLjI4ZiwgMC42NmYpLAotCQlDUFdMX1BvaW50KDAuMzBmLCAwLjU2ZikKLQl9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC40MGYsIDAuNjBmKSwgQ1BXTF9Qb2ludCgwLjI4ZiwgMC42NmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1BvaW50KDAuMzBmLCAwLjU2Zil9OwogCi0JZm9yIChpbnQzMl90IGo9MDsgajxudW0qMzsgaisrKQotCXsKLQkJcHRzW2pdLnggKj0gZldpZHRoOwotCQlwdHNbal0ueCArPSBjckJCb3gubGVmdDsKKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtICogMzsgaisrKSB7CisgICAgcHRzW2pdLnggKj0gZldpZHRoOworICAgIHB0c1tqXS54ICs9IGNyQkJveC5sZWZ0OwogCi0JCXB0c1tqXS55ICo9IGZIZWlnaHQ7Ci0JCXB0c1tqXS55ICs9IGNyQkJveC5ib3R0b207Ci0JfQorICAgIHB0c1tqXS55ICo9IGZIZWlnaHQ7CisgICAgcHRzW2pdLnkgKz0gY3JCQm94LmJvdHRvbTsKKyAgfQogCi0JY3NBUCA8PCBwdHNbMF0ueCA8PCAiICIgPDwgcHRzWzBdLnkgPDwgIiBtXG4iOworICBjc0FQIDw8IHB0c1swXS54IDw8ICIgIiA8PCBwdHNbMF0ueSA8PCAiIG1cbiI7CiAKLQlmb3IgKGludDMyX3QgaT0wOyBpPG51bTsgaSsrKQotCXsKLQkJaW50MzJfdCBuQ3VyID0gaSozOwotCQlpbnQzMl90IG4xID0gaSozICsgMTsKLQkJaW50MzJfdCBuMiA9IGkqMyArIDI7Ci0JCWludDMyX3Qgbk5leHQgPSAoaSA8IG51bS0xID8gKGkrMSkqMyA6IDApOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgIGludDMyX3QgbkN1ciA9IGkgKiAzOworICAgIGludDMyX3QgbjEgPSBpICogMyArIDE7CisgICAgaW50MzJfdCBuMiA9IGkgKiAzICsgMjsKKyAgICBpbnQzMl90IG5OZXh0ID0gKGkgPCBudW0gLSAxID8gKGkgKyAxKSAqIDMgOiAwKTsKIAotCQlGWF9GTE9BVCBweDEgPSBwdHNbbjFdLnggLSBwdHNbbkN1cl0ueDsKLQkJRlhfRkxPQVQgcHkxID0gcHRzW24xXS55IC0gcHRzW25DdXJdLnk7Ci0JCUZYX0ZMT0FUIHB4MiA9IHB0c1tuMl0ueCAtIHB0c1tuTmV4dF0ueDsKLQkJRlhfRkxPQVQgcHkyID0gcHRzW24yXS55IC0gcHRzW25OZXh0XS55OworICAgIEZYX0ZMT0FUIHB4MSA9IHB0c1tuMV0ueCAtIHB0c1tuQ3VyXS54OworICAgIEZYX0ZMT0FUIHB5MSA9IHB0c1tuMV0ueSAtIHB0c1tuQ3VyXS55OworICAgIEZYX0ZMT0FUIHB4MiA9IHB0c1tuMl0ueCAtIHB0c1tuTmV4dF0ueDsKKyAgICBGWF9GTE9BVCBweTIgPSBwdHNbbjJdLnkgLSBwdHNbbk5leHRdLnk7CiAKLQkJY3NBUCA8PCBwdHNbbkN1cl0ueCArIHB4MSAqIFBXTF9CRVpJRVIgPDwgIiAiIDw8IHB0c1tuQ3VyXS55ICsgcHkxICogUFdMX0JFWklFUiA8PCAiICIKLQkJCTw8IHB0c1tuTmV4dF0ueCArIHB4MiAqIFBXTF9CRVpJRVIgPDwgIiAiIDw8IHB0c1tuTmV4dF0ueSArIHB5MiAqIFBXTF9CRVpJRVIgPDwgIiAiCi0JCQk8PCBwdHNbbk5leHRdLnggPDwgIiAiIDw8IHB0c1tuTmV4dF0ueSA8PCAiIGNcbiI7Ci0JfQorICAgIGNzQVAgPDwgcHRzW25DdXJdLnggKyBweDEgKiBQV0xfQkVaSUVSIDw8ICIgIgorICAgICAgICAgPDwgcHRzW25DdXJdLnkgKyBweTEgKiBQV0xfQkVaSUVSIDw8ICIgIgorICAgICAgICAgPDwgcHRzW25OZXh0XS54ICsgcHgyICogUFdMX0JFWklFUiA8PCAiICIKKyAgICAgICAgIDw8IHB0c1tuTmV4dF0ueSArIHB5MiAqIFBXTF9CRVpJRVIgPDwgIiAiIDw8IHB0c1tuTmV4dF0ueCA8PCAiICIKKyAgICAgICAgIDw8IHB0c1tuTmV4dF0ueSA8PCAiIGNcbiI7CisgIH0KIAotCXJldHVybiBjc0FQLkdldEJ5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUoY29uc3QgQ1BERl9SZWN0ICYgY3JCQm94KQotewotCUNGWF9CeXRlVGV4dEJ1ZiBjc0FQOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QVBfQ2lyY2xlKGNvbnN0IENQREZfUmVjdCYgY3JCQm94KSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBjc0FQOwogCi0JRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BERl9Qb2ludCBwdDEoY3JCQm94LmxlZnQsY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyKTsKLQlDUERGX1BvaW50IHB0MihjckJCb3gubGVmdCArIGZXaWR0aCAvIDIsY3JCQm94LnRvcCk7Ci0JQ1BERl9Qb2ludCBwdDMoY3JCQm94LnJpZ2h0LGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMik7Ci0JQ1BERl9Qb2ludCBwdDQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLGNyQkJveC5ib3R0b20pOworICBDUERGX1BvaW50IHB0MShjckJCb3gubGVmdCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyKTsKKyAgQ1BERl9Qb2ludCBwdDIoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLCBjckJCb3gudG9wKTsKKyAgQ1BERl9Qb2ludCBwdDMoY3JCQm94LnJpZ2h0LCBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIpOworICBDUERGX1BvaW50IHB0NChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIsIGNyQkJveC5ib3R0b20pOwogCi0JY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOworICBjc0FQIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7CiAKLQlGWF9GTE9BVCBweCA9IHB0Mi54IC0gcHQxLng7Ci0JRlhfRkxPQVQgcHkgPSBwdDIueSAtIHB0MS55OworICBGWF9GTE9BVCBweCA9IHB0Mi54IC0gcHQxLng7CisgIEZYX0ZMT0FUIHB5ID0gcHQyLnkgLSBwdDEueTsKIAotCWNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55ICsgcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgotCQk8PCBwdDIueCAtIHB4ICogUFdMX0JFWklFUiA8PCAiICIgPDwgcHQyLnkgPDwgIiAiCi0JCTw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGNcbiI7CisgIGNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55ICsgcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgorICAgICAgIDw8IHB0Mi54IC0gcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgPDwgcHQyLnggPDwgIiAiCisgICAgICAgPDwgcHQyLnkgPDwgIiBjXG4iOwogCi0JcHggPSBwdDMueCAtIHB0Mi54OwotCXB5ID0gcHQyLnkgLSBwdDMueTsKKyAgcHggPSBwdDMueCAtIHB0Mi54OworICBweSA9IHB0Mi55IC0gcHQzLnk7CiAKLQljc0FQIDw8IHB0Mi54ICsgcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIKLQkJPDwgcHQzLnggPDwgIiAiIDw8IHB0My55ICsgcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgotCQk8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBjXG4iOworICBjc0FQIDw8IHB0Mi54ICsgcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgPDwgcHQzLnggPDwgIiAiCisgICAgICAgPDwgcHQzLnkgKyBweSAqIFBXTF9CRVpJRVIgPDwgIiAiIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGNcbiI7CiAKLQlweCA9IHB0My54IC0gcHQ0Lng7Ci0JcHkgPSBwdDMueSAtIHB0NC55OworICBweCA9IHB0My54IC0gcHQ0Lng7CisgIHB5ID0gcHQzLnkgLSBwdDQueTsKIAotCWNzQVAgPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IC0gcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgotCQk8PCBwdDQueCArIHB4ICogUFdMX0JFWklFUiA8PCAiICIgPDwgcHQ0LnkgPDwgIiAiCi0JCTw8IHB0NC54IDw8ICIgIiA8PCBwdDQueSA8PCAiIGNcbiI7CisgIGNzQVAgPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IC0gcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgorICAgICAgIDw8IHB0NC54ICsgcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDQueSA8PCAiICIgPDwgcHQ0LnggPDwgIiAiCisgICAgICAgPDwgcHQ0LnkgPDwgIiBjXG4iOwogCi0JcHggPSBwdDQueCAtIHB0MS54OwotCXB5ID0gcHQxLnkgLSBwdDQueTsKKyAgcHggPSBwdDQueCAtIHB0MS54OworICBweSA9IHB0MS55IC0gcHQ0Lnk7CiAKLQljc0FQIDw8IHB0NC54IC0gcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDQueSA8PCAiICIKLQkJPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IC0gcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgotCQk8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBjXG4iOworICBjc0FQIDw8IHB0NC54IC0gcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDQueSA8PCAiICIgPDwgcHQxLnggPDwgIiAiCisgICAgICAgPDwgcHQxLnkgLSBweSAqIFBXTF9CRVpJRVIgPDwgIiAiIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGNcbiI7CiAKLQlyZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBjc0FQLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QVBfQ3Jvc3MoY29uc3QgQ1BERl9SZWN0ICYgY3JCQm94KQotewotCUNGWF9CeXRlVGV4dEJ1ZiBjc0FQOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QVBfQ3Jvc3MoY29uc3QgQ1BERl9SZWN0JiBjckJCb3gpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CiAKLQljc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbVxuIjsKLQljc0FQIDw8IGNyQkJveC5yaWdodCA8PCAiICIgPDwgY3JCQm94LmJvdHRvbSA8PCAiIGxcbiI7Ci0JY3NBUCA8PCBjckJCb3gubGVmdCA8PCAiICIgPDwgY3JCQm94LmJvdHRvbSA8PCAiIG1cbiI7Ci0JY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC50b3AgPDwgIiBsXG4iOworICBjc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbVxuIjsKKyAgY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC5ib3R0b20gPDwgIiBsXG4iOworICBjc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3guYm90dG9tIDw8ICIgbVxuIjsKKyAgY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC50b3AgPDwgIiBsXG4iOwogCi0JcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX0RpYW1vbmQoY29uc3QgQ1BERl9SZWN0ICYgY3JCQm94KQotewotCUNGWF9CeXRlVGV4dEJ1ZiBjc0FQOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QVBfRGlhbW9uZChjb25zdCBDUERGX1JlY3QmIGNyQkJveCkgeworICBDRlhfQnl0ZVRleHRCdWYgY3NBUDsKIAotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUNQREZfUG9pbnQgcHQxKGNyQkJveC5sZWZ0LGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMik7Ci0JQ1BERl9Qb2ludCBwdDIoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLGNyQkJveC50b3ApOwotCUNQREZfUG9pbnQgcHQzKGNyQkJveC5yaWdodCxjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIpOwotCUNQREZfUG9pbnQgcHQ0KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMixjckJCb3guYm90dG9tKTsKKyAgQ1BERl9Qb2ludCBwdDEoY3JCQm94LmxlZnQsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMik7CisgIENQREZfUG9pbnQgcHQyKGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMiwgY3JCQm94LnRvcCk7CisgIENQREZfUG9pbnQgcHQzKGNyQkJveC5yaWdodCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyKTsKKyAgQ1BERl9Qb2ludCBwdDQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLCBjckJCb3guYm90dG9tKTsKIAotCWNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKLQljc0FQIDw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGxcbiI7Ci0JY3NBUCA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwotCWNzQVAgPDwgcHQ0LnggPDwgIiAiIDw8IHB0NC55IDw8ICIgbFxuIjsKLQljc0FQIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGxcbiI7CisgIGNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKKyAgY3NBUCA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOworICBjc0FQIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGxcbiI7CisgIGNzQVAgPDwgcHQ0LnggPDwgIiAiIDw8IHB0NC55IDw8ICIgbFxuIjsKKyAgY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsXG4iOwogCi0JcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX1NxdWFyZShjb25zdCBDUERGX1JlY3QgJiBjckJCb3gpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9TcXVhcmUoY29uc3QgQ1BERl9SZWN0JiBjckJCb3gpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CiAKLQljc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbVxuIjsKLQljc0FQIDw8IGNyQkJveC5yaWdodCA8PCAiICIgPDwgY3JCQm94LnRvcCA8PCAiIGxcbiI7Ci0JY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC5ib3R0b20gPDwgIiBsXG4iOwotCWNzQVAgPDwgY3JCQm94LmxlZnQgPDwgIiAiIDw8IGNyQkJveC5ib3R0b20gPDwgIiBsXG4iOwotCWNzQVAgPDwgY3JCQm94LmxlZnQgPDwgIiAiIDw8IGNyQkJveC50b3AgPDwgIiBsXG4iOworICBjc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbVxuIjsKKyAgY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC50b3AgPDwgIiBsXG4iOworICBjc0FQIDw8IGNyQkJveC5yaWdodCA8PCAiICIgPDwgY3JCQm94LmJvdHRvbSA8PCAiIGxcbiI7CisgIGNzQVAgPDwgY3JCQm94LmxlZnQgPDwgIiAiIDw8IGNyQkJveC5ib3R0b20gPDwgIiBsXG4iOworICBjc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbFxuIjsKIAotCXJldHVybiBjc0FQLkdldEJ5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9TdGFyKGNvbnN0IENQREZfUmVjdCAmIGNyQkJveCkKLXsKLQlDRlhfQnl0ZVRleHRCdWYgY3NBUDsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX1N0YXIoY29uc3QgQ1BERl9SZWN0JiBjckJCb3gpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CiAKLQlGWF9GTE9BVCBmUmFkaXVzID0gKGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tKS8oMSsoRlhfRkxPQVQpY29zKFBXTF9QSS81LjBmKSk7Ci0JQ1BERl9Qb2ludCBwdENlbnRlciA9IENQREZfUG9pbnQoKGNyQkJveC5sZWZ0ICsgY3JCQm94LnJpZ2h0KSAvIDIuMGYsKGNyQkJveC50b3AgKyBjckJCb3guYm90dG9tKSAvIDIuMGYpOworICBGWF9GTE9BVCBmUmFkaXVzID0KKyAgICAgIChjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbSkgLyAoMSArIChGWF9GTE9BVCljb3MoUFdMX1BJIC8gNS4wZikpOworICBDUERGX1BvaW50IHB0Q2VudGVyID0gQ1BERl9Qb2ludCgoY3JCQm94LmxlZnQgKyBjckJCb3gucmlnaHQpIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNyQkJveC50b3AgKyBjckJCb3guYm90dG9tKSAvIDIuMGYpOwogCi0JRlhfRkxPQVQgcHhbNV0scHlbNV07CisgIEZYX0ZMT0FUIHB4WzVdLCBweVs1XTsKIAotCUZYX0ZMT0FUIGZBbmdlbCA9IFBXTF9QSS8xMC4wZjsKKyAgRlhfRkxPQVQgZkFuZ2VsID0gUFdMX1BJIC8gMTAuMGY7CiAKLQlmb3IgKGludDMyX3QgaT0wOyBpPDU7IGkrKykKLQl7Ci0JCXB4W2ldID0gcHRDZW50ZXIueCArIGZSYWRpdXMgKiAoRlhfRkxPQVQpY29zKGZBbmdlbCk7Ci0JCXB5W2ldID0gcHRDZW50ZXIueSArIGZSYWRpdXMgKiAoRlhfRkxPQVQpc2luKGZBbmdlbCk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgIHB4W2ldID0gcHRDZW50ZXIueCArIGZSYWRpdXMgKiAoRlhfRkxPQVQpY29zKGZBbmdlbCk7CisgICAgcHlbaV0gPSBwdENlbnRlci55ICsgZlJhZGl1cyAqIChGWF9GTE9BVClzaW4oZkFuZ2VsKTsKIAotCQlmQW5nZWwgKz0gUFdMX1BJICogMiAvIDUuMGY7Ci0JfQorICAgIGZBbmdlbCArPSBQV0xfUEkgKiAyIC8gNS4wZjsKKyAgfQogCi0JY3NBUCA8PCBweFswXSA8PCAiICIgPDwgcHlbMF0gPDwgIiBtXG4iOworICBjc0FQIDw8IHB4WzBdIDw8ICIgIiA8PCBweVswXSA8PCAiIG1cbiI7CiAKLQlpbnQzMl90IG5OZXh0ID0gMDsKLQlmb3IgKGludDMyX3Qgaj0wOyBqPDU7IGorKykKLQl7Ci0JCW5OZXh0ICs9IDI7Ci0JCWlmIChuTmV4dCA+PSA1KSBuTmV4dCAtPSA1OwotCQljc0FQIDw8IHB4W25OZXh0XSA8PCAiICIgPDwgcHlbbk5leHRdIDw8ICIgbFxuIjsKLQl9CisgIGludDMyX3Qgbk5leHQgPSAwOworICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCA1OyBqKyspIHsKKyAgICBuTmV4dCArPSAyOworICAgIGlmIChuTmV4dCA+PSA1KQorICAgICAgbk5leHQgLT0gNTsKKyAgICBjc0FQIDw8IHB4W25OZXh0XSA8PCAiICIgPDwgcHlbbk5leHRdIDw8ICIgbFxuIjsKKyAgfQogCi0JcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX0hhbGZDaXJjbGUoY29uc3QgQ1BERl9SZWN0ICYgY3JCQm94LEZYX0ZMT0FUIGZSb3RhdGUpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9IYWxmQ2lyY2xlKGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUm90YXRlKSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBjc0FQOwogCi0JRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwotCi0JQ1BERl9Qb2ludCBwdDEoLWZXaWR0aC8yLDApOwotCUNQREZfUG9pbnQgcHQyKDAsZkhlaWdodC8yKTsKLQlDUERGX1BvaW50IHB0MyhmV2lkdGgvMiwwKTsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUZYX0ZMT0FUIHB4LHB5OworICBDUERGX1BvaW50IHB0MSgtZldpZHRoIC8gMiwgMCk7CisgIENQREZfUG9pbnQgcHQyKDAsIGZIZWlnaHQgLyAyKTsKKyAgQ1BERl9Qb2ludCBwdDMoZldpZHRoIC8gMiwgMCk7CiAKLQljc0FQIDw8IGNvcyhmUm90YXRlKSA8PCAiICIgPDwgc2luKGZSb3RhdGUpIDw8ICIgIiA8PCAtc2luKGZSb3RhdGUpIDw8ICIgIiA8PCBjb3MoZlJvdGF0ZSkgPDwgIiAiCi0JCTw8IGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyIDw8ICIgY21cbiI7CisgIEZYX0ZMT0FUIHB4LCBweTsKIAorICBjc0FQIDw8IGNvcyhmUm90YXRlKSA8PCAiICIgPDwgc2luKGZSb3RhdGUpIDw8ICIgIiA8PCAtc2luKGZSb3RhdGUpIDw8ICIgIgorICAgICAgIDw8IGNvcyhmUm90YXRlKSA8PCAiICIgPDwgY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyIDw8ICIgIgorICAgICAgIDw8IGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMiA8PCAiIGNtXG4iOwogCi0JY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOworICBjc0FQIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7CiAKLQlweCA9IHB0Mi54IC0gcHQxLng7Ci0JcHkgPSBwdDIueSAtIHB0MS55OworICBweCA9IHB0Mi54IC0gcHQxLng7CisgIHB5ID0gcHQyLnkgLSBwdDEueTsKIAotCWNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55ICsgcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgotCQk8PCBwdDIueCAtIHB4ICogUFdMX0JFWklFUiA8PCAiICIgPDwgcHQyLnkgPDwgIiAiCi0JCTw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGNcbiI7CisgIGNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55ICsgcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgorICAgICAgIDw8IHB0Mi54IC0gcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgPDwgcHQyLnggPDwgIiAiCisgICAgICAgPDwgcHQyLnkgPDwgIiBjXG4iOwogCi0JcHggPSBwdDMueCAtIHB0Mi54OwotCXB5ID0gcHQyLnkgLSBwdDMueTsKKyAgcHggPSBwdDMueCAtIHB0Mi54OworICBweSA9IHB0Mi55IC0gcHQzLnk7CiAKLQljc0FQIDw8IHB0Mi54ICsgcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIKLQkJPDwgcHQzLnggPDwgIiAiIDw8IHB0My55ICsgcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgotCQk8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBjXG4iOworICBjc0FQIDw8IHB0Mi54ICsgcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgPDwgcHQzLnggPDwgIiAiCisgICAgICAgPDwgcHQzLnkgKyBweSAqIFBXTF9CRVpJRVIgPDwgIiAiIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGNcbiI7CiAKLQlyZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBjc0FQLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotCi1DUERGX1JlY3QgQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmNSZWN0LCBGWF9GTE9BVCBmU2l6ZSkKLXsKLQlpZiAocmNSZWN0LklzRW1wdHkoKSkgcmV0dXJuIHJjUmVjdDsKK0NQREZfUmVjdCBDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUmVjdCwgRlhfRkxPQVQgZlNpemUpIHsKKyAgaWYgKHJjUmVjdC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHJjUmVjdDsKIAotCUNQREZfUmVjdCByY05ldyhyY1JlY3QubGVmdCAtIGZTaXplLAotCQkJCQlyY1JlY3QuYm90dG9tIC0gZlNpemUsCi0JCQkJCXJjUmVjdC5yaWdodCArIGZTaXplLAotCQkJCQlyY1JlY3QudG9wICsgZlNpemUpOwotCXJjTmV3Lk5vcm1hbGl6ZSgpOwotCXJldHVybiByY05ldzsKKyAgQ1BERl9SZWN0IHJjTmV3KHJjUmVjdC5sZWZ0IC0gZlNpemUsIHJjUmVjdC5ib3R0b20gLSBmU2l6ZSwKKyAgICAgICAgICAgICAgICAgIHJjUmVjdC5yaWdodCArIGZTaXplLCByY1JlY3QudG9wICsgZlNpemUpOworICByY05ldy5Ob3JtYWxpemUoKTsKKyAgcmV0dXJuIHJjTmV3OwogfQogCi1DUERGX1JlY3QgQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmNSZWN0LCBGWF9GTE9BVCBmU2l6ZSkKLXsKLQlpZiAocmNSZWN0LklzRW1wdHkoKSkgcmV0dXJuIHJjUmVjdDsKK0NQREZfUmVjdCBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUmVjdCwgRlhfRkxPQVQgZlNpemUpIHsKKyAgaWYgKHJjUmVjdC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHJjUmVjdDsKIAotCUNQREZfUmVjdCByY05ldyhyY1JlY3QubGVmdCArIGZTaXplLAotCQkJCQlyY1JlY3QuYm90dG9tICsgZlNpemUsCi0JCQkJCXJjUmVjdC5yaWdodCAtIGZTaXplLAotCQkJCQlyY1JlY3QudG9wIC0gZlNpemUpOwotCXJjTmV3Lk5vcm1hbGl6ZSgpOwotCXJldHVybiByY05ldzsKKyAgQ1BERl9SZWN0IHJjTmV3KHJjUmVjdC5sZWZ0ICsgZlNpemUsIHJjUmVjdC5ib3R0b20gKyBmU2l6ZSwKKyAgICAgICAgICAgICAgICAgIHJjUmVjdC5yaWdodCAtIGZTaXplLCByY1JlY3QudG9wIC0gZlNpemUpOworICByY05ldy5Ob3JtYWxpemUoKTsKKyAgcmV0dXJuIHJjTmV3OwogfQogCi1DUERGX1JlY3QgQ1BXTF9VdGlsczo6U2NhbGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJjUmVjdCxGWF9GTE9BVCBmU2NhbGUpCi17Ci0JRlhfRkxPQVQgZkhhbGZXaWR0aCA9IChyY1JlY3QucmlnaHQgLSByY1JlY3QubGVmdCkgLyAyLjBmOwotCUZYX0ZMT0FUIGZIYWxmSGVpZ2h0ID0gKHJjUmVjdC50b3AgLSByY1JlY3QuYm90dG9tKSAvIDIuMGY7CitDUERGX1JlY3QgQ1BXTF9VdGlsczo6U2NhbGVSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNSZWN0LCBGWF9GTE9BVCBmU2NhbGUpIHsKKyAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IChyY1JlY3QucmlnaHQgLSByY1JlY3QubGVmdCkgLyAyLjBmOworICBGWF9GTE9BVCBmSGFsZkhlaWdodCA9IChyY1JlY3QudG9wIC0gcmNSZWN0LmJvdHRvbSkgLyAyLjBmOwogCi0JQ1BERl9Qb2ludCBwdENlbnRlciA9IENQREZfUG9pbnQoKHJjUmVjdC5sZWZ0ICsgcmNSZWN0LnJpZ2h0KSAvIDIsKHJjUmVjdC50b3AgKyByY1JlY3QuYm90dG9tKSAvIDIpOworICBDUERGX1BvaW50IHB0Q2VudGVyID0gQ1BERl9Qb2ludCgocmNSZWN0LmxlZnQgKyByY1JlY3QucmlnaHQpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJjUmVjdC50b3AgKyByY1JlY3QuYm90dG9tKSAvIDIpOwogCi0JcmV0dXJuIENQREZfUmVjdChwdENlbnRlci54IC0gZkhhbGZXaWR0aCAqIGZTY2FsZSwKLQkJCQlwdENlbnRlci55IC0gZkhhbGZIZWlnaHQgKiBmU2NhbGUsCi0JCQkJcHRDZW50ZXIueCArIGZIYWxmV2lkdGggKiBmU2NhbGUsCi0JCQkJcHRDZW50ZXIueSArIGZIYWxmSGVpZ2h0ICogZlNjYWxlKTsKKyAgcmV0dXJuIENQREZfUmVjdCgKKyAgICAgIHB0Q2VudGVyLnggLSBmSGFsZldpZHRoICogZlNjYWxlLCBwdENlbnRlci55IC0gZkhhbGZIZWlnaHQgKiBmU2NhbGUsCisgICAgICBwdENlbnRlci54ICsgZkhhbGZXaWR0aCAqIGZTY2FsZSwgcHRDZW50ZXIueSArIGZIYWxmSGVpZ2h0ICogZlNjYWxlKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmVjdCxjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgeworICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKIAotCUNGWF9CeXRlU3RyaW5nIHNDb2xvciA9IEdldENvbG9yQXBwU3RyZWFtKGNvbG9yLFRSVUUpOwotCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCXsKLQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQ29sb3I7Ci0JCXNBcHBTdHJlYW0gPDwgcmVjdC5sZWZ0IDw8ICIgIiA8PCByZWN0LmJvdHRvbSA8PCAiICIKLQkJCTw8IHJlY3QucmlnaHQgLSByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QudG9wIC0gcmVjdC5ib3R0b20gPDwgIiByZSBmXG5RXG4iOwotCX0KKyAgQ0ZYX0J5dGVTdHJpbmcgc0NvbG9yID0gR2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsIFRSVUUpOworICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0NvbG9yOworICAgIHNBcHBTdHJlYW0gPDwgcmVjdC5sZWZ0IDw8ICIgIiA8PCByZWN0LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IHJlY3QucmlnaHQgLSByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QudG9wIC0gcmVjdC5ib3R0b20KKyAgICAgICAgICAgICAgIDw8ICIgcmUgZlxuUVxuIjsKKyAgfQogCi0JcmV0dXJuIHNBcHBTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENpcmNsZUZpbGxBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmVjdCxjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRDaXJjbGVGaWxsQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CiAKLQlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcixUUlVFKTsKLQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKLQl7Ci0JCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0NvbG9yIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyZWN0KSA8PCAiZlxuUVxuIjsKLQl9CisgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9IEdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBUUlVFKTsKKyAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHNDb2xvciA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUocmVjdCkgPDwgImZcblFcbiI7CisgIH0KIAotCXJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIHNBcHBTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DUERGX1JlY3QgQ1BXTF9VdGlsczo6R2V0Q2VudGVyU3F1YXJlKGNvbnN0IENQREZfUmVjdCAmIHJlY3QpCi17Ci0JRlhfRkxPQVQgZldpZHRoID0gcmVjdC5yaWdodCAtICByZWN0LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IHJlY3QudG9wIC0gcmVjdC5ib3R0b207CitDUERGX1JlY3QgQ1BXTF9VdGlsczo6R2V0Q2VudGVyU3F1YXJlKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICBGWF9GTE9BVCBmV2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gcmVjdC50b3AgLSByZWN0LmJvdHRvbTsKIAotCUZYX0ZMT0FUIGZDZW50ZXJYID0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpLzIuMGY7Ci0JRlhfRkxPQVQgZkNlbnRlclkgPSAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkvMi4wZjsKKyAgRlhfRkxPQVQgZkNlbnRlclggPSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyLjBmOworICBGWF9GTE9BVCBmQ2VudGVyWSA9IChyZWN0LnRvcCArIHJlY3QuYm90dG9tKSAvIDIuMGY7CiAKLQlGWF9GTE9BVCBmUmFkaXVzID0gKGZXaWR0aCA+IGZIZWlnaHQpID8gZkhlaWdodCAvIDIgOiBmV2lkdGggLyAyOworICBGWF9GTE9BVCBmUmFkaXVzID0gKGZXaWR0aCA+IGZIZWlnaHQpID8gZkhlaWdodCAvIDIgOiBmV2lkdGggLyAyOwogCi0JcmV0dXJuIENQREZfUmVjdChmQ2VudGVyWCAtIGZSYWRpdXMsZkNlbnRlclkgLSBmUmFkaXVzLGZDZW50ZXJYICsgZlJhZGl1cyxmQ2VudGVyWSArIGZSYWRpdXMpOworICByZXR1cm4gQ1BERl9SZWN0KGZDZW50ZXJYIC0gZlJhZGl1cywgZkNlbnRlclkgLSBmUmFkaXVzLCBmQ2VudGVyWCArIGZSYWRpdXMsCisgICAgICAgICAgICAgICAgICAgZkNlbnRlclkgKyBmUmFkaXVzKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShJRlhfRWRpdCogcEVkaXQsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UsCi0JCQkJCQkJCQkJCQkJCUZYX0JPT0wgYkNvbnRpbnVvdXMsIEZYX1dPUkQgU3ViV29yZCkKLXsKLQlyZXR1cm4gSUZYX0VkaXQ6OkdldEVkaXRBcHBlYXJhbmNlU3RyZWFtKHBFZGl0LHB0T2Zmc2V0LHBSYW5nZSxiQ29udGludW91cyxTdWJXb3JkKTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29udGludW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBTdWJXb3JkKSB7CisgIHJldHVybiBJRlhfRWRpdDo6R2V0RWRpdEFwcGVhcmFuY2VTdHJlYW0ocEVkaXQsIHB0T2Zmc2V0LCBwUmFuZ2UsIGJDb250aW51b3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YldvcmQpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRFZGl0U2VsQXBwU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LAotCQkJCQkJCQljb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSkKLXsKLQlyZXR1cm4gSUZYX0VkaXQ6OkdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0ocEVkaXQscHRPZmZzZXQscFJhbmdlKTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEVkaXRTZWxBcHBTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSkgeworICByZXR1cm4gSUZYX0VkaXQ6OkdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0ocEVkaXQsIHB0T2Zmc2V0LCBwUmFuZ2UpOwogfQogCi1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0U3F1aWdnbHlBcHBlYXJhbmNlU3RyZWFtKEZYX0ZMT0FUIGZTdGFydFgsIEZYX0ZMT0FUIGZFbmRYLCBGWF9GTE9BVCBmWSwgRlhfRkxPQVQgZlN0ZXApCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CitzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0U3F1aWdnbHlBcHBlYXJhbmNlU3RyZWFtKEZYX0ZMT0FUIGZTdGFydFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZFbmRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlN0ZXApIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CiAKLQlzUmV0IDw8ICIwIHdcbiIgPDwgZlN0YXJ0WCA8PCAiICIgPDwgZlkgPDwgIiBtXG4iOworICBzUmV0IDw8ICIwIHdcbiIgPDwgZlN0YXJ0WCA8PCAiICIgPDwgZlkgPDwgIiBtXG4iOwogCi0JRlhfRkxPQVQgZng7Ci0JaW50MzJfdCBpOworICBGWF9GTE9BVCBmeDsKKyAgaW50MzJfdCBpOwogCi0JZm9yIChpPTEsZng9ZlN0YXJ0WCtmU3RlcDsgZng8ZkVuZFg7IGZ4Kz1mU3RlcCxpKyspCi0JewotCQlzUmV0IDw8IGZ4IDw8ICIgIiA8PCBmWSArIChpJjEpKmZTdGVwIDw8ICIgbFxuIjsKLQl9CisgIGZvciAoaSA9IDEsIGZ4ID0gZlN0YXJ0WCArIGZTdGVwOyBmeCA8IGZFbmRYOyBmeCArPSBmU3RlcCwgaSsrKSB7CisgICAgc1JldCA8PCBmeCA8PCAiICIgPDwgZlkgKyAoaSAmIDEpICogZlN0ZXAgPDwgIiBsXG4iOworICB9CiAKLQlzUmV0IDw8ICJTXG4iOworICBzUmV0IDw8ICJTXG4iOwogCi0JcmV0dXJuIHNSZXQuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLXN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0oSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LAotCQkJCQkJCQkJCQkJCQkJCSAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cldvcmQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CitzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0V29yZFNwZWxsQ2hlY2tBcHBlYXJhbmNlU3RyZWFtKAorICAgIElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyV29yZCkgeworICBDRlhfQnl0ZVRleHRCdWYgc1JldDsKIAotCUZYX0ZMT0FUIGZTdGFydFggPSAwLjBmOwotCUZYX0ZMT0FUIGZFbmRYID0gMC4wZjsKLQlGWF9GTE9BVCBmWSA9IDAuMGY7Ci0JRlhfRkxPQVQgZlN0ZXAgPSAwLjBmOworICBGWF9GTE9BVCBmU3RhcnRYID0gMC4wZjsKKyAgRlhfRkxPQVQgZkVuZFggPSAwLjBmOworICBGWF9GTE9BVCBmWSA9IDAuMGY7CisgIEZYX0ZMT0FUIGZTdGVwID0gMC4wZjsKIAotCUZYX0JPT0wgYkJyZWFrID0gRkFMU0U7CisgIEZYX0JPT0wgYkJyZWFrID0gRkFMU0U7CiAKLQlpZiAocEl0ZXJhdG9yKQotCXsKLQkJcEl0ZXJhdG9yLT5TZXRBdCh3cldvcmQuQmVnaW5Qb3MpOworICBpZiAocEl0ZXJhdG9yKSB7CisgICAgcEl0ZXJhdG9yLT5TZXRBdCh3cldvcmQuQmVnaW5Qb3MpOwogCi0JCWRvCi0JCXsKLQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgIGRvIHsKKyAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwogCi0JCQlDUFZUX0xpbmUgbGluZTsKLQkJCWlmIChwSXRlcmF0b3ItPkdldExpbmUobGluZSkpCi0JCQl7Ci0JCQkJZlkgPSBsaW5lLnB0TGluZS55OwotCQkJCWZTdGVwID0gKGxpbmUuZkxpbmVBc2NlbnQgLSBsaW5lLmZMaW5lRGVzY2VudCkgLyAxNi4wZjsKLQkJCX0KKyAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgaWYgKHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkgeworICAgICAgICBmWSA9IGxpbmUucHRMaW5lLnk7CisgICAgICAgIGZTdGVwID0gKGxpbmUuZkxpbmVBc2NlbnQgLSBsaW5lLmZMaW5lRGVzY2VudCkgLyAxNi4wZjsKKyAgICAgIH0KIAotCQkJaWYgKHBsYWNlLkxpbmVDbXAod3JXb3JkLkJlZ2luUG9zKSA9PSAwKQotCQkJewotCQkJCXBJdGVyYXRvci0+U2V0QXQod3JXb3JkLkJlZ2luUG9zKTsKLQkJCQlDUFZUX1dvcmQgd29yZDsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCXsKLQkJCQkJZlN0YXJ0WCA9IHdvcmQucHRXb3JkLng7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZTdGFydFggPSBsaW5lLnB0TGluZS54OwotCQkJfQorICAgICAgaWYgKHBsYWNlLkxpbmVDbXAod3JXb3JkLkJlZ2luUG9zKSA9PSAwKSB7CisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQod3JXb3JkLkJlZ2luUG9zKTsKKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBmU3RhcnRYID0gd29yZC5wdFdvcmQueDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZlN0YXJ0WCA9IGxpbmUucHRMaW5lLng7CisgICAgICB9CiAKLQkJCWlmIChwbGFjZS5MaW5lQ21wKHdyV29yZC5FbmRQb3MpID09IDApCi0JCQl7Ci0JCQkJcEl0ZXJhdG9yLT5TZXRBdCh3cldvcmQuRW5kUG9zKTsKLQkJCQlDUFZUX1dvcmQgd29yZDsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCXsKLQkJCQkJZkVuZFggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7Ci0JCQkJfQorICAgICAgaWYgKHBsYWNlLkxpbmVDbXAod3JXb3JkLkVuZFBvcykgPT0gMCkgeworICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHdyV29yZC5FbmRQb3MpOworICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIGZFbmRYID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOworICAgICAgICB9CiAKLQkJCQliQnJlYWsgPSBUUlVFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZFbmRYID0gbGluZS5wdExpbmUueCArIGxpbmUuZkxpbmVXaWR0aDsKLQkJCX0KKyAgICAgICAgYkJyZWFrID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZFbmRYID0gbGluZS5wdExpbmUueCArIGxpbmUuZkxpbmVXaWR0aDsKKyAgICAgIH0KIAotCQkJc1JldCA8PCBHZXRTcXVpZ2dseUFwcGVhcmFuY2VTdHJlYW0oZlN0YXJ0WCArIHB0T2Zmc2V0LngsIGZFbmRYICsgcHRPZmZzZXQueCwgZlkgKyBwdE9mZnNldC55LGZTdGVwKTsKKyAgICAgIHNSZXQgPDwgR2V0U3F1aWdnbHlBcHBlYXJhbmNlU3RyZWFtKAorICAgICAgICAgIGZTdGFydFggKyBwdE9mZnNldC54LCBmRW5kWCArIHB0T2Zmc2V0LngsIGZZICsgcHRPZmZzZXQueSwgZlN0ZXApOwogCi0JCQlpZiAoYkJyZWFrKSBicmVhazsKLQkJfQotCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0TGluZSgpKTsKLQl9CisgICAgICBpZiAoYkJyZWFrKQorICAgICAgICBicmVhazsKKyAgICB9IHdoaWxlIChwSXRlcmF0b3ItPk5leHRMaW5lKCkpOworICB9CiAKLQlyZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzUmV0LkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0U3BlbGxDaGVja0FwcFN0cmVhbShJRlhfRWRpdCogcEVkaXQsIElQV0xfU3BlbGxDaGVjayogcFNwZWxsQ2hlY2ssIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwKLQkJCQkJCQkJY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UpCi17Ci0JQVNTRVJUKHBFZGl0ICE9IE5VTEwpOwotCUFTU0VSVChwU3BlbGxDaGVjayAhPSBOVUxMKTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldFNwZWxsQ2hlY2tBcHBTdHJlYW0oCisgICAgSUZYX0VkaXQqIHBFZGl0LAorICAgIElQV0xfU3BlbGxDaGVjayogcFNwZWxsQ2hlY2ssCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSkgeworICBBU1NFUlQocEVkaXQgIT0gTlVMTCk7CisgIEFTU0VSVChwU3BlbGxDaGVjayAhPSBOVUxMKTsKIAotCUNGWF9CeXRlVGV4dEJ1ZiBzUmV0OworICBDRlhfQnl0ZVRleHRCdWYgc1JldDsKIAotCWlmIChwUmFuZ2UgJiYgcFJhbmdlLT5Jc0V4aXN0KCkpCi0JewotCQlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKQotCQl7Ci0JCQlwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOworICBpZiAocFJhbmdlICYmIHBSYW5nZS0+SXNFeGlzdCgpKSB7CisgICAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKIAotCQkJRlhfQk9PTCBiTGF0aW5Xb3JkID0gRkFMU0U7Ci0JCQlDUFZUX1dvcmRQbGFjZSB3cFdvcmRTdGFydDsKLQkJCUNGWF9CeXRlU3RyaW5nIHNXb3JkOworICAgICAgRlhfQk9PTCBiTGF0aW5Xb3JkID0gRkFMU0U7CisgICAgICBDUFZUX1dvcmRQbGFjZSB3cFdvcmRTdGFydDsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHNXb3JkOwogCi0JCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKLQkJCXdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCi0JCQl7Ci0JCQkJQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0JCQkJaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApIGJyZWFrOworICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7CisgICAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgICBpZiAocFJhbmdlICYmIHBsYWNlLldvcmRDbXAocFJhbmdlLT5FbmRQb3MpID4gMCkKKyAgICAgICAgICBicmVhazsKIAotCQkJCUNQVlRfV29yZCB3b3JkOwotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCQkJewotCQkJCQlpZiAoRlhfRURJVF9JU0xBVElOV09SRCh3b3JkLldvcmQpKQotCQkJCQl7Ci0JCQkJCQlpZiAoIWJMYXRpbldvcmQpCi0JCQkJCQl7Ci0JCQkJCQkJd3BXb3JkU3RhcnQgPSBwbGFjZTsKLQkJCQkJCQliTGF0aW5Xb3JkID0gVFJVRTsKLQkJCQkJCX0KKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBpZiAoRlhfRURJVF9JU0xBVElOV09SRCh3b3JkLldvcmQpKSB7CisgICAgICAgICAgICBpZiAoIWJMYXRpbldvcmQpIHsKKyAgICAgICAgICAgICAgd3BXb3JkU3RhcnQgPSBwbGFjZTsKKyAgICAgICAgICAgICAgYkxhdGluV29yZCA9IFRSVUU7CisgICAgICAgICAgICB9CiAKLQkJCQkJCXNXb3JkICs9IChjaGFyKXdvcmQuV29yZDsKLQkJCQkJCW9sZHBsYWNlID0gcGxhY2U7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlpZiAoYkxhdGluV29yZCkKLQkJCQkJCXsKLQkJCQkJCQlpZiAoIXBTcGVsbENoZWNrLT5DaGVja1dvcmQoc1dvcmQpKQotCQkJCQkJCXsKLQkJCQkJCQkJc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0ocEl0ZXJhdG9yLHB0T2Zmc2V0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7Ci0JCQkJCQkJCXBJdGVyYXRvci0+U2V0QXQocGxhY2UpOwotCQkJCQkJCX0KLQkJCQkJCQliTGF0aW5Xb3JkID0gRkFMU0U7Ci0JCQkJCQl9CisgICAgICAgICAgICBzV29yZCArPSAoY2hhcil3b3JkLldvcmQ7CisgICAgICAgICAgICBvbGRwbGFjZSA9IHBsYWNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYkxhdGluV29yZCkgeworICAgICAgICAgICAgICBpZiAoIXBTcGVsbENoZWNrLT5DaGVja1dvcmQoc1dvcmQpKSB7CisgICAgICAgICAgICAgICAgc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIHBJdGVyYXRvciwgcHRPZmZzZXQsIENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LCBvbGRwbGFjZSkpOworICAgICAgICAgICAgICAgIHBJdGVyYXRvci0+U2V0QXQocGxhY2UpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJMYXRpbldvcmQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KIAotCQkJCQkJc1dvcmQuRW1wdHkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAoYkxhdGluV29yZCkKLQkJCQkJewotCQkJCQkJaWYgKCFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNXb3JkKSkKLQkJCQkJCQlzUmV0IDw8IEdldFdvcmRTcGVsbENoZWNrQXBwZWFyYW5jZVN0cmVhbShwSXRlcmF0b3IscHRPZmZzZXQsQ1BWVF9Xb3JkUmFuZ2Uod3BXb3JkU3RhcnQsb2xkcGxhY2UpKTsKLQkJCQkJCWJMYXRpbldvcmQgPSBGQUxTRTsKLQkJCQkJCXNXb3JkLkVtcHR5KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBzV29yZC5FbXB0eSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoYkxhdGluV29yZCkgeworICAgICAgICAgICAgaWYgKCFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNXb3JkKSkKKyAgICAgICAgICAgICAgc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0oCisgICAgICAgICAgICAgICAgICBwSXRlcmF0b3IsIHB0T2Zmc2V0LCBDUFZUX1dvcmRSYW5nZSh3cFdvcmRTdGFydCwgb2xkcGxhY2UpKTsKKyAgICAgICAgICAgIGJMYXRpbldvcmQgPSBGQUxTRTsKKyAgICAgICAgICAgIHNXb3JkLkVtcHR5KCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CiAKLQkJCWlmIChiTGF0aW5Xb3JkKQotCQkJewotCQkJCWlmICghcFNwZWxsQ2hlY2stPkNoZWNrV29yZChzV29yZCkpCi0JCQkJCXNSZXQgPDwgR2V0V29yZFNwZWxsQ2hlY2tBcHBlYXJhbmNlU3RyZWFtKHBJdGVyYXRvcixwdE9mZnNldCxDUFZUX1dvcmRSYW5nZSh3cFdvcmRTdGFydCxvbGRwbGFjZSkpOworICAgICAgaWYgKGJMYXRpbldvcmQpIHsKKyAgICAgICAgaWYgKCFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNXb3JkKSkKKyAgICAgICAgICBzUmV0IDw8IEdldFdvcmRTcGVsbENoZWNrQXBwZWFyYW5jZVN0cmVhbSgKKyAgICAgICAgICAgICAgcEl0ZXJhdG9yLCBwdE9mZnNldCwgQ1BWVF9Xb3JkUmFuZ2Uod3BXb3JkU3RhcnQsIG9sZHBsYWNlKSk7CiAKLQkJCQliTGF0aW5Xb3JkID0gRkFMU0U7Ci0JCQkJc1dvcmQuRW1wdHkoKTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgYkxhdGluV29yZCA9IEZBTFNFOworICAgICAgICBzV29yZC5FbXB0eSgpOworICAgICAgfQorICAgIH0KKyAgfQogCi0JcmV0dXJuIHNSZXQuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldFRleHRBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LElGWF9FZGl0X0ZvbnRNYXAgKiBwRm9udE1hcCwKLQkJCQkJCQkJCQkJCQkJY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzVGV4dCwgaW50MzJfdCBuQWxpZ25tZW50SCwgaW50MzJfdCBuQWxpZ25tZW50ViwKLQkJCQkJCQkJCQkJCQkJRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9CT09MIGJNdWx0aUxpbmUsIEZYX0JPT0wgYkF1dG9SZXR1cm4sIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRUZXh0QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5BbGlnbm1lbnRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5BbGlnbm1lbnRWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk11bHRpTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXV0b1JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzUmV0OwogCi0JaWYgKElGWF9FZGl0ICogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKQotCXsKLQkJcEVkaXQtPlNldEZvbnRNYXAocEZvbnRNYXApOwotCQlwRWRpdC0+U2V0UGxhdGVSZWN0KHJjQkJveCk7Ci0JCXBFZGl0LT5TZXRBbGlnbm1lbnRIKG5BbGlnbm1lbnRIKTsKLQkJcEVkaXQtPlNldEFsaWdubWVudFYobkFsaWdubWVudFYpOwotCQlwRWRpdC0+U2V0TXVsdGlMaW5lKGJNdWx0aUxpbmUpOwotCQlwRWRpdC0+U2V0QXV0b1JldHVybihiQXV0b1JldHVybik7Ci0JCWlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQotCQkJcEVkaXQtPlNldEF1dG9Gb250U2l6ZShUUlVFKTsKLQkJZWxzZQotCQkJcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CisgIGlmIChJRlhfRWRpdCogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKSB7CisgICAgcEVkaXQtPlNldEZvbnRNYXAocEZvbnRNYXApOworICAgIHBFZGl0LT5TZXRQbGF0ZVJlY3QocmNCQm94KTsKKyAgICBwRWRpdC0+U2V0QWxpZ25tZW50SChuQWxpZ25tZW50SCk7CisgICAgcEVkaXQtPlNldEFsaWdubWVudFYobkFsaWdubWVudFYpOworICAgIHBFZGl0LT5TZXRNdWx0aUxpbmUoYk11bHRpTGluZSk7CisgICAgcEVkaXQtPlNldEF1dG9SZXR1cm4oYkF1dG9SZXR1cm4pOworICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQorICAgICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZShUUlVFKTsKKyAgICBlbHNlCisgICAgICBwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIAotCQlwRWRpdC0+SW5pdGlhbGl6ZSgpOwotCQlwRWRpdC0+U2V0VGV4dChzVGV4dC5jX3N0cigpKTsKKyAgICBwRWRpdC0+SW5pdGlhbGl6ZSgpOworICAgIHBFZGl0LT5TZXRUZXh0KHNUZXh0LmNfc3RyKCkpOwogCi0JCUNGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShwRWRpdCwgQ1BERl9Qb2ludCgwLjBmLDAuMGYpKTsKLQkJaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkKLQkJewotCQkJc1JldCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0KSA8PCBzRWRpdCA8PCAiRVRcbiI7Ci0JCX0KLQkJSUZYX0VkaXQ6OkRlbEVkaXQocEVkaXQpOwotCX0KKyAgICBDRlhfQnl0ZVN0cmluZyBzRWRpdCA9CisgICAgICAgIENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0ocEVkaXQsIENQREZfUG9pbnQoMC4wZiwgMC4wZikpOworICAgIGlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgIHNSZXQgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCkgPDwgc0VkaXQKKyAgICAgICAgICAgPDwgIkVUXG4iOworICAgIH0KKyAgICBJRlhfRWRpdDo6RGVsRWRpdChwRWRpdCk7CisgIH0KIAotCXJldHVybiBzUmV0LkdldEJ5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIHNSZXQuR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRQdXNoQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwKLQkJCQkJCQkJCQkJSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwLAotCQkJCQkJCQkJCQlDUERGX1N0cmVhbSAqIHBJY29uU3RyZWFtLAotCQkJCQkJCQkJCQlDUERGX0ljb25GaXQgJiBJY29uRml0LAotCQkJCQkJCQkJCQljb25zdCBDRlhfV2lkZVN0cmluZyAmIHNMYWJlbCwKLQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCwKLQkJCQkJCQkJCQkJRlhfRkxPQVQgZkZvbnRTaXplLAotCQkJCQkJCQkJCQlpbnQzMl90IG5MYXlPdXQpCi17Ci0JY29uc3QgRlhfRkxPQVQgZkF1dG9Gb250U2NhbGUgPSAxLjBmIC8gMy4wZjsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldFB1c2hCdXR0b25BcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcEljb25TdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfSWNvbkZpdCYgSWNvbkZpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkxheU91dCkgeworICBjb25zdCBGWF9GTE9BVCBmQXV0b0ZvbnRTY2FsZSA9IDEuMGYgLyAzLjBmOwogCi0JaWYgKElGWF9FZGl0ICogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKQotCXsKLQkJcEVkaXQtPlNldEZvbnRNYXAocEZvbnRNYXApOwotCQlwRWRpdC0+U2V0QWxpZ25tZW50SCgxKTsKLQkJcEVkaXQtPlNldEFsaWdubWVudFYoMSk7Ci0JCXBFZGl0LT5TZXRNdWx0aUxpbmUoRkFMU0UpOwotCQlwRWRpdC0+U2V0QXV0b1JldHVybihGQUxTRSk7Ci0JCWlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQotCQkJcEVkaXQtPlNldEF1dG9Gb250U2l6ZShUUlVFKTsKLQkJZWxzZQotCQkJcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CisgIGlmIChJRlhfRWRpdCogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKSB7CisgICAgcEVkaXQtPlNldEZvbnRNYXAocEZvbnRNYXApOworICAgIHBFZGl0LT5TZXRBbGlnbm1lbnRIKDEpOworICAgIHBFZGl0LT5TZXRBbGlnbm1lbnRWKDEpOworICAgIHBFZGl0LT5TZXRNdWx0aUxpbmUoRkFMU0UpOworICAgIHBFZGl0LT5TZXRBdXRvUmV0dXJuKEZBTFNFKTsKKyAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKKyAgICAgIHBFZGl0LT5TZXRBdXRvRm9udFNpemUoVFJVRSk7CisgICAgZWxzZQorICAgICAgcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiAKLQkJcEVkaXQtPkluaXRpYWxpemUoKTsKLQkJcEVkaXQtPlNldFRleHQoc0xhYmVsLmNfc3RyKCkpOworICAgIHBFZGl0LT5Jbml0aWFsaXplKCk7CisgICAgcEVkaXQtPlNldFRleHQoc0xhYmVsLmNfc3RyKCkpOwogCi0JCUNQREZfUmVjdCByY0xhYmVsQ29udGVudCA9IHBFZGl0LT5HZXRDb250ZW50UmVjdCgpOwotCQlDUFdMX0ljb24gSWNvbjsKLQkJUFdMX0NSRUFURVBBUkFNIGNwOwotCQljcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEU7Ci0JCUljb24uQ3JlYXRlKGNwKTsKLQkJSWNvbi5TZXRJY29uRml0KCZJY29uRml0KTsKLQkJSWNvbi5TZXRQREZTdHJlYW0ocEljb25TdHJlYW0pOworICAgIENQREZfUmVjdCByY0xhYmVsQ29udGVudCA9IHBFZGl0LT5HZXRDb250ZW50UmVjdCgpOworICAgIENQV0xfSWNvbiBJY29uOworICAgIFBXTF9DUkVBVEVQQVJBTSBjcDsKKyAgICBjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEU7CisgICAgSWNvbi5DcmVhdGUoY3ApOworICAgIEljb24uU2V0SWNvbkZpdCgmSWNvbkZpdCk7CisgICAgSWNvbi5TZXRQREZTdHJlYW0ocEljb25TdHJlYW0pOwogCi0JCUNQREZfUmVjdCByY0xhYmVsID0gQ1BERl9SZWN0KDAsMCwwLDApOwotCQlDUERGX1JlY3QgcmNJY29uID0gQ1BERl9SZWN0KDAsMCwwLDApOwotCQlGWF9GTE9BVCBmV2lkdGggPSAwLjBmOwotCQlGWF9GTE9BVCBmSGVpZ2h0ID0gMC4wZjsKKyAgICBDUERGX1JlY3QgcmNMYWJlbCA9IENQREZfUmVjdCgwLCAwLCAwLCAwKTsKKyAgICBDUERGX1JlY3QgcmNJY29uID0gQ1BERl9SZWN0KDAsIDAsIDAsIDApOworICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDAuMGY7CisgICAgRlhfRkxPQVQgZkhlaWdodCA9IDAuMGY7CiAKLQkJc3dpdGNoIChuTGF5T3V0KQotCQl7Ci0JCWNhc2UgUFBCTF9MQUJFTDoKLQkJCXJjTGFiZWwgPSByY0JCb3g7Ci0JCQlyY0ljb24gPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQUEJMX0lDT046Ci0JCQlyY0ljb24gPSByY0JCb3g7Ci0JCQlyY0xhYmVsID0gQ1BERl9SZWN0KDAsMCwwLDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUFBCTF9JQ09OVE9QTEFCRUxCT1RUT006CisgICAgc3dpdGNoIChuTGF5T3V0KSB7CisgICAgICBjYXNlIFBQQkxfTEFCRUw6CisgICAgICAgIHJjTGFiZWwgPSByY0JCb3g7CisgICAgICAgIHJjSWNvbiA9IENQREZfUmVjdCgwLCAwLCAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBQQkxfSUNPTjoKKyAgICAgICAgcmNJY29uID0gcmNCQm94OworICAgICAgICByY0xhYmVsID0gQ1BERl9SZWN0KDAsIDAsIDAsIDApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFBCTF9JQ09OVE9QTEFCRUxCT1RUT006CiAKLQkJCWlmIChwSWNvblN0cmVhbSkKLQkJCXsKLQkJCQlpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLQkJCQl7Ci0JCQkJCWZIZWlnaHQgPSByY0JCb3gudG9wIC0gcmNCQm94LmJvdHRvbTsKLQkJCQkJcmNMYWJlbCA9IENQREZfUmVjdChyY0JCb3gubGVmdCxyY0JCb3guYm90dG9tLHJjQkJveC5yaWdodCxyY0JCb3guYm90dG9tICsgZkhlaWdodCAqIGZBdXRvRm9udFNjYWxlKTsKLQkJCQkJcmNJY29uID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LHJjTGFiZWwudG9wLHJjQkJveC5yaWdodCxyY0JCb3gudG9wKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZkhlaWdodCA9IHJjTGFiZWxDb250ZW50LkhlaWdodCgpOworICAgICAgICBpZiAocEljb25TdHJlYW0pIHsKKyAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgeworICAgICAgICAgICAgZkhlaWdodCA9IHJjQkJveC50b3AgLSByY0JCb3guYm90dG9tOworICAgICAgICAgICAgcmNMYWJlbCA9IENQREZfUmVjdChyY0JCb3gubGVmdCwgcmNCQm94LmJvdHRvbSwgcmNCQm94LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3guYm90dG9tICsgZkhlaWdodCAqIGZBdXRvRm9udFNjYWxlKTsKKyAgICAgICAgICAgIHJjSWNvbiA9CisgICAgICAgICAgICAgICAgQ1BERl9SZWN0KHJjQkJveC5sZWZ0LCByY0xhYmVsLnRvcCwgcmNCQm94LnJpZ2h0LCByY0JCb3gudG9wKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZkhlaWdodCA9IHJjTGFiZWxDb250ZW50LkhlaWdodCgpOwogCi0JCQkJCWlmIChyY0JCb3guYm90dG9tICsgZkhlaWdodCA+IHJjQkJveC50b3ApCi0JCQkJCXsKLQkJCQkJCXJjSWNvbiA9IENQREZfUmVjdCgwLDAsMCwwKTsKLQkJCQkJCXJjTGFiZWwgPSByY0JCb3g7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlyY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LHJjQkJveC5ib3R0b20scmNCQm94LnJpZ2h0LHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0KTsKLQkJCQkJCXJjSWNvbiA9IENQREZfUmVjdChyY0JCb3gubGVmdCxyY0xhYmVsLnRvcCxyY0JCb3gucmlnaHQscmNCQm94LnRvcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmNMYWJlbCA9IHJjQkJveDsKLQkJCQlyY0ljb24gPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCQl9CisgICAgICAgICAgICBpZiAocmNCQm94LmJvdHRvbSArIGZIZWlnaHQgPiByY0JCb3gudG9wKSB7CisgICAgICAgICAgICAgIHJjSWNvbiA9IENQREZfUmVjdCgwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJjTGFiZWwgPSBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3guYm90dG9tICsgZkhlaWdodCk7CisgICAgICAgICAgICAgIHJjSWNvbiA9CisgICAgICAgICAgICAgICAgICBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjTGFiZWwudG9wLCByY0JCb3gucmlnaHQsIHJjQkJveC50b3ApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgICAgIHJjSWNvbiA9IENQREZfUmVjdCgwLCAwLCAwLCAwKTsKKyAgICAgICAgfQogCi0JCQlicmVhazsKLQkJY2FzZSBQUEJMX0xBQkVMVE9QSUNPTkJPVFRPTToKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBQQkxfTEFCRUxUT1BJQ09OQk9UVE9NOgogCi0JCQlpZiAocEljb25TdHJlYW0pCi0JCQl7Ci0JCQkJaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0JCQkJewotCQkJCQlmSGVpZ2h0ID0gcmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b207Ci0JCQkJCXJjTGFiZWwgPSBDUERGX1JlY3QocmNCQm94LmxlZnQscmNCQm94LnRvcCAtIGZIZWlnaHQgKiBmQXV0b0ZvbnRTY2FsZSAscmNCQm94LnJpZ2h0LHJjQkJveC50b3ApOwotCQkJCQlyY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQscmNCQm94LmJvdHRvbSxyY0JCb3gucmlnaHQscmNMYWJlbC5ib3R0b20pOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlmSGVpZ2h0ID0gcmNMYWJlbENvbnRlbnQuSGVpZ2h0KCk7CisgICAgICAgIGlmIChwSWNvblN0cmVhbSkgeworICAgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKSB7CisgICAgICAgICAgICBmSGVpZ2h0ID0gcmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b207CisgICAgICAgICAgICByY0xhYmVsID0KKyAgICAgICAgICAgICAgICBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjQkJveC50b3AgLSBmSGVpZ2h0ICogZkF1dG9Gb250U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5yaWdodCwgcmNCQm94LnRvcCk7CisgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0xhYmVsLmJvdHRvbSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZIZWlnaHQgPSByY0xhYmVsQ29udGVudC5IZWlnaHQoKTsKIAotCQkJCQlpZiAocmNCQm94LmJvdHRvbSArIGZIZWlnaHQgPiByY0JCb3gudG9wKQotCQkJCQl7Ci0JCQkJCQlyY0ljb24gPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCQkJCQlyY0xhYmVsID0gcmNCQm94OwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcmNMYWJlbCA9IENQREZfUmVjdChyY0JCb3gubGVmdCxyY0JCb3gudG9wIC0gZkhlaWdodCxyY0JCb3gucmlnaHQscmNCQm94LnRvcCk7Ci0JCQkJCQlyY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQscmNCQm94LmJvdHRvbSxyY0JCb3gucmlnaHQscmNMYWJlbC5ib3R0b20pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJjTGFiZWwgPSByY0JCb3g7Ci0JCQkJcmNJY29uID0gQ1BERl9SZWN0KDAsMCwwLDApOwotCQkJfQorICAgICAgICAgICAgaWYgKHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0ID4gcmNCQm94LnRvcCkgeworICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICAgIHJjTGFiZWwgPSByY0JCb3g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LCByY0JCb3gudG9wIC0gZkhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gucmlnaHQsIHJjQkJveC50b3ApOworICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjTGFiZWwuYm90dG9tKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgIH0KIAotCQkJYnJlYWs7Ci0JCWNhc2UgUFBCTF9JQ09OTEVGVExBQkVMUklHSFQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUEJMX0lDT05MRUZUTEFCRUxSSUdIVDoKIAotCQkJaWYgKHBJY29uU3RyZWFtKQotCQkJewotCQkJCWlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQotCQkJCXsKLQkJCQkJZldpZHRoID0gcmNCQm94LnJpZ2h0IC0gcmNCQm94LmxlZnQ7Ci0JCQkJCXJjTGFiZWwgPSBDUERGX1JlY3QocmNCQm94LnJpZ2h0IC0gZldpZHRoICogZkF1dG9Gb250U2NhbGUscmNCQm94LmJvdHRvbSxyY0JCb3gucmlnaHQscmNCQm94LnRvcCk7Ci0JCQkJCXJjSWNvbiA9IENQREZfUmVjdChyY0JCb3gubGVmdCxyY0JCb3guYm90dG9tLHJjTGFiZWwubGVmdCxyY0JCb3gudG9wKTsKKyAgICAgICAgaWYgKHBJY29uU3RyZWFtKSB7CisgICAgICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpIHsKKyAgICAgICAgICAgIGZXaWR0aCA9IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0OworICAgICAgICAgICAgcmNMYWJlbCA9IENQREZfUmVjdChyY0JCb3gucmlnaHQgLSBmV2lkdGggKiBmQXV0b0ZvbnRTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmJvdHRvbSwgcmNCQm94LnJpZ2h0LCByY0JCb3gudG9wKTsKKyAgICAgICAgICAgIHJjSWNvbiA9CisgICAgICAgICAgICAgICAgQ1BERl9SZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLCByY0xhYmVsLmxlZnQsIHJjQkJveC50b3ApOwogCi0JCQkJCWlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoICogZkF1dG9Gb250U2NhbGUpCi0JCQkJCXsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoKQotCQkJCQkJewotCQkJCQkJCXJjTGFiZWwgPSBDUERGX1JlY3QocmNCQm94LnJpZ2h0IC0gcmNMYWJlbENvbnRlbnQuV2lkdGgoKSxyY0JCb3guYm90dG9tLHJjQkJveC5yaWdodCxyY0JCb3gudG9wKTsKLQkJCQkJCQlyY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQscmNCQm94LmJvdHRvbSxyY0xhYmVsLmxlZnQscmNCQm94LnRvcCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJcmNMYWJlbCA9IHJjQkJveDsKLQkJCQkJCQlyY0ljb24gPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZldpZHRoID0gcmNMYWJlbENvbnRlbnQuV2lkdGgoKTsKKyAgICAgICAgICAgIGlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoICogZkF1dG9Gb250U2NhbGUpIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoKSB7CisgICAgICAgICAgICAgICAgcmNMYWJlbCA9IENQREZfUmVjdChyY0JCb3gucmlnaHQgLSByY0xhYmVsQ29udGVudC5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmJvdHRvbSwgcmNCQm94LnJpZ2h0LCByY0JCb3gudG9wKTsKKyAgICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sIHJjTGFiZWwubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZldpZHRoID0gcmNMYWJlbENvbnRlbnQuV2lkdGgoKTsKIAotCQkJCQlpZiAocmNCQm94LmxlZnQgKyBmV2lkdGggPiByY0JCb3gucmlnaHQpCi0JCQkJCXsKLQkJCQkJCXJjTGFiZWwgPSByY0JCb3g7Ci0JCQkJCQlyY0ljb24gPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlyY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5yaWdodCAtIGZXaWR0aCxyY0JCb3guYm90dG9tLHJjQkJveC5yaWdodCxyY0JCb3gudG9wKTsKLQkJCQkJCXJjSWNvbiA9IENQREZfUmVjdChyY0JCb3gubGVmdCxyY0JCb3guYm90dG9tLHJjTGFiZWwubGVmdCxyY0JCb3gudG9wKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyY0xhYmVsID0gcmNCQm94OwotCQkJCXJjSWNvbiA9IENQREZfUmVjdCgwLDAsMCwwKTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChyY0JCb3gubGVmdCArIGZXaWR0aCA+IHJjQkJveC5yaWdodCkgeworICAgICAgICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5yaWdodCAtIGZXaWR0aCwgcmNCQm94LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gucmlnaHQsIHJjQkJveC50b3ApOworICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sIHJjTGFiZWwubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3ApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgICAgIHJjSWNvbiA9IENQREZfUmVjdCgwLCAwLCAwLCAwKTsKKyAgICAgICAgfQogCi0JCQlicmVhazsKLQkJY2FzZSBQUEJMX0xBQkVMTEVGVElDT05SSUdIVDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBQQkxfTEFCRUxMRUZUSUNPTlJJR0hUOgogCi0JCQlpZiAocEljb25TdHJlYW0pCi0JCQl7Ci0JCQkJaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0JCQkJewotCQkJCQlmV2lkdGggPSByY0JCb3gucmlnaHQgLSByY0JCb3gubGVmdDsKLQkJCQkJcmNMYWJlbCA9IENQREZfUmVjdChyY0JCb3gubGVmdCxyY0JCb3guYm90dG9tLHJjQkJveC5sZWZ0ICsgZldpZHRoICogZkF1dG9Gb250U2NhbGUscmNCQm94LnRvcCk7Ci0JCQkJCXJjSWNvbiA9IENQREZfUmVjdChyY0xhYmVsLnJpZ2h0LHJjQkJveC5ib3R0b20scmNCQm94LnJpZ2h0LHJjQkJveC50b3ApOworICAgICAgICBpZiAocEljb25TdHJlYW0pIHsKKyAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgeworICAgICAgICAgICAgZldpZHRoID0gcmNCQm94LnJpZ2h0IC0gcmNCQm94LmxlZnQ7CisgICAgICAgICAgICByY0xhYmVsID0KKyAgICAgICAgICAgICAgICBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5sZWZ0ICsgZldpZHRoICogZkF1dG9Gb250U2NhbGUsIHJjQkJveC50b3ApOworICAgICAgICAgICAgcmNJY29uID0gQ1BERl9SZWN0KHJjTGFiZWwucmlnaHQsIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gudG9wKTsKIAotCQkJCQlpZiAocmNMYWJlbENvbnRlbnQuV2lkdGgoKSA8IGZXaWR0aCAqIGZBdXRvRm9udFNjYWxlKQotCQkJCQl7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlpZiAocmNMYWJlbENvbnRlbnQuV2lkdGgoKSA8IGZXaWR0aCkKLQkJCQkJCXsKLQkJCQkJCQlyY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LHJjQkJveC5ib3R0b20scmNCQm94LmxlZnQgKyByY0xhYmVsQ29udGVudC5XaWR0aCgpLHJjQkJveC50b3ApOwotCQkJCQkJCXJjSWNvbiA9IENQREZfUmVjdChyY0xhYmVsLnJpZ2h0LHJjQkJveC5ib3R0b20scmNCQm94LnJpZ2h0LHJjQkJveC50b3ApOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXJjTGFiZWwgPSByY0JCb3g7Ci0JCQkJCQkJcmNJY29uID0gQ1BERl9SZWN0KDAsMCwwLDApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWZXaWR0aCA9IHJjTGFiZWxDb250ZW50LldpZHRoKCk7CisgICAgICAgICAgICBpZiAocmNMYWJlbENvbnRlbnQuV2lkdGgoKSA8IGZXaWR0aCAqIGZBdXRvRm9udFNjYWxlKSB7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAocmNMYWJlbENvbnRlbnQuV2lkdGgoKSA8IGZXaWR0aCkgeworICAgICAgICAgICAgICAgIHJjTGFiZWwgPQorICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gubGVmdCArIHJjTGFiZWxDb250ZW50LldpZHRoKCksIHJjQkJveC50b3ApOworICAgICAgICAgICAgICAgIHJjSWNvbiA9IENQREZfUmVjdChyY0xhYmVsLnJpZ2h0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3ApOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJjTGFiZWwgPSByY0JCb3g7CisgICAgICAgICAgICAgICAgcmNJY29uID0gQ1BERl9SZWN0KDAsIDAsIDAsIDApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZXaWR0aCA9IHJjTGFiZWxDb250ZW50LldpZHRoKCk7CiAKLQkJCQkJaWYgKHJjQkJveC5sZWZ0ICsgZldpZHRoID4gcmNCQm94LnJpZ2h0KQotCQkJCQl7Ci0JCQkJCQlyY0xhYmVsID0gcmNCQm94OwotCQkJCQkJcmNJY29uID0gQ1BERl9SZWN0KDAsMCwwLDApOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcmNMYWJlbCA9IENQREZfUmVjdChyY0JCb3gubGVmdCxyY0JCb3guYm90dG9tLHJjQkJveC5sZWZ0ICsgZldpZHRoLHJjQkJveC50b3ApOwotCQkJCQkJcmNJY29uID0gQ1BERl9SZWN0KHJjTGFiZWwucmlnaHQscmNCQm94LmJvdHRvbSxyY0JCb3gucmlnaHQscmNCQm94LnRvcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmNMYWJlbCA9IHJjQkJveDsKLQkJCQlyY0ljb24gPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCQl9CisgICAgICAgICAgICBpZiAocmNCQm94LmxlZnQgKyBmV2lkdGggPiByY0JCb3gucmlnaHQpIHsKKyAgICAgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICAgICAgcmNJY29uID0gQ1BERl9SZWN0KDAsIDAsIDAsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmNMYWJlbCA9IENQREZfUmVjdChyY0JCb3gubGVmdCwgcmNCQm94LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gubGVmdCArIGZXaWR0aCwgcmNCQm94LnRvcCk7CisgICAgICAgICAgICAgIHJjSWNvbiA9IENQREZfUmVjdChyY0xhYmVsLnJpZ2h0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gudG9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgIH0KIAotCQkJYnJlYWs7Ci0JCWNhc2UgUFBCTF9MQUJFTE9WRVJJQ09OOgotCQkJcmNMYWJlbCA9IHJjQkJveDsKLQkJCXJjSWNvbiA9IHJjQkJveDsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUEJMX0xBQkVMT1ZFUklDT046CisgICAgICAgIHJjTGFiZWwgPSByY0JCb3g7CisgICAgICAgIHJjSWNvbiA9IHJjQkJveDsKKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JCUNGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtLHNUZW1wOworICAgIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtLCBzVGVtcDsKIAotCQlpZiAoIXJjSWNvbi5Jc0VtcHR5KCkpCi0JCXsKLQkJCUljb24uTW92ZShyY0ljb24sIEZBTFNFLCBGQUxTRSk7Ci0JCQlzVGVtcCA8PCBJY29uLkdldEltYWdlQXBwU3RyZWFtKCk7Ci0JCX0KKyAgICBpZiAoIXJjSWNvbi5Jc0VtcHR5KCkpIHsKKyAgICAgIEljb24uTW92ZShyY0ljb24sIEZBTFNFLCBGQUxTRSk7CisgICAgICBzVGVtcCA8PCBJY29uLkdldEltYWdlQXBwU3RyZWFtKCk7CisgICAgfQogCi0JCUljb24uRGVzdHJveSgpOworICAgIEljb24uRGVzdHJveSgpOwogCi0JCWlmICghcmNMYWJlbC5Jc0VtcHR5KCkpCi0JCXsKLQkJCXBFZGl0LT5TZXRQbGF0ZVJlY3QocmNMYWJlbCk7Ci0JCQlDRlhfQnl0ZVN0cmluZyBzRWRpdCA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0ocEVkaXQsQ1BERl9Qb2ludCgwLjBmLDAuMGYpKTsKLQkJCWlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJc1RlbXAgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCkgPDwgc0VkaXQgPDwgIkVUXG4iOwotCQkJfQotCQl9CisgICAgaWYgKCFyY0xhYmVsLklzRW1wdHkoKSkgeworICAgICAgcEVkaXQtPlNldFBsYXRlUmVjdChyY0xhYmVsKTsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHNFZGl0ID0KKyAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LCBDUERGX1BvaW50KDAuMGYsIDAuMGYpKTsKKyAgICAgIGlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgc1RlbXAgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCkgPDwgc0VkaXQKKyAgICAgICAgICAgICAgPDwgIkVUXG4iOworICAgICAgfQorICAgIH0KIAotCQlJRlhfRWRpdDo6RGVsRWRpdChwRWRpdCk7CisgICAgSUZYX0VkaXQ6OkRlbEVkaXQocEVkaXQpOwogCi0JCWlmIChzVGVtcC5HZXRTaXplKCkgPiAwKQotCQl7Ci0JCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3guYm90dG9tIDw8ICIgIgotCQkJCTw8IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3gudG9wIC0gcmNCQm94LmJvdHRvbSA8PCAiIHJlIFcgblxuIjsKLQkJCXNBcHBTdHJlYW0gPDwgc1RlbXAgPDwgIlFcbiI7Ci0JCX0KKyAgICBpZiAoc1RlbXAuR2V0U2l6ZSgpID4gMCkgeworICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCByY0JCb3gubGVmdCA8PCAiICIgPDwgcmNCQm94LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgcmNCQm94LnJpZ2h0IC0gcmNCQm94LmxlZnQgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8IHJjQkJveC50b3AgLSByY0JCb3guYm90dG9tIDw8ICIgcmUgVyBuXG4iOworICAgICAgc0FwcFN0cmVhbSA8PCBzVGVtcCA8PCAiUVxuIjsKKyAgICB9CiAKLQkJcmV0dXJuIHNBcHBTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOwotCX0KKyAgICByZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7CisgIH0KIAotCXJldHVybiAiIjsKKyAgcmV0dXJuICIiOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb25zdCBDUFdMX0NvbG9yICYgY29sb3IsY29uc3QgRlhfQk9PTCAmIGJGaWxsT3JTdHJva2UpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNDb2xvclN0cmVhbTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQk9PTCYgYkZpbGxPclN0cm9rZSkgeworICBDRlhfQnl0ZVRleHRCdWYgc0NvbG9yU3RyZWFtOwogCi0Jc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKQotCXsKLQljYXNlIENPTE9SVFlQRV9SR0I6Ci0JCXNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIgotCQkJPDwgKGJGaWxsT3JTdHJva2UgPyAicmciIDogIlJHIikgPDwgIlxuIjsKLQkJYnJlYWs7Ci0JY2FzZSBDT0xPUlRZUEVfR1JBWToKLQkJc0NvbG9yU3RyZWFtIDw8IGNvbG9yLmZDb2xvcjEgPDwgIiAiIDw8IChiRmlsbE9yU3Ryb2tlID8gImciIDogIkciKSA8PCAiXG4iOwotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9DTVlLOgotCQlzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgY29sb3IuZkNvbG9yMiA8PCAiICIgPDwgY29sb3IuZkNvbG9yMyA8PCAiICIgPDwgY29sb3IuZkNvbG9yNCA8PCAiICIKLQkJCTw8IChiRmlsbE9yU3Ryb2tlID8gImsiIDogIksiKSA8PCAiXG4iOwotCQlicmVhazsKLQl9CisgIHN3aXRjaCAoY29sb3IubkNvbG9yVHlwZSkgeworICAgIGNhc2UgQ09MT1JUWVBFX1JHQjoKKyAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IGNvbG9yLmZDb2xvcjMgPDwgIiAiIDw8IChiRmlsbE9yU3Ryb2tlID8gInJnIiA6ICJSRyIpCisgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JUWVBFX0dSQVk6CisgICAgICBzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgKGJGaWxsT3JTdHJva2UgPyAiZyIgOiAiRyIpCisgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JUWVBFX0NNWUs6CisgICAgICBzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgY29sb3IuZkNvbG9yMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIiA8PCBjb2xvci5mQ29sb3I0IDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IChiRmlsbE9yU3Ryb2tlID8gImsiIDogIksiKSA8PCAiXG4iOworICAgICAgYnJlYWs7CisgIH0KIAotCXJldHVybiBzQ29sb3JTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gc0NvbG9yU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0ZMT0FUIGZXaWR0aCwKLQkJCQkJCQkJCQkJCWNvbnN0IENQV0xfQ29sb3IgJiBjb2xvciwgY29uc3QgQ1BXTF9Db2xvciAmIGNyTGVmdFRvcCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyUmlnaHRCb3R0b20sCi0JCQkJCQkJCQkJCQlpbnQzMl90IG5TdHlsZSwgY29uc3QgQ1BXTF9EYXNoICYgZGFzaCkKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKLQlDRlhfQnl0ZVN0cmluZyBzQ29sb3I7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjckxlZnRUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JSaWdodEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0Rhc2gmIGRhc2gpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CisgIENGWF9CeXRlU3RyaW5nIHNDb2xvcjsKIAotCUZYX0ZMT0FUIGZMZWZ0ID0gcmVjdC5sZWZ0OwotCUZYX0ZMT0FUIGZSaWdodCA9IHJlY3QucmlnaHQ7Ci0JRlhfRkxPQVQgZlRvcCA9IHJlY3QudG9wOwotCUZYX0ZMT0FUIGZCb3R0b20gPSByZWN0LmJvdHRvbTsKKyAgRlhfRkxPQVQgZkxlZnQgPSByZWN0LmxlZnQ7CisgIEZYX0ZMT0FUIGZSaWdodCA9IHJlY3QucmlnaHQ7CisgIEZYX0ZMT0FUIGZUb3AgPSByZWN0LnRvcDsKKyAgRlhfRkxPQVQgZkJvdHRvbSA9IHJlY3QuYm90dG9tOwogCi0JaWYgKGZXaWR0aCA+IDAuMGYpCi0JewotCQlGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsKKyAgaWYgKGZXaWR0aCA+IDAuMGYpIHsKKyAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsKIAotCQlzQXBwU3RyZWFtIDw8ICJxXG4iOworICAgIHNBcHBTdHJlYW0gPDwgInFcbiI7CiAKLQkJc3dpdGNoIChuU3R5bGUpCi0JCXsKLQkJZGVmYXVsdDoKLQkJY2FzZSBQQlNfU09MSUQ6Ci0JCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixUUlVFKTsKLQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJewotCQkJCXNBcHBTdHJlYW0gPDwgc0NvbG9yOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgPDwgIiAiIDw8IGZCb3R0b20gPDwgIiAiIDw8IGZSaWdodCAtIGZMZWZ0IDw8ICIgIiA8PCBmVG9wIC0gZkJvdHRvbSA8PCAiIHJlXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggPDwgIiAiCi0JCQkJCTw8IGZSaWdodCAtIGZMZWZ0IC0gZldpZHRoICogMiA8PCAiICIgPDwgZlRvcCAtIGZCb3R0b20gLSBmV2lkdGggKiAyIDw8ICIgcmVcbiI7Ci0JCQkJc0FwcFN0cmVhbSA8PCAiZipcbiI7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQQlNfREFTSDoKLQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLEZBTFNFKTsKLQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJewotCQkJCXNBcHBTdHJlYW0gPDwgc0NvbG9yOwotCQkJCXNBcHBTdHJlYW0gPDwgZldpZHRoIDw8ICIgdyIgPDwgIiBbIiA8PCBkYXNoLm5EYXNoIDw8ICIgIiA8PCBkYXNoLm5HYXAgPDwgIl0gIiA8PCBkYXNoLm5QaGFzZSA8PCAiIGRcbiI7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbVxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZlRvcCAtIGZXaWR0aCAvIDIgPDwgIiBsXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZldpZHRoIC8gMiA8PCAiICIgPDwgZlRvcCAtIGZXaWR0aCAvIDIgPDwgIiBsXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZldpZHRoIC8gMiA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIgPDwgIiBsXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMiA8PCAiIGwgU1xuIjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBCU19CRVZFTEVEOgotCQljYXNlIFBCU19JTlNFVDoKLQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyTGVmdFRvcCxUUlVFKTsKLQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJewotCQkJCXNBcHBTdHJlYW0gPDwgc0NvbG9yOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCA8PCAiIG1cbiI7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoIDw8ICIgbFxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoIDw8ICIgbFxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgbFxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoICogMiA8PCAiIGwgZlxuIjsKLQkJCX0KKyAgICBzd2l0Y2ggKG5TdHlsZSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgIGNhc2UgUEJTX1NPTElEOgorICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgVFJVRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCA8PCAiICIgPDwgZkJvdHRvbSA8PCAiICIgPDwgZlJpZ2h0IC0gZkxlZnQgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmVG9wIC0gZkJvdHRvbSA8PCAiIHJlXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmUmlnaHQgLSBmTGVmdCAtIGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmVG9wIC0gZkJvdHRvbSAtIGZXaWR0aCAqIDIgPDwgIiByZVxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJmKlxuIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEJTX0RBU0g6CisgICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBGQUxTRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmV2lkdGggPDwgIiB3IgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBbIiA8PCBkYXNoLm5EYXNoIDw8ICIgIiA8PCBkYXNoLm5HYXAgPDwgIl0gIgorICAgICAgICAgICAgICAgICAgICAgPDwgZGFzaC5uUGhhc2UgPDwgIiBkXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBtXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggLyAyIDw8ICIgIiA8PCBmVG9wIC0gZldpZHRoIC8gMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZldpZHRoIC8gMiA8PCAiICIgPDwgZlRvcCAtIGZXaWR0aCAvIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGxcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGwgU1xuIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEJTX0JFVkVMRUQ6CisgICAgICBjYXNlIFBCU19JTlNFVDoKKyAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLCBUUlVFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbVxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGxcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggKiAyCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGxcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsIGZcbiI7CisgICAgICAgIH0KIAotCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSxUUlVFKTsKLQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJewotCQkJCXNBcHBTdHJlYW0gPDwgc0NvbG9yOwotCQkJCXNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwJZlRvcCAtIGZIYWxmV2lkdGggPDwgIiBtXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwJZkJvdHRvbSArIGZIYWxmV2lkdGggPDwgIiBsXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCAJZkJvdHRvbSArIGZIYWxmV2lkdGggPDwgIiBsXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbFxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMiA8PCAiIGwgZlxuIjsKLQkJCX0KKyAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSwgVFJVRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBtXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsIGZcbiI7CisgICAgICAgIH0KIAotCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsVFJVRSk7Ci0JCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKLQkJCXsKLQkJCQlzQXBwU3RyZWFtIDw8IHNDb2xvcjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PAlmUmlnaHQgLSBmTGVmdCA8PCAiICIgPDwgZlRvcCAtIGZCb3R0b20gPDwgIiByZVxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggPDwgIiAiCi0JCQkJCTw8IGZSaWdodCAtIGZMZWZ0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmQm90dG9tIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiByZSBmKlxuIjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBCU19VTkRFUkxJTkVEOgotCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOwotCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmV2lkdGggPDwgIiB3XG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbVxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZSaWdodCA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIgPDwgIiBsIFNcbiI7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQorICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgVFJVRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCA8PCAiICIgPDwgZkJvdHRvbSA8PCAiICIgPDwgZlJpZ2h0IC0gZkxlZnQgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmVG9wIC0gZkJvdHRvbSA8PCAiIHJlXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZSaWdodCAtIGZMZWZ0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmVG9wIC0gZkJvdHRvbSAtIGZIYWxmV2lkdGggKiAyIDw8ICIgcmUgZipcbiI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBCU19VTkRFUkxJTkVEOgorICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgRkFMU0UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZldpZHRoIDw8ICIgd1xuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMiA8PCAiIG1cbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbCBTXG4iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCQlzQXBwU3RyZWFtIDw8ICJRXG4iOwotCX0KKyAgICBzQXBwU3RyZWFtIDw8ICJRXG4iOworICB9CiAKLQlyZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0Q2lyY2xlQm9yZGVyQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0ZMT0FUIGZXaWR0aCwKLQkJCQkJCQkJCQkJCWNvbnN0IENQV0xfQ29sb3IgJiBjb2xvciwgY29uc3QgQ1BXTF9Db2xvciAmIGNyTGVmdFRvcCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyUmlnaHRCb3R0b20sCi0JCQkJCQkJCQkJCQlpbnQzMl90IG5TdHlsZSwgY29uc3QgQ1BXTF9EYXNoICYgZGFzaCkKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKLQlDRlhfQnl0ZVN0cmluZyBzQ29sb3I7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRDaXJjbGVCb3JkZXJBcHBTdHJlYW0oCisgICAgY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgIEZYX0ZMT0FUIGZXaWR0aCwKKyAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwKKyAgICBjb25zdCBDUFdMX0NvbG9yJiBjckxlZnRUb3AsCisgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JSaWdodEJvdHRvbSwKKyAgICBpbnQzMl90IG5TdHlsZSwKKyAgICBjb25zdCBDUFdMX0Rhc2gmIGRhc2gpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CisgIENGWF9CeXRlU3RyaW5nIHNDb2xvcjsKIAorICBpZiAoZldpZHRoID4gMC4wZikgeworICAgIHNBcHBTdHJlYW0gPDwgInFcbiI7CiAKKyAgICBzd2l0Y2ggKG5TdHlsZSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgIGNhc2UgUEJTX1NPTElEOgorICAgICAgY2FzZSBQQlNfVU5ERVJMSU5FRDogeworICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgRkFMU0UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZldpZHRoIDw8ICIgd1xuIiA8PCBzQ29sb3IKKyAgICAgICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LCBmV2lkdGggLyAyLjBmKSkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgU1xuUVxuIjsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgUEJTX0RBU0g6IHsKKyAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsIEZBTFNFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZXaWR0aCA8PCAiIHdcbiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJbIiA8PCBkYXNoLm5EYXNoIDw8ICIgIiA8PCBkYXNoLm5HYXAgPDwgIl0gIgorICAgICAgICAgICAgICAgICAgICAgPDwgZGFzaC5uUGhhc2UgPDwgIiBkXG4iIDw8IHNDb2xvcgorICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2lyY2xlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3QsIGZXaWR0aCAvIDIuMGYpKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBTXG5RXG4iOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBQQlNfQkVWRUxFRDogeworICAgICAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsKIAorICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgRkFMU0UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIgPDwgc0NvbG9yCisgICAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUocmVjdCkgPDwgIiBTXG5RXG4iOworICAgICAgICB9CiAKKyAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLCBGQUxTRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIiA8PCBzQ29sb3IKKyAgICAgICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX0hhbGZDaXJjbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdCwgZkhhbGZXaWR0aCAqIDAuNzVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfUEkgLyA0LjBmKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBTXG5RXG4iOworICAgICAgICB9CiAKKyAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSwgRkFMU0UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIgPDwgc0NvbG9yCisgICAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9IYWxmQ2lyY2xlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3QsIGZIYWxmV2lkdGggKiAwLjc1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX1BJICogNSAvIDQuMGYpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIFNcblFcbiI7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFBCU19JTlNFVDogeworICAgICAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsKIAotCWlmIChmV2lkdGggPiAwLjBmKQotCXsKLQkJc0FwcFN0cmVhbSA8PCAicVxuIjsKKyAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsIEZBTFNFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iIDw8IHNDb2xvcgorICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2lyY2xlKHJlY3QpIDw8ICIgU1xuUVxuIjsKKyAgICAgICAgfQogCi0JCXN3aXRjaCAoblN0eWxlKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgUEJTX1NPTElEOgotCQljYXNlIFBCU19VTkRFUkxJTkVEOgotCQkJewotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLEZBTFNFKTsKLQkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKLQkJCQl7Ci0JCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZldpZHRoIDw8ICIgd1xuIiA8PCBzQ29sb3IKLQkJCQkJCTw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LGZXaWR0aCAvIDIuMGYpKQotCQkJCQkJPDwgIiBTXG5RXG4iOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBCU19EQVNIOgotCQkJewotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLEZBTFNFKTsKLQkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKLQkJCQl7Ci0JCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZldpZHRoIDw8ICIgd1xuIgotCQkJCQkJPDwgIlsiIDw8IGRhc2gubkRhc2ggPDwgIiAiIDw8IGRhc2gubkdhcCA8PCAiXSAiIDw8IGRhc2gublBoYXNlIDw8ICIgZFxuIgotCQkJCQkJPDwgc0NvbG9yIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LGZXaWR0aCAvIDIuMGYpKQotCQkJCQkJPDwgIiBTXG5RXG4iOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBCU19CRVZFTEVEOgotCQkJewotCQkJCUZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOworICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckxlZnRUb3AsIEZBTFNFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iIDw8IHNDb2xvcgorICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LCBmSGFsZldpZHRoICogMC43NWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9QSSAvIDQuMGYpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIFNcblFcbiI7CisgICAgICAgIH0KIAotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLEZBTFNFKTsKLQkJCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKLQkJCQl7Ci0JCQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIKLQkJCQkJCTw8IHNDb2xvciA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUocmVjdCkKLQkJCQkJCTw8ICIgU1xuUVxuIjsKLQkJCQl9CisgICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyUmlnaHRCb3R0b20sIEZBTFNFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iIDw8IHNDb2xvcgorICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LCBmSGFsZldpZHRoICogMC43NWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9QSSAqIDUgLyA0LjBmKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBTXG5RXG4iOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgIH0KIAotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyTGVmdFRvcCxGQUxTRSk7Ci0JCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQkJewotCQkJCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iCi0JCQkJCQk8PCBzQ29sb3IgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZShDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LGZIYWxmV2lkdGggKiAwLjc1ZiksUFdMX1BJLzQuMGYpCi0JCQkJCQk8PCAiIFNcblFcbiI7Ci0JCQkJfQorICAgIHNBcHBTdHJlYW0gPDwgIlFcbiI7CisgIH0KIAotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyUmlnaHRCb3R0b20sRkFMU0UpOwotCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJCXsKLQkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgotCQkJCQkJPDwgc0NvbG9yIDw8IENQV0xfVXRpbHM6OkdldEFQX0hhbGZDaXJjbGUoQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdCxmSGFsZldpZHRoICogMC43NWYpLFBXTF9QSSo1LzQuMGYpCi0JCQkJCQk8PCAiIFNcblFcbiI7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUEJTX0lOU0VUOgotCQkJewotCQkJCUZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOwotCi0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOwotCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJCXsKLQkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgotCQkJCQkJPDwgc0NvbG9yIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyZWN0KQotCQkJCQkJPDwgIiBTXG5RXG4iOwotCQkJCX0KLQotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyTGVmdFRvcCxGQUxTRSk7Ci0JCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQkJewotCQkJCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iCi0JCQkJCQk8PCBzQ29sb3IgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZShDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LGZIYWxmV2lkdGggKiAwLjc1ZiksUFdMX1BJLzQuMGYpCi0JCQkJCQk8PCAiIFNcblFcbiI7Ci0JCQkJfQotCi0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSxGQUxTRSk7Ci0JCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQkJewotCQkJCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iCi0JCQkJCQk8PCBzQ29sb3IgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZShDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LGZIYWxmV2lkdGggKiAwLjc1ZiksUFdMX1BJKjUvNC4wZikKLQkJCQkJCTw8ICIgU1xuUVxuIjsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCXNBcHBTdHJlYW0gPDwgIlFcbiI7Ci0JfQotCi0JcmV0dXJuIHNBcHBTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNQV0xfQ29sb3IgQ1BXTF9VdGlsczo6U3Vic3RyYWN0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciAmIHNDb2xvcixGWF9GTE9BVCBmQ29sb3JTdWIpCi17Ci0JQ1BXTF9Db2xvciBzUmV0OwotCXNSZXQubkNvbG9yVHlwZSA9IHNDb2xvci5uQ29sb3JUeXBlOworQ1BXTF9Db2xvciBDUFdMX1V0aWxzOjpTdWJzdHJhY3RDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBzQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb2xvclN1YikgeworICBDUFdMX0NvbG9yIHNSZXQ7CisgIHNSZXQubkNvbG9yVHlwZSA9IHNDb2xvci5uQ29sb3JUeXBlOwogCi0Jc3dpdGNoIChzQ29sb3IubkNvbG9yVHlwZSkKLQl7Ci0JY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6Ci0JCXNSZXQubkNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7Ci0JCXNSZXQuZkNvbG9yMSA9IFBXTF9NQVgoMSAtIGZDb2xvclN1YiwwLjBmKTsKLQkJc1JldC5mQ29sb3IyID0gUFdMX01BWCgxIC0gZkNvbG9yU3ViLDAuMGYpOwotCQlzUmV0LmZDb2xvcjMgPSBQV0xfTUFYKDEgLSBmQ29sb3JTdWIsMC4wZik7Ci0JCWJyZWFrOwotCWNhc2UgQ09MT1JUWVBFX1JHQjoKLQljYXNlIENPTE9SVFlQRV9HUkFZOgotCWNhc2UgQ09MT1JUWVBFX0NNWUs6Ci0JCXNSZXQuZkNvbG9yMSA9IFBXTF9NQVgoc0NvbG9yLmZDb2xvcjEgLSBmQ29sb3JTdWIsMC4wZik7Ci0JCXNSZXQuZkNvbG9yMiA9IFBXTF9NQVgoc0NvbG9yLmZDb2xvcjIgLSBmQ29sb3JTdWIsMC4wZik7Ci0JCXNSZXQuZkNvbG9yMyA9IFBXTF9NQVgoc0NvbG9yLmZDb2xvcjMgLSBmQ29sb3JTdWIsMC4wZik7Ci0JCXNSZXQuZkNvbG9yNCA9IFBXTF9NQVgoc0NvbG9yLmZDb2xvcjQgLSBmQ29sb3JTdWIsMC4wZik7Ci0JCWJyZWFrOwotCX0KKyAgc3dpdGNoIChzQ29sb3IubkNvbG9yVHlwZSkgeworICAgIGNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOgorICAgICAgc1JldC5uQ29sb3JUeXBlID0gQ09MT1JUWVBFX1JHQjsKKyAgICAgIHNSZXQuZkNvbG9yMSA9IFBXTF9NQVgoMSAtIGZDb2xvclN1YiwgMC4wZik7CisgICAgICBzUmV0LmZDb2xvcjIgPSBQV0xfTUFYKDEgLSBmQ29sb3JTdWIsIDAuMGYpOworICAgICAgc1JldC5mQ29sb3IzID0gUFdMX01BWCgxIC0gZkNvbG9yU3ViLCAwLjBmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JUWVBFX1JHQjoKKyAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgorICAgIGNhc2UgQ09MT1JUWVBFX0NNWUs6CisgICAgICBzUmV0LmZDb2xvcjEgPSBQV0xfTUFYKHNDb2xvci5mQ29sb3IxIC0gZkNvbG9yU3ViLCAwLjBmKTsKKyAgICAgIHNSZXQuZkNvbG9yMiA9IFBXTF9NQVgoc0NvbG9yLmZDb2xvcjIgLSBmQ29sb3JTdWIsIDAuMGYpOworICAgICAgc1JldC5mQ29sb3IzID0gUFdMX01BWChzQ29sb3IuZkNvbG9yMyAtIGZDb2xvclN1YiwgMC4wZik7CisgICAgICBzUmV0LmZDb2xvcjQgPSBQV0xfTUFYKHNDb2xvci5mQ29sb3I0IC0gZkNvbG9yU3ViLCAwLjBmKTsKKyAgICAgIGJyZWFrOworICB9CiAKLQlyZXR1cm4gc1JldDsKKyAgcmV0dXJuIHNSZXQ7CiB9CiAKLUNQV0xfQ29sb3IgQ1BXTF9VdGlsczo6RGV2aWRlQ29sb3IoY29uc3QgQ1BXTF9Db2xvciAmIHNDb2xvcixGWF9GTE9BVCBmQ29sb3JEZXZpZGUpCi17Ci0JQ1BXTF9Db2xvciBzUmV0OwotCXNSZXQubkNvbG9yVHlwZSA9IHNDb2xvci5uQ29sb3JUeXBlOworQ1BXTF9Db2xvciBDUFdMX1V0aWxzOjpEZXZpZGVDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBzQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb2xvckRldmlkZSkgeworICBDUFdMX0NvbG9yIHNSZXQ7CisgIHNSZXQubkNvbG9yVHlwZSA9IHNDb2xvci5uQ29sb3JUeXBlOwogCi0Jc3dpdGNoIChzQ29sb3IubkNvbG9yVHlwZSkKLQl7Ci0JY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6Ci0JCXNSZXQubkNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7Ci0JCXNSZXQuZkNvbG9yMSA9IDEgLyBmQ29sb3JEZXZpZGU7Ci0JCXNSZXQuZkNvbG9yMiA9IDEgLyBmQ29sb3JEZXZpZGU7Ci0JCXNSZXQuZkNvbG9yMyA9IDEgLyBmQ29sb3JEZXZpZGU7Ci0JCWJyZWFrOwotCWNhc2UgQ09MT1JUWVBFX1JHQjoKLQljYXNlIENPTE9SVFlQRV9HUkFZOgotCWNhc2UgQ09MT1JUWVBFX0NNWUs6Ci0JCXNSZXQgPSBzQ29sb3I7Ci0JCXNSZXQuZkNvbG9yMSAvPSBmQ29sb3JEZXZpZGU7Ci0JCXNSZXQuZkNvbG9yMiAvPSBmQ29sb3JEZXZpZGU7Ci0JCXNSZXQuZkNvbG9yMyAvPSBmQ29sb3JEZXZpZGU7Ci0JCXNSZXQuZkNvbG9yNCAvPSBmQ29sb3JEZXZpZGU7Ci0JCWJyZWFrOwotCX0KKyAgc3dpdGNoIChzQ29sb3IubkNvbG9yVHlwZSkgeworICAgIGNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOgorICAgICAgc1JldC5uQ29sb3JUeXBlID0gQ09MT1JUWVBFX1JHQjsKKyAgICAgIHNSZXQuZkNvbG9yMSA9IDEgLyBmQ29sb3JEZXZpZGU7CisgICAgICBzUmV0LmZDb2xvcjIgPSAxIC8gZkNvbG9yRGV2aWRlOworICAgICAgc1JldC5mQ29sb3IzID0gMSAvIGZDb2xvckRldmlkZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JUWVBFX1JHQjoKKyAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgorICAgIGNhc2UgQ09MT1JUWVBFX0NNWUs6CisgICAgICBzUmV0ID0gc0NvbG9yOworICAgICAgc1JldC5mQ29sb3IxIC89IGZDb2xvckRldmlkZTsKKyAgICAgIHNSZXQuZkNvbG9yMiAvPSBmQ29sb3JEZXZpZGU7CisgICAgICBzUmV0LmZDb2xvcjMgLz0gZkNvbG9yRGV2aWRlOworICAgICAgc1JldC5mQ29sb3I0IC89IGZDb2xvckRldmlkZTsKKyAgICAgIGJyZWFrOworICB9CiAKLQlyZXR1cm4gc1JldDsKKyAgcmV0dXJuIHNSZXQ7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9DaGVjayhjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX0NoZWNrKHJjQkJveCkgPDwgImZcblFcbiI7Ci0JcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fQ2hlY2soY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQVA7CisgIHNBUCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsIFRSVUUpCisgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaGVjayhyY0JCb3gpIDw8ICJmXG5RXG4iOworICByZXR1cm4gc0FQLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX0NpcmNsZShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyY0JCb3gpIDw8ICJmXG5RXG4iOwotCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX0NpcmNsZShjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQVA7CisgIHNBUCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsIFRSVUUpCisgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUocmNCQm94KSA8PCAiZlxuUVxuIjsKKyAgcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9Dcm9zcyhjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LEZBTFNFKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9Dcm9zcyhyY0JCb3gpIDw8ICJTXG5RXG4iOwotCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX0Nyb3NzKGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCkgeworICBDRlhfQnl0ZVRleHRCdWYgc0FQOworICBzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCBGQUxTRSkKKyAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX0Nyb3NzKHJjQkJveCkgPDwgIlNcblFcbiI7CisgIHJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fRGlhbW9uZChjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbjEgd1xuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsVFJVRSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfRGlhbW9uZChyY0JCb3gpIDw8ICJmXG5RXG4iOwotCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX0RpYW1vbmQoY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKKyAgc0FQIDw8ICJxXG4xIHdcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCBUUlVFKQorICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfRGlhbW9uZChyY0JCb3gpIDw8ICJmXG5RXG4iOworICByZXR1cm4gc0FQLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX1NxdWFyZShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX1NxdWFyZShyY0JCb3gpIDw8ICJmXG5RXG4iOwotCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX1NxdWFyZShjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQVA7CisgIHNBUCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsIFRSVUUpCisgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9TcXVhcmUocmNCQm94KSA8PCAiZlxuUVxuIjsKKyAgcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9TdGFyKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCkKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc0FQOwotCXNBUCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsVFJVRSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfU3RhcihyY0JCb3gpIDw8ICJmXG5RXG4iOwotCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX1N0YXIoY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKKyAgc0FQIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCwgVFJVRSkKKyAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX1N0YXIocmNCQm94KSA8PCAiZlxuUVxuIjsKKyAgcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENoZWNrQm94QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwKLQkJCQkJCQkJCQkJCQlpbnQzMl90IG5TdHlsZSwKLQkJCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQotewotCUNQREZfUmVjdCByY0NlbnRlciA9IEdldENlbnRlclNxdWFyZShyY0JCb3gpOwotCXN3aXRjaCAoblN0eWxlKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgUENTX0NIRUNLOgotCQlyZXR1cm4gR2V0QXBwU3RyZWFtX0NoZWNrKHJjQ2VudGVyLGNyVGV4dCk7Ci0JY2FzZSBQQ1NfQ0lSQ0xFOgotCQlyZXR1cm4gR2V0QXBwU3RyZWFtX0NpcmNsZShTY2FsZVJlY3QocmNDZW50ZXIsMi4wZi8zLjBmKSxjclRleHQpOwotCWNhc2UgUENTX0NST1NTOgotCQlyZXR1cm4gR2V0QXBwU3RyZWFtX0Nyb3NzKHJjQ2VudGVyLGNyVGV4dCk7Ci0JY2FzZSBQQ1NfRElBTU9ORDoKLQkJcmV0dXJuIEdldEFwcFN0cmVhbV9EaWFtb25kKFNjYWxlUmVjdChyY0NlbnRlciwyLjBmLzMuMGYpLGNyVGV4dCk7Ci0JY2FzZSBQQ1NfU1FVQVJFOgotCQlyZXR1cm4gR2V0QXBwU3RyZWFtX1NxdWFyZShTY2FsZVJlY3QocmNDZW50ZXIsMi4wZi8zLjBmKSxjclRleHQpOwotCWNhc2UgUENTX1NUQVI6Ci0JCXJldHVybiBHZXRBcHBTdHJlYW1fU3RhcihTY2FsZVJlY3QocmNDZW50ZXIsMi4wZi8zLjBmKSxjclRleHQpOwotCX0KK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENoZWNrQm94QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpIHsKKyAgQ1BERl9SZWN0IHJjQ2VudGVyID0gR2V0Q2VudGVyU3F1YXJlKHJjQkJveCk7CisgIHN3aXRjaCAoblN0eWxlKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIFBDU19DSEVDSzoKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fQ2hlY2socmNDZW50ZXIsIGNyVGV4dCk7CisgICAgY2FzZSBQQ1NfQ0lSQ0xFOgorICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9DaXJjbGUoU2NhbGVSZWN0KHJjQ2VudGVyLCAyLjBmIC8gMy4wZiksIGNyVGV4dCk7CisgICAgY2FzZSBQQ1NfQ1JPU1M6CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX0Nyb3NzKHJjQ2VudGVyLCBjclRleHQpOworICAgIGNhc2UgUENTX0RJQU1PTkQ6CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX0RpYW1vbmQoU2NhbGVSZWN0KHJjQ2VudGVyLCAyLjBmIC8gMy4wZiksIGNyVGV4dCk7CisgICAgY2FzZSBQQ1NfU1FVQVJFOgorICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9TcXVhcmUoU2NhbGVSZWN0KHJjQ2VudGVyLCAyLjBmIC8gMy4wZiksIGNyVGV4dCk7CisgICAgY2FzZSBQQ1NfU1RBUjoKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fU3RhcihTY2FsZVJlY3QocmNDZW50ZXIsIDIuMGYgLyAzLjBmKSwgY3JUZXh0KTsKKyAgfQogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRSYWRpb0J1dHRvbkFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsCi0JCQkJCQkJCQkJCQkJaW50MzJfdCBuU3R5bGUsCi0JCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCkKLXsKLQlDUERGX1JlY3QgcmNDZW50ZXIgPSBHZXRDZW50ZXJTcXVhcmUocmNCQm94KTsKLQlzd2l0Y2ggKG5TdHlsZSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIFBDU19DSEVDSzoKLQkJcmV0dXJuIEdldEFwcFN0cmVhbV9DaGVjayhyY0NlbnRlcixjclRleHQpOwotCWNhc2UgUENTX0NJUkNMRToKLQkJcmV0dXJuIEdldEFwcFN0cmVhbV9DaXJjbGUoU2NhbGVSZWN0KHJjQ2VudGVyLDEuMGYvMi4wZiksY3JUZXh0KTsKLQljYXNlIFBDU19DUk9TUzoKLQkJcmV0dXJuIEdldEFwcFN0cmVhbV9Dcm9zcyhyY0NlbnRlcixjclRleHQpOwotCWNhc2UgUENTX0RJQU1PTkQ6Ci0JCXJldHVybiBHZXRBcHBTdHJlYW1fRGlhbW9uZChTY2FsZVJlY3QocmNDZW50ZXIsMi4wZi8zLjBmKSxjclRleHQpOwotCWNhc2UgUENTX1NRVUFSRToKLQkJcmV0dXJuIEdldEFwcFN0cmVhbV9TcXVhcmUoU2NhbGVSZWN0KHJjQ2VudGVyLDIuMGYvMy4wZiksY3JUZXh0KTsKLQljYXNlIFBDU19TVEFSOgotCQlyZXR1cm4gR2V0QXBwU3RyZWFtX1N0YXIoU2NhbGVSZWN0KHJjQ2VudGVyLDIuMGYvMy4wZiksY3JUZXh0KTsKLQl9CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRSYWRpb0J1dHRvbkFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7CisgIENQREZfUmVjdCByY0NlbnRlciA9IEdldENlbnRlclNxdWFyZShyY0JCb3gpOworICBzd2l0Y2ggKG5TdHlsZSkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBQQ1NfQ0hFQ0s6CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX0NoZWNrKHJjQ2VudGVyLCBjclRleHQpOworICAgIGNhc2UgUENTX0NJUkNMRToKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fQ2lyY2xlKFNjYWxlUmVjdChyY0NlbnRlciwgMS4wZiAvIDIuMGYpLCBjclRleHQpOworICAgIGNhc2UgUENTX0NST1NTOgorICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9Dcm9zcyhyY0NlbnRlciwgY3JUZXh0KTsKKyAgICBjYXNlIFBDU19ESUFNT05EOgorICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9EaWFtb25kKFNjYWxlUmVjdChyY0NlbnRlciwgMi4wZiAvIDMuMGYpLCBjclRleHQpOworICAgIGNhc2UgUENTX1NRVUFSRToKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fU3F1YXJlKFNjYWxlUmVjdChyY0NlbnRlciwgMi4wZiAvIDMuMGYpLCBjclRleHQpOworICAgIGNhc2UgUENTX1NUQVI6CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX1N0YXIoU2NhbGVSZWN0KHJjQ2VudGVyLCAyLjBmIC8gMy4wZiksIGNyVGV4dCk7CisgIH0KIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0RHJvcEJ1dHRvbkFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXREcm9wQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmNCQm94KSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwogCi0JaWYgKCFyY0JCb3guSXNFbXB0eSgpKQotCXsKLQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMjIwLjBmLzI1NS4wZiwyMjAuMGYvMjU1LjBmLDIyMC4wZi8yNTUuMGYpLFRSVUUpOwotCQlzQXBwU3RyZWFtIDw8IHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3guYm90dG9tIDw8ICIgIgotCQkJCTw8IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3gudG9wIC0gcmNCQm94LmJvdHRvbSA8PCAiIHJlIGZcbiI7Ci0JCXNBcHBTdHJlYW0gPDwgIlFcbiI7CisgIGlmICghcmNCQm94LklzRW1wdHkoKSkgeworICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAyMjAuMGYgLyAyNTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjAuMGYgLyAyNTUuMGYsIDIyMC4wZiAvIDI1NS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisgICAgc0FwcFN0cmVhbSA8PCByY0JCb3gubGVmdCA8PCAiICIgPDwgcmNCQm94LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0IDw8ICIgIgorICAgICAgICAgICAgICAgPDwgcmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b20gPDwgIiByZSBmXG4iOworICAgIHNBcHBTdHJlYW0gPDwgIlFcbiI7CiAKLQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PAotCQkJQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjQkJveCwyLENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMCksQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwxKSxDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDAuNSksUEJTX0JFVkVMRUQsQ1BXTF9EYXNoKDMsMCwwKSkKLQkJCTw8ICJRXG4iOworICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveCwgMiwgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC41KSwgUEJTX0JFVkVMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9EYXNoKDMsIDAsIDApKQorICAgICAgICAgICAgICAgPDwgIlFcbiI7CiAKLQkJQ1BERl9Qb2ludCBwdENlbnRlciA9IENQREZfUG9pbnQoKHJjQkJveC5sZWZ0ICsgcmNCQm94LnJpZ2h0KS8yLChyY0JCb3gudG9wICsgcmNCQm94LmJvdHRvbSkvMik7Ci0JCWlmIChJc0Zsb2F0QmlnZ2VyKHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0LDYpICYmIElzRmxvYXRCaWdnZXIocmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b20sNikpCi0JCXsKLQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgIiAwIGdcbiI7Ci0JCQlzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggLSAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIG1cbiI7Ci0JCQlzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggKyAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIGxcbiI7Ci0JCQlzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggPDwgIiAiIDw8IHB0Q2VudGVyLnkgLSAxLjVmIDw8ICIgbFxuIjsKLQkJCXNBcHBTdHJlYW0gPDwgcHRDZW50ZXIueCAtIDMgPDwgIiAiIDw8IHB0Q2VudGVyLnkgKyAxLjVmIDw8ICIgbCBmXG4iOwotCQkJc0FwcFN0cmVhbSA8PCAiUVxuIjsKLQkJfQotCX0KKyAgICBDUERGX1BvaW50IHB0Q2VudGVyID0gQ1BERl9Qb2ludCgocmNCQm94LmxlZnQgKyByY0JCb3gucmlnaHQpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmNCQm94LnRvcCArIHJjQkJveC5ib3R0b20pIC8gMik7CisgICAgaWYgKElzRmxvYXRCaWdnZXIocmNCQm94LnJpZ2h0IC0gcmNCQm94LmxlZnQsIDYpICYmCisgICAgICAgIElzRmxvYXRCaWdnZXIocmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b20sIDYpKSB7CisgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iCisgICAgICAgICAgICAgICAgIDw8ICIgMCBnXG4iOworICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54IC0gMyA8PCAiICIgPDwgcHRDZW50ZXIueSArIDEuNWYgPDwgIiBtXG4iOworICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54ICsgMyA8PCAiICIgPDwgcHRDZW50ZXIueSArIDEuNWYgPDwgIiBsXG4iOworICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54IDw8ICIgIiA8PCBwdENlbnRlci55IC0gMS41ZiA8PCAiIGxcbiI7CisgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggLSAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIGwgZlxuIjsKKyAgICAgIHNBcHBTdHJlYW0gPDwgIlFcbiI7CisgICAgfQorICB9CiAKLQlyZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0Q01ZSzJHUkFZKEZYX0ZMT0FUIGRDLEZYX0ZMT0FUIGRNLEZYX0ZMT0FUIGRZLEZYX0ZMT0FUIGRLLEZYX0ZMT0FUICZkR3JheSkKLXsKLQlpZiAoZEM8MCB8fCBkQz4xIHx8IGRNPDAgfHwgZE0+MSB8fCBkWSA8IDAgfHwgZFkgPjEgfHwgZEsgPCAwIHx8IGRLID4xKQotCQlyZXR1cm47Ci0JZEdyYXkgPSAxLjBmIC0gRlhfTUlOKDEuMGYsMC4zZipkQyswLjU5ZiAqIGRNICsgMC4xMWYqZFkrZEspOwordm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0Q01ZSzJHUkFZKEZYX0ZMT0FUIGRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkR3JheSkgeworICBpZiAoZEMgPCAwIHx8IGRDID4gMSB8fCBkTSA8IDAgfHwgZE0gPiAxIHx8IGRZIDwgMCB8fCBkWSA+IDEgfHwgZEsgPCAwIHx8CisgICAgICBkSyA+IDEpCisgICAgcmV0dXJuOworICBkR3JheSA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgMC4zZiAqIGRDICsgMC41OWYgKiBkTSArIDAuMTFmICogZFkgKyBkSyk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6Q29udmVydEdSQVkyQ01ZSyhGWF9GTE9BVCBkR3JheSxGWF9GTE9BVCAgJmRDLEZYX0ZMT0FUICZkTSxGWF9GTE9BVCAmZFksRlhfRkxPQVQgJmRLKQotewotCWlmIChkR3JheSA8MCB8fCBkR3JheSA+MSkKLQkJcmV0dXJuOwotCWRDID0gMC4wZjsKLQlkTSA9IDAuMGY7Ci0JZFkgPSAwLjBmOwotCWRLID0gMS4wZi1kR3JheTsKK3ZvaWQgQ1BXTF9VdGlsczo6Q29udmVydEdSQVkyQ01ZSyhGWF9GTE9BVCBkR3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZEspIHsKKyAgaWYgKGRHcmF5IDwgMCB8fCBkR3JheSA+IDEpCisgICAgcmV0dXJuOworICBkQyA9IDAuMGY7CisgIGRNID0gMC4wZjsKKyAgZFkgPSAwLjBmOworICBkSyA9IDEuMGYgLSBkR3JheTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0R1JBWTJSR0IoRlhfRkxPQVQgZEdyYXksRlhfRkxPQVQgJmRSLEZYX0ZMT0FUICZkRyxGWF9GTE9BVCAmZEIpCi17Ci0JaWYgKGRHcmF5IDwwIHx8IGRHcmF5ID4xKQotCQlyZXR1cm47Ci0JZFIgPSBkR3JheTsKLQlkRyA9IGRHcmF5OwotCWRCID0gZEdyYXk7Cit2b2lkIENQV0xfVXRpbHM6OkNvbnZlcnRHUkFZMlJHQihGWF9GTE9BVCBkR3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkQikgeworICBpZiAoZEdyYXkgPCAwIHx8IGRHcmF5ID4gMSkKKyAgICByZXR1cm47CisgIGRSID0gZEdyYXk7CisgIGRHID0gZEdyYXk7CisgIGRCID0gZEdyYXk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6Q29udmVydFJHQjJHUkFZKEZYX0ZMT0FUIGRSLEZYX0ZMT0FUIGRHLEZYX0ZMT0FUIGRCLEZYX0ZMT0FUICZkR3JheSkKLXsKLQlpZiAoZFI8MCB8fCBkUj4xIHx8IGRHPDAgfHwgZEcgPiAwIHx8IGRCIDwgMCB8fCBkQiA+MSkKLQkJcmV0dXJuOwotCWRHcmF5ID0gMC4zZipkUiswLjU5ZipkRyswLjExZipkQjsKK3ZvaWQgQ1BXTF9VdGlsczo6Q29udmVydFJHQjJHUkFZKEZYX0ZMT0FUIGRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkR3JheSkgeworICBpZiAoZFIgPCAwIHx8IGRSID4gMSB8fCBkRyA8IDAgfHwgZEcgPiAwIHx8IGRCIDwgMCB8fCBkQiA+IDEpCisgICAgcmV0dXJuOworICBkR3JheSA9IDAuM2YgKiBkUiArIDAuNTlmICogZEcgKyAwLjExZiAqIGRCOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkNvbnZlcnRDTVlLMlJHQihGWF9GTE9BVCBkQyxGWF9GTE9BVCBkTSxGWF9GTE9BVCBkWSxGWF9GTE9BVCBkSyxGWF9GTE9BVCAmZFIsRlhfRkxPQVQgJmRHLEZYX0ZMT0FUICZkQikKLXsKLQlpZiAoZEMgPDAgfHwgZEM+MSB8fCBkTSA8IDAgfHwgZE0gPiAxIHx8IGRZIDwgMCB8fCBkWSA+IDEgfHwgZEsgPCAwIHx8IGRLID4gMSApCi0JCXJldHVybjsKLQlkUiA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgZEMgKyBkSyk7Ci0JZEcgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIGRNICsgZEspOwotCWRCID0gMS4wZiAtIEZYX01JTigxLjBmLCBkWSArIGRLKTsKK3ZvaWQgQ1BXTF9VdGlsczo6Q29udmVydENNWUsyUkdCKEZYX0ZMT0FUIGRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRCKSB7CisgIGlmIChkQyA8IDAgfHwgZEMgPiAxIHx8IGRNIDwgMCB8fCBkTSA+IDEgfHwgZFkgPCAwIHx8IGRZID4gMSB8fCBkSyA8IDAgfHwKKyAgICAgIGRLID4gMSkKKyAgICByZXR1cm47CisgIGRSID0gMS4wZiAtIEZYX01JTigxLjBmLCBkQyArIGRLKTsKKyAgZEcgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIGRNICsgZEspOworICBkQiA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgZFkgKyBkSyk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6Q29udmVydFJHQjJDTVlLKEZYX0ZMT0FUIGRSLEZYX0ZMT0FUIGRHLEZYX0ZMT0FUIGRCLEZYX0ZMT0FUICZkQyxGWF9GTE9BVCAmZE0sRlhfRkxPQVQgJmRZLEZYX0ZMT0FUICZkSykKLXsKLQlpZiAoZFI8MCB8fCBkUj4xIHx8IGRHPDAgfHwgZEc+MSB8fCBkQjwwIHx8IGRCPjEpCi0JCXJldHVybjsKK3ZvaWQgQ1BXTF9VdGlsczo6Q29udmVydFJHQjJDTVlLKEZYX0ZMT0FUIGRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkSykgeworICBpZiAoZFIgPCAwIHx8IGRSID4gMSB8fCBkRyA8IDAgfHwgZEcgPiAxIHx8IGRCIDwgMCB8fCBkQiA+IDEpCisgICAgcmV0dXJuOwogCi0JZEMgPSAxLjBmIC0gZFI7Ci0JZE0gPSAxLjBmIC0gZEc7Ci0JZFkgPSAxLjBmIC0gZEI7Ci0JZEsgPSBGWF9NSU4oZEMsIEZYX01JTihkTSwgZFkpKTsKKyAgZEMgPSAxLjBmIC0gZFI7CisgIGRNID0gMS4wZiAtIGRHOworICBkWSA9IDEuMGYgLSBkQjsKKyAgZEsgPSBGWF9NSU4oZEMsIEZYX01JTihkTSwgZFkpKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpQV0xDb2xvclRvQVJHQihjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwgaW50MzJfdCYgYWxwaGEsIEZYX0ZMT0FUJiByZWQsIEZYX0ZMT0FUJiBncmVlbiwgRlhfRkxPQVQmIGJsdWUpCi17Ci0Jc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKQotCXsKLQljYXNlIENPTE9SVFlQRV9UUkFOU1BBUkVOVDoKLQkJewotCQkJYWxwaGEgPSAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0JCXsKLQkJCUNvbnZlcnRHUkFZMlJHQihjb2xvci5mQ29sb3IxLCByZWQsIGdyZWVuLCBibHVlKTsKLQkJfQotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9SR0I6Ci0JCXsKLQkJCXJlZCA9IGNvbG9yLmZDb2xvcjE7Ci0JCQlncmVlbiA9IGNvbG9yLmZDb2xvcjI7Ci0JCQlibHVlID0gY29sb3IuZkNvbG9yMzsKLQkJfQotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9DTVlLOgotCQl7Ci0JCQlDb252ZXJ0Q01ZSzJSR0IoY29sb3IuZkNvbG9yMSwgY29sb3IuZkNvbG9yMiwgY29sb3IuZkNvbG9yMywgY29sb3IuZkNvbG9yNCwKLQkJCQlyZWQsIGdyZWVuLCBibHVlKTsKLQkJfQotCQlicmVhazsKLQl9Cit2b2lkIENQV0xfVXRpbHM6OlBXTENvbG9yVG9BUkdCKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYmx1ZSkgeworICBzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpIHsKKyAgICBjYXNlIENPTE9SVFlQRV9UUkFOU1BBUkVOVDogeworICAgICAgYWxwaGEgPSAwOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBDT0xPUlRZUEVfR1JBWTogeworICAgICAgQ29udmVydEdSQVkyUkdCKGNvbG9yLmZDb2xvcjEsIHJlZCwgZ3JlZW4sIGJsdWUpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBDT0xPUlRZUEVfUkdCOiB7CisgICAgICByZWQgPSBjb2xvci5mQ29sb3IxOworICAgICAgZ3JlZW4gPSBjb2xvci5mQ29sb3IyOworICAgICAgYmx1ZSA9IGNvbG9yLmZDb2xvcjM7CisgICAgfSBicmVhazsKKyAgICBjYXNlIENPTE9SVFlQRV9DTVlLOiB7CisgICAgICBDb252ZXJ0Q01ZSzJSR0IoY29sb3IuZkNvbG9yMSwgY29sb3IuZkNvbG9yMiwgY29sb3IuZkNvbG9yMywKKyAgICAgICAgICAgICAgICAgICAgICBjb2xvci5mQ29sb3I0LCByZWQsIGdyZWVuLCBibHVlKTsKKyAgICB9IGJyZWFrOworICB9CiB9CiAKLUZYX0NPTE9SUkVGIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLCBpbnQzMl90IG5UcmFuc3BhcmFuY3kpCi17Ci0JaW50MzJfdCBuQWxwaGEgPSBuVHJhbnNwYXJhbmN5OwotCUZYX0ZMT0FUIGRSZWQgPSAwOwotCUZYX0ZMT0FUIGRHcmVlbiA9IDA7Ci0JRlhfRkxPQVQgZEJsdWUgPSAwOworRlhfQ09MT1JSRUYgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5UcmFuc3BhcmFuY3kpIHsKKyAgaW50MzJfdCBuQWxwaGEgPSBuVHJhbnNwYXJhbmN5OworICBGWF9GTE9BVCBkUmVkID0gMDsKKyAgRlhfRkxPQVQgZEdyZWVuID0gMDsKKyAgRlhfRkxPQVQgZEJsdWUgPSAwOwogCi0JUFdMQ29sb3JUb0FSR0IoY29sb3IsIG5BbHBoYSwgZFJlZCwgZEdyZWVuLCBkQmx1ZSk7CisgIFBXTENvbG9yVG9BUkdCKGNvbG9yLCBuQWxwaGEsIGRSZWQsIGRHcmVlbiwgZEJsdWUpOwogCi0JcmV0dXJuIEFyZ2JFbmNvZGUobkFscGhhLCAoaW50MzJfdCkoZFJlZCoyNTUpLCAoaW50MzJfdCkoZEdyZWVuKjI1NSksIChpbnQzMl90KShkQmx1ZSoyNTUpKTsKKyAgcmV0dXJuIEFyZ2JFbmNvZGUobkFscGhhLCAoaW50MzJfdCkoZFJlZCAqIDI1NSksIChpbnQzMl90KShkR3JlZW4gKiAyNTUpLAorICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkoZEJsdWUgKiAyNTUpKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxjb25zdCBDUERGX1JlY3QgJiByZWN0LAotCQkJCQkJCSAgY29uc3QgRlhfQ09MT1JSRUYgJiBjb2xvcikKLXsKLQlDRlhfUGF0aERhdGEgcGF0aDsKLQlDUERGX1JlY3QgcmNUZW1wKHJlY3QpOwotCXBhdGguQXBwZW5kUmVjdChyY1RlbXAubGVmdCxyY1RlbXAuYm90dG9tLHJjVGVtcC5yaWdodCxyY1RlbXAudG9wKTsKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLCBjb2xvciwgMCwgRlhGSUxMX1dJTkRJTkcpOwordm9pZCBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IpIHsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIENQREZfUmVjdCByY1RlbXAocmVjdCk7CisgIHBhdGguQXBwZW5kUmVjdChyY1RlbXAubGVmdCwgcmNUZW1wLmJvdHRvbSwgcmNUZW1wLnJpZ2h0LCByY1RlbXAudG9wKTsKKyAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwgY29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQljb25zdCBDUERGX1BvaW50KiBwUHRzLCBpbnQzMl90IG5Db3VudCwgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yKQotewotCUNGWF9QYXRoRGF0YSBwYXRoOwotCXBhdGguU2V0UG9pbnRDb3VudChuQ291bnQpOwordm9pZCBDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50KiBwUHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IpIHsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIHBhdGguU2V0UG9pbnRDb3VudChuQ291bnQpOwogCi0JcGF0aC5TZXRQb2ludCgwLCBwUHRzWzBdLngsIHBQdHNbMF0ueSwgRlhQVF9NT1ZFVE8pOwotCWZvciAoaW50MzJfdCBpPTE7IGk8bkNvdW50OyBpKyspCi0JCXBhdGguU2V0UG9pbnQoaSwgcFB0c1tpXS54LCBwUHRzW2ldLnksIEZYUFRfTElORVRPKTsKKyAgcGF0aC5TZXRQb2ludCgwLCBwUHRzWzBdLngsIHBQdHNbMF0ueSwgRlhQVF9NT1ZFVE8pOworICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBuQ291bnQ7IGkrKykKKyAgICBwYXRoLlNldFBvaW50KGksIHBQdHNbaV0ueCwgcFB0c1tpXS55LCBGWFBUX0xJTkVUTyk7CiAKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLCBjb2xvciwgMCwgRlhGSUxMX0FMVEVSTkFURSk7CisgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsIE5VTEwsIGNvbG9yLCAwLCBGWEZJTExfQUxURVJOQVRFKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLGNvbnN0IENQREZfUmVjdCAmIHJlY3QsCi0JCQkJCQkJICBjb25zdCBGWF9DT0xPUlJFRiAmIGNvbG9yLCBGWF9GTE9BVCBmV2lkdGgpCi17Ci0JQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0JQ1BERl9SZWN0IHJjVGVtcChyZWN0KTsKLQlwYXRoLkFwcGVuZFJlY3QocmNUZW1wLmxlZnQscmNUZW1wLmJvdHRvbSxyY1RlbXAucmlnaHQscmNUZW1wLnRvcCk7Cit2b2lkIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgpIHsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIENQREZfUmVjdCByY1RlbXAocmVjdCk7CisgIHBhdGguQXBwZW5kUmVjdChyY1RlbXAubGVmdCwgcmNUZW1wLmJvdHRvbSwgcmNUZW1wLnJpZ2h0LCByY1RlbXAudG9wKTsKIAotCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOworICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICBnc2QubV9MaW5lV2lkdGggPSBmV2lkdGg7CiAKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLCBjb2xvciwgRlhGSUxMX0FMVEVSTkFURSk7CisgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIGNvbG9yLCBGWEZJTExfQUxURVJOQVRFKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCWNvbnN0IENQREZfUG9pbnQgJiBwdE1vdmVUbywgY29uc3QgQ1BERl9Qb2ludCAmIHB0TGluZVRvLCBjb25zdCBGWF9DT0xPUlJFRiAmIGNvbG9yLCBGWF9GTE9BVCBmV2lkdGgpCi17Ci0JQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0JcGF0aC5TZXRQb2ludENvdW50KDIpOwotCXBhdGguU2V0UG9pbnQoMCwgcHRNb3ZlVG8ueCwgcHRNb3ZlVG8ueSwgRlhQVF9NT1ZFVE8pOwotCXBhdGguU2V0UG9pbnQoMSwgcHRMaW5lVG8ueCwgcHRMaW5lVG8ueSwgRlhQVF9MSU5FVE8pOwordm9pZCBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE1vdmVUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRMaW5lVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoKSB7CisgIENGWF9QYXRoRGF0YSBwYXRoOworICBwYXRoLlNldFBvaW50Q291bnQoMik7CisgIHBhdGguU2V0UG9pbnQoMCwgcHRNb3ZlVG8ueCwgcHRNb3ZlVG8ueSwgRlhQVF9NT1ZFVE8pOworICBwYXRoLlNldFBvaW50KDEsIHB0TGluZVRvLngsIHB0TGluZVRvLnksIEZYUFRfTElORVRPKTsKIAotCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOworICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICBnc2QubV9MaW5lV2lkdGggPSBmV2lkdGg7CiAKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLCBjb2xvciwgRlhGSUxMX0FMVEVSTkFURSk7CisgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIGNvbG9yLCBGWEZJTExfQUxURVJOQVRFKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxjb25zdCBDUERGX1JlY3QgJiByZWN0LAotCQkJCQkJCSAgY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yLCBpbnQzMl90IG5UcmFuc3BhcmFuY3kpCi17Ci0JQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UscFVzZXIyRGV2aWNlLHJlY3QsUFdMQ29sb3JUb0ZYQ29sb3IoY29sb3IsblRyYW5zcGFyYW5jeSkpOwordm9pZCBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblRyYW5zcGFyYW5jeSkgeworICBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMQ29sb3JUb0ZYQ29sb3IoY29sb3IsIG5UcmFuc3BhcmFuY3kpKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3U2hhZG93KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQkJCQkJCUZYX0JPT0wgYlZlcnRpY2FsLCBGWF9CT09MIGJIb3Jpem9udGFsLCBDUERGX1JlY3QgcmVjdCwKLQkJCQkJCQkJCQkJCQkJaW50MzJfdCBuVHJhbnNwYXJhbmN5LCBpbnQzMl90IG5TdGFydEdyYXksIGludDMyX3QgbkVuZEdyYXkpCi17Ci0JRlhfRkxPQVQgZlN0ZXBHcmF5ID0gMS4wZjsKK3ZvaWQgQ1BXTF9VdGlsczo6RHJhd1NoYWRvdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSG9yaXpvbnRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5UcmFuc3BhcmFuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnRHcmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkVuZEdyYXkpIHsKKyAgRlhfRkxPQVQgZlN0ZXBHcmF5ID0gMS4wZjsKIAotCWlmIChiVmVydGljYWwpCi0JewotCQlmU3RlcEdyYXkgPSAobkVuZEdyYXkgLSBuU3RhcnRHcmF5KSAvIHJlY3QuSGVpZ2h0KCk7CisgIGlmIChiVmVydGljYWwpIHsKKyAgICBmU3RlcEdyYXkgPSAobkVuZEdyYXkgLSBuU3RhcnRHcmF5KSAvIHJlY3QuSGVpZ2h0KCk7CiAKLQkJZm9yIChGWF9GTE9BVCBmeT1yZWN0LmJvdHRvbSswLjVmOyBmeTw9cmVjdC50b3AtMC41ZjsgZnkrPTEuMGYpCi0JCXsKLQkJCWludDMyX3QgbkdyYXkgPSBuU3RhcnRHcmF5ICsgKGludDMyX3QpKGZTdGVwR3JheSAqIChmeS1yZWN0LmJvdHRvbSkpOwotCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX1BvaW50KHJlY3QubGVmdCwgZnkpLAotCQkJCUNQREZfUG9pbnQocmVjdC5yaWdodCwgZnkpLCBBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksIG5HcmF5LCBuR3JheSwgbkdyYXkpLCAxLjVmKTsKLQkJfQotCX0KKyAgICBmb3IgKEZYX0ZMT0FUIGZ5ID0gcmVjdC5ib3R0b20gKyAwLjVmOyBmeSA8PSByZWN0LnRvcCAtIDAuNWY7IGZ5ICs9IDEuMGYpIHsKKyAgICAgIGludDMyX3QgbkdyYXkgPSBuU3RhcnRHcmF5ICsgKGludDMyX3QpKGZTdGVwR3JheSAqIChmeSAtIHJlY3QuYm90dG9tKSk7CisgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZSgKKyAgICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfUG9pbnQocmVjdC5sZWZ0LCBmeSksCisgICAgICAgICAgQ1BERl9Qb2ludChyZWN0LnJpZ2h0LCBmeSksCisgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCBuR3JheSwgbkdyYXksIG5HcmF5KSwgMS41Zik7CisgICAgfQorICB9CiAKLQlpZiAoYkhvcml6b250YWwpCi0JewotCQlmU3RlcEdyYXkgPSAobkVuZEdyYXkgLSBuU3RhcnRHcmF5KSAvIHJlY3QuV2lkdGgoKTsKKyAgaWYgKGJIb3Jpem9udGFsKSB7CisgICAgZlN0ZXBHcmF5ID0gKG5FbmRHcmF5IC0gblN0YXJ0R3JheSkgLyByZWN0LldpZHRoKCk7CiAKLQkJZm9yIChGWF9GTE9BVCBmeD1yZWN0LmxlZnQrMC41ZjsgZng8PXJlY3QucmlnaHQtMC41ZjsgZngrPTEuMGYpCi0JCXsKLQkJCWludDMyX3QgbkdyYXkgPSBuU3RhcnRHcmF5ICsgKGludDMyX3QpKGZTdGVwR3JheSAqIChmeC1yZWN0LmxlZnQpKTsKLQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Qb2ludChmeCwgcmVjdC5ib3R0b20pLAotCQkJCUNQREZfUG9pbnQoZngsIHJlY3QudG9wKSwgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCBuR3JheSwgbkdyYXksIG5HcmF5KSwgMS41Zik7Ci0JCX0KLQl9CisgICAgZm9yIChGWF9GTE9BVCBmeCA9IHJlY3QubGVmdCArIDAuNWY7IGZ4IDw9IHJlY3QucmlnaHQgLSAwLjVmOyBmeCArPSAxLjBmKSB7CisgICAgICBpbnQzMl90IG5HcmF5ID0gblN0YXJ0R3JheSArIChpbnQzMl90KShmU3RlcEdyYXkgKiAoZnggLSByZWN0LmxlZnQpKTsKKyAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKAorICAgICAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Qb2ludChmeCwgcmVjdC5ib3R0b20pLAorICAgICAgICAgIENQREZfUG9pbnQoZngsIHJlY3QudG9wKSwKKyAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksIG5HcmF5LCBuR3JheSwgbkdyYXkpLCAxLjVmKTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQkJCQljb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9GTE9BVCBmV2lkdGgsCi0JCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY29sb3IsIGNvbnN0IENQV0xfQ29sb3IgJiBjckxlZnRUb3AsIGNvbnN0IENQV0xfQ29sb3IgJiBjclJpZ2h0Qm90dG9tLAotCQkJCQkJCQkJCQkJaW50MzJfdCBuU3R5bGUsIGNvbnN0IENQV0xfRGFzaCAmIGRhc2gsIGludDMyX3QgblRyYW5zcGFyYW5jeSkKLXsKLQlGWF9GTE9BVCBmTGVmdCA9IHJlY3QubGVmdDsKLQlGWF9GTE9BVCBmUmlnaHQgPSByZWN0LnJpZ2h0OwotCUZYX0ZMT0FUIGZUb3AgPSByZWN0LnRvcDsKLQlGWF9GTE9BVCBmQm90dG9tID0gcmVjdC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkRyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JMZWZ0VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyUmlnaHRCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9EYXNoJiBkYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblRyYW5zcGFyYW5jeSkgeworICBGWF9GTE9BVCBmTGVmdCA9IHJlY3QubGVmdDsKKyAgRlhfRkxPQVQgZlJpZ2h0ID0gcmVjdC5yaWdodDsKKyAgRlhfRkxPQVQgZlRvcCA9IHJlY3QudG9wOworICBGWF9GTE9BVCBmQm90dG9tID0gcmVjdC5ib3R0b207CiAKLQlpZiAoZldpZHRoID4gMC4wZikKLQl7Ci0JCUZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOworICBpZiAoZldpZHRoID4gMC4wZikgeworICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOwogCi0JCXN3aXRjaCAoblN0eWxlKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgUEJTX1NPTElEOgotCQkJewotCQkJCUNGWF9QYXRoRGF0YSBwYXRoOwotCQkJCXBhdGguQXBwZW5kUmVjdChmTGVmdCwgZkJvdHRvbSwgZlJpZ2h0LCBmVG9wKTsKLQkJCQlwYXRoLkFwcGVuZFJlY3QoZkxlZnQgKyBmV2lkdGgsIGZCb3R0b20gKyBmV2lkdGgsIGZSaWdodCAtIGZXaWR0aCwgZlRvcCAtIGZXaWR0aCk7Ci0JCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwgUFdMQ29sb3JUb0ZYQ29sb3IoY29sb3IsblRyYW5zcGFyYW5jeSksIDAsIEZYRklMTF9BTFRFUk5BVEUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUEJTX0RBU0g6Ci0JCQl7Ci0JCQkJQ0ZYX1BhdGhEYXRhIHBhdGg7CisgICAgc3dpdGNoIChuU3R5bGUpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBjYXNlIFBCU19TT0xJRDogeworICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgICAgICAgcGF0aC5BcHBlbmRSZWN0KGZMZWZ0LCBmQm90dG9tLCBmUmlnaHQsIGZUb3ApOworICAgICAgICBwYXRoLkFwcGVuZFJlY3QoZkxlZnQgKyBmV2lkdGgsIGZCb3R0b20gKyBmV2lkdGgsIGZSaWdodCAtIGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZUb3AgLSBmV2lkdGgpOworICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xDb2xvclRvRlhDb2xvcihjb2xvciwgblRyYW5zcGFyYW5jeSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9BTFRFUk5BVEUpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgUEJTX0RBU0g6IHsKKyAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CiAKLQkJCQlwYXRoLlNldFBvaW50Q291bnQoNSk7Ci0JCQkJcGF0aC5TZXRQb2ludCgwLCBmTGVmdCArIGZXaWR0aCAvIDIuMGYsIGZCb3R0b20gKyBmV2lkdGggLyAyLjBmLCBGWFBUX01PVkVUTyk7Ci0JCQkJcGF0aC5TZXRQb2ludCgxLCBmTGVmdCArIGZXaWR0aCAvIDIuMGYsIGZUb3AgLSBmV2lkdGggLyAyLjBmLCBGWFBUX0xJTkVUTyk7Ci0JCQkJcGF0aC5TZXRQb2ludCgyLCBmUmlnaHQgLSBmV2lkdGggLyAyLjBmLCBmVG9wIC0gZldpZHRoIC8gMi4wZiwgRlhQVF9MSU5FVE8pOwotCQkJCXBhdGguU2V0UG9pbnQoMywgZlJpZ2h0IC0gZldpZHRoIC8gMi4wZiwgZkJvdHRvbSArIGZXaWR0aCAvIDIuMGYsIEZYUFRfTElORVRPKTsKLQkJCQlwYXRoLlNldFBvaW50KDQsIGZMZWZ0ICsgZldpZHRoIC8gMi4wZiwgZkJvdHRvbSArIGZXaWR0aCAvIDIuMGYsIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aC5TZXRQb2ludENvdW50KDUpOworICAgICAgICBwYXRoLlNldFBvaW50KDAsIGZMZWZ0ICsgZldpZHRoIC8gMi4wZiwgZkJvdHRvbSArIGZXaWR0aCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgRlhQVF9NT1ZFVE8pOworICAgICAgICBwYXRoLlNldFBvaW50KDEsIGZMZWZ0ICsgZldpZHRoIC8gMi4wZiwgZlRvcCAtIGZXaWR0aCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgRlhQVF9MSU5FVE8pOworICAgICAgICBwYXRoLlNldFBvaW50KDIsIGZSaWdodCAtIGZXaWR0aCAvIDIuMGYsIGZUb3AgLSBmV2lkdGggLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aC5TZXRQb2ludCgzLCBmUmlnaHQgLSBmV2lkdGggLyAyLjBmLCBmQm90dG9tICsgZldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICBGWFBUX0xJTkVUTyk7CisgICAgICAgIHBhdGguU2V0UG9pbnQoNCwgZkxlZnQgKyBmV2lkdGggLyAyLjBmLCBmQm90dG9tICsgZldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICBGWFBUX0xJTkVUTyk7CiAKLQkJCQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCQkJCWdzZC5TZXREYXNoQ291bnQoMik7Ci0JCQkJZ3NkLm1fRGFzaEFycmF5WzBdID0gMy4wZjsKLQkJCQlnc2QubV9EYXNoQXJyYXlbMV0gPSAzLjBmOwotCQkJCWdzZC5tX0Rhc2hQaGFzZSA9IDA7CisgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgICAgICAgIGdzZC5TZXREYXNoQ291bnQoMik7CisgICAgICAgIGdzZC5tX0Rhc2hBcnJheVswXSA9IDMuMGY7CisgICAgICAgIGdzZC5tX0Rhc2hBcnJheVsxXSA9IDMuMGY7CisgICAgICAgIGdzZC5tX0Rhc2hQaGFzZSA9IDA7CiAKLQkJCQlnc2QubV9MaW5lV2lkdGggPSBmV2lkdGg7Ci0JCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwgUFdMQ29sb3JUb0ZYQ29sb3IoY29sb3IsblRyYW5zcGFyYW5jeSksIEZYRklMTF9XSU5ESU5HKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBCU19CRVZFTEVEOgotCQljYXNlIFBCU19JTlNFVDoKLQkJCXsKLQkJCQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCQkJCWdzZC5tX0xpbmVXaWR0aCA9IGZIYWxmV2lkdGg7CisgICAgICAgIGdzZC5tX0xpbmVXaWR0aCA9IGZXaWR0aDsKKyAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMQ29sb3JUb0ZYQ29sb3IoY29sb3IsIG5UcmFuc3BhcmFuY3kpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORyk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBQQlNfQkVWRUxFRDoKKyAgICAgIGNhc2UgUEJTX0lOU0VUOiB7CisgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgICAgICAgIGdzZC5tX0xpbmVXaWR0aCA9IGZIYWxmV2lkdGg7CiAKLQkJCQlDRlhfUGF0aERhdGEgcGF0aExUOworICAgICAgICBDRlhfUGF0aERhdGEgcGF0aExUOwogCi0JCQkJcGF0aExULlNldFBvaW50Q291bnQoNyk7Ci0JCQkJcGF0aExULlNldFBvaW50KDAsIGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgsIEZYUFRfTU9WRVRPKTsKLQkJCQlwYXRoTFQuU2V0UG9pbnQoMSwgZkxlZnQgKyBmSGFsZldpZHRoLCBmVG9wIC0gZkhhbGZXaWR0aCwgRlhQVF9MSU5FVE8pOwotCQkJCXBhdGhMVC5TZXRQb2ludCgyLCBmUmlnaHQgLSBmSGFsZldpZHRoLCBmVG9wIC0gZkhhbGZXaWR0aCwgRlhQVF9MSU5FVE8pOwotCQkJCXBhdGhMVC5TZXRQb2ludCgzLCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiwgZlRvcCAtIGZIYWxmV2lkdGggKiAyLCBGWFBUX0xJTkVUTyk7Ci0JCQkJcGF0aExULlNldFBvaW50KDQsIGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIsIGZUb3AgLSBmSGFsZldpZHRoICogMiwgRlhQVF9MSU5FVE8pOwotCQkJCXBhdGhMVC5TZXRQb2ludCg1LCBmTGVmdCArIGZIYWxmV2lkdGggKiAyLCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIsIEZYUFRfTElORVRPKTsKLQkJCQlwYXRoTFQuU2V0UG9pbnQoNiwgZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCwgRlhQVF9MSU5FVE8pOworICAgICAgICBwYXRoTFQuU2V0UG9pbnRDb3VudCg3KTsKKyAgICAgICAgcGF0aExULlNldFBvaW50KDAsIGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX01PVkVUTyk7CisgICAgICAgIHBhdGhMVC5TZXRQb2ludCgxLCBmTGVmdCArIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoLCBGWFBUX0xJTkVUTyk7CisgICAgICAgIHBhdGhMVC5TZXRQb2ludCgyLCBmUmlnaHQgLSBmSGFsZldpZHRoLCBmVG9wIC0gZkhhbGZXaWR0aCwgRlhQVF9MSU5FVE8pOworICAgICAgICBwYXRoTFQuU2V0UG9pbnQoMywgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIsIGZUb3AgLSBmSGFsZldpZHRoICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aExULlNldFBvaW50KDQsIGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIsIGZUb3AgLSBmSGFsZldpZHRoICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aExULlNldFBvaW50KDUsIGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIsIGZCb3R0b20gKyBmSGFsZldpZHRoICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aExULlNldFBvaW50KDYsIGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX0xJTkVUTyk7CiAKLQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aExULCBwVXNlcjJEZXZpY2UsICZnc2QsIFBXTENvbG9yVG9GWENvbG9yKGNyTGVmdFRvcCxuVHJhbnNwYXJhbmN5KSwgMCwgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoTFQsIHBVc2VyMkRldmljZSwgJmdzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMQ29sb3JUb0ZYQ29sb3IoY3JMZWZ0VG9wLCBuVHJhbnNwYXJhbmN5KSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CiAKLQkJCQlDRlhfUGF0aERhdGEgcGF0aFJCOworICAgICAgICBDRlhfUGF0aERhdGEgcGF0aFJCOwogCi0JCQkJcGF0aFJCLlNldFBvaW50Q291bnQoNyk7Ci0JCQkJcGF0aFJCLlNldFBvaW50KDAsIGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoLCBGWFBUX01PVkVUTyk7Ci0JCQkJcGF0aFJCLlNldFBvaW50KDEsIGZSaWdodCAtIGZIYWxmV2lkdGgsIGZCb3R0b20gKyBmSGFsZldpZHRoLCBGWFBUX0xJTkVUTyk7Ci0JCQkJcGF0aFJCLlNldFBvaW50KDIsIGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgsIEZYUFRfTElORVRPKTsKLQkJCQlwYXRoUkIuU2V0UG9pbnQoMywgZkxlZnQgKyBmSGFsZldpZHRoICogMiwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyLCBGWFBUX0xJTkVUTyk7Ci0JCQkJcGF0aFJCLlNldFBvaW50KDQsIGZSaWdodCAtIGZIYWxmV2lkdGggKiAyLCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIsIEZYUFRfTElORVRPKTsKLQkJCQlwYXRoUkIuU2V0UG9pbnQoNSwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIsIGZUb3AgLSBmSGFsZldpZHRoICogMiwgRlhQVF9MSU5FVE8pOwotCQkJCXBhdGhSQi5TZXRQb2ludCg2LCBmUmlnaHQgLSBmSGFsZldpZHRoLCBmVG9wIC0gZkhhbGZXaWR0aCwgRlhQVF9MSU5FVE8pOworICAgICAgICBwYXRoUkIuU2V0UG9pbnRDb3VudCg3KTsKKyAgICAgICAgcGF0aFJCLlNldFBvaW50KDAsIGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoLCBGWFBUX01PVkVUTyk7CisgICAgICAgIHBhdGhSQi5TZXRQb2ludCgxLCBmUmlnaHQgLSBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aFJCLlNldFBvaW50KDIsIGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX0xJTkVUTyk7CisgICAgICAgIHBhdGhSQi5TZXRQb2ludCgzLCBmTGVmdCArIGZIYWxmV2lkdGggKiAyLCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX0xJTkVUTyk7CisgICAgICAgIHBhdGhSQi5TZXRQb2ludCg0LCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9MSU5FVE8pOworICAgICAgICBwYXRoUkIuU2V0UG9pbnQoNSwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIsIGZUb3AgLSBmSGFsZldpZHRoICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aFJCLlNldFBvaW50KDYsIGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoLCBGWFBUX0xJTkVUTyk7CiAKLQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aFJCLCBwVXNlcjJEZXZpY2UsICZnc2QsIFBXTENvbG9yVG9GWENvbG9yKGNyUmlnaHRCb3R0b20sblRyYW5zcGFyYW5jeSksIDAsIEZYRklMTF9BTFRFUk5BVEUpOworICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aFJCLCBwVXNlcjJEZXZpY2UsICZnc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTENvbG9yVG9GWENvbG9yKGNyUmlnaHRCb3R0b20sIG5UcmFuc3BhcmFuY3kpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFKTsKIAotCQkJCUNGWF9QYXRoRGF0YSBwYXRoOworICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKIAotCQkJCXBhdGguQXBwZW5kUmVjdChmTGVmdCwgZkJvdHRvbSwgZlJpZ2h0LCBmVG9wKTsKLQkJCQlwYXRoLkFwcGVuZFJlY3QoZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCwgZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCAtIGZIYWxmV2lkdGgpOworICAgICAgICBwYXRoLkFwcGVuZFJlY3QoZkxlZnQsIGZCb3R0b20sIGZSaWdodCwgZlRvcCk7CisgICAgICAgIHBhdGguQXBwZW5kUmVjdChmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gKyBmSGFsZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCAtIGZIYWxmV2lkdGgpOwogCi0JCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgUFdMQ29sb3JUb0ZYQ29sb3IoY29sb3IsblRyYW5zcGFyYW5jeSksIDAsIEZYRklMTF9BTFRFUk5BVEUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUEJTX1VOREVSTElORUQ6Ci0JCQl7Ci0JCQkJQ0ZYX1BhdGhEYXRhIHBhdGg7CisgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTENvbG9yVG9GWENvbG9yKGNvbG9yLCBuVHJhbnNwYXJhbmN5KSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBQQlNfVU5ERVJMSU5FRDogeworICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKIAotCQkJCXBhdGguU2V0UG9pbnRDb3VudCgyKTsKLQkJCQlwYXRoLlNldFBvaW50KDAsIGZMZWZ0LCBmQm90dG9tICsgZldpZHRoIC8gMiwgRlhQVF9NT1ZFVE8pOwotCQkJCXBhdGguU2V0UG9pbnQoMSwgZlJpZ2h0LCBmQm90dG9tICsgZldpZHRoIC8gMiwgRlhQVF9MSU5FVE8pOworICAgICAgICBwYXRoLlNldFBvaW50Q291bnQoMik7CisgICAgICAgIHBhdGguU2V0UG9pbnQoMCwgZkxlZnQsIGZCb3R0b20gKyBmV2lkdGggLyAyLCBGWFBUX01PVkVUTyk7CisgICAgICAgIHBhdGguU2V0UG9pbnQoMSwgZlJpZ2h0LCBmQm90dG9tICsgZldpZHRoIC8gMiwgRlhQVF9MSU5FVE8pOwogCi0JCQkJQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLQkJCQlnc2QubV9MaW5lV2lkdGggPSBmV2lkdGg7CisgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgICAgICAgIGdzZC5tX0xpbmVXaWR0aCA9IGZXaWR0aDsKIAotCQkJCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsMCwgIFBXTENvbG9yVG9GWENvbG9yKGNvbG9yLG5UcmFuc3BhcmFuY3kpLCBGWEZJTExfQUxURVJOQVRFKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBCU19TSEFET1c6Ci0JCQl7Ci0JCQkJQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0JCQkJcGF0aC5BcHBlbmRSZWN0KGZMZWZ0LCBmQm90dG9tLCBmUmlnaHQsIGZUb3ApOwotCQkJCXBhdGguQXBwZW5kUmVjdChmTGVmdCArIGZXaWR0aCwgZkJvdHRvbSArIGZXaWR0aCwgZlJpZ2h0IC0gZldpZHRoLCBmVG9wIC0gZldpZHRoKTsKLQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLCBQV0xDb2xvclRvRlhDb2xvcihjb2xvcixuVHJhbnNwYXJhbmN5LzIpLCAwLCBGWEZJTExfQUxURVJOQVRFKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xDb2xvclRvRlhDb2xvcihjb2xvciwgblRyYW5zcGFyYW5jeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9BTFRFUk5BVEUpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgUEJTX1NIQURPVzogeworICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgICAgICAgcGF0aC5BcHBlbmRSZWN0KGZMZWZ0LCBmQm90dG9tLCBmUmlnaHQsIGZUb3ApOworICAgICAgICBwYXRoLkFwcGVuZFJlY3QoZkxlZnQgKyBmV2lkdGgsIGZCb3R0b20gKyBmV2lkdGgsIGZSaWdodCAtIGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZUb3AgLSBmV2lkdGgpOworICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xDb2xvclRvRlhDb2xvcihjb2xvciwgblRyYW5zcGFyYW5jeSAvIDIpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFKTsKKyAgICAgIH0gYnJlYWs7CisgICAgfQorICB9CiB9CiAKLXN0YXRpYyB2b2lkIEFkZFNxdWlnZ2x5UGF0aChDRlhfUGF0aERhdGEgJiBQYXRoRGF0YSwgRlhfRkxPQVQgZlN0YXJ0WCwgRlhfRkxPQVQgZkVuZFgsIEZYX0ZMT0FUIGZZLCBGWF9GTE9BVCBmU3RlcCkKLXsKLQlQYXRoRGF0YS5BZGRQb2ludENvdW50KDEpOwotCVBhdGhEYXRhLlNldFBvaW50KFBhdGhEYXRhLkdldFBvaW50Q291bnQoKSAtIDEsIGZTdGFydFgsIGZZLCBGWFBUX01PVkVUTyk7CitzdGF0aWMgdm9pZCBBZGRTcXVpZ2dseVBhdGgoQ0ZYX1BhdGhEYXRhJiBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU3RhcnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZFbmRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTdGVwKSB7CisgIFBhdGhEYXRhLkFkZFBvaW50Q291bnQoMSk7CisgIFBhdGhEYXRhLlNldFBvaW50KFBhdGhEYXRhLkdldFBvaW50Q291bnQoKSAtIDEsIGZTdGFydFgsIGZZLCBGWFBUX01PVkVUTyk7CiAKLQlGWF9GTE9BVCBmeDsKLQlpbnQzMl90IGk7CisgIEZYX0ZMT0FUIGZ4OworICBpbnQzMl90IGk7CiAKLQlmb3IgKGk9MSxmeD1mU3RhcnRYK2ZTdGVwOyBmeDxmRW5kWDsgZngrPWZTdGVwLGkrKykKLQl7Ci0JCVBhdGhEYXRhLkFkZFBvaW50Q291bnQoMSk7Ci0JCVBhdGhEYXRhLlNldFBvaW50KFBhdGhEYXRhLkdldFBvaW50Q291bnQoKSAtIDEsIGZ4LCBmWSArIChpJjEpKmZTdGVwLCBGWFBUX0xJTkVUTyk7Ci0JfQorICBmb3IgKGkgPSAxLCBmeCA9IGZTdGFydFggKyBmU3RlcDsgZnggPCBmRW5kWDsgZnggKz0gZlN0ZXAsIGkrKykgeworICAgIFBhdGhEYXRhLkFkZFBvaW50Q291bnQoMSk7CisgICAgUGF0aERhdGEuU2V0UG9pbnQoUGF0aERhdGEuR2V0UG9pbnRDb3VudCgpIC0gMSwgZngsIGZZICsgKGkgJiAxKSAqIGZTdGVwLAorICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgfQogfQogCi1zdGF0aWMgdm9pZCBBZGRTcGVsbENoZWNrT2JqKENGWF9QYXRoRGF0YSAmIFBhdGhEYXRhLCBJRlhfRWRpdCogcEVkaXQsIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cldvcmQpCi17Ci0JRlhfRkxPQVQgZlN0YXJ0WCA9IDAuMGY7Ci0JRlhfRkxPQVQgZkVuZFggPSAwLjBmOwotCUZYX0ZMT0FUIGZZID0gMC4wZjsKLQlGWF9GTE9BVCBmU3RlcCA9IDAuMGY7CitzdGF0aWMgdm9pZCBBZGRTcGVsbENoZWNrT2JqKENGWF9QYXRoRGF0YSYgUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyV29yZCkgeworICBGWF9GTE9BVCBmU3RhcnRYID0gMC4wZjsKKyAgRlhfRkxPQVQgZkVuZFggPSAwLjBmOworICBGWF9GTE9BVCBmWSA9IDAuMGY7CisgIEZYX0ZMT0FUIGZTdGVwID0gMC4wZjsKIAotCUZYX0JPT0wgYkJyZWFrID0gRkFMU0U7CisgIEZYX0JPT0wgYkJyZWFrID0gRkFMU0U7CiAKLQlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKQotCXsKLQkJcEl0ZXJhdG9yLT5TZXRBdCh3cldvcmQuQmVnaW5Qb3MpOworICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgcEl0ZXJhdG9yLT5TZXRBdCh3cldvcmQuQmVnaW5Qb3MpOwogCi0JCWRvCi0JCXsKLQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgIGRvIHsKKyAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwogCi0JCQlDUFZUX0xpbmUgbGluZTsKLQkJCWlmIChwSXRlcmF0b3ItPkdldExpbmUobGluZSkpCi0JCQl7Ci0JCQkJZlkgPSBsaW5lLnB0TGluZS55OwotCQkJCWZTdGVwID0gKGxpbmUuZkxpbmVBc2NlbnQgLSBsaW5lLmZMaW5lRGVzY2VudCkgLyAxNi4wZjsKLQkJCX0KKyAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgaWYgKHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkgeworICAgICAgICBmWSA9IGxpbmUucHRMaW5lLnk7CisgICAgICAgIGZTdGVwID0gKGxpbmUuZkxpbmVBc2NlbnQgLSBsaW5lLmZMaW5lRGVzY2VudCkgLyAxNi4wZjsKKyAgICAgIH0KIAotCQkJaWYgKHBsYWNlLkxpbmVDbXAod3JXb3JkLkJlZ2luUG9zKSA9PSAwKQotCQkJewotCQkJCXBJdGVyYXRvci0+U2V0QXQod3JXb3JkLkJlZ2luUG9zKTsKLQkJCQlDUFZUX1dvcmQgd29yZDsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCXsKLQkJCQkJZlN0YXJ0WCA9IHdvcmQucHRXb3JkLng7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZTdGFydFggPSBsaW5lLnB0TGluZS54OwotCQkJfQorICAgICAgaWYgKHBsYWNlLkxpbmVDbXAod3JXb3JkLkJlZ2luUG9zKSA9PSAwKSB7CisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQod3JXb3JkLkJlZ2luUG9zKTsKKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBmU3RhcnRYID0gd29yZC5wdFdvcmQueDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZlN0YXJ0WCA9IGxpbmUucHRMaW5lLng7CisgICAgICB9CiAKLQkJCWlmIChwbGFjZS5MaW5lQ21wKHdyV29yZC5FbmRQb3MpID09IDApCi0JCQl7Ci0JCQkJcEl0ZXJhdG9yLT5TZXRBdCh3cldvcmQuRW5kUG9zKTsKLQkJCQlDUFZUX1dvcmQgd29yZDsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCXsKLQkJCQkJZkVuZFggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7Ci0JCQkJfQorICAgICAgaWYgKHBsYWNlLkxpbmVDbXAod3JXb3JkLkVuZFBvcykgPT0gMCkgeworICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHdyV29yZC5FbmRQb3MpOworICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIGZFbmRYID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOworICAgICAgICB9CiAKLQkJCQliQnJlYWsgPSBUUlVFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZFbmRYID0gbGluZS5wdExpbmUueCArIGxpbmUuZkxpbmVXaWR0aDsKLQkJCX0KKyAgICAgICAgYkJyZWFrID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZFbmRYID0gbGluZS5wdExpbmUueCArIGxpbmUuZkxpbmVXaWR0aDsKKyAgICAgIH0KIAotCQkJQWRkU3F1aWdnbHlQYXRoKFBhdGhEYXRhLCBmU3RhcnRYLCBmRW5kWCwgZlksIGZTdGVwKTsKKyAgICAgIEFkZFNxdWlnZ2x5UGF0aChQYXRoRGF0YSwgZlN0YXJ0WCwgZkVuZFgsIGZZLCBmU3RlcCk7CiAKLQkJCWlmIChiQnJlYWspIGJyZWFrOwotCQl9Ci0JCXdoaWxlIChwSXRlcmF0b3ItPk5leHRMaW5lKCkpOwotCX0KKyAgICAgIGlmIChiQnJlYWspCisgICAgICAgIGJyZWFrOworICAgIH0gd2hpbGUgKHBJdGVyYXRvci0+TmV4dExpbmUoKSk7CisgIH0KIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3RWRpdFNwZWxsQ2hlY2soQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgSUZYX0VkaXQqIHBFZGl0LAotCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLAotCQkJCQkJSVBXTF9TcGVsbENoZWNrICogcFNwZWxsQ2hlY2spCi17Ci0JY29uc3QgRlhfQ09MT1JSRUYgY3JTcGVsbCA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwwLDApOwordm9pZCBDUFdMX1V0aWxzOjpEcmF3RWRpdFNwZWxsQ2hlY2soQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQV0xfU3BlbGxDaGVjayogcFNwZWxsQ2hlY2spIHsKKyAgY29uc3QgRlhfQ09MT1JSRUYgY3JTcGVsbCA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDAsIDApOwogCi0JLy9mb3Igc3BlbGxjaGVjawotCUZYX0JPT0wgYkxhdGluV29yZCA9IEZBTFNFOwotCUNQVlRfV29yZFBsYWNlIHdwV29yZFN0YXJ0OwotCUNGWF9CeXRlU3RyaW5nIHNMYXRpbldvcmQ7CisgIC8vIGZvciBzcGVsbGNoZWNrCisgIEZYX0JPT0wgYkxhdGluV29yZCA9IEZBTFNFOworICBDUFZUX1dvcmRQbGFjZSB3cFdvcmRTdGFydDsKKyAgQ0ZYX0J5dGVTdHJpbmcgc0xhdGluV29yZDsKIAotCUNGWF9QYXRoRGF0YSBwYXRoU3BlbGw7CisgIENGWF9QYXRoRGF0YSBwYXRoU3BlbGw7CiAKLQlwRGV2aWNlLT5TYXZlU3RhdGUoKTsKKyAgcERldmljZS0+U2F2ZVN0YXRlKCk7CiAKLQlpZiAoIXJjQ2xpcC5Jc0VtcHR5KCkpCi0JewotCQlDUERGX1JlY3QgcmNUZW1wID0gcmNDbGlwOwotCQlwVXNlcjJEZXZpY2UtPlRyYW5zZm9ybVJlY3QocmNUZW1wKTsKLQkJRlhfUkVDVCByY0RldkNsaXA7Ci0JCXJjRGV2Q2xpcC5sZWZ0ID0gKGludDMyX3QpcmNUZW1wLmxlZnQ7Ci0JCXJjRGV2Q2xpcC5yaWdodCA9IChpbnQzMl90KXJjVGVtcC5yaWdodDsKLQkJcmNEZXZDbGlwLnRvcCA9IChpbnQzMl90KXJjVGVtcC50b3A7Ci0JCXJjRGV2Q2xpcC5ib3R0b20gPSAoaW50MzJfdClyY1RlbXAuYm90dG9tOwotCQlwRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJjRGV2Q2xpcCk7Ci0JfQorICBpZiAoIXJjQ2xpcC5Jc0VtcHR5KCkpIHsKKyAgICBDUERGX1JlY3QgcmNUZW1wID0gcmNDbGlwOworICAgIHBVc2VyMkRldmljZS0+VHJhbnNmb3JtUmVjdChyY1RlbXApOworICAgIEZYX1JFQ1QgcmNEZXZDbGlwOworICAgIHJjRGV2Q2xpcC5sZWZ0ID0gKGludDMyX3QpcmNUZW1wLmxlZnQ7CisgICAgcmNEZXZDbGlwLnJpZ2h0ID0gKGludDMyX3QpcmNUZW1wLnJpZ2h0OworICAgIHJjRGV2Q2xpcC50b3AgPSAoaW50MzJfdClyY1RlbXAudG9wOworICAgIHJjRGV2Q2xpcC5ib3R0b20gPSAoaW50MzJfdClyY1RlbXAuYm90dG9tOworICAgIHBEZXZpY2UtPlNldENsaXBfUmVjdCgmcmNEZXZDbGlwKTsKKyAgfQogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCWlmIChwRWRpdC0+R2V0Rm9udE1hcCgpKQotCQl7Ci0JCQlpZiAocFJhbmdlKQotCQkJCXBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7Ci0JCQllbHNlCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdCgwKTsKKyAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgIGlmIChwRWRpdC0+R2V0Rm9udE1hcCgpKSB7CisgICAgICBpZiAocFJhbmdlKQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOworICAgICAgZWxzZQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KDApOwogCi0JCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKKyAgICAgIENQVlRfV29yZFBsYWNlIG9sZHBsYWNlOwogCi0JCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQotCQkJewotCQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCQkJCWlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKSBicmVhazsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgIGlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKQorICAgICAgICAgIGJyZWFrOwogCi0JCQkJQ1BWVF9Xb3JkIHdvcmQ7Ci0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJCQl7Ci0JCQkJCWlmIChGWF9FRElUX0lTTEFUSU5XT1JEKHdvcmQuV29yZCkpCi0JCQkJCXsKLQkJCQkJCWlmICghYkxhdGluV29yZCkKLQkJCQkJCXsKLQkJCQkJCQl3cFdvcmRTdGFydCA9IHBsYWNlOwotCQkJCQkJCWJMYXRpbldvcmQgPSBUUlVFOwotCQkJCQkJfQorICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIGlmIChGWF9FRElUX0lTTEFUSU5XT1JEKHdvcmQuV29yZCkpIHsKKyAgICAgICAgICAgIGlmICghYkxhdGluV29yZCkgeworICAgICAgICAgICAgICB3cFdvcmRTdGFydCA9IHBsYWNlOworICAgICAgICAgICAgICBiTGF0aW5Xb3JkID0gVFJVRTsKKyAgICAgICAgICAgIH0KIAotCQkJCQkJc0xhdGluV29yZCArPSAoY2hhcil3b3JkLldvcmQ7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlpZiAoYkxhdGluV29yZCkKLQkJCQkJCXsKLQkJCQkJCQlpZiAoIXNMYXRpbldvcmQuSXNFbXB0eSgpKQotCQkJCQkJCXsKLQkJCQkJCQkJaWYgKHBTcGVsbENoZWNrICYmICFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNMYXRpbldvcmQpKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlBZGRTcGVsbENoZWNrT2JqKHBhdGhTcGVsbCxwRWRpdCxDUFZUX1dvcmRSYW5nZSh3cFdvcmRTdGFydCxvbGRwbGFjZSkpOwotCQkJCQkJCQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOwotCQkJCQkJfQorICAgICAgICAgICAgc0xhdGluV29yZCArPSAoY2hhcil3b3JkLldvcmQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChiTGF0aW5Xb3JkKSB7CisgICAgICAgICAgICAgIGlmICghc0xhdGluV29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocFNwZWxsQ2hlY2sgJiYgIXBTcGVsbENoZWNrLT5DaGVja1dvcmQoc0xhdGluV29yZCkpIHsKKyAgICAgICAgICAgICAgICAgIEFkZFNwZWxsQ2hlY2tPYmoocGF0aFNwZWxsLCBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Uod3BXb3JkU3RhcnQsIG9sZHBsYWNlKSk7CisgICAgICAgICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYkxhdGluV29yZCA9IEZBTFNFOworICAgICAgICAgICAgfQogCi0JCQkJCQlzTGF0aW5Xb3JkLkVtcHR5KCk7Ci0JCQkJCX0KKyAgICAgICAgICAgIHNMYXRpbldvcmQuRW1wdHkoKTsKKyAgICAgICAgICB9CiAKLQkJCQkJb2xkcGxhY2UgPSBwbGFjZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYgKGJMYXRpbldvcmQpCi0JCQkJCXsKLQkJCQkJCWlmICghc0xhdGluV29yZC5Jc0VtcHR5KCkpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKHBTcGVsbENoZWNrICYmICFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNMYXRpbldvcmQpKQotCQkJCQkJCXsKLQkJCQkJCQkJQWRkU3BlbGxDaGVja09iaihwYXRoU3BlbGwscEVkaXQsQ1BWVF9Xb3JkUmFuZ2Uod3BXb3JkU3RhcnQsb2xkcGxhY2UpKTsKLQkJCQkJCQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOwotCQkJCQl9CisgICAgICAgICAgb2xkcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoYkxhdGluV29yZCkgeworICAgICAgICAgICAgaWYgKCFzTGF0aW5Xb3JkLklzRW1wdHkoKSkgeworICAgICAgICAgICAgICBpZiAocFNwZWxsQ2hlY2sgJiYgIXBTcGVsbENoZWNrLT5DaGVja1dvcmQoc0xhdGluV29yZCkpIHsKKyAgICAgICAgICAgICAgICBBZGRTcGVsbENoZWNrT2JqKHBhdGhTcGVsbCwgcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX1dvcmRSYW5nZSh3cFdvcmRTdGFydCwgb2xkcGxhY2UpKTsKKyAgICAgICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYkxhdGluV29yZCA9IEZBTFNFOworICAgICAgICAgIH0KIAotCQkJCQlzTGF0aW5Xb3JkLkVtcHR5KCk7Ci0JCQkJfQotCQkJfQorICAgICAgICAgIHNMYXRpbldvcmQuRW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgfQogCi0JCQlpZiAoIXNMYXRpbldvcmQuSXNFbXB0eSgpKQotCQkJewotCQkJCWlmIChwU3BlbGxDaGVjayAmJiAhcFNwZWxsQ2hlY2stPkNoZWNrV29yZChzTGF0aW5Xb3JkKSkKLQkJCQl7Ci0JCQkJCUFkZFNwZWxsQ2hlY2tPYmoocGF0aFNwZWxsLHBFZGl0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgaWYgKCFzTGF0aW5Xb3JkLklzRW1wdHkoKSkgeworICAgICAgICBpZiAocFNwZWxsQ2hlY2sgJiYgIXBTcGVsbENoZWNrLT5DaGVja1dvcmQoc0xhdGluV29yZCkpIHsKKyAgICAgICAgICBBZGRTcGVsbENoZWNrT2JqKHBhdGhTcGVsbCwgcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX1dvcmRSYW5nZSh3cFdvcmRTdGFydCwgb2xkcGxhY2UpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogCi0JQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLQlnc2QubV9MaW5lV2lkdGggPSAwOwotCWlmIChwYXRoU3BlbGwuR2V0UG9pbnRDb3VudCgpID4gMCkKLQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGhTcGVsbCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLCBjclNwZWxsLCBGWEZJTExfQUxURVJOQVRFKTsKKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgZ3NkLm1fTGluZVdpZHRoID0gMDsKKyAgaWYgKHBhdGhTcGVsbC5HZXRQb2ludENvdW50KCkgPiAwKQorICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoU3BlbGwsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwgY3JTcGVsbCwKKyAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFKTsKIAotCXBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOworICBwRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKIH0KIAotRlhfQk9PTCBDUFdMX1V0aWxzOjpJc0JsYWNrT3JXaGl0ZShjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKLXsKLQlzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpCi0JewotCWNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOgotCQlyZXR1cm4gRkFMU0U7Ci0JY2FzZSBDT0xPUlRZUEVfR1JBWToKLQkJcmV0dXJuIGNvbG9yLmZDb2xvcjEgPCAwLjVmOwotCWNhc2UgQ09MT1JUWVBFX1JHQjoKLQkJcmV0dXJuIGNvbG9yLmZDb2xvcjEgKyBjb2xvci5mQ29sb3IyICsgY29sb3IuZkNvbG9yMyA8IDEuNWY7Ci0JY2FzZSBDT0xPUlRZUEVfQ01ZSzoKLQkJcmV0dXJuIGNvbG9yLmZDb2xvcjEgKyBjb2xvci5mQ29sb3IyICsgY29sb3IuZkNvbG9yMyArIGNvbG9yLmZDb2xvcjQgPiAyLjBmOwotCX0KK0ZYX0JPT0wgQ1BXTF9VdGlsczo6SXNCbGFja09yV2hpdGUoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgY2FzZSBDT0xPUlRZUEVfR1JBWToKKyAgICAgIHJldHVybiBjb2xvci5mQ29sb3IxIDwgMC41ZjsKKyAgICBjYXNlIENPTE9SVFlQRV9SR0I6CisgICAgICByZXR1cm4gY29sb3IuZkNvbG9yMSArIGNvbG9yLmZDb2xvcjIgKyBjb2xvci5mQ29sb3IzIDwgMS41ZjsKKyAgICBjYXNlIENPTE9SVFlQRV9DTVlLOgorICAgICAgcmV0dXJuIGNvbG9yLmZDb2xvcjEgKyBjb2xvci5mQ29sb3IyICsgY29sb3IuZkNvbG9yMyArIGNvbG9yLmZDb2xvcjQgPgorICAgICAgICAgICAgIDIuMGY7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotQ1BXTF9Db2xvciBDUFdMX1V0aWxzOjpHZXRSZXZlcnNlQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0JQ1BXTF9Db2xvciBjclJldCA9IGNvbG9yOworQ1BXTF9Db2xvciBDUFdMX1V0aWxzOjpHZXRSZXZlcnNlQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgQ1BXTF9Db2xvciBjclJldCA9IGNvbG9yOwogCi0Jc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKQotCXsKLQljYXNlIENPTE9SVFlQRV9HUkFZOgotCQljclJldC5mQ29sb3IxID0gMS4wZiAtIGNyUmV0LmZDb2xvcjE7Ci0JCWJyZWFrOwotCWNhc2UgQ09MT1JUWVBFX1JHQjoKLQkJY3JSZXQuZkNvbG9yMSA9IDEuMGYgLSBjclJldC5mQ29sb3IxOwotCQljclJldC5mQ29sb3IyID0gMS4wZiAtIGNyUmV0LmZDb2xvcjI7Ci0JCWNyUmV0LmZDb2xvcjMgPSAxLjBmIC0gY3JSZXQuZkNvbG9yMzsKLQkJYnJlYWs7Ci0JY2FzZSBDT0xPUlRZUEVfQ01ZSzoKLQkJY3JSZXQuZkNvbG9yMSA9IDEuMGYgLSBjclJldC5mQ29sb3IxOwotCQljclJldC5mQ29sb3IyID0gMS4wZiAtIGNyUmV0LmZDb2xvcjI7Ci0JCWNyUmV0LmZDb2xvcjMgPSAxLjBmIC0gY3JSZXQuZkNvbG9yMzsKLQkJY3JSZXQuZkNvbG9yNCA9IDEuMGYgLSBjclJldC5mQ29sb3I0OwotCQlicmVhazsKLQl9CisgIHN3aXRjaCAoY29sb3IubkNvbG9yVHlwZSkgeworICAgIGNhc2UgQ09MT1JUWVBFX0dSQVk6CisgICAgICBjclJldC5mQ29sb3IxID0gMS4wZiAtIGNyUmV0LmZDb2xvcjE7CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTE9SVFlQRV9SR0I6CisgICAgICBjclJldC5mQ29sb3IxID0gMS4wZiAtIGNyUmV0LmZDb2xvcjE7CisgICAgICBjclJldC5mQ29sb3IyID0gMS4wZiAtIGNyUmV0LmZDb2xvcjI7CisgICAgICBjclJldC5mQ29sb3IzID0gMS4wZiAtIGNyUmV0LmZDb2xvcjM7CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTE9SVFlQRV9DTVlLOgorICAgICAgY3JSZXQuZkNvbG9yMSA9IDEuMGYgLSBjclJldC5mQ29sb3IxOworICAgICAgY3JSZXQuZkNvbG9yMiA9IDEuMGYgLSBjclJldC5mQ29sb3IyOworICAgICAgY3JSZXQuZkNvbG9yMyA9IDEuMGYgLSBjclJldC5mQ29sb3IzOworICAgICAgY3JSZXQuZkNvbG9yNCA9IDEuMGYgLSBjclJldC5mQ29sb3I0OworICAgICAgYnJlYWs7CisgIH0KIAotCXJldHVybiBjclJldDsKKyAgcmV0dXJuIGNyUmV0OwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRJY29uQXBwU3RyZWFtKGludDMyX3QgblR5cGUsIGNvbnN0IENQREZfUmVjdCYgcmVjdCwgY29uc3QgQ1BXTF9Db2xvciYgY3JGaWxsLAotCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciYgY3JTdHJva2UpCi17Ci0JQ0ZYX0J5dGVTdHJpbmcgc0FwcFN0cmVhbSA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyU3Ryb2tlLCBGQUxTRSk7Ci0Jc0FwcFN0cmVhbSArPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckZpbGwsIFRSVUUpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0SWNvbkFwcFN0cmVhbShpbnQzMl90IG5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyRmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JTdHJva2UpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc0FwcFN0cmVhbSA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyU3Ryb2tlLCBGQUxTRSk7CisgIHNBcHBTdHJlYW0gKz0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JGaWxsLCBUUlVFKTsKIAotCUNGWF9CeXRlU3RyaW5nIHNQYXRoOwotCUNGWF9QYXRoRGF0YSBwYXRoOworICBDRlhfQnl0ZVN0cmluZyBzUGF0aDsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CiAKLQlzd2l0Y2ggKG5UeXBlKQotCXsKLQljYXNlIFBXTF9JQ09OVFlQRV9DSEVDS01BUks6Ci0JCUdldEdyYXBoaWNzX0NoZWNrbWFyayhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfQ0lSQ0xFOgotCQlHZXRHcmFwaGljc19DaXJjbGUoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0NPTU1FTlQ6Ci0JCUdldEdyYXBoaWNzX0NvbW1lbnQoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0NST1NTOgotCQlHZXRHcmFwaGljc19Dcm9zcyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfSEVMUDoKLQkJR2V0R3JhcGhpY3NfSGVscChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfSU5TRVJUVEVYVDoKLQkJR2V0R3JhcGhpY3NfSW5zZXJ0VGV4dChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfS0VZOgotCQlHZXRHcmFwaGljc19LZXkoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX05FV1BBUkFHUkFQSDoKLQkJR2V0R3JhcGhpY3NfTmV3UGFyYWdyYXBoKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9URVhUTk9URToKLQkJR2V0R3JhcGhpY3NfVGV4dE5vdGUoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX1BBUkFHUkFQSDoKLQkJR2V0R3JhcGhpY3NfUGFyYWdyYXBoKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9SSUdIVEFSUk9XOgotCQlHZXRHcmFwaGljc19SaWdodEFycm93KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9SSUdIVFBPSU5URVI6Ci0JCUdldEdyYXBoaWNzX1JpZ2h0UG9pbnRlcihzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfU1RBUjoKLQkJR2V0R3JhcGhpY3NfU3RhcihzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfVVBBUlJPVzoKLQkJR2V0R3JhcGhpY3NfVXBBcnJvdyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfVVBMRUZUQVJST1c6Ci0JCUdldEdyYXBoaWNzX1VwTGVmdEFycm93KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9HUkFQSDoKLQkJR2V0R3JhcGhpY3NfR3JhcGgoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX1BBUEVSQ0xJUDoKLQkJR2V0R3JhcGhpY3NfUGFwZXJjbGlwKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9BVFRBQ0hNRU5UOgotCQlHZXRHcmFwaGljc19BdHRhY2htZW50KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9UQUc6Ci0JCUdldEdyYXBoaWNzX1RhZyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfRk9YSVQ6Ci0JCUdldEdyYXBoaWNzX0ZveGl0KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQl9CisgIHN3aXRjaCAoblR5cGUpIHsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9DSEVDS01BUks6CisgICAgICBHZXRHcmFwaGljc19DaGVja21hcmsoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9DSVJDTEU6CisgICAgICBHZXRHcmFwaGljc19DaXJjbGUoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9DT01NRU5UOgorICAgICAgR2V0R3JhcGhpY3NfQ29tbWVudChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX0NST1NTOgorICAgICAgR2V0R3JhcGhpY3NfQ3Jvc3Moc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9IRUxQOgorICAgICAgR2V0R3JhcGhpY3NfSGVscChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX0lOU0VSVFRFWFQ6CisgICAgICBHZXRHcmFwaGljc19JbnNlcnRUZXh0KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfS0VZOgorICAgICAgR2V0R3JhcGhpY3NfS2V5KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfTkVXUEFSQUdSQVBIOgorICAgICAgR2V0R3JhcGhpY3NfTmV3UGFyYWdyYXBoKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfVEVYVE5PVEU6CisgICAgICBHZXRHcmFwaGljc19UZXh0Tm90ZShzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1BBUkFHUkFQSDoKKyAgICAgIEdldEdyYXBoaWNzX1BhcmFncmFwaChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1JJR0hUQVJST1c6CisgICAgICBHZXRHcmFwaGljc19SaWdodEFycm93KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfUklHSFRQT0lOVEVSOgorICAgICAgR2V0R3JhcGhpY3NfUmlnaHRQb2ludGVyKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfU1RBUjoKKyAgICAgIEdldEdyYXBoaWNzX1N0YXIoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9VUEFSUk9XOgorICAgICAgR2V0R3JhcGhpY3NfVXBBcnJvdyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1VQTEVGVEFSUk9XOgorICAgICAgR2V0R3JhcGhpY3NfVXBMZWZ0QXJyb3coc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9HUkFQSDoKKyAgICAgIEdldEdyYXBoaWNzX0dyYXBoKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfUEFQRVJDTElQOgorICAgICAgR2V0R3JhcGhpY3NfUGFwZXJjbGlwKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfQVRUQUNITUVOVDoKKyAgICAgIEdldEdyYXBoaWNzX0F0dGFjaG1lbnQoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9UQUc6CisgICAgICBHZXRHcmFwaGljc19UYWcoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9GT1hJVDoKKyAgICAgIEdldEdyYXBoaWNzX0ZveGl0KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgIH0KIAotCXNBcHBTdHJlYW0gKz0gc1BhdGg7Ci0JaWYgKGNyU3Ryb2tlLm5Db2xvclR5cGUgIT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKQotCQlzQXBwU3RyZWFtICs9ICJCKlxuIjsKLQllbHNlCi0JCXNBcHBTdHJlYW0gKz0gImYqXG4iOworICBzQXBwU3RyZWFtICs9IHNQYXRoOworICBpZiAoY3JTdHJva2UubkNvbG9yVHlwZSAhPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQpCisgICAgc0FwcFN0cmVhbSArPSAiQipcbiI7CisgIGVsc2UKKyAgICBzQXBwU3RyZWFtICs9ICJmKlxuIjsKIAotCXJldHVybiBzQXBwU3RyZWFtOworICByZXR1cm4gc0FwcFN0cmVhbTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3SWNvbkFwcFN0cmVhbShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJaW50MzJfdCBuVHlwZSwgY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgY29uc3QgQ1BXTF9Db2xvciYgY3JGaWxsLCBjb25zdCBDUFdMX0NvbG9yJiBjclN0cm9rZSwgY29uc3QgaW50MzJfdCBuVHJhbnNwYXJhbmN5KQotewotCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JZ3NkLm1fTGluZVdpZHRoID0gMS4wZjsKK3ZvaWQgQ1BXTF9VdGlsczo6RHJhd0ljb25BcHBTdHJlYW0oQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjckZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyU3Ryb2tlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IG5UcmFuc3BhcmFuY3kpIHsKKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgZ3NkLm1fTGluZVdpZHRoID0gMS4wZjsKIAotCUNGWF9CeXRlU3RyaW5nIHNQYXRoOwotCUNGWF9QYXRoRGF0YSBwYXRoOworICBDRlhfQnl0ZVN0cmluZyBzUGF0aDsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CiAKLQlzd2l0Y2ggKG5UeXBlKQotCXsKLQljYXNlIFBXTF9JQ09OVFlQRV9DSEVDS01BUks6Ci0JCUdldEdyYXBoaWNzX0NoZWNrbWFyayhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9DSVJDTEU6Ci0JCUdldEdyYXBoaWNzX0NpcmNsZShzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9DT01NRU5UOgotCQlHZXRHcmFwaGljc19Db21tZW50KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0NST1NTOgotCQlHZXRHcmFwaGljc19Dcm9zcyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9IRUxQOgotCQlHZXRHcmFwaGljc19IZWxwKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0lOU0VSVFRFWFQ6Ci0JCUdldEdyYXBoaWNzX0luc2VydFRleHQoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfS0VZOgotCQlHZXRHcmFwaGljc19LZXkoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfTkVXUEFSQUdSQVBIOgotCQlHZXRHcmFwaGljc19OZXdQYXJhZ3JhcGgoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfVEVYVE5PVEU6Ci0JCUdldEdyYXBoaWNzX1RleHROb3RlKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX1BBUkFHUkFQSDoKLQkJR2V0R3JhcGhpY3NfUGFyYWdyYXBoKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX1JJR0hUQVJST1c6Ci0JCUdldEdyYXBoaWNzX1JpZ2h0QXJyb3coc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfUklHSFRQT0lOVEVSOgotCQlHZXRHcmFwaGljc19SaWdodFBvaW50ZXIoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfU1RBUjoKLQkJR2V0R3JhcGhpY3NfU3RhcihzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9VUEFSUk9XOgotCQlHZXRHcmFwaGljc19VcEFycm93KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX1VQTEVGVEFSUk9XOgotCQlHZXRHcmFwaGljc19VcExlZnRBcnJvdyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9HUkFQSDoKLQkJR2V0R3JhcGhpY3NfR3JhcGgoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfUEFQRVJDTElQOgotCQlHZXRHcmFwaGljc19QYXBlcmNsaXAoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfQVRUQUNITUVOVDoKLQkJR2V0R3JhcGhpY3NfQXR0YWNobWVudChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9UQUc6Ci0JCUdldEdyYXBoaWNzX1RhZyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9GT1hJVDoKLQkJR2V0R3JhcGhpY3NfRm94aXQoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KKyAgc3dpdGNoIChuVHlwZSkgeworICAgIGNhc2UgUFdMX0lDT05UWVBFX0NIRUNLTUFSSzoKKyAgICAgIEdldEdyYXBoaWNzX0NoZWNrbWFyayhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfQ0lSQ0xFOgorICAgICAgR2V0R3JhcGhpY3NfQ2lyY2xlKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9DT01NRU5UOgorICAgICAgR2V0R3JhcGhpY3NfQ29tbWVudChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfQ1JPU1M6CisgICAgICBHZXRHcmFwaGljc19Dcm9zcyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfSEVMUDoKKyAgICAgIEdldEdyYXBoaWNzX0hlbHAoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX0lOU0VSVFRFWFQ6CisgICAgICBHZXRHcmFwaGljc19JbnNlcnRUZXh0KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9LRVk6CisgICAgICBHZXRHcmFwaGljc19LZXkoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX05FV1BBUkFHUkFQSDoKKyAgICAgIEdldEdyYXBoaWNzX05ld1BhcmFncmFwaChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfVEVYVE5PVEU6CisgICAgICBHZXRHcmFwaGljc19UZXh0Tm90ZShzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfUEFSQUdSQVBIOgorICAgICAgR2V0R3JhcGhpY3NfUGFyYWdyYXBoKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9SSUdIVEFSUk9XOgorICAgICAgR2V0R3JhcGhpY3NfUmlnaHRBcnJvdyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfUklHSFRQT0lOVEVSOgorICAgICAgR2V0R3JhcGhpY3NfUmlnaHRQb2ludGVyKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9TVEFSOgorICAgICAgR2V0R3JhcGhpY3NfU3RhcihzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfVVBBUlJPVzoKKyAgICAgIEdldEdyYXBoaWNzX1VwQXJyb3coc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1VQTEVGVEFSUk9XOgorICAgICAgR2V0R3JhcGhpY3NfVXBMZWZ0QXJyb3coc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX0dSQVBIOgorICAgICAgR2V0R3JhcGhpY3NfR3JhcGgoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1BBUEVSQ0xJUDoKKyAgICAgIEdldEdyYXBoaWNzX1BhcGVyY2xpcChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfQVRUQUNITUVOVDoKKyAgICAgIEdldEdyYXBoaWNzX0F0dGFjaG1lbnQoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1RBRzoKKyAgICAgIEdldEdyYXBoaWNzX1RhZyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfRk9YSVQ6CisgICAgICBHZXRHcmFwaGljc19Gb3hpdChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybjsKKyAgfQogCi0JcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwKLQkJUFdMQ29sb3JUb0ZYQ29sb3IoY3JGaWxsLG5UcmFuc3BhcmFuY3kpLCBQV0xDb2xvclRvRlhDb2xvcihjclN0cm9rZSxuVHJhbnNwYXJhbmN5KSwgRlhGSUxMX0FMVEVSTkFURSk7CisgIHBEZXZpY2UtPkRyYXdQYXRoKAorICAgICAgJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgUFdMQ29sb3JUb0ZYQ29sb3IoY3JGaWxsLCBuVHJhbnNwYXJhbmN5KSwKKyAgICAgIFBXTENvbG9yVG9GWENvbG9yKGNyU3Ryb2tlLCBuVHJhbnNwYXJhbmN5KSwgRlhGSUxMX0FMVEVSTkFURSk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfQ2hlY2ttYXJrKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0NoZWNrbWFyayhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUNQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPQotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICArIGZXaWR0aCAvIDE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDIgLyA1LjBmKSxQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgICsgZldpZHRoIC8gMTUuMGYgKyBQV0xfQkVaSUVSKihmV2lkdGggLyA3LjBmIC0gZldpZHRoIC8gMTUuMGYpLAotCQkJCQkgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMiAvIDUuMGYgKyBQV0xfQkVaSUVSKihmSGVpZ2h0ICogMiAvIDcuMGYgLSBmSGVpZ2h0ICogMiAvIDUuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA0LjVmICsgUFdMX0JFWklFUiooZldpZHRoIC8gNS4wZiAtIGZXaWR0aCAvIDQuNWYpLAotCQkJCQkgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTYuMGYgKyBQV0xfQkVaSUVSKihmSGVpZ2h0IC8gNS4wZiAtIGZIZWlnaHQgLyAxNi4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDQuNWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTYuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDQuNWYgKyBQV0xfQkVaSUVSKihmV2lkdGggLyA0LjRmIC0gZldpZHRoIC8gNC41ZiksCi0JCSAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNi4wZiAtIFBXTF9CRVpJRVIqZkhlaWdodCAvIDE2LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAzLjBmICsgUFdMX0JFWklFUiooZldpZHRoIC8gNC4wZiAtIGZXaWR0aCAvIDMuMGYpLAotCQkgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20pLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMuMGYsIGNyQkJveC5ib3R0b20pLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMuMGYgKyBQV0xfQkVaSUVSKmZXaWR0aCooMS83LjBmICsgMi8xNS4wZiksCi0JCSAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIFBXTF9CRVpJRVIqZkhlaWdodCAqIDQgLyA1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgICsgZldpZHRoICogMTQgLyAxNS4wZiArIFBXTF9CRVpJRVIqZldpZHRoKigxLzcuMGYgLSA3LzE1LjBmKSwKLQkJICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDE1LzE2LjBmICsgUFdMX0JFWklFUiooZkhlaWdodCAqIDQvNS4wZiAtIGZIZWlnaHQgKiAxNS8xNi4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCAgKyBmV2lkdGggKiAxNCAvIDE1LjBmLGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMTUgLyAxNi4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICArIGZXaWR0aCAqIDE0IC8gMTUuMGYgKyBQV0xfQkVaSUVSKihmV2lkdGggKiA3IC8gMTUuMGYgLSBmV2lkdGggKiAxNCAvIDE1LjBmKSwKLQkJICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDE1IC8gMTYuMGYgKyBQV0xfQkVaSUVSKihmSGVpZ2h0ICogOCAvIDcuMGYgLSBmSGVpZ2h0ICogMTUgLyAxNi4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMuNmYgKyBQV0xfQkVaSUVSKihmV2lkdGggLyAzLjRmIC0gZldpZHRoIC8gMy42ZiksCi0JCSAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAzLjVmICsgUFdMX0JFWklFUiooZkhlaWdodCAvIDMuNWYgLSBmSGVpZ2h0IC8gMy41ZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMuNmYsY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAzLjVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAzLjZmLAotCQkgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMy41ZiArIFBXTF9CRVpJRVIqKGZIZWlnaHQgLyA0LjBmIC0gZkhlaWdodCAvIDMuNWYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgICsgZldpZHRoIC8gMTUuMGYgKyBQV0xfQkVaSUVSKihmV2lkdGggLyAzLjVmIC0gZldpZHRoIC8gMTUuMGYpLAotCQkgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMiAvIDUuMGYgKyBQV0xfQkVaSUVSKihmSGVpZ2h0ICogMy41ZiAvIDUuMGYgLSBmSGVpZ2h0ICogMiAvIDUuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgICsgZldpZHRoIC8gMTUuMGYsY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gNS4wZiksIFBXTFBUX0JFWklFUlRPKQotCX07CisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDIgLyA1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCgKKyAgICAgICAgICAgICAgY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxNS4wZiArCisgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAvIDcuMGYgLSBmV2lkdGggLyAxNS4wZiksCisgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMiAvIDUuMGYgKworICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0ICogMiAvIDcuMGYgLSBmSGVpZ2h0ICogMiAvIDUuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA0LjVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAvIDUuMGYgLSBmV2lkdGggLyA0LjVmKSwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTYuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAvIDUuMGYgLSBmSGVpZ2h0IC8gMTYuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA0LjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTYuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA0LjVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmV2lkdGggLyA0LjRmIC0gZldpZHRoIC8gNC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNi4wZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmSGVpZ2h0IC8gMTYuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAzLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmV2lkdGggLyA0LjBmIC0gZldpZHRoIC8gMy4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMuMGYsIGNyQkJveC5ib3R0b20pLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAzLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqICgxIC8gNy4wZiArIDIgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogNCAvIDUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAxNCAvIDE1LjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqICgxIC8gNy4wZiAtIDcgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAxNSAvIDE2LjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0ICogNCAvIDUuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZIZWlnaHQgKiAxNSAvIDE2LjBmKSksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDE0IC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAxNSAvIDE2LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KAorICAgICAgICAgICAgICBjckJCb3gubGVmdCArIGZXaWR0aCAqIDE0IC8gMTUuMGYgKworICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmV2lkdGggKiA3IC8gMTUuMGYgLSBmV2lkdGggKiAxNCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAxNSAvIDE2LjBmICsKKyAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAqIDggLyA3LjBmIC0gZkhlaWdodCAqIDE1IC8gMTYuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAzLjZmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAvIDMuNGYgLSBmV2lkdGggLyAzLjZmKSwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMy41ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0IC8gMy41ZiAtIGZIZWlnaHQgLyAzLjVmKSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMy42ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDMuNWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAzLjZmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAzLjVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgLyA0LjBmIC0gZkhlaWdodCAvIDMuNWYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoCisgICAgICAgICAgICAgIGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTUuMGYgKworICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmV2lkdGggLyAzLjVmIC0gZldpZHRoIC8gMTUuMGYpLAorICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDIgLyA1LjBmICsKKyAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAqIDMuNWYgLyA1LjBmIC0gZkhlaWdodCAqIDIgLyA1LjBmKSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMTYpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAxNik7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAxNik7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDE2KTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19DaXJjbGUoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfQ2lyY2xlKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9Ci0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMTUuMGYsY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xNS4wZiwKLQkJICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmICsgUFdMX0JFWklFUiooZkhlaWdodCoxNC8xNS4wZiAtIGZIZWlnaHQvMi4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmIC0gUFdMX0JFWklFUiooZldpZHRoLzIuMGYgLSBmV2lkdGgvMTUuMGYpLCBjckJCb3gudG9wIC0gZkhlaWdodC8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsY3JCQm94LnRvcCAtIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmICsgUFdMX0JFWklFUiooZldpZHRoKjE0LzE1LjBmIC0gZldpZHRoLzIuMGYpLCBjckJCb3gudG9wIC0gZkhlaWdodC8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiArIFBXTF9CRVpJRVIqKGZIZWlnaHQqMTQvMTUuMGYgLSBmSGVpZ2h0LzIuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmIC0gUFdMX0JFWklFUiooZkhlaWdodC8yLjBmIC0gZkhlaWdodC8xNS4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmICsgUFdMX0JFWklFUiooZldpZHRoKjE0LzE1LjBmIC0gZldpZHRoLzIuMGYpLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiAtIFBXTF9CRVpJRVIqKGZXaWR0aC8yLjBmIC0gZldpZHRoLzE1LjBmKSwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiAtIFBXTF9CRVpJRVIqKGZIZWlnaHQvMi4wZiAtIGZIZWlnaHQvMTUuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMTUuMGYsY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjMvMTUuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzIuMGYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMy8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiArIFBXTF9CRVpJRVIqKGZIZWlnaHQqNC81LjBmIC0gZkhlaWdodC8yLjBmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYgLSBQV0xfQkVaSUVSKihmV2lkdGgvMi4wZiAtIGZXaWR0aCozLzE1LjBmKSwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMy8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjMvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmICsgUFdMX0JFWklFUiooZldpZHRoKjQvNS4wZiAtIGZXaWR0aC8yLjBmKSwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMy8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCozLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmICsgUFdMX0JFWklFUiooZkhlaWdodCo0LzUuMGYgLSBmSGVpZ2h0LzIuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjMvMTUuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzIuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMy8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiAtIFBXTF9CRVpJRVIqKGZIZWlnaHQqNC81LjBmIC0gZkhlaWdodC8yLjBmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYgKyBQV0xfQkVaSUVSKihmV2lkdGgqNC81LjBmIC0gZldpZHRoLzIuMGYpLCBjckJCb3guYm90dG9tICsgZkhlaWdodCozLzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMy8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYgLSBQV0xfQkVaSUVSKihmV2lkdGgqNC81LjBmIC0gZldpZHRoLzIuMGYpLCBjckJCb3guYm90dG9tICsgZkhlaWdodCozLzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMy8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiAtIFBXTF9CRVpJRVIqKGZIZWlnaHQqNC81LjBmIC0gZkhlaWdodC8yLjBmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjMvMTUuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzIuMGYpLCBQV0xQVF9CRVpJRVJUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgKiAxNCAvIDE1LjBmIC0gZkhlaWdodCAvIDIuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAvIDIuMGYgLSBmV2lkdGggLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAqIDE0IC8gMTUuMGYgLSBmV2lkdGggLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0ICogMTQgLyAxNS4wZiAtIGZIZWlnaHQgLyAyLjBmKSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0IC8gMi4wZiAtIGZIZWlnaHQgLyAxNS4wZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZldpZHRoICogMTQgLyAxNS4wZiAtIGZXaWR0aCAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmV2lkdGggLyAyLjBmIC0gZldpZHRoIC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAvIDIuMGYgLSBmSGVpZ2h0IC8gMTUuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAzIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDMgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0ICogNCAvIDUuMGYgLSBmSGVpZ2h0IC8gMi4wZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZldpZHRoIC8gMi4wZiAtIGZXaWR0aCAqIDMgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDMgLyAxNS4wZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDMgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZldpZHRoICogNCAvIDUuMGYgLSBmV2lkdGggLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMyAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMyAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgKiA0IC8gNS4wZiAtIGZIZWlnaHQgLyAyLjBmKSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDMgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMyAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgKiA0IC8gNS4wZiAtIGZIZWlnaHQgLyAyLjBmKSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmV2lkdGggKiA0IC8gNS4wZiAtIGZXaWR0aCAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAzIC8gMTUuMGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAzIC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAqIDQgLyA1LjBmIC0gZldpZHRoIC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDMgLyAxNS4wZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMyAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgKiA0IC8gNS4wZiAtIGZIZWlnaHQgLyAyLjBmKSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMyAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMjYpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAyNik7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAyNik7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDI2KTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19Db21tZW50KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0NvbW1lbnQoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0KLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvNi4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvNi4wZiArIFBXTF9CRVpJRVIqKGZIZWlnaHQvNi4wZiAtIGZIZWlnaHQvMTAuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMi8xNS4wZiAtIFBXTF9CRVpJRVIqZldpZHRoLzE1LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8xMC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjIvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjIvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCoyLzE1LjBmICsgUFdMX0JFWklFUipmV2lkdGgvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC82ICsgUFdMX0JFWklFUiooZkhlaWdodC82LjBmIC0gZkhlaWdodC8xMC4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzYuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzMuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCo0LzE1LjBmICsgUFdMX0JFWklFUipmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjIvMTUuMGYgKyBQV0xfQkVaSUVSKmZXaWR0aC8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqNC8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCoyLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCo0LzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqNS8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqNC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo1LzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCoyLzE1ICsgUFdMX0JFWklFUipmSGVpZ2h0KjIvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo1LzE1LjBmIC0gUFdMX0JFWklFUipmV2lkdGgqMi8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMi8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjYvMzAuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjIvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo3LzMwLjBmICsgUFdMX0JFWklFUipmV2lkdGgvMzAuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjIvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo3LzMwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCoyLzE1LjBmICsgUFdMX0JFWklFUipmSGVpZ2h0KjIvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo3LzMwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCo0LzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMi8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqNC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCoyLzE1LjBmIC0gUFdMX0JFWklFUipmV2lkdGgvMTUuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjQvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMy4wZiAtIFBXTF9CRVpJRVIqZkhlaWdodC8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8zLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzYuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMi8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqOC8zMC4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMi8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqOC8zMC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCoyLzE1LCBjckJCb3gudG9wIC0gZkhlaWdodCoyNS82MC4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMi8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMjUvNjAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMi8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTcvMzAuMGYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjQvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjE3LzMwLjBmKSwgUFdMUFRfTElORVRPKQotCX07CisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyA2LjBmKSwKKyAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDYuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAvIDYuMGYgLSBmSGVpZ2h0IC8gMTAuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAyIC8gMTUuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAxMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAyIC8gMTUuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAxMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gNiArCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0IC8gNi4wZiAtIGZIZWlnaHQgLyAxMC4wZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDYuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAzLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMiAvIDE1LjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogNCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDUgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiA1IC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gMTUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAqIDIgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDUgLyAxNS4wZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmV2lkdGggKiAyIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiA2IC8gMzAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiA3IC8gMzAuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoIC8gMzAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiA3IC8gMzAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gMTUuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAqIDIgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDcgLyAzMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAyIC8gMTUuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiA0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDMuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAzLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gNi4wZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDggLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMiAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogOCAvIDMwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDIgLyAxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDI1IC8gNjAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDI1IC8gNjAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMiAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTcgLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogNCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTcgLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyl9OwogCi0JaWYodHlwZSA9PSBQV0xQVF9TVFJFQU0pCi0JCXNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDMwKTsKLQllbHNlCi0JCUdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMzApOworICBpZiAodHlwZSA9PSBQV0xQVF9TVFJFQU0pCisgICAgc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMzApOworICBlbHNlCisgICAgR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAzMCk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfQ3Jvc3MoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKLQkvL0ZYX0ZMT0FUIGZjYXRlcmNvcm5lciA9IChGWF9GTE9BVClzcXJ0KGZXaWR0aCpmV2lkdGggKyBmSGVpZ2h0KmZIZWlnaHQpOwotCUNQV0xfUG9pbnQgY2VudGVyX3BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzIpOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19Dcm9zcyhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKKyAgLy8gRlhfRkxPQVQgZmNhdGVyY29ybmVyID0gKEZYX0ZMT0FUKXNxcnQoZldpZHRoKmZXaWR0aCArIGZIZWlnaHQqZkhlaWdodCk7CisgIENQV0xfUG9pbnQgY2VudGVyX3BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyKTsKIAotCUNQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPQotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54LCBjZW50ZXJfcG9pbnQueSArIGZIZWlnaHQvMTAuMGYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggKyBmV2lkdGgqMC4zZiwgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0LzEwLjBmICsgZldpZHRoKjAuM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggKyBmV2lkdGgvMTAuMGYgKyBmV2lkdGgqMC4zZiwgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0KjAuM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggKyBmV2lkdGgvMTAuMGYsIGNlbnRlcl9wb2ludC55KSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54ICsgZldpZHRoLzEwLjBmICsgZldpZHRoKjAuM2YsIGNlbnRlcl9wb2ludC55IC0gZkhlaWdodCowLjNmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54ICsgZldpZHRoKjAuM2YsIGNlbnRlcl9wb2ludC55IC0gZkhlaWdodC8xMC4wZiAtIGZIZWlnaHQqMC4zZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCwgY2VudGVyX3BvaW50LnkgLSBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54IC0gZldpZHRoKjAuM2YsIGNlbnRlcl9wb2ludC55IC0gZkhlaWdodC8xMCAtIGZIZWlnaHQqMC4zZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCAtIGZXaWR0aC8xMC4wZiAtIGZXaWR0aCowLjNmLCBjZW50ZXJfcG9pbnQueSAtIGZIZWlnaHQqMC4zZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCAtIGZXaWR0aC8xMCwgY2VudGVyX3BvaW50LnkpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggLSBmV2lkdGgvMTAgLSBmV2lkdGgqMC4zZiwgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0KjAuM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggLSBmV2lkdGgqMC4zZiwgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0LzEwLjBmICsgZkhlaWdodCowLjNmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54LCBjZW50ZXJfcG9pbnQueSArIGZIZWlnaHQvMTAuMGYpLCBQV0xQVF9MSU5FVE8pCi0JfTsKKyAgQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IHsKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCwgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0IC8gMTAuMGYpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggKyBmV2lkdGggKiAwLjNmLAorICAgICAgICAgICAgICAgICAgICAgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0IC8gMTAuMGYgKyBmV2lkdGggKiAwLjNmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54ICsgZldpZHRoIC8gMTAuMGYgKyBmV2lkdGggKiAwLjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9wb2ludC55ICsgZkhlaWdodCAqIDAuM2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54ICsgZldpZHRoIC8gMTAuMGYsIGNlbnRlcl9wb2ludC55KSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCArIGZXaWR0aCAvIDEwLjBmICsgZldpZHRoICogMC4zZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfcG9pbnQueSAtIGZIZWlnaHQgKiAwLjNmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCArIGZXaWR0aCAqIDAuM2YsCisgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfcG9pbnQueSAtIGZIZWlnaHQgLyAxMC4wZiAtIGZIZWlnaHQgKiAwLjNmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54LCBjZW50ZXJfcG9pbnQueSAtIGZIZWlnaHQgLyAxMC4wZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCAtIGZXaWR0aCAqIDAuM2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyX3BvaW50LnkgLSBmSGVpZ2h0IC8gMTAgLSBmSGVpZ2h0ICogMC4zZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggLSBmV2lkdGggLyAxMC4wZiAtIGZXaWR0aCAqIDAuM2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyX3BvaW50LnkgLSBmSGVpZ2h0ICogMC4zZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggLSBmV2lkdGggLyAxMCwgY2VudGVyX3BvaW50LnkpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54IC0gZldpZHRoIC8gMTAgLSBmV2lkdGggKiAwLjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9wb2ludC55ICsgZkhlaWdodCAqIDAuM2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54IC0gZldpZHRoICogMC4zZiwKKyAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9wb2ludC55ICsgZkhlaWdodCAvIDEwLjBmICsgZkhlaWdodCAqIDAuM2YpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY2VudGVyX3BvaW50LngsIGNlbnRlcl9wb2ludC55ICsgZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAxMyk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDEzKTsKKyAgaWYgKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQorICAgIHNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDEzKTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMTMpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0hlbHAoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfSGVscChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUNQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPQotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmICsgUFdMX0JFWklFUiooZkhlaWdodC82MC4wZiAtIGZIZWlnaHQvMi4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmIC0gUFdMX0JFWklFUiooZldpZHRoLzIuMGYgLSBmV2lkdGgvNjAuMGYpLCBjckJCb3guYm90dG9tICsgZkhlaWdodC82MC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzYwLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiArIFBXTF9CRVpJRVIqZldpZHRoKjI5LzYwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC82MC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC82MC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiArIFBXTF9CRVpJRVIqKGZIZWlnaHQvNjAuMGYgLSBmSGVpZ2h0LzIuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzYwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzYwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmICsgUFdMX0JFWklFUipmSGVpZ2h0KjI5LzYwLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiArIFBXTF9CRVpJRVIqZldpZHRoKjI5LzYwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC82MC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzYwLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiAtIFBXTF9CRVpJRVIqZldpZHRoKjI5LzYwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC82MC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmICArIFBXTF9CRVpJRVIqZkhlaWdodCoyOS82MC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzZmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjdmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjM2ZiArIFBXTF9CRVpJRVIqZkhlaWdodCowLjIzZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNWYgLSBQV0xfQkVaSUVSKmZXaWR0aCowLjIzZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC44N2YpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjg3ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNWYgKyBQV0xfQkVaSUVSKmZXaWR0aCowLjIzZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC44N2YpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4yN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzZmICsgUFdMX0JFWklFUipmSGVpZ2h0KjAuMjNmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuMjdmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjM2ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjI3ZiAtIGZXaWR0aCowLjA4ZiowLjJmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjM2ZiAtIGZIZWlnaHQqMC4xNWYqMC43ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjM1ZiArIGZXaWR0aCowLjA4ZiowLjJmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjUxZiArIGZIZWlnaHQqMC4xNWYqMC4yZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjM1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC41MWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4zNWYgLSBmV2lkdGgqMC4xZiowLjVmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjUxZiAtIGZIZWlnaHQqMC4xNWYqMC4zZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjQ1ZiAtIGZXaWR0aCowLjFmKjAuNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNjhmICsgZkhlaWdodCowLjE1ZiowLjVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNDVmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjY4ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjQ1ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4zMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNDVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjMwZiAtIGZXaWR0aCowLjFmKjAuN2YpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC41NWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMzBmIC0gZldpZHRoKjAuMWYqMC43ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjU1ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4zMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC41NWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNjZmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjU1ZiAtIGZXaWR0aCowLjFmKjAuMDVmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjY2ZiArIGZIZWlnaHQqMC4xOGYqMC41ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjQ1ZiAtIGZXaWR0aCowLjFmKjAuMDVmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjQ4ZiAtIGZIZWlnaHQqMC4xOGYqMC4zZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjQ1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC40OGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC40NWYgKyBmV2lkdGgqMC4wOGYqMC4yZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC40OGYgKyBmSGVpZ2h0KjAuMThmKjAuMmYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4zN2YgLSBmV2lkdGgqMC4wOGYqMC4yZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zNmYgLSBmSGVpZ2h0KjAuMThmKjAuN2YpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4zN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzZmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuMzdmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjM2ZiArIFBXTF9CRVpJRVIqZkhlaWdodCowLjEzZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNWYgKyBQV0xfQkVaSUVSKmZXaWR0aCowLjEzZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC43N2YpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjc3ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNWYgLSBQV0xfQkVaSUVSKmZXaWR0aCowLjEzZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC43N2YpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjM3ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zNmYgKyBQV0xfQkVaSUVSKmZIZWlnaHQqMC4xM2YpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjM3ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zNmYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjM3ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zNmYgLSBmV2lkdGgqMC4xZiowLjZmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzZmIC0gZldpZHRoKjAuMWYqMC42ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjdmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjM2ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjU2ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4xM2YpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNTZmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjEzZiArIFBXTF9CRVpJRVIqZkhlaWdodCowLjA1NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC41MDVmIC0gUFdMX0JFWklFUipmV2lkdGgqMC4wOTVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjE4NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC41MDVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjE4NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC41MDVmICsgUFdMX0JFWklFUipmV2lkdGgqMC4wNjVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjE4NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC40NGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMTNmICsgUFdMX0JFWklFUipmSGVpZ2h0KjAuMDU1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjQ0ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4xM2YpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC40NGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMTNmIC0gUFdMX0JFWklFUipmSGVpZ2h0KjAuMDU1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjUwNWYgKyBQV0xfQkVaSUVSKmZXaWR0aCowLjA2NWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMDc1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjUwNWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMDc1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjUwNWYgLSBQV0xfQkVaSUVSKmZXaWR0aCowLjA2NWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMDc1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjU2ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4xM2YgLSBQV0xfQkVaSUVSKmZIZWlnaHQqMC4wNTVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNTZmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjEzZiksIFBXTFBUX0JFWklFUlRPKQotCX07CisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA2MC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNjAuMGYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAvIDYwLjBmIC0gZkhlaWdodCAvIDIuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAvIDIuMGYgLSBmV2lkdGggLyA2MC4wZiksCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDYwLjBmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gNjAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDI5IC8gNjAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyA2MC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyA2MC4wZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0IC8gNjAuMGYgLSBmSGVpZ2h0IC8gMi4wZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyA2MC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gNjAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAyOSAvIDYwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmV2lkdGggKiAyOSAvIDYwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gNjAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCAvIDYwLjBmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDI5IC8gNjAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyA2MC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDYwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMjkgLyA2MC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDYwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zNmYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjM2ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMC4yM2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjVmIC0gUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuMjNmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjg3ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuODdmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC41ZiArIFBXTF9CRVpJRVIgKiBmV2lkdGggKiAwLjIzZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC44N2YpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjI3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzZmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAwLjIzZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjI3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzZmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMjdmIC0gZldpZHRoICogMC4wOGYgKiAwLjJmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjM2ZiAtIGZIZWlnaHQgKiAwLjE1ZiAqIDAuN2YpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjM1ZiArIGZXaWR0aCAqIDAuMDhmICogMC4yZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC41MWYgKyBmSGVpZ2h0ICogMC4xNWYgKiAwLjJmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC4zNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjUxZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjM1ZiAtIGZXaWR0aCAqIDAuMWYgKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjUxZiAtIGZIZWlnaHQgKiAwLjE1ZiAqIDAuM2YpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjQ1ZiAtIGZXaWR0aCAqIDAuMWYgKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjY4ZiArIGZIZWlnaHQgKiAwLjE1ZiAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjQ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNjhmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNDVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4zMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNDVmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjMwZiAtIGZXaWR0aCAqIDAuMWYgKiAwLjdmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC41NWYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMzBmIC0gZldpZHRoICogMC4xZiAqIDAuN2YpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjU1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMzBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNTVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC42NmYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNTVmIC0gZldpZHRoICogMC4xZiAqIDAuMDVmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjY2ZiArIGZIZWlnaHQgKiAwLjE4ZiAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjQ1ZiAtIGZXaWR0aCAqIDAuMWYgKiAwLjA1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC40OGYgLSBmSGVpZ2h0ICogMC4xOGYgKiAwLjNmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC40NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjQ4ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjQ1ZiArIGZXaWR0aCAqIDAuMDhmICogMC4yZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC40OGYgKyBmSGVpZ2h0ICogMC4xOGYgKiAwLjJmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC4zN2YgLSBmV2lkdGggKiAwLjA4ZiAqIDAuMmYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzZmIC0gZkhlaWdodCAqIDAuMThmICogMC43ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMzdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zNmYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC4zN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjM2ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMC4xM2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjVmICsgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuMTNmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjc3ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuNzdmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC41ZiAtIFBXTF9CRVpJRVIgKiBmV2lkdGggKiAwLjEzZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC43N2YpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMzdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zNmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAqIDAuMTNmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4zN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjM2ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMzdmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjM2ZiAtIGZXaWR0aCAqIDAuMWYgKiAwLjZmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI3ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zNmYgLSBmV2lkdGggKiAwLjFmICogMC42ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjM2ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjU2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMTNmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjU2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMTNmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAwLjA1NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC41MDVmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuMDk1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMTg1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjUwNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjE4NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC41MDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuMDY1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMTg1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjQ0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMTNmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAwLjA1NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC40NGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjEzZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjQ0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMTNmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAwLjA1NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC41MDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuMDY1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMDc1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjUwNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjA3NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC41MDVmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuMDY1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMDc1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjU2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMTNmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAwLjA1NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC41NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjEzZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgNTkpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCA1OSk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCA1OSk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDU5KTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19JbnNlcnRUZXh0KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0luc2VydFRleHQoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0KLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xMCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTApLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMi8xNSksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTAsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzEwKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzEwLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xMCksIFBXTFBUX0xJTkVUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTAsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTApLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDIgLyAxNSksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxMCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxMCksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDEwLCBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDEwKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCA0KTsKLQllbHNlCi0JCUdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgNCk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCA0KTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgNCk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfS2V5KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Ci0JRlhfRkxPQVQgayA9IC1mSGVpZ2h0L2ZXaWR0aDsKLQlDUFdMX1BvaW50IHRhaWw7Ci0JQ1BXTF9Qb2ludCBDaWNsZUNlbnRlcjsKLQl0YWlsLnggPSBjckJCb3gubGVmdCArIGZXaWR0aCowLjlmOwotCXRhaWwueSA9IGsqKHRhaWwueCAtIGNyQkJveC5yaWdodCkgKyBjckJCb3guYm90dG9tOwotCUNpY2xlQ2VudGVyLnggPSBjckJCb3gubGVmdCArIGZXaWR0aCowLjE1ZjsKLQlDaWNsZUNlbnRlci55ID0gayooQ2ljbGVDZW50ZXIueCAtIGNyQkJveC5yaWdodCkgKyBjckJCb3guYm90dG9tOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19LZXkoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CisgIEZYX0ZMT0FUIGsgPSAtZkhlaWdodCAvIGZXaWR0aDsKKyAgQ1BXTF9Qb2ludCB0YWlsOworICBDUFdMX1BvaW50IENpY2xlQ2VudGVyOworICB0YWlsLnggPSBjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuOWY7CisgIHRhaWwueSA9IGsgKiAodGFpbC54IC0gY3JCQm94LnJpZ2h0KSArIGNyQkJveC5ib3R0b207CisgIENpY2xlQ2VudGVyLnggPSBjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMTVmOworICBDaWNsZUNlbnRlci55ID0gayAqIChDaWNsZUNlbnRlci54IC0gY3JCQm94LnJpZ2h0KSArIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0KLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGgvMzAuMGYsIC1mV2lkdGgvMzAuMGYvayArIHRhaWwueSksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGgvMzAuMGYgLSBmV2lkdGgqMC4xOGYsIC1rKmZXaWR0aCowLjE4ZiAtIGZXaWR0aC8zMC9rICsgdGFpbC55KSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aC8zMCAtIGZXaWR0aCowLjE4ZiArIGZXaWR0aCowLjA3ZiwKLQkJICAgICAgICAgICAgICAtZldpZHRoKjAuMDdmL2sgLSBrKmZXaWR0aCowLjE4ZiAtIGZXaWR0aC8zMC9rICsgdGFpbC55KSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aC8zMCAtIGZXaWR0aCowLjE4ZiAtIGZXaWR0aC8yMCArIGZXaWR0aCowLjA3ZiwKLQkJICAgICAgICAgICAgICAtZldpZHRoKjAuMDdmL2sgLSBrKmZXaWR0aC8yMCAtIGsqZldpZHRoKjAuMThmIC0gZldpZHRoLzMwL2sgKyB0YWlsLnkpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoLzMwIC0gZldpZHRoKjAuMThmIC0gZldpZHRoLzIwLAotCQkgICAgICAgICAgICAgIC1rKmZXaWR0aC8yMCAtIGsqZldpZHRoKjAuMThmIC0gZldpZHRoLzMwL2sgKyB0YWlsLnkpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoLzMwIC0gZldpZHRoKjAuMThmIC0gZldpZHRoLzIwIC0gZldpZHRoLzE1LAotCQkgICAgICAgICAgICAgIC1rKmZXaWR0aC8xNSAtIGsqZldpZHRoLzIwIC0gaypmV2lkdGgqMC4xOGYgLSBmV2lkdGgvMzAvayArIHRhaWwueSksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGgvMzAgLSBmV2lkdGgqMC4xOGYgLSBmV2lkdGgvMjAgLSBmV2lkdGgvMTUgKyBmV2lkdGgqMC4wN2YsCi0JCSAgICAgICAgICAgICAgLWZXaWR0aCowLjA3Zi9rIC0gaypmV2lkdGgvMTUgLSBrKmZXaWR0aC8yMCAtIGsqZldpZHRoKjAuMThmIC0gZldpZHRoLzMwL2sgKyB0YWlsLnkpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoLzMwIC0gZldpZHRoKjAuMThmIC0gZldpZHRoLzIwIC0gZldpZHRoLzE1IC0gZldpZHRoLzIwICsgZldpZHRoKjAuMDdmLAotCQkgICAgICAgICAgICAgIC1mV2lkdGgqMC4wN2YvayArIC1rKmZXaWR0aC8yMCArIC1rKmZXaWR0aC8xNSAtIGsqZldpZHRoLzIwIC0gaypmV2lkdGgqMC4xOGYgLSBmV2lkdGgvMzAvayArIHRhaWwueSksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGgvMzAgLSBmV2lkdGgqMC4xOGYgLSBmV2lkdGgvMjAgLSBmV2lkdGgvMTUgLSBmV2lkdGgvMjAsCi0JCSAgICAgICAgICAgICAgLWsqZldpZHRoLzIwICsgLWsqZldpZHRoLzE1IC0gaypmV2lkdGgvMjAgLSBrKmZXaWR0aCowLjE4ZiAtIGZXaWR0aC8zMC9rICsgdGFpbC55KSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aC8zMCAtIGZXaWR0aCowLjQ1ZiwgLWsqZldpZHRoKjAuNDVmIC0gZldpZHRoLzMwL2sgKyB0YWlsLnkpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoLzMwIC0gZldpZHRoKjAuNDVmICsgZldpZHRoKjAuMmYsCi0JCSAgICAgICAgICAgICAgLWZXaWR0aCowLjRmL2sgLSBrKmZXaWR0aCowLjQ1ZiAtIGZXaWR0aC8zMC9rICsgdGFpbC55KSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCowLjJmLCAtIGZXaWR0aCowLjFmL2sgKyBDaWNsZUNlbnRlci55KSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCwgQ2ljbGVDZW50ZXIueSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLnggLSBmV2lkdGgvNjAuMGYsIC1rKmZXaWR0aC82MCArIENpY2xlQ2VudGVyLnkpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54IC0gZldpZHRoLzYwLCAtaypmV2lkdGgvNjAgKyBDaWNsZUNlbnRlci55KSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCwgQ2ljbGVDZW50ZXIueSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLnggLSBmV2lkdGgqMC4yMmYsIGZXaWR0aCowLjM1Zi9rICsgQ2ljbGVDZW50ZXIueSAtIGZIZWlnaHQqMC4wNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggLSBmV2lkdGgvMzAgLSBmV2lkdGgqMC40NWYgLSBmV2lkdGgqMC4xOGYsIGZXaWR0aCowLjA1Zi9rIC0gaypmV2lkdGgqMC40NWYgKyBmV2lkdGgvMzAvayArIHRhaWwueSAtIGZIZWlnaHQqMC4wNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggLSBmV2lkdGgvMzAuMGYgLSBmV2lkdGgqMC40NWYsIC1rKmZXaWR0aCowLjQ1ZiArIGZXaWR0aC8zMC4wZi9rICsgdGFpbC55KSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54IC0gZldpZHRoLzMwLjBmLCBmV2lkdGgvMzAuMGYvayArIHRhaWwueSksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGgvMzAsIC1mV2lkdGgvMzAvayArIHRhaWwueSksIFBXTFBUX0xJTkVUTyksCi0gCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCowLjA4ZiwgaypmV2lkdGgqMC4wOGYgKyBDaWNsZUNlbnRlci55KSwgUFdMUFRfTU9WRVRPKSwKLSAJCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54ICsgZldpZHRoKjAuMDhmICsgZldpZHRoKjAuMWYsIC1mV2lkdGgqMC4xZi9rICsgaypmV2lkdGgqMC4wOGYgKyBDaWNsZUNlbnRlci55KSwgUFdMUFRfQkVaSUVSVE8pLAotIAkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLnggKyBmV2lkdGgqMC4yMmYgKyBmV2lkdGgqMC4xZiwgaypmV2lkdGgqMC4yMmYgKyBDaWNsZUNlbnRlci55IC0gZldpZHRoKjAuMWYvayksIFBXTFBUX0JFWklFUlRPKSwKLSAJCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54ICsgZldpZHRoKjAuMjJmLCBrKmZXaWR0aCowLjIyZiArIENpY2xlQ2VudGVyLnkpLCBQV0xQVF9CRVpJRVJUTyksCi0gCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCowLjIyZiAtIGZXaWR0aCowLjFmLCBmV2lkdGgqMC4xZi9rICsgaypmV2lkdGgqMC4yMmYgKyBDaWNsZUNlbnRlci55KSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCowLjA4ZiAtIGZXaWR0aCowLjFmLCBmV2lkdGgqMC4xZi9rICsgaypmV2lkdGgqMC4wOGYgKyBDaWNsZUNlbnRlci55KSwgUFdMUFRfQkVaSUVSVE8pLAotIAkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLnggKyBmV2lkdGgqMC4wOGYsIGsqZldpZHRoKjAuMDhmICsgQ2ljbGVDZW50ZXIueSksIFBXTFBUX0JFWklFUlRPKQotCX07CisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMzAuMGYsIC1mV2lkdGggLyAzMC4wZiAvIGsgKyB0YWlsLnkpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMzAuMGYgLSBmV2lkdGggKiAwLjE4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtayAqIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMzAgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGggLyAzMCAtIGZXaWR0aCAqIDAuMThmICsgZldpZHRoICogMC4wN2YsCisgICAgICAgICAgICAgICAgICAgICAtZldpZHRoICogMC4wN2YgLyBrIC0gayAqIGZXaWR0aCAqIDAuMThmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggLyAzMCAvIGsgKyB0YWlsLnkpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjE4ZiAtIGZXaWR0aCAvIDIwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggKiAwLjA3ZiwKKyAgICAgICAgICAgICAgICAgICAgIC1mV2lkdGggKiAwLjA3ZiAvIGsgLSBrICogZldpZHRoIC8gMjAgLQorICAgICAgICAgICAgICAgICAgICAgICAgIGsgKiBmV2lkdGggKiAwLjE4ZiAtIGZXaWR0aCAvIDMwIC8gayArIHRhaWwueSksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCgKKyAgICAgICAgICAgICAgdGFpbC54ICsgZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjE4ZiAtIGZXaWR0aCAvIDIwLAorICAgICAgICAgICAgICAtayAqIGZXaWR0aCAvIDIwIC0gayAqIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMzAgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KAorICAgICAgICAgICAgICB0YWlsLnggKyBmV2lkdGggLyAzMCAtIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMjAgLSBmV2lkdGggLyAxNSwKKyAgICAgICAgICAgICAgLWsgKiBmV2lkdGggLyAxNSAtIGsgKiBmV2lkdGggLyAyMCAtIGsgKiBmV2lkdGggKiAwLjE4ZiAtCisgICAgICAgICAgICAgICAgICBmV2lkdGggLyAzMCAvIGsgKyB0YWlsLnkpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjE4ZiAtIGZXaWR0aCAvIDIwIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggLyAxNSArIGZXaWR0aCAqIDAuMDdmLAorICAgICAgICAgICAgICAgICAgICAgLWZXaWR0aCAqIDAuMDdmIC8gayAtIGsgKiBmV2lkdGggLyAxNSAtIGsgKiBmV2lkdGggLyAyMCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgayAqIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMzAgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aCAvIDMwIC0gZldpZHRoICogMC4xOGYgLSBmV2lkdGggLyAyMCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoIC8gMTUgLSBmV2lkdGggLyAyMCArIGZXaWR0aCAqIDAuMDdmLAorICAgICAgICAgICAgICAgICAgICAgLWZXaWR0aCAqIDAuMDdmIC8gayArIC1rICogZldpZHRoIC8gMjAgKyAtayAqIGZXaWR0aCAvIDE1IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBrICogZldpZHRoIC8gMjAgLSBrICogZldpZHRoICogMC4xOGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAvIDMwIC8gayArIHRhaWwueSksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGggLyAzMCAtIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMjAgLQorICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAvIDE1IC0gZldpZHRoIC8gMjAsCisgICAgICAgICAgICAgICAgICAgICAtayAqIGZXaWR0aCAvIDIwICsgLWsgKiBmV2lkdGggLyAxNSAtIGsgKiBmV2lkdGggLyAyMCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgayAqIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMzAgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aCAvIDMwIC0gZldpZHRoICogMC40NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWsgKiBmV2lkdGggKiAwLjQ1ZiAtIGZXaWR0aCAvIDMwIC8gayArIHRhaWwueSksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjQ1ZiArIGZXaWR0aCAqIDAuMmYsCisgICAgICAgICAgICAgICAgICAgICAtZldpZHRoICogMC40ZiAvIGsgLSBrICogZldpZHRoICogMC40NWYgLSBmV2lkdGggLyAzMCAvIGsgKworICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWwueSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLnggKyBmV2lkdGggKiAwLjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1mV2lkdGggKiAwLjFmIC8gayArIENpY2xlQ2VudGVyLnkpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCwgQ2ljbGVDZW50ZXIueSksIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54IC0gZldpZHRoIC8gNjAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWsgKiBmV2lkdGggLyA2MCArIENpY2xlQ2VudGVyLnkpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCAtIGZXaWR0aCAvIDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rICogZldpZHRoIC8gNjAgKyBDaWNsZUNlbnRlci55KSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLngsIENpY2xlQ2VudGVyLnkpLCBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCAtIGZXaWR0aCAqIDAuMjJmLAorICAgICAgICAgICAgICAgICAgICAgZldpZHRoICogMC4zNWYgLyBrICsgQ2ljbGVDZW50ZXIueSAtIGZIZWlnaHQgKiAwLjA1ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KHRhaWwueCAtIGZXaWR0aCAvIDMwIC0gZldpZHRoICogMC40NWYgLSBmV2lkdGggKiAwLjE4ZiwKKyAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAqIDAuMDVmIC8gayAtIGsgKiBmV2lkdGggKiAwLjQ1ZiArIGZXaWR0aCAvIDMwIC8gayArCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbC55IC0gZkhlaWdodCAqIDAuMDVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54IC0gZldpZHRoIC8gMzAuMGYgLSBmV2lkdGggKiAwLjQ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIC1rICogZldpZHRoICogMC40NWYgKyBmV2lkdGggLyAzMC4wZiAvIGsgKyB0YWlsLnkpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCh0YWlsLnggLSBmV2lkdGggLyAzMC4wZiwgZldpZHRoIC8gMzAuMGYgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aCAvIDMwLCAtZldpZHRoIC8gMzAgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54ICsgZldpZHRoICogMC4wOGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayAqIGZXaWR0aCAqIDAuMDhmICsgQ2ljbGVDZW50ZXIueSksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCAqIDAuMDhmICsgZldpZHRoICogMC4xZiwKKyAgICAgICAgICAgICAgICAgICAgIC1mV2lkdGggKiAwLjFmIC8gayArIGsgKiBmV2lkdGggKiAwLjA4ZiArIENpY2xlQ2VudGVyLnkpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54ICsgZldpZHRoICogMC4yMmYgKyBmV2lkdGggKiAwLjFmLAorICAgICAgICAgICAgICAgICAgICAgayAqIGZXaWR0aCAqIDAuMjJmICsgQ2ljbGVDZW50ZXIueSAtIGZXaWR0aCAqIDAuMWYgLyBrKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCAqIDAuMjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgKiBmV2lkdGggKiAwLjIyZiArIENpY2xlQ2VudGVyLnkpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCAqIDAuMjJmIC0gZldpZHRoICogMC4xZiwKKyAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAqIDAuMWYgLyBrICsgayAqIGZXaWR0aCAqIDAuMjJmICsgQ2ljbGVDZW50ZXIueSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KENpY2xlQ2VudGVyLnggKyBmV2lkdGggKiAwLjA4ZiAtIGZXaWR0aCAqIDAuMWYsCisgICAgICAgICAgICAgICAgICAgICBmV2lkdGggKiAwLjFmIC8gayArIGsgKiBmV2lkdGggKiAwLjA4ZiArIENpY2xlQ2VudGVyLnkpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54ICsgZldpZHRoICogMC4wOGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayAqIGZXaWR0aCAqIDAuMDhmICsgQ2ljbGVDZW50ZXIueSksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMjgpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAyOCk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAyOCk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDI4KTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19OZXdQYXJhZ3JhcGgoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfTmV3UGFyYWdyYXBoKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9Ci0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvMjAuMGYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMTAuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzIuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzEwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzIwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMTJmLCBjckJCb3gudG9wIC0gZkhlaWdodCoxNy8zMC4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjEyZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yMmYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjJmLCBjckJCb3gudG9wIC0gZkhlaWdodCoxNy8zMC4wZiAtIGZXaWR0aCowLjE0ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjM4ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC40OGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNDhmLCBjckJCb3gudG9wIC0gZkhlaWdodCoxNy8zMC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjM4ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTcvMzAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4zOGYsIGNyQkJveC5ib3R0b20gKyBmV2lkdGgqMC4yNGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjE3LzMwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMTJmLCBjckJCb3gudG9wIC0gZkhlaWdodCoxNy8zMC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjZmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xMC4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjdmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xMC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjdmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xMC4wZiArIGZIZWlnaHQvNy4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjk3ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTAuMGYgKyBmSGVpZ2h0LzcuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjk3ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTcvMzAuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjdmLCBjckJCb3gudG9wIC0gZkhlaWdodCoxNy8zMC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjE3LzMwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNmYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuN2YsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzcgKyBmSGVpZ2h0KjAuMThmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuODVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC83ICsgZkhlaWdodCowLjE4ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuODVmLCBjckJCb3gudG9wIC0gZkhlaWdodCoxNy8zMC4wZiAtIGZIZWlnaHQqMC4wOGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjdmLCBjckJCb3gudG9wIC0gZkhlaWdodCoxNy8zMC4wZiAtIGZIZWlnaHQqMC4wOGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjdmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC83ICsgZkhlaWdodCowLjE4ZiksIFBXTFBUX0xJTkVUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAyMC4wZiksCisgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDEwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCAvIDIuMGYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMjAuMGYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDE3IC8gMzAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4xMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjIyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMjJmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAxNyAvIDMwLjBmIC0gZldpZHRoICogMC4xNGYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjM4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNDhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40OGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAxNyAvIDMwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMzhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTcgLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjM4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZldpZHRoICogMC4yNGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAxNyAvIDMwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTcgLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC43ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuN2YsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDEwLjBmICsgZkhlaWdodCAvIDcuMGYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjk3ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTAuMGYgKyBmSGVpZ2h0IC8gNy4wZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC45N2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAxNyAvIDMwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC43ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDE3IC8gMzAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTcgLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC43ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDcgKyBmSGVpZ2h0ICogMC4xOGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC44NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyA3ICsgZkhlaWdodCAqIDAuMThmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC44NWYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDE3IC8gMzAuMGYgLSBmSGVpZ2h0ICogMC4wOGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuN2YsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDE3IC8gMzAuMGYgLSBmSGVpZ2h0ICogMC4wOGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyA3ICsgZkhlaWdodCAqIDAuMThmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMjgpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAyOCk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAyOCk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDI4KTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19UZXh0Tm90ZShDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpCi17Ci0JRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19UZXh0Tm90ZShDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUNQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPQotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCozLzEwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xNS4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo3LzEwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCo0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xMC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqNC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTAuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzEwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xMC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjMvMTAuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xMC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqNC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMy8xMC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjMvMTAuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjQvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzEwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCo0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjQvMTUuMGYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjQvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqNy8xNS4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqNy8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC81LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCoxMC8xNS4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMy8xMC4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTAvMTUuMGYpLCBQV0xQVF9MSU5FVE8pCi0JfTsKKyAgQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IHsKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAzIC8gMTAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiA3IC8gMTAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiA0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogNCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMyAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogNCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAzIC8gMTAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMyAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogNCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogNCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyA1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogNCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiA3IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiA3IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDEwIC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDMgLyAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDEwIC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAxNyk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDE3KTsKKyAgaWYgKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQorICAgIHNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDE3KTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMTcpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX1BhcmFncmFwaChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpCi17Ci0JRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19QYXJhZ3JhcGgoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0KLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8xNS4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjdmLCBjckJCb3gudG9wIC0gZkhlaWdodC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjdmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjYzNGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNjM0ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMi8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjU2NmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjIvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC41NjZmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8xNS4wZiAtIGZIZWlnaHQqMC40ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjJmLCBjckJCb3gudG9wIC0gZkhlaWdodC8xNS4wZiAtIGZIZWlnaHQqMC40ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC42MzRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC42MzRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMiAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNTY2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDIgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjU2NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDE1LjBmIC0gZkhlaWdodCAqIDAuNGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDE1LjBmIC0gZkhlaWdodCAqIDAuNGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjJmLCBjckJCb3gudG9wIC0gZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyl9OwogCi0JaWYodHlwZSA9PSBQV0xQVF9TVFJFQU0pCi0JCXNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDEyKTsKLQllbHNlCi0JCUdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMTIpOworICBpZiAodHlwZSA9PSBQV0xQVF9TVFJFQU0pCisgICAgc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMTIpOworICBlbHNlCisgICAgR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAxMik7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfUmlnaHRBcnJvdyhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpCi17Ci0JRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19SaWdodEFycm93KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9Ci0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yLjBmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYgKyBmV2lkdGgvOC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC81LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xNS4wZiAtIGZXaWR0aCowLjE1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvMi4wZiAtIGZXaWR0aC8yNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjFmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yLjBmIC0gZldpZHRoLzI1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzIuMGYgKyBmV2lkdGgvMjUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1LjBmIC0gZldpZHRoKjAuMTVmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yLjBmICsgZldpZHRoLzI1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiArIGZXaWR0aC84LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC81LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvMi4wZiksIFBXTFBUX0xJTkVUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmICsgZldpZHRoIC8gOC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1LjBmIC0gZldpZHRoICogMC4xNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAyLjBmIC0gZldpZHRoIC8gMjUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4xZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDIuMGYgLSBmV2lkdGggLyAyNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMi4wZiArIGZXaWR0aCAvIDI1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNS4wZiAtIGZXaWR0aCAqIDAuMTVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMi4wZiArIGZXaWR0aCAvIDI1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gNS4wZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYgKyBmV2lkdGggLyA4LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMTApOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAxMCk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAxMCk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDEwKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19SaWdodFBvaW50ZXIoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfUmlnaHRQb2ludGVyKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9Ci0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzMwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yLjBmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzMwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC82LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjQvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzIuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMzAuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzYuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzMwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yLjBmKSwgUFdMUFRfTElORVRPKQotCX07CisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMzAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gNi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiA0IC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCAvIDYuMGYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMzAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgNSk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDUpOworICBpZiAodHlwZSA9PSBQV0xQVF9TVFJFQU0pCisgICAgc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgNSk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDUpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX1N0YXIoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZMb25nUmFkaXVzID0gKGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tKS8oMSsoRlhfRkxPQVQpY29zKFBXTF9QSS81LjBmKSk7Ci0JZkxvbmdSYWRpdXMgPSBmTG9uZ1JhZGl1cyAqIDAuN2Y7Ci0JRlhfRkxPQVQgZlNob3J0UmFkaXVzID0gZkxvbmdSYWRpdXMgKiAwLjU1ZjsKLQlDUERGX1BvaW50IHB0Q2VudGVyID0gQ1BERl9Qb2ludCgoY3JCQm94LmxlZnQgKyBjckJCb3gucmlnaHQpIC8gMi4wZiwoY3JCQm94LnRvcCArIGNyQkJveC5ib3R0b20pIC8gMi4wZik7Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX1N0YXIoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZMb25nUmFkaXVzID0KKyAgICAgIChjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbSkgLyAoMSArIChGWF9GTE9BVCljb3MoUFdMX1BJIC8gNS4wZikpOworICBmTG9uZ1JhZGl1cyA9IGZMb25nUmFkaXVzICogMC43ZjsKKyAgRlhfRkxPQVQgZlNob3J0UmFkaXVzID0gZkxvbmdSYWRpdXMgKiAwLjU1ZjsKKyAgQ1BERl9Qb2ludCBwdENlbnRlciA9IENQREZfUG9pbnQoKGNyQkJveC5sZWZ0ICsgY3JCQm94LnJpZ2h0KSAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjckJCb3gudG9wICsgY3JCQm94LmJvdHRvbSkgLyAyLjBmKTsKIAotCUZYX0ZMT0FUIHB4MVs1XSwgcHkxWzVdOwotCUZYX0ZMT0FUIHB4Mls1XSwgcHkyWzVdOworICBGWF9GTE9BVCBweDFbNV0sIHB5MVs1XTsKKyAgRlhfRkxPQVQgcHgyWzVdLCBweTJbNV07CiAKLQlGWF9GTE9BVCBmQW5nZWwgPSBQV0xfUEkvMTAuMGY7CisgIEZYX0ZMT0FUIGZBbmdlbCA9IFBXTF9QSSAvIDEwLjBmOwogCi0JZm9yIChpbnQzMl90IGk9MDsgaTw1OyBpKyspCi0JewotCQlweDFbaV0gPSBwdENlbnRlci54ICsgZkxvbmdSYWRpdXMgKiAoRlhfRkxPQVQpY29zKGZBbmdlbCk7Ci0JCXB5MVtpXSA9IHB0Q2VudGVyLnkgKyBmTG9uZ1JhZGl1cyAqIChGWF9GTE9BVClzaW4oZkFuZ2VsKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgcHgxW2ldID0gcHRDZW50ZXIueCArIGZMb25nUmFkaXVzICogKEZYX0ZMT0FUKWNvcyhmQW5nZWwpOworICAgIHB5MVtpXSA9IHB0Q2VudGVyLnkgKyBmTG9uZ1JhZGl1cyAqIChGWF9GTE9BVClzaW4oZkFuZ2VsKTsKIAotCQlmQW5nZWwgKz0gUFdMX1BJICogMiAvIDUuMGY7Ci0JfQorICAgIGZBbmdlbCArPSBQV0xfUEkgKiAyIC8gNS4wZjsKKyAgfQogCi0JZkFuZ2VsID0gUFdMX1BJLzUuMGYgKyBQV0xfUEkvMTAuMGY7CisgIGZBbmdlbCA9IFBXTF9QSSAvIDUuMGYgKyBQV0xfUEkgLyAxMC4wZjsKIAotCWZvciAoaW50MzJfdCBqPTA7IGo8NTsgaisrKQotCXsKLQkJcHgyW2pdID0gcHRDZW50ZXIueCArIGZTaG9ydFJhZGl1cyAqIChGWF9GTE9BVCljb3MoZkFuZ2VsKTsKLQkJcHkyW2pdID0gcHRDZW50ZXIueSArIGZTaG9ydFJhZGl1cyAqIChGWF9GTE9BVClzaW4oZkFuZ2VsKTsKKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgNTsgaisrKSB7CisgICAgcHgyW2pdID0gcHRDZW50ZXIueCArIGZTaG9ydFJhZGl1cyAqIChGWF9GTE9BVCljb3MoZkFuZ2VsKTsKKyAgICBweTJbal0gPSBwdENlbnRlci55ICsgZlNob3J0UmFkaXVzICogKEZYX0ZMT0FUKXNpbihmQW5nZWwpOwogCi0JCWZBbmdlbCArPSBQV0xfUEkgKiAyIC8gNS4wZjsKLQl9CisgICAgZkFuZ2VsICs9IFBXTF9QSSAqIDIgLyA1LjBmOworICB9CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVsxMV07Ci0JUGF0aEFycmF5WzBdID0gQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHB4MVswXSwgcHkxWzBdKSwgUFdMUFRfTU9WRVRPKTsKLQlQYXRoQXJyYXlbMV0gPSBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQocHgyWzBdLCBweTJbMF0pLCBQV0xQVF9MSU5FVE8pOworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVsxMV07CisgIFBhdGhBcnJheVswXSA9IENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChweDFbMF0sIHB5MVswXSksIFBXTFBUX01PVkVUTyk7CisgIFBhdGhBcnJheVsxXSA9IENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChweDJbMF0sIHB5MlswXSksIFBXTFBUX0xJTkVUTyk7CiAKLQlmb3IoaW50MzJfdCBrID0gMDsgayA8IDQ7IGsrKykKLQl7Ci0JCVBhdGhBcnJheVsoaysxKSoyXSA9IENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChweDFbaysxXSwgcHkxW2srMV0pLCBQV0xQVF9MSU5FVE8pOwotCQlQYXRoQXJyYXlbKGsrMSkqMiArIDFdID0gQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHB4MltrKzFdLCBweTJbaysxXSksIFBXTFBUX0xJTkVUTyk7Ci0JfQorICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCA0OyBrKyspIHsKKyAgICBQYXRoQXJyYXlbKGsgKyAxKSAqIDJdID0KKyAgICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHB4MVtrICsgMV0sIHB5MVtrICsgMV0pLCBQV0xQVF9MSU5FVE8pOworICAgIFBhdGhBcnJheVsoayArIDEpICogMiArIDFdID0KKyAgICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHB4MltrICsgMV0sIHB5MltrICsgMV0pLCBQV0xQVF9MSU5FVE8pOworICB9CiAKLQlQYXRoQXJyYXlbMTBdID0gQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHB4MVswXSwgcHkxWzBdKSwgUFdMUFRfTElORVRPKTsKKyAgUGF0aEFycmF5WzEwXSA9IENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChweDFbMF0sIHB5MVswXSksIFBXTFBUX0xJTkVUTyk7CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMTEpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAxMSk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAxMSk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDExKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19VcEFycm93KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX1VwQXJyb3coQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0KLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8xNS4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTAuMGYsIGNyQkJveC50b3AgLSBmV2lkdGgqMy81LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNmYsIGNyQkJveC50b3AgLSBmV2lkdGgqMy81LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNmYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNGYsIGNyQkJveC50b3AgLSBmV2lkdGgqMy81LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzEwLCBjckJCb3gudG9wIC0gZldpZHRoKjMvNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8xNS4wZiksIFBXTFBUX0xJTkVUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZldpZHRoICogMyAvIDUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC42ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZldpZHRoICogMyAvIDUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC42ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmV2lkdGggKiAzIC8gNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxMCwgY3JCQm94LnRvcCAtIGZXaWR0aCAqIDMgLyA1LjBmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgOCk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDgpOworICBpZiAodHlwZSA9PSBQV0xQVF9TVFJFQU0pCisgICAgc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgOCk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDgpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX1VwTGVmdEFycm93KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Ci0JQ1BXTF9Qb2ludCBsZWZ0dXAoY3JCQm94LmxlZnQsIGNyQkJveC50b3ApOwotCUNQV0xfUG9pbnQgcmlnaHRkb3duKGNyQkJveC5yaWdodCwgY3JCQm94LmJvdHRvbSk7Ci0JRlhfRkxPQVQgayA9IC1mSGVpZ2h0L2ZXaWR0aDsKLQlDUFdMX1BvaW50IHRhaWw7Ci0JdGFpbC54ID0gY3JCQm94LmxlZnQgKyBmV2lkdGgqNC81LjBmOwotCXRhaWwueSA9IGsqKHRhaWwueCAtIGNyQkJveC5yaWdodCkgKyByaWdodGRvd24ueTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfVXBMZWZ0QXJyb3coQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CisgIENQV0xfUG9pbnQgbGVmdHVwKGNyQkJveC5sZWZ0LCBjckJCb3gudG9wKTsKKyAgQ1BXTF9Qb2ludCByaWdodGRvd24oY3JCQm94LnJpZ2h0LCBjckJCb3guYm90dG9tKTsKKyAgRlhfRkxPQVQgayA9IC1mSGVpZ2h0IC8gZldpZHRoOworICBDUFdMX1BvaW50IHRhaWw7CisgIHRhaWwueCA9IGNyQkJveC5sZWZ0ICsgZldpZHRoICogNCAvIDUuMGY7CisgIHRhaWwueSA9IGsgKiAodGFpbC54IC0gY3JCQm94LnJpZ2h0KSArIHJpZ2h0ZG93bi55OwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9Ci0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMjAuMGYsIGsqKGNyQkJveC5sZWZ0ICsgZldpZHRoLzIwLjBmIC0gcmlnaHRkb3duLngpICsgcmlnaHRkb3duLnkpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoZkhlaWdodCoxNy82MC4wZi9rICsgdGFpbC54ICsgZldpZHRoLzEwLjBmICsgZldpZHRoLzUuMGYsCi0JCSAgICAgICAgICAgICAgLWZXaWR0aC81LjBmL2sgKyB0YWlsLnkgLSBmV2lkdGgvMTAuMGYvayArIGZIZWlnaHQqMTcvNjAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoZkhlaWdodCoxNy82MC4wZi9rICsgdGFpbC54ICsgZldpZHRoLzEwLjBmLAotCQkgICAgICAgICAgICAgIHRhaWwueSAtIGZXaWR0aC8xMC4wZi9rICsgZkhlaWdodCoxNy82MC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGgvMTAuMGYsIHRhaWwueSAtIGZXaWR0aC8xMC4wZi9rKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCAtIGZXaWR0aC8xMC4wZiwgdGFpbC55ICsgZldpZHRoLzEwLjBmL2spLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoZkhlaWdodCoxNy82MC4wZi9rICsgdGFpbC54IC0gZldpZHRoLzEwLjBmLCB0YWlsLnkgKyBmV2lkdGgvMTAuMGYvayArIGZIZWlnaHQqMTcvNjAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoZkhlaWdodCoxNy82MC4wZi9rICsgdGFpbC54IC0gZldpZHRoLzEwLjBmIC0gZldpZHRoLzUuMGYsCi0JCSAgICAgICAgICAgICAgZldpZHRoLzUuMGYvayArIHRhaWwueSArIGZXaWR0aC8xMC4wZi9rICsgZkhlaWdodCoxNy82MC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yMC4wZiwgayooY3JCQm94LmxlZnQgKyBmV2lkdGgvMjAuMGYgLSByaWdodGRvd24ueCkgKyByaWdodGRvd24ueSksIFBXTFBUX0xJTkVUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KAorICAgICAgICAgICAgICBjckJCb3gubGVmdCArIGZXaWR0aCAvIDIwLjBmLAorICAgICAgICAgICAgICBrICogKGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMjAuMGYgLSByaWdodGRvd24ueCkgKyByaWdodGRvd24ueSksCisgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChmSGVpZ2h0ICogMTcgLyA2MC4wZiAvIGsgKyB0YWlsLnggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggLyAxMC4wZiArIGZXaWR0aCAvIDUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWZXaWR0aCAvIDUuMGYgLyBrICsgdGFpbC55IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoIC8gMTAuMGYgLyBrICsgZkhlaWdodCAqIDE3IC8gNjAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGZIZWlnaHQgKiAxNyAvIDYwLjBmIC8gayArIHRhaWwueCArIGZXaWR0aCAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgdGFpbC55IC0gZldpZHRoIC8gMTAuMGYgLyBrICsgZkhlaWdodCAqIDE3IC8gNjAuMGYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMTAuMGYsIHRhaWwueSAtIGZXaWR0aCAvIDEwLjBmIC8gayksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCh0YWlsLnggLSBmV2lkdGggLyAxMC4wZiwgdGFpbC55ICsgZldpZHRoIC8gMTAuMGYgLyBrKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGZIZWlnaHQgKiAxNyAvIDYwLjBmIC8gayArIHRhaWwueCAtIGZXaWR0aCAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgdGFpbC55ICsgZldpZHRoIC8gMTAuMGYgLyBrICsgZkhlaWdodCAqIDE3IC8gNjAuMGYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoZkhlaWdodCAqIDE3IC8gNjAuMGYgLyBrICsgdGFpbC54IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoIC8gMTAuMGYgLSBmV2lkdGggLyA1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAvIDUuMGYgLyBrICsgdGFpbC55ICsgZldpZHRoIC8gMTAuMGYgLyBrICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkhlaWdodCAqIDE3IC8gNjAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KAorICAgICAgICAgICAgICBjckJCb3gubGVmdCArIGZXaWR0aCAvIDIwLjBmLAorICAgICAgICAgICAgICBrICogKGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMjAuMGYgLSByaWdodGRvd24ueCkgKyByaWdodGRvd24ueSksCisgICAgICAgICAgUFdMUFRfTElORVRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgOCk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDgpOworICBpZiAodHlwZSA9PSBQV0xQVF9TVFJFQU0pCisgICAgc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgOCk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDgpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0dyYXBoKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0dyYXBoKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9Ci0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4wNWYsIGNyQkJveC50b3AgLSBmV2lkdGgqMC4xNWYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMTVmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjc1ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4wOGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4wNWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMDhmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMDVmLCBjckJCb3gudG9wIC0gZldpZHRoKjAuMTVmKSwgUFdMUFRfTElORVRPKSwKKyAgQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IHsKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMDVmLCBjckJCb3gudG9wIC0gZldpZHRoICogMC4xNWYpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMTVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMjc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMDhmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMDVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4wOGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4wNWYsIGNyQkJveC50b3AgLSBmV2lkdGggKiAwLjE1ZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKIAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yNzVmLCBjckJCb3gudG9wIC0gZldpZHRoKjAuNDVmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNDc1ZiwgY3JCQm94LnRvcCAtIGZXaWR0aCowLjQ1ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjQ3NWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMDhmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjc1ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4wOGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yNzVmLCBjckJCb3gudG9wIC0gZldpZHRoKjAuNDVmKSwgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMjc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZldpZHRoICogMC40NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40NzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmV2lkdGggKiAwLjQ1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjQ3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjA4ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjA4ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZXaWR0aCAqIDAuNDVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKIAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC41ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4wNWYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC43ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4wNWYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC43ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4wOGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC41ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4wOGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC41ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4wNWYpLCBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC41ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjA1ZiksCisgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4wNWYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4wOGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMDhmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4wNWYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCiAKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNzI1ZiwgY3JCQm94LnRvcCAtIGZXaWR0aCowLjM1ZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjkyNWYsIGNyQkJveC50b3AgLSBmV2lkdGgqMC4zNWYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC45MjVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjA4ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjcyNWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMDhmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNzI1ZiwgY3JCQm94LnRvcCAtIGZXaWR0aCowLjM1ZiksIFBXTFBUX0xJTkVUTykKLQl9OworICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC43MjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmV2lkdGggKiAwLjM1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjkyNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZXaWR0aCAqIDAuMzVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuOTI1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMDhmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNzI1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMDhmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNzI1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZldpZHRoICogMC4zNWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAyMCk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDIwKTsKKyAgaWYgKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQorICAgIHNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDIwKTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMjApOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX1BhcGVyY2xpcChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpCi17Ci0JRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19QYXBlcmNsaXAoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0KLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC82MCwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4yNWYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvNjAsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMjVmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjI1ZiAtIGZXaWR0aCo1Ny82MC4wZiowLjM1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8zMCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4yNWYgLSBmV2lkdGgqNTcvNjAuMGYqMC4zNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMzAsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMjVmKSwgUFdMUFRfQkVaSUVSVE8pLAorICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNjAsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4yNWYpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMjVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4yNWYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggKiA1NyAvIDYwLjBmICogMC4zNWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjI1ZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAqIDU3IC8gNjAuMGYgKiAwLjM1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMjVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMzAsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzNmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8zMCwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zM2YgKyBmSGVpZ2h0LzE1KjAuNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMzAgLSBmV2lkdGgqMC4xMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzNmICsgZkhlaWdodC8xNSowLjVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzMwIC0gZldpZHRoKjAuMTJmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjMzZiksIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAzMCwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjMzZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAzMCwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zM2YgKyBmSGVpZ2h0IC8gMTUgKiAwLjVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjEyZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zM2YgKyBmSGVpZ2h0IC8gMTUgKiAwLjVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzNmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMzAgLSBmV2lkdGgqMC4xMmYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMmYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzMwIC0gZldpZHRoKjAuMTJmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjJmIC0gKGZXaWR0aCo1Ny82MC4wZiAtIGZXaWR0aCowLjI0ZikqMC4yNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC82MCArIGZXaWR0aCowLjEyZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4yZiAtIChmV2lkdGgqNTcvNjAuMGYgLSBmV2lkdGgqMC4yNGYpKjAuMjVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvNjAgKyBmV2lkdGgqMC4xMmYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMmYpLCBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMmYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDMwIC0gZldpZHRoICogMC4xMmYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMmYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIChmV2lkdGggKiA1NyAvIDYwLjBmIC0gZldpZHRoICogMC4yNGYpICogMC4yNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDYwICsgZldpZHRoICogMC4xMmYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMmYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIChmV2lkdGggKiA1NyAvIDYwLjBmIC0gZldpZHRoICogMC4yNGYpICogMC4yNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDYwICsgZldpZHRoICogMC4xMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjJmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC82MCArIGZXaWR0aCowLjEyZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4yZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC82MCArIGZXaWR0aCowLjEyZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4yZiArIChmV2lkdGgqMTEvMTIuMGYgLSBmV2lkdGgqMC4zNmYpKjAuMjVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1IC0gZldpZHRoKjAuMjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjJmICsgKGZXaWR0aCoxMS8xMi4wZiAtIGZXaWR0aCowLjM2ZikqMC4yNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUgLSBmV2lkdGgqMC4yNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMmYpLCBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA2MCArIGZXaWR0aCAqIDAuMTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4yZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA2MCArIGZXaWR0aCAqIDAuMTJmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZldpZHRoICogMTEgLyAxMi4wZiAtIGZXaWR0aCAqIDAuMzZmKSAqIDAuMjVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUgLSBmV2lkdGggKiAwLjI0ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZXaWR0aCAqIDExIC8gMTIuMGYgLSBmV2lkdGggKiAwLjM2ZikgKiAwLjI1ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1IC0gZldpZHRoICogMC4yNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjJmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUgLSBmV2lkdGgqMC4yNGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMjVmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xNSAtIGZXaWR0aCowLjI0ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4yNWYgLSAoZldpZHRoKjE0LzE1LjBmIC0gZldpZHRoKjAuNTNmKSowLjI1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjlmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjI1ZiAtIChmV2lkdGgqMTQvMTUuMGYgLSBmV2lkdGgqMC41M2YpKjAuMjVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yOWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMjVmKSwgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1IC0gZldpZHRoICogMC4yNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjI1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUgLSBmV2lkdGggKiAwLjI0ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4yNWYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIChmV2lkdGggKiAxNCAvIDE1LjBmIC0gZldpZHRoICogMC41M2YpICogMC4yNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMjlmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjI1ZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZXaWR0aCAqIDE0IC8gMTUuMGYgLSBmV2lkdGggKiAwLjUzZikgKiAwLjI1ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yOWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjI1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKIAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yOWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzNmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjlmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjMzZiArIGZXaWR0aCowLjEyZiowLjM1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMTdmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjMzZiArIGZXaWR0aCowLjEyZiowLjM1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMTdmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjMzZiksIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMjlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zM2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yOWYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzNmICsgZldpZHRoICogMC4xMmYgKiAwLjM1ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4xN2YsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzNmICsgZldpZHRoICogMC4xMmYgKiAwLjM1ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4xN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjMzZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKIAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4xN2YsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4xN2YsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuM2YgLSBmV2lkdGgqKDE0LzE1LjBmIC0gMC4yOWYpKjAuMzVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1IC0gZldpZHRoKjAuMTJmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjNmIC0gZldpZHRoKigxNC8xNS4wZiAtIDAuMjlmKSowLjM1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xNSAtIGZXaWR0aCowLjEyZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4zZiksIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMTdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4zZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjE3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuM2YgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggKiAoMTQgLyAxNS4wZiAtIDAuMjlmKSAqIDAuMzVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1IC0gZldpZHRoICogMC4xMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjNmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoICogKDE0IC8gMTUuMGYgLSAwLjI5ZikgKiAwLjM1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNSAtIGZXaWR0aCAqIDAuMTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4zZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKIAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1IC0gZldpZHRoKjAuMTJmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjI1ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUgLSBmV2lkdGgqMC4xMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMjVmICsgZldpZHRoKjAuMzVmKigxMS8xMi4wZiAtIDAuMTJmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjI1ZiArIGZXaWR0aCowLjM1ZiooMTEvMTIuMGYgLSAwLjEyZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC82MCwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4yNWYpLCBQV0xQVF9CRVpJRVJUTykKLQl9OworICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1IC0gZldpZHRoICogMC4xMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjI1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUgLSBmV2lkdGggKiAwLjEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMjVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoICogMC4zNWYgKiAoMTEgLyAxMi4wZiAtIDAuMTJmKSksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4yNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggKiAwLjM1ZiAqICgxMSAvIDEyLjBmIC0gMC4xMmYpKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNjAsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4yNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMzMpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAzMyk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAzMyk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDMzKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19BdHRhY2htZW50KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0F0dGFjaG1lbnQoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0KLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjI1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4xZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjIzZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjVmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNWYgKyBmV2lkdGgqMC4wNGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjZmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjVmICsgZldpZHRoKjAuMDRmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC42ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC41ZiksIFBXTFBUX0JFWklFUlRPKSwKKyAgQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IHsKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMjVmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMWYpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMjNmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjVmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNWYgKyBmV2lkdGggKiAwLjA0ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjVmICsgZldpZHRoICogMC4wNGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjZmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKIAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC42ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4yM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuMjVmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjFmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjVmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjFmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMjNmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMjNmKSwgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4yM2YpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC4yNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjFmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMjVmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMWYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMjNmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC42ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjIzZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKIAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC41ZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjRmIC0gZldpZHRoKjAuMjVmKjAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjE1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC42NWYgKyBmSGVpZ2h0KjAuMTVmKjAuNGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjE1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC42NWYpLCBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjRmIC0gZldpZHRoICogMC4yNWYgKiAwLjRmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjE1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC42NWYgKyBmSGVpZ2h0ICogMC4xNWYgKiAwLjRmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjE1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNjVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4xNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNjVmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjE1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC42NWYgKyBmSGVpZ2h0KjAuMTVmKjAuNGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjZmICsgZldpZHRoKjAuMjVmKjAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjZmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjVmKSwgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMTVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC42NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMTVmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjY1ZiArIGZIZWlnaHQgKiAwLjE1ZiAqIDAuNGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNmYgKyBmV2lkdGggKiAwLjI1ZiAqIDAuNGYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC41ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjZmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjVmICsgZldpZHRoKjAuMDRmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC41ZiArIGZXaWR0aCowLjA0ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNWYpLCBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC41ZiArIGZXaWR0aCAqIDAuMDRmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNWYgKyBmV2lkdGggKiAwLjA0ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC41ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjVmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjY1ZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjFmKSwgUFdMUFRfTElORVRPKQotCX07CisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjVmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNjVmKSwKKyAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAyNCk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDI0KTsKKyAgaWYgKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQorICAgIHNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDI0KTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMjQpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX1RhZyhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpCi17Ci0JRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19UYWcoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0KLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjFmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNWYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4zZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4xZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4xZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4xZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4xZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4xZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjFmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuM2YpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC41ZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4yZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC41ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjdmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjJmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjdmKSwgUFdMUFRfTElORVRPKQotCX07CisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMWYpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjFmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4xZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC4xZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4xZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4xZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zZiksCisgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjJmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuM2YpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC4yZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjVmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjdmKSwKKyAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC43ZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMTIpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAxMik7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAxMik7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDEyKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19Gb3hpdChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpCi17Ci0JRlhfRkxPQVQgZk91dFdpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZk91dEhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19Gb3hpdChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZk91dFdpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZPdXRIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUNQREZfUmVjdCBjckluQm94ID0gY3JCQm94OwotCWNySW5Cb3gubGVmdCA9IGNyQkJveC5sZWZ0ICsgZk91dFdpZHRoKjAuMDhmOwotCWNySW5Cb3gucmlnaHQgPSBjckJCb3gucmlnaHQgLSBmT3V0V2lkdGgqMC4wOGY7Ci0JY3JJbkJveC50b3AgPSBjckJCb3gudG9wIC0gZk91dEhlaWdodCowLjA4ZjsKLQljckluQm94LmJvdHRvbSA9IGNyQkJveC5ib3R0b20gKyBmT3V0SGVpZ2h0KjAuMDhmOworICBDUERGX1JlY3QgY3JJbkJveCA9IGNyQkJveDsKKyAgY3JJbkJveC5sZWZ0ID0gY3JCQm94LmxlZnQgKyBmT3V0V2lkdGggKiAwLjA4ZjsKKyAgY3JJbkJveC5yaWdodCA9IGNyQkJveC5yaWdodCAtIGZPdXRXaWR0aCAqIDAuMDhmOworICBjckluQm94LnRvcCA9IGNyQkJveC50b3AgLSBmT3V0SGVpZ2h0ICogMC4wOGY7CisgIGNySW5Cb3guYm90dG9tID0gY3JCQm94LmJvdHRvbSArIGZPdXRIZWlnaHQgKiAwLjA4ZjsKIAotCUZYX0ZMT0FUIGZXaWR0aCA9IGNySW5Cb3gucmlnaHQgLSBjckluQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IGNySW5Cb3gudG9wIC0gY3JJbkJveC5ib3R0b207CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNySW5Cb3gucmlnaHQgLSBjckluQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckluQm94LnRvcCAtIGNySW5Cb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9Ci0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0LCBjckluQm94LnRvcCksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGgqMC40NWYsIGNySW5Cb3gudG9wKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCowLjQ1ZiwgY3JJbkJveC50b3AgLSBQV0xfQkVaSUVSICogZkhlaWdodCAqIDAuNGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGgqMC40NWYgIC0gUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuNDVmLCBjckluQm94LnRvcCAtIGZIZWlnaHQqMC40ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCwgY3JJbkJveC50b3AgLSBmSGVpZ2h0KjAuNGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQsIGNySW5Cb3gudG9wKSwgUFdMUFRfTElORVRPKSwKKyAgQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IHsKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQsIGNySW5Cb3gudG9wKSwgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGggKiAwLjQ1ZiwgY3JJbkJveC50b3ApLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuNDVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNySW5Cb3gudG9wIC0gUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAwLjRmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuNDVmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuNDVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNySW5Cb3gudG9wIC0gZkhlaWdodCAqIDAuNGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0LCBjckluQm94LnRvcCAtIGZIZWlnaHQgKiAwLjRmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCwgY3JJbkJveC50b3ApLCBQV0xQVF9MSU5FVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGgqMC42MGYsIGNySW5Cb3gudG9wKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCowLjc1ZiwgY3JJbkJveC50b3ApLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoKjAuNzVmLCBjckluQm94LnRvcCAtIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMC43ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCowLjc1ZiAgLSBQV0xfQkVaSUVSICogZldpZHRoICogMC43NWYsIGNySW5Cb3gudG9wIC0gZkhlaWdodCowLjdmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0LCBjckluQm94LnRvcCAtIGZIZWlnaHQqMC43ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCwgY3JJbkJveC50b3AgLSBmSGVpZ2h0KjAuNTVmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIFBXTF9CRVpJRVIgKiBmV2lkdGgqMC42MGYsIGNySW5Cb3gudG9wIC0gZkhlaWdodCowLjU1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuNjBmLCBjckluQm94LnRvcCAtIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMC41NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGggKiAwLjYwZiwgY3JJbkJveC50b3ApLCBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoICogMC42MGYsIGNySW5Cb3gudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGggKiAwLjc1ZiwgY3JJbkJveC50b3ApLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNySW5Cb3gudG9wIC0gUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAwLjdmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuNzVmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNySW5Cb3gudG9wIC0gZkhlaWdodCAqIDAuN2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0LCBjckluQm94LnRvcCAtIGZIZWlnaHQgKiAwLjdmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCwgY3JJbkJveC50b3AgLSBmSGVpZ2h0ICogMC41NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIFBXTF9CRVpJRVIgKiBmV2lkdGggKiAwLjYwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckluQm94LnRvcCAtIGZIZWlnaHQgKiAwLjU1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGggKiAwLjYwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckluQm94LnRvcCAtIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMC41NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoICogMC42MGYsIGNySW5Cb3gudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGgqMC45MGYsIGNySW5Cb3gudG9wKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCowLjkwZiwgY3JJbkJveC50b3AgLSBQV0xfQkVaSUVSICogZkhlaWdodCAqIDAuODVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoKjAuOTBmICAtIFBXTF9CRVpJRVIgKiBmV2lkdGggKiAwLjkwZiwgY3JJbkJveC50b3AgLSBmSGVpZ2h0KjAuODVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0LCBjckluQm94LnRvcCAtIGZIZWlnaHQqMC44NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQsIGNySW5Cb3guYm90dG9tKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gucmlnaHQsIGNySW5Cb3guYm90dG9tKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gucmlnaHQsIGNySW5Cb3gudG9wKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCowLjkwZiwgY3JJbkJveC50b3ApLCBQV0xQVF9MSU5FVE8pLAotCX07CisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoICogMC45MGYsIGNySW5Cb3gudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGggKiAwLjkwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckluQm94LnRvcCAtIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMC44NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoICogMC45MGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoICogMC45MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JJbkJveC50b3AgLSBmSGVpZ2h0ICogMC44NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0LCBjckluQm94LnRvcCAtIGZIZWlnaHQgKiAwLjg1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQsIGNySW5Cb3guYm90dG9tKSwgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LnJpZ2h0LCBjckluQm94LmJvdHRvbSksIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5yaWdodCwgY3JJbkJveC50b3ApLCBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuOTBmLCBjckluQm94LnRvcCksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgIH07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMjMpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAyMyk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAyMyk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDIzKTsKIH0KIAotdm9pZCBDUFdMX0NvbG9yOjpDb252ZXJ0Q29sb3JUeXBlKGludDMyX3Qgb3RoZXJfbkNvbG9yVHlwZSkKLXsKLQlzd2l0Y2ggKG90aGVyX25Db2xvclR5cGUpCi0JewotCWNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOgotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9HUkFZOgotCQlzd2l0Y2ggKG90aGVyX25Db2xvclR5cGUpCi0JCXsKLQkJY2FzZSBDT0xPUlRZUEVfUkdCOgotCQkJQ1BXTF9VdGlsczo6Q29udmVydEdSQVkyUkdCKGZDb2xvcjEsIGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09MT1JUWVBFX0NNWUs6Ci0JCQlDUFdMX1V0aWxzOjpDb252ZXJ0R1JBWTJDTVlLKGZDb2xvcjEsIGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDT0xPUlRZUEVfUkdCOgotCQlzd2l0Y2ggKG90aGVyX25Db2xvclR5cGUpCi0JCXsKLQkJY2FzZSBDT0xPUlRZUEVfR1JBWToKLQkJCUNQV0xfVXRpbHM6OkNvbnZlcnRSR0IyR1JBWShmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzLCBmQ29sb3IxKTsKLQkJCWJyZWFrOwotCQljYXNlIENPTE9SVFlQRV9DTVlLOgotCQkJQ1BXTF9VdGlsczo6Q29udmVydFJHQjJDTVlLKGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDT0xPUlRZUEVfQ01ZSzoKLQkJc3dpdGNoIChvdGhlcl9uQ29sb3JUeXBlKQotCQl7Ci0JCWNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0JCQlDUFdMX1V0aWxzOjpDb252ZXJ0Q01ZSzJHUkFZKGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjQsIGZDb2xvcjEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09MT1JUWVBFX1JHQjoKLQkJCUNQV0xfVXRpbHM6OkNvbnZlcnRDTVlLMlJHQihmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzLCBmQ29sb3I0LCBmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQluQ29sb3JUeXBlID0gb3RoZXJfbkNvbG9yVHlwZTsKK3ZvaWQgQ1BXTF9Db2xvcjo6Q29udmVydENvbG9yVHlwZShpbnQzMl90IG90aGVyX25Db2xvclR5cGUpIHsKKyAgc3dpdGNoIChvdGhlcl9uQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgorICAgICAgc3dpdGNoIChvdGhlcl9uQ29sb3JUeXBlKSB7CisgICAgICAgIGNhc2UgQ09MT1JUWVBFX1JHQjoKKyAgICAgICAgICBDUFdMX1V0aWxzOjpDb252ZXJ0R1JBWTJSR0IoZkNvbG9yMSwgZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ09MT1JUWVBFX0NNWUs6CisgICAgICAgICAgQ1BXTF9VdGlsczo6Q29udmVydEdSQVkyQ01ZSyhmQ29sb3IxLCBmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbG9yNCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTE9SVFlQRV9SR0I6CisgICAgICBzd2l0Y2ggKG90aGVyX25Db2xvclR5cGUpIHsKKyAgICAgICAgY2FzZSBDT0xPUlRZUEVfR1JBWToKKyAgICAgICAgICBDUFdMX1V0aWxzOjpDb252ZXJ0UkdCMkdSQVkoZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMywgZkNvbG9yMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ09MT1JUWVBFX0NNWUs6CisgICAgICAgICAgQ1BXTF9VdGlsczo6Q29udmVydFJHQjJDTVlLKGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjQpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUlRZUEVfQ01ZSzoKKyAgICAgIHN3aXRjaCAob3RoZXJfbkNvbG9yVHlwZSkgeworICAgICAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgorICAgICAgICAgIENQV0xfVXRpbHM6OkNvbnZlcnRDTVlLMkdSQVkoZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMywgZkNvbG9yNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb2xvcjEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENPTE9SVFlQRV9SR0I6CisgICAgICAgICAgQ1BXTF9VdGlsczo6Q29udmVydENNWUsyUkdCKGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgbkNvbG9yVHlwZSA9IG90aGVyX25Db2xvclR5cGU7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwCmluZGV4IDFiYjJmZmQuLmNlOGJjNTcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfV25kLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1duZC5jcHAKQEAgLTEzLDU0NSArMTMsNDQ5IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfVGltZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0ZDo6bWFwPGludDMyX3QsIENQV0xfVGltZXIqPiYgR2V0UFdMVGltZU1hcCgpCi17CitzdGF0aWMgc3RkOjptYXA8aW50MzJfdCwgQ1BXTF9UaW1lcio+JiBHZXRQV0xUaW1lTWFwKCkgewogICAvLyBMZWFrIHRoZSBvYmplY3QgYXQgc2h1dGRvd24uCiAgIHN0YXRpYyBhdXRvIHRpbWVNYXAgPSBuZXcgc3RkOjptYXA8aW50MzJfdCwgQ1BXTF9UaW1lcio+OwogICByZXR1cm4gKnRpbWVNYXA7CiB9CiAKLUNQV0xfVGltZXI6OkNQV0xfVGltZXIoQ1BXTF9UaW1lckhhbmRsZXIqIHBBdHRhY2hlZCwgSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKSA6Ci0gICAgbV9uVGltZXJJRCgwKSwKLSAgICBtX3BBdHRhY2hlZChwQXR0YWNoZWQpLAotICAgIG1fcFN5c3RlbUhhbmRsZXIocFN5c3RlbUhhbmRsZXIpCi17Ci0gICAgQVNTRVJUKG1fcEF0dGFjaGVkICE9IE5VTEwpOwotICAgIEFTU0VSVChtX3BTeXN0ZW1IYW5kbGVyICE9IE5VTEwpOworQ1BXTF9UaW1lcjo6Q1BXTF9UaW1lcihDUFdMX1RpbWVySGFuZGxlciogcEF0dGFjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpCisgICAgOiBtX25UaW1lcklEKDApLCBtX3BBdHRhY2hlZChwQXR0YWNoZWQpLCBtX3BTeXN0ZW1IYW5kbGVyKHBTeXN0ZW1IYW5kbGVyKSB7CisgIEFTU0VSVChtX3BBdHRhY2hlZCAhPSBOVUxMKTsKKyAgQVNTRVJUKG1fcFN5c3RlbUhhbmRsZXIgIT0gTlVMTCk7CiB9CiAKLUNQV0xfVGltZXI6On5DUFdMX1RpbWVyKCkKLXsKK0NQV0xfVGltZXI6On5DUFdMX1RpbWVyKCkgeworICBLaWxsUFdMVGltZXIoKTsKK30KKworaW50MzJfdCBDUFdMX1RpbWVyOjpTZXRQV0xUaW1lcihpbnQzMl90IG5FbGFwc2UpIHsKKyAgaWYgKG1fblRpbWVySUQgIT0gMCkKICAgICBLaWxsUFdMVGltZXIoKTsKKyAgbV9uVGltZXJJRCA9IG1fcFN5c3RlbUhhbmRsZXItPlNldFRpbWVyKG5FbGFwc2UsIFRpbWVyUHJvYyk7CisKKyAgR2V0UFdMVGltZU1hcCgpW21fblRpbWVySURdID0gdGhpczsKKyAgcmV0dXJuIG1fblRpbWVySUQ7CiB9CiAKLWludDMyX3QgQ1BXTF9UaW1lcjo6U2V0UFdMVGltZXIoaW50MzJfdCBuRWxhcHNlKQotewotICAgIGlmIChtX25UaW1lcklEICE9IDApCi0gICAgICAgIEtpbGxQV0xUaW1lcigpOwotICAgIG1fblRpbWVySUQgPSBtX3BTeXN0ZW1IYW5kbGVyLT5TZXRUaW1lcihuRWxhcHNlLCBUaW1lclByb2MpOwordm9pZCBDUFdMX1RpbWVyOjpLaWxsUFdMVGltZXIoKSB7CisgIGlmIChtX25UaW1lcklEID09IDApCisgICAgcmV0dXJuOwogCi0gICAgR2V0UFdMVGltZU1hcCgpW21fblRpbWVySURdID0gdGhpczsKLSAgICByZXR1cm4gbV9uVGltZXJJRDsKKyAgbV9wU3lzdGVtSGFuZGxlci0+S2lsbFRpbWVyKG1fblRpbWVySUQpOworICBHZXRQV0xUaW1lTWFwKCkuZXJhc2UobV9uVGltZXJJRCk7CisgIG1fblRpbWVySUQgPSAwOwogfQogCi12b2lkIENQV0xfVGltZXI6OktpbGxQV0xUaW1lcigpCi17Ci0gICAgaWYgKG1fblRpbWVySUQgPT0gMCkKLSAgICAgICAgcmV0dXJuOwordm9pZCBDUFdMX1RpbWVyOjpUaW1lclByb2MoaW50MzJfdCBpZEV2ZW50KSB7CisgIGF1dG8gaXQgPSBHZXRQV0xUaW1lTWFwKCkuZmluZChpZEV2ZW50KTsKKyAgaWYgKGl0ID09IEdldFBXTFRpbWVNYXAoKS5lbmQoKSkKKyAgICByZXR1cm47CiAKLSAgICBtX3BTeXN0ZW1IYW5kbGVyLT5LaWxsVGltZXIobV9uVGltZXJJRCk7Ci0gICAgR2V0UFdMVGltZU1hcCgpLmVyYXNlKG1fblRpbWVySUQpOwotICAgIG1fblRpbWVySUQgPSAwOwotfQotCi12b2lkIENQV0xfVGltZXI6OlRpbWVyUHJvYyhpbnQzMl90IGlkRXZlbnQpCi17Ci0gICAgYXV0byBpdCA9IEdldFBXTFRpbWVNYXAoKS5maW5kKGlkRXZlbnQpOwotICAgIGlmIChpdCA9PSBHZXRQV0xUaW1lTWFwKCkuZW5kKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIENQV0xfVGltZXIqIHBUaW1lciA9IGl0LT5zZWNvbmQ7Ci0gICAgaWYgKHBUaW1lci0+bV9wQXR0YWNoZWQpCi0gICAgICAgIHBUaW1lci0+bV9wQXR0YWNoZWQtPlRpbWVyUHJvYygpOworICBDUFdMX1RpbWVyKiBwVGltZXIgPSBpdC0+c2Vjb25kOworICBpZiAocFRpbWVyLT5tX3BBdHRhY2hlZCkKKyAgICBwVGltZXItPm1fcEF0dGFjaGVkLT5UaW1lclByb2MoKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9UaW1lckhhbmRsZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9UaW1lckhhbmRsZXI6OkNQV0xfVGltZXJIYW5kbGVyKCkgOiBtX3BUaW1lcihOVUxMKQoteworQ1BXTF9UaW1lckhhbmRsZXI6OkNQV0xfVGltZXJIYW5kbGVyKCkgOiBtX3BUaW1lcihOVUxMKSB7fQorCitDUFdMX1RpbWVySGFuZGxlcjo6fkNQV0xfVGltZXJIYW5kbGVyKCkgeworICBkZWxldGUgbV9wVGltZXI7CiB9CiAKLUNQV0xfVGltZXJIYW5kbGVyOjp+Q1BXTF9UaW1lckhhbmRsZXIoKQotewotICAgIGRlbGV0ZSBtX3BUaW1lcjsKK3ZvaWQgQ1BXTF9UaW1lckhhbmRsZXI6OkJlZ2luVGltZXIoaW50MzJfdCBuRWxhcHNlKSB7CisgIGlmICghbV9wVGltZXIpCisgICAgbV9wVGltZXIgPSBuZXcgQ1BXTF9UaW1lcih0aGlzLCBHZXRTeXN0ZW1IYW5kbGVyKCkpOworCisgIGlmIChtX3BUaW1lcikKKyAgICBtX3BUaW1lci0+U2V0UFdMVGltZXIobkVsYXBzZSk7CiB9CiAKLXZvaWQgQ1BXTF9UaW1lckhhbmRsZXI6OkJlZ2luVGltZXIoaW50MzJfdCBuRWxhcHNlKQotewotICAgIGlmICghbV9wVGltZXIpCi0gICAgICAgIG1fcFRpbWVyID0gbmV3IENQV0xfVGltZXIodGhpcywgR2V0U3lzdGVtSGFuZGxlcigpKTsKLQotICAgIGlmIChtX3BUaW1lcikKLSAgICAgICAgbV9wVGltZXItPlNldFBXTFRpbWVyKG5FbGFwc2UpOwordm9pZCBDUFdMX1RpbWVySGFuZGxlcjo6RW5kVGltZXIoKSB7CisgIGlmIChtX3BUaW1lcikKKyAgICBtX3BUaW1lci0+S2lsbFBXTFRpbWVyKCk7CiB9CiAKLXZvaWQgQ1BXTF9UaW1lckhhbmRsZXI6OkVuZFRpbWVyKCkKLXsKLSAgICBpZiAobV9wVGltZXIpCi0gICAgICAgIG1fcFRpbWVyLT5LaWxsUFdMVGltZXIoKTsKLX0KLQotdm9pZCBDUFdMX1RpbWVySGFuZGxlcjo6VGltZXJQcm9jKCkKLXsKLX0KK3ZvaWQgQ1BXTF9UaW1lckhhbmRsZXI6OlRpbWVyUHJvYygpIHt9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX01zZ0NvbnRyb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1jbGFzcyBDUFdMX01zZ0NvbnRyb2wKLXsKLSAgICBmcmllbmQgY2xhc3MgQ1BXTF9XbmQ7CitjbGFzcyBDUFdMX01zZ0NvbnRyb2wgeworICBmcmllbmQgY2xhc3MgQ1BXTF9XbmQ7CiAKLXB1YmxpYzoKLSAgICBDUFdMX01zZ0NvbnRyb2woQ1BXTF9XbmQgKiBwV25kKQotICAgIHsKLS8vICAgICAgUFdMX1RSQUNFKCJuZXcgQ1BXTF9Nc2dDb250cm9sXG4iKTsKLSAgICAgICAgbV9wQ3JlYXRlZFduZCA9IHBXbmQ7Ci0gICAgICAgIERlZmF1bHQoKTsKKyBwdWJsaWM6CisgIENQV0xfTXNnQ29udHJvbChDUFdMX1duZCogcFduZCkgeworICAgIC8vICAgICAgUFdMX1RSQUNFKCJuZXcgQ1BXTF9Nc2dDb250cm9sXG4iKTsKKyAgICBtX3BDcmVhdGVkV25kID0gcFduZDsKKyAgICBEZWZhdWx0KCk7CisgIH0KKworICB+Q1BXTF9Nc2dDb250cm9sKCkgeworICAgIC8vICAgICAgUFdMX1RSQUNFKCJ+Q1BXTF9Nc2dDb250cm9sXG4iKTsKKyAgICBEZWZhdWx0KCk7CisgIH0KKworICB2b2lkIERlZmF1bHQoKSB7CisgICAgbV9hTW91c2VQYXRoLlJlbW92ZUFsbCgpOworICAgIG1fYUtleWJvYXJkUGF0aC5SZW1vdmVBbGwoKTsKKyAgICBtX3BNYWluTW91c2VXbmQgPSBOVUxMOworICAgIG1fcE1haW5LZXlib2FyZFduZCA9IE5VTEw7CisgIH0KKworICBGWF9CT09MIElzV25kQ3JlYXRlZChjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgeworICAgIHJldHVybiBtX3BDcmVhdGVkV25kID09IHBXbmQ7CisgIH0KKworICBGWF9CT09MIElzTWFpbkNhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgeworICAgIHJldHVybiBwV25kID09IG1fcE1haW5Nb3VzZVduZDsKKyAgfQorCisgIEZYX0JPT0wgSXNXbmRDYXB0dXJlTW91c2UoY29uc3QgQ1BXTF9XbmQqIHBXbmQpIGNvbnN0IHsKKyAgICBpZiAocFduZCkKKyAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FNb3VzZVBhdGguR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICAgICAgaWYgKG1fYU1vdXNlUGF0aC5HZXRBdChpKSA9PSBwV25kKQorICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgRlhfQk9PTCBJc01haW5DYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQqIHBXbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gcFduZCA9PSBtX3BNYWluS2V5Ym9hcmRXbmQ7CisgIH0KKworICBGWF9CT09MIElzV25kQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kKiBwV25kKSBjb25zdCB7CisgICAgaWYgKHBXbmQpCisgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hS2V5Ym9hcmRQYXRoLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgICAgIGlmIChtX2FLZXlib2FyZFBhdGguR2V0QXQoaSkgPT0gcFduZCkKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHZvaWQgU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpIHsKKyAgICBtX2FLZXlib2FyZFBhdGguUmVtb3ZlQWxsKCk7CisKKyAgICBpZiAocFduZCkgeworICAgICAgbV9wTWFpbktleWJvYXJkV25kID0gcFduZDsKKworICAgICAgQ1BXTF9XbmQqIHBQYXJlbnQgPSBwV25kOworICAgICAgd2hpbGUgKHBQYXJlbnQpIHsKKyAgICAgICAgbV9hS2V5Ym9hcmRQYXRoLkFkZChwUGFyZW50KTsKKyAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpOworICAgICAgfQorCisgICAgICBwV25kLT5PblNldEZvY3VzKCk7CiAgICAgfQorICB9CiAKLSAgICB+Q1BXTF9Nc2dDb250cm9sKCkKLSAgICB7Ci0vLyAgICAgIFBXTF9UUkFDRSgifkNQV0xfTXNnQ29udHJvbFxuIik7Ci0gICAgICAgIERlZmF1bHQoKTsKKyAgdm9pZCBLaWxsRm9jdXMoKSB7CisgICAgaWYgKG1fYUtleWJvYXJkUGF0aC5HZXRTaXplKCkgPiAwKQorICAgICAgaWYgKENQV0xfV25kKiBwV25kID0gbV9hS2V5Ym9hcmRQYXRoLkdldEF0KDApKQorICAgICAgICBwV25kLT5PbktpbGxGb2N1cygpOworCisgICAgbV9wTWFpbktleWJvYXJkV25kID0gTlVMTDsKKyAgICBtX2FLZXlib2FyZFBhdGguUmVtb3ZlQWxsKCk7CisgIH0KKworICB2b2lkIFNldENhcHR1cmUoQ1BXTF9XbmQqIHBXbmQpIHsKKyAgICBtX2FNb3VzZVBhdGguUmVtb3ZlQWxsKCk7CisKKyAgICBpZiAocFduZCkgeworICAgICAgbV9wTWFpbk1vdXNlV25kID0gcFduZDsKKworICAgICAgQ1BXTF9XbmQqIHBQYXJlbnQgPSBwV25kOworICAgICAgd2hpbGUgKHBQYXJlbnQpIHsKKyAgICAgICAgbV9hTW91c2VQYXRoLkFkZChwUGFyZW50KTsKKyAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpOworICAgICAgfQogICAgIH0KKyAgfQogCi0gICAgdm9pZCBEZWZhdWx0KCkKLSAgICB7Ci0gICAgICAgIG1fYU1vdXNlUGF0aC5SZW1vdmVBbGwoKTsKLSAgICAgICAgbV9hS2V5Ym9hcmRQYXRoLlJlbW92ZUFsbCgpOwotICAgICAgICBtX3BNYWluTW91c2VXbmQgPSBOVUxMOwotICAgICAgICBtX3BNYWluS2V5Ym9hcmRXbmQgPSBOVUxMOwotICAgIH0KKyAgdm9pZCBSZWxlYXNlQ2FwdHVyZSgpIHsKKyAgICBtX3BNYWluTW91c2VXbmQgPSBOVUxMOworICAgIG1fYU1vdXNlUGF0aC5SZW1vdmVBbGwoKTsKKyAgfQogCi0gICAgRlhfQk9PTCBJc1duZENyZWF0ZWQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcENyZWF0ZWRXbmQgPT0gcFduZDsKLSAgICB9Ci0KLSAgICBGWF9CT09MIElzTWFpbkNhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gcFduZCA9PSBtX3BNYWluTW91c2VXbmQ7Ci0gICAgfQotCi0gICAgRlhfQk9PTCBJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAocFduZCkKLSAgICAgICAgICAgIGZvciggaW50MzJfdCBpPTAsc3o9bV9hTW91c2VQYXRoLkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChtX2FNb3VzZVBhdGguR2V0QXQoaSkgPT0gcFduZCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIEZYX0JPT0wgSXNNYWluQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBwV25kID09IG1fcE1haW5LZXlib2FyZFduZDsKLSAgICB9Ci0KLQotICAgIEZYX0JPT0wgSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKHBXbmQpCi0gICAgICAgICAgICBmb3IoIGludDMyX3QgaT0wLHN6PW1fYUtleWJvYXJkUGF0aC5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAobV9hS2V5Ym9hcmRQYXRoLkdldEF0KGkpID09IHBXbmQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICB2b2lkIFNldEZvY3VzKENQV0xfV25kICogcFduZCkKLSAgICB7Ci0gICAgICAgIG1fYUtleWJvYXJkUGF0aC5SZW1vdmVBbGwoKTsKLQotICAgICAgICBpZiAocFduZCkKLSAgICAgICAgewotICAgICAgICAgICAgbV9wTWFpbktleWJvYXJkV25kID0gcFduZDsKLQotICAgICAgICAgICAgQ1BXTF9XbmQgKiBwUGFyZW50ID0gcFduZDsKLSAgICAgICAgICAgIHdoaWxlIChwUGFyZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fYUtleWJvYXJkUGF0aC5BZGQocFBhcmVudCk7Ci0gICAgICAgICAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwV25kLT5PblNldEZvY3VzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIEtpbGxGb2N1cygpCi0gICAgewotICAgICAgICBpZiAobV9hS2V5Ym9hcmRQYXRoLkdldFNpemUoKSA+IDApCi0gICAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBtX2FLZXlib2FyZFBhdGguR2V0QXQoMCkpCi0gICAgICAgICAgICAgICAgcFduZC0+T25LaWxsRm9jdXMoKTsKLQotICAgICAgICBtX3BNYWluS2V5Ym9hcmRXbmQgPSBOVUxMOwotICAgICAgICBtX2FLZXlib2FyZFBhdGguUmVtb3ZlQWxsKCk7Ci0gICAgfQotCi0gICAgdm9pZCBTZXRDYXB0dXJlKENQV0xfV25kICogcFduZCkKLSAgICB7Ci0gICAgICAgIG1fYU1vdXNlUGF0aC5SZW1vdmVBbGwoKTsKLQotICAgICAgICBpZiAocFduZCkKLSAgICAgICAgewotICAgICAgICAgICAgbV9wTWFpbk1vdXNlV25kID0gcFduZDsKLQotICAgICAgICAgICAgQ1BXTF9XbmQgKiBwUGFyZW50ID0gcFduZDsKLSAgICAgICAgICAgIHdoaWxlIChwUGFyZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fYU1vdXNlUGF0aC5BZGQocFBhcmVudCk7Ci0gICAgICAgICAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBSZWxlYXNlQ2FwdHVyZSgpCi0gICAgewotICAgICAgICBtX3BNYWluTW91c2VXbmQgPSBOVUxMOwotICAgICAgICBtX2FNb3VzZVBhdGguUmVtb3ZlQWxsKCk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIENGWF9BcnJheVRlbXBsYXRlPENQV0xfV25kKj4gICAgbV9hTW91c2VQYXRoOwotICAgIENGWF9BcnJheVRlbXBsYXRlPENQV0xfV25kKj4gICAgbV9hS2V5Ym9hcmRQYXRoOwotICAgIENQV0xfV25kKiAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3JlYXRlZFduZDsKLSAgICBDUFdMX1duZCogICAgICAgICAgICAgICAgICAgICAgIG1fcE1haW5Nb3VzZVduZDsKLSAgICBDUFdMX1duZCogICAgICAgICAgICAgICAgICAgICAgIG1fcE1haW5LZXlib2FyZFduZDsKKyBwcml2YXRlOgorICBDRlhfQXJyYXlUZW1wbGF0ZTxDUFdMX1duZCo+IG1fYU1vdXNlUGF0aDsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BXTF9XbmQqPiBtX2FLZXlib2FyZFBhdGg7CisgIENQV0xfV25kKiBtX3BDcmVhdGVkV25kOworICBDUFdMX1duZCogbV9wTWFpbk1vdXNlV25kOworICBDUFdMX1duZCogbV9wTWFpbktleWJvYXJkV25kOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfV25kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9XbmQ6OkNQV0xfV25kKCkgOgotICAgIG1fcFZTY3JvbGxCYXIoTlVMTCksCi0gICAgbV9yY1dpbmRvdygpLAotICAgIG1fcmNDbGlwKCksCi0gICAgbV9iQ3JlYXRlZChGQUxTRSksCi0gICAgbV9iVmlzaWJsZShGQUxTRSksCi0gICAgbV9iTm90aWZ5aW5nKEZBTFNFKSwKLSAgICBtX2JFbmFibGVkKFRSVUUpCi17CitDUFdMX1duZDo6Q1BXTF9XbmQoKQorICAgIDogbV9wVlNjcm9sbEJhcihOVUxMKSwKKyAgICAgIG1fcmNXaW5kb3coKSwKKyAgICAgIG1fcmNDbGlwKCksCisgICAgICBtX2JDcmVhdGVkKEZBTFNFKSwKKyAgICAgIG1fYlZpc2libGUoRkFMU0UpLAorICAgICAgbV9iTm90aWZ5aW5nKEZBTFNFKSwKKyAgICAgIG1fYkVuYWJsZWQoVFJVRSkge30KKworQ1BXTF9XbmQ6On5DUFdMX1duZCgpIHsKKyAgQVNTRVJUKG1fYkNyZWF0ZWQgPT0gRkFMU0UpOwogfQogCi1DUFdMX1duZDo6fkNQV0xfV25kKCkKLXsKLSAgICBBU1NFUlQobV9iQ3JlYXRlZCA9PSBGQUxTRSk7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1duZDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfV25kIjsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9XbmQ6OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJDUFdMX1duZCI7Cit2b2lkIENQV0xfV25kOjpDcmVhdGUoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBpZiAoIUlzVmFsaWQoKSkgeworICAgIG1fc1ByaXZhdGVQYXJhbSA9IGNwOworCisgICAgT25DcmVhdGUobV9zUHJpdmF0ZVBhcmFtKTsKKworICAgIG1fc1ByaXZhdGVQYXJhbS5yY1JlY3RXbmQuTm9ybWFsaXplKCk7CisgICAgbV9yY1dpbmRvdyA9IG1fc1ByaXZhdGVQYXJhbS5yY1JlY3RXbmQ7CisgICAgbV9yY0NsaXAgPSBDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChtX3JjV2luZG93LCAxLjBmKTsKKworICAgIENyZWF0ZU1zZ0NvbnRyb2woKTsKKworICAgIGlmIChtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZCkKKyAgICAgIG1fc1ByaXZhdGVQYXJhbS5wUGFyZW50V25kLT5Pbk5vdGlmeSh0aGlzLCBQTk1fQUREQ0hJTEQpOworCisgICAgUFdMX0NSRUFURVBBUkFNIGNjcCA9IG1fc1ByaXZhdGVQYXJhbTsKKworICAgIGNjcC5kd0ZsYWdzICY9IDB4RkZGRjAwMDBMOyAgLy8gcmVtb3ZlIHN1YiBzdHlsZXMKKyAgICBjY3AubXRDaGlsZCA9IENQREZfTWF0cml4KDEsIDAsIDAsIDEsIDAsIDApOworCisgICAgQ3JlYXRlU2Nyb2xsQmFyKGNjcCk7CisgICAgQ3JlYXRlQ2hpbGRXbmQoY2NwKTsKKworICAgIG1fYlZpc2libGUgPSBIYXNGbGFnKFBXU19WSVNJQkxFKTsKKworICAgIE9uQ3JlYXRlZCgpOworCisgICAgUmVQb3NDaGlsZFduZCgpOworICAgIG1fYkNyZWF0ZWQgPSBUUlVFOworICB9CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZShjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLSAgICBpZiAoIUlzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIG1fc1ByaXZhdGVQYXJhbSA9IGNwOwordm9pZCBDUFdMX1duZDo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCkge30KIAotICAgICAgICBPbkNyZWF0ZShtX3NQcml2YXRlUGFyYW0pOwordm9pZCBDUFdMX1duZDo6T25DcmVhdGVkKCkge30KIAotICAgICAgICBtX3NQcml2YXRlUGFyYW0ucmNSZWN0V25kLk5vcm1hbGl6ZSgpOwotICAgICAgICBtX3JjV2luZG93ID0gbV9zUHJpdmF0ZVBhcmFtLnJjUmVjdFduZDsKLSAgICAgICAgbV9yY0NsaXAgPSBDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChtX3JjV2luZG93LDEuMGYpOwordm9pZCBDUFdMX1duZDo6T25EZXN0cm95KCkge30KIAotICAgICAgICBDcmVhdGVNc2dDb250cm9sKCk7Cit2b2lkIENQV0xfV25kOjpEZXN0cm95KCkgeworICBLaWxsRm9jdXMoKTsKIAotICAgICAgICBpZiAobV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQpCi0gICAgICAgICAgICBtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZC0+T25Ob3RpZnkodGhpcywgUE5NX0FERENISUxEKTsKKyAgT25EZXN0cm95KCk7CiAKLSAgICAgICAgUFdMX0NSRUFURVBBUkFNIGNjcCA9IG1fc1ByaXZhdGVQYXJhbTsKKyAgaWYgKG1fYkNyZWF0ZWQpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IG1fYUNoaWxkcmVuLkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuW2ldKSB7CisgICAgICAgIHBDaGlsZC0+RGVzdHJveSgpOworICAgICAgICBkZWxldGUgcENoaWxkOworICAgICAgICBwQ2hpbGQgPSBOVUxMOworICAgICAgfQorICAgIH0KIAotICAgICAgICBjY3AuZHdGbGFncyAmPSAweEZGRkYwMDAwTDsgLy9yZW1vdmUgc3ViIHN0eWxlcwotICAgICAgICBjY3AubXRDaGlsZCA9IENQREZfTWF0cml4KDEsMCwwLDEsMCwwKTsKKyAgICBpZiAobV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQpCisgICAgICBtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZC0+T25Ob3RpZnkodGhpcywgUE5NX1JFTU9WRUNISUxEKTsKKyAgICBtX2JDcmVhdGVkID0gRkFMU0U7CisgIH0KIAotICAgICAgICBDcmVhdGVTY3JvbGxCYXIoY2NwKTsKLSAgICAgICAgQ3JlYXRlQ2hpbGRXbmQoY2NwKTsKKyAgRGVzdHJveU1zZ0NvbnRyb2woKTsKIAotICAgICAgICBtX2JWaXNpYmxlID0gSGFzRmxhZyhQV1NfVklTSUJMRSk7CisgIEZYU1lTX21lbXNldCgmbV9zUHJpdmF0ZVBhcmFtLCAwLCBzaXplb2YoUFdMX0NSRUFURVBBUkFNKSk7CisgIG1fYUNoaWxkcmVuLlJlbW92ZUFsbCgpOworICBtX3BWU2Nyb2xsQmFyID0gTlVMTDsKK30KIAotICAgICAgICBPbkNyZWF0ZWQoKTsKK3ZvaWQgQ1BXTF9XbmQ6Ok1vdmUoY29uc3QgQ1BERl9SZWN0JiByY05ldywgRlhfQk9PTCBiUmVzZXQsIEZYX0JPT0wgYlJlZnJlc2gpIHsKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIENQREZfUmVjdCByY09sZCA9IEdldFdpbmRvd1JlY3QoKTsKIAorICAgIG1fcmNXaW5kb3cgPSByY05ldzsKKyAgICBtX3JjV2luZG93Lk5vcm1hbGl6ZSgpOworCisgICAgaWYgKHJjT2xkLmxlZnQgIT0gcmNOZXcubGVmdCB8fCByY09sZC5yaWdodCAhPSByY05ldy5yaWdodCB8fAorICAgICAgICByY09sZC50b3AgIT0gcmNOZXcudG9wIHx8IHJjT2xkLmJvdHRvbSAhPSByY05ldy5ib3R0b20pIHsKKyAgICAgIGlmIChiUmVzZXQpIHsKICAgICAgICAgUmVQb3NDaGlsZFduZCgpOwotICAgICAgICBtX2JDcmVhdGVkID0gVFJVRTsKKyAgICAgIH0KICAgICB9Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6Ok9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotfQotCi12b2lkIENQV0xfV25kOjpPbkNyZWF0ZWQoKQotewotfQotCi12b2lkIENQV0xfV25kOjpPbkRlc3Ryb3koKQotewotfQotCi12b2lkIENQV0xfV25kOjpEZXN0cm95KCkKLXsKLSAgICBLaWxsRm9jdXMoKTsKLQotICAgIE9uRGVzdHJveSgpOwotCi0gICAgaWYgKG1fYkNyZWF0ZWQpCi0gICAgewotICAgICAgICBmb3IgKGludDMyX3QgaSA9IG1fYUNoaWxkcmVuLkdldFNpemUoKS0xOyBpID49IDA7IGkgLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuW2ldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDaGlsZC0+RGVzdHJveSgpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBwQ2hpbGQ7Ci0gICAgICAgICAgICAgICAgcENoaWxkID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZCkKLSAgICAgICAgICAgIG1fc1ByaXZhdGVQYXJhbS5wUGFyZW50V25kLT5Pbk5vdGlmeSh0aGlzLCBQTk1fUkVNT1ZFQ0hJTEQpOwotICAgICAgICBtX2JDcmVhdGVkID0gRkFMU0U7CisgICAgaWYgKGJSZWZyZXNoKSB7CisgICAgICBJbnZhbGlkYXRlUmVjdE1vdmUocmNPbGQsIHJjTmV3KTsKICAgICB9CiAKLSAgICBEZXN0cm95TXNnQ29udHJvbCgpOwotCi0gICAgRlhTWVNfbWVtc2V0KCZtX3NQcml2YXRlUGFyYW0sIDAsIHNpemVvZihQV0xfQ1JFQVRFUEFSQU0pKTsKLSAgICBtX2FDaGlsZHJlbi5SZW1vdmVBbGwoKTsKLSAgICBtX3BWU2Nyb2xsQmFyID0gTlVMTDsKKyAgICBtX3NQcml2YXRlUGFyYW0ucmNSZWN0V25kID0gbV9yY1dpbmRvdzsKKyAgfQogfQogCi12b2lkIENQV0xfV25kOjpNb3ZlKGNvbnN0IENQREZfUmVjdCAmIHJjTmV3LCBGWF9CT09MIGJSZXNldCxGWF9CT09MIGJSZWZyZXNoKQotewotICAgIGlmIChJc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBDUERGX1JlY3QgcmNPbGQgPSBHZXRXaW5kb3dSZWN0KCk7Cit2b2lkIENQV0xfV25kOjpJbnZhbGlkYXRlUmVjdE1vdmUoY29uc3QgQ1BERl9SZWN0JiByY09sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjTmV3KSB7CisgIENQREZfUmVjdCByY1VuaW9uID0gcmNPbGQ7CisgIHJjVW5pb24uVW5pb24ocmNOZXcpOwogCi0gICAgICAgIG1fcmNXaW5kb3cgPSByY05ldzsKLSAgICAgICAgbV9yY1dpbmRvdy5Ob3JtYWxpemUoKTsKKyAgSW52YWxpZGF0ZVJlY3QoJnJjVW5pb24pOworfQogCi0gICAgICAgIGlmIChyY09sZC5sZWZ0ICE9IHJjTmV3LmxlZnQgfHwgcmNPbGQucmlnaHQgIT0gcmNOZXcucmlnaHQgfHwKLSAgICAgICAgICAgIHJjT2xkLnRvcCAhPSByY05ldy50b3AgfHwgcmNPbGQuYm90dG9tICE9IHJjTmV3LmJvdHRvbSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJSZXNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZVBvc0NoaWxkV25kKCk7Ci0gICAgICAgICAgICB9Cit2b2lkIENQV0xfV25kOjpHZXRBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlU3RyaW5nJiBzQXBwU3RyZWFtKSB7CisgIGlmIChJc1ZhbGlkKCkpIHsKKyAgICBDRlhfQnl0ZVRleHRCdWYgc1RleHRCdWY7CisgICAgR2V0QXBwZWFyYW5jZVN0cmVhbShzVGV4dEJ1Zik7CisgICAgc0FwcFN0cmVhbSArPSBzVGV4dEJ1Zi5HZXRCeXRlU3RyaW5nKCk7CisgIH0KK30KIAotICAgICAgICB9Ci0gICAgICAgIGlmIChiUmVmcmVzaCkKLSAgICAgICAgewotICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3RNb3ZlKHJjT2xkLHJjTmV3KTsKLSAgICAgICAgfQordm9pZCBDUFdMX1duZDo6R2V0QXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKKyAgaWYgKElzVmFsaWQoKSAmJiBJc1Zpc2libGUoKSkgeworICAgIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOworICAgIEdldENoaWxkQXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKKyAgfQorfQogCi0gICAgICAgIG1fc1ByaXZhdGVQYXJhbS5yY1JlY3RXbmQgPSBtX3JjV2luZG93OworLy8gaWYgZG9uJ3Qgc2V0LEdldCBkZWZhdWx0IGFwcGVyYW5jZSBzdHJlYW0KK3ZvaWQgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgeworICBDUERGX1JlY3QgcmVjdFduZCA9IEdldFdpbmRvd1JlY3QoKTsKKyAgaWYgKCFyZWN0V25kLklzRW1wdHkoKSkgeworICAgIENGWF9CeXRlVGV4dEJ1ZiBzVGhpczsKKworICAgIGlmIChIYXNGbGFnKFBXU19CQUNLR1JPVU5EKSkKKyAgICAgIHNUaGlzIDw8IENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJlY3RXbmQsIEdldEJhY2tncm91bmRDb2xvcigpKTsKKworICAgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKSB7CisgICAgICBzVGhpcyA8PCBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0oCisgICAgICAgICAgcmVjdFduZCwgKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCksIEdldEJvcmRlckNvbG9yKCksCisgICAgICAgICAgR2V0Qm9yZGVyTGVmdFRvcENvbG9yKEdldEJvcmRlclN0eWxlKCkpLAorICAgICAgICAgIEdldEJvcmRlclJpZ2h0Qm90dG9tQ29sb3IoR2V0Qm9yZGVyU3R5bGUoKSksIEdldEJvcmRlclN0eWxlKCksCisgICAgICAgICAgR2V0Qm9yZGVyRGFzaCgpKTsKICAgICB9CisKKyAgICBzQXBwU3RyZWFtIDw8IHNUaGlzOworICB9CiB9CiAKLXZvaWQgIENQV0xfV25kOjpJbnZhbGlkYXRlUmVjdE1vdmUoY29uc3QgQ1BERl9SZWN0ICYgcmNPbGQsIGNvbnN0IENQREZfUmVjdCAmIHJjTmV3KQotewotICAgIENQREZfUmVjdCByY1VuaW9uID0gcmNPbGQ7Ci0gICAgcmNVbmlvbi5VbmlvbihyY05ldyk7Ci0KLSAgICBJbnZhbGlkYXRlUmVjdCgmcmNVbmlvbik7Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OkdldEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVTdHJpbmcgJiBzQXBwU3RyZWFtKQotewotICAgIGlmIChJc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBDRlhfQnl0ZVRleHRCdWYgc1RleHRCdWY7Ci0gICAgICAgIEdldEFwcGVhcmFuY2VTdHJlYW0oc1RleHRCdWYpOwotICAgICAgICBzQXBwU3RyZWFtICs9IHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKTsKK3ZvaWQgQ1BXTF9XbmQ6OkdldENoaWxkQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICBwQ2hpbGQtPkdldEFwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7CiAgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkdldEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLSAgICBpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpKQotICAgIHsKLSAgICAgICAgR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7Ci0gICAgICAgIEdldENoaWxkQXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKK3ZvaWQgQ1BXTF9XbmQ6OkRyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkpIHsKKyAgICBEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKKyAgICBEcmF3Q2hpbGRBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7CisgIH0KK30KKwordm9pZCBDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBDUERGX1JlY3QgcmVjdFduZCA9IEdldFdpbmRvd1JlY3QoKTsKKyAgaWYgKCFyZWN0V25kLklzRW1wdHkoKSkgeworICAgIGlmIChIYXNGbGFnKFBXU19CQUNLR1JPVU5EKSkgeworICAgICAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoCisgICAgICAgICAgcmVjdFduZCwgKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpICsgR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7CisgICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCYWNrZ3JvdW5kQ29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpOwogICAgIH0KKworICAgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKQorICAgICAgQ1BXTF9VdGlsczo6RHJhd0JvcmRlcigKKyAgICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJlY3RXbmQsIChGWF9GTE9BVClHZXRCb3JkZXJXaWR0aCgpLAorICAgICAgICAgIEdldEJvcmRlckNvbG9yKCksIEdldEJvcmRlckxlZnRUb3BDb2xvcihHZXRCb3JkZXJTdHlsZSgpKSwKKyAgICAgICAgICBHZXRCb3JkZXJSaWdodEJvdHRvbUNvbG9yKEdldEJvcmRlclN0eWxlKCkpLCBHZXRCb3JkZXJTdHlsZSgpLAorICAgICAgICAgIEdldEJvcmRlckRhc2goKSwgR2V0VHJhbnNwYXJlbmN5KCkpOworICB9CiB9CiAKLS8vaWYgZG9uJ3Qgc2V0LEdldCBkZWZhdWx0IGFwcGVyYW5jZSBzdHJlYW0KLXZvaWQgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pCi17Ci0gICAgQ1BERl9SZWN0IHJlY3RXbmQgPSBHZXRXaW5kb3dSZWN0KCk7Ci0gICAgaWYgKCFyZWN0V25kLklzRW1wdHkoKSkgewotICAgICAgICBDRlhfQnl0ZVRleHRCdWYgc1RoaXM7Ci0KLSAgICAgICAgaWYgKEhhc0ZsYWcoUFdTX0JBQ0tHUk9VTkQpKQotICAgICAgICAgICAgc1RoaXMgPDwgQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0ocmVjdFduZCwgR2V0QmFja2dyb3VuZENvbG9yKCkpOwotCi0gICAgICAgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKSB7Ci0gICAgICAgICAgICBzVGhpcyA8PCBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0oCi0gICAgICAgICAgICAgICAgcmVjdFduZCwKLSAgICAgICAgICAgICAgICAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKSwKLSAgICAgICAgICAgICAgICBHZXRCb3JkZXJDb2xvcigpLAotICAgICAgICAgICAgICAgIEdldEJvcmRlckxlZnRUb3BDb2xvcihHZXRCb3JkZXJTdHlsZSgpKSwKLSAgICAgICAgICAgICAgICBHZXRCb3JkZXJSaWdodEJvdHRvbUNvbG9yKEdldEJvcmRlclN0eWxlKCkpLAotICAgICAgICAgICAgICAgIEdldEJvcmRlclN0eWxlKCksCi0gICAgICAgICAgICAgICAgR2V0Qm9yZGVyRGFzaCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNBcHBTdHJlYW0gPDwgc1RoaXM7Cit2b2lkIENQV0xfV25kOjpEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICBDUERGX01hdHJpeCBtdCA9IHBDaGlsZC0+R2V0Q2hpbGRNYXRyaXgoKTsKKyAgICAgIGlmIChtdC5Jc0lkZW50aXR5KCkpIHsKKyAgICAgICAgcENoaWxkLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOworICAgICAgICBwQ2hpbGQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsICZtdCk7CisgICAgICB9CiAgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkdldENoaWxkQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKQotewotICAgIGZvciAoaW50MzJfdCBpPTAsc3o9bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgICBpZiAoQ1BXTF9XbmQgKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcENoaWxkLT5HZXRBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOwotICAgICAgICB9Cit2b2lkIENQV0xfV25kOjpJbnZhbGlkYXRlUmVjdChDUERGX1JlY3QqIHBSZWN0KSB7CisgIGlmIChJc1ZhbGlkKCkpIHsKKyAgICBDUERGX1JlY3QgcmNSZWZyZXNoID0gcFJlY3QgPyAqcFJlY3QgOiBHZXRXaW5kb3dSZWN0KCk7CisKKyAgICBpZiAoIUhhc0ZsYWcoUFdTX05PUkVGUkVTSENMSVApKSB7CisgICAgICBDUERGX1JlY3QgcmNDbGlwID0gR2V0Q2xpcFJlY3QoKTsKKyAgICAgIGlmICghcmNDbGlwLklzRW1wdHkoKSkgeworICAgICAgICByY1JlZnJlc2guSW50ZXJzZWN0KHJjQ2xpcCk7CisgICAgICB9CiAgICAgfQotfQogCi12b2lkIENQV0xfV25kOjpEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotICAgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkpCi0gICAgewotICAgICAgICBEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSxwVXNlcjJEZXZpY2UpOwotICAgICAgICBEcmF3Q2hpbGRBcHBlYXJhbmNlKHBEZXZpY2UscFVzZXIyRGV2aWNlKTsKKyAgICBGWF9SRUNUIHJjV2luID0gUFdMdG9XbmQocmNSZWZyZXNoKTsKKyAgICByY1dpbi5sZWZ0IC09IFBXTF9JTlZBTElEQVRFX0lORkxBVEU7CisgICAgcmNXaW4udG9wIC09IFBXTF9JTlZBTElEQVRFX0lORkxBVEU7CisgICAgcmNXaW4ucmlnaHQgKz0gUFdMX0lOVkFMSURBVEVfSU5GTEFURTsKKyAgICByY1dpbi5ib3R0b20gKz0gUFdMX0lOVkFMSURBVEVfSU5GTEFURTsKKworICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKSB7CisgICAgICBpZiAoRlhfSFdORCBoV25kID0gR2V0QXR0YWNoZWRIV25kKCkpIHsKKyAgICAgICAgcFNILT5JbnZhbGlkYXRlUmVjdChoV25kLCByY1dpbik7CisgICAgICB9CiAgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotICAgIENQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOwotICAgIGlmICghcmVjdFduZC5Jc0VtcHR5KCkpCi0gICAgewotICAgICAgICBpZiAoSGFzRmxhZyhQV1NfQkFDS0dST1VORCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENQREZfUmVjdCByY0NsaWVudCA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpK0dldElubmVyQm9yZGVyV2lkdGgoKSkpOwotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UscFVzZXIyRGV2aWNlLHJjQ2xpZW50LCBHZXRCYWNrZ3JvdW5kQ29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpOwotICAgICAgICB9CisjZGVmaW5lIFBXTF9JTVBMRU1FTlRfS0VZX01FVEhPRChrZXlfbWV0aG9kX25hbWUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlhfQk9PTCBDUFdMX1duZDo6a2V5X21ldGhvZF9uYW1lKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKSB7ICAgXAorICAgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgSXNFbmFibGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoSXNXbmRDYXB0dXJlS2V5Ym9hcmQodGhpcykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsgXAorICAgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoSXNXbmRDYXB0dXJlS2V5Ym9hcmQocENoaWxkKSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgcmV0dXJuIHBDaGlsZC0+a2V5X21ldGhvZF9uYW1lKG5DaGFyLCBuRmxhZyk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKLSAgICAgICAgaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCi0gICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3Qm9yZGVyKHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdFduZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJvcmRlckNvbG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJvcmRlckxlZnRUb3BDb2xvcihHZXRCb3JkZXJTdHlsZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qm9yZGVyUmlnaHRCb3R0b21Db2xvcihHZXRCb3JkZXJTdHlsZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qm9yZGVyU3R5bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qm9yZGVyRGFzaCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUcmFuc3BhcmVuY3koKSk7Ci0gICAgfQotfQotCi12b2lkIENQV0xfV25kOjpEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCi17Ci0gICAgZm9yIChpbnQzMl90IGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUERGX01hdHJpeCBtdCA9IHBDaGlsZC0+R2V0Q2hpbGRNYXRyaXgoKTsKLSAgICAgICAgICAgIGlmIChtdC5Jc0lkZW50aXR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENoaWxkLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLHBVc2VyMkRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOwotICAgICAgICAgICAgICAgIHBDaGlsZC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwmbXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENQV0xfV25kOjpJbnZhbGlkYXRlUmVjdChDUERGX1JlY3QqIHBSZWN0KQotewotICAgIGlmIChJc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBDUERGX1JlY3QgcmNSZWZyZXNoID0gcFJlY3QgPyAqcFJlY3QgOiBHZXRXaW5kb3dSZWN0KCk7Ci0KLSAgICAgICAgaWYgKCFIYXNGbGFnKFBXU19OT1JFRlJFU0hDTElQKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ1BERl9SZWN0IHJjQ2xpcCA9IEdldENsaXBSZWN0KCk7Ci0gICAgICAgICAgICBpZiAoIXJjQ2xpcC5Jc0VtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmNSZWZyZXNoLkludGVyc2VjdChyY0NsaXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRlhfUkVDVCByY1dpbiA9IFBXTHRvV25kKHJjUmVmcmVzaCk7Ci0gICAgICAgIHJjV2luLmxlZnQgLT0gUFdMX0lOVkFMSURBVEVfSU5GTEFURTsKLSAgICAgICAgcmNXaW4udG9wIC09IFBXTF9JTlZBTElEQVRFX0lORkxBVEU7Ci0gICAgICAgIHJjV2luLnJpZ2h0ICs9IFBXTF9JTlZBTElEQVRFX0lORkxBVEU7Ci0gICAgICAgIHJjV2luLmJvdHRvbSArPSBQV0xfSU5WQUxJREFURV9JTkZMQVRFOwotCi0gICAgICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoRlhfSFdORCBoV25kID0gR2V0QXR0YWNoZWRIV25kKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNILT5JbnZhbGlkYXRlUmVjdChoV25kLCByY1dpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSNkZWZpbmUgUFdMX0lNUExFTUVOVF9LRVlfTUVUSE9EKGtleV9tZXRob2RfbmFtZSlcCi1GWF9CT09MIENQV0xfV25kOjprZXlfbWV0aG9kX25hbWUoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpXAote1wKLSAgICBpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIElzRW5hYmxlZCgpKVwKLSAgICB7XAotICAgICAgICBpZiAoSXNXbmRDYXB0dXJlS2V5Ym9hcmQodGhpcykpXAotICAgICAgICB7XAotICAgICAgICAgICAgZm9yIChpbnQzMl90IGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKylcCi0gICAgICAgICAgICB7XAotICAgICAgICAgICAgICAgIGlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKVwKLSAgICAgICAgICAgICAgICB7XAotICAgICAgICAgICAgICAgICAgICBpZiAoSXNXbmRDYXB0dXJlS2V5Ym9hcmQocENoaWxkKSlcCi0gICAgICAgICAgICAgICAgICAgIHtcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcENoaWxkLT5rZXlfbWV0aG9kX25hbWUobkNoYXIsbkZsYWcpO1wKLSAgICAgICAgICAgICAgICAgICAgfVwKLSAgICAgICAgICAgICAgICB9XAotICAgICAgICAgICAgfVwKLSAgICAgICAgfVwKLSAgICB9XAotICAgIHJldHVybiBGQUxTRTtcCi19Ci0KLSNkZWZpbmUgUFdMX0lNUExFTUVOVF9NT1VTRV9NRVRIT0QobW91c2VfbWV0aG9kX25hbWUpXAotRlhfQk9PTCBDUFdMX1duZDo6bW91c2VfbWV0aG9kX25hbWUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZylcCi17XAotICAgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgSXNFbmFibGVkKCkpXAotICAgIHtcCi0gICAgICAgIGlmIChJc1duZENhcHR1cmVNb3VzZSh0aGlzKSlcCi0gICAgICAgIHtcCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaT0wLHN6PW1fYUNoaWxkcmVuLkdldFNpemUoKTsgaTxzejsgaSsrKVwKLSAgICAgICAgICAgIHtcCi0gICAgICAgICAgICAgICAgaWYgKENQV0xfV25kICogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpXAotICAgICAgICAgICAgICAgIHtcCi0gICAgICAgICAgICAgICAgICAgIGlmIChJc1duZENhcHR1cmVNb3VzZShwQ2hpbGQpKVwKLSAgICAgICAgICAgICAgICAgICAge1wKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQ2hpbGQtPm1vdXNlX21ldGhvZF9uYW1lKHBDaGlsZC0+UGFyZW50VG9DaGlsZChwb2ludCksbkZsYWcpO1wKLSAgICAgICAgICAgICAgICAgICAgfVwKLSAgICAgICAgICAgICAgICB9XAotICAgICAgICAgICAgfVwKLSAgICAgICAgICAgIFNldEN1cnNvcigpO1wKLSAgICAgICAgfVwKLSAgICAgICAgZWxzZVwKLSAgICAgICAge1wKLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpPTAsc3o9bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpPHN6OyBpKyspXAotICAgICAgICAgICAge1wKLSAgICAgICAgICAgICAgICBpZiAoQ1BXTF9XbmQgKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSlcCi0gICAgICAgICAgICAgICAge1wKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDaGlsZC0+V25kSGl0VGVzdChwQ2hpbGQtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSlcCi0gICAgICAgICAgICAgICAgICAgIHtcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcENoaWxkLT5tb3VzZV9tZXRob2RfbmFtZShwQ2hpbGQtPlBhcmVudFRvQ2hpbGQocG9pbnQpLG5GbGFnKTtcCi0gICAgICAgICAgICAgICAgICAgIH1cCi0gICAgICAgICAgICAgICAgfVwKLSAgICAgICAgICAgIH1cCi0gICAgICAgICAgICBpZiAoV25kSGl0VGVzdChwb2ludCkpXAotICAgICAgICAgICAgICAgIFNldEN1cnNvcigpO1wKLSAgICAgICAgfVwKLSAgICB9XAotICAgIHJldHVybiBGQUxTRTtcCi19CisjZGVmaW5lIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKG1vdXNlX21ldGhvZF9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlhfQk9PTCBDUFdMX1duZDo6bW91c2VfbWV0aG9kX25hbWUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKElzVmFsaWQoKSAmJiBJc1Zpc2libGUoKSAmJiBJc0VuYWJsZWQoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChJc1duZENhcHR1cmVNb3VzZSh0aGlzKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeyAgICAgICBcCisgICAgICAgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChJc1duZENhcHR1cmVNb3VzZShwQ2hpbGQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICByZXR1cm4gcENoaWxkLT5tb3VzZV9tZXRob2RfbmFtZShwQ2hpbGQtPlBhcmVudFRvQ2hpbGQocG9pbnQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5GbGFnKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU2V0Q3Vyc29yKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7ICAgICAgIFwKKyAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHBDaGlsZC0+V25kSGl0VGVzdChwQ2hpbGQtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgeyAgICAgICAgICBcCisgICAgICAgICAgICAgIHJldHVybiBwQ2hpbGQtPm1vdXNlX21ldGhvZF9uYW1lKHBDaGlsZC0+UGFyZW50VG9DaGlsZChwb2ludCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkZsYWcpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoV25kSGl0VGVzdChwb2ludCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgU2V0Q3Vyc29yKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCiBQV0xfSU1QTEVNRU5UX0tFWV9NRVRIT0QoT25LZXlEb3duKQogUFdMX0lNUExFTUVOVF9LRVlfTUVUSE9EKE9uS2V5VXApCkBAIC01NjgsNzI2ICs0NzIsNjEwIEBACiBQV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChPblJCdXR0b25VcCkKIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTW91c2VNb3ZlKQogCi1GWF9CT09MIENQV0xfV25kOjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotICAgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgSXNFbmFibGVkKCkpCi0gICAgewotICAgICAgICBTZXRDdXJzb3IoKTsKLSAgICAgICAgaWYgKElzV25kQ2FwdHVyZUtleWJvYXJkKHRoaXMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludDMyX3QgaT0wLHN6PW1fYUNoaWxkcmVuLkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKElzV25kQ2FwdHVyZUtleWJvYXJkKHBDaGlsZCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQ2hpbGQtPk9uTW91c2VXaGVlbCh6RGVsdGEscENoaWxkLT5QYXJlbnRUb0NoaWxkKHBvaW50KSwgbkZsYWcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorRlhfQk9PTCBDUFdMX1duZDo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIElzRW5hYmxlZCgpKSB7CisgICAgU2V0Q3Vyc29yKCk7CisgICAgaWYgKElzV25kQ2FwdHVyZUtleWJvYXJkKHRoaXMpKSB7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICAgICAgaWYgKElzV25kQ2FwdHVyZUtleWJvYXJkKHBDaGlsZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBwQ2hpbGQtPk9uTW91c2VXaGVlbCh6RGVsdGEsIHBDaGlsZC0+UGFyZW50VG9DaGlsZChwb2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkZsYWcpOworICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQV0xfV25kOjpBZGRDaGlsZChDUFdMX1duZCAqIHBXbmQpCi17Ci0gICAgbV9hQ2hpbGRyZW4uQWRkKHBXbmQpOwordm9pZCBDUFdMX1duZDo6QWRkQ2hpbGQoQ1BXTF9XbmQqIHBXbmQpIHsKKyAgbV9hQ2hpbGRyZW4uQWRkKHBXbmQpOwogfQogCi12b2lkIENQV0xfV25kOjpSZW1vdmVDaGlsZChDUFdMX1duZCAqIHBXbmQpCi17Ci0gICAgZm9yIChpbnQzMl90IGkgPSBtX2FDaGlsZHJlbi5HZXRTaXplKCktMTsgaSA+PSAwOyBpIC0tKQotICAgIHsKLSAgICAgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBDaGlsZCA9PSBwV25kKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fYUNoaWxkcmVuLlJlbW92ZUF0KGkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Cit2b2lkIENQV0xfV25kOjpSZW1vdmVDaGlsZChDUFdMX1duZCogcFduZCkgeworICBmb3IgKGludDMyX3QgaSA9IG1fYUNoaWxkcmVuLkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeworICAgICAgaWYgKHBDaGlsZCA9PSBwV25kKSB7CisgICAgICAgIG1fYUNoaWxkcmVuLlJlbW92ZUF0KGkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9CisgIH0KIH0KIAotdm9pZCBDUFdMX1duZDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgaW50cHRyX3Qgd1BhcmFtLCBpbnRwdHJfdCBsUGFyYW0pCi17Ci0gICAgc3dpdGNoIChtc2cpCi0gICAgewordm9pZCBDUFdMX1duZDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0pIHsKKyAgc3dpdGNoIChtc2cpIHsKICAgICBjYXNlIFBOTV9BRERDSElMRDoKLSAgICAgICAgQWRkQ2hpbGQocFduZCk7Ci0gICAgICAgIGJyZWFrOworICAgICAgQWRkQ2hpbGQocFduZCk7CisgICAgICBicmVhazsKICAgICBjYXNlIFBOTV9SRU1PVkVDSElMRDoKLSAgICAgICAgUmVtb3ZlQ2hpbGQocFduZCk7Ci0gICAgICAgIGJyZWFrOworICAgICAgUmVtb3ZlQ2hpbGQocFduZCk7CisgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzVmFsaWQoKSBjb25zdCB7CisgIHJldHVybiBtX2JDcmVhdGVkOworfQorCitQV0xfQ1JFQVRFUEFSQU0gQ1BXTF9XbmQ6OkdldENyZWF0aW9uUGFyYW0oKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW07Cit9CisKK0NQV0xfV25kKiBDUFdMX1duZDo6R2V0UGFyZW50V2luZG93KCkgY29uc3QgeworICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQ7Cit9CisKK0NQREZfUmVjdCBDUFdMX1duZDo6R2V0T3JpZ2luV2luZG93UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5yY1JlY3RXbmQ7Cit9CisKK0NQREZfUmVjdCBDUFdMX1duZDo6R2V0V2luZG93UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcmNXaW5kb3c7Cit9CisKK0NQREZfUmVjdCBDUFdMX1duZDo6R2V0Q2xpZW50UmVjdCgpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0V2luZG93UmVjdCgpOworICBDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdCgKKyAgICAgIHJjV2luZG93LCAoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkgKyBHZXRJbm5lckJvcmRlcldpZHRoKCkpKTsKKyAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwVlNCID0gR2V0VlNjcm9sbEJhcigpKQorICAgIHJjQ2xpZW50LnJpZ2h0IC09IHBWU0ItPkdldFNjcm9sbEJhcldpZHRoKCk7CisKKyAgcmNDbGllbnQuTm9ybWFsaXplKCk7CisgIHJldHVybiByY1dpbmRvdy5Db250YWlucyhyY0NsaWVudCkgPyByY0NsaWVudCA6IENQREZfUmVjdCgpOworfQorCitDUERGX1BvaW50IENQV0xfV25kOjpHZXRDZW50ZXJQb2ludCgpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICByZXR1cm4gQ1BERl9Qb2ludCgocmNDbGllbnQubGVmdCArIHJjQ2xpZW50LnJpZ2h0KSAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgIChyY0NsaWVudC50b3AgKyByY0NsaWVudC5ib3R0b20pICogMC41Zik7Cit9CisKK0NQREZfUmVjdCBDUFdMX1duZDo6R2V0Q2xpZW50Q2VudGVyU3F1YXJlKCkgY29uc3QgeworICByZXR1cm4gQ1BXTF9VdGlsczo6R2V0Q2VudGVyU3F1YXJlKEdldENsaWVudFJlY3QoKSk7Cit9CisKK0NQREZfUmVjdCBDUFdMX1duZDo6R2V0V2luZG93Q2VudGVyU3F1YXJlKCkgY29uc3QgeworICByZXR1cm4gQ1BXTF9VdGlsczo6R2V0Q2VudGVyU3F1YXJlKAorICAgICAgQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoR2V0V2luZG93UmVjdCgpLCAwLjFmKSk7Cit9CisKK0ZYX0JPT0wgQ1BXTF9XbmQ6Okhhc0ZsYWcoRlhfRFdPUkQgZHdGbGFncykgY29uc3QgeworICByZXR1cm4gKG1fc1ByaXZhdGVQYXJhbS5kd0ZsYWdzICYgZHdGbGFncykgIT0gMDsKK30KKwordm9pZCBDUFdMX1duZDo6UmVtb3ZlRmxhZyhGWF9EV09SRCBkd0ZsYWdzKSB7CisgIG1fc1ByaXZhdGVQYXJhbS5kd0ZsYWdzICY9IH5kd0ZsYWdzOworfQorCit2b2lkIENQV0xfV25kOjpBZGRGbGFnKEZYX0RXT1JEIGR3RmxhZ3MpIHsKKyAgbV9zUHJpdmF0ZVBhcmFtLmR3RmxhZ3MgfD0gZHdGbGFnczsKK30KKworQ1BXTF9Db2xvciBDUFdMX1duZDo6R2V0QmFja2dyb3VuZENvbG9yKCkgY29uc3QgeworICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnNCYWNrZ3JvdW5kQ29sb3I7Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OlNldEJhY2tncm91bmRDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgeworICBtX3NQcml2YXRlUGFyYW0uc0JhY2tncm91bmRDb2xvciA9IGNvbG9yOworfQorCit2b2lkIENQV0xfV25kOjpTZXRUZXh0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgbV9zUHJpdmF0ZVBhcmFtLnNUZXh0Q29sb3IgPSBjb2xvcjsKK30KKwordm9pZCBDUFdMX1duZDo6U2V0VGV4dFN0cm9rZUNvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIG1fc1ByaXZhdGVQYXJhbS5zVGV4dFN0cm9rZUNvbG9yID0gY29sb3I7Cit9CisKK0NQV0xfQ29sb3IgQ1BXTF9XbmQ6OkdldFRleHRDb2xvcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5zVGV4dENvbG9yOworfQorCitDUFdMX0NvbG9yIENQV0xfV25kOjpHZXRUZXh0U3Ryb2tlQ29sb3IoKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0uc1RleHRTdHJva2VDb2xvcjsKK30KKworaW50MzJfdCBDUFdMX1duZDo6R2V0Qm9yZGVyU3R5bGUoKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ubkJvcmRlclN0eWxlOworfQorCit2b2lkIENQV0xfV25kOjpTZXRCb3JkZXJTdHlsZShpbnQzMl90IG5Cb3JkZXJTdHlsZSkgeworICBpZiAoSGFzRmxhZyhQV1NfQk9SREVSKSkKKyAgICBtX3NQcml2YXRlUGFyYW0ubkJvcmRlclN0eWxlID0gbkJvcmRlclN0eWxlOworfQorCitpbnQzMl90IENQV0xfV25kOjpHZXRCb3JkZXJXaWR0aCgpIGNvbnN0IHsKKyAgaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCisgICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5kd0JvcmRlcldpZHRoOworCisgIHJldHVybiAwOworfQorCitpbnQzMl90IENQV0xfV25kOjpHZXRJbm5lckJvcmRlcldpZHRoKCkgY29uc3QgeworICAvKgorICBzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpCisgIHsKKyAgY2FzZSBQQlNfQkVWRUxFRDoKKyAgY2FzZSBQQlNfSU5TRVQ6CisgICAgICByZXR1cm4gR2V0Qm9yZGVyV2lkdGgoKSAvIDI7CisgIH0KKyAgKi8KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OlNldEJvcmRlcldpZHRoKGludDMyX3QgbkJvcmRlcldpZHRoKSB7CisgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKQorICAgIG1fc1ByaXZhdGVQYXJhbS5kd0JvcmRlcldpZHRoID0gbkJvcmRlcldpZHRoOworfQorCitDUFdMX0NvbG9yIENQV0xfV25kOjpHZXRCb3JkZXJDb2xvcigpIGNvbnN0IHsKKyAgaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCisgICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5zQm9yZGVyQ29sb3I7CisKKyAgcmV0dXJuIENQV0xfQ29sb3IoKTsKK30KKwordm9pZCBDUFdMX1duZDo6U2V0Qm9yZGVyQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCisgICAgbV9zUHJpdmF0ZVBhcmFtLnNCb3JkZXJDb2xvciA9IGNvbG9yOworfQorCitDUFdMX0Rhc2ggQ1BXTF9XbmQ6OkdldEJvcmRlckRhc2goKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0uc0Rhc2g7Cit9CisKK3ZvaWQqIENQV0xfV25kOjpHZXRBdHRhY2hlZERhdGEoKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ucEF0dGFjaGVkRGF0YTsKK30KKwordm9pZCBDUFdMX1duZDo6U2V0Qm9yZGVyRGFzaChjb25zdCBDUFdMX0Rhc2gmIHNEYXNoKSB7CisgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKQorICAgIG1fc1ByaXZhdGVQYXJhbS5zRGFzaCA9IHNEYXNoOworfQorCitDUFdMX1Njcm9sbEJhciogQ1BXTF9XbmQ6OkdldFZTY3JvbGxCYXIoKSBjb25zdCB7CisgIGlmIChIYXNGbGFnKFBXU19WU0NST0xMKSkKKyAgICByZXR1cm4gbV9wVlNjcm9sbEJhcjsKKworICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBDUFdMX1duZDo6Q3JlYXRlU2Nyb2xsQmFyKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgQ3JlYXRlVlNjcm9sbEJhcihjcCk7Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZVZTY3JvbGxCYXIoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBpZiAoIW1fcFZTY3JvbGxCYXIgJiYgSGFzRmxhZyhQV1NfVlNDUk9MTCkpIHsKKyAgICBQV0xfQ1JFQVRFUEFSQU0gc2NwID0gY3A7CisKKyAgICAvLyBmbGFncworICAgIHNjcC5kd0ZsYWdzID0KKyAgICAgICAgUFdTX0NISUxEIHwgUFdTX0JBQ0tHUk9VTkQgfCBQV1NfQVVUT1RSQU5TUEFSRU5UIHwgUFdTX05PUkVGUkVTSENMSVA7CisKKyAgICBzY3AucFBhcmVudFduZCA9IHRoaXM7CisgICAgc2NwLnNCYWNrZ3JvdW5kQ29sb3IgPSBQV0xfREVGQVVMVF9XSElURUNPTE9SOworICAgIHNjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7CisgICAgc2NwLm5UcmFuc3BhcmVuY3kgPSBQV0xfU0NST0xMQkFSX1RSQU5TUEFSQU5DWTsKKworICAgIGlmICgobV9wVlNjcm9sbEJhciA9IG5ldyBDUFdMX1Njcm9sbEJhcihTQlRfVlNDUk9MTCkpKQorICAgICAgbV9wVlNjcm9sbEJhci0+Q3JlYXRlKHNjcCk7CisgIH0KK30KKwordm9pZCBDUFdMX1duZDo6U2V0Q2FwdHVyZSgpIHsKKyAgaWYgKENQV0xfTXNnQ29udHJvbCogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCkpCisgICAgcE1zZ0N0cmwtPlNldENhcHR1cmUodGhpcyk7Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OlJlbGVhc2VDYXB0dXJlKCkgeworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQorICAgICAgcENoaWxkLT5SZWxlYXNlQ2FwdHVyZSgpOworCisgIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBNc2dDdHJsID0gR2V0TXNnQ29udHJvbCgpKQorICAgIHBNc2dDdHJsLT5SZWxlYXNlQ2FwdHVyZSgpOworfQorCit2b2lkIENQV0xfV25kOjpTZXRGb2N1cygpIHsKKyAgaWYgKENQV0xfTXNnQ29udHJvbCogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCkpIHsKKyAgICBpZiAoIXBNc2dDdHJsLT5Jc01haW5DYXB0dXJlS2V5Ym9hcmQodGhpcykpCisgICAgICBwTXNnQ3RybC0+S2lsbEZvY3VzKCk7CisgICAgcE1zZ0N0cmwtPlNldEZvY3VzKHRoaXMpOworICB9Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OktpbGxGb2N1cygpIHsKKyAgaWYgKENQV0xfTXNnQ29udHJvbCogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCkpIHsKKyAgICBpZiAocE1zZ0N0cmwtPklzV25kQ2FwdHVyZUtleWJvYXJkKHRoaXMpKQorICAgICAgcE1zZ0N0cmwtPktpbGxGb2N1cygpOworICB9Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6Ok9uU2V0Rm9jdXMoKSB7fQorCit2b2lkIENQV0xfV25kOjpPbktpbGxGb2N1cygpIHt9CisKK0ZYX0JPT0wgQ1BXTF9XbmQ6OlduZEhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgcmV0dXJuIElzVmFsaWQoKSAmJiBJc1Zpc2libGUoKSAmJiBHZXRXaW5kb3dSZWN0KCkuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSk7Cit9CisKK0ZYX0JPT0wgQ1BXTF9XbmQ6OkNsaWVudEhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgcmV0dXJuIElzVmFsaWQoKSAmJiBJc1Zpc2libGUoKSAmJiBHZXRDbGllbnRSZWN0KCkuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSk7Cit9CisKK2NvbnN0IENQV0xfV25kKiBDUFdMX1duZDo6R2V0Um9vdFduZCgpIGNvbnN0IHsKKyAgaWYgKG1fc1ByaXZhdGVQYXJhbS5wUGFyZW50V25kKQorICAgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZC0+R2V0Um9vdFduZCgpOworCisgIHJldHVybiB0aGlzOworfQorCit2b2lkIENQV0xfV25kOjpTZXRWaXNpYmxlKEZYX0JPT0wgYlZpc2libGUpIHsKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICAgIHBDaGlsZC0+U2V0VmlzaWJsZShiVmlzaWJsZSk7CisgICAgICB9CiAgICAgfQorCisgICAgaWYgKGJWaXNpYmxlICE9IG1fYlZpc2libGUpIHsKKyAgICAgIG1fYlZpc2libGUgPSBiVmlzaWJsZTsKKyAgICAgIFJlUG9zQ2hpbGRXbmQoKTsKKyAgICAgIEludmFsaWRhdGVSZWN0KCk7CisgICAgfQorICB9CiB9CiAKLUZYX0JPT0wgQ1BXTF9XbmQ6OklzVmFsaWQoKSBjb25zdAotewotICAgIHJldHVybiBtX2JDcmVhdGVkOwordm9pZCBDUFdMX1duZDo6U2V0Q2xpcFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7CisgIG1fcmNDbGlwID0gcmVjdDsKKyAgbV9yY0NsaXAuTm9ybWFsaXplKCk7CiB9CiAKLVBXTF9DUkVBVEVQQVJBTSBDUFdMX1duZDo6R2V0Q3JlYXRpb25QYXJhbSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbTsKK0NQREZfUmVjdCBDUFdMX1duZDo6R2V0Q2xpcFJlY3QoKSBjb25zdCB7CisgIHJldHVybiBtX3JjQ2xpcDsKIH0KIAotQ1BXTF9XbmQqIENQV0xfV25kOjpHZXRQYXJlbnRXaW5kb3coKSBjb25zdAotewotICAgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZDsKK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzUmVhZE9ubHkoKSBjb25zdCB7CisgIHJldHVybiBIYXNGbGFnKFBXU19SRUFET05MWSk7CiB9CiAKLUNQREZfUmVjdCBDUFdMX1duZDo6R2V0T3JpZ2luV2luZG93UmVjdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5yY1JlY3RXbmQ7Cit2b2lkIENQV0xfV25kOjpSZVBvc0NoaWxkV25kKCkgeworICBDUERGX1JlY3QgcmNDb250ZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoCisgICAgICBHZXRXaW5kb3dSZWN0KCksIChGWF9GTE9BVCkoR2V0Qm9yZGVyV2lkdGgoKSArIEdldElubmVyQm9yZGVyV2lkdGgoKSkpOworCisgIENQV0xfU2Nyb2xsQmFyKiBwVlNCID0gR2V0VlNjcm9sbEJhcigpOworCisgIENQREZfUmVjdCByY1ZTY3JvbGwgPQorICAgICAgQ1BERl9SZWN0KHJjQ29udGVudC5yaWdodCAtIFBXTF9TQ1JPTExCQVJfV0lEVEgsIHJjQ29udGVudC5ib3R0b20sCisgICAgICAgICAgICAgICAgcmNDb250ZW50LnJpZ2h0IC0gMS4wZiwgcmNDb250ZW50LnRvcCk7CisKKyAgaWYgKHBWU0IpCisgICAgcFZTQi0+TW92ZShyY1ZTY3JvbGwsIFRSVUUsIEZBTFNFKTsKIH0KIAotQ1BERl9SZWN0IENQV0xfV25kOjpHZXRXaW5kb3dSZWN0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9yY1dpbmRvdzsKK3ZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHt9CisKK3ZvaWQgQ1BXTF9XbmQ6OlNldEN1cnNvcigpIHsKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKSB7CisgICAgICBpbnQzMl90IG5DdXJzb3JUeXBlID0gR2V0Q3JlYXRpb25QYXJhbSgpLmVDdXJzb3JUeXBlOworICAgICAgcFNILT5TZXRDdXJzb3IobkN1cnNvclR5cGUpOworICAgIH0KKyAgfQogfQogCi1DUERGX1JlY3QgQ1BXTF9XbmQ6OkdldENsaWVudFJlY3QoKSBjb25zdAotewotICAgIENQREZfUmVjdCByY1dpbmRvdyA9IEdldFdpbmRvd1JlY3QoKTsKLSAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyY1dpbmRvdywoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkrR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7Ci0gICAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwVlNCID0gR2V0VlNjcm9sbEJhcigpKQotICAgICAgICByY0NsaWVudC5yaWdodCAtPSBwVlNCLT5HZXRTY3JvbGxCYXJXaWR0aCgpOwotCi0gICAgcmNDbGllbnQuTm9ybWFsaXplKCk7Ci0gICAgcmV0dXJuIHJjV2luZG93LkNvbnRhaW5zKHJjQ2xpZW50KSA/IHJjQ2xpZW50IDogQ1BERl9SZWN0KCk7Cit2b2lkIENQV0xfV25kOjpDcmVhdGVNc2dDb250cm9sKCkgeworICBpZiAoIW1fc1ByaXZhdGVQYXJhbS5wTXNnQ29udHJvbCkKKyAgICBtX3NQcml2YXRlUGFyYW0ucE1zZ0NvbnRyb2wgPSBuZXcgQ1BXTF9Nc2dDb250cm9sKHRoaXMpOwogfQogCi1DUERGX1BvaW50IENQV0xfV25kOjpHZXRDZW50ZXJQb2ludCgpIGNvbnN0Ci17Ci0gICAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotICAgIHJldHVybiBDUERGX1BvaW50KChyY0NsaWVudC5sZWZ0ICsgcmNDbGllbnQucmlnaHQpICogMC41ZiwKLSAgICAgICAgICAgICAgICAgICAgICAocmNDbGllbnQudG9wICsgcmNDbGllbnQuYm90dG9tKSAqIDAuNWYpOwordm9pZCBDUFdMX1duZDo6RGVzdHJveU1zZ0NvbnRyb2woKSB7CisgIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBNc2dDb250cm9sID0gR2V0TXNnQ29udHJvbCgpKQorICAgIGlmIChwTXNnQ29udHJvbC0+SXNXbmRDcmVhdGVkKHRoaXMpKQorICAgICAgZGVsZXRlIHBNc2dDb250cm9sOwogfQogCi1DUERGX1JlY3QgQ1BXTF9XbmQ6OkdldENsaWVudENlbnRlclNxdWFyZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENQV0xfVXRpbHM6OkdldENlbnRlclNxdWFyZShHZXRDbGllbnRSZWN0KCkpOworQ1BXTF9Nc2dDb250cm9sKiBDUFdMX1duZDo6R2V0TXNnQ29udHJvbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wTXNnQ29udHJvbDsKIH0KIAotQ1BERl9SZWN0IENQV0xfV25kOjpHZXRXaW5kb3dDZW50ZXJTcXVhcmUoKSBjb25zdAotewotICAgIHJldHVybiBDUFdMX1V0aWxzOjpHZXRDZW50ZXJTcXVhcmUoQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoR2V0V2luZG93UmVjdCgpLDAuMWYpKTsKK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzQ2FwdHVyZU1vdXNlKCkgY29uc3QgeworICByZXR1cm4gSXNXbmRDYXB0dXJlTW91c2UodGhpcyk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9XbmQ6Okhhc0ZsYWcoRlhfRFdPUkQgZHdGbGFncykgY29uc3QKLXsKLSAgICByZXR1cm4gKG1fc1ByaXZhdGVQYXJhbS5kd0ZsYWdzICYgZHdGbGFncykgIT0gMDsKK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kKiBwV25kKSBjb25zdCB7CisgIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBDdHJsID0gR2V0TXNnQ29udHJvbCgpKQorICAgIHJldHVybiBwQ3RybC0+SXNXbmRDYXB0dXJlTW91c2UocFduZCk7CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQV0xfV25kOjpSZW1vdmVGbGFnKEZYX0RXT1JEIGR3RmxhZ3MpCi17Ci0gICAgbV9zUHJpdmF0ZVBhcmFtLmR3RmxhZ3MgJj0gfmR3RmxhZ3M7CitGWF9CT09MIENQV0xfV25kOjpJc1duZENhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgeworICBpZiAoQ1BXTF9Nc2dDb250cm9sKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKKyAgICByZXR1cm4gcEN0cmwtPklzV25kQ2FwdHVyZUtleWJvYXJkKHBXbmQpOworCisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDUFdMX1duZDo6QWRkRmxhZyhGWF9EV09SRCBkd0ZsYWdzKQotewotICAgIG1fc1ByaXZhdGVQYXJhbS5kd0ZsYWdzIHw9IGR3RmxhZ3M7CitGWF9CT09MIENQV0xfV25kOjpJc0ZvY3VzZWQoKSBjb25zdCB7CisgIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBDdHJsID0gR2V0TXNnQ29udHJvbCgpKQorICAgIHJldHVybiBwQ3RybC0+SXNNYWluQ2FwdHVyZUtleWJvYXJkKHRoaXMpOworCisgIHJldHVybiBGQUxTRTsKIH0KIAotQ1BXTF9Db2xvciBDUFdMX1duZDo6R2V0QmFja2dyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnNCYWNrZ3JvdW5kQ29sb3I7CitDUERGX1JlY3QgQ1BXTF9XbmQ6OkdldEZvY3VzUmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwgMSk7CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OlNldEJhY2tncm91bmRDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpCi17Ci0gICAgbV9zUHJpdmF0ZVBhcmFtLnNCYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjsKK0ZYX0ZMT0FUIENQV0xfV25kOjpHZXRGb250U2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5mRm9udFNpemU7CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OlNldFRleHRDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpCi17Ci0gICAgbV9zUHJpdmF0ZVBhcmFtLnNUZXh0Q29sb3IgPSBjb2xvcjsKK3ZvaWQgQ1BXTF9XbmQ6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICBtX3NQcml2YXRlUGFyYW0uZkZvbnRTaXplID0gZkZvbnRTaXplOwogfQogCi12b2lkIENQV0xfV25kOjpTZXRUZXh0U3Ryb2tlQ29sb3IoY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yKQotewotICAgIG1fc1ByaXZhdGVQYXJhbS5zVGV4dFN0cm9rZUNvbG9yID0gY29sb3I7CitJRlhfU3lzdGVtSGFuZGxlciogQ1BXTF9XbmQ6OkdldFN5c3RlbUhhbmRsZXIoKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ucFN5c3RlbUhhbmRsZXI7CiB9CiAKLUNQV0xfQ29sb3IgQ1BXTF9XbmQ6OkdldFRleHRDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5zVGV4dENvbG9yOworSVBXTF9Gb2N1c0hhbmRsZXIqIENQV0xfV25kOjpHZXRGb2N1c0hhbmRsZXIoKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ucEZvY3VzSGFuZGxlcjsKIH0KIAotQ1BXTF9Db2xvciBDUFdMX1duZDo6R2V0VGV4dFN0cm9rZUNvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnNUZXh0U3Ryb2tlQ29sb3I7CitJUFdMX1Byb3ZpZGVyKiBDUFdMX1duZDo6R2V0UHJvdmlkZXIoKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ucFByb3ZpZGVyOwogfQogCi1pbnQzMl90IENQV0xfV25kOjpHZXRCb3JkZXJTdHlsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5uQm9yZGVyU3R5bGU7CitJRlhfRWRpdF9Gb250TWFwKiBDUFdMX1duZDo6R2V0Rm9udE1hcCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wRm9udE1hcDsKIH0KIAotdm9pZCBDUFdMX1duZDo6U2V0Qm9yZGVyU3R5bGUoaW50MzJfdCBuQm9yZGVyU3R5bGUpCi17Ci0gICAgaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCi0gICAgICAgIG1fc1ByaXZhdGVQYXJhbS5uQm9yZGVyU3R5bGUgPSBuQm9yZGVyU3R5bGU7Ci19CitDUFdMX0NvbG9yIENQV0xfV25kOjpHZXRCb3JkZXJMZWZ0VG9wQ29sb3IoaW50MzJfdCBuQm9yZGVyU3R5bGUpIGNvbnN0IHsKKyAgQ1BXTF9Db2xvciBjb2xvcjsKIAotaW50MzJfdCBDUFdMX1duZDo6R2V0Qm9yZGVyV2lkdGgoKSBjb25zdAotewotICAgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKQotICAgICAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLmR3Qm9yZGVyV2lkdGg7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50MzJfdCBDUFdMX1duZDo6R2V0SW5uZXJCb3JkZXJXaWR0aCgpIGNvbnN0Ci17Ci0gICAgLyoKLSAgICBzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpCi0gICAgeworICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgeworICAgIGNhc2UgUEJTX1NPTElEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBQQlNfREFTSDoKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgUEJTX0JFVkVMRUQ6CisgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBQQlNfSU5TRVQ6Ci0gICAgICAgIHJldHVybiBHZXRCb3JkZXJXaWR0aCgpIC8gMjsKLSAgICB9Ci0gICAgKi8KLSAgICByZXR1cm4gMDsKKyAgICAgIGNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC41Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBCU19VTkRFUkxJTkVEOgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gY29sb3I7CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OlNldEJvcmRlcldpZHRoKGludDMyX3QgbkJvcmRlcldpZHRoKQotewotICAgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKQotICAgICAgICBtX3NQcml2YXRlUGFyYW0uZHdCb3JkZXJXaWR0aCA9IG5Cb3JkZXJXaWR0aDsKLX0KK0NQV0xfQ29sb3IgQ1BXTF9XbmQ6OkdldEJvcmRlclJpZ2h0Qm90dG9tQ29sb3IoaW50MzJfdCBuQm9yZGVyU3R5bGUpIGNvbnN0IHsKKyAgQ1BXTF9Db2xvciBjb2xvcjsKIAotQ1BXTF9Db2xvciBDUFdMX1duZDo6R2V0Qm9yZGVyQ29sb3IoKSBjb25zdAotewotICAgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKQotICAgICAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnNCb3JkZXJDb2xvcjsKKyAgc3dpdGNoIChuQm9yZGVyU3R5bGUpIHsKKyAgICBjYXNlIFBCU19TT0xJRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUEJTX0RBU0g6CisgICAgICBicmVhazsKKyAgICBjYXNlIFBCU19CRVZFTEVEOgorICAgICAgY29sb3IgPSBDUFdMX1V0aWxzOjpEZXZpZGVDb2xvcihHZXRCYWNrZ3JvdW5kQ29sb3IoKSwgMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBCU19JTlNFVDoKKyAgICAgIGNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC43NWYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQQlNfVU5ERVJMSU5FRDoKKyAgICAgIGJyZWFrOworICB9CiAKLSAgICByZXR1cm4gQ1BXTF9Db2xvcigpOwotfQotCi12b2lkIENQV0xfV25kOjpTZXRCb3JkZXJDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpCi17Ci0gICAgaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCi0gICAgICAgIG1fc1ByaXZhdGVQYXJhbS5zQm9yZGVyQ29sb3IgPSBjb2xvcjsKLX0KLQotQ1BXTF9EYXNoIENQV0xfV25kOjpHZXRCb3JkZXJEYXNoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnNEYXNoOwotfQotCi12b2lkKiBDUFdMX1duZDo6R2V0QXR0YWNoZWREYXRhKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBBdHRhY2hlZERhdGE7Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OlNldEJvcmRlckRhc2goY29uc3QgQ1BXTF9EYXNoICYgc0Rhc2gpCi17Ci0gICAgaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCi0gICAgICAgIG1fc1ByaXZhdGVQYXJhbS5zRGFzaCA9IHNEYXNoOwotfQotCi1DUFdMX1Njcm9sbEJhciogQ1BXTF9XbmQ6OkdldFZTY3JvbGxCYXIoKSBjb25zdAotewotICAgIGlmIChIYXNGbGFnKFBXU19WU0NST0xMKSkKLSAgICAgICAgcmV0dXJuIG1fcFZTY3JvbGxCYXI7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBDUFdMX1duZDo6Q3JlYXRlU2Nyb2xsQmFyKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotICAgIENyZWF0ZVZTY3JvbGxCYXIoY3ApOwotfQotCi12b2lkIENQV0xfV25kOjpDcmVhdGVWU2Nyb2xsQmFyKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotICAgIGlmICghbV9wVlNjcm9sbEJhciAmJiBIYXNGbGFnKFBXU19WU0NST0xMKSkKLSAgICB7Ci0gICAgICAgIFBXTF9DUkVBVEVQQVJBTSBzY3AgPSBjcDsKLQotICAgICAgICAvL2ZsYWdzCi0gICAgICAgIHNjcC5kd0ZsYWdzID0gUFdTX0NISUxEfCBQV1NfQkFDS0dST1VORCB8IFBXU19BVVRPVFJBTlNQQVJFTlQgfCBQV1NfTk9SRUZSRVNIQ0xJUDsKLQotICAgICAgICBzY3AucFBhcmVudFduZCA9IHRoaXM7Ci0gICAgICAgIHNjcC5zQmFja2dyb3VuZENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKLSAgICAgICAgc2NwLmVDdXJzb3JUeXBlID0gRlhDVF9BUlJPVzsKLSAgICAgICAgc2NwLm5UcmFuc3BhcmVuY3kgPSBQV0xfU0NST0xMQkFSX1RSQU5TUEFSQU5DWTsKLQotICAgICAgICBpZiAoKG1fcFZTY3JvbGxCYXIgPSBuZXcgQ1BXTF9TY3JvbGxCYXIoU0JUX1ZTQ1JPTEwpKSkKLSAgICAgICAgICAgIG1fcFZTY3JvbGxCYXItPkNyZWF0ZShzY3ApOwotICAgIH0KLX0KLQotdm9pZCBDUFdMX1duZDo6U2V0Q2FwdHVyZSgpCi17Ci0gICAgaWYgKENQV0xfTXNnQ29udHJvbCAqIHBNc2dDdHJsID0gR2V0TXNnQ29udHJvbCgpKQotICAgICAgICBwTXNnQ3RybC0+U2V0Q2FwdHVyZSh0aGlzKTsKLX0KLQotdm9pZCBDUFdMX1duZDo6UmVsZWFzZUNhcHR1cmUoKQotewotICAgIGZvciAoaW50MzJfdCBpPTAsc3o9bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0gICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0gICAgICAgICAgICBwQ2hpbGQtPlJlbGVhc2VDYXB0dXJlKCk7Ci0KLSAgICBpZiAoQ1BXTF9Nc2dDb250cm9sICogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCkpCi0gICAgICAgIHBNc2dDdHJsLT5SZWxlYXNlQ2FwdHVyZSgpOwotfQotCi12b2lkIENQV0xfV25kOjpTZXRGb2N1cygpCi17Ci0gICAgaWYgKENQV0xfTXNnQ29udHJvbCAqIHBNc2dDdHJsID0gR2V0TXNnQ29udHJvbCgpKQotICAgIHsKLSAgICAgICAgaWYgKCFwTXNnQ3RybC0+SXNNYWluQ2FwdHVyZUtleWJvYXJkKHRoaXMpKQotICAgICAgICAgICAgcE1zZ0N0cmwtPktpbGxGb2N1cygpOwotICAgICAgICBwTXNnQ3RybC0+U2V0Rm9jdXModGhpcyk7Ci0gICAgfQotfQotCi12b2lkIENQV0xfV25kOjpLaWxsRm9jdXMoKQotewotICAgIGlmIChDUFdMX01zZ0NvbnRyb2wgKiBwTXNnQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKLSAgICB7Ci0gICAgICAgIGlmIChwTXNnQ3RybC0+SXNXbmRDYXB0dXJlS2V5Ym9hcmQodGhpcykpCi0gICAgICAgICAgICBwTXNnQ3RybC0+S2lsbEZvY3VzKCk7Ci0gICAgfQotfQotCi12b2lkIENQV0xfV25kOjpPblNldEZvY3VzKCkKLXsKLX0KLQotdm9pZCBDUFdMX1duZDo6T25LaWxsRm9jdXMoKQotewotfQotCi1GWF9CT09MIENQV0xfV25kOjpXbmRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLSAgICByZXR1cm4gSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIEdldFdpbmRvd1JlY3QoKS5Db250YWlucyhwb2ludC54LHBvaW50LnkpOwotfQotCi1GWF9CT09MIENQV0xfV25kOjpDbGllbnRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLSAgICByZXR1cm4gSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIEdldENsaWVudFJlY3QoKS5Db250YWlucyhwb2ludC54LHBvaW50LnkpOwotfQotCi1jb25zdCBDUFdMX1duZCogQ1BXTF9XbmQ6OkdldFJvb3RXbmQoKSBjb25zdAotewotICAgIGlmIChtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZCkKLSAgICAgICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wUGFyZW50V25kLT5HZXRSb290V25kKCk7Ci0KLSAgICByZXR1cm4gdGhpczsKLX0KLQotdm9pZCBDUFdMX1duZDo6U2V0VmlzaWJsZShGWF9CT09MIGJWaXNpYmxlKQotewotICAgIGlmIChJc1ZhbGlkKCkpCi0gICAgewotICAgICAgICBmb3IgKGludDMyX3QgaT0wLHN6PW1fYUNoaWxkcmVuLkdldFNpemUoKTsgaTxzejsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDaGlsZC0+U2V0VmlzaWJsZShiVmlzaWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYlZpc2libGUgIT0gbV9iVmlzaWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgbV9iVmlzaWJsZSA9IGJWaXNpYmxlOwotICAgICAgICAgICAgUmVQb3NDaGlsZFduZCgpOwotICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDUFdMX1duZDo6U2V0Q2xpcFJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLXsKLSAgICBtX3JjQ2xpcCA9IHJlY3Q7Ci0gICAgbV9yY0NsaXAuTm9ybWFsaXplKCk7Ci19Ci0KLUNQREZfUmVjdCBDUFdMX1duZDo6R2V0Q2xpcFJlY3QoKSBjb25zdAotewotICAgIHJldHVybiBtX3JjQ2xpcDsKLX0KLQotRlhfQk9PTCBDUFdMX1duZDo6SXNSZWFkT25seSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEhhc0ZsYWcoUFdTX1JFQURPTkxZKTsKLX0KLQotdm9pZCBDUFdMX1duZDo6UmVQb3NDaGlsZFduZCgpCi17Ci0gICAgQ1BERl9SZWN0IHJjQ29udGVudCA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkrR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7Ci0KLSAgICBDUFdMX1Njcm9sbEJhciAqIHBWU0IgPSBHZXRWU2Nyb2xsQmFyKCk7Ci0KLSAgICBDUERGX1JlY3QgcmNWU2Nyb2xsID0gQ1BERl9SZWN0KHJjQ29udGVudC5yaWdodCAtIFBXTF9TQ1JPTExCQVJfV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDb250ZW50LmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQucmlnaHQtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQudG9wKTsKLQotICAgIGlmIChwVlNCKSBwVlNCLT5Nb3ZlKHJjVlNjcm9sbCxUUlVFLEZBTFNFKTsKLX0KLQotdm9pZCBDUFdMX1duZDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OlNldEN1cnNvcigpCi17Ci0gICAgaWYgKElzVmFsaWQoKSkKLSAgICB7Ci0gICAgICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IG5DdXJzb3JUeXBlID0gR2V0Q3JlYXRpb25QYXJhbSgpLmVDdXJzb3JUeXBlOwotICAgICAgICAgICAgcFNILT5TZXRDdXJzb3IobkN1cnNvclR5cGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENQV0xfV25kOjpDcmVhdGVNc2dDb250cm9sKCkKLXsKLSAgICBpZiAoIW1fc1ByaXZhdGVQYXJhbS5wTXNnQ29udHJvbCkKLSAgICAgICAgbV9zUHJpdmF0ZVBhcmFtLnBNc2dDb250cm9sID0gbmV3IENQV0xfTXNnQ29udHJvbCh0aGlzKTsKLX0KLQotdm9pZCBDUFdMX1duZDo6RGVzdHJveU1zZ0NvbnRyb2woKQotewotICAgIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBNc2dDb250cm9sID0gR2V0TXNnQ29udHJvbCgpKQotICAgICAgICBpZiAocE1zZ0NvbnRyb2wtPklzV25kQ3JlYXRlZCh0aGlzKSkKLSAgICAgICAgICAgIGRlbGV0ZSBwTXNnQ29udHJvbDsKLX0KLQotQ1BXTF9Nc2dDb250cm9sKiBDUFdMX1duZDo6R2V0TXNnQ29udHJvbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wTXNnQ29udHJvbDsKLX0KLQotRlhfQk9PTCBDUFdMX1duZDo6SXNDYXB0dXJlTW91c2UoKSBjb25zdAotewotICAgIHJldHVybiBJc1duZENhcHR1cmVNb3VzZSh0aGlzKTsKLX0KLQotRlhfQk9PTCBDUFdMX1duZDo6SXNXbmRDYXB0dXJlTW91c2UoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAotewotICAgIGlmIChDUFdMX01zZ0NvbnRyb2wgKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKLSAgICAgICAgcmV0dXJuIHBDdHJsLT5Jc1duZENhcHR1cmVNb3VzZShwV25kKTsKLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDUFdMX1duZDo6SXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAotewotICAgIGlmIChDUFdMX01zZ0NvbnRyb2wgKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKLSAgICAgICAgcmV0dXJuIHBDdHJsLT5Jc1duZENhcHR1cmVLZXlib2FyZChwV25kKTsKLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDUFdMX1duZDo6SXNGb2N1c2VkKCkgY29uc3QKLXsKLSAgICBpZiAoQ1BXTF9Nc2dDb250cm9sICogcEN0cmwgPSBHZXRNc2dDb250cm9sKCkpCi0gICAgICAgIHJldHVybiBwQ3RybC0+SXNNYWluQ2FwdHVyZUtleWJvYXJkKHRoaXMpOwotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1DUERGX1JlY3QgQ1BXTF9XbmQ6OkdldEZvY3VzUmVjdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwxKTsKLX0KLQotRlhfRkxPQVQgQ1BXTF9XbmQ6OkdldEZvbnRTaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLmZGb250U2l6ZTsKLX0KLQotdm9pZCBDUFdMX1duZDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQotewotICAgIG1fc1ByaXZhdGVQYXJhbS5mRm9udFNpemUgPSBmRm9udFNpemU7Ci19Ci0KLUlGWF9TeXN0ZW1IYW5kbGVyKiBDUFdMX1duZDo6R2V0U3lzdGVtSGFuZGxlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wU3lzdGVtSGFuZGxlcjsKLX0KLQotSVBXTF9Gb2N1c0hhbmRsZXIqIENQV0xfV25kOjpHZXRGb2N1c0hhbmRsZXIoKSBjb25zdAotewotICAgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ucEZvY3VzSGFuZGxlcjsKLX0KLQotSVBXTF9Qcm92aWRlciogQ1BXTF9XbmQ6OkdldFByb3ZpZGVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBQcm92aWRlcjsKLX0KLQotSUZYX0VkaXRfRm9udE1hcCogQ1BXTF9XbmQ6OkdldEZvbnRNYXAoKSBjb25zdAotewotICAgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ucEZvbnRNYXA7Ci19Ci0KLUNQV0xfQ29sb3IgQ1BXTF9XbmQ6OkdldEJvcmRlckxlZnRUb3BDb2xvcihpbnQzMl90IG5Cb3JkZXJTdHlsZSkgY29uc3QKLXsKLSAgICBDUFdMX0NvbG9yIGNvbG9yOwotCi0gICAgc3dpdGNoIChuQm9yZGVyU3R5bGUpCi0gICAgewotICAgICAgICBjYXNlIFBCU19TT0xJRDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBCU19EQVNIOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEJTX0JFVkVMRUQ6Ci0gICAgICAgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQQlNfSU5TRVQ6Ci0gICAgICAgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMC41Zik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQQlNfVU5ERVJMSU5FRDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBjb2xvcjsKLX0KLQotQ1BXTF9Db2xvciBDUFdMX1duZDo6R2V0Qm9yZGVyUmlnaHRCb3R0b21Db2xvcihpbnQzMl90IG5Cb3JkZXJTdHlsZSkgY29uc3QKLXsKLSAgICBDUFdMX0NvbG9yIGNvbG9yOwotCi0gICAgc3dpdGNoIChuQm9yZGVyU3R5bGUpCi0gICAgewotICAgICAgICBjYXNlIFBCU19TT0xJRDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBCU19EQVNIOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEJTX0JFVkVMRUQ6Ci0gICAgICAgICAgICBjb2xvciA9IENQV0xfVXRpbHM6OkRldmlkZUNvbG9yKEdldEJhY2tncm91bmRDb2xvcigpLDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEJTX0lOU0VUOgotICAgICAgICAgICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDAuNzVmKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBCU19VTkRFUkxJTkVEOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvbG9yOworICByZXR1cm4gY29sb3I7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWludDMyX3QgQ1BXTF9XbmQ6OkdldFRyYW5zcGFyZW5jeSgpCi17Ci0gICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5uVHJhbnNwYXJlbmN5OworaW50MzJfdCBDUFdMX1duZDo6R2V0VHJhbnNwYXJlbmN5KCkgeworICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLm5UcmFuc3BhcmVuY3k7CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OlNldFRyYW5zcGFyZW5jeShpbnQzMl90IG5UcmFuc3BhcmVuY3kpCi17Ci0gICAgZm9yIChpbnQzMl90IGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDaGlsZC0+U2V0VHJhbnNwYXJlbmN5KG5UcmFuc3BhcmVuY3kpOwotICAgICAgICB9Cit2b2lkIENQV0xfV25kOjpTZXRUcmFuc3BhcmVuY3koaW50MzJfdCBuVHJhbnNwYXJlbmN5KSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeworICAgICAgcENoaWxkLT5TZXRUcmFuc3BhcmVuY3koblRyYW5zcGFyZW5jeSk7CiAgICAgfQorICB9CiAKLSAgICBtX3NQcml2YXRlUGFyYW0ublRyYW5zcGFyZW5jeSA9IG5UcmFuc3BhcmVuY3k7CisgIG1fc1ByaXZhdGVQYXJhbS5uVHJhbnNwYXJlbmN5ID0gblRyYW5zcGFyZW5jeTsKIH0KIAotQ1BERl9NYXRyaXggQ1BXTF9XbmQ6OkdldFdpbmRvd01hdHJpeCgpIGNvbnN0Ci17Ci0gICAgQ1BERl9NYXRyaXggbXQgPSBHZXRDaGlsZFRvUm9vdCgpOworQ1BERl9NYXRyaXggQ1BXTF9XbmQ6OkdldFdpbmRvd01hdHJpeCgpIGNvbnN0IHsKKyAgQ1BERl9NYXRyaXggbXQgPSBHZXRDaGlsZFRvUm9vdCgpOwogCi0gICAgaWYgKElQV0xfUHJvdmlkZXIqIHBQcm92aWRlciA9IEdldFByb3ZpZGVyKCkpCi0gICAgewotICAgICAgICBtdC5Db25jYXQocFByb3ZpZGVyLT5HZXRXaW5kb3dNYXRyaXgoR2V0QXR0YWNoZWREYXRhKCkpKTsKLSAgICAgICAgcmV0dXJuIG10OwotICAgIH0KLQorICBpZiAoSVBXTF9Qcm92aWRlciogcFByb3ZpZGVyID0gR2V0UHJvdmlkZXIoKSkgeworICAgIG10LkNvbmNhdChwUHJvdmlkZXItPkdldFdpbmRvd01hdHJpeChHZXRBdHRhY2hlZERhdGEoKSkpOwogICAgIHJldHVybiBtdDsKKyAgfQorCisgIHJldHVybiBtdDsKIH0KIAotdm9pZCBDUFdMX1duZDo6UFdMdG9XbmQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpIGNvbnN0Ci17Ci0gICAgQ1BERl9NYXRyaXggbXQgPSBHZXRXaW5kb3dNYXRyaXgoKTsKLSAgICBDUERGX1BvaW50IHB0ID0gcG9pbnQ7Ci0gICAgbXQuVHJhbnNmb3JtKHB0LngscHQueSk7Ci0gICAgeCA9IChpbnQzMl90KShwdC54KzAuNSk7Ci0gICAgeSA9IChpbnQzMl90KShwdC55KzAuNSk7Cit2b2lkIENQV0xfV25kOjpQV0x0b1duZChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgY29uc3QgeworICBDUERGX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOworICBDUERGX1BvaW50IHB0ID0gcG9pbnQ7CisgIG10LlRyYW5zZm9ybShwdC54LCBwdC55KTsKKyAgeCA9IChpbnQzMl90KShwdC54ICsgMC41KTsKKyAgeSA9IChpbnQzMl90KShwdC55ICsgMC41KTsKIH0KIAotRlhfUkVDVCBDUFdMX1duZDo6UFdMdG9XbmQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgY29uc3QKLXsKLSAgICBDUERGX1JlY3QgcmNUZW1wID0gcmVjdDsKLSAgICBDUERGX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOwotICAgIG10LlRyYW5zZm9ybVJlY3QocmNUZW1wKTsKLSAgICByZXR1cm4gRlhfUkVDVCgoaW50MzJfdCkocmNUZW1wLmxlZnQrMC41KSwgKGludDMyX3QpKHJjVGVtcC5ib3R0b20rMC41KSwgKGludDMyX3QpKHJjVGVtcC5yaWdodCswLjUpLCAoaW50MzJfdCkocmNUZW1wLnRvcCswLjUpKTsKK0ZYX1JFQ1QgQ1BXTF9XbmQ6OlBXTHRvV25kKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICBDUERGX1JlY3QgcmNUZW1wID0gcmVjdDsKKyAgQ1BERl9NYXRyaXggbXQgPSBHZXRXaW5kb3dNYXRyaXgoKTsKKyAgbXQuVHJhbnNmb3JtUmVjdChyY1RlbXApOworICByZXR1cm4gRlhfUkVDVCgoaW50MzJfdCkocmNUZW1wLmxlZnQgKyAwLjUpLCAoaW50MzJfdCkocmNUZW1wLmJvdHRvbSArIDAuNSksCisgICAgICAgICAgICAgICAgIChpbnQzMl90KShyY1RlbXAucmlnaHQgKyAwLjUpLCAoaW50MzJfdCkocmNUZW1wLnRvcCArIDAuNSkpOwogfQogCi1GWF9IV05EIENQV0xfV25kOjpHZXRBdHRhY2hlZEhXbmQoKSBjb25zdAotewotICAgIHJldHVybiBtX3NQcml2YXRlUGFyYW0uaEF0dGFjaGVkV25kOworRlhfSFdORCBDUFdMX1duZDo6R2V0QXR0YWNoZWRIV25kKCkgY29uc3QgeworICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLmhBdHRhY2hlZFduZDsKIH0KIAotQ1BERl9Qb2ludCBDUFdMX1duZDo6Q2hpbGRUb1BhcmVudChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QKLXsKLSAgICBDUERGX01hdHJpeCBtdCA9IEdldENoaWxkTWF0cml4KCk7Ci0gICAgaWYgKG10LklzSWRlbnRpdHkoKSkKLSAgICAgICAgcmV0dXJuIHBvaW50OworQ1BERl9Qb2ludCBDUFdMX1duZDo6Q2hpbGRUb1BhcmVudChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBDUERGX01hdHJpeCBtdCA9IEdldENoaWxkTWF0cml4KCk7CisgIGlmIChtdC5Jc0lkZW50aXR5KCkpCisgICAgcmV0dXJuIHBvaW50OwogCi0gICAgQ1BERl9Qb2ludCBwdCA9IHBvaW50OwotICAgIG10LlRyYW5zZm9ybShwdC54LHB0LnkpOwotICAgIHJldHVybiBwdDsKKyAgQ1BERl9Qb2ludCBwdCA9IHBvaW50OworICBtdC5UcmFuc2Zvcm0ocHQueCwgcHQueSk7CisgIHJldHVybiBwdDsKIH0KIAotQ1BERl9SZWN0IENQV0xfV25kOjpDaGlsZFRvUGFyZW50KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QKLXsKLSAgICBDUERGX01hdHJpeCBtdCA9IEdldENoaWxkTWF0cml4KCk7Ci0gICAgaWYgKG10LklzSWRlbnRpdHkoKSkKLSAgICAgICAgcmV0dXJuIHJlY3Q7CitDUERGX1JlY3QgQ1BXTF9XbmQ6OkNoaWxkVG9QYXJlbnQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdCB7CisgIENQREZfTWF0cml4IG10ID0gR2V0Q2hpbGRNYXRyaXgoKTsKKyAgaWYgKG10LklzSWRlbnRpdHkoKSkKKyAgICByZXR1cm4gcmVjdDsKIAotICAgIENQREZfUmVjdCByYyA9IHJlY3Q7Ci0gICAgbXQuVHJhbnNmb3JtUmVjdChyYyk7Ci0gICAgcmV0dXJuIHJjOworICBDUERGX1JlY3QgcmMgPSByZWN0OworICBtdC5UcmFuc2Zvcm1SZWN0KHJjKTsKKyAgcmV0dXJuIHJjOwogfQogCi1DUERGX1BvaW50IENQV0xfV25kOjpQYXJlbnRUb0NoaWxkKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdAotewotICAgIENQREZfTWF0cml4IG10ID0gR2V0Q2hpbGRNYXRyaXgoKTsKLSAgICBpZiAobXQuSXNJZGVudGl0eSgpKQotICAgICAgICByZXR1cm4gcG9pbnQ7CitDUERGX1BvaW50IENQV0xfV25kOjpQYXJlbnRUb0NoaWxkKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgIENQREZfTWF0cml4IG10ID0gR2V0Q2hpbGRNYXRyaXgoKTsKKyAgaWYgKG10LklzSWRlbnRpdHkoKSkKKyAgICByZXR1cm4gcG9pbnQ7CiAKLSAgICBtdC5TZXRSZXZlcnNlKG10KTsKLSAgICBDUERGX1BvaW50IHB0ID0gcG9pbnQ7Ci0gICAgbXQuVHJhbnNmb3JtKHB0LngscHQueSk7Ci0gICAgcmV0dXJuIHB0OworICBtdC5TZXRSZXZlcnNlKG10KTsKKyAgQ1BERl9Qb2ludCBwdCA9IHBvaW50OworICBtdC5UcmFuc2Zvcm0ocHQueCwgcHQueSk7CisgIHJldHVybiBwdDsKIH0KIAotQ1BERl9SZWN0IENQV0xfV25kOjpQYXJlbnRUb0NoaWxkKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QKLXsKLSAgICBDUERGX01hdHJpeCBtdCA9IEdldENoaWxkTWF0cml4KCk7Ci0gICAgaWYgKG10LklzSWRlbnRpdHkoKSkKLSAgICAgICAgcmV0dXJuIHJlY3Q7CitDUERGX1JlY3QgQ1BXTF9XbmQ6OlBhcmVudFRvQ2hpbGQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdCB7CisgIENQREZfTWF0cml4IG10ID0gR2V0Q2hpbGRNYXRyaXgoKTsKKyAgaWYgKG10LklzSWRlbnRpdHkoKSkKKyAgICByZXR1cm4gcmVjdDsKIAotICAgIG10LlNldFJldmVyc2UobXQpOwotICAgIENQREZfUmVjdCByYyA9IHJlY3Q7Ci0gICAgbXQuVHJhbnNmb3JtUmVjdChyYyk7Ci0gICAgcmV0dXJuIHJjOworICBtdC5TZXRSZXZlcnNlKG10KTsKKyAgQ1BERl9SZWN0IHJjID0gcmVjdDsKKyAgbXQuVHJhbnNmb3JtUmVjdChyYyk7CisgIHJldHVybiByYzsKIH0KIAotQ1BERl9NYXRyaXggQ1BXTF9XbmQ6OkdldENoaWxkVG9Sb290KCkgY29uc3QKLXsKLSAgICBDUERGX01hdHJpeCBtdCgxLCAwLCAwLCAxLCAwLCAwKTsKLSAgICBpZiAoSGFzRmxhZyhQV1NfQ0hJTEQpKQotICAgIHsKLSAgICAgICAgY29uc3QgQ1BXTF9XbmQqIHBQYXJlbnQgPSB0aGlzOwotICAgICAgICB3aGlsZSAocFBhcmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgbXQuQ29uY2F0KHBQYXJlbnQtPkdldENoaWxkTWF0cml4KCkpOwotICAgICAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpOwotICAgICAgICB9CitDUERGX01hdHJpeCBDUFdMX1duZDo6R2V0Q2hpbGRUb1Jvb3QoKSBjb25zdCB7CisgIENQREZfTWF0cml4IG10KDEsIDAsIDAsIDEsIDAsIDApOworICBpZiAoSGFzRmxhZyhQV1NfQ0hJTEQpKSB7CisgICAgY29uc3QgQ1BXTF9XbmQqIHBQYXJlbnQgPSB0aGlzOworICAgIHdoaWxlIChwUGFyZW50KSB7CisgICAgICBtdC5Db25jYXQocFBhcmVudC0+R2V0Q2hpbGRNYXRyaXgoKSk7CisgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0UGFyZW50V2luZG93KCk7CiAgICAgfQotICAgIHJldHVybiBtdDsKKyAgfQorICByZXR1cm4gbXQ7CiB9CiAKLUNQREZfTWF0cml4IENQV0xfV25kOjpHZXRDaGlsZE1hdHJpeCgpIGNvbnN0Ci17Ci0gICAgaWYgKEhhc0ZsYWcoUFdTX0NISUxEKSkKLSAgICAgICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5tdENoaWxkOworQ1BERl9NYXRyaXggQ1BXTF9XbmQ6OkdldENoaWxkTWF0cml4KCkgY29uc3QgeworICBpZiAoSGFzRmxhZyhQV1NfQ0hJTEQpKQorICAgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ubXRDaGlsZDsKIAotICAgIHJldHVybiBDUERGX01hdHJpeCgxLDAsMCwxLDAsMCk7CisgIHJldHVybiBDUERGX01hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKTsKIH0KIAotdm9pZCBDUFdMX1duZDo6U2V0Q2hpbGRNYXRyaXgoY29uc3QgQ1BERl9NYXRyaXgmIG10KQotewotICAgIG1fc1ByaXZhdGVQYXJhbS5tdENoaWxkID0gbXQ7Cit2b2lkIENQV0xfV25kOjpTZXRDaGlsZE1hdHJpeChjb25zdCBDUERGX01hdHJpeCYgbXQpIHsKKyAgbV9zUHJpdmF0ZVBhcmFtLm10Q2hpbGQgPSBtdDsKIH0KIAotY29uc3QgQ1BXTF9XbmQqIENQV0xfV25kOjpHZXRGb2N1c2VkKCkgY29uc3QKLXsKLSAgICBpZiAoQ1BXTF9Nc2dDb250cm9sICogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCkpCi0gICAgewotICAgICAgICByZXR1cm4gcE1zZ0N0cmwtPm1fcE1haW5LZXlib2FyZFduZDsKK2NvbnN0IENQV0xfV25kKiBDUFdMX1duZDo6R2V0Rm9jdXNlZCgpIGNvbnN0IHsKKyAgaWYgKENQV0xfTXNnQ29udHJvbCogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCkpIHsKKyAgICByZXR1cm4gcE1zZ0N0cmwtPm1fcE1haW5LZXlib2FyZFduZDsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCit2b2lkIENQV0xfV25kOjpFbmFibGVXaW5kb3coRlhfQk9PTCBiRW5hYmxlKSB7CisgIGlmIChtX2JFbmFibGVkICE9IGJFbmFibGUpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeworICAgICAgICBwQ2hpbGQtPkVuYWJsZVdpbmRvdyhiRW5hYmxlKTsKKyAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gTlVMTDsKKyAgICBtX2JFbmFibGVkID0gYkVuYWJsZTsKKworICAgIGlmIChiRW5hYmxlKQorICAgICAgT25FbmFibGVkKCk7CisgICAgZWxzZQorICAgICAgT25EaXNhYmxlZCgpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkVuYWJsZVdpbmRvdyhGWF9CT09MIGJFbmFibGUpCi17Ci0gICAgaWYgKG1fYkVuYWJsZWQgIT0gYkVuYWJsZSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBpPTAsc3o9bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENoaWxkLT5FbmFibGVXaW5kb3coYkVuYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtX2JFbmFibGVkID0gYkVuYWJsZTsKLQotICAgICAgICBpZiAoYkVuYWJsZSkKLSAgICAgICAgICAgIE9uRW5hYmxlZCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBPbkRpc2FibGVkKCk7Ci0gICAgfQorRlhfQk9PTCBDUFdMX1duZDo6SXNFbmFibGVkKCkgeworICByZXR1cm4gbV9iRW5hYmxlZDsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNFbmFibGVkKCkKLXsKLSAgICByZXR1cm4gbV9iRW5hYmxlZDsKK3ZvaWQgQ1BXTF9XbmQ6Ok9uRW5hYmxlZCgpIHt9CisKK3ZvaWQgQ1BXTF9XbmQ6Ok9uRGlzYWJsZWQoKSB7fQorCitGWF9CT09MIENQV0xfV25kOjpJc0NUUkxwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdCB7CisgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpIHsKKyAgICByZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzQ1RSTEtleURvd24obkZsYWcpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQV0xfV25kOjpPbkVuYWJsZWQoKQoteworRlhfQk9PTCBDUFdMX1duZDo6SXNTSElGVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0IHsKKyAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKSkgeworICAgIHJldHVybiBwU3lzdGVtSGFuZGxlci0+SXNTSElGVEtleURvd24obkZsYWcpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQV0xfV25kOjpPbkRpc2FibGVkKCkKLXsKK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzQUxUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3QgeworICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpKSB7CisgICAgcmV0dXJuIHBTeXN0ZW1IYW5kbGVyLT5Jc0FMVEtleURvd24obkZsYWcpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENQV0xfV25kOjpJc0NUUkxwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAotewotICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0gICAgewotICAgICAgICByZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzQ1RSTEtleURvd24obkZsYWcpOwotICAgIH0KK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzSU5TRVJUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3QgeworICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpKSB7CisgICAgcmV0dXJuIHBTeXN0ZW1IYW5kbGVyLT5Jc0lOU0VSVEtleURvd24obkZsYWcpOworICB9CiAKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ1BXTF9XbmQ6OklzU0hJRlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAotewotICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0gICAgewotICAgICAgICByZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzU0hJRlRLZXlEb3duKG5GbGFnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ1BXTF9XbmQ6OklzQUxUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3QKLXsKLSAgICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBTeXN0ZW1IYW5kbGVyLT5Jc0FMVEtleURvd24obkZsYWcpOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTCBDUFdMX1duZDo6SXNJTlNFUlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAotewotICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0gICAgewotICAgICAgICByZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzSU5TRVJUS2V5RG93bihuRmxhZyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9yZXNvdXJjZS5oIGIvZnBkZnNkay9zcmMvcmVzb3VyY2UuaAppbmRleCAxNzI5ODA3Li5hMzBhNGVmIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9yZXNvdXJjZS5oCisrKyBiL2ZwZGZzZGsvc3JjL3Jlc291cmNlLmgKQEAgLTE1LDEwICsxNSwxMCBAQAogLy8KICNpZmRlZiBBUFNUVURJT19JTlZPS0VECiAjaWZuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKLSNkZWZpbmUgX0FQU19ORVhUX1JFU09VUkNFX1ZBTFVFICAgICAgICAxMDQKLSNkZWZpbmUgX0FQU19ORVhUX0NPTU1BTkRfVkFMVUUgICAgICAgICA0MDAwMQotI2RlZmluZSBfQVBTX05FWFRfQ09OVFJPTF9WQUxVRSAgICAgICAgIDEwMDAKLSNkZWZpbmUgX0FQU19ORVhUX1NZTUVEX1ZBTFVFICAgICAgICAgICAxMDEKKyNkZWZpbmUgX0FQU19ORVhUX1JFU09VUkNFX1ZBTFVFIDEwNAorI2RlZmluZSBfQVBTX05FWFRfQ09NTUFORF9WQUxVRSA0MDAwMQorI2RlZmluZSBfQVBTX05FWFRfQ09OVFJPTF9WQUxVRSAxMDAwCisjZGVmaW5lIF9BUFNfTkVYVF9TWU1FRF9WQUxVRSAxMDEKICNlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2RhdGFhdmFpbC5oIGIvcHVibGljL2ZwZGZfZGF0YWF2YWlsLmgKaW5kZXggYjMwMzU2MC4uM2FiMDJmZSAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfZGF0YWF2YWlsLmgKKysrIGIvcHVibGljL2ZwZGZfZGF0YWF2YWlsLmgKQEAgLTEyLDEwICsxMiw5IEBACiAjaW5jbHVkZSAiZnBkZnZpZXcuaCIKIAogLyoqIFRoZSByZXN1bHQgb2YgdGhlIHByb2Nlc3Mgd2hpY2ggY2hlY2sgbGluZWFyaXplZCBQREYuICovCi0jZGVmaW5lIEZTREtfSVNfTElORUFSSVpFRCAgICAgICAgICAxCi0jZGVmaW5lIEZTREtfTk9UX0xJTkVBUklaRUQgICAgICAgICAwCi0jZGVmaW5lIEZTREtfVU5LTk9XX0xJTkVBUklaRUQgICAgICAtMQotCisjZGVmaW5lIEZTREtfSVNfTElORUFSSVpFRCAxCisjZGVmaW5lIEZTREtfTk9UX0xJTkVBUklaRUQgMAorI2RlZmluZSBGU0RLX1VOS05PV19MSU5FQVJJWkVEIC0xCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC0yNiwyOCArMjUsMjkgQEAKICAqICAgICAgICAgIEludGVyZmFjZSBmb3IgY2hlY2tpbmcgd2hldGhlciB0aGUgc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBhdmFpbGFibGUuCiAgKi8KIHR5cGVkZWYgc3RydWN0IF9GWF9GSUxFQVZBSUwgewotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCi0gICAgICovCi0gICAgaW50IHZlcnNpb247CisgIC8qKgorICAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgorICAgKi8KKyAgaW50IHZlcnNpb247CiAKLSAgICAvKioKLSAgICAgKiBNZXRob2Q6IElzRGF0YUF2YWlsCi0gICAgICogICAgICBSZXBvcnQgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGEgc2VjdGlvbiBpcyBhdmFpbGFibGUuIEEgc2VjdGlvbiBpcyBhdmFpbGFibGUgb25seSBpZiBhbGwgYnl0ZXMgaW4gdGhlIHNlY3Rpb24gaXMgYXZhaWxhYmxlLgotICAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICAqICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgWWVzCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAgKiAgICAgIG9mZnNldCAgICAgIC0gICBUaGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHNlY3Rpb24gaW4gdGhlIGZpbGUuCi0gICAgICogICAgICBzaXplICAgICAgICAtICAgVGhlIHNpemUgb2YgdGhlIGRhdGEgc2VjdGlvbgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgIHRydWUgbWVhbnMgdGhlIHNwZWNpZmllZCBkYXRhIHNlY3Rpb24gaXMgYXZhaWxhYmxlLgotICAgICAqIENvbW1lbnRzOgotICAgICAqICAgICAgQ2FsbGVkIGJ5IEZveGl0IFNESyB0byBjaGVjayB3aGV0aGVyIHRoZSBkYXRhIHNlY3Rpb24gaXMgcmVhZHkuCi0gICAgICovCi0gICAgRlBERl9CT09MICgqSXNEYXRhQXZhaWwpKHN0cnVjdCBfRlhfRklMRUFWQUlMKiBwVGhpcywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAvKioKKyAgICogTWV0aG9kOiBJc0RhdGFBdmFpbAorICAgKiAgICAgIFJlcG9ydCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZGF0YSBzZWN0aW9uIGlzIGF2YWlsYWJsZS4gQSBzZWN0aW9uIGlzCisgICAqIGF2YWlsYWJsZSBvbmx5IGlmIGFsbCBieXRlcyBpbiB0aGUgc2VjdGlvbiBpcyBhdmFpbGFibGUuCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgWWVzCisgICAqIFBhcmFtZXRlcnM6CisgICAqICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAgKiAgICAgIG9mZnNldCAgICAgIC0gICBUaGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHNlY3Rpb24gaW4gdGhlIGZpbGUuCisgICAqICAgICAgc2l6ZSAgICAgICAgLSAgIFRoZSBzaXplIG9mIHRoZSBkYXRhIHNlY3Rpb24KKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgIHRydWUgbWVhbnMgdGhlIHNwZWNpZmllZCBkYXRhIHNlY3Rpb24gaXMgYXZhaWxhYmxlLgorICAgKiBDb21tZW50czoKKyAgICogICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGRhdGEgc2VjdGlvbiBpcyByZWFkeS4KKyAgICovCisgIEZQREZfQk9PTCAoKklzRGF0YUF2YWlsKShzdHJ1Y3QgX0ZYX0ZJTEVBVkFJTCogcFRoaXMsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIH0gRlhfRklMRUFWQUlMOwogCiB0eXBlZGVmIHZvaWQqIEZQREZfQVZBSUw7CkBAIC01NywyMyArNTcsMjkgQEAKICogICAgICAgICAgIENyZWF0ZSBhIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlci4KICoKICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIGZpbGVfYXZhaWwgIC0gICBQb2ludGVyIHRvIGZpbGUgYXZhaWxhYmlsaXR5IGludGVyZmFjZSB0byBjaGVjayBhdmFpbGFiaWxpdHkgb2YgZmlsZSBkYXRhLgotKiAgICAgICAgICAgZmlsZSAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBmaWxlIGFjY2VzcyBpbnRlcmZhY2UgZm9yIHJlYWRpbmcgZGF0YSBmcm9tIGZpbGUuCisqICAgICAgICAgICBmaWxlX2F2YWlsICAtICAgUG9pbnRlciB0byBmaWxlIGF2YWlsYWJpbGl0eSBpbnRlcmZhY2UgdG8gY2hlY2sKKyogYXZhaWxhYmlsaXR5IG9mIGZpbGUgZGF0YS4KKyogICAgICAgICAgIGZpbGUgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZmlsZSBhY2Nlc3MgaW50ZXJmYWNlIGZvciByZWFkaW5nIGRhdGEKKyogZnJvbSBmaWxlLgogKiBSZXR1cm4gdmFsdWU6CiAqICAgICAgICAgICBBIGhhbmRsZSB0byB0aGUgZG9jdW1lbnQgYXZhaWxhYmlsaXR5IHByb3ZpZGVyLiBOVUxMIGZvciBlcnJvci4KICogQ29tbWVudHM6Ci0qICAgICAgICAgICBBcHBsaWNhdGlvbiBtdXN0IGNhbGwgRlBERkF2YWlsX0Rlc3Ryb3kgd2hlbiBkb25lIHdpdGggdGhlIGF2YWlsYWJpbGl0eSBwcm92aWRlci4KKyogICAgICAgICAgIEFwcGxpY2F0aW9uIG11c3QgY2FsbCBGUERGQXZhaWxfRGVzdHJveSB3aGVuIGRvbmUgd2l0aCB0aGUKKyogYXZhaWxhYmlsaXR5IHByb3ZpZGVyLgogKiBOb3RlczoKLSogICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGxvYWQgYSBkb2N1bWVudCB3aGljaCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMgbm93LgorKiAgICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gbG9hZCBhIGRvY3VtZW50IHdoaWNoIGNvbnNpc3RzIG9mCisqIGR5bmFtaWMgWEZBIGZpZWxkcyBub3cuCiAqLwotRExMRVhQT1JUIEZQREZfQVZBSUwgU1REQ0FMTCBGUERGQXZhaWxfQ3JlYXRlKEZYX0ZJTEVBVkFJTCogZmlsZV9hdmFpbCwgRlBERl9GSUxFQUNDRVNTKiBmaWxlKTsKK0RMTEVYUE9SVCBGUERGX0FWQUlMIFNURENBTEwgRlBERkF2YWlsX0NyZWF0ZShGWF9GSUxFQVZBSUwqIGZpbGVfYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFQUNDRVNTKiBmaWxlKTsKIAogLyoqCiAqIEZ1bmN0aW9uOiBGUERGQXZhaWxfRGVzdHJveQogKiAgICAgICAgICAgRGVzdHJveSBhIGRvY3VtZW50IGF2YWlsaWJpdHkgcHJvdmlkZXIuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCisqICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieQorKiBGUERGQXZhaWxfQ3JlYXRlCiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIE5vbmUuCiAqLwpAQCAtODEsNjMgKzg3LDc5IEBACiAKIC8qKgogICogSW50ZXJmYWNlOiBGWF9ET1dOTE9BREhJTlRTCi0gKiAgICAgICAgICBEb3dubG9hZCBoaW50cyBpbnRlcmZhY2UuIFVzZWQgdG8gcmVjZWl2ZSBoaW50cyBmb3IgZnVydGhlciBkb3dubG9hZGluZy4KKyAqICAgICAgICAgIERvd25sb2FkIGhpbnRzIGludGVyZmFjZS4gVXNlZCB0byByZWNlaXZlIGhpbnRzIGZvciBmdXJ0aGVyCisgKiBkb3dubG9hZGluZy4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0RPV05MT0FESElOVFMgewotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCi0gICAgICovCi0gICAgaW50IHZlcnNpb247CisgIC8qKgorICAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgorICAgKi8KKyAgaW50IHZlcnNpb247CiAKLSAgICAvKioKLSAgICAgKiBNZXRob2Q6IEFkZFNlZ21lbnQKLSAgICAgKiAgICAgIEFkZCBhIHNlY3Rpb24gdG8gYmUgZG93bmxvYWRlZC4KLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgIDEKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAgKiAgICAgIFllcwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgICogICAgICBvZmZzZXQgICAgICAtICAgVGhlIG9mZnNldCBvZiB0aGUgaGludCByZXBvcnRlZCB0byBiZSBkb3dubG9hZGVkLgotICAgICAqICAgICAgc2l6ZSAgICAgICAgLSAgIFRoZSBzaXplIG9mIHRoZSBoaW50IHJlcG9ydGVkIHRvIGJlIGRvd25sb2FkZWQuCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgTm9uZS4KLSAgICAgKiBDb21tZW50czoKLSAgICAgKiAgICAgIENhbGxlZCBieSBGb3hpdCBTREsgdG8gcmVwb3J0IHNvbWUgZG93bmxvYWRpbmcgaGludHMgZm9yIGRvd25sb2FkIG1hbmFnZXIuCi0gICAgICogICAgICBUaGUgcG9zaXRpb24gYW5kIHNpemUgb2Ygc2VjdGlvbiBtYXkgYmUgbm90IGFjY3VyYXRlLCBwYXJ0IG9mIHRoZSBzZWN0aW9uIG1pZ2h0IGJlIGFscmVhZHkgYXZhaWxhYmxlLgotICAgICAqICAgICAgVGhlIGRvd25sb2FkIG1hbmFnZXIgbXVzdCBkZWFsIHdpdGggdGhhdCB0byBtYXhpbWl6ZSBkb3dubG9hZCBlZmZpY2llbmN5LgotICAgICAqLwotICAgIHZvaWQgKCpBZGRTZWdtZW50KShzdHJ1Y3QgX0ZYX0RPV05MT0FESElOVFMqIHBUaGlzLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgIC8qKgorICAgKiBNZXRob2Q6IEFkZFNlZ21lbnQKKyAgICogICAgICBBZGQgYSBzZWN0aW9uIHRvIGJlIGRvd25sb2FkZWQuCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgWWVzCisgICAqIFBhcmFtZXRlcnM6CisgICAqICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAgKiAgICAgIG9mZnNldCAgICAgIC0gICBUaGUgb2Zmc2V0IG9mIHRoZSBoaW50IHJlcG9ydGVkIHRvIGJlIGRvd25sb2FkZWQuCisgICAqICAgICAgc2l6ZSAgICAgICAgLSAgIFRoZSBzaXplIG9mIHRoZSBoaW50IHJlcG9ydGVkIHRvIGJlIGRvd25sb2FkZWQuCisgICAqIFJldHVybiBWYWx1ZToKKyAgICogICAgICBOb25lLgorICAgKiBDb21tZW50czoKKyAgICogICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIHRvIHJlcG9ydCBzb21lIGRvd25sb2FkaW5nIGhpbnRzIGZvciBkb3dubG9hZAorICAgKiBtYW5hZ2VyLgorICAgKiAgICAgIFRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvZiBzZWN0aW9uIG1heSBiZSBub3QgYWNjdXJhdGUsIHBhcnQgb2YgdGhlCisgICAqIHNlY3Rpb24gbWlnaHQgYmUgYWxyZWFkeSBhdmFpbGFibGUuCisgICAqICAgICAgVGhlIGRvd25sb2FkIG1hbmFnZXIgbXVzdCBkZWFsIHdpdGggdGhhdCB0byBtYXhpbWl6ZSBkb3dubG9hZAorICAgKiBlZmZpY2llbmN5LgorICAgKi8KKyAgdm9pZCAoKkFkZFNlZ21lbnQpKHN0cnVjdCBfRlhfRE9XTkxPQURISU5UUyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpOwogfSBGWF9ET1dOTE9BREhJTlRTOwogCiAvKioKICogRnVuY3Rpb246IEZQREZBdmFpbF9Jc0RvY0F2YWlsCi0qICAgICAgICAgICBDaGVjayB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyByZWFkeSBmb3IgbG9hZGluZywgaWYgbm90LCBnZXQgZG93bmxvYWQgaGludHMuCisqICAgICAgICAgICBDaGVjayB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyByZWFkeSBmb3IgbG9hZGluZywgaWYgbm90LCBnZXQKKyogZG93bmxvYWQgaGludHMuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCi0qICAgICAgICAgICBoaW50cyAgICAgICAtICAgUG9pbnRlciB0byBhIGRvd25sb2FkIGhpbnRzIGludGVyZmFjZSwgcmVjZWl2aW5nIGdlbmVyYXRlZCBoaW50cworKiAgICAgICAgICAgYXZhaWwgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCBhdmFpbGFiaWxpdHkgcHJvdmlkZXIgcmV0dXJuZWQgYnkKKyogRlBERkF2YWlsX0NyZWF0ZQorKiAgICAgICAgICAgaGludHMgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3dubG9hZCBoaW50cyBpbnRlcmZhY2UsIHJlY2VpdmluZworKiBnZW5lcmF0ZWQgaGludHMKICogUmV0dXJuIHZhbHVlOgogKiAgICAgICAgICAgTm9uLXplcm8gZm9yIHBhZ2UgaXMgZnVsbHkgYXZhaWxhYmxlLCAwIGZvciBwYWdlIG5vdCB5ZXQgYXZhaWxhYmxlLgogKiBDb21tZW50czoKLSogICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW5ldmVyIG5ldyBkYXRhIGFycml2ZWQsIGFuZCBwcm9jZXNzIGFsbCB0aGUKLSogICAgICAgICAgIGdlbmVyYXRlZCBkb3dubG9hZCBoaW50cyBpZiBhbnksIHVudGlsIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHZhbHVlLiBUaGVuIHRoZQotKiAgICAgICAgICAgYXBwbGljYXRpb24gY2FuIGNhbGwgRlBERkF2YWlsX0dldERvY3VtZW50KCkgdG8gZ2V0IGEgZG9jdW1lbnQgaGFuZGxlLgorKiAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwKKyogYW5kIHByb2Nlc3MgYWxsIHRoZQorKiAgICAgICAgICAgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8KKyogdmFsdWUuIFRoZW4gdGhlCisqICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gY2FsbCBGUERGQXZhaWxfR2V0RG9jdW1lbnQoKSB0byBnZXQgYSBkb2N1bWVudAorKiBoYW5kbGUuCiAqLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0RvY0F2YWlsKEZQREZfQVZBSUwgYXZhaWwsIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNEb2NBdmFpbChGUERGX0FWQUlMIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKTsKIAogLyoqCiAqIEZ1bmN0aW9uOiBGUERGQXZhaWxfR2V0RG9jdW1lbnQKICogICAgICAgICAgIEdldCBkb2N1bWVudCBmcm9tIHRoZSBhdmFpbGFiaWxpdHkgcHJvdmlkZXIuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCisqICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieQorKiBGUERGQXZhaWxfQ3JlYXRlCiAqICAgICBwYXNzd29yZCAgLSAgIE9wdGlvbmFsIHBhc3N3b3JkIGZvciBkZWNyeXB0aW5nIHRoZSBQREYgZmlsZS4KICogUmV0dXJuIHZhbHVlOgogKiAgICAgICAgICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4KICogQ29tbWVudHM6Ci0qICAgICAgICAgICBBZnRlciBGUERGQXZhaWxfSXNEb2NBdmFpbCgpIHJldHVybnMgVFJVRSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KLSogICAgICAgICAgIGdldCB0aGUgZG9jdW1lbnQgaGFuZGxlLiBUbyBjbG9zZSB0aGUgZG9jdW1lbnQsIHVzZSBGUERGX0Nsb3NlRG9jdW1lbnQgZnVuY3Rpb24uCisqICAgICAgICAgICBBZnRlciBGUERGQXZhaWxfSXNEb2NBdmFpbCgpIHJldHVybnMgVFJVRSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZAorKiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KKyogICAgICAgICAgIGdldCB0aGUgZG9jdW1lbnQgaGFuZGxlLiBUbyBjbG9zZSB0aGUgZG9jdW1lbnQsIHVzZQorKiBGUERGX0Nsb3NlRG9jdW1lbnQgZnVuY3Rpb24uCiAqLwogRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGQXZhaWxfR2V0RG9jdW1lbnQoRlBERl9BVkFJTCBhdmFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBwYXNzd29yZCk7CkBAIC0xNTEsNyArMTczLDggQEAKICogUmV0dXJuIFZhbHVlOgogKiAgICAgICAgICAgWmVyby1iYXNlZCBpbmRleCBmb3IgdGhlIGZpcnN0IGF2YWlsYWJsZSBwYWdlLgogKiBDb21tZW50czoKLSogICAgICAgICAgIEZvciBtb3N0IGxpbmVhcml6ZWQgUERGcywgdGhlIGZpcnN0IGF2YWlsYWJsZSBwYWdlIHdvdWxkIGJlIGp1c3QgdGhlIGZpcnN0IHBhZ2UsIGhvd2V2ZXIsCisqICAgICAgICAgICBGb3IgbW9zdCBsaW5lYXJpemVkIFBERnMsIHRoZSBmaXJzdCBhdmFpbGFibGUgcGFnZSB3b3VsZCBiZSBqdXN0IHRoZQorKiBmaXJzdCBwYWdlLCBob3dldmVyLAogKiAgICAgICAgICAgc29tZSBQREZzIG1pZ2h0IG1ha2Ugb3RoZXIgcGFnZSB0byBiZSB0aGUgZmlyc3QgYXZhaWxhYmxlIHBhZ2UuCiAqICAgICAgICAgICBGb3Igbm9uLWxpbmVhcml6ZWQgUERGLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiB6ZXJvLgogKi8KQEAgLTE1OSw1NyArMTgyLDc4IEBACiAKIC8qKgogKiBGdW5jdGlvbjogRlBERkF2YWlsX0lzUGFnZUF2YWlsCi0qICAgICAgICAgICBDaGVjayB3aGV0aGVyIGEgcGFnZSBpcyByZWFkeSBmb3IgbG9hZGluZywgaWYgbm90LCBnZXQgZG93bmxvYWQgaGludHMuCisqICAgICAgICAgICBDaGVjayB3aGV0aGVyIGEgcGFnZSBpcyByZWFkeSBmb3IgbG9hZGluZywgaWYgbm90LCBnZXQgZG93bmxvYWQKKyogaGludHMuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCisqICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieQorKiBGUERGQXZhaWxfQ3JlYXRlCiAqICAgICAgICAgICBwYWdlX2luZGV4ICAtICAgSW5kZXggbnVtYmVyIG9mIHRoZSBwYWdlLiAwIGZvciB0aGUgZmlyc3QgcGFnZS4KLSogICAgICAgICAgIGhpbnRzICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG93bmxvYWQgaGludHMgaW50ZXJmYWNlLCByZWNlaXZpbmcgZ2VuZXJhdGVkIGhpbnRzCisqICAgICAgICAgICBoaW50cyAgICAgICAtICAgUG9pbnRlciB0byBhIGRvd25sb2FkIGhpbnRzIGludGVyZmFjZSwgcmVjZWl2aW5nCisqIGdlbmVyYXRlZCBoaW50cwogKiBSZXR1cm4gdmFsdWU6CiAqICAgICAgICAgICBOb24temVybyBmb3IgcGFnZSBpcyBmdWxseSBhdmFpbGFibGUsIDAgZm9yIHBhZ2Ugbm90IHlldCBhdmFpbGFibGUuCiAqIENvbW1lbnRzOgotKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYWxsIGJlIGNhbGxlZCBvbmx5IGFmdGVyIEZQREZBdmFpbF9HZXREb2N1bWVudCBpZiBjYWxsZWQuCi0qICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuZXZlciBuZXcgZGF0YSBhcnJpdmVkLCBhbmQgcHJvY2VzcyBhbGwgdGhlCi0qICAgICAgICAgICBnZW5lcmF0ZWQgZG93bmxvYWQgaGludHMgaWYgYW55LCB1bnRpbCB0aGUgZnVuY3Rpb24gcmV0dXJucyBub24temVybyB2YWx1ZS4gVGhlbiB0aGUKKyogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbCBiZSBjYWxsZWQgb25seSBhZnRlciBGUERGQXZhaWxfR2V0RG9jdW1lbnQgaWYKKyogY2FsbGVkLgorKiAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwKKyogYW5kIHByb2Nlc3MgYWxsIHRoZQorKiAgICAgICAgICAgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8KKyogdmFsdWUuIFRoZW4gdGhlCiAqICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gcGVyZm9ybSBwYWdlIGxvYWRpbmcuCiAqLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc1BhZ2VBdmFpbChGUERGX0FWQUlMIGF2YWlsLCBpbnQgcGFnZV9pbmRleCwgRlhfRE9XTkxPQURISU5UUyogaGludHMpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc1BhZ2VBdmFpbChGUERGX0FWQUlMIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9XTkxPQURISU5UUyogaGludHMpOwogCiAvKioKICogRnVuY3Rpb246IEZQREZBdmFpbF9JU0Zvcm1BdmFpbAotKiAgICAgICAgICAgQ2hlY2sgd2hldGhlciBGb3JtIGRhdGEgaXMgcmVhZHkgZm9yIGluaXQsIGlmIG5vdCwgZ2V0IGRvd25sb2FkIGhpbnRzLgorKiAgICAgICAgICAgQ2hlY2sgd2hldGhlciBGb3JtIGRhdGEgaXMgcmVhZHkgZm9yIGluaXQsIGlmIG5vdCwgZ2V0IGRvd25sb2FkCisqIGhpbnRzLgogKgogKiBQYXJhbWV0ZXJzOgotKiAgICAgICAgICAgYXZhaWwgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCBhdmFpbGFiaWxpdHkgcHJvdmlkZXIgcmV0dXJuZWQgYnkgRlBERkF2YWlsX0NyZWF0ZQotKiAgICAgICAgICAgaGludHMgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3dubG9hZCBoaW50cyBpbnRlcmZhY2UsIHJlY2VpdmluZyBnZW5lcmF0ZWQgaGludHMKKyogICAgICAgICAgIGF2YWlsICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQgYXZhaWxhYmlsaXR5IHByb3ZpZGVyIHJldHVybmVkIGJ5CisqIEZQREZBdmFpbF9DcmVhdGUKKyogICAgICAgICAgIGhpbnRzICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG93bmxvYWQgaGludHMgaW50ZXJmYWNlLCByZWNlaXZpbmcKKyogZ2VuZXJhdGVkIGhpbnRzCiAqIFJldHVybiB2YWx1ZToKLSogICAgICAgICAgIE5vbi16ZXJvIGZvciBGb3JtIGRhdGEgaXMgZnVsbHkgYXZhaWxhYmxlLCAwIGZvciBGb3JtIGRhdGEgbm90IHlldCBhdmFpbGFibGUuCi0qICAgICAgICAgICBEZXRhaWxzOiAtMSAtIGVycm9yLCB0aGUgaW5wdXQgcGFyYW1ldGVyIG5vdCBjb3JyZWN0LCBzdWNoIGFzIGhpbnRzIGlzIG51bGwuCisqICAgICAgICAgICBOb24temVybyBmb3IgRm9ybSBkYXRhIGlzIGZ1bGx5IGF2YWlsYWJsZSwgMCBmb3IgRm9ybSBkYXRhIG5vdCB5ZXQKKyogYXZhaWxhYmxlLgorKiAgICAgICAgICAgRGV0YWlsczogLTEgLSBlcnJvciwgdGhlIGlucHV0IHBhcmFtZXRlciBub3QgY29ycmVjdCwgc3VjaCBhcyBoaW50cworKiBpcyBudWxsLgogKiAgICAgICAgICAgICAgICAgICAgMCAgLSBkYXRhIG5vdCBhdmFpbGFibGUKICogICAgICAgICAgICAgICAgICAgIDEgIC0gZGF0YSBhdmFpbGFibGUKICogICAgICAgICAgICAgICAgICAgIDIgIC0gbm8gZm9ybSBkYXRhLgogKiBDb21tZW50czoKLSogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbCBiZSBjYWxsZWQgb25seSBhZnRlciBGUERGQXZhaWxfR2V0RG9jdW1lbnQgaWYgY2FsbGVkLgotKiAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwgYW5kIHByb2Nlc3MgYWxsIHRoZQotKiAgICAgICAgICAgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gdmFsdWUuIFRoZW4gdGhlCi0qICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gcGVyZm9ybSBwYWdlIGxvYWRpbmcuIFJlY29tbWVuZCB0byBjYWxsIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQKKyogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbCBiZSBjYWxsZWQgb25seSBhZnRlciBGUERGQXZhaWxfR2V0RG9jdW1lbnQgaWYKKyogY2FsbGVkLgorKiAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwKKyogYW5kIHByb2Nlc3MgYWxsIHRoZQorKiAgICAgICAgICAgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8KKyogdmFsdWUuIFRoZW4gdGhlCisqICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gcGVyZm9ybSBwYWdlIGxvYWRpbmcuIFJlY29tbWVuZCB0byBjYWxsCisqIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQKICogICAgICAgICAgIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHZhbHVlLgogKi8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNGb3JtQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwgRlhfRE9XTkxPQURISU5UUyogaGludHMpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChGUERGX0FWQUlMIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1dOTE9BREhJTlRTKiBoaW50cyk7CiAKIC8qKgogKiBGdW5jdGlvbjogRlBERkF2YWlsX0lzTGluZWFyaXplZAogKiAgICAgICAgICAgVG8gY2hlY2sgd2hldGhlciBhIGRvY3VtZW50IGlzIExpbmVhcml6ZWQgUERGIGZpbGUuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCisqICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieQorKiBGUERGQXZhaWxfQ3JlYXRlCiAqIFJldHVybiB2YWx1ZToKICogICAgICAgICAgIHJldHVybiBUUlVFIG1lYW5zIHRoZSBkb2N1bWVudCBpcyBsaW5lYXJpemVkIFBERiBlbHNlIG5vdC4KICogICAgICAgICAgIEZTREtfSVNfTElORUFSSVpFRCBpcyBhIGxpbmVhcml6ZSBmaWxlLgogKiAgICAgICAgICAgRlNES19OT1RfTElORUFSSVpFRCBpcyBub3QgYSBsaW5lYXJpemUgZmlsZS4KLSogICAgICAgICAgIEZTREtfVU5LTk9XX0xJTkVBUklaRUQgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSBmaWxlIGlzIGEgbGluZWFyaXplIGZpbGUuCisqICAgICAgICAgICBGU0RLX1VOS05PV19MSU5FQVJJWkVEIGRvbid0IGtub3cgd2hldGhlciB0aGUgZmlsZSBpcyBhIGxpbmVhcml6ZQorKiBmaWxlLgogKiBDb21tZW50czoKLSogICAgICAgICAgIEl0IHJldHVybiBUUlVFL0ZBTFNFIGFzIHNvb24gYXMgd2UgaGF2ZSBmaXJzdCAxSyBkYXRhLiAgSWYgdGhlIGZpbGUncyBzaXplIGxlc3MgdGhhbgorKiAgICAgICAgICAgSXQgcmV0dXJuIFRSVUUvRkFMU0UgYXMgc29vbiBhcyB3ZSBoYXZlIGZpcnN0IDFLIGRhdGEuICBJZiB0aGUKKyogZmlsZSdzIHNpemUgbGVzcyB0aGFuCiAqICAgICAgICAgICAxSyx3ZSBkb24ndCBrbm93biB3aGV0aGVyIHRoZSBQREYgaXMgYSBsaW5lYXJpemVkIGZpbGUuCiAqCiAqLwpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfZG9jLmggYi9wdWJsaWMvZnBkZl9kb2MuaAppbmRleCAwZmUxYWFlLi45ZTNmMGFmIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9kb2MuaAorKysgYi9wdWJsaWMvZnBkZl9kb2MuaApAQCAtMTUsMjQgKzE1LDMyIEBACiAjZW5kaWYKIAogLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19HZXRGaXJzdENoaWxkCi0vLyAgICAgICAgICBHZXQgdGhlIGZpcnN0IGNoaWxkIG9mIGEgYm9va21hcmsgaXRlbSwgb3IgdGhlIGZpcnN0IHRvcCBsZXZlbCBib29rbWFyayBpdGVtLgorLy8gICAgICAgICAgR2V0IHRoZSBmaXJzdCBjaGlsZCBvZiBhIGJvb2ttYXJrIGl0ZW0sIG9yIHRoZSBmaXJzdCB0b3AgbGV2ZWwKKy8vICAgICAgICAgIGJvb2ttYXJrIGl0ZW0uCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgotLy8gICAgICAgICAgYm9va21hcmsgICAgLSAgIEhhbmRsZSB0byB0aGUgY3VycmVudCBib29rbWFyay4gQ2FuIGJlIE5VTEwgaWYgeW91IHdhbnQgdG8gZ2V0IHRoZSBmaXJzdCB0b3AgbGV2ZWwgaXRlbS4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9Mb2FkTWVtRG9jdW1lbnQuCisvLyAgICAgICAgICBib29rbWFyayAgICAtICAgSGFuZGxlIHRvIHRoZSBjdXJyZW50IGJvb2ttYXJrLiBDYW4gYmUgTlVMTCBpZiB5b3UKKy8vICAgICAgICAgIHdhbnQgdG8gZ2V0IHRoZSBmaXJzdCB0b3AgbGV2ZWwgaXRlbS4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgZmlyc3QgY2hpbGQgb3IgdG9wIGxldmVsIGJvb2ttYXJrIGl0ZW0uIE5VTEwgaWYgbm8gY2hpbGQgb3IgdG9wIGxldmVsIGJvb2ttYXJrIGZvdW5kLgorLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBmaXJzdCBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgaXRlbS4gTlVMTCBpZiBubworLy8gICAgICAgICAgY2hpbGQgb3IgdG9wIGxldmVsIGJvb2ttYXJrIGZvdW5kLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0dldEZpcnN0Q2hpbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBib29rbWFyayk7CitETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMCitGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKIAogLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19HZXROZXh0U2libGluZwogLy8gICAgICAgICAgR2V0IG5leHQgYm9va21hcmsgaXRlbSBhdCB0aGUgc2FtZSBsZXZlbC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9Mb2FkTWVtRG9jdW1lbnQuCisvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgogLy8gICAgICAgICAgYm9va21hcmsgICAgLSAgIEhhbmRsZSB0byB0aGUgY3VycmVudCBib29rbWFyay4gQ2Fubm90IGJlIE5VTEwuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIG5leHQgYm9va21hcmsgaXRlbSBhdCB0aGUgc2FtZSBsZXZlbC4gTlVMTCBpZiB0aGlzIGlzIHRoZSBsYXN0IGJvb2ttYXJrIGF0IHRoaXMgbGV2ZWwuCisvLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIG5leHQgYm9va21hcmsgaXRlbSBhdCB0aGUgc2FtZSBsZXZlbC4gTlVMTCBpZiB0aGlzIGlzCisvLyAgICAgICAgICB0aGUgbGFzdCBib29rbWFyayBhdCB0aGlzIGxldmVsLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQk9PS01BUksgYm9va21hcmspOworRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTAorRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQk9PS01BUksgYm9va21hcmspOwogCiAvLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldFRpdGxlCiAvLyAgICAgICAgICBHZXQgdGl0bGUgb2YgYSBib29rbWFyay4KQEAgLTQzLDI3ICs1MSwzOCBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSB0aXRsZSBjb25zdW1lcywgaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9zLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBSZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybSwgdGhlIHRpdGxlIGlzIGFsd2F5cyBpbiBVVEYtMTZMRSBlbmNvZGluZy4gVGhhdCBtZWFucyB0aGUgYnVmZmVyCi0vLyAgICAgICAgICBjYW4gYmUgdHJlYXRlZCBhcyBhbiBhcnJheSBvZiBXT1JEIChvbiBJbnRlbCBhbmQgY29tcGF0aWJsZSBDUFVzKSwgZWFjaCBXT1JEIHJlcHJlc2VudGluZyB0aGUgVW5pY29kZSBvZgotLy8gICAgICAgICAgYSBjaGFyYWN0ZXIoc29tZSBzcGVjaWFsIFVuaWNvZGUgbWF5IHRha2UgMiBXT1JEcykuVGhlIHN0cmluZyBpcyBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybworLy8gICAgICAgICAgUmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0sIHRoZSB0aXRsZSBpcyBhbHdheXMgaW4gVVRGLTE2TEUKKy8vICAgICAgICAgIGVuY29kaW5nLiBUaGF0IG1lYW5zIHRoZSBidWZmZXIKKy8vICAgICAgICAgIGNhbiBiZSB0cmVhdGVkIGFzIGFuIGFycmF5IG9mIFdPUkQgKG9uIEludGVsIGFuZCBjb21wYXRpYmxlIENQVXMpLAorLy8gICAgICAgICAgZWFjaCBXT1JEIHJlcHJlc2VudGluZyB0aGUgVW5pY29kZSBvZgorLy8gICAgICAgICAgYSBjaGFyYWN0ZXIoc29tZSBzcGVjaWFsIFVuaWNvZGUgbWF5IHRha2UgMiBXT1JEcykuVGhlIHN0cmluZyBpcworLy8gICAgICAgICAgZm9sbG93ZWQgYnkgdHdvIGJ5dGVzIG9mIHplcm8KIC8vICAgICAgICAgIGluZGljYXRpbmcgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgogLy8KLS8vICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIGlmIG5vIGJ1ZmZlciBpcyBzcGVjaWZpZWQKLS8vICAgICAgICAgIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoZXNlIGNhc2VzLCB0aGUgYnVmZmVyIHdpbGwgbm90IGJlIG1vZGlmaWVkLgorLy8gICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yCisvLyAgICAgICAgICB0aGUgYnVmZmVyLCBldmVuIGlmIG5vIGJ1ZmZlciBpcyBzcGVjaWZpZWQKKy8vICAgICAgICAgIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoZXNlIGNhc2VzLCB0aGUgYnVmZmVyCisvLyAgICAgICAgICB3aWxsIG5vdCBiZSBtb2RpZmllZC4KIC8vCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZCb29rbWFya19HZXRUaXRsZShGUERGX0JPT0tNQVJLIGJvb2ttYXJrLCB2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKK0RMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkJvb2ttYXJrX0dldFRpdGxlKEZQREZfQk9PS01BUksgYm9va21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfRmluZAogLy8gICAgICAgICAgRmluZCBhIGJvb2ttYXJrIGluIHRoZSBkb2N1bWVudCwgdXNpbmcgdGhlIGJvb2ttYXJrIHRpdGxlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBvciBGUERGX0xvYWRNZW1Eb2N1bWVudC4KLS8vICAgICAgICAgIHRpdGxlICAgICAgIC0gICBUaGUgVVRGLTE2TEUgZW5jb2RlZCBVbmljb2RlIHN0cmluZyBmb3IgdGhlIGJvb2ttYXJrIHRpdGxlIHRvIGJlIHNlYXJjaGVkLiBDYW4ndCBiZSBOVUxMLgorLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGX0xvYWREb2N1bWVudCBvciBGUERGX0xvYWRNZW1Eb2N1bWVudC4KKy8vICAgICAgICAgIHRpdGxlICAgICAgIC0gICBUaGUgVVRGLTE2TEUgZW5jb2RlZCBVbmljb2RlIHN0cmluZyBmb3IgdGhlIGJvb2ttYXJrCisvLyAgICAgICAgICB0aXRsZSB0byBiZSBzZWFyY2hlZC4gQ2FuJ3QgYmUgTlVMTC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgZm91bmQgYm9va21hcmsgaXRlbS4gTlVMTCBpZiB0aGUgdGl0bGUgY2FuJ3QgYmUgZm91bmQuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIEl0IGFsd2F5cyByZXR1cm5zIHRoZSBmaXJzdCBmb3VuZCBib29rbWFyayBpZiBtb3JlIHRoYW4gb25lIGJvb2ttYXJrcyBoYXZlIHRoZSBzYW1lIHRpdGxlLgorLy8gICAgICAgICAgSXQgYWx3YXlzIHJldHVybnMgdGhlIGZpcnN0IGZvdW5kIGJvb2ttYXJrIGlmIG1vcmUgdGhhbiBvbmUKKy8vICAgICAgICAgIGJvb2ttYXJrcyBoYXZlIHRoZSBzYW1lIHRpdGxlLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0ZpbmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURFU1RSSU5HIHRpdGxlKTsKK0RMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0ZpbmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHRpdGxlKTsKIAogLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19HZXREZXN0CiAvLyAgICAgICAgICBHZXQgdGhlIGRlc3RpbmF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGJvb2ttYXJrIGl0ZW0uCkBAIC03MSwyNiArOTAsMzAgQEAKIC8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgogLy8gICAgICAgICAgYm9va21hcmsgICAgLSAgIEhhbmRsZSB0byB0aGUgYm9va21hcmsuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEuIE5VTEwgaWYgbm8gZGVzdGluYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYm9va21hcmsuCisvLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEuIE5VTEwgaWYgbm8gZGVzdGluYXRpb24gaXMgYXNzb2NpYXRlZAorLy8gICAgICAgICAgd2l0aCB0aGlzIGJvb2ttYXJrLgogLy8KLURMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKK0RMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PS01BUksgYm9va21hcmspOwogCiAvLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldEFjdGlvbgogLy8gICAgICAgICAgR2V0IHRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgYm9va21hcmsgaXRlbS4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBib29rbWFyayAgICAtICAgSGFuZGxlIHRvIHRoZSBib29rbWFyay4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgYWN0aW9uIGRhdGEuIE5VTEwgaWYgbm8gYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJvb2ttYXJrLiBJbiB0aGlzIGNhc2UsIHRoZQorLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24gZGF0YS4gTlVMTCBpZiBubyBhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKy8vICAgICAgICAgIGJvb2ttYXJrLiBJbiB0aGlzIGNhc2UsIHRoZQogLy8gICAgICAgICAgYXBwbGljYXRpb24gc2hvdWxkIHRyeSBGUERGQm9va21hcmtfR2V0RGVzdC4KIC8vCiBETExFWFBPUlQgRlBERl9BQ1RJT04gU1REQ0FMTCBGUERGQm9va21hcmtfR2V0QWN0aW9uKEZQREZfQk9PS01BUksgYm9va21hcmspOwogCi0jZGVmaW5lIFBERkFDVElPTl9VTlNVUFBPUlRFRCAgICAgICAwICAgICAgIC8vIFVuc3VwcG9ydGVkIGFjdGlvbiB0eXBlLgotI2RlZmluZSBQREZBQ1RJT05fR09UTyAgICAgICAgICAgICAgMSAgICAgICAvLyBHbyB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiBjdXJyZW50IGRvY3VtZW50LgotI2RlZmluZSBQREZBQ1RJT05fUkVNT1RFR09UTyAgICAgICAgMiAgICAgICAvLyBHbyB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiBhbm90aGVyIGRvY3VtZW50LgotI2RlZmluZSBQREZBQ1RJT05fVVJJICAgICAgICAgICAgICAgMyAgICAgICAvLyBVbml2ZXJzYWwgUmVzb3VyY2UgSWRlbnRpZmllciwgaW5jbHVkaW5nIHdlYiBwYWdlcyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgSW50ZXJuZXQgYmFzZWQgcmVzb3VyY2VzLgotI2RlZmluZSBQREZBQ1RJT05fTEFVTkNIICAgICAgICAgICAgNCAgICAgICAvLyBMYXVuY2ggYW4gYXBwbGljYXRpb24gb3Igb3BlbiBhIGZpbGUuCisjZGVmaW5lIFBERkFDVElPTl9VTlNVUFBPUlRFRCAwICAvLyBVbnN1cHBvcnRlZCBhY3Rpb24gdHlwZS4KKyNkZWZpbmUgUERGQUNUSU9OX0dPVE8gMSAgICAgICAgIC8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGN1cnJlbnQgZG9jdW1lbnQuCisjZGVmaW5lIFBERkFDVElPTl9SRU1PVEVHT1RPIDIgICAvLyBHbyB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiBhbm90aGVyIGRvY3VtZW50LgorI2RlZmluZSBQREZBQ1RJT05fVVJJIFwKKyAgMyAgLy8gVW5pdmVyc2FsIFJlc291cmNlIElkZW50aWZpZXIsIGluY2x1ZGluZyB3ZWIgcGFnZXMgYW5kCisgICAgIC8vIG90aGVyIEludGVybmV0IGJhc2VkIHJlc291cmNlcy4KKyNkZWZpbmUgUERGQUNUSU9OX0xBVU5DSCA0ICAvLyBMYXVuY2ggYW4gYXBwbGljYXRpb24gb3Igb3BlbiBhIGZpbGUuCiAKIC8vIEZ1bmN0aW9uOiBGUERGQWN0aW9uX0dldFR5cGUKIC8vICAgICAgICAgIEdldCB0eXBlIG9mIGFuIGFjdGlvbi4KQEAgLTEwNSwxNSArMTI4LDE5IEBACiAvLyAgICAgICAgICBHZXQgZGVzdGluYXRpb24gb2YgYW4gYWN0aW9uLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgotLy8gICAgICAgICAgYWN0aW9uICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYWN0aW9uLiBJdCBtdXN0IGJlIGEgR09UTyBvciBSRU1PVEVHT1RPIGFjdGlvbi4KKy8vICAgICAgICAgIGFjdGlvbiAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGFjdGlvbi4gSXQgbXVzdCBiZSBhIEdPVE8gb3IKKy8vICAgICAgICAgIFJFTU9URUdPVE8gYWN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbiBkYXRhLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBJbiBjYXNlIG9mIHJlbW90ZSBnb3RvIGFjdGlvbiwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBmaXJzdCB1c2UgRlBERkFjdGlvbl9HZXRGaWxlUGF0aCB0bwotLy8gICAgICAgICAgZ2V0IGZpbGUgcGF0aCwgdGhlbiBsb2FkIHRoYXQgcGFydGljdWxhciBkb2N1bWVudCwgYW5kIHVzZSBpdHMgZG9jdW1lbnQgaGFuZGxlIHRvIGNhbGwgdGhpcworLy8gICAgICAgICAgSW4gY2FzZSBvZiByZW1vdGUgZ290byBhY3Rpb24sIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZmlyc3QgdXNlCisvLyAgICAgICAgICBGUERGQWN0aW9uX0dldEZpbGVQYXRoIHRvCisvLyAgICAgICAgICBnZXQgZmlsZSBwYXRoLCB0aGVuIGxvYWQgdGhhdCBwYXJ0aWN1bGFyIGRvY3VtZW50LCBhbmQgdXNlIGl0cworLy8gICAgICAgICAgZG9jdW1lbnQgaGFuZGxlIHRvIGNhbGwgdGhpcwogLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLwotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZBY3Rpb25fR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0FDVElPTiBhY3Rpb24pOworRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZBY3Rpb25fR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0FDVElPTiBhY3Rpb24pOwogCiAvLyBGdW5jdGlvbjogRlBERkFjdGlvbl9HZXRVUklQYXRoCiAvLyAgICAgICAgICBHZXQgVVJJIHBhdGggb2YgYSBVUkkgYWN0aW9uLgpAQCAtMTI3LDEyICsxNTQsMTYgQEAKIC8vIENvbW1lbnRzOgogLy8gICAgICAgICAgVGhlIFVSSSBwYXRoIGlzIGFsd2F5cyBlbmNvZGVkIGluIDctYml0IEFTQ0lJLgogLy8KLS8vICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlZCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcwotLy8gICAgICAgICAgbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90CisvLyAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUKKy8vICAgICAgICAgIGJ1ZmZlciwgZXZlbiB3aGVuIHRoZXJlIGlzCisvLyAgICAgICAgICBubyBidWZmZXIgc3BlY2lmaWVkLCBvciB0aGUgYnVmZmVyIHNpemUgaXMgbGVzcyB0aGVuIHJlcXVpcmVkLiBJbgorLy8gICAgICAgICAgdGhpcyBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90CiAvLyAgICAgICAgICBiZSBtb2RpZmllZC4KIC8vCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZBY3Rpb25fR2V0VVJJUGF0aChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0FDVElPTiBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKK0RMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRVUklQYXRoKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0FDVElPTiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGRGVzdF9HZXRQYWdlSW5kZXgKIC8vICAgICAgICAgIEdldCBwYWdlIGluZGV4IG9mIGEgZGVzdGluYXRpb24uCkBAIC0xNDIsNjcgKzE3Myw4NiBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIHBhZ2UgaW5kZXguIFN0YXJ0aW5nIGZyb20gMCBmb3IgdGhlIGZpcnN0IHBhZ2UuCiAvLwotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGRGVzdF9HZXRQYWdlSW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9ERVNUIGRlc3QpOworRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGRGVzdF9HZXRQYWdlSW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfREVTVCBkZXN0KTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldExpbmtBdFBvaW50CiAvLyAgICAgICAgICBGaW5kIGEgbGluayBhdCBzcGVjaWZpZWQgcG9pbnQgb24gYSBkb2N1bWVudCBwYWdlLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50IHBhZ2UuCi0vLyAgICAgICAgICB4ICAgICAgICAgICAtICAgVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQsIHNwZWNpZmllZCBpbiBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLgotLy8gICAgICAgICAgeSAgICAgICAgICAgLSAgIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZSBjb29yZGluYXRlIHN5c3RlbS4KKy8vICAgICAgICAgIHggICAgICAgICAgIC0gICBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCwgc3BlY2lmaWVkIGluIHBhZ2UKKy8vICAgICAgICAgIGNvb3JkaW5hdGUgc3lzdGVtLgorLy8gICAgICAgICAgeSAgICAgICAgICAgLSAgIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZQorLy8gICAgICAgICAgY29vcmRpbmF0ZSBzeXN0ZW0uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGxpbmsuIE5VTEwgaWYgbm8gbGluayBmb3VuZCBhdCB0aGF0IHBvaW50LgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBUaGUgcG9pbnQgY29vcmRpbmF0ZXMgYXJlIHNwZWNpZmllZCBpbiBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLiBZb3UgY2FuIGNvbnZlcnQgY29vcmRpbmF0ZXMKKy8vICAgICAgICAgIFRoZSBwb2ludCBjb29yZGluYXRlcyBhcmUgc3BlY2lmaWVkIGluIHBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uIFlvdQorLy8gICAgICAgICAgY2FuIGNvbnZlcnQgY29vcmRpbmF0ZXMKIC8vICAgICAgICAgIGZyb20gc2NyZWVuIHN5c3RlbSB0byBwYWdlIHN5c3RlbSB1c2luZyBGUERGX0RldmljZVRvUGFnZSBmdW5jdGlvbnMuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIEZQREZfTElOSyBTVERDQUxMIEZQREZMaW5rX0dldExpbmtBdFBvaW50KEZQREZfUEFHRSBwYWdlLCBkb3VibGUgeCwgZG91YmxlIHkpOworRExMRVhQT1JUIEZQREZfTElOSyBTVERDQUxMIEZQREZMaW5rX0dldExpbmtBdFBvaW50KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5KTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldERlc3QKIC8vICAgICAgICAgIEdldCBkZXN0aW5hdGlvbiBpbmZvIG9mIGEgbGluay4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4KLS8vICAgICAgICAgIGxpbmsgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsuIFJldHVybmVkIGJ5IEZQREZMaW5rX0dldExpbmtBdFBvaW50LgorLy8gICAgICAgICAgbGluayAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgbGluay4gUmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZMaW5rX0dldExpbmtBdFBvaW50LgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmssIGluIHRoaXMgY2FzZQorLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbgorLy8gICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBpbiB0aGlzIGNhc2UKIC8vICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IEZQREZMaW5rX0dldEFjdGlvbi4KIC8vCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0xJTksgbGluayk7CitETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9MSU5LIGxpbmspOwogCiAvLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0QWN0aW9uCiAvLyAgICAgICAgICBHZXQgYWN0aW9uIGluZm8gb2YgYSBsaW5rLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGxpbmsgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGFjdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLgorLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uIE5VTEwgaWYgdGhlcmUgaXMgbm8gYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUKKy8vICAgICAgICAgIGxpbmsuCiAvLwogRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBsaW5rKTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0VudW1lcmF0ZQotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB3b3VsZCBlbnVtZXJhdGUgYWxsIHRoZSBsaW5rIGFubm90YXRpb25zIGluIGEgc2luZ2xlIFBERiBwYWdlLgorLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB3b3VsZCBlbnVtZXJhdGUgYWxsIHRoZSBsaW5rIGFubm90YXRpb25zIGluIGEgc2luZ2xlCisvLyAgICAgICAgICBQREYgcGFnZS4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBwYWdlW2luXSAgICAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuCi0vLyAgICAgICAgICBzdGFydFBvc1tpbixvdXRdICAgIC0gICBUaGUgc3RhcnQgcG9zaXRpb24gdG8gZW51bWVyYXRlIHRoZSBsaW5rIGFubm90YXRpb25zLCB3aGljaCBzaG91bGQgYmUgc3BlY2lmaWVkIHRvIHN0YXJ0IGZyb20KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgIDAgZm9yIHRoZSBmaXJzdCBjYWxsLCBhbmQgd291bGQgcmVjZWl2ZSB0aGUgbmV4dCBwb3NpdGlvbiBmb3IgZW51bWVyYXRpbmcgdG8gc3RhcnQgZnJvbS4KKy8vICAgICAgICAgIHN0YXJ0UG9zW2luLG91dF0gICAgLSAgIFRoZSBzdGFydCBwb3NpdGlvbiB0byBlbnVtZXJhdGUgdGhlIGxpbmsKKy8vICAgICAgICAgIGFubm90YXRpb25zLCB3aGljaCBzaG91bGQgYmUgc3BlY2lmaWVkIHRvIHN0YXJ0IGZyb20KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgIDAgZm9yIHRoZSBmaXJzdCBjYWxsLCBhbmQgd291bGQgcmVjZWl2ZSB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBwb3NpdGlvbiBmb3IgZW51bWVyYXRpbmcgdG8gc3RhcnQgZnJvbS4KIC8vICAgICAgICAgIGxpbmtBbm5vdFtvdXRdICAgICAgLSAgIFJlY2VpdmUgdGhlIGxpbmsgaGFuZGxlLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjY2VlZCwgZWxzZSBGYWxzZTsKIC8vIE5vdGVzOgotLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YKKy8vICAgICAgICAgIGR5bmFtaWMgWEZBIGZpZWxkcy4KIC8vCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLCBpbnQqIHN0YXJ0UG9zLCBGUERGX0xJTksqIGxpbmtBbm5vdCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0YXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0xJTksqIGxpbmtBbm5vdCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRBbm5vdFJlY3QKLS8vICAgICAgICAgIEdldCB0aGUgYW5ub3RhdGlvbiByZWN0YW5nbGUuIChTcGVjaWZpZWQgYnkgdGhlIKGwUmVjdKGxIGVudHJ5IG9mIGFubm90YXRpb24gZGljdGlvbmFyeSkuCisvLyAgICAgICAgICBHZXQgdGhlIGFubm90YXRpb24gcmVjdGFuZ2xlLiAoU3BlY2lmaWVkIGJ5IHRoZSChsFJlY3ShsSBlbnRyeSBvZgorLy8gICAgICAgICAgYW5ub3RhdGlvbiBkaWN0aW9uYXJ5KS4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBsaW5rQW5ub3RbaW5dICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KIC8vICAgICAgICAgIHJlY3Rbb3V0XSAgICAgICAgICAgLSAgIFRoZSBhbm5vdGF0aW9uIHJlY3QuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUUlVFIGlmIHN1Y2NjZWVkLCBlbHNlIEZhbHNlOwogLy8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19HZXRBbm5vdFJlY3QoRlBERl9MSU5LIGxpbmtBbm5vdCwgRlNfUkVDVEYqIHJlY3QpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldEFubm90UmVjdChGUERGX0xJTksgbGlua0Fubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19SRUNURiogcmVjdCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19Db3VudFF1YWRQb2ludHMKIC8vICAgICAgICAgIEdldCB0aGUgY291bnQgb2YgcXVhZHJpbGF0ZXJhbCBwb2ludHMgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KQEAgLTIxNiwyMSArMjY2LDIxIEBACiAvKiBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8gKi8KICNpZm5kZWYgX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfCiAjZGVmaW5lIF9GU19ERUZfU1RSVUNUVVJFX1FVQURQT0lOVFNGXwotdHlwZWRlZiBzdHJ1Y3QgX0ZTX1FVQURQT0lOVFNGCi17Ci0gICAgRlNfRkxPQVQgIHgxOwotICAgIEZTX0ZMT0FUICB5MTsKLSAgICBGU19GTE9BVCAgeDI7Ci0gICAgRlNfRkxPQVQgIHkyOwotICAgIEZTX0ZMT0FUICB4MzsKLSAgICBGU19GTE9BVCAgeTM7Ci0gICAgRlNfRkxPQVQgIHg0OwotICAgIEZTX0ZMT0FUICB5NDsKK3R5cGVkZWYgc3RydWN0IF9GU19RVUFEUE9JTlRTRiB7CisgIEZTX0ZMT0FUIHgxOworICBGU19GTE9BVCB5MTsKKyAgRlNfRkxPQVQgeDI7CisgIEZTX0ZMT0FUIHkyOworICBGU19GTE9BVCB4MzsKKyAgRlNfRkxPQVQgeTM7CisgIEZTX0ZMT0FUIHg0OworICBGU19GTE9BVCB5NDsKIH0gRlNfUVVBRFBPSU5UU0Y7CiAjZW5kaWYgLyogX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfICovCiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRRdWFkUG9pbnRzCi0vLyAgICAgICAgICBHZXQgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBsaW5rIGFubm90YXRpb24uCisvLyAgICAgICAgICBHZXQgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBsaW5rCisvLyAgICAgICAgICBhbm5vdGF0aW9uLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGxpbmtBbm5vdFtpbl0gICAgICAgLSAgIEhhbmRsZSB0byB0aGUgbGluayBhbm5vdGF0aW9uLgogLy8gICAgICAgICAgcXVhZEluZGV4W2luXSAgICAgICAtICAgVGhlIHNwZWNpZmllZCBxdWFkIHBvaW50cyBpbmRleC4KQEAgLTIzOCwzMyArMjg4LDQ2IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUcnVlIGlmIHN1Y2NlZWQsIGVsc2UgRmFsc2UuCiAvLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwgaW50IHF1YWRJbmRleCwgRlNfUVVBRFBPSU5UU0YqIHF1YWRQb2ludHMpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19RVUFEUE9JTlRTRiogcXVhZFBvaW50cyk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldE1ldGFUZXh0Ci0vLyAgICAgICAgICBHZXQgYSB0ZXh0IGZyb20gbWV0YSBkYXRhIG9mIHRoZSBkb2N1bWVudC4gUmVzdWx0IGlzIGVuY29kZWQgaW4gVVRGLTE2TEUuCisvLyAgICAgICAgICBHZXQgYSB0ZXh0IGZyb20gbWV0YSBkYXRhIG9mIHRoZSBkb2N1bWVudC4gUmVzdWx0IGlzIGVuY29kZWQgaW4KKy8vICAgICAgICAgIFVURi0xNkxFLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGRvYyAgICAgICAgIC0gICBIYW5kbGUgdG8gYSBkb2N1bWVudAotLy8gICAgICAgICAgdGFnICAgICAgICAgLSAgIFRoZSB0YWcgZm9yIHRoZSBtZXRhIGRhdGEuIEN1cnJlbnRseSwgSXQgY2FuIGJlICJUaXRsZSIsICJBdXRob3IiLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJqZWN0IiwgIktleXdvcmRzIiwgIkNyZWF0b3IiLCAiUHJvZHVjZXIiLCAiQ3JlYXRpb25EYXRlIiwgb3IgIk1vZERhdGUiLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGVzZSB0YWdzIGFuZCB0aGVpciByZXNwZWN0aXZlIHZhbHVlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBwbGVhc2UgcmVmZXIgdG8gUERGIFJlZmVyZW5jZSAxLjYsIHNlY3Rpb24gMTAuMi4xLCAiRG9jdW1lbnQgSW5mb3JtYXRpb24gRGljdGlvbmFyeSIuCisvLyAgICAgICAgICB0YWcgICAgICAgICAtICAgVGhlIHRhZyBmb3IgdGhlIG1ldGEgZGF0YS4gQ3VycmVudGx5LCBJdCBjYW4gYmUKKy8vICAgICAgICAgICJUaXRsZSIsICJBdXRob3IiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJqZWN0IiwgIktleXdvcmRzIiwgIkNyZWF0b3IiLCAiUHJvZHVjZXIiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGlvbkRhdGUiLCBvciAiTW9kRGF0ZSIuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZXNlIHRhZ3MgYW5kIHRoZWlyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZSB2YWx1ZXMsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgcGxlYXNlIHJlZmVyIHRvIFBERiBSZWZlcmVuY2UgMS42LCBzZWN0aW9uIDEwLjIuMSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgSW5mb3JtYXRpb24gRGljdGlvbmFyeSIuCiAvLyAgICAgICAgICBidWZmZXIgICAgICAtICAgQSBidWZmZXIgZm9yIG91dHB1dCB0aGUgdGl0bGUuIENhbiBiZSBOVUxMLgogLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUgMC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0aGUgdGl0bGUgY29uc3VtZXMsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcy4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgTm8gbWF0dGVyIG9uIHdoYXQgcGxhdGZvcm0sIHRoZSB0aXRsZSBpcyBhbHdheXMgb3V0cHV0IGluIFVURi0xNkxFIGVuY29kaW5nLCB3aGljaCBtZWFucyB0aGUgYnVmZmVyCi0vLyAgICAgICAgICBjYW4gYmUgcmVnYXJkZWQgYXMgYW4gYXJyYXkgb2YgV09SRCAob24gSW50ZWwgYW5kIGNvbXBhdGlibGUgQ1BVcyksIGVhY2ggV09SRCByZXByZXNlbnQgdGhlIFVuaWNvZGUgb2YKLS8vICAgICAgICAgIGEgY2hhcmFjdGVyIChzb21lIHNwZWNpYWwgVW5pY29kZSBtYXkgdGFrZSAyIFdPUkRzKS4gVGhlIHN0cmluZyBpcyBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybworLy8gICAgICAgICAgTm8gbWF0dGVyIG9uIHdoYXQgcGxhdGZvcm0sIHRoZSB0aXRsZSBpcyBhbHdheXMgb3V0cHV0IGluIFVURi0xNkxFCisvLyAgICAgICAgICBlbmNvZGluZywgd2hpY2ggbWVhbnMgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgY2FuIGJlIHJlZ2FyZGVkIGFzIGFuIGFycmF5IG9mIFdPUkQgKG9uIEludGVsIGFuZCBjb21wYXRpYmxlIENQVXMpLAorLy8gICAgICAgICAgZWFjaCBXT1JEIHJlcHJlc2VudCB0aGUgVW5pY29kZSBvZgorLy8gICAgICAgICAgYSBjaGFyYWN0ZXIgKHNvbWUgc3BlY2lhbCBVbmljb2RlIG1heSB0YWtlIDIgV09SRHMpLiBUaGUgc3RyaW5nIGlzCisvLyAgICAgICAgICBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybwogLy8gICAgICAgICAgaW5kaWNhdGluZyBlbmQgb2YgdGhlIHN0cmluZy4KIC8vCi0vLyAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIHdoZW4gdGhlcmUgaXMKLS8vICAgICAgICAgIG5vIGJ1ZmZlciBzcGVjaWZpZWQsIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciB3aWxsIG5vdAorLy8gICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgaW5kaWNhdGVkIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlCisvLyAgICAgICAgICBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcworLy8gICAgICAgICAgbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4KKy8vICAgICAgICAgIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciB3aWxsIG5vdAogLy8gICAgICAgICAgYmUgbW9kaWZpZWQuCiAvLwotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldE1ldGFUZXh0KEZQREZfRE9DVU1FTlQgZG9jLCBGUERGX0JZVEVTVFJJTkcgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZsZW4pOwotCitETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0TWV0YVRleHQoRlBERl9ET0NVTUVOVCBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2VkaXQuaCBiL3B1YmxpYy9mcGRmX2VkaXQuaAppbmRleCA3MDMyZDYwLi4yNTNmNjY4IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9lZGl0LmgKKysrIGIvcHVibGljL2ZwZGZfZWRpdC5oCkBAIC0xMSwxNCArMTEsMTggQEAKIAogI2luY2x1ZGUgImZwZGZ2aWV3LmgiCiAKLS8vIERlZmluZSBhbGwgdHlwZXMgdXNlZCBpbiB0aGUgU0RLLiBOb3RlIHRoZXkgY2FuIGJlIHNpbXBseSByZWdhcmRlZCBhcyBvcGFxdWUgcG9pbnRlcnMKKy8vIERlZmluZSBhbGwgdHlwZXMgdXNlZCBpbiB0aGUgU0RLLiBOb3RlIHRoZXkgY2FuIGJlIHNpbXBseSByZWdhcmRlZCBhcyBvcGFxdWUKKy8vIHBvaW50ZXJzCiAvLyBvciBsb25nIGludGVnZXIgbnVtYmVycy4KIAotI2RlZmluZSBGUERGX0FSR0IoYSxyLGcsYikgICAgICAoKCgodWludDMyX3QpKCgodWludDhfdCkoYil8KChGWF9XT1JEKSgodWludDhfdCkoZykpPDw4KSl8KCgoRlhfRFdPUkQpKHVpbnQ4X3QpKHIpKTw8MTYpKSkpIHwgKCgoRlhfRFdPUkQpKHVpbnQ4X3QpKGEpKTw8MjQpKQotI2RlZmluZSBGUERGX0dldEJWYWx1ZShhcmdiKSAgICAoKHVpbnQ4X3QpKGFyZ2IpKQotI2RlZmluZSBGUERGX0dldEdWYWx1ZShhcmdiKSAgICAoKHVpbnQ4X3QpKCgodWludDE2X3QpKGFyZ2IpKSA+PiA4KSkKLSNkZWZpbmUgRlBERl9HZXRSVmFsdWUoYXJnYikgICAgKCh1aW50OF90KSgoYXJnYik+PjE2KSkKLSNkZWZpbmUgRlBERl9HZXRBVmFsdWUoYXJnYikgICAgKCh1aW50OF90KSgoYXJnYik+PjI0KSkKKyNkZWZpbmUgRlBERl9BUkdCKGEsIHIsIGcsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKHVpbnQzMl90KSgoKHVpbnQ4X3QpKGIpIHwgKChGWF9XT1JEKSgodWludDhfdCkoZykpIDw8IDgpKSB8IFwKKyAgICAgICAgICAgICAgICAoKChGWF9EV09SRCkodWludDhfdCkocikpIDw8IDE2KSkpKSB8ICAgICAgICAgICAgIFwKKyAgICgoKEZYX0RXT1JEKSh1aW50OF90KShhKSkgPDwgMjQpKQorI2RlZmluZSBGUERGX0dldEJWYWx1ZShhcmdiKSAoKHVpbnQ4X3QpKGFyZ2IpKQorI2RlZmluZSBGUERGX0dldEdWYWx1ZShhcmdiKSAoKHVpbnQ4X3QpKCgodWludDE2X3QpKGFyZ2IpKSA+PiA4KSkKKyNkZWZpbmUgRlBERl9HZXRSVmFsdWUoYXJnYikgKCh1aW50OF90KSgoYXJnYikgPj4gMTYpKQorI2RlZmluZSBGUERGX0dldEFWYWx1ZShhcmdiKSAoKHVpbnQ4X3QpKChhcmdiKSA+PiAyNCkpCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC00OCw3ICs1Miw4IEBACiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfTmV3CiAvLyAgICAgICAgICBDb25zdHJ1Y3QgYW4gZW1wdHkgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBhbmQgRlBERl9DcmVhdGVOZXdEb2N1bWVudC4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50CisvLyAgICAgICAgICBhbmQgRlBERl9DcmVhdGVOZXdEb2N1bWVudC4KIC8vICAgICAgICAgIHBhZ2VfaW5kZXggIC0gICBUaGUgaW5kZXggb2YgYSBwYWdlLgogLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIFRoZSBwYWdlIHdpZHRoLgogLy8gICAgICAgICAgaGVpZ2h0ICAgICAgLSAgIFRoZSBwYWdlIGhlaWdodC4KQEAgLTU3LDEwOCArNjIsMTM1IEBACiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIExvYWRlZCBwYWdlIGNhbiBiZSBkZWxldGVkIGJ5IEZQREZQYWdlX0RlbGV0ZS4KIC8vIE5vdGVzOgotLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gY3JlYXRlIGEgbmV3IHBhZ2UgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBjcmVhdGUgYSBuZXcgcGFnZSBmb3IgdGhlIGRvY3VtZW50CisvLyAgICAgICAgICBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIEZQREZfUEFHRSBTVERDQUxMIEZQREZQYWdlX05ldyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgcGFnZV9pbmRleCwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KTsKK0RMTEVYUE9SVCBGUERGX1BBR0UgU1REQ0FMTCBGUERGUGFnZV9OZXcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGhlaWdodCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9EZWxldGUKIC8vICAgICAgICAgIERlbGV0ZSBhIFBERiBwYWdlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGFuZCBGUERGX0NyZWF0ZU5ld0RvY3VtZW50LgorLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQKKy8vICAgICAgICAgIGFuZCBGUERGX0NyZWF0ZU5ld0RvY3VtZW50LgogLy8gICAgICAgICAgcGFnZV9pbmRleCAgLSAgIFRoZSBpbmRleCBvZiBhIHBhZ2UuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBkZWxldGUgcGFnZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGRlbGV0ZSBwYWdlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMKKy8vICAgICAgICAgIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KIC8vCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0RlbGV0ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgcGFnZV9pbmRleCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9HZXRSb3RhdGlvbgotLy8gICAgICAgICAgR2V0IHRoZSBwYWdlIHJvdGF0aW9uLiBPbmUgb2YgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGJlIHJldHVybmVkOiAwKDApLCAxKDkwKSwgMigxODApLCAzKDI3MCkuCisvLyAgICAgICAgICBHZXQgdGhlIHBhZ2Ugcm90YXRpb24uIE9uZSBvZiBmb2xsb3dpbmcgdmFsdWVzIHdpbGwgYmUgcmV0dXJuZWQ6CisvLyAgICAgICAgICAwKDApLCAxKDkwKSwgMigxODApLCAzKDI3MCkuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvciBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvcgorLy8gICAgICAgICAgRlBERl9Mb2FkUGFnZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBQREYgcGFnZSByb3RhdGlvbi4KIC8vIENvbW1lbnQ6CiAvLyAgICAgICAgICBUaGUgUERGIHBhZ2Ugcm90YXRpb24gaXMgcm90YXRlZCBjbG9ja3dpc2UuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGdldCB0aGUgcGFnZSByb3RhdGUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBnZXQgdGhlIHBhZ2Ugcm90YXRlIGZvciB0aGUgZG9jdW1lbnQKKy8vICAgICAgICAgIGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KIC8vCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfR2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UpOwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfU2V0Um90YXRpb24KLS8vICAgICAgICAgIFNldCBwYWdlIHJvdGF0aW9uLiBPbmUgb2YgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGJlIHNldDogMCgwKSwgMSg5MCksIDIoMTgwKSwgMygyNzApLgorLy8gICAgICAgICAgU2V0IHBhZ2Ugcm90YXRpb24uIE9uZSBvZiBmb2xsb3dpbmcgdmFsdWVzIHdpbGwgYmUgc2V0OiAwKDApLCAxKDkwKSwKKy8vICAgICAgICAgIDIoMTgwKSwgMygyNzApLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IgRlBERl9Mb2FkUGFnZS4KKy8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IKKy8vICAgICAgICAgIEZQREZfTG9hZFBhZ2UuCiAvLyAgICAgICAgICByb3RhdGUgICAgICAtICAgVGhlIHZhbHVlIG9mIHRoZSBQREYgcGFnZSByb3RhdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBDb21tZW50OgogLy8gICAgICAgICAgVGhlIFBERiBwYWdlIHJvdGF0aW9uIGlzIHJvdGF0ZWQgY2xvY2t3aXNlLgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBzZXQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gc2V0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50CisvLyAgICAgICAgICBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRSb3RhdGlvbihGUERGX1BBR0UgcGFnZSwgaW50IHJvdGF0ZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9JbnNlcnRPYmplY3QKLS8vICAgICAgICAgIEluc2VydCBhbiBvYmplY3QgdG8gdGhlIHBhZ2UuIFRoZSBwYWdlIG9iamVjdCBpcyBhdXRvbWF0aWNhbGx5IGZyZWVkLgorLy8gICAgICAgICAgSW5zZXJ0IGFuIG9iamVjdCB0byB0aGUgcGFnZS4gVGhlIHBhZ2Ugb2JqZWN0IGlzIGF1dG9tYXRpY2FsbHkKKy8vICAgICAgICAgIGZyZWVkLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IgRlBERl9Mb2FkUGFnZS4KLS8vICAgICAgICAgIHBhZ2Vfb2JqICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4gUmV0dXJuZWQgYnkgRlBERlBhZ2VPYmpfTmV3VGV4dE9iaixGUERGUGFnZU9ial9OZXdUZXh0T2JqRXggYW5kCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIGEgcGFnZS4gUmV0dXJuZWQgYnkgRlBERlBhZ2VfTmV3IG9yCisvLyAgICAgICAgICBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZV9vYmogICAgLSAgIEhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERlBhZ2VPYmpfTmV3VGV4dE9iaixGUERGUGFnZU9ial9OZXdUZXh0T2JqRXggYW5kCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERlBhZ2VPYmpfTmV3UGF0aE9iai4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9JbnNlcnRPYmplY3QoRlBERl9QQUdFIHBhZ2UsIEZQREZfUEFHRU9CSkVDVCBwYWdlX29iaik7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0luc2VydE9iamVjdChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBwYWdlX29iaik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9Db3VudE9iamVjdAogLy8gICAgICAgICAgR2V0IG51bWJlciBvZiBwYWdlIG9iamVjdHMgaW5zaWRlIHRoZSBwYWdlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IgRlBERl9Mb2FkUGFnZS4KKy8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IKKy8vICAgICAgICAgIEZQREZfTG9hZFBhZ2UuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgbnVtYmVyIG9mIHRoZSBwYWdlIG9iamVjdC4KIC8vIE5vdGVzOgotLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YKKy8vICAgICAgICAgIGR5bmFtaWMgWEZBIGZpZWxkcy4KIC8vCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfQ291bnRPYmplY3QoRlBERl9QQUdFIHBhZ2UpOwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfR2V0T2JqZWN0CiAvLyAgICAgICAgICBHZXQgcGFnZSBvYmplY3QgYnkgaW5kZXguCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvciBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvcgorLy8gICAgICAgICAgRlBERl9Mb2FkUGFnZS4KIC8vICAgICAgICAgIGluZGV4ICAgICAgIC0gICBUaGUgaW5kZXggb2YgYSBwYWdlIG9iamVjdC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBoYW5kbGUgb2YgdGhlIHBhZ2Ugb2JqZWN0LiBOdWxsIGZvciBmYWlsZWQuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwogRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlX0dldE9iamVjdChGUERGX1BBR0UgcGFnZSwgaW50IGluZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZQYWdlX0hhc1RyYW5zcGFyZW5jeQotLy8gICAgICAgICAgQ2hlY2sgdGhhdCB3aGV0aGVyIHRoZSBjb250ZW50IG9mIHNwZWNpZmllZCBQREYgcGFnZSBjb250YWlucyB0cmFuc3BhcmVuY3kuCisvLyAgICAgICAgICBDaGVjayB0aGF0IHdoZXRoZXIgdGhlIGNvbnRlbnQgb2Ygc3BlY2lmaWVkIFBERiBwYWdlIGNvbnRhaW5zCisvLyAgICAgICAgICB0cmFuc3BhcmVuY3kuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvciBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvcgorLy8gICAgICAgICAgRlBERl9Mb2FkUGFnZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRSVUUgbWVhbnMgdGhhdCB0aGUgUERGIHBhZ2UgZG9lcyBjb250YWlucyB0cmFuc3BhcmVuY3kuCiAvLyAgICAgICAgICBPdGhlcndpc2UsIHJldHVybnMgRkFMU0UuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0hhc1RyYW5zcGFyZW5jeShGUERGX1BBR0UgcGFnZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQKIC8vICAgICAgICAgIEdlbmVyYXRlIFBERiBQYWdlIGNvbnRlbnQuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvciBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvcgorLy8gICAgICAgICAgRlBERl9Mb2FkUGFnZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgogLy8gQ29tbWVudDoKLS8vICAgICAgICAgIEJlZm9yZSB5b3Ugc2F2ZSB0aGUgcGFnZSB0byBhIGZpbGUsIG9yIHJlbG9hZCB0aGUgcGFnZSwgeW91IG11c3QgY2FsbCB0aGUgRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50IGZ1bmN0aW9uLgorLy8gICAgICAgICAgQmVmb3JlIHlvdSBzYXZlIHRoZSBwYWdlIHRvIGEgZmlsZSwgb3IgcmVsb2FkIHRoZSBwYWdlLCB5b3UgbXVzdAorLy8gICAgICAgICAgY2FsbCB0aGUgRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50IGZ1bmN0aW9uLgogLy8gICAgICAgICAgT3IgdGhlIGNoYW5nZWQgaW5mb3JtYXRpb24gd2lsbCBiZSBsb3N0LgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZgorLy8gICAgICAgICAgZHluYW1pYyBYRkEgZmllbGRzLgogLy8KIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQoRlBERl9QQUdFIHBhZ2UpOwogCkBAIC0xNjksMTggKzIwMSwyMSBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VPYmpfSGFzVHJhbnNwYXJlbmN5Ci0vLyAgICAgICAgICBDaGVjayB0aGF0IHdoZXRoZXIgdGhlIHNwZWNpZmllZCBQREYgcGFnZSBvYmplY3QgY29udGFpbnMgdHJhbnNwYXJlbmN5LgorLy8gICAgICAgICAgQ2hlY2sgdGhhdCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUERGIHBhZ2Ugb2JqZWN0IGNvbnRhaW5zCisvLyAgICAgICAgICB0cmFuc3BhcmVuY3kuCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgcGFnZU9iamVjdCAgLSAgIEhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBtZWFucyB0aGF0IHRoZSBQREYgcGFnZSBvYmplY3QgZG9lcyBjb250YWlucyB0cmFuc3BhcmVuY3kuCiAvLyAgICAgICAgICBPdGhlcndpc2UsIHJldHVybnMgRkFMU0UuCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VPYmpfSGFzVHJhbnNwYXJlbmN5KEZQREZfUEFHRU9CSkVDVCBwYWdlT2JqZWN0KTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERlBhZ2VPYmpfSGFzVHJhbnNwYXJlbmN5KEZQREZfUEFHRU9CSkVDVCBwYWdlT2JqZWN0KTsKIAogLy8gRnVuY3Rpb246IEZQREZQYWdlT2JqX1RyYW5zZm9ybQogLy8gICAgICAgICAgVHJhbnNmb3JtIChzY2FsZSwgcm90YXRlLCBzaGVhciwgbW92ZSkgcGFnZSBvYmplY3QuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZV9vYmplY3QgLSAgIEhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LiBSZXR1cm5lZCBieSBGUERGUGFnZU9ial9OZXdJbWFnZU9iai4KKy8vICAgICAgICAgIHBhZ2Vfb2JqZWN0IC0gICBIYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4gUmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZQYWdlT2JqX05ld0ltYWdlT2JqLgogLy8gICAgICAgICAgYSAgICAgICAgICAgLSAgIFRoZSBjb2VmZmljaWVudCAiYSIgb2YgdGhlIG1hdHJpeC4KIC8vICAgICAgICAgIGIgICAgICAgICAgIC0gICBUaGUgY29lZmZpY2llbnQgImIiIG9mIHRoZSBtYXRyaXguCiAvLyAgICAgICAgICBjICAgICAgICAgICAtICAgVGhlIGNvZWZmaWNpZW50ICJjIiBvZiB0aGUgbWF0cml4LgpAQCAtMTkwLDcgKzIyNSwxMiBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9UcmFuc2Zvcm1Bbm5vdHMKIC8vICAgICAgICAgIFRyYW5zZm9ybSAoc2NhbGUsIHJvdGF0ZSwgc2hlYXIsIG1vdmUpIGFsbCBhbm5vdHMgaW4gYSBwYWdlLgpAQCAtMjA1LDE2ICsyNDUsMjIgQEAKIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX1RyYW5zZm9ybUFubm90cyhGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRvdWJsZSBkLCBkb3VibGUgZSwgZG91YmxlIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmKTsKIAogLy8gVGhlIHBhZ2Ugb2JqZWN0IGNvbnN0YW50cy4KLSNkZWZpbmUgRlBERl9QQUdFT0JKX1RFWFQgICAgICAgMQotI2RlZmluZSBGUERGX1BBR0VPQkpfUEFUSCAgICAgICAyCi0jZGVmaW5lIEZQREZfUEFHRU9CSl9JTUFHRSAgICAgIDMKLSNkZWZpbmUgRlBERl9QQUdFT0JKX1NIQURJTkcgICAgNAotI2RlZmluZSBGUERGX1BBR0VPQkpfRk9STSAgICAgICA1CisjZGVmaW5lIEZQREZfUEFHRU9CSl9URVhUIDEKKyNkZWZpbmUgRlBERl9QQUdFT0JKX1BBVEggMgorI2RlZmluZSBGUERGX1BBR0VPQkpfSU1BR0UgMworI2RlZmluZSBGUERGX1BBR0VPQkpfU0hBRElORyA0CisjZGVmaW5lIEZQREZfUEFHRU9CSl9GT1JNIDUKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KQEAgLTIyNSwzMyArMjcxLDQ1IEBACiAvLyBGdW5jdGlvbjogRlBERlBhZ2VPYmpfTmV3SW1nZU9iagogLy8gICAgICAgICAgQ3JlYXRlIGEgbmV3IEltYWdlIE9iamVjdC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9DcmVhdGVOZXdEb2N1bWVudCBmdW5jdGlvbi4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9DcmVhdGVOZXdEb2N1bWVudCBmdW5jdGlvbi4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIEhhbmRsZSBvZiBpbWFnZSBvYmplY3QuCi1ETExFWFBPUlQgRlBERl9QQUdFT0JKRUNUIFNURENBTEwgRlBERlBhZ2VPYmpfTmV3SW1nZU9iaihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKLQorRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMCitGUERGUGFnZU9ial9OZXdJbWdlT2JqKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOwogCiAvLyBGdW5jdGlvbjogRlBERkltYWdlT2JqX0xvYWRKcGVnRmlsZQotLy8gICAgICAgICAgTG9hZCBJbWFnZSBmcm9tIGEgSlBFRyBpbWFnZSBmaWxlIGFuZCB0aGVuIHNldCBpdCB0byBhbiBpbWFnZSBvYmplY3QuCisvLyAgICAgICAgICBMb2FkIEltYWdlIGZyb20gYSBKUEVHIGltYWdlIGZpbGUgYW5kIHRoZW4gc2V0IGl0IHRvIGFuIGltYWdlCisvLyAgICAgICAgICBvYmplY3QuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZXMgICAgICAgICAgIC0gICBQb2ludGVycyB0byB0aGUgc3RhcnQgb2YgYWxsIGxvYWRlZCBwYWdlcywgY291bGQgYmUgTlVMTC4KKy8vICAgICAgICAgIHBhZ2VzICAgICAgICAgICAtICAgUG9pbnRlcnMgdG8gdGhlIHN0YXJ0IG9mIGFsbCBsb2FkZWQgcGFnZXMsIGNvdWxkCisvLyAgICAgICAgICBiZSBOVUxMLgogLy8gICAgICAgICAgbkNvdW50ICAgICAgICAgIC0gICBOdW1iZXIgb2YgcGFnZXMsIGNvdWxkIGJlIDAuCi0vLyAgICAgICAgICBpbWFnZV9vYmplY3QgICAgLSAgIEhhbmRsZSBvZiBpbWFnZSBvYmplY3QgcmV0dXJuZWQgYnkgRlBERlBhZ2VPYmpfTmV3SW1nZU9iai4KLS8vICAgICAgICAgIGZpbGVBY2Nlc3MgICAgICAtICAgVGhlIGN1c3RvbSBmaWxlIGFjY2VzcyBoYW5kbGVyLCB3aGljaCBzcGVjaWZpZXMgdGhlIEpQRUcgaW1hZ2UgZmlsZS4KKy8vICAgICAgICAgIGltYWdlX29iamVjdCAgICAtICAgSGFuZGxlIG9mIGltYWdlIG9iamVjdCByZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERlBhZ2VPYmpfTmV3SW1nZU9iai4KKy8vICAgICAgICAgIGZpbGVBY2Nlc3MgICAgICAtICAgVGhlIGN1c3RvbSBmaWxlIGFjY2VzcyBoYW5kbGVyLCB3aGljaCBzcGVjaWZpZXMKKy8vICAgICAgICAgIHRoZSBKUEVHIGltYWdlIGZpbGUuCiAvLyAgUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCiAvLyAgTm90ZToKLS8vICAgICAgICAgIFRoZSBpbWFnZSBvYmplY3QgbWlnaHQgYWxyZWFkeSBoYXMgYW4gYXNzb2NpYXRlZCBpbWFnZSwgd2hpY2ggaXMgc2hhcmVkIGFuZCBjYWNoZWQgYnkgdGhlIGxvYWRlZCBwYWdlcywgSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBjYWNoZSBvZiBpbWFnZSBmb3IgYWxsIHRoZSBsb2FkZWQgcGFnZXMuCisvLyAgICAgICAgICBUaGUgaW1hZ2Ugb2JqZWN0IG1pZ2h0IGFscmVhZHkgaGFzIGFuIGFzc29jaWF0ZWQgaW1hZ2UsIHdoaWNoIGlzCisvLyAgICAgICAgICBzaGFyZWQgYW5kIGNhY2hlZCBieSB0aGUgbG9hZGVkIHBhZ2VzLCBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8KKy8vICAgICAgICAgIGNsZWFyIHRoZSBjYWNoZSBvZiBpbWFnZSBmb3IgYWxsIHRoZSBsb2FkZWQgcGFnZXMuCiAvLyAgICAgICAgICBQYXNzIHBhZ2VzIGFuZCBjb3VudCB0byB0aGlzIEFQSSB0byBjbGVhciB0aGUgaW1hZ2UgY2FjaGUuCi0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZgorLy8gICAgICAgICAgZHluYW1pYyBYRkEgZmllbGRzLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfTG9hZEpwZWdGaWxlKEZQREZfUEFHRSogcGFnZXMsIGludCBuQ291bnQsRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwgRlBERl9GSUxFQUNDRVNTKiBmaWxlQWNjZXNzKTsKLQorRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGSW1hZ2VPYmpfTG9hZEpwZWdGaWxlKEZQREZfUEFHRSogcGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRUFDQ0VTUyogZmlsZUFjY2Vzcyk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGSW1hZ2VPYmpfU2V0TWF0cml4CiAvLyAgICAgICAgICBTZXQgdGhlIG1hdHJpeCBvZiBhbiBpbWFnZSBvYmplY3QuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgaW1hZ2Vfb2JqZWN0ICAgIC0gICBIYW5kbGUgb2YgaW1hZ2Ugb2JqZWN0IHJldHVybmVkIGJ5IEZQREZQYWdlT2JqX05ld0ltZ2VPYmouCisvLyAgICAgICAgICBpbWFnZV9vYmplY3QgICAgLSAgIEhhbmRsZSBvZiBpbWFnZSBvYmplY3QgcmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZQYWdlT2JqX05ld0ltZ2VPYmouCiAvLyAgICAgICAgICBhICAgICAgICAgICAgICAgLSAgIFRoZSBjb2VmZmljaWVudCAiYSIgb2YgdGhlIG1hdHJpeC4KIC8vICAgICAgICAgIGIgICAgICAgICAgICAgICAtICAgVGhlIGNvZWZmaWNpZW50ICJiIiBvZiB0aGUgbWF0cml4LgogLy8gICAgICAgICAgYyAgICAgICAgICAgICAgIC0gICBUaGUgY29lZmZpY2llbnQgImMiIG9mIHRoZSBtYXRyaXguCkBAIC0yNjEsMjEgKzMxOSwzMiBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX1NldE1hdHJpeChGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsIGRvdWJsZSBlLCBkb3VibGUgZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYpOwogCiAvLyBGdW5jdGlvbjogRlBERkltYWdlT2JqX1NldEJpdG1hcAogLy8gICAgICAgICAgU2V0IHRoZSBiaXRtYXAgdG8gYW4gaW1hZ2Ugb2JqZWN0LgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIHBhZ2VzICAgICAgICAgICAtICAgUG9pbnRlcidzIHRvIHRoZSBzdGFydCBvZiBhbGwgbG9hZGVkIHBhZ2VzLgogLy8gICAgICAgICAgbkNvdW50ICAgICAgICAgIC0gICBOdW1iZXIgb2YgcGFnZXMuCi0vLyAgICAgICAgICBpbWFnZV9vYmplY3QgICAgLSAgIEhhbmRsZSBvZiBpbWFnZSBvYmplY3QgcmV0dXJuZWQgYnkgRlBERlBhZ2VPYmpfTmV3SW1nZU9iai4KLS8vICAgICAgICAgIGJpdG1hcCAgICAgICAgICAtICAgVGhlIGhhbmRsZSBvZiB0aGUgYml0bWFwIHdoaWNoIHlvdSB3YW50IHRvIHNldCBpdCB0byB0aGUgaW1hZ2Ugb2JqZWN0LgorLy8gICAgICAgICAgaW1hZ2Vfb2JqZWN0ICAgIC0gICBIYW5kbGUgb2YgaW1hZ2Ugb2JqZWN0IHJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGUGFnZU9ial9OZXdJbWdlT2JqLgorLy8gICAgICAgICAgYml0bWFwICAgICAgICAgIC0gICBUaGUgaGFuZGxlIG9mIHRoZSBiaXRtYXAgd2hpY2ggeW91IHdhbnQgdG8gc2V0CisvLyAgICAgICAgICBpdCB0byB0aGUgaW1hZ2Ugb2JqZWN0LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCiAvLyBOb3RlczsKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9TZXRCaXRtYXAoRlBERl9QQUdFKiBwYWdlcyxpbnQgbkNvdW50LEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsIEZQREZfQklUTUFQIGJpdG1hcCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX1NldEJpdG1hcChGUERGX1BBR0UqIHBhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JJVE1BUCBiaXRtYXApOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2V4dC5oIGIvcHVibGljL2ZwZGZfZXh0LmgKaW5kZXggODAxNmQyZS4uYzgwZGNiYiAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfZXh0LmgKKysrIGIvcHVibGljL2ZwZGZfZXh0LmgKQEAgLTEzLDQ1ICsxMyw0NCBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotLy9mbGFncyBmb3IgdHlwZSBvZiB1bnN1cHBvcnQgb2JqZWN0LgotI2RlZmluZSBGUERGX1VOU1BfRE9DX1hGQUZPUk0gICAgICAgICAgICAgICAxCi0jZGVmaW5lIEZQREZfVU5TUF9ET0NfUE9SVEFCTEVDT0xMRUNUSU9OICAgIDIKLSNkZWZpbmUgRlBERl9VTlNQX0RPQ19BVFRBQ0hNRU5UICAgICAgICAgICAgMwotI2RlZmluZSBGUERGX1VOU1BfRE9DX1NFQ1VSSVRZICAgICAgICAgICAgICA0Ci0jZGVmaW5lIEZQREZfVU5TUF9ET0NfU0hBUkVEUkVWSUVXICAgICAgICAgIDUKLSNkZWZpbmUgRlBERl9VTlNQX0RPQ19TSEFSRURGT1JNX0FDUk9CQVQgICAgNgorLy8gZmxhZ3MgZm9yIHR5cGUgb2YgdW5zdXBwb3J0IG9iamVjdC4KKyNkZWZpbmUgRlBERl9VTlNQX0RPQ19YRkFGT1JNIDEKKyNkZWZpbmUgRlBERl9VTlNQX0RPQ19QT1JUQUJMRUNPTExFQ1RJT04gMgorI2RlZmluZSBGUERGX1VOU1BfRE9DX0FUVEFDSE1FTlQgMworI2RlZmluZSBGUERGX1VOU1BfRE9DX1NFQ1VSSVRZIDQKKyNkZWZpbmUgRlBERl9VTlNQX0RPQ19TSEFSRURSRVZJRVcgNQorI2RlZmluZSBGUERGX1VOU1BfRE9DX1NIQVJFREZPUk1fQUNST0JBVCA2CiAjZGVmaW5lIEZQREZfVU5TUF9ET0NfU0hBUkVERk9STV9GSUxFU1lTVEVNIDcKLSNkZWZpbmUgRlBERl9VTlNQX0RPQ19TSEFSRURGT1JNX0VNQUlMICAgICAgOAotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfM0RBTk5PVCAgICAgICAgICAgICAxMQotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfTU9WSUUgICAgICAgICAgICAgICAxMgotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfU09VTkQgICAgICAgICAgICAgICAxMwotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfU0NSRUVOX01FRElBICAgICAgICAxNAotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfU0NSRUVOX1JJQ0hNRURJQSAgICAxNQotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfQVRUQUNITUVOVCAgICAgICAgICAxNgotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfU0lHICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBGUERGX1VOU1BfRE9DX1NIQVJFREZPUk1fRU1BSUwgOAorI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfM0RBTk5PVCAxMQorI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfTU9WSUUgMTIKKyNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX1NPVU5EIDEzCisjZGVmaW5lIEZQREZfVU5TUF9BTk5PVF9TQ1JFRU5fTUVESUEgMTQKKyNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX1NDUkVFTl9SSUNITUVESUEgMTUKKyNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX0FUVEFDSE1FTlQgMTYKKyNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX1NJRyAxNwogCi10eXBlZGVmIHN0cnVjdCBfVU5TVVBQT1JUX0lORk8KLXsKLSAgICAvKioKLSAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCi0gICAgKiovCi0gICAgaW50IHZlcnNpb247Cit0eXBlZGVmIHN0cnVjdCBfVU5TVVBQT1JUX0lORk8geworICAvKioKKyAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgorICAqKi8KKyAgaW50IHZlcnNpb247CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRlNES19VblN1cHBvcnRfSGFuZGxlcgotICAgICogICAgICAgICAgICBVblN1cHBvcnQgT2JqZWN0IHByb2Nlc3MgaGFuZGxpbmcgZnVuY3Rpb24uCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICBZZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBuVHlwZSAgICAgICAtICAgVGhlIHR5cGUgb2YgdW5zdXBwb3J0T2JqZWN0Ci0gICAgKiAgIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiAqLworICAvKioKKyAgKiBNZXRob2Q6IEZTREtfVW5TdXBwb3J0X0hhbmRsZXIKKyAgKiAgICAgICAgICAgIFVuU3VwcG9ydCBPYmplY3QgcHJvY2VzcyBoYW5kbGluZyBmdW5jdGlvbi4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICBZZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBuVHlwZSAgICAgICAtICAgVGhlIHR5cGUgb2YgdW5zdXBwb3J0T2JqZWN0CisgICogICBSZXR1cm4gdmFsdWU6CisgICogICAgICAgTm9uZS4KKyAgKiAqLwogCi0gICAgdm9pZCgqRlNES19VblN1cHBvcnRfSGFuZGxlcikoc3RydWN0IF9VTlNVUFBPUlRfSU5GTyogcFRoaXMsIGludCBuVHlwZSk7CisgIHZvaWQgKCpGU0RLX1VuU3VwcG9ydF9IYW5kbGVyKShzdHJ1Y3QgX1VOU1VQUE9SVF9JTkZPKiBwVGhpcywgaW50IG5UeXBlKTsKIH0gVU5TVVBQT1JUX0lORk87CiAKIC8qKgpAQCAtNjMsMzcgKzYyLDQwIEBACiAgKiAgICAgICAgICBUUlVFIG1lYW5zIHN1Y2Nlc3NmdWwuIEZBTFNFIG1lYW5zIGZhaWxzLgogICoqLwogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlNES19TZXRVblNwT2JqUHJvY2Vzc0hhbmRsZXIoVU5TVVBQT1JUX0lORk8qIHVuc3BfaW5mbyk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwKK0ZTREtfU2V0VW5TcE9ialByb2Nlc3NIYW5kbGVyKFVOU1VQUE9SVF9JTkZPKiB1bnNwX2luZm8pOwogCi0vL2ZsYWdzIGZvciBwYWdlIG1vZGUuCisvLyBmbGFncyBmb3IgcGFnZSBtb2RlLgogCi0vL1Vua25vd24gdmFsdWUKLSNkZWZpbmUgUEFHRU1PREVfVU5LTk9XTiAgICAgICAgLTEKKy8vIFVua25vd24gdmFsdWUKKyNkZWZpbmUgUEFHRU1PREVfVU5LTk9XTiAtMQogCi0vL05laXRoZXIgZG9jdW1lbnQgb3V0bGluZSBub3IgdGh1bWJuYWlsIGltYWdlcyB2aXNpYmxlCi0jZGVmaW5lIFBBR0VNT0RFX1VTRU5PTkUgICAgICAgIDAKKy8vIE5laXRoZXIgZG9jdW1lbnQgb3V0bGluZSBub3IgdGh1bWJuYWlsIGltYWdlcyB2aXNpYmxlCisjZGVmaW5lIFBBR0VNT0RFX1VTRU5PTkUgMAogCi0vL0RvY3VtZW50IG91dGxpbmUgdmlzaWJsZQotI2RlZmluZSBQQUdFTU9ERV9VU0VPVVRMSU5FUyAgICAxCisvLyBEb2N1bWVudCBvdXRsaW5lIHZpc2libGUKKyNkZWZpbmUgUEFHRU1PREVfVVNFT1VUTElORVMgMQogCi0vL1RodW1ibmlhbCBpbWFnZXMgdmlzaWJsZQotI2RlZmluZSBQQUdFTU9ERV9VU0VUSFVNQlMgICAgICAyCisvLyBUaHVtYm5pYWwgaW1hZ2VzIHZpc2libGUKKyNkZWZpbmUgUEFHRU1PREVfVVNFVEhVTUJTIDIKIAotLy9GdWxsLXNjcmVlbiBtb2RlLCB3aXRoIG5vIG1lbnUgYmFyLCB3aW5kb3cgY29udHJvbHMsIG9yIGFueSBvdGhlciB3aW5kb3cgdmlzaWJsZQotI2RlZmluZSBQQUdFTU9ERV9GVUxMU0NSRUVOICAgICAzCisvLyBGdWxsLXNjcmVlbiBtb2RlLCB3aXRoIG5vIG1lbnUgYmFyLCB3aW5kb3cgY29udHJvbHMsIG9yIGFueSBvdGhlciB3aW5kb3cKKy8vIHZpc2libGUKKyNkZWZpbmUgUEFHRU1PREVfRlVMTFNDUkVFTiAzCiAKLS8vT3B0aW9uYWwgY29udGVudCBncm91cCBwYW5lbCB2aXNpYmxlCi0jZGVmaW5lIFBBR0VNT0RFX1VTRU9DICAgICAgICAgIDQKKy8vIE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgcGFuZWwgdmlzaWJsZQorI2RlZmluZSBQQUdFTU9ERV9VU0VPQyA0CiAKLS8vQXR0YWNobWVudHMgcGFuZWwgdmlzaWJsZQorLy8gQXR0YWNobWVudHMgcGFuZWwgdmlzaWJsZQogI2RlZmluZSBQQUdFTU9ERV9VU0VBVFRBQ0hNRU5UUyA1CiAKLQogLyoqCiAgKiBGdW5jdGlvbjogRlBERkRvY19HZXRQYWdlTW9kZQotICogICAgICAgICAgIEdldCB0aGUgZG9jdW1lbnQncyBQYWdlTW9kZShIb3cgdGhlIGRvY3VtZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQgd2hlbiBvcGVuZWQpCisgKiAgICAgICAgICAgR2V0IHRoZSBkb2N1bWVudCdzIFBhZ2VNb2RlKEhvdyB0aGUgZG9jdW1lbnQgc2hvdWxkIGJlIGRpc3BsYXllZAorICp3aGVuIG9wZW5lZCkKICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBkb2MgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorICpmdW5jdGlvbi4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRoZSBmbGFncyBmb3IgcGFnZSBtb2RlLgogICoqLwpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfZmxhdHRlbi5oIGIvcHVibGljL2ZwZGZfZmxhdHRlbi5oCmluZGV4IDNhZTNjZDUuLjU0OTY4NDYgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX2ZsYXR0ZW4uaAorKysgYi9wdWJsaWMvZnBkZl9mbGF0dGVuLmgKQEAgLTEwLDI4ICsxMCwzMyBAQAogI2luY2x1ZGUgImZwZGZ2aWV3LmgiCiAKIC8vIFJlc3VsdCBjb2Rlcy4KLSNkZWZpbmUgRkxBVFRFTl9GQUlMICAgICAgICAgICAgMCAgIC8vIEZsYXR0ZW4gb3BlcmF0aW9uIGZhaWxlZC4KLSNkZWZpbmUgRkxBVFRFTl9TVUNDRVNTICAgICAgICAgMSAgIC8vIEZsYXR0ZW4gb3BlcmF0aW9uIHN1Y2NlZWQuCi0jZGVmaW5lIEZMQVRURU5fTk9USElOR1RPRE8gICAgIDIgICAvLyBUaGVyZSBpcyBub3RoaW5nIHRvIGJlIGZsYXR0ZW5lZC4KKyNkZWZpbmUgRkxBVFRFTl9GQUlMIDAgICAgICAgICAvLyBGbGF0dGVuIG9wZXJhdGlvbiBmYWlsZWQuCisjZGVmaW5lIEZMQVRURU5fU1VDQ0VTUyAxICAgICAgLy8gRmxhdHRlbiBvcGVyYXRpb24gc3VjY2VlZC4KKyNkZWZpbmUgRkxBVFRFTl9OT1RISU5HVE9ETyAyICAvLyBUaGVyZSBpcyBub3RoaW5nIHRvIGJlIGZsYXR0ZW5lZC4KIAogLy8gRmxhZ3MuCi0jZGVmaW5lIEZMQVRfTk9STUFMRElTUExBWSAgICAgMAotI2RlZmluZSBGTEFUX1BSSU5UICAgICAgICAgICAgIDEKKyNkZWZpbmUgRkxBVF9OT1JNQUxESVNQTEFZIDAKKyNkZWZpbmUgRkxBVF9QUklOVCAxCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAogLy8gRnVuY3Rpb246IEZQREZQYWdlX0ZsYXR0ZW4KLS8vICAgICAgICAgIE1ha2UgYW5ub3RhdGlvbnMgYW5kIGZvcm0gZmllbGRzIGJlY29tZSBwYXJ0IG9mIHRoZSBwYWdlIGNvbnRlbnRzIGl0c2VsZi4KKy8vICAgICAgICAgIE1ha2UgYW5ub3RhdGlvbnMgYW5kIGZvcm0gZmllbGRzIGJlY29tZSBwYXJ0IG9mIHRoZSBwYWdlIGNvbnRlbnRzCisvLyAgICAgICAgICBpdHNlbGYuCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgcGFnZSAgLSBIYW5kbGUgdG8gdGhlIHBhZ2UsIGFzIHJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UoKS4KLS8vICAgICAgICAgIG5GbGFnIC0gSW50ZW5kZWQgdXNlIG9mIHRoZSBmbGF0dGVuZWQgcmVzdWx0OiAwIGZvciBub3JtYWwgZGlzcGxheSwgMSBmb3IgcHJpbnRpbmcuCisvLyAgICAgICAgICBuRmxhZyAtIEludGVuZGVkIHVzZSBvZiB0aGUgZmxhdHRlbmVkIHJlc3VsdDogMCBmb3Igbm9ybWFsIGRpc3BsYXksCisvLyAgICAgICAgICAxIGZvciBwcmludGluZy4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEVpdGhlciBGTEFUVEVOX0ZBSUwsIEZMQVRURU5fU1VDQ0VTUywgb3IgRkxBVFRFTl9OT1RISU5HVE9ETyAoc2VlIGFib3ZlKS4KKy8vICAgICAgICAgIEVpdGhlciBGTEFUVEVOX0ZBSUwsIEZMQVRURU5fU1VDQ0VTUywgb3IgRkxBVFRFTl9OT1RISU5HVE9ETyAoc2VlCisvLyAgICAgICAgICBhYm92ZSkuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIEN1cnJlbnRseSwgYWxsIGZhaWx1cmVzIHJldHVybiBGTEFUVEVOX0ZBSUwsIHdpdGggbm8gaW5kaWNhdGlvbiBmb3IgdGhlIHJlYXNvbgotLy8gICAgICAgICAgZm9yIHRoZSBmYWlsdXJlLiBUaGUgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgZmxhdHRlbmluZyBhbnkgZHluYW1pYyBYRkEgZmllbGRzLgorLy8gICAgICAgICAgQ3VycmVudGx5LCBhbGwgZmFpbHVyZXMgcmV0dXJuIEZMQVRURU5fRkFJTCwgd2l0aCBubyBpbmRpY2F0aW9uIGZvcgorLy8gICAgICAgICAgdGhlIHJlYXNvbgorLy8gICAgICAgICAgZm9yIHRoZSBmYWlsdXJlLiBUaGUgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgZmxhdHRlbmluZyBhbnkgZHluYW1pYworLy8gICAgICAgICAgWEZBIGZpZWxkcy4KIERMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9GbGF0dGVuKEZQREZfUEFHRSBwYWdlLCBpbnQgbkZsYWcpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2Zvcm1maWxsLmggYi9wdWJsaWMvZnBkZl9mb3JtZmlsbC5oCmluZGV4IGZkYTBhODcuLjBiNDJjYWMgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX2Zvcm1maWxsLmgKKysrIGIvcHVibGljL2ZwZGZfZm9ybWZpbGwuaApAQCAtMTEsMjgyICsxMSwzNDggQEAKIAogdHlwZWRlZiB2b2lkKiBGUERGX0ZPUk1IQU5ETEU7CiAKLSNkZWZpbmUgRE9DVFlQRV9QREYgICAgICAgICAgMCAvL05vcm1hbCBwZGYgRG9jdW1lbnQKLSNkZWZpbmUgRE9DVFlQRV9EWU5JTUlDX1hGQSAgMSAvL0R5bmltaWMgeGZhIERvY3VtZW50IFR5cGUKLSNkZWZpbmUgRE9DVFlQRV9TVEFUSUNfWEZBICAgMiAvL1N0YXRpYyB4ZmEgRG9jdW1lbnQgVHlwZQorI2RlZmluZSBET0NUWVBFX1BERiAwICAvLyBOb3JtYWwgcGRmIERvY3VtZW50CisjZGVmaW5lIERPQ1RZUEVfRFlOSU1JQ19YRkEgMSAgLy8gRHluaW1pYyB4ZmEgRG9jdW1lbnQgVHlwZQorI2RlZmluZSBET0NUWVBFX1NUQVRJQ19YRkEgMiAgLy8gU3RhdGljIHhmYSBEb2N1bWVudCBUeXBlCiAKIC8vIEV4cG9ydGVkIEZ1bmN0aW9ucwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi10eXBlZGVmIHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtCi17Ci0gICAgLyoqCi0gICAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAyLgotICAgICoqLwotICAgIGludCB2ZXJzaW9uOwordHlwZWRlZiBzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSB7CisgIC8qKgorICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDIuCisgICoqLworICBpbnQgdmVyc2lvbjsKIAotICAgIC8qIFZlcnNpb24gMS4gKi8KKyAgLyogVmVyc2lvbiAxLiAqLwogCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IGFwcF9hbGVydAotICAgICogICAgICAgICAgIHBvcCB1cCBhIGRpYWxvZyB0byBzaG93IHdhcm5pbmcgb3IgaGludC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqICAgICAgICAgICBNc2cgICAgICAgICAtICAgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuCi0gICAgKiAgICAgICAgICAgVGl0bGUgICAgICAgLSAgIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLgotICAgICogICAgICAgICAgIFR5cGUgICAgICAgIC0gICBUaGUgc3R5cGUgb2YgYnV0dG9uIGdyb3VwLgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAwLU9LKGRlZmF1bHQpOwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAxLU9LLENhbmNlbDsKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMi1ZZXMsTk87Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMtWWVzLCBOTywgQ2FuY2VsLgotICAgICogICAgICAgICAgIG5JY29uICAgICAgIC0gICBUaGUgSWNvbiB0eXBlLgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAwLUVycm9yKGRlZmF1bHQpOwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAxLVdhcm5pbmc7Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDItUXVlc3Rpb247Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMtU3RhdHVzLgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA0LUFzdGVyaXNrCisgIC8qKgorICAqIE1ldGhvZDogYXBwX2FsZXJ0CisgICogICAgICAgICAgIHBvcCB1cCBhIGRpYWxvZyB0byBzaG93IHdhcm5pbmcgb3IgaGludC4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgKiAgICAgICAgICAgTXNnICAgICAgICAgLSAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgorICAqICAgICAgICAgICBUaXRsZSAgICAgICAtICAgVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cuCisgICogICAgICAgICAgIFR5cGUgICAgICAgIC0gICBUaGUgc3R5cGUgb2YgYnV0dG9uIGdyb3VwLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMC1PSyhkZWZhdWx0KTsKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEtT0ssQ2FuY2VsOworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMi1ZZXMsTk87CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAzLVllcywgTk8sIENhbmNlbC4KKyAgKiAgICAgICAgICAgbkljb24gICAgICAgLSAgIFRoZSBJY29uIHR5cGUuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAwLUVycm9yKGRlZmF1bHQpOworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMS1XYXJuaW5nOworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMi1RdWVzdGlvbjsKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMtU3RhdHVzLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgNC1Bc3RlcmlzawogCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBjb3VsZCBiZSB0aGUgZm9sb3dpbmcgdHlwZToKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMS1PSzsKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMi1DYW5jZWw7Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMtTk87Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQtWWVzOwotICAgICovCi0gICAgaW50ICgqYXBwX2FsZXJ0KShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsIEZQREZfV0lERVNUUklORyBNc2csIEZQREZfV0lERVNUUklORyBUaXRsZSwgaW50IFR5cGUsIGludCBJY29uKTsKKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgY291bGQgYmUgdGhlIGZvbG93aW5nIHR5cGU6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAxLU9LOworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMi1DYW5jZWw7CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAzLU5POworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgNC1ZZXM7CisgICovCisgIGludCAoKmFwcF9hbGVydCkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBNc2csCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFRpdGxlLAorICAgICAgICAgICAgICAgICAgIGludCBUeXBlLAorICAgICAgICAgICAgICAgICAgIGludCBJY29uKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBhcHBfYmVlcAotICAgICogICAgICAgICAgIENhdXNlcyB0aGUgc3lzdGVtIHRvIHBsYXkgYSBzb3VuZC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqICAgICAgICAgICBuVHlwZSAgICAgICAtICAgVGhlIHNvdW5kIHR5cGUuCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBFcnJvcgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gV2FybmluZwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gUXVlc3Rpb24KLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAtIFN0YXR1cwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA0IC0gRGVmYXVsdCAoZGVmYXVsdCB2YWx1ZSkKLSAgICAqIFJldHVybiBWYWx1ZToKLSAgICAqICAgICAgICAgICBOb25lCi0gICAgKi8KLSAgICB2b2lkICgqYXBwX2JlZXApKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgIGludCBuVHlwZSk7CisgIC8qKgorICAqIE1ldGhvZDogYXBwX2JlZXAKKyAgKiAgICAgICAgICAgQ2F1c2VzIHRoZSBzeXN0ZW0gdG8gcGxheSBhIHNvdW5kLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAqICAgICAgICAgICBuVHlwZSAgICAgICAtICAgVGhlIHNvdW5kIHR5cGUuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gRXJyb3IKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBXYXJuaW5nCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gUXVlc3Rpb24KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLSBTdGF0dXMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgLSBEZWZhdWx0IChkZWZhdWx0IHZhbHVlKQorICAqIFJldHVybiBWYWx1ZToKKyAgKiAgICAgICAgICAgTm9uZQorICAqLworICB2b2lkICgqYXBwX2JlZXApKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgaW50IG5UeXBlKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBhcHBfcmVzcG9uc2UKLSAgICAqICAgICAgICAgICBEaXNwbGF5cyBhIGRpYWxvZyBib3ggY29udGFpbmluZyBhIHF1ZXN0aW9uIGFuZCBhbiBlbnRyeSBmaWVsZCBmb3IgdGhlIHVzZXIgdG8gcmVwbHkgdG8gdGhlIHF1ZXN0aW9uLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgotICAgICogICAgICAgICAgIFF1ZXN0aW9uICAgIC0gICBUaGUgcXVlc3Rpb24gdG8gYmUgcG9zZWQgdG8gdGhlIHVzZXIuCi0gICAgKiAgICAgICAgICAgVGl0bGUgICAgICAgLSAgIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGJveC4KLSAgICAqICAgICAgICAgICBEZWZhdWx0ICAgICAtICAgQSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYW5zd2VyIHRvIHRoZSBxdWVzdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgbm8gZGVmYXVsdCB2YWx1ZSBpcyBwcmVzZW50ZWQuCi0gICAgKiAgICAgICAgICAgY0xhYmVsICAgICAgLSAgIEEgc2hvcnQgc3RyaW5nIHRvIGFwcGVhciBpbiBmcm9udCBvZiBhbmQgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgZWRpdCB0ZXh0IGZpZWxkLgotICAgICogICAgICAgICAgIGJQYXNzd29yZCAgIC0gICBJZiB0cnVlLCBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlcidzIHJlc3BvbnNlIHNob3VsZCBzaG93IGFzIGFzdGVyaXNrcyAoKikgb3IgYnVsbGV0cyAoPykgdG8gbWFzayB0aGUgcmVzcG9uc2UsIHdoaWNoIG1pZ2h0IGJlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gICAgKiAgICAgICAgICAgcmVzcG9uc2UgICAgLSAgIEEgc3RyaW5nIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgU0RLLCB0byByZWNlaXZlIHRoZSB1c2VyJ3MgcmVzcG9uc2UuCi0gICAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDdXJyZW50bHksIEl0J3MgYWx3YXlzIGJlIDIwNDguCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIGNvbXBsZXRlIHVzZXIgaW5wdXQgd291bGQgYWN0dWFsbHkgcmVxdWlyZSwgbm90IGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcywgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlIGxlbmd0aAotICAgICogICAgICAgcGFyYW1ldGVyIG9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgcmVzcG9uc2UgYnVmZmVyLgotICAgICogQ29tbWVudHM6Ci0gICAgKiAgICAgICBObyBtYXR0ZXIgb24gd2hhdCBwbGF0Zm9ybSwgdGhlIHJlc3BvbnNlIGJ1ZmZlciBzaG91bGQgYmUgYWx3YXlzIHdyaXR0ZW4gdXNpbmcgVVRGLTE2TEUgZW5jb2RpbmcuIElmIGEgcmVzcG9uc2UgYnVmZmVyIGlzCi0gICAgKiAgICAgICBwcmVzZW50IGFuZCB0aGUgc2l6ZSBvZiB0aGUgdXNlciBpbnB1dCBleGNlZWRzIHRoZSBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBieSB0aGUgbGVuZ3RoIHBhcmFtZXRlciwgb25seSB0aGUKLSAgICAqICAgICAgIGZpcnN0ICJsZW5ndGgiIGJ5dGVzIG9mIHRoZSB1c2VyIGlucHV0IGFyZSB0byBiZSB3cml0dGVuIHRvIHRoZSBidWZmZXIuCi0gICAgKi8KLSAgICBpbnQgKCphcHBfcmVzcG9uc2UpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIFF1ZXN0aW9uLCBGUERGX1dJREVTVFJJTkcgVGl0bGUsIEZQREZfV0lERVNUUklORyBEZWZhdWx0LCBGUERGX1dJREVTVFJJTkcgY0xhYmVsLCBGUERGX0JPT0wgYlBhc3N3b3JkLCB2b2lkKiByZXNwb25zZSwgaW50IGxlbmd0aCk7CisgIC8qKgorICAqIE1ldGhvZDogYXBwX3Jlc3BvbnNlCisgICogICAgICAgICAgIERpc3BsYXlzIGEgZGlhbG9nIGJveCBjb250YWluaW5nIGEgcXVlc3Rpb24gYW5kIGFuIGVudHJ5IGZpZWxkIGZvcgorICAqIHRoZSB1c2VyIHRvIHJlcGx5IHRvIHRoZSBxdWVzdGlvbi4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgKiAgICAgICAgICAgUXVlc3Rpb24gICAgLSAgIFRoZSBxdWVzdGlvbiB0byBiZSBwb3NlZCB0byB0aGUgdXNlci4KKyAgKiAgICAgICAgICAgVGl0bGUgICAgICAgLSAgIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGJveC4KKyAgKiAgICAgICAgICAgRGVmYXVsdCAgICAgLSAgIEEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGFuc3dlciB0byB0aGUgcXVlc3Rpb24uIElmCisgICogbm90IHNwZWNpZmllZCwgbm8gZGVmYXVsdCB2YWx1ZSBpcyBwcmVzZW50ZWQuCisgICogICAgICAgICAgIGNMYWJlbCAgICAgIC0gICBBIHNob3J0IHN0cmluZyB0byBhcHBlYXIgaW4gZnJvbnQgb2YgYW5kIG9uIHRoZQorICAqIHNhbWUgbGluZSBhcyB0aGUgZWRpdCB0ZXh0IGZpZWxkLgorICAqICAgICAgICAgICBiUGFzc3dvcmQgICAtICAgSWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIncyByZXNwb25zZSBzaG91bGQKKyAgKiBzaG93IGFzIGFzdGVyaXNrcyAoKikgb3IgYnVsbGV0cyAoPykgdG8gbWFzayB0aGUgcmVzcG9uc2UsIHdoaWNoIG1pZ2h0IGJlCisgICogc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KKyAgKiAgICAgICAgICAgcmVzcG9uc2UgICAgLSAgIEEgc3RyaW5nIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgU0RLLCB0byByZWNlaXZlIHRoZQorICAqIHVzZXIncyByZXNwb25zZS4KKyAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLgorICAqIEN1cnJlbnRseSwgSXQncyBhbHdheXMgYmUgMjA0OC4KKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSBjb21wbGV0ZSB1c2VyIGlucHV0IHdvdWxkIGFjdHVhbGx5IHJlcXVpcmUsIG5vdAorICAqIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcywgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlIGxlbmd0aAorICAqICAgICAgIHBhcmFtZXRlciBvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgKiBDb21tZW50czoKKyAgKiAgICAgICBObyBtYXR0ZXIgb24gd2hhdCBwbGF0Zm9ybSwgdGhlIHJlc3BvbnNlIGJ1ZmZlciBzaG91bGQgYmUgYWx3YXlzCisgICogd3JpdHRlbiB1c2luZyBVVEYtMTZMRSBlbmNvZGluZy4gSWYgYSByZXNwb25zZSBidWZmZXIgaXMKKyAgKiAgICAgICBwcmVzZW50IGFuZCB0aGUgc2l6ZSBvZiB0aGUgdXNlciBpbnB1dCBleGNlZWRzIHRoZSBjYXBhY2l0eSBvZiB0aGUKKyAgKiBidWZmZXIgYXMgc3BlY2lmaWVkIGJ5IHRoZSBsZW5ndGggcGFyYW1ldGVyLCBvbmx5IHRoZQorICAqICAgICAgIGZpcnN0ICJsZW5ndGgiIGJ5dGVzIG9mIHRoZSB1c2VyIGlucHV0IGFyZSB0byBiZSB3cml0dGVuIHRvIHRoZQorICAqIGJ1ZmZlci4KKyAgKi8KKyAgaW50ICgqYXBwX3Jlc3BvbnNlKShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFF1ZXN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgY0xhYmVsLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CiAKLSAgICAvKgotICAgICogTWV0aG9kOiBEb2NfZ2V0RmlsZVBhdGgKLSAgICAqICAgICAgICAgICBHZXQgdGhlIGZpbGUgcGF0aCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqICAgICAgICAgICBmaWxlUGF0aCAgICAtICAgVGhlIHN0cmluZyBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZmlsZSBwYXRoLiBDYW4gYmUgTlVMTC4KLSAgICAqICAgICAgICAgICBsZW5ndGggICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZSAwLgotICAgICogUmV0dXJuIFZhbHVlOgotICAgICogICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSBmaWxlUGF0aCBjb25zdW1lcywgaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9zLgotICAgICogQ29tbWVudHM6Ci0gICAgKiAgICAgICBUaGUgZmlsZVBhdGggc2hvdWxkIGJlIGFsd2F5cyBpbnB1dCBpbiBsb2NhbCBlbmNvZGluZy4KLSAgICAqCi0gICAgKiAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIHdoZW4gdGhlcmUgaXMKLSAgICAqICAgICAgIG5vIGJ1ZmZlciBzcGVjaWZpZWQsIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciB3aWxsIG5vdAotICAgICogICAgICAgYmUgbW9kaWZpZWQuCi0gICAgKi8KLSAgICBpbnQgKCpEb2NfZ2V0RmlsZVBhdGgpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgdm9pZCogZmlsZVBhdGgsIGludCBsZW5ndGgpOworICAvKgorICAqIE1ldGhvZDogRG9jX2dldEZpbGVQYXRoCisgICogICAgICAgICAgIEdldCB0aGUgZmlsZSBwYXRoIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAqICAgICAgICAgICBmaWxlUGF0aCAgICAtICAgVGhlIHN0cmluZyBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZmlsZSBwYXRoLiBDYW4gYmUKKyAgKiBOVUxMLgorICAqICAgICAgICAgICBsZW5ndGggICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZQorICAqIDAuCisgICogUmV0dXJuIFZhbHVlOgorICAqICAgICAgIE51bWJlciBvZiBieXRlcyB0aGUgZmlsZVBhdGggY29uc3VtZXMsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcy4KKyAgKiBDb21tZW50czoKKyAgKiAgICAgICBUaGUgZmlsZVBhdGggc2hvdWxkIGJlIGFsd2F5cyBpbnB1dCBpbiBsb2NhbCBlbmNvZGluZy4KKyAgKgorICAqICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlZCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZQorICAqIGJ1ZmZlciwgZXZlbiB3aGVuIHRoZXJlIGlzCisgICogICAgICAgbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhpcworICAqIGNhc2UsIHRoZSBidWZmZXIgd2lsbCBub3QKKyAgKiAgICAgICBiZSBtb2RpZmllZC4KKyAgKi8KKyAgaW50ICgqRG9jX2dldEZpbGVQYXRoKShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CiAKKyAgLyoKKyAgKiBNZXRob2Q6IERvY19tYWlsCisgICogICAgICAgICAgIE1haWxzIHRoZSBkYXRhIGJ1ZmZlciBhcyBhbiBhdHRhY2htZW50IHRvIGFsbCByZWNpcGllbnRzLCB3aXRoIG9yCisgICogd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAqICAgICAgICAgICBtYWlsRGF0YSAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gYmUgc2VudC5DYW4gYmUgTlVMTC4KKyAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBzaXplLGluIGJ5dGVzLCBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgYnkKKyAgKiBtYWlsRGF0YSBwYXJhbWV0ZXIuQ2FuIGJlIDAuCisgICogICAgICAgICAgIGJVSSAgICAgICAgIC0gICBJZiB0cnVlLCB0aGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycyBhcmUgdXNlZCBpbiBhCisgICogY29tcG9zZS1uZXctbWVzc2FnZSB3aW5kb3cgdGhhdCBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIElmIGZhbHNlLCB0aGUgY1RvCisgICogcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGFuZCBhbGwgb3RoZXJzIGFyZSBvcHRpb25hbC4KKyAgKiAgICAgICAgICAgVG8gICAgICAgICAgLSAgIEEgc2VtaWNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIHJlY2lwaWVudHMgZm9yIHRoZQorICAqIG1lc3NhZ2UuCisgICogICAgICAgICAgIFN1YmplY3QgICAgIC0gICBUaGUgc3ViamVjdCBvZiB0aGUgbWVzc2FnZS4gVGhlIGxlbmd0aCBsaW1pdCBpcyA2NAorICAqIEtCLgorICAqICAgICAgICAgICBDQyAgICAgICAgICAtICAgQSBzZW1pY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgQ0MgcmVjaXBpZW50cyBmb3IKKyAgKiB0aGUgbWVzc2FnZS4KKyAgKiAgICAgICAgICAgQkNDICAgICAgICAgLSAgIEEgc2VtaWNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIEJDQyByZWNpcGllbnRzIGZvcgorICAqIHRoZSBtZXNzYWdlLgorICAqICAgICAgICAgICBNc2cgICAgICAgICAtICAgVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UuIFRoZSBsZW5ndGggbGltaXQgaXMgNjQKKyAgKiBLQi4KKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgICAgIE5vbmUuCisgICogQ29tbWVudHM6CisgICogICAgICAgICAgIElmIHRoZSBwYXJhbWV0ZXIgbWFpbERhdGEgaXMgTlVMTCBvciBsZW5ndGggaXMgMCwgdGhlIGN1cnJlbnQKKyAgKiBkb2N1bWVudCB3aWxsIGJlIG1haWxlZCBhcyBhbiBhdHRhY2htZW50IHRvIGFsbCByZWNpcGllbnRzLgorICAqLworICB2b2lkICgqRG9jX21haWwpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICB2b2lkKiBtYWlsRGF0YSwKKyAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiVUksCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFRvLAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBTdWJqZWN0LAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBDQywKKyAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgQkNDLAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBNc2cpOwogCi0gICAgLyoKLSAgICAqIE1ldGhvZDogRG9jX21haWwKLSAgICAqICAgICAgICAgICBNYWlscyB0aGUgZGF0YSBidWZmZXIgYXMgYW4gYXR0YWNobWVudCB0byBhbGwgcmVjaXBpZW50cywgd2l0aCBvciB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgKiAgICAgICAgICAgbWFpbERhdGEgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIGJlIHNlbnQuQ2FuIGJlIE5VTEwuCi0gICAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBzaXplLGluIGJ5dGVzLCBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgYnkgbWFpbERhdGEgcGFyYW1ldGVyLkNhbiBiZSAwLgotICAgICogICAgICAgICAgIGJVSSAgICAgICAgIC0gICBJZiB0cnVlLCB0aGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycyBhcmUgdXNlZCBpbiBhIGNvbXBvc2UtbmV3LW1lc3NhZ2Ugd2luZG93IHRoYXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBJZiBmYWxzZSwgdGhlIGNUbyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgYW5kIGFsbCBvdGhlcnMgYXJlIG9wdGlvbmFsLgotICAgICogICAgICAgICAgIFRvICAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiByZWNpcGllbnRzIGZvciB0aGUgbWVzc2FnZS4KLSAgICAqICAgICAgICAgICBTdWJqZWN0ICAgICAtICAgVGhlIHN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuIFRoZSBsZW5ndGggbGltaXQgaXMgNjQgS0IuCi0gICAgKiAgICAgICAgICAgQ0MgICAgICAgICAgLSAgIEEgc2VtaWNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIENDIHJlY2lwaWVudHMgZm9yIHRoZSBtZXNzYWdlLgotICAgICogICAgICAgICAgIEJDQyAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBCQ0MgcmVjaXBpZW50cyBmb3IgdGhlIG1lc3NhZ2UuCi0gICAgKiAgICAgICAgICAgTXNnICAgICAgICAgLSAgIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlLiBUaGUgbGVuZ3RoIGxpbWl0IGlzIDY0IEtCLgotICAgICogUmV0dXJuIFZhbHVlOgotICAgICogICAgICAgICAgIE5vbmUuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgICAgICBJZiB0aGUgcGFyYW1ldGVyIG1haWxEYXRhIGlzIE5VTEwgb3IgbGVuZ3RoIGlzIDAsIHRoZSBjdXJyZW50IGRvY3VtZW50IHdpbGwgYmUgbWFpbGVkIGFzIGFuIGF0dGFjaG1lbnQgdG8gYWxsIHJlY2lwaWVudHMuCi0gICAgKi8KLSAgICB2b2lkICgqRG9jX21haWwpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcyx2b2lkKiBtYWlsRGF0YSwgaW50IGxlbmd0aCxGUERGX0JPT0wgYlVJLCBGUERGX1dJREVTVFJJTkcgVG8sIEZQREZfV0lERVNUUklORyBTdWJqZWN0LCBGUERGX1dJREVTVFJJTkcgQ0MsIEZQREZfV0lERVNUUklORyBCQ0MsIEZQREZfV0lERVNUUklORyBNc2cpOworICAvKgorICAqIE1ldGhvZDogRG9jX3ByaW50CisgICogICAgICAgICAgIFByaW50cyBhbGwgb3IgYSBzcGVjaWZpYyBudW1iZXIgb2YgcGFnZXMgb2YgdGhlIGRvY3VtZW50LgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICAgICAgYlVJICAgICAgICAgLSAgIElmIHRydWUsIHdpbGwgY2F1c2UgYSBVSSB0byBiZSBwcmVzZW50ZWQgdG8gdGhlCisgICogdXNlciB0byBvYnRhaW4gcHJpbnRpbmcgaW5mb3JtYXRpb24gYW5kIGNvbmZpcm0gdGhlIGFjdGlvbi4KKyAgKiAgICAgICAgICAgblN0YXJ0ICAgICAgLSAgIEEgMC1iYXNlZCBpbmRleCB0aGF0IGRlZmluZXMgdGhlIHN0YXJ0IG9mIGFuCisgICogaW5jbHVzaXZlIHJhbmdlIG9mIHBhZ2VzLgorICAqICAgICAgICAgICBuRW5kICAgICAgICAtICAgQSAwLWJhc2VkIGluZGV4IHRoYXQgZGVmaW5lcyB0aGUgZW5kIG9mIGFuCisgICogaW5jbHVzaXZlIHBhZ2UgcmFuZ2UuCisgICogICAgICAgICAgIGJTaWxlbnQgICAgIC0gICBJZiB0cnVlLCBzdXBwcmVzc2VzIHRoZSBjYW5jZWwgZGlhbG9nIGJveCB3aGlsZQorICAqIHRoZSBkb2N1bWVudCBpcyBwcmludGluZy4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCisgICogICAgICAgICAgIGJTaHJpbmtUb0ZpdCAgICAtICAgSWYgdHJ1ZSwgdGhlIHBhZ2UgaXMgc2hydW5rIChpZiBuZWNlc3NhcnkpIHRvCisgICogZml0IHdpdGhpbiB0aGUgaW1hZ2VhYmxlIGFyZWEgb2YgdGhlIHByaW50ZWQgcGFnZS4KKyAgKiAgICAgICAgICAgYlByaW50QXNJbWFnZSAgIC0gICBJZiB0cnVlLCBwcmludCBwYWdlcyBhcyBhbiBpbWFnZS4KKyAgKiAgICAgICAgICAgYlJldmVyc2UgICAgLSAgIElmIHRydWUsIHByaW50IGZyb20gbkVuZCB0byBuU3RhcnQuCisgICogICAgICAgICAgIGJBbm5vdGF0aW9ucyAgICAtICAgSWYgdHJ1ZSAodGhlIGRlZmF1bHQpLCBhbm5vdGF0aW9ucyBhcmUKKyAgKiBwcmludGVkLgorICAqLworICB2b2lkICgqRG9jX3ByaW50KShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiVUksCisgICAgICAgICAgICAgICAgICAgIGludCBuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGludCBuRW5kLAorICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlNpbGVudCwKKyAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJTaHJpbmtUb0ZpdCwKKyAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJQcmludEFzSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUmV2ZXJzZSwKKyAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJBbm5vdGF0aW9ucyk7CiAKKyAgLyoKKyAgKiBNZXRob2Q6IERvY19zdWJtaXRGb3JtCisgICogICAgICAgICAgIFNlbmQgdGhlIGZvcm0gZGF0YSB0byBhIHNwZWNpZmllZCBVUkwuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICogICAgICAgICAgIGZvcm1EYXRhICAgIC0gICBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB0byBiZSBzZW50LgorICAqICAgICAgICAgICBsZW5ndGggICAgICAtICAgVGhlIHNpemUsaW4gYnl0ZXMsIG9mIHRoZSBidWZmZXIgcG9pbnRlZCBieQorICAqIGZvcm1EYXRhIHBhcmFtZXRlci4KKyAgKiAgICAgICAgICAgVVJMICAgICAgICAgLSAgIFRoZSBVUkwgdG8gc2VuZCB0by4KKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgICAgIE5vbmUuCisgICoKKyAgKi8KKyAgdm9pZCAoKkRvY19zdWJtaXRGb3JtKShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZm9ybURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgVVJMKTsKIAotICAgIC8qCi0gICAgKiBNZXRob2Q6IERvY19wcmludAotICAgICogICAgICAgICAgIFByaW50cyBhbGwgb3IgYSBzcGVjaWZpYyBudW1iZXIgb2YgcGFnZXMgb2YgdGhlIGRvY3VtZW50LgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgICAgICBiVUkgICAgICAgICAtICAgSWYgdHJ1ZSwgd2lsbCBjYXVzZSBhIFVJIHRvIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciB0byBvYnRhaW4gcHJpbnRpbmcgaW5mb3JtYXRpb24gYW5kIGNvbmZpcm0gdGhlIGFjdGlvbi4KLSAgICAqICAgICAgICAgICBuU3RhcnQgICAgICAtICAgQSAwLWJhc2VkIGluZGV4IHRoYXQgZGVmaW5lcyB0aGUgc3RhcnQgb2YgYW4gaW5jbHVzaXZlIHJhbmdlIG9mIHBhZ2VzLgotICAgICogICAgICAgICAgIG5FbmQgICAgICAgIC0gICBBIDAtYmFzZWQgaW5kZXggdGhhdCBkZWZpbmVzIHRoZSBlbmQgb2YgYW4gaW5jbHVzaXZlIHBhZ2UgcmFuZ2UuCi0gICAgKiAgICAgICAgICAgYlNpbGVudCAgICAgLSAgIElmIHRydWUsIHN1cHByZXNzZXMgdGhlIGNhbmNlbCBkaWFsb2cgYm94IHdoaWxlIHRoZSBkb2N1bWVudCBpcyBwcmludGluZy4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gICAgKiAgICAgICAgICAgYlNocmlua1RvRml0ICAgIC0gICBJZiB0cnVlLCB0aGUgcGFnZSBpcyBzaHJ1bmsgKGlmIG5lY2Vzc2FyeSkgdG8gZml0IHdpdGhpbiB0aGUgaW1hZ2VhYmxlIGFyZWEgb2YgdGhlIHByaW50ZWQgcGFnZS4KLSAgICAqICAgICAgICAgICBiUHJpbnRBc0ltYWdlICAgLSAgIElmIHRydWUsIHByaW50IHBhZ2VzIGFzIGFuIGltYWdlLgotICAgICogICAgICAgICAgIGJSZXZlcnNlICAgIC0gICBJZiB0cnVlLCBwcmludCBmcm9tIG5FbmQgdG8gblN0YXJ0LgotICAgICogICAgICAgICAgIGJBbm5vdGF0aW9ucyAgICAtICAgSWYgdHJ1ZSAodGhlIGRlZmF1bHQpLCBhbm5vdGF0aW9ucyBhcmUgcHJpbnRlZC4KLSAgICAqLwotICAgIHZvaWQgKCpEb2NfcHJpbnQpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgRlBERl9CT09MIGJVSSwgaW50IG5TdGFydCwgaW50IG5FbmQsIEZQREZfQk9PTCBiU2lsZW50ICxGUERGX0JPT0wgYlNocmlua1RvRml0LEZQREZfQk9PTCBiUHJpbnRBc0ltYWdlICxGUERGX0JPT0wgYlJldmVyc2UgLEZQREZfQk9PTCBiQW5ub3RhdGlvbnMpOworICAvKgorICAqIE1ldGhvZDogRG9jX2dvdG9QYWdlCisgICogICAgICAgICAgIEp1bXAgdG8gYSBzcGVjaWZpZWQgcGFnZS4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgKiAgICAgICAgICAgblBhZ2VOdW0gICAgLSAgIFRoZSBzcGVjaWZpZWQgcGFnZSBudW1iZXIsIHplcm8gZm9yIHRoZSBmaXJzdAorICAqIHBhZ2UuCisgICogUmV0dXJuIFZhbHVlOgorICAqICAgICAgICAgICBOb25lLgorICAqCisgICovCisgIHZvaWQgKCpEb2NfZ290b1BhZ2UpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgaW50IG5QYWdlTnVtKTsKKyAgLyoKKyAgKiBNZXRob2Q6IEZpZWxkX2Jyb3dzZQorICAqICAgICAgICAgICBTaG93IGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nLCBhbmQgcmV0dXJuIHRoZSBzZWxlY3RlZCBmaWxlIHBhdGguCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgICAgICBmaWxlUGF0aCAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZmlsZQorICAqIHBhdGguQ2FuIGJlIE5VTEwuCisgICogICAgICAgICAgIGxlbmd0aCAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlCisgICogMC4KKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSBmaWxlUGF0aCBjb25zdW1lcywgaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9zLgorICAqIENvbW1lbnRzOgorICAqICAgICAgIFRoZSBmaWxlUGF0aCBzaG91bGUgYmUgYWx3YXlzIGlucHV0IGluIGxvY2FsIGVuY29kaW5nLgorICAqLworICBpbnQgKCpGaWVsZF9icm93c2UpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKTsKIAotICAgIC8qCi0gICAgKiBNZXRob2Q6IERvY19zdWJtaXRGb3JtCi0gICAgKiAgICAgICAgICAgU2VuZCB0aGUgZm9ybSBkYXRhIHRvIGEgc3BlY2lmaWVkIFVSTC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqICAgICAgICAgICBmb3JtRGF0YSAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gYmUgc2VudC4KLSAgICAqICAgICAgICAgICBsZW5ndGggICAgICAtICAgVGhlIHNpemUsaW4gYnl0ZXMsIG9mIHRoZSBidWZmZXIgcG9pbnRlZCBieSBmb3JtRGF0YSBwYXJhbWV0ZXIuCi0gICAgKiAgICAgICAgICAgVVJMICAgICAgICAgLSAgIFRoZSBVUkwgdG8gc2VuZCB0by4KLSAgICAqIFJldHVybiBWYWx1ZToKLSAgICAqICAgICAgICAgICBOb25lLgotICAgICoKLSAgICAqLwotICAgIHZvaWQgKCpEb2Nfc3VibWl0Rm9ybSkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLHZvaWQqIGZvcm1EYXRhLCBpbnQgbGVuZ3RoLCBGUERGX1dJREVTVFJJTkcgVVJMKTsKKyAgLyoqCisgICogICBwb2ludGVyIHRvIEZQREZfRk9STUZJTExJTkZPIGludGVyZmFjZS4KKyAgKiovCisgIHZvaWQqIG1fcEZvcm1maWxsaW5mbzsKIAotICAgIC8qCi0gICAgKiBNZXRob2Q6IERvY19nb3RvUGFnZQotICAgICogICAgICAgICAgIEp1bXAgdG8gYSBzcGVjaWZpZWQgcGFnZS4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqICAgICAgICAgICBuUGFnZU51bSAgICAtICAgVGhlIHNwZWNpZmllZCBwYWdlIG51bWJlciwgemVybyBmb3IgdGhlIGZpcnN0IHBhZ2UuCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICAgICAgTm9uZS4KLSAgICAqCi0gICAgKi8KLSAgICB2b2lkICgqRG9jX2dvdG9QYWdlKShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsIGludCBuUGFnZU51bSk7Ci0gICAgLyoKLSAgICAqIE1ldGhvZDogRmllbGRfYnJvd3NlCi0gICAgKiAgICAgICAgICAgU2hvdyBhIGZpbGUgc2VsZWN0aW9uIGRpYWxvZywgYW5kIHJldHVybiB0aGUgc2VsZWN0ZWQgZmlsZSBwYXRoLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgICAgICBmaWxlUGF0aCAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZmlsZSBwYXRoLkNhbiBiZSBOVUxMLgotICAgICogICAgICAgICAgIGxlbmd0aCAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlIDAuCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIGZpbGVQYXRoIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgIFRoZSBmaWxlUGF0aCBzaG91bGUgYmUgYWx3YXlzIGlucHV0IGluIGxvY2FsIGVuY29kaW5nLgotICAgICovCi0gICAgaW50ICAoKkZpZWxkX2Jyb3dzZSkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLCB2b2lkKiBmaWxlUGF0aCwgaW50IGxlbmd0aCk7CisgIC8qIFZlcnNpb24gMi4gKi8KIAotICAgIC8qKgotICAgICogICBwb2ludGVyIHRvIEZQREZfRk9STUZJTExJTkZPIGludGVyZmFjZS4KLSAgICAqKi8KLSAgICB2b2lkKiAgIG1fcEZvcm1maWxsaW5mbzsKKyAgLyoqCisgICogICBwb2ludGVyIHRvIHRoZSB2ODo6SXNvbGF0ZSB0byB1c2UsIG9yIE5VTEwgdG8gZm9yY2UgUERGaXVtIHRvIGNyZWF0ZSBvbmUuCisgICoqLworICB2b2lkKiBtX2lzb2xhdGU7CiAKLSAgICAvKiBWZXJzaW9uIDIuICovCi0KLSAgICAvKioKLSAgICAqICAgcG9pbnRlciB0byB0aGUgdjg6Oklzb2xhdGUgdG8gdXNlLCBvciBOVUxMIHRvIGZvcmNlIFBERml1bSB0byBjcmVhdGUgb25lLgotICAgICoqLwotICAgIHZvaWQqICAgbV9pc29sYXRlOwotCi0gICAgLyoqCi0gICAgICogICBUaGUgZW1iZWRkZXIgZGF0YSBzbG90IHRvIHVzZSBpbiB0aGUgdjg6Oklzb2xhdGUgdG8gc3RvcmUgUERGaXVtJ3MKLSAgICAgKiAgIHBlci1pc29sYXRlIGRhdGEuIFRoZSB2YWx1ZSBuZWVkcyB0byBiZSBiZXR3ZWVuIDAgYW5kCi0gICAgICogICB2ODo6SW50ZXJuYWxzOjprTnVtSXNvbGF0ZURhdGFMb3RzIChleGNsdXNpdmUpLgotICAgICAqLwotICAgIHVuc2lnbmVkIGludCBtX3Y4RW1iZWRkZXJTbG90OworICAvKioKKyAgICogICBUaGUgZW1iZWRkZXIgZGF0YSBzbG90IHRvIHVzZSBpbiB0aGUgdjg6Oklzb2xhdGUgdG8gc3RvcmUgUERGaXVtJ3MKKyAgICogICBwZXItaXNvbGF0ZSBkYXRhLiBUaGUgdmFsdWUgbmVlZHMgdG8gYmUgYmV0d2VlbiAwIGFuZAorICAgKiAgIHY4OjpJbnRlcm5hbHM6OmtOdW1Jc29sYXRlRGF0YUxvdHMgKGV4Y2x1c2l2ZSkuCisgICAqLworICB1bnNpZ25lZCBpbnQgbV92OEVtYmVkZGVyU2xvdDsKIH0gSVBERl9KU1BMQVRGT1JNOwogCiAvLyBGbGFncyBmb3IgQ3Vyc29yIHR5cGUKLSNkZWZpbmUgRlhDVF9BUlJPVyAgMAotI2RlZmluZSBGWENUX05FU1cgICAxCi0jZGVmaW5lIEZYQ1RfTldTRSAgIDIKLSNkZWZpbmUgRlhDVF9WQkVBTSAgMwotI2RlZmluZSBGWENUX0hCRUFNICA0Ci0jZGVmaW5lIEZYQ1RfSEFORCAgIDUKKyNkZWZpbmUgRlhDVF9BUlJPVyAwCisjZGVmaW5lIEZYQ1RfTkVTVyAxCisjZGVmaW5lIEZYQ1RfTldTRSAyCisjZGVmaW5lIEZYQ1RfVkJFQU0gMworI2RlZmluZSBGWENUX0hCRUFNIDQKKyNkZWZpbmUgRlhDVF9IQU5EIDUKIAogLyoqCi0gKiBEZWNsYXJlcyBvZiBhIHBvaW50ZXIgdHlwZSB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBGRklfU2V0VGltZXIgbWV0aG9kLgorICogRGVjbGFyZXMgb2YgYSBwb2ludGVyIHR5cGUgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgRkZJX1NldFRpbWVyCisgKm1ldGhvZC4KICAqIFBhcmFtZXRlcnM6CiAgKiAgICAgICAgICBpZEV2ZW50ICAgICAtICAgSWRlbnRpZmllciBvZiB0aGUgdGltZXIuCiAgKiBSZXR1cm4gdmFsdWU6CiAgKiAgICAgICAgICBOb25lLgogICoqLwotdHlwZWRlZiB2b2lkICAgICgqVGltZXJDYWxsYmFjaykoaW50IGlkRXZlbnQpOwordHlwZWRlZiB2b2lkICgqVGltZXJDYWxsYmFjaykoaW50IGlkRXZlbnQpOwogCiAvKioKICAqIERlY2xhcmVzIG9mIGEgc3RydWN0IHR5cGUgdG8gdGhlIGxvY2FsIHN5c3RlbSB0aW1lLgogKiovCi10eXBlZGVmIHN0cnVjdCBfRlBERl9TWVNURU1USU1FCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgd1llYXI7ICAgICAgICAgICAvKiB5ZWFycyBzaW5jZSAxOTAwICovCi0gICAgdW5zaWduZWQgc2hvcnQgd01vbnRoOyAgICAgICAgICAvKiBtb250aHMgc2luY2UgSmFudWFyeSAtIFswLDExXSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdEYXlPZldlZWs7ICAgICAgLyogZGF5cyBzaW5jZSBTdW5kYXkgLSBbMCw2XSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdEYXk7ICAgICAgICAgICAgLyogZGF5IG9mIHRoZSBtb250aCAtIFsxLDMxXSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdIb3VyOyAgICAgICAgICAgLyogaG91cnMgc2luY2UgbWlkbmlnaHQgLSBbMCwyM10gKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB3TWludXRlOyAgICAgICAgIC8qIG1pbnV0ZXMgYWZ0ZXIgdGhlIGhvdXIgLSBbMCw1OV0gKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB3U2Vjb25kOyAgICAgICAgIC8qIHNlY29uZHMgYWZ0ZXIgdGhlIG1pbnV0ZSAtIFswLDU5XSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdNaWxsaXNlY29uZHM7ICAgLyogbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBzZWNvbmQgLSBbMCw5OTldICovCi19RlBERl9TWVNURU1USU1FOwordHlwZWRlZiBzdHJ1Y3QgX0ZQREZfU1lTVEVNVElNRSB7CisgIHVuc2lnbmVkIHNob3J0IHdZZWFyOyAgICAgICAgIC8qIHllYXJzIHNpbmNlIDE5MDAgKi8KKyAgdW5zaWduZWQgc2hvcnQgd01vbnRoOyAgICAgICAgLyogbW9udGhzIHNpbmNlIEphbnVhcnkgLSBbMCwxMV0gKi8KKyAgdW5zaWduZWQgc2hvcnQgd0RheU9mV2VlazsgICAgLyogZGF5cyBzaW5jZSBTdW5kYXkgLSBbMCw2XSAqLworICB1bnNpZ25lZCBzaG9ydCB3RGF5OyAgICAgICAgICAvKiBkYXkgb2YgdGhlIG1vbnRoIC0gWzEsMzFdICovCisgIHVuc2lnbmVkIHNob3J0IHdIb3VyOyAgICAgICAgIC8qIGhvdXJzIHNpbmNlIG1pZG5pZ2h0IC0gWzAsMjNdICovCisgIHVuc2lnbmVkIHNob3J0IHdNaW51dGU7ICAgICAgIC8qIG1pbnV0ZXMgYWZ0ZXIgdGhlIGhvdXIgLSBbMCw1OV0gKi8KKyAgdW5zaWduZWQgc2hvcnQgd1NlY29uZDsgICAgICAgLyogc2Vjb25kcyBhZnRlciB0aGUgbWludXRlIC0gWzAsNTldICovCisgIHVuc2lnbmVkIHNob3J0IHdNaWxsaXNlY29uZHM7IC8qIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgc2Vjb25kIC0gWzAsOTk5XSAqLworfSBGUERGX1NZU1RFTVRJTUU7CiAKLS8vWEZBCisvLyBYRkEKIC8qKgogICogQG5hbWUgUGFnZXZpZXcgIGV2ZW50IGZsYWdzCiAgKi8KIC8qQHsqLwogLyoqIEBicmllZiBBZnRlciBhIG5ldyBwYWdldmlldyBpcyBhZGRlZC4gKi8KLSNkZWZpbmUgIEZYRkFfUEFHRVZJRVdFVkVOVF9QT1NUQURERUQgICAgICAgMQorI2RlZmluZSBGWEZBX1BBR0VWSUVXRVZFTlRfUE9TVEFEREVEIDEKIC8qKiBAYnJpZWYgQWZ0ZXIgYSBwYWdldmlldyBpcyByZW1vdmVkLiAqLwotI2RlZmluZSAgRlhGQV9QQUdFVklFV0VWRU5UX1BPU1RSRU1PVkVEICAgICAzCisjZGVmaW5lIEZYRkFfUEFHRVZJRVdFVkVOVF9QT1NUUkVNT1ZFRCAzCiAvKkB9Ki8KIAogLy8gbWVudQpAQCAtMjk0LDEyICszNjAsMTIgQEAKICAqIEBuYW1lIE1hY3JvIERlZmluaXRpb25zIGZvciBSaWdodCBDb250ZXh0IE1lbnUgRmVhdHVyZXMgT2YgWEZBIEZpZWxkcwogICovCiAvKkB7Ki8KLSNkZWZpbmUgIEZYRkFfTUVNVV9DT1BZICAgICAgICAgMQotI2RlZmluZSAgRlhGQV9NRU1VX0NVVCAgICAgICAgICAyCi0jZGVmaW5lICBGWEZBX01FTVVfU0VMRUNUQUxMICAgIDQKLSNkZWZpbmUgIEZYRkFfTUVNVV9VTkRPICAgICAgICAgOAotI2RlZmluZSAgRlhGQV9NRU1VX1JFRE8gICAgICAgICAxNgotI2RlZmluZSAgRlhGQV9NRU1VX1BBU1RFICAgICAgICAzMgorI2RlZmluZSBGWEZBX01FTVVfQ09QWSAxCisjZGVmaW5lIEZYRkFfTUVNVV9DVVQgMgorI2RlZmluZSBGWEZBX01FTVVfU0VMRUNUQUxMIDQKKyNkZWZpbmUgRlhGQV9NRU1VX1VORE8gOAorI2RlZmluZSBGWEZBX01FTVVfUkVETyAxNgorI2RlZmluZSBGWEZBX01FTVVfUEFTVEUgMzIKIC8qQH0qLwogCiAvLyBmaWxlIHR5cGUKQEAgLTMwNywyODMgKzM3MywzMzYgQEAKICAqIEBuYW1lIE1hY3JvIERlZmluaXRpb25zIGZvciBGaWxlIFR5cGUuCiAgKi8KIC8qQHsqLwotI2RlZmluZSBGWEZBX1NBVkVBU19YTUwgICAgIDEKLSNkZWZpbmUgRlhGQV9TQVZFQVNfWERQICAgICAyCisjZGVmaW5lIEZYRkFfU0FWRUFTX1hNTCAxCisjZGVmaW5lIEZYRkFfU0FWRUFTX1hEUCAyCiAvKkB9Ki8KIAotdHlwZWRlZiBzdHJ1Y3QgIF9GUERGX0ZPUk1GSUxMSU5GTwotewotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDIgKHdpdGggWEZBIG1vZHVsZSkuCi0gICAgICoqLwotICAgIGludCB2ZXJzaW9uOwordHlwZWRlZiBzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPIHsKKyAgLyoqCisgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDIgKHdpdGggWEZBIG1vZHVsZSkuCisgICAqKi8KKyAgaW50IHZlcnNpb247CiAKLSAgICAgICAgLyoqCi0gICAgICogTWV0aG9kOiBSZWxlYXNlCi0gICAgICogICAgICAgICAgR2l2ZSBpbXBsZW1lbnRhdGlvbiBhIGNoYW5jZSB0byByZWxlYXNlIGFueSBkYXRhIGFmdGVyIHRoZSBpbnRlcmZhY2UgaXMgbm8gbG9uZ2VyIHVzZWQKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgTm8KLSAgICAgKiBDb21tZW50czoKLSAgICAgKiAgICAgICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIGR1cmluZyB0aGUgZmluYWwgY2xlYW51cCBwcm9jZXNzLgotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgICAgIE5vbmUKLSAgICAgKi8KKyAgLyoqCisqTWV0aG9kOiBSZWxlYXNlCisqICAgICAgICAgR2l2ZSBpbXBsZW1lbnRhdGlvbiBhIGNoYW5jZSB0byByZWxlYXNlIGFueSBkYXRhIGFmdGVyIHRoZSBpbnRlcmZhY2UKKyogaXMgbm8gbG9uZ2VyIHVzZWQKKypJbnRlcmZhY2UgVmVyc2lvbjoKKyogICAgICAgICAxCisqSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisqICAgICAgICAgTm8KKypDb21tZW50czoKKyogICAgICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIGR1cmluZyB0aGUgZmluYWwgY2xlYW51cCBwcm9jZXNzLgorKlBhcmFtZXRlcnM6CisqICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisqUmV0dXJuIFZhbHVlOgorKiAgICAgICAgIE5vbmUKKyovCiAKLSAgICB2b2lkICgqUmVsZWFzZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpOworICB2b2lkICgqUmVsZWFzZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBGRklfSW52YWxpZGF0ZQotICAgICAqICAgICAgICAgIEludmFsaWRhdGUgdGhlIGNsaWVudCBhcmVhIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZS4KLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICAgICogICAgICAgICAgIHllcwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0gICAgICogICAgICAgICAgbGVmdCAgICAgICAgLSAgIExlZnQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgICogICAgICAgICAgdG9wICAgICAgICAgLSAgIFRvcCAgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgICogICAgICAgICAgcmlnaHQgICAgICAgLSAgIFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSAgY29vcmRpbmF0ZS4KLSAgICAgKiAgICAgICAgICBib3R0b20gICAgICAtICAgQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lLgotICAgICAqCi0gICAgICpjb21tZW50czoKLSAgICAgKiAgICAgICAgICBBbGwgcG9zaXRpb25zIGFyZSBtZWFzdXJlZCBpbiBQREYgInVzZXIgc3BhY2UiLgotICAgICAqICAgICAgICAgIEltcGxlbWVudGF0aW9uIHNob3VsZCBjYWxsIEZQREZfUmVuZGVyUGFnZUJpdG1hcCgpIGZ1bmN0aW9uIGZvciByZXBhaW50aW5nIGEgc3BlY2lmaWVkIHBhZ2UgYXJlYS4KLSAgICAqLwotICAgIHZvaWQgKCpGRklfSW52YWxpZGF0ZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsRlBERl9QQUdFIHBhZ2UsIGRvdWJsZSBsZWZ0LCBkb3VibGUgdG9wLCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20pOworICAvKioKKyAgICogTWV0aG9kOiBGRklfSW52YWxpZGF0ZQorICAgKiAgICAgICAgICBJbnZhbGlkYXRlIHRoZSBjbGllbnQgYXJlYSB3aXRoaW4gdGhlIHNwZWNpZmllZCByZWN0YW5nbGUuCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgICAgKiAgICAgICAgICAgeWVzCisgICAqIFBhcmFtZXRlcnM6CisgICAqICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICAgKmZ1bmN0aW9uLgorICAgKiAgICAgICAgICBsZWZ0ICAgICAgICAtICAgTGVmdCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICpjb29yZGluYXRlLgorICAgKiAgICAgICAgICB0b3AgICAgICAgICAtICAgVG9wICBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICpjb29yZGluYXRlLgorICAgKiAgICAgICAgICByaWdodCAgICAgICAtICAgUmlnaHQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlCisgICAqY29vcmRpbmF0ZS4KKyAgICogICAgICAgICAgYm90dG9tICAgICAgLSAgIEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICpjb29yZGluYXRlLgorICAgKiBSZXR1cm4gVmFsdWU6CisgICAqICAgICAgICAgIE5vbmUuCisgICAqCisgICAqY29tbWVudHM6CisgICAqICAgICAgICAgIEFsbCBwb3NpdGlvbnMgYXJlIG1lYXN1cmVkIGluIFBERiAidXNlciBzcGFjZSIuCisgICAqICAgICAgICAgIEltcGxlbWVudGF0aW9uIHNob3VsZCBjYWxsIEZQREZfUmVuZGVyUGFnZUJpdG1hcCgpIGZ1bmN0aW9uIGZvcgorICAgKnJlcGFpbnRpbmcgYSBzcGVjaWZpZWQgcGFnZSBhcmVhLgorICAqLworICB2b2lkICgqRkZJX0ludmFsaWRhdGUpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBib3R0b20pOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBGRklfT3V0cHV0U2VsZWN0ZWRSZWN0Ci0gICAgICogICAgICAgICAgV2hlbiB1c2VyIGlzIHRha2luZyB0aGUgbW91c2UgdG8gc2VsZWN0IHRleHRzIG9uIGEgZm9ybSBmaWVsZCwgdGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGtlZXAKLSAgICAgKiAgICAgICAgICByZXR1cm5pbmcgdGhlIHNlbGVjdGVkIGFyZWFzIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICAqICAgICAgICAgIDEKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAgKiAgICAgICAgICBObwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0gICAgICogICAgICAgICAgbGVmdCAgICAgICAgLSAgIExlZnQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgICogICAgICAgICAgdG9wICAgICAgICAgLSAgIFRvcCAgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgICogICAgICAgICAgcmlnaHQgICAgICAgLSAgIFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSAgY29vcmRpbmF0ZS4KLSAgICAgKiAgICAgICAgICBib3R0b20gICAgICAtICAgQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lLgotICAgICAqCi0gICAgICogY29tbWVudHM6Ci0gICAgICogICAgICAgICAgVGhpcyBDQUxMQkFDSyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBzcGVjaWFsIHRleHQgc2VsZWN0aW9uIGVmZmVjdC4gSW1wbGVtZW50YXRpb24gc2hvdWxkCi0gICAgICogICAgICAgICAgZmlyc3QgcmVjb3JkcyB0aGUgcmV0dXJuZWQgcmVjdGFuZ2xlcywgdGhlbiBkcmF3IHRoZW0gb25lIGJ5IG9uZSBhdCB0aGUgcGFpbnRpbmcgcGVyaW9kLCBsYXN0LHJlbW92ZSBhbGwKLSAgICAgKiAgICAgICAgICB0aGUgcmVjb3JkZWQgcmVjdGFuZ2xlcyB3aGVuIGZpbmlzaCBwYWludGluZy4KLSAgICAqLwotICAgIHZvaWQgKCpGRklfT3V0cHV0U2VsZWN0ZWRSZWN0KShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyxGUERGX1BBR0UgcGFnZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSk7CisgIC8qKgorICAgKiBNZXRob2Q6IEZGSV9PdXRwdXRTZWxlY3RlZFJlY3QKKyAgICogICAgICAgICAgV2hlbiB1c2VyIGlzIHRha2luZyB0aGUgbW91c2UgdG8gc2VsZWN0IHRleHRzIG9uIGEgZm9ybSBmaWVsZCwKKyAgICogdGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGtlZXAKKyAgICogICAgICAgICAgcmV0dXJuaW5nIHRoZSBzZWxlY3RlZCBhcmVhcyB0byB0aGUgaW1wbGVtZW50YXRpb24uCisgICAqCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBObworICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAgICogZnVuY3Rpb24uCisgICAqICAgICAgICAgIGxlZnQgICAgICAgIC0gICBMZWZ0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAgKiBjb29yZGluYXRlLgorICAgKiAgICAgICAgICB0b3AgICAgICAgICAtICAgVG9wICBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICogY29vcmRpbmF0ZS4KKyAgICogICAgICAgICAgcmlnaHQgICAgICAgLSAgIFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAgKiBjb29yZGluYXRlLgorICAgKiAgICAgICAgICBib3R0b20gICAgICAtICAgQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAgKiBjb29yZGluYXRlLgorICAgKiBSZXR1cm4gVmFsdWU6CisgICAqICAgICAgICAgIE5vbmUuCisgICAqCisgICAqIGNvbW1lbnRzOgorICAgKiAgICAgICAgICBUaGlzIENBTExCQUNLIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHNwZWNpYWwgdGV4dAorICAgKiBzZWxlY3Rpb24gZWZmZWN0LiBJbXBsZW1lbnRhdGlvbiBzaG91bGQKKyAgICogICAgICAgICAgZmlyc3QgcmVjb3JkcyB0aGUgcmV0dXJuZWQgcmVjdGFuZ2xlcywgdGhlbiBkcmF3IHRoZW0gb25lIGJ5IG9uZQorICAgKiBhdCB0aGUgcGFpbnRpbmcgcGVyaW9kLCBsYXN0LHJlbW92ZSBhbGwKKyAgICogICAgICAgICAgdGhlIHJlY29yZGVkIHJlY3RhbmdsZXMgd2hlbiBmaW5pc2ggcGFpbnRpbmcuCisgICovCisgIHZvaWQgKCpGRklfT3V0cHV0U2VsZWN0ZWRSZWN0KShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSk7CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX1NldEN1cnNvcgotICAgICogICAgICAgICAgIFNldCB0aGUgQ3Vyc29yIHNoYXBlLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgbkN1cnNvclR5cGUgLSAgIEN1cnNvciB0eXBlLiBzZWUgRmxhZ3MgZm9yIEN1cnNvciB0eXBlIGZvciB0aGUgZGV0YWlscy4KLSAgICAqICAgUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqICovCi0gICAgdm9pZCAoKkZGSV9TZXRDdXJzb3IpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgbkN1cnNvclR5cGUpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9TZXRDdXJzb3IKKyAgKiAgICAgICAgICAgU2V0IHRoZSBDdXJzb3Igc2hhcGUuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgbkN1cnNvclR5cGUgLSAgIEN1cnNvciB0eXBlLiBzZWUgRmxhZ3MgZm9yIEN1cnNvciB0eXBlIGZvciB0aGUKKyAgKiBkZXRhaWxzLgorICAqICAgUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogKi8KKyAgdm9pZCAoKkZGSV9TZXRDdXJzb3IpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgbkN1cnNvclR5cGUpOwogCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9TZXRUaW1lcgotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIGluc3RhbGxzIGEgc3lzdGVtIHRpbWVyLiBBIHRpbWUtb3V0IHZhbHVlIGlzIHNwZWNpZmllZCwKLSAgICAqICAgICAgICAgICBhbmQgZXZlcnkgdGltZSBhIHRpbWUtb3V0IG9jY3VycywgdGhlIHN5c3RlbSBwYXNzZXMgYSBtZXNzYWdlIHRvCi0gICAgKiAgICAgICAgICAgdGhlIFRpbWVyUHJvYyBjYWxsYmFjayBmdW5jdGlvbi4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIHVFbGFwc2UgICAgIC0gICBTcGVjaWZpZXMgdGhlIHRpbWUtb3V0IHZhbHVlLCBpbiBtaWxsaXNlY29uZHMuCi0gICAgKiAgICAgICBscFRpbWVyRnVuYyAtICAgQSBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi1UaW1lckNhbGxiYWNrLgotICAgICogICBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBUaGUgdGltZXIgaWRlbnRpZmllciBvZiB0aGUgbmV3IHRpbWVyIGlmIHRoZSBmdW5jdGlvbiBpcyBzdWNjZXNzZnVsLgotICAgICogICAgICAgQW4gYXBwbGljYXRpb24gcGFzc2VzIHRoaXMgdmFsdWUgdG8gdGhlIEZGSV9LaWxsVGltZXIgbWV0aG9kIHRvIGtpbGwKLSAgICAqICAgICAgIHRoZSB0aW1lci4gTm9uemVybyBpZiBpdCBpcyBzdWNjZXNzZnVsOyBvdGhlcndpc2UsIGl0IGlzIHplcm8uCi0gICAgKiAqLwotICAgIGludCAgKCpGRklfU2V0VGltZXIpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgdUVsYXBzZSwgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYyk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX1NldFRpbWVyCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIGluc3RhbGxzIGEgc3lzdGVtIHRpbWVyLiBBIHRpbWUtb3V0IHZhbHVlIGlzCisgICogc3BlY2lmaWVkLAorICAqICAgICAgICAgICBhbmQgZXZlcnkgdGltZSBhIHRpbWUtb3V0IG9jY3VycywgdGhlIHN5c3RlbSBwYXNzZXMgYSBtZXNzYWdlIHRvCisgICogICAgICAgICAgIHRoZSBUaW1lclByb2MgY2FsbGJhY2sgZnVuY3Rpb24uCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgdUVsYXBzZSAgICAgLSAgIFNwZWNpZmllcyB0aGUgdGltZS1vdXQgdmFsdWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgKiAgICAgICBscFRpbWVyRnVuYyAtICAgQSBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi1UaW1lckNhbGxiYWNrLgorICAqICAgUmV0dXJuIHZhbHVlOgorICAqICAgICAgIFRoZSB0aW1lciBpZGVudGlmaWVyIG9mIHRoZSBuZXcgdGltZXIgaWYgdGhlIGZ1bmN0aW9uIGlzIHN1Y2Nlc3NmdWwuCisgICogICAgICAgQW4gYXBwbGljYXRpb24gcGFzc2VzIHRoaXMgdmFsdWUgdG8gdGhlIEZGSV9LaWxsVGltZXIgbWV0aG9kIHRvIGtpbGwKKyAgKiAgICAgICB0aGUgdGltZXIuIE5vbnplcm8gaWYgaXQgaXMgc3VjY2Vzc2Z1bDsgb3RoZXJ3aXNlLCBpdCBpcyB6ZXJvLgorICAqICovCisgIGludCAoKkZGSV9TZXRUaW1lcikoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHVFbGFwc2UsCisgICAgICAgICAgICAgICAgICAgICAgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYyk7CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0tpbGxUaW1lcgotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIGtpbGxzIHRoZSB0aW1lciBldmVudCBpZGVudGlmaWVkIGJ5IG5JREV2ZW50LCBzZXQgYnkgYW4gZWFybGllciBjYWxsIHRvIEZGSV9TZXRUaW1lci4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIG5UaW1lcklEICAgIC0gICBUaGUgdGltZXIgSUQgcmV0dXJuIGJ5IEZGSV9TZXRUaW1lciBmdW5jdGlvbi4KLSAgICAqICAgUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqICovCi0gICAgdm9pZCAoKkZGSV9LaWxsVGltZXIpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgblRpbWVySUQpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9LaWxsVGltZXIKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qga2lsbHMgdGhlIHRpbWVyIGV2ZW50IGlkZW50aWZpZWQgYnkgbklERXZlbnQsIHNldCBieQorICAqIGFuIGVhcmxpZXIgY2FsbCB0byBGRklfU2V0VGltZXIuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgblRpbWVySUQgICAgLSAgIFRoZSB0aW1lciBJRCByZXR1cm4gYnkgRkZJX1NldFRpbWVyIGZ1bmN0aW9uLgorICAqICAgUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogKi8KKyAgdm9pZCAoKkZGSV9LaWxsVGltZXIpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgblRpbWVySUQpOwogCisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dldExvY2FsVGltZQorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCByZWNlaXZlcyB0aGUgY3VycmVudCBsb2NhbCB0aW1lIG9uIHRoZSBzeXN0ZW0uCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICBSZXR1cm4gdmFsdWU6CisgICogICAgICAgTm9uZS4KKyAgKiAqLworICBGUERGX1NZU1RFTVRJTUUgKCpGRklfR2V0TG9jYWxUaW1lKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyk7CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0dldExvY2FsVGltZQotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUgb24gdGhlIHN5c3RlbS4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqICovCi0gICAgRlBERl9TWVNURU1USU1FICgqRkZJX0dldExvY2FsVGltZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9PbkNoYW5nZQorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgdG8gbm90aWZ5IGltcGxlbWVudGF0aW9uIHdoZW4gdGhlCisgICogdmFsdWUgb2YgYW55IEZvcm1GaWVsZCBvbiB0aGUgZG9jdW1lbnQgaGFkIGJlZW4gY2hhbmdlZC4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICBubworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogKi8KKyAgdm9pZCAoKkZGSV9PbkNoYW5nZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpOwogCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9PbkNoYW5nZQotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB0byBub3RpZnkgaW1wbGVtZW50YXRpb24gd2hlbiB0aGUgdmFsdWUgb2YgYW55IEZvcm1GaWVsZCBvbiB0aGUgZG9jdW1lbnQgaGFkIGJlZW4gY2hhbmdlZC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIG5vCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBOb25lLgotICAgICogKi8KLSAgICB2b2lkICgqRkZJX09uQ2hhbmdlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dldFBhZ2UKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2QgcmVjZWl2ZXMgdGhlIHBhZ2UgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpZWQKKyAgKiBwYWdlIGluZGV4LgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50CisgICogZnVuY3Rpb24uCisgICogICAgICAgblBhZ2VJbmRleCAgLSAgIEluZGV4IG51bWJlciBvZiB0aGUgcGFnZS4gMCBmb3IgdGhlIGZpcnN0IHBhZ2UuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KKyAgKiBDb21tZW50czoKKyAgKiAgICAgICBJbiBzb21lIGNhc2VzLCB0aGUgZG9jdW1lbnQtbGV2ZWwgSmF2YVNjcmlwdCBhY3Rpb24gbWF5IHJlZmVyIHRvIGEKKyAgKiBwYWdlIHdoaWNoIGhhZG4ndCBiZWVuIGxvYWRlZCB5ZXQuCisgICogICAgICAgVG8gc3VjY2Vzc2Z1bGx5IHJ1biB0aGUgamF2YXNjcmlwdCBhY3Rpb24sIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gbG9hZAorICAqIHRoZSBwYWdlIGZvciBTREsuCisgICogKi8KKyAgRlBERl9QQUdFICAgKCpGRklfR2V0UGFnZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBuUGFnZUluZGV4KTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfR2V0UGFnZQotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIHRoZSBwYWdlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWVkIHBhZ2UgaW5kZXguCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KLSAgICAqICAgICAgIG5QYWdlSW5kZXggIC0gICBJbmRleCBudW1iZXIgb2YgdGhlIHBhZ2UuIDAgZm9yIHRoZSBmaXJzdCBwYWdlLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICAgICogQ29tbWVudHM6Ci0gICAgKiAgICAgICBJbiBzb21lIGNhc2VzLCB0aGUgZG9jdW1lbnQtbGV2ZWwgSmF2YVNjcmlwdCBhY3Rpb24gbWF5IHJlZmVyIHRvIGEgcGFnZSB3aGljaCBoYWRuJ3QgYmVlbiBsb2FkZWQgeWV0LgotICAgICogICAgICAgVG8gc3VjY2Vzc2Z1bGx5IHJ1biB0aGUgamF2YXNjcmlwdCBhY3Rpb24sIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gbG9hZCB0aGUgcGFnZSBmb3IgU0RLLgotICAgICogKi8KLSAgICBGUERGX1BBR0UgICAoKkZGSV9HZXRQYWdlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IG5QYWdlSW5kZXgpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9HZXRDdXJyZW50UGFnZQorICAqICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIHRoZSBjdXJyZW50IHBhZ2UgcG9pbnRlci4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorICAqIGZ1bmN0aW9uLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgICogKi8KKyAgRlBERl9QQUdFICAgKCpGRklfR2V0Q3VycmVudFBhZ2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfR2V0Q3VycmVudFBhZ2UKLSAgICAqICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIHRoZSBjdXJyZW50IHBhZ2UgcG9pbnRlci4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICAgICogKi8KLSAgICBGUERGX1BBR0UgICAoKkZGSV9HZXRDdXJyZW50UGFnZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9HZXRSb3RhdGlvbgorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCByZWNlaXZlcyBjdXJyZW50bHkgcm90YXRpb24gb2YgdGhlIHBhZ2Ugdmlldy4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIFRoZSBwYWdlIHJvdGF0aW9uLiBTaG91bGQgYmUgMCgwIGRlZ3JlZSksMSg5MCBkZWdyZWUpLDIoMTgwCisgICogZGVncmVlKSwzKDI3MCBkZWdyZWUpLCBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uCisgICogKi8KKyAgaW50ICgqRkZJX0dldFJvdGF0aW9uKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9QQUdFIHBhZ2UpOwogCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9HZXRSb3RhdGlvbgotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIGN1cnJlbnRseSByb3RhdGlvbiBvZiB0aGUgcGFnZSB2aWV3LgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgVGhlIHBhZ2Ugcm90YXRpb24uIFNob3VsZCBiZSAwKDAgZGVncmVlKSwxKDkwIGRlZ3JlZSksMigxODAgZGVncmVlKSwzKDI3MCBkZWdyZWUpLCBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uCi0gICAgKiAqLwotICAgIGludCAgICAgKCpGRklfR2V0Um90YXRpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1BBR0UgcGFnZSk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0V4ZWN1dGVOYW1lZEFjdGlvbgorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGV4ZWN1dGUgYW4gbmFtZWQgYWN0aW9uLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBuYW1lZEFjdGlvbiAgICAgLSAgIEEgYnl0ZSBzdHJpbmcgd2hpY2ggaW5kaWNhdGVzIHRoZSBuYW1lZCBhY3Rpb24sCisgICogdGVybWluYXRlZCBieSAwLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBOb25lLgorICAqIENvbW1lbnRzOgorICAqICAgICAgIFNlZSB0aGUgbmFtZWQgYWN0aW9ucyBkZXNjcmlwdGlvbiBvZiA8PFBERiBSZWZlcmVuY2UsIHZlcnNpb24gMS43Pj4KKyAgKiBmb3IgbW9yZSBkZXRhaWxzLgorICAqICovCisgIHZvaWQgKCpGRklfRXhlY3V0ZU5hbWVkQWN0aW9uKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBuYW1lZEFjdGlvbik7CisgIC8qKgorICAqIEBicmllZiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgdGV4dCBmaWVsZCBpcyBnZXR0aW5nIG9yIGxvc2luZyBhCisgICogZm9jdXMuCisgICoKKyAgKiBAcGFyYW1baW5dIHBUaGlzICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogQHBhcmFtW2luXSB2YWx1ZSAgICAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGQsIGluIFVURi0xNkxFCisgICogZm9ybWF0LgorICAqIEBwYXJhbVtpbl0gdmFsdWVMZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdmFsdWUsIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICogKG5vdCBieXRlcykuCisgICogQHBhcmFtW2luXSBpc19mb2N1cyAgIFRydWUgaWYgdGhlIGZvcm0gZmllbGQgaXMgZ2V0dGluZyBhIGZvY3VzLCBGYWxzZSBmb3IKKyAgKiBsb3NpbmcgYSBmb2N1cy4KKyAgKgorICAqIEByZXR1cm4gTm9uZS4KKyAgKgorICAqIEBub3RlIEN1cnJlbnRseSxvbmx5IHN1cHBvcnQgdGV4dCBmaWVsZCBhbmQgY29tYm9ib3ggZmllbGQuCisgICogKi8KKyAgdm9pZCAoKkZGSV9TZXRUZXh0RmllbGRGb2N1cykoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCB2YWx1ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGlzX2ZvY3VzKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfRXhlY3V0ZU5hbWVkQWN0aW9uCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBleGVjdXRlIGFuIG5hbWVkIGFjdGlvbi4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBuYW1lZEFjdGlvbiAgICAgLSAgIEEgYnl0ZSBzdHJpbmcgd2hpY2ggaW5kaWNhdGVzIHRoZSBuYW1lZCBhY3Rpb24sIHRlcm1pbmF0ZWQgYnkgMC4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgIFNlZSB0aGUgbmFtZWQgYWN0aW9ucyBkZXNjcmlwdGlvbiBvZiA8PFBERiBSZWZlcmVuY2UsIHZlcnNpb24gMS43Pj4gZm9yIG1vcmUgZGV0YWlscy4KLSAgICAqICovCi0gICAgdm9pZCAgICAoKkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0JZVEVTVFJJTkcgbmFtZWRBY3Rpb24pOwotICAgIC8qKgotICAgICogQGJyaWVmIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSB0ZXh0IGZpZWxkIGlzIGdldHRpbmcgb3IgbG9zaW5nIGEgZm9jdXMuCi0gICAgKgotICAgICogQHBhcmFtW2luXSBwVGhpcyAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogQHBhcmFtW2luXSB2YWx1ZSAgICAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGQsIGluIFVURi0xNkxFIGZvcm1hdC4KLSAgICAqIEBwYXJhbVtpbl0gdmFsdWVMZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdmFsdWUsIG51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpLgotICAgICogQHBhcmFtW2luXSBpc19mb2N1cyAgIFRydWUgaWYgdGhlIGZvcm0gZmllbGQgaXMgZ2V0dGluZyBhIGZvY3VzLCBGYWxzZSBmb3IgbG9zaW5nIGEgZm9jdXMuCi0gICAgKgotICAgICogQHJldHVybiBOb25lLgotICAgICoKLSAgICAqIEBub3RlIEN1cnJlbnRseSxvbmx5IHN1cHBvcnQgdGV4dCBmaWVsZCBhbmQgY29tYm9ib3ggZmllbGQuCi0gICAgKiAqLwotICAgIHZvaWQgICAgKCpGRklfU2V0VGV4dEZpZWxkRm9jdXMpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgdmFsdWUsIEZQREZfRFdPUkQgdmFsdWVMZW4sIEZQREZfQk9PTCBpc19mb2N1cyk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0RvVVJJQWN0aW9uCisgICogICAgICAgICAgIFRoaXMgYWN0aW9uIHJlc29sdmVzIHRvIGEgdW5pZm9ybSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIE5vCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGJzVVJJICAgICAgICAgICAtICAgQSBieXRlIHN0cmluZyB3aGljaCBpbmRpY2F0ZXMgdGhlIHVuaWZvcm0gcmVzb3VyY2UKKyAgKiBpZGVudGlmaWVyLCB0ZXJtaW5hdGVkIGJ5IDAuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogQ29tbWVudHM6CisgICogICAgICAgU2VlIHRoZSBVUkkgYWN0aW9ucyBkZXNjcmlwdGlvbiBvZiA8PFBERiBSZWZlcmVuY2UsIHZlcnNpb24gMS43Pj4gZm9yCisgICogbW9yZSBkZXRhaWxzLgorICAqICovCisgIHZvaWQgKCpGRklfRG9VUklBY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNVUkkpOwogCi0KLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0RvVVJJQWN0aW9uCi0gICAgKiAgICAgICAgICAgVGhpcyBhY3Rpb24gcmVzb2x2ZXMgdG8gYSB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICBObwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBic1VSSSAgICAgICAgICAgLSAgIEEgYnl0ZSBzdHJpbmcgd2hpY2ggaW5kaWNhdGVzIHRoZSB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIsIHRlcm1pbmF0ZWQgYnkgMC4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgIFNlZSB0aGUgVVJJIGFjdGlvbnMgZGVzY3JpcHRpb24gb2YgPDxQREYgUmVmZXJlbmNlLCB2ZXJzaW9uIDEuNz4+IGZvciBtb3JlIGRldGFpbHMuCi0gICAgKiAqLwotICAgIHZvaWQgICAgKCpGRklfRG9VUklBY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0JZVEVTVFJJTkcgYnNVUkkpOwotCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9Eb0dvVG9BY3Rpb24KLSAgICAqICAgICAgICAgICBUaGlzIGFjdGlvbiBjaGFuZ2VzIHRoZSB2aWV3IHRvIGEgc3BlY2lmaWVkIGRlc3RpbmF0aW9uLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgTm8KLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgblBhZ2VJbmRleCAgICAgIC0gICBUaGUgaW5kZXggb2YgdGhlIFBERiBwYWdlLgotICAgICogICAgICAgem9vbU1vZGUgICAgICAgIC0gICBUaGUgem9vbSBtb2RlIGZvciB2aWV3aW5nIHBhZ2UuU2VlIE1hY3JvcyAiUERGWk9PTV9YWFgiIGRlZmluZWQgaW4gImZwZGZkb2MuaCIuCi0gICAgKiAgICAgICBmUG9zQXJyYXkgICAgICAgLSAgIFRoZSBmbG9hdCBhcnJheSB3aGljaCBjYXJyaWVzIHRoZSBwb3NpdGlvbiBpbmZvLgotICAgICogICAgICAgc2l6ZW9mQXJyYXkgICAgIC0gICBUaGUgc2l6ZSBvZiBmbG9hdCBhcnJheS4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgIFNlZSB0aGUgRGVzdGluYXRpb25zIGRlc2NyaXB0aW9uIG9mIDw8UERGIFJlZmVyZW5jZSwgdmVyc2lvbiAxLjc+PiBpbiA4LjIuMSBmb3IgbW9yZSBkZXRhaWxzLgotICAgICoqLwotICAgIHZvaWQgICAgKCpGRklfRG9Hb1RvQWN0aW9uKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgaW50IG5QYWdlSW5kZXgsIGludCB6b29tTW9kZSwgZmxvYXQqIGZQb3NBcnJheSwgaW50IHNpemVvZkFycmF5KTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfRG9Hb1RvQWN0aW9uCisgICogICAgICAgICAgIFRoaXMgYWN0aW9uIGNoYW5nZXMgdGhlIHZpZXcgdG8gYSBzcGVjaWZpZWQgZGVzdGluYXRpb24uCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgTm8KKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgblBhZ2VJbmRleCAgICAgIC0gICBUaGUgaW5kZXggb2YgdGhlIFBERiBwYWdlLgorICAqICAgICAgIHpvb21Nb2RlICAgICAgICAtICAgVGhlIHpvb20gbW9kZSBmb3Igdmlld2luZyBwYWdlLlNlZSBNYWNyb3MKKyAgKiJQREZaT09NX1hYWCIgZGVmaW5lZCBpbiAiZnBkZmRvYy5oIi4KKyAgKiAgICAgICBmUG9zQXJyYXkgICAgICAgLSAgIFRoZSBmbG9hdCBhcnJheSB3aGljaCBjYXJyaWVzIHRoZSBwb3NpdGlvbiBpbmZvLgorICAqICAgICAgIHNpemVvZkFycmF5ICAgICAtICAgVGhlIHNpemUgb2YgZmxvYXQgYXJyYXkuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogQ29tbWVudHM6CisgICogICAgICAgU2VlIHRoZSBEZXN0aW5hdGlvbnMgZGVzY3JpcHRpb24gb2YgPDxQREYgUmVmZXJlbmNlLCB2ZXJzaW9uIDEuNz4+IGluCisgICo4LjIuMSBmb3IgbW9yZSBkZXRhaWxzLgorICAqKi8KKyAgdm9pZCAoKkZGSV9Eb0dvVG9BY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgem9vbU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZlBvc0FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVvZkFycmF5KTsKIAogICAvKioKICAgKiAgIHBvaW50ZXIgdG8gSVBERl9KU1BMQVRGT1JNIGludGVyZmFjZQogICAqKi8KLSAgSVBERl9KU1BMQVRGT1JNKiAgbV9wSnNQbGF0Zm9ybTsKKyAgSVBERl9KU1BMQVRGT1JNKiBtX3BKc1BsYXRmb3JtOwogCiAgIC8qKgogICAgICogTWV0aG9kOiBGRklfRGlzcGxheUNhcmV0CkBAIC01OTQsMjQ5ICs3MTMsMzE4IEBACiAgICAgKiAgICAgICAgICAgeWVzCiAgICAgKiBQYXJhbWV0ZXJzOgogICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIHBhZ2UgICAgICAgICAgICAtICAgSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0gICAgKiAgICAgICBsZWZ0ICAgICAgICAgICAgLSAgIExlZnQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgKiAgICAgICB0b3AgICAgICAgICAgICAgLSAgIFRvcCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KLSAgICAqICAgICAgIHJpZ2h0ICAgICAgICAgICAtICAgUmlnaHQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgKiAgICAgICBib3R0b20gICAgICAgICAgLSAgIEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KKyAgICAqICAgICAgIHBhZ2UgICAgICAgICAgICAtICAgSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAgICAqZnVuY3Rpb24uCisgICAgKiAgICAgICBsZWZ0ICAgICAgICAgICAgLSAgIExlZnQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlCisgICAgKmNvb3JkaW5hdGUuCisgICAgKiAgICAgICB0b3AgICAgICAgICAgICAgLSAgIFRvcCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICAqY29vcmRpbmF0ZS4KKyAgICAqICAgICAgIHJpZ2h0ICAgICAgICAgICAtICAgUmlnaHQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlCisgICAgKmNvb3JkaW5hdGUuCisgICAgKiAgICAgICBib3R0b20gICAgICAgICAgLSAgIEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICAqY29vcmRpbmF0ZS4KICAgICAqIFJldHVybiB2YWx1ZToKICAgICAqICAgICAgIE5vbmUuCiAgICAgKiovCi0gICAgdm9pZCAgICAoKkZGSV9EaXNwbGF5Q2FyZXQpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1BBR0UgcGFnZSwgRlBERl9CT09MIGJWaXNpYmxlLCBkb3VibGUgbGVmdCwgZG91YmxlIHRvcCwgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tKTsKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0dldEN1cnJlbnRQYWdlSW5kZXgKLSAgICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGdldCB0aGUgY3VycmVudCBwYWdlIGluZGV4LgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIFRoZSBpbmRleCBvZiBjdXJyZW50IHBhZ2UuCi0gICAgKiovCi0gICAgaW50ICAgICAoKkZGSV9HZXRDdXJyZW50UGFnZUluZGV4KShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7Ci0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9TZXRDdXJyZW50UGFnZQotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBjdXJyZW50IHBhZ2UuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgotICAgICogICAgICAgaUN1clBhZ2UgICAgICAgIC0gICBUaGUgaW5kZXggb2YgdGhlIFBERiBwYWdlLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqKi8KLSAgICB2b2lkICAgICgqRkZJX1NldEN1cnJlbnRQYWdlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IGlDdXJQYWdlKTsKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0dvdG9VUkwKLSAgICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGxpbmsgdG8gdGhlIHNwZWNpZmllZCBVUkwuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICBubwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCi0gICAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIFVSTCwgaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqKi8KLSAgICB2b2lkICAgICgqRkZJX0dvdG9VUkwpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREVTVFJJTkcgd3NVUkwpOwotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfR2V0UGFnZVZpZXdSZWN0Ci0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIGN1cnJlbnQgcGFnZSB2aWV3IHJlY3RhbmdsZS4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBwYWdlICAgICAgICAgICAgLSAgIEhhbmRsZSB0byBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICAgICogICAgICAgbGVmdCAgICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHBhZ2UgdmlldyBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgKiAgICAgICB0b3AgICAgICAgICAgICAgLSAgIFRoZSBwb2ludGVyIHRvIHJlY2VpdmUgdG9wIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHZpZXcgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICogICAgICAgcmlnaHQgICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICogICAgICAgYm90dG9tICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiovCi0gICAgdm9pZCAgICAoKkZGSV9HZXRQYWdlVmlld1JlY3QpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1BBR0UgcGFnZSwgZG91YmxlKiBsZWZ0LCBkb3VibGUqIHRvcCwgZG91YmxlKiByaWdodCwgZG91YmxlKiBib3R0b20pOwotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfUG9wdXBNZW51Ci0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCB0cmFjayB0aGUgcmlnaHQgY29udGV4dCBtZW51IGZvciBYRkEgZmllbGRzLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIHBhZ2UgICAgICAgICAgICAtICAgSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0gICAgKiAgICAgICBoV2lkZ2V0ICAgICAgICAgLSAgIEhhbmRsZSB0byBYRkEgZmllbGRzLgotICAgICogICAgICAgbWVudUZsYWcgICAgICAgIC0gICBUaGUgbWVudSBmbGFncy4gUGxlYXNlIHJlZmVyIHRvIG1hY3JvIGRlZmluaXRpb24gb2YgRlhGQV9NRU1VX1hYWCBhbmQgdGhpcyBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlc2UgbWFjcm9zLgotICAgICogICAgICAgeCAgICAgICAgICAgICAgIC0gICBYIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICogICAgICAgeSAgICAgICAgICAgICAgIC0gICBZIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgotICAgICoqLwotICAgIEZQREZfQk9PTCAoKkZGSV9Qb3B1cE1lbnUpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1BBR0UgcGFnZSwgRlBERl9XSURHRVQgaFdpZGdldCwgaW50IG1lbnVGbGFnLCBmbG9hdCB4LCBmbG9hdCB5KTsKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX09wZW5GaWxlCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBvcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbW9kZS4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uCi0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIGZpbGVGbGFnICAgICAgICAtICAgVGhlIGZpbGUgZmxhZy5QbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbiBvZiBGWEZBX1NBVkVBU19YWFggYW5kIHRoaXMgY2FuIGJlIG9uZSBvZiB0aGVzZSBtYWNyb3MuCi0gICAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZpbGUgVVJMLCBpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICBtb2RlICAgICAgICAgICAgLSAgIFRoZSBtb2RlIGZvciBvcGVuIGZpbGUuCi0gICAgKiBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBUaGUgaGFuZGxlIHRvIEZQREZfRklMRUhBTkRMRVIuCi0gICAgKiovCi0gICAgRlBERl9GSUxFSEFORExFUiogKCpGRklfT3BlbkZpbGUpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgZmlsZUZsYWcsIEZQREZfV0lERVNUUklORyB3c1VSTCwgY29uc3QgY2hhciogbW9kZSk7Ci0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9FbWFpbFRvCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBlbWFpbCB0aGUgc3BlY2lmaWVkIGZpbGUgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgY29udGFjdGVyLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIHBGaWxlSGFuZGxlciAgICAtICAgSGFuZGxlIHRvIHRoZSBGUERGX0ZJTEVIQU5ETEVSLgotICAgICogICAgICAgcFRvICAgICAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiByZWNpcGllbnRzIGZvciB0aGUgbWVzc2FnZSxpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICBwU3ViamVjdCAgICAgICAgLSAgIFRoZSBzdWJqZWN0IG9mIHRoZSBtZXNzYWdlLGluIFVURi0xNkxFIGZvcm1hdC4KLSAgICAqICAgICAgIHBDQyAgICAgICAgICAgICAtICAgQSBzZW1pY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgQ0MgcmVjaXBpZW50cyBmb3IgdGhlIG1lc3NhZ2UsaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogICAgICAgcEJjYyAgICAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBCQ0MgcmVjaXBpZW50cyBmb3IgdGhlIG1lc3NhZ2UsaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogICAgICAgcE1zZyAgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB0byBiZSBzZW50LkNhbiBiZSBOVUxMLGluIFVURi0xNkxFIGZvcm1hdC4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiovCi0gICAgdm9pZCAgICAoKkZGSV9FbWFpbFRvKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9GSUxFSEFORExFUiogZmlsZUhhbmRsZXIsIEZQREZfV0lERVNUUklORyBwVG8sIEZQREZfV0lERVNUUklORyBwU3ViamVjdCwgRlBERl9XSURFU1RSSU5HIHBDQywgRlBERl9XSURFU1RSSU5HIHBCY2MsIEZQREZfV0lERVNUUklORyBwTXNnKTsKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX1VwbG9hZFRvCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBnZXQgdXBsb2FkIHRoZSBzcGVjaWZpZWQgZmlsZSBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZCBVUkwuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgcEZpbGVIYW5kbGVyICAgIC0gICBIYW5kbGUgdG8gdGhlIEZQREZfRklMRUhBTkRMRVIuCi0gICAgKiAgICAgICBmaWxlRmxhZyAgICAgICAgLSAgIFRoZSBmaWxlIGZsYWcuUGxlYXNlIHJlZmVyIHRvIG1hY3JvIGRlZmluaXRpb24gb2YgRlhGQV9TQVZFQVNfWFhYIGFuZCB0aGlzIGNhbiBiZSBvbmUgb2YgdGhlc2UgbWFjcm9zLgotICAgICogICAgICAgdXBsb2FkVG8gICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBVUkwgcGF0aCwgaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqKi8KLSAgICB2b2lkICAgICgqRkZJX1VwbG9hZFRvKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9GSUxFSEFORExFUiogZmlsZUhhbmRsZXIsIGludCBmaWxlRmxhZywgRlBERl9XSURFU1RSSU5HIHVwbG9hZFRvKTsKKyAgdm9pZCAoKkZGSV9EaXNwbGF5Q2FyZXQpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYm90dG9tKTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfR2V0Q3VycmVudFBhZ2VJbmRleAorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGdldCB0aGUgY3VycmVudCBwYWdlIGluZGV4LgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQKKyAgKmZ1bmN0aW9uLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgaW5kZXggb2YgY3VycmVudCBwYWdlLgorICAqKi8KKyAgaW50ICgqRkZJX0dldEN1cnJlbnRQYWdlSW5kZXgpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX1NldEN1cnJlbnRQYWdlCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBjdXJyZW50IHBhZ2UuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorICAqZnVuY3Rpb24uCisgICogICAgICAgaUN1clBhZ2UgICAgICAgIC0gICBUaGUgaW5kZXggb2YgdGhlIFBERiBwYWdlLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBOb25lLgorICAqKi8KKyAgdm9pZCAoKkZGSV9TZXRDdXJyZW50UGFnZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpQ3VyUGFnZSk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dvdG9VUkwKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBsaW5rIHRvIHRoZSBzcGVjaWZpZWQgVVJMLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIG5vCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorICAqZnVuY3Rpb24uCisgICogICAgICAgd3NVUkwgICAgICAgICAgIC0gICBUaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBVUkwsIGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgTm9uZS4KKyAgKiovCisgIHZvaWQgKCpGRklfR290b1VSTCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NVUkwpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9HZXRQYWdlVmlld1JlY3QKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIGN1cnJlbnQgcGFnZSB2aWV3IHJlY3RhbmdsZS4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgcGFnZSAgICAgICAgICAgIC0gICBIYW5kbGUgdG8gcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICAqZnVuY3Rpb24uCisgICogICAgICAgbGVmdCAgICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHBhZ2UKKyAgKnZpZXcgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgorICAqICAgICAgIHRvcCAgICAgICAgICAgICAtICAgVGhlIHBvaW50ZXIgdG8gcmVjZWl2ZSB0b3AgcG9zaXRpb24gb2YgdGhlIHBhZ2UKKyAgKnZpZXcgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgorICAqICAgICAgIHJpZ2h0ICAgICAgICAgICAtICAgVGhlIHBvaW50ZXIgdG8gcmVjZWl2ZSByaWdodCBwb3NpdGlvbiBvZiB0aGUKKyAgKmNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCisgICogICAgICAgYm90dG9tICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUKKyAgKmNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICoqLworICB2b2lkICgqRkZJX0dldFBhZ2VWaWV3UmVjdCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tKTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfUG9wdXBNZW51CisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgdHJhY2sgdGhlIHJpZ2h0IGNvbnRleHQgbWVudSBmb3IgWEZBIGZpZWxkcy4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgcGFnZSAgICAgICAgICAgIC0gICBIYW5kbGUgdG8gcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICAqZnVuY3Rpb24uCisgICogICAgICAgaFdpZGdldCAgICAgICAgIC0gICBIYW5kbGUgdG8gWEZBIGZpZWxkcy4KKyAgKiAgICAgICBtZW51RmxhZyAgICAgICAgLSAgIFRoZSBtZW51IGZsYWdzLiBQbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbgorICAqb2YgRlhGQV9NRU1VX1hYWCBhbmQgdGhpcyBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlc2UgbWFjcm9zLgorICAqICAgICAgIHggICAgICAgICAgICAgICAtICAgWCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgKmNvb3JkaW5hdGUuCisgICogICAgICAgeSAgICAgICAgICAgICAgIC0gICBZIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAqY29vcmRpbmF0ZS4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgorICAqKi8KKyAgRlBERl9CT09MICgqRkZJX1BvcHVwTWVudSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfUEFHRSBwYWdlLCBGUERGX1dJREdFVCBoV2lkZ2V0LCBpbnQgbWVudUZsYWcsIGZsb2F0IHgsIGZsb2F0IHkpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9PcGVuRmlsZQorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIG9wZW4gdGhlIHNwZWNpZmllZCBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBtb2RlLgorICAqIEludGVyZmFjZSBWZXJzaW9uCisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGZpbGVGbGFnICAgICAgICAtICAgVGhlIGZpbGUgZmxhZy5QbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbiBvZgorICAqRlhGQV9TQVZFQVNfWFhYIGFuZCB0aGlzIGNhbiBiZSBvbmUgb2YgdGhlc2UgbWFjcm9zLgorICAqICAgICAgIHdzVVJMICAgICAgICAgICAtICAgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZmlsZSBVUkwsIGluIFVURi0xNkxFCisgICpmb3JtYXQuCisgICogICAgICAgbW9kZSAgICAgICAgICAgIC0gICBUaGUgbW9kZSBmb3Igb3BlbiBmaWxlLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgaGFuZGxlIHRvIEZQREZfRklMRUhBTkRMRVIuCisgICoqLworICBGUERGX0ZJTEVIQU5ETEVSKiAoKkZGSV9PcGVuRmlsZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtb2RlKTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfRW1haWxUbworICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGVtYWlsIHRoZSBzcGVjaWZpZWQgZmlsZSBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZAorICAqY29udGFjdGVyLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBwRmlsZUhhbmRsZXIgICAgLSAgIEhhbmRsZSB0byB0aGUgRlBERl9GSUxFSEFORExFUi4KKyAgKiAgICAgICBwVG8gICAgICAgICAgICAgLSAgIEEgc2VtaWNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIHJlY2lwaWVudHMgZm9yIHRoZQorICAqbWVzc2FnZSxpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogICAgICAgcFN1YmplY3QgICAgICAgIC0gICBUaGUgc3ViamVjdCBvZiB0aGUgbWVzc2FnZSxpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogICAgICAgcENDICAgICAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBDQyByZWNpcGllbnRzIGZvcgorICAqdGhlIG1lc3NhZ2UsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqICAgICAgIHBCY2MgICAgICAgICAgICAtICAgQSBzZW1pY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgQkNDIHJlY2lwaWVudHMgZm9yCisgICp0aGUgbWVzc2FnZSxpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogICAgICAgcE1zZyAgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB0byBiZSBzZW50LkNhbiBiZQorICAqTlVMTCxpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICoqLworICB2b2lkICgqRkZJX0VtYWlsVG8pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRUhBTkRMRVIqIGZpbGVIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBwVG8sCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHBTdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBwQ0MsCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHBCY2MsCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHBNc2cpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9VcGxvYWRUbworICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGdldCB1cGxvYWQgdGhlIHNwZWNpZmllZCBmaWxlIHN0cmVhbSB0byB0aGUKKyAgKnNwZWNpZmllZCBVUkwuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIHBGaWxlSGFuZGxlciAgICAtICAgSGFuZGxlIHRvIHRoZSBGUERGX0ZJTEVIQU5ETEVSLgorICAqICAgICAgIGZpbGVGbGFnICAgICAgICAtICAgVGhlIGZpbGUgZmxhZy5QbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbiBvZgorICAqRlhGQV9TQVZFQVNfWFhYIGFuZCB0aGlzIGNhbiBiZSBvbmUgb2YgdGhlc2UgbWFjcm9zLgorICAqICAgICAgIHVwbG9hZFRvICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgVVJMIHBhdGgsIGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgTm9uZS4KKyAgKiovCisgIHZvaWQgKCpGRklfVXBsb2FkVG8pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVIQU5ETEVSKiBmaWxlSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdXBsb2FkVG8pOwogCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9HZXRQbGF0Zm9ybQotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBjdXJyZW50IHBsYXRmb3JtLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIHBsYXRmb3JtICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcGxhdGZvcm0uQ2FuIGJlIE5VTEwsaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogICAgICAgbGVuZ3RoICAgICAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlIDAuCi0gICAgKiBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4KLSAgICAqKi8KLSAgICBpbnQgICAgICgqRkZJX0dldFBsYXRmb3JtKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgdm9pZCogcGxhdGZvcm0sIGludCBsZW5ndGgpOwotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfR2V0TGFuZ3VhZ2UKLSAgICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGdldCB0aGUgY3VycmVudCBsYW5ndWFnZS4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBsYW5ndWFnZSAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuQ2FuIGJlIE5VTEwuCi0gICAgKiAgICAgICBsZW5ndGggICAgICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUgMC4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLgotICAgICoqLwotICAgIGludCAgICAgKCpGRklfR2V0TGFuZ3VhZ2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCB2b2lkKiBsYW5ndWFnZSwgaW50IGxlbmd0aCk7Ci0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9Eb3dubG9hZEZyb21VUkwKLSAgICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvd25sb2FkIHRoZSBzcGVjaWZpZWQgZmlsZSBmcm9tIHRoZSBVUkwuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgVVJMICAgICAgICAgICAgIC0gICBUaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBmaWxlIFVSTCwgaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgVGhlIGhhbmRsZSB0byBGUERGX0ZJTEVIQU5ETEVSLgotICAgICoqLwotICAgIEZQREZfTFBGSUxFSEFORExFUiAgKCpGRklfRG93bmxvYWRGcm9tVVJMKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIFVSTCk7Ci0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9Qb3N0UmVxdWVzdFVSTAotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgcG9zdCB0aGUgcmVxdWVzdCB0byB0aGUgc2VydmVyIFVSTC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlcnZlciBVUkwsIGluIFVURi0xNkxFIGZvcm1hdC4KLSAgICAqICAgICAgIHdzRGF0YSAgICAgICAgICAtICAgVGhlIHBvc3QgZGF0YSxpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICB3c0NvbnRlbnRUeXBlICAgLSAgIFRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlcXVlc3QgZGF0YSxpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICB3c0VuY29kZSAgICAgICAgLSAgIFRoZSBlbmNvZGUgdHlwZSxpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICB3c0hlYWRlciAgICAgICAgLSAgIFRoZSByZXF1ZXN0IGhlYWRlcixpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICByZXNwb25zZSAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIEZQREZfQlNUUiB0byByZWNlaXZlIHRoZSByZXNwb25zZSBkYXRhIGZyb20gc2VydmVyLCxpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCi0gICAgKiovCi0gICAgRlBERl9CT09MICAgKCpGRklfUG9zdFJlcXVlc3RVUkwpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgd3NVUkwsIEZQREZfV0lERVNUUklORyB3c0RhdGEsIEZQREZfV0lERVNUUklORyB3c0NvbnRlbnRUeXBlLCBGUERGX1dJREVTVFJJTkcgd3NFbmNvZGUsIEZQREZfV0lERVNUUklORyB3c0hlYWRlciwgRlBERl9CU1RSKiByZXNwb25lKTsKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX1B1dFJlcXVlc3RVUkwKLSAgICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHB1dCB0aGUgcmVxdWVzdCB0byB0aGUgc2VydmVyIFVSTC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlcnZlciBVUkwsIGluIFVURi0xNkxFIGZvcm1hdC4KLSAgICAqICAgICAgIHdzRGF0YSAgICAgICAgICAtICAgVGhlIHB1dCBkYXRhLCBpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICB3c0VuY29kZSAgICAgICAgLSAgIFRoZSBlbmNvZGUgdHlwZSwgaW4gVVRSLTE2TEUgZm9ybWF0LgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzcywgb3RoZXJ3aXNlIEZBTFNFLgotICAgICoqLwotICAgIEZQREZfQk9PTCAgICgqRkZJX1B1dFJlcXVlc3RVUkwpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgd3NVUkwsIEZQREZfV0lERVNUUklORyB3c0RhdGEsIEZQREZfV0lERVNUUklORyB3c0VuY29kZSk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dldFBsYXRmb3JtCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBjdXJyZW50IHBsYXRmb3JtLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBwbGF0Zm9ybSAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlCisgICpwbGF0Zm9ybS5DYW4gYmUgTlVMTCxpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogICAgICAgbGVuZ3RoICAgICAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlCisgICowLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4KKyAgKiovCisgIGludCAoKkZGSV9HZXRQbGF0Zm9ybSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dldExhbmd1YWdlCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBjdXJyZW50IGxhbmd1YWdlLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBsYW5ndWFnZSAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGN1cnJlbnQKKyAgKmxhbmd1YWdlLkNhbiBiZSBOVUxMLgorICAqICAgICAgIGxlbmd0aCAgICAgICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZQorICAqMC4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuCisgICoqLworICBpbnQgKCpGRklfR2V0TGFuZ3VhZ2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9Eb3dubG9hZEZyb21VUkwKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBkb3dubG9hZCB0aGUgc3BlY2lmaWVkIGZpbGUgZnJvbSB0aGUgVVJMLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBVUkwgICAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZpbGUgVVJMLCBpbiBVVEYtMTZMRQorICAqZm9ybWF0LgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgaGFuZGxlIHRvIEZQREZfRklMRUhBTkRMRVIuCisgICoqLworICBGUERGX0xQRklMRUhBTkRMRVIgICgqRkZJX0Rvd25sb2FkRnJvbVVSTCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfV0lERVNUUklORyBVUkwpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9Qb3N0UmVxdWVzdFVSTAorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHBvc3QgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBVUkwuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIHdzVVJMICAgICAgICAgICAtICAgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgc2VydmVyIFVSTCwgaW4gVVRGLTE2TEUKKyAgKmZvcm1hdC4KKyAgKiAgICAgICB3c0RhdGEgICAgICAgICAgLSAgIFRoZSBwb3N0IGRhdGEsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqICAgICAgIHdzQ29udGVudFR5cGUgICAtICAgVGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcmVxdWVzdCBkYXRhLGluIFVURi0xNkxFCisgICpmb3JtYXQuCisgICogICAgICAgd3NFbmNvZGUgICAgICAgIC0gICBUaGUgZW5jb2RlIHR5cGUsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqICAgICAgIHdzSGVhZGVyICAgICAgICAtICAgVGhlIHJlcXVlc3QgaGVhZGVyLGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiAgICAgICByZXNwb25zZSAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIEZQREZfQlNUUiB0byByZWNlaXZlIHRoZSByZXNwb25zZQorICAqZGF0YSBmcm9tIHNlcnZlciwsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCisgICoqLworICBGUERGX0JPT0wgICAoKkZGSV9Qb3N0UmVxdWVzdFVSTCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfV0lERVNUUklORyB3c1VSTCwgRlBERl9XSURFU1RSSU5HIHdzRGF0YSwgRlBERl9XSURFU1RSSU5HIHdzQ29udGVudFR5cGUsIEZQREZfV0lERVNUUklORyB3c0VuY29kZSwgRlBERl9XSURFU1RSSU5HIHdzSGVhZGVyLCBGUERGX0JTVFIqIHJlc3BvbmUpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9QdXRSZXF1ZXN0VVJMCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgcHV0IHRoZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgVVJMLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlcnZlciBVUkwsIGluIFVURi0xNkxFCisgICpmb3JtYXQuCisgICogICAgICAgd3NEYXRhICAgICAgICAgIC0gICBUaGUgcHV0IGRhdGEsIGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiAgICAgICB3c0VuY29kZSAgICAgICAgLSAgIFRoZSBlbmNvZGUgdHlwZSwgaW4gVVRSLTE2TEUgZm9ybWF0LgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCisgICoqLworICBGUERGX0JPT0wgICAoKkZGSV9QdXRSZXF1ZXN0VVJMKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIHdzVVJMLCBGUERGX1dJREVTVFJJTkcgd3NEYXRhLCBGUERGX1dJREVTVFJJTkcgd3NFbmNvZGUpOwogCiB9IEZQREZfRk9STUZJTExJTkZPOwogCi0KLQogLyoqCiAgKiBGdW5jdGlvbjogRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudAogICogICAgICAgICAgSW5pdCBmb3JtIGZpbGwgZW52aXJvbm1lbnQuCiAgKiBDb21tZW50czoKICAqICAgICAgICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGZvcm0gZmlsbCBvcGVyYXRpb24uCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogICAgICAgICAgcEZvcm1GaWxsSW5mbyAgIC0gICBQb2ludGVyIHRvIGEgRlBERl9GT1JNRklMTElORk8gc3RydWN0dXJlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgUmV0dXJuIGhhbmRsZXIgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIE5VTEwgbWVhbnMgZmFpbHMuCiAgKiovCi1ETExFWFBPUlQgRlBERl9GT1JNSEFORExFIFNURENBTEwgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0ZPUk1GSUxMSU5GTyogZm9ybUluZm8pOworRExMRVhQT1JUIEZQREZfRk9STUhBTkRMRSBTVERDQUxMCitGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUZJTExJTkZPKiBmb3JtSW5mbyk7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvbm1lbnQKICAqICAgICAgICAgIEV4aXQgZm9ybSBmaWxsIGVudmlyb25tZW50LgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTlVMTC4KICAqKi8KQEAgLTg0NCwyNTAgKzEwMzIsMzU1IEBACiAKIC8qKgogICogRnVuY3Rpb246IEZPUk1fT25BZnRlckxvYWRQYWdlCi0gKiAgICAgICAgICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgaW1wbGVtZW50aW5nIGFsbCB0aGUgZm9ybSByZWxhdGVkIGZ1bmN0aW9ucy4gU2hvdWxkIGJlIGludm9rZWQgYWZ0ZXIgdXNlcgotICogICAgICAgICAgc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhIFBERiBwYWdlLCBhbmQgbWV0aG9kIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQgaGFkIGJlZW4gaW52b2tlZC4KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBpbXBsZW1lbnRpbmcgYWxsIHRoZSBmb3JtIHJlbGF0ZWQKKyAqZnVuY3Rpb25zLiBTaG91bGQgYmUgaW52b2tlZCBhZnRlciB1c2VyCisgKiAgICAgICAgICBzdWNjZXNzZnVsbHkgbG9hZGVkIGEgUERGIHBhZ2UsIGFuZCBtZXRob2QKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudCBoYWQgYmVlbiBpbnZva2VkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTk9ORS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9PbkJlZm9yZUNsb3NlUGFnZQotICogICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIGltcGxlbWVudGluZyBhbGwgdGhlIGZvcm0gcmVsYXRlZCBmdW5jdGlvbnMuIFNob3VsZCBiZSBpbnZva2VkIGJlZm9yZSB1c2VyCisgKiAgICAgICAgICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgaW1wbGVtZW50aW5nIGFsbCB0aGUgZm9ybSByZWxhdGVkCisgKmZ1bmN0aW9ucy4gU2hvdWxkIGJlIGludm9rZWQgYmVmb3JlIHVzZXIKICAqICAgICAgICAgIGNsb3NlIHRoZSBQREYgcGFnZS4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KKyAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAqZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTk9ORS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkJlZm9yZUNsb3NlUGFnZShGUERGX1BBR0UgcGFnZSwgRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX09uQmVmb3JlQ2xvc2VQYWdlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKIAogLyoqCiAqIEZ1bmN0aW9uOiBGT1JNX0RvRG9jdW1lbnRKU0FjdGlvbgotKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgRG9jdW1lbnQtbGV2ZWwgSmF2YVNjcmlwdCBhY3Rpb24uIEl0IHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZSBQREYgZG9jdW1lbnQKKyogICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBwZXJmb3JtaW5nIERvY3VtZW50LWxldmVsIEphdmFTY3JpcHQKKyphY3Rpb24uIEl0IHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZSBQREYgZG9jdW1lbnQKICogICAgICAgICAgIGhhZCBiZWVuIGxvYWRlZC4KICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisqICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIE5PTkUKICogQ29tbWVudHM6Ci0qICAgICAgICAgICBJZiB0aGVyZSBpcyBEb2N1bWVudC1sZXZlbCBKYXZhU2NyaXB0IGFjdGlvbiBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQsIHRoaXMgbWV0aG9kIHdpbGwgZXhlY3V0ZSB0aGUgamF2YXNjcmlwdCBhY3Rpb247CisqICAgICAgICAgICBJZiB0aGVyZSBpcyBEb2N1bWVudC1sZXZlbCBKYXZhU2NyaXB0IGFjdGlvbiBlbWJlZGRlZCBpbiB0aGUKKypkb2N1bWVudCwgdGhpcyBtZXRob2Qgd2lsbCBleGVjdXRlIHRoZSBqYXZhc2NyaXB0IGFjdGlvbjsKICogICAgICAgICAgIG90aGVyd2lzZSwgdGhlIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuCiAqKi8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50SlNBY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCi0KIC8qKgogKiBGdW5jdGlvbjogRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbgotKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgb3Blbi1hY3Rpb24gd2hlbiB0aGUgZG9jdW1lbnQgaXMgb3BlbmVkLgorKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgb3Blbi1hY3Rpb24gd2hlbiB0aGUgZG9jdW1lbnQKKyppcyBvcGVuZWQuCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorKiAgICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKypGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogKiBSZXR1cm4gVmFsdWU6CiAqICAgICAgICAgICBOT05FCiAqIENvbW1lbnRzOgotKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIG9wZW4tYWN0aW9ucyBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQuCisqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gb3Blbi1hY3Rpb25zIGVtYmVkZGVkIGluCisqdGhlIGRvY3VtZW50LgogKiovCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9Eb2N1bWVudE9wZW5BY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCi0KIC8vIGFkZGl0aW9uYWwgYWN0aW9ucyB0eXBlIG9mIGRvY3VtZW50LgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fV0MgICAgICAweDEwICAgICAgICAvL1dDLCBiZWZvcmUgY2xvc2luZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCi0jZGVmaW5lIEZQREZET0NfQUFDVElPTl9XUyAgICAgIDB4MTEgICAgICAgIC8vV1MsIGJlZm9yZSBzYXZpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQgYWN0aW9uLgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fRFMgICAgICAweDEyICAgICAgICAvL0RTLCBhZnRlciBzYXZpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQgYWN0aW9uLgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fV1AgICAgICAweDEzICAgICAgICAvL1dQLCBiZWZvcmUgcHJpbnRpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQgYWN0aW9uLgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fRFAgICAgICAweDE0ICAgICAgICAvL0RQLCBhZnRlciBwcmludGluZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCisjZGVmaW5lIEZQREZET0NfQUFDVElPTl9XQyBcCisgIDB4MTAgIC8vIFdDLCBiZWZvcmUgY2xvc2luZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCisjZGVmaW5lIEZQREZET0NfQUFDVElPTl9XUyBcCisgIDB4MTEgIC8vIFdTLCBiZWZvcmUgc2F2aW5nIGRvY3VtZW50LCBKYXZhU2NyaXB0IGFjdGlvbi4KKyNkZWZpbmUgRlBERkRPQ19BQUNUSU9OX0RTIDB4MTIgIC8vIERTLCBhZnRlciBzYXZpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbi4KKyNkZWZpbmUgRlBERkRPQ19BQUNUSU9OX1dQIFwKKyAgMHgxMyAgLy8gV1AsIGJlZm9yZSBwcmludGluZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCisjZGVmaW5lIEZQREZET0NfQUFDVElPTl9EUCBcCisgIDB4MTQgIC8vIERQLCBhZnRlciBwcmludGluZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCiAvKioKICogRnVuY3Rpb246IEZPUk1fRG9Eb2N1bWVudEFBY3Rpb24KLSogICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBwZXJmb3JtaW5nIHRoZSBkb2N1bWVudCdzIGFkZGl0aW9uYWwtYWN0aW9uLgorKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgdGhlIGRvY3VtZW50J3MKKyphZGRpdGlvbmFsLWFjdGlvbi4KICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0qICAgICAgICAgICBhYVR5cGUgICAgICAtICAgVGhlIHR5cGUgb2YgdGhlIGFkZGl0aW9uYWwtYWN0aW9ucyB3aGljaCBkZWZpbmVkIGFib3ZlLgorKiAgICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKypGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorKiAgICAgICAgICAgYWFUeXBlICAgICAgLSAgIFRoZSB0eXBlIG9mIHRoZSBhZGRpdGlvbmFsLWFjdGlvbnMgd2hpY2ggZGVmaW5lZAorKmFib3ZlLgogKiBSZXR1cm4gVmFsdWU6CiAqICAgICAgICAgICBOT05FCiAqIENvbW1lbnRzOgotKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIGRvY3VtZW50IGFkZGl0aW9uYWwtYWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhYVR5cGUuCisqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gZG9jdW1lbnQKKyphZGRpdGlvbmFsLWFjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYWFUeXBlLgogKiovCiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50QUFjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgaW50IGFhVHlwZSk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9Eb2N1bWVudEFBY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFhVHlwZSk7CiAKIC8vIEFkZGl0aW9uYWwtYWN0aW9uIHR5cGVzIG9mIHBhZ2Ugb2JqZWN0Ci0jZGVmaW5lIEZQREZQQUdFX0FBQ1RJT05fT1BFTiAgICAgICAwICAgICAgIC8vIC9PIC0tIEFuIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgcGFnZSBpcyBvcGVuZWQKLSNkZWZpbmUgRlBERlBBR0VfQUFDVElPTl9DTE9TRSAgICAgIDEgICAgICAgLy8gL0MgLS0gQW4gYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBwYWdlIGlzIGNsb3NlZAorI2RlZmluZSBGUERGUEFHRV9BQUNUSU9OX09QRU4gXAorICAwICAvLyAvTyAtLSBBbiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIHdoZW4gdGhlIHBhZ2UgaXMgb3BlbmVkCisjZGVmaW5lIEZQREZQQUdFX0FBQ1RJT05fQ0xPU0UgXAorICAxICAvLyAvQyAtLSBBbiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIHdoZW4gdGhlIHBhZ2UgaXMgY2xvc2VkCiAKIC8qKgogKiBGdW5jdGlvbjogRk9STV9Eb1BhZ2VBQWN0aW9uCi0qICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgcGVyZm9ybWluZyB0aGUgcGFnZSBvYmplY3QncyBhZGRpdGlvbmFsLWFjdGlvbiB3aGVuIG9wZW5lZCBvciBjbG9zZWQuCisqICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgcGVyZm9ybWluZyB0aGUgcGFnZSBvYmplY3QncworKmFkZGl0aW9uYWwtYWN0aW9uIHdoZW4gb3BlbmVkIG9yIGNsb3NlZC4KICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0qICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgotKiAgICAgICAgICAgYWFUeXBlICAgICAgLSAgIFRoZSB0eXBlIG9mIHRoZSBwYWdlIG9iamVjdCdzIGFkZGl0aW9uYWwtYWN0aW9ucyB3aGljaCBkZWZpbmVkIGFib3ZlLgorKiAgICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorKmZ1bmN0aW9uLgorKiAgICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKypGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorKiAgICAgICAgICAgYWFUeXBlICAgICAgLSAgIFRoZSB0eXBlIG9mIHRoZSBwYWdlIG9iamVjdCdzIGFkZGl0aW9uYWwtYWN0aW9ucworKndoaWNoIGRlZmluZWQgYWJvdmUuCiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIE5PTkUKICogQ29tbWVudHM6Ci0qICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcgaWYgbm8gYWRkaXRpb25hbC1hY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFhVHlwZSBleGlzdHMuCisqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcgaWYgbm8gYWRkaXRpb25hbC1hY3Rpb24gY29ycmVzcG9uZGluZyB0bworKnRoZSBzcGVjaWZpZWQgYWFUeXBlIGV4aXN0cy4KICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX0RvUGFnZUFBY3Rpb24oRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBpbnQgYWFUeXBlKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb1BhZ2VBQWN0aW9uKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWFUeXBlKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9Pbk1vdXNlTW92ZQogICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gdGhlIG1vdXNlIGN1cnNvciBtb3Zlcy4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgotICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KKyAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5CisgKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisgKmZ1bmN0aW9uLgogICogICAgICAgICAgbW9kaWZpZXIgICAgICAgIC0gICBJbmRpY2F0ZXMgd2hldGhlciB2YXJpb3VzIHZpcnR1YWwga2V5cyBhcmUgZG93bi4KLSAqICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIFBERiB1c2VyIHNwYWNlLgotICogICAgICAgICAgcGFnZV95ICAgICAgLSAgIFNwZWNpZmllcyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBjdXJzb3IgaW4gUERGIHVzZXIgc3BhY2UuCisgKiAgICAgICAgICBwYWdlX3ggICAgICAtICAgU3BlY2lmaWVzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBQREYgdXNlcgorICpzcGFjZS4KKyAqICAgICAgICAgIHBhZ2VfeSAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIFBERiB1c2VyCisgKnNwYWNlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25Nb3VzZU1vdmUoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsRlBERl9QQUdFIHBhZ2UsIGludCBtb2RpZmllciwgZG91YmxlIHBhZ2VfeCwgZG91YmxlIHBhZ2VfeSk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9Pbk1vdXNlTW92ZShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGT1JNX09uTEJ1dHRvbkRvd24KLSAqICAgICAgICAgIFlvdSBjYW4gY2FsbCB0aGlzIG1lbWJlciBmdW5jdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIGxlZnQgbW91c2UgYnV0dG9uLgorICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgbGVmdAorICptb3VzZSBidXR0b24uCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICpmdW5jdGlvbi4KICAqICAgICAgICAgIG1vZGlmaWVyICAgICAgICAtICAgSW5kaWNhdGVzIHdoZXRoZXIgdmFyaW91cyB2aXJ0dWFsIGtleXMgYXJlIGRvd24uCi0gKiAgICAgICAgICBwYWdlX3ggICAgICAtICAgU3BlY2lmaWVzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBQREYgdXNlciBzcGFjZS4KLSAqICAgICAgICAgIHBhZ2VfeSAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIFBERiB1c2VyIHNwYWNlLgorICogICAgICAgICAgcGFnZV94ICAgICAgLSAgIFNwZWNpZmllcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBjdXJzb3IgaW4gUERGIHVzZXIKKyAqc3BhY2UuCisgKiAgICAgICAgICBwYWdlX3kgICAgICAtICAgU3BlY2lmaWVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBQREYgdXNlcgorICpzcGFjZS4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZS4KICAqKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uTEJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsRlBERl9QQUdFIHBhZ2UsIGludCBtb2RpZmllciwgZG91YmxlIHBhZ2VfeCwgZG91YmxlIHBhZ2VfeSk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkxCdXR0b25Eb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9PbkxCdXR0b25VcAotICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlIGxlZnQgbW91c2UgYnV0dG9uLgorICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlIGxlZnQKKyAqbW91c2UgYnV0dG9uLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0gKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgorICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KKyAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAqZnVuY3Rpb24uCiAgKiAgICAgICAgICBtb2RpZmllciAgICAtICAgSW5kaWNhdGVzIHdoZXRoZXIgdmFyaW91cyB2aXJ0dWFsIGtleXMgYXJlIGRvd24uCiAgKiAgICAgICAgICBwYWdlX3ggICAgICAtICAgU3BlY2lmaWVzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBkZXZpY2UuCiAgKiAgICAgICAgICBwYWdlX3kgICAgICAtICAgU3BlY2lmaWVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBkZXZpY2UuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkxCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSxGUERGX1BBR0UgcGFnZSwgaW50IG1vZGlmaWVyLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95KTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uTEJ1dHRvblVwKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uUkJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbW9kaWZpZXIsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpOwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25SQnV0dG9uVXAoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbW9kaWZpZXIsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25SQnV0dG9uRG93bihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PblJCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGT1JNX09uS2V5RG93bgogICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gYSBub25zeXN0ZW0ga2V5IGlzIHByZXNzZWQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICpmdW5jdGlvbi4KICAqICAgICAgICAgIG5LZXlDb2RlICAgIC0gICBJbmRpY2F0ZXMgd2hldGhlciB2YXJpb3VzIHZpcnR1YWwga2V5cyBhcmUgZG93bi4KLSAqICAgICAgICAgIG1vZGlmaWVyICAgIC0gICBDb250YWlucyB0aGUgc2NhbiBjb2RlLCBrZXktdHJhbnNpdGlvbiBjb2RlLCBwcmV2aW91cyBrZXkgc3RhdGUsIGFuZCBjb250ZXh0IGNvZGUuCisgKiAgICAgICAgICBtb2RpZmllciAgICAtICAgQ29udGFpbnMgdGhlIHNjYW4gY29kZSwga2V5LXRyYW5zaXRpb24gY29kZSwKKyAqcHJldmlvdXMga2V5IHN0YXRlLCBhbmQgY29udGV4dCBjb2RlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlEb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfUEFHRSBwYWdlLCBpbnQgbktleUNvZGUsIGludCBtb2RpZmllcik7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbktleURvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcik7CiAKIC8qKgogICogRnVuY3Rpb246IEZPUk1fT25LZXlVcAogICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gYSBub25zeXN0ZW0ga2V5IGlzIHJlbGVhc2VkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0gKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgorICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KKyAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAqZnVuY3Rpb24uCiAgKiAgICAgICAgICBuS2V5Q29kZSAgICAtICAgVGhlIHZpcnR1YWwta2V5IGNvZGUgb2YgdGhlIGdpdmVuIGtleS4KLSAqICAgICAgICAgIG1vZGlmaWVyICAgIC0gICBDb250YWlucyB0aGUgc2NhbiBjb2RlLCBrZXktdHJhbnNpdGlvbiBjb2RlLCBwcmV2aW91cyBrZXkgc3RhdGUsIGFuZCBjb250ZXh0IGNvZGUuCisgKiAgICAgICAgICBtb2RpZmllciAgICAtICAgQ29udGFpbnMgdGhlIHNjYW4gY29kZSwga2V5LXRyYW5zaXRpb24gY29kZSwKKyAqcHJldmlvdXMga2V5IHN0YXRlLCBhbmQgY29udGV4dCBjb2RlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlVcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSxGUERGX1BBR0UgcGFnZSwgaW50IG5LZXlDb2RlLCBpbnQgbW9kaWZpZXIpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlVcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9PbkNoYXIKLSAqICAgICAgICAgIFlvdSBjYW4gY2FsbCB0aGlzIG1lbWJlciBmdW5jdGlvbiB3aGVuIGEga2V5c3Ryb2tlIHRyYW5zbGF0ZXMgdG8gYSBub25zeXN0ZW0gY2hhcmFjdGVyLgorICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gYSBrZXlzdHJva2UgdHJhbnNsYXRlcyB0byBhCisgKm5vbnN5c3RlbSBjaGFyYWN0ZXIuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICpmdW5jdGlvbi4KICAqICAgICAgICAgIG5DaGFyICAgICAgIC0gICBUaGUgY2hhcmFjdGVyIGNvZGUgdmFsdWUgb2YgdGhlIGtleS4KLSAqICAgICAgICAgIG1vZGlmaWVyICAgIC0gICBDb250YWlucyB0aGUgc2NhbiBjb2RlLCBrZXktdHJhbnNpdGlvbiBjb2RlLCBwcmV2aW91cyBrZXkgc3RhdGUsIGFuZCBjb250ZXh0IGNvZGUuCisgKiAgICAgICAgICBtb2RpZmllciAgICAtICAgQ29udGFpbnMgdGhlIHNjYW4gY29kZSwga2V5LXRyYW5zaXRpb24gY29kZSwKKyAqcHJldmlvdXMga2V5IHN0YXRlLCBhbmQgY29udGV4dCBjb2RlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25DaGFyKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfUEFHRSBwYWdlLCBpbnQgbkNoYXIsIGludCBtb2RpZmllcik7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkNoYXIoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcik7CiAKIC8qKgogICogRnVuY3Rpb246IEZPUk1fRm9yY2VUb0tpbGxGb2N1cy4KLSAqICAgICAgICAgIFlvdSBjYW4gY2FsbCB0aGlzIG1lbWJlciBmdW5jdGlvbiB0byBmb3JjZSB0byBraWxsIHRoZSBmb2N1cyBvZiB0aGUgZm9ybSBmaWVsZCB3aGljaCBnb3QgZm9jdXMuCi0gKiAgICAgICAgICBJdCB3b3VsZCBraWxsIHRoZSBmb2N1cyBvbiB0aGUgZm9ybSBmaWVsZCwgc2F2ZSB0aGUgdmFsdWUgb2YgZm9ybSBmaWVsZCBpZiBpdCdzIGNoYW5nZWQgYnkgdXNlci4KKyAqICAgICAgICAgIFlvdSBjYW4gY2FsbCB0aGlzIG1lbWJlciBmdW5jdGlvbiB0byBmb3JjZSB0byBraWxsIHRoZSBmb2N1cyBvZiB0aGUKKyAqZm9ybSBmaWVsZCB3aGljaCBnb3QgZm9jdXMuCisgKiAgICAgICAgICBJdCB3b3VsZCBraWxsIHRoZSBmb2N1cyBvbiB0aGUgZm9ybSBmaWVsZCwgc2F2ZSB0aGUgdmFsdWUgb2YgZm9ybQorICpmaWVsZCBpZiBpdCdzIGNoYW5nZWQgYnkgdXNlci4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZS4KICAqKi8KIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX0ZvcmNlVG9LaWxsRm9jdXMoRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCiAvLyBGaWVsZCBUeXBlcwotI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9VTktOT1dOICAgICAgMCAgICAgICAvLyBVbmtub3duLgotI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9QVVNIQlVUVE9OICAgMSAgICAgICAvLyBwdXNoIGJ1dHRvbiB0eXBlLgotI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9DSEVDS0JPWCAgICAgMiAgICAgICAvLyBjaGVjayBib3ggdHlwZS4KLSNkZWZpbmUgRlBERl9GT1JNRklFTERfUkFESU9CVVRUT04gIDMgICAgICAgLy8gcmFkaW8gYnV0dG9uIHR5cGUuCi0jZGVmaW5lIEZQREZfRk9STUZJRUxEX0NPTUJPQk9YICAgICA0ICAgICAgIC8vIGNvbWJvIGJveCB0eXBlLgotI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9MSVNUQk9YICAgICAgNSAgICAgICAvLyBsaXN0IGJveCB0eXBlLgotI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9URVhURklFTEQgICAgNiAgICAgICAvLyB0ZXh0IGZpZWxkIHR5cGUuCi0jZGVmaW5lIEZQREZfRk9STUZJRUxEX1hGQSAgICAgICAgICA3ICAgICAgIC8vIHRleHQgZmllbGQgdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfVU5LTk9XTiAwICAgICAgLy8gVW5rbm93bi4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfUFVTSEJVVFRPTiAxICAgLy8gcHVzaCBidXR0b24gdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfQ0hFQ0tCT1ggMiAgICAgLy8gY2hlY2sgYm94IHR5cGUuCisjZGVmaW5lIEZQREZfRk9STUZJRUxEX1JBRElPQlVUVE9OIDMgIC8vIHJhZGlvIGJ1dHRvbiB0eXBlLgorI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9DT01CT0JPWCA0ICAgICAvLyBjb21ibyBib3ggdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfTElTVEJPWCA1ICAgICAgLy8gbGlzdCBib3ggdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfVEVYVEZJRUxEIDYgICAgLy8gdGV4dCBmaWVsZCB0eXBlLgorI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9YRkEgNyAgICAgICAgICAvLyB0ZXh0IGZpZWxkIHR5cGUuCiAKIC8qKgogICogRnVuY3Rpb246IEZQRFBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludAogICogICAgICAgICAgQ2hlY2sgdGhlIGZvcm0gZmlsZWQgcG9zaXRpb24gYnkgcG9pbnQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICpmdW5jdGlvbi4KICAqICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBYIHBvc2l0aW9uIGluIFBERiAidXNlciBzcGFjZSIuCiAgKiAgICAgICAgICBwYWdlX3kgICAgICAtICAgWSBwb3NpdGlvbiBpbiBQREYgInVzZXIgc3BhY2UiLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBmb3JtZmlsZWQ7IC0xIGluZGljYXRlcyBubyBmaWVsZHMuCiAgKiovCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBEUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfUEFHRSBwYWdlLGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQRFBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yCi0gKiAgICAgICAgICBTZXQgdGhlIGhpZ2hsaWdodCBjb2xvciBvZiBzcGVjaWZpZWQgb3IgYWxsIHRoZSBmb3JtIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQuCisgKiAgICAgICAgICBTZXQgdGhlIGhpZ2hsaWdodCBjb2xvciBvZiBzcGVjaWZpZWQgb3IgYWxsIHRoZSBmb3JtIGZpZWxkcyBpbiB0aGUKKyAqZG9jdW1lbnQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIGRvYyAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KLSAqICAgICAgICAgIGZpZWxkVHlwZSAgIC0gICBBIDMyLWJpdCBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgYSBmb3JtIGZpZWxkKGRlZmluZWQgYWJvdmUpLgotICogICAgICAgICAgY29sb3IgICAgICAgLSAgIFRoZSBoaWdobGlnaHQgY29sb3Igb2YgdGhlIGZvcm0gZmllbGQuQ29uc3RydWN0ZWQgYnkgMHh4eHJyZ2diYi4KKyAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5CisgKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBkb2MgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKyAqRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKiAgICAgICAgICBmaWVsZFR5cGUgICAtICAgQSAzMi1iaXQgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGEgZm9ybQorICpmaWVsZChkZWZpbmVkIGFib3ZlKS4KKyAqICAgICAgICAgIGNvbG9yICAgICAgIC0gICBUaGUgaGlnaGxpZ2h0IGNvbG9yIG9mIHRoZSBmb3JtIGZpZWxkLkNvbnN0cnVjdGVkIGJ5CisgKjB4eHhycmdnYmIuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOT05FLgogICogQ29tbWVudHM6Ci0gKiAgICAgICAgICBXaGVuIHRoZSBwYXJhbWV0ZXIgZmllbGRUeXBlIGlzIHNldCB0byB6ZXJvLCB0aGUgaGlnaGxpZ2h0IGNvbG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgdGhlIGZvcm0gZmllbGRzIGluIHRoZQorICogICAgICAgICAgV2hlbiB0aGUgcGFyYW1ldGVyIGZpZWxkVHlwZSBpcyBzZXQgdG8gemVybywgdGhlIGhpZ2hsaWdodCBjb2xvcgorICp3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBmb3JtIGZpZWxkcyBpbiB0aGUKICAqICAgICAgICAgIGRvY3VtZW50LgotICogICAgICAgICAgUGxlYXNlIHJlZnJlc2ggdGhlIGNsaWVudCB3aW5kb3cgdG8gc2hvdyB0aGUgaGlnaGxpZ2h0IGltbWVkaWF0ZWx5IGlmIG5lY2Vzc2FyeS4KKyAqICAgICAgICAgIFBsZWFzZSByZWZyZXNoIHRoZSBjbGllbnQgd2luZG93IHRvIHNob3cgdGhlIGhpZ2hsaWdodCBpbW1lZGlhdGVseQorICppZiBuZWNlc3NhcnkuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0Q29sb3IoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIGludCBmaWVsZFR5cGUsIHVuc2lnbmVkIGxvbmcgY29sb3IpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb2xvcik7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEKLSAqICAgICAgICAgIFNldCB0aGUgdHJhbnNwYXJlbmN5IG9mIHRoZSBmb3JtIGZpZWxkIGhpZ2hsaWdodCBjb2xvciBpbiB0aGUgZG9jdW1lbnQuCisgKiAgICAgICAgICBTZXQgdGhlIHRyYW5zcGFyZW5jeSBvZiB0aGUgZm9ybSBmaWVsZCBoaWdobGlnaHQgY29sb3IgaW4gdGhlCisgKmRvY3VtZW50LgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0gKiAgICAgICAgICBkb2MgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCi0gKiAgICAgICAgICBhbHBoYSAgICAgICAtICAgVGhlIHRyYW5zcGFyZW5jeSBvZiB0aGUgZm9ybSBmaWVsZCBoaWdobGlnaHQgY29sb3IuIGJldHdlZW4gMC0yNTUuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgZG9jICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgYWxwaGEgICAgICAgLSAgIFRoZSB0cmFuc3BhcmVuY3kgb2YgdGhlIGZvcm0gZmllbGQgaGlnaGxpZ2h0IGNvbG9yLgorICpiZXR3ZWVuIDAtMjU1LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTk9ORS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRBbHBoYShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgdW5zaWduZWQgY2hhciBhbHBoYSk7Ci0KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRBbHBoYShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGFscGhhKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9SZW1vdmVGb3JtRmllbGRIaWdobGlnaHQKICAqICAgICAgICAgIFJlbW92ZSB0aGUgZm9ybSBmaWVsZCBoaWdobGlnaHQgY29sb3IgaW4gdGhlIGRvY3VtZW50LgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTk9ORS4KICAqIENvbW1lbnRzOgotICogICAgICAgICAgUGxlYXNlIHJlZnJlc2ggdGhlIGNsaWVudCB3aW5kb3cgdG8gcmVtb3ZlIHRoZSBoaWdobGlnaHQgaW1tZWRpYXRlbHkgaWYgbmVjZXNzYXJ5LgorICogICAgICAgICAgUGxlYXNlIHJlZnJlc2ggdGhlIGNsaWVudCB3aW5kb3cgdG8gcmVtb3ZlIHRoZSBoaWdobGlnaHQgaW1tZWRpYXRlbHkKKyAqaWYgbmVjZXNzYXJ5LgogICoqLwogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbW92ZUZvcm1GaWVsZEhpZ2hsaWdodChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSk7CiAKQEAgLTEwOTUsNDIgKzEzODgsNjkgQEAKICogRnVuY3Rpb246IEZQREZfRkZMRHJhdwogKiAgICAgICAgICAgUmVuZGVyIEZvcm1GZWlsZHMgb24gYSBwYWdlIHRvIGEgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcC4KICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0qICAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwIChhcyB0aGUgb3V0cHV0IGJ1ZmZlcikuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGhhbmRsZSBjYW4gYmUgY3JlYXRlZCBieSBGUERGQml0bWFwX0NyZWF0ZSBmdW5jdGlvbi4KLSogICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0qICAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBkZXZpY2UgY29vcmRpbmF0ZS4KLSogICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCisqICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisqICAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwIChhcyB0aGUKKypvdXRwdXQgYnVmZmVyKS4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgaGFuZGxlIGNhbiBiZSBjcmVhdGVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisqZnVuY3Rpb24uCisqICAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisqZnVuY3Rpb24uCisqICAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZQorKmRldmljZSBjb29yZGluYXRlLgorKiAgICAgICAgICAgc3RhcnRfeSAgICAgLSAgIFRvcCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBkZXZpY2UKKypjb29yZGluYXRlLgogKiAgICAgICAgICAgc2l6ZV94ICAgICAgLSAgIEhvcml6b250YWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KICogICAgICAgICAgIHNpemVfeSAgICAgIC0gICBWZXJ0aWNhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgotKiAgICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKS4KLSogICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MgZGVmaW5lZCBhYm92ZS4KKyogICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMKKypjbG9ja3dpc2UpLAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzCisqY291bnRlci1jbG9ja3dpc2UpLgorKiAgICAgICAgICAgZmxhZ3MgICAgICAgLSAgIDAgZm9yIG5vcm1hbCBkaXNwbGF5LCBvciBjb21iaW5hdGlvbiBvZiBmbGFncworKmRlZmluZWQgYWJvdmUuCiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIE5vbmUuCiAqIENvbW1lbnRzOgotKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gb25seSByZW5kZXIgYW5ub3RhdGlvbnMgYW5kIEZvcm1GaWVsZHMgb24gdGhlIHBhZ2UuCi0qICAgICAgICAgICBXaXRob3V0IEZQREZfQU5OT1Qgc3BlY2lmaWVkIGZvciBmbGFncywgUmVuZGVyaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIEZQREZfUmVuZGVyUGFnZUJpdG1hcCBvciBGUERGX1JlbmRlclBhZ2VCaXRtYXBfU3RhcnQgd2lsbCBvbmx5IHJlbmRlciBwYWdlIGNvbnRlbnRzKHdpdGhvdXQgYW5ub3RhdGlvbnMpIHRvIGEgYml0bWFwLgotKiAgICAgICAgICAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBGb3JtRmlsbCBmdW5jdGlvbnMsSW1wbGVtZW50YXRpb24gc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucyBmaW5pc2ggcmVuZGVyaW5nIHRoZSBwYWdlIGNvbnRlbnRzLgorKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gb25seSByZW5kZXIgYW5ub3RhdGlvbnMgYW5kIEZvcm1GaWVsZHMgb24KKyp0aGUgcGFnZS4KKyogICAgICAgICAgIFdpdGhvdXQgRlBERl9BTk5PVCBzcGVjaWZpZWQgZm9yIGZsYWdzLCBSZW5kZXJpbmcgZnVuY3Rpb25zIHN1Y2ggYXMKKypGUERGX1JlbmRlclBhZ2VCaXRtYXAgb3IgRlBERl9SZW5kZXJQYWdlQml0bWFwX1N0YXJ0IHdpbGwgb25seSByZW5kZXIgcGFnZQorKmNvbnRlbnRzKHdpdGhvdXQgYW5ub3RhdGlvbnMpIHRvIGEgYml0bWFwLgorKiAgICAgICAgICAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBGb3JtRmlsbCBmdW5jdGlvbnMsSW1wbGVtZW50YXRpb24gc2hvdWxkCisqY2FsbCB0aGlzIG1ldGhvZCBhZnRlciByZW5kZXJpbmcgZnVuY3Rpb25zIGZpbmlzaCByZW5kZXJpbmcgdGhlIHBhZ2UgY29udGVudHMuCiAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9GRkxEcmF3KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfQklUTUFQIGJpdG1hcCwgRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsIGludCBzaXplX3ksIGludCByb3RhdGUsIGludCBmbGFncyk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRkZMRHJhdyhGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX0hhc1hGQUZpZWxkCi0gKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBjaGVjayB3aGV0aGVyIGEgcGRmIGRvY3VtZW50IGhhcyBYRkEgZmllbGRzLgorICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gY2hlY2sgd2hldGhlciBhIHBkZiBkb2N1bWVudAorICpoYXMgWEZBIGZpZWxkcy4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCAgICAgICAgICAgICAgICAtICAgICAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICBkb2NUeXBlICAgICAgICAgICAgICAgICAtICAgICAgIERvY3VtZW50IHR5cGUgZGVmaW5lZCBhcyBET0NUWVBFX3h4eC4KKyAqICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50ICAgICAgICAgICAgICAgIC0gICAgICAgSGFuZGxlIHRvIGRvY3VtZW50LgorICpSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgIGRvY1R5cGUgICAgICAgICAgICAgICAgIC0gICAgICAgRG9jdW1lbnQgdHlwZSBkZWZpbmVkIGFzCisgKkRPQ1RZUEVfeHh4LgogICogUmV0dXJuIFZhbHVlOgotICogICAgICAgICAgICAgICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5wdXQgZG9jdW1lbnQgaGFzIFhGQSBmaWVsZHMsIG90aGVyd2lzZSBGQUxTRS4KKyAqICAgICAgICAgICAgICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHRoYXQgdGhlIGlucHV0IGRvY3VtZW50IGhhcyBYRkEgZmllbGRzLAorICpvdGhlcndpc2UgRkFMU0UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9IYXNYRkFGaWVsZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQqIGRvY1R5cGUpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfSGFzWEZBRmllbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZG9jVHlwZSk7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZfTG9hZFhGQQotICogICAgICAgICAgSWYgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIFhGQSBmaWVsZHMsIHRoZXJlIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHRvIGxvYWQgWEZBIGZpZWxkcy4KKyAqICAgICAgICAgIElmIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBYRkEgZmllbGRzLCB0aGVyZSBzaG91bGQgY2FsbCB0aGlzCisgKm1ldGhvZCB0byBsb2FkIFhGQSBmaWVsZHMuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2VzcyxvdGhlcndpc2UgRkFMU0UuCiAgKiovCkBAIC0xMTM4LDk2ICsxNDU4LDEzOCBAQAogCiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9VbmRvCi0gKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgdW5kbyBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYSBmaWVsZC4KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSB1bmRvIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhCisgKmZpZWxkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KICAqICAgICAgICAgIGhXaWRnZXQgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOb25lLgogICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9VbmRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9VbmRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9SZWRvCi0gKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgcmVkbyBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYSBmaWVsZC4KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSByZWRvIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhCisgKmZpZWxkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KICAqICAgICAgICAgIGhXaWRnZXQgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOb25lLgogICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9SZWRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9SZWRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9TZWxlY3RBbGwKLSAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBzZWxlY3QgYWxsIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhIGZpZWxkLgorICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHNlbGVjdCBhbGwgZmVhdHVyZSBmb3IgdGhlIHNwZWNpZmllZAorICp4ZmEgZmllbGQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogICAgICAgICAgaFdpZGdldCAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHhmYSBmaWVsZC4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5vbmUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1NlbGVjdEFsbChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0KTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfU2VsZWN0QWxsKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0KTsKIC8qKgogICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X0NvcHkKLSAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBjb3B5IGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhIGZpZWxkLgorICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIGNvcHkgZmVhdHVyZSBmb3IgdGhlIHNwZWNpZmllZCB4ZmEKKyAqZmllbGQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogICAgICAgICAgaFdpZGdldCAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHhmYSBmaWVsZC4KLSAqICAgICAgICAgIHdzVGV4dCAgICAgICAgICAtICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBjb3BpZWQgZGF0YSwgaW4gVVRGLTE2TEUgZm9ybWF0LgorICogICAgICAgICAgd3NUZXh0ICAgICAgICAgIC0gICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGNvcGllZAorICpkYXRhLCBpbiBVVEYtMTZMRSBmb3JtYXQuCiAgKiAgICAgICAgICBzaXplICAgICAgICAgICAgLSAgIFRoZSBkYXRhIGJ1ZmZlciBzaXplLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ29weShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0LCBGUERGX1dJREVTVFJJTkcgd3NUZXh0LCBGUERGX0RXT1JEKiBzaXplKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ29weShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEKiBzaXplKTsKIC8qKgogICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X0N1dAotICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIGN1dCBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYSBmaWVsZC4KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBjdXQgZmVhdHVyZSBmb3IgdGhlIHNwZWNpZmllZCB4ZmEKKyAqZmllbGQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogICAgICAgICAgaFdpZGdldCAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHhmYSBmaWVsZC4KLSAqICAgICAgICAgIHdzVGV4dCAgICAgICAgICAtICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBjdXQgZGF0YSxpbiBVVEYtMTZMRSBmb3JtYXQuCisgKiAgICAgICAgICB3c1RleHQgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgY3V0CisgKmRhdGEsaW4gVVRGLTE2TEUgZm9ybWF0LgogICogICAgICAgICAgc2l6ZSAgICAgICAgICAgIC0gICBUaGUgZGF0YSBidWZmZXIgc2l6ZSxub3QgdGhlIGJ5dGUgbnVtYmVyLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ3V0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIEZQREZfV0lERVNUUklORyB3c1RleHQsIEZQREZfRFdPUkQqIHNpemUpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9DdXQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCogc2l6ZSk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9QYXN0ZQotICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHBhc3RlIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhIGZpZWxkLgorICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHBhc3RlIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhCisgKmZpZWxkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KICAqICAgICAgICAgIGhXaWRnZXQgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCiAgKiAgICAgICAgICB3c1RleHQgICAgICAgICAgLSAgIFRoZSBwYXN0ZSB0ZXh0IGJ1ZmZlciwgaW4gVVRGLTE2TEUgZm9ybWF0LgogICogICAgICAgICAgc2l6ZSAgICAgICAgICAgIC0gICBUaGUgZGF0YSBidWZmZXIgc2l6ZSxub3QgdGhlIGJ5dGUgbnVtYmVyLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUGFzdGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURHRVQgaFdpZGdldCwgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwgRlBERl9EV09SRCBzaXplKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUGFzdGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKTsKIC8qKgogICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X1JlcGxhY2VTcGVsbENoZWNrV29yZAotICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHNwZWxsIGNoZWNrIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhIGZpZWxkLgorICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHNwZWxsIGNoZWNrIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQKKyAqeGZhIGZpZWxkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KICAqICAgICAgICAgIGhXaWRnZXQgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCiAgKiAgICAgICAgICB4ICAgICAgICAgICAgICAgLSAgIFRoZSB4IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnQuCiAgKiAgICAgICAgICB5ICAgICAgICAgICAgICAgLSAgIFRoZSB5IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnQuCi0gKiAgICAgICAgICBic1RleHQgICAgICAgICAgLSAgIFRoZSB0ZXh0IGJ1ZmZlciBuZWVkZWQgdG8gYmUgc3BlY2sgY2hlY2ssIGluIFVURi0xNkxFIGZvcm1hdC4KKyAqICAgICAgICAgIGJzVGV4dCAgICAgICAgICAtICAgVGhlIHRleHQgYnVmZmVyIG5lZWRlZCB0byBiZSBzcGVjayBjaGVjaywgaW4KKyAqVVRGLTE2TEUgZm9ybWF0LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIGZsb2F0IHgsIGZsb2F0IHksIEZQREZfQllURVNUUklORyBic1RleHQpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERl9XaWRnZXRfUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIGJzVGV4dCk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9HZXRTcGVsbENoZWNrV29yZHMKLSAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBzcGVsbCBjaGVjayBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYSBmaWVsZC4KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBzcGVsbCBjaGVjayBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkCisgKnhmYSBmaWVsZC4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKiAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKyAqRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCiAgKiAgICAgICAgICBoV2lkZ2V0ICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgeGZhIGZpZWxkLgogICogICAgICAgICAgeCAgICAgICAgICAgICAgIC0gICBUaGUgeCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgogICogICAgICAgICAgeSAgICAgICAgICAgICAgIC0gICBUaGUgeSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgotICogICAgICAgICAgc3RyaW5nSGFuZGxlICAgIC0gICBQb2ludGVyIHRvIEZQREZfU1RSSU5HSEFORExFIHRvIHJlY2VpdmUgdGhlIHNwZWNrIGNoZWNrIHRleHQgYnVmZmVyLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKiAgICAgICAgICBzdHJpbmdIYW5kbGUgICAgLSAgIFBvaW50ZXIgdG8gRlBERl9TVFJJTkdIQU5ETEUgdG8gcmVjZWl2ZSB0aGUKKyAqc3BlY2sgY2hlY2sgdGV4dCBidWZmZXIsIGluIFVURi0xNkxFIGZvcm1hdC4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5vbmUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X0dldFNwZWxsQ2hlY2tXb3JkcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0LCBmbG9hdCB4LCBmbG9hdCB5LCBGUERGX1NUUklOR0hBTkRMRSogc3RyaW5nSGFuZGxlKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwKK0ZQREZfV2lkZ2V0X0dldFNwZWxsQ2hlY2tXb3JkcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfU1RSSU5HSEFORExFKiBzdHJpbmdIYW5kbGUpOwogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9TdHJpbmdIYW5kbGVDb3VudHMKICAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBjb3VudCBvZiB0aGUgdGV4dCBidWZmZXIuCkBAIC0xMjQzLDEyICsxNjA1LDE3IEBACiAgKiBQYXJhbWV0ZXJzOgogICogICAgICAgICAgc3RyaW5nSGFuZGxlICAgIC0gICBQb2ludGVyIHRvIEZQREZfU1RSSU5HSEFORExFLgogICogICAgICAgICAgaW5kZXggICAgICAgICAgIC0gICBUaGUgc3BlY2lmaWVkIGluZGV4IG9mIHRleHQgYnVmZmVyLgotICogICAgICAgICAgYnNUZXh0ICAgICAgICAgIC0gICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHRleHQgYnVmZmVyLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKiAgICAgICAgICBic1RleHQgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgdGV4dAorICpidWZmZXIsIGluIFVURi0xNkxFIGZvcm1hdC4KICAqICAgICAgICAgIHNpemUgICAgICAgICAgICAtICAgVGhlIGJ5dGUgc2l6ZSBvZiBkYXRhIGJ1ZmZlci4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3MsIG90aGVyd2lzZSBGQUxTRS4KICAqKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1N0cmluZ0hhbmRsZUdldFN0cmluZ0J5SW5kZXgoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlLCBpbnQgaW5kZXgsIEZQREZfQllURVNUUklORyBic1RleHQsIEZQREZfRFdPUkQqIHNpemUpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX1N0cmluZ0hhbmRsZUdldFN0cmluZ0J5SW5kZXgoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQqIHNpemUpOwogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9TdHJpbmdIYW5kbGVSZWxlYXNlCiAgKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHJlbGVhc2UgdGhlIEZQREZfU1RSSU5HSEFORExFLgpAQCAtMTI2MywxMiArMTYzMCwxNiBAQAogICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBhZGQgdGhlIHNwZWNpZmllZCB0ZXh0IGJ1ZmZlci4KICAqIFBhcmFtZXRlcnM6CiAgKiAgICAgICAgICBzdHJpbmdIYW5kbGUgICAgLSAgIFBvaW50ZXIgdG8gRlBERl9TVFJJTkdIQU5ETEUuCi0gKiAgICAgICAgICBic1RleHQgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgb2YgdGhlIHRleHQgYnVmZmVyLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKiAgICAgICAgICBic1RleHQgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgb2YgdGhlIHRleHQgYnVmZmVyLCBpbgorICpVVEYtMTZMRSBmb3JtYXQuCiAgKiAgICAgICAgICBzaXplICAgICAgICAgICAgLSAgIFRoZSBieXRlIHNpemUgb2YgZGF0YSBidWZmZXIuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TdHJpbmdIYW5kbGVBZGRTdHJpbmcoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlLCBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LCBGUERGX0RXT1JEIHNpemUpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX1N0cmluZ0hhbmRsZUFkZFN0cmluZyhGUERGX1NUUklOR0hBTkRMRSBzdHJpbmdIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9md2xldmVudC5oIGIvcHVibGljL2ZwZGZfZndsZXZlbnQuaAppbmRleCBmYTRmMTQ0Li4yMmMwMWU0IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9md2xldmVudC5oCisrKyBiL3B1YmxpYy9mcGRmX2Z3bGV2ZW50LmgKQEAgLTEzLDkwICsxMyw4NCBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotdHlwZWRlZiBpbnQgICAgICAgICBGUERGX0lOVDMyOwordHlwZWRlZiBpbnQgRlBERl9JTlQzMjsKIHR5cGVkZWYgdW5zaWduZWQgaW50IEZQREZfVUlOVDMyOwotdHlwZWRlZiBmbG9hdCAgICAgICBGUERGX0ZMT0FUOwotLy9ldmVudCB0eXBlCi10eXBlZGVmIGVudW0KLXsKLSAgICBGV0xfRVZFTlRUWVBFX01vdXNlID0gMCAsCi0gICAgRldMX0VWRU5UVFlQRV9Nb3VzZVdoZWVsLAotICAgIEZXTF9FVkVOVFRZUEVfS2V5ICAgICAgICwKK3R5cGVkZWYgZmxvYXQgRlBERl9GTE9BVDsKKy8vIGV2ZW50IHR5cGUKK3R5cGVkZWYgZW51bSB7CisgIEZXTF9FVkVOVFRZUEVfTW91c2UgPSAwLAorICBGV0xfRVZFTlRUWVBFX01vdXNlV2hlZWwsCisgIEZXTF9FVkVOVFRZUEVfS2V5LAogfSBGV0xfRVZFTlRUWVBFOwogCi0vL2tleSBmbGFnCi10eXBlZGVmIGVudW0KLXsKLSAgICBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5ICAgICAgICAgID0gMSA8PCAwLAotICAgIEZXTF9FVkVOVEZMQUdfQ29udHJvbEtleSAgICAgICAgPSAxIDw8IDEsCi0gICAgRldMX0VWRU5URkxBR19BbHRLZXkgICAgICAgICAgICA9IDEgPDwgMiwKLSAgICBGV0xfRVZFTlRGTEFHX01ldGFLZXkgICAgICAgICAgID0gMSA8PCAzLAotICAgIEZXTF9FVkVOVEZMQUdfS2V5UGFkICAgICAgICAgICAgPSAxIDw8IDQsCi0gICAgRldMX0VWRU5URkxBR19BdXRvUmVwZWF0ICAgICAgICA9IDEgPDwgNSwKLSAgICBGV0xfRVZFTlRGTEFHX0xlZnRCdXR0b25Eb3duICAgID0gMSA8PCA2LAotICAgIEZXTF9FVkVOVEZMQUdfTWlkZGxlQnV0dG9uRG93biAgPSAxIDw8IDcsCi0gICAgRldMX0VWRU5URkxBR19SaWdodEJ1dHRvbkRvd24gICA9IDEgPDwgOCwKKy8vIGtleSBmbGFnCit0eXBlZGVmIGVudW0geworICBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5ID0gMSA8PCAwLAorICBGV0xfRVZFTlRGTEFHX0NvbnRyb2xLZXkgPSAxIDw8IDEsCisgIEZXTF9FVkVOVEZMQUdfQWx0S2V5ID0gMSA8PCAyLAorICBGV0xfRVZFTlRGTEFHX01ldGFLZXkgPSAxIDw8IDMsCisgIEZXTF9FVkVOVEZMQUdfS2V5UGFkID0gMSA8PCA0LAorICBGV0xfRVZFTlRGTEFHX0F1dG9SZXBlYXQgPSAxIDw8IDUsCisgIEZXTF9FVkVOVEZMQUdfTGVmdEJ1dHRvbkRvd24gPSAxIDw8IDYsCisgIEZXTF9FVkVOVEZMQUdfTWlkZGxlQnV0dG9uRG93biA9IDEgPDwgNywKKyAgRldMX0VWRU5URkxBR19SaWdodEJ1dHRvbkRvd24gPSAxIDw8IDgsCiB9IEZXTF9FVkVOVEZMQUc7CiAKIC8vIE1vdXNlIG1lc3NhZ2UgY29tbWFuZAotdHlwZWRlZiBlbnVtCi17Ci0gICAgRldMX0VWRU5UTU9VU0VDTURfTEJ1dHRvbkRvd24gPSAxLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX0xCdXR0b25VcCwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9MQnV0dG9uRGJsQ2xrLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX1JCdXR0b25Eb3duLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX1JCdXR0b25VcCwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9SQnV0dG9uRGJsQ2xrLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01CdXR0b25Eb3duLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01CdXR0b25VcCwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9NQnV0dG9uRGJsQ2xrLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlTW92ZSwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9Nb3VzZUVudGVyLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlSG92ZXIsCi0gICAgRldMX0VWRU5UTU9VU0VDTURfTW91c2VMZWF2ZSwKK3R5cGVkZWYgZW51bSB7CisgIEZXTF9FVkVOVE1PVVNFQ01EX0xCdXR0b25Eb3duID0gMSwKKyAgRldMX0VWRU5UTU9VU0VDTURfTEJ1dHRvblVwLAorICBGV0xfRVZFTlRNT1VTRUNNRF9MQnV0dG9uRGJsQ2xrLAorICBGV0xfRVZFTlRNT1VTRUNNRF9SQnV0dG9uRG93biwKKyAgRldMX0VWRU5UTU9VU0VDTURfUkJ1dHRvblVwLAorICBGV0xfRVZFTlRNT1VTRUNNRF9SQnV0dG9uRGJsQ2xrLAorICBGV0xfRVZFTlRNT1VTRUNNRF9NQnV0dG9uRG93biwKKyAgRldMX0VWRU5UTU9VU0VDTURfTUJ1dHRvblVwLAorICBGV0xfRVZFTlRNT1VTRUNNRF9NQnV0dG9uRGJsQ2xrLAorICBGV0xfRVZFTlRNT1VTRUNNRF9Nb3VzZU1vdmUsCisgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlRW50ZXIsCisgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlSG92ZXIsCisgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlTGVhdmUsCiB9IEZXTF9FVkVOVF9NT1VTRUNNRDsKIAotLy9tb3VzZSBldmVudAotc3RydWN0IEZXTF9FVkVOVF9NT1VTRQotewotICAgIEZQREZfVUlOVDMyIGNvbW1hbmQ7Ci0gICAgRlBERl9EV09SRCBmbGFnOwotICAgIEZQREZfRkxPQVQgeDsKLSAgICBGUERGX0ZMT0FUIHk7CisvLyBtb3VzZSBldmVudAorc3RydWN0IEZXTF9FVkVOVF9NT1VTRSB7CisgIEZQREZfVUlOVDMyIGNvbW1hbmQ7CisgIEZQREZfRFdPUkQgZmxhZzsKKyAgRlBERl9GTE9BVCB4OworICBGUERGX0ZMT0FUIHk7CiB9OwogCi0vL21vdXNlIHdoZWVsCi1zdHJ1Y3QgRldMX0VWRU5UX01PVVNFV0hFRUwKLXsKLSAgICBGUERGX0RXT1JEIGZsYWc7Ci0gICAgRlBERl9GTE9BVCB4OwotICAgIEZQREZfRkxPQVQgeTsKLSAgICBGUERGX0ZMT0FUIGRlbHRhWDsKLSAgICBGUERGX0ZMT0FUIGRlbHRhWTsKKy8vIG1vdXNlIHdoZWVsCitzdHJ1Y3QgRldMX0VWRU5UX01PVVNFV0hFRUwgeworICBGUERGX0RXT1JEIGZsYWc7CisgIEZQREZfRkxPQVQgeDsKKyAgRlBERl9GTE9BVCB5OworICBGUERGX0ZMT0FUIGRlbHRhWDsKKyAgRlBERl9GTE9BVCBkZWx0YVk7CiB9OwogCi0vL3ZpcnR1YWwga2V5Y29kZQotdHlwZWRlZiBlbnVtCi17Ci0gIEZXTF9WS0VZX0JhY2sgICAgID0gMHgwOCwKLSAgRldMX1ZLRVlfVGFiICAgICAgPSAweDA5LAotICBGV0xfVktFWV9DbGVhciAgICA9IDB4MEMsCi0gIEZXTF9WS0VZX1JldHVybiAgID0gMHgwRCwKLSAgRldMX1ZLRVlfU2hpZnQgICAgPSAweDEwLAotICBGV0xfVktFWV9Db250cm9sICA9IDB4MTEsCi0gIEZXTF9WS0VZX01lbnUgICAgID0gMHgxMiwKLSAgRldMX1ZLRVlfUGF1c2UgICAgPSAweDEzLAotICBGV0xfVktFWV9DYXBpdGFsICA9IDB4MTQsCi0gIEZXTF9WS0VZX0thbmEgICAgID0gMHgxNSwKLSAgRldMX1ZLRVlfSGFuZ3VsICAgPSAweDE1LAotICBGV0xfVktFWV9KdW5qYSAgICA9IDB4MTcsCi0gIEZXTF9WS0VZX0ZpbmFsICAgID0gMHgxOCwKLSAgRldMX1ZLRVlfSGFuamEgICAgPSAweDE5LAotICBGV0xfVktFWV9LYW5qaSAgICA9IDB4MTksCi0gIEZXTF9WS0VZX0VzY2FwZSAgID0gMHgxQiwKLSAgRldMX1ZLRVlfQ29udmVydCAgPSAweDFDLAorLy8gdmlydHVhbCBrZXljb2RlCit0eXBlZGVmIGVudW0geworICBGV0xfVktFWV9CYWNrID0gMHgwOCwKKyAgRldMX1ZLRVlfVGFiID0gMHgwOSwKKyAgRldMX1ZLRVlfQ2xlYXIgPSAweDBDLAorICBGV0xfVktFWV9SZXR1cm4gPSAweDBELAorICBGV0xfVktFWV9TaGlmdCA9IDB4MTAsCisgIEZXTF9WS0VZX0NvbnRyb2wgPSAweDExLAorICBGV0xfVktFWV9NZW51ID0gMHgxMiwKKyAgRldMX1ZLRVlfUGF1c2UgPSAweDEzLAorICBGV0xfVktFWV9DYXBpdGFsID0gMHgxNCwKKyAgRldMX1ZLRVlfS2FuYSA9IDB4MTUsCisgIEZXTF9WS0VZX0hhbmd1bCA9IDB4MTUsCisgIEZXTF9WS0VZX0p1bmphID0gMHgxNywKKyAgRldMX1ZLRVlfRmluYWwgPSAweDE4LAorICBGV0xfVktFWV9IYW5qYSA9IDB4MTksCisgIEZXTF9WS0VZX0thbmppID0gMHgxOSwKKyAgRldMX1ZLRVlfRXNjYXBlID0gMHgxQiwKKyAgRldMX1ZLRVlfQ29udmVydCA9IDB4MUMsCiAgIEZXTF9WS0VZX05vbkNvbnZlcnQgPSAweDFELAotICBGV0xfVktFWV9BY2NlcHQgICAgPSAweDFFLAorICBGV0xfVktFWV9BY2NlcHQgPSAweDFFLAogICBGV0xfVktFWV9Nb2RlQ2hhbmdlID0gMHgxRiwKICAgRldMX1ZLRVlfU3BhY2UgPSAweDIwLAogICBGV0xfVktFWV9QcmlvciA9IDB4MjEsCkBAIC0yNDgsNDEgKzI0MiwzNiBAQAogICBGV0xfVktFWV9Vbmtub3duID0gMCwKIH0gRldMX1ZLRVlDT0RFOwogCi0vL2tleSBldmVudCBjb21tYW5kCi10eXBlZGVmIGVudW0KLXsKLSAgICBGV0xfRVZFTlRLRVlDTURfS2V5RG93biA9IDEsCi0gICAgRldMX0VWRU5US0VZQ01EX0tleVVwLAotICAgIEZXTF9FVkVOVEtFWUNNRF9DaGFyLAorLy8ga2V5IGV2ZW50IGNvbW1hbmQKK3R5cGVkZWYgZW51bSB7CisgIEZXTF9FVkVOVEtFWUNNRF9LZXlEb3duID0gMSwKKyAgRldMX0VWRU5US0VZQ01EX0tleVVwLAorICBGV0xfRVZFTlRLRVlDTURfQ2hhciwKIH0gRldMX0VWRU5US0VZQ01EOwogCi0vL2tleSBldmVudAotc3RydWN0IEZXTF9FVkVOVF9LRVkKLXsKLSAgICBGUERGX1VJTlQzMiBjb21tYW5kOwotICAgIEZQREZfRFdPUkQgZmxhZzsKLSAgICB1bmlvbgotICAgIHsKLSAgICAgICAgLy9WaXJ0dWFsIGtleSBjb2RlLgotICAgICAgICBGUERGX1VJTlQzMiB2a2NvZGU7Ci0gICAgICAgIC8vQ2hhcmFjdGVyIGNvZGUuCi0gICAgICAgIEZQREZfRFdPUkQgY2hhcmNvZGU7Ci0gICAgfWNvZGU7CisvLyBrZXkgZXZlbnQKK3N0cnVjdCBGV0xfRVZFTlRfS0VZIHsKKyAgRlBERl9VSU5UMzIgY29tbWFuZDsKKyAgRlBERl9EV09SRCBmbGFnOworICB1bmlvbiB7CisgICAgLy8gVmlydHVhbCBrZXkgY29kZS4KKyAgICBGUERGX1VJTlQzMiB2a2NvZGU7CisgICAgLy8gQ2hhcmFjdGVyIGNvZGUuCisgICAgRlBERl9EV09SRCBjaGFyY29kZTsKKyAgfSBjb2RlOwogfTsKIAotLy9ldmVudCB0eXBlCi1zdHJ1Y3QgRldMX0VWRU5UCi17Ci0gICAgLy9zdHJ1Y3R1cmUgc2l6ZS4KLSAgICBGUERGX1VJTlQzMiBzaXplOwotICAgIC8vRldMX0VWRU5UVFlQRS4KLSAgICBGUERGX1VJTlQzMiB0eXBlOwotICAgIHVuaW9uCi0gICAgewotICAgICAgICBzdHJ1Y3QgRldMX0VWRU5UX01PVVNFIG1vdXNlOwotICAgICAgICBzdHJ1Y3QgRldMX0VWRU5UX01PVVNFV0hFRUwgd2hlZWw7Ci0gICAgICAgIHN0cnVjdCBGV0xfRVZFTlRfS0VZIGtleTsKLSAgICB9czsKKy8vIGV2ZW50IHR5cGUKK3N0cnVjdCBGV0xfRVZFTlQgeworICAvLyBzdHJ1Y3R1cmUgc2l6ZS4KKyAgRlBERl9VSU5UMzIgc2l6ZTsKKyAgLy8gRldMX0VWRU5UVFlQRS4KKyAgRlBERl9VSU5UMzIgdHlwZTsKKyAgdW5pb24geworICAgIHN0cnVjdCBGV0xfRVZFTlRfTU9VU0UgbW91c2U7CisgICAgc3RydWN0IEZXTF9FVkVOVF9NT1VTRVdIRUVMIHdoZWVsOworICAgIHN0cnVjdCBGV0xfRVZFTlRfS0VZIGtleTsKKyAgfSBzOwogfTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9wcG8uaCBiL3B1YmxpYy9mcGRmX3Bwby5oCmluZGV4IDEwMjFmYWUuLjk2NDU1NDUgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3Bwby5oCisrKyBiL3B1YmxpYy9mcGRmX3Bwby5oCkBAIC0xOSwyNCArMTksMzAgQEAKIC8vICAgICAgICAgIGRlc3RfZG9jICAgIC0gICBUaGUgZGVzdGluYXRpb24gZG9jdW1lbnQgd2hpY2ggYWRkIHRoZSBwYWdlcy4KIC8vICAgICAgICAgIHNyY19kb2MgICAgIC0gICBBIGRvY3VtZW50IHRvIGJlIGltcG9ydGVkLgogLy8gICAgICAgICAgcGFnZXJhbmdlICAgLSAgIEEgcGFnZSByYW5nZSBzdHJpbmcsIFN1Y2ggYXMgIjEsMyw1LTciLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwsIGl0IHdvdWxkIGltcG9ydCBhbGwgcGFnZXMgaW4gc3JjX2RvYy4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBOVUxMLCBpdCB3b3VsZCBpbXBvcnQgYWxsIHBhZ2VzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc3JjX2RvYy4KIC8vICAgICAgICAgIGluZGV4ICAgICAgIC0gICBUaGUgcGFnZSBpbmRleCB3YW50ZWQgdG8gaW5zZXJ0IGZyb20uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUUlVFIGZvciBzdWNjZWVkLCBGQUxTRSBmb3IgRmFpbGVkLgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2Qgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YKKy8vICAgICAgICAgIGR5bmFtaWMgWEZBIGZpZWxkcy4KIC8vCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9JbXBvcnRQYWdlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLEZQREZfRE9DVU1FTlQgc3JjX2RvYywgRlBERl9CWVRFU1RSSU5HIHBhZ2VyYW5nZSwgaW50IGluZGV4KTsKLQorRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfSW1wb3J0UGFnZXMoRlBERl9ET0NVTUVOVCBkZXN0X2RvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRE9DVU1FTlQgc3JjX2RvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBwYWdlcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwogCiAvLyBGdW5jdGlvbjogRlBERl9Db3B5Vmlld2VyUHJlZmVyZW5jZXMKIC8vICAgICAgICAgIENvcHkgdGhlIHZpZXdlciBwcmVmZXJlbmNlcyBmcm9tIG9uZSBQREYgZG9jdW1lbnQgdG8gYW5vdGhlci4jZW5kaWYKIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkZXN0X2RvYyAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IHRvIHdyaXRlIHRoZSB2aWV3ZXIgcHJlZmVyZW5jZXMgdG8uCisvLyAgICAgICAgICBkZXN0X2RvYyAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IHRvIHdyaXRlIHRoZSB2aWV3ZXIgcHJlZmVyZW5jZXMKKy8vICAgICAgICAgIHRvLgogLy8gICAgICAgICAgc3JjX2RvYyAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCB3aXRoIHRoZSB2aWV3ZXIgcHJlZmVyZW5jZXMuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUUlVFIGZvciBzdWNjZXNzLCBGQUxTRSBmb3IgZmFpbHVyZS4KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0NvcHlWaWV3ZXJQcmVmZXJlbmNlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLCBGUERGX0RPQ1VNRU5UIHNyY19kb2MpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfQ29weVZpZXdlclByZWZlcmVuY2VzKEZQREZfRE9DVU1FTlQgZGVzdF9kb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBzcmNfZG9jKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9wcm9ncmVzc2l2ZS5oIGIvcHVibGljL2ZwZGZfcHJvZ3Jlc3NpdmUuaAppbmRleCBkMWJiYzQwLi4xMTUwMzQ5IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9wcm9ncmVzc2l2ZS5oCisrKyBiL3B1YmxpYy9mcGRmX3Byb2dyZXNzaXZlLmgKQEAgLTksODkgKzksMTE0IEBACiAKICNpbmNsdWRlICJmcGRmdmlldy5oIgogCi0vL0ZsYWdzIGZvciBwcm9ncmVzc2l2ZSBwcm9jZXNzIHN0YXR1cy4KLSNkZWZpbmUgRlBERl9SRU5ERVJfUkVBREVSICAgICAgICAgIDAKLSNkZWZpbmUgRlBERl9SRU5ERVJfVE9CRUNPVU5USU5VRUQgIDEKLSNkZWZpbmUgRlBERl9SRU5ERVJfRE9ORSAgICAgICAgICAgIDIKLSNkZWZpbmUgRlBERl9SRU5ERVJfRkFJTEVEICAgICAgICAgIDMKLQorLy8gRmxhZ3MgZm9yIHByb2dyZXNzaXZlIHByb2Nlc3Mgc3RhdHVzLgorI2RlZmluZSBGUERGX1JFTkRFUl9SRUFERVIgMAorI2RlZmluZSBGUERGX1JFTkRFUl9UT0JFQ09VTlRJTlVFRCAxCisjZGVmaW5lIEZQREZfUkVOREVSX0RPTkUgMgorI2RlZmluZSBGUERGX1JFTkRFUl9GQUlMRUQgMwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKKy8vIElGUERGX1JFTkRFUklORk8gaW50ZXJmYWNlLgordHlwZWRlZiBzdHJ1Y3QgX0lGU0RLX1BBVVNFIHsKKyAgLyoqCisgICogVmVyc2lvbiBudW1iZXIgb2YgdGhlIGludGVyZmFjZS4gQ3VycmVudGx5IG11c3QgYmUgMS4KKyAgKiovCisgIGludCB2ZXJzaW9uOwogCi0vL0lGUERGX1JFTkRFUklORk8gaW50ZXJmYWNlLgotdHlwZWRlZiBzdHJ1Y3QgX0lGU0RLX1BBVVNFCi17Ci0gICAgLyoqCi0gICAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgotICAgICoqLwotICAgIGludCB2ZXJzaW9uOworICAvKgorICAqIE1ldGhvZDogTmVlZFRvUGF1c2VOb3cKKyAgKiAgICAgICAgICAgQ2hlY2sgaWYgd2UgbmVlZCB0byBwYXVzZSBhIHByb2dyZXNzaXZlIHByb2Nlc3Mgbm93LgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAqIFJldHVybiBWYWx1ZToKKyAgKiAgICAgICAgICAgIE5vbi16ZXJvIGZvciBwYXVzZSBub3csIDAgZm9yIGNvbnRpbnVlLgorICAqCisgICovCisgIEZQREZfQk9PTCAoKk5lZWRUb1BhdXNlTm93KShzdHJ1Y3QgX0lGU0RLX1BBVVNFKiBwVGhpcyk7CiAKLSAgICAvKgotICAgICogTWV0aG9kOiBOZWVkVG9QYXVzZU5vdwotICAgICogICAgICAgICAgIENoZWNrIGlmIHdlIG5lZWQgdG8gcGF1c2UgYSBwcm9ncmVzc2l2ZSBwcm9jZXNzIG5vdy4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqIFJldHVybiBWYWx1ZToKLSAgICAqICAgICAgICAgICAgTm9uLXplcm8gZm9yIHBhdXNlIG5vdywgMCBmb3IgY29udGludWUuCi0gICAgKgotICAgICovCi0gICAgRlBERl9CT09MICgqTmVlZFRvUGF1c2VOb3cpIChzdHJ1Y3QgX0lGU0RLX1BBVVNFKiBwVGhpcyk7Ci0KLSAgICAvL0EgdXNlciBkZWZpbmVkIGRhdGEgcG9pbnRlciwgdXNlZCBieSB1c2VyJ3MgYXBwbGljYXRpb24uIENhbiBiZSBOVUxMLgotICAgIHZvaWQqICAgICAgIHVzZXI7CisgIC8vIEEgdXNlciBkZWZpbmVkIGRhdGEgcG9pbnRlciwgdXNlZCBieSB1c2VyJ3MgYXBwbGljYXRpb24uIENhbiBiZSBOVUxMLgorICB2b2lkKiB1c2VyOwogfSBJRlNES19QQVVTRTsKIAogLy8gRnVuY3Rpb246IEZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydAotLy8gICAgICAgICAgU3RhcnQgdG8gcmVuZGVyIHBhZ2UgY29udGVudHMgdG8gYSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwIHByb2dyZXNzaXZlbHkuCisvLyAgICAgICAgICBTdGFydCB0byByZW5kZXIgcGFnZSBjb250ZW50cyB0byBhIGRldmljZSBpbmRlcGVuZGVudCBiaXRtYXAKKy8vICAgICAgICAgIHByb2dyZXNzaXZlbHkuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoYXMgdGhlIG91dHB1dCBidWZmZXIpLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBoYW5kbGUgY2FuIGJlIGNyZWF0ZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCi0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgYml0bWFwIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGJpdG1hcCBjb29yZGluYXRlLgorLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoYXMgdGhlCisvLyAgICAgICAgICBvdXRwdXQgYnVmZmVyKS4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgaGFuZGxlIGNhbiBiZSBjcmVhdGVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KKy8vICAgICAgICAgIHN0YXJ0X3ggICAgIC0gICBMZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlCisvLyAgICAgICAgICBiaXRtYXAgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgYml0bWFwCisvLyAgICAgICAgICBjb29yZGluYXRlLgogLy8gICAgICAgICAgc2l6ZV94ICAgICAgLSAgIEhvcml6b250YWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KIC8vICAgICAgICAgIHNpemVfeSAgICAgIC0gICBWZXJ0aWNhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgotLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKS4KLS8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MgZGVmaW5lZCBhYm92ZS4KLS8vICAgICAgICAgIHBhdXNlICAgICAgIC0gICBUaGUgSUZTREtfUEFVU0UgaW50ZXJmYWNlLkEgY2FsbGJhY2sgbWVjaGFuaXNtIGFsbG93aW5nIHRoZSBwYWdlIHJlbmRlcmluZyBwcm9jZXNzCisvLyAgICAgICAgICByb3RhdGUgICAgICAtICAgUGFnZSBvcmllbnRhdGlvbjogMCAobm9ybWFsKSwgMSAocm90YXRlZCA5MCBkZWdyZWVzCisvLyAgICAgICAgICBjbG9ja3dpc2UpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXItY2xvY2t3aXNlKS4KKy8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MKKy8vICAgICAgICAgIGRlZmluZWQgYWJvdmUuCisvLyAgICAgICAgICBwYXVzZSAgICAgICAtICAgVGhlIElGU0RLX1BBVVNFIGludGVyZmFjZS5BIGNhbGxiYWNrIG1lY2hhbmlzbQorLy8gICAgICAgICAgYWxsb3dpbmcgdGhlIHBhZ2UgcmVuZGVyaW5nIHByb2Nlc3MKIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIFJlbmRlcmluZyBTdGF0dXMuIFNlZSBmbGFncyBmb3IgcHJvZ3Jlc3NpdmUgcHJvY2VzcyBzdGF0dXMgZm9yIHRoZSBkZXRhaWxzLgorLy8gICAgICAgICAgUmVuZGVyaW5nIFN0YXR1cy4gU2VlIGZsYWdzIGZvciBwcm9ncmVzc2l2ZSBwcm9jZXNzIHN0YXR1cyBmb3IgdGhlCisvLyAgICAgICAgICBkZXRhaWxzLgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbm5vdCBub3Qgc3VwcG9ydCB0byByZW5kZXIgcGFnZSB3aGljaCB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW5ub3Qgbm90IHN1cHBvcnQgdG8gcmVuZGVyIHBhZ2Ugd2hpY2ggdGhlIGRvY3VtZW50CisvLyAgICAgICAgICBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydChGUERGX0JJVE1BUCBiaXRtYXAsIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LCBpbnQgcm90YXRlLCBpbnQgZmxhZ3MsSUZTREtfUEFVU0UgKiBwYXVzZSk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9SZW5kZXJQYWdlQml0bWFwX1N0YXJ0KEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRSogcGF1c2UpOwogCiAvLyBGdW5jdGlvbjogRlBERl9SZW5kZXJQYWdlX0NvbnRpbnVlCiAvLyAgICAgICAgICBDb250aW51ZSByZW5kZXJpbmcgYSBQREYgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgcGF1c2UgICAgICAgLSAgIFRoZSBJRlNES19QQVVTRSBpbnRlcmZhY2UuQSBjYWxsYmFjayBtZWNoYW5pc20gYWxsb3dpbmcgdGhlIHBhZ2UgcmVuZGVyaW5nIHByb2Nlc3MKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwYXVzZWQgYmVmb3JlIGl0J3MgZmluaXNoZWQuIFRoaXMgY2FuIGJlIE5VTEwgaWYgeW91IGRvbid0IHdhbnQgdG8gcGF1c2UuCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KKy8vICAgICAgICAgIHBhdXNlICAgICAgIC0gICBUaGUgSUZTREtfUEFVU0UgaW50ZXJmYWNlLkEgY2FsbGJhY2sgbWVjaGFuaXNtCisvLyAgICAgICAgICBhbGxvd2luZyB0aGUgcGFnZSByZW5kZXJpbmcgcHJvY2VzcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHBhdXNlZCBiZWZvcmUgaXQncyBmaW5pc2hlZC4gVGhpcyBjYW4gYmUgTlVMTAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHlvdSBkb24ndCB3YW50IHRvIHBhdXNlLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIHJlbmRlcmluZyBzdGF0dXMuIFNlZSBmbGFncyBmb3IgcHJvZ3Jlc3NpdmUgcHJvY2VzcyBzdGF0dXMgZm9yIHRoZSBkZXRhaWxzLgorLy8gICAgICAgICAgVGhlIHJlbmRlcmluZyBzdGF0dXMuIFNlZSBmbGFncyBmb3IgcHJvZ3Jlc3NpdmUgcHJvY2VzcyBzdGF0dXMgZm9yCisvLyAgICAgICAgICB0aGUgZGV0YWlscy4KIC8vIE5vdGVzOgotLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW5ub3Qgbm90IHN1cHBvcnQgdG8gcmVuZGVyIHBhZ2Ugd2hpY2ggdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2Fubm90IG5vdCBzdXBwb3J0IHRvIHJlbmRlciBwYWdlIHdoaWNoIHRoZSBkb2N1bWVudAorLy8gICAgICAgICAgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogLy8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VfQ29udGludWUoRlBERl9QQUdFIHBhZ2UsSUZTREtfUEFVU0UgKiBwYXVzZSk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9SZW5kZXJQYWdlX0NvbnRpbnVlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRSogcGF1c2UpOwogCiAvLyBGdW5jdGlvbjogRlBERl9SZW5kZXJQYWdlX0Nsb3NlCi0vLyAgICAgICAgICBSZWxlYXNlIHRoZSByZXNvdXJjZSBhbGxvY2F0ZSBkdXJpbmcgcGFnZSByZW5kZXJpbmcuIE5lZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGZpbmlzaGluZyByZW5kZXJpbmcgb3IKKy8vICAgICAgICAgIFJlbGVhc2UgdGhlIHJlc291cmNlIGFsbG9jYXRlIGR1cmluZyBwYWdlIHJlbmRlcmluZy4gTmVlZCB0byBiZQorLy8gICAgICAgICAgY2FsbGVkIGFmdGVyIGZpbmlzaGluZyByZW5kZXJpbmcgb3IKIC8vICAgICAgICAgIGNhbmNlbCB0aGUgcmVuZGVyaW5nLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5VTEwKIC8vIE5vdGVzOgotLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW5ub3Qgbm90IHN1cHBvcnQgdG8gcmVuZGVyIHBhZ2Ugd2hpY2ggdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2Fubm90IG5vdCBzdXBwb3J0IHRvIHJlbmRlciBwYWdlIHdoaWNoIHRoZSBkb2N1bWVudAorLy8gICAgICAgICAgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogLy8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlX0Nsb3NlKEZQREZfUEFHRSBwYWdlKTsKIApkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfc2F2ZS5oIGIvcHVibGljL2ZwZGZfc2F2ZS5oCmluZGV4IGFhMzI2MDMuLjRlZWEwNTQgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3NhdmUuaAorKysgYi9wdWJsaWMvZnBkZl9zYXZlLmgKQEAgLTEzLDY2ICsxMyw3MiBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotCiAvLyBTdHJ1Y3R1cmUgZm9yIGN1c3RvbSBmaWxlIHdyaXRlCiB0eXBlZGVmIHN0cnVjdCBGUERGX0ZJTEVXUklURV8geworICAvLworICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgorICAvLworICBpbnQgdmVyc2lvbjsKIAotICAgIC8vCi0gICAgLy9WZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgotICAgIC8vCi0gICAgaW50IHZlcnNpb247Ci0KLSAgICAvLwotICAgIC8vIE1ldGhvZDogV3JpdGVCbG9jawotICAgIC8vICAgICAgICAgIE91dHB1dCBhIGJsb2NrIG9mIGRhdGEgaW4geW91ciBjdXN0b20gd2F5LgotICAgIC8vIEludGVyZmFjZSBWZXJzaW9uOgotICAgIC8vICAgICAgICAgIDEKLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAvLyAgICAgICAgICBZZXMKLSAgICAvLyBDb21tZW50czoKLSAgICAvLyAgICAgICAgICBDYWxsZWQgYnkgZnVuY3Rpb24gRlBERl9TYXZlRG9jdW1lbnQKLSAgICAvLyBQYXJhbWV0ZXJzOgotICAgIC8vICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgLy8gICAgICAgICAgcERhdGEgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gb3V0cHV0Ci0gICAgLy8gICAgICAgICAgc2l6ZSAgICAgICAgLSAgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIuCi0gICAgLy8gUmV0dXJuIHZhbHVlOgotICAgIC8vICAgICAgICAgIFNob3VsZCBiZSBub24temVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGZvciBlcnJvci4KLSAgICAvLwotICAgIGludCAgICAgKCpXcml0ZUJsb2NrKShzdHJ1Y3QgRlBERl9GSUxFV1JJVEVfKiBwVGhpcywgY29uc3Qgdm9pZCogcERhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisgIC8vCisgIC8vIE1ldGhvZDogV3JpdGVCbG9jaworICAvLyAgICAgICAgICBPdXRwdXQgYSBibG9jayBvZiBkYXRhIGluIHlvdXIgY3VzdG9tIHdheS4KKyAgLy8gSW50ZXJmYWNlIFZlcnNpb246CisgIC8vICAgICAgICAgIDEKKyAgLy8gSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgIC8vICAgICAgICAgIFllcworICAvLyBDb21tZW50czoKKyAgLy8gICAgICAgICAgQ2FsbGVkIGJ5IGZ1bmN0aW9uIEZQREZfU2F2ZURvY3VtZW50CisgIC8vIFBhcmFtZXRlcnM6CisgIC8vICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmCisgIC8vICAgICAgICAgIHBEYXRhICAgICAgIC0gICBQb2ludGVyIHRvIGEgYnVmZmVyIHRvIG91dHB1dAorICAvLyAgICAgICAgICBzaXplICAgICAgICAtICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAgLy8gUmV0dXJuIHZhbHVlOgorICAvLyAgICAgICAgICBTaG91bGQgYmUgbm9uLXplcm8gaWYgc3VjY2Vzc2Z1bCwgemVybyBmb3IgZXJyb3IuCisgIC8vCisgIGludCAoKldyaXRlQmxvY2spKHN0cnVjdCBGUERGX0ZJTEVXUklURV8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKIAogfSBGUERGX0ZJTEVXUklURTsKIAogLyoqIEBicmllZiBJbmNyZW1lbnRhbC4gKi8KLSNkZWZpbmUgRlBERl9JTkNSRU1FTlRBTCAgICAgICAgMQorI2RlZmluZSBGUERGX0lOQ1JFTUVOVEFMIDEKIC8qKiBAYnJpZWYgTm8gSW5jcmVtZW50YWwuICovCi0jZGVmaW5lIEZQREZfTk9fSU5DUkVNRU5UQUwgICAgIDIKKyNkZWZpbmUgRlBERl9OT19JTkNSRU1FTlRBTCAyCiAvKiogQGJyaWVmIFJlbW92ZSBzZWN1cml0eS4gKi8KLSNkZWZpbmUgRlBERl9SRU1PVkVfU0VDVVJJVFkgICAgMworI2RlZmluZSBGUERGX1JFTU9WRV9TRUNVUklUWSAzCiAKIC8vIEZ1bmN0aW9uOiBGUERGX1NhdmVBc0NvcHkKIC8vICAgICAgICAgIFNhdmVzIHRoZSBjb3B5IG9mIHNwZWNpZmllZCBkb2N1bWVudCBpbiBjdXN0b20gd2F5LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBhbmQgRlBERl9DcmVhdGVOZXdEb2N1bWVudC4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERl9Mb2FkRG9jdW1lbnQgYW5kIEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQuCiAvLyAgICAgICAgICBwRmlsZVdyaXRlICAgICAgLSAgIEEgcG9pbnRlciB0byBhIGN1c3RvbSBmaWxlIHdyaXRlIHN0cnVjdHVyZS4KIC8vICAgICAgICAgIGZsYWdzICAgICAgICAgICAtICAgVGhlIGNyZWF0aW5nIGZsYWdzLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBmb3Igc3VjY2VlZCwgRkFMU0UgZm9yIGZhaWxlZC4KIC8vCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TYXZlQXNDb3B5KCAgICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MgKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVBc0NvcHkoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFV1JJVEUqIHBGaWxlV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MpOwogCiAvLyBGdW5jdGlvbjogRlBERl9TYXZlV2l0aFZlcnNpb24KLS8vICAgICAgICAgIFNhbWUgYXMgZnVuY3Rpb24gOjpGUERGX1NhdmVBc0NvcHksIGV4Y2VwdCB0aGUgZmlsZSB2ZXJzaW9uIG9mIHRoZSBzYXZlZCBkb2N1bWVudCBjb3VsZCBiZSBzcGVjaWZpZWQgYnkgdXNlci4KKy8vICAgICAgICAgIFNhbWUgYXMgZnVuY3Rpb24gOjpGUERGX1NhdmVBc0NvcHksIGV4Y2VwdCB0aGUgZmlsZSB2ZXJzaW9uIG9mIHRoZQorLy8gICAgICAgICAgc2F2ZWQgZG9jdW1lbnQgY291bGQgYmUgc3BlY2lmaWVkIGJ5IHVzZXIuCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuCiAvLyAgICAgICAgICBwRmlsZVdyaXRlICAgICAgLSAgIEEgcG9pbnRlciB0byBhIGN1c3RvbSBmaWxlIHdyaXRlIHN0cnVjdHVyZS4KIC8vICAgICAgICAgIGZsYWdzICAgICAgICAgICAtICAgVGhlIGNyZWF0aW5nIGZsYWdzLgotLy8gICAgICAgICAgZmlsZVZlcnNpb24gICAgIC0gICBUaGUgUERGIGZpbGUgdmVyc2lvbi4gRmlsZSB2ZXJzaW9uOiAxNCBmb3IgMS40LCAxNSBmb3IgMS41LCAuLi4KKy8vICAgICAgICAgIGZpbGVWZXJzaW9uICAgICAtICAgVGhlIFBERiBmaWxlIHZlcnNpb24uIEZpbGUgdmVyc2lvbjogMTQgZm9yIDEuNCwKKy8vICAgICAgICAgIDE1IGZvciAxLjUsIC4uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjZWVkLCBGQUxTRSBpZiBmYWlsZWQuCiAvLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfU2F2ZVdpdGhWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsRlBERl9GSUxFV1JJVEUgKiBwRmlsZVdyaXRlLAotICAgIEZQREZfRFdPUkQgZmxhZ3MsIGludCBmaWxlVmVyc2lvbik7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TYXZlV2l0aFZlcnNpb24oRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlVmVyc2lvbik7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfc2VhcmNoZXguaCBiL3B1YmxpYy9mcGRmX3NlYXJjaGV4LmgKaW5kZXggMWQ0M2VhYi4uYTZiNmUxYiAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfc2VhcmNoZXguaAorKysgYi9wdWJsaWMvZnBkZl9zZWFyY2hleC5oCkBAIC0xNiwxMSArMTYsMTQgQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRDaGFySW5kZXhGcm9tVGV4dEluZGV4CiAvLyAgICAgIEdldCB0aGUgYWN0dWFsbHkgY2hhciBpbmRleCBpbiB0ZXh0X3BhZ2UncyBpbnRlcm5hbCBjaGFyIGxpc3QuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgblRleHRJbmRleCAgLSAgIFRoZSBpbmRleCBvZiB0aGUgdGV4dCBpbiB0aGUgc3RyaW5nIGdldCBmcm9tIEZQREZUZXh0X0dldFRleHQuCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgblRleHRJbmRleCAgLSAgIFRoZSBpbmRleCBvZiB0aGUgdGV4dCBpbiB0aGUgc3RyaW5nIGdldCBmcm9tCisvLyAgICAgICAgICBGUERGVGV4dF9HZXRUZXh0LgogLy8gIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGluIGludGVybmFsIGNoYXJsaXN0LiAtMSBmb3IgZXJyb3IuCi1ETExFWFBPUlQgaW50IFNURENBTEwgIEZQREZUZXh0X0dldENoYXJJbmRleEZyb21UZXh0SW5kZXgoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIGludCBuVGV4dEluZGV4KTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTAorRlBERlRleHRfR2V0Q2hhckluZGV4RnJvbVRleHRJbmRleChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IG5UZXh0SW5kZXgpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX3N5c2ZvbnRpbmZvLmggYi9wdWJsaWMvZnBkZl9zeXNmb250aW5mby5oCmluZGV4IDYxNDY1ZjQuLmMyZGE3NGIgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3N5c2ZvbnRpbmZvLmgKKysrIGIvcHVibGljL2ZwZGZfc3lzZm9udGluZm8uaApAQCAtMTAsMjIgKzEwLDIyIEBACiAjaW5jbHVkZSAiZnBkZnZpZXcuaCIKIAogLyogQ2hhcmFjdGVyIHNldHMgZm9yIHRoZSBmb250ICovCi0jZGVmaW5lIEZYRk9OVF9BTlNJX0NIQVJTRVQgICAgIDAKLSNkZWZpbmUgRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCAgMQotI2RlZmluZSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQgICAyCisjZGVmaW5lIEZYRk9OVF9BTlNJX0NIQVJTRVQgMAorI2RlZmluZSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUIDEKKyNkZWZpbmUgRlhGT05UX1NZTUJPTF9DSEFSU0VUIDIKICNkZWZpbmUgRlhGT05UX1NISUZUSklTX0NIQVJTRVQgMTI4Ci0jZGVmaW5lIEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQgIDEyOQotI2RlZmluZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgICAxMzQKLSNkZWZpbmUgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQgIDEzNgorI2RlZmluZSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUIDEyOQorI2RlZmluZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgMTM0CisjZGVmaW5lIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUIDEzNgogCiAvKiBGb250IHBpdGNoIGFuZCBmYW1pbHkgZmxhZ3MgKi8KLSNkZWZpbmUgRlhGT05UX0ZGX0ZJWEVEUElUQ0ggICAgMQotI2RlZmluZSBGWEZPTlRfRkZfUk9NQU4gICAgICAgICAoMTw8NCkKLSNkZWZpbmUgRlhGT05UX0ZGX1NDUklQVCAgICAgICAgKDQ8PDQpCisjZGVmaW5lIEZYRk9OVF9GRl9GSVhFRFBJVENIIDEKKyNkZWZpbmUgRlhGT05UX0ZGX1JPTUFOICgxIDw8IDQpCisjZGVmaW5lIEZYRk9OVF9GRl9TQ1JJUFQgKDQgPDwgNCkKIAogLyogVHlwaWNhbCB3ZWlnaHQgdmFsdWVzICovCi0jZGVmaW5lIEZYRk9OVF9GV19OT1JNQUwgICAgICAgIDQwMAotI2RlZmluZSBGWEZPTlRfRldfQk9MRCAgICAgICAgICA3MDAKKyNkZWZpbmUgRlhGT05UX0ZXX05PUk1BTCA0MDAKKyNkZWZpbmUgRlhGT05UX0ZXX0JPTEQgNzAwCiAKIC8vIEV4cG9ydGVkIEZ1bmN0aW9ucwogI2lmZGVmIF9fY3BsdXNwbHVzCkBAIC0zNywxNjggKzM3LDIwMCBAQAogICogICAgICAgICAgSW50ZXJmYWNlIGZvciBnZXR0aW5nIHN5c3RlbSBmb250IGluZm9ybWF0aW9uIGFuZCBmb250IG1hcHBpbmcKICAqLwogdHlwZWRlZiBzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8gewotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCi0gICAgICoqLwotICAgIGludCB2ZXJzaW9uOworICAvKioKKyAgICogVmVyc2lvbiBudW1iZXIgb2YgdGhlIGludGVyZmFjZS4gQ3VycmVudGx5IG11c3QgYmUgMS4KKyAgICoqLworICBpbnQgdmVyc2lvbjsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogUmVsZWFzZQotICAgICAqICAgICAgICAgIEdpdmUgaW1wbGVtZW50YXRpb24gYSBjaGFuY2UgdG8gcmVsZWFzZSBhbnkgZGF0YSBhZnRlciB0aGUgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciB1c2VkCi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgICAgIE5vCi0gICAgICogQ29tbWVudHM6Ci0gICAgICogICAgICAgICAgQ2FsbGVkIGJ5IEZveGl0IFNESyBkdXJpbmcgdGhlIGZpbmFsIGNsZWFudXAgcHJvY2Vzcy4KLSAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lCi0gICAgICovCi0gICAgdm9pZCAoKlJlbGVhc2UpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMpOworICAvKioKKyAgICogTWV0aG9kOiBSZWxlYXNlCisgICAqICAgICAgICAgIEdpdmUgaW1wbGVtZW50YXRpb24gYSBjaGFuY2UgdG8gcmVsZWFzZSBhbnkgZGF0YSBhZnRlciB0aGUKKyAgICogaW50ZXJmYWNlIGlzIG5vIGxvbmdlciB1c2VkCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBObworICAgKiBDb21tZW50czoKKyAgICogICAgICAgICAgQ2FsbGVkIGJ5IEZveGl0IFNESyBkdXJpbmcgdGhlIGZpbmFsIGNsZWFudXAgcHJvY2Vzcy4KKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqIFJldHVybiBWYWx1ZToKKyAgICogICAgICAgICAgTm9uZQorICAgKi8KKyAgdm9pZCAoKlJlbGVhc2UpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMpOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBFbnVtRm9udHMKLSAgICAgKiAgICAgICAgICBFbnVtZXJhdGUgYWxsIGZvbnRzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtCi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgICAgIE5vCi0gICAgICogQ29tbWVudHM6Ci0gICAgICogICAgICAgICAgSW1wbGVtZW50YXRpb24gc2hvdWxkIGNhbGwgRlBERl9BZGRJbnRhbGxlZEZvbnQoKSBmdW5jdGlvbiBmb3IgZWFjaCBmb250IGZvdW5kLgotICAgICAqICAgICAgICAgIE9ubHkgVHJ1ZVR5cGUvT3BlblR5cGUgYW5kIFR5cGUxIGZvbnRzIGFyZSBhY2NlcHRlZCBieSBGb3hpdCBTREsuCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAgKiAgICAgICAgICBwTWFwcGVyICAgICAtICAgQW4gb3BhcXVlIHBvaW50ZXIgdG8gaW50ZXJuYWwgZm9udCBtYXBwZXIsIHVzZWQgd2hlbiBjYWxsaW5nIEZQREZfQWRkSW5zdGFsbGVkRm9udAotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lCi0gICAgICovCi0gICAgdm9pZCAoKkVudW1Gb250cykoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogcE1hcHBlcik7CisgIC8qKgorICAgKiBNZXRob2Q6IEVudW1Gb250cworICAgKiAgICAgICAgICBFbnVtZXJhdGUgYWxsIGZvbnRzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBObworICAgKiBDb21tZW50czoKKyAgICogICAgICAgICAgSW1wbGVtZW50YXRpb24gc2hvdWxkIGNhbGwgRlBERl9BZGRJbnRhbGxlZEZvbnQoKSBmdW5jdGlvbiBmb3IKKyAgICogZWFjaCBmb250IGZvdW5kLgorICAgKiAgICAgICAgICBPbmx5IFRydWVUeXBlL09wZW5UeXBlIGFuZCBUeXBlMSBmb250cyBhcmUgYWNjZXB0ZWQgYnkgRm94aXQgU0RLLgorICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgICogICAgICAgICAgcE1hcHBlciAgICAgLSAgIEFuIG9wYXF1ZSBwb2ludGVyIHRvIGludGVybmFsIGZvbnQgbWFwcGVyLCB1c2VkCisgICAqIHdoZW4gY2FsbGluZyBGUERGX0FkZEluc3RhbGxlZEZvbnQKKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBOb25lCisgICAqLworICB2b2lkICgqRW51bUZvbnRzKShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBwTWFwcGVyKTsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogTWFwRm9udAotICAgICAqICAgICAgICAgIFVzZSB0aGUgc3lzdGVtIGZvbnQgbWFwcGVyIHRvIGdldCBhIGZvbnQgaGFuZGxlIGZyb20gcmVxdWVzdGVkIHBhcmFtZXRlcnMKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgWWVzIG9ubHkgaWYgR2V0Rm9udCBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgotICAgICAqIENvbW1lbnRzOgotICAgICAqICAgICAgICAgIElmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgbmF0aXZlIGZvbnQgbWFwcGVyIChsaWtlIFdpbmRvd3MpLCBpbXBsZW1lbnRhdGlvbiBjYW4gaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGdldCBhIGZvbnQgaGFuZGxlLgotICAgICAqICAgICAgICAgIE90aGVyd2lzZSwgRm94aXQgU0RLIHdpbGwgZG8gdGhlIG1hcHBpbmcgYW5kIHRoZW4gY2FsbCBHZXRGb250IG1ldGhvZC4KLSAgICAgKiAgICAgICAgICBPbmx5IFRydWVUeXBlL09wZW5UeXBlIGFuZCBUeXBlMSBmb250cyBhcmUgYWNjZXB0ZWQgYnkgRm94aXQgU0RLLgotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogICAgICAgICAgd2VpZ2h0ICAgICAgLSAgIFdlaWdodCBvZiB0aGUgcmVxdWVzdGVkIGZvbnQuIDQwMCBpcyBub3JtYWwgYW5kIDcwMCBpcyBib2xkLgotICAgICAqICAgICAgICAgIGJJdGFsaWMgICAgIC0gICBJdGFsaWMgb3B0aW9uIG9mIHRoZSByZXF1ZXN0ZWQgZm9udCwgVFJVRSBvciBGQUxTRS4KLSAgICAgKiAgICAgICAgICBjaGFyc2V0ICAgICAtICAgQ2hhcmFjdGVyIHNldCBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIGZvbnQuIFNlZSBhYm92ZSBkZWZpbmVkIGNvbnN0YW50cy4KLSAgICAgKiAgICAgICAgICBwaXRjaF9mYW1pbHkgLSAgQSBjb21iaW5hdGlvbiBvZiBmbGFncy4gU2VlIGFib3ZlIGRlZmluZWQgY29uc3RhbnRzLgotICAgICAqICAgICAgICAgIGZhY2UgICAgICAgIC0gICBUeXBlZmFjZSBuYW1lLiBDdXJyZW50bHkgdXNlIHN5c3RlbSBsb2NhbCBlbmNvZGluZyBvbmx5LgotICAgICAqICAgICAgICAgIGJFeGFjdCAgICAgIC0gICBQb2ludGVyIHRvIGEgYm9vbGVhbiB2YWx1ZSByZWNlaXZpbmcgdGhlIGluZGljYXRvciB3aGV0aGVyIG1hcHBlciBmb3VuZCB0aGUgZXhhY3QgbWF0Y2guCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIElmIG1hcHBlciBpcyBub3Qgc3VyZSB3aGV0aGVyIGl0J3MgZXhhY3QgbWF0Y2gsIGlnbm9yZSB0aGlzIHBhcmFtdGVyLgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBBbiBvcGFxdWUgcG9pbnRlciBmb3IgZm9udCBoYW5kbGUsIG9yIE5VTEwgaWYgc3lzdGVtIG1hcHBpbmcgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKiovCi0gICAgdm9pZCogKCpNYXBGb250KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCBpbnQgd2VpZ2h0LCBGUERGX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYWNlLCBGUERGX0JPT0wqIGJFeGFjdCk7CisgIC8qKgorICAgKiBNZXRob2Q6IE1hcEZvbnQKKyAgICogICAgICAgICAgVXNlIHRoZSBzeXN0ZW0gZm9udCBtYXBwZXIgdG8gZ2V0IGEgZm9udCBoYW5kbGUgZnJvbSByZXF1ZXN0ZWQKKyAgICpwYXJhbWV0ZXJzCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBZZXMgb25seSBpZiBHZXRGb250IG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAqIENvbW1lbnRzOgorICAgKiAgICAgICAgICBJZiB0aGUgc3lzdGVtIHN1cHBvcnRzIG5hdGl2ZSBmb250IG1hcHBlciAobGlrZSBXaW5kb3dzKSwKKyAgICppbXBsZW1lbnRhdGlvbiBjYW4gaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGdldCBhIGZvbnQgaGFuZGxlLgorICAgKiAgICAgICAgICBPdGhlcndpc2UsIEZveGl0IFNESyB3aWxsIGRvIHRoZSBtYXBwaW5nIGFuZCB0aGVuIGNhbGwgR2V0Rm9udAorICAgKm1ldGhvZC4KKyAgICogICAgICAgICAgT25seSBUcnVlVHlwZS9PcGVuVHlwZSBhbmQgVHlwZTEgZm9udHMgYXJlIGFjY2VwdGVkIGJ5IEZveGl0IFNESy4KKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqICAgICAgICAgIHdlaWdodCAgICAgIC0gICBXZWlnaHQgb2YgdGhlIHJlcXVlc3RlZCBmb250LiA0MDAgaXMgbm9ybWFsIGFuZAorICAgKjcwMCBpcyBib2xkLgorICAgKiAgICAgICAgICBiSXRhbGljICAgICAtICAgSXRhbGljIG9wdGlvbiBvZiB0aGUgcmVxdWVzdGVkIGZvbnQsIFRSVUUgb3IKKyAgICpGQUxTRS4KKyAgICogICAgICAgICAgY2hhcnNldCAgICAgLSAgIENoYXJhY3RlciBzZXQgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCBmb250LgorICAgKlNlZSBhYm92ZSBkZWZpbmVkIGNvbnN0YW50cy4KKyAgICogICAgICAgICAgcGl0Y2hfZmFtaWx5IC0gIEEgY29tYmluYXRpb24gb2YgZmxhZ3MuIFNlZSBhYm92ZSBkZWZpbmVkCisgICAqY29uc3RhbnRzLgorICAgKiAgICAgICAgICBmYWNlICAgICAgICAtICAgVHlwZWZhY2UgbmFtZS4gQ3VycmVudGx5IHVzZSBzeXN0ZW0gbG9jYWwgZW5jb2RpbmcKKyAgICpvbmx5LgorICAgKiAgICAgICAgICBiRXhhY3QgICAgICAtICAgUG9pbnRlciB0byBhIGJvb2xlYW4gdmFsdWUgcmVjZWl2aW5nIHRoZSBpbmRpY2F0b3IKKyAgICp3aGV0aGVyIG1hcHBlciBmb3VuZCB0aGUgZXhhY3QgbWF0Y2guCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBtYXBwZXIgaXMgbm90IHN1cmUgd2hldGhlciBpdCdzIGV4YWN0IG1hdGNoLAorICAgKmlnbm9yZSB0aGlzIHBhcmFtdGVyLgorICAgKiBSZXR1cm4gVmFsdWU6CisgICAqICAgICAgICAgIEFuIG9wYXF1ZSBwb2ludGVyIGZvciBmb250IGhhbmRsZSwgb3IgTlVMTCBpZiBzeXN0ZW0gbWFwcGluZyBpcworICAgKm5vdCBzdXBwb3J0ZWQuCisgICAqKi8KKyAgdm9pZCogKCpNYXBGb250KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYWNlLAorICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCogYkV4YWN0KTsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogR2V0Rm9udAotICAgICAqICAgICAgICAgIEdldCBhIGhhbmRsZSB0byBhIHBhcnRpY3VsYXIgZm9udCBieSBpdHMgaW50ZXJuYWwgSUQKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgWWVzIG9ubHkgaWYgTWFwRm9udCBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgotICAgICAqIENvbW1lbnRzOgotICAgICAqICAgICAgICAgIElmIHRoZSBzeXN0ZW0gbWFwcGluZyBub3Qgc3VwcG9ydGVkLCBGb3hpdCBTREsgd2lsbCBkbyB0aGUgZm9udCBtYXBwaW5nIGFuZCB1c2UgdGhpcyBtZXRob2QgdG8gZ2V0IGEgZm9udCBoYW5kbGUuCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAgKiAgICAgICAgICBmYWNlICAgICAgICAtICAgVHlwZWZhY2UgbmFtZS4gQ3VycmVudGx5IHVzZSBzeXN0ZW0gbG9jYWwgZW5jb2Rpbmcgb25seS4KLSAgICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgICogICAgICAgICAgQW4gb3BhcXVlIHBvaW50ZXIgZm9yIGZvbnQgaGFuZGxlLgotICAgICAqKi8KLSAgICB2b2lkKiAoKkdldEZvbnQpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIGNvbnN0IGNoYXIqIGZhY2UpOworICAvKioKKyAgICogTWV0aG9kOiBHZXRGb250CisgICAqICAgICAgICAgIEdldCBhIGhhbmRsZSB0byBhIHBhcnRpY3VsYXIgZm9udCBieSBpdHMgaW50ZXJuYWwgSUQKKyAgICogSW50ZXJmYWNlIFZlcnNpb246CisgICAqICAgICAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgICAgIFllcyBvbmx5IGlmIE1hcEZvbnQgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICogQ29tbWVudHM6CisgICAqICAgICAgICAgIElmIHRoZSBzeXN0ZW0gbWFwcGluZyBub3Qgc3VwcG9ydGVkLCBGb3hpdCBTREsgd2lsbCBkbyB0aGUgZm9udAorICAgKm1hcHBpbmcgYW5kIHVzZSB0aGlzIG1ldGhvZCB0byBnZXQgYSBmb250IGhhbmRsZS4KKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqICAgICAgICAgIGZhY2UgICAgICAgIC0gICBUeXBlZmFjZSBuYW1lLiBDdXJyZW50bHkgdXNlIHN5c3RlbSBsb2NhbCBlbmNvZGluZworICAgKm9ubHkuCisgICAqIFJldHVybiBWYWx1ZToKKyAgICogICAgICAgICAgQW4gb3BhcXVlIHBvaW50ZXIgZm9yIGZvbnQgaGFuZGxlLgorICAgKiovCisgIHZvaWQqICgqR2V0Rm9udCkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgY29uc3QgY2hhciogZmFjZSk7CiAKLSAgICAvKioKLSAgICAgKiBNZXRob2Q6IEdldEZvbnREYXRhCi0gICAgICogICAgICAgICAgR2V0IGZvbnQgZGF0YSBmcm9tIGEgZm9udAotICAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICAqICAgICAgICAgIDEKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAgKiAgICAgICAgICBZZXMKLSAgICAgKiBDb21tZW50czoKLSAgICAgKiAgICAgICAgICBDYW4gcmVhZCBlaXRoZXIgZnVsbCBmb250IGZpbGUsIG9yIGEgcGFydGljdWxhciBUcnVlVHlwZS9PcGVuVHlwZSB0YWJsZQotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKLSAgICAgKiAgICAgICAgICB0YWJsZSAgICAgICAtICAgVHJ1ZVR5cGUvT3BlblR5cGUgdGFibGUgaWRlbnRpZmllciAocmVmZXIgdG8gVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbikuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIDAgZm9yIHRoZSB3aG9sZSBmb250IGZpbGUuCi0gICAgICogICAgICAgICAgYnVmZmVyICAgICAgLSAgIFRoZSBidWZmZXIgcmVjZWl2aW5nIHRoZSBmb250IGRhdGEuIENhbiBiZSBOVUxMIGlmIG5vdCBwcm92aWRlZAotICAgICAqICAgICAgICAgIGJ1Zl9zaXplICAgIC0gICBCdWZmZXIgc2l6ZSwgY2FuIGJlIHplcm8gaWYgbm90IHByb3ZpZGVkCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgICAgIE51bWJlciBvZiBieXRlcyBuZWVkZWQsIGlmIGJ1ZmZlciBub3QgcHJvdmlkZWQgb3Igbm90IGxhcmdlIGVub3VnaCwKLSAgICAgKiAgICAgICAgICBvciBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIGJ1ZmZlciBvdGhlcndpc2UuCi0gICAgICoqLwotICAgIHVuc2lnbmVkIGxvbmcgKCpHZXRGb250RGF0YSkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogaEZvbnQsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFibGUsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZfc2l6ZSk7CisgIC8qKgorICAgKiBNZXRob2Q6IEdldEZvbnREYXRhCisgICAqICAgICAgICAgIEdldCBmb250IGRhdGEgZnJvbSBhIGZvbnQKKyAgICogSW50ZXJmYWNlIFZlcnNpb246CisgICAqICAgICAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgICAgIFllcworICAgKiBDb21tZW50czoKKyAgICogICAgICAgICAgQ2FuIHJlYWQgZWl0aGVyIGZ1bGwgZm9udCBmaWxlLCBvciBhIHBhcnRpY3VsYXIgVHJ1ZVR5cGUvT3BlblR5cGUKKyAgICp0YWJsZQorICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKKyAgICogICAgICAgICAgdGFibGUgICAgICAgLSAgIFRydWVUeXBlL09wZW5UeXBlIHRhYmxlIGlkZW50aWZpZXIgKHJlZmVyIHRvCisgICAqVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbikuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAwIGZvciB0aGUgd2hvbGUgZm9udCBmaWxlLgorICAgKiAgICAgICAgICBidWZmZXIgICAgICAtICAgVGhlIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGZvbnQgZGF0YS4gQ2FuIGJlIE5VTEwgaWYKKyAgICpub3QgcHJvdmlkZWQKKyAgICogICAgICAgICAgYnVmX3NpemUgICAgLSAgIEJ1ZmZlciBzaXplLCBjYW4gYmUgemVybyBpZiBub3QgcHJvdmlkZWQKKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgbmVlZGVkLCBpZiBidWZmZXIgbm90IHByb3ZpZGVkIG9yIG5vdCBsYXJnZQorICAgKmVub3VnaCwKKyAgICogICAgICAgICAgb3IgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byBidWZmZXIgb3RoZXJ3aXNlLgorICAgKiovCisgIHVuc2lnbmVkIGxvbmcgKCpHZXRGb250RGF0YSkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBHZXRGYWNlTmFtZQotICAgICAqICAgICAgICAgIEdldCBmYWNlIG5hbWUgZnJvbSBhIGZvbnQgaGFuZGxlCi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgICAgIE5vCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAgKiAgICAgICAgICBoRm9udCAgICAgICAtICAgRm9udCBoYW5kbGUgcmV0dXJuZWQgYnkgTWFwRm9udCBvciBHZXRGb250IG1ldGhvZAotICAgICAqICAgICAgICAgIGJ1ZmZlciAgICAgIC0gICBUaGUgYnVmZmVyIHJlY2VpdmluZyB0aGUgZmFjZSBuYW1lLiBDYW4gYmUgTlVMTCBpZiBub3QgcHJvdmlkZWQKLSAgICAgKiAgICAgICAgICBidWZfc2l6ZSAgICAtICAgQnVmZmVyIHNpemUsIGNhbiBiZSB6ZXJvIGlmIG5vdCBwcm92aWRlZAotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgbmVlZGVkLCBpZiBidWZmZXIgbm90IHByb3ZpZGVkIG9yIG5vdCBsYXJnZSBlbm91Z2gsCi0gICAgICogICAgICAgICAgb3IgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byBidWZmZXIgb3RoZXJ3aXNlLgotICAgICAqKi8KLSAgICB1bnNpZ25lZCBsb25nICgqR2V0RmFjZU5hbWUpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250LCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpOworICAvKioKKyAgICogTWV0aG9kOiBHZXRGYWNlTmFtZQorICAgKiAgICAgICAgICBHZXQgZmFjZSBuYW1lIGZyb20gYSBmb250IGhhbmRsZQorICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgICogICAgICAgICAgMQorICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgICogICAgICAgICAgTm8KKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqICAgICAgICAgIGhGb250ICAgICAgIC0gICBGb250IGhhbmRsZSByZXR1cm5lZCBieSBNYXBGb250IG9yIEdldEZvbnQgbWV0aG9kCisgICAqICAgICAgICAgIGJ1ZmZlciAgICAgIC0gICBUaGUgYnVmZmVyIHJlY2VpdmluZyB0aGUgZmFjZSBuYW1lLiBDYW4gYmUgTlVMTCBpZgorICAgKm5vdCBwcm92aWRlZAorICAgKiAgICAgICAgICBidWZfc2l6ZSAgICAtICAgQnVmZmVyIHNpemUsIGNhbiBiZSB6ZXJvIGlmIG5vdCBwcm92aWRlZAorICAgKiBSZXR1cm4gVmFsdWU6CisgICAqICAgICAgICAgIE51bWJlciBvZiBieXRlcyBuZWVkZWQsIGlmIGJ1ZmZlciBub3QgcHJvdmlkZWQgb3Igbm90IGxhcmdlCisgICAqZW5vdWdoLAorICAgKiAgICAgICAgICBvciBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIGJ1ZmZlciBvdGhlcndpc2UuCisgICAqKi8KKyAgdW5zaWduZWQgbG9uZyAoKkdldEZhY2VOYW1lKShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGhGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zl9zaXplKTsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogR2V0Rm9udENoYXJzZXQKLSAgICAgKiAgICAgICAgICBHZXQgY2hhcmFjdGVyIHNldCBpbmZvcm1hdGlvbiBmb3IgYSBmb250IGhhbmRsZQotICAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICAqICAgICAgICAgIDEKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAgKiAgICAgICAgICBObwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKLSAgICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgICogICAgICAgICAgQ2hhcmFjdGVyIHNldCBpZGVudGlmaWVyLiBTZWUgZGVmaW5lZCBjb25zdGFudHMgYWJvdmUuCi0gICAgICoqLwotICAgIGludCAoKkdldEZvbnRDaGFyc2V0KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCk7CisgIC8qKgorICAgKiBNZXRob2Q6IEdldEZvbnRDaGFyc2V0CisgICAqICAgICAgICAgIEdldCBjaGFyYWN0ZXIgc2V0IGluZm9ybWF0aW9uIGZvciBhIGZvbnQgaGFuZGxlCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBObworICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBDaGFyYWN0ZXIgc2V0IGlkZW50aWZpZXIuIFNlZSBkZWZpbmVkIGNvbnN0YW50cyBhYm92ZS4KKyAgICoqLworICBpbnQgKCpHZXRGb250Q2hhcnNldCkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogaEZvbnQpOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBEZWxldGVGb250Ci0gICAgICogICAgICAgICAgRGVsZXRlIGEgZm9udCBoYW5kbGUKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgWWVzCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAgKiAgICAgICAgICBoRm9udCAgICAgICAtICAgRm9udCBoYW5kbGUgcmV0dXJuZWQgYnkgTWFwRm9udCBvciBHZXRGb250IG1ldGhvZAotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lCi0gICAgICoqLwotICAgIHZvaWQgKCpEZWxldGVGb250KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCk7CisgIC8qKgorICAgKiBNZXRob2Q6IERlbGV0ZUZvbnQKKyAgICogICAgICAgICAgRGVsZXRlIGEgZm9udCBoYW5kbGUKKyAgICogSW50ZXJmYWNlIFZlcnNpb246CisgICAqICAgICAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgICAgIFllcworICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBOb25lCisgICAqKi8KKyAgdm9pZCAoKkRlbGV0ZUZvbnQpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250KTsKIH0gRlBERl9TWVNGT05USU5GTzsKIAogLyoqCiAgKiBTdHJ1Y3Q6IEZQREZfQ2hhcnNldEZvbnRNYXAKICAqICAgIFByb3ZpZGVzIHRoZSBuYW1lIG9mIGEgZm9udCB0byB1c2UgZm9yIGEgZ2l2ZW4gY2hhcnNldCB2YWx1ZS4KICAqKi8KLXR5cGVkZWYgc3RydWN0IEZQREZfQ2hhcnNldEZvbnRNYXBfCi17Ci0gICAgaW50IGNoYXJzZXQ7ICAvLyBDaGFyYWN0ZXIgU2V0IEVudW0gdmFsdWUsIHNlZSBGWEZPTlRfKl9DSEFSU0VUIGFib3ZlLgotICAgIGNvbnN0IGNoYXIqIGZvbnRuYW1lOyAgLy8gTmFtZSBvZiBkZWZhdWx0IGZvbnQgdG8gdXNlIHdpdGggdGhhdCBjaGFyc2V0LgordHlwZWRlZiBzdHJ1Y3QgRlBERl9DaGFyc2V0Rm9udE1hcF8geworICBpbnQgY2hhcnNldDsgIC8vIENoYXJhY3RlciBTZXQgRW51bSB2YWx1ZSwgc2VlIEZYRk9OVF8qX0NIQVJTRVQgYWJvdmUuCisgIGNvbnN0IGNoYXIqIGZvbnRuYW1lOyAgLy8gTmFtZSBvZiBkZWZhdWx0IGZvbnQgdG8gdXNlIHdpdGggdGhhdCBjaGFyc2V0LgogfSBGUERGX0NoYXJzZXRGb250TWFwOwogCiAvKioKQEAgLTIxNyw3ICsyNDksOCBAQAogICogRnVuY3Rpb246IEZQREZfQWRkSW5zdGFsbGVkRm9udAogICogICAgICAgICAgQWRkIGEgc3lzdGVtIGZvbnQgdG8gdGhlIGxpc3QgaW4gRm94aXQgU0RLLgogICogQ29tbWVudHM6Ci0gKiAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGR1cmluZyB0aGUgc3lzdGVtIGZvbnQgbGlzdCBidWlsZGluZyBwcm9jZXNzLgorICogICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBkdXJpbmcgdGhlIHN5c3RlbSBmb250IGxpc3QgYnVpbGRpbmcKKyAqcHJvY2Vzcy4KICAqIFBhcmFtZXRlcnM6CiAgKiAgICAgICAgICBtYXBwZXIgICAgICAgICAgLSAgIE9wYXF1ZSBwb2ludGVyIHRvIEZveGl0IGZvbnQgbWFwcGVyCiAgKiAgICAgICAgICBmYWNlICAgICAgICAgICAgLSAgIFRoZSBmb250IGZhY2UgbmFtZQpAQCAtMjI1LDEzICsyNTgsMTYgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5vbmUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfQWRkSW5zdGFsbGVkRm9udCh2b2lkKiBtYXBwZXIsIGNvbnN0IGNoYXIqIGZhY2UsIGludCBjaGFyc2V0KTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9BZGRJbnN0YWxsZWRGb250KHZvaWQqIG1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCk7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZfU2V0U3lzdGVtRm9udEluZm8KICAqICAgICAgICAgIFNldCB0aGUgc3lzdGVtIGZvbnQgaW5mbyBpbnRlcmZhY2UgaW50byBGb3hpdCBTREsKICAqIENvbW1lbnRzOgotICogICAgICAgICAgUGxhdGZvcm0gc3VwcG9ydCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgaW1wbGVtZW50IHJlcXVpcmVkIG1ldGhvZHMgb2YgRkZERl9TWVNGT05USU5GTyBpbnRlcmZhY2UsCisgKiAgICAgICAgICBQbGF0Zm9ybSBzdXBwb3J0IGltcGxlbWVudGF0aW9uIHNob3VsZCBpbXBsZW1lbnQgcmVxdWlyZWQgbWV0aG9kcyBvZgorICpGRkRGX1NZU0ZPTlRJTkZPIGludGVyZmFjZSwKICAqICAgICAgICAgIHRoZW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGR1cmluZyBTREsgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4KICAqIFBhcmFtZXRlcnM6CiAgKiAgICAgICAgICBwRm9udEluZm8gICAgICAgLSAgIFBvaW50ZXIgdG8gYSBGUERGX1NZU0ZPTlRJTkZPIHN0cnVjdHVyZQpAQCAtMjQ0LDE0ICsyODAsMTggQEAKICAqIEZ1bmN0aW9uOiBGUERGX0dldERlZmF1bHRTeXN0ZW1Gb250SW5mbwogICogICAgICAgICAgR2V0IGRlZmF1bHQgc3lzdGVtIGZvbnQgaW5mbyBpbnRlcmZhY2UgZm9yIGN1cnJlbnQgcGxhdGZvcm0KICAqIENvbW1lbnRzOgotICogICAgICAgICAgRm9yIHNvbWUgcGxhdGZvcm1zIEZveGl0IFNESyBpbXBsZW1lbnQgYSBkZWZhdWx0IHZlcnNpb24gb2Ygc3lzdGVtIGZvbnQgaW5mbyBpbnRlcmZhY2UuCi0gKiAgICAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCBpbiBGUERGX1NldFN5c3RlbUZvbnRJbmZvIGZ1bmN0aW9uLgorICogICAgICAgICAgRm9yIHNvbWUgcGxhdGZvcm1zIEZveGl0IFNESyBpbXBsZW1lbnQgYSBkZWZhdWx0IHZlcnNpb24gb2Ygc3lzdGVtCisgKmZvbnQgaW5mbyBpbnRlcmZhY2UuCisgKiAgICAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCBpbiBGUERGX1NldFN5c3RlbUZvbnRJbmZvCisgKmZ1bmN0aW9uLgogICogUGFyYW1ldGVyczoKICAqICAgICAgICAgIE5vbmUKICAqIFJldHVybiBWYWx1ZToKLSAqICAgICAgICAgIFBvaW50ZXIgdG8gYSBGUERGX1NZU0ZPTlRJTkZPIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBkZWZhdWx0IGludGVyZmFjZS4KKyAqICAgICAgICAgIFBvaW50ZXIgdG8gYSBGUERGX1NZU0ZPTlRJTkZPIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBkZWZhdWx0CisgKmludGVyZmFjZS4KICAqICAgICAgICAgIE9yIE5VTEwgaWYgdGhlIHBsYXRmb3JtIGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQgaW50ZXJmYWNlLgotICogICAgICAgICAgQXBwbGljYXRpb24gc2hvdWxkIGNhbGwgRlBERl9GcmVlTWVtb3J5IHRvIGZyZWUgdGhlIHJldHVybmVkIHBvaW50ZXIuCisgKiAgICAgICAgICBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCBGUERGX0ZyZWVNZW1vcnkgdG8gZnJlZSB0aGUgcmV0dXJuZWQKKyAqcG9pbnRlci4KICAqKi8KIERMTEVYUE9SVCBGUERGX1NZU0ZPTlRJTkZPKiBTVERDQUxMIEZQREZfR2V0RGVmYXVsdFN5c3RlbUZvbnRJbmZvKCk7CiAKZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX3RleHQuaCBiL3B1YmxpYy9mcGRmX3RleHQuaAppbmRleCAzYzBhZmQyLi4zMDQ2YmIwIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl90ZXh0LmgKKysrIGIvcHVibGljL2ZwZGZfdGV4dC5oCkBAIC0xNywyMSArMTcsMjYgQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9Mb2FkUGFnZQogLy8gICAgICAgICAgUHJlcGFyZSBpbmZvcm1hdGlvbiBhYm91dCBhbGwgY2hhcmFjdGVycyBpbiBhIHBhZ2UuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uIChpbiBGUERGVklFVyBtb2R1bGUpLgorLy8gICAgICAgICAgcGFnZSAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uCisvLyAgICAgICAgICAoaW4gRlBERlZJRVcgbW9kdWxlKS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIEEgaGFuZGxlIHRvIHRoZSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgogLy8gICAgICAgICAgTlVMTCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgQXBwbGljYXRpb24gbXVzdCBjYWxsIEZQREZUZXh0X0Nsb3NlUGFnZSB0byByZWxlYXNlIHRoZSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24uCisvLyAgICAgICAgICBBcHBsaWNhdGlvbiBtdXN0IGNhbGwgRlBERlRleHRfQ2xvc2VQYWdlIHRvIHJlbGVhc2UgdGhlIHRleHQgcGFnZQorLy8gICAgICAgICAgaW5mb3JtYXRpb24uCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGxvYWQgb3V0IEZQREZfVEVYVFBBR0UgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGxvYWQgb3V0IEZQREZfVEVYVFBBR0UgZm9yIHRoZQorLy8gICAgICAgICAgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBmaWVsZHMuCiAvLwogRExMRVhQT1JUIEZQREZfVEVYVFBBR0UgU1REQ0FMTCBGUERGVGV4dF9Mb2FkUGFnZShGUERGX1BBR0UgcGFnZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9DbG9zZVBhZ2UKLS8vICAgICAgICAgIFJlbGVhc2UgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJlbGVhc2UgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uCisvLyAgICAgICAgICBzdHJ1Y3R1cmUuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLwpAQCAtNDAsMTMgKzQ1LDE3IEBACiAvLyBGdW5jdGlvbjogRlBERlRleHRfQ291bnRDaGFycwogLy8gICAgICAgICAgR2V0IG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHBhZ2UuIFJldHVybiAtMSBmb3IgZXJyb3IuCi0vLyAgICAgICAgICBHZW5lcmF0ZWQgY2hhcmFjdGVycywgbGlrZSBhZGRpdGlvbmFsIHNwYWNlIGNoYXJhY3RlcnMsIG5ldyBsaW5lIGNoYXJhY3RlcnMsIGFyZSBhbHNvIGNvdW50ZWQuCisvLyAgICAgICAgICBHZW5lcmF0ZWQgY2hhcmFjdGVycywgbGlrZSBhZGRpdGlvbmFsIHNwYWNlIGNoYXJhY3RlcnMsIG5ldyBsaW5lCisvLyAgICAgICAgICBjaGFyYWN0ZXJzLCBhcmUgYWxzbyBjb3VudGVkLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBDaGFyYWN0ZXJzIGluIGEgcGFnZSBmb3JtIGEgInN0cmVhbSIsIGluc2lkZSB0aGUgc3RyZWFtLCBlYWNoIGNoYXJhY3RlciBoYXMgYW4gaW5kZXguCi0vLyAgICAgICAgICBXZSB3aWxsIHVzZSB0aGUgaW5kZXggcGFyYW1ldGVycyBpbiBtYW55IG9mIEZQREZURVhUIGZ1bmN0aW9ucy4gVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgcGFnZQorLy8gICAgICAgICAgQ2hhcmFjdGVycyBpbiBhIHBhZ2UgZm9ybSBhICJzdHJlYW0iLCBpbnNpZGUgdGhlIHN0cmVhbSwgZWFjaAorLy8gICAgICAgICAgY2hhcmFjdGVyIGhhcyBhbiBpbmRleC4KKy8vICAgICAgICAgIFdlIHdpbGwgdXNlIHRoZSBpbmRleCBwYXJhbWV0ZXJzIGluIG1hbnkgb2YgRlBERlRFWFQgZnVuY3Rpb25zLiBUaGUKKy8vICAgICAgICAgIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgcGFnZQogLy8gICAgICAgICAgaGFzIGFuIGluZGV4IHZhbHVlIG9mIHplcm8uCiAvLwogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0NvdW50Q2hhcnMoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UpOwpAQCAtNTQsMTQ5ICs2MywyMTMgQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRVbmljb2RlCiAvLyAgICAgICAgICBHZXQgVW5pY29kZSBvZiBhIGNoYXJhY3RlciBpbiBhIHBhZ2UuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vICAgICAgICAgIGluZGV4ICAgICAgIC0gICBaZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgVW5pY29kZSBvZiB0aGUgcGFydGljdWxhciBjaGFyYWN0ZXIuCi0vLyAgICAgICAgICBJZiBhIGNoYXJhY3RlciBpcyBub3QgZW5jb2RlZCBpbiBVbmljb2RlIGFuZCBGb3hpdCBlbmdpbmUgY2FuJ3QgY29udmVydCB0byBVbmljb2RlLAorLy8gICAgICAgICAgSWYgYSBjaGFyYWN0ZXIgaXMgbm90IGVuY29kZWQgaW4gVW5pY29kZSBhbmQgRm94aXQgZW5naW5lIGNhbid0CisvLyAgICAgICAgICBjb252ZXJ0IHRvIFVuaWNvZGUsCiAvLyAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgemVyby4KIC8vCi1ETExFWFBPUlQgdW5zaWduZWQgaW50IFNURENBTEwgRlBERlRleHRfR2V0VW5pY29kZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IGluZGV4KTsKK0RMTEVYUE9SVCB1bnNpZ25lZCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRVbmljb2RlKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldEZvbnRTaXplCiAvLyAgICAgICAgICBHZXQgdGhlIGZvbnQgc2l6ZSBvZiBhIHBhcnRpY3VsYXIgY2hhcmFjdGVyLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCiAvLyAgICAgICAgICBpbmRleCAgICAgICAtICAgWmVyby1iYXNlZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIGZvbnQgc2l6ZSBvZiB0aGUgcGFydGljdWxhciBjaGFyYWN0ZXIsIG1lYXN1cmVkIGluIHBvaW50cyAoYWJvdXQgMS83MiBpbmNoKS4KKy8vICAgICAgICAgIFRoZSBmb250IHNpemUgb2YgdGhlIHBhcnRpY3VsYXIgY2hhcmFjdGVyLCBtZWFzdXJlZCBpbiBwb2ludHMgKGFib3V0CisvLyAgICAgICAgICAxLzcyIGluY2gpLgogLy8gICAgICAgICAgVGhpcyBpcyB0aGUgdHlwb2dyYXBoaWMgc2l6ZSBvZiB0aGUgZm9udCAoc28gY2FsbGVkICJlbSBzaXplIikuCiAvLwotRExMRVhQT1JUIGRvdWJsZSBTVERDQUxMIEZQREZUZXh0X0dldEZvbnRTaXplKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLCBpbnQgaW5kZXgpOworRExMRVhQT1JUIGRvdWJsZSBTVERDQUxMIEZQREZUZXh0X0dldEZvbnRTaXplKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRDaGFyQm94CiAvLyAgICAgICAgICBHZXQgYm91bmRpbmcgYm94IG9mIGEgcGFydGljdWxhciBjaGFyYWN0ZXIuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vICAgICAgICAgIGluZGV4ICAgICAgIC0gICBaZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIuCi0vLyAgICAgICAgICBsZWZ0ICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSBudW1iZXIgcmVjZWl2aW5nIGxlZnQgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciBib3guCi0vLyAgICAgICAgICByaWdodCAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSBudW1iZXIgcmVjZWl2aW5nIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgYm94LgotLy8gICAgICAgICAgYm90dG9tICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgbnVtYmVyIHJlY2VpdmluZyBib3R0b20gcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciBib3guCi0vLyAgICAgICAgICB0b3AgICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSBudW1iZXIgcmVjZWl2aW5nIHRvcCBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGJveC4KKy8vICAgICAgICAgIGxlZnQgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIG51bWJlciByZWNlaXZpbmcgbGVmdCBwb3NpdGlvbgorLy8gICAgICAgICAgb2YgdGhlIGNoYXJhY3RlciBib3guCisvLyAgICAgICAgICByaWdodCAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSBudW1iZXIgcmVjZWl2aW5nIHJpZ2h0IHBvc2l0aW9uCisvLyAgICAgICAgICBvZiB0aGUgY2hhcmFjdGVyIGJveC4KKy8vICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIG51bWJlciByZWNlaXZpbmcgYm90dG9tIHBvc2l0aW9uCisvLyAgICAgICAgICBvZiB0aGUgY2hhcmFjdGVyIGJveC4KKy8vICAgICAgICAgIHRvcCAgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIG51bWJlciByZWNlaXZpbmcgdG9wIHBvc2l0aW9uIG9mCisvLyAgICAgICAgICB0aGUgY2hhcmFjdGVyIGJveC4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIEFsbCBwb3NpdGlvbnMgYXJlIG1lYXN1cmVkIGluIFBERiAidXNlciBzcGFjZSIuCiAvLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRDaGFyQm94KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLCBpbnQgaW5kZXgsIGRvdWJsZSogbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LCBkb3VibGUqIGJvdHRvbSwgZG91YmxlKiB0b3ApOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRDaGFyQm94KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcwotLy8gICAgICAgICAgR2V0IHRoZSBpbmRleCBvZiBhIGNoYXJhY3RlciBhdCBvciBuZWFyYnkgYSBjZXJ0YWluIHBvc2l0aW9uIG9uIHRoZSBwYWdlLgorLy8gICAgICAgICAgR2V0IHRoZSBpbmRleCBvZiBhIGNoYXJhY3RlciBhdCBvciBuZWFyYnkgYSBjZXJ0YWluIHBvc2l0aW9uIG9uIHRoZQorLy8gICAgICAgICAgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gICAgICAgICAgeCAgICAgICAgICAgLSAgIFggcG9zaXRpb24gaW4gUERGICJ1c2VyIHNwYWNlIi4KIC8vICAgICAgICAgIHkgICAgICAgICAgIC0gICBZIHBvc2l0aW9uIGluIFBERiAidXNlciBzcGFjZSIuCi0vLyAgICAgICAgICB4VG9sZXJhbmNlICAtICAgQW4geC1heGlzIHRvbGVyYW5jZSB2YWx1ZSBmb3IgY2hhcmFjdGVyIGhpdCBkZXRlY3Rpb24sIGluIHBvaW50IHVuaXQuCi0vLyAgICAgICAgICB5VG9sZXJhbmNlICAtICAgQSB5LWF4aXMgdG9sZXJhbmNlIHZhbHVlIGZvciBjaGFyYWN0ZXIgaGl0IGRldGVjdGlvbiwgaW4gcG9pbnQgdW5pdC4KKy8vICAgICAgICAgIHhUb2xlcmFuY2UgIC0gICBBbiB4LWF4aXMgdG9sZXJhbmNlIHZhbHVlIGZvciBjaGFyYWN0ZXIgaGl0CisvLyAgICAgICAgICBkZXRlY3Rpb24sIGluIHBvaW50IHVuaXQuCisvLyAgICAgICAgICB5VG9sZXJhbmNlICAtICAgQSB5LWF4aXMgdG9sZXJhbmNlIHZhbHVlIGZvciBjaGFyYWN0ZXIgaGl0CisvLyAgICAgICAgICBkZXRlY3Rpb24sIGluIHBvaW50IHVuaXQuCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBUaGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGF0LCBvciBuZWFyYnkgdGhlIHBvaW50ICh4LHkpLgotLy8gICAgICAgICAgSWYgdGhlcmUgaXMgbm8gY2hhcmFjdGVyIGF0IG9yIG5lYXJieSB0aGUgcG9pbnQsIHJldHVybiB2YWx1ZSB3aWxsIGJlIC0xLgorLy8gICAgICAgICAgSWYgdGhlcmUgaXMgbm8gY2hhcmFjdGVyIGF0IG9yIG5lYXJieSB0aGUgcG9pbnQsIHJldHVybiB2YWx1ZSB3aWxsCisvLyAgICAgICAgICBiZSAtMS4KIC8vICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycywgLTMgd2lsbCBiZSByZXR1cm5lZC4KIC8vCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3MoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeFRvcmVsYW5jZSwgZG91YmxlIHlUb2xlcmFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4VG9yZWxhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5VG9sZXJhbmNlKTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldFRleHQKIC8vICAgICAgICAgIEV4dHJhY3QgdW5pY29kZSB0ZXh0IHN0cmluZyBmcm9tIHRoZSBwYWdlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCiAvLyAgICAgICAgICBzdGFydF9pbmRleCAtICAgSW5kZXggZm9yIHRoZSBzdGFydCBjaGFyYWN0ZXJzLgogLy8gICAgICAgICAgY291bnQgICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIGV4dHJhY3RlZC4KLS8vICAgICAgICAgIHJlc3VsdCAgICAgIC0gICBBIGJ1ZmZlciAoYWxsb2NhdGVkIGJ5IGFwcGxpY2F0aW9uKSByZWNlaXZpbmcgdGhlIGV4dHJhY3RlZCB1bmljb2Rlcy4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIG11c3QgYmUgYWJsZSB0byBob2xkIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwbHVzIGEgdGVybWluYXRvci4KKy8vICAgICAgICAgIHJlc3VsdCAgICAgIC0gICBBIGJ1ZmZlciAoYWxsb2NhdGVkIGJ5IGFwcGxpY2F0aW9uKSByZWNlaXZpbmcgdGhlCisvLyAgICAgICAgICBleHRyYWN0ZWQgdW5pY29kZXMuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIGFibGUgdG8gaG9sZCB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgY2hhcmFjdGVycyBwbHVzIGEgdGVybWluYXRvci4KIC8vIFJldHVybiBWYWx1ZToKLS8vICAgICAgICAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gaW50byB0aGUgcmVzdWx0IGJ1ZmZlciwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyB0ZXJtaW5hdG9yLgorLy8gICAgICAgICAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiBpbnRvIHRoZSByZXN1bHQgYnVmZmVyLCBpbmNsdWRpbmcgdGhlCisvLyAgICAgICAgICB0cmFpbGluZyB0ZXJtaW5hdG9yLgogLy8gQ29tbWVudHM6CiAvLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlnbm9yZXMgY2hhcmFjdGVycyB3aXRob3V0IHVuaWNvZGUgaW5mb3JtYXRpb24uCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0dldFRleHQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIGludCBzdGFydF9pbmRleCwgaW50IGNvdW50LCB1bnNpZ25lZCBzaG9ydCogcmVzdWx0KTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRUZXh0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIHJlc3VsdCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9Db3VudFJlY3RzCiAvLyAgICAgICAgICBDb3VudCBudW1iZXIgb2YgcmVjdGFuZ3VsYXIgYXJlYXMgb2NjdXBpZWQgYnkgYSBzZWdtZW50IG9mIHRleHRzLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCiAvLyAgICAgICAgICBzdGFydF9pbmRleCAtICAgSW5kZXggZm9yIHRoZSBzdGFydCBjaGFyYWN0ZXJzLgogLy8gICAgICAgICAgY291bnQgICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTnVtYmVyIG9mIHJlY3RhbmdsZXMuIFplcm8gZm9yIGVycm9yLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uLCBhbG9uZyB3aXRoIEZQREZUZXh0X0dldFJlY3QgY2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIHRvIGRldGVjdCB0aGUgcG9zaXRpb24KLS8vICAgICAgICAgIG9uIHRoZSBwYWdlIGZvciBhIHRleHQgc2VnbWVudCwgc28gcHJvcGVyIGFyZWFzIGNhbiBiZSBoaWdobGlnaHRlZCBvciBzb21ldGhpbmcuCi0vLyAgICAgICAgICBGUERGVEVYVCB3aWxsIGF1dG9tYXRpY2FsbHkgbWVyZ2Ugc21hbGwgY2hhcmFjdGVyIGJveGVzIGludG8gYmlnZ2VyIG9uZSBpZiB0aG9zZSBjaGFyYWN0ZXJzCisvLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uLCBhbG9uZyB3aXRoIEZQREZUZXh0X0dldFJlY3QgY2FuIGJlIHVzZWQgYnkKKy8vICAgICAgICAgIGFwcGxpY2F0aW9ucyB0byBkZXRlY3QgdGhlIHBvc2l0aW9uCisvLyAgICAgICAgICBvbiB0aGUgcGFnZSBmb3IgYSB0ZXh0IHNlZ21lbnQsIHNvIHByb3BlciBhcmVhcyBjYW4gYmUgaGlnaGxpZ2h0ZWQKKy8vICAgICAgICAgIG9yIHNvbWV0aGluZy4KKy8vICAgICAgICAgIEZQREZURVhUIHdpbGwgYXV0b21hdGljYWxseSBtZXJnZSBzbWFsbCBjaGFyYWN0ZXIgYm94ZXMgaW50byBiaWdnZXIKKy8vICAgICAgICAgIG9uZSBpZiB0aG9zZSBjaGFyYWN0ZXJzCiAvLyAgICAgICAgICBhcmUgb24gdGhlIHNhbWUgbGluZSBhbmQgdXNlIHNhbWUgZm9udCBzZXR0aW5ncy4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfQ291bnRSZWN0cyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IHN0YXJ0X2luZGV4LCBpbnQgY291bnQpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0NvdW50UmVjdHMoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0UmVjdAotLy8gICAgICAgICAgR2V0IGEgcmVjdGFuZ3VsYXIgYXJlYSBmcm9tIHRoZSByZXN1bHQgZ2VuZXJhdGVkIGJ5IEZQREZUZXh0X0NvdW50UmVjdHMuCisvLyAgICAgICAgICBHZXQgYSByZWN0YW5ndWxhciBhcmVhIGZyb20gdGhlIHJlc3VsdCBnZW5lcmF0ZWQgYnkKKy8vICAgICAgICAgIEZQREZUZXh0X0NvdW50UmVjdHMuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vICAgICAgICAgIHJlY3RfaW5kZXggIC0gICBaZXJvLWJhc2VkIGluZGV4IGZvciB0aGUgcmVjdGFuZ2xlLgotLy8gICAgICAgICAgbGVmdCAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUgbGVmdCBib3VuZGFyeS4KLS8vICAgICAgICAgIHRvcCAgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlIHRvcCBib3VuZGFyeS4KLS8vICAgICAgICAgIHJpZ2h0ICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlIHJpZ2h0IGJvdW5kYXJ5LgotLy8gICAgICAgICAgYm90dG9tICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUgYm90dG9tIGJvdW5kYXJ5LgorLy8gICAgICAgICAgbGVmdCAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUKKy8vICAgICAgICAgIGxlZnQgYm91bmRhcnkuCisvLyAgICAgICAgICB0b3AgICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZQorLy8gICAgICAgICAgdG9wIGJvdW5kYXJ5LgorLy8gICAgICAgICAgcmlnaHQgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUKKy8vICAgICAgICAgIHJpZ2h0IGJvdW5kYXJ5LgorLy8gICAgICAgICAgYm90dG9tICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUKKy8vICAgICAgICAgIGJvdHRvbSBib3VuZGFyeS4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRSZWN0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLCBpbnQgcmVjdF9pbmRleCwgZG91YmxlKiBsZWZ0LCBkb3VibGUqIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwgZG91YmxlKiBib3R0b20pOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRSZWN0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tKTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldEJvdW5kZWRUZXh0CiAvLyAgICAgICAgICBFeHRyYWN0IHVuaWNvZGUgdGV4dCB3aXRoaW4gYSByZWN0YW5ndWxhciBib3VuZGFyeSBvbiB0aGUgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gICAgICAgICAgbGVmdCAgICAgICAgLSAgIExlZnQgYm91bmRhcnkuCiAvLyAgICAgICAgICB0b3AgICAgICAgICAtICAgVG9wIGJvdW5kYXJ5LgogLy8gICAgICAgICAgcmlnaHQgICAgICAgLSAgIFJpZ2h0IGJvdW5kYXJ5LgogLy8gICAgICAgICAgYm90dG9tICAgICAgLSAgIEJvdHRvbSBib3VuZGFyeS4KIC8vICAgICAgICAgIGJ1ZmZlciAgICAgIC0gICBBIHVuaWNvZGUgYnVmZmVyLgotLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpIGZvciB0aGUgYnVmZmVyLCBleGNsdWRpbmcgYW4gYWRkaXRpb25hbCB0ZXJtaW5hdG9yLgorLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpIGZvciB0aGUgYnVmZmVyLAorLy8gICAgICAgICAgZXhjbHVkaW5nIGFuIGFkZGl0aW9uYWwgdGVybWluYXRvci4KIC8vIFJldHVybiBWYWx1ZToKLS8vICAgICAgICAgIElmIGJ1ZmZlciBpcyBOVUxMIG9yIGJ1ZmxlbiBpcyB6ZXJvLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgKG5vdCBieXRlcykgb2YgdGV4dCBwcmVzZW50IHdpdGhpbgotLy8gICAgICAgICAgdGhlIHJlY3RhbmdsZSwgZXhjbHVkaW5nIGEgdGVybWluYXRpbmcgTlVMLiAgR2VuZXJhbGx5IHlvdSBzaG91bGQgcGFzcyBhIGJ1ZmZlciBhdCBsZWFzdCBvbmUgbGFyZ2VyCi0vLyAgICAgICAgICB0aGFuIHRoaXMgaWYgeW91IHdhbnQgYSB0ZXJtaW5hdGluZyBOVUwsIHdoaWNoIHdpbGwgYmUgcHJvdmlkZWQgaWYgc3BhY2UgaXMgYXZhaWxhYmxlLgotLy8gICAgICAgICAgT3RoZXJ3aXNlLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIGludG8gdGhlIGJ1ZmZlciwgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBOVUwKKy8vICAgICAgICAgIElmIGJ1ZmZlciBpcyBOVUxMIG9yIGJ1ZmxlbiBpcyB6ZXJvLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMKKy8vICAgICAgICAgIChub3QgYnl0ZXMpIG9mIHRleHQgcHJlc2VudCB3aXRoaW4KKy8vICAgICAgICAgIHRoZSByZWN0YW5nbGUsIGV4Y2x1ZGluZyBhIHRlcm1pbmF0aW5nIE5VTC4gIEdlbmVyYWxseSB5b3Ugc2hvdWxkCisvLyAgICAgICAgICBwYXNzIGEgYnVmZmVyIGF0IGxlYXN0IG9uZSBsYXJnZXIKKy8vICAgICAgICAgIHRoYW4gdGhpcyBpZiB5b3Ugd2FudCBhIHRlcm1pbmF0aW5nIE5VTCwgd2hpY2ggd2lsbCBiZSBwcm92aWRlZCBpZgorLy8gICAgICAgICAgc3BhY2UgaXMgYXZhaWxhYmxlLgorLy8gICAgICAgICAgT3RoZXJ3aXNlLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIGludG8gdGhlIGJ1ZmZlciwKKy8vICAgICAgICAgIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMCiAvLyAgICAgICAgICB3aGVuIHNwYWNlIGZvciBpdCBpcyBhdmFpbGFibGUuCiAvLyBDb21tZW50OgotLy8gICAgICAgICAgSWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwsIGFzIG11Y2ggdGV4dCBhcyB3aWxsIGZpdCBpcyBjb3BpZWQgaW50byBpdC4KKy8vICAgICAgICAgIElmIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLCBhcyBtdWNoIHRleHQgYXMgd2lsbCBmaXQgaXMgY29waWVkIGludG8KKy8vICAgICAgICAgIGl0LgogLy8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRCb3VuZGVkVGV4dChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSxkb3VibGUgbGVmdCwgZG91YmxlIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20sdW5zaWduZWQgc2hvcnQqIGJ1ZmZlcixpbnQgYnVmbGVuKTsKLQorRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0dldEJvdW5kZWRUZXh0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmbGVuKTsKIAogLy8gRmxhZ3MgdXNlZCBieSBGUERGVGV4dF9GaW5kU3RhcnQgZnVuY3Rpb24uCi0jZGVmaW5lIEZQREZfTUFUQ0hDQVNFICAgICAgMHgwMDAwMDAwMSAgICAgIC8vSWYgbm90IHNldCwgaXQgd2lsbCBub3QgbWF0Y2ggY2FzZSBieSBkZWZhdWx0LgotI2RlZmluZSBGUERGX01BVENIV0hPTEVXT1JEIDB4MDAwMDAwMDIgICAgICAvL0lmIG5vdCBzZXQsIGl0IHdpbGwgbm90IG1hdGNoIHRoZSB3aG9sZSB3b3JkIGJ5IGRlZmF1bHQuCisjZGVmaW5lIEZQREZfTUFUQ0hDQVNFIFwKKyAgMHgwMDAwMDAwMSAgLy8gSWYgbm90IHNldCwgaXQgd2lsbCBub3QgbWF0Y2ggY2FzZSBieSBkZWZhdWx0LgorI2RlZmluZSBGUERGX01BVENIV0hPTEVXT1JEIFwKKyAgMHgwMDAwMDAwMiAgLy8gSWYgbm90IHNldCwgaXQgd2lsbCBub3QgbWF0Y2ggdGhlIHdob2xlIHdvcmQgYnkgZGVmYXVsdC4KIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0ZpbmRTdGFydAogLy8gICAgICAgICAgU3RhcnQgYSBzZWFyY2guCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vICAgICAgICAgIGZpbmR3aGF0ICAgIC0gICBBIHVuaWNvZGUgbWF0Y2ggcGF0dGVybi4KIC8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICBPcHRpb24gZmxhZ3MuCiAvLyAgICAgICAgICBzdGFydF9pbmRleCAtICAgU3RhcnQgZnJvbSB0aGlzIGNoYXJhY3Rlci4gLTEgZm9yIGVuZCBvZiB0aGUgcGFnZS4KIC8vIFJldHVybiBWYWx1ZToKLS8vICAgICAgICAgIEEgaGFuZGxlIGZvciB0aGUgc2VhcmNoIGNvbnRleHQuIEZQREZUZXh0X0ZpbmRDbG9zZSBtdXN0IGJlIGNhbGxlZCB0byByZWxlYXNlIHRoaXMgaGFuZGxlLgorLy8gICAgICAgICAgQSBoYW5kbGUgZm9yIHRoZSBzZWFyY2ggY29udGV4dC4gRlBERlRleHRfRmluZENsb3NlIG11c3QgYmUgY2FsbGVkCisvLyAgICAgICAgICB0byByZWxlYXNlIHRoaXMgaGFuZGxlLgogLy8KLURMTEVYUE9SVCBGUERGX1NDSEhBTkRMRSBTVERDQUxMIEZQREZUZXh0X0ZpbmRTdGFydChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgRlBERl9XSURFU1RSSU5HIGZpbmR3aGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBzdGFydF9pbmRleCk7CitETExFWFBPUlQgRlBERl9TQ0hIQU5ETEUgU1REQ0FMTCBGUERGVGV4dF9GaW5kU3RhcnQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIGZpbmR3aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2luZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0ZpbmROZXh0CiAvLyAgICAgICAgICBTZWFyY2ggaW4gdGhlIGRpcmVjdGlvbiBmcm9tIHBhZ2Ugc3RhcnQgdG8gZW5kLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGhhbmRsZSAgICAgIC0gICBBIHNlYXJjaCBjb250ZXh0IGhhbmRsZSByZXR1cm5lZCBieSBGUERGVGV4dF9GaW5kU3RhcnQuCisvLyAgICAgICAgICBoYW5kbGUgICAgICAtICAgQSBzZWFyY2ggY29udGV4dCBoYW5kbGUgcmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZUZXh0X0ZpbmRTdGFydC4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIFdoZXRoZXIgYSBtYXRjaCBpcyBmb3VuZC4KIC8vCkBAIC0yMDUsNyArMjc4LDggQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9GaW5kUHJldgogLy8gICAgICAgICAgU2VhcmNoIGluIHRoZSBkaXJlY3Rpb24gZnJvbSBwYWdlIGVuZCB0byBzdGFydC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBoYW5kbGUgICAgICAtICAgQSBzZWFyY2ggY29udGV4dCBoYW5kbGUgcmV0dXJuZWQgYnkgRlBERlRleHRfRmluZFN0YXJ0LgorLy8gICAgICAgICAgaGFuZGxlICAgICAgLSAgIEEgc2VhcmNoIGNvbnRleHQgaGFuZGxlIHJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGVGV4dF9GaW5kU3RhcnQuCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBXaGV0aGVyIGEgbWF0Y2ggaXMgZm91bmQuCiAvLwpAQCAtMjE0LDcgKzI4OCw4IEBACiAvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0U2NoUmVzdWx0SW5kZXgKIC8vICAgICAgICAgIEdldCB0aGUgc3RhcnRpbmcgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBzZWFyY2ggcmVzdWx0LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGhhbmRsZSAgICAgIC0gICBBIHNlYXJjaCBjb250ZXh0IGhhbmRsZSByZXR1cm5lZCBieSBGUERGVGV4dF9GaW5kU3RhcnQuCisvLyAgICAgICAgICBoYW5kbGUgICAgICAtICAgQSBzZWFyY2ggY29udGV4dCBoYW5kbGUgcmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZUZXh0X0ZpbmRTdGFydC4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIEluZGV4IGZvciB0aGUgc3RhcnRpbmcgY2hhcmFjdGVyLgogLy8KQEAgLTIyMyw3ICsyOTgsOCBAQAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldFNjaENvdW50CiAvLyAgICAgICAgICBHZXQgdGhlIG51bWJlciBvZiBtYXRjaGVkIGNoYXJhY3RlcnMgaW4gdGhlIHNlYXJjaCByZXN1bHQuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgaGFuZGxlICAgICAgLSAgIEEgc2VhcmNoIGNvbnRleHQgaGFuZGxlIHJldHVybmVkIGJ5IEZQREZUZXh0X0ZpbmRTdGFydC4KKy8vICAgICAgICAgIGhhbmRsZSAgICAgIC0gICBBIHNlYXJjaCBjb250ZXh0IGhhbmRsZSByZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERlRleHRfRmluZFN0YXJ0LgogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgTnVtYmVyIG9mIG1hdGNoZWQgY2hhcmFjdGVycy4KIC8vCkBAIC0yMzIsNyArMzA4LDggQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9GaW5kQ2xvc2UKIC8vICAgICAgICAgIFJlbGVhc2UgYSBzZWFyY2ggY29udGV4dC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBoYW5kbGUgICAgICAtICAgQSBzZWFyY2ggY29udGV4dCBoYW5kbGUgcmV0dXJuZWQgYnkgRlBERlRleHRfRmluZFN0YXJ0LgorLy8gICAgICAgICAgaGFuZGxlICAgICAgLSAgIEEgc2VhcmNoIGNvbnRleHQgaGFuZGxlIHJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGVGV4dF9GaW5kU3RhcnQuCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8KQEAgLTI0MSwxNiArMzE4LDIyIEBACiAvLyBGdW5jdGlvbjogRlBERkxpbmtfTG9hZFdlYkxpbmtzCiAvLyAgICAgICAgICBQcmVwYXJlIGluZm9ybWF0aW9uIGFib3V0IHdlYmxpbmtzIGluIGEgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgQSBoYW5kbGUgdG8gdGhlIHBhZ2UncyBsaW5rcyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCiAvLyAgICAgICAgICBOVUxMIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBXZWJsaW5rcyBhcmUgdGhvc2UgbGlua3MgaW1wbGljaXRseSBlbWJlZGRlZCBpbiBQREYgcGFnZXMuIFBERiBhbHNvIGhhcyBhIHR5cGUgb2YKLS8vICAgICAgICAgIGFubm90YXRpb24gY2FsbGVkICJsaW5rIiwgRlBERlRFWFQgZG9lc24ndCBkZWFsIHdpdGggdGhhdCBraW5kIG9mIGxpbmsuCi0vLyAgICAgICAgICBGUERGVEVYVCB3ZWJsaW5rIGZlYXR1cmUgaXMgdXNlZnVsIGZvciBhdXRvbWF0aWNhbGx5IGRldGVjdGluZyBsaW5rcyBpbiB0aGUgcGFnZQotLy8gICAgICAgICAgY29udGVudHMuIEZvciBleGFtcGxlLCB0aGluZ3MgbGlrZSAiaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbSIgd2lsbCBiZSBkZXRlY3RlZCwKLS8vICAgICAgICAgIHNvIGFwcGxpY2F0aW9ucyBjYW4gYWxsb3cgdXNlciB0byBjbGljayBvbiB0aG9zZSBjaGFyYWN0ZXJzIHRvIGFjdGl2YXRlIHRoZSBsaW5rLAorLy8gICAgICAgICAgV2VibGlua3MgYXJlIHRob3NlIGxpbmtzIGltcGxpY2l0bHkgZW1iZWRkZWQgaW4gUERGIHBhZ2VzLiBQREYgYWxzbworLy8gICAgICAgICAgaGFzIGEgdHlwZSBvZgorLy8gICAgICAgICAgYW5ub3RhdGlvbiBjYWxsZWQgImxpbmsiLCBGUERGVEVYVCBkb2Vzbid0IGRlYWwgd2l0aCB0aGF0IGtpbmQgb2YKKy8vICAgICAgICAgIGxpbmsuCisvLyAgICAgICAgICBGUERGVEVYVCB3ZWJsaW5rIGZlYXR1cmUgaXMgdXNlZnVsIGZvciBhdXRvbWF0aWNhbGx5IGRldGVjdGluZyBsaW5rcworLy8gICAgICAgICAgaW4gdGhlIHBhZ2UKKy8vICAgICAgICAgIGNvbnRlbnRzLiBGb3IgZXhhbXBsZSwgdGhpbmdzIGxpa2UgImh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20iCisvLyAgICAgICAgICB3aWxsIGJlIGRldGVjdGVkLAorLy8gICAgICAgICAgc28gYXBwbGljYXRpb25zIGNhbiBhbGxvdyB1c2VyIHRvIGNsaWNrIG9uIHRob3NlIGNoYXJhY3RlcnMgdG8KKy8vICAgICAgICAgIGFjdGl2YXRlIHRoZSBsaW5rLAogLy8gICAgICAgICAgZXZlbiB0aGUgUERGIGRvZXNuJ3QgY29tZSB3aXRoIGxpbmsgYW5ub3RhdGlvbnMuCiAvLwogLy8gICAgICAgICAgRlBERkxpbmtfQ2xvc2VXZWJMaW5rcyBtdXN0IGJlIGNhbGxlZCB0byByZWxlYXNlIHJlc291cmNlcy4KQEAgLTI3MiwxMiArMzU1LDE3IEBACiAvLyAgICAgICAgICBsaW5rX3BhZ2UgICAtICAgSGFuZGxlIHJldHVybmVkIGJ5IEZQREZMaW5rX0xvYWRXZWJMaW5rcy4KIC8vICAgICAgICAgIGxpbmtfaW5kZXggIC0gICBaZXJvLWJhc2VkIGluZGV4IGZvciB0aGUgbGluay4KIC8vICAgICAgICAgIGJ1ZmZlciAgICAgIC0gICBBIHVuaWNvZGUgYnVmZmVyLgotLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpIGZvciB0aGUgYnVmZmVyLCBpbmNsdWRpbmcgYW4gYWRkaXRpb25hbCB0ZXJtaW5hdG9yLgorLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpIGZvciB0aGUgYnVmZmVyLAorLy8gICAgICAgICAgaW5jbHVkaW5nIGFuIGFkZGl0aW9uYWwgdGVybWluYXRvci4KIC8vIFJldHVybiBWYWx1ZToKLS8vICAgICAgICAgIElmIGJ1ZmZlciBpcyBOVUxMIG9yIGJ1ZmxlbiBpcyB6ZXJvLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgKG5vdCBieXRlcyBhbmQgYW4gYWRkaXRpb25hbCB0ZXJtaW5hdG9yIGlzIGFsc28gY291bnRlZCkgbmVlZGVkLAorLy8gICAgICAgICAgSWYgYnVmZmVyIGlzIE5VTEwgb3IgYnVmbGVuIGlzIHplcm8sIHJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycworLy8gICAgICAgICAgKG5vdCBieXRlcyBhbmQgYW4gYWRkaXRpb25hbCB0ZXJtaW5hdG9yIGlzIGFsc28gY291bnRlZCkgbmVlZGVkLAogLy8gICAgICAgICAgb3RoZXJ3aXNlLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIGludG8gdGhlIGJ1ZmZlci4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfR2V0VVJMKEZQREZfUEFHRUxJTksgbGlua19wYWdlLCBpbnQgbGlua19pbmRleCwgdW5zaWduZWQgc2hvcnQqIGJ1ZmZlcixpbnQgYnVmbGVuKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19HZXRVUkwoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmbGVuKTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0NvdW50UmVjdHMKIC8vICAgICAgICAgIENvdW50IG51bWJlciBvZiByZWN0YW5ndWxhciBhcmVhcyBmb3IgdGhlIGxpbmsuCkBAIC0yODcsNyArMzc1LDggQEAKIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIE51bWJlciBvZiByZWN0YW5ndWxhciBhcmVhcyBmb3IgdGhlIGxpbmsuCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50UmVjdHMoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsIGludCBsaW5rX2luZGV4KTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19Db3VudFJlY3RzKEZQREZfUEFHRUxJTksgbGlua19wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmtfaW5kZXgpOwogCiAvLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0UmVjdAogLy8gICAgICAgICAgRmV0Y2ggdGhlIGJvdW5kYXJpZXMgb2YgYSByZWN0YW5nbGUgZm9yIGEgbGluay4KQEAgLTI5NSwxNSArMzg0LDI0IEBACiAvLyAgICAgICAgICBsaW5rX3BhZ2UgICAtICAgSGFuZGxlIHJldHVybmVkIGJ5IEZQREZMaW5rX0xvYWRXZWJMaW5rcy4KIC8vICAgICAgICAgIGxpbmtfaW5kZXggIC0gICBaZXJvLWJhc2VkIGluZGV4IGZvciB0aGUgbGluay4KIC8vICAgICAgICAgIHJlY3RfaW5kZXggIC0gICBaZXJvLWJhc2VkIGluZGV4IGZvciBhIHJlY3RhbmdsZS4KLS8vICAgICAgICAgIGxlZnQgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlIGxlZnQgYm91bmRhcnkuCi0vLyAgICAgICAgICB0b3AgICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZSB0b3AgYm91bmRhcnkuCi0vLyAgICAgICAgICByaWdodCAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZSByaWdodCBib3VuZGFyeS4KLS8vICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlIGJvdHRvbSBib3VuZGFyeS4KKy8vICAgICAgICAgIGxlZnQgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlCisvLyAgICAgICAgICBsZWZ0IGJvdW5kYXJ5LgorLy8gICAgICAgICAgdG9wICAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUKKy8vICAgICAgICAgIHRvcCBib3VuZGFyeS4KKy8vICAgICAgICAgIHJpZ2h0ICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlCisvLyAgICAgICAgICByaWdodCBib3VuZGFyeS4KKy8vICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlCisvLyAgICAgICAgICBib3R0b20gYm91bmRhcnkuCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkxpbmtfR2V0UmVjdChGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwgaW50IGxpbmtfaW5kZXgsIGludCByZWN0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwgZG91YmxlKiB0b3AsZG91YmxlKiByaWdodCwgZG91YmxlKiBib3R0b20pOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGTGlua19HZXRSZWN0KEZQREZfUEFHRUxJTksgbGlua19wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tKTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0Nsb3NlV2ViTGlua3MKIC8vICAgICAgICAgIFJlbGVhc2UgcmVzb3VyY2VzIHVzZWQgYnkgd2VibGluayBmZWF0dXJlLgpAQCAtMzE0LDcgKzQxMiw2IEBACiAvLwogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGTGlua19DbG9zZVdlYkxpbmtzKEZQREZfUEFHRUxJTksgbGlua19wYWdlKTsKIAotCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfdHJhbnNmb3JtcGFnZS5oIGIvcHVibGljL2ZwZGZfdHJhbnNmb3JtcGFnZS5oCmluZGV4IDMyNGJjZGEuLjIxNDIxYTEgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3RyYW5zZm9ybXBhZ2UuaAorKysgYi9wdWJsaWMvZnBkZl90cmFuc2Zvcm1wYWdlLmgKQEAgLTI0LDkgKzI0LDE0IEBACiAqIEBwYXJhbVtpbl0gcmlnaHQgIC0gVGhlIHJpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAqIEBwYXJhbVtpbl0gdG9wICAgIC0gVGhlIHRvcCBvZiB0aGUgcmVjdGFuZ2xlLgogKiBAcmV0dmFsIE5vbmUuCi0qIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHNldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisqIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHNldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaAorKiBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRNZWRpYUJveChGUERGX1BBR0UgcGFnZSwgZmxvYXQgbGVmdCwgZmxvYXQgYm90dG9tLCBmbG9hdCByaWdodCwgZmxvYXQgdG9wKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfU2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCk7CiAKIC8qKgogKiAgU2V0ICJDcm9wQm94IiBlbnRyeSB0byB0aGUgcGFnZSBkaWN0aW9uYXJ5LgpAQCAtMzYsNDcgKzQxLDc1IEBACiAqIEBwYXJhbVtpbl0gcmlnaHQgIC0gVGhlIHJpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAqIEBwYXJhbVtpbl0gdG9wICAgIC0gVGhlIHRvcCBvZiB0aGUgcmVjdGFuZ2xlLgogKiBAcmV0dmFsIE5vbmUuCi0qIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHNldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisqIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHNldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaAorKiBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLCBmbG9hdCBsZWZ0LCBmbG9hdCBib3R0b20sIGZsb2F0IHJpZ2h0LCBmbG9hdCB0b3ApOwotCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX1NldENyb3BCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdG9wKTsKIAogLyoqICBHZXQgIk1lZGlhQm94IiBlbnRyeSBmcm9tIHRoZSBwYWdlIGRpY3Rpb25hcnkuCiAqIEBwYXJhbVtpbl0gcGFnZSAgIC0gSGFuZGxlIHRvIGEgcGFnZS4KLSogQHBhcmFtW2luXSBsZWZ0ICAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgbGVmdCBvZiB0aGUgcmVjdGFuZ2xlLgotKiBAcGFyYW1baW5dIGJvdHRvbSAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBib3R0b20gb2YgdGhlIHJlY3RhbmdsZS4KLSogQHBhcmFtW2luXSByaWdodCAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KLSogQHBhcmFtW2luXSB0b3AgICAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgdG9wIG9mIHRoZSByZWN0YW5nbGUuCisqIEBwYXJhbVtpbl0gbGVmdCAgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIGxlZnQgb2YgdGhlCisqIHJlY3RhbmdsZS4KKyogQHBhcmFtW2luXSBib3R0b20gLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgYm90dG9tIG9mIHRoZQorKiByZWN0YW5nbGUuCisqIEBwYXJhbVtpbl0gcmlnaHQgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJpZ2h0IG9mIHRoZQorKiByZWN0YW5nbGUuCisqIEBwYXJhbVtpbl0gdG9wICAgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHRvcCBvZiB0aGUKKyogcmVjdGFuZ2xlLgogKiBAcmV0dmFsIFRydWUgaWYgc3VjY2VzcyxlbHNlIGZhaWwuCi0qIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGdldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisqIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGdldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaAorKiBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dldE1lZGlhQm94KEZQREZfUEFHRSBwYWdlLCBmbG9hdCogbGVmdCwgZmxvYXQqIGJvdHRvbSwgZmxvYXQqIHJpZ2h0LCBmbG9hdCogdG9wKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZXRNZWRpYUJveChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9wKTsKIAogLyoqICBHZXQgIkNyb3BCb3giIGVudHJ5IGZyb20gdGhlIHBhZ2UgZGljdGlvbmFyeS4KICogQHBhcmFtW2luXSBwYWdlICAgLSBIYW5kbGUgdG8gYSBwYWdlLgotKiBAcGFyYW1baW5dIGxlZnQgICAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBsZWZ0IG9mIHRoZSByZWN0YW5nbGUuCi0qIEBwYXJhbVtpbl0gYm90dG9tIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIGJvdHRvbSBvZiB0aGUgcmVjdGFuZ2xlLgotKiBAcGFyYW1baW5dIHJpZ2h0ICAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgotKiBAcGFyYW1baW5dIHRvcCAgICAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSB0b3Agb2YgdGhlIHJlY3RhbmdsZS4KKyogQHBhcmFtW2luXSBsZWZ0ICAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgbGVmdCBvZiB0aGUKKyogcmVjdGFuZ2xlLgorKiBAcGFyYW1baW5dIGJvdHRvbSAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBib3R0b20gb2YgdGhlCisqIHJlY3RhbmdsZS4KKyogQHBhcmFtW2luXSByaWdodCAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmlnaHQgb2YgdGhlCisqIHJlY3RhbmdsZS4KKyogQHBhcmFtW2luXSB0b3AgICAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgdG9wIG9mIHRoZQorKiByZWN0YW5nbGUuCiAqIEByZXR2YWwgVHJ1ZSBpZiBzdWNjZXNzLGVsc2UgZmFpbC4KLSogQG5vdGUgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gZ2V0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IHdoaWNoIGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKyogQG5vdGUgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gZ2V0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IHdoaWNoCisqIGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KICovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0Q3JvcEJveChGUERGX1BBR0UgcGFnZSwgZmxvYXQqIGxlZnQsIGZsb2F0KiBib3R0b20sIGZsb2F0KiByaWdodCwgZmxvYXQqIHRvcCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0Q3JvcEJveChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0b3ApOwogCiAvKioKLSogVHJhbnNmb3JtIHRoZSB3aG9sZSBwYWdlIHdpdGggYSBzcGVjaWZpZWQgbWF0cml4LCB0aGVuIGNsaXAgdGhlIHBhZ2UgY29udGVudCByZWdpb24uCisqIFRyYW5zZm9ybSB0aGUgd2hvbGUgcGFnZSB3aXRoIGEgc3BlY2lmaWVkIG1hdHJpeCwgdGhlbiBjbGlwIHRoZSBwYWdlIGNvbnRlbnQKKyogcmVnaW9uLgogKgogKiBAcGFyYW1baW5dIHBhZ2UgICAgICAgIC0gQSBwYWdlIGhhbmRsZS4KICogQHBhcmFtW2luXSBtYXRyaXggICAgICAtIFRoZSB0cmFuc2Zvcm0gbWF0cml4LgogKiBAcGFyYW1baW5dIGNsaXBSZWN0ICAgIC0gQSByZWN0YW5nbGUgcGFnZSBhcmVhIHRvIGJlIGNsaXBwZWQuCi0qIEBOb3RlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJhbnNmb3JtIHRoZSB3aG9sZSBwYWdlLCBhbmQgd291bGQgdGFrZSBlZmZlY3QgdG8gYWxsIHRoZSBvYmplY3RzIGluIHRoZSBwYWdlLgotKiAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gZ2V0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IHdoaWNoIGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKyogQE5vdGUuIFRoaXMgZnVuY3Rpb24gd2lsbCB0cmFuc2Zvcm0gdGhlIHdob2xlIHBhZ2UsIGFuZCB3b3VsZCB0YWtlIGVmZmVjdCB0bworKiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIHBhZ2UuCisqICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBnZXQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgd2hpY2gKKyogY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9UcmFuc0Zvcm1XaXRoQ2xpcChGUERGX1BBR0UgcGFnZSwgRlNfTUFUUklYKiBtYXRyaXgsIEZTX1JFQ1RGKiBjbGlwUmVjdCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfVHJhbnNGb3JtV2l0aENsaXAoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfTUFUUklYKiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfUkVDVEYqIGNsaXBSZWN0KTsKIAogLyoqCiAqIFRyYW5zZm9ybSAoc2NhbGUsIHJvdGF0ZSwgc2hlYXIsIG1vdmUpIHRoZSBjbGlwIHBhdGggb2YgcGFnZSBvYmplY3QuCi0qIEBwYXJhbVtpbl0gcGFnZV9vYmplY3QgLSBIYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4gUmV0dXJuZWQgYnkgRlBERlBhZ2VPYmpfTmV3SW1hZ2VPYmouCisqIEBwYXJhbVtpbl0gcGFnZV9vYmplY3QgLSBIYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4gUmV0dXJuZWQgYnkKKyogRlBERlBhZ2VPYmpfTmV3SW1hZ2VPYmouCiAqIEBwYXJhbVtpbl0gYSAgLSBUaGUgY29lZmZpY2llbnQgImEiIG9mIHRoZSBtYXRyaXguCiAqIEBwYXJhbVtpbl0gYiAgLSBUaGUgY29lZmZpY2llbnQgImIiIG9mIHRoZSBtYXRyaXguCiAqIEBwYXJhbVtpbl0gYyAgLSBUaGUgY29lZmZpY2llbnQgImMiIG9mIHRoZSBtYXRyaXguCkBAIC04NSw3ICsxMTgsMTQgQEAKICogQHBhcmFtW2luXSBmICAtIFRoZSBjb2VmZmljaWVudCAiZiIgb2YgdGhlIG1hdHJpeC4KICogQHJldHZhbCBOb25lLgogKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VPYmpfVHJhbnNmb3JtQ2xpcFBhdGgoRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0LGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRvdWJsZSBkLCBkb3VibGUgZSwgZG91YmxlIGYpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERlBhZ2VPYmpfVHJhbnNmb3JtQ2xpcFBhdGgoRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmKTsKIAogLyoqCiAqIENyZWF0ZSBhIG5ldyBjbGlwIHBhdGgsIHdpdGggYSByZWN0YW5nbGUgaW5zZXJ0ZWQuCkBAIC05Niw3ICsxMzYsMTAgQEAKICogQHBhcmFtW2luXSB0b3AgICAgLSBUaGUgdG9wIG9mIHRoZSBjbGlwIGJveC4KICogQHJldHZhbCBhIGhhbmRsZSB0byB0aGUgY2xpcCBwYXRoLgogKi8KLURMTEVYUE9SVCBGUERGX0NMSVBQQVRIIFNURENBTEwgRlBERl9DcmVhdGVDbGlwUGF0aChmbG9hdCBsZWZ0LCBmbG9hdCBib3R0b20sIGZsb2F0IHJpZ2h0LCBmbG9hdCB0b3ApOworRExMRVhQT1JUIEZQREZfQ0xJUFBBVEggU1REQ0FMTCBGUERGX0NyZWF0ZUNsaXBQYXRoKGZsb2F0IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCk7CiAKIC8qKgogKiBEZXN0cm95IHRoZSBjbGlwIHBhdGguCkBAIC0xMDgsMTQgKzE1MSwxOCBAQAogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0Rlc3Ryb3lDbGlwUGF0aChGUERGX0NMSVBQQVRIIGNsaXBQYXRoKTsKIAogLyoqCi0qIENsaXAgdGhlIHBhZ2UgY29udGVudCwgdGhlIHBhZ2UgY29udGVudCB0aGF0IG91dHNpZGUgdGhlIGNsaXBwaW5nIHJlZ2lvbiBiZWNvbWUgaW52aXNpYmxlLgorKiBDbGlwIHRoZSBwYWdlIGNvbnRlbnQsIHRoZSBwYWdlIGNvbnRlbnQgdGhhdCBvdXRzaWRlIHRoZSBjbGlwcGluZyByZWdpb24KKyogYmVjb21lIGludmlzaWJsZS4KICoKICogQHBhcmFtW2luXSBwYWdlICAgICAgICAtIEEgcGFnZSBoYW5kbGUuCiAqIEBwYXJhbVtpbl0gY2xpcFBhdGggICAgLSBBIGhhbmRsZSB0byB0aGUgY2xpcCBwYXRoLgotKiBATm90ZS4gQSBjbGlwIHBhdGggd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIHBhZ2UgY29udGVudCBzdHJlYW0gb3IgY29udGVudCBhcnJheS4gSW4gdGhpcyB3YXksIHRoZSBwYWdlIGNvbnRlbnQgd2lsbCBiZSBjbGlwcGVkCi0qIGJ5IHRoaXMgY2xpcCBwYXRoLiBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisqIEBOb3RlLiBBIGNsaXAgcGF0aCB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgcGFnZSBjb250ZW50IHN0cmVhbSBvciBjb250ZW50CisqIGFycmF5LiBJbiB0aGlzIHdheSwgdGhlIHBhZ2UgY29udGVudCB3aWxsIGJlIGNsaXBwZWQKKyogYnkgdGhpcyBjbGlwIHBhdGguIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50CisqIGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KICovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0luc2VydENsaXBQYXRoKEZQREZfUEFHRSBwYWdlLEZQREZfQ0xJUFBBVEggY2xpcFBhdGgpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9JbnNlcnRDbGlwUGF0aChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9DTElQUEFUSCBjbGlwUGF0aCk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZ2aWV3LmggYi9wdWJsaWMvZnBkZnZpZXcuaAppbmRleCBlNTYwNzFhLi4xNThmODIxIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZnZpZXcuaAorKysgYi9wdWJsaWMvZnBkZnZpZXcuaApAQCAtMjUsNyArMjUsNyBAQAogdHlwZWRlZiB2b2lkKiBGUERGX1BBR0U7CiB0eXBlZGVmIHZvaWQqIEZQREZfV0lER0VUOwogdHlwZWRlZiB2b2lkKiBGUERGX1NUUklOR0hBTkRMRTsKLXR5cGVkZWYgdm9pZCogRlBERl9QQUdFT0JKRUNUOyAgICAvLyBQYWdlIG9iamVjdCh0ZXh0LCBwYXRoLCBldGMpCit0eXBlZGVmIHZvaWQqIEZQREZfUEFHRU9CSkVDVDsgIC8vIFBhZ2Ugb2JqZWN0KHRleHQsIHBhdGgsIGV0YykKIHR5cGVkZWYgdm9pZCogRlBERl9QQVRIOwogdHlwZWRlZiB2b2lkKiBGUERGX0NMSVBQQVRIOwogdHlwZWRlZiB2b2lkKiBGUERGX0JJVE1BUDsKQEAgLTUyLDEwICs1MiwxMCBAQAogCiAvLyBEdXBsZXggdHlwZXMKIHR5cGVkZWYgZW51bSBfRlBERl9EVVBMRVhUWVBFXyB7Ci0gICAgRHVwbGV4VW5kZWZpbmVkID0gMCwKLSAgICBTaW1wbGV4LAotICAgIER1cGxleEZsaXBTaG9ydEVkZ2UsCi0gICAgRHVwbGV4RmxpcExvbmdFZGdlCisgIER1cGxleFVuZGVmaW5lZCA9IDAsCisgIFNpbXBsZXgsCisgIER1cGxleEZsaXBTaG9ydEVkZ2UsCisgIER1cGxleEZsaXBMb25nRWRnZQogfSBGUERGX0RVUExFWFRZUEU7CiAKIC8vIFN0cmluZyB0eXBlcwpAQCAtNjMsMTEgKzYzLDEzIEBACiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgY29uc3QqIEZQREZfTFBDQllURTsKIHR5cGVkZWYgY2hhciBjb25zdCogRlBERl9MUENTVFI7CiAKLS8vIEZQREZTREsgbWF5IHVzZSB0aHJlZSB0eXBlcyBvZiBzdHJpbmdzOiBieXRlIHN0cmluZywgd2lkZSBzdHJpbmcgKFVURi0xNkxFIGVuY29kZWQpLCBhbmQgcGxhdGZvcm0gZGVwZW5kZW50IHN0cmluZworLy8gRlBERlNESyBtYXkgdXNlIHRocmVlIHR5cGVzIG9mIHN0cmluZ3M6IGJ5dGUgc3RyaW5nLCB3aWRlIHN0cmluZyAoVVRGLTE2TEUKKy8vIGVuY29kZWQpLCBhbmQgcGxhdGZvcm0gZGVwZW5kZW50IHN0cmluZwogdHlwZWRlZiBjb25zdCBjaGFyKiBGUERGX0JZVEVTVFJJTkc7CiAKLXR5cGVkZWYgY29uc3QgdW5zaWduZWQgc2hvcnQqIEZQREZfV0lERVNUUklORzsgICAgICAgIC8vIEZveGl0IFBERiBTREsgYWx3YXlzIHVzZSBVVEYtMTZMRSBlbmNvZGluZyB3aWRlIHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhY2ggY2hhcmFjdGVyIHVzZSAyIGJ5dGVzIChleGNlcHQgc3Vycm9nYXRpb24pLCB3aXRoIGxvdyBieXRlIGZpcnN0LgordHlwZWRlZiBjb25zdCB1bnNpZ25lZCBzaG9ydCoKKyAgICBGUERGX1dJREVTVFJJTkc7ICAvLyBGb3hpdCBQREYgU0RLIGFsd2F5cyB1c2UgVVRGLTE2TEUgZW5jb2Rpbmcgd2lkZSBzdHJpbmcsCisvLyBlYWNoIGNoYXJhY3RlciB1c2UgMiBieXRlcyAoZXhjZXB0IHN1cnJvZ2F0aW9uKSwgd2l0aCBsb3cgYnl0ZSBmaXJzdC4KIAogI2lmbmRlZiBfRlBERl9ERUZfU1RSXwogI2RlZmluZSBfRlBERl9ERUZfU1RSXwpAQCAtNzUsMjQgKzc3LDI3IEBACiAgICoKICAgKiBAbm90ZSBJbiBTREssIGEgYnl0ZSBzdHJpbmcgY29tbW9ubHkgbWVhbnMgYSBVVEYtMTZMRSBmb3JtYXQgc3RyaW5nLgogICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZQREZfQlNUUgotewotICAgIC8qKgotICAgICAqIEBicmllZiBTdHJpbmcgYnVmZmVyLgotICAgICAqLwotICAgIGNoYXIqICAgc3RyOwotICAgIC8qKgotICAgICAqIEBicmllZiAgIExlbmd0aCBvZiBhIHN0cmluZywgaW4gYnl0ZXMuCi0gICAgICovCi0gICAgaW50IGxlbjsKK3R5cGVkZWYgc3RydWN0IF9GUERGX0JTVFIgeworICAvKioKKyAgICogQGJyaWVmIFN0cmluZyBidWZmZXIuCisgICAqLworICBjaGFyKiBzdHI7CisgIC8qKgorICAgKiBAYnJpZWYgICBMZW5ndGggb2YgYSBzdHJpbmcsIGluIGJ5dGVzLgorICAgKi8KKyAgaW50IGxlbjsKIH0gRlBERl9CU1RSOwogCiAjZW5kaWYKIAotLy8gRm9yIFdpbmRvd3MgcHJvZ3JhbW1lcnM6IGZvciBtb3N0IGNhc2UgaXQncyBPSyB0byB0cmVhdCBGUERGX1dJREVTVFJJTkcgYXMgV2luZG93cyB1bmljb2RlIHN0cmluZywKLS8vICAgICAgIGhvd2V2ZXIsIHNwZWNpYWwgY2FyZSBuZWVkcyB0byBiZSB0YWtlbiBpZiB5b3UgZXhwZWN0IHRvIHByb2Nlc3MgVW5pY29kZSBsYXJnZXIgdGhhbiAweGZmZmYuCi0vLyBGb3IgTGludXgvVW5peCBwcm9ncmFtbWVyczogbW9zdCBjb21waWxlci9saWJyYXJ5IGVudmlyb25tZW50IHVzZXMgNCBieXRlcyBmb3IgYSBVbmljb2RlIGNoYXJhY3RlciwKLS8vICAgICAgeW91IGhhdmUgdG8gY29udmVydCBiZXR3ZWVuIEZQREZfV0lERVNUUklORyBhbmQgc3lzdGVtIHdpZGUgc3RyaW5nIGJ5IHlvdXJzZWxmLgorLy8gRm9yIFdpbmRvd3MgcHJvZ3JhbW1lcnM6IGZvciBtb3N0IGNhc2UgaXQncyBPSyB0byB0cmVhdCBGUERGX1dJREVTVFJJTkcgYXMKKy8vIFdpbmRvd3MgdW5pY29kZSBzdHJpbmcsCisvLyAgICAgICBob3dldmVyLCBzcGVjaWFsIGNhcmUgbmVlZHMgdG8gYmUgdGFrZW4gaWYgeW91IGV4cGVjdCB0byBwcm9jZXNzCisvLyAgICAgICBVbmljb2RlIGxhcmdlciB0aGFuIDB4ZmZmZi4KKy8vIEZvciBMaW51eC9Vbml4IHByb2dyYW1tZXJzOiBtb3N0IGNvbXBpbGVyL2xpYnJhcnkgZW52aXJvbm1lbnQgdXNlcyA0IGJ5dGVzCisvLyBmb3IgYSBVbmljb2RlIGNoYXJhY3RlciwKKy8vICAgICAgeW91IGhhdmUgdG8gY29udmVydCBiZXR3ZWVuIEZQREZfV0lERVNUUklORyBhbmQgc3lzdGVtIHdpZGUgc3RyaW5nIGJ5CisvLyAgICAgIHlvdXJzZWxmLgogCiAjaWZkZWYgX1dJTjMyX1dDRQogdHlwZWRlZiBjb25zdCB1bnNpZ25lZCBzaG9ydCogRlBERl9TVFJJTkc7CkBAIC0xMDEsMzYgKzEwNiwzNCBAQAogI2VuZGlmCiAKIC8qKiBAYnJpZWYgTWF0cml4IGZvciB0cmFuc2Zvcm1hdGlvbi4gKi8KLXR5cGVkZWYgc3RydWN0IF9GU19NQVRSSVhfCi17Ci0gICAgZmxvYXQgICBhOyAgLyoqPCBAYnJpZWYgQ29lZmZpY2llbnQgYS4qLwotICAgIGZsb2F0ICAgYjsgIC8qKjwgQGJyaWVmIENvZWZmaWNpZW50IGIuKi8KLSAgICBmbG9hdCAgIGM7ICAvKio8IEBicmllZiBDb2VmZmljaWVudCBjLiovCi0gICAgZmxvYXQgICBkOyAgLyoqPCBAYnJpZWYgQ29lZmZpY2llbnQgZC4qLwotICAgIGZsb2F0ICAgZTsgIC8qKjwgQGJyaWVmIENvZWZmaWNpZW50IGUuKi8KLSAgICBmbG9hdCAgIGY7ICAvKio8IEBicmllZiBDb2VmZmljaWVudCBmLiovCit0eXBlZGVmIHN0cnVjdCBfRlNfTUFUUklYXyB7CisgIGZsb2F0IGE7IC8qKjwgQGJyaWVmIENvZWZmaWNpZW50IGEuKi8KKyAgZmxvYXQgYjsgLyoqPCBAYnJpZWYgQ29lZmZpY2llbnQgYi4qLworICBmbG9hdCBjOyAvKio8IEBicmllZiBDb2VmZmljaWVudCBjLiovCisgIGZsb2F0IGQ7IC8qKjwgQGJyaWVmIENvZWZmaWNpZW50IGQuKi8KKyAgZmxvYXQgZTsgLyoqPCBAYnJpZWYgQ29lZmZpY2llbnQgZS4qLworICBmbG9hdCBmOyAvKio8IEBicmllZiBDb2VmZmljaWVudCBmLiovCiB9IEZTX01BVFJJWDsKIAogLyoqIEBicmllZiBSZWN0YW5nbGUgYXJlYShmbG9hdCkgaW4gZGV2aWNlIG9yIHBhZ2UgY29vcmRpbmF0aW9uIHN5c3RlbS4gKi8KLXR5cGVkZWYgc3RydWN0IF9GU19SRUNURl8KLXsKLSAgICAvKipAeyovCi0gICAgLyoqIEBicmllZiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBsZWZ0LXRvcCBjb3JuZXIuICovCi0gICAgZmxvYXQgICBsZWZ0OwotICAgIC8qKiBAYnJpZWYgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgbGVmdC10b3AgY29ybmVyLiAqLwotICAgIGZsb2F0ICAgdG9wOwotICAgIC8qKiBAYnJpZWYgVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcmlnaHQtYm90dG9tIGNvcm5lci4gKi8KLSAgICBmbG9hdCAgIHJpZ2h0OwotICAgIC8qKiBAYnJpZWYgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcmlnaHQtYm90dG9tIGNvcm5lci4gKi8KLSAgICBmbG9hdCAgIGJvdHRvbTsKLSAgICAvKipAfSovCi19KiBGU19MUFJFQ1RGLCBGU19SRUNURjsKK3R5cGVkZWYgc3RydWN0IF9GU19SRUNURl8geworICAvKipAeyovCisgIC8qKiBAYnJpZWYgVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbGVmdC10b3AgY29ybmVyLiAqLworICBmbG9hdCBsZWZ0OworICAvKiogQGJyaWVmIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGxlZnQtdG9wIGNvcm5lci4gKi8KKyAgZmxvYXQgdG9wOworICAvKiogQGJyaWVmIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0LWJvdHRvbSBjb3JuZXIuICovCisgIGZsb2F0IHJpZ2h0OworICAvKiogQGJyaWVmIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0LWJvdHRvbSBjb3JuZXIuICovCisgIGZsb2F0IGJvdHRvbTsKKyAgLyoqQH0qLworfSAqIEZTX0xQUkVDVEYsIEZTX1JFQ1RGOwogLyoqIEBicmllZiBDb25zdCBQb2ludGVyIHRvIDo6RlNfUkVDVEYgc3RydWN0dXJlLiovCiB0eXBlZGVmIGNvbnN0IEZTX1JFQ1RGKiBGU19MUENSRUNURjsKIAogI2lmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKEZQREZTREtfRVhQT1JUUykKIC8vIE9uIFdpbmRvd3Mgc3lzdGVtLCBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGluIGEgRExMCi0jZGVmaW5lIERMTEVYUE9SVCBfX2RlY2xzcGVjKCBkbGxleHBvcnQgKQorI2RlZmluZSBETExFWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCiAjZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCiAjZWxzZQogI2RlZmluZSBETExFWFBPUlQKQEAgLTE0OSw3ICsxNTIsOCBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgWW91IGhhdmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSB5b3UgY2FuIGNhbGwgYW55IFBERiBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4KKy8vICAgICAgICAgIFlvdSBoYXZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgeW91IGNhbiBjYWxsIGFueSBQREYKKy8vICAgICAgICAgIHByb2Nlc3NpbmcgZnVuY3Rpb25zLgogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0luaXRMaWJyYXJ5KCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0Rlc3Ryb3lMaWJhcnkKQEAgLTE1OSwyMSArMTYzLDI1IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWxlYXNlIGFsbCBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZCBieSB0aGUgbGlicmFyeS4KLS8vICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbGVkLCB5b3Ugc2hvdWxkIG5vdCBjYWxsIGFueSBQREYgcHJvY2Vzc2luZyBmdW5jdGlvbnMuCisvLyAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWxlYXNlIGFsbCBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZCBieQorLy8gICAgICAgICAgdGhlIGxpYnJhcnkuCisvLyAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGxlZCwgeW91IHNob3VsZCBub3QgY2FsbCBhbnkgUERGIHByb2Nlc3NpbmcKKy8vICAgICAgICAgIGZ1bmN0aW9ucy4KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9EZXN0cm95TGlicmFyeSgpOwogCi0vL1BvbGljeSBmb3IgYWNjZXNzaW5nIHRoZSBsb2NhbCBtYWNoaW5lIHRpbWUuCi0jZGVmaW5lIEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUyAgMAorLy8gUG9saWN5IGZvciBhY2Nlc3NpbmcgdGhlIGxvY2FsIG1hY2hpbmUgdGltZS4KKyNkZWZpbmUgRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTIDAKIAogLy8gRnVuY3Rpb246IEZQREZfU2V0U2FuZEJveFBvbGljeQogLy8gICAgICAgICAgU2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBzYW5kYm94IGVudmlyb25tZW50LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBvbGljeSAgICAgIC0gICBUaGUgc3BlY2lmaWVkIHBvbGljeSBmb3Igc2V0dGluZywgZm9yIGV4YW1wbGU6RlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTLgorLy8gICAgICAgICAgcG9saWN5ICAgICAgLSAgIFRoZSBzcGVjaWZpZWQgcG9saWN5IGZvciBzZXR0aW5nLCBmb3IKKy8vICAgICAgICAgIGV4YW1wbGU6RlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTLgogLy8gICAgICAgICAgZW5hYmxlICAgICAgLSAgIFRydWUgZm9yIGVuYWJsZSwgRmFsc2UgZm9yIGRpc2FibGUgdGhlIHBvbGljeS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCi1ETExFWFBPUlQgdm9pZCAgU1REQ0FMTCBGUERGX1NldFNhbmRCb3hQb2xpY3koRlBERl9EV09SRCBwb2xpY3ksIEZQREZfQk9PTCBlbmFibGUpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldFNhbmRCb3hQb2xpY3koRlBERl9EV09SRCBwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgZW5hYmxlKTsKIAogLy8gRnVuY3Rpb246IEZQREZfTG9hZERvY3VtZW50CiAvLyAgICAgICAgICBPcGVuIGFuZCBsb2FkIGEgUERGIGRvY3VtZW50LgpAQCAtMTg3LDEwICsxOTUsMTEgQEAKIC8vICAgICAgICAgIExvYWRlZCBkb2N1bWVudCBjYW4gYmUgY2xvc2VkIGJ5IEZQREZfQ2xvc2VEb2N1bWVudCgpLgogLy8gICAgICAgICAgSWYgdGhpcyBmdW5jdGlvbiBmYWlscywgeW91IGNhbiB1c2UgRlBERl9HZXRMYXN0RXJyb3IoKSB0byByZXRyaWV2ZQogLy8gICAgICAgICAgdGhlIHJlYXNvbiB3aHkgaXQgZmFpbGVkLgotLy8gICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIDo6RlBERl9Mb2FkWEZBIGZ1bmN0aW9uIGFmdGVyIFBERiBkb2N1bWVudCBsb2FkZWQKKy8vICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2FsbCA6OkZQREZfTG9hZFhGQSBmdW5jdGlvbiBhZnRlciBQREYKKy8vICAgICAgICAgIGRvY3VtZW50IGxvYWRlZAogLy8gICAgICAgICAgdG8gc3VwcG9ydCBYRkEgZmllbGRzIGluIGZwZGZmb3JtZmlsbC5oIGZpbGUuCiBETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZERvY3VtZW50KEZQREZfU1RSSU5HIGZpbGVfcGF0aCwKLSAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9Mb2FkTWVtRG9jdW1lbnQKIC8vICAgICAgICAgIE9wZW4gYW5kIGxvYWQgYSBQREYgZG9jdW1lbnQgZnJvbSBtZW1vcnkuCkBAIC0yMDcsMjcgKzIxNiwzMyBAQAogLy8gICAgICAgICAgSWYgdGhpcyBmdW5jdGlvbiBmYWlscywgeW91IGNhbiB1c2UgRlBERl9HZXRMYXN0RXJyb3IoKSB0byByZXRyaWV2ZQogLy8gICAgICAgICAgdGhlIHJlYXNvbiB3aHkgaXQgZmFpbHMuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2FsbCA6OkZQREZfTG9hZFhGQSBmdW5jdGlvbiBhZnRlciBQREYgZG9jdW1lbnQgbG9hZGVkCisvLyAgICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgOjpGUERGX0xvYWRYRkEgZnVuY3Rpb24gYWZ0ZXIgUERGCisvLyAgICAgICAgICBkb2N1bWVudCBsb2FkZWQKIC8vICAgICAgICAgIHRvIHN1cHBvcnQgWEZBIGZpZWxkcyBpbiBmcGRmZm9ybWZpbGwuaCBmaWxlLgogLy8KIERMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERl9Mb2FkTWVtRG9jdW1lbnQoY29uc3Qgdm9pZCogZGF0YV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKTsKIAogLy8gU3RydWN0dXJlIGZvciBjdXN0b20gZmlsZSBhY2Nlc3MuCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgLy8gRmlsZSBsZW5ndGgsIGluIGJ5dGVzLgotICAgIHVuc2lnbmVkIGxvbmcgICBtX0ZpbGVMZW47CisgIC8vIEZpbGUgbGVuZ3RoLCBpbiBieXRlcy4KKyAgdW5zaWduZWQgbG9uZyBtX0ZpbGVMZW47CiAKLSAgICAvLyBBIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGdldHRpbmcgYSBibG9jayBvZiBkYXRhIGZyb20gc3BlY2lmaWMgcG9zaXRpb24uCi0gICAgLy8gUG9zaXRpb24gaXMgc3BlY2lmaWVkIGJ5IGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgotICAgIC8vIFRoZSBwb3NpdGlvbiBhbmQgc2l6ZSB3aWxsIG5ldmVyIGdvIG91dCByYW5nZSBvZiBmaWxlIGxlbmd0aC4KLSAgICAvLyBJdCBtYXkgYmUgcG9zc2libGUgZm9yIEZQREZTREsgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIGZvciBzYW1lIHBvc2l0aW9uLgotICAgIC8vIFJldHVybiB2YWx1ZTogc2hvdWxkIGJlIG5vbi16ZXJvIGlmIHN1Y2Nlc3NmdWwsIHplcm8gZm9yIGVycm9yLgotICAgIGludCAgICAgICAgICAgICAoKm1fR2V0QmxvY2spKHZvaWQqIHBhcmFtLCB1bnNpZ25lZCBsb25nIHBvc2l0aW9uLCB1bnNpZ25lZCBjaGFyKiBwQnVmLCB1bnNpZ25lZCBsb25nIHNpemUpOworICAvLyBBIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGdldHRpbmcgYSBibG9jayBvZiBkYXRhIGZyb20gc3BlY2lmaWMgcG9zaXRpb24uCisgIC8vIFBvc2l0aW9uIGlzIHNwZWNpZmllZCBieSBieXRlIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAgLy8gVGhlIHBvc2l0aW9uIGFuZCBzaXplIHdpbGwgbmV2ZXIgZ28gb3V0IHJhbmdlIG9mIGZpbGUgbGVuZ3RoLgorICAvLyBJdCBtYXkgYmUgcG9zc2libGUgZm9yIEZQREZTREsgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIGZvcgorICAvLyBzYW1lIHBvc2l0aW9uLgorICAvLyBSZXR1cm4gdmFsdWU6IHNob3VsZCBiZSBub24temVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGZvciBlcnJvci4KKyAgaW50ICgqbV9HZXRCbG9jaykodm9pZCogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKLSAgICAvLyBBIGN1c3RvbSBwb2ludGVyIGZvciBhbGwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZGF0YS4KLSAgICAvLyBUaGlzIHBvaW50ZXIgd2lsbCBiZSB1c2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gbV9HZXRCbG9jayBjYWxsYmFjay4KLSAgICB2b2lkKiAgICAgICAgICAgbV9QYXJhbTsKKyAgLy8gQSBjdXN0b20gcG9pbnRlciBmb3IgYWxsIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGRhdGEuCisgIC8vIFRoaXMgcG9pbnRlciB3aWxsIGJlIHVzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byBtX0dldEJsb2NrIGNhbGxiYWNrLgorICB2b2lkKiBtX1BhcmFtOwogfSBGUERGX0ZJTEVBQ0NFU1M7CiAKIC8qKgpAQCAtMjM1LDcwICsyNTAsNzcgQEAKICAqCiAgKiBAbm90ZSBUaGlzIGlzIGEgaGFuZGxlciBhbmQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGNhbGxlcnMuCiAgKi8KLXR5cGVkZWYgc3RydWN0IF9GUERGX0ZJTEVIQU5ETEVSCi17Ci0gICAgLyoqCi0gICAgICogQGJyaWVmIFVzZXItZGVmaW5lZCBkYXRhLgotICAgICAqIEBub3RlIENhbGxlcnMgY2FuIHVzZSB0aGlzIGZpZWxkIHRvIHRyYWNrIGNvbnRyb2xzLgotICAgICAqLwotICAgIEZQREZfTFBWT0lEIGNsaWVudERhdGE7Ci0gICAgLyoqCi0gICAgICogQGJyaWVmIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlbGVhc2UgdGhlIGN1cnJlbnQgZmlsZSBzdHJlYW0gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBjbGllbnREYXRhICAgIFBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5vbmUuCi0gICAgICovCi0gICAgdm9pZCAgICAgICAgKCpSZWxlYXNlKShGUERGX0xQVk9JRCBjbGllbnREYXRhKTsKLSAgICAvKioKLSAgICAgKiBAYnJpZWYgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgZmlsZSBzdHJlYW0gc2l6ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gY2xpZW50RGF0YSAgICBQb2ludGVyIHRvIHVzZXItZGVmaW5lZCBkYXRhLgotICAgICAqCi0gICAgICogQHJldHVybiBTaXplIG9mIGZpbGUgc3RyZWFtLgotICAgICAqLwotICAgIEZQREZfRFdPUkQgICgqR2V0U2l6ZSkoRlBERl9MUFZPSUQgY2xpZW50RGF0YSk7Ci0gICAgLyoqCi0gICAgICogQGJyaWVmIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBjdXJyZW50IGZpbGUgc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSAgIGNsaWVudERhdGEgIFBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCi0gICAgICogQHBhcmFtW2luXSAgIG9mZnNldCAgICAgIE9mZnNldCBwb3NpdGlvbiBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZpbGUgc3RyZWFtLiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgcmVhZGluZyBwb3NpdGlvbi4KLSAgICAgKiBAcGFyYW1baW5dICAgYnVmZmVyICAgICAgTWVtb3J5IGJ1ZmZlciB0byBzdG9yZSBkYXRhIHdoaWNoIGFyZSByZWFkIGZyb20gZmlsZSBzdHJlYW0uIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgPGI+TlVMTDwvYj4uCi0gICAgICogQHBhcmFtW2luXSAgIHNpemUgICAgICAgIFNpemUgb2YgZGF0YSB3aGljaCBzaG91bGQgYmUgcmVhZCBmcm9tIGZpbGUgc3RyZWFtLCBpbiBieXRlcy4gVGhlIGJ1ZmZlciBpbmRpY2F0ZWQgYnkgdGhlIHBhcmFtZXRlciA8aT5idWZmZXI8L2k+IHNob3VsZCBiZSBlbm91Z2ggdG8gc3RvcmUgc3BlY2lmaWVkIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG90aGVyIHZhbHVlIGZvciBmYWlsdXJlLgotICAgICAqLwotICAgIEZQREZfUkVTVUxUICgqUmVhZEJsb2NrKShGUERGX0xQVk9JRCBjbGllbnREYXRhLCBGUERGX0RXT1JEIG9mZnNldCwgRlBERl9MUFZPSUQgYnVmZmVyLCBGUERGX0RXT1JEIHNpemUpOwotICAgIC8qKgotICAgICAqIEBicmllZiAgIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHdyaXRlIGRhdGEgaW50byB0aGUgY3VycmVudCBmaWxlIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gICBjbGllbnREYXRhICBQb2ludGVyIHRvIHVzZXItZGVmaW5lZCBkYXRhLgotICAgICAqIEBwYXJhbVtpbl0gICBvZmZzZXQgICAgICBPZmZzZXQgcG9zaXRpb24gc3RhcnRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmaWxlIHN0cmVhbS4gVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdyaXRpbmcgcG9zaXRpb24uCi0gICAgICogQHBhcmFtW2luXSAgIGJ1ZmZlciAgICAgIE1lbW9yeSBidWZmZXIgY29udGFpbnMgZGF0YSB3aGljaCBpcyB3cml0dGVuIGludG8gZmlsZSBzdHJlYW0uIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgPGI+TlVMTDwvYj4uCi0gICAgICogQHBhcmFtW2luXSAgIHNpemUgICAgICAgIFNpemUgb2YgZGF0YSB3aGljaCBzaG91bGQgYmUgd3JpdHRlbiBpbnRvIGZpbGUgc3RyZWFtLCBpbiBieXRlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3RoZXIgdmFsdWUgZm9yIGZhaWx1cmUuCi0gICAgICovCi0gICAgRlBERl9SRVNVTFQgKCpXcml0ZUJsb2NrKShGUERGX0xQVk9JRCBjbGllbnREYXRhLCBGUERGX0RXT1JEIG9mZnNldCwgRlBERl9MUENWT0lEIGJ1ZmZlciwgRlBERl9EV09SRCBzaXplKTsKLSAgICAvKioKLSAgICAgKiBAYnJpZWYgICBDYWxsYmFjayBmdW5jdGlvbiB0byBmbHVzaCBhbGwgaW50ZXJuYWwgYWNjZXNzaW5nIGJ1ZmZlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dICAgY2xpZW50RGF0YSAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3RoZXIgdmFsdWUgZm9yIGZhaWx1cmUuCi0gICAgICovCi0gICAgRlBERl9SRVNVTFQgKCpGbHVzaCkoRlBERl9MUFZPSUQgY2xpZW50RGF0YSk7Ci0gICAgLyoqCi0gICAgICogQGJyaWVmICAgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2hhbmdlIGZpbGUgc2l6ZS4KLSAgICAgKgotICAgICAqIEBkZXRhaWxzIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIHdyaXRpbmcgbW9kZSB1c3VhbGx5LiBJbXBsZW1lbnRlciBjYW4gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcmVhbGl6ZSBpdCBiYXNlZCBvbiBhcHBsaWNhdGlvbiByZXF1ZXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gICBjbGllbnREYXRhICBQb2ludGVyIHRvIHVzZXItZGVmaW5lZCBkYXRhLgotICAgICAqIEBwYXJhbVtpbl0gICBzaXplICAgICAgICBOZXcgc2l6ZSBvZiBmaWxlIHN0cmVhbSwgaW4gYnl0ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG90aGVyIHZhbHVlIGZvciBmYWlsdXJlLgotICAgICAqLwotICAgIEZQREZfUkVTVUxUICgqVHJ1bmNhdGUpKEZQREZfTFBWT0lEIGNsaWVudERhdGEsIEZQREZfRFdPUkQgc2l6ZSk7Cit0eXBlZGVmIHN0cnVjdCBfRlBERl9GSUxFSEFORExFUiB7CisgIC8qKgorICAgKiBAYnJpZWYgVXNlci1kZWZpbmVkIGRhdGEuCisgICAqIEBub3RlIENhbGxlcnMgY2FuIHVzZSB0aGlzIGZpZWxkIHRvIHRyYWNrIGNvbnRyb2xzLgorICAgKi8KKyAgRlBERl9MUFZPSUQgY2xpZW50RGF0YTsKKyAgLyoqCisgICAqIEBicmllZiBDYWxsYmFjayBmdW5jdGlvbiB0byByZWxlYXNlIHRoZSBjdXJyZW50IGZpbGUgc3RyZWFtIG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtW2luXSBjbGllbnREYXRhICAgIFBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCisgICAqCisgICAqIEByZXR1cm4gTm9uZS4KKyAgICovCisgIHZvaWQgKCpSZWxlYXNlKShGUERGX0xQVk9JRCBjbGllbnREYXRhKTsKKyAgLyoqCisgICAqIEBicmllZiBDYWxsYmFjayBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBmaWxlIHN0cmVhbSBzaXplLgorICAgKgorICAgKiBAcGFyYW1baW5dIGNsaWVudERhdGEgICAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KKyAgICoKKyAgICogQHJldHVybiBTaXplIG9mIGZpbGUgc3RyZWFtLgorICAgKi8KKyAgRlBERl9EV09SRCAoKkdldFNpemUpKEZQREZfTFBWT0lEIGNsaWVudERhdGEpOworICAvKioKKyAgICogQGJyaWVmIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBjdXJyZW50IGZpbGUgc3RyZWFtLgorICAgKgorICAgKiBAcGFyYW1baW5dICAgY2xpZW50RGF0YSAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KKyAgICogQHBhcmFtW2luXSAgIG9mZnNldCAgICAgIE9mZnNldCBwb3NpdGlvbiBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZpbGUKKyAgICogc3RyZWFtLiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgcmVhZGluZyBwb3NpdGlvbi4KKyAgICogQHBhcmFtW2luXSAgIGJ1ZmZlciAgICAgIE1lbW9yeSBidWZmZXIgdG8gc3RvcmUgZGF0YSB3aGljaCBhcmUgcmVhZCBmcm9tCisgICAqIGZpbGUgc3RyZWFtLiBUaGlzIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIDxiPk5VTEw8L2I+LgorICAgKiBAcGFyYW1baW5dICAgc2l6ZSAgICAgICAgU2l6ZSBvZiBkYXRhIHdoaWNoIHNob3VsZCBiZSByZWFkIGZyb20gZmlsZQorICAgKiBzdHJlYW0sIGluIGJ5dGVzLiBUaGUgYnVmZmVyIGluZGljYXRlZCBieSB0aGUgcGFyYW1ldGVyIDxpPmJ1ZmZlcjwvaT4KKyAgICogc2hvdWxkIGJlIGVub3VnaCB0byBzdG9yZSBzcGVjaWZpZWQgZGF0YS4KKyAgICoKKyAgICogQHJldHVybiAwIGZvciBzdWNjZXNzLCBvdGhlciB2YWx1ZSBmb3IgZmFpbHVyZS4KKyAgICovCisgIEZQREZfUkVTVUxUICgqUmVhZEJsb2NrKShGUERGX0xQVk9JRCBjbGllbnREYXRhLCBGUERGX0RXT1JEIG9mZnNldCwgRlBERl9MUFZPSUQgYnVmZmVyLCBGUERGX0RXT1JEIHNpemUpOworICAvKioKKyAgICogQGJyaWVmICAgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gd3JpdGUgZGF0YSBpbnRvIHRoZSBjdXJyZW50IGZpbGUgc3RyZWFtLgorICAgKgorICAgKiBAcGFyYW1baW5dICAgY2xpZW50RGF0YSAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KKyAgICogQHBhcmFtW2luXSAgIG9mZnNldCAgICAgIE9mZnNldCBwb3NpdGlvbiBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZpbGUKKyAgICogc3RyZWFtLiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd3JpdGluZyBwb3NpdGlvbi4KKyAgICogQHBhcmFtW2luXSAgIGJ1ZmZlciAgICAgIE1lbW9yeSBidWZmZXIgY29udGFpbnMgZGF0YSB3aGljaCBpcyB3cml0dGVuIGludG8KKyAgICogZmlsZSBzdHJlYW0uIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgPGI+TlVMTDwvYj4uCisgICAqIEBwYXJhbVtpbl0gICBzaXplICAgICAgICBTaXplIG9mIGRhdGEgd2hpY2ggc2hvdWxkIGJlIHdyaXR0ZW4gaW50byBmaWxlCisgICAqIHN0cmVhbSwgaW4gYnl0ZXMuCisgICAqCisgICAqIEByZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3RoZXIgdmFsdWUgZm9yIGZhaWx1cmUuCisgICAqLworICBGUERGX1JFU1VMVCAoKldyaXRlQmxvY2spKEZQREZfTFBWT0lEIGNsaWVudERhdGEsIEZQREZfRFdPUkQgb2Zmc2V0LCBGUERGX0xQQ1ZPSUQgYnVmZmVyLCBGUERGX0RXT1JEIHNpemUpOworICAvKioKKyAgICogQGJyaWVmICAgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZmx1c2ggYWxsIGludGVybmFsIGFjY2Vzc2luZyBidWZmZXJzLgorICAgKgorICAgKiBAcGFyYW1baW5dICAgY2xpZW50RGF0YSAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KKyAgICoKKyAgICogQHJldHVybiAwIGZvciBzdWNjZXNzLCBvdGhlciB2YWx1ZSBmb3IgZmFpbHVyZS4KKyAgICovCisgIEZQREZfUkVTVUxUICgqRmx1c2gpKEZQREZfTFBWT0lEIGNsaWVudERhdGEpOworICAvKioKKyAgICogQGJyaWVmICAgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2hhbmdlIGZpbGUgc2l6ZS4KKyAgICoKKyAgICogQGRldGFpbHMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgd3JpdGluZyBtb2RlIHVzdWFsbHkuIEltcGxlbWVudGVyCisgICAqIGNhbiBkZXRlcm1pbmUgd2hldGhlciB0byByZWFsaXplIGl0IGJhc2VkIG9uIGFwcGxpY2F0aW9uIHJlcXVlc3RzLgorICAgKgorICAgKiBAcGFyYW1baW5dICAgY2xpZW50RGF0YSAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KKyAgICogQHBhcmFtW2luXSAgIHNpemUgICAgICAgIE5ldyBzaXplIG9mIGZpbGUgc3RyZWFtLCBpbiBieXRlcy4KKyAgICoKKyAgICogQHJldHVybiAwIGZvciBzdWNjZXNzLCBvdGhlciB2YWx1ZSBmb3IgZmFpbHVyZS4KKyAgICovCisgIEZQREZfUkVTVUxUICgqVHJ1bmNhdGUpKEZQREZfTFBWT0lEIGNsaWVudERhdGEsIEZQREZfRFdPUkQgc2l6ZSk7CiAKIH0gRlBERl9GSUxFSEFORExFUiwgKkZQREZfTFBGSUxFSEFORExFUjsKIApAQCAtMzEwLDM2ICszMzIsNDEgQEAKIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIEEgaGFuZGxlIHRvIHRoZSBsb2FkZWQgZG9jdW1lbnQuIElmIGZhaWxlZCwgTlVMTCBpcyByZXR1cm5lZC4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBtYWludGFpbiB0aGUgZmlsZSByZXNvdXJjZXMgYmVpbmcgdmFsaWQgdW50aWwgdGhlIFBERiBkb2N1bWVudCBjbG9zZS4KKy8vICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbWFpbnRhaW4gdGhlIGZpbGUgcmVzb3VyY2VzIGJlaW5nIHZhbGlkIHVudGlsCisvLyAgICAgICAgICB0aGUgUERGIGRvY3VtZW50IGNsb3NlLgogLy8gICAgICAgICAgTG9hZGVkIGRvY3VtZW50IGNhbiBiZSBjbG9zZWQgYnkgRlBERl9DbG9zZURvY3VtZW50LgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgOjpGUERGX0xvYWRYRkEgZnVuY3Rpb24gYWZ0ZXIgUERGIGRvY3VtZW50IGxvYWRlZAorLy8gICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIDo6RlBERl9Mb2FkWEZBIGZ1bmN0aW9uIGFmdGVyIFBERgorLy8gICAgICAgICAgZG9jdW1lbnQgbG9hZGVkCiAvLyAgICAgICAgICB0byBzdXBwb3J0IFhGQSBmaWVsZHMgaW4gZnBkZmZvcm1maWxsLmggZmlsZS4KIC8vCi1ETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZEN1c3RvbURvY3VtZW50KEZQREZfRklMRUFDQ0VTUyogcEZpbGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBwYXNzd29yZCk7CitETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMCitGUERGX0xvYWRDdXN0b21Eb2N1bWVudChGUERGX0ZJTEVBQ0NFU1MqIHBGaWxlQWNjZXNzLCBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9HZXRGaWxlVmVyc2lvbgogLy8gICAgICAgICAgR2V0IHRoZSBmaWxlIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljIFBERiBkb2N1bWVudC4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBkb2MgICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LgotLy8gICAgICAgICAgZmlsZVZlcnNpb24gLSAgIFRoZSBQREYgZmlsZSB2ZXJzaW9uLiBGaWxlIHZlcnNpb246IDE0IGZvciAxLjQsIDE1IGZvciAxLjUsIC4uLgorLy8gICAgICAgICAgZmlsZVZlcnNpb24gLSAgIFRoZSBQREYgZmlsZSB2ZXJzaW9uLiBGaWxlIHZlcnNpb246IDE0IGZvciAxLjQsIDE1CisvLyAgICAgICAgICBmb3IgMS41LCAuLi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRSVUUgaWYgdGhpcyBjYWxsIHN1Y2NlZWQsIElmIGZhaWxlZCwgRkFMU0UgaXMgcmV0dXJuZWQuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIElmIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGJ5IGZ1bmN0aW9uIDo6RlBERl9DcmVhdGVOZXdEb2N1bWVudCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdvdWxkIGFsd2F5cyBmYWlsLgorLy8gICAgICAgICAgSWYgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgYnkgZnVuY3Rpb24gOjpGUERGX0NyZWF0ZU5ld0RvY3VtZW50LAorLy8gICAgICAgICAgdGhlbiB0aGlzIGZ1bmN0aW9uIHdvdWxkIGFsd2F5cyBmYWlsLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0dldEZpbGVWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jLCBpbnQqIGZpbGVWZXJzaW9uKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0dldEZpbGVWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmaWxlVmVyc2lvbik7CiAKLSNkZWZpbmUgRlBERl9FUlJfU1VDQ0VTUyAgICAgICAgMCAgICAgICAvLyBObyBlcnJvci4KLSNkZWZpbmUgRlBERl9FUlJfVU5LTk9XTiAgICAgICAgMSAgICAgICAvLyBVbmtub3duIGVycm9yLgotI2RlZmluZSBGUERGX0VSUl9GSUxFICAgICAgICAgICAyICAgICAgIC8vIEZpbGUgbm90IGZvdW5kIG9yIGNvdWxkIG5vdCBiZSBvcGVuZWQuCi0jZGVmaW5lIEZQREZfRVJSX0ZPUk1BVCAgICAgICAgIDMgICAgICAgLy8gRmlsZSBub3QgaW4gUERGIGZvcm1hdCBvciBjb3JydXB0ZWQuCi0jZGVmaW5lIEZQREZfRVJSX1BBU1NXT1JEICAgICAgIDQgICAgICAgLy8gUGFzc3dvcmQgcmVxdWlyZWQgb3IgaW5jb3JyZWN0IHBhc3N3b3JkLgotI2RlZmluZSBGUERGX0VSUl9TRUNVUklUWSAgICAgICA1ICAgICAgIC8vIFVuc3VwcG9ydGVkIHNlY3VyaXR5IHNjaGVtZS4KLSNkZWZpbmUgRlBERl9FUlJfUEFHRSAgICAgICAgICAgNiAgICAgICAvLyBQYWdlIG5vdCBmb3VuZCBvciBjb250ZW50IGVycm9yLgotI2RlZmluZSBGUERGX0VSUl9YRkFMT0FEICAgICAgICA3ICAgICAgIC8vIExvYWQgWEZBIGVycm9yLgotI2RlZmluZSBGUERGX0VSUl9YRkFMQVlPVVQgICAgICA4ICAgICAgIC8vIExheW91dCBYRkEgZXJyb3IuCisjZGVmaW5lIEZQREZfRVJSX1NVQ0NFU1MgMCAgICAvLyBObyBlcnJvci4KKyNkZWZpbmUgRlBERl9FUlJfVU5LTk9XTiAxICAgIC8vIFVua25vd24gZXJyb3IuCisjZGVmaW5lIEZQREZfRVJSX0ZJTEUgMiAgICAgICAvLyBGaWxlIG5vdCBmb3VuZCBvciBjb3VsZCBub3QgYmUgb3BlbmVkLgorI2RlZmluZSBGUERGX0VSUl9GT1JNQVQgMyAgICAgLy8gRmlsZSBub3QgaW4gUERGIGZvcm1hdCBvciBjb3JydXB0ZWQuCisjZGVmaW5lIEZQREZfRVJSX1BBU1NXT1JEIDQgICAvLyBQYXNzd29yZCByZXF1aXJlZCBvciBpbmNvcnJlY3QgcGFzc3dvcmQuCisjZGVmaW5lIEZQREZfRVJSX1NFQ1VSSVRZIDUgICAvLyBVbnN1cHBvcnRlZCBzZWN1cml0eSBzY2hlbWUuCisjZGVmaW5lIEZQREZfRVJSX1BBR0UgNiAgICAgICAvLyBQYWdlIG5vdCBmb3VuZCBvciBjb250ZW50IGVycm9yLgorI2RlZmluZSBGUERGX0VSUl9YRkFMT0FEIDcgICAgLy8gTG9hZCBYRkEgZXJyb3IuCisjZGVmaW5lIEZQREZfRVJSX1hGQUxBWU9VVCA4ICAvLyBMYXlvdXQgWEZBIGVycm9yLgogCiAvLyBGdW5jdGlvbjogRlBERl9HZXRMYXN0RXJyb3IKIC8vICAgICAgICAgIEdldCBsYXN0IGVycm9yIGNvZGUgd2hlbiBhbiBTREsgZnVuY3Rpb24gZmFpbGVkLgpAQCAtMzQ4LDcgKzM3NSw4IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBBIDMyLWJpdCBpbnRlZ2VyIGluZGljYXRpbmcgZXJyb3IgY29kZXMgKGRlZmluZWQgYWJvdmUpLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBJZiB0aGUgcHJldmlvdXMgU0RLIGNhbGwgc3VjY2VlZGVkLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24KKy8vICAgICAgICAgIElmIHRoZSBwcmV2aW91cyBTREsgY2FsbCBzdWNjZWVkZWQsIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcworLy8gICAgICAgICAgZnVuY3Rpb24KIC8vICAgICAgICAgIGlzIG5vdCBkZWZpbmVkLgogLy8KIERMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRMYXN0RXJyb3IoKTsKQEAgLTM1NiwyNyArMzg0LDM0IEBACiAvLyBGdW5jdGlvbjogRlBERl9HZXREb2NQZXJtaXNzaW9uCiAvLyAgICAgICAgICBHZXQgZmlsZSBwZXJtaXNzaW9uIGZsYWdzIG9mIHRoZSBkb2N1bWVudC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50CisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEEgMzItYml0IGludGVnZXIgaW5kaWNhdGluZyBwZXJtaXNzaW9uIGZsYWdzLiBQbGVhc2UgcmVmZXIgdG8gUERGIFJlZmVyZW5jZSBmb3IKLS8vICAgICAgICAgIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBJZiB0aGUgZG9jdW1lbnQgaXMgbm90IHByb3RlY3RlZCwgMHhmZmZmZmZmZiB3aWxsIGJlIHJldHVybmVkLgorLy8gICAgICAgICAgQSAzMi1iaXQgaW50ZWdlciBpbmRpY2F0aW5nIHBlcm1pc3Npb24gZmxhZ3MuIFBsZWFzZSByZWZlciB0byBQREYKKy8vICAgICAgICAgIFJlZmVyZW5jZSBmb3IKKy8vICAgICAgICAgIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBJZiB0aGUgZG9jdW1lbnQgaXMgbm90IHByb3RlY3RlZCwgMHhmZmZmZmZmZgorLy8gICAgICAgICAgd2lsbCBiZSByZXR1cm5lZC4KIC8vCiBETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0RG9jUGVybWlzc2lvbnMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldFNlY3VyaXR5SGFuZGxlclJldmlzaW9uCiAvLyAgICAgICAgICBHZXQgdGhlIHJldmlzaW9uIGZvciBzZWN1cml0eSBoYW5kbGVyLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQKKy8vICAgICAgICAgIGZ1bmN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIHNlY3VyaXR5IGhhbmRsZXIgcmV2aXNpb24gbnVtYmVyLiBQbGVhc2UgcmVmZXIgdG8gUERGIFJlZmVyZW5jZSBmb3IKLS8vICAgICAgICAgIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBJZiB0aGUgZG9jdW1lbnQgaXMgbm90IHByb3RlY3RlZCwgLTEgd2lsbCBiZSByZXR1cm5lZC4KKy8vICAgICAgICAgIFRoZSBzZWN1cml0eSBoYW5kbGVyIHJldmlzaW9uIG51bWJlci4gUGxlYXNlIHJlZmVyIHRvIFBERiBSZWZlcmVuY2UKKy8vICAgICAgICAgIGZvcgorLy8gICAgICAgICAgZGV0YWlsZWQgZGVzY3JpcHRpb24uIElmIHRoZSBkb2N1bWVudCBpcyBub3QgcHJvdGVjdGVkLCAtMSB3aWxsIGJlCisvLyAgICAgICAgICByZXR1cm5lZC4KIC8vCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRTZWN1cml0eUhhbmRsZXJSZXZpc2lvbihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0UGFnZUNvdW50CiAvLyAgICAgICAgICBHZXQgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIGEgZG9jdW1lbnQuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUb3RhbCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGRvY3VtZW50LgogLy8KQEAgLTM4NSwyMCArNDIwLDI0IEBACiAvLyBGdW5jdGlvbjogRlBERl9Mb2FkUGFnZQogLy8gICAgICAgICAgTG9hZCBhIHBhZ2UgaW5zaWRlIGEgZG9jdW1lbnQuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLyAgICAgICAgICBwYWdlX2luZGV4ICAtICAgSW5kZXggbnVtYmVyIG9mIHRoZSBwYWdlLiAwIGZvciB0aGUgZmlyc3QgcGFnZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIEEgaGFuZGxlIHRvIHRoZSBsb2FkZWQgcGFnZS4gSWYgZmFpbGVkLCBOVUxMIGlzIHJldHVybmVkLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBMb2FkZWQgcGFnZSBjYW4gYmUgcmVuZGVyZWQgdG8gZGV2aWNlcyB1c2luZyBGUERGX1JlbmRlclBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICBMb2FkZWQgcGFnZSBjYW4gYmUgcmVuZGVyZWQgdG8gZGV2aWNlcyB1c2luZyBGUERGX1JlbmRlclBhZ2UKKy8vICAgICAgICAgIGZ1bmN0aW9uLgogLy8gICAgICAgICAgTG9hZGVkIHBhZ2UgY2FuIGJlIGNsb3NlZCBieSBGUERGX0Nsb3NlUGFnZS4KIC8vCi1ETExFWFBPUlQgRlBERl9QQUdFIFNURENBTEwgRlBERl9Mb2FkUGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgcGFnZV9pbmRleCk7CitETExFWFBPUlQgRlBERl9QQUdFIFNURENBTEwgRlBERl9Mb2FkUGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgpOwogCiAvLyBGdW5jdGlvbjogRlBERl9HZXRQYWdlV2lkdGgKIC8vICAgICAgICAgIEdldCBwYWdlIHdpZHRoLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFBhZ2Ugd2lkdGggKGV4Y2x1ZGluZyBub24tZGlzcGxheWFibGUgYXJlYSkgbWVhc3VyZWQgaW4gcG9pbnRzLgogLy8gICAgICAgICAgT25lIHBvaW50IGlzIDEvNzIgaW5jaCAoYXJvdW5kIDAuMzUyOCBtbSkuCkBAIC00MDgsNyArNDQ3LDggQEAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldFBhZ2VIZWlnaHQKIC8vICAgICAgICAgIEdldCBwYWdlIGhlaWdodC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBQYWdlIGhlaWdodCAoZXhjbHVkaW5nIG5vbi1kaXNwbGF5YWJsZSBhcmVhKSBtZWFzdXJlZCBpbiBwb2ludHMuCiAvLyAgICAgICAgICBPbmUgcG9pbnQgaXMgMS83MiBpbmNoIChhcm91bmQgMC4zNTI4IG1tKQpAQCAtNDE4LDcxICs0NTgsMTA5IEBACiAvLyBGdW5jdGlvbjogRlBERl9HZXRQYWdlU2l6ZUJ5SW5kZXgKIC8vICAgICAgICAgIEdldCB0aGUgc2l6ZSBvZiBhIHBhZ2UgYnkgaW5kZXguCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLyAgICAgICAgICBwYWdlX2luZGV4ICAtICAgUGFnZSBpbmRleCwgemVybyBmb3IgdGhlIGZpcnN0IHBhZ2UuCi0vLyAgICAgICAgICB3aWR0aCAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHBhZ2Ugd2lkdGggKGluIHBvaW50cykuCi0vLyAgICAgICAgICBoZWlnaHQgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHBhZ2UgaGVpZ2h0IChpbiBwb2ludHMpLgorLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBwYWdlIHdpZHRoCisvLyAgICAgICAgICAoaW4gcG9pbnRzKS4KKy8vICAgICAgICAgIGhlaWdodCAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcGFnZSBoZWlnaHQKKy8vICAgICAgICAgIChpbiBwb2ludHMpLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uLXplcm8gZm9yIHN1Y2Nlc3MuIDAgZm9yIGVycm9yIChkb2N1bWVudCBvciBwYWdlIG5vdCBmb3VuZCkuCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfR2V0UGFnZVNpemVCeUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBwYWdlX2luZGV4LCBkb3VibGUqIHdpZHRoLCBkb3VibGUqIGhlaWdodCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRQYWdlU2l6ZUJ5SW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogaGVpZ2h0KTsKIAogLy8gUGFnZSByZW5kZXJpbmcgZmxhZ3MuIFRoZXkgY2FuIGJlIGNvbWJpbmVkIHdpdGggYml0IE9SLgotI2RlZmluZSBGUERGX0FOTk9UICAgICAgICAgIDB4MDEgICAgICAgIC8vIFNldCBpZiBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcmVuZGVyZWQuCi0jZGVmaW5lIEZQREZfTENEX1RFWFQgICAgICAgMHgwMiAgICAgICAgLy8gU2V0IGlmIHVzaW5nIHRleHQgcmVuZGVyaW5nIG9wdGltaXplZCBmb3IgTENEIGRpc3BsYXkuCi0jZGVmaW5lIEZQREZfTk9fTkFUSVZFVEVYVCAgMHgwNCAgICAgICAgLy8gRG9uJ3QgdXNlIHRoZSBuYXRpdmUgdGV4dCBvdXRwdXQgYXZhaWxhYmxlIG9uIHNvbWUgcGxhdGZvcm1zCi0jZGVmaW5lIEZQREZfR1JBWVNDQUxFICAgICAgMHgwOCAgICAgICAgLy8gR3JheXNjYWxlIG91dHB1dC4KLSNkZWZpbmUgRlBERl9ERUJVR19JTkZPICAgICAweDgwICAgICAgICAvLyBTZXQgaWYgeW91IHdhbnQgdG8gZ2V0IHNvbWUgZGVidWcgaW5mby4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQbGVhc2UgZGlzY3VzcyB3aXRoIEZveGl0IGZpcnN0IGlmIHlvdSBuZWVkIHRvIGNvbGxlY3QgZGVidWcgaW5mby4KLSNkZWZpbmUgRlBERl9OT19DQVRDSCAgICAgICAweDEwMCAgICAgICAvLyBTZXQgaWYgeW91IGRvbid0IHdhbnQgdG8gY2F0Y2ggZXhjZXB0aW9uLgotI2RlZmluZSBGUERGX1JFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSAgIDB4MjAwICAgLy8gTGltaXQgaW1hZ2UgY2FjaGUgc2l6ZS4KLSNkZWZpbmUgRlBERl9SRU5ERVJfRk9SQ0VIQUxGVE9ORSAgICAgICAweDQwMCAgIC8vIEFsd2F5cyB1c2UgaGFsZnRvbmUgZm9yIGltYWdlIHN0cmV0Y2hpbmcuCi0jZGVmaW5lIEZQREZfUFJJTlRJTkcgICAgICAgMHg4MDAgICAvLyBSZW5kZXIgZm9yIHByaW50aW5nLgotI2RlZmluZSBGUERGX1JFVkVSU0VfQllURV9PUkRFUiAgICAgMHgxMCAgICAgICAgLy9zZXQgd2hldGhlciByZW5kZXIgaW4gYSByZXZlcnNlIEJ5dGUgb3JkZXIsIHRoaXMgZmxhZyBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VuYWJsZSB3aGVuIHJlbmRlciB0byBhIGJpdG1hcC4KKyNkZWZpbmUgRlBERl9BTk5PVCAweDAxICAvLyBTZXQgaWYgYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHJlbmRlcmVkLgorI2RlZmluZSBGUERGX0xDRF9URVhUIFwKKyAgMHgwMiAgLy8gU2V0IGlmIHVzaW5nIHRleHQgcmVuZGVyaW5nIG9wdGltaXplZCBmb3IgTENEIGRpc3BsYXkuCisjZGVmaW5lIEZQREZfTk9fTkFUSVZFVEVYVCBcCisgIDB4MDQgIC8vIERvbid0IHVzZSB0aGUgbmF0aXZlIHRleHQgb3V0cHV0IGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3JtcworI2RlZmluZSBGUERGX0dSQVlTQ0FMRSAweDA4ICAgLy8gR3JheXNjYWxlIG91dHB1dC4KKyNkZWZpbmUgRlBERl9ERUJVR19JTkZPIDB4ODAgIC8vIFNldCBpZiB5b3Ugd2FudCB0byBnZXQgc29tZSBkZWJ1ZyBpbmZvLgorLy8gUGxlYXNlIGRpc2N1c3Mgd2l0aCBGb3hpdCBmaXJzdCBpZiB5b3UgbmVlZCB0byBjb2xsZWN0IGRlYnVnIGluZm8uCisjZGVmaW5lIEZQREZfTk9fQ0FUQ0ggMHgxMDAgIC8vIFNldCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBjYXRjaCBleGNlcHRpb24uCisjZGVmaW5lIEZQREZfUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFIDB4MjAwICAvLyBMaW1pdCBpbWFnZSBjYWNoZSBzaXplLgorI2RlZmluZSBGUERGX1JFTkRFUl9GT1JDRUhBTEZUT05FIFwKKyAgMHg0MDAgICAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIHVzZSBoYWxmdG9uZSBmb3IgaW1hZ2Ugc3RyZXRjaGluZy4KKyNkZWZpbmUgRlBERl9QUklOVElORyAweDgwMCAgLy8gUmVuZGVyIGZvciBwcmludGluZy4KKyNkZWZpbmUgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIgXAorICAweDEwICAvLyBzZXQgd2hldGhlciByZW5kZXIgaW4gYSByZXZlcnNlIEJ5dGUgb3JkZXIsIHRoaXMgZmxhZyBvbmx5CisvLyBlbmFibGUgd2hlbiByZW5kZXIgdG8gYSBiaXRtYXAuCiAjaWZkZWYgX1dJTjMyCiAvLyBGdW5jdGlvbjogRlBERl9SZW5kZXJQYWdlCiAvLyAgICAgICAgICBSZW5kZXIgY29udGVudHMgaW4gYSBwYWdlIHRvIGEgZGV2aWNlIChzY3JlZW4sIGJpdG1hcCwgb3IgcHJpbnRlcikuCiAvLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIG9uIFdpbmRvd3Mgc3lzdGVtLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGRjICAgICAgICAgIC0gICBIYW5kbGUgdG8gZGV2aWNlIGNvbnRleHQuCi0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGRldmljZSBjb29yZGluYXRlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorLy8gICAgICAgICAgZnVuY3Rpb24uCisvLyAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZQorLy8gICAgICAgICAgZGV2aWNlIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGRldmljZQorLy8gICAgICAgICAgY29vcmRpbmF0ZS4KIC8vICAgICAgICAgIHNpemVfeCAgICAgIC0gICBIb3Jpem9udGFsIHNpemUgKGluIHBpeGVscykgZm9yIGRpc3BsYXlpbmcgdGhlIHBhZ2UuCiAvLyAgICAgICAgICBzaXplX3kgICAgICAtICAgVmVydGljYWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KLS8vICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMgY2xvY2t3aXNlKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAocm90YXRlZCAxODAgZGVncmVlcyksIDMgKHJvdGF0ZWQgOTAgZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSkuCi0vLyAgICAgICAgICBmbGFncyAgICAgICAtICAgMCBmb3Igbm9ybWFsIGRpc3BsYXksIG9yIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGRlZmluZWQgYWJvdmUuCisvLyAgICAgICAgICByb3RhdGUgICAgICAtICAgUGFnZSBvcmllbnRhdGlvbjogMCAobm9ybWFsKSwgMSAocm90YXRlZCA5MCBkZWdyZWVzCisvLyAgICAgICAgICBjbG9ja3dpc2UpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXItY2xvY2t3aXNlKS4KKy8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MKKy8vICAgICAgICAgIGRlZmluZWQgYWJvdmUuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byByZW5kZXIgdGhlIHBhZ2UgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byByZW5kZXIgdGhlIHBhZ2UgZm9yIHRoZSBkb2N1bWVudAorLy8gICAgICAgICAgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlKEhEQyBkYywgRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsIGludCBmbGFncyk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZShIREMgZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOwogI2VuZGlmCiAKIC8vIEZ1bmN0aW9uOiBGUERGX1JlbmRlclBhZ2VCaXRtYXAKIC8vICAgICAgICAgIFJlbmRlciBjb250ZW50cyBpbiBhIHBhZ2UgdG8gYSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoYXMgdGhlIG91dHB1dCBidWZmZXIpLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBoYW5kbGUgY2FuIGJlIGNyZWF0ZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCi0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgYml0bWFwIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGJpdG1hcCBjb29yZGluYXRlLgorLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoYXMgdGhlCisvLyAgICAgICAgICBvdXRwdXQgYnVmZmVyKS4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgaGFuZGxlIGNhbiBiZSBjcmVhdGVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KKy8vICAgICAgICAgIHN0YXJ0X3ggICAgIC0gICBMZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlCisvLyAgICAgICAgICBiaXRtYXAgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgYml0bWFwCisvLyAgICAgICAgICBjb29yZGluYXRlLgogLy8gICAgICAgICAgc2l6ZV94ICAgICAgLSAgIEhvcml6b250YWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KIC8vICAgICAgICAgIHNpemVfeSAgICAgIC0gICBWZXJ0aWNhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgotLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKS4KLS8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MgZGVmaW5lZCBhYm92ZS4KKy8vICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMKKy8vICAgICAgICAgIGNsb2Nrd2lzZSksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKHJvdGF0ZWQgMTgwIGRlZ3JlZXMpLCAzIChyb3RhdGVkIDkwIGRlZ3JlZXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlci1jbG9ja3dpc2UpLgorLy8gICAgICAgICAgZmxhZ3MgICAgICAgLSAgIDAgZm9yIG5vcm1hbCBkaXNwbGF5LCBvciBjb21iaW5hdGlvbiBvZiBmbGFncworLy8gICAgICAgICAgZGVmaW5lZCBhYm92ZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHJlbmRlciB0aGUgcGFnZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHJlbmRlciB0aGUgcGFnZSBmb3IgdGhlIGRvY3VtZW50CisvLyAgICAgICAgICBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VCaXRtYXAoRlBERl9CSVRNQVAgYml0bWFwLCBGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwgaW50IHNpemVfeSwgaW50IHJvdGF0ZSwgaW50IGZsYWdzKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlQml0bWFwKEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0Nsb3NlUGFnZQogLy8gICAgICAgICAgQ2xvc2UgYSBsb2FkZWQgUERGIHBhZ2UuCkBAIC01MDUsMTQwICs1ODMsMjI1IEBACiAvLyBGdW5jdGlvbjogRlBERl9EZXZpY2VUb1BhZ2UKIC8vICAgICAgICAgIENvbnZlcnQgdGhlIHNjcmVlbiBjb29yZGluYXRlIG9mIGEgcG9pbnQgdG8gcGFnZSBjb29yZGluYXRlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0vLyAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBkZXZpY2UgY29vcmRpbmF0ZS4KLS8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KKy8vICAgICAgICAgIHN0YXJ0X3ggICAgIC0gICBMZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlCisvLyAgICAgICAgICBkZXZpY2UgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlCisvLyAgICAgICAgICBjb29yZGluYXRlLgogLy8gICAgICAgICAgc2l6ZV94ICAgICAgLSAgIEhvcml6b250YWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KIC8vICAgICAgICAgIHNpemVfeSAgICAgIC0gICBWZXJ0aWNhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgotLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKS4KLS8vICAgICAgICAgIGRldmljZV94ICAgIC0gICBYIHZhbHVlIGluIGRldmljZSBjb29yZGluYXRlLCBmb3IgdGhlIHBvaW50IHRvIGJlIGNvbnZlcnRlZC4KLS8vICAgICAgICAgIGRldmljZV95ICAgIC0gICBZIHZhbHVlIGluIGRldmljZSBjb29yZGluYXRlLCBmb3IgdGhlIHBvaW50IHRvIGJlIGNvbnZlcnRlZC4KLS8vICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBBIFBvaW50ZXIgdG8gYSBkb3VibGUgcmVjZWl2aW5nIHRoZSBjb252ZXJ0ZWQgWCB2YWx1ZSBpbiBwYWdlIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBwYWdlX3kgICAgICAtICAgQSBQb2ludGVyIHRvIGEgZG91YmxlIHJlY2VpdmluZyB0aGUgY29udmVydGVkIFkgdmFsdWUgaW4gcGFnZSBjb29yZGluYXRlLgorLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcworLy8gICAgICAgICAgY2xvY2t3aXNlKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAocm90YXRlZCAxODAgZGVncmVlcyksIDMgKHJvdGF0ZWQgOTAgZGVncmVlcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyLWNsb2Nrd2lzZSkuCisvLyAgICAgICAgICBkZXZpY2VfeCAgICAtICAgWCB2YWx1ZSBpbiBkZXZpY2UgY29vcmRpbmF0ZSwgZm9yIHRoZSBwb2ludCB0byBiZQorLy8gICAgICAgICAgY29udmVydGVkLgorLy8gICAgICAgICAgZGV2aWNlX3kgICAgLSAgIFkgdmFsdWUgaW4gZGV2aWNlIGNvb3JkaW5hdGUsIGZvciB0aGUgcG9pbnQgdG8gYmUKKy8vICAgICAgICAgIGNvbnZlcnRlZC4KKy8vICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBBIFBvaW50ZXIgdG8gYSBkb3VibGUgcmVjZWl2aW5nIHRoZSBjb252ZXJ0ZWQgWAorLy8gICAgICAgICAgdmFsdWUgaW4gcGFnZSBjb29yZGluYXRlLgorLy8gICAgICAgICAgcGFnZV95ICAgICAgLSAgIEEgUG9pbnRlciB0byBhIGRvdWJsZSByZWNlaXZpbmcgdGhlIGNvbnZlcnRlZCBZCisvLyAgICAgICAgICB2YWx1ZSBpbiBwYWdlIGNvb3JkaW5hdGUuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBUaGUgcGFnZSBjb29yZGluYXRlIHN5c3RlbSBoYXMgaXRzIG9yaWdpbiBhdCBsZWZ0LWJvdHRvbSBjb3JuZXIgb2YgdGhlIHBhZ2UsIHdpdGggWCBheGlzIGdvZXMgYWxvbmcKLS8vICAgICAgICAgIHRoZSBib3R0b20gc2lkZSB0byB0aGUgcmlnaHQsIGFuZCBZIGF4aXMgZ29lcyBhbG9uZyB0aGUgbGVmdCBzaWRlIHVwd2FyZC4gTk9URTogdGhpcyBjb29yZGluYXRlIHN5c3RlbQotLy8gICAgICAgICAgY2FuIGJlIGFsdGVyZWQgd2hlbiB5b3Ugem9vbSwgc2Nyb2xsLCBvciByb3RhdGUgYSBwYWdlLCBob3dldmVyLCBhIHBvaW50IG9uIHRoZSBwYWdlIHNob3VsZCBhbHdheXMgaGF2ZQorLy8gICAgICAgICAgVGhlIHBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW0gaGFzIGl0cyBvcmlnaW4gYXQgbGVmdC1ib3R0b20gY29ybmVyIG9mCisvLyAgICAgICAgICB0aGUgcGFnZSwgd2l0aCBYIGF4aXMgZ29lcyBhbG9uZworLy8gICAgICAgICAgdGhlIGJvdHRvbSBzaWRlIHRvIHRoZSByaWdodCwgYW5kIFkgYXhpcyBnb2VzIGFsb25nIHRoZSBsZWZ0IHNpZGUKKy8vICAgICAgICAgIHVwd2FyZC4gTk9URTogdGhpcyBjb29yZGluYXRlIHN5c3RlbQorLy8gICAgICAgICAgY2FuIGJlIGFsdGVyZWQgd2hlbiB5b3Ugem9vbSwgc2Nyb2xsLCBvciByb3RhdGUgYSBwYWdlLCBob3dldmVyLCBhCisvLyAgICAgICAgICBwb2ludCBvbiB0aGUgcGFnZSBzaG91bGQgYWx3YXlzIGhhdmUKIC8vICAgICAgICAgIHRoZSBzYW1lIGNvb3JkaW5hdGUgdmFsdWVzIGluIHRoZSBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLgogLy8KLS8vICAgICAgICAgIFRoZSBkZXZpY2UgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgZGV2aWNlIGRlcGVuZGVudC4gRm9yIHNjcmVlbiBkZXZpY2UsIGl0cyBvcmlnaW4gaXMgYXQgbGVmdC10b3AKLS8vICAgICAgICAgIGNvcm5lciBvZiB0aGUgd2luZG93LiBIb3dldmVyIHRoaXMgb3JpZ2luIGNhbiBiZSBhbHRlcmVkIGJ5IFdpbmRvd3MgY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvbgotLy8gICAgICAgICAgdXRpbGl0aWVzLiBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95IGFuZCByb3RhdGUgcGFyYW1ldGVycyBoYXZlIGV4YWN0bHkKKy8vICAgICAgICAgIFRoZSBkZXZpY2UgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgZGV2aWNlIGRlcGVuZGVudC4gRm9yIHNjcmVlbiBkZXZpY2UsCisvLyAgICAgICAgICBpdHMgb3JpZ2luIGlzIGF0IGxlZnQtdG9wCisvLyAgICAgICAgICBjb3JuZXIgb2YgdGhlIHdpbmRvdy4gSG93ZXZlciB0aGlzIG9yaWdpbiBjYW4gYmUgYWx0ZXJlZCBieSBXaW5kb3dzCisvLyAgICAgICAgICBjb29yZGluYXRlIHRyYW5zZm9ybWF0aW9uCisvLyAgICAgICAgICB1dGlsaXRpZXMuIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3kKKy8vICAgICAgICAgIGFuZCByb3RhdGUgcGFyYW1ldGVycyBoYXZlIGV4YWN0bHkKIC8vICAgICAgICAgIHNhbWUgdmFsdWVzIGFzIHlvdSB1c2VkIGluIEZQREZfUmVuZGVyUGFnZSgpIGZ1bmN0aW9uIGNhbGwuCiAvLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0RldmljZVRvUGFnZShGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwgaW50IGRldmljZV94LCBpbnQgZGV2aWNlX3ksIGRvdWJsZSogcGFnZV94LCBkb3VibGUqIHBhZ2VfeSk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRGV2aWNlVG9QYWdlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYWdlX3kpOwogCiAvLyBGdW5jdGlvbjogRlBERl9QYWdlVG9EZXZpY2UKIC8vICAgICAgICAgIENvbnZlcnQgdGhlIHBhZ2UgY29vcmRpbmF0ZSBvZiBhIHBvaW50IHRvIHNjcmVlbiBjb29yZGluYXRlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0vLyAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBkZXZpY2UgY29vcmRpbmF0ZS4KLS8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KKy8vICAgICAgICAgIHN0YXJ0X3ggICAgIC0gICBMZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlCisvLyAgICAgICAgICBkZXZpY2UgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlCisvLyAgICAgICAgICBjb29yZGluYXRlLgogLy8gICAgICAgICAgc2l6ZV94ICAgICAgLSAgIEhvcml6b250YWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KIC8vICAgICAgICAgIHNpemVfeSAgICAgIC0gICBWZXJ0aWNhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgotLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKS4KLS8vICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBYIHZhbHVlIGluIHBhZ2UgY29vcmRpbmF0ZSwgZm9yIHRoZSBwb2ludCB0byBiZSBjb252ZXJ0ZWQuCi0vLyAgICAgICAgICBwYWdlX3kgICAgICAtICAgWSB2YWx1ZSBpbiBwYWdlIGNvb3JkaW5hdGUsIGZvciB0aGUgcG9pbnQgdG8gYmUgY29udmVydGVkLgotLy8gICAgICAgICAgZGV2aWNlX3ggICAgLSAgIEEgcG9pbnRlciB0byBhbiBpbnRlZ2VyIHJlY2VpdmluZyB0aGUgcmVzdWx0IFggdmFsdWUgaW4gZGV2aWNlIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBkZXZpY2VfeSAgICAtICAgQSBwb2ludGVyIHRvIGFuIGludGVnZXIgcmVjZWl2aW5nIHRoZSByZXN1bHQgWSB2YWx1ZSBpbiBkZXZpY2UgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMKKy8vICAgICAgICAgIGNsb2Nrd2lzZSksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKHJvdGF0ZWQgMTgwIGRlZ3JlZXMpLCAzIChyb3RhdGVkIDkwIGRlZ3JlZXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlci1jbG9ja3dpc2UpLgorLy8gICAgICAgICAgcGFnZV94ICAgICAgLSAgIFggdmFsdWUgaW4gcGFnZSBjb29yZGluYXRlLCBmb3IgdGhlIHBvaW50IHRvIGJlCisvLyAgICAgICAgICBjb252ZXJ0ZWQuCisvLyAgICAgICAgICBwYWdlX3kgICAgICAtICAgWSB2YWx1ZSBpbiBwYWdlIGNvb3JkaW5hdGUsIGZvciB0aGUgcG9pbnQgdG8gYmUKKy8vICAgICAgICAgIGNvbnZlcnRlZC4KKy8vICAgICAgICAgIGRldmljZV94ICAgIC0gICBBIHBvaW50ZXIgdG8gYW4gaW50ZWdlciByZWNlaXZpbmcgdGhlIHJlc3VsdCBYIHZhbHVlCisvLyAgICAgICAgICBpbiBkZXZpY2UgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIGRldmljZV95ICAgIC0gICBBIHBvaW50ZXIgdG8gYW4gaW50ZWdlciByZWNlaXZpbmcgdGhlIHJlc3VsdCBZIHZhbHVlCisvLyAgICAgICAgICBpbiBkZXZpY2UgY29vcmRpbmF0ZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIFNlZSBjb21tZW50cyBvZiBGUERGX0RldmljZVRvUGFnZSgpIGZ1bmN0aW9uLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9QYWdlVG9EZXZpY2UoRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3ksIGludCogZGV2aWNlX3gsIGludCogZGV2aWNlX3kpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1BhZ2VUb0RldmljZShGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRldmljZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRldmljZV95KTsKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfQ3JlYXRlCiAvLyAgICAgICAgICBDcmVhdGUgYSBGb3hpdCBEZXZpY2UgSW5kZXBlbmRlbnQgQml0bWFwIChGWERJQikuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIE51bWJlciBvZiBwaXhlbHMgaW4gYSBob3Jpem9udGFsIGxpbmUgb2YgdGhlIGJpdG1hcC4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KLS8vICAgICAgICAgIGhlaWdodCAgICAgIC0gICBOdW1iZXIgb2YgcGl4ZWxzIGluIGEgdmVydGljYWwgbGluZSBvZiB0aGUgYml0bWFwLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgotLy8gICAgICAgICAgYWxwaGEgICAgICAgLSAgIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYWxwaGEgY2hhbm5lbCBpcyB1c2VkLiBOb24temVybyBmb3IgdXNpbmcgYWxwaGEsIHplcm8gZm9yIG5vdCB1c2luZy4KKy8vICAgICAgICAgIHdpZHRoICAgICAgIC0gICBOdW1iZXIgb2YgcGl4ZWxzIGluIGEgaG9yaXpvbnRhbCBsaW5lIG9mIHRoZSBiaXRtYXAuCisvLyAgICAgICAgICBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorLy8gICAgICAgICAgaGVpZ2h0ICAgICAgLSAgIE51bWJlciBvZiBwaXhlbHMgaW4gYSB2ZXJ0aWNhbCBsaW5lIG9mIHRoZSBiaXRtYXAuCisvLyAgICAgICAgICBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorLy8gICAgICAgICAgYWxwaGEgICAgICAgLSAgIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYWxwaGEgY2hhbm5lbCBpcyB1c2VkLgorLy8gICAgICAgICAgTm9uLXplcm8gZm9yIHVzaW5nIGFscGhhLCB6ZXJvIGZvciBub3QgdXNpbmcuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBUaGUgY3JlYXRlZCBiaXRtYXAgaGFuZGxlLCBvciBOVUxMIGlmIHBhcmFtZXRlciBlcnJvciBvciBvdXQgb2YgbWVtb3J5LgorLy8gICAgICAgICAgVGhlIGNyZWF0ZWQgYml0bWFwIGhhbmRsZSwgb3IgTlVMTCBpZiBwYXJhbWV0ZXIgZXJyb3Igb3Igb3V0IG9mCisvLyAgICAgICAgICBtZW1vcnkuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIEFuIEZYRElCIGFsd2F5cyB1c2UgNCBieXRlIHBlciBwaXhlbC4gVGhlIGZpcnN0IGJ5dGUgb2YgYSBwaXhlbCBpcyBhbHdheXMgZG91YmxlIHdvcmQgYWxpZ25lZC4KLS8vICAgICAgICAgIEVhY2ggcGl4ZWwgY29udGFpbnMgcmVkIChSKSwgZ3JlZW4gKEcpLCBibHVlIChCKSBhbmQgb3B0aW9uYWxseSBhbHBoYSAoQSkgdmFsdWVzLgotLy8gICAgICAgICAgVGhlIGJ5dGUgb3JkZXIgaXMgQkdSeCAodGhlIGxhc3QgYnl0ZSB1bnVzZWQgaWYgbm8gYWxwaGEgY2hhbm5lbCkgb3IgQkdSQS4KKy8vICAgICAgICAgIEFuIEZYRElCIGFsd2F5cyB1c2UgNCBieXRlIHBlciBwaXhlbC4gVGhlIGZpcnN0IGJ5dGUgb2YgYSBwaXhlbCBpcworLy8gICAgICAgICAgYWx3YXlzIGRvdWJsZSB3b3JkIGFsaWduZWQuCisvLyAgICAgICAgICBFYWNoIHBpeGVsIGNvbnRhaW5zIHJlZCAoUiksIGdyZWVuIChHKSwgYmx1ZSAoQikgYW5kIG9wdGlvbmFsbHkKKy8vICAgICAgICAgIGFscGhhIChBKSB2YWx1ZXMuCisvLyAgICAgICAgICBUaGUgYnl0ZSBvcmRlciBpcyBCR1J4ICh0aGUgbGFzdCBieXRlIHVudXNlZCBpZiBubyBhbHBoYSBjaGFubmVsKSBvcgorLy8gICAgICAgICAgQkdSQS4KIC8vCi0vLyAgICAgICAgICBUaGUgcGl4ZWxzIGluIGEgaG9yaXpvbnRhbCBsaW5lIChhbHNvIGNhbGxlZCBzY2FuIGxpbmUpIGFyZSBzdG9yZWQgc2lkZSBieSBzaWRlLCB3aXRoIGxlZnQgbW9zdAotLy8gICAgICAgICAgcGl4ZWwgc3RvcmVkIGZpcnN0ICh3aXRoIGxvd2VyIG1lbW9yeSBhZGRyZXNzKS4gRWFjaCBzY2FuIGxpbmUgdXNlcyB3aWR0aCo0IGJ5dGVzLgorLy8gICAgICAgICAgVGhlIHBpeGVscyBpbiBhIGhvcml6b250YWwgbGluZSAoYWxzbyBjYWxsZWQgc2NhbiBsaW5lKSBhcmUgc3RvcmVkCisvLyAgICAgICAgICBzaWRlIGJ5IHNpZGUsIHdpdGggbGVmdCBtb3N0CisvLyAgICAgICAgICBwaXhlbCBzdG9yZWQgZmlyc3QgKHdpdGggbG93ZXIgbWVtb3J5IGFkZHJlc3MpLiBFYWNoIHNjYW4gbGluZSB1c2VzCisvLyAgICAgICAgICB3aWR0aCo0IGJ5dGVzLgogLy8KLS8vICAgICAgICAgIFNjYW4gbGluZXMgYXJlIHN0b3JlZCBvbmUgYWZ0ZXIgYW5vdGhlciwgd2l0aCB0b3AgbW9zdCBzY2FuIGxpbmUgc3RvcmVkIGZpcnN0LiBUaGVyZSBpcyBubyBnYXAKKy8vICAgICAgICAgIFNjYW4gbGluZXMgYXJlIHN0b3JlZCBvbmUgYWZ0ZXIgYW5vdGhlciwgd2l0aCB0b3AgbW9zdCBzY2FuIGxpbmUKKy8vICAgICAgICAgIHN0b3JlZCBmaXJzdC4gVGhlcmUgaXMgbm8gZ2FwCiAvLyAgICAgICAgICBiZXR3ZWVuIGFkamFjZW50IHNjYW4gbGluZXMuCiAvLwotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgZW5vdWdoIG1lbW9yeSBmb3IgaG9sZGluZyBhbGwgcGl4ZWxzIGluIHRoZSBiaXRtYXAsIGJ1dCBpdCBkb2Vzbid0Ci0vLyAgICAgICAgICBpbml0aWFsaXplIHRoZSBidWZmZXIuIEFwcGxpY2F0aW9ucyBjYW4gdXNlIEZQREZCaXRtYXBfRmlsbFJlY3QgdG8gZmlsbCB0aGUgYml0bWFwIHVzaW5nIGFueSBjb2xvci4KLURMTEVYUE9SVCBGUERGX0JJVE1BUCBTVERDQUxMIEZQREZCaXRtYXBfQ3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGFscGhhKTsKKy8vICAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGVub3VnaCBtZW1vcnkgZm9yIGhvbGRpbmcgYWxsIHBpeGVscyBpbiB0aGUKKy8vICAgICAgICAgIGJpdG1hcCwgYnV0IGl0IGRvZXNuJ3QKKy8vICAgICAgICAgIGluaXRpYWxpemUgdGhlIGJ1ZmZlci4gQXBwbGljYXRpb25zIGNhbiB1c2UgRlBERkJpdG1hcF9GaWxsUmVjdCB0bworLy8gICAgICAgICAgZmlsbCB0aGUgYml0bWFwIHVzaW5nIGFueSBjb2xvci4KK0RMTEVYUE9SVCBGUERGX0JJVE1BUCBTVERDQUxMIEZQREZCaXRtYXBfQ3JlYXRlKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEpOwogCiAvLyBNb3JlIERJQiBmb3JtYXRzCi0jZGVmaW5lIEZQREZCaXRtYXBfR3JheSAgICAgMSAgICAgICAvLyBHcmF5IHNjYWxlIGJpdG1hcCwgb25lIGJ5dGUgcGVyIHBpeGVsLgotI2RlZmluZSBGUERGQml0bWFwX0JHUiAgICAgIDIgICAgICAgLy8gMyBieXRlcyBwZXIgcGl4ZWwsIGJ5dGUgb3JkZXI6IGJsdWUsIGdyZWVuLCByZWQuCi0jZGVmaW5lIEZQREZCaXRtYXBfQkdSeCAgICAgMyAgICAgICAvLyA0IGJ5dGVzIHBlciBwaXhlbCwgYnl0ZSBvcmRlcjogYmx1ZSwgZ3JlZW4sIHJlZCwgdW51c2VkLgotI2RlZmluZSBGUERGQml0bWFwX0JHUkEgICAgIDQgICAgICAgLy8gNCBieXRlcyBwZXIgcGl4ZWwsIGJ5dGUgb3JkZXI6IGJsdWUsIGdyZWVuLCByZWQsIGFscGhhLgorI2RlZmluZSBGUERGQml0bWFwX0dyYXkgMSAgLy8gR3JheSBzY2FsZSBiaXRtYXAsIG9uZSBieXRlIHBlciBwaXhlbC4KKyNkZWZpbmUgRlBERkJpdG1hcF9CR1IgMiAgIC8vIDMgYnl0ZXMgcGVyIHBpeGVsLCBieXRlIG9yZGVyOiBibHVlLCBncmVlbiwgcmVkLgorI2RlZmluZSBGUERGQml0bWFwX0JHUnggXAorICAzICAvLyA0IGJ5dGVzIHBlciBwaXhlbCwgYnl0ZSBvcmRlcjogYmx1ZSwgZ3JlZW4sIHJlZCwgdW51c2VkLgorI2RlZmluZSBGUERGQml0bWFwX0JHUkEgXAorICA0ICAvLyA0IGJ5dGVzIHBlciBwaXhlbCwgYnl0ZSBvcmRlcjogYmx1ZSwgZ3JlZW4sIHJlZCwgYWxwaGEuCiAKIC8vIEZ1bmN0aW9uOiBGUERGQml0bWFwX0NyZWF0ZUV4CiAvLyAgICAgICAgICBDcmVhdGUgYSBGb3hpdCBEZXZpY2UgSW5kZXBlbmRlbnQgQml0bWFwIChGWERJQikKIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB3aWR0aCAgICAgICAtICAgTnVtYmVyIG9mIHBpeGVscyBpbiBhIGhvcml6b250YWwgbGluZSBvZiB0aGUgYml0bWFwLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgotLy8gICAgICAgICAgaGVpZ2h0ICAgICAgLSAgIE51bWJlciBvZiBwaXhlbHMgaW4gYSB2ZXJ0aWNhbCBsaW5lIG9mIHRoZSBiaXRtYXAuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCi0vLyAgICAgICAgICBmb3JtYXQgICAgICAtICAgQSBudW1iZXIgaW5kaWNhdGluZyBmb3IgYml0bWFwIGZvcm1hdCwgYXMgZGVmaW5lZCBhYm92ZS4KLS8vICAgICAgICAgIGZpcnN0X3NjYW4gIC0gICBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgZmlyc3Qgc2NhbiBsaW5lLCBmb3IgZXh0ZXJuYWwgYnVmZmVyCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgb25seS4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgTlVMTCwgdGhlbiB0aGUgU0RLIHdpbGwgY3JlYXRlIGl0cyBvd24gYnVmZmVyLgotLy8gICAgICAgICAgc3RyaWRlICAgICAgLSAgIE51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBzY2FuIGxpbmUsIGZvciBleHRlcm5hbCBidWZmZXIgb25seS4uCisvLyAgICAgICAgICB3aWR0aCAgICAgICAtICAgTnVtYmVyIG9mIHBpeGVscyBpbiBhIGhvcml6b250YWwgbGluZSBvZiB0aGUgYml0bWFwLgorLy8gICAgICAgICAgTXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KKy8vICAgICAgICAgIGhlaWdodCAgICAgIC0gICBOdW1iZXIgb2YgcGl4ZWxzIGluIGEgdmVydGljYWwgbGluZSBvZiB0aGUgYml0bWFwLgorLy8gICAgICAgICAgTXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KKy8vICAgICAgICAgIGZvcm1hdCAgICAgIC0gICBBIG51bWJlciBpbmRpY2F0aW5nIGZvciBiaXRtYXAgZm9ybWF0LCBhcyBkZWZpbmVkCisvLyAgICAgICAgICBhYm92ZS4KKy8vICAgICAgICAgIGZpcnN0X3NjYW4gIC0gICBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgZmlyc3Qgc2NhbiBsaW5lLCBmb3IKKy8vICAgICAgICAgIGV4dGVybmFsIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkuIElmIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwsIHRoZW4gdGhlIFNESyB3aWxsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlIGl0cyBvd24gYnVmZmVyLgorLy8gICAgICAgICAgc3RyaWRlICAgICAgLSAgIE51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBzY2FuIGxpbmUsIGZvciBleHRlcm5hbAorLy8gICAgICAgICAgYnVmZmVyIG9ubHkuLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIGNyZWF0ZWQgYml0bWFwIGhhbmRsZSwgb3IgTlVMTCBpZiBwYXJhbWV0ZXIgZXJyb3Igb3Igb3V0IG9mIG1lbW9yeS4KKy8vICAgICAgICAgIFRoZSBjcmVhdGVkIGJpdG1hcCBoYW5kbGUsIG9yIE5VTEwgaWYgcGFyYW1ldGVyIGVycm9yIG9yIG91dCBvZgorLy8gICAgICAgICAgbWVtb3J5LgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBTaW1pbGFyIHRvIEZQREZCaXRtYXBfQ3JlYXRlIGZ1bmN0aW9uLCB3aXRoIG1vcmUgZm9ybWF0cyBhbmQgZXh0ZXJuYWwgYnVmZmVyIHN1cHBvcnRlZC4KLS8vICAgICAgICAgIEJpdG1hcCBjcmVhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gYW55IHBsYWNlIHRoYXQgYSBGUERGX0JJVE1BUCBoYW5kbGUgaXMKKy8vICAgICAgICAgIFNpbWlsYXIgdG8gRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24sIHdpdGggbW9yZSBmb3JtYXRzIGFuZAorLy8gICAgICAgICAgZXh0ZXJuYWwgYnVmZmVyIHN1cHBvcnRlZC4KKy8vICAgICAgICAgIEJpdG1hcCBjcmVhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gYW55IHBsYWNlIHRoYXQgYQorLy8gICAgICAgICAgRlBERl9CSVRNQVAgaGFuZGxlIGlzCiAvLyAgICAgICAgICByZXF1aXJlZC4KIC8vCi0vLyAgICAgICAgICBJZiBleHRlcm5hbCBzY2FubGluZSBidWZmZXIgaXMgdXNlZCwgdGhlbiB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlc3Ryb3kgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgSWYgZXh0ZXJuYWwgc2NhbmxpbmUgYnVmZmVyIGlzIHVzZWQsIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHNob3VsZAorLy8gICAgICAgICAgZGVzdHJveSB0aGUgYnVmZmVyCiAvLyAgICAgICAgICBieSBpdHNlbGYuIEZQREZCaXRtYXBfRGVzdHJveSBmdW5jdGlvbiB3aWxsIG5vdCBkZXN0cm95IHRoZSBidWZmZXIuCiAvLwotRExMRVhQT1JUIEZQREZfQklUTUFQIFNURENBTEwgRlBERkJpdG1hcF9DcmVhdGVFeChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIHZvaWQqIGZpcnN0X3NjYW4sIGludCBzdHJpZGUpOworRExMRVhQT1JUIEZQREZfQklUTUFQIFNURENBTEwgRlBERkJpdG1hcF9DcmVhdGVFeChpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZpcnN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpOwogCiAvLyBGdW5jdGlvbjogRlBERkJpdG1hcF9GaWxsUmVjdAogLy8gICAgICAgICAgRmlsbCBhIHJlY3RhbmdsZSBhcmVhIGluIGFuIEZYRElCLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBUaGUgaGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgbGVmdCAgICAgICAgLSAgIFRoZSBsZWZ0IHNpZGUgcG9zaXRpb24uIFN0YXJ0aW5nIGZyb20gMCBhdCB0aGUgbGVmdC1tb3N0IHBpeGVsLgotLy8gICAgICAgICAgdG9wICAgICAgICAgLSAgIFRoZSB0b3Agc2lkZSBwb3NpdGlvbi4gU3RhcnRpbmcgZnJvbSAwIGF0IHRoZSB0b3AtbW9zdCBzY2FuIGxpbmUuCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgVGhlIGhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCisvLyAgICAgICAgICBsZWZ0ICAgICAgICAtICAgVGhlIGxlZnQgc2lkZSBwb3NpdGlvbi4gU3RhcnRpbmcgZnJvbSAwIGF0IHRoZQorLy8gICAgICAgICAgbGVmdC1tb3N0IHBpeGVsLgorLy8gICAgICAgICAgdG9wICAgICAgICAgLSAgIFRoZSB0b3Agc2lkZSBwb3NpdGlvbi4gU3RhcnRpbmcgZnJvbSAwIGF0IHRoZQorLy8gICAgICAgICAgdG9wLW1vc3Qgc2NhbiBsaW5lLgogLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIE51bWJlciBvZiBwaXhlbHMgdG8gYmUgZmlsbGVkIGluIGVhY2ggc2NhbiBsaW5lLgogLy8gICAgICAgICAgaGVpZ2h0ICAgICAgLSAgIE51bWJlciBvZiBzY2FuIGxpbmVzIHRvIGJlIGZpbGxlZC4KLS8vICAgICAgICAgIGNvbG9yICAgICAgIC0gICBBIDMyLWJpdCB2YWx1ZSBzcGVjaWZpbmcgdGhlIGNvbG9yLCBpbiA4ODg4IEFSR0IgZm9ybWF0LgorLy8gICAgICAgICAgY29sb3IgICAgICAgLSAgIEEgMzItYml0IHZhbHVlIHNwZWNpZmluZyB0aGUgY29sb3IsIGluIDg4ODggQVJHQgorLy8gICAgICAgICAgZm9ybWF0LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiBzZXQgdGhlIGNvbG9yIGFuZCAob3B0aW9uYWxseSkgYWxwaGEgdmFsdWUgaW4gc3BlY2lmaWVkIHJlZ2lvbiBvZiB0aGUgYml0bWFwLgotLy8gICAgICAgICAgTk9URTogSWYgYWxwaGEgY2hhbm5lbCBpcyB1c2VkLCB0aGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGNvbXBvc2l0ZSB0aGUgYmFja2dyb3VuZCB3aXRoIHRoZSBzb3VyY2UgY29sb3IsCi0vLyAgICAgICAgICBpbnN0ZWFkIHRoZSBiYWNrZ3JvdW5kIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHNvdXJjZSBjb2xvciBhbmQgYWxwaGEuCisvLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgY29sb3IgYW5kIChvcHRpb25hbGx5KSBhbHBoYSB2YWx1ZSBpbgorLy8gICAgICAgICAgc3BlY2lmaWVkIHJlZ2lvbiBvZiB0aGUgYml0bWFwLgorLy8gICAgICAgICAgTk9URTogSWYgYWxwaGEgY2hhbm5lbCBpcyB1c2VkLCB0aGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGNvbXBvc2l0ZSB0aGUKKy8vICAgICAgICAgIGJhY2tncm91bmQgd2l0aCB0aGUgc291cmNlIGNvbG9yLAorLy8gICAgICAgICAgaW5zdGVhZCB0aGUgYmFja2dyb3VuZCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBzb3VyY2UgY29sb3IgYW5kCisvLyAgICAgICAgICBhbHBoYS4KIC8vICAgICAgICAgIElmIGFscGhhIGNoYW5uZWwgaXMgbm90IHVzZWQsIHRoZSAiYWxwaGEiIHBhcmFtZXRlciBpcyBpZ25vcmVkLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkJpdG1hcF9GaWxsUmVjdChGUERGX0JJVE1BUCBiaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZQREZfRFdPUkQgY29sb3IpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGQml0bWFwX0ZpbGxSZWN0KEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgY29sb3IpOwogCiAvLyBGdW5jdGlvbjogRlBERkJpdG1hcF9HZXRCdWZmZXIKIC8vICAgICAgICAgIEdldCBkYXRhIGJ1ZmZlciBvZiBhbiBGWERJQgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBiaXRtYXAgYnVmZmVyLgogLy8gQ29tbWVudHM6CiAvLyAgICAgICAgICBUaGUgc3RyaWRlIG1heSBiZSBtb3JlIHRoYW4gd2lkdGggKiBudW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsCi0vLyAgICAgICAgICBBcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGUgYml0bWFwIGJ1ZmZlciBwb2ludGVyLCB0aGVuIG1hbmlwdWxhdGUgYW55IGNvbG9yCisvLyAgICAgICAgICBBcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGUgYml0bWFwIGJ1ZmZlciBwb2ludGVyLAorLy8gICAgICAgICAgdGhlbiBtYW5pcHVsYXRlIGFueSBjb2xvcgogLy8gICAgICAgICAgYW5kL29yIGFscGhhIHZhbHVlcyBmb3IgYW55IHBpeGVscyBpbiB0aGUgYml0bWFwLgogRExMRVhQT1JUIHZvaWQqIFNURENBTEwgRlBERkJpdG1hcF9HZXRCdWZmZXIoRlBERl9CSVRNQVAgYml0bWFwKTsKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfR2V0V2lkdGgKIC8vICAgICAgICAgIEdldCB3aWR0aCBvZiBhbiBGWERJQi4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieSBGUERGQml0bWFwX0NyZWF0ZQorLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgbnVtYmVyIG9mIHBpeGVscyBpbiBhIGhvcml6b250YWwgbGluZSBvZiB0aGUgYml0bWFwLgogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZCaXRtYXBfR2V0V2lkdGgoRlBERl9CSVRNQVAgYml0bWFwKTsKQEAgLTY0Niw3ICs4MDksOCBAQAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfR2V0SGVpZ2h0CiAvLyAgICAgICAgICBHZXQgaGVpZ2h0IG9mIGFuIEZYRElCLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIGEgdmVydGljYWwgbGluZSBvZiB0aGUgYml0bWFwLgogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZCaXRtYXBfR2V0SGVpZ2h0KEZQREZfQklUTUFQIGJpdG1hcCk7CkBAIC02NTQsNyArODE4LDggQEAKIC8vIEZ1bmN0aW9uOiBGUERGQml0bWFwX0dldFN0cmlkZQogLy8gICAgICAgICAgR2V0IG51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBzY2FuIGxpbmUgaW4gdGhlIGJpdG1hcCBidWZmZXIuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieSBGUERGQml0bWFwX0NyZWF0ZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUKKy8vICAgICAgICAgIGZ1bmN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBzY2FuIGxpbmUgaW4gdGhlIGJpdG1hcCBidWZmZXIuCiAvLyBDb21tZW50czoKQEAgLTY2NCw3ICs4MjksOCBAQAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfRGVzdHJveQogLy8gICAgICAgICAgRGVzdHJveSBhbiBGWERJQiBhbmQgcmVsZWFzZSBhbGwgcmVsYXRlZCBidWZmZXJzLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBDb21tZW50czoKQEAgLTY3OSw3ICs4NDUsOCBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9WSUVXRVJSRUZfR2V0UHJpbnRTY2FsaW5nKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX1ZJRVdFUlJFRl9HZXRQcmludFNjYWxpbmcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1ZJRVdFUlJFRl9HZXROdW1Db3BpZXMKIC8vICAgICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBjb3BpZXMgdG8gYmUgcHJpbnRlZC4KQEAgLTY5NywxNiArODY0LDE5IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgcHJpbnQgcGFnZSByYW5nZSB0byBiZSB1c2VkIGZvciBwcmludGluZy4KIC8vCi1ETExFWFBPUlQgRlBERl9QQUdFUkFOR0UgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXRQcmludFBhZ2VSYW5nZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKK0RMTEVYUE9SVCBGUERGX1BBR0VSQU5HRSBTVERDQUxMCitGUERGX1ZJRVdFUlJFRl9HZXRQcmludFBhZ2VSYW5nZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfVklFV0VSUkVGX0dldER1cGxleAotLy8gICAgICAgICAgUmV0dXJucyB0aGUgcGFwZXIgaGFuZGxpbmcgb3B0aW9uIHRvIGJlIHVzZWQgd2hlbiBwcmludGluZyBmcm9tIHByaW50IGRpYWxvZy4KKy8vICAgICAgICAgIFJldHVybnMgdGhlIHBhcGVyIGhhbmRsaW5nIG9wdGlvbiB0byBiZSB1c2VkIHdoZW4gcHJpbnRpbmcgZnJvbQorLy8gICAgICAgICAgcHJpbnQgZGlhbG9nLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGxvYWRlZCBkb2N1bWVudC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBwYXBlciBoYW5kbGluZyBvcHRpb24gdG8gYmUgdXNlZCB3aGVuIHByaW50aW5nLgogLy8KLURMTEVYUE9SVCBGUERGX0RVUExFWFRZUEUgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXREdXBsZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CitETExFWFBPUlQgRlBERl9EVVBMRVhUWVBFIFNURENBTEwKK0ZQREZfVklFV0VSUkVGX0dldER1cGxleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfQ291bnROYW1lZERlc3RzCiAvLyAgICAgICAgICBHZXQgdGhlIGNvdW50IG9mIG5hbWVkIGRlc3RpbmF0aW9ucyBpbiB0aGUgUERGIGRvY3VtZW50LgpAQCAtNzI0LDI0ICs4OTQsMzMgQEAKIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBoYW5kbGUgb2YgdGhlIGRlc3QuCiAvLwotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0QnlOYW1lKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQllURVNUUklORyBuYW1lKTsKK0RMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGX0dldE5hbWVkRGVzdEJ5TmFtZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBuYW1lKTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0TmFtZWREZXN0CiAvLyAgICAgICAgICBHZXQgdGhlIHNwZWNpZmllZCBuYW1lZCBkZXN0aW5hdGlvbnMgb2YgdGhlIFBERiBkb2N1bWVudCBieSBpbmRleC4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBhIGRvY3VtZW50CiAvLyAgICAgICAgICBpbmRleCAgICAgICAgICAgLSAgIFRoZSBpbmRleCBvZiBuYW1lZCBkZXN0aW5hdGlvbi4KLS8vICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAtICAgVGhlIGJ1ZmZlciB0byBvYnRhaW4gZGVzdGluYXRpb24gbmFtZSwgdXNlZCBhcyB3Y2hhcl90Ki4KLS8vICAgICAgICAgIGJ1ZmxlbiBbaW4vb3V0XSAtICAgU2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzIG9uIGlucHV0LCBsZW5ndGggb2YgdGhlIHJlc3VsdCBpbiBieXRlcyBvbiBvdXRwdXQgb3IgLTEgaWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCisvLyAgICAgICAgICBidWZmZXIgICAgICAgICAgLSAgIFRoZSBidWZmZXIgdG8gb2J0YWluIGRlc3RpbmF0aW9uIG5hbWUsIHVzZWQgYXMKKy8vICAgICAgICAgIHdjaGFyX3QqLgorLy8gICAgICAgICAgYnVmbGVuIFtpbi9vdXRdIC0gICBTaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMgb24gaW5wdXQsIGxlbmd0aCBvZgorLy8gICAgICAgICAgdGhlIHJlc3VsdCBpbiBieXRlcyBvbiBvdXRwdXQgb3IgLTEgaWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBUaGUgZGVzdGluYXRpb24gaGFuZGxlIG9mIGEgbmFtZWQgZGVzdGluYXRpb24sIG9yIE5VTEwgaWYgbm8gbmFtZWQgZGVzdGluYXRpb24gY29ycmVzcG9uZGluZyB0byB8aW5kZXh8LgorLy8gICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIGhhbmRsZSBvZiBhIG5hbWVkIGRlc3RpbmF0aW9uLCBvciBOVUxMIGlmIG5vIG5hbWVkCisvLyAgICAgICAgICBkZXN0aW5hdGlvbiBjb3JyZXNwb25kaW5nIHRvIHxpbmRleHwuCiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIENhbGwgdGhpcyBmdW5jdGlvbiB0d2ljZSB0byBnZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGRlc3RpbmF0aW9uOgogLy8gICAgICAgICAgMSkgRmlyc3QgdGltZSBwYXNzIGluIHxidWZmZXJ8IGFzIE5VTEwgYW5kIGdldCBidWZsZW4uCi0vLyAgICAgICAgICAyKSBTZWNvbmQgdGltZSBwYXNzIGluIGFsbG9jYXRlZCB8YnVmZmVyfCBhbmQgYnVmbGVuIHRvIHJldHJpZXZlIHxidWZmZXJ8LCB3aGljaCBzaG91bGQgYmUgdXNlZCBhcyB3Y2hhcl90Ki4KLS8vICAgICAgICAgICAgIElmIGJ1ZmxlbiBpcyBub3Qgc3VmZmljaWVudGx5IGxhcmdlLCBpdCB3aWxsIGJlIHNldCB0byAtMSB1cG9uIHJldHVybi4KKy8vICAgICAgICAgIDIpIFNlY29uZCB0aW1lIHBhc3MgaW4gYWxsb2NhdGVkIHxidWZmZXJ8IGFuZCBidWZsZW4gdG8gcmV0cmlldmUKKy8vICAgICAgICAgIHxidWZmZXJ8LCB3aGljaCBzaG91bGQgYmUgdXNlZCBhcyB3Y2hhcl90Ki4KKy8vICAgICAgICAgICAgIElmIGJ1ZmxlbiBpcyBub3Qgc3VmZmljaWVudGx5IGxhcmdlLCBpdCB3aWxsIGJlIHNldCB0byAtMSB1cG9uCisvLyAgICAgICAgICAgICByZXR1cm4uCiAvLwotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBpbmRleCwgdm9pZCogYnVmZmVyLCBsb25nKiBidWZsZW4pOworRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKiBidWZsZW4pOwogCiAvLyBGdW5jdGlvbjogRlBERl9CU3RyX0luaXQKIC8vICAgICAgICAgIEhlbHBlciBmdW5jdGlvbiB0byBpbml0aWFsaXplIGEgYnl0ZSBzdHJpbmcuCkBAIC03NDksNyArOTI4LDkgQEAKIAogLy8gRnVuY3Rpb246IEZQREZfQlN0cl9TZXQKIC8vICAgICAgICAgIEhlbHBlciBmdW5jdGlvbiB0byBzZXQgc3RyaW5nIGRhdGEuCi1ETExFWFBPUlQgRlBERl9SRVNVTFQgU1REQ0FMTCBGUERGX0JTdHJfU2V0KEZQREZfQlNUUiogc3RyLCBGUERGX0xQQ1NUUiBic3RyLCBpbnQgbGVuZ3RoKTsKK0RMTEVYUE9SVCBGUERGX1JFU1VMVCBTVERDQUxMIEZQREZfQlN0cl9TZXQoRlBERl9CU1RSKiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTFBDU1RSIGJzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOwogCiAvLyBGdW5jdGlvbjogRlBERl9CU3RyX0NsZWFyCiAvLyAgICAgICAgICBIZWxwZXIgZnVuY3Rpb24gdG8gY2xlYXIgYSBieXRlIHN0cmluZy4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvaW1hZ2VfZGlmZl9wbmcuaCBiL3NhbXBsZXMvaW1hZ2VfZGlmZl9wbmcuaAppbmRleCA5ZmViYjM3Li43ZTBhZmVjIDEwMDY0NAotLS0gYS9zYW1wbGVzL2ltYWdlX2RpZmZfcG5nLmgKKysrIGIvc2FtcGxlcy9pbWFnZV9kaWZmX3BuZy5oCkBAIC0xMiw5ICsxMiwxMSBAQAogbmFtZXNwYWNlIGltYWdlX2RpZmZfcG5nIHsKIAogLy8gRGVjb2RlIGEgUE5HIGludG8gYW4gUkdCQSBwaXhlbCBhcnJheS4KLWJvb2wgRGVjb2RlUE5HKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LCBzaXplX3QgaW5wdXRfc2l6ZSwKK2Jvb2wgRGVjb2RlUE5HKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LAorICAgICAgICAgICAgICAgc2l6ZV90IGlucHV0X3NpemUsCiAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0cHV0LAotICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworICAgICAgICAgICAgICAgaW50KiB3aWR0aCwKKyAgICAgICAgICAgICAgIGludCogaGVpZ2h0KTsKIAogLy8gRW5jb2RlIGFuIFJHQkEgcGl4ZWwgYXJyYXkgaW50byBhIFBORy4KIGJvb2wgRW5jb2RlUkdCQVBORyhjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5jcHAgYi90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuY3BwCmluZGV4IGQ4MTlkOWMuLmQ2MjgxMGQgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5jcHAKKysrIGIvdGVzdGluZy9lbWJlZGRlcl90ZXN0LmNwcApAQCAtMzgsMTggKzM4LDE4IEBACiAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gb3BlbjogJXNcbiIsIGZpbGVuYW1lKTsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQotICAodm9pZCkgZnNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOworICAodm9pZClmc2VlayhmaWxlLCAwLCBTRUVLX0VORCk7CiAgIHNpemVfdCBmaWxlX2xlbmd0aCA9IGZ0ZWxsKGZpbGUpOwogICBpZiAoIWZpbGVfbGVuZ3RoKSB7CiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KLSAgKHZvaWQpIGZzZWVrKGZpbGUsIDAsIFNFRUtfU0VUKTsKLSAgY2hhciogYnVmZmVyID0gKGNoYXIqKSBtYWxsb2MoZmlsZV9sZW5ndGgpOworICAodm9pZClmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7CisgIGNoYXIqIGJ1ZmZlciA9IChjaGFyKiltYWxsb2MoZmlsZV9sZW5ndGgpOwogICBpZiAoIWJ1ZmZlcikgewogICAgIHJldHVybiBudWxscHRyOwogICB9CiAgIHNpemVfdCBieXRlc19yZWFkID0gZnJlYWQoYnVmZmVyLCAxLCBmaWxlX2xlbmd0aCwgZmlsZSk7Ci0gICh2b2lkKSBmY2xvc2UoZmlsZSk7CisgICh2b2lkKWZjbG9zZShmaWxlKTsKICAgaWYgKGJ5dGVzX3JlYWQgIT0gZmlsZV9sZW5ndGgpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZWFkOiAlc1xuIiwgZmlsZW5hbWUpOwogICAgIGZyZWUoYnVmZmVyKTsKQEAgLTY3LDcgKzY3LDcgQEAKICAgc3RkOjpzdHJpbmcgcmVzdWx0OwogICBpZiAoIWV4ZV9wYXRoLmVtcHR5KCkpIHsKICAgICBzaXplX3QgbGFzdF9zZXBhcmF0b3IgPSBleGVfcGF0aC5yZmluZChQQVRIX1NFUEFSQVRPUik7Ci0gICAgaWYgKGxhc3Rfc2VwYXJhdG9yICE9IHN0ZDo6c3RyaW5nOjpucG9zKSAgeworICAgIGlmIChsYXN0X3NlcGFyYXRvciAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgcmVzdWx0ID0gZXhlX3BhdGguc3Vic3RyKDAsIGxhc3Rfc2VwYXJhdG9yICsgMSk7CiAgICAgfQogICB9CkBAIC0xMDMsMTMgKzEwMywxNSBAQAogfTsKIAogVGVzdExvYWRlcjo6VGVzdExvYWRlcihjb25zdCBjaGFyKiBwQnVmLCBzaXplX3QgbGVuKQotICAgIDogbV9wQnVmKHBCdWYpLCBtX0xlbihsZW4pIHsKLX0KKyAgICA6IG1fcEJ1ZihwQnVmKSwgbV9MZW4obGVuKSB7fQogCi1pbnQgR2V0X0Jsb2NrKHZvaWQqIHBhcmFtLCB1bnNpZ25lZCBsb25nIHBvcywgdW5zaWduZWQgY2hhciogcEJ1ZiwKK2ludCBHZXRfQmxvY2sodm9pZCogcGFyYW0sCisgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcG9zLAorICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBwQnVmLAogICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpIHsKLSAgVGVzdExvYWRlciogcExvYWRlciA9IChUZXN0TG9hZGVyKikgcGFyYW07Ci0gIGlmIChwb3MgKyBzaXplIDwgcG9zIHx8IHBvcyArIHNpemUgPiBwTG9hZGVyLT5tX0xlbikgcmV0dXJuIDA7CisgIFRlc3RMb2FkZXIqIHBMb2FkZXIgPSAoVGVzdExvYWRlciopcGFyYW07CisgIGlmIChwb3MgKyBzaXplIDwgcG9zIHx8IHBvcyArIHNpemUgPiBwTG9hZGVyLT5tX0xlbikKKyAgICByZXR1cm4gMDsKICAgbWVtY3B5KHBCdWYsIHBMb2FkZXItPm1fcEJ1ZiArIHBvcywgc2l6ZSk7CiAgIHJldHVybiAxOwogfQpAQCAtMTE4LDExICsxMjAsMTAgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQWRkX1NlZ21lbnQoRlhfRE9XTkxPQURISU5UUyogcFRoaXMsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci19Cit2b2lkIEFkZF9TZWdtZW50KEZYX0RPV05MT0FESElOVFMqIHBUaGlzLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkge30KIAotRW1iZWRkZXJUZXN0OjpFbWJlZGRlclRlc3QoKSA6Ci0gICAgICBkb2N1bWVudF8obnVsbHB0ciksCitFbWJlZGRlclRlc3Q6OkVtYmVkZGVyVGVzdCgpCisgICAgOiBkb2N1bWVudF8obnVsbHB0ciksCiAgICAgICBmb3JtX2hhbmRsZV8obnVsbHB0ciksCiAgICAgICBhdmFpbF8obnVsbHB0ciksCiAgICAgICBsb2FkZXJfKG51bGxwdHIpLApAQCAtMTQwLDMyICsxNDEsMzIgQEAKIH0KIAogdm9pZCBFbWJlZGRlclRlc3Q6OlNldFVwKCkgewotICAgIHY4OjpWODo6SW5pdGlhbGl6ZUlDVSgpOworICB2ODo6Vjg6OkluaXRpYWxpemVJQ1UoKTsKIAotICAgIHBsYXRmb3JtXyA9IHY4OjpwbGF0Zm9ybTo6Q3JlYXRlRGVmYXVsdFBsYXRmb3JtKCk7Ci0gICAgdjg6OlY4OjpJbml0aWFsaXplUGxhdGZvcm0ocGxhdGZvcm1fKTsKLSAgICB2ODo6Vjg6OkluaXRpYWxpemUoKTsKKyAgcGxhdGZvcm1fID0gdjg6OnBsYXRmb3JtOjpDcmVhdGVEZWZhdWx0UGxhdGZvcm0oKTsKKyAgdjg6OlY4OjpJbml0aWFsaXplUGxhdGZvcm0ocGxhdGZvcm1fKTsKKyAgdjg6OlY4OjpJbml0aWFsaXplKCk7CiAKLSAgICAvLyBCeSBlbmFibGluZyBwcmVkaWN0YWJsZSBtb2RlLCBWOCB3b24ndCBwb3N0IGFueSBiYWNrZ3JvdW5kIHRhc2tzLgotICAgIGNvbnN0IGNoYXIgcHJlZGljdGFibGVfZmxhZ1tdID0gIi0tcHJlZGljdGFibGUiOwotICAgIHY4OjpWODo6U2V0RmxhZ3NGcm9tU3RyaW5nKHByZWRpY3RhYmxlX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdHJsZW4ocHJlZGljdGFibGVfZmxhZykpKTsKKyAgLy8gQnkgZW5hYmxpbmcgcHJlZGljdGFibGUgbW9kZSwgVjggd29uJ3QgcG9zdCBhbnkgYmFja2dyb3VuZCB0YXNrcy4KKyAgY29uc3QgY2hhciBwcmVkaWN0YWJsZV9mbGFnW10gPSAiLS1wcmVkaWN0YWJsZSI7CisgIHY4OjpWODo6U2V0RmxhZ3NGcm9tU3RyaW5nKHByZWRpY3RhYmxlX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RybGVuKHByZWRpY3RhYmxlX2ZsYWcpKSk7CiAKICNpZmRlZiBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCi0gICAgQVNTRVJUX1RSVUUoR2V0RXh0ZXJuYWxEYXRhKGdfZXhlX3BhdGhfLCAibmF0aXZlc19ibG9iLmJpbiIsICZuYXRpdmVzXykpOwotICAgIEFTU0VSVF9UUlVFKEdldEV4dGVybmFsRGF0YShnX2V4ZV9wYXRoXywgInNuYXBzaG90X2Jsb2IuYmluIiwgJnNuYXBzaG90XykpOwotICAgIHY4OjpWODo6U2V0TmF0aXZlc0RhdGFCbG9iKCZuYXRpdmVzXyk7Ci0gICAgdjg6OlY4OjpTZXRTbmFwc2hvdERhdGFCbG9iKCZzbmFwc2hvdF8pOworICBBU1NFUlRfVFJVRShHZXRFeHRlcm5hbERhdGEoZ19leGVfcGF0aF8sICJuYXRpdmVzX2Jsb2IuYmluIiwgJm5hdGl2ZXNfKSk7CisgIEFTU0VSVF9UUlVFKEdldEV4dGVybmFsRGF0YShnX2V4ZV9wYXRoXywgInNuYXBzaG90X2Jsb2IuYmluIiwgJnNuYXBzaG90XykpOworICB2ODo6Vjg6OlNldE5hdGl2ZXNEYXRhQmxvYigmbmF0aXZlc18pOworICB2ODo6Vjg6OlNldFNuYXBzaG90RGF0YUJsb2IoJnNuYXBzaG90Xyk7CiAjZW5kaWYgIC8vIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKIAotICAgIEZQREZfSW5pdExpYnJhcnkoKTsKKyAgRlBERl9Jbml0TGlicmFyeSgpOwogCi0gICAgVU5TVVBQT1JUX0lORk8qIGluZm8gPSBzdGF0aWNfY2FzdDxVTlNVUFBPUlRfSU5GTyo+KHRoaXMpOwotICAgIG1lbXNldChpbmZvLCAwLCBzaXplb2YoVU5TVVBQT1JUX0lORk8pKTsKLSAgICBpbmZvLT52ZXJzaW9uID0gMTsKLSAgICBpbmZvLT5GU0RLX1VuU3VwcG9ydF9IYW5kbGVyID0gVW5zdXBwb3J0ZWRIYW5kbGVyVHJhbXBvbGluZTsKLSAgICBGU0RLX1NldFVuU3BPYmpQcm9jZXNzSGFuZGxlcihpbmZvKTsKLSAgfQorICBVTlNVUFBPUlRfSU5GTyogaW5mbyA9IHN0YXRpY19jYXN0PFVOU1VQUE9SVF9JTkZPKj4odGhpcyk7CisgIG1lbXNldChpbmZvLCAwLCBzaXplb2YoVU5TVVBQT1JUX0lORk8pKTsKKyAgaW5mby0+dmVyc2lvbiA9IDE7CisgIGluZm8tPkZTREtfVW5TdXBwb3J0X0hhbmRsZXIgPSBVbnN1cHBvcnRlZEhhbmRsZXJUcmFtcG9saW5lOworICBGU0RLX1NldFVuU3BPYmpQcm9jZXNzSGFuZGxlcihpbmZvKTsKK30KIAogdm9pZCBFbWJlZGRlclRlc3Q6OlRlYXJEb3duKCkgewogICBpZiAoZG9jdW1lbnRfKSB7CkBAIC0yMDMsNyArMjA0LDcgQEAKICAgaGludHNfLkFkZFNlZ21lbnQgPSBBZGRfU2VnbWVudDsKIAogICBhdmFpbF8gPSBGUERGQXZhaWxfQ3JlYXRlKCZmaWxlX2F2YWlsXywgJmZpbGVfYWNjZXNzXyk7Ci0gICh2b2lkKSBGUERGQXZhaWxfSXNEb2NBdmFpbChhdmFpbF8sICZoaW50c18pOworICAodm9pZClGUERGQXZhaWxfSXNEb2NBdmFpbChhdmFpbF8sICZoaW50c18pOwogCiAgIGlmICghRlBERkF2YWlsX0lzTGluZWFyaXplZChhdmFpbF8pKSB7CiAgICAgZG9jdW1lbnRfID0gRlBERl9Mb2FkQ3VzdG9tRG9jdW1lbnQoJmZpbGVfYWNjZXNzXywgbnVsbHB0cik7CkBAIC0yMTQsMTMgKzIxNSwxMiBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBpbnQgZG9jVHlwZSA9IERPQ1RZUEVfUERGOwotICBpZiAoRlBERl9IYXNYRkFGaWVsZChkb2N1bWVudF8sICZkb2NUeXBlKSkKLSAgeworICBpZiAoRlBERl9IYXNYRkFGaWVsZChkb2N1bWVudF8sICZkb2NUeXBlKSkgewogICAgIGlmIChkb2NUeXBlICE9IERPQ1RZUEVfUERGKQotICAgICAgKHZvaWQpIEZQREZfTG9hZFhGQShkb2N1bWVudF8pOworICAgICAgKHZvaWQpRlBERl9Mb2FkWEZBKGRvY3VtZW50Xyk7CiAgIH0KLSAgKHZvaWQpIEZQREZfR2V0RG9jUGVybWlzc2lvbnMoZG9jdW1lbnRfKTsKLSAgKHZvaWQpIEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChhdmFpbF8sICZoaW50c18pOworICAodm9pZClGUERGX0dldERvY1Blcm1pc3Npb25zKGRvY3VtZW50Xyk7CisgICh2b2lkKUZQREZBdmFpbF9Jc0Zvcm1BdmFpbChhdmFpbF8sICZoaW50c18pOwogCiAgIElQREZfSlNQTEFURk9STSogcGxhdGZvcm0gPSBzdGF0aWNfY2FzdDxJUERGX0pTUExBVEZPUk0qPih0aGlzKTsKICAgbWVtc2V0KHBsYXRmb3JtLCAwLCBzaXplb2YoSVBERl9KU1BMQVRGT1JNKSk7CkBAIC0yNDgsMTQgKzI0OCwxNCBAQAogCiBpbnQgRW1iZWRkZXJUZXN0OjpHZXRGaXJzdFBhZ2VOdW0oKSB7CiAgIGludCBmaXJzdF9wYWdlID0gRlBERkF2YWlsX0dldEZpcnN0UGFnZU51bShkb2N1bWVudF8pOwotICAodm9pZCkgRlBERkF2YWlsX0lzUGFnZUF2YWlsKGF2YWlsXywgZmlyc3RfcGFnZSwgJmhpbnRzXyk7CisgICh2b2lkKUZQREZBdmFpbF9Jc1BhZ2VBdmFpbChhdmFpbF8sIGZpcnN0X3BhZ2UsICZoaW50c18pOwogICByZXR1cm4gZmlyc3RfcGFnZTsKIH0KIAogaW50IEVtYmVkZGVyVGVzdDo6R2V0UGFnZUNvdW50KCkgewogICBpbnQgcGFnZV9jb3VudCA9IEZQREZfR2V0UGFnZUNvdW50KGRvY3VtZW50Xyk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgKytpKSB7Ci0gICAgKHZvaWQpIEZQREZBdmFpbF9Jc1BhZ2VBdmFpbChhdmFpbF8sIGksICZoaW50c18pOworICAgICh2b2lkKUZQREZBdmFpbF9Jc1BhZ2VBdmFpbChhdmFpbF8sIGksICZoaW50c18pOwogICB9CiAgIHJldHVybiBwYWdlX2NvdW50OwogfQpAQCAtMzA1LDcgKzMwNSw4IEBACiAKIC8vIHN0YXRpYwogaW50IEVtYmVkZGVyVGVzdDo6U2V0VGltZXJUcmFtcG9saW5lKEZQREZfRk9STUZJTExJTkZPKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtc2VjcywgVGltZXJDYWxsYmFjayBmbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtc2VjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lckNhbGxiYWNrIGZuKSB7CiAgIEVtYmVkZGVyVGVzdCogdGVzdCA9IHN0YXRpY19jYXN0PEVtYmVkZGVyVGVzdCo+KGluZm8pOwogICByZXR1cm4gdGVzdC0+ZGVsZWdhdGVfLT5TZXRUaW1lcihtc2VjcywgZm4pOwogfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9lbWJlZGRlcl90ZXN0LmggYi90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaAppbmRleCAwYWM2OGQ1Li40YmQ5ZDk3IDEwMDY0NAotLS0gYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaAorKysgYi90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaApAQCAtMjUsMTQgKzI1LDE2IEBACiAgcHVibGljOgogICBjbGFzcyBEZWxlZ2F0ZSB7CiAgICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+RGVsZWdhdGUoKSB7IH0KKyAgICB2aXJ0dWFsIH5EZWxlZ2F0ZSgpIHt9CiAKICAgICAvLyBFcXVpdmFsZW50IHRvIFVOU1VQUE9SVF9JTkZPOjpGU0RLX1VuU3VwcG9ydF9IYW5kbGVyKCkuCi0gICAgdmlydHVhbCB2b2lkIFVuc3VwcG9ydGVkSGFuZGxlcihpbnQgdHlwZSkgeyB9CisgICAgdmlydHVhbCB2b2lkIFVuc3VwcG9ydGVkSGFuZGxlcihpbnQgdHlwZSkge30KIAogICAgIC8vIEVxdWl2YWxlbnQgdG8gSVBERl9KU1BMQVRGT1JNOjphcHBfYWxlcnQoKS4KLSAgICB2aXJ0dWFsIGludCBBbGVydChGUERGX1dJREVTVFJJTkcgbWVzc2FnZSwgRlBERl9XSURFU1RSSU5HIHRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgaWNvbikgeworICAgIHZpcnR1YWwgaW50IEFsZXJ0KEZQREZfV0lERVNUUklORyBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaWNvbikgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC00MCw3ICs0Miw3IEBACiAgICAgdmlydHVhbCBpbnQgU2V0VGltZXIoaW50IG1zZWNzLCBUaW1lckNhbGxiYWNrIGZuKSB7IHJldHVybiAwOyB9CiAKICAgICAvLyBFcXVpdmFsZW50IHRvIEZQREZfRk9STUZJTExJTkZPOjpGRklfS2lsbFRpbWVyKCkuCi0gICAgdmlydHVhbCB2b2lkIEtpbGxUaW1lcihpbnQgaWQpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBLaWxsVGltZXIoaW50IGlkKSB7fQogICB9OwogCiAgIEVtYmVkZGVyVGVzdCgpOwpAQCAtOTUsOSArOTcsMTMgQEAKIAogIHByaXZhdGU6CiAgIHN0YXRpYyB2b2lkIFVuc3VwcG9ydGVkSGFuZGxlclRyYW1wb2xpbmUoVU5TVVBQT1JUX0lORk8qLCBpbnQgdHlwZSk7Ci0gIHN0YXRpYyBpbnQgQWxlcnRUcmFtcG9saW5lKElQREZfSlNQTEFURk9STSogcGxhZm9ybSwgRlBERl9XSURFU1RSSU5HIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB0aXRsZSwgaW50IHR5cGUsIGludCBpY29uKTsKLSAgc3RhdGljIGludCBTZXRUaW1lclRyYW1wb2xpbmUoRlBERl9GT1JNRklMTElORk8qIGluZm8sIGludCBtc2VjcywKKyAgc3RhdGljIGludCBBbGVydFRyYW1wb2xpbmUoSVBERl9KU1BMQVRGT1JNKiBwbGFmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGljb24pOworICBzdGF0aWMgaW50IFNldFRpbWVyVHJhbXBvbGluZShGUERGX0ZPUk1GSUxMSU5GTyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zZWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lckNhbGxiYWNrIGZuKTsKICAgc3RhdGljIHZvaWQgS2lsbFRpbWVyVHJhbXBvbGluZShGUERGX0ZPUk1GSUxMSU5GTyogaW5mbywgaW50IGlkKTsKIH07CmRpZmYgLS1naXQgYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3RfbW9ja19kZWxlZ2F0ZS5oIGIvdGVzdGluZy9lbWJlZGRlcl90ZXN0X21vY2tfZGVsZWdhdGUuaAppbmRleCAxZTRlOTk1Li40N2U3OTVhIDEwMDY0NAotLS0gYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3RfbW9ja19kZWxlZ2F0ZS5oCisrKyBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF9tb2NrX2RlbGVnYXRlLmgKQEAgLTExLDExICsxMSwxMSBAQAogY2xhc3MgRW1iZWRkZXJUZXN0TW9ja0RlbGVnYXRlIDogcHVibGljIEVtYmVkZGVyVGVzdDo6RGVsZWdhdGUgewogIHB1YmxpYzoKICAgTU9DS19NRVRIT0QxKFVuc3VwcG9ydGVkSGFuZGxlciwgdm9pZChpbnQgdHlwZSkpOwotICBNT0NLX01FVEhPRDQoQWxlcnQsIGludChGUERGX1dJREVTVFJJTkcgbWVzc2FnZSwgRlBERl9XSURFU1RSSU5HIHRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgaW50IGljb24pKTsKKyAgTU9DS19NRVRIT0Q0KAorICAgICAgQWxlcnQsCisgICAgICBpbnQoRlBERl9XSURFU1RSSU5HIG1lc3NhZ2UsIEZQREZfV0lERVNUUklORyB0aXRsZSwgaW50IHR5cGUsIGludCBpY29uKSk7CiAgIE1PQ0tfTUVUSE9EMihTZXRUaW1lciwgaW50KGludCBtc2VjcywgVGltZXJDYWxsYmFjayBmbikpOwogICBNT0NLX01FVEhPRDEoS2lsbFRpbWVyLCB2b2lkKGludCBtc2VjcykpOwogfTsKIAogI2VuZGlmICAvLyBURVNUSU5HX0VNQkVEREVSX1RFU1RfTU9DS19ERUxFR0FURV9IXwotCmRpZmYgLS1naXQgYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3RfdGltZXJfaGFuZGxpbmdfZGVsZWdhdGUuaCBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF90aW1lcl9oYW5kbGluZ19kZWxlZ2F0ZS5oCmluZGV4IGQwNWExMzQuLmFjYTRhYzEgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF90aW1lcl9oYW5kbGluZ19kZWxlZ2F0ZS5oCisrKyBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF90aW1lcl9oYW5kbGluZ19kZWxlZ2F0ZS5oCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSAiZW1iZWRkZXJfdGVzdC5oIgogCiBjbGFzcyBFbWJlZGRlclRlc3RUaW1lckhhbmRsaW5nRGVsZWdhdGUgOiBwdWJsaWMgRW1iZWRkZXJUZXN0OjpEZWxlZ2F0ZSB7Ci1wdWJsaWM6CisgcHVibGljOgogICBpbnQgU2V0VGltZXIoaW50IG1zZWNzLCBUaW1lckNhbGxiYWNrIGZuKSBvdmVycmlkZSB7CiAgICAgZXhwaXJ5X3RvX3RpbWVyX21hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxpbnQsIFRpbWVyPigKICAgICAgICAgbXNlY3MgKyBpbWFnaW5hcnlfZWxhcHNlZF9tc2Vjc18sIFRpbWVyKCsrbmV4dF90aW1lcl9pZF8sIGZuKSkpOwpAQCAtNDQsMTEgKzQ0LDExIEBACiAgICAgfQogICB9CiAKLXByb3RlY3RlZDoKLSAgdXNpbmcgVGltZXIgPSBzdGQ6OnBhaXI8aW50LCBUaW1lckNhbGxiYWNrPjsgIC8vIElELCBjYWxsYmFjayBwYWlyLgorIHByb3RlY3RlZDoKKyAgdXNpbmcgVGltZXIgPSBzdGQ6OnBhaXI8aW50LCBUaW1lckNhbGxiYWNrPjsgICAgIC8vIElELCBjYWxsYmFjayBwYWlyLgogICBzdGQ6Om11bHRpbWFwPGludCwgVGltZXI+IGV4cGlyeV90b190aW1lcl9tYXBfOyAgLy8gS2V5ZWQgYnkgdGltZW91dC4KICAgaW50IG5leHRfdGltZXJfaWRfID0gMDsKICAgaW50IGltYWdpbmFyeV9lbGFwc2VkX21zZWNzXyA9IDA7CiB9OwogCi0jZW5kaWYgLy8gVEVTVElOR19FTUJFRERFUl9URVNUX1RJTUVSX0hBTkRMSU5HX0RFTEVHQVRFX0hfCisjZW5kaWYgIC8vIFRFU1RJTkdfRU1CRURERVJfVEVTVF9USU1FUl9IQU5ETElOR19ERUxFR0FURV9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCBiL3Rlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgKaW5kZXggMTNiNGFmYi4uMjg4MGY4NCAxMDA2NDQKLS0tIGEvdGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaAorKysgYi90ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oCkBAIC0xNiw0ICsxNiwzIEBACiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwogCiAjZW5kaWYgIC8vIFRFU1RJTkdfRlhfU1RSX1RFU1RIRUxQRVJTX0hfCi0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2ZveGl0eGZhLmggYi94ZmEvaW5jbHVkZS9mb3hpdHhmYS5oCmluZGV4IDI2YWI2Y2QuLmMwN2RiZDkgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2ZveGl0eGZhLmgKKysrIGIveGZhL2luY2x1ZGUvZm94aXR4ZmEuaApAQCAtNCw3ICs0LDcgQEAKIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQogDQotI2lmbmRlZglfRk9YSVRfWEZBX0hfDQorI2lmbmRlZiBfRk9YSVRfWEZBX0hfDQogI2RlZmluZSBfRk9YSVRfWEZBX0hfDQogI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCINCiAjaW5jbHVkZSAiLi4vLi4vY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCINCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcmNsaXBib2FyZG1nci5oIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJjbGlwYm9hcmRtZ3IuaAppbmRleCA1NTI1MGYzLi42ZmI2MjkyIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcmNsaXBib2FyZG1nci5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVyY2xpcGJvYXJkbWdyLmgKQEAgLTgsMzAgKzgsMjcgQEAKICNkZWZpbmUgX0ZXTF9BREFQVEVSX0NMSVBCT0FSRE1HUl9IDQogDQogZW51bSBGV0xfQ0xJUEJPQVJERk9STUFUIHsNCi0gICAgRldMX0NMSVBCT0FSREZPUk1BVF9EaWIsDQotICAgIEZXTF9DTElQQk9BUkRGT1JNQVRfVGV4dCwNCi0gICAgRldMX0NMSVBCT0FSREZPUk1BVF9VbmNvZGVUZXh0LA0KKyAgRldMX0NMSVBCT0FSREZPUk1BVF9EaWIsDQorICBGV0xfQ0xJUEJPQVJERk9STUFUX1RleHQsDQorICBGV0xfQ0xJUEJPQVJERk9STUFUX1VuY29kZVRleHQsDQogfTsNCi10eXBlZGVmIHN0cnVjdCBfRldMX0hDTElQQk9BUkREQVRBIHsNCi0gICAgdm9pZCogcERhdGE7DQotfSAqIEZXTF9IQ0xJUEJPQVJEREFUQTsNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hDTElQQk9BUkREQVRBIHsgdm9pZCogcERhdGE7IH0gKiBGV0xfSENMSVBCT0FSRERBVEE7DQogDQotY2xhc3MgSUZXTF9BZGFwdGVyQ2xpcGJvYXJkTWdyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZXTF9BZGFwdGVyQ2xpcGJvYXJkTWdyKCkge30NCi0gICAgdmlydHVhbCBGV0xfRVJSCQlFbXB0eSgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc0RhdGFBdmFpbGFibGUoRlhfRFdPUkQgZHdGb3JtYXQpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfSENMSVBCT0FSRERBVEEJR2V0RGF0YShGWF9EV09SRCBkd0Zvcm1hdCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldERhdGEoRlhfRFdPUkQgZHdGb3JtYXQsIHVpbnQ4X3QgKnBCdWYsIGludDMyX3QgaVNpemUpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldERhdGFTaXplKEZXTF9IQ0xJUEJPQVJEREFUQSBoRGF0YSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQqCUxvY2tEYXRhQnVmZmVyKEZXTF9IQ0xJUEJPQVJEREFUQSBoRGF0YSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVVuTG9ja0RhdGFCdWZmZXIoRldMX0hDTElQQk9BUkREQVRBIGhEYXRhKSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0U3RyaW5nRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzKSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0U3RyaW5nRGF0YShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzKSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0U3RyaW5nRGF0YShDRlhfV2lkZVN0cmluZyAmd3MpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRTdHJpbmdEYXRhKENGWF9CeXRlU3RyaW5nICZicykgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUVudW1Gb3JtYXRzKENGWF9EV29yZEFycmF5ICZmb3JtYXRzKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJUmVnaXN0ZXJGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1hdCkgPSAwOw0KK2NsYXNzIElGV0xfQWRhcHRlckNsaXBib2FyZE1nciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfQWRhcHRlckNsaXBib2FyZE1ncigpIHt9DQorICB2aXJ0dWFsIEZXTF9FUlIgRW1wdHkoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQXZhaWxhYmxlKEZYX0RXT1JEIGR3Rm9ybWF0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9IQ0xJUEJPQVJEREFUQSBHZXREYXRhKEZYX0RXT1JEIGR3Rm9ybWF0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0RGF0YShGWF9EV09SRCBkd0Zvcm1hdCwgdWludDhfdCogcEJ1ZiwgaW50MzJfdCBpU2l6ZSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldERhdGFTaXplKEZXTF9IQ0xJUEJPQVJEREFUQSBoRGF0YSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkKiBMb2NrRGF0YUJ1ZmZlcihGV0xfSENMSVBCT0FSRERBVEEgaERhdGEpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbkxvY2tEYXRhQnVmZmVyKEZXTF9IQ0xJUEJPQVJEREFUQSBoRGF0YSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFN0cmluZ0RhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3cykgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFN0cmluZ0RhdGEoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBicykgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFN0cmluZ0RhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0U3RyaW5nRGF0YShDRlhfQnl0ZVN0cmluZyYgYnMpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBFbnVtRm9ybWF0cyhDRlhfRFdvcmRBcnJheSYgZm9ybWF0cykgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBSZWdpc3RlckZvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybWF0KSA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcmN1cnNvcm1nci5oIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJjdXJzb3JtZ3IuaAppbmRleCBiMDNiZTY2Li5kZTNhNTMzIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcmN1cnNvcm1nci5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVyY3Vyc29ybWdyLmgKQEAgLTksMzEgKzksMzAgQEAKIGNsYXNzIENGWF9ESUJpdG1hcDsNCiBjbGFzcyBJRldMX0FkYXB0ZXJDdXJzb3JNZ3I7DQogZW51bSBGV0xfQ1VSU09SVFlQRSB7DQotICAgIEZXTF9DVVJTT1JUWVBFX0Fycm93ID0gMCwNCi0gICAgRldMX0NVUlNPUlRZUEVfQ3Jvc3MsDQotICAgIEZXTF9DVVJTT1JUWVBFX0hhbmQsDQotICAgIEZXTF9DVVJTT1JUWVBFX0lucHV0QmVhbSwNCi0gICAgRldMX0NVUlNPUlRZUEVfV2FpdCwNCi0gICAgRldMX0NVUlNPUlRZUEVfU2l6ZUFsbCwNCi0gICAgRldMX0NVUlNPUlRZUEVfU2l6ZU5XU0UsDQotICAgIEZXTF9DVVJTT1JUWVBFX1NpemVORVNXLA0KLSAgICBGV0xfQ1VSU09SVFlQRV9TaXplV0UsDQotICAgIEZXTF9DVVJTT1JUWVBFX1NpemVOUywNCi0gICAgRldMX0NVUlNPUlRZUEVfUHJvaGliaXRpb24sDQotICAgIEZXTF9DVVJTT1JUWVBFX0hlbHANCisgIEZXTF9DVVJTT1JUWVBFX0Fycm93ID0gMCwNCisgIEZXTF9DVVJTT1JUWVBFX0Nyb3NzLA0KKyAgRldMX0NVUlNPUlRZUEVfSGFuZCwNCisgIEZXTF9DVVJTT1JUWVBFX0lucHV0QmVhbSwNCisgIEZXTF9DVVJTT1JUWVBFX1dhaXQsDQorICBGV0xfQ1VSU09SVFlQRV9TaXplQWxsLA0KKyAgRldMX0NVUlNPUlRZUEVfU2l6ZU5XU0UsDQorICBGV0xfQ1VSU09SVFlQRV9TaXplTkVTVywNCisgIEZXTF9DVVJTT1JUWVBFX1NpemVXRSwNCisgIEZXTF9DVVJTT1JUWVBFX1NpemVOUywNCisgIEZXTF9DVVJTT1JUWVBFX1Byb2hpYml0aW9uLA0KKyAgRldMX0NVUlNPUlRZUEVfSGVscA0KIH07DQotdHlwZWRlZiBzdHJ1Y3QgX0ZXTF9IQ1VSU09SIHsNCi0gICAgdm9pZCogcERhdGE7DQotfSAqRldMX0hDVVJTT1I7DQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9IQ1VSU09SIHsgdm9pZCogcERhdGE7IH0gKiBGV0xfSENVUlNPUjsNCiANCi1jbGFzcyBJRldMX0FkYXB0ZXJDdXJzb3JNZ3INCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JRldMX0FkYXB0ZXJDdXJzb3JNZ3IoKSB7fQ0KLSAgICB2aXJ0dWFsCUZXTF9IQ1VSU09SCUdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRSBlQ3Vyc29yVHlwZSkgPSAwOw0KLSAgICB2aXJ0dWFsCUZXTF9IQ1VSU09SCUdldEN1c3RvbUN1cnNvcihjb25zdCBDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0ZMT0FUIHhIb3RzcG90ID0gMCwgRlhfRkxPQVQgeUhvdHNwb3QgPSAwKSA9IDA7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJU2V0Q3Vyc29yKEZXTF9IQ1VSU09SIGhDdXJzb3IpID0gMDsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQlTaG93Q3Vyc29yKEZYX0JPT0wgYlNob3cpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDdXJzb3JQb3MoQ0ZYX1BvaW50RiAmcHQpID0gMDsNCitjbGFzcyBJRldMX0FkYXB0ZXJDdXJzb3JNZ3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX0FkYXB0ZXJDdXJzb3JNZ3IoKSB7fQ0KKyAgdmlydHVhbCBGV0xfSENVUlNPUiBHZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEUgZUN1cnNvclR5cGUpID0gMDsNCisgIHZpcnR1YWwgRldMX0hDVVJTT1IgR2V0Q3VzdG9tQ3Vyc29yKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhIb3RzcG90ID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHlIb3RzcG90ID0gMCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEN1cnNvcihGV0xfSENVUlNPUiBoQ3Vyc29yKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2hvd0N1cnNvcihGWF9CT09MIGJTaG93KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q3Vyc29yUG9zKENGWF9Qb2ludEYmIHB0KSA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcm1vbml0b3JtZ3IuaCBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVybW9uaXRvcm1nci5oCmluZGV4IDc3ODIyNTQuLjM2YzlkOTIgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVybW9uaXRvcm1nci5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVybW9uaXRvcm1nci5oCkBAIC03LDE5ICs3LDE4IEBACiAjaWZuZGVmIF9GV0xfQURBUFRFUl9NT05JVE9STUdSX0gNCiAjZGVmaW5lIF9GV0xfQURBUFRFUl9NT05JVE9STUdSX0gNCiANCi10eXBlZGVmIHN0cnVjdCBfRldMX0hNT05JVE9SIHsNCi0gICAgdm9pZCogcERhdGE7DQotfSAqRldMX0hNT05JVE9SOw0KK3R5cGVkZWYgc3RydWN0IF9GV0xfSE1PTklUT1IgeyB2b2lkKiBwRGF0YTsgfSAqIEZXTF9ITU9OSVRPUjsNCiANCi1jbGFzcyBJRldMX0FkYXB0ZXJNb25pdG9yTWdyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZXTF9BZGFwdGVyTW9uaXRvck1ncigpIHt9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJQ291bnRNb25pdG9ycygpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfSE1PTklUT1IJR2V0TW9uaXRvcihpbnQzMl90IG5JbmRleCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9ITU9OSVRPUglHZXRDdXJyZW50TW9uaXRvcigpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfSE1PTklUT1IJR2V0TW9uaXRvckJ5UmVjdChjb25zdCBDRlhfUmVjdEYgJnJlY3QpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfSE1PTklUT1IJR2V0TW9uaXRvckJ5UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA9IDA7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJCUdldE1vbml0b3JTaXplKEZXTF9ITU9OSVRPUiBoTW9uaXRvciwgRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpID0gMDsNCitjbGFzcyBJRldMX0FkYXB0ZXJNb25pdG9yTWdyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZXTF9BZGFwdGVyTW9uaXRvck1ncigpIHt9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRNb25pdG9ycygpID0gMDsNCisgIHZpcnR1YWwgRldMX0hNT05JVE9SIEdldE1vbml0b3IoaW50MzJfdCBuSW5kZXgpID0gMDsNCisgIHZpcnR1YWwgRldMX0hNT05JVE9SIEdldEN1cnJlbnRNb25pdG9yKCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfSE1PTklUT1IgR2V0TW9uaXRvckJ5UmVjdChjb25zdCBDRlhfUmVjdEYmIHJlY3QpID0gMDsNCisgIHZpcnR1YWwgRldMX0hNT05JVE9SIEdldE1vbml0b3JCeVBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldE1vbml0b3JTaXplKEZXTF9ITU9OSVRPUiBoTW9uaXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZ5KSA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcm5hdGl2ZS5oIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJuYXRpdmUuaAppbmRleCBjYzM0OGJmLi5jMTk3M2U0IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcm5hdGl2ZS5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVybmF0aXZlLmgKQEAgLTE0LDE3ICsxNCwxNyBAQAogY2xhc3MgSUZXTF9BZGFwdGVyTW9uaXRvck1ncjsNCiBjbGFzcyBJRldMX0FkYXB0ZXJDbGlwYm9hcmRNZ3I7DQogDQotY2xhc3MgSUZXTF9BZGFwdGVyTmF0aXZlDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZXTF9BZGFwdGVyTmF0aXZlKCkge30NCi0gICAgdmlydHVhbCBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqCUdldFdpZGdldE1ncihJRldMX1dpZGdldE1nckRlbGVnYXRlICpwRGVsZWdhdGUpID0gMDsNCi0gICAgdmlydHVhbCBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IqCUdldFRocmVhZE1ncigpID0gMDsNCi0gICAgdmlydHVhbCBJRldMX0FkYXB0ZXJUaW1lck1ncioJR2V0VGltZXJNZ3IoKSA9IDA7DQotICAgIHZpcnR1YWwgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyKglHZXRDdXJzb3JNZ3IoKSA9IDA7DQotICAgIHZpcnR1YWwgSUZXTF9BZGFwdGVyTW9uaXRvck1nciogR2V0TW9uaXRvck1ncigpID0gMDsNCi0gICAgdmlydHVhbAlJRldMX0FkYXB0ZXJDbGlwYm9hcmRNZ3IqIEdldENsaXBib2FyZE1ncigpID0gMDsNCitjbGFzcyBJRldMX0FkYXB0ZXJOYXRpdmUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX0FkYXB0ZXJOYXRpdmUoKSB7fQ0KKyAgdmlydHVhbCBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIEdldFdpZGdldE1ncigNCisgICAgICBJRldMX1dpZGdldE1nckRlbGVnYXRlKiBwRGVsZWdhdGUpID0gMDsNCisgIHZpcnR1YWwgSUZXTF9BZGFwdGVyVGhyZWFkTWdyKiBHZXRUaHJlYWRNZ3IoKSA9IDA7DQorICB2aXJ0dWFsIElGV0xfQWRhcHRlclRpbWVyTWdyKiBHZXRUaW1lck1ncigpID0gMDsNCisgIHZpcnR1YWwgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyKiBHZXRDdXJzb3JNZ3IoKSA9IDA7DQorICB2aXJ0dWFsIElGV0xfQWRhcHRlck1vbml0b3JNZ3IqIEdldE1vbml0b3JNZ3IoKSA9IDA7DQorICB2aXJ0dWFsIElGV0xfQWRhcHRlckNsaXBib2FyZE1nciogR2V0Q2xpcGJvYXJkTWdyKCkgPSAwOw0KIH07DQogSUZXTF9BZGFwdGVyTmF0aXZlKiBGV0xfQ3JlYXRlRnVlbEFkYXB0ZXJOYXRpdmUoKTsNCi12b2lkIEZXTF9SZWxlYXNlRnVlbEFkYXB0ZXJOYXRpdmUoSUZXTF9BZGFwdGVyTmF0aXZlICpwQWRhcHRlck5hdGl2ZSk7DQordm9pZCBGV0xfUmVsZWFzZUZ1ZWxBZGFwdGVyTmF0aXZlKElGV0xfQWRhcHRlck5hdGl2ZSogcEFkYXB0ZXJOYXRpdmUpOw0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGhyZWFkbWdyLmggYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcnRocmVhZG1nci5oCmluZGV4IGJhMmZlYmYuLjEyYjE1NWQgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGhyZWFkbWdyLmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJ0aHJlYWRtZ3IuaApAQCAtMTAsMjYgKzEwLDI2IEBACiBjbGFzcyBJRldMX0FkYXB0ZXJNdXRleDsNCiBjbGFzcyBJRldMX0FkYXB0ZXJTZW1hcGhvcmU7DQogDQotY2xhc3MgSUZXTF9BZGFwdGVyVGhyZWFkTWdyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZXTF9BZGFwdGVyVGhyZWFkTWdyKCkge30NCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTdGFydChJRldMX1RocmVhZCAqcFRocmVhZCwgRldMX0hUSFJFQUQgJmhUaHJlYWQsIEZYX0JPT0wgYlN1c3BlbmRlZCA9IEZBTFNFKSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJUmVzdW1lKEZXTF9IVEhSRUFEIGhUaHJlYWQpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTdXNwZW5kKEZXTF9IVEhSRUFEIGhUaHJlYWQpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlLaWxsKEZXTF9IVEhSRUFEIGhUaHJlYWQsIGludDMyX3QgaUV4aXRDb2RlKSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU3RvcChGV0xfSFRIUkVBRCBoVGhyZWFkLCBpbnQzMl90IGlFeGl0Q29kZSkgPSAwOw0KLSAgICB2aXJ0dWFsIElGV0xfVGhyZWFkKiBHZXRDdXJyZW50VGhyZWFkKCkgPSAwOw0KK2NsYXNzIElGV0xfQWRhcHRlclRocmVhZE1nciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfQWRhcHRlclRocmVhZE1ncigpIHt9DQorICB2aXJ0dWFsIEZXTF9FUlIgU3RhcnQoSUZXTF9UaHJlYWQqIHBUaHJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hUSFJFQUQmIGhUaHJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3VzcGVuZGVkID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBSZXN1bWUoRldMX0hUSFJFQUQgaFRocmVhZCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFN1c3BlbmQoRldMX0hUSFJFQUQgaFRocmVhZCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEtpbGwoRldMX0hUSFJFQUQgaFRocmVhZCwgaW50MzJfdCBpRXhpdENvZGUpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTdG9wKEZXTF9IVEhSRUFEIGhUaHJlYWQsIGludDMyX3QgaUV4aXRDb2RlKSA9IDA7DQorICB2aXJ0dWFsIElGV0xfVGhyZWFkKiBHZXRDdXJyZW50VGhyZWFkKCkgPSAwOw0KIH07DQotY2xhc3MgSUZXTF9BZGFwdGVyU2VtYXBob3JlDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZXTF9BZGFwdGVyU2VtYXBob3JlKCkge30NCi0gICAgc3RhdGljIElGV0xfQWRhcHRlclNlbWFwaG9yZSAqIENyZWF0ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgRGVzdHJveSgpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSIFdhaXQoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUiBQb3N0KCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgVmFsdWUoRlhfRFdPUkQgJnZhbCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgUmVzZXQoaW50MzJfdCBpbml0KSA9IDA7DQorY2xhc3MgSUZXTF9BZGFwdGVyU2VtYXBob3JlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZXTF9BZGFwdGVyU2VtYXBob3JlKCkge30NCisgIHN0YXRpYyBJRldMX0FkYXB0ZXJTZW1hcGhvcmUqIENyZWF0ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERlc3Ryb3koKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgV2FpdCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBQb3N0KCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFZhbHVlKEZYX0RXT1JEJiB2YWwpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBSZXNldChpbnQzMl90IGluaXQpID0gMDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGltZXJtZ3IuaCBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGltZXJtZ3IuaAppbmRleCBkMGU5ZjBlLi4zYzg2MmFhIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcnRpbWVybWdyLmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJ0aW1lcm1nci5oCkBAIC0xMiwxMSArMTIsMTMgQEAKIA0KIGNsYXNzIElGV0xfVGltZXI7DQogDQotY2xhc3MgSUZXTF9BZGFwdGVyVGltZXJNZ3INCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JRldMX0FkYXB0ZXJUaW1lck1ncigpIHt9DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU3RhcnQoSUZXTF9UaW1lciAqcFRpbWVyLCBGWF9EV09SRCBkd0VsYXBzZSwgRldMX0hUSU1FUiAmaFRpbWVyLCBGWF9CT09MIGJJbW1lZGlhdGVseSA9IFRSVUUpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTdG9wKEZXTF9IVElNRVIgaFRpbWVyKSA9IDA7DQorY2xhc3MgSUZXTF9BZGFwdGVyVGltZXJNZ3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX0FkYXB0ZXJUaW1lck1ncigpIHt9DQorICB2aXJ0dWFsIEZXTF9FUlIgU3RhcnQoSUZXTF9UaW1lciogcFRpbWVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RWxhcHNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9IVElNRVImIGhUaW1lciwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbW1lZGlhdGVseSA9IFRSVUUpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTdG9wKEZXTF9IVElNRVIgaFRpbWVyKSA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcndpZGdldG1nci5oIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJ3aWRnZXRtZ3IuaAppbmRleCAyOWU5MWJhLi5kM2JkZDZmIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcndpZGdldG1nci5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVyd2lkZ2V0bWdyLmgKQEAgLTE0LDQzICsxNCw2MyBAQAogY2xhc3MgSUZXTF9BZGFwdGVyTWVzc2FnZUhvb2s7DQogY2xhc3MgSUZXTF9BcHBEZWxlZ2F0ZTsNCiANCi1jbGFzcyBJRldMX0FkYXB0ZXJXaWRnZXRNZ3INCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JRldMX0FkYXB0ZXJXaWRnZXRNZ3IoKSB7fQ0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgQ3JlYXRlV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBJRldMX1dpZGdldCAqcFBhcmVudCA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSIERlc3Ryb3lXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcmVjdCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0UmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0KSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRQb3NpdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUiBTZXRQYXJlbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIElGV0xfV2lkZ2V0ICpwUGFyZW50KSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRJY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfRElCaXRtYXAgKnBJY29uLCBGWF9CT09MIGJCaWcpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDYXB0aW9uKSA9IDA7DQotICAgIHZpcnR1YWwJRldMX0VSUglTZXRCb3JkZXJSZWdpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9QYXRoICpwUGF0aCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0VHJhbnNwYXJlbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3QWxwaGEpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSIFNob3dXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSIEhpZGVXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSIFNldE5vcm1hbChJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWF4aW1pemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSIFNldE1pbmltaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUiBTZXRGdWxsU2NyZWVuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJGdWxsU2NyZWVuKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTCBDaGVja01lc3NhZ2UoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTCBJc0lkbGVNZXNzYWdlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgRGlzcGF0Y2hNZXNzYWdlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgUmVwYWludFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCkgPSAwOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIgRXhpdChpbnQzMl90IGlFeGl0Q29kZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgQ3JlYXRlV2lkZ2V0V2l0aE5hdGl2ZUlkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCB2b2lkKiBVc2VyRGF0YSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0REMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIHZvaWQqICZwREMpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSIFJlbGVhc2VXaWRnZXREQyhJRldMX1dpZGdldCAqcFdpZGdldCwgdm9pZCogcERDLCBDRlhfUmVjdEYgKnBDbGlwID0gMCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQqIEdldFdpbmRvdyhJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsCUZYX0RXT1JEIEdldEtleVN0YXRlKEZYX0RXT1JEIGR3VmlydEtleSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgIFJ1bkxvb3AoSUZXTF9XaWRnZXQgKndpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgIEVuZExvb3AoKSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUiAgSW5pdE1lbnUoSUZXTF9NZW51ICpwTWVudSwgSUZXTF9NZW51RFAgKnBNZW51RGF0YSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgIFVwZGF0ZU1lbnUoSUZXTF9NZW51ICpwTWVudSwgY29uc3Qgdm9pZCogaEl0ZW0sIGludDMyX3QgaVR5cGUpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90IFRyYWNrUG9wdXBNZW51KElGV0xfTWVudSAqcE1lbnUsIElGV0xfTWVudURQICpwTWVudURhdGEpID0gMDsNCi0gICAgdmlydHVhbAlGV0xfRVJSICBTZXRNZXNzYWdlSG9vayhJRldMX0FkYXB0ZXJNZXNzYWdlSG9vayAqaG9vaykgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgIEdldFN5c3RlbUJvcmRlcihGWF9GTE9BVCAmbCwgRlhfRkxPQVQgJnQsIEZYX0ZMT0FUICZyLCBGWF9GTE9BVCAmYikgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJIEdldFBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApID0gMDsNCitjbGFzcyBJRldMX0FkYXB0ZXJXaWRnZXRNZ3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX0FkYXB0ZXJXaWRnZXRNZ3IoKSB7fQ0KKyAgdmlydHVhbCBGV0xfRVJSIENyZWF0ZVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBQYXJlbnQgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgRGVzdHJveVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcmVjdCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRQb3NpdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFBhcmVudFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBQYXJlbnQpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRJY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwSWNvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJpZykgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbikgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEJvcmRlclJlZ2lvbihJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1BhdGgqIHBQYXRoKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0VHJhbnNwYXJlbnQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZYX0RXT1JEIGR3QWxwaGEpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTaG93V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgSGlkZVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldE5vcm1hbChJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldE1heGltaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWluaW1pemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRGdWxsU2NyZWVuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJGdWxsU2NyZWVuKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tNZXNzYWdlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzSWRsZU1lc3NhZ2UoKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgRGlzcGF0Y2hNZXNzYWdlKCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgRXhpdChpbnQzMl90IGlFeGl0Q29kZSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIENyZWF0ZVdpZGdldFdpdGhOYXRpdmVJZChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogVXNlckRhdGEpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRXaWRnZXREQyhJRldMX1dpZGdldCogcFdpZGdldCwgdm9pZComIHBEQykgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlbGVhc2VXaWRnZXREQyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERDLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYqIHBDbGlwID0gMCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkKiBHZXRXaW5kb3coSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0S2V5U3RhdGUoRlhfRFdPUkQgZHdWaXJ0S2V5KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgUnVuTG9vcChJRldMX1dpZGdldCogd2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgRW5kTG9vcCgpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0TWVudShJRldMX01lbnUqIHBNZW51LCBJRldMX01lbnVEUCogcE1lbnVEYXRhKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgVXBkYXRlTWVudShJRldMX01lbnUqIHBNZW51LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUeXBlKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgVHJhY2tQb3B1cE1lbnUoSUZXTF9NZW51KiBwTWVudSwgSUZXTF9NZW51RFAqIHBNZW51RGF0YSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldE1lc3NhZ2VIb29rKElGV0xfQWRhcHRlck1lc3NhZ2VIb29rKiBob29rKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0U3lzdGVtQm9yZGVyKEZYX0ZMT0FUJiBsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBiKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UG9wdXBQb3MoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKSA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfc2RhZGFwdGVyaW1wLmggYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfc2RhZGFwdGVyaW1wLmgKaW5kZXggNzMzYTE0ZC4uODZhMTcyOCAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX3NkYWRhcHRlcmltcC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9zZGFkYXB0ZXJpbXAuaApAQCAtMTQsNTkgKzE0LDc4IEBACiBjbGFzcyBDRldMX1NEQWRhdHBlck5hdGl2ZTsNCiBjbGFzcyBDRldMX1NEQWRhcHRlcldpZGdldE1ncjsNCiBjbGFzcyBDRldMX1NEQWRhcHRlclRpbWVyTWdyOw0KLWNsYXNzIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyIDogcHVibGljIElGV0xfQWRhcHRlcldpZGdldE1ncg0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyKCk7DQotICAgIH5DRldMX1NEQWRhcHRlcldpZGdldE1ncigpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgQ3JlYXRlV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBJRldMX1dpZGdldCAqcFBhcmVudCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgRGVzdHJveVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRSZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0UG9zaXRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRldMX0VSUiBTZXRQYXJlbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIElGV0xfV2lkZ2V0ICpwUGFyZW50KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSIFNob3dXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgSGlkZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZpcnR1YWwgRldMX0VSUiBTZXROb3JtYWwoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWF4aW1pemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWluaW1pemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgUnVuV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSIFJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QpOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIgRXhpdChpbnQzMl90IGlFeGl0Q29kZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUiBDcmVhdGVXaWRnZXRXaXRoTmF0aXZlSWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIHZvaWQgKnZwKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCUdldFBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApOw0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcmVjdCk7DQotICAgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRJY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfRElCaXRtYXAgKnBJY29uLCBGWF9CT09MIGJCaWcpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0Q2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhcHRpb24pOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJU2V0Qm9yZGVyUmVnaW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUGF0aCAqcFBhdGgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0VHJhbnNwYXJlbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3QWxwaGEpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0RnVsbFNjcmVlbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbik7DQotICAgIHZpcnR1YWwgRlhfQk9PTCBDaGVja01lc3NhZ2UoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MIElzSWRsZU1lc3NhZ2UoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSIERpc3BhdGNoTWVzc2FnZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0REMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIHZvaWQqICZwREMpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgUmVsZWFzZVdpZGdldERDKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCB2b2lkKiBwREMsIENGWF9SZWN0RiAqcENsaXAgPSAwKTsNCi0gICAgdmlydHVhbCB2b2lkKiBHZXRXaW5kb3coSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2aXJ0dWFsCUZYX0RXT1JEIEdldEtleVN0YXRlKEZYX0RXT1JEIGR3VmlydEtleSk7DQotICAgIHZpcnR1YWwgRldMX0VSUiAgUnVuTG9vcChJRldMX1dpZGdldCAqd2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSICBFbmRMb29wKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUiAgSW5pdE1lbnUoSUZXTF9NZW51ICpwTWVudSwgSUZXTF9NZW51RFAgKnBNZW51RGF0YSk7DQotICAgIHZpcnR1YWwgRldMX0VSUiAgVXBkYXRlTWVudShJRldMX01lbnUgKnBNZW51LCBjb25zdCB2b2lkKiBoSXRlbSwgaW50MzJfdCBpVHlwZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdCBUcmFja1BvcHVwTWVudShJRldMX01lbnUgKnBNZW51LCBJRldMX01lbnVEUCAqcE1lbnVEYXRhKTsNCi0gICAgdmlydHVhbAlGV0xfRVJSICBTZXRNZXNzYWdlSG9vayhJRldMX0FkYXB0ZXJNZXNzYWdlSG9vayAqaG9vayk7DQotICAgIHZpcnR1YWwgRldMX0VSUiAgR2V0U3lzdGVtQm9yZGVyKEZYX0ZMT0FUICZsLCBGWF9GTE9BVCAmdCwgRlhfRkxPQVQgJnIsIEZYX0ZMT0FUICZiKTsNCitjbGFzcyBDRldMX1NEQWRhcHRlcldpZGdldE1nciA6IHB1YmxpYyBJRldMX0FkYXB0ZXJXaWRnZXRNZ3Igew0KKyBwdWJsaWM6DQorICBDRldMX1NEQWRhcHRlcldpZGdldE1ncigpOw0KKyAgfkNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgQ3JlYXRlV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcFBhcmVudCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERlc3Ryb3lXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0UG9zaXRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFBhcmVudFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwgSUZXTF9XaWRnZXQqIHBQYXJlbnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNob3dXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEhpZGVXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldE5vcm1hbChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWF4aW1pemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldE1pbmltaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBSdW5XaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiogcFJlY3QpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEV4aXQoaW50MzJfdCBpRXhpdENvZGUpOw0KKyAgdmlydHVhbCBGV0xfRVJSIENyZWF0ZVdpZGdldFdpdGhOYXRpdmVJZChJRldMX1dpZGdldCogcFdpZGdldCwgdm9pZCogdnApOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldFBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7DQorDQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRXaWRnZXRSZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldEljb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBJY29uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQmlnKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhcHRpb24pOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEJvcmRlclJlZ2lvbihJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1BhdGgqIHBQYXRoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUcmFuc3BhcmVudChJRldMX1dpZGdldCogcFdpZGdldCwgRlhfRFdPUkQgZHdBbHBoYSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0RnVsbFNjcmVlbihJRldMX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbik7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tNZXNzYWdlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNJZGxlTWVzc2FnZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERpc3BhdGNoTWVzc2FnZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldERDKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCB2b2lkKiYgcERDKTsNCisgIHZpcnR1YWwgRldMX0VSUiBSZWxlYXNlV2lkZ2V0REMoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEQywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGKiBwQ2xpcCA9IDApOw0KKyAgdmlydHVhbCB2b2lkKiBHZXRXaW5kb3coSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRLZXlTdGF0ZShGWF9EV09SRCBkd1ZpcnRLZXkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJ1bkxvb3AoSUZXTF9XaWRnZXQqIHdpZGdldCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRW5kTG9vcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRNZW51KElGV0xfTWVudSogcE1lbnUsIElGV0xfTWVudURQKiBwTWVudURhdGEpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZU1lbnUoSUZXTF9NZW51KiBwTWVudSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVHlwZSk7DQorICB2aXJ0dWFsIGludDMyX3QgVHJhY2tQb3B1cE1lbnUoSUZXTF9NZW51KiBwTWVudSwgSUZXTF9NZW51RFAqIHBNZW51RGF0YSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWVzc2FnZUhvb2soSUZXTF9BZGFwdGVyTWVzc2FnZUhvb2sqIGhvb2spOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFN5c3RlbUJvcmRlcihGWF9GTE9BVCYgbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiByLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYik7DQogfTsNCi1jbGFzcyBDRldMX1NEQWRhcHRlclRocmVhZE1nciA6IHB1YmxpYyBJRldMX0FkYXB0ZXJUaHJlYWRNZ3INCi17DQotcHVibGljOg0KLSAgICBDRldMX1NEQWRhcHRlclRocmVhZE1ncigpOw0KLSAgICB+Q0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3IoKTsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU3RhcnQoSUZXTF9UaHJlYWQgKnBUaHJlYWQsIEZXTF9IVEhSRUFEICZoVGhyZWFkLCBGWF9CT09MIGJTdXNwZW5kZWQgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJUmVzdW1lKEZXTF9IVEhSRUFEIGhUaHJlYWQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVN1c3BlbmQoRldMX0hUSFJFQUQgaFRocmVhZCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJS2lsbChGV0xfSFRIUkVBRCBoVGhyZWFkLCBpbnQzMl90IGlFeGl0Q29kZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU3RvcChGV0xfSFRIUkVBRCBoVGhyZWFkLCBpbnQzMl90IGlFeGl0Q29kZSk7DQotICAgIHZpcnR1YWwgSUZXTF9UaHJlYWQqIEdldEN1cnJlbnRUaHJlYWQoKTsNCitjbGFzcyBDRldMX1NEQWRhcHRlclRocmVhZE1nciA6IHB1YmxpYyBJRldMX0FkYXB0ZXJUaHJlYWRNZ3Igew0KKyBwdWJsaWM6DQorICBDRldMX1NEQWRhcHRlclRocmVhZE1ncigpOw0KKyAgfkNGV0xfU0RBZGFwdGVyVGhyZWFkTWdyKCk7DQorDQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRldMX0VSUiBTdGFydChJRldMX1RocmVhZCogcFRocmVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSFRIUkVBRCYgaFRocmVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdXNwZW5kZWQgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgUmVzdW1lKEZXTF9IVEhSRUFEIGhUaHJlYWQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFN1c3BlbmQoRldMX0hUSFJFQUQgaFRocmVhZCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgS2lsbChGV0xfSFRIUkVBRCBoVGhyZWFkLCBpbnQzMl90IGlFeGl0Q29kZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU3RvcChGV0xfSFRIUkVBRCBoVGhyZWFkLCBpbnQzMl90IGlFeGl0Q29kZSk7DQorICB2aXJ0dWFsIElGV0xfVGhyZWFkKiBHZXRDdXJyZW50VGhyZWFkKCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfYmFyY29kZS5oIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2JhcmNvZGUuaAppbmRleCAwOGYyOGI3Li4yNWFhMzEwIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfYmFyY29kZS5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9iYXJjb2RlLmgKQEAgLTExLDUzICsxMSw1MyBAQAogY2xhc3MgSUZXTF9XaWRnZXQ7DQogY2xhc3MgSUZXTF9CYXJjb2RlRFA7DQogY2xhc3MgSUZXTF9CYXJjb2RlOw0KLSNkZWZpbmUgRldMX0NMQVNTX0JhcmNvZGUJCQkJTCJGV0xfQkFSQ09ERSINCi0jZGVmaW5lIEZXTF9DTEFTU0hBU0hfQmFyY29kZQkJCTM2Njg4Njk2OA0KLSNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9DSEFSRU5DT0RJTkcJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9NT0RVTEVIRUlHSFQJCSgxTCA8PCAxKQ0KLSNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9NT0RVTEVXSURUSAkJKDFMIDw8IDIpDQotI2RlZmluZSBGV0xfQkNEQVRUUklCVVRFX0RBVEFMRU5HVEgJCQkoMUwgPDwgMykNCi0jZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfQ0FMQ0hFQ0tTVU0JCSgxTCA8PCA0KQ0KLSNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9QUklOVENIRUNLU1VNCQkoMUwgPDwgNSkNCi0jZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfVEVYVExPQ0FUSU9OCQkoMUwgPDwgNikNCi0jZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfV0lERU5BUlJPV1JBVElPCSgxTCA8PCA3KQ0KLSNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9TVEFSVENIQVIJCQkoMUwgPDwgOCkNCi0jZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfRU5EQ0hBUgkJCSgxTCA8PCA5KQ0KLSNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9WRVJTSU9OCQkJKDFMIDw8IDEwKQ0KLSNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9FQ0xFVkVMCQkJKDFMIDw8IDExKQ0KLSNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9UUlVOQ0FURUQJCQkoMUwgPDwgMTIpDQotI2RlZmluZSBGV0xfUEFSVF9CQ0RfQm9yZGVyCQkJCTENCi0jZGVmaW5lIEZXTF9QQVJUX0JDRF9FZGdlCQkJCTINCi0jZGVmaW5lIEZXTF9QQVJUX0JDRF9CYWNrZ3JvdW5kCQkJMw0KLSNkZWZpbmUgRldMX0JDVVBEQVRFQ01EX0RhdGEJCQlGV0xfV0dUVVBEQVRFQ01EX1VzZXINCi1jbGFzcyBJRldMX0JhcmNvZGVEUCA6IHB1YmxpYyBJRldMX0VkaXREUA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgQkNfQ0hBUl9FTkNPRElORwlHZXRDaGFyRW5jb2RpbmcoKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldE1vZHVsZUhlaWdodCgpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0TW9kdWxlV2lkdGgoKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldERhdGFMZW5ndGgoKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldENhbENoZWNrc3VtKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJR2V0UHJpbnRDaGVja3N1bSgpID0gMDsNCi0gICAgdmlydHVhbCBCQ19URVhUX0xPQwkJCUdldFRleHRMb2NhdGlvbigpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0V2lkZU5hcnJvd1JhdGlvKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0NIQVIJCQkJR2V0U3RhcnRDaGFyKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0NIQVIJCQkJR2V0RW5kQ2hhcigpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0VmVyc2lvbigpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlHZXRUcnVuY2F0ZWQoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCQlHZXRCYXJjb2RlQXR0cmlidXRlTWFzaygpID0gMDsNCisjZGVmaW5lIEZXTF9DTEFTU19CYXJjb2RlIEwiRldMX0JBUkNPREUiDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0JhcmNvZGUgMzY2ODg2OTY4DQorI2RlZmluZSBGV0xfQkNEQVRUUklCVVRFX0NIQVJFTkNPRElORyAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfTU9EVUxFSEVJR0hUICgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9NT0RVTEVXSURUSCAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfREFUQUxFTkdUSCAoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfQ0FMQ0hFQ0tTVU0gKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfQkNEQVRUUklCVVRFX1BSSU5UQ0hFQ0tTVU0gKDFMIDw8IDUpDQorI2RlZmluZSBGV0xfQkNEQVRUUklCVVRFX1RFWFRMT0NBVElPTiAoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfV0lERU5BUlJPV1JBVElPICgxTCA8PCA3KQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9TVEFSVENIQVIgKDFMIDw8IDgpDQorI2RlZmluZSBGV0xfQkNEQVRUUklCVVRFX0VORENIQVIgKDFMIDw8IDkpDQorI2RlZmluZSBGV0xfQkNEQVRUUklCVVRFX1ZFUlNJT04gKDFMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9FQ0xFVkVMICgxTCA8PCAxMSkNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfVFJVTkNBVEVEICgxTCA8PCAxMikNCisjZGVmaW5lIEZXTF9QQVJUX0JDRF9Cb3JkZXIgMQ0KKyNkZWZpbmUgRldMX1BBUlRfQkNEX0VkZ2UgMg0KKyNkZWZpbmUgRldMX1BBUlRfQkNEX0JhY2tncm91bmQgMw0KKyNkZWZpbmUgRldMX0JDVVBEQVRFQ01EX0RhdGEgRldMX1dHVFVQREFURUNNRF9Vc2VyDQorY2xhc3MgSUZXTF9CYXJjb2RlRFAgOiBwdWJsaWMgSUZXTF9FZGl0RFAgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEJDX0NIQVJfRU5DT0RJTkcgR2V0Q2hhckVuY29kaW5nKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldE1vZHVsZUhlaWdodCgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRNb2R1bGVXaWR0aCgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXREYXRhTGVuZ3RoKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENhbENoZWNrc3VtKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldFByaW50Q2hlY2tzdW0oKSA9IDA7DQorICB2aXJ0dWFsIEJDX1RFWFRfTE9DIEdldFRleHRMb2NhdGlvbigpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXaWRlTmFycm93UmF0aW8oKSA9IDA7DQorICB2aXJ0dWFsIEZYX0NIQVIgR2V0U3RhcnRDaGFyKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9DSEFSIEdldEVuZENoYXIoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VmVyc2lvbigpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRUcnVuY2F0ZWQoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldEJhcmNvZGVBdHRyaWJ1dGVNYXNrKCkgPSAwOw0KIH07DQotY2xhc3MgSUZXTF9CYXJjb2RlIDogcHVibGljIElGV0xfRWRpdA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRldMX0JhcmNvZGUqIENyZWF0ZSgpOw0KLSAgICBGV0xfRVJSCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgdm9pZAkJU2V0VHlwZShCQ19UWVBFIHR5cGUpOw0KLSAgICBGWF9CT09MCQlJc1Byb3RlY3RlZFR5cGUoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIElGV0xfQmFyY29kZSgpOw0KLSAgICB2aXJ0dWFsIH5JRldMX0JhcmNvZGUoKTsNCitjbGFzcyBJRldMX0JhcmNvZGUgOiBwdWJsaWMgSUZXTF9FZGl0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfQmFyY29kZSogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICB2b2lkIFNldFR5cGUoQkNfVFlQRSB0eXBlKTsNCisgIEZYX0JPT0wgSXNQcm90ZWN0ZWRUeXBlKCk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfQmFyY29kZSgpOw0KKyAgdmlydHVhbCB+SUZXTF9CYXJjb2RlKCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY2FyZXQuaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jYXJldC5oCmluZGV4IDBkMjlmY2EuLmE3M2U4YjAgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jYXJldC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jYXJldC5oCkBAIC05LDI0ICs5LDI1IEBACiBjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQogY2xhc3MgSUZXTF9XaWRnZXQ7DQogY2xhc3MgSUZXTF9DYXJldDsNCi0jZGVmaW5lIEZXTF9DTEFTU19DYXJldAkJCQlMIkZXTF9DQVJFVCINCi0jZGVmaW5lIEZXTF9DTEFTU0hBU0hfQ2FyZXQJCQk2NzExODE4NzkNCi0jZGVmaW5lIEZXTF9TVEFURV9DQVRfSGlnaHRMaWdodAkJCTENCi0jZGVmaW5lIEZXTF9QQVJUX0NBVF9CYWNrZ3JvdW5kCQkJCTENCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ0FUX0hpZ2h0TGlnaHQJCTENCi1jbGFzcyBJRldMX0NhcmV0IDogcHVibGljIElGV0xfV2lkZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGV0xfQ2FyZXQqIENyZWF0ZSgpOw0KLSAgICBGV0xfRVJSCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCisjZGVmaW5lIEZXTF9DTEFTU19DYXJldCBMIkZXTF9DQVJFVCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfQ2FyZXQgNjcxMTgxODc5DQorI2RlZmluZSBGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQgMQ0KKyNkZWZpbmUgRldMX1BBUlRfQ0FUX0JhY2tncm91bmQgMQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DQVRfSGlnaHRMaWdodCAxDQorY2xhc3MgSUZXTF9DYXJldCA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX0NhcmV0KiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCiANCi0gICAgRldMX0VSUgkJU2hvd0NhcmV0KEZYX0JPT0wgYkZsYWcgPSBUUlVFKTsNCi0gICAgRldMX0VSUgkJR2V0RnJlcXVlbmN5KEZYX0RXT1JEICZlbGFwc2UpOw0KLSAgICBGV0xfRVJSCQlTZXRGcmVxdWVuY3koRlhfRFdPUkQgZWxhcHNlKTsNCi0gICAgRldMX0VSUgkJU2V0Q29sb3IoQ0ZYX0NvbG9yIGNyRmlsbCk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX0NhcmV0KCk7DQotICAgIHZpcnR1YWwgfklGV0xfQ2FyZXQoKTsNCisgIEZXTF9FUlIgU2hvd0NhcmV0KEZYX0JPT0wgYkZsYWcgPSBUUlVFKTsNCisgIEZXTF9FUlIgR2V0RnJlcXVlbmN5KEZYX0RXT1JEJiBlbGFwc2UpOw0KKyAgRldMX0VSUiBTZXRGcmVxdWVuY3koRlhfRFdPUkQgZWxhcHNlKTsNCisgIEZXTF9FUlIgU2V0Q29sb3IoQ0ZYX0NvbG9yIGNyRmlsbCk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfQ2FyZXQoKTsNCisgIHZpcnR1YWwgfklGV0xfQ2FyZXQoKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jaGVja2JveC5oIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NoZWNrYm94LmgKaW5kZXggMDU3NmRlZC4uOTRlZTllNyAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NoZWNrYm94LmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NoZWNrYm94LmgKQEAgLTEwLDg2ICsxMCw4OCBAQAogY2xhc3MgSUZXTF9XaWRnZXQ7DQogY2xhc3MgSUZXTF9DaGVja0JveERQOw0KIGNsYXNzIElGV0xfQ2hlY2tCb3g7DQotI2RlZmluZSBGV0xfQ0xBU1NfQ2hlY2tCb3gJCQkJCUwiRldMX0NIRUNLQk9YIg0KLSNkZWZpbmUgRldMX0NMQVNTX1JhZGlvQnV0dG9uCQkJCUwiRldMX1JBRElPQlVUVE9OIg0KLSNkZWZpbmUgRldMX0NMQVNTSEFTSF9DaGVja0JveAkJCQk0MTA3MTgzODIzDQotI2RlZmluZSBGV0xfQ0xBU1NIQVNIX1JhZGlvQnV0dG9uCQkJMzgxMTMwNDY5MQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9MZWZ0CQkJCSgwTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9DZW50ZXIJCQkJKDFMIDw8IDApDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1JpZ2h0CQkJCSgyTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9Ub3AJCQkJKDBMIDw8IDIpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1ZDZW50ZXIJCQkoMUwgPDwgMikNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfQm90dG9tCQkJCSgyTCA8PCAyKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9MZWZ0VGV4dAkJCSgxTCA8PCA0KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9NdWx0aUxpbmUJCQkoMUwgPDwgNSkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlCQkJCSgxTCA8PCA2KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbgkJKDFMIDw8IDcpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU29saWRTcXVhcmUJKDBMIDw8IDgpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU3Vua2VuU3F1YXJlCSgxTCA8PCA4KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVNvbGlkQ2lyY2xlCSgyTCA8PCA4KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVN1bmtlbkNpcmNsZQkoM0wgPDwgOCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2hlY2sJCSgwTCA8PCAxMCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2lyY2xlCSgxTCA8PCAxMCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ3Jvc3MJCSgyTCA8PCAxMCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlRGlhbW9uZAkoM0wgPDwgMTApDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVNxdWFyZQkoNEwgPDwgMTApDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVN0YXIJCSg1TCA8PCAxMCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfSExheW91dE1hc2sJCSgzTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9WTGF5b3V0TWFzawkJKDNMIDw8IDIpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlTWFzawkJCSgzTCA8PCA4KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVNYXNrCQkoN0wgPDwgMTApDQotI2RlZmluZSBGV0xfU1RBVEVfQ0tCX0hvdmVyZWQJCQkJKDEgPDwgRldMX1dHVFNUQVRFX01BWCkNCi0jZGVmaW5lIEZXTF9TVEFURV9DS0JfUHJlc3NlZAkJCQkoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDEpKQ0KLSNkZWZpbmUgRldMX1NUQVRFX0NLQl9VbmNoZWNrZWQJCQkJKDAgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAyKSkNCi0jZGVmaW5lIEZXTF9TVEFURV9DS0JfQ2hlY2tlZAkJCQkoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDIpKQ0KLSNkZWZpbmUgRldMX1NUQVRFX0NLQl9OZXV0cmFsCQkJCSgyIDw8IChGV0xfV0dUU1RBVEVfTUFYICsgMikpDQotI2RlZmluZSBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzawkJCQkoM0wgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAyKSkNCi0jZGVmaW5lIEZXTF9QQVJUX0NLQl9Cb3JkZXIJCQkJCTENCi0jZGVmaW5lIEZXTF9QQVJUX0NLQl9FZGdlCQkJCQkyDQotI2RlZmluZSBGV0xfUEFSVF9DS0JfQmFja2dyb3VuZAkJCQkzDQotI2RlZmluZSBGV0xfUEFSVF9DS0JfQ2hlY2tCb3gJCQkJNA0KLSNkZWZpbmUgRldMX1BBUlRfQ0tCX0NhcHRpb24JCQkJNQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9DS0JfTm9ybWFsCQkJKDBMIDw8IDApDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9QcmVzc2VkCQkJKDFMIDw8IDApDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9Ib3ZlcmVkCQkJKDJMIDw8IDApDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9EaXNhYmxlZAkJCSgzTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9DS0JfVW5DaGVja2VkCQkJKDBMIDw8IDIpDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkCQkJKDFMIDw8IDIpDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9OZXV0cmFsCQkJKDJMIDw8IDIpDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9Gb2N1c2VkCQkJKDFMIDw8IDQpDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMQkJCQkoM0wgPDwgMCkNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syCQkJCSgzTCA8PCAyKQ0KLSNkZWZpbmUgRldMX0VWVF9DS0JfQ2hlY2tTdGF0ZUNoYW5nZWQJCUwiRldMX0VWRU5UX0NLQl9DaGVja1N0YXRlQ2hhbmdlZCINCi0jZGVmaW5lIEZXTF9FVlRIQVNIX0NLQl9DaGVja1N0YXRlQ2hhbmdlZAkyNTAzMjUyOTYzDQotQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENrYkNoZWNrU3RhdGVDaGFuZ2VkLCBGV0xfRVZUSEFTSF9DS0JfQ2hlY2tTdGF0ZUNoYW5nZWQpDQorI2RlZmluZSBGV0xfQ0xBU1NfQ2hlY2tCb3ggTCJGV0xfQ0hFQ0tCT1giDQorI2RlZmluZSBGV0xfQ0xBU1NfUmFkaW9CdXR0b24gTCJGV0xfUkFESU9CVVRUT04iDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0NoZWNrQm94IDQxMDcxODM4MjMNCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfUmFkaW9CdXR0b24gMzgxMTMwNDY5MQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9MZWZ0ICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9DZW50ZXIgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1JpZ2h0ICgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9Ub3AgKDBMIDw8IDIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1ZDZW50ZXIgKDFMIDw8IDIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX0JvdHRvbSAoMkwgPDwgMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfTGVmdFRleHQgKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX011bHRpTGluZSAoMUwgPDwgNSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlICgxTCA8PCA2KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbiAoMUwgPDwgNykNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2hhcGVTb2xpZFNxdWFyZSAoMEwgPDwgOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2hhcGVTdW5rZW5TcXVhcmUgKDFMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU29saWRDaXJjbGUgKDJMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU3Vua2VuQ2lyY2xlICgzTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaGVjayAoMEwgPDwgMTApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNpcmNsZSAoMUwgPDwgMTApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNyb3NzICgyTCA8PCAxMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlRGlhbW9uZCAoM0wgPDwgMTApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVNxdWFyZSAoNEwgPDwgMTApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVN0YXIgKDVMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9ITGF5b3V0TWFzayAoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfVkxheW91dE1hc2sgKDNMIDw8IDIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlTWFzayAoM0wgPDwgOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlTWFzayAoN0wgPDwgMTApDQorI2RlZmluZSBGV0xfU1RBVEVfQ0tCX0hvdmVyZWQgKDEgPDwgRldMX1dHVFNUQVRFX01BWCkNCisjZGVmaW5lIEZXTF9TVEFURV9DS0JfUHJlc3NlZCAoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDEpKQ0KKyNkZWZpbmUgRldMX1NUQVRFX0NLQl9VbmNoZWNrZWQgKDAgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAyKSkNCisjZGVmaW5lIEZXTF9TVEFURV9DS0JfQ2hlY2tlZCAoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDIpKQ0KKyNkZWZpbmUgRldMX1NUQVRFX0NLQl9OZXV0cmFsICgyIDw8IChGV0xfV0dUU1RBVEVfTUFYICsgMikpDQorI2RlZmluZSBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzayAoM0wgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAyKSkNCisjZGVmaW5lIEZXTF9QQVJUX0NLQl9Cb3JkZXIgMQ0KKyNkZWZpbmUgRldMX1BBUlRfQ0tCX0VkZ2UgMg0KKyNkZWZpbmUgRldMX1BBUlRfQ0tCX0JhY2tncm91bmQgMw0KKyNkZWZpbmUgRldMX1BBUlRfQ0tCX0NoZWNrQm94IDQNCisjZGVmaW5lIEZXTF9QQVJUX0NLQl9DYXB0aW9uIDUNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ0tCX05vcm1hbCAoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ0tCX1ByZXNzZWQgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9Ib3ZlcmVkICgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQgKDNMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9VbkNoZWNrZWQgKDBMIDw8IDIpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkICgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DS0JfTmV1dHJhbCAoMkwgPDwgMikNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ0tCX0ZvY3VzZWQgKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSAoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syICgzTCA8PCAyKQ0KKyNkZWZpbmUgRldMX0VWVF9DS0JfQ2hlY2tTdGF0ZUNoYW5nZWQgTCJGV0xfRVZFTlRfQ0tCX0NoZWNrU3RhdGVDaGFuZ2VkIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ0tCX0NoZWNrU3RhdGVDaGFuZ2VkIDI1MDMyNTI5NjMNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0Q2tiQ2hlY2tTdGF0ZUNoYW5nZWQsDQorICAgICAgICAgICAgICAgICAgICBGV0xfRVZUSEFTSF9DS0JfQ2hlY2tTdGF0ZUNoYW5nZWQpDQogRU5EX0ZXTF9FVkVOVF9ERUYNCi1jbGFzcyBJRldMX0NoZWNrQm94RFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXINCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEJveFNpemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCitjbGFzcyBJRldMX0NoZWNrQm94RFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEJveFNpemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCiB9Ow0KLWNsYXNzIElGV0xfQ2hlY2tCb3ggOiBwdWJsaWMgSUZXTF9XaWRnZXQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZXTF9DaGVja0JveCogQ3JlYXRlKCk7DQotICAgIEZXTF9FUlIJCUluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBGV0xfRVJSCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBpbnQzMl90CUdldENoZWNrU3RhdGUoKTsNCi0gICAgRldMX0VSUgkJU2V0Q2hlY2tTdGF0ZShpbnQzMl90IGlDaGVjayk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX0NoZWNrQm94KCk7DQotICAgIHZpcnR1YWwgfklGV0xfQ2hlY2tCb3goKTsNCitjbGFzcyBJRldMX0NoZWNrQm94IDogcHVibGljIElGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfQ2hlY2tCb3gqIENyZWF0ZSgpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgaW50MzJfdCBHZXRDaGVja1N0YXRlKCk7DQorICBGV0xfRVJSIFNldENoZWNrU3RhdGUoaW50MzJfdCBpQ2hlY2spOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX0NoZWNrQm94KCk7DQorICB2aXJ0dWFsIH5JRldMX0NoZWNrQm94KCk7DQogfTsNCi1jbGFzcyBJRldMX1JhZGlvQnV0dG9uIDogcHVibGljIElGV0xfV2lkZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGV0xfUmFkaW9CdXR0b24qIENyZWF0ZSgpOw0KLSAgICBGV0xfRVJSCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgaW50MzJfdAlHZXRDaGVja1N0YXRlKCk7DQotICAgIEZXTF9FUlIJCVNldENoZWNrU3RhdGUoaW50MzJfdCBpQ2hlY2spOw0KLXByb3RlY3RlZDoNCi0gICAgSUZXTF9SYWRpb0J1dHRvbigpOw0KLSAgICB2aXJ0dWFsIH5JRldMX1JhZGlvQnV0dG9uKCk7DQorY2xhc3MgSUZXTF9SYWRpb0J1dHRvbiA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX1JhZGlvQnV0dG9uKiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIGludDMyX3QgR2V0Q2hlY2tTdGF0ZSgpOw0KKyAgRldMX0VSUiBTZXRDaGVja1N0YXRlKGludDMyX3QgaUNoZWNrKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9SYWRpb0J1dHRvbigpOw0KKyAgdmlydHVhbCB+SUZXTF9SYWRpb0J1dHRvbigpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NvbWJvYm94LmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY29tYm9ib3guaAppbmRleCBkZGNjZDZiLi45ZmFmMjI0IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY29tYm9ib3guaAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY29tYm9ib3guaApAQCAtMTEsNjIgKzExLDYyIEBACiBjbGFzcyBJRldMX0xpc3RCb3g7DQogY2xhc3MgSUZXTF9Db21ib0JveERQOw0KIGNsYXNzIElGV0xfQ29tYm9Cb3g7DQotI2RlZmluZSBGV0xfQ0xBU1NfQ29tYm9Cb3gJCQkJCUwiRldMX0NPTUJPQk9YIg0KLSNkZWZpbmUgRldMX0NMQVNTSEFTSF9Db21ib0JveAkJCQk2MDIzNTM2OTcNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRHJvcExpc3QJCQkoMEwgPDwgMCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd24JCQkoMUwgPDwgMCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfU29ydAkJCQkoMUwgPDwgMSkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfTGlzdERyYWcJCQkoMUwgPDwgMikNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfT3duZXJEcmF3CQkJKDFMIDw8IDMpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRITmVhcgkJCSgwTCA8PCA0KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0SENlbnRlcgkJKDFMIDw8IDQpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIRmFyCQkJKDJMCTw8IDQpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWTmVhcgkJCSgwTCA8PCA2KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0VkNlbnRlcgkJKDFMIDw8IDYpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWRmFyCQkJKDJMCTw8IDYpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRKdXN0aWZpZWQJCSgxTCA8PCA4KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0RGlzdHJpYnV0ZWQJKDJMIDw8IDgpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIQWxpZ25NYXNrCQkoM0wgPDwgNCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZBbGlnbk1hc2sJCSgzTCA8PCA2KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0SEFsaWduTW9kZU1hc2sJKDNMIDw8IDgpDQotI2RlZmluZQlGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtTGVmdEFsaWduCQkoMEwgPDwgMTApDQotI2RlZmluZQlGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtQ2VudGVyQWxpZ24JKDFMIDw8IDEwKQ0KLSNkZWZpbmUJRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbVJpZ2h0QWxpZ24JCSgyTCA8PCAxMCkNCi0jZGVmaW5lCUZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1UZXh0ICAgICAgICAgICAoMEwgPDwgMTIpDQotI2RlZmluZQlGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtSWNvblRleHQJCSgxTCA8PCAxMikNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1BbGlnbk1hc2sJCSgzTCA8PCAxMikNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfUmVhZE9ubHkJCQkJKDFMIDw8IDEzKQ0KLSNkZWZpbmUgRldMX1BBUlRfQ01CX0JvcmRlcgkJCQkJMQ0KLSNkZWZpbmUgRldMX1BBUlRfQ01CX0VkZ2UJCQkJCTINCi0jZGVmaW5lIEZXTF9QQVJUX0NNQl9CYWNrZ3JvdW5kCQkJCTMNCi0jZGVmaW5lIEZXTF9QQVJUX0NNQl9Ecm9wRG93bkJ1dHRvbgkJCTQNCi0jZGVmaW5lIEZXTF9QQVJUX0NNQl9DYXB0aW9uCQkJCTUNCi0jZGVmaW5lIEZXTF9QQVJUX0NNQl9TdHJldGNnSGFuZGxlcgkJCTYNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ01CX05vcm1hbAkJCSgwTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9DTUJfSG92ZXJlZAkJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9DTUJfUHJlc3NlZAkJCSgyTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9DTUJfRGlzYWJsZWQJCQkoM0wgPDwgMCkNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ01CX1NlbGVjdGVkCQkJKDFMIDw8IDIpDQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfQ01CX0NvbWJvRm9ybUhhbmRsZXIJKEZXTF9XR1RDQVBBQ0lUWV9NQVggKyA3KQ0KKyNkZWZpbmUgRldMX0NMQVNTX0NvbWJvQm94IEwiRldMX0NPTUJPQk9YIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9Db21ib0JveCA2MDIzNTM2OTcNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRHJvcExpc3QgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9Tb3J0ICgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9MaXN0RHJhZyAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfT3duZXJEcmF3ICgxTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0SE5lYXIgKDBMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIQ2VudGVyICgxTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0SEZhciAoMkwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZOZWFyICgwTCA8PCA2KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0VkNlbnRlciAoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZGYXIgKDJMIDw8IDYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRKdXN0aWZpZWQgKDFMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXREaXN0cmlidXRlZCAoMkwgPDwgOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhBbGlnbk1hc2sgKDNMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWQWxpZ25NYXNrICgzTCA8PCA2KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0SEFsaWduTW9kZU1hc2sgKDNMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtTGVmdEFsaWduICgwTCA8PCAxMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1DZW50ZXJBbGlnbiAoMUwgPDwgMTApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtUmlnaHRBbGlnbiAoMkwgPDwgMTApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtVGV4dCAoMEwgPDwgMTIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtSWNvblRleHQgKDFMIDw8IDEyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUFsaWduTWFzayAoM0wgPDwgMTIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX1JlYWRPbmx5ICgxTCA8PCAxMykNCisjZGVmaW5lIEZXTF9QQVJUX0NNQl9Cb3JkZXIgMQ0KKyNkZWZpbmUgRldMX1BBUlRfQ01CX0VkZ2UgMg0KKyNkZWZpbmUgRldMX1BBUlRfQ01CX0JhY2tncm91bmQgMw0KKyNkZWZpbmUgRldMX1BBUlRfQ01CX0Ryb3BEb3duQnV0dG9uIDQNCisjZGVmaW5lIEZXTF9QQVJUX0NNQl9DYXB0aW9uIDUNCisjZGVmaW5lIEZXTF9QQVJUX0NNQl9TdHJldGNnSGFuZGxlciA2DQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWwgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NNQl9Ib3ZlcmVkICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DTUJfUHJlc3NlZCAoMkwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ01CX0Rpc2FibGVkICgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DTUJfU2VsZWN0ZWQgKDFMIDw8IDIpDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfQ01CX0NvbWJvRm9ybUhhbmRsZXIgKEZXTF9XR1RDQVBBQ0lUWV9NQVggKyA3KQ0KIGVudW0gRldMX0NNQl9URVhUQ0hBTkdFRCB7DQotICAgIEZXTF9DTUJfVEVYVENIQU5HRURfSW5zZXJ0CT0gMAksDQotICAgIEZXTF9DTUJfVEVYVENIQU5HRURfRGVsZXRlCQksDQotICAgIEZXTF9DTUJfVEVYVENIQU5HRURfUmVwbGFjZQkJLA0KKyAgRldMX0NNQl9URVhUQ0hBTkdFRF9JbnNlcnQgPSAwLA0KKyAgRldMX0NNQl9URVhUQ0hBTkdFRF9EZWxldGUsDQorICBGV0xfQ01CX1RFWFRDSEFOR0VEX1JlcGxhY2UsDQogfTsNCi0jZGVmaW5lIEZXTF9FVlRfQ01CX0Ryb3BEb3duCQkJCUwiRldMX0VWRU5UX0NNQl9QcmVEcm9wRG93biINCi0jZGVmaW5lIEZXTF9FVlRfQ01CX1Bvc3REcm9wRG93bgkJCUwiRldMX0VWRU5UX0NNQl9Qb3N0RHJvcERvd24iDQotI2RlZmluZSBGV0xfRVZUX0NNQl9DbG9zZVVwCQkJCQlMIkZXTF9FVkVOVF9DTUJfQ2xvc2VVcCINCi0jZGVmaW5lIEZXTF9FVlRfQ01CX0VkaXRDaGFuZ2VkCQkJCUwiRldMX0VWRU5UX0NNQl9FZGl0Q2hhbmdlZCINCi0jZGVmaW5lIEZXTF9FVlRfQ01CX1NlbENoYW5nZWQJCQkJTCJGV0xfRVZFTlRfQ01CX1NlbENoYW5nZWQiDQotI2RlZmluZSBGV0xfRVZUX0NNQl9Ib3ZlckNoYW5nZWQJCQlMIkZXTF9FVkVOVF9DTUJfSG92ZXJDaGFuZ2VkIg0KLSNkZWZpbmUgRldMX0VWVF9DTUJfRHJhd0l0ZW0JCQkJTCJGV0xfRVZFTlRfQ01CX0RyYXdJdGVtIg0KLSNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX1ByZURyb3BEb3duCQkJMTM1NzY0Njc5OA0KLSNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX1Bvc3REcm9wRG93bgkJMzY3NzAxMDI4NQ0KLSNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX0Nsb3NlVXAJCQkJMjg3MTI3MTE5MA0KLSNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX0VkaXRDaGFuZ2VkCQkJMTUyNzAzNDc2Mg0KLSNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX1NlbENoYW5nZWQJCQkyOTIzMjI3Nzg0DQotI2RlZmluZSBGV0xfRVZUSEFTSF9DTUJfSG92ZXJDaGFuZ2VkCQk5NDQzMjU0NDgNCi0jZGVmaW5lIEZXTF9FVlRIQVNIX0NNQl9EcmF3SXRlbQkJCTkxNzM1NDU1MQ0KKyNkZWZpbmUgRldMX0VWVF9DTUJfRHJvcERvd24gTCJGV0xfRVZFTlRfQ01CX1ByZURyb3BEb3duIg0KKyNkZWZpbmUgRldMX0VWVF9DTUJfUG9zdERyb3BEb3duIEwiRldMX0VWRU5UX0NNQl9Qb3N0RHJvcERvd24iDQorI2RlZmluZSBGV0xfRVZUX0NNQl9DbG9zZVVwIEwiRldMX0VWRU5UX0NNQl9DbG9zZVVwIg0KKyNkZWZpbmUgRldMX0VWVF9DTUJfRWRpdENoYW5nZWQgTCJGV0xfRVZFTlRfQ01CX0VkaXRDaGFuZ2VkIg0KKyNkZWZpbmUgRldMX0VWVF9DTUJfU2VsQ2hhbmdlZCBMIkZXTF9FVkVOVF9DTUJfU2VsQ2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRfQ01CX0hvdmVyQ2hhbmdlZCBMIkZXTF9FVkVOVF9DTUJfSG92ZXJDaGFuZ2VkIg0KKyNkZWZpbmUgRldMX0VWVF9DTUJfRHJhd0l0ZW0gTCJGV0xfRVZFTlRfQ01CX0RyYXdJdGVtIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX1ByZURyb3BEb3duIDEzNTc2NDY3OTgNCisjZGVmaW5lIEZXTF9FVlRIQVNIX0NNQl9Qb3N0RHJvcERvd24gMzY3NzAxMDI4NQ0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX0Nsb3NlVXAgMjg3MTI3MTE5MA0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX0VkaXRDaGFuZ2VkIDE1MjcwMzQ3NjINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0NNQl9TZWxDaGFuZ2VkIDI5MjMyMjc3ODQNCisjZGVmaW5lIEZXTF9FVlRIQVNIX0NNQl9Ib3ZlckNoYW5nZWQgOTQ0MzI1NDQ4DQorI2RlZmluZSBGV0xfRVZUSEFTSF9DTUJfRHJhd0l0ZW0gOTE3MzU0NTUxDQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENtYlByZURyb3BEb3duLCBGV0xfRVZUSEFTSF9DTUJfUHJlRHJvcERvd24pDQogRU5EX0ZXTF9FVkVOVF9ERUYNCiBCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0Q21iUG9zdERyb3BEb3duLCBGV0xfRVZUSEFTSF9DTUJfUG9zdERyb3BEb3duKQ0KQEAgLTgwLDYwICs4MCw2MyBAQAogRU5EX0ZXTF9FVkVOVF9ERUYNCiBCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0Q21iU2VsQ2hhbmdlZCwgRldMX0VWVEhBU0hfQ01CX1NlbENoYW5nZWQpDQogQ0ZYX0ludDMyQXJyYXkgaUFycmF5U2VsczsNCi1GWF9CT09MCWJMQnV0dG9uVXA7DQorRlhfQk9PTCBiTEJ1dHRvblVwOw0KIEVORF9GV0xfRVZFTlRfREVGDQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENtYkhvdmVyQ2hhbmdlZCwgRldMX0VWVEhBU0hfQ01CX0hvdmVyQ2hhbmdlZCkNCiBpbnQzMl90IG1faUN1ckhvdmVyOw0KIEVORF9GV0xfRVZFTlRfREVGDQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENtYkRyYXdJdGVtLCBGV0xfRVZUSEFTSF9DTUJfRHJhd0l0ZW0pDQotQ0ZYX0dyYXBoaWNzICptX3BHcmFwaGljczsNCitDRlhfR3JhcGhpY3MqIG1fcEdyYXBoaWNzOw0KIENGWF9NYXRyaXggbV9tYXRyaXg7DQogaW50MzJfdCBtX2luZGV4Ow0KIENGWF9SZWN0RiBtX3J0SXRlbTsNCiBFTkRfRldMX0VWRU5UX0RFRg0KLWNsYXNzIElGV0xfQ29tYm9Cb3hEUCA6IHB1YmxpYyBJRldMX0xpc3RCb3hEUA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRlhfRkxPQVQJCUdldExpc3RIZWlnaHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCitjbGFzcyBJRldMX0NvbWJvQm94RFAgOiBwdWJsaWMgSUZXTF9MaXN0Qm94RFAgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldExpc3RIZWlnaHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCiB9Ow0KLWNsYXNzIElGV0xfQ29tYm9Cb3ggOiBwdWJsaWMgSUZXTF9XaWRnZXQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZXTF9Db21ib0JveCogQ3JlYXRlKCk7DQotICAgIEZXTF9FUlIJCUluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBGV0xfRVJSCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBpbnQzMl90CUdldEN1clNlbCgpOw0KLSAgICBGV0xfRVJSCQlTZXRDdXJTZWwoaW50MzJfdCBpU2VsKTsNCi0gICAgRldMX0VSUgkJU2V0RWRpdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIGludDMyX3QJR2V0RWRpdFRleHRMZW5ndGgoKSBjb25zdDsNCi0gICAgRldMX0VSUgkJR2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBuU3RhcnQgPSAwLCBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdDsNCi0gICAgRldMX0VSUgkJU2V0RWRpdFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCi0gICAgaW50MzJfdAlHZXRFZGl0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QgJm5TdGFydCk7DQotICAgIGludDMyX3QJR2V0RWRpdExpbWl0KCk7DQotICAgIEZXTF9FUlIJCVNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCk7DQotICAgIEZXTF9FUlIJCUVkaXREb0NsaXBib2FyZChpbnQzMl90IGlDbWQpOw0KLSAgICBGWF9CT09MCQlFZGl0UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCi0gICAgRlhfQk9PTAkJRWRpdFVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQotICAgIElGV0xfTGlzdEJveCoJR2V0TGlzdEJveHQoKTsNCi0gICAgRlhfQk9PTAkJQWZ0ZXJGb2N1c1Nob3dEcm9wTGlzdCgpOw0KLSAgICBGWF9FUlIJCU9wZW5Ecm9wRG93bkxpc3QoRlhfQk9PTCBiQWN0aXZhdGUpOw0KLSAgICBGWF9CT09MCQlFZGl0Q2FuVW5kbygpOw0KLSAgICBGWF9CT09MCQlFZGl0Q2FuUmVkbygpOw0KLSAgICBGWF9CT09MCQlFZGl0VW5kbygpOw0KLSAgICBGWF9CT09MCQlFZGl0UmVkbygpOw0KLSAgICBGWF9CT09MCQlFZGl0Q2FuQ29weSgpOw0KLSAgICBGWF9CT09MCQlFZGl0Q2FuQ3V0KCk7DQotICAgIEZYX0JPT0wJCUVkaXRDYW5TZWxlY3RBbGwoKTsNCi0gICAgRlhfQk9PTAkJRWRpdENvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSk7DQotICAgIEZYX0JPT0wJCUVkaXRDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCi0gICAgRlhfQk9PTAkJRWRpdFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKTsNCi0gICAgRlhfQk9PTAkJRWRpdFNlbGVjdEFsbCgpOw0KLSAgICBGWF9CT09MCQlFZGl0RGVsZXRlKCk7DQotICAgIEZYX0JPT0wJCUVkaXREZVNlbGVjdCgpOw0KLSAgICBGV0xfRVJSCQlHZXRCQm94KENGWF9SZWN0RiAmcmVjdCk7DQotICAgIEZXTF9FUlIJCUVkaXRNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCi1wcm90ZWN0ZWQ6DQotICAgIElGV0xfQ29tYm9Cb3goKTsNCi0gICAgdmlydHVhbCB+SUZXTF9Db21ib0JveCgpOw0KK2NsYXNzIElGV0xfQ29tYm9Cb3ggOiBwdWJsaWMgSUZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9Db21ib0JveCogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBpbnQzMl90IEdldEN1clNlbCgpOw0KKyAgRldMX0VSUiBTZXRDdXJTZWwoaW50MzJfdCBpU2VsKTsNCisgIEZXTF9FUlIgU2V0RWRpdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBpbnQzMl90IEdldEVkaXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorICBGV0xfRVJSIEdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3Q7DQorICBGV0xfRVJSIFNldEVkaXRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQorICBpbnQzMl90IEdldEVkaXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KTsNCisgIGludDMyX3QgR2V0RWRpdExpbWl0KCk7DQorICBGV0xfRVJSIFNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCk7DQorICBGV0xfRVJSIEVkaXREb0NsaXBib2FyZChpbnQzMl90IGlDbWQpOw0KKyAgRlhfQk9PTCBFZGl0UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCisgIEZYX0JPT0wgRWRpdFVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQorICBJRldMX0xpc3RCb3gqIEdldExpc3RCb3h0KCk7DQorICBGWF9CT09MIEFmdGVyRm9jdXNTaG93RHJvcExpc3QoKTsNCisgIEZYX0VSUiBPcGVuRHJvcERvd25MaXN0KEZYX0JPT0wgYkFjdGl2YXRlKTsNCisgIEZYX0JPT0wgRWRpdENhblVuZG8oKTsNCisgIEZYX0JPT0wgRWRpdENhblJlZG8oKTsNCisgIEZYX0JPT0wgRWRpdFVuZG8oKTsNCisgIEZYX0JPT0wgRWRpdFJlZG8oKTsNCisgIEZYX0JPT0wgRWRpdENhbkNvcHkoKTsNCisgIEZYX0JPT0wgRWRpdENhbkN1dCgpOw0KKyAgRlhfQk9PTCBFZGl0Q2FuU2VsZWN0QWxsKCk7DQorICBGWF9CT09MIEVkaXRDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpOw0KKyAgRlhfQk9PTCBFZGl0Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCk7DQorICBGWF9CT09MIEVkaXRQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSk7DQorICBGWF9CT09MIEVkaXRTZWxlY3RBbGwoKTsNCisgIEZYX0JPT0wgRWRpdERlbGV0ZSgpOw0KKyAgRlhfQk9PTCBFZGl0RGVTZWxlY3QoKTsNCisgIEZXTF9FUlIgR2V0QkJveChDRlhfUmVjdEYmIHJlY3QpOw0KKyAgRldMX0VSUiBFZGl0TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX0NvbWJvQm94KCk7DQorICB2aXJ0dWFsIH5JRldMX0NvbWJvQm94KCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfZGF0ZXRpbWVwaWNrZXIuaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlci5oCmluZGV4IDNmMmE2MGQuLjc1NDQ0NWQgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlci5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlci5oCkBAIC0xMCw0MiArMTAsNDIgQEAKIGNsYXNzIElGV0xfV2lkZ2V0Ow0KIGNsYXNzIElGV0xfRGF0ZVRpbWVQaWNrZXJEUDsNCiBjbGFzcyBJRldMX0RhdGVUaW1lUGlja2VyOw0KLSNkZWZpbmUgRldMX0NMQVNTX0RhdGVUaW1lUGlja2VyCQkJTCJGV0xfREFURVRJTUVQSUNLRVIiDQotI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyCQkzODUxMTc2MjU3DQotI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0FsbG93RWRpdAkJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9Mb25nRGF0ZUZvcm1hdAkJKDBMIDw8IDEpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX1Nob3J0RGF0ZUZvcm1hdAkoMUwgPDwgMSkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfVGltZUZvcm1hdAkJCSgyTCA8PCAxKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9TcGluCQkJCSgxTCA8PCAzKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0SE5lYXIJCQkoMEwgPDwgNCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhDZW50ZXIJCSgxTCA8PCA0KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0SEZhcgkJCSgyTAk8PCA0KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0Vk5lYXIJCQkoMEwgPDwgNikNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZDZW50ZXIJCSgxTCA8PCA2KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0VkZhcgkJCSgyTAk8PCA2KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0SnVzdGlmaWVkCQkoMUwgPDwgOCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdERpc3RyaWJ1dGVkCSgyTCA8PCA4KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0SEFsaWduTWFzawkJKDNMIDw8IDQpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWQWxpZ25NYXNrCQkoM0wgPDwgNikNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhBbGlnbk1vZGVNYXNrCSgzTAk8PCA4KQ0KLSNkZWZpbmUgRldMX1BBUlRfRFRQX0JvcmRlcgkJCQkJMQ0KLSNkZWZpbmUgRldMX1BBUlRfRFRQX0VkZ2UJCQkJCTINCi0jZGVmaW5lIEZXTF9QQVJUX0RUUF9CYWNrZ3JvdW5kCQkJCTMNCi0jZGVmaW5lIEZXTF9QQVJUX0RUUF9Ecm9wRG93bkJ1dHRvbgkJCTQNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfRFRQX05vcm1hbAkJCSgwTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9EVFBfSG92ZXJlZAkJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9EVFBfUHJlc3NlZAkJCSgyTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9EVFBfRGlzYWJsZWQJCQkoM0wgPDwgMCkNCi0jZGVmaW5lIEZXTF9FVlRfRFRQX0Ryb3BEb3duCQkJCUwiRldMX0VWRU5UX0RUUF9Ecm9wRG93biINCi0jZGVmaW5lIEZXTF9FVlRIQVNIX0RUUF9Ecm9wRG93bgkJCTI2NDcyODczMw0KLSNkZWZpbmUgRldMX0VWVF9EVFBfQ2xvc2VVcAkJCQkJTCJGV0xfRVZFTlRfRFRQX0Nsb3NlVXAiDQotI2RlZmluZSBGV0xfRVZUSEFTSF9EVFBfQ2xvc2VVcAkJCQk0MjgwOTczODAzDQotI2RlZmluZQlGV0xfRVZUX0RUUF9FZGl0Q2hhbmdlZAkJCQlMIkZXTF9FVkVOVF9EVFBfRWRpdENoYW5nZWQiDQotI2RlZmluZQlGV0xfRVZUSEFTSF9EVFBfRWRpdENoYW5nZWQJCQk0MDA5NjEwOTQ0DQotI2RlZmluZSBGV0xfRVZUX0RUUF9Ib3ZlckNoYW5nZWQJCQlMIkZXTF9FVkVOVF9EVFBfSG92ZXJDaGFuZ2VkIg0KLSNkZWZpbmUgRldMX0VWVEhBU0hfRFRQX0hvdmVyQ2hhbmdlZAkJNjg2Njc0NzUwDQotI2RlZmluZSBGV0xfRVZUX0RUUF9TZWxlY3RDaGFuZ2VkCQkJTCJGV0xfRVZFTlRfRFRQX1NlbGVjdENoYW5nZWQiDQotI2RlZmluZSBGV0xfRVZUSEFTSF9EVFBfU2VsZWN0Q2hhbmdlZAkJMTU4OTYxNjg1OA0KKyNkZWZpbmUgRldMX0NMQVNTX0RhdGVUaW1lUGlja2VyIEwiRldMX0RBVEVUSU1FUElDS0VSIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9EYXRlVGltZVBpY2tlciAzODUxMTc2MjU3DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0FsbG93RWRpdCAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfTG9uZ0RhdGVGb3JtYXQgKDBMIDw8IDEpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX1Nob3J0RGF0ZUZvcm1hdCAoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfVGltZUZvcm1hdCAoMkwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfU3BpbiAoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhOZWFyICgwTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0SENlbnRlciAoMUwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhGYXIgKDJMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWTmVhciAoMEwgPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZDZW50ZXIgKDFMIDw8IDYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWRmFyICgyTCA8PCA2KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0SnVzdGlmaWVkICgxTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0RGlzdHJpYnV0ZWQgKDJMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRIQWxpZ25NYXNrICgzTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0VkFsaWduTWFzayAoM0wgPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhBbGlnbk1vZGVNYXNrICgzTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1BBUlRfRFRQX0JvcmRlciAxDQorI2RlZmluZSBGV0xfUEFSVF9EVFBfRWRnZSAyDQorI2RlZmluZSBGV0xfUEFSVF9EVFBfQmFja2dyb3VuZCAzDQorI2RlZmluZSBGV0xfUEFSVF9EVFBfRHJvcERvd25CdXR0b24gNA0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9EVFBfSG92ZXJlZCAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfRFRQX1ByZXNzZWQgKDJMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0RUUF9EaXNhYmxlZCAoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9FVlRfRFRQX0Ryb3BEb3duIEwiRldMX0VWRU5UX0RUUF9Ecm9wRG93biINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0RUUF9Ecm9wRG93biAyNjQ3Mjg3MzMNCisjZGVmaW5lIEZXTF9FVlRfRFRQX0Nsb3NlVXAgTCJGV0xfRVZFTlRfRFRQX0Nsb3NlVXAiDQorI2RlZmluZSBGV0xfRVZUSEFTSF9EVFBfQ2xvc2VVcCA0MjgwOTczODAzDQorI2RlZmluZSBGV0xfRVZUX0RUUF9FZGl0Q2hhbmdlZCBMIkZXTF9FVkVOVF9EVFBfRWRpdENoYW5nZWQiDQorI2RlZmluZSBGV0xfRVZUSEFTSF9EVFBfRWRpdENoYW5nZWQgNDAwOTYxMDk0NA0KKyNkZWZpbmUgRldMX0VWVF9EVFBfSG92ZXJDaGFuZ2VkIEwiRldMX0VWRU5UX0RUUF9Ib3ZlckNoYW5nZWQiDQorI2RlZmluZSBGV0xfRVZUSEFTSF9EVFBfSG92ZXJDaGFuZ2VkIDY4NjY3NDc1MA0KKyNkZWZpbmUgRldMX0VWVF9EVFBfU2VsZWN0Q2hhbmdlZCBMIkZXTF9FVkVOVF9EVFBfU2VsZWN0Q2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0RUUF9TZWxlY3RDaGFuZ2VkIDE1ODk2MTY4NTgNCiBCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZlbnRfRHRwRHJvcERvd24sIEZXTF9FVlRIQVNIX0RUUF9Ecm9wRG93bikNCiBFTkRfRldMX0VWRU5UX0RFRg0KIEJFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdmVudF9EdHBDbG9zZVVwLCBGV0xfRVZUSEFTSF9EVFBfQ2xvc2VVcCkNCkBAIC02MSw0MSArNjEsNDcgQEAKIGludDMyX3QgaU1vbnRoOw0KIGludDMyX3QgaURheTsNCiBFTkRfRldMX0VWRU5UX0RFRg0KLWNsYXNzIElGV0xfRGF0ZVRpbWVQaWNrZXJEUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRldMX0VSUiBHZXRUb2RheShJRldMX1dpZGdldCAqcFdpZGdldCwgaW50MzJfdCAmaVllYXIsIGludDMyX3QgJmlNb250aCwgaW50MzJfdCAmaURheSkgPSAwOw0KK2NsYXNzIElGV0xfRGF0ZVRpbWVQaWNrZXJEUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRUb2RheShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSkgPSAwOw0KIH07DQotY2xhc3MgSUZXTF9EYXRlVGltZVBpY2tlciA6IHB1YmxpYyBJRldMX1dpZGdldA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRldMX0RhdGVUaW1lUGlja2VyKiBDcmVhdGUoKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCUdldEN1clNlbChpbnQzMl90ICZpWWVhciwgaW50MzJfdCAmaU1vbnRoLCBpbnQzMl90ICZpRGF5KTsNCi0gICAgRldMX0VSUgkJU2V0Q3VyU2VsKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KLSAgICBGV0xfRVJSCQlTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCi0gICAgRldMX0VSUgkJR2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBuU3RhcnQgPSAwLCBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdDsNCi0gICAgaW50MzJfdAlDb3VudFNlbFJhbmdlcygpOw0KLSAgICBpbnQzMl90CUdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpOw0KLSAgICBGWF9CT09MCQlDYW5VbmRvKCk7DQotICAgIEZYX0JPT0wJCUNhblJlZG8oKTsNCi0gICAgRlhfQk9PTAkJVW5kbygpOw0KLSAgICBGWF9CT09MCQlSZWRvKCk7DQotICAgIEZYX0JPT0wJCUNhbkNvcHkoKTsNCi0gICAgRlhfQk9PTAkJQ2FuQ3V0KCk7DQotICAgIEZYX0JPT0wJCUNhblNlbGVjdEFsbCgpOw0KLSAgICBGWF9CT09MCQlDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpOw0KLSAgICBGWF9CT09MCQlDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCi0gICAgRlhfQk9PTAkJUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpOw0KLSAgICBGWF9CT09MCQlTZWxlY3RBbGwoKTsNCi0gICAgRlhfQk9PTAkJRGVsZXRlKCk7DQotICAgIEZYX0JPT0wJCURlU2VsZWN0KCk7DQotICAgIEZXTF9FUlIJCUdldEJCb3goQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgRldMX0VSUgkJU2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KTsNCi0gICAgRldMX0VSUgkJTW9kaWZ5RWRpdFN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KLXByb3RlY3RlZDoNCi0gICAgSUZXTF9EYXRlVGltZVBpY2tlcigpOw0KLSAgICB2aXJ0dWFsIH5JRldMX0RhdGVUaW1lUGlja2VyKCk7DQorY2xhc3MgSUZXTF9EYXRlVGltZVBpY2tlciA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX0RhdGVUaW1lUGlja2VyKiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIEZXTF9FUlIgR2V0Q3VyU2VsKGludDMyX3QmIGlZZWFyLCBpbnQzMl90JiBpTW9udGgsIGludDMyX3QmIGlEYXkpOw0KKyAgRldMX0VSUiBTZXRDdXJTZWwoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSk7DQorICBGV0xfRVJSIFNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgRldMX0VSUiBHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50ID0gLTEpIGNvbnN0Ow0KKyAgaW50MzJfdCBDb3VudFNlbFJhbmdlcygpOw0KKyAgaW50MzJfdCBHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KTsNCisgIEZYX0JPT0wgQ2FuVW5kbygpOw0KKyAgRlhfQk9PTCBDYW5SZWRvKCk7DQorICBGWF9CT09MIFVuZG8oKTsNCisgIEZYX0JPT0wgUmVkbygpOw0KKyAgRlhfQk9PTCBDYW5Db3B5KCk7DQorICBGWF9CT09MIENhbkN1dCgpOw0KKyAgRlhfQk9PTCBDYW5TZWxlY3RBbGwoKTsNCisgIEZYX0JPT0wgQ29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KTsNCisgIEZYX0JPT0wgQ3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCk7DQorICBGWF9CT09MIFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKTsNCisgIEZYX0JPT0wgU2VsZWN0QWxsKCk7DQorICBGWF9CT09MIERlbGV0ZSgpOw0KKyAgRlhfQk9PTCBEZVNlbGVjdCgpOw0KKyAgRldMX0VSUiBHZXRCQm94KENGWF9SZWN0RiYgcmVjdCk7DQorICBGV0xfRVJSIFNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCk7DQorICBGV0xfRVJSIE1vZGlmeUVkaXRTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfRGF0ZVRpbWVQaWNrZXIoKTsNCisgIHZpcnR1YWwgfklGV0xfRGF0ZVRpbWVQaWNrZXIoKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9lZGl0LmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfZWRpdC5oCmluZGV4IDgyYjAwNTUuLjIwMTlkOGIgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9lZGl0LmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2VkaXQuaApAQCAtMTAsNzAgKzEwLDcwIEBACiBjbGFzcyBJRldMX1dpZGdldDsNCiBjbGFzcyBJRldMX0VkaXREUDsNCiBjbGFzcyBJRldMX0VkaXQ7DQotI2RlZmluZSBGV0xfQ0xBU1NfRWRpdAkJCQkJCUwiRldMX0VESVQiDQotI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0VkaXQJCQkJCTI4OTM5ODc4MjINCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkJCQkoMUwgPDwgMCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfTXVsdGlMaW5lCQkJKDFMIDw8IDEpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1dhbnRSZXR1cm4JCQkoMUwgPDwgMikNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfTm9IaWRlU2VsCQkJKDFMIDw8IDMpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsCQkoMUwgPDwgNCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGwJCSgxTCA8PCA1KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9Ob1JlZG9VbmRvCQkJKDFMIDw8IDYpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1ZhbGlkYXRlCQkJKDFMIDw8IDcpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1Bhc3N3b3JkCQkJKDFMIDw8IDgpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX051bWJlcgkJCQkoMUwgPDwgOSkNCi0jZGVmaW5lCUZXTF9TVFlMRUVYVF9FRFRfSFNlbGZBZGFwdGlvbiAgICAgICgxTCA8PCAxMCkNCi0jZGVmaW5lCUZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbiAgICAgICgxTCA8PCAxMSkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVmVydGljYWxMYXlvdXQJCSgxTCA8PCAxMikNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVmVydGljYWxDaGFycwkJKDFMIDw8IDEzKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9SZXZlcnNlTGluZQkJKDFMIDw8IDE0KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9BcmFiaWNTaGFwZXMJCSgxTCA8PCAxNSkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfRXhwYW5kVGFiCQkJKDFMIDw8IDE2KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dAkJCSgxTCA8PCAxNykNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfSE5lYXIJCQkJKDBMIDw8IDE4KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9IQ2VudGVyCQkJKDFMIDw8IDE4KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9IRmFyCQkJCSgyTAk8PCAxOCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVk5lYXIJCQkJKDBMIDw8IDIwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9WQ2VudGVyCQkJKDFMIDw8IDIwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9WRmFyCQkJCSgyTCA8PCAyMCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfSnVzdGlmaWVkCQkJKDFMIDw8IDIyKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9EaXN0cmlidXRlZAkJKDJMIDw8IDIyKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25NYXNrCQkJKDNMCTw8IDE4KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9WQWxpZ25NYXNrCQkJKDNMCTw8IDIwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25Nb2RlTWFzawkJKDNMCTw8IDIyKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9Jbm5lckNhcmV0CQkJKDFMCTw8IDI0KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMJKDFMCTw8IDI1KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcgkJKDFMCTw8IDI2KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9MYXN0TGluZUhlaWdodAkJKDFMIDw8IDI3KQ0KLSNkZWZpbmUgRldMX1NUQVRFX0VEVF9FZGl0aW5nICAgICAgICAgICAgICAgKDEgPDwgRldMX1dHVFNUQVRFX01BWCkNCi0jZGVmaW5lIEZXTF9QQVJUX0VEVF9Cb3JkZXIJCQkxDQotI2RlZmluZSBGV0xfUEFSVF9FRFRfRWRnZQkJCTINCi0jZGVmaW5lIEZXTF9QQVJUX0VEVF9CYWNrZ3JvdW5kCQkzDQotI2RlZmluZSBGV0xfUEFSVF9FRFRfQ29tYlRleHRMaW5lCTQNCi0jZGVmaW5lIEZXTF9QQVJUREFUQV9FRFRfQmFja2dyb3VuZAkJCTANCi0jZGVmaW5lIEZXTF9QQVJUREFUQV9FRFRfU3RhdGljQmFja2dyb3VuZAkxDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX0VEVF9Ob3JtYWwJCSgwTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9FRFRfUmVhZE9ubHkJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9FRFRfRGlzYWJsZQkJKDJMIDw8IDApDQorI2RlZmluZSBGV0xfQ0xBU1NfRWRpdCBMIkZXTF9FRElUIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9FZGl0IDI4OTM5ODc4MjINCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSAoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfV2FudFJldHVybiAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfTm9IaWRlU2VsICgxTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbCAoMUwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGwgKDFMIDw8IDUpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX05vUmVkb1VuZG8gKDFMIDw8IDYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1ZhbGlkYXRlICgxTCA8PCA3KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9QYXNzd29yZCAoMUwgPDwgOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfTnVtYmVyICgxTCA8PCA5KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uICgxTCA8PCAxMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbiAoMUwgPDwgMTEpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1ZlcnRpY2FsTGF5b3V0ICgxTCA8PCAxMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVmVydGljYWxDaGFycyAoMUwgPDwgMTMpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1JldmVyc2VMaW5lICgxTCA8PCAxNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfQXJhYmljU2hhcGVzICgxTCA8PCAxNSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfRXhwYW5kVGFiICgxTCA8PCAxNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQgKDFMIDw8IDE3KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9ITmVhciAoMEwgPDwgMTgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0hDZW50ZXIgKDFMIDw8IDE4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9IRmFyICgyTCA8PCAxOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVk5lYXIgKDBMIDw8IDIwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9WQ2VudGVyICgxTCA8PCAyMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVkZhciAoMkwgPDwgMjApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0p1c3RpZmllZCAoMUwgPDwgMjIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0Rpc3RyaWJ1dGVkICgyTCA8PCAyMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTWFzayAoM0wgPDwgMTgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1ZBbGlnbk1hc2sgKDNMIDw8IDIwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25Nb2RlTWFzayAoM0wgPDwgMjIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0lubmVyQ2FyZXQgKDFMIDw8IDI0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMgKDFMIDw8IDI1KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciAoMUwgPDwgMjYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0ICgxTCA8PCAyNykNCisjZGVmaW5lIEZXTF9TVEFURV9FRFRfRWRpdGluZyAoMSA8PCBGV0xfV0dUU1RBVEVfTUFYKQ0KKyNkZWZpbmUgRldMX1BBUlRfRURUX0JvcmRlciAxDQorI2RlZmluZSBGV0xfUEFSVF9FRFRfRWRnZSAyDQorI2RlZmluZSBGV0xfUEFSVF9FRFRfQmFja2dyb3VuZCAzDQorI2RlZmluZSBGV0xfUEFSVF9FRFRfQ29tYlRleHRMaW5lIDQNCisjZGVmaW5lIEZXTF9QQVJUREFUQV9FRFRfQmFja2dyb3VuZCAwDQorI2RlZmluZSBGV0xfUEFSVERBVEFfRURUX1N0YXRpY0JhY2tncm91bmQgMQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9FRFRfTm9ybWFsICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9FRFRfUmVhZE9ubHkgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0VEVF9EaXNhYmxlICgyTCA8PCAwKQ0KIGVudW0gRldMX0VEVF9URVhUQ0hBTkdFRCB7DQotICAgIEZXTF9FRFRfVEVYVENIQU5HRURfSW5zZXJ0CT0gMAksDQotICAgIEZXTF9FRFRfVEVYVENIQU5HRURfRGVsZXRlCQksDQotICAgIEZXTF9FRFRfVEVYVENIQU5HRURfUmVwbGFjZQkJLA0KKyAgRldMX0VEVF9URVhUQ0hBTkdFRF9JbnNlcnQgPSAwLA0KKyAgRldMX0VEVF9URVhUQ0hBTkdFRF9EZWxldGUsDQorICBGV0xfRURUX1RFWFRDSEFOR0VEX1JlcGxhY2UsDQogfTsNCi0jZGVmaW5lIEZXTF9FVlRfRURUX0FkZERvUmVjb3JkCQkJCQlMIkZXTF9FVkVOVF9FRFRfQWRkRG9SZWNvcmQiDQotI2RlZmluZSBGV0xfRVZUSEFTSF9FRFRfQWRkRG9SZWNvcmQJCQkJMzcwMTY3MjIyNA0KLSNkZWZpbmUgRldMX0VWVF9FRFRfVGV4dENoYW5nZWQJCQkJCUwiRldMX0VWRU5UX0VEVF9UZXh0Q2hhbmdlZCINCi0jZGVmaW5lIEZXTF9FVlRIQVNIX0VEVF9UZXh0Q2hhbmdlZAkJCQkxMDY0MDIyMTMyDQotI2RlZmluZSBGV0xfRVZUX0VEVF9QcmVTZWxmQWRhcHRpb24JCQkJTCJGV0xfRVZFTlRfUHJlU2VsZkFkYXB0aW9uIg0KLSNkZWZpbmUgRldMX0VWVEhBU0hfRURUX1ByZVNlbGZBZGFwdGlvbgkJCTEwMDE5NzkxNzgNCi0jZGVmaW5lIEZXTF9FVlRfRURUX1ZhbGlkYXRlCQkJCQlMIkZXTF9FVlRIQVNIX0VEVF9WYWxpZGF0ZSINCi0jZGVmaW5lIEZXTF9FVlRIQVNIX0VEVF9WYWxpZGF0ZQkJCQkzMzczMzA4NjA4DQotI2RlZmluZSBGV0xfRVZUX0VEVF9DaGVja1dvcmQJCQkJCUwiRldMX0VWVEhBU0hfRURUX0NoZWNrV29yZCINCi0jZGVmaW5lIEZXTF9FVlRIQVNIX0VEVF9DaGVja1dvcmQJCQkJMjg5NzE4MTUyMA0KLSNkZWZpbmUgRldMX0VWVF9FRFRfR2V0U3VnZ2VzdFdvcmRzCQkJCUwiRldMX0VWVEhBU0hfRURUX0dldFN1Z2dlc3RXb3JkcyINCi0jZGVmaW5lIEZXTF9FVlRIQVNIX0VEVF9HZXRTdWdnZXN0V29yZHMJCQkzMTU3ODI3OTENCi0jZGVmaW5lIEZXTF9FVlRfRURUX1RleHRGdWxsCQkJCQlMIkZXTF9FVlRIQVNIX0VEVF9UZXh0RnVsbCINCi0jZGVmaW5lIEZXTF9FVlRIQVNIX0VEVF9UZXh0RnVsbAkJCQkyMTU4NTgwMTc0DQorI2RlZmluZSBGV0xfRVZUX0VEVF9BZGREb1JlY29yZCBMIkZXTF9FVkVOVF9FRFRfQWRkRG9SZWNvcmQiDQorI2RlZmluZSBGV0xfRVZUSEFTSF9FRFRfQWRkRG9SZWNvcmQgMzcwMTY3MjIyNA0KKyNkZWZpbmUgRldMX0VWVF9FRFRfVGV4dENoYW5nZWQgTCJGV0xfRVZFTlRfRURUX1RleHRDaGFuZ2VkIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX1RleHRDaGFuZ2VkIDEwNjQwMjIxMzINCisjZGVmaW5lIEZXTF9FVlRfRURUX1ByZVNlbGZBZGFwdGlvbiBMIkZXTF9FVkVOVF9QcmVTZWxmQWRhcHRpb24iDQorI2RlZmluZSBGV0xfRVZUSEFTSF9FRFRfUHJlU2VsZkFkYXB0aW9uIDEwMDE5NzkxNzgNCisjZGVmaW5lIEZXTF9FVlRfRURUX1ZhbGlkYXRlIEwiRldMX0VWVEhBU0hfRURUX1ZhbGlkYXRlIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX1ZhbGlkYXRlIDMzNzMzMDg2MDgNCisjZGVmaW5lIEZXTF9FVlRfRURUX0NoZWNrV29yZCBMIkZXTF9FVlRIQVNIX0VEVF9DaGVja1dvcmQiDQorI2RlZmluZSBGV0xfRVZUSEFTSF9FRFRfQ2hlY2tXb3JkIDI4OTcxODE1MjANCisjZGVmaW5lIEZXTF9FVlRfRURUX0dldFN1Z2dlc3RXb3JkcyBMIkZXTF9FVlRIQVNIX0VEVF9HZXRTdWdnZXN0V29yZHMiDQorI2RlZmluZSBGV0xfRVZUSEFTSF9FRFRfR2V0U3VnZ2VzdFdvcmRzIDMxNTc4Mjc5MQ0KKyNkZWZpbmUgRldMX0VWVF9FRFRfVGV4dEZ1bGwgTCJGV0xfRVZUSEFTSF9FRFRfVGV4dEZ1bGwiDQorI2RlZmluZSBGV0xfRVZUSEFTSF9FRFRfVGV4dEZ1bGwgMjE1ODU4MDE3NA0KIEJFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRFZHRBZGREb1JlY29yZCwgRldMX0VWVEhBU0hfRURUX0FkZERvUmVjb3JkKQ0KIENGWF9CeXRlU3RyaW5nIG1fd3NEb1JlY29yZDsNCiBFTkRfRldMX0VWRU5UX0RFRg0KQEAgLTkzLDcgKzkzLDcgQEAKIEJFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRFZHRWYWxpZGF0ZSwgRldMX0VWVEhBU0hfRURUX1ZhbGlkYXRlKQ0KIElGV0xfV2lkZ2V0KiBwRHN0V2lkZ2V0Ow0KIENGWF9XaWRlU3RyaW5nIHdzSW5zZXJ0Ow0KLUZYX0JPT0wJYlZhbGlkYXRlOw0KK0ZYX0JPT0wgYlZhbGlkYXRlOw0KIEVORF9GV0xfRVZFTlRfREVGDQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEVkdENoZWNrV29yZCwgRldMX0VWVEhBU0hfRURUX0NoZWNrV29yZCkNCiBDRlhfQnl0ZVN0cmluZyBic1dvcmQ7DQpAQCAtMTA0LDYyICsxMDQsNjQgQEAKIENGWF9CeXRlU3RyaW5nIGJzV29yZDsNCiBDRlhfQnl0ZVN0cmluZ0FycmF5IGJzQXJyYXlTdWdnZXN0V29yZHM7DQogRU5EX0ZXTF9FVkVOVF9ERUYNCi1jbGFzcyBJRldMX0VkaXREUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlcg0KLXsNCi19Ow0KLSNkZWZpbmUgRldMX0VEVF9GSU5EX0ZMQUdTX1ByZXYJCQkoMEwgPDwgMCkNCi0jZGVmaW5lIEZXTF9FRFRfRklORF9GTEFHU19OZXh0CQkJKDFMIDw8IDApDQotI2RlZmluZSBGV0xfRURUX0ZJTkRfRkxBR1NfV2hvbGVXb3JkCSgxTCA8PCAxKQ0KLSNkZWZpbmUgRldMX0VEVF9GSU5EX0ZMQUdTX05vQ2FzZQkJKDFMIDw8IDIpDQotdHlwZWRlZiBzdHJ1Y3QgX0ZXTF9IRURURklORCB7DQotICAgIHZvaWQqIHBEYXRhOw0KLX0qIEZXTF9IRURURklORDsNCi1jbGFzcyBJRldMX0VkaXQgOiBwdWJsaWMgSUZXTF9XaWRnZXQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZXTF9FZGl0KiBDcmVhdGUoKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIGludDMyX3QJR2V0VGV4dExlbmd0aCgpIGNvbnN0Ow0KLSAgICBGV0xfRVJSCQlHZXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgblN0YXJ0ID0gMCwgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3Q7DQotICAgIEZXTF9FUlIJCUNsZWFyVGV4dCgpOw0KLSAgICBpbnQzMl90CUdldENhcmV0UG9zKCkgY29uc3Q7DQotICAgIGludDMyX3QJU2V0Q2FyZXRQb3MoaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUUpOw0KLSAgICBGV0xfRVJSCQlBZGRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQotICAgIGludDMyX3QJQ291bnRTZWxSYW5nZXMoKTsNCi0gICAgaW50MzJfdAlHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCAmblN0YXJ0KTsNCi0gICAgRldMX0VSUgkJQ2xlYXJTZWxlY3Rpb25zKCk7DQotICAgIGludDMyX3QJR2V0TGltaXQoKTsNCi0gICAgRldMX0VSUgkJU2V0TGltaXQoaW50MzJfdCBuTGltaXQpOw0KLSAgICBGV0xfRVJSCQlTZXRBbGlhc0NoYXIoRlhfV0NIQVIgd0FsaWFzKTsNCi0gICAgRldMX0VSUgkJU2V0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0Zvcm1hdCk7DQotICAgIEZXTF9FUlIgSW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW4pOw0KLSAgICBGV0xfRVJSIERlbGV0ZVNlbGVjdGlvbnMoKTsNCi0gICAgRldMX0VSUiBEZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQotICAgIEZXTF9FUlIgUmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlcGxhY2UpOw0KLSAgICBGV0xfRVJSIFJlcGxhY2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkxlbiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlcGxhY2UpOw0KLSAgICBGV0xfRVJSCURvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCk7DQotICAgIEZYX0JPT0wJQ29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KTsNCi0gICAgRlhfQk9PTAlDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCi0gICAgRlhfQk9PTAlQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSk7DQotICAgIEZYX0JPT0wJRGVsZXRlKCk7DQotICAgIEZYX0JPT0wJUmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCi0gICAgRlhfQk9PTAlVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpOw0KLSAgICBGWF9CT09MCVVuZG8oKTsNCi0gICAgRlhfQk9PTAlSZWRvKCk7DQotICAgIEZYX0JPT0wJQ2FuVW5kbygpOw0KLSAgICBGWF9CT09MCUNhblJlZG8oKTsNCi0gICAgRldMX0VSUiBTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KTsNCi0gICAgRldMX0VSUglTZXRPdXRlcihJRldMX1dpZGdldCAqcE91dGVyKTsNCi0gICAgRldMX0VSUglTZXROdW1iZXJSYW5nZShpbnQzMl90IGlNaW4sIGludDMyX3QgaU1heCk7DQotICAgIEZXTF9FUlIgU2V0QmFja0NvbG9yKEZYX0RXT1JEIGR3Q29sb3IpOw0KLSAgICBGV0xfRVJSIFNldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRm9udCwgRlhfRkxPQVQgZlNpemUpOw0KLSAgICB2b2lkCVNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KTsNCi0gICAgRlhfQk9PTCBHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KTsNCi0gICAgRlhfQk9PTCBSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKTsNCi1wcm90ZWN0ZWQ6DQotICAgIElGV0xfRWRpdCgpOw0KLSAgICB2aXJ0dWFsIH5JRldMX0VkaXQoKTsNCitjbGFzcyBJRldMX0VkaXREUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlciB7fTsNCisjZGVmaW5lIEZXTF9FRFRfRklORF9GTEFHU19QcmV2ICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0VEVF9GSU5EX0ZMQUdTX05leHQgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfRURUX0ZJTkRfRkxBR1NfV2hvbGVXb3JkICgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX0VEVF9GSU5EX0ZMQUdTX05vQ2FzZSAoMUwgPDwgMikNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hFRFRGSU5EIHsgdm9pZCogcERhdGE7IH0gKiBGV0xfSEVEVEZJTkQ7DQorY2xhc3MgSUZXTF9FZGl0IDogcHVibGljIElGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfRWRpdCogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGV0xfRVJSIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBpbnQzMl90IEdldFRleHRMZW5ndGgoKSBjb25zdDsNCisgIEZXTF9FUlIgR2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdDsNCisgIEZXTF9FUlIgQ2xlYXJUZXh0KCk7DQorICBpbnQzMl90IEdldENhcmV0UG9zKCkgY29uc3Q7DQorICBpbnQzMl90IFNldENhcmV0UG9zKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJCZWZvcmUgPSBUUlVFKTsNCisgIEZXTF9FUlIgQWRkU2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KKyAgaW50MzJfdCBDb3VudFNlbFJhbmdlcygpOw0KKyAgaW50MzJfdCBHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KTsNCisgIEZXTF9FUlIgQ2xlYXJTZWxlY3Rpb25zKCk7DQorICBpbnQzMl90IEdldExpbWl0KCk7DQorICBGV0xfRVJSIFNldExpbWl0KGludDMyX3QgbkxpbWl0KTsNCisgIEZXTF9FUlIgU2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdBbGlhcyk7DQorICBGV0xfRVJSIFNldEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQpOw0KKyAgRldMX0VSUiBJbnNlcnQoaW50MzJfdCBuU3RhcnQsIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsIGludDMyX3Qgbkxlbik7DQorICBGV0xfRVJSIERlbGV0ZVNlbGVjdGlvbnMoKTsNCisgIEZXTF9FUlIgRGVsZXRlUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KKyAgRldMX0VSUiBSZXBsYWNlU2VsZWN0aW9ucyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUmVwbGFjZSk7DQorICBGV0xfRVJSIFJlcGxhY2UoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NSZXBsYWNlKTsNCisgIEZXTF9FUlIgRG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKTsNCisgIEZYX0JPT0wgQ29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KTsNCisgIEZYX0JPT0wgQ3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCk7DQorICBGWF9CT09MIFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKTsNCisgIEZYX0JPT0wgRGVsZXRlKCk7DQorICBGWF9CT09MIFJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQorICBGWF9CT09MIFVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQorICBGWF9CT09MIFVuZG8oKTsNCisgIEZYX0JPT0wgUmVkbygpOw0KKyAgRlhfQk9PTCBDYW5VbmRvKCk7DQorICBGWF9CT09MIENhblJlZG8oKTsNCisgIEZXTF9FUlIgU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoLCBGWF9CT09MIGJFcXVpZGlzdGFudCk7DQorICBGV0xfRVJSIFNldE91dGVyKElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgRldMX0VSUiBTZXROdW1iZXJSYW5nZShpbnQzMl90IGlNaW4sIGludDMyX3QgaU1heCk7DQorICBGV0xfRVJSIFNldEJhY2tDb2xvcihGWF9EV09SRCBkd0NvbG9yKTsNCisgIEZXTF9FUlIgU2V0Rm9udChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb250LCBGWF9GTE9BVCBmU2l6ZSk7DQorICB2b2lkIFNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KTsNCisgIEZYX0JPT0wgR2V0U3VnZ2VzdFdvcmRzKENGWF9Qb2ludEYgcG9pbnRmLCBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCk7DQorICBGWF9CT09MIFJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9FZGl0KCk7DQorICB2aXJ0dWFsIH5JRldMX0VkaXQoKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9saXN0Ym94LmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfbGlzdGJveC5oCmluZGV4IDRhYjRlNDYuLmZjZGQ4ZjcgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9saXN0Ym94LmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2xpc3Rib3guaApAQCAtMTAsMTAyICsxMCwxMTkgQEAKIGNsYXNzIElGV0xfV2lkZ2V0Ow0KIGNsYXNzIElGV0xfTGlzdEJveERQOw0KIGNsYXNzIElGV0xfTGlzdEJveDsNCi0jZGVmaW5lIEZXTF9DTEFTU19MaXN0Qm94CQkJTCJGV0xfTElTVEJPWCINCi0jZGVmaW5lIEZXTF9DTEFTU0hBU0hfTGlzdEJveAkJMTc3NzM1ODMxNw0KLSNkZWZpbmUJRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbgkJCSgxTCA8PCAwKQ0KLSNkZWZpbmUJRldMX1NUWUxFRVhUX0xUQl9Tb3J0CQkJCQkoMUwgPDwgMSkNCi0jZGVmaW5lCUZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckFsYXdheXMJKDFMIDw8IDIpDQotI2RlZmluZQlGV0xfU1RZTEVFWFRfTFRCX011bHRpQ29sdW1uCQkJKDFMIDw8IDMpDQotI2RlZmluZQlGV0xfU1RZTEVFWFRfTFRCX0xlZnRBbGlnbgkJCQkoMEwgPDwgNCkNCi0jZGVmaW5lCUZXTF9TVFlMRUVYVF9MVEJfQ2VudGVyQWxpZ24JCQkoMUwgPDwgNCkNCi0jZGVmaW5lCUZXTF9TVFlMRUVYVF9MVEJfUmlnaHRBbGlnbgkJCQkoMkwgPDwgNCkNCi0jZGVmaW5lCUZXTF9TVFlMRUVYVF9MVEJfTXVsdGlMaW5lCQkJCSgxTCA8PCA2KQ0KLSNkZWZpbmUJRldMX1NUWUxFRVhUX0xUQl9Pd25lckRyYXcJCQkJKDFMIDw8IDcpDQotI2RlZmluZQlGV0xfU1RZTEVFWFRfTFRCX0ljb24gICAgICAgICAgICAgICAgICAgKDFMIDw8IDgpDQotI2RlZmluZQlGV0xfU1RZTEVFWFRfTFRCX0NoZWNrICAgICAgICAgICAgICAgICAgKDFMIDw8IDkpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfTFRCX0FsaWduTWFzawkJCQkoM0wgPDwgNCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckZvY3VzCQkoMUwgPDwgMTApDQotI2RlZmluZSBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZAkJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRldMX0lURU1TVEFURV9MVEJfRm9jdXNlZAkJCSgxTCA8PCAxKQ0KLSNkZWZpbmUgRldMX0lURU1TVEFURV9MVEJfQ2hlY2tlZAkJCSgxTCA8PCAyKQ0KLSNkZWZpbmUgRldMX1BBUlRfTFRCX0JvcmRlcgkJCQkJMQ0KLSNkZWZpbmUgRldMX1BBUlRfTFRCX0VkZ2UJCQkJCTINCi0jZGVmaW5lIEZXTF9QQVJUX0xUQl9CYWNrZ3JvdW5kCQkJCTMNCi0jZGVmaW5lIEZXTF9QQVJUX0xUQl9MaXN0SXRlbQkJCQk0DQotI2RlZmluZSBGV0xfUEFSVF9MVEJfQ2hlY2sgICAJCQkJNQ0KLSNkZWZpbmUgRldMX1BBUlRfTFRCX0ljb24gICAJCQkJNg0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9MVEJfTm9ybWFsCQkJKDBMIDw8IDApDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX0xUQl9TZWxlY3RlZAkJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9MVEJfRGlzYWJsZWQJCQkoMkwgPDwgMCkNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfTFRCX0ZvY3VzZWQJCQkoMUwgPDwgMikNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfTFRCX1VuQ2hlY2tlZAkJCSgwTCA8PCAzKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9MVEJfQ2hlY2tlZAkJCSgxTCA8PCAzKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9MVEJfTWFzawkJCQkoM0wgPDwgMCkNCi0jZGVmaW5lIEZXTF9XR1RISVRURVNUX0xUQl9JdGVtCQkJCUZXTF9XR1RISVRURVNUX01BWCArIDENCi0jZGVmaW5lIEZXTF9XR1RISVRURVNUX0xUQl9IU2Nyb2xsQmFyCQlGV0xfV0dUSElUVEVTVF9NQVggKyAyDQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9MVEJfVlNjcm9sbEJhcgkJRldMX1dHVEhJVFRFU1RfTUFYICsgMw0KLSNkZWZpbmUgRldMX0VWVF9MVEJfU2VsQ2hhbmdlZAkJCQlMIkZXTF9FVkVOVF9MVEJfU2VsQ2hhbmdlZCINCi0jZGVmaW5lIEZXTF9FVlRfTFRCX0RyYXdJdGVtCQkJCUwiRldMX0VWRU5UX0xUQl9EcmF3SXRlbSINCi0jZGVmaW5lIEZXTF9FVlRIQVNIX0xUQl9TZWxDaGFuZ2VkCQkJMTcwMTc4MTY4OA0KLSNkZWZpbmUgRldMX0VWVEhBU0hfTFRCX0RyYXdJdGVtCQkJMTA1MDg1Mzk5MQ0KKyNkZWZpbmUgRldMX0NMQVNTX0xpc3RCb3ggTCJGV0xfTElTVEJPWCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfTGlzdEJveCAxNzc3MzU4MzE3DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTFRCX011bHRpU2VsZWN0aW9uICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0xUQl9Tb3J0ICgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyQWxhd2F5cyAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlDb2x1bW4gKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTFRCX0xlZnRBbGlnbiAoMEwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9MVEJfQ2VudGVyQWxpZ24gKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTFRCX1JpZ2h0QWxpZ24gKDJMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTFRCX011bHRpTGluZSAoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9MVEJfT3duZXJEcmF3ICgxTCA8PCA3KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0xUQl9JY29uICgxTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0xUQl9DaGVjayAoMUwgPDwgOSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9MVEJfQWxpZ25NYXNrICgzTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyRm9jdXMgKDFMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfSVRFTVNUQVRFX0xUQl9Gb2N1c2VkICgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX0lURU1TVEFURV9MVEJfQ2hlY2tlZCAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9QQVJUX0xUQl9Cb3JkZXIgMQ0KKyNkZWZpbmUgRldMX1BBUlRfTFRCX0VkZ2UgMg0KKyNkZWZpbmUgRldMX1BBUlRfTFRCX0JhY2tncm91bmQgMw0KKyNkZWZpbmUgRldMX1BBUlRfTFRCX0xpc3RJdGVtIDQNCisjZGVmaW5lIEZXTF9QQVJUX0xUQl9DaGVjayA1DQorI2RlZmluZSBGV0xfUEFSVF9MVEJfSWNvbiA2DQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0xUQl9Ob3JtYWwgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0xUQl9TZWxlY3RlZCAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTFRCX0Rpc2FibGVkICgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9MVEJfRm9jdXNlZCAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTFRCX1VuQ2hlY2tlZCAoMEwgPDwgMykNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTFRCX0NoZWNrZWQgKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0xUQl9NYXNrICgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTFRCX0l0ZW0gRldMX1dHVEhJVFRFU1RfTUFYICsgMQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTFRCX0hTY3JvbGxCYXIgRldMX1dHVEhJVFRFU1RfTUFYICsgMg0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTFRCX1ZTY3JvbGxCYXIgRldMX1dHVEhJVFRFU1RfTUFYICsgMw0KKyNkZWZpbmUgRldMX0VWVF9MVEJfU2VsQ2hhbmdlZCBMIkZXTF9FVkVOVF9MVEJfU2VsQ2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRfTFRCX0RyYXdJdGVtIEwiRldMX0VWRU5UX0xUQl9EcmF3SXRlbSINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0xUQl9TZWxDaGFuZ2VkIDE3MDE3ODE2ODgNCisjZGVmaW5lIEZXTF9FVlRIQVNIX0xUQl9EcmF3SXRlbSAxMDUwODUzOTkxDQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEx0YlNlbENoYW5nZWQsIEZXTF9FVlRIQVNIX0xUQl9TZWxDaGFuZ2VkKQ0KIENGWF9JbnQzMkFycmF5IGlhcnJheVNlbHM7DQogRU5EX0ZXTF9FVkVOVF9ERUYNCiBCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0THRiRHJhd0l0ZW0sIEZXTF9FVlRIQVNIX0xUQl9EcmF3SXRlbSkNCi1DRlhfR3JhcGhpY3MgKm1fcEdyYXBoaWNzOw0KK0NGWF9HcmFwaGljcyogbV9wR3JhcGhpY3M7DQogQ0ZYX01hdHJpeCBtX21hdHJpeDsNCiBpbnQzMl90IG1faW5kZXg7DQogQ0ZYX1JlY3RGIG1fcmVjdDsNCiBFTkRfRldMX0VWRU5UX0RFRg0KLXR5cGVkZWYgc3RydWN0IF9GV0xfSExJU1RJVEVNIHsNCi0gICAgdm9pZCogcERhdGE7DQotfSogRldMX0hMSVNUSVRFTTsNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hMSVNUSVRFTSB7IHZvaWQqIHBEYXRhOyB9ICogRldMX0hMSVNUSVRFTTsNCiB0eXBlZGVmIHN0cnVjdCBfRldMX0xpc3RCb3hJdGVtRGF0YSB7DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YVByb3ZpZGVyOw0KLSAgICBpbnQzMl90IGlJbmRleDsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YVByb3ZpZGVyOw0KKyAgaW50MzJfdCBpSW5kZXg7DQogfSBGV0xfTGlzdEJveEl0ZW1EYXRhOw0KLWNsYXNzIElGV0xfTGlzdEJveERQIDogcHVibGljIElGV0xfRGF0YVByb3ZpZGVyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbAlpbnQzMl90CQkJQ291bnRJdGVtcyhJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsCUZXTF9ITElTVElURU0JCUdldEl0ZW0oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGludDMyX3QgbkluZGV4KSA9IDA7DQotICAgIHZpcnR1YWwJaW50MzJfdAkJCUdldEl0ZW1JbmRleChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBpbnQzMl90IG5JbmRleCkgPSAwOw0KLSAgICB2aXJ0dWFsCUZYX0RXT1JECQkJR2V0SXRlbVN0eWxlcyhJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSkgPSAwOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCQkJR2V0SXRlbVRleHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJCUdldEl0ZW1SZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfUmVjdEYgJnJ0SXRlbSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQqCQkJR2V0SXRlbURhdGEoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pID0gMDsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQkJCVNldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0RXT1JEIGR3U3R5bGUpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJCVNldEl0ZW1UZXh0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBjb25zdCBGWF9XQ0hBUiogcHN6VGV4dCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJU2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IENGWF9SZWN0RiAmcnRJdGVtKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXRJdGVtSGVpZ2h0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKgkJR2V0SXRlbUljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJCUdldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9SZWN0RiYgcnRDaGVjaykgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJU2V0SXRlbUNoZWNrUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgY29uc3QgQ0ZYX1JlY3RGJiBydENoZWNrKSA9IDA7DQotICAgIHZpcnR1YWwJRlhfRFdPUkQJCQlHZXRJdGVtQ2hlY2tTdGF0ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSkgPSAwOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCQkJU2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0RXT1JEIGR3Q2hlY2tTdGF0ZSkgPSAwOw0KK2NsYXNzIElGV0xfTGlzdEJveERQIDogcHVibGljIElGV0xfRGF0YVByb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50SXRlbXMoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRldMX0hMSVNUSVRFTSBHZXRJdGVtKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBpbnQzMl90IG5JbmRleCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEl0ZW1JbmRleChJRldMX1dpZGdldCogcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEl0ZW1JbmRleChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0SXRlbVN0eWxlcyhJRldMX1dpZGdldCogcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldEl0ZW1UZXh0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldEl0ZW1SZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydEl0ZW0pID0gMDsNCisgIHZpcnR1YWwgdm9pZCogR2V0SXRlbURhdGEoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRJdGVtVGV4dChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pUZXh0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSkgPSAwOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRJdGVtSGVpZ2h0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogR2V0SXRlbUljb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydENoZWNrKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbUNoZWNrUmVjdChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2hlY2spID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0pID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRJdGVtQ2hlY2tTdGF0ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q2hlY2tTdGF0ZSkgPSAwOw0KIH07DQotY2xhc3MgSUZXTF9MaXN0Qm94Q29tcGFyZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGV0xfTGlzdEJveENvbXBhcmUoKSB7fQ0KLSAgICB2aXJ0dWFsIGludDMyX3QgQ29tcGFyZShGV0xfSExJU1RJVEVNIGhMZWZ0LCBGV0xfSExJU1RJVEVNIGhSaWdodCkgPSAwOw0KK2NsYXNzIElGV0xfTGlzdEJveENvbXBhcmUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX0xpc3RCb3hDb21wYXJlKCkge30NCisgIHZpcnR1YWwgaW50MzJfdCBDb21wYXJlKEZXTF9ITElTVElURU0gaExlZnQsIEZXTF9ITElTVElURU0gaFJpZ2h0KSA9IDA7DQogfTsNCi1jbGFzcyBJRldMX0xpc3RCb3ggOiBwdWJsaWMgSUZXTF9XaWRnZXQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZXTF9MaXN0Qm94KiBDcmVhdGUoKTsNCi0gICAgRldMX0VSUgkJCUluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBGV0xfRVJSCQkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgaW50MzJfdAkJQ291bnRTZWxJdGVtcygpOw0KLSAgICBGV0xfSExJU1RJVEVNCUdldFNlbEl0ZW0oaW50MzJfdCBuSW5kZXhTZWwpOw0KLSAgICBpbnQzMl90CQlHZXRTZWxJbmRleChpbnQzMl90IG5JbmRleCk7DQotICAgIEZXTF9FUlIJCQlTZXRTZWxJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCA9IFRSVUUpOw0KLSAgICBGV0xfRVJSCQkJR2V0SXRlbVRleHQoRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIEZXTF9FUlIJCQlHZXRTY3JvbGxQb3MoRlhfRkxPQVQgJmZQb3MsIEZYX0JPT0wgYlZlcnQgPSBUUlVFKTsNCi0gICAgRldMX0VSUioJCVNvcnQoSUZXTF9MaXN0Qm94Q29tcGFyZSAqcENvbSk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX0xpc3RCb3goKTsNCi0gICAgdmlydHVhbCB+SUZXTF9MaXN0Qm94KCk7DQorY2xhc3MgSUZXTF9MaXN0Qm94IDogcHVibGljIElGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfTGlzdEJveCogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBpbnQzMl90IENvdW50U2VsSXRlbXMoKTsNCisgIEZXTF9ITElTVElURU0gR2V0U2VsSXRlbShpbnQzMl90IG5JbmRleFNlbCk7DQorICBpbnQzMl90IEdldFNlbEluZGV4KGludDMyX3QgbkluZGV4KTsNCisgIEZXTF9FUlIgU2V0U2VsSXRlbShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTZWxlY3QgPSBUUlVFKTsNCisgIEZXTF9FUlIgR2V0SXRlbVRleHQoRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBGV0xfRVJSIEdldFNjcm9sbFBvcyhGWF9GTE9BVCYgZlBvcywgRlhfQk9PTCBiVmVydCA9IFRSVUUpOw0KKyAgRldMX0VSUiogU29ydChJRldMX0xpc3RCb3hDb21wYXJlKiBwQ29tKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9MaXN0Qm94KCk7DQorICB2aXJ0dWFsIH5JRldMX0xpc3RCb3goKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tZW51LmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfbWVudS5oCmluZGV4IDE1NjI3NDMuLmQxY2U3MTIgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tZW51LmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX21lbnUuaApAQCAtNiwxMCArNiwxMCBAQAogDQogI2lmbmRlZiBfRldMX01FTlVfSA0KICNkZWZpbmUgX0ZXTF9NRU5VX0gNCi0jZGVmaW5lIEZXTF9DTEFTU19NZW51CQkJCQkJTCJGV0xfTUVOVSINCi0jZGVmaW5lIEZXTF9DTEFTU0hBU0hfTWVudQkJCQkJMzk1Nzk0OTY1NQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9Ib3J6CQkJCSgwTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9WZXJ0CQkJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9Eb2NrCQkJCSgxTCA8PCAxKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9Pd25lckRyYXcJCQkoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9DTEFTU19NZW51IEwiRldMX01FTlUiDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX01lbnUgMzk1Nzk0OTY1NQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9Ib3J6ICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9WZXJ0ICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9Eb2NrICgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9Pd25lckRyYXcgKDFMIDw8IDIpDQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX21vbnRoY2FsZW5kYXIuaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyLmgKaW5kZXggYmE2ZGVlZi4uYTc0OTdmMCAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX21vbnRoY2FsZW5kYXIuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfbW9udGhjYWxlbmRhci5oCkBAIC04LDk0ICs4LDk0IEBACiAjZGVmaW5lIF9GV0xfTU9OVEhDQUxFTkRBUl9IDQogY2xhc3MgSUZXTF9Nb250aENhbGVuZGFyRFA7DQogY2xhc3MgSUZXTF9Nb250aENhbGVuZGFyOw0KLSNkZWZpbmUgRldMX0NMQVNTX01vbnRoQ2FsZW5kYXIJCQlMIkZXTF9NT05USENBTEVOREFSIg0KLSNkZWZpbmUgRldMX0NMQVNTSEFTSF9Nb250aENhbGVuZGFyCQkyNzMzOTMxMzc0DQotI2RlZmluZSBGV0xfU1RZTEVFWFRfTUNEX011bHRpU2VsZWN0CQkoMUwgPDwgMCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9NQ0RfTm9Ub2RheQkJCSgxTCA8PCAxKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5Q2lyY2xlCQkoMUwgPDwgMikNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9NQ0RfV2Vla051bWJlcnMJCSgxTCA8PCAzKQ0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9XSURUSAkJCTEyDQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0hlaWdodAkJMTMNCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1dJRFRICQkxNA0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fSEVJR0hUCTE1DQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9ITUFSR0lOCTE2DQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9WTUFSR0lOCTE3DQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRXSURIVAkJMTgNCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVEhFSUdIVAkxOQ0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUX0hNQVJHSU4JMjANCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9WTUFSR0lOCTIxDQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSFNFUF9XSURUSAkJCTIyDQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSFNFUF9IRUlHSFQJCQkyMw0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1ZTRVBfV0lEVEgJCQkyNA0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1ZTRVBfSEVJR0hUCQkgICAgMjUNCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLTlVNX1dJRFRICQkyNg0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1NFUF9ET0ZGU0VUCQkJNDANCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfWAkJCQkyNw0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1NFUF9ZCQkJCTI4DQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS05VTV9IRUlHSFQJCTI5DQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS19XSURUSAkJCTMwDQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS19IRUlHSFQJCQkzMQ0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0RBVEVTX0NFTExfV0lEVEgJCTMyDQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQJMzMNCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9XSURIVAkJCTM0DQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfSEVJR0hUCQkJMzUNCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9GTEFHX1dJREhUCQkzNg0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1dJRFRICQkJCTM3DQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVJR0hUCQkJCTM4DQotI2RlZmluZSBGV0xfSVRFTVNUQVRFX01DRF9Ob21hbAkJCQkoMEwgPDwgMCkNCi0jZGVmaW5lCUZXTF9JVEVNU1RBVEVfTUNEX0ZsYWcJCQkJKDFMIDw8IDApDQotI2RlZmluZQlGV0xfSVRFTVNUQVRFX01DRF9TZWxlY3RlZAkJCSgxTCA8PCAxKQ0KLSNkZWZpbmUJRldMX0lURU1TVEFURV9NQ0RfRm9jdXNlZAkJCSgxTCA8PCAyKQ0KLSNkZWZpbmUgRldMX1BBUlRfTUNEX0JvcmRlcgkJCQkxDQotI2RlZmluZSBGV0xfUEFSVF9NQ0RfRWRnZQkJCQkyDQotI2RlZmluZSBGV0xfUEFSVF9NQ0RfQmFja2dyb3VuZAkJCTMNCi0jZGVmaW5lIEZXTF9QQVJUX01DRF9MQnRuCQkJCTQNCi0jZGVmaW5lIEZXTF9QQVJUX01DRF9SQnRuCQkJCTUNCi0jZGVmaW5lIEZXTF9QQVJUX01DRF9IU2VwYXJhdG9yCQkJNg0KLSNkZWZpbmUgRldMX1BBUlRfTUNEX1ZTZXBhcmF0b3IJCQk3DQotI2RlZmluZSBGV0xfUEFSVF9NQ0RfVG9kYXlDaXJjbGUJCTgNCi0jZGVmaW5lIEZXTF9QQVJUX01DRF9EYXRlSW5DaXJjbGUJCTkNCi0jZGVmaW5lIEZXTF9QQVJUX01DRF9EYXRlSW5CSwkJICAgIDEwDQotI2RlZmluZSBGV0xfUEFSVF9NQ0RfQ2FwdGlvbgkJCTkNCi0jZGVmaW5lIEZXTF9QQVJUX01DRF9EYXRlc0luCQkJMTANCi0jZGVmaW5lIEZXTF9QQVJUX01DRF9EYXRlc091dAkJCTExDQotI2RlZmluZSBGV0xfUEFSVF9NQ0RfV2VlawkJCQkxMg0KLSNkZWZpbmUgRldMX1BBUlRfTUNEX1RvZGF5CQkJCTEzDQotI2RlZmluZSBGV0xfUEFSVF9NQ0RfSGVhZGVyCQkJCTE0DQotI2RlZmluZSBGV0xfUEFSVF9NQ0RfV2Vla051bQkJCTE1DQotI2RlZmluZSBGV0xfUEFSVF9NQ0RfV2Vla051bVNlcAkJCTE2DQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWwJCSgwTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZAkJKDFMIDw8IDApDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX01DRF9Ib3ZlcmVkCQkoMkwgPDwgMCkNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX1NlbGVjdGVkCQkoM0wgPDwgMCkNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX0xTZWxlY3RlZAkJKDFMIDw8IDIpDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX01DRF9SU2VsZWN0ZWQJCSgyTCA8PCAyKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9NQ0RfRmxhZ2dlZAkJKDFMIDw8IDMpDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX01DRF9Gb2N1c2VkCQkoMUwgPDwgNCkNCi0jZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX1N1bgkJCUZXTF9XR1RDQVBBQ0lUWV9NQVggKyA1DQotI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9Nb24JCQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgNg0KLSNkZWZpbmUgRldMX01DQ0FQQUNJVFlfVHVlCQkJRldMX1dHVENBUEFDSVRZX01BWCArIDcNCi0jZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX1dlZAkJCUZXTF9XR1RDQVBBQ0lUWV9NQVggKyA4DQotI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9UaHUJCQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgOQ0KLSNkZWZpbmUgRldMX01DQ0FQQUNJVFlfRnJpCQkJRldMX1dHVENBUEFDSVRZX01BWCArIDEwDQotI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9TYXQJCQlGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTENCi0jZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX0phbnVhcnkJCUZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxMg0KLSNkZWZpbmUgRldMX01DQ0FQQUNJVFlfRmVicnVhcnkJCUZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxMw0KLSNkZWZpbmUgRldMX01DQ0FQQUNJVFlfTWFyY2gJCUZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxNA0KLSNkZWZpbmUgRldMX01DQ0FQQUNJVFlfQXByaWwJCUZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxNQ0KLSNkZWZpbmUgRldMX01DQ0FQQUNJVFlfTWF5CQkJRldMX1dHVENBUEFDSVRZX01BWCArIDE2DQotI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9KdW5lCQkJRldMX1dHVENBUEFDSVRZX01BWCArIDE3DQotI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9KdWx5CQkJRldMX1dHVENBUEFDSVRZX01BWCArIDE4DQotI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9BdWd1c3QJCUZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxOQ0KLSNkZWZpbmUgRldMX01DQ0FQQUNJVFlfU2VwdGVtYmVyCUZXTF9XR1RDQVBBQ0lUWV9NQVggKyAyMA0KLSNkZWZpbmUgRldMX01DQ0FQQUNJVFlfT2N0b2JlcgkJRldMX1dHVENBUEFDSVRZX01BWCArIDIxDQotI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9Ob3ZlbWJlcgkJRldMX1dHVENBUEFDSVRZX01BWCArIDIyDQotI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9EZWNlbWJlcgkJRldMX1dHVENBUEFDSVRZX01BWCArIDIzDQotI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9Ub2RheQkJRldMX1dHVENBUEFDSVRZX01BWCArIDI0DQotI2RlZmluZSBGV0xfRVZFTlRfTUNEX0RBVEVTRUxFQ1RFRCAgICAgICAgICAgIEwiRldMX0VWRU5UX01DRF9EYXRlU2VsZWN0ZWQiDQotI2RlZmluZSBGV0xfRVZUX01DRF9EYXRlQ2hhbmdlZAkJCQkgIEwiRldMX0VWRU5UX01DRF9EYXRlQ2hhbmdlZCINCi0jZGVmaW5lIEZXTF9OT1RFSEFTSF9NQ0RfREFUQVNFTEVDVEVEICAgICAgICAgMTA4NTU5NjkzMg0KLSNkZWZpbmUgRldMX0VWVEhBU0hfTUNEX0RhdGVDaGFuZ2VkCQkJICA1NDIxMjIyNw0KKyNkZWZpbmUgRldMX0NMQVNTX01vbnRoQ2FsZW5kYXIgTCJGV0xfTU9OVEhDQUxFTkRBUiINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfTW9udGhDYWxlbmRhciAyNzMzOTMxMzc0DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTUNEX011bHRpU2VsZWN0ICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5ICgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5Q2lyY2xlICgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01DRF9XZWVrTnVtYmVycyAoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEggMTINCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfSGVpZ2h0IDEzDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9XSURUSCAxNA0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fSEVJR0hUIDE1DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9ITUFSR0lOIDE2DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9WTUFSR0lOIDE3DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRXSURIVCAxOA0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUSEVJR0hUIDE5DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRfSE1BUkdJTiAyMA0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUX1ZNQVJHSU4gMjENCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IU0VQX1dJRFRIIDIyDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSFNFUF9IRUlHSFQgMjMNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19WU0VQX1dJRFRIIDI0DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVlNFUF9IRUlHSFQgMjUNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLTlVNX1dJRFRIIDI2DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfU0VQX0RPRkZTRVQgNDANCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfWCAyNw0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1NFUF9ZIDI4DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS05VTV9IRUlHSFQgMjkNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLX1dJRFRIIDMwDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS19IRUlHSFQgMzENCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX1dJRFRIIDMyDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQgMzMNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9XSURIVCAzNA0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1RPREFZX0hFSUdIVCAzNQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1RPREFZX0ZMQUdfV0lESFQgMzYNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19XSURUSCAzNw0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFSUdIVCAzOA0KKyNkZWZpbmUgRldMX0lURU1TVEFURV9NQ0RfTm9tYWwgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfSVRFTVNUQVRFX01DRF9GbGFnICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0lURU1TVEFURV9NQ0RfU2VsZWN0ZWQgKDFMIDw8IDEpDQorI2RlZmluZSBGV0xfSVRFTVNUQVRFX01DRF9Gb2N1c2VkICgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX0JvcmRlciAxDQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfRWRnZSAyDQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfQmFja2dyb3VuZCAzDQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfTEJ0biA0DQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfUkJ0biA1DQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfSFNlcGFyYXRvciA2DQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfVlNlcGFyYXRvciA3DQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfVG9kYXlDaXJjbGUgOA0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX0RhdGVJbkNpcmNsZSA5DQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfRGF0ZUluQksgMTANCisjZGVmaW5lIEZXTF9QQVJUX01DRF9DYXB0aW9uIDkNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9EYXRlc0luIDEwDQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfRGF0ZXNPdXQgMTENCisjZGVmaW5lIEZXTF9QQVJUX01DRF9XZWVrIDEyDQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfVG9kYXkgMTMNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9IZWFkZXIgMTQNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9XZWVrTnVtIDE1DQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfV2Vla051bVNlcCAxNg0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZCAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX0hvdmVyZWQgKDJMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX01DRF9TZWxlY3RlZCAoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX0xTZWxlY3RlZCAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX1JTZWxlY3RlZCAoMkwgPDwgMikNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX0ZsYWdnZWQgKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX01DRF9Gb2N1c2VkICgxTCA8PCA0KQ0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfU3VuIEZXTF9XR1RDQVBBQ0lUWV9NQVggKyA1DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9Nb24gRldMX1dHVENBUEFDSVRZX01BWCArIDYNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX1R1ZSBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgNw0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfV2VkIEZXTF9XR1RDQVBBQ0lUWV9NQVggKyA4DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9UaHUgRldMX1dHVENBUEFDSVRZX01BWCArIDkNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX0ZyaSBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTANCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX1NhdCBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTENCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX0phbnVhcnkgRldMX1dHVENBUEFDSVRZX01BWCArIDEyDQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9GZWJydWFyeSBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTMNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX01hcmNoIEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxNA0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfQXByaWwgRldMX1dHVENBUEFDSVRZX01BWCArIDE1DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9NYXkgRldMX1dHVENBUEFDSVRZX01BWCArIDE2DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9KdW5lIEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxNw0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfSnVseSBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTgNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX0F1Z3VzdCBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTkNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX1NlcHRlbWJlciBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMjANCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX09jdG9iZXIgRldMX1dHVENBUEFDSVRZX01BWCArIDIxDQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9Ob3ZlbWJlciBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMjINCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX0RlY2VtYmVyIEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAyMw0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfVG9kYXkgRldMX1dHVENBUEFDSVRZX01BWCArIDI0DQorI2RlZmluZSBGV0xfRVZFTlRfTUNEX0RBVEVTRUxFQ1RFRCBMIkZXTF9FVkVOVF9NQ0RfRGF0ZVNlbGVjdGVkIg0KKyNkZWZpbmUgRldMX0VWVF9NQ0RfRGF0ZUNoYW5nZWQgTCJGV0xfRVZFTlRfTUNEX0RhdGVDaGFuZ2VkIg0KKyNkZWZpbmUgRldMX05PVEVIQVNIX01DRF9EQVRBU0VMRUNURUQgMTA4NTU5NjkzMg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfTUNEX0RhdGVDaGFuZ2VkIDU0MjEyMjI3DQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2ZW50X01jZERhdGVTZWxlY3RlZCwgRldMX05PVEVIQVNIX01DRF9EQVRBU0VMRUNURUQpDQogaW50MzJfdCBtX2lTdGFydERheTsNCiBpbnQzMl90IG1faUVuZERheTsNCkBAIC0xMDYsMjUgKzEwNiwyOCBAQAogaW50MzJfdCBtX2lTdGFydERheTsNCiBpbnQzMl90IG1faUVuZERheTsNCiBFTkRfRldMX0VWRU5UX0RFRg0KLWNsYXNzIElGV0xfTW9udGhDYWxlbmRhckRQIDogcHVibGljIElGV0xfRGF0YVByb3ZpZGVyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCBpbnQzMl90ICAgIAlHZXRDdXJEYXkoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRDdXJNb250aChJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEN1clllYXIoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCitjbGFzcyBJRldMX01vbnRoQ2FsZW5kYXJEUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJEYXkoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJNb250aChJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEN1clllYXIoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCiB9Ow0KLWNsYXNzIElGV0xfTW9udGhDYWxlbmRhciA6IHB1YmxpYyBJRldMX1dpZGdldA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRldMX01vbnRoQ2FsZW5kYXIqIENyZWF0ZSgpOw0KK2NsYXNzIElGV0xfTW9udGhDYWxlbmRhciA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX01vbnRoQ2FsZW5kYXIqIENyZWF0ZSgpOw0KIA0KLSAgICBGV0xfRVJSCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgaW50MzJfdAlDb3VudFNlbGVjdCgpOw0KLSAgICBGWF9CT09MCQlHZXRTZWxlY3QoaW50MzJfdCAmaVllYXIsIGludDMyX3QgJmlNb250aCwgaW50MzJfdCAmaURheSwgaW50MzJfdCBuSW5kZXggPSAwKTsNCi0gICAgRlhfQk9PTAkJU2V0U2VsZWN0KGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KLXByb3RlY3RlZDoNCi0gICAgSUZXTF9Nb250aENhbGVuZGFyKCk7DQotICAgIHZpcnR1YWwgfklGV0xfTW9udGhDYWxlbmRhcigpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgaW50MzJfdCBDb3VudFNlbGVjdCgpOw0KKyAgRlhfQk9PTCBHZXRTZWxlY3QoaW50MzJfdCYgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRGF5LA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSAwKTsNCisgIEZYX0JPT0wgU2V0U2VsZWN0KGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX01vbnRoQ2FsZW5kYXIoKTsNCisgIHZpcnR1YWwgfklGV0xfTW9udGhDYWxlbmRhcigpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3guaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9waWN0dXJlYm94LmgKaW5kZXggYzZiNzMyYy4uY2FhN2ZjZSAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3guaAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfcGljdHVyZWJveC5oCkBAIC0xMCw0NiArMTAsNDYgQEAKIGNsYXNzIElGV0xfV2lkZ2V0Ow0KIGNsYXNzIElGV0xfUGljdHVyZUJveERQOw0KIGNsYXNzIElGV0xfUGljdHVyZUJveDsNCi0jZGVmaW5lIEZXTF9DTEFTU19QaWN0dXJlQm94CQkJTCJGV0xfUElDVFVSRUJPWCINCi0jZGVmaW5lIEZXTF9DTEFTU0hBU0hfUGljdHVyZUJveAkJMjk3NDcyMTc0MQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9MZWZ0CQkJCTBMIDw8IDANCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfQ2VudGVyCQkJCTFMIDw8IDANCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfUmlnaHQJCQkJMkwgPDwgMA0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9Ub3AJCQkJMEwgPDwgMg0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9WY2VudGVyCQkJMUwgPDwgMg0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9Cb3R0b20JCQkJMkwgPDwgMg0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9Ob3JtYWwJCQkJMEwgPDwgNA0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9BdXRvU2l6ZQkJCTFMIDw8IDQNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfU3RyZXRjaEltYWdlCQkyTCA8PCA0DQotI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX1N0cmV0Y2hISW1hZ2UJCTNMIDw8IDQNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfU3RyZXRjaFZJbWFnZQkJNEwgPDwgNA0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9IQWxpZ25NYXNrCQkJM0wgPDwgMA0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9WQWxpZ25NYXNrCQkJM0wgPDwgMg0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9TdHJldGNoQWxpZ25NYXNrICAgN0wgPDwgNA0KLSNkZWZpbmUgRldMX1BBUlRfUFRCX0JvcmRlcgkJCQkxDQotI2RlZmluZSBGV0xfUEFSVF9QVEJfRWRnZQkJCQkyDQotI2RlZmluZSBGV0xfUEFSVF9QVEJfSW1hZ2UJCQkJMw0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9QVEJfTm9ybWFsCQkoMEwgPDwgMCkNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFRCX0Rpc2FibGVkCQkoMUwgPDwgMCkNCi1jbGFzcyBJRldMX1BpY3R1cmVCb3hEUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRQaWN0dXJlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRFcnJvclBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEluaXRpYWxQaWN0dXJlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdCBHZXRPcGFjaXR5KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdCBHZXRGbGlwTW9kZShJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgIEdldE1hdHJpeChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX01hdHJpeCAmbWF0cml4KSA9IDA7DQorI2RlZmluZSBGV0xfQ0xBU1NfUGljdHVyZUJveCBMIkZXTF9QSUNUVVJFQk9YIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9QaWN0dXJlQm94IDI5NzQ3MjE3NDENCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfTGVmdCAwTCA8PCAwDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX0NlbnRlciAxTCA8PCAwDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX1JpZ2h0IDJMIDw8IDANCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfVG9wIDBMIDw8IDINCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfVmNlbnRlciAxTCA8PCAyDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX0JvdHRvbSAyTCA8PCAyDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX05vcm1hbCAwTCA8PCA0DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX0F1dG9TaXplIDFMIDw8IDQNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfU3RyZXRjaEltYWdlIDJMIDw8IDQNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfU3RyZXRjaEhJbWFnZSAzTCA8PCA0DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX1N0cmV0Y2hWSW1hZ2UgNEwgPDwgNA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9IQWxpZ25NYXNrIDNMIDw8IDANCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfVkFsaWduTWFzayAzTCA8PCAyDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX1N0cmV0Y2hBbGlnbk1hc2sgN0wgPDwgNA0KKyNkZWZpbmUgRldMX1BBUlRfUFRCX0JvcmRlciAxDQorI2RlZmluZSBGV0xfUEFSVF9QVEJfRWRnZSAyDQorI2RlZmluZSBGV0xfUEFSVF9QVEJfSW1hZ2UgMw0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9QVEJfTm9ybWFsICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9QVEJfRGlzYWJsZWQgKDFMIDw8IDApDQorY2xhc3MgSUZXTF9QaWN0dXJlQm94RFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogR2V0UGljdHVyZShJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEVycm9yUGljdHVyZShJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEluaXRpYWxQaWN0dXJlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0T3BhY2l0eShJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEZsaXBNb2RlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0TWF0cml4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfTWF0cml4JiBtYXRyaXgpID0gMDsNCiB9Ow0KLWNsYXNzIElGV0xfUGljdHVyZUJveCA6IHB1YmxpYyBJRldMX1dpZGdldA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRldMX1BpY3R1cmVCb3gqIENyZWF0ZSgpOw0KK2NsYXNzIElGV0xfUGljdHVyZUJveCA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX1BpY3R1cmVCb3gqIENyZWF0ZSgpOw0KIA0KLSAgICBGV0xfRVJSCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQotICAgIElGV0xfUGljdHVyZUJveCgpOw0KLSAgICB2aXJ0dWFsIH5JRldMX1BpY3R1cmVCb3goKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9QaWN0dXJlQm94KCk7DQorICB2aXJ0dWFsIH5JRldMX1BpY3R1cmVCb3goKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9wdXNoYnV0dG9uLmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbi5oCmluZGV4IDg5MDY4OWEuLmFlNGNlODggMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9wdXNoYnV0dG9uLmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3B1c2hidXR0b24uaApAQCAtMTAsNDggKzEwLDQ4IEBACiBjbGFzcyBJRldMX1dpZGdldDsNCiBjbGFzcyBJRldMX1B1c2hCdXR0b25EUDsNCiBjbGFzcyBJRldMX1B1c2hCdXR0b247DQotI2RlZmluZSBGV0xfQ0xBU1NfUHVzaEJ1dHRvbgkJTCJGV0xfUFVTSEJVVFRPTiINCi0jZGVmaW5lIEZXTF9DTEFTU0hBU0hfUHVzaEJ1dHRvbgkzNTIxNjE0MjQ0DQotI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX0xlZnQJCSgwTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9DZW50ZXIJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9SaWdodAkJKDJMIDw8IDApDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX1RvcAkJKDBMIDw8IDIpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX1ZDZW50ZXIJKDFMIDw8IDIpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX0JvdHRvbQkJKDJMIDw8IDIpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX1RleHRPbmx5CSgwTCA8PCA0KQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9JY29uT25seQkoMUwgPDwgNCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfVGV4dEljb24JKDJMIDw8IDQpDQorI2RlZmluZSBGV0xfQ0xBU1NfUHVzaEJ1dHRvbiBMIkZXTF9QVVNIQlVUVE9OIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9QdXNoQnV0dG9uIDM1MjE2MTQyNDQNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfTGVmdCAoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfQ2VudGVyICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9SaWdodCAoMkwgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfVG9wICgwTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9WQ2VudGVyICgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9Cb3R0b20gKDJMIDw8IDIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX1RleHRPbmx5ICgwTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9JY29uT25seSAoMUwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfVGV4dEljb24gKDJMIDw8IDQpDQogI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX0hMYXlvdXRNYXNrICgzTCA8PCAwKQ0KICNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9WTGF5b3V0TWFzayAoM0wgPDwgMikNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfTW9kZU1hc2sJICgzTCA8PCA0KQ0KLSNkZWZpbmUgRldMX1NUQVRFX1BTQl9Ib3ZlcmVkCQkoMSA8PCBGV0xfV0dUU1RBVEVfTUFYKQ0KLSNkZWZpbmUgRldMX1NUQVRFX1BTQl9QcmVzc2VkCQkoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDEpKQ0KLSNkZWZpbmUgRldMX1NUQVRFX1BTQl9EZWZhdWx0CQkoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDIpKQ0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX1BTQl9NYXJnaW4JCShGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMSkNCi0jZGVmaW5lIEZXTF9QQVJUX1BTQl9Cb3JkZXIJCQkxDQotI2RlZmluZSBGV0xfUEFSVF9QU0JfRWRnZQkJCTINCi0jZGVmaW5lIEZXTF9QQVJUX1BTQl9CYWNrZ3JvdW5kCQkzDQotI2RlZmluZSBGV0xfUEFSVF9QU0JfQ2FwdGlvbgkJNA0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9QU0JfTm9ybWFsCSgwTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9QU0JfUHJlc3NlZAkoMUwgPDwgMCkNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFNCX0hvdmVyZWQJKDJMIDw8IDApDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX1BTQl9EZWZhdWx0CSgzTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9QU0JfRGlzYWJsZWQJKDRMIDw8IDApDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX1BTQl9Gb2N1c2VkCSgxTCA8PCAzKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9QU0JfTWFzawkJKDdMIDw8IDApDQotY2xhc3MgSUZXTF9QdXNoQnV0dG9uRFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXINCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogR2V0UGljdHVyZShJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9Nb2RlTWFzayAoM0wgPDwgNCkNCisjZGVmaW5lIEZXTF9TVEFURV9QU0JfSG92ZXJlZCAoMSA8PCBGV0xfV0dUU1RBVEVfTUFYKQ0KKyNkZWZpbmUgRldMX1NUQVRFX1BTQl9QcmVzc2VkICgxIDw8IChGV0xfV0dUU1RBVEVfTUFYICsgMSkpDQorI2RlZmluZSBGV0xfU1RBVEVfUFNCX0RlZmF1bHQgKDEgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAyKSkNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9QU0JfTWFyZ2luIChGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMSkNCisjZGVmaW5lIEZXTF9QQVJUX1BTQl9Cb3JkZXIgMQ0KKyNkZWZpbmUgRldMX1BBUlRfUFNCX0VkZ2UgMg0KKyNkZWZpbmUgRldMX1BBUlRfUFNCX0JhY2tncm91bmQgMw0KKyNkZWZpbmUgRldMX1BBUlRfUFNCX0NhcHRpb24gNA0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9QU0JfTm9ybWFsICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9QU0JfUHJlc3NlZCAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFNCX0hvdmVyZWQgKDJMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1BTQl9EZWZhdWx0ICgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9QU0JfRGlzYWJsZWQgKDRMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1BTQl9Gb2N1c2VkICgxTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9QU0JfTWFzayAoN0wgPDwgMCkNCitjbGFzcyBJRldMX1B1c2hCdXR0b25EUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRQaWN0dXJlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQogfTsNCi1jbGFzcyBJRldMX1B1c2hCdXR0b24gOiBwdWJsaWMgSUZXTF9XaWRnZXQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZXTF9QdXNoQnV0dG9uKiBDcmVhdGUoKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX1B1c2hCdXR0b24oKTsNCi0gICAgdmlydHVhbCB+SUZXTF9QdXNoQnV0dG9uKCk7DQorY2xhc3MgSUZXTF9QdXNoQnV0dG9uIDogcHVibGljIElGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfUHVzaEJ1dHRvbiogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfUHVzaEJ1dHRvbigpOw0KKyAgdmlydHVhbCB+SUZXTF9QdXNoQnV0dG9uKCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfc2Nyb2xsYmFyLmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfc2Nyb2xsYmFyLmgKaW5kZXggOGZjNzZmNi4uMTNkNzBhMSAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3Njcm9sbGJhci5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9zY3JvbGxiYXIuaApAQCAtMTAsNjQgKzEwLDYzIEBACiBjbGFzcyBJRldMX1dpZGdldDsNCiBjbGFzcyBJRldMX1Njcm9sbEJhckRQOw0KIGNsYXNzIElGV0xfU2Nyb2xsQmFyOw0KLSNkZWZpbmUgRldMX0NMQVNTX1Njcm9sbEJhcgkJCQlMIkZXTF9TQ1JPTExCQVIiDQotI2RlZmluZSBGV0xfQ0xBU1NIQVNIX1Njcm9sbEJhcgkJCTI4MjY1ODQ4NDQNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9TQ0JfSG9yegkJCSgwTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1NDQl9WZXJ0CQkJKDFMIDw8IDApDQotI2RlZmluZSBGV0xfUEFSVF9TQ0JfQm9yZGVyCQkJCTENCi0jZGVmaW5lIEZXTF9QQVJUX1NDQl9FZGdlCQkJCTINCi0jZGVmaW5lIEZXTF9QQVJUX1NDQl9CYWNrZ3JvdW5kCQkJMw0KLSNkZWZpbmUgRldMX1BBUlRfU0NCX0ZvcmVBcnJvdwkJCTQNCi0jZGVmaW5lIEZXTF9QQVJUX1NDQl9CYWNrQXJyb3cJCQk1DQotI2RlZmluZSBGV0xfUEFSVF9TQ0JfVGh1bWIJCQkJNg0KLSNkZWZpbmUgRldMX1BBUlRfU0NCX0xvd2VyVHJhY2sJCQk3DQotI2RlZmluZSBGV0xfUEFSVF9TQ0JfVXBwZXJUcmFjawkJCTgNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbAkJKDBMIDw8IDApDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX1NDQl9Ib3ZlcmVkCQkoMUwgPDwgMCkNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQJCSgyTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9TQ0JfRGlzYWJsZWQJCSgzTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1dHVEhJVFRFU1RfU0NCX0ZvcmVBcnJvdwlGV0xfV0dUSElUVEVTVF9NQVggKyAxDQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9TQ0JfQmFja0Fycm93CUZXTF9XR1RISVRURVNUX01BWCArIDINCi0jZGVmaW5lIEZXTF9XR1RISVRURVNUX1NDQl9Mb3dlclRyYWNrCUZXTF9XR1RISVRURVNUX01BWCArIDMNCi0jZGVmaW5lIEZXTF9XR1RISVRURVNUX1NDQl9VcHBlclRyYWNrCUZXTF9XR1RISVRURVNUX01BWCArIDQNCi0jZGVmaW5lIEZXTF9XR1RISVRURVNUX1NDQl9UaHVtYgkJRldMX1dHVEhJVFRFU1RfTUFYICsgNQ0KLSNkZWZpbmUgRldMX0NBUEFDSVRZX1NDQl9TaXplCQkJRldMX1dHVENBUEFDSVRZX01BWA0KKyNkZWZpbmUgRldMX0NMQVNTX1Njcm9sbEJhciBMIkZXTF9TQ1JPTExCQVIiDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX1Njcm9sbEJhciAyODI2NTg0ODQ0DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfU0NCX0hvcnogKDBMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfU0NCX1ZlcnQgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVF9TQ0JfQm9yZGVyIDENCisjZGVmaW5lIEZXTF9QQVJUX1NDQl9FZGdlIDINCisjZGVmaW5lIEZXTF9QQVJUX1NDQl9CYWNrZ3JvdW5kIDMNCisjZGVmaW5lIEZXTF9QQVJUX1NDQl9Gb3JlQXJyb3cgNA0KKyNkZWZpbmUgRldMX1BBUlRfU0NCX0JhY2tBcnJvdyA1DQorI2RlZmluZSBGV0xfUEFSVF9TQ0JfVGh1bWIgNg0KKyNkZWZpbmUgRldMX1BBUlRfU0NCX0xvd2VyVHJhY2sgNw0KKyNkZWZpbmUgRldMX1BBUlRfU0NCX1VwcGVyVHJhY2sgOA0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9TQ0JfSG92ZXJlZCAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQgKDJMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1NDQl9EaXNhYmxlZCAoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1NDQl9Gb3JlQXJyb3cgRldMX1dHVEhJVFRFU1RfTUFYICsgMQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfU0NCX0JhY2tBcnJvdyBGV0xfV0dUSElUVEVTVF9NQVggKyAyDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9TQ0JfTG93ZXJUcmFjayBGV0xfV0dUSElUVEVTVF9NQVggKyAzDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9TQ0JfVXBwZXJUcmFjayBGV0xfV0dUSElUVEVTVF9NQVggKyA0DQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9TQ0JfVGh1bWIgRldMX1dHVEhJVFRFU1RfTUFYICsgNQ0KKyNkZWZpbmUgRldMX0NBUEFDSVRZX1NDQl9TaXplIEZXTF9XR1RDQVBBQ0lUWV9NQVgNCiBlbnVtIEZXTF9TQ0JDT0RFIHsNCi0gICAgRldMX1NDQkNPREVfTm9uZQkJCSA9IDEsDQotICAgIEZXTF9TQ0JDT0RFX01pbgkJCQkJLA0KLSAgICBGV0xfU0NCQ09ERV9NYXgJCQkJCSwNCi0gICAgRldMX1NDQkNPREVfUGFnZUJhY2t3YXJkCQksDQotICAgIEZXTF9TQ0JDT0RFX1BhZ2VGb3J3YXJkCQkJLA0KLSAgICBGV0xfU0NCQ09ERV9TdGVwQmFja3dhcmQJCSwNCi0gICAgRldMX1NDQkNPREVfU3RlcEZvcndhcmQJCQksDQotICAgIEZXTF9TQ0JDT0RFX1BvcwkJCQkJLA0KLSAgICBGV0xfU0NCQ09ERV9UcmFja1BvcwkJCSwNCi0gICAgRldMX1NDQkNPREVfRW5kU2Nyb2xsCQkJLA0KKyAgRldMX1NDQkNPREVfTm9uZSA9IDEsDQorICBGV0xfU0NCQ09ERV9NaW4sDQorICBGV0xfU0NCQ09ERV9NYXgsDQorICBGV0xfU0NCQ09ERV9QYWdlQmFja3dhcmQsDQorICBGV0xfU0NCQ09ERV9QYWdlRm9yd2FyZCwNCisgIEZXTF9TQ0JDT0RFX1N0ZXBCYWNrd2FyZCwNCisgIEZXTF9TQ0JDT0RFX1N0ZXBGb3J3YXJkLA0KKyAgRldMX1NDQkNPREVfUG9zLA0KKyAgRldMX1NDQkNPREVfVHJhY2tQb3MsDQorICBGV0xfU0NCQ09ERV9FbmRTY3JvbGwsDQogfTsNCi1jbGFzcyBJRldMX1Njcm9sbEJhckRQIDogcHVibGljIElGV0xfRGF0YVByb3ZpZGVyDQotew0KLX07DQotY2xhc3MgSUZXTF9TY3JvbGxCYXIgOiBwdWJsaWMgSUZXTF9XaWRnZXQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZXTF9TY3JvbGxCYXIqIENyZWF0ZSgpOw0KK2NsYXNzIElGV0xfU2Nyb2xsQmFyRFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXIge307DQorY2xhc3MgSUZXTF9TY3JvbGxCYXIgOiBwdWJsaWMgSUZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9TY3JvbGxCYXIqIENyZWF0ZSgpOw0KIA0KLSAgICBGV0xfRVJSCQkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBGWF9CT09MCQkJSXNWZXJ0aWNhbCgpOw0KLSAgICBGV0xfRVJSCQkJR2V0UmFuZ2UoRlhfRkxPQVQgJmZNaW4sIEZYX0ZMT0FUICZmTWF4KTsNCi0gICAgRldMX0VSUgkJCVNldFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgpOw0KLSAgICBGWF9GTE9BVAkJR2V0UGFnZVNpemUoKTsNCi0gICAgRldMX0VSUgkJCVNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSk7DQotICAgIEZYX0ZMT0FUCQlHZXRTdGVwU2l6ZSgpOw0KLSAgICBGV0xfRVJSCQkJU2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKTsNCi0gICAgRlhfRkxPQVQJCUdldFBvcygpOw0KLSAgICBGV0xfRVJSCQkJU2V0UG9zKEZYX0ZMT0FUIGZQb3MpOw0KLSAgICBGWF9GTE9BVAkJR2V0VHJhY2tQb3MoKTsNCi0gICAgRldMX0VSUgkJCVNldFRyYWNrUG9zKEZYX0ZMT0FUIGZUcmFja1Bvcyk7DQotICAgIEZYX0JPT0wJCQlEb1Njcm9sbChGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MgPSAwLjBmKTsNCi1wcm90ZWN0ZWQ6DQotICAgIElGV0xfU2Nyb2xsQmFyKCk7DQotICAgIHZpcnR1YWwgfklGV0xfU2Nyb2xsQmFyKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGWF9CT09MIElzVmVydGljYWwoKTsNCisgIEZXTF9FUlIgR2V0UmFuZ2UoRlhfRkxPQVQmIGZNaW4sIEZYX0ZMT0FUJiBmTWF4KTsNCisgIEZXTF9FUlIgU2V0UmFuZ2UoRlhfRkxPQVQgZk1pbiwgRlhfRkxPQVQgZk1heCk7DQorICBGWF9GTE9BVCBHZXRQYWdlU2l6ZSgpOw0KKyAgRldMX0VSUiBTZXRQYWdlU2l6ZShGWF9GTE9BVCBmUGFnZVNpemUpOw0KKyAgRlhfRkxPQVQgR2V0U3RlcFNpemUoKTsNCisgIEZXTF9FUlIgU2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKTsNCisgIEZYX0ZMT0FUIEdldFBvcygpOw0KKyAgRldMX0VSUiBTZXRQb3MoRlhfRkxPQVQgZlBvcyk7DQorICBGWF9GTE9BVCBHZXRUcmFja1BvcygpOw0KKyAgRldMX0VSUiBTZXRUcmFja1BvcyhGWF9GTE9BVCBmVHJhY2tQb3MpOw0KKyAgRlhfQk9PTCBEb1Njcm9sbChGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MgPSAwLjBmKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9TY3JvbGxCYXIoKTsNCisgIHZpcnR1YWwgfklGV0xfU2Nyb2xsQmFyKCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbi5oIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3NwaW5idXR0b24uaAppbmRleCBiYTQxN2YzLi4zMWYwNmM1IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbi5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9zcGluYnV0dG9uLmgKQEAgLTksMzUgKzksMzYgQEAKIGNsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCiBjbGFzcyBJRldMX1dpZGdldDsNCiBjbGFzcyBJRldMX1NwaW5CdXR0b247DQotI2RlZmluZQkJRldMX0NMQVNTX1NwaW5CdXR0b24JCQlMIkZXTF9TUElOQlVUVE9OIg0KLSNkZWZpbmUJCUZXTF9DTEFTU0hBU0hfU3BpbkJ1dHRvbgkJMzc5MzA0MzY0Ng0KLSNkZWZpbmUJCUZXTF9TVFlMRUVYRV9TUEJfVmVydAkJCSgxTCA8PCAwKQ0KLSNkZWZpbmUJCUZXTF9QQVJUX1NQQl9Cb3JkZXIJCQkJMQ0KLSNkZWZpbmUJCUZXTF9QQVJUX1NQQl9FZGdlCQkJCTINCi0jZGVmaW5lCQlGV0xfUEFSVF9TUEJfVXBCdXR0b24JCQkzDQotI2RlZmluZQkJRldMX1BBUlRfU1BCX0Rvd25CdXR0b24JCQk0DQotI2RlZmluZQkJRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsCQkoMEwgPDwgMCkNCi0jZGVmaW5lCQlGV0xfUEFSVFNUQVRFX1NQQl9Ib3ZlcmVkCQkoMUwgPDwgMCkNCi0jZGVmaW5lCQlGV0xfUEFSVFNUQVRFX1NQQl9QcmVzc2VkCQkoMkwgPDwgMCkNCi0jZGVmaW5lCQlGV0xfUEFSVFNUQVRFX1NQQl9EaXNhYmxlZAkJKDNMIDw8IDApDQotI2RlZmluZQkJRldMX1dHVEhJVFRFU1RfU1BCX1VwQnV0dG9uCQkoRldMX1dHVEhJVFRFU1RfTUFYICsgMSkNCi0jZGVmaW5lCQlGV0xfV0dUSElUVEVTVF9TUEJfRG93bkJ1dHRvbgkoRldMX1dHVEhJVFRFU1RfTUFYICsgMikNCi0jZGVmaW5lIEZXTF9FVlRfU1BCX0NsaWNrCQkJCQlMIkZXTF9FVkVOVF9TUEJfQ2xpY2siDQotI2RlZmluZSBGV0xfRVZUSEFTSF9TUEJfQ2xpY2sJCQkJMjkyNzY1MTE4Nw0KKyNkZWZpbmUgRldMX0NMQVNTX1NwaW5CdXR0b24gTCJGV0xfU1BJTkJVVFRPTiINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfU3BpbkJ1dHRvbiAzNzkzMDQzNjQ2DQorI2RlZmluZSBGV0xfU1RZTEVFWEVfU1BCX1ZlcnQgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVF9TUEJfQm9yZGVyIDENCisjZGVmaW5lIEZXTF9QQVJUX1NQQl9FZGdlIDINCisjZGVmaW5lIEZXTF9QQVJUX1NQQl9VcEJ1dHRvbiAzDQorI2RlZmluZSBGV0xfUEFSVF9TUEJfRG93bkJ1dHRvbiA0DQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1NQQl9Ib3ZlcmVkICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9TUEJfUHJlc3NlZCAoMkwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfU1BCX0Rpc2FibGVkICgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfU1BCX1VwQnV0dG9uIChGV0xfV0dUSElUVEVTVF9NQVggKyAxKQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfU1BCX0Rvd25CdXR0b24gKEZXTF9XR1RISVRURVNUX01BWCArIDIpDQorI2RlZmluZSBGV0xfRVZUX1NQQl9DbGljayBMIkZXTF9FVkVOVF9TUEJfQ2xpY2siDQorI2RlZmluZSBGV0xfRVZUSEFTSF9TUEJfQ2xpY2sgMjkyNzY1MTE4Nw0KIEJFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRTcGJDbGljaywgRldMX0VWVEhBU0hfU1BCX0NsaWNrKQ0KIEZYX0JPT0wgbV9iVXA7DQogRU5EX0ZXTF9FVkVOVF9ERUYNCi1jbGFzcyBJRldMX1NwaW5CdXR0b24gOiBwdWJsaWMgSUZXTF9XaWRnZXQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZXTF9TcGluQnV0dG9uKiBDcmVhdGUoKTsNCitjbGFzcyBJRldMX1NwaW5CdXR0b24gOiBwdWJsaWMgSUZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9TcGluQnV0dG9uKiBDcmVhdGUoKTsNCiANCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCUVuYWJsZUJ1dHRvbihGWF9CT09MIGJFbmFibGUsIEZYX0JPT0wgYlVwID0gVFJVRSk7DQotICAgIEZYX0JPT0wJCUlzQnV0dG9uRW5hYmxlKEZYX0JPT0wgYlVwID0gVFJVRSk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX1NwaW5CdXR0b24oKTsNCi0gICAgdmlydHVhbCB+SUZXTF9TcGluQnV0dG9uKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGV0xfRVJSIEVuYWJsZUJ1dHRvbihGWF9CT09MIGJFbmFibGUsIEZYX0JPT0wgYlVwID0gVFJVRSk7DQorICBGWF9CT09MIElzQnV0dG9uRW5hYmxlKEZYX0JPT0wgYlVwID0gVFJVRSk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfU3BpbkJ1dHRvbigpOw0KKyAgdmlydHVhbCB+SUZXTF9TcGluQnV0dG9uKCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfdG9vbHRpcGN0cmwuaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF90b29sdGlwY3RybC5oCmluZGV4IDJkZjE0MTIuLmE2NGQ2ODEgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF90b29sdGlwY3RybC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF90b29sdGlwY3RybC5oCkBAIC0xMCwzNiArMTAsMzcgQEAKIGNsYXNzIElGV0xfRm9ybTsNCiBjbGFzcyBJRldMX1Rvb2xUaXBEUDsNCiBjbGFzcyBJRldMX1Rvb2xUaXA7DQotI2RlZmluZSBGV0xfQ0xBU1NfVG9vbFRpcAkJTCJGV0xfVE9PTFRJUCINCi0jZGVmaW5lIEZXTF9DTEFTU0hBU0hfVG9vbFRpcAkxMTExOTg0NzU1DQotI2RlZmluZSBGV0xfU1RZTEVFWFRfVFRQX1JlY3RhbmdsZQkJKDBMIDw8IDMpDQotI2RlZmluZSBGV0xfU1RZTEVFWFRfVFRQX1JvdW5kQ29ybmVyCSgxTCA8PCAzKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX1RUUF9CYWxsb29uCQkoMUwgPDwgNCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9UVFBfTXVsdGlsaW5lCQkoMUwgPDwgNSkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9UVFBfTm9BbmNob3IJCSgxTCA8PCA2KQ0KLSNkZWZpbmUgRldMX1BBUlRfVFRQX0JvcmRlcgkJCTENCi0jZGVmaW5lIEZXTF9QQVJUX1RUUF9CYWNrZ3JvdW5kCQkyDQotI2RlZmluZSBGV0xfUEFSVF9UVFBfQ2FwdGlvbgkJMw0KLWNsYXNzIElGV0xfVG9vbFRpcERQIDogcHVibGljIElGV0xfRGF0YVByb3ZpZGVyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CSAJR2V0SW5pdGlhbERlbGF5KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkgCUdldEF1dG9Qb3BEZWxheShJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCoJR2V0VG9vbFRpcEljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBDRlhfU2l6ZUYJCUdldFRvb2xUaXBJY29uU2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KKyNkZWZpbmUgRldMX0NMQVNTX1Rvb2xUaXAgTCJGV0xfVE9PTFRJUCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfVG9vbFRpcCAxMTExOTg0NzU1DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfVFRQX1JlY3RhbmdsZSAoMEwgPDwgMykNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9UVFBfUm91bmRDb3JuZXIgKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfVFRQX0JhbGxvb24gKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfVFRQX011bHRpbGluZSAoMUwgPDwgNSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9UVFBfTm9BbmNob3IgKDFMIDw8IDYpDQorI2RlZmluZSBGV0xfUEFSVF9UVFBfQm9yZGVyIDENCisjZGVmaW5lIEZXTF9QQVJUX1RUUF9CYWNrZ3JvdW5kIDINCisjZGVmaW5lIEZXTF9QQVJUX1RUUF9DYXB0aW9uIDMNCitjbGFzcyBJRldMX1Rvb2xUaXBEUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEluaXRpYWxEZWxheShJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEF1dG9Qb3BEZWxheShJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldFRvb2xUaXBJY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIENGWF9TaXplRiBHZXRUb29sVGlwSWNvblNpemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCiB9Ow0KLWNsYXNzIElGV0xfVG9vbFRpcCA6IHB1YmxpYyBJRldMX0Zvcm0NCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZXTF9Ub29sVGlwKiBDcmVhdGUoKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCVNldEFuY2hvcihjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yKTsNCi0gICAgRldMX0VSUgkJU2hvdygpOw0KLSAgICBGV0xfRVJSCQlIaWRlKCk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX1Rvb2xUaXAoKTsNCi0gICAgdmlydHVhbCB+SUZXTF9Ub29sVGlwKCk7DQorY2xhc3MgSUZXTF9Ub29sVGlwIDogcHVibGljIElGV0xfRm9ybSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX1Rvb2xUaXAqIENyZWF0ZSgpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgRldMX0VSUiBTZXRBbmNob3IoY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvcik7DQorICBGV0xfRVJSIFNob3coKTsNCisgIEZXTF9FUlIgSGlkZSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX1Rvb2xUaXAoKTsNCisgIHZpcnR1YWwgfklGV0xfVG9vbFRpcCgpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZnhtYXRoX2JhcmNvZGUuaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z4bWF0aF9iYXJjb2RlLmgKaW5kZXggNWU3ODk0MC4uMWUzNjUwZSAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZnhtYXRoX2JhcmNvZGUuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9meG1hdGhfYmFyY29kZS5oCkBAIC02LDM3ICs2LDQzIEBACiANCiAjaWZuZGVmIF9GWE1BVEhfQkFSQ09ERV9IXw0KICNkZWZpbmUgX0ZYTUFUSF9CQVJDT0RFX0hfDQotY2xhc3MgSUZYX0JhcmNvZGUNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JRlhfQmFyY29kZSgpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgQkNfVFlQRQkJCUdldFR5cGUoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgaW50MzJfdCAmZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgaW50MzJfdCAmZSkgPSAwOw0KLSAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCURlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90ICZlcnJvckNvZGUpID0gMDsNCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBpbnQzMl90ICZlcnJvckNvZGUpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Q2hhckVuY29kaW5nKEJDX0NIQVJfRU5DT0RJTkcgZW5jb2RpbmcpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgbW9kdWxlSGVpZ2h0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldE1vZHVsZVdpZHRoKGludDMyX3QgbW9kdWxlV2lkdGgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0SGVpZ2h0KGludDMyX3QgaGVpZ2h0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFdpZHRoKGludDMyX3Qgd2lkdGgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgY2hlY2tzdW0pID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0RGF0YUxlbmd0aChpbnQzMl90IGxlbmd0aCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRDYWxDaGVja3N1bShpbnQzMl90IHN0YXRlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEZvbnQoQ0ZYX0ZvbnQqIHBGb250KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIHNpemUpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEVuZENoYXIoRlhfQ0hBUiBlbmQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwgKGludDMyX3QgbGV2ZWwpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKSA9IDA7DQorY2xhc3MgSUZYX0JhcmNvZGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRlhfQmFyY29kZSgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgQkNfVFlQRSBHZXRUeXBlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGVycm9yQ29kZSkgPSAwOw0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90JiBlcnJvckNvZGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDaGFyRW5jb2RpbmcoQkNfQ0hBUl9FTkNPRElORyBlbmNvZGluZykgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldE1vZHVsZVdpZHRoKGludDMyX3QgbW9kdWxlV2lkdGgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRXaWR0aChpbnQzMl90IHdpZHRoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFByaW50Q2hlY2tzdW0oRlhfQk9PTCBjaGVja3N1bSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDYWxDaGVja3N1bShpbnQzMl90IHN0YXRlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Rm9udChDRlhfRm9udCogcEZvbnQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRGb250Q29sb3IoRlhfQVJHQiBjb2xvcikgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0U3RhcnRDaGFyKEZYX0NIQVIgc3RhcnQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRFbmRDaGFyKEZYX0NIQVIgZW5kKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKSA9IDA7DQogfTsNCi1JRlhfQmFyY29kZSoJCQkJRlhfQmFyY29kZV9DcmVhdGUoQkNfVFlQRSB0eXBlKTsNCitJRlhfQmFyY29kZSogRlhfQmFyY29kZV9DcmVhdGUoQkNfVFlQRSB0eXBlKTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfYXBwLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfYXBwLmgKaW5kZXggYmMzOGRiMC4uODk1OTcyNiAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2FwcC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9hcHAuaApAQCAtMTMsMjMgKzEzLDIzIEBACiBjbGFzcyBJRldMX1RoZW1lUHJvdmlkZXI7DQogY2xhc3MgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyOw0KIGNsYXNzIElGV0xfQXBwOw0KLWNsYXNzIElGV0xfQXBwIDogcHVibGljIElGV0xfTm90ZVRocmVhZA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRldMX0FwcCogQ3JlYXRlKElGV0xfQWRhcHRlck5hdGl2ZSAqcEFkYXB0ZXIpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJSW5pdGlhbGl6ZSgpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJCUZpbmFsaXplKCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGV0xfQWRhcHRlck5hdGl2ZSoJR2V0QWRhcHRlck5hdGl2ZSgpID0gMDsNCi0gICAgdmlydHVhbCBJRldMX1dpZGdldE1ncioJCUdldFdpZGdldE1ncigpID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJCVNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWVQcm92aWRlcikgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJRXhpdChpbnQzMl90IGlFeGl0Q29kZSA9IDApID0gMDsNCitjbGFzcyBJRldMX0FwcCA6IHB1YmxpYyBJRldMX05vdGVUaHJlYWQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9BcHAqIENyZWF0ZShJRldMX0FkYXB0ZXJOYXRpdmUqIHBBZGFwdGVyKTsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCkgPSAwOw0KKyAgdmlydHVhbCBJRldMX0FkYXB0ZXJOYXRpdmUqIEdldEFkYXB0ZXJOYXRpdmUoKSA9IDA7DQorICB2aXJ0dWFsIElGV0xfV2lkZ2V0TWdyKiBHZXRXaWRnZXRNZ3IoKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgRXhpdChpbnQzMl90IGlFeGl0Q29kZSA9IDApID0gMDsNCiB9Ow0KIElGV0xfQXBwKiBGV0xfR2V0QXBwKCk7DQotdm9pZCBGV0xfU2V0QXBwKElGV0xfQXBwICpwQXBwKTsNCi1JRldMX0FkYXB0ZXJOYXRpdmUqCUZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQordm9pZCBGV0xfU2V0QXBwKElGV0xfQXBwKiBwQXBwKTsNCitJRldMX0FkYXB0ZXJOYXRpdmUqIEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQogSUZXTF9BZGFwdGVyV2lkZ2V0TWdyKiBGV0xfR2V0QWRhcHRlcldpZGdldE1ncigpOw0KLUlGV0xfVGhlbWVQcm92aWRlcioJRldMX0dldFRoZW1lUHJvdmlkZXIoKTsNCi1leHRlcm4gRldMX0VSUiBGV0xfRXhlY3V0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXhlY3V0YWJsZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhcmFtZXRlcnMpOw0KLUZXTF9FUlIgRldMX1NldEZ1bGxTY3JlZW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0JPT0wgYkZ1bGxTY3JlZW4pOw0KK0lGV0xfVGhlbWVQcm92aWRlciogRldMX0dldFRoZW1lUHJvdmlkZXIoKTsNCitleHRlcm4gRldMX0VSUiBGV0xfRXhlY3V0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXhlY3V0YWJsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGFyYW1ldGVycyk7DQorRldMX0VSUiBGV0xfU2V0RnVsbFNjcmVlbihJRldMX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbik7DQogRlhfQk9PTCBGV0xfQXBwSXNBY3RpdmVkKCk7DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2NvbnRlbnQuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9jb250ZW50LmgKaW5kZXggNGEwMDE1NC4uNDFiMWFmOSAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2NvbnRlbnQuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfY29udGVudC5oCkBAIC04LDIwICs4LDIwIEBACiAjZGVmaW5lIF9GV0xfQ09OVEVOVF9IDQogY2xhc3MgSUZXTF9XaWRnZXQ7DQogY2xhc3MgSUZXTF9Db250ZW50Ow0KLWNsYXNzIElGV0xfQ29udGVudCA6IHB1YmxpYyBJRldMX1dpZGdldA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRldMX0NvbnRlbnQqIENyZWF0ZSgpOw0KLSAgICBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQotICAgIEZXTF9FUlIJCUluc2VydFdpZGdldChJRldMX1dpZGdldCAqcENoaWxkLCBpbnQzMl90IG5JbmRleCA9IC0xKTsNCi0gICAgRldMX0VSUgkJUmVtb3ZlV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgRldMX0VSUgkJUmVtb3ZlQWxsV2lkZ2V0cygpOw0KLSAgICBGV0xfRVJSCQlHZXRNaW5TaXplKEZYX0ZMT0FUICZmV2lkdGgsIEZYX0ZMT0FUICZmSGVpZ2h0KTsNCi0gICAgRldMX0VSUgkJU2V0TWluU2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpOw0KLSAgICBGV0xfRVJSCQlHZXRNYXhTaXplKEZYX0ZMT0FUICZmV2lkdGgsIEZYX0ZMT0FUICZmSGVpZ2h0KTsNCi0gICAgRldMX0VSUgkJU2V0TWF4U2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpOw0KLXByb3RlY3RlZDoNCi0gICAgSUZXTF9Db250ZW50KCk7DQotICAgIHZpcnR1YWwgfklGV0xfQ29udGVudCgpOw0KK2NsYXNzIElGV0xfQ29udGVudCA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX0NvbnRlbnQqIENyZWF0ZSgpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICBGV0xfRVJSIEluc2VydFdpZGdldChJRldMX1dpZGdldCogcENoaWxkLCBpbnQzMl90IG5JbmRleCA9IC0xKTsNCisgIEZXTF9FUlIgUmVtb3ZlV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZXTF9FUlIgUmVtb3ZlQWxsV2lkZ2V0cygpOw0KKyAgRldMX0VSUiBHZXRNaW5TaXplKEZYX0ZMT0FUJiBmV2lkdGgsIEZYX0ZMT0FUJiBmSGVpZ2h0KTsNCisgIEZXTF9FUlIgU2V0TWluU2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpOw0KKyAgRldMX0VSUiBHZXRNYXhTaXplKEZYX0ZMT0FUJiBmV2lkdGgsIEZYX0ZMT0FUJiBmSGVpZ2h0KTsNCisgIEZXTF9FUlIgU2V0TWF4U2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX0NvbnRlbnQoKTsNCisgIHZpcnR1YWwgfklGV0xfQ29udGVudCgpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Vycm9yLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZXJyb3IuaAppbmRleCA0NjU4MDhhLi40YzBmM2I5IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZXJyb3IuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZXJyb3IuaApAQCAtNiw0NSArNiw3NiBAQAogDQogI2lmbmRlZiBfRldMX0VSUk9SX0gNCiAjZGVmaW5lIF9GV0xfRVJST1JfSA0KLXR5cGVkZWYgaW50MzJfdAlGV0xfRVJSOw0KLSNkZWZpbmUgRldMX0VSUl9TdWNjZWVkZWQJCQkJCQkwDQotI2RlZmluZSBGV0xfRVJSX0luZGVmaW5pdGUJCQkJCQktMQ0KLSNkZWZpbmUgRldMX0VSUl9QYXJhbWV0ZXJfSW52YWxpZAkJCQktMTAwDQotI2RlZmluZSBGV0xfRVJSX1Byb3BlcnR5X0ludmFsaWQJCQkJLTIwMA0KLSNkZWZpbmUgRldMX0VSUl9JbnRlcm1lZGlhdGVfVmFsdWVfX0ludmFsaWQJCS0zMDANCi0jZGVmaW5lIEZXTF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQJCQktNDAwDQotI2RlZmluZSBGV0xfRVJSX091dF9PZl9NZW1vcnkJCQkJCS01MDANCi0jaWYgZGVmaW5lZCAoX19XSU4zMl9fKSB8fCBkZWZpbmVkIChfV0lOMzIpDQotI2RlZmluZQlfRldMX0FMQVJNX0lGX0ZBSUwoYXJnLCBhbGFybSkgeyBpZiAoIShhcmcpKSA6Ok91dHB1dERlYnVnU3RyaW5nKGFsYXJtKTsgfQ0KLSNlbGlmIGRlZmluZWQgKF9fbGludXgpIHx8IGRlZmluZWQgKGxpbnV4KSB8fCBkZWZpbmVkIChfX0FQUExFX18pIHx8IGRlZmluZWQgKF9fTUFDT1NYX18pDQotI2RlZmluZSBfRldMX0FMQVJNX0lGX0ZBSUwoYXJnLCBhbGFybSkgeyBpZiAoIShhcmcpKSBwcmludGYoYWxhcm0pOyB9DQordHlwZWRlZiBpbnQzMl90IEZXTF9FUlI7DQorI2RlZmluZSBGV0xfRVJSX1N1Y2NlZWRlZCAwDQorI2RlZmluZSBGV0xfRVJSX0luZGVmaW5pdGUgLTENCisjZGVmaW5lIEZXTF9FUlJfUGFyYW1ldGVyX0ludmFsaWQgLTEwMA0KKyNkZWZpbmUgRldMX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkIC0yMDANCisjZGVmaW5lIEZXTF9FUlJfSW50ZXJtZWRpYXRlX1ZhbHVlX19JbnZhbGlkIC0zMDANCisjZGVmaW5lIEZXTF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQgLTQwMA0KKyNkZWZpbmUgRldMX0VSUl9PdXRfT2ZfTWVtb3J5IC01MDANCisjaWYgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX1dJTjMyKQ0KKyNkZWZpbmUgX0ZXTF9BTEFSTV9JRl9GQUlMKGFyZywgYWxhcm0pIFwNCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIGlmICghKGFyZykpICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIDo6T3V0cHV0RGVidWdTdHJpbmcoYWxhcm0pOyAgICAgIFwNCisgIH0NCisjZWxpZiBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19BUFBMRV9fKSB8fCBcDQorICAgIGRlZmluZWQoX19NQUNPU1hfXykNCisjZGVmaW5lIF9GV0xfQUxBUk1fSUZfRkFJTChhcmcsIGFsYXJtKSBcDQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBpZiAoIShhcmcpKSAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICBwcmludGYoYWxhcm0pOyAgICAgICAgICAgICAgICAgICBcDQorICB9DQogI2Vsc2UNCiAjZW5kaWYNCi0jZGVmaW5lIF9GV0xfUkVUVVJOX0lGX0ZBSUwoYXJnKSB7IGlmICghKGFyZykpIHJldHVybjsgfQ0KLSNkZWZpbmUgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChhcmcsIHZhbCkgeyBpZiAoIShhcmcpKSByZXR1cm4gdmFsOyB9DQotI2RlZmluZSBfRldMX0dPVE9fUE9TSVRJT05fSUZfRkFJTChhcmcsIHBvcykgeyBpZiAoIShhcmcpKSBnb3RvIHBvczsgfQ0KLSNpZiBkZWZpbmVkIChfX1dJTjMyX18pIHx8IGRlZmluZWQgKF9XSU4zMikNCi0jZGVmaW5lCVwNCi0gICAgX0ZXTF9FUlJfQ0hFQ0tfQUxBUk1fSUZfRkFJTChhcmcpIFwNCi0gICAgeyBcDQotICAgICAgICBpZiAoKGFyZykgIT0gRldMX0VSUl9TdWNjZWVkZWQpIFwNCi0gICAgICAgIHsgXA0KLSAgICAgICAgICAgIGNoYXIgYnVmWzM2XTsgXA0KLSAgICAgICAgICAgIG1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsgXA0KLSAgICAgICAgICAgIEZYU1lTX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAiRXJyb3IgY29kZSBpcyAlZFxuIiwgYXJnKTsgXA0KLSAgICAgICAgICAgIDo6T3V0cHV0RGVidWdTdHJpbmcoYnVmKTsgXA0KLSAgICAgICAgfSBcDQotICAgIH0NCi0jZWxpZiBkZWZpbmVkIChfX2xpbnV4KSB8fCBkZWZpbmVkIChsaW51eCkgfHwgZGVmaW5lZCAoX19BUFBMRV9fKSB8fCBkZWZpbmVkIChfX01BQ09TWF9fKQ0KLSNkZWZpbmUgXA0KLSAgICBfRldMX0VSUl9DSEVDS19BTEFSTV9JRl9GQUlMKGFyZykgXA0KLSAgICB7IFwNCi0gICAgICAgIGlmICgoYXJnKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkgXA0KLSAgICAgICAgICAgIHByaW50ZigiJWRcbiIsIGFyZyk7IFwNCi0gICAgfQ0KKyNkZWZpbmUgX0ZXTF9SRVRVUk5fSUZfRkFJTChhcmcpIFwNCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIGlmICghKGFyZykpICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgIFwNCisgIH0NCisjZGVmaW5lIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoYXJnLCB2YWwpIFwNCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgaWYgKCEoYXJnKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICByZXR1cm4gdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgIH0NCisjZGVmaW5lIF9GV0xfR09UT19QT1NJVElPTl9JRl9GQUlMKGFyZywgcG9zKSBcDQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBpZiAoIShhcmcpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICBnb3RvIHBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9DQorI2lmIGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikNCisjZGVmaW5lIF9GV0xfRVJSX0NIRUNLX0FMQVJNX0lGX0ZBSUwoYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgaWYgKChhcmcpICE9IEZXTF9FUlJfU3VjY2VlZGVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICBjaGFyIGJ1ZlszNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICBGWFNZU19zbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gMSwgIkVycm9yIGNvZGUgaXMgJWRcbiIsIGFyZyk7IFwNCisgICAgICA6Ok91dHB1dERlYnVnU3RyaW5nKGJ1Zik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgIH0NCisjZWxpZiBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19BUFBMRV9fKSB8fCBcDQorICAgIGRlZmluZWQoX19NQUNPU1hfXykNCisjZGVmaW5lIF9GV0xfRVJSX0NIRUNLX0FMQVJNX0lGX0ZBSUwoYXJnKSBcDQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBpZiAoKGFyZykgIT0gRldMX0VSUl9TdWNjZWVkZWQpICAgICAgIFwNCisgICAgICBwcmludGYoIiVkXG4iLCBhcmcpOyAgICAgICAgICAgICAgICBcDQorICB9DQogI2Vsc2UNCiAjZW5kaWYNCi0jZGVmaW5lIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9JRl9GQUlMKGFyZykgeyBpZiAoKGFyZykgIT0gRldMX0VSUl9TdWNjZWVkZWQpIHJldHVybjsgfQ0KLSNkZWZpbmUgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoYXJnLCB2YWwpIHsgaWYgKChhcmcpICE9IEZXTF9FUlJfU3VjY2VlZGVkKSByZXR1cm4gdmFsOyB9DQotI2RlZmluZSBfRldMX0VSUl9DSEVDS19HT1RPX1BPU0lUSU9OX0lGX0ZBSUwoYXJnLCBwb3MpIHsgaWYgKChhcmcpICE9IEZXTF9FUlJfU3VjY2VlZGVkKSBnb3RvIHBvczsgfQ0KKyNkZWZpbmUgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX0lGX0ZBSUwoYXJnKSBcDQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgaWYgKChhcmcpICE9IEZXTF9FUlJfU3VjY2VlZGVkKSAgICAgICAgXA0KKyAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9DQorI2RlZmluZSBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChhcmcsIHZhbCkgXA0KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgaWYgKChhcmcpICE9IEZXTF9FUlJfU3VjY2VlZGVkKSAgICAgICAgICAgICAgICAgICBcDQorICAgICAgcmV0dXJuIHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgfQ0KKyNkZWZpbmUgX0ZXTF9FUlJfQ0hFQ0tfR09UT19QT1NJVElPTl9JRl9GQUlMKGFyZywgcG9zKSBcDQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgaWYgKChhcmcpICE9IEZXTF9FUlJfU3VjY2VlZGVkKSAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIGdvdG8gcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Zvcm0uaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9mb3JtLmgKaW5kZXggZTlhODMyMy4uODFjMDZjMCAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Zvcm0uaAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZm9ybS5oCkBAIC05LDc2ICs5LDc4IEBACiBjbGFzcyBJRldMX1dpZGdldDsNCiBjbGFzcyBJRldMX1BhbmVsOw0KIGNsYXNzIElGV0xfRm9ybTsNCi0jZGVmaW5lIEZXTF9DTEFTU19Gb3JtCQkJCQlMIkZXTF9GT1JNIg0KLSNkZWZpbmUgRldMX0NMQVNTSEFTSF9Gb3JtCQkJCTg4MTU2NzI5Mg0KLSNkZWZpbmUgRldMX0NMQVNTX0Zvcm1Qcm94eQkJCQlMIkZXTF9GT1JNUFJPWFkiDQotI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0Zvcm1Qcm94eQkJCTg4MTU2NzI5MQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0ZSTV9SZXNpemUJCQkoMUwgPDwgMCkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9GUk1fTmF0aXZlQm9yZGVyCSgxTCA8PCAxKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0ZSTV9Sb3VuZENvcm5lcgkoMkwgPDwgMSkNCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9GUk1fUm91bmRDb3JuZXI0CSgzTCA8PCAxKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0ZSTV9Ob0RyYXdDbGllbnQgICAoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9DTEFTU19Gb3JtIEwiRldMX0ZPUk0iDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0Zvcm0gODgxNTY3MjkyDQorI2RlZmluZSBGV0xfQ0xBU1NfRm9ybVByb3h5IEwiRldMX0ZPUk1QUk9YWSINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfRm9ybVByb3h5IDg4MTU2NzI5MQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0ZSTV9SZXNpemUgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRlJNX05hdGl2ZUJvcmRlciAoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9GUk1fUm91bmRDb3JuZXIgKDJMIDw8IDEpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRlJNX1JvdW5kQ29ybmVyNCAoM0wgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9GUk1fTm9EcmF3Q2xpZW50ICgxTCA8PCAzKQ0KICNkZWZpbmUgRldMX1NUWUxFRVhUX0ZSTV9Cb3JkZXJDb3JuZXJNYXNrICgzTCA8PCAxKQ0KLSNkZWZpbmUgRldMX1NUWUxFRVhUX0ZSTV9NYXgJCQkoMykNCi0jaWYgKF9GWF9PU189PV9GWF9NQUNPU1hfKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0ZSTV9NYXggKDMpDQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KICNkZWZpbmUgRldMX1VzZU1hY1N5c3RlbUJvcmRlcg0KICNlbmRpZg0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX0ZSTV9DWUNhcHRpb24JCShGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMSkNCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9GUk1fQ1lOYXJyb3dDYXB0aW9uCShGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMikNCi0jZGVmaW5lCUZXTF9XR1RDQVBBQ0lUWV9GUk1fQmlnSWNvbgkJCShGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMykNCi0jZGVmaW5lCUZXTF9XR1RDQVBBQ0lUWV9GUk1fU21hbGxJY29uCQkoRldMX1dHVENBUEFDSVRZX01BWCArIDQpDQotI2RlZmluZSBGV0xfUEFSVF9GUk1fQm9yZGVyCQkJCTENCi0jZGVmaW5lIEZXTF9QQVJUX0ZSTV9FZGdlCQkJCTINCi0jZGVmaW5lIEZXTF9QQVJUX0ZSTV9CYWNrZ3JvdW5kCQkJMw0KLSNkZWZpbmUgRldMX1BBUlRfRlJNX0NhcHRpb24JCQk0DQotI2RlZmluZSBGV0xfUEFSVF9GUk1fTmFycm93Q2FwdGlvbgkJNQ0KLSNkZWZpbmUgRldMX1BBUlRfRlJNX0Nsb3NlQm94CQkJNg0KLSNkZWZpbmUgRldMX1BBUlRfRlJNX01pbmltaXplQm94CQk3DQotI2RlZmluZSBGV0xfUEFSVF9GUk1fTWF4aW1pemVCb3gJCTgNCi0jZGVmaW5lIEZXTF9QQVJUX0ZSTV9IZWFkVGV4dAkJCTkNCi0jZGVmaW5lIEZXTF9QQVJUX0ZSTV9JY29uCQkJCTEwDQotI2RlZmluZSBGV0xfUEFSVFNUQVRFX0ZSTV9Ob3JtYWwJCTENCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfRlJNX0hvdmVyCQkJMg0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9GUk1fUHJlc3NlZAkJMw0KLSNkZWZpbmUgRldMX1BBUlRTVEFURV9GUk1fSW5hY3RpdmUJCTQNCi0jZGVmaW5lIEZXTF9QQVJUU1RBVEVfRlJNX0Rpc2FibGVkCQk1DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZQ2FwdGlvbiAoRldMX1dHVENBUEFDSVRZX01BWCArIDEpDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZTmFycm93Q2FwdGlvbiAoRldMX1dHVENBUEFDSVRZX01BWCArIDIpDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0JpZ0ljb24gKEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAzKQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX0ZSTV9TbWFsbEljb24gKEZXTF9XR1RDQVBBQ0lUWV9NQVggKyA0KQ0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX0JvcmRlciAxDQorI2RlZmluZSBGV0xfUEFSVF9GUk1fRWRnZSAyDQorI2RlZmluZSBGV0xfUEFSVF9GUk1fQmFja2dyb3VuZCAzDQorI2RlZmluZSBGV0xfUEFSVF9GUk1fQ2FwdGlvbiA0DQorI2RlZmluZSBGV0xfUEFSVF9GUk1fTmFycm93Q2FwdGlvbiA1DQorI2RlZmluZSBGV0xfUEFSVF9GUk1fQ2xvc2VCb3ggNg0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX01pbmltaXplQm94IDcNCisjZGVmaW5lIEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveCA4DQorI2RlZmluZSBGV0xfUEFSVF9GUk1fSGVhZFRleHQgOQ0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX0ljb24gMTANCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfRlJNX05vcm1hbCAxDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0ZSTV9Ib3ZlciAyDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0ZSTV9QcmVzc2VkIDMNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfRlJNX0luYWN0aXZlIDQNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfRlJNX0Rpc2FibGVkIDUNCiANCi1jbGFzcyBJRldMX0Zvcm1EUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRJY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJCaWcpID0gMDsNCitjbGFzcyBJRldMX0Zvcm1EUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRJY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJCaWcpID0gMDsNCiB9Ow0KIGVudW0gRldMX0ZPUk1TSVpFIHsNCi0gICAgRldMX0ZPUk1TSVpFX01hbnVhbCA9IDAsDQotICAgIEZXTF9GT1JNU0laRV9XaWR0aCwNCi0gICAgRldMX0ZPUk1TSVpFX0hlaWdodCwNCi0gICAgRldMX0ZPUk1TSVpFX0FsbCwNCisgIEZXTF9GT1JNU0laRV9NYW51YWwgPSAwLA0KKyAgRldMX0ZPUk1TSVpFX1dpZHRoLA0KKyAgRldMX0ZPUk1TSVpFX0hlaWdodCwNCisgIEZXTF9GT1JNU0laRV9BbGwsDQogfTsNCiBlbnVtIEZXTF9DT01NQU5ESUQgew0KLSAgICBGV0xfQ09NTUFORElEX0Nsb3NlID0gMCwNCi0gICAgRldMX0NPTU1BTkRJRF9PaywNCi0gICAgRldMX0NPTU1BTkRJRF9DYW5jZWwsDQotICAgIEZXTF9DT01NQU5ESURfQWJvcnQsDQotICAgIEZXTF9DT01NQU5ESURfUmV0cnksDQotICAgIEZXTF9DT01NQU5ESURfSWdub3JlLA0KLSAgICBGV0xfQ09NTUFORElEX1llcywNCi0gICAgRldMX0NPTU1BTkRJRF9ObywNCisgIEZXTF9DT01NQU5ESURfQ2xvc2UgPSAwLA0KKyAgRldMX0NPTU1BTkRJRF9PaywNCisgIEZXTF9DT01NQU5ESURfQ2FuY2VsLA0KKyAgRldMX0NPTU1BTkRJRF9BYm9ydCwNCisgIEZXTF9DT01NQU5ESURfUmV0cnksDQorICBGV0xfQ09NTUFORElEX0lnbm9yZSwNCisgIEZXTF9DT01NQU5ESURfWWVzLA0KKyAgRldMX0NPTU1BTkRJRF9ObywNCiB9Ow0KLWNsYXNzIElGV0xfRm9ybSA6IHB1YmxpYyBJRldMX1BhbmVsDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGV0xfRm9ybSoJQ3JlYXRlKCk7DQotICAgIEZXTF9FUlIJCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgRldMX0VSUgkJCUluaXRpYWxpemUoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCQlJbml0aWFsaXplKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgQ0ZYX1dpZGVTdHJpbmcgKmNsYXNzbmFtZSwgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBGV0xfRk9STVNJWkUJR2V0Rm9ybVNpemUoKTsNCi0gICAgRldMX0VSUgkJCVNldEZvcm1TaXplKEZXTF9GT1JNU0laRSBlRm9ybVNpemUpOw0KLSAgICBJRldMX1dpZGdldCoJRG9Nb2RhbCgpOw0KLSAgICBJRldMX1dpZGdldCoJRG9Nb2RhbChGWF9EV09SRCAmZHdDb21tYW5kSUQpOw0KLSAgICBGV0xfRVJSCQkJRW5kRG9Nb2RhbCgpOw0KLSAgICBGV0xfRVJSCQkJU2V0Qm9yZGVyUmVnaW9uKENGWF9QYXRoICpwUGF0aCk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX0Zvcm0oKTsNCi0gICAgdmlydHVhbCB+SUZXTF9Gb3JtKCk7DQorY2xhc3MgSUZXTF9Gb3JtIDogcHVibGljIElGV0xfUGFuZWwgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9Gb3JtKiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIGNsYXNzbmFtZSwNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGV0xfRk9STVNJWkUgR2V0Rm9ybVNpemUoKTsNCisgIEZXTF9FUlIgU2V0Rm9ybVNpemUoRldMX0ZPUk1TSVpFIGVGb3JtU2l6ZSk7DQorICBJRldMX1dpZGdldCogRG9Nb2RhbCgpOw0KKyAgSUZXTF9XaWRnZXQqIERvTW9kYWwoRlhfRFdPUkQmIGR3Q29tbWFuZElEKTsNCisgIEZXTF9FUlIgRW5kRG9Nb2RhbCgpOw0KKyAgRldMX0VSUiBTZXRCb3JkZXJSZWdpb24oQ0ZYX1BhdGgqIHBQYXRoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9Gb3JtKCk7DQorICB2aXJ0dWFsIH5JRldMX0Zvcm0oKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9ncmlkLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZ3JpZC5oCmluZGV4IDY3N2JkOTEuLmZjOTdjOWEgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9ncmlkLmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2dyaWQuaApAQCAtOSw2OCArOSw3OSBAQAogY2xhc3MgSUZXTF9XaWRnZXQ7DQogY2xhc3MgSUZXTF9Db250ZW50Ow0KIGNsYXNzIElGV0xfR3JpZDsNCi0jZGVmaW5lIEZXTF9DTEFTU19HcmlkCQkJTCJGV0xfR1JJRCINCi0jZGVmaW5lIEZXTF9DTEFTU0hBU0hfR3JpZAkJMzE1MDI5ODY3MA0KKyNkZWZpbmUgRldMX0NMQVNTX0dyaWQgTCJGV0xfR1JJRCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfR3JpZCAzMTUwMjk4NjcwDQogI2RlZmluZSBGV0xfR1JJRFNUWUxFRVhUX1Nob3dHcmlkTGluZXMgKDFMIDw8IDApDQogc3RydWN0IEZXTF9MQVlPVVREQVRBIHsNCi0gICAgRlhfRkxPQVQgZldpZHRoOw0KLSAgICBGWF9GTE9BVCBmSGVpZ2h0Ow0KKyAgRlhfRkxPQVQgZldpZHRoOw0KKyAgRlhfRkxPQVQgZkhlaWdodDsNCiB9Ow0KIGVudW0gRldMX0dSSURVTklUIHsNCi0gICAgRldMX0dSSURVTklUX0F1dG8gPSAwLA0KLSAgICBGV0xfR1JJRFVOSVRfRml4ZWQsDQotICAgIEZXTF9HUklEVU5JVF9TY2FsZWQsDQotICAgIEZXTF9HUklEVU5JVF9JbmZpbml0eSwNCisgIEZXTF9HUklEVU5JVF9BdXRvID0gMCwNCisgIEZXTF9HUklEVU5JVF9GaXhlZCwNCisgIEZXTF9HUklEVU5JVF9TY2FsZWQsDQorICBGV0xfR1JJRFVOSVRfSW5maW5pdHksDQogfTsNCiBlbnVtIEZXTF9HUklETUFSR0lOIHsNCi0gICAgRldMX0dSSURNQVJHSU5fTGVmdCA9IDAsDQotICAgIEZXTF9HUklETUFSR0lOX1RvcCwNCi0gICAgRldMX0dSSURNQVJHSU5fUmlnaHQsDQotICAgIEZXTF9HUklETUFSR0lOX0JvdHRvbSwNCisgIEZXTF9HUklETUFSR0lOX0xlZnQgPSAwLA0KKyAgRldMX0dSSURNQVJHSU5fVG9wLA0KKyAgRldMX0dSSURNQVJHSU5fUmlnaHQsDQorICBGV0xfR1JJRE1BUkdJTl9Cb3R0b20sDQogfTsNCiBlbnVtIEZXTF9HUklEU0laRSB7DQotICAgIEZXTF9HUklEU0laRV9XaWR0aCA9IDAsDQotICAgIEZXTF9HUklEU0laRV9IZWlnaHQsDQotICAgIEZXTF9HUklEU0laRV9NaW5XaWR0aCwNCi0gICAgRldMX0dSSURTSVpFX01pbkhlaWdodCwNCi0gICAgRldMX0dSSURTSVpFX01heFdpZHRoLA0KLSAgICBGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0LA0KKyAgRldMX0dSSURTSVpFX1dpZHRoID0gMCwNCisgIEZXTF9HUklEU0laRV9IZWlnaHQsDQorICBGV0xfR1JJRFNJWkVfTWluV2lkdGgsDQorICBGV0xfR1JJRFNJWkVfTWluSGVpZ2h0LA0KKyAgRldMX0dSSURTSVpFX01heFdpZHRoLA0KKyAgRldMX0dSSURTSVpFX01heEhlaWdodCwNCiB9Ow0KLXR5cGVkZWYgc3RydWN0IF9GV0xfSEdSSURDT0xST1cgew0KLSAgICB2b2lkKiBwRGF0YTsNCi19ICogRldMX0hHUklEQ09MUk9XOw0KLWNsYXNzIElGV0xfR3JpZCA6IHB1YmxpYyBJRldMX0NvbnRlbnQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZXTF9HcmlkKglDcmVhdGUoKTsNCi0gICAgRldMX0VSUgkJCQlJbml0aWFsaXplKCk7DQotICAgIEZXTF9FUlIJCQkJSW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMpOw0KK3R5cGVkZWYgc3RydWN0IF9GV0xfSEdSSURDT0xST1cgeyB2b2lkKiBwRGF0YTsgfSAqIEZXTF9IR1JJRENPTFJPVzsNCitjbGFzcyBJRldMX0dyaWQgOiBwdWJsaWMgSUZXTF9Db250ZW50IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfR3JpZCogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMpOw0KIA0KLSAgICBGV0xfSEdSSURDT0xST1cJCUluc2VydENvbFJvdyhGWF9CT09MIGJDb2x1bW4sIGludDMyX3QgbkluZGV4ID0gLTEpOw0KLSAgICBpbnQzMl90CQkJQ291bnRDb2xSb3dzKEZYX0JPT0wgYkNvbHVtbik7DQotICAgIEZXTF9IR1JJRENPTFJPVwkJR2V0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgaW50MzJfdCBuSW5kZXgpOw0KLSAgICBpbnQzMl90CQkJR2V0SW5kZXgoRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpOw0KLSAgICBGWF9GTE9BVAkJCUdldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpOw0KLSAgICBGV0xfRVJSCQkJCVNldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpOw0KLSAgICBGWF9GTE9BVAkJCUdldE1pblNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpOw0KLSAgICBGV0xfRVJSCQkJCVNldE1pblNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpOw0KLSAgICBGWF9GTE9BVAkJCUdldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpOw0KLSAgICBGV0xfRVJSCQkJCVNldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpOw0KLSAgICBGWF9CT09MCQkJCURlbGV0ZUNvbFJvdyhGV0xfSEdSSURDT0xST1cgaENvbFJvdyk7DQotICAgIEZYX0JPT0wJCQkJSXNDb2x1bW4oRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpOw0KLSAgICBpbnQzMl90CQkJR2V0V2lkZ2V0UG9zKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJDb2x1bW4pOw0KLSAgICBGV0xfRVJSCQkJCVNldFdpZGdldFBvcyhJRldMX1dpZGdldCAqcFdpZGdldCwgaW50MzJfdCBpUG9zLCBGWF9CT09MIGJDb2x1bW4pOw0KLSAgICBpbnQzMl90CQkJR2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKTsNCi0gICAgRldMX0VSUgkJCQlTZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBpbnQzMl90IGlTcGFuLCBGWF9CT09MIGJDb2x1bW4pOw0KLSAgICBGWF9GTE9BVAkJCUdldFdpZGdldFNpemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklEU0laRSBlU2l6ZSwgRldMX0dSSURVTklUICZlVW5pdCk7DQotICAgIEZXTF9FUlIJCQkJU2V0V2lkZ2V0U2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURTSVpFIGVTaXplLCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVaXQpOw0KLSAgICBGWF9CT09MCQkJCUdldFdpZGdldE1hcmdpbihJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURNQVJHSU4gZU1hcmdpbiwgRlhfRkxPQVQgJmZNYXJnaW4pOw0KLSAgICBGV0xfRVJSCQkJCVNldFdpZGdldE1hcmdpbihJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURNQVJHSU4gZU1hcmdpbiwgRlhfRkxPQVQgZk1hcmdpbik7DQotICAgIEZXTF9FUlIJCQkJUmVtb3ZlV2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luKTsNCi0gICAgRlhfRkxPQVQJCQlHZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsIEZXTF9HUklEVU5JVCAmZVVuaXQpOw0KLSAgICBGV0xfRVJSCQkJCVNldEdyaWRTaXplKEZXTF9HUklEU0laRSBlU2l6ZSwgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVWl0KTsNCi1wcm90ZWN0ZWQ6DQotICAgIElGV0xfR3JpZCgpOw0KLSAgICB2aXJ0dWFsIH5JRldMX0dyaWQoKTsNCisgIEZXTF9IR1JJRENPTFJPVyBJbnNlcnRDb2xSb3coRlhfQk9PTCBiQ29sdW1uLCBpbnQzMl90IG5JbmRleCA9IC0xKTsNCisgIGludDMyX3QgQ291bnRDb2xSb3dzKEZYX0JPT0wgYkNvbHVtbik7DQorICBGV0xfSEdSSURDT0xST1cgR2V0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgaW50MzJfdCBuSW5kZXgpOw0KKyAgaW50MzJfdCBHZXRJbmRleChGV0xfSEdSSURDT0xST1cgaENvbFJvdyk7DQorICBGWF9GTE9BVCBHZXRTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQmIGVVbml0KTsNCisgIEZXTF9FUlIgU2V0U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVW5pdCk7DQorICBGWF9GTE9BVCBHZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQmIGVVbml0KTsNCisgIEZXTF9FUlIgU2V0TWluU2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVuaXQpOw0KKyAgRlhfRkxPQVQgR2V0TWF4U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUJiBlVW5pdCk7DQorICBGV0xfRVJSIFNldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVbml0KTsNCisgIEZYX0JPT0wgRGVsZXRlQ29sUm93KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KTsNCisgIEZYX0JPT0wgSXNDb2x1bW4oRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpOw0KKyAgaW50MzJfdCBHZXRXaWRnZXRQb3MoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYkNvbHVtbik7DQorICBGV0xfRVJSIFNldFdpZGdldFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwgaW50MzJfdCBpUG9zLCBGWF9CT09MIGJDb2x1bW4pOw0KKyAgaW50MzJfdCBHZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJDb2x1bW4pOw0KKyAgRldMX0VSUiBTZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBpbnQzMl90IGlTcGFuLCBGWF9CT09MIGJDb2x1bW4pOw0KKyAgRlhfRkxPQVQgR2V0V2lkZ2V0U2l6ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURTSVpFIGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQmIGVVbml0KTsNCisgIEZXTF9FUlIgU2V0V2lkZ2V0U2l6ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFNJWkUgZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVaXQpOw0KKyAgRlhfQk9PTCBHZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZNYXJnaW4pOw0KKyAgRldMX0VSUiBTZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1hcmdpbik7DQorICBGV0xfRVJSIFJlbW92ZVdpZGdldE1hcmdpbihJRldMX1dpZGdldCogcFdpZGdldCwgRldMX0dSSURNQVJHSU4gZU1hcmdpbik7DQorICBGWF9GTE9BVCBHZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsIEZXTF9HUklEVU5JVCYgZVVuaXQpOw0KKyAgRldMX0VSUiBTZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVpdCk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfR3JpZCgpOw0KKyAgdmlydHVhbCB+SUZXTF9HcmlkKCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfbm90ZS5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX25vdGUuaAppbmRleCBjNDIzY2Q1Li5jZWVhOGE2IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfbm90ZS5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9ub3RlLmgKQEAgLTQyLDM1MSArNDIsMzM2IEBACiBjbGFzcyBDRldMX0V2dElkbGU7DQogY2xhc3MgSUZXTF9Ob3RlRHJpdmVyOw0KIGNsYXNzIElGV0xfTm90ZUxvb3A7DQotI2RlZmluZSBGV0xfTVNHX0FjdGl2YXRlCQkJCQlMIkZXTF9NRVNTQUdFX0FjdGl2YXRlIg0KLSNkZWZpbmUgRldMX01TR19EZWFjdGl2YXRlCQkJCQlMIkZXTF9NRVNTQUdFX0RlYWN0aXZhdGUiDQotI2RlZmluZSBGV0xfTVNHX1NldEZvY3VzCQkJCQlMIkZXTF9NRVNTQUdFX1NldEZvY3VzIg0KLSNkZWZpbmUgRldMX01TR19LaWxsRm9jdXMJCQkJCUwiRldMX01FU1NBR0VfS2lsbEZvY3VzIg0KLSNkZWZpbmUgRldMX01TR19Nb3VzZQkJCQkJCUwiRldMX01FU1NBR0VfTW91c2UiDQotI2RlZmluZSBGV0xfTVNHX01vdXNlV2hlZWwJCQkJCUwiRldMX01FU1NBR0VfTW91c2VXaGVlbCINCi0jZGVmaW5lIEZXTF9NU0dfS2V5CQkJCQkJCUwiRldMX01FU1NBR0VfS2V5Ig0KLSNkZWZpbmUgRldMX01TR19DdXJzb3IJCQkJCQlMIkZXTF9NRVNTQUdFX0N1cnNvciINCi0jZGVmaW5lIEZXTF9NU0dfU2l6ZQkJCQkJCUwiRldMX01FU1NBR0VfU2l6ZSINCi0jZGVmaW5lCUZXTF9NU0dfV2luZG93TW92ZQkJCQkJTCJGV0xfTUVTU0FHRV9XaW5kb3dNb3ZlIg0KLSNkZWZpbmUgRldMX01TR19Ecm9wRmlsZXMJCQkJCUwiRldMX01FU1NBR0VfRHJvcEZpbGVzIg0KLSNkZWZpbmUgRldMX01TR19UYXNrQ2xpY2tlZAkJCQkJTCJGV0xfTUVTU0FHRV9UYXNrQ2xpY2tlZCINCi0jZGVmaW5lIEZXTF9NU0dfQ2xvc2UJCQkJCQlMIkZXTF9NRVNTQUdFX0Nsb3NlIg0KLSNkZWZpbmUgRldMX01TR19Qb3N0CQkJCQkJTCJGV0xfTUVTU0FHRV9Qb3N0Ig0KLSNkZWZpbmUgRldMX01TR19XaW5kb3dXaWxsTW92ZQkJCQlMIkZXTF9NRVNTQUdFX1dpbmRvd1dpbGxNb3ZlIg0KLSNkZWZpbmUgRldMX01TR0hBU0hfQWN0aXZhdGUJCQkJMjQxMDM2OTQ2OQ0KLSNkZWZpbmUgRldMX01TR0hBU0hfRGVhY3RpdmF0ZQkJCQkxMTg0MjE0NzkwDQotI2RlZmluZQlGV0xfTVNHSEFTSF9TZXRGb2N1cwkJCQk0MTc0NTEyNTA0DQotI2RlZmluZQlGV0xfTVNHSEFTSF9LaWxsRm9jdXMJCQkJMTU1NzkwMzgzMg0KLSNkZWZpbmUJRldMX01TR0hBU0hfTW91c2UJCQkJCTcwNjEyODMwOQ0KLSNkZWZpbmUJRldMX01TR0hBU0hfTW91c2VXaGVlbAkJCQk4OTM3MDM0NjYNCi0jZGVmaW5lCUZXTF9NU0dIQVNIX0tleQkJCQkJCTM3NTEzNzI0MDUNCi0jZGVmaW5lCUZXTF9NU0dIQVNIX0N1cnNvcgkJCQkJMzE4MjYyNjIxOA0KLSNkZWZpbmUJRldMX01TR0hBU0hfU2l6ZQkJCQkJMTYwMDc3NzM1DQotI2RlZmluZQlGV0xfTVNHSEFTSF9XaW5kb3dNb3ZlCQkJCTEwMzIyNjkzNzcNCi0jZGVmaW5lCUZXTF9NU0dIQVNIX0Ryb3BGaWxlcwkJCQkyMDA0MTY1MjM2DQotI2RlZmluZSBGV0xfTVNHSEFTSF9UYXNrQ2xpY2tlZAkJCQkzMTI4MjMxMDg2DQotI2RlZmluZSBGV0xfTVNHSEFTSF9DbG9zZQkJCQkJMjk3NzU2MzkwNg0KLSNkZWZpbmUgRldMX01TR0hBU0hfUG9zdAkJCQkJMTk2OTYzMzA3NA0KLSNkZWZpbmUgRldMX01TR0hBU0hfV2luZG93V2lsbE1vdmUJCQkyMjI5MTc1NzYzDQotI2RlZmluZSBGV0xfRVZUX01vdXNlCQkJCQkJTCJGV0xfRVZFTlRfTW91c2UiDQotI2RlZmluZSBGV0xfRVZUX01vdXNlV2hlZWwJCQkJCUwiRldMX0VWRU5UX01vdXNlV2hlZWwiDQotI2RlZmluZSBGV0xfRVZUX0tleQkJCQkJCQlMIkZXTF9FVkVOVF9LZXkiDQotI2RlZmluZSBGV0xfRVZUX1NldEZvY3VzCQkJCQlMIkZXTF9FVkVOVF9TZXRGb2N1cyINCi0jZGVmaW5lIEZXTF9FVlRfS2lsbEZvY3VzCQkJCQlMIkZXTF9FVkVOVF9LaWxsRm9jdXMiDQotI2RlZmluZSBGV0xfRVZUX0NsaWNrCQkJCQkJTCJGV0xfRVZFTlRfQ2xpY2siDQotI2RlZmluZSBGV0xfRVZUX0RyYXcJCQkJCQlMIkZXTF9FVkVOVF9EcmF3Ig0KLSNkZWZpbmUgRldMX0VWVF9TY3JvbGwJCQkJCQlMIkZXTF9FVkVOVF9TY3JvbGwiDQotI2RlZmluZSBGV0xfRVZUX0Nsb3NlCQkJCQkJTCJGV0xfRVZFTlRfQ2xvc2UiDQotI2RlZmluZSBGV0xfRVZUX0NvbnRleHRNZW51CQkJCQlMIkZXTF9FVkVOVF9Db250ZXh0TWVudSINCi0jZGVmaW5lCUZXTF9FVlRfTWVudUNvbW1hbmQJCQkJCUwiRldMX0VWRU5UX01lbnVDb21tYW5kIg0KLSNkZWZpbmUgRldMX0VWVF9TaXplQ2hhbmdlZAkJCQkJTCJGV0xfRVZFTlRfU2l6ZUNoYW5nZWQiDQotI2RlZmluZSBGV0xfRVZUSEFTSF9Nb3VzZQkJCQkJMTc2NTI1ODAwMg0KLSNkZWZpbmUgRldMX0VWVEhBU0hfTW91c2VXaGVlbAkJCQkzOTA3MTE0NDA3DQotI2RlZmluZSBGV0xfRVZUSEFTSF9LZXkJCQkJCQkyNDA4MzU0NDUwDQotI2RlZmluZSBGV0xfRVZUSEFTSF9TZXRGb2N1cwkJCQkzOTA5NzIxMjY5DQotI2RlZmluZSBGV0xfRVZUSEFTSF9LaWxsRm9jdXMJCQkJMTc3OTM2MzI1Mw0KLSNkZWZpbmUJRldMX0VWVEhBU0hfRHJhdwkJCQkJMjQzMDcxMzMwMw0KLSNkZWZpbmUJRldMX0VWVEhBU0hfQ2xpY2sJCQkJCTQwMjYzMjg3ODMNCi0jZGVmaW5lCUZXTF9FVlRIQVNIX1Njcm9sbAkJCQkJMjk2NTE1ODk2OA0KLSNkZWZpbmUJRldMX0VWVEhBU0hfQ2xvc2UJCQkJCTQwMzY2OTM1OTkNCi0jZGVmaW5lCUZXTF9FVlRIQVNIX0NvbnRleHRNZW51CQkJCTI3MTczMDc3MTUNCi0jZGVmaW5lIEZXTF9FVlRIQVNIX01lbnVDb21tYW5kCQkJCTQ5Nzc2Mzc0MQ0KLSNkZWZpbmUJRldMX0VWVEhBU0hfU2l6ZUNoYW5nZWQJCQkJMzA4Mzk1ODUxMA0KLSNkZWZpbmUJRldMX0VWVEhBU0hfSWRsZQkJCQkJODM5NTQ2NzU5DQotI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd24JCQkxDQotI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwCQkJMg0KLSNkZWZpbmUgRldMX01TR01PVVNFQ01EX0xCdXR0b25EYmxDbGsJCTMNCi0jZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRG93bgkJCTQNCi0jZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uVXAJCQk1DQotI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfUkJ1dHRvbkRibENsawkJNg0KLSNkZWZpbmUgRldMX01TR01PVVNFQ01EX01CdXR0b25Eb3duCQkJNw0KLSNkZWZpbmUgRldMX01TR01PVVNFQ01EX01CdXR0b25VcAkJCTgNCi0jZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9NQnV0dG9uRGJsQ2xrCQk5DQotI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlCQkJMTANCi0jZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUVudGVyCQkJMTENCi0jZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlCQkJMTINCi0jZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUhvdmVyCQkJMTMNCi0jZGVmaW5lIEZXTF9NU0dLRVlDTURfS2V5RG93bgkJCQkxDQotI2RlZmluZSBGV0xfTVNHS0VZQ01EX0tleVVwCQkJCQkyDQotI2RlZmluZSBGV0xfTVNHS0VZQ01EX0NoYXIJCQkJCTMNCi0jZGVmaW5lIEZXTF9LRVlGTEFHX0N0cmwJCQkJCSgxIDw8IDApDQotI2RlZmluZSBGV0xfS0VZRkxBR19BbHQJCQkJCQkoMSA8PCAxKQ0KLSNkZWZpbmUgRldMX0tFWUZMQUdfU2hpZnQJCQkJCSgxIDw8IDIpDQotI2RlZmluZSBGV0xfS0VZRkxBR19Db21tYW5kCQkJCQkoMSA8PCAzKQ0KLSNkZWZpbmUgRldMX0tFWUZMQUdfTEJ1dHRvbgkJCQkJKDEgPDwgNCkNCi0jZGVmaW5lIEZXTF9LRVlGTEFHX1JCdXR0b24JCQkJCSgxIDw8IDUpDQotI2RlZmluZSBGV0xfS0VZRkxBR19NQnV0dG9uCQkJCQkoMSA8PCA2KQ0KLWNsYXNzIENGV0xfTm90ZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBtX2R3UmVmQ291bnQgLS07DQotICAgICAgICBGWF9EV09SRCBkd1JlZkNvdW50ID0gbV9kd1JlZkNvdW50Ow0KLSAgICAgICAgaWYgKCFtX2R3UmVmQ291bnQpIHsNCi0gICAgICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBkd1JlZkNvdW50Ow0KKyNkZWZpbmUgRldMX01TR19BY3RpdmF0ZSBMIkZXTF9NRVNTQUdFX0FjdGl2YXRlIg0KKyNkZWZpbmUgRldMX01TR19EZWFjdGl2YXRlIEwiRldMX01FU1NBR0VfRGVhY3RpdmF0ZSINCisjZGVmaW5lIEZXTF9NU0dfU2V0Rm9jdXMgTCJGV0xfTUVTU0FHRV9TZXRGb2N1cyINCisjZGVmaW5lIEZXTF9NU0dfS2lsbEZvY3VzIEwiRldMX01FU1NBR0VfS2lsbEZvY3VzIg0KKyNkZWZpbmUgRldMX01TR19Nb3VzZSBMIkZXTF9NRVNTQUdFX01vdXNlIg0KKyNkZWZpbmUgRldMX01TR19Nb3VzZVdoZWVsIEwiRldMX01FU1NBR0VfTW91c2VXaGVlbCINCisjZGVmaW5lIEZXTF9NU0dfS2V5IEwiRldMX01FU1NBR0VfS2V5Ig0KKyNkZWZpbmUgRldMX01TR19DdXJzb3IgTCJGV0xfTUVTU0FHRV9DdXJzb3IiDQorI2RlZmluZSBGV0xfTVNHX1NpemUgTCJGV0xfTUVTU0FHRV9TaXplIg0KKyNkZWZpbmUgRldMX01TR19XaW5kb3dNb3ZlIEwiRldMX01FU1NBR0VfV2luZG93TW92ZSINCisjZGVmaW5lIEZXTF9NU0dfRHJvcEZpbGVzIEwiRldMX01FU1NBR0VfRHJvcEZpbGVzIg0KKyNkZWZpbmUgRldMX01TR19UYXNrQ2xpY2tlZCBMIkZXTF9NRVNTQUdFX1Rhc2tDbGlja2VkIg0KKyNkZWZpbmUgRldMX01TR19DbG9zZSBMIkZXTF9NRVNTQUdFX0Nsb3NlIg0KKyNkZWZpbmUgRldMX01TR19Qb3N0IEwiRldMX01FU1NBR0VfUG9zdCINCisjZGVmaW5lIEZXTF9NU0dfV2luZG93V2lsbE1vdmUgTCJGV0xfTUVTU0FHRV9XaW5kb3dXaWxsTW92ZSINCisjZGVmaW5lIEZXTF9NU0dIQVNIX0FjdGl2YXRlIDI0MTAzNjk0NjkNCisjZGVmaW5lIEZXTF9NU0dIQVNIX0RlYWN0aXZhdGUgMTE4NDIxNDc5MA0KKyNkZWZpbmUgRldMX01TR0hBU0hfU2V0Rm9jdXMgNDE3NDUxMjUwNA0KKyNkZWZpbmUgRldMX01TR0hBU0hfS2lsbEZvY3VzIDE1NTc5MDM4MzINCisjZGVmaW5lIEZXTF9NU0dIQVNIX01vdXNlIDcwNjEyODMwOQ0KKyNkZWZpbmUgRldMX01TR0hBU0hfTW91c2VXaGVlbCA4OTM3MDM0NjYNCisjZGVmaW5lIEZXTF9NU0dIQVNIX0tleSAzNzUxMzcyNDA1DQorI2RlZmluZSBGV0xfTVNHSEFTSF9DdXJzb3IgMzE4MjYyNjIxOA0KKyNkZWZpbmUgRldMX01TR0hBU0hfU2l6ZSAxNjAwNzc3MzUNCisjZGVmaW5lIEZXTF9NU0dIQVNIX1dpbmRvd01vdmUgMTAzMjI2OTM3Nw0KKyNkZWZpbmUgRldMX01TR0hBU0hfRHJvcEZpbGVzIDIwMDQxNjUyMzYNCisjZGVmaW5lIEZXTF9NU0dIQVNIX1Rhc2tDbGlja2VkIDMxMjgyMzEwODYNCisjZGVmaW5lIEZXTF9NU0dIQVNIX0Nsb3NlIDI5Nzc1NjM5MDYNCisjZGVmaW5lIEZXTF9NU0dIQVNIX1Bvc3QgMTk2OTYzMzA3NA0KKyNkZWZpbmUgRldMX01TR0hBU0hfV2luZG93V2lsbE1vdmUgMjIyOTE3NTc2Mw0KKyNkZWZpbmUgRldMX0VWVF9Nb3VzZSBMIkZXTF9FVkVOVF9Nb3VzZSINCisjZGVmaW5lIEZXTF9FVlRfTW91c2VXaGVlbCBMIkZXTF9FVkVOVF9Nb3VzZVdoZWVsIg0KKyNkZWZpbmUgRldMX0VWVF9LZXkgTCJGV0xfRVZFTlRfS2V5Ig0KKyNkZWZpbmUgRldMX0VWVF9TZXRGb2N1cyBMIkZXTF9FVkVOVF9TZXRGb2N1cyINCisjZGVmaW5lIEZXTF9FVlRfS2lsbEZvY3VzIEwiRldMX0VWRU5UX0tpbGxGb2N1cyINCisjZGVmaW5lIEZXTF9FVlRfQ2xpY2sgTCJGV0xfRVZFTlRfQ2xpY2siDQorI2RlZmluZSBGV0xfRVZUX0RyYXcgTCJGV0xfRVZFTlRfRHJhdyINCisjZGVmaW5lIEZXTF9FVlRfU2Nyb2xsIEwiRldMX0VWRU5UX1Njcm9sbCINCisjZGVmaW5lIEZXTF9FVlRfQ2xvc2UgTCJGV0xfRVZFTlRfQ2xvc2UiDQorI2RlZmluZSBGV0xfRVZUX0NvbnRleHRNZW51IEwiRldMX0VWRU5UX0NvbnRleHRNZW51Ig0KKyNkZWZpbmUgRldMX0VWVF9NZW51Q29tbWFuZCBMIkZXTF9FVkVOVF9NZW51Q29tbWFuZCINCisjZGVmaW5lIEZXTF9FVlRfU2l6ZUNoYW5nZWQgTCJGV0xfRVZFTlRfU2l6ZUNoYW5nZWQiDQorI2RlZmluZSBGV0xfRVZUSEFTSF9Nb3VzZSAxNzY1MjU4MDAyDQorI2RlZmluZSBGV0xfRVZUSEFTSF9Nb3VzZVdoZWVsIDM5MDcxMTQ0MDcNCisjZGVmaW5lIEZXTF9FVlRIQVNIX0tleSAyNDA4MzU0NDUwDQorI2RlZmluZSBGV0xfRVZUSEFTSF9TZXRGb2N1cyAzOTA5NzIxMjY5DQorI2RlZmluZSBGV0xfRVZUSEFTSF9LaWxsRm9jdXMgMTc3OTM2MzI1Mw0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRHJhdyAyNDMwNzEzMzAzDQorI2RlZmluZSBGV0xfRVZUSEFTSF9DbGljayA0MDI2MzI4NzgzDQorI2RlZmluZSBGV0xfRVZUSEFTSF9TY3JvbGwgMjk2NTE1ODk2OA0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ2xvc2UgNDAzNjY5MzU5OQ0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ29udGV4dE1lbnUgMjcxNzMwNzcxNQ0KKyNkZWZpbmUgRldMX0VWVEhBU0hfTWVudUNvbW1hbmQgNDk3NzYzNzQxDQorI2RlZmluZSBGV0xfRVZUSEFTSF9TaXplQ2hhbmdlZCAzMDgzOTU4NTEwDQorI2RlZmluZSBGV0xfRVZUSEFTSF9JZGxlIDgzOTU0Njc1OQ0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duIDENCisjZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXAgMg0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX0xCdXR0b25EYmxDbGsgMw0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX1JCdXR0b25Eb3duIDQNCisjZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uVXAgNQ0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX1JCdXR0b25EYmxDbGsgNg0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX01CdXR0b25Eb3duIDcNCisjZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9NQnV0dG9uVXAgOA0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX01CdXR0b25EYmxDbGsgOQ0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZSAxMA0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX01vdXNlRW50ZXIgMTENCisjZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlIDEyDQorI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfTW91c2VIb3ZlciAxMw0KKyNkZWZpbmUgRldMX01TR0tFWUNNRF9LZXlEb3duIDENCisjZGVmaW5lIEZXTF9NU0dLRVlDTURfS2V5VXAgMg0KKyNkZWZpbmUgRldMX01TR0tFWUNNRF9DaGFyIDMNCisjZGVmaW5lIEZXTF9LRVlGTEFHX0N0cmwgKDEgPDwgMCkNCisjZGVmaW5lIEZXTF9LRVlGTEFHX0FsdCAoMSA8PCAxKQ0KKyNkZWZpbmUgRldMX0tFWUZMQUdfU2hpZnQgKDEgPDwgMikNCisjZGVmaW5lIEZXTF9LRVlGTEFHX0NvbW1hbmQgKDEgPDwgMykNCisjZGVmaW5lIEZXTF9LRVlGTEFHX0xCdXR0b24gKDEgPDwgNCkNCisjZGVmaW5lIEZXTF9LRVlGTEFHX1JCdXR0b24gKDEgPDwgNSkNCisjZGVmaW5lIEZXTF9LRVlGTEFHX01CdXR0b24gKDEgPDwgNikNCitjbGFzcyBDRldMX05vdGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZYX0RXT1JEIFJlbGVhc2UoKSB7DQorICAgIG1fZHdSZWZDb3VudC0tOw0KKyAgICBGWF9EV09SRCBkd1JlZkNvdW50ID0gbV9kd1JlZkNvdW50Ow0KKyAgICBpZiAoIW1fZHdSZWZDb3VudCkgew0KKyAgICAgIGRlbGV0ZSB0aGlzOw0KICAgICB9DQotICAgIHZpcnR1YWwgSUZXTF9UYXJnZXQqCVJldGFpbigpDQotICAgIHsNCi0gICAgICAgIG1fZHdSZWZDb3VudCArKzsNCi0gICAgICAgIHJldHVybiAoSUZXTF9UYXJnZXQqKXRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KLSAgICB7DQotICAgICAgICB3c0NsYXNzID0gTCJDRldMX05vdGUiOw0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldENsYXNzSUQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgdmlydHVhbAlDRldMX05vdGUqCQlDbG9uZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIEZYX0JPT0wJCQkJCUlzRXZlbnQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9iSXNFdmVudDsNCi0gICAgfQ0KLSAgICBJRldMX1dpZGdldAkqbV9wU3JjVGFyZ2V0Ow0KLSAgICBJRldMX1dpZGdldAkqbV9wRHN0VGFyZ2V0Ow0KLXByb3RlY3RlZDoNCi0gICAgQ0ZXTF9Ob3RlKEZYX0JPT0wgYklzRXZlbnQpDQotICAgICAgICA6IG1fcFNyY1RhcmdldChOVUxMKQ0KLSAgICAgICAgLCBtX3BEc3RUYXJnZXQoTlVMTCkNCi0gICAgICAgICwgbV9kd1JlZkNvdW50KDEpDQotICAgICAgICAsIG1fYklzRXZlbnQoYklzRXZlbnQpDQotICAgICAgICAsIG1fZHdFeHRlbmQoMCkNCi0gICAgew0KLSAgICB9DQotICAgIHZpcnR1YWwgfkNGV0xfTm90ZSgpIHt9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUluaXRpYWxpemUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUZpbmFsaXplKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgRlhfRFdPUkQJCW1fZHdSZWZDb3VudDsNCi0gICAgRlhfQk9PTAkJCW1fYklzRXZlbnQ7DQotcHVibGljOg0KLSAgICBGWF9EV09SRCAgICAgICAgbV9kd0V4dGVuZDsNCisgICAgcmV0dXJuIGR3UmVmQ291bnQ7DQorICB9DQorICB2aXJ0dWFsIElGV0xfVGFyZ2V0KiBSZXRhaW4oKSB7DQorICAgIG1fZHdSZWZDb3VudCsrOw0KKyAgICByZXR1cm4gKElGV0xfVGFyZ2V0Kil0aGlzOw0KKyAgfQ0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgICB3c0NsYXNzID0gTCJDRldMX05vdGUiOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdCB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNJbnN0YW5jZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2xhc3MpIGNvbnN0IHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICB2aXJ0dWFsIENGV0xfTm90ZSogQ2xvbmUoKSB7IHJldHVybiBOVUxMOyB9DQorICBGWF9CT09MIElzRXZlbnQoKSBjb25zdCB7IHJldHVybiBtX2JJc0V2ZW50OyB9DQorICBJRldMX1dpZGdldCogbV9wU3JjVGFyZ2V0Ow0KKyAgSUZXTF9XaWRnZXQqIG1fcERzdFRhcmdldDsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9Ob3RlKEZYX0JPT0wgYklzRXZlbnQpDQorICAgICAgOiBtX3BTcmNUYXJnZXQoTlVMTCksDQorICAgICAgICBtX3BEc3RUYXJnZXQoTlVMTCksDQorICAgICAgICBtX2R3UmVmQ291bnQoMSksDQorICAgICAgICBtX2JJc0V2ZW50KGJJc0V2ZW50KSwNCisgICAgICAgIG1fZHdFeHRlbmQoMCkge30NCisgIHZpcnR1YWwgfkNGV0xfTm90ZSgpIHt9DQorICB2aXJ0dWFsIEZYX0JPT0wgSW5pdGlhbGl6ZSgpIHsgcmV0dXJuIFRSVUU7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBGaW5hbGl6ZSgpIHsgcmV0dXJuIDA7IH0NCisgIEZYX0RXT1JEIG1fZHdSZWZDb3VudDsNCisgIEZYX0JPT0wgbV9iSXNFdmVudDsNCisNCisgcHVibGljOg0KKyAgRlhfRFdPUkQgbV9kd0V4dGVuZDsNCiB9Ow0KLWNsYXNzIENGV0xfTWVzc2FnZSA6IHB1YmxpYyBDRldMX05vdGUNCi17DQotcHVibGljOg0KLSAgICBDRldMX01lc3NhZ2UoKSA6IENGV0xfTm90ZShGQUxTRSkge30NCi0gICAgdmlydHVhbCB+Q0ZXTF9NZXNzYWdlKCkge30NCi0gICAgdmlydHVhbCBDRldMX0V2ZW50KiBDbG9uZVRvRXZlbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KK2NsYXNzIENGV0xfTWVzc2FnZSA6IHB1YmxpYyBDRldMX05vdGUgew0KKyBwdWJsaWM6DQorICBDRldMX01lc3NhZ2UoKSA6IENGV0xfTm90ZShGQUxTRSkge30NCisgIHZpcnR1YWwgfkNGV0xfTWVzc2FnZSgpIHt9DQorICB2aXJ0dWFsIENGV0xfRXZlbnQqIENsb25lVG9FdmVudCgpIHsgcmV0dXJuIE5VTEw7IH0NCiB9Ow0KLSNkZWZpbmUgQkVHSU5fRldMX01FU1NBR0VfREVGKGNsYXNzbmFtZSwgbXNnaGFzaGNvZGUpIFwNCi0gICAgY2xhc3MgY2xhc3NuYW1lIDogcHVibGljIENGV0xfTWVzc2FnZSBcDQotICAgIHsgXA0KLSAgICBwdWJsaWM6IFwNCi0gICAgICAgIGNsYXNzbmFtZSgpIDogQ0ZXTF9NZXNzYWdlKCkge30gXA0KLSAgICAgICAgdmlydHVhbAlDRldMX05vdGUqCUNsb25lKCkge3JldHVybiBGWF9ORVcgY2xhc3NuYW1lKCp0aGlzKTt9IFwNCi0gICAgICAgIHZpcnR1YWwgRldMX0VSUglHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0IHt3c0NsYXNzID0gTCIgIyMgY2xhc3NuYW1lICMjICI7IHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDt9IFwNCi0gICAgICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Q2xhc3NJRCgpIGNvbnN0IHtyZXR1cm4gbXNnaGFzaGNvZGU7fSBcDQotICAgICAgICB2aXJ0dWFsIENGV0xfRXZlbnQqIENsb25lVG9FdmVudCgpIHtjbGFzc25hbWUgKnBFdmVudCA9IEZYX05FVyBjbGFzc25hbWU7IHBFdmVudC0+bV9iSXNFdmVudCA9IFRSVUU7IHJldHVybiAoQ0ZXTF9FdmVudCopcEV2ZW50O30NCisjZGVmaW5lIEJFR0lOX0ZXTF9NRVNTQUdFX0RFRihjbGFzc25hbWUsIG1zZ2hhc2hjb2RlKSAgICAgICAgICAgICAgXA0KKyAgY2xhc3MgY2xhc3NuYW1lIDogcHVibGljIENGV0xfTWVzc2FnZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgY2xhc3NuYW1lKCkgOiBDRldMX01lc3NhZ2UoKSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICB2aXJ0dWFsIENGV0xfTm90ZSogQ2xvbmUoKSB7IHJldHVybiBGWF9ORVcgY2xhc3NuYW1lKCp0aGlzKTsgfSBcDQorICAgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsgIFwNCisgICAgICB3c0NsYXNzID0gTCIgIyMgY2xhc3NuYW1lICMjICI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3QgeyByZXR1cm4gbXNnaGFzaGNvZGU7IH0gICAgXA0KKyAgICB2aXJ0dWFsIENGV0xfRXZlbnQqIENsb25lVG9FdmVudCgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgY2xhc3NuYW1lKiBwRXZlbnQgPSBGWF9ORVcgY2xhc3NuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICBwRXZlbnQtPm1fYklzRXZlbnQgPSBUUlVFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIHJldHVybiAoQ0ZXTF9FdmVudCopcEV2ZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIH0NCiAjZGVmaW5lIEVORF9GV0xfTUVTU0FHRV9ERUYgXA0KLSAgICB9Ow0KKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICA7DQogQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnQWN0aXZhdGUsIEZXTF9NU0dIQVNIX0FjdGl2YXRlKQ0KIEVORF9GV0xfTUVTU0FHRV9ERUYNCiBCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dEZWFjdGl2YXRlLCBGV0xfTVNHSEFTSF9EZWFjdGl2YXRlKQ0KIEVORF9GV0xfTUVTU0FHRV9ERUYNCiBCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dNb3VzZSwgRldMX01TR0hBU0hfTW91c2UpDQotRlhfRkxPQVQJbV9meDsNCi1GWF9GTE9BVAltX2Z5Ow0KLUZYX0RXT1JECW1fZHdGbGFnczsNCi1GWF9EV09SRAltX2R3Q21kOw0KK0ZYX0ZMT0FUIG1fZng7DQorRlhfRkxPQVQgbV9meTsNCitGWF9EV09SRCBtX2R3RmxhZ3M7DQorRlhfRFdPUkQgbV9kd0NtZDsNCiBFTkRfRldMX01FU1NBR0VfREVGDQogQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnTW91c2VXaGVlbCwgRldMX01TR0hBU0hfTW91c2VXaGVlbCkNCi1GWF9GTE9BVAltX2Z4Ow0KLUZYX0ZMT0FUCW1fZnk7DQotRlhfRkxPQVQJbV9mRGVsdGFYOw0KLUZYX0ZMT0FUCW1fZkRlbHRhWTsNCi1GWF9EV09SRAltX2R3RmxhZ3M7DQorRlhfRkxPQVQgbV9meDsNCitGWF9GTE9BVCBtX2Z5Ow0KK0ZYX0ZMT0FUIG1fZkRlbHRhWDsNCitGWF9GTE9BVCBtX2ZEZWx0YVk7DQorRlhfRFdPUkQgbV9kd0ZsYWdzOw0KIEVORF9GV0xfTUVTU0FHRV9ERUYNCiBCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dTZXRGb2N1cywgRldMX01TR0hBU0hfU2V0Rm9jdXMpDQotSUZXTF9XaWRnZXQgKm1fcEtpbGxGb2N1czsNCitJRldMX1dpZGdldCogbV9wS2lsbEZvY3VzOw0KIEVORF9GV0xfTUVTU0FHRV9ERUYNCiBCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dLaWxsRm9jdXMsIEZXTF9NU0dIQVNIX0tpbGxGb2N1cykNCi1JRldMX1dpZGdldCAqbV9wU2V0Rm9jdXM7DQorSUZXTF9XaWRnZXQqIG1fcFNldEZvY3VzOw0KIEVORF9GV0xfTUVTU0FHRV9ERUYNCiBCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dLZXksIEZXTF9NU0dIQVNIX0tleSkNCi1GWF9EV09SRAltX2R3S2V5Q29kZTsNCi1GWF9EV09SRAltX2R3RmxhZ3M7DQotRlhfRFdPUkQJbV9kd0NtZDsNCitGWF9EV09SRCBtX2R3S2V5Q29kZTsNCitGWF9EV09SRCBtX2R3RmxhZ3M7DQorRlhfRFdPUkQgbV9kd0NtZDsNCiBFTkRfRldMX01FU1NBR0VfREVGDQogQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnQ3Vyc29yLCBGV0xfTVNHSEFTSF9DdXJzb3IpDQogRU5EX0ZXTF9NRVNTQUdFX0RFRg0KIEJFR0lOX0ZXTF9NRVNTQUdFX0RFRihDRldMX01zZ1NpemUsIEZXTF9NU0dIQVNIX1NpemUpDQotaW50MzJfdAltX2lXaWR0aDsNCi1pbnQzMl90CW1faUhlaWdodDsNCitpbnQzMl90IG1faVdpZHRoOw0KK2ludDMyX3QgbV9pSGVpZ2h0Ow0KIEVORF9GV0xfTUVTU0FHRV9ERUYNCiBCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dXaW5kb3dNb3ZlLCBGV0xfTVNHSEFTSF9XaW5kb3dNb3ZlKQ0KLUZYX0ZMT0FUCW1fZng7DQotRlhfRkxPQVQJbV9meTsNCitGWF9GTE9BVCBtX2Z4Ow0KK0ZYX0ZMT0FUIG1fZnk7DQogRU5EX0ZXTF9NRVNTQUdFX0RFRg0KIEJFR0lOX0ZXTF9NRVNTQUdFX0RFRihDRldMX01zZ0Ryb3BGaWxlcywgRldMX01TR0hBU0hfRHJvcEZpbGVzKQ0KLUNGV0xfTXNnRHJvcEZpbGVzKGNvbnN0IENGV0xfTXNnRHJvcEZpbGVzJiBjb3B5KQ0KLXsNCi0gICAgbV9wRHN0VGFyZ2V0ID0gY29weS5tX3BEc3RUYXJnZXQ7DQotICAgIG1fcFNyY1RhcmdldCA9IGNvcHkubV9wU3JjVGFyZ2V0Ow0KLSAgICBtX2Z4ID0gY29weS5tX2Z4Ow0KLSAgICBtX2Z5ID0gY29weS5tX2Z5Ow0KLSAgICBtX2ZpbGVzLkFwcGVuZChjb3B5Lm1fZmlsZXMpOw0KK0NGV0xfTXNnRHJvcEZpbGVzKGNvbnN0IENGV0xfTXNnRHJvcEZpbGVzJiBjb3B5KSB7DQorICBtX3BEc3RUYXJnZXQgPSBjb3B5Lm1fcERzdFRhcmdldDsNCisgIG1fcFNyY1RhcmdldCA9IGNvcHkubV9wU3JjVGFyZ2V0Ow0KKyAgbV9meCA9IGNvcHkubV9meDsNCisgIG1fZnkgPSBjb3B5Lm1fZnk7DQorICBtX2ZpbGVzLkFwcGVuZChjb3B5Lm1fZmlsZXMpOw0KIH0NCi1GWF9GTE9BVAltX2Z4Ow0KLUZYX0ZMT0FUCW1fZnk7DQotQ0ZYX1dpZGVTdHJpbmdBcnJheQltX2ZpbGVzOw0KK0ZYX0ZMT0FUIG1fZng7DQorRlhfRkxPQVQgbV9meTsNCitDRlhfV2lkZVN0cmluZ0FycmF5IG1fZmlsZXM7DQogRU5EX0ZXTF9NRVNTQUdFX0RFRg0KIEJFR0lOX0ZXTF9NRVNTQUdFX0RFRihDRldMX01zZ1Rhc2tDbGlja2VkLCBGV0xfTVNHSEFTSF9UYXNrQ2xpY2tlZCkNCi1GWF9GTE9BVAltX2Z4Ow0KLUZYX0ZMT0FUCW1fZnk7DQorRlhfRkxPQVQgbV9meDsNCitGWF9GTE9BVCBtX2Z5Ow0KIEVORF9GV0xfTUVTU0FHRV9ERUYNCiBCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dDbG9zZSwgRldMX01TR0hBU0hfQ2xvc2UpDQogRU5EX0ZXTF9NRVNTQUdFX0RFRg0KIEJFR0lOX0ZXTF9NRVNTQUdFX0RFRihDRldMX01zZ1dpbmRvd1dpbGxNb3ZlLCBGV0xfTVNHSEFTSF9XaW5kb3dXaWxsTW92ZSkNCiBFTkRfRldMX01FU1NBR0VfREVGDQotY2xhc3MgQ0ZXTF9FdmVudCA6IHB1YmxpYyBDRldMX05vdGUNCi17DQotcHVibGljOg0KLSAgICBDRldMX0V2ZW50KCkgOiBDRldMX05vdGUoVFJVRSkge30NCi0gICAgdmlydHVhbCB+Q0ZXTF9FdmVudCgpIHt9DQorY2xhc3MgQ0ZXTF9FdmVudCA6IHB1YmxpYyBDRldMX05vdGUgew0KKyBwdWJsaWM6DQorICBDRldMX0V2ZW50KCkgOiBDRldMX05vdGUoVFJVRSkge30NCisgIHZpcnR1YWwgfkNGV0xfRXZlbnQoKSB7fQ0KIH07DQotI2RlZmluZSBCRUdJTl9GV0xfRVZFTlRfREVGKGNsYXNzbmFtZSwgZXZlbnRoYXNoY29kZSkJXA0KLSAgICBjbGFzcyBjbGFzc25hbWUgOiBwdWJsaWMgQ0ZXTF9FdmVudCBcDQotICAgIHsgXA0KLSAgICBwdWJsaWM6IFwNCi0gICAgICAgIGNsYXNzbmFtZSgpIDogQ0ZXTF9FdmVudCgpIHt9IFwNCi0gICAgICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdCB7d3NDbGFzcyA9IEwiICMjIGNsYXNzbmFtZSAjIyAiOyByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7fSBcDQotICAgICAgICB2aXJ0dWFsIEZYX0RXT1JECUdldENsYXNzSUQoKSBjb25zdCB7cmV0dXJuIGV2ZW50aGFzaGNvZGU7fQ0KKyNkZWZpbmUgQkVHSU5fRldMX0VWRU5UX0RFRihjbGFzc25hbWUsIGV2ZW50aGFzaGNvZGUpICAgICAgICAgICAgIFwNCisgIGNsYXNzIGNsYXNzbmFtZSA6IHB1YmxpYyBDRldMX0V2ZW50IHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBjbGFzc25hbWUoKSA6IENGV0xfRXZlbnQoKSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3QgeyBcDQorICAgICAgd3NDbGFzcyA9IEwiICMjIGNsYXNzbmFtZSAjIyAiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0IHsgcmV0dXJuIGV2ZW50aGFzaGNvZGU7IH0NCiAjZGVmaW5lIEVORF9GV0xfRVZFTlRfREVGIFwNCi0gICAgfTsNCisgIH0gICAgICAgICAgICAgICAgICAgICAgIFwNCisgIDsNCiBCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0TW91c2UsIEZXTF9FVlRIQVNIX01vdXNlKQ0KLUZYX0ZMT0FUCW1fZng7DQotRlhfRkxPQVQJbV9meTsNCi1GWF9EV09SRAltX2R3RmxhZ3M7DQotRlhfRFdPUkQJbV9kd0NtZDsNCitGWF9GTE9BVCBtX2Z4Ow0KK0ZYX0ZMT0FUIG1fZnk7DQorRlhfRFdPUkQgbV9kd0ZsYWdzOw0KK0ZYX0RXT1JEIG1fZHdDbWQ7DQogRU5EX0ZXTF9FVkVOVF9ERUYNCiBCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0TW91c2VXaGVlbCwgRldMX0VWVEhBU0hfTW91c2VXaGVlbCkNCi1GWF9GTE9BVAltX2Z4Ow0KLUZYX0ZMT0FUCW1fZnk7DQotRlhfRkxPQVQJbV9mRGVsdGFYOw0KLUZYX0ZMT0FUCW1fZkRlbHRhWTsNCi1GWF9EV09SRAltX2R3RmxhZ3M7DQorRlhfRkxPQVQgbV9meDsNCitGWF9GTE9BVCBtX2Z5Ow0KK0ZYX0ZMT0FUIG1fZkRlbHRhWDsNCitGWF9GTE9BVCBtX2ZEZWx0YVk7DQorRlhfRFdPUkQgbV9kd0ZsYWdzOw0KIEVORF9GV0xfRVZFTlRfREVGDQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEtleSwgRldMX0VWVEhBU0hfS2V5KQ0KLUZYX0RXT1JECW1fZHdLZXlDb2RlOw0KLUZYX0RXT1JECW1fZHdGbGFnczsNCi1GWF9EV09SRAltX2R3Q21kOw0KK0ZYX0RXT1JEIG1fZHdLZXlDb2RlOw0KK0ZYX0RXT1JEIG1fZHdGbGFnczsNCitGWF9EV09SRCBtX2R3Q21kOw0KIEVORF9GV0xfRVZFTlRfREVGDQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dFNldEZvY3VzLCBGV0xfRVZUSEFTSF9TZXRGb2N1cykNCi1JRldMX1dpZGdldCAqbV9wU2V0Rm9jdXM7DQorSUZXTF9XaWRnZXQqIG1fcFNldEZvY3VzOw0KIEVORF9GV0xfRVZFTlRfREVGDQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEtpbGxGb2N1cywgRldMX0VWVEhBU0hfS2lsbEZvY3VzKQ0KLUlGV0xfV2lkZ2V0ICptX3BLaWxsRm9jdXM7DQorSUZXTF9XaWRnZXQqIG1fcEtpbGxGb2N1czsNCiBFTkRfRldMX0VWRU5UX0RFRg0KIEJFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnREcmF3LCBGV0xfRVZUSEFTSF9EcmF3KQ0KLUNGWF9HcmFwaGljcwkqbV9wR3JhcGhpY3M7DQotSUZXTF9XaWRnZXQJCSptX3BXaWRnZXQ7DQorQ0ZYX0dyYXBoaWNzKiBtX3BHcmFwaGljczsNCitJRldMX1dpZGdldCogbV9wV2lkZ2V0Ow0KIEVORF9GV0xfRVZFTlRfREVGDQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENsaWNrLCBGV0xfRVZUSEFTSF9DbGljaykNCiBFTkRfRldMX0VWRU5UX0RFRg0KIEJFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRTY3JvbGwsIEZXTF9FVlRIQVNIX1Njcm9sbCkNCiBGWF9EV09SRCBtX2lTY3JvbGxDb2RlOw0KIEZYX0ZMT0FUIG1fZlBvczsNCi1GWF9CT09MICptX3BSZXQ7DQorRlhfQk9PTCogbV9wUmV0Ow0KIEVORF9GV0xfRVZFTlRfREVGDQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENsb3NlLCBGV0xfRVZUSEFTSF9DbG9zZSkNCiBFTkRfRldMX0VWRU5UX0RFRg0KIEJFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRDb250ZXh0TWVudSwgRldMX0VWVEhBU0hfQ29udGV4dE1lbnUpDQotRlhfRkxPQVQgICBtX2ZQb3NYOw0KLUZYX0ZMT0FUICAgbV9mUG9zWTsNCi1JRldMX1dpZGdldCAqbV9wT3duZXI7DQorRlhfRkxPQVQgbV9mUG9zWDsNCitGWF9GTE9BVCBtX2ZQb3NZOw0KK0lGV0xfV2lkZ2V0KiBtX3BPd25lcjsNCiBFTkRfRldMX0VWRU5UX0RFRg0KIEJFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRNZW51Q29tbWFuZCwgRldMX0VWVEhBU0hfTWVudUNvbW1hbmQpDQogaW50MzJfdCBtX2lDb21tYW5kOw0KIHZvaWQqIG1fcERhdGE7DQogRU5EX0ZXTF9FVkVOVF9ERUYNCiBCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0U2l6ZUNoYW5nZWQsIEZXTF9FVlRIQVNIX1NpemVDaGFuZ2VkKQ0KLUlGV0xfV2lkZ2V0ICptX3BXaWRnZXQ7DQotQ0ZYX1JlY3RGCW1fcnRPbGQ7DQotQ0ZYX1JlY3RGCW1fcnROZXc7DQorSUZXTF9XaWRnZXQqIG1fcFdpZGdldDsNCitDRlhfUmVjdEYgbV9ydE9sZDsNCitDRlhfUmVjdEYgbV9ydE5ldzsNCiBFTkRfRldMX01FU1NBR0VfREVGDQogQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dElkbGUsIEZXTF9FVlRIQVNIX0lkbGUpDQogRU5EX0ZXTF9FVkVOVF9ERUYNCiB0eXBlZGVmIGVudW0gew0KLSAgICBGV0xfRVZFTlRfTU9VU0VfTUFTSwkJCT0gMSA8PCAwLA0KLSAgICBGV0xfRVZFTlRfTU9VU0VXSEVFTF9NQVNLCQk9IDEgPDwgMSwNCi0gICAgRldMX0VWRU5UX0tFWV9NQVNLCQkJCT0gMSA8PCAyLA0KLSAgICBGV0xfRVZFTlRfRk9DVVNDSEFOR0VEX01BU0sJCT0gMSA8PCAzLA0KLSAgICBGV0xfRVZFTlRfRFJBV19NQVNLCQkJCT0gMSA8PCA0LA0KLSAgICBGV0xfRVZFTlRfQ0xPU0VfTUFTSwkJCT0gMSA8PCA1LA0KLSAgICBGV0xfRVZFTlRfU0laRUNIQU5HRURfTUFTSwkJPSAxIDw8IDYsDQotICAgIEZXTF9FVkVOVF9JRExFX01BU0sgICAgICAgICAgICAgPSAxIDw8IDcsDQotICAgIEZXTF9FVkVOVF9DT05UUk9MX01BU0sgICAgICAgICAgPSAxIDw8IDgsDQotICAgIEZXTF9FVkVOVF9BTExfTUFTSwkJCQk9IDB4RkYNCisgIEZXTF9FVkVOVF9NT1VTRV9NQVNLID0gMSA8PCAwLA0KKyAgRldMX0VWRU5UX01PVVNFV0hFRUxfTUFTSyA9IDEgPDwgMSwNCisgIEZXTF9FVkVOVF9LRVlfTUFTSyA9IDEgPDwgMiwNCisgIEZXTF9FVkVOVF9GT0NVU0NIQU5HRURfTUFTSyA9IDEgPDwgMywNCisgIEZXTF9FVkVOVF9EUkFXX01BU0sgPSAxIDw8IDQsDQorICBGV0xfRVZFTlRfQ0xPU0VfTUFTSyA9IDEgPDwgNSwNCisgIEZXTF9FVkVOVF9TSVpFQ0hBTkdFRF9NQVNLID0gMSA8PCA2LA0KKyAgRldMX0VWRU5UX0lETEVfTUFTSyA9IDEgPDwgNywNCisgIEZXTF9FVkVOVF9DT05UUk9MX01BU0sgPSAxIDw8IDgsDQorICBGV0xfRVZFTlRfQUxMX01BU0sgPSAweEZGDQogfSBGV0xFdmVudE1hc2s7DQotY2xhc3MgSUZXTF9Ob3RlRHJpdmVyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZXTF9Ob3RlRHJpdmVyKCkge30NCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZW5kTm90ZShDRldMX05vdGUgKnBOb3RlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUG9zdE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQgKnBMaXN0ZW5lciwgSUZXTF9XaWRnZXQgKnBFdmVudFNvdXJjZSA9IE5VTEwsIEZYX0RXT1JEIGR3RmlsdGVyID0gRldMX0VWRU5UX0FMTF9NQVNLKSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJVW5yZWdpc3RlckV2ZW50VGFyZ2V0KElGV0xfV2lkZ2V0ICpwTGlzdGVuZXIpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlDbGVhckV2ZW50VGFyZ2V0cyhGWF9CT09MIGJSZW1vdmVBbGwpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldFF1ZXVlTWF4U2l6ZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRRdWV1ZU1heFNpemUoY29uc3QgaW50MzJfdCBzaXplKSA9IDA7DQotICAgIHZpcnR1YWwgSUZXTF9Ob3RlVGhyZWFkKiBHZXRPd25lclRocmVhZCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlQdXNoTm90ZUxvb3AoSUZXTF9Ob3RlTG9vcCAqcE5vdGVMb29wKSA9IDA7DQotICAgIHZpcnR1YWwgSUZXTF9Ob3RlTG9vcCoJUG9wTm90ZUxvb3AoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0Rm9jdXMoSUZXTF9XaWRnZXQgKnBGb2N1cywgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpID0gMDsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQlSdW4oKSA9IDA7DQorY2xhc3MgSUZXTF9Ob3RlRHJpdmVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZXTF9Ob3RlRHJpdmVyKCkge30NCisgIHZpcnR1YWwgRlhfQk9PTCBTZW5kTm90ZShDRldMX05vdGUqIHBOb3RlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUG9zdE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlZ2lzdGVyRXZlbnRUYXJnZXQoDQorICAgICAgSUZXTF9XaWRnZXQqIHBMaXN0ZW5lciwNCisgICAgICBJRldMX1dpZGdldCogcEV2ZW50U291cmNlID0gTlVMTCwNCisgICAgICBGWF9EV09SRCBkd0ZpbHRlciA9IEZXTF9FVkVOVF9BTExfTUFTSykgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVucmVnaXN0ZXJFdmVudFRhcmdldChJRldMX1dpZGdldCogcExpc3RlbmVyKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQ2xlYXJFdmVudFRhcmdldHMoRlhfQk9PTCBiUmVtb3ZlQWxsKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0UXVldWVNYXhTaXplKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFF1ZXVlTWF4U2l6ZShjb25zdCBpbnQzMl90IHNpemUpID0gMDsNCisgIHZpcnR1YWwgSUZXTF9Ob3RlVGhyZWFkKiBHZXRPd25lclRocmVhZCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBQdXNoTm90ZUxvb3AoSUZXTF9Ob3RlTG9vcCogcE5vdGVMb29wKSA9IDA7DQorICB2aXJ0dWFsIElGV0xfTm90ZUxvb3AqIFBvcE5vdGVMb29wKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvY3VzKElGV0xfV2lkZ2V0KiBwRm9jdXMsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgUnVuKCkgPSAwOw0KIH07DQotSUZXTF9XaWRnZXQqIEZXTF9HZXRDdXJyZW50VGhyZWFkTW9kYWxXaWRnZXQoSUZXTF9Ob3RlVGhyZWFkICpwTm90ZVRocmVhZCk7DQotY2xhc3MgSUZXTF9Ob3RlTG9vcA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGV0xfTm90ZUxvb3AoKSB7fQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgUHJlUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJSWRsZShpbnQzMl90IGNvdW50KSA9IDA7DQorSUZXTF9XaWRnZXQqIEZXTF9HZXRDdXJyZW50VGhyZWFkTW9kYWxXaWRnZXQoSUZXTF9Ob3RlVGhyZWFkKiBwTm90ZVRocmVhZCk7DQorY2xhc3MgSUZXTF9Ob3RlTG9vcCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfTm90ZUxvb3AoKSB7fQ0KKyAgdmlydHVhbCBGWF9CT09MIFByZVByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBJZGxlKGludDMyX3QgY291bnQpID0gMDsNCiB9Ow0KLWNsYXNzIElGV0xfVG9vbFRpcFRhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGV0xfVG9vbFRpcFRhcmdldCgpIHt9DQotICAgIHZpcnR1YWwgSUZXTF9XaWRnZXQqCUdldFdpZGdldCgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNTaG93ZWQoKSA9IDA7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJCURyYXdUb29sVGlwKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4LCBJRldMX1dpZGdldCAqcFRvb2xUaXApID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJVXNlRGVmYXVsdFRoZW1lKCkgPSAwOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCQlHZXRDYXB0aW9uKENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pID0gMDsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQkJR2V0VG9vbFRpcFNpemUoQ0ZYX1NpemVGICZzeikgPSAwOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCQlHZXRUb29sVGlwUG9zKENGWF9Qb2ludEYgJnB0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLSAgICB9DQorY2xhc3MgSUZXTF9Ub29sVGlwVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZXTF9Ub29sVGlwVGFyZ2V0KCkge30NCisgIHZpcnR1YWwgSUZXTF9XaWRnZXQqIEdldFdpZGdldCgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc1Nob3dlZCgpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3VG9vbFRpcChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwVG9vbFRpcCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFVzZURlZmF1bHRUaGVtZSgpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRUb29sVGlwU2l6ZShDRlhfU2l6ZUYmIHN6KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0VG9vbFRpcFBvcyhDRlhfUG9pbnRGJiBwdCkgeyByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOyB9DQogfTsNCi1GV0xfRVJSIEZXTF9BZGRUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCAqcFRhcmdldCk7DQotRldMX0VSUiBGV0xfUmVtb3ZlVG9vbFRpcFRhcmdldChJRldMX1Rvb2xUaXBUYXJnZXQgKnBUYXJnZXQpOw0KLUZXTF9FUlIJRldMX1NldFRvb2xUaXBJbml0aWFsRGVsYXkoaW50MzJfdCBpRGVsYXlUaW1lKTsNCi1GV0xfRVJSCUZXTF9TZXRUb29sVGlwQXV0b1BvcERlbGF5KGludDMyX3QgaURlbGF5VGltZSk7DQotdHlwZWRlZiBGWF9CT09MICgqRldMTWVzc2FnZUhvb2tDYWxsYmFjaykoQ0ZXTF9NZXNzYWdlICptc2csIHZvaWQqIGluZm8pOw0KLUZXTF9FUlIgRldMX1NldEhvb2soSUZXTF9Ob3RlRHJpdmVyICpkcml2ZXIsIEZXTE1lc3NhZ2VIb29rQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIGluZm8pOw0KK0ZXTF9FUlIgRldMX0FkZFRvb2xUaXBUYXJnZXQoSUZXTF9Ub29sVGlwVGFyZ2V0KiBwVGFyZ2V0KTsNCitGV0xfRVJSIEZXTF9SZW1vdmVUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCogcFRhcmdldCk7DQorRldMX0VSUiBGV0xfU2V0VG9vbFRpcEluaXRpYWxEZWxheShpbnQzMl90IGlEZWxheVRpbWUpOw0KK0ZXTF9FUlIgRldMX1NldFRvb2xUaXBBdXRvUG9wRGVsYXkoaW50MzJfdCBpRGVsYXlUaW1lKTsNCit0eXBlZGVmIEZYX0JPT0wgKCpGV0xNZXNzYWdlSG9va0NhbGxiYWNrKShDRldMX01lc3NhZ2UqIG1zZywgdm9pZCogaW5mbyk7DQorRldMX0VSUiBGV0xfU2V0SG9vayhJRldMX05vdGVEcml2ZXIqIGRyaXZlciwNCisgICAgICAgICAgICAgICAgICAgIEZXTE1lc3NhZ2VIb29rQ2FsbGJhY2sgY2FsbGJhY2ssDQorICAgICAgICAgICAgICAgICAgICB2b2lkKiBpbmZvKTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfcGFuZWwuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9wYW5lbC5oCmluZGV4IDk0YzM1NGEuLmIyYWE2ZjQgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9wYW5lbC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9wYW5lbC5oCkBAIC0xMCwzMSArMTAsMzMgQEAKIGNsYXNzIElGV0xfQ29udGVudDsNCiBjbGFzcyBJRldMX1BhbmVsOw0KIGNsYXNzIElGV0xfQ3VzdG9tUGFuZWw7DQotI2RlZmluZSBGV0xfQ0xBU1NfUGFuZWwJCQkJCUwiRldMX1BhbmVsIg0KLSNkZWZpbmUgRldMX0NMQVNTSEFTSF9QYW5lbAkJCQk4ODE1NjcyOTINCi1jbGFzcyBJRldMX1BhbmVsIDogcHVibGljIElGV0xfV2lkZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGV0xfUGFuZWwqIENyZWF0ZSgpOw0KLSAgICBGV0xfRVJSCQkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCQlJbml0aWFsaXplKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBJRldMX0NvbnRlbnQqCUdldENvbnRlbnQoKTsNCi0gICAgRldMX0VSUgkJCVNldENvbnRlbnQoSUZXTF9Db250ZW50ICpwQ29udGVudCk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX1BhbmVsKCk7DQotICAgIHZpcnR1YWwgfklGV0xfUGFuZWwoKTsNCisjZGVmaW5lIEZXTF9DTEFTU19QYW5lbCBMIkZXTF9QYW5lbCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfUGFuZWwgODgxNTY3MjkyDQorY2xhc3MgSUZXTF9QYW5lbCA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX1BhbmVsKiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIElGV0xfQ29udGVudCogR2V0Q29udGVudCgpOw0KKyAgRldMX0VSUiBTZXRDb250ZW50KElGV0xfQ29udGVudCogcENvbnRlbnQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX1BhbmVsKCk7DQorICB2aXJ0dWFsIH5JRldMX1BhbmVsKCk7DQogfTsNCi1jbGFzcyBJRldMX0N1c3RvbVBhbmVsIDogcHVibGljIElGV0xfV2lkZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGV0xfQ3VzdG9tUGFuZWwqIENyZWF0ZSgpOw0KLSAgICBGV0xfRVJSCQkJSW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCQlJbml0aWFsaXplKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBJRldMX0NvbnRlbnQqCUdldENvbnRlbnQoKTsNCi0gICAgRldMX0VSUgkJCVNldENvbnRlbnQoSUZXTF9Db250ZW50ICpwQ29udGVudCk7DQotICAgIEZXTF9FUlIJCQlTZXRQcm94eShJRldMX1Byb3h5ICpwUHJveHkpOw0KLXByb3RlY3RlZDoNCi0gICAgSUZXTF9DdXN0b21QYW5lbCgpOw0KLSAgICB2aXJ0dWFsIH5JRldMX0N1c3RvbVBhbmVsKCk7DQorY2xhc3MgSUZXTF9DdXN0b21QYW5lbCA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX0N1c3RvbVBhbmVsKiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIElGV0xfQ29udGVudCogR2V0Q29udGVudCgpOw0KKyAgRldMX0VSUiBTZXRDb250ZW50KElGV0xfQ29udGVudCogcENvbnRlbnQpOw0KKyAgRldMX0VSUiBTZXRQcm94eShJRldMX1Byb3h5KiBwUHJveHkpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX0N1c3RvbVBhbmVsKCk7DQorICB2aXJ0dWFsIH5JRldMX0N1c3RvbVBhbmVsKCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGFyZ2V0LmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGFyZ2V0LmgKaW5kZXggN2JhN2JmNy4uZmFjZDI4ZiAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RhcmdldC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90YXJnZXQuaApAQCAtNywxOSArNywxOSBAQAogI2lmbmRlZiBfRldMX1RBUkdFVF9IDQogI2RlZmluZSBfRldMX1RBUkdFVF9IDQogY2xhc3MgSUZXTF9UYXJnZXQ7DQotY2xhc3MgSUZXTF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBGWF9EV09SRAkJUmVsZWFzZSgpOw0KLSAgICBJRldMX1RhcmdldCoJUmV0YWluKCk7DQotICAgIEZYX0RXT1JECQlHZXRSZWZDb3VudCgpIGNvbnN0Ow0KLSAgICBGV0xfRVJSCQkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCi0gICAgRlhfRFdPUkQJCUdldENsYXNzSUQoKSBjb25zdDsNCi0gICAgRlhfQk9PTAkJCUlzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdDsNCi0gICAgRldMX0VSUgkJCUluaXRpYWxpemUoKTsNCi0gICAgRldMX0VSUgkJCUZpbmFsaXplKCk7DQotcHJvdGVjdGVkOg0KLSAgICB2aXJ0dWFsIH5JRldMX1RhcmdldCgpOw0KLSAgICB2b2lkKgltX3BEYXRhOw0KK2NsYXNzIElGV0xfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgRlhfRFdPUkQgUmVsZWFzZSgpOw0KKyAgSUZXTF9UYXJnZXQqIFJldGFpbigpOw0KKyAgRlhfRFdPUkQgR2V0UmVmQ291bnQoKSBjb25zdDsNCisgIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIEZYX0JPT0wgSXNJbnN0YW5jZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICBGV0xfRVJSIEZpbmFsaXplKCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgfklGV0xfVGFyZ2V0KCk7DQorICB2b2lkKiBtX3BEYXRhOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RoZW1lLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGhlbWUuaAppbmRleCA5NGU4MTc3Li4zZGZlN2M3IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGhlbWUuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGhlbWUuaApAQCAtMTIsODEgKzEyLDcxIEBACiBjbGFzcyBDRldMX1RoZW1lVGV4dDsNCiBjbGFzcyBDRldMX1RoZW1lRWxlbWVudDsNCiBjbGFzcyBJRldMX1RoZW1lUHJvdmlkZXI7DQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXIJCQkxDQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXIJCQkyDQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgJCTMNCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9FZGdlRmxhdAkJCTQNCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9FZGdlUmFpc2VkCQkJNQ0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX0VkZ2VTdW5rZW4JCQk2DQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRm9udAkJCQk3DQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRm9udFNpemUJCQk4DQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfVGV4dENvbG9yCQkJOQ0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX1RleHRTZWxDb2xvcgkJMTANCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9MaW5lSGVpZ2h0CQkJMTENCi0jZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9VSU1hcmdpbgkJCTEyDQotI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfU3BhY2VBYm92ZUJlbG93CQkxMw0KLSNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01BWAkJCQkJNjU1MzUNCi1jbGFzcyBDRldMX1RoZW1lUGFydA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfVGhlbWVQYXJ0KCkNCi0gICAgICAgIDogbV9wV2lkZ2V0KE5VTEwpDQotICAgICAgICAsIG1faVBhcnQoMCkNCi0gICAgICAgICwgbV9kd1N0YXRlcygwKQ0KLSAgICAgICAgLCBtX2R3RGF0YSgwKQ0KLSAgICAgICAgLCBtX3BEYXRhKE5VTEwpDQotICAgIHsNCi0gICAgICAgIG1fcnRQYXJ0LlJlc2V0KCk7DQotICAgICAgICBtX21hdHJpeC5SZXNldCgpOw0KLSAgICB9DQotICAgIENGWF9NYXRyaXgJCQkJIG1fbWF0cml4Ow0KLSAgICBDRlhfUmVjdEYJCQkJIG1fcnRQYXJ0Ow0KLSAgICBJRldMX1dpZGdldAkJCQkqbV9wV2lkZ2V0Ow0KLSAgICBpbnQzMl90CQkJCSBtX2lQYXJ0Ow0KLSAgICBGWF9EV09SRAkJCQkgbV9kd1N0YXRlczsNCi0gICAgRlhfRFdPUkQJCQkJIG1fZHdEYXRhOw0KLSAgICB2b2lkKgkJCQkgbV9wRGF0YTsNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9DWEJvcmRlciAxDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXIgMg0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoIDMNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9FZGdlRmxhdCA0DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVJhaXNlZCA1DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVN1bmtlbiA2DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRm9udCA3DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRm9udFNpemUgOA0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX1RleHRDb2xvciA5DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfVGV4dFNlbENvbG9yIDEwDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTGluZUhlaWdodCAxMQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX1VJTWFyZ2luIDEyDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfU3BhY2VBYm92ZUJlbG93IDEzDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUFYIDY1NTM1DQorY2xhc3MgQ0ZXTF9UaGVtZVBhcnQgew0KKyBwdWJsaWM6DQorICBDRldMX1RoZW1lUGFydCgpDQorICAgICAgOiBtX3BXaWRnZXQoTlVMTCksIG1faVBhcnQoMCksIG1fZHdTdGF0ZXMoMCksIG1fZHdEYXRhKDApLCBtX3BEYXRhKE5VTEwpIHsNCisgICAgbV9ydFBhcnQuUmVzZXQoKTsNCisgICAgbV9tYXRyaXguUmVzZXQoKTsNCisgIH0NCisgIENGWF9NYXRyaXggbV9tYXRyaXg7DQorICBDRlhfUmVjdEYgbV9ydFBhcnQ7DQorICBJRldMX1dpZGdldCogbV9wV2lkZ2V0Ow0KKyAgaW50MzJfdCBtX2lQYXJ0Ow0KKyAgRlhfRFdPUkQgbV9kd1N0YXRlczsNCisgIEZYX0RXT1JEIG1fZHdEYXRhOw0KKyAgdm9pZCogbV9wRGF0YTsNCiB9Ow0KLWNsYXNzIENGV0xfVGhlbWVCYWNrZ3JvdW5kIDogcHVibGljIENGV0xfVGhlbWVQYXJ0DQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQoKQ0KLSAgICAgICAgOiBtX3BHcmFwaGljcyhOVUxMKQ0KLSAgICAgICAgLCBtX3BJbWFnZShOVUxMKQ0KLSAgICAgICAgLCBtX3BQYXRoKE5VTEwpDQotICAgIHsNCi0gICAgfQ0KLSAgICBDRlhfR3JhcGhpY3MJCQkqbV9wR3JhcGhpY3M7DQotICAgIENGWF9ESUJpdG1hcAkJCSptX3BJbWFnZTsNCi0gICAgQ0ZYX1BhdGgJCQkJKm1fcFBhdGg7DQorY2xhc3MgQ0ZXTF9UaGVtZUJhY2tncm91bmQgOiBwdWJsaWMgQ0ZXTF9UaGVtZVBhcnQgew0KKyBwdWJsaWM6DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCgpIDogbV9wR3JhcGhpY3MoTlVMTCksIG1fcEltYWdlKE5VTEwpLCBtX3BQYXRoKE5VTEwpIHt9DQorICBDRlhfR3JhcGhpY3MqIG1fcEdyYXBoaWNzOw0KKyAgQ0ZYX0RJQml0bWFwKiBtX3BJbWFnZTsNCisgIENGWF9QYXRoKiBtX3BQYXRoOw0KIH07DQotY2xhc3MgQ0ZXTF9UaGVtZVRleHQgOiBwdWJsaWMgQ0ZXTF9UaGVtZVBhcnQNCi17DQotcHVibGljOg0KLSAgICBDRldMX1RoZW1lVGV4dCgpDQotICAgICAgICA6IG1fcEdyYXBoaWNzKE5VTEwpDQotICAgIHsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZwkJCSBtX3dzVGV4dDsNCi0gICAgRlhfRFdPUkQJCQkJIG1fZHdUVE9TdHlsZXM7DQotICAgIGludDMyX3QJCQkJIG1faVRUT0FsaWduOw0KLSAgICBDRlhfR3JhcGhpY3MJCSAgICAqbV9wR3JhcGhpY3M7DQorY2xhc3MgQ0ZXTF9UaGVtZVRleHQgOiBwdWJsaWMgQ0ZXTF9UaGVtZVBhcnQgew0KKyBwdWJsaWM6DQorICBDRldMX1RoZW1lVGV4dCgpIDogbV9wR3JhcGhpY3MoTlVMTCkge30NCisgIENGWF9XaWRlU3RyaW5nIG1fd3NUZXh0Ow0KKyAgRlhfRFdPUkQgbV9kd1RUT1N0eWxlczsNCisgIGludDMyX3QgbV9pVFRPQWxpZ247DQorICBDRlhfR3JhcGhpY3MqIG1fcEdyYXBoaWNzOw0KIH07DQotY2xhc3MgSUZXTF9UaGVtZVByb3ZpZGVyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZXTF9UaGVtZVByb3ZpZGVyKCkge30NCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECVNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9NYXRyaXggJm1hdHJpeCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdUZXh0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZCogICBHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzQ3VzdG9taXplZExheW91dChJRldMX1dpZGdldCAqcFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBDRlhfUmVjdEYgJnJ0UGFydCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzSW5QYXJ0KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpID0gMDsNCi0gICAgdmlydHVhbAlGWF9CT09MCQlDYWxjVGV4dFJlY3QoQ0ZXTF9UaGVtZVRleHQgKnBQYXJhbXMsIENGWF9SZWN0RiAmcmVjdCkgPSAwOw0KK2NsYXNzIElGV0xfVGhlbWVQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfVGhlbWVQcm92aWRlcigpIHt9DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0RXT1JEIFNldFRoZW1lSUQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUaGVtZUlELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoaWxkcmVuID0gVFJVRSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfTWF0cml4JiBtYXRyaXgpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NhcGFjaXR5KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNDdXN0b21pemVkTGF5b3V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0UGFydFJlY3QoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBhcnQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0luUGFydChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCogcFBhcmFtcywgQ0ZYX1JlY3RGJiByZWN0KSA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGhyZWFkLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGhyZWFkLmgKaW5kZXggZDZiYmY5My4uM2JjNWMzYyAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RocmVhZC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aHJlYWQuaApAQCAtOSw0OCArOSw0MiBAQAogY2xhc3MgSUZXTF9Ob3RlRHJpdmVyOw0KIGNsYXNzIElGV0xfVGhyZWFkOw0KIGNsYXNzIElGV0xfTm90ZVRocmVhZDsNCi10eXBlZGVmIHN0cnVjdCBfRldMX0hUSFJFQUQgew0KLSAgICB2b2lkKiBwRGF0YTsNCi19ICpGV0xfSFRIUkVBRDsNCi1jbGFzcyBJRldMX1RocmVhZA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRldMX1RocmVhZCAqIENyZWF0ZSgpOw0KLXByb3RlY3RlZDoNCi0gICAgdmlydHVhbCB+SUZXTF9UaHJlYWQoKSB7fQ0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB2b2lkCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUiBSdW4oRldMX0hUSFJFQUQgaFRocmVhZCkgPSAwOw0KK3R5cGVkZWYgc3RydWN0IF9GV0xfSFRIUkVBRCB7IHZvaWQqIHBEYXRhOyB9ICogRldMX0hUSFJFQUQ7DQorY2xhc3MgSUZXTF9UaHJlYWQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9UaHJlYWQqIENyZWF0ZSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2aXJ0dWFsIH5JRldMX1RocmVhZCgpIHt9DQorDQorIHB1YmxpYzoNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJ1bihGV0xfSFRIUkVBRCBoVGhyZWFkKSA9IDA7DQogfTsNCi1GV0xfSFRIUkVBRCBGV0xfU3RhcnRUaHJlYWQoSUZXTF9UaHJlYWQgKnBUaHJlYWQsIEZYX0JPT0wgYlN1c3BlbmRlZCA9IEZBTFNFKTsNCitGV0xfSFRIUkVBRCBGV0xfU3RhcnRUaHJlYWQoSUZXTF9UaHJlYWQqIHBUaHJlYWQsIEZYX0JPT0wgYlN1c3BlbmRlZCA9IEZBTFNFKTsNCiBGV0xfRVJSIEZXTF9SZXN1bWVUaHJlYWQoRldMX0hUSFJFQUQgaFRocmVhZCk7DQogRldMX0VSUiBGV0xfU3VzcGVuZFRocmVhZChGV0xfSFRIUkVBRCBoVGhyZWFkKTsNCiBGV0xfRVJSIEZXTF9LaWxsVGhyZWFkKEZXTF9IVEhSRUFEIGhUaHJlYWQsIGludDMyX3QgaUV4aXRDb2RlKTsNCiBGV0xfRVJSIEZXTF9TdG9wVGhyZWFkKEZXTF9IVEhSRUFEIGhUaHJlYWQsIGludDMyX3QgaUV4aXRDb2RlKTsNCiBGV0xfRVJSIEZXTF9TbGVlcChGWF9EV09SRCBkd01pbGxpc2Vjb25kcyk7DQotY2xhc3MgSUZXTF9Ob3RlVGhyZWFkIDogcHVibGljIElGV0xfVGhyZWFkDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGV0xfTm90ZVRocmVhZCogQ3JlYXRlKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUiBSdW4oRldMX0hUSFJFQUQgaFRocmVhZCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGV0xfTm90ZURyaXZlciogR2V0Tm90ZURyaXZlcigpID0gMDsNCitjbGFzcyBJRldMX05vdGVUaHJlYWQgOiBwdWJsaWMgSUZXTF9UaHJlYWQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9Ob3RlVGhyZWFkKiBDcmVhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBSdW4oRldMX0hUSFJFQUQgaFRocmVhZCkgPSAwOw0KKyAgdmlydHVhbCBJRldMX05vdGVEcml2ZXIqIEdldE5vdGVEcml2ZXIoKSA9IDA7DQogfTsNCi10eXBlZGVmIHN0cnVjdCBfRldMX0hNVVRFWCB7DQotICAgIHZvaWQqIHBEYXRhOw0KLX0gKkZXTF9ITVVURVg7DQotRldMX0hNVVRFWAlGV0xfQ3JlYXRlTXV0ZXgoKTsNCi1GV0xfRVJSCQlGV0xfRGVzdHJveU11dGV4KEZXTF9ITVVURVggaE11dGV4KTsNCi1GV0xfRVJSCQlGV0xfTG9ja011dGV4KEZXTF9ITVVURVggaE11dGV4KTsNCi1GV0xfRVJSCQlGV0xfVHJ5TG9ja011dGV4KEZXTF9ITVVURVggaE11dGV4KTsNCi1GV0xfRVJSCQlGV0xfVW5sb2NrTXV0ZXgoRldMX0hNVVRFWCBoTXV0ZXgpOw0KLUZXTF9FUlIJCUZXTF9Jc0xvY2tlZE11dGV4KEZXTF9ITVVURVggaE11dGV4LCBGWF9CT09MICZiTG9ja2VkKTsNCi10eXBlZGVmIHN0cnVjdCBfRldMX0hTRU1BUEhPUkUgew0KLSAgICB2b2lkKiBwRGF0YTsNCi19ICpGV0xfSFNFTUFQSE9SRTsNCi1GV0xfSFNFTUFQSE9SRQlGV0xfQ3JlYXRlU2VtYXBob3JlKCk7DQotRldMX0VSUgkJRldMX0Rlc3Ryb3lTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSk7DQotRldMX0VSUgkJRldMX1dhaXRTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSk7DQotRldMX0VSUgkJRldMX1Bvc3RTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSwgaW50MzJfdCBkb3duID0gMSk7DQotRldMX0VSUgkJRldMX0dldFNlbWFwaG9yZVZhbHVlKEZXTF9IU0VNQVBIT1JFIGhTZW1hcGhvcmUsIGludDMyX3QgJnZhbHVlKTsNCi1GV0xfRVJSCQlGV0xfUmVzZXRTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSwgaW50MzJfdCBpbml0KTsNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hNVVRFWCB7IHZvaWQqIHBEYXRhOyB9ICogRldMX0hNVVRFWDsNCitGV0xfSE1VVEVYIEZXTF9DcmVhdGVNdXRleCgpOw0KK0ZXTF9FUlIgRldMX0Rlc3Ryb3lNdXRleChGV0xfSE1VVEVYIGhNdXRleCk7DQorRldMX0VSUiBGV0xfTG9ja011dGV4KEZXTF9ITVVURVggaE11dGV4KTsNCitGV0xfRVJSIEZXTF9UcnlMb2NrTXV0ZXgoRldMX0hNVVRFWCBoTXV0ZXgpOw0KK0ZXTF9FUlIgRldMX1VubG9ja011dGV4KEZXTF9ITVVURVggaE11dGV4KTsNCitGV0xfRVJSIEZXTF9Jc0xvY2tlZE11dGV4KEZXTF9ITVVURVggaE11dGV4LCBGWF9CT09MJiBiTG9ja2VkKTsNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hTRU1BUEhPUkUgeyB2b2lkKiBwRGF0YTsgfSAqIEZXTF9IU0VNQVBIT1JFOw0KK0ZXTF9IU0VNQVBIT1JFIEZXTF9DcmVhdGVTZW1hcGhvcmUoKTsNCitGV0xfRVJSIEZXTF9EZXN0cm95U2VtYXBob3JlKEZXTF9IU0VNQVBIT1JFIGhTZW1hcGhvcmUpOw0KK0ZXTF9FUlIgRldMX1dhaXRTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSk7DQorRldMX0VSUiBGV0xfUG9zdFNlbWFwaG9yZShGV0xfSFNFTUFQSE9SRSBoU2VtYXBob3JlLCBpbnQzMl90IGRvd24gPSAxKTsNCitGV0xfRVJSIEZXTF9HZXRTZW1hcGhvcmVWYWx1ZShGV0xfSFNFTUFQSE9SRSBoU2VtYXBob3JlLCBpbnQzMl90JiB2YWx1ZSk7DQorRldMX0VSUiBGV0xfUmVzZXRTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSwgaW50MzJfdCBpbml0KTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGltZXIuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aW1lci5oCmluZGV4IGVhZTViZjQuLjRjOGI0NjYgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aW1lci5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aW1lci5oCkBAIC03LDE1ICs3LDE0IEBACiAjaWZuZGVmIF9GV0xfVElNRVJfSA0KICNkZWZpbmUgX0ZXTF9USU1FUl9IDQogY2xhc3MgSUZXTF9UaW1lcjsNCi10eXBlZGVmIHN0cnVjdCBfRldMX0hUSU1FUiB7DQotICAgIHZvaWQqIHBEYXRhOw0KLX0gKkZXTF9IVElNRVI7DQotY2xhc3MgSUZXTF9UaW1lcg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGV0xfVGltZXIoKSB7fQ0KLSAgICB2aXJ0dWFsIGludDMyX3QgUnVuKEZXTF9IVElNRVIgaFRpbWVyKSA9IDA7DQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9IVElNRVIgeyB2b2lkKiBwRGF0YTsgfSAqIEZXTF9IVElNRVI7DQorY2xhc3MgSUZXTF9UaW1lciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfVGltZXIoKSB7fQ0KKyAgdmlydHVhbCBpbnQzMl90IFJ1bihGV0xfSFRJTUVSIGhUaW1lcikgPSAwOw0KIH07DQotRldMX0hUSU1FUiBGV0xfU3RhcnRUaW1lcihJRldMX1RpbWVyICpwVGltZXIsIEZYX0RXT1JEIGR3RWxhcHNlLCBGWF9CT09MIGJJbW1lZGlhdGVseSA9IFRSVUUpOw0KK0ZXTF9IVElNRVIgRldMX1N0YXJ0VGltZXIoSUZXTF9UaW1lciogcFRpbWVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdFbGFwc2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbW1lZGlhdGVseSA9IFRSVUUpOw0KIGludDMyX3QgRldMX1N0b3BUaW1lcihGV0xfSFRJTUVSIGhUaW1lcik7DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3dpZGdldC5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3dpZGdldC5oCmluZGV4IDZjMzE2NGMuLjEwODA4YmMgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXQuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0LmgKQEAgLTE2LDExMSArMTYsMTExIEBACiBjbGFzcyBJRldMX1Byb3h5Ow0KIGNsYXNzIElGV0xfRm9ybTsNCiANCi1jbGFzcyBJRldMX0RhdGFQcm92aWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGV0xfRGF0YVByb3ZpZGVyKCkge30NCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKSA9IDA7DQorY2xhc3MgSUZXTF9EYXRhUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX0RhdGFQcm92aWRlcigpIHt9DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2FwdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pID0gMDsNCiB9Ow0KLWNsYXNzIElGV0xfV2lkZ2V0IDogcHVibGljIElGV0xfVGFyZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgRldMX0VSUgkJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCi0gICAgRldMX0VSUgkJCUdldEdsb2JhbFJlY3QoQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgRldMX0VSUgkJCVNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgRldMX0VSUgkJCUdldENsaWVudFJlY3QoQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgSUZXTF9XaWRnZXQqCUdldFBhcmVudCgpOw0KLSAgICBGV0xfRVJSCQkJU2V0UGFyZW50KElGV0xfV2lkZ2V0ICpwUGFyZW50KTsNCi0gICAgSUZXTF9XaWRnZXQqCUdldE93bmVyKCk7DQotICAgIEZXTF9FUlIJCQlTZXRPd25lcihJRldMX1dpZGdldCAqcE93bmVyKTsNCi0gICAgSUZXTF9XaWRnZXQqCUdldE91dGVyKCk7DQotICAgIEZYX0RXT1JECQlHZXRTdHlsZXMoKTsNCi0gICAgRldMX0VSUgkJCU1vZGlmeVN0eWxlcyhGWF9EV09SRCBkd1N0eWxlc0FkZGVkLCBGWF9EV09SRCBkd1N0eWxlc1JlbW92ZWQpOw0KLSAgICBGWF9EV09SRAkJR2V0U3R5bGVzRXgoKTsNCi0gICAgRldMX0VSUgkJCU1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KLSAgICBGWF9EV09SRAkJR2V0U3RhdGVzKCk7DQotICAgIEZXTF9FUlIJCQlTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KLSAgICBGV0xfRVJSCQkJU2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkLCB2b2lkKiBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spOw0KLSAgICB2b2lkKgkJR2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsNCi0gICAgRldMX0VSUgkJCVVwZGF0ZSgpOw0KLSAgICBGV0xfRVJSCQkJTG9ja1VwZGF0ZSgpOw0KLSAgICBGV0xfRVJSCQkJVW5sb2NrVXBkYXRlKCk7DQotICAgIEZYX0RXT1JECQlIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIEZXTF9FUlIJCQlUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpOw0KLSAgICBGV0xfRVJSCQkJVHJhbnNmb3JtVG8oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcnQpOw0KLSAgICBGV0xfRVJSCQkJR2V0TWF0cml4KENGWF9NYXRyaXggJm1hdHJpeCwgRlhfQk9PTCBiR2xvYmFsID0gRkFMU0UpOw0KLSAgICBGV0xfRVJSCQkJU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCk7DQotICAgIEZXTF9FUlIJCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIElGV0xfVGhlbWVQcm92aWRlcioJCUdldFRoZW1lUHJvdmlkZXIoKTsNCi0gICAgRldMX0VSUgkJCQkJU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZVByb3ZpZGVyKTsNCi0gICAgRldMX0VSUgkJCQkJU2V0RGF0YVByb3ZpZGVyKElGV0xfRGF0YVByb3ZpZGVyICpwRGF0YVByb3ZpZGVyKTsNCi0gICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSoJU2V0RGVsZWdhdGUoSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlKTsNCi0gICAgSUZXTF9Ob3RlVGhyZWFkKgkJR2V0T3duZXJUaHJlYWQoKSBjb25zdDsNCi0gICAgQ0ZYX1NpemVGCQkJCUdldE9mZnNldEZyb21QYXJlbnQoSUZXTF9XaWRnZXQgKnBQYXJlbnQpOw0KK2NsYXNzIElGV0xfV2lkZ2V0IDogcHVibGljIElGV0xfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgRldMX0VSUiBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICBGV0xfRVJSIEdldEdsb2JhbFJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIEZXTF9FUlIgU2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgRldMX0VSUiBHZXRDbGllbnRSZWN0KENGWF9SZWN0RiYgcmVjdCk7DQorICBJRldMX1dpZGdldCogR2V0UGFyZW50KCk7DQorICBGV0xfRVJSIFNldFBhcmVudChJRldMX1dpZGdldCogcFBhcmVudCk7DQorICBJRldMX1dpZGdldCogR2V0T3duZXIoKTsNCisgIEZXTF9FUlIgU2V0T3duZXIoSUZXTF9XaWRnZXQqIHBPd25lcik7DQorICBJRldMX1dpZGdldCogR2V0T3V0ZXIoKTsNCisgIEZYX0RXT1JEIEdldFN0eWxlcygpOw0KKyAgRldMX0VSUiBNb2RpZnlTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXNBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNSZW1vdmVkKTsNCisgIEZYX0RXT1JEIEdldFN0eWxlc0V4KCk7DQorICBGV0xfRVJSIE1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKyAgRlhfRFdPUkQgR2V0U3RhdGVzKCk7DQorICBGV0xfRVJSIFNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQorICBGV0xfRVJSIFNldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKTsNCisgIHZvaWQqIEdldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCk7DQorICBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgRldMX0VSUiBMb2NrVXBkYXRlKCk7DQorICBGV0xfRVJSIFVubG9ja1VwZGF0ZSgpOw0KKyAgRlhfRFdPUkQgSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgRldMX0VSUiBUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCogcFdpZGdldCwgRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpOw0KKyAgRldMX0VSUiBUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiBydCk7DQorICBGV0xfRVJSIEdldE1hdHJpeChDRlhfTWF0cml4JiBtYXRyaXgsIEZYX0JPT0wgYkdsb2JhbCA9IEZBTFNFKTsNCisgIEZXTF9FUlIgU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7DQorICBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIElGV0xfVGhlbWVQcm92aWRlciogR2V0VGhlbWVQcm92aWRlcigpOw0KKyAgRldMX0VSUiBTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lUHJvdmlkZXIpOw0KKyAgRldMX0VSUiBTZXREYXRhUHJvdmlkZXIoSUZXTF9EYXRhUHJvdmlkZXIqIHBEYXRhUHJvdmlkZXIpOw0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogU2V0RGVsZWdhdGUoSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlKTsNCisgIElGV0xfTm90ZVRocmVhZCogR2V0T3duZXJUaHJlYWQoKSBjb25zdDsNCisgIENGWF9TaXplRiBHZXRPZmZzZXRGcm9tUGFyZW50KElGV0xfV2lkZ2V0KiBwUGFyZW50KTsNCiB9Ow0KLWNsYXNzIElGV0xfV2lkZ2V0RGVsZWdhdGUNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JRldMX1dpZGdldERlbGVnYXRlKCkge30NCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCitjbGFzcyBJRldMX1dpZGdldERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZXTF9XaWRnZXREZWxlZ2F0ZSgpIHt9DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KIH07DQotY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzKCkNCi0gICAgew0KLSAgICAgICAgbV9jdG1PblBhcmVudC5SZXNldCgpOw0KLSAgICAgICAgbV9ydFdpZGdldC5TZXQoMCwgMCwgMCwgMCk7DQotICAgICAgICBtX2R3U3R5bGVzCQk9IEZXTF9XR1RTVFlMRV9DaGlsZDsNCi0gICAgICAgIG1fZHdTdHlsZUV4ZXMJPSAwOw0KLSAgICAgICAgbV9kd1N0YXRlcwkJPSAwOw0KLSAgICAgICAgbV9wVGhlbWVQcm92aWRlciA9IE5VTEw7DQotICAgICAgICBtX3BEYXRhUHJvdmlkZXIgPSBOVUxMOw0KLSAgICAgICAgbV9wUGFyZW50CQk9IE5VTEw7DQotICAgICAgICBtX3BPd25lcgkJPSBOVUxMOw0KLSAgICB9DQotICAgIENGWF9NYXRyaXgJCQkJCW1fY3RtT25QYXJlbnQ7DQotICAgIENGWF9SZWN0RgkJCQkJbV9ydFdpZGdldDsNCi0gICAgRlhfRFdPUkQJCQkJCW1fZHdTdHlsZXM7DQotICAgIEZYX0RXT1JECQkJCQltX2R3U3R5bGVFeGVzOw0KLSAgICBGWF9EV09SRAkJCQkJbV9kd1N0YXRlczsNCi0gICAgSUZXTF9UaGVtZVByb3ZpZGVyCQkgICAqbV9wVGhlbWVQcm92aWRlcjsNCi0gICAgSUZXTF9EYXRhUHJvdmlkZXIJCSAgICptX3BEYXRhUHJvdmlkZXI7DQotICAgIElGV0xfV2lkZ2V0CQkJCSAgICptX3BQYXJlbnQ7DQotICAgIElGV0xfV2lkZ2V0CQkJCSAgICptX3BPd25lcjsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgew0KKyBwdWJsaWM6DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMoKSB7DQorICAgIG1fY3RtT25QYXJlbnQuUmVzZXQoKTsNCisgICAgbV9ydFdpZGdldC5TZXQoMCwgMCwgMCwgMCk7DQorICAgIG1fZHdTdHlsZXMgPSBGV0xfV0dUU1RZTEVfQ2hpbGQ7DQorICAgIG1fZHdTdHlsZUV4ZXMgPSAwOw0KKyAgICBtX2R3U3RhdGVzID0gMDsNCisgICAgbV9wVGhlbWVQcm92aWRlciA9IE5VTEw7DQorICAgIG1fcERhdGFQcm92aWRlciA9IE5VTEw7DQorICAgIG1fcFBhcmVudCA9IE5VTEw7DQorICAgIG1fcE93bmVyID0gTlVMTDsNCisgIH0NCisgIENGWF9NYXRyaXggbV9jdG1PblBhcmVudDsNCisgIENGWF9SZWN0RiBtX3J0V2lkZ2V0Ow0KKyAgRlhfRFdPUkQgbV9kd1N0eWxlczsNCisgIEZYX0RXT1JEIG1fZHdTdHlsZUV4ZXM7DQorICBGWF9EV09SRCBtX2R3U3RhdGVzOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBtX3BUaGVtZVByb3ZpZGVyOw0KKyAgSUZXTF9EYXRhUHJvdmlkZXIqIG1fcERhdGFQcm92aWRlcjsNCisgIElGV0xfV2lkZ2V0KiBtX3BQYXJlbnQ7DQorICBJRldMX1dpZGdldCogbV9wT3duZXI7DQogfTsNCi1jbGFzcyBJRldMX0N1c3RvbSA6IHB1YmxpYyBJRldMX1dpZGdldA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRldMX0N1c3RvbSogQ3JlYXRlKCk7DQorY2xhc3MgSUZXTF9DdXN0b20gOiBwdWJsaWMgSUZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9DdXN0b20qIENyZWF0ZSgpOw0KIA0KLSAgICBGV0xfRVJSCQlJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgRldMX0VSUgkJU2V0UHJveHkoSUZXTF9Qcm94eSAqcFByb3h5KTsNCi1wcm90ZWN0ZWQ6DQotICAgIElGV0xfQ3VzdG9tKCk7DQotICAgIHZpcnR1YWwgfklGV0xfQ3VzdG9tKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBGV0xfRVJSIFNldFByb3h5KElGV0xfUHJveHkqIHBQcm94eSk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfQ3VzdG9tKCk7DQorICB2aXJ0dWFsIH5JRldMX0N1c3RvbSgpOw0KIH07DQotY2xhc3MgSUZXTF9Qcm94eQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGV0xfUHJveHkoKSB7fQ0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKSA9IDA7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJVXBkYXRlKCkgPSAwOw0KK2NsYXNzIElGV0xfUHJveHkgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX1Byb3h5KCkge30NCisgIHZpcnR1YWwgRldMX0VSUiBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZSgpID0gMDsNCiB9Ow0KLSNkZWZpbmUgRldMX0FDQ0VMX0NvbnRyb2wJKDFMIDw8IDApDQotI2RlZmluZSBGV0xfQUNDRUxfQWx0CQkoMUwgPDwgMSkNCi0jZGVmaW5lIEZXTF9BQ0NFTF9TaGlmdAkJKDFMIDw8IDIpDQotI2RlZmluZSBGV0xfQUNDRUxfVmlydEtleQkoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9BQ0NFTF9Db250cm9sICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0FDQ0VMX0FsdCAoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9BQ0NFTF9TaGlmdCAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9BQ0NFTF9WaXJ0S2V5ICgxTCA8PCAzKQ0KIHR5cGVkZWYgc3RydWN0IF9GV0xfQUNDRUwgew0KLSAgICBGWF9EV09SRCBkd0tleTsNCi0gICAgRlhfRFdPUkQgZHdDbWQ7DQorICBGWF9EV09SRCBkd0tleTsNCisgIEZYX0RXT1JEIGR3Q21kOw0KIH0gRldMX0FDQ0VMOw0KLXR5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlIDxGWF9EV09SRCwgRlhfRFdPUkQ+IENGWF9NYXBBY2NlbGVyYXRvcnM7DQotRldMX0VSUiBGV0xfQWNjZWxlcmF0b3JfU2V0QXBwKENGWF9NYXBBY2NlbGVyYXRvcnMgKnBNYXBBY2NlbCk7DQotRldMX0VSUiBGV0xfQWNjZWxlcmF0b3JfU2V0VGhyZWFkKENGWF9NYXBBY2NlbGVyYXRvcnMgKnBNYXBBY2NlbCk7DQotRldMX0VSUiBGV0xfQWNjZWxlcmF0b3JfU2V0Rm9ybShJRldMX0Zvcm0gKnBGcm9tLCBDRlhfTWFwQWNjZWxlcmF0b3JzICpwTWFwQWNjZWwpOw0KLUZXTF9FUlIgRldMX0VuYWJlbFdpZGdldChJRldMX1dpZGdldCAqd2lkZ2V0LCBGWF9CT09MIGJFbmFibGUpOw0KK3R5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBGWF9EV09SRD4gQ0ZYX01hcEFjY2VsZXJhdG9yczsNCitGV0xfRVJSIEZXTF9BY2NlbGVyYXRvcl9TZXRBcHAoQ0ZYX01hcEFjY2VsZXJhdG9ycyogcE1hcEFjY2VsKTsNCitGV0xfRVJSIEZXTF9BY2NlbGVyYXRvcl9TZXRUaHJlYWQoQ0ZYX01hcEFjY2VsZXJhdG9ycyogcE1hcEFjY2VsKTsNCitGV0xfRVJSIEZXTF9BY2NlbGVyYXRvcl9TZXRGb3JtKElGV0xfRm9ybSogcEZyb20sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWFwQWNjZWxlcmF0b3JzKiBwTWFwQWNjZWwpOw0KK0ZXTF9FUlIgRldMX0VuYWJlbFdpZGdldChJRldMX1dpZGdldCogd2lkZ2V0LCBGWF9CT09MIGJFbmFibGUpOw0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRkZWYuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRkZWYuaAppbmRleCAyN2MzYjU1Li4xY2RjYzM2IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0ZGVmLmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3dpZGdldGRlZi5oCkBAIC02LDI0MiArNiwyNDIgQEAKIA0KICNpZm5kZWYgX0ZXTF9XSURHRVRERUZfSA0KICNkZWZpbmUgX0ZXTF9XSURHRVRERUZfSA0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX092ZXJMYXBwZXIJCQkoMEwgPDwgMCkNCi0jZGVmaW5lIEZXTF9XR1RTVFlMRV9Qb3B1cAkJCQkoMUwgPDwgMCkNCi0jZGVmaW5lIEZXTF9XR1RTVFlMRV9DaGlsZAkJCQkoMkwgPDwgMCkNCi0jZGVmaW5lIEZXTF9XR1RTVFlMRV9Cb3JkZXIJCQkJKDFMIDw8IDIpDQotI2RlZmluZSBGV0xfV0dUU1RZTEVfQ2FwdGlvbgkJCSgxTCA8PCAzKQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX05hcnJvd0NhcHRpb24JCSgxTCA8PCA0KQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX0ljb24JCQkJKDFMIDw8IDUpDQotI2RlZmluZSBGV0xfV0dUU1RZTEVfTWluaW1pemVCb3gJCSgxTCA8PCA2KQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX01heGltaXplQm94CQkoMUwgPDwgNykNCi0jZGVmaW5lIEZXTF9XR1RTVFlMRV9DbG9zZUJveAkJCSgxTCA8PCA4KQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX0hTY3JvbGwJCQkoMUwgPDwgOSkNCi0jZGVmaW5lIEZXTF9XR1RTVFlMRV9WU2Nyb2xsCQkJKDFMIDw8IDExKQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX0xlZnRTY3JvbGxiYXIJCSgxTCA8PCAxMikNCi0jZGVmaW5lIEZXTF9XR1RTVFlMRV9MZWZ0QWxpZ25tZW50CQkoMEwgPDwgMTMpDQotI2RlZmluZSBGV0xfV0dUU1RZTEVfQ2VudGVyQWxpZ25tZW50CSgxTCA8PCAxMykNCi0jZGVmaW5lIEZXTF9XR1RTVFlMRV9SaWdodEFsaWdubWVudAkJKDJMIDw8IDEzKQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX1RvcEFsaWdubWVudAkJKDBMIDw8IDE1KQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX1ZDZW50ZXJBbGlnbm1lbnQJKDFMIDw8IDE1KQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX0JvdHRvbUFsaWdubWVudAkoMkwgPDwgMTUpDQotI2RlZmluZSBGV0xfV0dUU1RZTEVfUlRMUmVhZGluZwkJCSgxTCA8PCAxNykNCi0jZGVmaW5lIEZXTF9XR1RTVFlMRV9SVExMYXlvdXQJCQkoMUwgPDwgMTgpDQotI2RlZmluZSBGV0xfV0dUU1RZTEVfRWRnZU5vbmUJCQkoMEwgPDwgMTkpDQotI2RlZmluZSBGV0xfV0dUU1RZTEVfRWRnZUZsYXQJCQkoMUwgPDwgMTkpDQotI2RlZmluZSBGV0xfV0dUU1RZTEVfRWRnZVJhaXNlZAkJCSgyTCA8PCAxOSkNCi0jZGVmaW5lIEZXTF9XR1RTVFlMRV9FZGdlU3Vua2VuCQkJKDNMIDw8IDE5KQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX0VkZ2VNYXNrCQkJKDNMIDw8IDE5KQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX1NoYWRvdwkJCQkoM0wgPDwgMjEpDQotI2RlZmluZSBGV0xfV0dUU1RZTEVfR3JvdXAJCQkJKDFMIDw8IDIyKQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX1RhYlN0b3AJCQkoMUwgPDwgMjMpDQotI2RlZmluZSBGV0xfV0dUU1RZTEVfT2Zmc2NyZWVuCQkJKDFMIDw8IDI0KQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX0RyYWdBY2NlcHRGaWxlcwkoMUwgPDwgMjUpDQotI2RlZmluZQlGV0xfV0dUU1RZTEVfVG9wTW9zdAkJCSgxTCA8PCAyNikNCi0jZGVmaW5lCUZXTF9XR1RTVFlMRV9UcmFuc1BhcmVudAkJKDFMIDw8IDI3KQ0KLSNkZWZpbmUJRldMX1dHVFNUWUxFX05vQmFja2dyb3VuZAkJKDFMIDw8IDI4KQ0KLSNkZWZpbmUgRldMX1dHVFNUWUxFX1dpbmRvd1R5cGVNYXNrCQkoM0wgPDwgMCkNCi0jZGVmaW5lIEZXTF9XR1RTVEFURV9SZXN0b3JlZAkJCSgwTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1dHVFNUQVRFX01pbmltaXplZAkJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1dHVFNUQVRFX01heGltaXplZAkJCSgyTCA8PCAwKQ0KLSNkZWZpbmUgRldMX1dHVFNUQVRFX0Rpc2FibGVkCQkJKDFMIDw8IDIpDQotI2RlZmluZSBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQJCSgxTCA8PCAzKQ0KLSNkZWZpbmUgRldMX1dHVFNUQVRFX0ZvY3VzZWQJCQkoMUwgPDwgNCkNCi0jZGVmaW5lIEZXTF9XR1RTVEFURV9JbnZpc2libGUJCQkoMUwgPDwgNSkNCi0jZGVmaW5lIEZXTF9XR1RTVEFURV9NQVgJCQkJKDYpDQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9Vbmtub3duCQkJMA0KLSNkZWZpbmUgRldMX1dHVEhJVFRFU1RfQ2xpZW50CQkJMQ0KLSNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTGVmdAkJCQkyDQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9Ub3AJCQkJMw0KLSNkZWZpbmUgRldMX1dHVEhJVFRFU1RfUmlnaHQJCQk0DQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9Cb3R0b20JCQk1DQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9MZWZ0VG9wCQkJNg0KLSNkZWZpbmUgRldMX1dHVEhJVFRFU1RfUmlnaHRUb3AJCQk3DQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9MZWZ0Qm90dG9tCQk4DQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9SaWdodEJvdHRvbQkJOQ0KLSNkZWZpbmUgRldMX1dHVEhJVFRFU1RfSWNvbgkJCQkxMA0KLSNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVGl0bGViYXIJCQkxMQ0KLSNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTWluQm94CQkJMTINCi0jZGVmaW5lIEZXTF9XR1RISVRURVNUX01heEJveAkJCTEzDQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9DbG9zZUJveAkJCTE0DQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9IU2Nyb2xsQmFyCQkxNQ0KLSNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVlNjcm9sbEJhcgkJMTYNCi0jZGVmaW5lIEZXTF9XR1RISVRURVNUX0JvcmRlcgkJCTE3DQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9FZGdlCQkJCTE4DQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9FZGl0CQkJCTE5DQotI2RlZmluZSBGV0xfV0dUSElUVEVTVF9UcmFuc3BhcmVudAkJMjANCi0jZGVmaW5lIEZXTF9XR1RISVRURVNUX01BWAkJCQkyMQ0KLSNkZWZpbmUgRldMX1ZLRVlfTEJ1dHRvbgkJMHgwMQ0KLSNkZWZpbmUgRldMX1ZLRVlfUkJ1dHRvbgkJMHgwMg0KLSNkZWZpbmUgRldMX1ZLRVlfTUJ1dHRvbgkJMHgwNA0KLSNkZWZpbmUgRldMX1ZLRVlfQmFjayAgICAgICAgICAgMHgwOA0KLSNkZWZpbmUgRldMX1ZLRVlfVGFiICAgICAgICAgICAgMHgwOQ0KLSNkZWZpbmUgRldMX1ZLRVlfQ2xlYXIgICAgICAgICAgMHgwQw0KLSNkZWZpbmUgRldMX1ZLRVlfUmV0dXJuCQkJMHgwRA0KLSNkZWZpbmUgRldMX1ZLRVlfU2hpZnQJCQkweDEwDQotI2RlZmluZSBGV0xfVktFWV9Db250cm9sCQkweDExDQotI2RlZmluZSBGV0xfVktFWV9NZW51CQkJMHgxMg0KLSNkZWZpbmUgRldMX1ZLRVlfUGF1c2UJCQkweDEzDQotI2RlZmluZSBGV0xfVktFWV9DYXBpdGFsCQkweDE0DQotI2RlZmluZSBGV0xfVktFWV9LYW5hCQkJMHgxNQ0KLSNkZWZpbmUgRldMX1ZLRVlfSGFuZ3VsCQkJMHgxNQ0KLSNkZWZpbmUgRldMX1ZLRVlfSnVuamEJCQkweDE3DQotI2RlZmluZSBGV0xfVktFWV9GaW5hbAkJCTB4MTgNCi0jZGVmaW5lIEZXTF9WS0VZX0hhbmphCQkJMHgxOQ0KLSNkZWZpbmUgRldMX1ZLRVlfS2FuamkJCQkweDE5DQotI2RlZmluZSBGV0xfVktFWV9Fc2NhcGUJCQkweDFCDQotI2RlZmluZSBGV0xfVktFWV9Db252ZXJ0CQkweDFDDQotI2RlZmluZSBGV0xfVktFWV9Ob25Db252ZXJ0CQkweDFEDQotI2RlZmluZSBGV0xfVktFWV9BY2NlcHQJCQkweDFFDQotI2RlZmluZSBGV0xfVktFWV9Nb2RlQ2hhbmdlCQkweDFGDQotI2RlZmluZSBGV0xfVktFWV9TcGFjZSAgICAgICAgICAweDIwDQotI2RlZmluZSBGV0xfVktFWV9QcmlvciAgICAgICAgICAweDIxDQotI2RlZmluZSBGV0xfVktFWV9OZXh0ICAgICAgICAgICAweDIyDQotI2RlZmluZSBGV0xfVktFWV9FbmQgICAgICAgICAgICAweDIzDQotI2RlZmluZSBGV0xfVktFWV9Ib21lICAgICAgICAgICAweDI0DQotI2RlZmluZSBGV0xfVktFWV9MZWZ0ICAgICAgICAgICAweDI1DQotI2RlZmluZSBGV0xfVktFWV9VcCAgICAgICAgICAgICAweDI2DQotI2RlZmluZSBGV0xfVktFWV9SaWdodCAgICAgICAgICAweDI3DQotI2RlZmluZSBGV0xfVktFWV9Eb3duICAgICAgICAgICAweDI4DQotI2RlZmluZSBGV0xfVktFWV9TZWxlY3QgICAgICAgICAweDI5DQotI2RlZmluZSBGV0xfVktFWV9QcmludCAgICAgICAgICAweDJBDQotI2RlZmluZSBGV0xfVktFWV9FeGVjdXRlICAgICAgICAweDJCDQotI2RlZmluZSBGV0xfVktFWV9TbmFwc2hvdCAgICAgICAweDJDDQotI2RlZmluZSBGV0xfVktFWV9JbnNlcnQgICAgICAgICAweDJEDQotI2RlZmluZSBGV0xfVktFWV9EZWxldGUgICAgICAgICAweDJFDQotI2RlZmluZSBGV0xfVktFWV9IZWxwICAgICAgICAgICAweDJGDQotI2RlZmluZSBGV0xfVktFWV8wCQkJCTB4MzANCi0jZGVmaW5lIEZXTF9WS0VZXzEJCQkJMHgzMQ0KLSNkZWZpbmUgRldMX1ZLRVlfMgkJCQkweDMyDQotI2RlZmluZSBGV0xfVktFWV8zCQkJCTB4MzMNCi0jZGVmaW5lIEZXTF9WS0VZXzQJCQkJMHgzNA0KLSNkZWZpbmUgRldMX1ZLRVlfNQkJCQkweDM1DQotI2RlZmluZSBGV0xfVktFWV82CQkJCTB4MzYNCi0jZGVmaW5lIEZXTF9WS0VZXzcJCQkJMHgzNw0KLSNkZWZpbmUgRldMX1ZLRVlfOAkJCQkweDM4DQotI2RlZmluZSBGV0xfVktFWV85CQkJCTB4MzkNCi0jZGVmaW5lIEZXTF9WS0VZX0EJCQkJMHg0MQ0KLSNkZWZpbmUgRldMX1ZLRVlfQgkJCQkweDQyDQotI2RlZmluZSBGV0xfVktFWV9DCQkJCTB4NDMNCi0jZGVmaW5lIEZXTF9WS0VZX0QJCQkJMHg0NA0KLSNkZWZpbmUgRldMX1ZLRVlfRQkJCQkweDQ1DQotI2RlZmluZSBGV0xfVktFWV9GCQkJCTB4NDYNCi0jZGVmaW5lIEZXTF9WS0VZX0cJCQkJMHg0Nw0KLSNkZWZpbmUgRldMX1ZLRVlfSAkJCQkweDQ4DQotI2RlZmluZSBGV0xfVktFWV9JCQkJCTB4NDkNCi0jZGVmaW5lIEZXTF9WS0VZX0oJCQkJMHg0QQ0KLSNkZWZpbmUgRldMX1ZLRVlfSwkJCQkweDRCDQotI2RlZmluZSBGV0xfVktFWV9MCQkJCTB4NEMNCi0jZGVmaW5lIEZXTF9WS0VZX00JCQkJMHg0RA0KLSNkZWZpbmUgRldMX1ZLRVlfTgkJCQkweDRFDQotI2RlZmluZSBGV0xfVktFWV9PCQkJCTB4NEYNCi0jZGVmaW5lIEZXTF9WS0VZX1AJCQkJMHg1MA0KLSNkZWZpbmUgRldMX1ZLRVlfUQkJCQkweDUxDQotI2RlZmluZSBGV0xfVktFWV9SCQkJCTB4NTINCi0jZGVmaW5lIEZXTF9WS0VZX1MJCQkJMHg1Mw0KLSNkZWZpbmUgRldMX1ZLRVlfVAkJCQkweDU0DQotI2RlZmluZSBGV0xfVktFWV9VCQkJCTB4NTUNCi0jZGVmaW5lIEZXTF9WS0VZX1YJCQkJMHg1Ng0KLSNkZWZpbmUgRldMX1ZLRVlfVwkJCQkweDU3DQotI2RlZmluZSBGV0xfVktFWV9YCQkJCTB4NTgNCi0jZGVmaW5lIEZXTF9WS0VZX1kJCQkJMHg1OQ0KLSNkZWZpbmUgRldMX1ZLRVlfWgkJCQkweDVBDQotI2RlZmluZSBGV0xfVktFWV9MV2luCQkJMHg1Qg0KLSNkZWZpbmUgRldMX1ZLRVlfQ29tbWFuZAkJMHg1Qg0KLSNkZWZpbmUgRldMX1ZLRVlfUldpbgkJCTB4NUMNCi0jZGVmaW5lIEZXTF9WS0VZX0FwcHMJCQkweDVEDQotI2RlZmluZSBGV0xfVktFWV9TbGVlcAkJCTB4NUYNCi0jZGVmaW5lIEZXTF9WS0VZX051bVBhZDAJCTB4NjANCi0jZGVmaW5lIEZXTF9WS0VZX051bVBhZDEJCTB4NjENCi0jZGVmaW5lIEZXTF9WS0VZX051bVBhZDIJCTB4NjINCi0jZGVmaW5lIEZXTF9WS0VZX051bVBhZDMJCTB4NjMNCi0jZGVmaW5lIEZXTF9WS0VZX051bVBhZDQJCTB4NjQNCi0jZGVmaW5lIEZXTF9WS0VZX051bVBhZDUJCTB4NjUNCi0jZGVmaW5lIEZXTF9WS0VZX051bVBhZDYJCTB4NjYNCi0jZGVmaW5lIEZXTF9WS0VZX051bVBhZDcJCTB4NjcNCi0jZGVmaW5lIEZXTF9WS0VZX051bVBhZDgJCTB4NjgNCi0jZGVmaW5lIEZXTF9WS0VZX051bVBhZDkJCTB4NjkNCi0jZGVmaW5lIEZXTF9WS0VZX011bHRpcGx5CQkweDZBDQotI2RlZmluZSBGV0xfVktFWV9BZGQJCQkweDZCDQotI2RlZmluZSBGV0xfVktFWV9TZXBhcmF0b3IJCTB4NkMNCi0jZGVmaW5lIEZXTF9WS0VZX1N1YnRyYWN0CQkweDZEDQotI2RlZmluZSBGV0xfVktFWV9EZWNpbWFsCQkweDZFDQotI2RlZmluZSBGV0xfVktFWV9EaXZpZGUJCQkweDZGDQotI2RlZmluZSBGV0xfVktFWV9GMSAgICAgICAgICAgICAweDcwDQotI2RlZmluZSBGV0xfVktFWV9GMiAgICAgICAgICAgICAweDcxDQotI2RlZmluZSBGV0xfVktFWV9GMyAgICAgICAgICAgICAweDcyDQotI2RlZmluZSBGV0xfVktFWV9GNCAgICAgICAgICAgICAweDczDQotI2RlZmluZSBGV0xfVktFWV9GNSAgICAgICAgICAgICAweDc0DQotI2RlZmluZSBGV0xfVktFWV9GNiAgICAgICAgICAgICAweDc1DQotI2RlZmluZSBGV0xfVktFWV9GNyAgICAgICAgICAgICAweDc2DQotI2RlZmluZSBGV0xfVktFWV9GOCAgICAgICAgICAgICAweDc3DQotI2RlZmluZSBGV0xfVktFWV9GOSAgICAgICAgICAgICAweDc4DQotI2RlZmluZSBGV0xfVktFWV9GMTAgICAgICAgICAgICAweDc5DQotI2RlZmluZSBGV0xfVktFWV9GMTEgICAgICAgICAgICAweDdBDQotI2RlZmluZSBGV0xfVktFWV9GMTIgICAgICAgICAgICAweDdCDQotI2RlZmluZSBGV0xfVktFWV9GMTMgICAgICAgICAgICAweDdDDQotI2RlZmluZSBGV0xfVktFWV9GMTQgICAgICAgICAgICAweDdEDQotI2RlZmluZSBGV0xfVktFWV9GMTUgICAgICAgICAgICAweDdFDQotI2RlZmluZSBGV0xfVktFWV9GMTYgICAgICAgICAgICAweDdGDQotI2RlZmluZSBGV0xfVktFWV9GMTcgICAgICAgICAgICAweDgwDQotI2RlZmluZSBGV0xfVktFWV9GMTggICAgICAgICAgICAweDgxDQotI2RlZmluZSBGV0xfVktFWV9GMTkgICAgICAgICAgICAweDgyDQotI2RlZmluZSBGV0xfVktFWV9GMjAgICAgICAgICAgICAweDgzDQotI2RlZmluZSBGV0xfVktFWV9GMjEgICAgICAgICAgICAweDg0DQotI2RlZmluZSBGV0xfVktFWV9GMjIgICAgICAgICAgICAweDg1DQotI2RlZmluZSBGV0xfVktFWV9GMjMgICAgICAgICAgICAweDg2DQotI2RlZmluZSBGV0xfVktFWV9GMjQgICAgICAgICAgICAweDg3DQotI2RlZmluZSBGV0xfVktFWV9OdW5Mb2NrCQkweDkwDQotI2RlZmluZSBGV0xfVktFWV9TY3JvbGwJCQkweDkxDQotI2RlZmluZSBGV0xfVktFWV9MU2hpZnQJCQkweEEwDQotI2RlZmluZSBGV0xfVktFWV9SU2hpZnQJCQkweEExDQotI2RlZmluZSBGV0xfVktFWV9MQ29udHJvbAkJMHhBMg0KLSNkZWZpbmUgRldMX1ZLRVlfUkNvbnRyb2wJCTB4QTMNCi0jZGVmaW5lIEZXTF9WS0VZX0xNZW51CQkJMHhBNA0KLSNkZWZpbmUgRldMX1ZLRVlfUk1lbnUJCQkweEE1DQotI2RlZmluZSBGV0xfVktFWV9CUk9XU0VSX0JhY2sJCQkweEE2DQotI2RlZmluZSBGV0xfVktFWV9CUk9XU0VSX0ZvcndhcmQJCTB4QTcNCi0jZGVmaW5lIEZXTF9WS0VZX0JST1dTRVJfUmVmcmVzaAkJMHhBOA0KLSNkZWZpbmUgRldMX1ZLRVlfQlJPV1NFUl9TdG9wCQkJMHhBOQ0KLSNkZWZpbmUgRldMX1ZLRVlfQlJPV1NFUl9TZWFyY2gJCQkweEFBDQotI2RlZmluZSBGV0xfVktFWV9CUk9XU0VSX0Zhdm9yaXRlcwkJMHhBQg0KLSNkZWZpbmUgRldMX1ZLRVlfQlJPV1NFUl9Ib21lCQkJMHhBQw0KLSNkZWZpbmUgRldMX1ZLRVlfVk9MVU1FX011dGUJCQkweEFEDQotI2RlZmluZSBGV0xfVktFWV9WT0xVTUVfRG93bgkJCTB4QUUNCi0jZGVmaW5lIEZXTF9WS0VZX1ZPTFVNRV9VcAkJCQkweEFGDQotI2RlZmluZSBGV0xfVktFWV9NRURJQV9ORVhUX1RyYWNrCQkweEIwDQotI2RlZmluZSBGV0xfVktFWV9NRURJQV9QUkVWX1RyYWNrCQkweEIxDQotI2RlZmluZSBGV0xfVktFWV9NRURJQV9TdG9wCQkJCTB4QjINCi0jZGVmaW5lIEZXTF9WS0VZX01FRElBX1BMQVlfUGF1c2UJCTB4QjMNCi0jZGVmaW5lIEZXTF9WS0VZX01FRElBX0xBVU5DSF9NYWlsCQkweEI0DQotI2RlZmluZSBGV0xfVktFWV9NRURJQV9MQVVOQ0hfTUVESUFfU2VsZWN0CQkweEI1DQotI2RlZmluZSBGV0xfVktFWV9NRURJQV9MQVVOQ0hfQVBQMQkJCQkweEI2DQotI2RlZmluZSBGV0xfVktFWV9NRURJQV9MQVVOQ0hfQVBQMgkJCQkweEI3DQotI2RlZmluZSBGV0xfVktFWV9PRU1fMQkJCQkJMHhCQQ0KLSNkZWZpbmUgRldMX1ZLRVlfT0VNX1BsdXMJCQkJMHhCQg0KLSNkZWZpbmUgRldMX1ZLRVlfT0VNX0NvbW1hCQkJCTB4QkMNCi0jZGVmaW5lIEZXTF9WS0VZX09FTV9NaW51cwkJCQkweEJEDQotI2RlZmluZSBGV0xfVktFWV9PRU1fUGVyaW9kCQkJCTB4QkUNCi0jZGVmaW5lIEZXTF9WS0VZX09FTV8yCQkJMHhCRg0KLSNkZWZpbmUgRldMX1ZLRVlfT0VNXzMJCQkweEMwDQotI2RlZmluZSBGV0xfVktFWV9PRU1fNAkJCTB4REINCi0jZGVmaW5lIEZXTF9WS0VZX09FTV81CQkJMHhEQw0KLSNkZWZpbmUgRldMX1ZLRVlfT0VNXzYJCQkweEREDQotI2RlZmluZSBGV0xfVktFWV9PRU1fNwkJCTB4REUNCi0jZGVmaW5lIEZXTF9WS0VZX09FTV84CQkJMHhERg0KLSNkZWZpbmUgRldMX1ZLRVlfT0VNXzEwMgkJMHhFMg0KLSNkZWZpbmUgRldMX1ZLRVlfUHJvY2Vzc0tleSAgICAgMHhFNQ0KLSNkZWZpbmUgRldMX1ZLRVlfUGFja2V0CQkJMHhFNw0KLSNkZWZpbmUgRldMX1ZLRVlfQXR0bgkJCTB4RjYNCi0jZGVmaW5lIEZXTF9WS0VZX0Nyc2VsCQkJMHhGNw0KLSNkZWZpbmUgRldMX1ZLRVlfRXhzZWwJCQkweEY4DQotI2RlZmluZSBGV0xfVktFWV9FcmVvZgkJCTB4RjkNCi0jZGVmaW5lIEZXTF9WS0VZX1BsYXkJCQkweEZBDQotI2RlZmluZSBGV0xfVktFWV9ab29tCQkJMHhGQg0KLSNkZWZpbmUgRldMX1ZLRVlfTm9OYW1lCQkJMHhGQw0KLSNkZWZpbmUgRldMX1ZLRVlfUEExCQkJMHhGRA0KLSNkZWZpbmUgRldMX1ZLRVlfT0VNX0NsZWFyCQkweEZFDQotI2RlZmluZSBGV0xfVktFWV9Vbmtub3duCQkwDQotI2RlZmluZSBGV0xfVktFWVNUQVRFX1RvZ2dsZWQJMHgwMDAxDQotI2RlZmluZSBGV0xfVktFWVNUQVRFX0Rvd24JCTB4MDEwMA0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX092ZXJMYXBwZXIgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfUG9wdXAgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfQ2hpbGQgKDJMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfQm9yZGVyICgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0NhcHRpb24gKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfTmFycm93Q2FwdGlvbiAoMUwgPDwgNCkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9JY29uICgxTCA8PCA1KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX01pbmltaXplQm94ICgxTCA8PCA2KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX01heGltaXplQm94ICgxTCA8PCA3KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0Nsb3NlQm94ICgxTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0hTY3JvbGwgKDFMIDw8IDkpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfVlNjcm9sbCAoMUwgPDwgMTEpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfTGVmdFNjcm9sbGJhciAoMUwgPDwgMTIpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfTGVmdEFsaWdubWVudCAoMEwgPDwgMTMpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfQ2VudGVyQWxpZ25tZW50ICgxTCA8PCAxMykNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9SaWdodEFsaWdubWVudCAoMkwgPDwgMTMpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfVG9wQWxpZ25tZW50ICgwTCA8PCAxNSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9WQ2VudGVyQWxpZ25tZW50ICgxTCA8PCAxNSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9Cb3R0b21BbGlnbm1lbnQgKDJMIDw8IDE1KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX1JUTFJlYWRpbmcgKDFMIDw8IDE3KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX1JUTExheW91dCAoMUwgPDwgMTgpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfRWRnZU5vbmUgKDBMIDw8IDE5KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0VkZ2VGbGF0ICgxTCA8PCAxOSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9FZGdlUmFpc2VkICgyTCA8PCAxOSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9FZGdlU3Vua2VuICgzTCA8PCAxOSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9FZGdlTWFzayAoM0wgPDwgMTkpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfU2hhZG93ICgzTCA8PCAyMSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9Hcm91cCAoMUwgPDwgMjIpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfVGFiU3RvcCAoMUwgPDwgMjMpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfT2Zmc2NyZWVuICgxTCA8PCAyNCkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9EcmFnQWNjZXB0RmlsZXMgKDFMIDw8IDI1KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX1RvcE1vc3QgKDFMIDw8IDI2KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX1RyYW5zUGFyZW50ICgxTCA8PCAyNykNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9Ob0JhY2tncm91bmQgKDFMIDw8IDI4KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX1dpbmRvd1R5cGVNYXNrICgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1dHVFNUQVRFX1Jlc3RvcmVkICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1dHVFNUQVRFX01pbmltaXplZCAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9XR1RTVEFURV9NYXhpbWl6ZWQgKDJMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUU1RBVEVfRGlzYWJsZWQgKDFMIDw8IDIpDQorI2RlZmluZSBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQgKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfV0dUU1RBVEVfRm9jdXNlZCAoMUwgPDwgNCkNCisjZGVmaW5lIEZXTF9XR1RTVEFURV9JbnZpc2libGUgKDFMIDw8IDUpDQorI2RlZmluZSBGV0xfV0dUU1RBVEVfTUFYICg2KQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVW5rbm93biAwDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9DbGllbnQgMQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTGVmdCAyDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9Ub3AgMw0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfUmlnaHQgNA0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfQm90dG9tIDUNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0xlZnRUb3AgNg0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfUmlnaHRUb3AgNw0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTGVmdEJvdHRvbSA4DQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9SaWdodEJvdHRvbSA5DQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9JY29uIDEwDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9UaXRsZWJhciAxMQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTWluQm94IDEyDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9NYXhCb3ggMTMNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0Nsb3NlQm94IDE0DQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9IU2Nyb2xsQmFyIDE1DQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9WU2Nyb2xsQmFyIDE2DQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9Cb3JkZXIgMTcNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0VkZ2UgMTgNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0VkaXQgMTkNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1RyYW5zcGFyZW50IDIwDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9NQVggMjENCisjZGVmaW5lIEZXTF9WS0VZX0xCdXR0b24gMHgwMQ0KKyNkZWZpbmUgRldMX1ZLRVlfUkJ1dHRvbiAweDAyDQorI2RlZmluZSBGV0xfVktFWV9NQnV0dG9uIDB4MDQNCisjZGVmaW5lIEZXTF9WS0VZX0JhY2sgMHgwOA0KKyNkZWZpbmUgRldMX1ZLRVlfVGFiIDB4MDkNCisjZGVmaW5lIEZXTF9WS0VZX0NsZWFyIDB4MEMNCisjZGVmaW5lIEZXTF9WS0VZX1JldHVybiAweDBEDQorI2RlZmluZSBGV0xfVktFWV9TaGlmdCAweDEwDQorI2RlZmluZSBGV0xfVktFWV9Db250cm9sIDB4MTENCisjZGVmaW5lIEZXTF9WS0VZX01lbnUgMHgxMg0KKyNkZWZpbmUgRldMX1ZLRVlfUGF1c2UgMHgxMw0KKyNkZWZpbmUgRldMX1ZLRVlfQ2FwaXRhbCAweDE0DQorI2RlZmluZSBGV0xfVktFWV9LYW5hIDB4MTUNCisjZGVmaW5lIEZXTF9WS0VZX0hhbmd1bCAweDE1DQorI2RlZmluZSBGV0xfVktFWV9KdW5qYSAweDE3DQorI2RlZmluZSBGV0xfVktFWV9GaW5hbCAweDE4DQorI2RlZmluZSBGV0xfVktFWV9IYW5qYSAweDE5DQorI2RlZmluZSBGV0xfVktFWV9LYW5qaSAweDE5DQorI2RlZmluZSBGV0xfVktFWV9Fc2NhcGUgMHgxQg0KKyNkZWZpbmUgRldMX1ZLRVlfQ29udmVydCAweDFDDQorI2RlZmluZSBGV0xfVktFWV9Ob25Db252ZXJ0IDB4MUQNCisjZGVmaW5lIEZXTF9WS0VZX0FjY2VwdCAweDFFDQorI2RlZmluZSBGV0xfVktFWV9Nb2RlQ2hhbmdlIDB4MUYNCisjZGVmaW5lIEZXTF9WS0VZX1NwYWNlIDB4MjANCisjZGVmaW5lIEZXTF9WS0VZX1ByaW9yIDB4MjENCisjZGVmaW5lIEZXTF9WS0VZX05leHQgMHgyMg0KKyNkZWZpbmUgRldMX1ZLRVlfRW5kIDB4MjMNCisjZGVmaW5lIEZXTF9WS0VZX0hvbWUgMHgyNA0KKyNkZWZpbmUgRldMX1ZLRVlfTGVmdCAweDI1DQorI2RlZmluZSBGV0xfVktFWV9VcCAweDI2DQorI2RlZmluZSBGV0xfVktFWV9SaWdodCAweDI3DQorI2RlZmluZSBGV0xfVktFWV9Eb3duIDB4MjgNCisjZGVmaW5lIEZXTF9WS0VZX1NlbGVjdCAweDI5DQorI2RlZmluZSBGV0xfVktFWV9QcmludCAweDJBDQorI2RlZmluZSBGV0xfVktFWV9FeGVjdXRlIDB4MkINCisjZGVmaW5lIEZXTF9WS0VZX1NuYXBzaG90IDB4MkMNCisjZGVmaW5lIEZXTF9WS0VZX0luc2VydCAweDJEDQorI2RlZmluZSBGV0xfVktFWV9EZWxldGUgMHgyRQ0KKyNkZWZpbmUgRldMX1ZLRVlfSGVscCAweDJGDQorI2RlZmluZSBGV0xfVktFWV8wIDB4MzANCisjZGVmaW5lIEZXTF9WS0VZXzEgMHgzMQ0KKyNkZWZpbmUgRldMX1ZLRVlfMiAweDMyDQorI2RlZmluZSBGV0xfVktFWV8zIDB4MzMNCisjZGVmaW5lIEZXTF9WS0VZXzQgMHgzNA0KKyNkZWZpbmUgRldMX1ZLRVlfNSAweDM1DQorI2RlZmluZSBGV0xfVktFWV82IDB4MzYNCisjZGVmaW5lIEZXTF9WS0VZXzcgMHgzNw0KKyNkZWZpbmUgRldMX1ZLRVlfOCAweDM4DQorI2RlZmluZSBGV0xfVktFWV85IDB4MzkNCisjZGVmaW5lIEZXTF9WS0VZX0EgMHg0MQ0KKyNkZWZpbmUgRldMX1ZLRVlfQiAweDQyDQorI2RlZmluZSBGV0xfVktFWV9DIDB4NDMNCisjZGVmaW5lIEZXTF9WS0VZX0QgMHg0NA0KKyNkZWZpbmUgRldMX1ZLRVlfRSAweDQ1DQorI2RlZmluZSBGV0xfVktFWV9GIDB4NDYNCisjZGVmaW5lIEZXTF9WS0VZX0cgMHg0Nw0KKyNkZWZpbmUgRldMX1ZLRVlfSCAweDQ4DQorI2RlZmluZSBGV0xfVktFWV9JIDB4NDkNCisjZGVmaW5lIEZXTF9WS0VZX0ogMHg0QQ0KKyNkZWZpbmUgRldMX1ZLRVlfSyAweDRCDQorI2RlZmluZSBGV0xfVktFWV9MIDB4NEMNCisjZGVmaW5lIEZXTF9WS0VZX00gMHg0RA0KKyNkZWZpbmUgRldMX1ZLRVlfTiAweDRFDQorI2RlZmluZSBGV0xfVktFWV9PIDB4NEYNCisjZGVmaW5lIEZXTF9WS0VZX1AgMHg1MA0KKyNkZWZpbmUgRldMX1ZLRVlfUSAweDUxDQorI2RlZmluZSBGV0xfVktFWV9SIDB4NTINCisjZGVmaW5lIEZXTF9WS0VZX1MgMHg1Mw0KKyNkZWZpbmUgRldMX1ZLRVlfVCAweDU0DQorI2RlZmluZSBGV0xfVktFWV9VIDB4NTUNCisjZGVmaW5lIEZXTF9WS0VZX1YgMHg1Ng0KKyNkZWZpbmUgRldMX1ZLRVlfVyAweDU3DQorI2RlZmluZSBGV0xfVktFWV9YIDB4NTgNCisjZGVmaW5lIEZXTF9WS0VZX1kgMHg1OQ0KKyNkZWZpbmUgRldMX1ZLRVlfWiAweDVBDQorI2RlZmluZSBGV0xfVktFWV9MV2luIDB4NUINCisjZGVmaW5lIEZXTF9WS0VZX0NvbW1hbmQgMHg1Qg0KKyNkZWZpbmUgRldMX1ZLRVlfUldpbiAweDVDDQorI2RlZmluZSBGV0xfVktFWV9BcHBzIDB4NUQNCisjZGVmaW5lIEZXTF9WS0VZX1NsZWVwIDB4NUYNCisjZGVmaW5lIEZXTF9WS0VZX051bVBhZDAgMHg2MA0KKyNkZWZpbmUgRldMX1ZLRVlfTnVtUGFkMSAweDYxDQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQyIDB4NjINCisjZGVmaW5lIEZXTF9WS0VZX051bVBhZDMgMHg2Mw0KKyNkZWZpbmUgRldMX1ZLRVlfTnVtUGFkNCAweDY0DQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQ1IDB4NjUNCisjZGVmaW5lIEZXTF9WS0VZX051bVBhZDYgMHg2Ng0KKyNkZWZpbmUgRldMX1ZLRVlfTnVtUGFkNyAweDY3DQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQ4IDB4NjgNCisjZGVmaW5lIEZXTF9WS0VZX051bVBhZDkgMHg2OQ0KKyNkZWZpbmUgRldMX1ZLRVlfTXVsdGlwbHkgMHg2QQ0KKyNkZWZpbmUgRldMX1ZLRVlfQWRkIDB4NkINCisjZGVmaW5lIEZXTF9WS0VZX1NlcGFyYXRvciAweDZDDQorI2RlZmluZSBGV0xfVktFWV9TdWJ0cmFjdCAweDZEDQorI2RlZmluZSBGV0xfVktFWV9EZWNpbWFsIDB4NkUNCisjZGVmaW5lIEZXTF9WS0VZX0RpdmlkZSAweDZGDQorI2RlZmluZSBGV0xfVktFWV9GMSAweDcwDQorI2RlZmluZSBGV0xfVktFWV9GMiAweDcxDQorI2RlZmluZSBGV0xfVktFWV9GMyAweDcyDQorI2RlZmluZSBGV0xfVktFWV9GNCAweDczDQorI2RlZmluZSBGV0xfVktFWV9GNSAweDc0DQorI2RlZmluZSBGV0xfVktFWV9GNiAweDc1DQorI2RlZmluZSBGV0xfVktFWV9GNyAweDc2DQorI2RlZmluZSBGV0xfVktFWV9GOCAweDc3DQorI2RlZmluZSBGV0xfVktFWV9GOSAweDc4DQorI2RlZmluZSBGV0xfVktFWV9GMTAgMHg3OQ0KKyNkZWZpbmUgRldMX1ZLRVlfRjExIDB4N0ENCisjZGVmaW5lIEZXTF9WS0VZX0YxMiAweDdCDQorI2RlZmluZSBGV0xfVktFWV9GMTMgMHg3Qw0KKyNkZWZpbmUgRldMX1ZLRVlfRjE0IDB4N0QNCisjZGVmaW5lIEZXTF9WS0VZX0YxNSAweDdFDQorI2RlZmluZSBGV0xfVktFWV9GMTYgMHg3Rg0KKyNkZWZpbmUgRldMX1ZLRVlfRjE3IDB4ODANCisjZGVmaW5lIEZXTF9WS0VZX0YxOCAweDgxDQorI2RlZmluZSBGV0xfVktFWV9GMTkgMHg4Mg0KKyNkZWZpbmUgRldMX1ZLRVlfRjIwIDB4ODMNCisjZGVmaW5lIEZXTF9WS0VZX0YyMSAweDg0DQorI2RlZmluZSBGV0xfVktFWV9GMjIgMHg4NQ0KKyNkZWZpbmUgRldMX1ZLRVlfRjIzIDB4ODYNCisjZGVmaW5lIEZXTF9WS0VZX0YyNCAweDg3DQorI2RlZmluZSBGV0xfVktFWV9OdW5Mb2NrIDB4OTANCisjZGVmaW5lIEZXTF9WS0VZX1Njcm9sbCAweDkxDQorI2RlZmluZSBGV0xfVktFWV9MU2hpZnQgMHhBMA0KKyNkZWZpbmUgRldMX1ZLRVlfUlNoaWZ0IDB4QTENCisjZGVmaW5lIEZXTF9WS0VZX0xDb250cm9sIDB4QTINCisjZGVmaW5lIEZXTF9WS0VZX1JDb250cm9sIDB4QTMNCisjZGVmaW5lIEZXTF9WS0VZX0xNZW51IDB4QTQNCisjZGVmaW5lIEZXTF9WS0VZX1JNZW51IDB4QTUNCisjZGVmaW5lIEZXTF9WS0VZX0JST1dTRVJfQmFjayAweEE2DQorI2RlZmluZSBGV0xfVktFWV9CUk9XU0VSX0ZvcndhcmQgMHhBNw0KKyNkZWZpbmUgRldMX1ZLRVlfQlJPV1NFUl9SZWZyZXNoIDB4QTgNCisjZGVmaW5lIEZXTF9WS0VZX0JST1dTRVJfU3RvcCAweEE5DQorI2RlZmluZSBGV0xfVktFWV9CUk9XU0VSX1NlYXJjaCAweEFBDQorI2RlZmluZSBGV0xfVktFWV9CUk9XU0VSX0Zhdm9yaXRlcyAweEFCDQorI2RlZmluZSBGV0xfVktFWV9CUk9XU0VSX0hvbWUgMHhBQw0KKyNkZWZpbmUgRldMX1ZLRVlfVk9MVU1FX011dGUgMHhBRA0KKyNkZWZpbmUgRldMX1ZLRVlfVk9MVU1FX0Rvd24gMHhBRQ0KKyNkZWZpbmUgRldMX1ZLRVlfVk9MVU1FX1VwIDB4QUYNCisjZGVmaW5lIEZXTF9WS0VZX01FRElBX05FWFRfVHJhY2sgMHhCMA0KKyNkZWZpbmUgRldMX1ZLRVlfTUVESUFfUFJFVl9UcmFjayAweEIxDQorI2RlZmluZSBGV0xfVktFWV9NRURJQV9TdG9wIDB4QjINCisjZGVmaW5lIEZXTF9WS0VZX01FRElBX1BMQVlfUGF1c2UgMHhCMw0KKyNkZWZpbmUgRldMX1ZLRVlfTUVESUFfTEFVTkNIX01haWwgMHhCNA0KKyNkZWZpbmUgRldMX1ZLRVlfTUVESUFfTEFVTkNIX01FRElBX1NlbGVjdCAweEI1DQorI2RlZmluZSBGV0xfVktFWV9NRURJQV9MQVVOQ0hfQVBQMSAweEI2DQorI2RlZmluZSBGV0xfVktFWV9NRURJQV9MQVVOQ0hfQVBQMiAweEI3DQorI2RlZmluZSBGV0xfVktFWV9PRU1fMSAweEJBDQorI2RlZmluZSBGV0xfVktFWV9PRU1fUGx1cyAweEJCDQorI2RlZmluZSBGV0xfVktFWV9PRU1fQ29tbWEgMHhCQw0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNX01pbnVzIDB4QkQNCisjZGVmaW5lIEZXTF9WS0VZX09FTV9QZXJpb2QgMHhCRQ0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNXzIgMHhCRg0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNXzMgMHhDMA0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNXzQgMHhEQg0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNXzUgMHhEQw0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNXzYgMHhERA0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNXzcgMHhERQ0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNXzggMHhERg0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNXzEwMiAweEUyDQorI2RlZmluZSBGV0xfVktFWV9Qcm9jZXNzS2V5IDB4RTUNCisjZGVmaW5lIEZXTF9WS0VZX1BhY2tldCAweEU3DQorI2RlZmluZSBGV0xfVktFWV9BdHRuIDB4RjYNCisjZGVmaW5lIEZXTF9WS0VZX0Nyc2VsIDB4RjcNCisjZGVmaW5lIEZXTF9WS0VZX0V4c2VsIDB4RjgNCisjZGVmaW5lIEZXTF9WS0VZX0VyZW9mIDB4RjkNCisjZGVmaW5lIEZXTF9WS0VZX1BsYXkgMHhGQQ0KKyNkZWZpbmUgRldMX1ZLRVlfWm9vbSAweEZCDQorI2RlZmluZSBGV0xfVktFWV9Ob05hbWUgMHhGQw0KKyNkZWZpbmUgRldMX1ZLRVlfUEExIDB4RkQNCisjZGVmaW5lIEZXTF9WS0VZX09FTV9DbGVhciAweEZFDQorI2RlZmluZSBGV0xfVktFWV9Vbmtub3duIDANCisjZGVmaW5lIEZXTF9WS0VZU1RBVEVfVG9nZ2xlZCAweDAwMDENCisjZGVmaW5lIEZXTF9WS0VZU1RBVEVfRG93biAweDAxMDANCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0bWdyLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0bWdyLmgKaW5kZXggZjY1ODQ3Ni4uYzE5MWNhZSAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3dpZGdldG1nci5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRtZ3IuaApAQCAtMTAsNDAgKzEwLDQ2IEBACiBjbGFzcyBJRldMX1dpZGdldE1ncjsNCiBjbGFzcyBJRldMX1dpZGdldE1nckRlbGVnYXRlOw0KIGVudW0gRldMX1dHVFJFTEFUSU9OIHsNCi0gICAgRldMX1dHVFJFTEFUSU9OX1BhcmVudCA9IDAsDQotICAgIEZXTF9XR1RSRUxBVElPTl9Pd25lciwNCi0gICAgRldMX1dHVFJFTEFUSU9OX0ZpcnN0U2libGluZywNCi0gICAgRldMX1dHVFJFTEFUSU9OX1ByaW9yU2libGluZywNCi0gICAgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nLA0KLSAgICBGV0xfV0dUUkVMQVRJT05fTGFzdFNpYmxpbmcsDQotICAgIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkLA0KLSAgICBGV0xfV0dUUkVMQVRJT05fTGFzdENoaWxkLA0KLSAgICBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybQ0KKyAgRldMX1dHVFJFTEFUSU9OX1BhcmVudCA9IDAsDQorICBGV0xfV0dUUkVMQVRJT05fT3duZXIsDQorICBGV0xfV0dUUkVMQVRJT05fRmlyc3RTaWJsaW5nLA0KKyAgRldMX1dHVFJFTEFUSU9OX1ByaW9yU2libGluZywNCisgIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZywNCisgIEZXTF9XR1RSRUxBVElPTl9MYXN0U2libGluZywNCisgIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkLA0KKyAgRldMX1dHVFJFTEFUSU9OX0xhc3RDaGlsZCwNCisgIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtDQogfTsNCi1jbGFzcyBJRldMX1dpZGdldE1ncg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGV0xfV2lkZ2V0TWdyKCkge30NCi0gICAgdmlydHVhbCBpbnQzMl90CQlDb3VudFdpZGdldHMoSUZXTF9XaWRnZXQgKnBQYXJlbnQgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgSUZXTF9XaWRnZXQqCUdldFdpZGdldChpbnQzMl90IG5JbmRleCwgSUZXTF9XaWRnZXQgKnBQYXJlbnQgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgSUZXTF9XaWRnZXQqCUdldFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX1dHVFJFTEFUSU9OIGVSZWxhdGlvbikgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldFdpZGdldEluZGV4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFdpZGdldEluZGV4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBpbnQzMl90IG5JbmRleCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc1dpZGdldCh2b2lkKiBwT2JqKSA9IDA7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCVJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldENhcGFiaWxpdHkoKSA9IDA7DQorY2xhc3MgSUZXTF9XaWRnZXRNZ3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX1dpZGdldE1ncigpIHt9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRXaWRnZXRzKElGV0xfV2lkZ2V0KiBwUGFyZW50ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldCogR2V0V2lkZ2V0KGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwUGFyZW50ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldCogR2V0V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9XR1RSRUxBVElPTiBlUmVsYXRpb24pID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXaWRnZXRJbmRleChJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFdpZGdldEluZGV4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBpbnQzMl90IG5JbmRleCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzV2lkZ2V0KHZvaWQqIHBPYmopID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBSZXBhaW50V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2FwYWJpbGl0eSgpID0gMDsNCiB9Ow0KLUlGV0xfV2lkZ2V0TWdyKgkJRldMX0dldFdpZGdldE1ncigpOw0KLUZYX0JPT0wgRldMX1dpZGdldElzQ2hpbGQoSUZXTF9XaWRnZXQgKnBhcmVudCwgSUZXTF9XaWRnZXQgKmZpbmQpOw0KLSNkZWZpbmUgRldMX1dHVE1HUl9EaXNhYmxlVGhyZWFkCTB4MDAwMDAwMDENCi0jZGVmaW5lIEZXTF9XR1RNR1JfRGlzYWJsZUZvcm0JCTB4MDAwMDAwMDINCi1jbGFzcyBJRldMX1dpZGdldE1nckRlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSgpIHt9DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25TZXRDYXBhYmlsaXR5KEZYX0RXT1JEIGR3Q2FwYWJpbGl0eSA9IEZXTF9XR1RNR1JfRGlzYWJsZVRocmVhZCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZVRvRm9ybShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKSA9IDA7DQotICAgIHZpcnR1YWwJRldMX0VSUiAgT25EcmF3V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCitJRldMX1dpZGdldE1nciogRldMX0dldFdpZGdldE1ncigpOw0KK0ZYX0JPT0wgRldMX1dpZGdldElzQ2hpbGQoSUZXTF9XaWRnZXQqIHBhcmVudCwgSUZXTF9XaWRnZXQqIGZpbmQpOw0KKyNkZWZpbmUgRldMX1dHVE1HUl9EaXNhYmxlVGhyZWFkIDB4MDAwMDAwMDENCisjZGVmaW5lIEZXTF9XR1RNR1JfRGlzYWJsZUZvcm0gMHgwMDAwMDAwMg0KK2NsYXNzIElGV0xfV2lkZ2V0TWdyRGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX1dpZGdldE1nckRlbGVnYXRlKCkge30NCisgIHZpcnR1YWwgRldMX0VSUiBPblNldENhcGFiaWxpdHkoDQorICAgICAgRlhfRFdPUkQgZHdDYXBhYmlsaXR5ID0gRldMX1dHVE1HUl9EaXNhYmxlVGhyZWFkKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZVRvRm9ybShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25EcmF3V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCiB9Ow0KLUZXTF9FUlIgRldMX1dpZGdldE1nclNuYXBzaG90KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyAqc2F2ZUZpbGUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCitGV0xfRVJSIEZXTF9XaWRnZXRNZ3JTbmFwc2hvdChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogc2F2ZUZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9hcHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9hcHAuaAppbmRleCA3MmQ5ZGMwLi4zNjdlNzMyIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvYXBwLmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2FwcC5oCkBAIC05LDE3ICs5LDE3IEBACiBjbGFzcyBDRldMX1RoZW1lOw0KIGNsYXNzIElGV0xfQXBwOw0KIGNsYXNzIENGV0xfQXBwOw0KLWNsYXNzIENGV0xfQXBwDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9BcHAoKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9BcHAoKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KLSAgICBDRldMX1RoZW1lKgkJR2V0VGhlbWUoKTsNCi0gICAgRldMX0VSUgkJRXhpdChpbnQzMl90IGlFeGl0Q29kZSA9IDApOw0KLSAgICBJRldMX0FwcCoJR2V0QXBwKCk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX0FwcAkqbV9wQXBwSW1wOw0KLSAgICBDRldMX1RoZW1lCSptX3BUaGVtZVByb3ZpZGVyOw0KK2NsYXNzIENGV0xfQXBwIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9BcHAoKTsNCisgIHZpcnR1YWwgfkNGV0xfQXBwKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIENGV0xfVGhlbWUqIEdldFRoZW1lKCk7DQorICBGV0xfRVJSIEV4aXQoaW50MzJfdCBpRXhpdENvZGUgPSAwKTsNCisgIElGV0xfQXBwKiBHZXRBcHAoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9BcHAqIG1fcEFwcEltcDsNCisgIENGV0xfVGhlbWUqIG1fcFRoZW1lUHJvdmlkZXI7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvYmFyY29kZS5oIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2JhcmNvZGUuaAppbmRleCAyNDJiNDMyLi5hYjE3MTkzIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvYmFyY29kZS5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9iYXJjb2RlLmgKQEAgLTEyLDE2NiArMTIsMTA2IEBACiBjbGFzcyBDRldMX0VkaXQ7DQogY2xhc3MgQ0ZXTF9CYXJjb2RlOw0KIGNsYXNzIENGV0xfQmFyY29kZURQOw0KLWNsYXNzIENGV0xfQmFyY29kZSA6IHB1YmxpYyBDRldMX0VkaXQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgQ0ZXTF9CYXJjb2RlKiBDcmVhdGUoKTsNCi0gICAgRldMX0VSUglJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgPSBOVUxMKTsNCi0gICAgdm9pZAkJU2V0VHlwZShCQ19UWVBFIHR5cGUpOw0KLSAgICBGWF9CT09MCQlJc1Byb3RlY3RlZFR5cGUoKTsNCi1wdWJsaWM6DQotICAgIHZvaWQJCVNldENoYXJFbmNvZGluZyhCQ19DSEFSX0VOQ09ESU5HIGVuY29kaW5nKQ0KLSAgICB7DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfQ0hBUkVOQ09ESU5HOw0KLSAgICAgICAgbV9iYXJjb2RlRGF0YS5tX2VDaGFyRW5jb2RpbmcgPSBlbmNvZGluZzsNCi0gICAgfQ0KLSAgICB2b2lkCQlTZXRNb2R1bGVIZWlnaHQoaW50MzJfdCBoZWlnaHQpDQotICAgIHsNCi0gICAgICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9NT0RVTEVIRUlHSFQ7DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fbk1vZHVsZUhlaWdodCA9IGhlaWdodDsNCi0gICAgfQ0KLSAgICB2b2lkCQlTZXRNb2R1bGVXaWR0aChpbnQzMl90IHdpZHRoKQ0KLSAgICB7DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfTU9EVUxFV0lEVEg7DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fbk1vZHVsZVdpZHRoID0gd2lkdGg7DQotICAgIH0NCi0gICAgdm9pZAkJU2V0RGF0YUxlbmd0aChpbnQzMl90IGRhdGFMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9EQVRBTEVOR1RIOw0KLSAgICAgICAgbV9iYXJjb2RlRGF0YS5tX25EYXRhTGVuZ3RoID0gZGF0YUxlbmd0aDsNCi0gICAgICAgICgoSUZXTF9CYXJjb2RlKiltX3BJbXApLT5TZXRMaW1pdChkYXRhTGVuZ3RoKTsNCi0gICAgfQ0KLSAgICB2b2lkCQlTZXRDYWxDaGVja3N1bShpbnQzMl90IGNhbENoZWNrc3VtKQ0KLSAgICB7DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfQ0FMQ0hFQ0tTVU07DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fbkNhbENoZWNrc3VtID0gY2FsQ2hlY2tzdW07DQotICAgIH0NCi0gICAgdm9pZAkJU2V0UHJpbnRDaGVja3N1bShGWF9CT09MIHByaW50Q2hlY2tzdW0pDQotICAgIHsNCi0gICAgICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9QUklOVENIRUNLU1VNOw0KLSAgICAgICAgbV9iYXJjb2RlRGF0YS5tX2JQcmludENoZWNrc3VtID0gcHJpbnRDaGVja3N1bTsNCi0gICAgfQ0KLSAgICB2b2lkCQlTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pDQotICAgIHsNCi0gICAgICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9URVhUTE9DQVRJT047DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZVRleHRMb2NhdGlvbiA9IGxvY2F0aW9uOw0KLSAgICB9DQotICAgIHZvaWQJCVNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKQ0KLSAgICB7DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfV0lERU5BUlJPV1JBVElPOw0KLSAgICAgICAgbV9iYXJjb2RlRGF0YS5tX25XaWRlTmFycm93UmF0aW8gPSByYXRpbzsNCi0gICAgfQ0KLSAgICB2b2lkCQlTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydENoYXIpDQotICAgIHsNCi0gICAgICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9TVEFSVENIQVI7DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fY1N0YXJ0Q2hhciA9IHN0YXJ0Q2hhcjsNCi0gICAgfQ0KLSAgICB2b2lkCQlTZXRFbmRDaGFyKEZYX0NIQVIgZW5kQ2hhcikNCi0gICAgew0KLSAgICAgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX0VORENIQVI7DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fY0VuZENoYXIgPSBlbmRDaGFyOw0KLSAgICB9DQotICAgIHZvaWQJCVNldFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKQ0KLSAgICB7DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfVkVSU0lPTjsNCi0gICAgICAgIG1fYmFyY29kZURhdGEubV9uVmVyc2lvbiA9IHZlcnNpb247DQotICAgIH0NCi0gICAgdm9pZAkJU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBlY0xldmVsKQ0KLSAgICB7DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfRUNMRVZFTDsNCi0gICAgICAgIG1fYmFyY29kZURhdGEubV9uRUNMZXZlbCA9IGVjTGV2ZWw7DQotICAgIH0NCi0gICAgdm9pZAkJU2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKQ0KLSAgICB7DQotICAgICAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfVFJVTkNBVEVEOw0KLSAgICAgICAgbV9iYXJjb2RlRGF0YS5tX2JUcnVuY2F0ZWQgPSB0cnVuY2F0ZWQ7DQotICAgIH0NCi0gICAgdm9pZAkJUmVzZXRCYXJjb2RlQXR0cmlidXRlcygpDQotICAgIHsNCi0gICAgICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgPSAwOw0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICBDRldMX0JhcmNvZGUoKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9CYXJjb2RlKCk7DQotICAgIGNsYXNzIENGV0xfQmFyY29kZURQIDogcHVibGljIElGV0xfQmFyY29kZURQDQotICAgIHsNCi0gICAgcHVibGljOg0KLSAgICAgICAgdmlydHVhbCBGV0xfRVJSCQkJCUdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pOw0KLSAgICAgICAgQkNfQ0hBUl9FTkNPRElORwkJCW1fZUNoYXJFbmNvZGluZzsNCi0gICAgICAgIHZpcnR1YWwgQkNfQ0hBUl9FTkNPRElORwlHZXRDaGFyRW5jb2RpbmcoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtX2VDaGFyRW5jb2Rpbmc7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90CQkJCQltX25Nb2R1bGVIZWlnaHQsIG1fbk1vZHVsZVdpZHRoOw0KLSAgICAgICAgdmlydHVhbCBpbnQzMl90CQkJR2V0TW9kdWxlSGVpZ2h0KCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbV9uTW9kdWxlSGVpZ2h0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgdmlydHVhbCBpbnQzMl90CQkJR2V0TW9kdWxlV2lkdGgoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtX25Nb2R1bGVXaWR0aDsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QJCQkJCW1fbkRhdGFMZW5ndGg7DQotICAgICAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXREYXRhTGVuZ3RoKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbV9uRGF0YUxlbmd0aDsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QJCQkJCW1fbkNhbENoZWNrc3VtOw0KLSAgICAgICAgdmlydHVhbCBpbnQzMl90CQkJR2V0Q2FsQ2hlY2tzdW0oKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtX25DYWxDaGVja3N1bTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0JPT0wJCQkJCQltX2JQcmludENoZWNrc3VtOw0KLSAgICAgICAgdmlydHVhbCBGWF9CT09MCQkJCUdldFByaW50Q2hlY2tzdW0oKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtX2JQcmludENoZWNrc3VtOw0KLSAgICAgICAgfQ0KK2NsYXNzIENGV0xfQmFyY29kZSA6IHB1YmxpYyBDRldMX0VkaXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZXTF9CYXJjb2RlKiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzID0gTlVMTCk7DQorICB2b2lkIFNldFR5cGUoQkNfVFlQRSB0eXBlKTsNCisgIEZYX0JPT0wgSXNQcm90ZWN0ZWRUeXBlKCk7DQogDQotICAgICAgICBCQ19URVhUX0xPQwkJCQkJbV9lVGV4dExvY2F0aW9uOw0KLSAgICAgICAgdmlydHVhbCBCQ19URVhUX0xPQwkJCUdldFRleHRMb2NhdGlvbigpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1fZVRleHRMb2NhdGlvbjsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QJCQkJCW1fbldpZGVOYXJyb3dSYXRpbzsNCi0gICAgICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFdpZGVOYXJyb3dSYXRpbygpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1fbldpZGVOYXJyb3dSYXRpbzsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0NIQVIJCQkJCQltX2NTdGFydENoYXIsIG1fY0VuZENoYXI7DQotICAgICAgICB2aXJ0dWFsIEZYX0NIQVIJCQkJR2V0U3RhcnRDaGFyKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbV9jU3RhcnRDaGFyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdmlydHVhbCBGWF9DSEFSCQkJCUdldEVuZENoYXIoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtX2NFbmRDaGFyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdAkJCQkJbV9uVmVyc2lvbjsNCi0gICAgICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFZlcnNpb24oKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtX25WZXJzaW9uOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdAkJCQkJbV9uRUNMZXZlbDsNCi0gICAgICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbV9uRUNMZXZlbDsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0JPT0wJCQkJCQltX2JUcnVuY2F0ZWQ7DQotICAgICAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJR2V0VHJ1bmNhdGVkKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbV9iVHJ1bmNhdGVkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRFdPUkQJCQkJCW1fZHdBdHRyaWJ1dGVNYXNrOw0KLSAgICAgICAgdmlydHVhbCBGWF9EV09SRAkJCUdldEJhcmNvZGVBdHRyaWJ1dGVNYXNrKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbV9kd0F0dHJpYnV0ZU1hc2s7DQotICAgICAgICB9DQotICAgIHB1YmxpYzoNCi0gICAgICAgIENGV0xfQmFyY29kZURQKCkNCi0gICAgICAgICAgICA6IG1fZHdBdHRyaWJ1dGVNYXNrKDApDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH07DQotICAgIENGV0xfQmFyY29kZURQIG1fYmFyY29kZURhdGE7DQorIHB1YmxpYzoNCisgIHZvaWQgU2V0Q2hhckVuY29kaW5nKEJDX0NIQVJfRU5DT0RJTkcgZW5jb2RpbmcpIHsNCisgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX0NIQVJFTkNPRElORzsNCisgICAgbV9iYXJjb2RlRGF0YS5tX2VDaGFyRW5jb2RpbmcgPSBlbmNvZGluZzsNCisgIH0NCisgIHZvaWQgU2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgaGVpZ2h0KSB7DQorICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9NT0RVTEVIRUlHSFQ7DQorICAgIG1fYmFyY29kZURhdGEubV9uTW9kdWxlSGVpZ2h0ID0gaGVpZ2h0Ow0KKyAgfQ0KKyAgdm9pZCBTZXRNb2R1bGVXaWR0aChpbnQzMl90IHdpZHRoKSB7DQorICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9NT0RVTEVXSURUSDsNCisgICAgbV9iYXJjb2RlRGF0YS5tX25Nb2R1bGVXaWR0aCA9IHdpZHRoOw0KKyAgfQ0KKyAgdm9pZCBTZXREYXRhTGVuZ3RoKGludDMyX3QgZGF0YUxlbmd0aCkgew0KKyAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfREFUQUxFTkdUSDsNCisgICAgbV9iYXJjb2RlRGF0YS5tX25EYXRhTGVuZ3RoID0gZGF0YUxlbmd0aDsNCisgICAgKChJRldMX0JhcmNvZGUqKW1fcEltcCktPlNldExpbWl0KGRhdGFMZW5ndGgpOw0KKyAgfQ0KKyAgdm9pZCBTZXRDYWxDaGVja3N1bShpbnQzMl90IGNhbENoZWNrc3VtKSB7DQorICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9DQUxDSEVDS1NVTTsNCisgICAgbV9iYXJjb2RlRGF0YS5tX25DYWxDaGVja3N1bSA9IGNhbENoZWNrc3VtOw0KKyAgfQ0KKyAgdm9pZCBTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgcHJpbnRDaGVja3N1bSkgew0KKyAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfUFJJTlRDSEVDS1NVTTsNCisgICAgbV9iYXJjb2RlRGF0YS5tX2JQcmludENoZWNrc3VtID0gcHJpbnRDaGVja3N1bTsNCisgIH0NCisgIHZvaWQgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7DQorICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9URVhUTE9DQVRJT047DQorICAgIG1fYmFyY29kZURhdGEubV9lVGV4dExvY2F0aW9uID0gbG9jYXRpb247DQorICB9DQorICB2b2lkIFNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKSB7DQorICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9XSURFTkFSUk9XUkFUSU87DQorICAgIG1fYmFyY29kZURhdGEubV9uV2lkZU5hcnJvd1JhdGlvID0gcmF0aW87DQorICB9DQorICB2b2lkIFNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0Q2hhcikgew0KKyAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfU1RBUlRDSEFSOw0KKyAgICBtX2JhcmNvZGVEYXRhLm1fY1N0YXJ0Q2hhciA9IHN0YXJ0Q2hhcjsNCisgIH0NCisgIHZvaWQgU2V0RW5kQ2hhcihGWF9DSEFSIGVuZENoYXIpIHsNCisgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX0VORENIQVI7DQorICAgIG1fYmFyY29kZURhdGEubV9jRW5kQ2hhciA9IGVuZENoYXI7DQorICB9DQorICB2b2lkIFNldFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKSB7DQorICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9WRVJTSU9OOw0KKyAgICBtX2JhcmNvZGVEYXRhLm1fblZlcnNpb24gPSB2ZXJzaW9uOw0KKyAgfQ0KKyAgdm9pZCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGVjTGV2ZWwpIHsNCisgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX0VDTEVWRUw7DQorICAgIG1fYmFyY29kZURhdGEubV9uRUNMZXZlbCA9IGVjTGV2ZWw7DQorICB9DQorICB2b2lkIFNldFRydW5jYXRlZChGWF9CT09MIHRydW5jYXRlZCkgew0KKyAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfVFJVTkNBVEVEOw0KKyAgICBtX2JhcmNvZGVEYXRhLm1fYlRydW5jYXRlZCA9IHRydW5jYXRlZDsNCisgIH0NCisgIHZvaWQgUmVzZXRCYXJjb2RlQXR0cmlidXRlcygpIHsgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayA9IDA7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9CYXJjb2RlKCk7DQorICB2aXJ0dWFsIH5DRldMX0JhcmNvZGUoKTsNCisgIGNsYXNzIENGV0xfQmFyY29kZURQIDogcHVibGljIElGV0xfQmFyY29kZURQIHsNCisgICBwdWJsaWM6DQorICAgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKTsNCisgICAgQkNfQ0hBUl9FTkNPRElORyBtX2VDaGFyRW5jb2Rpbmc7DQorICAgIHZpcnR1YWwgQkNfQ0hBUl9FTkNPRElORyBHZXRDaGFyRW5jb2RpbmcoKSB7IHJldHVybiBtX2VDaGFyRW5jb2Rpbmc7IH0NCisgICAgaW50MzJfdCBtX25Nb2R1bGVIZWlnaHQsIG1fbk1vZHVsZVdpZHRoOw0KKyAgICB2aXJ0dWFsIGludDMyX3QgR2V0TW9kdWxlSGVpZ2h0KCkgeyByZXR1cm4gbV9uTW9kdWxlSGVpZ2h0OyB9DQorICAgIHZpcnR1YWwgaW50MzJfdCBHZXRNb2R1bGVXaWR0aCgpIHsgcmV0dXJuIG1fbk1vZHVsZVdpZHRoOyB9DQorICAgIGludDMyX3QgbV9uRGF0YUxlbmd0aDsNCisgICAgdmlydHVhbCBpbnQzMl90IEdldERhdGFMZW5ndGgoKSB7IHJldHVybiBtX25EYXRhTGVuZ3RoOyB9DQorICAgIGludDMyX3QgbV9uQ2FsQ2hlY2tzdW07DQorICAgIHZpcnR1YWwgaW50MzJfdCBHZXRDYWxDaGVja3N1bSgpIHsgcmV0dXJuIG1fbkNhbENoZWNrc3VtOyB9DQorICAgIEZYX0JPT0wgbV9iUHJpbnRDaGVja3N1bTsNCisgICAgdmlydHVhbCBGWF9CT09MIEdldFByaW50Q2hlY2tzdW0oKSB7IHJldHVybiBtX2JQcmludENoZWNrc3VtOyB9DQorDQorICAgIEJDX1RFWFRfTE9DIG1fZVRleHRMb2NhdGlvbjsNCisgICAgdmlydHVhbCBCQ19URVhUX0xPQyBHZXRUZXh0TG9jYXRpb24oKSB7IHJldHVybiBtX2VUZXh0TG9jYXRpb247IH0NCisgICAgaW50MzJfdCBtX25XaWRlTmFycm93UmF0aW87DQorICAgIHZpcnR1YWwgaW50MzJfdCBHZXRXaWRlTmFycm93UmF0aW8oKSB7IHJldHVybiBtX25XaWRlTmFycm93UmF0aW87IH0NCisgICAgRlhfQ0hBUiBtX2NTdGFydENoYXIsIG1fY0VuZENoYXI7DQorICAgIHZpcnR1YWwgRlhfQ0hBUiBHZXRTdGFydENoYXIoKSB7IHJldHVybiBtX2NTdGFydENoYXI7IH0NCisgICAgdmlydHVhbCBGWF9DSEFSIEdldEVuZENoYXIoKSB7IHJldHVybiBtX2NFbmRDaGFyOyB9DQorICAgIGludDMyX3QgbV9uVmVyc2lvbjsNCisgICAgdmlydHVhbCBpbnQzMl90IEdldFZlcnNpb24oKSB7IHJldHVybiBtX25WZXJzaW9uOyB9DQorICAgIGludDMyX3QgbV9uRUNMZXZlbDsNCisgICAgdmlydHVhbCBpbnQzMl90IEdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgeyByZXR1cm4gbV9uRUNMZXZlbDsgfQ0KKyAgICBGWF9CT09MIG1fYlRydW5jYXRlZDsNCisgICAgdmlydHVhbCBGWF9CT09MIEdldFRydW5jYXRlZCgpIHsgcmV0dXJuIG1fYlRydW5jYXRlZDsgfQ0KKyAgICBGWF9EV09SRCBtX2R3QXR0cmlidXRlTWFzazsNCisgICAgdmlydHVhbCBGWF9EV09SRCBHZXRCYXJjb2RlQXR0cmlidXRlTWFzaygpIHsgcmV0dXJuIG1fZHdBdHRyaWJ1dGVNYXNrOyB9DQorDQorICAgcHVibGljOg0KKyAgICBDRldMX0JhcmNvZGVEUCgpIDogbV9kd0F0dHJpYnV0ZU1hc2soMCkge30NCisgIH07DQorICBDRldMX0JhcmNvZGVEUCBtX2JhcmNvZGVEYXRhOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NhcmV0LmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2FyZXQuaAppbmRleCBkNGMyZTc3Li41MzRkY2E1IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2FyZXQuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2FyZXQuaApAQCAtOSwxNyArOSwxNyBAQAogY2xhc3MgQ0ZXTF9XaWRnZXQ7DQogY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KIGNsYXNzIENGV0xfQ2FyZXQ7DQotY2xhc3MgQ0ZXTF9DYXJldCA6IHB1YmxpYyBDRldMX1dpZGdldA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBDRldMX0NhcmV0KiBDcmVhdGUoKTsNCi0gICAgRldMX0VSUglJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgPSBOVUxMKTsNCi0gICAgRldMX0VSUglTaG93Q2FyZXQoRlhfQk9PTCBiRmxhZyA9IFRSVUUpOw0KLSAgICBGV0xfRVJSCUdldEZyZXF1ZW5jeShGWF9EV09SRCAmZWxhcHNlKTsNCi0gICAgRldMX0VSUglTZXRGcmVxdWVuY3koRlhfRFdPUkQgZWxhcHNlKTsNCi0gICAgRldMX0VSUglTZXRDb2xvcihDRlhfQ29sb3IgY3JGaWxsKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGV0xfQ2FyZXQoKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9DYXJldCgpOw0KK2NsYXNzIENGV0xfQ2FyZXQgOiBwdWJsaWMgQ0ZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZXTF9DYXJldCogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgRldMX0VSUiBTaG93Q2FyZXQoRlhfQk9PTCBiRmxhZyA9IFRSVUUpOw0KKyAgRldMX0VSUiBHZXRGcmVxdWVuY3koRlhfRFdPUkQmIGVsYXBzZSk7DQorICBGV0xfRVJSIFNldEZyZXF1ZW5jeShGWF9EV09SRCBlbGFwc2UpOw0KKyAgRldMX0VSUiBTZXRDb2xvcihDRlhfQ29sb3IgY3JGaWxsKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9DYXJldCgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9DYXJldCgpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NoZWNrYm94LmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2hlY2tib3guaAppbmRleCBmMDY3NTA4Li4xMzY1MTg4IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2hlY2tib3guaAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2hlY2tib3guaApAQCAtMTEsMjkgKzExLDI4IEBACiBjbGFzcyBJRldMX0NoZWNrQm94RFA7DQogY2xhc3MgQ0ZXTF9DaGVja0JveDsNCiBjbGFzcyBDRldMX0NoZWNrQm94RFA7DQotY2xhc3MgQ0ZXTF9DaGVja0JveCA6IHB1YmxpYyBDRldMX1dpZGdldA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBDRldMX0NoZWNrQm94KiBDcmVhdGUoKTsNCitjbGFzcyBDRldMX0NoZWNrQm94IDogcHVibGljIENGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIENGV0xfQ2hlY2tCb3gqIENyZWF0ZSgpOw0KIA0KLSAgICBGV0xfRVJSCQlJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgPSBOVUxMKTsNCi0gICAgRldMX0VSUgkJR2V0Q2FwdGlvbihDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKTsNCi0gICAgRldMX0VSUgkJU2V0Q2FwdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbik7DQotICAgIEZXTF9FUlIJCVNldEJveFNpemUoRlhfRkxPQVQgZkhlaWdodCk7DQotICAgIGludDMyX3QJR2V0Q2hlY2tTdGF0ZSgpOw0KLSAgICBGV0xfRVJSCQlTZXRDaGVja1N0YXRlKGludDMyX3QgaUNoZWNrKTsNCi0gICAgQ0ZXTF9DaGVja0JveCgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0NoZWNrQm94KCk7DQotcHJvdGVjdGVkOg0KLSAgICBjbGFzcyBDRldMX0NoZWNrQm94RFAgOiBwdWJsaWMgSUZXTF9DaGVja0JveERQDQotICAgIHsNCi0gICAgcHVibGljOg0KLSAgICAgICAgQ0ZXTF9DaGVja0JveERQKCk7DQotICAgICAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzQ2FwdGlvbik7DQotICAgICAgICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEJveFNpemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICAgICAgRlhfRkxPQVQJICAgbV9mQm94SGVpZ2h0Ow0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgbV93c0NhcHRpb247DQotICAgIH07DQotICAgIENGV0xfQ2hlY2tCb3hEUCBtX2NoZWNrYm94RGF0YTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzID0gTlVMTCk7DQorICBGV0xfRVJSIEdldENhcHRpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbik7DQorICBGV0xfRVJSIFNldENhcHRpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhcHRpb24pOw0KKyAgRldMX0VSUiBTZXRCb3hTaXplKEZYX0ZMT0FUIGZIZWlnaHQpOw0KKyAgaW50MzJfdCBHZXRDaGVja1N0YXRlKCk7DQorICBGV0xfRVJSIFNldENoZWNrU3RhdGUoaW50MzJfdCBpQ2hlY2spOw0KKyAgQ0ZXTF9DaGVja0JveCgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9DaGVja0JveCgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBjbGFzcyBDRldMX0NoZWNrQm94RFAgOiBwdWJsaWMgSUZXTF9DaGVja0JveERQIHsNCisgICBwdWJsaWM6DQorICAgIENGV0xfQ2hlY2tCb3hEUCgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2FwdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbik7DQorICAgIHZpcnR1YWwgRlhfRkxPQVQgR2V0Qm94U2l6ZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICAgIEZYX0ZMT0FUIG1fZkJveEhlaWdodDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgbV93c0NhcHRpb247DQorICB9Ow0KKyAgQ0ZXTF9DaGVja0JveERQIG1fY2hlY2tib3hEYXRhOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NvbWJvYm94LmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY29tYm9ib3guaAppbmRleCBmYzA5ZjYzLi5jYjhlZjcwIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY29tYm9ib3guaAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY29tYm9ib3guaApAQCAtMTIsMTA0ICsxMiwxMjUgQEAKIGNsYXNzIENGV0xfQ29tYm9Cb3g7DQogY2xhc3MgQ0ZXTF9Db21ib0JveERQOw0KIGNsYXNzIENGV0xfQ29tYm9Cb3hJdGVtOw0KLWNsYXNzIENGV0xfQ29tYm9Cb3ggOiBwdWJsaWMgQ0ZXTF9XaWRnZXQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgQ0ZXTF9Db21ib0JveCogQ3JlYXRlKCk7DQotICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyA9IE5VTEwpOw0KLSAgICBpbnQzMl90CUFkZFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGV4dCk7DQotICAgIGludDMyX3QJQWRkU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0LCBDRlhfRElCaXRtYXAgKnBJY29uKTsNCi0gICAgaW50MzJfdAlSZW1vdmVBdChpbnQzMl90IGlJbmRleCk7DQotICAgIGludDMyX3QgICAgUmVtb3ZlQWxsKCk7DQotICAgIGludDMyX3QJQ291bnRJdGVtcygpOw0KLSAgICBGV0xfRVJSCQlHZXRUZXh0QnlJbmRleChpbnQzMl90IGlJbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIGludDMyX3QJR2V0Q3VyU2VsKCk7DQotICAgIEZXTF9FUlIJCVNldEN1clNlbChpbnQzMl90IGlTZWwpOw0KLSAgICBGV0xfRVJSCQlTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGV4dCk7DQotICAgIGludDMyX3QJR2V0RWRpdFRleHRMZW5ndGgoKSBjb25zdDsNCi0gICAgRldMX0VSUgkJR2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBuU3RhcnQgPSAwLCBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdCA7DQotICAgIEZXTF9FUlIJCVNldEVkaXRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQotICAgIGludDMyX3QJR2V0RWRpdFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpOw0KLSAgICBpbnQzMl90CUdldEVkaXRMaW1pdCgpOw0KLSAgICBGV0xfRVJSCQlTZXRFZGl0TGltaXQoaW50MzJfdCBuTGltaXQpOw0KLSAgICBGV0xfRVJSCQlFZGl0RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKTsNCi0gICAgRlhfQk9PTAkJRWRpdFJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQotICAgIEZYX0JPT0wJCUVkaXRVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpOw0KLSAgICBGV0xfRVJSCQlTZXRNYXhMaXN0SGVpZ2h0KEZYX0ZMT0FUIGZNYXhIZWlnaHQpOw0KLSAgICBGV0xfRVJSCQlTZXRJdGVtRGF0YShpbnQzMl90IGlJbmRleCwgdm9pZCogcERhdGEpOw0KLSAgICB2b2lkKglHZXRJdGVtRGF0YShpbnQzMl90IGlJbmRleCk7DQotICAgIEZXTF9FUlIJCVNldExpc3RUaGVtZShJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSk7DQotICAgIEZYX0JPT0wJCUFmdGVyRm9jdXNTaG93RHJvcExpc3QoKTsNCi0gICAgRldMX0VSUgkJT3BlbkRyb3BEb3duTGlzdChGWF9CT09MIGJBY3RpdmF0ZSk7DQotcHVibGljOg0KLSAgICBGWF9CT09MCQlFZGl0Q2FuVW5kbygpOw0KLSAgICBGWF9CT09MCQlFZGl0Q2FuUmVkbygpOw0KLSAgICBGWF9CT09MCQlFZGl0VW5kbygpOw0KLSAgICBGWF9CT09MCQlFZGl0UmVkbygpOw0KLSAgICBGWF9CT09MCQlFZGl0Q2FuQ29weSgpOw0KLSAgICBGWF9CT09MCQlFZGl0Q2FuQ3V0KCk7DQotICAgIEZYX0JPT0wJCUVkaXRDYW5TZWxlY3RBbGwoKTsNCi0gICAgRlhfQk9PTAkJRWRpdENvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSk7DQotICAgIEZYX0JPT0wJCUVkaXRDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCi0gICAgRlhfQk9PTAkJRWRpdFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKTsNCi0gICAgRlhfQk9PTAkJRWRpdFNlbGVjdEFsbCgpOw0KLSAgICBGWF9CT09MCQlFZGl0RGVsZXRlKCk7DQotICAgIEZYX0JPT0wJCUVkaXREZVNlbGVjdCgpOw0KLSAgICBGV0xfRVJSCQlHZXRCQm94KENGWF9SZWN0RiAmcmVjdCk7DQotICAgIEZXTF9FUlIJCUVkaXRNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCi0gICAgQ0ZXTF9Db21ib0JveCgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0NvbWJvQm94KCk7DQotcHJvdGVjdGVkOg0KLSAgICBjbGFzcyBDRldMX0NvbWJvQm94RFAgOiBwdWJsaWMgSUZXTF9Db21ib0JveERQDQotICAgIHsNCi0gICAgcHVibGljOg0KLSAgICAgICAgQ0ZXTF9Db21ib0JveERQKCk7DQotICAgICAgICB+Q0ZXTF9Db21ib0JveERQKCk7DQotICAgICAgICB2aXJ0dWFsIEZXTF9FUlIJCQlHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgIH0NCitjbGFzcyBDRldMX0NvbWJvQm94IDogcHVibGljIENGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIENGV0xfQ29tYm9Cb3gqIENyZWF0ZSgpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMgPSBOVUxMKTsNCisgIGludDMyX3QgQWRkU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KTsNCisgIGludDMyX3QgQWRkU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0LCBDRlhfRElCaXRtYXAqIHBJY29uKTsNCisgIGludDMyX3QgUmVtb3ZlQXQoaW50MzJfdCBpSW5kZXgpOw0KKyAgaW50MzJfdCBSZW1vdmVBbGwoKTsNCisgIGludDMyX3QgQ291bnRJdGVtcygpOw0KKyAgRldMX0VSUiBHZXRUZXh0QnlJbmRleChpbnQzMl90IGlJbmRleCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBpbnQzMl90IEdldEN1clNlbCgpOw0KKyAgRldMX0VSUiBTZXRDdXJTZWwoaW50MzJfdCBpU2VsKTsNCisgIEZXTF9FUlIgU2V0RWRpdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RleHQpOw0KKyAgaW50MzJfdCBHZXRFZGl0VGV4dExlbmd0aCgpIGNvbnN0Ow0KKyAgRldMX0VSUiBHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50ID0gLTEpIGNvbnN0Ow0KKyAgRldMX0VSUiBTZXRFZGl0U2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KKyAgaW50MzJfdCBHZXRFZGl0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCk7DQorICBpbnQzMl90IEdldEVkaXRMaW1pdCgpOw0KKyAgRldMX0VSUiBTZXRFZGl0TGltaXQoaW50MzJfdCBuTGltaXQpOw0KKyAgRldMX0VSUiBFZGl0RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKTsNCisgIEZYX0JPT0wgRWRpdFJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQorICBGWF9CT09MIEVkaXRVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpOw0KKyAgRldMX0VSUiBTZXRNYXhMaXN0SGVpZ2h0KEZYX0ZMT0FUIGZNYXhIZWlnaHQpOw0KKyAgRldMX0VSUiBTZXRJdGVtRGF0YShpbnQzMl90IGlJbmRleCwgdm9pZCogcERhdGEpOw0KKyAgdm9pZCogR2V0SXRlbURhdGEoaW50MzJfdCBpSW5kZXgpOw0KKyAgRldMX0VSUiBTZXRMaXN0VGhlbWUoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUpOw0KKyAgRlhfQk9PTCBBZnRlckZvY3VzU2hvd0Ryb3BMaXN0KCk7DQorICBGV0xfRVJSIE9wZW5Ecm9wRG93bkxpc3QoRlhfQk9PTCBiQWN0aXZhdGUpOw0KIA0KLSAgICAgICAgdmlydHVhbAlpbnQzMl90CQlDb3VudEl0ZW1zKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgICAgIHZpcnR1YWwJRldMX0hMSVNUSVRFTQlHZXRJdGVtKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBpbnQzMl90IG5JbmRleCk7DQotICAgICAgICB2aXJ0dWFsCWludDMyX3QJCUdldEl0ZW1JbmRleChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQotICAgICAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIGludDMyX3QgbkluZGV4KTsNCisgcHVibGljOg0KKyAgRlhfQk9PTCBFZGl0Q2FuVW5kbygpOw0KKyAgRlhfQk9PTCBFZGl0Q2FuUmVkbygpOw0KKyAgRlhfQk9PTCBFZGl0VW5kbygpOw0KKyAgRlhfQk9PTCBFZGl0UmVkbygpOw0KKyAgRlhfQk9PTCBFZGl0Q2FuQ29weSgpOw0KKyAgRlhfQk9PTCBFZGl0Q2FuQ3V0KCk7DQorICBGWF9CT09MIEVkaXRDYW5TZWxlY3RBbGwoKTsNCisgIEZYX0JPT0wgRWRpdENvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSk7DQorICBGWF9CT09MIEVkaXRDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsNCisgIEZYX0JPT0wgRWRpdFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKTsNCisgIEZYX0JPT0wgRWRpdFNlbGVjdEFsbCgpOw0KKyAgRlhfQk9PTCBFZGl0RGVsZXRlKCk7DQorICBGWF9CT09MIEVkaXREZVNlbGVjdCgpOw0KKyAgRldMX0VSUiBHZXRCQm94KENGWF9SZWN0RiYgcmVjdCk7DQorICBGV0xfRVJSIEVkaXRNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorICBDRldMX0NvbWJvQm94KCk7DQorICB2aXJ0dWFsIH5DRldMX0NvbWJvQm94KCk7DQogDQotICAgICAgICB2aXJ0dWFsCUZYX0RXT1JECQlHZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCi0gICAgICAgIHZpcnR1YWwJRldMX0VSUgkJCUdldEl0ZW1UZXh0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCi0gICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCUdldEl0ZW1SZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfUmVjdEYmIHJ0SXRlbSk7DQotICAgICAgICB2aXJ0dWFsIHZvaWQqCQlHZXRJdGVtRGF0YShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQotICAgICAgICB2aXJ0dWFsCUZXTF9FUlIJCQlTZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9EV09SRCBkd1N0eWxlKTsNCi0gICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCVNldEl0ZW1UZXh0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBjb25zdCBGWF9XQ0hBUiogcHN6VGV4dCk7DQotICAgICAgICB2aXJ0dWFsIEZXTF9FUlIJCQlTZXRJdGVtUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0pOw0KLSAgICAgICAgdmlydHVhbCBGWF9GTE9BVAkJR2V0SXRlbUhlaWdodChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgICAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCoJR2V0SXRlbUljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pOw0KLSAgICAgICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0SXRlbUNoZWNrUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1JlY3RGJiBydENoZWNrKTsNCi0gICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCVNldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IENGWF9SZWN0RiYgcnRDaGVjayk7DQotICAgICAgICB2aXJ0dWFsCUZYX0RXT1JECQlHZXRJdGVtQ2hlY2tTdGF0ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQotICAgICAgICB2aXJ0dWFsCUZXTF9FUlIJCQlTZXRJdGVtQ2hlY2tTdGF0ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfRFdPUkQgZHdDaGVja1N0YXRlKTsNCi0gICAgICAgIHZpcnR1YWwgRlhfRkxPQVQJCUdldExpc3RIZWlnaHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLQ0KLSAgICAgICAgQ0ZYX1B0ckFycmF5CW1fYXJySXRlbTsNCi0gICAgICAgIEZYX0ZMT0FUCQltX2ZNYXhMaXN0SGVpZ2h0Ow0KLSAgICAgICAgRlhfRkxPQVQJCW1fZkl0ZW1IZWlnaHQ7DQotICAgIH07DQotICAgIENGV0xfQ29tYm9Cb3hEUCBtX2NvbWJvQm94RGF0YTsNCi19Ow0KLWNsYXNzIENGV0xfQ29tYm9Cb3hJdGVtDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Db21ib0JveEl0ZW0oKQ0KLSAgICB7DQotICAgICAgICBtX3BESUIgPSBOVUxMOw0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorIHByb3RlY3RlZDoNCisgIGNsYXNzIENGV0xfQ29tYm9Cb3hEUCA6IHB1YmxpYyBJRldMX0NvbWJvQm94RFAgew0KKyAgIHB1YmxpYzoNCisgICAgQ0ZXTF9Db21ib0JveERQKCk7DQorICAgIH5DRldMX0NvbWJvQm94RFAoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pIHsNCisgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCi0gICAgQ0ZYX1JlY3RGCQltX3J0SXRlbTsNCi0gICAgRlhfRFdPUkQJCW1fZHdTdHlsZXM7DQotICAgIENGWF9XaWRlU3RyaW5nCW1fd3NUZXh0Ow0KLSAgICBDRlhfRElCaXRtYXAJKm1fcERJQjsNCi0gICAgRlhfRFdPUkQJCW1fZHdDaGVja1N0YXRlOw0KLSAgICBDRlhfUmVjdEYJCW1fcnRDaGVja0JveDsNCi0gICAgdm9pZCoJCW1fcERhdGE7DQorDQorICAgIHZpcnR1YWwgaW50MzJfdCBDb3VudEl0ZW1zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGV0xfSExJU1RJVEVNIEdldEl0ZW0oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIGludDMyX3QgbkluZGV4KTsNCisgICAgdmlydHVhbCBpbnQzMl90IEdldEl0ZW1JbmRleChJRldMX1dpZGdldCogcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCk7DQorDQorICAgIHZpcnR1YWwgRlhfRFdPUkQgR2V0SXRlbVN0eWxlcyhJRldMX1dpZGdldCogcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBHZXRJdGVtVGV4dChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldEl0ZW1SZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRJdGVtKTsNCisgICAgdmlydHVhbCB2b2lkKiBHZXRJdGVtRGF0YShJRldMX1dpZGdldCogcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldEl0ZW1UZXh0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pUZXh0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldEl0ZW1SZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJdGVtKTsNCisgICAgdmlydHVhbCBGWF9GTE9BVCBHZXRJdGVtSGVpZ2h0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEl0ZW1JY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBHZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0Q2hlY2spOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbUNoZWNrUmVjdChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydENoZWNrKTsNCisgICAgdmlydHVhbCBGWF9EV09SRCBHZXRJdGVtQ2hlY2tTdGF0ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldEl0ZW1DaGVja1N0YXRlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q2hlY2tTdGF0ZSk7DQorICAgIHZpcnR1YWwgRlhfRkxPQVQgR2V0TGlzdEhlaWdodChJRldMX1dpZGdldCogcFdpZGdldCk7DQorDQorICAgIENGWF9QdHJBcnJheSBtX2Fyckl0ZW07DQorICAgIEZYX0ZMT0FUIG1fZk1heExpc3RIZWlnaHQ7DQorICAgIEZYX0ZMT0FUIG1fZkl0ZW1IZWlnaHQ7DQorICB9Ow0KKyAgQ0ZXTF9Db21ib0JveERQIG1fY29tYm9Cb3hEYXRhOw0KK307DQorY2xhc3MgQ0ZXTF9Db21ib0JveEl0ZW0gew0KKyBwdWJsaWM6DQorICBDRldMX0NvbWJvQm94SXRlbSgpIHsNCisgICAgbV9wRElCID0gTlVMTDsNCisgICAgbV9wRGF0YSA9IE5VTEw7DQorICB9DQorICBDRlhfUmVjdEYgbV9ydEl0ZW07DQorICBGWF9EV09SRCBtX2R3U3R5bGVzOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1RleHQ7DQorICBDRlhfRElCaXRtYXAqIG1fcERJQjsNCisgIEZYX0RXT1JEIG1fZHdDaGVja1N0YXRlOw0KKyAgQ0ZYX1JlY3RGIG1fcnRDaGVja0JveDsNCisgIHZvaWQqIG1fcERhdGE7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvZGF0ZXRpbWVwaWNrZXIuaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9kYXRldGltZXBpY2tlci5oCmluZGV4IDEzZDIyM2MuLjIxYmRkNjEgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9kYXRldGltZXBpY2tlci5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9kYXRldGltZXBpY2tlci5oCkBAIC0xMSw0OCArMTEsNTEgQEAKIGNsYXNzIElGV0xfRGF0ZVRpbWVQaWNrZXJEUDsNCiBjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VyOw0KIGNsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXJEUDsNCi1jbGFzcyBDRldMX0RhdGVUaW1lUGlja2VyIDogcHVibGljIENGV0xfV2lkZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIENGV0xfRGF0ZVRpbWVQaWNrZXIqIENyZWF0ZSgpOw0KLSAgICBGV0xfRVJSCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyA9IE5VTEwpOw0KLSAgICBGV0xfRVJSIFNldFRvZGF5KGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KLSAgICBGV0xfRVJSCUdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICBGV0xfRVJSCVNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KTsNCi0gICAgaW50MzJfdCBDb3VudFNlbFJhbmdlcygpOw0KLSAgICBpbnQzMl90IEdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpOw0KLSAgICBGV0xfRVJSIEdldEN1clNlbChpbnQzMl90ICZpWWVhciwgaW50MzJfdCAmaU1vbnRoLCBpbnQzMl90ICZpRGF5KTsNCi0gICAgRldMX0VSUglTZXRDdXJTZWwoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSk7DQotICAgIEZYX0JPT0wJCUNhblVuZG8oKTsNCi0gICAgRlhfQk9PTAkJQ2FuUmVkbygpOw0KLSAgICBGWF9CT09MCQlVbmRvKCk7DQotICAgIEZYX0JPT0wJCVJlZG8oKTsNCi0gICAgRlhfQk9PTAkJQ2FuQ29weSgpOw0KLSAgICBGWF9CT09MCQlDYW5DdXQoKTsNCi0gICAgRlhfQk9PTAkJQ2FuU2VsZWN0QWxsKCk7DQotICAgIEZYX0JPT0wJCUNvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSk7DQotICAgIEZYX0JPT0wJCUN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpOw0KLSAgICBGWF9CT09MCQlQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSk7DQotICAgIEZYX0JPT0wJCVNlbGVjdEFsbCgpOw0KLSAgICBGWF9CT09MCQlEZWxldGUoKTsNCi0gICAgRlhfQk9PTAkJRGVTZWxlY3QoKTsNCi0gICAgRldMX0VSUgkJR2V0QkJveChDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICBGV0xfRVJSCQlTZXRFZGl0TGltaXQoaW50MzJfdCBuTGltaXQpOw0KLSAgICBGV0xfRVJSCQlNb2RpZnlFZGl0U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLCBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQotcHJvdGVjdGVkOg0KLSAgICBDRldMX0RhdGVUaW1lUGlja2VyKCk7DQotICAgIHZpcnR1YWwgfkNGV0xfRGF0ZVRpbWVQaWNrZXIoKTsNCi0gICAgY2xhc3MgQ0ZXTF9EYXRlVGltZVBpY2tlckRQIDogcHVibGljIElGV0xfRGF0ZVRpbWVQaWNrZXJEUA0KLSAgICB7DQotICAgIHB1YmxpYzoNCi0gICAgICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJEUCgpOw0KLSAgICAgICAgdmlydHVhbCBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pOw0KLSAgICAgICAgdmlydHVhbCBGV0xfRVJSIEdldFRvZGF5KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBpbnQzMl90ICZpWWVhciwgaW50MzJfdCAmaU1vbnRoLCBpbnQzMl90ICZpRGF5KTsNCi0gICAgICAgIGludDMyX3QgbV9pWWVhcjsNCi0gICAgICAgIGludDMyX3QgbV9pTW9udGg7DQotICAgICAgICBpbnQzMl90IG1faURheTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nCW1fd3NEYXRhOw0KLSAgICB9Ow0KLSAgICBDRldMX0RhdGVUaW1lUGlja2VyRFAgbV9EYXRlVGltZVBpY2tlckRQOw0KK2NsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXIgOiBwdWJsaWMgQ0ZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZXTF9EYXRlVGltZVBpY2tlciogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgRldMX0VSUiBTZXRUb2RheShpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KTsNCisgIEZXTF9FUlIgR2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBGV0xfRVJSIFNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KTsNCisgIGludDMyX3QgQ291bnRTZWxSYW5nZXMoKTsNCisgIGludDMyX3QgR2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCk7DQorICBGV0xfRVJSIEdldEN1clNlbChpbnQzMl90JiBpWWVhciwgaW50MzJfdCYgaU1vbnRoLCBpbnQzMl90JiBpRGF5KTsNCisgIEZXTF9FUlIgU2V0Q3VyU2VsKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KKyAgRlhfQk9PTCBDYW5VbmRvKCk7DQorICBGWF9CT09MIENhblJlZG8oKTsNCisgIEZYX0JPT0wgVW5kbygpOw0KKyAgRlhfQk9PTCBSZWRvKCk7DQorICBGWF9CT09MIENhbkNvcHkoKTsNCisgIEZYX0JPT0wgQ2FuQ3V0KCk7DQorICBGWF9CT09MIENhblNlbGVjdEFsbCgpOw0KKyAgRlhfQk9PTCBDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpOw0KKyAgRlhfQk9PTCBDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsNCisgIEZYX0JPT0wgUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpOw0KKyAgRlhfQk9PTCBTZWxlY3RBbGwoKTsNCisgIEZYX0JPT0wgRGVsZXRlKCk7DQorICBGWF9CT09MIERlU2VsZWN0KCk7DQorICBGV0xfRVJSIEdldEJCb3goQ0ZYX1JlY3RGJiByZWN0KTsNCisgIEZXTF9FUlIgU2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KTsNCisgIEZXTF9FUlIgTW9kaWZ5RWRpdFN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9EYXRlVGltZVBpY2tlcigpOw0KKyAgdmlydHVhbCB+Q0ZXTF9EYXRlVGltZVBpY2tlcigpOw0KKyAgY2xhc3MgQ0ZXTF9EYXRlVGltZVBpY2tlckRQIDogcHVibGljIElGV0xfRGF0ZVRpbWVQaWNrZXJEUCB7DQorICAgcHVibGljOg0KKyAgICBDRldMX0RhdGVUaW1lUGlja2VyRFAoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0VG9kYXkoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXkpOw0KKyAgICBpbnQzMl90IG1faVllYXI7DQorICAgIGludDMyX3QgbV9pTW9udGg7DQorICAgIGludDMyX3QgbV9pRGF5Ow0KKyAgICBDRlhfV2lkZVN0cmluZyBtX3dzRGF0YTsNCisgIH07DQorICBDRldMX0RhdGVUaW1lUGlja2VyRFAgbV9EYXRlVGltZVBpY2tlckRQOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2VkaXQuaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9lZGl0LmgKaW5kZXggMDZjMTA3Mi4uYTU0MDZlYyAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2VkaXQuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvZWRpdC5oCkBAIC05LDQ5ICs5LDUzIEBACiBjbGFzcyBDRldMX1dpZGdldDsNCiBjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7DQogY2xhc3MgQ0ZXTF9FZGl0Ow0KLWNsYXNzIENGV0xfRWRpdCA6IHB1YmxpYyBDRldMX1dpZGdldA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBDRldMX0VkaXQqIENyZWF0ZSgpOw0KLSAgICBGV0xfRVJSICAgICBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgPSBOVUxMKTsNCi0gICAgRldMX0VSUgkJU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCi0gICAgaW50MzJfdAlHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQotICAgIEZXTF9FUlIJCUdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBuU3RhcnQgPSAwLCBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdDsNCi0gICAgRldMX0VSUgkJQ2xlYXJUZXh0KCk7DQotICAgIGludDMyX3QJR2V0Q2FyZXRQb3MoKSBjb25zdDsNCi0gICAgaW50MzJfdAlTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlID0gVFJVRSk7DQotICAgIEZXTF9FUlIJCUFkZFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCi0gICAgaW50MzJfdAlDb3VudFNlbFJhbmdlcygpOw0KLSAgICBpbnQzMl90CUdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpOw0KLSAgICBGV0xfRVJSCQlDbGVhclNlbGVjdGlvbnMoKTsNCi0gICAgaW50MzJfdAlHZXRMaW1pdCgpOw0KLSAgICBGV0xfRVJSCQlTZXRMaW1pdChpbnQzMl90IG5MaW1pdCk7DQotICAgIEZXTF9FUlIJCVNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpOw0KLSAgICBGV0xfRVJSCQlTZXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRm9ybWF0KTsNCi0gICAgRldMX0VSUgkJSW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW4pOw0KLSAgICBGV0xfRVJSCQlEZWxldGVTZWxlY3Rpb25zKCk7DQotICAgIEZXTF9FUlIJCURlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCi0gICAgRldMX0VSUgkJUmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlcGxhY2UpOw0KLSAgICBGV0xfRVJSCQlSZXBsYWNlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5MZW4sIGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NSZXBsYWNlKTsNCi0gICAgRldMX0VSUgkJRG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKTsNCi0gICAgRlhfQk9PTAkJUmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCi0gICAgRlhfQk9PTAkJVW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCi0gICAgRldMX0VSUgkJU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoLCBGWF9CT09MIGJFcXVpZGlzdGFudCk7DQotICAgIEZXTF9FUlIJCVNldE51bWJlclJhbmdlKGludDMyX3QgaU1pbiwgaW50MzJfdCBpTWF4KTsNCi0gICAgRldMX0VSUiAgICAgU2V0QmFja0NvbG9yKEZYX0RXT1JEIGR3Q29sb3IpOw0KLSAgICBGV0xfRVJSICAgICBTZXRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZvbnQsIEZYX0ZMT0FUIGZTaXplKTsNCi0gICAgRlhfQk9PTAkJQ2FuVW5kbygpOw0KLSAgICBGWF9CT09MCQlDYW5SZWRvKCk7DQotICAgIEZYX0JPT0wJCVVuZG8oKTsNCi0gICAgRlhfQk9PTAkJUmVkbygpOw0KLSAgICBGWF9CT09MCQlDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpOw0KLSAgICBGWF9CT09MCQlDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCi0gICAgRlhfQk9PTAkJUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpOw0KLSAgICBGWF9CT09MCQlEZWxldGUoKTsNCi0gICAgdm9pZAkJU2V0U2Nyb2xsT2Zmc2V0KEZYX0ZMT0FUIGZTY3JvbGxPZmZzZXQpOw0KLSAgICBGWF9CT09MCQlHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KTsNCi0gICAgRlhfQk9PTAkJUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSk7DQotICAgIENGV0xfRWRpdCgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0VkaXQoKTsNCitjbGFzcyBDRldMX0VkaXQgOiBwdWJsaWMgQ0ZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZXTF9FZGl0KiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzID0gTlVMTCk7DQorICBGV0xfRVJSIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBpbnQzMl90IEdldFRleHRMZW5ndGgoKSBjb25zdDsNCisgIEZXTF9FUlIgR2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdDsNCisgIEZXTF9FUlIgQ2xlYXJUZXh0KCk7DQorICBpbnQzMl90IEdldENhcmV0UG9zKCkgY29uc3Q7DQorICBpbnQzMl90IFNldENhcmV0UG9zKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJCZWZvcmUgPSBUUlVFKTsNCisgIEZXTF9FUlIgQWRkU2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KKyAgaW50MzJfdCBDb3VudFNlbFJhbmdlcygpOw0KKyAgaW50MzJfdCBHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KTsNCisgIEZXTF9FUlIgQ2xlYXJTZWxlY3Rpb25zKCk7DQorICBpbnQzMl90IEdldExpbWl0KCk7DQorICBGV0xfRVJSIFNldExpbWl0KGludDMyX3QgbkxpbWl0KTsNCisgIEZXTF9FUlIgU2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdBbGlhcyk7DQorICBGV0xfRVJSIFNldEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQpOw0KKyAgRldMX0VSUiBJbnNlcnQoaW50MzJfdCBuU3RhcnQsIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsIGludDMyX3Qgbkxlbik7DQorICBGV0xfRVJSIERlbGV0ZVNlbGVjdGlvbnMoKTsNCisgIEZXTF9FUlIgRGVsZXRlUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KKyAgRldMX0VSUiBSZXBsYWNlU2VsZWN0aW9ucyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUmVwbGFjZSk7DQorICBGV0xfRVJSIFJlcGxhY2UoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NSZXBsYWNlKTsNCisgIEZXTF9FUlIgRG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKTsNCisgIEZYX0JPT0wgUmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCisgIEZYX0JPT0wgVW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCisgIEZXTF9FUlIgU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoLCBGWF9CT09MIGJFcXVpZGlzdGFudCk7DQorICBGV0xfRVJSIFNldE51bWJlclJhbmdlKGludDMyX3QgaU1pbiwgaW50MzJfdCBpTWF4KTsNCisgIEZXTF9FUlIgU2V0QmFja0NvbG9yKEZYX0RXT1JEIGR3Q29sb3IpOw0KKyAgRldMX0VSUiBTZXRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZvbnQsIEZYX0ZMT0FUIGZTaXplKTsNCisgIEZYX0JPT0wgQ2FuVW5kbygpOw0KKyAgRlhfQk9PTCBDYW5SZWRvKCk7DQorICBGWF9CT09MIFVuZG8oKTsNCisgIEZYX0JPT0wgUmVkbygpOw0KKyAgRlhfQk9PTCBDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpOw0KKyAgRlhfQk9PTCBDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsNCisgIEZYX0JPT0wgUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpOw0KKyAgRlhfQk9PTCBEZWxldGUoKTsNCisgIHZvaWQgU2V0U2Nyb2xsT2Zmc2V0KEZYX0ZMT0FUIGZTY3JvbGxPZmZzZXQpOw0KKyAgRlhfQk9PTCBHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkmIHNTdWdnZXN0KTsNCisgIEZYX0JPT0wgUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlcGxhY2UpOw0KKyAgQ0ZXTF9FZGl0KCk7DQorICB2aXJ0dWFsIH5DRldMX0VkaXQoKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9saXN0Ym94LmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvbGlzdGJveC5oCmluZGV4IGQwOTVlMGUuLmU1ZjMxYmQgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9saXN0Ym94LmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2xpc3Rib3guaApAQCAtMTEsODggKzExLDEwNiBAQAogY2xhc3MgSUZXTF9MaXN0Qm94RFA7DQogY2xhc3MgQ0ZXTF9MaXN0Qm94Ow0KIGNsYXNzIENGV0xfTGlzdEl0ZW07DQotY2xhc3MgQ0ZXTF9MaXN0Qm94IDogcHVibGljIENGV0xfV2lkZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIENGV0xfTGlzdEJveCogQ3JlYXRlKCk7DQotICAgIEZXTF9FUlIJCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyA9IE5VTEwpOw0KLSAgICBGV0xfRVJSCQlBZGRESUJpdG1hcChDRlhfRElCaXRtYXAgKiBwRElCLCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCi0gICAgRldMX0hMSVNUSVRFTQlBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0FkZCwgRlhfQk9PTCBiU2VsZWN0ID0gRkFMU0UpOw0KLSAgICBGWF9CT09MCQlEZWxldGVTdHJpbmcoRldMX0hMSVNUSVRFTSBoSXRlbSk7DQotICAgIEZYX0JPT0wJCURlbGV0ZUFsbCgpOw0KLSAgICBpbnQzMl90CUNvdW50U2VsSXRlbXMoKTsNCi0gICAgRldMX0hMSVNUSVRFTQlHZXRTZWxJdGVtKGludDMyX3QgbkluZGV4U2VsKTsNCi0gICAgaW50MzJfdAlHZXRTZWxJbmRleChpbnQzMl90IG5JbmRleCk7DQotICAgIEZXTF9FUlIJCVNldFNlbEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2VsZWN0ID0gVFJVRSk7DQotICAgIEZXTF9FUlIJCUdldEl0ZW1UZXh0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICBGV0xfRVJSCQlHZXRTY3JvbGxQb3MoRlhfRkxPQVQgJmZQb3MsIEZYX0JPT0wgYlZlcnQgPSBUUlVFKTsNCi0gICAgRldMX0VSUgkJU2V0SXRlbUhlaWdodChGWF9GTE9BVCBmSXRlbUhlaWdodCk7DQotICAgIEZXTF9ITElTVElURU0JR2V0Rm9jdXNJdGVtKCk7DQotICAgIEZXTF9FUlIJCVNldEZvY3VzSXRlbShGV0xfSExJU1RJVEVNIGhJdGVtKTsNCi0gICAgRldMX0VSUioJU29ydChJRldMX0xpc3RCb3hDb21wYXJlICpwQ29tKTsNCi0gICAgaW50MzJfdAlDb3VudEl0ZW1zKCk7DQotICAgIEZXTF9ITElTVElURU0JR2V0SXRlbShpbnQzMl90IG5JbmRleCk7DQotICAgIEZXTF9FUlIJCVNldEl0ZW1TdHJpbmcoRldMX0hMSVNUSVRFTSBoSXRlbSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RleHQpOw0KLSAgICBGV0xfRVJSCQlHZXRJdGVtU3RyaW5nKEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICBGV0xfRVJSCQlTZXRJdGVtRGF0YShGV0xfSExJU1RJVEVNIGhJdGVtLCB2b2lkKiBwRGF0YSk7DQotICAgIHZvaWQqCUdldEl0ZW1EYXRhKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KLSAgICBGV0xfSExJU1RJVEVNCUdldEl0ZW1BdFBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIEZYX0RXT1JECQlHZXRJdGVtU3RhdGVzKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KLSAgICBDRldMX0xpc3RCb3goKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9MaXN0Qm94KCk7DQotcHJvdGVjdGVkOg0KLSAgICBjbGFzcyBDRldMX0xpc3RCb3hEUCA6IHB1YmxpYyBJRldMX0xpc3RCb3hEUA0KLSAgICB7DQotICAgIHB1YmxpYzoNCi0gICAgICAgIENGV0xfTGlzdEJveERQKCk7DQotICAgICAgICB+Q0ZXTF9MaXN0Qm94RFAoKTsNCi0gICAgICAgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKTsNCitjbGFzcyBDRldMX0xpc3RCb3ggOiBwdWJsaWMgQ0ZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZXTF9MaXN0Qm94KiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzID0gTlVMTCk7DQorICBGV0xfRVJSIEFkZERJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQiwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICBGV0xfSExJU1RJVEVNIEFkZFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQWRkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ID0gRkFMU0UpOw0KKyAgRlhfQk9PTCBEZWxldGVTdHJpbmcoRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICBGWF9CT09MIERlbGV0ZUFsbCgpOw0KKyAgaW50MzJfdCBDb3VudFNlbEl0ZW1zKCk7DQorICBGV0xfSExJU1RJVEVNIEdldFNlbEl0ZW0oaW50MzJfdCBuSW5kZXhTZWwpOw0KKyAgaW50MzJfdCBHZXRTZWxJbmRleChpbnQzMl90IG5JbmRleCk7DQorICBGV0xfRVJSIFNldFNlbEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2VsZWN0ID0gVFJVRSk7DQorICBGV0xfRVJSIEdldEl0ZW1UZXh0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgRldMX0VSUiBHZXRTY3JvbGxQb3MoRlhfRkxPQVQmIGZQb3MsIEZYX0JPT0wgYlZlcnQgPSBUUlVFKTsNCisgIEZXTF9FUlIgU2V0SXRlbUhlaWdodChGWF9GTE9BVCBmSXRlbUhlaWdodCk7DQorICBGV0xfSExJU1RJVEVNIEdldEZvY3VzSXRlbSgpOw0KKyAgRldMX0VSUiBTZXRGb2N1c0l0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICBGV0xfRVJSKiBTb3J0KElGV0xfTGlzdEJveENvbXBhcmUqIHBDb20pOw0KKyAgaW50MzJfdCBDb3VudEl0ZW1zKCk7DQorICBGV0xfSExJU1RJVEVNIEdldEl0ZW0oaW50MzJfdCBuSW5kZXgpOw0KKyAgRldMX0VSUiBTZXRJdGVtU3RyaW5nKEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KTsNCisgIEZXTF9FUlIgR2V0SXRlbVN0cmluZyhGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIEZXTF9FUlIgU2V0SXRlbURhdGEoRldMX0hMSVNUSVRFTSBoSXRlbSwgdm9pZCogcERhdGEpOw0KKyAgdm9pZCogR2V0SXRlbURhdGEoRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICBGV0xfSExJU1RJVEVNIEdldEl0ZW1BdFBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICBGWF9EV09SRCBHZXRJdGVtU3RhdGVzKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgQ0ZXTF9MaXN0Qm94KCk7DQorICB2aXJ0dWFsIH5DRldMX0xpc3RCb3goKTsNCiANCi0gICAgICAgIHZpcnR1YWwJaW50MzJfdAkJQ291bnRJdGVtcyhJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgICAgICB2aXJ0dWFsCUZXTF9ITElTVElURU0JR2V0SXRlbShJRldMX1dpZGdldCAqcFdpZGdldCwgaW50MzJfdCBuSW5kZXgpOw0KLSAgICAgICAgdmlydHVhbAlpbnQzMl90CQlHZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pOw0KLSAgICAgICAgdmlydHVhbCBGWF9CT09MCQkJU2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBpbnQzMl90IG5JbmRleCk7DQorIHByb3RlY3RlZDoNCisgIGNsYXNzIENGV0xfTGlzdEJveERQIDogcHVibGljIElGV0xfTGlzdEJveERQIHsNCisgICBwdWJsaWM6DQorICAgIENGV0xfTGlzdEJveERQKCk7DQorICAgIH5DRldMX0xpc3RCb3hEUCgpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2FwdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbik7DQogDQotICAgICAgICB2aXJ0dWFsCUZYX0RXT1JECQlHZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCi0gICAgICAgIHZpcnR1YWwJRldMX0VSUgkJCUdldEl0ZW1UZXh0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCi0gICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCUdldEl0ZW1SZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfUmVjdEYgJnJ0SXRlbSk7DQotICAgICAgICB2aXJ0dWFsIHZvaWQqCQlHZXRJdGVtRGF0YShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIHZpcnR1YWwgaW50MzJfdCBDb3VudEl0ZW1zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGV0xfSExJU1RJVEVNIEdldEl0ZW0oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIGludDMyX3QgbkluZGV4KTsNCisgICAgdmlydHVhbCBpbnQzMl90IEdldEl0ZW1JbmRleChJRldMX1dpZGdldCogcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCk7DQogDQotICAgICAgICB2aXJ0dWFsCUZXTF9FUlIJCQlTZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9EV09SRCBkd1N0eWxlKTsNCi0gICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCVNldEl0ZW1UZXh0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBjb25zdCBGWF9XQ0hBUiogcHN6VGV4dCk7DQotICAgICAgICB2aXJ0dWFsIEZXTF9FUlIJCQlTZXRJdGVtUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgY29uc3QgQ0ZYX1JlY3RGICZydEl0ZW0pOw0KLSAgICAgICAgdmlydHVhbCBGWF9GTE9BVAkJR2V0SXRlbUhlaWdodChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgICAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCoJR2V0SXRlbUljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pOw0KLSAgICAgICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0SXRlbUNoZWNrUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1JlY3RGJiBydENoZWNrKTsNCi0gICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCVNldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IENGWF9SZWN0RiYgcnRDaGVjayk7DQotICAgICAgICB2aXJ0dWFsCUZYX0RXT1JECQlHZXRJdGVtQ2hlY2tTdGF0ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQotICAgICAgICB2aXJ0dWFsCUZXTF9FUlIJCQlTZXRJdGVtQ2hlY2tTdGF0ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfRFdPUkQgZHdDaGVja1N0YXRlKTsNCisgICAgdmlydHVhbCBGWF9EV09SRCBHZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldEl0ZW1UZXh0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydEl0ZW0pOw0KKyAgICB2aXJ0dWFsIHZvaWQqIEdldEl0ZW1EYXRhKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCiANCi0gICAgICAgIENGWF9QdHJBcnJheQltX2Fyckl0ZW07DQotICAgICAgICBDRlhfV2lkZVN0cmluZwltX3dzRGF0YTsNCi0gICAgICAgIEZYX0ZMT0FUCQltX2ZJdGVtSGVpZ2h0Ow0KLSAgICB9Ow0KLSAgICBDRldMX0xpc3RCb3hEUCBtX0xpc3RCb3hEUDsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbVRleHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelRleHQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0pOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEl0ZW1IZWlnaHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogR2V0SXRlbUljb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRDaGVjayk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2hlY2spOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JEIEdldEl0ZW1DaGVja1N0YXRlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDaGVja1N0YXRlKTsNCisNCisgICAgQ0ZYX1B0ckFycmF5IG1fYXJySXRlbTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgbV93c0RhdGE7DQorICAgIEZYX0ZMT0FUIG1fZkl0ZW1IZWlnaHQ7DQorICB9Ow0KKyAgQ0ZXTF9MaXN0Qm94RFAgbV9MaXN0Qm94RFA7DQogfTsNCi1jbGFzcyBDRldMX0xpc3RJdGVtDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9MaXN0SXRlbSgpDQotICAgIHsNCi0gICAgICAgIG1fcnRJdGVtLlJlc2V0KCk7DQotICAgICAgICBtX2R3U3RhdGVzID0gMDsNCi0gICAgICAgIG1fd3NUZXh0ID0gTCIiOw0KLSAgICAgICAgbV9wRElCID0gTlVMTDsNCi0gICAgICAgIG1fcERhdGEgPSBOVUxMOw0KLSAgICAgICAgbV9kd0NoZWNrU3RhdGUgPSAwOw0KLSAgICAgICAgbV9ydENoZWNrQm94LlJlc2V0KCk7DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGCQltX3J0SXRlbTsNCi0gICAgRlhfRFdPUkQJCW1fZHdTdGF0ZXM7DQotICAgIENGWF9XaWRlU3RyaW5nCW1fd3NUZXh0Ow0KLSAgICBDRlhfRElCaXRtYXAJKm1fcERJQjsNCi0gICAgdm9pZCoJCW1fcERhdGE7DQotICAgIEZYX0RXT1JECQltX2R3Q2hlY2tTdGF0ZTsNCi0gICAgQ0ZYX1JlY3RGCQltX3J0Q2hlY2tCb3g7DQorY2xhc3MgQ0ZXTF9MaXN0SXRlbSB7DQorIHB1YmxpYzoNCisgIENGV0xfTGlzdEl0ZW0oKSB7DQorICAgIG1fcnRJdGVtLlJlc2V0KCk7DQorICAgIG1fZHdTdGF0ZXMgPSAwOw0KKyAgICBtX3dzVGV4dCA9IEwiIjsNCisgICAgbV9wRElCID0gTlVMTDsNCisgICAgbV9wRGF0YSA9IE5VTEw7DQorICAgIG1fZHdDaGVja1N0YXRlID0gMDsNCisgICAgbV9ydENoZWNrQm94LlJlc2V0KCk7DQorICB9DQorICBDRlhfUmVjdEYgbV9ydEl0ZW07DQorICBGWF9EV09SRCBtX2R3U3RhdGVzOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1RleHQ7DQorICBDRlhfRElCaXRtYXAqIG1fcERJQjsNCisgIHZvaWQqIG1fcERhdGE7DQorICBGWF9EV09SRCBtX2R3Q2hlY2tTdGF0ZTsNCisgIENGWF9SZWN0RiBtX3J0Q2hlY2tCb3g7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5oIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3BpY3R1cmVib3guaAppbmRleCBkMTVjMjUxLi42M2Q2ODFlIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9waWN0dXJlYm94LmgKQEAgLTExLDU1ICsxMSw1MyBAQAogY2xhc3MgSUZXTF9QaWN0dXJlQm94RFA7DQogY2xhc3MgQ0ZXTF9QaWN0dXJlQm94Ow0KIGNsYXNzIENGV0xfUGljdHVyZUJveERQOw0KLWNsYXNzIENGV0xfUGljdHVyZUJveCA6IHB1YmxpYyBDRldMX1dpZGdldA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBDRldMX1BpY3R1cmVCb3gqIENyZWF0ZSgpOw0KLSAgICBGV0xfRVJSCQkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzID0gTlVMTCk7DQotICAgIENGWF9ESUJpdG1hcCoJR2V0UGljdHVyZSgpOw0KLSAgICBGV0xfRVJSCQkJU2V0UGljdHVyZShDRlhfRElCaXRtYXAgKnBCaXRtYXApOw0KLSAgICBGWF9GTE9BVAkJR2V0Um90YXRpb24oKTsNCi0gICAgRldMX0VSUgkJCVNldFJvdGF0aW9uKEZYX0ZMT0FUIGZSb3RhdGlvbik7DQotICAgIGludDMyX3QJCUdldEZsaXBNb2RlKCk7DQotICAgIEZXTF9FUlIJCQlTZXRGbGlwTW9kZShpbnQzMl90IGlGbGlwTW9kZSk7DQotICAgIGludDMyX3QJCUdldE9wYWNpdHkoKTsNCi0gICAgRldMX0VSUgkJCVNldE9wYWNpdHkoaW50MzJfdCBpT3BhY2l0eSk7DQotICAgIEZXTF9FUlIJCQlHZXRTY2FsZShGWF9GTE9BVCAmZlNjYWxlWCwgRlhfRkxPQVQgJmZTY2FsZVkpOw0KLSAgICBGV0xfRVJSCQkJU2V0U2NhbGUoRlhfRkxPQVQgZlNjYWxlWCwgRlhfRkxPQVQgZlNjYWxlWSk7DQotICAgIEZXTF9FUlIJCQlHZXRPZmZzZXQoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpOw0KLSAgICBGV0xfRVJSCQkJU2V0T2Zmc2V0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIENGV0xfUGljdHVyZUJveCgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX1BpY3R1cmVCb3goKTsNCi1wcm90ZWN0ZWQ6DQotICAgIGNsYXNzIENGV0xfUGljdHVyZUJveERQIDogcHVibGljIElGV0xfUGljdHVyZUJveERQDQotICAgIHsNCi0gICAgcHVibGljOg0KLSAgICAgICAgQ0ZXTF9QaWN0dXJlQm94RFAoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1fZlJvdGF0aW9uID0gMC4wZjsNCi0gICAgICAgICAgICBtX2ZTY2FsZVggPSAxLjBmOw0KLSAgICAgICAgICAgIG1fZlNjYWxlWSA9IDEuMGY7DQotICAgICAgICAgICAgbV9mT2ZmU2V0WCA9IDAuMGY7DQotICAgICAgICAgICAgbV9mT2ZmU2V0WSA9IDAuMGY7DQotICAgICAgICAgICAgbV9wQml0bWFwID0gTlVMTDsNCi0gICAgICAgIH07DQotICAgICAgICB2aXJ0dWFsIEZXTF9FUlIJCQlHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKTsNCi0gICAgICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKglHZXRQaWN0dXJlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKglHZXRFcnJvclBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICAgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqCUdldEluaXRpYWxQaWN0dXJlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0T3BhY2l0eShJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgICAgICB2aXJ0dWFsIGludDMyX3QJCUdldEZsaXBNb2RlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgICAgIHZpcnR1YWwgRldMX0VSUgkJCUdldE1hdHJpeChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX01hdHJpeCAmbWF0cml4KTsNCi0gICAgICAgIENGWF9ESUJpdG1hcAkqbV9wQml0bWFwOw0KLSAgICAgICAgaW50MzJfdAkJbV9pT3BhY2l0eTsNCi0gICAgICAgIGludDMyX3QJCW1faUZsaXBNb2RlOw0KLSAgICAgICAgRlhfRkxPQVQJCW1fZlJvdGF0aW9uOw0KLSAgICAgICAgRlhfRkxPQVQJCW1fZlNjYWxlWDsNCi0gICAgICAgIEZYX0ZMT0FUCQltX2ZTY2FsZVk7DQotICAgICAgICBGWF9GTE9BVAkJbV9mT2ZmU2V0WDsNCi0gICAgICAgIEZYX0ZMT0FUCQltX2ZPZmZTZXRZOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcJbV93c0RhdGE7DQorY2xhc3MgQ0ZXTF9QaWN0dXJlQm94IDogcHVibGljIENGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIENGV0xfUGljdHVyZUJveCogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgQ0ZYX0RJQml0bWFwKiBHZXRQaWN0dXJlKCk7DQorICBGV0xfRVJSIFNldFBpY3R1cmUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsNCisgIEZYX0ZMT0FUIEdldFJvdGF0aW9uKCk7DQorICBGV0xfRVJSIFNldFJvdGF0aW9uKEZYX0ZMT0FUIGZSb3RhdGlvbik7DQorICBpbnQzMl90IEdldEZsaXBNb2RlKCk7DQorICBGV0xfRVJSIFNldEZsaXBNb2RlKGludDMyX3QgaUZsaXBNb2RlKTsNCisgIGludDMyX3QgR2V0T3BhY2l0eSgpOw0KKyAgRldMX0VSUiBTZXRPcGFjaXR5KGludDMyX3QgaU9wYWNpdHkpOw0KKyAgRldMX0VSUiBHZXRTY2FsZShGWF9GTE9BVCYgZlNjYWxlWCwgRlhfRkxPQVQmIGZTY2FsZVkpOw0KKyAgRldMX0VSUiBTZXRTY2FsZShGWF9GTE9BVCBmU2NhbGVYLCBGWF9GTE9BVCBmU2NhbGVZKTsNCisgIEZXTF9FUlIgR2V0T2Zmc2V0KEZYX0ZMT0FUJiBmeCwgRlhfRkxPQVQmIGZ5KTsNCisgIEZXTF9FUlIgU2V0T2Zmc2V0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICBDRldMX1BpY3R1cmVCb3goKTsNCisgIHZpcnR1YWwgfkNGV0xfUGljdHVyZUJveCgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBjbGFzcyBDRldMX1BpY3R1cmVCb3hEUCA6IHB1YmxpYyBJRldMX1BpY3R1cmVCb3hEUCB7DQorICAgcHVibGljOg0KKyAgICBDRldMX1BpY3R1cmVCb3hEUCgpIHsNCisgICAgICBtX2ZSb3RhdGlvbiA9IDAuMGY7DQorICAgICAgbV9mU2NhbGVYID0gMS4wZjsNCisgICAgICBtX2ZTY2FsZVkgPSAxLjBmOw0KKyAgICAgIG1fZk9mZlNldFggPSAwLjBmOw0KKyAgICAgIG1fZk9mZlNldFkgPSAwLjBmOw0KKyAgICAgIG1fcEJpdG1hcCA9IE5VTEw7DQogICAgIH07DQotICAgIENGV0xfUGljdHVyZUJveERQIG1fUGljdHVyZUJveERQOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2FwdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbik7DQorICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRQaWN0dXJlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEVycm9yUGljdHVyZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRJbml0aWFsUGljdHVyZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICAgIHZpcnR1YWwgaW50MzJfdCBHZXRPcGFjaXR5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBpbnQzMl90IEdldEZsaXBNb2RlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldE1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX01hdHJpeCYgbWF0cml4KTsNCisgICAgQ0ZYX0RJQml0bWFwKiBtX3BCaXRtYXA7DQorICAgIGludDMyX3QgbV9pT3BhY2l0eTsNCisgICAgaW50MzJfdCBtX2lGbGlwTW9kZTsNCisgICAgRlhfRkxPQVQgbV9mUm90YXRpb247DQorICAgIEZYX0ZMT0FUIG1fZlNjYWxlWDsNCisgICAgRlhfRkxPQVQgbV9mU2NhbGVZOw0KKyAgICBGWF9GTE9BVCBtX2ZPZmZTZXRYOw0KKyAgICBGWF9GTE9BVCBtX2ZPZmZTZXRZOw0KKyAgICBDRlhfV2lkZVN0cmluZyBtX3dzRGF0YTsNCisgIH07DQorICBDRldMX1BpY3R1cmVCb3hEUCBtX1BpY3R1cmVCb3hEUDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9wdXNoYnV0dG9uLmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvcHVzaGJ1dHRvbi5oCmluZGV4IGZlYjk0NTAuLmU3MDIzYzcgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9wdXNoYnV0dG9uLmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3B1c2hidXR0b24uaApAQCAtMTEsMjcgKzExLDI2IEBACiBjbGFzcyBJRldMX1B1c2hCdXR0b25EUDsNCiBjbGFzcyBDRldMX1B1c2hCdXR0b247DQogY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uRFA7DQotY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uIDogcHVibGljIENGV0xfV2lkZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIENGV0xfUHVzaEJ1dHRvbiogQ3JlYXRlKCk7DQotICAgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzID0gTlVMTCk7DQotICAgIEZXTF9FUlIJR2V0Q2FwdGlvbihDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKTsNCi0gICAgRldMX0VSUiBTZXRDYXB0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDYXB0aW9uKTsNCi0gICAgQ0ZYX0RJQml0bWFwKglHZXRQaWN0dXJlKCk7DQotICAgIEZXTF9FUlIJCQlTZXRQaWN0dXJlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCk7DQotICAgIENGV0xfUHVzaEJ1dHRvbigpOw0KLSAgICB2aXJ0dWFsIH5DRldMX1B1c2hCdXR0b24oKTsNCi1wcm90ZWN0ZWQ6DQotICAgIGNsYXNzIENGV0xfUHVzaEJ1dHRvbkRQIDogcHVibGljIElGV0xfUHVzaEJ1dHRvbkRQDQotICAgIHsNCi0gICAgcHVibGljOg0KLSAgICAgICAgQ0ZXTF9QdXNoQnV0dG9uRFAoKTogbV9wQml0bWFwKE5VTEwpIHt9DQotICAgICAgICBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pOw0KLSAgICAgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqCUdldFBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgbV93c0NhcHRpb247DQotICAgICAgICBDRlhfRElCaXRtYXAJKm1fcEJpdG1hcDsNCi0gICAgfTsNCi0gICAgQ0ZXTF9QdXNoQnV0dG9uRFAgbV9idXR0b25EYXRhOw0KK2NsYXNzIENGV0xfUHVzaEJ1dHRvbiA6IHB1YmxpYyBDRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRldMX1B1c2hCdXR0b24qIENyZWF0ZSgpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMgPSBOVUxMKTsNCisgIEZXTF9FUlIgR2V0Q2FwdGlvbihDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKTsNCisgIEZXTF9FUlIgU2V0Q2FwdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbik7DQorICBDRlhfRElCaXRtYXAqIEdldFBpY3R1cmUoKTsNCisgIEZXTF9FUlIgU2V0UGljdHVyZShDRlhfRElCaXRtYXAqIHBCaXRtYXApOw0KKyAgQ0ZXTF9QdXNoQnV0dG9uKCk7DQorICB2aXJ0dWFsIH5DRldMX1B1c2hCdXR0b24oKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uRFAgOiBwdWJsaWMgSUZXTF9QdXNoQnV0dG9uRFAgew0KKyAgIHB1YmxpYzoNCisgICAgQ0ZXTF9QdXNoQnV0dG9uRFAoKSA6IG1fcEJpdG1hcChOVUxMKSB7fQ0KKyAgICBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pOw0KKyAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogR2V0UGljdHVyZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICAgIENGWF9XaWRlU3RyaW5nIG1fd3NDYXB0aW9uOw0KKyAgICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsNCisgIH07DQorICBDRldMX1B1c2hCdXR0b25EUCBtX2J1dHRvbkRhdGE7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvc2Nyb2xsYmFyLmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvc2Nyb2xsYmFyLmgKaW5kZXggNWFhYmQ1Ni4uOGEyOTlhNiAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3Njcm9sbGJhci5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9zY3JvbGxiYXIuaApAQCAtOSwyNCArOSwyMyBAQAogY2xhc3MgQ0ZXTF9XaWRnZXQ7DQogY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KIGNsYXNzIENGV0xfU2Nyb2xsQmFyOw0KLWNsYXNzIENGV0xfU2Nyb2xsQmFyIDogcHVibGljIENGV0xfV2lkZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIENGV0xfU2Nyb2xsQmFyKiBDcmVhdGUoKTsNCi0gICAgRldMX0VSUgkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzID0gTlVMTCk7DQotICAgIEZYX0JPT0wJCUlzVmVydGljYWwoKTsNCi0gICAgRldMX0VSUgkJR2V0UmFuZ2UoRlhfRkxPQVQgJmZNaW4sIEZYX0ZMT0FUICZmTWF4KTsNCi0gICAgRldMX0VSUgkJU2V0UmFuZ2UoRlhfRkxPQVQgZk1pbiwgRlhfRkxPQVQgZk1heCk7DQotICAgIEZYX0ZMT0FUCUdldFBhZ2VTaXplKCk7DQotICAgIEZXTF9FUlIJCVNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSk7DQotICAgIEZYX0ZMT0FUCUdldFN0ZXBTaXplKCk7DQotICAgIEZXTF9FUlIJCVNldFN0ZXBTaXplKEZYX0ZMT0FUIGZTdGVwU2l6ZSk7DQotICAgIEZYX0ZMT0FUCUdldFBvcygpOw0KLSAgICBGV0xfRVJSCQlTZXRQb3MoRlhfRkxPQVQgZlBvcyk7DQotICAgIEZYX0ZMT0FUCUdldFRyYWNrUG9zKCk7DQotICAgIEZXTF9FUlIJCVNldFRyYWNrUG9zKEZYX0ZMT0FUIGZUcmFja1Bvcyk7DQotICAgIEZYX0JPT0wJCURvU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcyA9IDAuMGYpOw0KLSAgICBDRldMX1Njcm9sbEJhcigpOw0KLSAgICB2aXJ0dWFsIH5DRldMX1Njcm9sbEJhcigpOw0KK2NsYXNzIENGV0xfU2Nyb2xsQmFyIDogcHVibGljIENGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIENGV0xfU2Nyb2xsQmFyKiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzID0gTlVMTCk7DQorICBGWF9CT09MIElzVmVydGljYWwoKTsNCisgIEZXTF9FUlIgR2V0UmFuZ2UoRlhfRkxPQVQmIGZNaW4sIEZYX0ZMT0FUJiBmTWF4KTsNCisgIEZXTF9FUlIgU2V0UmFuZ2UoRlhfRkxPQVQgZk1pbiwgRlhfRkxPQVQgZk1heCk7DQorICBGWF9GTE9BVCBHZXRQYWdlU2l6ZSgpOw0KKyAgRldMX0VSUiBTZXRQYWdlU2l6ZShGWF9GTE9BVCBmUGFnZVNpemUpOw0KKyAgRlhfRkxPQVQgR2V0U3RlcFNpemUoKTsNCisgIEZXTF9FUlIgU2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKTsNCisgIEZYX0ZMT0FUIEdldFBvcygpOw0KKyAgRldMX0VSUiBTZXRQb3MoRlhfRkxPQVQgZlBvcyk7DQorICBGWF9GTE9BVCBHZXRUcmFja1BvcygpOw0KKyAgRldMX0VSUiBTZXRUcmFja1BvcyhGWF9GTE9BVCBmVHJhY2tQb3MpOw0KKyAgRlhfQk9PTCBEb1Njcm9sbChGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MgPSAwLjBmKTsNCisgIENGV0xfU2Nyb2xsQmFyKCk7DQorICB2aXJ0dWFsIH5DRldMX1Njcm9sbEJhcigpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3RoZW1lLmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdGhlbWUuaAppbmRleCA5YzM2YWI1Li5mNTk0NWYzIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdGhlbWUuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdGhlbWUuaApAQCAtMTIsMjggKzEyLDM2IEBACiBjbGFzcyBDRldMX1dpZGdldFRQOw0KIGNsYXNzIElGV0xfV2lkZ2V0Ow0KIGNsYXNzIENGV0xfVGhlbWU7DQotY2xhc3MgQ0ZXTF9UaGVtZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJU2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRFdPUkQgZHdUaGVtZUlELCBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfTWF0cml4ICZtYXRyaXgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3VGV4dChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcyk7DQotICAgIHZpcnR1YWwgdm9pZCogICBHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNDdXN0b21pemVkTGF5b3V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwgQ0ZYX1JlY3RGICZydFBhcnQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzSW5QYXJ0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsCUZYX0JPT0wJCUNhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcywgQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCi0gICAgQ0ZXTF9UaGVtZSgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX1RoZW1lKCk7DQotICAgIEZXTF9FUlIJCVNldEZvbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IEZYX1dDSEFSKiBzdHJGb250LCBGWF9GTE9BVCBmRm9udFNpemUsIEZYX0FSR0IgcmdiRm9udCk7DQotICAgIENGV0xfV2lkZ2V0VFAqIEdldFRoZW1lKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGWF9QdHJBcnJheQltX2FyclRoZW1lczsNCitjbGFzcyBDRldMX1RoZW1lIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgU2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RoZW1lSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX01hdHJpeCYgbWF0cml4KTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3VGV4dChDRldMX1RoZW1lVGV4dCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBDRlhfUmVjdEYmIHJ0UGFydCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNJblBhcnQoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCogcFBhcmFtcywgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIENGV0xfVGhlbWUoKTsNCisgIHZpcnR1YWwgfkNGV0xfVGhlbWUoKTsNCisgIEZXTF9FUlIgU2V0Rm9udChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3RyRm9udCwNCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgRlhfQVJHQiByZ2JGb250KTsNCisgIENGV0xfV2lkZ2V0VFAqIEdldFRoZW1lKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1B0ckFycmF5IG1fYXJyVGhlbWVzOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3Rvb2x0aXBjdHJsLmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuaAppbmRleCA3MDMyODM5Li5jZjJlZDdiIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuaApAQCAtMTEsNDQgKzExLDQzIEBACiBjbGFzcyBJRldMX1Rvb2xUaXBEUDsNCiBjbGFzcyBDRldMX1Rvb2xUaXA7DQogY2xhc3MgQ0ZXTF9Ub29sVGlwRFA7DQotY2xhc3MgQ0ZXTF9Ub29sVGlwIDogcHVibGljIENGV0xfV2lkZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIENGV0xfVG9vbFRpcCogQ3JlYXRlKCk7DQotICAgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCQlHZXRDYXB0aW9uKENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pOw0KLSAgICBGV0xfRVJSCQkJU2V0Q2FwdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbik7DQotICAgIGludDMyX3QJIAlHZXRJbml0aWFsRGVsYXkoKTsNCi0gICAgaW50MzJfdAkgCVNldEluaXRpYWxEZWxheShpbnQzMl90IG5EZWxheVRpbWUpOw0KLSAgICBpbnQzMl90CSAJR2V0QXV0b1BvcERlbGF5KCk7DQotICAgIGludDMyX3QJIAlTZXRBdXRvUG9wRGVsYXkoaW50MzJfdCBuRGVsYXlUaW1lKTsNCi0gICAgQ0ZYX0RJQml0bWFwKglHZXRUb29sVGlwSWNvbigpOw0KLSAgICBGV0xfRVJSCQkJU2V0VG9vbFRpcEljb24oQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsNCi0gICAgQ0ZYX1NpemVGCQlHZXRUb29sVGlwSWNvblNpemUoKTsNCi0gICAgRldMX0VSUgkJCVNldFRvb2xUaXBJY29uU2l6ZSggQ0ZYX1NpemVGIGZTaXplKTsNCi0gICAgRldMX0VSUgkJU2V0QW5jaG9yKGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IpOw0KLSAgICBGV0xfRVJSCQlTaG93KCk7DQotICAgIEZXTF9FUlIJCUhpZGUoKTsNCi0gICAgQ0ZXTF9Ub29sVGlwKCk7DQotICAgIHZpcnR1YWwgfkNGV0xfVG9vbFRpcCgpOw0KLXByb3RlY3RlZDoNCi0gICAgY2xhc3MgQ0ZXTF9Ub29sVGlwRFAgOiBwdWJsaWMgSUZXTF9Ub29sVGlwRFANCi0gICAgew0KLSAgICBwdWJsaWM6DQotICAgICAgICBDRldMX1Rvb2xUaXBEUCgpOw0KLSAgICAgICAgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKTsNCi0gICAgICAgIGludDMyX3QJIAlHZXRJbml0aWFsRGVsYXkoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICAgICAgaW50MzJfdAkgCUdldEF1dG9Qb3BEZWxheShJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgICAgICBDRlhfRElCaXRtYXAqCUdldFRvb2xUaXBJY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgICAgIENGWF9TaXplRgkJR2V0VG9vbFRpcEljb25TaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgICAgIENGWF9SZWN0RgkJR2V0QW5jaG9yKCk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZwltX3dzQ2FwdGlvbjsNCi0gICAgICAgIGludDMyX3QJCW1fbkluaXREZWxheVRpbWU7DQotICAgICAgICBpbnQzMl90CQltX25BdXRvUG9wRGVsYXlUaW1lOw0KLSAgICAgICAgQ0ZYX0RJQml0bWFwKgltX3BCaXRtYXA7DQotICAgICAgICBDRlhfU2l6ZUYJCW1fZkljb25TaXplOw0KLSAgICAgICAgQ0ZYX1JlY3RGCQltX2ZBbmNob3I7DQotICAgIH07DQotICAgIENGV0xfVG9vbFRpcERQIG1fdG9vbHRpcERhdGE7DQorY2xhc3MgQ0ZXTF9Ub29sVGlwIDogcHVibGljIENGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIENGV0xfVG9vbFRpcCogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgRldMX0VSUiBHZXRDYXB0aW9uKENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pOw0KKyAgRldMX0VSUiBTZXRDYXB0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDYXB0aW9uKTsNCisgIGludDMyX3QgR2V0SW5pdGlhbERlbGF5KCk7DQorICBpbnQzMl90IFNldEluaXRpYWxEZWxheShpbnQzMl90IG5EZWxheVRpbWUpOw0KKyAgaW50MzJfdCBHZXRBdXRvUG9wRGVsYXkoKTsNCisgIGludDMyX3QgU2V0QXV0b1BvcERlbGF5KGludDMyX3QgbkRlbGF5VGltZSk7DQorICBDRlhfRElCaXRtYXAqIEdldFRvb2xUaXBJY29uKCk7DQorICBGV0xfRVJSIFNldFRvb2xUaXBJY29uKENGWF9ESUJpdG1hcCogcEJpdG1hcCk7DQorICBDRlhfU2l6ZUYgR2V0VG9vbFRpcEljb25TaXplKCk7DQorICBGV0xfRVJSIFNldFRvb2xUaXBJY29uU2l6ZShDRlhfU2l6ZUYgZlNpemUpOw0KKyAgRldMX0VSUiBTZXRBbmNob3IoY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvcik7DQorICBGV0xfRVJSIFNob3coKTsNCisgIEZXTF9FUlIgSGlkZSgpOw0KKyAgQ0ZXTF9Ub29sVGlwKCk7DQorICB2aXJ0dWFsIH5DRldMX1Rvb2xUaXAoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgY2xhc3MgQ0ZXTF9Ub29sVGlwRFAgOiBwdWJsaWMgSUZXTF9Ub29sVGlwRFAgew0KKyAgIHB1YmxpYzoNCisgICAgQ0ZXTF9Ub29sVGlwRFAoKTsNCisgICAgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKTsNCisgICAgaW50MzJfdCBHZXRJbml0aWFsRGVsYXkoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgICBpbnQzMl90IEdldEF1dG9Qb3BEZWxheShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICAgIENGWF9ESUJpdG1hcCogR2V0VG9vbFRpcEljb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgICBDRlhfU2l6ZUYgR2V0VG9vbFRpcEljb25TaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgQ0ZYX1JlY3RGIEdldEFuY2hvcigpOw0KKyAgICBDRlhfV2lkZVN0cmluZyBtX3dzQ2FwdGlvbjsNCisgICAgaW50MzJfdCBtX25Jbml0RGVsYXlUaW1lOw0KKyAgICBpbnQzMl90IG1fbkF1dG9Qb3BEZWxheVRpbWU7DQorICAgIENGWF9ESUJpdG1hcCogbV9wQml0bWFwOw0KKyAgICBDRlhfU2l6ZUYgbV9mSWNvblNpemU7DQorICAgIENGWF9SZWN0RiBtX2ZBbmNob3I7DQorICB9Ow0KKyAgQ0ZXTF9Ub29sVGlwRFAgbV90b29sdGlwRGF0YTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC93aWRnZXQuaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC93aWRnZXQuaAppbmRleCA4ZjEyNDZiLi4wMmY5NmU5IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvd2lkZ2V0LmgKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3dpZGdldC5oCkBAIC0xMyw4OSArMTMsOTMgQEAKIGNsYXNzIElGV0xfV2lkZ2V0Ow0KIGNsYXNzIENGV0xfV2lkZ2V0Ow0KIGNsYXNzIENGV0xfV2lkZ2V0RGVsZWdhdGU7DQotY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKCkNCi0gICAgew0KLSAgICAgICAgbV9jdG1PblBhcmVudC5SZXNldCgpOw0KLSAgICAgICAgbV9ydFdpZGdldC5TZXQoMCwgMCwgMCwgMCk7DQotICAgICAgICBtX2R3U3R5bGVzCQk9IEZXTF9XR1RTVFlMRV9DaGlsZDsNCi0gICAgICAgIG1fZHdTdHlsZUV4ZXMJPSAwOw0KLSAgICAgICAgbV9kd1N0YXRlcwkJPSAwOw0KLSAgICAgICAgbV9wUGFyZW50CQk9IE5VTEw7DQotICAgICAgICBtX3BPd25lcgkJPSBOVUxMOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nCQltX3dzV2luZG93Y2xhc3M7DQotICAgIENGWF9NYXRyaXgJCQltX2N0bU9uUGFyZW50Ow0KLSAgICBDRlhfUmVjdEYJCQltX3J0V2lkZ2V0Ow0KLSAgICBGWF9EV09SRAkJCW1fZHdTdHlsZXM7DQotICAgIEZYX0RXT1JECQkJbV9kd1N0eWxlRXhlczsNCi0gICAgRlhfRFdPUkQJCQltX2R3U3RhdGVzOw0KLSAgICBDRldMX1dpZGdldAkJCSptX3BQYXJlbnQ7DQotICAgIENGV0xfV2lkZ2V0CQkJKm1fcE93bmVyOw0KK2NsYXNzIENGV0xfV2lkZ2V0UHJvcGVydGllcyB7DQorIHB1YmxpYzoNCisgIENGV0xfV2lkZ2V0UHJvcGVydGllcygpIHsNCisgICAgbV9jdG1PblBhcmVudC5SZXNldCgpOw0KKyAgICBtX3J0V2lkZ2V0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgbV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9DaGlsZDsNCisgICAgbV9kd1N0eWxlRXhlcyA9IDA7DQorICAgIG1fZHdTdGF0ZXMgPSAwOw0KKyAgICBtX3BQYXJlbnQgPSBOVUxMOw0KKyAgICBtX3BPd25lciA9IE5VTEw7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyBtX3dzV2luZG93Y2xhc3M7DQorICBDRlhfTWF0cml4IG1fY3RtT25QYXJlbnQ7DQorICBDRlhfUmVjdEYgbV9ydFdpZGdldDsNCisgIEZYX0RXT1JEIG1fZHdTdHlsZXM7DQorICBGWF9EV09SRCBtX2R3U3R5bGVFeGVzOw0KKyAgRlhfRFdPUkQgbV9kd1N0YXRlczsNCisgIENGV0xfV2lkZ2V0KiBtX3BQYXJlbnQ7DQorICBDRldMX1dpZGdldCogbV9wT3duZXI7DQogfTsNCi1jbGFzcyBDRldMX1dpZGdldA0KLXsNCi1wdWJsaWM6DQotICAgIElGV0xfV2lkZ2V0KglHZXRXaWRnZXQoKTsNCi0gICAgRlhfRFdPUkQJCVJlbGVhc2UoKTsNCi0gICAgQ0ZXTF9XaWRnZXQqCVJldGFpbigpOw0KLSAgICBGWF9EV09SRAkJR2V0UmVmQ291bnQoKSBjb25zdDsNCi0gICAgRldMX0VSUgkJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3Q7DQotICAgIEZYX0RXT1JECQlHZXRDbGFzc0lEKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Q7DQotcHJvdGVjdGVkOg0KLSAgICBGV0xfRVJSCQkJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzID0gTlVMTCk7DQotcHVibGljOg0KLSAgICBGV0xfRVJSCQkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KLSAgICBGV0xfRVJSCQkJR2V0R2xvYmFsUmVjdChDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICBGV0xfRVJSCQkJU2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICBGV0xfRVJSCQkJR2V0Q2xpZW50UmVjdChDRlhfUmVjdEYgJnJ0Q2xpZW50KTsNCi0gICAgQ0ZXTF9XaWRnZXQqCUdldFBhcmVudCgpOw0KLSAgICBGV0xfRVJSCQkJU2V0UGFyZW50KENGV0xfV2lkZ2V0ICpwUGFyZW50KTsNCi0gICAgQ0ZXTF9XaWRnZXQqCUdldE93bmVyKCk7DQotICAgIEZXTF9FUlIJCQlTZXRPd25lcihDRldMX1dpZGdldCAqcE93bmVyKTsNCi0gICAgRlhfRFdPUkQJCUdldFN0eWxlcygpOw0KLSAgICBGV0xfRVJSCQkJTW9kaWZ5U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzQWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzUmVtb3ZlZCk7DQotICAgIEZYX0RXT1JECQlHZXRTdHlsZXNFeCgpOw0KLSAgICBGV0xfRVJSCQkJTW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLCBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQotICAgIEZYX0RXT1JECQlHZXRTdGF0ZXMoKTsNCi0gICAgRldMX0VSUgkJCVNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQotICAgIEZXTF9FUlIJCQlTZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQsIHZvaWQqIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjayk7DQotICAgIHZvaWQqCQlHZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpOw0KLSAgICBGV0xfRVJSCQkJVXBkYXRlKCk7DQotICAgIEZXTF9FUlIJCQlMb2NrVXBkYXRlKCk7DQotICAgIEZXTF9FUlIJCQlVbmxvY2tVcGRhdGUoKTsNCi0gICAgRlhfRFdPUkQJCUhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgRldMX0VSUgkJCVRyYW5zZm9ybVRvKENGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSk7DQotICAgIEZXTF9FUlIJCQlUcmFuc2Zvcm1UbyhDRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZydCk7DQotICAgIEZXTF9FUlIJCQlHZXRNYXRyaXgoQ0ZYX01hdHJpeCAmbWF0cml4LCBGWF9CT09MIGJHbG9iYWwgPSBGQUxTRSk7DQotICAgIEZXTF9FUlIJCQlTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KTsNCi0gICAgRldMX0VSUgkJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgRldMX0VSUgkJCUdldFByb3BlcnRpZXMoQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzKTsNCi0gICAgRldMX0VSUgkJCVNldFByb3BlcnRpZXMoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzKTsNCi0gICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogU2V0RGVsZWdhdGUoSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlKTsNCi0gICAgRldMX0VSUgkJCVJlcGFpbnQoY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCA9IE5VTEwpOw0KLSAgICBGV0xfRVJSCQkJU2V0Rm9jdXMoRlhfQk9PTCBiRm9jdXMpOw0KLSAgICBGV0xfRVJSCQkJU2V0R3JhYihGWF9CT09MIGJTZXQpOw0KLSAgICBDRldMX1dpZGdldCgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX1dpZGdldCgpOw0KLSAgICB2b2lkCQlSZWdpc3RlckV2ZW50VGFyZ2V0KENGV0xfV2lkZ2V0ICpwRXZlbnRTb3VyY2UgPSBOVUxMLCBGWF9EV09SRCBkd0ZpbHRlciA9IEZXTF9FVkVOVF9BTExfTUFTSyk7DQotICAgIHZvaWQJCURpc3BhdGNoRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCi0gICAgQ0ZYX1NpemVGCUNhbGNUZXh0U2l6ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBGWF9CT09MIGJNdWx0aUxpbmUgPSBGQUxTRSwgaW50MzJfdCBpTGluZVdpZHRoID0gLTEpOw0KLSAgICBJRldMX1dpZGdldAkJCSptX3BJbXA7DQotICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKm1fcERlbGVnYXRlOw0KLSAgICBDRldMX1dpZGdldE1ncgkJKm1fcFdpZGdldE1ncjsNCi0gICAgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICptX3BQcm9wZXJ0aWVzOw0KK2NsYXNzIENGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgSUZXTF9XaWRnZXQqIEdldFdpZGdldCgpOw0KKyAgRlhfRFdPUkQgUmVsZWFzZSgpOw0KKyAgQ0ZXTF9XaWRnZXQqIFJldGFpbigpOw0KKyAgRlhfRFdPUkQgR2V0UmVmQ291bnQoKSBjb25zdDsNCisgIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzID0gTlVMTCk7DQorDQorIHB1YmxpYzoNCisgIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgRldMX0VSUiBHZXRHbG9iYWxSZWN0KENGWF9SZWN0RiYgcmVjdCk7DQorICBGV0xfRVJSIFNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIEZXTF9FUlIgR2V0Q2xpZW50UmVjdChDRlhfUmVjdEYmIHJ0Q2xpZW50KTsNCisgIENGV0xfV2lkZ2V0KiBHZXRQYXJlbnQoKTsNCisgIEZXTF9FUlIgU2V0UGFyZW50KENGV0xfV2lkZ2V0KiBwUGFyZW50KTsNCisgIENGV0xfV2lkZ2V0KiBHZXRPd25lcigpOw0KKyAgRldMX0VSUiBTZXRPd25lcihDRldMX1dpZGdldCogcE93bmVyKTsNCisgIEZYX0RXT1JEIEdldFN0eWxlcygpOw0KKyAgRldMX0VSUiBNb2RpZnlTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXNBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNSZW1vdmVkKTsNCisgIEZYX0RXT1JEIEdldFN0eWxlc0V4KCk7DQorICBGV0xfRVJSIE1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKyAgRlhfRFdPUkQgR2V0U3RhdGVzKCk7DQorICBGV0xfRVJSIFNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQorICBGV0xfRVJSIFNldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKTsNCisgIHZvaWQqIEdldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCk7DQorICBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgRldMX0VSUiBMb2NrVXBkYXRlKCk7DQorICBGV0xfRVJSIFVubG9ja1VwZGF0ZSgpOw0KKyAgRlhfRFdPUkQgSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgRldMX0VSUiBUcmFuc2Zvcm1UbyhDRldMX1dpZGdldCogcFdpZGdldCwgRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpOw0KKyAgRldMX0VSUiBUcmFuc2Zvcm1UbyhDRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiBydCk7DQorICBGV0xfRVJSIEdldE1hdHJpeChDRlhfTWF0cml4JiBtYXRyaXgsIEZYX0JPT0wgYkdsb2JhbCA9IEZBTFNFKTsNCisgIEZXTF9FUlIgU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7DQorICBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIEZXTF9FUlIgR2V0UHJvcGVydGllcyhDRldMX1dpZGdldFByb3BlcnRpZXMmIHByb3BlcnRpZXMpOw0KKyAgRldMX0VSUiBTZXRQcm9wZXJ0aWVzKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyYgcHJvcGVydGllcyk7DQorICBJRldMX1dpZGdldERlbGVnYXRlKiBTZXREZWxlZ2F0ZShJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUpOw0KKyAgRldMX0VSUiBSZXBhaW50KGNvbnN0IENGWF9SZWN0RiogcFJlY3QgPSBOVUxMKTsNCisgIEZXTF9FUlIgU2V0Rm9jdXMoRlhfQk9PTCBiRm9jdXMpOw0KKyAgRldMX0VSUiBTZXRHcmFiKEZYX0JPT0wgYlNldCk7DQorICBDRldMX1dpZGdldCgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9XaWRnZXQoKTsNCisgIHZvaWQgUmVnaXN0ZXJFdmVudFRhcmdldChDRldMX1dpZGdldCogcEV2ZW50U291cmNlID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZpbHRlciA9IEZXTF9FVkVOVF9BTExfTUFTSyk7DQorICB2b2lkIERpc3BhdGNoRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIENGWF9TaXplRiBDYWxjVGV4dFNpemUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTXVsdGlMaW5lID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxpbmVXaWR0aCA9IC0xKTsNCisgIElGV0xfV2lkZ2V0KiBtX3BJbXA7DQorICBJRldMX1dpZGdldERlbGVnYXRlKiBtX3BEZWxlZ2F0ZTsNCisgIENGV0xfV2lkZ2V0TWdyKiBtX3BXaWRnZXRNZ3I7DQorICBDRldMX1dpZGdldFByb3BlcnRpZXMqIG1fcFByb3BlcnRpZXM7DQogfTsNCi1jbGFzcyBDRldMX1dpZGdldERlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9XaWRnZXREZWxlZ2F0ZSgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX1dpZGdldERlbGVnYXRlKCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorY2xhc3MgQ0ZXTF9XaWRnZXREZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfV2lkZ2V0RGVsZWdhdGUoKTsNCisgIHZpcnR1YWwgfkNGV0xfV2lkZ2V0RGVsZWdhdGUoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvYmFyY29kZXRwLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvYmFyY29kZXRwLmgKaW5kZXggODAzZTA2Yi4uNjkyMzkwOSAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL2JhcmNvZGV0cC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9iYXJjb2RldHAuaApAQCAtOCwxMiArOCwxMSBAQAogI2RlZmluZSBfRldMX0JBUkNPREVUUF9IDQogY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCiBjbGFzcyBDRldMX0JhcmNvZGVUUDsNCi1jbGFzcyBDRldMX0JhcmNvZGVUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9CYXJjb2RlVFAoKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9CYXJjb2RlVFAoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQorY2xhc3MgQ0ZXTF9CYXJjb2RlVFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUCB7DQorIHB1YmxpYzoNCisgIENGV0xfQmFyY29kZVRQKCk7DQorICB2aXJ0dWFsIH5DRldMX0JhcmNvZGVUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9jYXJldHRwLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvY2FyZXR0cC5oCmluZGV4IDU3ZWE4NWIuLmMyOTFmOGMgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9jYXJldHRwLmgKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NhcmV0dHAuaApAQCAtOCwxNCArOCwxOCBAQAogI2RlZmluZSBfRldMX0NBUkVUVFBfSA0KIGNsYXNzIENGV0xfV2lkZ2V0VFA7DQogY2xhc3MgQ0ZXTF9DYXJldFRQOw0KLWNsYXNzIENGV0xfQ2FyZXRUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9DYXJldFRQKCk7DQotICAgIHZpcnR1YWwgfkNGV0xfQ2FyZXRUUCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJRHJhd0NhcmV0QksoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIEZYX0RXT1JEIGR3U3RhdGVzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBDRlhfQ29sb3IgKmNyRmlsbCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KK2NsYXNzIENGV0xfQ2FyZXRUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9DYXJldFRQKCk7DQorICB2aXJ0dWFsIH5DRldMX0NhcmV0VFAoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcyk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgRHJhd0NhcmV0QksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICBDRlhfQ29sb3IqIGNyRmlsbCwNCisgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NoZWNrYm94dHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9jaGVja2JveHRwLmgKaW5kZXggYjExNDA3MC4uNmQwM2NmMSAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NoZWNrYm94dHAuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvY2hlY2tib3h0cC5oCkBAIC04LDQwICs4LDc0IEBACiAjZGVmaW5lIF9GV0xfQ0hFQ0tCT1hUUF9IDQogY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCiBjbGFzcyBDRldMX0NoZWNrQm94VFA7DQotY2xhc3MgQ0ZXTF9DaGVja0JveFRQIDogcHVibGljIENGV0xfV2lkZ2V0VFANCi17DQotcHVibGljOg0KLSAgICBDRldMX0NoZWNrQm94VFAoKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9DaGVja0JveFRQKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJU2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRFdPUkQgZHdUaGVtZUlELCBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdUZXh0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCURyYXdCb3hCayhJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0RXT1JEIGR3U3RhdGVzLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJRHJhd1NpZ24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdEJveCwgRlhfRFdPUkQgZHdTdGF0ZXMsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdm9pZAlEcmF3U2lnbk5ldXRyYWwoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0U2lnbiwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCURyYXdTaWduQ2hlY2soQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0U2lnbiwgRlhfQVJHQiBhcmdiRmlsbCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCURyYXdTaWduQ2lyY2xlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdFNpZ24sIEZYX0FSR0IgYXJnYkZpbGwsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdm9pZAlEcmF3U2lnbkNyb3NzKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdFNpZ24sIEZYX0FSR0IgYXJnYkZpbGwsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdm9pZAlEcmF3U2lnbkRpYW1vbmQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0U2lnbiwgRlhfQVJHQiBhcmdiRmlsbCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCURyYXdTaWduU3F1YXJlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdFNpZ24sIEZYX0FSR0IgYXJnYkZpbGwsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdm9pZAlEcmF3U2lnblN0YXIoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0U2lnbiwgRlhfQVJHQiBhcmdiRmlsbCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCURyYXdTaWduQm9yZGVyKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRCb3gsIEZYX0JPT0wgYkRpc2FibGUgPSBGQUxTRSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCVNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKTsNCi0gICAgdm9pZAlpbml0Q2hlY2tQYXRoKEZYX0ZMT0FUIGZDaGVja0xlbik7DQotICAgIHN0cnVjdCBDS0JUaGVtZURhdGEgew0KLSAgICAgICAgRlhfQVJHQiBjbHJCb3hCa1sxM11bMl07DQotICAgICAgICBGWF9BUkdCCWNsclNpZ25Cb3JkZXJOb3JtYWw7DQotICAgICAgICBGWF9BUkdCCWNsclNpZ25Cb3JkZXJEaXNhYmxlOw0KLSAgICAgICAgRlhfQVJHQgljbHJTaWduQ2hlY2s7DQotICAgICAgICBGWF9BUkdCCWNsclNpZ25OZXV0cmFsOw0KLSAgICAgICAgRlhfQVJHQgljbHJTaWduTmV1dHJhbE5vcm1hbDsNCi0gICAgICAgIEZYX0FSR0IJY2xyU2lnbk5ldXRyYWxIb3ZlcjsNCi0gICAgICAgIEZYX0FSR0IJY2xyU2lnbk5ldXRyYWxQcmVzc2VkOw0KLSAgICB9ICptX3BUaGVtZURhdGE7DQotICAgIENGWF9QYXRoICptX3BDaGVja1BhdGg7DQorY2xhc3MgQ0ZXTF9DaGVja0JveFRQIDogcHVibGljIENGV0xfV2lkZ2V0VFAgew0KKyBwdWJsaWM6DQorICBDRldMX0NoZWNrQm94VFAoKTsNCisgIHZpcnR1YWwgfkNGV0xfQ2hlY2tCb3hUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgRHJhd0JveEJrKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0ZXMsDQorICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdTaWduKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRCb3gsDQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdTaWduTmV1dHJhbChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd1NpZ25DaGVjayhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdTaWduQ2lyY2xlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd1NpZ25Dcm9zcyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdTaWduRGlhbW9uZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdTaWduU3F1YXJlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd1NpZ25TdGFyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRTaWduLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwNCisgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd1NpZ25Cb3JkZXIoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGlzYWJsZSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIFNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKTsNCisgIHZvaWQgaW5pdENoZWNrUGF0aChGWF9GTE9BVCBmQ2hlY2tMZW4pOw0KKyAgc3RydWN0IENLQlRoZW1lRGF0YSB7DQorICAgIEZYX0FSR0IgY2xyQm94QmtbMTNdWzJdOw0KKyAgICBGWF9BUkdCIGNsclNpZ25Cb3JkZXJOb3JtYWw7DQorICAgIEZYX0FSR0IgY2xyU2lnbkJvcmRlckRpc2FibGU7DQorICAgIEZYX0FSR0IgY2xyU2lnbkNoZWNrOw0KKyAgICBGWF9BUkdCIGNsclNpZ25OZXV0cmFsOw0KKyAgICBGWF9BUkdCIGNsclNpZ25OZXV0cmFsTm9ybWFsOw0KKyAgICBGWF9BUkdCIGNsclNpZ25OZXV0cmFsSG92ZXI7DQorICAgIEZYX0FSR0IgY2xyU2lnbk5ldXRyYWxQcmVzc2VkOw0KKyAgfSAqIG1fcFRoZW1lRGF0YTsNCisgIENGWF9QYXRoKiBtX3BDaGVja1BhdGg7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvY29tYm9ib3h0cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NvbWJvYm94dHAuaAppbmRleCA2MmIzNzhmLi43ZGE1ZDY2IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvY29tYm9ib3h0cC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9jb21ib2JveHRwLmgKQEAgLTgsMTYgKzgsMjAgQEAKICNkZWZpbmUgX0ZXTF9DT01CT0JPWFRQX0gNCiBjbGFzcyBDRldMX1dpZGdldFRQOw0KIGNsYXNzIENGV0xfQ29tYm9Cb3hUUDsNCi1jbGFzcyBDRldMX0NvbWJvQm94VFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfQ29tYm9Cb3hUUCgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0NvbWJvQm94VFAoKTsNCi0gICAgdmlydHVhbAlGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQotICAgIHZpcnR1YWwgdm9pZCogICBHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCURyYXdEcm9wRG93bkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgRlhfRFdPUkQgZHdTdGF0ZXMsIENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICB2b2lkCURyYXdTdHJldGhIYW5kbGVyKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBGWF9EV09SRCBkd1N0YXRlcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorY2xhc3MgQ0ZXTF9Db21ib0JveFRQIDogcHVibGljIENGV0xfV2lkZ2V0VFAgew0KKyBwdWJsaWM6DQorICBDRldMX0NvbWJvQm94VFAoKTsNCisgIHZpcnR1YWwgfkNGV0xfQ29tYm9Cb3hUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgdm9pZCogR2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERyYXdEcm9wRG93bkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdTdHJldGhIYW5kbGVyKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2RhdGV0aW1lcGlja2VydHAuaAppbmRleCAzOWU1MDk1Li5iOTVjZDA1IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9kYXRldGltZXBpY2tlcnRwLmgKQEAgLTgsMTggKzgsMTggQEAKICNkZWZpbmUgX0ZXTF9EQVRFVElNRVBJQ0tFUlRQX0gNCiBjbGFzcyBDRldMX1dpZGdldFRQOw0KIGNsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDsNCi1jbGFzcyBDRldMX0RhdGVUaW1lUGlja2VyVFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJUUCgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0RhdGVUaW1lUGlja2VyVFAoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkIERyYXdEcm9wRG93bkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIHZvaWQJaW5pdFRoZW1lRGF0YSgpOw0KLSAgICBzdHJ1Y3QgRFRQVGhlbWVEYXRhIHsNCi0gICAgICAgIEZYX0FSR0IgQm94QmtDb2xvclsxM11bMl07DQotICAgIH0gKm1fcFRoZW1lRGF0YTsNCitjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VyVFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUCB7DQorIHB1YmxpYzoNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXJUUCgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9EYXRlVGltZVBpY2tlclRQKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERyYXdEcm9wRG93bkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIGluaXRUaGVtZURhdGEoKTsNCisgIHN0cnVjdCBEVFBUaGVtZURhdGEgew0KKyAgICBGWF9BUkdCIEJveEJrQ29sb3JbMTNdWzJdOw0KKyAgfSAqIG1fcFRoZW1lRGF0YTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9lZGl0dHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9lZGl0dHAuaAppbmRleCAzMDczODJlLi5hNmUxZGE4IDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvZWRpdHRwLmgKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2VkaXR0cC5oCkBAIC04LDE0ICs4LDEzIEBACiAjZGVmaW5lIF9GV0xfRURJVFRQX0gNCiBjbGFzcyBDRldMX1dpZGdldFRQOw0KIGNsYXNzIENGV0xfRWRpdFRQOw0KLWNsYXNzIENGV0xfRWRpdFRQIDogcHVibGljIENGV0xfV2lkZ2V0VFANCi17DQotcHVibGljOg0KLSAgICBDRldMX0VkaXRUUCgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0VkaXRUUCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCitjbGFzcyBDRldMX0VkaXRUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9FZGl0VFAoKTsNCisgIHZpcnR1YWwgfkNGV0xfRWRpdFRQKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL2Zvcm10cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2Zvcm10cC5oCmluZGV4IDU1NDQ5ZGEuLjBiN2NiODcgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9mb3JtdHAuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvZm9ybXRwLmgKQEAgLTgsNjYgKzgsMTAxIEBACiAjZGVmaW5lIF9GV0xfRk9STV9USEVNRVBST1ZJREVSX0gNCiBjbGFzcyBDRldMX1dpZGdldFRQOw0KIGNsYXNzIENGV0xfRm9ybVRQOw0KLWNsYXNzIENGV0xfRm9ybVRQIDogcHVibGljIENGV0xfV2lkZ2V0VFANCi17DQotcHVibGljOg0KLSAgICBDRldMX0Zvcm1UUCgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0Zvcm1UUCgpOw0KK2NsYXNzIENGV0xfRm9ybVRQIDogcHVibGljIENGV0xfV2lkZ2V0VFAgew0KKyBwdWJsaWM6DQorICBDRldMX0Zvcm1UUCgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9Gb3JtVFAoKTsNCiANCi0gICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdmlydHVhbAlGWF9EV09SRAlTZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9EV09SRCBkd1RoZW1lSUQsIEZYX0JPT0wgYkNoaWxkcmVuID0gVFJVRSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdUZXh0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zKTsNCi0gICAgdmlydHVhbCB2b2lkKiAgIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgQ0ZYX1JlY3RGJiBydFBhcnQpOw0KLXByb3RlY3RlZDoNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgU2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RoZW1lSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMpOw0KKyAgdmlydHVhbCB2b2lkKiBHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0UGFydFJlY3QoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIENGWF9SZWN0RiYgcnRQYXJ0KTsNCiANCi0gICAgdm9pZCBDYWxDbG9zZUJveChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdm9pZCBDYWxNYXhCb3goSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcmVjdCk7DQotICAgIHZvaWQgQ2FsTWluQm94KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2b2lkIENhbENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcmVjdCk7DQotICAgIHZvaWQgQ2FsSWNvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZyZWN0KTsNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBDYWxDbG9zZUJveChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQgQ2FsTWF4Qm94KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBDYWxNaW5Cb3goSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcmVjdCk7DQorICB2b2lkIENhbENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcmVjdCk7DQorICB2b2lkIENhbEljb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcmVjdCk7DQogDQotICAgIHZvaWQgRHJhd0Zvcm1Cb3JkZXIoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXgsIGludDMyX3QgaUFjdGl2ZSA9IDApOw0KLSAgICB2b2lkIERyYXdDYXB0aW9uKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4LCBpbnQzMl90IGlBY3RpdmUgPSAwKTsNCi0gICAgdm9pZCBEcmF3TmFycm93Q2FwdGlvbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgaW50MzJfdCBpQWN0aXZlID0gMCk7DQotICAgIHZvaWQgRHJhd0Nsb3NlQm94KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4LCBpbnQzMl90IGlBY3RpdmUgPSAwKTsNCi0gICAgdm9pZCBEcmF3TWluTWF4Qm94Q29tbW9uKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4LCBpbnQzMl90IGlBY3RpdmUgPSAwKTsNCi0gICAgdm9pZCBEcmF3TWluaW1pemVCb3goQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXgsIGludDMyX3QgaUFjdGl2ZSA9IDApOw0KLSAgICB2b2lkIERyYXdNYXhpbWl6ZUJveChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgRlhfQk9PTCBiTWF4LCBDRlhfTWF0cml4ICpwTWF0cml4LCBpbnQzMl90IGlBY3RpdmUgPSAwKTsNCi0gICAgdm9pZCBEcmF3SWNvbkltYWdlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBDRlhfRElCaXRtYXAgKnBESUJpdG1hcCwgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgaW50MzJfdCBpQWN0aXZlID0gMCk7DQotICAgIHZvaWQgU2V0VGhlbWVEYXRhKEZYX0RXT1JEIGR3SUQpOw0KLSAgICB2b2lkIFRyYW5zTW9kZUNvbG9yKEZYX0FSR0IgY2xyRm9yZSwgRlhfQVJHQiAmY2xyQmFjayk7DQotICAgIHZvaWQgRGVhY3RpdmVGb3JtKCk7DQotICAgIHZvaWQgSW5pdENhcHRpb24oRlhfQk9PTCBiQWN0aXZlKTsNCi0gICAgQ0ZYX0RJQml0bWFwCSptX3BBY3RpdmVCaXRtYXA7DQotICAgIENGWF9ESUJpdG1hcAkqbV9wRGVhY3RpdmViaXRtYXA7DQotICAgIENGWF9SZWN0RgkJbV9ydERpc0NhcHRpb247DQotICAgIENGWF9SZWN0RgkJbV9ydERpc0xCb3JkZXI7DQotICAgIENGWF9SZWN0RgkJbV9ydERpc1JCb3JkZXI7DQotICAgIENGWF9SZWN0RgkJbV9ydERpc0JCb3JkZXI7DQotICAgIHN0cnVjdCBTQlRoZW1lRGF0YSB7DQotICAgICAgICBGWF9BUkdCIGNsckhlYWRCS1syXVs0XTsNCi0gICAgICAgIEZYX0FSR0IgY2xySGVhZEVkZ2VMZWZ0WzJdWzNdOw0KLSAgICAgICAgRlhfQVJHQiBjbHJIZWFkRWRnZVJpZ2h0WzJdWzNdOw0KLSAgICAgICAgRlhfQVJHQiBjbHJIZWFkRWRnZVRvcFsyXVszXTsNCi0gICAgICAgIEZYX0FSR0IgY2xySGVhZEVkZ2VCb3R0b21bMl1bM107DQotICAgICAgICBGWF9BUkdCIGNsckNsb3NlQnRCS1N0YXJ0WzJdWzNdOw0KLSAgICAgICAgRlhfQVJHQiBjbHJDbG9zZUJ0QktFbmRbMl1bM107DQotICAgICAgICBGWF9BUkdCIGNsckNsb3NlQnRFZGdlTGlnaHRbMl1bM107DQotICAgICAgICBGWF9BUkdCIGNsckNsb3NlQnRFZGdlRGFya1syXVszXTsNCi0gICAgICAgIEZYX0FSR0IgY2xyTm9ybWFsQnRCS1N0YXJ0WzJdWzNdOw0KLSAgICAgICAgRlhfQVJHQiBjbHJOb3JtYWxCdEJLRW5kWzJdWzNdOw0KLSAgICAgICAgRlhfQVJHQiBjbHJOb3JtYWxCdEVkZ2VMaWdodFsyXVszXTsNCi0gICAgICAgIEZYX0FSR0IgY2xyTm9ybWFsQnRFZGdlRGFya1syXVszXTsNCi0gICAgICAgIEZYX0FSR0IgY2xyQnRuRWRnZU91dFsyXTsNCi0gICAgICAgIEZYX0FSR0IgY2xyQnRuQ29ybmVyTGlnaHRbMl1bM107DQotICAgICAgICBGWF9BUkdCIGNsckhlYWRUZXh0WzJdOw0KLSAgICAgICAgRlhfQVJHQiBjbHJGb3JtQm9yZGVyWzJdWzVdOw0KLSAgICAgICAgRlhfQVJHQiBjbHJGb3JtQm9yZGVyTGlnaHRbMl07DQotICAgICAgICBGWF9BUkdCIGNsclRyYW5zV2hpdGU7DQotICAgIH0gKm1fcFRoZW1lRGF0YTsNCisgIHZvaWQgRHJhd0Zvcm1Cb3JkZXIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQWN0aXZlID0gMCk7DQorICB2b2lkIERyYXdDYXB0aW9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSA9IDApOw0KKyAgdm9pZCBEcmF3TmFycm93Q2FwdGlvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBY3RpdmUgPSAwKTsNCisgIHZvaWQgRHJhd0Nsb3NlQm94KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBY3RpdmUgPSAwKTsNCisgIHZvaWQgRHJhd01pbk1heEJveENvbW1vbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSA9IDApOw0KKyAgdm9pZCBEcmF3TWluaW1pemVCb3goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSA9IDApOw0KKyAgdm9pZCBEcmF3TWF4aW1pemVCb3goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTWF4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSA9IDApOw0KKyAgdm9pZCBEcmF3SWNvbkltYWdlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQWN0aXZlID0gMCk7DQorICB2b2lkIFNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKTsNCisgIHZvaWQgVHJhbnNNb2RlQ29sb3IoRlhfQVJHQiBjbHJGb3JlLCBGWF9BUkdCJiBjbHJCYWNrKTsNCisgIHZvaWQgRGVhY3RpdmVGb3JtKCk7DQorICB2b2lkIEluaXRDYXB0aW9uKEZYX0JPT0wgYkFjdGl2ZSk7DQorICBDRlhfRElCaXRtYXAqIG1fcEFjdGl2ZUJpdG1hcDsNCisgIENGWF9ESUJpdG1hcCogbV9wRGVhY3RpdmViaXRtYXA7DQorICBDRlhfUmVjdEYgbV9ydERpc0NhcHRpb247DQorICBDRlhfUmVjdEYgbV9ydERpc0xCb3JkZXI7DQorICBDRlhfUmVjdEYgbV9ydERpc1JCb3JkZXI7DQorICBDRlhfUmVjdEYgbV9ydERpc0JCb3JkZXI7DQorICBzdHJ1Y3QgU0JUaGVtZURhdGEgew0KKyAgICBGWF9BUkdCIGNsckhlYWRCS1syXVs0XTsNCisgICAgRlhfQVJHQiBjbHJIZWFkRWRnZUxlZnRbMl1bM107DQorICAgIEZYX0FSR0IgY2xySGVhZEVkZ2VSaWdodFsyXVszXTsNCisgICAgRlhfQVJHQiBjbHJIZWFkRWRnZVRvcFsyXVszXTsNCisgICAgRlhfQVJHQiBjbHJIZWFkRWRnZUJvdHRvbVsyXVszXTsNCisgICAgRlhfQVJHQiBjbHJDbG9zZUJ0QktTdGFydFsyXVszXTsNCisgICAgRlhfQVJHQiBjbHJDbG9zZUJ0QktFbmRbMl1bM107DQorICAgIEZYX0FSR0IgY2xyQ2xvc2VCdEVkZ2VMaWdodFsyXVszXTsNCisgICAgRlhfQVJHQiBjbHJDbG9zZUJ0RWRnZURhcmtbMl1bM107DQorICAgIEZYX0FSR0IgY2xyTm9ybWFsQnRCS1N0YXJ0WzJdWzNdOw0KKyAgICBGWF9BUkdCIGNsck5vcm1hbEJ0QktFbmRbMl1bM107DQorICAgIEZYX0FSR0IgY2xyTm9ybWFsQnRFZGdlTGlnaHRbMl1bM107DQorICAgIEZYX0FSR0IgY2xyTm9ybWFsQnRFZGdlRGFya1syXVszXTsNCisgICAgRlhfQVJHQiBjbHJCdG5FZGdlT3V0WzJdOw0KKyAgICBGWF9BUkdCIGNsckJ0bkNvcm5lckxpZ2h0WzJdWzNdOw0KKyAgICBGWF9BUkdCIGNsckhlYWRUZXh0WzJdOw0KKyAgICBGWF9BUkdCIGNsckZvcm1Cb3JkZXJbMl1bNV07DQorICAgIEZYX0FSR0IgY2xyRm9ybUJvcmRlckxpZ2h0WzJdOw0KKyAgICBGWF9BUkdCIGNsclRyYW5zV2hpdGU7DQorICB9ICogbV9wVGhlbWVEYXRhOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL2xpc3Rib3h0cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2xpc3Rib3h0cC5oCmluZGV4IDRiODJhYTYuLjVlNGE2ZGMgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9saXN0Ym94dHAuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvbGlzdGJveHRwLmgKQEAgLTksMTYgKzksMjAgQEAKIGNsYXNzIENGV0xfV2lkZ2V0VFA7DQogY2xhc3MgQ0ZXTF9TY3JvbGxCYXJUUDsNCiBjbGFzcyBDRldMX0xpc3RCb3hUUDsNCi1jbGFzcyBDRldMX0xpc3RCb3hUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9MaXN0Qm94VFAoKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9MaXN0Qm94VFAoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkIERyYXdMaXN0Qm94SXRlbShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfRFdPUkQgZHdTdGF0ZXMsIGNvbnN0IENGWF9SZWN0RiAqcHJ0SXRlbSwgdm9pZCogcERhdGEgPSBOVUxMLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorY2xhc3MgQ0ZXTF9MaXN0Qm94VFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUCB7DQorIHB1YmxpYzoNCisgIENGV0xfTGlzdEJveFRQKCk7DQorICB2aXJ0dWFsIH5DRldMX0xpc3RCb3hUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3TGlzdEJveEl0ZW0oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcHJ0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9tb250aGNhbGVuZGFydHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9tb250aGNhbGVuZGFydHAuaAppbmRleCBmNjAxNjAwLi45MDNlM2EwIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvbW9udGhjYWxlbmRhcnRwLmgKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL21vbnRoY2FsZW5kYXJ0cC5oCkBAIC04LDQxICs4LDQyIEBACiAjZGVmaW5lIF9GV0xfTU9OVEhDQUxFTkRBUlRQX0gNCiBjbGFzcyBDRldMX1dpZGdldFRQOw0KIGNsYXNzIENGV0xfTW9udGhDYWxlbmRhclRQOw0KLWNsYXNzIENGV0xfTW9udGhDYWxlbmRhclRQIDogcHVibGljIENGV0xfV2lkZ2V0VFANCi17DQotcHVibGljOg0KLSAgICBDRldMX01vbnRoQ2FsZW5kYXJUUCgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX01vbnRoQ2FsZW5kYXJUUCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2aXJ0dWFsCUZYX0RXT1JECVNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQgKnBQYXJhbXMpOw0KLSAgICB2aXJ0dWFsIHZvaWQqICAgR2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KLXByb3RlY3RlZDoNCi0gICAgRlhfQk9PTAkJRHJhd1RvdGFsQksoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICBGWF9CT09MCQlEcmF3SGVhZEJrKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgRlhfQk9PTAkJRHJhd0xCdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICBGWF9CT09MCQlEcmF3UkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIEZYX0JPT0wJCURyYXdEYXRlc0luQksoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICBGWF9CT09MCQlEcmF3RGF0ZXNJbkNpcmNsZShDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIEZYX0JPT0wJCURyYXdUb2RheUNpcmNsZShDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIEZYX0JPT0wJCURyYXdIU2VwZXJhdG9yKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgRlhfQk9PTAkJRHJhd1dlZWtOdW1TZXAoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICBGV0xUSEVNRV9TVEFURSBHZXRTdGF0ZShGWF9EV09SRCBkd0ZXTFN0YXRlcyk7DQotICAgIHZvaWQJU2V0VGhlbWVEYXRhKEZYX0RXT1JEIGR3VGhlbWVJRCk7DQotICAgIGNsYXNzIE1DVGhlbWVEYXRhDQotICAgIHsNCi0gICAgcHVibGljOg0KLSAgICAgICAgRlhfQVJHQiBjbHJDYXB0aW9uOw0KLSAgICAgICAgRlhfQVJHQiBjbHJTZXBlcmF0b3I7DQotICAgICAgICBGWF9BUkdCIGNsckRhdGVzSG92ZXJCSzsNCi0gICAgICAgIEZYX0FSR0IgY2xyRGF0ZXNTZWxlY3RlZEJLOw0KLSAgICAgICAgRlhfQVJHQiBjbHJEYXRlc0NpcmNsZTsNCi0gICAgICAgIEZYX0FSR0IgY2xyVG9kYXk7DQotICAgICAgICBGWF9BUkdCIGNsckJLOw0KLSAgICB9ICptX3BUaGVtZURhdGE7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzUmVzb3VyY2U7DQorY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFyVFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUCB7DQorIHB1YmxpYzoNCisgIENGV0xfTW9udGhDYWxlbmRhclRQKCk7DQorICB2aXJ0dWFsIH5DRldMX01vbnRoQ2FsZW5kYXJUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3VGV4dChDRldMX1RoZW1lVGV4dCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBEcmF3VG90YWxCSyhDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9CT09MIERyYXdIZWFkQmsoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsIENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgRlhfQk9PTCBEcmF3TEJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9CT09MIERyYXdSQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0JPT0wgRHJhd0RhdGVzSW5CSyhDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9CT09MIERyYXdEYXRlc0luQ2lyY2xlKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0JPT0wgRHJhd1RvZGF5Q2lyY2xlKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0JPT0wgRHJhd0hTZXBlcmF0b3IoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsIENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgRlhfQk9PTCBEcmF3V2Vla051bVNlcChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGV0xUSEVNRV9TVEFURSBHZXRTdGF0ZShGWF9EV09SRCBkd0ZXTFN0YXRlcyk7DQorICB2b2lkIFNldFRoZW1lRGF0YShGWF9EV09SRCBkd1RoZW1lSUQpOw0KKyAgY2xhc3MgTUNUaGVtZURhdGEgew0KKyAgIHB1YmxpYzoNCisgICAgRlhfQVJHQiBjbHJDYXB0aW9uOw0KKyAgICBGWF9BUkdCIGNsclNlcGVyYXRvcjsNCisgICAgRlhfQVJHQiBjbHJEYXRlc0hvdmVyQks7DQorICAgIEZYX0FSR0IgY2xyRGF0ZXNTZWxlY3RlZEJLOw0KKyAgICBGWF9BUkdCIGNsckRhdGVzQ2lyY2xlOw0KKyAgICBGWF9BUkdCIGNsclRvZGF5Ow0KKyAgICBGWF9BUkdCIGNsckJLOw0KKyAgfSAqIG1fcFRoZW1lRGF0YTsNCisgIENGWF9XaWRlU3RyaW5nIHdzUmVzb3VyY2U7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvcGljdHVyZWJveHRwLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvcGljdHVyZWJveHRwLmgKaW5kZXggOTM4YWMwNy4uZjJmZmQ1ZSAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL3BpY3R1cmVib3h0cC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9waWN0dXJlYm94dHAuaApAQCAtOCwxMiArOCwxMSBAQAogI2RlZmluZSBfRldMX1BJQ1RVUkVCT1hUUF9IDQogY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCiBjbGFzcyBDRldMX1BpY3R1cmVCb3hUUDsNCi1jbGFzcyBDRldMX1BpY3R1cmVCb3hUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9QaWN0dXJlQm94VFAoKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9QaWN0dXJlQm94VFAoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQorY2xhc3MgQ0ZXTF9QaWN0dXJlQm94VFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUCB7DQorIHB1YmxpYzoNCisgIENGV0xfUGljdHVyZUJveFRQKCk7DQorICB2aXJ0dWFsIH5DRldMX1BpY3R1cmVCb3hUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9wdXNoYnV0dG9udHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9wdXNoYnV0dG9udHAuaAppbmRleCAyMGRmMjAzLi41OWI5ZDJkIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvcHVzaGJ1dHRvbnRwLmgKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL3B1c2hidXR0b250cC5oCkBAIC04LDMzICs4LDM1IEBACiAjZGVmaW5lIF9GV0xfUFVTSEJVVFRPTlRQX0gNCiBjbGFzcyBDRldMX1dpZGdldFRQOw0KIGNsYXNzIENGV0xfUHVzaEJ1dHRvblRQOw0KLWNsYXNzIENGV0xfUHVzaEJ1dHRvblRQIDogcHVibGljIENGV0xfV2lkZ2V0VFANCi17DQotcHVibGljOg0KLSAgICBDRldMX1B1c2hCdXR0b25UUCgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX1B1c2hCdXR0b25UUCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECVNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQotICAgIHZpcnR1YWwgdm9pZCogICBHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCVNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKTsNCi0gICAgdm9pZAlTZXRUb3BMaW5lQ29sb3IoRlhfRFdPUkQgKnBEYXRhKTsNCi0gICAgdm9pZAlTZXRMZWZ0TGluZUNvbG9yKEZYX0RXT1JEICpwRGF0YSk7DQotICAgIHZvaWQJU2V0UmlnaHRMaW5lQ29sb3IoRlhfRFdPUkQgKnBEYXRhKTsNCi0gICAgdm9pZAlTZXRCb3R0b21MaW5lQ29sb3IoRlhfRFdPUkQgKnBEYXRhKTsNCi0gICAgdm9pZAlTZXRCYWNrZ3JvdWRDb2xvcihGWF9EV09SRCAqcERhdGEpOw0KLSAgICB2b2lkCVNldENhcHRpb25Db2xvcihGWF9EV09SRCAqcERhdGEpOw0KLSAgICB2b2lkCVNldENvcm5lckNvbG9yKEZYX0RXT1JEICpwRGF0YSk7DQotICAgIGludDMyX3QJR2V0Q29sb3JJRChGWF9EV09SRCBkd1N0YXRlcyk7DQorY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uVFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUCB7DQorIHB1YmxpYzoNCisgIENGV0xfUHVzaEJ1dHRvblRQKCk7DQorICB2aXJ0dWFsIH5DRldMX1B1c2hCdXR0b25UUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgdm9pZCogR2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KIA0KLSAgICBzdHJ1Y3QgUEJUaGVtZURhdGEgew0KLSAgICAgICAgRlhfQVJHQiBjbHJCb3JkZXJbNV07DQotICAgICAgICBGWF9BUkdCIGNsclN0YXJ0WzVdOw0KLSAgICAgICAgRlhfQVJHQiBjbHJFbmRbNV07DQotICAgICAgICBGWF9BUkdCIGNsckZpbGxbNV07DQotICAgIH0gKm1fcFRoZW1lRGF0YTsNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCk7DQorICB2b2lkIFNldFRvcExpbmVDb2xvcihGWF9EV09SRCogcERhdGEpOw0KKyAgdm9pZCBTZXRMZWZ0TGluZUNvbG9yKEZYX0RXT1JEKiBwRGF0YSk7DQorICB2b2lkIFNldFJpZ2h0TGluZUNvbG9yKEZYX0RXT1JEKiBwRGF0YSk7DQorICB2b2lkIFNldEJvdHRvbUxpbmVDb2xvcihGWF9EV09SRCogcERhdGEpOw0KKyAgdm9pZCBTZXRCYWNrZ3JvdWRDb2xvcihGWF9EV09SRCogcERhdGEpOw0KKyAgdm9pZCBTZXRDYXB0aW9uQ29sb3IoRlhfRFdPUkQqIHBEYXRhKTsNCisgIHZvaWQgU2V0Q29ybmVyQ29sb3IoRlhfRFdPUkQqIHBEYXRhKTsNCisgIGludDMyX3QgR2V0Q29sb3JJRChGWF9EV09SRCBkd1N0YXRlcyk7DQorDQorICBzdHJ1Y3QgUEJUaGVtZURhdGEgew0KKyAgICBGWF9BUkdCIGNsckJvcmRlcls1XTsNCisgICAgRlhfQVJHQiBjbHJTdGFydFs1XTsNCisgICAgRlhfQVJHQiBjbHJFbmRbNV07DQorICAgIEZYX0FSR0IgY2xyRmlsbFs1XTsNCisgIH0gKiBtX3BUaGVtZURhdGE7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvc2Nyb2xsYmFydHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9zY3JvbGxiYXJ0cC5oCmluZGV4IDk0MDAyZmIuLjI0YmU0NzQgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9zY3JvbGxiYXJ0cC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9zY3JvbGxiYXJ0cC5oCkBAIC04LDI4ICs4LDQ4IEBACiAjZGVmaW5lIF9GV0xfU0NST0xMQkFSVFBfSA0KIGNsYXNzIENGV0xfV2lkZ2V0VFA7DQogY2xhc3MgQ0ZXTF9TY3JvbGxCYXJUUDsNCi1jbGFzcyBDRldMX1Njcm9sbEJhclRQIDogcHVibGljIENGV0xfV2lkZ2V0VFANCi17DQotcHVibGljOg0KLSAgICBDRldMX1Njcm9sbEJhclRQKCk7DQotICAgIHZpcnR1YWwgfkNGV0xfU2Nyb2xsQmFyVFAoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlTZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9EV09SRCBkd1RoZW1lSUQsIEZYX0JPT0wgYkNoaWxkcmVuID0gVFJVRSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpOw0KLSAgICB2aXJ0dWFsIHZvaWQqCUdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJRHJhd1RodW1iQnRuKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9CT09MIGJWZXJ0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIEZYX0JPT0wgYlBhd0J1dHRvbiA9IFRSVUUsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdm9pZAlEcmF3VHJhY2soQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0JPT0wgYlZlcnQsIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgRlhfQk9PTCBiTG93ZXJUcmFjaywgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCURyYXdNYXhNaW5CdG4oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQgICAgRHJhd1BhdyhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRlhfQk9PTCBiVmVydCwgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJU2V0VGhlbWVEYXRhKEZYX0RXT1JEIGR3SUQpOw0KLSAgICBzdHJ1Y3QgU0JUaGVtZURhdGEgew0KLSAgICAgICAgRlhfQVJHQiBjbHJQYXdDb2xvckxpZ2h0WzRdOw0KLSAgICAgICAgRlhfQVJHQiBjbHJQYXdDb2xvckRhcmtbNF07DQotICAgICAgICBGWF9BUkdCIGNsckJ0bkJLWzRdWzJdOw0KLSAgICAgICAgRlhfQVJHQiBjbHJCdG5Cb3JkZXJbNF07DQotICAgICAgICBGWF9BUkdCIGNsclRyYWNrQktTdGFydDsNCi0gICAgICAgIEZYX0FSR0IgY2xyVHJhY2tCS0VuZDsNCi0gICAgfSAqbV9wVGhlbWVEYXRhOw0KK2NsYXNzIENGV0xfU2Nyb2xsQmFyVFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUCB7DQorIHB1YmxpYzoNCisgIENGV0xfU2Nyb2xsQmFyVFAoKTsNCisgIHZpcnR1YWwgfkNGV0xfU2Nyb2xsQmFyVFAoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgU2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RoZW1lSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3VGh1bWJCdG4oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwNCisgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhd0J1dHRvbiA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdUcmFjayhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJ0LA0KKyAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG93ZXJUcmFjaywNCisgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd01heE1pbkJ0bihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwNCisgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3UGF3KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwNCisgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCk7DQorICBzdHJ1Y3QgU0JUaGVtZURhdGEgew0KKyAgICBGWF9BUkdCIGNsclBhd0NvbG9yTGlnaHRbNF07DQorICAgIEZYX0FSR0IgY2xyUGF3Q29sb3JEYXJrWzRdOw0KKyAgICBGWF9BUkdCIGNsckJ0bkJLWzRdWzJdOw0KKyAgICBGWF9BUkdCIGNsckJ0bkJvcmRlcls0XTsNCisgICAgRlhfQVJHQiBjbHJUcmFja0JLU3RhcnQ7DQorICAgIEZYX0FSR0IgY2xyVHJhY2tCS0VuZDsNCisgIH0gKiBtX3BUaGVtZURhdGE7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvdXRpbHMuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS91dGlscy5oCmluZGV4IGZiYWQyYWQuLjA4M2RlYmYgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS91dGlscy5oCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS91dGlscy5oCkBAIC00LDg0ICs0LDY5IEBACiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KLSNpZm5kZWYJX0ZXTF9USEVNRV9VVElMU19IDQotI2RlZmluZQlfRldMX1RIRU1FX1VUSUxTX0gNCisjaWZuZGVmIF9GV0xfVEhFTUVfVVRJTFNfSA0KKyNkZWZpbmUgX0ZXTF9USEVNRV9VVElMU19IDQogI2RlZmluZSBUSEVNRV9YUFNpbWlsYXINCiBlbnVtIEZXTFRIRU1FX0VER0Ugew0KLSAgICBGV0xUSEVNRV9FREdFX0ZsYXQgPSAwLA0KLSAgICBGV0xUSEVNRV9FREdFX1JhaXNlZCwNCi0gICAgRldMVEhFTUVfRURHRV9TdW5rZW4NCisgIEZXTFRIRU1FX0VER0VfRmxhdCA9IDAsDQorICBGV0xUSEVNRV9FREdFX1JhaXNlZCwNCisgIEZXTFRIRU1FX0VER0VfU3Vua2VuDQogfTsNCiBlbnVtIEZXTFRIRU1FX1NUQVRFIHsNCi0gICAgRldMVEhFTUVfU1RBVEVfTm9ybWFsID0gMSwNCi0gICAgRldMVEhFTUVfU1RBVEVfSG92ZXIsDQotICAgIEZXTFRIRU1FX1NUQVRFX1ByZXNzZWQsDQotICAgIEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlDQorICBGV0xUSEVNRV9TVEFURV9Ob3JtYWwgPSAxLA0KKyAgRldMVEhFTUVfU1RBVEVfSG92ZXIsDQorICBGV0xUSEVNRV9TVEFURV9QcmVzc2VkLA0KKyAgRldMVEhFTUVfU1RBVEVfRGlzYWJhbGUNCiB9Ow0KIGVudW0gRldMVEhFTUVfRElSRUNUSU9OIHsNCi0gICAgRldMVEhFTUVfRElSRUNUSU9OX1VwID0gMCwNCi0gICAgRldMVEhFTUVfRElSRUNUSU9OX0Rvd24sDQotICAgIEZXTFRIRU1FX0RJUkVDVElPTl9MZWZ0LA0KLSAgICBGV0xUSEVNRV9ESVJFQ1RJT05fUmlnaHQNCisgIEZXTFRIRU1FX0RJUkVDVElPTl9VcCA9IDAsDQorICBGV0xUSEVNRV9ESVJFQ1RJT05fRG93biwNCisgIEZXTFRIRU1FX0RJUkVDVElPTl9MZWZ0LA0KKyAgRldMVEhFTUVfRElSRUNUSU9OX1JpZ2h0DQogfTsNCiB0eXBlZGVmIHN0cnVjdCBfRldMQ09MT1Igew0KLSAgICB1bmlvbiB7DQotICAgICAgICBGWF9EV09SRCBjb2xvcjsNCi0gICAgICAgIHN0cnVjdCB7DQotICAgICAgICAgICAgdWludDhfdCBiOw0KLSAgICAgICAgICAgIHVpbnQ4X3QgZzsNCi0gICAgICAgICAgICB1aW50OF90IHI7DQotICAgICAgICAgICAgdWludDhfdCBhOw0KLSAgICAgICAgfTsNCisgIHVuaW9uIHsNCisgICAgRlhfRFdPUkQgY29sb3I7DQorICAgIHN0cnVjdCB7DQorICAgICAgdWludDhfdCBiOw0KKyAgICAgIHVpbnQ4X3QgZzsNCisgICAgICB1aW50OF90IHI7DQorICAgICAgdWludDhfdCBhOw0KICAgICB9Ow0KKyAgfTsNCiANCi0gICAgX0ZXTENPTE9SKCkNCi0gICAgew0KLSAgICAgICAgY29sb3IgPSAwOw0KLSAgICB9DQotICAgIF9GV0xDT0xPUihGWF9EV09SRCBjKQ0KLSAgICB7DQotICAgICAgICBjb2xvciA9IGM7DQotICAgIH0NCi0gICAgX0ZXTENPTE9SKGNvbnN0IF9GV0xDT0xPUiAmYykNCi0gICAgew0KLSAgICAgICAgY29sb3IgPSBjLmNvbG9yOw0KLSAgICB9DQorICBfRldMQ09MT1IoKSB7IGNvbG9yID0gMDsgfQ0KKyAgX0ZXTENPTE9SKEZYX0RXT1JEIGMpIHsgY29sb3IgPSBjOyB9DQorICBfRldMQ09MT1IoY29uc3QgX0ZXTENPTE9SJiBjKSB7IGNvbG9yID0gYy5jb2xvcjsgfQ0KIA0KLSAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBfRldMQ09MT1IgJmZyQ29sb3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb2xvciA9PSBmckNvbG9yLmNvbG9yOw0KLSAgICB9DQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgX0ZXTENPTE9SJiBmckNvbG9yKSB7IHJldHVybiBjb2xvciA9PSBmckNvbG9yLmNvbG9yOyB9DQogDQotICAgIG9wZXJhdG9yIEZYX0RXT1JEKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbG9yOw0KLSAgICB9DQorICBvcGVyYXRvciBGWF9EV09SRCgpIHsgcmV0dXJuIGNvbG9yOyB9DQogfSBGV0xDT0xPUjsNCi0jZGVmaW5lCQlGV0xUSEVNRV9CRVpJRVIJCQkJCTAuNTUyMjg0NzQ5ODMwOGYNCi0jZGVmaW5lCQlGV0xUSEVNRV9QSQkJCQkJCTMuMTQxNTkyZg0KLSNkZWZpbmUJCUZXTFRIRU1FX1BJXzJfMQkJCQkJMS41NzA3OTZmDQotI2RlZmluZQkJRldMVEhFTUVfUElfMl8zCQkJCQk0LjcxMjM4OGYNCi0jZGVmaW5lCQlGV0xUSEVNRV9DT0xPUl9FREdFTFQxCQkJKEFyZ2JFbmNvZGUoMjU1LCAxNzIsIDE2OCwgMTUzKSkNCi0jZGVmaW5lCQlGV0xUSEVNRV9DT0xPUl9FREdFTFQyCQkJKEFyZ2JFbmNvZGUoMjU1LCAxMTMsIDExMSwgMTAwKSkNCi0jZGVmaW5lCQlGV0xUSEVNRV9DT0xPUl9FREdFUkIxCQkJKEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjI2KSkNCi0jZGVmaW5lCQlGV0xUSEVNRV9DT0xPUl9FREdFUkIyCQkJKEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSkNCi0jZGVmaW5lCQlGV0xUSEVNRV9DT0xPUl9CYWNrZ3JvdW5kCQkoQXJnYkVuY29kZSgyNTUsIDIzNiwgMjMzLCAyMTYpKQ0KLSNkZWZpbmUJCUZXTFRIRU1FX0NPTE9SX0JLU2VsZWN0ZWQJCShBcmdiRW5jb2RlKDI1NSwgMTUzLCAxOTMsIDIxOCkpDQotI2RlZmluZQkJRldMVEhFTUVfQ09MT1JfR3JlZW5fQktTZWxlY3RlZAkoQXJnYkVuY29kZSgyNTUsIDE0NywgMTYwLCAxMTIpKQ0KKyNkZWZpbmUgRldMVEhFTUVfQkVaSUVSIDAuNTUyMjg0NzQ5ODMwOGYNCisjZGVmaW5lIEZXTFRIRU1FX1BJIDMuMTQxNTkyZg0KKyNkZWZpbmUgRldMVEhFTUVfUElfMl8xIDEuNTcwNzk2Zg0KKyNkZWZpbmUgRldMVEhFTUVfUElfMl8zIDQuNzEyMzg4Zg0KKyNkZWZpbmUgRldMVEhFTUVfQ09MT1JfRURHRUxUMSAoQXJnYkVuY29kZSgyNTUsIDE3MiwgMTY4LCAxNTMpKQ0KKyNkZWZpbmUgRldMVEhFTUVfQ09MT1JfRURHRUxUMiAoQXJnYkVuY29kZSgyNTUsIDExMywgMTExLCAxMDApKQ0KKyNkZWZpbmUgRldMVEhFTUVfQ09MT1JfRURHRVJCMSAoQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMjYpKQ0KKyNkZWZpbmUgRldMVEhFTUVfQ09MT1JfRURHRVJCMiAoQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpKQ0KKyNkZWZpbmUgRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZCAoQXJnYkVuY29kZSgyNTUsIDIzNiwgMjMzLCAyMTYpKQ0KKyNkZWZpbmUgRldMVEhFTUVfQ09MT1JfQktTZWxlY3RlZCAoQXJnYkVuY29kZSgyNTUsIDE1MywgMTkzLCAyMTgpKQ0KKyNkZWZpbmUgRldMVEhFTUVfQ09MT1JfR3JlZW5fQktTZWxlY3RlZCAoQXJnYkVuY29kZSgyNTUsIDE0NywgMTYwLCAxMTIpKQ0KICNpZmRlZiBUSEVNRV9YUFNpbWlsYXINCi0jZGVmaW5lCQlGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlRmxhdAkJMi4wZg0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfRWRnZUZsYXQgMi4wZg0KICNlbHNlDQotI2RlZmluZQkJRldMVEhFTUVfQ0FQQUNJVFlfRWRnZUZsYXQJCTAuMGYNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0VkZ2VGbGF0IDAuMGYNCiAjZW5kaWYNCi0jZGVmaW5lCQlGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlUmFpc2VkCTIuMGYNCi0jZGVmaW5lCQlGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlU3Vua2VuCTIuMGYNCi0jZGVmaW5lCQlGV0xUSEVNRV9DQVBBQ0lUWV9Gb250U2l6ZQkJMTIuMGYNCi0jZGVmaW5lCQlGV0xUSEVNRV9DQVBBQ0lUWV9MaW5lSGVpZ2h0CTEyLjBmDQotI2RlZmluZSAgICAgRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yICAgICAoQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApKQ0KLSNkZWZpbmUgICAgIEZXTFRIRU1FX0NBUEFDSVRZX1RleHRTZWxDb2xvciAgKEFyZ2JFbmNvZGUoMjU1LCAxNTMsIDE5MywgMjE4KSkNCi0jZGVmaW5lICAgICBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0RGlzQ29sb3IgIChBcmdiRW5jb2RlKDI1NSwgMTcyLCAxNjgsIDE1MykpDQotI2RlZmluZSAgICAgRldMVEhFTUVfQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgJMTcuMGYNCi0jZGVmaW5lCQlGV0xUSEVNRV9DQVBBQ0lUWV9DWEJvcmRlcgkJMS4wZg0KLSNkZWZpbmUJCUZXTFRIRU1FX0NBUEFDSVRZX0NZQm9yZGVyCQkxLjBmDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlUmFpc2VkIDIuMGYNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0VkZ2VTdW5rZW4gMi4wZg0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfRm9udFNpemUgMTIuMGYNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0xpbmVIZWlnaHQgMTIuMGYNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX1RleHRDb2xvciAoQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApKQ0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfVGV4dFNlbENvbG9yIChBcmdiRW5jb2RlKDI1NSwgMTUzLCAxOTMsIDIxOCkpDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0RGlzQ29sb3IgKEFyZ2JFbmNvZGUoMjU1LCAxNzIsIDE2OCwgMTUzKSkNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX1Njcm9sbEJhcldpZHRoIDE3LjBmDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9DWEJvcmRlciAxLjBmDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUJvcmRlciAxLjBmDQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL3dpZGdldHRwLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvd2lkZ2V0dHAuaAppbmRleCA2NDYwYjJiLi5jZDdjYzBkIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvd2lkZ2V0dHAuaAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvd2lkZ2V0dHAuaApAQCAtMTYsMTEwICsxNiwxODQgQEAKICNlbmRpZg0KIGNsYXNzIENGV0xfV2lkZ2V0VFA7DQogY2xhc3MgQ0ZXTF9BcnJvd0RhdGE7DQotY2xhc3MgQ0ZXTF9XaWRnZXRUUA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJU2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRFdPUkQgZHdUaGVtZUlELCBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfTWF0cml4ICZtYXRyaXgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3VGV4dChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcyk7DQotICAgIHZpcnR1YWwgdm9pZCogICBHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNDdXN0b21pemVkTGF5b3V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgQ0ZYX1JlY3RGICZydFBhcnQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzSW5QYXJ0KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsCUZYX0JPT0wJCUNhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcywgQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9XaWRnZXRUUCgpOw0KLSAgICBGV0xfRVJSCQlTZXRGb250KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBGWF9XQ0hBUiogc3RyRm9udCwgRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9BUkdCIHJnYkZvbnQpOw0KLSAgICBGV0xfRVJSCQlTZXRGb250KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBJRlhfRm9udCAqcEZvbnQsIEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQVJHQiByZ2JGb250KTsNCi0gICAgSUZYX0ZvbnQqCUdldEZvbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZXTF9XaWRnZXRUUCgpOw0KLSAgICBGWF9FUlIJSW5pdFRUTygpOw0KLSAgICBGWF9FUlIJRmluYWxpemVUVE8oKTsNCi0gICAgdm9pZAlEcmF3RWRnZShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfRFdPUkQgZHdTdHlsZXMsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdm9pZAlEcmF3M0RSZWN0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGV0xUSEVNRV9FREdFIGVUeXBlLCBGWF9GTE9BVCBmV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0FSR0IgY3IxLCBGWF9BUkdCIGNyMiwgRlhfQVJHQiBjcjMsIEZYX0FSR0IgY3I0LCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJRHJhdzNEQ2lyY2xlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGV0xUSEVNRV9FREdFIGVUeXBlLCBGWF9GTE9BVCBmV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0FSR0IgY3IxLCBGWF9BUkdCIGNyMiwgRlhfQVJHQiBjcjMsIEZYX0FSR0IgY3I0LCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJRHJhd0JvcmRlcihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCUZpbGxCYWNrZ3JvdW5kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJRmlsbFNvaWxkUmVjdChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfQVJHQiBmaWxsQ29sb3IsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdm9pZAlEcmF3QXhpYWxTaGFkaW5nKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGWF9GTE9BVCBmeDEsIEZYX0ZMT0FUIGZ5MSwgRlhfRkxPQVQgZngyLCBGWF9GTE9BVCBmeTIsIEZYX0FSR0IgYmVnaW5Db2xvciwgRlhfQVJHQiBlbmRDb2xvciwgQ0ZYX1BhdGggKnBhdGgsIGludDMyX3QgZmlsbE1vZGUgPSBGWEZJTExfV0lORElORywgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCURyYXdBbm51bHVzUmVjdChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfQVJHQiBmaWxsQ29sb3IsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0ZMT0FUIGZSaW5nV2lkdGggPSAxLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJRHJhd0FubnVsdXNDaXJjbGUoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIEZYX0FSR0IgZmlsbENvbG9yLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9GTE9BVCBmV2lkdGggPSAxLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJRHJhd0ZvY3VzKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJRHJhd0Fycm93KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsIEZYX0FSR0IgYXJnYkZpbGwsIEZYX0JPT0wgYlByZXNzZWQsIENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdm9pZAlEcmF3QXJyb3coQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwgRlhfQVJHQiBhcmdTaWduLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJRHJhd0J0bihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJRHJhd0Fycm93QnRuKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICBGV0xDT0xPUiBCbGVuZENvbG9yKEZXTENPTE9SIHNyY0NvbG9yLCBGV0xDT0xPUiByZW5kZXJDb2xvciwgdWludDhfdCBzY2FsZSk7DQotICAgIEZYX0RXT1JECQltX2R3UmVmQ291bnQ7DQotICAgIElGREVfVGV4dE91dCAgICptX3BUZXh0T3V0Ow0KLSAgICBJRlhfRm9udAkgICAqbV9wRkRFRm9udDsNCi0gICAgRlhfRkxPQVQJCW1fZlZhbHVlOw0KLSAgICBGWF9EV09SRAkJbV9kd1ZhbHVlOw0KLSAgICBDRlhfUmVjdEYJCW1fcnRNYXJnaW47DQotICAgIEZYX0RXT1JECQltX2R3VGhlbWVJRDsNCi0gICAgQ0ZYX01hdHJpeAkJX2N0bTsNCitjbGFzcyBDRldMX1dpZGdldFRQIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgU2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RoZW1lSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX01hdHJpeCYgbWF0cml4KTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3VGV4dChDRldMX1RoZW1lVGV4dCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBDRlhfUmVjdEYmIHJ0UGFydCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNJblBhcnQoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCogcFBhcmFtcywgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIHZpcnR1YWwgfkNGV0xfV2lkZ2V0VFAoKTsNCisgIEZXTF9FUlIgU2V0Rm9udChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3RyRm9udCwNCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgRlhfQVJHQiByZ2JGb250KTsNCisgIEZXTF9FUlIgU2V0Rm9udChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICBJRlhfRm9udCogcEZvbnQsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgIEZYX0FSR0IgcmdiRm9udCk7DQorICBJRlhfRm9udCogR2V0Rm9udChJRldMX1dpZGdldCogcFdpZGdldCk7DQorDQorIHByb3RlY3RlZDoNCisgIENGV0xfV2lkZ2V0VFAoKTsNCisgIEZYX0VSUiBJbml0VFRPKCk7DQorICBGWF9FUlIgRmluYWxpemVUVE8oKTsNCisgIHZvaWQgRHJhd0VkZ2UoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzLA0KKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXczRFJlY3QoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRURHRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyMSwNCisgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyMiwNCisgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyMywNCisgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyNCwNCisgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXczRENpcmNsZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0VER0UgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjEsDQorICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyMiwNCisgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgY3IzLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjQsDQorICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdCb3JkZXIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIEZpbGxCYWNrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIEZpbGxTb2lsZFJlY3QoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdBeGlhbFNoYWRpbmcoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5MSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYmVnaW5Db2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGVuZENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoKiBwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmlsbE1vZGUgPSBGWEZJTExfV0lORElORywNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdBbm51bHVzUmVjdChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZSaW5nV2lkdGggPSAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3QW5udWx1c0NpcmNsZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0ZvY3VzKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0Fycm93KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwNCisgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmVzc2VkLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3QXJyb3coQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LA0KKyAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdTaWduLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3QnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0Fycm93QnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwNCisgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIEZXTENPTE9SIEJsZW5kQ29sb3IoRldMQ09MT1Igc3JjQ29sb3IsIEZXTENPTE9SIHJlbmRlckNvbG9yLCB1aW50OF90IHNjYWxlKTsNCisgIEZYX0RXT1JEIG1fZHdSZWZDb3VudDsNCisgIElGREVfVGV4dE91dCogbV9wVGV4dE91dDsNCisgIElGWF9Gb250KiBtX3BGREVGb250Ow0KKyAgRlhfRkxPQVQgbV9mVmFsdWU7DQorICBGWF9EV09SRCBtX2R3VmFsdWU7DQorICBDRlhfUmVjdEYgbV9ydE1hcmdpbjsNCisgIEZYX0RXT1JEIG1fZHdUaGVtZUlEOw0KKyAgQ0ZYX01hdHJpeCBfY3RtOw0KIH07DQotRlhfQk9PTAlGV0xUSEVNRV9Jbml0KCk7DQotdm9pZAlGV0xUSEVNRV9SZWxlYXNlKCk7DQorRlhfQk9PTCBGV0xUSEVNRV9Jbml0KCk7DQordm9pZCBGV0xUSEVNRV9SZWxlYXNlKCk7DQogRlhfRFdPUkQgRldMX0dldFRoZW1lTGF5b3V0KEZYX0RXT1JEIGR3VGhlbWVJRCk7DQogRlhfRFdPUkQgRldMX0dldFRoZW1lQ29sb3IoRlhfRFdPUkQgZHdUaGVtZUlEKTsNCiBGWF9EV09SRCBGV0xfTWFrZVRoZW1lSUQoRlhfRFdPUkQgZHdMYXlvdXQsIEZYX0RXT1JEIGR3Q29sb3IpOw0KLWNsYXNzIENGV0xfQXJyb3dEYXRhDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIENGV0xfQXJyb3dEYXRhKiBHZXRJbnN0YW5jZSgpOw0KLSAgICBzdGF0aWMgRlhfQk9PTCBJc0luc3RhbmNlKCk7DQotICAgIHN0YXRpYyB2b2lkIERlc3Ryb3lJbnN0YW5jZSgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0Fycm93RGF0YSgpOw0KLSAgICB2b2lkIFNldENvbG9yRGF0YShGWF9EV09SRAlkd0lEKTsNCitjbGFzcyBDRldMX0Fycm93RGF0YSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRldMX0Fycm93RGF0YSogR2V0SW5zdGFuY2UoKTsNCisgIHN0YXRpYyBGWF9CT09MIElzSW5zdGFuY2UoKTsNCisgIHN0YXRpYyB2b2lkIERlc3Ryb3lJbnN0YW5jZSgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9BcnJvd0RhdGEoKTsNCisgIHZvaWQgU2V0Q29sb3JEYXRhKEZYX0RXT1JEIGR3SUQpOw0KIA0KLSAgICBjbGFzcyBDQ29sb3JEYXRhDQotICAgIHsNCi0gICAgcHVibGljOg0KLSAgICAgICAgRlhfQVJHQiBjbHJCb3JkZXJbNF07DQotICAgICAgICBGWF9BUkdCIGNsclN0YXJ0WzRdOw0KLSAgICAgICAgRlhfQVJHQiBjbHJFbmRbNF07DQotICAgICAgICBGWF9BUkdCCWNsclNpZ25bNF07DQotICAgIH0gKm1fcENvbG9yRGF0YTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGV0xfQXJyb3dEYXRhKCk7DQotICAgIHN0YXRpYyBDRldMX0Fycm93RGF0YSAqbV9wSW5zdGFuY2U7DQorICBjbGFzcyBDQ29sb3JEYXRhIHsNCisgICBwdWJsaWM6DQorICAgIEZYX0FSR0IgY2xyQm9yZGVyWzRdOw0KKyAgICBGWF9BUkdCIGNsclN0YXJ0WzRdOw0KKyAgICBGWF9BUkdCIGNsckVuZFs0XTsNCisgICAgRlhfQVJHQiBjbHJTaWduWzRdOw0KKyAgfSAqIG1fcENvbG9yRGF0YTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9BcnJvd0RhdGEoKTsNCisgIHN0YXRpYyBDRldMX0Fycm93RGF0YSogbV9wSW5zdGFuY2U7DQogfTsNCi1jbGFzcyBDRldMX0ZvbnREYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Gb250RGF0YSgpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0ZvbnREYXRhKCk7DQotICAgIEZYX0JPT0wgRXF1YWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UpOw0KLSAgICBGWF9CT09MIExvYWRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKTsNCi0gICAgSUZYX0ZvbnQqICBHZXRGb250KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcEZvbnQ7DQotICAgIH0NCi1wcm90ZWN0ZWQ6DQotICAgIENGWF9XaWRlU3RyaW5nCQkJbV93c0ZhbWlseTsNCi0gICAgRlhfRFdPUkQJCQkJbV9kd1N0eWxlczsNCi0gICAgRlhfRFdPUkQJCQkJbV9kd0NvZGVQYWdlOw0KLSAgICBJRlhfRm9udAkJCQkqbV9wRm9udDsNCi0gICAgSUZYX0ZvbnRNZ3IJCQkJKm1fcEZvbnRNZ3I7DQorY2xhc3MgQ0ZXTF9Gb250RGF0YSB7DQorIHB1YmxpYzoNCisgIENGV0xfRm9udERhdGEoKTsNCisgIHZpcnR1YWwgfkNGV0xfRm9udERhdGEoKTsNCisgIEZYX0JPT0wgRXF1YWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpOw0KKyAgRlhfQk9PTCBMb2FkRm9udChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSk7DQorICBJRlhfRm9udCogR2V0Rm9udCgpIGNvbnN0IHsgcmV0dXJuIG1fcEZvbnQ7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0ZhbWlseTsNCisgIEZYX0RXT1JEIG1fZHdTdHlsZXM7DQorICBGWF9EV09SRCBtX2R3Q29kZVBhZ2U7DQorICBJRlhfRm9udCogbV9wRm9udDsNCisgIElGWF9Gb250TWdyKiBtX3BGb250TWdyOw0KICNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQotICAgIElGWF9Gb250U291cmNlRW51bQkJKm1fcEZvbnRTb3VyY2U7DQorICBJRlhfRm9udFNvdXJjZUVudW0qIG1fcEZvbnRTb3VyY2U7DQogI2VuZGlmDQogfTsNCi1jbGFzcyBDRldMX0ZvbnRNYW5hZ2VyDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Gb250TWFuYWdlcigpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0ZvbnRNYW5hZ2VyKCk7DQotICAgIElGWF9Gb250KiBGaW5kRm9udChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIGR3Q29kZVBhZ2UpOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX1B0ckFycmF5ICAgIG1fYXJyRm9udHM7DQorY2xhc3MgQ0ZXTF9Gb250TWFuYWdlciB7DQorIHB1YmxpYzoNCisgIENGV0xfRm9udE1hbmFnZXIoKTsNCisgIHZpcnR1YWwgfkNGV0xfRm9udE1hbmFnZXIoKTsNCisgIElGWF9Gb250KiBGaW5kRm9udChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBkd0NvZGVQYWdlKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1B0ckFycmF5IG1fYXJyRm9udHM7DQogfTsNCi1DRldMX0ZvbnRNYW5hZ2VyICpGV0xfR2V0Rm9udE1hbmFnZXIoKTsNCitDRldMX0ZvbnRNYW5hZ2VyKiBGV0xfR2V0Rm9udE1hbmFnZXIoKTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9meGJhcmNvZGUvQkNfQmFyQ29kZS5oIGIveGZhL2luY2x1ZGUvZnhiYXJjb2RlL0JDX0JhckNvZGUuaAppbmRleCBhNjc2NTNlLi45NjYyNWFmIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9meGJhcmNvZGUvQkNfQmFyQ29kZS5oCisrKyBiL3hmYS9pbmNsdWRlL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmgKQEAgLTEyLDIzOCArMTIsMjM3IEBACiBjbGFzcyBDQkNfV3JpdGVyOw0KIGNsYXNzIENCQ19SZWFkZXI7DQogZW51bSBCQ19URVhUX0xPQyB7DQotICAgIEJDX1RFWFRfTE9DX05PTkUJCT0gMCwNCi0gICAgQkNfVEVYVF9MT0NfQUJPVkUsDQotICAgIEJDX1RFWFRfTE9DX0JFTE9XLA0KLSAgICBCQ19URVhUX0xPQ19BQk9WRUVNQkVELA0KLSAgICBCQ19URVhUX0xPQ19CRUxPV0VNQkVEDQorICBCQ19URVhUX0xPQ19OT05FID0gMCwNCisgIEJDX1RFWFRfTE9DX0FCT1ZFLA0KKyAgQkNfVEVYVF9MT0NfQkVMT1csDQorICBCQ19URVhUX0xPQ19BQk9WRUVNQkVELA0KKyAgQkNfVEVYVF9MT0NfQkVMT1dFTUJFRA0KIH07DQotZW51bSBCQ19DSEFSX0VOQ09ESU5HIHsNCi0gICAgQ0hBUl9FTkNPRElOR19VVEY4CQk9IDAsDQotICAgIENIQVJfRU5DT0RJTkdfVU5JQ09ERQ0KLX07DQorZW51bSBCQ19DSEFSX0VOQ09ESU5HIHsgQ0hBUl9FTkNPRElOR19VVEY4ID0gMCwgQ0hBUl9FTkNPRElOR19VTklDT0RFIH07DQogZW51bSBCQ19UWVBFIHsNCi0gICAgQkNfVU5LTk9XTgkJCQk9IC0xLA0KLSAgICBCQ19DT0RFMzkJCQkJPSAwLA0KLSAgICBCQ19DT0RBQkFSLA0KLSAgICBCQ19DT0RFMTI4LA0KLSAgICBCQ19DT0RFMTI4X0IsDQotICAgIEJDX0NPREUxMjhfQywNCi0gICAgQkNfRUFOOCwNCi0gICAgQkNfVVBDQSwNCi0gICAgQkNfRUFOMTMsDQotICAgIEJDX1FSX0NPREUsDQotICAgIEJDX1BERjQxNywNCi0gICAgQkNfREFUQU1BVFJJWA0KKyAgQkNfVU5LTk9XTiA9IC0xLA0KKyAgQkNfQ09ERTM5ID0gMCwNCisgIEJDX0NPREFCQVIsDQorICBCQ19DT0RFMTI4LA0KKyAgQkNfQ09ERTEyOF9CLA0KKyAgQkNfQ09ERTEyOF9DLA0KKyAgQkNfRUFOOCwNCisgIEJDX1VQQ0EsDQorICBCQ19FQU4xMywNCisgIEJDX1FSX0NPREUsDQorICBCQ19QREY0MTcsDQorICBCQ19EQVRBTUFUUklYDQogfTsNCi1jbGFzcyBDQkNfQ29kZUJhc2UNCi17DQotcHVibGljOg0KLSAgICBDQkNfQ29kZUJhc2UoKTsNCi0gICAgdmlydHVhbCB+Q0JDX0NvZGVCYXNlKCk7DQotICAgIHZpcnR1YWwgQkNfVFlQRQkgR2V0VHlwZSgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MICBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgaW50MzJfdCAmZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBpbnQzMl90ICZlKSA9IDA7DQotICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCAmZSkgPSAwOw0KLSAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIGludDMyX3QgJmUpID0gMDsNCitjbGFzcyBDQkNfQ29kZUJhc2Ugew0KKyBwdWJsaWM6DQorICBDQkNfQ29kZUJhc2UoKTsNCisgIHZpcnR1YWwgfkNCQ19Db2RlQmFzZSgpOw0KKyAgdmlydHVhbCBCQ19UWVBFIEdldFR5cGUoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgPSAwOw0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBEZWNvZGUodWludDhfdCogYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpID0gMDsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MICBTZXRDaGFyRW5jb2RpbmcoaW50MzJfdCBlbmNvZGluZyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTCAgU2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgbW9kdWxlSGVpZ2h0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MICBTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDaGFyRW5jb2RpbmcoaW50MzJfdCBlbmNvZGluZyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgbW9kdWxlSGVpZ2h0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKTsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MICBTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgIFNldFdpZHRoKGludDMyX3Qgd2lkdGgpOw0KLSAgICB2aXJ0dWFsIHZvaWQgICAgIFNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcik7DQotICAgIHZpcnR1YWwgdm9pZCAgICAgU2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENCQ19Xcml0ZXIgKgltX3BCQ1dyaXRlcjsNCi0gICAgQ0JDX1JlYWRlciAqCW1fcEJDUmVhZGVyOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEhlaWdodChpbnQzMl90IGhlaWdodCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0V2lkdGgoaW50MzJfdCB3aWR0aCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0QmFja2dyb3VuZENvbG9yKEZYX0FSR0IgYmFja2dyb3VuZENvbG9yKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRCYXJjb2RlQ29sb3IoRlhfQVJHQiBmb3JlZ3JvdW5kQ29sb3IpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDQkNfV3JpdGVyKiBtX3BCQ1dyaXRlcjsNCisgIENCQ19SZWFkZXIqIG1fcEJDUmVhZGVyOw0KIH07DQotY2xhc3MgQ0JDX09uZUNvZGUgOiBwdWJsaWMgQ0JDX0NvZGVCYXNlDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX09uZUNvZGUoKTsNCi0gICAgdmlydHVhbCB+Q0JDX09uZUNvZGUoKTsNCi0gICAgdmlydHVhbCBCQ19UWVBFCSBHZXRUeXBlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBpbnQzMl90ICZlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIGludDMyX3QgJmUpID0gMDsNCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90ICZlKSA9IDA7DQotICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgaW50MzJfdCAmZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0UHJpbnRDaGVja3N1bShGWF9CT09MIGNoZWNrc3VtKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0RGF0YUxlbmd0aChpbnQzMl90IGxlbmd0aCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldENhbENoZWNrc3VtKEZYX0JPT0wgY2FsYyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEZvbnQoQ0ZYX0ZvbnQgKiBjRm9udCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIHNpemUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldEZvbnRDb2xvcihGWF9BUkdCIGNvbG9yKTsNCitjbGFzcyBDQkNfT25lQ29kZSA6IHB1YmxpYyBDQkNfQ29kZUJhc2Ugew0KKyBwdWJsaWM6DQorICBDQkNfT25lQ29kZSgpOw0KKyAgdmlydHVhbCB+Q0JDX09uZUNvZGUoKTsNCisgIHZpcnR1YWwgQkNfVFlQRSBHZXRUeXBlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgPSAwOw0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEZpbHRlckNvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgdmlydHVhbCB2b2lkIFNldFByaW50Q2hlY2tzdW0oRlhfQk9PTCBjaGVja3N1bSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0RGF0YUxlbmd0aChpbnQzMl90IGxlbmd0aCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2FsQ2hlY2tzdW0oRlhfQk9PTCBjYWxjKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRGb250KENGWF9Gb250KiBjRm9udCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgc2l6ZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRDb2xvcihGWF9BUkdCIGNvbG9yKTsNCiB9Ow0KLWNsYXNzIENCQ19Db2RlMzkgOiBwdWJsaWMgQ0JDX09uZUNvZGUNCi17DQotcHVibGljOg0KLSAgICBDQkNfQ29kZTM5KCk7DQotICAgIENCQ19Db2RlMzkoRlhfQk9PTCB1c2luZ0NoZWNrRGlnaXQpOw0KLSAgICBDQkNfQ29kZTM5KEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0LCBGWF9CT09MIGV4dGVuZGVkTW9kZSk7DQotICAgIHZpcnR1YWwgfkNCQ19Db2RlMzkoKTsNCi0gICAgRlhfQk9PTCAJCUVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKTsNCi0gICAgRlhfQk9PTAkJCVJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wJCQlSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgaW50MzJfdCAmZSk7DQotICAgIENGWF9XaWRlU3RyaW5nCURlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBpbnQzMl90ICZlKTsNCi0gICAgQkNfVFlQRQkJCUdldFR5cGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkNfQ09ERTM5Ow0KLSAgICB9DQotICAgIEZYX0JPT0wJCQlTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOw0KLSAgICBGWF9CT09MCQkJU2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pOw0KLXByaXZhdGU6DQotICAgIENGWF9XaWRlU3RyaW5nICBtX3JlbmRlckNvbnRlbnRzOw0KK2NsYXNzIENCQ19Db2RlMzkgOiBwdWJsaWMgQ0JDX09uZUNvZGUgew0KKyBwdWJsaWM6DQorICBDQkNfQ29kZTM5KCk7DQorICBDQkNfQ29kZTM5KEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0KTsNCisgIENCQ19Db2RlMzkoRlhfQk9PTCB1c2luZ0NoZWNrRGlnaXQsIEZYX0JPT0wgZXh0ZW5kZWRNb2RlKTsNCisgIHZpcnR1YWwgfkNCQ19Db2RlMzkoKTsNCisgIEZYX0JPT0wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBCQ19UWVBFIEdldFR5cGUoKSB7IHJldHVybiBCQ19DT0RFMzk7IH0NCisgIEZYX0JPT0wgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsNCisgIEZYX0JPT0wgU2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV9yZW5kZXJDb250ZW50czsNCiB9Ow0KLWNsYXNzIENCQ19Db2RhYmFyIDogcHVibGljIENCQ19PbmVDb2RlDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0NvZGFiYXIoKTsNCi0gICAgdmlydHVhbCB+Q0JDX0NvZGFiYXIoKTsNCi0gICAgRlhfQk9PTAkJICAgIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKTsNCi0gICAgRlhfQk9PTAkJCVJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wJCQlSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgaW50MzJfdCAmZSk7DQotICAgIENGWF9XaWRlU3RyaW5nCURlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBpbnQzMl90ICZlKTsNCi0gICAgQkNfVFlQRQkJCUdldFR5cGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkNfQ09EQUJBUjsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQkJU2V0U3RhcnRDaGFyKEZYX0NIQVIgc3RhcnQpOw0KLSAgICBGWF9CT09MCQkJU2V0RW5kQ2hhcihGWF9DSEFSIGVuZCk7DQotICAgIEZYX0JPT0wJCQlTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOw0KLSAgICBGWF9CT09MCQkJU2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pOw0KLXByaXZhdGU6DQotICAgIENGWF9XaWRlU3RyaW5nICBtX3JlbmRlckNvbnRlbnRzOw0KK2NsYXNzIENCQ19Db2RhYmFyIDogcHVibGljIENCQ19PbmVDb2RlIHsNCisgcHVibGljOg0KKyAgQ0JDX0NvZGFiYXIoKTsNCisgIHZpcnR1YWwgfkNCQ19Db2RhYmFyKCk7DQorICBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBDRlhfV2lkZVN0cmluZyBEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpOw0KKyAgQkNfVFlQRSBHZXRUeXBlKCkgeyByZXR1cm4gQkNfQ09EQUJBUjsgfQ0KKyAgRlhfQk9PTCBTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydCk7DQorICBGWF9CT09MIFNldEVuZENoYXIoRlhfQ0hBUiBlbmQpOw0KKyAgRlhfQk9PTCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOw0KKyAgRlhfQk9PTCBTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbyk7DQorDQorIHByaXZhdGU6DQorICBDRlhfV2lkZVN0cmluZyBtX3JlbmRlckNvbnRlbnRzOw0KIH07DQotY2xhc3MgQ0JDX0NvZGUxMjggOiBwdWJsaWMgQ0JDX09uZUNvZGUNCi17DQotcHJpdmF0ZToNCi0gICAgQkNfVFlQRSAgbV90eXBlOw0KLXB1YmxpYzoNCi0gICAgQ0JDX0NvZGUxMjgoQkNfVFlQRSB0eXBlKTsNCi0gICAgdmlydHVhbCB+Q0JDX0NvZGUxMjgoKTsNCi0gICAgRlhfQk9PTAkJCUVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKTsNCi0gICAgRlhfQk9PTAkJCVJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wJCQlSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgaW50MzJfdCAmZSk7DQotICAgIENGWF9XaWRlU3RyaW5nCURlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBpbnQzMl90ICZlKTsNCi0gICAgQkNfVFlQRQkJCUdldFR5cGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkNfQ09ERTEyODsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQkJU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY3Rpb24pOw0KLXByaXZhdGU6DQotICAgIENGWF9XaWRlU3RyaW5nICBtX3JlbmRlckNvbnRlbnRzOw0KK2NsYXNzIENCQ19Db2RlMTI4IDogcHVibGljIENCQ19PbmVDb2RlIHsNCisgcHJpdmF0ZToNCisgIEJDX1RZUEUgbV90eXBlOw0KKw0KKyBwdWJsaWM6DQorICBDQkNfQ29kZTEyOChCQ19UWVBFIHR5cGUpOw0KKyAgdmlydHVhbCB+Q0JDX0NvZGUxMjgoKTsNCisgIEZYX0JPT0wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBCQ19UWVBFIEdldFR5cGUoKSB7IHJldHVybiBCQ19DT0RFMTI4OyB9DQorICBGWF9CT09MIFNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2N0aW9uKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9XaWRlU3RyaW5nIG1fcmVuZGVyQ29udGVudHM7DQogfTsNCi1jbGFzcyBDQkNfRUFOOCA6IHB1YmxpYyBDQkNfT25lQ29kZQ0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19FQU44KCk7DQotICAgIHZpcnR1YWwgfkNCQ19FQU44KCk7DQotICAgIEZYX0JPT0wJCQlFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wJCQlSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIGludDMyX3QgJmUpOw0KLSAgICBGWF9CT09MCQkJUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90ICZlKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJRGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgaW50MzJfdCAmZSk7DQotICAgIEJDX1RZUEUJCQlHZXRUeXBlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJDX0VBTjg7DQotICAgIH0NCi1wcml2YXRlOg0KLSAgICBDRlhfV2lkZVN0cmluZwlQcmVwcm9jZXNzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KLSAgICBDRlhfV2lkZVN0cmluZyAgbV9yZW5kZXJDb250ZW50czsNCitjbGFzcyBDQkNfRUFOOCA6IHB1YmxpYyBDQkNfT25lQ29kZSB7DQorIHB1YmxpYzoNCisgIENCQ19FQU44KCk7DQorICB2aXJ0dWFsIH5DQkNfRUFOOCgpOw0KKyAgRlhfQk9PTCBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCYgZSk7DQorICBDRlhfV2lkZVN0cmluZyBEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90JiBlKTsNCisgIEJDX1RZUEUgR2V0VHlwZSgpIHsgcmV0dXJuIEJDX0VBTjg7IH0NCisNCisgcHJpdmF0ZToNCisgIENGWF9XaWRlU3RyaW5nIFByZXByb2Nlc3MoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBDRlhfV2lkZVN0cmluZyBtX3JlbmRlckNvbnRlbnRzOw0KIH07DQotY2xhc3MgQ0JDX0VBTjEzIDogcHVibGljIENCQ19PbmVDb2RlDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0VBTjEzKCk7DQotICAgIHZpcnR1YWwgfkNCQ19FQU4xMygpOw0KLSAgICBGWF9CT09MIAkJRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QgJmUpOw0KLSAgICBGWF9CT09MCQkJUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBpbnQzMl90ICZlKTsNCi0gICAgRlhfQk9PTAkJCVJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBpbnQzMl90ICZlKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCAmZSk7DQotICAgIENGWF9XaWRlU3RyaW5nCURlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIGludDMyX3QgJmUpOw0KLSAgICBCQ19UWVBFCQkJR2V0VHlwZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCQ19FQU4xMzsNCi0gICAgfQ0KLXByaXZhdGU6DQotICAgIENGWF9XaWRlU3RyaW5nCVByZXByb2Nlc3MoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQotICAgIENGWF9XaWRlU3RyaW5nICBtX3JlbmRlckNvbnRlbnRzOw0KK2NsYXNzIENCQ19FQU4xMyA6IHB1YmxpYyBDQkNfT25lQ29kZSB7DQorIHB1YmxpYzoNCisgIENCQ19FQU4xMygpOw0KKyAgdmlydHVhbCB+Q0JDX0VBTjEzKCk7DQorICBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBDRlhfV2lkZVN0cmluZyBEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpOw0KKyAgQkNfVFlQRSBHZXRUeXBlKCkgeyByZXR1cm4gQkNfRUFOMTM7IH0NCisNCisgcHJpdmF0ZToNCisgIENGWF9XaWRlU3RyaW5nIFByZXByb2Nlc3MoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBDRlhfV2lkZVN0cmluZyBtX3JlbmRlckNvbnRlbnRzOw0KIH07DQotY2xhc3MgQ0JDX1VQQ0EgOiBwdWJsaWMgQ0JDX09uZUNvZGUNCi17DQotcHVibGljOg0KLSAgICBDQkNfVVBDQSgpOw0KLSAgICB2aXJ0dWFsIH5DQkNfVVBDQSgpOw0KLSAgICBGWF9CT09MIAkJRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QgJmUpOw0KLSAgICBGWF9CT09MCQkJUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBpbnQzMl90ICZlKTsNCi0gICAgRlhfQk9PTAkJCVJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBpbnQzMl90ICZlKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCAmZSk7DQotICAgIENGWF9XaWRlU3RyaW5nCURlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIGludDMyX3QgJmUpOw0KLSAgICBCQ19UWVBFCQkJR2V0VHlwZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCQ19VUENBOw0KLSAgICB9DQotcHJpdmF0ZToNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJUHJlcHJvY2Vzcyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgIG1fcmVuZGVyQ29udGVudHM7DQorY2xhc3MgQ0JDX1VQQ0EgOiBwdWJsaWMgQ0JDX09uZUNvZGUgew0KKyBwdWJsaWM6DQorICBDQkNfVVBDQSgpOw0KKyAgdmlydHVhbCB+Q0JDX1VQQ0EoKTsNCisgIEZYX0JPT0wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBCQ19UWVBFIEdldFR5cGUoKSB7IHJldHVybiBCQ19VUENBOyB9DQorDQorIHByaXZhdGU6DQorICBDRlhfV2lkZVN0cmluZyBQcmVwcm9jZXNzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV9yZW5kZXJDb250ZW50czsNCiB9Ow0KLWNsYXNzIENCQ19RUkNvZGUgOiBwdWJsaWMgQ0JDX0NvZGVCYXNlDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX1FSQ29kZSgpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUVJDb2RlKCk7DQotICAgIEZYX0JPT0wgCQlFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wJCQlSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIGludDMyX3QgJmUpOw0KLSAgICBGWF9CT09MCQkJUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90ICZlKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJRGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgaW50MzJfdCAmZSk7DQotICAgIEJDX1RZUEUJCUdldFR5cGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkNfUVJfQ09ERTsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQlTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbik7DQotICAgIEZYX0JPT0wJCVNldEVycm9yQ29ycmVjdGlvbkxldmVsIChpbnQzMl90IGxldmVsKTsNCitjbGFzcyBDQkNfUVJDb2RlIDogcHVibGljIENCQ19Db2RlQmFzZSB7DQorIHB1YmxpYzoNCisgIENCQ19RUkNvZGUoKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGUoKTsNCisgIEZYX0JPT0wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBCQ19UWVBFIEdldFR5cGUoKSB7IHJldHVybiBCQ19RUl9DT0RFOyB9DQorICBGWF9CT09MIFNldFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKTsNCisgIEZYX0JPT0wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCk7DQogfTsNCi1jbGFzcyBDQkNfUERGNDE3SSA6IHB1YmxpYyBDQkNfQ29kZUJhc2UNCi17DQotcHVibGljOg0KLSAgICBDQkNfUERGNDE3SSgpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUERGNDE3SSgpOw0KLSAgICBGWF9CT09MCQkJRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QgJmUpOw0KLSAgICBGWF9CT09MCQkJUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBpbnQzMl90ICZlKTsNCi0gICAgRlhfQk9PTAkJCVJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBpbnQzMl90ICZlKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCAmZSk7DQotICAgIENGWF9XaWRlU3RyaW5nCURlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIGludDMyX3QgJmUpOw0KLSAgICBCQ19UWVBFCQlHZXRUeXBlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJDX1BERjQxNzsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQlTZXRFcnJvckNvcnJlY3Rpb25MZXZlbCAoaW50MzJfdCBsZXZlbCk7DQotICAgIHZvaWQJCVNldFRydW5jYXRlZChGWF9CT09MIHRydW5jYXRlZCk7DQorY2xhc3MgQ0JDX1BERjQxN0kgOiBwdWJsaWMgQ0JDX0NvZGVCYXNlIHsNCisgcHVibGljOg0KKyAgQ0JDX1BERjQxN0koKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdJKCk7DQorICBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBDRlhfV2lkZVN0cmluZyBEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpOw0KKyAgQkNfVFlQRSBHZXRUeXBlKCkgeyByZXR1cm4gQkNfUERGNDE3OyB9DQorICBGWF9CT09MIFNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpOw0KKyAgdm9pZCBTZXRUcnVuY2F0ZWQoRlhfQk9PTCB0cnVuY2F0ZWQpOw0KIH07DQotY2xhc3MgQ0JDX0RhdGFNYXRyaXggOiBwdWJsaWMgQ0JDX0NvZGVCYXNlDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0RhdGFNYXRyaXgoKTsNCi0gICAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXgoKTsNCi0gICAgRlhfQk9PTCAJCUVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKTsNCi0gICAgRlhfQk9PTAkJCVJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wJCQlSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgaW50MzJfdCAmZSk7DQotICAgIENGWF9XaWRlU3RyaW5nCURlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfV2lkZVN0cmluZwlEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBpbnQzMl90ICZlKTsNCi0gICAgQkNfVFlQRQkJR2V0VHlwZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCQ19EQVRBTUFUUklYOw0KLSAgICB9DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXggOiBwdWJsaWMgQ0JDX0NvZGVCYXNlIHsNCisgcHVibGljOg0KKyAgQ0JDX0RhdGFNYXRyaXgoKTsNCisgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4KCk7DQorICBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBDRlhfV2lkZVN0cmluZyBEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpOw0KKyAgQkNfVFlQRSBHZXRUeXBlKCkgeyByZXR1cm4gQkNfREFUQU1BVFJJWDsgfQ0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZnhmYS9meGZhLmggYi94ZmEvaW5jbHVkZS9meGZhL2Z4ZmEuaAppbmRleCA2NDhiMDQyLi41Y2NkMWYyIDEwMDY0NAotLS0gYS94ZmEvaW5jbHVkZS9meGZhL2Z4ZmEuaAorKysgYi94ZmEvaW5jbHVkZS9meGZhL2Z4ZmEuaApAQCAtMjksNjgyICsyOSw4MTYgQEAKIGNsYXNzIElYRkFfV2lkZ2V0QWNjSXRlcmF0b3I7DQogDQogY2xhc3MgSVhGQV9Eb2Mgew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SVhGQV9Eb2MoKSB7IH0NCi1wcm90ZWN0ZWQ6DQotICAgIElYRkFfRG9jKCkgeyB9DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfRG9jKCkge30NCisNCisgcHJvdGVjdGVkOg0KKyAgSVhGQV9Eb2MoKSB7fQ0KIH07DQogDQotCiBjbGFzcyBJWEZBX1dpZGdldCB7DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JWEZBX1dpZGdldCgpIHsgfQ0KLXByb3RlY3RlZDoNCi0gICAgSVhGQV9XaWRnZXQoKSB7IH0NCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9XaWRnZXQoKSB7fQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJWEZBX1dpZGdldCgpIHt9DQogfTsNCiANCi0KICNpbmNsdWRlICJmeGZhX2Jhc2ljLmgiDQogI2luY2x1ZGUgImZ4ZmFfd2lkZ2V0LmgiDQotI2RlZmluZSBYRkFfTUJJQ09OX0Vycm9yCTANCi0jZGVmaW5lCVhGQV9NQklDT05fV2FybmluZwkxDQotI2RlZmluZQlYRkFfTUJJQ09OX1F1ZXN0aW9uCTINCi0jZGVmaW5lCVhGQV9NQklDT05fU3RhdHVzCTMNCi0jZGVmaW5lIFhGQV9NQl9PSwkJCTANCi0jZGVmaW5lCVhGQV9NQl9PS0NhbmNlbAkJMQ0KLSNkZWZpbmUJWEZBX01CX1llc05vCQkyDQotI2RlZmluZSBYRkFfTUJfWWVzTm9DYW5jZWwJMw0KLSNkZWZpbmUgWEZBX0lET0sJCQkxDQotI2RlZmluZSBYRkFfSURDYW5jZWwJCTINCi0jZGVmaW5lIFhGQV9JRE5vCQkJMw0KLSNkZWZpbmUgWEZBX0lEWWVzCQkJNA0KLSNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZUZhaWxlZAkJCQkJMQ0KLSNkZWZpbmUgWEZBX0lEU19DYWxjT3ZlcnJpZGUJCQkJCTINCi0jZGVmaW5lIFhGQV9JRFNfTW9kaWZ5RmllbGQJCQkJCQkzDQotI2RlZmluZSBYRkFfSURTX05vdE1vZGlmeUZpZWxkCQkJCQk0DQotI2RlZmluZSBYRkFfSURTX0FwcE5hbWUJCQkJCQkJNQ0KLSNkZWZpbmUgWEZBX0lEU19JbWFnZUZpbHRlcgkJCQkJCTYNCi0jZGVmaW5lIFhGQV9JRFNfVU5LTk9XX0NBVENIRUQJCQkJCTcNCi0jZGVmaW5lIFhGQV9JRFNfVW5hYmxlX1RPX1NFVAkJCQkJOA0KLSNkZWZpbmUgWEZBX0lEU19WQUxVRV9FWENBTE1BVE9SWQkJCQk5DQotI2RlZmluZSBYRkFfSURTX0lOVkFMSURfRU5VTV9WQUxVRQkJCQkxMA0KLSNkZWZpbmUgWEZBX0lEU19VTlNVUFBPUlRfTUVUSE9ECQkJCTExDQotI2RlZmluZSBYRkFfSURTX1VOU1VQUE9SVF9QUk9QCQkJCQkxMg0KLSNkZWZpbmUgWEZBX0lEU19JTlZBbElEX1BST1BfU0VUCQkJCTEzDQotI2RlZmluZSBYRkFfSURTX05PVF9ERUZBVUxfVkFMVUUJCQkJMTQNCi0jZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9MQU5HVUFHRQkJCQkxNQ0KLSNkZWZpbmUgWEZBX0lEU19VTkFCTEVfU0VUX05VTVBBR0VTCQkJCTE2DQotI2RlZmluZSBYRkFfSURTX1VOQUJMRV9TRVRfUExBVEZPUk0JCQkJMTcNCi0jZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9WQUxJREFUSU9ORU5BQkxFCQkxOA0KLSNkZWZpbmUgWEZBX0lEU19VTkFCTEVfU0VUX1ZBUklBVElPTgkJCTE5DQotI2RlZmluZSBYRkFfSURTX1VOQUJMRV9TRVRfVkVSU0lPTgkJCQkyMA0KLSNkZWZpbmUJWEZBX0lEU19VTkFCTEVfU0VUX1JFQURZCQkJCTIxDQotI2RlZmluZSBYRkFfSURTX05VTUJFUl9PRl9PQ0NVUgkJCQkJMjINCi0jZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9DTEFTU19OQU1FCQkJMjMNCi0jZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9MRU5HVEhfVkFMVUUJCQkyNA0KLSNkZWZpbmUgWEZBX0lEU19VTlNVUFBPUlRfQ0hBUgkJCQkgICAgMjUNCi0jZGVmaW5lIFhGQV9JRFNfQkFEX1NVRkZJWAkJCQkJCTI2DQotI2RlZmluZSBYRkFfSURTX0VYUEVDVEVEX0lERU5UCQkJCQkyNw0KLSNkZWZpbmUgWEZBX0lEU19FWFBFQ1RFRF9TVFJJTkcJCQkJCTI4DQotI2RlZmluZSBYRkFfSURTX0lOVkFMSURBVEVfQ0hBUgkJCQkJMjkNCi0jZGVmaW5lIFhGQV9JRFNfUkVERUZJTklUSU9OCQkJCQkzMA0KLSNkZWZpbmUgWEZBX0lEU19JTlZBTElEQVRFX1RPS0VOCQkJCTMxDQotI2RlZmluZSBYRkFfSURTX0lOVkFMSURBVEVfRVhQUkVTU0lPTgkJCTMyDQotI2RlZmluZSBYRkFfSURTX1VOREVGSU5FX0lERU5USUZJRVIJCQkJMzMNCi0jZGVmaW5lIFhGQV9JRFNfSU5WQUxJREFURV9MRUZUVkFMVUUJCQkzNA0KLSNkZWZpbmUgWEZBX0lEU19DT01QSUxFUl9FUlJPUgkJCQkJMzUNCi0jZGVmaW5lIFhGQV9JRFNfQ0FOTk9UX01PRElGWV9WQUxVRQkJCQkzNg0KLSNkZWZpbmUgWEZBX0lEU19FUlJPUl9QQVJBTUVURVJTCQkJCTM3DQotI2RlZmluZSBYRkFfSURTX0VYUEVDVF9FTkRJRgkJCQkJMzgNCi0jZGVmaW5lIFhGQV9JRFNfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OCQkJMzkNCi0jZGVmaW5lIFhGQV9JRFNfQ09ORElUSU9OX0lTX05VTEwJCQkJNDANCi0jZGVmaW5lIFhGQV9JRFNfSUxMRUdBTEJSRUFLCQkJCQk0MQ0KLSNkZWZpbmUgWEZBX0lEU19JTExFR0FMQ09OVElOVUUJCQkJCTQyDQotI2RlZmluZSBYRkFfSURTX0VYUEVDVEVEX09QRVJBVE9SCQkJCTQzDQotI2RlZmluZSBYRkFfSURTX0RJVklERV9aRVJPCQkJCQkJNDQNCi0jZGVmaW5lIFhGQV9JRFNfQ0FOTk9UX0NPVkVSVF9PQkpFQ1QJCQk0NQ0KLSNkZWZpbmUgWEZBX0lEU19OT1RfRk9VTkRfQ09OVEFJTkVSCQkJCTQ2DQotI2RlZmluZSBYRkFfSURTX05PVF9GT1VORF9QUk9QRVJUWQkJCQk0Nw0KLSNkZWZpbmUgWEZBX0lEU19OT1RfRk9VTkRfTUVUSE9ECQkJCTQ4DQotI2RlZmluZSBYRkFfSURTX05PVF9GT1VORF9DT05TVAkJCQkJNDkNCi0jZGVmaW5lIFhGQV9JRFNfTk9UX0FTU0lHTl9PQkpFQ1QJCQkJNTANCi0jZGVmaW5lIFhGQV9JRFNfSVZBTElEQVRFX0lOU1RSVUNUSU9OCQkJNTENCi0jZGVmaW5lIFhGQV9JRFNfRVhQRUNUX05VTUJFUgkJCQkJNTINCi0jZGVmaW5lIFhGQV9JRFNfVkFMSURBVEVfT1VUX0FSUkFZCQkJCTUzDQotI2RlZmluZSBYRkFfSURTX0NBTk5PVF9BU1NJR05fSURFTlQJCQkJNTQNCi0jZGVmaW5lIFhGQV9JRFNfTk9UX0ZPVU5UX0ZVTkNUSU9OCQkJCTU1DQotI2RlZmluZSBYRkFfSURTX05PVF9BUlJBWQkJCQkJCTU2DQotI2RlZmluZSBYRkFfSURTX09VVF9BUlJBWQkJCQkJCTU3DQotI2RlZmluZSBYRkFfSURTX05PVF9TVVBQT1JUX0NBTEMJCQkJNTgNCi0jZGVmaW5lIFhGQV9JRFNfQVJHVU1FTlRfTk9UX0FSUkFZCQkJCTU5DQotI2RlZmluZSBYRkFfSURTX0FSR1VNRU5UX0VYUEVDVF9DT05UQUlORVIJCTYwDQotI2RlZmluZSBYRkFfSURTX0FDQ0VTU19QUk9QRVJUWV9JTl9OT1RfT0JKRUNUCTYxDQotI2RlZmluZSBYRkFfSURTX0ZVTkNUSU9OX0lTX0JVSUxESU4JCQkJNjINCi0jZGVmaW5lIFhGQV9JRFNfRVJST1JfTVNHCQkJCQkJNjMNCi0jZGVmaW5lIFhGQV9JRFNfSU5ERVhfT1VUX09GX0JPVU5EUwkJCQk2NA0KLSNkZWZpbmUgWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRAkJNjUNCi0jZGVmaW5lIFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gJCQkJNjYNCi0jZGVmaW5lIFhGQV9JRFNfSU5WQUxJRF9FTlVNRVJBVEUJCQkJNjcNCi0jZGVmaW5lIFhGQV9JRFNfSU5WQUxJRF9BUFBFTkQJCQkJCTY4DQotI2RlZmluZSBYRkFfSURTX1NPTV9FWFBFQ1RFRF9MSVNUCQkJCTY5DQotI2RlZmluZSBYRkFfSURTX05PVF9IQVZFX1BST1BFUlRZCQkJCTcwDQotI2RlZmluZSBYRkFfSURTX0lOVkFMSURfTk9ERV9UWVBFCQkJCTcxDQotI2RlZmluZSBYRkFfSURTX1ZJT0xBVEVfQk9VTkRBUlkJCQkJNzINCi0jZGVmaW5lIFhGQV9JRFNfU0VSVkVSX0RFTlkJCQkJCQk3Mw0KLSNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1N1bgkJCQk3NA0KLSNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X01vbgkJCQk3NQ0KLSNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1R1ZQkJCQk3Ng0KLSNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1dlZAkJCQk3Nw0KLSNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1RodQkJCQk3OA0KLSNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X0ZyaQkJCQk3OQ0KLSNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1NhdAkJCQk4MA0KLSNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9KYW4JCQkJCTgxDQotI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX0ZlYgkJCQkJODINCi0jZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfTWFyY2gJCQkJODMNCi0jZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfQXByaWwJCQkJODQNCi0jZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfTWF5CQkJCQk4NQ0KLSNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9KdW5lCQkJCTg2DQotI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX0p1bHkJCQkJODcNCi0jZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfQXVnCQkJCQk4OA0KLSNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9TZXB0CQkJCTg5DQotI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX09jdAkJCQkJOTANCi0jZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfTm92CQkJCQk5MQ0KLSNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9EZWMJCQkJCTkyDQotI2RlZmluZSBYRkFfSURTX1N0cmluZ19Ub2RheQkJCQkJOTMNCi0jZGVmaW5lIFhGQV9JRFNfVmFsaWRhdGVMaW1pdAkJCQkJOTQNCi0jZGVmaW5lIFhGQV9JRFNfVmFsaWRhdGVOdWxsV2FybmluZwkJCQk5NQ0KLSNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZU51bGxFcnJvcgkJCQk5Ng0KLSNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZVdhcm5pbmcJCQkJCTk3DQotI2RlZmluZSBYRkFfSURTX1ZhbGlkYXRlRXJyb3IJCQkJCTk4DQotI2RlZmluZSBYRkFfSURTX1ZhbGlkYXRlTnVtYmVyRXJyb3IJCQkJOTkNCisjZGVmaW5lIFhGQV9NQklDT05fRXJyb3IgMA0KKyNkZWZpbmUgWEZBX01CSUNPTl9XYXJuaW5nIDENCisjZGVmaW5lIFhGQV9NQklDT05fUXVlc3Rpb24gMg0KKyNkZWZpbmUgWEZBX01CSUNPTl9TdGF0dXMgMw0KKyNkZWZpbmUgWEZBX01CX09LIDANCisjZGVmaW5lIFhGQV9NQl9PS0NhbmNlbCAxDQorI2RlZmluZSBYRkFfTUJfWWVzTm8gMg0KKyNkZWZpbmUgWEZBX01CX1llc05vQ2FuY2VsIDMNCisjZGVmaW5lIFhGQV9JRE9LIDENCisjZGVmaW5lIFhGQV9JRENhbmNlbCAyDQorI2RlZmluZSBYRkFfSURObyAzDQorI2RlZmluZSBYRkFfSURZZXMgNA0KKyNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZUZhaWxlZCAxDQorI2RlZmluZSBYRkFfSURTX0NhbGNPdmVycmlkZSAyDQorI2RlZmluZSBYRkFfSURTX01vZGlmeUZpZWxkIDMNCisjZGVmaW5lIFhGQV9JRFNfTm90TW9kaWZ5RmllbGQgNA0KKyNkZWZpbmUgWEZBX0lEU19BcHBOYW1lIDUNCisjZGVmaW5lIFhGQV9JRFNfSW1hZ2VGaWx0ZXIgNg0KKyNkZWZpbmUgWEZBX0lEU19VTktOT1dfQ0FUQ0hFRCA3DQorI2RlZmluZSBYRkFfSURTX1VuYWJsZV9UT19TRVQgOA0KKyNkZWZpbmUgWEZBX0lEU19WQUxVRV9FWENBTE1BVE9SWSA5DQorI2RlZmluZSBYRkFfSURTX0lOVkFMSURfRU5VTV9WQUxVRSAxMA0KKyNkZWZpbmUgWEZBX0lEU19VTlNVUFBPUlRfTUVUSE9EIDExDQorI2RlZmluZSBYRkFfSURTX1VOU1VQUE9SVF9QUk9QIDEyDQorI2RlZmluZSBYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQgMTMNCisjZGVmaW5lIFhGQV9JRFNfTk9UX0RFRkFVTF9WQUxVRSAxNA0KKyNkZWZpbmUgWEZBX0lEU19VTkFCTEVfU0VUX0xBTkdVQUdFIDE1DQorI2RlZmluZSBYRkFfSURTX1VOQUJMRV9TRVRfTlVNUEFHRVMgMTYNCisjZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9QTEFURk9STSAxNw0KKyNkZWZpbmUgWEZBX0lEU19VTkFCTEVfU0VUX1ZBTElEQVRJT05FTkFCTEUgMTgNCisjZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9WQVJJQVRJT04gMTkNCisjZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9WRVJTSU9OIDIwDQorI2RlZmluZSBYRkFfSURTX1VOQUJMRV9TRVRfUkVBRFkgMjENCisjZGVmaW5lIFhGQV9JRFNfTlVNQkVSX09GX09DQ1VSIDIyDQorI2RlZmluZSBYRkFfSURTX1VOQUJMRV9TRVRfQ0xBU1NfTkFNRSAyMw0KKyNkZWZpbmUgWEZBX0lEU19VTkFCTEVfU0VUX0xFTkdUSF9WQUxVRSAyNA0KKyNkZWZpbmUgWEZBX0lEU19VTlNVUFBPUlRfQ0hBUiAyNQ0KKyNkZWZpbmUgWEZBX0lEU19CQURfU1VGRklYIDI2DQorI2RlZmluZSBYRkFfSURTX0VYUEVDVEVEX0lERU5UIDI3DQorI2RlZmluZSBYRkFfSURTX0VYUEVDVEVEX1NUUklORyAyOA0KKyNkZWZpbmUgWEZBX0lEU19JTlZBTElEQVRFX0NIQVIgMjkNCisjZGVmaW5lIFhGQV9JRFNfUkVERUZJTklUSU9OIDMwDQorI2RlZmluZSBYRkFfSURTX0lOVkFMSURBVEVfVE9LRU4gMzENCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJREFURV9FWFBSRVNTSU9OIDMyDQorI2RlZmluZSBYRkFfSURTX1VOREVGSU5FX0lERU5USUZJRVIgMzMNCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJREFURV9MRUZUVkFMVUUgMzQNCisjZGVmaW5lIFhGQV9JRFNfQ09NUElMRVJfRVJST1IgMzUNCisjZGVmaW5lIFhGQV9JRFNfQ0FOTk9UX01PRElGWV9WQUxVRSAzNg0KKyNkZWZpbmUgWEZBX0lEU19FUlJPUl9QQVJBTUVURVJTIDM3DQorI2RlZmluZSBYRkFfSURTX0VYUEVDVF9FTkRJRiAzOA0KKyNkZWZpbmUgWEZBX0lEU19VTkVYUEVDVEVEX0VYUFJFU1NJT04gMzkNCisjZGVmaW5lIFhGQV9JRFNfQ09ORElUSU9OX0lTX05VTEwgNDANCisjZGVmaW5lIFhGQV9JRFNfSUxMRUdBTEJSRUFLIDQxDQorI2RlZmluZSBYRkFfSURTX0lMTEVHQUxDT05USU5VRSA0Mg0KKyNkZWZpbmUgWEZBX0lEU19FWFBFQ1RFRF9PUEVSQVRPUiA0Mw0KKyNkZWZpbmUgWEZBX0lEU19ESVZJREVfWkVSTyA0NA0KKyNkZWZpbmUgWEZBX0lEU19DQU5OT1RfQ09WRVJUX09CSkVDVCA0NQ0KKyNkZWZpbmUgWEZBX0lEU19OT1RfRk9VTkRfQ09OVEFJTkVSIDQ2DQorI2RlZmluZSBYRkFfSURTX05PVF9GT1VORF9QUk9QRVJUWSA0Nw0KKyNkZWZpbmUgWEZBX0lEU19OT1RfRk9VTkRfTUVUSE9EIDQ4DQorI2RlZmluZSBYRkFfSURTX05PVF9GT1VORF9DT05TVCA0OQ0KKyNkZWZpbmUgWEZBX0lEU19OT1RfQVNTSUdOX09CSkVDVCA1MA0KKyNkZWZpbmUgWEZBX0lEU19JVkFMSURBVEVfSU5TVFJVQ1RJT04gNTENCisjZGVmaW5lIFhGQV9JRFNfRVhQRUNUX05VTUJFUiA1Mg0KKyNkZWZpbmUgWEZBX0lEU19WQUxJREFURV9PVVRfQVJSQVkgNTMNCisjZGVmaW5lIFhGQV9JRFNfQ0FOTk9UX0FTU0lHTl9JREVOVCA1NA0KKyNkZWZpbmUgWEZBX0lEU19OT1RfRk9VTlRfRlVOQ1RJT04gNTUNCisjZGVmaW5lIFhGQV9JRFNfTk9UX0FSUkFZIDU2DQorI2RlZmluZSBYRkFfSURTX09VVF9BUlJBWSA1Nw0KKyNkZWZpbmUgWEZBX0lEU19OT1RfU1VQUE9SVF9DQUxDIDU4DQorI2RlZmluZSBYRkFfSURTX0FSR1VNRU5UX05PVF9BUlJBWSA1OQ0KKyNkZWZpbmUgWEZBX0lEU19BUkdVTUVOVF9FWFBFQ1RfQ09OVEFJTkVSIDYwDQorI2RlZmluZSBYRkFfSURTX0FDQ0VTU19QUk9QRVJUWV9JTl9OT1RfT0JKRUNUIDYxDQorI2RlZmluZSBYRkFfSURTX0ZVTkNUSU9OX0lTX0JVSUxESU4gNjINCisjZGVmaW5lIFhGQV9JRFNfRVJST1JfTVNHIDYzDQorI2RlZmluZSBYRkFfSURTX0lOREVYX09VVF9PRl9CT1VORFMgNjQNCisjZGVmaW5lIFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QgNjUNCisjZGVmaW5lIFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0ggNjYNCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJRF9FTlVNRVJBVEUgNjcNCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJRF9BUFBFTkQgNjgNCisjZGVmaW5lIFhGQV9JRFNfU09NX0VYUEVDVEVEX0xJU1QgNjkNCisjZGVmaW5lIFhGQV9JRFNfTk9UX0hBVkVfUFJPUEVSVFkgNzANCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJRF9OT0RFX1RZUEUgNzENCisjZGVmaW5lIFhGQV9JRFNfVklPTEFURV9CT1VOREFSWSA3Mg0KKyNkZWZpbmUgWEZBX0lEU19TRVJWRVJfREVOWSA3Mw0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1N1biA3NA0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X01vbiA3NQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1R1ZSA3Ng0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1dlZCA3Nw0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1RodSA3OA0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X0ZyaSA3OQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1NhdCA4MA0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9KYW4gODENCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfRmViIDgyDQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX01hcmNoIDgzDQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX0FwcmlsIDg0DQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX01heSA4NQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9KdW5lIDg2DQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX0p1bHkgODcNCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfQXVnIDg4DQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX1NlcHQgODkNCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfT2N0IDkwDQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX05vdiA5MQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9EZWMgOTINCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nX1RvZGF5IDkzDQorI2RlZmluZSBYRkFfSURTX1ZhbGlkYXRlTGltaXQgOTQNCisjZGVmaW5lIFhGQV9JRFNfVmFsaWRhdGVOdWxsV2FybmluZyA5NQ0KKyNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZU51bGxFcnJvciA5Ng0KKyNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZVdhcm5pbmcgOTcNCisjZGVmaW5lIFhGQV9JRFNfVmFsaWRhdGVFcnJvciA5OA0KKyNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZU51bWJlckVycm9yIDk5DQogDQogLy8gUHJvYmFibHkgc2hvdWxkIGJlIGNhbGxlZCBJWEZBX0FwcERlbGVnYXRlLg0KLWNsYXNzIElYRkFfQXBwUHJvdmlkZXINCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JWEZBX0FwcFByb3ZpZGVyKCkgeyB9DQorY2xhc3MgSVhGQV9BcHBQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfQXBwUHJvdmlkZXIoKSB7fQ0KIA0KLSAgICAvKioNCi0gICAgICogU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBjbGllbnQgYXBwbGljYXRpb24gaW4gd2hpY2ggYSBmb3JtIGN1cnJlbnRseSBleGlzdHMuIFN1Y2ggYXMgRXhjaGFuZ2UtUHJvLg0KLSAgICAgKi8NCi0gICAgdmlydHVhbCB2b2lkIFNldEFwcFR5cGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0FwcFR5cGUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkIEdldEFwcFR5cGUoQ0ZYX1dpZGVTdHJpbmcgJndzQXBwVHlwZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0Rm94aXRBcHBUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb3hpdEFwcFR5cGUpIHsgfQ0KLSAgICB2aXJ0dWFsIHZvaWQgR2V0Rm94aXRBcHBUeXBlKENGWF9XaWRlU3RyaW5nICZ3c0ZveGl0QXBwVHlwZSkgew0KLSAgICAgICAgd3NGb3hpdEFwcFR5cGUuRW1wdHkoKTsNCi0gICAgfQ0KKyAgLyoqDQorICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiBpbiB3aGljaCBhIGZvcm0gY3VycmVudGx5DQorICAgKiBleGlzdHMuIFN1Y2ggYXMgRXhjaGFuZ2UtUHJvLg0KKyAgICovDQorICB2aXJ0dWFsIHZvaWQgU2V0QXBwVHlwZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXBwVHlwZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldEFwcFR5cGUoQ0ZYX1dpZGVTdHJpbmcmIHdzQXBwVHlwZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZveGl0QXBwVHlwZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm94aXRBcHBUeXBlKSB7fQ0KKyAgdmlydHVhbCB2b2lkIEdldEZveGl0QXBwVHlwZShDRlhfV2lkZVN0cmluZyYgd3NGb3hpdEFwcFR5cGUpIHsNCisgICAgd3NGb3hpdEFwcFR5cGUuRW1wdHkoKTsNCisgIH0NCiANCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGxhbmd1YWdlIG9mIHRoZSBydW5uaW5nIGhvc3QgYXBwbGljYXRpb24uIFN1Y2ggYXMgemhfQ04NCi0gICAgICovDQotICAgIHZpcnR1YWwgdm9pZCBHZXRMYW5ndWFnZShDRlhfV2lkZVN0cmluZyAmd3NMYW5ndWFnZSkgPSAwOw0KKyAgLyoqDQorICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBvZiB0aGUgcnVubmluZyBob3N0IGFwcGxpY2F0aW9uLiBTdWNoIGFzIHpoX0NODQorICAgKi8NCisgIHZpcnR1YWwgdm9pZCBHZXRMYW5ndWFnZShDRlhfV2lkZVN0cmluZyYgd3NMYW5ndWFnZSkgPSAwOw0KIA0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgcGxhdGZvcm0gb2YgdGhlIG1hY2hpbmUgcnVubmluZyB0aGUgc2NyaXB0LiBTdWNoIGFzIFdJTg0KLSAgICAgKi8NCi0gICAgdmlydHVhbCB2b2lkIEdldFBsYXRmb3JtKENGWF9XaWRlU3RyaW5nICZ3c1BsYXRmb3JtKSA9IDA7DQorICAvKioNCisgICAqIFJldHVybnMgdGhlIHBsYXRmb3JtIG9mIHRoZSBtYWNoaW5lIHJ1bm5pbmcgdGhlIHNjcmlwdC4gU3VjaCBhcyBXSU4NCisgICAqLw0KKyAgdmlydHVhbCB2b2lkIEdldFBsYXRmb3JtKENGWF9XaWRlU3RyaW5nJiB3c1BsYXRmb3JtKSA9IDA7DQogDQotICAgIC8qKg0KLSAgICAgKiBJbmRpY2F0ZXMgdGhlIHBhY2thZ2luZyBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCBpcyBydW5uaW5nIHRoZSBzY3JpcHQuIFN1Y2ggYXMgRnVsbA0KLSAgICAgKi8NCi0gICAgdmlydHVhbCB2b2lkIEdldFZhcmlhdGlvbihDRlhfV2lkZVN0cmluZyAmd3NWYXJpYXRpb24pID0gMDsNCisgIC8qKg0KKyAgICogSW5kaWNhdGVzIHRoZSBwYWNrYWdpbmcgb2YgdGhlIGFwcGxpY2F0aW9uIHRoYXQgaXMgcnVubmluZyB0aGUgc2NyaXB0LiBTdWNoDQorICAgKiBhcyBGdWxsDQorICAgKi8NCisgIHZpcnR1YWwgdm9pZCBHZXRWYXJpYXRpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzVmFyaWF0aW9uKSA9IDA7DQogDQotICAgIC8qKg0KLSAgICAgKiBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLiBTdWNoIGFzIDkNCi0gICAgICovDQotICAgIHZpcnR1YWwgdm9pZCBHZXRWZXJzaW9uKENGWF9XaWRlU3RyaW5nICZ3c1ZlcnNpb24pID0gMDsNCi0gICAgdmlydHVhbCB2b2lkIEdldEZveGl0VmVyc2lvbihDRlhfV2lkZVN0cmluZyAmd3NGb3hpdFZlcnNpb24pIHsNCi0gICAgICAgIHdzRm94aXRWZXJzaW9uLkVtcHR5KCk7DQotICAgIH0NCisgIC8qKg0KKyAgICogSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgY3VycmVudCBhcHBsaWNhdGlvbi4gU3VjaCBhcyA5DQorICAgKi8NCisgIHZpcnR1YWwgdm9pZCBHZXRWZXJzaW9uKENGWF9XaWRlU3RyaW5nJiB3c1ZlcnNpb24pID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRGb3hpdFZlcnNpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzRm94aXRWZXJzaW9uKSB7DQorICAgIHdzRm94aXRWZXJzaW9uLkVtcHR5KCk7DQorICB9DQogDQotICAgIC8qKg0KLSAgICAgKiBHZXQgYXBwbGljYXRpb24gbmFtZSwgc3VjaCBhcyBQaGFudG9tLg0KLSAgICAgKi8NCi0gICAgdmlydHVhbCB2b2lkIEdldEFwcE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQgR2V0Rm94aXRBcHBOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0ZveGl0TmFtZSkgew0KLSAgICAgICAgd3NGb3hpdE5hbWUuRW1wdHkoKTsNCi0gICAgfQ0KKyAgLyoqDQorICAgKiBHZXQgYXBwbGljYXRpb24gbmFtZSwgc3VjaCBhcyBQaGFudG9tLg0KKyAgICovDQorICB2aXJ0dWFsIHZvaWQgR2V0QXBwTmFtZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0Rm94aXRBcHBOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0ZveGl0TmFtZSkgew0KKyAgICB3c0ZveGl0TmFtZS5FbXB0eSgpOw0KKyAgfQ0KIA0KLSAgICAvKioNCi0gICAgICogQ2F1c2VzIHRoZSBzeXN0ZW0gdG8gcGxheSBhIHNvdW5kLg0KLSAgICAgKiBAcGFyYW1baW5dIGR3VHlwZSBUaGUgc3lzdGVtIGNvZGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBzb3VuZC4wIChFcnJvcikxIChXYXJuaW5nKTIgKFF1ZXN0aW9uKTMgKFN0YXR1cyk0IChEZWZhdWx0KQ0KLSAgICAgKi8NCi0gICAgdmlydHVhbCB2b2lkIEJlZXAoRlhfRFdPUkQgZHdUeXBlKSA9IDA7DQorICAvKioNCisgICAqIENhdXNlcyB0aGUgc3lzdGVtIHRvIHBsYXkgYSBzb3VuZC4NCisgICAqIEBwYXJhbVtpbl0gZHdUeXBlIFRoZSBzeXN0ZW0gY29kZSBmb3IgdGhlIGFwcHJvcHJpYXRlIHNvdW5kLjAgKEVycm9yKTENCisgICAqIChXYXJuaW5nKTIgKFF1ZXN0aW9uKTMgKFN0YXR1cyk0IChEZWZhdWx0KQ0KKyAgICovDQorICB2aXJ0dWFsIHZvaWQgQmVlcChGWF9EV09SRCBkd1R5cGUpID0gMDsNCiANCi0gICAgLyoqDQotICAgICAqIERpc3BsYXlzIGEgbWVzc2FnZSBib3guDQotICAgICAqIEBwYXJhbVtpbl0gZHdJY29uVHlwZSAgICBJY29uIHR5cGUsIHJlZmVyIHRvIFhGQV9NQklDT04uDQotICAgICAqIEBwYXJhbVtpbl0gZHdCdXR0b25UeXBlICBCdXR0b24gdHlwZSwgcmVmZXIgdG8gWEZBX01FU1NBR0VCVVRUT04uDQotICAgICAqIEByZXR1cm4gQSB2YWxpZCBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlIGJ1dHRvbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLCByZWZlciB0byBYRkFfSUQuDQotICAgICAqLw0KLSAgICB2aXJ0dWFsIGludDMyX3QgTXNnQm94KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZXNzYWdlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGl0bGUgPSBGWF9XU1RSQyhMIiIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ljb25UeXBlID0gMCwgRlhfRFdPUkQgZHdCdXR0b25UeXBlID0gMCkgPSAwOw0KKyAgLyoqDQorICAgKiBEaXNwbGF5cyBhIG1lc3NhZ2UgYm94Lg0KKyAgICogQHBhcmFtW2luXSBkd0ljb25UeXBlICAgIEljb24gdHlwZSwgcmVmZXIgdG8gWEZBX01CSUNPTi4NCisgICAqIEBwYXJhbVtpbl0gZHdCdXR0b25UeXBlICBCdXR0b24gdHlwZSwgcmVmZXIgdG8gWEZBX01FU1NBR0VCVVRUT04uDQorICAgKiBAcmV0dXJuIEEgdmFsaWQgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBidXR0b24gcHJlc3NlZCBieSB0aGUNCisgICAqIHVzZXIsIHJlZmVyIHRvIFhGQV9JRC4NCisgICAqLw0KKyAgdmlydHVhbCBpbnQzMl90IE1zZ0JveChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlID0gRlhfV1NUUkMoTCIiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdJY29uVHlwZSA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QnV0dG9uVHlwZSA9IDApID0gMDsNCiANCi0gICAgLyoqDQotICAgICAqIEdldCBhIHJlc3BvbnNlIGZyb20gdGhlIHVzZXIuDQotICAgICAqIEBwYXJhbVtpbl0gYk1hcmsgLSBNYXNrIHRoZSB1c2VyIGlucHV0IHdpdGggKiAoYXN0ZXJpc2tzKSB3aGVuIHRydWUsDQotICAgICAqLw0KLSAgICB2aXJ0dWFsIHZvaWQgUmVzcG9uc2UoQ0ZYX1dpZGVTdHJpbmcgJndzQW5zd2VyLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUXVlc3Rpb24sIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSA9IEZYX1dTVFJDKEwiIiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGVmYXVsdEFuc3dlciA9IEZYX1dTVFJDKEwiIiksIEZYX0JPT0wgYk1hcmsgPSBUUlVFKSA9IDA7DQorICAvKioNCisgICAqIEdldCBhIHJlc3BvbnNlIGZyb20gdGhlIHVzZXIuDQorICAgKiBAcGFyYW1baW5dIGJNYXJrIC0gTWFzayB0aGUgdXNlciBpbnB1dCB3aXRoICogKGFzdGVyaXNrcykgd2hlbiB0cnVlLA0KKyAgICovDQorICB2aXJ0dWFsIHZvaWQgUmVzcG9uc2UoQ0ZYX1dpZGVTdHJpbmcmIHdzQW5zd2VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NRdWVzdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGl0bGUgPSBGWF9XU1RSQyhMIiIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEZWZhdWx0QW5zd2VyID0gRlhfV1NUUkMoTCIiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNYXJrID0gVFJVRSkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIGludDMyX3QgR2V0RG9jdW1lbnRDb3VudEluQmF0Y2goKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJEb2N1bWVudEluQmF0Y2goKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RG9jdW1lbnRDb3VudEluQmF0Y2goKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q3VyRG9jdW1lbnRJbkJhdGNoKCkgPSAwOw0KIA0KLSAgICAvKioNCi0gICAgICogRG93bmxvYWQgc29tZXRoaW5nIGZyb20gc29tZXdoZXJlLg0KLSAgICAgKiBAcGFyYW1baW5dIHdzVVJMIC0gaHR0cCwgZnRwLCBzdWNoIGFzICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyIuDQotICAgICAqLw0KLSAgICB2aXJ0dWFsIElGWF9GaWxlUmVhZCogRG93bmxvYWRVUkwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VSTCkgPSAwOw0KKyAgLyoqDQorICAgKiBEb3dubG9hZCBzb21ldGhpbmcgZnJvbSBzb21ld2hlcmUuDQorICAgKiBAcGFyYW1baW5dIHdzVVJMIC0gaHR0cCwgZnRwLCBzdWNoIGFzDQorICAgKiAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8iLg0KKyAgICovDQorICB2aXJ0dWFsIElGWF9GaWxlUmVhZCogRG93bmxvYWRVUkwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VSTCkgPSAwOw0KIA0KLSAgICAvKioNCi0gICAgICogUE9TVCBkYXRhIHRvIHRoZSBnaXZlbiB1cmwuDQotICAgICAqIEBwYXJhbVtpbl0gd3NVUkwgICAgICAgICB0aGUgVVJMIGJlaW5nIHVwbG9hZGVkLg0KLSAgICAgKiBAcGFyYW1baW5dIHdzRGF0YSAgICAgICAgdGhlIGRhdGEgYmVpbmcgdXBsb2FkZWQuDQotICAgICAqIEBwYXJhbVtpbl0gd3NDb250ZW50VHlwZSB0aGUgY29udGVudCB0eXBlIG9mIGRhdGEgaW5jbHVkaW5nIHRleHQvaHRtbCwgdGV4dC94bWwsIHRleHQvcGxhaW4sIG11bHRpcGFydC9mb3JtLWRhdGEsDQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQsIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSwgYW55IHZhbGlkIE1JTUUgdHlwZS4NCi0gICAgICogQHBhcmFtW2luXSB3c0VuY29kZSAgICAgIHRoZSBlbmNvZGUgb2YgZGF0YSBpbmNsdWRpbmcgVVRGLTgsIFVURi0xNiwgSVNPODg1OS0xLCBhbnkgcmVjb2duaXplZCBbSUFOQV1jaGFyYWN0ZXIgZW5jb2RpbmcNCi0gICAgICogQHBhcmFtW2luXSB3c0hlYWRlciAgICAgIGFueSBhZGRpdGlvbmFsIEhUVFAgaGVhZGVycyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcG9zdC4NCi0gICAgICogQHBhcmFtW291dF0gd3NSZXNwb25zZSAgIGRlY29kZWQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIuDQotICAgICAqIEByZXR1cm4gVFJVRSBTZXJ2ZXIgcGVybWl0dGVkIHRoZSBwb3N0IHJlcXVlc3QsIEZBTFNFIG90aGVyd2lzZS4NCi0gICAgICovDQotICAgIHZpcnR1YWwgRlhfQk9PTCBQb3N0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGF0YSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnRUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0VuY29kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0hlYWRlciwgQ0ZYX1dpZGVTdHJpbmcgJndzUmVzcG9uc2UpID0gMDsNCisgIC8qKg0KKyAgICogUE9TVCBkYXRhIHRvIHRoZSBnaXZlbiB1cmwuDQorICAgKiBAcGFyYW1baW5dIHdzVVJMICAgICAgICAgdGhlIFVSTCBiZWluZyB1cGxvYWRlZC4NCisgICAqIEBwYXJhbVtpbl0gd3NEYXRhICAgICAgICB0aGUgZGF0YSBiZWluZyB1cGxvYWRlZC4NCisgICAqIEBwYXJhbVtpbl0gd3NDb250ZW50VHlwZSB0aGUgY29udGVudCB0eXBlIG9mIGRhdGEgaW5jbHVkaW5nIHRleHQvaHRtbCwNCisgICAqIHRleHQveG1sLCB0ZXh0L3BsYWluLCBtdWx0aXBhcnQvZm9ybS1kYXRhLA0KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCwNCisgICAqIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSwgYW55IHZhbGlkIE1JTUUgdHlwZS4NCisgICAqIEBwYXJhbVtpbl0gd3NFbmNvZGUgICAgICB0aGUgZW5jb2RlIG9mIGRhdGEgaW5jbHVkaW5nIFVURi04LCBVVEYtMTYsDQorICAgKiBJU084ODU5LTEsIGFueSByZWNvZ25pemVkIFtJQU5BXWNoYXJhY3RlciBlbmNvZGluZw0KKyAgICogQHBhcmFtW2luXSB3c0hlYWRlciAgICAgIGFueSBhZGRpdGlvbmFsIEhUVFAgaGVhZGVycyB0byBiZSBpbmNsdWRlZCBpbiB0aGUNCisgICAqIHBvc3QuDQorICAgKiBAcGFyYW1bb3V0XSB3c1Jlc3BvbnNlICAgZGVjb2RlZCByZXNwb25zZSBmcm9tIHNlcnZlci4NCisgICAqIEByZXR1cm4gVFJVRSBTZXJ2ZXIgcGVybWl0dGVkIHRoZSBwb3N0IHJlcXVlc3QsIEZBTFNFIG90aGVyd2lzZS4NCisgICAqLw0KKyAgdmlydHVhbCBGWF9CT09MIFBvc3RSZXF1ZXN0VVJMKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVUkwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0RhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFbmNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0hlYWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NSZXNwb25zZSkgPSAwOw0KIA0KLSAgICAvKioNCi0gICAgICogUFVUIGRhdGEgdG8gdGhlIGdpdmVuIHVybC4NCi0gICAgICogQHBhcmFtW2luXSB3c1VSTCAgICAgICAgIHRoZSBVUkwgYmVpbmcgdXBsb2FkZWQuDQotICAgICAqIEBwYXJhbVtpbl0gd3NEYXRhICAgICAgICAgICAgdGhlIGRhdGEgYmVpbmcgdXBsb2FkZWQuDQotICAgICAqIEBwYXJhbVtpbl0gd3NFbmNvZGUgICAgICB0aGUgZW5jb2RlIG9mIGRhdGEgaW5jbHVkaW5nIFVURi04LCBVVEYtMTYsIElTTzg4NTktMSwgYW55IHJlY29nbml6ZWQgW0lBTkFdY2hhcmFjdGVyIGVuY29kaW5nDQotICAgICAqIEByZXR1cm4gVFJVRSBTZXJ2ZXIgcGVybWl0dGVkIHRoZSBwb3N0IHJlcXVlc3QsIEZBTFNFIG90aGVyd2lzZS4NCi0gICAgICovDQotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgUHV0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGF0YSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0VuY29kZSkgPSAwOw0KKyAgLyoqDQorICAgKiBQVVQgZGF0YSB0byB0aGUgZ2l2ZW4gdXJsLg0KKyAgICogQHBhcmFtW2luXSB3c1VSTCAgICAgICAgIHRoZSBVUkwgYmVpbmcgdXBsb2FkZWQuDQorICAgKiBAcGFyYW1baW5dIHdzRGF0YSAgICAgICAgICAgIHRoZSBkYXRhIGJlaW5nIHVwbG9hZGVkLg0KKyAgICogQHBhcmFtW2luXSB3c0VuY29kZSAgICAgIHRoZSBlbmNvZGUgb2YgZGF0YSBpbmNsdWRpbmcgVVRGLTgsIFVURi0xNiwNCisgICAqIElTTzg4NTktMSwgYW55IHJlY29nbml6ZWQgW0lBTkFdY2hhcmFjdGVyIGVuY29kaW5nDQorICAgKiBAcmV0dXJuIFRSVUUgU2VydmVyIHBlcm1pdHRlZCB0aGUgcG9zdCByZXF1ZXN0LCBGQUxTRSBvdGhlcndpc2UuDQorICAgKi8NCisgIHZpcnR1YWwgRlhfQk9PTCBQdXRSZXF1ZXN0VVJMKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVUkwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFbmNvZGUpID0gMDsNCiANCi0gICAgdmlydHVhbCB2b2lkIExvYWRTdHJpbmcoaW50MzJfdCBpU3RyaW5nSUQsIENGWF9XaWRlU3RyaW5nICZ3c1N0cmluZykgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgU2hvd0ZpbGVEaWFsb2coY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsdGVyLCBDRlhfV2lkZVN0cmluZ0FycmF5ICZ3c1BhdGhBcnIsIEZYX0JPT0wgYk9wZW4gPSBUUlVFKSA9IDA7DQotICAgIHZpcnR1YWwgSUZXTF9BZGFwdGVyVGltZXJNZ3IqIEdldFRpbWVyTWdyKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIExvYWRTdHJpbmcoaW50MzJfdCBpU3RyaW5nSUQsIENGWF9XaWRlU3RyaW5nJiB3c1N0cmluZykgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNob3dGaWxlRGlhbG9nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsdGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIHdzUGF0aEFyciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPcGVuID0gVFJVRSkgPSAwOw0KKyAgdmlydHVhbCBJRldMX0FkYXB0ZXJUaW1lck1nciogR2V0VGltZXJNZ3IoKSA9IDA7DQogfTsNCi1jbGFzcyBJWEZBX0ZvbnRNZ3INCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSVhGQV9Gb250TWdyKiBDcmVhdGVEZWZhdWx0KCk7DQotICAgIHZpcnR1YWwgfklYRkFfRm9udE1ncigpOw0KK2NsYXNzIElYRkFfRm9udE1nciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJWEZBX0ZvbnRNZ3IqIENyZWF0ZURlZmF1bHQoKTsNCisgIHZpcnR1YWwgfklYRkFfRm9udE1ncigpOw0KIA0KLSAgICB2aXJ0dWFsIElGWF9Gb250KglHZXRGb250KElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDB4RkZGRikgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KglHZXREZWZhdWx0Rm9udChJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnQoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZhdWx0Rm9udChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpID0gMDsNCiB9Ow0KLWNsYXNzIElYRkFfQXBwDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElYRkFfQXBwKiBDcmVhdGUoSVhGQV9BcHBQcm92aWRlciogcFByb3ZpZGVyKTsNCi0gICAgdmlydHVhbCB+SVhGQV9BcHAoKTsNCitjbGFzcyBJWEZBX0FwcCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJWEZBX0FwcCogQ3JlYXRlKElYRkFfQXBwUHJvdmlkZXIqIHBQcm92aWRlcik7DQorICB2aXJ0dWFsIH5JWEZBX0FwcCgpOw0KIA0KLSAgICB2aXJ0dWFsIElYRkFfRG9jSGFuZGxlcioJR2V0RG9jSGFuZGxlcigpID0gMDsNCi0gICAgdmlydHVhbCBJWEZBX0RvYyoJCQlDcmVhdGVEb2MoSVhGQV9Eb2NQcm92aWRlciogcFByb3ZpZGVyLCBJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlRha2VPdmVyRmlsZSA9IFRSVUUpID0gMDsNCi0gICAgdmlydHVhbCBJWEZBX0RvYyoJCQlDcmVhdGVEb2MoSVhGQV9Eb2NQcm92aWRlciogcFByb3ZpZGVyLCBDUERGX0RvY3VtZW50KiBwUERGRG9jKSA9IDA7DQotICAgIHZpcnR1YWwJSVhGQV9BcHBQcm92aWRlcioJR2V0QXBwUHJvdmlkZXIoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXREZWZhdWx0Rm9udE1ncihJWEZBX0ZvbnRNZ3IqIHBGb250TWdyKSA9IDA7DQotICAgIHZpcnR1YWwgSVhGQV9NZW51SGFuZGxlcioJR2V0TWVudUhhbmRsZXIoKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfRG9jSGFuZGxlciogR2V0RG9jSGFuZGxlcigpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9Eb2MqIENyZWF0ZURvYyhJWEZBX0RvY1Byb3ZpZGVyKiBwUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRha2VPdmVyRmlsZSA9IFRSVUUpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9Eb2MqIENyZWF0ZURvYyhJWEZBX0RvY1Byb3ZpZGVyKiBwUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcFBERkRvYykgPSAwOw0KKyAgdmlydHVhbCBJWEZBX0FwcFByb3ZpZGVyKiBHZXRBcHBQcm92aWRlcigpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXREZWZhdWx0Rm9udE1ncihJWEZBX0ZvbnRNZ3IqIHBGb250TWdyKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfTWVudUhhbmRsZXIqIEdldE1lbnVIYW5kbGVyKCkgPSAwOw0KIH07DQotY2xhc3MgSVhGQV9NZW51SGFuZGxlcg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklYRkFfTWVudUhhbmRsZXIoKSB7IH0NCitjbGFzcyBJWEZBX01lbnVIYW5kbGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9NZW51SGFuZGxlcigpIHt9DQogDQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ29weShJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhbkN1dChJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblBhc3RlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuU2VsZWN0QWxsKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuRGVsZXRlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuRGVTZWxlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDb3B5KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ3V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUGFzdGUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZWxlY3RBbGwoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZWxldGUoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZVNlbGVjdChJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblVuZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5SZWRvKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJVW5kbyhJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRTdWdnZXN0V29yZHMoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9Qb2ludEYgcG9pbnRmLCBDRlhfQnl0ZVN0cmluZ0FycmF5ICZzU3VnZ2VzdCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlcGxhY2VTcGVsbENoZWNrV29yZChJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1BvaW50RiBwb2ludGYsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQ29weShJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbkN1dChJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblBhc3RlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuU2VsZWN0QWxsKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuRGVsZXRlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuRGVTZWxlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBDb3B5KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ3V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFzdGUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZWxlY3RBbGwoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEZWxldGUoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEZVNlbGVjdChJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblVuZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5SZWRvKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbyhJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRTdWdnZXN0V29yZHMoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYgcG9pbnRmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlcGxhY2VTcGVsbENoZWNrV29yZChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKSA9IDA7DQogfTsNCi0jZGVmaW5lIFhGQV9JTlZBTElEQVRFX0FsbFBhZ2VzCQkweDAwMDAwMDAwDQotI2RlZmluZSBYRkFfSU5WQUxJREFURV9DdXJyZW50UGFnZQkweDAwMDAwMDAxDQotI2RlZmluZSBYRkFfUFJJTlRPUFRfU2hvd0RpYWxvZwkJMHgwMDAwMDAwMQ0KLSNkZWZpbmUgWEZBX1BSSU5UT1BUX0NhbkNhbmNlbAkJMHgwMDAwMDAwMg0KLSNkZWZpbmUgWEZBX1BSSU5UT1BUX1Nocmlua1BhZ2UJCTB4MDAwMDAwMDQNCi0jZGVmaW5lIFhGQV9QUklOVE9QVF9Bc0ltYWdlCQkweDAwMDAwMDA4DQotI2RlZmluZSBYRkFfUFJJTlRPUFRfUmV2ZXJzZU9yZGVyCTB4MDAwMDAwMTANCi0jZGVmaW5lIFhGQV9QUklOVE9QVF9QcmludEFubm90CQkweDAwMDAwMDIwDQotI2RlZmluZSAgWEZBX1BBR0VWSUVXRVZFTlRfUG9zdEFkZGVkCQkxDQotI2RlZmluZSAgWEZBX1BBR0VWSUVXRVZFTlRfUG9zdFJlbW92ZWQJCTMNCi0jZGVmaW5lICBYRkFfV0lER0VURVZFTlRfUG9zdEFkZGVkCQkJMg0KLSNkZWZpbmUgIFhGQV9XSURHRVRFVkVOVF9QcmVSZW1vdmVkCQkJMw0KLSNkZWZpbmUgIFhGQV9XSURHRVRFVkVOVF9Qb3N0Q29udGVudENoYW5nZWQJNg0KLSNkZWZpbmUgIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbVJlbW92ZWQJNw0KLSNkZWZpbmUgIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbUFkZGVkICAJOA0KLSNkZWZpbmUgIFhGQV9XSURHRVRFVkVOVF9BY2Nlc3NDaGFuZ2VkICAJOQ0KLWNsYXNzIElYRkFfRG9jUHJvdmlkZXINCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JWEZBX0RvY1Byb3ZpZGVyKCkgeyB9DQorI2RlZmluZSBYRkFfSU5WQUxJREFURV9BbGxQYWdlcyAweDAwMDAwMDAwDQorI2RlZmluZSBYRkFfSU5WQUxJREFURV9DdXJyZW50UGFnZSAweDAwMDAwMDAxDQorI2RlZmluZSBYRkFfUFJJTlRPUFRfU2hvd0RpYWxvZyAweDAwMDAwMDAxDQorI2RlZmluZSBYRkFfUFJJTlRPUFRfQ2FuQ2FuY2VsIDB4MDAwMDAwMDINCisjZGVmaW5lIFhGQV9QUklOVE9QVF9TaHJpbmtQYWdlIDB4MDAwMDAwMDQNCisjZGVmaW5lIFhGQV9QUklOVE9QVF9Bc0ltYWdlIDB4MDAwMDAwMDgNCisjZGVmaW5lIFhGQV9QUklOVE9QVF9SZXZlcnNlT3JkZXIgMHgwMDAwMDAxMA0KKyNkZWZpbmUgWEZBX1BSSU5UT1BUX1ByaW50QW5ub3QgMHgwMDAwMDAyMA0KKyNkZWZpbmUgWEZBX1BBR0VWSUVXRVZFTlRfUG9zdEFkZGVkIDENCisjZGVmaW5lIFhGQV9QQUdFVklFV0VWRU5UX1Bvc3RSZW1vdmVkIDMNCisjZGVmaW5lIFhGQV9XSURHRVRFVkVOVF9Qb3N0QWRkZWQgMg0KKyNkZWZpbmUgWEZBX1dJREdFVEVWRU5UX1ByZVJlbW92ZWQgMw0KKyNkZWZpbmUgWEZBX1dJREdFVEVWRU5UX1Bvc3RDb250ZW50Q2hhbmdlZCA2DQorI2RlZmluZSBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1SZW1vdmVkIDcNCisjZGVmaW5lIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbUFkZGVkIDgNCisjZGVmaW5lIFhGQV9XSURHRVRFVkVOVF9BY2Nlc3NDaGFuZ2VkIDkNCitjbGFzcyBJWEZBX0RvY1Byb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9Eb2NQcm92aWRlcigpIHt9DQogDQotICAgIHZpcnR1YWwgdm9pZAkJU2V0Q2hhbmdlTWFyayhJWEZBX0RvYyogaERvYykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUludmFsaWRhdGVSZWN0KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ0ZYX1JlY3RGJiBydCwgRlhfRFdPUkQgZHdGbGFncyA9IDApID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlEaXNwbGF5Q2FyZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0JPT0wgYlZpc2libGUsIGNvbnN0IENGWF9SZWN0RiogcFJ0QW5jaG9yKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0UG9wdXBQb3MoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0ZMT0FUIGZNaW5Qb3B1cCwgRlhfRkxPQVQgZk1heFBvcHVwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVBvcHVwTWVudShJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1BvaW50RiBwdFBvcHVwLCBjb25zdCBDRlhfUmVjdEYqIHBSZWN0RXhjbHVkZSA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlQYWdlVmlld0V2ZW50KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfRFdPUkQgZHdGbGFncykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVdpZGdldEV2ZW50KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDWEZBX1dpZGdldEFjYyogcFdpZGdldERhdGEsIEZYX0RXT1JEIGR3RXZlbnQsIHZvaWQqIHBQYXJhbSA9IE5VTEwsIHZvaWQqIHBBZGRpdGlvbmFsID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlbmRlckN1c3RvbVdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXgsIGNvbnN0IENGWF9SZWN0RiYgcnRVSSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZpcnR1YWwJaW50MzJfdAlDb3VudFBhZ2VzKElYRkFfRG9jKiBoRG9jKSA9IDA7DQotICAgIHZpcnR1YWwJaW50MzJfdAlHZXRDdXJyZW50UGFnZShJWEZBX0RvYyogaERvYykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldEN1cnJlbnRQYWdlKElYRkFfRG9jKiBoRG9jLCBpbnQzMl90IGlDdXJQYWdlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNDYWxjdWxhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJU2V0Q2FsY3VsYXRpb25zRW5hYmxlZChJWEZBX0RvYyogaERvYywgRlhfQk9PTCBiRW5hYmxlZCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUdldFRpdGxlKElYRkFfRG9jKiBoRG9jLCBDRlhfV2lkZVN0cmluZyAmd3NUaXRsZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldFRpdGxlKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGl0bGUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlFeHBvcnREYXRhKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZVBhdGgsIEZYX0JPT0wgYlhEUCA9IFRSVUUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlJbXBvcnREYXRhKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZVBhdGgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlHb3RvVVJMKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGJzVVJMLCBGWF9CT09MIGJBcHBlbmQgPSBUUlVFKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNWYWxpZGF0aW9uc0VuYWJsZWQoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRWYWxpZGF0aW9uc0VuYWJsZWQoSVhGQV9Eb2MqIGhEb2MsIEZYX0JPT0wgYkVuYWJsZWQpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRGb2N1c1dpZGdldChJWEZBX0RvYyogaERvYywgSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlQcmludChJWEZBX0RvYyogaERvYywgaW50MzJfdCBuU3RhcnRQYWdlLCBpbnQzMl90IG5FbmRQYWdlLCBGWF9EV09SRCBkd09wdGlvbnMpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJQWJzUGFnZUNvdW50SW5CYXRjaChJWEZBX0RvYyogaERvYykgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlBYnNQYWdlSW5CYXRjaChJWEZBX0RvYyogaERvYywgSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJU2hlZXRDb3VudEluQmF0Y2goSVhGQV9Eb2MqIGhEb2MpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJU2hlZXRJbkJhdGNoKElYRkFfRG9jKiBoRG9jLCBJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlWZXJpZnkoSVhGQV9Eb2MqIGhEb2MsIENYRkFfTm9kZSogcFNpZ05vZGUsIEZYX0JPT0wgYlVzZWQgPSBUUlVFKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2lnbihJWEZBX0RvYyogaERvYywgQ1hGQV9Ob2RlTGlzdCogcE5vZGVMaXN0LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXhwcmVzc2lvbiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1hNTElkZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUgPSBGWF9XU1RSQyhMIm9wZW4iKSwgRlhfQk9PTCBiVXNlZCA9IFRSVUUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIHZpcnR1YWwgQ1hGQV9Ob2RlTGlzdCoJCUVudW1lcmF0ZShJWEZBX0RvYyogaERvYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUNsZWFyKElYRkFfRG9jKiBoRG9jLCBDWEZBX05vZGUqIHBTaWdOb2RlLCBGWF9CT09MIGJDbGVhcmVkID0gVFJVRSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQlHZXRVUkwoSVhGQV9Eb2MqIGhEb2MsIENGWF9XaWRlU3RyaW5nICZ3c0RvY1VSTCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0FSR0IJCUdldEhpZ2hsaWdodENvbG9yKElYRkFfRG9jKiBoRG9jKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJQWRkRG9SZWNvcmQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDaGFuZ2VNYXJrKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgSW52YWxpZGF0ZVJlY3QoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IDApID0gMDsNCisgIHZpcnR1YWwgdm9pZCBEaXNwbGF5Q2FyZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZpc2libGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0QW5jaG9yKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UG9wdXBQb3MoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pblBvcHVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhQb3B1cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFBvcHVwTWVudShJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdFBvcHVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0RXhjbHVkZSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBQYWdlVmlld0V2ZW50KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfRFdPUkQgZHdGbGFncykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFdpZGdldEV2ZW50KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0RGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0V2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEFkZGl0aW9uYWwgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVuZGVyQ3VzdG9tV2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFVJKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFBhZ2VzKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q3VycmVudFBhZ2UoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDdXJyZW50UGFnZShJWEZBX0RvYyogaERvYywgaW50MzJfdCBpQ3VyUGFnZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzQ2FsY3VsYXRpb25zRW5hYmxlZChJWEZBX0RvYyogaERvYykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENhbGN1bGF0aW9uc0VuYWJsZWQoSVhGQV9Eb2MqIGhEb2MsIEZYX0JPT0wgYkVuYWJsZWQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRUaXRsZShJWEZBX0RvYyogaERvYywgQ0ZYX1dpZGVTdHJpbmcmIHdzVGl0bGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRUaXRsZShJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRXhwb3J0RGF0YShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlhEUCA9IFRSVUUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBJbXBvcnREYXRhKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVQYXRoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR290b1VSTChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgYnNVUkwsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBcHBlbmQgPSBUUlVFKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZGF0aW9uc0VuYWJsZWQoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRWYWxpZGF0aW9uc0VuYWJsZWQoSVhGQV9Eb2MqIGhEb2MsIEZYX0JPT0wgYkVuYWJsZWQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb2N1c1dpZGdldChJWEZBX0RvYyogaERvYywgSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBQcmludChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydFBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRW5kUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd09wdGlvbnMpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBBYnNQYWdlQ291bnRJbkJhdGNoKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQWJzUGFnZUluQmF0Y2goSVhGQV9Eb2MqIGhEb2MsIElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgU2hlZXRDb3VudEluQmF0Y2goSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBTaGVldEluQmF0Y2goSVhGQV9Eb2MqIGhEb2MsIElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgVmVyaWZ5KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTaWdOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VkID0gVFJVRSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHZpcnR1YWwgRlhfQk9PTCBTaWduKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlTGlzdCogcE5vZGVMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzWE1MSWRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUgPSBGWF9XU1RSQyhMIm9wZW4iKSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZWQgPSBUUlVFKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdmlydHVhbCBDWEZBX05vZGVMaXN0KiBFbnVtZXJhdGUoSVhGQV9Eb2MqIGhEb2MpIHsgcmV0dXJuIDA7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBDbGVhcihJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTaWdOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNsZWFyZWQgPSBUUlVFKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEdldFVSTChJWEZBX0RvYyogaERvYywgQ0ZYX1dpZGVTdHJpbmcmIHdzRG9jVVJMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0SGlnaGxpZ2h0Q29sb3IoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBBZGREb1JlY29yZChJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVN1Ym1pdERhdGEoSVhGQV9Eb2MqIGhEb2MsIENYRkFfU3VibWl0IHN1Ym1pdCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNoZWNrV29yZChJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzV29yZCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFN1Z2dlc3RXb3JkcyhJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzV29yZCwgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRQREZTY3JpcHRPYmplY3QoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRHbG9iYWxQcm9wZXJ0eShJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0R2xvYmFsUHJvcGVydHkoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIENQREZfRG9jdW1lbnQqICBPcGVuUERGKElYRkFfRG9jKiBoRG9jLCBJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWF9CT09MIGJUYWtlT3ZlckZpbGUpID0gMDsNCi0gICAgdmlydHVhbCBJRlhfRmlsZVJlYWQqCU9wZW5MaW5rZWRGaWxlKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMaW5rKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU3VibWl0RGF0YShJWEZBX0RvYyogaERvYywgQ1hGQV9TdWJtaXQgc3VibWl0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tXb3JkKElYRkFfRG9jKiBoRG9jLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0U3VnZ2VzdFdvcmRzKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldFBERlNjcmlwdE9iamVjdChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEdsb2JhbFByb3BlcnR5KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0R2xvYmFsUHJvcGVydHkoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpID0gMDsNCisgIHZpcnR1YWwgQ1BERl9Eb2N1bWVudCogT3BlblBERihJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRha2VPdmVyRmlsZSkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRmlsZVJlYWQqIE9wZW5MaW5rZWRGaWxlKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0xpbmspID0gMDsNCiB9Ow0KLSNkZWZpbmUgWEZBX0RPQ1ZJRVdfVmlldwkJMHgwMDAwMDAwMA0KLSNkZWZpbmUgWEZBX0RPQ1ZJRVdfTWFzdGVyUGFnZQkweDAwMDAwMDAxDQotI2RlZmluZSBYRkFfRE9DVklFV19EZXNpZ24JCTB4MDAwMDAwMDINCi0jZGVmaW5lIFhGQV9ET0NUWVBFX0R5bmFtaWMJCTANCi0jZGVmaW5lIFhGQV9ET0NUWVBFX1N0YXRpYwkJMQ0KLSNkZWZpbmUgWEZBX0RPQ1RZUEVfWERQCQkJMg0KLSNkZWZpbmUgWEZBX1BBUlNFU1RBVFVTX1N0YXR1c0VycgktMw0KLSNkZWZpbmUgWEZBX1BBUlNFU1RBVFVTX1N0cmVhbUVycgktMg0KLSNkZWZpbmUgWEZBX1BBUlNFU1RBVFVTX1N5bnRheEVycgktMQ0KLSNkZWZpbmUgWEZBX1BBUlNFU1RBVFVTX1JlYWR5CQkwDQotI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfRG9uZQkJMTAwDQotY2xhc3MgSVhGQV9Eb2NIYW5kbGVyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SVhGQV9Eb2NIYW5kbGVyKCkgeyB9DQorI2RlZmluZSBYRkFfRE9DVklFV19WaWV3IDB4MDAwMDAwMDANCisjZGVmaW5lIFhGQV9ET0NWSUVXX01hc3RlclBhZ2UgMHgwMDAwMDAwMQ0KKyNkZWZpbmUgWEZBX0RPQ1ZJRVdfRGVzaWduIDB4MDAwMDAwMDINCisjZGVmaW5lIFhGQV9ET0NUWVBFX0R5bmFtaWMgMA0KKyNkZWZpbmUgWEZBX0RPQ1RZUEVfU3RhdGljIDENCisjZGVmaW5lIFhGQV9ET0NUWVBFX1hEUCAyDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyIC0zDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfU3RyZWFtRXJyIC0yDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyIC0xDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfUmVhZHkgMA0KKyNkZWZpbmUgWEZBX1BBUlNFU1RBVFVTX0RvbmUgMTAwDQorY2xhc3MgSVhGQV9Eb2NIYW5kbGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9Eb2NIYW5kbGVyKCkge30NCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2VEb2MoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCi0gICAgdmlydHVhbCBJWEZBX0RvY1Byb3ZpZGVyKglHZXREb2NQcm92aWRlcihJWEZBX0RvYyogaERvYykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2VEb2MoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9Eb2NQcm92aWRlciogR2V0RG9jUHJvdmlkZXIoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCiANCi0gICAgdmlydHVhbCBGWF9EV09SRAkJCUdldERvY1R5cGUoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCi0gICAgdmlydHVhbAlpbnQzMl90CQkJU3RhcnRMb2FkKElYRkFfRG9jKiBoRG9jKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCURvTG9hZChJWEZBX0RvYyogaERvYywgSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTdG9wTG9hZChJWEZBX0RvYyogaERvYykgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXREb2NUeXBlKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgU3RhcnRMb2FkKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgRG9Mb2FkKElYRkFfRG9jKiBoRG9jLCBJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTdG9wTG9hZChJWEZBX0RvYyogaERvYykgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIElYRkFfRG9jVmlldyoJCUNyZWF0ZURvY1ZpZXcoSVhGQV9Eb2MqIGhEb2MsIEZYX0RXT1JEIGR3VmlldyA9IDApID0gMDsNCisgIHZpcnR1YWwgSVhGQV9Eb2NWaWV3KiBDcmVhdGVEb2NWaWV3KElYRkFfRG9jKiBoRG9jLCBGWF9EV09SRCBkd1ZpZXcgPSAwKSA9IDA7DQogDQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUNvdW50UGFja2FnZXMoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCi0gICAgdmlydHVhbAl2b2lkCQkJCUdldFBhY2thZ2VOYW1lKElYRkFfRG9jKiBoRG9jLCBpbnQzMl90IGlQYWNrYWdlLCBDRlhfV2lkZVN0cmluZ0MgJndzUGFja2FnZSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50UGFja2FnZXMoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRQYWNrYWdlTmFtZShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYWNrYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlKSA9IDA7DQogDQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTYXZlUGFja2FnZShJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhY2thZ2UsIElGWF9GaWxlV3JpdGUqIHBGaWxlLCBJWEZBX0NoZWNrc3VtQ29udGV4dCAqcENTQ29udGV4dCA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUNsb3NlRG9jKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2F2ZVBhY2thZ2UoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhY2thZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVXcml0ZSogcEZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9DaGVja3N1bUNvbnRleHQqIHBDU0NvbnRleHQgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2xvc2VEb2MoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUltcG9ydERhdGEoSVhGQV9Eb2MqIGhEb2MsIElGWF9GaWxlUmVhZCogcFN0cmVhbSwgRlhfQk9PTCBiWERQID0gVFJVRSkgPSAwOw0KLSAgICB2aXJ0dWFsCXZvaWQJCQkJU2V0SlNFUnVudGltZShJWEZBX0RvYyogaERvYywgRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpID0gMDsNCi0gICAgdmlydHVhbCBGWEpTRV9IVkFMVUUJCUdldFhGQVNjcmlwdE9iamVjdChJWEZBX0RvYyogaERvYykgPSAwOw0KLSAgICB2aXJ0dWFsIFhGQV9BVFRSSUJVVEVFTlVNCUdldFJlc3RvcmVTdGF0ZShJWEZBX0RvYyogaERvYykgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJUnVuRG9jU2NyaXB0KElYRkFfRG9jKiBoRG9jLCBYRkFfU0NSSVBUVFlQRSBlU2NyaXB0VHlwZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1NjcmlwdCwgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwgRlhKU0VfSFZBTFVFIGhUaGlzT2JqZWN0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSW1wb3J0RGF0YShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlhEUCA9IFRSVUUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRKU0VSdW50aW1lKElYRkFfRG9jKiBoRG9jLCBGWEpTRV9IUlVOVElNRSBoUnVudGltZSkgPSAwOw0KKyAgdmlydHVhbCBGWEpTRV9IVkFMVUUgR2V0WEZBU2NyaXB0T2JqZWN0KElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIFhGQV9BVFRSSUJVVEVFTlVNIEdldFJlc3RvcmVTdGF0ZShJWEZBX0RvYyogaERvYykgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFJ1bkRvY1NjcmlwdChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1NDUklQVFRZUEUgZVNjcmlwdFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVGhpc09iamVjdCkgPSAwOw0KIH07DQogZW51bSBYRkFfRVZFTlRUWVBFIHsNCi0gICAgWEZBX0VWRU5UX0NsaWNrLA0KLSAgICBYRkFfRVZFTlRfQ2hhbmdlLA0KLSAgICBYRkFfRVZFTlRfRG9jQ2xvc2UsDQotICAgIFhGQV9FVkVOVF9Eb2NSZWFkeSwNCi0gICAgWEZBX0VWRU5UX0VudGVyLA0KLSAgICBYRkFfRVZFTlRfRXhpdCwNCi0gICAgWEZBX0VWRU5UX0Z1bGwsDQotICAgIFhGQV9FVkVOVF9JbmRleENoYW5nZSwNCi0gICAgWEZBX0VWRU5UX0luaXRpYWxpemUsDQotICAgIFhGQV9FVkVOVF9Nb3VzZURvd24sDQotICAgIFhGQV9FVkVOVF9Nb3VzZUVudGVyLA0KLSAgICBYRkFfRVZFTlRfTW91c2VFeGl0LA0KLSAgICBYRkFfRVZFTlRfTW91c2VVcCwNCi0gICAgWEZBX0VWRU5UX1Bvc3RFeGVjdXRlLA0KLSAgICBYRkFfRVZFTlRfUG9zdE9wZW4sDQotICAgIFhGQV9FVkVOVF9Qb3N0UHJpbnQsDQotICAgIFhGQV9FVkVOVF9Qb3N0U2F2ZSwNCi0gICAgWEZBX0VWRU5UX1Bvc3RTaWduLA0KLSAgICBYRkFfRVZFTlRfUG9zdFN1Ym1pdCwNCi0gICAgWEZBX0VWRU5UX1ByZUV4ZWN1dGUsDQotICAgIFhGQV9FVkVOVF9QcmVPcGVuLA0KLSAgICBYRkFfRVZFTlRfUHJlUHJpbnQsDQotICAgIFhGQV9FVkVOVF9QcmVTYXZlLA0KLSAgICBYRkFfRVZFTlRfUHJlU2lnbiwNCi0gICAgWEZBX0VWRU5UX1ByZVN1Ym1pdCwNCi0gICAgWEZBX0VWRU5UX1JlYWR5LA0KLSAgICBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZSwNCi0gICAgWEZBX0VWRU5UX0luaXRWYXJpYWJsZXMsDQotICAgIFhGQV9FVkVOVF9DYWxjdWxhdGUsDQotICAgIFhGQV9FVkVOVF9WYWxpZGF0ZSwNCi0gICAgWEZBX0VWRU5UX1Vua25vd24sDQorICBYRkFfRVZFTlRfQ2xpY2ssDQorICBYRkFfRVZFTlRfQ2hhbmdlLA0KKyAgWEZBX0VWRU5UX0RvY0Nsb3NlLA0KKyAgWEZBX0VWRU5UX0RvY1JlYWR5LA0KKyAgWEZBX0VWRU5UX0VudGVyLA0KKyAgWEZBX0VWRU5UX0V4aXQsDQorICBYRkFfRVZFTlRfRnVsbCwNCisgIFhGQV9FVkVOVF9JbmRleENoYW5nZSwNCisgIFhGQV9FVkVOVF9Jbml0aWFsaXplLA0KKyAgWEZBX0VWRU5UX01vdXNlRG93biwNCisgIFhGQV9FVkVOVF9Nb3VzZUVudGVyLA0KKyAgWEZBX0VWRU5UX01vdXNlRXhpdCwNCisgIFhGQV9FVkVOVF9Nb3VzZVVwLA0KKyAgWEZBX0VWRU5UX1Bvc3RFeGVjdXRlLA0KKyAgWEZBX0VWRU5UX1Bvc3RPcGVuLA0KKyAgWEZBX0VWRU5UX1Bvc3RQcmludCwNCisgIFhGQV9FVkVOVF9Qb3N0U2F2ZSwNCisgIFhGQV9FVkVOVF9Qb3N0U2lnbiwNCisgIFhGQV9FVkVOVF9Qb3N0U3VibWl0LA0KKyAgWEZBX0VWRU5UX1ByZUV4ZWN1dGUsDQorICBYRkFfRVZFTlRfUHJlT3BlbiwNCisgIFhGQV9FVkVOVF9QcmVQcmludCwNCisgIFhGQV9FVkVOVF9QcmVTYXZlLA0KKyAgWEZBX0VWRU5UX1ByZVNpZ24sDQorICBYRkFfRVZFTlRfUHJlU3VibWl0LA0KKyAgWEZBX0VWRU5UX1JlYWR5LA0KKyAgWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUsDQorICBYRkFfRVZFTlRfSW5pdFZhcmlhYmxlcywNCisgIFhGQV9FVkVOVF9DYWxjdWxhdGUsDQorICBYRkFfRVZFTlRfVmFsaWRhdGUsDQorICBYRkFfRVZFTlRfVW5rbm93biwNCiB9Ow0KLSNkZWZpbmUgWEZBX1ZBTElEQVRFX3ByZVN1Ym1pdAkJMQ0KLSNkZWZpbmUgWEZBX1ZBTElEQVRFX3ByZVByaW50CQkyDQotI2RlZmluZSBYRkFfVkFMSURBVEVfcHJlRXhlY3V0ZQkJMw0KLSNkZWZpbmUgWEZBX1ZBTElEQVRFX3ByZVNhdmUJCTQNCi1jbGFzcyBDWEZBX0V2ZW50UGFyYW0NCi17DQotcHVibGljOg0KLSAgICBDWEZBX0V2ZW50UGFyYW0oKQ0KLSAgICB7DQotICAgICAgICBtX3BUYXJnZXQgPSBOVUxMOw0KLSAgICAgICAgbV9lVHlwZSA9IFhGQV9FVkVOVF9Vbmtub3duOw0KLSAgICAgICAgbV93c1Jlc3VsdC5FbXB0eSgpOw0KLSAgICAgICAgUmVzZXQoKTsNCi0gICAgfQ0KLSAgICB2b2lkIFJlc2V0KCkNCi0gICAgew0KLSAgICAgICAgbV93c0NoYW5nZS5FbXB0eSgpOw0KLSAgICAgICAgbV9pQ29tbWl0S2V5ID0gMDsNCi0gICAgICAgIG1fd3NGdWxsVGV4dC5FbXB0eSgpOw0KLSAgICAgICAgbV9iS2V5RG93biA9IEZBTFNFOw0KLSAgICAgICAgbV9iTW9kaWZpZXIgPSBGQUxTRTsNCi0gICAgICAgIG1fd3NOZXdDb250ZW50VHlwZS5FbXB0eSgpOw0KLSAgICAgICAgbV93c05ld1RleHQuRW1wdHkoKTsNCi0gICAgICAgIG1fd3NQcmV2Q29udGVudFR5cGUuRW1wdHkoKTsNCi0gICAgICAgIG1fd3NQcmV2VGV4dC5FbXB0eSgpOw0KLSAgICAgICAgbV9iUmVlbnRlciA9IEZBTFNFOw0KLSAgICAgICAgbV9pU2VsRW5kID0gMDsNCi0gICAgICAgIG1faVNlbFN0YXJ0ID0gMDsNCi0gICAgICAgIG1fYlNoaWZ0ID0gRkFMU0U7DQotICAgICAgICBtX3dzU29hcEZhdWx0Q29kZS5FbXB0eSgpOw0KLSAgICAgICAgbV93c1NvYXBGYXVsdFN0cmluZy5FbXB0eSgpOw0KLSAgICAgICAgbV9iSXNGb3JtUmVhZHkgPSBGQUxTRTsNCi0gICAgICAgIG1faVZhbGlkYXRlQWN0aXZpdGllcyA9IFhGQV9WQUxJREFURV9wcmVTdWJtaXQ7DQotICAgIH0NCi0gICAgQ1hGQV9XaWRnZXRBY2MqCW1fcFRhcmdldDsNCi0gICAgWEZBX0VWRU5UVFlQRQltX2VUeXBlOw0KLSAgICBDRlhfV2lkZVN0cmluZwltX3dzUmVzdWx0Ow0KLSAgICBGWF9CT09MCQkJbV9iQ2FuY2VsQWN0aW9uOw0KLSAgICBpbnQzMl90CQltX2lDb21taXRLZXk7DQotICAgIEZYX0JPT0wJCQltX2JLZXlEb3duOw0KLSAgICBGWF9CT09MCQkJbV9iTW9kaWZpZXI7DQotICAgIEZYX0JPT0wJCQltX2JSZWVudGVyOw0KLSAgICBpbnQzMl90CQltX2lTZWxFbmQ7DQotICAgIGludDMyX3QJCW1faVNlbFN0YXJ0Ow0KLSAgICBGWF9CT09MCQkJbV9iU2hpZnQ7DQotICAgIENGWF9XaWRlU3RyaW5nCW1fd3NDaGFuZ2U7DQotICAgIENGWF9XaWRlU3RyaW5nCW1fd3NGdWxsVGV4dDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJbV93c05ld0NvbnRlbnRUeXBlOw0KLSAgICBDRlhfV2lkZVN0cmluZwltX3dzTmV3VGV4dDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJbV93c1ByZXZDb250ZW50VHlwZTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJbV93c1ByZXZUZXh0Ow0KLSAgICBDRlhfV2lkZVN0cmluZwltX3dzU29hcEZhdWx0Q29kZTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJbV93c1NvYXBGYXVsdFN0cmluZzsNCi0gICAgRlhfQk9PTAkJCW1fYklzRm9ybVJlYWR5Ow0KLSAgICBpbnQzMl90CQltX2lWYWxpZGF0ZUFjdGl2aXRpZXM7DQorI2RlZmluZSBYRkFfVkFMSURBVEVfcHJlU3VibWl0IDENCisjZGVmaW5lIFhGQV9WQUxJREFURV9wcmVQcmludCAyDQorI2RlZmluZSBYRkFfVkFMSURBVEVfcHJlRXhlY3V0ZSAzDQorI2RlZmluZSBYRkFfVkFMSURBVEVfcHJlU2F2ZSA0DQorY2xhc3MgQ1hGQV9FdmVudFBhcmFtIHsNCisgcHVibGljOg0KKyAgQ1hGQV9FdmVudFBhcmFtKCkgew0KKyAgICBtX3BUYXJnZXQgPSBOVUxMOw0KKyAgICBtX2VUeXBlID0gWEZBX0VWRU5UX1Vua25vd247DQorICAgIG1fd3NSZXN1bHQuRW1wdHkoKTsNCisgICAgUmVzZXQoKTsNCisgIH0NCisgIHZvaWQgUmVzZXQoKSB7DQorICAgIG1fd3NDaGFuZ2UuRW1wdHkoKTsNCisgICAgbV9pQ29tbWl0S2V5ID0gMDsNCisgICAgbV93c0Z1bGxUZXh0LkVtcHR5KCk7DQorICAgIG1fYktleURvd24gPSBGQUxTRTsNCisgICAgbV9iTW9kaWZpZXIgPSBGQUxTRTsNCisgICAgbV93c05ld0NvbnRlbnRUeXBlLkVtcHR5KCk7DQorICAgIG1fd3NOZXdUZXh0LkVtcHR5KCk7DQorICAgIG1fd3NQcmV2Q29udGVudFR5cGUuRW1wdHkoKTsNCisgICAgbV93c1ByZXZUZXh0LkVtcHR5KCk7DQorICAgIG1fYlJlZW50ZXIgPSBGQUxTRTsNCisgICAgbV9pU2VsRW5kID0gMDsNCisgICAgbV9pU2VsU3RhcnQgPSAwOw0KKyAgICBtX2JTaGlmdCA9IEZBTFNFOw0KKyAgICBtX3dzU29hcEZhdWx0Q29kZS5FbXB0eSgpOw0KKyAgICBtX3dzU29hcEZhdWx0U3RyaW5nLkVtcHR5KCk7DQorICAgIG1fYklzRm9ybVJlYWR5ID0gRkFMU0U7DQorICAgIG1faVZhbGlkYXRlQWN0aXZpdGllcyA9IFhGQV9WQUxJREFURV9wcmVTdWJtaXQ7DQorICB9DQorICBDWEZBX1dpZGdldEFjYyogbV9wVGFyZ2V0Ow0KKyAgWEZBX0VWRU5UVFlQRSBtX2VUeXBlOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1Jlc3VsdDsNCisgIEZYX0JPT0wgbV9iQ2FuY2VsQWN0aW9uOw0KKyAgaW50MzJfdCBtX2lDb21taXRLZXk7DQorICBGWF9CT09MIG1fYktleURvd247DQorICBGWF9CT09MIG1fYk1vZGlmaWVyOw0KKyAgRlhfQk9PTCBtX2JSZWVudGVyOw0KKyAgaW50MzJfdCBtX2lTZWxFbmQ7DQorICBpbnQzMl90IG1faVNlbFN0YXJ0Ow0KKyAgRlhfQk9PTCBtX2JTaGlmdDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NDaGFuZ2U7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzRnVsbFRleHQ7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzTmV3Q29udGVudFR5cGU7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzTmV3VGV4dDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NQcmV2Q29udGVudFR5cGU7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzUHJldlRleHQ7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzU29hcEZhdWx0Q29kZTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NTb2FwRmF1bHRTdHJpbmc7DQorICBGWF9CT09MIG1fYklzRm9ybVJlYWR5Ow0KKyAgaW50MzJfdCBtX2lWYWxpZGF0ZUFjdGl2aXRpZXM7DQogfTsNCi0jZGVmaW5lIFhGQV9FVkVOVEVSUk9SX1N1Y2VzcwkJMQ0KLSNkZWZpbmUgWEZBX0VWRU5URVJST1JfRXJyb3IJCS0xDQotI2RlZmluZSBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdAkJMA0KLSNkZWZpbmUgWEZBX0VWRU5URVJST1JfRGlzYWJsZWQJCTINCisjZGVmaW5lIFhGQV9FVkVOVEVSUk9SX1N1Y2VzcyAxDQorI2RlZmluZSBYRkFfRVZFTlRFUlJPUl9FcnJvciAtMQ0KKyNkZWZpbmUgWEZBX0VWRU5URVJST1JfTm90RXhpc3QgMA0KKyNkZWZpbmUgWEZBX0VWRU5URVJST1JfRGlzYWJsZWQgMg0KIGVudW0gWEZBX1dJREdFVE9SREVSIHsNCi0gICAgWEZBX1dJREdFVE9SREVSX1ByZU9yZGVyLA0KKyAgWEZBX1dJREdFVE9SREVSX1ByZU9yZGVyLA0KIH07DQotY2xhc3MgSVhGQV9Eb2NWaWV3DQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SVhGQV9Eb2NWaWV3KCkgeyB9DQorY2xhc3MgSVhGQV9Eb2NWaWV3IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9Eb2NWaWV3KCkge30NCiANCi0gICAgdmlydHVhbCBJWEZBX0RvYyoJCQlHZXREb2MoKSA9IDA7DQotICAgIHZpcnR1YWwJaW50MzJfdAkJCVN0YXJ0TGF5b3V0KGludDMyX3QgaVN0YXJ0UGFnZSA9IDApID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJRG9MYXlvdXQoSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTdG9wTGF5b3V0KCkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX0RvYyogR2V0RG9jKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFN0YXJ0TGF5b3V0KGludDMyX3QgaVN0YXJ0UGFnZSA9IDApID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBEb0xheW91dChJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTdG9wTGF5b3V0KCkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRMYXlvdXRTdGF0dXMoKSA9IDA7DQotICAgIHZpcnR1YWwJdm9pZAkJCQlVcGRhdGVEb2NWaWV3KCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlDb3VudFBhZ2VWaWV3cygpID0gMDsNCi0gICAgdmlydHVhbCBJWEZBX1BhZ2VWaWV3KgkJR2V0UGFnZVZpZXcoaW50MzJfdCBuSW5kZXgpID0gMDsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldCoJCQlHZXRXaWRnZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpID0gMDsNCi0gICAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyoJCUdldFdpZGdldEFjY0J5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzZXRXaWRnZXREYXRhKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlQcm9jZXNzV2lkZ2V0RXZlbnQoQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0sIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0SGFuZGxlcioJR2V0V2lkZ2V0SGFuZGxlcigpID0gMDsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldEl0ZXJhdG9yKglDcmVhdGVXaWRnZXRJdGVyYXRvcigpID0gMDsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBDcmVhdGVXaWRnZXRBY2NJdGVyYXRvcihYRkFfV0lER0VUT1JERVIgZU9yZGVyID0gWEZBX1dJREdFVE9SREVSX1ByZU9yZGVyKSA9IDA7DQotICAgIHZpcnR1YWwgSVhGQV9XaWRnZXQqCQkJR2V0Rm9jdXNXaWRnZXQoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlLaWxsRm9jdXMoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRGb2N1cyhJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExheW91dFN0YXR1cygpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVEb2NWaWV3KCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50UGFnZVZpZXdzKCkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX1BhZ2VWaWV3KiBHZXRQYWdlVmlldyhpbnQzMl90IG5JbmRleCkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogR2V0V2lkZ2V0QnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSA9IDA7DQorICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKiBHZXRXaWRnZXRBY2NCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSZXNldFdpZGdldERhdGEoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgUHJvY2Vzc1dpZGdldEV2ZW50KENYRkFfRXZlbnRQYXJhbSogcFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXRIYW5kbGVyKiBHZXRXaWRnZXRIYW5kbGVyKCkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldEl0ZXJhdG9yKiBDcmVhdGVXaWRnZXRJdGVyYXRvcigpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXRBY2NJdGVyYXRvciogQ3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoDQorICAgICAgWEZBX1dJREdFVE9SREVSIGVPcmRlciA9IFhGQV9XSURHRVRPUkRFUl9QcmVPcmRlcikgPSAwOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogR2V0Rm9jdXNXaWRnZXQoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgS2lsbEZvY3VzKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvY3VzKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQogfTsNCi0jZGVmaW5lIFhGQV9UUkFWRVJTRVdBWV9UcmFudmFsc2UJCTB4MDAwMQ0KLSNkZWZpbmUgWEZBX1RSQVZFUlNFV0FZX0Zvcm0JCQkweDAwMDINCi0jZGVmaW5lIFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZQkJMHgwMDAxDQotI2RlZmluZSBYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlCQkweDAwMTANCi0jZGVmaW5lIFhGQV9XSURHRVRGSUxURVJfUHJpbnRhYmxlCQkweDAwMjANCi0jZGVmaW5lIFhGQV9XSURHRVRGSUxURVJfRmllbGQJCQkweDAxMDANCi0jZGVmaW5lIFhGQV9XSURHRVRGSUxURVJfQWxsVHlwZQkJMHgwRjAwDQotY2xhc3MgSVhGQV9QYWdlVmlldw0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklYRkFfUGFnZVZpZXcoKSB7IH0NCisjZGVmaW5lIFhGQV9UUkFWRVJTRVdBWV9UcmFudmFsc2UgMHgwMDAxDQorI2RlZmluZSBYRkFfVFJBVkVSU0VXQVlfRm9ybSAweDAwMDINCisjZGVmaW5lIFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZSAweDAwMDENCisjZGVmaW5lIFhGQV9XSURHRVRGSUxURVJfVmlld2FibGUgMHgwMDEwDQorI2RlZmluZSBYRkFfV0lER0VURklMVEVSX1ByaW50YWJsZSAweDAwMjANCisjZGVmaW5lIFhGQV9XSURHRVRGSUxURVJfRmllbGQgMHgwMTAwDQorI2RlZmluZSBYRkFfV0lER0VURklMVEVSX0FsbFR5cGUgMHgwRjAwDQorY2xhc3MgSVhGQV9QYWdlVmlldyB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfUGFnZVZpZXcoKSB7fQ0KIA0KLSAgICB2aXJ0dWFsIElYRkFfRG9jVmlldyoJR2V0RG9jVmlldygpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRQYWdlVmlld0luZGV4KCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRQYWdlVmlld1JlY3QoQ0ZYX1JlY3RGICZydFBhZ2UpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9Eb2NWaWV3KiBHZXREb2NWaWV3KCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFBhZ2VWaWV3SW5kZXgoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0UGFnZVZpZXdSZWN0KENGWF9SZWN0RiYgcnRQYWdlKSA9IDA7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCUdldERpc3BsYXlNYXRyaXgoQ0ZYX01hdHJpeCAmbXQsIGNvbnN0IENGWF9SZWN0ICZydERpc3AsIGludDMyX3QgaVJvdGF0ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldERpc3BsYXlNYXRyaXgoQ0ZYX01hdHJpeCYgbXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdCYgcnREaXNwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSA9IDA7DQogDQotICAgIHZpcnR1YWwgaW50MzJfdAkJTG9hZFBhZ2VWaWV3KElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlVbmxvYWRQYWdlVmlldygpID0gMDsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldCoJCUdldFdpZGdldEJ5UG9zKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KLSAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0SXRlcmF0b3IqIENyZWF0ZVdpZGdldEl0ZXJhdG9yKEZYX0RXT1JEIGR3VHJhdmVyc2VXYXkgPSBYRkFfVFJBVkVSU0VXQVlfRm9ybSwgRlhfRFdPUkQgZHdXaWRnZXRGaWx0ZXIgPSBYRkFfV0lER0VURklMVEVSX1Zpc2libGUgfCBYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlIHwgWEZBX1dJREdFVEZJTFRFUl9BbGxUeXBlKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgTG9hZFBhZ2VWaWV3KElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFVubG9hZFBhZ2VWaWV3KCkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogR2V0V2lkZ2V0QnlQb3MoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0SXRlcmF0b3IqIENyZWF0ZVdpZGdldEl0ZXJhdG9yKA0KKyAgICAgIEZYX0RXT1JEIGR3VHJhdmVyc2VXYXkgPSBYRkFfVFJBVkVSU0VXQVlfRm9ybSwNCisgICAgICBGWF9EV09SRCBkd1dpZGdldEZpbHRlciA9IFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9XSURHRVRGSUxURVJfQWxsVHlwZSkgPSAwOw0KIH07DQotY2xhc3MgQ1hGQV9SZW5kZXJPcHRpb25zDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9SZW5kZXJPcHRpb25zKCkNCi0gICAgICAgIDogbV9iUHJpbnQoRkFMU0UpDQotICAgICAgICAsIG1fYkhpZ2hsaWdodChUUlVFKQ0KLSAgICB7DQotICAgIH0NCi0gICAgRlhfQk9PTAkJCW1fYlByaW50Ow0KLSAgICBGWF9CT09MCQkJbV9iSGlnaGxpZ2h0Ow0KK2NsYXNzIENYRkFfUmVuZGVyT3B0aW9ucyB7DQorIHB1YmxpYzoNCisgIENYRkFfUmVuZGVyT3B0aW9ucygpIDogbV9iUHJpbnQoRkFMU0UpLCBtX2JIaWdobGlnaHQoVFJVRSkge30NCisgIEZYX0JPT0wgbV9iUHJpbnQ7DQorICBGWF9CT09MIG1fYkhpZ2hsaWdodDsNCiB9Ow0KLSNkZWZpbmUgWEZBX1JFTkRFUlNUQVRVU19SZWFkeQkJCTENCi0jZGVmaW5lIFhGQV9SRU5ERVJTVEFUVVNfVG9CZUNvbnRpbnVlZAkyDQotI2RlZmluZSBYRkFfUkVOREVSU1RBVFVTX0RvbmUJCQkzDQotI2RlZmluZSBYRkFfUkVOREVSU1RBVFVTX0ZhaWxlZAkJCS0xDQotY2xhc3MgSVhGQV9SZW5kZXJDb250ZXh0DQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJU3RhcnRSZW5kZXIoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LCBDRlhfR3JhcGhpY3MqIHBHUywgY29uc3QgQ0ZYX01hdHJpeCYgcE1hdHJpeCwgY29uc3QgQ1hGQV9SZW5kZXJPcHRpb25zJiBvcHRpb25zKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAlEb1JlbmRlcihJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbAl2b2lkCQlTdG9wUmVuZGVyKCkgPSAwOw0KLXByb3RlY3RlZDoNCi0gICAgfklYRkFfUmVuZGVyQ29udGV4dCgpIHsgfQ0KKyNkZWZpbmUgWEZBX1JFTkRFUlNUQVRVU19SZWFkeSAxDQorI2RlZmluZSBYRkFfUkVOREVSU1RBVFVTX1RvQmVDb250aW51ZWQgMg0KKyNkZWZpbmUgWEZBX1JFTkRFUlNUQVRVU19Eb25lIDMNCisjZGVmaW5lIFhGQV9SRU5ERVJTVEFUVVNfRmFpbGVkIC0xDQorY2xhc3MgSVhGQV9SZW5kZXJDb250ZXh0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgU3RhcnRSZW5kZXIoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hGQV9SZW5kZXJPcHRpb25zJiBvcHRpb25zKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgRG9SZW5kZXIoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU3RvcFJlbmRlcigpID0gMDsNCisNCisgcHJvdGVjdGVkOg0KKyAgfklYRkFfUmVuZGVyQ29udGV4dCgpIHt9DQogfTsNCi1JWEZBX1JlbmRlckNvbnRleHQqCVhGQV9SZW5kZXJDb250ZXh0X0NyZWF0ZSgpOw0KK0lYRkFfUmVuZGVyQ29udGV4dCogWEZBX1JlbmRlckNvbnRleHRfQ3JlYXRlKCk7DQogZW51bSBYRkFfV0lER0VUVFlQRSB7DQotICAgIFhGQV9XSURHRVRUWVBFX0JhcmNvZGUsDQotICAgIFhGQV9XSURHRVRUWVBFX1B1c2hCdXR0b24sDQotICAgIFhGQV9XSURHRVRUWVBFX0NoZWNrQnV0dG9uLA0KLSAgICBYRkFfV0lER0VUVFlQRV9SYWRpb0J1dHRvbiwNCi0gICAgWEZBX1dJREdFVFRZUEVfRGF0ZXRpbWVFZGl0LA0KLSAgICBYRkFfV0lER0VUVFlQRV9EZWNpbWFsRmllbGQsDQotICAgIFhGQV9XSURHRVRUWVBFX051bWVyaWNGaWVsZCwNCi0gICAgWEZBX1dJREdFVFRZUEVfU2lnbmF0dXJlLA0KLSAgICBYRkFfV0lER0VUVFlQRV9UZXh0RWRpdCwNCi0gICAgWEZBX1dJREdFVFRZUEVfRHJvcGRvd25MaXN0LA0KLSAgICBYRkFfV0lER0VUVFlQRV9MaXN0Qm94LA0KLSAgICBYRkFfV0lER0VUVFlQRV9JbWFnZUZpZWxkLA0KLSAgICBYRkFfV0lER0VUVFlQRV9QYXNzd29yZEVkaXQsDQotICAgIFhGQV9XSURHRVRUWVBFX0FyYywNCi0gICAgWEZBX1dJREdFVFRZUEVfUmVjdGFuZ2xlLA0KLSAgICBYRkFfV0lER0VUVFlQRV9JbWFnZSwNCi0gICAgWEZBX1dJREdFVFRZUEVfTGluZSwNCi0gICAgWEZBX1dJREdFVFRZUEVfVGV4dCwNCi0gICAgWEZBX1dJREdFVFRZUEVfRXhjbHVkZUdyb3VwLA0KLSAgICBYRkFfV0lER0VUVFlQRV9TdWJmb3JtLA0KLSAgICBYRkFfV0lER0VUVFlQRV9Vbmtub3duLA0KKyAgWEZBX1dJREdFVFRZUEVfQmFyY29kZSwNCisgIFhGQV9XSURHRVRUWVBFX1B1c2hCdXR0b24sDQorICBYRkFfV0lER0VUVFlQRV9DaGVja0J1dHRvbiwNCisgIFhGQV9XSURHRVRUWVBFX1JhZGlvQnV0dG9uLA0KKyAgWEZBX1dJREdFVFRZUEVfRGF0ZXRpbWVFZGl0LA0KKyAgWEZBX1dJREdFVFRZUEVfRGVjaW1hbEZpZWxkLA0KKyAgWEZBX1dJREdFVFRZUEVfTnVtZXJpY0ZpZWxkLA0KKyAgWEZBX1dJREdFVFRZUEVfU2lnbmF0dXJlLA0KKyAgWEZBX1dJREdFVFRZUEVfVGV4dEVkaXQsDQorICBYRkFfV0lER0VUVFlQRV9Ecm9wZG93bkxpc3QsDQorICBYRkFfV0lER0VUVFlQRV9MaXN0Qm94LA0KKyAgWEZBX1dJREdFVFRZUEVfSW1hZ2VGaWVsZCwNCisgIFhGQV9XSURHRVRUWVBFX1Bhc3N3b3JkRWRpdCwNCisgIFhGQV9XSURHRVRUWVBFX0FyYywNCisgIFhGQV9XSURHRVRUWVBFX1JlY3RhbmdsZSwNCisgIFhGQV9XSURHRVRUWVBFX0ltYWdlLA0KKyAgWEZBX1dJREdFVFRZUEVfTGluZSwNCisgIFhGQV9XSURHRVRUWVBFX1RleHQsDQorICBYRkFfV0lER0VUVFlQRV9FeGNsdWRlR3JvdXAsDQorICBYRkFfV0lER0VUVFlQRV9TdWJmb3JtLA0KKyAgWEZBX1dJREdFVFRZUEVfVW5rbm93biwNCiB9Ow0KLSNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlCTB4MDAwMDAwMDENCi0jZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfSW52aXNpYmxlCTB4MDAwMDAwMDINCi0jZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfSGlkZGVuCQkweDAwMDAwMDA0DQotI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX1ZpZXdhYmxlCTB4MDAwMDAwMTANCi0jZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfUHJpbnRhYmxlCTB4MDAwMDAwMjANCi0jZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZAkweDAwMDAwMTAwDQotY2xhc3MgSVhGQV9XaWRnZXRIYW5kbGVyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SVhGQV9XaWRnZXRIYW5kbGVyKCkgeyB9DQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUgMHgwMDAwMDAwMQ0KKyNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19JbnZpc2libGUgMHgwMDAwMDAwMg0KKyNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19IaWRkZW4gMHgwMDAwMDAwNA0KKyNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19WaWV3YWJsZSAweDAwMDAwMDEwDQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX1ByaW50YWJsZSAweDAwMDAwMDIwDQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQgMHgwMDAwMDEwMA0KK2NsYXNzIElYRkFfV2lkZ2V0SGFuZGxlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfV2lkZ2V0SGFuZGxlcigpIHt9DQogDQotICAgIHZpcnR1YWwgSVhGQV9XaWRnZXQqCQlDcmVhdGVXaWRnZXQoSVhGQV9XaWRnZXQqIGhQYXJlbnQsIFhGQV9XSURHRVRUWVBFIGVUeXBlLCBJWEZBX1dpZGdldCogaEJlZm9yZSA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBJWEZBX1BhZ2VWaWV3KglHZXRQYWdlVmlldyhJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRSZWN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldFN0YXR1cyhJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCQm94KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0Qm94LCBGWF9EV09SRCBkd1N0YXR1cywgRlhfQk9PTCBiRHJhd0ZvY3VzID0gRkFMU0UpID0gMDsNCi0gICAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyoJR2V0RGF0YUFjYyhJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogQ3JlYXRlV2lkZ2V0KElYRkFfV2lkZ2V0KiBoUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9XSURHRVRUWVBFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYRkFfV2lkZ2V0KiBoQmVmb3JlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX1BhZ2VWaWV3KiBHZXRQYWdlVmlldyhJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFJlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9SZWN0RiYgcnQpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0U3RhdHVzKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0QkJveChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRCb3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRyYXdGb2N1cyA9IEZBTFNFKSA9IDA7DQorICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKiBHZXREYXRhQWNjKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCUdldE5hbWUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c05hbWUsIGludDMyX3QgaU5hbWVUeXBlID0gMCkgPSAwOw0KLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQlHZXRUb29sVGlwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUb29sVGlwKSA9IDA7DQotICAgIHZpcnR1YWwJdm9pZAkJCVNldFByaXZhdGVEYXRhKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCB2b2lkKiBtb2R1bGVfaWQsIHZvaWQqIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaykgPSAwOw0KLSAgICB2aXJ0dWFsCXZvaWQqCQlHZXRQcml2YXRlRGF0YShJWEZBX1dpZGdldCogaFdpZGdldCwgdm9pZCogbW9kdWxlX2lkKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCU9uTW91c2VFbnRlcihJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbk1vdXNlRXhpdChJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbkxCdXR0b25Eb3duKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJT25MQnV0dG9uVXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbkxCdXR0b25EYmxDbGsoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbk1vdXNlTW92ZShJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCU9uTW91c2VXaGVlbChJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgaW50MTZfdCB6RGVsdGEsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPblJCdXR0b25Eb3duKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJT25SQnV0dG9uVXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPblJCdXR0b25EYmxDbGsoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldE5hbWUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTmFtZVR5cGUgPSAwKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0VG9vbFRpcChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1Rvb2xUaXApID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRQcml2YXRlRGF0YShJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBtb2R1bGVfaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spID0gMDsNCisgIHZpcnR1YWwgdm9pZCogR2V0UHJpdmF0ZURhdGEoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIHZvaWQqIG1vZHVsZV9pZCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VFbnRlcihJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VFeGl0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZU1vdmUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VXaGVlbChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvblVwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25EYmxDbGsoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbktleURvd24oSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlPbktleVVwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJT25DaGFyKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0NoYXIsIEZYX0RXT1JEIGR3RmxhZ3MpID0gMDsNCi0gICAgdmlydHVhbAlGWF9EV09SRAkJT25IaXRUZXN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJT25TZXRDdXJzb3IoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5RG93bihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdLZXlDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlVcChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3S2V5Q29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q2hhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBPbkhpdFRlc3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25TZXRDdXJzb3IoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpID0gMDsNCiANCi0gICAgdmlydHVhbCB2b2lkCQkJUmVuZGVyV2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsIEZYX0JPT0wgYkhpZ2hsaWdodCA9IEZBTFNFKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUhhc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLCBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlQcm9jZXNzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsIENYRkFfRXZlbnRQYXJhbSogcFBhcmFtKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVuZGVyV2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhpZ2hsaWdodCA9IEZBTFNFKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSGFzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgUHJvY2Vzc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSkgPSAwOw0KIH07DQotY2xhc3MgSVhGQV9XaWRnZXRJdGVyYXRvcg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzZXQoKSA9IDA7DQotICAgIHZpcnR1YWwgSVhGQV9XaWRnZXQqCQkJTW92ZVRvRmlyc3QoKSA9IDA7DQotICAgIHZpcnR1YWwgSVhGQV9XaWRnZXQqCQkJTW92ZVRvTGFzdCgpID0gMDsNCi0gICAgdmlydHVhbAlJWEZBX1dpZGdldCoJCQlNb3ZlVG9OZXh0KCkgPSAwOw0KLSAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0KgkJCU1vdmVUb1ByZXZpb3VzKCkgPSAwOw0KLSAgICB2aXJ0dWFsCUlYRkFfV2lkZ2V0KgkJCUdldEN1cnJlbnRXaWRnZXQoKSA9IDA7DQotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlTZXRDdXJyZW50V2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSAgPSAwOw0KLXByb3RlY3RlZDoNCi0gICAgfklYRkFfV2lkZ2V0SXRlcmF0b3IoKSB7IH0NCi19Ow0KLWNsYXNzIElYRkFfV2lkZ2V0QWNjSXRlcmF0b3INCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0KCkgPSAwOw0KLSAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKgkJTW92ZVRvRmlyc3QoKSA9IDA7DQotICAgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqCQlNb3ZlVG9MYXN0KCkgPSAwOw0KLSAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKgkJTW92ZVRvTmV4dCgpID0gMDsNCi0gICAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyoJCU1vdmVUb1ByZXZpb3VzKCkgPSAwOw0KLSAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKgkJR2V0Q3VycmVudFdpZGdldEFjYygpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCVNldEN1cnJlbnRXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIGhXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVNraXBUcmVlKCkgPSAwOw0KLXByb3RlY3RlZDoNCi0gICAgfklYRkFfV2lkZ2V0QWNjSXRlcmF0b3IoKSB7IH0NCi19Ow0KLUlYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIFhGQV9XaWRnZXRBY2NJdGVyYXRvcl9DcmVhdGUoQ1hGQV9XaWRnZXRBY2MqIHBUcmF2ZWxSb290LCBYRkFfV0lER0VUT1JERVIgZU9yZGVyID0gWEZBX1dJREdFVE9SREVSX1ByZU9yZGVyKTsNCi1jbGFzcyBJWEZBX0NoZWNrc3VtQ29udGV4dA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KK2NsYXNzIElYRkFfV2lkZ2V0SXRlcmF0b3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb0ZpcnN0KCkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvTGFzdCgpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb05leHQoKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBNb3ZlVG9QcmV2aW91cygpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldEN1cnJlbnRXaWRnZXQoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q3VycmVudFdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU3RhcnRDaGVja3N1bSgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCVVwZGF0ZUNoZWNrc3VtKElGWF9GaWxlUmVhZCogcFNyY0ZpbGUsIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gMCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJRmluaXNoQ2hlY2tzdW0oKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlHZXRDaGVja3N1bShDRlhfQnl0ZVN0cmluZyAmYnNDaGVja3N1bSkgPSAwOw0KLXByb3RlY3RlZDoNCi0gICAgfklYRkFfQ2hlY2tzdW1Db250ZXh0KCkgeyB9DQorIHByb3RlY3RlZDoNCisgIH5JWEZBX1dpZGdldEl0ZXJhdG9yKCkge30NCiB9Ow0KLUlYRkFfQ2hlY2tzdW1Db250ZXh0KglYRkFfQ2hlY2tzdW1fQ3JlYXRlKCk7DQorY2xhc3MgSVhGQV9XaWRnZXRBY2NJdGVyYXRvciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlc2V0KCkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogTW92ZVRvRmlyc3QoKSA9IDA7DQorICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKiBNb3ZlVG9MYXN0KCkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogTW92ZVRvTmV4dCgpID0gMDsNCisgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqIE1vdmVUb1ByZXZpb3VzKCkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogR2V0Q3VycmVudFdpZGdldEFjYygpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDdXJyZW50V2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2tpcFRyZWUoKSA9IDA7DQorDQorIHByb3RlY3RlZDoNCisgIH5JWEZBX1dpZGdldEFjY0l0ZXJhdG9yKCkge30NCit9Ow0KK0lYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIFhGQV9XaWRnZXRBY2NJdGVyYXRvcl9DcmVhdGUoDQorICAgIENYRkFfV2lkZ2V0QWNjKiBwVHJhdmVsUm9vdCwNCisgICAgWEZBX1dJREdFVE9SREVSIGVPcmRlciA9IFhGQV9XSURHRVRPUkRFUl9QcmVPcmRlcik7DQorY2xhc3MgSVhGQV9DaGVja3N1bUNvbnRleHQgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBTdGFydENoZWNrc3VtKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFVwZGF0ZUNoZWNrc3VtKElGWF9GaWxlUmVhZCogcFNyY0ZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDApID0gMDsNCisgIHZpcnR1YWwgdm9pZCBGaW5pc2hDaGVja3N1bSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRDaGVja3N1bShDRlhfQnl0ZVN0cmluZyYgYnNDaGVja3N1bSkgPSAwOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB+SVhGQV9DaGVja3N1bUNvbnRleHQoKSB7fQ0KK307DQorSVhGQV9DaGVja3N1bUNvbnRleHQqIFhGQV9DaGVja3N1bV9DcmVhdGUoKTsNCiANCiAjZW5kaWYgIC8vIEZYRkFfSF8NCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9meGZhL2Z4ZmFfYmFzaWMuaCBiL3hmYS9pbmNsdWRlL2Z4ZmEvZnhmYV9iYXNpYy5oCmluZGV4IDEzMzE0MDIuLjdkOTBmZTggMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z4ZmEvZnhmYV9iYXNpYy5oCisrKyBiL3hmYS9pbmNsdWRlL2Z4ZmEvZnhmYV9iYXNpYy5oCkBAIC0xMCwxMDY3ICsxMCwxMDc1IEBACiAjaW5jbHVkZSAiLi4vZnhqc2UvZnhqc2UuaCINCiANCiBjbGFzcyBDWEZBX01lYXN1cmVtZW50Ow0KLSNkZWZpbmUgWEZBX0hBU0hDT0RFX1hmYQkJCQkJMHhjNTZiOWZmDQotI2RlZmluZSBYRkFfSEFTSENPREVfQ29uZmlnCQkJCQkweDRlMWUzOWI2DQotI2RlZmluZSBYRkFfSEFTSENPREVfVGVtcGxhdGUJCQkJMHg4MDM1NTBmYw0KLSNkZWZpbmUgWEZBX0hBU0hDT0RFX0RhdGFzZXRzCQkJCTB4OTliOTUwNzkNCi0jZGVmaW5lIFhGQV9IQVNIQ09ERV9EYXRhCQkJCQkweGJkZTlhYmRhDQotI2RlZmluZSBYRkFfSEFTSENPREVfRm9ybQkJCQkJMHhjZDMwOWZmNA0KLSNkZWZpbmUgWEZBX0hBU0hDT0RFX0xvY2FsZVNldAkJCQkweDU0NzNiNmRjDQotI2RlZmluZSBYRkFfSEFTSENPREVfQ29ubmVjdGlvblNldAkJCTB4ZTE0YzgwMWMNCi0jZGVmaW5lIFhGQV9IQVNIQ09ERV9Tb3VyY2VTZXQJCQkJMHg4MTE5MjlkDQotI2RlZmluZSBYRkFfSEFTSENPREVfWGRjCQkJCQkweGM1NmFmYmYNCi0jZGVmaW5lIFhGQV9IQVNIQ09ERV9QZGYJCQkJCTB4Yjg0M2RiYQ0KLSNkZWZpbmUgWEZBX0hBU0hDT0RFX1hmZGYJCQkJCTB4NDhkMDA0YTgNCi0jZGVmaW5lIFhGQV9IQVNIQ09ERV9YbXBtZXRhCQkJCTB4MTMyYThmYmMNCi0jZGVmaW5lIFhGQV9IQVNIQ09ERV9TaWduYXR1cmUJCQkJMHg4YjAzNmYzMg0KLSNkZWZpbmUgWEZBX0hBU0hDT0RFX1N0eWxlc2hlZXQJCQkJMHg2MDM4NTgwYQ0KLSNkZWZpbmUgWEZBX0hBU0hDT0RFX1hEUAkJCQkJMHhjNTZhZmNjDQotI2RlZmluZSBYRkFfSEFTSENPREVfUmVjb3JkCQkJCQkweDU3NzlkNjVmDQotI2RlZmluZSBYRkFfSEFTSENPREVfRGF0YVdpbmRvdwkJCQkweDgzYTU1MGQyDQotI2RlZmluZSBYRkFfSEFTSENPREVfSG9zdAkJCQkJMHhkYjA3NWJkZQ0KLSNkZWZpbmUgWEZBX0hBU0hDT0RFX0xvZwkJCQkJMHgwYjFiM2QyMg0KLSNkZWZpbmUgWEZBX0hBU0hDT0RFX0V2ZW50CQkJCQkweDE4NWU0MWUyDQotI2RlZmluZSBYRkFfSEFTSENPREVfTGF5b3V0CQkJCQkweDdlN2U4NDVlDQotI2RlZmluZSBYRkFfSEFTSENPREVfT2NjdXIJCQkJCTB4ZjdlZWJlMWMNCi0jZGVmaW5lIFhGQV9IQVNIQ09ERV9UaGlzCQkJCQkweDJkNTc0ZDU4DQotI2RlZmluZSBYRkFfSEFTSENPREVfRGF0YURlc2NyaXB0aW9uCQkweDJiNWRmNTFlDQotI2RlZmluZSBYRkFfSEFTSENPREVfTmFtZQkJCQkJMHgzMWIxOWMxDQorI2RlZmluZSBYRkFfSEFTSENPREVfWGZhIDB4YzU2YjlmZg0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX0NvbmZpZyAweDRlMWUzOWI2DQorI2RlZmluZSBYRkFfSEFTSENPREVfVGVtcGxhdGUgMHg4MDM1NTBmYw0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX0RhdGFzZXRzIDB4OTliOTUwNzkNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9EYXRhIDB4YmRlOWFiZGENCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9Gb3JtIDB4Y2QzMDlmZjQNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9Mb2NhbGVTZXQgMHg1NDczYjZkYw0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX0Nvbm5lY3Rpb25TZXQgMHhlMTRjODAxYw0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX1NvdXJjZVNldCAweDgxMTkyOWQNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9YZGMgMHhjNTZhZmJmDQorI2RlZmluZSBYRkFfSEFTSENPREVfUGRmIDB4Yjg0M2RiYQ0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX1hmZGYgMHg0OGQwMDRhOA0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX1htcG1ldGEgMHgxMzJhOGZiYw0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX1NpZ25hdHVyZSAweDhiMDM2ZjMyDQorI2RlZmluZSBYRkFfSEFTSENPREVfU3R5bGVzaGVldCAweDYwMzg1ODBhDQorI2RlZmluZSBYRkFfSEFTSENPREVfWERQIDB4YzU2YWZjYw0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX1JlY29yZCAweDU3NzlkNjVmDQorI2RlZmluZSBYRkFfSEFTSENPREVfRGF0YVdpbmRvdyAweDgzYTU1MGQyDQorI2RlZmluZSBYRkFfSEFTSENPREVfSG9zdCAweGRiMDc1YmRlDQorI2RlZmluZSBYRkFfSEFTSENPREVfTG9nIDB4MGIxYjNkMjINCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9FdmVudCAweDE4NWU0MWUyDQorI2RlZmluZSBYRkFfSEFTSENPREVfTGF5b3V0IDB4N2U3ZTg0NWUNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9PY2N1ciAweGY3ZWViZTFjDQorI2RlZmluZSBYRkFfSEFTSENPREVfVGhpcyAweDJkNTc0ZDU4DQorI2RlZmluZSBYRkFfSEFTSENPREVfRGF0YURlc2NyaXB0aW9uIDB4MmI1ZGY1MWUNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9OYW1lIDB4MzFiMTljMQ0KIGVudW0gWEZBX1BBQ0tFVCB7DQotICAgIFhGQV9QQUNLRVRfVVNFUiwNCi0gICAgWEZBX1BBQ0tFVF9Tb3VyY2VTZXQsDQotICAgIFhGQV9QQUNLRVRfUGRmLA0KLSAgICBYRkFfUEFDS0VUX1hkYywNCi0gICAgWEZBX1BBQ0tFVF9YRFAsDQotICAgIFhGQV9QQUNLRVRfWG1wbWV0YSwNCi0gICAgWEZBX1BBQ0tFVF9YZmRmLA0KLSAgICBYRkFfUEFDS0VUX0NvbmZpZywNCi0gICAgWEZBX1BBQ0tFVF9Mb2NhbGVTZXQsDQotICAgIFhGQV9QQUNLRVRfU3R5bGVzaGVldCwNCi0gICAgWEZBX1BBQ0tFVF9UZW1wbGF0ZSwNCi0gICAgWEZBX1BBQ0tFVF9TaWduYXR1cmUsDQotICAgIFhGQV9QQUNLRVRfRGF0YXNldHMsDQotICAgIFhGQV9QQUNLRVRfRm9ybSwNCi0gICAgWEZBX1BBQ0tFVF9Db25uZWN0aW9uU2V0LA0KKyAgWEZBX1BBQ0tFVF9VU0VSLA0KKyAgWEZBX1BBQ0tFVF9Tb3VyY2VTZXQsDQorICBYRkFfUEFDS0VUX1BkZiwNCisgIFhGQV9QQUNLRVRfWGRjLA0KKyAgWEZBX1BBQ0tFVF9YRFAsDQorICBYRkFfUEFDS0VUX1htcG1ldGEsDQorICBYRkFfUEFDS0VUX1hmZGYsDQorICBYRkFfUEFDS0VUX0NvbmZpZywNCisgIFhGQV9QQUNLRVRfTG9jYWxlU2V0LA0KKyAgWEZBX1BBQ0tFVF9TdHlsZXNoZWV0LA0KKyAgWEZBX1BBQ0tFVF9UZW1wbGF0ZSwNCisgIFhGQV9QQUNLRVRfU2lnbmF0dXJlLA0KKyAgWEZBX1BBQ0tFVF9EYXRhc2V0cywNCisgIFhGQV9QQUNLRVRfRm9ybSwNCisgIFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCwNCiB9Ow0KIGVudW0gWEZBX1hEUFBBQ0tFVCB7DQotICAgIFhGQV9YRFBQQUNLRVRfVU5LTk9XTgkJCT0gMCwNCi0gICAgWEZBX1hEUFBBQ0tFVF9Db25maWcJCQk9IDEgPDwgWEZBX1BBQ0tFVF9Db25maWcJCSwNCi0gICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZQkJCT0gMSA8PCBYRkFfUEFDS0VUX1RlbXBsYXRlCQksDQotICAgIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMJCQk9IDEgPDwgWEZBX1BBQ0tFVF9EYXRhc2V0cwkJLA0KLSAgICBYRkFfWERQUEFDS0VUX0Zvcm0JCQkJPSAxIDw8IFhGQV9QQUNLRVRfRm9ybQkJCSwNCi0gICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQJCQk9IDEgPDwgWEZBX1BBQ0tFVF9Mb2NhbGVTZXQJCSwNCi0gICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0CQk9IDEgPDwgWEZBX1BBQ0tFVF9Db25uZWN0aW9uU2V0CSwNCi0gICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQJCQk9IDEgPDwgWEZBX1BBQ0tFVF9Tb3VyY2VTZXQJCSwNCi0gICAgWEZBX1hEUFBBQ0tFVF9YZGMJCQkJPSAxIDw8IFhGQV9QQUNLRVRfWGRjCQkJLA0KLSAgICBYRkFfWERQUEFDS0VUX1BkZgkJCQk9IDEgPDwgWEZBX1BBQ0tFVF9QZGYJCQksDQotICAgIFhGQV9YRFBQQUNLRVRfWGZkZgkJCQk9IDEgPDwgWEZBX1BBQ0tFVF9YZmRmCQkJLA0KLSAgICBYRkFfWERQUEFDS0VUX1htcG1ldGEJCQk9IDEgPDwgWEZBX1BBQ0tFVF9YbXBtZXRhCQksDQotICAgIFhGQV9YRFBQQUNLRVRfU2lnbmF0dXJlCQkJPSAxIDw8IFhGQV9QQUNLRVRfU2lnbmF0dXJlCQksDQotICAgIFhGQV9YRFBQQUNLRVRfU3R5bGVzaGVldAkJPSAxIDw8IFhGQV9QQUNLRVRfU3R5bGVzaGVldAksDQotICAgIFhGQV9YRFBQQUNLRVRfVVNFUgkJCQk9IDEgPDwgWEZBX1BBQ0tFVF9VU0VSCQkJLA0KLSAgICBYRkFfWERQUEFDS0VUX1hEUAkJCQk9IDEgPDwgWEZBX1BBQ0tFVF9YRFAJCQksDQorICBYRkFfWERQUEFDS0VUX1VOS05PV04gPSAwLA0KKyAgWEZBX1hEUFBBQ0tFVF9Db25maWcgPSAxIDw8IFhGQV9QQUNLRVRfQ29uZmlnLA0KKyAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSA9IDEgPDwgWEZBX1BBQ0tFVF9UZW1wbGF0ZSwNCisgIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMgPSAxIDw8IFhGQV9QQUNLRVRfRGF0YXNldHMsDQorICBYRkFfWERQUEFDS0VUX0Zvcm0gPSAxIDw8IFhGQV9QQUNLRVRfRm9ybSwNCisgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0ID0gMSA8PCBYRkFfUEFDS0VUX0xvY2FsZVNldCwNCisgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCA9IDEgPDwgWEZBX1BBQ0tFVF9Db25uZWN0aW9uU2V0LA0KKyAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgPSAxIDw8IFhGQV9QQUNLRVRfU291cmNlU2V0LA0KKyAgWEZBX1hEUFBBQ0tFVF9YZGMgPSAxIDw8IFhGQV9QQUNLRVRfWGRjLA0KKyAgWEZBX1hEUFBBQ0tFVF9QZGYgPSAxIDw8IFhGQV9QQUNLRVRfUGRmLA0KKyAgWEZBX1hEUFBBQ0tFVF9YZmRmID0gMSA8PCBYRkFfUEFDS0VUX1hmZGYsDQorICBYRkFfWERQUEFDS0VUX1htcG1ldGEgPSAxIDw8IFhGQV9QQUNLRVRfWG1wbWV0YSwNCisgIFhGQV9YRFBQQUNLRVRfU2lnbmF0dXJlID0gMSA8PCBYRkFfUEFDS0VUX1NpZ25hdHVyZSwNCisgIFhGQV9YRFBQQUNLRVRfU3R5bGVzaGVldCA9IDEgPDwgWEZBX1BBQ0tFVF9TdHlsZXNoZWV0LA0KKyAgWEZBX1hEUFBBQ0tFVF9VU0VSID0gMSA8PCBYRkFfUEFDS0VUX1VTRVIsDQorICBYRkFfWERQUEFDS0VUX1hEUCA9IDEgPDwgWEZBX1BBQ0tFVF9YRFAsDQogfTsNCiBlbnVtIFhGQV9YRFBQQUNLRVRfRkxBR1Mgew0KLSAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX0NPTVBMRVRFTUFUQ0gJPQkxLA0KLSAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX1BSRUZJWE1BVENICQk9CTIsDQotICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSAkJCT0JNCwNCi0gICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FCQk9CTgsDQotICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE1BTlkJCT0JMTYsDQorICBYRkFfWERQUEFDS0VUX0ZMQUdTX0NPTVBMRVRFTUFUQ0ggPSAxLA0KKyAgWEZBX1hEUFBBQ0tFVF9GTEFHU19QUkVGSVhNQVRDSCA9IDIsDQorICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggPSA0LA0KKyAgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FID0gOCwNCisgIFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE1BTlkgPSAxNiwNCiB9Ow0KIHR5cGVkZWYgc3RydWN0IF9YRkFfUEFDS0VUSU5GTyB7DQotICAgIHVpbnQzMl90CQkJCQl1SGFzaDsNCi0gICAgY29uc3QgRlhfV0NIQVIqCQkJCQlwTmFtZTsNCi0gICAgWEZBX1hEUFBBQ0tFVAkJCQllTmFtZTsNCi0gICAgY29uc3QgRlhfV0NIQVIqCQkJCQlwVVJJOw0KLSAgICBGWF9EV09SRAkJCQkJZUZsYWdzOw0KLX0gWEZBX1BBQ0tFVElORk8sICogWEZBX0xQUEFDS0VUSU5GTzsNCi10eXBlZGVmIFhGQV9QQUNLRVRJTkZPIGNvbnN0ICogWEZBX0xQQ1BBQ0tFVElORk87DQorICB1aW50MzJfdCB1SGFzaDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsNCisgIFhGQV9YRFBQQUNLRVQgZU5hbWU7DQorICBjb25zdCBGWF9XQ0hBUiogcFVSSTsNCisgIEZYX0RXT1JEIGVGbGFnczsNCit9IFhGQV9QQUNLRVRJTkZPLCAqWEZBX0xQUEFDS0VUSU5GTzsNCit0eXBlZGVmIFhGQV9QQUNLRVRJTkZPIGNvbnN0KiBYRkFfTFBDUEFDS0VUSU5GTzsNCiBYRkFfTFBDUEFDS0VUSU5GTyBYRkFfR2V0UGFja2V0QnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsNCiBYRkFfTFBDUEFDS0VUSU5GTyBYRkFfR2V0UGFja2V0QnlJRChGWF9EV09SRCBkd1BhY2tldCk7DQogZXh0ZXJuIGNvbnN0IFhGQV9QQUNLRVRJTkZPIGdfWEZBUGFja2V0RGF0YVtdOw0KLWlubGluZSBYRkFfTFBDUEFDS0VUSU5GTyBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUIGVQYWNrZXQpDQotew0KLSAgICByZXR1cm4gZ19YRkFQYWNrZXREYXRhICsgZVBhY2tldDsNCitpbmxpbmUgWEZBX0xQQ1BBQ0tFVElORk8gWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVCBlUGFja2V0KSB7DQorICByZXR1cm4gZ19YRkFQYWNrZXREYXRhICsgZVBhY2tldDsNCiB9DQogZW51bSBYRkFfQVRUUklCVVRFRU5VTSB7DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0FzdGVyaXNrLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9TbGFzaCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQmFja3NsYXNoLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9PbiwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fVGIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1VwLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fRGVsZWdhdGUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTdWJtaXQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX05hbWUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9OZXh0LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Ob25lLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9TaG9ydEVkZ2UsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNXzFtb2QxMF8xbW9kMTEsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0hlaWdodCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3NEaWFnb25hbCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQWxsLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9BbnksDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RvUmlnaHQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX01hdGNoVGVtcGxhdGUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0RwbCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9GaXQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1dpZHRoLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTdWJtaXQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0lwbCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fRmxhdGVDb21wcmVzcywNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTWVkLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9PZGQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX09mZiwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUGRmLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Sb3csDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RvcCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fWGRwLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9YZmQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1htbCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fWmlwLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9acGwsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0V4Y2x1ZGUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRW50ZXIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1BhaXIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0ZpbHRlciwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTW92ZUxhc3QsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0V4cG9ydEFuZEltcG9ydCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUHVzaCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUG9ydHJhaXQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0RlZmF1bHQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1N0b3JlZFByb2MsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXlCT0YsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXlFT0YsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RQcmludCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fVXNDYXJyaWVyLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUHJlT3BlbiwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQWN0dWFsLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9SZXN0LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Ub3BDZW50ZXIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1N0YW5kYXJkU3ltYm9sLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Jbml0aWFsaXplLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Ob3JtYWwsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0xhbmRzY2FwZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTm9uSW50ZXJhY3RpdmUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRXhpdCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTWludXMsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0RpYWdvbmFsTGVmdCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxleFBhZ2luYXRlZCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fRG9jdW1lbnQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmcsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG8sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0JlbG93LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21MZWZ0LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21DZW50ZXIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RjcGwsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RleHQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0dyb3VwaW5nLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9TZWN1cmVTeW1ib2wsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZUV4ZWN1dGUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0RvY0Nsb3NlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9LZXlzZXQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ZlcnRpY2FsLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTYXZlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTaWduLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RvVG9wLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9WZXJpZnksDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fU29saWQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Blc3NpbWlzdGljLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9EdXBsZXhQYWdpbmF0ZWQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9SZW1lcmdlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9QZXJjZW50LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9FdmVuLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9FeGl0LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Ub29sVGlwLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUmVhZE9ubHksDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0N1cnJlbmN5LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Db25jYXQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RoYWksDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0VtYm9zc2VkLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Gb3JtZGF0YSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fR3JlZWssDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0RlY2ltYWwsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1NlbGVjdCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTG9uZ0VkZ2UsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Byb3RlY3RlZCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tUmlnaHQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1plcm8sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0ZvcndhcmRPbmx5LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Eb2NSZWFkeSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVuLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9JbmNsdWRlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9EYXNoZWQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9JbmFjdGl2ZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fRW1iZWQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXRpYywNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fT25FbnRyeSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQ3lyaWxsaWMsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX05vbkJsYW5rLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Ub3BSaWdodCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fSGVicmV3LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Ub3BMZWZ0LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX01vdmVGaXJzdCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fRGlhbW9uZCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUGFnZU9kZCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Lb3JlYW4sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Fib3ZlRW1iZWRkZWQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ppcENvbXByZXNzLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9OdW1lcmljLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9DaXJjbGUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RvQm90dG9tLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9JbnZlcnRlZCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fVXBkYXRlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Jc29uYW1lLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9TZXJ2ZXIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVDZW50ZXIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Vc2VQcmludGVyU2V0dGluZywNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fT3V0bGluZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fSW5kZXhDaGFuZ2UsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX09uY2UsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX09ubHksDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX09wZW4sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NhcHRpb24sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JhaXNlZCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUmVmQW5kRGVzY2VuZGFudHMsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Nob3J0LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9QYWdlRnJvbnQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX01vbm9zcGFjZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9QcmVQcmludCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQWx3YXlzLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Ub0xlZnQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Fib3ZlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9EYXNoRG90LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9HcmVnb3JpYW4sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JvbWFuLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZURvd24sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1N5bWJvbCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUV2ZW4sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1NpZ24sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0FkZE5ldywNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fU3RhciwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fT3B0aW1pc3RpYywNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZVJpZ2h0LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9NYWludGFpbiwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUGFja2FnZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxpZmllZENoaW5lc2UsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RvQ2VudGVyLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9CYWNrLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9VbnNwZWNpZmllZCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQmF0Y2hPcHRpbWlzdGljLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Cb2xkLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Cb3RoLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9CdXR0LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9DbGllbnQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNXzJtb2QxMCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fSW1hZ2VPbmx5LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Ib3Jpem9udGFsLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Eb3R0ZWQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1VzZXJDb250cm9sLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbFJpZ2h0LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Db25zdW1lRGF0YSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQ2hlY2ssDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGEsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Rvd24sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1NhbnNTZXJpZiwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9UcmFkaXRpb25hbENoaW5lc2UsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm4sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JlZk9ubHksDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0ludGVyYWN0aXZlRm9ybXMsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1dvcmQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Vub3JkZXJlZCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUmVxdWlyZWQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0ltcG9ydE9ubHksDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0JlbG93RW1iZWRkZWQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0phcGFuZXNlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9GdWxsLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3csDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ZpZXRuYW1lc2UsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Vhc3RFdXJvcGVhblJvbWFuLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZVVwLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9FeHBvcnRPbmx5LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9DbGVhciwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQ2xpY2ssDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQ2xvc2UsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0hvc3QsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0dsb2JhbCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQmxhbmssDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9JbXBvcnQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0N1c3RvbSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlTGVmdCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdEV4ZWN1dGUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JhZGl4LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0T3BlbiwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fRW50ZXIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0lnbm9yZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0ZhbnRhc3ksDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0l0YWxpYywNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQXV0aG9yLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Ub0VkZ2UsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Nob2ljZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzSGF0Y2gsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWYsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3REb3QsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fRHluYW1pYywNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTWFudWFsLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9FdGNoZWQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ZhbGlkYXRpb25TdGF0ZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQ3Vyc2l2ZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTGFzdCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTGVmdCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTGluaywNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTG9uZywNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fSW50ZXJuYXRpb25hbENhcnJpZXIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1BERjFfMywNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUERGMV82LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9TZXJpZiwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFNhdmUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JlYWR5LA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2lnbiwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fQXJhYmljLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9FcnJvciwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fVXJsZW5jb2RlZCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTG93ZXJlZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0FzdGVyaXNrLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU2xhc2gsDQorICBYRkFfQVRUUklCVVRFRU5VTV9CYWNrc2xhc2gsDQorICBYRkFfQVRUUklCVVRFRU5VTV9PbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RiLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVXAsDQorICBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0RlbGVnYXRlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFN1Ym1pdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX05hbWUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Dcm9zcywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX05leHQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Ob25lLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU2hvcnRFZGdlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwXzFtb2QxMSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0hlaWdodCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzRGlhZ29uYWwsDQorICBYRkFfQVRUUklCVVRFRU5VTV9BbGwsDQorICBYRkFfQVRUUklCVVRFRU5VTV9BbnksDQorICBYRkFfQVRUUklCVVRFRU5VTV9Ub1JpZ2h0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTWF0Y2hUZW1wbGF0ZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0RwbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0ludmlzaWJsZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0ZpdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1dpZHRoLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUHJlU3VibWl0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSXBsLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRmxhdGVDb21wcmVzcywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX01lZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX09kZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX09mZiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1BkZiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1JvdywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RvcCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1hkcCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1hmZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1htbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1ppcCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1pwbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9FeGNsdWRlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFbnRlciwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1BhaXIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9GaWx0ZXIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Nb3ZlTGFzdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0V4cG9ydEFuZEltcG9ydCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1B1c2gsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Qb3J0cmFpdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0RlZmF1bHQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TdG9yZWRQcm9jLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU3RheUJPRiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXlFT0YsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0UHJpbnQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Vc0NhcnJpZXIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZU9wZW4sDQorICBYRkFfQVRUUklCVVRFRU5VTV9BY3R1YWwsDQorICBYRkFfQVRUUklCVVRFRU5VTV9SZXN0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVG9wQ2VudGVyLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU3RhbmRhcmRTeW1ib2wsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Jbml0aWFsaXplLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeUFsbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX05vcm1hbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0xhbmRzY2FwZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX05vbkludGVyYWN0aXZlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFeGl0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTWludXMsDQorICBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbExlZnQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TaW1wbGV4UGFnaW5hdGVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRG9jdW1lbnQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9XYXJuaW5nLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQXV0bywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0JlbG93LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tTGVmdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUNlbnRlciwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RjcGwsDQorICBYRkFfQVRUUklCVVRFRU5VTV9UZXh0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fR3JvdXBpbmcsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TZWN1cmVTeW1ib2wsDQorICBYRkFfQVRUUklCVVRFRU5VTV9QcmVFeGVjdXRlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRG9jQ2xvc2UsDQorICBYRkFfQVRUUklCVVRFRU5VTV9LZXlzZXQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9WZXJ0aWNhbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNhdmUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTaWduLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVG9Ub3AsDQorICBYRkFfQVRUUklCVVRFRU5VTV9WZXJpZnksDQorICBYRkFfQVRUUklCVVRFRU5VTV9GaXJzdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU29saWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9QZXNzaW1pc3RpYywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0R1cGxleFBhZ2luYXRlZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUmVtZXJnZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9QZXJjZW50LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRXZlbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0V4aXQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Ub29sVGlwLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2UsDQorICBYRkFfQVRUUklCVVRFRU5VTV9SZWFkT25seSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0N1cnJlbmN5LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ29uY2F0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVGhhaSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0VtYm9zc2VkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRm9ybWRhdGEsDQorICBYRkFfQVRUUklCVVRFRU5VTV9HcmVlaywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0RlY2ltYWwsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TZWxlY3QsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Mb25nRWRnZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Byb3RlY3RlZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbVJpZ2h0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fWmVybywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0ZvcndhcmRPbmx5LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRG9jUmVhZHksDQorICBYRkFfQVRUUklCVVRFRU5VTV9IaWRkZW4sDQorICBYRkFfQVRUUklCVVRFRU5VTV9JbmNsdWRlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRGFzaGVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QsDQorICBYRkFfQVRUUklCVVRFRU5VTV9JbmFjdGl2ZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0VtYmVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU3RhdGljLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fT25FbnRyeSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0N5cmlsbGljLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTm9uQmxhbmssDQorICBYRkFfQVRUUklCVVRFRU5VTV9Ub3BSaWdodCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0hlYnJldywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RvcExlZnQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Nb3ZlRmlyc3QsDQorICBYRkFfQVRUUklCVVRFRU5VTV9EaWFtb25kLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUGFnZU9kZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNXzFtb2QxMCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0tvcmVhbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0Fib3ZlRW1iZWRkZWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9aaXBDb21wcmVzcywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX051bWVyaWMsDQorICBYRkFfQVRUUklCVVRFRU5VTV9DaXJjbGUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Ub0JvdHRvbSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0ludmVydGVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVXBkYXRlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSXNvbmFtZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1NlcnZlciwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlQ2VudGVyLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWwsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Vc2VQcmludGVyU2V0dGluZywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX091dGxpbmUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9JbmRleENoYW5nZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fT25jZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX09ubHksDQorICBYRkFfQVRUUklCVVRFRU5VTV9PcGVuLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ2FwdGlvbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1JhaXNlZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnksDQorICBYRkFfQVRUUklCVVRFRU5VTV9SZWZBbmREZXNjZW5kYW50cywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Nob3J0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUZyb250LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTW9ub3NwYWNlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUHJlUHJpbnQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9BbHdheXMsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVG9MZWZ0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQWJvdmUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9EYXNoRG90LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fR3JlZ29yaWFuLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUm9tYW4sDQorICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZURvd24sDQorICBYRkFfQVRUUklCVVRFRU5VTV9TeW1ib2wsDQorICBYRkFfQVRUUklCVVRFRU5VTV9QYWdlRXZlbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1NpZ24sDQorICBYRkFfQVRUUklCVVRFRU5VTV9BZGROZXcsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TdGFyLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fT3B0aW1pc3RpYywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlUmlnaHQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9NYWludGFpbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1BhY2thZ2UsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TaW1wbGlmaWVkQ2hpbmVzZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RvQ2VudGVyLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQmFjaywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Vuc3BlY2lmaWVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQmF0Y2hPcHRpbWlzdGljLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQm9sZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0JvdGgsDQorICBYRkFfQVRUUklCVVRFRU5VTV9CdXR0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ2xpZW50LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fMm1vZDEwLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSW1hZ2VPbmx5LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSG9yaXpvbnRhbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0RvdHRlZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1VzZXJDb250cm9sLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRGlhZ29uYWxSaWdodCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnN1bWVEYXRhLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ2hlY2ssDQorICBYRkFfQVRUUklCVVRFRU5VTV9EYXRhLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRG93biwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1NhbnNTZXJpZiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RyYWRpdGlvbmFsQ2hpbmVzZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm4sDQorICBYRkFfQVRUUklCVVRFRU5VTV9SZWZPbmx5LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSW50ZXJhY3RpdmVGb3JtcywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1dvcmQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Vbm9yZGVyZWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9SZXF1aXJlZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0ltcG9ydE9ubHksDQorICBYRkFfQVRUUklCVVRFRU5VTV9CZWxvd0VtYmVkZGVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSmFwYW5lc2UsDQorICBYRkFfQVRUUklCVVRFRU5VTV9GdWxsLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUmxfcm93LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVmlldG5hbWVzZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0Vhc3RFdXJvcGVhblJvbWFuLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VVcCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0V4cG9ydE9ubHksDQorICBYRkFfQVRUUklCVVRFRU5VTV9DbGVhciwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQmFzZTY0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ2xvc2UsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Ib3N0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fR2xvYmFsLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQmxhbmssDQorICBYRkFfQVRUUklCVVRFRU5VTV9UYWJsZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0ltcG9ydCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0N1c3RvbSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUxlZnQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0RXhlY3V0ZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1JhZGl4LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdE9wZW4sDQorICBYRkFfQVRUUklCVVRFRU5VTV9FbnRlciwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0lnbm9yZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0xyX3RiLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRmFudGFzeSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0l0YWxpYywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0F1dGhvciwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RvRWRnZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0Nob2ljZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3NIYXRjaCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWYsDQorICBYRkFfQVRUUklCVVRFRU5VTV9EYXNoRG90RG90LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRHluYW1pYywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX01hbnVhbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0V0Y2hlZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1ZhbGlkYXRpb25TdGF0ZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0N1cnNpdmUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9MYXN0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTGVmdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0xpbmssDQorICBYRkFfQVRUUklCVVRFRU5VTV9Mb25nLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSW50ZXJuYXRpb25hbENhcnJpZXIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9QREYxXzMsDQorICBYRkFfQVRUUklCVVRFRU5VTV9QREYxXzYsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TZXJpZiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTYXZlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUmVhZHksDQorICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2lnbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0FyYWJpYywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVXJsZW5jb2RlZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0xvd2VyZWQsDQogfTsNCiBlbnVtIFhGQV9BVFRSSUJVVEUgew0KLSAgICBYRkFfQVRUUklCVVRFX0gsDQotICAgIFhGQV9BVFRSSUJVVEVfVywNCi0gICAgWEZBX0FUVFJJQlVURV9YLA0KLSAgICBYRkFfQVRUUklCVVRFX1ksDQotICAgIFhGQV9BVFRSSUJVVEVfSWQsDQotICAgIFhGQV9BVFRSSUJVVEVfVG8sDQotICAgIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2gsDQotICAgIFhGQV9BVFRSSUJVVEVfSEFsaWduLA0KLSAgICBYRkFfQVRUUklCVVRFX1R5cGVmYWNlLA0KLSAgICBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCwNCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KLSAgICBYRkFfQVRUUklCVVRFX05leHQsDQotICAgIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LA0KLSAgICBYRkFfQVRUUklCVVRFX0JyZWFrLA0KLSAgICBYRkFfQVRUUklCVVRFX1ZTY3JvbGxQb2xpY3ksDQotICAgIFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwNCi0gICAgWEZBX0FUVFJJQlVURV9UZXh0SW5kZW50LA0KLSAgICBYRkFfQVRUUklCVVRFX0NvbnRleHQsDQotICAgIFhGQV9BVFRSSUJVVEVfVHJheU91dCwNCi0gICAgWEZBX0FUVFJJQlVURV9DYXAsDQotICAgIFhGQV9BVFRSSUJVVEVfTWF4LA0KLSAgICBYRkFfQVRUUklCVVRFX01pbiwNCi0gICAgWEZBX0FUVFJJQlVURV9SZWYsDQotICAgIFhGQV9BVFRSSUJVVEVfUmlkLA0KLSAgICBYRkFfQVRUUklCVVRFX1VybCwNCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsDQotICAgIFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LA0KLSAgICBYRkFfQVRUUklCVVRFX1dpZG93cywNCi0gICAgWEZBX0FUVFJJQlVURV9MZXZlbCwNCi0gICAgWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCwNCi0gICAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwNCi0gICAgWEZBX0FUVFJJQlVURV9BbGxvd01hY3JvLA0KLSAgICBYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbiwNCi0gICAgWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsDQotICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dMZWFkZXIsDQotICAgIFhGQV9BVFRSSUJVVEVfQWN0aW9uLA0KLSAgICBYRkFfQVRUUklCVVRFX05vblJlcHVkaWF0aW9uLA0KLSAgICBYRkFfQVRUUklCVVRFX1JhdGUsDQotICAgIFhGQV9BVFRSSUJVVEVfQWxsb3dSaWNoVGV4dCwNCi0gICAgWEZBX0FUVFJJQlVURV9Sb2xlLA0KLSAgICBYRkFfQVRUUklCVVRFX092ZXJmbG93VHJhaWxlciwNCi0gICAgWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sDQotICAgIFhGQV9BVFRSSUJVVEVfVGltZW91dCwNCi0gICAgWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwNCi0gICAgWEZBX0FUVFJJQlVURV9BY2Nlc3MsDQotICAgIFhGQV9BVFRSSUJVVEVfQ29tbWFuZFR5cGUsDQotICAgIFhGQV9BVFRSSUJVVEVfRm9ybWF0LA0KLSAgICBYRkFfQVRUUklCVVRFX0RhdGFQcmVwLA0KLSAgICBYRkFfQVRUUklCVVRFX1dpZGdldERhdGEsDQotICAgIFhGQV9BVFRSSUJVVEVfQWJiciwNCi0gICAgWEZBX0FUVFJJQlVURV9NYXJnaW5SaWdodCwNCi0gICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sDQotICAgIFhGQV9BVFRSSUJVVEVfRW5jaXBoZXJPbmx5LA0KLSAgICBYRkFfQVRUUklCVVRFX0tlcm5pbmdNb2RlLA0KLSAgICBYRkFfQVRUUklCVVRFX1JvdGF0ZSwNCi0gICAgWEZBX0FUVFJJQlVURV9Xb3JkQ2hhcmFjdGVyQ291bnQsDQotICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwNCi0gICAgWEZBX0FUVFJJQlVURV9SZXNlcnZlLA0KLSAgICBYRkFfQVRUUklCVVRFX1RleHRMb2NhdGlvbiwNCi0gICAgWEZBX0FUVFJJQlVURV9Qcmlvcml0eSwNCi0gICAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmUsDQotICAgIFhGQV9BVFRSSUJVVEVfTW9kdWxlV2lkdGgsDQotICAgIFhGQV9BVFRSSUJVVEVfSHlwaGVuYXRlLA0KLSAgICBYRkFfQVRUUklCVVRFX0xpc3RlbiwNCi0gICAgWEZBX0FUVFJJQlVURV9EZWxpbWl0ZXIsDQotICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsDQotICAgIFhGQV9BVFRSSUJVVEVfU3RhcnROZXcsDQotICAgIFhGQV9BVFRSSUJVVEVfRW9mQWN0aW9uLA0KLSAgICBYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCwNCi0gICAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLA0KLSAgICBYRkFfQVRUUklCVVRFX0Jhc2VsaW5lU2hpZnQsDQotICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmVQZXJpb2QsDQotICAgIFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywNCi0gICAgWEZBX0FUVFJJQlVURV9PcmllbnRhdGlvbiwNCi0gICAgWEZBX0FUVFJJQlVURV9UaW1lU3RhbXAsDQotICAgIFhGQV9BVFRSSUJVVEVfUHJpbnRDaGVja0RpZ2l0LA0KLSAgICBYRkFfQVRUUklCVVRFX01hcmdpbkxlZnQsDQotICAgIFhGQV9BVFRSSUJVVEVfU3Ryb2tlLA0KLSAgICBYRkFfQVRUUklCVVRFX01vZHVsZUhlaWdodCwNCi0gICAgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzYWdlLA0KLSAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLA0KLSAgICBYRkFfQVRUUklCVVRFX1JhZGl4T2Zmc2V0LA0KLSAgICBYRkFfQVRUUklCVVRFX1ByZXNlcnZlLA0KLSAgICBYRkFfQVRUUklCVVRFX0FsaWFzTm9kZSwNCi0gICAgWEZBX0FUVFJJQlVURV9NdWx0aUxpbmUsDQotICAgIFhGQV9BVFRSSUJVVEVfVmVyc2lvbiwNCi0gICAgWEZBX0FUVFJJQlVURV9TdGFydENoYXIsDQotICAgIFhGQV9BVFRSSUJVVEVfU2NyaXB0VGVzdCwNCi0gICAgWEZBX0FUVFJJQlVURV9TdGFydEFuZ2xlLA0KLSAgICBYRkFfQVRUUklCVVRFX0N1cnNvclR5cGUsDQotICAgIFhGQV9BVFRSSUJVVEVfRGlnaXRhbFNpZ25hdHVyZSwNCi0gICAgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwNCi0gICAgWEZBX0FUVFJJQlVURV9PdXRwdXQsDQotICAgIFhGQV9BVFRSSUJVVEVfQm9va2VuZFRyYWlsZXIsDQotICAgIFhGQV9BVFRSSUJVVEVfSW1hZ2luZ0JCb3gsDQotICAgIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUluaXRpYWxDYXAsDQotICAgIFhGQV9BVFRSSUJVVEVfRm9yY2UsDQotICAgIFhGQV9BVFRSSUJVVEVfQ3JsU2lnbiwNCi0gICAgWEZBX0FUVFJJQlVURV9QcmV2aW91cywNCi0gICAgWEZBX0FUVFJJQlVURV9QdXNoQ2hhcmFjdGVyQ291bnQsDQotICAgIFhGQV9BVFRSSUJVVEVfTnVsbFRlc3QsDQotICAgIFhGQV9BVFRSSUJVVEVfUnVuQXQsDQotICAgIFhGQV9BVFRSSUJVVEVfU3BhY2VCZWxvdywNCi0gICAgWEZBX0FUVFJJQlVURV9Td2VlcEFuZ2xlLA0KLSAgICBYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsDQotICAgIFhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywNCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrVHlwZSwNCi0gICAgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsDQotICAgIFhGQV9BVFRSSUJVVEVfVkFsaWduLA0KLSAgICBYRkFfQVRUUklCVVRFX1NvdXJjZUJlbG93LA0KLSAgICBYRkFfQVRUUklCVVRFX0ludmVydGVkLA0KLSAgICBYRkFfQVRUUklCVVRFX01hcmssDQotICAgIFhGQV9BVFRSSUJVVEVfTWF4SCwNCi0gICAgWEZBX0FUVFJJQlVURV9NYXhXLA0KLSAgICBYRkFfQVRUUklCVVRFX1RydW5jYXRlLA0KLSAgICBYRkFfQVRUUklCVVRFX01pbkgsDQotICAgIFhGQV9BVFRSSUJVVEVfTWluVywNCi0gICAgWEZBX0FUVFJJQlVURV9Jbml0aWFsLA0KLSAgICBYRkFfQVRUUklCVVRFX01vZGUsDQotICAgIFhGQV9BVFRSSUJVVEVfTGF5b3V0LA0KLSAgICBYRkFfQVRUUklCVVRFX1NlcnZlciwNCi0gICAgWEZBX0FUVFJJQlVURV9FbWJlZFBERiwNCi0gICAgWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sDQotICAgIFhGQV9BVFRSSUJVVEVfVGFiRGVmYXVsdCwNCi0gICAgWEZBX0FUVFJJQlVURV9Db250YWlucywNCi0gICAgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LA0KLSAgICBYRkFfQVRUUklCVVRFX01heENoYXJzLA0KLSAgICBYRkFfQVRUUklCVVRFX09wZW4sDQotICAgIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sDQotICAgIFhGQV9BVFRSSUJVVEVfV2lkZU5hcnJvd1JhdGlvLA0KLSAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LA0KLSAgICBYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsDQotICAgIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2hQZXJpb2QsDQotICAgIFhGQV9BVFRSSUJVVEVfU2hhcGUsDQotICAgIFhGQV9BVFRSSUJVVEVfVGFiU3RvcHMsDQotICAgIFhGQV9BVFRSSUJVVEVfT3V0cHV0QmVsb3csDQotICAgIFhGQV9BVFRSSUJVVEVfU2hvcnQsDQotICAgIFhGQV9BVFRSSUJVVEVfRm9udFZlcnRpY2FsU2NhbGUsDQotICAgIFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLA0KLSAgICBYRkFfQVRUUklCVVRFX0NvbW1pdE9uLA0KLSAgICBYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LA0KLSAgICBYRkFfQVRUUklCVVRFX0tleUFncmVlbWVudCwNCi0gICAgWEZBX0FUVFJJQlVURV9FcnJvckNvcnJlY3Rpb25MZXZlbCwNCi0gICAgWEZBX0FUVFJJQlVURV9VcHNNb2RlLA0KLSAgICBYRkFfQVRUUklCVVRFX01lcmdlTW9kZSwNCi0gICAgWEZBX0FUVFJJQlVURV9DaXJjdWxhciwNCi0gICAgWEZBX0FUVFJJQlVURV9Qc05hbWUsDQotICAgIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwNCi0gICAgWEZBX0FUVFJJQlVURV9Vbmljb2RlUmFuZ2UsDQotICAgIFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUsDQotICAgIFhGQV9BVFRSSUJVVEVfRHVwbGV4SW1wb3NpdGlvbiwNCi0gICAgWEZBX0FUVFJJQlVURV9UcmF5SW4sDQotICAgIFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsDQotICAgIFhGQV9BVFRSSUJVVEVfQm9mQWN0aW9uLA0KLSAgICBYRkFfQVRUUklCVVRFX1NhdmUsDQotICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0VHlwZSwNCi0gICAgWEZBX0FUVFJJQlVURV9LZXlFbmNpcGhlcm1lbnQsDQotICAgIFhGQV9BVFRSSUJVVEVfQ3JlZGVudGlhbFNlcnZlclBvbGljeSwNCi0gICAgWEZBX0FUVFJJQlVURV9TaXplLA0KLSAgICBYRkFfQVRUUklCVVRFX0luaXRpYWxOdW1iZXIsDQotICAgIFhGQV9BVFRSSUJVVEVfU2xvcGUsDQotICAgIFhGQV9BVFRSSUJVVEVfQ1NwYWNlLA0KLSAgICBYRkFfQVRUUklCVVRFX0NvbFNwYW4sDQotICAgIFhGQV9BVFRSSUJVVEVfQmluZGluZywNCi0gICAgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwNCi0gICAgWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsDQotICAgIFhGQV9BVFRSSUJVVEVfQmluZCwNCi0gICAgWEZBX0FUVFJJQlVURV9UZXh0RW50cnksDQotICAgIFhGQV9BVFRSSUJVVEVfQXJjaGl2ZSwNCi0gICAgWEZBX0FUVFJJQlVURV9VdWlkLA0KLSAgICBYRkFfQVRUUklCVVRFX1Bvc3R1cmUsDQotICAgIFhGQV9BVFRSSUJVVEVfQWZ0ZXIsDQotICAgIFhGQV9BVFRSSUJVVEVfT3JwaGFucywNCi0gICAgWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQotICAgIFhGQV9BVFRSSUJVVEVfTG9jYWxlLA0KLSAgICBYRkFfQVRUUklCVVRFX1dlaWdodCwNCi0gICAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsDQotICAgIFhGQV9BVFRSSUJVVEVfRGF0YSwNCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KLSAgICBYRkFfQVRUUklCVVRFX051bWJlcmVkLA0KLSAgICBYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwNCi0gICAgWEZBX0FUVFJJQlVURV9PdmVybGluZSwNCi0gICAgWEZBX0FUVFJJQlVURV9VcmxQb2xpY3ksDQotICAgIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwNCi0gICAgWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwNCi0gICAgWEZBX0FUVFJJQlVURV9Cb29rZW5kTGVhZGVyLA0KLSAgICBYRkFfQVRUUklCVVRFX01heExlbmd0aCwNCi0gICAgWEZBX0FUVFJJQlVURV9BY2Nlc3NLZXksDQotICAgIFhGQV9BVFRSSUJVVEVfQ3Vyc29yTG9jYXRpb24sDQotICAgIFhGQV9BVFRSSUJVVEVfRGVsYXllZE9wZW4sDQotICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LA0KLSAgICBYRkFfQVRUUklCVVRFX0RhdGFFbmNpcGhlcm1lbnQsDQotICAgIFhGQV9BVFRSSUJVVEVfQWZ0ZXJUYXJnZXQsDQotICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLA0KLSAgICBYRkFfQVRUUklCVVRFX1BpY2tlciwNCi0gICAgWEZBX0FUVFJJQlVURV9Gcm9tLA0KLSAgICBYRkFfQVRUUklCVVRFX0Jhc2VQcm9maWxlLA0KLSAgICBYRkFfQVRUUklCVVRFX0FzcGVjdCwNCi0gICAgWEZBX0FUVFJJQlVURV9Sb3dDb2x1bW5SYXRpbywNCi0gICAgWEZBX0FUVFJJQlVURV9MaW5lSGVpZ2h0LA0KLSAgICBYRkFfQVRUUklCVVRFX0hpZ2hsaWdodCwNCi0gICAgWEZBX0FUVFJJQlVURV9WYWx1ZVJlZiwNCi0gICAgWEZBX0FUVFJJQlVURV9NYXhFbnRyaWVzLA0KLSAgICBYRkFfQVRUUklCVVRFX0RhdGFMZW5ndGgsDQotICAgIFhGQV9BVFRSSUJVVEVfQWN0aXZpdHksDQotICAgIFhGQV9BVFRSSUJVVEVfSW5wdXQsDQotICAgIFhGQV9BVFRSSUJVVEVfVmFsdWUsDQotICAgIFhGQV9BVFRSSUJVVEVfQmxhbmtPck5vdEJsYW5rLA0KLSAgICBYRkFfQVRUUklCVVRFX0FkZFJldm9jYXRpb25JbmZvLA0KLSAgICBYRkFfQVRUUklCVVRFX0dlbmVyaWNGYW1pbHksDQotICAgIFhGQV9BVFRSSUJVVEVfSGFuZCwNCi0gICAgWEZBX0FUVFJJQlVURV9IcmVmLA0KLSAgICBYRkFfQVRUUklCVVRFX1RleHRFbmNvZGluZywNCi0gICAgWEZBX0FUVFJJQlVURV9MZWFkRGlnaXRzLA0KLSAgICBYRkFfQVRUUklCVVRFX1Blcm1pc3Npb25zLA0KLSAgICBYRkFfQVRUUklCVVRFX1NwYWNlQWJvdmUsDQotICAgIFhGQV9BVFRSSUJVVEVfQ29kZUJhc2UsDQotICAgIFhGQV9BVFRSSUJVVEVfU3RvY2ssDQotICAgIFhGQV9BVFRSSUJVVEVfSXNOdWxsLA0KLSAgICBYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSwNCi0gICAgWEZBX0FUVFJJQlVURV9FeGNsdWRlQWxsQ2FwcywNCi0gICAgWEZBX0FUVFJJQlVURV9Gb3JtYXRUZXN0LA0KLSAgICBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksDQotICAgIFhGQV9BVFRSSUJVVEVfSm9pbiwNCi0gICAgWEZBX0FUVFJJQlVURV9LZXlDZXJ0U2lnbiwNCi0gICAgWEZBX0FUVFJJQlVURV9SYWRpdXMsDQotICAgIFhGQV9BVFRSSUJVVEVfU291cmNlQWJvdmUsDQotICAgIFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsDQotICAgIFhGQV9BVFRSSUJVVEVfQ2xhc3NJZCwNCi0gICAgWEZBX0FUVFJJQlVURV9EaXNhYmxlLA0KLSAgICBYRkFfQVRUUklCVVRFX1Njb3BlLA0KLSAgICBYRkFfQVRUUklCVVRFX01hdGNoLA0KLSAgICBYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwNCi0gICAgWEZBX0FUVFJJQlVURV9CZWZvcmUsDQotICAgIFhGQV9BVFRSSUJVVEVfV3JpdGluZ1NjcmlwdCwNCi0gICAgWEZBX0FUVFJJQlVURV9FbmRDaGFyLA0KLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQotICAgIFhGQV9BVFRSSUJVVEVfTG9uZywNCi0gICAgWEZBX0FUVFJJQlVURV9JbnRhY3QsDQotICAgIFhGQV9BVFRSSUJVVEVfWGRwQ29udGVudCwNCi0gICAgWEZBX0FUVFJJQlVURV9EZWNpcGhlck9ubHksDQorICBYRkFfQVRUUklCVVRFX0gsDQorICBYRkFfQVRUUklCVVRFX1csDQorICBYRkFfQVRUUklCVVRFX1gsDQorICBYRkFfQVRUUklCVVRFX1ksDQorICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgWEZBX0FUVFJJQlVURV9UbywNCisgIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2gsDQorICBYRkFfQVRUUklCVVRFX0hBbGlnbiwNCisgIFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsDQorICBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCwNCisgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgIFhGQV9BVFRSSUJVVEVfTmV4dCwNCisgIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LA0KKyAgWEZBX0FUVFJJQlVURV9CcmVhaywNCisgIFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSwNCisgIFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwNCisgIFhGQV9BVFRSSUJVVEVfVGV4dEluZGVudCwNCisgIFhGQV9BVFRSSUJVVEVfQ29udGV4dCwNCisgIFhGQV9BVFRSSUJVVEVfVHJheU91dCwNCisgIFhGQV9BVFRSSUJVVEVfQ2FwLA0KKyAgWEZBX0FUVFJJQlVURV9NYXgsDQorICBYRkFfQVRUUklCVVRFX01pbiwNCisgIFhGQV9BVFRSSUJVVEVfUmVmLA0KKyAgWEZBX0FUVFJJQlVURV9SaWQsDQorICBYRkFfQVRUUklCVVRFX1VybCwNCisgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsDQorICBYRkFfQVRUUklCVVRFX1dpZG93cywNCisgIFhGQV9BVFRSSUJVVEVfTGV2ZWwsDQorICBYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LA0KKyAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwNCisgIFhGQV9BVFRSSUJVVEVfQWxsb3dNYWNybywNCisgIFhGQV9BVFRSSUJVVEVfUGFnZVBvc2l0aW9uLA0KKyAgWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsDQorICBYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLA0KKyAgWEZBX0FUVFJJQlVURV9BY3Rpb24sDQorICBYRkFfQVRUUklCVVRFX05vblJlcHVkaWF0aW9uLA0KKyAgWEZBX0FUVFJJQlVURV9SYXRlLA0KKyAgWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LA0KKyAgWEZBX0FUVFJJQlVURV9Sb2xlLA0KKyAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsDQorICBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwNCisgIFhGQV9BVFRSSUJVVEVfVGltZW91dCwNCisgIFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsDQorICBYRkFfQVRUUklCVVRFX0FjY2VzcywNCisgIFhGQV9BVFRSSUJVVEVfQ29tbWFuZFR5cGUsDQorICBYRkFfQVRUUklCVVRFX0Zvcm1hdCwNCisgIFhGQV9BVFRSSUJVVEVfRGF0YVByZXAsDQorICBYRkFfQVRUUklCVVRFX1dpZGdldERhdGEsDQorICBYRkFfQVRUUklCVVRFX0FiYnIsDQorICBYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LA0KKyAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sDQorICBYRkFfQVRUUklCVVRFX0VuY2lwaGVyT25seSwNCisgIFhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsDQorICBYRkFfQVRUUklCVVRFX1JvdGF0ZSwNCisgIFhGQV9BVFRSSUJVVEVfV29yZENoYXJhY3RlckNvdW50LA0KKyAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgWEZBX0FUVFJJQlVURV9SZXNlcnZlLA0KKyAgWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sDQorICBYRkFfQVRUUklCVVRFX1ByaW9yaXR5LA0KKyAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmUsDQorICBYRkFfQVRUUklCVVRFX01vZHVsZVdpZHRoLA0KKyAgWEZBX0FUVFJJQlVURV9IeXBoZW5hdGUsDQorICBYRkFfQVRUUklCVVRFX0xpc3RlbiwNCisgIFhGQV9BVFRSSUJVVEVfRGVsaW1pdGVyLA0KKyAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwNCisgIFhGQV9BVFRSSUJVVEVfU3RhcnROZXcsDQorICBYRkFfQVRUUklCVVRFX0VvZkFjdGlvbiwNCisgIFhGQV9BVFRSSUJVVEVfQWxsb3dOZXV0cmFsLA0KKyAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLA0KKyAgWEZBX0FUVFJJQlVURV9CYXNlbGluZVNoaWZ0LA0KKyAgWEZBX0FUVFJJQlVURV9PdmVybGluZVBlcmlvZCwNCisgIFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywNCisgIFhGQV9BVFRSSUJVVEVfT3JpZW50YXRpb24sDQorICBYRkFfQVRUUklCVVRFX1RpbWVTdGFtcCwNCisgIFhGQV9BVFRSSUJVVEVfUHJpbnRDaGVja0RpZ2l0LA0KKyAgWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LA0KKyAgWEZBX0FUVFJJQlVURV9TdHJva2UsDQorICBYRkFfQVRUUklCVVRFX01vZHVsZUhlaWdodCwNCisgIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywNCisgIFhGQV9BVFRSSUJVVEVfVXNhZ2UsDQorICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLA0KKyAgWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwNCisgIFhGQV9BVFRSSUJVVEVfUHJlc2VydmUsDQorICBYRkFfQVRUUklCVVRFX0FsaWFzTm9kZSwNCisgIFhGQV9BVFRSSUJVVEVfTXVsdGlMaW5lLA0KKyAgWEZBX0FUVFJJQlVURV9WZXJzaW9uLA0KKyAgWEZBX0FUVFJJQlVURV9TdGFydENoYXIsDQorICBYRkFfQVRUUklCVVRFX1NjcmlwdFRlc3QsDQorICBYRkFfQVRUUklCVVRFX1N0YXJ0QW5nbGUsDQorICBYRkFfQVRUUklCVVRFX0N1cnNvclR5cGUsDQorICBYRkFfQVRUUklCVVRFX0RpZ2l0YWxTaWduYXR1cmUsDQorICBYRkFfQVRUUklCVVRFX0NvZGVUeXBlLA0KKyAgWEZBX0FUVFJJQlVURV9PdXRwdXQsDQorICBYRkFfQVRUUklCVVRFX0Jvb2tlbmRUcmFpbGVyLA0KKyAgWEZBX0FUVFJJQlVURV9JbWFnaW5nQkJveCwNCisgIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUluaXRpYWxDYXAsDQorICBYRkFfQVRUUklCVVRFX0ZvcmNlLA0KKyAgWEZBX0FUVFJJQlVURV9DcmxTaWduLA0KKyAgWEZBX0FUVFJJQlVURV9QcmV2aW91cywNCisgIFhGQV9BVFRSSUJVVEVfUHVzaENoYXJhY3RlckNvdW50LA0KKyAgWEZBX0FUVFJJQlVURV9OdWxsVGVzdCwNCisgIFhGQV9BVFRSSUJVVEVfUnVuQXQsDQorICBYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csDQorICBYRkFfQVRUUklCVVRFX1N3ZWVwQW5nbGUsDQorICBYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsDQorICBYRkFfQVRUUklCVVRFX0xldHRlclNwYWNpbmcsDQorICBYRkFfQVRUUklCVVRFX0xvY2tUeXBlLA0KKyAgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsDQorICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwNCisgIFhGQV9BVFRSSUJVVEVfU291cmNlQmVsb3csDQorICBYRkFfQVRUUklCVVRFX0ludmVydGVkLA0KKyAgWEZBX0FUVFJJQlVURV9NYXJrLA0KKyAgWEZBX0FUVFJJQlVURV9NYXhILA0KKyAgWEZBX0FUVFJJQlVURV9NYXhXLA0KKyAgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwNCisgIFhGQV9BVFRSSUJVVEVfTWluSCwNCisgIFhGQV9BVFRSSUJVVEVfTWluVywNCisgIFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwNCisgIFhGQV9BVFRSSUJVVEVfTW9kZSwNCisgIFhGQV9BVFRSSUJVVEVfTGF5b3V0LA0KKyAgWEZBX0FUVFJJQlVURV9TZXJ2ZXIsDQorICBYRkFfQVRUUklCVVRFX0VtYmVkUERGLA0KKyAgWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sDQorICBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsDQorICBYRkFfQVRUUklCVVRFX0NvbnRhaW5zLA0KKyAgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LA0KKyAgWEZBX0FUVFJJQlVURV9NYXhDaGFycywNCisgIFhGQV9BVFRSSUJVVEVfT3BlbiwNCisgIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sDQorICBYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywNCisgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICBYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsDQorICBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoUGVyaW9kLA0KKyAgWEZBX0FUVFJJQlVURV9TaGFwZSwNCisgIFhGQV9BVFRSSUJVVEVfVGFiU3RvcHMsDQorICBYRkFfQVRUUklCVVRFX091dHB1dEJlbG93LA0KKyAgWEZBX0FUVFJJQlVURV9TaG9ydCwNCisgIFhGQV9BVFRSSUJVVEVfRm9udFZlcnRpY2FsU2NhbGUsDQorICBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywNCisgIFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sDQorICBYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LA0KKyAgWEZBX0FUVFJJQlVURV9LZXlBZ3JlZW1lbnQsDQorICBYRkFfQVRUUklCVVRFX0Vycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgWEZBX0FUVFJJQlVURV9VcHNNb2RlLA0KKyAgWEZBX0FUVFJJQlVURV9NZXJnZU1vZGUsDQorICBYRkFfQVRUUklCVVRFX0NpcmN1bGFyLA0KKyAgWEZBX0FUVFJJQlVURV9Qc05hbWUsDQorICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsDQorICBYRkFfQVRUUklCVVRFX1VuaWNvZGVSYW5nZSwNCisgIFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUsDQorICBYRkFfQVRUUklCVVRFX0R1cGxleEltcG9zaXRpb24sDQorICBYRkFfQVRUUklCVVRFX1RyYXlJbiwNCisgIFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsDQorICBYRkFfQVRUUklCVVRFX0JvZkFjdGlvbiwNCisgIFhGQV9BVFRSSUJVVEVfU2F2ZSwNCisgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0VHlwZSwNCisgIFhGQV9BVFRSSUJVVEVfS2V5RW5jaXBoZXJtZW50LA0KKyAgWEZBX0FUVFJJQlVURV9DcmVkZW50aWFsU2VydmVyUG9saWN5LA0KKyAgWEZBX0FUVFJJQlVURV9TaXplLA0KKyAgWEZBX0FUVFJJQlVURV9Jbml0aWFsTnVtYmVyLA0KKyAgWEZBX0FUVFJJQlVURV9TbG9wZSwNCisgIFhGQV9BVFRSSUJVVEVfQ1NwYWNlLA0KKyAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLA0KKyAgWEZBX0FUVFJJQlVURV9CaW5kaW5nLA0KKyAgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwNCisgIFhGQV9BVFRSSUJVVEVfQ2hhckVuY29kaW5nLA0KKyAgWEZBX0FUVFJJQlVURV9CaW5kLA0KKyAgWEZBX0FUVFJJQlVURV9UZXh0RW50cnksDQorICBYRkFfQVRUUklCVVRFX0FyY2hpdmUsDQorICBYRkFfQVRUUklCVVRFX1V1aWQsDQorICBYRkFfQVRUUklCVVRFX1Bvc3R1cmUsDQorICBYRkFfQVRUUklCVVRFX0FmdGVyLA0KKyAgWEZBX0FUVFJJQlVURV9PcnBoYW5zLA0KKyAgWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lLA0KKyAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgWEZBX0FUVFJJQlVURV9Mb2NhbGUsDQorICBYRkFfQVRUUklCVVRFX1dlaWdodCwNCisgIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lUGVyaW9kLA0KKyAgWEZBX0FUVFJJQlVURV9EYXRhLA0KKyAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgWEZBX0FUVFJJQlVURV9OdW1iZXJlZCwNCisgIFhGQV9BVFRSSUJVVEVfRGF0YUNvbHVtbkNvdW50LA0KKyAgWEZBX0FUVFJJQlVURV9PdmVybGluZSwNCisgIFhGQV9BVFRSSUJVVEVfVXJsUG9saWN5LA0KKyAgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLA0KKyAgWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwNCisgIFhGQV9BVFRSSUJVVEVfQm9va2VuZExlYWRlciwNCisgIFhGQV9BVFRSSUJVVEVfTWF4TGVuZ3RoLA0KKyAgWEZBX0FUVFJJQlVURV9BY2Nlc3NLZXksDQorICBYRkFfQVRUUklCVVRFX0N1cnNvckxvY2F0aW9uLA0KKyAgWEZBX0FUVFJJQlVURV9EZWxheWVkT3BlbiwNCisgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LA0KKyAgWEZBX0FUVFJJQlVURV9EYXRhRW5jaXBoZXJtZW50LA0KKyAgWEZBX0FUVFJJQlVURV9BZnRlclRhcmdldCwNCisgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLA0KKyAgWEZBX0FUVFJJQlVURV9QaWNrZXIsDQorICBYRkFfQVRUUklCVVRFX0Zyb20sDQorICBYRkFfQVRUUklCVVRFX0Jhc2VQcm9maWxlLA0KKyAgWEZBX0FUVFJJQlVURV9Bc3BlY3QsDQorICBYRkFfQVRUUklCVVRFX1Jvd0NvbHVtblJhdGlvLA0KKyAgWEZBX0FUVFJJQlVURV9MaW5lSGVpZ2h0LA0KKyAgWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsDQorICBYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLA0KKyAgWEZBX0FUVFJJQlVURV9NYXhFbnRyaWVzLA0KKyAgWEZBX0FUVFJJQlVURV9EYXRhTGVuZ3RoLA0KKyAgWEZBX0FUVFJJQlVURV9BY3Rpdml0eSwNCisgIFhGQV9BVFRSSUJVVEVfSW5wdXQsDQorICBYRkFfQVRUUklCVVRFX1ZhbHVlLA0KKyAgWEZBX0FUVFJJQlVURV9CbGFua09yTm90QmxhbmssDQorICBYRkFfQVRUUklCVVRFX0FkZFJldm9jYXRpb25JbmZvLA0KKyAgWEZBX0FUVFJJQlVURV9HZW5lcmljRmFtaWx5LA0KKyAgWEZBX0FUVFJJQlVURV9IYW5kLA0KKyAgWEZBX0FUVFJJQlVURV9IcmVmLA0KKyAgWEZBX0FUVFJJQlVURV9UZXh0RW5jb2RpbmcsDQorICBYRkFfQVRUUklCVVRFX0xlYWREaWdpdHMsDQorICBYRkFfQVRUUklCVVRFX1Blcm1pc3Npb25zLA0KKyAgWEZBX0FUVFJJQlVURV9TcGFjZUFib3ZlLA0KKyAgWEZBX0FUVFJJQlVURV9Db2RlQmFzZSwNCisgIFhGQV9BVFRSSUJVVEVfU3RvY2ssDQorICBYRkFfQVRUUklCVVRFX0lzTnVsbCwNCisgIFhGQV9BVFRSSUJVVEVfUmVzdG9yZVN0YXRlLA0KKyAgWEZBX0FUVFJJQlVURV9FeGNsdWRlQWxsQ2FwcywNCisgIFhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwNCisgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwNCisgIFhGQV9BVFRSSUJVVEVfSm9pbiwNCisgIFhGQV9BVFRSSUJVVEVfS2V5Q2VydFNpZ24sDQorICBYRkFfQVRUUklCVVRFX1JhZGl1cywNCisgIFhGQV9BVFRSSUJVVEVfU291cmNlQWJvdmUsDQorICBYRkFfQVRUUklCVVRFX092ZXJyaWRlLA0KKyAgWEZBX0FUVFJJQlVURV9DbGFzc0lkLA0KKyAgWEZBX0FUVFJJQlVURV9EaXNhYmxlLA0KKyAgWEZBX0FUVFJJQlVURV9TY29wZSwNCisgIFhGQV9BVFRSSUJVVEVfTWF0Y2gsDQorICBYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwNCisgIFhGQV9BVFRSSUJVVEVfQmVmb3JlLA0KKyAgWEZBX0FUVFJJQlVURV9Xcml0aW5nU2NyaXB0LA0KKyAgWEZBX0FUVFJJQlVURV9FbmRDaGFyLA0KKyAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgWEZBX0FUVFJJQlVURV9Mb25nLA0KKyAgWEZBX0FUVFJJQlVURV9JbnRhY3QsDQorICBYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsDQorICBYRkFfQVRUUklCVVRFX0RlY2lwaGVyT25seSwNCiB9Ow0KIGVudW0gWEZBX0VMRU1FTlQgew0KLSAgICBYRkFfRUxFTUVOVF9QcywNCi0gICAgWEZBX0VMRU1FTlRfVG8sDQotICAgIFhGQV9FTEVNRU5UX1VpLA0KLSAgICBYRkFfRUxFTUVOVF9SZWNvcmRTZXQsDQotICAgIFhGQV9FTEVNRU5UX1N1YnNldEJlbG93LA0KLSAgICBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LA0KLSAgICBYRkFfRUxFTUVOVF9BZG9iZUV4dGVuc2lvbkxldmVsLA0KLSAgICBYRkFfRUxFTUVOVF9UeXBlZmFjZSwNCi0gICAgWEZBX0VMRU1FTlRfQnJlYWssDQotICAgIFhGQV9FTEVNRU5UX0ZvbnRJbmZvLA0KLSAgICBYRkFfRUxFTUVOVF9OdW1iZXJQYXR0ZXJuLA0KLSAgICBYRkFfRUxFTUVOVF9EeW5hbWljUmVuZGVyLA0KLSAgICBYRkFfRUxFTUVOVF9QcmludFNjYWxpbmcsDQotICAgIFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLA0KLSAgICBYRkFfRUxFTUVOVF9EYXRlUGF0dGVybnMsDQotICAgIFhGQV9FTEVNRU5UX1NvdXJjZVNldCwNCi0gICAgWEZBX0VMRU1FTlRfQW1kLA0KLSAgICBYRkFfRUxFTUVOVF9BcmMsDQotICAgIFhGQV9FTEVNRU5UX0RheSwNCi0gICAgWEZBX0VMRU1FTlRfRXJhLA0KLSAgICBYRkFfRUxFTUVOVF9Kb2csDQotICAgIFhGQV9FTEVNRU5UX0xvZywNCi0gICAgWEZBX0VMRU1FTlRfTWFwLA0KLSAgICBYRkFfRUxFTUVOVF9NZHAsDQotICAgIFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlLA0KLSAgICBYRkFfRUxFTUVOVF9PaWQsDQotICAgIFhGQV9FTEVNRU5UX1BjbCwNCi0gICAgWEZBX0VMRU1FTlRfUGRmLA0KLSAgICBYRkFfRUxFTUVOVF9SZWYsDQotICAgIFhGQV9FTEVNRU5UX1VyaSwNCi0gICAgWEZBX0VMRU1FTlRfWGRjLA0KLSAgICBYRkFfRUxFTUVOVF9YZHAsDQotICAgIFhGQV9FTEVNRU5UX1hmYSwNCi0gICAgWEZBX0VMRU1FTlRfWHNsLA0KLSAgICBYRkFfRUxFTUVOVF9acGwsDQotICAgIFhGQV9FTEVNRU5UX0NhY2hlLA0KLSAgICBYRkFfRUxFTUVOVF9NYXJnaW4sDQotICAgIFhGQV9FTEVNRU5UX0tleVVzYWdlLA0KLSAgICBYRkFfRUxFTUVOVF9FeGNsdWRlLA0KLSAgICBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LA0KLSAgICBYRkFfRUxFTUVOVF9MZXZlbCwNCi0gICAgWEZBX0VMRU1FTlRfTGFiZWxQcmludGVyLA0KLSAgICBYRkFfRUxFTUVOVF9DYWxlbmRhclN5bWJvbHMsDQotICAgIFhGQV9FTEVNRU5UX1BhcmEsDQotICAgIFhGQV9FTEVNRU5UX1BhcnQsDQotICAgIFhGQV9FTEVNRU5UX1BkZmEsDQotICAgIFhGQV9FTEVNRU5UX0ZpbHRlciwNCi0gICAgWEZBX0VMRU1FTlRfUHJlc2VudCwNCi0gICAgWEZBX0VMRU1FTlRfUGFnaW5hdGlvbiwNCi0gICAgWEZBX0VMRU1FTlRfRW5jb2RpbmcsDQotICAgIFhGQV9FTEVNRU5UX0V2ZW50LA0KLSAgICBYRkFfRUxFTUVOVF9XaGl0ZXNwYWNlLA0KLSAgICBYRkFfRUxFTUVOVF9EZWZhdWx0VWksDQotICAgIFhGQV9FTEVNRU5UX0RhdGFNb2RlbCwNCi0gICAgWEZBX0VMRU1FTlRfQmFyY29kZSwNCi0gICAgWEZBX0VMRU1FTlRfVGltZVBhdHRlcm4sDQotICAgIFhGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LA0KLSAgICBYRkFfRUxFTUVOVF9FbmZvcmNlLA0KLSAgICBYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbHMsDQotICAgIFhGQV9FTEVNRU5UX0FkZFNpbGVudFByaW50LA0KLSAgICBYRkFfRUxFTUVOVF9SZW5hbWUsDQotICAgIFhGQV9FTEVNRU5UX09wZXJhdGlvbiwNCi0gICAgWEZBX0VMRU1FTlRfVHlwZWZhY2VzLA0KLSAgICBYRkFfRUxFTUVOVF9TdWJqZWN0RE5zLA0KLSAgICBYRkFfRUxFTUVOVF9Jc3N1ZXJzLA0KLSAgICBYRkFfRUxFTUVOVF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCwNCi0gICAgWEZBX0VMRU1FTlRfV3NkbENvbm5lY3Rpb24sDQotICAgIFhGQV9FTEVNRU5UX0RlYnVnLA0KLSAgICBYRkFfRUxFTUVOVF9EZWx0YSwNCi0gICAgWEZBX0VMRU1FTlRfRXJhTmFtZXMsDQotICAgIFhGQV9FTEVNRU5UX01vZGlmeUFubm90cywNCi0gICAgWEZBX0VMRU1FTlRfU3RhcnROb2RlLA0KLSAgICBYRkFfRUxFTUVOVF9CdXR0b24sDQotICAgIFhGQV9FTEVNRU5UX0Zvcm1hdCwNCi0gICAgWEZBX0VMRU1FTlRfQm9yZGVyLA0KLSAgICBYRkFfRUxFTUVOVF9BcmVhLA0KLSAgICBYRkFfRUxFTUVOVF9IeXBoZW5hdGlvbiwNCi0gICAgWEZBX0VMRU1FTlRfVGV4dCwNCi0gICAgWEZBX0VMRU1FTlRfVGltZSwNCi0gICAgWEZBX0VMRU1FTlRfVHlwZSwNCi0gICAgWEZBX0VMRU1FTlRfT3ZlcnByaW50LA0KLSAgICBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMsDQotICAgIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2RzLA0KLSAgICBYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwNCi0gICAgWEZBX0VMRU1FTlRfUHJpbnRlck5hbWUsDQotICAgIFhGQV9FTEVNRU5UX1N0YXJ0UGFnZSwNCi0gICAgWEZBX0VMRU1FTlRfUGFnZU9mZnNldCwNCi0gICAgWEZBX0VMRU1FTlRfRGF0ZVRpbWUsDQotICAgIFhGQV9FTEVNRU5UX0NvbWIsDQotICAgIFhGQV9FTEVNRU5UX1BhdHRlcm4sDQotICAgIFhGQV9FTEVNRU5UX0lmRW1wdHksDQotICAgIFhGQV9FTEVNRU5UX1N1cHByZXNzQmFubmVyLA0KLSAgICBYRkFfRUxFTUVOVF9PdXRwdXRCaW4sDQotICAgIFhGQV9FTEVNRU5UX0ZpZWxkLA0KLSAgICBYRkFfRUxFTUVOVF9BZ2VudCwNCi0gICAgWEZBX0VMRU1FTlRfT3V0cHV0WFNMLA0KLSAgICBYRkFfRUxFTUVOVF9BZGp1c3REYXRhLA0KLSAgICBYRkFfRUxFTUVOVF9BdXRvU2F2ZSwNCi0gICAgWEZBX0VMRU1FTlRfQ29udGVudEFyZWEsDQotICAgIFhGQV9FTEVNRU5UX0V2ZW50UHNldWRvTW9kZWwsDQotICAgIFhGQV9FTEVNRU5UX1dzZGxBZGRyZXNzLA0KLSAgICBYRkFfRUxFTUVOVF9Tb2xpZCwNCi0gICAgWEZBX0VMRU1FTlRfRGF0ZVRpbWVTeW1ib2xzLA0KLSAgICBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTGV2ZWwsDQotICAgIFhGQV9FTEVNRU5UX0VkZ2UsDQotICAgIFhGQV9FTEVNRU5UX1N0aXBwbGUsDQotICAgIFhGQV9FTEVNRU5UX0F0dHJpYnV0ZXMsDQotICAgIFhGQV9FTEVNRU5UX1ZlcnNpb25Db250cm9sLA0KLSAgICBYRkFfRUxFTUVOVF9NZXJpZGllbSwNCi0gICAgWEZBX0VMRU1FTlRfRXhjbEdyb3VwLA0KLSAgICBYRkFfRUxFTUVOVF9Ub29sVGlwLA0KLSAgICBYRkFfRUxFTUVOVF9Db21wcmVzcywNCi0gICAgWEZBX0VMRU1FTlRfUmVhc29uLA0KLSAgICBYRkFfRUxFTUVOVF9FeGVjdXRlLA0KLSAgICBYRkFfRUxFTUVOVF9Db250ZW50Q29weSwNCi0gICAgWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0LA0KLSAgICBYRkFfRUxFTUVOVF9Db25maWcsDQotICAgIFhGQV9FTEVNRU5UX0ltYWdlLA0KLSAgICBYRkFfRUxFTUVOVF9TaGFycHhIVE1MLA0KLSAgICBYRkFfRUxFTUVOVF9OdW1iZXJPZkNvcGllcywNCi0gICAgWEZBX0VMRU1FTlRfQmVoYXZpb3JPdmVycmlkZSwNCi0gICAgWEZBX0VMRU1FTlRfVGltZVN0YW1wLA0KLSAgICBYRkFfRUxFTUVOVF9Nb250aCwNCi0gICAgWEZBX0VMRU1FTlRfVmlld2VyUHJlZmVyZW5jZXMsDQotICAgIFhGQV9FTEVNRU5UX1NjcmlwdE1vZGVsLA0KLSAgICBYRkFfRUxFTUVOVF9EZWNpbWFsLA0KLSAgICBYRkFfRUxFTUVOVF9TdWJmb3JtLA0KLSAgICBYRkFfRUxFTUVOVF9TZWxlY3QsDQotICAgIFhGQV9FTEVNRU5UX1dpbmRvdywNCi0gICAgWEZBX0VMRU1FTlRfTG9jYWxlU2V0LA0KLSAgICBYRkFfRUxFTUVOVF9IYW5kbGVyLA0KLSAgICBYRkFfRUxFTUVOVF9Ib3N0UHNldWRvTW9kZWwsDQotICAgIFhGQV9FTEVNRU5UX1ByZXNlbmNlLA0KLSAgICBYRkFfRUxFTUVOVF9SZWNvcmQsDQotICAgIFhGQV9FTEVNRU5UX0VtYmVkLA0KLSAgICBYRkFfRUxFTUVOVF9WZXJzaW9uLA0KLSAgICBYRkFfRUxFTUVOVF9Db21tYW5kLA0KLSAgICBYRkFfRUxFTUVOVF9Db3BpZXMsDQotICAgIFhGQV9FTEVNRU5UX1N0YXBsZSwNCi0gICAgWEZBX0VMRU1FTlRfU3VibWl0Rm9ybWF0LA0KLSAgICBYRkFfRUxFTUVOVF9Cb29sZWFuLA0KLSAgICBYRkFfRUxFTUVOVF9NZXNzYWdlLA0KLSAgICBYRkFfRUxFTUVOVF9PdXRwdXQsDQotICAgIFhGQV9FTEVNRU5UX1BzTWFwLA0KLSAgICBYRkFfRUxFTUVOVF9FeGNsdWRlTlMsDQotICAgIFhGQV9FTEVNRU5UX0Fzc2lzdCwNCi0gICAgWEZBX0VMRU1FTlRfUGljdHVyZSwNCi0gICAgWEZBX0VMRU1FTlRfVHJhdmVyc2FsLA0KLSAgICBYRkFfRUxFTUVOVF9TaWxlbnRQcmludCwNCi0gICAgWEZBX0VMRU1FTlRfV2ViQ2xpZW50LA0KLSAgICBYRkFfRUxFTUVOVF9MYXlvdXRQc2V1ZG9Nb2RlbCwNCi0gICAgWEZBX0VMRU1FTlRfUHJvZHVjZXIsDQotICAgIFhGQV9FTEVNRU5UX0Nvcm5lciwNCi0gICAgWEZBX0VMRU1FTlRfTXNnSWQsDQotICAgIFhGQV9FTEVNRU5UX0NvbG9yLA0KLSAgICBYRkFfRUxFTUVOVF9LZWVwLA0KLSAgICBYRkFfRUxFTUVOVF9RdWVyeSwNCi0gICAgWEZBX0VMRU1FTlRfSW5zZXJ0LA0KLSAgICBYRkFfRUxFTUVOVF9JbWFnZUVkaXQsDQotICAgIFhGQV9FTEVNRU5UX1ZhbGlkYXRlLA0KLSAgICBYRkFfRUxFTUVOVF9EaWdlc3RNZXRob2RzLA0KLSAgICBYRkFfRUxFTUVOVF9OdW1iZXJQYXR0ZXJucywNCi0gICAgWEZBX0VMRU1FTlRfUGFnZVNldCwNCi0gICAgWEZBX0VMRU1FTlRfSW50ZWdlciwNCi0gICAgWEZBX0VMRU1FTlRfU29hcEFkZHJlc3MsDQotICAgIFhGQV9FTEVNRU5UX0VxdWF0ZSwNCi0gICAgWEZBX0VMRU1FTlRfRm9ybUZpZWxkRmlsbGluZywNCi0gICAgWEZBX0VMRU1FTlRfUGFnZVJhbmdlLA0KLSAgICBYRkFfRUxFTUVOVF9VcGRhdGUsDQotICAgIFhGQV9FTEVNRU5UX0Nvbm5lY3RTdHJpbmcsDQotICAgIFhGQV9FTEVNRU5UX01vZGUsDQotICAgIFhGQV9FTEVNRU5UX0xheW91dCwNCi0gICAgWEZBX0VMRU1FTlRfU2hhcnB4bWwsDQotICAgIFhGQV9FTEVNRU5UX1hzZENvbm5lY3Rpb24sDQotICAgIFhGQV9FTEVNRU5UX1RyYXZlcnNlLA0KLSAgICBYRkFfRUxFTUVOVF9FbmNvZGluZ3MsDQotICAgIFhGQV9FTEVNRU5UX1RlbXBsYXRlLA0KLSAgICBYRkFfRUxFTUVOVF9BY3JvYmF0LA0KLSAgICBYRkFfRUxFTUVOVF9WYWxpZGF0aW9uTWVzc2FnaW5nLA0KLSAgICBYRkFfRUxFTUVOVF9TaWduaW5nLA0KLSAgICBYRkFfRUxFTUVOVF9EYXRhV2luZG93LA0KLSAgICBYRkFfRUxFTUVOVF9TY3JpcHQsDQotICAgIFhGQV9FTEVNRU5UX0FkZFZpZXdlclByZWZlcmVuY2VzLA0KLSAgICBYRkFfRUxFTUVOVF9BbHdheXNFbWJlZCwNCi0gICAgWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0LA0KLSAgICBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCwNCi0gICAgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZCwNCi0gICAgWEZBX0VMRU1FTlRfQ2hhbmdlLA0KLSAgICBYRkFfRUxFTUVOVF9QYWdlQXJlYSwNCi0gICAgWEZBX0VMRU1FTlRfU3VibWl0VXJsLA0KLSAgICBYRkFfRUxFTUVOVF9PaWRzLA0KLSAgICBYRkFfRUxFTUVOVF9TaWduYXR1cmUsDQotICAgIFhGQV9FTEVNRU5UX0FEQkVfSlNDb25zb2xlLA0KLSAgICBYRkFfRUxFTUVOVF9DYXB0aW9uLA0KLSAgICBYRkFfRUxFTUVOVF9SZWxldmFudCwNCi0gICAgWEZBX0VMRU1FTlRfRmxpcExhYmVsLA0KLSAgICBYRkFfRUxFTUVOVF9FeERhdGEsDQotICAgIFhGQV9FTEVNRU5UX0RheU5hbWVzLA0KLSAgICBYRkFfRUxFTUVOVF9Tb2FwQWN0aW9uLA0KLSAgICBYRkFfRUxFTUVOVF9EZWZhdWx0VHlwZWZhY2UsDQotICAgIFhGQV9FTEVNRU5UX01hbmlmZXN0LA0KLSAgICBYRkFfRUxFTUVOVF9PdmVyZmxvdywNCi0gICAgWEZBX0VMRU1FTlRfTGluZWFyLA0KLSAgICBYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbCwNCi0gICAgWEZBX0VMRU1FTlRfRGVsZXRlLA0KLSAgICBYRkFfRUxFTUVOVF9EZWx0YXMsDQotICAgIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZCwNCi0gICAgWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyLA0KLSAgICBYRkFfRUxFTUVOVF9FcXVhdGVSYW5nZSwNCi0gICAgWEZBX0VMRU1FTlRfTWVkaXVtLA0KLSAgICBYRkFfRUxFTUVOVF9UZXh0RWRpdCwNCi0gICAgWEZBX0VMRU1FTlRfVGVtcGxhdGVDYWNoZSwNCi0gICAgWEZBX0VMRU1FTlRfQ29tcHJlc3NPYmplY3RTdHJlYW0sDQotICAgIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSwNCi0gICAgWEZBX0VMRU1FTlRfQWNjZXNzaWJsZUNvbnRlbnQsDQotICAgIFhGQV9FTEVNRU5UX05vZGVMaXN0LA0KLSAgICBYRkFfRUxFTUVOVF9JbmNsdWRlWERQQ29udGVudCwNCi0gICAgWEZBX0VMRU1FTlRfWG1sQ29ubmVjdGlvbiwNCi0gICAgWEZBX0VMRU1FTlRfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMsDQotICAgIFhGQV9FTEVNRU5UX1NpZ25EYXRhLA0KLSAgICBYRkFfRUxFTUVOVF9QYWNrZXRzLA0KLSAgICBYRkFfRUxFTUVOVF9EYXRlUGF0dGVybiwNCi0gICAgWEZBX0VMRU1FTlRfRHVwbGV4T3B0aW9uLA0KLSAgICBYRkFfRUxFTUVOVF9CYXNlLA0KLSAgICBYRkFfRUxFTUVOVF9CaW5kLA0KLSAgICBYRkFfRUxFTUVOVF9Db21wcmVzc2lvbiwNCi0gICAgWEZBX0VMRU1FTlRfVXNlciwNCi0gICAgWEZBX0VMRU1FTlRfUmVjdGFuZ2xlLA0KLSAgICBYRkFfRUxFTUVOVF9FZmZlY3RpdmVPdXRwdXRQb2xpY3ksDQotICAgIFhGQV9FTEVNRU5UX0FEQkVfSlNEZWJ1Z2dlciwNCi0gICAgWEZBX0VMRU1FTlRfQWNyb2JhdDcsDQotICAgIFhGQV9FTEVNRU5UX0ludGVyYWN0aXZlLA0KLSAgICBYRkFfRUxFTUVOVF9Mb2NhbGUsDQotICAgIFhGQV9FTEVNRU5UX0N1cnJlbnRQYWdlLA0KLSAgICBYRkFfRUxFTUVOVF9EYXRhLA0KLSAgICBYRkFfRUxFTUVOVF9EYXRlLA0KLSAgICBYRkFfRUxFTUVOVF9EZXNjLA0KLSAgICBYRkFfRUxFTUVOVF9FbmNyeXB0LA0KLSAgICBYRkFfRUxFTUVOVF9EcmF3LA0KLSAgICBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uLA0KLSAgICBYRkFfRUxFTUVOVF9NZXJpZGllbU5hbWVzLA0KLSAgICBYRkFfRUxFTUVOVF9NZXNzYWdpbmcsDQotICAgIFhGQV9FTEVNRU5UX1NwZWFrLA0KLSAgICBYRkFfRUxFTUVOVF9EYXRhR3JvdXAsDQotICAgIFhGQV9FTEVNRU5UX0NvbW1vbiwNCi0gICAgWEZBX0VMRU1FTlRfU2hhcnB0ZXh0LA0KLSAgICBYRkFfRUxFTUVOVF9QYWdpbmF0aW9uT3ZlcnJpZGUsDQotICAgIFhGQV9FTEVNRU5UX1JlYXNvbnMsDQotICAgIFhGQV9FTEVNRU5UX1NpZ25hdHVyZVByb3BlcnRpZXMsDQotICAgIFhGQV9FTEVNRU5UX1RocmVzaG9sZCwNCi0gICAgWEZBX0VMRU1FTlRfQXBwZWFyYW5jZUZpbHRlciwNCi0gICAgWEZBX0VMRU1FTlRfRmlsbCwNCi0gICAgWEZBX0VMRU1FTlRfRm9udCwNCi0gICAgWEZBX0VMRU1FTlRfRm9ybSwNCi0gICAgWEZBX0VMRU1FTlRfTWVkaXVtSW5mbywNCi0gICAgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGUsDQotICAgIFhGQV9FTEVNRU5UX1Bhc3N3b3JkLA0KLSAgICBYRkFfRUxFTUVOVF9SdW5TY3JpcHRzLA0KLSAgICBYRkFfRUxFTUVOVF9UcmFjZSwNCi0gICAgWEZBX0VMRU1FTlRfRmxvYXQsDQotICAgIFhGQV9FTEVNRU5UX1JlbmRlclBvbGljeSwNCi0gICAgWEZBX0VMRU1FTlRfTG9nUHNldWRvTW9kZWwsDQotICAgIFhGQV9FTEVNRU5UX0Rlc3RpbmF0aW9uLA0KLSAgICBYRkFfRUxFTUVOVF9WYWx1ZSwNCi0gICAgWEZBX0VMRU1FTlRfQm9va2VuZCwNCi0gICAgWEZBX0VMRU1FTlRfRXhPYmplY3QsDQotICAgIFhGQV9FTEVNRU5UX09wZW5BY3Rpb24sDQotICAgIFhGQV9FTEVNRU5UX05ldmVyRW1iZWQsDQotICAgIFhGQV9FTEVNRU5UX0JpbmRJdGVtcywNCi0gICAgWEZBX0VMRU1FTlRfQ2FsY3VsYXRlLA0KLSAgICBYRkFfRUxFTUVOVF9QcmludCwNCi0gICAgWEZBX0VMRU1FTlRfRXh0cmFzLA0KLSAgICBYRkFfRUxFTUVOVF9Qcm90bywNCi0gICAgWEZBX0VMRU1FTlRfRFNpZ0RhdGEsDQotICAgIFhGQV9FTEVNRU5UX0NyZWF0b3IsDQotICAgIFhGQV9FTEVNRU5UX0Nvbm5lY3QsDQotICAgIFhGQV9FTEVNRU5UX1Blcm1pc3Npb25zLA0KLSAgICBYRkFfRUxFTUVOVF9Db25uZWN0aW9uU2V0LA0KLSAgICBYRkFfRUxFTUVOVF9TdWJtaXQsDQotICAgIFhGQV9FTEVNRU5UX1JhbmdlLA0KLSAgICBYRkFfRUxFTUVOVF9MaW5lYXJpemVkLA0KLSAgICBYRkFfRUxFTUVOVF9QYWNrZXQsDQotICAgIFhGQV9FTEVNRU5UX1Jvb3RFbGVtZW50LA0KLSAgICBYRkFfRUxFTUVOVF9QbGFpbnRleHRNZXRhZGF0YSwNCi0gICAgWEZBX0VMRU1FTlRfTnVtYmVyU3ltYm9scywNCi0gICAgWEZBX0VMRU1FTlRfUHJpbnRIaWdoUXVhbGl0eSwNCi0gICAgWEZBX0VMRU1FTlRfRHJpdmVyLA0KLSAgICBYRkFfRUxFTUVOVF9JbmNyZW1lbnRhbExvYWQsDQotICAgIFhGQV9FTEVNRU5UX1N1YmplY3RETiwNCi0gICAgWEZBX0VMRU1FTlRfQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlLA0KLSAgICBYRkFfRUxFTUVOVF9JbmNyZW1lbnRhbE1lcmdlLA0KLSAgICBYRkFfRUxFTUVOVF9SYWRpYWwsDQotICAgIFhGQV9FTEVNRU5UX1ZhcmlhYmxlcywNCi0gICAgWEZBX0VMRU1FTlRfVGltZVBhdHRlcm5zLA0KLSAgICBYRkFfRUxFTUVOVF9FZmZlY3RpdmVJbnB1dFBvbGljeSwNCi0gICAgWEZBX0VMRU1FTlRfTmFtZUF0dHIsDQotICAgIFhGQV9FTEVNRU5UX0NvbmZvcm1hbmNlLA0KLSAgICBYRkFfRUxFTUVOVF9UcmFuc2Zvcm0sDQotICAgIFhGQV9FTEVNRU5UX0xvY2tEb2N1bWVudCwNCi0gICAgWEZBX0VMRU1FTlRfQnJlYWtBZnRlciwNCi0gICAgWEZBX0VMRU1FTlRfTGluZSwNCi0gICAgWEZBX0VMRU1FTlRfTGlzdCwNCi0gICAgWEZBX0VMRU1FTlRfU291cmNlLA0KLSAgICBYRkFfRUxFTUVOVF9PY2N1ciwNCi0gICAgWEZBX0VMRU1FTlRfUGlja1RyYXlCeVBERlNpemUsDQotICAgIFhGQV9FTEVNRU5UX01vbnRoTmFtZXMsDQotICAgIFhGQV9FTEVNRU5UX1NldmVyaXR5LA0KLSAgICBYRkFfRUxFTUVOVF9Hcm91cFBhcmVudCwNCi0gICAgWEZBX0VMRU1FTlRfRG9jdW1lbnRBc3NlbWJseSwNCi0gICAgWEZBX0VMRU1FTlRfTnVtYmVyU3ltYm9sLA0KLSAgICBYRkFfRUxFTUVOVF9UYWdnZWQsDQotICAgIFhGQV9FTEVNRU5UX0l0ZW1zLA0KKyAgWEZBX0VMRU1FTlRfUHMsDQorICBYRkFfRUxFTUVOVF9UbywNCisgIFhGQV9FTEVNRU5UX1VpLA0KKyAgWEZBX0VMRU1FTlRfUmVjb3JkU2V0LA0KKyAgWEZBX0VMRU1FTlRfU3Vic2V0QmVsb3csDQorICBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LA0KKyAgWEZBX0VMRU1FTlRfQWRvYmVFeHRlbnNpb25MZXZlbCwNCisgIFhGQV9FTEVNRU5UX1R5cGVmYWNlLA0KKyAgWEZBX0VMRU1FTlRfQnJlYWssDQorICBYRkFfRUxFTUVOVF9Gb250SW5mbywNCisgIFhGQV9FTEVNRU5UX051bWJlclBhdHRlcm4sDQorICBYRkFfRUxFTUVOVF9EeW5hbWljUmVuZGVyLA0KKyAgWEZBX0VMRU1FTlRfUHJpbnRTY2FsaW5nLA0KKyAgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sDQorICBYRkFfRUxFTUVOVF9EYXRlUGF0dGVybnMsDQorICBYRkFfRUxFTUVOVF9Tb3VyY2VTZXQsDQorICBYRkFfRUxFTUVOVF9BbWQsDQorICBYRkFfRUxFTUVOVF9BcmMsDQorICBYRkFfRUxFTUVOVF9EYXksDQorICBYRkFfRUxFTUVOVF9FcmEsDQorICBYRkFfRUxFTUVOVF9Kb2csDQorICBYRkFfRUxFTUVOVF9Mb2csDQorICBYRkFfRUxFTUVOVF9NYXAsDQorICBYRkFfRUxFTUVOVF9NZHAsDQorICBYRkFfRUxFTUVOVF9CcmVha0JlZm9yZSwNCisgIFhGQV9FTEVNRU5UX09pZCwNCisgIFhGQV9FTEVNRU5UX1BjbCwNCisgIFhGQV9FTEVNRU5UX1BkZiwNCisgIFhGQV9FTEVNRU5UX1JlZiwNCisgIFhGQV9FTEVNRU5UX1VyaSwNCisgIFhGQV9FTEVNRU5UX1hkYywNCisgIFhGQV9FTEVNRU5UX1hkcCwNCisgIFhGQV9FTEVNRU5UX1hmYSwNCisgIFhGQV9FTEVNRU5UX1hzbCwNCisgIFhGQV9FTEVNRU5UX1pwbCwNCisgIFhGQV9FTEVNRU5UX0NhY2hlLA0KKyAgWEZBX0VMRU1FTlRfTWFyZ2luLA0KKyAgWEZBX0VMRU1FTlRfS2V5VXNhZ2UsDQorICBYRkFfRUxFTUVOVF9FeGNsdWRlLA0KKyAgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCwNCisgIFhGQV9FTEVNRU5UX0xldmVsLA0KKyAgWEZBX0VMRU1FTlRfTGFiZWxQcmludGVyLA0KKyAgWEZBX0VMRU1FTlRfQ2FsZW5kYXJTeW1ib2xzLA0KKyAgWEZBX0VMRU1FTlRfUGFyYSwNCisgIFhGQV9FTEVNRU5UX1BhcnQsDQorICBYRkFfRUxFTUVOVF9QZGZhLA0KKyAgWEZBX0VMRU1FTlRfRmlsdGVyLA0KKyAgWEZBX0VMRU1FTlRfUHJlc2VudCwNCisgIFhGQV9FTEVNRU5UX1BhZ2luYXRpb24sDQorICBYRkFfRUxFTUVOVF9FbmNvZGluZywNCisgIFhGQV9FTEVNRU5UX0V2ZW50LA0KKyAgWEZBX0VMRU1FTlRfV2hpdGVzcGFjZSwNCisgIFhGQV9FTEVNRU5UX0RlZmF1bHRVaSwNCisgIFhGQV9FTEVNRU5UX0RhdGFNb2RlbCwNCisgIFhGQV9FTEVNRU5UX0JhcmNvZGUsDQorICBYRkFfRUxFTUVOVF9UaW1lUGF0dGVybiwNCisgIFhGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LA0KKyAgWEZBX0VMRU1FTlRfRW5mb3JjZSwNCisgIFhGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9scywNCisgIFhGQV9FTEVNRU5UX0FkZFNpbGVudFByaW50LA0KKyAgWEZBX0VMRU1FTlRfUmVuYW1lLA0KKyAgWEZBX0VMRU1FTlRfT3BlcmF0aW9uLA0KKyAgWEZBX0VMRU1FTlRfVHlwZWZhY2VzLA0KKyAgWEZBX0VMRU1FTlRfU3ViamVjdEROcywNCisgIFhGQV9FTEVNRU5UX0lzc3VlcnMsDQorICBYRkFfRUxFTUVOVF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCwNCisgIFhGQV9FTEVNRU5UX1dzZGxDb25uZWN0aW9uLA0KKyAgWEZBX0VMRU1FTlRfRGVidWcsDQorICBYRkFfRUxFTUVOVF9EZWx0YSwNCisgIFhGQV9FTEVNRU5UX0VyYU5hbWVzLA0KKyAgWEZBX0VMRU1FTlRfTW9kaWZ5QW5ub3RzLA0KKyAgWEZBX0VMRU1FTlRfU3RhcnROb2RlLA0KKyAgWEZBX0VMRU1FTlRfQnV0dG9uLA0KKyAgWEZBX0VMRU1FTlRfRm9ybWF0LA0KKyAgWEZBX0VMRU1FTlRfQm9yZGVyLA0KKyAgWEZBX0VMRU1FTlRfQXJlYSwNCisgIFhGQV9FTEVNRU5UX0h5cGhlbmF0aW9uLA0KKyAgWEZBX0VMRU1FTlRfVGV4dCwNCisgIFhGQV9FTEVNRU5UX1RpbWUsDQorICBYRkFfRUxFTUVOVF9UeXBlLA0KKyAgWEZBX0VMRU1FTlRfT3ZlcnByaW50LA0KKyAgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzLA0KKyAgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZHMsDQorICBYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwNCisgIFhGQV9FTEVNRU5UX1ByaW50ZXJOYW1lLA0KKyAgWEZBX0VMRU1FTlRfU3RhcnRQYWdlLA0KKyAgWEZBX0VMRU1FTlRfUGFnZU9mZnNldCwNCisgIFhGQV9FTEVNRU5UX0RhdGVUaW1lLA0KKyAgWEZBX0VMRU1FTlRfQ29tYiwNCisgIFhGQV9FTEVNRU5UX1BhdHRlcm4sDQorICBYRkFfRUxFTUVOVF9JZkVtcHR5LA0KKyAgWEZBX0VMRU1FTlRfU3VwcHJlc3NCYW5uZXIsDQorICBYRkFfRUxFTUVOVF9PdXRwdXRCaW4sDQorICBYRkFfRUxFTUVOVF9GaWVsZCwNCisgIFhGQV9FTEVNRU5UX0FnZW50LA0KKyAgWEZBX0VMRU1FTlRfT3V0cHV0WFNMLA0KKyAgWEZBX0VMRU1FTlRfQWRqdXN0RGF0YSwNCisgIFhGQV9FTEVNRU5UX0F1dG9TYXZlLA0KKyAgWEZBX0VMRU1FTlRfQ29udGVudEFyZWEsDQorICBYRkFfRUxFTUVOVF9FdmVudFBzZXVkb01vZGVsLA0KKyAgWEZBX0VMRU1FTlRfV3NkbEFkZHJlc3MsDQorICBYRkFfRUxFTUVOVF9Tb2xpZCwNCisgIFhGQV9FTEVNRU5UX0RhdGVUaW1lU3ltYm9scywNCisgIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25MZXZlbCwNCisgIFhGQV9FTEVNRU5UX0VkZ2UsDQorICBYRkFfRUxFTUVOVF9TdGlwcGxlLA0KKyAgWEZBX0VMRU1FTlRfQXR0cmlidXRlcywNCisgIFhGQV9FTEVNRU5UX1ZlcnNpb25Db250cm9sLA0KKyAgWEZBX0VMRU1FTlRfTWVyaWRpZW0sDQorICBYRkFfRUxFTUVOVF9FeGNsR3JvdXAsDQorICBYRkFfRUxFTUVOVF9Ub29sVGlwLA0KKyAgWEZBX0VMRU1FTlRfQ29tcHJlc3MsDQorICBYRkFfRUxFTUVOVF9SZWFzb24sDQorICBYRkFfRUxFTUVOVF9FeGVjdXRlLA0KKyAgWEZBX0VMRU1FTlRfQ29udGVudENvcHksDQorICBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQsDQorICBYRkFfRUxFTUVOVF9Db25maWcsDQorICBYRkFfRUxFTUVOVF9JbWFnZSwNCisgIFhGQV9FTEVNRU5UX1NoYXJweEhUTUwsDQorICBYRkFfRUxFTUVOVF9OdW1iZXJPZkNvcGllcywNCisgIFhGQV9FTEVNRU5UX0JlaGF2aW9yT3ZlcnJpZGUsDQorICBYRkFfRUxFTUVOVF9UaW1lU3RhbXAsDQorICBYRkFfRUxFTUVOVF9Nb250aCwNCisgIFhGQV9FTEVNRU5UX1ZpZXdlclByZWZlcmVuY2VzLA0KKyAgWEZBX0VMRU1FTlRfU2NyaXB0TW9kZWwsDQorICBYRkFfRUxFTUVOVF9EZWNpbWFsLA0KKyAgWEZBX0VMRU1FTlRfU3ViZm9ybSwNCisgIFhGQV9FTEVNRU5UX1NlbGVjdCwNCisgIFhGQV9FTEVNRU5UX1dpbmRvdywNCisgIFhGQV9FTEVNRU5UX0xvY2FsZVNldCwNCisgIFhGQV9FTEVNRU5UX0hhbmRsZXIsDQorICBYRkFfRUxFTUVOVF9Ib3N0UHNldWRvTW9kZWwsDQorICBYRkFfRUxFTUVOVF9QcmVzZW5jZSwNCisgIFhGQV9FTEVNRU5UX1JlY29yZCwNCisgIFhGQV9FTEVNRU5UX0VtYmVkLA0KKyAgWEZBX0VMRU1FTlRfVmVyc2lvbiwNCisgIFhGQV9FTEVNRU5UX0NvbW1hbmQsDQorICBYRkFfRUxFTUVOVF9Db3BpZXMsDQorICBYRkFfRUxFTUVOVF9TdGFwbGUsDQorICBYRkFfRUxFTUVOVF9TdWJtaXRGb3JtYXQsDQorICBYRkFfRUxFTUVOVF9Cb29sZWFuLA0KKyAgWEZBX0VMRU1FTlRfTWVzc2FnZSwNCisgIFhGQV9FTEVNRU5UX091dHB1dCwNCisgIFhGQV9FTEVNRU5UX1BzTWFwLA0KKyAgWEZBX0VMRU1FTlRfRXhjbHVkZU5TLA0KKyAgWEZBX0VMRU1FTlRfQXNzaXN0LA0KKyAgWEZBX0VMRU1FTlRfUGljdHVyZSwNCisgIFhGQV9FTEVNRU5UX1RyYXZlcnNhbCwNCisgIFhGQV9FTEVNRU5UX1NpbGVudFByaW50LA0KKyAgWEZBX0VMRU1FTlRfV2ViQ2xpZW50LA0KKyAgWEZBX0VMRU1FTlRfTGF5b3V0UHNldWRvTW9kZWwsDQorICBYRkFfRUxFTUVOVF9Qcm9kdWNlciwNCisgIFhGQV9FTEVNRU5UX0Nvcm5lciwNCisgIFhGQV9FTEVNRU5UX01zZ0lkLA0KKyAgWEZBX0VMRU1FTlRfQ29sb3IsDQorICBYRkFfRUxFTUVOVF9LZWVwLA0KKyAgWEZBX0VMRU1FTlRfUXVlcnksDQorICBYRkFfRUxFTUVOVF9JbnNlcnQsDQorICBYRkFfRUxFTUVOVF9JbWFnZUVkaXQsDQorICBYRkFfRUxFTUVOVF9WYWxpZGF0ZSwNCisgIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZHMsDQorICBYRkFfRUxFTUVOVF9OdW1iZXJQYXR0ZXJucywNCisgIFhGQV9FTEVNRU5UX1BhZ2VTZXQsDQorICBYRkFfRUxFTUVOVF9JbnRlZ2VyLA0KKyAgWEZBX0VMRU1FTlRfU29hcEFkZHJlc3MsDQorICBYRkFfRUxFTUVOVF9FcXVhdGUsDQorICBYRkFfRUxFTUVOVF9Gb3JtRmllbGRGaWxsaW5nLA0KKyAgWEZBX0VMRU1FTlRfUGFnZVJhbmdlLA0KKyAgWEZBX0VMRU1FTlRfVXBkYXRlLA0KKyAgWEZBX0VMRU1FTlRfQ29ubmVjdFN0cmluZywNCisgIFhGQV9FTEVNRU5UX01vZGUsDQorICBYRkFfRUxFTUVOVF9MYXlvdXQsDQorICBYRkFfRUxFTUVOVF9TaGFycHhtbCwNCisgIFhGQV9FTEVNRU5UX1hzZENvbm5lY3Rpb24sDQorICBYRkFfRUxFTUVOVF9UcmF2ZXJzZSwNCisgIFhGQV9FTEVNRU5UX0VuY29kaW5ncywNCisgIFhGQV9FTEVNRU5UX1RlbXBsYXRlLA0KKyAgWEZBX0VMRU1FTlRfQWNyb2JhdCwNCisgIFhGQV9FTEVNRU5UX1ZhbGlkYXRpb25NZXNzYWdpbmcsDQorICBYRkFfRUxFTUVOVF9TaWduaW5nLA0KKyAgWEZBX0VMRU1FTlRfRGF0YVdpbmRvdywNCisgIFhGQV9FTEVNRU5UX1NjcmlwdCwNCisgIFhGQV9FTEVNRU5UX0FkZFZpZXdlclByZWZlcmVuY2VzLA0KKyAgWEZBX0VMRU1FTlRfQWx3YXlzRW1iZWQsDQorICBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQsDQorICBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCwNCisgIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2QsDQorICBYRkFfRUxFTUVOVF9DaGFuZ2UsDQorICBYRkFfRUxFTUVOVF9QYWdlQXJlYSwNCisgIFhGQV9FTEVNRU5UX1N1Ym1pdFVybCwNCisgIFhGQV9FTEVNRU5UX09pZHMsDQorICBYRkFfRUxFTUVOVF9TaWduYXR1cmUsDQorICBYRkFfRUxFTUVOVF9BREJFX0pTQ29uc29sZSwNCisgIFhGQV9FTEVNRU5UX0NhcHRpb24sDQorICBYRkFfRUxFTUVOVF9SZWxldmFudCwNCisgIFhGQV9FTEVNRU5UX0ZsaXBMYWJlbCwNCisgIFhGQV9FTEVNRU5UX0V4RGF0YSwNCisgIFhGQV9FTEVNRU5UX0RheU5hbWVzLA0KKyAgWEZBX0VMRU1FTlRfU29hcEFjdGlvbiwNCisgIFhGQV9FTEVNRU5UX0RlZmF1bHRUeXBlZmFjZSwNCisgIFhGQV9FTEVNRU5UX01hbmlmZXN0LA0KKyAgWEZBX0VMRU1FTlRfT3ZlcmZsb3csDQorICBYRkFfRUxFTUVOVF9MaW5lYXIsDQorICBYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbCwNCisgIFhGQV9FTEVNRU5UX0RlbGV0ZSwNCisgIFhGQV9FTEVNRU5UX0RlbHRhcywNCisgIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZCwNCisgIFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlciwNCisgIFhGQV9FTEVNRU5UX0VxdWF0ZVJhbmdlLA0KKyAgWEZBX0VMRU1FTlRfTWVkaXVtLA0KKyAgWEZBX0VMRU1FTlRfVGV4dEVkaXQsDQorICBYRkFfRUxFTUVOVF9UZW1wbGF0ZUNhY2hlLA0KKyAgWEZBX0VMRU1FTlRfQ29tcHJlc3NPYmplY3RTdHJlYW0sDQorICBYRkFfRUxFTUVOVF9EYXRhVmFsdWUsDQorICBYRkFfRUxFTUVOVF9BY2Nlc3NpYmxlQ29udGVudCwNCisgIFhGQV9FTEVNRU5UX05vZGVMaXN0LA0KKyAgWEZBX0VMRU1FTlRfSW5jbHVkZVhEUENvbnRlbnQsDQorICBYRkFfRUxFTUVOVF9YbWxDb25uZWN0aW9uLA0KKyAgWEZBX0VMRU1FTlRfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMsDQorICBYRkFfRUxFTUVOVF9TaWduRGF0YSwNCisgIFhGQV9FTEVNRU5UX1BhY2tldHMsDQorICBYRkFfRUxFTUVOVF9EYXRlUGF0dGVybiwNCisgIFhGQV9FTEVNRU5UX0R1cGxleE9wdGlvbiwNCisgIFhGQV9FTEVNRU5UX0Jhc2UsDQorICBYRkFfRUxFTUVOVF9CaW5kLA0KKyAgWEZBX0VMRU1FTlRfQ29tcHJlc3Npb24sDQorICBYRkFfRUxFTUVOVF9Vc2VyLA0KKyAgWEZBX0VMRU1FTlRfUmVjdGFuZ2xlLA0KKyAgWEZBX0VMRU1FTlRfRWZmZWN0aXZlT3V0cHV0UG9saWN5LA0KKyAgWEZBX0VMRU1FTlRfQURCRV9KU0RlYnVnZ2VyLA0KKyAgWEZBX0VMRU1FTlRfQWNyb2JhdDcsDQorICBYRkFfRUxFTUVOVF9JbnRlcmFjdGl2ZSwNCisgIFhGQV9FTEVNRU5UX0xvY2FsZSwNCisgIFhGQV9FTEVNRU5UX0N1cnJlbnRQYWdlLA0KKyAgWEZBX0VMRU1FTlRfRGF0YSwNCisgIFhGQV9FTEVNRU5UX0RhdGUsDQorICBYRkFfRUxFTUVOVF9EZXNjLA0KKyAgWEZBX0VMRU1FTlRfRW5jcnlwdCwNCisgIFhGQV9FTEVNRU5UX0RyYXcsDQorICBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uLA0KKyAgWEZBX0VMRU1FTlRfTWVyaWRpZW1OYW1lcywNCisgIFhGQV9FTEVNRU5UX01lc3NhZ2luZywNCisgIFhGQV9FTEVNRU5UX1NwZWFrLA0KKyAgWEZBX0VMRU1FTlRfRGF0YUdyb3VwLA0KKyAgWEZBX0VMRU1FTlRfQ29tbW9uLA0KKyAgWEZBX0VMRU1FTlRfU2hhcnB0ZXh0LA0KKyAgWEZBX0VMRU1FTlRfUGFnaW5hdGlvbk92ZXJyaWRlLA0KKyAgWEZBX0VMRU1FTlRfUmVhc29ucywNCisgIFhGQV9FTEVNRU5UX1NpZ25hdHVyZVByb3BlcnRpZXMsDQorICBYRkFfRUxFTUVOVF9UaHJlc2hvbGQsDQorICBYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyLA0KKyAgWEZBX0VMRU1FTlRfRmlsbCwNCisgIFhGQV9FTEVNRU5UX0ZvbnQsDQorICBYRkFfRUxFTUVOVF9Gb3JtLA0KKyAgWEZBX0VMRU1FTlRfTWVkaXVtSW5mbywNCisgIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlLA0KKyAgWEZBX0VMRU1FTlRfUGFzc3dvcmQsDQorICBYRkFfRUxFTUVOVF9SdW5TY3JpcHRzLA0KKyAgWEZBX0VMRU1FTlRfVHJhY2UsDQorICBYRkFfRUxFTUVOVF9GbG9hdCwNCisgIFhGQV9FTEVNRU5UX1JlbmRlclBvbGljeSwNCisgIFhGQV9FTEVNRU5UX0xvZ1BzZXVkb01vZGVsLA0KKyAgWEZBX0VMRU1FTlRfRGVzdGluYXRpb24sDQorICBYRkFfRUxFTUVOVF9WYWx1ZSwNCisgIFhGQV9FTEVNRU5UX0Jvb2tlbmQsDQorICBYRkFfRUxFTUVOVF9FeE9iamVjdCwNCisgIFhGQV9FTEVNRU5UX09wZW5BY3Rpb24sDQorICBYRkFfRUxFTUVOVF9OZXZlckVtYmVkLA0KKyAgWEZBX0VMRU1FTlRfQmluZEl0ZW1zLA0KKyAgWEZBX0VMRU1FTlRfQ2FsY3VsYXRlLA0KKyAgWEZBX0VMRU1FTlRfUHJpbnQsDQorICBYRkFfRUxFTUVOVF9FeHRyYXMsDQorICBYRkFfRUxFTUVOVF9Qcm90bywNCisgIFhGQV9FTEVNRU5UX0RTaWdEYXRhLA0KKyAgWEZBX0VMRU1FTlRfQ3JlYXRvciwNCisgIFhGQV9FTEVNRU5UX0Nvbm5lY3QsDQorICBYRkFfRUxFTUVOVF9QZXJtaXNzaW9ucywNCisgIFhGQV9FTEVNRU5UX0Nvbm5lY3Rpb25TZXQsDQorICBYRkFfRUxFTUVOVF9TdWJtaXQsDQorICBYRkFfRUxFTUVOVF9SYW5nZSwNCisgIFhGQV9FTEVNRU5UX0xpbmVhcml6ZWQsDQorICBYRkFfRUxFTUVOVF9QYWNrZXQsDQorICBYRkFfRUxFTUVOVF9Sb290RWxlbWVudCwNCisgIFhGQV9FTEVNRU5UX1BsYWludGV4dE1ldGFkYXRhLA0KKyAgWEZBX0VMRU1FTlRfTnVtYmVyU3ltYm9scywNCisgIFhGQV9FTEVNRU5UX1ByaW50SGlnaFF1YWxpdHksDQorICBYRkFfRUxFTUVOVF9Ecml2ZXIsDQorICBYRkFfRUxFTUVOVF9JbmNyZW1lbnRhbExvYWQsDQorICBYRkFfRUxFTUVOVF9TdWJqZWN0RE4sDQorICBYRkFfRUxFTUVOVF9Db21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUsDQorICBYRkFfRUxFTUVOVF9JbmNyZW1lbnRhbE1lcmdlLA0KKyAgWEZBX0VMRU1FTlRfUmFkaWFsLA0KKyAgWEZBX0VMRU1FTlRfVmFyaWFibGVzLA0KKyAgWEZBX0VMRU1FTlRfVGltZVBhdHRlcm5zLA0KKyAgWEZBX0VMRU1FTlRfRWZmZWN0aXZlSW5wdXRQb2xpY3ksDQorICBYRkFfRUxFTUVOVF9OYW1lQXR0ciwNCisgIFhGQV9FTEVNRU5UX0NvbmZvcm1hbmNlLA0KKyAgWEZBX0VMRU1FTlRfVHJhbnNmb3JtLA0KKyAgWEZBX0VMRU1FTlRfTG9ja0RvY3VtZW50LA0KKyAgWEZBX0VMRU1FTlRfQnJlYWtBZnRlciwNCisgIFhGQV9FTEVNRU5UX0xpbmUsDQorICBYRkFfRUxFTUVOVF9MaXN0LA0KKyAgWEZBX0VMRU1FTlRfU291cmNlLA0KKyAgWEZBX0VMRU1FTlRfT2NjdXIsDQorICBYRkFfRUxFTUVOVF9QaWNrVHJheUJ5UERGU2l6ZSwNCisgIFhGQV9FTEVNRU5UX01vbnRoTmFtZXMsDQorICBYRkFfRUxFTUVOVF9TZXZlcml0eSwNCisgIFhGQV9FTEVNRU5UX0dyb3VwUGFyZW50LA0KKyAgWEZBX0VMRU1FTlRfRG9jdW1lbnRBc3NlbWJseSwNCisgIFhGQV9FTEVNRU5UX051bWJlclN5bWJvbCwNCisgIFhGQV9FTEVNRU5UX1RhZ2dlZCwNCisgIFhGQV9FTEVNRU5UX0l0ZW1zLA0KIH07DQogI2RlZmluZSBYRkFfRUxFTUVOVF9VTktOT1dOICgoWEZBX0VMRU1FTlQpLTEpDQogdHlwZWRlZiBzdHJ1Y3QgX1hGQV9FTEVNRU5USU5GTyB7DQotICAgIHVpbnQzMl90CQkJCQl1SGFzaDsNCi0gICAgY29uc3QgRlhfV0NIQVIqCQkJCQlwTmFtZTsNCi0gICAgWEZBX0VMRU1FTlQJCQkJCWVOYW1lOw0KLSAgICBGWF9EV09SRAkJCQkJZHdQYWNrZXRzOw0KLSAgICBGWF9EV09SRAkJCQkJZU9iamVjdFR5cGU7DQotfSBYRkFfRUxFTUVOVElORk8sICogWEZBX0xQRUxFTUVOVElORk87DQotdHlwZWRlZiBYRkFfRUxFTUVOVElORk8gY29uc3QgKiBYRkFfTFBDRUxFTUVOVElORk87DQorICB1aW50MzJfdCB1SGFzaDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsNCisgIFhGQV9FTEVNRU5UIGVOYW1lOw0KKyAgRlhfRFdPUkQgZHdQYWNrZXRzOw0KKyAgRlhfRFdPUkQgZU9iamVjdFR5cGU7DQorfSBYRkFfRUxFTUVOVElORk8sICpYRkFfTFBFTEVNRU5USU5GTzsNCit0eXBlZGVmIFhGQV9FTEVNRU5USU5GTyBjb25zdCogWEZBX0xQQ0VMRU1FTlRJTkZPOw0KIGludDMyX3QgWEZBX0dldEVsZW1lbnRDb3VudCgpOw0KIFhGQV9MUENFTEVNRU5USU5GTyBYRkFfR2V0RWxlbWVudEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSk7DQogWEZBX0xQQ0VMRU1FTlRJTkZPIFhGQV9HZXRFbGVtZW50QnlJRChYRkFfRUxFTUVOVCBlTmFtZSk7DQogZW51bSBYRkFfQVRUUklCVVRFVFlQRSB7DQotICAgIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsDQotICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQotICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KLSAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLA0KLSAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KLSAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLA0KKyAgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwNCisgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sDQorICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCiB9Ow0KIHR5cGVkZWYgc3RydWN0IF9YRkFfQVRUUklCVVRFSU5GTyB7DQotICAgIHVpbnQzMl90CQkJCQl1SGFzaDsNCi0gICAgY29uc3QgRlhfV0NIQVIqCQkJCQlwTmFtZTsNCi0gICAgWEZBX0FUVFJJQlVURQkJCQllTmFtZTsNCi0gICAgWEZBX0FUVFJJQlVURVRZUEUJCQllVHlwZTsNCi0gICAgRlhfRFdPUkQJCQkJCWR3UGFja2V0czsNCi0gICAgdm9pZCoJCQkJCXBEZWZWYWx1ZTsNCi19IFhGQV9BVFRSSUJVVEVJTkZPLCAqIFhGQV9MUEFUVFJJQlVURUlORk87DQotdHlwZWRlZiBYRkFfQVRUUklCVVRFSU5GTyBjb25zdCAqIFhGQV9MUENBVFRSSUJVVEVJTkZPOw0KKyAgdWludDMyX3QgdUhhc2g7DQorICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7DQorICBYRkFfQVRUUklCVVRFIGVOYW1lOw0KKyAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGU7DQorICBGWF9EV09SRCBkd1BhY2tldHM7DQorICB2b2lkKiBwRGVmVmFsdWU7DQorfSBYRkFfQVRUUklCVVRFSU5GTywgKlhGQV9MUEFUVFJJQlVURUlORk87DQordHlwZWRlZiBYRkFfQVRUUklCVVRFSU5GTyBjb25zdCogWEZBX0xQQ0FUVFJJQlVURUlORk87DQogaW50MzJfdCBYRkFfR2V0QXR0cmlidXRlQ291bnQoKTsNCiBYRkFfTFBDQVRUUklCVVRFSU5GTyBYRkFfR2V0QXR0cmlidXRlQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsNCiBYRkFfTFBDQVRUUklCVVRFSU5GTyBYRkFfR2V0QXR0cmlidXRlQnlJRChYRkFfQVRUUklCVVRFIGVOYW1lKTsNCi1GWF9CT09MIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUodm9pZCogJnBWYWx1ZSwgWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsIEZYX0RXT1JEIGR3UGFja2V0KTsNCi1YRkFfQVRUUklCVVRFRU5VTQlYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgRlhfRFdPUkQgZHdQYWNrZXQpOw0KLUNGWF9XaWRlU3RyaW5nQwkJWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9DZGF0YShYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLCBGWF9EV09SRCBkd1BhY2tldCk7DQotRlhfQk9PTAkJCQlYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0Jvb2xlYW4oWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgRlhfRFdPUkQgZHdQYWNrZXQpOw0KLWludDMyX3QJCQlYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0ludGVnZXIoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgRlhfRFdPUkQgZHdQYWNrZXQpOw0KLUNYRkFfTWVhc3VyZW1lbnQJWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9NZWFzdXJlKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsIEZYX0RXT1JEIGR3UGFja2V0KTsNCitGWF9CT09MIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUodm9pZComIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UGFja2V0KTsNCitYRkFfQVRUUklCVVRFRU5VTSBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpOw0KK0NGWF9XaWRlU3RyaW5nQyBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0NkYXRhKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1BhY2tldCk7DQorRlhfQk9PTCBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0Jvb2xlYW4oWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UGFja2V0KTsNCitpbnQzMl90IFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfSW50ZWdlcihYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpOw0KK0NYRkFfTWVhc3VyZW1lbnQgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9NZWFzdXJlKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1BhY2tldCk7DQogdHlwZWRlZiBzdHJ1Y3QgX1hGQV9FTEVNRU5USElFUkFSQ0hZIHsNCi0gICAgRlhfV09SRAkJCQkJCXdTdGFydDsNCi0gICAgRlhfV09SRAkJCQkJCXdDb3VudDsNCi0gICAgRlhfV09SRAkJCQkJCXdQYXJlbnRJbmRleDsNCi19IFhGQV9FTEVNRU5USElFUkFSQ0hZLCAqIFhGQV9MUEVMRU1FTlRISUVSQVJDSFk7DQotdHlwZWRlZiBYRkFfRUxFTUVOVEhJRVJBUkNIWSBjb25zdCAqIFhGQV9MUENFTEVNRU5USElFUkFSQ0hZOw0KKyAgRlhfV09SRCB3U3RhcnQ7DQorICBGWF9XT1JEIHdDb3VudDsNCisgIEZYX1dPUkQgd1BhcmVudEluZGV4Ow0KK30gWEZBX0VMRU1FTlRISUVSQVJDSFksICpYRkFfTFBFTEVNRU5USElFUkFSQ0hZOw0KK3R5cGVkZWYgWEZBX0VMRU1FTlRISUVSQVJDSFkgY29uc3QqIFhGQV9MUENFTEVNRU5USElFUkFSQ0hZOw0KIHR5cGVkZWYgc3RydWN0IF9YRkFfU0NSSVBUSElFUkFSQ0hZIHsNCi0gICAgRlhfV09SRAkJCQkJCXdNZXRob2RTdGFydDsNCi0gICAgRlhfV09SRAkJCQkJCXdNZXRob2RDb3VudDsNCi0gICAgRlhfV09SRAkJCQkJCXdBdHRyaWJ1dGVTdGFydDsNCi0gICAgRlhfV09SRAkJCQkJCXdBdHRyaWJ1dGVDb3VudDsNCi0gICAgaW50MTZfdAkJCQkJd1BhcmVudEluZGV4Ow0KLX0gWEZBX1NDUklQVEhJRVJBUkNIWSwgKiBYRkFfTFBTQ1JJUFRISUVSQVJDSFk7DQotdHlwZWRlZiBYRkFfU0NSSVBUSElFUkFSQ0hZIGNvbnN0ICogWEZBX0xQQ1NDUklQVEhJRVJBUkNIWTsNCi1jb25zdCBGWF9XT1JEKiBYRkFfR2V0RWxlbWVudENoaWxkcmVuKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBpbnQzMl90ICZpQ291bnQpOw0KLWNvbnN0IHVpbnQ4X3QqIFhGQV9HZXRFbGVtZW50QXR0cmlidXRlcyhYRkFfRUxFTUVOVCBlRWxlbWVudCwgaW50MzJfdCAmaUNvdW50KTsNCi1YRkFfTFBDRUxFTUVOVElORk8gWEZBX0dldENoaWxkT2ZFbGVtZW50KFhGQV9FTEVNRU5UIGVFbGVtZW50LCBYRkFfRUxFTUVOVCBlQ2hpbGQsIEZYX0RXT1JEIGR3UGFja2V0KTsNCi1YRkFfTFBDQVRUUklCVVRFSU5GTyBYRkFfR2V0QXR0cmlidXRlT2ZFbGVtZW50KFhGQV9FTEVNRU5UIGVFbGVtZW50LCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsIEZYX0RXT1JEIGR3UGFja2V0KTsNCi0jZGVmaW5lIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YJCQkweDAxDQotI2RlZmluZSBYRkFfUFJPUEVSVFlGTEFHX0RlZmF1bHRPbmVPZgkweDAyDQorICBGWF9XT1JEIHdNZXRob2RTdGFydDsNCisgIEZYX1dPUkQgd01ldGhvZENvdW50Ow0KKyAgRlhfV09SRCB3QXR0cmlidXRlU3RhcnQ7DQorICBGWF9XT1JEIHdBdHRyaWJ1dGVDb3VudDsNCisgIGludDE2X3Qgd1BhcmVudEluZGV4Ow0KK30gWEZBX1NDUklQVEhJRVJBUkNIWSwgKlhGQV9MUFNDUklQVEhJRVJBUkNIWTsNCit0eXBlZGVmIFhGQV9TQ1JJUFRISUVSQVJDSFkgY29uc3QqIFhGQV9MUENTQ1JJUFRISUVSQVJDSFk7DQorY29uc3QgRlhfV09SRCogWEZBX0dldEVsZW1lbnRDaGlsZHJlbihYRkFfRUxFTUVOVCBlRWxlbWVudCwgaW50MzJfdCYgaUNvdW50KTsNCitjb25zdCB1aW50OF90KiBYRkFfR2V0RWxlbWVudEF0dHJpYnV0ZXMoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIGludDMyX3QmIGlDb3VudCk7DQorWEZBX0xQQ0VMRU1FTlRJTkZPIFhGQV9HZXRDaGlsZE9mRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVDaGlsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UGFja2V0KTsNCitYRkFfTFBDQVRUUklCVVRFSU5GTyBYRkFfR2V0QXR0cmlidXRlT2ZFbGVtZW50KFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpOw0KKyNkZWZpbmUgWEZBX1BST1BFUlRZRkxBR19PbmVPZiAweDAxDQorI2RlZmluZSBYRkFfUFJPUEVSVFlGTEFHX0RlZmF1bHRPbmVPZiAweDAyDQogdHlwZWRlZiBzdHJ1Y3QgX1hGQV9QUk9QRVJUWSB7DQotICAgIEZYX1dPUkQJCQkJCQllTmFtZTsNCi0gICAgdWludDhfdAkJCQkJCXVPY2N1cjsNCi0gICAgdWludDhfdAkJCQkJCXVGbGFnczsNCi19IFhGQV9QUk9QRVJUWSwgKiBYRkFfTFBQUk9QRVJUWTsNCi10eXBlZGVmIFhGQV9QUk9QRVJUWSBjb25zdCAqIFhGQV9MUENQUk9QRVJUWTsNCi1YRkFfTFBDUFJPUEVSVFkgWEZBX0dldEVsZW1lbnRQcm9wZXJ0aWVzKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBpbnQzMl90ICZpQ291bnQpOw0KLVhGQV9MUENQUk9QRVJUWSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9FTEVNRU5UIGVQcm9wZXJ0eSwgRlhfRFdPUkQgZHdQYWNrZXQpOw0KKyAgRlhfV09SRCBlTmFtZTsNCisgIHVpbnQ4X3QgdU9jY3VyOw0KKyAgdWludDhfdCB1RmxhZ3M7DQorfSBYRkFfUFJPUEVSVFksICpYRkFfTFBQUk9QRVJUWTsNCit0eXBlZGVmIFhGQV9QUk9QRVJUWSBjb25zdCogWEZBX0xQQ1BST1BFUlRZOw0KK1hGQV9MUENQUk9QRVJUWSBYRkFfR2V0RWxlbWVudFByb3BlcnRpZXMoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIGludDMyX3QmIGlDb3VudCk7DQorWEZBX0xQQ1BST1BFUlRZIFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVQcm9wZXJ0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UGFja2V0KTsNCiB0eXBlZGVmIHN0cnVjdCBfWEZBX0FUVFJJQlVURUVOVU1JTkZPIHsNCi0gICAgdWludDMyX3QJCQkJCXVIYXNoOw0KLSAgICBjb25zdCBGWF9XQ0hBUioJCQkJCXBOYW1lOw0KLSAgICBYRkFfQVRUUklCVVRFRU5VTQkJCWVOYW1lOw0KLX0gWEZBX0FUVFJJQlVURUVOVU1JTkZPLCAqIFhGQV9MUEFUVFJJQlVURUVOVU1JTkZPOw0KLXR5cGVkZWYgWEZBX0FUVFJJQlVURUVOVU1JTkZPIGNvbnN0ICogWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPOw0KLVhGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBYRkFfR2V0QXR0cmlidXRlRW51bUJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSk7DQorICB1aW50MzJfdCB1SGFzaDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVOYW1lOw0KK30gWEZBX0FUVFJJQlVURUVOVU1JTkZPLCAqWEZBX0xQQVRUUklCVVRFRU5VTUlORk87DQordHlwZWRlZiBYRkFfQVRUUklCVVRFRU5VTUlORk8gY29uc3QqIFhGQV9MUENBVFRSSUJVVEVFTlVNSU5GTzsNCitYRkFfTFBDQVRUUklCVVRFRU5VTUlORk8gWEZBX0dldEF0dHJpYnV0ZUVudW1CeU5hbWUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsNCiBYRkFfTFBDQVRUUklCVVRFRU5VTUlORk8gWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKFhGQV9BVFRSSUJVVEVFTlVNIGVOYW1lKTsNCiBlbnVtIFhGQV9VTklUIHsNCi0gICAgWEZBX1VOSVRfVW5rbm93biwNCi0gICAgWEZBX1VOSVRfUGVyY2VudCwNCi0gICAgWEZBX1VOSVRfQW5nbGUsDQotICAgIFhGQV9VTklUX0VtLA0KLSAgICBYRkFfVU5JVF9QdCwNCi0gICAgWEZBX1VOSVRfSW4sDQotICAgIFhGQV9VTklUX1BjLA0KLSAgICBYRkFfVU5JVF9DbSwNCi0gICAgWEZBX1VOSVRfTW0sDQotICAgIFhGQV9VTklUX01wLA0KKyAgWEZBX1VOSVRfVW5rbm93biwNCisgIFhGQV9VTklUX1BlcmNlbnQsDQorICBYRkFfVU5JVF9BbmdsZSwNCisgIFhGQV9VTklUX0VtLA0KKyAgWEZBX1VOSVRfUHQsDQorICBYRkFfVU5JVF9JbiwNCisgIFhGQV9VTklUX1BjLA0KKyAgWEZBX1VOSVRfQ20sDQorICBYRkFfVU5JVF9NbSwNCisgIFhGQV9VTklUX01wLA0KIH07DQotY2xhc3MgQ1hGQV9NZWFzdXJlbWVudA0KLXsNCi1wdWJsaWM6DQotICAgIHZvaWQJCQkJCQlTZXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01lYXN1cmUpOw0KLSAgICB2b2lkCQkJCQkJU2V0KEZYX0ZMT0FUIGZWYWx1ZSwgWEZBX1VOSVQgZVVuaXQpDQotICAgIHsNCi0gICAgICAgIG1fZlZhbHVlID0gZlZhbHVlOw0KLSAgICAgICAgbV9lVW5pdCA9IGVVbml0Ow0KLSAgICB9DQorY2xhc3MgQ1hGQV9NZWFzdXJlbWVudCB7DQorIHB1YmxpYzoNCisgIHZvaWQgU2V0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZWFzdXJlKTsNCisgIHZvaWQgU2V0KEZYX0ZMT0FUIGZWYWx1ZSwgWEZBX1VOSVQgZVVuaXQpIHsNCisgICAgbV9mVmFsdWUgPSBmVmFsdWU7DQorICAgIG1fZVVuaXQgPSBlVW5pdDsNCisgIH0NCiANCi0gICAgWEZBX1VOSVQJCQkJCUdldFVuaXQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9lVW5pdDsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVAkJCQkJR2V0VmFsdWUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9mVmFsdWU7DQotICAgIH0NCi0gICAgRlhfQk9PTAkJCQkJCVRvU3RyaW5nKENGWF9XaWRlU3RyaW5nICZ3c01lYXN1cmUpIGNvbnN0Ow0KLSAgICBGWF9CT09MCQkJCQkJVG9Vbml0KFhGQV9VTklUIGVVbml0LCBGWF9GTE9BVCAmZlZhbHVlKSBjb25zdDsNCi0gICAgRlhfRkxPQVQJCQkJCVRvVW5pdChYRkFfVU5JVCBlVW5pdCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhfRkxPQVQgZjsNCi0gICAgICAgIHJldHVybiBUb1VuaXQoZVVuaXQsIGYpID8gZiA6IDA7DQotICAgIH0NCi0gICAgQ1hGQV9NZWFzdXJlbWVudCgpDQotICAgIHsNCi0gICAgICAgIFNldCgtMSwgWEZBX1VOSVRfVW5rbm93bik7DQotICAgIH0NCi0gICAgQ1hGQV9NZWFzdXJlbWVudChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVhc3VyZSkNCi0gICAgew0KLSAgICAgICAgU2V0KHdzTWVhc3VyZSk7DQotICAgIH0NCi0gICAgQ1hGQV9NZWFzdXJlbWVudChGWF9GTE9BVCBmVmFsdWUsIFhGQV9VTklUIGVVbml0KQ0KLSAgICB7DQotICAgICAgICBTZXQoZlZhbHVlLCBlVW5pdCk7DQotICAgIH0NCi0gICAgc3RhdGljIFhGQV9VTklUCQkJCUdldFVuaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VuaXQpOw0KLXByb3RlY3RlZDoNCi0gICAgRlhfRkxPQVQJCQkJCW1fZlZhbHVlOw0KLSAgICBYRkFfVU5JVAkJCQkJbV9lVW5pdDsNCisgIFhGQV9VTklUIEdldFVuaXQoKSBjb25zdCB7IHJldHVybiBtX2VVbml0OyB9DQorICBGWF9GTE9BVCBHZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZlZhbHVlOyB9DQorICBGWF9CT09MIFRvU3RyaW5nKENGWF9XaWRlU3RyaW5nJiB3c01lYXN1cmUpIGNvbnN0Ow0KKyAgRlhfQk9PTCBUb1VuaXQoWEZBX1VOSVQgZVVuaXQsIEZYX0ZMT0FUJiBmVmFsdWUpIGNvbnN0Ow0KKyAgRlhfRkxPQVQgVG9Vbml0KFhGQV9VTklUIGVVbml0KSBjb25zdCB7DQorICAgIEZYX0ZMT0FUIGY7DQorICAgIHJldHVybiBUb1VuaXQoZVVuaXQsIGYpID8gZiA6IDA7DQorICB9DQorICBDWEZBX01lYXN1cmVtZW50KCkgeyBTZXQoLTEsIFhGQV9VTklUX1Vua25vd24pOyB9DQorICBDWEZBX01lYXN1cmVtZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZWFzdXJlKSB7IFNldCh3c01lYXN1cmUpOyB9DQorICBDWEZBX01lYXN1cmVtZW50KEZYX0ZMT0FUIGZWYWx1ZSwgWEZBX1VOSVQgZVVuaXQpIHsgU2V0KGZWYWx1ZSwgZVVuaXQpOyB9DQorICBzdGF0aWMgWEZBX1VOSVQgR2V0VW5pdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVW5pdCk7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0ZMT0FUIG1fZlZhbHVlOw0KKyAgWEZBX1VOSVQgbV9lVW5pdDsNCiB9Ow0KIGNsYXNzIENGWEpTRV9Bcmd1bWVudHM7DQogY2xhc3MgQ1hGQV9PYmplY3Q7DQotdHlwZWRlZiB2b2lkIChDWEZBX09iamVjdDo6KlhGQV9NRVRIT0RfQ0FMTEJBQ0spIChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCit0eXBlZGVmIHZvaWQgKENYRkFfT2JqZWN0OjoqWEZBX01FVEhPRF9DQUxMQkFDSykoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQogdHlwZWRlZiBzdHJ1Y3QgX1hGQV9NRVRIT0RJTkZPIHsNCi0gICAgdWludDMyX3QJCQkJCXVIYXNoOw0KLSAgICBjb25zdCBGWF9XQ0hBUioJCQkJCXBOYW1lOw0KLSAgICBYRkFfTUVUSE9EX0NBTExCQUNLCQkJbHBmbkNhbGxiYWNrOw0KLX0gWEZBX01FVEhPRElORk8sICogWEZBX0xQTUVUSE9ESU5GTzsNCi10eXBlZGVmIFhGQV9NRVRIT0RJTkZPIGNvbnN0ICogWEZBX0xQQ01FVEhPRElORk87DQorICB1aW50MzJfdCB1SGFzaDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsNCisgIFhGQV9NRVRIT0RfQ0FMTEJBQ0sgbHBmbkNhbGxiYWNrOw0KK30gWEZBX01FVEhPRElORk8sICpYRkFfTFBNRVRIT0RJTkZPOw0KK3R5cGVkZWYgWEZBX01FVEhPRElORk8gY29uc3QqIFhGQV9MUENNRVRIT0RJTkZPOw0KIGludDMyX3QgWEZBX0dldE1ldGhvZENvdW50KCk7DQotWEZBX0xQQ01FVEhPRElORk8gWEZBX0dldE1ldGhvZEJ5TmFtZShYRkFfRUxFTUVOVCBlRWxlbWVudCwJY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01ldGhvZE5hbWUpOw0KLXR5cGVkZWYgdm9pZCAoQ1hGQV9PYmplY3Q6OipYRkFfQVRUUklCVVRFX0NBTExCQUNLKSAoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCitYRkFfTFBDTUVUSE9ESU5GTyBYRkFfR2V0TWV0aG9kQnlOYW1lKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01ldGhvZE5hbWUpOw0KK3R5cGVkZWYgdm9pZCAoQ1hGQV9PYmplY3Q6OipYRkFfQVRUUklCVVRFX0NBTExCQUNLKShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KIGVudW0gWEZBX1NDUklQVF9UWVBFIHsNCi0gICAgWEZBX1NDUklQVF9CYXNpYywNCi0gICAgWEZBX1NDUklQVF9PYmplY3QsDQorICBYRkFfU0NSSVBUX0Jhc2ljLA0KKyAgWEZBX1NDUklQVF9PYmplY3QsDQogfTsNCiB0eXBlZGVmIHN0cnVjdCBfWEZBX1NDUklQVEFUVFJJQlVURUlORk8gew0KLSAgICB1aW50MzJfdAkJCQkJCXVIYXNoOw0KLSAgICBjb25zdCBGWF9XQ0hBUioJCQkJCQlwTmFtZTsNCi0gICAgWEZBX0FUVFJJQlVURV9DQUxMQkFDSwkJCWxwZm5DYWxsYmFjazsNCi0gICAgaW50MzJfdAkJCQkJCWVBdHRyaWJ1dGU7DQotICAgIEZYX1dPUkQJCQkJCQkJZVZhbHVlVHlwZTsNCi19IFhGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPLCAqIFhGQV9MUFNDUklQVEFUVFJJQlVURUlORk87DQotdHlwZWRlZiBYRkFfU0NSSVBUQVRUUklCVVRFSU5GTyBjb25zdCAqIFhGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPOw0KLVhGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPIFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyaWJ1dGVOYW1lKTsNCisgIHVpbnQzMl90IHVIYXNoOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBOYW1lOw0KKyAgWEZBX0FUVFJJQlVURV9DQUxMQkFDSyBscGZuQ2FsbGJhY2s7DQorICBpbnQzMl90IGVBdHRyaWJ1dGU7DQorICBGWF9XT1JEIGVWYWx1ZVR5cGU7DQorfSBYRkFfU0NSSVBUQVRUUklCVVRFSU5GTywgKlhGQV9MUFNDUklQVEFUVFJJQlVURUlORk87DQordHlwZWRlZiBYRkFfU0NSSVBUQVRUUklCVVRFSU5GTyBjb25zdCogWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk87DQorWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gWEZBX0dldFNjcmlwdEF0dHJpYnV0ZUJ5TmFtZSgNCisgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyaWJ1dGVOYW1lKTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9meGZhL2Z4ZmFfb2JqZWN0YWNjLmggYi94ZmEvaW5jbHVkZS9meGZhL2Z4ZmFfb2JqZWN0YWNjLmgKaW5kZXggYjA5ZTM3MC4uZjkwZmNhMyAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZnhmYS9meGZhX29iamVjdGFjYy5oCisrKyBiL3hmYS9pbmNsdWRlL2Z4ZmEvZnhmYV9vYmplY3RhY2MuaApAQCAtNDksODM3ICs0OSw3OTYgQEAKIGNsYXNzIENYRkFfRW5jcnlwdGlvbk1ldGhvZHM7DQogY2xhc3MgQ1hGQV9SZWFzb25zOw0KIGNsYXNzIENYRkFfTWFuaWZlc3Q7DQotaW5saW5lIEZYX0JPT0wgWEZBX0lzU3BhY2UoRlhfV0NIQVIgYykNCi17DQotICAgIHJldHVybiAoYyA9PSAweDIwKSB8fCAoYyA9PSAweDBkKSB8fCAoYyA9PSAweDBhKSB8fCAoYyA9PSAweDA5KTsNCitpbmxpbmUgRlhfQk9PTCBYRkFfSXNTcGFjZShGWF9XQ0hBUiBjKSB7DQorICByZXR1cm4gKGMgPT0gMHgyMCkgfHwgKGMgPT0gMHgwZCkgfHwgKGMgPT0gMHgwYSkgfHwgKGMgPT0gMHgwOSk7DQogfQ0KLWlubGluZSBGWF9CT09MIFhGQV9Jc0RpZ2l0KEZYX1dDSEFSIGMpDQotew0KLSAgICByZXR1cm4gYyA+PSAnMCcgJiYgYyA8PSAnOSc7DQoraW5saW5lIEZYX0JPT0wgWEZBX0lzRGlnaXQoRlhfV0NIQVIgYykgew0KKyAgcmV0dXJuIGMgPj0gJzAnICYmIGMgPD0gJzknOw0KIH0NCiB0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENYRkFfTm9kZSo+IENYRkFfTm9kZUFycmF5Ow0KIHR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9PYmplY3QqPiBDWEZBX09iakFycmF5Ow0KLWNsYXNzIENYRkFfRGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRGF0YShDWEZBX05vZGUqIHBOb2RlKSA6IG1fcE5vZGUocE5vZGUpIHt9DQotICAgIG9wZXJhdG9yIENYRkFfTm9kZSooKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wTm9kZTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqCUdldE5vZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wTm9kZTsNCi0gICAgfQ0KK2NsYXNzIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfRGF0YShDWEZBX05vZGUqIHBOb2RlKSA6IG1fcE5vZGUocE5vZGUpIHt9DQorICBvcGVyYXRvciBDWEZBX05vZGUqKCkgY29uc3QgeyByZXR1cm4gbV9wTm9kZTsgfQ0KKyAgQ1hGQV9Ob2RlKiBHZXROb2RlKCkgeyByZXR1cm4gbV9wTm9kZTsgfQ0KIA0KLSAgICBGWF9CT09MCQkJSXNFeGlzdEluWE1MKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcE5vZGUgIT0gTlVMTDsNCi0gICAgfQ0KKyAgRlhfQk9PTCBJc0V4aXN0SW5YTUwoKSBjb25zdCB7IHJldHVybiBtX3BOb2RlICE9IE5VTEw7IH0NCiANCi0gICAgWEZBX0VMRU1FTlQJCUdldENsYXNzSUQoKSBjb25zdDsNCi1wcm90ZWN0ZWQ6DQotICAgIEZYX0JPT0wgVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9GTE9BVCAmZlZhbHVlLCBGWF9CT09MIGJVc2VEZWZhdWx0ID0gRkFMU0UpIGNvbnN0Ow0KLSAgICBGWF9CT09MCVNldE1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfRkxPQVQgZlZhbHVlKTsNCi0gICAgQ1hGQV9Ob2RlKgkJCQltX3BOb2RlOw0KKyAgWEZBX0VMRU1FTlQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9CT09MIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBGQUxTRSkgY29uc3Q7DQorICBGWF9CT09MIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfRkxPQVQgZlZhbHVlKTsNCisgIENYRkFfTm9kZSogbV9wTm9kZTsNCiB9Ow0KLWNsYXNzIENYRkFfRmlsbCA6IHB1YmxpYyBDWEZBX0RhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZpbGwoQ1hGQV9Ob2RlKiBwTm9kZSk7DQotICAgIH5DWEZBX0ZpbGwoKTsNCitjbGFzcyBDWEZBX0ZpbGwgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GaWxsKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgfkNYRkFfRmlsbCgpOw0KIA0KLSAgICBpbnQzMl90CQlHZXRQcmVzZW5jZSgpOw0KKyAgaW50MzJfdCBHZXRQcmVzZW5jZSgpOw0KIA0KLSAgICBGWF9BUkdCCQkJR2V0Q29sb3IoRlhfQk9PTCBiVGV4dCA9IEZBTFNFKTsNCisgIEZYX0FSR0IgR2V0Q29sb3IoRlhfQk9PTCBiVGV4dCA9IEZBTFNFKTsNCiANCi0gICAgdm9pZAkJCVNldENvbG9yKEZYX0FSR0IgY29sb3IpOw0KKyAgdm9pZCBTZXRDb2xvcihGWF9BUkdCIGNvbG9yKTsNCiANCisgIGludDMyX3QgR2V0RmlsbFR5cGUoKTsNCiANCi0gICAgaW50MzJfdAkJR2V0RmlsbFR5cGUoKTsNCisgIGludDMyX3QgR2V0UGF0dGVybihGWF9BUkdCJiBmb3JlQ29sb3IpOw0KIA0KLSAgICBpbnQzMl90CQlHZXRQYXR0ZXJuKEZYX0FSR0ImIGZvcmVDb2xvcik7DQorICBpbnQzMl90IEdldFN0aXBwbGUoRlhfQVJHQiYgc3RpcHBsZUNvbG9yKTsNCiANCi0gICAgaW50MzJfdAkJR2V0U3RpcHBsZShGWF9BUkdCJiBzdGlwcGxlQ29sb3IpOw0KKyAgaW50MzJfdCBHZXRMaW5lYXIoRlhfQVJHQiYgZW5kQ29sb3IpOw0KIA0KLSAgICBpbnQzMl90CQlHZXRMaW5lYXIoRlhfQVJHQiYgZW5kQ29sb3IpOw0KLQ0KLSAgICBpbnQzMl90CQlHZXRSYWRpYWwoRlhfQVJHQiYgZW5kQ29sb3IpOw0KLSAgICBGWF9CT09MCQkJU2V0UHJlc2VuY2UoaW50MzJfdCBpUHJlc2VuY2UpOw0KLSAgICBGWF9CT09MCQkJU2V0RmlsbFR5cGUoaW50MzJfdCBpVHlwZSk7DQotICAgIEZYX0JPT0wJCQlTZXRQYXR0ZXJuKGludDMyX3QgaVBhdHRlcm4sIEZYX0FSR0IgZm9yZUNvbG9yKTsNCi0gICAgRlhfQk9PTAkJCVNldFN0aXBwbGUoaW50MzJfdCBpU3RpcHBsZSwgRlhfQVJHQiBzdGlwcGxlQ29sb3IpOw0KLSAgICBGWF9CT09MCQkJU2V0TGluZWFyKGludDMyX3QgaUxpbmVhciwgRlhfQVJHQiBlbmRDb2xvcik7DQotICAgIEZYX0JPT0wJCQlTZXRSYWRpYWwoaW50MzJfdCBpUmFkaWFsLCBGWF9BUkdCIGVuZENvbG9yKTsNCisgIGludDMyX3QgR2V0UmFkaWFsKEZYX0FSR0ImIGVuZENvbG9yKTsNCisgIEZYX0JPT0wgU2V0UHJlc2VuY2UoaW50MzJfdCBpUHJlc2VuY2UpOw0KKyAgRlhfQk9PTCBTZXRGaWxsVHlwZShpbnQzMl90IGlUeXBlKTsNCisgIEZYX0JPT0wgU2V0UGF0dGVybihpbnQzMl90IGlQYXR0ZXJuLCBGWF9BUkdCIGZvcmVDb2xvcik7DQorICBGWF9CT09MIFNldFN0aXBwbGUoaW50MzJfdCBpU3RpcHBsZSwgRlhfQVJHQiBzdGlwcGxlQ29sb3IpOw0KKyAgRlhfQk9PTCBTZXRMaW5lYXIoaW50MzJfdCBpTGluZWFyLCBGWF9BUkdCIGVuZENvbG9yKTsNCisgIEZYX0JPT0wgU2V0UmFkaWFsKGludDMyX3QgaVJhZGlhbCwgRlhfQVJHQiBlbmRDb2xvcik7DQogfTsNCi1jbGFzcyBDWEZBX01hcmdpbiA6IHB1YmxpYyBDWEZBX0RhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX01hcmdpbihDWEZBX05vZGUqIHBOb2RlKTsNCi0gICAgRlhfQk9PTAkJR2V0TGVmdEluc2V0KEZYX0ZMT0FUICZmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCA9IDApIGNvbnN0Ow0KLSAgICBGWF9CT09MCQlHZXRUb3BJbnNldChGWF9GTE9BVCAmZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQgPSAwKSBjb25zdDsNCi0gICAgRlhfQk9PTAkJR2V0UmlnaHRJbnNldChGWF9GTE9BVCAmZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQgPSAwKSBjb25zdDsNCi0gICAgRlhfQk9PTAkJR2V0Qm90dG9tSW5zZXQoRlhfRkxPQVQgJmZJbnNldCwgRlhfRkxPQVQgZkRlZkluc2V0ID0gMCkgY29uc3Q7DQotICAgIEZYX0JPT0wJCVNldExlZnRJbnNldChGWF9GTE9BVCBmSW5zZXQpOw0KLSAgICBGWF9CT09MCQlTZXRUb3BJbnNldChGWF9GTE9BVCBmSW5zZXQpOw0KLSAgICBGWF9CT09MCQlTZXRSaWdodEluc2V0KEZYX0ZMT0FUIGZJbnNldCk7DQotICAgIEZYX0JPT0wJCVNldEJvdHRvbUluc2V0KEZYX0ZMT0FUIGZJbnNldCk7DQorY2xhc3MgQ1hGQV9NYXJnaW4gOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9NYXJnaW4oQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBGWF9CT09MIEdldExlZnRJbnNldChGWF9GTE9BVCYgZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQgPSAwKSBjb25zdDsNCisgIEZYX0JPT0wgR2V0VG9wSW5zZXQoRlhfRkxPQVQmIGZJbnNldCwgRlhfRkxPQVQgZkRlZkluc2V0ID0gMCkgY29uc3Q7DQorICBGWF9CT09MIEdldFJpZ2h0SW5zZXQoRlhfRkxPQVQmIGZJbnNldCwgRlhfRkxPQVQgZkRlZkluc2V0ID0gMCkgY29uc3Q7DQorICBGWF9CT09MIEdldEJvdHRvbUluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCA9IDApIGNvbnN0Ow0KKyAgRlhfQk9PTCBTZXRMZWZ0SW5zZXQoRlhfRkxPQVQgZkluc2V0KTsNCisgIEZYX0JPT0wgU2V0VG9wSW5zZXQoRlhfRkxPQVQgZkluc2V0KTsNCisgIEZYX0JPT0wgU2V0UmlnaHRJbnNldChGWF9GTE9BVCBmSW5zZXQpOw0KKyAgRlhfQk9PTCBTZXRCb3R0b21JbnNldChGWF9GTE9BVCBmSW5zZXQpOw0KIH07DQotY2xhc3MgQ1hGQV9Gb250IDogcHVibGljIENYRkFfRGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRm9udChDWEZBX05vZGUqIHBOb2RlKTsNCitjbGFzcyBDWEZBX0ZvbnQgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9Gb250KENYRkFfTm9kZSogcE5vZGUpOw0KIA0KLSAgICBGWF9GTE9BVAkJR2V0QmFzZWxpbmVTaGlmdCgpOw0KKyAgRlhfRkxPQVQgR2V0QmFzZWxpbmVTaGlmdCgpOw0KIA0KLSAgICBGWF9GTE9BVAkJR2V0SG9yaXpvbnRhbFNjYWxlKCk7DQorICBGWF9GTE9BVCBHZXRIb3Jpem9udGFsU2NhbGUoKTsNCiANCi0gICAgRlhfRkxPQVQJCUdldFZlcnRpY2FsU2NhbGUoKTsNCisgIEZYX0ZMT0FUIEdldFZlcnRpY2FsU2NhbGUoKTsNCiANCi0gICAgRlhfRkxPQVQJCUdldExldHRlclNwYWNpbmcoKTsNCisgIEZYX0ZMT0FUIEdldExldHRlclNwYWNpbmcoKTsNCiANCi0gICAgaW50MzJfdAkJR2V0TGluZVRocm91Z2goKTsNCisgIGludDMyX3QgR2V0TGluZVRocm91Z2goKTsNCiANCi0gICAgaW50MzJfdAkJR2V0TGluZVRocm91Z2hQZXJpb2QoKTsNCisgIGludDMyX3QgR2V0TGluZVRocm91Z2hQZXJpb2QoKTsNCiANCi0gICAgaW50MzJfdAkJR2V0T3ZlcmxpbmUoKTsNCisgIGludDMyX3QgR2V0T3ZlcmxpbmUoKTsNCiANCi0gICAgaW50MzJfdAkJR2V0T3ZlcmxpbmVQZXJpb2QoKTsNCisgIGludDMyX3QgR2V0T3ZlcmxpbmVQZXJpb2QoKTsNCiANCi0gICAgaW50MzJfdAkJR2V0VW5kZXJsaW5lKCk7DQorICBpbnQzMl90IEdldFVuZGVybGluZSgpOw0KIA0KLSAgICBpbnQzMl90CQlHZXRVbmRlcmxpbmVQZXJpb2QoKTsNCisgIGludDMyX3QgR2V0VW5kZXJsaW5lUGVyaW9kKCk7DQogDQotICAgIEZYX0ZMT0FUCQlHZXRGb250U2l6ZSgpOw0KKyAgRlhfRkxPQVQgR2V0Rm9udFNpemUoKTsNCiANCi0gICAgdm9pZAkJCUdldFR5cGVmYWNlKENGWF9XaWRlU3RyaW5nQyAmd3NUeXBlRmFjZSk7DQorICB2b2lkIEdldFR5cGVmYWNlKENGWF9XaWRlU3RyaW5nQyYgd3NUeXBlRmFjZSk7DQogDQotICAgIEZYX0JPT0wJCQlJc0JvbGQoKTsNCisgIEZYX0JPT0wgSXNCb2xkKCk7DQogDQotICAgIEZYX0JPT0wJCQlJc0l0YWxpYygpOw0KKyAgRlhfQk9PTCBJc0l0YWxpYygpOw0KIA0KLSAgICBGWF9CT09MCQkJSXNVc2VLZXJuaW5nKCk7DQorICBGWF9CT09MIElzVXNlS2VybmluZygpOw0KIA0KLSAgICBGWF9BUkdCCQkJR2V0Q29sb3IoKTsNCisgIEZYX0FSR0IgR2V0Q29sb3IoKTsNCiANCi0gICAgdm9pZAkJCVNldENvbG9yKEZYX0FSR0IgY29sb3IpOw0KLSAgICBGWF9CT09MCQkJU2V0QmFzZWxpbmVTaGlmdChGWF9GTE9BVCBmQmFzZWxpbmVTaGlmdCk7DQotICAgIEZYX0JPT0wJCQlTZXRIb3Jpem9udGFsU2NhbGUoRlhfRkxPQVQgZkhvcml6b250YWxTY2FsZSk7DQotICAgIEZYX0JPT0wJCQlTZXRWZXJ0aWNhbFNjYWxlKEZYX0ZMT0FUIGZWZXJ0aWNhbFNjYWxlKTsNCi0gICAgRlhfQk9PTAkJCVNldExldHRlclNwYWNpbmcoRlhfRkxPQVQgZkxldHRlclNwYWNpbmcsIFhGQV9VTklUIGVVbml0KTsNCi0gICAgRlhfQk9PTAkJCVNldExpbmVUaHJvdWdoKGludDMyX3QgaUxpbmVUaHJvdWdoKTsNCi0gICAgRlhfQk9PTAkJCVNldExpbmVUaHJvdWdoUGVyaW9kKGludDMyX3QgaUxpbmVUaHJvdWdoUGVyaW9kKTsNCi0gICAgRlhfQk9PTAkJCVNldE92ZXJsaW5lKGludDMyX3QgaU92ZXJsaW5lKTsNCi0gICAgRlhfQk9PTAkJCVNldE92ZXJsaW5lUGVyaW9kKGludDMyX3QgaU92ZXJsaW5lUGVyaW9kKTsNCi0gICAgRlhfQk9PTAkJCVNldFVuZGVybGluZShpbnQzMl90IGlVbmRlcmxpbmUpOw0KLSAgICBGWF9CT09MCQkJU2V0VW5kZXJsaW5lUGVyaW9kKGludDMyX3QgaVVuZGVybGluZVBlcmlvZCk7DQorICB2b2lkIFNldENvbG9yKEZYX0FSR0IgY29sb3IpOw0KKyAgRlhfQk9PTCBTZXRCYXNlbGluZVNoaWZ0KEZYX0ZMT0FUIGZCYXNlbGluZVNoaWZ0KTsNCisgIEZYX0JPT0wgU2V0SG9yaXpvbnRhbFNjYWxlKEZYX0ZMT0FUIGZIb3Jpem9udGFsU2NhbGUpOw0KKyAgRlhfQk9PTCBTZXRWZXJ0aWNhbFNjYWxlKEZYX0ZMT0FUIGZWZXJ0aWNhbFNjYWxlKTsNCisgIEZYX0JPT0wgU2V0TGV0dGVyU3BhY2luZyhGWF9GTE9BVCBmTGV0dGVyU3BhY2luZywgWEZBX1VOSVQgZVVuaXQpOw0KKyAgRlhfQk9PTCBTZXRMaW5lVGhyb3VnaChpbnQzMl90IGlMaW5lVGhyb3VnaCk7DQorICBGWF9CT09MIFNldExpbmVUaHJvdWdoUGVyaW9kKGludDMyX3QgaUxpbmVUaHJvdWdoUGVyaW9kKTsNCisgIEZYX0JPT0wgU2V0T3ZlcmxpbmUoaW50MzJfdCBpT3ZlcmxpbmUpOw0KKyAgRlhfQk9PTCBTZXRPdmVybGluZVBlcmlvZChpbnQzMl90IGlPdmVybGluZVBlcmlvZCk7DQorICBGWF9CT09MIFNldFVuZGVybGluZShpbnQzMl90IGlVbmRlcmxpbmUpOw0KKyAgRlhfQk9PTCBTZXRVbmRlcmxpbmVQZXJpb2QoaW50MzJfdCBpVW5kZXJsaW5lUGVyaW9kKTsNCiB9Ow0KLWNsYXNzIENYRkFfQ2FwdGlvbiA6IHB1YmxpYyBDWEZBX0RhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX0NhcHRpb24oQ1hGQV9Ob2RlKiBwTm9kZSk7DQorY2xhc3MgQ1hGQV9DYXB0aW9uIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfQ2FwdGlvbihDWEZBX05vZGUqIHBOb2RlKTsNCiANCi0gICAgaW50MzJfdAkJR2V0UHJlc2VuY2UoKTsNCisgIGludDMyX3QgR2V0UHJlc2VuY2UoKTsNCiANCi0gICAgaW50MzJfdAkJR2V0UGxhY2VtZW50VHlwZSgpOw0KKyAgaW50MzJfdCBHZXRQbGFjZW1lbnRUeXBlKCk7DQogDQotICAgIEZYX0ZMT0FUCQlHZXRSZXNlcnZlKCk7DQorICBGWF9GTE9BVCBHZXRSZXNlcnZlKCk7DQogDQotICAgIENYRkFfTWFyZ2luCQlHZXRNYXJnaW4oKTsNCisgIENYRkFfTWFyZ2luIEdldE1hcmdpbigpOw0KIA0KLSAgICBDWEZBX0ZvbnQJCUdldEZvbnQoKTsNCisgIENYRkFfRm9udCBHZXRGb250KCk7DQogDQotICAgIENYRkFfVmFsdWUJCUdldFZhbHVlKCk7DQorICBDWEZBX1ZhbHVlIEdldFZhbHVlKCk7DQogDQotICAgIENYRkFfUGFyYQkJR2V0UGFyYSgpOw0KLSAgICBGWF9CT09MCQkJU2V0UHJlc2VuY2UoaW50MzJfdCBpUHJlc2VuY2UpOw0KLSAgICBGWF9CT09MCQkJU2V0UGxhY2VtZW50VHlwZShpbnQzMl90IGlUeXBlKTsNCi0gICAgRlhfQk9PTAkJCVNldFJlc2VydmUoRlhfRkxPQVQgZlJlc2VydmUpOw0KKyAgQ1hGQV9QYXJhIEdldFBhcmEoKTsNCisgIEZYX0JPT0wgU2V0UHJlc2VuY2UoaW50MzJfdCBpUHJlc2VuY2UpOw0KKyAgRlhfQk9PTCBTZXRQbGFjZW1lbnRUeXBlKGludDMyX3QgaVR5cGUpOw0KKyAgRlhfQk9PTCBTZXRSZXNlcnZlKEZYX0ZMT0FUIGZSZXNlcnZlKTsNCiB9Ow0KLWNsYXNzIENYRkFfUGFyYSA6IHB1YmxpYyBDWEZBX0RhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX1BhcmEoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorY2xhc3MgQ1hGQV9QYXJhIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfUGFyYShDWEZBX05vZGUqIHBOb2RlKTsNCiANCi0gICAgaW50MzJfdAkJR2V0SG9yaXpvbnRhbEFsaWduKCk7DQorICBpbnQzMl90IEdldEhvcml6b250YWxBbGlnbigpOw0KIA0KLSAgICBpbnQzMl90CQlHZXRWZXJ0aWNhbEFsaWduKCk7DQorICBpbnQzMl90IEdldFZlcnRpY2FsQWxpZ24oKTsNCiANCi0gICAgRlhfRkxPQVQJCUdldExpbmVIZWlnaHQoKTsNCi0gICAgRlhfRkxPQVQJCUdldE1hcmdpbkxlZnQoKTsNCi0gICAgRlhfRkxPQVQJCUdldE1hcmdpblJpZ2h0KCk7DQotICAgIGludDMyX3QJCUdldE9ycGhhbnMoKTsNCi0gICAgRlhfRkxPQVQJCUdldFJhZGl4T2Zmc2V0KCk7DQotICAgIEZYX0ZMT0FUCQlHZXRTcGFjZUFib3ZlKCk7DQotICAgIEZYX0ZMT0FUCQlHZXRTcGFjZUJlbG93KCk7DQotICAgIEZYX0ZMT0FUCQlHZXRUZXh0SW5kZW50KCk7DQotICAgIGludDMyX3QJCUdldFdpZG93cygpOw0KLSAgICBGWF9CT09MCQkJU2V0SG9yaXpvbnRhbEFsaWduKGludDMyX3QgaUhvcml6b250YWxBbGlnbik7DQotICAgIEZYX0JPT0wJCQlTZXRWZXJ0aWNhbEFsaWduKGludDMyX3QgaVZlcnRpY2FsQWxpZ24pOw0KLSAgICBGWF9CT09MCQkJU2V0TGluZUhlaWdodChGWF9GTE9BVCBmTGluZUhlaWdodCk7DQotICAgIEZYX0JPT0wJCQlTZXRNYXJnaW5MZWZ0KEZYX0ZMT0FUIGZNYXJnaW5MZWZ0KTsNCi0gICAgRlhfQk9PTAkJCVNldE1hcmdpblJpZ2h0KEZYX0ZMT0FUIGZNYXJnaW5SaWdodCk7DQotICAgIEZYX0JPT0wJCQlTZXRPcnBoYW5zKGludDMyX3QgaU9ycGhhbnMpOw0KLSAgICBGWF9CT09MCQkJU2V0UmFkaXhPZmZzZXQoRlhfRkxPQVQgZlJhZGl4T2Zmc2V0KTsNCi0gICAgRlhfQk9PTAkJCVNldFNwYWNlQWJvdmUoRlhfRkxPQVQgZlNwYWNlQWJvdmUpOw0KLSAgICBGWF9CT09MCQkJU2V0U3BhY2VCZWxvdyhGWF9GTE9BVCBmU3BhY2VCZWxvdyk7DQotICAgIEZYX0JPT0wJCQlTZXRUZXh0SW5kZW50KEZYX0ZMT0FUIGZUZXh0SW5kZW50KTsNCi0gICAgRlhfQk9PTAkJCVNldFdpZG93cyhpbnQzMl90IGlXaWRvd3MpOw0KKyAgRlhfRkxPQVQgR2V0TGluZUhlaWdodCgpOw0KKyAgRlhfRkxPQVQgR2V0TWFyZ2luTGVmdCgpOw0KKyAgRlhfRkxPQVQgR2V0TWFyZ2luUmlnaHQoKTsNCisgIGludDMyX3QgR2V0T3JwaGFucygpOw0KKyAgRlhfRkxPQVQgR2V0UmFkaXhPZmZzZXQoKTsNCisgIEZYX0ZMT0FUIEdldFNwYWNlQWJvdmUoKTsNCisgIEZYX0ZMT0FUIEdldFNwYWNlQmVsb3coKTsNCisgIEZYX0ZMT0FUIEdldFRleHRJbmRlbnQoKTsNCisgIGludDMyX3QgR2V0V2lkb3dzKCk7DQorICBGWF9CT09MIFNldEhvcml6b250YWxBbGlnbihpbnQzMl90IGlIb3Jpem9udGFsQWxpZ24pOw0KKyAgRlhfQk9PTCBTZXRWZXJ0aWNhbEFsaWduKGludDMyX3QgaVZlcnRpY2FsQWxpZ24pOw0KKyAgRlhfQk9PTCBTZXRMaW5lSGVpZ2h0KEZYX0ZMT0FUIGZMaW5lSGVpZ2h0KTsNCisgIEZYX0JPT0wgU2V0TWFyZ2luTGVmdChGWF9GTE9BVCBmTWFyZ2luTGVmdCk7DQorICBGWF9CT09MIFNldE1hcmdpblJpZ2h0KEZYX0ZMT0FUIGZNYXJnaW5SaWdodCk7DQorICBGWF9CT09MIFNldE9ycGhhbnMoaW50MzJfdCBpT3JwaGFucyk7DQorICBGWF9CT09MIFNldFJhZGl4T2Zmc2V0KEZYX0ZMT0FUIGZSYWRpeE9mZnNldCk7DQorICBGWF9CT09MIFNldFNwYWNlQWJvdmUoRlhfRkxPQVQgZlNwYWNlQWJvdmUpOw0KKyAgRlhfQk9PTCBTZXRTcGFjZUJlbG93KEZYX0ZMT0FUIGZTcGFjZUJlbG93KTsNCisgIEZYX0JPT0wgU2V0VGV4dEluZGVudChGWF9GTE9BVCBmVGV4dEluZGVudCk7DQorICBGWF9CT09MIFNldFdpZG93cyhpbnQzMl90IGlXaWRvd3MpOw0KIH07DQotY2xhc3MgQ1hGQV9LZWVwIDogcHVibGljIENYRkFfRGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfS2VlcChDWEZBX05vZGUgKnBOb2RlLCBDWEZBX05vZGUgKnBQYXJlbnQpOw0KK2NsYXNzIENYRkFfS2VlcCA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0tlZXAoQ1hGQV9Ob2RlKiBwTm9kZSwgQ1hGQV9Ob2RlKiBwUGFyZW50KTsNCiANCi0gICAgaW50MzJfdAkJR2V0SW50YWN0KCk7DQotICAgIGludDMyX3QJCUdldE5leHQoKTsNCi0gICAgaW50MzJfdAkJR2V0UHJldmlvdXMoKTsNCi0gICAgRlhfQk9PTAkJCVNldEludGFjdChpbnQzMl90IGlJbnRhY3QpOw0KLSAgICBGWF9CT09MCQkJU2V0TmV4dChpbnQzMl90IGlOZXh0KTsNCi0gICAgRlhfQk9PTAkJCVNldFByZXZpb3VzKGludDMyX3QgaVByZXZpb3VzKTsNCi1wcml2YXRlOg0KLSAgICBDWEZBX05vZGUJCSptX3BQYXJlbnQ7DQorICBpbnQzMl90IEdldEludGFjdCgpOw0KKyAgaW50MzJfdCBHZXROZXh0KCk7DQorICBpbnQzMl90IEdldFByZXZpb3VzKCk7DQorICBGWF9CT09MIFNldEludGFjdChpbnQzMl90IGlJbnRhY3QpOw0KKyAgRlhfQk9PTCBTZXROZXh0KGludDMyX3QgaU5leHQpOw0KKyAgRlhfQk9PTCBTZXRQcmV2aW91cyhpbnQzMl90IGlQcmV2aW91cyk7DQorDQorIHByaXZhdGU6DQorICBDWEZBX05vZGUqIG1fcFBhcmVudDsNCiB9Ow0KIGVudW0gWEZBX1RFWFRFTkNPRElORyB7DQotICAgIFhGQV9URVhURU5DT0RJTkdfTm9uZSwNCi0gICAgWEZBX1RFWFRFTkNPRElOR19CaWc1LA0KLSAgICBYRkFfVEVYVEVOQ09ESU5HX0ZvbnRTcGVjaWZpYywNCi0gICAgWEZBX1RFWFRFTkNPRElOR19HQkssDQotICAgIFhGQV9URVhURU5DT0RJTkdfR0IxODAzMCwNCi0gICAgWEZBX1RFWFRFTkNPRElOR19HQjIzMTIsDQotICAgIFhGQV9URVhURU5DT0RJTkdfSVNPODg1OU5OLA0KLSAgICBYRkFfVEVYVEVOQ09ESU5HX0tTQzU2MDEsDQotICAgIFhGQV9URVhURU5DT0RJTkdfU2hpZnRKSVMsDQotICAgIFhGQV9URVhURU5DT0RJTkdfVUNTMiwNCi0gICAgWEZBX1RFWFRFTkNPRElOR19VVEYxNiwNCi0gICAgWEZBX1RFWFRFTkNPRElOR19VVEY4DQorICBYRkFfVEVYVEVOQ09ESU5HX05vbmUsDQorICBYRkFfVEVYVEVOQ09ESU5HX0JpZzUsDQorICBYRkFfVEVYVEVOQ09ESU5HX0ZvbnRTcGVjaWZpYywNCisgIFhGQV9URVhURU5DT0RJTkdfR0JLLA0KKyAgWEZBX1RFWFRFTkNPRElOR19HQjE4MDMwLA0KKyAgWEZBX1RFWFRFTkNPRElOR19HQjIzMTIsDQorICBYRkFfVEVYVEVOQ09ESU5HX0lTTzg4NTlOTiwNCisgIFhGQV9URVhURU5DT0RJTkdfS1NDNTYwMSwNCisgIFhGQV9URVhURU5DT0RJTkdfU2hpZnRKSVMsDQorICBYRkFfVEVYVEVOQ09ESU5HX1VDUzIsDQorICBYRkFfVEVYVEVOQ09ESU5HX1VURjE2LA0KKyAgWEZBX1RFWFRFTkNPRElOR19VVEY4DQogfTsNCi1jbGFzcyBDWEZBX0V2ZW50IDogcHVibGljIENYRkFfRGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRXZlbnQoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorY2xhc3MgQ1hGQV9FdmVudCA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0V2ZW50KENYRkFfTm9kZSogcE5vZGUpOw0KIA0KKyAgaW50MzJfdCBHZXRBY3Rpdml0eSgpOw0KIA0KLSAgICBpbnQzMl90CQkJR2V0QWN0aXZpdHkoKTsNCisgIGludDMyX3QgR2V0RXZlbnRUeXBlKCk7DQorICB2b2lkIEdldFJlZihDRlhfV2lkZVN0cmluZ0MmIHdzUmVmKTsNCiANCi0gICAgaW50MzJfdAkJCUdldEV2ZW50VHlwZSgpOw0KLSAgICB2b2lkCQkJCUdldFJlZihDRlhfV2lkZVN0cmluZ0MgJndzUmVmKTsNCisgIGludDMyX3QgR2V0RXhlY3V0ZVJ1bkF0KCk7DQorICBpbnQzMl90IEdldEV4ZWN1dGVUeXBlKCk7DQorICB2b2lkIEdldEV4ZWN1dGVDb25uZWN0aW9uKENGWF9XaWRlU3RyaW5nJiB3c0Nvbm5lY3Rpb24pOw0KIA0KLSAgICBpbnQzMl90CQkJR2V0RXhlY3V0ZVJ1bkF0KCk7DQotICAgIGludDMyX3QJCQlHZXRFeGVjdXRlVHlwZSgpOw0KLSAgICB2b2lkCQkJCUdldEV4ZWN1dGVDb25uZWN0aW9uKENGWF9XaWRlU3RyaW5nICZ3c0Nvbm5lY3Rpb24pOw0KKyAgQ1hGQV9TY3JpcHQgR2V0U2NyaXB0KCk7DQogDQorICBDWEZBX1N1Ym1pdCBHZXRTdWJtaXQoKTsNCiANCi0gICAgQ1hGQV9TY3JpcHQJCQlHZXRTY3JpcHQoKTsNCi0NCi0NCi0gICAgQ1hGQV9TdWJtaXQJCQlHZXRTdWJtaXQoKTsNCi0NCi0NCi0gICAgaW50MzJfdAkJCUdldFNpZ25EYXRhT3BlcmF0aW9uKCk7DQotICAgIHZvaWQJCQkJR2V0U2lnbkRhdGFUYXJnZXQoQ0ZYX1dpZGVTdHJpbmcgJndzVGFyZ2V0KTsNCi0gICAgRlhfQk9PTAkJCQlTZXRBY3Rpdml0eShpbnQzMl90IGlBY3Rpdml0eSk7DQotICAgIEZYX0JPT0wJCQkJU2V0RXZlbnRUeXBlKGludDMyX3QgaUV2ZW50VHlwZSk7DQotICAgIEZYX0JPT0wJCQkJU2V0RXhlY3V0ZVJ1bkF0KGludDMyX3QgaUV4ZWN1dGVSdW5BdCk7DQotICAgIEZYX0JPT0wJCQkJU2V0RXhlY3V0ZVR5cGUoaW50MzJfdCBpRXhlY3V0ZVR5cGUpOw0KLSAgICBGWF9CT09MCQkJCVNldEV4ZWN1dGVDb25uZWN0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Nvbm5lY3Rpb24pOw0KLSAgICBGWF9CT09MCQkJCVNldFNpZ25EYXRhT3BlcmF0aW9uKGludDMyX3QgaU9wZXJhdGlvbik7DQotICAgIEZYX0JPT0wJCQkJU2V0U2lnbkRhdGFUYXJnZXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KTsNCisgIGludDMyX3QgR2V0U2lnbkRhdGFPcGVyYXRpb24oKTsNCisgIHZvaWQgR2V0U2lnbkRhdGFUYXJnZXQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KTsNCisgIEZYX0JPT0wgU2V0QWN0aXZpdHkoaW50MzJfdCBpQWN0aXZpdHkpOw0KKyAgRlhfQk9PTCBTZXRFdmVudFR5cGUoaW50MzJfdCBpRXZlbnRUeXBlKTsNCisgIEZYX0JPT0wgU2V0RXhlY3V0ZVJ1bkF0KGludDMyX3QgaUV4ZWN1dGVSdW5BdCk7DQorICBGWF9CT09MIFNldEV4ZWN1dGVUeXBlKGludDMyX3QgaUV4ZWN1dGVUeXBlKTsNCisgIEZYX0JPT0wgU2V0RXhlY3V0ZUNvbm5lY3Rpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29ubmVjdGlvbik7DQorICBGWF9CT09MIFNldFNpZ25EYXRhT3BlcmF0aW9uKGludDMyX3QgaU9wZXJhdGlvbik7DQorICBGWF9CT09MIFNldFNpZ25EYXRhVGFyZ2V0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCk7DQogfTsNCiBlbnVtIFhGQV9TQ1JJUFRUWVBFIHsNCi0gICAgWEZBX1NDUklQVFRZUEVfRm9ybWNhbGMgPSAwLA0KLSAgICBYRkFfU0NSSVBUVFlQRV9KYXZhc2NyaXB0LA0KLSAgICBYRkFfU0NSSVBUVFlQRV9Vbmtvd24sDQorICBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYyA9IDAsDQorICBYRkFfU0NSSVBUVFlQRV9KYXZhc2NyaXB0LA0KKyAgWEZBX1NDUklQVFRZUEVfVW5rb3duLA0KIH07DQotY2xhc3MgQ1hGQV9TY3JpcHQgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9TY3JpcHQoQ1hGQV9Ob2RlKiBwTm9kZSk7DQotICAgIHZvaWQJCQkJR2V0QmluZGluZyhDRlhfV2lkZVN0cmluZyAmd3NCaW5kaW5nKTsNCitjbGFzcyBDWEZBX1NjcmlwdCA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX1NjcmlwdChDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZvaWQgR2V0QmluZGluZyhDRlhfV2lkZVN0cmluZyYgd3NCaW5kaW5nKTsNCiANCi0gICAgWEZBX1NDUklQVFRZUEUJCUdldENvbnRlbnRUeXBlKCk7DQotICAgIGludDMyX3QJCQlHZXRSdW5BdCgpOw0KLSAgICB2b2lkCQkJCUdldEV4cHJlc3Npb24oQ0ZYX1dpZGVTdHJpbmcgJndzRXhwcmVzc2lvbik7DQotICAgIEZYX0JPT0wJCQkJU2V0QmluZGluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NCaW5kaW5nKTsNCi0gICAgRlhfQk9PTAkJCQlTZXRDb250ZW50VHlwZShYRkFfU0NSSVBUVFlQRSBlVHlwZSk7DQotICAgIEZYX0JPT0wJCQkJU2V0UnVuQXQoaW50MzJfdCBpUnVuQXQpOw0KLSAgICBGWF9CT09MCQkJCVNldEV4cHJlc3Npb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbik7DQorICBYRkFfU0NSSVBUVFlQRSBHZXRDb250ZW50VHlwZSgpOw0KKyAgaW50MzJfdCBHZXRSdW5BdCgpOw0KKyAgdm9pZCBHZXRFeHByZXNzaW9uKENGWF9XaWRlU3RyaW5nJiB3c0V4cHJlc3Npb24pOw0KKyAgRlhfQk9PTCBTZXRCaW5kaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0JpbmRpbmcpOw0KKyAgRlhfQk9PTCBTZXRDb250ZW50VHlwZShYRkFfU0NSSVBUVFlQRSBlVHlwZSk7DQorICBGWF9CT09MIFNldFJ1bkF0KGludDMyX3QgaVJ1bkF0KTsNCisgIEZYX0JPT0wgU2V0RXhwcmVzc2lvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NFeHByZXNzaW9uKTsNCiB9Ow0KLWNsYXNzIENYRkFfU3VibWl0IDogcHVibGljIENYRkFfRGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfU3VibWl0KENYRkFfTm9kZSogcE5vZGUpOw0KLSAgICBGWF9CT09MCQkJCUlzU3VibWl0RW1iZWRQREYoKTsNCi0gICAgaW50MzJfdAkJCUdldFN1Ym1pdEZvcm1hdCgpOw0KLSAgICB2b2lkCQkJCUdldFN1Ym1pdFRhcmdldChDRlhfV2lkZVN0cmluZ0MgJndzVGFyZ2V0KTsNCi0gICAgWEZBX1RFWFRFTkNPRElORwlHZXRTdWJtaXRUZXh0RW5jb2RpbmcoKTsNCi0gICAgdm9pZAkJCQlHZXRTdWJtaXRYRFBDb250ZW50KENGWF9XaWRlU3RyaW5nQyAmd3NDb250ZW50KTsNCi0gICAgRlhfQk9PTAkJCQlTZXRTdWJtaXRGb3JtYXQoaW50MzJfdCBpU3VibWl0Rm9ybWF0KTsNCi0gICAgRlhfQk9PTAkJCQlTZXRTdWJtaXRUYXJnZXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KTsNCi0gICAgRlhfQk9PTAkJCQlTZXRTdWJtaXRUZXh0RW5jb2RpbmcoWEZBX1RFWFRFTkNPRElORyBlVGV4dEVuY29kaW5nKTsNCi0gICAgRlhfQk9PTAkJCQlTZXRTdWJtaXRYRFBDb250ZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQpOw0KK2NsYXNzIENYRkFfU3VibWl0IDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfU3VibWl0KENYRkFfTm9kZSogcE5vZGUpOw0KKyAgRlhfQk9PTCBJc1N1Ym1pdEVtYmVkUERGKCk7DQorICBpbnQzMl90IEdldFN1Ym1pdEZvcm1hdCgpOw0KKyAgdm9pZCBHZXRTdWJtaXRUYXJnZXQoQ0ZYX1dpZGVTdHJpbmdDJiB3c1RhcmdldCk7DQorICBYRkFfVEVYVEVOQ09ESU5HIEdldFN1Ym1pdFRleHRFbmNvZGluZygpOw0KKyAgdm9pZCBHZXRTdWJtaXRYRFBDb250ZW50KENGWF9XaWRlU3RyaW5nQyYgd3NDb250ZW50KTsNCisgIEZYX0JPT0wgU2V0U3VibWl0Rm9ybWF0KGludDMyX3QgaVN1Ym1pdEZvcm1hdCk7DQorICBGWF9CT09MIFNldFN1Ym1pdFRhcmdldChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpOw0KKyAgRlhfQk9PTCBTZXRTdWJtaXRUZXh0RW5jb2RpbmcoWEZBX1RFWFRFTkNPRElORyBlVGV4dEVuY29kaW5nKTsNCisgIEZYX0JPT0wgU2V0U3VibWl0WERQQ29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50KTsNCiB9Ow0KLWNsYXNzIENYRkFfVmFsdWUgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9WYWx1ZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCitjbGFzcyBDWEZBX1ZhbHVlIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfVmFsdWUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQogDQotICAgIFhGQV9FTEVNRU5UCQlHZXRDaGlsZFZhbHVlQ2xhc3NJRCgpOw0KKyAgWEZBX0VMRU1FTlQgR2V0Q2hpbGRWYWx1ZUNsYXNzSUQoKTsNCiANCi0gICAgRlhfQk9PTAkJCUdldENoaWxkVmFsdWVDb250ZW50KENGWF9XaWRlU3RyaW5nICZ3c0NvbnRlbnQpOw0KLSAgICBDWEZBX0FyYwkJR2V0QXJjKCk7DQotICAgIENYRkFfTGluZQkJR2V0TGluZSgpOw0KLSAgICBDWEZBX1JlY3RhbmdsZQlHZXRSZWN0YW5nbGUoKTsNCi0gICAgQ1hGQV9UZXh0CQlHZXRUZXh0KCk7DQotICAgIENYRkFfRXhEYXRhCQlHZXRFeERhdGEoKTsNCi0gICAgQ1hGQV9JbWFnZQkJR2V0SW1hZ2UoKTsNCi0gICAgRlhfQk9PTAkJCVNldENoaWxkVmFsdWVDb250ZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFLCBYRkFfRUxFTUVOVCBpVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV04pOw0KKyAgRlhfQk9PTCBHZXRDaGlsZFZhbHVlQ29udGVudChDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50KTsNCisgIENYRkFfQXJjIEdldEFyYygpOw0KKyAgQ1hGQV9MaW5lIEdldExpbmUoKTsNCisgIENYRkFfUmVjdGFuZ2xlIEdldFJlY3RhbmdsZSgpOw0KKyAgQ1hGQV9UZXh0IEdldFRleHQoKTsNCisgIENYRkFfRXhEYXRhIEdldEV4RGF0YSgpOw0KKyAgQ1hGQV9JbWFnZSBHZXRJbWFnZSgpOw0KKyAgRlhfQk9PTCBTZXRDaGlsZFZhbHVlQ29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgaVR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOKTsNCiB9Ow0KLWNsYXNzIENYRkFfTGluZSA6IHB1YmxpYyBDWEZBX0RhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX0xpbmUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQotICAgIGludDMyX3QJCUdldEhhbmQoKTsNCi0gICAgRlhfQk9PTAkJCUdldFNsb3AoKTsNCi0gICAgQ1hGQV9FZGdlCQlHZXRFZGdlKCk7DQotICAgIEZYX0JPT0wJCQlTZXRIYW5kKGludDMyX3QgaUhhbmQpOw0KLSAgICBGWF9CT09MCQkJU2V0U2xvcChpbnQzMl90IGlTbG9wKTsNCitjbGFzcyBDWEZBX0xpbmUgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9MaW5lKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgaW50MzJfdCBHZXRIYW5kKCk7DQorICBGWF9CT09MIEdldFNsb3AoKTsNCisgIENYRkFfRWRnZSBHZXRFZGdlKCk7DQorICBGWF9CT09MIFNldEhhbmQoaW50MzJfdCBpSGFuZCk7DQorICBGWF9CT09MIFNldFNsb3AoaW50MzJfdCBpU2xvcCk7DQogfTsNCi1jbGFzcyBDWEZBX1RleHQgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9UZXh0KENYRkFfTm9kZSogcE5vZGUpOw0KLSAgICB2b2lkCQlHZXROYW1lKENGWF9XaWRlU3RyaW5nQyAmd3NOYW1lKTsNCi0gICAgaW50MzJfdAlHZXRNYXhDaGFycygpOw0KLSAgICB2b2lkCQlHZXRSaWQoQ0ZYX1dpZGVTdHJpbmdDICZ3c1JpZCk7DQotICAgIHZvaWQJCUdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIHZvaWQJCVNldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0LCBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCi0gICAgRlhfQk9PTAkJU2V0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lKTsNCi0gICAgRlhfQk9PTAkJU2V0TWF4Q2hhcnMoaW50MzJfdCBpTWF4Q2hhcnMpOw0KLSAgICBGWF9CT09MCQlTZXRSaWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmlkKTsNCitjbGFzcyBDWEZBX1RleHQgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9UZXh0KENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdm9pZCBHZXROYW1lKENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsNCisgIGludDMyX3QgR2V0TWF4Q2hhcnMoKTsNCisgIHZvaWQgR2V0UmlkKENGWF9XaWRlU3RyaW5nQyYgd3NSaWQpOw0KKyAgdm9pZCBHZXRDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdm9pZCBTZXRDb250ZW50KENGWF9XaWRlU3RyaW5nIHdzVGV4dCwgRlhfQk9PTCBiTm90aWZ5ID0gVFJVRSk7DQorICBGWF9CT09MIFNldE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSk7DQorICBGWF9CT09MIFNldE1heENoYXJzKGludDMyX3QgaU1heENoYXJzKTsNCisgIEZYX0JPT0wgU2V0UmlkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JpZCk7DQogfTsNCi1jbGFzcyBDWEZBX0V4RGF0YSA6IHB1YmxpYyBDWEZBX0RhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX0V4RGF0YShDWEZBX05vZGUqIHBOb2RlKTsNCi0gICAgdm9pZAkJR2V0Q29udGVudFR5cGUoQ0ZYX1dpZGVTdHJpbmdDICZ3c0NvbnRlbnRUeXBlKTsNCi0gICAgdm9pZAkJR2V0SHJlZihDRlhfV2lkZVN0cmluZ0MgJndzSHJlZik7DQotICAgIGludDMyX3QJR2V0TWF4TGVuZ3RoKCk7DQotICAgIHZvaWQJCUdldFJpZChDRlhfV2lkZVN0cmluZ0MgJndzUmlkKTsNCi0gICAgaW50MzJfdAlHZXRUcmFuc2ZlckVuY29kaW5nKCk7DQotICAgIHZvaWQJCUdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIEZYX0JPT0wJCVNldENvbnRlbnRUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlKTsNCi0gICAgRlhfQk9PTAkJU2V0SHJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NIcmVmKTsNCi0gICAgRlhfQk9PTAkJU2V0TWF4TGVuZ3RoKGludDMyX3QgaU1heExlbmd0aCk7DQotICAgIEZYX0JPT0wJCVNldFJpZChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSaWQpOw0KLSAgICBGWF9CT09MCQlTZXRUcmFuc2ZlckVuY29kaW5nKGludDMyX3QgaVRyYW5zZmVyRW5jb2RpbmcpOw0KLSAgICBGWF9CT09MCQlTZXRDb250ZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFLCAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UsIEZYX0JPT0wgYlN5bmNEYXRhID0gVFJVRSk7DQorY2xhc3MgQ1hGQV9FeERhdGEgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9FeERhdGEoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2b2lkIEdldENvbnRlbnRUeXBlKENGWF9XaWRlU3RyaW5nQyYgd3NDb250ZW50VHlwZSk7DQorICB2b2lkIEdldEhyZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c0hyZWYpOw0KKyAgaW50MzJfdCBHZXRNYXhMZW5ndGgoKTsNCisgIHZvaWQgR2V0UmlkKENGWF9XaWRlU3RyaW5nQyYgd3NSaWQpOw0KKyAgaW50MzJfdCBHZXRUcmFuc2ZlckVuY29kaW5nKCk7DQorICB2b2lkIEdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBGWF9CT09MIFNldENvbnRlbnRUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlKTsNCisgIEZYX0JPT0wgU2V0SHJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NIcmVmKTsNCisgIEZYX0JPT0wgU2V0TWF4TGVuZ3RoKGludDMyX3QgaU1heExlbmd0aCk7DQorICBGWF9CT09MIFNldFJpZChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSaWQpOw0KKyAgRlhfQk9PTCBTZXRUcmFuc2ZlckVuY29kaW5nKGludDMyX3QgaVRyYW5zZmVyRW5jb2RpbmcpOw0KKyAgRlhfQk9PTCBTZXRDb250ZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEgPSBUUlVFKTsNCiB9Ow0KLWNsYXNzIENYRkFfSW1hZ2UgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9JbWFnZShDWEZBX05vZGUqIHBOb2RlLCBGWF9CT09MIGJEZWZWYWx1ZSk7DQotICAgIGludDMyX3QJR2V0QXNwZWN0KCk7DQotICAgIEZYX0JPT0wJCUdldENvbnRlbnRUeXBlKENGWF9XaWRlU3RyaW5nICZ3c0NvbnRlbnRUeXBlKTsNCi0gICAgRlhfQk9PTAkJR2V0SHJlZihDRlhfV2lkZVN0cmluZyAmd3NIcmVmKTsNCi0gICAgaW50MzJfdAlHZXRUcmFuc2ZlckVuY29kaW5nKCk7DQotICAgIEZYX0JPT0wJCUdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIEZYX0JPT0wJCVNldEFzcGVjdChpbnQzMl90IGlBc3BlY3QpOw0KLSAgICBGWF9CT09MCQlTZXRDb250ZW50VHlwZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSk7DQotICAgIEZYX0JPT0wJCVNldEhyZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSHJlZik7DQotICAgIEZYX0JPT0wJCVNldFRyYW5zZmVyRW5jb2RpbmcoaW50MzJfdCBpVHJhbnNmZXJFbmNvZGluZyk7DQotICAgIEZYX0JPT0wJCVNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9CT09MCQltX2JEZWZWYWx1ZTsNCitjbGFzcyBDWEZBX0ltYWdlIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfSW1hZ2UoQ1hGQV9Ob2RlKiBwTm9kZSwgRlhfQk9PTCBiRGVmVmFsdWUpOw0KKyAgaW50MzJfdCBHZXRBc3BlY3QoKTsNCisgIEZYX0JPT0wgR2V0Q29udGVudFR5cGUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUpOw0KKyAgRlhfQk9PTCBHZXRIcmVmKENGWF9XaWRlU3RyaW5nJiB3c0hyZWYpOw0KKyAgaW50MzJfdCBHZXRUcmFuc2ZlckVuY29kaW5nKCk7DQorICBGWF9CT09MIEdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBGWF9CT09MIFNldEFzcGVjdChpbnQzMl90IGlBc3BlY3QpOw0KKyAgRlhfQk9PTCBTZXRDb250ZW50VHlwZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSk7DQorICBGWF9CT09MIFNldEhyZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSHJlZik7DQorICBGWF9CT09MIFNldFRyYW5zZmVyRW5jb2RpbmcoaW50MzJfdCBpVHJhbnNmZXJFbmNvZGluZyk7DQorICBGWF9CT09MIFNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0JPT0wgbV9iRGVmVmFsdWU7DQogfTsNCi1jbGFzcyBDWEZBX0NhbGN1bGF0ZSA6IHB1YmxpYyBDWEZBX0RhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX0NhbGN1bGF0ZShDWEZBX05vZGUqIHBOb2RlKTsNCitjbGFzcyBDWEZBX0NhbGN1bGF0ZSA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0NhbGN1bGF0ZShDWEZBX05vZGUqIHBOb2RlKTsNCiANCi0gICAgaW50MzJfdAkJR2V0T3ZlcnJpZGUoKTsNCi0gICAgQ1hGQV9TY3JpcHQJCUdldFNjcmlwdCgpOw0KLSAgICB2b2lkCQkJR2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzTWVzc2FnZSk7DQotICAgIEZYX0JPT0wJCQlTZXRPdmVycmlkZShpbnQzMl90IGlPdmVycmlkZSk7DQotICAgIEZYX0JPT0wJCQlTZXRNZXNzYWdlVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlKTsNCisgIGludDMyX3QgR2V0T3ZlcnJpZGUoKTsNCisgIENYRkFfU2NyaXB0IEdldFNjcmlwdCgpOw0KKyAgdm9pZCBHZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlKTsNCisgIEZYX0JPT0wgU2V0T3ZlcnJpZGUoaW50MzJfdCBpT3ZlcnJpZGUpOw0KKyAgRlhfQk9PTCBTZXRNZXNzYWdlVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlKTsNCiB9Ow0KLWNsYXNzIENYRkFfVmFsaWRhdGUgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9WYWxpZGF0ZShDWEZBX05vZGUqIHBOb2RlKTsNCi0gICAgaW50MzJfdAlHZXRGb3JtYXRUZXN0KCk7DQotICAgIEZYX0JPT0wJCVNldEZvcm1hdFRlc3QoQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSk7DQotICAgIGludDMyX3QJR2V0TnVsbFRlc3QoKTsNCi0gICAgRlhfQk9PTAkJU2V0TnVsbFRlc3QoQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSk7DQotICAgIGludDMyX3QJR2V0U2NyaXB0VGVzdCgpOw0KLSAgICB2b2lkCQkJR2V0Rm9ybWF0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzTWVzc2FnZSk7DQotICAgIHZvaWQJCQlTZXRGb3JtYXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpOw0KLSAgICB2b2lkCQkJR2V0TnVsbE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nICZ3c01lc3NhZ2UpOw0KLSAgICB2b2lkCQkJU2V0TnVsbE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSk7DQotICAgIHZvaWQJCQlHZXRTY3JpcHRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlKTsNCi0gICAgdm9pZAkJCVNldFNjcmlwdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSk7DQotICAgIHZvaWQJCQlHZXRQaWN0dXJlKENGWF9XaWRlU3RyaW5nICZ3c1BpY3R1cmUpOw0KLSAgICBDWEZBX1NjcmlwdAkJR2V0U2NyaXB0KCk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQlHZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVzc2FnZVR5cGUpOw0KLSAgICB2b2lkCQlTZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVzc2FnZVR5cGUpOw0KLSAgICBGWF9CT09MCQlTZXRUZXN0VmFsdWUoaW50MzJfdCBpVHlwZSwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIFhGQV9BVFRSSUJVVEVFTlVNIGVOYW1lKTsNCitjbGFzcyBDWEZBX1ZhbGlkYXRlIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfVmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBpbnQzMl90IEdldEZvcm1hdFRlc3QoKTsNCisgIEZYX0JPT0wgU2V0Rm9ybWF0VGVzdChDRlhfV2lkZVN0cmluZyB3c1ZhbHVlKTsNCisgIGludDMyX3QgR2V0TnVsbFRlc3QoKTsNCisgIEZYX0JPT0wgU2V0TnVsbFRlc3QoQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSk7DQorICBpbnQzMl90IEdldFNjcmlwdFRlc3QoKTsNCisgIHZvaWQgR2V0Rm9ybWF0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSk7DQorICB2b2lkIFNldEZvcm1hdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSk7DQorICB2b2lkIEdldE51bGxNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlKTsNCisgIHZvaWQgU2V0TnVsbE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSk7DQorICB2b2lkIEdldFNjcmlwdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UpOw0KKyAgdm9pZCBTZXRTY3JpcHRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpOw0KKyAgdm9pZCBHZXRQaWN0dXJlKENGWF9XaWRlU3RyaW5nJiB3c1BpY3R1cmUpOw0KKyAgQ1hGQV9TY3JpcHQgR2V0U2NyaXB0KCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgR2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01lc3NhZ2VUeXBlKTsNCisgIHZvaWQgU2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01lc3NhZ2VUeXBlKTsNCisgIEZYX0JPT0wgU2V0VGVzdFZhbHVlKGludDMyX3QgaVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVOYW1lKTsNCiB9Ow0KLWNsYXNzIENYRkFfVmFyaWFibGVzIDogcHVibGljIENYRkFfRGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfVmFyaWFibGVzKENYRkFfTm9kZSogcE5vZGUpOw0KK2NsYXNzIENYRkFfVmFyaWFibGVzIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfVmFyaWFibGVzKENYRkFfTm9kZSogcE5vZGUpOw0KIA0KLSAgICBpbnQzMl90CUNvdW50U2NyaXB0cygpOw0KLSAgICBDWEZBX1NjcmlwdAlHZXRTY3JpcHQoaW50MzJfdCBuSW5kZXgpOw0KKyAgaW50MzJfdCBDb3VudFNjcmlwdHMoKTsNCisgIENYRkFfU2NyaXB0IEdldFNjcmlwdChpbnQzMl90IG5JbmRleCk7DQogfTsNCi1jbGFzcyBDWEZBX0JpbmQgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9CaW5kKENYRkFfTm9kZSogcE5vZGUpOw0KLSAgICBpbnQzMl90CUdldE1hdGNoKCk7DQotICAgIHZvaWQJCUdldFJlZihDRlhfV2lkZVN0cmluZ0MgJndzUmVmKTsNCi0gICAgdm9pZAkJR2V0UGljdHVyZShDRlhfV2lkZVN0cmluZyAmd3NQaWN0dXJlKTsNCi0gICAgRlhfQk9PTAkJU2V0TWF0Y2goaW50MzJfdCBpTWF0Y2gpOw0KLSAgICBGWF9CT09MCQlTZXRSZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVmKTsNCi0gICAgRlhfQk9PTAkJU2V0UGljdHVyZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQaWN0dXJlKTsNCitjbGFzcyBDWEZBX0JpbmQgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9CaW5kKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgaW50MzJfdCBHZXRNYXRjaCgpOw0KKyAgdm9pZCBHZXRSZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlZik7DQorICB2b2lkIEdldFBpY3R1cmUoQ0ZYX1dpZGVTdHJpbmcmIHdzUGljdHVyZSk7DQorICBGWF9CT09MIFNldE1hdGNoKGludDMyX3QgaU1hdGNoKTsNCisgIEZYX0JPT0wgU2V0UmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlZik7DQorICBGWF9CT09MIFNldFBpY3R1cmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGljdHVyZSk7DQogfTsNCi1jbGFzcyBDWEZBX0Fzc2lzdCA6IHB1YmxpYyBDWEZBX0RhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX0Fzc2lzdChDWEZBX05vZGUqIHBOb2RlKTsNCitjbGFzcyBDWEZBX0Fzc2lzdCA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0Fzc2lzdChDWEZBX05vZGUqIHBOb2RlKTsNCiANCi0gICAgQ1hGQV9Ub29sVGlwCUdldFRvb2xUaXAoKTsNCisgIENYRkFfVG9vbFRpcCBHZXRUb29sVGlwKCk7DQogfTsNCi1jbGFzcyBDWEZBX1Rvb2xUaXAgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9Ub29sVGlwKENYRkFfTm9kZSogcE5vZGUpOw0KLSAgICBGWF9CT09MIEdldFRpcChDRlhfV2lkZVN0cmluZyAmd3NUaXApOw0KLSAgICBGWF9CT09MCVNldFRpcChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaXApOw0KK2NsYXNzIENYRkFfVG9vbFRpcCA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX1Rvb2xUaXAoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBGWF9CT09MIEdldFRpcChDRlhfV2lkZVN0cmluZyYgd3NUaXApOw0KKyAgRlhfQk9PTCBTZXRUaXAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGlwKTsNCiB9Ow0KLWNsYXNzIENYRkFfQmluZEl0ZW1zIDogcHVibGljIENYRkFfRGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfQmluZEl0ZW1zKENYRkFfTm9kZSogcE5vZGUpOw0KLSAgICB2b2lkIEdldENvbm5lY3Rpb24oQ0ZYX1dpZGVTdHJpbmdDICZ3c0Nvbm5lY3Rpb24pOw0KLSAgICB2b2lkIEdldExhYmVsUmVmKENGWF9XaWRlU3RyaW5nQyAmd3NMYWJlbFJlZik7DQotICAgIHZvaWQgR2V0VmFsdWVSZWYoQ0ZYX1dpZGVTdHJpbmdDICZ3c1ZhbHVlUmVmKTsNCi0gICAgdm9pZCBHZXRSZWYoQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlZik7DQotICAgIEZYX0JPT0wgU2V0Q29ubmVjdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb25uZWN0aW9uKTsNCi0gICAgRlhfQk9PTCBTZXRMYWJlbFJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMYWJlbFJlZik7DQotICAgIEZYX0JPT0wgU2V0VmFsdWVSZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWVSZWYpOw0KLSAgICBGWF9CT09MIFNldFJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZWYpOw0KK2NsYXNzIENYRkFfQmluZEl0ZW1zIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfQmluZEl0ZW1zKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdm9pZCBHZXRDb25uZWN0aW9uKENGWF9XaWRlU3RyaW5nQyYgd3NDb25uZWN0aW9uKTsNCisgIHZvaWQgR2V0TGFiZWxSZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsUmVmKTsNCisgIHZvaWQgR2V0VmFsdWVSZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlUmVmKTsNCisgIHZvaWQgR2V0UmVmKENGWF9XaWRlU3RyaW5nQyYgd3NSZWYpOw0KKyAgRlhfQk9PTCBTZXRDb25uZWN0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Nvbm5lY3Rpb24pOw0KKyAgRlhfQk9PTCBTZXRMYWJlbFJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMYWJlbFJlZik7DQorICBGWF9CT09MIFNldFZhbHVlUmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlUmVmKTsNCisgIEZYX0JPT0wgU2V0UmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlZik7DQogfTsNCi0jZGVmaW5lIFhGQV9TVFJPS0VfU0FNRVNUWUxFX05vUHJlc2VuY2UJMQ0KLSNkZWZpbmUgWEZBX1NUUk9LRV9TQU1FU1RZTEVfQ29ybmVyCQkyDQotY2xhc3MgQ1hGQV9TdHJva2UgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCisjZGVmaW5lIFhGQV9TVFJPS0VfU0FNRVNUWUxFX05vUHJlc2VuY2UgMQ0KKyNkZWZpbmUgWEZBX1NUUk9LRV9TQU1FU1RZTEVfQ29ybmVyIDINCitjbGFzcyBDWEZBX1N0cm9rZSA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX1N0cm9rZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCiANCi0gICAgQ1hGQV9TdHJva2UoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorICBGWF9CT09MIElzQ29ybmVyKCkgY29uc3QgeyByZXR1cm4gR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Nvcm5lcjsgfQ0KIA0KLSAgICBGWF9CT09MCQkJSXNDb3JuZXIoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Nvcm5lcjsNCi0gICAgfQ0KKyAgRlhfQk9PTCBJc0VkZ2UoKSBjb25zdCB7IHJldHVybiBHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRWRnZTsgfQ0KIA0KLSAgICBGWF9CT09MCQkJSXNFZGdlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FZGdlOw0KLSAgICB9DQorICBpbnQzMl90IEdldFByZXNlbmNlKCkgY29uc3Q7DQorICBGWF9CT09MIElzVmlzaWJsZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIEdldFByZXNlbmNlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZTsNCisgIH0NCiANCi0gICAgaW50MzJfdAkJR2V0UHJlc2VuY2UoKSBjb25zdDsNCi0gICAgRlhfQk9PTAkJCUlzVmlzaWJsZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBHZXRQcmVzZW5jZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGU7DQotICAgIH0NCisgIGludDMyX3QgR2V0Q2FwVHlwZSgpIGNvbnN0Ow0KIA0KLSAgICBpbnQzMl90CQlHZXRDYXBUeXBlKCkgY29uc3Q7DQorICBpbnQzMl90IEdldFN0cm9rZVR5cGUoKSBjb25zdDsNCiANCi0gICAgaW50MzJfdAkJR2V0U3Ryb2tlVHlwZSgpIGNvbnN0Ow0KKyAgRlhfRkxPQVQgR2V0VGhpY2tuZXNzKCkgY29uc3Q7DQorICBDWEZBX01lYXN1cmVtZW50IEdldE1TVGhpY2tuZXNzKCkgY29uc3Q7DQogDQotICAgIEZYX0ZMT0FUCQlHZXRUaGlja25lc3MoKSBjb25zdDsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBHZXRNU1RoaWNrbmVzcygpIGNvbnN0Ow0KKyAgdm9pZCBTZXRUaGlja25lc3MoRlhfRkxPQVQgZlRoaWNrbmVzcyk7DQorICB2b2lkIFNldE1TVGhpY2tuZXNzKENYRkFfTWVhc3VyZW1lbnQgbXNUaGlua25lc3MpOw0KIA0KLSAgICB2b2lkCQkJU2V0VGhpY2tuZXNzKEZYX0ZMT0FUIGZUaGlja25lc3MpOw0KLSAgICB2b2lkCQkJU2V0TVNUaGlja25lc3MoQ1hGQV9NZWFzdXJlbWVudCBtc1RoaW5rbmVzcyk7DQorICBGWF9BUkdCIEdldENvbG9yKCkgY29uc3Q7DQogDQotICAgIEZYX0FSR0IJCQlHZXRDb2xvcigpIGNvbnN0Ow0KKyAgdm9pZCBTZXRDb2xvcihGWF9BUkdCIGFyZ2IpOw0KIA0KLSAgICB2b2lkCQkJU2V0Q29sb3IoRlhfQVJHQiBhcmdiKTsNCisgIGludDMyX3QgR2V0Sm9pblR5cGUoKSBjb25zdDsNCiANCi0gICAgaW50MzJfdAkJR2V0Sm9pblR5cGUoKSBjb25zdDsNCisgIEZYX0JPT0wgSXNJbnZlcnRlZCgpIGNvbnN0Ow0KIA0KLSAgICBGWF9CT09MCQkJSXNJbnZlcnRlZCgpIGNvbnN0Ow0KKyAgRlhfRkxPQVQgR2V0UmFkaXVzKCkgY29uc3Q7DQogDQotICAgIEZYX0ZMT0FUCQlHZXRSYWRpdXMoKSBjb25zdDsNCi0NCi0gICAgRlhfQk9PTAkJCVNhbWVTdHlsZXMoQ1hGQV9TdHJva2Ugc3Ryb2tlLCBGWF9EV09SRCBkd0ZsYWdzID0gMCkgY29uc3Q7DQorICBGWF9CT09MIFNhbWVTdHlsZXMoQ1hGQV9TdHJva2Ugc3Ryb2tlLCBGWF9EV09SRCBkd0ZsYWdzID0gMCkgY29uc3Q7DQogfTsNCi1jbGFzcyBDWEZBX0Nvcm5lciA6IHB1YmxpYyBDWEZBX1N0cm9rZQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfQ29ybmVyKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9TdHJva2UocE5vZGUpIHt9DQorY2xhc3MgQ1hGQV9Db3JuZXIgOiBwdWJsaWMgQ1hGQV9TdHJva2Ugew0KKyBwdWJsaWM6DQorICBDWEZBX0Nvcm5lcihDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfU3Ryb2tlKHBOb2RlKSB7fQ0KIH07DQotY2xhc3MgQ1hGQV9FZGdlIDogcHVibGljIENYRkFfU3Ryb2tlDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9FZGdlKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9TdHJva2UocE5vZGUpIHt9DQorY2xhc3MgQ1hGQV9FZGdlIDogcHVibGljIENYRkFfU3Ryb2tlIHsNCisgcHVibGljOg0KKyAgQ1hGQV9FZGdlKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9TdHJva2UocE5vZGUpIHt9DQogfTsNCi10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENYRkFfU3Ryb2tlPglDWEZBX1N0cm9rZUFycmF5Ow0KLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9FZGdlPglDWEZBX0VkZ2VBcnJheTsNCi10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29ybmVyPglDWEZBX0Nvcm5lckFycmF5Ow0KLWNsYXNzIENYRkFfQm94IDogcHVibGljIENYRkFfRGF0YQ0KLXsNCi1wdWJsaWM6DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX1N0cm9rZT4gQ1hGQV9TdHJva2VBcnJheTsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENYRkFfRWRnZT4gQ1hGQV9FZGdlQXJyYXk7DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0Nvcm5lcj4gQ1hGQV9Db3JuZXJBcnJheTsNCitjbGFzcyBDWEZBX0JveCA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0JveChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCiANCi0gICAgQ1hGQV9Cb3goQ1hGQV9Ob2RlICpwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorICBGWF9CT09MIElzQXJjKCkgY29uc3QgeyByZXR1cm4gR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0FyYzsgfQ0KIA0KLSAgICBGWF9CT09MCQkJSXNBcmMoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0FyYzsNCi0gICAgfQ0KKyAgRlhfQk9PTCBJc0JvcmRlcigpIGNvbnN0IHsgcmV0dXJuIEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Cb3JkZXI7IH0NCiANCi0gICAgRlhfQk9PTAkJCUlzQm9yZGVyKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Cb3JkZXI7DQotICAgIH0NCisgIEZYX0JPT0wgSXNSZWN0YW5nbGUoKSBjb25zdCB7IHJldHVybiBHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUmVjdGFuZ2xlOyB9DQogDQotICAgIEZYX0JPT0wJCQlJc1JlY3RhbmdsZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUmVjdGFuZ2xlOw0KLSAgICB9DQorICBpbnQzMl90IEdldEJyZWFrKCkgY29uc3Q7DQogDQotICAgIGludDMyX3QJCUdldEJyZWFrKCkgY29uc3Q7DQorICBpbnQzMl90IEdldEhhbmQoKSBjb25zdDsNCiANCi0gICAgaW50MzJfdAkJR2V0SGFuZCgpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXRQcmVzZW5jZSgpIGNvbnN0Ow0KIA0KLSAgICBpbnQzMl90CQlHZXRQcmVzZW5jZSgpIGNvbnN0Ow0KKyAgaW50MzJfdCBDb3VudENvcm5lcnMoKSBjb25zdDsNCiANCi0gICAgaW50MzJfdAkJQ291bnRDb3JuZXJzKCkgY29uc3Q7DQorICBDWEZBX0Nvcm5lciBHZXRDb3JuZXIoaW50MzJfdCBuSW5kZXgpIGNvbnN0Ow0KIA0KLSAgICBDWEZBX0Nvcm5lcgkJR2V0Q29ybmVyKGludDMyX3QgbkluZGV4KSBjb25zdDsNCisgIGludDMyX3QgQ291bnRFZGdlcygpIGNvbnN0Ow0KIA0KLSAgICBpbnQzMl90CQlDb3VudEVkZ2VzKCkgY29uc3Q7DQorICBDWEZBX0VkZ2UgR2V0RWRnZShpbnQzMl90IG5JbmRleCA9IDApIGNvbnN0Ow0KIA0KLSAgICBDWEZBX0VkZ2UJCUdldEVkZ2UoaW50MzJfdCBuSW5kZXggPSAwKSBjb25zdDsNCisgIHZvaWQgR2V0U3Ryb2tlcyhDWEZBX1N0cm9rZUFycmF5JiBzdHJva2VzKSBjb25zdDsNCiANCi0gICAgdm9pZAkJCUdldFN0cm9rZXMoQ1hGQV9TdHJva2VBcnJheSAmc3Ryb2tlcykgY29uc3Q7DQorICBGWF9CT09MIElzQ2lyY3VsYXIoKSBjb25zdDsNCiANCi0gICAgRlhfQk9PTAkJCUlzQ2lyY3VsYXIoKSBjb25zdDsNCisgIEZYX0JPT0wgR2V0U3RhcnRBbmdsZShGWF9GTE9BVCYgZlN0YXJ0QW5nbGUpIGNvbnN0Ow0KKyAgRlhfRkxPQVQgR2V0U3RhcnRBbmdsZSgpIGNvbnN0IHsNCisgICAgRlhfRkxPQVQgZlN0YXJ0QW5nbGU7DQorICAgIEdldFN0YXJ0QW5nbGUoZlN0YXJ0QW5nbGUpOw0KKyAgICByZXR1cm4gZlN0YXJ0QW5nbGU7DQorICB9DQogDQotICAgIEZYX0JPT0wJCQlHZXRTdGFydEFuZ2xlKEZYX0ZMT0FUICZmU3RhcnRBbmdsZSkgY29uc3Q7DQotICAgIEZYX0ZMT0FUCQlHZXRTdGFydEFuZ2xlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhfRkxPQVQgZlN0YXJ0QW5nbGU7DQotICAgICAgICBHZXRTdGFydEFuZ2xlKGZTdGFydEFuZ2xlKTsNCi0gICAgICAgIHJldHVybiBmU3RhcnRBbmdsZTsNCi0gICAgfQ0KKyAgRlhfQk9PTCBHZXRTd2VlcEFuZ2xlKEZYX0ZMT0FUJiBmU3dlZXBBbmdsZSkgY29uc3Q7DQorICBGWF9GTE9BVCBHZXRTd2VlcEFuZ2xlKCkgY29uc3Qgew0KKyAgICBGWF9GTE9BVCBmU3dlZXBBbmdsZTsNCisgICAgR2V0U3dlZXBBbmdsZShmU3dlZXBBbmdsZSk7DQorICAgIHJldHVybiBmU3dlZXBBbmdsZTsNCisgIH0NCiANCi0gICAgRlhfQk9PTAkJCUdldFN3ZWVwQW5nbGUoRlhfRkxPQVQgJmZTd2VlcEFuZ2xlKSBjb25zdDsNCi0gICAgRlhfRkxPQVQJCUdldFN3ZWVwQW5nbGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICBGWF9GTE9BVCBmU3dlZXBBbmdsZTsNCi0gICAgICAgIEdldFN3ZWVwQW5nbGUoZlN3ZWVwQW5nbGUpOw0KLSAgICAgICAgcmV0dXJuIGZTd2VlcEFuZ2xlOw0KLSAgICB9DQorICBDWEZBX0ZpbGwgR2V0RmlsbChGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKSBjb25zdDsNCiANCi0gICAgQ1hGQV9GaWxsCQlHZXRGaWxsKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpIGNvbnN0Ow0KKyAgQ1hGQV9NYXJnaW4gR2V0TWFyZ2luKCkgY29uc3Q7DQogDQotICAgIENYRkFfTWFyZ2luCQlHZXRNYXJnaW4oKSBjb25zdDsNCisgIEZYX0JPT0wgU2FtZVN0eWxlcygpIGNvbnN0Ow0KIA0KLSAgICBGWF9CT09MCQkJU2FtZVN0eWxlcygpIGNvbnN0Ow0KLQ0KLSAgICBpbnQzMl90CQlHZXQzRFN0eWxlKEZYX0JPT0wgJmJWaXNpYmxlLCBGWF9GTE9BVCAmZlRoaWNrbmVzcykgY29uc3Q7DQorICBpbnQzMl90IEdldDNEU3R5bGUoRlhfQk9PTCYgYlZpc2libGUsIEZYX0ZMT0FUJiBmVGhpY2tuZXNzKSBjb25zdDsNCiB9Ow0KLWNsYXNzIENYRkFfQXJjIDogcHVibGljIENYRkFfQm94DQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9BcmMoQ1hGQV9Ob2RlICpwTm9kZSkgOiBDWEZBX0JveChwTm9kZSkge30NCitjbGFzcyBDWEZBX0FyYyA6IHB1YmxpYyBDWEZBX0JveCB7DQorIHB1YmxpYzoNCisgIENYRkFfQXJjKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9Cb3gocE5vZGUpIHt9DQogfTsNCi1jbGFzcyBDWEZBX0JvcmRlciA6IHB1YmxpYyBDWEZBX0JveA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfQm9yZGVyKENYRkFfTm9kZSAqcE5vZGUpIDogQ1hGQV9Cb3gocE5vZGUpIHt9DQorY2xhc3MgQ1hGQV9Cb3JkZXIgOiBwdWJsaWMgQ1hGQV9Cb3ggew0KKyBwdWJsaWM6DQorICBDWEZBX0JvcmRlcihDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfQm94KHBOb2RlKSB7fQ0KIH07DQotY2xhc3MgQ1hGQV9SZWN0YW5nbGUgOiBwdWJsaWMgQ1hGQV9Cb3gNCi17DQotcHVibGljOg0KLSAgICBDWEZBX1JlY3RhbmdsZShDWEZBX05vZGUgKnBOb2RlKSA6IENYRkFfQm94KHBOb2RlKSB7fQ0KK2NsYXNzIENYRkFfUmVjdGFuZ2xlIDogcHVibGljIENYRkFfQm94IHsNCisgcHVibGljOg0KKyAgQ1hGQV9SZWN0YW5nbGUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0JveChwTm9kZSkge30NCiB9Ow0KIGVudW0gWEZBX0NIRUNLU1RBVEUgew0KLSAgICBYRkFfQ0hFQ0tTVEFURV9PbiA9IDAsDQotICAgIFhGQV9DSEVDS1NUQVRFX09mZiA9IDEsDQotICAgIFhGQV9DSEVDS1NUQVRFX05ldXRyYWwgPSAyLA0KKyAgWEZBX0NIRUNLU1RBVEVfT24gPSAwLA0KKyAgWEZBX0NIRUNLU1RBVEVfT2ZmID0gMSwNCisgIFhGQV9DSEVDS1NUQVRFX05ldXRyYWwgPSAyLA0KIH07DQogZW51bSBYRkFfVkFMVUVQSUNUVVJFIHsNCi0gICAgWEZBX1ZBTFVFUElDVFVSRV9SYXcgPSAwLA0KLSAgICBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXksDQotICAgIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCwNCi0gICAgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCwNCisgIFhGQV9WQUxVRVBJQ1RVUkVfUmF3ID0gMCwNCisgIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSwNCisgIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCwNCisgIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQsDQogfTsNCi1jbGFzcyBDWEZBX1dpZGdldERhdGEgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9XaWRnZXREYXRhKENYRkFfTm9kZSAqcE5vZGUpOw0KLSAgICBDWEZBX05vZGUqICAgICAgICAgIEdldFVJQ2hpbGQoKTsNCitjbGFzcyBDWEZBX1dpZGdldERhdGEgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9XaWRnZXREYXRhKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgQ1hGQV9Ob2RlKiBHZXRVSUNoaWxkKCk7DQogDQotICAgIFhGQV9FTEVNRU5UICAgICAgICAgR2V0VUlUeXBlKCk7DQotICAgIENGWF9XaWRlU3RyaW5nICAgICAgR2V0UmF3VmFsdWUoKTsNCi0gICAgaW50MzJfdCAgICAgICAgICAgIEdldEFjY2VzcyhGWF9CT09MIGJUZW1wbGF0ZSA9IEZBTFNFKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRBY2Nlc3NLZXkoQ0ZYX1dpZGVTdHJpbmdDICZ3c0FjY2Vzc0tleSk7DQotICAgIGludDMyX3QgICAgICAgICAgICBHZXRBbmNob3JUeXBlKCk7DQotICAgIGludDMyX3QgICAgICAgICAgICBHZXRDb2xTcGFuKCk7DQotICAgIGludDMyX3QgICAgICAgICAgICBHZXRQcmVzZW5jZSgpOw0KLSAgICBpbnQzMl90ICAgICAgICAgICAgR2V0Um90YXRlKCk7DQotICAgIENYRkFfQm9yZGVyICAgICAgICAgR2V0Qm9yZGVyKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KLSAgICBDWEZBX0NhcHRpb24gICAgICAgIEdldENhcHRpb24oRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQotICAgIENYRkFfRm9udCAgICAgICAgICAgR2V0Rm9udChGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCi0gICAgQ1hGQV9NYXJnaW4gICAgICAgICBHZXRNYXJnaW4oRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQotICAgIENYRkFfUGFyYSAgICAgICAgICAgR2V0UGFyYShGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCi0gICAgQ1hGQV9LZWVwICAgICAgICAgICBHZXRLZWVwKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KLSAgICB2b2lkICAgICAgICAgICAgICAgIEdldEV2ZW50TGlzdChDWEZBX05vZGVBcnJheSAmZXZlbnRzKTsNCi0gICAgaW50MzJfdCAgICAgICAgICAgIEdldEV2ZW50QnlBY3Rpdml0eShpbnQzMl90IGlBY3Rpdml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgJmV2ZW50cywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNGb3JtUmVhZHkgPSBGQUxTRSk7DQotICAgIENYRkFfVmFsdWUgICAgICAgICAgR2V0RGVmYXVsdFZhbHVlKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KLSAgICBDWEZBX1ZhbHVlICAgICAgICAgIEdldEZvcm1WYWx1ZShGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCi0gICAgQ1hGQV9DYWxjdWxhdGUgICAgICBHZXRDYWxjdWxhdGUoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQotICAgIENYRkFfVmFsaWRhdGUgICAgICAgR2V0VmFsaWRhdGUoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQotICAgIENYRkFfVmFyaWFibGVzICAgICAgR2V0VmFyaWFibGVzKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KLSAgICBDWEZBX0JpbmQgICAgICAgICAgIEdldEJpbmQoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQotICAgIENYRkFfQXNzaXN0ICAgICAgICAgR2V0QXNzaXN0KEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KLSAgICB2b2lkICAgICAgICAgICAgICAgIEdldFJlbGV2YW50KENGWF9XaWRlU3RyaW5nQyAmd3NSZWxldmFudCk7DQotICAgIEZYX0RXT1JEICAgICAgICAgICAgR2V0UmVsZXZhbnRTdGF0dXMoKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRXaWR0aChGWF9GTE9BVCAmZldpZHRoKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRIZWlnaHQoRlhfRkxPQVQgJmZIZWlnaHQpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIEdldE1pbldpZHRoKEZYX0ZMT0FUICZmTWluV2lkdGgpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIEdldE1pbkhlaWdodChGWF9GTE9BVCAmZk1pbkhlaWdodCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgR2V0TWF4V2lkdGgoRlhfRkxPQVQgJmZNYXhXaWR0aCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgR2V0TWF4SGVpZ2h0KEZYX0ZMT0FUICZmTWF4SGVpZ2h0KTsNCi0gICAgQ1hGQV9CaW5kSXRlbXMgICAgICBHZXRCaW5kSXRlbXMoKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBTZXRBY2Nlc3MoaW50MzJfdCBpQWNjZXNzLCBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBTZXRBY2Nlc3NLZXkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQWNjZXNzS2V5KTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBTZXRBbmNob3JUeXBlKGludDMyX3QgaVR5cGUpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIFNldENvbFNwYW4oaW50MzJfdCBpQ29sU3Bhbik7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgU2V0UHJlc2VuY2UoaW50MzJfdCBpUHJlc2VuY2UpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIFNldFJvdGF0ZShpbnQzMl90IGlSb3RhdGUpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIFNldFJlbGV2YW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlbGV2YW50KTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBTZXRTdGF0dXMoRlhfRFdPUkQgZHdTdGF0dXMpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIFNldFdpZHRoKEZYX0ZMT0FUIGZXaWR0aCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgU2V0SGVpZ2h0KEZYX0ZMT0FUIGZIZWlnaHQpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIFNldE1pbldpZHRoKEZYX0ZMT0FUIGZNaW5XaWR0aCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgU2V0TWluSGVpZ2h0KEZYX0ZMT0FUIGZNaW5IZWlnaHQpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIFNldE1heFdpZHRoKEZYX0ZMT0FUIGZNYXhXaWR0aCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgU2V0TWF4SGVpZ2h0KEZYX0ZMT0FUIGZNYXhIZWlnaHQpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIFNldFBvcyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBTZXROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c05hbWUpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIFNldEJ1dHRvbkhpZ2hsaWdodChpbnQzMl90IGlCdXR0b25IaWdobGlnaHQpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIFNldEJ1dHRvblJvbGxvdmVyKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1JvbGxvdmVyLCBGWF9CT09MIGJSaWNoVGV4dCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgU2V0QnV0dG9uRG93bihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEb3duLCBGWF9CT09MIGJSaWNoVGV4dCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgU2V0Q2hlY2tCdXR0b25TaGFwZShpbnQzMl90IGlDaGVja0J1dHRvblNoYXBlKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBTZXRDaGVja0J1dHRvbk1hcmsoaW50MzJfdCBpQ2hlY2tCdXR0b25NYXJrKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBTZXRDaGVja0J1dHRvblNpemUoRlhfRkxPQVQgZkNoZWNrQnV0dG9uTWFyayk7DQotICAgIENYRkFfQm9yZGVyICAgICAgICAgR2V0VUlCb3JkZXIoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQotICAgIENYRkFfTWFyZ2luICAgICAgICAgR2V0VUlNYXJnaW4oRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgR2V0VUlNYXJnaW4oQ0ZYX1JlY3RGICZydFVJTWFyZ2luKTsNCi0gICAgaW50MzJfdCAgICAgICAgICAgIEdldEJ1dHRvbkhpZ2hsaWdodCgpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIEdldEJ1dHRvblJvbGxvdmVyKENGWF9XaWRlU3RyaW5nICZ3c1JvbGxvdmVyLCBGWF9CT09MICZiUmljaFRleHQpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIEdldEJ1dHRvbkRvd24oQ0ZYX1dpZGVTdHJpbmcgJndzRG93biwgRlhfQk9PTCAmYlJpY2hUZXh0KTsNCi0gICAgaW50MzJfdCAgICAgICAgICAgIEdldENoZWNrQnV0dG9uU2hhcGUoKTsNCi0gICAgaW50MzJfdCAgICAgICAgICAgIEdldENoZWNrQnV0dG9uTWFyaygpOw0KLSAgICBGWF9GTE9BVCAgICAgICAgICAgIEdldENoZWNrQnV0dG9uU2l6ZSgpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIElzQWxsb3dOZXV0cmFsKCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgSXNSYWRpb0J1dHRvbigpOw0KLSAgICBYRkFfQ0hFQ0tTVEFURSAgICAgIEdldENoZWNrU3RhdGUoKTsNCi0gICAgdm9pZCAgICAgICAgICAgICAgICBTZXRDaGVja1N0YXRlKFhGQV9DSEVDS1NUQVRFIGVDaGVja1N0YXRlLCBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCi0gICAgQ1hGQV9Ob2RlKiAgICAgICAgICBHZXRFeGNsR3JvdXBOb2RlKCk7DQotICAgIENYRkFfTm9kZSogICAgICAgICAgR2V0U2VsZWN0ZWRNZW1iZXIoKTsNCi0gICAgQ1hGQV9Ob2RlKiAgICAgICAgICBTZXRTZWxlY3RlZE1lbWJlcihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwgRlhfQk9PTCBiTm90aWZ5ID0gVFJVRSk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgU2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW5jRGF0YSA9IFRSVUUpOw0KLSAgICBDWEZBX05vZGUqICAgICAgICAgIEdldEV4Y2xHcm91cEZpcnN0TWVtYmVyKCk7DQotICAgIENYRkFfTm9kZSogICAgICAgICAgR2V0RXhjbEdyb3VwTmV4dE1lbWJlcihDWEZBX05vZGUqIHBOb2RlKTsNCi0gICAgaW50MzJfdCAgICAgICAgICAgIEdldENob2ljZUxpc3RDb21taXRPbigpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIElzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCk7DQotICAgIGludDMyX3QgICAgICAgICAgICBHZXRDaG9pY2VMaXN0T3BlbigpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIElzTGlzdEJveCgpOw0KLSAgICBpbnQzMl90ICAgICAgICAgICAgQ291bnRDaG9pY2VMaXN0SXRlbXMoRlhfQk9PTCBiU2F2ZVZhbHVlID0gRkFMU0UpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIEdldENob2ljZUxpc3RJdGVtKENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJTYXZlVmFsdWUgPSBGQUxTRSk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgR2V0Q2hvaWNlTGlzdEl0ZW1zKENGWF9XaWRlU3RyaW5nQXJyYXkgJndzVGV4dEFycmF5LCBGWF9CT09MIGJTYXZlVmFsdWUgPSBGQUxTRSk7DQotICAgIGludDMyX3QgICAgICAgICAgICBDb3VudFNlbGVjdGVkSXRlbXMoKTsNCi0gICAgaW50MzJfdCAgICAgICAgICAgIEdldFNlbGVjdGVkSXRlbShpbnQzMl90IG5JbmRleCA9IDApOw0KLSAgICB2b2lkICAgICAgICAgICAgICAgIEdldFNlbGVjdGVkSXRlbXMoQ0ZYX0ludDMyQXJyYXkgJmlTZWxBcnJheSk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKENGWF9XaWRlU3RyaW5nQXJyYXkgJndzU2VsVGV4dEFycmF5KTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRJdGVtU3RhdGUoaW50MzJfdCBuSW5kZXgpOw0KLSAgICB2b2lkICAgICAgICAgICAgICAgIFNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW5jRGF0YSA9IFRSVUUpOw0KLSAgICB2b2lkICAgICAgICAgICAgICAgIFNldFNlbGVjdGRJdGVtcyhDRlhfSW50MzJBcnJheSAmaVNlbEFycmF5LCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UsIEZYX0JPT0wgYlN5bmNEYXRhID0gVFJVRSk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgQ2xlYXJBbGxTZWxlY3Rpb25zKCk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgSW5zZXJ0SXRlbShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NMYWJlbCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCA9IC0xLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgR2V0SXRlbUxhYmVsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcgJndzTGFiZWwpOw0KLSAgICB2b2lkICAgICAgICAgICAgICAgIEdldEl0ZW1WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTGFiZWwsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBEZWxldGVJdGVtKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLCBGWF9CT09MIGJTeW5jRGF0YSA9IFRSVUUpOw0KLSAgICBpbnQzMl90ICAgICAgICAgICAgR2V0SG9yaXpvbnRhbFNjcm9sbFBvbGljeSgpOw0KLSAgICBpbnQzMl90ICAgICAgICAgICAgR2V0TnVtYmVyT2ZDZWxscygpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIElzRGF0ZVRpbWVFZGl0VXNlUGlja2VyKCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgR2V0UGljdHVyZUNvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcgJndzUGljdHVyZSwgWEZBX1ZBTFVFUElDVFVSRSBlUGljdHVyZSk7DQotICAgIElGWF9Mb2NhbGUqICAgICAgICAgR2V0TG9jYWwoKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRWYWx1ZShDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXROb3JtYWxpemVEYXRhVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlLCBDRlhfV2lkZVN0cmluZyAmd3NOb3JtYWxpemVWYWx1ZSk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgR2V0Rm9ybWF0RGF0YVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcgJndzRm9ybWF0ZWRWYWx1ZSk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgTm9ybWFsaXplTnVtU3RyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KLSAgICBDRlhfV2lkZVN0cmluZyAgICAgIEdldEJhcmNvZGVUeXBlKCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgR2V0QmFyY29kZUF0dHJpYnV0ZV9DaGFyRW5jb2RpbmcoaW50MzJfdCYgdmFsKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRCYXJjb2RlQXR0cmlidXRlX0NoZWNrc3VtKGludDMyX3QmIHZhbCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgR2V0QmFyY29kZUF0dHJpYnV0ZV9EYXRhTGVuZ3RoKGludDMyX3QmIHZhbCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgR2V0QmFyY29kZUF0dHJpYnV0ZV9TdGFydENoYXIoRlhfQ0hBUiYgdmFsKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRCYXJjb2RlQXR0cmlidXRlX0VuZENoYXIoRlhfQ0hBUiYgdmFsKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRCYXJjb2RlQXR0cmlidXRlX0VDTGV2ZWwoaW50MzJfdCYgdmFsKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRCYXJjb2RlQXR0cmlidXRlX01vZHVsZVdpZHRoKGludDMyX3QmIHZhbCk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgR2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVIZWlnaHQoaW50MzJfdCYgdmFsKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRCYXJjb2RlQXR0cmlidXRlX1ByaW50Q2hlY2tzdW0oRlhfQk9PTCYgdmFsKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRCYXJjb2RlQXR0cmlidXRlX1RleHRMb2NhdGlvbihpbnQzMl90JiB2YWwpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIEdldEJhcmNvZGVBdHRyaWJ1dGVfVHJ1bmNhdGUoRlhfQk9PTCYgdmFsKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRCYXJjb2RlQXR0cmlidXRlX1dpZGVOYXJyb3dSYXRpbyhGWF9GTE9BVCYgdmFsKTsNCi0gICAgdm9pZCAgICAgICAgICAgICAgICBHZXRQYXNzd29yZENoYXIoQ0ZYX1dpZGVTdHJpbmcgJndzUGFzc1dvcmQpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIElzQWxsb3dSaWNoVGV4dCgpOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIElzTXVsdGlMaW5lKCk7DQotICAgIGludDMyX3QgICAgICAgICAgICBHZXRWZXJ0aWNhbFNjcm9sbFBvbGljeSgpOw0KLSAgICBpbnQzMl90ICAgICAgICAgICAgR2V0TWF4Q2hhcnMoWEZBX0VMRU1FTlQmIGVUeXBlKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRGcmFjRGlnaXRzKGludDMyX3QgJmlGcmFjRGlnaXRzKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBHZXRMZWFkRGlnaXRzKGludDMyX3QgJmlMZWFkRGlnaXRzKTsNCi0gICAgQ1hGQV9GaWx0ZXIgICAgICAgICBHZXRGaWx0ZXIoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQotICAgIENYRkFfTWFuaWZlc3QgICAgICAgR2V0TWFuaWZlc3QoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICBYRkFfRUxFTUVOVCBHZXRVSVR5cGUoKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldFJhd1ZhbHVlKCk7DQorICBpbnQzMl90IEdldEFjY2VzcyhGWF9CT09MIGJUZW1wbGF0ZSA9IEZBTFNFKTsNCisgIEZYX0JPT0wgR2V0QWNjZXNzS2V5KENGWF9XaWRlU3RyaW5nQyYgd3NBY2Nlc3NLZXkpOw0KKyAgaW50MzJfdCBHZXRBbmNob3JUeXBlKCk7DQorICBpbnQzMl90IEdldENvbFNwYW4oKTsNCisgIGludDMyX3QgR2V0UHJlc2VuY2UoKTsNCisgIGludDMyX3QgR2V0Um90YXRlKCk7DQorICBDWEZBX0JvcmRlciBHZXRCb3JkZXIoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICBDWEZBX0NhcHRpb24gR2V0Q2FwdGlvbihGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfRm9udCBHZXRGb250KEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9NYXJnaW4gR2V0TWFyZ2luKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9QYXJhIEdldFBhcmEoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICBDWEZBX0tlZXAgR2V0S2VlcChGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIHZvaWQgR2V0RXZlbnRMaXN0KENYRkFfTm9kZUFycmF5JiBldmVudHMpOw0KKyAgaW50MzJfdCBHZXRFdmVudEJ5QWN0aXZpdHkoaW50MzJfdCBpQWN0aXZpdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSYgZXZlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNGb3JtUmVhZHkgPSBGQUxTRSk7DQorICBDWEZBX1ZhbHVlIEdldERlZmF1bHRWYWx1ZShGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfVmFsdWUgR2V0Rm9ybVZhbHVlKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9DYWxjdWxhdGUgR2V0Q2FsY3VsYXRlKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9WYWxpZGF0ZSBHZXRWYWxpZGF0ZShGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfVmFyaWFibGVzIEdldFZhcmlhYmxlcyhGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfQmluZCBHZXRCaW5kKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9Bc3Npc3QgR2V0QXNzaXN0KEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgdm9pZCBHZXRSZWxldmFudChDRlhfV2lkZVN0cmluZ0MmIHdzUmVsZXZhbnQpOw0KKyAgRlhfRFdPUkQgR2V0UmVsZXZhbnRTdGF0dXMoKTsNCisgIEZYX0JPT0wgR2V0V2lkdGgoRlhfRkxPQVQmIGZXaWR0aCk7DQorICBGWF9CT09MIEdldEhlaWdodChGWF9GTE9BVCYgZkhlaWdodCk7DQorICBGWF9CT09MIEdldE1pbldpZHRoKEZYX0ZMT0FUJiBmTWluV2lkdGgpOw0KKyAgRlhfQk9PTCBHZXRNaW5IZWlnaHQoRlhfRkxPQVQmIGZNaW5IZWlnaHQpOw0KKyAgRlhfQk9PTCBHZXRNYXhXaWR0aChGWF9GTE9BVCYgZk1heFdpZHRoKTsNCisgIEZYX0JPT0wgR2V0TWF4SGVpZ2h0KEZYX0ZMT0FUJiBmTWF4SGVpZ2h0KTsNCisgIENYRkFfQmluZEl0ZW1zIEdldEJpbmRJdGVtcygpOw0KKyAgRlhfQk9PTCBTZXRBY2Nlc3MoaW50MzJfdCBpQWNjZXNzLCBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCisgIEZYX0JPT0wgU2V0QWNjZXNzS2V5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0FjY2Vzc0tleSk7DQorICBGWF9CT09MIFNldEFuY2hvclR5cGUoaW50MzJfdCBpVHlwZSk7DQorICBGWF9CT09MIFNldENvbFNwYW4oaW50MzJfdCBpQ29sU3Bhbik7DQorICBGWF9CT09MIFNldFByZXNlbmNlKGludDMyX3QgaVByZXNlbmNlKTsNCisgIEZYX0JPT0wgU2V0Um90YXRlKGludDMyX3QgaVJvdGF0ZSk7DQorICBGWF9CT09MIFNldFJlbGV2YW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlbGV2YW50KTsNCisgIEZYX0JPT0wgU2V0U3RhdHVzKEZYX0RXT1JEIGR3U3RhdHVzKTsNCisgIEZYX0JPT0wgU2V0V2lkdGgoRlhfRkxPQVQgZldpZHRoKTsNCisgIEZYX0JPT0wgU2V0SGVpZ2h0KEZYX0ZMT0FUIGZIZWlnaHQpOw0KKyAgRlhfQk9PTCBTZXRNaW5XaWR0aChGWF9GTE9BVCBmTWluV2lkdGgpOw0KKyAgRlhfQk9PTCBTZXRNaW5IZWlnaHQoRlhfRkxPQVQgZk1pbkhlaWdodCk7DQorICBGWF9CT09MIFNldE1heFdpZHRoKEZYX0ZMT0FUIGZNYXhXaWR0aCk7DQorICBGWF9CT09MIFNldE1heEhlaWdodChGWF9GTE9BVCBmTWF4SGVpZ2h0KTsNCisgIEZYX0JPT0wgU2V0UG9zKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOw0KKyAgRlhfQk9PTCBTZXROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c05hbWUpOw0KKyAgRlhfQk9PTCBTZXRCdXR0b25IaWdobGlnaHQoaW50MzJfdCBpQnV0dG9uSGlnaGxpZ2h0KTsNCisgIEZYX0JPT0wgU2V0QnV0dG9uUm9sbG92ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUm9sbG92ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJpY2hUZXh0KTsNCisgIEZYX0JPT0wgU2V0QnV0dG9uRG93bihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEb3duLCBGWF9CT09MIGJSaWNoVGV4dCk7DQorICBGWF9CT09MIFNldENoZWNrQnV0dG9uU2hhcGUoaW50MzJfdCBpQ2hlY2tCdXR0b25TaGFwZSk7DQorICBGWF9CT09MIFNldENoZWNrQnV0dG9uTWFyayhpbnQzMl90IGlDaGVja0J1dHRvbk1hcmspOw0KKyAgRlhfQk9PTCBTZXRDaGVja0J1dHRvblNpemUoRlhfRkxPQVQgZkNoZWNrQnV0dG9uTWFyayk7DQorICBDWEZBX0JvcmRlciBHZXRVSUJvcmRlcihGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfTWFyZ2luIEdldFVJTWFyZ2luKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgdm9pZCBHZXRVSU1hcmdpbihDRlhfUmVjdEYmIHJ0VUlNYXJnaW4pOw0KKyAgaW50MzJfdCBHZXRCdXR0b25IaWdobGlnaHQoKTsNCisgIEZYX0JPT0wgR2V0QnV0dG9uUm9sbG92ZXIoQ0ZYX1dpZGVTdHJpbmcmIHdzUm9sbG92ZXIsIEZYX0JPT0wmIGJSaWNoVGV4dCk7DQorICBGWF9CT09MIEdldEJ1dHRvbkRvd24oQ0ZYX1dpZGVTdHJpbmcmIHdzRG93biwgRlhfQk9PTCYgYlJpY2hUZXh0KTsNCisgIGludDMyX3QgR2V0Q2hlY2tCdXR0b25TaGFwZSgpOw0KKyAgaW50MzJfdCBHZXRDaGVja0J1dHRvbk1hcmsoKTsNCisgIEZYX0ZMT0FUIEdldENoZWNrQnV0dG9uU2l6ZSgpOw0KKyAgRlhfQk9PTCBJc0FsbG93TmV1dHJhbCgpOw0KKyAgRlhfQk9PTCBJc1JhZGlvQnV0dG9uKCk7DQorICBYRkFfQ0hFQ0tTVEFURSBHZXRDaGVja1N0YXRlKCk7DQorICB2b2lkIFNldENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUsIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUpOw0KKyAgQ1hGQV9Ob2RlKiBHZXRFeGNsR3JvdXBOb2RlKCk7DQorICBDWEZBX05vZGUqIEdldFNlbGVjdGVkTWVtYmVyKCk7DQorICBDWEZBX05vZGUqIFNldFNlbGVjdGVkTWVtYmVyKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCisgIHZvaWQgU2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bmNEYXRhID0gVFJVRSk7DQorICBDWEZBX05vZGUqIEdldEV4Y2xHcm91cEZpcnN0TWVtYmVyKCk7DQorICBDWEZBX05vZGUqIEdldEV4Y2xHcm91cE5leHRNZW1iZXIoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBpbnQzMl90IEdldENob2ljZUxpc3RDb21taXRPbigpOw0KKyAgRlhfQk9PTCBJc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpOw0KKyAgaW50MzJfdCBHZXRDaG9pY2VMaXN0T3BlbigpOw0KKyAgRlhfQk9PTCBJc0xpc3RCb3goKTsNCisgIGludDMyX3QgQ291bnRDaG9pY2VMaXN0SXRlbXMoRlhfQk9PTCBiU2F2ZVZhbHVlID0gRkFMU0UpOw0KKyAgRlhfQk9PTCBHZXRDaG9pY2VMaXN0SXRlbShDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVZhbHVlID0gRkFMU0UpOw0KKyAgdm9pZCBHZXRDaG9pY2VMaXN0SXRlbXMoQ0ZYX1dpZGVTdHJpbmdBcnJheSYgd3NUZXh0QXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlVmFsdWUgPSBGQUxTRSk7DQorICBpbnQzMl90IENvdW50U2VsZWN0ZWRJdGVtcygpOw0KKyAgaW50MzJfdCBHZXRTZWxlY3RlZEl0ZW0oaW50MzJfdCBuSW5kZXggPSAwKTsNCisgIHZvaWQgR2V0U2VsZWN0ZWRJdGVtcyhDRlhfSW50MzJBcnJheSYgaVNlbEFycmF5KTsNCisgIHZvaWQgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKENGWF9XaWRlU3RyaW5nQXJyYXkmIHdzU2VsVGV4dEFycmF5KTsNCisgIEZYX0JPT0wgR2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4KTsNCisgIHZvaWQgU2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEgPSBUUlVFKTsNCisgIHZvaWQgU2V0U2VsZWN0ZEl0ZW1zKENGWF9JbnQzMkFycmF5JiBpU2VsQXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEgPSBUUlVFKTsNCisgIHZvaWQgQ2xlYXJBbGxTZWxlY3Rpb25zKCk7DQorICB2b2lkIEluc2VydEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTGFiZWwsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSAtMSwNCisgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7DQorICB2b2lkIEdldEl0ZW1MYWJlbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsIENGWF9XaWRlU3RyaW5nJiB3c0xhYmVsKTsNCisgIHZvaWQgR2V0SXRlbVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpOw0KKyAgRlhfQk9PTCBEZWxldGVJdGVtKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bmNEYXRhID0gVFJVRSk7DQorICBpbnQzMl90IEdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKTsNCisgIGludDMyX3QgR2V0TnVtYmVyT2ZDZWxscygpOw0KKyAgRlhfQk9PTCBJc0RhdGVUaW1lRWRpdFVzZVBpY2tlcigpOw0KKyAgRlhfQk9PTCBTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKTsNCisgIEZYX0JPT0wgR2V0UGljdHVyZUNvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzUGljdHVyZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRSBlUGljdHVyZSk7DQorICBJRlhfTG9jYWxlKiBHZXRMb2NhbCgpOw0KKyAgRlhfQk9PTCBHZXRWYWx1ZShDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKTsNCisgIEZYX0JPT0wgR2V0Tm9ybWFsaXplRGF0YVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05vcm1hbGl6ZVZhbHVlKTsNCisgIEZYX0JPT0wgR2V0Rm9ybWF0RGF0YVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgdm9pZCBOb3JtYWxpemVOdW1TdHIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRCYXJjb2RlVHlwZSgpOw0KKyAgRlhfQk9PTCBHZXRCYXJjb2RlQXR0cmlidXRlX0NoYXJFbmNvZGluZyhpbnQzMl90JiB2YWwpOw0KKyAgRlhfQk9PTCBHZXRCYXJjb2RlQXR0cmlidXRlX0NoZWNrc3VtKGludDMyX3QmIHZhbCk7DQorICBGWF9CT09MIEdldEJhcmNvZGVBdHRyaWJ1dGVfRGF0YUxlbmd0aChpbnQzMl90JiB2YWwpOw0KKyAgRlhfQk9PTCBHZXRCYXJjb2RlQXR0cmlidXRlX1N0YXJ0Q2hhcihGWF9DSEFSJiB2YWwpOw0KKyAgRlhfQk9PTCBHZXRCYXJjb2RlQXR0cmlidXRlX0VuZENoYXIoRlhfQ0hBUiYgdmFsKTsNCisgIEZYX0JPT0wgR2V0QmFyY29kZUF0dHJpYnV0ZV9FQ0xldmVsKGludDMyX3QmIHZhbCk7DQorICBGWF9CT09MIEdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlV2lkdGgoaW50MzJfdCYgdmFsKTsNCisgIEZYX0JPT0wgR2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVIZWlnaHQoaW50MzJfdCYgdmFsKTsNCisgIEZYX0JPT0wgR2V0QmFyY29kZUF0dHJpYnV0ZV9QcmludENoZWNrc3VtKEZYX0JPT0wmIHZhbCk7DQorICBGWF9CT09MIEdldEJhcmNvZGVBdHRyaWJ1dGVfVGV4dExvY2F0aW9uKGludDMyX3QmIHZhbCk7DQorICBGWF9CT09MIEdldEJhcmNvZGVBdHRyaWJ1dGVfVHJ1bmNhdGUoRlhfQk9PTCYgdmFsKTsNCisgIEZYX0JPT0wgR2V0QmFyY29kZUF0dHJpYnV0ZV9XaWRlTmFycm93UmF0aW8oRlhfRkxPQVQmIHZhbCk7DQorICB2b2lkIEdldFBhc3N3b3JkQ2hhcihDRlhfV2lkZVN0cmluZyYgd3NQYXNzV29yZCk7DQorICBGWF9CT09MIElzQWxsb3dSaWNoVGV4dCgpOw0KKyAgRlhfQk9PTCBJc011bHRpTGluZSgpOw0KKyAgaW50MzJfdCBHZXRWZXJ0aWNhbFNjcm9sbFBvbGljeSgpOw0KKyAgaW50MzJfdCBHZXRNYXhDaGFycyhYRkFfRUxFTUVOVCYgZVR5cGUpOw0KKyAgRlhfQk9PTCBHZXRGcmFjRGlnaXRzKGludDMyX3QmIGlGcmFjRGlnaXRzKTsNCisgIEZYX0JPT0wgR2V0TGVhZERpZ2l0cyhpbnQzMl90JiBpTGVhZERpZ2l0cyk7DQorICBDWEZBX0ZpbHRlciBHZXRGaWx0ZXIoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICBDWEZBX01hbmlmZXN0IEdldE1hbmlmZXN0KEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KIA0KLSAgICBGWF9CT09MICAgICAgICAgICAgIG1fYklzTnVsbDsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBtX2JQcmVOdWxsOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZCAgICAgICAgICAgICAgICBTeW5jVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgSW5zZXJ0TGlzdFRleHRJdGVtKENYRkFfTm9kZSogcEl0ZW1zLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGV4dCwgaW50MzJfdCBuSW5kZXggPSAtMSk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgRm9ybWF0TnVtU3RyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBJRlhfTG9jYWxlKiBwTG9jYWxlLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KKyAgRlhfQk9PTCBtX2JJc051bGw7DQorICBGWF9CT09MIG1fYlByZU51bGw7DQogDQotICAgIENYRkFfTm9kZSogICAgICAgICAgbV9wVWlDaGlsZE5vZGU7DQotICAgIFhGQV9FTEVNRU5UICAgICAgICAgbV9lVUlUeXBlOw0KLX07DQotY2xhc3MgQ1hGQV9PY2N1ciA6IHB1YmxpYyBDWEZBX0RhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX09jY3VyKENYRkFfTm9kZSogcE5vZGUpOw0KLSAgICBpbnQzMl90CUdldE1heCgpOw0KLSAgICBpbnQzMl90CUdldE1pbigpOw0KLSAgICBpbnQzMl90CUdldEluaXRpYWwoKTsNCi0gICAgRlhfQk9PTAkJR2V0T2NjdXJJbmZvKGludDMyX3QmIGlNaW4sIGludDMyX3QmIGlNYXgsIGludDMyX3QmIGlJbml0KTsNCi0gICAgdm9pZAkJU2V0TWF4KGludDMyX3QgaU1heCk7DQotICAgIHZvaWQJCVNldE1pbihpbnQzMl90IGlNaW4pOw0KLX07DQotY2xhc3MgQ1hGQV9GaWx0ZXIgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GaWx0ZXIoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0RmlsdGVyU3RyaW5nKFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNCQlHZXRBcHBlYXJhbmNlRmlsdGVyVHlwZSgpOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldEFwcGVhcmFuY2VGaWx0ZXJDb250ZW50KCk7DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNCQlHZXRDZXJ0aWZpY2F0ZXNDcmVkZW50aWFsU2VydmVyUG9saWN5KCk7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0Q2VydGlmaWNhdGVzVVJMKCk7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0Q2VydGlmaWNhdGVzVVJMUG9saWN5KCk7DQotICAgIENYRkFfV3JhcENlcnRpZmljYXRlCUdldENlcnRpZmljYXRlc0VuY3J5cHRpb24oRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQotICAgIENYRkFfV3JhcENlcnRpZmljYXRlCUdldENlcnRpZmljYXRlc0lzc3VlcnMoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0Q2VydGlmaWNhdGVzS2V5VXNhZ2VTdHJpbmcoWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgQ1hGQV9PaWRzCQkJCUdldENlcnRpZmljYXRlc09pZHMoKTsNCi0gICAgQ1hGQV9XcmFwQ2VydGlmaWNhdGUJR2V0Q2VydGlmaWNhdGVzU2lnbmluZyhGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCi0gICAgQ1hGQV9EaWdlc3RNZXRob2RzCQlHZXREaWdlc3RNZXRob2RzKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KLSAgICBDWEZBX0VuY29kaW5ncwkJCUdldEVuY29kaW5ncyhGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCi0gICAgQ1hGQV9FbmNyeXB0aW9uTWV0aG9kcwlHZXRFbmNyeXB0aW9uTWV0aG9kcyhGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0JCUdldEhhbmRsZXJUeXBlKCk7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0SGFuZGxlckNvbnRlbnQoKTsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0JCUdldGxvY2tEb2N1bWVudFR5cGUoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRsb2NrRG9jdW1lbnRDb250ZW50KCk7DQotICAgIGludDMyX3QJCQkJR2V0TURQUGVybWlzc2lvbnMoKTsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0JCUdldE1EUFNpZ25hdHVyZVR5cGUoKTsNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBTeW5jVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSk7DQorICB2b2lkIEluc2VydExpc3RUZXh0SXRlbShDWEZBX05vZGUqIHBJdGVtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSAtMSk7DQorICB2b2lkIEZvcm1hdE51bVN0cihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KIA0KLSAgICBDWEZBX1JlYXNvbnMJCQlHZXRSZWFzb25zKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldFRpbWVTdGFtcFNlcnZlcigpOw0KLSAgICBYRkFfQVRUUklCVVRFRU5VTQkJR2V0VGltZVN0YW1wVHlwZSgpOw0KKyAgQ1hGQV9Ob2RlKiBtX3BVaUNoaWxkTm9kZTsNCisgIFhGQV9FTEVNRU5UIG1fZVVJVHlwZTsNCiB9Ow0KLWNsYXNzIENYRkFfQ2VydGlmaWNhdGUgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9DZXJ0aWZpY2F0ZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCUdldENlcnRpZmljYXRlTmFtZSgpOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJR2V0Q2VydGlmaWNhdGVDb250ZW50KCk7DQorY2xhc3MgQ1hGQV9PY2N1ciA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX09jY3VyKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgaW50MzJfdCBHZXRNYXgoKTsNCisgIGludDMyX3QgR2V0TWluKCk7DQorICBpbnQzMl90IEdldEluaXRpYWwoKTsNCisgIEZYX0JPT0wgR2V0T2NjdXJJbmZvKGludDMyX3QmIGlNaW4sIGludDMyX3QmIGlNYXgsIGludDMyX3QmIGlJbml0KTsNCisgIHZvaWQgU2V0TWF4KGludDMyX3QgaU1heCk7DQorICB2b2lkIFNldE1pbihpbnQzMl90IGlNaW4pOw0KIH07DQotY2xhc3MgQ1hGQV9XcmFwQ2VydGlmaWNhdGUgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9XcmFwQ2VydGlmaWNhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNCUdldFR5cGUoKTsNCi0gICAgaW50MzJfdAkJCUNvdW50Q2VydGlmaWNhdGVzKCk7DQotICAgIENYRkFfQ2VydGlmaWNhdGUJR2V0Q2VydGlmaWNhdGUoaW50MzJfdCBuSW5kZXgpOw0KK2NsYXNzIENYRkFfRmlsdGVyIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfRmlsdGVyKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0RmlsdGVyU3RyaW5nKFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICBYRkFfQVRUUklCVVRFRU5VTSBHZXRBcHBlYXJhbmNlRmlsdGVyVHlwZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0QXBwZWFyYW5jZUZpbHRlckNvbnRlbnQoKTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldENlcnRpZmljYXRlc0NyZWRlbnRpYWxTZXJ2ZXJQb2xpY3koKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldENlcnRpZmljYXRlc1VSTCgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0Q2VydGlmaWNhdGVzVVJMUG9saWN5KCk7DQorICBDWEZBX1dyYXBDZXJ0aWZpY2F0ZSBHZXRDZXJ0aWZpY2F0ZXNFbmNyeXB0aW9uKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9XcmFwQ2VydGlmaWNhdGUgR2V0Q2VydGlmaWNhdGVzSXNzdWVycyhGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldENlcnRpZmljYXRlc0tleVVzYWdlU3RyaW5nKFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICBDWEZBX09pZHMgR2V0Q2VydGlmaWNhdGVzT2lkcygpOw0KKyAgQ1hGQV9XcmFwQ2VydGlmaWNhdGUgR2V0Q2VydGlmaWNhdGVzU2lnbmluZyhGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfRGlnZXN0TWV0aG9kcyBHZXREaWdlc3RNZXRob2RzKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9FbmNvZGluZ3MgR2V0RW5jb2RpbmdzKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9FbmNyeXB0aW9uTWV0aG9kcyBHZXRFbmNyeXB0aW9uTWV0aG9kcyhGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldEhhbmRsZXJUeXBlKCk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRIYW5kbGVyQ29udGVudCgpOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gR2V0bG9ja0RvY3VtZW50VHlwZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0bG9ja0RvY3VtZW50Q29udGVudCgpOw0KKyAgaW50MzJfdCBHZXRNRFBQZXJtaXNzaW9ucygpOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gR2V0TURQU2lnbmF0dXJlVHlwZSgpOw0KKw0KKyAgQ1hGQV9SZWFzb25zIEdldFJlYXNvbnMoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRUaW1lU3RhbXBTZXJ2ZXIoKTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldFRpbWVTdGFtcFR5cGUoKTsNCiB9Ow0KLWNsYXNzIENYRkFfT2lkcyA6IHB1YmxpYyBDWEZBX0RhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX09pZHMoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNCUdldE9pZHNUeXBlKCk7DQotICAgIGludDMyX3QJCQlDb3VudE9pZHMoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCUdldE9pZENvbnRlbnQoaW50MzJfdCBuSW5kZXgpOw0KK2NsYXNzIENYRkFfQ2VydGlmaWNhdGUgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9DZXJ0aWZpY2F0ZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgIENGWF9XaWRlU3RyaW5nIEdldENlcnRpZmljYXRlTmFtZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0Q2VydGlmaWNhdGVDb250ZW50KCk7DQogfTsNCi1jbGFzcyBDWEZBX1N1YmplY3RETnMgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9TdWJqZWN0RE5zKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KLSAgICBYRkFfQVRUUklCVVRFRU5VTQlHZXRTdWJqZWN0RE5zVHlwZSgpOw0KLSAgICBpbnQzMl90CQkJCUNvdW50U3ViamVjdEROcygpOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldFN1YmplY3RETlN0cmluZyhpbnQzMl90IG5JbmRleCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRTdWJqZWN0RE5Db250ZW50KGludDMyX3QgbkluZGV4KTsNCitjbGFzcyBDWEZBX1dyYXBDZXJ0aWZpY2F0ZSA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX1dyYXBDZXJ0aWZpY2F0ZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldFR5cGUoKTsNCisgIGludDMyX3QgQ291bnRDZXJ0aWZpY2F0ZXMoKTsNCisgIENYRkFfQ2VydGlmaWNhdGUgR2V0Q2VydGlmaWNhdGUoaW50MzJfdCBuSW5kZXgpOw0KIH07DQotY2xhc3MgQ1hGQV9EaWdlc3RNZXRob2RzIDogcHVibGljIENYRkFfRGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRGlnZXN0TWV0aG9kcyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCi0gICAgWEZBX0FUVFJJQlVURUVOVU0JR2V0RGlnZXN0TWV0aG9kc1R5cGUoKTsNCi0gICAgaW50MzJfdAkJCQlDb3VudERpZ2VzdE1ldGhvZHMoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXREaWdlc3RNZXRob2RDb250ZW50KGludDMyX3QgbkluZGV4KTsNCitjbGFzcyBDWEZBX09pZHMgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9PaWRzKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgWEZBX0FUVFJJQlVURUVOVU0gR2V0T2lkc1R5cGUoKTsNCisgIGludDMyX3QgQ291bnRPaWRzKCk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRPaWRDb250ZW50KGludDMyX3QgbkluZGV4KTsNCiB9Ow0KLWNsYXNzIENYRkFfRW5jb2RpbmdzIDogcHVibGljIENYRkFfRGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRW5jb2RpbmdzKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KLSAgICBYRkFfQVRUUklCVVRFRU5VTQkJR2V0RW5jb2RpbmdzVHlwZSgpOw0KLSAgICBpbnQzMl90CQkJCUNvdW50RW5jb2RpbmdzKCk7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0RW5jb2RpbmdDb250ZW50KGludDMyX3QgbkluZGV4KTsNCitjbGFzcyBDWEZBX1N1YmplY3RETnMgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9TdWJqZWN0RE5zKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgWEZBX0FUVFJJQlVURUVOVU0gR2V0U3ViamVjdEROc1R5cGUoKTsNCisgIGludDMyX3QgQ291bnRTdWJqZWN0RE5zKCk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRTdWJqZWN0RE5TdHJpbmcoaW50MzJfdCBuSW5kZXgsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRTdWJqZWN0RE5Db250ZW50KGludDMyX3QgbkluZGV4KTsNCiB9Ow0KLWNsYXNzIENYRkFfRW5jcnlwdGlvbk1ldGhvZHMgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9FbmNyeXB0aW9uTWV0aG9kcyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCi0gICAgWEZBX0FUVFJJQlVURUVOVU0JCUdldEVuY3J5cHRpb25NZXRob2RzVHlwZSgpOw0KLSAgICBpbnQzMl90CQkJCUNvdW50RW5jcnlwdGlvbk1ldGhvZHMoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRFbmNyeXB0aW9uTWV0aG9kQ29udGVudChpbnQzMl90IG5JbmRleCk7DQorY2xhc3MgQ1hGQV9EaWdlc3RNZXRob2RzIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfRGlnZXN0TWV0aG9kcyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldERpZ2VzdE1ldGhvZHNUeXBlKCk7DQorICBpbnQzMl90IENvdW50RGlnZXN0TWV0aG9kcygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0RGlnZXN0TWV0aG9kQ29udGVudChpbnQzMl90IG5JbmRleCk7DQogfTsNCi1jbGFzcyBDWEZBX1JlYXNvbnMgOiBwdWJsaWMgQ1hGQV9EYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9SZWFzb25zKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KLSAgICBYRkFfQVRUUklCVVRFRU5VTQkJR2V0UmVhc29uc1R5cGUoKTsNCi0gICAgaW50MzJfdAkJCQlDb3VudFJlYXNvbnMoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRSZWFzb25Db250ZW50KGludDMyX3QgbkluZGV4KTsNCitjbGFzcyBDWEZBX0VuY29kaW5ncyA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0VuY29kaW5ncyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldEVuY29kaW5nc1R5cGUoKTsNCisgIGludDMyX3QgQ291bnRFbmNvZGluZ3MoKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldEVuY29kaW5nQ29udGVudChpbnQzMl90IG5JbmRleCk7DQogfTsNCi1jbGFzcyBDWEZBX01hbmlmZXN0IDogcHVibGljIENYRkFfRGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfTWFuaWZlc3QoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNCUdldEFjdGlvbigpOw0KLSAgICBpbnQzMl90CQkJQ291bnRSZWl2ZXMoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCUdldFJlZkNvbnRlbnQoaW50MzJfdCBuSW5kZXgpOw0KK2NsYXNzIENYRkFfRW5jcnlwdGlvbk1ldGhvZHMgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9FbmNyeXB0aW9uTWV0aG9kcyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldEVuY3J5cHRpb25NZXRob2RzVHlwZSgpOw0KKyAgaW50MzJfdCBDb3VudEVuY3J5cHRpb25NZXRob2RzKCk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRFbmNyeXB0aW9uTWV0aG9kQ29udGVudChpbnQzMl90IG5JbmRleCk7DQorfTsNCitjbGFzcyBDWEZBX1JlYXNvbnMgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9SZWFzb25zKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgWEZBX0FUVFJJQlVURUVOVU0gR2V0UmVhc29uc1R5cGUoKTsNCisgIGludDMyX3QgQ291bnRSZWFzb25zKCk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRSZWFzb25Db250ZW50KGludDMyX3QgbkluZGV4KTsNCit9Ow0KK2NsYXNzIENYRkFfTWFuaWZlc3QgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9NYW5pZmVzdChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldEFjdGlvbigpOw0KKyAgaW50MzJfdCBDb3VudFJlaXZlcygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0UmVmQ29udGVudChpbnQzMl90IG5JbmRleCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9meGZhL2Z4ZmFfd2lkZ2V0LmggYi94ZmEvaW5jbHVkZS9meGZhL2Z4ZmFfd2lkZ2V0LmgKaW5kZXggNzI1ODFhZS4uODhhYjFhYyAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZnhmYS9meGZhX3dpZGdldC5oCisrKyBiL3hmYS9pbmNsdWRlL2Z4ZmEvZnhmYV93aWRnZXQuaApAQCAtMTksODMgKzE5LDk5IEBACiBjbGFzcyBJRlhfRm9udDsNCiBjbGFzcyBDWEZBX1dpZGdldEFjYzsNCiAjaW5jbHVkZSAiZnhmYV9vYmplY3RhY2MuaCINCi1jbGFzcyBDWEZBX1dpZGdldEFjYyA6IHB1YmxpYyBDWEZBX1dpZGdldERhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX1dpZGdldEFjYyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcE5vZGUpOw0KLSAgICB+Q1hGQV9XaWRnZXRBY2MoKTsNCitjbGFzcyBDWEZBX1dpZGdldEFjYyA6IHB1YmxpYyBDWEZBX1dpZGdldERhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX1dpZGdldEFjYyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcE5vZGUpOw0KKyAgfkNYRkFfV2lkZ2V0QWNjKCk7DQogDQotICAgIEZYX0JPT0wJCQlHZXROYW1lKENGWF9XaWRlU3RyaW5nICZ3c05hbWUsIGludDMyX3QgaU5hbWVUeXBlID0gMCk7DQotICAgIEZYX0JPT0wJCQlQcm9jZXNzVmFsdWVDaGFuZ2VkKCk7DQorICBGWF9CT09MIEdldE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwgaW50MzJfdCBpTmFtZVR5cGUgPSAwKTsNCisgIEZYX0JPT0wgUHJvY2Vzc1ZhbHVlQ2hhbmdlZCgpOw0KIA0KLXB1YmxpYzoNCisgcHVibGljOg0KKyAgdm9pZCBSZXNldERhdGEoKTsNCiANCi0gICAgdm9pZAkJCVJlc2V0RGF0YSgpOw0KKyAgdm9pZCBTZXRJbWFnZUVkaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0hyZWYsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGF0YSk7DQogDQorICBDWEZBX1dpZGdldEFjYyogR2V0RXhjbEdyb3VwKCk7DQorICBDWEZBX0ZGRG9jVmlldyogR2V0RG9jVmlldygpOw0KKyAgQ1hGQV9GRkRvYyogR2V0RG9jKCk7DQorICBDWEZBX0ZGQXBwKiBHZXRBcHAoKTsNCisgIElYRkFfQXBwUHJvdmlkZXIqIEdldEFwcFByb3ZpZGVyKCk7DQogDQotICAgIHZvaWQJCQlTZXRJbWFnZUVkaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnRUeXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSHJlZiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0RhdGEpOw0KKyAgaW50MzJfdCBQcm9jZXNzRXZlbnQoaW50MzJfdCBpQWN0aXZpdHksIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pOw0KKyAgaW50MzJfdCBQcm9jZXNzRXZlbnQoQ1hGQV9FdmVudCYgZXZlbnQsIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pOw0KKyAgaW50MzJfdCBQcm9jZXNzQ2FsY3VsYXRlKCk7DQorICBpbnQzMl90IFByb2Nlc3NWYWxpZGF0ZShpbnQzMl90IGlGbGFncyA9IDApOw0KKyAgaW50MzJfdCBFeGVjdXRlU2NyaXB0KENYRkFfU2NyaXB0IHNjcmlwdCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSogcFJldFZhbHVlID0gTlVMTCk7DQogDQotICAgIENYRkFfV2lkZ2V0QWNjKglHZXRFeGNsR3JvdXAoKTsNCi0gICAgQ1hGQV9GRkRvY1ZpZXcqCQlHZXREb2NWaWV3KCk7DQotICAgIENYRkFfRkZEb2MqCQkJR2V0RG9jKCk7DQotICAgIENYRkFfRkZBcHAqCQkJR2V0QXBwKCk7DQotICAgIElYRkFfQXBwUHJvdmlkZXIqCUdldEFwcFByb3ZpZGVyKCk7DQorICBDWEZBX0ZGV2lkZ2V0KiBHZXROZXh0V2lkZ2V0KENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpOw0KKyAgdm9pZCBTdGFydFdpZGdldExheW91dChGWF9GTE9BVCYgZkNhbGNXaWR0aCwgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0KTsNCisgIEZYX0JPT0wgRmluZFNwbGl0UG9zKGludDMyX3QgaUJsb2NrSW5kZXgsIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCk7DQorICBGWF9CT09MIExvYWRDYXB0aW9uKCk7DQorICBGWF9CT09MIExvYWRUZXh0KCk7DQorICBGWF9CT09MIExvYWRJbWFnZUltYWdlKCk7DQorICBGWF9CT09MIExvYWRJbWFnZUVkaXRJbWFnZSgpOw0KKyAgdm9pZCBHZXRJbWFnZURwaShpbnQzMl90JiBpSW1hZ2VYRHBpLCBpbnQzMl90JiBpSW1hZ2VZRHBpKTsNCisgIHZvaWQgR2V0SW1hZ2VFZGl0RHBpKGludDMyX3QmIGlJbWFnZVhEcGksIGludDMyX3QmIGlJbWFnZVlEcGkpOw0KKyAgQ1hGQV9UZXh0TGF5b3V0KiBHZXRDYXB0aW9uVGV4dExheW91dCgpOw0KKyAgQ1hGQV9UZXh0TGF5b3V0KiBHZXRUZXh0TGF5b3V0KCk7DQorICBDRlhfRElCaXRtYXAqIEdldEltYWdlSW1hZ2UoKTsNCisgIENGWF9ESUJpdG1hcCogR2V0SW1hZ2VFZGl0SW1hZ2UoKTsNCisgIHZvaWQgU2V0SW1hZ2VJbWFnZShDRlhfRElCaXRtYXAqIG5ld0ltYWdlKTsNCisgIHZvaWQgU2V0SW1hZ2VFZGl0SW1hZ2UoQ0ZYX0RJQml0bWFwKiBuZXdJbWFnZSk7DQorICB2b2lkIFVwZGF0ZVVJRGlzcGxheShDWEZBX0ZGV2lkZ2V0KiBwRXhjZXB0ID0gTlVMTCk7DQorICB2b2lkIE5vdGlmeUV2ZW50KEZYX0RXT1JEIGR3RXZlbnQsDQorICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0gPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICB2b2lkKiBwQWRkaXRpb25hbCA9IE5VTEwpOw0KIA0KLSAgICBpbnQzMl90CQlQcm9jZXNzRXZlbnQoaW50MzJfdCBpQWN0aXZpdHksIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pOw0KLSAgICBpbnQzMl90CQlQcm9jZXNzRXZlbnQoQ1hGQV9FdmVudCYgZXZlbnQsIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pOw0KLSAgICBpbnQzMl90CQlQcm9jZXNzQ2FsY3VsYXRlKCk7DQotICAgIGludDMyX3QJCVByb2Nlc3NWYWxpZGF0ZShpbnQzMl90IGlGbGFncyA9IDApOw0KLSAgICBpbnQzMl90CQlFeGVjdXRlU2NyaXB0KENYRkFfU2NyaXB0IHNjcmlwdCwgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSwgRlhKU0VfSFZBTFVFKiBwUmV0VmFsdWUgPSBOVUxMKTsNCisgIENYRkFfTm9kZSogR2V0RGF0YXNldHMoKTsNCisgIElGWF9Gb250KiBHZXRGREVGb250KCk7DQorICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpOw0KKyAgRlhfQVJHQiBHZXRUZXh0Q29sb3IoKTsNCisgIEZYX0ZMT0FUIEdldExpbmVIZWlnaHQoKTsNCisgIENYRkFfV2lkZ2V0TGF5b3V0RGF0YSogR2V0V2lkZ2V0TGF5b3V0RGF0YSgpOw0KIA0KLSAgICBDWEZBX0ZGV2lkZ2V0KglHZXROZXh0V2lkZ2V0KENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpOw0KLSAgICB2b2lkCQkJU3RhcnRXaWRnZXRMYXlvdXQoRlhfRkxPQVQgJmZDYWxjV2lkdGgsIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCk7DQotICAgIEZYX0JPT0wJCQlGaW5kU3BsaXRQb3MoaW50MzJfdCBpQmxvY2tJbmRleCwgRlhfRkxPQVQgJmZDYWxjSGVpZ2h0KTsNCi0gICAgRlhfQk9PTAkJCQlMb2FkQ2FwdGlvbigpOw0KLSAgICBGWF9CT09MCQkJCUxvYWRUZXh0KCk7DQotICAgIEZYX0JPT0wJCQkJTG9hZEltYWdlSW1hZ2UoKTsNCi0gICAgRlhfQk9PTAkJCQlMb2FkSW1hZ2VFZGl0SW1hZ2UoKTsNCi0gICAgdm9pZAkJCQlHZXRJbWFnZURwaShpbnQzMl90ICZpSW1hZ2VYRHBpLCBpbnQzMl90ICZpSW1hZ2VZRHBpKTsNCi0gICAgdm9pZAkJCQlHZXRJbWFnZUVkaXREcGkoaW50MzJfdCAmaUltYWdlWERwaSwgaW50MzJfdCAmaUltYWdlWURwaSk7DQotICAgIENYRkFfVGV4dExheW91dCoJR2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCi0gICAgQ1hGQV9UZXh0TGF5b3V0KglHZXRUZXh0TGF5b3V0KCk7DQotICAgIENGWF9ESUJpdG1hcCoJCUdldEltYWdlSW1hZ2UoKTsNCi0gICAgQ0ZYX0RJQml0bWFwKgkJR2V0SW1hZ2VFZGl0SW1hZ2UoKTsNCi0gICAgdm9pZAkJCQlTZXRJbWFnZUltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpOw0KLSAgICB2b2lkCQkJCVNldEltYWdlRWRpdEltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpOw0KLSAgICB2b2lkCQkJVXBkYXRlVUlEaXNwbGF5KENYRkFfRkZXaWRnZXQqIHBFeGNlcHQgPSBOVUxMKTsNCi0gICAgdm9pZAkJCU5vdGlmeUV2ZW50KEZYX0RXT1JEIGR3RXZlbnQsIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBOVUxMLCB2b2lkKiBwUGFyYW0gPSBOVUxMLCB2b2lkKiBwQWRkaXRpb25hbCA9IE5VTEwpOw0KLQ0KLQ0KLSAgICBDWEZBX05vZGUqCQlHZXREYXRhc2V0cygpOw0KLSAgICBJRlhfRm9udCoJCUdldEZERUZvbnQoKTsNCi0gICAgRlhfRkxPQVQJCUdldEZvbnRTaXplKCk7DQotICAgIEZYX0FSR0IJCQlHZXRUZXh0Q29sb3IoKTsNCi0gICAgRlhfRkxPQVQJCUdldExpbmVIZWlnaHQoKTsNCi0gICAgQ1hGQV9XaWRnZXRMYXlvdXREYXRhKiBHZXRXaWRnZXRMYXlvdXREYXRhKCk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQkJUHJvY2Vzc1NjcmlwdFRlc3RWYWxpZGF0ZShDWEZBX1ZhbGlkYXRlIHZhbGlkYXRlLCBpbnQzMl90IGlSZXQsIEZYSlNFX0hWQUxVRSBwUmV0VmFsdWUsIEZYX0JPT0wgYlZlcnNpb25GbGFnKTsNCi0gICAgaW50MzJfdAkJUHJvY2Vzc0Zvcm1hdFRlc3RWYWxpZGF0ZShDWEZBX1ZhbGlkYXRlIHZhbGlkYXRlLCBGWF9CT09MIGJWZXJzaW9uRmxhZyk7DQotICAgIGludDMyX3QJCVByb2Nlc3NOdWxsVGVzdFZhbGlkYXRlKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUsIGludDMyX3QgaUZsYWdzLCBGWF9CT09MIGJWZXJzaW9uRmxhZyk7DQotICAgIHZvaWQJCQlHZXRWYWxpZGF0ZUNhcHRpb25OYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb25OYW1lLCBGWF9CT09MIGJWZXJzaW9uRmxhZyk7DQotICAgIHZvaWQJCQlHZXRWYWxpZGF0ZU1lc3NhZ2UoSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyLCBDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlLCBGWF9CT09MIGJFcnJvciwgRlhfQk9PTCBiVmVyc2lvbkZsYWcpOw0KLSAgICB2b2lkCQkJQ2FsY0NhcHRpb25TaXplKENGWF9TaXplRiAmc3pDYXApOw0KLSAgICBGWF9CT09MCQkJQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShDRlhfU2l6ZUYgJnNpemUpOw0KLSAgICBGWF9CT09MCQkJQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKTsNCi0gICAgRlhfQk9PTAkJCUNhbGN1bGF0ZVRleHRFZGl0QXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKTsNCi0gICAgRlhfQk9PTAkJCUNhbGN1bGF0ZUNoZWNrQnV0dG9uQXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKTsNCi0gICAgRlhfQk9PTAkJCUNhbGN1bGF0ZVB1c2hCdXR0b25BdXRvU2l6ZShDRlhfU2l6ZUYgJnNpemUpOw0KLSAgICBGWF9CT09MCQkJQ2FsY3VsYXRlSW1hZ2VFZGl0QXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKTsNCi0gICAgRlhfQk9PTAkJCUNhbGN1bGF0ZUltYWdlQXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKTsNCi0gICAgRlhfQk9PTAkJCUNhbGN1bGF0ZVRleHRBdXRvU2l6ZShDRlhfU2l6ZUYgJnNpemUpOw0KLSAgICBGWF9GTE9BVAkJQ2FsY3VsYXRlV2lkZ2V0QXV0b0hlaWdodChGWF9GTE9BVCBmSGVpZ2h0Q2FsYyk7DQotICAgIEZYX0ZMT0FUCQlDYWxjdWxhdGVXaWRnZXRBdXRvV2lkdGgoRlhfRkxPQVQgZldpZHRoQ2FsYyk7DQotICAgIEZYX0ZMT0FUCQlHZXRXaWR0aFdpdGhvdXRNYXJnaW4oRlhfRkxPQVQgZldpZHRoQ2FsYyk7DQotICAgIEZYX0ZMT0FUCQlHZXRIZWlnaHRXaXRob3V0TWFyZ2luKEZYX0ZMT0FUIGZIZWlnaHRDYWxjKTsNCi0gICAgdm9pZAkJCUNhbGN1bGF0ZVRleHRDb250ZW50U2l6ZShDRlhfU2l6ZUYgJnNpemUpOw0KLSAgICB2b2lkCQkJQ2FsY3VsYXRlQWNjV2lkdGhBbmRIZWlnaHQoWEZBX0VMRU1FTlQgZVVJVHlwZSwgRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0KTsNCi0gICAgdm9pZAkJCUluaXRMYXlvdXREYXRhKCk7DQotICAgIHZvaWQJCQlTdGFydFRleHRMYXlvdXQoRlhfRkxPQVQmIGZDYWxjV2lkdGgsIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCk7DQotICAgIENYRkFfRkZEb2NWaWV3KgkJbV9wRG9jVmlldzsNCi0gICAgQ1hGQV9XaWRnZXRMYXlvdXREYXRhKiBtX3BMYXlvdXREYXRhOw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIFByb2Nlc3NTY3JpcHRUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHBSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJzaW9uRmxhZyk7DQorICBpbnQzMl90IFByb2Nlc3NGb3JtYXRUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJzaW9uRmxhZyk7DQorICBpbnQzMl90IFByb2Nlc3NOdWxsVGVzdFZhbGlkYXRlKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJzaW9uRmxhZyk7DQorICB2b2lkIEdldFZhbGlkYXRlQ2FwdGlvbk5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbk5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVyc2lvbkZsYWcpOw0KKyAgdm9pZCBHZXRWYWxpZGF0ZU1lc3NhZ2UoSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVycm9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVyc2lvbkZsYWcpOw0KKyAgdm9pZCBDYWxjQ2FwdGlvblNpemUoQ0ZYX1NpemVGJiBzekNhcCk7DQorICBGWF9CT09MIENhbGN1bGF0ZUZpZWxkQXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKTsNCisgIEZYX0JPT0wgQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKTsNCisgIEZYX0JPT0wgQ2FsY3VsYXRlVGV4dEVkaXRBdXRvU2l6ZShDRlhfU2l6ZUYmIHNpemUpOw0KKyAgRlhfQk9PTCBDYWxjdWxhdGVDaGVja0J1dHRvbkF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSk7DQorICBGWF9CT09MIENhbGN1bGF0ZVB1c2hCdXR0b25BdXRvU2l6ZShDRlhfU2l6ZUYmIHNpemUpOw0KKyAgRlhfQk9PTCBDYWxjdWxhdGVJbWFnZUVkaXRBdXRvU2l6ZShDRlhfU2l6ZUYmIHNpemUpOw0KKyAgRlhfQk9PTCBDYWxjdWxhdGVJbWFnZUF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSk7DQorICBGWF9CT09MIENhbGN1bGF0ZVRleHRBdXRvU2l6ZShDRlhfU2l6ZUYmIHNpemUpOw0KKyAgRlhfRkxPQVQgQ2FsY3VsYXRlV2lkZ2V0QXV0b0hlaWdodChGWF9GTE9BVCBmSGVpZ2h0Q2FsYyk7DQorICBGWF9GTE9BVCBDYWxjdWxhdGVXaWRnZXRBdXRvV2lkdGgoRlhfRkxPQVQgZldpZHRoQ2FsYyk7DQorICBGWF9GTE9BVCBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oRlhfRkxPQVQgZldpZHRoQ2FsYyk7DQorICBGWF9GTE9BVCBHZXRIZWlnaHRXaXRob3V0TWFyZ2luKEZYX0ZMT0FUIGZIZWlnaHRDYWxjKTsNCisgIHZvaWQgQ2FsY3VsYXRlVGV4dENvbnRlbnRTaXplKENGWF9TaXplRiYgc2l6ZSk7DQorICB2b2lkIENhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KFhGQV9FTEVNRU5UIGVVSVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCk7DQorICB2b2lkIEluaXRMYXlvdXREYXRhKCk7DQorICB2b2lkIFN0YXJ0VGV4dExheW91dChGWF9GTE9BVCYgZkNhbGNXaWR0aCwgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0KTsNCisgIENYRkFfRkZEb2NWaWV3KiBtX3BEb2NWaWV3Ow0KKyAgQ1hGQV9XaWRnZXRMYXlvdXREYXRhKiBtX3BMYXlvdXREYXRhOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZnhncmFwaGljcy9meF9ncmFwaGljcy5oIGIveGZhL2luY2x1ZGUvZnhncmFwaGljcy9meF9ncmFwaGljcy5oCmluZGV4IDk5ZmU3ZTEuLmQ2NTkxOGUgMTAwNjQ0Ci0tLSBhL3hmYS9pbmNsdWRlL2Z4Z3JhcGhpY3MvZnhfZ3JhcGhpY3MuaAorKysgYi94ZmEvaW5jbHVkZS9meGdyYXBoaWNzL2Z4X2dyYXBoaWNzLmgKQEAgLTgsOTIgKzgsMTE2IEBACiAjZGVmaW5lIF9fSF9GWF9HUkFQSElDU19fDQogDQogdHlwZWRlZiBpbnQgRlhfRVJSOw0KLSNkZWZpbmUgRlhfRVJSX1N1Y2NlZWRlZAkJCQkJMA0KLSNkZWZpbmUgRlhfRVJSX0luZGVmaW5pdGUJCQkJCS0xDQotI2RlZmluZSBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQJCQktMTAwDQotI2RlZmluZSBGWF9FUlJfUHJvcGVydHlfSW52YWxpZAkJCQktMjAwDQotI2RlZmluZSBGWF9FUlJfSW50ZXJtZWRpYXRlX1ZhbHVlX0ludmFsaWQJLTMwMA0KLSNkZWZpbmUgRlhfRVJSX01ldGhvZF9Ob3RfU3VwcG9ydGVkCQkJLTQwMA0KLSNkZWZpbmUgRlhfRVJSX091dF9PZl9NZW1vcnkJCQkJLTUwMA0KLSNkZWZpbmUgX0ZYX1JFVFVSTl9JRl9GQUlMKGFyZykge2lmICghKGFyZykpIHJldHVybjt9DQotI2RlZmluZSBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoYXJnLCB2YWwpIHtpZiAoIShhcmcpKSByZXR1cm4gdmFsO30NCi0jZGVmaW5lIF9GWF9HT1RPX1BPU0lUSU9OX0lGX0ZBSUwoYXJnLCBwb3MpIHtpZiAoIShhcmcpKSBnb3RvIHBvczt9DQotI2RlZmluZSBfRlhfRVJSX0NIRUNLX1JFVFVSTl9JRl9GQUlMKGFyZykge2lmICgoYXJnKSAhPSBGWF9FUlJfU3VjY2VlZGVkKSByZXR1cm47fQ0KLSNkZWZpbmUgX0ZYX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChhcmcsIHZhbCkge2lmICgoYXJnKSAhPSBGWF9FUlJfU3VjY2VlZGVkKSByZXR1cm4gdmFsO30NCi0jZGVmaW5lIF9GWF9FUlJfQ0hFQ0tfR09UT19QT1NJVElPTl9JRl9GQUlMKGFyZywgcG9zKSB7aWYgKChhcmcpICE9IEZYX0VSUl9TdWNjZWVkZWQpIGdvdG8gcG9zO30NCisjZGVmaW5lIEZYX0VSUl9TdWNjZWVkZWQgMA0KKyNkZWZpbmUgRlhfRVJSX0luZGVmaW5pdGUgLTENCisjZGVmaW5lIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCAtMTAwDQorI2RlZmluZSBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCAtMjAwDQorI2RlZmluZSBGWF9FUlJfSW50ZXJtZWRpYXRlX1ZhbHVlX0ludmFsaWQgLTMwMA0KKyNkZWZpbmUgRlhfRVJSX01ldGhvZF9Ob3RfU3VwcG9ydGVkIC00MDANCisjZGVmaW5lIEZYX0VSUl9PdXRfT2ZfTWVtb3J5IC01MDANCisjZGVmaW5lIF9GWF9SRVRVUk5fSUZfRkFJTChhcmcpIFwNCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgaWYgKCEoYXJnKSkgICAgICAgICAgICAgICAgIFwNCisgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgIFwNCisgIH0NCisjZGVmaW5lIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChhcmcsIHZhbCkgXA0KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIGlmICghKGFyZykpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICByZXR1cm4gdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgfQ0KKyNkZWZpbmUgX0ZYX0dPVE9fUE9TSVRJT05fSUZfRkFJTChhcmcsIHBvcykgXA0KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBpZiAoIShhcmcpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIGdvdG8gcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgfQ0KKyNkZWZpbmUgX0ZYX0VSUl9DSEVDS19SRVRVUk5fSUZfRkFJTChhcmcpIFwNCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIGlmICgoYXJnKSAhPSBGWF9FUlJfU3VjY2VlZGVkKSAgICAgICAgXA0KKyAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgIH0NCisjZGVmaW5lIF9GWF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoYXJnLCB2YWwpIFwNCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgaWYgKChhcmcpICE9IEZYX0VSUl9TdWNjZWVkZWQpICAgICAgICAgICAgICAgICAgIFwNCisgICAgICByZXR1cm4gdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgIH0NCisjZGVmaW5lIF9GWF9FUlJfQ0hFQ0tfR09UT19QT1NJVElPTl9JRl9GQUlMKGFyZywgcG9zKSBcDQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBpZiAoKGFyZykgIT0gRlhfRVJSX1N1Y2NlZWRlZCkgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICBnb3RvIHBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9DQogDQotI2RlZmluZSBGWF9TSEFESU5HX1N0ZXBzCTI1Ng0KKyNkZWZpbmUgRlhfU0hBRElOR19TdGVwcyAyNTYNCiB0eXBlZGVmIGludDMyX3QgRlhfRGFzaFN0eWxlOw0KIGVudW0gew0KLSAgICBGWF9EQVNIU1RZTEVfU29saWQJCQkJCQk9IDAsDQotICAgIEZYX0RBU0hTVFlMRV9EYXNoCQkJCQkJPSAxLA0KLSAgICBGWF9EQVNIU1RZTEVfRG90CQkJCQkJPSAyLA0KLSAgICBGWF9EQVNIU1RZTEVfRGFzaERvdAkJCQkJPSAzLA0KLSAgICBGWF9EQVNIU1RZTEVfRGFzaERvdERvdAkJCQkJPSA0DQorICBGWF9EQVNIU1RZTEVfU29saWQgPSAwLA0KKyAgRlhfREFTSFNUWUxFX0Rhc2ggPSAxLA0KKyAgRlhfREFTSFNUWUxFX0RvdCA9IDIsDQorICBGWF9EQVNIU1RZTEVfRGFzaERvdCA9IDMsDQorICBGWF9EQVNIU1RZTEVfRGFzaERvdERvdCA9IDQNCiB9Ow0KIHR5cGVkZWYgaW50MzJfdCBGWF9TdHJva2VBbGlnbm1lbnQ7DQogZW51bSB7DQotICAgIEZYX1NUUk9LRUFMSUdOTUVOVF9DZW50ZXIJCQkJPSAwLA0KLSAgICBGWF9TVFJPS0VBTElHTk1FTlRfSW5zZXQJCQkJPSAxLA0KLSAgICBGWF9TVFJPS0VBTElHTk1FTlRfT3V0c2V0CQkJCT0gMiwNCi0gICAgRlhfU1RST0tFQUxJR05NRU5UX0xlZnQJCQkJCT0gMywNCi0gICAgRlhfU1RST0tFQUxJR05NRU5UX1JpZ2h0CQkJCT0gNA0KKyAgRlhfU1RST0tFQUxJR05NRU5UX0NlbnRlciA9IDAsDQorICBGWF9TVFJPS0VBTElHTk1FTlRfSW5zZXQgPSAxLA0KKyAgRlhfU1RST0tFQUxJR05NRU5UX091dHNldCA9IDIsDQorICBGWF9TVFJPS0VBTElHTk1FTlRfTGVmdCA9IDMsDQorICBGWF9TVFJPS0VBTElHTk1FTlRfUmlnaHQgPSA0DQogfTsNCiB0eXBlZGVmIGludDMyX3QgRlhfSGF0Y2hTdHlsZTsNCiBlbnVtIHsNCi0gICAgRlhfSEFUQ0hTVFlMRV9Ib3Jpem9udGFsCQkJCT0gMCwNCi0gICAgRlhfSEFUQ0hTVFlMRV9WZXJ0aWNhbAkJCQkJPSAxLA0KLSAgICBGWF9IQVRDSFNUWUxFX0ZvcndhcmREaWFnb25hbAkJCT0gMiwNCi0gICAgRlhfSEFUQ0hTVFlMRV9CYWNrd2FyZERpYWdvbmFsCQkJPSAzLA0KLSAgICBGWF9IQVRDSFNUWUxFX0Nyb3NzCQkJCQkJPSA0LA0KLSAgICBGWF9IQVRDSFNUWUxFX0RpYWdvbmFsQ3Jvc3MJCQkJPSA1LA0KLSAgICBGWF9IQVRDSFNUWUxFXzA1UGVyY2VudAkJCQkJPSA2LA0KLSAgICBGWF9IQVRDSFNUWUxFXzEwUGVyY2VudAkJCQkJPSA3LA0KLSAgICBGWF9IQVRDSFNUWUxFXzIwUGVyY2VudAkJCQkJPSA4LA0KLSAgICBGWF9IQVRDSFNUWUxFXzI1UGVyY2VudAkJCQkJPSA5LA0KLSAgICBGWF9IQVRDSFNUWUxFXzMwUGVyY2VudAkJCQkJPSAxMCwNCi0gICAgRlhfSEFUQ0hTVFlMRV80MFBlcmNlbnQJCQkJCT0gMTEsDQotICAgIEZYX0hBVENIU1RZTEVfNTBQZXJjZW50CQkJCQk9IDEyLA0KLSAgICBGWF9IQVRDSFNUWUxFXzYwUGVyY2VudAkJCQkJPSAxMywNCi0gICAgRlhfSEFUQ0hTVFlMRV83MFBlcmNlbnQJCQkJCT0gMTQsDQotICAgIEZYX0hBVENIU1RZTEVfNzVQZXJjZW50CQkJCQk9IDE1LA0KLSAgICBGWF9IQVRDSFNUWUxFXzgwUGVyY2VudAkJCQkJPSAxNiwNCi0gICAgRlhfSEFUQ0hTVFlMRV85MFBlcmNlbnQJCQkJCT0gMTcsDQotICAgIEZYX0hBVENIU1RZTEVfTGlnaHREb3dud2FyZERpYWdvbmFsCQk9IDE4LA0KLSAgICBGWF9IQVRDSFNUWUxFX0xpZ2h0VXB3YXJkRGlhZ29uYWwJCT0gMTksDQotICAgIEZYX0hBVENIU1RZTEVfRGFya0Rvd253YXJkRGlhZ29uYWwJCT0gMjAsDQotICAgIEZYX0hBVENIU1RZTEVfRGFya1Vwd2FyZERpYWdvbmFsCQk9IDIxLA0KLSAgICBGWF9IQVRDSFNUWUxFX1dpZGVEb3dud2FyZERpYWdvbmFsCQk9IDIyLA0KLSAgICBGWF9IQVRDSFNUWUxFX1dpZGVVcHdhcmREaWFnb25hbAkJPSAyMywNCi0gICAgRlhfSEFUQ0hTVFlMRV9MaWdodFZlcnRpY2FsCQkJCT0gMjQsDQotICAgIEZYX0hBVENIU1RZTEVfTGlnaHRIb3Jpem9udGFsCQkJPSAyNSwNCi0gICAgRlhfSEFUQ0hTVFlMRV9OYXJyb3dWZXJ0aWNhbAkJCT0gMjYsDQotICAgIEZYX0hBVENIU1RZTEVfTmFycm93SG9yaXpvbnRhbAkJCT0gMjcsDQotICAgIEZYX0hBVENIU1RZTEVfRGFya1ZlcnRpY2FsCQkJCT0gMjgsDQotICAgIEZYX0hBVENIU1RZTEVfRGFya0hvcml6b250YWwJCQk9IDI5LA0KLSAgICBGWF9IQVRDSFNUWUxFX0Rhc2hlZERvd253YXJkRGlhZ29uYWwJPSAzMCwNCi0gICAgRlhfSEFUQ0hTVFlMRV9EYXNoZWRVcHdhcmREaWFnb25hbAkJPSAzMSwNCi0gICAgRlhfSEFUQ0hTVFlMRV9EYXNoZWRIb3Jpem9udGFsCQkJPSAzMiwNCi0gICAgRlhfSEFUQ0hTVFlMRV9EYXNoZWRWZXJ0aWNhbAkJCT0gMzMsDQotICAgIEZYX0hBVENIU1RZTEVfU21hbGxDb25mZXR0aQkJCQk9IDM0LA0KLSAgICBGWF9IQVRDSFNUWUxFX0xhcmdlQ29uZmV0dGkJCQkJPSAzNSwNCi0gICAgRlhfSEFUQ0hTVFlMRV9aaWdaYWcJCQkJCT0gMzYsDQotICAgIEZYX0hBVENIU1RZTEVfV2F2ZQkJCQkJCT0gMzcsDQotICAgIEZYX0hBVENIU1RZTEVfRGlhZ29uYWxCcmljawkJCQk9IDM4LA0KLSAgICBGWF9IQVRDSFNUWUxFX0hvcml6b250YWxCcmljawkJCT0gMzksDQotICAgIEZYX0hBVENIU1RZTEVfV2VhdmUJCQkJCQk9IDQwLA0KLSAgICBGWF9IQVRDSFNUWUxFX1BsYWlkCQkJCQkJPSA0MSwNCi0gICAgRlhfSEFUQ0hTVFlMRV9EaXZvdAkJCQkJCT0gNDIsDQotICAgIEZYX0hBVENIU1RZTEVfRG90dGVkR3JpZAkJCQk9IDQzLA0KLSAgICBGWF9IQVRDSFNUWUxFX0RvdHRlZERpYW1vbmQJCQkJPSA0NCwNCi0gICAgRlhfSEFUQ0hTVFlMRV9TaGluZ2xlCQkJCQk9IDQ1LA0KLSAgICBGWF9IQVRDSFNUWUxFX1RyZWxsaXMJCQkJCT0gNDYsDQotICAgIEZYX0hBVENIU1RZTEVfU3BoZXJlCQkJCQk9IDQ3LA0KLSAgICBGWF9IQVRDSFNUWUxFX1NtYWxsR3JpZAkJCQkJPSA0OCwNCi0gICAgRlhfSEFUQ0hTVFlMRV9TbWFsbENoZWNrZXJCb2FyZAkJCT0gNDksDQotICAgIEZYX0hBVENIU1RZTEVfTGFyZ2VDaGVja2VyQm9hcmQJCQk9IDUwLA0KLSAgICBGWF9IQVRDSFNUWUxFX091dGxpbmVkRGlhbW9uZAkJCT0gNTEsDQotICAgIEZYX0hBVENIU1RZTEVfU29saWREaWFtb25kCQkJCT0gNTINCisgIEZYX0hBVENIU1RZTEVfSG9yaXpvbnRhbCA9IDAsDQorICBGWF9IQVRDSFNUWUxFX1ZlcnRpY2FsID0gMSwNCisgIEZYX0hBVENIU1RZTEVfRm9yd2FyZERpYWdvbmFsID0gMiwNCisgIEZYX0hBVENIU1RZTEVfQmFja3dhcmREaWFnb25hbCA9IDMsDQorICBGWF9IQVRDSFNUWUxFX0Nyb3NzID0gNCwNCisgIEZYX0hBVENIU1RZTEVfRGlhZ29uYWxDcm9zcyA9IDUsDQorICBGWF9IQVRDSFNUWUxFXzA1UGVyY2VudCA9IDYsDQorICBGWF9IQVRDSFNUWUxFXzEwUGVyY2VudCA9IDcsDQorICBGWF9IQVRDSFNUWUxFXzIwUGVyY2VudCA9IDgsDQorICBGWF9IQVRDSFNUWUxFXzI1UGVyY2VudCA9IDksDQorICBGWF9IQVRDSFNUWUxFXzMwUGVyY2VudCA9IDEwLA0KKyAgRlhfSEFUQ0hTVFlMRV80MFBlcmNlbnQgPSAxMSwNCisgIEZYX0hBVENIU1RZTEVfNTBQZXJjZW50ID0gMTIsDQorICBGWF9IQVRDSFNUWUxFXzYwUGVyY2VudCA9IDEzLA0KKyAgRlhfSEFUQ0hTVFlMRV83MFBlcmNlbnQgPSAxNCwNCisgIEZYX0hBVENIU1RZTEVfNzVQZXJjZW50ID0gMTUsDQorICBGWF9IQVRDSFNUWUxFXzgwUGVyY2VudCA9IDE2LA0KKyAgRlhfSEFUQ0hTVFlMRV85MFBlcmNlbnQgPSAxNywNCisgIEZYX0hBVENIU1RZTEVfTGlnaHREb3dud2FyZERpYWdvbmFsID0gMTgsDQorICBGWF9IQVRDSFNUWUxFX0xpZ2h0VXB3YXJkRGlhZ29uYWwgPSAxOSwNCisgIEZYX0hBVENIU1RZTEVfRGFya0Rvd253YXJkRGlhZ29uYWwgPSAyMCwNCisgIEZYX0hBVENIU1RZTEVfRGFya1Vwd2FyZERpYWdvbmFsID0gMjEsDQorICBGWF9IQVRDSFNUWUxFX1dpZGVEb3dud2FyZERpYWdvbmFsID0gMjIsDQorICBGWF9IQVRDSFNUWUxFX1dpZGVVcHdhcmREaWFnb25hbCA9IDIzLA0KKyAgRlhfSEFUQ0hTVFlMRV9MaWdodFZlcnRpY2FsID0gMjQsDQorICBGWF9IQVRDSFNUWUxFX0xpZ2h0SG9yaXpvbnRhbCA9IDI1LA0KKyAgRlhfSEFUQ0hTVFlMRV9OYXJyb3dWZXJ0aWNhbCA9IDI2LA0KKyAgRlhfSEFUQ0hTVFlMRV9OYXJyb3dIb3Jpem9udGFsID0gMjcsDQorICBGWF9IQVRDSFNUWUxFX0RhcmtWZXJ0aWNhbCA9IDI4LA0KKyAgRlhfSEFUQ0hTVFlMRV9EYXJrSG9yaXpvbnRhbCA9IDI5LA0KKyAgRlhfSEFUQ0hTVFlMRV9EYXNoZWREb3dud2FyZERpYWdvbmFsID0gMzAsDQorICBGWF9IQVRDSFNUWUxFX0Rhc2hlZFVwd2FyZERpYWdvbmFsID0gMzEsDQorICBGWF9IQVRDSFNUWUxFX0Rhc2hlZEhvcml6b250YWwgPSAzMiwNCisgIEZYX0hBVENIU1RZTEVfRGFzaGVkVmVydGljYWwgPSAzMywNCisgIEZYX0hBVENIU1RZTEVfU21hbGxDb25mZXR0aSA9IDM0LA0KKyAgRlhfSEFUQ0hTVFlMRV9MYXJnZUNvbmZldHRpID0gMzUsDQorICBGWF9IQVRDSFNUWUxFX1ppZ1phZyA9IDM2LA0KKyAgRlhfSEFUQ0hTVFlMRV9XYXZlID0gMzcsDQorICBGWF9IQVRDSFNUWUxFX0RpYWdvbmFsQnJpY2sgPSAzOCwNCisgIEZYX0hBVENIU1RZTEVfSG9yaXpvbnRhbEJyaWNrID0gMzksDQorICBGWF9IQVRDSFNUWUxFX1dlYXZlID0gNDAsDQorICBGWF9IQVRDSFNUWUxFX1BsYWlkID0gNDEsDQorICBGWF9IQVRDSFNUWUxFX0Rpdm90ID0gNDIsDQorICBGWF9IQVRDSFNUWUxFX0RvdHRlZEdyaWQgPSA0MywNCisgIEZYX0hBVENIU1RZTEVfRG90dGVkRGlhbW9uZCA9IDQ0LA0KKyAgRlhfSEFUQ0hTVFlMRV9TaGluZ2xlID0gNDUsDQorICBGWF9IQVRDSFNUWUxFX1RyZWxsaXMgPSA0NiwNCisgIEZYX0hBVENIU1RZTEVfU3BoZXJlID0gNDcsDQorICBGWF9IQVRDSFNUWUxFX1NtYWxsR3JpZCA9IDQ4LA0KKyAgRlhfSEFUQ0hTVFlMRV9TbWFsbENoZWNrZXJCb2FyZCA9IDQ5LA0KKyAgRlhfSEFUQ0hTVFlMRV9MYXJnZUNoZWNrZXJCb2FyZCA9IDUwLA0KKyAgRlhfSEFUQ0hTVFlMRV9PdXRsaW5lZERpYW1vbmQgPSA1MSwNCisgIEZYX0hBVENIU1RZTEVfU29saWREaWFtb25kID0gNTINCiB9Ow0KIHR5cGVkZWYgaW50MzJfdCBGWF9EZXZpY2VDYXA7DQogdHlwZWRlZiBpbnQzMl90IEZYX0ZpbGxNb2RlOw0KQEAgLTExMiw0MDIgKzEzNiwzNjQgQEAKIGNsYXNzIENGWF9QYXRoOw0KIGNsYXNzIENGWF9QYXR0ZXJuOw0KIGNsYXNzIENGWF9TaGFkaW5nOw0KLWNsYXNzIENGWF9HcmFwaGljcw0KLXsNCi1wdWJsaWM6DQorY2xhc3MgQ0ZYX0dyYXBoaWNzIHsNCisgcHVibGljOg0KKyAgQ0ZYX0dyYXBoaWNzKCk7DQogDQorICBGWF9FUlIgQ3JlYXRlKENGWF9SZW5kZXJEZXZpY2UqIHJlbmRlckRldmljZSwgRlhfQk9PTCBpc0FudGlhbGlhc2luZyA9IFRSVUUpOw0KIA0KLSAgICBDRlhfR3JhcGhpY3MoKTsNCisgIEZYX0VSUiBDcmVhdGUoaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsDQorICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNOYXRpdmUgPSBUUlVFLA0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGlzQW50aWFsaWFzaW5nID0gVFJVRSk7DQogDQotICAgIEZYX0VSUiBDcmVhdGUoQ0ZYX1JlbmRlckRldmljZSAqIHJlbmRlckRldmljZSwgRlhfQk9PTCBpc0FudGlhbGlhc2luZyA9IFRSVUUpOw0KKyAgdmlydHVhbCB+Q0ZYX0dyYXBoaWNzKCk7DQogDQotICAgIEZYX0VSUiBDcmVhdGUoaW50MzJfdAkgICB3aWR0aCwNCi0gICAgICAgICAgICAgICAgICBpbnQzMl90CSAgIGhlaWdodCwNCi0gICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0LA0KLSAgICAgICAgICAgICAgICAgIEZYX0JPT0wgICAgICBpc05hdGl2ZSAgICAgICA9IFRSVUUsDQotICAgICAgICAgICAgICAgICAgRlhfQk9PTAkgICBpc0FudGlhbGlhc2luZyA9IFRSVUUpOw0KKyAgRlhfRVJSIEdldERldmljZUNhcChjb25zdCBpbnQzMl90IGNhcElELCBGWF9EZXZpY2VDYXAmIGNhcFZhbCk7DQorICBGWF9FUlIgSXNQcmludGVyRGV2aWNlKEZYX0JPT0wmIGlzUHJpbnRlcik7DQorICBGWF9FUlIgRW5hYmxlQW50aWFsaWFzaW5nKEZYX0JPT0wgaXNBbnRpYWxpYXNpbmcpOw0KIA0KKyAgRlhfRVJSIFNhdmVHcmFwaFN0YXRlKCk7DQogDQotICAgIHZpcnR1YWwgfkNGWF9HcmFwaGljcygpOw0KKyAgRlhfRVJSIFJlc3RvcmVHcmFwaFN0YXRlKCk7DQogDQorICBGWF9FUlIgR2V0TGluZUNhcChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAmIGxpbmVDYXApOw0KIA0KKyAgRlhfRVJSIFNldExpbmVDYXAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIGxpbmVDYXApOw0KIA0KLSAgICBGWF9FUlIgR2V0RGV2aWNlQ2FwKGNvbnN0IGludDMyX3QgY2FwSUQsIEZYX0RldmljZUNhcCAmIGNhcFZhbCk7DQotICAgIEZYX0VSUiBJc1ByaW50ZXJEZXZpY2UoRlhfQk9PTCAmIGlzUHJpbnRlcik7DQotICAgIEZYX0VSUiBFbmFibGVBbnRpYWxpYXNpbmcoRlhfQk9PTCBpc0FudGlhbGlhc2luZyk7DQorICBGWF9FUlIgR2V0RGFzaENvdW50KGludDMyX3QmIGRhc2hDb3VudCk7DQogDQorICBGWF9FUlIgR2V0TGluZURhc2goRlhfRkxPQVQmIGRhc2hQaGFzZSwgRlhfRkxPQVQqIGRhc2hBcnJheSk7DQogDQorICBGWF9FUlIgU2V0TGluZURhc2goRlhfRkxPQVQgZGFzaFBoYXNlLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBkYXNoQXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXNoQ291bnQpOw0KIA0KLSAgICBGWF9FUlIgU2F2ZUdyYXBoU3RhdGUoKTsNCisgIEZYX0VSUiBTZXRMaW5lRGFzaChGWF9EYXNoU3R5bGUgZGFzaFN0eWxlKTsNCiANCi0gICAgRlhfRVJSIFJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICBGWF9FUlIgR2V0TGluZUpvaW4oQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbiYgbGluZUpvaW4pOw0KIA0KKyAgRlhfRVJSIFNldExpbmVKb2luKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW4gbGluZUpvaW4pOw0KIA0KKyAgRlhfRVJSIEdldE1pdGVyTGltaXQoRlhfRkxPQVQmIG1pdGVyTGltaXQpOw0KIA0KLSAgICBGWF9FUlIgR2V0TGluZUNhcChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAgJiBsaW5lQ2FwKTsNCisgIEZYX0VSUiBTZXRNaXRlckxpbWl0KEZYX0ZMT0FUIG1pdGVyTGltaXQpOw0KIA0KLSAgICBGWF9FUlIgU2V0TGluZUNhcChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAgbGluZUNhcCk7DQorICBGWF9FUlIgR2V0TGluZVdpZHRoKEZYX0ZMT0FUJiBsaW5lV2lkdGgpOw0KIA0KLSAgICBGWF9FUlIgR2V0RGFzaENvdW50KGludDMyX3QgJiBkYXNoQ291bnQpOw0KKyAgRlhfRVJSIFNldExpbmVXaWR0aChGWF9GTE9BVCBsaW5lV2lkdGgsIEZYX0JPT0wgaXNBY3RPbkRhc2ggPSBGQUxTRSk7DQogDQotICAgIEZYX0VSUiBHZXRMaW5lRGFzaChGWF9GTE9BVCAmIGRhc2hQaGFzZSwgRlhfRkxPQVQgKiBkYXNoQXJyYXkpOw0KKyAgRlhfRVJSIEdldFN0cm9rZUFsaWdubWVudChGWF9TdHJva2VBbGlnbm1lbnQmIHN0cm9rZUFsaWdubWVudCk7DQogDQotICAgIEZYX0VSUiBTZXRMaW5lRGFzaChGWF9GTE9BVCBkYXNoUGhhc2UsIEZYX0ZMT0FUICogZGFzaEFycmF5LCBpbnQzMl90IGRhc2hDb3VudCk7DQorICBGWF9FUlIgU2V0U3Ryb2tlQWxpZ25tZW50KEZYX1N0cm9rZUFsaWdubWVudCBzdHJva2VBbGlnbm1lbnQpOw0KIA0KLSAgICBGWF9FUlIgU2V0TGluZURhc2goRlhfRGFzaFN0eWxlIGRhc2hTdHlsZSk7DQorICBGWF9FUlIgU2V0U3Ryb2tlQ29sb3IoQ0ZYX0NvbG9yKiBjb2xvcik7DQogDQotICAgIEZYX0VSUiBHZXRMaW5lSm9pbihDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luICYgbGluZUpvaW4pOw0KKyAgRlhfRVJSIFNldEZpbGxDb2xvcihDRlhfQ29sb3IqIGNvbG9yKTsNCiANCi0gICAgRlhfRVJSIFNldExpbmVKb2luKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW4gbGluZUpvaW4pOw0KKyAgRlhfRVJSIFN0cm9rZVBhdGgoQ0ZYX1BhdGgqIHBhdGgsIENGWF9NYXRyaXgqIG1hdHJpeCA9IE5VTEwpOw0KIA0KLSAgICBGWF9FUlIgR2V0TWl0ZXJMaW1pdChGWF9GTE9BVCAmIG1pdGVyTGltaXQpOw0KKyAgRlhfRVJSIEZpbGxQYXRoKENGWF9QYXRoKiBwYXRoLA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlID0gRlhGSUxMX1dJTkRJTkcsDQorICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4ID0gTlVMTCk7DQogDQotICAgIEZYX0VSUiBTZXRNaXRlckxpbWl0KEZYX0ZMT0FUIG1pdGVyTGltaXQpOw0KKyAgRlhfRVJSIENsaXBQYXRoKENGWF9QYXRoKiBwYXRoLA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlID0gRlhGSUxMX1dJTkRJTkcsDQorICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4ID0gTlVMTCk7DQogDQotICAgIEZYX0VSUiBHZXRMaW5lV2lkdGgoRlhfRkxPQVQgJiBsaW5lV2lkdGgpOw0KKyAgRlhfRVJSIERyYXdJbWFnZShDRlhfRElCU291cmNlKiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LA0KKyAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXggPSBOVUxMKTsNCiANCi0gICAgRlhfRVJSIFNldExpbmVXaWR0aChGWF9GTE9BVCBsaW5lV2lkdGgsIEZYX0JPT0wgaXNBY3RPbkRhc2ggPSBGQUxTRSk7DQorICBGWF9FUlIgU3RyZXRjaEltYWdlKENGWF9ESUJTb3VyY2UqIHNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXggPSBOVUxMKTsNCiANCi0gICAgRlhfRVJSIEdldFN0cm9rZUFsaWdubWVudChGWF9TdHJva2VBbGlnbm1lbnQgJiBzdHJva2VBbGlnbm1lbnQpOw0KKyAgRlhfRVJSIENvbmNhdE1hdHJpeChDRlhfTWF0cml4KiBtYXRyaXgpOw0KIA0KLSAgICBGWF9FUlIgU2V0U3Ryb2tlQWxpZ25tZW50KEZYX1N0cm9rZUFsaWdubWVudCBzdHJva2VBbGlnbm1lbnQpOw0KKyAgQ0ZYX01hdHJpeCogR2V0TWF0cml4KCk7DQogDQorICBGWF9FUlIgR2V0Q2xpcFJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCiANCisgIEZYX0VSUiBTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KIA0KLSAgICBGWF9FUlIgU2V0U3Ryb2tlQ29sb3IoQ0ZYX0NvbG9yICogY29sb3IpOw0KKyAgRlhfRVJSIENsZWFyQ2xpcCgpOw0KIA0KLSAgICBGWF9FUlIgU2V0RmlsbENvbG9yKENGWF9Db2xvciAqIGNvbG9yKTsNCisgIEZYX0VSUiBTZXRGb250KENGWF9Gb250KiBmb250KTsNCiANCisgIEZYX0VSUiBTZXRGb250U2l6ZShjb25zdCBGWF9GTE9BVCBzaXplKTsNCiANCisgIEZYX0VSUiBTZXRGb250SFNjYWxlKGNvbnN0IEZYX0ZMT0FUIHNjYWxlKTsNCiANCi0gICAgRlhfRVJSIFN0cm9rZVBhdGgoQ0ZYX1BhdGggKiBwYXRoLCBDRlhfTWF0cml4ICogbWF0cml4ID0gTlVMTCk7DQorICBGWF9FUlIgU2V0Q2hhclNwYWNpbmcoY29uc3QgRlhfRkxPQVQgc3BhY2luZyk7DQogDQotICAgIEZYX0VSUiBGaWxsUGF0aChDRlhfUGF0aCAqCSBwYXRoLA0KLSAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUJIGZpbGxNb2RlID0gRlhGSUxMX1dJTkRJTkcsDQotICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICogbWF0cml4CSAgPSBOVUxMKTsNCisgIEZYX0VSUiBTZXRUZXh0RHJhd2luZ01vZGUoY29uc3QgaW50MzJfdCBtb2RlKTsNCiANCi0gICAgRlhfRVJSIENsaXBQYXRoKENGWF9QYXRoICoJIHBhdGgsDQotICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZQkgZmlsbE1vZGUgPSBGWEZJTExfV0lORElORywNCi0gICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKiBtYXRyaXgJICA9IE5VTEwpOw0KKyAgRlhfRVJSIFNob3dUZXh0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCA9IE5VTEwpOw0KIA0KKyAgRlhfRVJSIENhbGNUZXh0UmVjdChDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzTXVsdGlsaW5lID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCA9IE5VTEwpOw0KIA0KKyAgRlhfRVJSIFRyYW5zZmVyKENGWF9HcmFwaGljcyogZ3JhcGhpY3MsIENGWF9NYXRyaXgqIG1hdHJpeCA9IE5VTEwpOw0KIA0KLSAgICBGWF9FUlIgRHJhd0ltYWdlKENGWF9ESUJTb3VyY2UgKglzb3VyY2UsDQotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiAmCXBvaW50LA0KLSAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkJbWF0cml4ID0gTlVMTCk7DQorICBGWF9FUlIgVHJhbnNmZXIoQ0ZYX0dyYXBoaWNzKiBncmFwaGljcywNCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzcmNMZWZ0LA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHNyY1RvcCwNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIGRzdFJlY3QsDQorICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4ID0gTlVMTCk7DQogDQotICAgIEZYX0VSUiBTdHJldGNoSW1hZ2UoQ0ZYX0RJQlNvdXJjZSAqCSAgc291cmNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiAmIHJlY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCSAgbWF0cml4ID0gTlVMTCk7DQorICBDRlhfUmVuZGVyRGV2aWNlKiBHZXRSZW5kZXJEZXZpY2UoKTsNCiANCisgIEZYX0VSUiBJbnZlcnNlUmVjdChjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgRlhfRVJSIFhvckRJQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCogc3JjQml0bWFwLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgRlhfRVJSIEVxdkRJQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCogc3JjQml0bWFwLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KIA0KKyBwcml2YXRlOg0KKyAgRlhfRVJSIFJlbmRlckRldmljZVNldExpbmVEYXNoKEZYX0Rhc2hTdHlsZSBkYXNoU3R5bGUpOw0KIA0KLSAgICBGWF9FUlIgQ29uY2F0TWF0cml4KENGWF9NYXRyaXggKiBtYXRyaXgpOw0KKyAgRlhfRVJSIFJlbmRlckRldmljZVN0cm9rZVBhdGgoQ0ZYX1BhdGgqIHBhdGgsIENGWF9NYXRyaXgqIG1hdHJpeCk7DQogDQotICAgIENGWF9NYXRyaXggKiBHZXRNYXRyaXgoKTsNCisgIEZYX0VSUiBSZW5kZXJEZXZpY2VGaWxsUGF0aChDRlhfUGF0aCogcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSBmaWxsTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpOw0KIA0KKyAgRlhfRVJSIFJlbmRlckRldmljZURyYXdJbWFnZShDRlhfRElCU291cmNlKiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpOw0KIA0KKyAgRlhfRVJSIFJlbmRlckRldmljZVN0cmV0Y2hJbWFnZShDRlhfRElCU291cmNlKiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KTsNCiANCi0gICAgRlhfRVJSIEdldENsaXBSZWN0KENGWF9SZWN0RiAmIHJlY3QpOw0KLQ0KLSAgICBGWF9FUlIgU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGICYgcmVjdCk7DQotDQotICAgIEZYX0VSUiBDbGVhckNsaXAoKTsNCi0NCi0NCi0NCi0gICAgRlhfRVJSIFNldEZvbnQoQ0ZYX0ZvbnQgKiBmb250KTsNCi0NCi0gICAgRlhfRVJSIFNldEZvbnRTaXplKGNvbnN0IEZYX0ZMT0FUIHNpemUpOw0KLQ0KLSAgICBGWF9FUlIgU2V0Rm9udEhTY2FsZShjb25zdCBGWF9GTE9BVCBzY2FsZSk7DQotDQotICAgIEZYX0VSUiBTZXRDaGFyU3BhY2luZyhjb25zdCBGWF9GTE9BVCBzcGFjaW5nKTsNCi0NCi0gICAgRlhfRVJSIFNldFRleHREcmF3aW5nTW9kZShjb25zdCBpbnQzMl90IG1vZGUpOw0KLQ0KLQ0KLSAgICBGWF9FUlIgU2hvd1RleHQoY29uc3QgQ0ZYX1BvaW50RiAmCSAgIHBvaW50LA0KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB0ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCQkgICBtYXRyaXggPSBOVUxMKTsNCi0NCi0NCi0gICAgRlhfRVJSIENhbGNUZXh0UmVjdChDRlhfUmVjdEYgJgkJCSAgIHJlY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB0ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wJCQkJICAgaXNNdWx0aWxpbmUgPSBGQUxTRSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICoJCSAgIG1hdHJpeAkgICA9IE5VTEwpOw0KLQ0KLQ0KLQ0KLSAgICBGWF9FUlIgVHJhbnNmZXIoQ0ZYX0dyYXBoaWNzICogZ3JhcGhpY3MsIENGWF9NYXRyaXggKiBtYXRyaXggPSBOVUxMKTsNCi0NCi0NCi0gICAgRlhfRVJSIFRyYW5zZmVyKENGWF9HcmFwaGljcyAqCSAgZ3JhcGhpY3MsDQotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVAkJICBzcmNMZWZ0LA0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQJCSAgc3JjVG9wLA0KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGICYgZHN0UmVjdCwNCi0gICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkgIG1hdHJpeCAgPSBOVUxMKTsNCi0NCi0NCi0NCi0NCi0gICAgQ0ZYX1JlbmRlckRldmljZSAqIEdldFJlbmRlckRldmljZSgpOw0KLQ0KLSAgICBGWF9FUlIJSW52ZXJzZVJlY3QoY29uc3QgQ0ZYX1JlY3RGICYgcmVjdCk7DQotICAgIEZYX0VSUglYb3JESUJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAgKiBzcmNCaXRtYXAsIGNvbnN0IENGWF9SZWN0RiAmIHJlY3QpOw0KLSAgICBGWF9FUlIJRXF2RElCaXRtYXAoY29uc3QgQ0ZYX0RJQml0bWFwICogc3JjQml0bWFwLCBjb25zdCBDRlhfUmVjdEYgJiByZWN0KTsNCi1wcml2YXRlOg0KLQ0KLSAgICBGWF9FUlIgUmVuZGVyRGV2aWNlU2V0TGluZURhc2goRlhfRGFzaFN0eWxlIGRhc2hTdHlsZSk7DQotDQotICAgIEZYX0VSUiBSZW5kZXJEZXZpY2VTdHJva2VQYXRoKENGWF9QYXRoICogcGF0aCwgQ0ZYX01hdHJpeCAqIG1hdHJpeCk7DQotDQotICAgIEZYX0VSUiBSZW5kZXJEZXZpY2VGaWxsUGF0aChDRlhfUGF0aCAqCSBwYXRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUJIGZpbGxNb2RlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqIG1hdHJpeCk7DQotDQotDQotICAgIEZYX0VSUiBSZW5kZXJEZXZpY2VEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSAqCXNvdXJjZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGICYJcG9pbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCQltYXRyaXgpOw0KLQ0KLSAgICBGWF9FUlIgUmVuZGVyRGV2aWNlU3RyZXRjaEltYWdlKENGWF9ESUJTb3VyY2UgKgkgIHNvdXJjZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYgJiByZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkgIG1hdHJpeCk7DQotDQotICAgIEZYX0VSUiBSZW5kZXJEZXZpY2VTaG93VGV4dChjb25zdCBDRlhfUG9pbnRGICYJICAgcG9pbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmIHRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICoJCSAgIG1hdHJpeCk7DQotDQotICAgIEZYX0VSUiBTdHJva2VQYXRoV2l0aFBhdHRlcm4oQ0ZYX1BhdGggKiBwYXRoLCBDRlhfTWF0cml4ICogbWF0cml4KTsNCisgIEZYX0VSUiBSZW5kZXJEZXZpY2VTaG93VGV4dChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgdGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpOw0KIA0KLSAgICBGWF9FUlIgU3Ryb2tlUGF0aFdpdGhTaGFkaW5nKENGWF9QYXRoICogcGF0aCwgQ0ZYX01hdHJpeCAqIG1hdHJpeCk7DQorICBGWF9FUlIgU3Ryb2tlUGF0aFdpdGhQYXR0ZXJuKENGWF9QYXRoKiBwYXRoLCBDRlhfTWF0cml4KiBtYXRyaXgpOw0KIA0KLSAgICBGWF9FUlIgRmlsbFBhdGhXaXRoUGF0dGVybihDRlhfUGF0aCAqCXBhdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlCWZpbGxNb2RlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICoJbWF0cml4KTsNCisgIEZYX0VSUiBTdHJva2VQYXRoV2l0aFNoYWRpbmcoQ0ZYX1BhdGgqIHBhdGgsIENGWF9NYXRyaXgqIG1hdHJpeCk7DQogDQotICAgIEZYX0VSUiBGaWxsUGF0aFdpdGhTaGFkaW5nKENGWF9QYXRoICoJcGF0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUJZmlsbE1vZGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgltYXRyaXgpOw0KLSAgICBGWF9FUlIgU2V0RElCaXRzV2l0aE1hdHJpeChDRlhfRElCU291cmNlICogc291cmNlLCBDRlhfTWF0cml4ICogbWF0cml4KTsNCi0gICAgRlhfRVJSIENhbGNUZXh0SW5mbyhjb25zdCBDRlhfV2lkZVN0cmluZyAmIHRleHQsIEZYX0RXT1JEICogY2hhckNvZGVzLCBGWFRFWFRfQ0hBUlBPUyAqIGNoYXJQb3MsIENGWF9SZWN0RiAmIHJlY3QpOw0KKyAgRlhfRVJSIEZpbGxQYXRoV2l0aFBhdHRlcm4oQ0ZYX1BhdGgqIHBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSBmaWxsTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCk7DQogDQorICBGWF9FUlIgRmlsbFBhdGhXaXRoU2hhZGluZyhDRlhfUGF0aCogcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KTsNCisgIEZYX0VSUiBTZXRESUJpdHNXaXRoTWF0cml4KENGWF9ESUJTb3VyY2UqIHNvdXJjZSwgQ0ZYX01hdHJpeCogbWF0cml4KTsNCisgIEZYX0VSUiBDYWxjVGV4dEluZm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBjaGFyQ29kZXMsDQorICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBjaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QpOw0KIA0KLXByb3RlY3RlZDoNCi0gICAgaW50MzJfdAkJX3R5cGU7DQotcHJpdmF0ZToNCi0gICAgc3RydWN0IFRJbmZvIHsNCi0gICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YQlfZ3JhcGhTdGF0ZTsNCi0gICAgICAgIEZYX0JPT0wJCQkJX2lzQW50aWFsaWFzaW5nOw0KLSAgICAgICAgRlhfU3Ryb2tlQWxpZ25tZW50CV9zdHJva2VBbGlnbm1lbnQ7DQotICAgICAgICBDRlhfTWF0cml4CQkJX0NUTTsNCi0gICAgICAgIEZYX0JPT0wJCQkJX2lzQWN0T25EYXNoOw0KLSAgICAgICAgQ0ZYX0NvbG9yICoJCQlfc3Ryb2tlQ29sb3I7DQotICAgICAgICBDRlhfQ29sb3IgKgkJCV9maWxsQ29sb3I7DQotICAgICAgICBDRlhfRm9udCAqCQkJX2ZvbnQ7DQotICAgICAgICBGWF9GTE9BVAkJCV9mb250U2l6ZTsNCi0gICAgICAgIEZYX0ZMT0FUCQkJX2ZvbnRIU2NhbGU7DQotICAgICAgICBGWF9GTE9BVAkJCV9mb250U3BhY2luZzsNCi0gICAgfSBfaW5mbzsNCi0gICAgQ0ZYX1JlbmRlckRldmljZSAqCV9yZW5kZXJEZXZpY2U7DQotICAgIENGWF9QdHJBcnJheQkJX2luZm9TdGFjazsNCi0gICAgQ0FHR19HcmFwaGljcyAqICAgICBfYWdnR3JhcGhpY3M7DQotICAgIGZyaWVuZCBjbGFzcyBDQUdHX0dyYXBoaWNzOw0KKyBwcm90ZWN0ZWQ6DQorICBpbnQzMl90IF90eXBlOw0KIA0KKyBwcml2YXRlOg0KKyAgc3RydWN0IFRJbmZvIHsNCisgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIF9ncmFwaFN0YXRlOw0KKyAgICBGWF9CT09MIF9pc0FudGlhbGlhc2luZzsNCisgICAgRlhfU3Ryb2tlQWxpZ25tZW50IF9zdHJva2VBbGlnbm1lbnQ7DQorICAgIENGWF9NYXRyaXggX0NUTTsNCisgICAgRlhfQk9PTCBfaXNBY3RPbkRhc2g7DQorICAgIENGWF9Db2xvciogX3N0cm9rZUNvbG9yOw0KKyAgICBDRlhfQ29sb3IqIF9maWxsQ29sb3I7DQorICAgIENGWF9Gb250KiBfZm9udDsNCisgICAgRlhfRkxPQVQgX2ZvbnRTaXplOw0KKyAgICBGWF9GTE9BVCBfZm9udEhTY2FsZTsNCisgICAgRlhfRkxPQVQgX2ZvbnRTcGFjaW5nOw0KKyAgfSBfaW5mbzsNCisgIENGWF9SZW5kZXJEZXZpY2UqIF9yZW5kZXJEZXZpY2U7DQorICBDRlhfUHRyQXJyYXkgX2luZm9TdGFjazsNCisgIENBR0dfR3JhcGhpY3MqIF9hZ2dHcmFwaGljczsNCisgIGZyaWVuZCBjbGFzcyBDQUdHX0dyYXBoaWNzOw0KIH07DQotY2xhc3MgQ0ZYX1BhdGgNCi17DQotcHVibGljOg0KK2NsYXNzIENGWF9QYXRoIHsNCisgcHVibGljOg0KKyAgQ0ZYX1BhdGgoKTsNCiANCisgIEZYX0VSUiBDcmVhdGUoKTsNCiANCi0gICAgQ0ZYX1BhdGgoKTsNCisgIHZpcnR1YWwgfkNGWF9QYXRoKCk7DQogDQotICAgIEZYX0VSUiBDcmVhdGUoKTsNCisgIEZYX0VSUiBNb3ZlVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7DQogDQotICAgIHZpcnR1YWwgfkNGWF9QYXRoKCk7DQorICBGWF9FUlIgTGluZVRvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOw0KIA0KKyAgRlhfRVJSIEJlemllclRvKEZYX0ZMT0FUIGN0cmxYMSwNCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsWTEsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFgyLA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxZMiwNCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b1gsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9ZKTsNCiANCi0gICAgRlhfRVJSIE1vdmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KTsNCisgIEZYX0VSUiBBcmNUbyhGWF9GTE9BVCBsZWZ0LA0KKyAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwNCisgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCisgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQorICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlKTsNCiANCi0gICAgRlhfRVJSIExpbmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KTsNCisgIEZYX0VSUiBDbG9zZSgpOw0KIA0KLSAgICBGWF9FUlIgQmV6aWVyVG8oRlhfRkxPQVQgY3RybFgxLA0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFkxLA0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFgyLA0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFkyLA0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9YLA0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9ZKTsNCisgIEZYX0VSUiBBZGRMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyKTsNCiANCi0gICAgRlhfRVJSIEFyY1RvKEZYX0ZMT0FUIGxlZnQsDQotICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQotICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhlaWdodCwNCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQotICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlKTsNCisgIEZYX0VSUiBBZGRCZXppZXIoRlhfRkxPQVQgc3RhcnRYLA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydFksDQorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxYMSwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFkxLA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsWDIsDQorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxZMiwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kWCwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kWSk7DQogDQotICAgIEZYX0VSUiBDbG9zZSgpOw0KKyAgRlhfRVJSIEFkZFJlY3RhbmdsZShGWF9GTE9BVCBsZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQpOw0KIA0KKyAgRlhfRVJSIEFkZEVsbGlwc2UoRlhfRkxPQVQgbGVmdCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0KTsNCiANCi0gICAgRlhfRVJSIEFkZExpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpOw0KKyAgRlhfRVJSIEFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCiANCi0gICAgRlhfRVJSIEFkZEJlemllcihGWF9GTE9BVCBzdGFydFgsDQotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRZLA0KLSAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxYMSwNCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsWTEsDQotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFgyLA0KLSAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxZMiwNCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRYLA0KLSAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZFkpOw0KKyAgRlhfRVJSIEFkZEFyYyhGWF9GTE9BVCBsZWZ0LA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwQW5nbGUpOw0KIA0KLSAgICBGWF9FUlIgQWRkUmVjdGFuZ2xlKEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIHRvcCwgRlhfRkxPQVQgd2lkdGgsIEZYX0ZMT0FUIGhlaWdodCk7DQorICBGWF9FUlIgQWRkUGllKEZYX0ZMT0FUIGxlZnQsDQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhlaWdodCwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSk7DQogDQotICAgIEZYX0VSUiBBZGRFbGxpcHNlKEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIHRvcCwgRlhfRkxPQVQgd2lkdGgsIEZYX0ZMT0FUIGhlaWdodCk7DQorICBGWF9FUlIgQWRkU3VicGF0aChDRlhfUGF0aCogcGF0aCk7DQogDQotICAgIEZYX0VSUiBBZGRFbGxpcHNlKGNvbnN0IENGWF9SZWN0RiAmIHJlY3QpOw0KKyAgRlhfRVJSIENsZWFyKCk7DQogDQotICAgIEZYX0VSUiBBZGRBcmMoRlhfRkxPQVQgbGVmdCwNCi0gICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQotICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQotICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KLSAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQotICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSk7DQorICBGWF9CT09MIElzRW1wdHkoKTsNCiANCi0gICAgRlhfRVJSIEFkZFBpZShGWF9GTE9BVCBsZWZ0LA0KLSAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwNCi0gICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCi0gICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQotICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCi0gICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlKTsNCisgIENGWF9QYXRoRGF0YSogR2V0UGF0aERhdGEoKTsNCiANCi0gICAgRlhfRVJSIEFkZFN1YnBhdGgoQ0ZYX1BhdGggKiBwYXRoKTsNCi0NCi0gICAgRlhfRVJSIENsZWFyKCk7DQotDQotICAgIEZYX0JPT0wgSXNFbXB0eSgpOw0KLQ0KLSAgICBDRlhfUGF0aERhdGEgKiBHZXRQYXRoRGF0YSgpOw0KLXByaXZhdGU6DQotICAgIENGWF9QYXRoR2VuZXJhdG9yICoJX2dlbmVyYXRvcjsNCisgcHJpdmF0ZToNCisgIENGWF9QYXRoR2VuZXJhdG9yKiBfZ2VuZXJhdG9yOw0KIH07DQotY2xhc3MgQ0ZYX0NvbG9yDQotew0KLXB1YmxpYzoNCitjbGFzcyBDRlhfQ29sb3Igew0KKyBwdWJsaWM6DQorICBDRlhfQ29sb3IoKTsNCiANCi0gICAgQ0ZYX0NvbG9yKCk7DQorICBDRlhfQ29sb3IoY29uc3QgRlhfQVJHQiBhcmdiKTsNCiANCi0gICAgQ0ZYX0NvbG9yKGNvbnN0IEZYX0FSR0IgYXJnYik7DQorICBDRlhfQ29sb3IoQ0ZYX1BhdHRlcm4qIHBhdHRlcm4sIGNvbnN0IEZYX0FSR0IgYXJnYiA9IDB4MCk7DQogDQorICBDRlhfQ29sb3IoQ0ZYX1NoYWRpbmcqIHNoYWRpbmcpOw0KIA0KLSAgICBDRlhfQ29sb3IoQ0ZYX1BhdHRlcm4gKiBwYXR0ZXJuLCBjb25zdCBGWF9BUkdCIGFyZ2IgPSAweDApOw0KKyAgdmlydHVhbCB+Q0ZYX0NvbG9yKCk7DQogDQorICBGWF9FUlIgU2V0KGNvbnN0IEZYX0FSR0IgYXJnYik7DQogDQotICAgIENGWF9Db2xvcihDRlhfU2hhZGluZyAqIHNoYWRpbmcpOw0KKyAgRlhfRVJSIFNldChDRlhfUGF0dGVybiogcGF0dGVybiwgY29uc3QgRlhfQVJHQiBhcmdiID0gMHgwKTsNCiANCisgIEZYX0VSUiBTZXQoQ0ZYX1NoYWRpbmcqIHNoYWRpbmcpOw0KIA0KLSAgICB2aXJ0dWFsIH5DRlhfQ29sb3IoKTsNCi0NCi0NCi0gICAgRlhfRVJSIFNldChjb25zdCBGWF9BUkdCIGFyZ2IpOw0KLQ0KLQ0KLSAgICBGWF9FUlIgU2V0KENGWF9QYXR0ZXJuICogcGF0dGVybiwgY29uc3QgRlhfQVJHQiBhcmdiID0gMHgwKTsNCi0NCi0NCi0gICAgRlhfRVJSIFNldChDRlhfU2hhZGluZyAqIHNoYWRpbmcpOw0KLQ0KLXByaXZhdGU6DQotICAgIGludDMyX3QJCQkJX3R5cGU7DQotICAgIHVuaW9uIHsNCi0gICAgICAgIHN0cnVjdCB7DQotICAgICAgICAgICAgRlhfQVJHQgkJCV9hcmdiOw0KLSAgICAgICAgICAgIENGWF9QYXR0ZXJuICoJX3BhdHRlcm47DQotICAgICAgICB9Ow0KLSAgICAgICAgQ0ZYX1NoYWRpbmcgKgkJX3NoYWRpbmc7DQorIHByaXZhdGU6DQorICBpbnQzMl90IF90eXBlOw0KKyAgdW5pb24gew0KKyAgICBzdHJ1Y3Qgew0KKyAgICAgIEZYX0FSR0IgX2FyZ2I7DQorICAgICAgQ0ZYX1BhdHRlcm4qIF9wYXR0ZXJuOw0KICAgICB9Ow0KKyAgICBDRlhfU2hhZGluZyogX3NoYWRpbmc7DQorICB9Ow0KIA0KLSAgICBmcmllbmQgY2xhc3MgQ0ZYX0dyYXBoaWNzOw0KKyAgZnJpZW5kIGNsYXNzIENGWF9HcmFwaGljczsNCiB9Ow0KLWNsYXNzIENGWF9QYXR0ZXJuDQotew0KLXB1YmxpYzoNCitjbGFzcyBDRlhfUGF0dGVybiB7DQorIHB1YmxpYzoNCisgIENGWF9QYXR0ZXJuKCk7DQogDQorICBGWF9FUlIgQ3JlYXRlKENGWF9ESUJpdG1hcCogYml0bWFwLA0KKyAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCB4U3RlcCwNCisgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQgeVN0ZXAsDQorICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCA9IE5VTEwpOw0KIA0KLSAgICBDRlhfUGF0dGVybigpOw0KKyAgRlhfRVJSIENyZWF0ZShGWF9IYXRjaFN0eWxlIGhhdGNoU3R5bGUsDQorICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgZm9yZUFyZ2IsDQorICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmFja0FyZ2IsDQorICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCA9IE5VTEwpOw0KIA0KLSAgICBGWF9FUlIgQ3JlYXRlKENGWF9ESUJpdG1hcCAqIGJpdG1hcCwNCi0gICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCB4U3RlcCwNCi0gICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCB5U3RlcCwNCi0gICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICoJIG1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCB+Q0ZYX1BhdHRlcm4oKTsNCiANCi0gICAgRlhfRVJSIENyZWF0ZShGWF9IYXRjaFN0eWxlCWhhdGNoU3R5bGUsDQotICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQglmb3JlQXJnYiwNCi0gICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCCWJhY2tBcmdiLA0KLSAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgltYXRyaXggPSBOVUxMKTsNCi0NCi0gICAgdmlydHVhbCB+Q0ZYX1BhdHRlcm4oKTsNCi0NCi1wcml2YXRlOg0KLSAgICBpbnQzMl90CQkJCV90eXBlOw0KLSAgICBDRlhfTWF0cml4CQkJCV9tYXRyaXg7DQotICAgIHVuaW9uIHsNCi0gICAgICAgIHN0cnVjdCB7DQotICAgICAgICAgICAgQ0ZYX1JlY3RGCQlfcmVjdDsNCi0gICAgICAgICAgICBGWF9GTE9BVAkJX3hTdGVwOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUCQlfeVN0ZXA7DQotICAgICAgICAgICAgRlhfQk9PTAkJCV9pc0NvbG9yZWQ7DQotICAgICAgICB9Ow0KLSAgICAgICAgc3RydWN0IHsNCi0gICAgICAgICAgICBDRlhfRElCaXRtYXAgKglfYml0bWFwOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUCQlfeDFTdGVwOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUCQlfeTFTdGVwOw0KLSAgICAgICAgfTsNCi0gICAgICAgIHN0cnVjdCB7DQotICAgICAgICAgICAgRlhfSGF0Y2hTdHlsZQlfaGF0Y2hTdHlsZTsNCi0gICAgICAgICAgICBGWF9BUkdCCQkJX2ZvcmVBcmdiOw0KLSAgICAgICAgICAgIEZYX0FSR0IJCQlfYmFja0FyZ2I7DQotICAgICAgICB9Ow0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBfdHlwZTsNCisgIENGWF9NYXRyaXggX21hdHJpeDsNCisgIHVuaW9uIHsNCisgICAgc3RydWN0IHsNCisgICAgICBDRlhfUmVjdEYgX3JlY3Q7DQorICAgICAgRlhfRkxPQVQgX3hTdGVwOw0KKyAgICAgIEZYX0ZMT0FUIF95U3RlcDsNCisgICAgICBGWF9CT09MIF9pc0NvbG9yZWQ7DQogICAgIH07DQotICAgIGZyaWVuZCBjbGFzcyBDRlhfR3JhcGhpY3M7DQorICAgIHN0cnVjdCB7DQorICAgICAgQ0ZYX0RJQml0bWFwKiBfYml0bWFwOw0KKyAgICAgIEZYX0ZMT0FUIF94MVN0ZXA7DQorICAgICAgRlhfRkxPQVQgX3kxU3RlcDsNCisgICAgfTsNCisgICAgc3RydWN0IHsNCisgICAgICBGWF9IYXRjaFN0eWxlIF9oYXRjaFN0eWxlOw0KKyAgICAgIEZYX0FSR0IgX2ZvcmVBcmdiOw0KKyAgICAgIEZYX0FSR0IgX2JhY2tBcmdiOw0KKyAgICB9Ow0KKyAgfTsNCisgIGZyaWVuZCBjbGFzcyBDRlhfR3JhcGhpY3M7DQogfTsNCi1jbGFzcyBDRlhfU2hhZGluZw0KLXsNCi1wdWJsaWM6DQorY2xhc3MgQ0ZYX1NoYWRpbmcgew0KKyBwdWJsaWM6DQorICBDRlhfU2hhZGluZygpOw0KIA0KKyAgRlhfRVJSIENyZWF0ZUF4aWFsKGNvbnN0IENGWF9Qb2ludEYmIGJlZ2luUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgZW5kUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0V4dGVuZGVkQmVnaW4sDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0V4dGVuZGVkRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmVnaW5BcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgZW5kQXJnYik7DQogDQotICAgIENGWF9TaGFkaW5nKCk7DQorICBGWF9FUlIgQ3JlYXRlUmFkaWFsKGNvbnN0IENGWF9Qb2ludEYmIGJlZ2luUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIGVuZFBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCBiZWdpblJhZGl1cywNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQgZW5kUmFkaXVzLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRXh0ZW5kZWRCZWdpbiwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0V4dGVuZGVkRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGJlZ2luQXJnYiwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBlbmRBcmdiKTsNCiANCi0gICAgRlhfRVJSIENyZWF0ZUF4aWFsKGNvbnN0IENGWF9Qb2ludEYgJiBiZWdpblBvaW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiAmIGVuZFBvaW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTAkJCSAgaXNFeHRlbmRlZEJlZ2luLA0KLSAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTAkJCSAgaXNFeHRlbmRlZEVuZCwNCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IJICBiZWdpbkFyZ2IsDQotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCCSAgZW5kQXJnYik7DQorICB2aXJ0dWFsIH5DRlhfU2hhZGluZygpOw0KIA0KLSAgICBGWF9FUlIgQ3JlYXRlUmFkaWFsKGNvbnN0IENGWF9Qb2ludEYgJiBiZWdpblBvaW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYgJiBlbmRQb2ludCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVAkgICBiZWdpblJhZGl1cywNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVAkgICBlbmRSYWRpdXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTAkJCSAgIGlzRXh0ZW5kZWRCZWdpbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MCQkJICAgaXNFeHRlbmRlZEVuZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCCSAgIGJlZ2luQXJnYiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCCSAgIGVuZEFyZ2IpOw0KKyBwcml2YXRlOg0KKyAgRlhfRVJSIEluaXRBcmdiQXJyYXkoKTsNCiANCi0gICAgdmlydHVhbCB+Q0ZYX1NoYWRpbmcoKTsNCi0NCi1wcml2YXRlOg0KLSAgICBGWF9FUlIgSW5pdEFyZ2JBcnJheSgpOw0KLXByaXZhdGU6DQotICAgIGludDMyX3QJX3R5cGU7DQotICAgIENGWF9Qb2ludEYJX2JlZ2luUG9pbnQ7DQotICAgIENGWF9Qb2ludEYJX2VuZFBvaW50Ow0KLSAgICBGWF9GTE9BVAlfYmVnaW5SYWRpdXM7DQotICAgIEZYX0ZMT0FUCV9lbmRSYWRpdXM7DQotICAgIEZYX0JPT0wJCV9pc0V4dGVuZGVkQmVnaW47DQotICAgIEZYX0JPT0wJCV9pc0V4dGVuZGVkRW5kOw0KLSAgICBGWF9BUkdCCQlfYmVnaW5BcmdiOw0KLSAgICBGWF9BUkdCCQlfZW5kQXJnYjsNCi0gICAgRlhfQVJHQgkJX2FyZ2JBcnJheVtGWF9TSEFESU5HX1N0ZXBzXTsNCi0gICAgZnJpZW5kIGNsYXNzIENGWF9HcmFwaGljczsNCisgcHJpdmF0ZToNCisgIGludDMyX3QgX3R5cGU7DQorICBDRlhfUG9pbnRGIF9iZWdpblBvaW50Ow0KKyAgQ0ZYX1BvaW50RiBfZW5kUG9pbnQ7DQorICBGWF9GTE9BVCBfYmVnaW5SYWRpdXM7DQorICBGWF9GTE9BVCBfZW5kUmFkaXVzOw0KKyAgRlhfQk9PTCBfaXNFeHRlbmRlZEJlZ2luOw0KKyAgRlhfQk9PTCBfaXNFeHRlbmRlZEVuZDsNCisgIEZYX0FSR0IgX2JlZ2luQXJnYjsNCisgIEZYX0FSR0IgX2VuZEFyZ2I7DQorICBGWF9BUkdCIF9hcmdiQXJyYXlbRlhfU0hBRElOR19TdGVwc107DQorICBmcmllbmQgY2xhc3MgQ0ZYX0dyYXBoaWNzOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZnhqc2UvZnhqc2UuaCBiL3hmYS9pbmNsdWRlL2Z4anNlL2Z4anNlLmgKaW5kZXggMzY4YWNkMS4uZWQzZTk4NyAxMDA2NDQKLS0tIGEveGZhL2luY2x1ZGUvZnhqc2UvZnhqc2UuaAorKysgYi94ZmEvaW5jbHVkZS9meGpzZS9meGpzZS5oCkBAIC03LDEyNSArNywxNjIgQEAKICNpZm5kZWYgX0ZYSlNFX0hfDQogI2RlZmluZSBfRlhKU0VfSF8NCiANCi10eXBlZGVmIHN0cnVjdCBGWEpTRV9IUlVOVElNRV8gew0KLSAgICB2b2lkKiBwRGF0YTsNCi19KiBGWEpTRV9IUlVOVElNRTsNCi10eXBlZGVmIHN0cnVjdCBGWEpTRV9IQ09OVEVYVF8gew0KLSAgICB2b2lkKiBwRGF0YTsNCi19KiBGWEpTRV9IQ09OVEVYVDsNCi10eXBlZGVmIHN0cnVjdCBGWEpTRV9IQ0xBU1NfIHsNCi0gICAgdm9pZCogcERhdGE7DQotfSogRlhKU0VfSENMQVNTOw0KLXR5cGVkZWYgc3RydWN0IEZYSlNFX0hWQUxVRV8gew0KLSAgICB2b2lkKiBwRGF0YTsNCi19KiBGWEpTRV9IVkFMVUU7DQotdHlwZWRlZiBzdHJ1Y3QgRlhKU0VfSE9CSkVDVF8gOiBwdWJsaWMgRlhKU0VfSFZBTFVFXyB7DQotfSogRlhKU0VfSE9CSkVDVDsNCit0eXBlZGVmIHN0cnVjdCBGWEpTRV9IUlVOVElNRV8geyB2b2lkKiBwRGF0YTsgfSAqIEZYSlNFX0hSVU5USU1FOw0KK3R5cGVkZWYgc3RydWN0IEZYSlNFX0hDT05URVhUXyB7IHZvaWQqIHBEYXRhOyB9ICogRlhKU0VfSENPTlRFWFQ7DQordHlwZWRlZiBzdHJ1Y3QgRlhKU0VfSENMQVNTXyB7IHZvaWQqIHBEYXRhOyB9ICogRlhKU0VfSENMQVNTOw0KK3R5cGVkZWYgc3RydWN0IEZYSlNFX0hWQUxVRV8geyB2b2lkKiBwRGF0YTsgfSAqIEZYSlNFX0hWQUxVRTsNCit0eXBlZGVmIHN0cnVjdCBGWEpTRV9IT0JKRUNUXyA6IHB1YmxpYyBGWEpTRV9IVkFMVUVfe30gKiBGWEpTRV9IT0JKRUNUOw0KIA0KIHR5cGVkZWYgZG91YmxlIEZYSlNFX0RPVUJMRTsNCiB2b2lkIEZYSlNFX0luaXRpYWxpemUoKTsNCiB2b2lkIEZYSlNFX0ZpbmFsaXplKCk7DQotRlhKU0VfSFJVTlRJTUUJRlhKU0VfUnVudGltZV9DcmVhdGUoKTsNCi12b2lkCQkJRlhKU0VfUnVudGltZV9SZWxlYXNlKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKTsNCitGWEpTRV9IUlVOVElNRSBGWEpTRV9SdW50aW1lX0NyZWF0ZSgpOw0KK3ZvaWQgRlhKU0VfUnVudGltZV9SZWxlYXNlKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKTsNCiB0eXBlZGVmIHN0cnVjdCBfRlhKU0VfQ0xBU1MgRlhKU0VfQ0xBU1M7DQotRlhKU0VfSENPTlRFWFQJRlhKU0VfQ29udGV4dF9DcmVhdGUJKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lLCBjb25zdCBGWEpTRV9DTEFTUyogbHBHbG9iYWxDbGFzcyA9IE5VTEwsIHZvaWQqIGxwR2xvYmFsT2JqZWN0ID0gTlVMTCk7DQotdm9pZAkJCUZYSlNFX0NvbnRleHRfUmVsZWFzZQkoRlhKU0VfSENPTlRFWFQgaENvbnRleHQpOw0KLUZYSlNFX0hWQUxVRQlGWEpTRV9Db250ZXh0X0dldEdsb2JhbE9iamVjdChGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCk7DQotRlhKU0VfSFJVTlRJTUUgIEZYSlNFX0NvbnRleHRfR2V0UnVudGltZShGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCk7DQorRlhKU0VfSENPTlRFWFQgRlhKU0VfQ29udGV4dF9DcmVhdGUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwR2xvYmFsQ2xhc3MgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxwR2xvYmFsT2JqZWN0ID0gTlVMTCk7DQordm9pZCBGWEpTRV9Db250ZXh0X1JlbGVhc2UoRlhKU0VfSENPTlRFWFQgaENvbnRleHQpOw0KK0ZYSlNFX0hWQUxVRSBGWEpTRV9Db250ZXh0X0dldEdsb2JhbE9iamVjdChGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCk7DQorRlhKU0VfSFJVTlRJTUUgRlhKU0VfQ29udGV4dF9HZXRSdW50aW1lKEZYSlNFX0hDT05URVhUIGhDb250ZXh0KTsNCiBlbnVtIEZYSlNFX0NvbXBhdGlibGVNb2RlRmxhZ3Mgew0KLSAgICBGWEpTRV9DT01QQVRJQkxFTU9ERUZMQUdfQ09OU1RSVUNUT1JFWFRSQU1FVEhPRFMgPSAoMSA8PCAwKSwNCi0gICAgRlhKU0VfQ09NUEFUSUJMRU1PREVGTEFHQ09VTlQgPSAxLA0KKyAgRlhKU0VfQ09NUEFUSUJMRU1PREVGTEFHX0NPTlNUUlVDVE9SRVhUUkFNRVRIT0RTID0gKDEgPDwgMCksDQorICBGWEpTRV9DT01QQVRJQkxFTU9ERUZMQUdDT1VOVCA9IDEsDQogfTsNCi12b2lkCQkJRlhKU0VfQ29udGV4dF9FbmFibGVDb21wYXRpYmxlTW9kZShGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwgRlhfRFdPUkQgZHdDb21wYXRpYmxlRmxhZ3MpOw0KLWNsYXNzIENGWEpTRV9Bcmd1bWVudHMNCi17DQotcHVibGljOg0KLSAgICBGWEpTRV9IUlVOVElNRQlHZXRSdW50aW1lKCkgY29uc3Q7DQotICAgIGludDMyX3QJCUdldExlbmd0aCgpIGNvbnN0Ow0KLSAgICBGWEpTRV9IVkFMVUUJR2V0VmFsdWUoaW50MzJfdCBpbmRleCkgY29uc3Q7DQotICAgIEZYX0JPT0wJCQlHZXRCb29sZWFuKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KLSAgICBpbnQzMl90CQlHZXRJbnQzMihpbnQzMl90IGluZGV4KSBjb25zdDsNCi0gICAgRlhfRkxPQVQJCUdldEZsb2F0KGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KLSAgICBDRlhfQnl0ZVN0cmluZwlHZXRVVEY4U3RyaW5nKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KLSAgICB2b2lkKgkJR2V0T2JqZWN0KGludDMyX3QgaW5kZXgsIEZYSlNFX0hDTEFTUyBoQ2xhc3MgPSBOVUxMKSBjb25zdDsNCi0gICAgRlhKU0VfSFZBTFVFCUdldFJldHVyblZhbHVlKCk7DQordm9pZCBGWEpTRV9Db250ZXh0X0VuYWJsZUNvbXBhdGlibGVNb2RlKEZYSlNFX0hDT05URVhUIGhDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NvbXBhdGlibGVGbGFncyk7DQorY2xhc3MgQ0ZYSlNFX0FyZ3VtZW50cyB7DQorIHB1YmxpYzoNCisgIEZYSlNFX0hSVU5USU1FIEdldFJ1bnRpbWUoKSBjb25zdDsNCisgIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3Q7DQorICBGWEpTRV9IVkFMVUUgR2V0VmFsdWUoaW50MzJfdCBpbmRleCkgY29uc3Q7DQorICBGWF9CT09MIEdldEJvb2xlYW4oaW50MzJfdCBpbmRleCkgY29uc3Q7DQorICBpbnQzMl90IEdldEludDMyKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgRlhfRkxPQVQgR2V0RmxvYXQoaW50MzJfdCBpbmRleCkgY29uc3Q7DQorICBDRlhfQnl0ZVN0cmluZyBHZXRVVEY4U3RyaW5nKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgdm9pZCogR2V0T2JqZWN0KGludDMyX3QgaW5kZXgsIEZYSlNFX0hDTEFTUyBoQ2xhc3MgPSBOVUxMKSBjb25zdDsNCisgIEZYSlNFX0hWQUxVRSBHZXRSZXR1cm5WYWx1ZSgpOw0KIH07DQotdHlwZWRlZiB2b2lkCSgqRlhKU0VfRnVuY0NhbGxiYWNrKQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi10eXBlZGVmIHZvaWQJKCpGWEpTRV9Qcm9wQWNjZXNzb3IpCShGWEpTRV9IT0JKRUNUIGhPYmplY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotdHlwZWRlZiBpbnQzMl90KCpGWEpTRV9Qcm9wVHlwZUdldHRlcikJKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWF9CT09MIGJRdWVyeUluKTsNCi10eXBlZGVmIEZYX0JPT0wgKCpGWEpTRV9Qcm9wRGVsZXRlcikJKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lKTsNCit0eXBlZGVmIHZvaWQgKCpGWEpTRV9GdW5jQ2FsbGJhY2spKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCit0eXBlZGVmIHZvaWQgKCpGWEpTRV9Qcm9wQWNjZXNzb3IpKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK3R5cGVkZWYgaW50MzJfdCAoKkZYSlNFX1Byb3BUeXBlR2V0dGVyKShGWEpTRV9IT0JKRUNUIGhPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUXVlcnlJbik7DQordHlwZWRlZiBGWF9CT09MICgqRlhKU0VfUHJvcERlbGV0ZXIpKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lKTsNCiB0eXBlZGVmIHN0cnVjdCBfRlhKU0VfRlVOQ1RJT04gew0KLSAgICBjb25zdCBGWF9DSEFSKgkJCQluYW1lOw0KLSAgICBGWEpTRV9GdW5jQ2FsbGJhY2sJCWNhbGxiYWNrUHJvYzsNCisgIGNvbnN0IEZYX0NIQVIqIG5hbWU7DQorICBGWEpTRV9GdW5jQ2FsbGJhY2sgY2FsbGJhY2tQcm9jOw0KIH0gRlhKU0VfRlVOQ1RJT047DQotI2RlZmluZSBGWEpTRV9ERUZfRlVOQ1RJT04oZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNhbGxiYWNrKSB7ZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNhbGxiYWNrfQ0KLXZvaWQJRlhKU0VfRGVmaW5lRnVuY3Rpb25zKEZYSlNFX0hDT05URVhUIGhDb250ZXh0LCBjb25zdCBGWEpTRV9GVU5DVElPTiogbHBGdW5jdGlvbnMsIGludCBuTnVtKTsNCisjZGVmaW5lIEZYSlNFX0RFRl9GVU5DVElPTihmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ2FsbGJhY2spIFwNCisgIHsgZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNhbGxiYWNrIH0NCit2b2lkIEZYSlNFX0RlZmluZUZ1bmN0aW9ucyhGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWEpTRV9GVU5DVElPTiogbHBGdW5jdGlvbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5OdW0pOw0KIHR5cGVkZWYgc3RydWN0IF9GWEpTRV9QUk9QRVJUWSB7DQotICAgIGNvbnN0IEZYX0NIQVIqCQkJCW5hbWU7DQotICAgIEZYSlNFX1Byb3BBY2Nlc3NvcgkJZ2V0UHJvYzsNCi0gICAgRlhKU0VfUHJvcEFjY2Vzc29yCQlzZXRQcm9jOw0KKyAgY29uc3QgRlhfQ0hBUiogbmFtZTsNCisgIEZYSlNFX1Byb3BBY2Nlc3NvciBnZXRQcm9jOw0KKyAgRlhKU0VfUHJvcEFjY2Vzc29yIHNldFByb2M7DQogfSBGWEpTRV9QUk9QRVJUWTsNCiBlbnVtIEZYSlNFX0NsYXNzUHJvcFR5cGVzIHsNCi0gICAgRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lLA0KLSAgICBGWEpTRV9DbGFzc1Byb3BUeXBlX1Byb3BlcnR5LA0KLSAgICBGWEpTRV9DbGFzc1Byb3BUeXBlX01ldGhvZA0KKyAgRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lLA0KKyAgRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eSwNCisgIEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kDQogfTsNCiB0eXBlZGVmIHN0cnVjdCBfRlhKU0VfQ0xBU1Mgew0KLSAgICBjb25zdCBGWF9DSEFSKgkJCQluYW1lOw0KLSAgICBGWEpTRV9GdW5jQ2FsbGJhY2sJCWNvbnN0cnVjdG9yOw0KLSAgICBGWEpTRV9QUk9QRVJUWSoJCQlwcm9wZXJ0aWVzOw0KLSAgICBGWEpTRV9GVU5DVElPTioJCQltZXRob2RzOw0KLSAgICBpbnQzMl90CQkJCXByb3BOdW07DQotICAgIGludDMyX3QJCQkJbWV0aE51bTsNCi0gICAgRlhKU0VfUHJvcFR5cGVHZXR0ZXIJZHluUHJvcFR5cGVHZXR0ZXI7DQotICAgIEZYSlNFX1Byb3BBY2Nlc3NvcgkJZHluUHJvcEdldHRlcjsNCi0gICAgRlhKU0VfUHJvcEFjY2Vzc29yCQlkeW5Qcm9wU2V0dGVyOw0KLSAgICBGWEpTRV9Qcm9wRGVsZXRlcgkJZHluUHJvcERlbGV0ZXI7DQotICAgIEZYSlNFX0Z1bmNDYWxsYmFjawkJZHluTWV0aG9kQ2FsbDsNCisgIGNvbnN0IEZYX0NIQVIqIG5hbWU7DQorICBGWEpTRV9GdW5jQ2FsbGJhY2sgY29uc3RydWN0b3I7DQorICBGWEpTRV9QUk9QRVJUWSogcHJvcGVydGllczsNCisgIEZYSlNFX0ZVTkNUSU9OKiBtZXRob2RzOw0KKyAgaW50MzJfdCBwcm9wTnVtOw0KKyAgaW50MzJfdCBtZXRoTnVtOw0KKyAgRlhKU0VfUHJvcFR5cGVHZXR0ZXIgZHluUHJvcFR5cGVHZXR0ZXI7DQorICBGWEpTRV9Qcm9wQWNjZXNzb3IgZHluUHJvcEdldHRlcjsNCisgIEZYSlNFX1Byb3BBY2Nlc3NvciBkeW5Qcm9wU2V0dGVyOw0KKyAgRlhKU0VfUHJvcERlbGV0ZXIgZHluUHJvcERlbGV0ZXI7DQorICBGWEpTRV9GdW5jQ2FsbGJhY2sgZHluTWV0aG9kQ2FsbDsNCiB9IEZYSlNFX0NMQVNTOw0KLUZYSlNFX0hDTEFTUwlGWEpTRV9EZWZpbmVDbGFzcyhGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MpOw0KLUZYSlNFX0hDTEFTUwlGWEpTRV9HZXRDbGFzcyhGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzek5hbWUpOw0KLUZYSlNFX0hWQUxVRQlGWEpTRV9WYWx1ZV9DcmVhdGUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpOw0KLXZvaWQJCQlGWEpTRV9WYWx1ZV9SZWxlYXNlKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KLUZYSlNFX0hSVU5USU1FCUZYSlNFX1ZhbHVlX0dldFJ1bnRpbWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzTnVsbAkJCShGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCi1GWF9CT09MCQkJRlhKU0VfVmFsdWVfSXNCb29sZWFuCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZwkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzTnVtYmVyCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzSW50ZWdlcgkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KLUZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9Jc09iamVjdAkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KLUZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9Jc0FycmF5CQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KLUZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9Jc0Z1bmN0aW9uCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0lzRGF0ZQkJCShGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCi1GWF9CT09MCQkJRlhKU0VfVmFsdWVfVG9Cb29sZWFuCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotRlhfRkxPQVQJCUZYSlNFX1ZhbHVlX1RvRmxvYXQJCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotRlhKU0VfRE9VQkxFCUZYSlNFX1ZhbHVlX1RvRG91YmxlCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotaW50MzJfdAkJRlhKU0VfVmFsdWVfVG9JbnRlZ2VyCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotdm9pZAkJCUZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZwkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgQ0ZYX0J5dGVTdHJpbmcmIHN6U3RyT3V0cHV0KTsNCi12b2lkKgkJRlhKU0VfVmFsdWVfVG9PYmplY3QJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWEpTRV9IQ0xBU1MgaENsYXNzKTsNCi12b2lkCQkJRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkCShGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCi12b2lkCQkJRlhKU0VfVmFsdWVfU2V0TnVsbAkJCShGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCi12b2lkCQkJRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbgkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wJICAgYkJvb2xlYW4pOw0KLXZvaWQJCQlGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmCSAgIHN6U3RyaW5nKTsNCi12b2lkCQkJRlhKU0VfVmFsdWVfU2V0SW50ZWdlcgkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIGludDMyX3QgICAgIG5JbnRlZ2VyKTsNCi12b2lkCQkJRlhKU0VfVmFsdWVfU2V0RmxvYXQJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9GTE9BVCAgICAgZkZsb2F0KTsNCi12b2lkCQkJRlhKU0VfVmFsdWVfU2V0RG91YmxlCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhKU0VfRE9VQkxFIGREb3VibGUpOw0KLXZvaWQJCQlGWEpTRV9WYWx1ZV9TZXRPYmplY3QJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCB2b2lkKiBscE9iamVjdCwgRlhKU0VfSENMQVNTIGhDbGFzcyk7DQotdm9pZAkJCUZYSlNFX1ZhbHVlX1NldEFycmF5CQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgdWludDMyX3QgdVZhbHVlQ291bnQsIEZYSlNFX0hWQUxVRSogcmdWYWx1ZXMpOw0KLXZvaWQJCQlGWEpTRV9WYWx1ZV9TZXREYXRlCQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0RPVUJMRSBkRG91YmxlKTsNCi12b2lkCQkJRlhKU0VfVmFsdWVfU2V0CQkJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWEpTRV9IVkFMVUUgaE9yaWdpbmFsVmFsdWUpOw0KLUZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJglzelByb3BOYW1lLAlGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSk7DQotRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX1NldE9iamVjdFByb3AJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmCXN6UHJvcE5hbWUsCUZYSlNFX0hWQUxVRSBoUHJvcFZhbHVlKTsNCi1GWF9CT09MCQkJRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4CShGWEpTRV9IVkFMVUUgaFZhbHVlLCB1aW50MzJfdAl1UHJvcElkeCwJRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpOw0KLUZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9TZXRPYmplY3RQcm9wQnlJZHgJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIHVpbnQzMl90CXVQcm9wSWR4LAlGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSk7DQotRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX0RlbGV0ZU9iamVjdFByb3AJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYJc3pQcm9wTmFtZSk7DQotRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX09iamVjdEhhc093blByb3AJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYJc3pQcm9wTmFtZSwgRlhfQk9PTAliVXNlVHlwZUdldHRlcik7DQotRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX1NldE9iamVjdE93blByb3AJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYJc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpOw0KLUZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9DYWxsRnVuY3Rpb24JCShGWEpTRV9IVkFMVUUgaEZ1bmN0aW9uLCBGWEpTRV9IVkFMVUUgaFRoaXMsIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsIHVpbnQzMl90IG5BcmdDb3VudCwgRlhKU0VfSFZBTFVFKiBscEFyZ3MpOw0KLUZYX0JPT0wJCQlGWEpTRV9WYWx1ZV9TZXRGdW5jdGlvbkJpbmQJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0hWQUxVRSBoT2xkRnVuY3Rpb24sIEZYSlNFX0hWQUxVRSBoTmV3VGhpcyk7DQotRlhfQk9PTAkJCUZYSlNFX0V4ZWN1dGVTY3JpcHQoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsIGNvbnN0IEZYX0NIQVIqIHN6U2NyaXB0LCBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLCBGWEpTRV9IVkFMVUUgaE5ld1RoaXNPYmplY3QgPSBOVUxMKTsNCi12b2lkCQkJRlhKU0VfVGhyb3dNZXNzYWdlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE1lc3NhZ2UpOw0KLUZYX0JPT0wJCQlGWEpTRV9SZXR1cm5WYWx1ZV9HZXRNZXNzYWdlKEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsIENGWF9CeXRlU3RyaW5nJiB1dGY4TmFtZSwgQ0ZYX0J5dGVTdHJpbmcmIHV0ZjhNZXNzYWdlKTsNCi1GWF9CT09MCQkJRlhKU0VfUmV0dXJuVmFsdWVfR2V0TGluZUluZm8oRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwgaW50MzJfdCYgbkxpbmUsIGludDMyX3QmIG5Db2wpOw0KK0ZYSlNFX0hDTEFTUyBGWEpTRV9EZWZpbmVDbGFzcyhGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MpOw0KK0ZYSlNFX0hDTEFTUyBGWEpTRV9HZXRDbGFzcyhGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzek5hbWUpOw0KK0ZYSlNFX0hWQUxVRSBGWEpTRV9WYWx1ZV9DcmVhdGUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpOw0KK3ZvaWQgRlhKU0VfVmFsdWVfUmVsZWFzZShGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWEpTRV9IUlVOVElNRSBGWEpTRV9WYWx1ZV9HZXRSdW50aW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc051bGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc0Jvb2xlYW4oRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc051bWJlcihGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzSW50ZWdlcihGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzT2JqZWN0KEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNBcnJheShGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzRnVuY3Rpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc0RhdGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4oRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfRkxPQVQgRlhKU0VfVmFsdWVfVG9GbG9hdChGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWEpTRV9ET1VCTEUgRlhKU0VfVmFsdWVfVG9Eb3VibGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQoraW50MzJfdCBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQordm9pZCBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgQ0ZYX0J5dGVTdHJpbmcmIHN6U3RyT3V0cHV0KTsNCit2b2lkKiBGWEpTRV9WYWx1ZV9Ub09iamVjdChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWEpTRV9IQ0xBU1MgaENsYXNzKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldE51bGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQordm9pZCBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYkJvb2xlYW4pOw0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6U3RyaW5nKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgaW50MzJfdCBuSW50ZWdlcik7DQordm9pZCBGWEpTRV9WYWx1ZV9TZXRGbG9hdChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9GTE9BVCBmRmxvYXQpOw0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0RG91YmxlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0RPVUJMRSBkRG91YmxlKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldE9iamVjdChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxwT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hDTEFTUyBoQ2xhc3MpOw0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0QXJyYXkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVWYWx1ZUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFKiByZ1ZhbHVlcyk7DQordm9pZCBGWEpTRV9WYWx1ZV9TZXREYXRlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0RPVUJMRSBkRG91YmxlKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWEpTRV9IVkFMVUUgaE9yaWdpbmFsVmFsdWUpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUHJvcFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX1NldE9iamVjdFByb3AoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1UHJvcElkeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9TZXRPYmplY3RQcm9wQnlJZHgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1UHJvcElkeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9EZWxldGVPYmplY3RQcm9wKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9PYmplY3RIYXNPd25Qcm9wKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlVHlwZUdldHRlcik7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9TZXRPYmplY3RPd25Qcm9wKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfQ2FsbEZ1bmN0aW9uKEZYSlNFX0hWQUxVRSBoRnVuY3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkFyZ0NvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSogbHBBcmdzKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX1NldEZ1bmN0aW9uQmluZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoT2xkRnVuY3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhOZXdUaGlzKTsNCitGWF9CT09MIEZYSlNFX0V4ZWN1dGVTY3JpcHQoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHN6U2NyaXB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaE5ld1RoaXNPYmplY3QgPSBOVUxMKTsNCit2b2lkIEZYSlNFX1Rocm93TWVzc2FnZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE1lc3NhZ2UpOw0KK0ZYX0JPT0wgRlhKU0VfUmV0dXJuVmFsdWVfR2V0TWVzc2FnZShGWEpTRV9IVkFMVUUgaFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgdXRmOE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiB1dGY4TWVzc2FnZSk7DQorRlhfQk9PTCBGWEpTRV9SZXR1cm5WYWx1ZV9HZXRMaW5lSW5mbyhGWEpTRV9IVkFMVUUgaFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ29sKTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9icnMuaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2Jycy5oCmluZGV4IGQzMTBjNTUuLmZkY2MzZGUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2Jycy5oCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2Jycy5oCkBAIC0xMywxMzIgKzEzLDEzMSBAQAogY2xhc3MgSUZERV9IYXRjaEJydXNoOw0KIGNsYXNzIElGREVfVGV4dHVyZUJydXNoOw0KIGNsYXNzIElGREVfTGluZWFyR3JhZGllbnRCcnVzaDsNCi0jZGVmaW5lIEZERV9CUlVTSFRZUEVfVW5rbm93bgkJCS0xDQotI2RlZmluZSBGREVfQlJVU0hUWVBFX1NvbGlkCQkJCTANCi0jZGVmaW5lIEZERV9CUlVTSFRZUEVfSGF0Y2gJCQkJMQ0KLSNkZWZpbmUgRkRFX0JSVVNIVFlQRV9UZXh0dXJlCQkJMg0KLSNkZWZpbmUgRkRFX0JSVVNIVFlQRV9MaW5lYXJHcmFkaWVudAkzDQotI2RlZmluZSBGREVfQlJVU0hUWVBFX01BWAkJCQkzDQotI2RlZmluZSBGREVfV1JBUE1PREVfVGlsZQkJCTANCi0jZGVmaW5lIEZERV9XUkFQTU9ERV9UaWxlRmxpcFgJCTENCi0jZGVmaW5lIEZERV9XUkFQTU9ERV9UaWxlRmxpcFkJCTINCi0jZGVmaW5lIEZERV9XUkFQTU9ERV9UaWxlRmxpcFhZCQkzDQotI2RlZmluZSBGREVfV1JBUE1PREVfQ2xhbXAJCQk0DQorI2RlZmluZSBGREVfQlJVU0hUWVBFX1Vua25vd24gLTENCisjZGVmaW5lIEZERV9CUlVTSFRZUEVfU29saWQgMA0KKyNkZWZpbmUgRkRFX0JSVVNIVFlQRV9IYXRjaCAxDQorI2RlZmluZSBGREVfQlJVU0hUWVBFX1RleHR1cmUgMg0KKyNkZWZpbmUgRkRFX0JSVVNIVFlQRV9MaW5lYXJHcmFkaWVudCAzDQorI2RlZmluZSBGREVfQlJVU0hUWVBFX01BWCAzDQorI2RlZmluZSBGREVfV1JBUE1PREVfVGlsZSAwDQorI2RlZmluZSBGREVfV1JBUE1PREVfVGlsZUZsaXBYIDENCisjZGVmaW5lIEZERV9XUkFQTU9ERV9UaWxlRmxpcFkgMg0KKyNkZWZpbmUgRkRFX1dSQVBNT0RFX1RpbGVGbGlwWFkgMw0KKyNkZWZpbmUgRkRFX1dSQVBNT0RFX0NsYW1wIDQNCiB0eXBlZGVmIHN0cnVjdCBfRkRFX0dSQURJRU5UQ09MT1Igew0KLSAgICBGWF9GTE9BVAlwb3M7DQotICAgIEZYX0FSR0IJCWNvbG9yOw0KLX0gRkRFX0dSQURJRU5UQ09MT1IsICogRkRFX0xQR1JBRElFTlRDT0xPUjsNCi10eXBlZGVmIEZERV9HUkFESUVOVENPTE9SIGNvbnN0ICoJCQkJRkRFX0xQQ0dSQURJRU5UQ09MT1I7DQotdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxGREVfR1JBRElFTlRDT0xPUj4JQ0ZERV9HcmFkaWVudENvbG9yczsNCi1jbGFzcyBJRkRFX0JydXNoDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGREVfQnJ1c2gqCQkJQ3JlYXRlKGludDMyX3QgaVR5cGUpOw0KLSAgICB2aXJ0dWFsIH5JRkRFX0JydXNoKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFR5cGUoKSBjb25zdCA9IDA7DQorICBGWF9GTE9BVCBwb3M7DQorICBGWF9BUkdCIGNvbG9yOw0KK30gRkRFX0dSQURJRU5UQ09MT1IsICpGREVfTFBHUkFESUVOVENPTE9SOw0KK3R5cGVkZWYgRkRFX0dSQURJRU5UQ09MT1IgY29uc3QqIEZERV9MUENHUkFESUVOVENPTE9SOw0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RkRFX0dSQURJRU5UQ09MT1I+IENGREVfR3JhZGllbnRDb2xvcnM7DQorY2xhc3MgSUZERV9CcnVzaCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRkRFX0JydXNoKiBDcmVhdGUoaW50MzJfdCBpVHlwZSk7DQorICB2aXJ0dWFsIH5JRkRFX0JydXNoKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFR5cGUoKSBjb25zdCA9IDA7DQogfTsNCi1jbGFzcyBJRkRFX1NvbGlkQnJ1c2ggOiBwdWJsaWMgSUZERV9CcnVzaA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRlhfQVJHQgkJCQlHZXRDb2xvcigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldENvbG9yKEZYX0FSR0IgY29sb3IpID0gMDsNCi0gICAgdmlydHVhbCBjb25zdCBDRlhfTWF0cml4JglHZXRNYXRyaXgoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZXNldE1hdHJpeCgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVRyYW5zbGF0ZU1hdHJpeChGWF9GTE9BVCBkeCwgRlhfRkxPQVQgZHkpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVJvdGF0ZU1hdHJpeChGWF9GTE9BVCBmUmFkaWFuKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTY2FsZU1hdHJpeChGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3kpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCUNvbmNhdE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpID0gMDsNCitjbGFzcyBJRkRFX1NvbGlkQnJ1c2ggOiBwdWJsaWMgSUZERV9CcnVzaCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRDb2xvcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDb2xvcihGWF9BUkdCIGNvbG9yKSA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IENGWF9NYXRyaXgmIEdldE1hdHJpeCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSZXNldE1hdHJpeCgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVNYXRyaXgoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUm90YXRlTWF0cml4KEZYX0ZMT0FUIGZSYWRpYW4pID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTY2FsZU1hdHJpeChGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3kpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDb25jYXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgPSAwOw0KIH07DQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9Ib3Jpem9udGFsCQkJCTANCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX1ZlcnRpY2FsCQkJCQkxDQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9Gb3J3YXJkRGlhZ29uYWwJCQkyDQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9CYWNrd2FyZERpYWdvbmFsCQkJMw0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfQ3Jvc3MJCQkJCTQNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RpYWdvbmFsQ3Jvc3MJCQk1DQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV8wNVBlcmNlbnQJCQkJNg0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfMTBQZXJjZW50CQkJCTcNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFXzIwUGVyY2VudAkJCQk4DQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV8yNVBlcmNlbnQJCQkJOQ0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfMzBQZXJjZW50CQkJCTEwDQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV80MFBlcmNlbnQJCQkJMTENCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFXzUwUGVyY2VudAkJCQkxMg0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfNjBQZXJjZW50CQkJCTEzDQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV83MFBlcmNlbnQJCQkJMTQNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFXzc1UGVyY2VudAkJCQkxNQ0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfODBQZXJjZW50CQkJCTE2DQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV85MFBlcmNlbnQJCQkJMTcNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX0xpZ2h0RG93bndhcmREaWFnb25hbAkxOA0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTGlnaHRVcHdhcmREaWFnb25hbAkJMTkNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RhcmtEb3dud2FyZERpYWdvbmFsCQkyMA0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFya1Vwd2FyZERpYWdvbmFsCQkyMQ0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfV2lkZURvd253YXJkRGlhZ29uYWwJCTIyDQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9XaWRlVXB3YXJkRGlhZ29uYWwJCTIzDQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9MaWdodFZlcnRpY2FsCQkJMjQNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX0xpZ2h0SG9yaXpvbnRhbAkJCTI1DQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9OYXJyb3dWZXJ0aWNhbAkJCTI2DQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9OYXJyb3dIb3Jpem9udGFsCQkJMjcNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RhcmtWZXJ0aWNhbAkJCQkyOA0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFya0hvcml6b250YWwJCQkyOQ0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFzaGVkRG93bndhcmREaWFnb25hbAkzMA0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFzaGVkVXB3YXJkRGlhZ29uYWwJCTMxDQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9EYXNoZWRIb3Jpem9udGFsCQkJMzINCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX0Rhc2hlZFZlcnRpY2FsCQkJMzMNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX1NtYWxsQ29uZmV0dGkJCQkzNA0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTGFyZ2VDb25mZXR0aQkJCTM1DQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9aaWdaYWcJCQkJCTM2DQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9XYXZlCQkJCQkJMzcNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RpYWdvbmFsQnJpY2sJCQkzOA0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfSG9yaXpvbnRhbEJyaWNrCQkJMzkNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX1dlYXZlCQkJCQk0MA0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfUGxhaWQJCQkJCTQxDQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9EaXZvdAkJCQkJNDINCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RvdHRlZEdyaWQJCQkJNDMNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RvdHRlZERpYW1vbmQJCQk0NA0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfU2hpbmdsZQkJCQkJNDUNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX1RyZWxsaXMJCQkJCTQ2DQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9TcGhlcmUJCQkJCTQ3DQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9TbWFsbEdyaWQJCQkJNDgNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX1NtYWxsQ2hlY2tlckJvYXJkCQk0OQ0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTGFyZ2VDaGVja2VyQm9hcmQJCTUwDQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9PdXRsaW5lZERpYW1vbmQJCQk1MQ0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfU29saWREaWFtb25kCQkJCTUyDQotI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9Ub3RhbAkJCQkJNTMNCi0jZGVmaW5lIEZERV9IQVRDSFNUWUxFX0xhcmdlR3JpZAkJCQlGREVfSEFUQ0hTVFlMRV9Dcm9zcw0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTWluCQkJCQkJRkRFX0hBVENIU1RZTEVfSG9yaXpvbnRhbA0KLSNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTWF4CQkJCQkJKEZERV9IQVRDSFNUWUxFX1RvdGFsIC0gMSkNCi1jbGFzcyBJRkRFX0hhdGNoQnJ1c2ggOiBwdWJsaWMgSUZERV9CcnVzaA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRlhfQVJHQgkJCUdldENvbG9yKEZYX0JPT0wgYkZvcmVncm91bmRDb2xvcikgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDb2xvcihGWF9BUkdCIGNvbG9yLCBGWF9CT09MIGJGb3JlZ3JvdW5kQ29sb3IpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRIYXRjaFN0eWxlKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRIYXRjaFN0eWxlKGludDMyX3QgaUhhdGNoU3R5bGUpID0gMDsNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0hvcml6b250YWwgMA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfVmVydGljYWwgMQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRm9yd2FyZERpYWdvbmFsIDINCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0JhY2t3YXJkRGlhZ29uYWwgMw0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfQ3Jvc3MgNA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGlhZ29uYWxDcm9zcyA1DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV8wNVBlcmNlbnQgNg0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfMTBQZXJjZW50IDcNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFXzIwUGVyY2VudCA4DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV8yNVBlcmNlbnQgOQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfMzBQZXJjZW50IDEwDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV80MFBlcmNlbnQgMTENCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFXzUwUGVyY2VudCAxMg0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfNjBQZXJjZW50IDEzDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV83MFBlcmNlbnQgMTQNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFXzc1UGVyY2VudCAxNQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfODBQZXJjZW50IDE2DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV85MFBlcmNlbnQgMTcNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0xpZ2h0RG93bndhcmREaWFnb25hbCAxOA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTGlnaHRVcHdhcmREaWFnb25hbCAxOQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFya0Rvd253YXJkRGlhZ29uYWwgMjANCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RhcmtVcHdhcmREaWFnb25hbCAyMQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfV2lkZURvd253YXJkRGlhZ29uYWwgMjINCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1dpZGVVcHdhcmREaWFnb25hbCAyMw0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTGlnaHRWZXJ0aWNhbCAyNA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTGlnaHRIb3Jpem9udGFsIDI1DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9OYXJyb3dWZXJ0aWNhbCAyNg0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTmFycm93SG9yaXpvbnRhbCAyNw0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFya1ZlcnRpY2FsIDI4DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9EYXJrSG9yaXpvbnRhbCAyOQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFzaGVkRG93bndhcmREaWFnb25hbCAzMA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFzaGVkVXB3YXJkRGlhZ29uYWwgMzENCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0Rhc2hlZEhvcml6b250YWwgMzINCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0Rhc2hlZFZlcnRpY2FsIDMzDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9TbWFsbENvbmZldHRpIDM0DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9MYXJnZUNvbmZldHRpIDM1DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9aaWdaYWcgMzYNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1dhdmUgMzcNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RpYWdvbmFsQnJpY2sgMzgNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0hvcml6b250YWxCcmljayAzOQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfV2VhdmUgNDANCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1BsYWlkIDQxDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9EaXZvdCA0Mg0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRG90dGVkR3JpZCA0Mw0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRG90dGVkRGlhbW9uZCA0NA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfU2hpbmdsZSA0NQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfVHJlbGxpcyA0Ng0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfU3BoZXJlIDQ3DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9TbWFsbEdyaWQgNDgNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1NtYWxsQ2hlY2tlckJvYXJkIDQ5DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9MYXJnZUNoZWNrZXJCb2FyZCA1MA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfT3V0bGluZWREaWFtb25kIDUxDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9Tb2xpZERpYW1vbmQgNTINCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1RvdGFsIDUzDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9MYXJnZUdyaWQgRkRFX0hBVENIU1RZTEVfQ3Jvc3MNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX01pbiBGREVfSEFUQ0hTVFlMRV9Ib3Jpem9udGFsDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9NYXggKEZERV9IQVRDSFNUWUxFX1RvdGFsIC0gMSkNCitjbGFzcyBJRkRFX0hhdGNoQnJ1c2ggOiBwdWJsaWMgSUZERV9CcnVzaCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRDb2xvcihGWF9CT09MIGJGb3JlZ3JvdW5kQ29sb3IpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDb2xvcihGWF9BUkdCIGNvbG9yLCBGWF9CT09MIGJGb3JlZ3JvdW5kQ29sb3IpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRIYXRjaFN0eWxlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEhhdGNoU3R5bGUoaW50MzJfdCBpSGF0Y2hTdHlsZSkgPSAwOw0KIH07DQotY2xhc3MgSUZERV9UZXh0dXJlQnJ1c2ggOiBwdWJsaWMgSUZERV9CcnVzaA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgSUZERV9JbWFnZSoJCQlHZXRJbWFnZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldEltYWdlKElGREVfSW1hZ2UgKnBJbWFnZSwgRlhfQk9PTCBiQXV0b1JlbGVhc2UpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0V3JhcE1vZGUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRXcmFwTW9kZShpbnQzMl90IGlXcmFwTW9kZSkgPSAwOw0KK2NsYXNzIElGREVfVGV4dHVyZUJydXNoIDogcHVibGljIElGREVfQnJ1c2ggew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIElGREVfSW1hZ2UqIEdldEltYWdlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEltYWdlKElGREVfSW1hZ2UqIHBJbWFnZSwgRlhfQk9PTCBiQXV0b1JlbGVhc2UpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXcmFwTW9kZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRXcmFwTW9kZShpbnQzMl90IGlXcmFwTW9kZSkgPSAwOw0KIH07DQotI2RlZmluZSBGREVfTElORUFSR1JBRElFTlRNT0RFX0hvcml6b250YWwJCQkwDQotI2RlZmluZSBGREVfTElORUFSR1JBRElFTlRNT0RFX1ZlcnRpY2FsCQkJCTENCi0jZGVmaW5lIEZERV9MSU5FQVJHUkFESUVOVE1PREVfRm9yd2FyZERpYWdvbmFsCQkyDQotI2RlZmluZSBGREVfTElORUFSR1JBRElFTlRNT0RFX0JhY2t3YXJkRGlhZ29uYWwJCTMNCi1jbGFzcyBJRkRFX0xpbmVhckdyYWRpZW50QnJ1c2ggOiBwdWJsaWMgSUZERV9CcnVzaA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgdm9pZAkJCQlHZXRMaW5lYXJQb2ludHMoQ0ZYX1BvaW50RiAmc3RhcnRpbmdQb2ludCwgQ0ZYX1BvaW50RiAmZW5kaW5nUG9pbnQpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldExpbmVhclBvaW50cyhjb25zdCBDRlhfUG9pbnRGICZzdGFydGluZ1BvaW50LCBjb25zdCBDRlhfUG9pbnRGICZlbmRpbmdQb2ludCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJR2V0TGluZWFyQ29sb3JzKEZYX0FSR0IgJnN0YXJ0aW5nQ29sb3IsIEZYX0FSR0IgJmVuZGluZ0NvbG9yKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRMaW5lYXJDb2xvcnMoY29uc3QgRlhfQVJHQiAmc3RhcnRpbmdDb2xvciwgY29uc3QgRlhfQVJHQiAmZW5kaW5nQ29sb3IpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJQ291bnRHcmFkaWVudENvbG9ycygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUdldEdyYWRpZW50Q29sb3JzKENGREVfR3JhZGllbnRDb2xvcnMgJmNvbG9ycykgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0R3JhZGllbnRDb2xvcnMoY29uc3QgQ0ZERV9HcmFkaWVudENvbG9ycyAmY29sb3JzKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFdyYXBNb2RlKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0V3JhcE1vZGUoaW50MzJfdCBpV3JhcE1vZGUpID0gMDsNCisjZGVmaW5lIEZERV9MSU5FQVJHUkFESUVOVE1PREVfSG9yaXpvbnRhbCAwDQorI2RlZmluZSBGREVfTElORUFSR1JBRElFTlRNT0RFX1ZlcnRpY2FsIDENCisjZGVmaW5lIEZERV9MSU5FQVJHUkFESUVOVE1PREVfRm9yd2FyZERpYWdvbmFsIDINCisjZGVmaW5lIEZERV9MSU5FQVJHUkFESUVOVE1PREVfQmFja3dhcmREaWFnb25hbCAzDQorY2xhc3MgSUZERV9MaW5lYXJHcmFkaWVudEJydXNoIDogcHVibGljIElGREVfQnJ1c2ggew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIHZvaWQgR2V0TGluZWFyUG9pbnRzKENGWF9Qb2ludEYmIHN0YXJ0aW5nUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYmIGVuZGluZ1BvaW50KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZWFyUG9pbnRzKGNvbnN0IENGWF9Qb2ludEYmIHN0YXJ0aW5nUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIGVuZGluZ1BvaW50KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TGluZWFyQ29sb3JzKEZYX0FSR0ImIHN0YXJ0aW5nQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0ImIGVuZGluZ0NvbG9yKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZWFyQ29sb3JzKGNvbnN0IEZYX0FSR0ImIHN0YXJ0aW5nQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0ImIGVuZGluZ0NvbG9yKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRHcmFkaWVudENvbG9ycygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRHcmFkaWVudENvbG9ycyhDRkRFX0dyYWRpZW50Q29sb3JzJiBjb2xvcnMpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRHcmFkaWVudENvbG9ycyhjb25zdCBDRkRFX0dyYWRpZW50Q29sb3JzJiBjb2xvcnMpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXcmFwTW9kZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRXcmFwTW9kZShpbnQzMl90IGlXcmFwTW9kZSkgPSAwOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfY3NzLmggYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9jc3MuaAppbmRleCBhZDhmZmMwLi5jZjY5NjliIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9jc3MuaAorKysgYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9jc3MuaApAQCAtNDEsMTA2MiArNDEsMTA0NSBAQAogY2xhc3MgSUZERV9DU1NNdWx0aUNvbHVtbkNvbnRleHQ7DQogY2xhc3MgSUZERV9DU1NGbG9hdENvbnRleHQ7DQogZW51bSBGREVfQ1NTVkFMVUVUWVBFIHsNCi0gICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUJCT0gMSwNCi0gICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0CQkJPSAyLA0KLSAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZCwNCisgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlID0gMSwNCisgIEZERV9DU1NWQUxVRVRZUEVfTGlzdCA9IDIsDQorICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZCwNCiB9Ow0KIGVudW0gRkRFX0NTU1BSSU1JVElWRVRZUEUgew0KLSAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9Vbmtub3duCT0gMCwNCi0gICAgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyCQk9IDEsDQotICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX1BlcmNlbnQJPSAyLA0KLSAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FTVMJCT0gMywNCi0gICAgRkRFX0NTU1BSSU1JVElWRVRZUEVfRVhTCQk9IDQsDQotICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX1BYCQkJPSA1LA0KLSAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9DTQkJCT0gNiwNCi0gICAgRkRFX0NTU1BSSU1JVElWRVRZUEVfTU0JCQk9IDcsDQotICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX0lOCQkJPSA4LA0KLSAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QVAkJCT0gOSwNCi0gICAgRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMJCQk9IDEwLA0KLSAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcJCT0gMTksDQotICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX1VSSQkJPSAyMCwNCi0gICAgRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCCQk9IDI1LA0KLSAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtLA0KLSAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9GdW5jdGlvbiwNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFX1Vua25vd24gPSAwLA0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyID0gMSwNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFX1BlcmNlbnQgPSAyLA0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEVfRU1TID0gMywNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFX0VYUyA9IDQsDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QWCA9IDUsDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9DTSA9IDYsDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9NTSA9IDcsDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9JTiA9IDgsDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QVCA9IDksDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QQyA9IDEwLA0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nID0gMTksDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9VUkkgPSAyMCwNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQiA9IDI1LA0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSwNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFX0Z1bmN0aW9uLA0KIH07DQogZW51bSBGREVfQ1NTUFJPUEVSVFlWQUxVRSB7DQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JvbGRlciwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJMYXRpbiwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJjYXNlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckdyZWVrLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TZXNhbWUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX053UmVzaXplLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9XUmVzaXplLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3QsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0VuZCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTHRyLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9QcmUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J0bCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3ViLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ub3AsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Zpc2libGUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0ZpbGxlZCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3dSZXNpemUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vUmVwZWF0LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWZhdWx0LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UcmFuc3BhcmVudCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlkZ2UsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZ2h0LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ib3Jpem9udGFsVGIsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rpc3RyaWJ1dGVMZXR0ZXIsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdWJsZUNpcmNsZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ29sbGFwc2UsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXZvaWQsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyUm9tYW4sDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG8sDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHQsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1hTbWFsbCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpbiwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTmVSZXNpemUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vQ29udGVudCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3V0c2lkZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRVJlc2l6ZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVSb3csDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JvdHRvbSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVW5kZXJsaW5lLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DamtJZGVvZ3JhcGhpYywNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2VSZXNpemUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0ZpeGVkLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NvbGlkLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5QmFzZUdyb3VwLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PcGVuUXVvdGUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xpZ2h0ZXIsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyUm9tYW4sDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N0cmljdCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDYXB0aW9uLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PYmxpcXVlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWNpbWFsLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb29zZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGVicmV3LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRkZW4sDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rhc2hlZCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRW1iZWQsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlUm93R3JvdXAsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ29sdW1uLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdGF0aWMsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNldCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbExlYWRpbmdaZXJvLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9LZWVwV29yZHMsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0thdGFrYW5hSXJvaGEsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N1cGVyLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DZW50ZXIsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlSGVhZGVyR3JvdXAsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2lkZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfWHhMYXJnZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJpYW5nbGUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlUZXh0R3JvdXAsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NpcmNsZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlyYWdhbmEsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFgsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFksDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX01vdmUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hpcmFnYW5hSXJvaGEsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlCYXNlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TY3JvbGwsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NtYWxsZXIsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlRm9vdGVyR3JvdXAsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Jhc2VsaW5lLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TZXBhcmF0ZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXJtZW5pYW4sDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX09wZW4sDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlbGF0aXZlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGljaywNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSnVzdGlmeSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTWlkZGxlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BbHdheXMsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rpc3RyaWJ1dGVTcGFjZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGluZUVkZ2UsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZVdyYXAsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX01lZGl1bSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTlJlc2l6ZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGlzdEl0ZW0sDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Nob3csDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0N1cnJlbnRjb2xvciwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9DbG9zZVF1b3RlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9WZXJ0aWNhbExyLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9WZXJ0aWNhbFJsLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Qb2ludGVyLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YeFNtYWxsLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3RoLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbENhcHMsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0thdGFrYW5hLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BZnRlciwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSG9yaXpvbnRhbCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG90dGVkLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXNjLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9HZW9yZ2lhbiwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdmVybGluZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfV2FpdCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQnJlYWtBbGwsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyQWxwaGEsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NhcGl0YWxpemUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vd3JhcCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGV4dEJvdHRvbSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9PcGVuUXVvdGUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0dyb292ZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUHJvZ3Jlc3MsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xhcmdlciwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2xvc2VRdW90ZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDZWxsLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9QcmVMaW5lLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BYnNvbHV0ZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lVGFibGUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JpZGlPdmVycmlkZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lQmxvY2ssDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2V0LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Dcm9zc2hhaXIsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyTGF0aW4sDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hlbHAsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hpZGUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyY2FzZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU1Jlc2l6ZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JsaW5rLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CbG9jaywNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhcnQsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ29sdW1uR3JvdXAsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0l0YWxpYywNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGluZVRocm91Z2gsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0tlZXBBbGwsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyQWxwaGEsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1bkluLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TcXVhcmUsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1hMYXJnZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGFyZ2UsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JlZm9yZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGVmdCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGV4dFRvcCwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieVRleHQsDQotICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vRGlzcGxheSwNCi0gICAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTUFYDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkZXIsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckxhdGluLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJjYXNlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJHcmVlaywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Nlc2FtZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Od1Jlc2l6ZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1dSZXNpemUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3QsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9FbmQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MdHIsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9QcmUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdGwsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdWIsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ub3AsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9WaXNpYmxlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRmlsbGVkLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3dSZXNpemUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob1JlcGVhdCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RlZmF1bHQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UcmFuc3BhcmVudCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZGdlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ib3Jpem9udGFsVGIsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXN0cmlidXRlTGV0dGVyLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlQ2lyY2xlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NvbGxhcHNlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXZvaWQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlclJvbWFuLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YU21hbGwsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGluLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGwsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9OZVJlc2l6ZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vQ29udGVudCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNpZGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9FUmVzaXplLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVSb3csDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3R0b20sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VbmRlcmxpbmUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DamtJZGVvZ3JhcGhpYywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NlUmVzaXplLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRml4ZWQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Tb2xpZCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlCYXNlR3JvdXAsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PcGVuUXVvdGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaWdodGVyLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJSb21hbiwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N0cmljdCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ2FwdGlvbiwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX09ibGlxdWUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWNpbWFsLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG9vc2UsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IZWJyZXcsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRkZW4sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EYXNoZWQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9FbWJlZCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlUm93R3JvdXAsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNvbHVtbiwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N0YXRpYywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNldCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RlY2ltYWxMZWFkaW5nWmVybywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0tlZXBXb3JkcywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0thdGFrYW5hSXJvaGEsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdXBlciwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NlbnRlciwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlSGVhZGVyR3JvdXAsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNpZGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YeExhcmdlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJpYW5nbGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5VGV4dEdyb3VwLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2lyY2xlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlyYWdhbmEsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXRYLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0WSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX01vdmUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaXJhZ2FuYUlyb2hhLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieUJhc2UsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TY3JvbGwsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbGVyLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVGb290ZXJHcm91cCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Jhc2VsaW5lLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2VwYXJhdGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Bcm1lbmlhbiwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX09wZW4sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZWxhdGl2ZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RoaWNrLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSnVzdGlmeSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX01pZGRsZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Fsd2F5cywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rpc3RyaWJ1dGVTcGFjZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xpbmVFZGdlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUHJlV3JhcCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX01lZGl1bSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05SZXNpemUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaXN0SXRlbSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Nob3csDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DdXJyZW50Y29sb3IsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0Nsb3NlUXVvdGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9WZXJ0aWNhbExyLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVmVydGljYWxSbCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1BvaW50ZXIsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YeFNtYWxsLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm9sZCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JvdGgsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbENhcHMsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9LYXRha2FuYSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0FmdGVyLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSG9yaXpvbnRhbCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdHRlZCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rpc2MsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9HZW9yZ2lhbiwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX092ZXJsaW5lLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfV2FpdCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JyZWFrQWxsLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJBbHBoYSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NhcGl0YWxpemUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3dyYXAsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UZXh0Qm90dG9tLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9PcGVuUXVvdGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Hcm9vdmUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Qcm9ncmVzcywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xhcmdlciwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Nsb3NlUXVvdGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNlbGwsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9QcmVMaW5lLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQWJzb2x1dGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmVUYWJsZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JpZGlPdmVycmlkZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZUJsb2NrLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5zZXQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Dcm9zc2hhaXIsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckxhdGluLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGVscCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hpZGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlcmNhc2UsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TUmVzaXplLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CbGluaywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Jsb2NrLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhcnQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNvbHVtbkdyb3VwLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSXRhbGljLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGluZVRocm91Z2gsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9LZWVwQWxsLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJBbHBoYSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1bkluLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3F1YXJlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfWExhcmdlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGFyZ2UsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CZWZvcmUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MZWZ0LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGV4dFRvcCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlUZXh0LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9EaXNwbGF5LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTUFYDQogfTsNCi1jbGFzcyBJRkRFX0NTU1ZhbHVlDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZERV9DU1NWYWx1ZSgpIHt9DQotICAgIHZpcnR1YWwgRkRFX0NTU1ZBTFVFVFlQRQkJR2V0VHlwZSgpIGNvbnN0ID0gMDsNCitjbGFzcyBJRkRFX0NTU1ZhbHVlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9DU1NWYWx1ZSgpIHt9DQorICB2aXJ0dWFsIEZERV9DU1NWQUxVRVRZUEUgR2V0VHlwZSgpIGNvbnN0ID0gMDsNCiB9Ow0KLWNsYXNzIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgOiBwdWJsaWMgSUZERV9DU1NWYWx1ZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRkRFX0NTU1ZBTFVFVFlQRQkJR2V0VHlwZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NQUklNSVRJVkVUWVBFCUdldFByaW1pdGl2ZVR5cGUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0UkdCQ29sb3IoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0RmxvYXQoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqCQkJCUdldFN0cmluZyhpbnQzMl90ICZpTGVuZ3RoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0NTU1BST1BFUlRZVkFMVUUJR2V0RW51bSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbAljb25zdCBGWF9XQ0hBUioJCQkJR2V0RnVuY05hbWUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlDb3VudEFyZ3MoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgSUZERV9DU1NWYWx1ZSoJCQlHZXRBcmdzKGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsNCitjbGFzcyBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlIDogcHVibGljIElGREVfQ1NTVmFsdWUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZERV9DU1NWQUxVRVRZUEUgR2V0VHlwZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTUFJJTUlUSVZFVFlQRSBHZXRQcmltaXRpdmVUeXBlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9BUkdCIEdldFJHQkNvbG9yKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGbG9hdCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldFN0cmluZyhpbnQzMl90JiBpTGVuZ3RoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NQUk9QRVJUWVZBTFVFIEdldEVudW0oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRGdW5jTmFtZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEFyZ3MoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqIEdldEFyZ3MoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KIH07DQotY2xhc3MgSUZERV9DU1NWYWx1ZUxpc3QgOiBwdWJsaWMgSUZERV9DU1NWYWx1ZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRkRFX0NTU1ZBTFVFVFlQRQkJR2V0VHlwZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBGREVfQ1NTVkFMVUVUWVBFX0xpc3Q7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUNvdW50VmFsdWVzKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqCQkJR2V0VmFsdWUoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KK2NsYXNzIElGREVfQ1NTVmFsdWVMaXN0IDogcHVibGljIElGREVfQ1NTVmFsdWUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZERV9DU1NWQUxVRVRZUEUgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZERV9DU1NWQUxVRVRZUEVfTGlzdDsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50VmFsdWVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlKiBHZXRWYWx1ZShpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7DQogfTsNCiBlbnVtIEZERV9DU1NQUk9QRVJUWSB7DQotICAgIEZERV9DU1NQUk9QRVJUWV9Xcml0aW5nTW9kZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVXaWR0aCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnQsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfSGVpZ2h0LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfQ291bnRlclJlc2V0LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfQ29udGVudCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX1J1YnlQb3NpdGlvbiwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRDb2xvciwNCi0gICAgRkRFX0NTU1BST1BFUlRZX1dpZHRoLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfU3JjLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfVG9wLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQ29sb3IsDQotICAgIEZERV9DU1NQUk9QRVJUWV9XaWRvd3MsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21Db2xvciwNCi0gICAgRkRFX0NTU1BST1BFUlRZX1RleHRJbmRlbnQsDQotICAgIEZERV9DU1NQUk9QRVJUWV9SaWdodCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpc1N0eWxlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0xlZnQsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5XaWR0aCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX01hcmdpbkxlZnQsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXIsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3AsDQotICAgIEZERV9DU1NQUk9QRVJUWV9SdWJ5T3ZlcmhhbmcsDQotICAgIEZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtCZWZvcmUsDQotICAgIEZERV9DU1NQUk9QRVJUWV9NYXhIZWlnaHQsDQotICAgIEZERV9DU1NQUk9QRVJUWV9NaW5XaWR0aCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvciwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JvdHRvbSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX1F1b3RlcywNCi0gICAgRkRFX0NTU1BST1BFUlRZX01heFdpZHRoLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1JpZ2h0LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlSW1hZ2UsDQotICAgIEZERV9DU1NQUk9QRVJUWV9XaGl0ZVNwYWNlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlVHlwZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX1dvcmRCcmVhaywNCi0gICAgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcENvbG9yLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfRm9udEZhbWlseSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0N1cnNvciwNCi0gICAgRkRFX0NTU1BST1BFUlRZX1J1YnlBbGlnbiwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVDb2xvciwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0ZvbnRXZWlnaHQsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFN0eWxlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfTWluSGVpZ2h0LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfQ29sb3IsDQotICAgIEZERV9DU1NQUk9QRVJUWV9MZXR0ZXJTcGFjaW5nLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfRW1wdHlDZWxscywNCi0gICAgRkRFX0NTU1BST1BFUlRZX1RleHRBbGlnbiwNCi0gICAgRkRFX0NTU1BST1BFUlRZX1J1YnlTcGFuLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfUG9zaXRpb24sDQotICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJTdHlsZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVN0eWxlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQ29sbGFwc2UsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5Db3VudCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGgsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Vbmljb2RlQmlkaSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX1ZlcnRpY2FsQWxpZ24sDQotICAgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nVG9wLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfQ29sdW1ucywNCi0gICAgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfVGFibGVMYXlvdXQsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Gb250VmFyaWFudCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRQb3NpdGlvbiwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlcldpZHRoLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzQ29sb3IsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0U3R5bGUsDQotICAgIEZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtJbnNpZGUsDQotICAgIEZERV9DU1NQUk9QRVJUWV9UZXh0RW1waGFzaXMsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21XaWR0aCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0NvbHVtbkdhcCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX09ycGhhbnMsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrQWZ0ZXIsDQotICAgIEZERV9DU1NQUk9QRVJUWV9DYXB0aW9uU2lkZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRSZXBlYXQsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BTdHlsZSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclNwYWNpbmcsDQotICAgIEZERV9DU1NQUk9QRVJUWV9UZXh0VHJhbnNmb3JtLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfRm9udFN0eWxlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfRm9udCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0xpbmVIZWlnaHQsDQotICAgIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5SaWdodCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0Zsb2F0LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFdpZHRoLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfRGlzcGxheSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0NsZWFyLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVN0eWxlLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfVGV4dENvbWJpbmUsDQotICAgIEZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVQb3NpdGlvbiwNCi0gICAgRkRFX0NTU1BST1BFUlRZX1Zpc2liaWxpdHksDQotICAgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nQm90dG9tLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZEF0dGFjaG1lbnQsDQotICAgIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kSW1hZ2UsDQotICAgIEZERV9DU1NQUk9QRVJUWV9MaW5lQnJlYWssDQotICAgIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wV2lkdGgsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Xb3JkU3BhY2luZywNCi0gICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Q29sb3IsDQotICAgIEZERV9DU1NQUk9QRVJUWV9Db3VudGVySW5jcmVtZW50LA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfTGVmdCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX1RleHREZWNvcmF0aW9uLA0KLSAgICBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZywNCi0gICAgRkRFX0NTU1BST1BFUlRZX01hcmdpbkJvdHRvbSwNCi0gICAgRkRFX0NTU1BST1BFUlRZX01hcmdpblRvcCwNCi0gICAgRkRFX0NTU1BST1BFUlRZX0RpcmVjdGlvbiwNCi0gICAgRkRFX0NTU1BST1BFUlRZX01BWA0KKyAgRkRFX0NTU1BST1BFUlRZX1dyaXRpbmdNb2RlLA0KKyAgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVXaWR0aCwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0LA0KKyAgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGUsDQorICBGREVfQ1NTUFJPUEVSVFlfSGVpZ2h0LA0KKyAgRkRFX0NTU1BST1BFUlRZX0NvdW50ZXJSZXNldCwNCisgIEZERV9DU1NQUk9QRVJUWV9Db250ZW50LA0KKyAgRkRFX0NTU1BST1BFUlRZX1J1YnlQb3NpdGlvbiwNCisgIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kQ29sb3IsDQorICBGREVfQ1NTUFJPUEVSVFlfV2lkdGgsDQorICBGREVfQ1NTUFJPUEVSVFlfU3JjLA0KKyAgRkRFX0NTU1BST1BFUlRZX1RvcCwNCisgIEZERV9DU1NQUk9QRVJUWV9NYXJnaW4sDQorICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQ29sb3IsDQorICBGREVfQ1NTUFJPUEVSVFlfV2lkb3dzLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbUNvbG9yLA0KKyAgRkRFX0NTU1BST1BFUlRZX1RleHRJbmRlbnQsDQorICBGREVfQ1NTUFJPUEVSVFlfUmlnaHQsDQorICBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzU3R5bGUsDQorICBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0xlZnQsDQorICBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uV2lkdGgsDQorICBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luTGVmdCwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXIsDQorICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wLA0KKyAgRkRFX0NTU1BST1BFUlRZX1J1YnlPdmVyaGFuZywNCisgIEZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtCZWZvcmUsDQorICBGREVfQ1NTUFJPUEVSVFlfTWF4SGVpZ2h0LA0KKyAgRkRFX0NTU1BST1BFUlRZX01pbldpZHRoLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvciwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3R0b20sDQorICBGREVfQ1NTUFJPUEVSVFlfUXVvdGVzLA0KKyAgRkRFX0NTU1BST1BFUlRZX01heFdpZHRoLA0KKyAgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmdSaWdodCwNCisgIEZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVJbWFnZSwNCisgIEZERV9DU1NQUk9QRVJUWV9XaGl0ZVNwYWNlLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbSwNCisgIEZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVUeXBlLA0KKyAgRkRFX0NTU1BST1BFUlRZX1dvcmRCcmVhaywNCisgIEZERV9DU1NQUk9QRVJUWV9PdmVyZmxvd1gsDQorICBGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3dZLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcENvbG9yLA0KKyAgRkRFX0NTU1BST1BFUlRZX0ZvbnRGYW1pbHksDQorICBGREVfQ1NTUFJPUEVSVFlfQ3Vyc29yLA0KKyAgRkRFX0NTU1BST1BFUlRZX1J1YnlBbGlnbiwNCisgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlQ29sb3IsDQorICBGREVfQ1NTUFJPUEVSVFlfRm9udFdlaWdodCwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFN0eWxlLA0KKyAgRkRFX0NTU1BST1BFUlRZX01pbkhlaWdodCwNCisgIEZERV9DU1NQUk9QRVJUWV9Db2xvciwNCisgIEZERV9DU1NQUk9QRVJUWV9MZXR0ZXJTcGFjaW5nLA0KKyAgRkRFX0NTU1BST1BFUlRZX0VtcHR5Q2VsbHMsDQorICBGREVfQ1NTUFJPUEVSVFlfVGV4dEFsaWduLA0KKyAgRkRFX0NTU1BST1BFUlRZX1J1YnlTcGFuLA0KKyAgRkRFX0NTU1BST1BFUlRZX1Bvc2l0aW9uLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclN0eWxlLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVN0eWxlLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckNvbGxhcHNlLA0KKyAgRkRFX0NTU1BST1BFUlRZX0NvbHVtbkNvdW50LA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGgsDQorICBGREVfQ1NTUFJPUEVSVFlfVW5pY29kZUJpZGksDQorICBGREVfQ1NTUFJPUEVSVFlfVmVydGljYWxBbGlnbiwNCisgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nVG9wLA0KKyAgRkRFX0NTU1BST1BFUlRZX0NvbHVtbnMsDQorICBGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3csDQorICBGREVfQ1NTUFJPUEVSVFlfVGFibGVMYXlvdXQsDQorICBGREVfQ1NTUFJPUEVSVFlfRm9udFZhcmlhbnQsDQorICBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRQb3NpdGlvbiwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJXaWR0aCwNCisgIEZERV9DU1NQUk9QRVJUWV9UZXh0RW1waGFzaXNDb2xvciwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0U3R5bGUsDQorICBGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrSW5zaWRlLA0KKyAgRkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpcywNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21XaWR0aCwNCisgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5HYXAsDQorICBGREVfQ1NTUFJPUEVSVFlfT3JwaGFucywNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodCwNCisgIEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSwNCisgIEZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtBZnRlciwNCisgIEZERV9DU1NQUk9QRVJUWV9DYXB0aW9uU2lkZSwNCisgIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUmVwZWF0LA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFN0eWxlLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclNwYWNpbmcsDQorICBGREVfQ1NTUFJPUEVSVFlfVGV4dFRyYW5zZm9ybSwNCisgIEZERV9DU1NQUk9QRVJUWV9Gb250U3R5bGUsDQorICBGREVfQ1NTUFJPUEVSVFlfRm9udCwNCisgIEZERV9DU1NQUk9QRVJUWV9MaW5lSGVpZ2h0LA0KKyAgRkRFX0NTU1BST1BFUlRZX01hcmdpblJpZ2h0LA0KKyAgRkRFX0NTU1BST1BFUlRZX0Zsb2F0LA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRXaWR0aCwNCisgIEZERV9DU1NQUk9QRVJUWV9EaXNwbGF5LA0KKyAgRkRFX0NTU1BST1BFUlRZX0NsZWFyLA0KKyAgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVTdHlsZSwNCisgIEZERV9DU1NQUk9QRVJUWV9UZXh0Q29tYmluZSwNCisgIEZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVQb3NpdGlvbiwNCisgIEZERV9DU1NQUk9QRVJUWV9WaXNpYmlsaXR5LA0KKyAgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmdCb3R0b20sDQorICBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZEF0dGFjaG1lbnQsDQorICBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZEltYWdlLA0KKyAgRkRFX0NTU1BST1BFUlRZX0xpbmVCcmVhaywNCisgIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFdpZHRoLA0KKyAgRkRFX0NTU1BST1BFUlRZX1dvcmRTcGFjaW5nLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Q29sb3IsDQorICBGREVfQ1NTUFJPUEVSVFlfQ291bnRlckluY3JlbWVudCwNCisgIEZERV9DU1NQUk9QRVJUWV9MZWZ0LA0KKyAgRkRFX0NTU1BST1BFUlRZX1RleHREZWNvcmF0aW9uLA0KKyAgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmcsDQorICBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luQm90dG9tLA0KKyAgRkRFX0NTU1BST1BFUlRZX01hcmdpblRvcCwNCisgIEZERV9DU1NQUk9QRVJUWV9EaXJlY3Rpb24sDQorICBGREVfQ1NTUFJPUEVSVFlfTUFYDQogfTsNCi1jbGFzcyBJRkRFX0NTU0RlY2xhcmF0aW9uDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZERV9DU1NEZWNsYXJhdGlvbigpIHt9DQotICAgIHZpcnR1YWwgSUZERV9DU1NWYWx1ZSoJCQlHZXRQcm9wZXJ0eShGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LCBGWF9CT09MICZiSW1wb3J0YW50KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfUE9TSVRJT04JCQkJR2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlHZXROZXh0UHJvcGVydHkoRlhfUE9TSVRJT04gJnBvcywgRkRFX0NTU1BST1BFUlRZICZlUHJvcGVydHksIElGREVfQ1NTVmFsdWUgKiZwVmFsdWUsIEZYX0JPT0wgJmJJbXBvcnRhbnQpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9QT1NJVElPTgkJCQlHZXRTdGFydEN1c3RvbSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlHZXROZXh0Q3VzdG9tKEZYX1BPU0lUSU9OICZwb3MsIENGWF9XaWRlU3RyaW5nICZ3c05hbWUsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKSBjb25zdCA9IDA7DQorY2xhc3MgSUZERV9DU1NEZWNsYXJhdGlvbiB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTRGVjbGFyYXRpb24oKSB7fQ0KKyAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlKiBHZXRQcm9wZXJ0eShGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiSW1wb3J0YW50KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1BPU0lUSU9OIEdldFN0YXJ0UG9zaXRpb24oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TmV4dFByb3BlcnR5KEZYX1BPU0lUSU9OJiBwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSYgZVByb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiYgcFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiSW1wb3J0YW50KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1BPU0lUSU9OIEdldFN0YXJ0Q3VzdG9tKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldE5leHRDdXN0b20oRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgY29uc3QgPSAwOw0KIH07DQogdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxJRkRFX0NTU0RlY2xhcmF0aW9uKj4gQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5Ow0KIGVudW0gRkRFX0NTU1BFUlNVRE8gew0KLSAgICBGREVfQ1NTUEVSU1VET19BZnRlciwNCi0gICAgRkRFX0NTU1BFUlNVRE9fQmVmb3JlLA0KLSAgICBGREVfQ1NTUEVSU1VET19OT05FDQorICBGREVfQ1NTUEVSU1VET19BZnRlciwNCisgIEZERV9DU1NQRVJTVURPX0JlZm9yZSwNCisgIEZERV9DU1NQRVJTVURPX05PTkUNCiB9Ow0KIGVudW0gRkRFX0NTU1NFTEVDVE9SVFlQRSB7DQotICAgIEZERV9DU1NTRUxFQ1RPUlRZUEVfRWxlbWVudCwNCi0gICAgRkRFX0NTU1NFTEVDVE9SVFlQRV9EZXNjZW5kYW50LA0KLSAgICBGREVfQ1NTU0VMRUNUT1JUWVBFX0NsYXNzLA0KLSAgICBGREVfQ1NTU0VMRUNUT1JUWVBFX1BlcnN1ZG8sDQotICAgIEZERV9DU1NTRUxFQ1RPUlRZUEVfSUQsDQorICBGREVfQ1NTU0VMRUNUT1JUWVBFX0VsZW1lbnQsDQorICBGREVfQ1NTU0VMRUNUT1JUWVBFX0Rlc2NlbmRhbnQsDQorICBGREVfQ1NTU0VMRUNUT1JUWVBFX0NsYXNzLA0KKyAgRkRFX0NTU1NFTEVDVE9SVFlQRV9QZXJzdWRvLA0KKyAgRkRFX0NTU1NFTEVDVE9SVFlQRV9JRCwNCiB9Ow0KLWNsYXNzIElGREVfQ1NTU2VsZWN0b3INCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JRkRFX0NTU1NlbGVjdG9yKCkge30NCi0gICAgdmlydHVhbCBGREVfQ1NTU0VMRUNUT1JUWVBFCQlHZXRUeXBlKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCUdldE5hbWVIYXNoKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfQ1NTU2VsZWN0b3IqCQlHZXROZXh0U2VsZWN0b3IoKSBjb25zdCA9IDA7DQorY2xhc3MgSUZERV9DU1NTZWxlY3RvciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTU2VsZWN0b3IoKSB7fQ0KKyAgdmlydHVhbCBGREVfQ1NTU0VMRUNUT1JUWVBFIEdldFR5cGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldE5hbWVIYXNoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1NlbGVjdG9yKiBHZXROZXh0U2VsZWN0b3IoKSBjb25zdCA9IDA7DQogfTsNCi0jZGVmaW5lIEZERV9DU1NNRURJQVRZUEVfQnJhaWxsZQkweDAxDQotI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX0VtYm9zcwkJMHgwMg0KLSNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9IYW5kaGVsZAkweDA0DQotI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX1ByaW50CQkweDA4DQotI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX1Byb2plY3Rpb24JMHgxMA0KLSNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9TY3JlZW4JCTB4MjANCi0jZGVmaW5lIEZERV9DU1NNRURJQVRZUEVfVFRZCQkweDQwDQotI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX1RWCQkJMHg4MA0KLSNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9BTEwJCTB4RkYNCisjZGVmaW5lIEZERV9DU1NNRURJQVRZUEVfQnJhaWxsZSAweDAxDQorI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX0VtYm9zcyAweDAyDQorI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX0hhbmRoZWxkIDB4MDQNCisjZGVmaW5lIEZERV9DU1NNRURJQVRZUEVfUHJpbnQgMHgwOA0KKyNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9Qcm9qZWN0aW9uIDB4MTANCisjZGVmaW5lIEZERV9DU1NNRURJQVRZUEVfU2NyZWVuIDB4MjANCisjZGVmaW5lIEZERV9DU1NNRURJQVRZUEVfVFRZIDB4NDANCisjZGVmaW5lIEZERV9DU1NNRURJQVRZUEVfVFYgMHg4MA0KKyNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9BTEwgMHhGRg0KIGVudW0gRkRFX0NTU1JVTEVUWVBFIHsNCi0gICAgRkRFX0NTU1JVTEVUWVBFX1Vua25vd24JCQk9IDAsDQotICAgIEZERV9DU1NSVUxFVFlQRV9TdHlsZQkJCT0gMSwNCi0gICAgRkRFX0NTU1JVTEVUWVBFX01lZGlhCQkJPSA0LA0KLSAgICBGREVfQ1NTUlVMRVRZUEVfRm9udEZhY2UJCT0gNSwNCisgIEZERV9DU1NSVUxFVFlQRV9Vbmtub3duID0gMCwNCisgIEZERV9DU1NSVUxFVFlQRV9TdHlsZSA9IDEsDQorICBGREVfQ1NTUlVMRVRZUEVfTWVkaWEgPSA0LA0KKyAgRkRFX0NTU1JVTEVUWVBFX0ZvbnRGYWNlID0gNSwNCiB9Ow0KLWNsYXNzIElGREVfQ1NTUnVsZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGREVfQ1NTUnVsZSgpIHt9DQotICAgIHZpcnR1YWwgRkRFX0NTU1JVTEVUWVBFCQkJR2V0VHlwZSgpIGNvbnN0ID0gMDsNCitjbGFzcyBJRkRFX0NTU1J1bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU1J1bGUoKSB7fQ0KKyAgdmlydHVhbCBGREVfQ1NTUlVMRVRZUEUgR2V0VHlwZSgpIGNvbnN0ID0gMDsNCiB9Ow0KIHR5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPElGREVfQ1NTUnVsZSo+IENGREVfQ1NTUnVsZUFycmF5Ow0KLWNsYXNzIElGREVfQ1NTU3R5bGVSdWxlIDogcHVibGljIElGREVfQ1NTUnVsZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRkRFX0NTU1JVTEVUWVBFCQkJR2V0VHlwZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBGREVfQ1NTUlVMRVRZUEVfU3R5bGU7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUNvdW50U2VsZWN0b3JMaXN0cygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBJRkRFX0NTU1NlbGVjdG9yKgkJR2V0U2VsZWN0b3JMaXN0KGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBJRkRFX0NTU0RlY2xhcmF0aW9uKglHZXREZWNsYXJhdGlvbigpIGNvbnN0ID0gMDsNCitjbGFzcyBJRkRFX0NTU1N0eWxlUnVsZSA6IHB1YmxpYyBJRkRFX0NTU1J1bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZERV9DU1NSVUxFVFlQRSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRkRFX0NTU1JVTEVUWVBFX1N0eWxlOyB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRTZWxlY3Rvckxpc3RzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1NlbGVjdG9yKiBHZXRTZWxlY3Rvckxpc3QoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU0RlY2xhcmF0aW9uKiBHZXREZWNsYXJhdGlvbigpIGNvbnN0ID0gMDsNCiB9Ow0KLWNsYXNzIElGREVfQ1NTTWVkaWFSdWxlIDogcHVibGljIElGREVfQ1NTUnVsZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRkRFX0NTU1JVTEVUWVBFCQkJR2V0VHlwZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBGREVfQ1NTUlVMRVRZUEVfTWVkaWE7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9EV09SRAkJCQlHZXRNZWRpYUxpc3QoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlDb3VudFJ1bGVzKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfQ1NTUnVsZSoJCQlHZXRSdWxlKGludDMyX3QgaW5kZXgpID0gMDsNCitjbGFzcyBJRkRFX0NTU01lZGlhUnVsZSA6IHB1YmxpYyBJRkRFX0NTU1J1bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZERV9DU1NSVUxFVFlQRSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRkRFX0NTU1JVTEVUWVBFX01lZGlhOyB9DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldE1lZGlhTGlzdCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFJ1bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1J1bGUqIEdldFJ1bGUoaW50MzJfdCBpbmRleCkgPSAwOw0KIH07DQotY2xhc3MgSUZERV9DU1NGb250RmFjZVJ1bGUgOiBwdWJsaWMgSUZERV9DU1NSdWxlDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCBGREVfQ1NTUlVMRVRZUEUJCQlHZXRUeXBlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZERV9DU1NSVUxFVFlQRV9Gb250RmFjZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsCUlGREVfQ1NTRGVjbGFyYXRpb24qCUdldERlY2xhcmF0aW9uKCkgY29uc3QgPSAwOw0KK2NsYXNzIElGREVfQ1NTRm9udEZhY2VSdWxlIDogcHVibGljIElGREVfQ1NTUnVsZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRkRFX0NTU1JVTEVUWVBFIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGREVfQ1NTUlVMRVRZUEVfRm9udEZhY2U7IH0NCisgIHZpcnR1YWwgSUZERV9DU1NEZWNsYXJhdGlvbiogR2V0RGVjbGFyYXRpb24oKSBjb25zdCA9IDA7DQogfTsNCi1jbGFzcyBJRkRFX0NTU1N0eWxlU2hlZXQgOiBwdWJsaWMgSUZYX1Vua25vd24NCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZERV9DU1NTdHlsZVNoZWV0KgkJTG9hZEhUTUxTdGFuZGFyZFN0eWxlU2hlZXQoKTsNCi0gICAgc3RhdGljIElGREVfQ1NTU3R5bGVTaGVldCoJCUxvYWRGcm9tU3RyZWFtKGNvbnN0IENGWF9XaWRlU3RyaW5nICZzelVybCwgSUZYX1N0cmVhbSAqcFN0cmVhbSwgRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3TWVkaWFMaXN0ID0gRkRFX0NTU01FRElBVFlQRV9BTEwpOw0KLSAgICBzdGF0aWMgSUZERV9DU1NTdHlsZVNoZWV0KgkJTG9hZEZyb21CdWZmZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnN6VXJsLCBjb25zdCBGWF9XQ0hBUiogcEJ1ZmZlciwgaW50MzJfdCBpQnVmU2l6ZSwgRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3TWVkaWFMaXN0ID0gRkRFX0NTU01FRElBVFlQRV9BTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUdldFVybChDRlhfV2lkZVN0cmluZyAmc3pVcmwpID0gMDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJCQlHZXRNZWRpYUxpc3QoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfV09SRAkJCQkJR2V0Q29kZVBhZ2UoKSBjb25zdCA9IDA7DQorY2xhc3MgSUZERV9DU1NTdHlsZVNoZWV0IDogcHVibGljIElGWF9Vbmtub3duIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfQ1NTU3R5bGVTaGVldCogTG9hZEhUTUxTdGFuZGFyZFN0eWxlU2hlZXQoKTsNCisgIHN0YXRpYyBJRkRFX0NTU1N0eWxlU2hlZXQqIExvYWRGcm9tU3RyZWFtKA0KKyAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzelVybCwNCisgICAgICBJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgIEZYX0RXT1JEIGR3TWVkaWFMaXN0ID0gRkRFX0NTU01FRElBVFlQRV9BTEwpOw0KKyAgc3RhdGljIElGREVfQ1NTU3R5bGVTaGVldCogTG9hZEZyb21CdWZmZXIoDQorICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN6VXJsLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLA0KKyAgICAgIGludDMyX3QgaUJ1ZlNpemUsDQorICAgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgRlhfRFdPUkQgZHdNZWRpYUxpc3QgPSBGREVfQ1NTTUVESUFUWVBFX0FMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0VXJsKENGWF9XaWRlU3RyaW5nJiBzelVybCkgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRNZWRpYUxpc3QoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1dPUkQgR2V0Q29kZVBhZ2UoKSBjb25zdCA9IDA7DQogDQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlDb3VudFJ1bGVzKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfQ1NTUnVsZSoJCQlHZXRSdWxlKGludDMyX3QgaW5kZXgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFJ1bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1J1bGUqIEdldFJ1bGUoaW50MzJfdCBpbmRleCkgPSAwOw0KIH07DQogdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxJRkRFX0NTU1N0eWxlU2hlZXQqPiBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheTsNCi0jZGVmaW5lIEZERV9DU1NVU0VSU1RZTEVTSEVFVAkJKEZYX0JTVFJDKCIjVVNFUlNIRUVUIikpDQotI2RlZmluZSBGREVfQ1NTVUFHRU5UU1RZTEVTSEVFVAkJKEZYX0JTVFJDKCIjQUdFTlRTSEVFVCIpKQ0KLWNsYXNzIElGREVfQ1NTU3R5bGVTaGVldENhY2hlDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGREVfQ1NTU3R5bGVTaGVldENhY2hlKglDcmVhdGUoKTsNCi0gICAgdmlydHVhbCB+SUZERV9DU1NTdHlsZVNoZWV0Q2FjaGUoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TWF4SXRlbXMoaW50MzJfdCBpTWF4Q291bnQgPSA1KSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJQWRkU3R5bGVTaGVldChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5LCBJRkRFX0NTU1N0eWxlU2hlZXQgKnBTdHlsZVNoZWV0KSA9IDA7DQotICAgIHZpcnR1YWwgSUZERV9DU1NTdHlsZVNoZWV0KgkJR2V0U3R5bGVTaGVldChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJUmVtb3ZlU3R5bGVTaGVldChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5KSA9IDA7DQorI2RlZmluZSBGREVfQ1NTVVNFUlNUWUxFU0hFRVQgKEZYX0JTVFJDKCIjVVNFUlNIRUVUIikpDQorI2RlZmluZSBGREVfQ1NTVUFHRU5UU1RZTEVTSEVFVCAoRlhfQlNUUkMoIiNBR0VOVFNIRUVUIikpDQorY2xhc3MgSUZERV9DU1NTdHlsZVNoZWV0Q2FjaGUgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9DU1NTdHlsZVNoZWV0Q2FjaGUqIENyZWF0ZSgpOw0KKyAgdmlydHVhbCB+SUZERV9DU1NTdHlsZVNoZWV0Q2FjaGUoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TWF4SXRlbXMoaW50MzJfdCBpTWF4Q291bnQgPSA1KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkU3R5bGVTaGVldChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NTdHlsZVNoZWV0KiBwU3R5bGVTaGVldCkgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1N0eWxlU2hlZXQqIEdldFN0eWxlU2hlZXQoDQorICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzektleSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZVN0eWxlU2hlZXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzektleSkgPSAwOw0KIH07DQogZW51bSBGREVfQ1NTU1lOVEFYU1RBVFVTIHsNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvciwNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVU19FT1MsDQotICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZSwNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVU19DaGFyc2V0LA0KLSAgICBGREVfQ1NTU1lOVEFYU1RBVFVTX0ltcG9ydFJ1bGUsDQotICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfSW1wb3J0Q2xvc2UsDQotICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfUGFnZVJ1bGUsDQotICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfU3R5bGVSdWxlLA0KLSAgICBGREVfQ1NTU1lOVEFYU1RBVFVTX0ZvbnRGYWNlUnVsZSwNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVJ1bGUsDQotICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFUeXBlLA0KLSAgICBGREVfQ1NTU1lOVEFYU1RBVFVTX1VSSSwNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVU19TZWxlY3RvciwNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsT3BlbiwNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsQ2xvc2UsDQotICAgIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lLA0KLSAgICBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWUsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yLA0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVU19FT1MsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmUsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX0NoYXJzZXQsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX0ltcG9ydFJ1bGUsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX0ltcG9ydENsb3NlLA0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVU19QYWdlUnVsZSwNCisgIEZERV9DU1NTWU5UQVhTVEFUVVNfU3R5bGVSdWxlLA0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVU19Gb250RmFjZVJ1bGUsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX01lZGlhUnVsZSwNCisgIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFUeXBlLA0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVU19VUkksDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX1NlbGVjdG9yLA0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsT3BlbiwNCisgIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbENsb3NlLA0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eU5hbWUsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWUsDQogfTsNCi1jbGFzcyBJRkRFX0NTU1N5bnRheFBhcnNlcg0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRkRFX0NTU1N5bnRheFBhcnNlcioJQ3JlYXRlKCk7DQotICAgIHZpcnR1YWwgfklGREVfQ1NTU3ludGF4UGFyc2VyKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUluaXQoSUZYX1N0cmVhbSAqcFN0cmVhbSwgaW50MzJfdCBpQ1NTUGxhbmVTaXplLCBpbnQzMl90IGlUZXh0RGF0YVNpemUgPSAzMiwgRlhfQk9PTCBiT25seURlY2xhcmF0aW9uID0gRkFMU0UpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlJbml0KGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplLCBpbnQzMl90IGlUZXh0RGF0U2l6ZSA9IDMyLCBGWF9CT09MIGJPbmx5RGVjbGFyYXRpb24gPSBGQUxTRSkgPSAwOw0KK2NsYXNzIElGREVfQ1NTU3ludGF4UGFyc2VyIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfQ1NTU3ludGF4UGFyc2VyKiBDcmVhdGUoKTsNCisgIHZpcnR1YWwgfklGREVfQ1NTU3ludGF4UGFyc2VyKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEluaXQoSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNTU1BsYW5lU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRleHREYXRhU2l6ZSA9IDMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seURlY2xhcmF0aW9uID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJbml0KGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRleHREYXRTaXplID0gMzIsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPbmx5RGVjbGFyYXRpb24gPSBGQUxTRSkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIEZERV9DU1NTWU5UQVhTVEFUVVMJCURvU3ludGF4UGFyc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqCQkJCUdldEN1cnJlbnRTdHJpbmcoaW50MzJfdCAmaUxlbmd0aCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTU1lOVEFYU1RBVFVTIERvU3ludGF4UGFyc2UoKSA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRDdXJyZW50U3RyaW5nKGludDMyX3QmIGlMZW5ndGgpIGNvbnN0ID0gMDsNCiB9Ow0KIGVudW0gRkRFX0NTU0xFTkdUSFVOSVQgew0KLSAgICBGREVfQ1NTTEVOR1RIVU5JVF9BdXRvLA0KLSAgICBGREVfQ1NTTEVOR1RIVU5JVF9Ob25lLA0KLSAgICBGREVfQ1NTTEVOR1RIVU5JVF9Ob3JtYWwsDQotICAgIEZERV9DU1NMRU5HVEhVTklUX1BvaW50LA0KLSAgICBGREVfQ1NTTEVOR1RIVU5JVF9QZXJjZW50LA0KKyAgRkRFX0NTU0xFTkdUSFVOSVRfQXV0bywNCisgIEZERV9DU1NMRU5HVEhVTklUX05vbmUsDQorICBGREVfQ1NTTEVOR1RIVU5JVF9Ob3JtYWwsDQorICBGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwNCisgIEZERV9DU1NMRU5HVEhVTklUX1BlcmNlbnQsDQogfTsNCi0jZGVmaW5lIEZERV9DU1NVTklUQklUUwkJCQkoMykNCi0jZGVmaW5lIEZERV9DU1NVTklUTUFTSwkJCQkoKDEgPDwgRkRFX0NTU1VOSVRCSVRTKSAtIDEpDQorI2RlZmluZSBGREVfQ1NTVU5JVEJJVFMgKDMpDQorI2RlZmluZSBGREVfQ1NTVU5JVE1BU0sgKCgxIDw8IEZERV9DU1NVTklUQklUUykgLSAxKQ0KIHN0cnVjdCBGREVfQ1NTTEVOR1RIIHsNCi0gICAgRkRFX0NTU0xFTkdUSCYJCQkJCVNldChGREVfQ1NTTEVOR1RIVU5JVCBlVW5pdCkNCi0gICAgew0KLSAgICAgICAgbV9pRGF0YSA9IGVVbml0Ow0KLSAgICAgICAgcmV0dXJuICp0aGlzOw0KLSAgICB9DQotICAgIEZERV9DU1NMRU5HVEgmCQkJCQlTZXQoRkRFX0NTU0xFTkdUSFVOSVQgZVVuaXQsIEZYX0ZMT0FUIGZWYWx1ZSkNCi0gICAgew0KLSAgICAgICAgbV9pRGF0YSA9ICgoaW50cHRyX3QpKGZWYWx1ZSAqIDEwMjQuMGYpIDw8IEZERV9DU1NVTklUQklUUykgfCBlVW5pdDsNCi0gICAgICAgIHJldHVybiAqdGhpczsNCi0gICAgfQ0KLSAgICBGREVfQ1NTTEVOR1RIVU5JVAkJCQlHZXRVbml0KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTTEVOR1RIVU5JVCkobV9pRGF0YSAmIEZERV9DU1NVTklUTUFTSyk7DQotICAgIH0NCi0gICAgRlhfRkxPQVQJCQkJCQlHZXRWYWx1ZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAobV9pRGF0YSA+PiBGREVfQ1NTVU5JVEJJVFMpIC8gMTAyNC4wZjsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQkJCQkJCU5vblplcm8oKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKG1faURhdGEgPj4gRkRFX0NTU1VOSVRCSVRTKSAhPSAwOw0KLSAgICB9DQotcHJpdmF0ZToNCi0gICAgaW50cHRyX3QJCQkJCQltX2lEYXRhOw0KKyAgRkRFX0NTU0xFTkdUSCYgU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0KSB7DQorICAgIG1faURhdGEgPSBlVW5pdDsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgRkRFX0NTU0xFTkdUSCYgU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0LCBGWF9GTE9BVCBmVmFsdWUpIHsNCisgICAgbV9pRGF0YSA9ICgoaW50cHRyX3QpKGZWYWx1ZSAqIDEwMjQuMGYpIDw8IEZERV9DU1NVTklUQklUUykgfCBlVW5pdDsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgRkRFX0NTU0xFTkdUSFVOSVQgR2V0VW5pdCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTTEVOR1RIVU5JVCkobV9pRGF0YSAmIEZERV9DU1NVTklUTUFTSyk7DQorICB9DQorICBGWF9GTE9BVCBHZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIChtX2lEYXRhID4+IEZERV9DU1NVTklUQklUUykgLyAxMDI0LjBmOyB9DQorICBGWF9CT09MIE5vblplcm8oKSBjb25zdCB7IHJldHVybiAobV9pRGF0YSA+PiBGREVfQ1NTVU5JVEJJVFMpICE9IDA7IH0NCisNCisgcHJpdmF0ZToNCisgIGludHB0cl90IG1faURhdGE7DQogfTsNCiBzdHJ1Y3QgRkRFX0NTU1BPSU5UIHsNCi0gICAgRkRFX0NTU1BPSU5UJgkJCQkJU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0KQ0KLSAgICB7DQotICAgICAgICB4LlNldChlVW5pdCk7DQotICAgICAgICB5LlNldChlVW5pdCk7DQotICAgICAgICByZXR1cm4gKnRoaXM7DQotICAgIH0NCi0gICAgRkRFX0NTU1BPSU5UJgkJCQkJU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0LCBGWF9GTE9BVCBmVmFsdWUpDQotICAgIHsNCi0gICAgICAgIHguU2V0KGVVbml0LCBmVmFsdWUpOw0KLSAgICAgICAgeS5TZXQoZVVuaXQsIGZWYWx1ZSk7DQotICAgICAgICByZXR1cm4gKnRoaXM7DQotICAgIH0NCi0gICAgRkRFX0NTU0xFTkdUSAkJCQkJeCwgeTsNCisgIEZERV9DU1NQT0lOVCYgU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0KSB7DQorICAgIHguU2V0KGVVbml0KTsNCisgICAgeS5TZXQoZVVuaXQpOw0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICBGREVfQ1NTUE9JTlQmIFNldChGREVfQ1NTTEVOR1RIVU5JVCBlVW5pdCwgRlhfRkxPQVQgZlZhbHVlKSB7DQorICAgIHguU2V0KGVVbml0LCBmVmFsdWUpOw0KKyAgICB5LlNldChlVW5pdCwgZlZhbHVlKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgRkRFX0NTU0xFTkdUSCB4LCB5Ow0KIH07DQogc3RydWN0IEZERV9DU1NTSVpFIHsNCi0gICAgRkRFX0NTU1NJWkUmCQkJCQlTZXQoRkRFX0NTU0xFTkdUSFVOSVQgZVVuaXQpDQotICAgIHsNCi0gICAgICAgIGN4LlNldChlVW5pdCk7DQotICAgICAgICBjeS5TZXQoZVVuaXQpOw0KLSAgICAgICAgcmV0dXJuICp0aGlzOw0KLSAgICB9DQotICAgIEZERV9DU1NTSVpFJgkJCQkJU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0LCBGWF9GTE9BVCBmVmFsdWUpDQotICAgIHsNCi0gICAgICAgIGN4LlNldChlVW5pdCwgZlZhbHVlKTsNCi0gICAgICAgIGN5LlNldChlVW5pdCwgZlZhbHVlKTsNCi0gICAgICAgIHJldHVybiAqdGhpczsNCi0gICAgfQ0KLSAgICBGREVfQ1NTTEVOR1RICQkJCQljeCwgY3k7DQorICBGREVfQ1NTU0laRSYgU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0KSB7DQorICAgIGN4LlNldChlVW5pdCk7DQorICAgIGN5LlNldChlVW5pdCk7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisgIEZERV9DU1NTSVpFJiBTZXQoRkRFX0NTU0xFTkdUSFVOSVQgZVVuaXQsIEZYX0ZMT0FUIGZWYWx1ZSkgew0KKyAgICBjeC5TZXQoZVVuaXQsIGZWYWx1ZSk7DQorICAgIGN5LlNldChlVW5pdCwgZlZhbHVlKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgRkRFX0NTU0xFTkdUSCBjeCwgY3k7DQogfTsNCiBzdHJ1Y3QgRkRFX0NTU1JFQ1Qgew0KLSAgICBGREVfQ1NTUkVDVCYJCQkJCVNldChGREVfQ1NTTEVOR1RIVU5JVCBlVW5pdCkNCi0gICAgew0KLSAgICAgICAgbGVmdC5TZXQoZVVuaXQpOw0KLSAgICAgICAgdG9wLlNldChlVW5pdCk7DQotICAgICAgICByaWdodC5TZXQoZVVuaXQpOw0KLSAgICAgICAgYm90dG9tLlNldChlVW5pdCk7DQotICAgICAgICByZXR1cm4gKnRoaXM7DQotICAgIH0NCi0gICAgRkRFX0NTU1JFQ1QmCQkJCQlTZXQoRkRFX0NTU0xFTkdUSFVOSVQgZVVuaXQsIEZYX0ZMT0FUIGZWYWx1ZSkNCi0gICAgew0KLSAgICAgICAgbGVmdC5TZXQoZVVuaXQsIGZWYWx1ZSk7DQotICAgICAgICB0b3AuU2V0KGVVbml0LCBmVmFsdWUpOw0KLSAgICAgICAgcmlnaHQuU2V0KGVVbml0LCBmVmFsdWUpOw0KLSAgICAgICAgYm90dG9tLlNldChlVW5pdCwgZlZhbHVlKTsNCi0gICAgICAgIHJldHVybiAqdGhpczsNCi0gICAgfQ0KKyAgRkRFX0NTU1JFQ1QmIFNldChGREVfQ1NTTEVOR1RIVU5JVCBlVW5pdCkgew0KKyAgICBsZWZ0LlNldChlVW5pdCk7DQorICAgIHRvcC5TZXQoZVVuaXQpOw0KKyAgICByaWdodC5TZXQoZVVuaXQpOw0KKyAgICBib3R0b20uU2V0KGVVbml0KTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgRkRFX0NTU1JFQ1QmIFNldChGREVfQ1NTTEVOR1RIVU5JVCBlVW5pdCwgRlhfRkxPQVQgZlZhbHVlKSB7DQorICAgIGxlZnQuU2V0KGVVbml0LCBmVmFsdWUpOw0KKyAgICB0b3AuU2V0KGVVbml0LCBmVmFsdWUpOw0KKyAgICByaWdodC5TZXQoZVVuaXQsIGZWYWx1ZSk7DQorICAgIGJvdHRvbS5TZXQoZVVuaXQsIGZWYWx1ZSk7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCiANCi0gICAgRkRFX0NTU0xFTkdUSAkJCWxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsNCisgIEZERV9DU1NMRU5HVEggbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOw0KIH07DQogZW51bSBGREVfQ1NTQktHQVRUQUNITUVOVCB7DQotICAgIEZERV9DU1NCS0dBVFRBQ0hNRU5UX1Njcm9sbCwNCi0gICAgRkRFX0NTU0JLR0FUVEFDSE1FTlRfRml4ZWQsDQorICBGREVfQ1NTQktHQVRUQUNITUVOVF9TY3JvbGwsDQorICBGREVfQ1NTQktHQVRUQUNITUVOVF9GaXhlZCwNCiB9Ow0KIGVudW0gRkRFX0NTU0JLR1JFUEVBVCB7DQotICAgIEZERV9DU1NCS0dSRVBFQVRfUmVwZWF0LA0KLSAgICBGREVfQ1NTQktHUkVQRUFUX1JlcGVhdFgsDQotICAgIEZERV9DU1NCS0dSRVBFQVRfUmVwZWF0WSwNCi0gICAgRkRFX0NTU0JLR1JFUEVBVF9Ob1JlcGVhdCwNCisgIEZERV9DU1NCS0dSRVBFQVRfUmVwZWF0LA0KKyAgRkRFX0NTU0JLR1JFUEVBVF9SZXBlYXRYLA0KKyAgRkRFX0NTU0JLR1JFUEVBVF9SZXBlYXRZLA0KKyAgRkRFX0NTU0JLR1JFUEVBVF9Ob1JlcGVhdCwNCiB9Ow0KIGVudW0gRkRFX0NTU0JPUkRFUlNUWUxFIHsNCi0gICAgRkRFX0NTU0JPUkRFUlNUWUxFX05vbmUsDQotICAgIEZERV9DU1NCT1JERVJTVFlMRV9IaWRkZW4sDQotICAgIEZERV9DU1NCT1JERVJTVFlMRV9Eb3R0ZWQsDQotICAgIEZERV9DU1NCT1JERVJTVFlMRV9EYXNoZWQsDQotICAgIEZERV9DU1NCT1JERVJTVFlMRV9Tb2xpZCwNCi0gICAgRkRFX0NTU0JPUkRFUlNUWUxFX0RvdWJsZSwNCi0gICAgRkRFX0NTU0JPUkRFUlNUWUxFX0dyb292ZSwNCi0gICAgRkRFX0NTU0JPUkRFUlNUWUxFX1JpZGdlLA0KLSAgICBGREVfQ1NTQk9SREVSU1RZTEVfSW5zZXQsDQotICAgIEZERV9DU1NCT1JERVJTVFlMRV9vdXRzZXQsDQorICBGREVfQ1NTQk9SREVSU1RZTEVfTm9uZSwNCisgIEZERV9DU1NCT1JERVJTVFlMRV9IaWRkZW4sDQorICBGREVfQ1NTQk9SREVSU1RZTEVfRG90dGVkLA0KKyAgRkRFX0NTU0JPUkRFUlNUWUxFX0Rhc2hlZCwNCisgIEZERV9DU1NCT1JERVJTVFlMRV9Tb2xpZCwNCisgIEZERV9DU1NCT1JERVJTVFlMRV9Eb3VibGUsDQorICBGREVfQ1NTQk9SREVSU1RZTEVfR3Jvb3ZlLA0KKyAgRkRFX0NTU0JPUkRFUlNUWUxFX1JpZGdlLA0KKyAgRkRFX0NTU0JPUkRFUlNUWUxFX0luc2V0LA0KKyAgRkRFX0NTU0JPUkRFUlNUWUxFX291dHNldCwNCiB9Ow0KIGVudW0gRkRFX0NTU0NMRUFSIHsNCi0gICAgRkRFX0NTU0NMRUFSX05vbmUsDQotICAgIEZERV9DU1NDTEVBUl9MZWZ0LA0KLSAgICBGREVfQ1NTQ0xFQVJfUmlnaHQsDQotICAgIEZERV9DU1NDTEVBUl9Cb3RoLA0KKyAgRkRFX0NTU0NMRUFSX05vbmUsDQorICBGREVfQ1NTQ0xFQVJfTGVmdCwNCisgIEZERV9DU1NDTEVBUl9SaWdodCwNCisgIEZERV9DU1NDTEVBUl9Cb3RoLA0KIH07DQogZW51bSBGREVfQ1NTRElTUExBWSB7DQotICAgIEZERV9DU1NESVNQTEFZX05vbmUsDQotICAgIEZERV9DU1NESVNQTEFZX0xpc3RJdGVtLA0KLSAgICBGREVfQ1NTRElTUExBWV9SdW5JbiwNCi0gICAgRkRFX0NTU0RJU1BMQVlfQmxvY2ssDQotICAgIEZERV9DU1NESVNQTEFZX0lubGluZSwNCi0gICAgRkRFX0NTU0RJU1BMQVlfSW5saW5lQmxvY2ssDQotICAgIEZERV9DU1NESVNQTEFZX0lubGluZVRhYmxlLA0KLSAgICBGREVfQ1NTRElTUExBWV9UYWJsZSwNCi0gICAgRkRFX0NTU0RJU1BMQVlfVGFibGVSb3csDQotICAgIEZERV9DU1NESVNQTEFZX1RhYmxlQ2VsbCwNCi0gICAgRkRFX0NTU0RJU1BMQVlfVGFibGVDYXB0aW9uLA0KLSAgICBGREVfQ1NTRElTUExBWV9UYWJsZUNvbHVtbiwNCi0gICAgRkRFX0NTU0RJU1BMQVlfVGFibGVSb3dHcm91cCwNCi0gICAgRkRFX0NTU0RJU1BMQVlfVGFibGVDb2x1bW5Hcm91cCwNCi0gICAgRkRFX0NTU0RJU1BMQVlfVGFibGVIZWFkZXJHcm91cCwNCi0gICAgRkRFX0NTU0RJU1BMQVlfVGFibGVGb290ZXJHcm91cCwNCi0gICAgRkRFX0NTU0RJU1BMQVlfUnVieSwNCi0gICAgRkRFX0NTU0RJU1BMQVlfUnVieUJhc2UsDQotICAgIEZERV9DU1NESVNQTEFZX1J1YnlUZXh0LA0KLSAgICBGREVfQ1NTRElTUExTWV9SdWJ5QmFzZUdyb3VwLA0KLSAgICBGREVfQ1NTRElTUExBWV9SdWJ5VGV4dEdyb3VwLA0KKyAgRkRFX0NTU0RJU1BMQVlfTm9uZSwNCisgIEZERV9DU1NESVNQTEFZX0xpc3RJdGVtLA0KKyAgRkRFX0NTU0RJU1BMQVlfUnVuSW4sDQorICBGREVfQ1NTRElTUExBWV9CbG9jaywNCisgIEZERV9DU1NESVNQTEFZX0lubGluZSwNCisgIEZERV9DU1NESVNQTEFZX0lubGluZUJsb2NrLA0KKyAgRkRFX0NTU0RJU1BMQVlfSW5saW5lVGFibGUsDQorICBGREVfQ1NTRElTUExBWV9UYWJsZSwNCisgIEZERV9DU1NESVNQTEFZX1RhYmxlUm93LA0KKyAgRkRFX0NTU0RJU1BMQVlfVGFibGVDZWxsLA0KKyAgRkRFX0NTU0RJU1BMQVlfVGFibGVDYXB0aW9uLA0KKyAgRkRFX0NTU0RJU1BMQVlfVGFibGVDb2x1bW4sDQorICBGREVfQ1NTRElTUExBWV9UYWJsZVJvd0dyb3VwLA0KKyAgRkRFX0NTU0RJU1BMQVlfVGFibGVDb2x1bW5Hcm91cCwNCisgIEZERV9DU1NESVNQTEFZX1RhYmxlSGVhZGVyR3JvdXAsDQorICBGREVfQ1NTRElTUExBWV9UYWJsZUZvb3Rlckdyb3VwLA0KKyAgRkRFX0NTU0RJU1BMQVlfUnVieSwNCisgIEZERV9DU1NESVNQTEFZX1J1YnlCYXNlLA0KKyAgRkRFX0NTU0RJU1BMQVlfUnVieVRleHQsDQorICBGREVfQ1NTRElTUExTWV9SdWJ5QmFzZUdyb3VwLA0KKyAgRkRFX0NTU0RJU1BMQVlfUnVieVRleHRHcm91cCwNCiB9Ow0KIGVudW0gRkRFX0NTU1ZJU0lCSUxJVFkgew0KLSAgICBGREVfQ1NTVklTSUJJTElUWV9WaXNpYmxlLA0KLSAgICBGREVfQ1NTVklTSUJJTElUWV9IaWRkZW4sDQotICAgIEZERV9DU1NWSVNJQklMSVRZX0NvbGxhcHNlLA0KKyAgRkRFX0NTU1ZJU0lCSUxJVFlfVmlzaWJsZSwNCisgIEZERV9DU1NWSVNJQklMSVRZX0hpZGRlbiwNCisgIEZERV9DU1NWSVNJQklMSVRZX0NvbGxhcHNlLA0KIH07DQogZW51bSBGREVfQ1NTRk9OVFNUWUxFIHsNCi0gICAgRkRFX0NTU0ZPTlRTVFlMRV9Ob3JtYWwsDQotICAgIEZERV9DU1NGT05UU1RZTEVfSXRhbGljLA0KKyAgRkRFX0NTU0ZPTlRTVFlMRV9Ob3JtYWwsDQorICBGREVfQ1NTRk9OVFNUWUxFX0l0YWxpYywNCiB9Ow0KIGVudW0gRkRFX0NTU0ZMT0FUIHsNCi0gICAgRkRFX0NTU0ZMT0FUX05vbmUsDQotICAgIEZERV9DU1NGTE9BVF9MZWZ0LA0KLSAgICBGREVfQ1NTRkxPQVRfUmlnaHQsDQorICBGREVfQ1NTRkxPQVRfTm9uZSwNCisgIEZERV9DU1NGTE9BVF9MZWZ0LA0KKyAgRkRFX0NTU0ZMT0FUX1JpZ2h0LA0KIH07DQogZW51bSBGREVfQ1NTV1JJVElOR01PREUgew0KLSAgICBGREVfQ1NTV1JJVElOR01PREVfSG9yaXpvbnRhbFRiLA0KLSAgICBGREVfQ1NTV1JJVElOR01PREVfVmVydGljYWxSbCwNCi0gICAgRkRFX0NTU1dSSVRJTkdNT0RFX1ZlcnRpY2FsTHIsDQorICBGREVfQ1NTV1JJVElOR01PREVfSG9yaXpvbnRhbFRiLA0KKyAgRkRFX0NTU1dSSVRJTkdNT0RFX1ZlcnRpY2FsUmwsDQorICBGREVfQ1NTV1JJVElOR01PREVfVmVydGljYWxMciwNCiB9Ow0KIGVudW0gRkRFX0NTU1dPUkRCUkVBSyB7DQotICAgIEZERV9DU1NXT1JEQlJFQUtfTm9ybWFsLA0KLSAgICBGREVfQ1NTV09SREJSRUFLX0tlZXBBbGwsDQotICAgIEZERV9DU1NXT1JEQlJFQUtfQnJlYWtBbGwsDQotICAgIEZERV9DU1NXT1JEQlJFQUtfS2VlcFdvcmRzLA0KKyAgRkRFX0NTU1dPUkRCUkVBS19Ob3JtYWwsDQorICBGREVfQ1NTV09SREJSRUFLX0tlZXBBbGwsDQorICBGREVfQ1NTV09SREJSRUFLX0JyZWFrQWxsLA0KKyAgRkRFX0NTU1dPUkRCUkVBS19LZWVwV29yZHMsDQogfTsNCiBlbnVtIEZERV9DU1NQQUdFQlJFQUsgew0KLSAgICBGREVfQ1NTUEFHRUJSRUFLX0F1dG8sDQotICAgIEZERV9DU1NQQUdFQlJFQUtfQWx3YXlzLA0KLSAgICBGREVfQ1NTUEFHRUJSRUFLX0F2b2lkLA0KLSAgICBGREVfQ1NTUEFHRUJSRUFLX0xlZnQsDQotICAgIEZERV9DU1NQQUdFQlJFQUtfUmlnaHQsDQorICBGREVfQ1NTUEFHRUJSRUFLX0F1dG8sDQorICBGREVfQ1NTUEFHRUJSRUFLX0Fsd2F5cywNCisgIEZERV9DU1NQQUdFQlJFQUtfQXZvaWQsDQorICBGREVfQ1NTUEFHRUJSRUFLX0xlZnQsDQorICBGREVfQ1NTUEFHRUJSRUFLX1JpZ2h0LA0KIH07DQogZW51bSBGREVfQ1NTT1ZFUkZMT1cgew0KLSAgICBGREVfQ1NTT1ZFUkZMT1dfVmlzaWJsZSwNCi0gICAgRkRFX0NTU09WRVJGTE9XX0hpZGRlbiwNCi0gICAgRkRFX0NTU09WRVJGTE9XX1Njcm9sbCwNCi0gICAgRkRFX0NTU09WRVJGTE9XX0F1dG8sDQotICAgIEZERV9DU1NPVkVSRkxPV19Ob0Rpc3BsYXksDQotICAgIEZERV9DU1NPVkVSRkxPV19Ob0NvbnRlbnQsDQorICBGREVfQ1NTT1ZFUkZMT1dfVmlzaWJsZSwNCisgIEZERV9DU1NPVkVSRkxPV19IaWRkZW4sDQorICBGREVfQ1NTT1ZFUkZMT1dfU2Nyb2xsLA0KKyAgRkRFX0NTU09WRVJGTE9XX0F1dG8sDQorICBGREVfQ1NTT1ZFUkZMT1dfTm9EaXNwbGF5LA0KKyAgRkRFX0NTU09WRVJGTE9XX05vQ29udGVudCwNCiB9Ow0KIGVudW0gRkRFX0NTU0xJTkVCUkVBSyB7DQotICAgIEZERV9DU1NMSU5FQlJFQUtfQXV0bywNCi0gICAgRkRFX0NTU0xJTkVCUkVBS19Mb29zZSwNCi0gICAgRkRFX0NTU0xJTkVCUkVBS19Ob3JtYWwsDQotICAgIEZERV9DU1NMSU5FQlJFQUtfU3RyaWN0LA0KKyAgRkRFX0NTU0xJTkVCUkVBS19BdXRvLA0KKyAgRkRFX0NTU0xJTkVCUkVBS19Mb29zZSwNCisgIEZERV9DU1NMSU5FQlJFQUtfTm9ybWFsLA0KKyAgRkRFX0NTU0xJTkVCUkVBS19TdHJpY3QsDQogfTsNCiBlbnVtIEZERV9DU1NURVhURU1QSEFTSVNGSUxMIHsNCi0gICAgRkRFX0NTU1RFWFRFTVBIQVNJU0ZJTExfRmlsbGVkLA0KLSAgICBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTF9PcGVuLA0KKyAgRkRFX0NTU1RFWFRFTVBIQVNJU0ZJTExfRmlsbGVkLA0KKyAgRkRFX0NTU1RFWFRFTVBIQVNJU0ZJTExfT3BlbiwNCiB9Ow0KIGVudW0gRkRFX0NTU1RFWFRFTVBIQVNJU01BUksgew0KLSAgICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19Ob25lLA0KLSAgICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19BdXRvLA0KLSAgICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19Eb3QsDQotICAgIEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0NpcmNsZSwNCi0gICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfRG91YmxlQ2lyY2xlLA0KLSAgICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19UcmlhbmdsZSwNCi0gICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfU2VzYW1lLA0KLSAgICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19DdXN0b20sDQorICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19Ob25lLA0KKyAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfQXV0bywNCisgIEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0RvdCwNCisgIEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0NpcmNsZSwNCisgIEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0RvdWJsZUNpcmNsZSwNCisgIEZERV9DU1NURVhURU1QSEFTSVNNQVJLX1RyaWFuZ2xlLA0KKyAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfU2VzYW1lLA0KKyAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfQ3VzdG9tLA0KIH07DQogZW51bSBGREVfQ1NTVEVYVENPTUJJTkUgew0KLSAgICBGREVfQ1NTVEVYVENPTUJJTkVfSG9yaXpvbnRhbCwNCi0gICAgRkRFX0NTU1RFWFRDT01CSU5FX05vbmUsDQorICBGREVfQ1NTVEVYVENPTUJJTkVfSG9yaXpvbnRhbCwNCisgIEZERV9DU1NURVhUQ09NQklORV9Ob25lLA0KIH07DQogZW51bSBGREVfQ1NTQ1VSU09SIHsNCi0gICAgRkRFX0NTU0NVUlNPUl9BdXRvLA0KLSAgICBGREVfQ1NTQ1VSU09SX0Nyb3NzaGFpciwNCi0gICAgRkRFX0NTU0NVUlNPUl9EZWZhdWx0LA0KLSAgICBGREVfQ1NTQ1VSU09SX1BvaW50ZXIsDQotICAgIEZERV9DU1NDVVJTT1JfTW92ZSwNCi0gICAgRkRFX0NTU0NVUlNPUl9FUmVzaXplLA0KLSAgICBGREVfQ1NTQ1VSU09SX05lUmVzaXplLA0KLSAgICBGREVfQ1NTQ1VSU09SX053UmVzaXplLA0KLSAgICBGREVfQ1NTQ1VSU09SX05SZXNpemUsDQotICAgIEZERV9DU1NDVVJTT1JfU2VSZXNpemUsDQotICAgIEZERV9DU1NDVVJTT1JfU3dSZXNpemUsDQotICAgIEZERV9DU1NDVVJTT1JfU1Jlc2l6ZSwNCi0gICAgRkRFX0NTU0NVUlNPUl9XUmVzaXplLA0KLSAgICBGREVfQ1NTQ1VSU09SX1RleHQsDQotICAgIEZERV9DU1NDVVJTT1JfV2FpdCwNCi0gICAgRkRFX0NTU0NVUlNPUl9IZWxwLA0KLSAgICBGREVfQ1NTQ1VSU09SX1Byb2dyZXNzLA0KKyAgRkRFX0NTU0NVUlNPUl9BdXRvLA0KKyAgRkRFX0NTU0NVUlNPUl9Dcm9zc2hhaXIsDQorICBGREVfQ1NTQ1VSU09SX0RlZmF1bHQsDQorICBGREVfQ1NTQ1VSU09SX1BvaW50ZXIsDQorICBGREVfQ1NTQ1VSU09SX01vdmUsDQorICBGREVfQ1NTQ1VSU09SX0VSZXNpemUsDQorICBGREVfQ1NTQ1VSU09SX05lUmVzaXplLA0KKyAgRkRFX0NTU0NVUlNPUl9Od1Jlc2l6ZSwNCisgIEZERV9DU1NDVVJTT1JfTlJlc2l6ZSwNCisgIEZERV9DU1NDVVJTT1JfU2VSZXNpemUsDQorICBGREVfQ1NTQ1VSU09SX1N3UmVzaXplLA0KKyAgRkRFX0NTU0NVUlNPUl9TUmVzaXplLA0KKyAgRkRFX0NTU0NVUlNPUl9XUmVzaXplLA0KKyAgRkRFX0NTU0NVUlNPUl9UZXh0LA0KKyAgRkRFX0NTU0NVUlNPUl9XYWl0LA0KKyAgRkRFX0NTU0NVUlNPUl9IZWxwLA0KKyAgRkRFX0NTU0NVUlNPUl9Qcm9ncmVzcywNCiB9Ow0KIGVudW0gRkRFX0NTU1BPU0lUSU9OIHsNCi0gICAgRkRFX0NTU1BPU0lUSU9OX1N0YXRpYywNCi0gICAgRkRFX0NTU1BPU0lUSU9OX1JlbGF0aXZlLA0KLSAgICBGREVfQ1NTUE9TSVRJT05fQWJzb2x1dGUsDQotICAgIEZERV9DU1NQT1NJVElPTl9GaXhlZCwNCisgIEZERV9DU1NQT1NJVElPTl9TdGF0aWMsDQorICBGREVfQ1NTUE9TSVRJT05fUmVsYXRpdmUsDQorICBGREVfQ1NTUE9TSVRJT05fQWJzb2x1dGUsDQorICBGREVfQ1NTUE9TSVRJT05fRml4ZWQsDQogfTsNCiBlbnVtIEZERV9DU1NDQVBUSU9OU0lERSB7DQotICAgIEZERV9DU1NDQVBUSU9OU0lERV9Ub3AsDQotICAgIEZERV9DU1NDQVBUSU9OU0lERV9Cb3R0b20sDQotICAgIEZERV9DU1NDQVBUSU9OU0lERV9MZWZ0LA0KLSAgICBGREVfQ1NTQ0FQVElPTlNJREVfUmlnaHQsDQotICAgIEZERV9DU1NDQVBUSU9OU0lERV9CZWZvcmUsDQotICAgIEZERV9DU1NDQVBUSU9OU0lERV9BZnRlciwNCisgIEZERV9DU1NDQVBUSU9OU0lERV9Ub3AsDQorICBGREVfQ1NTQ0FQVElPTlNJREVfQm90dG9tLA0KKyAgRkRFX0NTU0NBUFRJT05TSURFX0xlZnQsDQorICBGREVfQ1NTQ0FQVElPTlNJREVfUmlnaHQsDQorICBGREVfQ1NTQ0FQVElPTlNJREVfQmVmb3JlLA0KKyAgRkRFX0NTU0NBUFRJT05TSURFX0FmdGVyLA0KIH07DQogZW51bSBGREVfQ1NTUlVCWUFMSUdOIHsNCi0gICAgRkRFX0NTU1JVQllBTElHTl9BdXRvLA0KLSAgICBGREVfQ1NTUlVCWUFMSUdOX1N0YXJ0LA0KLSAgICBGREVfQ1NTUlVCWUFMSUdOX0xlZnQsDQotICAgIEZERV9DU1NSVUJZQUxJR05fQ2VudGVyLA0KLSAgICBGREVfQ1NTUlVCWUFMSUdOX0VuZCwNCi0gICAgRkRFX0NTU1JVQllBTElHTl9SaWdodCwNCi0gICAgRkRFX0NTU1JVQllBTElHTl9EaXN0cmlidXRlTGV0dGVyLA0KLSAgICBGREVfQ1NTUlVCWUFMSUdOX0Rpc3RyaWJ1dGVTcGFjZSwNCi0gICAgRkRFX0NTU1JVQllBTElHTl9MaW5lRWRnZSwNCisgIEZERV9DU1NSVUJZQUxJR05fQXV0bywNCisgIEZERV9DU1NSVUJZQUxJR05fU3RhcnQsDQorICBGREVfQ1NTUlVCWUFMSUdOX0xlZnQsDQorICBGREVfQ1NTUlVCWUFMSUdOX0NlbnRlciwNCisgIEZERV9DU1NSVUJZQUxJR05fRW5kLA0KKyAgRkRFX0NTU1JVQllBTElHTl9SaWdodCwNCisgIEZERV9DU1NSVUJZQUxJR05fRGlzdHJpYnV0ZUxldHRlciwNCisgIEZERV9DU1NSVUJZQUxJR05fRGlzdHJpYnV0ZVNwYWNlLA0KKyAgRkRFX0NTU1JVQllBTElHTl9MaW5lRWRnZSwNCiB9Ow0KIGVudW0gRkRFX0NTU1JVQllPVkVSSEFORyB7DQotICAgIEZERV9DU1NSVUJZT1ZFUkhBTkdfQXV0bywNCi0gICAgRkRFX0NTU1JVQllPVkVSSEFOR19TdGFydCwNCi0gICAgRkRFX0NTU1JVQllPVkVSSEFOR19FbmQsDQotICAgIEZERV9DU1NSVUJZT1ZFUkhBTkdfTm9uZSwNCisgIEZERV9DU1NSVUJZT1ZFUkhBTkdfQXV0bywNCisgIEZERV9DU1NSVUJZT1ZFUkhBTkdfU3RhcnQsDQorICBGREVfQ1NTUlVCWU9WRVJIQU5HX0VuZCwNCisgIEZERV9DU1NSVUJZT1ZFUkhBTkdfTm9uZSwNCiB9Ow0KIGVudW0gRkRFX0NTU1JVQllQT1NJVElPTiB7DQotICAgIEZERV9DU1NSVUJZUE9TSVRJT05fQmVmb3JlLA0KLSAgICBGREVfQ1NTUlVCWVBPU0lUSU9OX0FmdGVyLA0KLSAgICBGREVfQ1NTUlVCWVBPU0lUSU9OX1JpZ2h0LA0KLSAgICBGREVfQ1NTUlVCWVBPU0lUSU9OX0lubGluZSwNCisgIEZERV9DU1NSVUJZUE9TSVRJT05fQmVmb3JlLA0KKyAgRkRFX0NTU1JVQllQT1NJVElPTl9BZnRlciwNCisgIEZERV9DU1NSVUJZUE9TSVRJT05fUmlnaHQsDQorICBGREVfQ1NTUlVCWVBPU0lUSU9OX0lubGluZSwNCiB9Ow0KIGVudW0gRkRFX0NTU1JVQllTUEFOIHsNCi0gICAgRkRFX0NTU1JVQllTUEFOX05vbmUsDQotICAgIEZERV9DU1NSVUJZU1BBTl9BdHRyLA0KKyAgRkRFX0NTU1JVQllTUEFOX05vbmUsDQorICBGREVfQ1NTUlVCWVNQQU5fQXR0ciwNCiB9Ow0KIGVudW0gRkRFX0NTU1RFWFRBTElHTiB7DQotICAgIEZERV9DU1NURVhUQUxJR05fTGVmdCwNCi0gICAgRkRFX0NTU1RFWFRBTElHTl9SaWdodCwNCi0gICAgRkRFX0NTU1RFWFRBTElHTl9DZW50ZXIsDQotICAgIEZERV9DU1NURVhUQUxJR05fSnVzdGlmeSwNCi0gICAgRkRFX0NTU1RFWFRBTElHTl9KdXN0aWZ5QWxsLA0KKyAgRkRFX0NTU1RFWFRBTElHTl9MZWZ0LA0KKyAgRkRFX0NTU1RFWFRBTElHTl9SaWdodCwNCisgIEZERV9DU1NURVhUQUxJR05fQ2VudGVyLA0KKyAgRkRFX0NTU1RFWFRBTElHTl9KdXN0aWZ5LA0KKyAgRkRFX0NTU1RFWFRBTElHTl9KdXN0aWZ5QWxsLA0KIH07DQogZW51bSBGREVfQ1NTVkVSVElDQUxBTElHTiB7DQotICAgIEZERV9DU1NWRVJUSUNBTEFMSUdOX0Jhc2VsaW5lLA0KLSAgICBGREVfQ1NTVkVSVElDQUxBTElHTl9TdWIsDQotICAgIEZERV9DU1NWRVJUSUNBTEFMSUdOX1N1cGVyLA0KLSAgICBGREVfQ1NTVkVSVElDQUxBTElHTl9Ub3AsDQotICAgIEZERV9DU1NWRVJUSUNBTEFMSUdOX1RleHRUb3AsDQotICAgIEZERV9DU1NWRVJUSUNBTEFMSUdOX01pZGRsZSwNCi0gICAgRkRFX0NTU1ZFUlRJQ0FMQUxJR05fQm90dG9tLA0KLSAgICBGREVfQ1NTVkVSVElDQUxBTElHTl9UZXh0Qm90dG9tLA0KLSAgICBGREVfQ1NTVkVSVElDQUxBTElHTl9OdW1iZXIsDQorICBGREVfQ1NTVkVSVElDQUxBTElHTl9CYXNlbGluZSwNCisgIEZERV9DU1NWRVJUSUNBTEFMSUdOX1N1YiwNCisgIEZERV9DU1NWRVJUSUNBTEFMSUdOX1N1cGVyLA0KKyAgRkRFX0NTU1ZFUlRJQ0FMQUxJR05fVG9wLA0KKyAgRkRFX0NTU1ZFUlRJQ0FMQUxJR05fVGV4dFRvcCwNCisgIEZERV9DU1NWRVJUSUNBTEFMSUdOX01pZGRsZSwNCisgIEZERV9DU1NWRVJUSUNBTEFMSUdOX0JvdHRvbSwNCisgIEZERV9DU1NWRVJUSUNBTEFMSUdOX1RleHRCb3R0b20sDQorICBGREVfQ1NTVkVSVElDQUxBTElHTl9OdW1iZXIsDQogfTsNCiBlbnVtIEZERV9DU1NMSVNUU1RZTEVUWVBFIHsNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfRGlzYywNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfQ2lyY2xlLA0KLSAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9TcXVhcmUsDQotICAgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0RlY2ltYWwsDQotICAgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0RlY2ltYWxMZWFkaW5nWmVybywNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJSb21hbiwNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfVXBwZXJSb21hbiwNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJHcmVlaywNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJMYXRpbiwNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfVXBwZXJMYXRpbiwNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfQXJtZW5pYW4sDQotICAgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0dlb3JnaWFuLA0KLSAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9Mb3dlckFscGhhLA0KLSAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlckFscGhhLA0KLSAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9Ob25lLA0KLSAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9DamtJZGVvZ3JhcGhpYywNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGVicmV3LA0KLSAgICBGREVfQ1NTTElTVFNUWUxFVFlQRV9IaXJhZ2FuYSwNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGlyYWdhbmFJcm9oYSwNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfS2F0YWthbmEsDQotICAgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0thdGFrYW5hSXJvaGEsDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9EaXNjLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfQ2lyY2xlLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfU3F1YXJlLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfRGVjaW1hbCwNCisgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0RlY2ltYWxMZWFkaW5nWmVybywNCisgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0xvd2VyUm9tYW4sDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlclJvbWFuLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJHcmVlaywNCisgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0xvd2VyTGF0aW4sDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlckxhdGluLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfQXJtZW5pYW4sDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9HZW9yZ2lhbiwNCisgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0xvd2VyQWxwaGEsDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlckFscGhhLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfTm9uZSwNCisgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0Nqa0lkZW9ncmFwaGljLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGVicmV3LA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGlyYWdhbmEsDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9IaXJhZ2FuYUlyb2hhLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfS2F0YWthbmEsDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9LYXRha2FuYUlyb2hhLA0KIH07DQogZW51bSBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT04gew0KLSAgICBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT05fT3V0c2lkZSwNCi0gICAgRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OX0luc2lkZSwNCisgIEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTl9PdXRzaWRlLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OX0luc2lkZSwNCiB9Ow0KIGVudW0gRkRFX0NTU1dISVRFU1BBQ0Ugew0KLSAgICBGREVfQ1NTV0hJVEVTUEFDRV9Ob3JtYWwsDQotICAgIEZERV9DU1NXSElURVNQQUNFX1ByZSwNCi0gICAgRkRFX0NTU1dISVRFU1BBQ0VfTm93cmFwLA0KLSAgICBGREVfQ1NTV0hJVEVTUEFDRV9QcmVXcmFwLA0KLSAgICBGREVfQ1NTV0hJVEVTUEFDRV9QcmVMaW5lLA0KKyAgRkRFX0NTU1dISVRFU1BBQ0VfTm9ybWFsLA0KKyAgRkRFX0NTU1dISVRFU1BBQ0VfUHJlLA0KKyAgRkRFX0NTU1dISVRFU1BBQ0VfTm93cmFwLA0KKyAgRkRFX0NTU1dISVRFU1BBQ0VfUHJlV3JhcCwNCisgIEZERV9DU1NXSElURVNQQUNFX1ByZUxpbmUsDQogfTsNCiBlbnVtIEZERV9DU1NGT05UVkFSSUFOVCB7DQotICAgIEZERV9DU1NGT05UVkFSSUFOVF9Ob3JtYWwsDQotICAgIEZERV9DU1NGT05UVkFSSUFOVF9TbWFsbENhcHMsDQorICBGREVfQ1NTRk9OVFZBUklBTlRfTm9ybWFsLA0KKyAgRkRFX0NTU0ZPTlRWQVJJQU5UX1NtYWxsQ2FwcywNCiB9Ow0KIGVudW0gRkRFX0NTU1RFWFRUUkFOU0ZPUk0gew0KLSAgICBGREVfQ1NTVEVYVFRSQU5TRk9STV9Ob25lLA0KLSAgICBGREVfQ1NTVEVYVFRSQU5TRk9STV9DYXBpdGFsaXplLA0KLSAgICBGREVfQ1NTVEVYVFRSQU5TRk9STV9VcHBlckNhc2UsDQotICAgIEZERV9DU1NURVhUVFJBTlNGT1JNX0xvd2VyQ2FzZSwNCisgIEZERV9DU1NURVhUVFJBTlNGT1JNX05vbmUsDQorICBGREVfQ1NTVEVYVFRSQU5TRk9STV9DYXBpdGFsaXplLA0KKyAgRkRFX0NTU1RFWFRUUkFOU0ZPUk1fVXBwZXJDYXNlLA0KKyAgRkRFX0NTU1RFWFRUUkFOU0ZPUk1fTG93ZXJDYXNlLA0KIH07DQogZW51bSBGREVfQ1NTVEVYVERFQ09SQVRJT04gew0KLSAgICBGREVfQ1NTVEVYVERFQ09SQVRJT05fTm9uZQkJCQk9IDAsDQotICAgIEZERV9DU1NURVhUREVDT1JBVElPTl9VbmRlcmxpbmUJCQk9IDEsDQotICAgIEZERV9DU1NURVhUREVDT1JBVElPTl9PdmVybGluZQkJCT0gMiwNCi0gICAgRkRFX0NTU1RFWFRERUNPUkFUSU9OX0xpbmVUaHJvdWdoCQk9IDQsDQotICAgIEZERV9DU1NURVhUREVDT1JBVElPTl9CbGluawkJCQk9IDgsDQotICAgIEZERV9DU1NURVhUREVDT1JBVElPTl9Eb3VibGUJCQk9IDE2LA0KKyAgRkRFX0NTU1RFWFRERUNPUkFUSU9OX05vbmUgPSAwLA0KKyAgRkRFX0NTU1RFWFRERUNPUkFUSU9OX1VuZGVybGluZSA9IDEsDQorICBGREVfQ1NTVEVYVERFQ09SQVRJT05fT3ZlcmxpbmUgPSAyLA0KKyAgRkRFX0NTU1RFWFRERUNPUkFUSU9OX0xpbmVUaHJvdWdoID0gNCwNCisgIEZERV9DU1NURVhUREVDT1JBVElPTl9CbGluayA9IDgsDQorICBGREVfQ1NTVEVYVERFQ09SQVRJT05fRG91YmxlID0gMTYsDQogfTsNCi1jbGFzcyBJRkRFX0NTU1J1YnlTdHlsZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGREVfQ1NTUnVieVN0eWxlKCkge30NCi0gICAgdmlydHVhbCBGREVfQ1NTUlVCWUFMSUdOCQlHZXRSdWJ5QWxpZ24oKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0NTU1JVQllPVkVSSEFORwkJR2V0UnVieU92ZXJoYW5nKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NSVUJZUE9TSVRJT04JCUdldFJ1YnlQb3NpdGlvbigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTUlVCWVNQQU4JCQlHZXRSdWJ5U3BhblR5cGUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgSUZERV9DU1NWYWx1ZSoJCQlHZXRSdWJ5U3BhbkF0dHIoKSBjb25zdCA9IDA7DQorY2xhc3MgSUZERV9DU1NSdWJ5U3R5bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU1J1YnlTdHlsZSgpIHt9DQorICB2aXJ0dWFsIEZERV9DU1NSVUJZQUxJR04gR2V0UnVieUFsaWduKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTUlVCWU9WRVJIQU5HIEdldFJ1YnlPdmVyaGFuZygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU1JVQllQT1NJVElPTiBHZXRSdWJ5UG9zaXRpb24oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NSVUJZU1BBTiBHZXRSdWJ5U3BhblR5cGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqIEdldFJ1YnlTcGFuQXR0cigpIGNvbnN0ID0gMDsNCiB9Ow0KLWNsYXNzIElGREVfQ1NTTXVsdGlDb2x1bW5TdHlsZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGREVfQ1NTTXVsdGlDb2x1bW5TdHlsZSgpIHt9DQotICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYJR2V0Q29sdW1uQ291bnQoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYJR2V0Q29sdW1uR2FwKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJCUdldENvbHVtblJ1bGVDb2xvcigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUJCUdldENvbHVtblJ1bGVTdHlsZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRDb2x1bW5SdWxlV2lkdGgoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYJR2V0Q29sdW1uV2lkdGgoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Q29sdW1uQ291bnQoY29uc3QgRkRFX0NTU0xFTkdUSCAmY29sdW1uQ291bnQpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2x1bW5HYXAoY29uc3QgRkRFX0NTU0xFTkdUSCAmY29sdW1uR2FwKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Q29sdW1uUnVsZUNvbG9yKEZYX0FSR0IgZHdDb2x1bW5SdWxlQ29sb3IpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2x1bW5SdWxlU3R5bGUoRkRFX0NTU0JPUkRFUlNUWUxFIGVDb2x1bW5SdWxlU3R5bGUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2x1bW5SdWxlV2lkdGgoY29uc3QgRkRFX0NTU0xFTkdUSCAmY29sdW1uUnVsZVdpZHRoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Q29sdW1uV2lkdGgoY29uc3QgRkRFX0NTU0xFTkdUSCAmY29sdW1uV2lkdGgpID0gMDsNCitjbGFzcyBJRkRFX0NTU011bHRpQ29sdW1uU3R5bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU011bHRpQ29sdW1uU3R5bGUoKSB7fQ0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJiBHZXRDb2x1bW5Db3VudCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0Q29sdW1uR2FwKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9BUkdCIEdldENvbHVtblJ1bGVDb2xvcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0JPUkRFUlNUWUxFIEdldENvbHVtblJ1bGVTdHlsZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0Q29sdW1uUnVsZVdpZHRoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJiBHZXRDb2x1bW5XaWR0aCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDb2x1bW5Db3VudChjb25zdCBGREVfQ1NTTEVOR1RIJiBjb2x1bW5Db3VudCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtbkdhcChjb25zdCBGREVfQ1NTTEVOR1RIJiBjb2x1bW5HYXApID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDb2x1bW5SdWxlQ29sb3IoRlhfQVJHQiBkd0NvbHVtblJ1bGVDb2xvcikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtblJ1bGVTdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUNvbHVtblJ1bGVTdHlsZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtblJ1bGVXaWR0aChjb25zdCBGREVfQ1NTTEVOR1RIJiBjb2x1bW5SdWxlV2lkdGgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDb2x1bW5XaWR0aChjb25zdCBGREVfQ1NTTEVOR1RIJiBjb2x1bW5XaWR0aCkgPSAwOw0KIH07DQotY2xhc3MgSUZERV9DU1NHZW5lcmF0ZWRDb250ZW50U3R5bGUNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JRkRFX0NTU0dlbmVyYXRlZENvbnRlbnRTdHlsZSgpIHt9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlDb3VudENvdW50ZXJzKCkgPSAwOw0KLSAgICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKgkJCQlHZXRDb3VudGVySWRlbnRpZmllcihpbnQzMl90IGluZGV4KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJR2V0Q291bnRlclJlc2V0KGludDMyX3QgaW5kZXgsIGludDMyX3QgJmlWYWx1ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUdldENvdW50ZXJJbmNyZW1lbnQoaW50MzJfdCBpbmRleCwgaW50MzJfdCAmaVZhbHVlKSA9IDA7DQotICAgIHZpcnR1YWwgSUZERV9DU1NWYWx1ZUxpc3QqCQlHZXRDb250ZW50KCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJQ291bnRRdW90ZXMoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqCQkJCUdldFF1b3RlcyhpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7DQorY2xhc3MgSUZERV9DU1NHZW5lcmF0ZWRDb250ZW50U3R5bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU0dlbmVyYXRlZENvbnRlbnRTdHlsZSgpIHt9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRDb3VudGVycygpID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldENvdW50ZXJJZGVudGlmaWVyKGludDMyX3QgaW5kZXgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDb3VudGVyUmVzZXQoaW50MzJfdCBpbmRleCwgaW50MzJfdCYgaVZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q291bnRlckluY3JlbWVudChpbnQzMl90IGluZGV4LCBpbnQzMl90JiBpVmFsdWUpID0gMDsNCisgIHZpcnR1YWwgSUZERV9DU1NWYWx1ZUxpc3QqIEdldENvbnRlbnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRRdW90ZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRRdW90ZXMoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KIH07DQotY2xhc3MgSUZERV9DU1NGb250U3R5bGUNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JRkRFX0NTU0ZvbnRTdHlsZSgpIHt9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlDb3VudEZvbnRGYW1pbGllcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBjb25zdCBGWF9XQ0hBUioJCQkJR2V0Rm9udEZhbWlseShpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfV09SRAkJCQkJR2V0Rm9udFdlaWdodCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTRk9OVFZBUklBTlQJCUdldEZvbnRWYXJpYW50KCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NGT05UU1RZTEUJCUdldEZvbnRTdHlsZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRGb250U2l6ZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRDb2xvcigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRGb250V2VpZ2h0KEZYX1dPUkQgd0ZvbnRXZWlnaHQpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRGb250VmFyaWFudChGREVfQ1NTRk9OVFZBUklBTlQgZUZvbnRWYXJpYW50KSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFN0eWxlKEZERV9DU1NGT05UU1RZTEUgZUZvbnRTdHlsZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldENvbG9yKEZYX0FSR0IgZHdGb250Q29sb3IpID0gMDsNCitjbGFzcyBJRkRFX0NTU0ZvbnRTdHlsZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTRm9udFN0eWxlKCkge30NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEZvbnRGYW1pbGllcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldEZvbnRGYW1pbHkoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9XT1JEIEdldEZvbnRXZWlnaHQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NGT05UVkFSSUFOVCBHZXRGb250VmFyaWFudCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0ZPTlRTVFlMRSBHZXRGb250U3R5bGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9BUkdCIEdldENvbG9yKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRXZWlnaHQoRlhfV09SRCB3Rm9udFdlaWdodCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRWYXJpYW50KEZERV9DU1NGT05UVkFSSUFOVCBlRm9udFZhcmlhbnQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U3R5bGUoRkRFX0NTU0ZPTlRTVFlMRSBlRm9udFN0eWxlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29sb3IoRlhfQVJHQiBkd0ZvbnRDb2xvcikgPSAwOw0KIH07DQotY2xhc3MgSUZERV9DU1NCb3VuZGFyeVN0eWxlDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZERV9DU1NCb3VuZGFyeVN0eWxlKCkge30NCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRCb3JkZXJMZWZ0Q29sb3IoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0Qm9yZGVyVG9wQ29sb3IoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0Qm9yZGVyUmlnaHRDb2xvcigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRCb3JkZXJCb3R0b21Db2xvcigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUJCUdldEJvcmRlckxlZnRTdHlsZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUJCUdldEJvcmRlclRvcFN0eWxlKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRQkJR2V0Qm9yZGVyUmlnaHRTdHlsZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUJCUdldEJvcmRlckJvdHRvbVN0eWxlKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NSRUNUKgkJR2V0Qm9yZGVyV2lkdGgoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1JFQ1QqCQlHZXRNYXJnaW5XaWR0aCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBjb25zdCBGREVfQ1NTUkVDVCoJCUdldFBhZGRpbmdXaWR0aCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJMZWZ0Q29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyVG9wQ29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyUmlnaHRDb2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJCb3R0b21Db2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpID0gMDsNCitjbGFzcyBJRkRFX0NTU0JvdW5kYXJ5U3R5bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU0JvdW5kYXJ5U3R5bGUoKSB7fQ0KKyAgdmlydHVhbCBGWF9BUkdCIEdldEJvcmRlckxlZnRDb2xvcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRCb3JkZXJUb3BDb2xvcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRCb3JkZXJSaWdodENvbG9yKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9BUkdCIEdldEJvcmRlckJvdHRvbUNvbG9yKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUgR2V0Qm9yZGVyTGVmdFN0eWxlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUgR2V0Qm9yZGVyVG9wU3R5bGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRSBHZXRCb3JkZXJSaWdodFN0eWxlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUgR2V0Qm9yZGVyQm90dG9tU3R5bGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NSRUNUKiBHZXRCb3JkZXJXaWR0aCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1JFQ1QqIEdldE1hcmdpbldpZHRoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTUkVDVCogR2V0UGFkZGluZ1dpZHRoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEJvcmRlckxlZnRDb2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJUb3BDb2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJSaWdodENvbG9yKEZYX0FSR0IgZHdCb3JkZXJDb2xvcikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEJvcmRlckJvdHRvbUNvbG9yKEZYX0FSR0IgZHdCb3JkZXJDb2xvcikgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEJvcmRlckxlZnRTdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUJvcmRlclN0eWxlKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyVG9wU3R5bGUoRkRFX0NTU0JPUkRFUlNUWUxFIGVCb3JkZXJTdHlsZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEJvcmRlclJpZ2h0U3R5bGUoRkRFX0NTU0JPUkRFUlNUWUxFIGVCb3JkZXJTdHlsZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEJvcmRlckJvdHRvbVN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJMZWZ0U3R5bGUoRkRFX0NTU0JPUkRFUlNUWUxFIGVCb3JkZXJTdHlsZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEJvcmRlclRvcFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJSaWdodFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJCb3R0b21TdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUJvcmRlclN0eWxlKSA9IDA7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QgJnJlY3QpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRNYXJnaW5XaWR0aChjb25zdCBGREVfQ1NTUkVDVCAmcmVjdCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFBhZGRpbmdXaWR0aChjb25zdCBGREVfQ1NTUkVDVCAmcmVjdCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEJvcmRlcldpZHRoKGNvbnN0IEZERV9DU1NSRUNUJiByZWN0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TWFyZ2luV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QmIHJlY3QpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRQYWRkaW5nV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QmIHJlY3QpID0gMDsNCiB9Ow0KLWNsYXNzIElGREVfQ1NTUG9zaXRpb25TdHlsZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGREVfQ1NTUG9zaXRpb25TdHlsZSgpIHt9DQotICAgIHZpcnR1YWwgRkRFX0NTU0RJU1BMQVkJCQlHZXREaXNwbGF5KCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NTSVpFJgkJR2V0Qm94U2l6ZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBjb25zdCBGREVfQ1NTU0laRSYJCUdldE1pbkJveFNpemUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1NJWkUmCQlHZXRNYXhCb3hTaXplKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NGTE9BVAkJCUdldEZsb2F0KCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NDTEVBUgkJCUdldENsZWFyKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NQT1NJVElPTgkJCUdldFBvc2l0aW9uKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NMRU5HVEgJCQlHZXRUb3AoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0NTU0xFTkdUSAkJCUdldEJvdHRvbSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTTEVOR1RICQkJR2V0TGVmdCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTTEVOR1RICQkJR2V0UmlnaHQoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0RGlzcGxheShGREVfQ1NTRElTUExBWSBlRGlzcGxheSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEJveFNpemUoY29uc3QgRkRFX0NTU1NJWkUgJmJveFNpemUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRNaW5Cb3hTaXplKGNvbnN0IEZERV9DU1NTSVpFICZtaW5Cb3hTaXplKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TWF4Qm94U2l6ZShjb25zdCBGREVfQ1NTU0laRSAmbWF4Qm94U2l6ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEZsb2F0KEZERV9DU1NGTE9BVCBlRmxvYXQpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDbGVhcihGREVfQ1NTQ0xFQVIgZUNsZWFyKSA9IDA7DQorY2xhc3MgSUZERV9DU1NQb3NpdGlvblN0eWxlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9DU1NQb3NpdGlvblN0eWxlKCkge30NCisgIHZpcnR1YWwgRkRFX0NTU0RJU1BMQVkgR2V0RGlzcGxheSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1NJWkUmIEdldEJveFNpemUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NTSVpFJiBHZXRNaW5Cb3hTaXplKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTU0laRSYgR2V0TWF4Qm94U2l6ZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0ZMT0FUIEdldEZsb2F0KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTQ0xFQVIgR2V0Q2xlYXIoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NQT1NJVElPTiBHZXRQb3NpdGlvbigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0xFTkdUSCBHZXRUb3AoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NMRU5HVEggR2V0Qm90dG9tKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTTEVOR1RIIEdldExlZnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NMRU5HVEggR2V0UmlnaHQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0RGlzcGxheShGREVfQ1NTRElTUExBWSBlRGlzcGxheSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEJveFNpemUoY29uc3QgRkRFX0NTU1NJWkUmIGJveFNpemUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRNaW5Cb3hTaXplKGNvbnN0IEZERV9DU1NTSVpFJiBtaW5Cb3hTaXplKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TWF4Qm94U2l6ZShjb25zdCBGREVfQ1NTU0laRSYgbWF4Qm94U2l6ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZsb2F0KEZERV9DU1NGTE9BVCBlRmxvYXQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDbGVhcihGREVfQ1NTQ0xFQVIgZUNsZWFyKSA9IDA7DQogfTsNCi1jbGFzcyBJRkRFX0NTU1BhcmFncmFwaFN0eWxlDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZERV9DU1NQYXJhZ3JhcGhTdHlsZSgpIHt9DQotICAgIHZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0TGluZUhlaWdodCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTV0hJVEVTUEFDRQkJR2V0V2hpdGVTcGFjZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRUZXh0SW5kZW50KCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NURVhUQUxJR04JCUdldFRleHRBbGlnbigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTVkVSVElDQUxBTElHTglHZXRWZXJ0aWNhbEFsaWduKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldE51bWJlclZlcnRpY2FsQWxpZ24oKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0NTU1RFWFRUUkFOU0ZPUk0JR2V0VGV4dFRyYW5zZm9ybSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJCQlHZXRUZXh0RGVjb3JhdGlvbigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRMZXR0ZXJTcGFjaW5nKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmCUdldFdvcmRTcGFjaW5nKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NXUklUSU5HTU9ERQkJR2V0V3JpdGluZ01vZGUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0NTU1dPUkRCUkVBSwkJR2V0V29yZEJyZWFrKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJR2V0V2lkb3dzKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJCUdldFRleHRFbXBoYXNpc0NvbG9yKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NQQUdFQlJFQUsJCUdldFBhZ2VCcmVha0JlZm9yZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTUEFHRUJSRUFLCQlHZXRQYWdlQnJlYWtBZnRlcigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTUEFHRUJSRUFLCQlHZXRQYWdlQnJlYWtJbnNpZGUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlHZXRPcnBoYW5zKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NMSU5FQlJFQUsJCUdldExpbmVCcmVhaygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSSwlHZXRUZXh0RW1waGFzaXNNYXJrKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NURVhURU1QSEFTSVNGSUxMCUdldFRleHRFbXBoYXNpc0ZpbGwoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqCQkJCUdldFRleHRFbXBoYXNpc0N1c3RvbSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTVEVYVENPTUJJTkUJCUdldFRleHRDb21iaW5lVHlwZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlIYXNUZXh0Q29tYmluZU51bWJlcigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRUZXh0Q29tYmluZU51bWJlcigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRMaW5lSGVpZ2h0KEZYX0ZMT0FUIGZMaW5lSGVpZ2h0KSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0V2hpdGVTcGFjZShGREVfQ1NTV0hJVEVTUEFDRSBlV2hpdGVTcGFjZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHRJbmRlbnQoY29uc3QgRkRFX0NTU0xFTkdUSCAmdGV4dEluZGVudCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHRBbGlnbihGREVfQ1NTVEVYVEFMSUdOIGVUZXh0QWxpZ24pID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRWZXJ0aWNhbEFsaWduKEZERV9DU1NWRVJUSUNBTEFMSUdOIGVWZXJ0aWNhbEFsaWduKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TnVtYmVyVmVydGljYWxBbGlnbihGWF9GTE9BVCBmQWxpZ24pID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0VHJhbnNmb3JtKEZERV9DU1NURVhUVFJBTlNGT1JNIGVUZXh0VHJhbnNmb3JtKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0VGV4dERlY29yYXRpb24oRlhfRFdPUkQgZHdUZXh0RGVjb3JhdGlvbikgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldExldHRlclNwYWNpbmcoY29uc3QgRkRFX0NTU0xFTkdUSCAmbGV0dGVyU3BhY2luZykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJIAlTZXRXb3JkU3BhY2luZyhjb25zdCBGREVfQ1NTTEVOR1RIICZ3b3JkU3BhY2luZykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFdyaXRpbmdNb2RlKEZERV9DU1NXUklUSU5HTU9ERSBlV3JpdGluZ01vZGUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRXb3JkQnJlYWsoRkRFX0NTU1dPUkRCUkVBSyBlV29yZEJyZWFrKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0V2lkb3dzKGludDMyX3QgaVdpZG93cykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHRFbXBoYXNpc0NvbG9yKEZYX0FSR0IgZHdUZXh0RW1waGFzaXNDb2xvcikgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFBhZ2VCcmVha0JlZm9yZShGREVfQ1NTUEFHRUJSRUFLIGVQYWdlQnJlYWtCZWZvcmUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRQYWdlQnJlYWtBZnRlcihGREVfQ1NTUEFHRUJSRUFLIGVQYWdlQnJlYWtBZnRlcikgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFBhZ2VCcmVha0luc2lkZShGREVfQ1NTUEFHRUJSRUFLIGVQYWdlQnJlYWtJbnNpZGUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRPcnBoYW5zKGludDMyX3QgaU9ycGhhbnMpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRMaW5lQnJlYWsoRkRFX0NTU0xJTkVCUkVBSyBlTGluZUJyZWFrKSA9IDA7DQorY2xhc3MgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTUGFyYWdyYXBoU3R5bGUoKSB7fQ0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRMaW5lSGVpZ2h0KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTV0hJVEVTUEFDRSBHZXRXaGl0ZVNwYWNlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJiBHZXRUZXh0SW5kZW50KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTVEVYVEFMSUdOIEdldFRleHRBbGlnbigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU1ZFUlRJQ0FMQUxJR04gR2V0VmVydGljYWxBbGlnbigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0TnVtYmVyVmVydGljYWxBbGlnbigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU1RFWFRUUkFOU0ZPUk0gR2V0VGV4dFRyYW5zZm9ybSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0VGV4dERlY29yYXRpb24oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmIEdldExldHRlclNwYWNpbmcoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmIEdldFdvcmRTcGFjaW5nKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTV1JJVElOR01PREUgR2V0V3JpdGluZ01vZGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NXT1JEQlJFQUsgR2V0V29yZEJyZWFrKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZG93cygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRUZXh0RW1waGFzaXNDb2xvcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU1BBR0VCUkVBSyBHZXRQYWdlQnJlYWtCZWZvcmUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NQQUdFQlJFQUsgR2V0UGFnZUJyZWFrQWZ0ZXIoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NQQUdFQlJFQUsgR2V0UGFnZUJyZWFrSW5zaWRlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldE9ycGhhbnMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NMSU5FQlJFQUsgR2V0TGluZUJyZWFrKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSSyBHZXRUZXh0RW1waGFzaXNNYXJrKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTCBHZXRUZXh0RW1waGFzaXNGaWxsKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBGWF9XQ0hBUiogR2V0VGV4dEVtcGhhc2lzQ3VzdG9tKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTVEVYVENPTUJJTkUgR2V0VGV4dENvbWJpbmVUeXBlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEhhc1RleHRDb21iaW5lTnVtYmVyKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRUZXh0Q29tYmluZU51bWJlcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lSGVpZ2h0KEZYX0ZMT0FUIGZMaW5lSGVpZ2h0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0V2hpdGVTcGFjZShGREVfQ1NTV0hJVEVTUEFDRSBlV2hpdGVTcGFjZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFRleHRJbmRlbnQoY29uc3QgRkRFX0NTU0xFTkdUSCYgdGV4dEluZGVudCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFRleHRBbGlnbihGREVfQ1NTVEVYVEFMSUdOIGVUZXh0QWxpZ24pID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRWZXJ0aWNhbEFsaWduKEZERV9DU1NWRVJUSUNBTEFMSUdOIGVWZXJ0aWNhbEFsaWduKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TnVtYmVyVmVydGljYWxBbGlnbihGWF9GTE9BVCBmQWxpZ24pID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0VHJhbnNmb3JtKEZERV9DU1NURVhUVFJBTlNGT1JNIGVUZXh0VHJhbnNmb3JtKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dERlY29yYXRpb24oRlhfRFdPUkQgZHdUZXh0RGVjb3JhdGlvbikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExldHRlclNwYWNpbmcoY29uc3QgRkRFX0NTU0xFTkdUSCYgbGV0dGVyU3BhY2luZykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFdvcmRTcGFjaW5nKGNvbnN0IEZERV9DU1NMRU5HVEgmIHdvcmRTcGFjaW5nKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0V3JpdGluZ01vZGUoRkRFX0NTU1dSSVRJTkdNT0RFIGVXcml0aW5nTW9kZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFdvcmRCcmVhayhGREVfQ1NTV09SREJSRUFLIGVXb3JkQnJlYWspID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRXaWRvd3MoaW50MzJfdCBpV2lkb3dzKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dEVtcGhhc2lzQ29sb3IoRlhfQVJHQiBkd1RleHRFbXBoYXNpc0NvbG9yKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0UGFnZUJyZWFrQmVmb3JlKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0JlZm9yZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFBhZ2VCcmVha0FmdGVyKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0FmdGVyKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0UGFnZUJyZWFrSW5zaWRlKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0luc2lkZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldE9ycGhhbnMoaW50MzJfdCBpT3JwaGFucykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVCcmVhayhGREVfQ1NTTElORUJSRUFLIGVMaW5lQnJlYWspID0gMDsNCiB9Ow0KLWNsYXNzIElGREVfQ1NTQmFja2dyb3VuZFN0eWxlDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZERV9DU1NCYWNrZ3JvdW5kU3R5bGUoKSB7fQ0KLSAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJCUdldEJLR0NvbG9yKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKgkJCQlHZXRCS0dJbWFnZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGREVfQ1NTQktHUkVQRUFUCQlHZXRCS0dSZXBlYXQoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0NTU0JLR0FUVEFDSE1FTlQJR2V0QktHQXR0YWNobWVudCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBjb25zdCBGREVfQ1NTUE9JTlQmCQlHZXRCS0dQb3NpdGlvbigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCS0dDb2xvcihGWF9BUkdCIGR3QktHQ29sb3IpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCS0dQb3NpdGlvbihjb25zdCBGREVfQ1NTUE9JTlQgJmJrZ1Bvc2l0aW9uKSA9IDA7DQorY2xhc3MgSUZERV9DU1NCYWNrZ3JvdW5kU3R5bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU0JhY2tncm91bmRTdHlsZSgpIHt9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0QktHQ29sb3IoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRCS0dJbWFnZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0JLR1JFUEVBVCBHZXRCS0dSZXBlYXQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NCS0dBVFRBQ0hNRU5UIEdldEJLR0F0dGFjaG1lbnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NQT0lOVCYgR2V0QktHUG9zaXRpb24oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0QktHQ29sb3IoRlhfQVJHQiBkd0JLR0NvbG9yKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0QktHUG9zaXRpb24oY29uc3QgRkRFX0NTU1BPSU5UJiBia2dQb3NpdGlvbikgPSAwOw0KIH07DQotY2xhc3MgSUZERV9DU1NMaXN0U3R5bGUNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JRkRFX0NTU0xpc3RTdHlsZSgpIHt9DQotICAgIHZpcnR1YWwgRkRFX0NTU0xJU1RTVFlMRVRZUEUJCUdldExpc3RTdHlsZVR5cGUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OCUdldExpc3RTdHlsZVBvc2l0aW9uKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKgkJCQkJR2V0TGlzdFN0eWxlSW1hZ2UoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJCVNldExpc3RTdHlsZVR5cGUoRkRFX0NTU0xJU1RTVFlMRVRZUEUgZUxpc3RTdHlsZVR5cGUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJU2V0TGlzdFN0eWxlUG9zaXRpb24oRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OIGVMaXN0U3R5bGVQb3NpdGlvbikgPSAwOw0KK2NsYXNzIElGREVfQ1NTTGlzdFN0eWxlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9DU1NMaXN0U3R5bGUoKSB7fQ0KKyAgdmlydHVhbCBGREVfQ1NTTElTVFNUWUxFVFlQRSBHZXRMaXN0U3R5bGVUeXBlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT04gR2V0TGlzdFN0eWxlUG9zaXRpb24oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRMaXN0U3R5bGVJbWFnZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaXN0U3R5bGVUeXBlKEZERV9DU1NMSVNUU1RZTEVUWVBFIGVMaXN0U3R5bGVUeXBlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGlzdFN0eWxlUG9zaXRpb24oDQorICAgICAgRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OIGVMaXN0U3R5bGVQb3NpdGlvbikgPSAwOw0KIH07DQotY2xhc3MgSUZERV9DU1NUYWJsZVN0eWxlDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZERV9DU1NUYWJsZVN0eWxlKCkge30NCi0gICAgdmlydHVhbCBGREVfQ1NTQ0FQVElPTlNJREUJCQlHZXRDYXB0aW9uU2lkZSgpIGNvbnN0ID0gMDsNCitjbGFzcyBJRkRFX0NTU1RhYmxlU3R5bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU1RhYmxlU3R5bGUoKSB7fQ0KKyAgdmlydHVhbCBGREVfQ1NTQ0FQVElPTlNJREUgR2V0Q2FwdGlvblNpZGUoKSBjb25zdCA9IDA7DQogfTsNCi1jbGFzcyBJRkRFX0NTU1Zpc3VhbFN0eWxlDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZERV9DU1NWaXN1YWxTdHlsZSgpIHt9DQotICAgIHZpcnR1YWwgRkRFX0NTU1ZJU0lCSUxJVFkJCUdldFZpc2liaWxpdHkoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0NTU09WRVJGTE9XCQkJR2V0T3ZlcmZsb3dYKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9DU1NPVkVSRkxPVwkJCUdldE92ZXJmbG93WSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRWaXNpYmlsaXR5KEZERV9DU1NWSVNJQklMSVRZIGVWaXNpYmlsaXR5KSA9IDA7DQorY2xhc3MgSUZERV9DU1NWaXN1YWxTdHlsZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTVmlzdWFsU3R5bGUoKSB7fQ0KKyAgdmlydHVhbCBGREVfQ1NTVklTSUJJTElUWSBHZXRWaXNpYmlsaXR5KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTT1ZFUkZMT1cgR2V0T3ZlcmZsb3dYKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTT1ZFUkZMT1cgR2V0T3ZlcmZsb3dZKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFZpc2liaWxpdHkoRkRFX0NTU1ZJU0lCSUxJVFkgZVZpc2liaWxpdHkpID0gMDsNCiB9Ow0KLWNsYXNzIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSA6IHB1YmxpYyBJRlhfVW5rbm93bg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlSZXNldCgpID0gMDsNCi0gICAgdmlydHVhbCBJRkRFX0NTU0ZvbnRTdHlsZSoJCQkJR2V0Rm9udFN0eWxlcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBJRkRFX0NTU0JvdW5kYXJ5U3R5bGUqCQkJR2V0Qm91bmRhcnlTdHlsZXMoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgSUZERV9DU1NQb3NpdGlvblN0eWxlKgkJCUdldFBvc2l0aW9uU3R5bGVzKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfQ1NTUGFyYWdyYXBoU3R5bGUqCQkJR2V0UGFyYWdyYXBoU3R5bGVzKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfQ1NTQmFja2dyb3VuZFN0eWxlKgkJR2V0QmFja2dyb3VuZFN0eWxlcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBJRkRFX0NTU1Zpc3VhbFN0eWxlKgkJCUdldFZpc3VhbFN0eWxlcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBJRkRFX0NTU0xpc3RTdHlsZSoJCQkJR2V0TGlzdFN0eWxlcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBJRkRFX0NTU011bHRpQ29sdW1uU3R5bGUqCQlHZXRNdWx0aUNvbHVtblN0eWxlKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfQ1NTVGFibGVTdHlsZSoJCQkJR2V0VGFibGVTdHlsZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBJRkRFX0NTU0dlbmVyYXRlZENvbnRlbnRTdHlsZSoJR2V0R2VuZXJhdGVkQ29udGVudFN0eWxlKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfQ1NTUnVieVN0eWxlKgkJCQlHZXRSdWJ5U3R5bGUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlHZXRDdXN0b21TdHlsZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpIGNvbnN0ID0gMDsNCitjbGFzcyBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgOiBwdWJsaWMgSUZYX1Vua25vd24gew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTRm9udFN0eWxlKiBHZXRGb250U3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU0JvdW5kYXJ5U3R5bGUqIEdldEJvdW5kYXJ5U3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1Bvc2l0aW9uU3R5bGUqIEdldFBvc2l0aW9uU3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1BhcmFncmFwaFN0eWxlKiBHZXRQYXJhZ3JhcGhTdHlsZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTQmFja2dyb3VuZFN0eWxlKiBHZXRCYWNrZ3JvdW5kU3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1Zpc3VhbFN0eWxlKiBHZXRWaXN1YWxTdHlsZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTTGlzdFN0eWxlKiBHZXRMaXN0U3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU011bHRpQ29sdW1uU3R5bGUqIEdldE11bHRpQ29sdW1uU3R5bGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTVGFibGVTdHlsZSogR2V0VGFibGVTdHlsZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZERV9DU1NHZW5lcmF0ZWRDb250ZW50U3R5bGUqIEdldEdlbmVyYXRlZENvbnRlbnRTdHlsZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZERV9DU1NSdWJ5U3R5bGUqIEdldFJ1YnlTdHlsZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDdXN0b21TdHlsZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgY29uc3QgPSAwOw0KIH07DQogZW51bSBGREVfQ1NTU1RZTEVTSEVFVEdST1VQIHsNCi0gICAgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9Vc2VyQWdlbnQsDQotICAgIEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfVXNlciwNCi0gICAgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9BdXRob3IsDQotICAgIEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfTUFYLA0KKyAgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9Vc2VyQWdlbnQsDQorICBGREVfQ1NTU1RZTEVTSEVFVEdST1VQX1VzZXIsDQorICBGREVfQ1NTU1RZTEVTSEVFVEdST1VQX0F1dGhvciwNCisgIEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfTUFYLA0KIH07DQogZW51bSBGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZIHsNCi0gICAgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9IaWdoLA0KLSAgICBGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZX01pZCwNCi0gICAgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9Mb3csDQotICAgIEZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfTUFYLA0KKyAgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9IaWdoLA0KKyAgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9NaWQsDQorICBGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZX0xvdywNCisgIEZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfTUFYLA0KIH07DQotY2xhc3MgSUZERV9DU1NUYWdQcm92aWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGREVfQ1NTVGFnUHJvdmlkZXIoKSB7fQ0KLSAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nQwkJCUdldFRhZ05hbWUoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfUE9TSVRJT04JCQkJR2V0Rmlyc3RBdHRyaWJ1dGUoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJR2V0TmV4dEF0dHJpYnV0ZShGWF9QT1NJVElPTiAmcG9zLCBDRlhfV2lkZVN0cmluZ0MgJndzQXR0ciwgQ0ZYX1dpZGVTdHJpbmdDICZ3c1ZhbHVlKSA9IDA7DQorY2xhc3MgSUZERV9DU1NUYWdQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTVGFnUHJvdmlkZXIoKSB7fQ0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZ0MgR2V0VGFnTmFtZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfUE9TSVRJT04gR2V0Rmlyc3RBdHRyaWJ1dGUoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TmV4dEF0dHJpYnV0ZShGWF9QT1NJVElPTiYgcG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUpID0gMDsNCiB9Ow0KLWNsYXNzIElGREVfQ1NTQWNjZWxlcmF0b3INCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JRkRFX0NTU0FjY2VsZXJhdG9yKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlPbkVudGVyVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlPbkxlYXZlVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcpID0gMDsNCitjbGFzcyBJRkRFX0NTU0FjY2VsZXJhdG9yIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9DU1NBY2NlbGVyYXRvcigpIHt9DQorICB2aXJ0dWFsIHZvaWQgT25FbnRlclRhZyhJRkRFX0NTU1RhZ1Byb3ZpZGVyKiBwVGFnKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgT25MZWF2ZVRhZyhJRkRFX0NTU1RhZ1Byb3ZpZGVyKiBwVGFnKSA9IDA7DQogfTsNCi1jbGFzcyBJRkRFX0NTU1N0eWxlU2VsZWN0b3INCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZERV9DU1NTdHlsZVNlbGVjdG9yKglDcmVhdGUoKTsNCi0gICAgdmlydHVhbCB+SUZERV9DU1NTdHlsZVNlbGVjdG9yKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRNZ3IoSUZYX0ZvbnRNZ3IgKnBGb250TWdyKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0RGVmRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJU2V0U3R5bGVTaGVldChGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLCBJRkRFX0NTU1N0eWxlU2hlZXQgKnBTaGVldCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCVNldFN0eWxlU2hlZXRzKEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsIGNvbnN0IENGREVfQ1NTU3R5bGVTaGVldEFycmF5ICpwQXJyYXkpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRTdHlsZVByaW9yaXR5KEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsIEZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFkgZVByaW9yaXR5KSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJVXBkYXRlU3R5bGVJbmRleChGWF9EV09SRCBkd01lZGlhTGlzdCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfQ1NTQWNjZWxlcmF0b3IqCUluaXRBY2NlbGVyYXRvcigpID0gMDsNCi0gICAgdmlydHVhbCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqCUNyZWF0ZUNvbXB1dGVkU3R5bGUoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwUGFyZW50U3R5bGUpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCU1hdGNoRGVjbGFyYXRpb25zKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcsIENGREVfQ1NTRGVjbGFyYXRpb25BcnJheSAmbWF0Y2hlZERlY2xzLCBGREVfQ1NTUEVSU1VETyBlUGVyc3Vkb1R5cGUgPSBGREVfQ1NTUEVSU1VET19OT05FKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJQ29tcHV0ZVN0eWxlKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcsIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24gKipwcERlY2xBcnJheSwgaW50MzJfdCBpRGVjbENvdW50LCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBEZXN0U3R5bGUpID0gMDsNCitjbGFzcyBJRkRFX0NTU1N0eWxlU2VsZWN0b3Igew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9DU1NTdHlsZVNlbGVjdG9yKiBDcmVhdGUoKTsNCisgIHZpcnR1YWwgfklGREVfQ1NTU3R5bGVTZWxlY3RvcigpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250TWdyKElGWF9Gb250TWdyKiBwRm9udE1ncikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldERlZkZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFN0eWxlU2hlZXQoRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTU3R5bGVTaGVldCogcFNoZWV0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0U3R5bGVTaGVldHMoRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheSogcEFycmF5KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0U3R5bGVQcmlvcml0eShGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWSBlUHJpb3JpdHkpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVTdHlsZUluZGV4KEZYX0RXT1JEIGR3TWVkaWFMaXN0KSA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTQWNjZWxlcmF0b3IqIEluaXRBY2NlbGVyYXRvcigpID0gMDsNCisgIHZpcnR1YWwgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBDcmVhdGVDb21wdXRlZFN0eWxlKA0KKyAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgTWF0Y2hEZWNsYXJhdGlvbnMoDQorICAgICAgSUZERV9DU1NUYWdQcm92aWRlciogcFRhZywNCisgICAgICBDRkRFX0NTU0RlY2xhcmF0aW9uQXJyYXkmIG1hdGNoZWREZWNscywNCisgICAgICBGREVfQ1NTUEVSU1VETyBlUGVyc3Vkb1R5cGUgPSBGREVfQ1NTUEVSU1VET19OT05FKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQ29tcHV0ZVN0eWxlKElGREVfQ1NTVGFnUHJvdmlkZXIqIHBUYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKiBwcERlY2xBcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGVjbENvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBEZXN0U3R5bGUpID0gMDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2ltZy5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfaW1nLmgKaW5kZXggZjVmZmRhNi4uOTU3NjhmYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfaW1nLmgKKysrIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfaW1nLmgKQEAgLTcsNzEgKzcsNzkgQEAKICNpZm5kZWYgX0ZERV9JTUFHRQ0KICNkZWZpbmUgX0ZERV9JTUFHRQ0KIGNsYXNzIElGREVfSW1hZ2U7DQotI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfVW5rbm93bgkJLTENCi0jZGVmaW5lIEZERV9JTUFHRUZPUk1BVF9CTVAJCQkwDQotI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfR0lGCQkJMQ0KLSNkZWZpbmUgRkRFX0lNQUdFRk9STUFUX0pQRUcJCTINCi0jZGVmaW5lIEZERV9JTUFHRUZPUk1BVF9QTkcJCQkzDQotI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfVElGRgkJNA0KLSNkZWZpbmUgRkRFX0lNQUdFRk9STUFUX0pQRUcyMDAwCTUNCi0jZGVmaW5lIEZERV9JTUFHRUZPUk1BVF9KQmlnMgkJNg0KLWNsYXNzIElGREVfSW1hZ2UNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZERV9JbWFnZSoJCUNyZWF0ZShJRlhfU3RyZWFtICpwU3RyZWFtLCBpbnQzMl90IGlGb3JtYXQgPSBGREVfSU1BR0VGT1JNQVRfVW5rbm93bik7DQotICAgIHZpcnR1YWwgfklGREVfSW1hZ2UoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlMb2FkSW1hZ2UoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCUZyZWVJbWFnZSgpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlDb3VudEZyYW1lcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJTG9hZEZyYW1lKGludDMyX3QgaW5kZXgpID0gMDsNCi0gICAgdmlydHVhbCBDRlhfRElCaXRtYXAqCUdldEZyYW1lSW1hZ2UoKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0SW1hZ2VGb3JtYXQoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0SW1hZ2VXaWR0aCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRJbWFnZUhlaWdodCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXREZWxheVRpbWUoaW50MzJfdCBpRnJhbWVJbmRleCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldExvb3BDb3VudCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU3RhcnRMb2FkSW1hZ2UoQ0ZYX0RJQml0bWFwICpwRElCaXRtYXAsIGludDMyX3QgZGliWCwgaW50MzJfdCBkaWJZLCBpbnQzMl90IGRpYkNYLCBpbnQzMl90IGRpYkNZLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGltZ1gsIGludDMyX3QgaW1nWSwgaW50MzJfdCBpbWdDWCwgaW50MzJfdCBpbWdDWSwgaW50MzJfdCBpRnJhbWVJbmRleCA9IDApID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlEb0xvYWRJbWFnZShJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU3RvcExvYWRJbWFnZSgpID0gMDsNCisjZGVmaW5lIEZERV9JTUFHRUZPUk1BVF9Vbmtub3duIC0xDQorI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfQk1QIDANCisjZGVmaW5lIEZERV9JTUFHRUZPUk1BVF9HSUYgMQ0KKyNkZWZpbmUgRkRFX0lNQUdFRk9STUFUX0pQRUcgMg0KKyNkZWZpbmUgRkRFX0lNQUdFRk9STUFUX1BORyAzDQorI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfVElGRiA0DQorI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfSlBFRzIwMDAgNQ0KKyNkZWZpbmUgRkRFX0lNQUdFRk9STUFUX0pCaWcyIDYNCitjbGFzcyBJRkRFX0ltYWdlIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfSW1hZ2UqIENyZWF0ZShJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGb3JtYXQgPSBGREVfSU1BR0VGT1JNQVRfVW5rbm93bik7DQorICB2aXJ0dWFsIH5JRkRFX0ltYWdlKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRJbWFnZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBGcmVlSW1hZ2UoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRGcmFtZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZEZyYW1lKGludDMyX3QgaW5kZXgpID0gMDsNCisgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRGcmFtZUltYWdlKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEltYWdlRm9ybWF0KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEltYWdlV2lkdGgoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SW1hZ2VIZWlnaHQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGVsYXlUaW1lKGludDMyX3QgaUZyYW1lSW5kZXgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMb29wQ291bnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnRMb2FkSW1hZ2UoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaWJYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGliWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpYkNYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGliQ1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbWdYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW1nWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGltZ0NYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW1nQ1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRnJhbWVJbmRleCA9IDApID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBEb0xvYWRJbWFnZShJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTdG9wTG9hZEltYWdlKCkgPSAwOw0KIH07DQotI2RlZmluZSBGREVfSU1BR0VGSUxURVJfVW5rbm93bgkJCQktMQ0KLSNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX09wYWNpdHkJCQkJMA0KLSNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX0dyYXlTY2FsZQkJCTENCi0jZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9CbGFja1doaXRlCQkJMg0KLSNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX0ludmVydENvbG9yCQkJMw0KLSNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX1RyYW5zcGFyZW50Q29sb3IJNA0KLSNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX01hc2tDb2xvcgkJCTUNCi0jZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9CcmlnaHRuZXNzCQkJNg0KLSNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX0NvbnRyYXN0CQkJNw0KKyNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX1Vua25vd24gLTENCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9PcGFjaXR5IDANCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9HcmF5U2NhbGUgMQ0KKyNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX0JsYWNrV2hpdGUgMg0KKyNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX0ludmVydENvbG9yIDMNCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9UcmFuc3BhcmVudENvbG9yIDQNCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9NYXNrQ29sb3IgNQ0KKyNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX0JyaWdodG5lc3MgNg0KKyNkZWZpbmUgRkRFX0lNQUdFRklMVEVSX0NvbnRyYXN0IDcNCiB0eXBlZGVmIHN0cnVjdCBfRkRFX0lNQUdFRklMVEVSUEFSQU1TIDogcHVibGljIENGWF9UYXJnZXQgew0KLSAgICBpbnQzMl90CWlGaWx0ZXJUeXBlOw0KLX0gRkRFX0lNQUdFRklMVEVSUEFSQU1TLCAqIEZERV9MUElNQUdFRklMVEVSUEFSQU1TOw0KLXR5cGVkZWYgRkRFX0lNQUdFRklMVEVSUEFSQU1TIGNvbnN0ICogRkRFX0xQQ0lNQUdFRklMVEVSUEFSQU1TOw0KKyAgaW50MzJfdCBpRmlsdGVyVHlwZTsNCit9IEZERV9JTUFHRUZJTFRFUlBBUkFNUywgKkZERV9MUElNQUdFRklMVEVSUEFSQU1TOw0KK3R5cGVkZWYgRkRFX0lNQUdFRklMVEVSUEFSQU1TIGNvbnN0KiBGREVfTFBDSU1BR0VGSUxURVJQQVJBTVM7DQogdHlwZWRlZiBzdHJ1Y3QgX0ZERV9PUEFDSVRZUEFSQU1TIDogcHVibGljIEZERV9JTUFHRUZJTFRFUlBBUkFNUyB7DQotICAgIGludDMyX3QJaU9wYWNpdHk7DQotfSBGREVfT1BBQ0lUWVBBUkFNUywgKiBGREVfTFBPUEFDSVRZUEFSQU1TOw0KLXR5cGVkZWYgRkRFX09QQUNJVFlQQVJBTVMgY29uc3QgKiBGREVfTFBDT1BBQ0lUWVBBUkFNUzsNCisgIGludDMyX3QgaU9wYWNpdHk7DQorfSBGREVfT1BBQ0lUWVBBUkFNUywgKkZERV9MUE9QQUNJVFlQQVJBTVM7DQordHlwZWRlZiBGREVfT1BBQ0lUWVBBUkFNUyBjb25zdCogRkRFX0xQQ09QQUNJVFlQQVJBTVM7DQogdHlwZWRlZiBzdHJ1Y3QgX0ZERV9CTEFDS1dISVRFUEFSQU1TIDogcHVibGljIEZERV9JTUFHRUZJTFRFUlBBUkFNUyB7DQotICAgIEZYX0FSR0IJCWR3QmxhY2tDb2xvcjsNCi0gICAgRlhfQVJHQgkJZHdXaGl0ZUNvbG9yOw0KLX0gRkRFX0JMQUNLV0hJVEVQQVJBTVMsICogRkRFX0xQQkxBQ0tXSElURVBBUkFNUzsNCi10eXBlZGVmIEZERV9CTEFDS1dISVRFUEFSQU1TIGNvbnN0ICogRkRFX0xQQ0JMQUNLV0hJVEVQQVJBTVM7DQorICBGWF9BUkdCIGR3QmxhY2tDb2xvcjsNCisgIEZYX0FSR0IgZHdXaGl0ZUNvbG9yOw0KK30gRkRFX0JMQUNLV0hJVEVQQVJBTVMsICpGREVfTFBCTEFDS1dISVRFUEFSQU1TOw0KK3R5cGVkZWYgRkRFX0JMQUNLV0hJVEVQQVJBTVMgY29uc3QqIEZERV9MUENCTEFDS1dISVRFUEFSQU1TOw0KIHR5cGVkZWYgc3RydWN0IF9GREVfVFJBTlNQQVJFTlRQQVJBTVMgOiBwdWJsaWMgRkRFX0lNQUdFRklMVEVSUEFSQU1TIHsNCi0gICAgRlhfQVJHQgkJY29sb3I7DQotfSBGREVfVFJBTlNQQVJFTlRQQVJBTVMsICogRkRFX0xQVFJBTlNQQVJFTlRQQVJBTVM7DQotdHlwZWRlZiBGREVfVFJBTlNQQVJFTlRQQVJBTVMgY29uc3QgKiBGREVfTFBDVFJBTlNQQVJFTlRQQVJBTVM7DQorICBGWF9BUkdCIGNvbG9yOw0KK30gRkRFX1RSQU5TUEFSRU5UUEFSQU1TLCAqRkRFX0xQVFJBTlNQQVJFTlRQQVJBTVM7DQordHlwZWRlZiBGREVfVFJBTlNQQVJFTlRQQVJBTVMgY29uc3QqIEZERV9MUENUUkFOU1BBUkVOVFBBUkFNUzsNCiB0eXBlZGVmIHN0cnVjdCBfRkRFX01BU0tDT0xPUlBBUkFNUyA6IHB1YmxpYyBGREVfSU1BR0VGSUxURVJQQVJBTVMgew0KLSAgICBGWF9BUkdCCQljb2xvcjsNCi19IEZERV9NQVNLQ09MT1JQQVJBTVMsICogRkRFX0xQTUFTS0NPTE9SUEFSQU1TOw0KLXR5cGVkZWYgRkRFX01BU0tDT0xPUlBBUkFNUyBjb25zdCAqIEZERV9MUENNQVNLQ09MT1JQQVJBTVM7DQorICBGWF9BUkdCIGNvbG9yOw0KK30gRkRFX01BU0tDT0xPUlBBUkFNUywgKkZERV9MUE1BU0tDT0xPUlBBUkFNUzsNCit0eXBlZGVmIEZERV9NQVNLQ09MT1JQQVJBTVMgY29uc3QqIEZERV9MUENNQVNLQ09MT1JQQVJBTVM7DQogdHlwZWRlZiBzdHJ1Y3QgX0ZERV9CUklHSFRORVNTUEFSQU1TIDogcHVibGljIEZERV9JTUFHRUZJTFRFUlBBUkFNUyB7DQotICAgIGludDMyX3QJaUJyaWdodG5lc3M7DQotfSBGREVfQlJJR0hUTkVTU1BBUkFNUywgKiBGREVfTFBCUklHSFRORVNTUEFSQU1TOw0KLXR5cGVkZWYgRkRFX0JSSUdIVE5FU1NQQVJBTVMgY29uc3QgKiBGREVfTFBDQlJJR0hUTkVTU1BBUkFNUzsNCisgIGludDMyX3QgaUJyaWdodG5lc3M7DQorfSBGREVfQlJJR0hUTkVTU1BBUkFNUywgKkZERV9MUEJSSUdIVE5FU1NQQVJBTVM7DQordHlwZWRlZiBGREVfQlJJR0hUTkVTU1BBUkFNUyBjb25zdCogRkRFX0xQQ0JSSUdIVE5FU1NQQVJBTVM7DQogdHlwZWRlZiBzdHJ1Y3QgX0ZERV9DT05UUkFTVFBBUkFNUyA6IHB1YmxpYyBGREVfSU1BR0VGSUxURVJQQVJBTVMgew0KLSAgICBpbnQzMl90CWlDb250cmFzdDsNCi19IEZERV9DT05UUkFTVFBBUkFNUywgKiBGREVfTFBDT05UUkFTVFBBUkFNUzsNCi10eXBlZGVmIEZERV9DT05UUkFTVFBBUkFNUyBjb25zdCAqIEZERV9MUENDT05UUkFTVFBBUkFNUzsNCisgIGludDMyX3QgaUNvbnRyYXN0Ow0KK30gRkRFX0NPTlRSQVNUUEFSQU1TLCAqRkRFX0xQQ09OVFJBU1RQQVJBTVM7DQordHlwZWRlZiBGREVfQ09OVFJBU1RQQVJBTVMgY29uc3QqIEZERV9MUENDT05UUkFTVFBBUkFNUzsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9tZW0uaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX21lbS5oCmluZGV4IDI3YzZhMjkuLmQxNmJiNTMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX21lbS5oCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX21lbS5oCkBAIC0xMiwxMiArMTIsMTIgQEAKICNpZmRlZiBfX2NwbHVzcGx1cw0KIGV4dGVybiAiQyIgew0KICNlbmRpZg0KLSNkZWZpbmUgRkRFX0FsbG9jKHNpemUpICAgICAgICAgICAgIEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpDQotI2RlZmluZSBGREVfUmVhbGxvYyhwdHIsIG5ld1NpemUpICAgRlhfUmVhbGxvYyh1aW50OF90LCBwdHIsIG5ld1NpemUpDQotI2RlZmluZSBGREVfRnJlZShwdHIpICAgICAgICAgICAgICAgRlhfRnJlZShwdHIpDQorI2RlZmluZSBGREVfQWxsb2Moc2l6ZSkgRlhfQWxsb2ModWludDhfdCwgc2l6ZSkNCisjZGVmaW5lIEZERV9SZWFsbG9jKHB0ciwgbmV3U2l6ZSkgRlhfUmVhbGxvYyh1aW50OF90LCBwdHIsIG5ld1NpemUpDQorI2RlZmluZSBGREVfRnJlZShwdHIpIEZYX0ZyZWUocHRyKQ0KICNpZmRlZiBfX2NwbHVzcGx1cw0KIH0NCi0jZGVmaW5lIEZERV9OZXdXaXRoICAgICBGWFRBUkdFVF9OZXdXaXRoDQotI2RlZmluZSBGREVfRGVsZXRlV2l0aCAgRlhUQVJHRVRfRGVsZXRlV2l0aA0KKyNkZWZpbmUgRkRFX05ld1dpdGggRlhUQVJHRVRfTmV3V2l0aA0KKyNkZWZpbmUgRkRFX0RlbGV0ZVdpdGggRlhUQVJHRVRfRGVsZXRlV2l0aA0KICNlbmRpZg0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Blbi5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcGVuLmgKaW5kZXggMzBmMDZhYi4uMTJjZWIzMiAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcGVuLmgKKysrIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcGVuLmgKQEAgLTcsNTcgKzcsNTggQEAKICNpZm5kZWYgX0ZERV9QRU4NCiAjZGVmaW5lIF9GREVfUEVODQogY2xhc3MgSUZERV9QZW47DQotI2RlZmluZSBGREVfUEVOVFlQRV9Vbmtub3duCQkJCUZERV9CUlVTSFRZUEVfVW5rbm93bg0KLSNkZWZpbmUgRkRFX1BFTlRZUEVfU29saWRDb2xvcgkJCUZERV9CUlVTSFRZUEVfU29saWQNCi0jZGVmaW5lIEZERV9QRU5UWVBFX0hhdGNoQnJ1c2gJCQlGREVfQlJVU0hUWVBFX0hhdGNoDQotI2RlZmluZSBGREVfUEVOVFlQRV9UZXh0dXJlQnJ1c2gJCUZERV9CUlVTSFRZUEVfVGV4dHVyZQ0KLSNkZWZpbmUgRkRFX1BFTlRZUEVfTGluZWFyR3JhZGllbnQJCUZERV9CUlVTSFRZUEVfTGluZWFyR3JhZGllbnQNCi0jZGVmaW5lIEZERV9QRU5UWVBFX01BWAkJCQkJRkRFX0JSVVNIVFlQRV9NQVgNCi0jZGVmaW5lIEZERV9EQVNIU1RZTEVfU29saWQJCQkwDQotI2RlZmluZSBGREVfREFTSFNUWUxFX0Rhc2gJCQkxDQotI2RlZmluZSBGREVfREFTSFNUWUxFX0RvdAkJCTINCi0jZGVmaW5lIEZERV9EQVNIU1RZTEVfRGFzaERvdAkJMw0KLSNkZWZpbmUgRkRFX0RBU0hTVFlMRV9EYXNoRG90RG90CTQNCi0jZGVmaW5lIEZERV9EQVNIU1RZTEVfQ3VzdG9taXplZAk1DQotI2RlZmluZSBGREVfTElORUpPSU5fTWl0ZXIJCQkwDQotI2RlZmluZSBGREVfTElORUpPSU5fUm91bmQJCQkxDQotI2RlZmluZSBGREVfTElORUpPSU5fQmV2ZWwJCQkyDQotI2RlZmluZSBGREVfTElORUNBUF9GbGF0CQkJMA0KLSNkZWZpbmUgRkRFX0xJTkVDQVBfUm91bmQJCQkxDQotI2RlZmluZSBGREVfTElORUNBUF9TcXVhcmUJCQkyDQorI2RlZmluZSBGREVfUEVOVFlQRV9Vbmtub3duIEZERV9CUlVTSFRZUEVfVW5rbm93bg0KKyNkZWZpbmUgRkRFX1BFTlRZUEVfU29saWRDb2xvciBGREVfQlJVU0hUWVBFX1NvbGlkDQorI2RlZmluZSBGREVfUEVOVFlQRV9IYXRjaEJydXNoIEZERV9CUlVTSFRZUEVfSGF0Y2gNCisjZGVmaW5lIEZERV9QRU5UWVBFX1RleHR1cmVCcnVzaCBGREVfQlJVU0hUWVBFX1RleHR1cmUNCisjZGVmaW5lIEZERV9QRU5UWVBFX0xpbmVhckdyYWRpZW50IEZERV9CUlVTSFRZUEVfTGluZWFyR3JhZGllbnQNCisjZGVmaW5lIEZERV9QRU5UWVBFX01BWCBGREVfQlJVU0hUWVBFX01BWA0KKyNkZWZpbmUgRkRFX0RBU0hTVFlMRV9Tb2xpZCAwDQorI2RlZmluZSBGREVfREFTSFNUWUxFX0Rhc2ggMQ0KKyNkZWZpbmUgRkRFX0RBU0hTVFlMRV9Eb3QgMg0KKyNkZWZpbmUgRkRFX0RBU0hTVFlMRV9EYXNoRG90IDMNCisjZGVmaW5lIEZERV9EQVNIU1RZTEVfRGFzaERvdERvdCA0DQorI2RlZmluZSBGREVfREFTSFNUWUxFX0N1c3RvbWl6ZWQgNQ0KKyNkZWZpbmUgRkRFX0xJTkVKT0lOX01pdGVyIDANCisjZGVmaW5lIEZERV9MSU5FSk9JTl9Sb3VuZCAxDQorI2RlZmluZSBGREVfTElORUpPSU5fQmV2ZWwgMg0KKyNkZWZpbmUgRkRFX0xJTkVDQVBfRmxhdCAwDQorI2RlZmluZSBGREVfTElORUNBUF9Sb3VuZCAxDQorI2RlZmluZSBGREVfTElORUNBUF9TcXVhcmUgMg0KIHR5cGVkZWYgc3RydWN0IF9GREVfQ09NUE9VTkRQQVRURVJOIHsNCi0gICAgRlhfRkxPQVQJcG9zOw0KLSAgICBGWF9GTE9BVAl3aWR0aDsNCi19IEZERV9DT01QT1VORFBBVFRFUk4sICogRkRFX0xQQ09NUE9VTkRQQVRURVJOOw0KLXR5cGVkZWYgRkRFX0NPTVBPVU5EUEFUVEVSTiBjb25zdCAqCQkJCUZERV9MUENDT01QT1VORFBBVFRFUk47DQotdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxGREVfQ09NUE9VTkRQQVRURVJOPglDRkRFX0NvbXBvdW5kUGF0dGVybnM7DQorICBGWF9GTE9BVCBwb3M7DQorICBGWF9GTE9BVCB3aWR0aDsNCit9IEZERV9DT01QT1VORFBBVFRFUk4sICpGREVfTFBDT01QT1VORFBBVFRFUk47DQordHlwZWRlZiBGREVfQ09NUE9VTkRQQVRURVJOIGNvbnN0KiBGREVfTFBDQ09NUE9VTkRQQVRURVJOOw0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RkRFX0NPTVBPVU5EUEFUVEVSTj4gQ0ZERV9Db21wb3VuZFBhdHRlcm5zOw0KIA0KLWNsYXNzIElGREVfUGVuDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGREVfUGVuKgkJCUNyZWF0ZSgpOw0KLSAgICB2aXJ0dWFsIH5JRkRFX1BlbigpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRUeXBlKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJR2V0Q29sb3IoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRDb2xvcihGWF9BUkdCIGNvbG9yKSA9IDA7DQotICAgIHZpcnR1YWwgSUZERV9CcnVzaCoJCQlHZXRCcnVzaCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldEJydXNoKElGREVfQnJ1c2ggKnBCcnVzaCwgRlhfQk9PTCBiQXV0b1JlbGVhc2UpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0TGluZUNhcCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldExpbmVDYXAoaW50MzJfdCBpTGluZUNhcCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXREYXNoU3R5bGUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXREYXNoU3R5bGUoaW50MzJfdCBpRGFzaFN0eWxlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXREYXNoUGhhc2UoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXREYXNoUGhhc2UoRlhfRkxPQVQgZlBoYXNlKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUNvdW50RGFzaEFycmF5KCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXREYXNoQXJyYXkoQ0ZYX0Zsb2F0QXJyYXkgJmRhc2hBcnJheSkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0RGFzaEFycmF5KGNvbnN0IENGWF9GbG9hdEFycmF5ICZkYXNoQXJyYXkpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0TGluZUpvaW4oKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRMaW5lSm9pbihpbnQzMl90IGlMaW5lSm9pbikgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TWl0ZXJMaW1pdCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldE1pdGVyTGltaXQoRlhfRkxPQVQgZk1pdGVyTGltaXQpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJQ291bnRDb21wb3VuZFBhdHRlcm5zKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJR2V0Q29tcG91bmRQYXR0ZXJucyhDRkRFX0NvbXBvdW5kUGF0dGVybnMgJmNvbXBvdW5kUGF0dGVybnMpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCVNldENvbXBvdW5kUGF0dGVybnMoY29uc3QgQ0ZERV9Db21wb3VuZFBhdHRlcm5zICZjb21wb3VuZFBhdHRlcm5zKSA9IDA7DQorY2xhc3MgSUZERV9QZW4gew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9QZW4qIENyZWF0ZSgpOw0KKyAgdmlydHVhbCB+SUZERV9QZW4oKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VHlwZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRDb2xvcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDb2xvcihGWF9BUkdCIGNvbG9yKSA9IDA7DQorICB2aXJ0dWFsIElGREVfQnJ1c2gqIEdldEJydXNoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEJydXNoKElGREVfQnJ1c2gqIHBCcnVzaCwgRlhfQk9PTCBiQXV0b1JlbGVhc2UpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMaW5lQ2FwKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVDYXAoaW50MzJfdCBpTGluZUNhcCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldERhc2hTdHlsZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXREYXNoU3R5bGUoaW50MzJfdCBpRGFzaFN0eWxlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldERhc2hQaGFzZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXREYXNoUGhhc2UoRlhfRkxPQVQgZlBoYXNlKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnREYXNoQXJyYXkoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGFzaEFycmF5KENGWF9GbG9hdEFycmF5JiBkYXNoQXJyYXkpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXREYXNoQXJyYXkoY29uc3QgQ0ZYX0Zsb2F0QXJyYXkmIGRhc2hBcnJheSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExpbmVKb2luKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVKb2luKGludDMyX3QgaUxpbmVKb2luKSA9IDA7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldE1pdGVyTGltaXQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TWl0ZXJMaW1pdChGWF9GTE9BVCBmTWl0ZXJMaW1pdCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50Q29tcG91bmRQYXR0ZXJucygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDb21wb3VuZFBhdHRlcm5zKA0KKyAgICAgIENGREVfQ29tcG91bmRQYXR0ZXJucyYgY29tcG91bmRQYXR0ZXJucykgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldENvbXBvdW5kUGF0dGVybnMoDQorICAgICAgY29uc3QgQ0ZERV9Db21wb3VuZFBhdHRlcm5zJiBjb21wb3VuZFBhdHRlcm5zKSA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9wc3IuaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Bzci5oCmluZGV4IDEyMWI4OGIuLjc0MWNhNGMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Bzci5oCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Bzci5oCkBAIC03LDkwICs3LDk5IEBACiAjaWZuZGVmIF9GREVfUEFSU0VSDQogI2RlZmluZSBfRkRFX1BBUlNFUg0KIGVudW0gRkRFX1ZJU1VBTE9CSlRZUEUgew0KLSAgICBGREVfVklTVUFMT0JKX0NhbnZhcwk9ICAweDAwLA0KLSAgICBGREVfVklTVUFMT0JKX1RleHQJCT0gIDB4MDEJLA0KLSAgICBGREVfVklTVUFMT0JKX0ltYWdlCQk9ICAweDAyCSwNCi0gICAgRkRFX1ZJU1VBTE9CSl9QYXRoCQk9ICAweDA0CSwNCi0gICAgRkRFX1ZJU1VBTE9CSl9XaWRnZXQJPSAgMHgwOAksDQorICBGREVfVklTVUFMT0JKX0NhbnZhcyA9IDB4MDAsDQorICBGREVfVklTVUFMT0JKX1RleHQgPSAweDAxLA0KKyAgRkRFX1ZJU1VBTE9CSl9JbWFnZSA9IDB4MDIsDQorICBGREVfVklTVUFMT0JKX1BhdGggPSAweDA0LA0KKyAgRkRFX1ZJU1VBTE9CSl9XaWRnZXQgPSAweDA4LA0KIH07DQotdHlwZWRlZiBzdHJ1Y3QgX0ZERV9IVklTVUFMT0JKIHsNCi0gICAgdm9pZCogcERhdGE7DQotfSBjb25zdCAqIEZERV9IVklTVUFMT0JKOw0KLWNsYXNzIElGREVfVmlzdWFsU2V0DQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZERV9WaXN1YWxTZXQoKSB7fQ0KLSAgICB2aXJ0dWFsIEZERV9WSVNVQUxPQkpUWVBFCUdldFR5cGUoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0QkJveChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJmJib3gpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRNYXRyaXgoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX01hdHJpeCAmbWF0cml4KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0UmVjdChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJnJ0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Q2xpcChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJnJ0KSA9IDA7DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9IVklTVUFMT0JKIHsgdm9pZCogcERhdGE7IH0gY29uc3QqIEZERV9IVklTVUFMT0JKOw0KK2NsYXNzIElGREVfVmlzdWFsU2V0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9WaXN1YWxTZXQoKSB7fQ0KKyAgdmlydHVhbCBGREVfVklTVUFMT0JKVFlQRSBHZXRUeXBlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBiYm94KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0TWF0cml4KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9NYXRyaXgmIG1hdHJpeCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldFJlY3QoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBydCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldENsaXAoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBydCkgPSAwOw0KIH07DQotY2xhc3MgSUZERV9DYW52YXNTZXQgOiBwdWJsaWMgSUZERV9WaXN1YWxTZXQNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIEZYX1BPU0lUSU9OCQkJR2V0Rmlyc3RQb3NpdGlvbihGREVfSFZJU1VBTE9CSiBoQ2FudmFzKSA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0hWSVNVQUxPQkoJCUdldE5leHQoRkRFX0hWSVNVQUxPQkogaENhbnZhcywgRlhfUE9TSVRJT04gJnBvcywgSUZERV9WaXN1YWxTZXQgKiZwVmlzdWFsU2V0KSA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0hWSVNVQUxPQkoJCUdldFBhcmVudENhbnZhcyhGREVfSFZJU1VBTE9CSiBoQ2FudmFzLCBJRkRFX1Zpc3VhbFNldCAqJnBWaXN1YWxTZXQpID0gMDsNCitjbGFzcyBJRkRFX0NhbnZhc1NldCA6IHB1YmxpYyBJRkRFX1Zpc3VhbFNldCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRlhfUE9TSVRJT04gR2V0Rmlyc3RQb3NpdGlvbihGREVfSFZJU1VBTE9CSiBoQ2FudmFzKSA9IDA7DQorICB2aXJ0dWFsIEZERV9IVklTVUFMT0JKIEdldE5leHQoRkRFX0hWSVNVQUxPQkogaENhbnZhcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiYgcG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfVmlzdWFsU2V0KiYgcFZpc3VhbFNldCkgPSAwOw0KKyAgdmlydHVhbCBGREVfSFZJU1VBTE9CSiBHZXRQYXJlbnRDYW52YXMoRkRFX0hWSVNVQUxPQkogaENhbnZhcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfVmlzdWFsU2V0KiYgcFZpc3VhbFNldCkgPSAwOw0KIH07DQotY2xhc3MgSUZERV9UZXh0U2V0IDogcHVibGljIElGREVfVmlzdWFsU2V0DQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0U3RyaW5nKEZERV9IVklTVUFMT0JKIGhUZXh0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQkJR2V0Rm9udChGREVfSFZJU1VBTE9CSiBoVGV4dCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0Rm9udFNpemUoRkRFX0hWSVNVQUxPQkogaFRleHQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCUdldEZvbnRDb2xvcihGREVfSFZJU1VBTE9CSiBoVGV4dCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXREaXNwbGF5UG9zKEZERV9IVklTVUFMT0JKIGhUZXh0LCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UsIENGWF9XaWRlU3RyaW5nICpwV1NGb3JtcyA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0Q2hhclJlY3RzKEZERV9IVklTVUFMT0JKIGhUZXh0LCBDRlhfUmVjdEZBcnJheSAmcnRBcnJheSkgPSAwOw0KK2NsYXNzIElGREVfVGV4dFNldCA6IHB1YmxpYyBJRkRFX1Zpc3VhbFNldCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRTdHJpbmcoRkRFX0hWSVNVQUxPQkogaFRleHQsIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnQoRkRFX0hWSVNVQUxPQkogaFRleHQpID0gMDsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0Rm9udFNpemUoRkRFX0hWSVNVQUxPQkogaFRleHQpID0gMDsNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRGb250Q29sb3IoRkRFX0hWSVNVQUxPQkogaFRleHQpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXREaXNwbGF5UG9zKEZERV9IVklTVUFMT0JKIGhUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBwV1NGb3JtcyA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyUmVjdHMoRkRFX0hWSVNVQUxPQkogaFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RkFycmF5JiBydEFycmF5KSA9IDA7DQogfTsNCi1jbGFzcyBJRkRFX0ltYWdlU2V0IDogcHVibGljIElGREVfVmlzdWFsU2V0DQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCBJRkRFX0ltYWdlKgkJCQkJR2V0SW1hZ2UoRkRFX0hWSVNVQUxPQkogaEltYWdlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfUE9TSVRJT04JCQkJCUdldEZpcnN0RmlsdGVyUG9zaXRpb24oRkRFX0hWSVNVQUxPQkogaEltYWdlKSA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0xQQ0lNQUdFRklMVEVSUEFSQU1TCUdldE5leHRGaWx0ZXIoRkRFX0hWSVNVQUxPQkogaEltYWdlLCBGWF9QT1NJVElPTiAmcG9zKSA9IDA7DQorY2xhc3MgSUZERV9JbWFnZVNldCA6IHB1YmxpYyBJRkRFX1Zpc3VhbFNldCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgSUZERV9JbWFnZSogR2V0SW1hZ2UoRkRFX0hWSVNVQUxPQkogaEltYWdlKSA9IDA7DQorICB2aXJ0dWFsIEZYX1BPU0lUSU9OIEdldEZpcnN0RmlsdGVyUG9zaXRpb24oRkRFX0hWSVNVQUxPQkogaEltYWdlKSA9IDA7DQorICB2aXJ0dWFsIEZERV9MUENJTUFHRUZJTFRFUlBBUkFNUyBHZXROZXh0RmlsdGVyKEZERV9IVklTVUFMT0JKIGhJbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUE9TSVRJT04mIHBvcykgPSAwOw0KIH07DQotI2RlZmluZSBGREVfRklMTE1PREVfQWx0ZXJuYXRlCQkxDQotI2RlZmluZSBGREVfRklMTE1PREVfV2luZGluZwkJMg0KLSNkZWZpbmUgRkRFX1BBVEhSRU5ERVJfU3Ryb2tlCQkxDQotI2RlZmluZSBGREVfUEFUSFJFTkRFUl9GaWxsCQkJMg0KLSNkZWZpbmUgRkRFX1BBVEhSRU5ERVJfRmlsbFN0cm9rZQkzDQotY2xhc3MgSUZERV9QYXRoU2V0IDogcHVibGljIElGREVfVmlzdWFsU2V0DQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCBJRkRFX1BhdGgqCQlHZXRQYXRoKEZERV9IVklTVUFMT0JKIGhQYXRoKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0RmlsbE1vZGUoRkRFX0hWSVNVQUxPQkogaFBhdGgpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRSZW5kZXJNb2RlKEZERV9IVklTVUFMT0JKIGhQYXRoKSA9IDA7DQotICAgIHZpcnR1YWwgSUZERV9QZW4qCQlHZXRQZW4oRkRFX0hWSVNVQUxPQkogaFBhdGgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9GTE9BVAkJR2V0UGVuV2lkdGgoRkRFX0hWSVNVQUxPQkogaFBhdGgpID0gMDsNCi0gICAgdmlydHVhbCBJRkRFX0JydXNoKgkJR2V0QnJ1c2goRkRFX0hWSVNVQUxPQkogaFBhdGgpID0gMDsNCisjZGVmaW5lIEZERV9GSUxMTU9ERV9BbHRlcm5hdGUgMQ0KKyNkZWZpbmUgRkRFX0ZJTExNT0RFX1dpbmRpbmcgMg0KKyNkZWZpbmUgRkRFX1BBVEhSRU5ERVJfU3Ryb2tlIDENCisjZGVmaW5lIEZERV9QQVRIUkVOREVSX0ZpbGwgMg0KKyNkZWZpbmUgRkRFX1BBVEhSRU5ERVJfRmlsbFN0cm9rZSAzDQorY2xhc3MgSUZERV9QYXRoU2V0IDogcHVibGljIElGREVfVmlzdWFsU2V0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBJRkRFX1BhdGgqIEdldFBhdGgoRkRFX0hWSVNVQUxPQkogaFBhdGgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRGaWxsTW9kZShGREVfSFZJU1VBTE9CSiBoUGF0aCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFJlbmRlck1vZGUoRkRFX0hWSVNVQUxPQkogaFBhdGgpID0gMDsNCisgIHZpcnR1YWwgSUZERV9QZW4qIEdldFBlbihGREVfSFZJU1VBTE9CSiBoUGF0aCkgPSAwOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRQZW5XaWR0aChGREVfSFZJU1VBTE9CSiBoUGF0aCkgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0JydXNoKiBHZXRCcnVzaChGREVfSFZJU1VBTE9CSiBoUGF0aCkgPSAwOw0KIH07DQogZW51bSBGREVfV0lER0VUT0JKIHsNCi0gICAgRkRFX1dJREdFVE9CSl9Vbmtub3duCQk9CTB4MDAwMCwNCi0gICAgRkRFX1dJREdFVE9CSl9BbmNob3IJCT0JMHgwMTAwLA0KLSAgICBGREVfV0lER0VUT0JKX05hbWVkRGVzdAkJPQkweDAyMDAsDQotICAgIEZERV9XSURHRVRPQkpfSHlwZXJMaW5rCQk9CTB4MDQwMCwNCisgIEZERV9XSURHRVRPQkpfVW5rbm93biA9IDB4MDAwMCwNCisgIEZERV9XSURHRVRPQkpfQW5jaG9yID0gMHgwMTAwLA0KKyAgRkRFX1dJREdFVE9CSl9OYW1lZERlc3QgPSAweDAyMDAsDQorICBGREVfV0lER0VUT0JKX0h5cGVyTGluayA9IDB4MDQwMCwNCiB9Ow0KLSNkZWZpbmUgRkRFX1dJREdFVFBBUkFNX1VyaQkJMQ0KLSNkZWZpbmUgRkRFX1dJREdFVFBBUkFNX1JlY3RzCTINCi1jbGFzcyBJRkRFX1dpZGdldFNldCA6IHB1YmxpYyBJRkRFX1Zpc3VhbFNldA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRkRFX1dJREdFVE9CSglHZXRXaWRnZXRUeXBlKEZERV9IVklTVUFMT0JKIGhXaWRnZXQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9GTE9BVAkJR2V0RmxvYXQoRkRFX0hWSVNVQUxPQkogaFdpZGdldCwgaW50MzJfdCBpUGFyYW1ldGVyLCBGWF9GTE9BVCBmRGVmVmFsID0gMC4wZikgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEludGVnZXIoRkRFX0hWSVNVQUxPQkogaFdpZGdldCwgaW50MzJfdCBpUGFyYW1ldGVyLCBpbnQzMl90IGlEZWZWYWwgPSAwKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldFN0cmluZyhGREVfSFZJU1VBTE9CSiBoV2lkZ2V0LCBpbnQzMl90IGlQYXJhbWV0ZXIsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldFJlY3RzKEZERV9IVklTVUFMT0JKIGhXaWRnZXQsIGludDMyX3QgaVBhcmFtZXRlciwgQ0ZYX1JlY3RGQXJyYXkgJnJlY3RzKSA9IDA7DQorI2RlZmluZSBGREVfV0lER0VUUEFSQU1fVXJpIDENCisjZGVmaW5lIEZERV9XSURHRVRQQVJBTV9SZWN0cyAyDQorY2xhc3MgSUZERV9XaWRnZXRTZXQgOiBwdWJsaWMgSUZERV9WaXN1YWxTZXQgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZERV9XSURHRVRPQkogR2V0V2lkZ2V0VHlwZShGREVfSFZJU1VBTE9CSiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZsb2F0KEZERV9IVklTVUFMT0JKIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhcmFtZXRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkRlZlZhbCA9IDAuMGYpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJbnRlZ2VyKEZERV9IVklTVUFMT0JKIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYXJhbWV0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWZWYWwgPSAwKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0U3RyaW5nKEZERV9IVklTVUFMT0JKIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhcmFtZXRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRSZWN0cyhGREVfSFZJU1VBTE9CSiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhcmFtZXRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEZBcnJheSYgcmVjdHMpID0gMDsNCiB9Ow0KLWNsYXNzIElGREVfVmlzdWFsU2V0SXRlcmF0b3INCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZERV9WaXN1YWxTZXRJdGVyYXRvcioJQ3JlYXRlKCk7DQotICAgIHZpcnR1YWwgfklGREVfVmlzdWFsU2V0SXRlcmF0b3IoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJQXR0YWNoQ2FudmFzKElGREVfQ2FudmFzU2V0ICpwQ2FudmFzKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJRmlsdGVyT2JqZWN0cyhGWF9EV09SRCBkd09iamVjdHMgPSAweEZGRkZGRkZGKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJUmVzZXQoKSA9IDA7DQotICAgIHZpcnR1YWwgRkRFX0hWSVNVQUxPQkoJCQlHZXROZXh0KElGREVfVmlzdWFsU2V0IComcFZpc3VhbFNldCwgRkRFX0hWSVNVQUxPQkogKnBoQ2FudmFzT2JqID0gTlVMTCwgSUZERV9DYW52YXNTZXQgKipwcENhbnZhc1NldCA9IE5VTEwpID0gMDsNCitjbGFzcyBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfVmlzdWFsU2V0SXRlcmF0b3IqIENyZWF0ZSgpOw0KKyAgdmlydHVhbCB+SUZERV9WaXN1YWxTZXRJdGVyYXRvcigpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBBdHRhY2hDYW52YXMoSUZERV9DYW52YXNTZXQqIHBDYW52YXMpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWx0ZXJPYmplY3RzKEZYX0RXT1JEIGR3T2JqZWN0cyA9IDB4RkZGRkZGRkYpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsNCisgIHZpcnR1YWwgRkRFX0hWSVNVQUxPQkogR2V0TmV4dChJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0hWSVNVQUxPQkoqIHBoQ2FudmFzT2JqID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NhbnZhc1NldCoqIHBwQ2FudmFzU2V0ID0gTlVMTCkgPSAwOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcHRoLmggYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9wdGguaAppbmRleCA1YWE5OTk3Li5iYTI1ZjVjIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9wdGguaAorKysgYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9wdGguaApAQCAtNywyNCArNywyNyBAQAogI2lmbmRlZiBfRkRFX1BBVEgNCiAjZGVmaW5lIF9GREVfUEFUSA0KIGNsYXNzIElGREVfUGF0aDsNCi1jbGFzcyBJRkRFX1BhdGgNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZERV9QYXRoKgkJQ3JlYXRlKCk7DQotICAgIHZpcnR1YWwgfklGREVfUGF0aCgpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVN0YXJ0RmlndXJlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlDbG9zZUZpZ3VyZSgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJQWRkQmV6aWVyKGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJQWRkQmV6aWVycyhjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFkZEN1cnZlKGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIEZYX0JPT0wgYkNsb3NlZCwgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFkZExpbmVzKGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJQWRkTGluZShjb25zdCBDRlhfUG9pbnRGICZwdDEsIGNvbnN0IENGWF9Qb2ludEYgJnB0MikgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlBZGRQYXRoKGNvbnN0IElGREVfUGF0aCAqcFNyYywgRlhfQk9PTCBiQ29ubmVjdCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlBZGRQb2x5Z29uKGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJQWRkUmVjdGFuZ2xlKGNvbnN0IENGWF9SZWN0RiAmcmVjdCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRCQm94KENGWF9SZWN0RiAmYmJveCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRCQm94KENGWF9SZWN0RiAmYmJveCwgRlhfRkxPQVQgZkxpbmVXaWR0aCwgRlhfRkxPQVQgZk1pdGVyTGltaXQpIGNvbnN0ID0gMDsNCitjbGFzcyBJRkRFX1BhdGggew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9QYXRoKiBDcmVhdGUoKTsNCisgIHZpcnR1YWwgfklGREVfUGF0aCgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTdGFydEZpZ3VyZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBDbG9zZUZpZ3VyZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBBZGRCZXppZXIoY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZEJlemllcnMoY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZEN1cnZlKGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xvc2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41ZikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkTGluZXMoY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZExpbmUoY29uc3QgQ0ZYX1BvaW50RiYgcHQxLCBjb25zdCBDRlhfUG9pbnRGJiBwdDIpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBBZGRQYXRoKGNvbnN0IElGREVfUGF0aCogcFNyYywgRlhfQk9PTCBiQ29ubmVjdCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZFBvbHlnb24oY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZFJlY3RhbmdsZShjb25zdCBDRlhfUmVjdEYmIHJlY3QpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRCQm94KENGWF9SZWN0RiYgYmJveCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldEJCb3goQ0ZYX1JlY3RGJiBiYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaXRlckxpbWl0KSBjb25zdCA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9yZHIuaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkci5oCmluZGV4IGFlZjQ1OWYuLjIyMGNjZjUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkci5oCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkci5oCkBAIC05LDI2ICs5LDI4IEBACiBjbGFzcyBJRkRFX1BhZ2U7DQogY2xhc3MgSUZERV9SZW5kZXJEZXZpY2U7DQogDQotdm9pZAlGREVfR2V0UGFnZU1hdHJpeChDRlhfTWF0cml4ICZwYWdlTWF0cml4LCBjb25zdCBDRlhfUmVjdEYgJmRvY1BhZ2VSZWN0LCBjb25zdCBDRlhfUmVjdCAmZGV2aWNlUGFnZVJlY3QsIGludDMyX3QgaVJvdGF0ZSwgRlhfRFdPUkQgZHdDb29yZGluYXRlc1R5cGUgPSAwKTsNCit2b2lkIEZERV9HZXRQYWdlTWF0cml4KENGWF9NYXRyaXgmIHBhZ2VNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIGRvY1BhZ2VSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3QmIGRldmljZVBhZ2VSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDb29yZGluYXRlc1R5cGUgPSAwKTsNCiBlbnVtIEZERV9SRU5ERVJTVEFUVVMgew0KLSAgICBGREVfUkVOREVSU1RBVFVTX1Jlc2V0CQk9ICAwLA0KLSAgICBGREVfUkVOREVSU1RBVFVTX1BhdXNlZAkJCSwNCi0gICAgRkRFX1JFTkRFUlNUQVRVU19Eb25lCQkJLA0KLSAgICBGREVfUkVOREVSU1RBVFVTX0ZhaWxlZAkJCSwNCisgIEZERV9SRU5ERVJTVEFUVVNfUmVzZXQgPSAwLA0KKyAgRkRFX1JFTkRFUlNUQVRVU19QYXVzZWQsDQorICBGREVfUkVOREVSU1RBVFVTX0RvbmUsDQorICBGREVfUkVOREVSU1RBVFVTX0ZhaWxlZCwNCiB9Ow0KIA0KLWNsYXNzIElGREVfUmVuZGVyQ29udGV4dA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRkRFX1JlbmRlckNvbnRleHQqCUNyZWF0ZSgpOw0KLSAgICB2aXJ0dWFsIH5JRkRFX1JlbmRlckNvbnRleHQoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCVN0YXJ0UmVuZGVyKElGREVfUmVuZGVyRGV2aWNlICpwUmVuZGVyRGV2aWNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DYW52YXNTZXQgKnBDYW52YXNTZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4ICZ0bURvYzJEZXZpY2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9IDA7DQotICAgIHZpcnR1YWwgRkRFX1JFTkRFUlNUQVRVUwlHZXRTdGF0dXMoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRkRFX1JFTkRFUlNUQVRVUwlEb1JlbmRlcihJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVN0b3BSZW5kZXIoKSA9IDA7DQorY2xhc3MgSUZERV9SZW5kZXJDb250ZXh0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfUmVuZGVyQ29udGV4dCogQ3JlYXRlKCk7DQorICB2aXJ0dWFsIH5JRkRFX1JlbmRlckNvbnRleHQoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnRSZW5kZXIoSUZERV9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DYW52YXNTZXQqIHBDYW52YXNTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKSA9IDA7DQorICB2aXJ0dWFsIEZERV9SRU5ERVJTVEFUVVMgR2V0U3RhdHVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfUkVOREVSU1RBVFVTIERvUmVuZGVyKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFN0b3BSZW5kZXIoKSA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9yZHYuaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkdi5oCmluZGV4IDRiMDJmMjIuLjc2ZDA0NmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkdi5oCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkdi5oCkBAIC0xMiw0NCArMTIsOTIgQEAKIGNsYXNzIENGWF9ESUJpdG1hcDsNCiBjbGFzcyBDRlhfRElCU291cmNlOw0KIA0KLXR5cGVkZWYgc3RydWN0IF9GREVfSERFVklDRVNUQVRFIHsNCi0gICAgdm9pZCogcERhdGE7DQotfSAqIEZERV9IREVWSUNFU1RBVEU7DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9IREVWSUNFU1RBVEUgeyB2b2lkKiBwRGF0YTsgfSAqIEZERV9IREVWSUNFU1RBVEU7DQogDQotY2xhc3MgSUZERV9SZW5kZXJEZXZpY2UNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZERV9SZW5kZXJEZXZpY2UqCUNyZWF0ZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFKTsNCi0gICAgc3RhdGljIElGREVfUmVuZGVyRGV2aWNlKglDcmVhdGUoQ0ZYX1JlbmRlckRldmljZSAqcERldmljZSk7DQotICAgIHZpcnR1YWwgfklGREVfUmVuZGVyRGV2aWNlKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKSA9IDA7DQorY2xhc3MgSUZERV9SZW5kZXJEZXZpY2Ugew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9SZW5kZXJEZXZpY2UqIENyZWF0ZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSk7DQorICBzdGF0aWMgSUZERV9SZW5kZXJEZXZpY2UqIENyZWF0ZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlKTsNCisgIHZpcnR1YWwgfklGREVfUmVuZGVyRGV2aWNlKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRXaWR0aCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0SGVpZ2h0KCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZERV9IREVWSUNFU1RBVEUJU2F2ZVN0YXRlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzdG9yZVN0YXRlKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRDbGlwUGF0aChjb25zdCBJRkRFX1BhdGggKnBDbGlwKSA9IDA7DQotICAgIHZpcnR1YWwgSUZERV9QYXRoKgkJCUdldENsaXBQYXRoKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZydENsaXApID0gMDsNCi0gICAgdmlydHVhbCBjb25zdCBDRlhfUmVjdEYmCUdldENsaXBSZWN0KCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZHRoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEhlaWdodCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0hERVZJQ0VTVEFURSBTYXZlU3RhdGUoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2xpcFBhdGgoY29uc3QgSUZERV9QYXRoKiBwQ2xpcCkgPSAwOw0KKyAgdmlydHVhbCBJRkRFX1BhdGgqIEdldENsaXBQYXRoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKSA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IENGWF9SZWN0RiYgR2V0Q2xpcFJlY3QoKSA9IDA7DQogDQotICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXREcGlYKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0RHBpWSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0RHBpWCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0RHBpWSgpIGNvbnN0ID0gMDsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdJbWFnZShDRlhfRElCU291cmNlICpwRGliLCBjb25zdCBDRlhfUmVjdEYgKnBTcmNSZWN0LCBjb25zdCBDRlhfUmVjdEYgJmRzdFJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBJbWdNYXRyaXggPSBOVUxMLCBjb25zdCBDRlhfTWF0cml4ICpwRGV2TWF0cml4ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1N0cmluZyhJRkRFX0JydXNoICpwQnJ1c2gsIElGWF9Gb250ICpwRm9udCwgY29uc3QgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBpbnQzMl90IGlDb3VudCwgRlhfRkxPQVQgZkZvbnRTaXplLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0JlemllcihJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRGICZwdDEsIGNvbnN0IENGWF9Qb2ludEYgJnB0MiwgY29uc3QgQ0ZYX1BvaW50RiAmcHQzLCBjb25zdCBDRlhfUG9pbnRGICZwdDQsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3Q3VydmUoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgRlhfQk9PTCBiQ2xvc2VkLCBGWF9GTE9BVCBmVGVuc2lvbiA9IDAuNWYsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3RWxsaXBzZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3TGluZXMoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdMaW5lKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludEYgJnB0MSwgY29uc3QgQ0ZYX1BvaW50RiAmcHQyLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1BhdGgoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgSUZERV9QYXRoICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdQb2x5Z29uKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3UmVjdGFuZ2xlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxDbG9zZWRDdXJ2ZShJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41ZiwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxFbGxpcHNlKElGREVfQnJ1c2gqIHBCcnVzaCwgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbFBhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBJRkRFX1BhdGggKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbFBvbHlnb24oSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbFJlY3RhbmdsZShJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcERpYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwU3JjUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1nTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcERldk1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3U3RyaW5nKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250KiBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmV6aWVyKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3Q3VydmUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xvc2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGVuc2lvbiA9IDAuNWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0VsbGlwc2UoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdMaW5lcyhJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdMaW5lKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1BhdGgoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3UG9seWdvbihJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdSZWN0YW5nbGUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxDbG9zZWRDdXJ2ZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsRWxsaXBzZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFBhdGgoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUG9seWdvbihJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxSZWN0YW5nbGUoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3R0by5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfdHRvLmgKaW5kZXggMDUyZjIyMS4uN2U3YTEzYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfdHRvLmgKKysrIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfdHRvLmgKQEAgLTcsNjUgKzcsOTEgQEAKICNpZm5kZWYgX0ZERV9URVhUT1VUDQogI2RlZmluZSBfRkRFX1RFWFRPVVQNCiBjbGFzcyBJRkRFX1RleHRPdXQ7DQotI2RlZmluZSBGREVfVFRPU1RZTEVfVW5kZXJsaW5lCQkJMHgwMDAxDQotI2RlZmluZSBGREVfVFRPU1RZTEVfU3RyaWtlb3V0CQkJMHgwMDAyDQotI2RlZmluZSBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQJCTB4MDAwNA0KLSNkZWZpbmUgRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUJCQkweDAwMTANCi0jZGVmaW5lIEZERV9UVE9TVFlMRV9FeHBhbmRUYWIJCQkweDAwMjANCi0jZGVmaW5lIEZERV9UVE9TVFlMRV9Ib3RLZXkJCQkJMHgwMDQwDQotI2RlZmluZSBGREVfVFRPU1RZTEVfRWxsaXBzaXMJCQkweDAwODANCi0jZGVmaW5lIEZERV9UVE9TVFlMRV9MaW5lV3JhcAkJCTB4MDEwMA0KLSNkZWZpbmUgRkRFX1RUT1NUWUxFX0FyYWJpY1NoYXBlcwkJMHgwMjAwDQotI2RlZmluZSBGREVfVFRPU1RZTEVfUlRMCQkJCTB4MDQwMA0KLSNkZWZpbmUgRkRFX1RUT1NUWUxFX0FyYWJpY0NvbnRleHQJCTB4MDgwMA0KLSNkZWZpbmUgRkRFX1RUT1NUWUxFX0xhc3RMaW5lSGVpZ2h0CQkweDEwMDANCi0jZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfVG9wTGVmdAkJMA0KLSNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9Ub3BDZW50ZXIJCTENCi0jZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfVG9wUmlnaHQJCTINCi0jZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfVG9wQXV0bwkJMw0KLSNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0CQk0DQotI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcgkJCTUNCi0jZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQ2VudGVyUmlnaHQJNg0KLSNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJBdXRvCQk3DQotI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUxlZnQJCTgNCi0jZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQm90dG9tQ2VudGVyCTkNCi0jZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQm90dG9tUmlnaHQJMTANCi0jZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQm90dG9tQXV0bwkJMTENCisjZGVmaW5lIEZERV9UVE9TVFlMRV9VbmRlcmxpbmUgMHgwMDAxDQorI2RlZmluZSBGREVfVFRPU1RZTEVfU3RyaWtlb3V0IDB4MDAwMg0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0IDB4MDAwNA0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUgMHgwMDEwDQorI2RlZmluZSBGREVfVFRPU1RZTEVfRXhwYW5kVGFiIDB4MDAyMA0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX0hvdEtleSAweDAwNDANCisjZGVmaW5lIEZERV9UVE9TVFlMRV9FbGxpcHNpcyAweDAwODANCisjZGVmaW5lIEZERV9UVE9TVFlMRV9MaW5lV3JhcCAweDAxMDANCisjZGVmaW5lIEZERV9UVE9TVFlMRV9BcmFiaWNTaGFwZXMgMHgwMjAwDQorI2RlZmluZSBGREVfVFRPU1RZTEVfUlRMIDB4MDQwMA0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX0FyYWJpY0NvbnRleHQgMHgwODAwDQorI2RlZmluZSBGREVfVFRPU1RZTEVfTGFzdExpbmVIZWlnaHQgMHgxMDAwDQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX1RvcExlZnQgMA0KKyNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9Ub3BDZW50ZXIgMQ0KKyNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9Ub3BSaWdodCAyDQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX1RvcEF1dG8gMw0KKyNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0IDQNCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQ2VudGVyIDUNCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQ2VudGVyUmlnaHQgNg0KKyNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJBdXRvIDcNCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQm90dG9tTGVmdCA4DQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUNlbnRlciA5DQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbVJpZ2h0IDEwDQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUF1dG8gMTENCiANCi1jbGFzcyBJRkRFX1RleHRPdXQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZERV9UZXh0T3V0KglDcmVhdGUoKTsNCi0gICAgdmlydHVhbCB+SUZERV9UZXh0T3V0KCkge30NCi0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldEZvbnQoSUZYX0ZvbnQgKnBGb250KSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJU2V0VGV4dENvbG9yKEZYX0FSR0IgY29sb3IpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXMpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRFbGxpcHNpc1N0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NFbGxpcHNpcykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50KSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJU2V0TGluZVNwYWNlKEZYX0ZMT0FUIGZMaW5lU3BhY2UpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRESUJpdG1hcChDRlhfRElCaXRtYXAgKnBESUIpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSAqcERldmljZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0ICZydENsaXApID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRMaW5lQnJlYWtUb2xlcmFuY2UoRlhfRkxPQVQgZlRvbGVyYW5jZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUNhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgQ0ZYX1NpemUgJnNpemUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9TaXplRiAmc2l6ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUNhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgQ0ZYX1JlY3QgJnJlY3QpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9SZWN0RiAmcmVjdCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCURyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgaW50MzJfdCB4LCBpbnQzMl90IHkpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIGNvbnN0IENGWF9SZWN0ICZyZWN0KSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJRHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRMb2dpY0NsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiAmcnRDbGlwKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJQ2FsY0xvZ2ljU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9TaXplRiAmc2l6ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUNhbGNMb2dpY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBDRlhfUmVjdEYgJnJlY3QpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlEcmF3TG9naWNUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCURyYXdMb2dpY1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldFRvdGFsTGluZXMoKSA9IDA7DQorY2xhc3MgSUZERV9UZXh0T3V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfVGV4dE91dCogQ3JlYXRlKCk7DQorICB2aXJ0dWFsIH5JRkRFX1RleHRPdXQoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udChJRlhfRm9udCogcEZvbnQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0Q29sb3IoRlhfQVJHQiBjb2xvcikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFN0eWxlcyhGWF9EV09SRCBkd1N0eWxlcykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEVsbGlwc2lzU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0VsbGlwc2lzKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0UGFyYWdyYXBoQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEFsaWdubWVudChpbnQzMl90IGlBbGlnbm1lbnQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lU3BhY2UoRlhfRkxPQVQgZkxpbmVTcGFjZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldERJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3QmIHJ0Q2xpcCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQ2FsY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NpemUmIHNpemUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU2l6ZUYmIHNpemUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdCYgcmVjdCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIERyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHkpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdCYgcmVjdCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIERyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExvZ2ljQ2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDYWxjTG9naWNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU2l6ZUYmIHNpemUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDYWxjTG9naWNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBEcmF3TG9naWNUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIERyYXdMb2dpY1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFRvdGFsTGluZXMoKSA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV94bWwuaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3htbC5oCmluZGV4IDAzZjY0MzguLjlmYzgwYjcgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3htbC5oCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3htbC5oCkBAIC0yNSwxNzAgKzI1LDIwNyBAQAogZXh0ZXJuICJDIiB7DQogI2VuZGlmDQogZW51bSBGREVfWE1MTk9ERVRZUEUgew0KLSAgICBGREVfWE1MTk9ERV9Vbmtub3duCQkJPSAgMCwNCi0gICAgRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24JCQksDQotICAgIEZERV9YTUxOT0RFX0VsZW1lbnQJCQkJLA0KLSAgICBGREVfWE1MTk9ERV9UZXh0CQkJCSwNCi0gICAgRkRFX1hNTE5PREVfQ2hhckRhdGEJCQksDQorICBGREVfWE1MTk9ERV9Vbmtub3duID0gMCwNCisgIEZERV9YTUxOT0RFX0luc3RydWN0aW9uLA0KKyAgRkRFX1hNTE5PREVfRWxlbWVudCwNCisgIEZERV9YTUxOT0RFX1RleHQsDQorICBGREVfWE1MTk9ERV9DaGFyRGF0YSwNCiB9Ow0KIHR5cGVkZWYgc3RydWN0IF9GREVfWE1MTk9ERSB7DQotICAgIGludDMyX3QJCWlOb2RlTnVtOw0KLSAgICBGREVfWE1MTk9ERVRZUEUJZU5vZGVUeXBlOw0KLX0gRkRFX1hNTE5PREUsICogRkRFX0xQWE1MTk9ERTsNCi10eXBlZGVmIEZERV9YTUxOT0RFIGNvbnN0ICogRkRFX0xQQ1hNTE5PREU7DQorICBpbnQzMl90IGlOb2RlTnVtOw0KKyAgRkRFX1hNTE5PREVUWVBFIGVOb2RlVHlwZTsNCit9IEZERV9YTUxOT0RFLCAqRkRFX0xQWE1MTk9ERTsNCit0eXBlZGVmIEZERV9YTUxOT0RFIGNvbnN0KiBGREVfTFBDWE1MTk9ERTsNCiB0eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPEZERV9YTUxOT0RFPiBDRkRFX1hNTE5vZGVTdGFjazsNCi1GWF9CT09MCQlGREVfSXNYTUxWYWxpZENoYXIoRlhfV0NIQVIgY2gpOw0KLUZYX0JPT0wJCUZERV9Jc1hNTFdoaXRlU3BhY2UoRlhfV0NIQVIgY2gpOw0KLUZYX0JPT0wJCUZERV9Jc1hNTE5hbWVDaGFyKEZYX1dDSEFSIGNoLCBGWF9CT09MIGJGaXJzdENoYXIpOw0KK0ZYX0JPT0wgRkRFX0lzWE1MVmFsaWRDaGFyKEZYX1dDSEFSIGNoKTsNCitGWF9CT09MIEZERV9Jc1hNTFdoaXRlU3BhY2UoRlhfV0NIQVIgY2gpOw0KK0ZYX0JPT0wgRkRFX0lzWE1MTmFtZUNoYXIoRlhfV0NIQVIgY2gsIEZYX0JPT0wgYkZpcnN0Q2hhcik7DQogI2lmZGVmIF9fY3BsdXNwbHVzDQogfQ0KICNlbmRpZg0KIA0KLWNsYXNzIElGREVfWE1MTm9kZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGREVfWE1MTm9kZSgpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgRkRFX1hNTE5PREVUWVBFCUdldFR5cGUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJQ291bnRDaGlsZE5vZGVzKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfWE1MTm9kZSoJR2V0Q2hpbGROb2RlKGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRDaGlsZE5vZGVJbmRleChJRkRFX1hNTE5vZGUgKnBOb2RlKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgSUZERV9YTUxOb2RlKglHZXRQYXRoKGNvbnN0IEZYX1dDSEFSKiBwUGF0aCwgaW50MzJfdCBpTGVuZ3RoID0gLTEsIEZYX0JPT0wgYlF1YWxpZmllZE5hbWUgPSBUUlVFKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJSW5zZXJ0Q2hpbGROb2RlKElGREVfWE1MTm9kZSAqcE5vZGUsIGludDMyX3QgaW5kZXggPSAtMSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZW1vdmVDaGlsZE5vZGUoSUZERV9YTUxOb2RlICpwTm9kZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlEZWxldGVDaGlsZHJlbigpID0gMDsNCi0gICAgZW51bSBOb2RlSXRlbSB7Um9vdCA9IDAsIFBhcmVudCwgRmlyc3RTaWJsaW5nLCBQcmlvclNpYmxpbmcsIE5leHRTaWJsaW5nLCBMYXN0U2libGluZywgRmlyc3ROZWlnaGJvciwgUHJpb3JOZWlnaGJvciwgTmV4dE5laWdoYm9yLCBMYXN0TmVpZ2hib3IsIEZpcnN0Q2hpbGQsIExhc3RDaGlsZH07DQotICAgIHZpcnR1YWwgSUZERV9YTUxOb2RlKglHZXROb2RlSXRlbShOb2RlSXRlbSBlSXRlbSkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldE5vZGVMZXZlbCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSW5zZXJ0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSwgSUZERV9YTUxOb2RlICpwTm9kZSkgPSAwOw0KLSAgICB2aXJ0dWFsCUlGREVfWE1MTm9kZSoJUmVtb3ZlTm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSkgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfWE1MTm9kZSoJQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKSA9IDA7DQotICAgIHZpcnR1YWwJdm9pZAkJCVNhdmVYTUxOb2RlKElGWF9TdHJlYW0gKnBYTUxTdHJlYW0pID0gMDsNCitjbGFzcyBJRkRFX1hNTE5vZGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX1hNTE5vZGUoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIEZERV9YTUxOT0RFVFlQRSBHZXRUeXBlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50Q2hpbGROb2RlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZERV9YTUxOb2RlKiBHZXRDaGlsZE5vZGUoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENoaWxkTm9kZUluZGV4KElGREVfWE1MTm9kZSogcE5vZGUpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZERV9YTUxOb2RlKiBHZXRQYXRoKGNvbnN0IEZYX1dDSEFSKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IC0xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUXVhbGlmaWVkTmFtZSA9IFRSVUUpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBJbnNlcnRDaGlsZE5vZGUoSUZERV9YTUxOb2RlKiBwTm9kZSwgaW50MzJfdCBpbmRleCA9IC0xKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlQ2hpbGROb2RlKElGREVfWE1MTm9kZSogcE5vZGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBEZWxldGVDaGlsZHJlbigpID0gMDsNCisgIGVudW0gTm9kZUl0ZW0gew0KKyAgICBSb290ID0gMCwNCisgICAgUGFyZW50LA0KKyAgICBGaXJzdFNpYmxpbmcsDQorICAgIFByaW9yU2libGluZywNCisgICAgTmV4dFNpYmxpbmcsDQorICAgIExhc3RTaWJsaW5nLA0KKyAgICBGaXJzdE5laWdoYm9yLA0KKyAgICBQcmlvck5laWdoYm9yLA0KKyAgICBOZXh0TmVpZ2hib3IsDQorICAgIExhc3ROZWlnaGJvciwNCisgICAgRmlyc3RDaGlsZCwNCisgICAgTGFzdENoaWxkDQorICB9Ow0KKyAgdmlydHVhbCBJRkRFX1hNTE5vZGUqIEdldE5vZGVJdGVtKE5vZGVJdGVtIGVJdGVtKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Tm9kZUxldmVsKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEluc2VydE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwTm9kZSkgPSAwOw0KKyAgdmlydHVhbCBJRkRFX1hNTE5vZGUqIFJlbW92ZU5vZGVJdGVtKElGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0pID0gMDsNCisgIHZpcnR1YWwgSUZERV9YTUxOb2RlKiBDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTYXZlWE1MTm9kZShJRlhfU3RyZWFtKiBwWE1MU3RyZWFtKSA9IDA7DQogfTsNCi1jbGFzcyBJRkRFX1hNTEluc3RydWN0aW9uIDogcHVibGljIElGREVfWE1MTm9kZQ0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRkRFX1hNTEluc3RydWN0aW9uKglDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGFyZ2V0KTsNCi0gICAgdmlydHVhbCB2b2lkCQkJCUdldFRhcmdldE5hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzVGFyZ2V0KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJQ291bnRBdHRyaWJ1dGVzKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRBdHRyaWJ1dGUoaW50MzJfdCBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUhhc0F0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlLCBjb25zdCBGWF9XQ0hBUiogcHdzRGVmVmFsdWUgPSBOVUxMKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaU5hbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIGludDMyX3QgaURlZlZhbHVlID0gMCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIGludDMyX3QgaUF0dHJpVmFsdWUpID0gMDsNCi0gICAgdmlydHVhbCBGWF9GTE9BVAkJR2V0RmxvYXQoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkRlZlZhbHVlID0gMCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmQXR0cmlWYWx1ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZW1vdmVBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUNvdW50RGF0YSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJR2V0RGF0YShpbnQzMl90IGluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NEYXRhKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFwcGVuZERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRGF0YSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZW1vdmVEYXRhKGludDMyX3QgaW5kZXgpID0gMDsNCitjbGFzcyBJRkRFX1hNTEluc3RydWN0aW9uIDogcHVibGljIElGREVfWE1MTm9kZSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRkRFX1hNTEluc3RydWN0aW9uKiBDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KTsNCisgIHZpcnR1YWwgdm9pZCBHZXRUYXJnZXROYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50QXR0cmlidXRlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRBdHRyaWJ1dGUoaW50MzJfdCBpbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSGFzQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHB3c0RlZlZhbHVlID0gTlVMTCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWZWYWx1ZSA9IDApIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBdHRyaVZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZEZWZWYWx1ZSA9IDApIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmQXR0cmlWYWx1ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZUF0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnREYXRhKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldERhdGEoaW50MzJfdCBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFwcGVuZERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZURhdGEoaW50MzJfdCBpbmRleCkgPSAwOw0KIH07DQotY2xhc3MgSUZERV9YTUxFbGVtZW50IDogcHVibGljIElGREVfWE1MTm9kZQ0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRkRFX1hNTEVsZW1lbnQqCUNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUYWcpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUYWdOYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhZykgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRMb2NhbFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldE5hbWVzcGFjZVByZWZpeChDRlhfV2lkZVN0cmluZyAmd3NQcmVmaXgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0TmFtZXNwYWNlVVJJKENGWF9XaWRlU3RyaW5nICZ3c05hbWVzcGFjZSkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUNvdW50QXR0cmlidXRlcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QXR0cmlidXRlKGludDMyX3QgaW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlIYXNBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSwgY29uc3QgRlhfV0NIQVIqIHB3c0RlZlZhbHVlID0gTlVMTCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlOYW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBpbnQzMl90IGlEZWZWYWx1ZSA9IDApIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBpbnQzMl90IGlBdHRyaVZhbHVlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfRkxPQVQJCUdldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIEZYX0ZMT0FUIGZEZWZWYWx1ZSA9IDApIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0RmxvYXQoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkF0dHJpVmFsdWUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVtb3ZlQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRUZXh0RGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSA9IDA7DQorY2xhc3MgSUZERV9YTUxFbGVtZW50IDogcHVibGljIElGREVfWE1MTm9kZSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRkRFX1hNTEVsZW1lbnQqIENyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYWcpOw0KKyAgdmlydHVhbCB2b2lkIEdldFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFnKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TG9jYWxUYWdOYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhZykgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldE5hbWVzcGFjZVByZWZpeChDRlhfV2lkZVN0cmluZyYgd3NQcmVmaXgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXROYW1lc3BhY2VVUkkoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRBdHRyaWJ1dGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEF0dHJpYnV0ZShpbnQzMl90IGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBIYXNBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHdzRGVmVmFsdWUgPSBOVUxMKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURlZlZhbHVlID0gMCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUF0dHJpVmFsdWUpID0gMDsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0RmxvYXQoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkRlZlZhbHVlID0gMCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIEZYX0ZMT0FUIGZBdHRyaVZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgPSAwOw0KIH07DQotY2xhc3MgSUZERV9YTUxUZXh0IDogcHVibGljIElGREVfWE1MTm9kZQ0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRkRFX1hNTFRleHQqCUNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgPSAwOw0KK2NsYXNzIElGREVfWE1MVGV4dCA6IHB1YmxpYyBJRkRFX1hNTE5vZGUgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9YTUxUZXh0KiBDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSA9IDA7DQogfTsNCi1jbGFzcyBJRkRFX1hNTERlY2xhcmF0aW9uIDogcHVibGljIElGREVfWE1MTm9kZQ0KLXsNCi1wdWJsaWM6DQorY2xhc3MgSUZERV9YTUxEZWNsYXJhdGlvbiA6IHB1YmxpYyBJRkRFX1hNTE5vZGUgew0KKyBwdWJsaWM6DQogfTsNCi1jbGFzcyBJRkRFX1hNTENoYXJEYXRhIDogcHVibGljIElGREVfWE1MRGVjbGFyYXRpb24NCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZERV9YTUxDaGFyRGF0YSoJQ3JlYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0NEYXRhKTsNCi0gICAgdmlydHVhbCB+SUZERV9YTUxDaGFyRGF0YSgpIHt9DQorY2xhc3MgSUZERV9YTUxDaGFyRGF0YSA6IHB1YmxpYyBJRkRFX1hNTERlY2xhcmF0aW9uIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfWE1MQ2hhckRhdGEqIENyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDRGF0YSk7DQorICB2aXJ0dWFsIH5JRkRFX1hNTENoYXJEYXRhKCkge30NCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCUdldENoYXJEYXRhKENGWF9XaWRlU3RyaW5nICZ3c0NEYXRhKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRDaGFyRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NDRGF0YSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldENoYXJEYXRhKENGWF9XaWRlU3RyaW5nJiB3c0NEYXRhKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhckRhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ0RhdGEpID0gMDsNCiB9Ow0KIHR5cGVkZWYgc3RydWN0IF9GREVfWE1MUkVBREVSSEFORExFUiB7DQotICAgIHZvaWQqIHBEYXRhOw0KKyAgdm9pZCogcERhdGE7DQogDQotICAgIHZvaWQJKCpPblRhZ0VudGVyKShfRkRFX1hNTFJFQURFUkhBTkRMRVIgKnBUaGlzLCBGREVfWE1MTk9ERVRZUEUgZVR5cGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RhZ05hbWUpOw0KLSAgICB2b2lkCSgqT25UYWdCcmVhaykoX0ZERV9YTUxSRUFERVJIQU5ETEVSICpwVGhpcywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGFnTmFtZSk7DQotICAgIHZvaWQJKCpPblRhZ0Nsb3NlKShfRkRFX1hNTFJFQURFUkhBTkRMRVIgKnBUaGlzLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUYWdOYW1lKTsNCi0gICAgdm9pZAkoKk9uQXR0cmlidXRlKShfRkRFX1hNTFJFQURFUkhBTkRMRVIgKnBUaGlzLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NOYW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSk7DQotICAgIHZvaWQJKCpPbkRhdGEpKF9GREVfWE1MUkVBREVSSEFORExFUiAqcFRoaXMsIEZERV9YTUxOT0RFVFlQRSBlVHlwZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpOw0KLX0gRkRFX1hNTFJFQURFUkhBTkRMRVIsICogRkRFX0xQWE1MUkVBREVSSEFORExFUjsNCi1jbGFzcyBJRkRFX1hNTERvYw0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRkRFX1hNTERvYyoJCUNyZWF0ZSgpOw0KLSAgICB2aXJ0dWFsIH5JRkRFX1hNTERvYygpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUxvYWRYTUwoSUZYX1N0cmVhbSAqcFhNTFN0cmVhbSwgaW50MzJfdCBpWE1MUGxhbmVTaXplID0gODE5MiwgaW50MzJfdCBpVGV4dERhdGFTaXplID0gMjU2LCBGREVfTFBYTUxSRUFERVJIQU5ETEVSIHBIYW5kbGVyID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlMb2FkWE1MKElGREVfWE1MUGFyc2VyICpwWE1MUGFyc2VyKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJRG9Mb2FkKElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlDbG9zZVhNTCgpID0gMDsNCi0gICAgdmlydHVhbCBJRkRFX1hNTE5vZGUqCUdldFJvb3QoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNhdmVYTUwoSUZYX1N0cmVhbSAqcFhNTFN0cmVhbSA9IE5VTEwsIEZYX0JPT0wgYlNhdmVCT00gPSBUUlVFKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNhdmVYTUxOb2RlKElGWF9TdHJlYW0gKnBYTUxTdHJlYW0sIElGREVfWE1MTm9kZSAqcE5vZGUpID0gMDsNCisgIHZvaWQgKCpPblRhZ0VudGVyKShfRkRFX1hNTFJFQURFUkhBTkRMRVIqIHBUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgIEZERV9YTUxOT0RFVFlQRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYWdOYW1lKTsNCisgIHZvaWQgKCpPblRhZ0JyZWFrKShfRkRFX1hNTFJFQURFUkhBTkRMRVIqIHBUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhZ05hbWUpOw0KKyAgdm9pZCAoKk9uVGFnQ2xvc2UpKF9GREVfWE1MUkVBREVSSEFORExFUiogcFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGFnTmFtZSk7DQorICB2b2lkICgqT25BdHRyaWJ1dGUpKF9GREVfWE1MUkVBREVSSEFORExFUiogcFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKTsNCisgIHZvaWQgKCpPbkRhdGEpKF9GREVfWE1MUkVBREVSSEFORExFUiogcFRoaXMsDQorICAgICAgICAgICAgICAgICBGREVfWE1MTk9ERVRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSk7DQorfSBGREVfWE1MUkVBREVSSEFORExFUiwgKkZERV9MUFhNTFJFQURFUkhBTkRMRVI7DQorY2xhc3MgSUZERV9YTUxEb2Mgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9YTUxEb2MqIENyZWF0ZSgpOw0KKyAgdmlydHVhbCB+SUZERV9YTUxEb2MoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFhNTChJRlhfU3RyZWFtKiBwWE1MU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpWE1MUGxhbmVTaXplID0gODE5MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRleHREYXRhU2l6ZSA9IDI1NiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9MUFhNTFJFQURFUkhBTkRMRVIgcEhhbmRsZXIgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFhNTChJRkRFX1hNTFBhcnNlciogcFhNTFBhcnNlcikgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IERvTG9hZChJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDbG9zZVhNTCgpID0gMDsNCisgIHZpcnR1YWwgSUZERV9YTUxOb2RlKiBHZXRSb290KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNhdmVYTUwoSUZYX1N0cmVhbSogcFhNTFN0cmVhbSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlQk9NID0gVFJVRSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNhdmVYTUxOb2RlKElGWF9TdHJlYW0qIHBYTUxTdHJlYW0sIElGREVfWE1MTm9kZSogcE5vZGUpID0gMDsNCiB9Ow0KLWNsYXNzIElGREVfWE1MUGFyc2VyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZERV9YTUxQYXJzZXIoKSB7fQ0KLSAgICB2aXJ0dWFsCXZvaWQJCQkJUmVsZWFzZSgpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJRG9QYXJzZXIoSUZYX1BhdXNlICpwUGF1c2UpID0gMDsNCitjbGFzcyBJRkRFX1hNTFBhcnNlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfWE1MUGFyc2VyKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IERvUGFyc2VyKElGWF9QYXVzZSogcFBhdXNlKSA9IDA7DQogfTsNCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfTm9uZQkJCQkweDAwDQotI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX0luc3RydWN0aW9uT3BlbgkJMHgwMQ0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbkNsb3NlCTB4MDINCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudE9wZW4JCQkweDAzDQotI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRCcmVhawkJMHgwNA0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50Q2xvc2UJCTB4MDUNCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0TmFtZQkJCTB4MDYNCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFnTmFtZQkJCQkweDA3DQotI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpTmFtZQkJCTB4MDgNCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlWYWx1ZQkJCTB4MDkNCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfVGV4dAkJCQkweDBBDQotI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX0NEYXRhCQkJCTB4MEINCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0RGF0YQkJCTB4MEMNCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3IJCQkJMHhGRQ0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MJCQkJCTB4RkYNCi1jbGFzcyBJRkRFX1hNTFN5bnRheFBhcnNlcg0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRkRFX1hNTFN5bnRheFBhcnNlcioJQ3JlYXRlKCk7DQotICAgIHZpcnR1YWwgfklGREVfWE1MU3ludGF4UGFyc2VyKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJSW5pdChJRlhfU3RyZWFtICpwU3RyZWFtLCBpbnQzMl90IGlYTUxQbGFuZVNpemUsIGludDMyX3QgaVRleHREYXRhU2l6ZSA9IDI1NikgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlEb1N5bnRheFBhcnNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldFN0YXR1cygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRDdXJyZW50UG9zKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRDdXJyZW50QmluYXJ5UG9zKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEN1cnJlbnROb2RlTnVtYmVyKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldExhc3ROb2RlTnVtYmVyKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUYXJnZXROYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUYWdOYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhZykgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRBdHRyaWJ1dGVOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpTmFtZSkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRBdHRyaWJ1dGVWYWx1ZShDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0VGFyZ2V0RGF0YShDRlhfV2lkZVN0cmluZyAmd3NEYXRhKSBjb25zdCA9IDA7DQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUgMHgwMA0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbk9wZW4gMHgwMQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbkNsb3NlIDB4MDINCisjZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudE9wZW4gMHgwMw0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50QnJlYWsgMHgwNA0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50Q2xvc2UgMHgwNQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXROYW1lIDB4MDYNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFnTmFtZSAweDA3DQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpTmFtZSAweDA4DQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpVmFsdWUgMHgwOQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19UZXh0IDB4MEENCisjZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfQ0RhdGEgMHgwQg0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhIDB4MEMNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3IgMHhGRQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MgMHhGRg0KK2NsYXNzIElGREVfWE1MU3ludGF4UGFyc2VyIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfWE1MU3ludGF4UGFyc2VyKiBDcmVhdGUoKTsNCisgIHZpcnR1YWwgfklGREVfWE1MU3ludGF4UGFyc2VyKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVhNTFBsYW5lU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRleHREYXRhU2l6ZSA9IDI1NikgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBEb1N5bnRheFBhcnNlKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFN0YXR1cygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJyZW50UG9zKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRDdXJyZW50QmluYXJ5UG9zKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEN1cnJlbnROb2RlTnVtYmVyKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExhc3ROb2RlTnVtYmVyKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFRhcmdldE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGFnTmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYWcpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRBdHRyaWJ1dGVOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldEF0dHJpYnV0ZVZhbHVlKENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGFyZ2V0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NEYXRhKSBjb25zdCA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5jcHAKaW5kZXggOTJkMzM3Ni4uOGM1NjY4MCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzY2FjaGUuY3BwCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2NhY2hlLmNwcApAQCAtNiwxNTggKzYsMTUyIEBACiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCiAjaW5jbHVkZSAiZmRlX2Nzc2NhY2hlLmgiDQotX0ZERV9DU1NDQUNIRUlURU06Ol9GREVfQ1NTQ0FDSEVJVEVNKElGREVfQ1NTU3R5bGVTaGVldCAqcCkNCi0gICAgOiBwU3R5bGVzaGVldChwKQ0KLSAgICAsIGR3QWN0aXZpdHkoMCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwU3R5bGVzaGVldCk7DQotICAgIHBTdHlsZXNoZWV0LT5BZGRSZWYoKTsNCitfRkRFX0NTU0NBQ0hFSVRFTTo6X0ZERV9DU1NDQUNIRUlURU0oSUZERV9DU1NTdHlsZVNoZWV0KiBwKQ0KKyAgICA6IHBTdHlsZXNoZWV0KHApLCBkd0FjdGl2aXR5KDApIHsNCisgIEZYU1lTX2Fzc2VydChwU3R5bGVzaGVldCk7DQorICBwU3R5bGVzaGVldC0+QWRkUmVmKCk7DQogfQ0KLV9GREVfQ1NTQ0FDSEVJVEVNOjp+X0ZERV9DU1NDQUNIRUlURU0oKQ0KLXsNCi0gICAgcFN0eWxlc2hlZXQtPlJlbGVhc2UoKTsNCitfRkRFX0NTU0NBQ0hFSVRFTTo6fl9GREVfQ1NTQ0FDSEVJVEVNKCkgew0KKyAgcFN0eWxlc2hlZXQtPlJlbGVhc2UoKTsNCiB9DQotSUZERV9DU1NTdHlsZVNoZWV0Q2FjaGUqIElGREVfQ1NTU3R5bGVTaGVldENhY2hlOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTsNCitJRkRFX0NTU1N0eWxlU2hlZXRDYWNoZSogSUZERV9DU1NTdHlsZVNoZWV0Q2FjaGU6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZERV9DU1NTdHlsZVNoZWV0Q2FjaGU7DQogfQ0KIENGREVfQ1NTU3R5bGVTaGVldENhY2hlOjpDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZSgpDQotICAgIDogbV9wRml4ZWRTdG9yZShOVUxMKQ0KLSAgICAsIG1faU1heEl0ZW1zKDUpDQotew0KLX0NCi1DRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTo6fkNGREVfQ1NTU3R5bGVTaGVldENhY2hlKCkNCi17DQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fU3R5bGVzaGVldHMuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICBpZiAocG9zICE9IE5VTEwpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN6S2V5Ow0KLSAgICAgICAgdm9pZCogcFZhbHVlOw0KLSAgICAgICAgd2hpbGUgKHBvcyAhPSBOVUxMKSB7DQotICAgICAgICAgICAgbV9TdHlsZXNoZWV0cy5HZXROZXh0QXNzb2MocG9zLCBzektleSwgcFZhbHVlKTsNCi0gICAgICAgICAgICBGREVfRGVsZXRlV2l0aChGREVfQ1NTQ0FDSEVJVEVNLCBtX3BGaXhlZFN0b3JlLCAoRkRFX0xQQ1NTQ0FDSEVJVEVNKXBWYWx1ZSk7DQotICAgICAgICB9DQotICAgICAgICBtX1N0eWxlc2hlZXRzLlJlbW92ZUFsbCgpOw0KLSAgICB9DQotICAgIGlmIChtX3BGaXhlZFN0b3JlICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcEZpeGVkU3RvcmUtPlJlbGVhc2UoKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGREVfQ1NTU3R5bGVTaGVldENhY2hlOjpBZGRTdHlsZVNoZWV0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pLZXksIElGREVfQ1NTU3R5bGVTaGVldCAqcFN0eWxlU2hlZXQpDQotew0KLSAgICBGWFNZU19hc3NlcnQocFN0eWxlU2hlZXQgIT0gTlVMTCk7DQotICAgIGlmIChtX3BGaXhlZFN0b3JlID09IE5VTEwpIHsNCi0gICAgICAgIG1fcEZpeGVkU3RvcmUgPSBGWF9DcmVhdGVBbGxvY2F0b3IoRlhfQUxMT0NUWVBFX0ZpeGVkLCBGWF9NQVgoMTAsIG1faU1heEl0ZW1zKSwgc2l6ZW9mKEZERV9DU1NDQUNIRUlURU0pKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChtX3BGaXhlZFN0b3JlICE9IE5VTEwpOw0KLSAgICB9DQotICAgIHZvaWQqIHBWYWx1ZSA9IE5VTEw7DQotICAgIGlmIChtX1N0eWxlc2hlZXRzLkxvb2t1cChzektleSwgcFZhbHVlKSkgew0KLSAgICAgICAgRkRFX0xQQ1NTQ0FDSEVJVEVNIHBJdGVtID0gKEZERV9MUENTU0NBQ0hFSVRFTSlwVmFsdWU7DQotICAgICAgICBpZiAocEl0ZW0tPnBTdHlsZXNoZWV0ICE9IHBTdHlsZVNoZWV0KSB7DQotICAgICAgICAgICAgcEl0ZW0tPnBTdHlsZXNoZWV0LT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgcEl0ZW0tPnBTdHlsZXNoZWV0ID0gcFN0eWxlU2hlZXQ7DQotICAgICAgICAgICAgcEl0ZW0tPnBTdHlsZXNoZWV0LT5BZGRSZWYoKTsNCi0gICAgICAgICAgICBwSXRlbS0+ZHdBY3Rpdml0eSA9IDA7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICB3aGlsZSAobV9TdHlsZXNoZWV0cy5HZXRDb3VudCgpID49IG1faU1heEl0ZW1zKSB7DQotICAgICAgICAgICAgUmVtb3ZlTG93ZXN0QWN0aXZpdHlJdGVtKCk7DQotICAgICAgICB9DQotICAgICAgICBGREVfTFBDU1NDQUNIRUlURU0gcEl0ZW0gPSBGREVfTmV3V2l0aChtX3BGaXhlZFN0b3JlKSBGREVfQ1NTQ0FDSEVJVEVNKHBTdHlsZVNoZWV0KTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwSXRlbSAhPSBOVUxMKTsNCi0gICAgICAgIG1fU3R5bGVzaGVldHMuU2V0QXQoc3pLZXksIHBJdGVtKTsNCi0gICAgfQ0KLX0NCi1JRkRFX0NTU1N0eWxlU2hlZXQqIENGREVfQ1NTU3R5bGVTaGVldENhY2hlOjpHZXRTdHlsZVNoZWV0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pLZXkpIGNvbnN0DQotew0KLSAgICB2b2lkKiBwVmFsdWUgPSBOVUxMOw0KLSAgICBpZiAobV9TdHlsZXNoZWV0cy5Mb29rdXAoc3pLZXksIHBWYWx1ZSkpIHsNCi0gICAgICAgIEZERV9MUENTU0NBQ0hFSVRFTSBwSXRlbSA9IChGREVfTFBDU1NDQUNIRUlURU0pcFZhbHVlOw0KLSAgICAgICAgcEl0ZW0tPmR3QWN0aXZpdHkrKzsNCi0gICAgICAgIHBJdGVtLT5wU3R5bGVzaGVldC0+QWRkUmVmKCk7DQotICAgICAgICByZXR1cm4gcEl0ZW0tPnBTdHlsZXNoZWV0Ow0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi12b2lkIENGREVfQ1NTU3R5bGVTaGVldENhY2hlOjpSZW1vdmVTdHlsZVNoZWV0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pLZXkpDQotew0KLSAgICB2b2lkKiBwVmFsdWUgPSBOVUxMOw0KLSAgICBpZiAoIW1fU3R5bGVzaGVldHMuTG9va3VwKHN6S2V5LCBwVmFsdWUpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRkRFX0RlbGV0ZVdpdGgoRkRFX0NTU0NBQ0hFSVRFTSwgbV9wRml4ZWRTdG9yZSwgKEZERV9MUENTU0NBQ0hFSVRFTSlwVmFsdWUpOw0KLSAgICBtX1N0eWxlc2hlZXRzLlJlbW92ZUtleShzektleSk7DQotfQ0KLXZvaWQgQ0ZERV9DU1NTdHlsZVNoZWV0Q2FjaGU6OlJlbW92ZUxvd2VzdEFjdGl2aXR5SXRlbSgpDQotew0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX1N0eWxlc2hlZXRzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgOiBtX3BGaXhlZFN0b3JlKE5VTEwpLCBtX2lNYXhJdGVtcyg1KSB7fQ0KK0NGREVfQ1NTU3R5bGVTaGVldENhY2hlOjp+Q0ZERV9DU1NTdHlsZVNoZWV0Q2FjaGUoKSB7DQorICBGWF9QT1NJVElPTiBwb3MgPSBtX1N0eWxlc2hlZXRzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIGlmIChwb3MgIT0gTlVMTCkgew0KICAgICBDRlhfQnl0ZVN0cmluZyBzektleTsNCiAgICAgdm9pZCogcFZhbHVlOw0KLSAgICBGREVfTFBDU1NDQUNIRUlURU0gcEl0ZW0gPSBOVUxMOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBzekl0ZW07DQogICAgIHdoaWxlIChwb3MgIT0gTlVMTCkgew0KLSAgICAgICAgbV9TdHlsZXNoZWV0cy5HZXROZXh0QXNzb2MocG9zLCBzektleSwgcFZhbHVlKTsNCi0gICAgICAgIHN3aXRjaCAoc3pLZXkuR2V0SUQoKSkgew0KLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCcjJywgJ1UnLCAnUycsICdFJyk6DQotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJyMnLCAnQScsICdHJywgJ0UnKToNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBGREVfTFBDU1NDQUNIRUlURU0gcCA9IChGREVfTFBDU1NDQUNIRUlURU0pcFZhbHVlOw0KLSAgICAgICAgaWYgKHBJdGVtID09IE5VTEwgfHwgcEl0ZW0tPmR3QWN0aXZpdHkgPiBwLT5kd0FjdGl2aXR5KSB7DQotICAgICAgICAgICAgc3pJdGVtID0gc3pLZXk7DQotICAgICAgICAgICAgcEl0ZW0gPSBwOw0KLSAgICAgICAgfQ0KKyAgICAgIG1fU3R5bGVzaGVldHMuR2V0TmV4dEFzc29jKHBvcywgc3pLZXksIHBWYWx1ZSk7DQorICAgICAgRkRFX0RlbGV0ZVdpdGgoRkRFX0NTU0NBQ0hFSVRFTSwgbV9wRml4ZWRTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAoRkRFX0xQQ1NTQ0FDSEVJVEVNKXBWYWx1ZSk7DQogICAgIH0NCi0gICAgaWYgKHBJdGVtICE9IE5VTEwpIHsNCi0gICAgICAgIEZERV9EZWxldGVXaXRoKEZERV9DU1NDQUNIRUlURU0sIG1fcEZpeGVkU3RvcmUsIHBJdGVtKTsNCi0gICAgICAgIG1fU3R5bGVzaGVldHMuUmVtb3ZlS2V5KHN6SXRlbSk7DQorICAgIG1fU3R5bGVzaGVldHMuUmVtb3ZlQWxsKCk7DQorICB9DQorICBpZiAobV9wRml4ZWRTdG9yZSAhPSBOVUxMKSB7DQorICAgIG1fcEZpeGVkU3RvcmUtPlJlbGVhc2UoKTsNCisgIH0NCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTo6QWRkU3R5bGVTaGVldChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NTdHlsZVNoZWV0KiBwU3R5bGVTaGVldCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBTdHlsZVNoZWV0ICE9IE5VTEwpOw0KKyAgaWYgKG1fcEZpeGVkU3RvcmUgPT0gTlVMTCkgew0KKyAgICBtX3BGaXhlZFN0b3JlID0gRlhfQ3JlYXRlQWxsb2NhdG9yKA0KKyAgICAgICAgRlhfQUxMT0NUWVBFX0ZpeGVkLCBGWF9NQVgoMTAsIG1faU1heEl0ZW1zKSwgc2l6ZW9mKEZERV9DU1NDQUNIRUlURU0pKTsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEZpeGVkU3RvcmUgIT0gTlVMTCk7DQorICB9DQorICB2b2lkKiBwVmFsdWUgPSBOVUxMOw0KKyAgaWYgKG1fU3R5bGVzaGVldHMuTG9va3VwKHN6S2V5LCBwVmFsdWUpKSB7DQorICAgIEZERV9MUENTU0NBQ0hFSVRFTSBwSXRlbSA9IChGREVfTFBDU1NDQUNIRUlURU0pcFZhbHVlOw0KKyAgICBpZiAocEl0ZW0tPnBTdHlsZXNoZWV0ICE9IHBTdHlsZVNoZWV0KSB7DQorICAgICAgcEl0ZW0tPnBTdHlsZXNoZWV0LT5SZWxlYXNlKCk7DQorICAgICAgcEl0ZW0tPnBTdHlsZXNoZWV0ID0gcFN0eWxlU2hlZXQ7DQorICAgICAgcEl0ZW0tPnBTdHlsZXNoZWV0LT5BZGRSZWYoKTsNCisgICAgICBwSXRlbS0+ZHdBY3Rpdml0eSA9IDA7DQogICAgIH0NCi19DQotX0ZERV9DU1NUQUdDQUNIRTo6X0ZERV9DU1NUQUdDQUNIRShfRkRFX0NTU1RBR0NBQ0hFICpwYXJlbnQsIElGREVfQ1NTVGFnUHJvdmlkZXIgKnRhZykNCi0gICAgOiBwVGFnKHRhZykNCi0gICAgLCBwUGFyZW50KHBhcmVudCkNCi0gICAgLCBkd0lESGFzaCgwKQ0KLSAgICAsIGR3VGFnSGFzaCgwKQ0KLSAgICAsIGlDbGFzc0luZGV4KDApDQotICAgICwgZHdDbGFzc0hhc2hzKDEpDQotew0KLSAgICBGWFNZU19hc3NlcnQocFRhZyAhPSBOVUxMKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWUsIHdzTmFtZSA9IHBUYWctPkdldFRhZ05hbWUoKTsNCi0gICAgZHdUYWdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCksIFRSVUUpOw0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwVGFnLT5HZXRGaXJzdEF0dHJpYnV0ZSgpOw0KLSAgICB3aGlsZSAocG9zICE9IE5VTEwpIHsNCi0gICAgICAgIHBUYWctPkdldE5leHRBdHRyaWJ1dGUocG9zLCB3c05hbWUsIHdzVmFsdWUpOw0KLSAgICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgd3NOYW1lLkdldExlbmd0aCgpLCBUUlVFKTsNCi0gICAgICAgIHN0YXRpYyBjb25zdCBGWF9EV09SRCBzX2R3SURIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoTCJpZCIsIDIsIFRSVUUpOw0KLSAgICAgICAgc3RhdGljIGNvbnN0IEZYX0RXT1JEIHNfZHdDbGFzc0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhMImNsYXNzIiwgNSwgVFJVRSk7DQotICAgICAgICBpZiAoZHdOYW1lSGFzaCA9PSBzX2R3Q2xhc3NIYXNoKSB7DQotICAgICAgICAgICAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgZHdDbGFzc0hhc2hzLkFkZChkd0hhc2gpOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd05hbWVIYXNoID09IHNfZHdJREhhc2gpIHsNCi0gICAgICAgICAgICBkd0lESGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzVmFsdWUuR2V0UHRyKCksIHdzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgd2hpbGUgKG1fU3R5bGVzaGVldHMuR2V0Q291bnQoKSA+PSBtX2lNYXhJdGVtcykgew0KKyAgICAgIFJlbW92ZUxvd2VzdEFjdGl2aXR5SXRlbSgpOw0KICAgICB9DQorICAgIEZERV9MUENTU0NBQ0hFSVRFTSBwSXRlbSA9DQorICAgICAgICBGREVfTmV3V2l0aChtX3BGaXhlZFN0b3JlKSBGREVfQ1NTQ0FDSEVJVEVNKHBTdHlsZVNoZWV0KTsNCisgICAgRlhTWVNfYXNzZXJ0KHBJdGVtICE9IE5VTEwpOw0KKyAgICBtX1N0eWxlc2hlZXRzLlNldEF0KHN6S2V5LCBwSXRlbSk7DQorICB9DQogfQ0KLV9GREVfQ1NTVEFHQ0FDSEU6Ol9GREVfQ1NTVEFHQ0FDSEUoY29uc3QgX0ZERV9DU1NUQUdDQUNIRSAmaXQpDQotICAgIDogcFRhZyhpdC5wVGFnKQ0KLSAgICAsIHBQYXJlbnQoaXQucFBhcmVudCkNCi0gICAgLCBkd0lESGFzaChpdC5kd0lESGFzaCkNCi0gICAgLCBkd1RhZ0hhc2goaXQuZHdUYWdIYXNoKQ0KLSAgICAsIGlDbGFzc0luZGV4KDApDQotICAgICwgZHdDbGFzc0hhc2hzKDEpDQotew0KLSAgICBpZiAoaXQuZHdDbGFzc0hhc2hzLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgIGR3Q2xhc3NIYXNocy5Db3B5KGl0LmR3Q2xhc3NIYXNocyk7DQorSUZERV9DU1NTdHlsZVNoZWV0KiBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTo6R2V0U3R5bGVTaGVldCgNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzektleSkgY29uc3Qgew0KKyAgdm9pZCogcFZhbHVlID0gTlVMTDsNCisgIGlmIChtX1N0eWxlc2hlZXRzLkxvb2t1cChzektleSwgcFZhbHVlKSkgew0KKyAgICBGREVfTFBDU1NDQUNIRUlURU0gcEl0ZW0gPSAoRkRFX0xQQ1NTQ0FDSEVJVEVNKXBWYWx1ZTsNCisgICAgcEl0ZW0tPmR3QWN0aXZpdHkrKzsNCisgICAgcEl0ZW0tPnBTdHlsZXNoZWV0LT5BZGRSZWYoKTsNCisgICAgcmV0dXJuIHBJdGVtLT5wU3R5bGVzaGVldDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCit2b2lkIENGREVfQ1NTU3R5bGVTaGVldENhY2hlOjpSZW1vdmVTdHlsZVNoZWV0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pLZXkpIHsNCisgIHZvaWQqIHBWYWx1ZSA9IE5VTEw7DQorICBpZiAoIW1fU3R5bGVzaGVldHMuTG9va3VwKHN6S2V5LCBwVmFsdWUpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZERV9EZWxldGVXaXRoKEZERV9DU1NDQUNIRUlURU0sIG1fcEZpeGVkU3RvcmUsIChGREVfTFBDU1NDQUNIRUlURU0pcFZhbHVlKTsNCisgIG1fU3R5bGVzaGVldHMuUmVtb3ZlS2V5KHN6S2V5KTsNCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTo6UmVtb3ZlTG93ZXN0QWN0aXZpdHlJdGVtKCkgew0KKyAgRlhfUE9TSVRJT04gcG9zID0gbV9TdHlsZXNoZWV0cy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICBDRlhfQnl0ZVN0cmluZyBzektleTsNCisgIHZvaWQqIHBWYWx1ZTsNCisgIEZERV9MUENTU0NBQ0hFSVRFTSBwSXRlbSA9IE5VTEw7DQorICBDRlhfQnl0ZVN0cmluZyBzekl0ZW07DQorICB3aGlsZSAocG9zICE9IE5VTEwpIHsNCisgICAgbV9TdHlsZXNoZWV0cy5HZXROZXh0QXNzb2MocG9zLCBzektleSwgcFZhbHVlKTsNCisgICAgc3dpdGNoIChzektleS5HZXRJRCgpKSB7DQorICAgICAgY2FzZSBGWEJTVFJfSUQoJyMnLCAnVScsICdTJywgJ0UnKToNCisgICAgICBjYXNlIEZYQlNUUl9JRCgnIycsICdBJywgJ0cnLCAnRScpOg0KKyAgICAgICAgY29udGludWU7DQogICAgIH0NCisgICAgRkRFX0xQQ1NTQ0FDSEVJVEVNIHAgPSAoRkRFX0xQQ1NTQ0FDSEVJVEVNKXBWYWx1ZTsNCisgICAgaWYgKHBJdGVtID09IE5VTEwgfHwgcEl0ZW0tPmR3QWN0aXZpdHkgPiBwLT5kd0FjdGl2aXR5KSB7DQorICAgICAgc3pJdGVtID0gc3pLZXk7DQorICAgICAgcEl0ZW0gPSBwOw0KKyAgICB9DQorICB9DQorICBpZiAocEl0ZW0gIT0gTlVMTCkgew0KKyAgICBGREVfRGVsZXRlV2l0aChGREVfQ1NTQ0FDSEVJVEVNLCBtX3BGaXhlZFN0b3JlLCBwSXRlbSk7DQorICAgIG1fU3R5bGVzaGVldHMuUmVtb3ZlS2V5KHN6SXRlbSk7DQorICB9DQogfQ0KLXZvaWQgQ0ZERV9DU1NBY2NlbGVyYXRvcjo6T25FbnRlclRhZyhJRkRFX0NTU1RhZ1Byb3ZpZGVyICpwVGFnKQ0KLXsNCi0gICAgRkRFX0NTU1RBR0NBQ0hFICpwVG9wID0gR2V0VG9wRWxlbWVudCgpOw0KLSAgICBGREVfQ1NTVEFHQ0FDSEUgaXRlbShwVG9wLCBwVGFnKTsNCi0gICAgbV9TdGFjay5QdXNoKGl0ZW0pOw0KK19GREVfQ1NTVEFHQ0FDSEU6Ol9GREVfQ1NTVEFHQ0FDSEUoX0ZERV9DU1NUQUdDQUNIRSogcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NUYWdQcm92aWRlciogdGFnKQ0KKyAgICA6IHBUYWcodGFnKSwNCisgICAgICBwUGFyZW50KHBhcmVudCksDQorICAgICAgZHdJREhhc2goMCksDQorICAgICAgZHdUYWdIYXNoKDApLA0KKyAgICAgIGlDbGFzc0luZGV4KDApLA0KKyAgICAgIGR3Q2xhc3NIYXNocygxKSB7DQorICBGWFNZU19hc3NlcnQocFRhZyAhPSBOVUxMKTsNCisgIENGWF9XaWRlU3RyaW5nQyB3c1ZhbHVlLCB3c05hbWUgPSBwVGFnLT5HZXRUYWdOYW1lKCk7DQorICBkd1RhZ0hhc2ggPQ0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgd3NOYW1lLkdldExlbmd0aCgpLCBUUlVFKTsNCisgIEZYX1BPU0lUSU9OIHBvcyA9IHBUYWctPkdldEZpcnN0QXR0cmlidXRlKCk7DQorICB3aGlsZSAocG9zICE9IE5VTEwpIHsNCisgICAgcFRhZy0+R2V0TmV4dEF0dHJpYnV0ZShwb3MsIHdzTmFtZSwgd3NWYWx1ZSk7DQorICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPQ0KKyAgICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgc19kd0lESGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEwiaWQiLCAyLCBUUlVFKTsNCisgICAgc3RhdGljIGNvbnN0IEZYX0RXT1JEIHNfZHdDbGFzc0hhc2ggPQ0KKyAgICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoTCJjbGFzcyIsIDUsIFRSVUUpOw0KKyAgICBpZiAoZHdOYW1lSGFzaCA9PSBzX2R3Q2xhc3NIYXNoKSB7DQorICAgICAgRlhfRFdPUkQgZHdIYXNoID0NCisgICAgICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgZHdDbGFzc0hhc2hzLkFkZChkd0hhc2gpOw0KKyAgICB9IGVsc2UgaWYgKGR3TmFtZUhhc2ggPT0gc19kd0lESGFzaCkgew0KKyAgICAgIGR3SURIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgIH0NCisgIH0NCiB9DQotdm9pZCBDRkRFX0NTU0FjY2VsZXJhdG9yOjpPbkxlYXZlVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcpDQotew0KLSAgICBGREVfQ1NTVEFHQ0FDSEUgKnBJdGVtID0gbV9TdGFjay5HZXRUb3BFbGVtZW50KCk7DQotICAgIEZYU1lTX2Fzc2VydChwSXRlbSAmJiBwSXRlbS0+R2V0VGFnKCkgPT0gcFRhZyk7DQotICAgIG1fU3RhY2suUG9wKCk7DQorX0ZERV9DU1NUQUdDQUNIRTo6X0ZERV9DU1NUQUdDQUNIRShjb25zdCBfRkRFX0NTU1RBR0NBQ0hFJiBpdCkNCisgICAgOiBwVGFnKGl0LnBUYWcpLA0KKyAgICAgIHBQYXJlbnQoaXQucFBhcmVudCksDQorICAgICAgZHdJREhhc2goaXQuZHdJREhhc2gpLA0KKyAgICAgIGR3VGFnSGFzaChpdC5kd1RhZ0hhc2gpLA0KKyAgICAgIGlDbGFzc0luZGV4KDApLA0KKyAgICAgIGR3Q2xhc3NIYXNocygxKSB7DQorICBpZiAoaXQuZHdDbGFzc0hhc2hzLkdldFNpemUoKSA+IDApIHsNCisgICAgZHdDbGFzc0hhc2hzLkNvcHkoaXQuZHdDbGFzc0hhc2hzKTsNCisgIH0NCit9DQordm9pZCBDRkRFX0NTU0FjY2VsZXJhdG9yOjpPbkVudGVyVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIqIHBUYWcpIHsNCisgIEZERV9DU1NUQUdDQUNIRSogcFRvcCA9IEdldFRvcEVsZW1lbnQoKTsNCisgIEZERV9DU1NUQUdDQUNIRSBpdGVtKHBUb3AsIHBUYWcpOw0KKyAgbV9TdGFjay5QdXNoKGl0ZW0pOw0KK30NCit2b2lkIENGREVfQ1NTQWNjZWxlcmF0b3I6Ok9uTGVhdmVUYWcoSUZERV9DU1NUYWdQcm92aWRlciogcFRhZykgew0KKyAgRkRFX0NTU1RBR0NBQ0hFKiBwSXRlbSA9IG1fU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgRlhTWVNfYXNzZXJ0KHBJdGVtICYmIHBJdGVtLT5HZXRUYWcoKSA9PSBwVGFnKTsNCisgIG1fU3RhY2suUG9wKCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2NhY2hlLmggYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5oCmluZGV4IGQ0MjMwNTguLmE1Yjg1YjcgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2NhY2hlLmgKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzY2FjaGUuaApAQCAtNyw5MSArNyw2OCBAQAogI2lmbmRlZiBfRkRFX0NTU0NBQ0hFDQogI2RlZmluZSBfRkRFX0NTU0NBQ0hFDQogdHlwZWRlZiBzdHJ1Y3QgX0ZERV9DU1NDQUNIRUlURU0gOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQotICAgIF9GREVfQ1NTQ0FDSEVJVEVNKElGREVfQ1NTU3R5bGVTaGVldCAqcCk7DQotICAgIH5fRkRFX0NTU0NBQ0hFSVRFTSgpOw0KLSAgICBJRkRFX0NTU1N0eWxlU2hlZXQJCQkJKnBTdHlsZXNoZWV0Ow0KLSAgICBGWF9EV09SRAkJCQkJCWR3QWN0aXZpdHk7DQotfSBGREVfQ1NTQ0FDSEVJVEVNLCAqIEZERV9MUENTU0NBQ0hFSVRFTTsNCi1jbGFzcyBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZSA6IHB1YmxpYyBJRkRFX0NTU1N0eWxlU2hlZXRDYWNoZSwgcHVibGljIENGWF9UaHJlYWRMb2NrLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfQ1NTU3R5bGVTaGVldENhY2hlKCk7DQotICAgIH5DRkRFX0NTU1N0eWxlU2hlZXRDYWNoZSgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KKyAgX0ZERV9DU1NDQUNIRUlURU0oSUZERV9DU1NTdHlsZVNoZWV0KiBwKTsNCisgIH5fRkRFX0NTU0NBQ0hFSVRFTSgpOw0KKyAgSUZERV9DU1NTdHlsZVNoZWV0KiBwU3R5bGVzaGVldDsNCisgIEZYX0RXT1JEIGR3QWN0aXZpdHk7DQorfSBGREVfQ1NTQ0FDSEVJVEVNLCAqRkRFX0xQQ1NTQ0FDSEVJVEVNOw0KK2NsYXNzIENGREVfQ1NTU3R5bGVTaGVldENhY2hlIDogcHVibGljIElGREVfQ1NTU3R5bGVTaGVldENhY2hlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENGWF9UaHJlYWRMb2NrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZSgpOw0KKyAgfkNGREVfQ1NTU3R5bGVTaGVldENhY2hlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRNYXhJdGVtcyhpbnQzMl90IGlNYXhDb3VudCA9IDUpDQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChpTWF4Q291bnQgPj0gMyk7DQotICAgICAgICBtX2lNYXhJdGVtcyA9IGlNYXhDb3VudDsNCi0gICAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldE1heEl0ZW1zKGludDMyX3QgaU1heENvdW50ID0gNSkgew0KKyAgICBGWFNZU19hc3NlcnQoaU1heENvdW50ID49IDMpOw0KKyAgICBtX2lNYXhJdGVtcyA9IGlNYXhDb3VudDsNCisgIH0NCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCQlBZGRTdHlsZVNoZWV0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pLZXksIElGREVfQ1NTU3R5bGVTaGVldCAqcFN0eWxlU2hlZXQpOw0KLSAgICB2aXJ0dWFsIElGREVfQ1NTU3R5bGVTaGVldCoJCUdldFN0eWxlU2hlZXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzektleSkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJUmVtb3ZlU3R5bGVTaGVldChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5KTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJCQkJCQkJUmVtb3ZlTG93ZXN0QWN0aXZpdHlJdGVtKCk7DQotICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIJCQltX1N0eWxlc2hlZXRzOw0KLSAgICBJRlhfTUVNQWxsb2NhdG9yCQkJCSptX3BGaXhlZFN0b3JlOw0KLSAgICBpbnQzMl90CQkJCQkJbV9pTWF4SXRlbXM7DQorICB2aXJ0dWFsIHZvaWQgQWRkU3R5bGVTaGVldChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NTdHlsZVNoZWV0KiBwU3R5bGVTaGVldCk7DQorICB2aXJ0dWFsIElGREVfQ1NTU3R5bGVTaGVldCogR2V0U3R5bGVTaGVldChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBSZW1vdmVTdHlsZVNoZWV0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pLZXkpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIFJlbW92ZUxvd2VzdEFjdGl2aXR5SXRlbSgpOw0KKyAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0ciBtX1N0eWxlc2hlZXRzOw0KKyAgSUZYX01FTUFsbG9jYXRvciogbV9wRml4ZWRTdG9yZTsNCisgIGludDMyX3QgbV9pTWF4SXRlbXM7DQogfTsNCiB0eXBlZGVmIHN0cnVjdCBfRkRFX0NTU1RBR0NBQ0hFIDogcHVibGljIENGWF9UYXJnZXQgew0KLXB1YmxpYzoNCi0gICAgX0ZERV9DU1NUQUdDQUNIRShfRkRFX0NTU1RBR0NBQ0hFICpwYXJlbnQsIElGREVfQ1NTVGFnUHJvdmlkZXIgKnRhZyk7DQotICAgIF9GREVfQ1NTVEFHQ0FDSEUoY29uc3QgX0ZERV9DU1NUQUdDQUNIRSAmaXQpOw0KLSAgICBfRkRFX0NTU1RBR0NBQ0hFKgkJCQlHZXRQYXJlbnQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gcFBhcmVudDsNCi0gICAgfQ0KLSAgICBJRkRFX0NTU1RhZ1Byb3ZpZGVyKgkJCUdldFRhZygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBwVGFnOw0KLSAgICB9DQotICAgIEZYX0RXT1JECQkJCQkJSGFzaElEKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGR3SURIYXNoOw0KLSAgICB9DQotICAgIEZYX0RXT1JECQkJCQkJSGFzaFRhZygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBkd1RhZ0hhc2g7DQotICAgIH0NCi0gICAgaW50MzJfdAkJCQkJCUNvdW50SGFzaENsYXNzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGR3Q2xhc3NIYXNocy5HZXRTaXplKCk7DQotICAgIH0NCi0gICAgdm9pZAkJCQkJCQlTZXRDbGFzc0luZGV4KGludDMyX3QgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIGlDbGFzc0luZGV4ID0gaW5kZXg7DQotICAgIH0NCi0gICAgRlhfRFdPUkQJCQkJCQlIYXNoQ2xhc3MoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gaUNsYXNzSW5kZXggPCBkd0NsYXNzSGFzaHMuR2V0U2l6ZSgpID8gZHdDbGFzc0hhc2hzLkdldEF0KGlDbGFzc0luZGV4KSA6IDA7DQotICAgIH0NCi1wcm90ZWN0ZWQ6DQotICAgIElGREVfQ1NTVGFnUHJvdmlkZXIJCQkJKnBUYWc7DQotICAgIF9GREVfQ1NTVEFHQ0FDSEUJCQkJKnBQYXJlbnQ7DQotICAgIEZYX0RXT1JECQkJCQkJZHdJREhhc2g7DQotICAgIEZYX0RXT1JECQkJCQkJZHdUYWdIYXNoOw0KLSAgICBpbnQzMl90CQkJCQkJaUNsYXNzSW5kZXg7DQotICAgIENGREVfRFdvcmRBcnJheQkJCQkJZHdDbGFzc0hhc2hzOw0KLX0gRkRFX0NTU1RBR0NBQ0hFLCAqIEZERV9MUENTU1RBR0NBQ0hFOw0KKyBwdWJsaWM6DQorICBfRkRFX0NTU1RBR0NBQ0hFKF9GREVfQ1NTVEFHQ0FDSEUqIHBhcmVudCwgSUZERV9DU1NUYWdQcm92aWRlciogdGFnKTsNCisgIF9GREVfQ1NTVEFHQ0FDSEUoY29uc3QgX0ZERV9DU1NUQUdDQUNIRSYgaXQpOw0KKyAgX0ZERV9DU1NUQUdDQUNIRSogR2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gcFBhcmVudDsgfQ0KKyAgSUZERV9DU1NUYWdQcm92aWRlciogR2V0VGFnKCkgY29uc3QgeyByZXR1cm4gcFRhZzsgfQ0KKyAgRlhfRFdPUkQgSGFzaElEKCkgY29uc3QgeyByZXR1cm4gZHdJREhhc2g7IH0NCisgIEZYX0RXT1JEIEhhc2hUYWcoKSBjb25zdCB7IHJldHVybiBkd1RhZ0hhc2g7IH0NCisgIGludDMyX3QgQ291bnRIYXNoQ2xhc3MoKSBjb25zdCB7IHJldHVybiBkd0NsYXNzSGFzaHMuR2V0U2l6ZSgpOyB9DQorICB2b2lkIFNldENsYXNzSW5kZXgoaW50MzJfdCBpbmRleCkgeyBpQ2xhc3NJbmRleCA9IGluZGV4OyB9DQorICBGWF9EV09SRCBIYXNoQ2xhc3MoKSBjb25zdCB7DQorICAgIHJldHVybiBpQ2xhc3NJbmRleCA8IGR3Q2xhc3NIYXNocy5HZXRTaXplKCkNCisgICAgICAgICAgICAgICA/IGR3Q2xhc3NIYXNocy5HZXRBdChpQ2xhc3NJbmRleCkNCisgICAgICAgICAgICAgICA6IDA7DQorICB9DQorDQorIHByb3RlY3RlZDoNCisgIElGREVfQ1NTVGFnUHJvdmlkZXIqIHBUYWc7DQorICBfRkRFX0NTU1RBR0NBQ0hFKiBwUGFyZW50Ow0KKyAgRlhfRFdPUkQgZHdJREhhc2g7DQorICBGWF9EV09SRCBkd1RhZ0hhc2g7DQorICBpbnQzMl90IGlDbGFzc0luZGV4Ow0KKyAgQ0ZERV9EV29yZEFycmF5IGR3Q2xhc3NIYXNoczsNCit9IEZERV9DU1NUQUdDQUNIRSwgKkZERV9MUENTU1RBR0NBQ0hFOw0KIHR5cGVkZWYgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGU8RkRFX0NTU1RBR0NBQ0hFPiBDRkRFX0NTU1RhZ1N0YWNrOw0KLWNsYXNzIENGREVfQ1NTQWNjZWxlcmF0b3IgOiBwdWJsaWMgSUZERV9DU1NBY2NlbGVyYXRvciwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCU9uRW50ZXJUYWcoSUZERV9DU1NUYWdQcm92aWRlciAqcFRhZyk7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJT25MZWF2ZVRhZyhJRkRFX0NTU1RhZ1Byb3ZpZGVyICpwVGFnKTsNCi0gICAgdm9pZAkJCQkJCQlDbGVhcigpDQotICAgIHsNCi0gICAgICAgIG1fU3RhY2suUmVtb3ZlQWxsKCk7DQotICAgIH0NCi0gICAgRkRFX0xQQ1NTVEFHQ0FDSEUJCQkJR2V0VG9wRWxlbWVudCgpCWNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX1N0YWNrLkdldFRvcEVsZW1lbnQoKTsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgQ0ZERV9DU1NUYWdTdGFjawkJCQltX1N0YWNrOw0KK2NsYXNzIENGREVfQ1NTQWNjZWxlcmF0b3IgOiBwdWJsaWMgSUZERV9DU1NBY2NlbGVyYXRvciwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIHZvaWQgT25FbnRlclRhZyhJRkRFX0NTU1RhZ1Byb3ZpZGVyKiBwVGFnKTsNCisgIHZpcnR1YWwgdm9pZCBPbkxlYXZlVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIqIHBUYWcpOw0KKyAgdm9pZCBDbGVhcigpIHsgbV9TdGFjay5SZW1vdmVBbGwoKTsgfQ0KKyAgRkRFX0xQQ1NTVEFHQ0FDSEUgR2V0VG9wRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fU3RhY2suR2V0VG9wRWxlbWVudCgpOyB9DQorDQorIHByb3RlY3RlZDoNCisgIENGREVfQ1NTVGFnU3RhY2sgbV9TdGFjazsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkYXRhdGFibGUuY3BwCmluZGV4IDEyNmEzNzQuLmZjNzRhYmEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5jcHAKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGF0YXRhYmxlLmNwcApAQCAtOSw3MjEgKzksODc3IEBACiAjaWZkZWYgX2NwbHVzcGx1cw0KIGV4dGVybiAiQyIgew0KICNlbmRpZg0KLSAgICBGWF9CT09MIEZERV9DU1NMZW5ndGhUb0Zsb2F0KGNvbnN0IEZERV9DU1NMRU5HVEggJmxlbiwgRlhfRkxPQVQgZlBlcmNlbnRCYXNlLCBGWF9GTE9BVCAmZlJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgc3dpdGNoIChsZW4uR2V0VW5pdCgpKSB7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludDoNCi0gICAgICAgICAgICAgICAgZlJlc3VsdCA9IGxlbi5HZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NMRU5HVEhVTklUX1BlcmNlbnQ6DQotICAgICAgICAgICAgICAgIGZSZXN1bHQgPSBsZW4uR2V0VmFsdWUoKSAqIGZQZXJjZW50QmFzZTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KK0ZYX0JPT0wgRkRFX0NTU0xlbmd0aFRvRmxvYXQoY29uc3QgRkRFX0NTU0xFTkdUSCYgbGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlcmNlbnRCYXNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZSZXN1bHQpIHsNCisgIHN3aXRjaCAobGVuLkdldFVuaXQoKSkgew0KKyAgICBjYXNlIEZERV9DU1NMRU5HVEhVTklUX1BvaW50Og0KKyAgICAgIGZSZXN1bHQgPSBsZW4uR2V0VmFsdWUoKTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBGREVfQ1NTTEVOR1RIVU5JVF9QZXJjZW50Og0KKyAgICAgIGZSZXN1bHQgPSBsZW4uR2V0VmFsdWUoKSAqIGZQZXJjZW50QmFzZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorfQ0KK0NGWF9GbG9hdFJlY3QgRkRFX0NTU0JvdW5kYXJ5VG9SZWN0KElGREVfQ1NTQm91bmRhcnlTdHlsZSogcEJvdW5kU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRhaW5lcldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhZGRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQm9yZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1hcmdpbikgew0KKyAgRlhTWVNfYXNzZXJ0KHBCb3VuZFN0eWxlICE9IE5VTEwpOw0KKyAgRlhfRkxPQVQgZlJlc3VsdDsNCisgIGNvbnN0IEZERV9DU1NSRUNUKiBwUmVjdDsNCisgIENGWF9GbG9hdFJlY3QgcmVjdCgwLCAwLCAwLCAwKTsNCisgIGlmIChiUGFkZGluZykgew0KKyAgICBwUmVjdCA9IHBCb3VuZFN0eWxlLT5HZXRQYWRkaW5nV2lkdGgoKTsNCisgICAgaWYgKHBSZWN0ICE9IE5VTEwpIHsNCisgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPmxlZnQsIGZDb250YWluZXJXaWR0aCwgZlJlc3VsdCkpIHsNCisgICAgICAgIHJlY3QubGVmdCArPSBmUmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPnRvcCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgcmVjdC50b3AgKz0gZlJlc3VsdDsNCisgICAgICB9DQorICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5yaWdodCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgcmVjdC5yaWdodCArPSBmUmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPmJvdHRvbSwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgcmVjdC5ib3R0b20gKz0gZlJlc3VsdDsNCisgICAgICB9DQogICAgIH0NCi0gICAgQ0ZYX0Zsb2F0UmVjdCBGREVfQ1NTQm91bmRhcnlUb1JlY3QoSUZERV9DU1NCb3VuZGFyeVN0eWxlICpwQm91bmRTdHlsZSwgRlhfRkxPQVQgZkNvbnRhaW5lcldpZHRoLCBGWF9CT09MIGJQYWRkaW5nLCBGWF9CT09MIGJCb3JkZXIsIEZYX0JPT0wgYk1hcmdpbikNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBCb3VuZFN0eWxlICE9IE5VTEwpOw0KLSAgICAgICAgRlhfRkxPQVQgZlJlc3VsdDsNCi0gICAgICAgIGNvbnN0IEZERV9DU1NSRUNUICpwUmVjdDsNCi0gICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdCgwLCAwLCAwLCAwKTsNCi0gICAgICAgIGlmIChiUGFkZGluZykgew0KLSAgICAgICAgICAgIHBSZWN0ID0gcEJvdW5kU3R5bGUtPkdldFBhZGRpbmdXaWR0aCgpOw0KLSAgICAgICAgICAgIGlmIChwUmVjdCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+bGVmdCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ICs9IGZSZXN1bHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT50b3AsIGZDb250YWluZXJXaWR0aCwgZlJlc3VsdCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlY3QudG9wICs9IGZSZXN1bHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5yaWdodCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCArPSBmUmVzdWx0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+Ym90dG9tLCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQotICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSArPSBmUmVzdWx0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJCb3JkZXIpIHsNCi0gICAgICAgICAgICBwUmVjdCA9IHBCb3VuZFN0eWxlLT5HZXRCb3JkZXJXaWR0aCgpOw0KLSAgICAgICAgICAgIGlmIChwUmVjdCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+bGVmdCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ICs9IGZSZXN1bHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT50b3AsIGZDb250YWluZXJXaWR0aCwgZlJlc3VsdCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlY3QudG9wICs9IGZSZXN1bHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5yaWdodCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCArPSBmUmVzdWx0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+Ym90dG9tLCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQotICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSArPSBmUmVzdWx0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJNYXJnaW4pIHsNCi0gICAgICAgICAgICBwUmVjdCA9IHBCb3VuZFN0eWxlLT5HZXRNYXJnaW5XaWR0aCgpOw0KLSAgICAgICAgICAgIGlmIChwUmVjdCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+bGVmdCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ICs9IGZSZXN1bHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT50b3AsIGZDb250YWluZXJXaWR0aCwgZlJlc3VsdCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlY3QudG9wICs9IGZSZXN1bHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5yaWdodCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCArPSBmUmVzdWx0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+Ym90dG9tLCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQotICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSArPSBmUmVzdWx0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlY3Q7DQorICB9DQorICBpZiAoYkJvcmRlcikgew0KKyAgICBwUmVjdCA9IHBCb3VuZFN0eWxlLT5HZXRCb3JkZXJXaWR0aCgpOw0KKyAgICBpZiAocFJlY3QgIT0gTlVMTCkgew0KKyAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+bGVmdCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgcmVjdC5sZWZ0ICs9IGZSZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+dG9wLCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICByZWN0LnRvcCArPSBmUmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPnJpZ2h0LCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICByZWN0LnJpZ2h0ICs9IGZSZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+Ym90dG9tLCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICByZWN0LmJvdHRvbSArPSBmUmVzdWx0Ow0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGWF9EV09SRCBGREVfQ1NTRm9udFN0eWxlVG9GREUoSUZERV9DU1NGb250U3R5bGUgKnBGb250U3R5bGUpDQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwRm9udFN0eWxlICE9IE5VTEwpOw0KLSAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGUgPSBGWF9GT05UU1RZTEVfTm9ybWFsOw0KLSAgICAgICAgaWYgKHBGb250U3R5bGUtPkdldEZvbnRTdHlsZSgpID09IEZERV9DU1NGT05UU1RZTEVfSXRhbGljKSB7DQotICAgICAgICAgICAgZHdGb250U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwRm9udFN0eWxlLT5HZXRGb250V2VpZ2h0KCkgPj0gNzAwKSB7DQotICAgICAgICAgICAgZHdGb250U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0JvbGQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZHdGb250U3R5bGU7DQorICB9DQorICBpZiAoYk1hcmdpbikgew0KKyAgICBwUmVjdCA9IHBCb3VuZFN0eWxlLT5HZXRNYXJnaW5XaWR0aCgpOw0KKyAgICBpZiAocFJlY3QgIT0gTlVMTCkgew0KKyAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+bGVmdCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgcmVjdC5sZWZ0ICs9IGZSZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+dG9wLCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICByZWN0LnRvcCArPSBmUmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPnJpZ2h0LCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICByZWN0LnJpZ2h0ICs9IGZSZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+Ym90dG9tLCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICByZWN0LmJvdHRvbSArPSBmUmVzdWx0Ow0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBzdGF0aWMgY29uc3QgRkRFX0NTU1BST1BFUlRZVEFCTEUgZ19GREVfQ1NTUHJvcGVydGllc1tdID0gew0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Xcml0aW5nTW9kZSwJTCJ3cml0aW5nLW1vZGUiLAkweDAxODc4MDc2LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVdpZHRoLAlMImNvbHVtbi1ydWxlLXdpZHRoIiwJMHgwMjAwRkIwMCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0LAlMImJvcmRlci1sZWZ0IiwJMHgwNDA4MDAzNiwJRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlLAlMImNvbHVtbi1ydWxlIiwJMHgwNEM4M0RGMywJRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9IZWlnaHQsCUwiaGVpZ2h0IiwJMHgwNUE1QzUxOSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Db3VudGVyUmVzZXQsCUwiY291bnRlci1yZXNldCIsCTB4MDg5NEY5QjAsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlciB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmd9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Db250ZW50LAlMImNvbnRlbnQiLAkweDA5N0JFOTFCLAlGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkkgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUnVieVBvc2l0aW9uLAlMInJ1YnktcG9zaXRpb24iLAkweDA5QUNEMDI0LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZENvbG9yLAlMImJhY2tncm91bmQtY29sb3IiLAkweDA5RThFOEFDLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfV2lkdGgsCUwid2lkdGgiLAkweDBBOEE4RjgwLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1NyYywJTCJzcmMiLAkweDBCRDM3MDQ4LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkl9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Ub3AsCUwidG9wIiwJMHgwQkVEQUYzMywJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9NYXJnaW4sCUwibWFyZ2luIiwJMHgwQ0IwMTZCRSwJRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQ29sb3IsCUwiYm9yZGVyLWNvbG9yIiwJMHgwQ0JCNTI4QSwJRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3J9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9XaWRvd3MsCUwid2lkb3dzIiwJMHgxMDI2QzU5RCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tQ29sb3IsCUwiYm9yZGVyLWJvdHRvbS1jb2xvciIsCTB4MTIxRTIyRUMsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3J9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0SW5kZW50LAlMInRleHQtaW5kZW50IiwJMHgxNjlBREI3NCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUmlnaHQsCUwicmlnaHQiLAkweDE5M0FERTNFLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpc1N0eWxlLAlMInRleHQtZW1waGFzaXMtc3R5bGUiLAkweDIwREJBRjRBLAlGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmd9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9QYWRkaW5nTGVmdCwJTCJwYWRkaW5nLWxlZnQiLAkweDIyOENGMDJGLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Db2x1bW5XaWR0aCwJTCJjb2x1bW4td2lkdGgiLAkweDI0QzlBQzlCLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX01hcmdpbkxlZnQsCUwibWFyZ2luLWxlZnQiLAkweDI5N0M1NjU2LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlciwJTCJib3JkZXIiLAkweDJBMjMzNDlFLAlGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcCwJTCJib3JkZXItdG9wIiwJMHgyQjg2NkFERSwJRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9SdWJ5T3ZlcmhhbmcsCUwicnVieS1vdmVyaGFuZyIsCTB4MkNDQTBEODksCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtCZWZvcmUsCUwicGFnZS1icmVhay1iZWZvcmUiLAkweDMxMTlCMzZGLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTWF4SGVpZ2h0LAlMIm1heC1oZWlnaHQiLAkweDM0MzU5N0VDLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9NaW5XaWR0aCwJTCJtaW4td2lkdGgiLAkweDM1ODMyODcxLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0Q29sb3IsCUwiYm9yZGVyLWxlZnQtY29sb3IiLAkweDM1QzY0MDIyLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm90dG9tLAlMImJvdHRvbSIsCTB4Mzk5RjAyQjUsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUXVvdGVzLAlMInF1b3RlcyIsCTB4M0Q4QzZBMDEsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmd9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9NYXhXaWR0aCwJTCJtYXgtd2lkdGgiLAkweDNFQTI3NEYzLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9QYWRkaW5nUmlnaHQsCUwicGFkZGluZy1yaWdodCIsCTB4M0Y2MTZBQzIsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZUltYWdlLAlMImxpc3Qtc3R5bGUtaW1hZ2UiLAkweDQyQThBODZBLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVVSSX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1doaXRlU3BhY2UsCUwid2hpdGUtc3BhY2UiLAkweDQyRjA0MjlBLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tLAlMImJvcmRlci1ib3R0b20iLAkweDQ1MkNFNzgwLAlGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZVR5cGUsCUwibGlzdC1zdHlsZS10eXBlIiwJMHg0ODA5NDc4OSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1dvcmRCcmVhaywJTCJ3b3JkLWJyZWFrIiwJMHg0RDc0QTNDRSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX092ZXJmbG93WCwJTCJvdmVyZmxvdy14IiwJMHg0RUNFQkY5OSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX092ZXJmbG93WSwJTCJvdmVyZmxvdy15IiwJMHg0RUNFQkY5QSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcENvbG9yLAlMImJvcmRlci10b3AtY29sb3IiLAkweDUxMDlCOENBLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfRm9udEZhbWlseSwJTCJmb250LWZhbWlseSIsCTB4NTc0Njg2RTYsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmd9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9DdXJzb3IsCUwiY3Vyc29yIiwJMHg1OURGQ0E1RSwJRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUnVieUFsaWduLAlMInJ1YnktYWxpZ24iLAkweDYwNzdCREZBLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZUNvbG9yLAlMImNvbHVtbi1ydWxlLWNvbG9yIiwJMHg2NURERkQ5RiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0ZvbnRXZWlnaHQsCUwiZm9udC13ZWlnaHQiLAkweDY2OTJGNjBDLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0U3R5bGUsCUwiYm9yZGVyLXJpZ2h0LXN0eWxlIiwJMHg2OTIwRERBNywJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX01pbkhlaWdodCwJTCJtaW4taGVpZ2h0IiwJMHg2QUFFMzEyQSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sb3IsCUwiY29sb3IiLAkweDZFNjc5MjFGLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTGV0dGVyU3BhY2luZywJTCJsZXR0ZXItc3BhY2luZyIsCTB4NzA1MzYxMDIsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfRW1wdHlDZWxscywJTCJlbXB0eS1jZWxscyIsCTB4NzUzMTUyOEYsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0QWxpZ24sCUwidGV4dC1hbGlnbiIsCTB4NzU1M0YxQkQsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9SdWJ5U3BhbiwJTCJydWJ5LXNwYW4iLAkweDc2RkNGQ0UxLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUZ1bmN0aW9ufSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUG9zaXRpb24sCUwicG9zaXRpb24iLAkweDgxNEY4MkI1LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyU3R5bGUsCUwiYm9yZGVyLXN0eWxlIiwJMHg4MkE0Q0Q1QywJRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSwJTCJib3JkZXItYm90dG9tLXN0eWxlIiwJMHg4ODA3OURCRSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlckNvbGxhcHNlLAlMImJvcmRlci1jb2xsYXBzZSIsCTB4ODg4M0M3RkUsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Db2x1bW5Db3VudCwJTCJjb2x1bW4tY291bnQiLAkweDg5OTM2QTY0LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGgsCUwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwJMHg4RjVBNjAzNiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Vbmljb2RlQmlkaSwJTCJ1bmljb2RlLWJpZGkiLAkweDkxNjcwRjZDLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfVmVydGljYWxBbGlnbiwJTCJ2ZXJ0aWNhbC1hbGlnbiIsCTB4OTM0QTg3RDIsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1RvcCwJTCJwYWRkaW5nLXRvcCIsCTB4OTU5RDIyQjcsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0NvbHVtbnMsCUwiY29sdW1ucyIsCTB4OTZGQTVEODEsCUZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3csCUwib3ZlcmZsb3ciLAkweDk3Qjc2QjU0LAlGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1RhYmxlTGF5b3V0LAlMInRhYmxlLWxheW91dCIsCTB4OUIxQ0I0QjMsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Gb250VmFyaWFudCwJTCJmb250LXZhcmlhbnQiLAkweDlDNzg1Nzc5LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlLAlMImxpc3Qtc3R5bGUiLAkweDlFNkM0NzFBLAlGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRQb3NpdGlvbiwJTCJiYWNrZ3JvdW5kLXBvc2l0aW9uIiwJMHhBODg0NkQyMiwJRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyV2lkdGgsCUwiYm9yZGVyLXdpZHRoIiwJMHhBOERFNEZFQiwJRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzQ29sb3IsCUwidGV4dC1lbXBoYXNpcy1jb2xvciIsCTB4QUFGMjM0NzgsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3J9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0U3R5bGUsCUwiYm9yZGVyLWxlZnQtc3R5bGUiLAkweEFCQUZCQUY0LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrSW5zaWRlLAlMInBhZ2UtYnJlYWstaW5zaWRlIiwJMHhBQ0I2OTVGOCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpcywJTCJ0ZXh0LWVtcGhhc2lzIiwJMHhBRDBFNTgwQywJRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21XaWR0aCwJTCJib3JkZXItYm90dG9tLXdpZHRoIiwJMHhBRTQxMjA0RCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Db2x1bW5HYXAsCUwiY29sdW1uLWdhcCIsCTB4QjVDMUJBNzMsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfT3JwaGFucywJTCJvcnBoYW5zIiwJMHhCNzE2NDY3QiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHQsCUwiYm9yZGVyLXJpZ2h0IiwJMHhCNzhFOUVBOSwJRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSwJTCJmb250LXNpemUiLAkweEI5Mzk1NkRGLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1BhZ2VCcmVha0FmdGVyLAlMInBhZ2UtYnJlYWstYWZ0ZXIiLAkweEJDMzU4QUVFLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ2FwdGlvblNpZGUsCUwiY2FwdGlvbi1zaWRlIiwJMHhDMDNGMzU2MCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRSZXBlYXQsCUwiYmFja2dyb3VuZC1yZXBlYXQiLAkweEMyQzJGRENFLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wU3R5bGUsCUwiYm9yZGVyLXRvcC1zdHlsZSIsCTB4QzZGMzMzOUMsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJTcGFjaW5nLAlMImJvcmRlci1zcGFjaW5nIiwJMHhDNzIwMzBGMCwJRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1RleHRUcmFuc2Zvcm0sCUwidGV4dC10cmFuc2Zvcm0iLAkweEM4OEVFQTZFLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfRm9udFN0eWxlLAlMImZvbnQtc3R5bGUiLAkweENCMTk1MEY1LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfRm9udCwJTCJmb250IiwJMHhDRDMwOEI3NywJRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9MaW5lSGVpZ2h0LAlMImxpbmUtaGVpZ2h0IiwJMHhDRkNBQ0UyRSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9NYXJnaW5SaWdodCwJTCJtYXJnaW4tcmlnaHQiLAkweEQxM0M1OEM5LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0Zsb2F0LAlMImZsb2F0IiwJMHhEMTUzMjg3NiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRXaWR0aCwJTCJib3JkZXItbGVmdC13aWR0aCIsCTB4RDFFOTNEODMsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfRGlzcGxheSwJTCJkaXNwbGF5IiwJMHhENDIyNEMzNiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0NsZWFyLAlMImNsZWFyIiwJMHhEOEVEMTQ2NywJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVTdHlsZSwJTCJjb2x1bW4tcnVsZS1zdHlsZSIsCTB4REJDNzc4NzEsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0Q29tYmluZSwJTCJ0ZXh0LWNvbWJpbmUiLAkweERDNTIwN0NGLAlGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVQb3NpdGlvbiwJTCJsaXN0LXN0eWxlLXBvc2l0aW9uIiwJMHhFMUExREUzQywJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1Zpc2liaWxpdHksCUwidmlzaWJpbGl0eSIsCTB4RTI5RjUxNjgsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9QYWRkaW5nQm90dG9tLAlMInBhZGRpbmctYm90dG9tIiwJMHhFNTU1QjNCOSwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZEF0dGFjaG1lbnQsCUwiYmFja2dyb3VuZC1hdHRhY2htZW50IiwJMHhFNzc5ODFGNiwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRJbWFnZSwJTCJiYWNrZ3JvdW5kLWltYWdlIiwJMHhFOUFFQjcxMCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkl9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9MaW5lQnJlYWssCUwibGluZS1icmVhayIsCTB4RUEyRDFEOUEsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kLAlMImJhY2tncm91bmQiLAkweEVCNDlERDQwLAlGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFdpZHRoLAlMImJvcmRlci10b3Atd2lkdGgiLAkweEVEMkNCNjJCLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1dvcmRTcGFjaW5nLAlMIndvcmQtc3BhY2luZyIsCTB4RURBNjNCQUUsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRDb2xvciwJTCJib3JkZXItcmlnaHQtY29sb3IiLAkweEYzMzc2MkQ1LAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfQ291bnRlckluY3JlbWVudCwJTCJjb3VudGVyLWluY3JlbWVudCIsCTB4RjRDRkIxQjIsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlciB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmd9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9MZWZ0LAlMImxlZnQiLAkweEY1QUQ3ODJCLAlGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX1RleHREZWNvcmF0aW9uLAlMInRleHQtZGVjb3JhdGlvbiIsCTB4RjdDNjM0QkEsCUZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFkZGluZywJTCJwYWRkaW5nIiwJMHhGOEMzNzNGNywJRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZX01hcmdpbkJvdHRvbSwJTCJtYXJnaW4tYm90dG9tIiwJMHhGOTM0ODVBMCwJRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWV9NYXJnaW5Ub3AsCUwibWFyZ2luLXRvcCIsCTB4RkU1MURDRkUsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlciB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlfRGlyZWN0aW9uLAlMImRpcmVjdGlvbiIsCTB4RkU3NDZFNjEsCUZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KLSAgICB9Ow0KLSAgICBzdGF0aWMgY29uc3QgRkRFX0NTU1BST1BFUlRZVkFMVUVUQUJMRSBnX0ZERV9DU1NQcm9wZXJ0eVZhbHVlc1tdID0gew0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0JvbGRlciwJTCJib2xkZXIiLAkweDAwOUYxMDU4fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckxhdGluLAlMImxvd2VyLWxhdGluIiwJMHgwMTYwMTRDRX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJjYXNlLAlMImxvd2VyY2FzZSIsCTB4MDJBQ0I4MDV9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyR3JlZWssCUwibG93ZXItZ3JlZWsiLAkweDAzRDgxRDY0fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TZXNhbWUsCUwic2VzYW1lIiwJMHgwNDMyRUNERX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZSwJTCJub25lIiwJMHgwNDhCNjY3MH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTndSZXNpemUsCUwibnctcmVzaXplIiwJMHgwNTRCNEJFNH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfV1Jlc2l6ZSwJTCJ3LXJlc2l6ZSIsCTB4MEEyRjhENzZ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdCwJTCJkb3QiLAkweDBBNDhDQjI3fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9FbmQsCUwiZW5kIiwJMHgwQTYzMTQzN30sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTHRyLAlMImx0ciIsCTB4MEIxQjU2RDJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZSwJTCJwcmUiLAkweDBCODQ4NTg3fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdGwsCUwicnRsIiwJMHgwQkI5MkM1Mn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU3ViLAlMInN1YiIsCTB4MEJEMzdGQUF9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RvcCwJTCJ0b3AiLAkweDBCRURBRjMzfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9WaXNpYmxlLAlMInZpc2libGUiLAkweDBGNTVEN0VFfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaWxsZWQsCUwiZmlsbGVkIiwJMHgxMDgyN0REMH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU3dSZXNpemUsCUwic3ctcmVzaXplIiwJMHgxMEI1NDhFOX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTm9SZXBlYXQsCUwibm8tcmVwZWF0IiwJMHgxMjM1QzE4Qn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGVmYXVsdCwJTCJkZWZhdWx0IiwJMHgxNERBMjEyNX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVHJhbnNwYXJlbnQsCUwidHJhbnNwYXJlbnQiLAkweDE3QjY0REIyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWRnZSwJTCJyaWRnZSIsCTB4MThFQkVFNEJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZ2h0LAlMInJpZ2h0IiwJMHgxOTNBREUzRX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSG9yaXpvbnRhbFRiLAlMImhvcml6b250YWwtdGIiLAkweDFBNjZBODZEfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXN0cmlidXRlTGV0dGVyLAlMImRpc3RyaWJ1dGUtbGV0dGVyIiwJMHgxRURCRDc1Q30sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlQ2lyY2xlLAlMImRvdWJsZS1jaXJjbGUiLAkweDFGRjA4MkJBfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5LAlMInJ1YnkiLAkweDIwRDY2QzAyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Db2xsYXBzZSwJTCJjb2xsYXBzZSIsCTB4MjEyOEQ2NzN9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbCwJTCJub3JtYWwiLAkweDI0N0NGM0U5fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Bdm9pZCwJTCJhdm9pZCIsCTB4MjRFNjg0QjN9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyUm9tYW4sCUwidXBwZXItcm9tYW4iLAkweDI4QkFDMkI2fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvLAlMImF1dG8iLAkweDJCMzVCNkQ5fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UZXh0LAlMInRleHQiLAkweDJEMDhBRjg1fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9YU21hbGwsCUwieC1zbWFsbCIsCTB4MkQyRkNBRkV9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RoaW4sCUwidGhpbiIsCTB4MkQ1NzRENTN9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdCwJTCJyZXBlYXQiLAkweDMwNjYxNEExfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbCwJTCJzbWFsbCIsCTB4MzE2QTM3Mzl9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05lUmVzaXplLAlMIm5lLXJlc2l6ZSIsCTB4MzFGRDVFMTJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05vQ29udGVudCwJTCJuby1jb250ZW50IiwJMHgzM0ExQzU0NX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfT3V0c2lkZSwJTCJvdXRzaWRlIiwJMHgzNkRGNjkzRH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRVJlc2l6ZSwJTCJlLXJlc2l6ZSIsCTB4MzZFMTlGQTR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlUm93LAlMInRhYmxlLXJvdyIsCTB4MzkxMkEwMkR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0JvdHRvbSwJTCJib3R0b20iLAkweDM5OUYwMkI1fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9VbmRlcmxpbmUsCUwidW5kZXJsaW5lIiwJMHgzQTAyNzNBNn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ2prSWRlb2dyYXBoaWMsCUwiY2prLWlkZW9ncmFwaGljIiwJMHgzQTY0MUNDNH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU2VSZXNpemUsCUwic2UtcmVzaXplIiwJMHgzRDY3NUIxN30sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRml4ZWQsCUwiZml4ZWQiLAkweDNEN0RFQjEwfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGUsCUwiZG91YmxlIiwJMHgzRDk4NTE1Qn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU29saWQsCUwic29saWQiLAkweDQwNjIzQjVCfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5QmFzZUdyb3VwLAlMInJ1YnktYmFzZS1ncm91cCIsCTB4NDEwMTRFODR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX09wZW5RdW90ZSwJTCJvcGVuLXF1b3RlIiwJMHg0NEE0MUU4RH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTGlnaHRlciwJTCJsaWdodGVyIiwJMHg0NUJFQjdBRn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJSb21hbiwJTCJsb3dlci1yb21hbiIsCTB4NTA0NEQyNTN9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1N0cmljdCwJTCJzdHJpY3QiLAkweDUyRjRFQkQ5fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNhcHRpb24sCUwidGFibGUtY2FwdGlvbiIsCTB4NTMyNUNENjN9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX09ibGlxdWUsCUwib2JsaXF1ZSIsCTB4NTNFQkREQjF9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0RlY2ltYWwsCUwiZGVjaW1hbCIsCTB4NTQwMzRDMkZ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xvb3NlLAlMImxvb3NlIiwJMHg1NEQzQTFFMn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSGVicmV3LAlMImhlYnJldyIsCTB4NTY1NzkyRER9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0hpZGRlbiwJTCJoaWRkZW4iLAkweDU3M0NCNDBDfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9EYXNoZWQsCUwiZGFzaGVkIiwJMHg1OEEzREQyOX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRW1iZWQsCUwiZW1iZWQiLAkweDU5QzhGMjdEfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZVJvd0dyb3VwLAlMInRhYmxlLXJvdy1ncm91cCIsCTB4NUE0M0JEMDd9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ29sdW1uLAlMInRhYmxlLWNvbHVtbiIsCTB4NUU3MDVEQTN9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1N0YXRpYywJTCJzdGF0aWMiLAkweDVFNzU1NUU4fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdXRzZXQsCUwib3V0c2V0IiwJMHg2MTIzNjE2NH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbExlYWRpbmdaZXJvLAlMImRlY2ltYWwtbGVhZGluZy16ZXJvIiwJMHg2MURGQzU1RH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfS2VlcFdvcmRzLAlMImtlZXAtd29yZHMiLAkweDYzOTY0ODAxfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9LYXRha2FuYUlyb2hhLAlMImthdGFrYW5hLWlyb2hhIiwJMHg2NUQ3QzkxQ30sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU3VwZXIsCUwic3VwZXIiLAkweDZBNEY4NDJGfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9DZW50ZXIsCUwiY2VudGVyIiwJMHg2QzUxQUZDMX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVIZWFkZXJHcm91cCwJTCJ0YWJsZS1oZWFkZXItZ3JvdXAiLAkweDcwNjEwM0Q4fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNpZGUsCUwiaW5zaWRlIiwJMHg3MDlDQjBGQ30sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfWHhMYXJnZSwJTCJ4eC1sYXJnZSIsCTB4NzBCQjE1MDh9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RyaWFuZ2xlLAlMInRyaWFuZ2xlIiwJMHg3NTI0RURGNn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieVRleHRHcm91cCwJTCJydWJ5LXRleHQtZ3JvdXAiLAkweDc4QzJCOThFfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9DaXJjbGUsCUwiY2lyY2xlIiwJMHg3QUJFQzBEMn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSGlyYWdhbmEsCUwiaGlyYWdhbmEiLAkweDdCRjVFMjVCfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXRYLAlMInJlcGVhdC14IiwJMHg3QzhGMzIyNn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0WSwJTCJyZXBlYXQteSIsCTB4N0M4RjMyMjd9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX01vdmUsCUwibW92ZSIsCTB4N0RBMDM0MTd9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0hpcmFnYW5hSXJvaGEsCUwiaGlyYWdhbmEtaXJvaGEiLAkweDdFRTg2M0ZCfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5QmFzZSwJTCJydWJ5LWJhc2UiLAkweDdGRDFCMUVBfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TY3JvbGwsCUwic2Nyb2xsIiwJMHg4NDc4N0FFRn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGxlciwJTCJzbWFsbGVyIiwJMHg4NDk3NjlGMH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVGb290ZXJHcm91cCwJTCJ0YWJsZS1mb290ZXItZ3JvdXAiLAkweDg1QkREOTdFfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9CYXNlbGluZSwJTCJiYXNlbGluZSIsCTB4ODc0MzZCQTN9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1NlcGFyYXRlLAlMInNlcGFyYXRlIiwJMHg4NzdDNjZCNX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQXJtZW5pYW4sCUwiYXJtZW5pYW4iLAkweDg4OUJFNEVCfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9PcGVuLAlMIm9wZW4iLAkweDhCOTBFMUYyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZWxhdGl2ZSwJTCJyZWxhdGl2ZSIsCTB4OEM5OTVCNUN9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RoaWNrLAlMInRoaWNrIiwJMHg4Q0MzNUVCM30sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSnVzdGlmeSwJTCJqdXN0aWZ5IiwJMHg4RDI2OUNBRX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTWlkZGxlLAlMIm1pZGRsZSIsCTB4OTQ3RkEwMEZ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Fsd2F5cywJTCJhbHdheXMiLAkweDk1OUFCMjMxfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXN0cmlidXRlU3BhY2UsCUwiZGlzdHJpYnV0ZS1zcGFjZSIsCTB4OTdBMjBFNTh9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xpbmVFZGdlLAlMImxpbmUtZWRnZSIsCTB4OUE4NDVEMkF9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZVdyYXAsCUwicHJlLXdyYXAiLAkweDlENTk1ODhFfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW0sCUwibWVkaXVtIiwJMHhBMDg0QTM4MX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTlJlc2l6ZSwJTCJuLXJlc2l6ZSIsCTB4QTA4ODk2OER9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xpc3RJdGVtLAlMImxpc3QtaXRlbSIsCTB4QTMyMzgyQjh9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1Nob3csCUwic2hvdyIsCTB4QTY2QzEwQzF9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0N1cnJlbnRjb2xvciwJTCJjdXJyZW50Q29sb3IiLAkweEE3ODgzOTIyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0Nsb3NlUXVvdGUsCUwibm8tY2xvc2UtcXVvdGUiLAkweEE3OUNCRkZCfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9WZXJ0aWNhbExyLAlMInZlcnRpY2FsLWxyIiwJMHhBODY3M0Y2NX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVmVydGljYWxSbCwJTCJ2ZXJ0aWNhbC1ybCIsCTB4QTg2NzVFMjV9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1BvaW50ZXIsCUwicG9pbnRlciIsCTB4QTkwOTI5QzF9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1h4U21hbGwsCUwieHgtc21hbGwiLAkweEFERTFGQzc2fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkLAlMImJvbGQiLAkweEIxODMxM0ExfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3RoLAlMImJvdGgiLAkweEIxODMzQ0FEfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbENhcHMsCUwic21hbGwtY2FwcyIsCTB4QjI5OTQyOER9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0thdGFrYW5hLAlMImthdGFrYW5hIiwJMHhCNDIxQTRCQ30sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQWZ0ZXIsCUwiYWZ0ZXIiLAkweEI2QjQ0MTcyfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ib3Jpem9udGFsLAlMImhvcml6b250YWwiLAkweEI3NzMyREVBfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3R0ZWQsCUwiZG90dGVkIiwJMHhCODg2NTJBNH0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzYywJTCJkaXNjIiwJMHhCRUJDMThDM30sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfR2VvcmdpYW4sCUwiZ2VvcmdpYW4iLAkweEJFRjk5RThDfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmUsCUwiaW5saW5lIiwJMHhDMDJENjQ5Rn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfT3ZlcmxpbmUsCUwib3ZlcmxpbmUiLAkweEMwRUM5RkE0fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9XYWl0LAlMIndhaXQiLAkweEMxNjEzQkI1fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9CcmVha0FsbCwJTCJicmVhay1hbGwiLAkweEMzMTQ1QkFCfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckFscGhhLAlMInVwcGVyLWFscGhhIiwJMHhDNTJENEE5Rn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ2FwaXRhbGl6ZSwJTCJjYXBpdGFsaXplIiwJMHhDNTMyMUQ0Nn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTm93cmFwLAlMIm5vd3JhcCIsCTB4Qzc5OTQ0MTd9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHRCb3R0b20sCUwidGV4dC1ib3R0b20iLAkweEM3RDA4RDg3fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob09wZW5RdW90ZSwJTCJuby1vcGVuLXF1b3RlIiwJMHhDOENENzg3N30sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfR3Jvb3ZlLAlMImdyb292ZSIsCTB4Q0IyNEE0MTJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1Byb2dyZXNzLAlMInByb2dyZXNzIiwJMHhDRDFEOTgzNX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTGFyZ2VyLAlMImxhcmdlciIsCTB4Q0QzQzQwOUR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Nsb3NlUXVvdGUsCUwiY2xvc2UtcXVvdGUiLAkweENGODY5NkQxfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNlbGwsCUwidGFibGUtY2VsbCIsCTB4Q0ZCNUU1OTV9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZUxpbmUsCUwicHJlLWxpbmUiLAkweEQwNEZFREJDfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9BYnNvbHV0ZSwJTCJhYnNvbHV0ZSIsCTB4RDBCMkQ1NUZ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZVRhYmxlLAlMImlubGluZS10YWJsZSIsCTB4RDEzMUY0OTR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0JpZGlPdmVycmlkZSwJTCJiaWRpLW92ZXJyaWRlIiwJMHhEMTYxRkRFNX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lQmxvY2ssCUwiaW5saW5lLWJsb2NrIiwJMHhEMjZBOEJEN30sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSW5zZXQsCUwiaW5zZXQiLAkweEQ2RjIzMjQzfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Dcm9zc2hhaXIsCUwiY3Jvc3NoYWlyIiwJMHhENkY4MDE4RX0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJMYXRpbiwJTCJ1cHBlci1sYXRpbiIsCTB4RDlENjA1MzF9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0hlbHAsCUwiaGVscCIsCTB4REEwMDI5Njl9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0hpZGUsCUwiaGlkZSIsCTB4REE2OTM5NUF9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyY2FzZSwJTCJ1cHBlcmNhc2UiLAkweERBRDU5NUE4fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TUmVzaXplLAlMInMtcmVzaXplIiwJMHhEQjNBQURGMn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGUsCUwidGFibGUiLAkweERCOUJFOTY4fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9CbGluaywJTCJibGluayIsCTB4REMzNkUzOTB9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Jsb2NrLAlMImJsb2NrIiwJMHhEQ0Q0ODBBQn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhcnQsCUwic3RhcnQiLAkweEUxRDlENUFFfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNvbHVtbkdyb3VwLAlMInRhYmxlLWNvbHVtbi1ncm91cCIsCTB4RTIyNThFRkR9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0l0YWxpYywJTCJpdGFsaWMiLAkweEUzMUQ1Mzk2fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaW5lVGhyb3VnaCwJTCJsaW5lLXRocm91Z2giLAkweEU0QzVBMjc2fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9LZWVwQWxsLAlMImtlZXAtYWxsIiwJMHhFNzA0QTcyQn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJBbHBoYSwJTCJsb3dlci1hbHBoYSIsCTB4RUNCNzVBM0N9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1J1bkluLAlMInJ1bi1pbiIsCTB4RUVDOTMwQjl9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1NxdWFyZSwJTCJzcXVhcmUiLAkweEVGODVEMzUxfSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9YTGFyZ2UsCUwieC1sYXJnZSIsCTB4RjAwOEUzOTB9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xhcmdlLAlMImxhcmdlIiwJMHhGNDQzNEZDQn0sDQotICAgICAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQmVmb3JlLAlMImJlZm9yZSIsCTB4RjRGRkNFNzN9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQsCUwibGVmdCIsCTB4RjVBRDc4MkJ9LA0KLSAgICAgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHRUb3AsCUwidGV4dC10b3AiLAkweEZDQjU4RDQ1fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5VGV4dCwJTCJydWJ5LXRleHQiLAkweEZDQzc3MTc0fSwNCi0gICAgICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0Rpc3BsYXksCUwibm8tZGlzcGxheSIsCTB4RkU0ODI4NjB9LA0KLSAgICB9Ow0KLSAgICBzdGF0aWMgY29uc3QgRkRFX0NTU01FRElBVFlQRVRBQkxFIGdfRkRFX0NTU01lZGlhVHlwZXNbXSA9IHsNCi0gICAgICAgIHsweEYwOSwgMHgwMn0sDQotICAgICAgICB7MHg0ODgwLCAweDIwfSwNCi0gICAgICAgIHsweDUzNkEsIDB4ODB9LA0KLSAgICAgICAgezB4NzQxRCwgMHgxMH0sDQotICAgICAgICB7MHg3NkVELCAweDA4fSwNCi0gICAgICAgIHsweDdDRkIsIDB4MDF9LA0KLSAgICAgICAgezB4OTU3OCwgMHgwNH0sDQotICAgICAgICB7MHhDOEUxLCAweDQwfSwNCi0gICAgICAgIHsweEQwRjksIDB4RkZ9LA0KLSAgICB9Ow0KLSAgICBzdGF0aWMgY29uc3QgRkRFX0NTU0xFTkdUSFVOSVRUQUJMRSBnX0ZERV9DU1NMZW5ndGhVbml0c1tdID0gew0KLSAgICAgICAgezB4MDY3MiwgM30sDQotICAgICAgICB7MHgwNjdELCA0fSwNCi0gICAgICAgIHsweDFBRjcsIDh9LA0KLSAgICAgICAgezB4MkY3QSwgN30sDQotICAgICAgICB7MHgzRUQzLCAxMH0sDQotICAgICAgICB7MHgzRUU0LCA5fSwNCi0gICAgICAgIHsweDNFRTgsIDV9LA0KLSAgICAgICAgezB4RkMzMCwgNn0sDQotICAgIH07DQotICAgIHN0YXRpYyBjb25zdCBGREVfQ1NTQ09MT1JUQUJMRSBnX0ZERV9DU1NDb2xvcnNbXSA9IHsNCi0gICAgICAgIHsweDAzMUI0N0ZFLCAweGZmMDAwMDgwfSwNCi0gICAgICAgIHsweDBCQjhERjVCLCAweGZmZmYwMDAwfSwNCi0gICAgICAgIHsweDBEODJBNzhDLCAweGZmODAwMDAwfSwNCi0gICAgICAgIHsweDJBQ0M4MkU4LCAweGZmMDBmZmZmfSwNCi0gICAgICAgIHsweDJEMDgzOTg2LCAweGZmMDA4MDgwfSwNCi0gICAgICAgIHsweDRBNkE2MTk1LCAweGZmYzBjMGMwfSwNCi0gICAgICAgIHsweDU0NkE4RUYzLCAweGZmODA4MDgwfSwNCi0gICAgICAgIHsweDY1QzkxNjlDLCAweGZmZmZhNTAwfSwNCi0gICAgICAgIHsweDg0MjJCQjYxLCAweGZmZmZmZmZmfSwNCi0gICAgICAgIHsweDkyNzFBNTU4LCAweGZmODAwMDgwfSwNCi0gICAgICAgIHsweEE2NUEzRUUzLCAweGZmZmYwMGZmfSwNCi0gICAgICAgIHsweEIxMzQ1NzA4LCAweGZmMDAwMGZmfSwNCi0gICAgICAgIHsweEI2RDJDRjFGLCAweGZmODA4MDAwfSwNCi0gICAgICAgIHsweEQxOUI1RTFDLCAweGZmZmZmZjAwfSwNCi0gICAgICAgIHsweERCNjQzOTFELCAweGZmMDAwMDAwfSwNCi0gICAgICAgIHsweEY2MTZENTA3LCAweGZmMDBmZjAwfSwNCi0gICAgICAgIHsweEY2RUZGRjMxLCAweGZmMDA4MDAwfSwNCi0gICAgfTsNCi0gICAgc3RhdGljIGNvbnN0IEZERV9DU1NQRVJTVURPVEFCTEUgZ19GREVfQ1NTUGVyc3Vkb1R5cGVbXSA9IHsNCi0gICAgICAgIHtGREVfQ1NTUEVSU1VET19BZnRlciwJTCI6YWZ0ZXIiLAkweDE2RUUxRkVDfSwNCi0gICAgICAgIHtGREVfQ1NTUEVSU1VET19CZWZvcmUsCUwiOmJlZm9yZSIsCTB4N0RDRERFMkR9LA0KLSAgICB9Ow0KLSAgICBGREVfTFBDQ1NTUEVSU1VET1RBQkxFIEZERV9HZXRDU1NQZXJzdWRvQnlFbnVtKEZERV9DU1NQRVJTVURPIGVQZXJzdWRvKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKGVQZXJzdWRvIDwgRkRFX0NTU1BFUlNVRE9fTk9ORSkgPyAoZ19GREVfQ1NTUGVyc3Vkb1R5cGUgKyBlUGVyc3VkbykgOiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHJlY3Q7DQorfQ0KK0ZYX0RXT1JEIEZERV9DU1NGb250U3R5bGVUb0ZERShJRkRFX0NTU0ZvbnRTdHlsZSogcEZvbnRTdHlsZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBGb250U3R5bGUgIT0gTlVMTCk7DQorICBGWF9EV09SRCBkd0ZvbnRTdHlsZSA9IEZYX0ZPTlRTVFlMRV9Ob3JtYWw7DQorICBpZiAocEZvbnRTdHlsZS0+R2V0Rm9udFN0eWxlKCkgPT0gRkRFX0NTU0ZPTlRTVFlMRV9JdGFsaWMpIHsNCisgICAgZHdGb250U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCisgIH0NCisgIGlmIChwRm9udFN0eWxlLT5HZXRGb250V2VpZ2h0KCkgPj0gNzAwKSB7DQorICAgIGR3Rm9udFN0eWxlIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOw0KKyAgfQ0KKyAgcmV0dXJuIGR3Rm9udFN0eWxlOw0KK30NCitzdGF0aWMgY29uc3QgRkRFX0NTU1BST1BFUlRZVEFCTEUgZ19GREVfQ1NTUHJvcGVydGllc1tdID0gew0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1dyaXRpbmdNb2RlLCBMIndyaXRpbmctbW9kZSIsIDB4MDE4NzgwNzYsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlV2lkdGgsIEwiY29sdW1uLXJ1bGUtd2lkdGgiLCAweDAyMDBGQjAwLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdCwgTCJib3JkZXItbGVmdCIsIDB4MDQwODAwMzYsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZSwgTCJjb2x1bW4tcnVsZSIsIDB4MDRDODNERjMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfSGVpZ2h0LCBMImhlaWdodCIsIDB4MDVBNUM1MTksDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Db3VudGVyUmVzZXQsIEwiY291bnRlci1yZXNldCIsIDB4MDg5NEY5QjAsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlciB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0NvbnRlbnQsIEwiY29udGVudCIsIDB4MDk3QkU5MUIsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVVSSSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1J1YnlQb3NpdGlvbiwgTCJydWJ5LXBvc2l0aW9uIiwgMHgwOUFDRDAyNCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRDb2xvciwgTCJiYWNrZ3JvdW5kLWNvbG9yIiwgMHgwOUU4RThBQywNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfV2lkdGgsIEwid2lkdGgiLCAweDBBOEE4RjgwLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfU3JjLCBMInNyYyIsIDB4MEJEMzcwNDgsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkl9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1RvcCwgTCJ0b3AiLCAweDBCRURBRjMzLCBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9NYXJnaW4sIEwibWFyZ2luIiwgMHgwQ0IwMTZCRSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJDb2xvciwgTCJib3JkZXItY29sb3IiLCAweDBDQkI1MjhBLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfV2lkb3dzLCBMIndpZG93cyIsIDB4MTAyNkM1OUQsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbUNvbG9yLCBMImJvcmRlci1ib3R0b20tY29sb3IiLCAweDEyMUUyMkVDLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0SW5kZW50LCBMInRleHQtaW5kZW50IiwgMHgxNjlBREI3NCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfUmlnaHQsIEwicmlnaHQiLCAweDE5M0FERTNFLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzU3R5bGUsIEwidGV4dC1lbXBoYXNpcy1zdHlsZSIsIDB4MjBEQkFGNEEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZ30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0xlZnQsIEwicGFkZGluZy1sZWZ0IiwgMHgyMjhDRjAyRiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uV2lkdGgsIEwiY29sdW1uLXdpZHRoIiwgMHgyNEM5QUM5QiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX01hcmdpbkxlZnQsIEwibWFyZ2luLWxlZnQiLCAweDI5N0M1NjU2LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyLCBMImJvcmRlciIsIDB4MkEyMzM0OUUsIEZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3AsIEwiYm9yZGVyLXRvcCIsIDB4MkI4NjZBREUsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfUnVieU92ZXJoYW5nLCBMInJ1Ynktb3ZlcmhhbmciLCAweDJDQ0EwRDg5LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrQmVmb3JlLCBMInBhZ2UtYnJlYWstYmVmb3JlIiwgMHgzMTE5QjM2RiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX01heEhlaWdodCwgTCJtYXgtaGVpZ2h0IiwgMHgzNDM1OTdFQywNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfTWluV2lkdGgsIEwibWluLXdpZHRoIiwgMHgzNTgzMjg3MSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdENvbG9yLCBMImJvcmRlci1sZWZ0LWNvbG9yIiwgMHgzNUM2NDAyMiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm90dG9tLCBMImJvdHRvbSIsIDB4Mzk5RjAyQjUsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9RdW90ZXMsIEwicXVvdGVzIiwgMHgzRDhDNkEwMSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX01heFdpZHRoLCBMIm1heC13aWR0aCIsIDB4M0VBMjc0RjMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1BhZGRpbmdSaWdodCwgTCJwYWRkaW5nLXJpZ2h0IiwgMHgzRjYxNkFDMiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlSW1hZ2UsIEwibGlzdC1zdHlsZS1pbWFnZSIsIDB4NDJBOEE4NkEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlVVJJfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9XaGl0ZVNwYWNlLCBMIndoaXRlLXNwYWNlIiwgMHg0MkYwNDI5QSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbSwgTCJib3JkZXItYm90dG9tIiwgMHg0NTJDRTc4MCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVUeXBlLCBMImxpc3Qtc3R5bGUtdHlwZSIsIDB4NDgwOTQ3ODksDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Xb3JkQnJlYWssIEwid29yZC1icmVhayIsIDB4NEQ3NEEzQ0UsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9PdmVyZmxvd1gsIEwib3ZlcmZsb3cteCIsIDB4NEVDRUJGOTksDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9PdmVyZmxvd1ksIEwib3ZlcmZsb3cteSIsIDB4NEVDRUJGOUEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BDb2xvciwgTCJib3JkZXItdG9wLWNvbG9yIiwgMHg1MTA5QjhDQSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfRm9udEZhbWlseSwgTCJmb250LWZhbWlseSIsIDB4NTc0Njg2RTYsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9DdXJzb3IsIEwiY3Vyc29yIiwgMHg1OURGQ0E1RSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9SdWJ5QWxpZ24sIEwicnVieS1hbGlnbiIsIDB4NjA3N0JERkEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlQ29sb3IsIEwiY29sdW1uLXJ1bGUtY29sb3IiLCAweDY1RERGRDlGLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Gb250V2VpZ2h0LCBMImZvbnQtd2VpZ2h0IiwgMHg2NjkyRjYwQywNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0U3R5bGUsIEwiYm9yZGVyLXJpZ2h0LXN0eWxlIiwgMHg2OTIwRERBNywNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX01pbkhlaWdodCwgTCJtaW4taGVpZ2h0IiwgMHg2QUFFMzEyQSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sb3IsIEwiY29sb3IiLCAweDZFNjc5MjFGLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9MZXR0ZXJTcGFjaW5nLCBMImxldHRlci1zcGFjaW5nIiwgMHg3MDUzNjEwMiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0VtcHR5Q2VsbHMsIEwiZW1wdHktY2VsbHMiLCAweDc1MzE1MjhGLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfVGV4dEFsaWduLCBMInRleHQtYWxpZ24iLCAweDc1NTNGMUJELA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfUnVieVNwYW4sIEwicnVieS1zcGFuIiwgMHg3NkZDRkNFMSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVGdW5jdGlvbn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfUG9zaXRpb24sIEwicG9zaXRpb24iLCAweDgxNEY4MkI1LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyU3R5bGUsIEwiYm9yZGVyLXN0eWxlIiwgMHg4MkE0Q0Q1QywNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSwgTCJib3JkZXItYm90dG9tLXN0eWxlIiwgMHg4ODA3OURCRSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlckNvbGxhcHNlLCBMImJvcmRlci1jb2xsYXBzZSIsIDB4ODg4M0M3RkUsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Db2x1bW5Db3VudCwgTCJjb2x1bW4tY291bnQiLCAweDg5OTM2QTY0LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRXaWR0aCwgTCJib3JkZXItcmlnaHQtd2lkdGgiLCAweDhGNUE2MDM2LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfVW5pY29kZUJpZGksIEwidW5pY29kZS1iaWRpIiwgMHg5MTY3MEY2QywNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1ZlcnRpY2FsQWxpZ24sIEwidmVydGljYWwtYWxpZ24iLCAweDkzNEE4N0QyLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1RvcCwgTCJwYWRkaW5nLXRvcCIsIDB4OTU5RDIyQjcsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0NvbHVtbnMsIEwiY29sdW1ucyIsIDB4OTZGQTVEODEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3csIEwib3ZlcmZsb3ciLCAweDk3Qjc2QjU0LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1RhYmxlTGF5b3V0LCBMInRhYmxlLWxheW91dCIsIDB4OUIxQ0I0QjMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Gb250VmFyaWFudCwgTCJmb250LXZhcmlhbnQiLCAweDlDNzg1Nzc5LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlLCBMImxpc3Qtc3R5bGUiLCAweDlFNkM0NzFBLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRQb3NpdGlvbiwgTCJiYWNrZ3JvdW5kLXBvc2l0aW9uIiwgMHhBODg0NkQyMiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJXaWR0aCwgTCJib3JkZXItd2lkdGgiLCAweEE4REU0RkVCLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpc0NvbG9yLCBMInRleHQtZW1waGFzaXMtY29sb3IiLCAweEFBRjIzNDc4LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0U3R5bGUsIEwiYm9yZGVyLWxlZnQtc3R5bGUiLCAweEFCQUZCQUY0LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrSW5zaWRlLCBMInBhZ2UtYnJlYWstaW5zaWRlIiwgMHhBQ0I2OTVGOCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpcywgTCJ0ZXh0LWVtcGhhc2lzIiwgMHhBRDBFNTgwQywNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21XaWR0aCwgTCJib3JkZXItYm90dG9tLXdpZHRoIiwgMHhBRTQxMjA0RCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0NvbHVtbkdhcCwgTCJjb2x1bW4tZ2FwIiwgMHhCNUMxQkE3MywNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX09ycGhhbnMsIEwib3JwaGFucyIsIDB4QjcxNjQ2N0IsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0LCBMImJvcmRlci1yaWdodCIsIDB4Qjc4RTlFQTksDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfRm9udFNpemUsIEwiZm9udC1zaXplIiwgMHhCOTM5NTZERiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1BhZ2VCcmVha0FmdGVyLCBMInBhZ2UtYnJlYWstYWZ0ZXIiLCAweEJDMzU4QUVFLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ2FwdGlvblNpZGUsIEwiY2FwdGlvbi1zaWRlIiwgMHhDMDNGMzU2MCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRSZXBlYXQsIEwiYmFja2dyb3VuZC1yZXBlYXQiLCAweEMyQzJGRENFLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wU3R5bGUsIEwiYm9yZGVyLXRvcC1zdHlsZSIsIDB4QzZGMzMzOUMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJTcGFjaW5nLCBMImJvcmRlci1zcGFjaW5nIiwgMHhDNzIwMzBGMCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1RleHRUcmFuc2Zvcm0sIEwidGV4dC10cmFuc2Zvcm0iLCAweEM4OEVFQTZFLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfRm9udFN0eWxlLCBMImZvbnQtc3R5bGUiLCAweENCMTk1MEY1LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfRm9udCwgTCJmb250IiwgMHhDRDMwOEI3NywgRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0xpbmVIZWlnaHQsIEwibGluZS1oZWlnaHQiLCAweENGQ0FDRTJFLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfTWFyZ2luUmlnaHQsIEwibWFyZ2luLXJpZ2h0IiwgMHhEMTNDNThDOSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlciB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0Zsb2F0LCBMImZsb2F0IiwgMHhEMTUzMjg3NiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRXaWR0aCwgTCJib3JkZXItbGVmdC13aWR0aCIsIDB4RDFFOTNEODMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9EaXNwbGF5LCBMImRpc3BsYXkiLCAweEQ0MjI0QzM2LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ2xlYXIsIEwiY2xlYXIiLCAweEQ4RUQxNDY3LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVN0eWxlLCBMImNvbHVtbi1ydWxlLXN0eWxlIiwgMHhEQkM3Nzg3MSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1RleHRDb21iaW5lLCBMInRleHQtY29tYmluZSIsIDB4REM1MjA3Q0YsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlUG9zaXRpb24sIEwibGlzdC1zdHlsZS1wb3NpdGlvbiIsIDB4RTFBMURFM0MsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9WaXNpYmlsaXR5LCBMInZpc2liaWxpdHkiLCAweEUyOUY1MTY4LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0JvdHRvbSwgTCJwYWRkaW5nLWJvdHRvbSIsIDB4RTU1NUIzQjksDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRBdHRhY2htZW50LCBMImJhY2tncm91bmQtYXR0YWNobWVudCIsIDB4RTc3OTgxRjYsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kSW1hZ2UsIEwiYmFja2dyb3VuZC1pbWFnZSIsIDB4RTlBRUI3MTAsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlVVJJfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9MaW5lQnJlYWssIEwibGluZS1icmVhayIsIDB4RUEyRDFEOUEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kLCBMImJhY2tncm91bmQiLCAweEVCNDlERDQwLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFdpZHRoLCBMImJvcmRlci10b3Atd2lkdGgiLCAweEVEMkNCNjJCLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfV29yZFNwYWNpbmcsIEwid29yZC1zcGFjaW5nIiwgMHhFREE2M0JBRSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Q29sb3IsIEwiYm9yZGVyLXJpZ2h0LWNvbG9yIiwgMHhGMzM3NjJENSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ291bnRlckluY3JlbWVudCwgTCJjb3VudGVyLWluY3JlbWVudCIsIDB4RjRDRkIxQjIsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlciB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0xlZnQsIEwibGVmdCIsIDB4RjVBRDc4MkIsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0RGVjb3JhdGlvbiwgTCJ0ZXh0LWRlY29yYXRpb24iLCAweEY3QzYzNEJBLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1BhZGRpbmcsIEwicGFkZGluZyIsIDB4RjhDMzczRjcsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9NYXJnaW5Cb3R0b20sIEwibWFyZ2luLWJvdHRvbSIsIDB4RjkzNDg1QTAsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9NYXJnaW5Ub3AsIEwibWFyZ2luLXRvcCIsIDB4RkU1MURDRkUsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9EaXJlY3Rpb24sIEwiZGlyZWN0aW9uIiwgMHhGRTc0NkU2MSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KK307DQorc3RhdGljIGNvbnN0IEZERV9DU1NQUk9QRVJUWVZBTFVFVEFCTEUgZ19GREVfQ1NTUHJvcGVydHlWYWx1ZXNbXSA9IHsNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0JvbGRlciwgTCJib2xkZXIiLCAweDAwOUYxMDU4fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyTGF0aW4sIEwibG93ZXItbGF0aW4iLCAweDAxNjAxNENFfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyY2FzZSwgTCJsb3dlcmNhc2UiLCAweDAyQUNCODA1fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyR3JlZWssIEwibG93ZXItZ3JlZWsiLCAweDAzRDgxRDY0fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1Nlc2FtZSwgTCJzZXNhbWUiLCAweDA0MzJFQ0RFfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUsIEwibm9uZSIsIDB4MDQ4QjY2NzB9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTndSZXNpemUsIEwibnctcmVzaXplIiwgMHgwNTRCNEJFNH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9XUmVzaXplLCBMInctcmVzaXplIiwgMHgwQTJGOEQ3Nn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3QsIEwiZG90IiwgMHgwQTQ4Q0IyN30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9FbmQsIEwiZW5kIiwgMHgwQTYzMTQzN30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9MdHIsIEwibHRyIiwgMHgwQjFCNTZEMn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9QcmUsIEwicHJlIiwgMHgwQjg0ODU4N30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdGwsIEwicnRsIiwgMHgwQkI5MkM1Mn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdWIsIEwic3ViIiwgMHgwQkQzN0ZBQX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ub3AsIEwidG9wIiwgMHgwQkVEQUYzM30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9WaXNpYmxlLCBMInZpc2libGUiLCAweDBGNTVEN0VFfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0ZpbGxlZCwgTCJmaWxsZWQiLCAweDEwODI3REQwfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1N3UmVzaXplLCBMInN3LXJlc2l6ZSIsIDB4MTBCNTQ4RTl9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTm9SZXBlYXQsIEwibm8tcmVwZWF0IiwgMHgxMjM1QzE4Qn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWZhdWx0LCBMImRlZmF1bHQiLCAweDE0REEyMTI1fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RyYW5zcGFyZW50LCBMInRyYW5zcGFyZW50IiwgMHgxN0I2NERCMn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWRnZSwgTCJyaWRnZSIsIDB4MThFQkVFNEJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQsIEwicmlnaHQiLCAweDE5M0FERTNFfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0hvcml6b250YWxUYiwgTCJob3Jpem9udGFsLXRiIiwgMHgxQTY2QTg2RH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXN0cmlidXRlTGV0dGVyLCBMImRpc3RyaWJ1dGUtbGV0dGVyIiwgMHgxRURCRDc1Q30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGVDaXJjbGUsIEwiZG91YmxlLWNpcmNsZSIsIDB4MUZGMDgyQkF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieSwgTCJydWJ5IiwgMHgyMEQ2NkMwMn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Db2xsYXBzZSwgTCJjb2xsYXBzZSIsIDB4MjEyOEQ2NzN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsLCBMIm5vcm1hbCIsIDB4MjQ3Q0YzRTl9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQXZvaWQsIEwiYXZvaWQiLCAweDI0RTY4NEIzfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyUm9tYW4sIEwidXBwZXItcm9tYW4iLCAweDI4QkFDMkI2fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG8sIEwiYXV0byIsIDB4MkIzNUI2RDl9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGV4dCwgTCJ0ZXh0IiwgMHgyRDA4QUY4NX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9YU21hbGwsIEwieC1zbWFsbCIsIDB4MkQyRkNBRkV9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpbiwgTCJ0aGluIiwgMHgyRDU3NEQ1M30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXQsIEwicmVwZWF0IiwgMHgzMDY2MTRBMX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbCwgTCJzbWFsbCIsIDB4MzE2QTM3Mzl9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTmVSZXNpemUsIEwibmUtcmVzaXplIiwgMHgzMUZENUUxMn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0NvbnRlbnQsIEwibm8tY29udGVudCIsIDB4MzNBMUM1NDV9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfT3V0c2lkZSwgTCJvdXRzaWRlIiwgMHgzNkRGNjkzRH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9FUmVzaXplLCBMImUtcmVzaXplIiwgMHgzNkUxOUZBNH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZVJvdywgTCJ0YWJsZS1yb3ciLCAweDM5MTJBMDJEfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0JvdHRvbSwgTCJib3R0b20iLCAweDM5OUYwMkI1fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1VuZGVybGluZSwgTCJ1bmRlcmxpbmUiLCAweDNBMDI3M0E2fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Nqa0lkZW9ncmFwaGljLCBMImNqay1pZGVvZ3JhcGhpYyIsIDB4M0E2NDFDQzR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU2VSZXNpemUsIEwic2UtcmVzaXplIiwgMHgzRDY3NUIxN30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaXhlZCwgTCJmaXhlZCIsIDB4M0Q3REVCMTB9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlLCBMImRvdWJsZSIsIDB4M0Q5ODUxNUJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU29saWQsIEwic29saWQiLCAweDQwNjIzQjVCfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlCYXNlR3JvdXAsIEwicnVieS1iYXNlLWdyb3VwIiwgMHg0MTAxNEU4NH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9PcGVuUXVvdGUsIEwib3Blbi1xdW90ZSIsIDB4NDRBNDFFOER9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTGlnaHRlciwgTCJsaWdodGVyIiwgMHg0NUJFQjdBRn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlclJvbWFuLCBMImxvd2VyLXJvbWFuIiwgMHg1MDQ0RDI1M30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdHJpY3QsIEwic3RyaWN0IiwgMHg1MkY0RUJEOX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNhcHRpb24sIEwidGFibGUtY2FwdGlvbiIsIDB4NTMyNUNENjN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfT2JsaXF1ZSwgTCJvYmxpcXVlIiwgMHg1M0VCRERCMX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWNpbWFsLCBMImRlY2ltYWwiLCAweDU0MDM0QzJGfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xvb3NlLCBMImxvb3NlIiwgMHg1NEQzQTFFMn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9IZWJyZXcsIEwiaGVicmV3IiwgMHg1NjU3OTJERH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRkZW4sIEwiaGlkZGVuIiwgMHg1NzNDQjQwQ30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9EYXNoZWQsIEwiZGFzaGVkIiwgMHg1OEEzREQyOX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9FbWJlZCwgTCJlbWJlZCIsIDB4NTlDOEYyN0R9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVSb3dHcm91cCwgTCJ0YWJsZS1yb3ctZ3JvdXAiLCAweDVBNDNCRDA3fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ29sdW1uLCBMInRhYmxlLWNvbHVtbiIsIDB4NUU3MDVEQTN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhdGljLCBMInN0YXRpYyIsIDB4NUU3NTU1RTh9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfT3V0c2V0LCBMIm91dHNldCIsIDB4NjEyMzYxNjR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbExlYWRpbmdaZXJvLCBMImRlY2ltYWwtbGVhZGluZy16ZXJvIiwNCisgICAgIDB4NjFERkM1NUR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfS2VlcFdvcmRzLCBMImtlZXAtd29yZHMiLCAweDYzOTY0ODAxfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0thdGFrYW5hSXJvaGEsIEwia2F0YWthbmEtaXJvaGEiLCAweDY1RDdDOTFDfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1N1cGVyLCBMInN1cGVyIiwgMHg2QTRGODQyRn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9DZW50ZXIsIEwiY2VudGVyIiwgMHg2QzUxQUZDMX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUhlYWRlckdyb3VwLCBMInRhYmxlLWhlYWRlci1ncm91cCIsIDB4NzA2MTAzRDh9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSW5zaWRlLCBMImluc2lkZSIsIDB4NzA5Q0IwRkN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfWHhMYXJnZSwgTCJ4eC1sYXJnZSIsIDB4NzBCQjE1MDh9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVHJpYW5nbGUsIEwidHJpYW5nbGUiLCAweDc1MjRFREY2fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlUZXh0R3JvdXAsIEwicnVieS10ZXh0LWdyb3VwIiwgMHg3OEMyQjk4RX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9DaXJjbGUsIEwiY2lyY2xlIiwgMHg3QUJFQzBEMn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaXJhZ2FuYSwgTCJoaXJhZ2FuYSIsIDB4N0JGNUUyNUJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0WCwgTCJyZXBlYXQteCIsIDB4N0M4RjMyMjZ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0WSwgTCJyZXBlYXQteSIsIDB4N0M4RjMyMjd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTW92ZSwgTCJtb3ZlIiwgMHg3REEwMzQxN30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaXJhZ2FuYUlyb2hhLCBMImhpcmFnYW5hLWlyb2hhIiwgMHg3RUU4NjNGQn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5QmFzZSwgTCJydWJ5LWJhc2UiLCAweDdGRDFCMUVBfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1Njcm9sbCwgTCJzY3JvbGwiLCAweDg0Nzg3QUVGfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1NtYWxsZXIsIEwic21hbGxlciIsIDB4ODQ5NzY5RjB9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVGb290ZXJHcm91cCwgTCJ0YWJsZS1mb290ZXItZ3JvdXAiLCAweDg1QkREOTdFfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Jhc2VsaW5lLCBMImJhc2VsaW5lIiwgMHg4NzQzNkJBM30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TZXBhcmF0ZSwgTCJzZXBhcmF0ZSIsIDB4ODc3QzY2QjV9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQXJtZW5pYW4sIEwiYXJtZW5pYW4iLCAweDg4OUJFNEVCfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX09wZW4sIEwib3BlbiIsIDB4OEI5MEUxRjJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUmVsYXRpdmUsIEwicmVsYXRpdmUiLCAweDhDOTk1QjVDfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RoaWNrLCBMInRoaWNrIiwgMHg4Q0MzNUVCM30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9KdXN0aWZ5LCBMImp1c3RpZnkiLCAweDhEMjY5Q0FFfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX01pZGRsZSwgTCJtaWRkbGUiLCAweDk0N0ZBMDBGfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Fsd2F5cywgTCJhbHdheXMiLCAweDk1OUFCMjMxfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Rpc3RyaWJ1dGVTcGFjZSwgTCJkaXN0cmlidXRlLXNwYWNlIiwgMHg5N0EyMEU1OH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaW5lRWRnZSwgTCJsaW5lLWVkZ2UiLCAweDlBODQ1RDJBfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZVdyYXAsIEwicHJlLXdyYXAiLCAweDlENTk1ODhFfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX01lZGl1bSwgTCJtZWRpdW0iLCAweEEwODRBMzgxfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05SZXNpemUsIEwibi1yZXNpemUiLCAweEEwODg5NjhEfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xpc3RJdGVtLCBMImxpc3QtaXRlbSIsIDB4QTMyMzgyQjh9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU2hvdywgTCJzaG93IiwgMHhBNjZDMTBDMX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9DdXJyZW50Y29sb3IsIEwiY3VycmVudENvbG9yIiwgMHhBNzg4MzkyMn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0Nsb3NlUXVvdGUsIEwibm8tY2xvc2UtcXVvdGUiLCAweEE3OUNCRkZCfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1ZlcnRpY2FsTHIsIEwidmVydGljYWwtbHIiLCAweEE4NjczRjY1fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1ZlcnRpY2FsUmwsIEwidmVydGljYWwtcmwiLCAweEE4Njc1RTI1fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1BvaW50ZXIsIEwicG9pbnRlciIsIDB4QTkwOTI5QzF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfWHhTbWFsbCwgTCJ4eC1zbWFsbCIsIDB4QURFMUZDNzZ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQm9sZCwgTCJib2xkIiwgMHhCMTgzMTNBMX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3RoLCBMImJvdGgiLCAweEIxODMzQ0FEfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1NtYWxsQ2FwcywgTCJzbWFsbC1jYXBzIiwgMHhCMjk5NDI4RH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9LYXRha2FuYSwgTCJrYXRha2FuYSIsIDB4QjQyMUE0QkN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQWZ0ZXIsIEwiYWZ0ZXIiLCAweEI2QjQ0MTcyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0hvcml6b250YWwsIEwiaG9yaXpvbnRhbCIsIDB4Qjc3MzJERUF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRG90dGVkLCBMImRvdHRlZCIsIDB4Qjg4NjUyQTR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzYywgTCJkaXNjIiwgMHhCRUJDMThDM30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9HZW9yZ2lhbiwgTCJnZW9yZ2lhbiIsIDB4QkVGOTlFOEN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lLCBMImlubGluZSIsIDB4QzAyRDY0OUZ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfT3ZlcmxpbmUsIEwib3ZlcmxpbmUiLCAweEMwRUM5RkE0fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1dhaXQsIEwid2FpdCIsIDB4QzE2MTNCQjV9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQnJlYWtBbGwsIEwiYnJlYWstYWxsIiwgMHhDMzE0NUJBQn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckFscGhhLCBMInVwcGVyLWFscGhhIiwgMHhDNTJENEE5Rn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9DYXBpdGFsaXplLCBMImNhcGl0YWxpemUiLCAweEM1MzIxRDQ2fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05vd3JhcCwgTCJub3dyYXAiLCAweEM3OTk0NDE3fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHRCb3R0b20sIEwidGV4dC1ib3R0b20iLCAweEM3RDA4RDg3fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05vT3BlblF1b3RlLCBMIm5vLW9wZW4tcXVvdGUiLCAweEM4Q0Q3ODc3fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0dyb292ZSwgTCJncm9vdmUiLCAweENCMjRBNDEyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1Byb2dyZXNzLCBMInByb2dyZXNzIiwgMHhDRDFEOTgzNX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9MYXJnZXIsIEwibGFyZ2VyIiwgMHhDRDNDNDA5RH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9DbG9zZVF1b3RlLCBMImNsb3NlLXF1b3RlIiwgMHhDRjg2OTZEMX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNlbGwsIEwidGFibGUtY2VsbCIsIDB4Q0ZCNUU1OTV9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUHJlTGluZSwgTCJwcmUtbGluZSIsIDB4RDA0RkVEQkN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQWJzb2x1dGUsIEwiYWJzb2x1dGUiLCAweEQwQjJENTVGfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZVRhYmxlLCBMImlubGluZS10YWJsZSIsIDB4RDEzMUY0OTR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQmlkaU92ZXJyaWRlLCBMImJpZGktb3ZlcnJpZGUiLCAweEQxNjFGREU1fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZUJsb2NrLCBMImlubGluZS1ibG9jayIsIDB4RDI2QThCRDd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSW5zZXQsIEwiaW5zZXQiLCAweEQ2RjIzMjQzfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Nyb3NzaGFpciwgTCJjcm9zc2hhaXIiLCAweEQ2RjgwMThFfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyTGF0aW4sIEwidXBwZXItbGF0aW4iLCAweEQ5RDYwNTMxfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0hlbHAsIEwiaGVscCIsIDB4REEwMDI5Njl9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZSwgTCJoaWRlIiwgMHhEQTY5Mzk1QX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlcmNhc2UsIEwidXBwZXJjYXNlIiwgMHhEQUQ1OTVBOH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TUmVzaXplLCBMInMtcmVzaXplIiwgMHhEQjNBQURGMn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZSwgTCJ0YWJsZSIsIDB4REI5QkU5Njh9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQmxpbmssIEwiYmxpbmsiLCAweERDMzZFMzkwfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Jsb2NrLCBMImJsb2NrIiwgMHhEQ0Q0ODBBQn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdGFydCwgTCJzdGFydCIsIDB4RTFEOUQ1QUV9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDb2x1bW5Hcm91cCwgTCJ0YWJsZS1jb2x1bW4tZ3JvdXAiLCAweEUyMjU4RUZEfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0l0YWxpYywgTCJpdGFsaWMiLCAweEUzMUQ1Mzk2fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xpbmVUaHJvdWdoLCBMImxpbmUtdGhyb3VnaCIsIDB4RTRDNUEyNzZ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfS2VlcEFsbCwgTCJrZWVwLWFsbCIsIDB4RTcwNEE3MkJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJBbHBoYSwgTCJsb3dlci1hbHBoYSIsIDB4RUNCNzVBM0N9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUnVuSW4sIEwicnVuLWluIiwgMHhFRUM5MzBCOX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TcXVhcmUsIEwic3F1YXJlIiwgMHhFRjg1RDM1MX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9YTGFyZ2UsIEwieC1sYXJnZSIsIDB4RjAwOEUzOTB9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTGFyZ2UsIEwibGFyZ2UiLCAweEY0NDM0RkNCfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0JlZm9yZSwgTCJiZWZvcmUiLCAweEY0RkZDRTczfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQsIEwibGVmdCIsIDB4RjVBRDc4MkJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGV4dFRvcCwgTCJ0ZXh0LXRvcCIsIDB4RkNCNThENDV9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieVRleHQsIEwicnVieS10ZXh0IiwgMHhGQ0M3NzE3NH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0Rpc3BsYXksIEwibm8tZGlzcGxheSIsIDB4RkU0ODI4NjB9LA0KK307DQorc3RhdGljIGNvbnN0IEZERV9DU1NNRURJQVRZUEVUQUJMRSBnX0ZERV9DU1NNZWRpYVR5cGVzW10gPSB7DQorICAgIHsweEYwOSwgMHgwMn0sICB7MHg0ODgwLCAweDIwfSwgezB4NTM2QSwgMHg4MH0sDQorICAgIHsweDc0MUQsIDB4MTB9LCB7MHg3NkVELCAweDA4fSwgezB4N0NGQiwgMHgwMX0sDQorICAgIHsweDk1NzgsIDB4MDR9LCB7MHhDOEUxLCAweDQwfSwgezB4RDBGOSwgMHhGRn0sDQorfTsNCitzdGF0aWMgY29uc3QgRkRFX0NTU0xFTkdUSFVOSVRUQUJMRSBnX0ZERV9DU1NMZW5ndGhVbml0c1tdID0gew0KKyAgICB7MHgwNjcyLCAzfSwgIHsweDA2N0QsIDR9LCB7MHgxQUY3LCA4fSwgezB4MkY3QSwgN30sDQorICAgIHsweDNFRDMsIDEwfSwgezB4M0VFNCwgOX0sIHsweDNFRTgsIDV9LCB7MHhGQzMwLCA2fSwNCit9Ow0KK3N0YXRpYyBjb25zdCBGREVfQ1NTQ09MT1JUQUJMRSBnX0ZERV9DU1NDb2xvcnNbXSA9IHsNCisgICAgezB4MDMxQjQ3RkUsIDB4ZmYwMDAwODB9LCB7MHgwQkI4REY1QiwgMHhmZmZmMDAwMH0sDQorICAgIHsweDBEODJBNzhDLCAweGZmODAwMDAwfSwgezB4MkFDQzgyRTgsIDB4ZmYwMGZmZmZ9LA0KKyAgICB7MHgyRDA4Mzk4NiwgMHhmZjAwODA4MH0sIHsweDRBNkE2MTk1LCAweGZmYzBjMGMwfSwNCisgICAgezB4NTQ2QThFRjMsIDB4ZmY4MDgwODB9LCB7MHg2NUM5MTY5QywgMHhmZmZmYTUwMH0sDQorICAgIHsweDg0MjJCQjYxLCAweGZmZmZmZmZmfSwgezB4OTI3MUE1NTgsIDB4ZmY4MDAwODB9LA0KKyAgICB7MHhBNjVBM0VFMywgMHhmZmZmMDBmZn0sIHsweEIxMzQ1NzA4LCAweGZmMDAwMGZmfSwNCisgICAgezB4QjZEMkNGMUYsIDB4ZmY4MDgwMDB9LCB7MHhEMTlCNUUxQywgMHhmZmZmZmYwMH0sDQorICAgIHsweERCNjQzOTFELCAweGZmMDAwMDAwfSwgezB4RjYxNkQ1MDcsIDB4ZmYwMGZmMDB9LA0KKyAgICB7MHhGNkVGRkYzMSwgMHhmZjAwODAwMH0sDQorfTsNCitzdGF0aWMgY29uc3QgRkRFX0NTU1BFUlNVRE9UQUJMRSBnX0ZERV9DU1NQZXJzdWRvVHlwZVtdID0gew0KKyAgICB7RkRFX0NTU1BFUlNVRE9fQWZ0ZXIsIEwiOmFmdGVyIiwgMHgxNkVFMUZFQ30sDQorICAgIHtGREVfQ1NTUEVSU1VET19CZWZvcmUsIEwiOmJlZm9yZSIsIDB4N0RDRERFMkR9LA0KK307DQorRkRFX0xQQ0NTU1BFUlNVRE9UQUJMRSBGREVfR2V0Q1NTUGVyc3Vkb0J5RW51bShGREVfQ1NTUEVSU1VETyBlUGVyc3Vkbykgew0KKyAgcmV0dXJuIChlUGVyc3VkbyA8IEZERV9DU1NQRVJTVURPX05PTkUpID8gKGdfRkRFX0NTU1BlcnN1ZG9UeXBlICsgZVBlcnN1ZG8pDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitGREVfTFBDQ1NTUFJPUEVSVFlUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlCeU5hbWUoY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBzek5hbWUgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhwc3pOYW1lLCBpTGVuZ3RoLCBUUlVFKTsNCisgIGludDMyX3QgaUVuZCA9IEZERV9DU1NQUk9QRVJUWV9NQVggLSAxOw0KKyAgaW50MzJfdCBpTWlkLCBpU3RhcnQgPSAwOw0KKyAgRlhfRFdPUkQgZHdNaWQ7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBkd01pZCA9IGdfRkRFX0NTU1Byb3BlcnRpZXNbaU1pZF0uZHdIYXNoOw0KKyAgICBpZiAoZHdIYXNoID09IGR3TWlkKSB7DQorICAgICAgcmV0dXJuIGdfRkRFX0NTU1Byb3BlcnRpZXMgKyBpTWlkOw0KKyAgICB9IGVsc2UgaWYgKGR3SGFzaCA+IGR3TWlkKSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KICAgICB9DQotICAgIEZERV9MUENDU1NQUk9QRVJUWVRBQkxFIEZERV9HZXRDU1NQcm9wZXJ0eUJ5TmFtZShjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwgaW50MzJfdCBpTGVuZ3RoKQ0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQocHN6TmFtZSAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCi0gICAgICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzek5hbWUsIGlMZW5ndGgsIFRSVUUpOw0KLSAgICAgICAgaW50MzJfdCBpRW5kID0gRkRFX0NTU1BST1BFUlRZX01BWCAtIDE7DQotICAgICAgICBpbnQzMl90IGlNaWQsIGlTdGFydCA9IDA7DQotICAgICAgICBGWF9EV09SRCBkd01pZDsNCi0gICAgICAgIGRvIHsNCi0gICAgICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCi0gICAgICAgICAgICBkd01pZCA9IGdfRkRFX0NTU1Byb3BlcnRpZXNbaU1pZF0uZHdIYXNoOw0KLSAgICAgICAgICAgIGlmIChkd0hhc2ggPT0gZHdNaWQpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdfRkRFX0NTU1Byb3BlcnRpZXMgKyBpTWlkOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID4gZHdNaWQpIHsNCi0gICAgICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZERV9MUENDU1NQUk9QRVJUWVRBQkxFIEZERV9HZXRDU1NQcm9wZXJ0eUJ5RW51bShGREVfQ1NTUFJPUEVSVFkgZU5hbWUpIHsNCisgIHJldHVybiAoZU5hbWUgPCBGREVfQ1NTUFJPUEVSVFlfTUFYKSA/IChnX0ZERV9DU1NQcm9wZXJ0aWVzICsgZU5hbWUpIDogTlVMTDsNCit9DQorRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZSgNCisgICAgY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsDQorICAgIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBzek5hbWUgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhwc3pOYW1lLCBpTGVuZ3RoLCBUUlVFKTsNCisgIGludDMyX3QgaUVuZCA9IEZERV9DU1NQUk9QRVJUWVZBTFVFX01BWCAtIDE7DQorICBpbnQzMl90IGlNaWQsIGlTdGFydCA9IDA7DQorICBGWF9EV09SRCBkd01pZDsNCisgIGRvIHsNCisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIGR3TWlkID0gZ19GREVfQ1NTUHJvcGVydHlWYWx1ZXNbaU1pZF0uZHdIYXNoOw0KKyAgICBpZiAoZHdIYXNoID09IGR3TWlkKSB7DQorICAgICAgcmV0dXJuIGdfRkRFX0NTU1Byb3BlcnR5VmFsdWVzICsgaU1pZDsNCisgICAgfSBlbHNlIGlmIChkd0hhc2ggPiBkd01pZCkgew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCiAgICAgfQ0KLSAgICBGREVfTFBDQ1NTUFJPUEVSVFlUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlCeUVudW0oRkRFX0NTU1BST1BFUlRZIGVOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKGVOYW1lIDwgRkRFX0NTU1BST1BFUlRZX01BWCkgPyAoZ19GREVfQ1NTUHJvcGVydGllcyArIGVOYW1lKSA6IE5VTEw7DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gTlVMTDsNCit9DQorRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5RW51bSgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZU5hbWUpIHsNCisgIHJldHVybiAoZU5hbWUgPCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NQVgpID8gKGdfRkRFX0NTU1Byb3BlcnR5VmFsdWVzICsgZU5hbWUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7DQorfQ0KK0ZERV9MUENDU1NNRURJQVRZUEVUQUJMRSBGREVfR2V0Q1NTTWVkaWFUeXBlQnlOYW1lKGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBzek5hbWUgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICBGWF9XT1JEIHdIYXNoID0gKEZYX1dPUkQpRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHN6TmFtZSwgaUxlbmd0aCwgVFJVRSk7DQorICBpbnQzMl90IGlFbmQgPQ0KKyAgICAgIHNpemVvZihnX0ZERV9DU1NNZWRpYVR5cGVzKSAvIHNpemVvZihGREVfQ1NTTUVESUFUWVBFVEFCTEUpIC0gMTsNCisgIGludDMyX3QgaU1pZCwgaVN0YXJ0ID0gMDsNCisgIEZYX1dPUkQgdU1pZDsNCisgIGRvIHsNCisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIHVNaWQgPSBnX0ZERV9DU1NNZWRpYVR5cGVzW2lNaWRdLndIYXNoOw0KKyAgICBpZiAod0hhc2ggPT0gdU1pZCkgew0KKyAgICAgIHJldHVybiBnX0ZERV9DU1NNZWRpYVR5cGVzICsgaU1pZDsNCisgICAgfSBlbHNlIGlmICh3SGFzaCA+IHVNaWQpIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQogICAgIH0NCi0gICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwgaW50MzJfdCBpTGVuZ3RoKQ0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQocHN6TmFtZSAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCi0gICAgICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzek5hbWUsIGlMZW5ndGgsIFRSVUUpOw0KLSAgICAgICAgaW50MzJfdCBpRW5kID0gRkRFX0NTU1BST1BFUlRZVkFMVUVfTUFYIC0gMTsNCi0gICAgICAgIGludDMyX3QgaU1pZCwgaVN0YXJ0ID0gMDsNCi0gICAgICAgIEZYX0RXT1JEIGR3TWlkOw0KLSAgICAgICAgZG8gew0KLSAgICAgICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgICAgIGR3TWlkID0gZ19GREVfQ1NTUHJvcGVydHlWYWx1ZXNbaU1pZF0uZHdIYXNoOw0KLSAgICAgICAgICAgIGlmIChkd0hhc2ggPT0gZHdNaWQpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdfRkRFX0NTU1Byb3BlcnR5VmFsdWVzICsgaU1pZDsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA+IGR3TWlkKSB7DQotICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgIHJldHVybiBOVUxMOw0KK30NCitGREVfTFBDQ1NTTEVOR1RIVU5JVFRBQkxFIEZERV9HZXRDU1NMZW5ndGhVbml0QnlOYW1lKGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocHN6TmFtZSAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIEZYX1dPUkQgd0hhc2ggPSAoRlhfV09SRClGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhwc3pOYW1lLCBpTGVuZ3RoLCBUUlVFKTsNCisgIGludDMyX3QgaUVuZCA9DQorICAgICAgc2l6ZW9mKGdfRkRFX0NTU0xlbmd0aFVuaXRzKSAvIHNpemVvZihGREVfQ1NTTEVOR1RIVU5JVFRBQkxFKSAtIDE7DQorICBpbnQzMl90IGlNaWQsIGlTdGFydCA9IDA7DQorICBGWF9XT1JEIHdNaWQ7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICB3TWlkID0gZ19GREVfQ1NTTGVuZ3RoVW5pdHNbaU1pZF0ud0hhc2g7DQorICAgIGlmICh3SGFzaCA9PSB3TWlkKSB7DQorICAgICAgcmV0dXJuIGdfRkRFX0NTU0xlbmd0aFVuaXRzICsgaU1pZDsNCisgICAgfSBlbHNlIGlmICh3SGFzaCA+IHdNaWQpIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQogICAgIH0NCi0gICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5RW51bShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChlTmFtZSA8IEZERV9DU1NQUk9QRVJUWVZBTFVFX01BWCkgPyAoZ19GREVfQ1NTUHJvcGVydHlWYWx1ZXMgKyBlTmFtZSkgOiBOVUxMOw0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZERV9MUENDU1NDT0xPUlRBQkxFIEZERV9HZXRDU1NDb2xvckJ5TmFtZShjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocHN6TmFtZSAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzek5hbWUsIGlMZW5ndGgsIFRSVUUpOw0KKyAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfRkRFX0NTU0NvbG9ycykgLyBzaXplb2YoRkRFX0NTU0NPTE9SVEFCTEUpIC0gMTsNCisgIGludDMyX3QgaU1pZCwgaVN0YXJ0ID0gMDsNCisgIEZYX0RXT1JEIGR3TWlkOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgZHdNaWQgPSBnX0ZERV9DU1NDb2xvcnNbaU1pZF0uZHdIYXNoOw0KKyAgICBpZiAoZHdIYXNoID09IGR3TWlkKSB7DQorICAgICAgcmV0dXJuIGdfRkRFX0NTU0NvbG9ycyArIGlNaWQ7DQorICAgIH0gZWxzZSBpZiAoZHdIYXNoID4gZHdNaWQpIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQogICAgIH0NCi0gICAgRkRFX0xQQ0NTU01FRElBVFlQRVRBQkxFIEZERV9HZXRDU1NNZWRpYVR5cGVCeU5hbWUoY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsIGludDMyX3QgaUxlbmd0aCkNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBzek5hbWUgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQotICAgICAgICBGWF9XT1JEIHdIYXNoID0gKEZYX1dPUkQpRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHN6TmFtZSwgaUxlbmd0aCwgVFJVRSk7DQotICAgICAgICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19GREVfQ1NTTWVkaWFUeXBlcykgLyBzaXplb2YoRkRFX0NTU01FRElBVFlQRVRBQkxFKSAtIDE7DQotICAgICAgICBpbnQzMl90IGlNaWQsIGlTdGFydCA9IDA7DQotICAgICAgICBGWF9XT1JEIHVNaWQ7DQotICAgICAgICBkbyB7DQotICAgICAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICAgICAgdU1pZCA9IGdfRkRFX0NTU01lZGlhVHlwZXNbaU1pZF0ud0hhc2g7DQotICAgICAgICAgICAgaWYgKHdIYXNoID09IHVNaWQpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdfRkRFX0NTU01lZGlhVHlwZXMgKyBpTWlkOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod0hhc2ggPiB1TWlkKSB7DQotICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MIEZERV9QYXJzZUNTU051bWJlcihjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSYgZVVuaXQpIHsNCisgIEZYU1lTX2Fzc2VydChwc3pWYWx1ZSAhPSBOVUxMICYmIGlWYWx1ZUxlbiA+IDApOw0KKyAgaW50MzJfdCBpVXNlZExlbiA9IDA7DQorICBmVmFsdWUgPSBGWF93Y3N0b2YocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJmlVc2VkTGVuKTsNCisgIGlmIChpVXNlZExlbiA8PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlWYWx1ZUxlbiAtPSBpVXNlZExlbjsNCisgIHBzelZhbHVlICs9IGlVc2VkTGVuOw0KKyAgZVVuaXQgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI7DQorICBpZiAoaVZhbHVlTGVuID49IDEgJiYgKnBzelZhbHVlID09ICclJykgew0KKyAgICBlVW5pdCA9IEZERV9DU1NQUklNSVRJVkVUWVBFX1BlcmNlbnQ7DQorICB9IGVsc2UgaWYgKGlWYWx1ZUxlbiA9PSAyKSB7DQorICAgIEZERV9MUENDU1NMRU5HVEhVTklUVEFCTEUgcFVuaXQgPSBGREVfR2V0Q1NTTGVuZ3RoVW5pdEJ5TmFtZShwc3pWYWx1ZSwgMik7DQorICAgIGlmIChwVW5pdCAhPSBOVUxMKSB7DQorICAgICAgZVVuaXQgPSAoRkRFX0NTU1BSSU1JVElWRVRZUEUpcFVuaXQtPndWYWx1ZTsNCiAgICAgfQ0KLSAgICBGREVfTFBDQ1NTTEVOR1RIVU5JVFRBQkxFIEZERV9HZXRDU1NMZW5ndGhVbml0QnlOYW1lKGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lLCBpbnQzMl90IGlMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwc3pOYW1lICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KLSAgICAgICAgRlhfV09SRCB3SGFzaCA9IChGWF9XT1JEKUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzek5hbWUsIGlMZW5ndGgsIFRSVUUpOw0KLSAgICAgICAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfRkRFX0NTU0xlbmd0aFVuaXRzKSAvIHNpemVvZihGREVfQ1NTTEVOR1RIVU5JVFRBQkxFKSAtIDE7DQotICAgICAgICBpbnQzMl90IGlNaWQsIGlTdGFydCA9IDA7DQotICAgICAgICBGWF9XT1JEIHdNaWQ7DQotICAgICAgICBkbyB7DQotICAgICAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICAgICAgd01pZCA9IGdfRkRFX0NTU0xlbmd0aFVuaXRzW2lNaWRdLndIYXNoOw0KLSAgICAgICAgICAgIGlmICh3SGFzaCA9PSB3TWlkKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBnX0ZERV9DU1NMZW5ndGhVbml0cyArIGlNaWQ7DQotICAgICAgICAgICAgfSBlbHNlIGlmICh3SGFzaCA+IHdNaWQpIHsNCi0gICAgICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KKw0KK0ZYX0JPT0wgRkRFX1BhcnNlQ1NTU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpT2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChwc3pWYWx1ZSAhPSBOVUxMICYmIGlWYWx1ZUxlbiA+IDApOw0KKyAgaU9mZnNldCA9IDA7DQorICBpTGVuZ3RoID0gaVZhbHVlTGVuOw0KKyAgaWYgKGlWYWx1ZUxlbiA+PSAyKSB7DQorICAgIEZYX1dDSEFSIGZpcnN0ID0gcHN6VmFsdWVbMF0sIGxhc3QgPSBwc3pWYWx1ZVtpVmFsdWVMZW4gLSAxXTsNCisgICAgaWYgKChmaXJzdCA9PSAnXCInICYmIGxhc3QgPT0gJ1wiJykgfHwgKGZpcnN0ID09ICdcJycgJiYgbGFzdCA9PSAnXCcnKSkgew0KKyAgICAgIGlPZmZzZXQgPSAxLCBpTGVuZ3RoIC09IDI7DQogICAgIH0NCi0gICAgRkRFX0xQQ0NTU0NPTE9SVEFCTEUgRkRFX0dldENTU0NvbG9yQnlOYW1lKGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lLCBpbnQzMl90IGlMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwc3pOYW1lICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KLSAgICAgICAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHN6TmFtZSwgaUxlbmd0aCwgVFJVRSk7DQotICAgICAgICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19GREVfQ1NTQ29sb3JzKSAvIHNpemVvZihGREVfQ1NTQ09MT1JUQUJMRSkgLSAxOw0KLSAgICAgICAgaW50MzJfdCBpTWlkLCBpU3RhcnQgPSAwOw0KLSAgICAgICAgRlhfRFdPUkQgZHdNaWQ7DQotICAgICAgICBkbyB7DQotICAgICAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICAgICAgZHdNaWQgPSBnX0ZERV9DU1NDb2xvcnNbaU1pZF0uZHdIYXNoOw0KLSAgICAgICAgICAgIGlmIChkd0hhc2ggPT0gZHdNaWQpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdfRkRFX0NTU0NvbG9ycyArIGlNaWQ7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPiBkd01pZCkgew0KLSAgICAgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgRlhfQk9PTCBGREVfUGFyc2VDU1NOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgRlhfRkxPQVQgJmZWYWx1ZSwgRkRFX0NTU1BSSU1JVElWRVRZUEUgJmVVbml0KQ0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQocHN6VmFsdWUgIT0gTlVMTCAmJiBpVmFsdWVMZW4gPiAwKTsNCi0gICAgICAgIGludDMyX3QgaVVzZWRMZW4gPSAwOw0KLSAgICAgICAgZlZhbHVlID0gRlhfd2NzdG9mKHBzelZhbHVlLCBpVmFsdWVMZW4sICZpVXNlZExlbik7DQotICAgICAgICBpZiAoaVVzZWRMZW4gPD0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlWYWx1ZUxlbiAtPSBpVXNlZExlbjsNCi0gICAgICAgIHBzelZhbHVlICs9IGlVc2VkTGVuOw0KLSAgICAgICAgZVVuaXQgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI7DQotICAgICAgICBpZiAoaVZhbHVlTGVuID49IDEgJiYgKnBzelZhbHVlID09ICclJykgew0KLSAgICAgICAgICAgIGVVbml0ID0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudDsNCi0gICAgICAgIH0gZWxzZSBpZiAoaVZhbHVlTGVuID09IDIpIHsNCi0gICAgICAgICAgICBGREVfTFBDQ1NTTEVOR1RIVU5JVFRBQkxFIHBVbml0ID0gRkRFX0dldENTU0xlbmd0aFVuaXRCeU5hbWUocHN6VmFsdWUsIDIpOw0KLSAgICAgICAgICAgIGlmIChwVW5pdCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGVVbml0ID0gKEZERV9DU1NQUklNSVRJVkVUWVBFKXBVbml0LT53VmFsdWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlWYWx1ZUxlbiA+IDA7DQorfQ0KKw0KK0ZYX0JPT0wgRkRFX1BhcnNlQ1NTVVJJKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpT2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChwc3pWYWx1ZSAhPSBOVUxMICYmIGlWYWx1ZUxlbiA+IDApOw0KKyAgaWYgKGlWYWx1ZUxlbiA8IDYgfHwgcHN6VmFsdWVbaVZhbHVlTGVuIC0gMV0gIT0gJyknIHx8DQorICAgICAgRlhfd2NzbmljbXAoTCJ1cmwoIiwgcHN6VmFsdWUsIDQpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChGREVfUGFyc2VDU1NTdHJpbmcocHN6VmFsdWUgKyA0LCBpVmFsdWVMZW4gLSA1LCBpT2Zmc2V0LCBpTGVuZ3RoKSkgew0KKyAgICBpT2Zmc2V0ICs9IDQ7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCisNCitGWF9CT09MIEZERV9QYXJzZUNTU0NvbG9yKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiYgZHdDb2xvcikgew0KKyAgRlhTWVNfYXNzZXJ0KHBzelZhbHVlICE9IE5VTEwgJiYgaVZhbHVlTGVuID4gMCk7DQorICBpZiAoKnBzelZhbHVlID09ICcjJykgew0KKyAgICBzd2l0Y2ggKGlWYWx1ZUxlbikgew0KKyAgICAgIGNhc2UgNDogew0KKyAgICAgICAgdWludDhfdCByZWQgPSBGWF9IZXgyRGVjKCh1aW50OF90KXBzelZhbHVlWzFdLCAodWludDhfdClwc3pWYWx1ZVsxXSk7DQorICAgICAgICB1aW50OF90IGdyZWVuID0gRlhfSGV4MkRlYygodWludDhfdClwc3pWYWx1ZVsyXSwgKHVpbnQ4X3QpcHN6VmFsdWVbMl0pOw0KKyAgICAgICAgdWludDhfdCBibHVlID0gRlhfSGV4MkRlYygodWludDhfdClwc3pWYWx1ZVszXSwgKHVpbnQ4X3QpcHN6VmFsdWVbM10pOw0KKyAgICAgICAgZHdDb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCByZWQsIGdyZWVuLCBibHVlKTsNCisgICAgICB9DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICBjYXNlIDc6IHsNCisgICAgICAgIHVpbnQ4X3QgcmVkID0gRlhfSGV4MkRlYygodWludDhfdClwc3pWYWx1ZVsxXSwgKHVpbnQ4X3QpcHN6VmFsdWVbMl0pOw0KKyAgICAgICAgdWludDhfdCBncmVlbiA9IEZYX0hleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbM10sICh1aW50OF90KXBzelZhbHVlWzRdKTsNCisgICAgICAgIHVpbnQ4X3QgYmx1ZSA9IEZYX0hleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbNV0sICh1aW50OF90KXBzelZhbHVlWzZdKTsNCisgICAgICAgIGR3Q29sb3IgPSBBcmdiRW5jb2RlKDI1NSwgcmVkLCBncmVlbiwgYmx1ZSk7DQorICAgICAgfQ0KICAgICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi0NCi0gICAgRlhfQk9PTCBGREVfUGFyc2VDU1NTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgaW50MzJfdCAmaU9mZnNldCwgaW50MzJfdCAmaUxlbmd0aCkNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBzelZhbHVlICE9IE5VTEwgJiYgaVZhbHVlTGVuID4gMCk7DQotICAgICAgICBpT2Zmc2V0ID0gMDsNCi0gICAgICAgIGlMZW5ndGggPSBpVmFsdWVMZW47DQotICAgICAgICBpZiAoaVZhbHVlTGVuID49IDIpIHsNCi0gICAgICAgICAgICBGWF9XQ0hBUiBmaXJzdCA9IHBzelZhbHVlWzBdLCBsYXN0ID0gcHN6VmFsdWVbaVZhbHVlTGVuIC0gMV07DQotICAgICAgICAgICAgaWYgKChmaXJzdCA9PSAnXCInICYmIGxhc3QgPT0gJ1wiJykgfHwgKGZpcnN0ID09ICdcJycgJiYgbGFzdCA9PSAnXCcnKSkgew0KLSAgICAgICAgICAgICAgICBpT2Zmc2V0ID0gMSwgaUxlbmd0aCAtPSAyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpVmFsdWVMZW4gPiAwOw0KKyAgfSBlbHNlIGlmIChpVmFsdWVMZW4gPj0gMTApIHsNCisgICAgaWYgKHBzelZhbHVlW2lWYWx1ZUxlbiAtIDFdICE9ICcpJyB8fCBGWF93Y3NuaWNtcChMInJnYigiLCBwc3pWYWx1ZSwgNCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0NCi0gICAgRlhfQk9PTCBGREVfUGFyc2VDU1NVUkkoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgaW50MzJfdCAmaU9mZnNldCwgaW50MzJfdCAmaUxlbmd0aCkNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBzelZhbHVlICE9IE5VTEwgJiYgaVZhbHVlTGVuID4gMCk7DQotICAgICAgICBpZiAoaVZhbHVlTGVuIDwgNiB8fCBwc3pWYWx1ZVtpVmFsdWVMZW4gLSAxXSAhPSAnKScgfHwgRlhfd2NzbmljbXAoTCJ1cmwoIiwgcHN6VmFsdWUsIDQpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKEZERV9QYXJzZUNTU1N0cmluZyhwc3pWYWx1ZSArIDQsIGlWYWx1ZUxlbiAtIDUsIGlPZmZzZXQsIGlMZW5ndGgpKSB7DQotICAgICAgICAgICAgaU9mZnNldCArPSA0Ow0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KKyAgICB1aW50OF90IHJnYlszXSA9IHswfTsNCisgICAgRlhfRkxPQVQgZlZhbHVlOw0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCisgICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgbGlzdChwc3pWYWx1ZSArIDQsIGlWYWx1ZUxlbiAtIDUsICcsJyk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7ICsraSkgew0KKyAgICAgIGlmICghbGlzdC5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQogICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0NCi0gICAgRlhfQk9PTCBGREVfUGFyc2VDU1NDb2xvcihjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBGWF9BUkdCICZkd0NvbG9yKQ0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQocHN6VmFsdWUgIT0gTlVMTCAmJiBpVmFsdWVMZW4gPiAwKTsNCi0gICAgICAgIGlmICgqcHN6VmFsdWUgPT0gJyMnKSB7DQotICAgICAgICAgICAgc3dpdGNoIChpVmFsdWVMZW4pIHsNCi0gICAgICAgICAgICAgICAgY2FzZSA0OiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZWQgPSBGWF9IZXgyRGVjKCh1aW50OF90KXBzelZhbHVlWzFdLCAodWludDhfdClwc3pWYWx1ZVsxXSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBncmVlbiA9IEZYX0hleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbMl0sICh1aW50OF90KXBzelZhbHVlWzJdKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJsdWUgPSBGWF9IZXgyRGVjKCh1aW50OF90KXBzelZhbHVlWzNdLCAodWludDhfdClwc3pWYWx1ZVszXSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZHdDb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCByZWQsIGdyZWVuLCBibHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICBjYXNlIDc6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlZCA9IEZYX0hleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbMV0sICh1aW50OF90KXBzelZhbHVlWzJdKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGdyZWVuID0gRlhfSGV4MkRlYygodWludDhfdClwc3pWYWx1ZVszXSwgKHVpbnQ4X3QpcHN6VmFsdWVbNF0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmx1ZSA9IEZYX0hleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbNV0sICh1aW50OF90KXBzelZhbHVlWzZdKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkd0NvbG9yID0gQXJnYkVuY29kZSgyNTUsIHJlZCwgZ3JlZW4sIGJsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChpVmFsdWVMZW4gPj0gMTApIHsNCi0gICAgICAgICAgICBpZiAocHN6VmFsdWVbaVZhbHVlTGVuIC0gMV0gIT0gJyknIHx8IEZYX3djc25pY21wKEwicmdiKCIsIHBzelZhbHVlLCA0KSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHVpbnQ4X3QgcmdiWzNdID0gezB9Ow0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZTsNCi0gICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCi0gICAgICAgICAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBsaXN0KHBzelZhbHVlICsgNCwgaVZhbHVlTGVuIC0gNSwgJywnKTsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyArK2kpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFsaXN0Lk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgIT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKCFGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVHlwZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZ2JbaV0gPSBlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QZXJjZW50ID8gRlhTWVNfcm91bmQoZlZhbHVlICogMi41NWYpIDogRlhTWVNfcm91bmQoZlZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZHdDb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdKTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRkRFX0xQQ0NTU0NPTE9SVEFCTEUgcENvbG9yID0gRkRFX0dldENTU0NvbG9yQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgIGlmIChwQ29sb3IgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBkd0NvbG9yID0gcENvbG9yLT5kd1ZhbHVlOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChlVHlwZSAhPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIpIHsNCiAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaWYgKCFGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVHlwZSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgcmdiW2ldID0gZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudA0KKyAgICAgICAgICAgICAgICAgICA/IEZYU1lTX3JvdW5kKGZWYWx1ZSAqIDIuNTVmKQ0KKyAgICAgICAgICAgICAgICAgICA6IEZYU1lTX3JvdW5kKGZWYWx1ZSk7DQogICAgIH0NCisgICAgZHdDb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9IGVsc2Ugew0KKyAgICBGREVfTFBDQ1NTQ09MT1JUQUJMRSBwQ29sb3IgPSBGREVfR2V0Q1NTQ29sb3JCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgIGlmIChwQ29sb3IgIT0gTlVMTCkgew0KKyAgICAgIGR3Q29sb3IgPSBwQ29sb3ItPmR3VmFsdWU7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQogI2lmZGVmIF9jcGx1c3BsdXMNCiB9Ow0KICNlbmRpZg0KLUNGREVfQ1NTVmFsdWVMaXN0OjpDRkRFX0NTU1ZhbHVlTGlzdChJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIGNvbnN0IENGREVfQ1NTVmFsdWVBcnJheSAmbGlzdCkNCi17DQotICAgIG1faUNvdW50ID0gbGlzdC5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaUJ5dGVDb3VudCA9IG1faUNvdW50ICogc2l6ZW9mKElGREVfQ1NTVmFsdWUqKTsNCi0gICAgbV9wcExpc3QgPSAoSUZERV9DU1NWYWx1ZSoqKXBTdGF0aWNTdG9yZS0+QWxsb2MoaUJ5dGVDb3VudCk7DQotICAgIEZYU1lTX21lbWNweShtX3BwTGlzdCwgbGlzdC5HZXREYXRhKCksIGlCeXRlQ291bnQpOw0KK0NGREVfQ1NTVmFsdWVMaXN0OjpDRkRFX0NTU1ZhbHVlTGlzdChJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGREVfQ1NTVmFsdWVBcnJheSYgbGlzdCkgew0KKyAgbV9pQ291bnQgPSBsaXN0LkdldFNpemUoKTsNCisgIGludDMyX3QgaUJ5dGVDb3VudCA9IG1faUNvdW50ICogc2l6ZW9mKElGREVfQ1NTVmFsdWUqKTsNCisgIG1fcHBMaXN0ID0gKElGREVfQ1NTVmFsdWUqKilwU3RhdGljU3RvcmUtPkFsbG9jKGlCeXRlQ291bnQpOw0KKyAgRlhTWVNfbWVtY3B5KG1fcHBMaXN0LCBsaXN0LkdldERhdGEoKSwgaUJ5dGVDb3VudCk7DQogfQ0KLUZYX0JPT0wgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXI6Ok5leHRWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRSAmZVR5cGUsIGNvbnN0IEZYX1dDSEFSKiAmcFN0YXJ0LCBpbnQzMl90ICZpTGVuZ3RoKQ0KLXsNCi0gICAgd2hpbGUgKG1fcEN1ciA8IG1fcEVuZCAmJiAoKm1fcEN1ciA8PSAnICcgfHwgKm1fcEN1ciA9PSBtX1NlcGFyYXRvcikpIHsNCi0gICAgICAgICsrbV9wQ3VyOw0KK0ZYX0JPT0wgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXI6Ok5leHRWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRSYgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiYgcFN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTGVuZ3RoKSB7DQorICB3aGlsZSAobV9wQ3VyIDwgbV9wRW5kICYmICgqbV9wQ3VyIDw9ICcgJyB8fCAqbV9wQ3VyID09IG1fU2VwYXJhdG9yKSkgew0KKyAgICArK21fcEN1cjsNCisgIH0NCisgIGlmIChtX3BDdXIgPj0gbV9wRW5kKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGVUeXBlID0gRkRFX0NTU1BSSU1JVElWRVRZUEVfVW5rbm93bjsNCisgIHBTdGFydCA9IG1fcEN1cjsNCisgIGlMZW5ndGggPSAwOw0KKyAgRlhfV0NIQVIgd2NoID0gKm1fcEN1cjsNCisgIGlmICh3Y2ggPT0gJyMnKSB7DQorICAgIGlMZW5ndGggPSBTa2lwVG8oJyAnKTsNCisgICAgaWYgKGlMZW5ndGggPT0gNCB8fCBpTGVuZ3RoID09IDcpIHsNCisgICAgICBlVHlwZSA9IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjsNCiAgICAgfQ0KLSAgICBpZiAobV9wQ3VyID49IG1fcEVuZCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfSBlbHNlIGlmICgod2NoID49ICcwJyAmJiB3Y2ggPD0gJzknKSB8fCB3Y2ggPT0gJy4nIHx8IHdjaCA9PSAnLScgfHwNCisgICAgICAgICAgICAgd2NoID09ICcrJykgew0KKyAgICB3aGlsZSAobV9wQ3VyIDwgbV9wRW5kICYmICgqbV9wQ3VyID4gJyAnICYmICptX3BDdXIgIT0gbV9TZXBhcmF0b3IpKSB7DQorICAgICAgKyttX3BDdXI7DQogICAgIH0NCi0gICAgZVR5cGUgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9Vbmtub3duOw0KLSAgICBwU3RhcnQgPSBtX3BDdXI7DQotICAgIGlMZW5ndGggPSAwOw0KLSAgICBGWF9XQ0hBUiB3Y2ggPSAqbV9wQ3VyOw0KLSAgICBpZiAod2NoID09ICcjJykgew0KLSAgICAgICAgaUxlbmd0aCA9IFNraXBUbygnICcpOw0KLSAgICAgICAgaWYgKGlMZW5ndGggPT0gNCB8fCBpTGVuZ3RoID09IDcpIHsNCi0gICAgICAgICAgICBlVHlwZSA9IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmICgod2NoID49ICcwJyAmJiB3Y2ggPD0gJzknKSB8fCB3Y2ggPT0gJy4nIHx8IHdjaCA9PSAnLScgfHwgd2NoID09ICcrJykgew0KLSAgICAgICAgd2hpbGUgKG1fcEN1ciA8IG1fcEVuZCAmJiAoKm1fcEN1ciA+ICcgJyAmJiAqbV9wQ3VyICE9IG1fU2VwYXJhdG9yKSkgew0KLSAgICAgICAgICAgICsrbV9wQ3VyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaUxlbmd0aCA9IG1fcEN1ciAtIHBTdGFydDsNCi0gICAgICAgIGlmIChpTGVuZ3RoID4gMCkgew0KLSAgICAgICAgICAgIGVUeXBlID0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKHdjaCA9PSAnXCInIHx8IHdjaCA9PSAnXCcnKSB7DQotICAgICAgICBwU3RhcnQrKzsNCi0gICAgICAgIGlMZW5ndGggPSBTa2lwVG8od2NoKSAtIDE7DQorICAgIGlMZW5ndGggPSBtX3BDdXIgLSBwU3RhcnQ7DQorICAgIGlmIChpTGVuZ3RoID4gMCkgew0KKyAgICAgIGVUeXBlID0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKHdjaCA9PSAnXCInIHx8IHdjaCA9PSAnXCcnKSB7DQorICAgIHBTdGFydCsrOw0KKyAgICBpTGVuZ3RoID0gU2tpcFRvKHdjaCkgLSAxOw0KKyAgICBtX3BDdXIrKzsNCisgICAgZVR5cGUgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc7DQorICB9IGVsc2UgaWYgKG1fcEVuZCAtIG1fcEN1ciA+IDUgJiYgbV9wQ3VyWzNdID09ICcoJykgew0KKyAgICBpZiAoRlhfd2NzbmljbXAoTCJ1cmwiLCBtX3BDdXIsIDMpID09IDApIHsNCisgICAgICB3Y2ggPSBtX3BDdXJbNF07DQorICAgICAgaWYgKHdjaCA9PSAnXCInIHx8IHdjaCA9PSAnXCcnKSB7DQorICAgICAgICBwU3RhcnQgKz0gNTsNCisgICAgICAgIGlMZW5ndGggPSBTa2lwVG8od2NoKSAtIDY7DQorICAgICAgICBtX3BDdXIgKz0gMjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcFN0YXJ0ICs9IDQ7DQorICAgICAgICBpTGVuZ3RoID0gU2tpcFRvKCcpJykgLSA0Ow0KICAgICAgICAgbV9wQ3VyKys7DQotICAgICAgICBlVHlwZSA9IEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzsNCi0gICAgfSBlbHNlIGlmIChtX3BFbmQgLSBtX3BDdXIgPiA1ICYmIG1fcEN1clszXSA9PSAnKCcpIHsNCi0gICAgICAgIGlmIChGWF93Y3NuaWNtcChMInVybCIsIG1fcEN1ciwgMykgPT0gMCkgew0KLSAgICAgICAgICAgIHdjaCA9IG1fcEN1cls0XTsNCi0gICAgICAgICAgICBpZiAod2NoID09ICdcIicgfHwgd2NoID09ICdcJycpIHsNCi0gICAgICAgICAgICAgICAgcFN0YXJ0ICs9IDU7DQotICAgICAgICAgICAgICAgIGlMZW5ndGggPSBTa2lwVG8od2NoKSAtIDY7DQotICAgICAgICAgICAgICAgIG1fcEN1ciArPSAyOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBTdGFydCArPSA0Ow0KLSAgICAgICAgICAgICAgICBpTGVuZ3RoID0gU2tpcFRvKCcpJykgLSA0Ow0KLSAgICAgICAgICAgICAgICBtX3BDdXIrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZVR5cGUgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9VUkk7DQotICAgICAgICB9IGVsc2UgaWYgKEZYX3djc25pY21wKEwicmdiIiwgbV9wQ3VyLCAzKSA9PSAwKSB7DQotICAgICAgICAgICAgaUxlbmd0aCA9IFNraXBUbygnKScpICsgMTsNCi0gICAgICAgICAgICBtX3BDdXIrKzsNCi0gICAgICAgICAgICBlVHlwZSA9IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlMZW5ndGggPSBTa2lwVG8obV9TZXBhcmF0b3IsIFRSVUUsIFRSVUUpOw0KLSAgICAgICAgZVR5cGUgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc7DQorICAgICAgfQ0KKyAgICAgIGVUeXBlID0gRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJOw0KKyAgICB9IGVsc2UgaWYgKEZYX3djc25pY21wKEwicmdiIiwgbV9wQ3VyLCAzKSA9PSAwKSB7DQorICAgICAgaUxlbmd0aCA9IFNraXBUbygnKScpICsgMTsNCisgICAgICBtX3BDdXIrKzsNCisgICAgICBlVHlwZSA9IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjsNCiAgICAgfQ0KLSAgICByZXR1cm4gbV9wQ3VyIDw9IG1fcEVuZCAmJiBpTGVuZ3RoID4gMDsNCisgIH0gZWxzZSB7DQorICAgIGlMZW5ndGggPSBTa2lwVG8obV9TZXBhcmF0b3IsIFRSVUUsIFRSVUUpOw0KKyAgICBlVHlwZSA9IEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzsNCisgIH0NCisgIHJldHVybiBtX3BDdXIgPD0gbV9wRW5kICYmIGlMZW5ndGggPiAwOw0KIH0NCi1pbnQzMl90IENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyOjpTa2lwVG8oRlhfV0NIQVIgd2NoLCBGWF9CT09MIGJXU1NlcGFyYXRvciAsIEZYX0JPT0wgYkJyQ29udGludWUgKQ0KLXsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IG1fcEN1cjsNCi0gICAgaWYgKCFiQnJDb250aW51ZSkgew0KLSAgICAgICAgaWYgKGJXU1NlcGFyYXRvcikNCi0gICAgICAgICAgICB3aGlsZSAoKyttX3BDdXIgPCBtX3BFbmQgJiYgKm1fcEN1ciAhPSB3Y2ggJiYgKm1fcEN1ciA+ICcgJykgOw0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHdoaWxlICgrK21fcEN1ciA8IG1fcEVuZCAmJiAqbV9wQ3VyICE9IHdjaCkgOw0KK2ludDMyX3QgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXI6OlNraXBUbyhGWF9XQ0hBUiB3Y2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldTU2VwYXJhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCckNvbnRpbnVlKSB7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gbV9wQ3VyOw0KKyAgaWYgKCFiQnJDb250aW51ZSkgew0KKyAgICBpZiAoYldTU2VwYXJhdG9yKQ0KKyAgICAgIHdoaWxlICgrK21fcEN1cjxtX3BFbmQmJiAqIG1fcEN1ciAhPSB3Y2gmJiAqIG1fcEN1cj4gJyAnKQ0KKyAgICAgICAgOw0KKyAgICBlbHNlDQorICAgICAgd2hpbGUgKCsrbV9wQ3VyIDwgbV9wRW5kICYmICptX3BDdXIgIT0gd2NoKQ0KKyAgICAgICAgOw0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBpQnJhY2tldENvdW50ID0gMDsNCisgICAgaWYgKGJXU1NlcGFyYXRvcikgew0KKyAgICAgIHdoaWxlIChtX3BDdXI8bV9wRW5kJiYgKiBtX3BDdXIgIT0gd2NoJiYgKiBtX3BDdXI+ICcgJykgew0KKyAgICAgICAgaWYgKCptX3BDdXIgPT0gJygnKSB7DQorICAgICAgICAgIGlCcmFja2V0Q291bnQrKzsNCisgICAgICAgIH0gZWxzZSBpZiAoKm1fcEN1ciA9PSAnKScpIHsNCisgICAgICAgICAgaUJyYWNrZXRDb3VudC0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wQ3VyKys7DQorICAgICAgfQ0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgaW50MzJfdCBpQnJhY2tldENvdW50ID0gMDsNCi0gICAgICAgIGlmIChiV1NTZXBhcmF0b3IpIHsNCi0gICAgICAgICAgICB3aGlsZSAobV9wQ3VyIDwgbV9wRW5kICYmICptX3BDdXIgIT0gd2NoICYmICptX3BDdXIgPiAnICcpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCptX3BDdXIgPT0gJygnKSB7DQotICAgICAgICAgICAgICAgICAgICBpQnJhY2tldENvdW50Kys7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKm1fcEN1ciA9PSAnKScpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlCcmFja2V0Q291bnQtLTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BDdXIrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdoaWxlIChtX3BDdXIgPCBtX3BFbmQgJiYgKm1fcEN1ciAhPSB3Y2gpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCptX3BDdXIgPT0gJygnKSB7DQotICAgICAgICAgICAgICAgICAgICBpQnJhY2tldENvdW50Kys7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKm1fcEN1ciA9PSAnKScpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlCcmFja2V0Q291bnQtLTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BDdXIrKzsNCi0gICAgICAgICAgICB9DQorICAgICAgd2hpbGUgKG1fcEN1ciA8IG1fcEVuZCAmJiAqbV9wQ3VyICE9IHdjaCkgew0KKyAgICAgICAgaWYgKCptX3BDdXIgPT0gJygnKSB7DQorICAgICAgICAgIGlCcmFja2V0Q291bnQrKzsNCisgICAgICAgIH0gZWxzZSBpZiAoKm1fcEN1ciA9PSAnKScpIHsNCisgICAgICAgICAgaUJyYWNrZXRDb3VudC0tOw0KICAgICAgICAgfQ0KLSAgICAgICAgd2hpbGUgKGlCcmFja2V0Q291bnQgPiAwICYmIG1fcEN1ciA8IG1fcEVuZCkgew0KLSAgICAgICAgICAgIGlmICgqbV9wQ3VyID09ICcpJykgew0KLSAgICAgICAgICAgICAgICBpQnJhY2tldENvdW50LS07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fcEN1cisrOw0KLSAgICAgICAgfQ0KKyAgICAgICAgbV9wQ3VyKys7DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiBtX3BDdXIgLSBwU3RhcnQ7DQorICAgIHdoaWxlIChpQnJhY2tldENvdW50ID4gMCAmJiBtX3BDdXIgPCBtX3BFbmQpIHsNCisgICAgICBpZiAoKm1fcEN1ciA9PSAnKScpIHsNCisgICAgICAgIGlCcmFja2V0Q291bnQtLTsNCisgICAgICB9DQorICAgICAgbV9wQ3VyKys7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBtX3BDdXIgLSBwU3RhcnQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5oIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGF0YXRhYmxlLmgKaW5kZXggMDVjZDJhZS4uZjRmNWMzYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGF0YXRhYmxlLmgKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGF0YXRhYmxlLmgKQEAgLTYsMTg5ICs2LDE5MyBAQAogDQogI2lmbmRlZiBfRkRFX0NTU0RBVEFUQUJMRQ0KICNkZWZpbmUgX0ZERV9DU1NEQVRBVEFCTEUNCi1jbGFzcyBDRkRFX0NTU0Z1bmN0aW9uOiBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfQ1NTRnVuY3Rpb24oY29uc3QgRlhfV0NIQVIqIHBzekZ1bmNOYW1lLCBJRkRFX0NTU1ZhbHVlTGlzdCAqcEFyZ0xpc3QpOiBtX3BzekZ1bmNOYW1lKHBzekZ1bmNOYW1lKSwgbV9wQXJnTGlzdChwQXJnTGlzdCkNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBBcmdMaXN0ICE9IE5VTEwpOw0KLSAgICB9DQotICAgIGludDMyX3QJCQkJQ291bnRBcmdzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcEFyZ0xpc3QtPkNvdW50VmFsdWVzKCk7DQotICAgIH0NCi0gICAgSUZERV9DU1NWYWx1ZSoJCQlHZXRBcmdzKGludDMyX3QgaW5kZXgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BBcmdMaXN0LT5HZXRWYWx1ZShpbmRleCk7DQotICAgIH0NCi0gICAgY29uc3QgRlhfV0NIQVIqCQkJCUdldEZ1bmNOYW1lKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcHN6RnVuY05hbWU7DQotICAgIH07DQorY2xhc3MgQ0ZERV9DU1NGdW5jdGlvbiA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9DU1NGdW5jdGlvbihjb25zdCBGWF9XQ0hBUiogcHN6RnVuY05hbWUsIElGREVfQ1NTVmFsdWVMaXN0KiBwQXJnTGlzdCkNCisgICAgICA6IG1fcHN6RnVuY05hbWUocHN6RnVuY05hbWUpLCBtX3BBcmdMaXN0KHBBcmdMaXN0KSB7DQorICAgIEZYU1lTX2Fzc2VydChwQXJnTGlzdCAhPSBOVUxMKTsNCisgIH0NCisgIGludDMyX3QgQ291bnRBcmdzKCkgY29uc3QgeyByZXR1cm4gbV9wQXJnTGlzdC0+Q291bnRWYWx1ZXMoKTsgfQ0KKyAgSUZERV9DU1NWYWx1ZSogR2V0QXJncyhpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIHJldHVybiBtX3BBcmdMaXN0LT5HZXRWYWx1ZShpbmRleCk7DQorICB9DQorICBjb25zdCBGWF9XQ0hBUiogR2V0RnVuY05hbWUoKSBjb25zdCB7IHJldHVybiBtX3BzekZ1bmNOYW1lOyB9Ow0KIA0KLXByb3RlY3RlZDoNCi0gICAgSUZERV9DU1NWYWx1ZUxpc3QJCQkJKm1fcEFyZ0xpc3Q7DQotICAgIGNvbnN0IEZYX1dDSEFSKgkJCQkJCW1fcHN6RnVuY05hbWU7DQorIHByb3RlY3RlZDoNCisgIElGREVfQ1NTVmFsdWVMaXN0KiBtX3BBcmdMaXN0Ow0KKyAgY29uc3QgRlhfV0NIQVIqIG1fcHN6RnVuY05hbWU7DQogfTsNCi1jbGFzcyBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlIDogcHVibGljIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUsIHB1YmxpYyBDRlhfVGFyZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShjb25zdCBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICZzcmMpDQotICAgIHsNCi0gICAgICAgICp0aGlzID0gc3JjOw0KLSAgICB9DQotICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRlhfQVJHQiBjb2xvcikgOiBtX2VUeXBlKEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQiksIG1fZHdDb2xvcihjb2xvcikgeyB9DQotICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSA6IG1fZVR5cGUoRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgLCBtX2VFbnVtKGVWYWx1ZSkgeyB9DQotICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGUsIEZYX0ZMT0FUIGZWYWx1ZSkgOiBtX2VUeXBlKGVUeXBlKSwgbV9mTnVtYmVyKGZWYWx1ZSkgeyB9DQotICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGUsIGNvbnN0IEZYX1dDSEFSKiBwVmFsdWUpIDogbV9lVHlwZShlVHlwZSksIG1fcFN0cmluZyhwVmFsdWUpDQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChtX3BTdHJpbmcgIT0gTlVMTCk7DQotICAgIH0NCi0gICAgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShDRkRFX0NTU0Z1bmN0aW9uICpwRnVuY3Rpb24pIDogbV9lVHlwZShGREVfQ1NTUFJJTUlUSVZFVFlQRV9GdW5jdGlvbiksIG1fcEZ1bmN0aW9uKHBGdW5jdGlvbikge30NCitjbGFzcyBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlIDogcHVibGljIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShjb25zdCBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlJiBzcmMpIHsgKnRoaXMgPSBzcmM7IH0NCisgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRlhfQVJHQiBjb2xvcikNCisgICAgICA6IG1fZVR5cGUoRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSwgbV9kd0NvbG9yKGNvbG9yKSB7fQ0KKyAgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQorICAgICAgOiBtX2VUeXBlKEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pLCBtX2VFbnVtKGVWYWx1ZSkge30NCisgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGUsIEZYX0ZMT0FUIGZWYWx1ZSkNCisgICAgICA6IG1fZVR5cGUoZVR5cGUpLCBtX2ZOdW1iZXIoZlZhbHVlKSB7fQ0KKyAgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZSwgY29uc3QgRlhfV0NIQVIqIHBWYWx1ZSkNCisgICAgICA6IG1fZVR5cGUoZVR5cGUpLCBtX3BTdHJpbmcocFZhbHVlKSB7DQorICAgIEZYU1lTX2Fzc2VydChtX3BTdHJpbmcgIT0gTlVMTCk7DQorICB9DQorICBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKENGREVfQ1NTRnVuY3Rpb24qIHBGdW5jdGlvbikNCisgICAgICA6IG1fZVR5cGUoRkRFX0NTU1BSSU1JVElWRVRZUEVfRnVuY3Rpb24pLCBtX3BGdW5jdGlvbihwRnVuY3Rpb24pIHt9DQogDQotICAgIHZpcnR1YWwgRkRFX0NTU1BSSU1JVElWRVRZUEUJR2V0UHJpbWl0aXZlVHlwZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2VUeXBlOw0KLSAgICB9DQorICB2aXJ0dWFsIEZERV9DU1NQUklNSVRJVkVUWVBFIEdldFByaW1pdGl2ZVR5cGUoKSBjb25zdCB7IHJldHVybiBtX2VUeXBlOyB9DQogDQotICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0UkdCQ29sb3IoKSBjb25zdA0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQobV9lVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpOw0KLSAgICAgICAgcmV0dXJuIG1fZHdDb2xvcjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZsb2F0KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fZVR5cGUgPj0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmIG1fZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpOw0KLSAgICAgICAgcmV0dXJuIG1fZk51bWJlcjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKgkJCQlHZXRTdHJpbmcoaW50MzJfdCAmaUxlbmd0aCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fZVR5cGUgPj0gRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nICYmIG1fZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJKTsNCi0gICAgICAgIGlMZW5ndGggPSBGWFNZU193Y3NsZW4obV9wU3RyaW5nKTsNCi0gICAgICAgIHJldHVybiBtX3BTdHJpbmc7DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTUFJPUEVSVFlWQUxVRQlHZXRFbnVtKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSk7DQotICAgICAgICByZXR1cm4gbV9lRW51bTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsCWNvbnN0IEZYX1dDSEFSKgkJCQlHZXRGdW5jTmFtZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChtX2VUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0Z1bmN0aW9uKTsNCi0gICAgICAgIHJldHVybiBtX3BGdW5jdGlvbi0+R2V0RnVuY05hbWUoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJQ291bnRBcmdzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRnVuY3Rpb24pOw0KLSAgICAgICAgcmV0dXJuIG1fcEZ1bmN0aW9uLT5Db3VudEFyZ3MoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqCQkJR2V0QXJncyhpbnQzMl90IGluZGV4KSBjb25zdA0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQobV9lVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9GdW5jdGlvbik7DQotICAgICAgICByZXR1cm4gbV9wRnVuY3Rpb24tPkdldEFyZ3MoaW5kZXgpOw0KLSAgICB9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0UkdCQ29sb3IoKSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChtX2VUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQik7DQorICAgIHJldHVybiBtX2R3Q29sb3I7DQorICB9DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZsb2F0KCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQobV9lVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYNCisgICAgICAgICAgICAgICAgIG1fZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpOw0KKyAgICByZXR1cm4gbV9mTnVtYmVyOw0KKyAgfQ0KKyAgdmlydHVhbCBjb25zdCBGWF9XQ0hBUiogR2V0U3RyaW5nKGludDMyX3QmIGlMZW5ndGgpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fZVR5cGUgPj0gRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nICYmDQorICAgICAgICAgICAgICAgICBtX2VUeXBlIDw9IEZERV9DU1NQUklNSVRJVkVUWVBFX1VSSSk7DQorICAgIGlMZW5ndGggPSBGWFNZU193Y3NsZW4obV9wU3RyaW5nKTsNCisgICAgcmV0dXJuIG1fcFN0cmluZzsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1BST1BFUlRZVkFMVUUgR2V0RW51bSgpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSk7DQorICAgIHJldHVybiBtX2VFbnVtOw0KKyAgfQ0KKyAgdmlydHVhbCBjb25zdCBGWF9XQ0hBUiogR2V0RnVuY05hbWUoKSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChtX2VUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0Z1bmN0aW9uKTsNCisgICAgcmV0dXJuIG1fcEZ1bmN0aW9uLT5HZXRGdW5jTmFtZSgpOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50QXJncygpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRnVuY3Rpb24pOw0KKyAgICByZXR1cm4gbV9wRnVuY3Rpb24tPkNvdW50QXJncygpOw0KKyAgfQ0KKyAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlKiBHZXRBcmdzKGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRnVuY3Rpb24pOw0KKyAgICByZXR1cm4gbV9wRnVuY3Rpb24tPkdldEFyZ3MoaW5kZXgpOw0KKyAgfQ0KIA0KLSAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRQkJCW1fZVR5cGU7DQotICAgIHVuaW9uIHsNCi0gICAgICAgIEZYX0FSR0IJCQkJCQltX2R3Q29sb3I7DQotICAgICAgICBGWF9GTE9BVAkJCQkJbV9mTnVtYmVyOw0KLSAgICAgICAgY29uc3QgRlhfV0NIQVIqCQkJCQltX3BTdHJpbmc7DQotICAgICAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRQkJbV9lRW51bTsNCi0gICAgICAgIENGREVfQ1NTRnVuY3Rpb24JCQkqbV9wRnVuY3Rpb247DQotICAgIH07DQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBtX2VUeXBlOw0KKyAgdW5pb24gew0KKyAgICBGWF9BUkdCIG1fZHdDb2xvcjsNCisgICAgRlhfRkxPQVQgbV9mTnVtYmVyOw0KKyAgICBjb25zdCBGWF9XQ0hBUiogbV9wU3RyaW5nOw0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBtX2VFbnVtOw0KKyAgICBDRkRFX0NTU0Z1bmN0aW9uKiBtX3BGdW5jdGlvbjsNCisgIH07DQogfTsNCiB0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqPiBDRkRFX0NTU1ByaW1pdGl2ZUFycmF5Ow0KIHR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8SUZERV9DU1NWYWx1ZSo+IENGREVfQ1NTVmFsdWVBcnJheTsNCi1jbGFzcyBDRkRFX0NTU1ZhbHVlTGlzdCA6IHB1YmxpYyBJRkRFX0NTU1ZhbHVlTGlzdCwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX0NTU1ZhbHVlTGlzdChJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIGNvbnN0IENGREVfQ1NTVmFsdWVBcnJheSAmbGlzdCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlDb3VudFZhbHVlcygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lDb3VudDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqCQkJR2V0VmFsdWUoaW50MzJfdCBpbmRleCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcHBMaXN0W2luZGV4XTsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgSUZERV9DU1NWYWx1ZQkJCQkJKiptX3BwTGlzdDsNCi0gICAgaW50MzJfdAkJCQkJCW1faUNvdW50Ow0KK2NsYXNzIENGREVfQ1NTVmFsdWVMaXN0IDogcHVibGljIElGREVfQ1NTVmFsdWVMaXN0LCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQ1NTVmFsdWVMaXN0KElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGREVfQ1NTVmFsdWVBcnJheSYgbGlzdCk7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX2lDb3VudDsgfQ0KKyAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlKiBHZXRWYWx1ZShpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIHJldHVybiBtX3BwTGlzdFtpbmRleF07DQorICB9DQorDQorIHByb3RlY3RlZDoNCisgIElGREVfQ1NTVmFsdWUqKiBtX3BwTGlzdDsNCisgIGludDMyX3QgbV9pQ291bnQ7DQogfTsNCi1jbGFzcyBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciA6IHB1YmxpYyBDRlhfVGFyZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIoY29uc3QgRlhfV0NIQVIqIHBzeiwgaW50MzJfdCBpTGVuLCBGWF9XQ0hBUiBzZXBhcmF0b3IpDQotICAgICAgICA6IG1fU2VwYXJhdG9yKHNlcGFyYXRvciksIG1fcEN1cihwc3opLCBtX3BFbmQocHN6ICsgaUxlbikNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBzeiAhPSBOVUxMICYmIGlMZW4gPiAwKTsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQkJTmV4dFZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFICZlVHlwZSwgY29uc3QgRlhfV0NIQVIqICZwU3RhcnQsIGludDMyX3QgJmlMZW5ndGgpOw0KLSAgICBGWF9XQ0hBUgkJbV9TZXBhcmF0b3I7DQotcHJvdGVjdGVkOg0KLSAgICBpbnQzMl90CQlTa2lwVG8oRlhfV0NIQVIgd2NoLCBGWF9CT09MIGJXU1NlcGFyYXRvciA9IEZBTFNFLCBGWF9CT09MIGJCckNvbnRpbnVlID0gRkFMU0UpOw0KLSAgICBjb25zdCBGWF9XQ0hBUioJCW1fcEN1cjsNCi0gICAgY29uc3QgRlhfV0NIQVIqCQltX3BFbmQ7DQorY2xhc3MgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyKGNvbnN0IEZYX1dDSEFSKiBwc3osIGludDMyX3QgaUxlbiwgRlhfV0NIQVIgc2VwYXJhdG9yKQ0KKyAgICAgIDogbV9TZXBhcmF0b3Ioc2VwYXJhdG9yKSwgbV9wQ3VyKHBzeiksIG1fcEVuZChwc3ogKyBpTGVuKSB7DQorICAgIEZYU1lTX2Fzc2VydChwc3ogIT0gTlVMTCAmJiBpTGVuID4gMCk7DQorICB9DQorICBGWF9CT09MIE5leHRWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRSYgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiomIHBTdGFydCwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlMZW5ndGgpOw0KKyAgRlhfV0NIQVIgbV9TZXBhcmF0b3I7DQorDQorIHByb3RlY3RlZDoNCisgIGludDMyX3QgU2tpcFRvKEZYX1dDSEFSIHdjaCwNCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldTU2VwYXJhdG9yID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICBGWF9CT09MIGJCckNvbnRpbnVlID0gRkFMU0UpOw0KKyAgY29uc3QgRlhfV0NIQVIqIG1fcEN1cjsNCisgIGNvbnN0IEZYX1dDSEFSKiBtX3BFbmQ7DQogfTsNCiAjaWZkZWYgX2NwbHVzcGx1cw0KIGV4dGVybiAiQyIgew0KICNlbmRpZg0KLSNkZWZpbmUgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcgkweDAxMDANCi0jZGVmaW5lIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtCQkweDAyMDANCi0jZGVmaW5lIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkkJCTB4MDQwMA0KLSNkZWZpbmUgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZwkweDA4MDANCi0jZGVmaW5lIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcgkJMHgxMDAwDQotI2RlZmluZSBGREVfQ1NTVkFMVUVUWVBFX01heWJlRnVuY3Rpb24JMHgyMDAwDQotI2RlZmluZSBGREVfSXNPbmx5VmFsdWUodHlwZSxlbnVtKQkJKCgodHlwZSkgJiB+KGVudW0pKSA9PSBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSkNCi0gICAgc3RydWN0IEZERV9DU1NQUk9QRVJUWVRBQkxFIHsNCi0gICAgICAgIEZERV9DU1NQUk9QRVJUWQkJCWVOYW1lOw0KLSAgICAgICAgY29uc3QgRlhfV0NIQVIqCQkJCXBzek5hbWU7DQotICAgICAgICBGWF9EV09SRAkJCQlkd0hhc2g7DQotICAgICAgICBGWF9EV09SRAkJCQlkd1R5cGU7DQotICAgIH07DQotICAgIHR5cGVkZWYgRkRFX0NTU1BST1BFUlRZVEFCTEUgY29uc3QgKiBGREVfTFBDQ1NTUFJPUEVSVFlUQUJMRTsNCisjZGVmaW5lIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgMHgwMTAwDQorI2RlZmluZSBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSAweDAyMDANCisjZGVmaW5lIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkkgMHgwNDAwDQorI2RlZmluZSBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nIDB4MDgwMA0KKyNkZWZpbmUgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yIDB4MTAwMA0KKyNkZWZpbmUgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUZ1bmN0aW9uIDB4MjAwMA0KKyNkZWZpbmUgRkRFX0lzT25seVZhbHVlKHR5cGUsIGVudW0pIFwNCisgICgoKHR5cGUpICYgfihlbnVtKSkgPT0gRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUpDQorc3RydWN0IEZERV9DU1NQUk9QRVJUWVRBQkxFIHsNCisgIEZERV9DU1NQUk9QRVJUWSBlTmFtZTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lOw0KKyAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgRlhfRFdPUkQgZHdUeXBlOw0KK307DQordHlwZWRlZiBGREVfQ1NTUFJPUEVSVFlUQUJMRSBjb25zdCogRkRFX0xQQ0NTU1BST1BFUlRZVEFCTEU7DQogDQotICAgIEZERV9MUENDU1NQUk9QRVJUWVRBQkxFCQlGREVfR2V0Q1NTUHJvcGVydHlCeU5hbWUoY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsIGludDMyX3QgaUxlbmd0aCk7DQotICAgIEZERV9MUENDU1NQUk9QRVJUWVRBQkxFCQlGREVfR2V0Q1NTUHJvcGVydHlCeUVudW0oRkRFX0NTU1BST1BFUlRZIGVOYW1lKTsNCi0gICAgc3RydWN0IEZERV9DU1NQUk9QRVJUWVZBTFVFVEFCTEUgew0KLSAgICAgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUJZU5hbWU7DQotICAgICAgICBjb25zdCBGWF9XQ0hBUioJCQkJcHN6TmFtZTsNCi0gICAgICAgIEZYX0RXT1JECQkJCWR3SGFzaDsNCi0gICAgfTsNCi0gICAgdHlwZWRlZiBGREVfQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIGNvbnN0ICogRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRTsNCitGREVfTFBDQ1NTUFJPUEVSVFlUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlCeU5hbWUoY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCk7DQorRkRFX0xQQ0NTU1BST1BFUlRZVEFCTEUgRkRFX0dldENTU1Byb3BlcnR5QnlFbnVtKEZERV9DU1NQUk9QRVJUWSBlTmFtZSk7DQorc3RydWN0IEZERV9DU1NQUk9QRVJUWVZBTFVFVEFCTEUgew0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZU5hbWU7DQorICBjb25zdCBGWF9XQ0hBUiogcHN6TmFtZTsNCisgIEZYX0RXT1JEIGR3SGFzaDsNCit9Ow0KK3R5cGVkZWYgRkRFX0NTU1BST1BFUlRZVkFMVUVUQUJMRSBjb25zdCogRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRTsNCiANCi0gICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwgaW50MzJfdCBpTGVuZ3RoKTsNCi0gICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5RW51bShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlTmFtZSk7DQotICAgIHN0cnVjdCBGREVfQ1NTTUVESUFUWVBFVEFCTEUgew0KLSAgICAgICAgRlhfV09SRAkJCQkJd0hhc2g7DQotICAgICAgICBGWF9XT1JECQkJCQl3VmFsdWU7DQotICAgIH07DQotICAgIHR5cGVkZWYgRkRFX0NTU01FRElBVFlQRVRBQkxFIGNvbnN0ICogRkRFX0xQQ0NTU01FRElBVFlQRVRBQkxFOw0KLSAgICBGREVfTFBDQ1NTTUVESUFUWVBFVEFCTEUJRkRFX0dldENTU01lZGlhVHlwZUJ5TmFtZShjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwgaW50MzJfdCBpTGVuZ3RoKTsNCi0gICAgc3RydWN0IEZERV9DU1NMRU5HVEhVTklUVEFCTEUgew0KLSAgICAgICAgRlhfV09SRAkJCQkJd0hhc2g7DQotICAgICAgICBGWF9XT1JECQkJCQl3VmFsdWU7DQotICAgIH07DQotICAgIHR5cGVkZWYgRkRFX0NTU0xFTkdUSFVOSVRUQUJMRSBjb25zdCAqIEZERV9MUENDU1NMRU5HVEhVTklUVEFCTEU7DQotICAgIEZERV9MUENDU1NMRU5HVEhVTklUVEFCTEUJRkRFX0dldENTU0xlbmd0aFVuaXRCeU5hbWUoY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsIGludDMyX3QgaUxlbmd0aCk7DQotICAgIHN0cnVjdCBGREVfQ1NTQ09MT1JUQUJMRSB7DQotICAgICAgICBGWF9EV09SRAkJCQlkd0hhc2g7DQotICAgICAgICBGWF9BUkdCCQkJCQlkd1ZhbHVlOw0KLSAgICB9Ow0KLSAgICB0eXBlZGVmIEZERV9DU1NDT0xPUlRBQkxFIGNvbnN0ICogRkRFX0xQQ0NTU0NPTE9SVEFCTEU7DQotICAgIEZERV9MUENDU1NDT0xPUlRBQkxFCQlGREVfR2V0Q1NTQ29sb3JCeU5hbWUoY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsIGludDMyX3QgaUxlbmd0aCk7DQotICAgIHN0cnVjdCBGREVfQ1NTUEVSU1VET1RBQkxFIHsNCi0gICAgICAgIEZERV9DU1NQRVJTVURPCQkJZU5hbWU7DQotICAgICAgICBjb25zdCBGWF9XQ0hBUioJCQkJcHN6TmFtZTsNCi0gICAgICAgIEZYX0RXT1JECQkJCWR3SGFzaDsNCi0gICAgfTsNCi0gICAgdHlwZWRlZiBGREVfQ1NTUEVSU1VET1RBQkxFIGNvbnN0ICogRkRFX0xQQ0NTU1BFUlNVRE9UQUJMRTsNCitGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKA0KKyAgICBjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwNCisgICAgaW50MzJfdCBpTGVuZ3RoKTsNCitGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlFbnVtKA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlTmFtZSk7DQorc3RydWN0IEZERV9DU1NNRURJQVRZUEVUQUJMRSB7DQorICBGWF9XT1JEIHdIYXNoOw0KKyAgRlhfV09SRCB3VmFsdWU7DQorfTsNCit0eXBlZGVmIEZERV9DU1NNRURJQVRZUEVUQUJMRSBjb25zdCogRkRFX0xQQ0NTU01FRElBVFlQRVRBQkxFOw0KK0ZERV9MUENDU1NNRURJQVRZUEVUQUJMRSBGREVfR2V0Q1NTTWVkaWFUeXBlQnlOYW1lKGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCk7DQorc3RydWN0IEZERV9DU1NMRU5HVEhVTklUVEFCTEUgew0KKyAgRlhfV09SRCB3SGFzaDsNCisgIEZYX1dPUkQgd1ZhbHVlOw0KK307DQordHlwZWRlZiBGREVfQ1NTTEVOR1RIVU5JVFRBQkxFIGNvbnN0KiBGREVfTFBDQ1NTTEVOR1RIVU5JVFRBQkxFOw0KK0ZERV9MUENDU1NMRU5HVEhVTklUVEFCTEUgRkRFX0dldENTU0xlbmd0aFVuaXRCeU5hbWUoY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpOw0KK3N0cnVjdCBGREVfQ1NTQ09MT1JUQUJMRSB7DQorICBGWF9EV09SRCBkd0hhc2g7DQorICBGWF9BUkdCIGR3VmFsdWU7DQorfTsNCit0eXBlZGVmIEZERV9DU1NDT0xPUlRBQkxFIGNvbnN0KiBGREVfTFBDQ1NTQ09MT1JUQUJMRTsNCitGREVfTFBDQ1NTQ09MT1JUQUJMRSBGREVfR2V0Q1NTQ29sb3JCeU5hbWUoY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCk7DQorc3RydWN0IEZERV9DU1NQRVJTVURPVEFCTEUgew0KKyAgRkRFX0NTU1BFUlNVRE8gZU5hbWU7DQorICBjb25zdCBGWF9XQ0hBUiogcHN6TmFtZTsNCisgIEZYX0RXT1JEIGR3SGFzaDsNCit9Ow0KK3R5cGVkZWYgRkRFX0NTU1BFUlNVRE9UQUJMRSBjb25zdCogRkRFX0xQQ0NTU1BFUlNVRE9UQUJMRTsNCiANCi0gICAgRkRFX0xQQ0NTU1BFUlNVRE9UQUJMRQkJRkRFX0dldENTU1BlcnN1ZG9CeUVudW0oRkRFX0NTU1BFUlNVRE8gZVBlcnN1ZG8pOw0KLSAgICBGWF9CT09MCUZERV9QYXJzZUNTU051bWJlcihjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBGWF9GTE9BVCAmZlZhbHVlLCBGREVfQ1NTUFJJTUlUSVZFVFlQRSAmZVVuaXQpOw0KLSAgICBGWF9CT09MCUZERV9QYXJzZUNTU1N0cmluZyhjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBpbnQzMl90ICZpT2Zmc2V0LCBpbnQzMl90ICZpTGVuZ3RoKTsNCi0gICAgRlhfQk9PTAlGREVfUGFyc2VDU1NDb2xvcihjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBGWF9BUkdCICZkd0NvbG9yKTsNCi0gICAgRlhfQk9PTAlGREVfUGFyc2VDU1NVUkkoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgaW50MzJfdCAmaU9mZnNldCwgaW50MzJfdCAmaUxlbmd0aCk7DQorRkRFX0xQQ0NTU1BFUlNVRE9UQUJMRSBGREVfR2V0Q1NTUGVyc3Vkb0J5RW51bShGREVfQ1NTUEVSU1VETyBlUGVyc3Vkbyk7DQorRlhfQk9PTCBGREVfUGFyc2VDU1NOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUmIGVVbml0KTsNCitGWF9CT09MIEZERV9QYXJzZUNTU1N0cmluZyhjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTGVuZ3RoKTsNCitGWF9CT09MIEZERV9QYXJzZUNTU0NvbG9yKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiYgZHdDb2xvcik7DQorRlhfQk9PTCBGREVfUGFyc2VDU1NVUkkoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUxlbmd0aCk7DQogI2lmZGVmIF9jcGx1c3BsdXMNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RlY2xhcmF0aW9uLmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RlY2xhcmF0aW9uLmNwcAppbmRleCAyOTczNTc4Li5jODFiMmNiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkZWNsYXJhdGlvbi5jcHAKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGVjbGFyYXRpb24uY3BwCkBAIC02LDExODggKzYsMTM1MiBAQAogDQogI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQogI2luY2x1ZGUgImZkZV9jc3NkZWNsYXJhdGlvbi5oIg0KLUlGREVfQ1NTVmFsdWUqIENGREVfQ1NTRGVjbGFyYXRpb246OkdldFByb3BlcnR5KEZERV9DU1NQUk9QRVJUWSBlUHJvcGVydHksIEZYX0JPT0wgJmJJbXBvcnRhbnQpIGNvbnN0DQotew0KLSAgICBmb3IgKEZERV9MUENTU1BST1BFUlRZSE9MREVSIHBIb2xkZXIgPSBtX3BGaXJzdFByb3BlcnR5OyBwSG9sZGVyOyBwSG9sZGVyID0gcEhvbGRlci0+cE5leHQpIHsNCi0gICAgICAgIGlmIChwSG9sZGVyLT5lUHJvcGVydHkgPT0gZVByb3BlcnR5KSB7DQotICAgICAgICAgICAgYkltcG9ydGFudCA9IHBIb2xkZXItPmJJbXBvcnRhbnQ7DQotICAgICAgICAgICAgcmV0dXJuIHBIb2xkZXItPnBWYWx1ZTsNCi0gICAgICAgIH0NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpHZXRQcm9wZXJ0eShGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJJbXBvcnRhbnQpIGNvbnN0IHsNCisgIGZvciAoRkRFX0xQQ1NTUFJPUEVSVFlIT0xERVIgcEhvbGRlciA9IG1fcEZpcnN0UHJvcGVydHk7IHBIb2xkZXI7DQorICAgICAgIHBIb2xkZXIgPSBwSG9sZGVyLT5wTmV4dCkgew0KKyAgICBpZiAocEhvbGRlci0+ZVByb3BlcnR5ID09IGVQcm9wZXJ0eSkgew0KKyAgICAgIGJJbXBvcnRhbnQgPSBwSG9sZGVyLT5iSW1wb3J0YW50Ow0KKyAgICAgIHJldHVybiBwSG9sZGVyLT5wVmFsdWU7DQogICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9QT1NJVElPTiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpHZXRTdGFydFBvc2l0aW9uKCkgY29uc3Qgew0KKyAgcmV0dXJuIChGWF9QT1NJVElPTiltX3BGaXJzdFByb3BlcnR5Ow0KK30NCit2b2lkIENGREVfQ1NTRGVjbGFyYXRpb246OkdldE5leHRQcm9wZXJ0eShGWF9QT1NJVElPTiYgcG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSYgZVByb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUqJiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkltcG9ydGFudCkgY29uc3Qgew0KKyAgRkRFX0xQQ1NTUFJPUEVSVFlIT0xERVIgcEhvbGRlciA9IChGREVfTFBDU1NQUk9QRVJUWUhPTERFUilwb3M7DQorICBGWFNZU19hc3NlcnQocEhvbGRlciAhPSBOVUxMKTsNCisgIGJJbXBvcnRhbnQgPSBwSG9sZGVyLT5iSW1wb3J0YW50Ow0KKyAgZVByb3BlcnR5ID0gKEZERV9DU1NQUk9QRVJUWSlwSG9sZGVyLT5lUHJvcGVydHk7DQorICBwVmFsdWUgPSBwSG9sZGVyLT5wVmFsdWU7DQorICBwb3MgPSAoRlhfUE9TSVRJT04pcEhvbGRlci0+cE5leHQ7DQorfQ0KK0ZYX1BPU0lUSU9OIENGREVfQ1NTRGVjbGFyYXRpb246OkdldFN0YXJ0Q3VzdG9tKCkgY29uc3Qgew0KKyAgcmV0dXJuIChGWF9QT1NJVElPTiltX3BGaXJzdEN1c3RvbTsNCit9DQordm9pZCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpHZXROZXh0Q3VzdG9tKEZYX1BPU0lUSU9OJiBwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSBjb25zdCB7DQorICBGREVfTFBDU1NDVVNUT01QUk9QRVJUWSBwUHJvcGVydHkgPSAoRkRFX0xQQ1NTQ1VTVE9NUFJPUEVSVFkpcG9zOw0KKyAgaWYgKHBQcm9wZXJ0eSA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHdzTmFtZSA9IHBQcm9wZXJ0eS0+cHdzTmFtZTsNCisgIHdzVmFsdWUgPSBwUHJvcGVydHktPnB3c1ZhbHVlOw0KKyAgcG9zID0gKEZYX1BPU0lUSU9OKXBQcm9wZXJ0eS0+cE5leHQ7DQorfQ0KK2NvbnN0IEZYX1dDSEFSKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpDb3B5VG9Mb2NhbChGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuKSB7DQorICBGWFNZU19hc3NlcnQoaVZhbHVlTGVuID4gMCk7DQorICBDRlhfTWFwUHRyVG9QdHIqIHBDYWNoZSA9IHBBcmdzLT5wU3RyaW5nQ2FjaGU7DQorICB2b2lkKiBwS2V5ID0gTlVMTDsNCisgIGlmIChwQ2FjaGUpIHsNCisgICAgdm9pZCogcHN6Q2FjaGVkID0gTlVMTDsNCisgICAgcEtleSA9DQorICAgICAgICAodm9pZCopKHVpbnRwdHJfdClGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhwc3pWYWx1ZSwgaVZhbHVlTGVuLCBGQUxTRSk7DQorICAgIGlmIChwQ2FjaGUtPkxvb2t1cChwS2V5LCBwc3pDYWNoZWQpKSB7DQorICAgICAgcmV0dXJuIChjb25zdCBGWF9XQ0hBUiopcHN6Q2FjaGVkOw0KKyAgICB9DQorICB9DQorICBGWF9XQ0hBUiogcHN6ID0NCisgICAgICAoRlhfV0NIQVIqKXBBcmdzLT5wU3RhdGljU3RvcmUtPkFsbG9jKChpVmFsdWVMZW4gKyAxKSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgaWYgKHBzeiA9PSBOVUxMKSB7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhTWVNfd2NzbmNweShwc3osIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgcHN6W2lWYWx1ZUxlbl0gPSAnXDAnOw0KKyAgaWYgKHBDYWNoZSkgew0KKyAgICBwQ2FjaGUtPlNldEF0KHBLZXksIHBzeik7DQorICB9DQorICByZXR1cm4gcHN6Ow0KIH0NCi1GWF9QT1NJVElPTiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpHZXRTdGFydFBvc2l0aW9uKCkgY29uc3QNCi17DQotICAgIHJldHVybiAoRlhfUE9TSVRJT04pbV9wRmlyc3RQcm9wZXJ0eTsNCitJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpOZXdOdW1iZXJWYWx1ZSgNCisgICAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlLA0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVW5pdCwNCisgICAgRlhfRkxPQVQgZlZhbHVlKSBjb25zdCB7DQorICBzdGF0aWMgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSBzX1plcm9WYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIsIDAuMGYpOw0KKyAgaWYgKGVVbml0ID09IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciAmJiBGWFNZU19mYWJzKGZWYWx1ZSkgPCAwLjAwMWYpIHsNCisgICAgcmV0dXJuICZzX1plcm9WYWx1ZTsNCisgIH0NCisgIHJldHVybiBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZVVuaXQsIGZWYWx1ZSk7DQogfQ0KLXZvaWQgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6R2V0TmV4dFByb3BlcnR5KEZYX1BPU0lUSU9OICZwb3MsIEZERV9DU1NQUk9QRVJUWSAmZVByb3BlcnR5LCBJRkRFX0NTU1ZhbHVlIComcFZhbHVlLCBGWF9CT09MICZiSW1wb3J0YW50KSBjb25zdA0KLXsNCi0gICAgRkRFX0xQQ1NTUFJPUEVSVFlIT0xERVIgcEhvbGRlciA9IChGREVfTFBDU1NQUk9QRVJUWUhPTERFUilwb3M7DQotICAgIEZYU1lTX2Fzc2VydChwSG9sZGVyICE9IE5VTEwpOw0KLSAgICBiSW1wb3J0YW50ID0gcEhvbGRlci0+YkltcG9ydGFudDsNCi0gICAgZVByb3BlcnR5ID0gKEZERV9DU1NQUk9QRVJUWSlwSG9sZGVyLT5lUHJvcGVydHk7DQotICAgIHBWYWx1ZSA9IHBIb2xkZXItPnBWYWx1ZTsNCi0gICAgcG9zID0gKEZYX1BPU0lUSU9OKXBIb2xkZXItPnBOZXh0Ow0KK2lubGluZSBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpOZXdFbnVtVmFsdWUoDQorICAgIElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSwNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSBjb25zdCB7DQorICByZXR1cm4gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGVWYWx1ZSk7DQogfQ0KLUZYX1BPU0lUSU9OIENGREVfQ1NTRGVjbGFyYXRpb246OkdldFN0YXJ0Q3VzdG9tKCkgY29uc3QNCi17DQotICAgIHJldHVybiAoRlhfUE9TSVRJT04pbV9wRmlyc3RDdXN0b207DQordm9pZCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpBZGRQcm9wZXJ0eUhvbGRlcihJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSogcFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KSB7DQorICBGREVfTFBDU1NQUk9QRVJUWUhPTERFUiBwSG9sZGVyID0NCisgICAgICBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIEZERV9DU1NQUk9QRVJUWUhPTERFUjsNCisgIHBIb2xkZXItPmJJbXBvcnRhbnQgPSBiSW1wb3J0YW50Ow0KKyAgcEhvbGRlci0+ZVByb3BlcnR5ID0gZVByb3BlcnR5Ow0KKyAgcEhvbGRlci0+cFZhbHVlID0gcFZhbHVlOw0KKyAgcEhvbGRlci0+cE5leHQgPSBOVUxMOw0KKyAgaWYgKG1fcExhc3RQcm9wZXJ0eSA9PSBOVUxMKSB7DQorICAgIG1fcExhc3RQcm9wZXJ0eSA9IG1fcEZpcnN0UHJvcGVydHkgPSBwSG9sZGVyOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wTGFzdFByb3BlcnR5LT5wTmV4dCA9IHBIb2xkZXI7DQorICAgIG1fcExhc3RQcm9wZXJ0eSA9IHBIb2xkZXI7DQorICB9DQogfQ0KLXZvaWQgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6R2V0TmV4dEN1c3RvbShGWF9QT1NJVElPTiAmcG9zLCBDRlhfV2lkZVN0cmluZyAmd3NOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSkgY29uc3QNCi17DQotICAgIEZERV9MUENTU0NVU1RPTVBST1BFUlRZIHBQcm9wZXJ0eSA9IChGREVfTFBDU1NDVVNUT01QUk9QRVJUWSlwb3M7DQotICAgIGlmIChwUHJvcGVydHkgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuKSB7DQorICBGWFNZU19hc3NlcnQoaVZhbHVlTGVuID4gMCk7DQorICBGWF9CT09MIGJJbXBvcnRhbnQgPSBGQUxTRTsNCisgIGlmIChpVmFsdWVMZW4gPj0gMTAgJiYgcHN6VmFsdWVbaVZhbHVlTGVuIC0gMTBdID09ICchJyAmJg0KKyAgICAgIEZYX3djc25pY21wKEwiaW1wb3J0YW50IiwgcHN6VmFsdWUgKyBpVmFsdWVMZW4gLSA5LCA5KSA9PSAwKSB7DQorICAgIGlmICgoaVZhbHVlTGVuIC09IDEwKSA9PSAwKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIHdzTmFtZSA9IHBQcm9wZXJ0eS0+cHdzTmFtZTsNCi0gICAgd3NWYWx1ZSA9IHBQcm9wZXJ0eS0+cHdzVmFsdWU7DQotICAgIHBvcyA9IChGWF9QT1NJVElPTilwUHJvcGVydHktPnBOZXh0Ow0KLX0NCi1jb25zdCBGWF9XQ0hBUiogQ0ZERV9DU1NEZWNsYXJhdGlvbjo6Q29weVRvTG9jYWwoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbikNCi17DQotICAgIEZYU1lTX2Fzc2VydChpVmFsdWVMZW4gPiAwKTsNCi0gICAgQ0ZYX01hcFB0clRvUHRyICpwQ2FjaGUgPSBwQXJncy0+cFN0cmluZ0NhY2hlOw0KLSAgICB2b2lkKiBwS2V5ID0gTlVMTDsNCi0gICAgaWYgKHBDYWNoZSkgew0KLSAgICAgICAgdm9pZCogcHN6Q2FjaGVkID0gTlVMTDsNCi0gICAgICAgIHBLZXkgPSAodm9pZCopKHVpbnRwdHJfdClGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhwc3pWYWx1ZSwgaVZhbHVlTGVuLCBGQUxTRSk7DQotICAgICAgICBpZiAocENhY2hlLT5Mb29rdXAocEtleSwgcHN6Q2FjaGVkKSkgew0KLSAgICAgICAgICAgIHJldHVybiAoY29uc3QgRlhfV0NIQVIqKXBzekNhY2hlZDsNCisgICAgYkltcG9ydGFudCA9IFRSVUU7DQorICB9DQorICBjb25zdCBGWF9EV09SRCBkd1R5cGUgPSBwQXJncy0+cFByb3BlcnR5LT5kd1R5cGU7DQorICBzd2l0Y2ggKGR3VHlwZSAmIDB4MEYpIHsNCisgICAgY2FzZSBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZTogew0KKyAgICAgIHN0YXRpYyBjb25zdCBGWF9EV09SRCBnX1ZhbHVlR3Vlc3NPcmRlcltdID0gew0KKyAgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyLCAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtLA0KKyAgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3IsICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkksDQorICAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVGdW5jdGlvbiwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZywNCisgICAgICB9Ow0KKyAgICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGdfVmFsdWVHdWVzc0NvdW50ID0NCisgICAgICAgICAgc2l6ZW9mKGdfVmFsdWVHdWVzc09yZGVyKSAvIHNpemVvZihGWF9EV09SRCk7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZ19WYWx1ZUd1ZXNzQ291bnQ7ICsraSkgew0KKyAgICAgICAgY29uc3QgRlhfRFdPUkQgZHdNYXRjaCA9IGR3VHlwZSAmIGdfVmFsdWVHdWVzc09yZGVyW2ldOw0KKyAgICAgICAgaWYgKGR3TWF0Y2ggPT0gMCkgew0KKyAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWF9XQ0hBUiogcHN6ID0gKEZYX1dDSEFSKilwQXJncy0+cFN0YXRpY1N0b3JlLT5BbGxvYygoaVZhbHVlTGVuICsgMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgaWYgKHBzeiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBGWFNZU193Y3NuY3B5KHBzeiwgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgIHBzeltpVmFsdWVMZW5dID0gJ1wwJzsNCi0gICAgaWYgKHBDYWNoZSkgew0KLSAgICAgICAgcENhY2hlLT5TZXRBdChwS2V5LCBwc3opOw0KLSAgICB9DQotICAgIHJldHVybiBwc3o7DQorICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwQ1NTVmFsdWUgPSBOVUxMOw0KKyAgICAgICAgc3dpdGNoIChkd01hdGNoKSB7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUZ1bmN0aW9uOg0KKyAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlRnVuY3Rpb24ocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXI6DQorICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VOdW1iZXIocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtOg0KKyAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlRW51bShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yOg0KKyAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlQ29sb3IocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkk6DQorICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VVUkkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmc6DQorICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VTdHJpbmcocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBDU1NWYWx1ZSAhPSBOVUxMKSB7DQorICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBBcmdzLT5wU3RhdGljU3RvcmUsIHBBcmdzLT5wUHJvcGVydHktPmVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1NTVmFsdWUsIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChGREVfSXNPbmx5VmFsdWUoZHdUeXBlLCBnX1ZhbHVlR3Vlc3NPcmRlcltpXSkpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZDogew0KKyAgICAgIElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSA9IHBBcmdzLT5wU3RhdGljU3RvcmU7DQorICAgICAgSUZERV9DU1NWYWx1ZSAqcENvbG9yLCAqcFN0eWxlLCAqcFdpZHRoOw0KKyAgICAgIHN3aXRjaCAocEFyZ3MtPnBQcm9wZXJ0eS0+ZU5hbWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0ZvbnQ6DQorICAgICAgICAgIHJldHVybiBQYXJzZUZvbnRQcm9wZXJ0eShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgYkltcG9ydGFudCk7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kOg0KKyAgICAgICAgICByZXR1cm4gUGFyc2VCYWNrZ3JvdW5kUHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZToNCisgICAgICAgICAgcmV0dXJuIFBhcnNlTGlzdFN0eWxlUHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyOg0KKyAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wb2VydHkocFN0YXRpY1N0b3JlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R5bGUsIHBXaWR0aCkpIHsNCisgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0V2lkdGgpOw0KKyAgICAgICAgICAgIEFkZEJvcmRlclByb3BlcnR5KHBTdGF0aWNTdG9yZSwgcENvbG9yLCBwU3R5bGUsIHBXaWR0aCwgYkltcG9ydGFudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BXaWR0aCk7DQorICAgICAgICAgICAgQWRkQm9yZGVyUHJvcGVydHkocFN0YXRpY1N0b3JlLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoLCBiSW1wb3J0YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFdpZHRoKTsNCisgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbUNvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tV2lkdGgpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdDoNCisgICAgICAgICAgaWYgKFBhcnNlQm9yZGVyUHJvcG9lcnR5KHBTdGF0aWNTdG9yZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgcENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0eWxlLCBwV2lkdGgpKSB7DQorICAgICAgICAgICAgQWRkQm9yZGVyUHJvcGVydHkocFN0YXRpY1N0b3JlLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoLCBiSW1wb3J0YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0Q29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFdpZHRoKTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcDoNCisgICAgICAgICAgaWYgKFBhcnNlQm9yZGVyUHJvcG9lcnR5KHBTdGF0aWNTdG9yZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgcENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0eWxlLCBwV2lkdGgpKSB7DQorICAgICAgICAgICAgQWRkQm9yZGVyUHJvcGVydHkocFN0YXRpY1N0b3JlLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoLCBiSW1wb3J0YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFdpZHRoKTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Og0KKyAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wb2VydHkocFN0YXRpY1N0b3JlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R5bGUsIHBXaWR0aCkpIHsNCisgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Q29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGgpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tOg0KKyAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wb2VydHkocFN0YXRpY1N0b3JlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R5bGUsIHBXaWR0aCkpIHsNCisgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbUNvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tV2lkdGgpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3c6DQorICAgICAgICAgIHJldHVybiBQYXJzZU92ZXJmbG93UHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZToNCisgICAgICAgICAgcmV0dXJuIFBhcnNlQ29sdW1uUnVsZVByb3BlcnR5KHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0Og0KKyAgICAgIHN3aXRjaCAocEFyZ3MtPnBQcm9wZXJ0eS0+ZU5hbWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvdW50ZXJJbmNyZW1lbnQ6DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db3VudGVyUmVzZXQ6DQorICAgICAgICAgIHJldHVybiBQYXJzZUNvdW50ZXJQcm9wZXJ0eShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgYkltcG9ydGFudCk7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db250ZW50Og0KKyAgICAgICAgICByZXR1cm4gUGFyc2VDb250ZW50UHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgcmV0dXJuIFBhcnNlVmFsdWVMaXN0UHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KKyAgICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1JRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpOZXdOdW1iZXJWYWx1ZShJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIEZERV9DU1NQUklNSVRJVkVUWVBFIGVVbml0LCBGWF9GTE9BVCBmVmFsdWUpIGNvbnN0DQotew0KLSAgICBzdGF0aWMgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSBzX1plcm9WYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIsIDAuMGYpOw0KLSAgICBpZiAoZVVuaXQgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmIEZYU1lTX2ZhYnMoZlZhbHVlKSA8IDAuMDAxZikgew0KLSAgICAgICAgcmV0dXJuICZzX1plcm9WYWx1ZTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGVVbml0LCBmVmFsdWUpOw0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTmFtZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuKSB7DQorICBGREVfTFBDU1NDVVNUT01QUk9QRVJUWSBwUHJvcGVydHkgPQ0KKyAgICAgIEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpIEZERV9DU1NDVVNUT01QUk9QRVJUWTsNCisgIHBQcm9wZXJ0eS0+cHdzTmFtZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pOYW1lLCBpTmFtZUxlbik7DQorICBwUHJvcGVydHktPnB3c1ZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgcFByb3BlcnR5LT5wTmV4dCA9IE5VTEw7DQorICBpZiAobV9wTGFzdEN1c3RvbSA9PSBOVUxMKSB7DQorICAgIG1fcExhc3RDdXN0b20gPSBtX3BGaXJzdEN1c3RvbSA9IHBQcm9wZXJ0eTsNCisgIH0gZWxzZSB7DQorICAgIG1fcExhc3RDdXN0b20tPnBOZXh0ID0gcFByb3BlcnR5Ow0KKyAgICBtX3BMYXN0Q3VzdG9tID0gcFByb3BlcnR5Ow0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLWlubGluZSBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpOZXdFbnVtVmFsdWUoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIGNvbnN0DQotew0KLSAgICByZXR1cm4gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGVWYWx1ZSk7DQorSUZERV9DU1NWYWx1ZSogQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VOdW1iZXIoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pIHsNCisgIEZYX0ZMT0FUIGZWYWx1ZTsNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVVbml0Ow0KKyAgaWYgKCFGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVW5pdCkpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gTmV3TnVtYmVyVmFsdWUocEFyZ3MtPnBTdGF0aWNTdG9yZSwgZVVuaXQsIGZWYWx1ZSk7DQogfQ0KLXZvaWQgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkUHJvcGVydHlIb2xkZXIoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LCBJRkRFX0NTU1ZhbHVlICpwVmFsdWUsIEZYX0JPT0wgYkltcG9ydGFudCkNCi17DQotICAgIEZERV9MUENTU1BST1BFUlRZSE9MREVSIHBIb2xkZXIgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIEZERV9DU1NQUk9QRVJUWUhPTERFUjsNCi0gICAgcEhvbGRlci0+YkltcG9ydGFudCA9IGJJbXBvcnRhbnQ7DQotICAgIHBIb2xkZXItPmVQcm9wZXJ0eSA9IGVQcm9wZXJ0eTsNCi0gICAgcEhvbGRlci0+cFZhbHVlID0gcFZhbHVlOw0KLSAgICBwSG9sZGVyLT5wTmV4dCA9IE5VTEw7DQotICAgIGlmIChtX3BMYXN0UHJvcGVydHkgPT0gTlVMTCkgew0KLSAgICAgICAgbV9wTGFzdFByb3BlcnR5ID0gbV9wRmlyc3RQcm9wZXJ0eSA9IHBIb2xkZXI7DQorSUZERV9DU1NWYWx1ZSogQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VFbnVtKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pIHsNCisgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0NCisgICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgIHJldHVybiBwVmFsdWUgPyBOZXdFbnVtVmFsdWUocEFyZ3MtPnBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSkgOiBOVUxMOw0KK30NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNvbG9yKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbikgew0KKyAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgaWYgKCFGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGR3Q29sb3IpOw0KK30NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZVVSSShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbikgew0KKyAgaW50MzJfdCBpT2Zmc2V0Ow0KKyAgaWYgKCFGREVfUGFyc2VDU1NVUkkocHN6VmFsdWUsIGlWYWx1ZUxlbiwgaU9mZnNldCwgaVZhbHVlTGVuKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChpVmFsdWVMZW4gPD0gMCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlICsgaU9mZnNldCwgaVZhbHVlTGVuKTsNCisgIHJldHVybiBwc3pWYWx1ZQ0KKyAgICAgICAgICAgICA/IEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJLCBwc3pWYWx1ZSkNCisgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZVN0cmluZyhGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbikgew0KKyAgaW50MzJfdCBpT2Zmc2V0Ow0KKyAgaWYgKCFGREVfUGFyc2VDU1NTdHJpbmcocHN6VmFsdWUsIGlWYWx1ZUxlbiwgaU9mZnNldCwgaVZhbHVlTGVuKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChpVmFsdWVMZW4gPD0gMCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlICsgaU9mZnNldCwgaVZhbHVlTGVuKTsNCisgIHJldHVybiBwc3pWYWx1ZQ0KKyAgICAgICAgICAgICA/IEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nLCBwc3pWYWx1ZSkNCisgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUZ1bmN0aW9uKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbikgew0KKyAgaWYgKHBzelZhbHVlW2lWYWx1ZUxlbiAtIDFdICE9ICcpJykgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3QgaVN0YXJ0QnJhY2tldCA9IDA7DQorICB3aGlsZSAocHN6VmFsdWVbaVN0YXJ0QnJhY2tldF0gIT0gJygnKSB7DQorICAgIGlmIChpU3RhcnRCcmFja2V0IDwgaVZhbHVlTGVuKSB7DQorICAgICAgaVN0YXJ0QnJhY2tldCsrOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wTGFzdFByb3BlcnR5LT5wTmV4dCA9IHBIb2xkZXI7DQotICAgICAgICBtX3BMYXN0UHJvcGVydHkgPSBwSG9sZGVyOw0KKyAgICAgIHJldHVybiBOVUxMOw0KICAgICB9DQorICB9DQorICBpZiAoaVN0YXJ0QnJhY2tldCA9PSAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIHBzekZ1bmNOYW1lID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpU3RhcnRCcmFja2V0KTsNCisgIHBzelZhbHVlICs9IChpU3RhcnRCcmFja2V0ICsgMSk7DQorICBpVmFsdWVMZW4gLT0gKGlTdGFydEJyYWNrZXQgKyAyKTsNCisgIENGREVfQ1NTVmFsdWVBcnJheSBhcmd1bWVudEFycjsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnLCcpOw0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVByaW1pdGl2ZVR5cGU7DQorICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlUHJpbWl0aXZlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgc3dpdGNoIChlUHJpbWl0aXZlVHlwZSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBQcm9wZXJ0eVZhbHVlID0NCisgICAgICAgICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGlmIChwUHJvcGVydHlWYWx1ZSAhPSBOVUxMKSB7DQorICAgICAgICAgIGFyZ3VtZW50QXJyLkFkZCgNCisgICAgICAgICAgICAgIE5ld0VudW1WYWx1ZShwQXJncy0+cFN0YXRpY1N0b3JlLCBwUHJvcGVydHlWYWx1ZS0+ZU5hbWUpKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwRnVuY3Rpb25WYWx1ZSA9DQorICAgICAgICAgICAgUGFyc2VGdW5jdGlvbihwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocEZ1bmN0aW9uVmFsdWUgIT0gTlVMTCkgew0KKyAgICAgICAgICBhcmd1bWVudEFyci5BZGQocEZ1bmN0aW9uVmFsdWUpOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGFyZ3VtZW50QXJyLkFkZChGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKA0KKyAgICAgICAgICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZywNCisgICAgICAgICAgICBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbikpKTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQorICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZVByaW1pdGl2ZVR5cGUpKSB7DQorICAgICAgICAgIGFyZ3VtZW50QXJyLkFkZCgNCisgICAgICAgICAgICAgIE5ld051bWJlclZhbHVlKHBBcmdzLT5wU3RhdGljU3RvcmUsIGVQcmltaXRpdmVUeXBlLCBmVmFsdWUpKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBhcmd1bWVudEFyci5BZGQoRkRFX05ld1dpdGgocEFyZ3MtPnBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsDQorICAgICAgICAgICAgQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSk7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgSUZERV9DU1NWYWx1ZUxpc3QqIHBBcmd1bWVudExpc3QgPSBGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKQ0KKyAgICAgIENGREVfQ1NTVmFsdWVMaXN0KHBBcmdzLT5wU3RhdGljU3RvcmUsIGFyZ3VtZW50QXJyKTsNCisgIENGREVfQ1NTRnVuY3Rpb24qIHBGdW5jdGlvbiA9IEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpDQorICAgICAgQ0ZERV9DU1NGdW5jdGlvbihwc3pGdW5jTmFtZSwgcEFyZ3VtZW50TGlzdCk7DQorICByZXR1cm4gRkRFX05ld1dpdGgocEFyZ3MtPnBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShwRnVuY3Rpb24pOw0KIH0NCi1GWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OkFkZFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwgaW50MzJfdCBpVmFsdWVMZW4pDQotew0KLSAgICBGWFNZU19hc3NlcnQoaVZhbHVlTGVuID4gMCk7DQotICAgIEZYX0JPT0wgYkltcG9ydGFudCA9IEZBTFNFOw0KLSAgICBpZiAoaVZhbHVlTGVuID49IDEwICYmIHBzelZhbHVlW2lWYWx1ZUxlbiAtIDEwXSA9PSAnIScNCi0gICAgICAgICAgICAmJiBGWF93Y3NuaWNtcChMImltcG9ydGFudCIsIHBzelZhbHVlICsgaVZhbHVlTGVuIC0gOSwgOSkgPT0gMCkgew0KLSAgICAgICAgaWYgKChpVmFsdWVMZW4gLT0gMTApID09IDApIHsNCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ29udGVudFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gKElGWF9NRU1BbGxvY2F0b3IqKXBBcmdzLT5wU3RhdGljU3RvcmU7DQorICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgQ0ZERV9DU1NWYWx1ZUFycmF5IGxpc3Q7DQorICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJOg0KKyAgICAgICAgbGlzdC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKA0KKyAgICAgICAgICAgIGVUeXBlLCBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbikpKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOg0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9DQorICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWw6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOiB7DQorICAgICAgICAgICAgICBpZiAobGlzdC5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBsaXN0LkFkZChOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKSk7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX09wZW5RdW90ZToNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Nsb3NlUXVvdGU6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob09wZW5RdW90ZToNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vQ2xvc2VRdW90ZToNCisgICAgICAgICAgICAgIGxpc3QuQWRkKE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwRnVuY3Rpb24gPSBQYXJzZUZ1bmN0aW9uKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGlmIChwRnVuY3Rpb24gIT0gTlVMTCkgew0KKyAgICAgICAgICBsaXN0LkFkZChwRnVuY3Rpb24pOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGxpc3QuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICBlVHlwZSwgQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjoNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChsaXN0LkdldFNpemUoKSA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgcEFyZ3MtPnBQcm9wZXJ0eS0+ZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBsaXN0KSwNCisgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDb3VudGVyUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KSB7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KKyAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcgJyk7DQorICBDRkRFX0NTU1ZhbHVlQXJyYXkgbGlzdDsNCisgIENGREVfQ1NTVmFsdWVBcnJheSBsaXN0RnVsbDsNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQorICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjogew0KKyAgICAgICAgRlhfRkxPQVQgZlZhbHVlOw0KKyAgICAgICAgaWYgKEZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KKyAgICAgICAgICBpZiAobGlzdC5HZXRTaXplKCkgPT0gMSkgew0KKyAgICAgICAgICAgIGxpc3QuQWRkKE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgZVR5cGUsIGZWYWx1ZSkpOw0KKyAgICAgICAgICAgIGxpc3RGdWxsLkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU1ZhbHVlTGlzdChwU3RhdGljU3RvcmUsIGxpc3QpKTsNCisgICAgICAgICAgICBsaXN0LlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgYkltcG9ydGFudCA9IFRSVUU7DQotICAgIH0NCi0gICAgY29uc3QgRlhfRFdPUkQgZHdUeXBlID0gcEFyZ3MtPnBQcm9wZXJ0eS0+ZHdUeXBlOw0KLSAgICBzd2l0Y2ggKGR3VHlwZSAmIDB4MEYpIHsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmU6IHsNCi0gICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IEZYX0RXT1JEIGdfVmFsdWVHdWVzc09yZGVyW10gPSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyLA0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0sDQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3IsDQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlVVJJLA0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUZ1bmN0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZywNCi0gICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludDMyX3QgZ19WYWx1ZUd1ZXNzQ291bnQgPSBzaXplb2YoZ19WYWx1ZUd1ZXNzT3JkZXIpIC8gc2l6ZW9mKEZYX0RXT1JEKTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZ19WYWx1ZUd1ZXNzQ291bnQ7ICsraSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRFdPUkQgZHdNYXRjaCA9IGR3VHlwZSAmIGdfVmFsdWVHdWVzc09yZGVyW2ldOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGR3TWF0Y2ggPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSAqcENTU1ZhbHVlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZHdNYXRjaCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUZ1bmN0aW9uOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1NTVmFsdWUgPSBQYXJzZUZ1bmN0aW9uKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1NTVmFsdWUgPSBQYXJzZU51bWJlcihwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW06DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlRW51bShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1NTVmFsdWUgPSBQYXJzZUNvbG9yKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTVkFMVUVUWVBFX01heWJlVVJJOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1NTVmFsdWUgPSBQYXJzZVVSSShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VTdHJpbmcocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQ1NTVmFsdWUgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBBcmdzLT5wU3RhdGljU3RvcmUsIHBBcmdzLT5wUHJvcGVydHktPmVOYW1lLCBwQ1NTVmFsdWUsIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9Jc09ubHlWYWx1ZShkd1R5cGUsIGdfVmFsdWVHdWVzc09yZGVyW2ldKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmQ6IHsNCi0gICAgICAgICAgICAgICAgSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCi0gICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSAqcENvbG9yLCAqcFN0eWxlLCAqcFdpZHRoOw0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHBBcmdzLT5wUHJvcGVydHktPmVOYW1lKSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Gb250Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZUZvbnRQcm9wZXJ0eShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgYkltcG9ydGFudCk7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZUJhY2tncm91bmRQcm9wZXJ0eShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgYkltcG9ydGFudCk7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGU6DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlTGlzdFN0eWxlUHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQYXJzZUJvcmRlclByb3BvZXJ0eShwU3RhdGljU3RvcmUsIHBzelZhbHVlLCBpVmFsdWVMZW4sIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEJvcmRlclByb3BlcnR5KHBTdGF0aWNTdG9yZSwgcENvbG9yLCBwU3R5bGUsIHBXaWR0aCwgYkltcG9ydGFudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvciwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRTdHlsZSwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRXaWR0aCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEJvcmRlclByb3BlcnR5KHBTdGF0aWNTdG9yZSwgcENvbG9yLCBwU3R5bGUsIHBXaWR0aCwgYkltcG9ydGFudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcENvbG9yLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wU3R5bGUsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BXaWR0aCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEJvcmRlclByb3BlcnR5KHBTdGF0aWNTdG9yZSwgcENvbG9yLCBwU3R5bGUsIHBXaWR0aCwgYkltcG9ydGFudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Q29sb3IsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFN0eWxlLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRXaWR0aCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEJvcmRlclByb3BlcnR5KHBTdGF0aWNTdG9yZSwgcENvbG9yLCBwU3R5bGUsIHBXaWR0aCwgYkltcG9ydGFudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbUNvbG9yLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tU3R5bGUsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21XaWR0aCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBhcnNlQm9yZGVyUHJvcG9lcnR5KHBTdGF0aWNTdG9yZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgcENvbG9yLCBwU3R5bGUsIHBXaWR0aCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkQm9yZGVyUHJvcGVydHkocFN0YXRpY1N0b3JlLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoLCBiSW1wb3J0YW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdENvbG9yLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFN0eWxlLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFdpZHRoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQYXJzZUJvcmRlclByb3BvZXJ0eShwU3RhdGljU3RvcmUsIHBzelZhbHVlLCBpVmFsdWVMZW4sIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEJvcmRlclByb3BlcnR5KHBTdGF0aWNTdG9yZSwgcENvbG9yLCBwU3R5bGUsIHBXaWR0aCwgYkltcG9ydGFudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcENvbG9yLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wU3R5bGUsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BXaWR0aCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQYXJzZUJvcmRlclByb3BvZXJ0eShwU3RhdGljU3RvcmUsIHBzelZhbHVlLCBpVmFsdWVMZW4sIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEJvcmRlclByb3BlcnR5KHBTdGF0aWNTdG9yZSwgcENvbG9yLCBwU3R5bGUsIHBXaWR0aCwgYkltcG9ydGFudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Q29sb3IsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFN0eWxlLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRXaWR0aCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbToNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wb2VydHkocFN0YXRpY1N0b3JlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21Db2xvciwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVN0eWxlLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tV2lkdGgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9PdmVyZmxvdzoNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VPdmVyZmxvd1Byb3BlcnR5KHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBiSW1wb3J0YW50KTsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGU6DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlQ29sdW1uUnVsZVByb3BlcnR5KHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBiSW1wb3J0YW50KTsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTGlzdDoNCi0gICAgICAgICAgICBzd2l0Y2ggKHBBcmdzLT5wUHJvcGVydHktPmVOYW1lKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvdW50ZXJJbmNyZW1lbnQ6DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvdW50ZXJSZXNldDoNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZUNvdW50ZXJQcm9wZXJ0eShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgYkltcG9ydGFudCk7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbnRlbnQ6DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VDb250ZW50UHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlVmFsdWVMaXN0UHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsIGludDMyX3QgaU5hbWVMZW4sIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwgaW50MzJfdCBpVmFsdWVMZW4pDQotew0KLSAgICBGREVfTFBDU1NDVVNUT01QUk9QRVJUWSBwUHJvcGVydHkgPSBGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBGREVfQ1NTQ1VTVE9NUFJPUEVSVFk7DQotICAgIHBQcm9wZXJ0eS0+cHdzTmFtZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pOYW1lLCBpTmFtZUxlbik7DQotICAgIHBQcm9wZXJ0eS0+cHdzVmFsdWUgPSBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgIHBQcm9wZXJ0eS0+cE5leHQgPSBOVUxMOw0KLSAgICBpZiAobV9wTGFzdEN1c3RvbSA9PSBOVUxMKSB7DQotICAgICAgICBtX3BMYXN0Q3VzdG9tID0gbV9wRmlyc3RDdXN0b20gPSBwUHJvcGVydHk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BMYXN0Q3VzdG9tLT5wTmV4dCA9IHBQcm9wZXJ0eTsNCi0gICAgICAgIG1fcExhc3RDdXN0b20gPSBwUHJvcGVydHk7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUlGREVfQ1NTVmFsdWUqIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlTnVtYmVyKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwgaW50MzJfdCBpVmFsdWVMZW4pDQotew0KLSAgICBGWF9GTE9BVCBmVmFsdWU7DQotICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVVbml0Ow0KLSAgICBpZiAoIUZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVVbml0KSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIE5ld051bWJlclZhbHVlKHBBcmdzLT5wU3RhdGljU3RvcmUsIGVVbml0LCBmVmFsdWUpOw0KLX0NCi1JRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUVudW0oRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbikNCi17DQotICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0gRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgIHJldHVybiBwVmFsdWUgPyBOZXdFbnVtVmFsdWUocEFyZ3MtPnBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSkgOiBOVUxMOw0KLX0NCi1JRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNvbG9yKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwgaW50MzJfdCBpVmFsdWVMZW4pDQotew0KLSAgICBGWF9BUkdCIGR3Q29sb3I7DQotICAgIGlmICghRkRFX1BhcnNlQ1NTQ29sb3IocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZHdDb2xvcikpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGR3Q29sb3IpOw0KLX0NCi1JRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZVVSSShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuKQ0KLXsNCi0gICAgaW50MzJfdCBpT2Zmc2V0Ow0KLSAgICBpZiAoIUZERV9QYXJzZUNTU1VSSShwc3pWYWx1ZSwgaVZhbHVlTGVuLCBpT2Zmc2V0LCBpVmFsdWVMZW4pKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAoaVZhbHVlTGVuIDw9IDApIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlICsgaU9mZnNldCwgaVZhbHVlTGVuKTsNCi0gICAgcmV0dXJuIHBzelZhbHVlID8gRkRFX05ld1dpdGgocEFyZ3MtPnBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRV9VUkksIHBzelZhbHVlKSA6IE5VTEw7DQotfQ0KLUlGREVfQ1NTVmFsdWUqIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlU3RyaW5nKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwgaW50MzJfdCBpVmFsdWVMZW4pDQotew0KLSAgICBpbnQzMl90IGlPZmZzZXQ7DQotICAgIGlmICghRkRFX1BhcnNlQ1NTU3RyaW5nKHBzelZhbHVlLCBpVmFsdWVMZW4sIGlPZmZzZXQsIGlWYWx1ZUxlbikpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGlmIChpVmFsdWVMZW4gPD0gMCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcHN6VmFsdWUgPSBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUgKyBpT2Zmc2V0LCBpVmFsdWVMZW4pOw0KLSAgICByZXR1cm4gcHN6VmFsdWUgPyBGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZywgcHN6VmFsdWUpIDogTlVMTDsNCi19DQotSUZERV9DU1NWYWx1ZSogQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VGdW5jdGlvbihGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuKQ0KLXsNCi0gICAgaWYgKHBzelZhbHVlW2lWYWx1ZUxlbiAtIDFdICE9ICcpJykgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaW50MzJfdCBpU3RhcnRCcmFja2V0ID0gMDsNCi0gICAgd2hpbGUgKHBzelZhbHVlW2lTdGFydEJyYWNrZXRdICE9ICcoJykgew0KLSAgICAgICAgaWYgKGlTdGFydEJyYWNrZXQgPCBpVmFsdWVMZW4pIHsNCi0gICAgICAgICAgICBpU3RhcnRCcmFja2V0Kys7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KKyAgICAgICAgaWYgKGxpc3QuR2V0U2l6ZSgpID09IDApIHsNCisgICAgICAgICAgcHN6VmFsdWUgPSBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgIGxpc3QuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZywgcHN6VmFsdWUpKTsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgIGxpc3RGdWxsLkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBsaXN0KSk7DQorICAgICAgICAgIGxpc3QuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICBsaXN0LkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoDQorICAgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsIHBzelZhbHVlKSk7DQogICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKGlTdGFydEJyYWNrZXQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgY29uc3QgRlhfV0NIQVIqIHBzekZ1bmNOYW1lID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpU3RhcnRCcmFja2V0KTsNCi0gICAgcHN6VmFsdWUgKz0gKGlTdGFydEJyYWNrZXQgKyAxKTsNCi0gICAgaVZhbHVlTGVuIC09IChpU3RhcnRCcmFja2V0ICsgMik7DQotICAgIENGREVfQ1NTVmFsdWVBcnJheSBhcmd1bWVudEFycjsNCi0gICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcsJyk7DQotICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVQcmltaXRpdmVUeXBlOw0KLSAgICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlUHJpbWl0aXZlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCi0gICAgICAgIHN3aXRjaCAoZVByaW1pdGl2ZVR5cGUpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwUHJvcGVydHlWYWx1ZSA9IEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBQcm9wZXJ0eVZhbHVlICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudEFyci5BZGQoTmV3RW51bVZhbHVlKHBBcmdzLT5wU3RhdGljU3RvcmUsIHBQcm9wZXJ0eVZhbHVlLT5lTmFtZSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSAqcEZ1bmN0aW9uVmFsdWUgPSBQYXJzZUZ1bmN0aW9uKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwRnVuY3Rpb25WYWx1ZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRBcnIuQWRkKHBGdW5jdGlvblZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50QXJyLkFkZChGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZywgQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6IHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlUHJpbWl0aXZlVHlwZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudEFyci5BZGQoTmV3TnVtYmVyVmFsdWUocEFyZ3MtPnBTdGF0aWNTdG9yZSwgZVByaW1pdGl2ZVR5cGUsIGZWYWx1ZSkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGFyZ3VtZW50QXJyLkFkZChGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZywgQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIElGREVfQ1NTVmFsdWVMaXN0ICpwQXJndW1lbnRMaXN0ID0gRkRFX05ld1dpdGgocEFyZ3MtPnBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NWYWx1ZUxpc3QocEFyZ3MtPnBTdGF0aWNTdG9yZSwgYXJndW1lbnRBcnIpOw0KLSAgICBDRkRFX0NTU0Z1bmN0aW9uICpwRnVuY3Rpb24gPSBGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBDRkRFX0NTU0Z1bmN0aW9uKHBzekZ1bmNOYW1lLCBwQXJndW1lbnRMaXN0KTsNCi0gICAgcmV0dXJuIEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUocEZ1bmN0aW9uKTsNCisgIH0NCisgIGlmIChsaXN0LkdldFNpemUoKSA9PSAxKSB7DQorICAgIGxpc3RGdWxsLkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBsaXN0KSk7DQorICB9DQorICBpZiAobGlzdEZ1bGwuR2V0U2l6ZSgpID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBwQXJncy0+cFByb3BlcnR5LT5lTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkNCisgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU1ZhbHVlTGlzdChwU3RhdGljU3RvcmUsIGxpc3RGdWxsKSwNCisgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDb250ZW50UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KQ0KLXsNCi0gICAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gKElGWF9NRU1BbGxvY2F0b3IqKXBBcmdzLT5wU3RhdGljU3RvcmU7DQotICAgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnICcpOw0KLSAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCi0gICAgQ0ZERV9DU1NWYWx1ZUFycmF5IGxpc3Q7DQotICAgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KLSAgICAgICAgc3dpdGNoIChlVHlwZSkgew0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJOg0KLSAgICAgICAgICAgICAgICBsaXN0LkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZVR5cGUsIENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQotICAgICAgICAgICAgICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9IEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdC5HZXRTaXplKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZChOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX09wZW5RdW90ZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DbG9zZVF1b3RlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vT3BlblF1b3RlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vQ2xvc2VRdW90ZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUgKnBGdW5jdGlvbiA9IFBhcnNlRnVuY3Rpb24ocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGdW5jdGlvbiAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQocEZ1bmN0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShlVHlwZSwgQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0I6DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlVmFsdWVMaXN0UHJvcGVydHkoDQorICAgIEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgIEZYX1dDSEFSIHNlcGFyYXRvciA9DQorICAgICAgKHBBcmdzLT5wUHJvcGVydHktPmVOYW1lID09IEZERV9DU1NQUk9QRVJUWV9Gb250RmFtaWx5KSA/ICcsJyA6ICcgJzsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBzZXBhcmF0b3IpOw0KKyAgY29uc3QgRlhfRFdPUkQgZHdUeXBlID0gcEFyZ3MtPnBQcm9wZXJ0eS0+ZHdUeXBlOw0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICBDRkRFX0NTU1ZhbHVlQXJyYXkgbGlzdDsNCisgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6DQorICAgICAgICBpZiAoZHdUeXBlICYgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcikgew0KKyAgICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVHlwZSkpIHsNCisgICAgICAgICAgICBsaXN0LkFkZChOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpKTsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6DQorICAgICAgICBpZiAoZHdUeXBlICYgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yKSB7DQorICAgICAgICAgIEZYX0FSR0IgZHdDb2xvcjsNCisgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQorICAgICAgICAgICAgbGlzdC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGR3Q29sb3IpKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3VHlwZSAmIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtKSB7DQorICAgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0NCisgICAgICAgICAgICAgIEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgICBsaXN0LkFkZChOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKSk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChkd1R5cGUgJiBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nKSB7DQorICAgICAgICAgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICBsaXN0LkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoDQorICAgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsIHBzelZhbHVlKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjoNCisgICAgICAgIGlmIChkd1R5cGUgJiBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3IpIHsNCisgICAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTQ29sb3IocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZHdDb2xvcikpIHsNCisgICAgICAgICAgICBsaXN0LkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZHdDb2xvcikpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKGxpc3QuR2V0U2l6ZSgpID09IDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIHBBcmdzLT5wUHJvcGVydHktPmVOYW1lLCBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgbGlzdCksIGJJbXBvcnRhbnQpOw0KLSAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChsaXN0LkdldFNpemUoKSA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHN3aXRjaCAocEFyZ3MtPnBQcm9wZXJ0eS0+ZU5hbWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQ29sb3I6DQorICAgICAgcmV0dXJuIEFkZDRWYWx1ZXNQcm9wZXJ0eSgNCisgICAgICAgICAgcFN0YXRpY1N0b3JlLCBsaXN0LCBiSW1wb3J0YW50LCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdENvbG9yLA0KKyAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wQ29sb3IsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodENvbG9yLA0KKyAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tQ29sb3IpOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJTdHlsZToNCisgICAgICByZXR1cm4gQWRkNFZhbHVlc1Byb3BlcnR5KA0KKyAgICAgICAgICBwU3RhdGljU3RvcmUsIGxpc3QsIGJJbXBvcnRhbnQsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0U3R5bGUsDQorICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BTdHlsZSwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0U3R5bGUsDQorICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSk7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlcldpZHRoOg0KKyAgICAgIHJldHVybiBBZGQ0VmFsdWVzUHJvcGVydHkoDQorICAgICAgICAgIHBTdGF0aWNTdG9yZSwgbGlzdCwgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRXaWR0aCwNCisgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFdpZHRoLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRXaWR0aCwNCisgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVdpZHRoKTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luOg0KKyAgICAgIHJldHVybiBBZGQ0VmFsdWVzUHJvcGVydHkoDQorICAgICAgICAgIHBTdGF0aWNTdG9yZSwgbGlzdCwgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZX01hcmdpbkxlZnQsDQorICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5Ub3AsIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5SaWdodCwNCisgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX01hcmdpbkJvdHRvbSk7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmc6DQorICAgICAgcmV0dXJuIEFkZDRWYWx1ZXNQcm9wZXJ0eSgNCisgICAgICAgICAgcFN0YXRpY1N0b3JlLCBsaXN0LCBiSW1wb3J0YW50LCBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0xlZnQsDQorICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nVG9wLCBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1JpZ2h0LA0KKyAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0JvdHRvbSk7DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBDRkRFX0NTU1ZhbHVlTGlzdCogcExpc3QgPQ0KKyAgICAgICAgICBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgbGlzdCk7DQorICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBwQXJncy0+cFByb3BlcnR5LT5lTmFtZSwgcExpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gYnJlYWs7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDb3VudGVyUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KQ0KLXsNCi0gICAgSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCi0gICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcgJyk7DQotICAgIENGREVfQ1NTVmFsdWVBcnJheSBsaXN0Ow0KLSAgICBDRkRFX0NTU1ZhbHVlQXJyYXkgbGlzdEZ1bGw7DQotICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KLSAgICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCi0gICAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjogew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0LkdldFNpemUoKSA9PSAxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgZVR5cGUsIGZWYWx1ZSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0RnVsbC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ZhbHVlTGlzdChwU3RhdGljU3RvcmUsIGxpc3QpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobGlzdC5HZXRTaXplKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsIHBzelZhbHVlKSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RGdWxsLkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgbGlzdCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuUmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHN6VmFsdWUgPSBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZywgcHN6VmFsdWUpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAobGlzdC5HZXRTaXplKCkgPT0gMSkgew0KLSAgICAgICAgbGlzdEZ1bGwuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBsaXN0KSk7DQotICAgIH0NCi0gICAgaWYgKGxpc3RGdWxsLkdldFNpemUoKSA9PSAwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBwQXJncy0+cFByb3BlcnR5LT5lTmFtZSwgRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ZhbHVlTGlzdChwU3RhdGljU3RvcmUsIGxpc3RGdWxsKSwgYkltcG9ydGFudCk7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkNFZhbHVlc1Byb3BlcnR5KElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkRFX0NTU1ZhbHVlQXJyYXkmIGxpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZVRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlQm90dG9tKSB7DQorICBzd2l0Y2ggKGxpc3QuR2V0U2l6ZSgpKSB7DQorICAgIGNhc2UgMToNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVMZWZ0LCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVUb3AsIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVJpZ2h0LCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVCb3R0b20sIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIDI6DQorICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlTGVmdCwgbGlzdFsxXSwgYkltcG9ydGFudCk7DQorICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlVG9wLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVSaWdodCwgbGlzdFsxXSwgYkltcG9ydGFudCk7DQorICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlQm90dG9tLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSAzOg0KKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZUxlZnQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVRvcCwgbGlzdFswXSwgYkltcG9ydGFudCk7DQorICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlUmlnaHQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZUJvdHRvbSwgbGlzdFsyXSwgYkltcG9ydGFudCk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgNDoNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVMZWZ0LCBsaXN0WzNdLCBiSW1wb3J0YW50KTsNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVUb3AsIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVJpZ2h0LCBsaXN0WzFdLCBiSW1wb3J0YW50KTsNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVCb3R0b20sIGxpc3RbMl0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlVmFsdWVMaXN0UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KQ0KLXsNCi0gICAgSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCi0gICAgRlhfV0NIQVIgc2VwYXJhdG9yID0gKHBBcmdzLT5wUHJvcGVydHktPmVOYW1lID09IEZERV9DU1NQUk9QRVJUWV9Gb250RmFtaWx5KSA/ICcsJyA6ICcgJzsNCi0gICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sIHNlcGFyYXRvcik7DQotICAgIGNvbnN0IEZYX0RXT1JEIGR3VHlwZSA9IHBBcmdzLT5wUHJvcGVydHktPmR3VHlwZTsNCi0gICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQotICAgIENGREVfQ1NTVmFsdWVBcnJheSBsaXN0Ow0KLSAgICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCi0gICAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjoNCi0gICAgICAgICAgICAgICAgaWYgKGR3VHlwZSAmIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVHlwZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZChOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzoNCi0gICAgICAgICAgICAgICAgaWYgKGR3VHlwZSAmIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcikgew0KLSAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGR3Q29sb3IpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoZHdUeXBlICYgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0gRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZChOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGR3VHlwZSAmIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmcpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZywgcHN6VmFsdWUpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjoNCi0gICAgICAgICAgICAgICAgaWYgKGR3VHlwZSAmIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcikgew0KLSAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGR3Q29sb3IpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQm9yZGVyUHJvcG9lcnR5KA0KKyAgICBJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgIElGREVfQ1NTVmFsdWUqJiBwQ29sb3IsDQorICAgIElGREVfQ1NTVmFsdWUqJiBwU3R5bGUsDQorICAgIElGREVfQ1NTVmFsdWUqJiBwV2lkdGgpIGNvbnN0IHsNCisgIHBDb2xvciA9IHBTdHlsZSA9IHBXaWR0aCA9IE5VTEw7DQorICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQorICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjoNCisgICAgICAgIGlmIChwV2lkdGggPT0gTlVMTCkgew0KKyAgICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVHlwZSkpIHsNCisgICAgICAgICAgICBwV2lkdGggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGxpc3QuR2V0U2l6ZSgpID09IDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKHBBcmdzLT5wUHJvcGVydHktPmVOYW1lKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJDb2xvcjoNCi0gICAgICAgICAgICByZXR1cm4gQWRkNFZhbHVlc1Byb3BlcnR5KHBTdGF0aWNTdG9yZSwgbGlzdCwgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BDb2xvciwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Q29sb3IsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21Db2xvcik7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJTdHlsZToNCi0gICAgICAgICAgICByZXR1cm4gQWRkNFZhbHVlc1Byb3BlcnR5KHBTdGF0aWNTdG9yZSwgbGlzdCwgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRTdHlsZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BTdHlsZSwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0U3R5bGUsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSk7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJXaWR0aDoNCi0gICAgICAgICAgICByZXR1cm4gQWRkNFZhbHVlc1Byb3BlcnR5KHBTdGF0aWNTdG9yZSwgbGlzdCwgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRXaWR0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BXaWR0aCwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGgsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21XaWR0aCk7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXJnaW46DQotICAgICAgICAgICAgcmV0dXJuIEFkZDRWYWx1ZXNQcm9wZXJ0eShwU3RhdGljU3RvcmUsIGxpc3QsIGJJbXBvcnRhbnQsIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5MZWZ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX01hcmdpblRvcCwgRkRFX0NTU1BST1BFUlRZX01hcmdpblJpZ2h0LCBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luQm90dG9tKTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmc6DQotICAgICAgICAgICAgcmV0dXJuIEFkZDRWYWx1ZXNQcm9wZXJ0eShwU3RhdGljU3RvcmUsIGxpc3QsIGJJbXBvcnRhbnQsIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nTGVmdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nVG9wLCBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1JpZ2h0LCBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0JvdHRvbSk7DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIENGREVfQ1NTVmFsdWVMaXN0ICpwTGlzdCA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBsaXN0KTsNCi0gICAgICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBwQXJncy0+cFByb3BlcnR5LT5lTmFtZSwgcExpc3QsIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCOg0KKyAgICAgICAgaWYgKHBDb2xvciA9PSBOVUxMKSB7DQorICAgICAgICAgIEZYX0FSR0IgZHdDb2xvcjsNCisgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQorICAgICAgICAgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGR3Q29sb3IpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KKyAgICAgICAgRkRFX0xQQ0NTU0NPTE9SVEFCTEUgcENvbG9ySXRlbSA9DQorICAgICAgICAgICAgRkRFX0dldENTU0NvbG9yQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgaWYgKHBDb2xvckl0ZW0gIT0gTlVMTCkgew0KKyAgICAgICAgICBpZiAocENvbG9yID09IE5VTEwpIHsNCisgICAgICAgICAgICBwQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUocENvbG9ySXRlbS0+ZHdWYWx1ZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9DQorICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocFZhbHVlID09IE5VTEwpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBzd2l0Y2ggKHBWYWx1ZS0+ZU5hbWUpIHsNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UcmFuc3BhcmVudDoNCisgICAgICAgICAgICBpZiAocENvbG9yID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIHBDb2xvciA9DQorICAgICAgICAgICAgICAgICAgRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKChGWF9BUkdCKTApOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkNFZhbHVlc1Byb3BlcnR5KElGWF9NRU1BbGxvY2F0b3IgKnBTdGF0aWNTdG9yZSwgY29uc3QgQ0ZERV9DU1NWYWx1ZUFycmF5ICZsaXN0LCBGWF9CT09MIGJJbXBvcnRhbnQsIEZERV9DU1NQUk9QRVJUWSBlTGVmdCwgRkRFX0NTU1BST1BFUlRZIGVUb3AsIEZERV9DU1NQUk9QRVJUWSBlUmlnaHQsIEZERV9DU1NQUk9QRVJUWSBlQm90dG9tKQ0KLXsNCi0gICAgc3dpdGNoIChsaXN0LkdldFNpemUoKSkgew0KLSAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZUxlZnQsIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVRvcCwgbGlzdFswXSwgYkltcG9ydGFudCk7DQotICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlUmlnaHQsIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZUJvdHRvbSwgbGlzdFswXSwgYkltcG9ydGFudCk7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlTGVmdCwgbGlzdFsxXSwgYkltcG9ydGFudCk7DQotICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlVG9wLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCi0gICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVSaWdodCwgbGlzdFsxXSwgYkltcG9ydGFudCk7DQotICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlQm90dG9tLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVMZWZ0LCBsaXN0WzFdLCBiSW1wb3J0YW50KTsNCi0gICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVUb3AsIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVJpZ2h0LCBsaXN0WzFdLCBiSW1wb3J0YW50KTsNCi0gICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVCb3R0b20sIGxpc3RbMl0sIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZUxlZnQsIGxpc3RbM10sIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVRvcCwgbGlzdFswXSwgYkltcG9ydGFudCk7DQotICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlUmlnaHQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZUJvdHRvbSwgbGlzdFsyXSwgYkltcG9ydGFudCk7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUJvcmRlclByb3BvZXJ0eShJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwgaW50MzJfdCBpVmFsdWVMZW4sIElGREVfQ1NTVmFsdWUgKiZwQ29sb3IsIElGREVfQ1NTVmFsdWUgKiZwU3R5bGUsIElGREVfQ1NTVmFsdWUgKiZwV2lkdGgpIGNvbnN0DQotew0KLSAgICBwQ29sb3IgPSBwU3R5bGUgPSBwV2lkdGggPSBOVUxMOw0KLSAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCi0gICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQotICAgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KLSAgICAgICAgc3dpdGNoIChlVHlwZSkgew0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOg0KLSAgICAgICAgICAgICAgICBpZiAocFdpZHRoID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVHlwZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwV2lkdGggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCOg0KLSAgICAgICAgICAgICAgICBpZiAocENvbG9yID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZHdDb2xvcjsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb2xvciA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0xQQ0NTU0NPTE9SVEFCTEUgcENvbG9ySXRlbSA9IEZERV9HZXRDU1NDb2xvckJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQ29sb3JJdGVtICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbG9yID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKHBDb2xvckl0ZW0tPmR3VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0gRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJhbnNwYXJlbnQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ29sb3IgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKChGWF9BUkdCKTApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpbjoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RoaWNrOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTWVkaXVtOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdpZHRoID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWR0aCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hpZGRlbjoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdHRlZDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rhc2hlZDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NvbGlkOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfR3Jvb3ZlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlkZ2U6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNldDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNldDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTdHlsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R5bGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBDb2xvciA9PSBOVUxMKSB7DQotICAgICAgICBwQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoKEZYX0FSR0IpMCk7DQotICAgIH0NCi0gICAgaWYgKHBTdHlsZSA9PSBOVUxMKSB7DQotICAgICAgICBwU3R5bGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lKTsNCi0gICAgfQ0KLSAgICBpZiAocFdpZHRoID09IE5VTEwpIHsNCi0gICAgICAgIHBXaWR0aCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyLCAwLjBmKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpBZGRCb3JkZXJQcm9wZXJ0eShJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIElGREVfQ1NTVmFsdWUgKnBDb2xvciwgSUZERV9DU1NWYWx1ZSAqcFN0eWxlLCBJRkRFX0NTU1ZhbHVlICpwV2lkdGgsIEZYX0JPT0wgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZIGVDb2xvciwgRkRFX0NTU1BST1BFUlRZIGVTdHlsZSwgRkRFX0NTU1BST1BFUlRZIGVXaWR0aCkNCi17DQotICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVN0eWxlLCBwU3R5bGUsIGJJbXBvcnRhbnQpOw0KLSAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVXaWR0aCwgcFdpZHRoLCBiSW1wb3J0YW50KTsNCi0gICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlQ29sb3IsIHBDb2xvciwgYkltcG9ydGFudCk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VMaXN0U3R5bGVQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpDQotew0KLSAgICBJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KLSAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCi0gICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcFR5cGUgPSBOVUxMLCAqcEltYWdlID0gTlVMTCwgKnBQb3NpdGlvbiA9IE5VTEw7DQotICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KLSAgICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCi0gICAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1VSSToNCi0gICAgICAgICAgICAgICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBwSW1hZ2UgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZVR5cGUsIENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0gRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2UgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwVHlwZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2UgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2lkZToNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNpZGU6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUG9zaXRpb24gPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBvc2l0aW9uID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXNjOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2lyY2xlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3F1YXJlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RlY2ltYWxMZWFkaW5nWmVybzoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyUm9tYW46DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlclJvbWFuOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJHcmVlazoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyTGF0aW46DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckxhdGluOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXJtZW5pYW46DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9HZW9yZ2lhbjoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyQWxwaGE6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckFscGhhOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFR5cGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBQb3NpdGlvbiA9PSBOVUxMKSB7DQotICAgICAgICBwUG9zaXRpb24gPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdXRzaWRlKTsNCi0gICAgfQ0KLSAgICBpZiAocEltYWdlID09IE5VTEwpIHsNCi0gICAgICAgIHBJbWFnZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUpOw0KLSAgICB9DQotICAgIGlmIChwVHlwZSA9PSBOVUxMKSB7DQotICAgICAgICBwVHlwZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUpOw0KLSAgICB9DQotICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZVBvc2l0aW9uLCBwUG9zaXRpb24sIGJJbXBvcnRhbnQpOw0KLSAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVJbWFnZSwgcEltYWdlLCBiSW1wb3J0YW50KTsNCi0gICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlVHlwZSwgcFR5cGUsIGJJbXBvcnRhbnQpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUJhY2tncm91bmRQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpDQotew0KLSAgICBJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KLSAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCi0gICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcENvbG9yID0gTlVMTCwgKnBJbWFnZSA9IE5VTEwsICpwUmVwZWF0ID0gTlVMTDsNCi0gICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcFBvc1ggPSBOVUxMLCAqcFBvc1kgPSBOVUxMLCAqcEF0dGFjaG1lbnQgPSBOVUxMOw0KLSAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCi0gICAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQotICAgICAgICBzd2l0Y2ggKGVUeXBlKSB7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9VUkk6DQotICAgICAgICAgICAgICAgIGlmIChwSW1hZ2UgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGVUeXBlLCBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbikpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIUZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBQb3NYID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwUG9zWCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgZVR5cGUsIGZWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBQb3NZID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwUG9zWSA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgZVR5cGUsIGZWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0gRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBWYWx1ZS0+ZU5hbWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UcmFuc3BhcmVudDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ29sb3IgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2xvciA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgoRlhfQVJHQikwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0ZpeGVkOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Njcm9sbDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQXR0YWNobWVudCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF0dGFjaG1lbnQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXRYOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFk6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9SZXBlYXQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGVhdCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlcGVhdCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGVmdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUG9zWCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBvc1ggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RvcDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3R0b206DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFBvc1kgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQb3NYID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DZW50ZXI6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFBvc1ggPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQb3NYID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBQb3NZID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUG9zWCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBGREVfTFBDQ1NTQ09MT1JUQUJMRSBwQ29sb3JJdGVtID0gRkRFX0dldENTU0NvbG9yQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDb2xvckl0ZW0gIT0gTlVMTCkNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbG9yID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKHBDb2xvckl0ZW0tPmR3VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjoNCi0gICAgICAgICAgICAgICAgaWYgKHBDb2xvciA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGR3Q29sb3I7DQotICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTQ29sb3IocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZHdDb2xvcikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZHdDb2xvcik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBDb2xvciA9PSBOVUxMKSB7DQotICAgICAgICBwQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoKEZYX0FSR0IpMCk7DQotICAgIH0NCi0gICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQotICAgICAgICBwSW1hZ2UgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lKTsNCi0gICAgfQ0KLSAgICBpZiAocFJlcGVhdCA9PSBOVUxMKSB7DQotICAgICAgICBwUmVwZWF0ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0KTsNCi0gICAgfQ0KLSAgICBpZiAocEF0dGFjaG1lbnQgPT0gTlVMTCkgew0KLSAgICAgICAgcEF0dGFjaG1lbnQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TY3JvbGwpOw0KLSAgICB9DQotICAgIGlmIChwUG9zWCA9PSBOVUxMKSB7DQotICAgICAgICBwUG9zWCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyLCAwLjBmKTsNCi0gICAgICAgIHBQb3NZID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIsIDAuMGYpOw0KLSAgICB9IGVsc2UgaWYgKHBQb3NZID09IE5VTEwpIHsNCi0gICAgICAgIHBQb3NZID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIsIDAuMGYpOw0KLSAgICB9DQotICAgIENGREVfQ1NTVmFsdWVBcnJheSBwb3NpdGlvbjsNCi0gICAgcG9zaXRpb24uQWRkKHBQb3NYKTsNCi0gICAgcG9zaXRpb24uQWRkKHBQb3NZKTsNCi0gICAgQ0ZERV9DU1NWYWx1ZUxpc3QgKnBQb3NMaXN0ID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ZhbHVlTGlzdChwU3RhdGljU3RvcmUsIHBvc2l0aW9uKTsNCi0gICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZENvbG9yLCBwQ29sb3IsIGJJbXBvcnRhbnQpOw0KLSAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kSW1hZ2UsIHBJbWFnZSwgYkltcG9ydGFudCk7DQotICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRSZXBlYXQsIHBSZXBlYXQsIGJJbXBvcnRhbnQpOw0KLSAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUG9zaXRpb24sIHBQb3NMaXN0LCBiSW1wb3J0YW50KTsNCi0gICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZEF0dGFjaG1lbnQsIHBBdHRhY2htZW50LCBiSW1wb3J0YW50KTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VGb250UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KQ0KLXsNCi0gICAgSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCi0gICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcvJyk7DQotICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBTdHlsZSA9IE5VTEwsICpwVmFyaWFudCA9IE5VTEwsICpwV2VpZ2h0ID0gTlVMTDsNCi0gICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcEZvbnRTaXplID0gTlVMTCwgKnBMaW5lSGVpZ2h0ID0gTlVMTDsNCi0gICAgQ0ZERV9DU1NWYWx1ZUFycmF5IGZhbWlseUxpc3Q7DQotICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KLSAgICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCi0gICAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwVmFsdWUgPSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwVmFsdWUgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1h4U21hbGw6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWFNtYWxsOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NtYWxsOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX01lZGl1bToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MYXJnZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YTGFyZ2U6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWHhMYXJnZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbGVyOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xhcmdlcjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRm9udFNpemUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb250U2l6ZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm9sZDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkZXI6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGlnaHRlcjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV2VpZ2h0ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV2VpZ2h0ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JdGFsaWM6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT2JsaXF1ZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU3R5bGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHlsZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGxDYXBzOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBWYXJpYW50ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFyaWFudCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTdHlsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0eWxlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBWYXJpYW50ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFyaWFudCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwV2VpZ2h0ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV2VpZ2h0ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBGb250U2l6ZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnRTaXplID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBMaW5lSGVpZ2h0ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZUhlaWdodCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAocEZvbnRTaXplICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHlMaXN0LkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZVR5cGUsIENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcGFyc2VyLm1fU2VwYXJhdG9yID0gJywnOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIUZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKGludDMyX3QpZlZhbHVlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwMDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDA6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDAwOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUwMDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MDA6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzAwOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDgwMDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5MDA6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdlaWdodCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdlaWdodCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyLCBmVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGb250U2l6ZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnRTaXplID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocExpbmVIZWlnaHQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lSGVpZ2h0ID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAocFN0eWxlID09IE5VTEwpIHsNCi0gICAgICAgIHBTdHlsZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbCk7DQotICAgIH0NCi0gICAgaWYgKHBWYXJpYW50ID09IE5VTEwpIHsNCi0gICAgICAgIHBWYXJpYW50ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsKTsNCi0gICAgfQ0KLSAgICBpZiAocFdlaWdodCA9PSBOVUxMKSB7DQotICAgICAgICBwV2VpZ2h0ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsKTsNCi0gICAgfQ0KLSAgICBpZiAocEZvbnRTaXplID09IE5VTEwpIHsNCi0gICAgICAgIHBGb250U2l6ZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX01lZGl1bSk7DQotICAgIH0NCi0gICAgaWYgKHBMaW5lSGVpZ2h0ID09IE5VTEwpIHsNCi0gICAgICAgIHBMaW5lSGVpZ2h0ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsKTsNCi0gICAgfQ0KLSAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9Gb250U3R5bGUsIHBTdHlsZSwgYkltcG9ydGFudCk7DQotICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0ZvbnRWYXJpYW50LCBwVmFyaWFudCwgYkltcG9ydGFudCk7DQotICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0ZvbnRXZWlnaHQsIHBXZWlnaHQsIGJJbXBvcnRhbnQpOw0KLSAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSwgcEZvbnRTaXplLCBiSW1wb3J0YW50KTsNCi0gICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfTGluZUhlaWdodCwgcExpbmVIZWlnaHQsIGJJbXBvcnRhbnQpOw0KLSAgICBpZiAoZmFtaWx5TGlzdC5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICBDRkRFX0NTU1ZhbHVlTGlzdCAqcExpc3QgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgZmFtaWx5TGlzdCk7DQotICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9Gb250RmFtaWx5LCBwTGlzdCwgYkltcG9ydGFudCk7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDb2x1bW5SdWxlUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KQ0KLXsNCi0gICAgSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCi0gICAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcgJyk7DQotICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBDb2x1bW5SdWxlV2lkdGggPSBOVUxMOw0KLSAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwQ29sdW1uUnVsZVN0eWxlID0gTlVMTDsNCi0gICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcENvbHVtblJ1bGVDb2xvciA9IE5VTEw7DQotICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KLSAgICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCi0gICAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwVmFsdWUgPSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwVmFsdWUgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdHRlZDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EYXNoZWQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU29saWQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0dyb292ZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWRnZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNldDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdXRzZXQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbHVtblJ1bGVTdHlsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVTdHlsZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJhbnNwYXJlbnQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbHVtblJ1bGVDb2xvciA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVDb2xvciA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpbjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW06DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpY2s6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbHVtblJ1bGVXaWR0aCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVXaWR0aCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGR3Q29sb3I7DQotICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTQ29sb3IocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZHdDb2xvcikgJiYgcENvbHVtblJ1bGVDb2xvciA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVDb2xvciA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgoRlhfQVJHQilkd0NvbG9yKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjogew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSAmJiBwQ29sdW1uUnVsZVdpZHRoID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ29sdW1uUnVsZVdpZHRoID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjogew0KLSAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDb2x1bW5SdWxlQ29sb3IgPT0gTlVMTCAmJiBGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb2x1bW5SdWxlQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoKEZYX0FSR0IpZHdDb2xvcik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBDb2x1bW5SdWxlQ29sb3IgPT0gTlVMTCAmJiBwQ29sdW1uUnVsZVN0eWxlID09IE5VTEwgJiYgcENvbHVtblJ1bGVXaWR0aCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKHBDb2x1bW5SdWxlU3R5bGUgPT0gTlVMTCkgew0KLSAgICAgICAgcENvbHVtblJ1bGVTdHlsZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUpOw0KLSAgICB9DQotICAgIGlmIChwQ29sdW1uUnVsZVdpZHRoID09IE5VTEwpIHsNCi0gICAgICAgIHBDb2x1bW5SdWxlV2lkdGggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW0pOw0KLSAgICB9DQotICAgIGlmIChwQ29sdW1uUnVsZUNvbG9yID09IE5VTEwpIHsNCi0gICAgICAgIHBDb2x1bW5SdWxlQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoKEZYX0FSR0IpMCk7DQotICAgIH0NCi0gICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVN0eWxlLCBwQ29sdW1uUnVsZVN0eWxlLCBiSW1wb3J0YW50KTsNCi0gICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVdpZHRoLCBwQ29sdW1uUnVsZVdpZHRoLCBiSW1wb3J0YW50KTsNCi0gICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZUNvbG9yLCBwQ29sdW1uUnVsZUNvbG9yLCBiSW1wb3J0YW50KTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VUZXh0RW1waGFzaXNQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpDQotew0KLSAgICBJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KLSAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCi0gICAgQ0ZERV9DU1NWYWx1ZUFycmF5IGFyckVtcGhhc2lzU3R5bGU7DQotICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KLSAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwRW1waGFzaXNDb2xvciA9IE5VTEw7DQotICAgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KLSAgICAgICAgc3dpdGNoIChlVHlwZSkgew0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQotICAgICAgICAgICAgICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9IEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYXJyRW1waGFzaXNTdHlsZS5BZGQoTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEVtcGhhc2lzQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZHdDb2xvcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwc3pWYWx1ZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgICAgIGFyckVtcGhhc2lzU3R5bGUuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsIHBzelZhbHVlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0I6IHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZHdDb2xvcjsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFbXBoYXNpc0NvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGR3Q29sb3IpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChhcnJFbXBoYXNpc1N0eWxlLkdldFNpemUoKSAhPSAwKSB7DQotICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9UZXh0RW1waGFzaXNTdHlsZSwgRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ZhbHVlTGlzdChwU3RhdGljU3RvcmUsIGFyckVtcGhhc2lzU3R5bGUpLCBiSW1wb3J0YW50KTsNCi0gICAgfQ0KLSAgICBpZiAocEVtcGhhc2lzQ29sb3IgIT0gTlVMTCkgew0KLSAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzQ29sb3IsIHBFbXBoYXNpc0NvbG9yLCBiSW1wb3J0YW50KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNvbHVtbnNQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpDQotew0KLSAgICBJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KLSAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCi0gICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcENvbHVtbldpZHRoID0gTlVMTDsNCi0gICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcENvbHVtbkNvdW50ID0gTlVMTDsNCi0gICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQotICAgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KLSAgICAgICAgc3dpdGNoIChlVHlwZSkgew0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQotICAgICAgICAgICAgICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9IEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZSA9PSBOVUxMICYmIHBWYWx1ZS0+ZU5hbWUgPT0gRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb2x1bW5XaWR0aCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZVR5cGUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlVHlwZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ29sdW1uQ291bnQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2x1bW5Db3VudCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgZVR5cGUsIGZWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ29sdW1uV2lkdGggPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2x1bW5XaWR0aCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgZVR5cGUsIGZWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBDb2x1bW5XaWR0aCA9PSBOVUxMICYmIHBDb2x1bW5Db3VudCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0gZWxzZSBpZiAocENvbHVtbldpZHRoID09IE5VTEwpIHsNCi0gICAgICAgIHBDb2x1bW5XaWR0aCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG8pOw0KLSAgICB9IGVsc2UgaWYgKHBDb2x1bW5Db3VudCA9PSBOVUxMKSB7DQotICAgICAgICBwQ29sdW1uQ291bnQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvKTsNCi0gICAgfQ0KLSAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5XaWR0aCwgcENvbHVtbldpZHRoLCBiSW1wb3J0YW50KTsNCi0gICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uQ291bnQsIHBDb2x1bW5Db3VudCwgYkltcG9ydGFudCk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlT3ZlcmZsb3dQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpDQotew0KLSAgICBJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KLSAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCi0gICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcE92ZXJmbG93WCA9IE5VTEw7DQotICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBPdmVyZmxvd1kgPSBOVUxMOw0KLSAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCi0gICAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQotICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nKSB7DQotICAgICAgICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwVmFsdWUgPSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NPVkVSRkxPV19WaXNpYmxlOg0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTT1ZFUkZMT1dfSGlkZGVuOg0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTT1ZFUkZMT1dfU2Nyb2xsOg0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTT1ZFUkZMT1dfQXV0bzoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU09WRVJGTE9XX05vRGlzcGxheToNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU09WRVJGTE9XX05vQ29udGVudDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocE92ZXJmbG93WCAhPSBOVUxMICYmIHBPdmVyZmxvd1kgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwT3ZlcmZsb3dYID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93WCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocE92ZXJmbG93WSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1kgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpbjoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGljazoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW06DQorICAgICAgICAgICAgaWYgKHBXaWR0aCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBwV2lkdGggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCiAgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRkZW46DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG90dGVkOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rhc2hlZDoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Tb2xpZDoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGU6DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfR3Jvb3ZlOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZGdlOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2V0Og0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNldDoNCisgICAgICAgICAgICBpZiAocFN0eWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIHBTdHlsZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCisgICAgICB9OyBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKHBPdmVyZmxvd1ggPT0gTlVMTCAmJiBwT3ZlcmZsb3dZID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfSBlbHNlIGlmIChwT3ZlcmZsb3dZID09IE5VTEwpIHsNCi0gICAgICAgIHBPdmVyZmxvd1kgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwT3ZlcmZsb3dYLT5HZXRFbnVtKCkpOw0KKyAgfQ0KKyAgaWYgKHBDb2xvciA9PSBOVUxMKSB7DQorICAgIHBDb2xvciA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgoRlhfQVJHQikwKTsNCisgIH0NCisgIGlmIChwU3R5bGUgPT0gTlVMTCkgew0KKyAgICBwU3R5bGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lKTsNCisgIH0NCisgIGlmIChwV2lkdGggPT0gTlVMTCkgew0KKyAgICBwV2lkdGggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciwgMC4wZik7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpBZGRCb3JkZXJQcm9wZXJ0eShJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZUNvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZIGVTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlV2lkdGgpIHsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVN0eWxlLCBwU3R5bGUsIGJJbXBvcnRhbnQpOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlV2lkdGgsIHBXaWR0aCwgYkltcG9ydGFudCk7DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVDb2xvciwgcENvbG9yLCBiSW1wb3J0YW50KTsNCit9DQorRlhfQk9PTCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUxpc3RTdHlsZVByb3BlcnR5KA0KKyAgICBGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICBGWF9CT09MIGJJbXBvcnRhbnQpIHsNCisgIElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSA9IHBBcmdzLT5wU3RhdGljU3RvcmU7DQorICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCisgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBUeXBlID0gTlVMTCwgKnBJbWFnZSA9IE5VTEwsICpwUG9zaXRpb24gPSBOVUxMOw0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJOg0KKyAgICAgICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQorICAgICAgICAgIHBJbWFnZSA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICAgIGVUeXBlLCBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbikpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0NCisgICAgICAgICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgew0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgICAgICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBwSW1hZ2UgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBUeXBlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIHBJbWFnZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNpZGU6DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3V0c2lkZToNCisgICAgICAgICAgICBpZiAocFBvc2l0aW9uID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIHBQb3NpdGlvbiA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXNjOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NpcmNsZToNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TcXVhcmU6DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbDoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWNpbWFsTGVhZGluZ1plcm86DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJSb21hbjoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlclJvbWFuOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyR3JlZWs6DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJMYXRpbjoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckxhdGluOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0FybWVuaWFuOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0dlb3JnaWFuOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyQWxwaGE6DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJBbHBoYToNCisgICAgICAgICAgICBpZiAocFR5cGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgcFR5cGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfTsgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WCwgcE92ZXJmbG93WCwgYkltcG9ydGFudCk7DQotICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WSwgcE92ZXJmbG93WSwgYkltcG9ydGFudCk7DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKHBQb3NpdGlvbiA9PSBOVUxMKSB7DQorICAgIHBQb3NpdGlvbiA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNpZGUpOw0KKyAgfQ0KKyAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQorICAgIHBJbWFnZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUpOw0KKyAgfQ0KKyAgaWYgKHBUeXBlID09IE5VTEwpIHsNCisgICAgcFR5cGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lKTsNCisgIH0NCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZVBvc2l0aW9uLCBwUG9zaXRpb24sDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZUltYWdlLCBwSW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZVR5cGUsIHBUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUJhY2tncm91bmRQcm9wZXJ0eSgNCisgICAgRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgRlhfQk9PTCBiSW1wb3J0YW50KSB7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KKyAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcgJyk7DQorICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwQ29sb3IgPSBOVUxMLCAqcEltYWdlID0gTlVMTCwgKnBSZXBlYXQgPSBOVUxMOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcFBvc1ggPSBOVUxMLCAqcFBvc1kgPSBOVUxMLCAqcEF0dGFjaG1lbnQgPSBOVUxMOw0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJOg0KKyAgICAgICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQorICAgICAgICAgIHBJbWFnZSA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICAgIGVUeXBlLCBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbikpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6IHsNCisgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZTsNCisgICAgICAgIGlmICghRkRFX1BhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZVR5cGUpKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBQb3NYID09IE5VTEwpIHsNCisgICAgICAgICAgcFBvc1ggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIGlmIChwUG9zWSA9PSBOVUxMKSB7DQorICAgICAgICAgIHBQb3NZID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9DQorICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgICAgICAgICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBJbWFnZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UcmFuc3BhcmVudDoNCisgICAgICAgICAgICAgIGlmIChwQ29sb3IgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKChGWF9BUkdCKTApOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaXhlZDoNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Njcm9sbDoNCisgICAgICAgICAgICAgIGlmIChwQXR0YWNobWVudCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBBdHRhY2htZW50ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdDoNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFg6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXRZOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9SZXBlYXQ6DQorICAgICAgICAgICAgICBpZiAocFJlcGVhdCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBSZXBlYXQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGVmdDoNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZ2h0Og0KKyAgICAgICAgICAgICAgaWYgKHBQb3NYID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFBvc1ggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVG9wOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm90dG9tOg0KKyAgICAgICAgICAgICAgaWYgKHBQb3NZID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFBvc1ggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2VudGVyOg0KKyAgICAgICAgICAgICAgaWYgKHBQb3NYID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFBvc1ggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFBvc1kgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwUG9zWCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRkRFX0xQQ0NTU0NPTE9SVEFCTEUgcENvbG9ySXRlbSA9DQorICAgICAgICAgICAgRkRFX0dldENTU0NvbG9yQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgaWYgKHBDb2xvckl0ZW0gIT0gTlVMTCkNCisgICAgICAgICAgaWYgKHBDb2xvciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKQ0KKyAgICAgICAgICAgICAgICBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKHBDb2xvckl0ZW0tPmR3VmFsdWUpOw0KKyAgICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjoNCisgICAgICAgIGlmIChwQ29sb3IgPT0gTlVMTCkgew0KKyAgICAgICAgICBGWF9BUkdCIGR3Q29sb3I7DQorICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICAgICAgICAgIHBDb2xvciA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAocENvbG9yID09IE5VTEwpIHsNCisgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKChGWF9BUkdCKTApOw0KKyAgfQ0KKyAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQorICAgIHBJbWFnZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUpOw0KKyAgfQ0KKyAgaWYgKHBSZXBlYXQgPT0gTlVMTCkgew0KKyAgICBwUmVwZWF0ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0KTsNCisgIH0NCisgIGlmIChwQXR0YWNobWVudCA9PSBOVUxMKSB7DQorICAgIHBBdHRhY2htZW50ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2Nyb2xsKTsNCisgIH0NCisgIGlmIChwUG9zWCA9PSBOVUxMKSB7DQorICAgIHBQb3NYID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIsIDAuMGYpOw0KKyAgICBwUG9zWSA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyLCAwLjBmKTsNCisgIH0gZWxzZSBpZiAocFBvc1kgPT0gTlVMTCkgew0KKyAgICBwUG9zWSA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyLCAwLjBmKTsNCisgIH0NCisgIENGREVfQ1NTVmFsdWVBcnJheSBwb3NpdGlvbjsNCisgIHBvc2l0aW9uLkFkZChwUG9zWCk7DQorICBwb3NpdGlvbi5BZGQocFBvc1kpOw0KKyAgQ0ZERV9DU1NWYWx1ZUxpc3QqIHBQb3NMaXN0ID0NCisgICAgICBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgcG9zaXRpb24pOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZENvbG9yLCBwQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRJbWFnZSwgcEltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUmVwZWF0LCBwUmVwZWF0LA0KKyAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUG9zaXRpb24sIHBQb3NMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kQXR0YWNobWVudCwNCisgICAgICAgICAgICAgICAgICAgIHBBdHRhY2htZW50LCBiSW1wb3J0YW50KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlRm9udFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnLycpOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcFN0eWxlID0gTlVMTCwgKnBWYXJpYW50ID0gTlVMTCwgKnBXZWlnaHQgPSBOVUxMOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcEZvbnRTaXplID0gTlVMTCwgKnBMaW5lSGVpZ2h0ID0gTlVMTDsNCisgIENGREVfQ1NTVmFsdWVBcnJheSBmYW1pbHlMaXN0Ow0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9DQorICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YeFNtYWxsOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWFNtYWxsOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGw6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW06DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MYXJnZToNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1hMYXJnZToNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1h4TGFyZ2U6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbGVyOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGFyZ2VyOg0KKyAgICAgICAgICAgICAgaWYgKHBGb250U2l6ZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBGb250U2l6ZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm9sZGVyOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGlnaHRlcjoNCisgICAgICAgICAgICAgIGlmIChwV2VpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFdlaWdodCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JdGFsaWM6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PYmxpcXVlOg0KKyAgICAgICAgICAgICAgaWYgKHBTdHlsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBTdHlsZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbENhcHM6DQorICAgICAgICAgICAgICBpZiAocFZhcmlhbnQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwVmFyaWFudCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWw6DQorICAgICAgICAgICAgICBpZiAocFN0eWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFN0eWxlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBWYXJpYW50ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFZhcmlhbnQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFdlaWdodCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBXZWlnaHQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZiAocEZvbnRTaXplID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcEZvbnRTaXplID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBMaW5lSGVpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcExpbmVIZWlnaHQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBGb250U2l6ZSAhPSBOVUxMKSB7DQorICAgICAgICAgIGZhbWlseUxpc3QuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICAgIGVUeXBlLCBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbikpKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhcnNlci5tX1NlcGFyYXRvciA9ICcsJzsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQorICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICBpZiAoIUZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIpIHsNCisgICAgICAgICAgc3dpdGNoICgoaW50MzJfdClmVmFsdWUpIHsNCisgICAgICAgICAgICBjYXNlIDEwMDoNCisgICAgICAgICAgICBjYXNlIDIwMDoNCisgICAgICAgICAgICBjYXNlIDMwMDoNCisgICAgICAgICAgICBjYXNlIDQwMDoNCisgICAgICAgICAgICBjYXNlIDUwMDoNCisgICAgICAgICAgICBjYXNlIDYwMDoNCisgICAgICAgICAgICBjYXNlIDcwMDoNCisgICAgICAgICAgICBjYXNlIDgwMDoNCisgICAgICAgICAgICBjYXNlIDkwMDoNCisgICAgICAgICAgICAgIGlmIChwV2VpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFdlaWdodCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciwgZlZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAocEZvbnRTaXplID09IE5VTEwpIHsNCisgICAgICAgICAgcEZvbnRTaXplID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCisgICAgICAgIH0gZWxzZSBpZiAocExpbmVIZWlnaHQgPT0gTlVMTCkgew0KKyAgICAgICAgICBwTGluZUhlaWdodCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgZVR5cGUsIGZWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChwU3R5bGUgPT0gTlVMTCkgew0KKyAgICBwU3R5bGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWwpOw0KKyAgfQ0KKyAgaWYgKHBWYXJpYW50ID09IE5VTEwpIHsNCisgICAgcFZhcmlhbnQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWwpOw0KKyAgfQ0KKyAgaWYgKHBXZWlnaHQgPT0gTlVMTCkgew0KKyAgICBwV2VpZ2h0ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsKTsNCisgIH0NCisgIGlmIChwRm9udFNpemUgPT0gTlVMTCkgew0KKyAgICBwRm9udFNpemUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW0pOw0KKyAgfQ0KKyAgaWYgKHBMaW5lSGVpZ2h0ID09IE5VTEwpIHsNCisgICAgcExpbmVIZWlnaHQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWwpOw0KKyAgfQ0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfRm9udFN0eWxlLCBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0ZvbnRWYXJpYW50LCBwVmFyaWFudCwNCisgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfRm9udFdlaWdodCwgcFdlaWdodCwNCisgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfRm9udFNpemUsIHBGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfTGluZUhlaWdodCwgcExpbmVIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIGlmIChmYW1pbHlMaXN0LkdldFNpemUoKSA+IDApIHsNCisgICAgQ0ZERV9DU1NWYWx1ZUxpc3QqIHBMaXN0ID0NCisgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBmYW1pbHlMaXN0KTsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfRm9udEZhbWlseSwgcExpc3QsDQorICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDb2x1bW5SdWxlUHJvcGVydHkoDQorICAgIEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnICcpOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcENvbHVtblJ1bGVXaWR0aCA9IE5VTEw7DQorICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKiBwQ29sdW1uUnVsZVN0eWxlID0gTlVMTDsNCisgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIHBDb2x1bW5SdWxlQ29sb3IgPSBOVUxMOw0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9DQorICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG90dGVkOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGFzaGVkOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU29saWQ6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGU6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Hcm9vdmU6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWRnZToNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2V0Og0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3V0c2V0Og0KKyAgICAgICAgICAgICAgaWYgKHBDb2x1bW5SdWxlU3R5bGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwQ29sdW1uUnVsZVN0eWxlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RyYW5zcGFyZW50Og0KKyAgICAgICAgICAgICAgaWYgKHBDb2x1bW5SdWxlQ29sb3IgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwQ29sdW1uUnVsZUNvbG9yID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RoaW46DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW06DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGljazoNCisgICAgICAgICAgICAgIGlmIChwQ29sdW1uUnVsZVdpZHRoID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVXaWR0aCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpICYmDQorICAgICAgICAgICAgcENvbHVtblJ1bGVDb2xvciA9PSBOVUxMKSB7DQorICAgICAgICAgIHBDb2x1bW5SdWxlQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKChGWF9BUkdCKWR3Q29sb3IpOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQorICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZVR5cGUpICYmDQorICAgICAgICAgICAgcENvbHVtblJ1bGVXaWR0aCA9PSBOVUxMKSB7DQorICAgICAgICAgIHBDb2x1bW5SdWxlV2lkdGggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0I6IHsNCisgICAgICAgIEZYX0FSR0IgZHdDb2xvcjsNCisgICAgICAgIGlmIChwQ29sdW1uUnVsZUNvbG9yID09IE5VTEwgJiYNCisgICAgICAgICAgICBGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICAgICAgICBwQ29sdW1uUnVsZUNvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKQ0KKyAgICAgICAgICAgICAgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgoRlhfQVJHQilkd0NvbG9yKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBDb2x1bW5SdWxlQ29sb3IgPT0gTlVMTCAmJiBwQ29sdW1uUnVsZVN0eWxlID09IE5VTEwgJiYNCisgICAgICBwQ29sdW1uUnVsZVdpZHRoID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBDb2x1bW5SdWxlU3R5bGUgPT0gTlVMTCkgew0KKyAgICBwQ29sdW1uUnVsZVN0eWxlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZSk7DQorICB9DQorICBpZiAocENvbHVtblJ1bGVXaWR0aCA9PSBOVUxMKSB7DQorICAgIHBDb2x1bW5SdWxlV2lkdGggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW0pOw0KKyAgfQ0KKyAgaWYgKHBDb2x1bW5SdWxlQ29sb3IgPT0gTlVMTCkgew0KKyAgICBwQ29sdW1uUnVsZUNvbG9yID0NCisgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgoRlhfQVJHQikwKTsNCisgIH0NCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgIHBDb2x1bW5SdWxlU3R5bGUsIGJJbXBvcnRhbnQpOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVXaWR0aCwgYkltcG9ydGFudCk7DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICBwQ29sdW1uUnVsZUNvbG9yLCBiSW1wb3J0YW50KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlVGV4dEVtcGhhc2lzUHJvcGVydHkoDQorICAgIEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnICcpOw0KKyAgQ0ZERV9DU1NWYWx1ZUFycmF5IGFyckVtcGhhc2lzU3R5bGU7DQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCisgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIHBFbXBoYXNpc0NvbG9yID0gTlVMTDsNCisgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0NCisgICAgICAgICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGlmIChwVmFsdWUgIT0gTlVMTCkgew0KKyAgICAgICAgICBhcnJFbXBoYXNpc1N0eWxlLkFkZChOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKSk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQorICAgICAgICAgIHBFbXBoYXNpc0NvbG9yID0NCisgICAgICAgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwc3pWYWx1ZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGFyckVtcGhhc2lzU3R5bGUuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsIHBzelZhbHVlKSk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjogew0KKyAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQorICAgICAgICAgIHBFbXBoYXNpc0NvbG9yID0NCisgICAgICAgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGFyckVtcGhhc2lzU3R5bGUuR2V0U2l6ZSgpICE9IDApIHsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgYXJyRW1waGFzaXNTdHlsZSksDQorICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgfQ0KKyAgaWYgKHBFbXBoYXNpc0NvbG9yICE9IE5VTEwpIHsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgIHBFbXBoYXNpc0NvbG9yLCBiSW1wb3J0YW50KTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ29sdW1uc1Byb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnICcpOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcENvbHVtbldpZHRoID0gTlVMTDsNCisgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIHBDb2x1bW5Db3VudCA9IE5VTEw7DQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCisgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0NCisgICAgICAgICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGlmIChwVmFsdWUgPT0gTlVMTCAmJiBwVmFsdWUtPmVOYW1lID09IEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG8pIHsNCisgICAgICAgICAgcENvbHVtbldpZHRoID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjogew0KKyAgICAgICAgRlhfRkxPQVQgZlZhbHVlOw0KKyAgICAgICAgaWYgKEZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KKyAgICAgICAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6DQorICAgICAgICAgICAgICBpZiAocENvbHVtbkNvdW50ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcENvbHVtbkNvdW50ID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBpZiAocENvbHVtbldpZHRoID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcENvbHVtbldpZHRoID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChwQ29sdW1uV2lkdGggPT0gTlVMTCAmJiBwQ29sdW1uQ291bnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9IGVsc2UgaWYgKHBDb2x1bW5XaWR0aCA9PSBOVUxMKSB7DQorICAgIHBDb2x1bW5XaWR0aCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG8pOw0KKyAgfSBlbHNlIGlmIChwQ29sdW1uQ291bnQgPT0gTlVMTCkgew0KKyAgICBwQ29sdW1uQ291bnQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvKTsNCisgIH0NCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0NvbHVtbldpZHRoLCBwQ29sdW1uV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0NvbHVtbkNvdW50LCBwQ29sdW1uQ291bnQsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlT3ZlcmZsb3dQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQpIHsNCisgIElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSA9IHBBcmdzLT5wU3RhdGljU3RvcmU7DQorICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCisgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIHBPdmVyZmxvd1ggPSBOVUxMOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcE92ZXJmbG93WSA9IE5VTEw7DQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCisgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nKSB7DQorICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwVmFsdWUgPQ0KKyAgICAgICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgew0KKyAgICAgICAgICBjYXNlIEZERV9DU1NPVkVSRkxPV19WaXNpYmxlOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NPVkVSRkxPV19IaWRkZW46DQorICAgICAgICAgIGNhc2UgRkRFX0NTU09WRVJGTE9XX1Njcm9sbDoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTT1ZFUkZMT1dfQXV0bzoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTT1ZFUkZMT1dfTm9EaXNwbGF5Og0KKyAgICAgICAgICBjYXNlIEZERV9DU1NPVkVSRkxPV19Ob0NvbnRlbnQ6DQorICAgICAgICAgICAgaWYgKHBPdmVyZmxvd1ggIT0gTlVMTCAmJiBwT3ZlcmZsb3dZICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBPdmVyZmxvd1ggPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgcE92ZXJmbG93WCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocE92ZXJmbG93WSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBwT3ZlcmZsb3dZID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBPdmVyZmxvd1ggPT0gTlVMTCAmJiBwT3ZlcmZsb3dZID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfSBlbHNlIGlmIChwT3ZlcmZsb3dZID09IE5VTEwpIHsNCisgICAgcE92ZXJmbG93WSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBPdmVyZmxvd1gtPkdldEVudW0oKSk7DQorICB9DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9PdmVyZmxvd1gsIHBPdmVyZmxvd1gsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WSwgcE92ZXJmbG93WSwNCisgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RlY2xhcmF0aW9uLmggYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkZWNsYXJhdGlvbi5oCmluZGV4IGM4YzgwY2MuLjM4ZmU3N2YgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RlY2xhcmF0aW9uLmgKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGVjbGFyYXRpb24uaApAQCAtOCw2MyArOCwxNDQgQEAKICNkZWZpbmUgX0ZERV9DU1NERUNMQVJBVElPTg0KICNpbmNsdWRlICJmZGVfY3NzZGF0YXRhYmxlLmgiDQogdHlwZWRlZiBzdHJ1Y3QgX0ZERV9DU1NQUk9QRVJUWUhPTERFUiA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCi0gICAgaW50MTZfdAkJCQkJCWVQcm9wZXJ0eTsNCi0gICAgaW50MTZfdAkJCQkJCWJJbXBvcnRhbnQ7DQotICAgIElGREVfQ1NTVmFsdWUJCQkJCSpwVmFsdWU7DQotICAgIF9GREVfQ1NTUFJPUEVSVFlIT0xERVIJCQkqcE5leHQ7DQorICBpbnQxNl90IGVQcm9wZXJ0eTsNCisgIGludDE2X3QgYkltcG9ydGFudDsNCisgIElGREVfQ1NTVmFsdWUqIHBWYWx1ZTsNCisgIF9GREVfQ1NTUFJPUEVSVFlIT0xERVIqIHBOZXh0Ow0KIH0gRkRFX0NTU1BST1BFUlRZSE9MREVSLCAqRkRFX0xQQ1NTUFJPUEVSVFlIT0xERVI7DQogdHlwZWRlZiBzdHJ1Y3QgX0ZERV9DU1NDVVNUT01QUk9QRVJUWSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCi0gICAgY29uc3QgRlhfV0NIQVIqCQkJCQkJcHdzTmFtZTsNCi0gICAgY29uc3QgRlhfV0NIQVIqCQkJCQkJcHdzVmFsdWU7DQotICAgIF9GREVfQ1NTQ1VTVE9NUFJPUEVSVFkJCQkqcE5leHQ7DQotfSBGREVfQ1NTQ1VTVE9NUFJPUEVSVFksICogRkRFX0xQQ1NTQ1VTVE9NUFJPUEVSVFk7DQorICBjb25zdCBGWF9XQ0hBUiogcHdzTmFtZTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwd3NWYWx1ZTsNCisgIF9GREVfQ1NTQ1VTVE9NUFJPUEVSVFkqIHBOZXh0Ow0KK30gRkRFX0NTU0NVU1RPTVBST1BFUlRZLCAqRkRFX0xQQ1NTQ1VTVE9NUFJPUEVSVFk7DQogdHlwZWRlZiBzdHJ1Y3QgX0ZERV9DU1NQUk9QRVJUWUFSR1MgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQotICAgIElGWF9NRU1BbGxvY2F0b3IJCSpwU3RhdGljU3RvcmU7DQotICAgIENGWF9NYXBQdHJUb1B0cgkJCSpwU3RyaW5nQ2FjaGU7DQotICAgIEZERV9MUENDU1NQUk9QRVJUWVRBQkxFCXBQcm9wZXJ0eTsNCisgIElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZTsNCisgIENGWF9NYXBQdHJUb1B0ciogcFN0cmluZ0NhY2hlOw0KKyAgRkRFX0xQQ0NTU1BST1BFUlRZVEFCTEUgcFByb3BlcnR5Ow0KIH0gRkRFX0NTU1BST1BFUlRZQVJHUzsNCi10eXBlZGVmIEZERV9DU1NQUk9QRVJUWUFSR1MgY29uc3QgKiBGREVfTFBDQ1NTUFJPUEVSVFlBUkdTOw0KLWNsYXNzIENGREVfQ1NTRGVjbGFyYXRpb24gOiBwdWJsaWMgSUZERV9DU1NEZWNsYXJhdGlvbiwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX0NTU0RlY2xhcmF0aW9uKCkgOiBtX3BGaXJzdFByb3BlcnR5KE5VTEwpLCBtX3BMYXN0UHJvcGVydHkoTlVMTCksIG1fcEZpcnN0Q3VzdG9tKE5VTEwpLCBtX3BMYXN0Q3VzdG9tKE5VTEwpIHsgfQ0KLSAgICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqCQkJR2V0UHJvcGVydHkoRkRFX0NTU1BST1BFUlRZIGVQcm9wZXJ0eSwgRlhfQk9PTCAmYkltcG9ydGFudCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfUE9TSVRJT04JCQkJR2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCUdldE5leHRQcm9wZXJ0eShGWF9QT1NJVElPTiAmcG9zLCBGREVfQ1NTUFJPUEVSVFkgJmVQcm9wZXJ0eSwgSUZERV9DU1NWYWx1ZSAqJnBWYWx1ZSwgRlhfQk9PTCAmYkltcG9ydGFudCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfUE9TSVRJT04JCQkJR2V0U3RhcnRDdXN0b20oKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlHZXROZXh0Q3VzdG9tKEZYX1BPU0lUSU9OICZwb3MsIENGWF9XaWRlU3RyaW5nICZ3c05hbWUsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKSBjb25zdDsNCi0gICAgRlhfQk9PTAkJCQkJCQlBZGRQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuKTsNCi0gICAgRlhfQk9PTAkJCQkJCQlBZGRQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwgaW50MzJfdCBpTmFtZUxlbiwgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbik7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9CT09MCQkJCQkJCVBhcnNlVGV4dEVtcGhhc2lzUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KTsNCi0gICAgRlhfQk9PTAkJCQkJCQlQYXJzZUNvbHVtbnNQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpOw0KLSAgICBGWF9CT09MCQkJCQkJCVBhcnNlQ29sdW1uUnVsZVByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwgaW50MzJfdCBpVmFsdWVMZW4sIEZYX0JPT0wgYkltcG9ydGFudCk7DQotICAgIEZYX0JPT0wJCQkJCQkJUGFyc2VPdmVyZmxvd1Byb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwgaW50MzJfdCBpVmFsdWVMZW4sIEZYX0JPT0wgYkltcG9ydGFudCk7DQotICAgIEZYX0JPT0wJCQkJCQkJUGFyc2VGb250UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KTsNCi0gICAgRlhfQk9PTAkJCQkJCQlQYXJzZUJhY2tncm91bmRQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpOw0KLSAgICBGWF9CT09MCQkJCQkJCVBhcnNlTGlzdFN0eWxlUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KTsNCi0gICAgRlhfQk9PTAkJCQkJCQlQYXJzZUJvcmRlclByb3BvZXJ0eShJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwgaW50MzJfdCBpVmFsdWVMZW4sDQotICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSAqJnBDb2xvciwgSUZERV9DU1NWYWx1ZSAqJnBTdHlsZSwgSUZERV9DU1NWYWx1ZSAqJnBXaWR0aCkgY29uc3Q7DQotICAgIHZvaWQJCQkJCQkJQWRkQm9yZGVyUHJvcGVydHkoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBJRkRFX0NTU1ZhbHVlICpwQ29sb3IsIElGREVfQ1NTVmFsdWUgKnBTdHlsZSwgSUZERV9DU1NWYWx1ZSAqcFdpZHRoLCBGWF9CT09MIGJJbXBvcnRhbnQsDQotICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZIGVDb2xvciwgRkRFX0NTU1BST1BFUlRZIGVTdHlsZSwgRkRFX0NTU1BST1BFUlRZIGVXaWR0aCk7DQotICAgIEZYX0JPT0wJCQkJCQkJUGFyc2VDb250ZW50UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KTsNCi0gICAgRlhfQk9PTAkJCQkJCQlQYXJzZUNvdW50ZXJQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuLCBGWF9CT09MIGJJbXBvcnRhbnQpOw0KLSAgICBGWF9CT09MCQkJCQkJCVBhcnNlVmFsdWVMaXN0UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbiwgRlhfQk9PTCBiSW1wb3J0YW50KTsNCi0gICAgRlhfQk9PTAkJCQkJCQlBZGQ0VmFsdWVzUHJvcGVydHkoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBjb25zdCBDRkRFX0NTU1ZhbHVlQXJyYXkgJmxpc3QsIEZYX0JPT0wgYkltcG9ydGFudCwNCi0gICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZUxlZnQsIEZERV9DU1NQUk9QRVJUWSBlVG9wLCBGREVfQ1NTUFJPUEVSVFkgZVJpZ2h0LCBGREVfQ1NTUFJPUEVSVFkgZUJvdHRvbSk7DQotICAgIElGREVfQ1NTVmFsdWUqCQkJCQlQYXJzZU51bWJlcihGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuKTsNCi0gICAgSUZERV9DU1NWYWx1ZSoJCQkJCVBhcnNlRW51bShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuKTsNCi0gICAgSUZERV9DU1NWYWx1ZSoJCQkJCVBhcnNlQ29sb3IoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbik7DQotICAgIElGREVfQ1NTVmFsdWUqCQkJCQlQYXJzZVVSSShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuKTsNCi0gICAgSUZERV9DU1NWYWx1ZSoJCQkJCVBhcnNlU3RyaW5nKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwgaW50MzJfdCBpVmFsdWVMZW4pOw0KLSAgICBJRkRFX0NTU1ZhbHVlKgkJCQkJUGFyc2VGdW5jdGlvbihGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLCBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuKTsNCi0gICAgY29uc3QgRlhfV0NIQVIqCQkJCQkJQ29weVRvTG9jYWwoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLCBpbnQzMl90IGlWYWx1ZUxlbik7DQotICAgIHZvaWQJCQkJCQkJQWRkUHJvcGVydHlIb2xkZXIoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LCBJRkRFX0NTU1ZhbHVlICpwVmFsdWUsIEZYX0JPT0wgYkltcG9ydGFudCk7DQotICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqCQkJTmV3TnVtYmVyVmFsdWUoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVW5pdCwgRlhfRkxPQVQgZlZhbHVlKSBjb25zdDsNCi0gICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSoJCQlOZXdFbnVtVmFsdWUoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIGNvbnN0Ow0KLSAgICBGREVfTFBDU1NQUk9QRVJUWUhPTERFUgkJCW1fcEZpcnN0UHJvcGVydHk7DQotICAgIEZERV9MUENTU1BST1BFUlRZSE9MREVSCQkJbV9wTGFzdFByb3BlcnR5Ow0KLSAgICBGREVfTFBDU1NDVVNUT01QUk9QRVJUWQkJCW1fcEZpcnN0Q3VzdG9tOw0KLSAgICBGREVfTFBDU1NDVVNUT01QUk9QRVJUWQkJCW1fcExhc3RDdXN0b207DQordHlwZWRlZiBGREVfQ1NTUFJPUEVSVFlBUkdTIGNvbnN0KiBGREVfTFBDQ1NTUFJPUEVSVFlBUkdTOw0KK2NsYXNzIENGREVfQ1NTRGVjbGFyYXRpb24gOiBwdWJsaWMgSUZERV9DU1NEZWNsYXJhdGlvbiwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0NTU0RlY2xhcmF0aW9uKCkNCisgICAgICA6IG1fcEZpcnN0UHJvcGVydHkoTlVMTCksDQorICAgICAgICBtX3BMYXN0UHJvcGVydHkoTlVMTCksDQorICAgICAgICBtX3BGaXJzdEN1c3RvbShOVUxMKSwNCisgICAgICAgIG1fcExhc3RDdXN0b20oTlVMTCkge30NCisgIHZpcnR1YWwgSUZERV9DU1NWYWx1ZSogR2V0UHJvcGVydHkoRkRFX0NTU1BST1BFUlRZIGVQcm9wZXJ0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkltcG9ydGFudCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX1BPU0lUSU9OIEdldFN0YXJ0UG9zaXRpb24oKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXROZXh0UHJvcGVydHkoRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZJiBlUHJvcGVydHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUqJiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJJbXBvcnRhbnQpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9QT1NJVElPTiBHZXRTdGFydEN1c3RvbSgpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldE5leHRDdXN0b20oRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgY29uc3Q7DQorICBGWF9CT09MIEFkZFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pOw0KKyAgRlhfQk9PTCBBZGRQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTmFtZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbik7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0JPT0wgUGFyc2VUZXh0RW1waGFzaXNQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQpOw0KKyAgRlhfQk9PTCBQYXJzZUNvbHVtbnNQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQpOw0KKyAgRlhfQk9PTCBQYXJzZUNvbHVtblJ1bGVQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQpOw0KKyAgRlhfQk9PTCBQYXJzZU92ZXJmbG93UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgIEZYX0JPT0wgUGFyc2VGb250UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgIEZYX0JPT0wgUGFyc2VCYWNrZ3JvdW5kUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgIEZYX0JPT0wgUGFyc2VMaXN0U3R5bGVQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQpOw0KKyAgRlhfQk9PTCBQYXJzZUJvcmRlclByb3BvZXJ0eShJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUqJiBwQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUqJiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUqJiBwV2lkdGgpIGNvbnN0Ow0KKyAgdm9pZCBBZGRCb3JkZXJQcm9wZXJ0eShJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUqIHBDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSogcFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZIGVDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZIGVTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZIGVXaWR0aCk7DQorICBGWF9CT09MIFBhcnNlQ29udGVudFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCk7DQorICBGWF9CT09MIFBhcnNlQ291bnRlclByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCk7DQorICBGWF9CT09MIFBhcnNlVmFsdWVMaXN0UHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgIEZYX0JPT0wgQWRkNFZhbHVlc1Byb3BlcnR5KElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGREVfQ1NTVmFsdWVBcnJheSYgbGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlVG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZIGVSaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlQm90dG9tKTsNCisgIElGREVfQ1NTVmFsdWUqIFBhcnNlTnVtYmVyKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbik7DQorICBJRkRFX0NTU1ZhbHVlKiBQYXJzZUVudW0oRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pOw0KKyAgSUZERV9DU1NWYWx1ZSogUGFyc2VDb2xvcihGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuKTsNCisgIElGREVfQ1NTVmFsdWUqIFBhcnNlVVJJKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbik7DQorICBJRkRFX0NTU1ZhbHVlKiBQYXJzZVN0cmluZyhGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pOw0KKyAgSUZERV9DU1NWYWx1ZSogUGFyc2VGdW5jdGlvbihGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBDb3B5VG9Mb2NhbChGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbik7DQorICB2b2lkIEFkZFByb3BlcnR5SG9sZGVyKElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZIGVQcm9wZXJ0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSogcFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQpOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogTmV3TnVtYmVyVmFsdWUoSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVVuaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmFsdWUpIGNvbnN0Ow0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogTmV3RW51bVZhbHVlKElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIGNvbnN0Ow0KKyAgRkRFX0xQQ1NTUFJPUEVSVFlIT0xERVIgbV9wRmlyc3RQcm9wZXJ0eTsNCisgIEZERV9MUENTU1BST1BFUlRZSE9MREVSIG1fcExhc3RQcm9wZXJ0eTsNCisgIEZERV9MUENTU0NVU1RPTVBST1BFUlRZIG1fcEZpcnN0Q3VzdG9tOw0KKyAgRkRFX0xQQ1NTQ1VTVE9NUFJPUEVSVFkgbV9wTGFzdEN1c3RvbTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2VsZWN0b3IuY3BwIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5jcHAKaW5kZXggNWJjYjlkYi4uY2U4MTE3YiAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5jcHAKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5jcHAKQEAgLTgsMTcwOCArOCwxNzk1IEBACiAjaW5jbHVkZSAiZmRlX2Nzc2NhY2hlLmgiDQogI2luY2x1ZGUgImZkZV9jc3NkZWNsYXJhdGlvbi5oIg0KICNpbmNsdWRlICJmZGVfY3Nzc3R5bGVzZWxlY3Rvci5oIg0KLWludDMyX3QgQ0ZERV9DU1NDb3VudGVyU3R5bGU6OkZpbmRJbmRleChjb25zdCBGWF9XQ0hBUiogcHN6SWRlbnRpZmllcikNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9hcnJDb3VudGVyRGF0YS5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICBpZiAoRlhTWVNfd2NzY21wKHBzeklkZW50aWZpZXIsIG1fYXJyQ291bnRlckRhdGEuRWxlbWVudEF0KGkpLm1fcHN6SWRlbnQpID09IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gaTsNCi0gICAgICAgIH0NCitpbnQzMl90IENGREVfQ1NTQ291bnRlclN0eWxlOjpGaW5kSW5kZXgoY29uc3QgRlhfV0NIQVIqIHBzeklkZW50aWZpZXIpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJDb3VudGVyRGF0YS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBpZiAoRlhTWVNfd2NzY21wKHBzeklkZW50aWZpZXIsIG1fYXJyQ291bnRlckRhdGEuRWxlbWVudEF0KGkpLm1fcHN6SWRlbnQpID09DQorICAgICAgICAwKSB7DQorICAgICAgcmV0dXJuIGk7DQogICAgIH0NCi0gICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgcmV0dXJuIC0xOw0KIH0NCi12b2lkIENGREVfQ1NTQ291bnRlclN0eWxlOjpEb1VwZGF0ZUluZGV4KElGREVfQ1NTVmFsdWVMaXN0ICpwTGlzdCkNCi17DQotICAgIGlmIChwTGlzdCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQordm9pZCBDRkRFX0NTU0NvdW50ZXJTdHlsZTo6RG9VcGRhdGVJbmRleChJRkRFX0NTU1ZhbHVlTGlzdCogcExpc3QpIHsNCisgIGlmIChwTGlzdCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gcExpc3QtPkNvdW50VmFsdWVzKCk7DQorICBGWF9GTE9BVCBmRGVmVmFsdWUgPSAxLjA7DQorICBGWF9CT09MIGJEZWZJbmNyZW1lbnQgPSBUUlVFOw0KKyAgaWYgKHBMaXN0ID09IG1fcENvdW50ZXJSZXNldCkgew0KKyAgICBmRGVmVmFsdWUgPSAwLjA7DQorICAgIGJEZWZJbmNyZW1lbnQgPSBGQUxTRTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIElGREVfQ1NTVmFsdWVMaXN0KiBwQ291bnRlciA9IChJRkRFX0NTU1ZhbHVlTGlzdCopcExpc3QtPkdldFZhbHVlKGkpOw0KKyAgICBpbnQzMl90IGlMZW47DQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pJZGVudGlmaWVyID0NCisgICAgICAgICgoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopKHBDb3VudGVyLT5HZXRWYWx1ZSgwKSkpLT5HZXRTdHJpbmcoaUxlbik7DQorICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IGZEZWZWYWx1ZTsNCisgICAgaWYgKHBDb3VudGVyLT5Db3VudFZhbHVlcygpID4gMSkgew0KKyAgICAgIGZWYWx1ZSA9ICgoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopKHBDb3VudGVyLT5HZXRWYWx1ZSgxKSkpLT5HZXRGbG9hdCgpOw0KICAgICB9DQotICAgIGludDMyX3QgaUNvdW50ID0gcExpc3QtPkNvdW50VmFsdWVzKCk7DQotICAgIEZYX0ZMT0FUIGZEZWZWYWx1ZSA9IDEuMDsNCi0gICAgRlhfQk9PTAliRGVmSW5jcmVtZW50ID0gVFJVRTsNCi0gICAgaWYgKHBMaXN0ID09IG1fcENvdW50ZXJSZXNldCkgew0KLSAgICAgICAgZkRlZlZhbHVlID0gMC4wOw0KLSAgICAgICAgYkRlZkluY3JlbWVudCA9IEZBTFNFOw0KLSAgICB9DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICBJRkRFX0NTU1ZhbHVlTGlzdCAqcENvdW50ZXIgPSAoSUZERV9DU1NWYWx1ZUxpc3QqKXBMaXN0LT5HZXRWYWx1ZShpKTsNCi0gICAgICAgIGludDMyX3QgaUxlbjsNCi0gICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pJZGVudGlmaWVyID0gKChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKikocENvdW50ZXItPkdldFZhbHVlKDApKSktPkdldFN0cmluZyhpTGVuKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IGZEZWZWYWx1ZTsNCi0gICAgICAgIGlmIChwQ291bnRlci0+Q291bnRWYWx1ZXMoKSA+IDEpIHsNCi0gICAgICAgICAgICBmVmFsdWUgPSAoKElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqKShwQ291bnRlci0+R2V0VmFsdWUoMSkpKS0+R2V0RmxvYXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaUluZGV4ID0gRmluZEluZGV4KHBzeklkZW50aWZpZXIpOw0KLSAgICAgICAgaWYgKGlJbmRleCA9PSAtMSkgew0KLSAgICAgICAgICAgIEZERV9DU1NDT1VOVEVSREFUQSBkYXRhOw0KLSAgICAgICAgICAgIGRhdGEubV9wc3pJZGVudCA9IHBzeklkZW50aWZpZXI7DQotICAgICAgICAgICAgaWYgKGJEZWZJbmNyZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgZGF0YS5tX2JJbmNyZW1lbnQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBkYXRhLm1faUluY1ZhbCA9IChpbnQzMl90KWZWYWx1ZTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBkYXRhLm1faVJlc2V0VmFsID0gKGludDMyX3QpZlZhbHVlOw0KLSAgICAgICAgICAgICAgICBkYXRhLm1fYlJlc2V0ID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9hcnJDb3VudGVyRGF0YS5BZGQoZGF0YSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZERV9DU1NDT1VOVEVSREFUQSAmZGF0YSA9IG1fYXJyQ291bnRlckRhdGEuRWxlbWVudEF0KGlJbmRleCk7DQotICAgICAgICAgICAgaWYgKGJEZWZJbmNyZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgZGF0YS5tX2JJbmNyZW1lbnQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBkYXRhLm1faUluY1ZhbCArPSAoaW50MzJfdClmVmFsdWU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZGF0YS5tX2JSZXNldCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGRhdGEubV9pUmVzZXRWYWwgPSAoaW50MzJfdClmVmFsdWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZERV9DU1NDb3VudGVyU3R5bGU6OlVwZGF0ZUluZGV4KCkNCi17DQotICAgIGlmICghbV9iSW5kZXhEaXJ0eSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIG1fYXJyQ291bnRlckRhdGEuUmVtb3ZlQWxsKCk7DQotICAgIERvVXBkYXRlSW5kZXgobV9wQ291bnRlckluYyk7DQotICAgIERvVXBkYXRlSW5kZXgobV9wQ291bnRlclJlc2V0KTsNCi0gICAgbV9iSW5kZXhEaXJ0eSA9IEZBTFNFOw0KLX0NCi1GREVfQ1NTVEVYVEVNUEhBU0lTTUFSSyBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OkdldFRleHRFbXBoYXNpc01hcmsoKSBjb25zdA0KLXsNCi0gICAgaWYgKG1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0RW1waGFzaXNNYXJrICE9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0F1dG8pIHsNCi0gICAgICAgIHJldHVybiAoRkRFX0NTU1RFWFRFTVBIQVNJU01BUkspbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRFbXBoYXNpc01hcms7DQotICAgIH0NCi0gICAgaWYgKG1fSW5oZXJpdGVkRGF0YS5tX2VXcml0aW5nTW9kZSA9PSBGREVfQ1NTV1JJVElOR01PREVfSG9yaXpvbnRhbFRiKSB7DQotICAgICAgICByZXR1cm4gRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfRG90Ow0KLSAgICB9DQotICAgIHJldHVybiBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19TZXNhbWU7DQotfQ0KLV9GREVfQ1NTUlVMRURBVEE6Ol9GREVfQ1NTUlVMRURBVEEoSUZERV9DU1NTZWxlY3RvciAqcFNlbCwgSUZERV9DU1NEZWNsYXJhdGlvbiAqcERlY2wsIEZYX0RXT1JEIGR3UG9zKQ0KLSAgICA6IHBTZWxlY3RvcihwU2VsKQ0KLSAgICAsIHBEZWNsYXJhdGlvbihwRGVjbCkNCi0gICAgLCBkd1ByaW9yaXR5KGR3UG9zKQ0KLSAgICAsIHBOZXh0KE5VTEwpDQotew0KLSAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgc19TcGVjaWZpY1s1XSA9IHsweDAwMDEwMDAwLCAweDAwMDEwMDAwLCAweDAwMTAwMDAwLCAweDAwMTAwMDAwLCAweDAxMDAwMDAwfTsNCi0gICAgZm9yICg7IHBTZWwgIT0gTlVMTDsgcFNlbCA9IHBTZWwtPkdldE5leHRTZWxlY3RvcigpKSB7DQotICAgICAgICBGREVfQ1NTU0VMRUNUT1JUWVBFIGVUeXBlID0gcFNlbC0+R2V0VHlwZSgpOw0KLSAgICAgICAgaWYgKGVUeXBlID4gRkRFX0NTU1NFTEVDVE9SVFlQRV9EZXNjZW5kYW50IHx8IHBTZWwtPkdldE5hbWVIYXNoKCkgIT0gRkRFX0NTU1VOSVZFUlNBTEhBU0gpIHsNCi0gICAgICAgICAgICBkd1ByaW9yaXR5ICs9IHNfU3BlY2lmaWNbZVR5cGVdOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbjo6Q2xlYXIoKQ0KLXsNCi0gICAgbV9JRFJ1bGVzLlJlbW92ZUFsbCgpOw0KLSAgICBtX1RhZ1J1bGVzLlJlbW92ZUFsbCgpOw0KLSAgICBtX0NsYXNzUnVsZXMuUmVtb3ZlQWxsKCk7DQotICAgIG1fcFVuaXZlcnNhbFJ1bGVzID0gTlVMTDsNCi0gICAgbV9wU3RhdGljU3RvcmUgPSBOVUxMOw0KLSAgICBtX2lTZWxlY3RvcnMgPSAwOw0KLX0NCi12b2lkIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkFkZFJ1bGVzRnJvbShjb25zdCBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheSAmc2hlZXRzLCBGWF9EV09SRCBkd01lZGlhTGlzdCwgSUZYX0ZvbnRNZ3IgKnBGb250TWdyKQ0KLXsNCi0gICAgaW50MzJfdCBpU2hlZXRzID0gc2hlZXRzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNoZWV0czsgKytpKSB7DQotICAgICAgICBJRkRFX0NTU1N0eWxlU2hlZXQgKnBTaGVldCA9IHNoZWV0cy5HZXRBdChpKTsNCi0gICAgICAgIGlmIChGWF9EV09SRCBkd01hdGNoTWVkaWEgPSBwU2hlZXQtPkdldE1lZGlhTGlzdCgpICYgZHdNZWRpYUxpc3QpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlSdWxlcyA9IHBTaGVldC0+Q291bnRSdWxlcygpOw0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlSdWxlczsgaisrKSB7DQotICAgICAgICAgICAgICAgIEFkZFJ1bGVzRnJvbShwU2hlZXQsIHBTaGVldC0+R2V0UnVsZShqKSwgZHdNYXRjaE1lZGlhLCBwRm9udE1ncik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbjo6QWRkUnVsZXNGcm9tKElGREVfQ1NTU3R5bGVTaGVldCAqcFN0eWxlU2hlZXQsIElGREVfQ1NTUnVsZSAqcFJ1bGUsIEZYX0RXT1JEIGR3TWVkaWFMaXN0LCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpDQotew0KLSAgICBzd2l0Y2ggKHBSdWxlLT5HZXRUeXBlKCkpIHsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1JVTEVUWVBFX1N0eWxlOiB7DQotICAgICAgICAgICAgICAgIElGREVfQ1NTU3R5bGVSdWxlICpwU3R5bGVSdWxlID0gKElGREVfQ1NTU3R5bGVSdWxlKilwUnVsZTsNCi0gICAgICAgICAgICAgICAgSUZERV9DU1NEZWNsYXJhdGlvbiAqcERlY2xhcmF0aW9uID0gcFN0eWxlUnVsZS0+R2V0RGVjbGFyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpU2VsZWN0b3JzID0gcFN0eWxlUnVsZS0+Q291bnRTZWxlY3Rvckxpc3RzKCk7DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTZWxlY3RvcnM7ICsraSkgew0KLSAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NTZWxlY3RvciAqcFNlbGVjdG9yID0gcFN0eWxlUnVsZS0+R2V0U2VsZWN0b3JMaXN0KGkpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTZWxlY3Rvci0+R2V0VHlwZSgpID09IEZERV9DU1NTRUxFQ1RPUlRZUEVfUGVyc3Vkbykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZERV9MUENTU1JVTEVEQVRBIHBEYXRhID0gTmV3UnVsZURhdGEocFNlbGVjdG9yLCBwRGVjbGFyYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJ1bGVUbyhtX3BQZXJzdWRvUnVsZXMsIHBEYXRhKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChwU2VsZWN0b3ItPkdldE5hbWVIYXNoKCkgIT0gRkRFX0NTU1VOSVZFUlNBTEhBU0gpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBBZGRSdWxlVG8obV9UYWdSdWxlcywgcFNlbGVjdG9yLT5HZXROYW1lSGFzaCgpLCBwU2VsZWN0b3IsIHBEZWNsYXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1NlbGVjdG9yICpwTmV4dCA9IHBTZWxlY3Rvci0+R2V0TmV4dFNlbGVjdG9yKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAocE5leHQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZERV9MUENTU1JVTEVEQVRBIHBEYXRhID0gTmV3UnVsZURhdGEocFNlbGVjdG9yLCBwRGVjbGFyYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJ1bGVUbyhtX3BVbml2ZXJzYWxSdWxlcywgcERhdGEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwTmV4dC0+R2V0VHlwZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTU0VMRUNUT1JUWVBFX0lEOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRSdWxlVG8obV9JRFJ1bGVzLCBwTmV4dC0+R2V0TmFtZUhhc2goKSwgcFNlbGVjdG9yLCBwRGVjbGFyYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfQ2xhc3M6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJ1bGVUbyhtX0NsYXNzUnVsZXMsIHBOZXh0LT5HZXROYW1lSGFzaCgpLCBwU2VsZWN0b3IsIHBEZWNsYXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9EZXNjZW5kYW50Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9FbGVtZW50Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRSdWxlVG8obV9wVW5pdmVyc2FsUnVsZXMsIE5ld1J1bGVEYXRhKHBTZWxlY3RvciwgcERlY2xhcmF0aW9uKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUlVMRVRZUEVfTWVkaWE6IHsNCi0gICAgICAgICAgICAgICAgSUZERV9DU1NNZWRpYVJ1bGUgKnBNZWRpYVJ1bGUgPSAoSUZERV9DU1NNZWRpYVJ1bGUqKXBSdWxlOw0KLSAgICAgICAgICAgICAgICBpZiAocE1lZGlhUnVsZS0+R2V0TWVkaWFMaXN0KCkgJiBkd01lZGlhTGlzdCkgew0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUnVsZXMgPSBwTWVkaWFSdWxlLT5Db3VudFJ1bGVzKCk7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpUnVsZXM7ICsraSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJ1bGVzRnJvbShwU3R5bGVTaGVldCwgcE1lZGlhUnVsZS0+R2V0UnVsZShpKSwgZHdNZWRpYUxpc3QsIHBGb250TWdyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi19DQotdm9pZCBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uOjpBZGRSdWxlVG8oQ0ZYX01hcFB0clRvUHRyICZtYXAsIEZYX0RXT1JEIGR3S2V5LCBJRkRFX0NTU1NlbGVjdG9yICpwU2VsLCBJRkRFX0NTU0RlY2xhcmF0aW9uICpwRGVjbCkNCi17DQotICAgIHZvaWQqIHBLZXkgPSAodm9pZCopKHVpbnRwdHJfdClkd0tleTsNCi0gICAgRkRFX0xQQ1NTUlVMRURBVEEgcERhdGEgPSBOZXdSdWxlRGF0YShwU2VsLCBwRGVjbCk7DQotICAgIEZERV9MUENTU1JVTEVEQVRBIHBMaXN0ID0gTlVMTDsNCi0gICAgaWYgKCFtYXAuTG9va3VwKHBLZXksICh2b2lkKiYpcExpc3QpKSB7DQotICAgICAgICBtYXAuU2V0QXQocEtleSwgcERhdGEpOw0KLSAgICB9IGVsc2UgaWYgKEFkZFJ1bGVUbyhwTGlzdCwgcERhdGEpKSB7DQotICAgICAgICBtYXAuU2V0QXQocEtleSwgcExpc3QpOw0KLSAgICB9DQotfQ0KLWlubGluZSBGWF9CT09MIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkFkZFJ1bGVUbyhGREVfTFBDU1NSVUxFREFUQSAmcExpc3QsIEZERV9MUENTU1JVTEVEQVRBIHBEYXRhKQ0KLXsNCi0gICAgaWYgKHBMaXN0ID09IE5VTEwpIHsNCi0gICAgICAgIHBMaXN0ID0gcERhdGE7DQotICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgaW50MzJfdCBpSW5kZXggPSBGaW5kSW5kZXgocHN6SWRlbnRpZmllcik7DQorICAgIGlmIChpSW5kZXggPT0gLTEpIHsNCisgICAgICBGREVfQ1NTQ09VTlRFUkRBVEEgZGF0YTsNCisgICAgICBkYXRhLm1fcHN6SWRlbnQgPSBwc3pJZGVudGlmaWVyOw0KKyAgICAgIGlmIChiRGVmSW5jcmVtZW50KSB7DQorICAgICAgICBkYXRhLm1fYkluY3JlbWVudCA9IFRSVUU7DQorICAgICAgICBkYXRhLm1faUluY1ZhbCA9IChpbnQzMl90KWZWYWx1ZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZGF0YS5tX2lSZXNldFZhbCA9IChpbnQzMl90KWZWYWx1ZTsNCisgICAgICAgIGRhdGEubV9iUmVzZXQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBtX2FyckNvdW50ZXJEYXRhLkFkZChkYXRhKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIHBEYXRhLT5wTmV4dCA9IHBMaXN0LT5wTmV4dDsNCi0gICAgICAgIHBMaXN0LT5wTmV4dCA9IHBEYXRhOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIEZERV9DU1NDT1VOVEVSREFUQSYgZGF0YSA9IG1fYXJyQ291bnRlckRhdGEuRWxlbWVudEF0KGlJbmRleCk7DQorICAgICAgaWYgKGJEZWZJbmNyZW1lbnQpIHsNCisgICAgICAgIGRhdGEubV9iSW5jcmVtZW50ID0gVFJVRTsNCisgICAgICAgIGRhdGEubV9pSW5jVmFsICs9IChpbnQzMl90KWZWYWx1ZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZGF0YS5tX2JSZXNldCA9IFRSVUU7DQorICAgICAgICBkYXRhLm1faVJlc2V0VmFsID0gKGludDMyX3QpZlZhbHVlOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfQ0KIH0NCi1pbmxpbmUgRkRFX0xQQ1NTUlVMRURBVEEgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbjo6TmV3UnVsZURhdGEoSUZERV9DU1NTZWxlY3RvciAqcFNlbCwgSUZERV9DU1NEZWNsYXJhdGlvbiAqcERlY2wpDQotew0KLSAgICByZXR1cm4gRkRFX05ld1dpdGgobV9wU3RhdGljU3RvcmUpIEZERV9DU1NSVUxFREFUQShwU2VsLCBwRGVjbCwgKyttX2lTZWxlY3RvcnMpOw0KK3ZvaWQgQ0ZERV9DU1NDb3VudGVyU3R5bGU6OlVwZGF0ZUluZGV4KCkgew0KKyAgaWYgKCFtX2JJbmRleERpcnR5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fYXJyQ291bnRlckRhdGEuUmVtb3ZlQWxsKCk7DQorICBEb1VwZGF0ZUluZGV4KG1fcENvdW50ZXJJbmMpOw0KKyAgRG9VcGRhdGVJbmRleChtX3BDb3VudGVyUmVzZXQpOw0KKyAgbV9iSW5kZXhEaXJ0eSA9IEZBTFNFOw0KIH0NCi1JRkRFX0NTU1N0eWxlU2VsZWN0b3IqIElGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBuZXcgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOw0KK0ZERV9DU1NURVhURU1QSEFTSVNNQVJLIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0VGV4dEVtcGhhc2lzTWFyaygpIGNvbnN0IHsNCisgIGlmIChtX0luaGVyaXRlZERhdGEubV9lVGV4dEVtcGhhc2lzTWFyayAhPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19BdXRvKSB7DQorICAgIHJldHVybiAoRkRFX0NTU1RFWFRFTVBIQVNJU01BUkspbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRFbXBoYXNpc01hcms7DQorICB9DQorICBpZiAobV9Jbmhlcml0ZWREYXRhLm1fZVdyaXRpbmdNb2RlID09IEZERV9DU1NXUklUSU5HTU9ERV9Ib3Jpem9udGFsVGIpIHsNCisgICAgcmV0dXJuIEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0RvdDsNCisgIH0NCisgIHJldHVybiBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19TZXNhbWU7DQorfQ0KK19GREVfQ1NTUlVMRURBVEE6Ol9GREVfQ1NTUlVMRURBVEEoSUZERV9DU1NTZWxlY3RvciogcFNlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQb3MpDQorICAgIDogcFNlbGVjdG9yKHBTZWwpLCBwRGVjbGFyYXRpb24ocERlY2wpLCBkd1ByaW9yaXR5KGR3UG9zKSwgcE5leHQoTlVMTCkgew0KKyAgc3RhdGljIGNvbnN0IEZYX0RXT1JEIHNfU3BlY2lmaWNbNV0gPSB7MHgwMDAxMDAwMCwgMHgwMDAxMDAwMCwgMHgwMDEwMDAwMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAsIDB4MDEwMDAwMDB9Ow0KKyAgZm9yICg7IHBTZWwgIT0gTlVMTDsgcFNlbCA9IHBTZWwtPkdldE5leHRTZWxlY3RvcigpKSB7DQorICAgIEZERV9DU1NTRUxFQ1RPUlRZUEUgZVR5cGUgPSBwU2VsLT5HZXRUeXBlKCk7DQorICAgIGlmIChlVHlwZSA+IEZERV9DU1NTRUxFQ1RPUlRZUEVfRGVzY2VuZGFudCB8fA0KKyAgICAgICAgcFNlbC0+R2V0TmFtZUhhc2goKSAhPSBGREVfQ1NTVU5JVkVSU0FMSEFTSCkgew0KKyAgICAgIGR3UHJpb3JpdHkgKz0gc19TcGVjaWZpY1tlVHlwZV07DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uOjpDbGVhcigpIHsNCisgIG1fSURSdWxlcy5SZW1vdmVBbGwoKTsNCisgIG1fVGFnUnVsZXMuUmVtb3ZlQWxsKCk7DQorICBtX0NsYXNzUnVsZXMuUmVtb3ZlQWxsKCk7DQorICBtX3BVbml2ZXJzYWxSdWxlcyA9IE5VTEw7DQorICBtX3BTdGF0aWNTdG9yZSA9IE5VTEw7DQorICBtX2lTZWxlY3RvcnMgPSAwOw0KK30NCit2b2lkIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkFkZFJ1bGVzRnJvbShjb25zdCBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheSYgc2hlZXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TWVkaWFMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyKiBwRm9udE1ncikgew0KKyAgaW50MzJfdCBpU2hlZXRzID0gc2hlZXRzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaGVldHM7ICsraSkgew0KKyAgICBJRkRFX0NTU1N0eWxlU2hlZXQqIHBTaGVldCA9IHNoZWV0cy5HZXRBdChpKTsNCisgICAgaWYgKEZYX0RXT1JEIGR3TWF0Y2hNZWRpYSA9IHBTaGVldC0+R2V0TWVkaWFMaXN0KCkgJiBkd01lZGlhTGlzdCkgew0KKyAgICAgIGludDMyX3QgaVJ1bGVzID0gcFNoZWV0LT5Db3VudFJ1bGVzKCk7DQorICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVJ1bGVzOyBqKyspIHsNCisgICAgICAgIEFkZFJ1bGVzRnJvbShwU2hlZXQsIHBTaGVldC0+R2V0UnVsZShqKSwgZHdNYXRjaE1lZGlhLCBwRm9udE1ncik7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbjo6QWRkUnVsZXNGcm9tKElGREVfQ1NTU3R5bGVTaGVldCogcFN0eWxlU2hlZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NSdWxlKiBwUnVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd01lZGlhTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IpIHsNCisgIHN3aXRjaCAocFJ1bGUtPkdldFR5cGUoKSkgew0KKyAgICBjYXNlIEZERV9DU1NSVUxFVFlQRV9TdHlsZTogew0KKyAgICAgIElGREVfQ1NTU3R5bGVSdWxlKiBwU3R5bGVSdWxlID0gKElGREVfQ1NTU3R5bGVSdWxlKilwUnVsZTsNCisgICAgICBJRkRFX0NTU0RlY2xhcmF0aW9uKiBwRGVjbGFyYXRpb24gPSBwU3R5bGVSdWxlLT5HZXREZWNsYXJhdGlvbigpOw0KKyAgICAgIGludDMyX3QgaVNlbGVjdG9ycyA9IHBTdHlsZVJ1bGUtPkNvdW50U2VsZWN0b3JMaXN0cygpOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTZWxlY3RvcnM7ICsraSkgew0KKyAgICAgICAgSUZERV9DU1NTZWxlY3RvciogcFNlbGVjdG9yID0gcFN0eWxlUnVsZS0+R2V0U2VsZWN0b3JMaXN0KGkpOw0KKyAgICAgICAgaWYgKHBTZWxlY3Rvci0+R2V0VHlwZSgpID09IEZERV9DU1NTRUxFQ1RPUlRZUEVfUGVyc3Vkbykgew0KKyAgICAgICAgICBGREVfTFBDU1NSVUxFREFUQSBwRGF0YSA9IE5ld1J1bGVEYXRhKHBTZWxlY3RvciwgcERlY2xhcmF0aW9uKTsNCisgICAgICAgICAgQWRkUnVsZVRvKG1fcFBlcnN1ZG9SdWxlcywgcERhdGEpOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwU2VsZWN0b3ItPkdldE5hbWVIYXNoKCkgIT0gRkRFX0NTU1VOSVZFUlNBTEhBU0gpIHsNCisgICAgICAgICAgQWRkUnVsZVRvKG1fVGFnUnVsZXMsIHBTZWxlY3Rvci0+R2V0TmFtZUhhc2goKSwgcFNlbGVjdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgcERlY2xhcmF0aW9uKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBJRkRFX0NTU1NlbGVjdG9yKiBwTmV4dCA9IHBTZWxlY3Rvci0+R2V0TmV4dFNlbGVjdG9yKCk7DQorICAgICAgICBpZiAocE5leHQgPT0gTlVMTCkgew0KKyAgICAgICAgICBGREVfTFBDU1NSVUxFREFUQSBwRGF0YSA9IE5ld1J1bGVEYXRhKHBTZWxlY3RvciwgcERlY2xhcmF0aW9uKTsNCisgICAgICAgICAgQWRkUnVsZVRvKG1fcFVuaXZlcnNhbFJ1bGVzLCBwRGF0YSk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoIChwTmV4dC0+R2V0VHlwZSgpKSB7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9JRDoNCisgICAgICAgICAgICBBZGRSdWxlVG8obV9JRFJ1bGVzLCBwTmV4dC0+R2V0TmFtZUhhc2goKSwgcFNlbGVjdG9yLCBwRGVjbGFyYXRpb24pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfQ2xhc3M6DQorICAgICAgICAgICAgQWRkUnVsZVRvKG1fQ2xhc3NSdWxlcywgcE5leHQtPkdldE5hbWVIYXNoKCksIHBTZWxlY3RvciwNCisgICAgICAgICAgICAgICAgICAgICAgcERlY2xhcmF0aW9uKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSBGREVfQ1NTU0VMRUNUT1JUWVBFX0Rlc2NlbmRhbnQ6DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9FbGVtZW50Og0KKyAgICAgICAgICAgIEFkZFJ1bGVUbyhtX3BVbml2ZXJzYWxSdWxlcywgTmV3UnVsZURhdGEocFNlbGVjdG9yLCBwRGVjbGFyYXRpb24pKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfQ1NTUlVMRVRZUEVfTWVkaWE6IHsNCisgICAgICBJRkRFX0NTU01lZGlhUnVsZSogcE1lZGlhUnVsZSA9IChJRkRFX0NTU01lZGlhUnVsZSopcFJ1bGU7DQorICAgICAgaWYgKHBNZWRpYVJ1bGUtPkdldE1lZGlhTGlzdCgpICYgZHdNZWRpYUxpc3QpIHsNCisgICAgICAgIGludDMyX3QgaVJ1bGVzID0gcE1lZGlhUnVsZS0+Q291bnRSdWxlcygpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVJ1bGVzOyArK2kpIHsNCisgICAgICAgICAgQWRkUnVsZXNGcm9tKHBTdHlsZVNoZWV0LCBwTWVkaWFSdWxlLT5HZXRSdWxlKGkpLCBkd01lZGlhTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgIHBGb250TWdyKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbjo6QWRkUnVsZVRvKENGWF9NYXBQdHJUb1B0ciYgbWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3S2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTU2VsZWN0b3IqIHBTZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NEZWNsYXJhdGlvbiogcERlY2wpIHsNCisgIHZvaWQqIHBLZXkgPSAodm9pZCopKHVpbnRwdHJfdClkd0tleTsNCisgIEZERV9MUENTU1JVTEVEQVRBIHBEYXRhID0gTmV3UnVsZURhdGEocFNlbCwgcERlY2wpOw0KKyAgRkRFX0xQQ1NTUlVMRURBVEEgcExpc3QgPSBOVUxMOw0KKyAgaWYgKCFtYXAuTG9va3VwKHBLZXksICh2b2lkKiYpcExpc3QpKSB7DQorICAgIG1hcC5TZXRBdChwS2V5LCBwRGF0YSk7DQorICB9IGVsc2UgaWYgKEFkZFJ1bGVUbyhwTGlzdCwgcERhdGEpKSB7DQorICAgIG1hcC5TZXRBdChwS2V5LCBwTGlzdCk7DQorICB9DQorfQ0KK2lubGluZSBGWF9CT09MIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkFkZFJ1bGVUbyhGREVfTFBDU1NSVUxFREFUQSYgcExpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9MUENTU1JVTEVEQVRBIHBEYXRhKSB7DQorICBpZiAocExpc3QgPT0gTlVMTCkgew0KKyAgICBwTGlzdCA9IHBEYXRhOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0gZWxzZSB7DQorICAgIHBEYXRhLT5wTmV4dCA9IHBMaXN0LT5wTmV4dDsNCisgICAgcExpc3QtPnBOZXh0ID0gcERhdGE7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCit9DQoraW5saW5lIEZERV9MUENTU1JVTEVEQVRBIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246Ok5ld1J1bGVEYXRhKA0KKyAgICBJRkRFX0NTU1NlbGVjdG9yKiBwU2VsLA0KKyAgICBJRkRFX0NTU0RlY2xhcmF0aW9uKiBwRGVjbCkgew0KKyAgcmV0dXJuIEZERV9OZXdXaXRoKG1fcFN0YXRpY1N0b3JlKQ0KKyAgICAgIEZERV9DU1NSVUxFREFUQShwU2VsLCBwRGVjbCwgKyttX2lTZWxlY3RvcnMpOw0KK30NCitJRkRFX0NTU1N0eWxlU2VsZWN0b3IqIElGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRkRFX0NTU1N0eWxlU2VsZWN0b3I7DQogfQ0KIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q0ZERV9DU1NTdHlsZVNlbGVjdG9yKCkNCi0gICAgOiBtX3BGb250TWdyKE5VTEwpDQotICAgICwgbV9mRGVmRm9udFNpemUoMTIuMGYpDQotICAgICwgbV9wUnVsZURhdGFTdG9yZShOVUxMKQ0KLSAgICAsIG1fcElubGluZVN0eWxlU3RvcmUoTlVMTCkNCi0gICAgLCBtX3BGaXhlZFN0eWxlU3RvcmUoTlVMTCkNCi0gICAgLCBtX3BBY2NlbGVyYXRvcihOVUxMKQ0KLXsNCi0gICAgbV9lUHJpb3JpdGllc1tGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZX0hpZ2hdID0gRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9BdXRob3I7DQotICAgIG1fZVByaW9yaXRpZXNbRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9NaWRdID0gRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9Vc2VyOw0KLSAgICBtX2VQcmlvcml0aWVzW0ZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfTG93XSA9IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfVXNlckFnZW50Ow0KKyAgICA6IG1fcEZvbnRNZ3IoTlVMTCksDQorICAgICAgbV9mRGVmRm9udFNpemUoMTIuMGYpLA0KKyAgICAgIG1fcFJ1bGVEYXRhU3RvcmUoTlVMTCksDQorICAgICAgbV9wSW5saW5lU3R5bGVTdG9yZShOVUxMKSwNCisgICAgICBtX3BGaXhlZFN0eWxlU3RvcmUoTlVMTCksDQorICAgICAgbV9wQWNjZWxlcmF0b3IoTlVMTCkgew0KKyAgbV9lUHJpb3JpdGllc1tGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZX0hpZ2hdID0gRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9BdXRob3I7DQorICBtX2VQcmlvcml0aWVzW0ZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfTWlkXSA9IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfVXNlcjsNCisgIG1fZVByaW9yaXRpZXNbRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9Mb3ddID0NCisgICAgICBGREVfQ1NTU1RZTEVTSEVFVEdST1VQX1VzZXJBZ2VudDsNCiB9DQotQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjp+Q0ZERV9DU1NTdHlsZVNlbGVjdG9yKCkNCi17DQotICAgIFJlc2V0KCk7DQotICAgIGlmIChtX3BJbmxpbmVTdHlsZVN0b3JlICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcElubGluZVN0eWxlU3RvcmUtPlJlbGVhc2UoKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wRml4ZWRTdHlsZVN0b3JlICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcEZpeGVkU3R5bGVTdG9yZS0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIGlmIChtX3BBY2NlbGVyYXRvciAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgbV9wQWNjZWxlcmF0b3I7DQotICAgIH0NCitDRkRFX0NTU1N0eWxlU2VsZWN0b3I6On5DRkRFX0NTU1N0eWxlU2VsZWN0b3IoKSB7DQorICBSZXNldCgpOw0KKyAgaWYgKG1fcElubGluZVN0eWxlU3RvcmUgIT0gTlVMTCkgew0KKyAgICBtX3BJbmxpbmVTdHlsZVN0b3JlLT5SZWxlYXNlKCk7DQorICB9DQorICBpZiAobV9wRml4ZWRTdHlsZVN0b3JlICE9IE5VTEwpIHsNCisgICAgbV9wRml4ZWRTdHlsZVN0b3JlLT5SZWxlYXNlKCk7DQorICB9DQorICBpZiAobV9wQWNjZWxlcmF0b3IgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9wQWNjZWxlcmF0b3I7DQorICB9DQogfQ0KLXZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpTZXRGb250TWdyKElGWF9Gb250TWdyICpwRm9udE1ncikNCi17DQotICAgIG1fcEZvbnRNZ3IgPSBwRm9udE1ncjsNCit2b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6U2V0Rm9udE1ncihJRlhfRm9udE1nciogcEZvbnRNZ3IpIHsNCisgIG1fcEZvbnRNZ3IgPSBwRm9udE1ncjsNCiB9DQotdm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlNldERlZkZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChmRm9udFNpemUgPiAwKTsNCi0gICAgbV9mRGVmRm9udFNpemUgPSBmRm9udFNpemU7DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlNldERlZkZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KGZGb250U2l6ZSA+IDApOw0KKyAgbV9mRGVmRm9udFNpemUgPSBmRm9udFNpemU7DQogfQ0KLUlGREVfQ1NTQWNjZWxlcmF0b3IqIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6SW5pdEFjY2VsZXJhdG9yKCkNCi17DQotICAgIGlmIChtX3BBY2NlbGVyYXRvciA9PSBOVUxMKSB7DQotICAgICAgICBtX3BBY2NlbGVyYXRvciA9IG5ldyBDRkRFX0NTU0FjY2VsZXJhdG9yOw0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fcEFjY2VsZXJhdG9yICE9IE5VTEwpOw0KLSAgICB9DQotICAgIG1fcEFjY2VsZXJhdG9yLT5DbGVhcigpOw0KLSAgICByZXR1cm4gbV9wQWNjZWxlcmF0b3I7DQorSUZERV9DU1NBY2NlbGVyYXRvciogQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpJbml0QWNjZWxlcmF0b3IoKSB7DQorICBpZiAobV9wQWNjZWxlcmF0b3IgPT0gTlVMTCkgew0KKyAgICBtX3BBY2NlbGVyYXRvciA9IG5ldyBDRkRFX0NTU0FjY2VsZXJhdG9yOw0KKyAgICBGWFNZU19hc3NlcnQobV9wQWNjZWxlcmF0b3IgIT0gTlVMTCk7DQorICB9DQorICBtX3BBY2NlbGVyYXRvci0+Q2xlYXIoKTsNCisgIHJldHVybiBtX3BBY2NlbGVyYXRvcjsNCiB9DQotSUZERV9DU1NDb21wdXRlZFN0eWxlKiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OkNyZWF0ZUNvbXB1dGVkU3R5bGUoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwUGFyZW50U3R5bGUpDQotew0KLSAgICBpZiAobV9wRml4ZWRTdHlsZVN0b3JlID09IE5VTEwpIHsNCi0gICAgICAgIG1fcEZpeGVkU3R5bGVTdG9yZSA9IEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfRml4ZWQsIDE2LCBzaXplb2YoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKSk7DQotICAgICAgICBGWFNZU19hc3NlcnQobV9wRml4ZWRTdHlsZVN0b3JlICE9IE5VTEwpOw0KLSAgICB9DQotICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlID0gRkRFX05ld1dpdGgobV9wRml4ZWRTdHlsZVN0b3JlKSBDRkRFX0NTU0NvbXB1dGVkU3R5bGUobV9wRml4ZWRTdHlsZVN0b3JlKTsNCi0gICAgaWYgKHBQYXJlbnRTdHlsZSkgew0KLSAgICAgICAgcFN0eWxlLT5tX0luaGVyaXRlZERhdGEgPSAoKENGREVfQ1NTQ29tcHV0ZWRTdHlsZSopcFBhcmVudFN0eWxlKS0+bV9Jbmhlcml0ZWREYXRhOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcFN0eWxlLT5tX0luaGVyaXRlZERhdGEuUmVzZXQoKTsNCi0gICAgfQ0KLSAgICBwU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5SZXNldCgpOw0KLSAgICByZXR1cm4gcFN0eWxlOw0KK0lGREVfQ1NTQ29tcHV0ZWRTdHlsZSogQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpDcmVhdGVDb21wdXRlZFN0eWxlKA0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSkgew0KKyAgaWYgKG1fcEZpeGVkU3R5bGVTdG9yZSA9PSBOVUxMKSB7DQorICAgIG1fcEZpeGVkU3R5bGVTdG9yZSA9IEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfRml4ZWQsIDE2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENGREVfQ1NTQ29tcHV0ZWRTdHlsZSkpOw0KKyAgICBGWFNZU19hc3NlcnQobV9wRml4ZWRTdHlsZVN0b3JlICE9IE5VTEwpOw0KKyAgfQ0KKyAgQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUgPQ0KKyAgICAgIEZERV9OZXdXaXRoKG1fcEZpeGVkU3R5bGVTdG9yZSkgQ0ZERV9DU1NDb21wdXRlZFN0eWxlKG1fcEZpeGVkU3R5bGVTdG9yZSk7DQorICBpZiAocFBhcmVudFN0eWxlKSB7DQorICAgIHBTdHlsZS0+bV9Jbmhlcml0ZWREYXRhID0NCisgICAgICAgICgoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKilwUGFyZW50U3R5bGUpLT5tX0luaGVyaXRlZERhdGE7DQorICB9IGVsc2Ugew0KKyAgICBwU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5SZXNldCgpOw0KKyAgfQ0KKyAgcFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEuUmVzZXQoKTsNCisgIHJldHVybiBwU3R5bGU7DQogfQ0KLUZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpTZXRTdHlsZVNoZWV0KEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsIElGREVfQ1NTU3R5bGVTaGVldCAqcFNoZWV0KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KGVUeXBlIDwgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9NQVgpOw0KLSAgICBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheSAmZGVzdCA9IG1fU2hlZXRHcm91cHNbZVR5cGVdOw0KK0ZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpTZXRTdHlsZVNoZWV0KEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NTdHlsZVNoZWV0KiBwU2hlZXQpIHsNCisgIEZYU1lTX2Fzc2VydChlVHlwZSA8IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfTUFYKTsNCisgIENGREVfQ1NTU3R5bGVTaGVldEFycmF5JiBkZXN0ID0gbV9TaGVldEdyb3Vwc1tlVHlwZV07DQorICBkZXN0LlJlbW92ZUF0KDAsIGRlc3QuR2V0U2l6ZSgpKTsNCisgIGlmIChwU2hlZXQgIT0gTlVMTCkgew0KKyAgICBkZXN0LkFkZChwU2hlZXQpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpTZXRTdHlsZVNoZWV0cygNCisgICAgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlVHlwZSwNCisgICAgY29uc3QgQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXkqIHBBcnJheSkgew0KKyAgRlhTWVNfYXNzZXJ0KGVUeXBlIDwgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9NQVgpOw0KKyAgQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXkmIGRlc3QgPSBtX1NoZWV0R3JvdXBzW2VUeXBlXTsNCisgIGlmIChwQXJyYXkgPT0gTlVMTCkgew0KICAgICBkZXN0LlJlbW92ZUF0KDAsIGRlc3QuR2V0U2l6ZSgpKTsNCi0gICAgaWYgKHBTaGVldCAhPSBOVUxMKSB7DQotICAgICAgICBkZXN0LkFkZChwU2hlZXQpOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgfSBlbHNlIHsNCisgICAgZGVzdC5Db3B5KCpwQXJyYXkpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpTZXRTdHlsZVNoZWV0cyhGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLCBjb25zdCBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheSAqcEFycmF5KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KGVUeXBlIDwgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9NQVgpOw0KLSAgICBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheSAmZGVzdCA9IG1fU2hlZXRHcm91cHNbZVR5cGVdOw0KLSAgICBpZiAocEFycmF5ID09IE5VTEwpIHsNCi0gICAgICAgIGRlc3QuUmVtb3ZlQXQoMCwgZGVzdC5HZXRTaXplKCkpOw0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpTZXRTdHlsZVByaW9yaXR5KA0KKyAgICBGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLA0KKyAgICBGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZIGVQcmlvcml0eSkgew0KKyAgbV9lUHJpb3JpdGllc1tlUHJpb3JpdHldID0gZVR5cGU7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpVcGRhdGVTdHlsZUluZGV4KEZYX0RXT1JEIGR3TWVkaWFMaXN0KSB7DQorICBSZXNldCgpOw0KKyAgbV9wUnVsZURhdGFTdG9yZSA9IEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfU3RhdGljLCAxMDI0LCAwKTsNCisgIEZYU1lTX2Fzc2VydChtX3BSdWxlRGF0YVN0b3JlICE9IE5VTEwpOw0KKyAgZm9yIChpbnQzMl90IGlHcm91cCA9IDA7IGlHcm91cCA8IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfTUFYOyArK2lHcm91cCkgew0KKyAgICBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uJiBydWxlcyA9IG1fUnVsZUNvbGxlY3Rpb25baUdyb3VwXTsNCisgICAgcnVsZXMubV9wU3RhdGljU3RvcmUgPSBtX3BSdWxlRGF0YVN0b3JlOw0KKyAgICBydWxlcy5BZGRSdWxlc0Zyb20obV9TaGVldEdyb3Vwc1tpR3JvdXBdLCBkd01lZGlhTGlzdCwgbV9wRm9udE1ncik7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpSZXNldCgpIHsNCisgIGZvciAoaW50MzJfdCBpR3JvdXAgPSAwOyBpR3JvdXAgPCBGREVfQ1NTU1RZTEVTSEVFVEdST1VQX01BWDsgKytpR3JvdXApIHsNCisgICAgbV9SdWxlQ29sbGVjdGlvbltpR3JvdXBdLkNsZWFyKCk7DQorICB9DQorICBpZiAobV9wUnVsZURhdGFTdG9yZSAhPSBOVUxMKSB7DQorICAgIG1fcFJ1bGVEYXRhU3RvcmUtPlJlbGVhc2UoKTsNCisgICAgbV9wUnVsZURhdGFTdG9yZSA9IE5VTEw7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpNYXRjaERlY2xhcmF0aW9ucygNCisgICAgSUZERV9DU1NUYWdQcm92aWRlciogcFRhZywNCisgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5JiBtYXRjaGVkRGVjbHMsDQorICAgIEZERV9DU1NQRVJTVURPIGVQZXJzdWRvVHlwZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEFjY2VsZXJhdG9yICE9IE5VTEwgJiYgcFRhZyAhPSBOVUxMKTsNCisgIEZERV9MUENTU1RBR0NBQ0hFIHBDYWNoZSA9IG1fcEFjY2VsZXJhdG9yLT5HZXRUb3BFbGVtZW50KCk7DQorICBGWFNZU19hc3NlcnQocENhY2hlICE9IE5VTEwgJiYgcENhY2hlLT5HZXRUYWcoKSA9PSBwVGFnKTsNCisgIG1hdGNoZWREZWNscy5SZW1vdmVBdCgwLCBtYXRjaGVkRGVjbHMuR2V0U2l6ZSgpKTsNCisgIGZvciAoaW50MzJfdCBlUHJpb3JpdHkgPSBGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZX01BWCAtIDE7IGVQcmlvcml0eSA+PSAwOw0KKyAgICAgICAtLWVQcmlvcml0eSkgew0KKyAgICBGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVHcm91cCA9IG1fZVByaW9yaXRpZXNbZVByaW9yaXR5XTsNCisgICAgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbiYgcnVsZXMgPSBtX1J1bGVDb2xsZWN0aW9uW2VHcm91cF07DQorICAgIGlmIChydWxlcy5Db3VudFNlbGVjdG9ycygpID09IDApIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoZVBlcnN1ZG9UeXBlID09IEZERV9DU1NQRVJTVURPX05PTkUpIHsNCisgICAgICBNYXRjaFJ1bGVzKHBDYWNoZSwgcnVsZXMuR2V0VW5pdmVyc2FsUnVsZURhdGEoKSwgZVBlcnN1ZG9UeXBlKTsNCisgICAgICBpZiAocENhY2hlLT5IYXNoVGFnKCkpIHsNCisgICAgICAgIE1hdGNoUnVsZXMocENhY2hlLCBydWxlcy5HZXRUYWdSdWxlRGF0YShwQ2FjaGUtPkhhc2hUYWcoKSksDQorICAgICAgICAgICAgICAgICAgIGVQZXJzdWRvVHlwZSk7DQorICAgICAgfQ0KKyAgICAgIGludDMyX3QgaUNvdW50ID0gcENhY2hlLT5Db3VudEhhc2hDbGFzcygpOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICBwQ2FjaGUtPlNldENsYXNzSW5kZXgoaSk7DQorICAgICAgICBNYXRjaFJ1bGVzKHBDYWNoZSwgcnVsZXMuR2V0Q2xhc3NSdWxlRGF0YShwQ2FjaGUtPkhhc2hDbGFzcygpKSwNCisgICAgICAgICAgICAgICAgICAgZVBlcnN1ZG9UeXBlKTsNCisgICAgICB9DQogICAgIH0gZWxzZSB7DQotICAgICAgICBkZXN0LkNvcHkoKnBBcnJheSk7DQorICAgICAgTWF0Y2hSdWxlcyhwQ2FjaGUsIHJ1bGVzLkdldFBlcnN1ZG9SdWxlRGF0YSgpLCBlUGVyc3Vkb1R5cGUpOw0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6U2V0U3R5bGVQcmlvcml0eShGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLCBGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZIGVQcmlvcml0eSkNCi17DQotICAgIG1fZVByaW9yaXRpZXNbZVByaW9yaXR5XSA9IGVUeXBlOw0KLX0NCi12b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VXBkYXRlU3R5bGVJbmRleChGWF9EV09SRCBkd01lZGlhTGlzdCkNCi17DQotICAgIFJlc2V0KCk7DQotICAgIG1fcFJ1bGVEYXRhU3RvcmUgPSBGWF9DcmVhdGVBbGxvY2F0b3IoRlhfQUxMT0NUWVBFX1N0YXRpYywgMTAyNCwgMCk7DQotICAgIEZYU1lTX2Fzc2VydChtX3BSdWxlRGF0YVN0b3JlICE9IE5VTEwpOw0KLSAgICBmb3IgKGludDMyX3QgaUdyb3VwID0gMDsgaUdyb3VwIDwgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9NQVg7ICsraUdyb3VwKSB7DQotICAgICAgICBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uICZydWxlcyA9IG1fUnVsZUNvbGxlY3Rpb25baUdyb3VwXTsNCi0gICAgICAgIHJ1bGVzLm1fcFN0YXRpY1N0b3JlID0gbV9wUnVsZURhdGFTdG9yZTsNCi0gICAgICAgIHJ1bGVzLkFkZFJ1bGVzRnJvbShtX1NoZWV0R3JvdXBzW2lHcm91cF0sIGR3TWVkaWFMaXN0LCBtX3BGb250TWdyKTsNCisgICAgaWYgKG1fTWF0Y2hlZFJ1bGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgICBTb3J0UnVsZXNUbyhtYXRjaGVkRGVjbHMpOw0KKyAgICAgIG1fTWF0Y2hlZFJ1bGVzLlJlbW92ZUF0KDAsIG1fTWF0Y2hlZFJ1bGVzLkdldFNpemUoKSk7DQogICAgIH0NCisgIH0NCisgIHJldHVybiBtYXRjaGVkRGVjbHMuR2V0U2l6ZSgpOw0KIH0NCi12b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6UmVzZXQoKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGlHcm91cCA9IDA7IGlHcm91cCA8IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfTUFYOyArK2lHcm91cCkgew0KLSAgICAgICAgbV9SdWxlQ29sbGVjdGlvbltpR3JvdXBdLkNsZWFyKCk7DQoraW5saW5lIHZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpNYXRjaFJ1bGVzKEZERV9MUENTU1RBR0NBQ0hFIHBDYWNoZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0xQQ1NTUlVMRURBVEEgcExpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQRVJTVURPIGVQZXJzdWRvVHlwZSkgew0KKyAgd2hpbGUgKHBMaXN0ICE9IE5VTEwpIHsNCisgICAgaWYgKE1hdGNoU2VsZWN0b3IocENhY2hlLCBwTGlzdC0+cFNlbGVjdG9yLCBlUGVyc3Vkb1R5cGUpKSB7DQorICAgICAgbV9NYXRjaGVkUnVsZXMuQWRkKHBMaXN0KTsNCiAgICAgfQ0KLSAgICBpZiAobV9wUnVsZURhdGFTdG9yZSAhPSBOVUxMKSB7DQotICAgICAgICBtX3BSdWxlRGF0YVN0b3JlLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BSdWxlRGF0YVN0b3JlID0gTlVMTDsNCi0gICAgfQ0KKyAgICBwTGlzdCA9IHBMaXN0LT5wTmV4dDsNCisgIH0NCiB9DQotaW50MzJfdCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6Ok1hdGNoRGVjbGFyYXRpb25zKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcsIENGREVfQ1NTRGVjbGFyYXRpb25BcnJheSAmbWF0Y2hlZERlY2xzLCBGREVfQ1NTUEVSU1VETyBlUGVyc3Vkb1R5cGUpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wQWNjZWxlcmF0b3IgIT0gTlVMTCAmJiBwVGFnICE9IE5VTEwpOw0KLSAgICBGREVfTFBDU1NUQUdDQUNIRSBwQ2FjaGUgPSBtX3BBY2NlbGVyYXRvci0+R2V0VG9wRWxlbWVudCgpOw0KLSAgICBGWFNZU19hc3NlcnQocENhY2hlICE9IE5VTEwgJiYgcENhY2hlLT5HZXRUYWcoKSA9PSBwVGFnKTsNCi0gICAgbWF0Y2hlZERlY2xzLlJlbW92ZUF0KDAsIG1hdGNoZWREZWNscy5HZXRTaXplKCkpOw0KLSAgICBmb3IgKGludDMyX3QgZVByaW9yaXR5ID0gRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9NQVggLSAxOyBlUHJpb3JpdHkgPj0gMDsgLS1lUHJpb3JpdHkpIHsNCi0gICAgICAgIEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZUdyb3VwID0gbV9lUHJpb3JpdGllc1tlUHJpb3JpdHldOw0KLSAgICAgICAgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbiAmcnVsZXMgPSBtX1J1bGVDb2xsZWN0aW9uW2VHcm91cF07DQotICAgICAgICBpZiAocnVsZXMuQ291bnRTZWxlY3RvcnMoKSA9PSAwKSB7DQorRlhfQk9PTCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6Ok1hdGNoU2VsZWN0b3IoRkRFX0xQQ1NTVEFHQ0FDSEUgcENhY2hlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTU2VsZWN0b3IqIHBTZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BFUlNVRE8gZVBlcnN1ZG9UeXBlKSB7DQorICBGWF9EV09SRCBkd0hhc2g7DQorICB3aGlsZSAocFNlbCAhPSBOVUxMICYmIHBDYWNoZSAhPSBOVUxMKSB7DQorICAgIHN3aXRjaCAocFNlbC0+R2V0VHlwZSgpKSB7DQorICAgICAgY2FzZSBGREVfQ1NTU0VMRUNUT1JUWVBFX0Rlc2NlbmRhbnQ6DQorICAgICAgICBkd0hhc2ggPSBwU2VsLT5HZXROYW1lSGFzaCgpOw0KKyAgICAgICAgd2hpbGUgKChwQ2FjaGUgPSBwQ2FjaGUtPkdldFBhcmVudCgpKSAhPSBOVUxMKSB7DQorICAgICAgICAgIGlmIChkd0hhc2ggIT0gRkRFX0NTU1VOSVZFUlNBTEhBU0ggJiYgZHdIYXNoICE9IHBDYWNoZS0+SGFzaFRhZygpKSB7DQogICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKE1hdGNoU2VsZWN0b3IocENhY2hlLCBwU2VsLT5HZXROZXh0U2VsZWN0b3IoKSwgZVBlcnN1ZG9UeXBlKSkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBpZiAoZVBlcnN1ZG9UeXBlID09IEZERV9DU1NQRVJTVURPX05PTkUpIHsNCi0gICAgICAgICAgICBNYXRjaFJ1bGVzKHBDYWNoZSwgcnVsZXMuR2V0VW5pdmVyc2FsUnVsZURhdGEoKSwgZVBlcnN1ZG9UeXBlKTsNCi0gICAgICAgICAgICBpZiAocENhY2hlLT5IYXNoVGFnKCkpIHsNCi0gICAgICAgICAgICAgICAgTWF0Y2hSdWxlcyhwQ2FjaGUsIHJ1bGVzLkdldFRhZ1J1bGVEYXRhKHBDYWNoZS0+SGFzaFRhZygpKSwgZVBlcnN1ZG9UeXBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSBwQ2FjaGUtPkNvdW50SGFzaENsYXNzKCk7DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgICAgICAgICAgcENhY2hlLT5TZXRDbGFzc0luZGV4KGkpOw0KLSAgICAgICAgICAgICAgICBNYXRjaFJ1bGVzKHBDYWNoZSwgcnVsZXMuR2V0Q2xhc3NSdWxlRGF0YShwQ2FjaGUtPkhhc2hDbGFzcygpKSwgZVBlcnN1ZG9UeXBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIE1hdGNoUnVsZXMocENhY2hlLCBydWxlcy5HZXRQZXJzdWRvUnVsZURhdGEoKSwgZVBlcnN1ZG9UeXBlKTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfSUQ6DQorICAgICAgICBkd0hhc2ggPSBwQ2FjaGUtPkhhc2hJRCgpOw0KKyAgICAgICAgaWYgKGR3SGFzaCAhPSBwU2VsLT5HZXROYW1lSGFzaCgpKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmIChtX01hdGNoZWRSdWxlcy5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgU29ydFJ1bGVzVG8obWF0Y2hlZERlY2xzKTsNCi0gICAgICAgICAgICBtX01hdGNoZWRSdWxlcy5SZW1vdmVBdCgwLCBtX01hdGNoZWRSdWxlcy5HZXRTaXplKCkpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTU0VMRUNUT1JUWVBFX0NsYXNzOg0KKyAgICAgICAgZHdIYXNoID0gcENhY2hlLT5IYXNoQ2xhc3MoKTsNCisgICAgICAgIGlmIChkd0hhc2ggIT0gcFNlbC0+R2V0TmFtZUhhc2goKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQogICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfRWxlbWVudDoNCisgICAgICAgIGR3SGFzaCA9IHBTZWwtPkdldE5hbWVIYXNoKCk7DQorICAgICAgICBpZiAoZHdIYXNoICE9IEZERV9DU1NVTklWRVJTQUxIQVNIICYmIGR3SGFzaCAhPSBwQ2FjaGUtPkhhc2hUYWcoKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfUGVyc3VkbzoNCisgICAgICAgIGR3SGFzaCA9IEZERV9HZXRDU1NQZXJzdWRvQnlFbnVtKGVQZXJzdWRvVHlwZSktPmR3SGFzaDsNCisgICAgICAgIGlmIChkd0hhc2ggIT0gcFNlbC0+R2V0TmFtZUhhc2goKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBtYXRjaGVkRGVjbHMuR2V0U2l6ZSgpOw0KKyAgICBwU2VsID0gcFNlbC0+R2V0TmV4dFNlbGVjdG9yKCk7DQorICB9DQorICByZXR1cm4gcFNlbCA9PSBOVUxMICYmIHBDYWNoZSAhPSBOVUxMOw0KIH0NCi1pbmxpbmUgdm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6Ok1hdGNoUnVsZXMoRkRFX0xQQ1NTVEFHQ0FDSEUgcENhY2hlLCBGREVfTFBDU1NSVUxFREFUQSBwTGlzdCwgRkRFX0NTU1BFUlNVRE8gZVBlcnN1ZG9UeXBlKQ0KLXsNCi0gICAgd2hpbGUgKHBMaXN0ICE9IE5VTEwpIHsNCi0gICAgICAgIGlmIChNYXRjaFNlbGVjdG9yKHBDYWNoZSwgcExpc3QtPnBTZWxlY3RvciwgZVBlcnN1ZG9UeXBlKSkgew0KLSAgICAgICAgICAgIG1fTWF0Y2hlZFJ1bGVzLkFkZChwTGlzdCk7DQotICAgICAgICB9DQotICAgICAgICBwTGlzdCA9IHBMaXN0LT5wTmV4dDsNCit2b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6U29ydFJ1bGVzVG8oQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5JiBtYXRjaERlY2xzKSB7DQorICBmb3IgKGludDMyX3QgaiA9IG1fTWF0Y2hlZFJ1bGVzLkdldFVwcGVyQm91bmQoKTsgaiA+PSAwOyAtLWopIHsNCisgICAgRkRFX0xQQ1NTUlVMRURBVEEmIHBNaW4gPSBtX01hdGNoZWRSdWxlcy5FbGVtZW50QXQoaik7DQorICAgIEZYX0RXT1JEIGR3TWluID0gcE1pbi0+ZHdQcmlvcml0eTsNCisgICAgZm9yIChpbnQzMl90IGkgPSBqIC0gMTsgaSA+PSAwOyAtLWkpIHsNCisgICAgICBGREVfTFBDU1NSVUxFREFUQSYgcEN1ciA9IG1fTWF0Y2hlZFJ1bGVzLkVsZW1lbnRBdChpKTsNCisgICAgICBpZiAoZHdNaW4gPiBwQ3VyLT5kd1ByaW9yaXR5KSB7DQorICAgICAgICBkd01pbiA9IHBDdXItPmR3UHJpb3JpdHk7DQorICAgICAgICBGREVfTFBDU1NSVUxFREFUQSBwID0gcE1pbjsNCisgICAgICAgIHBNaW4gPSBwQ3VyOw0KKyAgICAgICAgcEN1ciA9IHA7DQorICAgICAgfQ0KICAgICB9DQorICAgIG1hdGNoRGVjbHMuQWRkKHBNaW4tPnBEZWNsYXJhdGlvbik7DQorICB9DQogfQ0KLUZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpNYXRjaFNlbGVjdG9yKEZERV9MUENTU1RBR0NBQ0hFIHBDYWNoZSwgSUZERV9DU1NTZWxlY3RvciAqcFNlbCwgRkRFX0NTU1BFUlNVRE8gZVBlcnN1ZG9UeXBlKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdIYXNoOw0KLSAgICB3aGlsZSAocFNlbCAhPSBOVUxMICYmIHBDYWNoZSAhPSBOVUxMKSB7DQotICAgICAgICBzd2l0Y2ggKHBTZWwtPkdldFR5cGUoKSkgew0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9EZXNjZW5kYW50Og0KLSAgICAgICAgICAgICAgICBkd0hhc2ggPSBwU2VsLT5HZXROYW1lSGFzaCgpOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKHBDYWNoZSA9IHBDYWNoZS0+R2V0UGFyZW50KCkpICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChkd0hhc2ggIT0gRkRFX0NTU1VOSVZFUlNBTEhBU0ggJiYgZHdIYXNoICE9IHBDYWNoZS0+SGFzaFRhZygpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAoTWF0Y2hTZWxlY3RvcihwQ2FjaGUsIHBTZWwtPkdldE5leHRTZWxlY3RvcigpLCBlUGVyc3Vkb1R5cGUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9JRDoNCi0gICAgICAgICAgICAgICAgZHdIYXNoID0gcENhY2hlLT5IYXNoSUQoKTsNCi0gICAgICAgICAgICAgICAgaWYgKGR3SGFzaCAhPSBwU2VsLT5HZXROYW1lSGFzaCgpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTU0VMRUNUT1JUWVBFX0NsYXNzOg0KLSAgICAgICAgICAgICAgICBkd0hhc2ggPSBwQ2FjaGUtPkhhc2hDbGFzcygpOw0KLSAgICAgICAgICAgICAgICBpZiAoZHdIYXNoICE9IHBTZWwtPkdldE5hbWVIYXNoKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfRWxlbWVudDoNCi0gICAgICAgICAgICAgICAgZHdIYXNoID0gcFNlbC0+R2V0TmFtZUhhc2goKTsNCi0gICAgICAgICAgICAgICAgaWYgKGR3SGFzaCAhPSBGREVfQ1NTVU5JVkVSU0FMSEFTSCAmJiBkd0hhc2ggIT0gcENhY2hlLT5IYXNoVGFnKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfUGVyc3VkbzoNCi0gICAgICAgICAgICAgICAgZHdIYXNoID0gRkRFX0dldENTU1BlcnN1ZG9CeUVudW0oZVBlcnN1ZG9UeXBlKS0+ZHdIYXNoOw0KLSAgICAgICAgICAgICAgICBpZiAoZHdIYXNoICE9IHBTZWwtPkdldE5hbWVIYXNoKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIHBTZWwgPSBwU2VsLT5HZXROZXh0U2VsZWN0b3IoKTsNCit2b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q29tcHV0ZVN0eWxlKA0KKyAgICBJRkRFX0NTU1RhZ1Byb3ZpZGVyKiBwVGFnLA0KKyAgICBjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uKiogcHBEZWNsQXJyYXksDQorICAgIGludDMyX3QgaURlY2xDb3VudCwNCisgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwRGVzdFN0eWxlKSB7DQorICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBDb21wdXRlZFN0eWxlID0gKENGREVfQ1NTQ29tcHV0ZWRTdHlsZSopcERlc3RTdHlsZTsNCisgIEZYU1lTX2Fzc2VydChwVGFnICYmIGlEZWNsQ291bnQgPj0gMCAmJiBwQ29tcHV0ZWRTdHlsZSAhPSBOVUxMKTsNCisgIEZYX1BPU0lUSU9OIHBvcyA9IHBUYWctPkdldEZpcnN0QXR0cmlidXRlKCk7DQorICBpZiAocG9zICE9IE5VTEwpIHsNCisgICAgaWYgKG1fcElubGluZVN0eWxlU3RvcmUgPT0gTlVMTCkgew0KKyAgICAgIG1fcElubGluZVN0eWxlU3RvcmUgPSBGWF9DcmVhdGVBbGxvY2F0b3IoRlhfQUxMT0NUWVBFX1N0YXRpYywgMjA0OCwgMCk7DQogICAgIH0NCi0gICAgcmV0dXJuIHBTZWwgPT0gTlVMTCAmJiBwQ2FjaGUgIT0gTlVMTDsNCi19DQotdm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlNvcnRSdWxlc1RvKENGREVfQ1NTRGVjbGFyYXRpb25BcnJheSAmbWF0Y2hEZWNscykNCi17DQotICAgIGZvciAoaW50MzJfdCBqID0gbV9NYXRjaGVkUnVsZXMuR2V0VXBwZXJCb3VuZCgpOyBqID49IDA7IC0taikgew0KLSAgICAgICAgRkRFX0xQQ1NTUlVMRURBVEEgJnBNaW4gPSBtX01hdGNoZWRSdWxlcy5FbGVtZW50QXQoaik7DQotICAgICAgICBGWF9EV09SRCBkd01pbiA9IHBNaW4tPmR3UHJpb3JpdHk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IGogLSAxOyBpID49IDA7IC0taSkgew0KLSAgICAgICAgICAgIEZERV9MUENTU1JVTEVEQVRBICZwQ3VyID0gbV9NYXRjaGVkUnVsZXMuRWxlbWVudEF0KGkpOw0KLSAgICAgICAgICAgIGlmIChkd01pbiA+IHBDdXItPmR3UHJpb3JpdHkpIHsNCi0gICAgICAgICAgICAgICAgZHdNaW4gPSBwQ3VyLT5kd1ByaW9yaXR5Ow0KLSAgICAgICAgICAgICAgICBGREVfTFBDU1NSVUxFREFUQSBwID0gcE1pbjsNCi0gICAgICAgICAgICAgICAgcE1pbiA9IHBDdXI7DQotICAgICAgICAgICAgICAgIHBDdXIgPSBwOw0KLSAgICAgICAgICAgIH0NCisgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbiogcERlY2wgPSBOVUxMOw0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NBdHRyaSwgd3NWYWx1ZTsNCisgICAgRlhfRFdPUkQgZHdBdHRyaUhhc2g7DQorICAgIGRvIHsNCisgICAgICBwVGFnLT5HZXROZXh0QXR0cmlidXRlKHBvcywgd3NBdHRyaSwgd3NWYWx1ZSk7DQorICAgICAgZHdBdHRyaUhhc2ggPQ0KKyAgICAgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0F0dHJpLkdldFB0cigpLCB3c0F0dHJpLkdldExlbmd0aCgpLCBUUlVFKTsNCisgICAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgc19kd1N0eWxlSGFzaCA9DQorICAgICAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEwic3R5bGUiLCA1LCBUUlVFKTsNCisgICAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgc19kd0FsaWduSGFzaCA9DQorICAgICAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEwiYWxpZ24iLCA1LCBUUlVFKTsNCisgICAgICBpZiAoZHdBdHRyaUhhc2ggPT0gc19kd1N0eWxlSGFzaCkgew0KKyAgICAgICAgaWYgKHBEZWNsID09IE5VTEwpIHsNCisgICAgICAgICAgcERlY2wgPSBGREVfTmV3V2l0aChtX3BJbmxpbmVTdHlsZVN0b3JlKSBDRkRFX0NTU0RlY2xhcmF0aW9uOw0KICAgICAgICAgfQ0KLSAgICAgICAgbWF0Y2hEZWNscy5BZGQocE1pbi0+cERlY2xhcmF0aW9uKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q29tcHV0ZVN0eWxlKElGREVfQ1NTVGFnUHJvdmlkZXIgKnBUYWcsIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24gKipwcERlY2xBcnJheSwgaW50MzJfdCBpRGVjbENvdW50LCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBEZXN0U3R5bGUpDQotew0KLSAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBDb21wdXRlZFN0eWxlID0gKENGREVfQ1NTQ29tcHV0ZWRTdHlsZSopcERlc3RTdHlsZTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBUYWcgJiYgaURlY2xDb3VudCA+PSAwICYmIHBDb21wdXRlZFN0eWxlICE9IE5VTEwpOw0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwVGFnLT5HZXRGaXJzdEF0dHJpYnV0ZSgpOw0KLSAgICBpZiAocG9zICE9IE5VTEwpIHsNCi0gICAgICAgIGlmIChtX3BJbmxpbmVTdHlsZVN0b3JlID09IE5VTEwpIHsNCi0gICAgICAgICAgICBtX3BJbmxpbmVTdHlsZVN0b3JlID0gRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9TdGF0aWMsIDIwNDgsIDApOw0KKyAgICAgICAgQXBwZW5kSW5saW5lU3R5bGUocERlY2wsIHdzVmFsdWUuR2V0UHRyKCksIHdzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIH0gZWxzZSBpZiAoZHdBdHRyaUhhc2ggPT0gc19kd0FsaWduSGFzaCkgew0KKyAgICAgICAgaWYgKHBEZWNsID09IE5VTEwpIHsNCisgICAgICAgICAgcERlY2wgPSBGREVfTmV3V2l0aChtX3BJbmxpbmVTdHlsZVN0b3JlKSBDRkRFX0NTU0RlY2xhcmF0aW9uOw0KICAgICAgICAgfQ0KLSAgICAgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbiAqcERlY2wgPSBOVUxMOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQXR0cmksIHdzVmFsdWU7DQotICAgICAgICBGWF9EV09SRCBkd0F0dHJpSGFzaDsNCi0gICAgICAgIGRvIHsNCi0gICAgICAgICAgICBwVGFnLT5HZXROZXh0QXR0cmlidXRlKHBvcywgd3NBdHRyaSwgd3NWYWx1ZSk7DQotICAgICAgICAgICAgZHdBdHRyaUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0F0dHJpLkdldFB0cigpLCB3c0F0dHJpLkdldExlbmd0aCgpLCBUUlVFKTsNCi0gICAgICAgICAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgc19kd1N0eWxlSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEwic3R5bGUiLCA1LCBUUlVFKTsNCi0gICAgICAgICAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgc19kd0FsaWduSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEwiYWxpZ24iLCA1LCBUUlVFKTsNCi0gICAgICAgICAgICBpZiAoZHdBdHRyaUhhc2ggPT0gc19kd1N0eWxlSGFzaCkgew0KLSAgICAgICAgICAgICAgICBpZiAocERlY2wgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgcERlY2wgPSBGREVfTmV3V2l0aChtX3BJbmxpbmVTdHlsZVN0b3JlKSBDRkRFX0NTU0RlY2xhcmF0aW9uOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEFwcGVuZElubGluZVN0eWxlKHBEZWNsLCB3c1ZhbHVlLkdldFB0cigpLCB3c1ZhbHVlLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGR3QXR0cmlIYXNoID09IHNfZHdBbGlnbkhhc2gpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHBEZWNsID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBEZWNsID0gRkRFX05ld1dpdGgobV9wSW5saW5lU3R5bGVTdG9yZSkgQ0ZERV9DU1NEZWNsYXJhdGlvbjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlBUkdTIGFyZ3M7DQotICAgICAgICAgICAgICAgIGFyZ3MucFN0cmluZ0NhY2hlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgYXJncy5wU3RhdGljU3RvcmUgPSBtX3BJbmxpbmVTdHlsZVN0b3JlOw0KLSAgICAgICAgICAgICAgICBhcmdzLnBQcm9wZXJ0eSA9IEZERV9HZXRDU1NQcm9wZXJ0eUJ5RW51bShGREVfQ1NTUFJPUEVSVFlfVGV4dEFsaWduKTsNCi0gICAgICAgICAgICAgICAgcERlY2wtPkFkZFByb3BlcnR5KCZhcmdzLCB3c1ZhbHVlLkdldFB0cigpLCB3c1ZhbHVlLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IHdoaWxlIChwb3MgIT0gTlVMTCk7DQotICAgICAgICBpZiAocERlY2wgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIENGREVfQ1NTRGVjbGFyYXRpb25BcnJheSBkZWNsczsNCi0gICAgICAgICAgICBkZWNscy5TZXRTaXplKGlEZWNsQ291bnQgKyAxKTsNCi0gICAgICAgICAgICBJRkRFX0NTU0RlY2xhcmF0aW9uICoqcHBJbmxpbmUgPSBkZWNscy5HZXREYXRhKCk7DQotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KHBwSW5saW5lLCBwcERlY2xBcnJheSwgaURlY2xDb3VudCAqIHNpemVvZihJRkRFX0NTU0RlY2xhcmF0aW9uKikpOw0KLSAgICAgICAgICAgIHBwSW5saW5lW2lEZWNsQ291bnQrK10gPSBwRGVjbDsNCi0gICAgICAgICAgICBBcHBseURlY2xhcmF0aW9ucyhUUlVFLCAoY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbiAqKilwcElubGluZSwgaURlY2xDb3VudCwgcERlc3RTdHlsZSk7DQotICAgICAgICAgICAgQXBwbHlEZWNsYXJhdGlvbnMoRkFMU0UsIChjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uICoqKXBwSW5saW5lLCBpRGVjbENvdW50LCBwRGVzdFN0eWxlKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGlEZWNsQ291bnQgPiAwKSB7DQotICAgICAgICBGWFNZU19hc3NlcnQocHBEZWNsQXJyYXkgIT0gTlVMTCk7DQotICAgICAgICBBcHBseURlY2xhcmF0aW9ucyhUUlVFLCBwcERlY2xBcnJheSwgaURlY2xDb3VudCwgcERlc3RTdHlsZSk7DQotICAgICAgICBBcHBseURlY2xhcmF0aW9ucyhGQUxTRSwgcHBEZWNsQXJyYXksIGlEZWNsQ291bnQsIHBEZXN0U3R5bGUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpBcHBseURlY2xhcmF0aW9ucyhGWF9CT09MIGJQcmlvcml0eSwgY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbiAqKnBwRGVjbEFycmF5LCBpbnQzMl90IGlEZWNsQ291bnQsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcERlc3RTdHlsZSkNCi17DQotICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcENvbXB1dGVkU3R5bGUgPSAoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKilwRGVzdFN0eWxlOw0KLSAgICBJRkRFX0NTU1ZhbHVlICpwVmFsOw0KLSAgICBGWF9CT09MIGJJbXBvcnRhbnQ7DQotICAgIGludDMyX3QgaTsNCi0gICAgaWYgKGJQcmlvcml0eSkgew0KLSAgICAgICAgSUZERV9DU1NWYWx1ZSAqcExhc3Rlc3QgPSBOVUxMLCAqcEltcG9ydGFudCA9IE5VTEw7DQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaURlY2xDb3VudDsgKytpKSB7DQotICAgICAgICAgICAgcFZhbCA9IHBwRGVjbEFycmF5W2ldLT5HZXRQcm9wZXJ0eShGREVfQ1NTUFJPUEVSVFlfRm9udFNpemUsIGJJbXBvcnRhbnQpOw0KLSAgICAgICAgICAgIGlmIChwVmFsID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChiSW1wb3J0YW50KSB7DQotICAgICAgICAgICAgICAgIHBJbXBvcnRhbnQgPSBwVmFsOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBMYXN0ZXN0ID0gcFZhbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAocEltcG9ydGFudCkgew0KLSAgICAgICAgICAgIEFwcGx5UHJvcGVydHkoRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplLCBwSW1wb3J0YW50LCBwQ29tcHV0ZWRTdHlsZSk7DQotICAgICAgICB9IGVsc2UgaWYgKHBMYXN0ZXN0KSB7DQotICAgICAgICAgICAgQXBwbHlQcm9wZXJ0eShGREVfQ1NTUFJPUEVSVFlfRm9udFNpemUsIHBMYXN0ZXN0LCBwQ29tcHV0ZWRTdHlsZSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRkRFX0NTU0RlY2xhcmF0aW9uQXJyYXkgaW1wb3J0YW50czsNCi0gICAgICAgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24gKnBEZWNsID0gTlVMTDsNCi0gICAgICAgIEZERV9DU1NQUk9QRVJUWSBlUHJvcDsNCi0gICAgICAgIEZYX1BPU0lUSU9OIHBvczsNCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpRGVjbENvdW50OyArK2kpIHsNCi0gICAgICAgICAgICBwRGVjbCA9IHBwRGVjbEFycmF5W2ldOw0KLSAgICAgICAgICAgIHBvcyA9IHBEZWNsLT5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgICAgICAgICAgd2hpbGUgKHBvcyAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIHBEZWNsLT5HZXROZXh0UHJvcGVydHkocG9zLCBlUHJvcCwgcFZhbCwgYkltcG9ydGFudCk7DQotICAgICAgICAgICAgICAgIGlmIChlUHJvcCA9PSBGREVfQ1NTUFJPUEVSVFlfRm9udFNpemUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFiSW1wb3J0YW50KSB7DQotICAgICAgICAgICAgICAgICAgICBBcHBseVByb3BlcnR5KGVQcm9wLCBwVmFsLCBwQ29tcHV0ZWRTdHlsZSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW1wb3J0YW50cy5HZXRTaXplKCkgPT0gMCB8fCBpbXBvcnRhbnRzW2ltcG9ydGFudHMuR2V0VXBwZXJCb3VuZCgpXSAhPSBwRGVjbCkgew0KLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW50cy5BZGQoKElGREVfQ1NTRGVjbGFyYXRpb24qKXBEZWNsKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlEZWNsQ291bnQgPSBpbXBvcnRhbnRzLkdldFNpemUoKTsNCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpRGVjbENvdW50OyArK2kpIHsNCi0gICAgICAgICAgICBwRGVjbCA9IGltcG9ydGFudHNbaV07DQotICAgICAgICAgICAgcG9zID0gcERlY2wtPkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgICAgICAgICB3aGlsZSAocG9zICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcERlY2wtPkdldE5leHRQcm9wZXJ0eShwb3MsIGVQcm9wLCBwVmFsLCBiSW1wb3J0YW50KTsNCi0gICAgICAgICAgICAgICAgaWYgKGJJbXBvcnRhbnQgJiYgZVByb3AgIT0gRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplKSB7DQotICAgICAgICAgICAgICAgICAgICBBcHBseVByb3BlcnR5KGVQcm9wLCBwVmFsLCBwQ29tcHV0ZWRTdHlsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUsIHdzVmFsdWU7DQotICAgICAgICBwb3MgPSBwRGVjbC0+R2V0U3RhcnRDdXN0b20oKTsNCi0gICAgICAgIHdoaWxlIChwb3MpIHsNCi0gICAgICAgICAgICBwRGVjbC0+R2V0TmV4dEN1c3RvbShwb3MsIHdzTmFtZSwgd3NWYWx1ZSk7DQotICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPkFkZEN1c3RvbVN0eWxlKHdzTmFtZSwgd3NWYWx1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OkFwcGVuZElubGluZVN0eWxlKENGREVfQ1NTRGVjbGFyYXRpb24gKnBEZWNsLCBjb25zdCBGWF9XQ0hBUiogcHN6LCBpbnQzMl90IGlMZW4pDQotew0KLSAgICBGWFNZU19hc3NlcnQocERlY2wgIT0gTlVMTCAmJiBwc3ogIT0gTlVMTCAmJiBpTGVuID4gMCk7DQotICAgIElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4ID0gSUZERV9DU1NTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KLSAgICBpZiAocFN5bnRheCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKHBTeW50YXgtPkluaXQocHN6LCBpTGVuLCAzMiwgVFJVRSkpIHsNCi0gICAgICAgIGludDMyX3QgaUxlbjsNCi0gICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3o7DQogICAgICAgICBGREVfQ1NTUFJPUEVSVFlBUkdTIGFyZ3M7DQogICAgICAgICBhcmdzLnBTdHJpbmdDYWNoZSA9IE5VTEw7DQogICAgICAgICBhcmdzLnBTdGF0aWNTdG9yZSA9IG1fcElubGluZVN0eWxlU3RvcmU7DQotICAgICAgICBhcmdzLnBQcm9wZXJ0eSA9IE5VTEw7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQotICAgICAgICBmb3IgKDs7KSB7DQotICAgICAgICAgICAgRkRFX0NTU1NZTlRBWFNUQVRVUyBlU3RhdHVzID0gcFN5bnRheC0+RG9TeW50YXhQYXJzZSgpOw0KLSAgICAgICAgICAgIGlmIChlU3RhdHVzID09IEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lKSB7DQotICAgICAgICAgICAgICAgIHBzeiA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaUxlbik7DQotICAgICAgICAgICAgICAgIGFyZ3MucFByb3BlcnR5ID0gRkRFX0dldENTU1Byb3BlcnR5QnlOYW1lKHBzeiwgaUxlbik7DQotICAgICAgICAgICAgICAgIGlmIChhcmdzLnBQcm9wZXJ0eSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICB3c05hbWUgPSBDRlhfV2lkZVN0cmluZ0MocHN6LCBpTGVuKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZVN0YXR1cyA9PSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGFyZ3MucFByb3BlcnR5ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBzeiA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaUxlbik7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaUxlbiA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjbC0+QWRkUHJvcGVydHkoJmFyZ3MsIHBzeiwgaUxlbik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaUxlbiA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIHBzeiA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaUxlbik7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaUxlbiA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjbC0+QWRkUHJvcGVydHkoJmFyZ3MsIHdzTmFtZSwgd3NOYW1lLkdldExlbmd0aCgpLCBwc3osIGlMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgICAgICAgYXJncy5wUHJvcGVydHkgPSBGREVfR2V0Q1NTUHJvcGVydHlCeUVudW0oRkRFX0NTU1BST1BFUlRZX1RleHRBbGlnbik7DQorICAgICAgICBwRGVjbC0+QWRkUHJvcGVydHkoJmFyZ3MsIHdzVmFsdWUuR2V0UHRyKCksIHdzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIH0NCisgICAgfSB3aGlsZSAocG9zICE9IE5VTEwpOw0KKyAgICBpZiAocERlY2wgIT0gTlVMTCkgew0KKyAgICAgIENGREVfQ1NTRGVjbGFyYXRpb25BcnJheSBkZWNsczsNCisgICAgICBkZWNscy5TZXRTaXplKGlEZWNsQ291bnQgKyAxKTsNCisgICAgICBJRkRFX0NTU0RlY2xhcmF0aW9uKiogcHBJbmxpbmUgPSBkZWNscy5HZXREYXRhKCk7DQorICAgICAgRlhTWVNfbWVtY3B5KHBwSW5saW5lLCBwcERlY2xBcnJheSwNCisgICAgICAgICAgICAgICAgICAgaURlY2xDb3VudCAqIHNpemVvZihJRkRFX0NTU0RlY2xhcmF0aW9uKikpOw0KKyAgICAgIHBwSW5saW5lW2lEZWNsQ291bnQrK10gPSBwRGVjbDsNCisgICAgICBBcHBseURlY2xhcmF0aW9ucyhUUlVFLCAoY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbioqKXBwSW5saW5lLCBpRGVjbENvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0U3R5bGUpOw0KKyAgICAgIEFwcGx5RGVjbGFyYXRpb25zKEZBTFNFLCAoY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbioqKXBwSW5saW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlEZWNsQ291bnQsIHBEZXN0U3R5bGUpOw0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KLSAgICBwU3ludGF4LT5SZWxlYXNlKCk7DQorICB9DQorICBpZiAoaURlY2xDb3VudCA+IDApIHsNCisgICAgRlhTWVNfYXNzZXJ0KHBwRGVjbEFycmF5ICE9IE5VTEwpOw0KKyAgICBBcHBseURlY2xhcmF0aW9ucyhUUlVFLCBwcERlY2xBcnJheSwgaURlY2xDb3VudCwgcERlc3RTdHlsZSk7DQorICAgIEFwcGx5RGVjbGFyYXRpb25zKEZBTFNFLCBwcERlY2xBcnJheSwgaURlY2xDb3VudCwgcERlc3RTdHlsZSk7DQorICB9DQogfQ0KLXZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpBcHBseVByb3BlcnR5KEZERV9DU1NQUk9QRVJUWSBlUHJvcGVydHksIElGREVfQ1NTVmFsdWUgKnBWYWx1ZSwgQ0ZERV9DU1NDb21wdXRlZFN0eWxlICpwQ29tcHV0ZWRTdHlsZSkNCi17DQotI2RlZmluZSBGREVfQ1NTTk9OSU5IRVJJVFMJKHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEpDQotI2RlZmluZSBGREVfQ1NTSU5IRVJJVFMJCShwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhKQ0KLSNkZWZpbmUgRkRFX0NTU0ZPTlRTSVpFCQkoRkRFX0NTU0lOSEVSSVRTLm1fZkZvbnRTaXplKQ0KLSAgICBpZiAocENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX3BGb250RmFtaWx5ICYmICooRlhfRFdPUkQqKXBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9wRm9udEZhbWlseSA9PSAweGNkY2RjZGNkKSB7DQotICAgICAgICBwQ29tcHV0ZWRTdHlsZSA9IHBDb21wdXRlZFN0eWxlOw0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpBcHBseURlY2xhcmF0aW9ucygNCisgICAgRlhfQk9PTCBiUHJpb3JpdHksDQorICAgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKiBwcERlY2xBcnJheSwNCisgICAgaW50MzJfdCBpRGVjbENvdW50LA0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBEZXN0U3R5bGUpIHsNCisgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcENvbXB1dGVkU3R5bGUgPSAoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKilwRGVzdFN0eWxlOw0KKyAgSUZERV9DU1NWYWx1ZSogcFZhbDsNCisgIEZYX0JPT0wgYkltcG9ydGFudDsNCisgIGludDMyX3QgaTsNCisgIGlmIChiUHJpb3JpdHkpIHsNCisgICAgSUZERV9DU1NWYWx1ZSAqcExhc3Rlc3QgPSBOVUxMLCAqcEltcG9ydGFudCA9IE5VTEw7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpRGVjbENvdW50OyArK2kpIHsNCisgICAgICBwVmFsID0gcHBEZWNsQXJyYXlbaV0tPkdldFByb3BlcnR5KEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSwgYkltcG9ydGFudCk7DQorICAgICAgaWYgKHBWYWwgPT0gTlVMTCkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfSBlbHNlIGlmIChiSW1wb3J0YW50KSB7DQorICAgICAgICBwSW1wb3J0YW50ID0gcFZhbDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcExhc3Rlc3QgPSBwVmFsOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUpIHsNCi0gICAgICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBQcmltaXRpdmUgPSAoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopcFZhbHVlOw0KLSAgICAgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGUgPSBwUHJpbWl0aXZlLT5HZXRQcmltaXRpdmVUeXBlKCk7DQotICAgICAgICBzd2l0Y2ggKGVQcm9wZXJ0eSkgew0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0Rpc3BsYXk6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lRGlzcGxheSA9IFRvRGlzcGxheShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplOiB7DQotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCAmZkZvbnRTaXplID0gRkRFX0NTU0ZPTlRTSVpFOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVUeXBlID49IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciAmJiBlVHlwZSA8PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QQykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZGb250U2l6ZSA9IEFwcGx5TnVtYmVyKGVUeXBlLCBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpLCBmRm9udFNpemUpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZkZvbnRTaXplID0gVG9Gb250U2l6ZShwUHJpbWl0aXZlLT5HZXRFbnVtKCksIGZGb250U2l6ZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGluZUhlaWdodDoNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcikgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZkxpbmVIZWlnaHQgPSBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpICogRkRFX0NTU0ZPTlRTSVpFOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID4gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmIGVUeXBlIDw9IEZERV9DU1NQUklNSVRJVkVUWVBFX1BDKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9mTGluZUhlaWdodCA9IEFwcGx5TnVtYmVyKGVUeXBlLCBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHRBbGlnbjoNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VUZXh0QWxpZ2ggPSBUb1RleHRBbGlnbihwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHRJbmRlbnQ6DQotICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NJTkhFUklUUy5tX1RleHRJbmRlbnQsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Gb250V2VpZ2h0Og0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fd0ZvbnRXZWlnaHQgPSBUb0ZvbnRXZWlnaHQocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlID0gKGludDMyX3QpcFByaW1pdGl2ZS0+R2V0RmxvYXQoKSAvIDEwMDsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpVmFsdWUgPj0gMSAmJiBpVmFsdWUgPD0gOSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX3dGb250V2VpZ2h0ID0gaVZhbHVlICogMTAwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0ZvbnRTdHlsZToNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VGb250U3R5bGUgPSBUb0ZvbnRTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbG9yOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9kd0ZvbnRDb2xvciA9IHBQcmltaXRpdmUtPkdldFJHQkNvbG9yKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luTGVmdDoNCi0gICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc01hcmdpbiB8PSBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9NYXJnaW5XaWR0aC5sZWZ0LCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luVG9wOg0KLSAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzTWFyZ2luIHw9IFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01hcmdpbldpZHRoLnRvcCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX01hcmdpblJpZ2h0Og0KLSAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzTWFyZ2luIHw9IFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01hcmdpbldpZHRoLnJpZ2h0LCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luQm90dG9tOg0KLSAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzTWFyZ2luIHw9IFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01hcmdpbldpZHRoLmJvdHRvbSwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmdMZWZ0Og0KLSAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzUGFkZGluZyB8PSBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9QYWRkaW5nV2lkdGgubGVmdCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmdUb3A6DQotICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNQYWRkaW5nIHw9IFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX1BhZGRpbmdXaWR0aC50b3AsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nUmlnaHQ6DQotICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNQYWRkaW5nIHw9IFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX1BhZGRpbmdXaWR0aC5yaWdodCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmdCb3R0b206DQotICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNQYWRkaW5nIHw9IFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX1BhZGRpbmdXaWR0aC5ib3R0b20sIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0V2lkdGg6DQotICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNCb3JkZXIgfD0gU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQm9yZGVyV2lkdGgubGVmdCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFdpZHRoOg0KLSAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzQm9yZGVyIHw9IFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0JvcmRlcldpZHRoLnRvcCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGg6DQotICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNCb3JkZXIgfD0gU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQm9yZGVyV2lkdGgucmlnaHQsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21XaWR0aDoNCi0gICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc0JvcmRlciB8PSBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Cb3JkZXJXaWR0aC5ib3R0b20sIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0U3R5bGU6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lQkRSTGVmdFN0eWxlID0gVG9Cb3JkZXJTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFN0eWxlOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZUJEUlRvcFN0eWxlID0gVG9Cb3JkZXJTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0U3R5bGU6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lQkRSUmlnaHRTdHlsZSA9IFRvQm9yZGVyU3R5bGUocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZToNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VCRFJCb3R0b21TdHlsZSA9IFRvQm9yZGVyU3R5bGUocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0Q29sb3I6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2R3QkRSTGVmdENvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BDb2xvcjoNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdCRFJUb3BDb2xvciA9IHBQcmltaXRpdmUtPkdldFJHQkNvbG9yKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRDb2xvcjoNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdCRFJSaWdodENvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21Db2xvcjoNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdCRFJCb3R0b21Db2xvciA9IHBQcmltaXRpdmUtPkdldFJHQkNvbG9yKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlVHlwZToNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VMaXN0U3R5bGVUeXBlID0gVG9MaXN0U3R5bGVUeXBlKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlUG9zaXRpb246DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lTGlzdFN0eWxlUG9zaXRpb24gPSBUb0xpc3RTdHlsZVBvc2l0aW9uKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZENvbG9yOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd0JLR0NvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd0JLR0NvbG9yID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9WaXNpYmlsaXR5Og0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVZpc2liaWxpdHkgPSBUb1Zpc2liaWxpdHkocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9XaWR0aDoNCi0gICAgICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQm94U2l6ZS5jeCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0hlaWdodDoNCi0gICAgICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQm94U2l6ZS5jeSwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX01pbldpZHRoOg0KLSAgICAgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9NaW5Cb3hTaXplLmN4LCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWluSGVpZ2h0Og0KLSAgICAgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9NaW5Cb3hTaXplLmN5LCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWF4V2lkdGg6DQotICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01heEJveFNpemUuY3gsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXhIZWlnaHQ6DQotICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01heEJveFNpemUuY3ksIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9WZXJ0aWNhbEFsaWduOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZVZlcnRpY2FsQWxpZ24gPSBUb1ZlcnRpY2FsQWxpZ24ocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYgZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VWZXJ0aWNhbEFsaWduID0gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fTnVtYmVyOw0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZlZlcnRpY2FsQWxpZ24gPSBBcHBseU51bWJlcihlVHlwZSwgcFByaW1pdGl2ZS0+R2V0RmxvYXQoKSwgRkRFX0NTU0ZPTlRTSVpFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9XaGl0ZVNwYWNlOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVdoaXRlU3BhY2UgPSBUb1doaXRlU3BhY2UocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9UZXh0VHJhbnNmb3JtOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVRleHRUcmFuc2Zvcm0gPSBUb1RleHRUcmFuc2Zvcm0ocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Gb250VmFyaWFudDoNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VGb250VmFyaWFudCA9IFRvRm9udFZhcmlhbnQocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9MZXR0ZXJTcGFjaW5nOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudCkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fTGV0dGVyU3BhY2luZy5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfTm9ybWFsKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYgZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpIHsNCi0gICAgICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NJTkhFUklUUy5tX0xldHRlclNwYWNpbmcsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1dvcmRTcGFjaW5nOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudCkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fV29yZFNwYWNpbmcuU2V0KEZERV9DU1NMRU5HVEhVTklUX05vcm1hbCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPj0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmIGVUeXBlIDw9IEZERV9DU1NQUklNSVRJVkVUWVBFX1BDKSB7DQotICAgICAgICAgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTSU5IRVJJVFMubV9Xb3JkU3BhY2luZywgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfRmxvYXQ6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lRmxvYXQgPSBUb0Zsb2F0KHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ2xlYXI6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lQ2xlYXIgPSBUb0NsZWFyKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfV3JpdGluZ01vZGU6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lV3JpdGluZ01vZGUgPSBUb1dyaXRpbmdNb2RlKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfV29yZEJyZWFrOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVdvcmRCcmVhayA9IFRvV29yZEJyZWFrKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfV2lkb3dzOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9pV2lkb3dzID0gKGludDMyX3QpcFByaW1pdGl2ZS0+R2V0RmxvYXQoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9PcnBoYW5zOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9pT3JwaGFucyA9IChpbnQzMl90KXBQcmltaXRpdmUtPkdldEZsb2F0KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzQ29sb3I6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBQcmltaXRpdmUtPkdldEVudW0oKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJhbnNwYXJlbnQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2R3VGV4dEVtcGhhc2lzQ29sb3IgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9iVGV4dEVtcGhhc2lzQ29sb3JDdXJyZW50ID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ3VycmVudGNvbG9yOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9iVGV4dEVtcGhhc2lzQ29sb3JDdXJyZW50ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9kd1RleHRFbXBoYXNpc0NvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2JUZXh0RW1waGFzaXNDb2xvckN1cnJlbnQgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtCZWZvcmU6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lUGFnZUJyZWFrQmVmb3JlID0gVG9QYWdlQnJlYWsocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtBZnRlcjoNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VQYWdlQnJlYWtBZnRlciA9IFRvUGFnZUJyZWFrKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrSW5zaWRlOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZVBhZ2VCcmVha0luc2lkZSA9IFRvUGFnZUJyZWFrKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3dYOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZU92ZXJmbG93WCA9IFRvT3ZlcmZsb3cocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9PdmVyZmxvd1k6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lT3ZlcmZsb3dZID0gVG9PdmVyZmxvdyhwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0xpbmVCcmVhazoNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VMaW5lQnJlYWsgPSBUb0xpbmVCcmVhayhwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbHVtbkNvdW50Og0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fQ29sdW1uQ291bnQuU2V0KEZERV9DU1NMRU5HVEhVTklUX0F1dG8pOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcikgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fQ29sdW1uQ291bnQuU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5HYXA6DQotICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0NvbHVtbkdhcCwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVDb2xvcjoNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdDb2x1bW5SdWxlQ29sb3IgPSBwUHJpbWl0aXZlLT5HZXRSR0JDb2xvcigpOw0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkNvbHVtblJ1bGVDb2xvclNhbWUgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlU3R5bGU6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lQ29sdW1uUnVsZVN0eWxlID0gVG9Cb3JkZXJTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVXaWR0aDoNCi0gICAgICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQ29sdW1uUnVsZVdpZHRoLCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uV2lkdGg6DQotICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0NvbHVtbldpZHRoLCBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZEltYWdlOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fcHN6QktHSW1hZ2UgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1VSSSkgew0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fcHN6QktHSW1hZ2UgPSBwUHJpbWl0aXZlLT5HZXRTdHJpbmcoaUxlbmd0aCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUG9zaXRpb246DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lUG9zaXRpb24gPSBUb1Bvc2l0aW9uKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfVG9wOg0KLSAgICAgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Ub3AsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3R0b206DQotICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0JvdHRvbSwgZVR5cGUsIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0xlZnQ6DQotICAgICAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0xlZnQsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9SaWdodDoNCi0gICAgICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fUmlnaHQsIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9MaXN0U3R5bGVJbWFnZToNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX3Bzekxpc3RTdHlsZUltYWdlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9VUkkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aDsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX3Bzekxpc3RTdHlsZUltYWdlID0gcFByaW1pdGl2ZS0+R2V0U3RyaW5nKGlMZW5ndGgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NhcHRpb25TaWRlOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZUNhcHRpb25TaWRlID0gVG9DYXB0aW9uU2lkZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRSZXBlYXQ6DQotICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lQktHUmVwZWF0ID0gVG9CS0dSZXBlYXQocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kQXR0YWNobWVudDoNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VCS0dBdHRhY2htZW50ID0gVG9CS0dBdHRhY2htZW50KHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieUFsaWduOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVJ1YnlBbGlnbiA9IFRvUnVieUFsaWduKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieU92ZXJoYW5nOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVJ1YnlPdmVyaGFuZyA9IFRvUnVieU92ZXJoYW5nKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieVBvc2l0aW9uOg0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVJ1YnlQb3NpdGlvbiA9IFRvUnVieVBvc2l0aW9uKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieVNwYW46DQotICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BSdWJ5U3BhbiA9IHBQcmltaXRpdmU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICBpZiAocEltcG9ydGFudCkgew0KKyAgICAgIEFwcGx5UHJvcGVydHkoRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplLCBwSW1wb3J0YW50LCBwQ29tcHV0ZWRTdHlsZSk7DQorICAgIH0gZWxzZSBpZiAocExhc3Rlc3QpIHsNCisgICAgICBBcHBseVByb3BlcnR5KEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSwgcExhc3Rlc3QsIHBDb21wdXRlZFN0eWxlKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5IGltcG9ydGFudHM7DQorICAgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsID0gTlVMTDsNCisgICAgRkRFX0NTU1BST1BFUlRZIGVQcm9wOw0KKyAgICBGWF9QT1NJVElPTiBwb3M7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpRGVjbENvdW50OyArK2kpIHsNCisgICAgICBwRGVjbCA9IHBwRGVjbEFycmF5W2ldOw0KKyAgICAgIHBvcyA9IHBEZWNsLT5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgICAgd2hpbGUgKHBvcyAhPSBOVUxMKSB7DQorICAgICAgICBwRGVjbC0+R2V0TmV4dFByb3BlcnR5KHBvcywgZVByb3AsIHBWYWwsIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgaWYgKGVQcm9wID09IEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSBpZiAoIWJJbXBvcnRhbnQpIHsNCisgICAgICAgICAgQXBwbHlQcm9wZXJ0eShlUHJvcCwgcFZhbCwgcENvbXB1dGVkU3R5bGUpOw0KKyAgICAgICAgfSBlbHNlIGlmIChpbXBvcnRhbnRzLkdldFNpemUoKSA9PSAwIHx8DQorICAgICAgICAgICAgICAgICAgIGltcG9ydGFudHNbaW1wb3J0YW50cy5HZXRVcHBlckJvdW5kKCldICE9IHBEZWNsKSB7DQorICAgICAgICAgIGltcG9ydGFudHMuQWRkKChJRkRFX0NTU0RlY2xhcmF0aW9uKilwRGVjbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlEZWNsQ291bnQgPSBpbXBvcnRhbnRzLkdldFNpemUoKTsNCisgICAgZm9yIChpID0gMDsgaSA8IGlEZWNsQ291bnQ7ICsraSkgew0KKyAgICAgIHBEZWNsID0gaW1wb3J0YW50c1tpXTsNCisgICAgICBwb3MgPSBwRGVjbC0+R2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICAgIHdoaWxlIChwb3MgIT0gTlVMTCkgew0KKyAgICAgICAgcERlY2wtPkdldE5leHRQcm9wZXJ0eShwb3MsIGVQcm9wLCBwVmFsLCBiSW1wb3J0YW50KTsNCisgICAgICAgIGlmIChiSW1wb3J0YW50ICYmIGVQcm9wICE9IEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSkgew0KKyAgICAgICAgICBBcHBseVByb3BlcnR5KGVQcm9wLCBwVmFsLCBwQ29tcHV0ZWRTdHlsZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZSwgd3NWYWx1ZTsNCisgICAgcG9zID0gcERlY2wtPkdldFN0YXJ0Q3VzdG9tKCk7DQorICAgIHdoaWxlIChwb3MpIHsNCisgICAgICBwRGVjbC0+R2V0TmV4dEN1c3RvbShwb3MsIHdzTmFtZSwgd3NWYWx1ZSk7DQorICAgICAgcENvbXB1dGVkU3R5bGUtPkFkZEN1c3RvbVN0eWxlKHdzTmFtZSwgd3NWYWx1ZSk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OkFwcGVuZElubGluZVN0eWxlKENGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4pIHsNCisgIEZYU1lTX2Fzc2VydChwRGVjbCAhPSBOVUxMICYmIHBzeiAhPSBOVUxMICYmIGlMZW4gPiAwKTsNCisgIElGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4ID0gSUZERV9DU1NTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KKyAgaWYgKHBTeW50YXggPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocFN5bnRheC0+SW5pdChwc3osIGlMZW4sIDMyLCBUUlVFKSkgew0KKyAgICBpbnQzMl90IGlMZW47DQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3o7DQorICAgIEZERV9DU1NQUk9QRVJUWUFSR1MgYXJnczsNCisgICAgYXJncy5wU3RyaW5nQ2FjaGUgPSBOVUxMOw0KKyAgICBhcmdzLnBTdGF0aWNTdG9yZSA9IG1fcElubGluZVN0eWxlU3RvcmU7DQorICAgIGFyZ3MucFByb3BlcnR5ID0gTlVMTDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgICBmb3IgKDs7KSB7DQorICAgICAgRkRFX0NTU1NZTlRBWFNUQVRVUyBlU3RhdHVzID0gcFN5bnRheC0+RG9TeW50YXhQYXJzZSgpOw0KKyAgICAgIGlmIChlU3RhdHVzID09IEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lKSB7DQorICAgICAgICBwc3ogPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlMZW4pOw0KKyAgICAgICAgYXJncy5wUHJvcGVydHkgPSBGREVfR2V0Q1NTUHJvcGVydHlCeU5hbWUocHN6LCBpTGVuKTsNCisgICAgICAgIGlmIChhcmdzLnBQcm9wZXJ0eSA9PSBOVUxMKSB7DQorICAgICAgICAgIHdzTmFtZSA9IENGWF9XaWRlU3RyaW5nQyhwc3osIGlMZW4pOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoZVN0YXR1cyA9PSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWUpIHsNCisgICAgICAgIGlmIChhcmdzLnBQcm9wZXJ0eSAhPSBOVUxMKSB7DQorICAgICAgICAgIHBzeiA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaUxlbik7DQorICAgICAgICAgIGlmIChpTGVuID4gMCkgew0KKyAgICAgICAgICAgIHBEZWNsLT5BZGRQcm9wZXJ0eSgmYXJncywgcHN6LCBpTGVuKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChpTGVuID4gMCkgew0KKyAgICAgICAgICBwc3ogPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlMZW4pOw0KKyAgICAgICAgICBpZiAoaUxlbiA+IDApIHsNCisgICAgICAgICAgICBwRGVjbC0+QWRkUHJvcGVydHkoJmFyZ3MsIHdzTmFtZSwgd3NOYW1lLkdldExlbmd0aCgpLCBwc3osIGlMZW4pOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcFN5bnRheC0+UmVsZWFzZSgpOw0KK30NCit2b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6QXBwbHlQcm9wZXJ0eSgNCisgICAgRkRFX0NTU1BST1BFUlRZIGVQcm9wZXJ0eSwNCisgICAgSUZERV9DU1NWYWx1ZSogcFZhbHVlLA0KKyAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBDb21wdXRlZFN0eWxlKSB7DQorI2RlZmluZSBGREVfQ1NTTk9OSU5IRVJJVFMgKHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEpDQorI2RlZmluZSBGREVfQ1NTSU5IRVJJVFMgKHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEpDQorI2RlZmluZSBGREVfQ1NTRk9OVFNJWkUgKEZERV9DU1NJTkhFUklUUy5tX2ZGb250U2l6ZSkNCisgIGlmIChwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fcEZvbnRGYW1pbHkgJiYNCisgICAgICAqKEZYX0RXT1JEKilwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fcEZvbnRGYW1pbHkgPT0gMHhjZGNkY2RjZCkgew0KKyAgICBwQ29tcHV0ZWRTdHlsZSA9IHBDb21wdXRlZFN0eWxlOw0KKyAgfQ0KKyAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlKSB7DQorICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIHBQcmltaXRpdmUgPSAoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopcFZhbHVlOw0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZSA9IHBQcmltaXRpdmUtPkdldFByaW1pdGl2ZVR5cGUoKTsNCisgICAgc3dpdGNoIChlUHJvcGVydHkpIHsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9EaXNwbGF5Og0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZURpc3BsYXkgPSBUb0Rpc3BsYXkocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplOiB7DQorICAgICAgICBGWF9GTE9BVCYgZkZvbnRTaXplID0gRkRFX0NTU0ZPTlRTSVpFOw0KKyAgICAgICAgaWYgKGVUeXBlID49IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciAmJg0KKyAgICAgICAgICAgIGVUeXBlIDw9IEZERV9DU1NQUklNSVRJVkVUWVBFX1BDKSB7DQorICAgICAgICAgIGZGb250U2l6ZSA9IEFwcGx5TnVtYmVyKGVUeXBlLCBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpLCBmRm9udFNpemUpOw0KKyAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIGZGb250U2l6ZSA9IFRvRm9udFNpemUocFByaW1pdGl2ZS0+R2V0RW51bSgpLCBmRm9udFNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGluZUhlaWdodDoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIpIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZkxpbmVIZWlnaHQgPQ0KKyAgICAgICAgICAgICAgcFByaW1pdGl2ZS0+R2V0RmxvYXQoKSAqIEZERV9DU1NGT05UU0laRTsNCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPiBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYNCisgICAgICAgICAgICAgICAgICAgZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZkxpbmVIZWlnaHQgPQ0KKyAgICAgICAgICAgICAgQXBwbHlOdW1iZXIoZVR5cGUsIHBQcmltaXRpdmUtPkdldEZsb2F0KCksIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9UZXh0QWxpZ246DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lVGV4dEFsaWdoID0gVG9UZXh0QWxpZ24ocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHRJbmRlbnQ6DQorICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTSU5IRVJJVFMubV9UZXh0SW5kZW50LCBlVHlwZSwgcFByaW1pdGl2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Gb250V2VpZ2h0Og0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fd0ZvbnRXZWlnaHQgPSBUb0ZvbnRXZWlnaHQocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyKSB7DQorICAgICAgICAgIGludDMyX3QgaVZhbHVlID0gKGludDMyX3QpcFByaW1pdGl2ZS0+R2V0RmxvYXQoKSAvIDEwMDsNCisgICAgICAgICAgaWYgKGlWYWx1ZSA+PSAxICYmIGlWYWx1ZSA8PSA5KSB7DQorICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fd0ZvbnRXZWlnaHQgPSBpVmFsdWUgKiAxMDA7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0ZvbnRTdHlsZToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VGb250U3R5bGUgPSBUb0ZvbnRTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ29sb3I6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2R3Rm9udENvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX01hcmdpbkxlZnQ6DQorICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzTWFyZ2luIHw9DQorICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTWFyZ2luV2lkdGgubGVmdCwgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX01hcmdpblRvcDoNCisgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNNYXJnaW4gfD0NCisgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9NYXJnaW5XaWR0aC50b3AsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5SaWdodDoNCisgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNNYXJnaW4gfD0NCisgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9NYXJnaW5XaWR0aC5yaWdodCwgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX01hcmdpbkJvdHRvbToNCisgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNNYXJnaW4gfD0NCisgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9NYXJnaW5XaWR0aC5ib3R0b20sIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nTGVmdDoNCisgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNQYWRkaW5nIHw9DQorICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fUGFkZGluZ1dpZHRoLmxlZnQsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nVG9wOg0KKyAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc1BhZGRpbmcgfD0NCisgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9QYWRkaW5nV2lkdGgudG9wLCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1JpZ2h0Og0KKyAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc1BhZGRpbmcgfD0NCisgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9QYWRkaW5nV2lkdGgucmlnaHQsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nQm90dG9tOg0KKyAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc1BhZGRpbmcgfD0NCisgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9QYWRkaW5nV2lkdGguYm90dG9tLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVUeXBlLCBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFdpZHRoOg0KKyAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc0JvcmRlciB8PQ0KKyAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0JvcmRlcldpZHRoLmxlZnQsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BXaWR0aDoNCisgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNCb3JkZXIgfD0NCisgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Cb3JkZXJXaWR0aC50b3AsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFdpZHRoOg0KKyAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc0JvcmRlciB8PQ0KKyAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0JvcmRlcldpZHRoLnJpZ2h0LCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tV2lkdGg6DQorICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzQm9yZGVyIHw9DQorICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQm9yZGVyV2lkdGguYm90dG9tLCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFN0eWxlOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZUJEUkxlZnRTdHlsZSA9DQorICAgICAgICAgICAgICBUb0JvcmRlclN0eWxlKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BTdHlsZToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VCRFJUb3BTdHlsZSA9DQorICAgICAgICAgICAgICBUb0JvcmRlclN0eWxlKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFN0eWxlOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZUJEUlJpZ2h0U3R5bGUgPQ0KKyAgICAgICAgICAgICAgVG9Cb3JkZXJTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tU3R5bGU6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lQkRSQm90dG9tU3R5bGUgPQ0KKyAgICAgICAgICAgICAgVG9Cb3JkZXJTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdENvbG9yOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd0JEUkxlZnRDb2xvciA9IHBQcmltaXRpdmUtPkdldFJHQkNvbG9yKCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BDb2xvcjoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdCRFJUb3BDb2xvciA9IHBQcmltaXRpdmUtPkdldFJHQkNvbG9yKCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodENvbG9yOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd0JEUlJpZ2h0Q29sb3IgPSBwUHJpbWl0aXZlLT5HZXRSR0JDb2xvcigpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tQ29sb3I6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2R3QkRSQm90dG9tQ29sb3IgPSBwUHJpbWl0aXZlLT5HZXRSR0JDb2xvcigpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlVHlwZToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VMaXN0U3R5bGVUeXBlID0NCisgICAgICAgICAgICAgIFRvTGlzdFN0eWxlVHlwZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlUG9zaXRpb246DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lTGlzdFN0eWxlUG9zaXRpb24gPQ0KKyAgICAgICAgICAgICAgVG9MaXN0U3R5bGVQb3NpdGlvbihwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZENvbG9yOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd0JLR0NvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd0JLR0NvbG9yID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1Zpc2liaWxpdHk6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lVmlzaWJpbGl0eSA9IFRvVmlzaWJpbGl0eShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfV2lkdGg6DQorICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Cb3hTaXplLmN4LCBlVHlwZSwgcFByaW1pdGl2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9IZWlnaHQ6DQorICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Cb3hTaXplLmN5LCBlVHlwZSwgcFByaW1pdGl2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NaW5XaWR0aDoNCisgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01pbkJveFNpemUuY3gsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX01pbkhlaWdodDoNCisgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01pbkJveFNpemUuY3ksIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX01heFdpZHRoOg0KKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTWF4Qm94U2l6ZS5jeCwgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWF4SGVpZ2h0Og0KKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTWF4Qm94U2l6ZS5jeSwgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfVmVydGljYWxBbGlnbjoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VWZXJ0aWNhbEFsaWduID0NCisgICAgICAgICAgICAgIFRvVmVydGljYWxBbGlnbihwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYNCisgICAgICAgICAgICAgICAgICAgZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZVZlcnRpY2FsQWxpZ24gPSBGREVfQ1NTVkVSVElDQUxBTElHTl9OdW1iZXI7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2ZWZXJ0aWNhbEFsaWduID0NCisgICAgICAgICAgICAgIEFwcGx5TnVtYmVyKGVUeXBlLCBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfV2hpdGVTcGFjZToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VXaGl0ZVNwYWNlID0gVG9XaGl0ZVNwYWNlKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9UZXh0VHJhbnNmb3JtOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVRleHRUcmFuc2Zvcm0gPQ0KKyAgICAgICAgICAgICAgVG9UZXh0VHJhbnNmb3JtKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Gb250VmFyaWFudDoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VGb250VmFyaWFudCA9IFRvRm9udFZhcmlhbnQocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0xldHRlclNwYWNpbmc6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudCkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9MZXR0ZXJTcGFjaW5nLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Ob3JtYWwpOw0KKyAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYNCisgICAgICAgICAgICAgICAgICAgZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpIHsNCisgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU0lOSEVSSVRTLm1fTGV0dGVyU3BhY2luZywgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Xb3JkU3BhY2luZzoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QZXJjZW50KSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX1dvcmRTcGFjaW5nLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Ob3JtYWwpOw0KKyAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYNCisgICAgICAgICAgICAgICAgICAgZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpIHsNCisgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU0lOSEVSSVRTLm1fV29yZFNwYWNpbmcsIGVUeXBlLCBwUHJpbWl0aXZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfRmxvYXQ6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lRmxvYXQgPSBUb0Zsb2F0KHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9DbGVhcjoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VDbGVhciA9IFRvQ2xlYXIocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1dyaXRpbmdNb2RlOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVdyaXRpbmdNb2RlID0gVG9Xcml0aW5nTW9kZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfV29yZEJyZWFrOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVdvcmRCcmVhayA9IFRvV29yZEJyZWFrKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9XaWRvd3M6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2lXaWRvd3MgPSAoaW50MzJfdClwUHJpbWl0aXZlLT5HZXRGbG9hdCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfT3JwaGFuczoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIpIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1faU9ycGhhbnMgPSAoaW50MzJfdClwUHJpbWl0aXZlLT5HZXRGbG9hdCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzQ29sb3I6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBzd2l0Y2ggKHBQcmltaXRpdmUtPkdldEVudW0oKSkgew0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJhbnNwYXJlbnQ6DQorICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9kd1RleHRFbXBoYXNpc0NvbG9yID0gMDsNCisgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2JUZXh0RW1waGFzaXNDb2xvckN1cnJlbnQgPSBGQUxTRTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ3VycmVudGNvbG9yOg0KKyAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fYlRleHRFbXBoYXNpc0NvbG9yQ3VycmVudCA9IFRSVUU7DQorICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2R3VGV4dEVtcGhhc2lzQ29sb3IgPSBwUHJpbWl0aXZlLT5HZXRSR0JDb2xvcigpOw0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9iVGV4dEVtcGhhc2lzQ29sb3JDdXJyZW50ID0gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtCZWZvcmU6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lUGFnZUJyZWFrQmVmb3JlID0NCisgICAgICAgICAgICAgIFRvUGFnZUJyZWFrKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtBZnRlcjoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VQYWdlQnJlYWtBZnRlciA9DQorICAgICAgICAgICAgICBUb1BhZ2VCcmVhayhwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrSW5zaWRlOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZVBhZ2VCcmVha0luc2lkZSA9DQorICAgICAgICAgICAgICBUb1BhZ2VCcmVhayhwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3dYOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZU92ZXJmbG93WCA9IFRvT3ZlcmZsb3cocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VPdmVyZmxvd1kgPSBUb092ZXJmbG93KHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9MaW5lQnJlYWs6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lTGluZUJyZWFrID0gVG9MaW5lQnJlYWsocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbHVtbkNvdW50Og0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fQ29sdW1uQ291bnQuU2V0KEZERV9DU1NMRU5HVEhVTklUX0F1dG8pOw0KKyAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIpIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fQ29sdW1uQ291bnQuU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZS0+R2V0RmxvYXQoKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5HYXA6DQorICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Db2x1bW5HYXAsIGVUeXBlLCBwUHJpbWl0aXZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVDb2xvcjoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdDb2x1bW5SdWxlQ29sb3IgPSBwUHJpbWl0aXZlLT5HZXRSR0JDb2xvcigpOw0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iQ29sdW1uUnVsZUNvbG9yU2FtZSA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVN0eWxlOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZUNvbHVtblJ1bGVTdHlsZSA9DQorICAgICAgICAgICAgICBUb0JvcmRlclN0eWxlKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlV2lkdGg6DQorICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Db2x1bW5SdWxlV2lkdGgsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbHVtbldpZHRoOg0KKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQ29sdW1uV2lkdGgsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRJbWFnZToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BzekJLR0ltYWdlID0gTlVMTDsNCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJKSB7DQorICAgICAgICAgIGludDMyX3QgaUxlbmd0aDsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fcHN6QktHSW1hZ2UgPSBwUHJpbWl0aXZlLT5HZXRTdHJpbmcoaUxlbmd0aCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Qb3NpdGlvbjoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VQb3NpdGlvbiA9IFRvUG9zaXRpb24ocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RvcDoNCisgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX1RvcCwgZVR5cGUsIHBQcmltaXRpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm90dG9tOg0KKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQm90dG9tLCBlVHlwZSwgcFByaW1pdGl2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9MZWZ0Og0KKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTGVmdCwgZVR5cGUsIHBQcmltaXRpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUmlnaHQ6DQorICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9SaWdodCwgZVR5cGUsIHBQcmltaXRpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlSW1hZ2U6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9wc3pMaXN0U3R5bGVJbWFnZSA9IE5VTEw7DQorICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1VSSSkgew0KKyAgICAgICAgICBpbnQzMl90IGlMZW5ndGg7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX3Bzekxpc3RTdHlsZUltYWdlID0gcFByaW1pdGl2ZS0+R2V0U3RyaW5nKGlMZW5ndGgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ2FwdGlvblNpZGU6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lQ2FwdGlvblNpZGUgPSBUb0NhcHRpb25TaWRlKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUmVwZWF0Og0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZUJLR1JlcGVhdCA9IFRvQktHUmVwZWF0KHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kQXR0YWNobWVudDoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VCS0dBdHRhY2htZW50ID0NCisgICAgICAgICAgICAgIFRvQktHQXR0YWNobWVudChwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieUFsaWduOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVJ1YnlBbGlnbiA9IFRvUnVieUFsaWduKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9SdWJ5T3Zlcmhhbmc6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lUnVieU92ZXJoYW5nID0NCisgICAgICAgICAgICAgIFRvUnVieU92ZXJoYW5nKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9SdWJ5UG9zaXRpb246DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lUnVieVBvc2l0aW9uID0NCisgICAgICAgICAgICAgIFRvUnVieVBvc2l0aW9uKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9SdWJ5U3BhbjoNCisgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BSdWJ5U3BhbiA9IHBQcmltaXRpdmU7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0gZWxzZSBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gRkRFX0NTU1ZBTFVFVFlQRV9MaXN0KSB7DQorICAgIElGREVfQ1NTVmFsdWVMaXN0KiBwTGlzdCA9IChJRkRFX0NTU1ZhbHVlTGlzdCopcFZhbHVlOw0KKyAgICBpbnQzMl90IGlDb3VudCA9IHBMaXN0LT5Db3VudFZhbHVlcygpOw0KKyAgICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICAgIHN3aXRjaCAoZVByb3BlcnR5KSB7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Gb250RmFtaWx5Og0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9wRm9udEZhbWlseSA9IHBMaXN0Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHREZWNvcmF0aW9uOg0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd1RleHREZWNvcmF0aW9uID0gVG9UZXh0RGVjb3JhdGlvbihwTGlzdCk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ291bnRlckluY3JlbWVudDogew0KKyAgICAgICAgICBpZiAoRkRFX0NTU05PTklOSEVSSVRTLm1fcENvdW50ZXJTdHlsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fcENvdW50ZXJTdHlsZSA9IG5ldyBDRkRFX0NTU0NvdW50ZXJTdHlsZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9wQ291bnRlclN0eWxlLT5TZXRDb3VudGVySW5jcmVtZW50TGlzdChwTGlzdCk7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ291bnRlclJlc2V0OiB7DQorICAgICAgICAgIGlmIChGREVfQ1NTTk9OSU5IRVJJVFMubV9wQ291bnRlclN0eWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9wQ291bnRlclN0eWxlID0gbmV3IENGREVfQ1NTQ291bnRlclN0eWxlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BDb3VudGVyU3R5bGUtPlNldENvdW50ZXJSZXNldExpc3QocExpc3QpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbnRlbnQ6DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BDb250ZW50TGlzdCA9IHBMaXN0Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1F1b3RlczoNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fcFF1b3RlcyA9IHBMaXN0Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHRDb21iaW5lOiB7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBMaXN0LT5Db3VudFZhbHVlcygpOyBpKyspIHsNCisgICAgICAgICAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKiBwVmFsID0NCisgICAgICAgICAgICAgICAgKElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqKXBMaXN0LT5HZXRWYWx1ZShpKTsNCisgICAgICAgICAgICBzd2l0Y2ggKHBWYWwtPkdldFByaW1pdGl2ZVR5cGUoKSkgew0KKyAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtOiB7DQorICAgICAgICAgICAgICAgIHN3aXRjaCAocFZhbC0+R2V0RW51bSgpKSB7DQorICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOiB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lVGV4dENvbWJpbmUgPSBGREVfQ1NTVEVYVENPTUJJTkVfTm9uZTsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNUZXh0Q29tYmluZU51bWJlciA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ib3Jpem9udGFsOiB7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lVGV4dENvbWJpbmUgPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NURVhUQ09NQklORV9Ib3Jpem9udGFsOw0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc1RleHRDb21iaW5lTnVtYmVyID0gRkFMU0U7DQorICAgICAgICAgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjoNCisgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZlRleHRDb21iaW5lTnVtYmVyID0gcFZhbC0+R2V0RmxvYXQoKTsNCiAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gRkRFX0NTU1ZBTFVFVFlQRV9MaXN0KSB7DQotICAgICAgICBJRkRFX0NTU1ZhbHVlTGlzdCAqcExpc3QgPSAoSUZERV9DU1NWYWx1ZUxpc3QqKXBWYWx1ZTsNCi0gICAgICAgIGludDMyX3QgaUNvdW50ID0gcExpc3QtPkNvdW50VmFsdWVzKCk7DQotICAgICAgICBpZiAoaUNvdW50ID4gMCkgew0KLSAgICAgICAgICAgIHN3aXRjaCAoZVByb3BlcnR5KSB7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0ZvbnRGYW1pbHk6DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9wRm9udEZhbWlseSA9IHBMaXN0Ow0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHREZWNvcmF0aW9uOg0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdUZXh0RGVjb3JhdGlvbiA9IFRvVGV4dERlY29yYXRpb24ocExpc3QpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvdW50ZXJJbmNyZW1lbnQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX0NTU05PTklOSEVSSVRTLm1fcENvdW50ZXJTdHlsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BDb3VudGVyU3R5bGUgPSBuZXcgQ0ZERV9DU1NDb3VudGVyU3R5bGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BDb3VudGVyU3R5bGUtPlNldENvdW50ZXJJbmNyZW1lbnRMaXN0KHBMaXN0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db3VudGVyUmVzZXQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX0NTU05PTklOSEVSSVRTLm1fcENvdW50ZXJTdHlsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BDb3VudGVyU3R5bGUgPSBuZXcgQ0ZERV9DU1NDb3VudGVyU3R5bGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BDb3VudGVyU3R5bGUtPlNldENvdW50ZXJSZXNldExpc3QocExpc3QpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbnRlbnQ6DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9wQ29udGVudExpc3QgPSBwTGlzdDsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9RdW90ZXM6DQotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9wUXVvdGVzID0gcExpc3Q7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfVGV4dENvbWJpbmU6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwTGlzdC0+Q291bnRWYWx1ZXMoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBWYWwgPSAoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopcExpc3QtPkdldFZhbHVlKGkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBWYWwtPkdldFByaW1pdGl2ZVR5cGUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFZhbC0+R2V0RW51bSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZVRleHRDb21iaW5lID0gRkRFX0NTU1RFWFRDT01CSU5FX05vbmU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNUZXh0Q29tYmluZU51bWJlciA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSG9yaXpvbnRhbDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lVGV4dENvbWJpbmUgPSBGREVfQ1NTVEVYVENPTUJJTkVfSG9yaXpvbnRhbDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc1RleHRDb21iaW5lTnVtYmVyID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2ZUZXh0Q29tYmluZU51bWJlciA9IHBWYWwtPkdldEZsb2F0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpc1N0eWxlOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1RFWFRFTVBIQVNJU0ZJTEwgZUZpbGw7DQotICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUksgZU1hcms7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcExpc3QtPkNvdW50VmFsdWVzKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwVmFsID0gKElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqKXBMaXN0LT5HZXRWYWx1ZShpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwVmFsLT5HZXRQcmltaXRpdmVUeXBlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVG9UZXh0RW1waGFzaXNGaWxsKHBWYWwtPkdldEVudW0oKSwgZUZpbGwpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lVGV4dEVtcGhhc2lzRmlsbCA9IGVGaWxsOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVG9UZXh0RW1waGFzaXNNYXJrKHBWYWwtPkdldEVudW0oKSwgZU1hcmspKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lVGV4dEVtcGhhc2lzTWFyayA9IGVNYXJrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVRleHRFbXBoYXNpc01hcmsgPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19DdXN0b207DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fcHN6VGV4dEVtcGhhc2lzQ3VzdG9tTWFyayA9IHBWYWwtPkdldFN0cmluZyhpTGVuKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQotICAgIH0NCi19DQotRlhfRkxPQVQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpBcHBseU51bWJlcihGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVW5pdCwgRlhfRkxPQVQgZlZhbHVlLCBGWF9GTE9BVCBmUGVyY2VudEJhc2UpDQotew0KLSAgICBzd2l0Y2ggKGVVbml0KSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1BYOg0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6DQotICAgICAgICAgICAgcmV0dXJuIGZWYWx1ZSAqIDcyIC8gOTY7DQotICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1BUOg0KLSAgICAgICAgICAgIHJldHVybiBmVmFsdWU7DQotICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX0VNUzoNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfRVhTOg0KLSAgICAgICAgICAgIHJldHVybiBmVmFsdWUgKiBmUGVyY2VudEJhc2U7DQotICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1BlcmNlbnQ6DQotICAgICAgICAgICAgcmV0dXJuIGZWYWx1ZSAqIGZQZXJjZW50QmFzZSAvIDEwMC4wZjsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfQ006DQotICAgICAgICAgICAgcmV0dXJuIGZWYWx1ZSAqIDI4LjM0NjRmOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9NTToNCi0gICAgICAgICAgICByZXR1cm4gZlZhbHVlICogMi44MzQ2ZjsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfSU46DQotICAgICAgICAgICAgcmV0dXJuIGZWYWx1ZSAqIDcyLjBmOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QQzoNCi0gICAgICAgICAgICByZXR1cm4gZlZhbHVlIC8gMTIuMGY7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9UZXh0RW1waGFzaXNTdHlsZTogew0KKyAgICAgICAgICBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTCBlRmlsbDsNCisgICAgICAgICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUksgZU1hcms7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBMaXN0LT5Db3VudFZhbHVlcygpOyBpKyspIHsNCisgICAgICAgICAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKiBwVmFsID0NCisgICAgICAgICAgICAgICAgKElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqKXBMaXN0LT5HZXRWYWx1ZShpKTsNCisgICAgICAgICAgICBzd2l0Y2ggKHBWYWwtPkdldFByaW1pdGl2ZVR5cGUoKSkgew0KKyAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtOiB7DQorICAgICAgICAgICAgICAgIGlmIChUb1RleHRFbXBoYXNpc0ZpbGwocFZhbC0+R2V0RW51bSgpLCBlRmlsbCkpIHsNCisgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lVGV4dEVtcGhhc2lzRmlsbCA9IGVGaWxsOw0KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRvVGV4dEVtcGhhc2lzTWFyayhwVmFsLT5HZXRFbnVtKCksIGVNYXJrKSkgew0KKyAgICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VUZXh0RW1waGFzaXNNYXJrID0gZU1hcms7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZzogew0KKyAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lVGV4dEVtcGhhc2lzTWFyayA9DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19DdXN0b207DQorICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbjsNCisgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fcHN6VGV4dEVtcGhhc2lzQ3VzdG9tTWFyayA9DQorICAgICAgICAgICAgICAgICAgICBwVmFsLT5HZXRTdHJpbmcoaUxlbik7DQorICAgICAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gZlZhbHVlOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQogICAgIH0NCisgIH0gZWxzZSB7DQorICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICB9DQogfQ0KLUZERV9DU1NSVUJZU1BBTglDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvUnVieVNwYW4oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KLXsNCi0gICAgc3dpdGNoIChlVmFsdWUpIHsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZU1BBTl9Ob25lOw0KK0ZYX0ZMT0FUIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6QXBwbHlOdW1iZXIoRkRFX0NTU1BSSU1JVElWRVRZUEUgZVVuaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVyY2VudEJhc2UpIHsNCisgIHN3aXRjaCAoZVVuaXQpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QWDoNCisgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6DQorICAgICAgcmV0dXJuIGZWYWx1ZSAqIDcyIC8gOTY7DQorICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfUFQ6DQorICAgICAgcmV0dXJuIGZWYWx1ZTsNCisgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FTVM6DQorICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfRVhTOg0KKyAgICAgIHJldHVybiBmVmFsdWUgKiBmUGVyY2VudEJhc2U7DQorICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudDoNCisgICAgICByZXR1cm4gZlZhbHVlICogZlBlcmNlbnRCYXNlIC8gMTAwLjBmOw0KKyAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX0NNOg0KKyAgICAgIHJldHVybiBmVmFsdWUgKiAyOC4zNDY0ZjsNCisgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9NTToNCisgICAgICByZXR1cm4gZlZhbHVlICogMi44MzQ2ZjsNCisgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9JTjoNCisgICAgICByZXR1cm4gZlZhbHVlICogNzIuMGY7DQorICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfUEM6DQorICAgICAgcmV0dXJuIGZWYWx1ZSAvIDEyLjBmOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBmVmFsdWU7DQorICB9DQorfQ0KK0ZERV9DU1NSVUJZU1BBTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvUnVieVNwYW4oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZU1BBTl9Ob25lOw0KKyAgfQ0KK30NCitGREVfQ1NTUlVCWVBPU0lUSU9OIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9SdWJ5UG9zaXRpb24oDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CZWZvcmU6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZUE9TSVRJT05fQmVmb3JlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0FmdGVyOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUlVCWVBPU0lUSU9OX0FmdGVyOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZ2h0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTUlVCWVBPU0lUSU9OX1JpZ2h0Ow0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZToNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllQT1NJVElPTl9JbmxpbmU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZUE9TSVRJT05fQmVmb3JlOw0KKyAgfQ0KK30NCitGREVfQ1NTUlVCWU9WRVJIQU5HIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9SdWJ5T3ZlcmhhbmcoDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUlVCWU9WRVJIQU5HX0F1dG87DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhcnQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZT1ZFUkhBTkdfU3RhcnQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRW5kOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUlVCWU9WRVJIQU5HX0VuZDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTUlVCWU9WRVJIQU5HX05vbmU7DQorICB9DQorfQ0KK0ZERV9DU1NSVUJZQUxJR04gQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1J1YnlBbGlnbigNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fQXV0bzsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdGFydDoNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9TdGFydDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MZWZ0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTUlVCWUFMSUdOX0VuZDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DZW50ZXI6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fQ2VudGVyOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0VuZDoNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9FbmQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fUmlnaHQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzdHJpYnV0ZUxldHRlcjoNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9EaXN0cmlidXRlTGV0dGVyOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rpc3RyaWJ1dGVTcGFjZToNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9EaXN0cmlidXRlU3BhY2U7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGluZUVkZ2U6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fTGluZUVkZ2U7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fQXV0bzsNCisgIH0NCit9DQorRlhfQk9PTCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVGV4dEVtcGhhc2lzTWFyaygNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlLA0KKyAgICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSSyYgZU1hcmspIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICBlTWFyayA9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX05vbmU7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG90Og0KKyAgICAgIGVNYXJrID0gRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfRG90Ow0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NpcmNsZToNCisgICAgICBlTWFyayA9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0NpcmNsZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGVDaXJjbGU6DQorICAgICAgZU1hcmsgPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19Eb3VibGVDaXJjbGU7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJpYW5nbGU6DQorICAgICAgZU1hcmsgPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19UcmlhbmdsZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TZXNhbWU6DQorICAgICAgZU1hcmsgPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19TZXNhbWU7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KK30NCitGWF9CT09MIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9UZXh0RW1waGFzaXNGaWxsKA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUsDQorICAgIEZERV9DU1NURVhURU1QSEFTSVNGSUxMJiBlRmlsbCkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaWxsZWQ6DQorICAgICAgZUZpbGwgPSBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTF9GaWxsZWQ7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3BlbjoNCisgICAgICBlRmlsbCA9IEZERV9DU1NURVhURU1QSEFTSVNGSUxMX09wZW47DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KK30NCitGREVfQ1NTQktHQVRUQUNITUVOVCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvQktHQXR0YWNobWVudCgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0ZpeGVkOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQktHQVRUQUNITUVOVF9GaXhlZDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TY3JvbGw6DQorICAgICAgcmV0dXJuIEZERV9DU1NCS0dBVFRBQ0hNRU5UX1Njcm9sbDsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0JLR0FUVEFDSE1FTlRfRml4ZWQ7DQorICB9DQorfQ0KK0ZERV9DU1NDQVBUSU9OU0lERSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvQ2FwdGlvblNpZGUoDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ub3A6DQorICAgICAgcmV0dXJuIEZERV9DU1NDQVBUSU9OU0lERV9Ub3A7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm90dG9tOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQ0FQVElPTlNJREVfQm90dG9tOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NDQVBUSU9OU0lERV9MZWZ0Ow0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZ2h0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTQ0FQVElPTlNJREVfUmlnaHQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQmVmb3JlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQ0FQVElPTlNJREVfQmVmb3JlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0FmdGVyOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQ0FQVElPTlNJREVfQWZ0ZXI7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NDQVBUSU9OU0lERV9Ub3A7DQorICB9DQorfQ0KK0ZERV9DU1NQT1NJVElPTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvUG9zaXRpb24oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N0YXRpYzoNCisgICAgICByZXR1cm4gRkRFX0NTU1BPU0lUSU9OX1N0YXRpYzsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZWxhdGl2ZToNCisgICAgICByZXR1cm4gRkRFX0NTU1BPU0lUSU9OX1JlbGF0aXZlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0ZpeGVkOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUE9TSVRJT05fRml4ZWQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQWJzb2x1dGU6DQorICAgICAgcmV0dXJuIEZERV9DU1NQT1NJVElPTl9BYnNvbHV0ZTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU1BPU0lUSU9OX1N0YXRpYzsNCisgIH0NCit9DQorRkRFX0NTU0NVUlNPUiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvQ3Vyc29yKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX0F1dG87DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ3Jvc3NoYWlyOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX0Nyb3NzaGFpcjsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX0RlZmF1bHQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUG9pbnRlcjoNCisgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9Qb2ludGVyOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX01vdmU6DQorICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfTW92ZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9FUmVzaXplOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX0VSZXNpemU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTmVSZXNpemU6DQorICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfTmVSZXNpemU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTndSZXNpemU6DQorICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfTndSZXNpemU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTlJlc2l6ZToNCisgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9OUmVzaXplOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NlUmVzaXplOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX1NlUmVzaXplOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N3UmVzaXplOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX1N3UmVzaXplOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX0F1dG87DQorICB9DQorfQ0KK0ZERV9DU1NCS0dSRVBFQVQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0JLR1JlcGVhdCgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0JLR1JFUEVBVF9SZXBlYXQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0WDoNCisgICAgICByZXR1cm4gRkRFX0NTU0JLR1JFUEVBVF9SZXBlYXRYOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFk6DQorICAgICAgcmV0dXJuIEZERV9DU1NCS0dSRVBFQVRfUmVwZWF0WTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob1JlcGVhdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0JLR1JFUEVBVF9Ob1JlcGVhdDsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0JLR1JFUEVBVF9SZXBlYXQ7DQorICB9DQorfQ0KK0ZERV9DU1NURVhUQ09NQklORSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVGV4dENvbWJpbmUoDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ib3Jpem9udGFsOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVEVYVENPTUJJTkVfSG9yaXpvbnRhbDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTVEVYVENPTUJJTkVfTm9uZTsNCisgIH0NCit9DQorRkRFX0NTU0xJTkVCUkVBSyBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvTGluZUJyZWFrKA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bzoNCisgICAgICByZXR1cm4gRkRFX0NTU0xJTkVCUkVBS19BdXRvOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvb3NlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElORUJSRUFLX0xvb3NlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbDoNCisgICAgICByZXR1cm4gRkRFX0NTU0xJTkVCUkVBS19Ob3JtYWw7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RyaWN0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTTElORUJSRUFLX1N0cmljdDsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0xJTkVCUkVBS19BdXRvOw0KKyAgfQ0KK30NCitGREVfQ1NTT1ZFUkZMT1cgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb092ZXJmbG93KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9WaXNpYmxlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTT1ZFUkZMT1dfVmlzaWJsZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRkZW46DQorICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19IaWRkZW47DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2Nyb2xsOg0KKyAgICAgIHJldHVybiBGREVfQ1NTT1ZFUkZMT1dfU2Nyb2xsOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQorICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19BdXRvOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vRGlzcGxheToNCisgICAgICByZXR1cm4gRkRFX0NTU09WRVJGTE9XX05vRGlzcGxheTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0NvbnRlbnQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19Ob0NvbnRlbnQ7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19WaXNpYmxlOw0KKyAgfQ0KK30NCitGREVfQ1NTV1JJVElOR01PREUgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1dyaXRpbmdNb2RlKA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSG9yaXpvbnRhbFRiOg0KKyAgICAgIHJldHVybiBGREVfQ1NTV1JJVElOR01PREVfSG9yaXpvbnRhbFRiOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ZlcnRpY2FsUmw6DQorICAgICAgcmV0dXJuIEZERV9DU1NXUklUSU5HTU9ERV9WZXJ0aWNhbFJsOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ZlcnRpY2FsTHI6DQorICAgICAgcmV0dXJuIEZERV9DU1NXUklUSU5HTU9ERV9WZXJ0aWNhbExyOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTV1JJVElOR01PREVfSG9yaXpvbnRhbFRiOw0KKyAgfQ0KK30NCitGREVfQ1NTV09SREJSRUFLIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9Xb3JkQnJlYWsoDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWw6DQorICAgICAgcmV0dXJuIEZERV9DU1NXT1JEQlJFQUtfTm9ybWFsOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0tlZXBBbGw6DQorICAgICAgcmV0dXJuIEZERV9DU1NXT1JEQlJFQUtfS2VlcEFsbDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CcmVha0FsbDoNCisgICAgICByZXR1cm4gRkRFX0NTU1dPUkRCUkVBS19CcmVha0FsbDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9LZWVwV29yZHM6DQorICAgICAgcmV0dXJuIEZERV9DU1NXT1JEQlJFQUtfS2VlcFdvcmRzOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTV09SREJSRUFLX05vcm1hbDsNCisgIH0NCit9DQorRkRFX0NTU0ZMT0FUIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9GbG9hdChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGVmdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0ZMT0FUX0xlZnQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NGTE9BVF9SaWdodDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgIHJldHVybiBGREVfQ1NTRkxPQVRfTm9uZTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0ZMT0FUX05vbmU7DQorICB9DQorfQ0KK0ZERV9DU1NDTEVBUiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvQ2xlYXIoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgcmV0dXJuIEZERV9DU1NDTEVBUl9Ob25lOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NDTEVBUl9MZWZ0Ow0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZ2h0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTQ0xFQVJfUmlnaHQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm90aDoNCisgICAgICByZXR1cm4gRkRFX0NTU0NMRUFSX0JvdGg7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NDTEVBUl9Ob25lOw0KKyAgfQ0KK30NCitGREVfQ1NTUEFHRUJSRUFLIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9QYWdlQnJlYWsoDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Bdm9pZDoNCisgICAgICByZXR1cm4gRkRFX0NTU1BBR0VCUkVBS19Bdm9pZDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUEFHRUJSRUFLX0F1dG87DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQWx3YXlzOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUEFHRUJSRUFLX0Fsd2F5czsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MZWZ0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTUEFHRUJSRUFLX0xlZnQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NQQUdFQlJFQUtfUmlnaHQ7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NQQUdFQlJFQUtfQXV0bzsNCisgIH0NCit9DQorRkRFX0NTU0RJU1BMQVkgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0Rpc3BsYXkoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZToNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfSW5saW5lOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Jsb2NrOg0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9CbG9jazsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9Ob25lOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xpc3RJdGVtOg0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9MaXN0SXRlbTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNlbGw6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlQ2VsbDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZVJvdzoNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVSb3c7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGU6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ2FwdGlvbjoNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVDYXB0aW9uOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlUm93R3JvdXA6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlUm93R3JvdXA7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVIZWFkZXJHcm91cDoNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVIZWFkZXJHcm91cDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUZvb3Rlckdyb3VwOg0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9UYWJsZUZvb3Rlckdyb3VwOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ29sdW1uR3JvdXA6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlQ29sdW1uR3JvdXA7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDb2x1bW46DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlQ29sdW1uOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZVRhYmxlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9JbmxpbmVUYWJsZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmVCbG9jazoNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfSW5saW5lQmxvY2s7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVuSW46DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1J1bkluOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1Ynk6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1J1Ynk7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieUJhc2U6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1J1YnlCYXNlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlUZXh0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9SdWJ5VGV4dDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5QmFzZUdyb3VwOg0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExTWV9SdWJ5QmFzZUdyb3VwOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlUZXh0R3JvdXA6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1J1YnlUZXh0R3JvdXA7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX0lubGluZTsNCisgIH0NCit9DQorRkRFX0NTU1RFWFRBTElHTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVGV4dEFsaWduKA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGVmdDoNCisgICAgICByZXR1cm4gRkRFX0NTU1RFWFRBTElHTl9MZWZ0Ow0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NlbnRlcjoNCisgICAgICByZXR1cm4gRkRFX0NTU1RFWFRBTElHTl9DZW50ZXI7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NURVhUQUxJR05fUmlnaHQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSnVzdGlmeToNCisgICAgICByZXR1cm4gRkRFX0NTU1RFWFRBTElHTl9KdXN0aWZ5Ow0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTVEVYVEFMSUdOX0xlZnQ7DQorICB9DQorfQ0KK0ZYX1dPUkQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0ZvbnRXZWlnaHQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbDoNCisgICAgICByZXR1cm4gNDAwOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JvbGQ6DQorICAgICAgcmV0dXJuIDcwMDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkZXI6DQorICAgICAgcmV0dXJuIDkwMDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaWdodGVyOg0KKyAgICAgIHJldHVybiAyMDA7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIDQwMDsNCisgIH0NCit9DQorRkRFX0NTU0ZPTlRTVFlMRSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvRm9udFN0eWxlKA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSXRhbGljOg0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX09ibGlxdWU6DQorICAgICAgcmV0dXJuIEZERV9DU1NGT05UU1RZTEVfSXRhbGljOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTRk9OVFNUWUxFX05vcm1hbDsNCisgIH0NCit9DQorRkRFX0NTU0JPUkRFUlNUWUxFIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9Cb3JkZXJTdHlsZSgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9Ob25lOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NvbGlkOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfU29saWQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfSGlkZGVuOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdHRlZDoNCisgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX0RvdHRlZDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EYXNoZWQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9EYXNoZWQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfRG91YmxlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0dyb292ZToNCisgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX0dyb292ZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWRnZToNCisgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX1JpZGdlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2V0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfSW5zZXQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3V0c2V0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfb3V0c2V0Ow0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfTm9uZTsNCisgIH0NCit9DQorRlhfQk9PTCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlNldExlbmd0aFdpdGhQZXJjZW50KA0KKyAgICBGREVfQ1NTTEVOR1RIJiB3aWR0aCwNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGUsDQorICAgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIHBQcmltaXRpdmUsDQorICAgIEZYX0ZMT0FUIGZGb250U2l6ZSkgew0KKyAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1BlcmNlbnQpIHsNCisgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BlcmNlbnQsIHBQcmltaXRpdmUtPkdldEZsb2F0KCkgLyAxMDAuMGYpOw0KKyAgICByZXR1cm4gd2lkdGguTm9uWmVybygpOw0KKyAgfSBlbHNlIGlmIChlVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYNCisgICAgICAgICAgICAgZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMpIHsNCisgICAgRlhfRkxPQVQgZlZhbHVlID0gQXBwbHlOdW1iZXIoZVR5cGUsIHBQcmltaXRpdmUtPkdldEZsb2F0KCksIGZGb250U2l6ZSk7DQorICAgIHdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgZlZhbHVlKTsNCisgICAgcmV0dXJuIHdpZHRoLk5vblplcm8oKTsNCisgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICBzd2l0Y2ggKHBQcmltaXRpdmUtPkdldEVudW0oKSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bzoNCisgICAgICAgIHdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9BdXRvKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICAgIHdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Ob25lKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpbjoNCisgICAgICAgIHdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgMik7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX01lZGl1bToNCisgICAgICAgIHdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgMyk7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RoaWNrOg0KKyAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCA0KTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRkRFX0NTU1JVQllQT1NJVElPTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvUnVieVBvc2l0aW9uKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JlZm9yZToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1JVQllQT1NJVElPTl9CZWZvcmU7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0FmdGVyOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTUlVCWVBPU0lUSU9OX0FmdGVyOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1JVQllQT1NJVElPTl9SaWdodDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTUlVCWVBPU0lUSU9OX0lubGluZTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZUE9TSVRJT05fQmVmb3JlOw0KLSAgICB9DQorRlhfRkxPQVQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0ZvbnRTaXplKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkN1ckZvbnRTaXplKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1h4U21hbGw6DQorICAgICAgcmV0dXJuIG1fZkRlZkZvbnRTaXplIC8gMS4yZiAvIDEuMmYgLyAxLjJmOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1hTbWFsbDoNCisgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgLyAxLjJmIC8gMS4yZjsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbDoNCisgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgLyAxLjJmOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX01lZGl1bToNCisgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGFyZ2U6DQorICAgICAgcmV0dXJuIG1fZkRlZkZvbnRTaXplICogMS4yZjsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YTGFyZ2U6DQorICAgICAgcmV0dXJuIG1fZkRlZkZvbnRTaXplICogMS4yZiAqIDEuMmY7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWHhMYXJnZToNCisgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgKiAxLjJmICogMS4yZiAqIDEuMmY7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGFyZ2VyOg0KKyAgICAgIHJldHVybiBmQ3VyRm9udFNpemUgKiAxLjJmOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NtYWxsZXI6DQorICAgICAgcmV0dXJuIGZDdXJGb250U2l6ZSAvIDEuMmY7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIGZDdXJGb250U2l6ZTsNCisgIH0NCiB9DQotRkRFX0NTU1JVQllPVkVSSEFORyBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvUnVieU92ZXJoYW5nKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZT1ZFUkhBTkdfQXV0bzsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhcnQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZT1ZFUkhBTkdfU3RhcnQ7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0VuZDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1JVQllPVkVSSEFOR19FbmQ7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTUlVCWU9WRVJIQU5HX05vbmU7DQotICAgIH0NCitGREVfQ1NTVkVSVElDQUxBTElHTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVmVydGljYWxBbGlnbigNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Jhc2VsaW5lOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9CYXNlbGluZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NaWRkbGU6DQorICAgICAgcmV0dXJuIEZERV9DU1NWRVJUSUNBTEFMSUdOX01pZGRsZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3R0b206DQorICAgICAgcmV0dXJuIEZERV9DU1NWRVJUSUNBTEFMSUdOX0JvdHRvbTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdXBlcjoNCisgICAgICByZXR1cm4gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fU3VwZXI7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3ViOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9TdWI7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVG9wOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9Ub3A7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGV4dFRvcDoNCisgICAgICByZXR1cm4gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fVGV4dFRvcDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UZXh0Qm90dG9tOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9UZXh0Qm90dG9tOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9CYXNlbGluZTsNCisgIH0NCiB9DQotRkRFX0NTU1JVQllBTElHTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvUnVieUFsaWduKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fQXV0bzsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhcnQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fU3RhcnQ7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fRW5kOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DZW50ZXI6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fQ2VudGVyOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9FbmQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fRW5kOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9SaWdodDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzdHJpYnV0ZUxldHRlcjoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9EaXN0cmlidXRlTGV0dGVyOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXN0cmlidXRlU3BhY2U6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fRGlzdHJpYnV0ZVNwYWNlOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaW5lRWRnZToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9MaW5lRWRnZTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fQXV0bzsNCi0gICAgfQ0KK0ZERV9DU1NMSVNUU1RZTEVUWVBFIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9MaXN0U3R5bGVUeXBlKA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfTm9uZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXNjOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9EaXNjOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NpcmNsZToNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfQ2lyY2xlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NxdWFyZToNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfU3F1YXJlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RlY2ltYWw6DQorICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0RlY2ltYWw7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbExlYWRpbmdaZXJvOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9EZWNpbWFsTGVhZGluZ1plcm87DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJSb21hbjoNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJSb21hbjsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlclJvbWFuOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlclJvbWFuOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyR3JlZWs6DQorICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0xvd2VyR3JlZWs7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJMYXRpbjoNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJMYXRpbjsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckxhdGluOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlckxhdGluOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0FybWVuaWFuOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9Bcm1lbmlhbjsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9HZW9yZ2lhbjoNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfR2VvcmdpYW47DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJBbHBoYToNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJBbHBoYTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckFscGhhOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlckFscGhhOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Nqa0lkZW9ncmFwaGljOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9DamtJZGVvZ3JhcGhpYzsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IZWJyZXc6DQorICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0hlYnJldzsNCisgICAgY2FzZSBGREVfQ1NTTElTVFNUWUxFVFlQRV9IaXJhZ2FuYToNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGlyYWdhbmE7DQorICAgIGNhc2UgRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGlyYWdhbmFJcm9oYToNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGlyYWdhbmFJcm9oYTsNCisgICAgY2FzZSBGREVfQ1NTTElTVFNUWUxFVFlQRV9LYXRha2FuYToNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfS2F0YWthbmE7DQorICAgIGNhc2UgRkRFX0NTU0xJU1RTVFlMRVRZUEVfS2F0YWthbmFJcm9oYToNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfS2F0YWthbmFJcm9oYTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfRGlzYzsNCisgIH0NCiB9DQotRlhfQk9PTCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVGV4dEVtcGhhc2lzTWFyayhGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUsIEZERV9DU1NURVhURU1QSEFTSVNNQVJLICZlTWFyaykNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQotICAgICAgICAgICAgZU1hcmsgPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19Ob25lOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3Q6DQotICAgICAgICAgICAgZU1hcmsgPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19Eb3Q7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NpcmNsZToNCi0gICAgICAgICAgICBlTWFyayA9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0NpcmNsZTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlQ2lyY2xlOg0KLSAgICAgICAgICAgIGVNYXJrID0gRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfRG91YmxlQ2lyY2xlOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UcmlhbmdsZToNCi0gICAgICAgICAgICBlTWFyayA9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX1RyaWFuZ2xlOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TZXNhbWU6DQotICAgICAgICAgICAgZU1hcmsgPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19TZXNhbWU7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KK0ZERV9DU1NMSVNUU1RZTEVQT1NJVElPTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvTGlzdFN0eWxlUG9zaXRpb24oDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgcmV0dXJuIGVWYWx1ZSA9PSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNpZGUNCisgICAgICAgICAgICAgPyBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT05fSW5zaWRlDQorICAgICAgICAgICAgIDogRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OX091dHNpZGU7DQogfQ0KLUZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1RleHRFbXBoYXNpc0ZpbGwoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlLCBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTCAmZUZpbGwpDQotew0KLSAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaWxsZWQ6DQotICAgICAgICAgICAgZUZpbGwgPSBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTF9GaWxsZWQ7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX09wZW46DQotICAgICAgICAgICAgZUZpbGwgPSBGREVfQ1NTVEVYVEVNUEhBU0lTRklMTF9PcGVuOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCitGREVfQ1NTVklTSUJJTElUWSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVmlzaWJpbGl0eSgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Zpc2libGU6DQorICAgICAgcmV0dXJuIEZERV9DU1NWSVNJQklMSVRZX1Zpc2libGU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVklTSUJJTElUWV9IaWRkZW47DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ29sbGFwc2U6DQorICAgICAgcmV0dXJuIEZERV9DU1NWSVNJQklMSVRZX0NvbGxhcHNlOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTVklTSUJJTElUWV9WaXNpYmxlOw0KKyAgfQ0KIH0NCi1GREVfQ1NTQktHQVRUQUNITUVOVCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvQktHQXR0YWNobWVudChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQotew0KLSAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaXhlZDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JLR0FUVEFDSE1FTlRfRml4ZWQ7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Njcm9sbDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JLR0FUVEFDSE1FTlRfU2Nyb2xsOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JLR0FUVEFDSE1FTlRfRml4ZWQ7DQotICAgIH0NCitGREVfQ1NTV0hJVEVTUEFDRSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvV2hpdGVTcGFjZSgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbDoNCisgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfTm9ybWFsOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZToNCisgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfUHJlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vd3JhcDoNCisgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfTm93cmFwOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZVdyYXA6DQorICAgICAgcmV0dXJuIEZERV9DU1NXSElURVNQQUNFX1ByZVdyYXA7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUHJlTGluZToNCisgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfUHJlTGluZTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfTm9ybWFsOw0KKyAgfQ0KIH0NCi1GREVfQ1NTQ0FQVElPTlNJREUgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0NhcHRpb25TaWRlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RvcDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NBUFRJT05TSURFX1RvcDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm90dG9tOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ0FQVElPTlNJREVfQm90dG9tOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MZWZ0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ0FQVElPTlNJREVfTGVmdDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDQVBUSU9OU0lERV9SaWdodDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQmVmb3JlOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ0FQVElPTlNJREVfQmVmb3JlOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BZnRlcjoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NBUFRJT05TSURFX0FmdGVyOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NBUFRJT05TSURFX1RvcDsNCi0gICAgfQ0KLX0NCi1GREVfQ1NTUE9TSVRJT04gQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1Bvc2l0aW9uKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N0YXRpYzoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1BPU0lUSU9OX1N0YXRpYzsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVsYXRpdmU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NQT1NJVElPTl9SZWxhdGl2ZTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRml4ZWQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NQT1NJVElPTl9GaXhlZDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQWJzb2x1dGU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NQT1NJVElPTl9BYnNvbHV0ZTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NQT1NJVElPTl9TdGF0aWM7DQotICAgIH0NCi19DQotRkRFX0NTU0NVUlNPUiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvQ3Vyc29yKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfQXV0bzsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ3Jvc3NoYWlyOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX0Nyb3NzaGFpcjsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9EZWZhdWx0Ow0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Qb2ludGVyOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX1BvaW50ZXI7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX01vdmU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfTW92ZTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRVJlc2l6ZToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9FUmVzaXplOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9OZVJlc2l6ZToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9OZVJlc2l6ZTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTndSZXNpemU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfTndSZXNpemU7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05SZXNpemU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfTlJlc2l6ZTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2VSZXNpemU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfU2VSZXNpemU7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N3UmVzaXplOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX1N3UmVzaXplOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9BdXRvOw0KLSAgICB9DQotfQ0KLUZERV9DU1NCS0dSRVBFQVQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0JLR1JlcGVhdChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQotew0KLSAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCS0dSRVBFQVRfUmVwZWF0Ow0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXRYOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQktHUkVQRUFUX1JlcGVhdFg7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFk6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCS0dSRVBFQVRfUmVwZWF0WTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9SZXBlYXQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCS0dSRVBFQVRfTm9SZXBlYXQ7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQktHUkVQRUFUX1JlcGVhdDsNCi0gICAgfQ0KLX0NCi1GREVfQ1NTVEVYVENPTUJJTkUgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1RleHRDb21iaW5lKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hvcml6b250YWw6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NURVhUQ09NQklORV9Ib3Jpem9udGFsOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1RFWFRDT01CSU5FX05vbmU7DQotICAgIH0NCi19DQotRkRFX0NTU0xJTkVCUkVBSyBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvTGluZUJyZWFrKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSU5FQlJFQUtfQXV0bzsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG9vc2U6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSU5FQlJFQUtfTG9vc2U7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJTkVCUkVBS19Ob3JtYWw7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N0cmljdDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJTkVCUkVBS19TdHJpY3Q7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElORUJSRUFLX0F1dG87DQotICAgIH0NCi19DQotRkRFX0NTU09WRVJGTE9XIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9PdmVyZmxvdyhGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQotew0KLSAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9WaXNpYmxlOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTT1ZFUkZMT1dfVmlzaWJsZTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTT1ZFUkZMT1dfSGlkZGVuOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TY3JvbGw6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19TY3JvbGw7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19BdXRvOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0Rpc3BsYXk6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19Ob0Rpc3BsYXk7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vQ29udGVudDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU09WRVJGTE9XX05vQ29udGVudDsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19WaXNpYmxlOw0KLSAgICB9DQotfQ0KLUZERV9DU1NXUklUSU5HTU9ERSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvV3JpdGluZ01vZGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KLXsNCi0gICAgc3dpdGNoIChlVmFsdWUpIHsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSG9yaXpvbnRhbFRiOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTV1JJVElOR01PREVfSG9yaXpvbnRhbFRiOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9WZXJ0aWNhbFJsOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTV1JJVElOR01PREVfVmVydGljYWxSbDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVmVydGljYWxMcjoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1dSSVRJTkdNT0RFX1ZlcnRpY2FsTHI7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTV1JJVElOR01PREVfSG9yaXpvbnRhbFRiOw0KLSAgICB9DQotfQ0KLUZERV9DU1NXT1JEQlJFQUsgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1dvcmRCcmVhayhGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQotew0KLSAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWw6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXT1JEQlJFQUtfTm9ybWFsOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9LZWVwQWxsOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTV09SREJSRUFLX0tlZXBBbGw7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JyZWFrQWxsOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTV09SREJSRUFLX0JyZWFrQWxsOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9LZWVwV29yZHM6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXT1JEQlJFQUtfS2VlcFdvcmRzOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1dPUkRCUkVBS19Ob3JtYWw7DQotICAgIH0NCi19DQotRkRFX0NTU0ZMT0FUIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9GbG9hdChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQotew0KLSAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MZWZ0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRkxPQVRfTGVmdDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NGTE9BVF9SaWdodDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0ZMT0FUX05vbmU7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRkxPQVRfTm9uZTsNCi0gICAgfQ0KLX0NCi1GREVfQ1NTQ0xFQVIgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0NsZWFyKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDTEVBUl9Ob25lOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MZWZ0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ0xFQVJfTGVmdDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NDTEVBUl9SaWdodDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm90aDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0NMRUFSX0JvdGg7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQ0xFQVJfTm9uZTsNCi0gICAgfQ0KLX0NCi1GREVfQ1NTUEFHRUJSRUFLIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9QYWdlQnJlYWsoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KLXsNCi0gICAgc3dpdGNoIChlVmFsdWUpIHsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXZvaWQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NQQUdFQlJFQUtfQXZvaWQ7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NQQUdFQlJFQUtfQXV0bzsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQWx3YXlzOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTUEFHRUJSRUFLX0Fsd2F5czsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGVmdDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1BBR0VCUkVBS19MZWZ0Ow0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1BBR0VCUkVBS19SaWdodDsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NQQUdFQlJFQUtfQXV0bzsNCi0gICAgfQ0KLX0NCi1GREVfQ1NTRElTUExBWSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvRGlzcGxheShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQotew0KLSAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX0lubGluZTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQmxvY2s6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX0Jsb2NrOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9Ob25lOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaXN0SXRlbToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfTGlzdEl0ZW07DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ2VsbDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVDZWxsOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZVJvdzoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVSb3c7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9UYWJsZTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDYXB0aW9uOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9UYWJsZUNhcHRpb247DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlUm93R3JvdXA6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlUm93R3JvdXA7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlSGVhZGVyR3JvdXA6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlSGVhZGVyR3JvdXA7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlRm9vdGVyR3JvdXA6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlRm9vdGVyR3JvdXA7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ29sdW1uR3JvdXA6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlQ29sdW1uR3JvdXA7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ29sdW1uOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9UYWJsZUNvbHVtbjsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lVGFibGU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX0lubGluZVRhYmxlOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmVCbG9jazoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfSW5saW5lQmxvY2s7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1bkluOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9SdW5JbjsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfUnVieTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieUJhc2U6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1J1YnlCYXNlOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5VGV4dDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfUnVieVRleHQ7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlCYXNlR3JvdXA6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTFNZX1J1YnlCYXNlR3JvdXA7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlUZXh0R3JvdXA6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1J1YnlUZXh0R3JvdXA7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9JbmxpbmU7DQotICAgIH0NCi19DQotRkRFX0NTU1RFWFRBTElHTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVGV4dEFsaWduKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NURVhUQUxJR05fTGVmdDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2VudGVyOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVEVYVEFMSUdOX0NlbnRlcjsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NURVhUQUxJR05fUmlnaHQ7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0p1c3RpZnk6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NURVhUQUxJR05fSnVzdGlmeTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NURVhUQUxJR05fTGVmdDsNCi0gICAgfQ0KLX0NCi1GWF9XT1JEIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9Gb250V2VpZ2h0KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbDoNCi0gICAgICAgICAgICByZXR1cm4gNDAwOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkOg0KLSAgICAgICAgICAgIHJldHVybiA3MDA7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JvbGRlcjoNCi0gICAgICAgICAgICByZXR1cm4gOTAwOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaWdodGVyOg0KLSAgICAgICAgICAgIHJldHVybiAyMDA7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiA0MDA7DQotICAgIH0NCi19DQotRkRFX0NTU0ZPTlRTVFlMRSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvRm9udFN0eWxlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0l0YWxpYzoNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT2JsaXF1ZToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0ZPTlRTVFlMRV9JdGFsaWM7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTRk9OVFNUWUxFX05vcm1hbDsNCi0gICAgfQ0KLX0NCi1GREVfQ1NTQk9SREVSU1RZTEUgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0JvcmRlclN0eWxlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9Ob25lOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Tb2xpZDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX1NvbGlkOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRkZW46DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9IaWRkZW47DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdHRlZDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX0RvdHRlZDsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGFzaGVkOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfRGFzaGVkOw0KK0ZYX0RXT1JEIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9UZXh0RGVjb3JhdGlvbihJRkRFX0NTU1ZhbHVlTGlzdCogcFZhbHVlKSB7DQorICBGWF9EV09SRCBkd0RlY29yYXRpb24gPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSBwVmFsdWUtPkNvdW50VmFsdWVzKCkgLSAxOyBpID49IDA7IC0taSkgew0KKyAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKiBwUHJpbWl0aXZlID0NCisgICAgICAgIChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKilwVmFsdWUtPkdldFZhbHVlKGkpOw0KKyAgICBpZiAocFByaW1pdGl2ZS0+R2V0UHJpbWl0aXZlVHlwZSgpID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICBzd2l0Y2ggKHBQcmltaXRpdmUtPkdldEVudW0oKSkgew0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VbmRlcmxpbmU6DQorICAgICAgICAgIGR3RGVjb3JhdGlvbiB8PSBGREVfQ1NTVEVYVERFQ09SQVRJT05fVW5kZXJsaW5lOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGluZVRocm91Z2g6DQorICAgICAgICAgIGR3RGVjb3JhdGlvbiB8PSBGREVfQ1NTVEVYVERFQ09SQVRJT05fTGluZVRocm91Z2g7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdmVybGluZToNCisgICAgICAgICAgZHdEZWNvcmF0aW9uIHw9IEZERV9DU1NURVhUREVDT1JBVElPTl9PdmVybGluZTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JsaW5rOg0KKyAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0JsaW5rOw0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfRG91YmxlOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Hcm9vdmU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9Hcm9vdmU7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZGdlOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfUmlkZ2U7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2V0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfSW5zZXQ7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNldDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX291dHNldDsNCisgICAgICAgICAgZHdEZWNvcmF0aW9uIHw9IEZERV9DU1NURVhUREVDT1JBVElPTl9Eb3VibGU7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX05vbmU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGR3RGVjb3JhdGlvbjsNCiB9DQotRlhfQk9PTCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NMRU5HVEggJndpZHRoLCBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZSwgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcFByaW1pdGl2ZSwgRlhfRkxPQVQgZkZvbnRTaXplKQ0KLXsNCi0gICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1BlcmNlbnQpIHsNCi0gICAgICAgIHdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9QZXJjZW50LCBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpIC8gMTAwLjBmKTsNCi0gICAgICAgIHJldHVybiB3aWR0aC5Ob25aZXJvKCk7DQotICAgIH0gZWxzZSBpZiAoZVR5cGUgPj0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmIGVUeXBlIDw9IEZERV9DU1NQUklNSVRJVkVUWVBFX1BDKSB7DQotICAgICAgICBGWF9GTE9BVCBmVmFsdWUgPSBBcHBseU51bWJlcihlVHlwZSwgcFByaW1pdGl2ZS0+R2V0RmxvYXQoKSwgZkZvbnRTaXplKTsNCi0gICAgICAgIHdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgZlZhbHVlKTsNCi0gICAgICAgIHJldHVybiB3aWR0aC5Ob25aZXJvKCk7DQotICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KLSAgICAgICAgc3dpdGNoIChwUHJpbWl0aXZlLT5HZXRFbnVtKCkpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQotICAgICAgICAgICAgICAgIHdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9BdXRvKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KLSAgICAgICAgICAgICAgICB3aWR0aC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfTm9uZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpbjoNCi0gICAgICAgICAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCAyKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW06DQotICAgICAgICAgICAgICAgIHdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgMyk7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpY2s6DQotICAgICAgICAgICAgICAgIHdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgNCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQorRkRFX0NTU1RFWFRUUkFOU0ZPUk0gQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1RleHRUcmFuc2Zvcm0oDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVEVYVFRSQU5TRk9STV9Ob25lOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NhcGl0YWxpemU6DQorICAgICAgcmV0dXJuIEZERV9DU1NURVhUVFJBTlNGT1JNX0NhcGl0YWxpemU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJjYXNlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVEVYVFRSQU5TRk9STV9VcHBlckNhc2U7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJjYXNlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVEVYVFRSQU5TRk9STV9Mb3dlckNhc2U7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NURVhUVFJBTlNGT1JNX05vbmU7DQorICB9DQogfQ0KLUZYX0ZMT0FUIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9Gb250U2l6ZShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUsIEZYX0ZMT0FUIGZDdXJGb250U2l6ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1h4U21hbGw6DQotICAgICAgICAgICAgcmV0dXJuIG1fZkRlZkZvbnRTaXplIC8gMS4yZiAvIDEuMmYgLyAxLjJmOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YU21hbGw6DQotICAgICAgICAgICAgcmV0dXJuIG1fZkRlZkZvbnRTaXplIC8gMS4yZiAvIDEuMmY7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NtYWxsOg0KLSAgICAgICAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZSAvIDEuMmY7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX01lZGl1bToNCi0gICAgICAgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemU7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xhcmdlOg0KLSAgICAgICAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZSAqIDEuMmY7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1hMYXJnZToNCi0gICAgICAgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgKiAxLjJmICogMS4yZjsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWHhMYXJnZToNCi0gICAgICAgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgKiAxLjJmICogMS4yZiAqIDEuMmY7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xhcmdlcjoNCi0gICAgICAgICAgICByZXR1cm4gZkN1ckZvbnRTaXplICogMS4yZjsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGxlcjoNCi0gICAgICAgICAgICByZXR1cm4gZkN1ckZvbnRTaXplIC8gMS4yZjsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIGZDdXJGb250U2l6ZTsNCi0gICAgfQ0KLX0NCi1GREVfQ1NTVkVSVElDQUxBTElHTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVmVydGljYWxBbGlnbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQotew0KLSAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CYXNlbGluZToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fQmFzZWxpbmU7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX01pZGRsZToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fTWlkZGxlOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3R0b206DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NWRVJUSUNBTEFMSUdOX0JvdHRvbTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3VwZXI6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NWRVJUSUNBTEFMSUdOX1N1cGVyOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdWI6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NWRVJUSUNBTEFMSUdOX1N1YjsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVG9wOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9Ub3A7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHRUb3A6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NWRVJUSUNBTEFMSUdOX1RleHRUb3A7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHRCb3R0b206DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NWRVJUSUNBTEFMSUdOX1RleHRCb3R0b207DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9CYXNlbGluZTsNCi0gICAgfQ0KLX0NCi1GREVfQ1NTTElTVFNUWUxFVFlQRSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvTGlzdFN0eWxlVHlwZShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQotew0KLSAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9Ob25lOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXNjOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9EaXNjOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DaXJjbGU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0NpcmNsZTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3F1YXJlOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9TcXVhcmU7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RlY2ltYWw6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0RlY2ltYWw7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RlY2ltYWxMZWFkaW5nWmVybzoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfRGVjaW1hbExlYWRpbmdaZXJvOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlclJvbWFuOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9Mb3dlclJvbWFuOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlclJvbWFuOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlclJvbWFuOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckdyZWVrOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9Mb3dlckdyZWVrOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckxhdGluOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9Mb3dlckxhdGluOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckxhdGluOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlckxhdGluOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Bcm1lbmlhbjoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfQXJtZW5pYW47DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0dlb3JnaWFuOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9HZW9yZ2lhbjsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJBbHBoYToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJBbHBoYTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJBbHBoYToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfVXBwZXJBbHBoYTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2prSWRlb2dyYXBoaWM6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0Nqa0lkZW9ncmFwaGljOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IZWJyZXc6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0hlYnJldzsNCi0gICAgICAgIGNhc2UgRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGlyYWdhbmE6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0hpcmFnYW5hOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTTElTVFNUWUxFVFlQRV9IaXJhZ2FuYUlyb2hhOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9IaXJhZ2FuYUlyb2hhOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTTElTVFNUWUxFVFlQRV9LYXRha2FuYToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfS2F0YWthbmE7DQotICAgICAgICBjYXNlIEZERV9DU1NMSVNUU1RZTEVUWVBFX0thdGFrYW5hSXJvaGE6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0thdGFrYW5hSXJvaGE7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9EaXNjOw0KLSAgICB9DQotfQ0KLUZERV9DU1NMSVNUU1RZTEVQT1NJVElPTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvTGlzdFN0eWxlUG9zaXRpb24oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KLXsNCi0gICAgcmV0dXJuIGVWYWx1ZSA9PSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbnNpZGUgPyBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT05fSW5zaWRlIDogRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OX091dHNpZGU7DQotfQ0KLUZERV9DU1NWSVNJQklMSVRZIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9WaXNpYmlsaXR5KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Zpc2libGU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NWSVNJQklMSVRZX1Zpc2libGU7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hpZGRlbjoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1ZJU0lCSUxJVFlfSGlkZGVuOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Db2xsYXBzZToNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1ZJU0lCSUxJVFlfQ29sbGFwc2U7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVklTSUJJTElUWV9WaXNpYmxlOw0KLSAgICB9DQotfQ0KLUZERV9DU1NXSElURVNQQUNFIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9XaGl0ZVNwYWNlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCi17DQotICAgIHN3aXRjaCAoZVZhbHVlKSB7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfTm9ybWFsOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9QcmU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXSElURVNQQUNFX1ByZTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm93cmFwOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTV0hJVEVTUEFDRV9Ob3dyYXA7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZVdyYXA6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXSElURVNQQUNFX1ByZVdyYXA7DQotICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZUxpbmU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NXSElURVNQQUNFX1ByZUxpbmU7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTV0hJVEVTUEFDRV9Ob3JtYWw7DQotICAgIH0NCi19DQotRlhfRFdPUkQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1RleHREZWNvcmF0aW9uKElGREVfQ1NTVmFsdWVMaXN0ICpwVmFsdWUpDQotew0KLSAgICBGWF9EV09SRCBkd0RlY29yYXRpb24gPSAwOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IHBWYWx1ZS0+Q291bnRWYWx1ZXMoKSAtIDE7IGkgPj0gMDsgLS1pKSB7DQotICAgICAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwUHJpbWl0aXZlID0gKElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqKXBWYWx1ZS0+R2V0VmFsdWUoaSk7DQotICAgICAgICBpZiAocFByaW1pdGl2ZS0+R2V0UHJpbWl0aXZlVHlwZSgpID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKHBQcmltaXRpdmUtPkdldEVudW0oKSkgew0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VuZGVybGluZToNCi0gICAgICAgICAgICAgICAgICAgIGR3RGVjb3JhdGlvbiB8PSBGREVfQ1NTVEVYVERFQ09SQVRJT05fVW5kZXJsaW5lOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGluZVRocm91Z2g6DQotICAgICAgICAgICAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0xpbmVUaHJvdWdoOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3ZlcmxpbmU6DQotICAgICAgICAgICAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX092ZXJsaW5lOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQmxpbms6DQotICAgICAgICAgICAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0JsaW5rOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlOg0KLSAgICAgICAgICAgICAgICAgICAgZHdEZWNvcmF0aW9uIHw9IEZERV9DU1NURVhUREVDT1JBVElPTl9Eb3VibGU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gZHdEZWNvcmF0aW9uOw0KLX0NCi1GREVfQ1NTVEVYVFRSQU5TRk9STSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVGV4dFRyYW5zZm9ybShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpDQotew0KLSAgICBzd2l0Y2ggKGVWYWx1ZSkgew0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVEVYVFRSQU5TRk9STV9Ob25lOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DYXBpdGFsaXplOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVEVYVFRSQU5TRk9STV9DYXBpdGFsaXplOw0KLSAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlcmNhc2U6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NURVhUVFJBTlNGT1JNX1VwcGVyQ2FzZTsNCi0gICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJjYXNlOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVEVYVFRSQU5TRk9STV9Mb3dlckNhc2U7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGREVfQ1NTVEVYVFRSQU5TRk9STV9Ob25lOw0KLSAgICB9DQotfQ0KLUZERV9DU1NGT05UVkFSSUFOVCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvRm9udFZhcmlhbnQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKQ0KLXsNCi0gICAgcmV0dXJuIGVWYWx1ZSA9PSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbENhcHMgPyBGREVfQ1NTRk9OVFZBUklBTlRfU21hbGxDYXBzIDogRkRFX0NTU0ZPTlRWQVJJQU5UX05vcm1hbDsNCitGREVfQ1NTRk9OVFZBUklBTlQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0ZvbnRWYXJpYW50KA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHJldHVybiBlVmFsdWUgPT0gRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGxDYXBzID8gRkRFX0NTU0ZPTlRWQVJJQU5UX1NtYWxsQ2Fwcw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGREVfQ1NTRk9OVFZBUklBTlRfTm9ybWFsOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmggYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmgKaW5kZXggMmYxMjIxMy4uNzMzMjk2NiAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5oCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2VsZWN0b3IuaApAQCAtNiw5OTUgKzYsODgxIEBACiANCiAjaWZuZGVmIF9GREVfQ1NTU1RZTEVTRUxFQ1RPUg0KICNkZWZpbmUgX0ZERV9DU1NTVFlMRVNFTEVDVE9SDQotI2RlZmluZSBGREVfQ1NTVU5JVkVSU0FMSEFTSAkJKCcqJykNCisjZGVmaW5lIEZERV9DU1NVTklWRVJTQUxIQVNIICgnKicpDQogdHlwZWRlZiBzdHJ1Y3QgX0ZERV9DU1NSVUxFREFUQSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCi1wdWJsaWM6DQotICAgIF9GREVfQ1NTUlVMRURBVEEoSUZERV9DU1NTZWxlY3RvciAqcFNlbCwgSUZERV9DU1NEZWNsYXJhdGlvbiAqcERlY2wsIEZYX0RXT1JEIGR3UG9zKTsNCi0gICAgSUZERV9DU1NTZWxlY3RvcgkJCQkqcFNlbGVjdG9yOw0KLSAgICBJRkRFX0NTU0RlY2xhcmF0aW9uCQkJCSpwRGVjbGFyYXRpb247DQotICAgIEZYX0RXT1JECQkJCQkJZHdQcmlvcml0eTsNCi0gICAgX0ZERV9DU1NSVUxFREFUQQkJCQkqcE5leHQ7DQotfSBGREVfQ1NTUlVMRURBVEEsICogRkRFX0xQQ1NTUlVMRURBVEE7DQorIHB1YmxpYzoNCisgIF9GREVfQ1NTUlVMRURBVEEoSUZERV9DU1NTZWxlY3RvciogcFNlbCwNCisgICAgICAgICAgICAgICAgICAgSUZERV9DU1NEZWNsYXJhdGlvbiogcERlY2wsDQorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UG9zKTsNCisgIElGREVfQ1NTU2VsZWN0b3IqIHBTZWxlY3RvcjsNCisgIElGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsYXJhdGlvbjsNCisgIEZYX0RXT1JEIGR3UHJpb3JpdHk7DQorICBfRkRFX0NTU1JVTEVEQVRBKiBwTmV4dDsNCit9IEZERV9DU1NSVUxFREFUQSwgKkZERV9MUENTU1JVTEVEQVRBOw0KIHR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RkRFX0xQQ1NTUlVMRURBVEE+IENGREVfQ1NTUnVsZURhdGFBcnJheTsNCi1jbGFzcyBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uIDogcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uKCkgOiBtX3BTdGF0aWNTdG9yZShOVUxMKSwgbV9wVW5pdmVyc2FsUnVsZXMoTlVMTCkgLCBtX2lTZWxlY3RvcnMoMCksIG1fcFBlcnN1ZG9SdWxlcyhOVUxMKSB7IH0NCi0gICAgfkNGREVfQ1NTUnVsZUNvbGxlY3Rpb24oKQ0KLSAgICB7DQotICAgICAgICBDbGVhcigpOw0KLSAgICB9DQotICAgIHZvaWQJCQkJCQkJQWRkUnVsZXNGcm9tKGNvbnN0IENGREVfQ1NTU3R5bGVTaGVldEFycmF5ICZzaGVldHMsIEZYX0RXT1JEIGR3TWVkaWFMaXN0LCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpOw0KLSAgICB2b2lkCQkJCQkJCUNsZWFyKCk7DQorY2xhc3MgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbiA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbigpDQorICAgICAgOiBtX3BTdGF0aWNTdG9yZShOVUxMKSwNCisgICAgICAgIG1fcFVuaXZlcnNhbFJ1bGVzKE5VTEwpLA0KKyAgICAgICAgbV9pU2VsZWN0b3JzKDApLA0KKyAgICAgICAgbV9wUGVyc3Vkb1J1bGVzKE5VTEwpIHt9DQorICB+Q0ZERV9DU1NSdWxlQ29sbGVjdGlvbigpIHsgQ2xlYXIoKTsgfQ0KKyAgdm9pZCBBZGRSdWxlc0Zyb20oY29uc3QgQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXkmIHNoZWV0cywNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TWVkaWFMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyKTsNCisgIHZvaWQgQ2xlYXIoKTsNCiANCi0gICAgaW50MzJfdAkJCQkJCUNvdW50U2VsZWN0b3JzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faVNlbGVjdG9yczsNCi0gICAgfQ0KLSAgICBGREVfTFBDU1NSVUxFREFUQQkJCQlHZXRJRFJ1bGVEYXRhKEZYX0RXT1JEIGR3SURIYXNoKQ0KLSAgICB7DQotICAgICAgICB2b2lkKiBwRGF0YTsNCi0gICAgICAgIHJldHVybiBtX0lEUnVsZXMuTG9va3VwKCh2b2lkKikodWludHB0cl90KWR3SURIYXNoLCBwRGF0YSkgPyAoRkRFX0xQQ1NTUlVMRURBVEEpcERhdGEgOiBOVUxMOw0KLSAgICB9DQotICAgIEZERV9MUENTU1JVTEVEQVRBCQkJCUdldFRhZ1J1bGVEYXRhKEZYX0RXT1JEIGR3VGFnSGFzbikNCi0gICAgew0KLSAgICAgICAgdm9pZCogcERhdGE7DQotICAgICAgICByZXR1cm4gbV9UYWdSdWxlcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdUYWdIYXNuLCBwRGF0YSkgPyAoRkRFX0xQQ1NTUlVMRURBVEEpcERhdGEgOiBOVUxMOw0KLSAgICB9DQotICAgIEZERV9MUENTU1JVTEVEQVRBCQkJCUdldENsYXNzUnVsZURhdGEoRlhfRFdPUkQgZHdJREhhc2gpDQotICAgIHsNCi0gICAgICAgIHZvaWQqIHBEYXRhOw0KLSAgICAgICAgcmV0dXJuIG1fQ2xhc3NSdWxlcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdJREhhc2gsIHBEYXRhKSA/IChGREVfTFBDU1NSVUxFREFUQSlwRGF0YSA6IE5VTEw7DQotICAgIH0NCi0gICAgRkRFX0xQQ1NTUlVMRURBVEEJCQkJR2V0VW5pdmVyc2FsUnVsZURhdGEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wVW5pdmVyc2FsUnVsZXM7DQotICAgIH0NCi0gICAgRkRFX0xQQ1NTUlVMRURBVEEJCQkJR2V0UGVyc3Vkb1J1bGVEYXRhKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcFBlcnN1ZG9SdWxlczsNCi0gICAgfQ0KLSAgICBJRlhfTUVNQWxsb2NhdG9yCQkJCSptX3BTdGF0aWNTdG9yZTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJCQkJCQkJQWRkUnVsZXNGcm9tKElGREVfQ1NTU3R5bGVTaGVldCAqcFN0eWxlU2hlZXQsIElGREVfQ1NTUnVsZSAqcFJ1bGUsIEZYX0RXT1JEIGR3TWVkaWFMaXN0LCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpOw0KLSAgICB2b2lkCQkJCQkJCUFkZFJ1bGVUbyhDRlhfTWFwUHRyVG9QdHIgJm1hcCwgRlhfRFdPUkQgZHdLZXksIElGREVfQ1NTU2VsZWN0b3IgKnBTZWwsIElGREVfQ1NTRGVjbGFyYXRpb24gKnBEZWNsKTsNCi0gICAgRlhfQk9PTAkJCQkJCQlBZGRSdWxlVG8oRkRFX0xQQ1NTUlVMRURBVEEgJnBMaXN0LCBGREVfTFBDU1NSVUxFREFUQSBwRGF0YSk7DQotICAgIEZERV9MUENTU1JVTEVEQVRBCQkJCU5ld1J1bGVEYXRhKElGREVfQ1NTU2VsZWN0b3IgKnBTZWwsIElGREVfQ1NTRGVjbGFyYXRpb24gKnBEZWNsKTsNCi0gICAgQ0ZYX01hcFB0clRvUHRyCQkJCQltX0lEUnVsZXM7DQotICAgIENGWF9NYXBQdHJUb1B0cgkJCQkJbV9UYWdSdWxlczsNCi0gICAgQ0ZYX01hcFB0clRvUHRyCQkJCQltX0NsYXNzUnVsZXM7DQotICAgIEZERV9MUENTU1JVTEVEQVRBCQkJCW1fcFVuaXZlcnNhbFJ1bGVzOw0KLSAgICBGREVfTFBDU1NSVUxFREFUQQkJCQltX3BQZXJzdWRvUnVsZXM7DQotICAgIGludDMyX3QJCQkJCQltX2lTZWxlY3RvcnM7DQorICBpbnQzMl90IENvdW50U2VsZWN0b3JzKCkgY29uc3QgeyByZXR1cm4gbV9pU2VsZWN0b3JzOyB9DQorICBGREVfTFBDU1NSVUxFREFUQSBHZXRJRFJ1bGVEYXRhKEZYX0RXT1JEIGR3SURIYXNoKSB7DQorICAgIHZvaWQqIHBEYXRhOw0KKyAgICByZXR1cm4gbV9JRFJ1bGVzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd0lESGFzaCwgcERhdGEpDQorICAgICAgICAgICAgICAgPyAoRkRFX0xQQ1NTUlVMRURBVEEpcERhdGENCisgICAgICAgICAgICAgICA6IE5VTEw7DQorICB9DQorICBGREVfTFBDU1NSVUxFREFUQSBHZXRUYWdSdWxlRGF0YShGWF9EV09SRCBkd1RhZ0hhc24pIHsNCisgICAgdm9pZCogcERhdGE7DQorICAgIHJldHVybiBtX1RhZ1J1bGVzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd1RhZ0hhc24sIHBEYXRhKQ0KKyAgICAgICAgICAgICAgID8gKEZERV9MUENTU1JVTEVEQVRBKXBEYXRhDQorICAgICAgICAgICAgICAgOiBOVUxMOw0KKyAgfQ0KKyAgRkRFX0xQQ1NTUlVMRURBVEEgR2V0Q2xhc3NSdWxlRGF0YShGWF9EV09SRCBkd0lESGFzaCkgew0KKyAgICB2b2lkKiBwRGF0YTsNCisgICAgcmV0dXJuIG1fQ2xhc3NSdWxlcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdJREhhc2gsIHBEYXRhKQ0KKyAgICAgICAgICAgICAgID8gKEZERV9MUENTU1JVTEVEQVRBKXBEYXRhDQorICAgICAgICAgICAgICAgOiBOVUxMOw0KKyAgfQ0KKyAgRkRFX0xQQ1NTUlVMRURBVEEgR2V0VW5pdmVyc2FsUnVsZURhdGEoKSB7IHJldHVybiBtX3BVbml2ZXJzYWxSdWxlczsgfQ0KKyAgRkRFX0xQQ1NTUlVMRURBVEEgR2V0UGVyc3Vkb1J1bGVEYXRhKCkgeyByZXR1cm4gbV9wUGVyc3Vkb1J1bGVzOyB9DQorICBJRlhfTUVNQWxsb2NhdG9yKiBtX3BTdGF0aWNTdG9yZTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBBZGRSdWxlc0Zyb20oSUZERV9DU1NTdHlsZVNoZWV0KiBwU3R5bGVTaGVldCwNCisgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTUnVsZSogcFJ1bGUsDQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd01lZGlhTGlzdCwNCisgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyKiBwRm9udE1ncik7DQorICB2b2lkIEFkZFJ1bGVUbyhDRlhfTWFwUHRyVG9QdHImIG1hcCwNCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3S2V5LA0KKyAgICAgICAgICAgICAgICAgSUZERV9DU1NTZWxlY3RvciogcFNlbCwNCisgICAgICAgICAgICAgICAgIElGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsKTsNCisgIEZYX0JPT0wgQWRkUnVsZVRvKEZERV9MUENTU1JVTEVEQVRBJiBwTGlzdCwgRkRFX0xQQ1NTUlVMRURBVEEgcERhdGEpOw0KKyAgRkRFX0xQQ1NTUlVMRURBVEEgTmV3UnVsZURhdGEoSUZERV9DU1NTZWxlY3RvciogcFNlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsKTsNCisgIENGWF9NYXBQdHJUb1B0ciBtX0lEUnVsZXM7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9UYWdSdWxlczsNCisgIENGWF9NYXBQdHJUb1B0ciBtX0NsYXNzUnVsZXM7DQorICBGREVfTFBDU1NSVUxFREFUQSBtX3BVbml2ZXJzYWxSdWxlczsNCisgIEZERV9MUENTU1JVTEVEQVRBIG1fcFBlcnN1ZG9SdWxlczsNCisgIGludDMyX3QgbV9pU2VsZWN0b3JzOw0KIH07DQogY2xhc3MgQ0ZERV9DU1NBY2NlbGVyYXRvcjsNCiBjbGFzcyBDRkRFX0NTU0NvbXB1dGVkU3R5bGU7DQotY2xhc3MgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yIDogcHVibGljIElGREVfQ1NTU3R5bGVTZWxlY3RvciwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX0NTU1N0eWxlU2VsZWN0b3IoKTsNCi0gICAgfkNGREVfQ1NTU3R5bGVTZWxlY3RvcigpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KK2NsYXNzIENGREVfQ1NTU3R5bGVTZWxlY3RvciA6IHB1YmxpYyBJRkRFX0NTU1N0eWxlU2VsZWN0b3IsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yKCk7DQorICB+Q0ZERV9DU1NTdHlsZVNlbGVjdG9yKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRGb250TWdyKElGWF9Gb250TWdyICpwRm9udE1ncik7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0RGVmRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250TWdyKElGWF9Gb250TWdyKiBwRm9udE1ncik7DQorICB2aXJ0dWFsIHZvaWQgU2V0RGVmRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlTZXRTdHlsZVNoZWV0KEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsIElGREVfQ1NTU3R5bGVTaGVldCAqcFNoZWV0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlTZXRTdHlsZVNoZWV0cyhGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLCBjb25zdCBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheSAqcEFycmF5KTsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRTdHlsZVByaW9yaXR5KEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsIEZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFkgZVByaW9yaXR5KTsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlVcGRhdGVTdHlsZUluZGV4KEZYX0RXT1JEIGR3TWVkaWFMaXN0KTsNCi0gICAgdmlydHVhbCBJRkRFX0NTU0FjY2VsZXJhdG9yKglJbml0QWNjZWxlcmF0b3IoKTsNCi0gICAgdmlydHVhbCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqCUNyZWF0ZUNvbXB1dGVkU3R5bGUoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwUGFyZW50U3R5bGUpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJTWF0Y2hEZWNsYXJhdGlvbnMoSUZERV9DU1NUYWdQcm92aWRlciAqcFRhZywgQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5ICZtYXRjaGVkRGVjbHMsIEZERV9DU1NQRVJTVURPIGVQZXJzdWRvVHlwZSA9IEZERV9DU1NQRVJTVURPX05PTkUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCUNvbXB1dGVTdHlsZShJRkRFX0NTU1RhZ1Byb3ZpZGVyICpwVGFnLCBjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uICoqcHBEZWNsQXJyYXksIGludDMyX3QgaURlY2xDb3VudCwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwRGVzdFN0eWxlKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJCQkJCQkJUmVzZXQoKTsNCi0gICAgdm9pZAkJCQkJCQlNYXRjaFJ1bGVzKEZERV9MUENTU1RBR0NBQ0hFIHBDYWNoZSwgRkRFX0xQQ1NTUlVMRURBVEEgcExpc3QsIEZERV9DU1NQRVJTVURPIGVQZXJzdWRvVHlwZSk7DQotICAgIHZvaWQJCQkJCQkJU29ydFJ1bGVzVG8oQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5ICZtYXRjaERlY2xzKTsNCi0gICAgRlhfQk9PTAkJCQkJCQlNYXRjaFNlbGVjdG9yKEZERV9MUENTU1RBR0NBQ0hFIHBDYWNoZSwgSUZERV9DU1NTZWxlY3RvciAqcFNlbCwgRkRFX0NTU1BFUlNVRE8gZVBlcnN1ZG9UeXBlKTsNCi0gICAgdm9pZAkJCQkJCQlBcHBlbmRJbmxpbmVTdHlsZShDRkRFX0NTU0RlY2xhcmF0aW9uICpwRGVjbCwgY29uc3QgRlhfV0NIQVIqIHBzeiwgaW50MzJfdCBpTGVuKTsNCi0gICAgdm9pZAkJCQkJCQlBcHBseURlY2xhcmF0aW9ucyhGWF9CT09MIGJQcmlvcml0eSwgY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbiAqKnBwRGVjbEFycmF5LCBpbnQzMl90IGlEZWNsQ291bnQsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcERlc3RTdHlsZSk7DQotICAgIHZvaWQJCQkJCQkJQXBwbHlQcm9wZXJ0eShGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LCBJRkRFX0NTU1ZhbHVlICpwVmFsdWUsIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcENvbXB1dGVkU3R5bGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFN0eWxlU2hlZXQoRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTU3R5bGVTaGVldCogcFNoZWV0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRTdHlsZVNoZWV0cyhGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGREVfQ1NTU3R5bGVTaGVldEFycmF5KiBwQXJyYXkpOw0KKyAgdmlydHVhbCB2b2lkIFNldFN0eWxlUHJpb3JpdHkoRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFkgZVByaW9yaXR5KTsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVTdHlsZUluZGV4KEZYX0RXT1JEIGR3TWVkaWFMaXN0KTsNCisgIHZpcnR1YWwgSUZERV9DU1NBY2NlbGVyYXRvciogSW5pdEFjY2VsZXJhdG9yKCk7DQorICB2aXJ0dWFsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogQ3JlYXRlQ29tcHV0ZWRTdHlsZSgNCisgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSk7DQorICB2aXJ0dWFsIGludDMyX3QgTWF0Y2hEZWNsYXJhdGlvbnMoDQorICAgICAgSUZERV9DU1NUYWdQcm92aWRlciogcFRhZywNCisgICAgICBDRkRFX0NTU0RlY2xhcmF0aW9uQXJyYXkmIG1hdGNoZWREZWNscywNCisgICAgICBGREVfQ1NTUEVSU1VETyBlUGVyc3Vkb1R5cGUgPSBGREVfQ1NTUEVSU1VET19OT05FKTsNCisgIHZpcnR1YWwgdm9pZCBDb21wdXRlU3R5bGUoSUZERV9DU1NUYWdQcm92aWRlciogcFRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbioqIHBwRGVjbEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWNsQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcERlc3RTdHlsZSk7DQogDQotICAgIEZYX0ZMT0FUCQkJCQkJQXBwbHlOdW1iZXIoRkRFX0NTU1BSSU1JVElWRVRZUEUgZVVuaXQsIEZYX0ZMT0FUIGZWYWx1ZSwgRlhfRkxPQVQgZlBlcmNlbnRCYXNlKTsNCi0gICAgRlhfQk9PTAkJCQkJCQlTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTEVOR1RIICZ3aWR0aCwgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGUsIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUgKnBQcmltaXRpdmUsIEZYX0ZMT0FUIGZGb250U2l6ZSk7DQotICAgIEZYX0ZMT0FUCQkJCQkJVG9Gb250U2l6ZShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUsIEZYX0ZMT0FUIGZDdXJGb250U2l6ZSk7DQotICAgIEZERV9DU1NESVNQTEFZCQkJCQlUb0Rpc3BsYXkoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCi0gICAgRkRFX0NTU1RFWFRBTElHTgkJCQlUb1RleHRBbGlnbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KLSAgICBGWF9XT1JECQkJCQkJCVRvRm9udFdlaWdodChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KLSAgICBGREVfQ1NTRk9OVFNUWUxFCQkJCVRvRm9udFN0eWxlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQotICAgIEZERV9DU1NCT1JERVJTVFlMRQkJCQlUb0JvcmRlclN0eWxlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQotICAgIEZERV9DU1NWRVJUSUNBTEFMSUdOCQkJVG9WZXJ0aWNhbEFsaWduKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQotICAgIEZERV9DU1NMSVNUU1RZTEVUWVBFCQkJVG9MaXN0U3R5bGVUeXBlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQotICAgIEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTgkJVG9MaXN0U3R5bGVQb3NpdGlvbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KLSAgICBGREVfQ1NTVklTSUJJTElUWQkJCQlUb1Zpc2liaWxpdHkoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCi0gICAgRkRFX0NTU1dISVRFU1BBQ0UJCQkJVG9XaGl0ZVNwYWNlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQotICAgIEZYX0RXT1JECQkJCQkJVG9UZXh0RGVjb3JhdGlvbihJRkRFX0NTU1ZhbHVlTGlzdCAqcExpc3QpOw0KLSAgICBGREVfQ1NTVEVYVFRSQU5TRk9STQkJCVRvVGV4dFRyYW5zZm9ybShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KLSAgICBGREVfQ1NTRk9OVFZBUklBTlQJCQkJVG9Gb250VmFyaWFudChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KLSAgICBGREVfQ1NTRkxPQVQJCQkJCVRvRmxvYXQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCi0gICAgRkRFX0NTU0NMRUFSCQkJCQlUb0NsZWFyKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQotICAgIEZERV9DU1NXUklUSU5HTU9ERQkJCQlUb1dyaXRpbmdNb2RlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQotICAgIEZERV9DU1NXT1JEQlJFQUsJCQkJVG9Xb3JkQnJlYWsoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCi0gICAgRkRFX0NTU1BBR0VCUkVBSwkJCQlUb1BhZ2VCcmVhayhGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KLSAgICBGREVfQ1NTT1ZFUkZMT1cJCQkJCVRvT3ZlcmZsb3coRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCi0gICAgRkRFX0NTU0xJTkVCUkVBSwkJCQlUb0xpbmVCcmVhayhGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KLSAgICBGREVfQ1NTVEVYVENPTUJJTkUJCQkJVG9UZXh0Q29tYmluZShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KLSAgICBGWF9CT09MCQkJCQkJCVRvVGV4dEVtcGhhc2lzTWFyayhGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUsIEZERV9DU1NURVhURU1QSEFTSVNNQVJLICZlTWFyayk7DQotICAgIEZYX0JPT0wJCQkJCQkJVG9UZXh0RW1waGFzaXNGaWxsKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSwgRkRFX0NTU1RFWFRFTVBIQVNJU0ZJTEwgJmVGaWxsKTsNCi0gICAgRkRFX0NTU0NVUlNPUgkJCQkJVG9DdXJzb3IoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCi0gICAgRkRFX0NTU1BPU0lUSU9OCQkJCQlUb1Bvc2l0aW9uKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQotICAgIEZERV9DU1NDQVBUSU9OU0lERQkJCQlUb0NhcHRpb25TaWRlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQotICAgIEZERV9DU1NCS0dSRVBFQVQJCQkJVG9CS0dSZXBlYXQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCi0gICAgRkRFX0NTU0JLR0FUVEFDSE1FTlQJCQlUb0JLR0F0dGFjaG1lbnQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCi0gICAgRkRFX0NTU1JVQllBTElHTgkJCQlUb1J1YnlBbGlnbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KLSAgICBGREVfQ1NTUlVCWU9WRVJIQU5HCQkJCVRvUnVieU92ZXJoYW5nKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQotICAgIEZERV9DU1NSVUJZUE9TSVRJT04JCQkJVG9SdWJ5UG9zaXRpb24oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCi0gICAgRkRFX0NTU1JVQllTUEFOCQkJCQlUb1J1YnlTcGFuKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQotICAgIElGWF9Gb250TWdyCQkJCQkJKm1fcEZvbnRNZ3I7DQotICAgIEZYX0ZMT0FUCQkJCQkJbV9mRGVmRm9udFNpemU7DQotICAgIElGWF9NRU1BbGxvY2F0b3IJCQkJKm1fcFJ1bGVEYXRhU3RvcmU7DQotICAgIENGREVfQ1NTU3R5bGVTaGVldEFycmF5CQkJbV9TaGVldEdyb3Vwc1tGREVfQ1NTU1RZTEVTSEVFVEdST1VQX01BWF07DQotICAgIENGREVfQ1NTUnVsZUNvbGxlY3Rpb24JCQltX1J1bGVDb2xsZWN0aW9uW0ZERV9DU1NTVFlMRVNIRUVUR1JPVVBfTUFYXTsNCi0gICAgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUAkJCW1fZVByaW9yaXRpZXNbRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9NQVhdOw0KLSAgICBJRlhfTUVNQWxsb2NhdG9yCQkJCSptX3BJbmxpbmVTdHlsZVN0b3JlOw0KLSAgICBJRlhfTUVNQWxsb2NhdG9yCQkJCSptX3BGaXhlZFN0eWxlU3RvcmU7DQotICAgIENGREVfQ1NTQWNjZWxlcmF0b3IJCQkJKm1fcEFjY2VsZXJhdG9yOw0KLSAgICBDRkRFX0NTU1J1bGVEYXRhQXJyYXkJCQltX01hdGNoZWRSdWxlczsNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBSZXNldCgpOw0KKyAgdm9pZCBNYXRjaFJ1bGVzKEZERV9MUENTU1RBR0NBQ0hFIHBDYWNoZSwNCisgICAgICAgICAgICAgICAgICBGREVfTFBDU1NSVUxFREFUQSBwTGlzdCwNCisgICAgICAgICAgICAgICAgICBGREVfQ1NTUEVSU1VETyBlUGVyc3Vkb1R5cGUpOw0KKyAgdm9pZCBTb3J0UnVsZXNUbyhDRkRFX0NTU0RlY2xhcmF0aW9uQXJyYXkmIG1hdGNoRGVjbHMpOw0KKyAgRlhfQk9PTCBNYXRjaFNlbGVjdG9yKEZERV9MUENTU1RBR0NBQ0hFIHBDYWNoZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1NlbGVjdG9yKiBwU2VsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQRVJTVURPIGVQZXJzdWRvVHlwZSk7DQorICB2b2lkIEFwcGVuZElubGluZVN0eWxlKENGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4pOw0KKyAgdm9pZCBBcHBseURlY2xhcmF0aW9ucyhGWF9CT09MIGJQcmlvcml0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbioqIHBwRGVjbEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWNsQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcERlc3RTdHlsZSk7DQorICB2b2lkIEFwcGx5UHJvcGVydHkoRkRFX0NTU1BST1BFUlRZIGVQcm9wZXJ0eSwNCisgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwQ29tcHV0ZWRTdHlsZSk7DQorDQorICBGWF9GTE9BVCBBcHBseU51bWJlcihGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVW5pdCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZXJjZW50QmFzZSk7DQorICBGWF9CT09MIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NMRU5HVEgmIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcFByaW1pdGl2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplKTsNCisgIEZYX0ZMT0FUIFRvRm9udFNpemUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlLCBGWF9GTE9BVCBmQ3VyRm9udFNpemUpOw0KKyAgRkRFX0NTU0RJU1BMQVkgVG9EaXNwbGF5KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTVEVYVEFMSUdOIFRvVGV4dEFsaWduKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGWF9XT1JEIFRvRm9udFdlaWdodChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU0ZPTlRTVFlMRSBUb0ZvbnRTdHlsZShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU0JPUkRFUlNUWUxFIFRvQm9yZGVyU3R5bGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NWRVJUSUNBTEFMSUdOIFRvVmVydGljYWxBbGlnbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEUgVG9MaXN0U3R5bGVUeXBlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT04gVG9MaXN0U3R5bGVQb3NpdGlvbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1ZJU0lCSUxJVFkgVG9WaXNpYmlsaXR5KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTV0hJVEVTUEFDRSBUb1doaXRlU3BhY2UoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZYX0RXT1JEIFRvVGV4dERlY29yYXRpb24oSUZERV9DU1NWYWx1ZUxpc3QqIHBMaXN0KTsNCisgIEZERV9DU1NURVhUVFJBTlNGT1JNIFRvVGV4dFRyYW5zZm9ybShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU0ZPTlRWQVJJQU5UIFRvRm9udFZhcmlhbnQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NGTE9BVCBUb0Zsb2F0KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTQ0xFQVIgVG9DbGVhcihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1dSSVRJTkdNT0RFIFRvV3JpdGluZ01vZGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NXT1JEQlJFQUsgVG9Xb3JkQnJlYWsoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NQQUdFQlJFQUsgVG9QYWdlQnJlYWsoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NPVkVSRkxPVyBUb092ZXJmbG93KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTTElORUJSRUFLIFRvTGluZUJyZWFrKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTVEVYVENPTUJJTkUgVG9UZXh0Q29tYmluZShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRlhfQk9PTCBUb1RleHRFbXBoYXNpc01hcmsoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUksmIGVNYXJrKTsNCisgIEZYX0JPT0wgVG9UZXh0RW1waGFzaXNGaWxsKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NURVhURU1QSEFTSVNGSUxMJiBlRmlsbCk7DQorICBGREVfQ1NTQ1VSU09SIFRvQ3Vyc29yKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTUE9TSVRJT04gVG9Qb3NpdGlvbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU0NBUFRJT05TSURFIFRvQ2FwdGlvblNpZGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NCS0dSRVBFQVQgVG9CS0dSZXBlYXQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NCS0dBVFRBQ0hNRU5UIFRvQktHQXR0YWNobWVudChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1JVQllBTElHTiBUb1J1YnlBbGlnbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1JVQllPVkVSSEFORyBUb1J1YnlPdmVyaGFuZyhGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1JVQllQT1NJVElPTiBUb1J1YnlQb3NpdGlvbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1JVQllTUEFOIFRvUnVieVNwYW4oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIElGWF9Gb250TWdyKiBtX3BGb250TWdyOw0KKyAgRlhfRkxPQVQgbV9mRGVmRm9udFNpemU7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBtX3BSdWxlRGF0YVN0b3JlOw0KKyAgQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXkgbV9TaGVldEdyb3Vwc1tGREVfQ1NTU1RZTEVTSEVFVEdST1VQX01BWF07DQorICBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uIG1fUnVsZUNvbGxlY3Rpb25bRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9NQVhdOw0KKyAgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBtX2VQcmlvcml0aWVzW0ZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfTUFYXTsNCisgIElGWF9NRU1BbGxvY2F0b3IqIG1fcElubGluZVN0eWxlU3RvcmU7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBtX3BGaXhlZFN0eWxlU3RvcmU7DQorICBDRkRFX0NTU0FjY2VsZXJhdG9yKiBtX3BBY2NlbGVyYXRvcjsNCisgIENGREVfQ1NTUnVsZURhdGFBcnJheSBtX01hdGNoZWRSdWxlczsNCiB9Ow0KIHR5cGVkZWYgc3RydWN0IF9GREVfQ1NTQ09VTlRFUkRBVEEgew0KLXB1YmxpYzoNCi0gICAgX0ZERV9DU1NDT1VOVEVSREFUQSgpDQotICAgIHsNCi0gICAgICAgIEZYX21lbXNldCh0aGlzLCAwLCBzaXplb2YoX0ZERV9DU1NDT1VOVEVSREFUQSkpOw0KLSAgICB9DQotICAgIEZYX0JPT0wJCUdldENvdW50ZXJJbmNyZW1lbnQoaW50MzJfdCAmaVZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpVmFsdWUgPSBtX2lJbmNWYWw7DQotICAgICAgICByZXR1cm4gbV9iSW5jcmVtZW50Ow0KLSAgICB9DQotICAgIEZYX0JPT0wJCUdldENvdW50ZXJSZXNldChpbnQzMl90ICZpVmFsdWUpDQotICAgIHsNCi0gICAgICAgIGlWYWx1ZSA9IG1faVJlc2V0VmFsOw0KLSAgICAgICAgcmV0dXJuIG1fYlJlc2V0Ow0KLSAgICB9DQotICAgIGNvbnN0IEZYX1dDSEFSKgltX3BzeklkZW50Ow0KLSAgICBGWF9CT09MCQltX2JJbmNyZW1lbnQ7DQotICAgIEZYX0JPT0wJCW1fYlJlc2V0Ow0KLSAgICBpbnQzMl90CW1faUluY1ZhbDsNCi0gICAgaW50MzJfdAltX2lSZXNldFZhbDsNCisgcHVibGljOg0KKyAgX0ZERV9DU1NDT1VOVEVSREFUQSgpIHsgRlhfbWVtc2V0KHRoaXMsIDAsIHNpemVvZihfRkRFX0NTU0NPVU5URVJEQVRBKSk7IH0NCisgIEZYX0JPT0wgR2V0Q291bnRlckluY3JlbWVudChpbnQzMl90JiBpVmFsdWUpIHsNCisgICAgaVZhbHVlID0gbV9pSW5jVmFsOw0KKyAgICByZXR1cm4gbV9iSW5jcmVtZW50Ow0KKyAgfQ0KKyAgRlhfQk9PTCBHZXRDb3VudGVyUmVzZXQoaW50MzJfdCYgaVZhbHVlKSB7DQorICAgIGlWYWx1ZSA9IG1faVJlc2V0VmFsOw0KKyAgICByZXR1cm4gbV9iUmVzZXQ7DQorICB9DQorICBjb25zdCBGWF9XQ0hBUiogbV9wc3pJZGVudDsNCisgIEZYX0JPT0wgbV9iSW5jcmVtZW50Ow0KKyAgRlhfQk9PTCBtX2JSZXNldDsNCisgIGludDMyX3QgbV9pSW5jVmFsOw0KKyAgaW50MzJfdCBtX2lSZXNldFZhbDsNCiB9IEZERV9DU1NDT1VOVEVSREFUQSwgKkZERV9MUENTU0NPVU5URVJEQVRBOw0KLWNsYXNzIENGREVfQ1NTQ291bnRlclN0eWxlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9DU1NDb3VudGVyU3R5bGUoKTogbV9wQ291bnRlckluYyhOVUxMKSwgbV9wQ291bnRlclJlc2V0KE5VTEwpIHt9DQotICAgIHZvaWQJCQkJCQkJCQlTZXRDb3VudGVySW5jcmVtZW50TGlzdChJRkRFX0NTU1ZhbHVlTGlzdCAqcExpc3QpDQotICAgIHsNCi0gICAgICAgIG1fcENvdW50ZXJJbmMgPSBwTGlzdDsNCi0gICAgICAgIG1fYkluZGV4RGlydHkgPSBUUlVFOw0KLSAgICB9DQotICAgIHZvaWQJCQkJCQkJCQlTZXRDb3VudGVyUmVzZXRMaXN0KElGREVfQ1NTVmFsdWVMaXN0ICpwTGlzdCkNCi0gICAgew0KLSAgICAgICAgbV9wQ291bnRlclJlc2V0ID0gcExpc3Q7DQotICAgICAgICBtX2JJbmRleERpcnR5ID0gVFJVRTsNCi0gICAgfQ0KLSAgICBpbnQzMl90CQkJCQkJCQlDb3VudENvdW50ZXJzKCkNCi0gICAgew0KLSAgICAgICAgVXBkYXRlSW5kZXgoKTsNCi0gICAgICAgIHJldHVybiBtX2FyckNvdW50ZXJEYXRhLkdldFNpemUoKTsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQkJCQkJCQkJR2V0Q291bnRlckluY3JlbWVudChpbnQzMl90IGluZGV4LCBpbnQzMl90ICZpVmFsdWUpDQotICAgIHsNCi0gICAgICAgIFVwZGF0ZUluZGV4KCk7DQotICAgICAgICByZXR1cm4gbV9hcnJDb3VudGVyRGF0YS5FbGVtZW50QXQoaW5kZXgpLkdldENvdW50ZXJJbmNyZW1lbnQoaVZhbHVlKTsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQkJCQkJCQkJR2V0Q291bnRlclJlc2V0KGludDMyX3QgaW5kZXgsIGludDMyX3QgJmlWYWx1ZSkNCi0gICAgew0KLSAgICAgICAgVXBkYXRlSW5kZXgoKTsNCi0gICAgICAgIHJldHVybiBtX2FyckNvdW50ZXJEYXRhLkVsZW1lbnRBdChpbmRleCkuR2V0Q291bnRlclJlc2V0KGlWYWx1ZSk7DQotICAgIH0NCi0gICAgY29uc3QgRlhfV0NIQVIqCQkJCQkJCQlHZXRDb3VudGVySWRlbnRpZmllcihpbnQzMl90IGluZGV4KQ0KLSAgICB7DQotICAgICAgICBVcGRhdGVJbmRleCgpOw0KLSAgICAgICAgcmV0dXJuIG1fYXJyQ291bnRlckRhdGEuRWxlbWVudEF0KGluZGV4KS5tX3BzeklkZW50Ow0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQkJCQkJCQkJVXBkYXRlSW5kZXgoKTsNCi0gICAgdm9pZAkJCQkJCQkJCURvVXBkYXRlSW5kZXgoSUZERV9DU1NWYWx1ZUxpc3QgKnBMaXN0KTsNCi0gICAgaW50MzJfdAkJCQkJCQkJRmluZEluZGV4KGNvbnN0IEZYX1dDSEFSKiBwc3pJZGVudGlmaWVyKTsNCi0gICAgSUZERV9DU1NWYWx1ZUxpc3QJCQkJCQkqbV9wQ291bnRlckluYzsNCi0gICAgSUZERV9DU1NWYWx1ZUxpc3QJCQkJCQkqbV9wQ291bnRlclJlc2V0Ow0KLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxGREVfQ1NTQ09VTlRFUkRBVEE+CW1fYXJyQ291bnRlckRhdGE7DQotICAgIEZYX0JPT0wJCQkJCQkJCQltX2JJbmRleERpcnR5Ow0KK2NsYXNzIENGREVfQ1NTQ291bnRlclN0eWxlIHsNCisgcHVibGljOg0KKyAgQ0ZERV9DU1NDb3VudGVyU3R5bGUoKSA6IG1fcENvdW50ZXJJbmMoTlVMTCksIG1fcENvdW50ZXJSZXNldChOVUxMKSB7fQ0KKyAgdm9pZCBTZXRDb3VudGVySW5jcmVtZW50TGlzdChJRkRFX0NTU1ZhbHVlTGlzdCogcExpc3QpIHsNCisgICAgbV9wQ291bnRlckluYyA9IHBMaXN0Ow0KKyAgICBtX2JJbmRleERpcnR5ID0gVFJVRTsNCisgIH0NCisgIHZvaWQgU2V0Q291bnRlclJlc2V0TGlzdChJRkRFX0NTU1ZhbHVlTGlzdCogcExpc3QpIHsNCisgICAgbV9wQ291bnRlclJlc2V0ID0gcExpc3Q7DQorICAgIG1fYkluZGV4RGlydHkgPSBUUlVFOw0KKyAgfQ0KKyAgaW50MzJfdCBDb3VudENvdW50ZXJzKCkgew0KKyAgICBVcGRhdGVJbmRleCgpOw0KKyAgICByZXR1cm4gbV9hcnJDb3VudGVyRGF0YS5HZXRTaXplKCk7DQorICB9DQorICBGWF9CT09MIEdldENvdW50ZXJJbmNyZW1lbnQoaW50MzJfdCBpbmRleCwgaW50MzJfdCYgaVZhbHVlKSB7DQorICAgIFVwZGF0ZUluZGV4KCk7DQorICAgIHJldHVybiBtX2FyckNvdW50ZXJEYXRhLkVsZW1lbnRBdChpbmRleCkuR2V0Q291bnRlckluY3JlbWVudChpVmFsdWUpOw0KKyAgfQ0KKyAgRlhfQk9PTCBHZXRDb3VudGVyUmVzZXQoaW50MzJfdCBpbmRleCwgaW50MzJfdCYgaVZhbHVlKSB7DQorICAgIFVwZGF0ZUluZGV4KCk7DQorICAgIHJldHVybiBtX2FyckNvdW50ZXJEYXRhLkVsZW1lbnRBdChpbmRleCkuR2V0Q291bnRlclJlc2V0KGlWYWx1ZSk7DQorICB9DQorICBjb25zdCBGWF9XQ0hBUiogR2V0Q291bnRlcklkZW50aWZpZXIoaW50MzJfdCBpbmRleCkgew0KKyAgICBVcGRhdGVJbmRleCgpOw0KKyAgICByZXR1cm4gbV9hcnJDb3VudGVyRGF0YS5FbGVtZW50QXQoaW5kZXgpLm1fcHN6SWRlbnQ7DQorICB9DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgVXBkYXRlSW5kZXgoKTsNCisgIHZvaWQgRG9VcGRhdGVJbmRleChJRkRFX0NTU1ZhbHVlTGlzdCogcExpc3QpOw0KKyAgaW50MzJfdCBGaW5kSW5kZXgoY29uc3QgRlhfV0NIQVIqIHBzeklkZW50aWZpZXIpOw0KKyAgSUZERV9DU1NWYWx1ZUxpc3QqIG1fcENvdW50ZXJJbmM7DQorICBJRkRFX0NTU1ZhbHVlTGlzdCogbV9wQ291bnRlclJlc2V0Ow0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8RkRFX0NTU0NPVU5URVJEQVRBPiBtX2FyckNvdW50ZXJEYXRhOw0KKyAgRlhfQk9PTCBtX2JJbmRleERpcnR5Ow0KIH07DQotY2xhc3MgQ0ZERV9DU1NJbmhlcml0ZWREYXRhDQotew0KLXB1YmxpYzoNCi0gICAgdm9pZAkJCQkJCQlSZXNldCgpDQotICAgIHsNCi0gICAgICAgIEZYX21lbXNldCh0aGlzLCAwLCBzaXplb2YoQ0ZERV9DU1NJbmhlcml0ZWREYXRhKSk7DQotICAgICAgICBtX0xldHRlclNwYWNpbmcuU2V0KEZERV9DU1NMRU5HVEhVTklUX05vcm1hbCk7DQotICAgICAgICBtX1dvcmRTcGFjaW5nLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Ob3JtYWwpOw0KLSAgICAgICAgbV9UZXh0SW5kZW50LlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgMCk7DQotICAgICAgICBtX2ZGb250U2l6ZSA9IDEyLjBmOw0KLSAgICAgICAgbV9mTGluZUhlaWdodCA9IDE0LjBmOw0KLSAgICAgICAgbV93Rm9udFdlaWdodCA9IDQwMDsNCi0gICAgICAgIG1fZHdGb250Q29sb3IgPSAweEZGMDAwMDAwOw0KLSAgICAgICAgbV9pV2lkb3dzID0gMjsNCi0gICAgICAgIG1fYlRleHRFbXBoYXNpc0NvbG9yQ3VycmVudCA9IFRSVUU7DQotICAgICAgICBtX2lPcnBoYW5zID0gMjsNCi0gICAgfQ0KLSAgICBjb25zdCBGWF9XQ0hBUioJCQkJCQltX3Bzekxpc3RTdHlsZUltYWdlOw0KLSAgICBGREVfQ1NTTEVOR1RICQkJCQltX0xldHRlclNwYWNpbmc7DQotICAgIEZERV9DU1NMRU5HVEgJCQkJCW1fV29yZFNwYWNpbmc7DQotICAgIEZERV9DU1NMRU5HVEgJCQkJCW1fVGV4dEluZGVudDsNCi0gICAgSUZERV9DU1NWYWx1ZUxpc3QJCQkJKm1fcEZvbnRGYW1pbHk7DQotICAgIElGREVfQ1NTVmFsdWVMaXN0CQkJCSptX3BRdW90ZXM7DQotICAgIElGREVfQ1NTVmFsdWVMaXN0CQkJCSptX3BDdXJzb3JVcmlzOw0KLSAgICBGREVfQ1NTQ1VSU09SCQkJCQltX2VDdXJzb3I7DQotICAgIEZYX0ZMT0FUCQkJCQkJbV9mRm9udFNpemU7DQotICAgIEZYX0ZMT0FUCQkJCQkJbV9mTGluZUhlaWdodDsNCi0gICAgRlhfQVJHQgkJCQkJCQltX2R3Rm9udENvbG9yOw0KLSAgICBGWF9BUkdCCQkJCQkJCW1fZHdUZXh0RW1waGFzaXNDb2xvcjsNCi0gICAgRlhfV09SRAkJCQkJCQltX3dGb250V2VpZ2h0Ow0KLSAgICBpbnQzMl90CQkJCQkJbV9pV2lkb3dzOw0KLSAgICBpbnQzMl90CQkJCQkJbV9pT3JwaGFuczsNCi0gICAgY29uc3QgRlhfV0NIQVIqCQkJCQkJbV9wc3pUZXh0RW1waGFzaXNDdXN0b21NYXJrOw0KLSAgICBGWF9XT1JECQkJCQkJCW1fZUZvbnRWYXJpYW50CQk6IDE7DQotICAgIEZYX1dPUkQJCQkJCQkJbV9lRm9udFN0eWxlCQk6IDE7DQotICAgIEZYX1dPUkQJCQkJCQkJbV9iVGV4dEVtcGhhc2lzQ29sb3JDdXJyZW50OiAxOw0KLSAgICBGWF9XT1JECQkJCQkJCW1fZVRleHRBbGlnaAkJOiAyOw0KLSAgICBGWF9XT1JECQkJCQkJCW1fZVZpc2liaWxpdHkJCTogMjsNCi0gICAgRlhfV09SRAkJCQkJCQltX2VXaGl0ZVNwYWNlCQk6IDM7DQotICAgIEZYX1dPUkQJCQkJCQkJbV9lVGV4dFRyYW5zZm9ybQk6IDI7DQotICAgIEZYX1dPUkQJCQkJCQkJbV9lV3JpdGluZ01vZGUJCTogMjsNCi0gICAgRlhfV09SRAkJCQkJCQltX2VXb3JkQnJlYWsJCTogMjsNCi0gICAgRlhfV09SRAkJCQkJCQltX2VMaW5lQnJlYWsJCTogMjsNCi0gICAgRlhfV09SRAkJCQkJCQltX2VUZXh0RW1waGFzaXNGaWxsCTogMTsNCi0gICAgRlhfV09SRAkJCQkJCQltX2VUZXh0RW1waGFzaXNNYXJrCTogMzsNCi0gICAgRlhfV09SRAkJCQkJCQltX2VDYXB0aW9uU2lkZQkJOiAzOw0KK2NsYXNzIENGREVfQ1NTSW5oZXJpdGVkRGF0YSB7DQorIHB1YmxpYzoNCisgIHZvaWQgUmVzZXQoKSB7DQorICAgIEZYX21lbXNldCh0aGlzLCAwLCBzaXplb2YoQ0ZERV9DU1NJbmhlcml0ZWREYXRhKSk7DQorICAgIG1fTGV0dGVyU3BhY2luZy5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfTm9ybWFsKTsNCisgICAgbV9Xb3JkU3BhY2luZy5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfTm9ybWFsKTsNCisgICAgbV9UZXh0SW5kZW50LlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgMCk7DQorICAgIG1fZkZvbnRTaXplID0gMTIuMGY7DQorICAgIG1fZkxpbmVIZWlnaHQgPSAxNC4wZjsNCisgICAgbV93Rm9udFdlaWdodCA9IDQwMDsNCisgICAgbV9kd0ZvbnRDb2xvciA9IDB4RkYwMDAwMDA7DQorICAgIG1faVdpZG93cyA9IDI7DQorICAgIG1fYlRleHRFbXBoYXNpc0NvbG9yQ3VycmVudCA9IFRSVUU7DQorICAgIG1faU9ycGhhbnMgPSAyOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIG1fcHN6TGlzdFN0eWxlSW1hZ2U7DQorICBGREVfQ1NTTEVOR1RIIG1fTGV0dGVyU3BhY2luZzsNCisgIEZERV9DU1NMRU5HVEggbV9Xb3JkU3BhY2luZzsNCisgIEZERV9DU1NMRU5HVEggbV9UZXh0SW5kZW50Ow0KKyAgSUZERV9DU1NWYWx1ZUxpc3QqIG1fcEZvbnRGYW1pbHk7DQorICBJRkRFX0NTU1ZhbHVlTGlzdCogbV9wUXVvdGVzOw0KKyAgSUZERV9DU1NWYWx1ZUxpc3QqIG1fcEN1cnNvclVyaXM7DQorICBGREVfQ1NTQ1VSU09SIG1fZUN1cnNvcjsNCisgIEZYX0ZMT0FUIG1fZkZvbnRTaXplOw0KKyAgRlhfRkxPQVQgbV9mTGluZUhlaWdodDsNCisgIEZYX0FSR0IgbV9kd0ZvbnRDb2xvcjsNCisgIEZYX0FSR0IgbV9kd1RleHRFbXBoYXNpc0NvbG9yOw0KKyAgRlhfV09SRCBtX3dGb250V2VpZ2h0Ow0KKyAgaW50MzJfdCBtX2lXaWRvd3M7DQorICBpbnQzMl90IG1faU9ycGhhbnM7DQorICBjb25zdCBGWF9XQ0hBUiogbV9wc3pUZXh0RW1waGFzaXNDdXN0b21NYXJrOw0KKyAgRlhfV09SRCBtX2VGb250VmFyaWFudCA6IDE7DQorICBGWF9XT1JEIG1fZUZvbnRTdHlsZSA6IDE7DQorICBGWF9XT1JEIG1fYlRleHRFbXBoYXNpc0NvbG9yQ3VycmVudCA6IDE7DQorICBGWF9XT1JEIG1fZVRleHRBbGlnaCA6IDI7DQorICBGWF9XT1JEIG1fZVZpc2liaWxpdHkgOiAyOw0KKyAgRlhfV09SRCBtX2VXaGl0ZVNwYWNlIDogMzsNCisgIEZYX1dPUkQgbV9lVGV4dFRyYW5zZm9ybSA6IDI7DQorICBGWF9XT1JEIG1fZVdyaXRpbmdNb2RlIDogMjsNCisgIEZYX1dPUkQgbV9lV29yZEJyZWFrIDogMjsNCisgIEZYX1dPUkQgbV9lTGluZUJyZWFrIDogMjsNCisgIEZYX1dPUkQgbV9lVGV4dEVtcGhhc2lzRmlsbCA6IDE7DQorICBGWF9XT1JEIG1fZVRleHRFbXBoYXNpc01hcmsgOiAzOw0KKyAgRlhfV09SRCBtX2VDYXB0aW9uU2lkZSA6IDM7DQogDQotICAgIEZYX1dPUkQJCQkJCQkJbV9lUnVieUFsaWduCQk6IDQ7DQotICAgIEZYX1dPUkQJCQkJCQkJbV9lUnVieU92ZXJoYW5nCQk6IDI7DQotICAgIEZYX1dPUkQJCQkJCQkJbV9lUnVieVBvc2l0aW9uCQk6IDI7DQorICBGWF9XT1JEIG1fZVJ1YnlBbGlnbiA6IDQ7DQorICBGWF9XT1JEIG1fZVJ1YnlPdmVyaGFuZyA6IDI7DQorICBGWF9XT1JEIG1fZVJ1YnlQb3NpdGlvbiA6IDI7DQogfTsNCi1jbGFzcyBDRkRFX0NTU05vbkluaGVyaXRlZERhdGENCi17DQotcHVibGljOg0KLSAgICB2b2lkCQkJCQkJCVJlc2V0KCkNCi0gICAgew0KLSAgICAgICAgRlhfbWVtc2V0KHRoaXMsIDAsIHNpemVvZihDRkRFX0NTU05vbkluaGVyaXRlZERhdGEpKTsNCi0gICAgICAgIG1fTWFyZ2luV2lkdGggPSBtX0JvcmRlcldpZHRoID0gbV9QYWRkaW5nV2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCAwKTsNCi0gICAgICAgIG1fTWluQm94U2l6ZS5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIDApOw0KLSAgICAgICAgbV9NYXhCb3hTaXplLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Ob25lKTsNCi0gICAgICAgIG1fZURpc3BsYXkgPSBGREVfQ1NTRElTUExBWV9JbmxpbmU7DQotICAgICAgICBtX2ZWZXJ0aWNhbEFsaWduID0gMC4wZjsNCi0gICAgICAgIG1fQ29sdW1uQ291bnQuU2V0KEZERV9DU1NMRU5HVEhVTklUX0F1dG8pOw0KLSAgICAgICAgbV9Db2x1bW5HYXAuU2V0KEZERV9DU1NMRU5HVEhVTklUX05vcm1hbCk7DQotICAgICAgICBtX2JDb2x1bW5SdWxlQ29sb3JTYW1lID0gVFJVRTsNCi0gICAgICAgIG1fQ29sdW1uV2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX0F1dG8pOw0KLSAgICAgICAgbV9Db2x1bW5SdWxlV2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX0F1dG8pOw0KLSAgICAgICAgbV9lVGV4dENvbWJpbmUgPSBGREVfQ1NTVEVYVENPTUJJTkVfTm9uZTsNCi0gICAgfQ0KK2NsYXNzIENGREVfQ1NTTm9uSW5oZXJpdGVkRGF0YSB7DQorIHB1YmxpYzoNCisgIHZvaWQgUmVzZXQoKSB7DQorICAgIEZYX21lbXNldCh0aGlzLCAwLCBzaXplb2YoQ0ZERV9DU1NOb25Jbmhlcml0ZWREYXRhKSk7DQorICAgIG1fTWFyZ2luV2lkdGggPSBtX0JvcmRlcldpZHRoID0NCisgICAgICAgIG1fUGFkZGluZ1dpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgMCk7DQorICAgIG1fTWluQm94U2l6ZS5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIDApOw0KKyAgICBtX01heEJveFNpemUuU2V0KEZERV9DU1NMRU5HVEhVTklUX05vbmUpOw0KKyAgICBtX2VEaXNwbGF5ID0gRkRFX0NTU0RJU1BMQVlfSW5saW5lOw0KKyAgICBtX2ZWZXJ0aWNhbEFsaWduID0gMC4wZjsNCisgICAgbV9Db2x1bW5Db3VudC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfQXV0byk7DQorICAgIG1fQ29sdW1uR2FwLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Ob3JtYWwpOw0KKyAgICBtX2JDb2x1bW5SdWxlQ29sb3JTYW1lID0gVFJVRTsNCisgICAgbV9Db2x1bW5XaWR0aC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfQXV0byk7DQorICAgIG1fQ29sdW1uUnVsZVdpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9BdXRvKTsNCisgICAgbV9lVGV4dENvbWJpbmUgPSBGREVfQ1NTVEVYVENPTUJJTkVfTm9uZTsNCisgIH0NCiANCi0gICAgSUZERV9DU1NWYWx1ZUxpc3QJCQkJKm1fcENvbnRlbnRMaXN0Ow0KLSAgICBDRkRFX0NTU0NvdW50ZXJTdHlsZQkJCSptX3BDb3VudGVyU3R5bGU7DQotICAgIEZERV9DU1NSRUNUCQkJCQkJbV9NYXJnaW5XaWR0aDsNCi0gICAgRkRFX0NTU1JFQ1QJCQkJCQltX0JvcmRlcldpZHRoOw0KLSAgICBGREVfQ1NTUkVDVAkJCQkJCW1fUGFkZGluZ1dpZHRoOw0KLSAgICBGREVfQ1NTU0laRQkJCQkJCW1fQm94U2l6ZTsNCi0gICAgRkRFX0NTU1NJWkUJCQkJCQltX01pbkJveFNpemU7DQotICAgIEZERV9DU1NTSVpFCQkJCQkJbV9NYXhCb3hTaXplOw0KLSAgICBGREVfQ1NTUE9JTlQJCQkJCW1fQktHUG9zaXRpb247DQotICAgIGNvbnN0IEZYX1dDSEFSKgkJCQkJCW1fcHN6QktHSW1hZ2U7DQotICAgIEZYX0FSR0IJCQkJCQkJbV9kd0JLR0NvbG9yOw0KLSAgICBGWF9BUkdCCQkJCQkJCW1fZHdCRFJMZWZ0Q29sb3I7DQotICAgIEZYX0FSR0IJCQkJCQkJbV9kd0JEUlRvcENvbG9yOw0KLSAgICBGWF9BUkdCCQkJCQkJCW1fZHdCRFJSaWdodENvbG9yOw0KLSAgICBGWF9BUkdCCQkJCQkJCW1fZHdCRFJCb3R0b21Db2xvcjsNCi0gICAgSUZERV9DU1NWYWx1ZQkJCQkJKm1fcFJ1YnlTcGFuOw0KLSAgICBGREVfQ1NTTEVOR1RICQkJCQltX0NvbHVtbkNvdW50Ow0KLSAgICBGREVfQ1NTTEVOR1RICQkJCQltX0NvbHVtbkdhcDsNCi0gICAgRkRFX0NTU0xFTkdUSAkJCQkJbV9Db2x1bW5SdWxlV2lkdGg7DQotICAgIEZERV9DU1NMRU5HVEgJCQkJCW1fQ29sdW1uV2lkdGg7DQotICAgIEZYX0FSR0IJCQkJCQkJbV9kd0NvbHVtblJ1bGVDb2xvcjsNCi0gICAgRkRFX0NTU0xFTkdUSAkJCQkJbV9Ub3A7DQotICAgIEZERV9DU1NMRU5HVEgJCQkJCW1fQm90dG9tOw0KLSAgICBGREVfQ1NTTEVOR1RICQkJCQltX0xlZnQ7DQotICAgIEZERV9DU1NMRU5HVEgJCQkJCW1fUmlnaHQ7DQorICBJRkRFX0NTU1ZhbHVlTGlzdCogbV9wQ29udGVudExpc3Q7DQorICBDRkRFX0NTU0NvdW50ZXJTdHlsZSogbV9wQ291bnRlclN0eWxlOw0KKyAgRkRFX0NTU1JFQ1QgbV9NYXJnaW5XaWR0aDsNCisgIEZERV9DU1NSRUNUIG1fQm9yZGVyV2lkdGg7DQorICBGREVfQ1NTUkVDVCBtX1BhZGRpbmdXaWR0aDsNCisgIEZERV9DU1NTSVpFIG1fQm94U2l6ZTsNCisgIEZERV9DU1NTSVpFIG1fTWluQm94U2l6ZTsNCisgIEZERV9DU1NTSVpFIG1fTWF4Qm94U2l6ZTsNCisgIEZERV9DU1NQT0lOVCBtX0JLR1Bvc2l0aW9uOw0KKyAgY29uc3QgRlhfV0NIQVIqIG1fcHN6QktHSW1hZ2U7DQorICBGWF9BUkdCIG1fZHdCS0dDb2xvcjsNCisgIEZYX0FSR0IgbV9kd0JEUkxlZnRDb2xvcjsNCisgIEZYX0FSR0IgbV9kd0JEUlRvcENvbG9yOw0KKyAgRlhfQVJHQiBtX2R3QkRSUmlnaHRDb2xvcjsNCisgIEZYX0FSR0IgbV9kd0JEUkJvdHRvbUNvbG9yOw0KKyAgSUZERV9DU1NWYWx1ZSogbV9wUnVieVNwYW47DQorICBGREVfQ1NTTEVOR1RIIG1fQ29sdW1uQ291bnQ7DQorICBGREVfQ1NTTEVOR1RIIG1fQ29sdW1uR2FwOw0KKyAgRkRFX0NTU0xFTkdUSCBtX0NvbHVtblJ1bGVXaWR0aDsNCisgIEZERV9DU1NMRU5HVEggbV9Db2x1bW5XaWR0aDsNCisgIEZYX0FSR0IgbV9kd0NvbHVtblJ1bGVDb2xvcjsNCisgIEZERV9DU1NMRU5HVEggbV9Ub3A7DQorICBGREVfQ1NTTEVOR1RIIG1fQm90dG9tOw0KKyAgRkRFX0NTU0xFTkdUSCBtX0xlZnQ7DQorICBGREVfQ1NTTEVOR1RIIG1fUmlnaHQ7DQogDQotICAgIEZYX0ZMT0FUCQkJCQkJbV9mVmVydGljYWxBbGlnbjsNCi0gICAgRlhfRkxPQVQJCQkJCQltX2ZUZXh0Q29tYmluZU51bWJlcjsNCi0gICAgRlhfRFdPUkQJCQkJCQltX2VCRFJMZWZ0U3R5bGUJCTogNDsNCi0gICAgRlhfRFdPUkQJCQkJCQltX2VCRFJUb3BTdHlsZQkJOiA0Ow0KLSAgICBGWF9EV09SRAkJCQkJCW1fZUJEUlJpZ2h0U3R5bGUJOiA0Ow0KLSAgICBGWF9EV09SRAkJCQkJCW1fZUJEUkJvdHRvbVN0eWxlCTogNDsNCi0gICAgRlhfRFdPUkQJCQkJCQltX2VEaXNwbGF5CQkJOiA1Ow0KLSAgICBGWF9EV09SRAkJCQkJCW1fZVZlcnRpY2FsQWxpZ24JOiA0Ow0KLSAgICBGWF9EV09SRAkJCQkJCW1fZUxpc3RTdHlsZVR5cGUJOiA1Ow0KLSAgICBGWF9EV09SRAkJCQkJCW1fZUNvbHVtblJ1bGVTdHlsZSAgOiA0Ow0KLSAgICBGWF9EV09SRAkJCQkJCW1fZVBhZ2VCcmVha0luc2lkZQk6IDM7DQotICAgIEZYX0RXT1JECQkJCQkJbV9lUGFnZUJyZWFrQWZ0ZXIJOiAzOw0KLSAgICBGWF9EV09SRAkJCQkJCW1fZVBhZ2VCcmVha0JlZm9yZQk6IDM7DQotICAgIEZYX0RXT1JECQkJCQkJbV9lUG9zaXRpb24JCQk6IDI7DQotICAgIEZYX0RXT1JECQkJCQkJbV9lQktHUmVwZWF0CQk6IDI7DQotICAgIEZYX0RXT1JECQkJCQkJbV9lRmxvYXQJCQk6IDI7DQotICAgIEZYX0RXT1JECQkJCQkJbV9lQ2xlYXIJCQk6IDI7DQotICAgIEZYX0RXT1JECQkJCQkJbV9lT3ZlcmZsb3dYCQk6IDM7DQotICAgIEZYX0RXT1JECQkJCQkJbV9lT3ZlcmZsb3dZCQk6IDM7DQotICAgIEZYX0RXT1JECQkJCQkJbV9lTGlzdFN0eWxlUG9zaXRpb246IDE7DQotICAgIEZYX0RXT1JECQkJCQkJbV9lQktHQXR0YWNobWVudAk6IDE7DQotICAgIEZYX0RXT1JECQkJCQkJbV9iSGFzTWFyZ2luCQk6IDE7DQotICAgIEZYX0RXT1JECQkJCQkJbV9iSGFzQm9yZGVyCQk6IDE7DQotICAgIEZYX0RXT1JECQkJCQkJbV9iSGFzUGFkZGluZwkJOiAxOw0KLSAgICBGWF9EV09SRAkJCQkJCW1fZHdUZXh0RGVjb3JhdGlvbgk6IDU7DQotICAgIEZYX0RXT1JECQkJCQkJbV9lVGV4dENvbWJpbmUJCTogMTsNCi0gICAgRlhfRFdPUkQJCQkJCQltX2JDb2x1bW5SdWxlQ29sb3JTYW1lICA6IDE7DQotICAgIEZYX0RXT1JECQkJCQkJbV9iSGFzVGV4dENvbWJpbmVOdW1iZXIgOiAxOw0KKyAgRlhfRkxPQVQgbV9mVmVydGljYWxBbGlnbjsNCisgIEZYX0ZMT0FUIG1fZlRleHRDb21iaW5lTnVtYmVyOw0KKyAgRlhfRFdPUkQgbV9lQkRSTGVmdFN0eWxlIDogNDsNCisgIEZYX0RXT1JEIG1fZUJEUlRvcFN0eWxlIDogNDsNCisgIEZYX0RXT1JEIG1fZUJEUlJpZ2h0U3R5bGUgOiA0Ow0KKyAgRlhfRFdPUkQgbV9lQkRSQm90dG9tU3R5bGUgOiA0Ow0KKyAgRlhfRFdPUkQgbV9lRGlzcGxheSA6IDU7DQorICBGWF9EV09SRCBtX2VWZXJ0aWNhbEFsaWduIDogNDsNCisgIEZYX0RXT1JEIG1fZUxpc3RTdHlsZVR5cGUgOiA1Ow0KKyAgRlhfRFdPUkQgbV9lQ29sdW1uUnVsZVN0eWxlIDogNDsNCisgIEZYX0RXT1JEIG1fZVBhZ2VCcmVha0luc2lkZSA6IDM7DQorICBGWF9EV09SRCBtX2VQYWdlQnJlYWtBZnRlciA6IDM7DQorICBGWF9EV09SRCBtX2VQYWdlQnJlYWtCZWZvcmUgOiAzOw0KKyAgRlhfRFdPUkQgbV9lUG9zaXRpb24gOiAyOw0KKyAgRlhfRFdPUkQgbV9lQktHUmVwZWF0IDogMjsNCisgIEZYX0RXT1JEIG1fZUZsb2F0IDogMjsNCisgIEZYX0RXT1JEIG1fZUNsZWFyIDogMjsNCisgIEZYX0RXT1JEIG1fZU92ZXJmbG93WCA6IDM7DQorICBGWF9EV09SRCBtX2VPdmVyZmxvd1kgOiAzOw0KKyAgRlhfRFdPUkQgbV9lTGlzdFN0eWxlUG9zaXRpb24gOiAxOw0KKyAgRlhfRFdPUkQgbV9lQktHQXR0YWNobWVudCA6IDE7DQorICBGWF9EV09SRCBtX2JIYXNNYXJnaW4gOiAxOw0KKyAgRlhfRFdPUkQgbV9iSGFzQm9yZGVyIDogMTsNCisgIEZYX0RXT1JEIG1fYkhhc1BhZGRpbmcgOiAxOw0KKyAgRlhfRFdPUkQgbV9kd1RleHREZWNvcmF0aW9uIDogNTsNCisgIEZYX0RXT1JEIG1fZVRleHRDb21iaW5lIDogMTsNCisgIEZYX0RXT1JEIG1fYkNvbHVtblJ1bGVDb2xvclNhbWUgOiAxOw0KKyAgRlhfRFdPUkQgbV9iSGFzVGV4dENvbWJpbmVOdW1iZXIgOiAxOw0KIH07DQotY2xhc3MgQ0ZERV9DU1NDb21wdXRlZFN0eWxlIDogcHVibGljIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSwgcHVibGljIElGREVfQ1NTRm9udFN0eWxlLA0KLSAgICBwdWJsaWMgSUZERV9DU1NCb3VuZGFyeVN0eWxlLCBwdWJsaWMgSUZERV9DU1NQb3NpdGlvblN0eWxlLA0KLSAgICBwdWJsaWMgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSwgcHVibGljIElGREVfQ1NTQmFja2dyb3VuZFN0eWxlLA0KLSAgICBwdWJsaWMgSUZERV9DU1NWaXN1YWxTdHlsZSwgcHVibGljIElGREVfQ1NTTGlzdFN0eWxlLA0KLSAgICBwdWJsaWMgSUZERV9DU1NNdWx0aUNvbHVtblN0eWxlLCBwdWJsaWMgSUZERV9DU1NHZW5lcmF0ZWRDb250ZW50U3R5bGUsDQotICAgIHB1YmxpYyBJRkRFX0NTU1RhYmxlU3R5bGUsIHB1YmxpYyBJRkRFX0NTU1J1YnlTdHlsZSwNCi0gICAgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUoSUZYX01FTUFsbG9jYXRvciAqcEFsbG9jKSA6IG1fZHdSZWZDb3VudCgxKSwgbV9wQWxsb2NhdG9yKHBBbGxvYykge30NCi0gICAgfkNGREVfQ1NTQ29tcHV0ZWRTdHlsZSgpIHt9DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJQWRkUmVmKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICsrbV9kd1JlZkNvdW50Ow0KK2NsYXNzIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSA6IHB1YmxpYyBJRkRFX0NTU0NvbXB1dGVkU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElGREVfQ1NTRm9udFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJRkRFX0NTU0JvdW5kYXJ5U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElGREVfQ1NTUG9zaXRpb25TdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUZERV9DU1NCYWNrZ3JvdW5kU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElGREVfQ1NTVmlzdWFsU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElGREVfQ1NTTGlzdFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJRkRFX0NTU011bHRpQ29sdW1uU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElGREVfQ1NTR2VuZXJhdGVkQ29udGVudFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJRkRFX0NTU1RhYmxlU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElGREVfQ1NTUnVieVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9DU1NDb21wdXRlZFN0eWxlKElGWF9NRU1BbGxvY2F0b3IqIHBBbGxvYykNCisgICAgICA6IG1fZHdSZWZDb3VudCgxKSwgbV9wQWxsb2NhdG9yKHBBbGxvYykge30NCisgIH5DRkRFX0NTU0NvbXB1dGVkU3R5bGUoKSB7fQ0KKyAgdmlydHVhbCBGWF9EV09SRCBBZGRSZWYoKSB7IHJldHVybiArK21fZHdSZWZDb3VudDsgfQ0KKyAgdmlydHVhbCBGWF9EV09SRCBSZWxlYXNlKCkgew0KKyAgICBGWF9EV09SRCBkd1JlZkNvdW50ID0gLS1tX2R3UmVmQ291bnQ7DQorICAgIGlmIChkd1JlZkNvdW50ID09IDApIHsNCisgICAgICBpZiAobV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZSAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgbV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZTsNCisgICAgICB9DQorICAgICAgRkRFX0RlbGV0ZVdpdGgoQ0ZERV9DU1NDb21wdXRlZFN0eWxlLCBtX3BBbGxvY2F0b3IsIHRoaXMpOw0KICAgICB9DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIEZYX0RXT1JEIGR3UmVmQ291bnQgPSAtLW1fZHdSZWZDb3VudDsNCi0gICAgICAgIGlmIChkd1JlZkNvdW50ID09IDApIHsNCi0gICAgICAgICAgICBpZiAobV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGREVfRGVsZXRlV2l0aChDRkRFX0NTU0NvbXB1dGVkU3R5bGUsIG1fcEFsbG9jYXRvciwgdGhpcyk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZHdSZWZDb3VudDsNCi0gICAgfQ0KKyAgICByZXR1cm4gZHdSZWZDb3VudDsNCisgIH0NCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCQlSZXNldCgpDQotICAgIHsNCi0gICAgICAgIG1fSW5oZXJpdGVkRGF0YS5SZXNldCgpOw0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLlJlc2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5SZXNldCgpOw0KKyAgICBtX05vbkluaGVyaXRlZERhdGEuUmVzZXQoKTsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NGb250U3R5bGUqIEdldEZvbnRTdHlsZXMoKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NGb250U3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NCb3VuZGFyeVN0eWxlKiBHZXRCb3VuZGFyeVN0eWxlcygpIGNvbnN0IHsNCisgICAgcmV0dXJuIChJRkRFX0NTU0JvdW5kYXJ5U3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NQb3NpdGlvblN0eWxlKiBHZXRQb3NpdGlvblN0eWxlcygpIGNvbnN0IHsNCisgICAgcmV0dXJuIChJRkRFX0NTU1Bvc2l0aW9uU3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSogR2V0UGFyYWdyYXBoU3R5bGVzKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKElGREVfQ1NTUGFyYWdyYXBoU3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NCYWNrZ3JvdW5kU3R5bGUqIEdldEJhY2tncm91bmRTdHlsZXMoKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NCYWNrZ3JvdW5kU3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NWaXN1YWxTdHlsZSogR2V0VmlzdWFsU3R5bGVzKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKElGREVfQ1NTVmlzdWFsU3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NMaXN0U3R5bGUqIEdldExpc3RTdHlsZXMoKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NMaXN0U3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NUYWJsZVN0eWxlKiBHZXRUYWJsZVN0eWxlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKElGREVfQ1NTVGFibGVTdHlsZSAqIGNvbnN0KSB0aGlzOw0KKyAgfQ0KKyAgdmlydHVhbCBJRkRFX0NTU011bHRpQ29sdW1uU3R5bGUqIEdldE11bHRpQ29sdW1uU3R5bGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NNdWx0aUNvbHVtblN0eWxlICogY29uc3QpIHRoaXM7DQorICB9DQorICB2aXJ0dWFsIElGREVfQ1NTR2VuZXJhdGVkQ29udGVudFN0eWxlKiBHZXRHZW5lcmF0ZWRDb250ZW50U3R5bGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NHZW5lcmF0ZWRDb250ZW50U3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NSdWJ5U3R5bGUqIEdldFJ1YnlTdHlsZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChJRkRFX0NTU1J1YnlTdHlsZSAqIGNvbnN0KSB0aGlzOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEdldEN1c3RvbVN0eWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSBjb25zdCB7DQorICAgIGZvciAoaW50MzJfdCBpID0gbV9DdXN0b21Qcm9wZXJ0aWVzLkdldFNpemUoKSAtIDI7IGkgPiAtMTsgaSAtPSAyKSB7DQorICAgICAgaWYgKHdzTmFtZSA9PSBtX0N1c3RvbVByb3BlcnRpZXNbaV0pIHsNCisgICAgICAgIHdzVmFsdWUgPSBtX0N1c3RvbVByb3BlcnRpZXNbaSArIDFdOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KICAgICB9DQotICAgIHZpcnR1YWwgSUZERV9DU1NGb250U3R5bGUqCQkJCUdldEZvbnRTdHlsZXMoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKElGREVfQ1NTRm9udFN0eWxlICogY29uc3QpdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfQ1NTQm91bmRhcnlTdHlsZSoJCQlHZXRCb3VuZGFyeVN0eWxlcygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoSUZERV9DU1NCb3VuZGFyeVN0eWxlICogY29uc3QpdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfQ1NTUG9zaXRpb25TdHlsZSoJCQlHZXRQb3NpdGlvblN0eWxlcygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoSUZERV9DU1NQb3NpdGlvblN0eWxlICogY29uc3QpdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfQ1NTUGFyYWdyYXBoU3R5bGUqCQkJR2V0UGFyYWdyYXBoU3R5bGVzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChJRkRFX0NTU1BhcmFncmFwaFN0eWxlICogY29uc3QpdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfQ1NTQmFja2dyb3VuZFN0eWxlKgkJR2V0QmFja2dyb3VuZFN0eWxlcygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoSUZERV9DU1NCYWNrZ3JvdW5kU3R5bGUgKiBjb25zdCl0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgSUZERV9DU1NWaXN1YWxTdHlsZSoJCQlHZXRWaXN1YWxTdHlsZXMoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKElGREVfQ1NTVmlzdWFsU3R5bGUgKiBjb25zdCl0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgSUZERV9DU1NMaXN0U3R5bGUqCQkJCUdldExpc3RTdHlsZXMoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKElGREVfQ1NTTGlzdFN0eWxlICogY29uc3QpdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfQ1NTVGFibGVTdHlsZSoJCQkJR2V0VGFibGVTdHlsZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoSUZERV9DU1NUYWJsZVN0eWxlICogY29uc3QpdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfQ1NTTXVsdGlDb2x1bW5TdHlsZSoJCUdldE11bHRpQ29sdW1uU3R5bGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKElGREVfQ1NTTXVsdGlDb2x1bW5TdHlsZSAqIGNvbnN0KXRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBJRkRFX0NTU0dlbmVyYXRlZENvbnRlbnRTdHlsZSoJR2V0R2VuZXJhdGVkQ29udGVudFN0eWxlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChJRkRFX0NTU0dlbmVyYXRlZENvbnRlbnRTdHlsZSAqIGNvbnN0KXRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBJRkRFX0NTU1J1YnlTdHlsZSoJCQkJR2V0UnVieVN0eWxlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChJRkRFX0NTU1J1YnlTdHlsZSAqIGNvbnN0KXRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlHZXRDdXN0b21TdHlsZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gbV9DdXN0b21Qcm9wZXJ0aWVzLkdldFNpemUoKSAtIDI7IGkgPiAtMTsgaSAtPSAyKSB7DQotICAgICAgICAgICAgaWYgKHdzTmFtZSA9PSBtX0N1c3RvbVByb3BlcnRpZXNbaV0pIHsNCi0gICAgICAgICAgICAgICAgd3NWYWx1ZSA9IG1fQ3VzdG9tUHJvcGVydGllc1tpICsgMV07DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NSVUJZQUxJR04JCUdldFJ1YnlBbGlnbigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRkRFX0NTU1JVQllBTElHTiltX0luaGVyaXRlZERhdGEubV9lUnVieUFsaWduOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU1JVQllQT1NJVElPTgkJR2V0UnVieVBvc2l0aW9uKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTUlVCWVBPU0lUSU9OKW1fSW5oZXJpdGVkRGF0YS5tX2VSdWJ5UG9zaXRpb247DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTUlVCWU9WRVJIQU5HCQlHZXRSdWJ5T3ZlcmhhbmcoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NSVUJZT1ZFUkhBTkcpbV9Jbmhlcml0ZWREYXRhLm1fZVJ1YnlPdmVyaGFuZzsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NSVUJZU1BBTgkJCUdldFJ1YnlTcGFuVHlwZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9wUnVieVNwYW4gPT0gTlVMTCA/IEZERV9DU1NSVUJZU1BBTl9Ob25lIDogRkRFX0NTU1JVQllTUEFOX0F0dHI7DQotICAgIH0NCi0gICAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlKgkJCUdldFJ1YnlTcGFuQXR0cigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9wUnVieVNwYW47DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTQ0FQVElPTlNJREUJCUdldENhcHRpb25TaWRlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTQ0FQVElPTlNJREUpbV9Jbmhlcml0ZWREYXRhLm1fZUNhcHRpb25TaWRlOw0KLSAgICB9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlDb3VudENvdW50ZXJzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlID09IE5VTEwpID8gMCA6IG1fTm9uSW5oZXJpdGVkRGF0YS5tX3BDb3VudGVyU3R5bGUtPkNvdW50Q291bnRlcnMoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKgkJCQlHZXRDb3VudGVySWRlbnRpZmllcihpbnQzMl90IGluZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZS0+R2V0Q291bnRlcklkZW50aWZpZXIoaW5kZXgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJR2V0Q291bnRlclJlc2V0KGludDMyX3QgaW5kZXgsIGludDMyX3QgJmlWYWx1ZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX3BDb3VudGVyU3R5bGUtPkdldENvdW50ZXJSZXNldChpbmRleCwgaVZhbHVlKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUdldENvdW50ZXJJbmNyZW1lbnQoaW50MzJfdCBpbmRleCwgaW50MzJfdCAmaVZhbHVlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZS0+R2V0Q291bnRlckluY3JlbWVudChpbmRleCwgaVZhbHVlKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfQ1NTVmFsdWVMaXN0KgkJR2V0Q29udGVudCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9wQ29udGVudExpc3Q7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUNvdW50UXVvdGVzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX3BRdW90ZXMgPT0gTlVMTCA/IDAgOiBtX0luaGVyaXRlZERhdGEubV9wUXVvdGVzLT5Db3VudFZhbHVlcygpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqCQkJCUdldFF1b3RlcyhpbnQzMl90IGluZGV4KSBjb25zdA0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQobV9Jbmhlcml0ZWREYXRhLm1fcFF1b3RlcyAhPSBOVUxMICYmIG1fSW5oZXJpdGVkRGF0YS5tX3BRdW90ZXMtPkNvdW50VmFsdWVzKCkgPiBpbmRleCk7DQotICAgICAgICByZXR1cm4gKChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKikobV9Jbmhlcml0ZWREYXRhLm1fcFF1b3Rlcy0+R2V0VmFsdWUoaW5kZXgpKSktPkdldFN0cmluZyhpbmRleCk7DQotICAgIH0NCi0gICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRDb2x1bW5Db3VudCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5Db3VudDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmCUdldENvbHVtbkdhcCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5HYXA7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRDb2x1bW5SdWxlQ29sb3IoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkNvbHVtblJ1bGVDb2xvclNhbWUgPyBtX0luaGVyaXRlZERhdGEubV9kd0ZvbnRDb2xvciA6IG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3Q29sdW1uUnVsZUNvbG9yOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU0JPUkRFUlNUWUxFCQlHZXRDb2x1bW5SdWxlU3R5bGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NCT1JERVJTVFlMRSltX05vbkluaGVyaXRlZERhdGEubV9lQ29sdW1uUnVsZVN0eWxlOw0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYJR2V0Q29sdW1uUnVsZVdpZHRoKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0NvbHVtblJ1bGVXaWR0aDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmCUdldENvbHVtbldpZHRoKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0NvbHVtbldpZHRoOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Q29sdW1uQ291bnQoY29uc3QgRkRFX0NTU0xFTkdUSCAmY29sdW1uQ291bnQpDQotICAgIHsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0NvbHVtbkNvdW50ID0gY29sdW1uQ291bnQ7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2x1bW5HYXAoY29uc3QgRkRFX0NTU0xFTkdUSCAmY29sdW1uR2FwKQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5HYXAgPSBjb2x1bW5HYXA7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2x1bW5SdWxlQ29sb3IoRlhfQVJHQiBkd0NvbHVtblJ1bGVDb2xvcikNCi0gICAgew0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdDb2x1bW5SdWxlQ29sb3IgPSBkd0NvbHVtblJ1bGVDb2xvciwgbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkNvbHVtblJ1bGVDb2xvclNhbWUgPSBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldENvbHVtblJ1bGVTdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUNvbHVtblJ1bGVTdHlsZSkNCi0gICAgew0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUNvbHVtblJ1bGVTdHlsZSA9IGVDb2x1bW5SdWxlU3R5bGU7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2x1bW5SdWxlV2lkdGgoY29uc3QgRkRFX0NTU0xFTkdUSCAmY29sdW1uUnVsZVdpZHRoKQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5SdWxlV2lkdGggPSBjb2x1bW5SdWxlV2lkdGg7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDb2x1bW5XaWR0aChjb25zdCBGREVfQ1NTTEVOR1RIICZjb2x1bW5XaWR0aCkNCi0gICAgew0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fQ29sdW1uV2lkdGggPSBjb2x1bW5XaWR0aDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJQ291bnRGb250RmFtaWxpZXMoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fcEZvbnRGYW1pbHkgPyBtX0luaGVyaXRlZERhdGEubV9wRm9udEZhbWlseS0+Q291bnRWYWx1ZXMoKSA6IDA7DQotICAgIH0NCi0gICAgdmlydHVhbCBjb25zdCBGWF9XQ0hBUioJCQkJR2V0Rm9udEZhbWlseShpbnQzMl90IGluZGV4KSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKikobV9Jbmhlcml0ZWREYXRhLm1fcEZvbnRGYW1pbHktPkdldFZhbHVlKGluZGV4KSkpLT5HZXRTdHJpbmcoaW5kZXgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfV09SRAkJCQkJR2V0Rm9udFdlaWdodCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV93Rm9udFdlaWdodDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NGT05UVkFSSUFOVAkJR2V0Rm9udFZhcmlhbnQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NGT05UVkFSSUFOVCltX0luaGVyaXRlZERhdGEubV9lRm9udFZhcmlhbnQ7DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTRk9OVFNUWUxFCQlHZXRGb250U3R5bGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NGT05UU1RZTEUpbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRTdHlsZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJCUdldENvbG9yKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2R3Rm9udENvbG9yOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFdlaWdodChGWF9XT1JEIHdGb250V2VpZ2h0KQ0KLSAgICB7DQotICAgICAgICBtX0luaGVyaXRlZERhdGEubV93Rm9udFdlaWdodCA9IHdGb250V2VpZ2h0Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFZhcmlhbnQoRkRFX0NTU0ZPTlRWQVJJQU5UIGVGb250VmFyaWFudCkNCi0gICAgew0KLSAgICAgICAgbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRWYXJpYW50ID0gZUZvbnRWYXJpYW50Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFN0eWxlKEZERV9DU1NGT05UU1RZTEUgZUZvbnRTdHlsZSkNCi0gICAgew0KLSAgICAgICAgbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRTdHlsZSA9IGVGb250U3R5bGU7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpDQotICAgIHsNCi0gICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSA9IGZGb250U2l6ZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldENvbG9yKEZYX0FSR0IgZHdGb250Q29sb3IpDQotICAgIHsNCi0gICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2R3Rm9udENvbG9yID0gZHdGb250Q29sb3I7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRCb3JkZXJMZWZ0Q29sb3IoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCRFJMZWZ0Q29sb3I7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRCb3JkZXJUb3BDb2xvcigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUlRvcENvbG9yOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQVJHQgkJCQkJR2V0Qm9yZGVyUmlnaHRDb2xvcigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUlJpZ2h0Q29sb3I7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRCb3JkZXJCb3R0b21Db2xvcigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUkJvdHRvbUNvbG9yOw0KLSAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1JVQllBTElHTiBHZXRSdWJ5QWxpZ24oKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU1JVQllBTElHTiltX0luaGVyaXRlZERhdGEubV9lUnVieUFsaWduOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTUlVCWVBPU0lUSU9OIEdldFJ1YnlQb3NpdGlvbigpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTUlVCWVBPU0lUSU9OKW1fSW5oZXJpdGVkRGF0YS5tX2VSdWJ5UG9zaXRpb247DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NSVUJZT1ZFUkhBTkcgR2V0UnVieU92ZXJoYW5nKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NSVUJZT1ZFUkhBTkcpbV9Jbmhlcml0ZWREYXRhLm1fZVJ1YnlPdmVyaGFuZzsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1JVQllTUEFOIEdldFJ1YnlTcGFuVHlwZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX3BSdWJ5U3BhbiA9PSBOVUxMID8gRkRFX0NTU1JVQllTUEFOX05vbmUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRFX0NTU1JVQllTUEFOX0F0dHI7DQorICB9DQorICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqIEdldFJ1YnlTcGFuQXR0cigpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX3BSdWJ5U3BhbjsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0NBUFRJT05TSURFIEdldENhcHRpb25TaWRlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NDQVBUSU9OU0lERSltX0luaGVyaXRlZERhdGEubV9lQ2FwdGlvblNpZGU7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRDb3VudGVycygpIHsNCisgICAgcmV0dXJuIChtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlID09IE5VTEwpDQorICAgICAgICAgICAgICAgPyAwDQorICAgICAgICAgICAgICAgOiBtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlLT5Db3VudENvdW50ZXJzKCk7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRDb3VudGVySWRlbnRpZmllcihpbnQzMl90IGluZGV4KSB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlLT5HZXRDb3VudGVySWRlbnRpZmllcihpbmRleCk7DQorICB9DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q291bnRlclJlc2V0KGludDMyX3QgaW5kZXgsIGludDMyX3QmIGlWYWx1ZSkgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZS0+R2V0Q291bnRlclJlc2V0KGluZGV4LCBpVmFsdWUpOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEdldENvdW50ZXJJbmNyZW1lbnQoaW50MzJfdCBpbmRleCwgaW50MzJfdCYgaVZhbHVlKSB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlLT5HZXRDb3VudGVySW5jcmVtZW50KGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVmFsdWUpOw0KKyAgfQ0KKyAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlTGlzdCogR2V0Q29udGVudCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX3BDb250ZW50TGlzdDsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFF1b3RlcygpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX3BRdW90ZXMgPT0gTlVMTA0KKyAgICAgICAgICAgICAgID8gMA0KKyAgICAgICAgICAgICAgIDogbV9Jbmhlcml0ZWREYXRhLm1fcFF1b3Rlcy0+Q291bnRWYWx1ZXMoKTsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldFF1b3RlcyhpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChtX0luaGVyaXRlZERhdGEubV9wUXVvdGVzICE9IE5VTEwgJiYNCisgICAgICAgICAgICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX3BRdW90ZXMtPkNvdW50VmFsdWVzKCkgPiBpbmRleCk7DQorICAgIHJldHVybiAoKElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqKShtX0luaGVyaXRlZERhdGEubV9wUXVvdGVzLT5HZXRWYWx1ZSgNCisgICAgICAgICAgICAgICAgaW5kZXgpKSkNCisgICAgICAgIC0+R2V0U3RyaW5nKGluZGV4KTsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0Q29sdW1uQ291bnQoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5Db3VudDsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0Q29sdW1uR2FwKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fQ29sdW1uR2FwOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9BUkdCIEdldENvbHVtblJ1bGVDb2xvcigpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JDb2x1bW5SdWxlQ29sb3JTYW1lDQorICAgICAgICAgICAgICAgPyBtX0luaGVyaXRlZERhdGEubV9kd0ZvbnRDb2xvcg0KKyAgICAgICAgICAgICAgIDogbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdDb2x1bW5SdWxlQ29sb3I7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRSBHZXRDb2x1bW5SdWxlU3R5bGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU0JPUkRFUlNUWUxFKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VDb2x1bW5SdWxlU3R5bGU7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmIEdldENvbHVtblJ1bGVXaWR0aCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0NvbHVtblJ1bGVXaWR0aDsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0Q29sdW1uV2lkdGgoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5XaWR0aDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRDb2x1bW5Db3VudChjb25zdCBGREVfQ1NTTEVOR1RIJiBjb2x1bW5Db3VudCkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5Db3VudCA9IGNvbHVtbkNvdW50Ow0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtbkdhcChjb25zdCBGREVfQ1NTTEVOR1RIJiBjb2x1bW5HYXApIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fQ29sdW1uR2FwID0gY29sdW1uR2FwOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtblJ1bGVDb2xvcihGWF9BUkdCIGR3Q29sdW1uUnVsZUNvbG9yKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3Q29sdW1uUnVsZUNvbG9yID0gZHdDb2x1bW5SdWxlQ29sb3IsDQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JDb2x1bW5SdWxlQ29sb3JTYW1lID0gRkFMU0U7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29sdW1uUnVsZVN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQ29sdW1uUnVsZVN0eWxlKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VDb2x1bW5SdWxlU3R5bGUgPSBlQ29sdW1uUnVsZVN0eWxlOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtblJ1bGVXaWR0aChjb25zdCBGREVfQ1NTTEVOR1RIJiBjb2x1bW5SdWxlV2lkdGgpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fQ29sdW1uUnVsZVdpZHRoID0gY29sdW1uUnVsZVdpZHRoOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtbldpZHRoKGNvbnN0IEZERV9DU1NMRU5HVEgmIGNvbHVtbldpZHRoKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0NvbHVtbldpZHRoID0gY29sdW1uV2lkdGg7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRGb250RmFtaWxpZXMoKSBjb25zdCB7DQorICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9wRm9udEZhbWlseQ0KKyAgICAgICAgICAgICAgID8gbV9Jbmhlcml0ZWREYXRhLm1fcEZvbnRGYW1pbHktPkNvdW50VmFsdWVzKCkNCisgICAgICAgICAgICAgICA6IDA7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRGb250RmFtaWx5KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgcmV0dXJuICgoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopKG1fSW5oZXJpdGVkRGF0YS5tX3BGb250RmFtaWx5LT5HZXRWYWx1ZSgNCisgICAgICAgICAgICAgICAgaW5kZXgpKSkNCisgICAgICAgIC0+R2V0U3RyaW5nKGluZGV4KTsNCisgIH0NCisgIHZpcnR1YWwgRlhfV09SRCBHZXRGb250V2VpZ2h0KCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fd0ZvbnRXZWlnaHQ7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NGT05UVkFSSUFOVCBHZXRGb250VmFyaWFudCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTRk9OVFZBUklBTlQpbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRWYXJpYW50Ow0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTRk9OVFNUWUxFIEdldEZvbnRTdHlsZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTRk9OVFNUWUxFKW1fSW5oZXJpdGVkRGF0YS5tX2VGb250U3R5bGU7DQorICB9DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplOyB9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX0luaGVyaXRlZERhdGEubV9kd0ZvbnRDb2xvcjsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRXZWlnaHQoRlhfV09SRCB3Rm9udFdlaWdodCkgew0KKyAgICBtX0luaGVyaXRlZERhdGEubV93Rm9udFdlaWdodCA9IHdGb250V2VpZ2h0Ow0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRWYXJpYW50KEZERV9DU1NGT05UVkFSSUFOVCBlRm9udFZhcmlhbnQpIHsNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRWYXJpYW50ID0gZUZvbnRWYXJpYW50Ow0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRTdHlsZShGREVfQ1NTRk9OVFNUWUxFIGVGb250U3R5bGUpIHsNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRTdHlsZSA9IGVGb250U3R5bGU7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSA9IGZGb250U2l6ZTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRDb2xvcihGWF9BUkdCIGR3Rm9udENvbG9yKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2R3Rm9udENvbG9yID0gZHdGb250Q29sb3I7DQorICB9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Qm9yZGVyTGVmdENvbG9yKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCRFJMZWZ0Q29sb3I7DQorICB9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Qm9yZGVyVG9wQ29sb3IoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUlRvcENvbG9yOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9BUkdCIEdldEJvcmRlclJpZ2h0Q29sb3IoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUlJpZ2h0Q29sb3I7DQorICB9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Qm9yZGVyQm90dG9tQ29sb3IoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUkJvdHRvbUNvbG9yOw0KKyAgfQ0KIA0KLSAgICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRQkJR2V0Qm9yZGVyTGVmdFN0eWxlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTQk9SREVSU1RZTEUpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUJEUkxlZnRTdHlsZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRQkJR2V0Qm9yZGVyVG9wU3R5bGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NCT1JERVJTVFlMRSltX05vbkluaGVyaXRlZERhdGEubV9lQkRSVG9wU3R5bGU7DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUJCUdldEJvcmRlclJpZ2h0U3R5bGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NCT1JERVJTVFlMRSltX05vbkluaGVyaXRlZERhdGEubV9lQkRSUmlnaHRTdHlsZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRQkJR2V0Qm9yZGVyQm90dG9tU3R5bGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NCT1JERVJTVFlMRSltX05vbkluaGVyaXRlZERhdGEubV9lQkRSQm90dG9tU3R5bGU7DQotICAgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0JPUkRFUlNUWUxFIEdldEJvcmRlckxlZnRTdHlsZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTQk9SREVSU1RZTEUpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUJEUkxlZnRTdHlsZTsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0JPUkRFUlNUWUxFIEdldEJvcmRlclRvcFN0eWxlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NCT1JERVJTVFlMRSltX05vbkluaGVyaXRlZERhdGEubV9lQkRSVG9wU3R5bGU7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRSBHZXRCb3JkZXJSaWdodFN0eWxlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NCT1JERVJTVFlMRSltX05vbkluaGVyaXRlZERhdGEubV9lQkRSUmlnaHRTdHlsZTsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0JPUkRFUlNUWUxFIEdldEJvcmRlckJvdHRvbVN0eWxlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NCT1JERVJTVFlMRSltX05vbkluaGVyaXRlZERhdGEubV9lQkRSQm90dG9tU3R5bGU7DQorICB9DQogDQotICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1JFQ1QqCQlHZXRCb3JkZXJXaWR0aCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzQm9yZGVyID8gJihtX05vbkluaGVyaXRlZERhdGEubV9Cb3JkZXJXaWR0aCkgOiBOVUxMOw0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1JFQ1QqCQlHZXRNYXJnaW5XaWR0aCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzTWFyZ2luID8gJihtX05vbkluaGVyaXRlZERhdGEubV9NYXJnaW5XaWR0aCkgOiBOVUxMOw0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1JFQ1QqCQlHZXRQYWRkaW5nV2lkdGgoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc1BhZGRpbmcgPyAmKG1fTm9uSW5oZXJpdGVkRGF0YS5tX1BhZGRpbmdXaWR0aCkgOiBOVUxMOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyTGVmdENvbG9yKEZYX0FSR0IgZHdCb3JkZXJDb2xvcikNCi0gICAgew0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCRFJMZWZ0Q29sb3IgPSBkd0JvcmRlckNvbG9yOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyVG9wQ29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUlRvcENvbG9yID0gZHdCb3JkZXJDb2xvcjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEJvcmRlclJpZ2h0Q29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUlJpZ2h0Q29sb3IgPSBkd0JvcmRlckNvbG9yOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyQm90dG9tQ29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUkJvdHRvbUNvbG9yID0gZHdCb3JkZXJDb2xvcjsNCi0gICAgfQ0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTUkVDVCogR2V0Qm9yZGVyV2lkdGgoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzQm9yZGVyID8gJihtX05vbkluaGVyaXRlZERhdGEubV9Cb3JkZXJXaWR0aCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KKyAgfQ0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTUkVDVCogR2V0TWFyZ2luV2lkdGgoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzTWFyZ2luID8gJihtX05vbkluaGVyaXRlZERhdGEubV9NYXJnaW5XaWR0aCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KKyAgfQ0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTUkVDVCogR2V0UGFkZGluZ1dpZHRoKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc1BhZGRpbmcNCisgICAgICAgICAgICAgICA/ICYobV9Ob25Jbmhlcml0ZWREYXRhLm1fUGFkZGluZ1dpZHRoKQ0KKyAgICAgICAgICAgICAgIDogTlVMTDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJMZWZ0Q29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3QkRSTGVmdENvbG9yID0gZHdCb3JkZXJDb2xvcjsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJUb3BDb2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCRFJUb3BDb2xvciA9IGR3Qm9yZGVyQ29sb3I7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyUmlnaHRDb2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCRFJSaWdodENvbG9yID0gZHdCb3JkZXJDb2xvcjsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJCb3R0b21Db2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCRFJCb3R0b21Db2xvciA9IGR3Qm9yZGVyQ29sb3I7DQorICB9DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyTGVmdFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpDQotICAgIHsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCRFJMZWZ0U3R5bGUgPSBlQm9yZGVyU3R5bGU7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJUb3BTdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUJvcmRlclN0eWxlKQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9lQkRSVG9wU3R5bGUgPSBlQm9yZGVyU3R5bGU7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3JkZXJSaWdodFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpDQotICAgIHsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCRFJSaWdodFN0eWxlID0gZUJvcmRlclN0eWxlOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyQm90dG9tU3R5bGUoRkRFX0NTU0JPUkRFUlNUWUxFIGVCb3JkZXJTdHlsZSkNCi0gICAgew0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUJEUkJvdHRvbVN0eWxlID0gZUJvcmRlclN0eWxlOw0KLSAgICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyTGVmdFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUJEUkxlZnRTdHlsZSA9IGVCb3JkZXJTdHlsZTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJUb3BTdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUJvcmRlclN0eWxlKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCRFJUb3BTdHlsZSA9IGVCb3JkZXJTdHlsZTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJSaWdodFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUJEUlJpZ2h0U3R5bGUgPSBlQm9yZGVyU3R5bGU7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyQm90dG9tU3R5bGUoRkRFX0NTU0JPUkRFUlNUWUxFIGVCb3JkZXJTdHlsZSkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9lQkRSQm90dG9tU3R5bGUgPSBlQm9yZGVyU3R5bGU7DQorICB9DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0Qm9yZGVyV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QgJnJlY3QpDQotICAgIHsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0JvcmRlcldpZHRoID0gcmVjdDsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNCb3JkZXIgPSBUUlVFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TWFyZ2luV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QgJnJlY3QpDQotICAgIHsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX01hcmdpbldpZHRoID0gcmVjdDsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNNYXJnaW4gPSBUUlVFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0UGFkZGluZ1dpZHRoKGNvbnN0IEZERV9DU1NSRUNUICZyZWN0KQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9QYWRkaW5nV2lkdGggPSByZWN0Ow0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc1BhZGRpbmcgPSBUUlVFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU0RJU1BMQVkJCQlHZXREaXNwbGF5KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTRElTUExBWSltX05vbkluaGVyaXRlZERhdGEubV9lRGlzcGxheTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NTSVpFJgkJR2V0Qm94U2l6ZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Cb3hTaXplOw0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1NJWkUmCQlHZXRNaW5Cb3hTaXplKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX01pbkJveFNpemU7DQotICAgIH0NCi0gICAgdmlydHVhbCBjb25zdCBGREVfQ1NTU0laRSYJCUdldE1heEJveFNpemUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fTWF4Qm94U2l6ZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NGTE9BVAkJCUdldEZsb2F0KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTRkxPQVQpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUZsb2F0Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU0NMRUFSCQkJR2V0Q2xlYXIoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NDTEVBUiltX05vbkluaGVyaXRlZERhdGEubV9lQ2xlYXI7DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTUE9TSVRJT04JCQlHZXRQb3NpdGlvbigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRkRFX0NTU1BPU0lUSU9OKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VQb3NpdGlvbjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NMRU5HVEgJCQlHZXRUb3AoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fVG9wOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU0xFTkdUSAkJCUdldEJvdHRvbSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Cb3R0b207DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTTEVOR1RICQkJR2V0TGVmdCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9MZWZ0Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU0xFTkdUSAkJCUdldFJpZ2h0KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX1JpZ2h0Ow0KLSAgICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QmIHJlY3QpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fQm9yZGVyV2lkdGggPSByZWN0Ow0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzQm9yZGVyID0gVFJVRTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRNYXJnaW5XaWR0aChjb25zdCBGREVfQ1NTUkVDVCYgcmVjdCkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9NYXJnaW5XaWR0aCA9IHJlY3Q7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNNYXJnaW4gPSBUUlVFOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFBhZGRpbmdXaWR0aChjb25zdCBGREVfQ1NTUkVDVCYgcmVjdCkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9QYWRkaW5nV2lkdGggPSByZWN0Ow0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzUGFkZGluZyA9IFRSVUU7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NESVNQTEFZIEdldERpc3BsYXkoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU0RJU1BMQVkpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZURpc3BsYXk7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NTSVpFJiBHZXRCb3hTaXplKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fQm94U2l6ZTsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1NJWkUmIEdldE1pbkJveFNpemUoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9NaW5Cb3hTaXplOw0KKyAgfQ0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTU0laRSYgR2V0TWF4Qm94U2l6ZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX01heEJveFNpemU7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NGTE9BVCBHZXRGbG9hdCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTRkxPQVQpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUZsb2F0Ow0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTQ0xFQVIgR2V0Q2xlYXIoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU0NMRUFSKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VDbGVhcjsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1BPU0lUSU9OIEdldFBvc2l0aW9uKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NQT1NJVElPTiltX05vbkluaGVyaXRlZERhdGEubV9lUG9zaXRpb247DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NMRU5HVEggR2V0VG9wKCkgY29uc3QgeyByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fVG9wOyB9DQorICB2aXJ0dWFsIEZERV9DU1NMRU5HVEggR2V0Qm90dG9tKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fQm90dG9tOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTTEVOR1RIIEdldExlZnQoKSBjb25zdCB7IHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9MZWZ0OyB9DQorICB2aXJ0dWFsIEZERV9DU1NMRU5HVEggR2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9SaWdodDsgfQ0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldERpc3BsYXkoRkRFX0NTU0RJU1BMQVkgZURpc3BsYXkpDQotICAgIHsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VEaXNwbGF5ID0gZURpc3BsYXk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCb3hTaXplKGNvbnN0IEZERV9DU1NTSVpFICZzaXplKQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9Cb3hTaXplID0gc2l6ZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldE1pbkJveFNpemUoY29uc3QgRkRFX0NTU1NJWkUgJnNpemUpDQotICAgIHsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX01pbkJveFNpemUgPSBzaXplOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TWF4Qm94U2l6ZShjb25zdCBGREVfQ1NTU0laRSAmc2l6ZSkNCi0gICAgew0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fTWF4Qm94U2l6ZSA9IHNpemU7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRGbG9hdChGREVfQ1NTRkxPQVQgZUZsb2F0KQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9lRmxvYXQgPSBlRmxvYXQ7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRDbGVhcihGREVfQ1NTQ0xFQVIgZUNsZWFyKQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9lQ2xlYXIgPSBlQ2xlYXI7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRMaW5lSGVpZ2h0KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2ZMaW5lSGVpZ2h0Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU1dISVRFU1BBQ0UJCUdldFdoaXRlU3BhY2UoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NXSElURVNQQUNFKW1fSW5oZXJpdGVkRGF0YS5tX2VXaGl0ZVNwYWNlOw0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYJR2V0VGV4dEluZGVudCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9UZXh0SW5kZW50Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU1RFWFRBTElHTgkJR2V0VGV4dEFsaWduKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTVEVYVEFMSUdOKW1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0QWxpZ2g7DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTVkVSVElDQUxBTElHTglHZXRWZXJ0aWNhbEFsaWduKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTVkVSVElDQUxBTElHTiltX05vbkluaGVyaXRlZERhdGEubV9lVmVydGljYWxBbGlnbjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldE51bWJlclZlcnRpY2FsQWxpZ24oKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZlZlcnRpY2FsQWxpZ247DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTVEVYVFRSQU5TRk9STQlHZXRUZXh0VHJhbnNmb3JtKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTVEVYVFRSQU5TRk9STSltX0luaGVyaXRlZERhdGEubV9lVGV4dFRyYW5zZm9ybTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCUdldFRleHREZWNvcmF0aW9uKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3VGV4dERlY29yYXRpb247DQotICAgIH0NCi0gICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRMZXR0ZXJTcGFjaW5nKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX0xldHRlclNwYWNpbmc7DQotICAgIH0NCi0gICAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJglHZXRXb3JkU3BhY2luZygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9Xb3JkU3BhY2luZzsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NXUklUSU5HTU9ERQkJR2V0V3JpdGluZ01vZGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NXUklUSU5HTU9ERSltX0luaGVyaXRlZERhdGEubV9lV3JpdGluZ01vZGU7DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTV09SREJSRUFLCQlHZXRXb3JkQnJlYWsoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NXT1JEQlJFQUspbV9Jbmhlcml0ZWREYXRhLm1fZVdvcmRCcmVhazsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJR2V0V2lkb3dzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2lXaWRvd3M7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCQlHZXRUZXh0RW1waGFzaXNDb2xvcigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9iVGV4dEVtcGhhc2lzQ29sb3JDdXJyZW50ID8gbV9Jbmhlcml0ZWREYXRhLm1fZHdGb250Q29sb3IgOiBtX0luaGVyaXRlZERhdGEubV9kd1RleHRFbXBoYXNpc0NvbG9yOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU1BBR0VCUkVBSwkJR2V0UGFnZUJyZWFrQmVmb3JlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTUEFHRUJSRUFLKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VQYWdlQnJlYWtCZWZvcmU7DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTUEFHRUJSRUFLCQlHZXRQYWdlQnJlYWtBZnRlcigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRkRFX0NTU1BBR0VCUkVBSyltX05vbkluaGVyaXRlZERhdGEubV9lUGFnZUJyZWFrQWZ0ZXI7DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTUEFHRUJSRUFLCQlHZXRQYWdlQnJlYWtJbnNpZGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NQQUdFQlJFQUspbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0luc2lkZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJR2V0T3JwaGFucygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9pT3JwaGFuczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NMSU5FQlJFQUsJCUdldExpbmVCcmVhaygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRkRFX0NTU0xJTkVCUkVBSyltX0luaGVyaXRlZERhdGEubV9lTGluZUJyZWFrOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU1RFWFRFTVBIQVNJU01BUksJR2V0VGV4dEVtcGhhc2lzTWFyaygpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZERV9DU1NURVhURU1QSEFTSVNGSUxMCUdldFRleHRFbXBoYXNpc0ZpbGwoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NURVhURU1QSEFTSVNGSUxMKW1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0RW1waGFzaXNGaWxsOw0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqCQkJCUdldFRleHRFbXBoYXNpc0N1c3RvbSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChtX0luaGVyaXRlZERhdGEubV9lVGV4dEVtcGhhc2lzTWFyayA9PSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19DdXN0b20pOw0KLSAgICAgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX3BzelRleHRFbXBoYXNpc0N1c3RvbU1hcms7DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTVEVYVENPTUJJTkUJCUdldFRleHRDb21iaW5lVHlwZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRkRFX0NTU1RFWFRDT01CSU5FKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VUZXh0Q29tYmluZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUhhc1RleHRDb21iaW5lTnVtYmVyKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNUZXh0Q29tYmluZU51bWJlcjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldFRleHRDb21iaW5lTnVtYmVyKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VUZXh0Q29tYmluZSA9PSBGREVfQ1NTVEVYVENPTUJJTkVfSG9yaXpvbnRhbCk7DQotICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZlRleHRDb21iaW5lTnVtYmVyOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TGluZUhlaWdodChGWF9GTE9BVCBmTGluZUhlaWdodCkNCi0gICAgew0KLSAgICAgICAgbV9Jbmhlcml0ZWREYXRhLm1fZkxpbmVIZWlnaHQgPSBmTGluZUhlaWdodDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFdoaXRlU3BhY2UoRkRFX0NTU1dISVRFU1BBQ0UgZVdoaXRlU3BhY2UpDQotICAgIHsNCi0gICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VXaGl0ZVNwYWNlID0gZVdoaXRlU3BhY2U7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0SW5kZW50KGNvbnN0IEZERV9DU1NMRU5HVEggJnRleHRJbmRlbnQpDQotICAgIHsNCi0gICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX1RleHRJbmRlbnQgPSB0ZXh0SW5kZW50Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0VGV4dEFsaWduKEZERV9DU1NURVhUQUxJR04gZVRleHRBbGlnbikNCi0gICAgew0KLSAgICAgICAgbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRBbGlnaCA9IGVUZXh0QWxpZ247DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRWZXJ0aWNhbEFsaWduKEZERV9DU1NWRVJUSUNBTEFMSUdOIGVWZXJ0aWNhbEFsaWduKQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9lVmVydGljYWxBbGlnbiA9IGVWZXJ0aWNhbEFsaWduOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0TnVtYmVyVmVydGljYWxBbGlnbihGWF9GTE9BVCBmQWxpZ24pDQotICAgIHsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VWZXJ0aWNhbEFsaWduID0gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fTnVtYmVyLCBtX05vbkluaGVyaXRlZERhdGEubV9mVmVydGljYWxBbGlnbiA9IGZBbGlnbjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHRUcmFuc2Zvcm0oRkRFX0NTU1RFWFRUUkFOU0ZPUk0gZVRleHRUcmFuc2Zvcm0pDQotICAgIHsNCi0gICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0VHJhbnNmb3JtID0gZVRleHRUcmFuc2Zvcm07DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0RGVjb3JhdGlvbihGWF9EV09SRCBkd1RleHREZWNvcmF0aW9uKQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9kd1RleHREZWNvcmF0aW9uID0gZHdUZXh0RGVjb3JhdGlvbjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldExldHRlclNwYWNpbmcoY29uc3QgRkRFX0NTU0xFTkdUSCAmbGV0dGVyU3BhY2luZykNCi0gICAgew0KLSAgICAgICAgbV9Jbmhlcml0ZWREYXRhLm1fTGV0dGVyU3BhY2luZyA9IGxldHRlclNwYWNpbmc7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCSAJU2V0V29yZFNwYWNpbmcoY29uc3QgRkRFX0NTU0xFTkdUSCAmd29yZFNwYWNpbmcpDQotICAgIHsNCi0gICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX1dvcmRTcGFjaW5nID0gd29yZFNwYWNpbmc7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRXcml0aW5nTW9kZShGREVfQ1NTV1JJVElOR01PREUgZVdyaXRpbmdNb2RlKQ0KLSAgICB7DQotICAgICAgICBtX0luaGVyaXRlZERhdGEubV9lV3JpdGluZ01vZGUgPSBlV3JpdGluZ01vZGU7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRXb3JkQnJlYWsoRkRFX0NTU1dPUkRCUkVBSyBlV29yZEJyZWFrKQ0KLSAgICB7DQotICAgICAgICBtX0luaGVyaXRlZERhdGEubV9lV29yZEJyZWFrID0gZVdvcmRCcmVhazsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldFdpZG93cyhpbnQzMl90IGlXaWRvd3MpDQotICAgIHsNCi0gICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2lXaWRvd3MgPSBpV2lkb3dzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0VGV4dEVtcGhhc2lzQ29sb3IoRlhfQVJHQiBkd1RleHRFbXBoYXNpc0NvbG9yKQ0KLSAgICB7DQotICAgICAgICBtX0luaGVyaXRlZERhdGEubV9kd1RleHRFbXBoYXNpc0NvbG9yID0gZHdUZXh0RW1waGFzaXNDb2xvciwgbV9Jbmhlcml0ZWREYXRhLm1fYlRleHRFbXBoYXNpc0NvbG9yQ3VycmVudCA9IEZBTFNFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0UGFnZUJyZWFrQmVmb3JlKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0JlZm9yZSkNCi0gICAgew0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0JlZm9yZSA9IGVQYWdlQnJlYWtCZWZvcmU7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRQYWdlQnJlYWtBZnRlcihGREVfQ1NTUEFHRUJSRUFLIGVQYWdlQnJlYWtBZnRlcikNCi0gICAgew0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0FmdGVyID0gZVBhZ2VCcmVha0FmdGVyOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0UGFnZUJyZWFrSW5zaWRlKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0luc2lkZSkNCi0gICAgew0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0luc2lkZSA9IGVQYWdlQnJlYWtJbnNpZGU7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRPcnBoYW5zKGludDMyX3QgaU9ycGhhbnMpDQotICAgIHsNCi0gICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX2lPcnBoYW5zID0gaU9ycGhhbnM7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRMaW5lQnJlYWsoRkRFX0NTU0xJTkVCUkVBSyBlTGluZUJyZWFrKQ0KLSAgICB7DQotICAgICAgICBtX0luaGVyaXRlZERhdGEubV9lTGluZUJyZWFrID0gZUxpbmVCcmVhazsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJCUdldEJLR0NvbG9yKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3QktHQ29sb3I7DQotICAgIH0NCi0gICAgdmlydHVhbCBjb25zdCBGWF9XQ0hBUioJCQkJR2V0QktHSW1hZ2UoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fcHN6QktHSW1hZ2U7DQotICAgIH0NCi0gICAgdmlydHVhbCBjb25zdCBGREVfQ1NTUE9JTlQmCQlHZXRCS0dQb3NpdGlvbigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9CS0dQb3NpdGlvbjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NCS0dSRVBFQVQJCUdldEJLR1JlcGVhdCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRkRFX0NTU0JLR1JFUEVBVCltX05vbkluaGVyaXRlZERhdGEubV9lQktHUmVwZWF0Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU0JLR0FUVEFDSE1FTlQJR2V0QktHQXR0YWNobWVudCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRkRFX0NTU0JLR0FUVEFDSE1FTlQpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUJLR0F0dGFjaG1lbnQ7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRCS0dDb2xvcihGWF9BUkdCIGR3QktHQ29sb3IpDQotICAgIHsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3QktHQ29sb3IgPSBkd0JLR0NvbG9yOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0QktHUG9zaXRpb24oY29uc3QgRkRFX0NTU1BPSU5UICZia2dQb3NpdGlvbikNCi0gICAgew0KLSAgICAgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fQktHUG9zaXRpb24gPSBia2dQb3NpdGlvbjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NWSVNJQklMSVRZCQlHZXRWaXNpYmlsaXR5KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTVklTSUJJTElUWSltX0luaGVyaXRlZERhdGEubV9lVmlzaWJpbGl0eTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NPVkVSRkxPVwkJCUdldE92ZXJmbG93WCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRkRFX0NTU09WRVJGTE9XKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VPdmVyZmxvd1g7DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfQ1NTT1ZFUkZMT1cJCQlHZXRPdmVyZmxvd1koKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NPVkVSRkxPVyltX05vbkluaGVyaXRlZERhdGEubV9lT3ZlcmZsb3dZOw0KLSAgICB9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlDb3VudEN1cnNvclVybHMoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fcEN1cnNvclVyaXMgPT0gTlVMTCA/IDAgOiBtX0luaGVyaXRlZERhdGEubV9wQ3Vyc29yVXJpcy0+Q291bnRWYWx1ZXMoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKgkJCQlHZXRDdXJzb3JVcmwoaW50MzJfdCBpbmRleCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fSW5oZXJpdGVkRGF0YS5tX3BDdXJzb3JVcmlzICE9IE5VTEwpOw0KLSAgICAgICAgcmV0dXJuICgoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopKG1fSW5oZXJpdGVkRGF0YS5tX3BDdXJzb3JVcmlzLT5HZXRWYWx1ZShpbmRleCkpKS0+R2V0U3RyaW5nKGluZGV4KTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NDVVJTT1IJCQlHZXRDdXJzb3JUeXBlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2VDdXJzb3I7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRWaXNpYmlsaXR5KEZERV9DU1NWSVNJQklMSVRZIGVWaXNpYmlsaXR5KQ0KLSAgICB7DQotICAgICAgICBtX0luaGVyaXRlZERhdGEubV9lVmlzaWJpbGl0eSA9IGVWaXNpYmlsaXR5Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU0xJU1RTVFlMRVRZUEUJCUdldExpc3RTdHlsZVR5cGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZERV9DU1NMSVNUU1RZTEVUWVBFKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VMaXN0U3R5bGVUeXBlOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OCUdldExpc3RTdHlsZVBvc2l0aW9uKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGREVfQ1NTTElTVFNUWUxFUE9TSVRJT04pbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUxpc3RTdHlsZVBvc2l0aW9uOw0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqCQkJCQlHZXRMaXN0U3R5bGVJbWFnZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9wc3pMaXN0U3R5bGVJbWFnZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQlTZXRMaXN0U3R5bGVUeXBlKEZERV9DU1NMSVNUU1RZTEVUWVBFIGVMaXN0U3R5bGVUeXBlKQ0KLSAgICB7DQotICAgICAgICBtX05vbkluaGVyaXRlZERhdGEubV9lTGlzdFN0eWxlVHlwZSA9IGVMaXN0U3R5bGVUeXBlOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJCVNldExpc3RTdHlsZVBvc2l0aW9uKEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTiBlTGlzdFN0eWxlUG9zaXRpb24pDQotICAgIHsNCi0gICAgICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VMaXN0U3R5bGVQb3NpdGlvbiA9IGVMaXN0U3R5bGVQb3NpdGlvbjsNCi0gICAgfQ0KLSAgICB2b2lkIEFkZEN1c3RvbVN0eWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c05hbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBtX0N1c3RvbVByb3BlcnRpZXMuQWRkKHdzTmFtZSk7DQotICAgICAgICBtX0N1c3RvbVByb3BlcnRpZXMuQWRkKHdzVmFsdWUpOw0KLSAgICB9DQotICAgIEZYX0RXT1JECQkJCQkJbV9kd1JlZkNvdW50Ow0KLSAgICBJRlhfTUVNQWxsb2NhdG9yCQkJCSptX3BBbGxvY2F0b3I7DQotICAgIENGREVfQ1NTSW5oZXJpdGVkRGF0YQkJCW1fSW5oZXJpdGVkRGF0YTsNCi0gICAgQ0ZERV9DU1NOb25Jbmhlcml0ZWREYXRhCQltX05vbkluaGVyaXRlZERhdGE7DQotICAgIENGWF9XaWRlU3RyaW5nQXJyYXkJCQkJbV9DdXN0b21Qcm9wZXJ0aWVzOw0KKyAgdmlydHVhbCB2b2lkIFNldERpc3BsYXkoRkRFX0NTU0RJU1BMQVkgZURpc3BsYXkpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZURpc3BsYXkgPSBlRGlzcGxheTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRCb3hTaXplKGNvbnN0IEZERV9DU1NTSVpFJiBzaXplKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0JveFNpemUgPSBzaXplOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldE1pbkJveFNpemUoY29uc3QgRkRFX0NTU1NJWkUmIHNpemUpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fTWluQm94U2l6ZSA9IHNpemU7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0TWF4Qm94U2l6ZShjb25zdCBGREVfQ1NTU0laRSYgc2l6ZSkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9NYXhCb3hTaXplID0gc2l6ZTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRGbG9hdChGREVfQ1NTRkxPQVQgZUZsb2F0KSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VGbG9hdCA9IGVGbG9hdDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRDbGVhcihGREVfQ1NTQ0xFQVIgZUNsZWFyKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VDbGVhciA9IGVDbGVhcjsNCisgIH0NCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0TGluZUhlaWdodCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2ZMaW5lSGVpZ2h0Ow0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTV0hJVEVTUEFDRSBHZXRXaGl0ZVNwYWNlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NXSElURVNQQUNFKW1fSW5oZXJpdGVkRGF0YS5tX2VXaGl0ZVNwYWNlOw0KKyAgfQ0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJiBHZXRUZXh0SW5kZW50KCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fVGV4dEluZGVudDsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1RFWFRBTElHTiBHZXRUZXh0QWxpZ24oKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU1RFWFRBTElHTiltX0luaGVyaXRlZERhdGEubV9lVGV4dEFsaWdoOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTVkVSVElDQUxBTElHTiBHZXRWZXJ0aWNhbEFsaWduKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NWRVJUSUNBTEFMSUdOKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VWZXJ0aWNhbEFsaWduOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXROdW1iZXJWZXJ0aWNhbEFsaWduKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZlZlcnRpY2FsQWxpZ247DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NURVhUVFJBTlNGT1JNIEdldFRleHRUcmFuc2Zvcm0oKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU1RFWFRUUkFOU0ZPUk0pbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRUcmFuc2Zvcm07DQorICB9DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldFRleHREZWNvcmF0aW9uKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdUZXh0RGVjb3JhdGlvbjsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0TGV0dGVyU3BhY2luZygpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX0xldHRlclNwYWNpbmc7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmIEdldFdvcmRTcGFjaW5nKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fV29yZFNwYWNpbmc7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NXUklUSU5HTU9ERSBHZXRXcml0aW5nTW9kZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTV1JJVElOR01PREUpbV9Jbmhlcml0ZWREYXRhLm1fZVdyaXRpbmdNb2RlOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTV09SREJSRUFLIEdldFdvcmRCcmVhaygpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTV09SREJSRUFLKW1fSW5oZXJpdGVkRGF0YS5tX2VXb3JkQnJlYWs7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0V2lkb3dzKCkgY29uc3QgeyByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1faVdpZG93czsgfQ0KKyAgdmlydHVhbCBGWF9BUkdCIEdldFRleHRFbXBoYXNpc0NvbG9yKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fYlRleHRFbXBoYXNpc0NvbG9yQ3VycmVudA0KKyAgICAgICAgICAgICAgID8gbV9Jbmhlcml0ZWREYXRhLm1fZHdGb250Q29sb3INCisgICAgICAgICAgICAgICA6IG1fSW5oZXJpdGVkRGF0YS5tX2R3VGV4dEVtcGhhc2lzQ29sb3I7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NQQUdFQlJFQUsgR2V0UGFnZUJyZWFrQmVmb3JlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NQQUdFQlJFQUspbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0JlZm9yZTsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1BBR0VCUkVBSyBHZXRQYWdlQnJlYWtBZnRlcigpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTUEFHRUJSRUFLKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VQYWdlQnJlYWtBZnRlcjsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1BBR0VCUkVBSyBHZXRQYWdlQnJlYWtJbnNpZGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU1BBR0VCUkVBSyltX05vbkluaGVyaXRlZERhdGEubV9lUGFnZUJyZWFrSW5zaWRlOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldE9ycGhhbnMoKSBjb25zdCB7IHJldHVybiBtX0luaGVyaXRlZERhdGEubV9pT3JwaGFuczsgfQ0KKyAgdmlydHVhbCBGREVfQ1NTTElORUJSRUFLIEdldExpbmVCcmVhaygpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTTElORUJSRUFLKW1fSW5oZXJpdGVkRGF0YS5tX2VMaW5lQnJlYWs7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NURVhURU1QSEFTSVNNQVJLIEdldFRleHRFbXBoYXNpc01hcmsoKSBjb25zdDsNCisgIHZpcnR1YWwgRkRFX0NTU1RFWFRFTVBIQVNJU0ZJTEwgR2V0VGV4dEVtcGhhc2lzRmlsbCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTVEVYVEVNUEhBU0lTRklMTCltX0luaGVyaXRlZERhdGEubV9lVGV4dEVtcGhhc2lzRmlsbDsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldFRleHRFbXBoYXNpc0N1c3RvbSgpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0RW1waGFzaXNNYXJrID09DQorICAgICAgICAgICAgICAgICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19DdXN0b20pOw0KKyAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fcHN6VGV4dEVtcGhhc2lzQ3VzdG9tTWFyazsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1RFWFRDT01CSU5FIEdldFRleHRDb21iaW5lVHlwZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTVEVYVENPTUJJTkUpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVRleHRDb21iaW5lOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEhhc1RleHRDb21iaW5lTnVtYmVyKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc1RleHRDb21iaW5lTnVtYmVyOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRUZXh0Q29tYmluZU51bWJlcigpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VUZXh0Q29tYmluZSA9PQ0KKyAgICAgICAgICAgICAgICAgRkRFX0NTU1RFWFRDT01CSU5FX0hvcml6b250YWwpOw0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZlRleHRDb21iaW5lTnVtYmVyOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVIZWlnaHQoRlhfRkxPQVQgZkxpbmVIZWlnaHQpIHsNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1fZkxpbmVIZWlnaHQgPSBmTGluZUhlaWdodDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRXaGl0ZVNwYWNlKEZERV9DU1NXSElURVNQQUNFIGVXaGl0ZVNwYWNlKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VXaGl0ZVNwYWNlID0gZVdoaXRlU3BhY2U7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dEluZGVudChjb25zdCBGREVfQ1NTTEVOR1RIJiB0ZXh0SW5kZW50KSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX1RleHRJbmRlbnQgPSB0ZXh0SW5kZW50Ow0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFRleHRBbGlnbihGREVfQ1NTVEVYVEFMSUdOIGVUZXh0QWxpZ24pIHsNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRBbGlnaCA9IGVUZXh0QWxpZ247DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0VmVydGljYWxBbGlnbihGREVfQ1NTVkVSVElDQUxBTElHTiBlVmVydGljYWxBbGlnbikgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9lVmVydGljYWxBbGlnbiA9IGVWZXJ0aWNhbEFsaWduOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldE51bWJlclZlcnRpY2FsQWxpZ24oRlhfRkxPQVQgZkFsaWduKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VWZXJ0aWNhbEFsaWduID0gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fTnVtYmVyLA0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9mVmVydGljYWxBbGlnbiA9IGZBbGlnbjsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0VHJhbnNmb3JtKEZERV9DU1NURVhUVFJBTlNGT1JNIGVUZXh0VHJhbnNmb3JtKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0VHJhbnNmb3JtID0gZVRleHRUcmFuc2Zvcm07DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dERlY29yYXRpb24oRlhfRFdPUkQgZHdUZXh0RGVjb3JhdGlvbikgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9kd1RleHREZWNvcmF0aW9uID0gZHdUZXh0RGVjb3JhdGlvbjsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRMZXR0ZXJTcGFjaW5nKGNvbnN0IEZERV9DU1NMRU5HVEgmIGxldHRlclNwYWNpbmcpIHsNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1fTGV0dGVyU3BhY2luZyA9IGxldHRlclNwYWNpbmc7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0V29yZFNwYWNpbmcoY29uc3QgRkRFX0NTU0xFTkdUSCYgd29yZFNwYWNpbmcpIHsNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1fV29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZzsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRXcml0aW5nTW9kZShGREVfQ1NTV1JJVElOR01PREUgZVdyaXRpbmdNb2RlKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VXcml0aW5nTW9kZSA9IGVXcml0aW5nTW9kZTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRXb3JkQnJlYWsoRkRFX0NTU1dPUkRCUkVBSyBlV29yZEJyZWFrKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VXb3JkQnJlYWsgPSBlV29yZEJyZWFrOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFdpZG93cyhpbnQzMl90IGlXaWRvd3MpIHsNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1faVdpZG93cyA9IGlXaWRvd3M7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dEVtcGhhc2lzQ29sb3IoRlhfQVJHQiBkd1RleHRFbXBoYXNpc0NvbG9yKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2R3VGV4dEVtcGhhc2lzQ29sb3IgPSBkd1RleHRFbXBoYXNpc0NvbG9yLA0KKyAgICBtX0luaGVyaXRlZERhdGEubV9iVGV4dEVtcGhhc2lzQ29sb3JDdXJyZW50ID0gRkFMU0U7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0UGFnZUJyZWFrQmVmb3JlKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0JlZm9yZSkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9lUGFnZUJyZWFrQmVmb3JlID0gZVBhZ2VCcmVha0JlZm9yZTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRQYWdlQnJlYWtBZnRlcihGREVfQ1NTUEFHRUJSRUFLIGVQYWdlQnJlYWtBZnRlcikgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9lUGFnZUJyZWFrQWZ0ZXIgPSBlUGFnZUJyZWFrQWZ0ZXI7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0UGFnZUJyZWFrSW5zaWRlKEZERV9DU1NQQUdFQlJFQUsgZVBhZ2VCcmVha0luc2lkZSkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9lUGFnZUJyZWFrSW5zaWRlID0gZVBhZ2VCcmVha0luc2lkZTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRPcnBoYW5zKGludDMyX3QgaU9ycGhhbnMpIHsNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1faU9ycGhhbnMgPSBpT3JwaGFuczsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lQnJlYWsoRkRFX0NTU0xJTkVCUkVBSyBlTGluZUJyZWFrKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VMaW5lQnJlYWsgPSBlTGluZUJyZWFrOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9BUkdCIEdldEJLR0NvbG9yKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCS0dDb2xvcjsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldEJLR0ltYWdlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fcHN6QktHSW1hZ2U7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NQT0lOVCYgR2V0QktHUG9zaXRpb24oKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9CS0dQb3NpdGlvbjsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0JLR1JFUEVBVCBHZXRCS0dSZXBlYXQoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU0JLR1JFUEVBVCltX05vbkluaGVyaXRlZERhdGEubV9lQktHUmVwZWF0Ow0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTQktHQVRUQUNITUVOVCBHZXRCS0dBdHRhY2htZW50KCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NCS0dBVFRBQ0hNRU5UKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCS0dBdHRhY2htZW50Ow0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEJLR0NvbG9yKEZYX0FSR0IgZHdCS0dDb2xvcikgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9kd0JLR0NvbG9yID0gZHdCS0dDb2xvcjsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRCS0dQb3NpdGlvbihjb25zdCBGREVfQ1NTUE9JTlQmIGJrZ1Bvc2l0aW9uKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0JLR1Bvc2l0aW9uID0gYmtnUG9zaXRpb247DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NWSVNJQklMSVRZIEdldFZpc2liaWxpdHkoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU1ZJU0lCSUxJVFkpbV9Jbmhlcml0ZWREYXRhLm1fZVZpc2liaWxpdHk7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NPVkVSRkxPVyBHZXRPdmVyZmxvd1goKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU09WRVJGTE9XKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VPdmVyZmxvd1g7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NPVkVSRkxPVyBHZXRPdmVyZmxvd1koKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU09WRVJGTE9XKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VPdmVyZmxvd1k7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRDdXJzb3JVcmxzKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fcEN1cnNvclVyaXMgPT0gTlVMTA0KKyAgICAgICAgICAgICAgID8gMA0KKyAgICAgICAgICAgICAgIDogbV9Jbmhlcml0ZWREYXRhLm1fcEN1cnNvclVyaXMtPkNvdW50VmFsdWVzKCk7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRDdXJzb3JVcmwoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQobV9Jbmhlcml0ZWREYXRhLm1fcEN1cnNvclVyaXMgIT0gTlVMTCk7DQorICAgIHJldHVybiAoKElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqKShtX0luaGVyaXRlZERhdGEubV9wQ3Vyc29yVXJpcy0+R2V0VmFsdWUoDQorICAgICAgICAgICAgICAgIGluZGV4KSkpDQorICAgICAgICAtPkdldFN0cmluZyhpbmRleCk7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NDVVJTT1IgR2V0Q3Vyc29yVHlwZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2VDdXJzb3I7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0VmlzaWJpbGl0eShGREVfQ1NTVklTSUJJTElUWSBlVmlzaWJpbGl0eSkgew0KKyAgICBtX0luaGVyaXRlZERhdGEubV9lVmlzaWJpbGl0eSA9IGVWaXNpYmlsaXR5Ow0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTTElTVFNUWUxFVFlQRSBHZXRMaXN0U3R5bGVUeXBlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NMSVNUU1RZTEVUWVBFKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VMaXN0U3R5bGVUeXBlOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT04gR2V0TGlzdFN0eWxlUG9zaXRpb24oKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VMaXN0U3R5bGVQb3NpdGlvbjsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldExpc3RTdHlsZUltYWdlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fcHN6TGlzdFN0eWxlSW1hZ2U7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0TGlzdFN0eWxlVHlwZShGREVfQ1NTTElTVFNUWUxFVFlQRSBlTGlzdFN0eWxlVHlwZSkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9lTGlzdFN0eWxlVHlwZSA9IGVMaXN0U3R5bGVUeXBlOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldExpc3RTdHlsZVBvc2l0aW9uKA0KKyAgICAgIEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTiBlTGlzdFN0eWxlUG9zaXRpb24pIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUxpc3RTdHlsZVBvc2l0aW9uID0gZUxpc3RTdHlsZVBvc2l0aW9uOw0KKyAgfQ0KKyAgdm9pZCBBZGRDdXN0b21TdHlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgew0KKyAgICBtX0N1c3RvbVByb3BlcnRpZXMuQWRkKHdzTmFtZSk7DQorICAgIG1fQ3VzdG9tUHJvcGVydGllcy5BZGQod3NWYWx1ZSk7DQorICB9DQorICBGWF9EV09SRCBtX2R3UmVmQ291bnQ7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBtX3BBbGxvY2F0b3I7DQorICBDRkRFX0NTU0luaGVyaXRlZERhdGEgbV9Jbmhlcml0ZWREYXRhOw0KKyAgQ0ZERV9DU1NOb25Jbmhlcml0ZWREYXRhIG1fTm9uSW5oZXJpdGVkRGF0YTsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgbV9DdXN0b21Qcm9wZXJ0aWVzOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzaGVldC5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNoZWV0LmNwcAppbmRleCBkNDBmMjBiLi5jOTQyMzZkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNoZWV0LmNwcAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNoZWV0LmNwcApAQCAtOCw0NzQgKzgsNTA0IEBACiAjaW5jbHVkZSAiZmRlX2Nzc3N5bnRheC5oIg0KICNpbmNsdWRlICJmZGVfY3NzZGF0YXRhYmxlLmgiDQogI2luY2x1ZGUgImZkZV9jc3NzdHlsZXNoZWV0LmgiDQotSUZERV9DU1NTdHlsZVNoZWV0KiBJRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRIVE1MU3RhbmRhcmRTdHlsZVNoZWV0KCkNCi17DQotICAgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogc19wU3R5bGUgPSBMImh0bWwsYWRkcmVzcyxibG9ja3F1b3RlLGJvZHksZGQsZGl2LGRsLGR0LGZpZWxkc2V0LGZvcm0sZnJhbWUsZnJhbWVzZXQsaDEsaDIsaDMsaDQsaDUsaDYsbm9mcmFtZXMsb2wscCx1bCxjZW50ZXIsZGlyLGhyLG1lbnUscHJle2Rpc3BsYXk6YmxvY2t9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibGl7ZGlzcGxheTpsaXN0LWl0ZW19aGVhZHtkaXNwbGF5Om5vbmV9dGFibGV7ZGlzcGxheTp0YWJsZX10cntkaXNwbGF5OnRhYmxlLXJvd310aGVhZHtkaXNwbGF5OnRhYmxlLWhlYWRlci1ncm91cH10Ym9keXtkaXNwbGF5OnRhYmxlLXJvdy1ncm91cH10Zm9vdHtkaXNwbGF5OnRhYmxlLWZvb3Rlci1ncm91cH0iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJjb2x7ZGlzcGxheTp0YWJsZS1jb2x1bW59Y29sZ3JvdXB7ZGlzcGxheTp0YWJsZS1jb2x1bW4tZ3JvdXB9dGQsdGh7ZGlzcGxheTp0YWJsZS1jZWxsfWNhcHRpb257ZGlzcGxheTp0YWJsZS1jYXB0aW9ufXRoe2ZvbnQtd2VpZ2h0OmJvbGRlcjt0ZXh0LWFsaWduOmNlbnRlcn1jYXB0aW9ue3RleHQtYWxpZ246Y2VudGVyfSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImJvZHl7bWFyZ2luOjB9aDF7Zm9udC1zaXplOjJlbTttYXJnaW46LjY3ZW0gMH1oMntmb250LXNpemU6MS41ZW07bWFyZ2luOi43NWVtIDB9aDN7Zm9udC1zaXplOjEuMTdlbTttYXJnaW46LjgzZW0gMH1oNCxwLGJsb2NrcXVvdGUsdWwsZmllbGRzZXQsZm9ybSxvbCxkbCxkaXIsbWVudXttYXJnaW46MS4xMmVtIDB9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiaDV7Zm9udC1zaXplOi44M2VtO21hcmdpbjoxLjVlbSAwfWg2e2ZvbnQtc2l6ZTouNzVlbTttYXJnaW46MS42N2VtIDB9aDEsaDIsaDMsaDQsaDUsaDYsYixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWJsb2NrcXVvdGV7bWFyZ2luLWxlZnQ6NDBweDttYXJnaW4tcmlnaHQ6NDBweH1pLGNpdGUsZW0sdmFyLGFkZHJlc3N7Zm9udC1zdHlsZTppdGFsaWN9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwicHJlLHR0LGNvZGUsa2JkLHNhbXB7Zm9udC1mYW1pbHk6bW9ub3NwYWNlfXByZXt3aGl0ZS1zcGFjZTpwcmV9YnV0dG9uLHRleHRhcmVhLGlucHV0LHNlbGVjdHtkaXNwbGF5OmlubGluZS1ibG9ja31iaWd7Zm9udC1zaXplOjEuMTdlbX1zbWFsbCxzdWIsc3Vwe2ZvbnQtc2l6ZTouODNlbX1zdWJ7dmVydGljYWwtYWxpZ246c3VifSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInN1cHt2ZXJ0aWNhbC1hbGlnbjpzdXBlcn10YWJsZXtib3JkZXItc3BhY2luZzoycHh9dGhlYWQsdGJvZHksdGZvb3R7dmVydGljYWwtYWxpZ246bWlkZGxlfXRkLHRoLHRye3ZlcnRpY2FsLWFsaWduOmluaGVyaXR9cyxzdHJpa2UsZGVse3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2h9aHJ7Ym9yZGVyOjFweCBpbnNldCBzaWx2ZXJ9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwib2wsdWwsZGlyLG1lbnUsZGR7bWFyZ2luLWxlZnQ6NDBweH1vbHtsaXN0LXN0eWxlLXR5cGU6ZGVjaW1hbH1vbCB1bCx1bCBvbCx1bCB1bCxvbCBvbHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowfXUsaW5ze3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9Y2VudGVye3RleHQtYWxpZ246Y2VudGVyfSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInJ1Ynl7ZGlzcGxheTpydWJ5fXJ0e2Rpc3BsYXk6cnVieS10ZXh0O2ZvbnQtc2l6ZTouNWVtfXJie2Rpc3BsYXk6cnVieS1iYXNlfXJiY3tkaXNwbGF5OnJ1YnktYmFzZS1ncm91cH1ydGN7ZGlzcGxheTpydWJ5LXRleHQtZ3JvdXB9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwicTpiZWZvcmV7Y29udGVudDpvcGVuLXF1b3RlfXE6YWZ0ZXJ7Y29udGVudDpjbG9zZS1xdW90ZX0iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJycHtkaXNwbGF5Om5vbmV9IjsNCi0gICAgcmV0dXJuIElGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZyb21CdWZmZXIoQ0ZYX1dpZGVTdHJpbmcoKSwgc19wU3R5bGUsIEZYU1lTX3djc2xlbihzX3BTdHlsZSksIEZYX0NPREVQQUdFX1VURjgpOw0KK0lGREVfQ1NTU3R5bGVTaGVldCogSUZERV9DU1NTdHlsZVNoZWV0OjpMb2FkSFRNTFN0YW5kYXJkU3R5bGVTaGVldCgpIHsNCisgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogc19wU3R5bGUgPQ0KKyAgICAgIEwiaHRtbCxhZGRyZXNzLGJsb2NrcXVvdGUsYm9keSxkZCxkaXYsZGwsZHQsZmllbGRzZXQsZm9ybSxmcmFtZSxmcmFtZXNldCwiDQorICAgICAgTCJoMSxoMixoMyxoNCxoNSxoNixub2ZyYW1lcyxvbCxwLHVsLGNlbnRlcixkaXIsaHIsbWVudSxwcmV7ZGlzcGxheToiDQorICAgICAgTCJibG9ja30iDQorICAgICAgTCJsaXtkaXNwbGF5Omxpc3QtaXRlbX1oZWFke2Rpc3BsYXk6bm9uZX10YWJsZXtkaXNwbGF5OnRhYmxlfXRye2Rpc3BsYXk6Ig0KKyAgICAgIEwidGFibGUtcm93fXRoZWFke2Rpc3BsYXk6dGFibGUtaGVhZGVyLWdyb3VwfXRib2R5e2Rpc3BsYXk6dGFibGUtcm93LSINCisgICAgICBMImdyb3VwfXRmb290e2Rpc3BsYXk6dGFibGUtZm9vdGVyLWdyb3VwfSINCisgICAgICBMImNvbHtkaXNwbGF5OnRhYmxlLWNvbHVtbn1jb2xncm91cHtkaXNwbGF5OnRhYmxlLWNvbHVtbi1ncm91cH10ZCx0aHsiDQorICAgICAgTCJkaXNwbGF5OnRhYmxlLWNlbGx9Y2FwdGlvbntkaXNwbGF5OnRhYmxlLWNhcHRpb259dGh7Zm9udC13ZWlnaHQ6Ym9sZGVyOyINCisgICAgICBMInRleHQtYWxpZ246Y2VudGVyfWNhcHRpb257dGV4dC1hbGlnbjpjZW50ZXJ9Ig0KKyAgICAgIEwiYm9keXttYXJnaW46MH1oMXtmb250LXNpemU6MmVtO21hcmdpbjouNjdlbSAiDQorICAgICAgTCIwfWgye2ZvbnQtc2l6ZToxLjVlbTttYXJnaW46Ljc1ZW0gMH1oM3tmb250LXNpemU6MS4xN2VtO21hcmdpbjouODNlbSAiDQorICAgICAgTCIwfWg0LHAsYmxvY2txdW90ZSx1bCxmaWVsZHNldCxmb3JtLG9sLGRsLGRpcixtZW51e21hcmdpbjoxLjEyZW0gMH0iDQorICAgICAgTCJoNXtmb250LXNpemU6LjgzZW07bWFyZ2luOjEuNWVtIDB9aDZ7Zm9udC1zaXplOi43NWVtO21hcmdpbjoxLjY3ZW0gIg0KKyAgICAgIEwiMH1oMSxoMixoMyxoNCxoNSxoNixiLHN0cm9uZ3tmb250LXdlaWdodDpib2xkZXJ9YmxvY2txdW90ZXttYXJnaW4tbGVmdDoiDQorICAgICAgTCI0MHB4O21hcmdpbi1yaWdodDo0MHB4fWksY2l0ZSxlbSx2YXIsYWRkcmVzc3tmb250LXN0eWxlOml0YWxpY30iDQorICAgICAgTCJwcmUsdHQsY29kZSxrYmQsc2FtcHtmb250LWZhbWlseTptb25vc3BhY2V9cHJle3doaXRlLXNwYWNlOnByZX1idXR0b24sIg0KKyAgICAgIEwidGV4dGFyZWEsaW5wdXQsc2VsZWN0e2Rpc3BsYXk6aW5saW5lLWJsb2NrfWJpZ3tmb250LXNpemU6MS4xN2VtfXNtYWxsLCINCisgICAgICBMInN1YixzdXB7Zm9udC1zaXplOi44M2VtfXN1Ynt2ZXJ0aWNhbC1hbGlnbjpzdWJ9Ig0KKyAgICAgIEwic3Vwe3ZlcnRpY2FsLWFsaWduOnN1cGVyfXRhYmxle2JvcmRlci1zcGFjaW5nOjJweH10aGVhZCx0Ym9keSx0Zm9vdHsiDQorICAgICAgTCJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9dGQsdGgsdHJ7dmVydGljYWwtYWxpZ246aW5oZXJpdH1zLHN0cmlrZSxkZWx7Ig0KKyAgICAgIEwidGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaH1ocntib3JkZXI6MXB4IGluc2V0IHNpbHZlcn0iDQorICAgICAgTCJvbCx1bCxkaXIsbWVudSxkZHttYXJnaW4tbGVmdDo0MHB4fW9se2xpc3Qtc3R5bGUtdHlwZTpkZWNpbWFsfW9sIHVsLHVsICINCisgICAgICBMIm9sLHVsIHVsLG9sICINCisgICAgICBMIm9se21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9dSxpbnN7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1jZW50ZXJ7Ig0KKyAgICAgIEwidGV4dC1hbGlnbjpjZW50ZXJ9Ig0KKyAgICAgIEwicnVieXtkaXNwbGF5OnJ1Ynl9cnR7ZGlzcGxheTpydWJ5LXRleHQ7Zm9udC1zaXplOi41ZW19cmJ7ZGlzcGxheTpydWJ5LSINCisgICAgICBMImJhc2V9cmJje2Rpc3BsYXk6cnVieS1iYXNlLWdyb3VwfXJ0Y3tkaXNwbGF5OnJ1YnktdGV4dC1ncm91cH0iDQorICAgICAgTCJxOmJlZm9yZXtjb250ZW50Om9wZW4tcXVvdGV9cTphZnRlcntjb250ZW50OmNsb3NlLXF1b3RlfSINCisgICAgICBMInJwe2Rpc3BsYXk6bm9uZX0iOw0KKyAgcmV0dXJuIElGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZyb21CdWZmZXIoDQorICAgICAgQ0ZYX1dpZGVTdHJpbmcoKSwgc19wU3R5bGUsIEZYU1lTX3djc2xlbihzX3BTdHlsZSksIEZYX0NPREVQQUdFX1VURjgpOw0KIH0NCi1JRkRFX0NTU1N0eWxlU2hlZXQqIElGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZyb21TdHJlYW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnN6VXJsLCBJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdNZWRpYUxpc3QgKQ0KLXsNCi0gICAgQ0ZERV9DU1NTdHlsZVNoZWV0ICpwU3R5bGVTaGVldCA9IG5ldyBDRkRFX0NTU1N0eWxlU2hlZXQoZHdNZWRpYUxpc3QpOw0KLSAgICBpZiAocFN0eWxlU2hlZXQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaWYgKCFwU3R5bGVTaGVldC0+TG9hZEZyb21TdHJlYW0oc3pVcmwsIHBTdHJlYW0sIHdDb2RlUGFnZSkpIHsNCi0gICAgICAgIHBTdHlsZVNoZWV0LT5SZWxlYXNlKCk7DQotICAgICAgICBwU3R5bGVTaGVldCA9IE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHBTdHlsZVNoZWV0Ow0KK0lGREVfQ1NTU3R5bGVTaGVldCogSUZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbVN0cmVhbSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN6VXJsLA0KKyAgICBJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICBGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgRlhfRFdPUkQgZHdNZWRpYUxpc3QpIHsNCisgIENGREVfQ1NTU3R5bGVTaGVldCogcFN0eWxlU2hlZXQgPSBuZXcgQ0ZERV9DU1NTdHlsZVNoZWV0KGR3TWVkaWFMaXN0KTsNCisgIGlmIChwU3R5bGVTaGVldCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKCFwU3R5bGVTaGVldC0+TG9hZEZyb21TdHJlYW0oc3pVcmwsIHBTdHJlYW0sIHdDb2RlUGFnZSkpIHsNCisgICAgcFN0eWxlU2hlZXQtPlJlbGVhc2UoKTsNCisgICAgcFN0eWxlU2hlZXQgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBTdHlsZVNoZWV0Ow0KIH0NCi1JRkRFX0NTU1N0eWxlU2hlZXQqCUlGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZyb21CdWZmZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnN6VXJsLCBjb25zdCBGWF9XQ0hBUiogcEJ1ZmZlciwgaW50MzJfdCBpQnVmU2l6ZSwgRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3TWVkaWFMaXN0ICkNCi17DQotICAgIENGREVfQ1NTU3R5bGVTaGVldCAqcFN0eWxlU2hlZXQgPSBuZXcgQ0ZERV9DU1NTdHlsZVNoZWV0KGR3TWVkaWFMaXN0KTsNCi0gICAgaWYgKHBTdHlsZVNoZWV0ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGlmICghcFN0eWxlU2hlZXQtPkxvYWRGcm9tQnVmZmVyKHN6VXJsLCBwQnVmZmVyLCBpQnVmU2l6ZSwgd0NvZGVQYWdlKSkgew0KLSAgICAgICAgcFN0eWxlU2hlZXQtPlJlbGVhc2UoKTsNCi0gICAgICAgIHBTdHlsZVNoZWV0ID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gcFN0eWxlU2hlZXQ7DQorSUZERV9DU1NTdHlsZVNoZWV0KiBJRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRGcm9tQnVmZmVyKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3pVcmwsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLA0KKyAgICBpbnQzMl90IGlCdWZTaXplLA0KKyAgICBGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgRlhfRFdPUkQgZHdNZWRpYUxpc3QpIHsNCisgIENGREVfQ1NTU3R5bGVTaGVldCogcFN0eWxlU2hlZXQgPSBuZXcgQ0ZERV9DU1NTdHlsZVNoZWV0KGR3TWVkaWFMaXN0KTsNCisgIGlmIChwU3R5bGVTaGVldCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKCFwU3R5bGVTaGVldC0+TG9hZEZyb21CdWZmZXIoc3pVcmwsIHBCdWZmZXIsIGlCdWZTaXplLCB3Q29kZVBhZ2UpKSB7DQorICAgIHBTdHlsZVNoZWV0LT5SZWxlYXNlKCk7DQorICAgIHBTdHlsZVNoZWV0ID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBwU3R5bGVTaGVldDsNCiB9DQogQ0ZERV9DU1NTdHlsZVNoZWV0OjpDRkRFX0NTU1N0eWxlU2hlZXQoRlhfRFdPUkQgZHdNZWRpYUxpc3QpDQotICAgIDogbV93Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCkNCi0gICAgLCBtX3dSZWZDb3VudCgxKQ0KLSAgICAsIG1fZHdNZWRpYUxpc3QoZHdNZWRpYUxpc3QpDQotICAgICwgbV9wQWxsb2NhdG9yKE5VTEwpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9kd01lZGlhTGlzdCA+IDApOw0KKyAgICA6IG1fd0NvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpLA0KKyAgICAgIG1fd1JlZkNvdW50KDEpLA0KKyAgICAgIG1fZHdNZWRpYUxpc3QoZHdNZWRpYUxpc3QpLA0KKyAgICAgIG1fcEFsbG9jYXRvcihOVUxMKSB7DQorICBGWFNZU19hc3NlcnQobV9kd01lZGlhTGlzdCA+IDApOw0KIH0NCi1DRkRFX0NTU1N0eWxlU2hlZXQ6On5DRkRFX0NTU1N0eWxlU2hlZXQoKQ0KLXsNCi0gICAgUmVzZXQoKTsNCitDRkRFX0NTU1N0eWxlU2hlZXQ6On5DRkRFX0NTU1N0eWxlU2hlZXQoKSB7DQorICBSZXNldCgpOw0KIH0NCi12b2lkIENGREVfQ1NTU3R5bGVTaGVldDo6UmVzZXQoKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSBtX1J1bGVBcnJheS5HZXRTaXplKCkgLSAxOyBpID49IDA7IC0taSkgew0KLSAgICAgICAgSUZERV9DU1NSdWxlICpwUnVsZSA9IG1fUnVsZUFycmF5LkdldEF0KGkpOw0KLSAgICAgICAgc3dpdGNoIChwUnVsZS0+R2V0VHlwZSgpKSB7DQotICAgICAgICAgICAgY2FzZSAgRkRFX0NTU1JVTEVUWVBFX1N0eWxlOg0KLSAgICAgICAgICAgICAgICAoKENGREVfQ1NTU3R5bGVSdWxlKilwUnVsZSktPn5DRkRFX0NTU1N0eWxlUnVsZSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NSVUxFVFlQRV9NZWRpYToNCi0gICAgICAgICAgICAgICAgKChDRkRFX0NTU01lZGlhUnVsZSopcFJ1bGUpLT5+Q0ZERV9DU1NNZWRpYVJ1bGUoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUlVMRVRZUEVfRm9udEZhY2U6DQotICAgICAgICAgICAgICAgICgoQ0ZERV9DU1NGb250RmFjZVJ1bGUqKXBSdWxlKS0+fkNGREVfQ1NTRm9udEZhY2VSdWxlKCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNoZWV0OjpSZXNldCgpIHsNCisgIGZvciAoaW50MzJfdCBpID0gbV9SdWxlQXJyYXkuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsNCisgICAgSUZERV9DU1NSdWxlKiBwUnVsZSA9IG1fUnVsZUFycmF5LkdldEF0KGkpOw0KKyAgICBzd2l0Y2ggKHBSdWxlLT5HZXRUeXBlKCkpIHsNCisgICAgICBjYXNlIEZERV9DU1NSVUxFVFlQRV9TdHlsZToNCisgICAgICAgICgoQ0ZERV9DU1NTdHlsZVJ1bGUqKXBSdWxlKS0+fkNGREVfQ1NTU3R5bGVSdWxlKCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NSVUxFVFlQRV9NZWRpYToNCisgICAgICAgICgoQ0ZERV9DU1NNZWRpYVJ1bGUqKXBSdWxlKS0+fkNGREVfQ1NTTWVkaWFSdWxlKCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NSVUxFVFlQRV9Gb250RmFjZToNCisgICAgICAgICgoQ0ZERV9DU1NGb250RmFjZVJ1bGUqKXBSdWxlKS0+fkNGREVfQ1NTRm9udEZhY2VSdWxlKCk7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBtX1J1bGVBcnJheS5SZW1vdmVBbGwoKTsNCisgIG1fU2VsZWN0b3JzLlJlbW92ZUFsbCgpOw0KKyAgbV9TdHJpbmdDYWNoZS5SZW1vdmVBbGwoKTsNCisgIGlmIChtX3BBbGxvY2F0b3IpIHsNCisgICAgbV9wQWxsb2NhdG9yLT5SZWxlYXNlKCk7DQorICAgIG1fcEFsbG9jYXRvciA9IE5VTEw7DQorICB9DQorfQ0KK0ZYX0RXT1JEIENGREVfQ1NTU3R5bGVTaGVldDo6QWRkUmVmKCkgew0KKyAgcmV0dXJuICsrbV93UmVmQ291bnQ7DQorfQ0KK0ZYX0RXT1JEIENGREVfQ1NTU3R5bGVTaGVldDo6UmVsZWFzZSgpIHsNCisgIEZYX0RXT1JEIGR3UmVmQ291bnQgPSAtLW1fd1JlZkNvdW50Ow0KKyAgaWYgKGR3UmVmQ291bnQgPT0gMCkgew0KKyAgICBkZWxldGUgdGhpczsNCisgIH0NCisgIHJldHVybiBkd1JlZkNvdW50Ow0KK30NCitpbnQzMl90IENGREVfQ1NTU3R5bGVTaGVldDo6Q291bnRSdWxlcygpIGNvbnN0IHsNCisgIHJldHVybiBtX1J1bGVBcnJheS5HZXRTaXplKCk7DQorfQ0KK0lGREVfQ1NTUnVsZSogQ0ZERV9DU1NTdHlsZVNoZWV0OjpHZXRSdWxlKGludDMyX3QgaW5kZXgpIHsNCisgIHJldHVybiBtX1J1bGVBcnJheS5HZXRBdChpbmRleCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbVN0cmVhbShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3pVcmwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9TdHJlYW0qIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBGWFNZU19hc3NlcnQocFN0cmVhbSAhPSBOVUxMKTsNCisgIElGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4ID0gSUZERV9DU1NTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KKyAgaWYgKHBTeW50YXggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocFN0cmVhbS0+R2V0Q29kZVBhZ2UoKSAhPSB3Q29kZVBhZ2UpIHsNCisgICAgcFN0cmVhbS0+U2V0Q29kZVBhZ2Uod0NvZGVQYWdlKTsNCisgIH0NCisgIEZYX0JPT0wgYlJldCA9IHBTeW50YXgtPkluaXQocFN0cmVhbSwgNDA5NikgJiYgTG9hZEZyb21TeW50YXgocFN5bnRheCk7DQorICBwU3ludGF4LT5SZWxlYXNlKCk7DQorICBtX3dDb2RlUGFnZSA9IHdDb2RlUGFnZTsNCisgIG1fc3pVcmwgPSBzelVybDsNCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZyb21CdWZmZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN6VXJsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcEJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZlNpemUgPiAwKTsNCisgIElGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4ID0gSUZERV9DU1NTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KKyAgaWYgKHBTeW50YXggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9CT09MIGJSZXQgPSBwU3ludGF4LT5Jbml0KHBCdWZmZXIsIGlCdWZTaXplKSAmJiBMb2FkRnJvbVN5bnRheChwU3ludGF4KTsNCisgIHBTeW50YXgtPlJlbGVhc2UoKTsNCisgIG1fd0NvZGVQYWdlID0gd0NvZGVQYWdlOw0KKyAgbV9zelVybCA9IHN6VXJsOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbVN5bnRheChJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCkgew0KKyAgUmVzZXQoKTsNCisgIG1fcEFsbG9jYXRvciA9IEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfU3RhdGljLCAxMDI0LCAwKTsNCisgIGlmIChtX3BBbGxvY2F0b3IgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGREVfQ1NTU1lOVEFYU1RBVFVTIGVTdGF0dXM7DQorICBkbyB7DQorICAgIHN3aXRjaCAoZVN0YXR1cyA9IHBTeW50YXgtPkRvU3ludGF4UGFyc2UoKSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19TdHlsZVJ1bGU6DQorICAgICAgICBlU3RhdHVzID0gTG9hZFN0eWxlUnVsZShwU3ludGF4LCBtX1J1bGVBcnJheSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFSdWxlOg0KKyAgICAgICAgZVN0YXR1cyA9IExvYWRNZWRpYVJ1bGUocFN5bnRheCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRm9udEZhY2VSdWxlOg0KKyAgICAgICAgZVN0YXR1cyA9IExvYWRGb250RmFjZVJ1bGUocFN5bnRheCwgbV9SdWxlQXJyYXkpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0ltcG9ydFJ1bGU6DQorICAgICAgICBlU3RhdHVzID0gTG9hZEltcG9ydFJ1bGUocFN5bnRheCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfUGFnZVJ1bGU6DQorICAgICAgICBlU3RhdHVzID0gTG9hZFBhZ2VSdWxlKHBTeW50YXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9IHdoaWxlIChlU3RhdHVzID49IEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZSk7DQorICBtX1NlbGVjdG9ycy5SZW1vdmVBbGwoKTsNCisgIG1fU3RyaW5nQ2FjaGUuUmVtb3ZlQWxsKCk7DQorICByZXR1cm4gZVN0YXR1cyAhPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOw0KK30NCitGREVfQ1NTU1lOVEFYU1RBVFVTIENGREVfQ1NTU3R5bGVTaGVldDo6TG9hZE1lZGlhUnVsZSgNCisgICAgSUZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgpIHsNCisgIEZYX0RXT1JEIGR3TWVkaWFMaXN0ID0gMDsNCisgIENGREVfQ1NTTWVkaWFSdWxlKiBwTWVkaWFSdWxlID0gTlVMTDsNCisgIGZvciAoOzspIHsNCisgICAgc3dpdGNoIChwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCkpIHsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFUeXBlOiB7DQorICAgICAgICBpbnQzMl90IGlMZW47DQorICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6ID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpTGVuKTsNCisgICAgICAgIEZERV9MUENDU1NNRURJQVRZUEVUQUJMRSBwTWVkaWFUeXBlID0NCisgICAgICAgICAgICBGREVfR2V0Q1NTTWVkaWFUeXBlQnlOYW1lKHBzeiwgaUxlbik7DQorICAgICAgICBpZiAocE1lZGlhVHlwZSAhPSBOVUxMKSB7DQorICAgICAgICAgIGR3TWVkaWFMaXN0IHw9IHBNZWRpYVR5cGUtPndWYWx1ZTsNCiAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX1J1bGVBcnJheS5SZW1vdmVBbGwoKTsNCi0gICAgbV9TZWxlY3RvcnMuUmVtb3ZlQWxsKCk7DQotICAgIG1fU3RyaW5nQ2FjaGUuUmVtb3ZlQWxsKCk7DQotICAgIGlmIChtX3BBbGxvY2F0b3IpIHsNCi0gICAgICAgIG1fcEFsbG9jYXRvci0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wQWxsb2NhdG9yID0gTlVMTDsNCi0gICAgfQ0KLX0NCi1GWF9EV09SRCBDRkRFX0NTU1N0eWxlU2hlZXQ6OkFkZFJlZigpDQotew0KLSAgICByZXR1cm4gKyttX3dSZWZDb3VudDsNCi19DQotRlhfRFdPUkQgQ0ZERV9DU1NTdHlsZVNoZWV0OjpSZWxlYXNlKCkNCi17DQotICAgIEZYX0RXT1JEIGR3UmVmQ291bnQgPSAtLW1fd1JlZkNvdW50Ow0KLSAgICBpZiAoZHdSZWZDb3VudCA9PSAwKSB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICByZXR1cm4gZHdSZWZDb3VudDsNCi19DQotaW50MzJfdCBDRkRFX0NTU1N0eWxlU2hlZXQ6OkNvdW50UnVsZXMoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fUnVsZUFycmF5LkdldFNpemUoKTsNCi19DQotSUZERV9DU1NSdWxlKiBDRkRFX0NTU1N0eWxlU2hlZXQ6OkdldFJ1bGUoaW50MzJfdCBpbmRleCkNCi17DQotICAgIHJldHVybiBtX1J1bGVBcnJheS5HZXRBdChpbmRleCk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbVN0cmVhbShjb25zdCBDRlhfV2lkZVN0cmluZyAmc3pVcmwsIElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX1dPUkQgd0NvZGVQYWdlKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBTdHJlYW0gIT0gTlVMTCk7DQotICAgIElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4ID0gSUZERV9DU1NTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KLSAgICBpZiAocFN5bnRheCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKHBTdHJlYW0tPkdldENvZGVQYWdlKCkgIT0gd0NvZGVQYWdlKSB7DQotICAgICAgICBwU3RyZWFtLT5TZXRDb2RlUGFnZSh3Q29kZVBhZ2UpOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYlJldCA9IHBTeW50YXgtPkluaXQocFN0cmVhbSwgNDA5NikgJiYgTG9hZEZyb21TeW50YXgocFN5bnRheCk7DQotICAgIHBTeW50YXgtPlJlbGVhc2UoKTsNCi0gICAgbV93Q29kZVBhZ2UgPSB3Q29kZVBhZ2U7DQotICAgIG1fc3pVcmwgPSBzelVybDsNCi0gICAgcmV0dXJuIGJSZXQ7DQotfQ0KLUZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbUJ1ZmZlcihjb25zdCBDRlhfV2lkZVN0cmluZyAmc3pVcmwsIGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLCBpbnQzMl90IGlCdWZTaXplLCBGWF9XT1JEIHdDb2RlUGFnZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZlNpemUgPiAwKTsNCi0gICAgSUZERV9DU1NTeW50YXhQYXJzZXIgKnBTeW50YXggPSBJRkRFX0NTU1N5bnRheFBhcnNlcjo6Q3JlYXRlKCk7DQotICAgIGlmIChwU3ludGF4ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJSZXQgPSBwU3ludGF4LT5Jbml0KHBCdWZmZXIsIGlCdWZTaXplKSAmJiBMb2FkRnJvbVN5bnRheChwU3ludGF4KTsNCi0gICAgcFN5bnRheC0+UmVsZWFzZSgpOw0KLSAgICBtX3dDb2RlUGFnZSA9IHdDb2RlUGFnZTsNCi0gICAgbV9zelVybCA9IHN6VXJsOw0KLSAgICByZXR1cm4gYlJldDsNCi19DQotRlhfQk9PTCBDRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRGcm9tU3ludGF4KElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4KQ0KLXsNCi0gICAgUmVzZXQoKTsNCi0gICAgbV9wQWxsb2NhdG9yID0gRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9TdGF0aWMsIDEwMjQsIDApOw0KLSAgICBpZiAobV9wQWxsb2NhdG9yID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGREVfQ1NTU1lOVEFYU1RBVFVTIGVTdGF0dXM7DQotICAgIGRvIHsNCi0gICAgICAgIHN3aXRjaCAoZVN0YXR1cyA9IHBTeW50YXgtPkRvU3ludGF4UGFyc2UoKSkgew0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19TdHlsZVJ1bGU6DQotICAgICAgICAgICAgICAgIGVTdGF0dXMgPSBMb2FkU3R5bGVSdWxlKHBTeW50YXgsIG1fUnVsZUFycmF5KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX01lZGlhUnVsZToNCi0gICAgICAgICAgICAgICAgZVN0YXR1cyA9IExvYWRNZWRpYVJ1bGUocFN5bnRheCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19Gb250RmFjZVJ1bGU6DQotICAgICAgICAgICAgICAgIGVTdGF0dXMgPSBMb2FkRm9udEZhY2VSdWxlKHBTeW50YXgsIG1fUnVsZUFycmF5KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0ltcG9ydFJ1bGU6DQotICAgICAgICAgICAgICAgIGVTdGF0dXMgPSBMb2FkSW1wb3J0UnVsZShwU3ludGF4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1BhZ2VSdWxlOg0KLSAgICAgICAgICAgICAgICBlU3RhdHVzID0gTG9hZFBhZ2VSdWxlKHBTeW50YXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAoZVN0YXR1cyA+PSBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmUpOw0KLSAgICBtX1NlbGVjdG9ycy5SZW1vdmVBbGwoKTsNCi0gICAgbV9TdHJpbmdDYWNoZS5SZW1vdmVBbGwoKTsNCi0gICAgcmV0dXJuIGVTdGF0dXMgIT0gRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvcjsNCi19DQotRkRFX0NTU1NZTlRBWFNUQVRVUyBDRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRNZWRpYVJ1bGUoSUZERV9DU1NTeW50YXhQYXJzZXIgKnBTeW50YXgpDQotew0KLSAgICBGWF9EV09SRCBkd01lZGlhTGlzdCA9IDA7DQotICAgIENGREVfQ1NTTWVkaWFSdWxlICpwTWVkaWFSdWxlID0gTlVMTDsNCi0gICAgZm9yICg7Oykgew0KLSAgICAgICAgc3dpdGNoIChwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFUeXBlOiB7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW47DQotICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6ID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpTGVuKTsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9MUENDU1NNRURJQVRZUEVUQUJMRSBwTWVkaWFUeXBlID0gRkRFX0dldENTU01lZGlhVHlwZUJ5TmFtZShwc3osIGlMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBNZWRpYVR5cGUgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGR3TWVkaWFMaXN0IHw9IHBNZWRpYVR5cGUtPndWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfU3R5bGVSdWxlOg0KLSAgICAgICAgICAgICAgICBpZiAocE1lZGlhUnVsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBTa2lwUnVsZVNldChwU3ludGF4KTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NTWU5UQVhTVEFUVVMgZVN0YXR1cyA9IExvYWRTdHlsZVJ1bGUocFN5bnRheCwgcE1lZGlhUnVsZS0+R2V0QXJyYXkoKSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZVN0YXR1cyA8IEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlU3RhdHVzOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsT3BlbjoNCi0gICAgICAgICAgICAgICAgaWYgKChkd01lZGlhTGlzdCAmIG1fZHdNZWRpYUxpc3QpID4gMCAmJiBwTWVkaWFSdWxlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBNZWRpYVJ1bGUgPSBGREVfTmV3V2l0aChtX3BBbGxvY2F0b3IpIENGREVfQ1NTTWVkaWFSdWxlKGR3TWVkaWFMaXN0KTsNCi0gICAgICAgICAgICAgICAgICAgIG1fUnVsZUFycmF5LkFkZChwTWVkaWFSdWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbENsb3NlOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KLSAgICAgICAgICAgICAgICBGREVfQ1NTU1dJVENIREVGQVVMVFMoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi1GREVfQ1NTU1lOVEFYU1RBVFVTIENGREVfQ1NTU3R5bGVTaGVldDo6TG9hZFN0eWxlUnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCwgQ0ZERV9DU1NSdWxlQXJyYXkgJnJ1bGVBcnJheSkNCi17DQotICAgIG1fU2VsZWN0b3JzLlJlbW92ZUF0KDAsIG1fU2VsZWN0b3JzLkdldFNpemUoKSk7DQotICAgIENGREVfQ1NTU3R5bGVSdWxlICpwU3R5bGVSdWxlID0gTlVMTDsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlID0gTlVMTDsNCi0gICAgaW50MzJfdCBpVmFsdWVMZW4gPSAwOw0KLSAgICBGREVfQ1NTUFJPUEVSVFlBUkdTIHByb3BlcnR5QXJnczsNCi0gICAgcHJvcGVydHlBcmdzLnBTdGF0aWNTdG9yZSA9IG1fcEFsbG9jYXRvcjsNCi0gICAgcHJvcGVydHlBcmdzLnBTdHJpbmdDYWNoZSA9ICZtX1N0cmluZ0NhY2hlOw0KLSAgICBwcm9wZXJ0eUFyZ3MucFByb3BlcnR5ID0gTlVMTDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KLSAgICBmb3IgKDs7KSB7DQotICAgICAgICBzd2l0Y2ggKHBTeW50YXgtPkRvU3ludGF4UGFyc2UoKSkgew0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19TZWxlY3Rvcjogew0KLSAgICAgICAgICAgICAgICAgICAgcHN6VmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlWYWx1ZUxlbik7DQotICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1NlbGVjdG9yICpwU2VsZWN0b3IgPSBDRkRFX0NTU1NlbGVjdG9yOjpGcm9tU3RyaW5nKG1fcEFsbG9jYXRvciwgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFNlbGVjdG9yICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NlbGVjdG9ycy5BZGQocFNlbGVjdG9yKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lOg0KLSAgICAgICAgICAgICAgICBwc3pWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlBcmdzLnBQcm9wZXJ0eSA9IEZERV9HZXRDU1NQcm9wZXJ0eUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5QXJncy5wUHJvcGVydHkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgd3NOYW1lID0gQ0ZYX1dpZGVTdHJpbmdDKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eVZhbHVlOg0KLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlBcmdzLnBQcm9wZXJ0eSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBwc3pWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpVmFsdWVMZW4gPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFN0eWxlUnVsZS0+R2V0RGVjbEltcCgpLkFkZFByb3BlcnR5KCZwcm9wZXJ0eUFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlWYWx1ZUxlbiA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIHBzelZhbHVlID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlWYWx1ZUxlbiA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3R5bGVSdWxlLT5HZXREZWNsSW1wKCkuQWRkUHJvcGVydHkoJnByb3BlcnR5QXJncywgd3NOYW1lLCB3c05hbWUuR2V0TGVuZ3RoKCksIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsT3BlbjoNCi0gICAgICAgICAgICAgICAgaWYgKHBTdHlsZVJ1bGUgPT0gTlVMTCAmJiBtX1NlbGVjdG9ycy5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBwU3R5bGVSdWxlID0gRkRFX05ld1dpdGgobV9wQWxsb2NhdG9yKSBDRkRFX0NTU1N0eWxlUnVsZTsNCi0gICAgICAgICAgICAgICAgICAgIHBTdHlsZVJ1bGUtPlNldFNlbGVjdG9yKG1fcEFsbG9jYXRvciwgbV9TZWxlY3RvcnMpOw0KLSAgICAgICAgICAgICAgICAgICAgcnVsZUFycmF5LkFkZChwU3R5bGVSdWxlKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIFNraXBSdWxlU2V0KHBTeW50YXgpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbENsb3NlOg0KLSAgICAgICAgICAgICAgICBpZiAocFN0eWxlUnVsZSAhPSBOVUxMICYmIHBTdHlsZVJ1bGUtPkdldERlY2xJbXAoKS5HZXRTdGFydFBvc2l0aW9uKCkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgcFN0eWxlUnVsZS0+fkNGREVfQ1NTU3R5bGVSdWxlKCk7DQotICAgICAgICAgICAgICAgICAgICBydWxlQXJyYXkuUmVtb3ZlTGFzdCgxKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KLSAgICAgICAgICAgICAgICBGREVfQ1NTU1dJVENIREVGQVVMVFMoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi1GREVfQ1NTU1lOVEFYU1RBVFVTIENGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZvbnRGYWNlUnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCwgQ0ZERV9DU1NSdWxlQXJyYXkgJnJ1bGVBcnJheSkNCi17DQotICAgIENGREVfQ1NTRm9udEZhY2VSdWxlICpwRm9udEZhY2VSdWxlID0gTlVMTDsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlID0gTlVMTDsNCi0gICAgaW50MzJfdCBpVmFsdWVMZW4gPSAwOw0KLSAgICBGREVfQ1NTUFJPUEVSVFlBUkdTIHByb3BlcnR5QXJnczsNCi0gICAgcHJvcGVydHlBcmdzLnBTdGF0aWNTdG9yZSA9IG1fcEFsbG9jYXRvcjsNCi0gICAgcHJvcGVydHlBcmdzLnBTdHJpbmdDYWNoZSA9ICZtX1N0cmluZ0NhY2hlOw0KLSAgICBwcm9wZXJ0eUFyZ3MucFByb3BlcnR5ID0gTlVMTDsNCi0gICAgZm9yICg7Oykgew0KLSAgICAgICAgc3dpdGNoIChwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lOg0KLSAgICAgICAgICAgICAgICBwc3pWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlBcmdzLnBQcm9wZXJ0eSA9IEZERV9HZXRDU1NQcm9wZXJ0eUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWU6DQotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUFyZ3MucFByb3BlcnR5ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBzelZhbHVlID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpVmFsdWVMZW4pOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlWYWx1ZUxlbiA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwRm9udEZhY2VSdWxlLT5HZXREZWNsSW1wKCkuQWRkUHJvcGVydHkoJnByb3BlcnR5QXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xPcGVuOg0KLSAgICAgICAgICAgICAgICBpZiAocEZvbnRGYWNlUnVsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBwRm9udEZhY2VSdWxlID0gRkRFX05ld1dpdGgobV9wQWxsb2NhdG9yKSBDRkRFX0NTU0ZvbnRGYWNlUnVsZTsNCi0gICAgICAgICAgICAgICAgICAgIHJ1bGVBcnJheS5BZGQocEZvbnRGYWNlUnVsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xDbG9zZToNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCi0gICAgICAgICAgICAgICAgRkRFX0NTU1NXSVRDSERFRkFVTFRTKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCi19DQotRkRFX0NTU1NZTlRBWFNUQVRVUyBDRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRJbXBvcnRSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4KQ0KLXsNCi0gICAgZm9yICg7Oykgew0KLSAgICAgICAgc3dpdGNoIChwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfSW1wb3J0Q2xvc2U6DQotICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmU7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1VSSToNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIEZERV9DU1NTV0lUQ0hERUZBVUxUUygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLUZERV9DU1NTWU5UQVhTVEFUVVMgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkUGFnZVJ1bGUoSUZERV9DU1NTeW50YXhQYXJzZXIgKnBTeW50YXgpDQotew0KLSAgICByZXR1cm4gU2tpcFJ1bGVTZXQocFN5bnRheCk7DQotfQ0KLUZERV9DU1NTWU5UQVhTVEFUVVMgQ0ZERV9DU1NTdHlsZVNoZWV0OjpTa2lwUnVsZVNldChJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCkNCi17DQotICAgIGZvciAoOzspIHsNCi0gICAgICAgIHN3aXRjaCAocFN5bnRheC0+RG9TeW50YXhQYXJzZSgpKSB7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1NlbGVjdG9yOg0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsT3BlbjoNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lOg0KLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eVZhbHVlOg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbENsb3NlOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KLSAgICAgICAgICAgICAgICBGREVfQ1NTU1dJVENIREVGQVVMVFMoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KLX0NCi12b2lkIENGREVfQ1NTU3R5bGVSdWxlOjpTZXRTZWxlY3RvcihJRlhfTUVNQWxsb2NhdG9yICpwU3RhdGljU3RvcmUsIGNvbnN0IENGREVfQ1NTU2VsZWN0b3JBcnJheSAmbGlzdCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BwU2VsZWN0b3IgPT0gTlVMTCk7DQotICAgIG1faVNlbGVjdG9ycyA9IGxpc3QuR2V0U2l6ZSgpOw0KLSAgICBtX3BwU2VsZWN0b3IgPSAoSUZERV9DU1NTZWxlY3RvcioqKXBTdGF0aWNTdG9yZS0+QWxsb2MobV9pU2VsZWN0b3JzICogc2l6ZW9mKElGREVfQ1NTU2VsZWN0b3IqKSk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1faVNlbGVjdG9yczsgKytpKSB7DQotICAgICAgICBtX3BwU2VsZWN0b3JbaV0gPSBsaXN0LkdldEF0KGkpOw0KLSAgICB9DQotfQ0KLUNGREVfQ1NTTWVkaWFSdWxlOjp+Q0ZERV9DU1NNZWRpYVJ1bGUoKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSBtX1J1bGVBcnJheS5HZXRTaXplKCkgLSAxOyBpID49IDA7IC0taSkgew0KLSAgICAgICAgSUZERV9DU1NSdWxlICpwUnVsZSA9IG1fUnVsZUFycmF5LkdldEF0KGkpOw0KLSAgICAgICAgc3dpdGNoIChwUnVsZS0+R2V0VHlwZSgpKSB7DQotICAgICAgICAgICAgY2FzZSAgRkRFX0NTU1JVTEVUWVBFX1N0eWxlOg0KLSAgICAgICAgICAgICAgICAoKENGREVfQ1NTU3R5bGVSdWxlKilwUnVsZSktPn5DRkRFX0NTU1N0eWxlUnVsZSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi1pbmxpbmUgRlhfQk9PTCBGREVfSXNDU1NDaGFyKEZYX1dDSEFSIHdjaCkNCi17DQotICAgIHJldHVybiAod2NoID49ICdhJyAmJiB3Y2ggPD0gJ3onKSB8fCAod2NoID49ICdBJyAmJiB3Y2ggPD0gJ1onKTsNCi19DQotaW50MzJfdCBGREVfR2V0Q1NTUGVyc3Vkb0xlbihjb25zdCBGWF9XQ0hBUiogcHN6LCBjb25zdCBGWF9XQ0hBUiogcEVuZCkNCi17DQotICAgIEZYU1lTX2Fzc2VydCgqcHN6ID09ICc6Jyk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBwc3o7DQotICAgIHdoaWxlIChwc3ogPCBwRW5kKSB7DQotICAgICAgICBGWF9XQ0hBUiB3Y2ggPSAqcHN6Ow0KLSAgICAgICAgaWYgKEZERV9Jc0NTU0NoYXIod2NoKSB8fCB3Y2ggPT0gJzonKSB7DQotICAgICAgICAgICAgKytwc3o7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfU3R5bGVSdWxlOg0KKyAgICAgICAgaWYgKHBNZWRpYVJ1bGUgPT0gTlVMTCkgew0KKyAgICAgICAgICBTa2lwUnVsZVNldChwU3ludGF4KTsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIEZERV9DU1NTWU5UQVhTVEFUVVMgZVN0YXR1cyA9DQorICAgICAgICAgICAgICBMb2FkU3R5bGVSdWxlKHBTeW50YXgsIHBNZWRpYVJ1bGUtPkdldEFycmF5KCkpOw0KKyAgICAgICAgICBpZiAoZVN0YXR1cyA8IEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZSkgew0KKyAgICAgICAgICAgIHJldHVybiBlU3RhdHVzOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbE9wZW46DQorICAgICAgICBpZiAoKGR3TWVkaWFMaXN0ICYgbV9kd01lZGlhTGlzdCkgPiAwICYmIHBNZWRpYVJ1bGUgPT0gTlVMTCkgew0KKyAgICAgICAgICBwTWVkaWFSdWxlID0gRkRFX05ld1dpdGgobV9wQWxsb2NhdG9yKSBDRkRFX0NTU01lZGlhUnVsZShkd01lZGlhTGlzdCk7DQorICAgICAgICAgIG1fUnVsZUFycmF5LkFkZChwTWVkaWFSdWxlKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsQ2xvc2U6DQorICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KKyAgICAgICAgRkRFX0NTU1NXSVRDSERFRkFVTFRTKCk7DQogICAgIH0NCi0gICAgcmV0dXJuIHBzeiAtIHBTdGFydDsNCisgIH0NCiB9DQotaW50MzJfdCBGREVfR2V0Q1NTTmFtZUxlbihjb25zdCBGWF9XQ0hBUiogcHN6LCBjb25zdCBGWF9XQ0hBUiogcEVuZCkNCi17DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBwc3o7DQotICAgIHdoaWxlIChwc3ogPCBwRW5kKSB7DQotICAgICAgICBGWF9XQ0hBUiB3Y2ggPSAqcHN6Ow0KLSAgICAgICAgaWYgKEZERV9Jc0NTU0NoYXIod2NoKQ0KLSAgICAgICAgICAgICAgICB8fCAod2NoID49ICcwJyAmJiB3Y2ggPD0gJzknKQ0KLSAgICAgICAgICAgICAgICB8fCB3Y2ggPT0gJ18nIHx8IHdjaCA9PSAnLScpIHsNCi0gICAgICAgICAgICArK3BzejsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgYnJlYWs7DQorRkRFX0NTU1NZTlRBWFNUQVRVUyBDRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRTdHlsZVJ1bGUoDQorICAgIElGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4LA0KKyAgICBDRkRFX0NTU1J1bGVBcnJheSYgcnVsZUFycmF5KSB7DQorICBtX1NlbGVjdG9ycy5SZW1vdmVBdCgwLCBtX1NlbGVjdG9ycy5HZXRTaXplKCkpOw0KKyAgQ0ZERV9DU1NTdHlsZVJ1bGUqIHBTdHlsZVJ1bGUgPSBOVUxMOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlID0gTlVMTDsNCisgIGludDMyX3QgaVZhbHVlTGVuID0gMDsNCisgIEZERV9DU1NQUk9QRVJUWUFSR1MgcHJvcGVydHlBcmdzOw0KKyAgcHJvcGVydHlBcmdzLnBTdGF0aWNTdG9yZSA9IG1fcEFsbG9jYXRvcjsNCisgIHByb3BlcnR5QXJncy5wU3RyaW5nQ2FjaGUgPSAmbV9TdHJpbmdDYWNoZTsNCisgIHByb3BlcnR5QXJncy5wUHJvcGVydHkgPSBOVUxMOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgZm9yICg7Oykgew0KKyAgICBzd2l0Y2ggKHBTeW50YXgtPkRvU3ludGF4UGFyc2UoKSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19TZWxlY3Rvcjogew0KKyAgICAgICAgcHN6VmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlWYWx1ZUxlbik7DQorICAgICAgICBJRkRFX0NTU1NlbGVjdG9yKiBwU2VsZWN0b3IgPQ0KKyAgICAgICAgICAgIENGREVfQ1NTU2VsZWN0b3I6OkZyb21TdHJpbmcobV9wQWxsb2NhdG9yLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGlmIChwU2VsZWN0b3IgIT0gTlVMTCkgew0KKyAgICAgICAgICBtX1NlbGVjdG9ycy5BZGQocFNlbGVjdG9yKTsNCiAgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eU5hbWU6DQorICAgICAgICBwc3pWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaVZhbHVlTGVuKTsNCisgICAgICAgIHByb3BlcnR5QXJncy5wUHJvcGVydHkgPSBGREVfR2V0Q1NTUHJvcGVydHlCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocHJvcGVydHlBcmdzLnBQcm9wZXJ0eSA9PSBOVUxMKSB7DQorICAgICAgICAgIHdzTmFtZSA9IENGWF9XaWRlU3RyaW5nQyhwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eVZhbHVlOg0KKyAgICAgICAgaWYgKHByb3BlcnR5QXJncy5wUHJvcGVydHkgIT0gTlVMTCkgew0KKyAgICAgICAgICBwc3pWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaVZhbHVlTGVuKTsNCisgICAgICAgICAgaWYgKGlWYWx1ZUxlbiA+IDApIHsNCisgICAgICAgICAgICBwU3R5bGVSdWxlLT5HZXREZWNsSW1wKCkuQWRkUHJvcGVydHkoJnByb3BlcnR5QXJncywgcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlWYWx1ZUxlbik7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoaVZhbHVlTGVuID4gMCkgew0KKyAgICAgICAgICBwc3pWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaVZhbHVlTGVuKTsNCisgICAgICAgICAgaWYgKGlWYWx1ZUxlbiA+IDApIHsNCisgICAgICAgICAgICBwU3R5bGVSdWxlLT5HZXREZWNsSW1wKCkuQWRkUHJvcGVydHkoDQorICAgICAgICAgICAgICAgICZwcm9wZXJ0eUFyZ3MsIHdzTmFtZSwgd3NOYW1lLkdldExlbmd0aCgpLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xPcGVuOg0KKyAgICAgICAgaWYgKHBTdHlsZVJ1bGUgPT0gTlVMTCAmJiBtX1NlbGVjdG9ycy5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICAgIHBTdHlsZVJ1bGUgPSBGREVfTmV3V2l0aChtX3BBbGxvY2F0b3IpIENGREVfQ1NTU3R5bGVSdWxlOw0KKyAgICAgICAgICBwU3R5bGVSdWxlLT5TZXRTZWxlY3RvcihtX3BBbGxvY2F0b3IsIG1fU2VsZWN0b3JzKTsNCisgICAgICAgICAgcnVsZUFycmF5LkFkZChwU3R5bGVSdWxlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIFNraXBSdWxlU2V0KHBTeW50YXgpOw0KKyAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xDbG9zZToNCisgICAgICAgIGlmIChwU3R5bGVSdWxlICE9IE5VTEwgJiYNCisgICAgICAgICAgICBwU3R5bGVSdWxlLT5HZXREZWNsSW1wKCkuR2V0U3RhcnRQb3NpdGlvbigpID09IE5VTEwpIHsNCisgICAgICAgICAgcFN0eWxlUnVsZS0+fkNGREVfQ1NTU3R5bGVSdWxlKCk7DQorICAgICAgICAgIHJ1bGVBcnJheS5SZW1vdmVMYXN0KDEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCisgICAgICAgIEZERV9DU1NTV0lUQ0hERUZBVUxUUygpOw0KICAgICB9DQotICAgIHJldHVybiBwc3ogLSBwU3RhcnQ7DQorICB9DQogfQ0KLUlGREVfQ1NTU2VsZWN0b3IqIENGREVfQ1NTU2VsZWN0b3I6OkZyb21TdHJpbmcoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBjb25zdCBGWF9XQ0hBUiogcHN6LCBpbnQzMl90IGlMZW4pDQotew0KLSAgICBGWFNZU19hc3NlcnQocFN0YXRpY1N0b3JlICE9IE5VTEwgJiYgcHN6ICE9IE5VTEwgJiYgaUxlbiA+IDApOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gcHN6Ow0KLSAgICBjb25zdCBGWF9XQ0hBUiogcEVuZCA9IHBzeiArIGlMZW47DQotICAgIGZvciAoOyBwc3ogPCBwRW5kOyArK3Bzeikgew0KLSAgICAgICAgc3dpdGNoICgqcHN6KSB7DQotICAgICAgICAgICAgY2FzZSAnPic6DQotICAgICAgICAgICAgY2FzZSAnWyc6DQotICAgICAgICAgICAgY2FzZSAnKyc6DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KK0ZERV9DU1NTWU5UQVhTVEFUVVMgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRm9udEZhY2VSdWxlKA0KKyAgICBJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCwNCisgICAgQ0ZERV9DU1NSdWxlQXJyYXkmIHJ1bGVBcnJheSkgew0KKyAgQ0ZERV9DU1NGb250RmFjZVJ1bGUqIHBGb250RmFjZVJ1bGUgPSBOVUxMOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlID0gTlVMTDsNCisgIGludDMyX3QgaVZhbHVlTGVuID0gMDsNCisgIEZERV9DU1NQUk9QRVJUWUFSR1MgcHJvcGVydHlBcmdzOw0KKyAgcHJvcGVydHlBcmdzLnBTdGF0aWNTdG9yZSA9IG1fcEFsbG9jYXRvcjsNCisgIHByb3BlcnR5QXJncy5wU3RyaW5nQ2FjaGUgPSAmbV9TdHJpbmdDYWNoZTsNCisgIHByb3BlcnR5QXJncy5wUHJvcGVydHkgPSBOVUxMOw0KKyAgZm9yICg7Oykgew0KKyAgICBzd2l0Y2ggKHBTeW50YXgtPkRvU3ludGF4UGFyc2UoKSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eU5hbWU6DQorICAgICAgICBwc3pWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaVZhbHVlTGVuKTsNCisgICAgICAgIHByb3BlcnR5QXJncy5wUHJvcGVydHkgPSBGREVfR2V0Q1NTUHJvcGVydHlCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZToNCisgICAgICAgIGlmIChwcm9wZXJ0eUFyZ3MucFByb3BlcnR5ICE9IE5VTEwpIHsNCisgICAgICAgICAgcHN6VmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlWYWx1ZUxlbik7DQorICAgICAgICAgIGlmIChpVmFsdWVMZW4gPiAwKSB7DQorICAgICAgICAgICAgcEZvbnRGYWNlUnVsZS0+R2V0RGVjbEltcCgpLkFkZFByb3BlcnR5KCZwcm9wZXJ0eUFyZ3MsIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVmFsdWVMZW4pOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgIH0NCi0gICAgQ0ZERV9DU1NTZWxlY3RvciAqcEZpcnN0ID0gTlVMTCwgKnBMYXN0ID0gTlVMTDsNCi0gICAgQ0ZERV9DU1NTZWxlY3RvciAqcFBlcnN1ZG9GaXJzdCA9IE5VTEwsICpwUGVyc3Vkb0xhc3QgPSBOVUxMOw0KLSAgICBmb3IgKHBzeiA9IHBTdGFydCA7IHBzeiA8IHBFbmQ7ICkgew0KLSAgICAgICAgRlhfV0NIQVIgd2NoID0gKnBzejsNCi0gICAgICAgIGlmICh3Y2ggPT0gJy4nIHx8IHdjaCA9PSAnIycpIHsNCi0gICAgICAgICAgICBpZiAocHN6ID09IHBTdGFydCB8fCBwc3pbLTFdID09ICcgJykgew0KLSAgICAgICAgICAgICAgICBDRkRFX0NTU1NlbGVjdG9yICpwID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1NlbGVjdG9yKEZERV9DU1NTRUxFQ1RPUlRZUEVfRWxlbWVudCwgTCIqIiwgMSwgVFJVRSk7DQotICAgICAgICAgICAgICAgIGlmIChwID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChwRmlyc3QgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgcEZpcnN0LT5TZXRUeXBlKEZERV9DU1NTRUxFQ1RPUlRZUEVfRGVzY2VuZGFudCk7DQotICAgICAgICAgICAgICAgICAgICBwLT5TZXROZXh0KHBGaXJzdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcEZpcnN0ID0gcExhc3QgPSBwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQocExhc3QgIT0gTlVMTCk7DQotICAgICAgICAgICAgaW50MzJfdCBpTmFtZUxlbiA9IEZERV9HZXRDU1NOYW1lTGVuKCsrcHN6LCBwRW5kKTsNCi0gICAgICAgICAgICBpZiAoaU5hbWVMZW4gPT0gMCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRkRFX0NTU1NFTEVDVE9SVFlQRSBlVHlwZSA9IHdjaCA9PSAnLicgPyBGREVfQ1NTU0VMRUNUT1JUWVBFX0NsYXNzIDogRkRFX0NTU1NFTEVDVE9SVFlQRV9JRDsNCi0gICAgICAgICAgICBDRkRFX0NTU1NlbGVjdG9yICpwID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1NlbGVjdG9yKGVUeXBlLCBwc3osIGlOYW1lTGVuLCBGQUxTRSk7DQotICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcC0+U2V0TmV4dChwTGFzdC0+R2V0TmV4dFNlbGVjdG9yKCkpOw0KLSAgICAgICAgICAgIHBMYXN0LT5TZXROZXh0KHApOw0KLSAgICAgICAgICAgIHBMYXN0ID0gcDsNCi0gICAgICAgICAgICBwc3ogKz0gaU5hbWVMZW47DQotICAgICAgICB9IGVsc2UgaWYgKEZERV9Jc0NTU0NoYXIod2NoKSB8fCB3Y2ggPT0gJyonKSB7DQotICAgICAgICAgICAgaW50MzJfdCBpTmFtZUxlbiA9IHdjaCA9PSAnKicgPyAxIDogRkRFX0dldENTU05hbWVMZW4ocHN6LCBwRW5kKTsNCi0gICAgICAgICAgICBpZiAoaU5hbWVMZW4gPT0gMCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZERV9DU1NTZWxlY3RvciAqcCA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NTZWxlY3RvcihGREVfQ1NTU0VMRUNUT1JUWVBFX0VsZW1lbnQsIHBzeiwgaU5hbWVMZW4sIFRSVUUpOw0KLSAgICAgICAgICAgIGlmIChwID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwRmlyc3QgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBwRmlyc3QgPSBwTGFzdCA9IHA7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcEZpcnN0LT5TZXRUeXBlKEZERV9DU1NTRUxFQ1RPUlRZUEVfRGVzY2VuZGFudCk7DQotICAgICAgICAgICAgICAgIHAtPlNldE5leHQocEZpcnN0KTsNCi0gICAgICAgICAgICAgICAgcEZpcnN0ID0gcExhc3QgPSBwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwc3ogKz0gaU5hbWVMZW47DQotICAgICAgICB9IGVsc2UgaWYgKHdjaCA9PSAnOicpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlOYW1lTGVuID0gRkRFX0dldENTU1BlcnN1ZG9MZW4ocHN6LCBwRW5kKTsNCi0gICAgICAgICAgICBpZiAoaU5hbWVMZW4gPT0gMCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZERV9DU1NTZWxlY3RvciAqcCA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NTZWxlY3RvcihGREVfQ1NTU0VMRUNUT1JUWVBFX1BlcnN1ZG8sIHBzeiwgaU5hbWVMZW4sIFRSVUUpOw0KLSAgICAgICAgICAgIGlmIChwID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwUGVyc3Vkb0ZpcnN0ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcFBlcnN1ZG9GaXJzdCA9IHBQZXJzdWRvTGFzdCA9IHA7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcFBlcnN1ZG9MYXN0LT5TZXROZXh0KHApOw0KLSAgICAgICAgICAgICAgICBwUGVyc3Vkb0xhc3QgPSBwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwc3ogKz0gaU5hbWVMZW47DQotICAgICAgICB9IGVsc2UgaWYgKHdjaCA9PSAnICcpIHsNCi0gICAgICAgICAgICBwc3orKzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbE9wZW46DQorICAgICAgICBpZiAocEZvbnRGYWNlUnVsZSA9PSBOVUxMKSB7DQorICAgICAgICAgIHBGb250RmFjZVJ1bGUgPSBGREVfTmV3V2l0aChtX3BBbGxvY2F0b3IpIENGREVfQ1NTRm9udEZhY2VSdWxlOw0KKyAgICAgICAgICBydWxlQXJyYXkuQWRkKHBGb250RmFjZVJ1bGUpOw0KICAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xDbG9zZToNCisgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmU7DQorICAgICAgICBGREVfQ1NTU1dJVENIREVGQVVMVFMoKTsNCiAgICAgfQ0KLSAgICBpZiAocFBlcnN1ZG9GaXJzdCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gcEZpcnN0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCit9DQorRkRFX0NTU1NZTlRBWFNUQVRVUyBDRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRJbXBvcnRSdWxlKA0KKyAgICBJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCkgew0KKyAgZm9yICg7Oykgew0KKyAgICBzd2l0Y2ggKHBTeW50YXgtPkRvU3ludGF4UGFyc2UoKSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19JbXBvcnRDbG9zZToNCisgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmU7DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1VSSToNCisgICAgICAgIGJyZWFrOw0KKyAgICAgICAgRkRFX0NTU1NXSVRDSERFRkFVTFRTKCk7DQorICAgIH0NCisgIH0NCit9DQorRkRFX0NTU1NZTlRBWFNUQVRVUyBDRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRQYWdlUnVsZSgNCisgICAgSUZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgpIHsNCisgIHJldHVybiBTa2lwUnVsZVNldChwU3ludGF4KTsNCit9DQorRkRFX0NTU1NZTlRBWFNUQVRVUyBDRkRFX0NTU1N0eWxlU2hlZXQ6OlNraXBSdWxlU2V0KA0KKyAgICBJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCkgew0KKyAgZm9yICg7Oykgew0KKyAgICBzd2l0Y2ggKHBTeW50YXgtPkRvU3ludGF4UGFyc2UoKSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19TZWxlY3RvcjoNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbE9wZW46DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5TmFtZToNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZToNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsQ2xvc2U6DQorICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KKyAgICAgICAgRkRFX0NTU1NXSVRDSERFRkFVTFRTKCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmU7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVJ1bGU6OlNldFNlbGVjdG9yKElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkRFX0NTU1NlbGVjdG9yQXJyYXkmIGxpc3QpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BwU2VsZWN0b3IgPT0gTlVMTCk7DQorICBtX2lTZWxlY3RvcnMgPSBsaXN0LkdldFNpemUoKTsNCisgIG1fcHBTZWxlY3RvciA9IChJRkRFX0NTU1NlbGVjdG9yKiopcFN0YXRpY1N0b3JlLT5BbGxvYygNCisgICAgICBtX2lTZWxlY3RvcnMgKiBzaXplb2YoSUZERV9DU1NTZWxlY3RvciopKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1faVNlbGVjdG9yczsgKytpKSB7DQorICAgIG1fcHBTZWxlY3RvcltpXSA9IGxpc3QuR2V0QXQoaSk7DQorICB9DQorfQ0KK0NGREVfQ1NTTWVkaWFSdWxlOjp+Q0ZERV9DU1NNZWRpYVJ1bGUoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IG1fUnVsZUFycmF5LkdldFNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7DQorICAgIElGREVfQ1NTUnVsZSogcFJ1bGUgPSBtX1J1bGVBcnJheS5HZXRBdChpKTsNCisgICAgc3dpdGNoIChwUnVsZS0+R2V0VHlwZSgpKSB7DQorICAgICAgY2FzZSBGREVfQ1NTUlVMRVRZUEVfU3R5bGU6DQorICAgICAgICAoKENGREVfQ1NTU3R5bGVSdWxlKilwUnVsZSktPn5DRkRFX0NTU1N0eWxlUnVsZSgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KK30NCitpbmxpbmUgRlhfQk9PTCBGREVfSXNDU1NDaGFyKEZYX1dDSEFSIHdjaCkgew0KKyAgcmV0dXJuICh3Y2ggPj0gJ2EnICYmIHdjaCA8PSAneicpIHx8ICh3Y2ggPj0gJ0EnICYmIHdjaCA8PSAnWicpOw0KK30NCitpbnQzMl90IEZERV9HZXRDU1NQZXJzdWRvTGVuKGNvbnN0IEZYX1dDSEFSKiBwc3osIGNvbnN0IEZYX1dDSEFSKiBwRW5kKSB7DQorICBGWFNZU19hc3NlcnQoKnBzeiA9PSAnOicpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IHBzejsNCisgIHdoaWxlIChwc3ogPCBwRW5kKSB7DQorICAgIEZYX1dDSEFSIHdjaCA9ICpwc3o7DQorICAgIGlmIChGREVfSXNDU1NDaGFyKHdjaCkgfHwgd2NoID09ICc6Jykgew0KKyAgICAgICsrcHN6Ow0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgcFBlcnN1ZG9MYXN0LT5TZXROZXh0KHBGaXJzdCk7DQotICAgICAgICByZXR1cm4gcFBlcnN1ZG9GaXJzdDsNCisgICAgICBicmVhazsNCiAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBzeiAtIHBTdGFydDsNCit9DQoraW50MzJfdCBGREVfR2V0Q1NTTmFtZUxlbihjb25zdCBGWF9XQ0hBUiogcHN6LCBjb25zdCBGWF9XQ0hBUiogcEVuZCkgew0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IHBzejsNCisgIHdoaWxlIChwc3ogPCBwRW5kKSB7DQorICAgIEZYX1dDSEFSIHdjaCA9ICpwc3o7DQorICAgIGlmIChGREVfSXNDU1NDaGFyKHdjaCkgfHwgKHdjaCA+PSAnMCcgJiYgd2NoIDw9ICc5JykgfHwgd2NoID09ICdfJyB8fA0KKyAgICAgICAgd2NoID09ICctJykgew0KKyAgICAgICsrcHN6Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcHN6IC0gcFN0YXJ0Ow0KK30NCitJRkRFX0NTU1NlbGVjdG9yKiBDRkRFX0NTU1NlbGVjdG9yOjpGcm9tU3RyaW5nKElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3osDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4pIHsNCisgIEZYU1lTX2Fzc2VydChwU3RhdGljU3RvcmUgIT0gTlVMTCAmJiBwc3ogIT0gTlVMTCAmJiBpTGVuID4gMCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gcHN6Ow0KKyAgY29uc3QgRlhfV0NIQVIqIHBFbmQgPSBwc3ogKyBpTGVuOw0KKyAgZm9yICg7IHBzeiA8IHBFbmQ7ICsrcHN6KSB7DQorICAgIHN3aXRjaCAoKnBzeikgew0KKyAgICAgIGNhc2UgJz4nOg0KKyAgICAgIGNhc2UgJ1snOg0KKyAgICAgIGNhc2UgJysnOg0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgIH0NCisgIENGREVfQ1NTU2VsZWN0b3IgKnBGaXJzdCA9IE5VTEwsICpwTGFzdCA9IE5VTEw7DQorICBDRkRFX0NTU1NlbGVjdG9yICpwUGVyc3Vkb0ZpcnN0ID0gTlVMTCwgKnBQZXJzdWRvTGFzdCA9IE5VTEw7DQorICBmb3IgKHBzeiA9IHBTdGFydDsgcHN6IDwgcEVuZDspIHsNCisgICAgRlhfV0NIQVIgd2NoID0gKnBzejsNCisgICAgaWYgKHdjaCA9PSAnLicgfHwgd2NoID09ICcjJykgew0KKyAgICAgIGlmIChwc3ogPT0gcFN0YXJ0IHx8IHBzelstMV0gPT0gJyAnKSB7DQorICAgICAgICBDRkRFX0NTU1NlbGVjdG9yKiBwID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKQ0KKyAgICAgICAgICAgIENGREVfQ1NTU2VsZWN0b3IoRkRFX0NTU1NFTEVDVE9SVFlQRV9FbGVtZW50LCBMIioiLCAxLCBUUlVFKTsNCisgICAgICAgIGlmIChwID09IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEZpcnN0ICE9IE5VTEwpIHsNCisgICAgICAgICAgcEZpcnN0LT5TZXRUeXBlKEZERV9DU1NTRUxFQ1RPUlRZUEVfRGVzY2VuZGFudCk7DQorICAgICAgICAgIHAtPlNldE5leHQocEZpcnN0KTsNCisgICAgICAgIH0NCisgICAgICAgIHBGaXJzdCA9IHBMYXN0ID0gcDsNCisgICAgICB9DQorICAgICAgRlhTWVNfYXNzZXJ0KHBMYXN0ICE9IE5VTEwpOw0KKyAgICAgIGludDMyX3QgaU5hbWVMZW4gPSBGREVfR2V0Q1NTTmFtZUxlbigrK3BzeiwgcEVuZCk7DQorICAgICAgaWYgKGlOYW1lTGVuID09IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBGREVfQ1NTU0VMRUNUT1JUWVBFIGVUeXBlID0NCisgICAgICAgICAgd2NoID09ICcuJyA/IEZERV9DU1NTRUxFQ1RPUlRZUEVfQ2xhc3MgOiBGREVfQ1NTU0VMRUNUT1JUWVBFX0lEOw0KKyAgICAgIENGREVfQ1NTU2VsZWN0b3IqIHAgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgIENGREVfQ1NTU2VsZWN0b3IoZVR5cGUsIHBzeiwgaU5hbWVMZW4sIEZBTFNFKTsNCisgICAgICBpZiAocCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgcC0+U2V0TmV4dChwTGFzdC0+R2V0TmV4dFNlbGVjdG9yKCkpOw0KKyAgICAgIHBMYXN0LT5TZXROZXh0KHApOw0KKyAgICAgIHBMYXN0ID0gcDsNCisgICAgICBwc3ogKz0gaU5hbWVMZW47DQorICAgIH0gZWxzZSBpZiAoRkRFX0lzQ1NTQ2hhcih3Y2gpIHx8IHdjaCA9PSAnKicpIHsNCisgICAgICBpbnQzMl90IGlOYW1lTGVuID0gd2NoID09ICcqJyA/IDEgOiBGREVfR2V0Q1NTTmFtZUxlbihwc3osIHBFbmQpOw0KKyAgICAgIGlmIChpTmFtZUxlbiA9PSAwKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgQ0ZERV9DU1NTZWxlY3RvciogcCA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkNCisgICAgICAgICAgQ0ZERV9DU1NTZWxlY3RvcihGREVfQ1NTU0VMRUNUT1JUWVBFX0VsZW1lbnQsIHBzeiwgaU5hbWVMZW4sIFRSVUUpOw0KKyAgICAgIGlmIChwID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBpZiAocEZpcnN0ID09IE5VTEwpIHsNCisgICAgICAgIHBGaXJzdCA9IHBMYXN0ID0gcDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcEZpcnN0LT5TZXRUeXBlKEZERV9DU1NTRUxFQ1RPUlRZUEVfRGVzY2VuZGFudCk7DQorICAgICAgICBwLT5TZXROZXh0KHBGaXJzdCk7DQorICAgICAgICBwRmlyc3QgPSBwTGFzdCA9IHA7DQorICAgICAgfQ0KKyAgICAgIHBzeiArPSBpTmFtZUxlbjsNCisgICAgfSBlbHNlIGlmICh3Y2ggPT0gJzonKSB7DQorICAgICAgaW50MzJfdCBpTmFtZUxlbiA9IEZERV9HZXRDU1NQZXJzdWRvTGVuKHBzeiwgcEVuZCk7DQorICAgICAgaWYgKGlOYW1lTGVuID09IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBDRkRFX0NTU1NlbGVjdG9yKiBwID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKQ0KKyAgICAgICAgICBDRkRFX0NTU1NlbGVjdG9yKEZERV9DU1NTRUxFQ1RPUlRZUEVfUGVyc3VkbywgcHN6LCBpTmFtZUxlbiwgVFJVRSk7DQorICAgICAgaWYgKHAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGlmIChwUGVyc3Vkb0ZpcnN0ID09IE5VTEwpIHsNCisgICAgICAgIHBQZXJzdWRvRmlyc3QgPSBwUGVyc3Vkb0xhc3QgPSBwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwUGVyc3Vkb0xhc3QtPlNldE5leHQocCk7DQorICAgICAgICBwUGVyc3Vkb0xhc3QgPSBwOw0KKyAgICAgIH0NCisgICAgICBwc3ogKz0gaU5hbWVMZW47DQorICAgIH0gZWxzZSBpZiAod2NoID09ICcgJykgew0KKyAgICAgIHBzeisrOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICB9DQorICBpZiAocFBlcnN1ZG9GaXJzdCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBwRmlyc3Q7DQorICB9IGVsc2Ugew0KKyAgICBwUGVyc3Vkb0xhc3QtPlNldE5leHQocEZpcnN0KTsNCisgICAgcmV0dXJuIHBQZXJzdWRvRmlyc3Q7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuaCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuaAppbmRleCA0MzU5OThmLi4zMjVlMjA4IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNoZWV0LmgKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzaGVldC5oCkBAIC03LDE1NyArNywxMzEgQEAKICNpZm5kZWYgX0ZERV9DU1NTVFlMRVNIRUVUDQogI2RlZmluZSBfRkRFX0NTU1NUWUxFU0hFRVQNCiAjaW5jbHVkZSAiZmRlX2Nzc2RlY2xhcmF0aW9uLmgiDQotY2xhc3MgQ0ZERV9DU1NTZWxlY3RvciA6IHB1YmxpYyBJRkRFX0NTU1NlbGVjdG9yLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfQ1NTU2VsZWN0b3IoRkRFX0NTU1NFTEVDVE9SVFlQRSBlVHlwZSwgY29uc3QgRlhfV0NIQVIqIHBzeiwgaW50MzJfdCBpTGVuLCBGWF9CT09MIGJJZ25vcmVDYXNlKQ0KLSAgICAgICAgOiBtX2VUeXBlKGVUeXBlKSwgbV9kd0hhc2goRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHN6LCBpTGVuLCBiSWdub3JlQ2FzZSkpLCBtX3BOZXh0KE5VTEwpDQotICAgIHsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9DU1NTRUxFQ1RPUlRZUEUJCUdldFR5cGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9lVHlwZTsNCi0gICAgfQ0KK2NsYXNzIENGREVfQ1NTU2VsZWN0b3IgOiBwdWJsaWMgSUZERV9DU1NTZWxlY3RvciwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0NTU1NlbGVjdG9yKEZERV9DU1NTRUxFQ1RPUlRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3osDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbiwNCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSWdub3JlQ2FzZSkNCisgICAgICA6IG1fZVR5cGUoZVR5cGUpLA0KKyAgICAgICAgbV9kd0hhc2goRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHN6LCBpTGVuLCBiSWdub3JlQ2FzZSkpLA0KKyAgICAgICAgbV9wTmV4dChOVUxMKSB7fQ0KKyAgdmlydHVhbCBGREVfQ1NTU0VMRUNUT1JUWVBFIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBtX2VUeXBlOyB9DQogDQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJR2V0TmFtZUhhc2goKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9kd0hhc2g7DQotICAgIH0NCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0TmFtZUhhc2goKSBjb25zdCB7IHJldHVybiBtX2R3SGFzaDsgfQ0KIA0KLSAgICB2aXJ0dWFsIElGREVfQ1NTU2VsZWN0b3IqCQlHZXROZXh0U2VsZWN0b3IoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wTmV4dDsNCi0gICAgfQ0KLSAgICBzdGF0aWMgSUZERV9DU1NTZWxlY3RvcioJCUZyb21TdHJpbmcoSUZYX01FTUFsbG9jYXRvciAqcFN0YXRpY1N0b3JlLCBjb25zdCBGWF9XQ0hBUiogcHN6LCBpbnQzMl90IGlMZW4pOw0KLSAgICB2b2lkCQkJCQkJCVNldE5leHQoSUZERV9DU1NTZWxlY3RvciAqcE5leHQpDQotICAgIHsNCi0gICAgICAgIG1fcE5leHQgPSBwTmV4dDsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgc3RhdGljIENGREVfQ1NTU2VsZWN0b3IqCQlQYXJzZVNlbGVjdG9yKElGWF9NRU1BbGxvY2F0b3IgKnBTdGF0aWNTdG9yZSwgY29uc3QgRlhfV0NIQVIqIHBzeiwgaW50MzJfdCAmaU9mZiwgaW50MzJfdCBpTGVuLCBGREVfQ1NTU0VMRUNUT1JUWVBFIGVUeXBlKTsNCi0gICAgdm9pZAkJCQkJCQlTZXRUeXBlKEZERV9DU1NTRUxFQ1RPUlRZUEUgZVR5cGUpDQotICAgIHsNCi0gICAgICAgIG1fZVR5cGUgPSAgZVR5cGU7DQotICAgIH0NCi0gICAgRkRFX0NTU1NFTEVDVE9SVFlQRQkJCQltX2VUeXBlOw0KLSAgICBGWF9EV09SRAkJCQkJCW1fZHdIYXNoOw0KLSAgICBJRkRFX0NTU1NlbGVjdG9yCQkJCSptX3BOZXh0Ow0KKyAgdmlydHVhbCBJRkRFX0NTU1NlbGVjdG9yKiBHZXROZXh0U2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBtX3BOZXh0OyB9DQorICBzdGF0aWMgSUZERV9DU1NTZWxlY3RvciogRnJvbVN0cmluZyhJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuKTsNCisgIHZvaWQgU2V0TmV4dChJRkRFX0NTU1NlbGVjdG9yKiBwTmV4dCkgeyBtX3BOZXh0ID0gcE5leHQ7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgc3RhdGljIENGREVfQ1NTU2VsZWN0b3IqIFBhcnNlU2VsZWN0b3IoSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzeiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlPZmYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTU0VMRUNUT1JUWVBFIGVUeXBlKTsNCisgIHZvaWQgU2V0VHlwZShGREVfQ1NTU0VMRUNUT1JUWVBFIGVUeXBlKSB7IG1fZVR5cGUgPSBlVHlwZTsgfQ0KKyAgRkRFX0NTU1NFTEVDVE9SVFlQRSBtX2VUeXBlOw0KKyAgRlhfRFdPUkQgbV9kd0hhc2g7DQorICBJRkRFX0NTU1NlbGVjdG9yKiBtX3BOZXh0Ow0KIH07DQogdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxJRkRFX0NTU1NlbGVjdG9yKj4gQ0ZERV9DU1NTZWxlY3RvckFycmF5Ow0KLWNsYXNzIENGREVfQ1NTU3R5bGVSdWxlIDogcHVibGljIElGREVfQ1NTU3R5bGVSdWxlLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfQ1NTU3R5bGVSdWxlKCkgOiBtX3BwU2VsZWN0b3IoTlVMTCksIG1faVNlbGVjdG9ycygwKSB7IH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUNvdW50U2VsZWN0b3JMaXN0cygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lTZWxlY3RvcnM7DQotICAgIH0NCi0gICAgdmlydHVhbCBJRkRFX0NTU1NlbGVjdG9yKgkJR2V0U2VsZWN0b3JMaXN0KGludDMyX3QgaW5kZXgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BwU2VsZWN0b3JbaW5kZXhdOw0KLSAgICB9DQorY2xhc3MgQ0ZERV9DU1NTdHlsZVJ1bGUgOiBwdWJsaWMgSUZERV9DU1NTdHlsZVJ1bGUsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9DU1NTdHlsZVJ1bGUoKSA6IG1fcHBTZWxlY3RvcihOVUxMKSwgbV9pU2VsZWN0b3JzKDApIHt9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRTZWxlY3Rvckxpc3RzKCkgY29uc3QgeyByZXR1cm4gbV9pU2VsZWN0b3JzOyB9DQorICB2aXJ0dWFsIElGREVfQ1NTU2VsZWN0b3IqIEdldFNlbGVjdG9yTGlzdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIHJldHVybiBtX3BwU2VsZWN0b3JbaW5kZXhdOw0KKyAgfQ0KIA0KLSAgICB2aXJ0dWFsIElGREVfQ1NTRGVjbGFyYXRpb24qCUdldERlY2xhcmF0aW9uKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChJRkRFX0NTU0RlY2xhcmF0aW9uKikmbV9EZWNsYXJhdGlvbjsNCi0gICAgfQ0KLSAgICBDRkRFX0NTU0RlY2xhcmF0aW9uJgkJCUdldERlY2xJbXAoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9EZWNsYXJhdGlvbjsNCi0gICAgfQ0KLSAgICB2b2lkCQkJCQkJCVNldFNlbGVjdG9yKElGWF9NRU1BbGxvY2F0b3IgKnBTdGF0aWNTdG9yZSwgY29uc3QgQ0ZERV9DU1NTZWxlY3RvckFycmF5ICZsaXN0KTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGREVfQ1NTRGVjbGFyYXRpb24JCQkJbV9EZWNsYXJhdGlvbjsNCi0gICAgSUZERV9DU1NTZWxlY3RvcgkJCQkqKm1fcHBTZWxlY3RvcjsNCi0gICAgaW50MzJfdAkJCQkJCW1faVNlbGVjdG9yczsNCi19Ow0KLWNsYXNzIENGREVfQ1NTTWVkaWFSdWxlIDogcHVibGljIElGREVfQ1NTTWVkaWFSdWxlLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfQ1NTTWVkaWFSdWxlKEZYX0RXT1JEIGR3TWVkaWFMaXN0KSA6IG1fZHdNZWRpYUxpc3QoZHdNZWRpYUxpc3QpIHsgfQ0KLSAgICB+Q0ZERV9DU1NNZWRpYVJ1bGUoKTsNCisgIHZpcnR1YWwgSUZERV9DU1NEZWNsYXJhdGlvbiogR2V0RGVjbGFyYXRpb24oKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NEZWNsYXJhdGlvbiopJm1fRGVjbGFyYXRpb247DQorICB9DQorICBDRkRFX0NTU0RlY2xhcmF0aW9uJiBHZXREZWNsSW1wKCkgeyByZXR1cm4gbV9EZWNsYXJhdGlvbjsgfQ0KKyAgdm9pZCBTZXRTZWxlY3RvcihJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGREVfQ1NTU2VsZWN0b3JBcnJheSYgbGlzdCk7DQogDQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJR2V0TWVkaWFMaXN0KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZHdNZWRpYUxpc3Q7DQotICAgIH0NCisgcHJvdGVjdGVkOg0KKyAgQ0ZERV9DU1NEZWNsYXJhdGlvbiBtX0RlY2xhcmF0aW9uOw0KKyAgSUZERV9DU1NTZWxlY3RvcioqIG1fcHBTZWxlY3RvcjsNCisgIGludDMyX3QgbV9pU2VsZWN0b3JzOw0KK307DQorY2xhc3MgQ0ZERV9DU1NNZWRpYVJ1bGUgOiBwdWJsaWMgSUZERV9DU1NNZWRpYVJ1bGUsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9DU1NNZWRpYVJ1bGUoRlhfRFdPUkQgZHdNZWRpYUxpc3QpIDogbV9kd01lZGlhTGlzdChkd01lZGlhTGlzdCkge30NCisgIH5DRkRFX0NTU01lZGlhUnVsZSgpOw0KIA0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJQ291bnRSdWxlcygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX1J1bGVBcnJheS5HZXRTaXplKCk7DQotICAgIH0NCi0gICAgdmlydHVhbCBJRkRFX0NTU1J1bGUqCQkJR2V0UnVsZShpbnQzMl90IGluZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9SdWxlQXJyYXkuR2V0QXQoaW5kZXgpOw0KLSAgICB9DQotICAgIENGREVfQ1NTUnVsZUFycmF5JgkJCQlHZXRBcnJheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX1J1bGVBcnJheTsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgRlhfRFdPUkQJCQkJCQltX2R3TWVkaWFMaXN0Ow0KLSAgICBDRkRFX0NTU1J1bGVBcnJheQkJCQltX1J1bGVBcnJheTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0TWVkaWFMaXN0KCkgY29uc3QgeyByZXR1cm4gbV9kd01lZGlhTGlzdDsgfQ0KKw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50UnVsZXMoKSBjb25zdCB7IHJldHVybiBtX1J1bGVBcnJheS5HZXRTaXplKCk7IH0NCisgIHZpcnR1YWwgSUZERV9DU1NSdWxlKiBHZXRSdWxlKGludDMyX3QgaW5kZXgpIHsNCisgICAgcmV0dXJuIG1fUnVsZUFycmF5LkdldEF0KGluZGV4KTsNCisgIH0NCisgIENGREVfQ1NTUnVsZUFycmF5JiBHZXRBcnJheSgpIHsgcmV0dXJuIG1fUnVsZUFycmF5OyB9DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0RXT1JEIG1fZHdNZWRpYUxpc3Q7DQorICBDRkRFX0NTU1J1bGVBcnJheSBtX1J1bGVBcnJheTsNCiB9Ow0KLWNsYXNzIENGREVfQ1NTRm9udEZhY2VSdWxlIDogcHVibGljIElGREVfQ1NTRm9udEZhY2VSdWxlLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgSUZERV9DU1NEZWNsYXJhdGlvbioJR2V0RGVjbGFyYXRpb24oKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKElGREVfQ1NTRGVjbGFyYXRpb24qKSZtX0RlY2xhcmF0aW9uOw0KLSAgICB9DQotICAgIENGREVfQ1NTRGVjbGFyYXRpb24mCQkJR2V0RGVjbEltcCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX0RlY2xhcmF0aW9uOw0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICBDRkRFX0NTU0RlY2xhcmF0aW9uCQkJCW1fRGVjbGFyYXRpb247DQorY2xhc3MgQ0ZERV9DU1NGb250RmFjZVJ1bGUgOiBwdWJsaWMgSUZERV9DU1NGb250RmFjZVJ1bGUsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBJRkRFX0NTU0RlY2xhcmF0aW9uKiBHZXREZWNsYXJhdGlvbigpIGNvbnN0IHsNCisgICAgcmV0dXJuIChJRkRFX0NTU0RlY2xhcmF0aW9uKikmbV9EZWNsYXJhdGlvbjsNCisgIH0NCisgIENGREVfQ1NTRGVjbGFyYXRpb24mIEdldERlY2xJbXAoKSB7IHJldHVybiBtX0RlY2xhcmF0aW9uOyB9DQorDQorIHByb3RlY3RlZDoNCisgIENGREVfQ1NTRGVjbGFyYXRpb24gbV9EZWNsYXJhdGlvbjsNCiB9Ow0KLSNkZWZpbmUgRkRFX0NTU1NXSVRDSERFRkFVTFRTKCkJCWNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19FT1M6IFwNCisjZGVmaW5lIEZERV9DU1NTV0lUQ0hERUZBVUxUUygpICAgICBcDQorICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRU9TOiAgICAgXA0KICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19FT1M7IFwNCi0gICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOiBcDQotICAgIGRlZmF1bHQ6IFwNCisgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvcjogICBcDQorICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvcjsNCi1jbGFzcyBDRkRFX0NTU1N0eWxlU2hlZXQgOiBwdWJsaWMgSUZERV9DU1NTdHlsZVNoZWV0LCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfQ1NTU3R5bGVTaGVldChGWF9EV09SRCBkd01lZGlhTGlzdCk7DQotICAgIH5DRkRFX0NTU1N0eWxlU2hlZXQoKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJCQlBZGRSZWYoKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJCQlSZWxlYXNlKCk7DQorY2xhc3MgQ0ZERV9DU1NTdHlsZVNoZWV0IDogcHVibGljIElGREVfQ1NTU3R5bGVTaGVldCwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0NTU1N0eWxlU2hlZXQoRlhfRFdPUkQgZHdNZWRpYUxpc3QpOw0KKyAgfkNGREVfQ1NTU3R5bGVTaGVldCgpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBBZGRSZWYoKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgUmVsZWFzZSgpOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUdldFVybChDRlhfV2lkZVN0cmluZyAmc3pVcmwpDQotICAgIHsNCi0gICAgICAgIHN6VXJsID0gbV9zelVybDsNCi0gICAgICAgIHJldHVybiBzelVybC5HZXRMZW5ndGgoKSA+IDA7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9EV09SRAkJCQlHZXRNZWRpYUxpc3QoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9kd01lZGlhTGlzdDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX1dPUkQJCQkJCUdldENvZGVQYWdlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fd0NvZGVQYWdlOw0KLSAgICB9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlDb3VudFJ1bGVzKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgSUZERV9DU1NSdWxlKgkJCUdldFJ1bGUoaW50MzJfdCBpbmRleCk7DQotICAgIEZYX0JPT0wJCQkJCQkJTG9hZEZyb21TdHJlYW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnN6VXJsLCBJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9XT1JEIHdDb2RlUGFnZSk7DQotICAgIEZYX0JPT0wJCQkJCQkJTG9hZEZyb21CdWZmZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnN6VXJsLCBjb25zdCBGWF9XQ0hBUiogcEJ1ZmZlciwgaW50MzJfdCBpQnVmU2l6ZSwgRlhfV09SRCB3Q29kZVBhZ2UpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAkJCQkJCQlSZXNldCgpOw0KLSAgICBGWF9CT09MCQkJCQkJCUxvYWRGcm9tU3ludGF4KElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4KTsNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVUwkJCQlMb2FkU3R5bGVSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4LCBDRkRFX0NTU1J1bGVBcnJheSAmcnVsZUFycmF5KTsNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVUwkJCQlMb2FkSW1wb3J0UnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCk7DQotICAgIEZERV9DU1NTWU5UQVhTVEFUVVMJCQkJTG9hZFBhZ2VSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4KTsNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVUwkJCQlMb2FkTWVkaWFSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4KTsNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVUwkJCQlMb2FkRm9udEZhY2VSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyICpwU3ludGF4LCBDRkRFX0NTU1J1bGVBcnJheSAmcnVsZUFycmF5KTsNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVUwkJCQlTa2lwUnVsZVNldChJRkRFX0NTU1N5bnRheFBhcnNlciAqcFN5bnRheCk7DQotICAgIEZYX1dPUkQJCQkJCQkJbV93Q29kZVBhZ2U7DQotICAgIEZYX1dPUkQJCQkJCQkJbV93UmVmQ291bnQ7DQotICAgIEZYX0RXT1JECQkJCQkJbV9kd01lZGlhTGlzdDsNCi0gICAgSUZYX01FTUFsbG9jYXRvcgkJCQkqbV9wQWxsb2NhdG9yOw0KLSAgICBDRkRFX0NTU1J1bGVBcnJheQkJCQltX1J1bGVBcnJheTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQkJCW1fc3pVcmw7DQotICAgIENGREVfQ1NTU2VsZWN0b3JBcnJheQkJCW1fU2VsZWN0b3JzOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCQkJCW1fU3RyaW5nQ2FjaGU7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0VXJsKENGWF9XaWRlU3RyaW5nJiBzelVybCkgew0KKyAgICBzelVybCA9IG1fc3pVcmw7DQorICAgIHJldHVybiBzelVybC5HZXRMZW5ndGgoKSA+IDA7DQorICB9DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldE1lZGlhTGlzdCgpIGNvbnN0IHsgcmV0dXJuIG1fZHdNZWRpYUxpc3Q7IH0NCisgIHZpcnR1YWwgRlhfV09SRCBHZXRDb2RlUGFnZSgpIGNvbnN0IHsgcmV0dXJuIG1fd0NvZGVQYWdlOyB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRSdWxlcygpIGNvbnN0Ow0KKyAgdmlydHVhbCBJRkRFX0NTU1J1bGUqIEdldFJ1bGUoaW50MzJfdCBpbmRleCk7DQorICBGWF9CT09MIExvYWRGcm9tU3RyZWFtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzelVybCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpOw0KKyAgRlhfQk9PTCBMb2FkRnJvbUJ1ZmZlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgc3pVcmwsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCdWZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgUmVzZXQoKTsNCisgIEZYX0JPT0wgTG9hZEZyb21TeW50YXgoSUZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgpOw0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVUyBMb2FkU3R5bGVSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTUnVsZUFycmF5JiBydWxlQXJyYXkpOw0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVUyBMb2FkSW1wb3J0UnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCk7DQorICBGREVfQ1NTU1lOVEFYU1RBVFVTIExvYWRQYWdlUnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCk7DQorICBGREVfQ1NTU1lOVEFYU1RBVFVTIExvYWRNZWRpYVJ1bGUoSUZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgpOw0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVUyBMb2FkRm9udEZhY2VSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTUnVsZUFycmF5JiBydWxlQXJyYXkpOw0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVUyBTa2lwUnVsZVNldChJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCk7DQorICBGWF9XT1JEIG1fd0NvZGVQYWdlOw0KKyAgRlhfV09SRCBtX3dSZWZDb3VudDsNCisgIEZYX0RXT1JEIG1fZHdNZWRpYUxpc3Q7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBtX3BBbGxvY2F0b3I7DQorICBDRkRFX0NTU1J1bGVBcnJheSBtX1J1bGVBcnJheTsNCisgIENGWF9XaWRlU3RyaW5nIG1fc3pVcmw7DQorICBDRkRFX0NTU1NlbGVjdG9yQXJyYXkgbV9TZWxlY3RvcnM7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9TdHJpbmdDYWNoZTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N5bnRheC5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguY3BwCmluZGV4IDE5NjcwMDcuLmRlYTQ1M2YgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N5bnRheC5jcHAKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3ludGF4LmNwcApAQCAtMTAsNDg2ICsxMCw0NzYgQEAKICNpZmRlZiBfY3BsdXNwbHVzDQogZXh0ZXJuICJDIiB7DQogI2VuZGlmDQotICAgIGlubGluZSBGWF9CT09MIEZERV9Jc1NlbGVjdG9yU3RhcnQoRlhfV0NIQVIgd2NoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd2NoID09ICcuJyB8fCB3Y2ggPT0gJyMnIHx8IHdjaCA9PSAnKicNCi0gICAgICAgICAgICAgICB8fCAod2NoID49ICdhJyAmJiB3Y2ggPD0gJ3onKQ0KLSAgICAgICAgICAgICAgIHx8ICh3Y2ggPj0gJ0EnICYmIHdjaCA8PSAnWicpOw0KLSAgICB9DQoraW5saW5lIEZYX0JPT0wgRkRFX0lzU2VsZWN0b3JTdGFydChGWF9XQ0hBUiB3Y2gpIHsNCisgIHJldHVybiB3Y2ggPT0gJy4nIHx8IHdjaCA9PSAnIycgfHwgd2NoID09ICcqJyB8fCAod2NoID49ICdhJyAmJiB3Y2ggPD0gJ3onKSB8fA0KKyAgICAgICAgICh3Y2ggPj0gJ0EnICYmIHdjaCA8PSAnWicpOw0KK30NCiAjaWZkZWYgX2NwbHVzcGx1cw0KIH07DQogI2VuZGlmDQotSUZERV9DU1NTeW50YXhQYXJzZXIqIElGREVfQ1NTU3ludGF4UGFyc2VyOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBDRkRFX0NTU1N5bnRheFBhcnNlcjsNCitJRkRFX0NTU1N5bnRheFBhcnNlciogSUZERV9DU1NTeW50YXhQYXJzZXI6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZERV9DU1NTeW50YXhQYXJzZXI7DQogfQ0KIENGREVfQ1NTU3ludGF4UGFyc2VyOjpDRkRFX0NTU1N5bnRheFBhcnNlcigpDQotICAgIDogbV9wU3RyZWFtKE5VTEwpDQotICAgICwgbV9pU3RyZWFtUG9zKDApDQotICAgICwgbV9pUGxhbmVTaXplKDApDQotICAgICwgbV9pVGV4dERhdExlbigwKQ0KLSAgICAsIG1fZHdDaGVjaygoRlhfRFdPUkQpIC0gMSkNCi0gICAgLCBtX2VNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQpDQotICAgICwgbV9lU3RhdHVzKEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZSkNCi17DQorICAgIDogbV9wU3RyZWFtKE5VTEwpLA0KKyAgICAgIG1faVN0cmVhbVBvcygwKSwNCisgICAgICBtX2lQbGFuZVNpemUoMCksDQorICAgICAgbV9pVGV4dERhdExlbigwKSwNCisgICAgICBtX2R3Q2hlY2soKEZYX0RXT1JEKS0xKSwNCisgICAgICBtX2VNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQpLA0KKyAgICAgIG1fZVN0YXR1cyhGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmUpIHt9DQorQ0ZERV9DU1NTeW50YXhQYXJzZXI6On5DRkRFX0NTU1N5bnRheFBhcnNlcigpIHsNCisgIG1fVGV4dERhdGEuUmVzZXQoKTsNCisgIG1fVGV4dFBsYW5lLlJlc2V0KCk7DQogfQ0KLUNGREVfQ1NTU3ludGF4UGFyc2VyOjp+Q0ZERV9DU1NTeW50YXhQYXJzZXIoKQ0KLXsNCi0gICAgbV9UZXh0RGF0YS5SZXNldCgpOw0KLSAgICBtX1RleHRQbGFuZS5SZXNldCgpOw0KLX0NCi1GWF9CT09MIENGREVfQ1NTU3ludGF4UGFyc2VyOjpJbml0KElGWF9TdHJlYW0gKnBTdHJlYW0sIGludDMyX3QgaUNTU1BsYW5lU2l6ZSwgaW50MzJfdCBpVGV4dERhdGFTaXplICwgRlhfQk9PTCBiT25seURlY2xhcmF0aW9uICkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwU3RyZWFtICE9IE5VTEwgJiYgaUNTU1BsYW5lU2l6ZSA+IDAgJiYgaVRleHREYXRhU2l6ZSA+IDApOw0KLSAgICBSZXNldChiT25seURlY2xhcmF0aW9uKTsNCi0gICAgaWYgKCFtX1RleHREYXRhLkVzdGltYXRlU2l6ZShpVGV4dERhdGFTaXplKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHVpbnQ4X3QgYm9tWzRdOw0KLSAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOw0KLSAgICBtX2lTdHJlYW1Qb3MgPSBtX3BTdHJlYW0tPkdldEJPTShib20pOw0KLSAgICBtX2lQbGFuZVNpemUgPSBpQ1NTUGxhbmVTaXplOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6SW5pdChjb25zdCBGWF9XQ0hBUiogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSwgaW50MzJfdCBpVGV4dERhdFNpemUgLCBGWF9CT09MIGJPbmx5RGVjbGFyYXRpb24gKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmZmVyU2l6ZSA+IDAgJiYgaVRleHREYXRTaXplID4gMCk7DQotICAgIFJlc2V0KGJPbmx5RGVjbGFyYXRpb24pOw0KLSAgICBpZiAoIW1fVGV4dERhdGEuRXN0aW1hdGVTaXplKGlUZXh0RGF0U2l6ZSkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9UZXh0UGxhbmUuQXR0YWNoQnVmZmVyKHBCdWZmZXIsIGlCdWZmZXJTaXplKTsNCi19DQotdm9pZCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6UmVzZXQoRlhfQk9PTCBiT25seURlY2xhcmF0aW9uKQ0KLXsNCi0gICAgbV9UZXh0UGxhbmUuUmVzZXQoKTsNCi0gICAgbV9UZXh0RGF0YS5SZXNldCgpOw0KLSAgICBtX3BTdHJlYW0gPSBOVUxMOw0KLSAgICBtX2lTdHJlYW1Qb3MgPSAwOw0KLSAgICBtX2lUZXh0RGF0TGVuID0gMDsNCi0gICAgbV9kd0NoZWNrID0gKEZYX0RXT1JEKSAtIDE7DQotICAgIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCi0gICAgbV9lTW9kZSA9IGJPbmx5RGVjbGFyYXRpb24gPyBGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eU5hbWUgOiBGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0Ow0KLX0NCi1GREVfQ1NTU1lOVEFYU1RBVFVTIENGREVfQ1NTU3ludGF4UGFyc2VyOjpEb1N5bnRheFBhcnNlKCkNCi17DQotICAgIHdoaWxlIChtX2VTdGF0dXMgPj0gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lKSB7DQotICAgICAgICBpZiAobV9UZXh0UGxhbmUuSXNFT0YoKSkgew0KLSAgICAgICAgICAgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBpZiAobV9lTW9kZSA9PSBGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eVZhbHVlICYmIG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBTYXZlVGV4dERhdGEoKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRU9TOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWF9CT09MIGJFT1M7DQotICAgICAgICAgICAgaW50MzJfdCBpTGVuID0gbV9UZXh0UGxhbmUuTG9hZEZyb21TdHJlYW0obV9wU3RyZWFtLCBtX2lTdHJlYW1Qb3MsIG1faVBsYW5lU2l6ZSwgYkVPUyk7DQotICAgICAgICAgICAgbV9pU3RyZWFtUG9zID0gbV9wU3RyZWFtLT5HZXRQb3NpdGlvbigpOw0KLSAgICAgICAgICAgIGlmIChpTGVuIDwgMSkgew0KLSAgICAgICAgICAgICAgICBpZiAobV9lTW9kZSA9PSBGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eVZhbHVlICYmIG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBTYXZlVGV4dERhdGEoKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRU9TOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYX1dDSEFSIHdjaDsNCi0gICAgICAgIHdoaWxlICghbV9UZXh0UGxhbmUuSXNFT0YoKSkgew0KLSAgICAgICAgICAgIHdjaCA9IG1fVGV4dFBsYW5lLkdldENoYXIoKTsNCi0gICAgICAgICAgICBzd2l0Y2ggKG1fZU1vZGUpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0Og0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3Y2gpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdAJzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9BdFJ1bGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd9JzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3RvcmVNb2RlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xDbG9zZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9UZXh0UGxhbmUuR2V0TmV4dENoYXIoKSA9PSAnKicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTW9kZVN0YWNrLlB1c2gobV9lTW9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX0NvbW1lbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2NoIDw9ICcgJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGREVfSXNTZWxlY3RvclN0YXJ0KHdjaCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfU2VsZWN0b3IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfU3R5bGVSdWxlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9TZWxlY3RvcjoNCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2NoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLCc6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfU2VsZWN0b3IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pVGV4dERhdExlbiA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1NlbGVjdG9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVUZXh0RGF0YSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfU2VsZWN0b3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Nb2RlU3RhY2suUHVzaChGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xPcGVuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9UZXh0UGxhbmUuR2V0TmV4dENoYXIoKSA9PSAnKicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTd2l0Y2hUb0NvbW1lbnQoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19TZWxlY3RvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5TmFtZToNCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2NoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOic6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5TmFtZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd9JzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3RvcmVNb2RlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xDbG9zZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9UZXh0UGxhbmUuR2V0TmV4dENoYXIoKSA9PSAnKicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTd2l0Y2hUb0NvbW1lbnQoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eU5hbWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVuZENoYXIod2NoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eVZhbHVlOg0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3Y2gpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc7JzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd9JzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eVZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9UZXh0UGxhbmUuR2V0TmV4dENoYXIoKSA9PSAnKicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTd2l0Y2hUb0NvbW1lbnQoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eVZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfQ29tbWVudDoNCi0gICAgICAgICAgICAgICAgICAgIGlmICh3Y2ggPT0gJy8nICYmIG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1fVGV4dERhdGEuR2V0QXQobV9UZXh0RGF0YS5HZXRMZW5ndGgoKSAtIDEpID09ICcqJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RvcmVNb2RlKCk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dERhdGEuQXBwZW5kQ2hhcih3Y2gpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX01lZGlhVHlwZToNCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2NoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLCc6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfTWVkaWFUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faVRleHREYXRMZW4gPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneyc6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NTWU5UQVhNT0RFICpwTW9kZSA9IG1fTW9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwTW9kZSA9PSBOVUxMIHx8ICpwTW9kZSAhPSBGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVJ1bGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9lU3RhdHVzID0gRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX1RleHREYXRhLkdldExlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVUZXh0RGF0YSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX01lZGlhVHlwZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcE1vZGUgPSBGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfUnVsZVNldCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbE9wZW47DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOyc6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NTWU5UQVhNT0RFICpwTW9kZSA9IG1fTW9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwTW9kZSA9PSBOVUxMIHx8ICpwTW9kZSAhPSBGREVfQ1NTU1lOVEFYTU9ERV9JbXBvcnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9lU3RhdHVzID0gRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX1RleHREYXRhLkdldExlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVUZXh0RGF0YSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0ltcG9ydEVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmFibGVkID0gSXNJbXBvcnRFbmFibGVkKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01vZGVTdGFjay5Qb3AoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlSW1wb3J0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0ltcG9ydENsb3NlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fVGV4dFBsYW5lLkdldE5leHRDaGFyKCkgPT0gJyonKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3dpdGNoVG9Db21tZW50KCkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFUeXBlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfVVJJOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1NZTlRBWE1PREUgKnBNb2RlID0gbV9Nb2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwTW9kZSA9PSBOVUxMIHx8ICpwTW9kZSAhPSBGREVfQ1NTU1lOVEFYTU9ERV9JbXBvcnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3Y2ggPD0gJyAnIHx8IHdjaCA9PSAnOycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVVJJU3RhcnQsIGlVUklMZW5ndGggPSBtX1RleHREYXRhLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaVVSSUxlbmd0aCA+IDAgJiYgRkRFX1BhcnNlQ1NTVVJJKG1fVGV4dERhdGEuR2V0QnVmZmVyKCksIGlVUklMZW5ndGgsIGlVUklTdGFydCwgaVVSSUxlbmd0aCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dERhdGEuU3VidHJhY3QoaVVSSVN0YXJ0LCBpVVJJTGVuZ3RoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfTWVkaWFUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0ltcG9ydEVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1VSSTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfQXRSdWxlOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdjaCA+ICcgJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVuZENoYXIod2NoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuID0gbV9UZXh0RGF0YS5HZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6ID0gbV9UZXh0RGF0YS5HZXRCdWZmZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRlhTWVNfd2NzbmNtcChMImNoYXJzZXQiLCBwc3osIGlMZW4pID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9DaGFyc2V0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEZYU1lTX3djc25jbXAoTCJpbXBvcnQiLCBwc3osIGlMZW4pID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Nb2RlU3RhY2suUHVzaChGREVfQ1NTU1lOVEFYTU9ERV9JbXBvcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1VSSSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0ltcG9ydEVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfSW1wb3J0UnVsZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGWFNZU193Y3NuY21wKEwibWVkaWEiLCBwc3osIGlMZW4pID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Nb2RlU3RhY2suUHVzaChGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVJ1bGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX01lZGlhVHlwZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX01lZGlhUnVsZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEZYU1lTX3djc25jbXAoTCJmb250LWZhY2UiLCBwc3osIGlMZW4pID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9TZWxlY3Rvcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0ZvbnRGYWNlUnVsZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEZYU1lTX3djc25jbXAoTCJwYWdlIiwgcHN6LCBpTGVuKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfU2VsZWN0b3IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19QYWdlUnVsZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1Vua25vd25SdWxlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9DaGFyc2V0Og0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdjaCA9PSAnOycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfUnVsZVNldCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzQ2hhcnNldEVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlQ2hhcnNldCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pVGV4dERhdExlbiA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BTdHJlYW0gIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gRlhfR2V0Q29kZVBhZ2VGb3JtU3RyaW5nVyhtX1RleHREYXRhLkdldEJ1ZmZlcigpLCBtX2lUZXh0RGF0TGVuKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod0NvZGVQYWdlIDwgMHhGRkZGICYmIG1fcFN0cmVhbS0+R2V0Q29kZVBhZ2UoKSAhPSB3Q29kZVBhZ2UpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RyZWFtLT5TZXRDb2RlUGFnZSh3Q29kZVBhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0NoYXJzZXQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVuZENoYXIod2NoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX1Vua25vd25SdWxlOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdjaCA9PSAnOycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gbV9lU3RhdHVzOw0KLX0NCi1GWF9CT09MIENGREVfQ1NTU3ludGF4UGFyc2VyOjpJc0ltcG9ydEVuYWJsZWQoKSBjb25zdA0KLXsNCi0gICAgaWYgKChtX2R3Q2hlY2sgJiBGREVfQ1NTU1lOVEFYQ0hFQ0tfQWxsb3dJbXBvcnQpID09IDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAobV9Nb2RlU3RhY2suR2V0U2l6ZSgpID4gMSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1pbmxpbmUgRlhfQk9PTCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6QXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpDQotew0KLSAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KLSAgICBpZiAobV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDAgfHwgd2NoID4gJyAnKSB7DQotICAgICAgICBtX1RleHREYXRhLkFwcGVuZENoYXIod2NoKTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQorRlhfQk9PTCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6SW5pdChJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ1NTUGxhbmVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVGV4dERhdGFTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seURlY2xhcmF0aW9uKSB7DQorICBGWFNZU19hc3NlcnQocFN0cmVhbSAhPSBOVUxMICYmIGlDU1NQbGFuZVNpemUgPiAwICYmIGlUZXh0RGF0YVNpemUgPiAwKTsNCisgIFJlc2V0KGJPbmx5RGVjbGFyYXRpb24pOw0KKyAgaWYgKCFtX1RleHREYXRhLkVzdGltYXRlU2l6ZShpVGV4dERhdGFTaXplKSkgew0KICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB1aW50OF90IGJvbVs0XTsNCisgIG1fcFN0cmVhbSA9IHBTdHJlYW07DQorICBtX2lTdHJlYW1Qb3MgPSBtX3BTdHJlYW0tPkdldEJPTShib20pOw0KKyAgbV9pUGxhbmVTaXplID0gaUNTU1BsYW5lU2l6ZTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1pbmxpbmUgaW50MzJfdCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6U2F2ZVRleHREYXRhKCkNCi17DQotICAgIG1faVRleHREYXRMZW4gPSBtX1RleHREYXRhLlRyaW1FbmQoKTsNCi0gICAgbV9UZXh0RGF0YS5DbGVhcigpOw0KLSAgICByZXR1cm4gbV9pVGV4dERhdExlbjsNCitGWF9CT09MIENGREVfQ1NTU3ludGF4UGFyc2VyOjpJbml0KGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRleHREYXRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seURlY2xhcmF0aW9uKSB7DQorICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCAmJiBpVGV4dERhdFNpemUgPiAwKTsNCisgIFJlc2V0KGJPbmx5RGVjbGFyYXRpb24pOw0KKyAgaWYgKCFtX1RleHREYXRhLkVzdGltYXRlU2l6ZShpVGV4dERhdFNpemUpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBtX1RleHRQbGFuZS5BdHRhY2hCdWZmZXIocEJ1ZmZlciwgaUJ1ZmZlclNpemUpOw0KIH0NCi1pbmxpbmUgdm9pZCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6U3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERSBlTW9kZSkNCi17DQotICAgIG1fZU1vZGUgPSBlTW9kZTsNCi0gICAgU2F2ZVRleHREYXRhKCk7DQordm9pZCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6UmVzZXQoRlhfQk9PTCBiT25seURlY2xhcmF0aW9uKSB7DQorICBtX1RleHRQbGFuZS5SZXNldCgpOw0KKyAgbV9UZXh0RGF0YS5SZXNldCgpOw0KKyAgbV9wU3RyZWFtID0gTlVMTDsNCisgIG1faVN0cmVhbVBvcyA9IDA7DQorICBtX2lUZXh0RGF0TGVuID0gMDsNCisgIG1fZHdDaGVjayA9IChGWF9EV09SRCktMTsNCisgIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCisgIG1fZU1vZGUgPSBiT25seURlY2xhcmF0aW9uID8gRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlOYW1lDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQ7DQogfQ0KLWlubGluZSBpbnQzMl90IENGREVfQ1NTU3ludGF4UGFyc2VyOjpTd2l0Y2hUb0NvbW1lbnQoKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gbV9UZXh0RGF0YS5HZXRMZW5ndGgoKTsNCi0gICAgbV9Nb2RlU3RhY2suUHVzaChtX2VNb2RlKTsNCi0gICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9Db21tZW50KTsNCi0gICAgcmV0dXJuIGlMZW5ndGg7DQotfQ0KLWlubGluZSBGWF9CT09MIENGREVfQ1NTU3ludGF4UGFyc2VyOjpSZXN0b3JlTW9kZSgpDQotew0KLSAgICBGREVfQ1NTU1lOVEFYTU9ERSAqcE1vZGUgPSBtX01vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQotICAgIGlmIChwTW9kZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorRkRFX0NTU1NZTlRBWFNUQVRVUyBDRkRFX0NTU1N5bnRheFBhcnNlcjo6RG9TeW50YXhQYXJzZSgpIHsNCisgIHdoaWxlIChtX2VTdGF0dXMgPj0gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lKSB7DQorICAgIGlmIChtX1RleHRQbGFuZS5Jc0VPRigpKSB7DQorICAgICAgaWYgKG1fcFN0cmVhbSA9PSBOVUxMKSB7DQorICAgICAgICBpZiAobV9lTW9kZSA9PSBGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eVZhbHVlICYmDQorICAgICAgICAgICAgbV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgICAgICAgU2F2ZVRleHREYXRhKCk7DQorICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbV9lU3RhdHVzID0gRkRFX0NTU1NZTlRBWFNUQVRVU19FT1M7DQorICAgICAgfQ0KKyAgICAgIEZYX0JPT0wgYkVPUzsNCisgICAgICBpbnQzMl90IGlMZW4gPSBtX1RleHRQbGFuZS5Mb2FkRnJvbVN0cmVhbShtX3BTdHJlYW0sIG1faVN0cmVhbVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lQbGFuZVNpemUsIGJFT1MpOw0KKyAgICAgIG1faVN0cmVhbVBvcyA9IG1fcFN0cmVhbS0+R2V0UG9zaXRpb24oKTsNCisgICAgICBpZiAoaUxlbiA8IDEpIHsNCisgICAgICAgIGlmIChtX2VNb2RlID09IEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5VmFsdWUgJiYNCisgICAgICAgICAgICBtX1RleHREYXRhLkdldExlbmd0aCgpID4gMCkgew0KKyAgICAgICAgICBTYXZlVGV4dERhdGEoKTsNCisgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0VPUzsNCisgICAgICB9DQogICAgIH0NCi0gICAgU3dpdGNoTW9kZSgqcE1vZGUpOw0KLSAgICBtX01vZGVTdGFjay5Qb3AoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIEZYX1dDSEFSIHdjaDsNCisgICAgd2hpbGUgKCFtX1RleHRQbGFuZS5Jc0VPRigpKSB7DQorICAgICAgd2NoID0gbV9UZXh0UGxhbmUuR2V0Q2hhcigpOw0KKyAgICAgIHN3aXRjaCAobV9lTW9kZSkgew0KKyAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0Og0KKyAgICAgICAgICBzd2l0Y2ggKHdjaCkgew0KKyAgICAgICAgICAgIGNhc2UgJ0AnOg0KKyAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfQXRSdWxlKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ30nOg0KKyAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgICAgICAgICAgIGlmIChSZXN0b3JlTW9kZSgpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xDbG9zZTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnLyc6DQorICAgICAgICAgICAgICBpZiAobV9UZXh0UGxhbmUuR2V0TmV4dENoYXIoKSA9PSAnKicpIHsNCisgICAgICAgICAgICAgICAgbV9Nb2RlU3RhY2suUHVzaChtX2VNb2RlKTsNCisgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9Db21tZW50KTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgIGlmICh3Y2ggPD0gJyAnKSB7DQorICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKEZERV9Jc1NlbGVjdG9yU3RhcnQod2NoKSkgew0KKyAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1NlbGVjdG9yKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfU3R5bGVSdWxlOw0KKyAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfU2VsZWN0b3I6DQorICAgICAgICAgIHN3aXRjaCAod2NoKSB7DQorICAgICAgICAgICAgY2FzZSAnLCc6DQorICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9TZWxlY3Rvcik7DQorICAgICAgICAgICAgICBpZiAobV9pVGV4dERhdExlbiA+IDApIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfU2VsZWN0b3I7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICd7JzoNCisgICAgICAgICAgICAgIGlmIChtX1RleHREYXRhLkdldExlbmd0aCgpID4gMCkgew0KKyAgICAgICAgICAgICAgICBTYXZlVGV4dERhdGEoKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfU2VsZWN0b3I7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICAgICAgICBtX01vZGVTdGFjay5QdXNoKEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQpOw0KKyAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xPcGVuOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnLyc6DQorICAgICAgICAgICAgICBpZiAobV9UZXh0UGxhbmUuR2V0TmV4dENoYXIoKSA9PSAnKicpIHsNCisgICAgICAgICAgICAgICAgaWYgKFN3aXRjaFRvQ29tbWVudCgpID4gMCkgew0KKyAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1NlbGVjdG9yOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlOYW1lOg0KKyAgICAgICAgICBzd2l0Y2ggKHdjaCkgew0KKyAgICAgICAgICAgIGNhc2UgJzonOg0KKyAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eU5hbWU7DQorICAgICAgICAgICAgY2FzZSAnfSc6DQorICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICAgICAgaWYgKFJlc3RvcmVNb2RlKCkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbENsb3NlOw0KKyAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICcvJzoNCisgICAgICAgICAgICAgIGlmIChtX1RleHRQbGFuZS5HZXROZXh0Q2hhcigpID09ICcqJykgew0KKyAgICAgICAgICAgICAgICBpZiAoU3dpdGNoVG9Db21tZW50KCkgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlWYWx1ZToNCisgICAgICAgICAgc3dpdGNoICh3Y2gpIHsNCisgICAgICAgICAgICBjYXNlICc7JzoNCisgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgY2FzZSAnfSc6DQorICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5TmFtZSk7DQorICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eVZhbHVlOw0KKyAgICAgICAgICAgIGNhc2UgJy8nOg0KKyAgICAgICAgICAgICAgaWYgKG1fVGV4dFBsYW5lLkdldE5leHRDaGFyKCkgPT0gJyonKSB7DQorICAgICAgICAgICAgICAgIGlmIChTd2l0Y2hUb0NvbW1lbnQoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eVZhbHVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfQ29tbWVudDoNCisgICAgICAgICAgaWYgKHdjaCA9PSAnLycgJiYgbV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDAgJiYNCisgICAgICAgICAgICAgIG1fVGV4dERhdGEuR2V0QXQobV9UZXh0RGF0YS5HZXRMZW5ndGgoKSAtIDEpID09ICcqJykgew0KKyAgICAgICAgICAgIFJlc3RvcmVNb2RlKCk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9UZXh0RGF0YS5BcHBlbmRDaGFyKHdjaCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX01lZGlhVHlwZToNCisgICAgICAgICAgc3dpdGNoICh3Y2gpIHsNCisgICAgICAgICAgICBjYXNlICcsJzoNCisgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX01lZGlhVHlwZSk7DQorICAgICAgICAgICAgICBpZiAobV9pVGV4dERhdExlbiA+IDApIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFUeXBlOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAneyc6IHsNCisgICAgICAgICAgICAgIEZERV9DU1NTWU5UQVhNT0RFKiBwTW9kZSA9IG1fTW9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgIGlmIChwTW9kZSA9PSBOVUxMIHx8ICpwTW9kZSAhPSBGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVJ1bGUpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAobV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgU2F2ZVRleHREYXRhKCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX01lZGlhVHlwZTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICAgICpwTW9kZSA9IEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQ7DQorICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfUnVsZVNldCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xPcGVuOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnOyc6IHsNCisgICAgICAgICAgICAgIEZERV9DU1NTWU5UQVhNT0RFKiBwTW9kZSA9IG1fTW9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgIGlmIChwTW9kZSA9PSBOVUxMIHx8ICpwTW9kZSAhPSBGREVfQ1NTU1lOVEFYTU9ERV9JbXBvcnQpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAobV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgU2F2ZVRleHREYXRhKCk7DQorICAgICAgICAgICAgICAgIGlmIChJc0ltcG9ydEVuYWJsZWQoKSkgew0KKyAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX01lZGlhVHlwZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5hYmxlZCA9IElzSW1wb3J0RW5hYmxlZCgpOw0KKyAgICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICAgICAgICBtX01vZGVTdGFjay5Qb3AoKTsNCisgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0KTsNCisgICAgICAgICAgICAgICAgaWYgKGJFbmFibGVkKSB7DQorICAgICAgICAgICAgICAgICAgRGlzYWJsZUltcG9ydCgpOw0KKyAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0ltcG9ydENsb3NlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgICBjYXNlICcvJzoNCisgICAgICAgICAgICAgIGlmIChtX1RleHRQbGFuZS5HZXROZXh0Q2hhcigpID09ICcqJykgew0KKyAgICAgICAgICAgICAgICBpZiAoU3dpdGNoVG9Db21tZW50KCkgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFUeXBlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfVVJJOiB7DQorICAgICAgICAgIEZERV9DU1NTWU5UQVhNT0RFKiBwTW9kZSA9IG1fTW9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgaWYgKHBNb2RlID09IE5VTEwgfHwgKnBNb2RlICE9IEZERV9DU1NTWU5UQVhNT0RFX0ltcG9ydCkgew0KKyAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICh3Y2ggPD0gJyAnIHx8IHdjaCA9PSAnOycpIHsNCisgICAgICAgICAgICBpbnQzMl90IGlVUklTdGFydCwgaVVSSUxlbmd0aCA9IG1fVGV4dERhdGEuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgaWYgKGlVUklMZW5ndGggPiAwICYmDQorICAgICAgICAgICAgICAgIEZERV9QYXJzZUNTU1VSSShtX1RleHREYXRhLkdldEJ1ZmZlcigpLCBpVVJJTGVuZ3RoLCBpVVJJU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVVJJTGVuZ3RoKSkgew0KKyAgICAgICAgICAgICAgbV9UZXh0RGF0YS5TdWJ0cmFjdChpVVJJU3RhcnQsIGlVUklMZW5ndGgpOw0KKyAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVR5cGUpOw0KKyAgICAgICAgICAgICAgaWYgKElzSW1wb3J0RW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1VSSTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9BdFJ1bGU6DQorICAgICAgICAgIGlmICh3Y2ggPiAnICcpIHsNCisgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaW50MzJfdCBpTGVuID0gbV9UZXh0RGF0YS5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6ID0gbV9UZXh0RGF0YS5HZXRCdWZmZXIoKTsNCisgICAgICAgICAgICBpZiAoRlhTWVNfd2NzbmNtcChMImNoYXJzZXQiLCBwc3osIGlMZW4pID09IDApIHsNCisgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfQ2hhcnNldCk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChGWFNZU193Y3NuY21wKEwiaW1wb3J0IiwgcHN6LCBpTGVuKSA9PSAwKSB7DQorICAgICAgICAgICAgICBtX01vZGVTdGFjay5QdXNoKEZERV9DU1NTWU5UQVhNT0RFX0ltcG9ydCk7DQorICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1VSSSk7DQorICAgICAgICAgICAgICBpZiAoSXNJbXBvcnRFbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfSW1wb3J0UnVsZTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRlhTWVNfd2NzbmNtcChMIm1lZGlhIiwgcHN6LCBpTGVuKSA9PSAwKSB7DQorICAgICAgICAgICAgICBtX01vZGVTdGFjay5QdXNoKEZERV9DU1NTWU5UQVhNT0RFX01lZGlhUnVsZSk7DQorICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX01lZGlhVHlwZSk7DQorICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVJ1bGU7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChGWFNZU193Y3NuY21wKEwiZm9udC1mYWNlIiwgcHN6LCBpTGVuKSA9PSAwKSB7DQorICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1NlbGVjdG9yKTsNCisgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0ZvbnRGYWNlUnVsZTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKEZYU1lTX3djc25jbXAoTCJwYWdlIiwgcHN6LCBpTGVuKSA9PSAwKSB7DQorICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1NlbGVjdG9yKTsNCisgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1BhZ2VSdWxlOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1Vua25vd25SdWxlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX0NoYXJzZXQ6DQorICAgICAgICAgIGlmICh3Y2ggPT0gJzsnKSB7DQorICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQpOw0KKyAgICAgICAgICAgIGlmIChJc0NoYXJzZXRFbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgIERpc2FibGVDaGFyc2V0KCk7DQorICAgICAgICAgICAgICBpZiAobV9pVGV4dERhdExlbiA+IDApIHsNCisgICAgICAgICAgICAgICAgaWYgKG1fcFN0cmVhbSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSBGWF9HZXRDb2RlUGFnZUZvcm1TdHJpbmdXKA0KKyAgICAgICAgICAgICAgICAgICAgICBtX1RleHREYXRhLkdldEJ1ZmZlcigpLCBtX2lUZXh0RGF0TGVuKTsNCisgICAgICAgICAgICAgICAgICBpZiAod0NvZGVQYWdlIDwgMHhGRkZGICYmDQorICAgICAgICAgICAgICAgICAgICAgIG1fcFN0cmVhbS0+R2V0Q29kZVBhZ2UoKSAhPSB3Q29kZVBhZ2UpIHsNCisgICAgICAgICAgICAgICAgICAgIG1fcFN0cmVhbS0+U2V0Q29kZVBhZ2Uod0NvZGVQYWdlKTsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfQ2hhcnNldDsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9Vbmtub3duUnVsZToNCisgICAgICAgICAgaWYgKHdjaCA9PSAnOycpIHsNCisgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gbV9lU3RhdHVzOw0KIH0NCi1jb25zdCBGWF9XQ0hBUiogQ0ZERV9DU1NTeW50YXhQYXJzZXI6OkdldEN1cnJlbnRTdHJpbmcoaW50MzJfdCAmaUxlbmd0aCkgY29uc3QNCi17DQotICAgIGlMZW5ndGggPSBtX2lUZXh0RGF0TGVuOw0KLSAgICByZXR1cm4gbV9UZXh0RGF0YS5HZXRCdWZmZXIoKTsNCitGWF9CT09MIENGREVfQ1NTU3ludGF4UGFyc2VyOjpJc0ltcG9ydEVuYWJsZWQoKSBjb25zdCB7DQorICBpZiAoKG1fZHdDaGVjayAmIEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0ltcG9ydCkgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9Nb2RlU3RhY2suR2V0U2l6ZSgpID4gMSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQoraW5saW5lIEZYX0JPT0wgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OkFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSB7DQorICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgaWYgKG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwIHx8IHdjaCA+ICcgJykgew0KKyAgICBtX1RleHREYXRhLkFwcGVuZENoYXIod2NoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK2lubGluZSBpbnQzMl90IENGREVfQ1NTU3ludGF4UGFyc2VyOjpTYXZlVGV4dERhdGEoKSB7DQorICBtX2lUZXh0RGF0TGVuID0gbV9UZXh0RGF0YS5UcmltRW5kKCk7DQorICBtX1RleHREYXRhLkNsZWFyKCk7DQorICByZXR1cm4gbV9pVGV4dERhdExlbjsNCit9DQoraW5saW5lIHZvaWQgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OlN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREUgZU1vZGUpIHsNCisgIG1fZU1vZGUgPSBlTW9kZTsNCisgIFNhdmVUZXh0RGF0YSgpOw0KK30NCitpbmxpbmUgaW50MzJfdCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6U3dpdGNoVG9Db21tZW50KCkgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gbV9UZXh0RGF0YS5HZXRMZW5ndGgoKTsNCisgIG1fTW9kZVN0YWNrLlB1c2gobV9lTW9kZSk7DQorICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX0NvbW1lbnQpOw0KKyAgcmV0dXJuIGlMZW5ndGg7DQorfQ0KK2lubGluZSBGWF9CT09MIENGREVfQ1NTU3ludGF4UGFyc2VyOjpSZXN0b3JlTW9kZSgpIHsNCisgIEZERV9DU1NTWU5UQVhNT0RFKiBwTW9kZSA9IG1fTW9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgIGlmIChwTW9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFN3aXRjaE1vZGUoKnBNb2RlKTsNCisgIG1fTW9kZVN0YWNrLlBvcCgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK2NvbnN0IEZYX1dDSEFSKiBDRkRFX0NTU1N5bnRheFBhcnNlcjo6R2V0Q3VycmVudFN0cmluZyhpbnQzMl90JiBpTGVuZ3RoKSBjb25zdCB7DQorICBpTGVuZ3RoID0gbV9pVGV4dERhdExlbjsNCisgIHJldHVybiBtX1RleHREYXRhLkdldEJ1ZmZlcigpOw0KIH0NCiBDRkRFX0NTU1RleHRCdWY6OkNGREVfQ1NTVGV4dEJ1ZigpDQotICAgIDogbV9iRXh0QnVmKEZBTFNFKQ0KLSAgICAsIG1fcEJ1ZmZlcihOVUxMKQ0KLSAgICAsIG1faUJ1ZkxlbigwKQ0KLSAgICAsIG1faURhdExlbigwKQ0KLSAgICAsIG1faURhdFBvcygwKQ0KLXsNCisgICAgOiBtX2JFeHRCdWYoRkFMU0UpLA0KKyAgICAgIG1fcEJ1ZmZlcihOVUxMKSwNCisgICAgICBtX2lCdWZMZW4oMCksDQorICAgICAgbV9pRGF0TGVuKDApLA0KKyAgICAgIG1faURhdFBvcygwKSB7fQ0KK0NGREVfQ1NTVGV4dEJ1Zjo6fkNGREVfQ1NTVGV4dEJ1ZigpIHsNCisgIFJlc2V0KCk7DQogfQ0KLUNGREVfQ1NTVGV4dEJ1Zjo6fkNGREVfQ1NTVGV4dEJ1ZigpDQotew0KLSAgICBSZXNldCgpOw0KK3ZvaWQgQ0ZERV9DU1NUZXh0QnVmOjpSZXNldCgpIHsNCisgIGlmICghbV9iRXh0QnVmICYmIG1fcEJ1ZmZlciAhPSBOVUxMKSB7DQorICAgIEZERV9GcmVlKG1fcEJ1ZmZlcik7DQorICAgIG1fcEJ1ZmZlciA9IE5VTEw7DQorICB9DQorICBtX2lEYXRQb3MgPSBtX2lEYXRMZW4gPSBtX2lCdWZMZW47DQogfQ0KLXZvaWQgQ0ZERV9DU1NUZXh0QnVmOjpSZXNldCgpDQotew0KLSAgICBpZiAoIW1fYkV4dEJ1ZiAmJiBtX3BCdWZmZXIgIT0gTlVMTCkgew0KLSAgICAgICAgRkRFX0ZyZWUobV9wQnVmZmVyKTsNCi0gICAgICAgIG1fcEJ1ZmZlciA9IE5VTEw7DQotICAgIH0NCi0gICAgbV9pRGF0UG9zID0gbV9pRGF0TGVuID0gbV9pQnVmTGVuOw0KK0ZYX0JPT0wgQ0ZERV9DU1NUZXh0QnVmOjpBdHRhY2hCdWZmZXIoY29uc3QgRlhfV0NIQVIqIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCdWZMZW4pIHsNCisgIFJlc2V0KCk7DQorICBtX3BCdWZmZXIgPSAoRlhfV0NIQVIqKXBCdWZmZXI7DQorICBtX2lEYXRMZW4gPSBtX2lCdWZMZW4gPSBpQnVmTGVuOw0KKyAgcmV0dXJuIG1fYkV4dEJ1ZiA9IFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZERV9DU1NUZXh0QnVmOjpBdHRhY2hCdWZmZXIoY29uc3QgRlhfV0NIQVIqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZkxlbikNCi17DQotICAgIFJlc2V0KCk7DQotICAgIG1fcEJ1ZmZlciA9IChGWF9XQ0hBUiopcEJ1ZmZlcjsNCi0gICAgbV9pRGF0TGVuID0gbV9pQnVmTGVuID0gaUJ1ZkxlbjsNCi0gICAgcmV0dXJuIG1fYkV4dEJ1ZiA9IFRSVUU7DQorRlhfQk9PTCBDRkRFX0NTU1RleHRCdWY6OkVzdGltYXRlU2l6ZShpbnQzMl90IGlBbGxvY1NpemUpIHsNCisgIEZYU1lTX2Fzc2VydChpQWxsb2NTaXplID4gMCk7DQorICBDbGVhcigpOw0KKyAgbV9iRXh0QnVmID0gRkFMU0U7DQorICByZXR1cm4gRXhwYW5kQnVmKGlBbGxvY1NpemUpOw0KIH0NCi1GWF9CT09MIENGREVfQ1NTVGV4dEJ1Zjo6RXN0aW1hdGVTaXplKGludDMyX3QgaUFsbG9jU2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChpQWxsb2NTaXplID4gMCk7DQotICAgIENsZWFyKCk7DQotICAgIG1fYkV4dEJ1ZiA9IEZBTFNFOw0KLSAgICByZXR1cm4gRXhwYW5kQnVmKGlBbGxvY1NpemUpOw0KK2ludDMyX3QgQ0ZERV9DU1NUZXh0QnVmOjpMb2FkRnJvbVN0cmVhbShJRlhfU3RyZWFtKiBwVHh0U3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdHJlYW1PZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heENoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TKSB7DQorICBGWFNZU19hc3NlcnQoaVN0cmVhbU9mZnNldCA+PSAwICYmIGlNYXhDaGFycyA+IDApOw0KKyAgQ2xlYXIoKTsNCisgIG1fYkV4dEJ1ZiA9IEZBTFNFOw0KKyAgaWYgKCFFeHBhbmRCdWYoaU1heENoYXJzKSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHBUeHRTdHJlYW0tPkxvY2soKTsNCisgIGlmIChwVHh0U3RyZWFtLT5HZXRQb3NpdGlvbigpICE9IGlTdHJlYW1PZmZzZXQpIHsNCisgICAgcFR4dFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBpU3RyZWFtT2Zmc2V0KTsNCisgIH0NCisgIG1faURhdExlbiA9IHBUeHRTdHJlYW0tPlJlYWRTdHJpbmcobV9wQnVmZmVyLCBpTWF4Q2hhcnMsIGJFT1MpOw0KKyAgcFR4dFN0cmVhbS0+VW5sb2NrKCk7DQorICByZXR1cm4gbV9pRGF0TGVuOw0KIH0NCi1pbnQzMl90IENGREVfQ1NTVGV4dEJ1Zjo6TG9hZEZyb21TdHJlYW0oSUZYX1N0cmVhbSAqcFR4dFN0cmVhbSwgaW50MzJfdCBpU3RyZWFtT2Zmc2V0LCBpbnQzMl90IGlNYXhDaGFycywgRlhfQk9PTCAmYkVPUykNCi17DQotICAgIEZYU1lTX2Fzc2VydChpU3RyZWFtT2Zmc2V0ID49IDAgJiYgaU1heENoYXJzID4gMCk7DQotICAgIENsZWFyKCk7DQotICAgIG1fYkV4dEJ1ZiA9IEZBTFNFOw0KLSAgICBpZiAoIUV4cGFuZEJ1ZihpTWF4Q2hhcnMpKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBwVHh0U3RyZWFtLT5Mb2NrKCk7DQotICAgIGlmIChwVHh0U3RyZWFtLT5HZXRQb3NpdGlvbigpICE9IGlTdHJlYW1PZmZzZXQpIHsNCi0gICAgICAgIHBUeHRTdHJlYW0tPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgaVN0cmVhbU9mZnNldCk7DQotICAgIH0NCi0gICAgbV9pRGF0TGVuID0gcFR4dFN0cmVhbS0+UmVhZFN0cmluZyhtX3BCdWZmZXIsIGlNYXhDaGFycywgYkVPUyk7DQotICAgIHBUeHRTdHJlYW0tPlVubG9jaygpOw0KLSAgICByZXR1cm4gbV9pRGF0TGVuOw0KK0ZYX0JPT0wgQ0ZERV9DU1NUZXh0QnVmOjpFeHBhbmRCdWYoaW50MzJfdCBpRGVzaXJlZFNpemUpIHsNCisgIGlmIChtX2JFeHRCdWYpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfSBlbHNlIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgew0KKyAgICBtX3BCdWZmZXIgPSAoRlhfV0NIQVIqKUZERV9BbGxvYyhpRGVzaXJlZFNpemUgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIH0gZWxzZSBpZiAobV9pQnVmTGVuICE9IGlEZXNpcmVkU2l6ZSkgew0KKyAgICBtX3BCdWZmZXIgPQ0KKyAgICAgICAgKEZYX1dDSEFSKilGREVfUmVhbGxvYyhtX3BCdWZmZXIsIGlEZXNpcmVkU2l6ZSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsNCisgICAgbV9pQnVmTGVuID0gMDsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfSBlbHNlIHsNCisgICAgbV9pQnVmTGVuID0gaURlc2lyZWRTaXplOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCiB9DQotRlhfQk9PTCBDRkRFX0NTU1RleHRCdWY6OkV4cGFuZEJ1ZihpbnQzMl90IGlEZXNpcmVkU2l6ZSkNCi17DQotICAgIGlmIChtX2JFeHRCdWYpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfSBlbHNlIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgew0KLSAgICAgICAgbV9wQnVmZmVyID0gKEZYX1dDSEFSKilGREVfQWxsb2MoaURlc2lyZWRTaXplICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgIH0gZWxzZSBpZiAobV9pQnVmTGVuICE9IGlEZXNpcmVkU2l6ZSkgew0KLSAgICAgICAgbV9wQnVmZmVyID0gKEZYX1dDSEFSKilGREVfUmVhbGxvYyhtX3BCdWZmZXIsIGlEZXNpcmVkU2l6ZSAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7DQotICAgICAgICBtX2lCdWZMZW4gPSAwOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9pQnVmTGVuID0gaURlc2lyZWRTaXplOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi19DQotdm9pZCBDRkRFX0NTU1RleHRCdWY6OlN1YnRyYWN0KGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlMZW5ndGgpDQotew0KLSAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID49IDAgJiYgaUxlbmd0aCA+IDApOw0KLSAgICBpZiAoaUxlbmd0aCA+IG1faURhdExlbiAtIGlTdGFydCkgew0KLSAgICAgICAgaUxlbmd0aCA9IG1faURhdExlbiAtIGlTdGFydDsNCi0gICAgfQ0KLSAgICBpZiAoaUxlbmd0aCA8IDApIHsNCi0gICAgICAgIGlMZW5ndGggPSAwOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhTWVNfbWVtbW92ZShtX3BCdWZmZXIsIG1fcEJ1ZmZlciArIGlTdGFydCwgaUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICB9DQotICAgIG1faURhdExlbiA9IGlMZW5ndGg7DQordm9pZCBDRkRFX0NTU1RleHRCdWY6OlN1YnRyYWN0KGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChpU3RhcnQgPj0gMCAmJiBpTGVuZ3RoID4gMCk7DQorICBpZiAoaUxlbmd0aCA+IG1faURhdExlbiAtIGlTdGFydCkgew0KKyAgICBpTGVuZ3RoID0gbV9pRGF0TGVuIC0gaVN0YXJ0Ow0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPCAwKSB7DQorICAgIGlMZW5ndGggPSAwOw0KKyAgfSBlbHNlIHsNCisgICAgRlhTWVNfbWVtbW92ZShtX3BCdWZmZXIsIG1fcEJ1ZmZlciArIGlTdGFydCwgaUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgfQ0KKyAgbV9pRGF0TGVuID0gaUxlbmd0aDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3ludGF4LmggYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguaAppbmRleCA2NDYzZDhhLi4zNjY5MzU4IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguaAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguaApAQCAtNiwxMzAgKzYsMTA1IEBACiANCiAjaWZuZGVmIF9GREVfQ1NTU1lOVEFYDQogI2RlZmluZSBfRkRFX0NTU1NZTlRBWA0KLWNsYXNzIENGREVfQ1NTVGV4dEJ1ZiA6IHB1YmxpYyBDRlhfVGFyZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9DU1NUZXh0QnVmKCk7DQotICAgIH5DRkRFX0NTU1RleHRCdWYoKTsNCi0gICAgRlhfQk9PTAkJCQkJCQlBdHRhY2hCdWZmZXIoY29uc3QgRlhfV0NIQVIqIHBCdWZmZXIsIGludDMyX3QgaUJ1Zkxlbik7DQotICAgIEZYX0JPT0wJCQkJCQkJRXN0aW1hdGVTaXplKGludDMyX3QgaUFsbG9jU2l6ZSk7DQotICAgIGludDMyX3QJCQkJCQlMb2FkRnJvbVN0cmVhbShJRlhfU3RyZWFtICpwVHh0U3RyZWFtLCBpbnQzMl90IGlTdHJlYW1PZmZzZXQsIGludDMyX3QgaU1heENoYXJzLCBGWF9CT09MICZiRU9TKTsNCi0gICAgRlhfQk9PTAkJCQkJCQlBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkNCi0gICAgew0KLSAgICAgICAgaWYgKG1faURhdExlbiA+PSBtX2lCdWZMZW4gJiYgIUV4cGFuZEJ1ZihtX2lCdWZMZW4gKiAyKSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAobV9wQnVmZmVyW21faURhdExlbisrXSA9IHdjaCksIFRSVUU7DQorY2xhc3MgQ0ZERV9DU1NUZXh0QnVmIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0NTU1RleHRCdWYoKTsNCisgIH5DRkRFX0NTU1RleHRCdWYoKTsNCisgIEZYX0JPT0wgQXR0YWNoQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLCBpbnQzMl90IGlCdWZMZW4pOw0KKyAgRlhfQk9PTCBFc3RpbWF0ZVNpemUoaW50MzJfdCBpQWxsb2NTaXplKTsNCisgIGludDMyX3QgTG9hZEZyb21TdHJlYW0oSUZYX1N0cmVhbSogcFR4dFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RyZWFtT2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVPUyk7DQorICBGWF9CT09MIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSB7DQorICAgIGlmIChtX2lEYXRMZW4gPj0gbV9pQnVmTGVuICYmICFFeHBhbmRCdWYobV9pQnVmTGVuICogMikpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgdm9pZAkJCQkJCQlDbGVhcigpDQotICAgIHsNCi0gICAgICAgIG1faURhdFBvcyA9IG1faURhdExlbiA9IDA7DQorICAgIHJldHVybiAobV9wQnVmZmVyW21faURhdExlbisrXSA9IHdjaCksIFRSVUU7DQorICB9DQorICB2b2lkIENsZWFyKCkgeyBtX2lEYXRQb3MgPSBtX2lEYXRMZW4gPSAwOyB9DQorICB2b2lkIFJlc2V0KCk7DQorICBpbnQzMl90IFRyaW1FbmQoKSB7DQorICAgIHdoaWxlIChtX2lEYXRMZW4gPiAwICYmIG1fcEJ1ZmZlclttX2lEYXRMZW4gLSAxXSA8PSAnICcpIHsNCisgICAgICAtLW1faURhdExlbjsNCiAgICAgfQ0KLSAgICB2b2lkCQkJCQkJCVJlc2V0KCk7DQotICAgIGludDMyX3QJCQkJCQlUcmltRW5kKCkNCi0gICAgew0KLSAgICAgICAgd2hpbGUgKG1faURhdExlbiA+IDAgJiYgbV9wQnVmZmVyW21faURhdExlbiAtIDFdIDw9ICcgJykgew0KLSAgICAgICAgICAgIC0tbV9pRGF0TGVuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQXBwZW5kQ2hhcigwKTsNCi0gICAgICAgIHJldHVybiAtLW1faURhdExlbjsNCi0gICAgfQ0KLSAgICB2b2lkCQkJCQkJCVN1YnRyYWN0KGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlMZW5ndGgpOw0KLSAgICBGWF9CT09MCQkJCQkJCUlzRU9GKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faURhdFBvcyA+PSBtX2lEYXRMZW47DQotICAgIH0NCi0gICAgRlhfV0NIQVIJCQkJCQlHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wQnVmZmVyW2luZGV4XTsNCi0gICAgfQ0KLSAgICBGWF9XQ0hBUgkJCQkJCUdldENoYXIoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wQnVmZmVyW21faURhdFBvc107DQotICAgIH0NCi0gICAgRlhfV0NIQVIJCQkJCQlHZXROZXh0Q2hhcigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAobV9pRGF0UG9zICsgMSA+PSBtX2lEYXRMZW4pID8gMCA6IG1fcEJ1ZmZlclttX2lEYXRQb3MgKyAxXTsNCi0gICAgfQ0KLSAgICB2b2lkCQkJCQkJCU1vdmVOZXh0KCkNCi0gICAgew0KLSAgICAgICAgbV9pRGF0UG9zKys7DQotICAgIH0NCi0gICAgaW50MzJfdAkJCQkJCUdldExlbmd0aCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lEYXRMZW47DQotICAgIH0NCi0gICAgY29uc3QgRlhfV0NIQVIqCQkJCQkJR2V0QnVmZmVyKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcEJ1ZmZlcjsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgRlhfQk9PTAkJCQkJCQlFeHBhbmRCdWYoaW50MzJfdCBpRGVzaXJlZFNpemUpOw0KLSAgICBGWF9CT09MCQkJCQkJCW1fYkV4dEJ1ZjsNCi0gICAgRlhfV0NIQVIqCQkJCQkJbV9wQnVmZmVyOw0KLSAgICBpbnQzMl90CQkJCQkJbV9pQnVmTGVuOw0KLSAgICBpbnQzMl90CQkJCQkJbV9pRGF0TGVuOw0KLSAgICBpbnQzMl90CQkJCQkJbV9pRGF0UG9zOw0KLX07DQotI2RlZmluZSBGREVfQ1NTU1lOVEFYQ0hFQ0tfQWxsb3dDaGFyc2V0CTENCi0jZGVmaW5lIEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0ltcG9ydAkyDQotZW51bSBGREVfQ1NTU1lOVEFYTU9ERSB7DQotICAgIEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQsDQotICAgIEZERV9DU1NTWU5UQVhNT0RFX0NvbW1lbnQsDQotICAgIEZERV9DU1NTWU5UQVhNT0RFX0F0UnVsZSwNCi0gICAgRkRFX0NTU1NZTlRBWE1PREVfVW5rbm93blJ1bGUsDQotICAgIEZERV9DU1NTWU5UQVhNT0RFX0NoYXJzZXQsDQotICAgIEZERV9DU1NTWU5UQVhNT0RFX0ltcG9ydCwNCi0gICAgRkRFX0NTU1NZTlRBWE1PREVfTWVkaWFSdWxlLA0KLSAgICBGREVfQ1NTU1lOVEFYTU9ERV9VUkksDQotICAgIEZERV9DU1NTWU5UQVhNT0RFX01lZGlhVHlwZSwNCi0gICAgRkRFX0NTU1NZTlRBWE1PREVfU2VsZWN0b3IsDQotICAgIEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5TmFtZSwNCi0gICAgRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlWYWx1ZSwNCi19Ow0KLWNsYXNzIENGREVfQ1NTU3ludGF4UGFyc2VyIDogcHVibGljIElGREVfQ1NTU3ludGF4UGFyc2VyLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfQ1NTU3ludGF4UGFyc2VyKCk7DQotICAgIH5DRkRFX0NTU1N5bnRheFBhcnNlcigpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUluaXQoSUZYX1N0cmVhbSAqcFN0cmVhbSwgaW50MzJfdCBpQ1NTUGxhbmVTaXplLCBpbnQzMl90IGlUZXh0RGF0YVNpemUgPSAzMiwgRlhfQk9PTCBiT25seURlY2xhcmF0aW9uID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUluaXQoY29uc3QgRlhfV0NIQVIqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUsIGludDMyX3QgaVRleHREYXRTaXplID0gMzIsIEZYX0JPT0wgYk9ubHlEZWNsYXJhdGlvbiA9IEZBTFNFKTsNCi0gICAgdmlydHVhbCBGREVfQ1NTU1lOVEFYU1RBVFVTCQlEb1N5bnRheFBhcnNlKCk7DQotICAgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqCQkJCUdldEN1cnJlbnRTdHJpbmcoaW50MzJfdCAmaUxlbmd0aCkgY29uc3Q7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQkJCQkJCVJlc2V0KEZYX0JPT0wgYk9ubHlEZWNsYXJhdGlvbik7DQotICAgIHZvaWQJCQkJCQkJU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERSBlTW9kZSk7DQotICAgIGludDMyX3QJCQkJCQlTd2l0Y2hUb0NvbW1lbnQoKTsNCisgICAgQXBwZW5kQ2hhcigwKTsNCisgICAgcmV0dXJuIC0tbV9pRGF0TGVuOw0KKyAgfQ0KKyAgdm9pZCBTdWJ0cmFjdChpbnQzMl90IGlTdGFydCwgaW50MzJfdCBpTGVuZ3RoKTsNCisgIEZYX0JPT0wgSXNFT0YoKSBjb25zdCB7IHJldHVybiBtX2lEYXRQb3MgPj0gbV9pRGF0TGVuOyB9DQorICBGWF9XQ0hBUiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX3BCdWZmZXJbaW5kZXhdOyB9DQorICBGWF9XQ0hBUiBHZXRDaGFyKCkgY29uc3QgeyByZXR1cm4gbV9wQnVmZmVyW21faURhdFBvc107IH0NCisgIEZYX1dDSEFSIEdldE5leHRDaGFyKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKG1faURhdFBvcyArIDEgPj0gbV9pRGF0TGVuKSA/IDAgOiBtX3BCdWZmZXJbbV9pRGF0UG9zICsgMV07DQorICB9DQorICB2b2lkIE1vdmVOZXh0KCkgeyBtX2lEYXRQb3MrKzsgfQ0KKyAgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2lEYXRMZW47IH0NCisgIGNvbnN0IEZYX1dDSEFSKiBHZXRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX3BCdWZmZXI7IH0NCiANCi0gICAgRlhfQk9PTAkJCQkJCQlSZXN0b3JlTW9kZSgpOw0KLSAgICBGWF9CT09MCQkJCQkJCUFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKTsNCi0gICAgaW50MzJfdAkJCQkJCVNhdmVUZXh0RGF0YSgpOw0KLSAgICBGWF9CT09MCQkJCQkJCUlzQ2hhcnNldEVuYWJsZWQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKG1fZHdDaGVjayAmIEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0NoYXJzZXQpICE9IDA7DQotICAgIH0NCi0gICAgdm9pZAkJCQkJCQlEaXNhYmxlQ2hhcnNldCgpDQotICAgIHsNCi0gICAgICAgIG1fZHdDaGVjayA9IEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0ltcG9ydDsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQkJCQkJCUlzSW1wb3J0RW5hYmxlZCgpIGNvbnN0Ow0KLSAgICB2b2lkCQkJCQkJCURpc2FibGVJbXBvcnQoKQ0KLSAgICB7DQotICAgICAgICBtX2R3Q2hlY2sgPSAwOw0KLSAgICB9DQotICAgIElGWF9TdHJlYW0JCQkJCQkqbV9wU3RyZWFtOw0KLSAgICBpbnQzMl90CQkJCQkJbV9pU3RyZWFtUG9zOw0KLSAgICBpbnQzMl90CQkJCQkJbV9pUGxhbmVTaXplOw0KLSAgICBDRkRFX0NTU1RleHRCdWYJCQkJCW1fVGV4dERhdGE7DQotICAgIENGREVfQ1NTVGV4dEJ1ZgkJCQkJbV9UZXh0UGxhbmU7DQotICAgIGludDMyX3QJCQkJCQltX2lUZXh0RGF0TGVuOw0KLSAgICBGWF9EV09SRAkJCQkJCW1fZHdDaGVjazsNCi0gICAgRkRFX0NTU1NZTlRBWE1PREUJCQkJbV9lTW9kZTsNCi0gICAgRkRFX0NTU1NZTlRBWFNUQVRVUwkJCQltX2VTdGF0dXM7DQotICAgIENGWF9TdGFja1RlbXBsYXRlPEZERV9DU1NTWU5UQVhNT0RFPiBtX01vZGVTdGFjazsNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBFeHBhbmRCdWYoaW50MzJfdCBpRGVzaXJlZFNpemUpOw0KKyAgRlhfQk9PTCBtX2JFeHRCdWY7DQorICBGWF9XQ0hBUiogbV9wQnVmZmVyOw0KKyAgaW50MzJfdCBtX2lCdWZMZW47DQorICBpbnQzMl90IG1faURhdExlbjsNCisgIGludDMyX3QgbV9pRGF0UG9zOw0KK307DQorI2RlZmluZSBGREVfQ1NTU1lOVEFYQ0hFQ0tfQWxsb3dDaGFyc2V0IDENCisjZGVmaW5lIEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0ltcG9ydCAyDQorZW51bSBGREVfQ1NTU1lOVEFYTU9ERSB7DQorICBGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0LA0KKyAgRkRFX0NTU1NZTlRBWE1PREVfQ29tbWVudCwNCisgIEZERV9DU1NTWU5UQVhNT0RFX0F0UnVsZSwNCisgIEZERV9DU1NTWU5UQVhNT0RFX1Vua25vd25SdWxlLA0KKyAgRkRFX0NTU1NZTlRBWE1PREVfQ2hhcnNldCwNCisgIEZERV9DU1NTWU5UQVhNT0RFX0ltcG9ydCwNCisgIEZERV9DU1NTWU5UQVhNT0RFX01lZGlhUnVsZSwNCisgIEZERV9DU1NTWU5UQVhNT0RFX1VSSSwNCisgIEZERV9DU1NTWU5UQVhNT0RFX01lZGlhVHlwZSwNCisgIEZERV9DU1NTWU5UQVhNT0RFX1NlbGVjdG9yLA0KKyAgRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlOYW1lLA0KKyAgRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlWYWx1ZSwNCit9Ow0KK2NsYXNzIENGREVfQ1NTU3ludGF4UGFyc2VyIDogcHVibGljIElGREVfQ1NTU3ludGF4UGFyc2VyLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQ1NTU3ludGF4UGFyc2VyKCk7DQorICB+Q0ZERV9DU1NTeW50YXhQYXJzZXIoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEluaXQoSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNTU1BsYW5lU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRleHREYXRhU2l6ZSA9IDMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seURlY2xhcmF0aW9uID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGWF9CT09MIEluaXQoY29uc3QgRlhfV0NIQVIqIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCdWZmZXJTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVGV4dERhdFNpemUgPSAzMiwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk9ubHlEZWNsYXJhdGlvbiA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRkRFX0NTU1NZTlRBWFNUQVRVUyBEb1N5bnRheFBhcnNlKCk7DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRDdXJyZW50U3RyaW5nKGludDMyX3QmIGlMZW5ndGgpIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIFJlc2V0KEZYX0JPT0wgYk9ubHlEZWNsYXJhdGlvbik7DQorICB2b2lkIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREUgZU1vZGUpOw0KKyAgaW50MzJfdCBTd2l0Y2hUb0NvbW1lbnQoKTsNCisNCisgIEZYX0JPT0wgUmVzdG9yZU1vZGUoKTsNCisgIEZYX0JPT0wgQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOw0KKyAgaW50MzJfdCBTYXZlVGV4dERhdGEoKTsNCisgIEZYX0JPT0wgSXNDaGFyc2V0RW5hYmxlZCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChtX2R3Q2hlY2sgJiBGREVfQ1NTU1lOVEFYQ0hFQ0tfQWxsb3dDaGFyc2V0KSAhPSAwOw0KKyAgfQ0KKyAgdm9pZCBEaXNhYmxlQ2hhcnNldCgpIHsgbV9kd0NoZWNrID0gRkRFX0NTU1NZTlRBWENIRUNLX0FsbG93SW1wb3J0OyB9DQorICBGWF9CT09MIElzSW1wb3J0RW5hYmxlZCgpIGNvbnN0Ow0KKyAgdm9pZCBEaXNhYmxlSW1wb3J0KCkgeyBtX2R3Q2hlY2sgPSAwOyB9DQorICBJRlhfU3RyZWFtKiBtX3BTdHJlYW07DQorICBpbnQzMl90IG1faVN0cmVhbVBvczsNCisgIGludDMyX3QgbV9pUGxhbmVTaXplOw0KKyAgQ0ZERV9DU1NUZXh0QnVmIG1fVGV4dERhdGE7DQorICBDRkRFX0NTU1RleHRCdWYgbV9UZXh0UGxhbmU7DQorICBpbnQzMl90IG1faVRleHREYXRMZW47DQorICBGWF9EV09SRCBtX2R3Q2hlY2s7DQorICBGREVfQ1NTU1lOVEFYTU9ERSBtX2VNb2RlOw0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVUyBtX2VTdGF0dXM7DQorICBDRlhfU3RhY2tUZW1wbGF0ZTxGREVfQ1NTU1lOVEFYTU9ERT4gbV9Nb2RlU3RhY2s7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9kZXZiYXNpYy5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9kZXZiYXNpYy5jcHAKaW5kZXggZjZlODkzZS4uNzhhMGZhNiAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZGV2YmFzaWMuY3BwCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2RldmJhc2ljLmNwcApAQCAtNyw2NCArNyw1NDAgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KICNpbmNsdWRlICJmZGVfZGV2YmFzaWMuaCINCiBzdGF0aWMgY29uc3QgRkRFX0hBVENIREFUQSBnc19IYXRjaEJpdG1hcERhdGFbRkRFX0hBVENIU1RZTEVfVG90YWxdID0gew0KLSAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDUxLCAweDUxLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDE1LCAweDE1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDUxLCAweDUxLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDE1LCAweDE1LCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGY3LCAweGY3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDdmLCAweDdmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGY3LCAweGY3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDdmLCAweDdmLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsIDB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDgzLCAweDgzLCAweDAwLCAweDAwLCAweDA3LCAweDA3LCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwLCAweDAwLCAweDFjLCAweDFjLCAweDAwLCAweDAwLCAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweGMxLCAweGMxLCAweDAwLCAweDAwLCAweDgzLCAweDgzLCAweDAwLCAweDAwLCAweDA3LCAweDA3LCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwLCAweDAwLCAweDFjLCAweDFjLCAweDAwLCAweDAwLCAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweGMxLCAweGMxLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGIxLCAweGIxLCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDAwLCAweDAwLCAweDFiLCAweDFiLCAweDAwLCAweDAwLCAweGQ4LCAweGQ4LCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDhkLCAweDhkLCAweDAwLCAweDAwLCAweGIxLCAweGIxLCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDAwLCAweDAwLCAweDFiLCAweDFiLCAweDAwLCAweDAwLCAweGQ4LCAweGQ4LCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDhkLCAweDhkLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NTQsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDUsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NTQsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDUsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHgwMywgMHgwMywgMHgwMCwgMHgwMCwgMHg4NCwgMHg4NCwgMHgwMCwgMHgwMCwgMHg0OCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHgwMCwgMHgwMCwgMHg4NCwgMHg4NCwgMHgwMCwgMHgwMCwgMHg0OCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDg5LCAweDg5LCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDk4LCAweDk4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDg5LCAweDg5LCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDk4LCAweDk4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgxLCAweDgxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDExLCAweDExLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1MSwgMHg1MSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDE1LCAweDE1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDE1LCAweDE1LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhlZSwgMHhlZSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGJiLCAweGJiLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGVlLCAweGVlLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhlZSwgMHhlZSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhiYiwgMHhiYiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGRkLCAweGRkLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhlZiwgMHhlZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZlLCAweGZlLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGVmLCAweGVmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhlZiwgMHhlZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmNywgMHhmNywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDdmLCAweDdmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZjcsIDB4ZjcsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDdmLCAweDdmLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDExLCAweDExLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHgxYywgMHgxYywgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA3LCAweDA3LCAweDAwLCAweDAwLCAweDgzLCAweDgzLCAweDAwLCAweDAwLCAweGMxLCAweGMxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxYywgMHgxYywgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwNywgMHgwNywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgzLCAweDgzLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxYywgMHgxYywgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweGMxLCAweGMxLCAweDAwLCAweDAwLCAweDgzLCAweDgzLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHhlMCwgMHhlMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGMxLCAweGMxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA0LCAweDA0LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YjEsIDB4YjEsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxYiwgMHgxYiwgMHgwMCwgMHgwMCwgMHhkOCwgMHhkOCwgMHgwMCwgMHgwMCwgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDhkLCAweDhkLCAweDAwLCAweDAwLCAweGIxLCAweGIxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MWIsIDB4MWIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhkOCwgMHhkOCwgMHgwMCwgMHgwMCwgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDhkLCAweDhkLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDE4LCAweDE4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDI1LCAweDI1LCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgyNSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGMwLCAweGMwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgxLCAweDgxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NTQsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0NSwgMHg0NSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgxNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDUxLCAweDUxLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTQsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDUxLCAweDUxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGYwLCAweGYwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ODQsIDB4ODQsIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODQsIDB4ODQsIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ODksIDB4ODksIDB4MDAsIDB4MDAsIDB4OGYsIDB4OGYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4ZiwgMHg4ZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHg5OCwgMHg5OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODksIDB4ODksIDB4MDAsIDB4MDAsIDB4OGYsIDB4OGYsIDB4MDAsIDB4MDAsIDB4OGYsIDB4OGYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHg5OCwgMHg5OCwgMHgwMCwgMHgwMCwgMHhmOCwgMHhmOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGY4LCAweGY4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDBmLCAweDBmLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODIsIDB4ODIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MjgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgyLCAweDgyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgyLCAweDgyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwgMHg3YywgMHg3YywgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg3YywgMHg3YywgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQogfTsNCi1GREVfTFBDSEFUQ0hEQVRBIEZERV9ERVZHZXRIYXRjaERhdGEoaW50MzJfdCBpSGF0Y2hTdHlsZSkNCi17DQotICAgIGlmIChpSGF0Y2hTdHlsZSA8IEZERV9IQVRDSFNUWUxFX01pbiB8fCBpSGF0Y2hTdHlsZSA+IEZERV9IQVRDSFNUWUxFX01heCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuICZnc19IYXRjaEJpdG1hcERhdGFbaUhhdGNoU3R5bGVdOw0KK0ZERV9MUENIQVRDSERBVEEgRkRFX0RFVkdldEhhdGNoRGF0YShpbnQzMl90IGlIYXRjaFN0eWxlKSB7DQorICBpZiAoaUhhdGNoU3R5bGUgPCBGREVfSEFUQ0hTVFlMRV9NaW4gfHwgaUhhdGNoU3R5bGUgPiBGREVfSEFUQ0hTVFlMRV9NYXgpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gJmdzX0hhdGNoQml0bWFwRGF0YVtpSGF0Y2hTdHlsZV07DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2RldmJhc2ljLmggYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9kZXZiYXNpYy5oCmluZGV4IGNhZjUyYTkuLjFhN2YxZTQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2RldmJhc2ljLmgKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZGV2YmFzaWMuaApAQCAtNywxMCArNywxMCBAQAogI2lmbmRlZiBfRkRFX0RFVklDRV9CQVNJQ19JTVANCiAjZGVmaW5lIF9GREVfREVWSUNFX0JBU0lDX0lNUA0KIHN0cnVjdCBGREVfSEFUQ0hEQVRBIHsNCi0gICAgaW50MzJfdAlpV2lkdGg7DQotICAgIGludDMyX3QJaUhlaWdodDsNCi0gICAgdWludDhfdAkJTWFza0JpdHNbNjRdOw0KKyAgaW50MzJfdCBpV2lkdGg7DQorICBpbnQzMl90IGlIZWlnaHQ7DQorICB1aW50OF90IE1hc2tCaXRzWzY0XTsNCiB9Ow0KLXR5cGVkZWYgRkRFX0hBVENIREFUQSBjb25zdCAqIEZERV9MUENIQVRDSERBVEE7DQordHlwZWRlZiBGREVfSEFUQ0hEQVRBIGNvbnN0KiBGREVfTFBDSEFUQ0hEQVRBOw0KIEZERV9MUENIQVRDSERBVEEgRkRFX0RFVkdldEhhdGNoRGF0YShpbnQzMl90IGlIYXRjaFN0eWxlKTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZGlkZXZpY2UuY3BwIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2RpZGV2aWNlLmNwcAppbmRleCAwM2JiYjIzLi4xMGE1MDg2IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZGlkZXZpY2UuY3BwCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dkaWRldmljZS5jcHAKQEAgLTgsNTQ4ICs4LDYyNCBAQAogI2luY2x1ZGUgImZkZV9nZGlkZXZpY2UuaCINCiAjaW5jbHVkZSAiZmRlX2dkaW9iamVjdC5oIg0KICNpZmRlZiBfRkRFUExVUw0KLSNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KLUlGREVfUmVuZGVyRGV2aWNlKglJRkRFX1JlbmRlckRldmljZTo6Q3JlYXRlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyICkNCi17DQotICAgIHJldHVybiBuZXcgQ0ZERV9HZGlEZXZpY2UocEJpdG1hcCk7DQorI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgXA0KKyAgICBfRlhfT1NfID09IF9GWF9XSU42NF8NCitJRkRFX1JlbmRlckRldmljZSogSUZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyKSB7DQorICByZXR1cm4gbmV3IENGREVfR2RpRGV2aWNlKHBCaXRtYXApOw0KIH0NCi1JRkRFX1JlbmRlckRldmljZSoJSUZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZShDRlhfUmVuZGVyRGV2aWNlICpwRGV2aWNlKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQorSUZERV9SZW5kZXJEZXZpY2UqIElGREVfUmVuZGVyRGV2aWNlOjpDcmVhdGUoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSkgew0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLUNGREVfR2RpRGV2aWNlOjpDRkRFX0dkaURldmljZShDRlhfRElCaXRtYXAgKnBCaXRtYXApDQotICAgIDogbV9kd0dseXBoTGVuKDApDQotICAgICwgbV9wR2x5cGhCdWYoTlVMTCkNCi0gICAgLCBtX3BHcmFwaGljcyhOVUxMKQ0KLSAgICAsIG1fcEJpdG1hcChOVUxMKQ0KLSAgICAsIG1fcENsaXBQYXRoKE5VTEwpDQotew0KLSAgICBGWFNZU19hc3NlcnQocEJpdG1hcCAhPSBOVUxMKTsNCi0gICAgQklUTUFQSU5GTyBibWk7DQotICAgIEZYU1lTX21lbXNldCgmYm1pLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOw0KLSAgICBibWkuYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsNCi0gICAgYm1pLmJtaUhlYWRlci5iaVdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsNCi0gICAgYm1pLmJtaUhlYWRlci5iaUhlaWdodCA9IC1wQml0bWFwLT5HZXRIZWlnaHQoKTsNCi0gICAgYm1pLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7DQotICAgIGJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IHBCaXRtYXAtPkdldEJQUCgpOw0KLSAgICBtX3BCaXRtYXAgPSBHZGlwbHVzOjpCaXRtYXA6OkZyb21CSVRNQVBJTkZPKCZibWksIHBCaXRtYXAtPkdldEJ1ZmZlcigpKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEJpdG1hcCAhPSBOVUxMKTsNCi0gICAgbV9wR3JhcGhpY3MgPSBHZGlwbHVzOjpHcmFwaGljczo6RnJvbUltYWdlKG1fcEJpdG1hcCk7DQotICAgIEZYU1lTX2Fzc2VydChtX3BHcmFwaGljcyAhPSBOVUxMKTsNCi0gICAgbV9ydENsaXBSZWN0LlNldCgwLCAwLCAoRlhfRkxPQVQpcEJpdG1hcC0+R2V0V2lkdGgoKSwgKEZYX0ZMT0FUKXBCaXRtYXAtPkdldEhlaWdodCgpKTsNCi0gICAgbV9wR3JhcGhpY3MtPlNldENsaXAoKGNvbnN0IEdkaXBsdXM6OlJlY3RGJiltX3J0Q2xpcFJlY3QpOw0KK0NGREVfR2RpRGV2aWNlOjpDRkRFX0dkaURldmljZShDRlhfRElCaXRtYXAqIHBCaXRtYXApDQorICAgIDogbV9kd0dseXBoTGVuKDApLA0KKyAgICAgIG1fcEdseXBoQnVmKE5VTEwpLA0KKyAgICAgIG1fcEdyYXBoaWNzKE5VTEwpLA0KKyAgICAgIG1fcEJpdG1hcChOVUxMKSwNCisgICAgICBtX3BDbGlwUGF0aChOVUxMKSB7DQorICBGWFNZU19hc3NlcnQocEJpdG1hcCAhPSBOVUxMKTsNCisgIEJJVE1BUElORk8gYm1pOw0KKyAgRlhTWVNfbWVtc2V0KCZibWksIDAsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7DQorICBibWkuYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsNCisgIGJtaS5ibWlIZWFkZXIuYmlXaWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7DQorICBibWkuYm1pSGVhZGVyLmJpSGVpZ2h0ID0gLXBCaXRtYXAtPkdldEhlaWdodCgpOw0KKyAgYm1pLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7DQorICBibWkuYm1pSGVhZGVyLmJpQml0Q291bnQgPSBwQml0bWFwLT5HZXRCUFAoKTsNCisgIG1fcEJpdG1hcCA9IEdkaXBsdXM6OkJpdG1hcDo6RnJvbUJJVE1BUElORk8oJmJtaSwgcEJpdG1hcC0+R2V0QnVmZmVyKCkpOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcEJpdG1hcCAhPSBOVUxMKTsNCisgIG1fcEdyYXBoaWNzID0gR2RpcGx1czo6R3JhcGhpY3M6OkZyb21JbWFnZShtX3BCaXRtYXApOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcEdyYXBoaWNzICE9IE5VTEwpOw0KKyAgbV9ydENsaXBSZWN0LlNldCgwLCAwLCAoRlhfRkxPQVQpcEJpdG1hcC0+R2V0V2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXBCaXRtYXAtPkdldEhlaWdodCgpKTsNCisgIG1fcEdyYXBoaWNzLT5TZXRDbGlwKChjb25zdCBHZGlwbHVzOjpSZWN0RiYpbV9ydENsaXBSZWN0KTsNCiB9DQotQ0ZERV9HZGlEZXZpY2U6On5DRkRFX0dkaURldmljZSgpDQotew0KLSAgICBkZWxldGUgbV9wR3JhcGhpY3M7DQotICAgIGRlbGV0ZSBtX3BCaXRtYXA7DQotICAgIGlmIChtX3BHbHlwaEJ1Zikgew0KLSAgICAgICAgRkRFX0ZyZWUobV9wR2x5cGhCdWYpOw0KLSAgICB9DQorQ0ZERV9HZGlEZXZpY2U6On5DRkRFX0dkaURldmljZSgpIHsNCisgIGRlbGV0ZSBtX3BHcmFwaGljczsNCisgIGRlbGV0ZSBtX3BCaXRtYXA7DQorICBpZiAobV9wR2x5cGhCdWYpIHsNCisgICAgRkRFX0ZyZWUobV9wR2x5cGhCdWYpOw0KKyAgfQ0KIH0NCi1pbnQzMl90IENGREVfR2RpRGV2aWNlOjpHZXRXaWR0aCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wQml0bWFwLT5HZXRXaWR0aCgpOw0KK2ludDMyX3QgQ0ZERV9HZGlEZXZpY2U6OkdldFdpZHRoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcEJpdG1hcC0+R2V0V2lkdGgoKTsNCiB9DQotaW50MzJfdCBDRkRFX0dkaURldmljZTo6R2V0SGVpZ2h0KCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3BCaXRtYXAtPkdldEhlaWdodCgpOw0KK2ludDMyX3QgQ0ZERV9HZGlEZXZpY2U6OkdldEhlaWdodCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BCaXRtYXAtPkdldEhlaWdodCgpOw0KIH0NCi1GREVfSERFVklDRVNUQVRFIENGREVfR2RpRGV2aWNlOjpTYXZlU3RhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIChGREVfSERFVklDRVNUQVRFKW1fcEdyYXBoaWNzLT5TYXZlKCk7DQorRkRFX0hERVZJQ0VTVEFURSBDRkRFX0dkaURldmljZTo6U2F2ZVN0YXRlKCkgew0KKyAgcmV0dXJuIChGREVfSERFVklDRVNUQVRFKW1fcEdyYXBoaWNzLT5TYXZlKCk7DQogfQ0KLXZvaWQgQ0ZERV9HZGlEZXZpY2U6OlJlc3RvcmVTdGF0ZShGREVfSERFVklDRVNUQVRFIGhTdGF0ZSkNCi17DQotICAgIEdkaXBsdXM6OlN0YXR1cyBlUmV0ID0gbV9wR3JhcGhpY3MtPlJlc3RvcmUoKEdkaXBsdXM6OkdyYXBoaWNzU3RhdGUpaFN0YXRlKTsNCit2b2lkIENGREVfR2RpRGV2aWNlOjpSZXN0b3JlU3RhdGUoRkRFX0hERVZJQ0VTVEFURSBoU3RhdGUpIHsNCisgIEdkaXBsdXM6OlN0YXR1cyBlUmV0ID0gbV9wR3JhcGhpY3MtPlJlc3RvcmUoKEdkaXBsdXM6OkdyYXBoaWNzU3RhdGUpaFN0YXRlKTsNCisgIGlmIChlUmV0ID09IEdkaXBsdXM6Ok9rKSB7DQorICAgIEdkaXBsdXM6OlJlY3QgcnQ7DQorICAgIGVSZXQgPSBtX3BHcmFwaGljcy0+R2V0Q2xpcEJvdW5kcygmcnQpOw0KICAgICBpZiAoZVJldCA9PSBHZGlwbHVzOjpPaykgew0KLSAgICAgICAgR2RpcGx1czo6UmVjdCBydDsNCi0gICAgICAgIGVSZXQgPSBtX3BHcmFwaGljcy0+R2V0Q2xpcEJvdW5kcygmcnQpOw0KLSAgICAgICAgaWYgKGVSZXQgPT0gR2RpcGx1czo6T2spIHsNCi0gICAgICAgICAgICBtX3J0Q2xpcFJlY3QuU2V0KChGWF9GTE9BVClydC5YLCAoRlhfRkxPQVQpcnQuWSwgKEZYX0ZMT0FUKXJ0LldpZHRoLCAoRlhfRkxPQVQpcnQuSGVpZ2h0KTsNCi0gICAgICAgIH0NCisgICAgICBtX3J0Q2xpcFJlY3QuU2V0KChGWF9GTE9BVClydC5YLCAoRlhfRkxPQVQpcnQuWSwgKEZYX0ZMT0FUKXJ0LldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXJ0LkhlaWdodCk7DQogICAgIH0NCisgIH0NCiB9DQotRlhfQk9PTCBDRkRFX0dkaURldmljZTo6U2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZydENsaXApDQotew0KLSAgICBtX3J0Q2xpcFJlY3QgPSBydENsaXA7DQotICAgIHJldHVybiBtX3BHcmFwaGljcy0+U2V0Q2xpcCgoY29uc3QgR2RpcGx1czo6UmVjdEYmKXJ0Q2xpcCkgPT0gR2RpcGx1czo6T2s7DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6U2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApIHsNCisgIG1fcnRDbGlwUmVjdCA9IHJ0Q2xpcDsNCisgIHJldHVybiBtX3BHcmFwaGljcy0+U2V0Q2xpcCgoY29uc3QgR2RpcGx1czo6UmVjdEYmKXJ0Q2xpcCkgPT0gR2RpcGx1czo6T2s7DQogfQ0KLWNvbnN0IENGWF9SZWN0RiYgQ0ZERV9HZGlEZXZpY2U6OkdldENsaXBSZWN0KCkNCi17DQotICAgIHJldHVybiBtX3J0Q2xpcFJlY3Q7DQorY29uc3QgQ0ZYX1JlY3RGJiBDRkRFX0dkaURldmljZTo6R2V0Q2xpcFJlY3QoKSB7DQorICByZXR1cm4gbV9ydENsaXBSZWN0Ow0KIH0NCi1GWF9CT09MIENGREVfR2RpRGV2aWNlOjpTZXRDbGlwUGF0aChjb25zdCBJRkRFX1BhdGggKnBDbGlwKQ0KLXsNCi0gICAgbV9wQ2xpcFBhdGggPSAoQ0ZERV9HZGlQYXRoKilwQ2xpcDsNCi0gICAgR2RpcGx1czo6R3JhcGhpY3NQYXRoICpwUGF0aCA9IG1fcENsaXBQYXRoID8gJm1fcENsaXBQYXRoLT5tX1BhdGggOiBOVUxMOw0KLSAgICByZXR1cm4gbV9wR3JhcGhpY3MtPlNldENsaXAocFBhdGgpID09IEdkaXBsdXM6Ok9rOw0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OlNldENsaXBQYXRoKGNvbnN0IElGREVfUGF0aCogcENsaXApIHsNCisgIG1fcENsaXBQYXRoID0gKENGREVfR2RpUGF0aCopcENsaXA7DQorICBHZGlwbHVzOjpHcmFwaGljc1BhdGgqIHBQYXRoID0gbV9wQ2xpcFBhdGggPyAmbV9wQ2xpcFBhdGgtPm1fUGF0aCA6IE5VTEw7DQorICByZXR1cm4gbV9wR3JhcGhpY3MtPlNldENsaXAocFBhdGgpID09IEdkaXBsdXM6Ok9rOw0KIH0NCi1JRkRFX1BhdGgqIENGREVfR2RpRGV2aWNlOjpHZXRDbGlwUGF0aCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wQ2xpcFBhdGg7DQorSUZERV9QYXRoKiBDRkRFX0dkaURldmljZTo6R2V0Q2xpcFBhdGgoKSBjb25zdCB7DQorICByZXR1cm4gbV9wQ2xpcFBhdGg7DQogfQ0KLUZYX0ZMT0FUIENGREVfR2RpRGV2aWNlOjpHZXREcGlYKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3BHcmFwaGljcy0+R2V0RHBpWCgpOw0KK0ZYX0ZMT0FUIENGREVfR2RpRGV2aWNlOjpHZXREcGlYKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcEdyYXBoaWNzLT5HZXREcGlYKCk7DQogfQ0KLUZYX0ZMT0FUIENGREVfR2RpRGV2aWNlOjpHZXREcGlZKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3BHcmFwaGljcy0+R2V0RHBpWSgpOw0KK0ZYX0ZMT0FUIENGREVfR2RpRGV2aWNlOjpHZXREcGlZKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcEdyYXBoaWNzLT5HZXREcGlZKCk7DQogfQ0KLUZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdJbWFnZShJRkRFX0ltYWdlICpwSW1nLCBjb25zdCBDRlhfUmVjdEYgKnBTcmNSZWN0LCBjb25zdCBDRlhfUmVjdEYgJmRzdFJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBJbWdNYXRyaXgsIGNvbnN0IENGWF9NYXRyaXggKnBEZXZNYXRyaXgpDQotew0KLSAgICBDRkRFX0dkaUltYWdlICpwR2RpSW1nID0gKENGREVfR2RpSW1hZ2UqKXBJbWc7DQotICAgIEZYU1lTX2Fzc2VydChwR2RpSW1nICE9IE5VTEwgJiYgcEdkaUltZy0+bV9wSW1hZ2UgIT0gTlVMTCk7DQotICAgIENGWF9SZWN0RiBzcmNSZWN0Ow0KLSAgICBpZiAocFNyY1JlY3QpIHsNCi0gICAgICAgIHNyY1JlY3QgPSAqcFNyY1JlY3Q7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBzcmNSZWN0LmxlZnQgPSBzcmNSZWN0LnRvcCA9IDA7DQotICAgICAgICBzcmNSZWN0LndpZHRoID0gKEZYX0ZMT0FUKXBJbWctPkdldEltYWdlV2lkdGgoKTsNCi0gICAgICAgIHNyY1JlY3QuaGVpZ2h0ID0gKEZYX0ZMT0FUKXBJbWctPkdldEltYWdlSGVpZ2h0KCk7DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd0ltYWdlKElGREVfSW1hZ2UqIHBJbWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFNyY1JlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgZHN0UmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEltZ01hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcERldk1hdHJpeCkgew0KKyAgQ0ZERV9HZGlJbWFnZSogcEdkaUltZyA9IChDRkRFX0dkaUltYWdlKilwSW1nOw0KKyAgRlhTWVNfYXNzZXJ0KHBHZGlJbWcgIT0gTlVMTCAmJiBwR2RpSW1nLT5tX3BJbWFnZSAhPSBOVUxMKTsNCisgIENGWF9SZWN0RiBzcmNSZWN0Ow0KKyAgaWYgKHBTcmNSZWN0KSB7DQorICAgIHNyY1JlY3QgPSAqcFNyY1JlY3Q7DQorICB9IGVsc2Ugew0KKyAgICBzcmNSZWN0LmxlZnQgPSBzcmNSZWN0LnRvcCA9IDA7DQorICAgIHNyY1JlY3Qud2lkdGggPSAoRlhfRkxPQVQpcEltZy0+R2V0SW1hZ2VXaWR0aCgpOw0KKyAgICBzcmNSZWN0LmhlaWdodCA9IChGWF9GTE9BVClwSW1nLT5HZXRJbWFnZUhlaWdodCgpOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtYXRyaXg7DQorICBpZiAocEltZ01hdHJpeCkgew0KKyAgICBtYXRyaXggPSAqcEltZ01hdHJpeDsNCisgIH0gZWxzZSB7DQorICAgIG1hdHJpeC5SZXNldCgpOw0KKyAgfQ0KKyAgbWF0cml4LlRyYW5zbGF0ZShkc3RSZWN0LmxlZnQsIGRzdFJlY3QudG9wKTsNCisgIG1hdHJpeC5TY2FsZSgoZHN0UmVjdC53aWR0aCAvIHNyY1JlY3Qud2lkdGgpLA0KKyAgICAgICAgICAgICAgIChkc3RSZWN0LmhlaWdodCAvIHNyY1JlY3QuaGVpZ2h0KSwgVFJVRSk7DQorICBpZiAocERldk1hdHJpeCkgew0KKyAgICBtYXRyaXguQ29uY2F0KCpwRGV2TWF0cml4KTsNCisgIH0NCisgIENGWF9Qb2ludEYgZHN0UG9pbnRzWzNdOw0KKyAgZHN0UG9pbnRzWzBdLlNldCgwLCAwKTsNCisgIGRzdFBvaW50c1sxXS5TZXQoc3JjUmVjdC53aWR0aCwgMCk7DQorICBkc3RQb2ludHNbMl0uU2V0KDAsIHNyY1JlY3QuaGVpZ2h0KTsNCisgIG1hdHJpeC5UcmFuc2Zvcm1Qb2ludHMoZHN0UG9pbnRzLCAzKTsNCisgIG1fcEdyYXBoaWNzLT5EcmF3SW1hZ2UocEdkaUltZy0+bV9wSW1hZ2UsIChHZGlwbHVzOjpQb2ludEYqKWRzdFBvaW50cywgMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVjdC5sZWZ0LCBzcmNSZWN0LnRvcCwgc3JjUmVjdC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVjdC5oZWlnaHQsIEdkaXBsdXM6OlVuaXRQaXhlbCwgTlVMTCwgTlVMTCwgTlVMTCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd0ltYWdlKENGWF9ESUJTb3VyY2UqIHBEaWIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFNyY1JlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgZHN0UmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEltZ01hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcERldk1hdHJpeCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBEaWIgIT0gTlVMTCk7DQorICBCSVRNQVBJTkZPIGJtaTsNCisgIEZYU1lTX21lbXNldCgmYm1pLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOw0KKyAgYm1pLmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7DQorICBibWkuYm1pSGVhZGVyLmJpV2lkdGggPSBwRGliLT5HZXRXaWR0aCgpOw0KKyAgYm1pLmJtaUhlYWRlci5iaUhlaWdodCA9IHBEaWItPkdldEhlaWdodCgpOw0KKyAgYm1pLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7DQorICBibWkuYm1pSGVhZGVyLmJpQml0Q291bnQgPSBwRGliLT5HZXRCUFAoKTsNCisgIEdkaXBsdXM6OkJpdG1hcCBibXAoJmJtaSwgcERpYi0+R2V0QnVmZmVyKCkpOw0KKyAgQ0ZERV9HZGlJbWFnZSBpbWcoJmJtcCk7DQorICByZXR1cm4gRHJhd0ltYWdlKCZpbWcsIHBTcmNSZWN0LCBkc3RSZWN0LCBwSW1nTWF0cml4LCBwRGV2TWF0cml4KTsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd1N0cmluZyhJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udCogcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYU1lTX2Fzc2VydChwQnJ1c2ggIT0gTlVMTCAmJiBwRm9udCAhPSBOVUxMICYmIHBDaGFyUG9zICE9IE5VTEwpOw0KKyAgRlhfQVJHQiBhcmdiID0gMHhGRjAwMDAwMDsNCisgIGlmIChwQnJ1c2gtPkdldFR5cGUoKSA9PSBGREVfQlJVU0hUWVBFX1NvbGlkKSB7DQorICAgIGFyZ2IgPSAoKElGREVfU29saWRCcnVzaCopcEJydXNoKS0+R2V0Q29sb3IoKTsNCisgIH0NCisgIENGREVfR2RpRm9udCogcEdkaUZvbnQgPSAoQ0ZERV9HZGlGb250KilwRm9udDsNCisgIEdMWVBITUVUUklDUyBnbTsNCisgIE1BVDIgbWF0MjsNCisgIEZYX0ZMT0FUIGZTY2FsZSA9IGZGb250U2l6ZSAvIDEwMDAuMGY7DQorICBGWF9GTE9BVCBtYSwgbWIsIG1jLCBtZDsNCisgIEZYX0ZMT0FUIGZ4LCBmeTsNCisgIHdoaWxlICgtLWlDb3VudCA+PSAwKSB7DQorICAgIG1iID0gbWMgPSAwOw0KKyAgICBtYSA9IG1kID0gZlNjYWxlOw0KKyAgICBpZiAocENoYXJQb3MtPm1fYkdseXBoQWRqdXN0KSB7DQorICAgICAgRlhfRkxPQVQgYWEgPQ0KKyAgICAgICAgICBtYSAqIC1wQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gKyBtYiAqIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXTsNCisgICAgICBGWF9GTE9BVCBiYiA9DQorICAgICAgICAgIC1tYSAqIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSArIG1iICogcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdOw0KKyAgICAgIEZYX0ZMT0FUIGNjID0NCisgICAgICAgICAgbWMgKiAtcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdICsgbWQgKiBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl07DQorICAgICAgRlhfRkxPQVQgZGQgPQ0KKyAgICAgICAgICAtbWMgKiBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gKyBtZCAqIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXTsNCisgICAgICBtYSA9IGFhOw0KKyAgICAgIG1iID0gYmI7DQorICAgICAgbWMgPSBjYzsNCisgICAgICBtZCA9IGRkOw0KICAgICB9DQotICAgIENGWF9NYXRyaXggbWF0cml4Ow0KLSAgICBpZiAocEltZ01hdHJpeCkgew0KLSAgICAgICAgbWF0cml4ID0gKnBJbWdNYXRyaXg7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtYXRyaXguUmVzZXQoKTsNCi0gICAgfQ0KLSAgICBtYXRyaXguVHJhbnNsYXRlKGRzdFJlY3QubGVmdCwgZHN0UmVjdC50b3ApOw0KLSAgICBtYXRyaXguU2NhbGUoKGRzdFJlY3Qud2lkdGggLyBzcmNSZWN0LndpZHRoKSwgKGRzdFJlY3QuaGVpZ2h0IC8gc3JjUmVjdC5oZWlnaHQpLCBUUlVFKTsNCi0gICAgaWYgKHBEZXZNYXRyaXgpIHsNCi0gICAgICAgIG1hdHJpeC5Db25jYXQoKnBEZXZNYXRyaXgpOw0KLSAgICB9DQotICAgIENGWF9Qb2ludEYgZHN0UG9pbnRzWzNdOw0KLSAgICBkc3RQb2ludHNbMF0uU2V0KDAsIDApOw0KLSAgICBkc3RQb2ludHNbMV0uU2V0KHNyY1JlY3Qud2lkdGgsIDApOw0KLSAgICBkc3RQb2ludHNbMl0uU2V0KDAsIHNyY1JlY3QuaGVpZ2h0KTsNCi0gICAgbWF0cml4LlRyYW5zZm9ybVBvaW50cyhkc3RQb2ludHMsIDMpOw0KLSAgICBtX3BHcmFwaGljcy0+RHJhd0ltYWdlKHBHZGlJbWctPm1fcEltYWdlLCAoR2RpcGx1czo6UG9pbnRGKilkc3RQb2ludHMsIDMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVjdC5sZWZ0LCBzcmNSZWN0LnRvcCwgc3JjUmVjdC53aWR0aCwgc3JjUmVjdC5oZWlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgR2RpcGx1czo6VW5pdFBpeGVsLCBOVUxMLCBOVUxMLCBOVUxMKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdJbWFnZShDRlhfRElCU291cmNlICpwRGliLCBjb25zdCBDRlhfUmVjdEYgKnBTcmNSZWN0LCBjb25zdCBDRlhfUmVjdEYgJmRzdFJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBJbWdNYXRyaXgsIGNvbnN0IENGWF9NYXRyaXggKnBEZXZNYXRyaXgpDQotew0KLSAgICBGWFNZU19hc3NlcnQocERpYiAhPSBOVUxMKTsNCi0gICAgQklUTUFQSU5GTyBibWk7DQotICAgIEZYU1lTX21lbXNldCgmYm1pLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOw0KLSAgICBibWkuYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsNCi0gICAgYm1pLmJtaUhlYWRlci5iaVdpZHRoID0gcERpYi0+R2V0V2lkdGgoKTsNCi0gICAgYm1pLmJtaUhlYWRlci5iaUhlaWdodCA9IHBEaWItPkdldEhlaWdodCgpOw0KLSAgICBibWkuYm1pSGVhZGVyLmJpUGxhbmVzID0gMTsNCi0gICAgYm1pLmJtaUhlYWRlci5iaUJpdENvdW50ID0gcERpYi0+R2V0QlBQKCk7DQotICAgIEdkaXBsdXM6OkJpdG1hcCBibXAoJmJtaSwgcERpYi0+R2V0QnVmZmVyKCkpOw0KLSAgICBDRkRFX0dkaUltYWdlIGltZygmYm1wKTsNCi0gICAgcmV0dXJuIERyYXdJbWFnZSgmaW1nLCBwU3JjUmVjdCwgZHN0UmVjdCwgcEltZ01hdHJpeCwgcERldk1hdHJpeCk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdTdHJpbmcoSUZERV9CcnVzaCAqcEJydXNoLCBJRlhfRm9udCAqcEZvbnQsIGNvbnN0IEZYVEVYVF9DSEFSUE9TICpwQ2hhclBvcywgaW50MzJfdCBpQ291bnQsIEZYX0ZMT0FUIGZGb250U2l6ZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwQnJ1c2ggIT0gTlVMTCAmJiBwRm9udCAhPSBOVUxMICYmIHBDaGFyUG9zICE9IE5VTEwpOw0KLSAgICBGWF9BUkdCIGFyZ2IgPSAweEZGMDAwMDAwOw0KLSAgICBpZiAocEJydXNoLT5HZXRUeXBlKCkgPT0gRkRFX0JSVVNIVFlQRV9Tb2xpZCkgew0KLSAgICAgICAgYXJnYiA9ICgoSUZERV9Tb2xpZEJydXNoKilwQnJ1c2gpLT5HZXRDb2xvcigpOw0KLSAgICB9DQotICAgIENGREVfR2RpRm9udCAqcEdkaUZvbnQgPSAoQ0ZERV9HZGlGb250KilwRm9udDsNCi0gICAgR0xZUEhNRVRSSUNTIGdtOw0KLSAgICBNQVQyIG1hdDI7DQotICAgIEZYX0ZMT0FUIGZTY2FsZSA9IGZGb250U2l6ZSAvIDEwMDAuMGY7DQotICAgIEZYX0ZMT0FUIG1hLCBtYiwgbWMsIG1kOw0KLSAgICBGWF9GTE9BVCBmeCwgZnk7DQotICAgIHdoaWxlICgtLWlDb3VudCA+PSAwKSB7DQotICAgICAgICBtYiA9IG1jID0gMDsNCi0gICAgICAgIG1hID0gbWQgPSBmU2NhbGU7DQotICAgICAgICBpZiAocENoYXJQb3MtPm1fYkdseXBoQWRqdXN0KSB7DQotICAgICAgICAgICAgRlhfRkxPQVQgYWEgPSBtYSAqIC1wQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gKyBtYiAqIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXTsNCi0gICAgICAgICAgICBGWF9GTE9BVCBiYiA9IC1tYSAqIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSArIG1iICogcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGNjID0gbWMgKiAtcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdICsgbWQgKiBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl07DQotICAgICAgICAgICAgRlhfRkxPQVQgZGQgPSAtbWMgKiBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gKyBtZCAqIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXTsNCi0gICAgICAgICAgICBtYSA9IGFhOw0KLSAgICAgICAgICAgIG1iID0gYmI7DQotICAgICAgICAgICAgbWMgPSBjYzsNCi0gICAgICAgICAgICBtZCA9IGRkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgICAgICBGWF9GTE9BVCBhYSA9IG1hICogcE1hdHJpeC0+YSArIG1iICogcE1hdHJpeC0+YzsNCi0gICAgICAgICAgICBGWF9GTE9BVCBiYiA9IG1hICogcE1hdHJpeC0+YiArIG1iICogcE1hdHJpeC0+ZDsNCi0gICAgICAgICAgICBGWF9GTE9BVCBjYyA9IG1jICogcE1hdHJpeC0+YSArIG1kICogcE1hdHJpeC0+YzsNCi0gICAgICAgICAgICBGWF9GTE9BVCBkZCA9IG1jICogcE1hdHJpeC0+YiArIG1kICogcE1hdHJpeC0+ZDsNCi0gICAgICAgICAgICBtYSA9IGFhOw0KLSAgICAgICAgICAgIG1iID0gYmI7DQotICAgICAgICAgICAgbWMgPSBjYzsNCi0gICAgICAgICAgICBtZCA9IGRkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgKihsb25nKikoJm1hdDIuZU0xMSkgPSAobG9uZykobWEgKiA2NTUzNik7DQotICAgICAgICAqKGxvbmcqKSgmbWF0Mi5lTTIxKSA9IChsb25nKShtYiAqIDY1NTM2KTsNCi0gICAgICAgICoobG9uZyopKCZtYXQyLmVNMTIpID0gKGxvbmcpKG1jICogNjU1MzYpOw0KLSAgICAgICAgKihsb25nKikoJm1hdDIuZU0yMikgPSAobG9uZykobWQgKiA2NTUzNik7DQotICAgICAgICBGWF9EV09SRCBkd1NpemUgPSBwR2RpRm9udC0+R2V0R2x5cGhESUJpdHMocENoYXJQb3MtPm1fR2x5cGhJbmRleCwgYXJnYiwgJm1hdDIsIGdtLCBOVUxMLCAwKTsNCi0gICAgICAgIGlmIChkd1NpemUgPiAwKSB7DQotICAgICAgICAgICAgaWYgKG1fcEdseXBoQnVmID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgbV9wR2x5cGhCdWYgPSBGREVfQWxsb2MoZHdTaXplKTsNCi0gICAgICAgICAgICAgICAgbV9kd0dseXBoTGVuID0gZHdTaXplOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9kd0dseXBoTGVuIDwgZHdTaXplKSB7DQotICAgICAgICAgICAgICAgIG1fcEdseXBoQnVmID0gRkRFX1JlYWxsb2MobV9wR2x5cGhCdWYsIGR3U2l6ZSk7DQotICAgICAgICAgICAgICAgIG1fZHdHbHlwaExlbiA9IGR3U2l6ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcEdkaUZvbnQtPkdldEdseXBoRElCaXRzKHBDaGFyUG9zLT5tX0dseXBoSW5kZXgsIGFyZ2IsICZtYXQyLCBnbSwgbV9wR2x5cGhCdWYsIG1fZHdHbHlwaExlbik7DQotICAgICAgICAgICAgR2RpcGx1czo6Qml0bWFwIGJtcChnbS5nbUJsYWNrQm94WCwgZ20uZ21CbGFja0JveFksIGdtLmdtQmxhY2tCb3hYICogNCwgUGl4ZWxGb3JtYXQzMmJwcEFSR0IsIG1fcEdseXBoQnVmKTsNCi0gICAgICAgICAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgICAgICAgICBmeCA9IHBNYXRyaXgtPmEgKiBwQ2hhclBvcy0+bV9PcmlnaW5YICsgcE1hdHJpeC0+YyAqIHBDaGFyUG9zLT5tX09yaWdpblkgKyBwTWF0cml4LT5lOw0KLSAgICAgICAgICAgICAgICBmeSA9IHBNYXRyaXgtPmIgKiBwQ2hhclBvcy0+bV9PcmlnaW5YICsgcE1hdHJpeC0+ZCAqIHBDaGFyUG9zLT5tX09yaWdpblkgKyBwTWF0cml4LT5mOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGZ4ID0gcENoYXJQb3MtPm1fT3JpZ2luWDsNCi0gICAgICAgICAgICAgICAgZnkgPSBwQ2hhclBvcy0+bV9PcmlnaW5ZOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX3BHcmFwaGljcy0+RHJhd0ltYWdlKCZibXAsIChGWFNZU19yb3VuZChmeCkgKyBnbS5nbXB0R2x5cGhPcmlnaW4ueCksIChGWFNZU19yb3VuZChmeSkgLSBnbS5nbXB0R2x5cGhPcmlnaW4ueSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcENoYXJQb3MrKzsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd0FyYyhJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgc3RhcnRBbmdsZSA9IEZYX1JBRDJERUcoc3RhcnRBbmdsZSk7DQotICAgIHN3ZWVwQW5nbGUgPSBGWF9SQUQyREVHKHN3ZWVwQW5nbGUpOw0KLSAgICBHZGlwbHVzOjpQZW4gKnBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCi0gICAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KLSAgICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkRyYXdBcmMocEdkaVBlbiwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUpOw0KLSAgICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KLSAgICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KLSAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KLX0NCi1GWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3QmV6aWVyKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludEYgJnB0MSwgY29uc3QgQ0ZYX1BvaW50RiAmcHQyLCBjb25zdCBDRlhfUG9pbnRGICZwdDMsIGNvbnN0IENGWF9Qb2ludEYgJnB0NCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBHZGlwbHVzOjpQZW4gKnBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCi0gICAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KLSAgICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkRyYXdCZXppZXIocEdkaVBlbiwgcHQxLngsIHB0MS55LCBwdDIueCwgcHQyLnksIHB0My54LCBwdDMueSwgcHQ0LngsIHB0NC55KTsNCi0gICAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCi0gICAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCi0gICAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCi19DQotRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd0N1cnZlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIEZYX0JPT0wgYkNsb3NlZCwgRlhfRkxPQVQgZlRlbnNpb24gLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIEdkaXBsdXM6OlBlbiAqcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KLSAgICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQotICAgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBiQ2xvc2VkDQotICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fcEdyYXBoaWNzLT5EcmF3Q2xvc2VkQ3VydmUocEdkaVBlbiwgKGNvbnN0IEdkaXBsdXM6OlBvaW50RiopcG9pbnRzLkdldERhdGEoKSwgcG9pbnRzLkdldFNpemUoKSwgZlRlbnNpb24pDQotICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fcEdyYXBoaWNzLT5EcmF3Q3VydmUocEdkaVBlbiwgKGNvbnN0IEdkaXBsdXM6OlBvaW50RiopcG9pbnRzLkdldERhdGEoKSwgcG9pbnRzLkdldFNpemUoKSwgZlRlbnNpb24pOw0KLSAgICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KLSAgICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KLSAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KLX0NCi1GWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3RWxsaXBzZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgR2RpcGx1czo6UGVuICpwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQotICAgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCi0gICAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5EcmF3RWxsaXBzZShwR2RpUGVuLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQotICAgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQotICAgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQotICAgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQotfQ0KLUZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdMaW5lcyhJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIEdkaXBsdXM6OlBlbiAqcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KLSAgICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQotICAgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RHJhd0xpbmVzKHBHZGlQZW4sIChjb25zdCBHZGlwbHVzOjpQb2ludEYqKXBvaW50cy5HZXREYXRhKCksIHBvaW50cy5HZXRTaXplKCkpOw0KLSAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCi0gICAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCi0gICAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCi19DQotRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd0xpbmUoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50RiAmcHQxLCBjb25zdCBDRlhfUG9pbnRGICZwdDIsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgR2RpcGx1czo6UGVuICpwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQotICAgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCi0gICAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5EcmF3TGluZShwR2RpUGVuLCBwdDEueCwgcHQxLnksIHB0Mi54LCBwdDIueSk7DQotICAgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQotICAgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQotICAgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQotfQ0KLUZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdQYXRoKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IElGREVfUGF0aCAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZERV9HZGlQYXRoICpwR2RpUGF0aCA9IChDRkRFX0dkaVBhdGgqKXBQYXRoOw0KLSAgICBpZiAocEdkaVBhdGggPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEdkaXBsdXM6OlBlbiAqcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KLSAgICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQotICAgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RHJhd1BhdGgocEdkaVBlbiwgJnBHZGlQYXRoLT5tX1BhdGgpOw0KLSAgICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KLSAgICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KLSAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KLX0NCi1GWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3UGllKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgRlhfRkxPQVQgc3RhcnRBbmdsZSwgRlhfRkxPQVQgc3dlZXBBbmdsZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBzdGFydEFuZ2xlID0gRlhfUkFEMkRFRyhzdGFydEFuZ2xlKTsNCi0gICAgc3dlZXBBbmdsZSA9IEZYX1JBRDJERUcoc3dlZXBBbmdsZSk7DQotICAgIEdkaXBsdXM6OlBlbiAqcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KLSAgICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQotICAgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RHJhd1BpZShwR2RpUGVuLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7DQotICAgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQotICAgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQotICAgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQotfQ0KLUZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdDaG9yZChJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZYX0FyY0YgY2hvcmQ7DQotICAgIGNob3JkLlNldChyZWN0LCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsNCi0gICAgQ0ZERV9HZGlQYXRoIHBhdGg7DQotICAgIHBhdGguQWRkQ2hvcmQoY2hvcmQpOw0KLSAgICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdQb2x5Z29uKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgR2RpcGx1czo6UGVuICpwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQotICAgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCi0gICAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5EcmF3UG9seWdvbihwR2RpUGVuLCAoY29uc3QgR2RpcGx1czo6UG9pbnRGKilwb2ludHMuR2V0RGF0YSgpLCBwb2ludHMuR2V0U2l6ZSgpKTsNCi0gICAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCi0gICAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCi0gICAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCi19DQotRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd1JlY3RhbmdsZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgR2RpcGx1czo6UGVuICpwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQotICAgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCi0gICAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5EcmF3UmVjdGFuZ2xlKHBHZGlQZW4sIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCi0gICAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCi0gICAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCi0gICAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCi19DQotRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd1JvdW5kUmVjdGFuZ2xlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX1NpemVGICZyb3VuZCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBDRkRFX0dkaVBhdGggcGF0aDsNCi0gICAgcGF0aC5BZGRSb3VuZFJlY3RhbmdsZShyZWN0LCByb3VuZCk7DQotICAgIHJldHVybiBEcmF3UGF0aChwUGVuLCBmUGVuV2lkdGgsICZwYXRoLCBwTWF0cml4KTsNCi19DQotRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RmlsbENsb3NlZEN1cnZlKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgRlhfRkxPQVQgZlRlbnNpb24gLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIEdkaXBsdXM6OkJydXNoICpwR2RpQnJ1c2ggPSBDcmVhdGVHZGlCcnVzaChwQnJ1c2gpOw0KLSAgICBpZiAocEdkaUJydXNoID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBBcHBseU1hdHJpeChwTWF0cml4KTsNCi0gICAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5GaWxsQ2xvc2VkQ3VydmUocEdkaUJydXNoLCAoY29uc3QgR2RpcGx1czo6UG9pbnRGKilwb2ludHMuR2V0RGF0YSgpLCBwb2ludHMuR2V0U2l6ZSgpLCBHZGlwbHVzOjpGaWxsTW9kZUFsdGVybmF0ZSwgZlRlbnNpb24pOw0KLSAgICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KLSAgICBSZWxlYXNlR2RpQnJ1c2gocEdkaUJydXNoKTsNCi0gICAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCi19DQotRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RmlsbEVsbGlwc2UoSUZERV9CcnVzaCogcEJydXNoLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgR2RpcGx1czo6QnJ1c2ggKnBHZGlCcnVzaCA9IENyZWF0ZUdkaUJydXNoKHBCcnVzaCk7DQotICAgIGlmIChwR2RpQnJ1c2ggPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KLSAgICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkZpbGxFbGxpcHNlKHBHZGlCcnVzaCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOw0KLSAgICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KLSAgICBSZWxlYXNlR2RpQnJ1c2gocEdkaUJydXNoKTsNCi0gICAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCi19DQotRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RmlsbFBhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBJRkRFX1BhdGggKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIENGREVfR2RpUGF0aCAqcEdkaVBhdGggPSAoQ0ZERV9HZGlQYXRoKilwUGF0aDsNCi0gICAgaWYgKHBHZGlQYXRoID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBHZGlwbHVzOjpCcnVzaCAqcEdkaUJydXNoID0gQ3JlYXRlR2RpQnJ1c2gocEJydXNoKTsNCi0gICAgaWYgKHBHZGlCcnVzaCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQotICAgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RmlsbFBhdGgocEdkaUJydXNoLCAmcEdkaVBhdGgtPm1fUGF0aCk7DQotICAgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQotICAgIFJlbGVhc2VHZGlCcnVzaChwR2RpQnJ1c2gpOw0KLSAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KLX0NCi1GWF9CT09MIENGREVfR2RpRGV2aWNlOjpGaWxsUGllKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBGWF9GTE9BVCBzdGFydEFuZ2xlLCBGWF9GTE9BVCBzd2VlcEFuZ2xlLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIHN0YXJ0QW5nbGUgPSBGWF9SQUQyREVHKHN0YXJ0QW5nbGUpOw0KLSAgICBzd2VlcEFuZ2xlID0gRlhfUkFEMkRFRyhzd2VlcEFuZ2xlKTsNCi0gICAgR2RpcGx1czo6QnJ1c2ggKnBHZGlCcnVzaCA9IENyZWF0ZUdkaUJydXNoKHBCcnVzaCk7DQotICAgIGlmIChwR2RpQnJ1c2ggPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KLSAgICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkZpbGxQaWUocEdkaUJydXNoLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7DQotICAgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQotICAgIFJlbGVhc2VHZGlCcnVzaChwR2RpQnJ1c2gpOw0KLSAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KLX0NCi1GWF9CT09MIENGREVfR2RpRGV2aWNlOjpGaWxsQ2hvcmQoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZYX0FyY0YgY2hvcmQ7DQotICAgIGNob3JkLlNldChyZWN0LCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsNCi0gICAgQ0ZERV9HZGlQYXRoIHBhdGg7DQotICAgIHBhdGguQWRkQ2hvcmQoY2hvcmQpOw0KLSAgICByZXR1cm4gRmlsbFBhdGgocEJydXNoLCAmcGF0aCwgcE1hdHJpeCk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxQb2x5Z29uKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBHZGlwbHVzOjpCcnVzaCAqcEdkaUJydXNoID0gQ3JlYXRlR2RpQnJ1c2gocEJydXNoKTsNCi0gICAgaWYgKHBHZGlCcnVzaCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQotICAgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RmlsbFBvbHlnb24ocEdkaUJydXNoLCAoY29uc3QgR2RpcGx1czo6UG9pbnRGKilwb2ludHMuR2V0RGF0YSgpLCBwb2ludHMuR2V0U2l6ZSgpKTsNCi0gICAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCi0gICAgUmVsZWFzZUdkaUJydXNoKHBHZGlCcnVzaCk7DQotICAgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQotfQ0KLUZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxSZWN0YW5nbGUoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgR2RpcGx1czo6QnJ1c2ggKnBHZGlCcnVzaCA9IENyZWF0ZUdkaUJydXNoKHBCcnVzaCk7DQotICAgIGlmIChwR2RpQnJ1c2ggPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KLSAgICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkZpbGxSZWN0YW5nbGUocEdkaUJydXNoLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQotICAgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQotICAgIFJlbGVhc2VHZGlCcnVzaChwR2RpQnJ1c2gpOw0KLSAgICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KLX0NCi1GWF9CT09MIENGREVfR2RpRGV2aWNlOjpGaWxsUm91bmRSZWN0YW5nbGUoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9TaXplRiAmcm91bmQsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZERV9HZGlQYXRoIHBhdGg7DQotICAgIHBhdGguQWRkUm91bmRSZWN0YW5nbGUocmVjdCwgcm91bmQpOw0KLSAgICByZXR1cm4gRmlsbFBhdGgocEJydXNoLCAmcGF0aCwgcE1hdHJpeCk7DQotfQ0KLUdkaXBsdXM6OlBlbiogQ0ZERV9HZGlEZXZpY2U6OkNyZWF0ZUdkaVBlbihJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoKQ0KLXsNCi0gICAgaWYgKHBQZW4gPT0gTlVMTCB8fCBmUGVuV2lkdGggPCAwLjAxZikgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgR2RpcGx1czo6UGVuICpwR2RpUGVuID0gTlVMTDsNCi0gICAgc3dpdGNoIChwUGVuLT5HZXRUeXBlKCkpIHsNCi0gICAgICAgIGNhc2UgRkRFX1BFTlRZUEVfU29saWRDb2xvcjogew0KLSAgICAgICAgICAgICAgICBHZGlwbHVzOjpDb2xvciBnZGlDb2xvcigoR2RpcGx1czo6QVJHQilwUGVuLT5HZXRDb2xvcigpKTsNCi0gICAgICAgICAgICAgICAgcEdkaVBlbiA9IG5ldyBHZGlwbHVzOjpQZW4oZ2RpQ29sb3IsIGZQZW5XaWR0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGREVfUEVOVFlQRV9IYXRjaEJydXNoOg0KLSAgICAgICAgY2FzZSBGREVfUEVOVFlQRV9UZXh0dXJlQnJ1c2g6DQotICAgICAgICBjYXNlIEZERV9QRU5UWVBFX0xpbmVhckdyYWRpZW50OiB7DQotICAgICAgICAgICAgICAgIEdkaXBsdXM6OkJydXNoICpwR2RpQnJ1c2ggPSBDcmVhdGVHZGlCcnVzaChwUGVuLT5HZXRCcnVzaCgpKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBHZGlCcnVzaCkgew0KLSAgICAgICAgICAgICAgICAgICAgcEdkaVBlbiA9IG5ldyBHZGlwbHVzOjpQZW4ocEdkaUJydXNoLCBmUGVuV2lkdGgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGlmIChwR2RpUGVuKSB7DQotICAgICAgICBDRlhfRmxvYXRBcnJheSBkYXNoQXJyYXk7DQotICAgICAgICBwUGVuLT5HZXREYXNoQXJyYXkoZGFzaEFycmF5KTsNCi0gICAgICAgIHBHZGlQZW4tPlNldERhc2hQYXR0ZXJuKGRhc2hBcnJheS5HZXREYXRhKCksIGRhc2hBcnJheS5HZXRTaXplKCkpOw0KLSAgICAgICAgcEdkaVBlbi0+U2V0RGFzaE9mZnNldChwUGVuLT5HZXREYXNoUGhhc2UoKSk7DQotICAgICAgICBwR2RpUGVuLT5TZXREYXNoU3R5bGUoKEdkaXBsdXM6OkRhc2hTdHlsZSlwUGVuLT5HZXREYXNoU3R5bGUoKSk7DQotICAgICAgICBwR2RpUGVuLT5TZXRTdGFydENhcCgoR2RpcGx1czo6TGluZUNhcClwUGVuLT5HZXRMaW5lQ2FwKCkpOw0KLSAgICAgICAgcEdkaVBlbi0+U2V0RW5kQ2FwKChHZGlwbHVzOjpMaW5lQ2FwKXBQZW4tPkdldExpbmVDYXAoKSk7DQotICAgICAgICBwR2RpUGVuLT5TZXRMaW5lSm9pbigoR2RpcGx1czo6TGluZUpvaW4pcFBlbi0+R2V0TGluZUpvaW4oKSk7DQotICAgICAgICBwR2RpUGVuLT5TZXRNaXRlckxpbWl0KHBQZW4tPkdldE1pdGVyTGltaXQoKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBHZGlQZW47DQotfQ0KLXZvaWQgQ0ZERV9HZGlEZXZpY2U6OlJlbGVhc2VHZGlQZW4oR2RpcGx1czo6UGVuICpwR2RpUGVuKQ0KLXsNCi0gICAgaWYgKHBHZGlQZW4pIHsNCi0gICAgICAgIFJlbGVhc2VHZGlCcnVzaChwR2RpUGVuLT5HZXRCcnVzaCgpKTsNCi0gICAgICAgIGRlbGV0ZSBwR2RpUGVuOw0KLSAgICB9DQotfQ0KLUdkaXBsdXM6OkJydXNoKiBDRkRFX0dkaURldmljZTo6Q3JlYXRlR2RpQnJ1c2goSUZERV9CcnVzaCAqcEJydXNoKQ0KLXsNCi0gICAgaWYgKHBCcnVzaCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBHZGlwbHVzOjpCcnVzaCAqcEdkaUJydXNoID0gTlVMTDsNCi0gICAgc3dpdGNoIChwQnJ1c2gtPkdldFR5cGUoKSkgew0KLSAgICAgICAgY2FzZSBGREVfQlJVU0hUWVBFX1NvbGlkOiB7DQotICAgICAgICAgICAgICAgIElGREVfU29saWRCcnVzaCAqcFNvbGlkQnJ1c2ggPSAoSUZERV9Tb2xpZEJydXNoKilwQnJ1c2g7DQotICAgICAgICAgICAgICAgIEdkaXBsdXM6OkNvbG9yIGdkaUNvbG9yKChHZGlwbHVzOjpBUkdCKXBTb2xpZEJydXNoLT5HZXRDb2xvcigpKTsNCi0gICAgICAgICAgICAgICAgcEdkaUJydXNoID0gbmV3IEdkaXBsdXM6OlNvbGlkQnJ1c2goZ2RpQ29sb3IpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRkRFX0JSVVNIVFlQRV9IYXRjaDogew0KLSAgICAgICAgICAgICAgICBJRkRFX0hhdGNoQnJ1c2ggKnBIYXRjaEJydXNoID0gKElGREVfSGF0Y2hCcnVzaCopcEJydXNoOw0KLSAgICAgICAgICAgICAgICBHZGlwbHVzOjpDb2xvciBmb3JlQ29sb3IoKEdkaXBsdXM6OkFSR0IpcEhhdGNoQnJ1c2gtPkdldENvbG9yKFRSVUUpKTsNCi0gICAgICAgICAgICAgICAgR2RpcGx1czo6Q29sb3IgYmFja0NvbG9yKChHZGlwbHVzOjpBUkdCKXBIYXRjaEJydXNoLT5HZXRDb2xvcihGQUxTRSkpOw0KLSAgICAgICAgICAgICAgICBHZGlwbHVzOjpIYXRjaFN0eWxlIGhhdGNoU3R5bGUgPSAoR2RpcGx1czo6SGF0Y2hTdHlsZSlwSGF0Y2hCcnVzaC0+R2V0SGF0Y2hTdHlsZSgpOw0KLSAgICAgICAgICAgICAgICBwR2RpQnJ1c2ggPSBuZXcgR2RpcGx1czo6SGF0Y2hCcnVzaChoYXRjaFN0eWxlLCBmb3JlQ29sb3IsIGJhY2tDb2xvcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGREVfQlJVU0hUWVBFX1RleHR1cmU6IHsNCi0gICAgICAgICAgICAgICAgSUZERV9UZXh0dXJlQnJ1c2ggKnBUZXh0dXJlQnJ1c2ggPSAoSUZERV9UZXh0dXJlQnJ1c2gqKXBCcnVzaDsNCi0gICAgICAgICAgICAgICAgQ0ZERV9HZGlJbWFnZSAqcEltZ0hvbGRlciA9IChDRkRFX0dkaUltYWdlKilwVGV4dHVyZUJydXNoLT5HZXRJbWFnZSgpOw0KLSAgICAgICAgICAgICAgICBHZGlwbHVzOjpJbWFnZSAqcEdkaUltYWdlID0gcEltZ0hvbGRlciA/IHBJbWdIb2xkZXItPm1fcEltYWdlIDogTlVMTDsNCi0gICAgICAgICAgICAgICAgR2RpcGx1czo6V3JhcE1vZGUgd3JhcE1vZGUgPSAoR2RpcGx1czo6V3JhcE1vZGUpcFRleHR1cmVCcnVzaC0+R2V0V3JhcE1vZGUoKTsNCi0gICAgICAgICAgICAgICAgcEdkaUJydXNoID0gbmV3IEdkaXBsdXM6OlRleHR1cmVCcnVzaChwR2RpSW1hZ2UsIHdyYXBNb2RlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZERV9CUlVTSFRZUEVfTGluZWFyR3JhZGllbnQ6IHsNCi0gICAgICAgICAgICAgICAgSUZERV9MaW5lYXJHcmFkaWVudEJydXNoICpwTGluZWFyQnJ1c2ggPSAoSUZERV9MaW5lYXJHcmFkaWVudEJydXNoKilwQnJ1c2g7DQotICAgICAgICAgICAgICAgIEdkaXBsdXM6OldyYXBNb2RlIHdyYXBNb2RlID0gKEdkaXBsdXM6OldyYXBNb2RlKXBMaW5lYXJCcnVzaC0+R2V0V3JhcE1vZGUoKTsNCi0gICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdFN0YXJ0LCBwdEVuZDsNCi0gICAgICAgICAgICAgICAgcExpbmVhckJydXNoLT5HZXRMaW5lYXJQb2ludHMocHRTdGFydCwgcHRFbmQpOw0KLSAgICAgICAgICAgICAgICBGWF9BUkdCIGNyU3RhcnQsIGNyRW5kOw0KLSAgICAgICAgICAgICAgICBwTGluZWFyQnJ1c2gtPkdldExpbmVhckNvbG9ycyhjclN0YXJ0LCBjckVuZCk7DQotICAgICAgICAgICAgICAgIHBHZGlCcnVzaCA9IG5ldyBHZGlwbHVzOjpMaW5lYXJHcmFkaWVudEJydXNoKChjb25zdCBHZGlwbHVzOjpQb2ludEYmKXB0U3RhcnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEdkaXBsdXM6OlBvaW50RiYpcHRFbmQsDQotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEdkaXBsdXM6OkNvbG9yJiljclN0YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBHZGlwbHVzOjpDb2xvciYpY3JFbmQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gcEdkaUJydXNoOw0KLX0NCi12b2lkIENGREVfR2RpRGV2aWNlOjpSZWxlYXNlR2RpQnJ1c2goR2RpcGx1czo6QnJ1c2ggKnBHZGlCcnVzaCkNCi17DQotICAgIGlmIChwR2RpQnJ1c2gpIHsNCi0gICAgICAgIGRlbGV0ZSBwR2RpQnJ1c2g7DQotICAgIH0NCi19DQotdm9pZCBDRkRFX0dkaURldmljZTo6QXBwbHlNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQogICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBtX0dyYXBoaWNzU3RhdGUgPSBtX3BHcmFwaGljcy0+U2F2ZSgpOw0KLSAgICAgICAgR2RpcGx1czo6TWF0cml4IGdkaU1hdHJpeChwTWF0cml4LT5hLCBwTWF0cml4LT5iLCBwTWF0cml4LT5jLCBwTWF0cml4LT5kLCBwTWF0cml4LT5lLCBwTWF0cml4LT5mKTsNCi0gICAgICAgIG1fcEdyYXBoaWNzLT5TZXRUcmFuc2Zvcm0oJmdkaU1hdHJpeCk7DQorICAgICAgRlhfRkxPQVQgYWEgPSBtYSAqIHBNYXRyaXgtPmEgKyBtYiAqIHBNYXRyaXgtPmM7DQorICAgICAgRlhfRkxPQVQgYmIgPSBtYSAqIHBNYXRyaXgtPmIgKyBtYiAqIHBNYXRyaXgtPmQ7DQorICAgICAgRlhfRkxPQVQgY2MgPSBtYyAqIHBNYXRyaXgtPmEgKyBtZCAqIHBNYXRyaXgtPmM7DQorICAgICAgRlhfRkxPQVQgZGQgPSBtYyAqIHBNYXRyaXgtPmIgKyBtZCAqIHBNYXRyaXgtPmQ7DQorICAgICAgbWEgPSBhYTsNCisgICAgICBtYiA9IGJiOw0KKyAgICAgIG1jID0gY2M7DQorICAgICAgbWQgPSBkZDsNCiAgICAgfQ0KKyAgICAqKGxvbmcqKSgmbWF0Mi5lTTExKSA9IChsb25nKShtYSAqIDY1NTM2KTsNCisgICAgKihsb25nKikoJm1hdDIuZU0yMSkgPSAobG9uZykobWIgKiA2NTUzNik7DQorICAgICoobG9uZyopKCZtYXQyLmVNMTIpID0gKGxvbmcpKG1jICogNjU1MzYpOw0KKyAgICAqKGxvbmcqKSgmbWF0Mi5lTTIyKSA9IChsb25nKShtZCAqIDY1NTM2KTsNCisgICAgRlhfRFdPUkQgZHdTaXplID0gcEdkaUZvbnQtPkdldEdseXBoRElCaXRzKHBDaGFyUG9zLT5tX0dseXBoSW5kZXgsIGFyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF0MiwgZ20sIE5VTEwsIDApOw0KKyAgICBpZiAoZHdTaXplID4gMCkgew0KKyAgICAgIGlmIChtX3BHbHlwaEJ1ZiA9PSBOVUxMKSB7DQorICAgICAgICBtX3BHbHlwaEJ1ZiA9IEZERV9BbGxvYyhkd1NpemUpOw0KKyAgICAgICAgbV9kd0dseXBoTGVuID0gZHdTaXplOw0KKyAgICAgIH0gZWxzZSBpZiAobV9kd0dseXBoTGVuIDwgZHdTaXplKSB7DQorICAgICAgICBtX3BHbHlwaEJ1ZiA9IEZERV9SZWFsbG9jKG1fcEdseXBoQnVmLCBkd1NpemUpOw0KKyAgICAgICAgbV9kd0dseXBoTGVuID0gZHdTaXplOw0KKyAgICAgIH0NCisgICAgICBwR2RpRm9udC0+R2V0R2x5cGhESUJpdHMocENoYXJQb3MtPm1fR2x5cGhJbmRleCwgYXJnYiwgJm1hdDIsIGdtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BHbHlwaEJ1ZiwgbV9kd0dseXBoTGVuKTsNCisgICAgICBHZGlwbHVzOjpCaXRtYXAgYm1wKGdtLmdtQmxhY2tCb3hYLCBnbS5nbUJsYWNrQm94WSwgZ20uZ21CbGFja0JveFggKiA0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQzMmJwcEFSR0IsIG1fcEdseXBoQnVmKTsNCisgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgZnggPSBwTWF0cml4LT5hICogcENoYXJQb3MtPm1fT3JpZ2luWCArDQorICAgICAgICAgICAgIHBNYXRyaXgtPmMgKiBwQ2hhclBvcy0+bV9PcmlnaW5ZICsgcE1hdHJpeC0+ZTsNCisgICAgICAgIGZ5ID0gcE1hdHJpeC0+YiAqIHBDaGFyUG9zLT5tX09yaWdpblggKw0KKyAgICAgICAgICAgICBwTWF0cml4LT5kICogcENoYXJQb3MtPm1fT3JpZ2luWSArIHBNYXRyaXgtPmY7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGZ4ID0gcENoYXJQb3MtPm1fT3JpZ2luWDsNCisgICAgICAgIGZ5ID0gcENoYXJQb3MtPm1fT3JpZ2luWTsNCisgICAgICB9DQorICAgICAgbV9wR3JhcGhpY3MtPkRyYXdJbWFnZSgmYm1wLCAoRlhTWVNfcm91bmQoZngpICsgZ20uZ21wdEdseXBoT3JpZ2luLngpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYU1lTX3JvdW5kKGZ5KSAtIGdtLmdtcHRHbHlwaE9yaWdpbi55KSk7DQorICAgIH0NCisgICAgcENoYXJQb3MrKzsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCi12b2lkIENGREVfR2RpRGV2aWNlOjpSZXN0b3JlTWF0cml4KGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgbV9wR3JhcGhpY3MtPlJlc3RvcmUobV9HcmFwaGljc1N0YXRlKTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdBcmMoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHN0YXJ0QW5nbGUgPSBGWF9SQUQyREVHKHN0YXJ0QW5nbGUpOw0KKyAgc3dlZXBBbmdsZSA9IEZYX1JBRDJERUcoc3dlZXBBbmdsZSk7DQorICBHZGlwbHVzOjpQZW4qIHBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCisgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0NCisgICAgICBtX3BHcmFwaGljcy0+RHJhd0FyYyhwR2RpUGVuLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuaGVpZ2h0LCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsNCisgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KKyAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd0JlemllcihJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEdkaXBsdXM6OlBlbiogcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KKyAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RHJhd0JlemllcigNCisgICAgICBwR2RpUGVuLCBwdDEueCwgcHQxLnksIHB0Mi54LCBwdDIueSwgcHQzLngsIHB0My55LCBwdDQueCwgcHQ0LnkpOw0KKyAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQorICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3Q3VydmUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xvc2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGVuc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgR2RpcGx1czo6UGVuKiBwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQorICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgR2RpcGx1czo6U3RhdHVzIHJldCA9DQorICAgICAgYkNsb3NlZA0KKyAgICAgICAgICA/IG1fcEdyYXBoaWNzLT5EcmF3Q2xvc2VkQ3VydmUoDQorICAgICAgICAgICAgICAgIHBHZGlQZW4sIChjb25zdCBHZGlwbHVzOjpQb2ludEYqKXBvaW50cy5HZXREYXRhKCksDQorICAgICAgICAgICAgICAgIHBvaW50cy5HZXRTaXplKCksIGZUZW5zaW9uKQ0KKyAgICAgICAgICA6IG1fcEdyYXBoaWNzLT5EcmF3Q3VydmUocEdkaVBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBHZGlwbHVzOjpQb2ludEYqKXBvaW50cy5HZXREYXRhKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMuR2V0U2l6ZSgpLCBmVGVuc2lvbik7DQorICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdFbGxpcHNlKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgR2RpcGx1czo6UGVuKiBwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQorICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5EcmF3RWxsaXBzZShwR2RpUGVuLCByZWN0LmxlZnQsIHJlY3QudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdMaW5lcyhJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBHZGlwbHVzOjpQZW4qIHBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCisgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkRyYXdMaW5lcygNCisgICAgICBwR2RpUGVuLCAoY29uc3QgR2RpcGx1czo6UG9pbnRGKilwb2ludHMuR2V0RGF0YSgpLCBwb2ludHMuR2V0U2l6ZSgpKTsNCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdMaW5lKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEdkaXBsdXM6OlBlbiogcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KKyAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPQ0KKyAgICAgIG1fcEdyYXBoaWNzLT5EcmF3TGluZShwR2RpUGVuLCBwdDEueCwgcHQxLnksIHB0Mi54LCBwdDIueSk7DQorICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdQYXRoKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJRkRFX1BhdGgqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfR2RpUGF0aCogcEdkaVBhdGggPSAoQ0ZERV9HZGlQYXRoKilwUGF0aDsNCisgIGlmIChwR2RpUGF0aCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEdkaXBsdXM6OlBlbiogcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KKyAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RHJhd1BhdGgocEdkaVBlbiwgJnBHZGlQYXRoLT5tX1BhdGgpOw0KKyAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQorICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3UGllKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBzdGFydEFuZ2xlID0gRlhfUkFEMkRFRyhzdGFydEFuZ2xlKTsNCisgIHN3ZWVwQW5nbGUgPSBGWF9SQUQyREVHKHN3ZWVwQW5nbGUpOw0KKyAgR2RpcGx1czo6UGVuKiBwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQorICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgR2RpcGx1czo6U3RhdHVzIHJldCA9DQorICAgICAgbV9wR3JhcGhpY3MtPkRyYXdQaWUocEdkaVBlbiwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmhlaWdodCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7DQorICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdDaG9yZChJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9BcmNGIGNob3JkOw0KKyAgY2hvcmQuU2V0KHJlY3QsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUpOw0KKyAgQ0ZERV9HZGlQYXRoIHBhdGg7DQorICBwYXRoLkFkZENob3JkKGNob3JkKTsNCisgIHJldHVybiBEcmF3UGF0aChwUGVuLCBmUGVuV2lkdGgsICZwYXRoLCBwTWF0cml4KTsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd1BvbHlnb24oSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgR2RpcGx1czo6UGVuKiBwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQorICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5EcmF3UG9seWdvbigNCisgICAgICBwR2RpUGVuLCAoY29uc3QgR2RpcGx1czo6UG9pbnRGKilwb2ludHMuR2V0RGF0YSgpLCBwb2ludHMuR2V0U2l6ZSgpKTsNCisgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KKyAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd1JlY3RhbmdsZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEdkaXBsdXM6OlBlbiogcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KKyAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RHJhd1JlY3RhbmdsZShwR2RpUGVuLCByZWN0LmxlZnQsIHJlY3QudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KKyAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd1JvdW5kUmVjdGFuZ2xlKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiByb3VuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZERV9HZGlQYXRoIHBhdGg7DQorICBwYXRoLkFkZFJvdW5kUmVjdGFuZ2xlKHJlY3QsIHJvdW5kKTsNCisgIHJldHVybiBEcmF3UGF0aChwUGVuLCBmUGVuV2lkdGgsICZwYXRoLCBwTWF0cml4KTsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RmlsbENsb3NlZEN1cnZlKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEdkaXBsdXM6OkJydXNoKiBwR2RpQnJ1c2ggPSBDcmVhdGVHZGlCcnVzaChwQnJ1c2gpOw0KKyAgaWYgKHBHZGlCcnVzaCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5GaWxsQ2xvc2VkQ3VydmUoDQorICAgICAgcEdkaUJydXNoLCAoY29uc3QgR2RpcGx1czo6UG9pbnRGKilwb2ludHMuR2V0RGF0YSgpLCBwb2ludHMuR2V0U2l6ZSgpLA0KKyAgICAgIEdkaXBsdXM6OkZpbGxNb2RlQWx0ZXJuYXRlLCBmVGVuc2lvbik7DQorICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaUJydXNoKHBHZGlCcnVzaCk7DQorICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpGaWxsRWxsaXBzZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEdkaXBsdXM6OkJydXNoKiBwR2RpQnJ1c2ggPSBDcmVhdGVHZGlCcnVzaChwQnJ1c2gpOw0KKyAgaWYgKHBHZGlCcnVzaCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5GaWxsRWxsaXBzZShwR2RpQnJ1c2gsIHJlY3QubGVmdCwgcmVjdC50b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICBSZWxlYXNlR2RpQnJ1c2gocEdkaUJydXNoKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxQYXRoKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJRkRFX1BhdGgqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfR2RpUGF0aCogcEdkaVBhdGggPSAoQ0ZERV9HZGlQYXRoKilwUGF0aDsNCisgIGlmIChwR2RpUGF0aCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEdkaXBsdXM6OkJydXNoKiBwR2RpQnJ1c2ggPSBDcmVhdGVHZGlCcnVzaChwQnJ1c2gpOw0KKyAgaWYgKHBHZGlCcnVzaCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5GaWxsUGF0aChwR2RpQnJ1c2gsICZwR2RpUGF0aC0+bV9QYXRoKTsNCisgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICBSZWxlYXNlR2RpQnJ1c2gocEdkaUJydXNoKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxQaWUoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBzdGFydEFuZ2xlID0gRlhfUkFEMkRFRyhzdGFydEFuZ2xlKTsNCisgIHN3ZWVwQW5nbGUgPSBGWF9SQUQyREVHKHN3ZWVwQW5nbGUpOw0KKyAgR2RpcGx1czo6QnJ1c2gqIHBHZGlCcnVzaCA9IENyZWF0ZUdkaUJydXNoKHBCcnVzaCk7DQorICBpZiAocEdkaUJydXNoID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0NCisgICAgICBtX3BHcmFwaGljcy0+RmlsbFBpZShwR2RpQnJ1c2gsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5oZWlnaHQsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUpOw0KKyAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgIFJlbGVhc2VHZGlCcnVzaChwR2RpQnJ1c2gpOw0KKyAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RmlsbENob3JkKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfQXJjRiBjaG9yZDsNCisgIGNob3JkLlNldChyZWN0LCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsNCisgIENGREVfR2RpUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRDaG9yZChjaG9yZCk7DQorICByZXR1cm4gRmlsbFBhdGgocEJydXNoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxQb2x5Z29uKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEdkaXBsdXM6OkJydXNoKiBwR2RpQnJ1c2ggPSBDcmVhdGVHZGlCcnVzaChwQnJ1c2gpOw0KKyAgaWYgKHBHZGlCcnVzaCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5GaWxsUG9seWdvbigNCisgICAgICBwR2RpQnJ1c2gsIChjb25zdCBHZGlwbHVzOjpQb2ludEYqKXBvaW50cy5HZXREYXRhKCksIHBvaW50cy5HZXRTaXplKCkpOw0KKyAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgIFJlbGVhc2VHZGlCcnVzaChwR2RpQnJ1c2gpOw0KKyAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RmlsbFJlY3RhbmdsZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBHZGlwbHVzOjpCcnVzaCogcEdkaUJydXNoID0gQ3JlYXRlR2RpQnJ1c2gocEJydXNoKTsNCisgIGlmIChwR2RpQnJ1c2ggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RmlsbFJlY3RhbmdsZSgNCisgICAgICBwR2RpQnJ1c2gsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICBSZWxlYXNlR2RpQnJ1c2gocEdkaUJydXNoKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxSb3VuZFJlY3RhbmdsZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiByb3VuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZERV9HZGlQYXRoIHBhdGg7DQorICBwYXRoLkFkZFJvdW5kUmVjdGFuZ2xlKHJlY3QsIHJvdW5kKTsNCisgIHJldHVybiBGaWxsUGF0aChwQnJ1c2gsICZwYXRoLCBwTWF0cml4KTsNCit9DQorR2RpcGx1czo6UGVuKiBDRkRFX0dkaURldmljZTo6Q3JlYXRlR2RpUGVuKElGREVfUGVuKiBwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgpIHsNCisgIGlmIChwUGVuID09IE5VTEwgfHwgZlBlbldpZHRoIDwgMC4wMWYpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBHZGlwbHVzOjpQZW4qIHBHZGlQZW4gPSBOVUxMOw0KKyAgc3dpdGNoIChwUGVuLT5HZXRUeXBlKCkpIHsNCisgICAgY2FzZSBGREVfUEVOVFlQRV9Tb2xpZENvbG9yOiB7DQorICAgICAgR2RpcGx1czo6Q29sb3IgZ2RpQ29sb3IoKEdkaXBsdXM6OkFSR0IpcFBlbi0+R2V0Q29sb3IoKSk7DQorICAgICAgcEdkaVBlbiA9IG5ldyBHZGlwbHVzOjpQZW4oZ2RpQ29sb3IsIGZQZW5XaWR0aCk7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRkRFX1BFTlRZUEVfSGF0Y2hCcnVzaDoNCisgICAgY2FzZSBGREVfUEVOVFlQRV9UZXh0dXJlQnJ1c2g6DQorICAgIGNhc2UgRkRFX1BFTlRZUEVfTGluZWFyR3JhZGllbnQ6IHsNCisgICAgICBHZGlwbHVzOjpCcnVzaCogcEdkaUJydXNoID0gQ3JlYXRlR2RpQnJ1c2gocFBlbi0+R2V0QnJ1c2goKSk7DQorICAgICAgaWYgKHBHZGlCcnVzaCkgew0KKyAgICAgICAgcEdkaVBlbiA9IG5ldyBHZGlwbHVzOjpQZW4ocEdkaUJydXNoLCBmUGVuV2lkdGgpOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgIH0NCisgIGlmIChwR2RpUGVuKSB7DQorICAgIENGWF9GbG9hdEFycmF5IGRhc2hBcnJheTsNCisgICAgcFBlbi0+R2V0RGFzaEFycmF5KGRhc2hBcnJheSk7DQorICAgIHBHZGlQZW4tPlNldERhc2hQYXR0ZXJuKGRhc2hBcnJheS5HZXREYXRhKCksIGRhc2hBcnJheS5HZXRTaXplKCkpOw0KKyAgICBwR2RpUGVuLT5TZXREYXNoT2Zmc2V0KHBQZW4tPkdldERhc2hQaGFzZSgpKTsNCisgICAgcEdkaVBlbi0+U2V0RGFzaFN0eWxlKChHZGlwbHVzOjpEYXNoU3R5bGUpcFBlbi0+R2V0RGFzaFN0eWxlKCkpOw0KKyAgICBwR2RpUGVuLT5TZXRTdGFydENhcCgoR2RpcGx1czo6TGluZUNhcClwUGVuLT5HZXRMaW5lQ2FwKCkpOw0KKyAgICBwR2RpUGVuLT5TZXRFbmRDYXAoKEdkaXBsdXM6OkxpbmVDYXApcFBlbi0+R2V0TGluZUNhcCgpKTsNCisgICAgcEdkaVBlbi0+U2V0TGluZUpvaW4oKEdkaXBsdXM6OkxpbmVKb2luKXBQZW4tPkdldExpbmVKb2luKCkpOw0KKyAgICBwR2RpUGVuLT5TZXRNaXRlckxpbWl0KHBQZW4tPkdldE1pdGVyTGltaXQoKSk7DQorICB9DQorICByZXR1cm4gcEdkaVBlbjsNCit9DQordm9pZCBDRkRFX0dkaURldmljZTo6UmVsZWFzZUdkaVBlbihHZGlwbHVzOjpQZW4qIHBHZGlQZW4pIHsNCisgIGlmIChwR2RpUGVuKSB7DQorICAgIFJlbGVhc2VHZGlCcnVzaChwR2RpUGVuLT5HZXRCcnVzaCgpKTsNCisgICAgZGVsZXRlIHBHZGlQZW47DQorICB9DQorfQ0KK0dkaXBsdXM6OkJydXNoKiBDRkRFX0dkaURldmljZTo6Q3JlYXRlR2RpQnJ1c2goSUZERV9CcnVzaCogcEJydXNoKSB7DQorICBpZiAocEJydXNoID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBHZGlwbHVzOjpCcnVzaCogcEdkaUJydXNoID0gTlVMTDsNCisgIHN3aXRjaCAocEJydXNoLT5HZXRUeXBlKCkpIHsNCisgICAgY2FzZSBGREVfQlJVU0hUWVBFX1NvbGlkOiB7DQorICAgICAgSUZERV9Tb2xpZEJydXNoKiBwU29saWRCcnVzaCA9IChJRkRFX1NvbGlkQnJ1c2gqKXBCcnVzaDsNCisgICAgICBHZGlwbHVzOjpDb2xvciBnZGlDb2xvcigoR2RpcGx1czo6QVJHQilwU29saWRCcnVzaC0+R2V0Q29sb3IoKSk7DQorICAgICAgcEdkaUJydXNoID0gbmV3IEdkaXBsdXM6OlNvbGlkQnJ1c2goZ2RpQ29sb3IpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9CUlVTSFRZUEVfSGF0Y2g6IHsNCisgICAgICBJRkRFX0hhdGNoQnJ1c2gqIHBIYXRjaEJydXNoID0gKElGREVfSGF0Y2hCcnVzaCopcEJydXNoOw0KKyAgICAgIEdkaXBsdXM6OkNvbG9yIGZvcmVDb2xvcigoR2RpcGx1czo6QVJHQilwSGF0Y2hCcnVzaC0+R2V0Q29sb3IoVFJVRSkpOw0KKyAgICAgIEdkaXBsdXM6OkNvbG9yIGJhY2tDb2xvcigoR2RpcGx1czo6QVJHQilwSGF0Y2hCcnVzaC0+R2V0Q29sb3IoRkFMU0UpKTsNCisgICAgICBHZGlwbHVzOjpIYXRjaFN0eWxlIGhhdGNoU3R5bGUgPQ0KKyAgICAgICAgICAoR2RpcGx1czo6SGF0Y2hTdHlsZSlwSGF0Y2hCcnVzaC0+R2V0SGF0Y2hTdHlsZSgpOw0KKyAgICAgIHBHZGlCcnVzaCA9IG5ldyBHZGlwbHVzOjpIYXRjaEJydXNoKGhhdGNoU3R5bGUsIGZvcmVDb2xvciwgYmFja0NvbG9yKTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfQlJVU0hUWVBFX1RleHR1cmU6IHsNCisgICAgICBJRkRFX1RleHR1cmVCcnVzaCogcFRleHR1cmVCcnVzaCA9IChJRkRFX1RleHR1cmVCcnVzaCopcEJydXNoOw0KKyAgICAgIENGREVfR2RpSW1hZ2UqIHBJbWdIb2xkZXIgPSAoQ0ZERV9HZGlJbWFnZSopcFRleHR1cmVCcnVzaC0+R2V0SW1hZ2UoKTsNCisgICAgICBHZGlwbHVzOjpJbWFnZSogcEdkaUltYWdlID0gcEltZ0hvbGRlciA/IHBJbWdIb2xkZXItPm1fcEltYWdlIDogTlVMTDsNCisgICAgICBHZGlwbHVzOjpXcmFwTW9kZSB3cmFwTW9kZSA9DQorICAgICAgICAgIChHZGlwbHVzOjpXcmFwTW9kZSlwVGV4dHVyZUJydXNoLT5HZXRXcmFwTW9kZSgpOw0KKyAgICAgIHBHZGlCcnVzaCA9IG5ldyBHZGlwbHVzOjpUZXh0dXJlQnJ1c2gocEdkaUltYWdlLCB3cmFwTW9kZSk7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRkRFX0JSVVNIVFlQRV9MaW5lYXJHcmFkaWVudDogew0KKyAgICAgIElGREVfTGluZWFyR3JhZGllbnRCcnVzaCogcExpbmVhckJydXNoID0NCisgICAgICAgICAgKElGREVfTGluZWFyR3JhZGllbnRCcnVzaCopcEJydXNoOw0KKyAgICAgIEdkaXBsdXM6OldyYXBNb2RlIHdyYXBNb2RlID0NCisgICAgICAgICAgKEdkaXBsdXM6OldyYXBNb2RlKXBMaW5lYXJCcnVzaC0+R2V0V3JhcE1vZGUoKTsNCisgICAgICBDRlhfUG9pbnRGIHB0U3RhcnQsIHB0RW5kOw0KKyAgICAgIHBMaW5lYXJCcnVzaC0+R2V0TGluZWFyUG9pbnRzKHB0U3RhcnQsIHB0RW5kKTsNCisgICAgICBGWF9BUkdCIGNyU3RhcnQsIGNyRW5kOw0KKyAgICAgIHBMaW5lYXJCcnVzaC0+R2V0TGluZWFyQ29sb3JzKGNyU3RhcnQsIGNyRW5kKTsNCisgICAgICBwR2RpQnJ1c2ggPSBuZXcgR2RpcGx1czo6TGluZWFyR3JhZGllbnRCcnVzaCgNCisgICAgICAgICAgKGNvbnN0IEdkaXBsdXM6OlBvaW50RiYpcHRTdGFydCwgKGNvbnN0IEdkaXBsdXM6OlBvaW50RiYpcHRFbmQsDQorICAgICAgICAgIChjb25zdCBHZGlwbHVzOjpDb2xvciYpY3JTdGFydCwgKGNvbnN0IEdkaXBsdXM6OkNvbG9yJiljckVuZCk7DQorICAgIH0gYnJlYWs7DQorICB9DQorICByZXR1cm4gcEdkaUJydXNoOw0KK30NCit2b2lkIENGREVfR2RpRGV2aWNlOjpSZWxlYXNlR2RpQnJ1c2goR2RpcGx1czo6QnJ1c2gqIHBHZGlCcnVzaCkgew0KKyAgaWYgKHBHZGlCcnVzaCkgew0KKyAgICBkZWxldGUgcEdkaUJydXNoOw0KKyAgfQ0KK30NCit2b2lkIENGREVfR2RpRGV2aWNlOjpBcHBseU1hdHJpeChjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBtX0dyYXBoaWNzU3RhdGUgPSBtX3BHcmFwaGljcy0+U2F2ZSgpOw0KKyAgICBHZGlwbHVzOjpNYXRyaXggZ2RpTWF0cml4KHBNYXRyaXgtPmEsIHBNYXRyaXgtPmIsIHBNYXRyaXgtPmMsIHBNYXRyaXgtPmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hdHJpeC0+ZSwgcE1hdHJpeC0+Zik7DQorICAgIG1fcEdyYXBoaWNzLT5TZXRUcmFuc2Zvcm0oJmdkaU1hdHJpeCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9HZGlEZXZpY2U6OlJlc3RvcmVNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgbV9wR3JhcGhpY3MtPlJlc3RvcmUobV9HcmFwaGljc1N0YXRlKTsNCisgIH0NCiB9DQogI2VuZGlmDQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2RpZGV2aWNlLmggYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZGlkZXZpY2UuaAppbmRleCAyNWFlODM3Li40MmRjOWE3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZGlkZXZpY2UuaAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZGlkZXZpY2UuaApAQCAtNyw2OSArNywxNTAgQEAKICNpZm5kZWYgX0ZERV9HRElQTFVTREVWSUNFX0lNUA0KICNkZWZpbmUgX0ZERV9HRElQTFVTREVWSUNFX0lNUA0KICNpZmRlZiBfRkRFUExVUw0KLSNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IFwNCisgICAgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQogY2xhc3MgQ0ZERV9HZGlQYXRoOw0KLWNsYXNzIENGREVfR2RpRGV2aWNlIDogcHVibGljIElGREVfUmVuZGVyRGV2aWNlLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfR2RpRGV2aWNlKENGWF9ESUJpdG1hcCAqcERpYik7DQotICAgIH5DRkRFX0dkaURldmljZSgpOw0KK2NsYXNzIENGREVfR2RpRGV2aWNlIDogcHVibGljIElGREVfUmVuZGVyRGV2aWNlLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfR2RpRGV2aWNlKENGWF9ESUJpdG1hcCogcERpYik7DQorICB+Q0ZERV9HZGlEZXZpY2UoKTsNCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQogDQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFdpZHRoKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldEhlaWdodCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZERV9IREVWSUNFU1RBVEUJU2F2ZVN0YXRlKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZXN0b3JlU3RhdGUoRkRFX0hERVZJQ0VTVEFURSBoU3RhdGUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0Q2xpcFBhdGgoY29uc3QgSUZERV9QYXRoICpwQ2xpcCk7DQotICAgIHZpcnR1YWwgSUZERV9QYXRoKgkJCUdldENsaXBQYXRoKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCk7DQotICAgIHZpcnR1YWwgY29uc3QgQ0ZYX1JlY3RGJglHZXRDbGlwUmVjdCgpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZHRoKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SGVpZ2h0KCkgY29uc3Q7DQorICB2aXJ0dWFsIEZERV9IREVWSUNFU1RBVEUgU2F2ZVN0YXRlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwUGF0aChjb25zdCBJRkRFX1BhdGgqIHBDbGlwKTsNCisgIHZpcnR1YWwgSUZERV9QYXRoKiBHZXRDbGlwUGF0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKTsNCisgIHZpcnR1YWwgY29uc3QgQ0ZYX1JlY3RGJiBHZXRDbGlwUmVjdCgpOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0RHBpWCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0RHBpWSgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXREcGlYKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldERwaVkoKSBjb25zdDsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdJbWFnZShDRlhfRElCU291cmNlICpwRGliLCBjb25zdCBDRlhfUmVjdEYgKnBTcmNSZWN0LCBjb25zdCBDRlhfUmVjdEYgJmRzdFJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBJbWdNYXRyaXggPSBOVUxMLCBjb25zdCBDRlhfTWF0cml4ICpwRGV2TWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3SW1hZ2UoSUZERV9JbWFnZSAqcEltZywgY29uc3QgQ0ZYX1JlY3RGICpwU3JjUmVjdCwgY29uc3QgQ0ZYX1JlY3RGICZkc3RSZWN0LCBjb25zdCBDRlhfTWF0cml4ICpwSW1nTWF0cml4ID0gTlVMTCwgY29uc3QgQ0ZYX01hdHJpeCAqcERldk1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1N0cmluZyhJRkRFX0JydXNoICpwQnJ1c2gsIElGWF9Gb250ICpwRm9udCwgY29uc3QgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBpbnQzMl90IGlDb3VudCwgRlhfRkxPQVQgZkZvbnRTaXplLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3QXJjKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgRlhfRkxPQVQgc3RhcnRBbmdsZSwgRlhfRkxPQVQgc3dlZXBBbmdsZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0JlemllcihJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRGICZwdDEsIGNvbnN0IENGWF9Qb2ludEYgJnB0MiwgY29uc3QgQ0ZYX1BvaW50RiAmcHQzLCBjb25zdCBDRlhfUG9pbnRGICZwdDQsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdDdXJ2ZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBGWF9CT09MIGJDbG9zZWQsIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41ZiwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0VsbGlwc2UoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3TGluZXMoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0xpbmUoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50RiAmcHQxLCBjb25zdCBDRlhfUG9pbnRGICZwdDIsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdQYXRoKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IElGREVfUGF0aCAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdQaWUoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBGWF9GTE9BVCBzdGFydEFuZ2xlLCBGWF9GTE9BVCBzd2VlcEFuZ2xlLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3Q2hvcmQoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBGWF9GTE9BVCBzdGFydEFuZ2xlLCBGWF9GTE9BVCBzd2VlcEFuZ2xlLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3UG9seWdvbihJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3UmVjdGFuZ2xlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd1JvdW5kUmVjdGFuZ2xlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX1NpemVGICZyb3VuZCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbENsb3NlZEN1cnZlKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGaWxsRWxsaXBzZShJRkRFX0JydXNoKiBwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbFBhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBJRkRFX1BhdGggKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGaWxsUGllKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBGWF9GTE9BVCBzdGFydEFuZ2xlLCBGWF9GTE9BVCBzd2VlcEFuZ2xlLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGaWxsQ2hvcmQoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxQb2x5Z29uKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbFJlY3RhbmdsZShJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbFJvdW5kUmVjdGFuZ2xlKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBjb25zdCBDRlhfU2l6ZUYgJnJvdW5kLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0ltYWdlKENGWF9ESUJTb3VyY2UqIHBEaWIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFNyY1JlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgZHN0UmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEltZ01hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBEZXZNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3SW1hZ2UoSUZERV9JbWFnZSogcEltZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwU3JjUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1nTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcERldk1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdTdHJpbmcoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqIHBGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0FyYyhJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCZXppZXIoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0N1cnZlKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNsb3NlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0VsbGlwc2UoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0xpbmVzKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3TGluZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1BhdGgoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdQaWUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3Q2hvcmQoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1BvbHlnb24oSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdSZWN0YW5nbGUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1JvdW5kUmVjdGFuZ2xlKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiByb3VuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxDbG9zZWRDdXJ2ZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxFbGxpcHNlKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxQYXRoKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJRkRFX1BhdGgqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUGllKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxDaG9yZChJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxQb2x5Z29uKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUmVjdGFuZ2xlKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUm91bmRSZWN0YW5nbGUoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9TaXplRiYgcm91bmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCiANCi1wcm90ZWN0ZWQ6DQotICAgIEdkaXBsdXM6OlBlbioJCQkJQ3JlYXRlR2RpUGVuKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgpOw0KLSAgICB2b2lkCQkJCQkJUmVsZWFzZUdkaVBlbihHZGlwbHVzOjpQZW4gKnBHZGlQZW4pOw0KLSAgICBHZGlwbHVzOjpCcnVzaCoJCQkJQ3JlYXRlR2RpQnJ1c2goSUZERV9CcnVzaCAqcEJydXNoKTsNCi0gICAgdm9pZAkJCQkJCVJlbGVhc2VHZGlCcnVzaChHZGlwbHVzOjpCcnVzaCAqcEdkaUJydXNoKTsNCi0gICAgdm9pZAkJCQkJCUFwcGx5TWF0cml4KGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICB2b2lkCQkJCQkJUmVzdG9yZU1hdHJpeChjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgR2RpcGx1czo6R3JhcGhpY3NTdGF0ZQkJbV9HcmFwaGljc1N0YXRlOw0KLSAgICBHZGlwbHVzOjpHcmFwaGljcwkJCSptX3BHcmFwaGljczsNCi0gICAgR2RpcGx1czo6Qml0bWFwCQkJCSptX3BCaXRtYXA7DQotICAgIHVpbnQ4X3QqCQkJCQltX3BHbHlwaEJ1ZjsNCi0gICAgRlhfRFdPUkQJCQkJCW1fZHdHbHlwaExlbjsNCi0gICAgQ0ZYX1JlY3RGCQkJCQltX3J0Q2xpcFJlY3Q7DQotICAgIENGREVfR2RpUGF0aAkJCQkqbV9wQ2xpcFBhdGg7DQorIHByb3RlY3RlZDoNCisgIEdkaXBsdXM6OlBlbiogQ3JlYXRlR2RpUGVuKElGREVfUGVuKiBwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgpOw0KKyAgdm9pZCBSZWxlYXNlR2RpUGVuKEdkaXBsdXM6OlBlbiogcEdkaVBlbik7DQorICBHZGlwbHVzOjpCcnVzaCogQ3JlYXRlR2RpQnJ1c2goSUZERV9CcnVzaCogcEJydXNoKTsNCisgIHZvaWQgUmVsZWFzZUdkaUJydXNoKEdkaXBsdXM6OkJydXNoKiBwR2RpQnJ1c2gpOw0KKyAgdm9pZCBBcHBseU1hdHJpeChjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgUmVzdG9yZU1hdHJpeChjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEdkaXBsdXM6OkdyYXBoaWNzU3RhdGUgbV9HcmFwaGljc1N0YXRlOw0KKyAgR2RpcGx1czo6R3JhcGhpY3MqIG1fcEdyYXBoaWNzOw0KKyAgR2RpcGx1czo6Qml0bWFwKiBtX3BCaXRtYXA7DQorICB1aW50OF90KiBtX3BHbHlwaEJ1ZjsNCisgIEZYX0RXT1JEIG1fZHdHbHlwaExlbjsNCisgIENGWF9SZWN0RiBtX3J0Q2xpcFJlY3Q7DQorICBDRkRFX0dkaVBhdGgqIG1fcENsaXBQYXRoOw0KIH07DQogI2VuZGlmDQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VkZXZpY2UuY3BwIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VkZXZpY2UuY3BwCmluZGV4IGM4ZTdjMjMuLmE2NzIyZTIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlZGV2aWNlLmNwcAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZWRldmljZS5jcHAKQEAgLTEyLDUyMSArMTIsNTc2IEBACiAjaWZkZWYgX2NwbHVzcGx1cw0KIGV4dGVuICJDIiB7DQogI2VuZGlmDQotICAgIEZYX0JPT0wgRkRFX0dldFN0b2NrSGF0Y2hNYXNrKGludDMyX3QgaUhhdGNoU3R5bGUsIENGWF9ESUJpdG1hcCAmIGhhdGNoTWFzaykNCi0gICAgew0KLSAgICAgICAgRkRFX0xQQ0hBVENIREFUQSBwRGF0YSA9IEZERV9ERVZHZXRIYXRjaERhdGEoaUhhdGNoU3R5bGUpOw0KLSAgICAgICAgaWYgKCFwRGF0YSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGhhdGNoTWFzay5DcmVhdGUocERhdGEtPmlXaWR0aCwgcERhdGEtPmlIZWlnaHQsIEZYRElCXzFicHBNYXNrKTsNCi0gICAgICAgIEZYU1lTX21lbWNweShoYXRjaE1hc2suR2V0QnVmZmVyKCksIHBEYXRhLT5NYXNrQml0cywgaGF0Y2hNYXNrLkdldFBpdGNoKCkgKiBwRGF0YS0+aUhlaWdodCk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCisgIEZYX0JPT0wgRkRFX0dldFN0b2NrSGF0Y2hNYXNrKGludDMyX3QgaUhhdGNoU3R5bGUsIENGWF9ESUJpdG1hcCAmIGhhdGNoTWFzaykgew0KKyAgICBGREVfTFBDSEFUQ0hEQVRBIHBEYXRhID0gRkRFX0RFVkdldEhhdGNoRGF0YShpSGF0Y2hTdHlsZSk7DQorICAgIGlmICghcERhdGEpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCisgICAgaGF0Y2hNYXNrLkNyZWF0ZShwRGF0YS0+aVdpZHRoLCBwRGF0YS0+aUhlaWdodCwgRlhESUJfMWJwcE1hc2spOw0KKyAgICBGWFNZU19tZW1jcHkoaGF0Y2hNYXNrLkdldEJ1ZmZlcigpLCBwRGF0YS0+TWFza0JpdHMsDQorICAgICAgICAgICAgICAgICBoYXRjaE1hc2suR2V0UGl0Y2goKSAqIHBEYXRhLT5pSGVpZ2h0KTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQogI2lmZGVmIF9jcGx1c3BsdXMNCiB9DQogI2VuZGlmDQotSUZERV9SZW5kZXJEZXZpY2UqCUlGREVfUmVuZGVyRGV2aWNlOjpDcmVhdGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgKQ0KLXsNCi0gICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0ZYX0Z4Z2VEZXZpY2UgKnBEZXZpY2UgPSBGWF9ORVcgQ0ZYX0Z4Z2VEZXZpY2U7DQotICAgIGlmIChwRGV2aWNlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHBEZXZpY2UtPkF0dGFjaChwQml0bWFwLCAwLCBiUmdiQnl0ZU9yZGVyKTsNCi0gICAgcmV0dXJuIG5ldyBDRkRFX0Z4Z2VEZXZpY2UocERldmljZSwgVFJVRSk7DQotfQ0KLUlGREVfUmVuZGVyRGV2aWNlKiBJRkRFX1JlbmRlckRldmljZTo6Q3JlYXRlKENGWF9SZW5kZXJEZXZpY2UgKnBEZXZpY2UpDQotew0KLSAgICBpZiAocERldmljZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gbmV3IENGREVfRnhnZURldmljZShwRGV2aWNlLCBGQUxTRSk7DQotfQ0KLUNGREVfRnhnZURldmljZTo6Q0ZERV9GeGdlRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UgKnBEZXZpY2UsIEZYX0JPT0wgYk93bmVyRGV2aWNlKQ0KLSAgICA6IG1fcERldmljZShwRGV2aWNlKQ0KLSAgICAsIG1fYk93bmVyRGV2aWNlKGJPd25lckRldmljZSkNCi0gICAgLCBtX3BDaGFyUG9zKE5VTEwpDQotICAgICwgbV9pQ2hhckNvdW50KDApDQotew0KLSAgICBGWFNZU19hc3NlcnQocERldmljZSAhPSBOVUxMKTsNCi0gICAgRlhfUkVDVCBydCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOw0KLSAgICBtX3J0Q2xpcC5TZXQoKEZYX0ZMT0FUKXJ0LmxlZnQsIChGWF9GTE9BVClydC50b3AsIChGWF9GTE9BVClydC5XaWR0aCgpLCAoRlhfRkxPQVQpcnQuSGVpZ2h0KCkpOw0KLX0NCi1DRkRFX0Z4Z2VEZXZpY2U6On5DRkRFX0Z4Z2VEZXZpY2UoKQ0KLXsNCi0gICAgaWYgKG1fcENoYXJQb3MgIT0gTlVMTCkgew0KLSAgICAgICAgRkRFX0ZyZWUobV9wQ2hhclBvcyk7DQotICAgIH0NCi0gICAgaWYgKG1fYk93bmVyRGV2aWNlICYmIG1fcERldmljZSkgew0KLSAgICAgICAgZGVsZXRlIG1fcERldmljZTsNCi0gICAgfQ0KLX0NCi1pbnQzMl90IENGREVfRnhnZURldmljZTo6R2V0V2lkdGgoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fcERldmljZS0+R2V0V2lkdGgoKTsNCi19DQotaW50MzJfdCBDRkRFX0Z4Z2VEZXZpY2U6OkdldEhlaWdodCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wRGV2aWNlLT5HZXRIZWlnaHQoKTsNCi19DQotRkRFX0hERVZJQ0VTVEFURSBDRkRFX0Z4Z2VEZXZpY2U6OlNhdmVTdGF0ZSgpDQotew0KLSAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KK0lGREVfUmVuZGVyRGV2aWNlKiBJRkRFX1JlbmRlckRldmljZTo6Q3JlYXRlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIpIHsNCisgIGlmIChwQml0bWFwID09IE5VTEwpIHsNCiAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfRnhnZURldmljZSogcERldmljZSA9IEZYX05FVyBDRlhfRnhnZURldmljZTsNCisgIGlmIChwRGV2aWNlID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwRGV2aWNlLT5BdHRhY2gocEJpdG1hcCwgMCwgYlJnYkJ5dGVPcmRlcik7DQorICByZXR1cm4gbmV3IENGREVfRnhnZURldmljZShwRGV2aWNlLCBUUlVFKTsNCiB9DQotdm9pZCBDRkRFX0Z4Z2VEZXZpY2U6OlJlc3RvcmVTdGF0ZShGREVfSERFVklDRVNUQVRFIGhTdGF0ZSkNCi17DQotICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7DQotICAgIGNvbnN0IEZYX1JFQ1QgJnJ0ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7DQotICAgIG1fcnRDbGlwLlNldCgoRlhfRkxPQVQpcnQubGVmdCwgKEZYX0ZMT0FUKXJ0LnRvcCwgKEZYX0ZMT0FUKXJ0LldpZHRoKCksIChGWF9GTE9BVClydC5IZWlnaHQoKSk7DQorSUZERV9SZW5kZXJEZXZpY2UqIElGREVfUmVuZGVyRGV2aWNlOjpDcmVhdGUoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSkgew0KKyAgaWYgKHBEZXZpY2UgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBuZXcgQ0ZERV9GeGdlRGV2aWNlKHBEZXZpY2UsIEZBTFNFKTsNCiB9DQotRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OlNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiAmcnRDbGlwKQ0KLXsNCi0gICAgbV9ydENsaXAgPSBydENsaXA7DQotICAgIEZYX1JFQ1QgcnQoKGludDMyX3QpRlhTWVNfZmxvb3IocnRDbGlwLmxlZnQpLCAoaW50MzJfdClGWFNZU19mbG9vcihydENsaXAudG9wKSwNCi0gICAgICAgICAgICAgICAoaW50MzJfdClGWFNZU19jZWlsKHJ0Q2xpcC5yaWdodCgpKSwgKGludDMyX3QpRlhTWVNfY2VpbChydENsaXAuYm90dG9tKCkpKTsNCi0gICAgcmV0dXJuIG1fcERldmljZS0+U2V0Q2xpcF9SZWN0KCZydCk7DQorQ0ZERV9GeGdlRGV2aWNlOjpDRkRFX0Z4Z2VEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPd25lckRldmljZSkNCisgICAgOiBtX3BEZXZpY2UocERldmljZSksDQorICAgICAgbV9iT3duZXJEZXZpY2UoYk93bmVyRGV2aWNlKSwNCisgICAgICBtX3BDaGFyUG9zKE5VTEwpLA0KKyAgICAgIG1faUNoYXJDb3VudCgwKSB7DQorICBGWFNZU19hc3NlcnQocERldmljZSAhPSBOVUxMKTsNCisgIEZYX1JFQ1QgcnQgPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsNCisgIG1fcnRDbGlwLlNldCgoRlhfRkxPQVQpcnQubGVmdCwgKEZYX0ZMT0FUKXJ0LnRvcCwgKEZYX0ZMT0FUKXJ0LldpZHRoKCksDQorICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXJ0LkhlaWdodCgpKTsNCiB9DQotY29uc3QgQ0ZYX1JlY3RGJiBDRkRFX0Z4Z2VEZXZpY2U6OkdldENsaXBSZWN0KCkNCi17DQotICAgIHJldHVybiBtX3J0Q2xpcDsNCitDRkRFX0Z4Z2VEZXZpY2U6On5DRkRFX0Z4Z2VEZXZpY2UoKSB7DQorICBpZiAobV9wQ2hhclBvcyAhPSBOVUxMKSB7DQorICAgIEZERV9GcmVlKG1fcENoYXJQb3MpOw0KKyAgfQ0KKyAgaWYgKG1fYk93bmVyRGV2aWNlICYmIG1fcERldmljZSkgew0KKyAgICBkZWxldGUgbV9wRGV2aWNlOw0KKyAgfQ0KIH0NCi1GWF9CT09MIENGREVfRnhnZURldmljZTo6U2V0Q2xpcFBhdGgoY29uc3QgSUZERV9QYXRoICpwQ2xpcCkNCi17DQoraW50MzJfdCBDRkRFX0Z4Z2VEZXZpY2U6OkdldFdpZHRoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcERldmljZS0+R2V0V2lkdGgoKTsNCit9DQoraW50MzJfdCBDRkRFX0Z4Z2VEZXZpY2U6OkdldEhlaWdodCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BEZXZpY2UtPkdldEhlaWdodCgpOw0KK30NCitGREVfSERFVklDRVNUQVRFIENGREVfRnhnZURldmljZTo6U2F2ZVN0YXRlKCkgew0KKyAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgIHJldHVybiBOVUxMOw0KK30NCit2b2lkIENGREVfRnhnZURldmljZTo6UmVzdG9yZVN0YXRlKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKSB7DQorICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOw0KKyAgY29uc3QgRlhfUkVDVCYgcnQgPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsNCisgIG1fcnRDbGlwLlNldCgoRlhfRkxPQVQpcnQubGVmdCwgKEZYX0ZMT0FUKXJ0LnRvcCwgKEZYX0ZMT0FUKXJ0LldpZHRoKCksDQorICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXJ0LkhlaWdodCgpKTsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OlNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKSB7DQorICBtX3J0Q2xpcCA9IHJ0Q2xpcDsNCisgIEZYX1JFQ1QgcnQoKGludDMyX3QpRlhTWVNfZmxvb3IocnRDbGlwLmxlZnQpLA0KKyAgICAgICAgICAgICAoaW50MzJfdClGWFNZU19mbG9vcihydENsaXAudG9wKSwNCisgICAgICAgICAgICAgKGludDMyX3QpRlhTWVNfY2VpbChydENsaXAucmlnaHQoKSksDQorICAgICAgICAgICAgIChpbnQzMl90KUZYU1lTX2NlaWwocnRDbGlwLmJvdHRvbSgpKSk7DQorICByZXR1cm4gbV9wRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJ0KTsNCit9DQorY29uc3QgQ0ZYX1JlY3RGJiBDRkRFX0Z4Z2VEZXZpY2U6OkdldENsaXBSZWN0KCkgew0KKyAgcmV0dXJuIG1fcnRDbGlwOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6U2V0Q2xpcFBhdGgoY29uc3QgSUZERV9QYXRoKiBwQ2xpcCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitJRkRFX1BhdGgqIENGREVfRnhnZURldmljZTo6R2V0Q2xpcFBhdGgoKSBjb25zdCB7DQorICByZXR1cm4gTlVMTDsNCit9DQorRlhfRkxPQVQgQ0ZERV9GeGdlRGV2aWNlOjpHZXREcGlYKCkgY29uc3Qgew0KKyAgcmV0dXJuIDk2Ow0KK30NCitGWF9GTE9BVCBDRkRFX0Z4Z2VEZXZpY2U6OkdldERwaVkoKSBjb25zdCB7DQorICByZXR1cm4gOTY7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcERpYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFNyY1JlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIGRzdFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1nTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcERldk1hdHJpeCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBEaWIgIT0gTlVMTCk7DQorICBDRlhfUmVjdEYgc3JjUmVjdDsNCisgIGlmIChwU3JjUmVjdCkgew0KKyAgICBzcmNSZWN0ID0gKnBTcmNSZWN0Ow0KKyAgfSBlbHNlIHsNCisgICAgc3JjUmVjdC5TZXQoMCwgMCwgKEZYX0ZMT0FUKXBEaWItPkdldFdpZHRoKCksIChGWF9GTE9BVClwRGliLT5HZXRIZWlnaHQoKSk7DQorICB9DQorICBpZiAoc3JjUmVjdC5Jc0VtcHR5KCkpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBkaWIyZnhkZXY7DQorICBpZiAocEltZ01hdHJpeCkgew0KKyAgICBkaWIyZnhkZXYgPSAqcEltZ01hdHJpeDsNCisgIH0gZWxzZSB7DQorICAgIGRpYjJmeGRldi5SZXNldCgpOw0KKyAgfQ0KKyAgZGliMmZ4ZGV2LmEgPSBkc3RSZWN0LndpZHRoOw0KKyAgZGliMmZ4ZGV2LmQgPSAtZHN0UmVjdC5oZWlnaHQ7DQorICBkaWIyZnhkZXYuZSA9IGRzdFJlY3QubGVmdDsNCisgIGRpYjJmeGRldi5mID0gZHN0UmVjdC5ib3R0b20oKTsNCisgIGlmIChwRGV2TWF0cml4KSB7DQorICAgIGRpYjJmeGRldi5Db25jYXQoKnBEZXZNYXRyaXgpOw0KKyAgfQ0KKyAgdm9pZCogaGFuZGxlID0gTlVMTDsNCisgIG1fcERldmljZS0+U3RhcnRESUJpdHMocERpYiwgMjU1LCAwLCAoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCopJmRpYjJmeGRldiwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsNCisgIHdoaWxlIChtX3BEZXZpY2UtPkNvbnRpbnVlRElCaXRzKGhhbmRsZSwgTlVMTCkpIHsNCisgIH0NCisgIG1fcERldmljZS0+Q2FuY2VsRElCaXRzKGhhbmRsZSk7DQorICByZXR1cm4gaGFuZGxlICE9IE5VTEw7DQogfQ0KLUlGREVfUGF0aCogQ0ZERV9GeGdlRGV2aWNlOjpHZXRDbGlwUGF0aCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotRlhfRkxPQVQgQ0ZERV9GeGdlRGV2aWNlOjpHZXREcGlYKCkgY29uc3QNCi17DQotICAgIHJldHVybiA5NjsNCi19DQotRlhfRkxPQVQgQ0ZERV9GeGdlRGV2aWNlOjpHZXREcGlZKCkgY29uc3QNCi17DQotICAgIHJldHVybiA5NjsNCi19DQotRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkRyYXdJbWFnZShDRlhfRElCU291cmNlICpwRGliLCBjb25zdCBDRlhfUmVjdEYgKnBTcmNSZWN0LCBjb25zdCBDRlhfUmVjdEYgJmRzdFJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBJbWdNYXRyaXgsIGNvbnN0IENGWF9NYXRyaXggKnBEZXZNYXRyaXgpDQotew0KLSAgICBGWFNZU19hc3NlcnQocERpYiAhPSBOVUxMKTsNCi0gICAgQ0ZYX1JlY3RGIHNyY1JlY3Q7DQotICAgIGlmIChwU3JjUmVjdCkgew0KLSAgICAgICAgc3JjUmVjdCA9ICpwU3JjUmVjdDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHNyY1JlY3QuU2V0KDAsIDAsIChGWF9GTE9BVClwRGliLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpcERpYi0+R2V0SGVpZ2h0KCkpOw0KLSAgICB9DQotICAgIGlmIChzcmNSZWN0LklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9NYXRyaXggZGliMmZ4ZGV2Ow0KLSAgICBpZiAocEltZ01hdHJpeCkgew0KLSAgICAgICAgZGliMmZ4ZGV2ID0gKnBJbWdNYXRyaXg7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBkaWIyZnhkZXYuUmVzZXQoKTsNCi0gICAgfQ0KLSAgICBkaWIyZnhkZXYuYSA9IGRzdFJlY3Qud2lkdGg7DQotICAgIGRpYjJmeGRldi5kID0gLWRzdFJlY3QuaGVpZ2h0Ow0KLSAgICBkaWIyZnhkZXYuZSA9IGRzdFJlY3QubGVmdDsNCi0gICAgZGliMmZ4ZGV2LmYgPSBkc3RSZWN0LmJvdHRvbSgpOw0KLSAgICBpZiAocERldk1hdHJpeCkgew0KLSAgICAgICAgZGliMmZ4ZGV2LkNvbmNhdCgqcERldk1hdHJpeCk7DQotICAgIH0NCi0gICAgdm9pZCogaGFuZGxlID0gTlVMTDsNCi0gICAgbV9wRGV2aWNlLT5TdGFydERJQml0cyhwRGliLCAyNTUsIDAsIChjb25zdCBDRlhfQWZmaW5lTWF0cml4KikmZGliMmZ4ZGV2LCAwLCBoYW5kbGUpOw0KLSAgICB3aGlsZSAobV9wRGV2aWNlLT5Db250aW51ZURJQml0cyhoYW5kbGUsIE5VTEwpKSB7IH0NCi0gICAgbV9wRGV2aWNlLT5DYW5jZWxESUJpdHMoaGFuZGxlKTsNCi0gICAgcmV0dXJuIGhhbmRsZSAhPSBOVUxMOw0KLX0NCi1GWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd1N0cmluZyhJRkRFX0JydXNoICpwQnJ1c2gsIElGWF9Gb250ICpwRm9udCwgY29uc3QgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBpbnQzMl90IGlDb3VudCwgRlhfRkxPQVQgZkZvbnRTaXplLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBCcnVzaCAhPSBOVUxMICYmIHBGb250ICE9IE5VTEwgJiYgcENoYXJQb3MgIT0gTlVMTCAmJiBpQ291bnQgPiAwKTsNCi0gICAgQ0ZYX0ZvbnRDYWNoZSAqcENhY2hlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCk7DQotICAgIENGWF9Gb250ICpwRnhGb250ID0gKENGWF9Gb250KilwRm9udC0+R2V0RGV2Rm9udCgpOw0KLSAgICBzd2l0Y2ggKHBCcnVzaC0+R2V0VHlwZSgpKSB7DQotICAgICAgICBjYXNlIEZERV9CUlVTSFRZUEVfU29saWQ6IHsNCi0gICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiID0gKChJRkRFX1NvbGlkQnJ1c2gqKXBCcnVzaCktPkdldENvbG9yKCk7DQotICAgICAgICAgICAgICAgIGlmICgocEZvbnQtPkdldEZvbnRTdHlsZXMoKSAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMpICE9IDAgJiYgIXBGeEZvbnQtPklzSXRhbGljKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TICpwQ1AgPSAoRlhURVhUX0NIQVJQT1MqKXBDaGFyUG9zOw0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgKnBBTTsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgKytpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IEZYX0ZMT0FUICBtYyA9IDAuMjY3OTQ5ZjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQU0gPSBwQ1AtPm1fQWRqdXN0TWF0cml4Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBTVsyXSA9IG1jICogcEFNWzBdICsgcEFNWzJdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBTVszXSA9IG1jICogcEFNWzFdICsgcEFNWzNdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDUCArKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyAqcENQID0gKEZYVEVYVF9DSEFSUE9TKilwQ2hhclBvczsNCi0gICAgICAgICAgICAgICAgSUZYX0ZvbnQgKnBDdXJGb250ID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgSUZYX0ZvbnQgKnBTVEZvbnQgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyAqcEN1ckNQID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpQ3VyQ291bnQgPSAwOw0KLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlID0gcEZvbnQtPkdldEZvbnRTdHlsZXMoKTsNCi0gICAgICAgICAgICAgICAgQ0ZYX0ZvbnQgRnhGb250Ow0KLSAgICAgICAgICAgICAgICBDRlhfU3Vic3RGb250IFN1YnN0RnhGb250Ow0KLSAgICAgICAgICAgICAgICBGeEZvbnQubV9wU3Vic3RGb250ID0gJlN1YnN0RnhGb250Ow0KLSAgICAgICAgICAgICAgICBTdWJzdEZ4Rm9udC5tX1dlaWdodCA9IGR3Rm9udFN0eWxlICYgRlhfRk9OVFNUWUxFX0JvbGQgPyA3MDAgOiA0MDA7DQotICAgICAgICAgICAgICAgIFN1YnN0RnhGb250Lm1fV2VpZ2h0Q0pLID0gU3Vic3RGeEZvbnQubV9XZWlnaHQ7DQotICAgICAgICAgICAgICAgIFN1YnN0RnhGb250Lm1fSXRhbGljQW5nbGUgPSBkd0ZvbnRTdHlsZSAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMgPyAtMTIgOiAwOw0KLSAgICAgICAgICAgICAgICBTdWJzdEZ4Rm9udC5tX2JJdGxpY0NKSyA9IGR3Rm9udFN0eWxlICYgRlhfRk9OVFNUWUxFX0l0YWxpYyA/IFRSVUUgOiBGQUxTRTsNCi0jZW5kaWYNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBTVEZvbnQgPSBwRm9udC0+R2V0U3Vic3RGb250KChpbnQzMl90KXBDUC0+bV9HbHlwaEluZGV4KTsNCi0gICAgICAgICAgICAgICAgICAgIHBDUC0+bV9HbHlwaEluZGV4ICY9IDB4MDBGRkZGRkY7DQotICAgICAgICAgICAgICAgICAgICBwQ1AtPm1fYkZvbnRTdHlsZSA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDdXJGb250ICE9IHBTVEZvbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEN1ckZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnhGb250ID0gKENGWF9Gb250KilwQ3VyRm9udC0+R2V0RGV2Rm9udCgpOw0KLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ4Rm9udC5tX0ZhY2UgPSBwRnhGb250LT5tX0ZhY2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZS0+RHJhd05vcm1hbFRleHQoaUN1ckNvdW50LCBwQ3VyQ1AsICZGeEZvbnQsIHBDYWNoZSwgLWZGb250U2l6ZSwgKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKXBNYXRyaXgsIGFyZ2IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KLSNlbHNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERldmljZS0+RHJhd05vcm1hbFRleHQoaUN1ckNvdW50LCBwQ3VyQ1AsIHBGeEZvbnQsIHBDYWNoZSwgLWZGb250U2l6ZSwgKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKXBNYXRyaXgsIGFyZ2IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ3VyRm9udCA9IHBTVEZvbnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEN1ckNQID0gcENQOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlDdXJDb3VudCA9IDE7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlDdXJDb3VudCArKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHBDUCArKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAocEN1ckZvbnQgIT0gTlVMTCAmJiBpQ3VyQ291bnQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBGeEZvbnQgPSAoQ0ZYX0ZvbnQqKXBDdXJGb250LT5HZXREZXZGb250KCk7DQotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgICAgICAgICAgICAgICAgIEZ4Rm9udC5tX0ZhY2UgPSBwRnhGb250LT5tX0ZhY2U7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXQgPSBtX3BEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlDdXJDb3VudCwgcEN1ckNQLCAmRnhGb250LCBwQ2FjaGUsIC1mRm9udFNpemUsIChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4LCBhcmdiLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgICAgICAgICAgICAgICAgIEZ4Rm9udC5tX3BTdWJzdEZvbnQgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgRnhGb250Lm1fRmFjZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYlJldDsNCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcERldmljZS0+RHJhd05vcm1hbFRleHQoaUN1ckNvdW50LCBwQ3VyQ1AsIHBGeEZvbnQsIHBDYWNoZSwgLWZGb250U2l6ZSwgKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKXBNYXRyaXgsIGFyZ2IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICB9DQotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgICAgICAgICAgICAgRnhGb250Lm1fcFN1YnN0Rm9udCA9IE5VTEw7DQotICAgICAgICAgICAgICAgIEZ4Rm9udC5tX0ZhY2UgPSBOVUxMOw0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd0JlemllcihJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRGICZwdDEsIGNvbnN0IENGWF9Qb2ludEYgJnB0MiwgY29uc3QgQ0ZYX1BvaW50RiAmcHQzLCBjb25zdCBDRlhfUG9pbnRGICZwdDQsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZYX1BvaW50c0YgcG9pbnRzOw0KLSAgICBwb2ludHMuQWRkKHB0MSk7DQotICAgIHBvaW50cy5BZGQocHQyKTsNCi0gICAgcG9pbnRzLkFkZChwdDMpOw0KLSAgICBwb2ludHMuQWRkKHB0NCk7DQotICAgIENGREVfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkFkZEJlemllcihwb2ludHMpOw0KLSAgICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3Q3VydmUoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgRlhfQk9PTCBiQ2xvc2VkLCBGWF9GTE9BVCBmVGVuc2lvbiAsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZERV9QYXRoIHBhdGg7DQotICAgIHBhdGguQWRkQ3VydmUocG9pbnRzLCBiQ2xvc2VkLCBmVGVuc2lvbik7DQotICAgIHJldHVybiBEcmF3UGF0aChwUGVuLCBmUGVuV2lkdGgsICZwYXRoLCBwTWF0cml4KTsNCi19DQotRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkRyYXdFbGxpcHNlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBDRkRFX1BhdGggcGF0aDsNCi0gICAgcGF0aC5BZGRFbGxpcHNlKHJlY3QpOw0KLSAgICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3TGluZXMoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBDRkRFX1BhdGggcGF0aDsNCi0gICAgcGF0aC5BZGRMaW5lcyhwb2ludHMpOw0KLSAgICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3TGluZShJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRGICZwdDEsIGNvbnN0IENGWF9Qb2ludEYgJnB0MiwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBDRkRFX1BhdGggcGF0aDsNCi0gICAgcGF0aC5BZGRMaW5lKHB0MSwgcHQyKTsNCi0gICAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KLX0NCi1GWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd1BhdGgoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgSUZERV9QYXRoICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBDRkRFX1BhdGggKnBHZVBhdGggPSAoQ0ZERV9QYXRoKilwUGF0aDsNCi0gICAgaWYgKHBHZVBhdGggPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9HcmFwaFN0YXRlRGF0YSBncmFwaFN0YXRlOw0KLSAgICBpZiAoIUNyZWF0ZVBlbihwUGVuLCBmUGVuV2lkdGgsIGdyYXBoU3RhdGUpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcERldmljZS0+RHJhd1BhdGgoJnBHZVBhdGgtPm1fUGF0aCwgKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKXBNYXRyaXgsICZncmFwaFN0YXRlLCAwLCBwUGVuLT5HZXRDb2xvcigpLCAwKTsNCi19DQotRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkRyYXdQb2x5Z29uKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZERV9QYXRoIHBhdGg7DQotICAgIHBhdGguQWRkUG9seWdvbihwb2ludHMpOw0KLSAgICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3UmVjdGFuZ2xlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBDRkRFX1BhdGggcGF0aDsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocmVjdCk7DQotICAgIHJldHVybiBEcmF3UGF0aChwUGVuLCBmUGVuV2lkdGgsICZwYXRoLCBwTWF0cml4KTsNCi19DQotRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxDbG9zZWRDdXJ2ZShJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIEZYX0ZMT0FUIGZUZW5zaW9uICwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBDRkRFX1BhdGggcGF0aDsNCi0gICAgcGF0aC5BZGRDdXJ2ZShwb2ludHMsIFRSVUUsIGZUZW5zaW9uKTsNCi0gICAgcmV0dXJuIEZpbGxQYXRoKHBCcnVzaCwgJnBhdGgsIHBNYXRyaXgpOw0KLX0NCi1GWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbEVsbGlwc2UoSUZERV9CcnVzaCogcEJydXNoLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZERV9QYXRoIHBhdGg7DQotICAgIHBhdGguQWRkRWxsaXBzZShyZWN0KTsNCi0gICAgcmV0dXJuIEZpbGxQYXRoKHBCcnVzaCwgJnBhdGgsIHBNYXRyaXgpOw0KLX0NCi1GWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbFBvbHlnb24oSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIENGREVfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkFkZFBvbHlnb24ocG9pbnRzKTsNCi0gICAgcmV0dXJuIEZpbGxQYXRoKHBCcnVzaCwgJnBhdGgsIHBNYXRyaXgpOw0KLX0NCi1GWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbFJlY3RhbmdsZShJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBDRkRFX1BhdGggcGF0aDsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocmVjdCk7DQotICAgIHJldHVybiBGaWxsUGF0aChwQnJ1c2gsICZwYXRoLCBwTWF0cml4KTsNCi19DQotRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkNyZWF0ZVBlbihJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBDRlhfR3JhcGhTdGF0ZURhdGEgJmdyYXBoU3RhdGUpDQotew0KLSAgICBpZiAocFBlbiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgZ3JhcGhTdGF0ZS5tX0xpbmVDYXAgPSAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwKXBQZW4tPkdldExpbmVDYXAoKTsNCi0gICAgZ3JhcGhTdGF0ZS5tX0xpbmVKb2luID0gKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW4pcFBlbi0+R2V0TGluZUpvaW4oKTsNCi0gICAgZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aCA9IGZQZW5XaWR0aDsNCi0gICAgZ3JhcGhTdGF0ZS5tX01pdGVyTGltaXQgPSBwUGVuLT5HZXRNaXRlckxpbWl0KCk7DQotICAgIGdyYXBoU3RhdGUubV9EYXNoUGhhc2UgPSBwUGVuLT5HZXREYXNoUGhhc2UoKTsNCi0gICAgQ0ZYX0Zsb2F0QXJyYXkgZGFzaEFycmF5Ow0KLSAgICBzd2l0Y2ggKHBQZW4tPkdldERhc2hTdHlsZSgpKSB7DQotICAgICAgICBjYXNlIEZERV9EQVNIU1RZTEVfRGFzaDoNCi0gICAgICAgICAgICBkYXNoQXJyYXkuQWRkKDMpOw0KLSAgICAgICAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZERV9EQVNIU1RZTEVfRG90Og0KLSAgICAgICAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQotICAgICAgICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRkRFX0RBU0hTVFlMRV9EYXNoRG90Og0KLSAgICAgICAgICAgIGRhc2hBcnJheS5BZGQoMyk7DQotICAgICAgICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCi0gICAgICAgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KLSAgICAgICAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZERV9EQVNIU1RZTEVfRGFzaERvdERvdDoNCi0gICAgICAgICAgICBkYXNoQXJyYXkuQWRkKDMpOw0KLSAgICAgICAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQotICAgICAgICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCi0gICAgICAgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KLSAgICAgICAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQotICAgICAgICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRkRFX0RBU0hTVFlMRV9DdXN0b21pemVkOg0KLSAgICAgICAgICAgIHBQZW4tPkdldERhc2hBcnJheShkYXNoQXJyYXkpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGludDMyX3QgaURhc2hDb3VudCA9IGRhc2hBcnJheS5HZXRTaXplKCk7DQotICAgIGlmIChpRGFzaENvdW50ID4gMCkgew0KLSAgICAgICAgZ3JhcGhTdGF0ZS5TZXREYXNoQ291bnQoaURhc2hDb3VudCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpRGFzaENvdW50OyArK2kpIHsNCi0gICAgICAgICAgICBncmFwaFN0YXRlLm1fRGFzaEFycmF5W2ldID0gZGFzaEFycmF5W2ldICogZlBlbldpZHRoOw0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3U3RyaW5nKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udCogcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBGWFNZU19hc3NlcnQocEJydXNoICE9IE5VTEwgJiYgcEZvbnQgIT0gTlVMTCAmJiBwQ2hhclBvcyAhPSBOVUxMICYmDQorICAgICAgICAgICAgICAgaUNvdW50ID4gMCk7DQorICBDRlhfRm9udENhY2hlKiBwQ2FjaGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKTsNCisgIENGWF9Gb250KiBwRnhGb250ID0gKENGWF9Gb250KilwRm9udC0+R2V0RGV2Rm9udCgpOw0KKyAgc3dpdGNoIChwQnJ1c2gtPkdldFR5cGUoKSkgew0KKyAgICBjYXNlIEZERV9CUlVTSFRZUEVfU29saWQ6IHsNCisgICAgICBGWF9BUkdCIGFyZ2IgPSAoKElGREVfU29saWRCcnVzaCopcEJydXNoKS0+R2V0Q29sb3IoKTsNCisgICAgICBpZiAoKHBGb250LT5HZXRGb250U3R5bGVzKCkgJiBGWF9GT05UU1RZTEVfSXRhbGljKSAhPSAwICYmDQorICAgICAgICAgICFwRnhGb250LT5Jc0l0YWxpYygpKSB7DQorICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENQID0gKEZYVEVYVF9DSEFSUE9TKilwQ2hhclBvczsNCisgICAgICAgIEZYX0ZMT0FUKiBwQU07DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgew0KKyAgICAgICAgICBzdGF0aWMgY29uc3QgRlhfRkxPQVQgbWMgPSAwLjI2Nzk0OWY7DQorICAgICAgICAgIHBBTSA9IHBDUC0+bV9BZGp1c3RNYXRyaXg7DQorICAgICAgICAgIHBBTVsyXSA9IG1jICogcEFNWzBdICsgcEFNWzJdOw0KKyAgICAgICAgICBwQU1bM10gPSBtYyAqIHBBTVsxXSArIHBBTVszXTsNCisgICAgICAgICAgcENQKys7DQogICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ1AgPSAoRlhURVhUX0NIQVJQT1MqKXBDaGFyUG9zOw0KKyAgICAgIElGWF9Gb250KiBwQ3VyRm9udCA9IE5VTEw7DQorICAgICAgSUZYX0ZvbnQqIHBTVEZvbnQgPSBOVUxMOw0KKyAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ3VyQ1AgPSBOVUxMOw0KKyAgICAgIGludDMyX3QgaUN1ckNvdW50ID0gMDsNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlID0gcEZvbnQtPkdldEZvbnRTdHlsZXMoKTsNCisgICAgICBDRlhfRm9udCBGeEZvbnQ7DQorICAgICAgQ0ZYX1N1YnN0Rm9udCBTdWJzdEZ4Rm9udDsNCisgICAgICBGeEZvbnQubV9wU3Vic3RGb250ID0gJlN1YnN0RnhGb250Ow0KKyAgICAgIFN1YnN0RnhGb250Lm1fV2VpZ2h0ID0gZHdGb250U3R5bGUgJiBGWF9GT05UU1RZTEVfQm9sZCA/IDcwMCA6IDQwMDsNCisgICAgICBTdWJzdEZ4Rm9udC5tX1dlaWdodENKSyA9IFN1YnN0RnhGb250Lm1fV2VpZ2h0Ow0KKyAgICAgIFN1YnN0RnhGb250Lm1fSXRhbGljQW5nbGUgPSBkd0ZvbnRTdHlsZSAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMgPyAtMTIgOiAwOw0KKyAgICAgIFN1YnN0RnhGb250Lm1fYkl0bGljQ0pLID0NCisgICAgICAgICAgZHdGb250U3R5bGUgJiBGWF9GT05UU1RZTEVfSXRhbGljID8gVFJVRSA6IEZBTFNFOw0KKyNlbmRpZg0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgKytpKSB7DQorICAgICAgICBwU1RGb250ID0gcEZvbnQtPkdldFN1YnN0Rm9udCgoaW50MzJfdClwQ1AtPm1fR2x5cGhJbmRleCk7DQorICAgICAgICBwQ1AtPm1fR2x5cGhJbmRleCAmPSAweDAwRkZGRkZGOw0KKyAgICAgICAgcENQLT5tX2JGb250U3R5bGUgPSBGQUxTRTsNCisgICAgICAgIGlmIChwQ3VyRm9udCAhPSBwU1RGb250KSB7DQorICAgICAgICAgIGlmIChwQ3VyRm9udCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcEZ4Rm9udCA9IChDRlhfRm9udCopcEN1ckZvbnQtPkdldERldkZvbnQoKTsNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICAgICAgICAgIEZ4Rm9udC5tX0ZhY2UgPSBwRnhGb250LT5tX0ZhY2U7DQorICAgICAgICAgICAgbV9wRGV2aWNlLT5EcmF3Tm9ybWFsVGV4dCgNCisgICAgICAgICAgICAgICAgaUN1ckNvdW50LCBwQ3VyQ1AsICZGeEZvbnQsIHBDYWNoZSwgLWZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKXBNYXRyaXgsIGFyZ2IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyNlbHNlDQorICAgICAgICAgICAgbV9wRGV2aWNlLT5EcmF3Tm9ybWFsVGV4dCgNCisgICAgICAgICAgICAgICAgaUN1ckNvdW50LCBwQ3VyQ1AsIHBGeEZvbnQsIHBDYWNoZSwgLWZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKXBNYXRyaXgsIGFyZ2IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyNlbmRpZg0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBDdXJGb250ID0gcFNURm9udDsNCisgICAgICAgICAgcEN1ckNQID0gcENQOw0KKyAgICAgICAgICBpQ3VyQ291bnQgPSAxOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaUN1ckNvdW50Kys7DQorICAgICAgICB9DQorICAgICAgICBwQ1ArKzsNCisgICAgICB9DQorICAgICAgaWYgKHBDdXJGb250ICE9IE5VTEwgJiYgaUN1ckNvdW50KSB7DQorICAgICAgICBwRnhGb250ID0gKENGWF9Gb250KilwQ3VyRm9udC0+R2V0RGV2Rm9udCgpOw0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgICAgICBGeEZvbnQubV9GYWNlID0gcEZ4Rm9udC0+bV9GYWNlOw0KKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gbV9wRGV2aWNlLT5EcmF3Tm9ybWFsVGV4dCgNCisgICAgICAgICAgICBpQ3VyQ291bnQsIHBDdXJDUCwgJkZ4Rm9udCwgcENhY2hlLCAtZkZvbnRTaXplLA0KKyAgICAgICAgICAgIChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4LCBhcmdiLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgICAgIEZ4Rm9udC5tX3BTdWJzdEZvbnQgPSBOVUxMOw0KKyAgICAgICAgRnhGb250Lm1fRmFjZSA9IE5VTEw7DQorICAgICAgICByZXR1cm4gYlJldDsNCisjZWxzZQ0KKyAgICAgICAgcmV0dXJuIG1fcERldmljZS0+RHJhd05vcm1hbFRleHQoDQorICAgICAgICAgICAgaUN1ckNvdW50LCBwQ3VyQ1AsIHBGeEZvbnQsIHBDYWNoZSwgLWZGb250U2l6ZSwNCisgICAgICAgICAgICAoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCopcE1hdHJpeCwgYXJnYiwgRlhURVhUX0NMRUFSVFlQRSk7DQorI2VuZGlmDQorICAgICAgfQ0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgICAgRnhGb250Lm1fcFN1YnN0Rm9udCA9IE5VTEw7DQorICAgICAgRnhGb250Lm1fRmFjZSA9IE5VTEw7DQorI2VuZGlmDQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KIH0NCi10eXBlZGVmIEZYX0JPT0wgKENGREVfRnhnZURldmljZTo6KnBmRmlsbFBhdGgpKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BhdGhEYXRhICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkRyYXdCZXppZXIoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUG9pbnRzRiBwb2ludHM7DQorICBwb2ludHMuQWRkKHB0MSk7DQorICBwb2ludHMuQWRkKHB0Mik7DQorICBwb2ludHMuQWRkKHB0Myk7DQorICBwb2ludHMuQWRkKHB0NCk7DQorICBDRkRFX1BhdGggcGF0aDsNCisgIHBhdGguQWRkQmV6aWVyKHBvaW50cyk7DQorICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3Q3VydmUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xvc2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRkRFX1BhdGggcGF0aDsNCisgIHBhdGguQWRkQ3VydmUocG9pbnRzLCBiQ2xvc2VkLCBmVGVuc2lvbik7DQorICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3RWxsaXBzZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRFbGxpcHNlKHJlY3QpOw0KKyAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd0xpbmVzKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRMaW5lcyhwb2ludHMpOw0KKyAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd0xpbmUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRMaW5lKHB0MSwgcHQyKTsNCisgIHJldHVybiBEcmF3UGF0aChwUGVuLCBmUGVuV2lkdGgsICZwYXRoLCBwTWF0cml4KTsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkRyYXdQYXRoKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCogcEdlUGF0aCA9IChDRkRFX1BhdGgqKXBQYXRoOw0KKyAgaWYgKHBHZVBhdGggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3JhcGhTdGF0ZTsNCisgIGlmICghQ3JlYXRlUGVuKHBQZW4sIGZQZW5XaWR0aCwgZ3JhcGhTdGF0ZSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcERldmljZS0+RHJhd1BhdGgoJnBHZVBhdGgtPm1fUGF0aCwgKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKXBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JhcGhTdGF0ZSwgMCwgcFBlbi0+R2V0Q29sb3IoKSwgMCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3UG9seWdvbihJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRkRFX1BhdGggcGF0aDsNCisgIHBhdGguQWRkUG9seWdvbihwb2ludHMpOw0KKyAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd1JlY3RhbmdsZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocmVjdCk7DQorICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpGaWxsQ2xvc2VkQ3VydmUoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZERV9QYXRoIHBhdGg7DQorICBwYXRoLkFkZEN1cnZlKHBvaW50cywgVFJVRSwgZlRlbnNpb24pOw0KKyAgcmV0dXJuIEZpbGxQYXRoKHBCcnVzaCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbEVsbGlwc2UoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRFbGxpcHNlKHJlY3QpOw0KKyAgcmV0dXJuIEZpbGxQYXRoKHBCcnVzaCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbFBvbHlnb24oSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRkRFX1BhdGggcGF0aDsNCisgIHBhdGguQWRkUG9seWdvbihwb2ludHMpOw0KKyAgcmV0dXJuIEZpbGxQYXRoKHBCcnVzaCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbFJlY3RhbmdsZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocmVjdCk7DQorICByZXR1cm4gRmlsbFBhdGgocEJydXNoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpDcmVhdGVQZW4oSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEmIGdyYXBoU3RhdGUpIHsNCisgIGlmIChwUGVuID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgZ3JhcGhTdGF0ZS5tX0xpbmVDYXAgPSAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwKXBQZW4tPkdldExpbmVDYXAoKTsNCisgIGdyYXBoU3RhdGUubV9MaW5lSm9pbiA9IChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luKXBQZW4tPkdldExpbmVKb2luKCk7DQorICBncmFwaFN0YXRlLm1fTGluZVdpZHRoID0gZlBlbldpZHRoOw0KKyAgZ3JhcGhTdGF0ZS5tX01pdGVyTGltaXQgPSBwUGVuLT5HZXRNaXRlckxpbWl0KCk7DQorICBncmFwaFN0YXRlLm1fRGFzaFBoYXNlID0gcFBlbi0+R2V0RGFzaFBoYXNlKCk7DQorICBDRlhfRmxvYXRBcnJheSBkYXNoQXJyYXk7DQorICBzd2l0Y2ggKHBQZW4tPkdldERhc2hTdHlsZSgpKSB7DQorICAgIGNhc2UgRkRFX0RBU0hTVFlMRV9EYXNoOg0KKyAgICAgIGRhc2hBcnJheS5BZGQoMyk7DQorICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGREVfREFTSFNUWUxFX0RvdDoNCisgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRkRFX0RBU0hTVFlMRV9EYXNoRG90Og0KKyAgICAgIGRhc2hBcnJheS5BZGQoMyk7DQorICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCisgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRkRFX0RBU0hTVFlMRV9EYXNoRG90RG90Og0KKyAgICAgIGRhc2hBcnJheS5BZGQoMyk7DQorICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCisgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQorICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCisgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZERV9EQVNIU1RZTEVfQ3VzdG9taXplZDoNCisgICAgICBwUGVuLT5HZXREYXNoQXJyYXkoZGFzaEFycmF5KTsNCisgICAgICBicmVhazsNCisgIH0NCisgIGludDMyX3QgaURhc2hDb3VudCA9IGRhc2hBcnJheS5HZXRTaXplKCk7DQorICBpZiAoaURhc2hDb3VudCA+IDApIHsNCisgICAgZ3JhcGhTdGF0ZS5TZXREYXNoQ291bnQoaURhc2hDb3VudCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlEYXNoQ291bnQ7ICsraSkgew0KKyAgICAgIGdyYXBoU3RhdGUubV9EYXNoQXJyYXlbaV0gPSBkYXNoQXJyYXlbaV0gKiBmUGVuV2lkdGg7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit0eXBlZGVmIEZYX0JPT0wgKENGREVfRnhnZURldmljZTo6KnBmRmlsbFBhdGgpKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCiBzdGF0aWMgY29uc3QgcGZGaWxsUGF0aCBnc19GaWxsUGF0aFtdID0gew0KLSAgICAmQ0ZERV9GeGdlRGV2aWNlOjpGaWxsU29saWRQYXRoLA0KLSAgICAmQ0ZERV9GeGdlRGV2aWNlOjpGaWxsSGF0Y2hQYXRoLA0KLSAgICAmQ0ZERV9GeGdlRGV2aWNlOjpGaWxsVGV4dHVyZVBhdGgsDQotICAgICZDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxMaW5lYXJHcmFkaWVudFBhdGgsDQorICAgICZDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxTb2xpZFBhdGgsICZDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxIYXRjaFBhdGgsDQorICAgICZDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxUZXh0dXJlUGF0aCwgJkNGREVfRnhnZURldmljZTo6RmlsbExpbmVhckdyYWRpZW50UGF0aCwNCiB9Ow0KLUZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpGaWxsUGF0aChJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IElGREVfUGF0aCAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBDRkRFX1BhdGggKnBHZVBhdGggPSAoQ0ZERV9QYXRoKilwUGF0aDsNCi0gICAgaWYgKHBHZVBhdGggPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmIChwQnJ1c2ggPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGludDMyX3QgaVR5cGUgPSBwQnJ1c2gtPkdldFR5cGUoKTsNCi0gICAgaWYgKGlUeXBlIDwgMCB8fCBpVHlwZSA+IEZERV9CUlVTSFRZUEVfTUFYKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuICh0aGlzLT4qZ3NfRmlsbFBhdGhbaVR5cGVdKShwQnJ1c2gsICZwR2VQYXRoLT5tX1BhdGgsIHBNYXRyaXgpOw0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpGaWxsUGF0aChJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCogcEdlUGF0aCA9IChDRkRFX1BhdGgqKXBQYXRoOw0KKyAgaWYgKHBHZVBhdGggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocEJydXNoID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBpVHlwZSA9IHBCcnVzaC0+R2V0VHlwZSgpOw0KKyAgaWYgKGlUeXBlIDwgMCB8fCBpVHlwZSA+IEZERV9CUlVTSFRZUEVfTUFYKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiAodGhpcy0+KmdzX0ZpbGxQYXRoW2lUeXBlXSkocEJydXNoLCAmcEdlUGF0aC0+bV9QYXRoLCBwTWF0cml4KTsNCiB9DQotRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxTb2xpZFBhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUGF0aERhdGEgKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBQYXRoICYmIHBCcnVzaCAmJiBwQnJ1c2gtPkdldFR5cGUoKSA9PSBGREVfQlJVU0hUWVBFX1NvbGlkKTsNCi0gICAgSUZERV9Tb2xpZEJydXNoICpwU29saWRCcnVzaCA9IChJRkRFX1NvbGlkQnJ1c2gqKXBCcnVzaDsNCi0gICAgcmV0dXJuIG1fcERldmljZS0+RHJhd1BhdGgocFBhdGgsIChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4LCBOVUxMLCBwU29saWRCcnVzaC0+R2V0Q29sb3IoKSwgMCwgRlhGSUxMX1dJTkRJTkcpOw0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpGaWxsU29saWRQYXRoKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYU1lTX2Fzc2VydChwUGF0aCAmJiBwQnJ1c2ggJiYgcEJydXNoLT5HZXRUeXBlKCkgPT0gRkRFX0JSVVNIVFlQRV9Tb2xpZCk7DQorICBJRkRFX1NvbGlkQnJ1c2gqIHBTb2xpZEJydXNoID0gKElGREVfU29saWRCcnVzaCopcEJydXNoOw0KKyAgcmV0dXJuIG1fcERldmljZS0+RHJhd1BhdGgocFBhdGgsIChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4LCBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNvbGlkQnJ1c2gtPkdldENvbG9yKCksIDAsIEZYRklMTF9XSU5ESU5HKTsNCiB9DQotRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxIYXRjaFBhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUGF0aERhdGEgKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBQYXRoICYmIHBCcnVzaCAmJiBwQnJ1c2gtPkdldFR5cGUoKSA9PSBGREVfQlJVU0hUWVBFX0hhdGNoKTsNCi0gICAgSUZERV9IYXRjaEJydXNoICpwSGF0Y2hCcnVzaCA9IChJRkRFX0hhdGNoQnJ1c2gqKXBCcnVzaDsNCi0gICAgaW50MzJfdCBpU3R5bGUgPSBwSGF0Y2hCcnVzaC0+R2V0SGF0Y2hTdHlsZSgpOw0KLSAgICBpZiAoaVN0eWxlIDwgRkRFX0hBVENIU1RZTEVfTWluIHx8IGlTdHlsZSA+IEZERV9IQVRDSFNUWUxFX01heCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpGaWxsSGF0Y2hQYXRoKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYU1lTX2Fzc2VydChwUGF0aCAmJiBwQnJ1c2ggJiYgcEJydXNoLT5HZXRUeXBlKCkgPT0gRkRFX0JSVVNIVFlQRV9IYXRjaCk7DQorICBJRkRFX0hhdGNoQnJ1c2gqIHBIYXRjaEJydXNoID0gKElGREVfSGF0Y2hCcnVzaCopcEJydXNoOw0KKyAgaW50MzJfdCBpU3R5bGUgPSBwSGF0Y2hCcnVzaC0+R2V0SGF0Y2hTdHlsZSgpOw0KKyAgaWYgKGlTdHlsZSA8IEZERV9IQVRDSFNUWUxFX01pbiB8fCBpU3R5bGUgPiBGREVfSEFUQ0hTVFlMRV9NYXgpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX0RJQml0bWFwIG1hc2s7DQorICBpZiAoIUZERV9HZXRTdG9ja0hhdGNoTWFzayhpU3R5bGUsIG1hc2spKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0FSR0IgZHdGb3JlQ29sb3IgPSBwSGF0Y2hCcnVzaC0+R2V0Q29sb3IoVFJVRSk7DQorICBGWF9BUkdCIGR3QmFja0NvbG9yID0gcEhhdGNoQnJ1c2gtPkdldENvbG9yKEZBTFNFKTsNCisgIENGWF9GbG9hdFJlY3QgcmVjdGYgPSBwUGF0aC0+R2V0Qm91bmRpbmdCb3goKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHJlY3RmLlRyYW5zZm9ybSgoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCopcE1hdHJpeCk7DQorICB9DQorICBGWF9SRUNUIHJlY3QoRlhTWVNfcm91bmQocmVjdGYubGVmdCksIEZYU1lTX3JvdW5kKHJlY3RmLnRvcCksDQorICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdGYucmlnaHQpLCBGWFNZU19yb3VuZChyZWN0Zi5ib3R0b20pKTsNCisgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7DQorICBtX3BEZXZpY2UtPlN0YXJ0UmVuZGVyaW5nKCk7DQorICBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocFBhdGgsIChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HKTsNCisgIG1fcERldmljZS0+RmlsbFJlY3QoJnJlY3QsIGR3QmFja0NvbG9yKTsNCisgIGZvciAoaW50MzJfdCBqID0gcmVjdC5ib3R0b207IGogPCByZWN0LnRvcDsgaiArPSBtYXNrLkdldEhlaWdodCgpKQ0KKyAgICBmb3IgKGludDMyX3QgaSA9IHJlY3QubGVmdDsgaSA8IHJlY3QucmlnaHQ7IGkgKz0gbWFzay5HZXRXaWR0aCgpKSB7DQorICAgICAgbV9wRGV2aWNlLT5TZXRCaXRNYXNrKCZtYXNrLCBpLCBqLCBkd0ZvcmVDb2xvcik7DQogICAgIH0NCi0gICAgQ0ZYX0RJQml0bWFwIG1hc2s7DQotICAgIGlmICghRkRFX0dldFN0b2NrSGF0Y2hNYXNrKGlTdHlsZSwgbWFzaykpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWF9BUkdCIGR3Rm9yZUNvbG9yID0gcEhhdGNoQnJ1c2gtPkdldENvbG9yKFRSVUUpOw0KLSAgICBGWF9BUkdCIGR3QmFja0NvbG9yID0gcEhhdGNoQnJ1c2gtPkdldENvbG9yKEZBTFNFKTsNCi0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ZiA9IHBQYXRoLT5HZXRCb3VuZGluZ0JveCgpOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgcmVjdGYuVHJhbnNmb3JtKChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBGWF9SRUNUIHJlY3QoRlhTWVNfcm91bmQocmVjdGYubGVmdCksIEZYU1lTX3JvdW5kKHJlY3RmLnRvcCksDQotICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0Zi5yaWdodCksIEZYU1lTX3JvdW5kKHJlY3RmLmJvdHRvbSkpOw0KLSAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KLSAgICBtX3BEZXZpY2UtPlN0YXJ0UmVuZGVyaW5nKCk7DQotICAgIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwUGF0aCwgKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKXBNYXRyaXgsIEZYRklMTF9XSU5ESU5HKTsNCi0gICAgbV9wRGV2aWNlLT5GaWxsUmVjdCgmcmVjdCwgZHdCYWNrQ29sb3IpOw0KLSAgICBmb3IgKGludDMyX3QgaiA9IHJlY3QuYm90dG9tOyBqIDwgcmVjdC50b3A7IGogKz0gbWFzay5HZXRIZWlnaHQoKSkNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gcmVjdC5sZWZ0OyBpIDwgcmVjdC5yaWdodDsgaSArPSBtYXNrLkdldFdpZHRoKCkpIHsNCi0gICAgICAgICAgICBtX3BEZXZpY2UtPlNldEJpdE1hc2soJm1hc2ssIGksIGosIGR3Rm9yZUNvbG9yKTsNCisgIG1fcERldmljZS0+RW5kUmVuZGVyaW5nKCk7DQorICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpGaWxsVGV4dHVyZVBhdGgoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYU1lTX2Fzc2VydChwUGF0aCAmJiBwQnJ1c2ggJiYgcEJydXNoLT5HZXRUeXBlKCkgPT0gRkRFX0JSVVNIVFlQRV9UZXh0dXJlKTsNCisgIElGREVfVGV4dHVyZUJydXNoKiBwVGV4dHVyZUJydXNoID0gKElGREVfVGV4dHVyZUJydXNoKilwQnJ1c2g7DQorICBJRkRFX0ltYWdlKiBwSW1hZ2UgPSAoSUZERV9JbWFnZSopcFRleHR1cmVCcnVzaC0+R2V0SW1hZ2UoKTsNCisgIGlmIChwSW1hZ2UgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfU2l6ZSBzaXplOw0KKyAgc2l6ZS5TZXQocEltYWdlLT5HZXRJbWFnZVdpZHRoKCksIHBJbWFnZS0+R2V0SW1hZ2VIZWlnaHQoKSk7DQorICBDRlhfRElCaXRtYXAgYm1wOw0KKyAgYm1wLkNyZWF0ZShzaXplLngsIHNpemUueSwgRlhESUJfQXJnYik7DQorICBpZiAoIXBJbWFnZS0+U3RhcnRMb2FkSW1hZ2UoJmJtcCwgMCwgMCwgc2l6ZS54LCBzaXplLnksIDAsIDAsIHNpemUueCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLnkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwSW1hZ2UtPkRvTG9hZEltYWdlKCkgPCAxMDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcEltYWdlLT5TdG9wTG9hZEltYWdlKCk7DQorICByZXR1cm4gV3JhcFRleHR1cmUocFRleHR1cmVCcnVzaC0+R2V0V3JhcE1vZGUoKSwgJmJtcCwgcFBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6V3JhcFRleHR1cmUoaW50MzJfdCBpV3JhcE1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ZiA9IHBQYXRoLT5HZXRCb3VuZGluZ0JveCgpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcmVjdGYuVHJhbnNmb3JtKChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4KTsNCisgIH0NCisgIEZYX1JFQ1QgcmVjdChGWFNZU19yb3VuZChyZWN0Zi5sZWZ0KSwgRlhTWVNfcm91bmQocmVjdGYudG9wKSwNCisgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0Zi5yaWdodCksIEZYU1lTX3JvdW5kKHJlY3RmLmJvdHRvbSkpOw0KKyAgcmVjdC5Ob3JtYWxpemUoKTsNCisgIGlmIChyZWN0LklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KKyAgbV9wRGV2aWNlLT5TdGFydFJlbmRlcmluZygpOw0KKyAgbV9wRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKHBQYXRoLCAoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCopcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORyk7DQorICBzd2l0Y2ggKGlXcmFwTW9kZSkgew0KKyAgICBjYXNlIEZERV9XUkFQTU9ERV9UaWxlOg0KKyAgICBjYXNlIEZERV9XUkFQTU9ERV9UaWxlRmxpcFg6DQorICAgIGNhc2UgRkRFX1dSQVBNT0RFX1RpbGVGbGlwWToNCisgICAgY2FzZSBGREVfV1JBUE1PREVfVGlsZUZsaXBYWTogew0KKyAgICAgIEZYX0JPT0wgYkZsaXBYID0gaVdyYXBNb2RlID09IEZERV9XUkFQTU9ERV9UaWxlRmxpcFhZIHx8DQorICAgICAgICAgICAgICAgICAgICAgICBpV3JhcE1vZGUgPT0gRkRFX1dSQVBNT0RFX1RpbGVGbGlwWDsNCisgICAgICBGWF9CT09MIGJGbGlwWSA9IGlXcmFwTW9kZSA9PSBGREVfV1JBUE1PREVfVGlsZUZsaXBYWSB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgaVdyYXBNb2RlID09IEZERV9XUkFQTU9ERV9UaWxlRmxpcFk7DQorICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwRmxpcFsyXVsyXTsNCisgICAgICBwRmxpcFswXVswXSA9IHBCaXRtYXA7DQorICAgICAgcEZsaXBbMF1bMV0gPSBiRmxpcFggPyBwQml0bWFwLT5GbGlwSW1hZ2UoVFJVRSwgRkFMU0UpIDogcEJpdG1hcDsNCisgICAgICBwRmxpcFsxXVswXSA9IGJGbGlwWSA/IHBCaXRtYXAtPkZsaXBJbWFnZShGQUxTRSwgVFJVRSkgOiBwQml0bWFwOw0KKyAgICAgIHBGbGlwWzFdWzFdID0NCisgICAgICAgICAgKGJGbGlwWCB8fCBiRmxpcFkpID8gcEJpdG1hcC0+RmxpcEltYWdlKGJGbGlwWCwgYkZsaXBZKSA6IHBCaXRtYXA7DQorICAgICAgaW50MzJfdCBpQ291bnRlclkgPSAwOw0KKyAgICAgIGZvciAoaW50MzJfdCBqID0gcmVjdC50b3A7IGogPCByZWN0LmJvdHRvbTsgaiArPSBwQml0bWFwLT5HZXRIZWlnaHQoKSkgew0KKyAgICAgICAgaW50MzJfdCBpbmRleFkgPSBpQ291bnRlclkrKyAlIDI7DQorICAgICAgICBpbnQzMl90IGlDb3VudGVyWCA9IDA7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IHJlY3QubGVmdDsgaSA8IHJlY3QucmlnaHQ7IGkgKz0gcEJpdG1hcC0+R2V0V2lkdGgoKSkgew0KKyAgICAgICAgICBpbnQzMl90IGluZGV4WCA9IGlDb3VudGVyWCsrICUgMjsNCisgICAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocEZsaXBbaW5kZXhZXVtpbmRleFhdLCBpLCBqKTsNCiAgICAgICAgIH0NCi0gICAgbV9wRGV2aWNlLT5FbmRSZW5kZXJpbmcoKTsNCi0gICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGlmIChwRmxpcFswXVsxXSAhPSBwRmxpcFswXVswXSkgew0KKyAgICAgICAgZGVsZXRlIHBGbGlwWzBdWzFdOw0KKyAgICAgIH0NCisgICAgICBpZiAocEZsaXBbMV1bMF0gIT0gcEZsaXBbMF1bMF0pIHsNCisgICAgICAgIGRlbGV0ZSBwRmxpcFsxXVswXTsNCisgICAgICB9DQorICAgICAgaWYgKHBGbGlwWzFdWzFdICE9IHBGbGlwWzBdWzBdKSB7DQorICAgICAgICBkZWxldGUgcEZsaXBbMV1bMV07DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9XUkFQTU9ERV9DbGFtcDogew0KKyAgICAgIG1fcERldmljZS0+U2V0RElCaXRzKHBCaXRtYXAsIHJlY3QubGVmdCwgcmVjdC5ib3R0b20pOw0KKyAgICB9IGJyZWFrOw0KKyAgfQ0KKyAgbV9wRGV2aWNlLT5FbmRSZW5kZXJpbmcoKTsNCisgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxUZXh0dXJlUGF0aChJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9QYXRoRGF0YSAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBGWFNZU19hc3NlcnQocFBhdGggJiYgcEJydXNoICYmIHBCcnVzaC0+R2V0VHlwZSgpID09IEZERV9CUlVTSFRZUEVfVGV4dHVyZSk7DQotICAgIElGREVfVGV4dHVyZUJydXNoICpwVGV4dHVyZUJydXNoID0gKElGREVfVGV4dHVyZUJydXNoKilwQnJ1c2g7DQotICAgIElGREVfSW1hZ2UgKnBJbWFnZSA9IChJRkRFX0ltYWdlKilwVGV4dHVyZUJydXNoLT5HZXRJbWFnZSgpOw0KLSAgICBpZiAocEltYWdlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfU2l6ZSBzaXplOw0KLSAgICBzaXplLlNldChwSW1hZ2UtPkdldEltYWdlV2lkdGgoKSwgcEltYWdlLT5HZXRJbWFnZUhlaWdodCgpKTsNCi0gICAgQ0ZYX0RJQml0bWFwIGJtcDsNCi0gICAgYm1wLkNyZWF0ZShzaXplLngsIHNpemUueSwgRlhESUJfQXJnYik7DQotICAgIGlmICghcEltYWdlLT5TdGFydExvYWRJbWFnZSgmYm1wLCAwLCAwLCBzaXplLngsIHNpemUueSwgMCwgMCwgc2l6ZS54LCBzaXplLnkpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKHBJbWFnZS0+RG9Mb2FkSW1hZ2UoKSA8IDEwMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHBJbWFnZS0+U3RvcExvYWRJbWFnZSgpOw0KLSAgICByZXR1cm4gV3JhcFRleHR1cmUocFRleHR1cmVCcnVzaC0+R2V0V3JhcE1vZGUoKSwgJmJtcCwgcFBhdGgsIHBNYXRyaXgpOw0KLX0NCi1GWF9CT09MIENGREVfRnhnZURldmljZTo6V3JhcFRleHR1cmUoaW50MzJfdCBpV3JhcE1vZGUsIGNvbnN0IENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgY29uc3QgQ0ZYX1BhdGhEYXRhICpwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIENGWF9GbG9hdFJlY3QgcmVjdGYgPSBwUGF0aC0+R2V0Qm91bmRpbmdCb3goKTsNCi0gICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgIHJlY3RmLlRyYW5zZm9ybSgoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCopcE1hdHJpeCk7DQotICAgIH0NCi0gICAgRlhfUkVDVCByZWN0KEZYU1lTX3JvdW5kKHJlY3RmLmxlZnQpLCBGWFNZU19yb3VuZChyZWN0Zi50b3ApLA0KLSAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdGYucmlnaHQpLCBGWFNZU19yb3VuZChyZWN0Zi5ib3R0b20pKTsNCi0gICAgcmVjdC5Ob3JtYWxpemUoKTsNCi0gICAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsNCi0gICAgbV9wRGV2aWNlLT5TdGFydFJlbmRlcmluZygpOw0KLSAgICBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocFBhdGgsIChjb25zdCBDRlhfQWZmaW5lTWF0cml4KilwTWF0cml4LCBGWEZJTExfV0lORElORyk7DQotICAgIHN3aXRjaCAoaVdyYXBNb2RlKSB7DQotICAgICAgICBjYXNlIEZERV9XUkFQTU9ERV9UaWxlOg0KLSAgICAgICAgY2FzZSBGREVfV1JBUE1PREVfVGlsZUZsaXBYOg0KLSAgICAgICAgY2FzZSBGREVfV1JBUE1PREVfVGlsZUZsaXBZOg0KLSAgICAgICAgY2FzZSBGREVfV1JBUE1PREVfVGlsZUZsaXBYWTogew0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCA9IGlXcmFwTW9kZSA9PSBGREVfV1JBUE1PREVfVGlsZUZsaXBYWSB8fCBpV3JhcE1vZGUgPT0gRkRFX1dSQVBNT0RFX1RpbGVGbGlwWDsNCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFkgPSBpV3JhcE1vZGUgPT0gRkRFX1dSQVBNT0RFX1RpbGVGbGlwWFkgfHwgaVdyYXBNb2RlID09IEZERV9XUkFQTU9ERV9UaWxlRmxpcFk7DQotICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCAqcEZsaXBbMl1bMl07DQotICAgICAgICAgICAgICAgIHBGbGlwWzBdWzBdID0gcEJpdG1hcDsNCi0gICAgICAgICAgICAgICAgcEZsaXBbMF1bMV0gPSBiRmxpcFggPyBwQml0bWFwLT5GbGlwSW1hZ2UoVFJVRSwgRkFMU0UpIDogcEJpdG1hcDsNCi0gICAgICAgICAgICAgICAgcEZsaXBbMV1bMF0gPSBiRmxpcFkgPyBwQml0bWFwLT5GbGlwSW1hZ2UoRkFMU0UsIFRSVUUpIDogcEJpdG1hcDsNCi0gICAgICAgICAgICAgICAgcEZsaXBbMV1bMV0gPSAoYkZsaXBYIHx8IGJGbGlwWSkgPyBwQml0bWFwLT5GbGlwSW1hZ2UoYkZsaXBYLCBiRmxpcFkpIDogcEJpdG1hcDsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnRlclkgPSAwOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IHJlY3QudG9wOyBqIDwgcmVjdC5ib3R0b207IGogKz0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXhZID0gaUNvdW50ZXJZKysgJSAyOw0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnRlclggPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSByZWN0LmxlZnQ7IGkgPCByZWN0LnJpZ2h0OyBpICs9IHBCaXRtYXAtPkdldFdpZHRoKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4WCA9IGlDb3VudGVyWCsrICUgMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwRmxpcFtpbmRleFldW2luZGV4WF0sIGksIGopOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChwRmxpcFswXVsxXSAhPSBwRmxpcFswXVswXSkgew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBGbGlwWzBdWzFdOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChwRmxpcFsxXVswXSAhPSBwRmxpcFswXVswXSkgew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBGbGlwWzFdWzBdOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChwRmxpcFsxXVsxXSAhPSBwRmxpcFswXVswXSkgew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBGbGlwWzFdWzFdOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGREVfV1JBUE1PREVfQ2xhbXA6IHsNCi0gICAgICAgICAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocEJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIG1fcERldmljZS0+RW5kUmVuZGVyaW5nKCk7DQotICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbExpbmVhckdyYWRpZW50UGF0aChJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9QYXRoRGF0YSAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBGWFNZU19hc3NlcnQocFBhdGggJiYgcEJydXNoICYmIHBCcnVzaC0+R2V0VHlwZSgpID09IEZERV9CUlVTSFRZUEVfTGluZWFyR3JhZGllbnQpOw0KLSAgICBJRkRFX0xpbmVhckdyYWRpZW50QnJ1c2ggKnBMaW5lYXJCcnVzaCA9IChJRkRFX0xpbmVhckdyYWRpZW50QnJ1c2gqKXBCcnVzaDsNCi0gICAgQ0ZYX1BvaW50RiBwdDAsIHB0MTsNCi0gICAgcExpbmVhckJydXNoLT5HZXRMaW5lYXJQb2ludHMocHQwLCBwdDEpOw0KLSAgICBDRlhfVmVjdG9yRiBmRGlhZ29uYWw7DQotICAgIGZEaWFnb25hbC5TZXQocHQwLCBwdDEpOw0KLSAgICBGWF9GTE9BVCBmVGhldGEgPSBGWFNZU19hdGFuMihmRGlhZ29uYWwueSwgZkRpYWdvbmFsLngpOw0KLSAgICBGWF9GTE9BVCBmTGVuZ3RoID0gZkRpYWdvbmFsLkxlbmd0aCgpOw0KLSAgICBGWF9GTE9BVCBmVG90YWxYID0gZkxlbmd0aCAvIEZYU1lTX2NvcyhmVGhldGEpOw0KLSAgICBGWF9GTE9BVCBmVG90YWxZID0gZkxlbmd0aCAvIEZYU1lTX2NvcyhGWF9QSSAvIDIgLSBmVGhldGEpOw0KLSAgICBGWF9GTE9BVCBmU3RlcHMgPSBGWF9NQVgoZlRvdGFsWCwgZlRvdGFsWSk7DQotICAgIEZYX0ZMT0FUIGR4ID0gZlRvdGFsWCAvIGZTdGVwczsNCi0gICAgRlhfRkxPQVQgZHkgPSBmVG90YWxZIC8gZlN0ZXBzOw0KLSAgICBGWF9BUkdCIGNyMCwgY3IxOw0KLSAgICBwTGluZWFyQnJ1c2gtPkdldExpbmVhckNvbG9ycyhjcjAsIGNyMSk7DQotICAgIEZYX0ZMT0FUIGEwID0gRlhBUkdCX0EoY3IwKTsNCi0gICAgRlhfRkxPQVQgcjAgPSBGWEFSR0JfUihjcjApOw0KLSAgICBGWF9GTE9BVCBnMCA9IEZYQVJHQl9HKGNyMCk7DQotICAgIEZYX0ZMT0FUIGIwID0gRlhBUkdCX0IoY3IwKTsNCi0gICAgRlhfRkxPQVQgZGEgPSAoRlhBUkdCX0EoY3IxKSAtIGEwKSAvIGZTdGVwczsNCi0gICAgRlhfRkxPQVQgZHIgPSAoRlhBUkdCX1IoY3IxKSAtIHIwKSAvIGZTdGVwczsNCi0gICAgRlhfRkxPQVQgZGcgPSAoRlhBUkdCX0coY3IxKSAtIGcwKSAvIGZTdGVwczsNCi0gICAgRlhfRkxPQVQgZGIgPSAoRlhBUkdCX0IoY3IxKSAtIGIwKSAvIGZTdGVwczsNCi0gICAgQ0ZYX0RJQml0bWFwIGJtcDsNCi0gICAgYm1wLkNyZWF0ZShGWFNZU19yb3VuZChGWFNZU19mYWJzKGZEaWFnb25hbC54KSksIEZYU1lTX3JvdW5kKEZYU1lTX2ZhYnMoZkRpYWdvbmFsLnkpKSwgRlhESUJfQXJnYik7DQotICAgIENGWF9GeGdlRGV2aWNlIGRldjsNCi0gICAgZGV2LkF0dGFjaCgmYm1wKTsNCi0gICAgcHQxID0gcHQwOw0KLSAgICBpbnQzMl90IGlTdGVwcyA9IEZYU1lTX3JvdW5kKEZYU1lTX2NlaWwoZlN0ZXBzKSk7DQotICAgIHdoaWxlICgtLWlTdGVwcyA+PSAwKSB7DQotICAgICAgICBjcjAgPSBBcmdiRW5jb2RlKEZYU1lTX3JvdW5kKGEwKSwgRlhTWVNfcm91bmQocjApLCBGWFNZU19yb3VuZChnMCksIEZYU1lTX3JvdW5kKGIwKSk7DQotICAgICAgICBkZXYuRHJhd0Nvc21ldGljTGluZShwdDAueCwgcHQwLnksIHB0MS54LCBwdDEueSwgY3IwKTsNCi0gICAgICAgIHB0MS54ICs9IGR4Ow0KLSAgICAgICAgcHQwLnkgKz0gZHk7DQotICAgICAgICBhMCArPSBkYTsNCi0gICAgICAgIHIwICs9IGRyOw0KLSAgICAgICAgZzAgKz0gZGc7DQotICAgICAgICBiMCArPSBkYjsNCi0gICAgfQ0KLSAgICByZXR1cm4gV3JhcFRleHR1cmUocExpbmVhckJydXNoLT5HZXRXcmFwTW9kZSgpLCAmYm1wLCBwUGF0aCwgcE1hdHJpeCk7DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxMaW5lYXJHcmFkaWVudFBhdGgoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBQYXRoICYmIHBCcnVzaCAmJg0KKyAgICAgICAgICAgICAgIHBCcnVzaC0+R2V0VHlwZSgpID09IEZERV9CUlVTSFRZUEVfTGluZWFyR3JhZGllbnQpOw0KKyAgSUZERV9MaW5lYXJHcmFkaWVudEJydXNoKiBwTGluZWFyQnJ1c2ggPSAoSUZERV9MaW5lYXJHcmFkaWVudEJydXNoKilwQnJ1c2g7DQorICBDRlhfUG9pbnRGIHB0MCwgcHQxOw0KKyAgcExpbmVhckJydXNoLT5HZXRMaW5lYXJQb2ludHMocHQwLCBwdDEpOw0KKyAgQ0ZYX1ZlY3RvckYgZkRpYWdvbmFsOw0KKyAgZkRpYWdvbmFsLlNldChwdDAsIHB0MSk7DQorICBGWF9GTE9BVCBmVGhldGEgPSBGWFNZU19hdGFuMihmRGlhZ29uYWwueSwgZkRpYWdvbmFsLngpOw0KKyAgRlhfRkxPQVQgZkxlbmd0aCA9IGZEaWFnb25hbC5MZW5ndGgoKTsNCisgIEZYX0ZMT0FUIGZUb3RhbFggPSBmTGVuZ3RoIC8gRlhTWVNfY29zKGZUaGV0YSk7DQorICBGWF9GTE9BVCBmVG90YWxZID0gZkxlbmd0aCAvIEZYU1lTX2NvcyhGWF9QSSAvIDIgLSBmVGhldGEpOw0KKyAgRlhfRkxPQVQgZlN0ZXBzID0gRlhfTUFYKGZUb3RhbFgsIGZUb3RhbFkpOw0KKyAgRlhfRkxPQVQgZHggPSBmVG90YWxYIC8gZlN0ZXBzOw0KKyAgRlhfRkxPQVQgZHkgPSBmVG90YWxZIC8gZlN0ZXBzOw0KKyAgRlhfQVJHQiBjcjAsIGNyMTsNCisgIHBMaW5lYXJCcnVzaC0+R2V0TGluZWFyQ29sb3JzKGNyMCwgY3IxKTsNCisgIEZYX0ZMT0FUIGEwID0gRlhBUkdCX0EoY3IwKTsNCisgIEZYX0ZMT0FUIHIwID0gRlhBUkdCX1IoY3IwKTsNCisgIEZYX0ZMT0FUIGcwID0gRlhBUkdCX0coY3IwKTsNCisgIEZYX0ZMT0FUIGIwID0gRlhBUkdCX0IoY3IwKTsNCisgIEZYX0ZMT0FUIGRhID0gKEZYQVJHQl9BKGNyMSkgLSBhMCkgLyBmU3RlcHM7DQorICBGWF9GTE9BVCBkciA9IChGWEFSR0JfUihjcjEpIC0gcjApIC8gZlN0ZXBzOw0KKyAgRlhfRkxPQVQgZGcgPSAoRlhBUkdCX0coY3IxKSAtIGcwKSAvIGZTdGVwczsNCisgIEZYX0ZMT0FUIGRiID0gKEZYQVJHQl9CKGNyMSkgLSBiMCkgLyBmU3RlcHM7DQorICBDRlhfRElCaXRtYXAgYm1wOw0KKyAgYm1wLkNyZWF0ZShGWFNZU19yb3VuZChGWFNZU19mYWJzKGZEaWFnb25hbC54KSksDQorICAgICAgICAgICAgIEZYU1lTX3JvdW5kKEZYU1lTX2ZhYnMoZkRpYWdvbmFsLnkpKSwgRlhESUJfQXJnYik7DQorICBDRlhfRnhnZURldmljZSBkZXY7DQorICBkZXYuQXR0YWNoKCZibXApOw0KKyAgcHQxID0gcHQwOw0KKyAgaW50MzJfdCBpU3RlcHMgPSBGWFNZU19yb3VuZChGWFNZU19jZWlsKGZTdGVwcykpOw0KKyAgd2hpbGUgKC0taVN0ZXBzID49IDApIHsNCisgICAgY3IwID0gQXJnYkVuY29kZShGWFNZU19yb3VuZChhMCksIEZYU1lTX3JvdW5kKHIwKSwgRlhTWVNfcm91bmQoZzApLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKGIwKSk7DQorICAgIGRldi5EcmF3Q29zbWV0aWNMaW5lKHB0MC54LCBwdDAueSwgcHQxLngsIHB0MS55LCBjcjApOw0KKyAgICBwdDEueCArPSBkeDsNCisgICAgcHQwLnkgKz0gZHk7DQorICAgIGEwICs9IGRhOw0KKyAgICByMCArPSBkcjsNCisgICAgZzAgKz0gZGc7DQorICAgIGIwICs9IGRiOw0KKyAgfQ0KKyAgcmV0dXJuIFdyYXBUZXh0dXJlKHBMaW5lYXJCcnVzaC0+R2V0V3JhcE1vZGUoKSwgJmJtcCwgcFBhdGgsIHBNYXRyaXgpOw0KIH0NCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZWRldmljZS5oIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VkZXZpY2UuaAppbmRleCAzOWZhNjI2Li4zMmYwNDVmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZWRldmljZS5oCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlZGV2aWNlLmgKQEAgLTcsNTcgKzcsMTI3IEBACiAjaWZuZGVmIF9GREVfRlhHRURFVklDRV9JTVANCiAjZGVmaW5lIF9GREVfRlhHRURFVklDRV9JTVANCiAjaWZuZGVmIF9GREVQTFVTDQotY2xhc3MgQ0ZERV9GeGdlRGV2aWNlIDogcHVibGljIElGREVfUmVuZGVyRGV2aWNlLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfRnhnZURldmljZShDRlhfUmVuZGVyRGV2aWNlICpwRGV2aWNlLCBGWF9CT09MIGJPd25lckRldmljZSk7DQotICAgIH5DRkRFX0Z4Z2VEZXZpY2UoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KK2NsYXNzIENGREVfRnhnZURldmljZSA6IHB1YmxpYyBJRkRFX1JlbmRlckRldmljZSwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0Z4Z2VEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgRlhfQk9PTCBiT3duZXJEZXZpY2UpOw0KKyAgfkNGREVfRnhnZURldmljZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQogDQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFdpZHRoKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldEhlaWdodCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZERV9IREVWSUNFU1RBVEUJU2F2ZVN0YXRlKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZXN0b3JlU3RhdGUoRkRFX0hERVZJQ0VTVEFURSBoU3RhdGUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0Q2xpcFBhdGgoY29uc3QgSUZERV9QYXRoICpwQ2xpcCk7DQotICAgIHZpcnR1YWwgSUZERV9QYXRoKgkJCUdldENsaXBQYXRoKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCk7DQotICAgIHZpcnR1YWwgY29uc3QgQ0ZYX1JlY3RGJglHZXRDbGlwUmVjdCgpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZHRoKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SGVpZ2h0KCkgY29uc3Q7DQorICB2aXJ0dWFsIEZERV9IREVWSUNFU1RBVEUgU2F2ZVN0YXRlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwUGF0aChjb25zdCBJRkRFX1BhdGgqIHBDbGlwKTsNCisgIHZpcnR1YWwgSUZERV9QYXRoKiBHZXRDbGlwUGF0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKTsNCisgIHZpcnR1YWwgY29uc3QgQ0ZYX1JlY3RGJiBHZXRDbGlwUmVjdCgpOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0RHBpWCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0RHBpWSgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXREcGlYKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldERwaVkoKSBjb25zdDsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdJbWFnZShDRlhfRElCU291cmNlICpwRGliLCBjb25zdCBDRlhfUmVjdEYgKnBTcmNSZWN0LCBjb25zdCBDRlhfUmVjdEYgJmRzdFJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBJbWdNYXRyaXggPSBOVUxMLCBjb25zdCBDRlhfTWF0cml4ICpwRGV2TWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3U3RyaW5nKElGREVfQnJ1c2ggKnBCcnVzaCwgSUZYX0ZvbnQgKnBGb250LCBjb25zdCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIGludDMyX3QgaUNvdW50LCBGWF9GTE9BVCBmRm9udFNpemUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdCZXppZXIoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50RiAmcHQxLCBjb25zdCBDRlhfUG9pbnRGICZwdDIsIGNvbnN0IENGWF9Qb2ludEYgJnB0MywgY29uc3QgQ0ZYX1BvaW50RiAmcHQ0LCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3Q3VydmUoSUZERV9QZW4gKnBQZW4sIEZYX0ZMT0FUIGZQZW5XaWR0aCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgRlhfQk9PTCBiQ2xvc2VkLCBGWF9GTE9BVCBmVGVuc2lvbiA9IDAuNWYsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdFbGxpcHNlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRHJhd0xpbmVzKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURyYXdMaW5lKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9Qb2ludEYgJnB0MSwgY29uc3QgQ0ZYX1BvaW50RiAmcHQyLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3UGF0aChJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBJRkRFX1BhdGggKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3UG9seWdvbihJRkRFX1BlbiAqcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoLCBjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlEcmF3UmVjdGFuZ2xlKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbENsb3NlZEN1cnZlKElGREVfQnJ1c2ggKnBCcnVzaCwgY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGaWxsRWxsaXBzZShJRkRFX0JydXNoKiBwQnJ1c2gsIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmlsbFBhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBJRkRFX1BhdGggKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGaWxsUG9seWdvbihJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbGxSZWN0YW5nbGUoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgRlhfQk9PTAkJCQkJCUZpbGxTb2xpZFBhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUGF0aERhdGEgKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgRlhfQk9PTAkJCQkJCUZpbGxIYXRjaFBhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBjb25zdCBDRlhfUGF0aERhdGEgKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgRlhfQk9PTAkJCQkJCUZpbGxUZXh0dXJlUGF0aChJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9QYXRoRGF0YSAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICBGWF9CT09MCQkJCQkJRmlsbExpbmVhckdyYWRpZW50UGF0aChJRkRFX0JydXNoICpwQnJ1c2gsIGNvbnN0IENGWF9QYXRoRGF0YSAqcFBhdGgsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICBGWF9CT09MCQkJCQkJRHJhd1NvbGlkU3RyaW5nKElGREVfQnJ1c2ggKnBCcnVzaCwgSUZYX0ZvbnQgKnBGb250LCBjb25zdCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIGludDMyX3QgaUNvdW50LCBGWF9GTE9BVCBmRm9udFNpemUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICBGWF9CT09MCQkJCQkJRHJhd1N0cmluZ1BhdGgoSUZERV9CcnVzaCAqcEJydXNoLCBJRlhfRm9udCAqcEZvbnQsIGNvbnN0IEZYVEVYVF9DSEFSUE9TICpwQ2hhclBvcywgaW50MzJfdCBpQ291bnQsIEZYX0ZMT0FUIGZGb250U2l6ZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9CT09MCQkJCQkJQ3JlYXRlUGVuKElGREVfUGVuICpwUGVuLCBGWF9GTE9BVCBmUGVuV2lkdGgsIENGWF9HcmFwaFN0YXRlRGF0YSAmZ3JhcGhTdGF0ZSk7DQotICAgIEZYX0JPT0wJCQkJCQlXcmFwVGV4dHVyZShpbnQzMl90IGlXcmFwTW9kZSwgY29uc3QgQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBjb25zdCBDRlhfUGF0aERhdGEgKnBQYXRoLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgQ0ZYX1JlbmRlckRldmljZQkJCSptX3BEZXZpY2U7DQotICAgIENGWF9SZWN0RgkJCQkJbV9ydENsaXA7DQotICAgIEZYX0JPT0wJCQkJCQltX2JPd25lckRldmljZTsNCi0gICAgRlhURVhUX0NIQVJQT1MJCQkJKm1fcENoYXJQb3M7DQotICAgIGludDMyX3QJCQkJCW1faUNoYXJDb3VudDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcERpYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwU3JjUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1nTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcERldk1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdTdHJpbmcoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqIHBGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0JlemllcihJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3Q3VydmUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xvc2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGVuc2lvbiA9IDAuNWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3RWxsaXBzZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3TGluZXMoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdMaW5lKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3UGF0aChJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSUZERV9QYXRoKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1BvbHlnb24oSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdSZWN0YW5nbGUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbENsb3NlZEN1cnZlKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbEVsbGlwc2UoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFBhdGgoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxQb2x5Z29uKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUmVjdGFuZ2xlKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIEZYX0JPT0wgRmlsbFNvbGlkUGF0aChJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0JPT0wgRmlsbEhhdGNoUGF0aChJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0JPT0wgRmlsbFRleHR1cmVQYXRoKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0JPT0wgRmlsbExpbmVhckdyYWRpZW50UGF0aChJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0JPT0wgRHJhd1NvbGlkU3RyaW5nKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250KiBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9CT09MIERyYXdTdHJpbmdQYXRoKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqIHBGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9CT09MIENyZWF0ZVBlbihJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSYgZ3JhcGhTdGF0ZSk7DQorICBGWF9CT09MIFdyYXBUZXh0dXJlKGludDMyX3QgaVdyYXBNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgQ0ZYX1JlbmRlckRldmljZSogbV9wRGV2aWNlOw0KKyAgQ0ZYX1JlY3RGIG1fcnRDbGlwOw0KKyAgRlhfQk9PTCBtX2JPd25lckRldmljZTsNCisgIEZYVEVYVF9DSEFSUE9TKiBtX3BDaGFyUG9zOw0KKyAgaW50MzJfdCBtX2lDaGFyQ291bnQ7DQogfTsNCiAjZW5kaWYNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZW9iamVjdC5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZW9iamVjdC5jcHAKaW5kZXggZTE5OWEzYS4uMDFlY2QxZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VvYmplY3QuY3BwCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlb2JqZWN0LmNwcApAQCAtOCwyNjMgKzgsMjYwIEBACiAjaW5jbHVkZSAiZmRlX29iamVjdC5oIg0KICNpbmNsdWRlICJmZGVfZ2VvYmplY3QuaCINCiAjaWZuZGVmIF9GREVQTFVTDQotSUZERV9QYXRoKiBJRkRFX1BhdGg6OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gbmV3IENGREVfUGF0aDsNCitJRkRFX1BhdGgqIElGREVfUGF0aDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRkRFX1BhdGg7DQogfQ0KLUZYX0JPT0wgQ0ZERV9QYXRoOjpTdGFydEZpZ3VyZSgpDQotew0KLSAgICByZXR1cm4gQ2xvc2VGaWd1cmUoKTsNCitGWF9CT09MIENGREVfUGF0aDo6U3RhcnRGaWd1cmUoKSB7DQorICByZXR1cm4gQ2xvc2VGaWd1cmUoKTsNCiB9DQotRlhfQk9PTCBDRkRFX1BhdGg6OkNsb3NlRmlndXJlKCkNCi17DQotICAgIEZYX1BBVEhQT0lOVCAqcFBvaW50ID0gR2V0TGFzdFBvaW50KCk7DQotICAgIGlmIChwUG9pbnQpIHsNCi0gICAgICAgIHBQb2ludC0+bV9GbGFnIHw9IEZYUFRfQ0xPU0VGSUdVUkU7DQorRlhfQk9PTCBDRkRFX1BhdGg6OkNsb3NlRmlndXJlKCkgew0KKyAgRlhfUEFUSFBPSU5UKiBwUG9pbnQgPSBHZXRMYXN0UG9pbnQoKTsNCisgIGlmIChwUG9pbnQpIHsNCisgICAgcFBvaW50LT5tX0ZsYWcgfD0gRlhQVF9DTE9TRUZJR1VSRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9QQVRIUE9JTlQqIENGREVfUGF0aDo6R2V0TGFzdFBvaW50KGludDMyX3QgaUNvdW50KSBjb25zdCB7DQorICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3QgaVBvaW50cyA9IG1fUGF0aC5HZXRQb2ludENvdW50KCk7DQorICBpZiAoaUNvdW50ID4gaVBvaW50cykgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBtX1BhdGguR2V0UG9pbnRzKCkgKyBpUG9pbnRzIC0gaUNvdW50Ow0KK30NCitGWF9CT09MIENGREVfUGF0aDo6RmlndXJlQ2xvc2VkKCkgY29uc3Qgew0KKyAgRlhfUEFUSFBPSU5UKiBwUG9pbnQgPSBHZXRMYXN0UG9pbnQoKTsNCisgIHJldHVybiBwUG9pbnQgPyAocFBvaW50LT5tX0ZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSA6IFRSVUU7DQorfQ0KK0ZYX1BBVEhQT0lOVCogQ0ZERV9QYXRoOjpBZGRQb2ludHMoaW50MzJfdCBpQ291bnQpIHsNCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBpUG9pbnRzID0gbV9QYXRoLkdldFBvaW50Q291bnQoKTsNCisgIG1fUGF0aC5BZGRQb2ludENvdW50KGlDb3VudCk7DQorICByZXR1cm4gbV9QYXRoLkdldFBvaW50cygpICsgaVBvaW50czsNCit9DQordm9pZCBDRkRFX1BhdGg6Ok1vdmVUbyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIEZYX1BBVEhQT0lOVCogcFBvaW50ID0gQWRkUG9pbnRzKDEpOw0KKyAgcFBvaW50LT5tX1BvaW50WCA9IGZ4Ow0KKyAgcFBvaW50LT5tX1BvaW50WSA9IGZ5Ow0KKyAgcFBvaW50LT5tX0ZsYWcgPSBGWFBUX01PVkVUTzsNCit9DQordm9pZCBDRkRFX1BhdGg6OkxpbmVUbyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIEZYX1BBVEhQT0lOVCogcFBvaW50ID0gQWRkUG9pbnRzKDEpOw0KKyAgcFBvaW50LT5tX1BvaW50WCA9IGZ4Ow0KKyAgcFBvaW50LT5tX1BvaW50WSA9IGZ5Ow0KKyAgcFBvaW50LT5tX0ZsYWcgPSBGWFBUX0xJTkVUTzsNCit9DQordm9pZCBDRkRFX1BhdGg6OkJlemllclRvKGNvbnN0IENGWF9Qb2ludEYmIHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcDMpIHsNCisgIEZYX1BBVEhQT0lOVCogcCA9IEFkZFBvaW50cygzKTsNCisgIHBbMF0ubV9Qb2ludFggPSBwMS54Ow0KKyAgcFswXS5tX1BvaW50WSA9IHAxLnk7DQorICBwWzBdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87DQorICBwWzFdLm1fUG9pbnRYID0gcDIueDsNCisgIHBbMV0ubV9Qb2ludFkgPSBwMi55Ow0KKyAgcFsxXS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOw0KKyAgcFsyXS5tX1BvaW50WCA9IHAzLng7DQorICBwWzJdLm1fUG9pbnRZID0gcDMueTsNCisgIHBbMl0ubV9GbGFnID0gRlhQVF9CRVpJRVJUTzsNCit9DQordm9pZCBDRkRFX1BhdGg6OkFyY1RvKEZYX0JPT0wgYlN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZEFuZ2xlKSB7DQorICBGWF9GTE9BVCByeCA9IHJlY3Qud2lkdGggLyAyOw0KKyAgRlhfRkxPQVQgcnkgPSByZWN0LmhlaWdodCAvIDI7DQorICBGWF9GTE9BVCBjeCA9IHJlY3QubGVmdCArIHJ4Ow0KKyAgRlhfRkxPQVQgY3kgPSByZWN0LnRvcCArIHJ5Ow0KKyAgRlhfRkxPQVQgYWxwaGEgPQ0KKyAgICAgIEZYU1lTX2F0YW4yKHJ4ICogRlhTWVNfc2luKHN0YXJ0QW5nbGUpLCByeSAqIEZYU1lTX2NvcyhzdGFydEFuZ2xlKSk7DQorICBGWF9GTE9BVCBiZXRhID0NCisgICAgICBGWFNZU19hdGFuMihyeCAqIEZYU1lTX3NpbihlbmRBbmdsZSksIHJ5ICogRlhTWVNfY29zKGVuZEFuZ2xlKSk7DQorICBpZiAoRlhTWVNfZmFicyhiZXRhIC0gYWxwaGEpID4gRlhfUEkpIHsNCisgICAgaWYgKGJldGEgPiBhbHBoYSkgew0KKyAgICAgIGJldGEgLT0gMiAqIEZYX1BJOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGFscGhhIC09IDIgKiBGWF9QSTsNCiAgICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIEZYX0ZMT0FUIGhhbGZfZGVsdGEgPSAoYmV0YSAtIGFscGhhKSAvIDI7DQorICBGWF9GTE9BVCBiY3AgPSA0LjBmIC8gMyAqICgxIC0gRlhTWVNfY29zKGhhbGZfZGVsdGEpKSAvIEZYU1lTX3NpbihoYWxmX2RlbHRhKTsNCisgIEZYX0ZMT0FUIHNpbl9hbHBoYSA9IEZYU1lTX3NpbihhbHBoYSk7DQorICBGWF9GTE9BVCBzaW5fYmV0YSA9IEZYU1lTX3NpbihiZXRhKTsNCisgIEZYX0ZMT0FUIGNvc19hbHBoYSA9IEZYU1lTX2NvcyhhbHBoYSk7DQorICBGWF9GTE9BVCBjb3NfYmV0YSA9IEZYU1lTX2NvcyhiZXRhKTsNCisgIGlmIChiU3RhcnQpIHsNCisgICAgQ0ZYX1BvaW50RiBwMDsNCisgICAgcDAuU2V0KGN4ICsgcnggKiBjb3NfYWxwaGEsIGN5ICsgcnkgKiBzaW5fYWxwaGEpOw0KKyAgICBNb3ZlVG8ocDApOw0KKyAgfQ0KKyAgQ0ZYX1BvaW50RiBwMTsNCisgIHAxLlNldChjeCArIHJ4ICogKGNvc19hbHBoYSAtIGJjcCAqIHNpbl9hbHBoYSksDQorICAgICAgICAgY3kgKyByeSAqIChzaW5fYWxwaGEgKyBiY3AgKiBjb3NfYWxwaGEpKTsNCisgIENGWF9Qb2ludEYgcDI7DQorICBwMi5TZXQoY3ggKyByeCAqIChjb3NfYmV0YSArIGJjcCAqIHNpbl9iZXRhKSwNCisgICAgICAgICBjeSArIHJ5ICogKHNpbl9iZXRhIC0gYmNwICogY29zX2JldGEpKTsNCisgIENGWF9Qb2ludEYgcDM7DQorICBwMy5TZXQoY3ggKyByeCAqIGNvc19iZXRhLCBjeSArIHJ5ICogc2luX2JldGEpOw0KKyAgQmV6aWVyVG8ocDEsIHAyLCBwMyk7DQogfQ0KLUZYX1BBVEhQT0lOVCogQ0ZERV9QYXRoOjpHZXRMYXN0UG9pbnQoaW50MzJfdCBpQ291bnQgKSBjb25zdA0KLXsNCi0gICAgaWYgKGlDb3VudCA8IDEpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KK3ZvaWQgQ0ZERV9QYXRoOjpBZGRCZXppZXIoY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cykgew0KKyAgaWYgKHBvaW50cy5HZXRTaXplKCkgIT0gNCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9MUENQT0lOVEYgcCA9IHBvaW50cy5HZXREYXRhKCk7DQorICBNb3ZlVG8ocFswXSk7DQorICBCZXppZXJUbyhwWzFdLCBwWzJdLCBwWzNdKTsNCit9DQordm9pZCBDRkRFX1BhdGg6OkFkZEJlemllcnMoY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cykgew0KKyAgaW50MzJfdCBpQ291bnQgPSBwb2ludHMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlDb3VudCA8IDQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfTFBDUE9JTlRGIHAgPSBwb2ludHMuR2V0RGF0YSgpOw0KKyAgRlhfTFBDUE9JTlRGIHBFbmQgPSBwICsgaUNvdW50Ow0KKyAgTW92ZVRvKHBbMF0pOw0KKyAgZm9yICgrK3A7IHAgPD0gcEVuZCAtIDM7IHAgKz0gMykgew0KKyAgICBCZXppZXJUbyhwWzBdLCBwWzFdLCBwWzJdKTsNCisgIH0NCit9DQordm9pZCBDRkRFX1BhdGg6OkdldEN1cnZlVGFuZ2VudHMoY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRzRiYgdGFuZ2VudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xvc2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IHBvaW50cy5HZXRTaXplKCk7DQorICB0YW5nZW50cy5TZXRTaXplKGlDb3VudCk7DQorICBpZiAoaUNvdW50IDwgMykgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCBmQ29lZmZpY2llbnQgPSBmVGVuc2lvbiAvIDMuMGY7DQorICBGWF9MUENQT0lOVEYgcFBvaW50cyA9IHBvaW50cy5HZXREYXRhKCk7DQorICBGWF9MUFBPSU5URiBwVGFuZ2VudHMgPSB0YW5nZW50cy5HZXREYXRhKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgew0KKyAgICBpbnQzMl90IHIgPSBpICsgMTsNCisgICAgaW50MzJfdCBzID0gaSAtIDE7DQorICAgIGlmIChyID49IGlDb3VudCkgew0KKyAgICAgIHIgPSBiQ2xvc2VkID8gKHIgLSBpQ291bnQpIDogKGlDb3VudCAtIDEpOw0KICAgICB9DQotICAgIGludDMyX3QgaVBvaW50cyA9IG1fUGF0aC5HZXRQb2ludENvdW50KCk7DQotICAgIGlmIChpQ291bnQgPiBpUG9pbnRzKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgaWYgKHMgPCAwKSB7DQorICAgICAgcyA9IGJDbG9zZWQgPyAocyArIGlDb3VudCkgOiAwOw0KICAgICB9DQotICAgIHJldHVybiBtX1BhdGguR2V0UG9pbnRzKCkgKyBpUG9pbnRzIC0gaUNvdW50Ow0KKyAgICBwVGFuZ2VudHNbaV0ueCArPSAoZkNvZWZmaWNpZW50ICogKHBQb2ludHNbcl0ueCAtIHBQb2ludHNbc10ueCkpOw0KKyAgICBwVGFuZ2VudHNbaV0ueSArPSAoZkNvZWZmaWNpZW50ICogKHBQb2ludHNbcl0ueSAtIHBQb2ludHNbc10ueSkpOw0KKyAgfQ0KIH0NCi1GWF9CT09MIENGREVfUGF0aDo6RmlndXJlQ2xvc2VkKCkgY29uc3QNCi17DQotICAgIEZYX1BBVEhQT0lOVCAqcFBvaW50ID0gR2V0TGFzdFBvaW50KCk7DQotICAgIHJldHVybiBwUG9pbnQgPyAocFBvaW50LT5tX0ZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSA6IFRSVUU7DQotfQ0KLUZYX1BBVEhQT0lOVCogQ0ZERV9QYXRoOjpBZGRQb2ludHMoaW50MzJfdCBpQ291bnQpDQotew0KLSAgICBpZiAoaUNvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaW50MzJfdCBpUG9pbnRzID0gbV9QYXRoLkdldFBvaW50Q291bnQoKTsNCi0gICAgbV9QYXRoLkFkZFBvaW50Q291bnQoaUNvdW50KTsNCi0gICAgcmV0dXJuIG1fUGF0aC5HZXRQb2ludHMoKSArIGlQb2ludHM7DQotfQ0KLXZvaWQgQ0ZERV9QYXRoOjpNb3ZlVG8oRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgRlhfUEFUSFBPSU5UICpwUG9pbnQgPSBBZGRQb2ludHMoMSk7DQotICAgIHBQb2ludC0+bV9Qb2ludFggPSBmeDsNCi0gICAgcFBvaW50LT5tX1BvaW50WSA9IGZ5Ow0KLSAgICBwUG9pbnQtPm1fRmxhZyA9IEZYUFRfTU9WRVRPOw0KLX0NCi12b2lkIENGREVfUGF0aDo6TGluZVRvKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIEZYX1BBVEhQT0lOVCAqcFBvaW50ID0gQWRkUG9pbnRzKDEpOw0KLSAgICBwUG9pbnQtPm1fUG9pbnRYID0gZng7DQotICAgIHBQb2ludC0+bV9Qb2ludFkgPSBmeTsNCi0gICAgcFBvaW50LT5tX0ZsYWcgPSBGWFBUX0xJTkVUTzsNCi19DQotdm9pZCBDRkRFX1BhdGg6OkJlemllclRvKGNvbnN0IENGWF9Qb2ludEYgJnAxLCBjb25zdCBDRlhfUG9pbnRGICZwMiwgY29uc3QgQ0ZYX1BvaW50RiAmcDMpDQotew0KLSAgICBGWF9QQVRIUE9JTlQgKnAgPSBBZGRQb2ludHMoMyk7DQotICAgIHBbMF0ubV9Qb2ludFggPSBwMS54Ow0KLSAgICBwWzBdLm1fUG9pbnRZID0gcDEueTsNCi0gICAgcFswXS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOw0KLSAgICBwWzFdLm1fUG9pbnRYID0gcDIueDsNCi0gICAgcFsxXS5tX1BvaW50WSA9IHAyLnk7DQotICAgIHBbMV0ubV9GbGFnID0gRlhQVF9CRVpJRVJUTzsNCi0gICAgcFsyXS5tX1BvaW50WCA9IHAzLng7DQotICAgIHBbMl0ubV9Qb2ludFkgPSBwMy55Ow0KLSAgICBwWzJdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87DQotfQ0KLXZvaWQgQ0ZERV9QYXRoOjpBcmNUbyhGWF9CT09MIGJTdGFydCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBGWF9GTE9BVCBzdGFydEFuZ2xlLCBGWF9GTE9BVCBlbmRBbmdsZSkNCi17DQotICAgIEZYX0ZMT0FUIHJ4ID0gcmVjdC53aWR0aCAvIDI7DQotICAgIEZYX0ZMT0FUIHJ5ID0gcmVjdC5oZWlnaHQgLyAyOw0KLSAgICBGWF9GTE9BVCBjeCA9IHJlY3QubGVmdCArIHJ4Ow0KLSAgICBGWF9GTE9BVCBjeSA9IHJlY3QudG9wICsgcnk7DQotICAgIEZYX0ZMT0FUIGFscGhhID0gRlhTWVNfYXRhbjIocnggKiBGWFNZU19zaW4oc3RhcnRBbmdsZSksIHJ5ICogRlhTWVNfY29zKHN0YXJ0QW5nbGUpKTsNCi0gICAgRlhfRkxPQVQgYmV0YSA9IEZYU1lTX2F0YW4yKHJ4ICogRlhTWVNfc2luKGVuZEFuZ2xlKSwgcnkgKiBGWFNZU19jb3MoZW5kQW5nbGUpKTsNCi0gICAgaWYgKEZYU1lTX2ZhYnMoYmV0YSAtIGFscGhhKSA+IEZYX1BJKSB7DQotICAgICAgICBpZiAoYmV0YSA+IGFscGhhKSB7DQotICAgICAgICAgICAgYmV0YSAtPSAyICogRlhfUEk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGFscGhhIC09IDIgKiBGWF9QSTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBoYWxmX2RlbHRhID0gKGJldGEgLSBhbHBoYSkgLyAyOw0KLSAgICBGWF9GTE9BVCBiY3AgPSA0LjBmIC8gMyAqICgxIC0gRlhTWVNfY29zKGhhbGZfZGVsdGEpKSAvIEZYU1lTX3NpbihoYWxmX2RlbHRhKTsNCi0gICAgRlhfRkxPQVQgc2luX2FscGhhID0gRlhTWVNfc2luKGFscGhhKTsNCi0gICAgRlhfRkxPQVQgc2luX2JldGEgPSBGWFNZU19zaW4oYmV0YSk7DQotICAgIEZYX0ZMT0FUIGNvc19hbHBoYSA9IEZYU1lTX2NvcyhhbHBoYSk7DQotICAgIEZYX0ZMT0FUIGNvc19iZXRhID0gRlhTWVNfY29zKGJldGEpOw0KLSAgICBpZiAoYlN0YXJ0KSB7DQotICAgICAgICBDRlhfUG9pbnRGIHAwOw0KLSAgICAgICAgcDAuU2V0KGN4ICsgcnggKiBjb3NfYWxwaGEsIGN5ICsgcnkgKiBzaW5fYWxwaGEpOw0KLSAgICAgICAgTW92ZVRvKHAwKTsNCi0gICAgfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpBZGRDdXJ2ZShjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbG9zZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uKSB7DQorICBpbnQzMl90IGlMYXN0ID0gcG9pbnRzLkdldFVwcGVyQm91bmQoKTsNCisgIGlmIChpTGFzdCA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1BvaW50c0YgdGFuZ2VudHM7DQorICBHZXRDdXJ2ZVRhbmdlbnRzKHBvaW50cywgdGFuZ2VudHMsIGJDbG9zZWQsIGZUZW5zaW9uKTsNCisgIEZYX0xQQ1BPSU5URiBwUG9pbnRzID0gcG9pbnRzLkdldERhdGEoKTsNCisgIEZYX0xQUE9JTlRGIHBUYW5nZW50cyA9IHRhbmdlbnRzLkdldERhdGEoKTsNCisgIE1vdmVUbyhwUG9pbnRzWzBdKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMYXN0OyArK2kpIHsNCisgICAgaW50MzJfdCBqID0gaSArIDE7DQogICAgIENGWF9Qb2ludEYgcDE7DQotICAgIHAxLlNldChjeCArIHJ4ICogKGNvc19hbHBoYSAtIGJjcCAqIHNpbl9hbHBoYSksIGN5ICsgcnkgKiAoc2luX2FscGhhICsgYmNwICogY29zX2FscGhhKSk7DQorICAgIHAxLlNldChwUG9pbnRzW2ldLnggKyBwVGFuZ2VudHNbaV0ueCwgcFBvaW50c1tpXS55ICsgcFRhbmdlbnRzW2ldLnkpOw0KICAgICBDRlhfUG9pbnRGIHAyOw0KLSAgICBwMi5TZXQoY3ggKyByeCAqIChjb3NfYmV0YSArIGJjcCAqIHNpbl9iZXRhKSwgY3kgKyByeSAqIChzaW5fYmV0YSAtIGJjcCAqIGNvc19iZXRhKSk7DQorICAgIHAyLlNldChwUG9pbnRzW2pdLnggLSBwVGFuZ2VudHNbal0ueCwgcFBvaW50c1tqXS55IC0gcFRhbmdlbnRzW2pdLnkpOw0KICAgICBDRlhfUG9pbnRGIHAzOw0KLSAgICBwMy5TZXQoY3ggKyByeCAqIGNvc19iZXRhLCBjeSArIHJ5ICogc2luX2JldGEpOw0KKyAgICBwMy5TZXQocFBvaW50c1tqXS54LCBwUG9pbnRzW2pdLnkpOw0KICAgICBCZXppZXJUbyhwMSwgcDIsIHAzKTsNCi19DQotdm9pZCBDRkRFX1BhdGg6OkFkZEJlemllcihjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzKQ0KLXsNCi0gICAgaWYgKHBvaW50cy5HZXRTaXplKCkgIT0gNCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0xQQ1BPSU5URiBwID0gcG9pbnRzLkdldERhdGEoKTsNCi0gICAgTW92ZVRvKHBbMF0pOw0KLSAgICBCZXppZXJUbyhwWzFdLCBwWzJdLCBwWzNdKTsNCi19DQotdm9pZCBDRkRFX1BhdGg6OkFkZEJlemllcnMoY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cykNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gcG9pbnRzLkdldFNpemUoKTsNCi0gICAgaWYgKGlDb3VudCA8IDQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9MUENQT0lOVEYgcCA9IHBvaW50cy5HZXREYXRhKCk7DQotICAgIEZYX0xQQ1BPSU5URiBwRW5kID0gcCArIGlDb3VudDsNCi0gICAgTW92ZVRvKHBbMF0pOw0KLSAgICBmb3IgKCsrcDsgcCA8PSBwRW5kIC0gMzsgcCArPSAzKSB7DQotICAgICAgICBCZXppZXJUbyhwWzBdLCBwWzFdLCBwWzJdKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGREVfUGF0aDo6R2V0Q3VydmVUYW5nZW50cyhjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBDRlhfUG9pbnRzRiAmdGFuZ2VudHMsIEZYX0JPT0wgYkNsb3NlZCwgRlhfRkxPQVQgZlRlbnNpb24pIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IHBvaW50cy5HZXRTaXplKCk7DQotICAgIHRhbmdlbnRzLlNldFNpemUoaUNvdW50KTsNCi0gICAgaWYgKGlDb3VudCA8IDMpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmQ29lZmZpY2llbnQgPSBmVGVuc2lvbiAvIDMuMGY7DQotICAgIEZYX0xQQ1BPSU5URiBwUG9pbnRzID0gcG9pbnRzLkdldERhdGEoKTsNCi0gICAgRlhfTFBQT0lOVEYgcFRhbmdlbnRzID0gdGFuZ2VudHMuR2V0RGF0YSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgew0KLSAgICAgICAgaW50MzJfdCByID0gaSArIDE7DQotICAgICAgICBpbnQzMl90IHMgPSBpIC0gMTsNCi0gICAgICAgIGlmIChyID49IGlDb3VudCkgew0KLSAgICAgICAgICAgIHIgPSBiQ2xvc2VkID8gKHIgLSBpQ291bnQpIDogKGlDb3VudCAtIDEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHMgPCAwKSB7DQotICAgICAgICAgICAgcyA9IGJDbG9zZWQgPyAocyArIGlDb3VudCkgOiAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFRhbmdlbnRzW2ldLnggKz0gKGZDb2VmZmljaWVudCAqIChwUG9pbnRzW3JdLnggLSBwUG9pbnRzW3NdLngpKTsNCi0gICAgICAgIHBUYW5nZW50c1tpXS55ICs9IChmQ29lZmZpY2llbnQgKiAocFBvaW50c1tyXS55IC0gcFBvaW50c1tzXS55KSk7DQotICAgIH0NCi19DQotdm9pZCBDRkRFX1BhdGg6OkFkZEN1cnZlKGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMsIEZYX0JPT0wgYkNsb3NlZCwgRlhfRkxPQVQgZlRlbnNpb24pDQotew0KLSAgICBpbnQzMl90IGlMYXN0ID0gcG9pbnRzLkdldFVwcGVyQm91bmQoKTsNCi0gICAgaWYgKGlMYXN0IDwgMSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9Qb2ludHNGIHRhbmdlbnRzOw0KLSAgICBHZXRDdXJ2ZVRhbmdlbnRzKHBvaW50cywgdGFuZ2VudHMsIGJDbG9zZWQsIGZUZW5zaW9uKTsNCi0gICAgRlhfTFBDUE9JTlRGIHBQb2ludHMgPSBwb2ludHMuR2V0RGF0YSgpOw0KLSAgICBGWF9MUFBPSU5URiBwVGFuZ2VudHMgPSB0YW5nZW50cy5HZXREYXRhKCk7DQotICAgIE1vdmVUbyhwUG9pbnRzWzBdKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxhc3Q7ICsraSkgew0KLSAgICAgICAgaW50MzJfdCBqID0gaSArIDE7DQotICAgICAgICBDRlhfUG9pbnRGIHAxOw0KLSAgICAgICAgcDEuU2V0KHBQb2ludHNbaV0ueCArIHBUYW5nZW50c1tpXS54LCBwUG9pbnRzW2ldLnkgKyBwVGFuZ2VudHNbaV0ueSk7DQotICAgICAgICBDRlhfUG9pbnRGIHAyOw0KLSAgICAgICAgcDIuU2V0KHBQb2ludHNbal0ueCAtIHBUYW5nZW50c1tqXS54LCBwUG9pbnRzW2pdLnkgLSBwVGFuZ2VudHNbal0ueSk7DQotICAgICAgICBDRlhfUG9pbnRGIHAzOw0KLSAgICAgICAgcDMuU2V0KHBQb2ludHNbal0ueCwgcFBvaW50c1tqXS55KTsNCi0gICAgICAgIEJlemllclRvKHAxLCBwMiwgcDMpOw0KLSAgICB9DQotICAgIGlmIChiQ2xvc2VkKSB7DQotICAgICAgICBDRlhfUG9pbnRGIHAxOw0KLSAgICAgICAgcDEuU2V0KHBQb2ludHNbaUxhc3RdLnggKyBwVGFuZ2VudHNbaUxhc3RdLngsIHBQb2ludHNbaUxhc3RdLnkgKyBwVGFuZ2VudHNbaUxhc3RdLnkpOw0KLSAgICAgICAgQ0ZYX1BvaW50RiBwMjsNCi0gICAgICAgIHAyLlNldChwUG9pbnRzWzBdLnggLSBwVGFuZ2VudHNbMF0ueCwgcFBvaW50c1swXS55IC0gcFRhbmdlbnRzWzBdLnkpOw0KLSAgICAgICAgQ0ZYX1BvaW50RiBwMzsNCi0gICAgICAgIHAzLlNldChwUG9pbnRzWzBdLngsIHBQb2ludHNbMF0ueSk7DQotICAgICAgICBCZXppZXJUbyhwMSwgcDIsIHAzKTsNCi0gICAgICAgIENsb3NlRmlndXJlKCk7DQotICAgIH0NCi19DQotdm9pZCBDRkRFX1BhdGg6OkFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgRlhfRkxPQVQgZlN0YXJ0QW5nbGUgPSAwOw0KLSAgICBGWF9GTE9BVCBmRW5kQW5nbGUgPSBGWF9QSSAvIDI7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgew0KLSAgICAgICAgQXJjVG8oaSA9PSAwLCByZWN0LCBmU3RhcnRBbmdsZSwgZkVuZEFuZ2xlKTsNCi0gICAgICAgIGZTdGFydEFuZ2xlICs9IEZYX1BJIC8gMjsNCi0gICAgICAgIGZFbmRBbmdsZSArPSBGWF9QSSAvIDI7DQotICAgIH0NCisgIH0NCisgIGlmIChiQ2xvc2VkKSB7DQorICAgIENGWF9Qb2ludEYgcDE7DQorICAgIHAxLlNldChwUG9pbnRzW2lMYXN0XS54ICsgcFRhbmdlbnRzW2lMYXN0XS54LA0KKyAgICAgICAgICAgcFBvaW50c1tpTGFzdF0ueSArIHBUYW5nZW50c1tpTGFzdF0ueSk7DQorICAgIENGWF9Qb2ludEYgcDI7DQorICAgIHAyLlNldChwUG9pbnRzWzBdLnggLSBwVGFuZ2VudHNbMF0ueCwgcFBvaW50c1swXS55IC0gcFRhbmdlbnRzWzBdLnkpOw0KKyAgICBDRlhfUG9pbnRGIHAzOw0KKyAgICBwMy5TZXQocFBvaW50c1swXS54LCBwUG9pbnRzWzBdLnkpOw0KKyAgICBCZXppZXJUbyhwMSwgcDIsIHAzKTsNCiAgICAgQ2xvc2VGaWd1cmUoKTsNCisgIH0NCiB9DQotdm9pZCBDRkRFX1BhdGg6OkFkZExpbmUoY29uc3QgQ0ZYX1BvaW50RiAmcHQxLCBjb25zdCBDRlhfUG9pbnRGICZwdDIpDQotew0KLSAgICBGWF9QQVRIUE9JTlQgKnBMYXN0ID0gR2V0TGFzdFBvaW50KCk7DQotICAgIGlmIChwTGFzdCA9PSBOVUxMIHx8IEZYU1lTX2ZhYnMocExhc3QtPm1fUG9pbnRYIC0gcHQxLngpID4gMC4wMDEgfHwgRlhTWVNfZmFicyhwTGFzdC0+bV9Qb2ludFkgLSBwdDEueSkgPiAwLjAwMSkgew0KLSAgICAgICAgTW92ZVRvKHB0MSk7DQotICAgIH0NCi0gICAgTGluZVRvKHB0Mik7DQordm9pZCBDRkRFX1BhdGg6OkFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBGWF9GTE9BVCBmU3RhcnRBbmdsZSA9IDA7DQorICBGWF9GTE9BVCBmRW5kQW5nbGUgPSBGWF9QSSAvIDI7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsNCisgICAgQXJjVG8oaSA9PSAwLCByZWN0LCBmU3RhcnRBbmdsZSwgZkVuZEFuZ2xlKTsNCisgICAgZlN0YXJ0QW5nbGUgKz0gRlhfUEkgLyAyOw0KKyAgICBmRW5kQW5nbGUgKz0gRlhfUEkgLyAyOw0KKyAgfQ0KKyAgQ2xvc2VGaWd1cmUoKTsNCiB9DQotdm9pZCBDRkRFX1BhdGg6OkFkZFBhdGgoY29uc3QgSUZERV9QYXRoICpwU3JjLCBGWF9CT09MIGJDb25uZWN0KQ0KLXsNCi0gICAgQ0ZERV9QYXRoICpwUGF0aCA9IChDRkRFX1BhdGgqKXBTcmM7DQotICAgIGlmIChwUGF0aCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBpQ291bnQgPSBwUGF0aC0+bV9QYXRoLkdldFBvaW50Q291bnQoKTsNCi0gICAgaWYgKGlDb3VudCA8IDEpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoYkNvbm5lY3QpIHsNCi0gICAgICAgIExpbmVUbyhwUGF0aC0+bV9QYXRoLkdldFBvaW50WCgwKSwgcFBhdGgtPm1fUGF0aC5HZXRQb2ludFkoMCkpOw0KLSAgICB9DQotICAgIG1fUGF0aC5BcHBlbmQoJnBQYXRoLT5tX1BhdGgsIE5VTEwpOw0KK3ZvaWQgQ0ZERV9QYXRoOjpBZGRMaW5lKGNvbnN0IENGWF9Qb2ludEYmIHB0MSwgY29uc3QgQ0ZYX1BvaW50RiYgcHQyKSB7DQorICBGWF9QQVRIUE9JTlQqIHBMYXN0ID0gR2V0TGFzdFBvaW50KCk7DQorICBpZiAocExhc3QgPT0gTlVMTCB8fCBGWFNZU19mYWJzKHBMYXN0LT5tX1BvaW50WCAtIHB0MS54KSA+IDAuMDAxIHx8DQorICAgICAgRlhTWVNfZmFicyhwTGFzdC0+bV9Qb2ludFkgLSBwdDEueSkgPiAwLjAwMSkgew0KKyAgICBNb3ZlVG8ocHQxKTsNCisgIH0NCisgIExpbmVUbyhwdDIpOw0KIH0NCi12b2lkIENGREVfUGF0aDo6QWRkUG9seWdvbihjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBwb2ludHMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaUNvdW50IDwgMikgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEFkZExpbmVzKHBvaW50cyk7DQotICAgIEZYX0xQQ1BPSU5URiBwID0gcG9pbnRzLkdldERhdGEoKTsNCi0gICAgaWYgKEZYU1lTX2ZhYnMocFswXS54IC0gcFtpQ291bnQgLSAxXS54KSA8IDAuMDFmIHx8IEZYU1lTX2ZhYnMocFswXS55IC0gcFtpQ291bnQgLSAxXS55KSA8IDAuMDFmKSB7DQotICAgICAgICBMaW5lVG8ocFswXSk7DQotICAgIH0NCi0gICAgQ2xvc2VGaWd1cmUoKTsNCit2b2lkIENGREVfUGF0aDo6QWRkUGF0aChjb25zdCBJRkRFX1BhdGgqIHBTcmMsIEZYX0JPT0wgYkNvbm5lY3QpIHsNCisgIENGREVfUGF0aCogcFBhdGggPSAoQ0ZERV9QYXRoKilwU3JjOw0KKyAgaWYgKHBQYXRoID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSBwUGF0aC0+bV9QYXRoLkdldFBvaW50Q291bnQoKTsNCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiQ29ubmVjdCkgew0KKyAgICBMaW5lVG8ocFBhdGgtPm1fUGF0aC5HZXRQb2ludFgoMCksIHBQYXRoLT5tX1BhdGguR2V0UG9pbnRZKDApKTsNCisgIH0NCisgIG1fUGF0aC5BcHBlbmQoJnBQYXRoLT5tX1BhdGgsIE5VTEwpOw0KIH0NCi12b2lkIENGREVfUGF0aDo6QWRkTGluZXMoY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cykNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gcG9pbnRzLkdldFNpemUoKTsNCi0gICAgaWYgKGlDb3VudCA8IDIpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9MUENQT0lOVEYgcCA9IHBvaW50cy5HZXREYXRhKCk7DQotICAgIEZYX0xQQ1BPSU5URiBwRW5kID0gcCArIGlDb3VudDsNCi0gICAgTW92ZVRvKHBbMF0pOw0KLSAgICBmb3IgKCsrcDsgcCA8IHBFbmQ7ICsrcCkgew0KLSAgICAgICAgTGluZVRvKCpwKTsNCi0gICAgfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpBZGRQb2x5Z29uKGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMpIHsNCisgIGludDMyX3QgaUNvdW50ID0gcG9pbnRzLkdldFNpemUoKTsNCisgIGlmIChpQ291bnQgPCAyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEFkZExpbmVzKHBvaW50cyk7DQorICBGWF9MUENQT0lOVEYgcCA9IHBvaW50cy5HZXREYXRhKCk7DQorICBpZiAoRlhTWVNfZmFicyhwWzBdLnggLSBwW2lDb3VudCAtIDFdLngpIDwgMC4wMWYgfHwNCisgICAgICBGWFNZU19mYWJzKHBbMF0ueSAtIHBbaUNvdW50IC0gMV0ueSkgPCAwLjAxZikgew0KKyAgICBMaW5lVG8ocFswXSk7DQorICB9DQorICBDbG9zZUZpZ3VyZSgpOw0KIH0NCi12b2lkIENGREVfUGF0aDo6QWRkUmVjdGFuZ2xlKGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIE1vdmVUbyhyZWN0LlRvcExlZnQoKSk7DQotICAgIExpbmVUbyhyZWN0LlRvcFJpZ2h0KCkpOw0KLSAgICBMaW5lVG8ocmVjdC5Cb3R0b21SaWdodCgpKTsNCi0gICAgTGluZVRvKHJlY3QuQm90dG9tTGVmdCgpKTsNCi0gICAgQ2xvc2VGaWd1cmUoKTsNCit2b2lkIENGREVfUGF0aDo6QWRkTGluZXMoY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cykgew0KKyAgaW50MzJfdCBpQ291bnQgPSBwb2ludHMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlDb3VudCA8IDIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfTFBDUE9JTlRGIHAgPSBwb2ludHMuR2V0RGF0YSgpOw0KKyAgRlhfTFBDUE9JTlRGIHBFbmQgPSBwICsgaUNvdW50Ow0KKyAgTW92ZVRvKHBbMF0pOw0KKyAgZm9yICgrK3A7IHAgPCBwRW5kOyArK3ApIHsNCisgICAgTGluZVRvKCpwKTsNCisgIH0NCiB9DQotdm9pZCBDRkRFX1BhdGg6OkdldEJCb3goQ0ZYX1JlY3RGICZiYm94KSBjb25zdA0KLXsNCi0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gbV9QYXRoLkdldEJvdW5kaW5nQm94KCk7DQotICAgIGJib3guU2V0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSk7DQotICAgIGJib3guTm9ybWFsaXplKCk7DQordm9pZCBDRkRFX1BhdGg6OkFkZFJlY3RhbmdsZShjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIE1vdmVUbyhyZWN0LlRvcExlZnQoKSk7DQorICBMaW5lVG8ocmVjdC5Ub3BSaWdodCgpKTsNCisgIExpbmVUbyhyZWN0LkJvdHRvbVJpZ2h0KCkpOw0KKyAgTGluZVRvKHJlY3QuQm90dG9tTGVmdCgpKTsNCisgIENsb3NlRmlndXJlKCk7DQogfQ0KLXZvaWQgQ0ZERV9QYXRoOjpHZXRCQm94KENGWF9SZWN0RiAmYmJveCwgRlhfRkxPQVQgZkxpbmVXaWR0aCwgRlhfRkxPQVQgZk1pdGVyTGltaXQpIGNvbnN0DQotew0KLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBtX1BhdGguR2V0Qm91bmRpbmdCb3goZkxpbmVXaWR0aCwgZk1pdGVyTGltaXQpOw0KLSAgICBiYm94LlNldChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCkpOw0KLSAgICBiYm94Lk5vcm1hbGl6ZSgpOw0KK3ZvaWQgQ0ZERV9QYXRoOjpHZXRCQm94KENGWF9SZWN0RiYgYmJveCkgY29uc3Qgew0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gbV9QYXRoLkdldEJvdW5kaW5nQm94KCk7DQorICBiYm94LlNldChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCkpOw0KKyAgYmJveC5Ob3JtYWxpemUoKTsNCit9DQordm9pZCBDRkRFX1BhdGg6OkdldEJCb3goQ0ZYX1JlY3RGJiBiYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pdGVyTGltaXQpIGNvbnN0IHsNCisgIENGWF9GbG9hdFJlY3QgcmVjdCA9IG1fUGF0aC5HZXRCb3VuZGluZ0JveChmTGluZVdpZHRoLCBmTWl0ZXJMaW1pdCk7DQorICBiYm94LlNldChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCkpOw0KKyAgYmJveC5Ob3JtYWxpemUoKTsNCiB9DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VvYmplY3QuaCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlb2JqZWN0LmgKaW5kZXggZmQ5ZTI5YS4uZWI0NjVhMSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VvYmplY3QuaAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZW9iamVjdC5oCkBAIC05LDQ1ICs5LDQ3IEBACiAjaWZuZGVmIF9GREVQTFVTDQogI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQogY2xhc3MgQ0ZERV9HRUZvbnRNZ3I7DQotY2xhc3MgQ0ZERV9QYXRoIDogcHVibGljIElGREVfUGF0aCwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCitjbGFzcyBDRkRFX1BhdGggOiBwdWJsaWMgSUZERV9QYXRoLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KIA0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTdGFydEZpZ3VyZSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlDbG9zZUZpZ3VyZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFN0YXJ0RmlndXJlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2xvc2VGaWd1cmUoKTsNCiANCi0gICAgdmlydHVhbCB2b2lkCQkJQWRkQmV6aWVyKGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlBZGRCZXppZXJzKGNvbnN0IENGWF9Qb2ludHNGICZwb2ludHMpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlBZGRDdXJ2ZShjb25zdCBDRlhfUG9pbnRzRiAmcG9pbnRzLCBGWF9CT09MIGJDbG9zZWQsIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41Zik7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdmlydHVhbCB2b2lkCQkJQWRkTGluZXMoY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cyk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFkZExpbmUoY29uc3QgQ0ZYX1BvaW50RiAmcHQxLCBjb25zdCBDRlhfUG9pbnRGICZwdDIpOw0KLSAgICB2aXJ0dWFsCXZvaWQJCQlBZGRQYXRoKGNvbnN0IElGREVfUGF0aCAqcFNyYywgRlhfQk9PTCBiQ29ubmVjdCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFkZFBvbHlnb24oY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cyk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFkZFJlY3RhbmdsZShjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRCQm94KENGWF9SZWN0RiAmYmJveCkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldEJCb3goQ0ZYX1JlY3RGICZiYm94LCBGWF9GTE9BVCBmTGluZVdpZHRoLCBGWF9GTE9BVCBmTWl0ZXJMaW1pdCkgY29uc3Q7DQotICAgIEZYX1BBVEhQT0lOVCoJCQlBZGRQb2ludHMoaW50MzJfdCBpQ291bnQpOw0KLSAgICBGWF9QQVRIUE9JTlQqCQkJR2V0TGFzdFBvaW50KGludDMyX3QgaUNvdW50ID0gMSkgY29uc3Q7DQotICAgIEZYX0JPT0wJCQkJCUZpZ3VyZUNsb3NlZCgpIGNvbnN0Ow0KLSAgICB2b2lkCQkJCQlNb3ZlVG8oRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdm9pZAkJCQkJTGluZVRvKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZvaWQJCQkJCUJlemllclRvKGNvbnN0IENGWF9Qb2ludEYgJnAxLCBjb25zdCBDRlhfUG9pbnRGICZwMiwgY29uc3QgQ0ZYX1BvaW50RiAmcDMpOw0KLSAgICB2b2lkCQkJCQlBcmNUbyhGWF9CT09MIGJTdGFydCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0LCBGWF9GTE9BVCBzdGFydEFuZ2xlLCBGWF9GTE9BVCBlbmRBbmdsZSk7DQotICAgIHZvaWQJCQkJCU1vdmVUbyhjb25zdCBDRlhfUG9pbnRGICZwMCkNCi0gICAgew0KLSAgICAgICAgTW92ZVRvKHAwLngsIHAwLnkpOw0KLSAgICB9DQotICAgIHZvaWQJCQkJCUxpbmVUbyhjb25zdCBDRlhfUG9pbnRGICZwMSkNCi0gICAgew0KLSAgICAgICAgTGluZVRvKHAxLngsIHAxLnkpOw0KLSAgICB9DQotICAgIHZvaWQJCQkJCUdldEN1cnZlVGFuZ2VudHMoY29uc3QgQ0ZYX1BvaW50c0YgJnBvaW50cywgQ0ZYX1BvaW50c0YgJnRhbmdlbnRzLCBGWF9CT09MIGJDbG9zZWQsIEZYX0ZMT0FUIGZUZW5zaW9uKSBjb25zdDsNCi0gICAgQ0ZYX1BhdGhEYXRhCQkJbV9QYXRoOw0KKyAgdmlydHVhbCB2b2lkIEFkZEJlemllcihjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzKTsNCisgIHZpcnR1YWwgdm9pZCBBZGRCZXppZXJzKGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMpOw0KKyAgdmlydHVhbCB2b2lkIEFkZEN1cnZlKGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xvc2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41Zik7DQorICB2aXJ0dWFsIHZvaWQgQWRkRWxsaXBzZShjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdmlydHVhbCB2b2lkIEFkZExpbmVzKGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMpOw0KKyAgdmlydHVhbCB2b2lkIEFkZExpbmUoY29uc3QgQ0ZYX1BvaW50RiYgcHQxLCBjb25zdCBDRlhfUG9pbnRGJiBwdDIpOw0KKyAgdmlydHVhbCB2b2lkIEFkZFBhdGgoY29uc3QgSUZERV9QYXRoKiBwU3JjLCBGWF9CT09MIGJDb25uZWN0KTsNCisgIHZpcnR1YWwgdm9pZCBBZGRQb2x5Z29uKGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMpOw0KKyAgdmlydHVhbCB2b2lkIEFkZFJlY3RhbmdsZShjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdmlydHVhbCB2b2lkIEdldEJCb3goQ0ZYX1JlY3RGJiBiYm94KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRCQm94KENGWF9SZWN0RiYgYmJveCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWl0ZXJMaW1pdCkgY29uc3Q7DQorICBGWF9QQVRIUE9JTlQqIEFkZFBvaW50cyhpbnQzMl90IGlDb3VudCk7DQorICBGWF9QQVRIUE9JTlQqIEdldExhc3RQb2ludChpbnQzMl90IGlDb3VudCA9IDEpIGNvbnN0Ow0KKyAgRlhfQk9PTCBGaWd1cmVDbG9zZWQoKSBjb25zdDsNCisgIHZvaWQgTW92ZVRvKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2b2lkIExpbmVUbyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdm9pZCBCZXppZXJUbyhjb25zdCBDRlhfUG9pbnRGJiBwMSwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcDIsDQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHAzKTsNCisgIHZvaWQgQXJjVG8oRlhfQk9PTCBiU3RhcnQsDQorICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgRlhfRkxPQVQgZW5kQW5nbGUpOw0KKyAgdm9pZCBNb3ZlVG8oY29uc3QgQ0ZYX1BvaW50RiYgcDApIHsgTW92ZVRvKHAwLngsIHAwLnkpOyB9DQorICB2b2lkIExpbmVUbyhjb25zdCBDRlhfUG9pbnRGJiBwMSkgeyBMaW5lVG8ocDEueCwgcDEueSk7IH0NCisgIHZvaWQgR2V0Q3VydmVUYW5nZW50cyhjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludHNGJiB0YW5nZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbG9zZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24pIGNvbnN0Ow0KKyAgQ0ZYX1BhdGhEYXRhIG1fUGF0aDsNCiB9Ow0KICNlbmRpZg0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmNwcAppbmRleCBlNDlmZGFmLi5kYWYzZDBiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9pdGVyYXRvci5jcHAKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfaXRlcmF0b3IuY3BwCkBAIC02LDk2ICs2LDkxIEBACiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCiAjaW5jbHVkZSAiZmRlX2l0ZXJhdG9yLmgiDQotSUZERV9WaXN1YWxTZXRJdGVyYXRvciogSUZERV9WaXN1YWxTZXRJdGVyYXRvcjo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBuZXcgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjsNCitJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yKiBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpDcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IENGREVfVmlzdWFsU2V0SXRlcmF0b3I7DQogfQ0KLUNGREVfVmlzdWFsU2V0SXRlcmF0b3I6OkNGREVfVmlzdWFsU2V0SXRlcmF0b3IoKQ0KLSAgICA6IG1fZHdGaWx0ZXIoMCkNCi17DQorQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6Q0ZERV9WaXN1YWxTZXRJdGVyYXRvcigpIDogbV9kd0ZpbHRlcigwKSB7fQ0KK0NGREVfVmlzdWFsU2V0SXRlcmF0b3I6On5DRkRFX1Zpc3VhbFNldEl0ZXJhdG9yKCkgew0KKyAgbV9DYW52YXNTdGFjay5SZW1vdmVBbGwoKTsNCiB9DQotQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6fkNGREVfVmlzdWFsU2V0SXRlcmF0b3IoKQ0KLXsNCi0gICAgbV9DYW52YXNTdGFjay5SZW1vdmVBbGwoKTsNCitGWF9CT09MIENGREVfVmlzdWFsU2V0SXRlcmF0b3I6OkF0dGFjaENhbnZhcyhJRkRFX0NhbnZhc1NldCogcENhbnZhcykgew0KKyAgRlhTWVNfYXNzZXJ0KHBDYW52YXMgIT0gTlVMTCk7DQorICBtX0NhbnZhc1N0YWNrLlJlbW92ZUFsbCgpOw0KKyAgRkRFX0NBTlZBU0lURU0gY2FudmFzOw0KKyAgY2FudmFzLmhDYW52YXMgPSBOVUxMOw0KKyAgY2FudmFzLnBDYW52YXMgPSBwQ2FudmFzOw0KKyAgY2FudmFzLmhQb3MgPSBwQ2FudmFzLT5HZXRGaXJzdFBvc2l0aW9uKE5VTEwpOw0KKyAgaWYgKGNhbnZhcy5oUG9zID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fQ2FudmFzU3RhY2suUHVzaChjYW52YXMpID09IDA7DQogfQ0KLUZYX0JPT0wgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6QXR0YWNoQ2FudmFzKElGREVfQ2FudmFzU2V0ICpwQ2FudmFzKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBDYW52YXMgIT0gTlVMTCk7DQotICAgIG1fQ2FudmFzU3RhY2suUmVtb3ZlQWxsKCk7DQotICAgIEZERV9DQU5WQVNJVEVNIGNhbnZhczsNCi0gICAgY2FudmFzLmhDYW52YXMgPSBOVUxMOw0KLSAgICBjYW52YXMucENhbnZhcyA9IHBDYW52YXM7DQotICAgIGNhbnZhcy5oUG9zID0gcENhbnZhcy0+R2V0Rmlyc3RQb3NpdGlvbihOVUxMKTsNCi0gICAgaWYgKGNhbnZhcy5oUG9zID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9DYW52YXNTdGFjay5QdXNoKGNhbnZhcykgPT0gMDsNCitGWF9CT09MIENGREVfVmlzdWFsU2V0SXRlcmF0b3I6OkZpbHRlck9iamVjdHMoRlhfRFdPUkQgZHdPYmplY3RzKSB7DQorICBpZiAobV9DYW52YXNTdGFjay5HZXRTaXplKCkgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3aGlsZSAobV9DYW52YXNTdGFjay5HZXRTaXplKCkgPiAxKSB7DQorICAgIG1fQ2FudmFzU3RhY2suUG9wKCk7DQorICB9DQorICBtX2R3RmlsdGVyID0gZHdPYmplY3RzICYgfihGWF9EV09SRClGREVfVklTVUFMT0JKX1dpZGdldDsNCisgIGlmIChkd09iamVjdHMgJiBGREVfVklTVUFMT0JKX1dpZGdldCkgew0KKyAgICBtX2R3RmlsdGVyIHw9IDB4RkYwMDsNCisgIH0NCisgIEZERV9MUENBTlZBU0lURU0gcENhbnZhcyA9IG1fQ2FudmFzU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgRlhTWVNfYXNzZXJ0KHBDYW52YXMgIT0gTlVMTCAmJiBwQ2FudmFzLT5wQ2FudmFzICE9IE5VTEwpOw0KKyAgcENhbnZhcy0+aFBvcyA9IHBDYW52YXMtPnBDYW52YXMtPkdldEZpcnN0UG9zaXRpb24oTlVMTCk7DQorICByZXR1cm4gcENhbnZhcy0+aFBvcyAhPSBOVUxMOw0KIH0NCi1GWF9CT09MIENGREVfVmlzdWFsU2V0SXRlcmF0b3I6OkZpbHRlck9iamVjdHMoRlhfRFdPUkQgZHdPYmplY3RzICkNCi17DQotICAgIGlmIChtX0NhbnZhc1N0YWNrLkdldFNpemUoKSA9PSAwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgd2hpbGUgKG1fQ2FudmFzU3RhY2suR2V0U2l6ZSgpID4gMSkgew0KLSAgICAgICAgbV9DYW52YXNTdGFjay5Qb3AoKTsNCi0gICAgfQ0KLSAgICBtX2R3RmlsdGVyID0gZHdPYmplY3RzICYgfihGWF9EV09SRClGREVfVklTVUFMT0JKX1dpZGdldDsNCi0gICAgaWYgKGR3T2JqZWN0cyAmIEZERV9WSVNVQUxPQkpfV2lkZ2V0KSB7DQotICAgICAgICBtX2R3RmlsdGVyIHw9IDB4RkYwMDsNCi0gICAgfQ0KK3ZvaWQgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6UmVzZXQoKSB7DQorICBGaWx0ZXJPYmplY3RzKG1fZHdGaWx0ZXIpOw0KK30NCitGREVfSFZJU1VBTE9CSiBDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpHZXROZXh0KElGREVfVmlzdWFsU2V0KiYgcFZpc3VhbFNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9IVklTVUFMT0JKKiBwaENhbnZhc09iaiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ2FudmFzU2V0KiogcHBDYW52YXNTZXQpIHsNCisgIHdoaWxlIChtX0NhbnZhc1N0YWNrLkdldFNpemUoKSA+IDApIHsNCiAgICAgRkRFX0xQQ0FOVkFTSVRFTSBwQ2FudmFzID0gbV9DYW52YXNTdGFjay5HZXRUb3BFbGVtZW50KCk7DQogICAgIEZYU1lTX2Fzc2VydChwQ2FudmFzICE9IE5VTEwgJiYgcENhbnZhcy0+cENhbnZhcyAhPSBOVUxMKTsNCi0gICAgcENhbnZhcy0+aFBvcyA9IHBDYW52YXMtPnBDYW52YXMtPkdldEZpcnN0UG9zaXRpb24oTlVMTCk7DQotICAgIHJldHVybiBwQ2FudmFzLT5oUG9zICE9IE5VTEw7DQotfQ0KLXZvaWQgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6UmVzZXQoKQ0KLXsNCi0gICAgRmlsdGVyT2JqZWN0cyhtX2R3RmlsdGVyKTsNCi19DQotRkRFX0hWSVNVQUxPQkogQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6R2V0TmV4dChJRkRFX1Zpc3VhbFNldCAqJnBWaXN1YWxTZXQsIEZERV9IVklTVUFMT0JKICpwaENhbnZhc09iaiAsIElGREVfQ2FudmFzU2V0ICoqcHBDYW52YXNTZXQgKQ0KLXsNCi0gICAgd2hpbGUgKG1fQ2FudmFzU3RhY2suR2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgRkRFX0xQQ0FOVkFTSVRFTSBwQ2FudmFzID0gbV9DYW52YXNTdGFjay5HZXRUb3BFbGVtZW50KCk7DQotICAgICAgICBGWFNZU19hc3NlcnQocENhbnZhcyAhPSBOVUxMICYmIHBDYW52YXMtPnBDYW52YXMgIT0gTlVMTCk7DQotICAgICAgICBpZiAocENhbnZhcy0+aFBvcyA9PSBOVUxMKSB7DQotICAgICAgICAgICAgaWYgKG1fQ2FudmFzU3RhY2suR2V0U2l6ZSgpID09IDEpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fQ2FudmFzU3RhY2suUG9wKCk7DQotICAgICAgICAgICAgY29udGludWU7DQorICAgIGlmIChwQ2FudmFzLT5oUG9zID09IE5VTEwpIHsNCisgICAgICBpZiAobV9DYW52YXNTdGFjay5HZXRTaXplKCkgPT0gMSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIG1fQ2FudmFzU3RhY2suUG9wKCk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgZG8gew0KKyAgICAgIEZERV9IVklTVUFMT0JKIGhPYmogPSBwQ2FudmFzLT5wQ2FudmFzLT5HZXROZXh0KA0KKyAgICAgICAgICBwQ2FudmFzLT5oQ2FudmFzLCBwQ2FudmFzLT5oUG9zLCBwVmlzdWFsU2V0KTsNCisgICAgICBGWFNZU19hc3NlcnQoaE9iaiAhPSBOVUxMKTsNCisgICAgICBGREVfVklTVUFMT0JKVFlQRSBlVHlwZSA9IHBWaXN1YWxTZXQtPkdldFR5cGUoKTsNCisgICAgICBpZiAoZVR5cGUgPT0gRkRFX1ZJU1VBTE9CSl9DYW52YXMpIHsNCisgICAgICAgIEZERV9DQU5WQVNJVEVNIGNhbnZhczsNCisgICAgICAgIGNhbnZhcy5oQ2FudmFzID0gaE9iajsNCisgICAgICAgIGNhbnZhcy5wQ2FudmFzID0gKElGREVfQ2FudmFzU2V0KilwVmlzdWFsU2V0Ow0KKyAgICAgICAgY2FudmFzLmhQb3MgPSBjYW52YXMucENhbnZhcy0+R2V0Rmlyc3RQb3NpdGlvbihoT2JqKTsNCisgICAgICAgIG1fQ2FudmFzU3RhY2suUHVzaChjYW52YXMpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIEZYX0RXT1JEIGR3T2JqID0NCisgICAgICAgICAgKGVUeXBlID09IEZERV9WSVNVQUxPQkpfV2lkZ2V0KQ0KKyAgICAgICAgICAgICAgPyAoRlhfRFdPUkQpKChJRkRFX1dpZGdldFNldCopcFZpc3VhbFNldCktPkdldFdpZGdldFR5cGUoaE9iaikNCisgICAgICAgICAgICAgIDogKEZYX0RXT1JEKWVUeXBlOw0KKyAgICAgIGlmICgobV9kd0ZpbHRlciAmIGR3T2JqKSAhPSAwKSB7DQorICAgICAgICBpZiAocHBDYW52YXNTZXQpIHsNCisgICAgICAgICAgKnBwQ2FudmFzU2V0ID0gcENhbnZhcy0+cENhbnZhczsNCiAgICAgICAgIH0NCi0gICAgICAgIGRvIHsNCi0gICAgICAgICAgICBGREVfSFZJU1VBTE9CSiBoT2JqID0gcENhbnZhcy0+cENhbnZhcy0+R2V0TmV4dChwQ2FudmFzLT5oQ2FudmFzLCBwQ2FudmFzLT5oUG9zLCBwVmlzdWFsU2V0KTsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQoaE9iaiAhPSBOVUxMKTsNCi0gICAgICAgICAgICBGREVfVklTVUFMT0JKVFlQRSBlVHlwZSA9IHBWaXN1YWxTZXQtPkdldFR5cGUoKTsNCi0gICAgICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX1ZJU1VBTE9CSl9DYW52YXMpIHsNCi0gICAgICAgICAgICAgICAgRkRFX0NBTlZBU0lURU0gY2FudmFzOw0KLSAgICAgICAgICAgICAgICBjYW52YXMuaENhbnZhcyA9IGhPYmo7DQotICAgICAgICAgICAgICAgIGNhbnZhcy5wQ2FudmFzID0gKElGREVfQ2FudmFzU2V0KilwVmlzdWFsU2V0Ow0KLSAgICAgICAgICAgICAgICBjYW52YXMuaFBvcyA9IGNhbnZhcy5wQ2FudmFzLT5HZXRGaXJzdFBvc2l0aW9uKGhPYmopOw0KLSAgICAgICAgICAgICAgICBtX0NhbnZhc1N0YWNrLlB1c2goY2FudmFzKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYX0RXT1JEIGR3T2JqID0gKGVUeXBlID09IEZERV9WSVNVQUxPQkpfV2lkZ2V0KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRlhfRFdPUkQpKChJRkRFX1dpZGdldFNldCopcFZpc3VhbFNldCktPkdldFdpZGdldFR5cGUoaE9iaikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKEZYX0RXT1JEKWVUeXBlOw0KLSAgICAgICAgICAgIGlmICgobV9kd0ZpbHRlciAmIGR3T2JqKSAhPSAwKSB7DQotICAgICAgICAgICAgICAgIGlmIChwcENhbnZhc1NldCkgew0KLSAgICAgICAgICAgICAgICAgICAgKnBwQ2FudmFzU2V0ID0gcENhbnZhcy0+cENhbnZhczsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAocGhDYW52YXNPYmopIHsNCi0gICAgICAgICAgICAgICAgICAgICpwaENhbnZhc09iaiA9IHBDYW52YXMtPmhDYW52YXM7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhPYmo7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSB3aGlsZSAocENhbnZhcy0+aFBvcyAhPSBOVUxMKTsNCi0gICAgfQ0KLSAgICBpZiAocHBDYW52YXNTZXQpIHsNCi0gICAgICAgICpwcENhbnZhc1NldCA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKHBoQ2FudmFzT2JqKSB7DQotICAgICAgICAqcGhDYW52YXNPYmogPSBOVUxMOw0KLSAgICB9DQotICAgIHBWaXN1YWxTZXQgPSBOVUxMOw0KLSAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIGlmIChwaENhbnZhc09iaikgew0KKyAgICAgICAgICAqcGhDYW52YXNPYmogPSBwQ2FudmFzLT5oQ2FudmFzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGhPYmo7DQorICAgICAgfQ0KKyAgICB9IHdoaWxlIChwQ2FudmFzLT5oUG9zICE9IE5VTEwpOw0KKyAgfQ0KKyAgaWYgKHBwQ2FudmFzU2V0KSB7DQorICAgICpwcENhbnZhc1NldCA9IE5VTEw7DQorICB9DQorICBpZiAocGhDYW52YXNPYmopIHsNCisgICAgKnBoQ2FudmFzT2JqID0gTlVMTDsNCisgIH0NCisgIHBWaXN1YWxTZXQgPSBOVUxMOw0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmggYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9pdGVyYXRvci5oCmluZGV4IGVjOGYwYWIuLjkwNWM2OTQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmgKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfaXRlcmF0b3IuaApAQCAtNywyNyArNywyNyBAQAogI2lmbmRlZiBfRkRFX0lURVJBVE9SX0lNUA0KICNkZWZpbmUgX0ZERV9JVEVSQVRPUl9JTVANCiB0eXBlZGVmIHN0cnVjdCBfRkRFX0NBTlZBU0lURU0gOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQotICAgIElGREVfQ2FudmFzU2V0CSpwQ2FudmFzOw0KLSAgICBGREVfSFZJU1VBTE9CSgloQ2FudmFzOw0KLSAgICBGWF9QT1NJVElPTgkJaFBvczsNCi19IEZERV9DQU5WQVNJVEVNLCAqIEZERV9MUENBTlZBU0lURU07DQotY2xhc3MgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvciA6IHB1YmxpYyBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfVmlzdWFsU2V0SXRlcmF0b3IoKTsNCi0gICAgfkNGREVfVmlzdWFsU2V0SXRlcmF0b3IoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQorICBJRkRFX0NhbnZhc1NldCogcENhbnZhczsNCisgIEZERV9IVklTVUFMT0JKIGhDYW52YXM7DQorICBGWF9QT1NJVElPTiBoUG9zOw0KK30gRkRFX0NBTlZBU0lURU0sICpGREVfTFBDQU5WQVNJVEVNOw0KK2NsYXNzIENGREVfVmlzdWFsU2V0SXRlcmF0b3IgOiBwdWJsaWMgSUZERV9WaXN1YWxTZXRJdGVyYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yKCk7DQorICB+Q0ZERV9WaXN1YWxTZXRJdGVyYXRvcigpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQogDQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUF0dGFjaENhbnZhcyhJRkRFX0NhbnZhc1NldCAqcENhbnZhcyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUZpbHRlck9iamVjdHMoRlhfRFdPUkQgZHdPYmplY3RzID0gMHhGRkZGRkZGRik7DQorICB2aXJ0dWFsIEZYX0JPT0wgQXR0YWNoQ2FudmFzKElGREVfQ2FudmFzU2V0KiBwQ2FudmFzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWx0ZXJPYmplY3RzKEZYX0RXT1JEIGR3T2JqZWN0cyA9IDB4RkZGRkZGRkYpOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZXNldCgpOw0KLSAgICB2aXJ0dWFsIEZERV9IVklTVUFMT0JKCUdldE5leHQoSUZERV9WaXN1YWxTZXQgKiZwVmlzdWFsU2V0LCBGREVfSFZJU1VBTE9CSiAqcGhDYW52YXNPYmogPSBOVUxMLCBJRkRFX0NhbnZhc1NldCAqKnBwQ2FudmFzU2V0ID0gTlVMTCk7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9EV09SRAkJCQltX2R3RmlsdGVyOw0KLSAgICBDRlhfU3RhY2tUZW1wbGF0ZTxGREVfQ0FOVkFTSVRFTT4JbV9DYW52YXNTdGFjazsNCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpOw0KKyAgdmlydHVhbCBGREVfSFZJU1VBTE9CSiBHZXROZXh0KElGREVfVmlzdWFsU2V0KiYgcFZpc3VhbFNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfSFZJU1VBTE9CSiogcGhDYW52YXNPYmogPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ2FudmFzU2V0KiogcHBDYW52YXNTZXQgPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfRFdPUkQgbV9kd0ZpbHRlcjsNCisgIENGWF9TdGFja1RlbXBsYXRlPEZERV9DQU5WQVNJVEVNPiBtX0NhbnZhc1N0YWNrOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfb2JqZWN0LmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX29iamVjdC5jcHAKaW5kZXggNDQ3MDY3ZC4uM2FlODRhNyAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfb2JqZWN0LmNwcAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9vYmplY3QuY3BwCkBAIC02LDIyICs2LDIwIEBACiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCiAjaW5jbHVkZSAiZmRlX29iamVjdC5oIg0KLUlGREVfUGVuKiBJRkRFX1Blbjo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBuZXcgQ0ZERV9QZW4oKTsNCitJRkRFX1BlbiogSUZERV9QZW46OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZERV9QZW4oKTsNCiB9DQotSUZERV9CcnVzaCogSUZERV9CcnVzaDo6Q3JlYXRlKGludDMyX3QgaVR5cGUpDQotew0KLSAgICBzd2l0Y2ggKGlUeXBlKSB7DQotICAgICAgICBjYXNlIEZERV9CUlVTSFRZUEVfU29saWQ6DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDRkRFX1NvbGlkQnJ1c2g7DQotICAgICAgICBjYXNlIEZERV9CUlVTSFRZUEVfSGF0Y2g6DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDRkRFX0hhdGNoQnJ1c2g7DQotICAgICAgICBjYXNlIEZERV9CUlVTSFRZUEVfVGV4dHVyZToNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENGREVfVGV4dHVyZUJydXNoOw0KLSAgICAgICAgY2FzZSBGREVfQlJVU0hUWVBFX0xpbmVhckdyYWRpZW50Og0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ0ZERV9MaW5lYXJCcnVzaDsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCitJRkRFX0JydXNoKiBJRkRFX0JydXNoOjpDcmVhdGUoaW50MzJfdCBpVHlwZSkgew0KKyAgc3dpdGNoIChpVHlwZSkgew0KKyAgICBjYXNlIEZERV9CUlVTSFRZUEVfU29saWQ6DQorICAgICAgcmV0dXJuIG5ldyBDRkRFX1NvbGlkQnJ1c2g7DQorICAgIGNhc2UgRkRFX0JSVVNIVFlQRV9IYXRjaDoNCisgICAgICByZXR1cm4gbmV3IENGREVfSGF0Y2hCcnVzaDsNCisgICAgY2FzZSBGREVfQlJVU0hUWVBFX1RleHR1cmU6DQorICAgICAgcmV0dXJuIG5ldyBDRkRFX1RleHR1cmVCcnVzaDsNCisgICAgY2FzZSBGREVfQlJVU0hUWVBFX0xpbmVhckdyYWRpZW50Og0KKyAgICAgIHJldHVybiBuZXcgQ0ZERV9MaW5lYXJCcnVzaDsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gTlVMTDsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfb2JqZWN0LmggYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9vYmplY3QuaAppbmRleCAyNjEwMGM3Li42MjBmZTRmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9vYmplY3QuaAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9vYmplY3QuaApAQCAtNiw0MjIgKzYsMjMyIEBACiANCiAjaWZuZGVmIF9GREVfQkFTRU9CSkVDVF9JTVANCiAjZGVmaW5lIF9GREVfQkFTRU9CSkVDVF9JTVANCi1jbGFzcyBDRkRFX1BlbiA6IHB1YmxpYyBJRkRFX1BlbiwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1BlbigpDQotICAgICAgICA6IG1fQ29sb3IoMCkNCi0gICAgICAgICwgbV9pTGluZUNhcCgwKQ0KLSAgICAgICAgLCBtX2lMaW5lSm9pbigwKQ0KLSAgICAgICAgLCBtX2lEYXNoU3R5bGUoMCkNCi0gICAgICAgICwgbV9mRGFzaFBoYXNlKDApDQotICAgICAgICAsIG1fZk1pdGVyTGltaXQoMTApDQotICAgICAgICAsIG1fYkF1dG9SZWxlYXNlKEZBTFNFKQ0KLSAgICAgICAgLCBtX3BCcnVzaChOVUxMKQ0KLSAgICB7DQotICAgIH0NCitjbGFzcyBDRkRFX1BlbiA6IHB1YmxpYyBJRkRFX1BlbiwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX1BlbigpDQorICAgICAgOiBtX0NvbG9yKDApLA0KKyAgICAgICAgbV9pTGluZUNhcCgwKSwNCisgICAgICAgIG1faUxpbmVKb2luKDApLA0KKyAgICAgICAgbV9pRGFzaFN0eWxlKDApLA0KKyAgICAgICAgbV9mRGFzaFBoYXNlKDApLA0KKyAgICAgICAgbV9mTWl0ZXJMaW1pdCgxMCksDQorICAgICAgICBtX2JBdXRvUmVsZWFzZShGQUxTRSksDQorICAgICAgICBtX3BCcnVzaChOVUxMKSB7fQ0KIA0KLSAgICB+Q0ZERV9QZW4oKQ0KLSAgICB7DQotICAgICAgICBpZiAobV9wQnJ1c2ggJiYgbV9iQXV0b1JlbGVhc2UpIHsNCi0gICAgICAgICAgICBtX3BCcnVzaC0+UmVsZWFzZSgpOw0KLSAgICAgICAgfQ0KKyAgfkNGREVfUGVuKCkgew0KKyAgICBpZiAobV9wQnJ1c2ggJiYgbV9iQXV0b1JlbGVhc2UpIHsNCisgICAgICBtX3BCcnVzaC0+UmVsZWFzZSgpOw0KICAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCisgIH0NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KIA0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRUeXBlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcEJydXNoID8gbV9wQnJ1c2gtPkdldFR5cGUoKSA6IEZERV9QRU5UWVBFX1NvbGlkQ29sb3I7DQotICAgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUeXBlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9wQnJ1c2ggPyBtX3BCcnVzaC0+R2V0VHlwZSgpIDogRkRFX1BFTlRZUEVfU29saWRDb2xvcjsNCisgIH0NCiANCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCUdldENvbG9yKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fQ29sb3I7DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX0NvbG9yOyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29sb3IoRlhfQVJHQiBjb2xvcikgeyBtX0NvbG9yID0gY29sb3I7IH0NCisgIHZpcnR1YWwgSUZERV9CcnVzaCogR2V0QnJ1c2goKSBjb25zdCB7IHJldHVybiBtX3BCcnVzaDsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEJydXNoKElGREVfQnJ1c2gqIHBCcnVzaCwgRlhfQk9PTCBiQXV0b1JlbGVhc2UpIHsNCisgICAgbV9iQXV0b1JlbGVhc2UgPSBiQXV0b1JlbGVhc2U7DQorICAgIG1fcEJydXNoID0gcEJydXNoOw0KKyAgICBpZiAobV9wQnJ1c2ggJiYgbV9wQnJ1c2gtPkdldFR5cGUoKSA9PSBGREVfQlJVU0hUWVBFX1NvbGlkKSB7DQorICAgICAgbV9Db2xvciA9ICgoSUZERV9Tb2xpZEJydXNoKiltX3BCcnVzaCktPkdldENvbG9yKCk7DQogICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldENvbG9yKEZYX0FSR0IgY29sb3IpDQotICAgIHsNCi0gICAgICAgIG1fQ29sb3IgPSBjb2xvcjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfQnJ1c2gqCQkJR2V0QnJ1c2goKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wQnJ1c2g7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldEJydXNoKElGREVfQnJ1c2ggKnBCcnVzaCwgRlhfQk9PTCBiQXV0b1JlbGVhc2UpDQotICAgIHsNCi0gICAgICAgIG1fYkF1dG9SZWxlYXNlID0gYkF1dG9SZWxlYXNlOw0KLSAgICAgICAgbV9wQnJ1c2ggPSBwQnJ1c2g7DQotICAgICAgICBpZiAobV9wQnJ1c2ggJiYgbV9wQnJ1c2gtPkdldFR5cGUoKSA9PSBGREVfQlJVU0hUWVBFX1NvbGlkKSB7DQotICAgICAgICAgICAgbV9Db2xvciA9ICgoSUZERV9Tb2xpZEJydXNoKiltX3BCcnVzaCktPkdldENvbG9yKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0TGluZUNhcCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lMaW5lQ2FwOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRMaW5lQ2FwKGludDMyX3QgaUxpbmVDYXApDQotICAgIHsNCi0gICAgICAgIG1faUxpbmVDYXAgPSBpTGluZUNhcDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXREYXNoU3R5bGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9pRGFzaFN0eWxlOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXREYXNoU3R5bGUoaW50MzJfdCBpRGFzaFN0eWxlKQ0KLSAgICB7DQotICAgICAgICBtX2lEYXNoU3R5bGUgPSBpRGFzaFN0eWxlOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXREYXNoUGhhc2UoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9mRGFzaFBoYXNlOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXREYXNoUGhhc2UoRlhfRkxPQVQgZlBoYXNlKQ0KLSAgICB7DQotICAgICAgICBtX2ZEYXNoUGhhc2UgPSBmUGhhc2U7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJQ291bnREYXNoQXJyYXkoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9EYXNoQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldERhc2hBcnJheShDRlhfRmxvYXRBcnJheSAmZGFzaEFycmF5KSBjb25zdA0KLSAgICB7DQotICAgICAgICBkYXNoQXJyYXkuQ29weShtX0Rhc2hBcnJheSk7DQotICAgICAgICByZXR1cm4gZGFzaEFycmF5LkdldFNpemUoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0RGFzaEFycmF5KGNvbnN0IENGWF9GbG9hdEFycmF5ICZkYXNoQXJyYXkpDQotICAgIHsNCi0gICAgICAgIG1fRGFzaEFycmF5LkNvcHkoZGFzaEFycmF5KTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRMaW5lSm9pbigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lMaW5lSm9pbjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0TGluZUpvaW4oaW50MzJfdCBpTGluZUpvaW4pDQotICAgIHsNCi0gICAgICAgIG1faUxpbmVKb2luID0gaUxpbmVKb2luOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXRNaXRlckxpbWl0KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZk1pdGVyTGltaXQ7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldE1pdGVyTGltaXQoRlhfRkxPQVQgZk1pdGVyTGltaXQpDQotICAgIHsNCi0gICAgICAgIG1fZk1pdGVyTGltaXQgPSBmTWl0ZXJMaW1pdDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlDb3VudENvbXBvdW5kUGF0dGVybnMoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9Db21wb3VuZFBhdHRlcm5zLkdldFNpemUoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJR2V0Q29tcG91bmRQYXR0ZXJucyhDRkRFX0NvbXBvdW5kUGF0dGVybnMgJmNvbXBvdW5kUGF0dGVybnMpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb3VuZFBhdHRlcm5zLkNvcHkobV9Db21wb3VuZFBhdHRlcm5zKSwgVFJVRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0Q29tcG91bmRQYXR0ZXJucyhjb25zdCBDRkRFX0NvbXBvdW5kUGF0dGVybnMgJmNvbXBvdW5kUGF0dGVybnMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX0NvbXBvdW5kUGF0dGVybnMuQ29weShjb21wb3VuZFBhdHRlcm5zKSwgVFJVRTsNCi0gICAgfQ0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldExpbmVDYXAoKSBjb25zdCB7IHJldHVybiBtX2lMaW5lQ2FwOyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZUNhcChpbnQzMl90IGlMaW5lQ2FwKSB7IG1faUxpbmVDYXAgPSBpTGluZUNhcDsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldERhc2hTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1faURhc2hTdHlsZTsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldERhc2hTdHlsZShpbnQzMl90IGlEYXNoU3R5bGUpIHsgbV9pRGFzaFN0eWxlID0gaURhc2hTdHlsZTsgfQ0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXREYXNoUGhhc2UoKSBjb25zdCB7IHJldHVybiBtX2ZEYXNoUGhhc2U7IH0NCisgIHZpcnR1YWwgdm9pZCBTZXREYXNoUGhhc2UoRlhfRkxPQVQgZlBoYXNlKSB7IG1fZkRhc2hQaGFzZSA9IGZQaGFzZTsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50RGFzaEFycmF5KCkgY29uc3QgeyByZXR1cm4gbV9EYXNoQXJyYXkuR2V0U2l6ZSgpOyB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGFzaEFycmF5KENGWF9GbG9hdEFycmF5JiBkYXNoQXJyYXkpIGNvbnN0IHsNCisgICAgZGFzaEFycmF5LkNvcHkobV9EYXNoQXJyYXkpOw0KKyAgICByZXR1cm4gZGFzaEFycmF5LkdldFNpemUoKTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXREYXNoQXJyYXkoY29uc3QgQ0ZYX0Zsb2F0QXJyYXkmIGRhc2hBcnJheSkgew0KKyAgICBtX0Rhc2hBcnJheS5Db3B5KGRhc2hBcnJheSk7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGluZUpvaW4oKSBjb25zdCB7IHJldHVybiBtX2lMaW5lSm9pbjsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVKb2luKGludDMyX3QgaUxpbmVKb2luKSB7IG1faUxpbmVKb2luID0gaUxpbmVKb2luOyB9DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldE1pdGVyTGltaXQoKSBjb25zdCB7IHJldHVybiBtX2ZNaXRlckxpbWl0OyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0TWl0ZXJMaW1pdChGWF9GTE9BVCBmTWl0ZXJMaW1pdCkgew0KKyAgICBtX2ZNaXRlckxpbWl0ID0gZk1pdGVyTGltaXQ7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRDb21wb3VuZFBhdHRlcm5zKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Db21wb3VuZFBhdHRlcm5zLkdldFNpemUoKTsNCisgIH0NCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDb21wb3VuZFBhdHRlcm5zKA0KKyAgICAgIENGREVfQ29tcG91bmRQYXR0ZXJucyYgY29tcG91bmRQYXR0ZXJucykgY29uc3Qgew0KKyAgICByZXR1cm4gY29tcG91bmRQYXR0ZXJucy5Db3B5KG1fQ29tcG91bmRQYXR0ZXJucyksIFRSVUU7DQorICB9DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q29tcG91bmRQYXR0ZXJucygNCisgICAgICBjb25zdCBDRkRFX0NvbXBvdW5kUGF0dGVybnMmIGNvbXBvdW5kUGF0dGVybnMpIHsNCisgICAgcmV0dXJuIG1fQ29tcG91bmRQYXR0ZXJucy5Db3B5KGNvbXBvdW5kUGF0dGVybnMpLCBUUlVFOw0KKyAgfQ0KIA0KLSAgICBGWF9BUkdCCQkJCQkJbV9Db2xvcjsNCi0gICAgaW50MzJfdAkJCQkJbV9pTGluZUNhcDsNCi0gICAgaW50MzJfdAkJCQkJbV9pTGluZUpvaW47DQotICAgIGludDMyX3QJCQkJCW1faURhc2hTdHlsZTsNCi0gICAgRlhfRkxPQVQJCQkJCW1fZkRhc2hQaGFzZTsNCi0gICAgRlhfRkxPQVQJCQkJCW1fZk1pdGVyTGltaXQ7DQotICAgIEZYX0JPT0wJCQkJCQltX2JBdXRvUmVsZWFzZTsNCi0gICAgSUZERV9CcnVzaAkJCQkJKm1fcEJydXNoOw0KLSAgICBDRlhfRmxvYXRBcnJheQkJCQltX0Rhc2hBcnJheTsNCi0gICAgQ0ZERV9Db21wb3VuZFBhdHRlcm5zCQltX0NvbXBvdW5kUGF0dGVybnM7DQorICBGWF9BUkdCIG1fQ29sb3I7DQorICBpbnQzMl90IG1faUxpbmVDYXA7DQorICBpbnQzMl90IG1faUxpbmVKb2luOw0KKyAgaW50MzJfdCBtX2lEYXNoU3R5bGU7DQorICBGWF9GTE9BVCBtX2ZEYXNoUGhhc2U7DQorICBGWF9GTE9BVCBtX2ZNaXRlckxpbWl0Ow0KKyAgRlhfQk9PTCBtX2JBdXRvUmVsZWFzZTsNCisgIElGREVfQnJ1c2gqIG1fcEJydXNoOw0KKyAgQ0ZYX0Zsb2F0QXJyYXkgbV9EYXNoQXJyYXk7DQorICBDRkRFX0NvbXBvdW5kUGF0dGVybnMgbV9Db21wb3VuZFBhdHRlcm5zOw0KIH07DQotY2xhc3MgQ0ZERV9Tb2xpZEJydXNoIDogcHVibGljIElGREVfU29saWRCcnVzaCwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1NvbGlkQnJ1c2goKSA6IG1fQ29sb3IoMHhGRjAwMDAwMCkNCi0gICAgew0KLSAgICAgICAgbV9NYXRyaXguUmVzZXQoKTsNCi0gICAgfQ0KK2NsYXNzIENGREVfU29saWRCcnVzaCA6IHB1YmxpYyBJRkRFX1NvbGlkQnJ1c2gsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9Tb2xpZEJydXNoKCkgOiBtX0NvbG9yKDB4RkYwMDAwMDApIHsgbV9NYXRyaXguUmVzZXQoKTsgfQ0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFR5cGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gRkRFX0JSVVNIVFlQRV9Tb2xpZDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IENGWF9NYXRyaXgmCUdldE1hdHJpeCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX01hdHJpeDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzZXRNYXRyaXgoKQ0KLSAgICB7DQotICAgICAgICBtX01hdHJpeC5SZXNldCgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlUcmFuc2xhdGVNYXRyaXgoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KQ0KLSAgICB7DQotICAgICAgICBtX01hdHJpeC5UcmFuc2xhdGUoZHgsIGR5KTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUm90YXRlTWF0cml4KEZYX0ZMT0FUIGZSYWRpYW4pDQotICAgIHsNCi0gICAgICAgIG1fTWF0cml4LlJvdGF0ZShmUmFkaWFuKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2NhbGVNYXRyaXgoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5KQ0KLSAgICB7DQotICAgICAgICBtX01hdHJpeC5TY2FsZShzeCwgc3kpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlDb25jYXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KLSAgICB7DQotICAgICAgICBtX01hdHJpeC5Db25jYXQobWF0cml4KTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkNCi0gICAgew0KLSAgICAgICAgbV9NYXRyaXggPSBtYXRyaXg7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9BUkdCCQkJCUdldENvbG9yKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fQ29sb3I7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldENvbG9yKEZYX0FSR0IgY29sb3IpDQotICAgIHsNCi0gICAgICAgIG1fQ29sb3IgPSBjb2xvcjsNCi0gICAgfQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZERV9CUlVTSFRZUEVfU29saWQ7IH0NCisgIHZpcnR1YWwgY29uc3QgQ0ZYX01hdHJpeCYgR2V0TWF0cml4KCkgY29uc3QgeyByZXR1cm4gbV9NYXRyaXg7IH0NCisgIHZpcnR1YWwgdm9pZCBSZXNldE1hdHJpeCgpIHsgbV9NYXRyaXguUmVzZXQoKTsgfQ0KKyAgdmlydHVhbCB2b2lkIFRyYW5zbGF0ZU1hdHJpeChGWF9GTE9BVCBkeCwgRlhfRkxPQVQgZHkpIHsNCisgICAgbV9NYXRyaXguVHJhbnNsYXRlKGR4LCBkeSk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgUm90YXRlTWF0cml4KEZYX0ZMT0FUIGZSYWRpYW4pIHsgbV9NYXRyaXguUm90YXRlKGZSYWRpYW4pOyB9DQorICB2aXJ0dWFsIHZvaWQgU2NhbGVNYXRyaXgoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5KSB7IG1fTWF0cml4LlNjYWxlKHN4LCBzeSk7IH0NCisgIHZpcnR1YWwgdm9pZCBDb25jYXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7DQorICAgIG1fTWF0cml4LkNvbmNhdChtYXRyaXgpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsgbV9NYXRyaXggPSBtYXRyaXg7IH0NCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fQ29sb3I7IH0NCisgIHZpcnR1YWwgdm9pZCBTZXRDb2xvcihGWF9BUkdCIGNvbG9yKSB7IG1fQ29sb3IgPSBjb2xvcjsgfQ0KIA0KLSAgICBGWF9BUkdCCQkJCQkJbV9Db2xvcjsNCi0gICAgQ0ZYX01hdHJpeAkJCQkJbV9NYXRyaXg7DQorICBGWF9BUkdCIG1fQ29sb3I7DQorICBDRlhfTWF0cml4IG1fTWF0cml4Ow0KIH07DQotY2xhc3MgQ0ZERV9IYXRjaEJydXNoIDogcHVibGljIElGREVfSGF0Y2hCcnVzaCwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX0hhdGNoQnJ1c2goKSA6IG1faVN0eWxlKC0xKSwgbV9CYWNrQ29sb3IoMCksIG1fRm9yZUNvbG9yKDApDQotICAgIHsNCi0gICAgICAgIG1fTWF0cml4LlJlc2V0KCk7DQotICAgIH0NCitjbGFzcyBDRkRFX0hhdGNoQnJ1c2ggOiBwdWJsaWMgSUZERV9IYXRjaEJydXNoLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfSGF0Y2hCcnVzaCgpIDogbV9pU3R5bGUoLTEpLCBtX0JhY2tDb2xvcigwKSwgbV9Gb3JlQ29sb3IoMCkgew0KKyAgICBtX01hdHJpeC5SZXNldCgpOw0KKyAgfQ0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZERV9CUlVTSFRZUEVfSGF0Y2g7IH0NCisgIHZpcnR1YWwgY29uc3QgQ0ZYX01hdHJpeCYgR2V0TWF0cml4KCkgY29uc3QgeyByZXR1cm4gbV9NYXRyaXg7IH0NCisgIHZpcnR1YWwgdm9pZCBSZXNldE1hdHJpeCgpIHsgbV9NYXRyaXguUmVzZXQoKTsgfQ0KKyAgdmlydHVhbCB2b2lkIFRyYW5zbGF0ZU1hdHJpeChGWF9GTE9BVCBkeCwgRlhfRkxPQVQgZHkpIHsNCisgICAgbV9NYXRyaXguVHJhbnNsYXRlKGR4LCBkeSk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgUm90YXRlTWF0cml4KEZYX0ZMT0FUIGZSYWRpYW4pIHsgbV9NYXRyaXguUm90YXRlKGZSYWRpYW4pOyB9DQorICB2aXJ0dWFsIHZvaWQgU2NhbGVNYXRyaXgoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5KSB7IG1fTWF0cml4LlNjYWxlKHN4LCBzeSk7IH0NCisgIHZpcnR1YWwgdm9pZCBDb25jYXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7DQorICAgIG1fTWF0cml4LkNvbmNhdChtYXRyaXgpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsgbV9NYXRyaXggPSBtYXRyaXg7IH0NCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRDb2xvcihGWF9CT09MIGJGb3JlZ3JvdW5kQ29sb3IpIGNvbnN0IHsNCisgICAgcmV0dXJuIGJGb3JlZ3JvdW5kQ29sb3IgPyBtX0ZvcmVDb2xvciA6IG1fQmFja0NvbG9yOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldENvbG9yKEZYX0FSR0IgY29sb3IsIEZYX0JPT0wgYkZvcmVncm91bmRDb2xvcikgew0KKyAgICBpZiAoYkZvcmVncm91bmRDb2xvcikgew0KKyAgICAgIG1fRm9yZUNvbG9yID0gY29sb3I7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9CYWNrQ29sb3IgPSBjb2xvcjsNCiAgICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRUeXBlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZERV9CUlVTSFRZUEVfSGF0Y2g7DQotICAgIH0NCi0gICAgdmlydHVhbCBjb25zdCBDRlhfTWF0cml4JglHZXRNYXRyaXgoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9NYXRyaXg7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0TWF0cml4KCkNCi0gICAgew0KLSAgICAgICAgbV9NYXRyaXguUmVzZXQoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJVHJhbnNsYXRlTWF0cml4KEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSkNCi0gICAgew0KLSAgICAgICAgbV9NYXRyaXguVHJhbnNsYXRlKGR4LCBkeSk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVJvdGF0ZU1hdHJpeChGWF9GTE9BVCBmUmFkaWFuKQ0KLSAgICB7DQotICAgICAgICBtX01hdHJpeC5Sb3RhdGUoZlJhZGlhbik7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVNjYWxlTWF0cml4KEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSkNCi0gICAgew0KLSAgICAgICAgbV9NYXRyaXguU2NhbGUoc3gsIHN5KTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJQ29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkNCi0gICAgew0KLSAgICAgICAgbV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpDQotICAgIHsNCi0gICAgICAgIG1fTWF0cml4ID0gbWF0cml4Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQVJHQgkJCQlHZXRDb2xvcihGWF9CT09MIGJGb3JlZ3JvdW5kQ29sb3IpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBiRm9yZWdyb3VuZENvbG9yID8gbV9Gb3JlQ29sb3IgOiBtX0JhY2tDb2xvcjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0Q29sb3IoRlhfQVJHQiBjb2xvciwgRlhfQk9PTCBiRm9yZWdyb3VuZENvbG9yKQ0KLSAgICB7DQotICAgICAgICBpZiAoYkZvcmVncm91bmRDb2xvcikgew0KLSAgICAgICAgICAgIG1fRm9yZUNvbG9yID0gY29sb3I7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1fQmFja0NvbG9yID0gY29sb3I7DQotICAgICAgICB9DQotICAgIH0NCisgIH0NCiANCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0SGF0Y2hTdHlsZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lTdHlsZTsNCi0gICAgfTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCVNldEhhdGNoU3R5bGUoaW50MzJfdCBpSGF0Y2hTdHlsZSkNCi0gICAgew0KLSAgICAgICAgbV9pU3R5bGUgPSBpSGF0Y2hTdHlsZTsNCi0gICAgICAgIHJldHVybiBtX2lTdHlsZSA+PSBGREVfSEFUQ0hTVFlMRV9NaW4gJiYgbV9pU3R5bGUgPD0gRkRFX0hBVENIU1RZTEVfTWF4Ow0KLSAgICB9DQotICAgIGludDMyX3QJCQkJCW1faVN0eWxlOw0KLSAgICBGWF9BUkdCCQkJCQkJbV9CYWNrQ29sb3I7DQotICAgIEZYX0FSR0IJCQkJCQltX0ZvcmVDb2xvcjsNCi0gICAgQ0ZYX01hdHJpeAkJCQkJbV9NYXRyaXg7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SGF0Y2hTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1faVN0eWxlOyB9Ow0KKyAgdmlydHVhbCBGWF9CT09MIFNldEhhdGNoU3R5bGUoaW50MzJfdCBpSGF0Y2hTdHlsZSkgew0KKyAgICBtX2lTdHlsZSA9IGlIYXRjaFN0eWxlOw0KKyAgICByZXR1cm4gbV9pU3R5bGUgPj0gRkRFX0hBVENIU1RZTEVfTWluICYmIG1faVN0eWxlIDw9IEZERV9IQVRDSFNUWUxFX01heDsNCisgIH0NCisgIGludDMyX3QgbV9pU3R5bGU7DQorICBGWF9BUkdCIG1fQmFja0NvbG9yOw0KKyAgRlhfQVJHQiBtX0ZvcmVDb2xvcjsNCisgIENGWF9NYXRyaXggbV9NYXRyaXg7DQogfTsNCi1jbGFzcyBDRkRFX1RleHR1cmVCcnVzaCA6IHB1YmxpYyBJRkRFX1RleHR1cmVCcnVzaCwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1RleHR1cmVCcnVzaCgpDQotICAgICAgICA6IG1faVdyYXAoMCkNCi0gICAgICAgICwgbV9wSW1hZ2UoTlVMTCkNCi0gICAgICAgICwgbV9iQXV0b1JlbGVhc2UoRkFMU0UpDQotICAgIHsNCi0gICAgICAgIG1fTWF0cml4LlJlc2V0KCk7DQotICAgIH0NCitjbGFzcyBDRkRFX1RleHR1cmVCcnVzaCA6IHB1YmxpYyBJRkRFX1RleHR1cmVCcnVzaCwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX1RleHR1cmVCcnVzaCgpIDogbV9pV3JhcCgwKSwgbV9wSW1hZ2UoTlVMTCksIG1fYkF1dG9SZWxlYXNlKEZBTFNFKSB7DQorICAgIG1fTWF0cml4LlJlc2V0KCk7DQorICB9DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0VHlwZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBGREVfQlJVU0hUWVBFX1RleHR1cmU7DQotICAgIH0NCi0gICAgdmlydHVhbCBjb25zdCBDRlhfTWF0cml4JglHZXRNYXRyaXgoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9NYXRyaXg7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0TWF0cml4KCkNCi0gICAgew0KLSAgICAgICAgbV9NYXRyaXguUmVzZXQoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJVHJhbnNsYXRlTWF0cml4KEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSkNCi0gICAgew0KLSAgICAgICAgbV9NYXRyaXguVHJhbnNsYXRlKGR4LCBkeSk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVJvdGF0ZU1hdHJpeChGWF9GTE9BVCBmUmFkaWFuKQ0KLSAgICB7DQotICAgICAgICBtX01hdHJpeC5Sb3RhdGUoZlJhZGlhbik7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVNjYWxlTWF0cml4KEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSkNCi0gICAgew0KLSAgICAgICAgbV9NYXRyaXguU2NhbGUoc3gsIHN5KTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJQ29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkNCi0gICAgew0KLSAgICAgICAgbV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpDQotICAgIHsNCi0gICAgICAgIG1fTWF0cml4ID0gbWF0cml4Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgSUZERV9JbWFnZSoJCQlHZXRJbWFnZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BJbWFnZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0SW1hZ2UoSUZERV9JbWFnZSAqcEltYWdlLCBGWF9CT09MIGJBdXRvUmVsZWFzZSkNCi0gICAgew0KLSAgICAgICAgbV9wSW1hZ2UgPSBwSW1hZ2U7DQotICAgICAgICBtX2JBdXRvUmVsZWFzZSA9IGJBdXRvUmVsZWFzZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRXcmFwTW9kZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lXcmFwOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRXcmFwTW9kZShpbnQzMl90IGlXcmFwTW9kZSkNCi0gICAgew0KLSAgICAgICAgbV9pV3JhcCA9IGlXcmFwTW9kZTsNCi0gICAgfQ0KLSAgICBpbnQzMl90CQkJCQltX2lXcmFwOw0KLSAgICBJRkRFX0ltYWdlCQkJCQkqbV9wSW1hZ2U7DQotICAgIEZYX0JPT0wJCQkJCQltX2JBdXRvUmVsZWFzZTsNCi0gICAgQ0ZYX01hdHJpeAkJCQkJbV9NYXRyaXg7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRkRFX0JSVVNIVFlQRV9UZXh0dXJlOyB9DQorICB2aXJ0dWFsIGNvbnN0IENGWF9NYXRyaXgmIEdldE1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIG1fTWF0cml4OyB9DQorICB2aXJ0dWFsIHZvaWQgUmVzZXRNYXRyaXgoKSB7IG1fTWF0cml4LlJlc2V0KCk7IH0NCisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVNYXRyaXgoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KSB7DQorICAgIG1fTWF0cml4LlRyYW5zbGF0ZShkeCwgZHkpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFJvdGF0ZU1hdHJpeChGWF9GTE9BVCBmUmFkaWFuKSB7IG1fTWF0cml4LlJvdGF0ZShmUmFkaWFuKTsgfQ0KKyAgdmlydHVhbCB2b2lkIFNjYWxlTWF0cml4KEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSkgeyBtX01hdHJpeC5TY2FsZShzeCwgc3kpOyB9DQorICB2aXJ0dWFsIHZvaWQgQ29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgICBtX01hdHJpeC5Db25jYXQobWF0cml4KTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7IG1fTWF0cml4ID0gbWF0cml4OyB9DQorICB2aXJ0dWFsIElGREVfSW1hZ2UqIEdldEltYWdlKCkgY29uc3QgeyByZXR1cm4gbV9wSW1hZ2U7IH0NCisgIHZpcnR1YWwgdm9pZCBTZXRJbWFnZShJRkRFX0ltYWdlKiBwSW1hZ2UsIEZYX0JPT0wgYkF1dG9SZWxlYXNlKSB7DQorICAgIG1fcEltYWdlID0gcEltYWdlOw0KKyAgICBtX2JBdXRvUmVsZWFzZSA9IGJBdXRvUmVsZWFzZTsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXcmFwTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1faVdyYXA7IH0NCisgIHZpcnR1YWwgdm9pZCBTZXRXcmFwTW9kZShpbnQzMl90IGlXcmFwTW9kZSkgeyBtX2lXcmFwID0gaVdyYXBNb2RlOyB9DQorICBpbnQzMl90IG1faVdyYXA7DQorICBJRkRFX0ltYWdlKiBtX3BJbWFnZTsNCisgIEZYX0JPT0wgbV9iQXV0b1JlbGVhc2U7DQorICBDRlhfTWF0cml4IG1fTWF0cml4Ow0KIH07DQotY2xhc3MgQ0ZERV9MaW5lYXJCcnVzaCA6IHB1YmxpYyBJRkRFX0xpbmVhckdyYWRpZW50QnJ1c2gsIHB1YmxpYyBDRlhfVGFyZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9MaW5lYXJCcnVzaCgpIDogbV9FbmRDb2xvcigwKSwgbV9TdGFydENvbG9yKDApLCBtX2lXcmFwTW9kZSgwKQ0KLSAgICB7DQotICAgICAgICBtX1N0YXJ0UG9pbnQueCA9IG1fU3RhcnRQb2ludC55ID0gbV9FbmRQb2ludC54ID0gbV9FbmRQb2ludC55ID0gMDsNCi0gICAgICAgIG1fTWF0cml4LlJlc2V0KCk7DQotICAgIH0NCitjbGFzcyBDRkRFX0xpbmVhckJydXNoIDogcHVibGljIElGREVfTGluZWFyR3JhZGllbnRCcnVzaCwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0xpbmVhckJydXNoKCkgOiBtX0VuZENvbG9yKDApLCBtX1N0YXJ0Q29sb3IoMCksIG1faVdyYXBNb2RlKDApIHsNCisgICAgbV9TdGFydFBvaW50LnggPSBtX1N0YXJ0UG9pbnQueSA9IG1fRW5kUG9pbnQueCA9IG1fRW5kUG9pbnQueSA9IDA7DQorICAgIG1fTWF0cml4LlJlc2V0KCk7DQorICB9DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0VHlwZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBGREVfQlJVU0hUWVBFX0xpbmVhckdyYWRpZW50Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgQ0ZYX01hdHJpeCYJR2V0TWF0cml4KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fTWF0cml4Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZXNldE1hdHJpeCgpDQotICAgIHsNCi0gICAgICAgIG1fTWF0cml4LlJlc2V0KCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVRyYW5zbGF0ZU1hdHJpeChGWF9GTE9BVCBkeCwgRlhfRkxPQVQgZHkpDQotICAgIHsNCi0gICAgICAgIG1fTWF0cml4LlRyYW5zbGF0ZShkeCwgZHkpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSb3RhdGVNYXRyaXgoRlhfRkxPQVQgZlJhZGlhbikNCi0gICAgew0KLSAgICAgICAgbV9NYXRyaXguUm90YXRlKGZSYWRpYW4pOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTY2FsZU1hdHJpeChGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3kpDQotICAgIHsNCi0gICAgICAgIG1fTWF0cml4LlNjYWxlKHN4LCBzeSk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCUNvbmNhdE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpDQotICAgIHsNCi0gICAgICAgIG1fTWF0cml4LkNvbmNhdChtYXRyaXgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KLSAgICB7DQotICAgICAgICBtX01hdHJpeCA9IG1hdHJpeDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJR2V0TGluZWFyUG9pbnRzKENGWF9Qb2ludEYgJnN0YXJ0aW5nUG9pbnQsIENGWF9Qb2ludEYgJmVuZGluZ1BvaW50KSBjb25zdA0KLSAgICB7DQotICAgICAgICBzdGFydGluZ1BvaW50ID0gbV9TdGFydFBvaW50Ow0KLSAgICAgICAgZW5kaW5nUG9pbnQgPSBtX0VuZFBvaW50Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRMaW5lYXJQb2ludHMoY29uc3QgQ0ZYX1BvaW50RiAmc3RhcnRpbmdQb2ludCwgY29uc3QgQ0ZYX1BvaW50RiAmZW5kaW5nUG9pbnQpDQotICAgIHsNCi0gICAgICAgIG1fU3RhcnRQb2ludCA9IHN0YXJ0aW5nUG9pbnQ7DQotICAgICAgICBtX0VuZFBvaW50ID0gZW5kaW5nUG9pbnQ7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCUdldExpbmVhckNvbG9ycyhGWF9BUkdCICZzdGFydGluZ0NvbG9yLCBGWF9BUkdCICZlbmRpbmdDb2xvcikgY29uc3QNCi0gICAgew0KLSAgICAgICAgc3RhcnRpbmdDb2xvciA9IG1fU3RhcnRDb2xvcjsNCi0gICAgICAgIGVuZGluZ0NvbG9yID0gbV9FbmRDb2xvcjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0TGluZWFyQ29sb3JzKGNvbnN0IEZYX0FSR0IgJnN0YXJ0aW5nQ29sb3IsIGNvbnN0IEZYX0FSR0IgJmVuZGluZ0NvbG9yKQ0KLSAgICB7DQotICAgICAgICBtX1N0YXJ0Q29sb3IgPSBzdGFydGluZ0NvbG9yOw0KLSAgICAgICAgbV9FbmRDb2xvciA9IGVuZGluZ0NvbG9yOw0KLSAgICB9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUNvdW50R3JhZGllbnRDb2xvcnMoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9HcmFkQ29sb3JzLkdldFNpemUoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRHcmFkaWVudENvbG9ycyhDRkRFX0dyYWRpZW50Q29sb3JzICZjb2xvcnMpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb2xvcnMuQ29weShtX0dyYWRDb2xvcnMpLCBUUlVFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEdyYWRpZW50Q29sb3JzKGNvbnN0IENGREVfR3JhZGllbnRDb2xvcnMgJmNvbG9ycykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fR3JhZENvbG9ycy5Db3B5KGNvbG9ycyksIFRSVUU7DQotICAgIH0NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGREVfQlJVU0hUWVBFX0xpbmVhckdyYWRpZW50OyB9DQorICB2aXJ0dWFsIGNvbnN0IENGWF9NYXRyaXgmIEdldE1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIG1fTWF0cml4OyB9DQorICB2aXJ0dWFsIHZvaWQgUmVzZXRNYXRyaXgoKSB7IG1fTWF0cml4LlJlc2V0KCk7IH0NCisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVNYXRyaXgoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KSB7DQorICAgIG1fTWF0cml4LlRyYW5zbGF0ZShkeCwgZHkpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFJvdGF0ZU1hdHJpeChGWF9GTE9BVCBmUmFkaWFuKSB7IG1fTWF0cml4LlJvdGF0ZShmUmFkaWFuKTsgfQ0KKyAgdmlydHVhbCB2b2lkIFNjYWxlTWF0cml4KEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSkgeyBtX01hdHJpeC5TY2FsZShzeCwgc3kpOyB9DQorICB2aXJ0dWFsIHZvaWQgQ29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgICBtX01hdHJpeC5Db25jYXQobWF0cml4KTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7IG1fTWF0cml4ID0gbWF0cml4OyB9DQorICB2aXJ0dWFsIHZvaWQgR2V0TGluZWFyUG9pbnRzKENGWF9Qb2ludEYmIHN0YXJ0aW5nUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYmIGVuZGluZ1BvaW50KSBjb25zdCB7DQorICAgIHN0YXJ0aW5nUG9pbnQgPSBtX1N0YXJ0UG9pbnQ7DQorICAgIGVuZGluZ1BvaW50ID0gbV9FbmRQb2ludDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lYXJQb2ludHMoY29uc3QgQ0ZYX1BvaW50RiYgc3RhcnRpbmdQb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgZW5kaW5nUG9pbnQpIHsNCisgICAgbV9TdGFydFBvaW50ID0gc3RhcnRpbmdQb2ludDsNCisgICAgbV9FbmRQb2ludCA9IGVuZGluZ1BvaW50Ow0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEdldExpbmVhckNvbG9ycyhGWF9BUkdCJiBzdGFydGluZ0NvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCJiBlbmRpbmdDb2xvcikgY29uc3Qgew0KKyAgICBzdGFydGluZ0NvbG9yID0gbV9TdGFydENvbG9yOw0KKyAgICBlbmRpbmdDb2xvciA9IG1fRW5kQ29sb3I7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZWFyQ29sb3JzKGNvbnN0IEZYX0FSR0ImIHN0YXJ0aW5nQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0ImIGVuZGluZ0NvbG9yKSB7DQorICAgIG1fU3RhcnRDb2xvciA9IHN0YXJ0aW5nQ29sb3I7DQorICAgIG1fRW5kQ29sb3IgPSBlbmRpbmdDb2xvcjsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEdyYWRpZW50Q29sb3JzKCkgY29uc3QgeyByZXR1cm4gbV9HcmFkQ29sb3JzLkdldFNpemUoKTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEdldEdyYWRpZW50Q29sb3JzKENGREVfR3JhZGllbnRDb2xvcnMmIGNvbG9ycykgY29uc3Qgew0KKyAgICByZXR1cm4gY29sb3JzLkNvcHkobV9HcmFkQ29sb3JzKSwgVFJVRTsNCisgIH0NCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRHcmFkaWVudENvbG9ycyhjb25zdCBDRkRFX0dyYWRpZW50Q29sb3JzJiBjb2xvcnMpIHsNCisgICAgcmV0dXJuIG1fR3JhZENvbG9ycy5Db3B5KGNvbG9ycyksIFRSVUU7DQorICB9DQogDQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFdyYXBNb2RlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faVdyYXBNb2RlOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRXcmFwTW9kZShpbnQzMl90IGlXcmFwTW9kZSkNCi0gICAgew0KLSAgICAgICAgbV9pV3JhcE1vZGUgPSBpV3JhcE1vZGU7DQotICAgIH0NCi0gICAgQ0ZYX1BvaW50RgkJCQkJbV9FbmRQb2ludDsNCi0gICAgQ0ZYX1BvaW50RgkJCQkJbV9TdGFydFBvaW50Ow0KLSAgICBGWF9BUkdCCQkJCQkJbV9FbmRDb2xvcjsNCi0gICAgRlhfQVJHQgkJCQkJCW1fU3RhcnRDb2xvcjsNCi0gICAgQ0ZERV9HcmFkaWVudENvbG9ycwkJCW1fR3JhZENvbG9yczsNCi0gICAgaW50MzJfdAkJCQkJbV9pV3JhcE1vZGU7DQotICAgIENGWF9NYXRyaXgJCQkJCW1fTWF0cml4Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdyYXBNb2RlKCkgY29uc3QgeyByZXR1cm4gbV9pV3JhcE1vZGU7IH0NCisgIHZpcnR1YWwgdm9pZCBTZXRXcmFwTW9kZShpbnQzMl90IGlXcmFwTW9kZSkgeyBtX2lXcmFwTW9kZSA9IGlXcmFwTW9kZTsgfQ0KKyAgQ0ZYX1BvaW50RiBtX0VuZFBvaW50Ow0KKyAgQ0ZYX1BvaW50RiBtX1N0YXJ0UG9pbnQ7DQorICBGWF9BUkdCIG1fRW5kQ29sb3I7DQorICBGWF9BUkdCIG1fU3RhcnRDb2xvcjsNCisgIENGREVfR3JhZGllbnRDb2xvcnMgbV9HcmFkQ29sb3JzOw0KKyAgaW50MzJfdCBtX2lXcmFwTW9kZTsNCisgIENGWF9NYXRyaXggbV9NYXRyaXg7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9yZW5kZXIuY3BwIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfcmVuZGVyLmNwcAppbmRleCBmZjhkY2VlLi5mMzBkMjc0IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9yZW5kZXIuY3BwCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX3JlbmRlci5jcHAKQEAgLTYsMjQ4ICs2LDI1OCBAQAogDQogI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQogI2luY2x1ZGUgImZkZV9yZW5kZXIuaCINCi12b2lkIEZERV9HZXRQYWdlTWF0cml4KENGWF9NYXRyaXggJnBhZ2VNYXRyaXgsIGNvbnN0IENGWF9SZWN0RiAmZG9jUGFnZVJlY3QsIGNvbnN0IENGWF9SZWN0ICZkZXZpY2VQYWdlUmVjdCwgaW50MzJfdCBpUm90YXRlLCBGWF9EV09SRCBkd0Nvb3JkaW5hdGVzVHlwZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChpUm90YXRlID49IDAgJiYgaVJvdGF0ZSA8PSAzKTsNCi0gICAgRlhfQk9PTCBiRmxpcFggPSAoZHdDb29yZGluYXRlc1R5cGUgJiAweDAxKSAhPSAwOw0KLSAgICBGWF9CT09MIGJGbGlwWSA9IChkd0Nvb3JkaW5hdGVzVHlwZSAmIDB4MDIpICE9IDA7DQotICAgIENGWF9NYXRyaXggbTsNCi0gICAgbS5TZXQoKGJGbGlwWCA/IC0xLjBmIDogMS4wZiksIDAsIDAsIChiRmxpcFkgPyAtMS4wZiA6IDEuMGYpLCAwLCAwKTsNCi0gICAgaWYgKGlSb3RhdGUgPT0gMCB8fCBpUm90YXRlID09IDIpIHsNCi0gICAgICAgIG0uYSAqPSAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3Qud2lkdGggLyBkb2NQYWdlUmVjdC53aWR0aDsNCi0gICAgICAgIG0uZCAqPSAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QuaGVpZ2h0IC8gZG9jUGFnZVJlY3QuaGVpZ2h0Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbS5hICo9IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5oZWlnaHQgLyBkb2NQYWdlUmVjdC53aWR0aDsNCi0gICAgICAgIG0uZCAqPSAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3Qud2lkdGggLyBkb2NQYWdlUmVjdC5oZWlnaHQ7DQotICAgIH0NCi0gICAgbS5Sb3RhdGUoaVJvdGF0ZSAqIDEuNTcwNzk2MzI2NzVmKTsNCi0gICAgc3dpdGNoIChpUm90YXRlKSB7DQotICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgbS5lID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCkgOiAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QubGVmdDsNCi0gICAgICAgICAgICBtLmYgPSBiRmxpcFkgPyAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QuYm90dG9tKCkgOiAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QudG9wOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgIG0uZSA9IGJGbGlwWSA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5sZWZ0IDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCk7DQotICAgICAgICAgICAgbS5mID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICBtLmUgPSBiRmxpcFggPyAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QubGVmdCA6IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5yaWdodCgpOw0KLSAgICAgICAgICAgIG0uZiA9IGJGbGlwWSA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC50b3AgOiAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QuYm90dG9tKCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgbS5lID0gYkZsaXBZID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCkgOiAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QubGVmdDsNCi0gICAgICAgICAgICBtLmYgPSBiRmxpcFggPyAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QudG9wIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBwYWdlTWF0cml4ID0gbTsNCit2b2lkIEZERV9HZXRQYWdlTWF0cml4KENGWF9NYXRyaXgmIHBhZ2VNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIGRvY1BhZ2VSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3QmIGRldmljZVBhZ2VSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDb29yZGluYXRlc1R5cGUpIHsNCisgIEZYU1lTX2Fzc2VydChpUm90YXRlID49IDAgJiYgaVJvdGF0ZSA8PSAzKTsNCisgIEZYX0JPT0wgYkZsaXBYID0gKGR3Q29vcmRpbmF0ZXNUeXBlICYgMHgwMSkgIT0gMDsNCisgIEZYX0JPT0wgYkZsaXBZID0gKGR3Q29vcmRpbmF0ZXNUeXBlICYgMHgwMikgIT0gMDsNCisgIENGWF9NYXRyaXggbTsNCisgIG0uU2V0KChiRmxpcFggPyAtMS4wZiA6IDEuMGYpLCAwLCAwLCAoYkZsaXBZID8gLTEuMGYgOiAxLjBmKSwgMCwgMCk7DQorICBpZiAoaVJvdGF0ZSA9PSAwIHx8IGlSb3RhdGUgPT0gMikgew0KKyAgICBtLmEgKj0gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LndpZHRoIC8gZG9jUGFnZVJlY3Qud2lkdGg7DQorICAgIG0uZCAqPSAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QuaGVpZ2h0IC8gZG9jUGFnZVJlY3QuaGVpZ2h0Ow0KKyAgfSBlbHNlIHsNCisgICAgbS5hICo9IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5oZWlnaHQgLyBkb2NQYWdlUmVjdC53aWR0aDsNCisgICAgbS5kICo9IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC53aWR0aCAvIGRvY1BhZ2VSZWN0LmhlaWdodDsNCisgIH0NCisgIG0uUm90YXRlKGlSb3RhdGUgKiAxLjU3MDc5NjMyNjc1Zik7DQorICBzd2l0Y2ggKGlSb3RhdGUpIHsNCisgICAgY2FzZSAwOg0KKyAgICAgIG0uZSA9IGJGbGlwWCA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5yaWdodCgpDQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmxlZnQ7DQorICAgICAgbS5mID0gYkZsaXBZID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpDQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxOg0KKyAgICAgIG0uZSA9IGJGbGlwWSA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5sZWZ0DQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCk7DQorICAgICAgbS5mID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpDQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIG0uZSA9IGJGbGlwWCA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5sZWZ0DQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCk7DQorICAgICAgbS5mID0gYkZsaXBZID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcA0KKyAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5ib3R0b20oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAzOg0KKyAgICAgIG0uZSA9IGJGbGlwWSA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5yaWdodCgpDQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmxlZnQ7DQorICAgICAgbS5mID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcA0KKyAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5ib3R0b20oKTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHBhZ2VNYXRyaXggPSBtOw0KIH0NCi1JRkRFX1JlbmRlckNvbnRleHQqIElGREVfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBuZXcgQ0ZERV9SZW5kZXJDb250ZXh0Ow0KK0lGREVfUmVuZGVyQ29udGV4dCogSUZERV9SZW5kZXJDb250ZXh0OjpDcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IENGREVfUmVuZGVyQ29udGV4dDsNCiB9DQogQ0ZERV9SZW5kZXJDb250ZXh0OjpDRkRFX1JlbmRlckNvbnRleHQoKQ0KLSAgICA6IENGWF9UaHJlYWRMb2NrKCkNCi0gICAgLCBtX2VTdGF0dXMoRkRFX1JFTkRFUlNUQVRVU19SZXNldCkNCi0gICAgLCBtX3BSZW5kZXJEZXZpY2UoTlVMTCkNCi0gICAgLCBtX3BTb2xpZEJydXNoKE5VTEwpDQotICAgICwgbV9UcmFuc2Zvcm0oKQ0KLSAgICAsIG1fcENoYXJQb3MoTlVMTCkNCi0gICAgLCBtX2lDaGFyUG9zQ291bnQoMCkNCi0gICAgLCBtX3BJdGVyYXRvcihOVUxMKQ0KLXsNCi0gICAgbV9UcmFuc2Zvcm0uUmVzZXQoKTsNCisgICAgOiBDRlhfVGhyZWFkTG9jaygpLA0KKyAgICAgIG1fZVN0YXR1cyhGREVfUkVOREVSU1RBVFVTX1Jlc2V0KSwNCisgICAgICBtX3BSZW5kZXJEZXZpY2UoTlVMTCksDQorICAgICAgbV9wU29saWRCcnVzaChOVUxMKSwNCisgICAgICBtX1RyYW5zZm9ybSgpLA0KKyAgICAgIG1fcENoYXJQb3MoTlVMTCksDQorICAgICAgbV9pQ2hhclBvc0NvdW50KDApLA0KKyAgICAgIG1fcEl0ZXJhdG9yKE5VTEwpIHsNCisgIG1fVHJhbnNmb3JtLlJlc2V0KCk7DQogfQ0KLUNGREVfUmVuZGVyQ29udGV4dDo6fkNGREVfUmVuZGVyQ29udGV4dCgpDQotew0KLSAgICBTdG9wUmVuZGVyKCk7DQorQ0ZERV9SZW5kZXJDb250ZXh0Ojp+Q0ZERV9SZW5kZXJDb250ZXh0KCkgew0KKyAgU3RvcFJlbmRlcigpOw0KIH0NCi1GWF9CT09MIENGREVfUmVuZGVyQ29udGV4dDo6U3RhcnRSZW5kZXIoSUZERV9SZW5kZXJEZXZpY2UgKnBSZW5kZXJEZXZpY2UsIElGREVfQ2FudmFzU2V0ICpwQ2FudmFzU2V0LCBjb25zdCBDRlhfTWF0cml4ICZ0bURvYzJEZXZpY2UgKQ0KLXsNCi0gICAgaWYgKG1fcFJlbmRlckRldmljZSAhPSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKHBSZW5kZXJEZXZpY2UgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmIChwQ2FudmFzU2V0ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBMb2NrKCk7DQotICAgIG1fZVN0YXR1cyA9IEZERV9SRU5ERVJTVEFUVVNfUGF1c2VkOw0KLSAgICBtX3BSZW5kZXJEZXZpY2UgPSBwUmVuZGVyRGV2aWNlOw0KLSAgICBtX1RyYW5zZm9ybSA9IHRtRG9jMkRldmljZTsNCi0gICAgaWYgKG1fcEl0ZXJhdG9yID09IE5VTEwpIHsNCi0gICAgICAgIG1fcEl0ZXJhdG9yID0gSUZERV9WaXN1YWxTZXRJdGVyYXRvcjo6Q3JlYXRlKCk7DQotICAgICAgICBGWFNZU19hc3NlcnQobV9wSXRlcmF0b3IgIT0gTlVMTCk7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiQXR0YWNoID0gbV9wSXRlcmF0b3ItPkF0dGFjaENhbnZhcyhwQ2FudmFzU2V0KSAmJiBtX3BJdGVyYXRvci0+RmlsdGVyT2JqZWN0cygpOw0KLSAgICBVbmxvY2soKTsNCi0gICAgcmV0dXJuIGJBdHRhY2g7DQorRlhfQk9PTCBDRkRFX1JlbmRlckNvbnRleHQ6OlN0YXJ0UmVuZGVyKElGREVfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NhbnZhc1NldCogcENhbnZhc1NldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKSB7DQorICBpZiAobV9wUmVuZGVyRGV2aWNlICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBSZW5kZXJEZXZpY2UgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocENhbnZhc1NldCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIExvY2soKTsNCisgIG1fZVN0YXR1cyA9IEZERV9SRU5ERVJTVEFUVVNfUGF1c2VkOw0KKyAgbV9wUmVuZGVyRGV2aWNlID0gcFJlbmRlckRldmljZTsNCisgIG1fVHJhbnNmb3JtID0gdG1Eb2MyRGV2aWNlOw0KKyAgaWYgKG1fcEl0ZXJhdG9yID09IE5VTEwpIHsNCisgICAgbV9wSXRlcmF0b3IgPSBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpDcmVhdGUoKTsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEl0ZXJhdG9yICE9IE5VTEwpOw0KKyAgfQ0KKyAgRlhfQk9PTCBiQXR0YWNoID0NCisgICAgICBtX3BJdGVyYXRvci0+QXR0YWNoQ2FudmFzKHBDYW52YXNTZXQpICYmIG1fcEl0ZXJhdG9yLT5GaWx0ZXJPYmplY3RzKCk7DQorICBVbmxvY2soKTsNCisgIHJldHVybiBiQXR0YWNoOw0KIH0NCi1GREVfUkVOREVSU1RBVFVTIENGREVfUmVuZGVyQ29udGV4dDo6RG9SZW5kZXIoSUZYX1BhdXNlICpwUGF1c2UpDQotew0KLSAgICBpZiAobV9wUmVuZGVyRGV2aWNlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGREVfUkVOREVSU1RBVFVTX0ZhaWxlZDsNCitGREVfUkVOREVSU1RBVFVTIENGREVfUmVuZGVyQ29udGV4dDo6RG9SZW5kZXIoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmIChtX3BSZW5kZXJEZXZpY2UgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkRFX1JFTkRFUlNUQVRVU19GYWlsZWQ7DQorICB9DQorICBpZiAobV9wSXRlcmF0b3IgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkRFX1JFTkRFUlNUQVRVU19GYWlsZWQ7DQorICB9DQorICBMb2NrKCk7DQorICBGREVfUkVOREVSU1RBVFVTIGVTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX1BhdXNlZDsNCisgIENGWF9NYXRyaXggcm07DQorICBybS5TZXRSZXZlcnNlKG1fVHJhbnNmb3JtKTsNCisgIENGWF9SZWN0RiBydERvY0NsaXAgPSBtX3BSZW5kZXJEZXZpY2UtPkdldENsaXBSZWN0KCk7DQorICBpZiAocnREb2NDbGlwLklzRW1wdHkoKSkgew0KKyAgICBydERvY0NsaXAubGVmdCA9IHJ0RG9jQ2xpcC50b3AgPSAwOw0KKyAgICBydERvY0NsaXAud2lkdGggPSAoRlhfRkxPQVQpbV9wUmVuZGVyRGV2aWNlLT5HZXRXaWR0aCgpOw0KKyAgICBydERvY0NsaXAuaGVpZ2h0ID0gKEZYX0ZMT0FUKW1fcFJlbmRlckRldmljZS0+R2V0SGVpZ2h0KCk7DQorICB9DQorICBybS5UcmFuc2Zvcm1SZWN0KHJ0RG9jQ2xpcCk7DQorICBJRkRFX1Zpc3VhbFNldCogcFZpc3VhbFNldDsNCisgIEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmo7DQorICBDRlhfUmVjdEYgcnRPYmo7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBoVmlzdWFsT2JqID0gbV9wSXRlcmF0b3ItPkdldE5leHQocFZpc3VhbFNldCk7DQorICAgIGlmIChoVmlzdWFsT2JqID09IE5VTEwgfHwgcFZpc3VhbFNldCA9PSBOVUxMKSB7DQorICAgICAgZVN0YXR1cyA9IEZERV9SRU5ERVJTVEFUVVNfRG9uZTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpZiAobV9wSXRlcmF0b3IgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZERV9SRU5ERVJTVEFUVVNfRmFpbGVkOw0KKyAgICBydE9iai5FbXB0eSgpOw0KKyAgICBwVmlzdWFsU2V0LT5HZXRSZWN0KGhWaXN1YWxPYmosIHJ0T2JqKTsNCisgICAgaWYgKCFydERvY0NsaXAuSW50ZXJzZWN0V2l0aChydE9iaikpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBMb2NrKCk7DQotICAgIEZERV9SRU5ERVJTVEFUVVMgZVN0YXR1cyA9IEZERV9SRU5ERVJTVEFUVVNfUGF1c2VkOw0KLSAgICBDRlhfTWF0cml4IHJtOw0KLSAgICBybS5TZXRSZXZlcnNlKG1fVHJhbnNmb3JtKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0RG9jQ2xpcCA9IG1fcFJlbmRlckRldmljZS0+R2V0Q2xpcFJlY3QoKTsNCi0gICAgaWYgKHJ0RG9jQ2xpcC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJ0RG9jQ2xpcC5sZWZ0ID0gcnREb2NDbGlwLnRvcCA9IDA7DQotICAgICAgICBydERvY0NsaXAud2lkdGggPSAoRlhfRkxPQVQpbV9wUmVuZGVyRGV2aWNlLT5HZXRXaWR0aCgpOw0KLSAgICAgICAgcnREb2NDbGlwLmhlaWdodCA9IChGWF9GTE9BVCltX3BSZW5kZXJEZXZpY2UtPkdldEhlaWdodCgpOw0KKyAgICBzd2l0Y2ggKHBWaXN1YWxTZXQtPkdldFR5cGUoKSkgew0KKyAgICAgIGNhc2UgRkRFX1ZJU1VBTE9CSl9UZXh0Og0KKyAgICAgICAgUmVuZGVyVGV4dCgoSUZERV9UZXh0U2V0KilwVmlzdWFsU2V0LCBoVmlzdWFsT2JqKTsNCisgICAgICAgIGlDb3VudCArPSA1Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfVklTVUFMT0JKX1BhdGg6DQorICAgICAgICBSZW5kZXJQYXRoKChJRkRFX1BhdGhTZXQqKXBWaXN1YWxTZXQsIGhWaXN1YWxPYmopOw0KKyAgICAgICAgaUNvdW50ICs9IDIwOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfVklTVUFMT0JKX1dpZGdldDoNCisgICAgICAgIGlDb3VudCArPSAxMDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1ZJU1VBTE9CSl9DYW52YXM6DQorICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJtLlRyYW5zZm9ybVJlY3QocnREb2NDbGlwKTsNCi0gICAgSUZERV9WaXN1YWxTZXQgKnBWaXN1YWxTZXQ7DQotICAgIEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmo7DQotICAgIENGWF9SZWN0RiBydE9iajsNCi0gICAgaW50MzJfdCBpQ291bnQgPSAwOw0KLSAgICB3aGlsZShUUlVFKSB7DQotICAgICAgICBoVmlzdWFsT2JqID0gbV9wSXRlcmF0b3ItPkdldE5leHQocFZpc3VhbFNldCk7DQotICAgICAgICBpZiAoaFZpc3VhbE9iaiA9PSBOVUxMIHx8IHBWaXN1YWxTZXQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIGVTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX0RvbmU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBydE9iai5FbXB0eSgpOw0KLSAgICAgICAgcFZpc3VhbFNldC0+R2V0UmVjdChoVmlzdWFsT2JqLCBydE9iaik7DQotICAgICAgICBpZiAoIXJ0RG9jQ2xpcC5JbnRlcnNlY3RXaXRoKHJ0T2JqKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3dpdGNoIChwVmlzdWFsU2V0LT5HZXRUeXBlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9WSVNVQUxPQkpfVGV4dDoNCi0gICAgICAgICAgICAgICAgUmVuZGVyVGV4dCgoSUZERV9UZXh0U2V0KilwVmlzdWFsU2V0LCBoVmlzdWFsT2JqKTsNCi0gICAgICAgICAgICAgICAgaUNvdW50ICs9IDU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1ZJU1VBTE9CSl9QYXRoOg0KLSAgICAgICAgICAgICAgICBSZW5kZXJQYXRoKChJRkRFX1BhdGhTZXQqKXBWaXN1YWxTZXQsIGhWaXN1YWxPYmopOw0KLSAgICAgICAgICAgICAgICBpQ291bnQgKz0gMjA7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1ZJU1VBTE9CSl9XaWRnZXQ6DQotICAgICAgICAgICAgICAgIGlDb3VudCArPSAxMDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfVklTVUFMT0JKX0NhbnZhczoNCi0gICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaUNvdW50ID49IDEwMCAmJiBwUGF1c2UgIT0gTlVMTCAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCi0gICAgICAgICAgICBlU3RhdHVzID0gRkRFX1JFTkRFUlNUQVRVU19QYXVzZWQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQorICAgIGlmIChpQ291bnQgPj0gMTAwICYmIHBQYXVzZSAhPSBOVUxMICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgIGVTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX1BhdXNlZDsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBVbmxvY2soKTsNCi0gICAgcmV0dXJuIG1fZVN0YXR1cyA9IGVTdGF0dXM7DQorICB9DQorICBVbmxvY2soKTsNCisgIHJldHVybiBtX2VTdGF0dXMgPSBlU3RhdHVzOw0KIH0NCi12b2lkIENGREVfUmVuZGVyQ29udGV4dDo6U3RvcFJlbmRlcigpDQotew0KLSAgICBMb2NrKCk7DQotICAgIG1fZVN0YXR1cyA9IEZERV9SRU5ERVJTVEFUVVNfUmVzZXQ7DQotICAgIG1fcFJlbmRlckRldmljZSA9IE5VTEw7DQotICAgIG1fVHJhbnNmb3JtLlJlc2V0KCk7DQotICAgIGlmIChtX3BJdGVyYXRvciAhPSBOVUxMKSB7DQotICAgICAgICBtX3BJdGVyYXRvci0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wSXRlcmF0b3IgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3BTb2xpZEJydXNoICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcFNvbGlkQnJ1c2gtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcFNvbGlkQnJ1c2ggPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3BDaGFyUG9zICE9IE5VTEwpIHsNCi0gICAgICAgIEZERV9GcmVlKG1fcENoYXJQb3MpOw0KLSAgICAgICAgbV9wQ2hhclBvcyA9IE5VTEw7DQotICAgIH0NCi0gICAgbV9pQ2hhclBvc0NvdW50ID0gMDsNCi0gICAgVW5sb2NrKCk7DQordm9pZCBDRkRFX1JlbmRlckNvbnRleHQ6OlN0b3BSZW5kZXIoKSB7DQorICBMb2NrKCk7DQorICBtX2VTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX1Jlc2V0Ow0KKyAgbV9wUmVuZGVyRGV2aWNlID0gTlVMTDsNCisgIG1fVHJhbnNmb3JtLlJlc2V0KCk7DQorICBpZiAobV9wSXRlcmF0b3IgIT0gTlVMTCkgew0KKyAgICBtX3BJdGVyYXRvci0+UmVsZWFzZSgpOw0KKyAgICBtX3BJdGVyYXRvciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wU29saWRCcnVzaCAhPSBOVUxMKSB7DQorICAgIG1fcFNvbGlkQnJ1c2gtPlJlbGVhc2UoKTsNCisgICAgbV9wU29saWRCcnVzaCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wQ2hhclBvcyAhPSBOVUxMKSB7DQorICAgIEZERV9GcmVlKG1fcENoYXJQb3MpOw0KKyAgICBtX3BDaGFyUG9zID0gTlVMTDsNCisgIH0NCisgIG1faUNoYXJQb3NDb3VudCA9IDA7DQorICBVbmxvY2soKTsNCiB9DQotdm9pZCBDRkRFX1JlbmRlckNvbnRleHQ6OlJlbmRlclRleHQoSUZERV9UZXh0U2V0ICpwVGV4dFNldCwgRkRFX0hWSVNVQUxPQkogaFRleHQpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wUmVuZGVyRGV2aWNlICE9IE5VTEwpOw0KLSAgICBGWFNZU19hc3NlcnQocFRleHRTZXQgIT0gTlVMTCAmJiBoVGV4dCAhPSBOVUxMKTsNCi0gICAgSUZYX0ZvbnQgKnBGb250ID0gcFRleHRTZXQtPkdldEZvbnQoaFRleHQpOw0KLSAgICBpZiAocEZvbnQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUNvdW50ID0gcFRleHRTZXQtPkdldERpc3BsYXlQb3MoaFRleHQsIE5VTEwsIEZBTFNFKTsNCi0gICAgaWYgKGlDb3VudCA8IDEpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KK3ZvaWQgQ0ZERV9SZW5kZXJDb250ZXh0OjpSZW5kZXJUZXh0KElGREVfVGV4dFNldCogcFRleHRTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0hWSVNVQUxPQkogaFRleHQpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BSZW5kZXJEZXZpY2UgIT0gTlVMTCk7DQorICBGWFNZU19hc3NlcnQocFRleHRTZXQgIT0gTlVMTCAmJiBoVGV4dCAhPSBOVUxMKTsNCisgIElGWF9Gb250KiBwRm9udCA9IHBUZXh0U2V0LT5HZXRGb250KGhUZXh0KTsNCisgIGlmIChwRm9udCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gcFRleHRTZXQtPkdldERpc3BsYXlQb3MoaFRleHQsIE5VTEwsIEZBTFNFKTsNCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX3BTb2xpZEJydXNoID09IE5VTEwpIHsNCisgICAgbV9wU29saWRCcnVzaCA9IChJRkRFX1NvbGlkQnJ1c2gqKUlGREVfQnJ1c2g6OkNyZWF0ZShGREVfQlJVU0hUWVBFX1NvbGlkKTsNCiAgICAgaWYgKG1fcFNvbGlkQnJ1c2ggPT0gTlVMTCkgew0KLSAgICAgICAgbV9wU29saWRCcnVzaCA9IChJRkRFX1NvbGlkQnJ1c2gqKUlGREVfQnJ1c2g6OkNyZWF0ZShGREVfQlJVU0hUWVBFX1NvbGlkKTsNCi0gICAgICAgIGlmIChtX3BTb2xpZEJydXNoID09IE5VTEwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQorICAgICAgcmV0dXJuOw0KICAgICB9DQotICAgIGlmIChtX3BDaGFyUG9zID09IE5VTEwpIHsNCi0gICAgICAgIG1fcENoYXJQb3MgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9BbGxvYyhzaXplb2YoRlhURVhUX0NIQVJQT1MpICogaUNvdW50KTsNCi0gICAgfSBlbHNlIGlmIChtX2lDaGFyUG9zQ291bnQgPCBpQ291bnQpIHsNCi0gICAgICAgIG1fcENoYXJQb3MgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9SZWFsbG9jKG1fcENoYXJQb3MsIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBpQ291bnQpOw0KLSAgICB9DQotICAgIGlmIChtX2lDaGFyUG9zQ291bnQgPCBpQ291bnQpIHsNCi0gICAgICAgIG1faUNoYXJQb3NDb3VudCA9IGlDb3VudDsNCi0gICAgfQ0KLSAgICBpQ291bnQgPSBwVGV4dFNldC0+R2V0RGlzcGxheVBvcyhoVGV4dCwgbV9wQ2hhclBvcywgRkFMU0UpOw0KLSAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBwVGV4dFNldC0+R2V0Rm9udFNpemUoaFRleHQpOw0KLSAgICBGWF9BUkdCIGR3Q29sb3IgPSBwVGV4dFNldC0+R2V0Rm9udENvbG9yKGhUZXh0KTsNCi0gICAgbV9wU29saWRCcnVzaC0+U2V0Q29sb3IoZHdDb2xvcik7DQotICAgIEZERV9IREVWSUNFU1RBVEUgaFN0YXRlOw0KLSAgICBGWF9CT09MIGJDbGlwID0gQXBwbHlDbGlwKHBUZXh0U2V0LCBoVGV4dCwgaFN0YXRlKTsNCi0gICAgbV9wUmVuZGVyRGV2aWNlLT5EcmF3U3RyaW5nKG1fcFNvbGlkQnJ1c2gsIHBGb250LCBtX3BDaGFyUG9zLCBpQ291bnQsIGZGb250U2l6ZSwgJm1fVHJhbnNmb3JtKTsNCi0gICAgaWYgKGJDbGlwKSB7DQotICAgICAgICBSZXN0b3JlQ2xpcChoU3RhdGUpOw0KLSAgICB9DQorICB9DQorICBpZiAobV9wQ2hhclBvcyA9PSBOVUxMKSB7DQorICAgIG1fcENoYXJQb3MgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9BbGxvYyhzaXplb2YoRlhURVhUX0NIQVJQT1MpICogaUNvdW50KTsNCisgIH0gZWxzZSBpZiAobV9pQ2hhclBvc0NvdW50IDwgaUNvdW50KSB7DQorICAgIG1fcENoYXJQb3MgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9SZWFsbG9jKG1fcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBpQ291bnQpOw0KKyAgfQ0KKyAgaWYgKG1faUNoYXJQb3NDb3VudCA8IGlDb3VudCkgew0KKyAgICBtX2lDaGFyUG9zQ291bnQgPSBpQ291bnQ7DQorICB9DQorICBpQ291bnQgPSBwVGV4dFNldC0+R2V0RGlzcGxheVBvcyhoVGV4dCwgbV9wQ2hhclBvcywgRkFMU0UpOw0KKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gcFRleHRTZXQtPkdldEZvbnRTaXplKGhUZXh0KTsNCisgIEZYX0FSR0IgZHdDb2xvciA9IHBUZXh0U2V0LT5HZXRGb250Q29sb3IoaFRleHQpOw0KKyAgbV9wU29saWRCcnVzaC0+U2V0Q29sb3IoZHdDb2xvcik7DQorICBGREVfSERFVklDRVNUQVRFIGhTdGF0ZTsNCisgIEZYX0JPT0wgYkNsaXAgPSBBcHBseUNsaXAocFRleHRTZXQsIGhUZXh0LCBoU3RhdGUpOw0KKyAgbV9wUmVuZGVyRGV2aWNlLT5EcmF3U3RyaW5nKG1fcFNvbGlkQnJ1c2gsIHBGb250LCBtX3BDaGFyUG9zLCBpQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkZvbnRTaXplLCAmbV9UcmFuc2Zvcm0pOw0KKyAgaWYgKGJDbGlwKSB7DQorICAgIFJlc3RvcmVDbGlwKGhTdGF0ZSk7DQorICB9DQogfQ0KLXZvaWQgQ0ZERV9SZW5kZXJDb250ZXh0OjpSZW5kZXJQYXRoKElGREVfUGF0aFNldCAqcFBhdGhTZXQsIEZERV9IVklTVUFMT0JKIGhQYXRoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcFJlbmRlckRldmljZSAhPSBOVUxMKTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBQYXRoU2V0ICE9IE5VTEwgJiYgaFBhdGggIT0gTlVMTCk7DQotICAgIElGREVfUGF0aCAqcFBhdGggPSBwUGF0aFNldC0+R2V0UGF0aChoUGF0aCk7DQotICAgIGlmIChwUGF0aCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQordm9pZCBDRkRFX1JlbmRlckNvbnRleHQ6OlJlbmRlclBhdGgoSUZERV9QYXRoU2V0KiBwUGF0aFNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfSFZJU1VBTE9CSiBoUGF0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFJlbmRlckRldmljZSAhPSBOVUxMKTsNCisgIEZYU1lTX2Fzc2VydChwUGF0aFNldCAhPSBOVUxMICYmIGhQYXRoICE9IE5VTEwpOw0KKyAgSUZERV9QYXRoKiBwUGF0aCA9IHBQYXRoU2V0LT5HZXRQYXRoKGhQYXRoKTsNCisgIGlmIChwUGF0aCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZERV9IREVWSUNFU1RBVEUgaFN0YXRlOw0KKyAgRlhfQk9PTCBiQ2xpcCA9IEFwcGx5Q2xpcChwUGF0aFNldCwgaFBhdGgsIGhTdGF0ZSk7DQorICBpbnQzMl90IGlSZW5kZXJNb2RlID0gcFBhdGhTZXQtPkdldFJlbmRlck1vZGUoaFBhdGgpOw0KKyAgaWYgKGlSZW5kZXJNb2RlICYgRkRFX1BBVEhSRU5ERVJfU3Ryb2tlKSB7DQorICAgIElGREVfUGVuKiBwUGVuID0gcFBhdGhTZXQtPkdldFBlbihoUGF0aCk7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBQYXRoU2V0LT5HZXRQZW5XaWR0aChoUGF0aCk7DQorICAgIGlmIChwUGVuICE9IE5VTEwgJiYgZldpZHRoID4gMCkgew0KKyAgICAgIG1fcFJlbmRlckRldmljZS0+RHJhd1BhdGgocFBlbiwgZldpZHRoLCBwUGF0aCwgJm1fVHJhbnNmb3JtKTsNCiAgICAgfQ0KLSAgICBGREVfSERFVklDRVNUQVRFIGhTdGF0ZTsNCi0gICAgRlhfQk9PTCBiQ2xpcCA9IEFwcGx5Q2xpcChwUGF0aFNldCwgaFBhdGgsIGhTdGF0ZSk7DQotICAgIGludDMyX3QgaVJlbmRlck1vZGUgPSBwUGF0aFNldC0+R2V0UmVuZGVyTW9kZShoUGF0aCk7DQotICAgIGlmIChpUmVuZGVyTW9kZSAmIEZERV9QQVRIUkVOREVSX1N0cm9rZSkgew0KLSAgICAgICAgSUZERV9QZW4gKnBQZW4gPSBwUGF0aFNldC0+R2V0UGVuKGhQYXRoKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBQYXRoU2V0LT5HZXRQZW5XaWR0aChoUGF0aCk7DQotICAgICAgICBpZiAocFBlbiAhPSBOVUxMICYmIGZXaWR0aCA+IDApIHsNCi0gICAgICAgICAgICBtX3BSZW5kZXJEZXZpY2UtPkRyYXdQYXRoKHBQZW4sIGZXaWR0aCwgcFBhdGgsICZtX1RyYW5zZm9ybSk7DQotICAgICAgICB9DQorICB9DQorICBpZiAoaVJlbmRlck1vZGUgJiBGREVfUEFUSFJFTkRFUl9GaWxsKSB7DQorICAgIElGREVfQnJ1c2gqIHBCcnVzaCA9IHBQYXRoU2V0LT5HZXRCcnVzaChoUGF0aCk7DQorICAgIGlmIChwQnJ1c2ggIT0gTlVMTCkgew0KKyAgICAgIG1fcFJlbmRlckRldmljZS0+RmlsbFBhdGgocEJydXNoLCBwUGF0aCwgJm1fVHJhbnNmb3JtKTsNCiAgICAgfQ0KLSAgICBpZiAoaVJlbmRlck1vZGUgJiBGREVfUEFUSFJFTkRFUl9GaWxsKSB7DQotICAgICAgICBJRkRFX0JydXNoICpwQnJ1c2ggPSBwUGF0aFNldC0+R2V0QnJ1c2goaFBhdGgpOw0KLSAgICAgICAgaWYgKHBCcnVzaCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgbV9wUmVuZGVyRGV2aWNlLT5GaWxsUGF0aChwQnJ1c2gsIHBQYXRoLCAmbV9UcmFuc2Zvcm0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChiQ2xpcCkgew0KLSAgICAgICAgUmVzdG9yZUNsaXAoaFN0YXRlKTsNCi0gICAgfQ0KKyAgfQ0KKyAgaWYgKGJDbGlwKSB7DQorICAgIFJlc3RvcmVDbGlwKGhTdGF0ZSk7DQorICB9DQogfQ0KLUZYX0JPT0wgQ0ZERV9SZW5kZXJDb250ZXh0OjpBcHBseUNsaXAoSUZERV9WaXN1YWxTZXQgKnBWaXN1YWxTZXQsIEZERV9IVklTVUFMT0JKIGhPYmosIEZERV9IREVWSUNFU1RBVEUgJmhTdGF0ZSkNCi17DQotICAgIENGWF9SZWN0RiBydENsaXA7DQotICAgIGlmICghcFZpc3VhbFNldC0+R2V0Q2xpcChoT2JqLCBydENsaXApKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGIHJ0T2JqOw0KLSAgICBwVmlzdWFsU2V0LT5HZXRSZWN0KGhPYmosIHJ0T2JqKTsNCi0gICAgcnRDbGlwLk9mZnNldChydE9iai5sZWZ0LCBydE9iai50b3ApOw0KLSAgICBtX1RyYW5zZm9ybS5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQotICAgIGNvbnN0IENGWF9SZWN0RiAmcnREZXZDbGlwID0gbV9wUmVuZGVyRGV2aWNlLT5HZXRDbGlwUmVjdCgpOw0KLSAgICBydENsaXAuSW50ZXJzZWN0KHJ0RGV2Q2xpcCk7DQotICAgIGhTdGF0ZSA9IG1fcFJlbmRlckRldmljZS0+U2F2ZVN0YXRlKCk7DQotICAgIHJldHVybiBtX3BSZW5kZXJEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorRlhfQk9PTCBDRkRFX1JlbmRlckNvbnRleHQ6OkFwcGx5Q2xpcChJRkRFX1Zpc3VhbFNldCogcFZpc3VhbFNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9IVklTVUFMT0JKIGhPYmosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfSERFVklDRVNUQVRFJiBoU3RhdGUpIHsNCisgIENGWF9SZWN0RiBydENsaXA7DQorICBpZiAoIXBWaXN1YWxTZXQtPkdldENsaXAoaE9iaiwgcnRDbGlwKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfUmVjdEYgcnRPYmo7DQorICBwVmlzdWFsU2V0LT5HZXRSZWN0KGhPYmosIHJ0T2JqKTsNCisgIHJ0Q2xpcC5PZmZzZXQocnRPYmoubGVmdCwgcnRPYmoudG9wKTsNCisgIG1fVHJhbnNmb3JtLlRyYW5zZm9ybVJlY3QocnRDbGlwKTsNCisgIGNvbnN0IENGWF9SZWN0RiYgcnREZXZDbGlwID0gbV9wUmVuZGVyRGV2aWNlLT5HZXRDbGlwUmVjdCgpOw0KKyAgcnRDbGlwLkludGVyc2VjdChydERldkNsaXApOw0KKyAgaFN0YXRlID0gbV9wUmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgIHJldHVybiBtX3BSZW5kZXJEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQogfQ0KLXZvaWQgQ0ZERV9SZW5kZXJDb250ZXh0OjpSZXN0b3JlQ2xpcChGREVfSERFVklDRVNUQVRFIGhTdGF0ZSkNCi17DQotICAgIG1fcFJlbmRlckRldmljZS0+UmVzdG9yZVN0YXRlKGhTdGF0ZSk7DQordm9pZCBDRkRFX1JlbmRlckNvbnRleHQ6OlJlc3RvcmVDbGlwKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKSB7DQorICBtX3BSZW5kZXJEZXZpY2UtPlJlc3RvcmVTdGF0ZShoU3RhdGUpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9yZW5kZXIuaCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX3JlbmRlci5oCmluZGV4IDUyYzk1YzUuLjM2ZTNmMzcgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX3JlbmRlci5oCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX3JlbmRlci5oCkBAIC03LDM2ICs3LDMzIEBACiAjaWZuZGVmIF9GREVfUkVOREVSX0lNUA0KICNkZWZpbmUgX0ZERV9SRU5ERVJfSU1QDQogY2xhc3MgQ0ZERV9SZW5kZXJDb250ZXh0Ow0KLWNsYXNzIENGREVfUmVuZGVyQ29udGV4dCA6IHB1YmxpYyBJRkRFX1JlbmRlckNvbnRleHQsIHB1YmxpYyBDRlhfVGhyZWFkTG9jaywgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1JlbmRlckNvbnRleHQoKTsNCi0gICAgdmlydHVhbCB+Q0ZERV9SZW5kZXJDb250ZXh0KCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCVN0YXJ0UmVuZGVyKElGREVfUmVuZGVyRGV2aWNlICpwUmVuZGVyRGV2aWNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DYW52YXNTZXQgKnBDYW52YXNTZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4ICZ0bURvYzJEZXZpY2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCi0gICAgdmlydHVhbCBGREVfUkVOREVSU1RBVFVTCUdldFN0YXR1cygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2VTdGF0dXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBGREVfUkVOREVSU1RBVFVTCURvUmVuZGVyKElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTdG9wUmVuZGVyKCk7DQotICAgIHZvaWQJCQkJUmVuZGVyUGF0aChJRkRFX1BhdGhTZXQgKnBQYXRoU2V0LCBGREVfSFZJU1VBTE9CSiBoUGF0aCk7DQotICAgIHZvaWQJCQkJUmVuZGVyVGV4dChJRkRFX1RleHRTZXQgKnBUZXh0U2V0LCBGREVfSFZJU1VBTE9CSiBoVGV4dCk7DQotICAgIEZYX0JPT0wJCQkJQXBwbHlDbGlwKElGREVfVmlzdWFsU2V0ICpwVmlzdWFsU2V0LCBGREVfSFZJU1VBTE9CSiBoT2JqLCBGREVfSERFVklDRVNUQVRFICZoU3RhdGUpOw0KLSAgICB2b2lkCQkJCVJlc3RvcmVDbGlwKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKTsNCi1wcm90ZWN0ZWQ6DQotICAgIEZERV9SRU5ERVJTVEFUVVMJCW1fZVN0YXR1czsNCi0gICAgSUZERV9SZW5kZXJEZXZpY2UJCSptX3BSZW5kZXJEZXZpY2U7DQotICAgIElGREVfU29saWRCcnVzaAkJCSptX3BTb2xpZEJydXNoOw0KLSAgICBDRlhfTWF0cml4CQkJCW1fVHJhbnNmb3JtOw0KLSAgICBGWFRFWFRfQ0hBUlBPUwkJCSptX3BDaGFyUG9zOw0KLSAgICBpbnQzMl90CQkJCW1faUNoYXJQb3NDb3VudDsNCi0gICAgSUZERV9WaXN1YWxTZXRJdGVyYXRvcgkqbV9wSXRlcmF0b3I7DQorY2xhc3MgQ0ZERV9SZW5kZXJDb250ZXh0IDogcHVibGljIElGREVfUmVuZGVyQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ0ZYX1RocmVhZExvY2ssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX1JlbmRlckNvbnRleHQoKTsNCisgIHZpcnR1YWwgfkNGREVfUmVuZGVyQ29udGV4dCgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnRSZW5kZXIoSUZERV9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DYW52YXNTZXQqIHBDYW52YXNTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKTsNCisgIHZpcnR1YWwgRkRFX1JFTkRFUlNUQVRVUyBHZXRTdGF0dXMoKSBjb25zdCB7IHJldHVybiBtX2VTdGF0dXM7IH0NCisgIHZpcnR1YWwgRkRFX1JFTkRFUlNUQVRVUyBEb1JlbmRlcihJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOw0KKyAgdmlydHVhbCB2b2lkIFN0b3BSZW5kZXIoKTsNCisgIHZvaWQgUmVuZGVyUGF0aChJRkRFX1BhdGhTZXQqIHBQYXRoU2V0LCBGREVfSFZJU1VBTE9CSiBoUGF0aCk7DQorICB2b2lkIFJlbmRlclRleHQoSUZERV9UZXh0U2V0KiBwVGV4dFNldCwgRkRFX0hWSVNVQUxPQkogaFRleHQpOw0KKyAgRlhfQk9PTCBBcHBseUNsaXAoSUZERV9WaXN1YWxTZXQqIHBWaXN1YWxTZXQsDQorICAgICAgICAgICAgICAgICAgICBGREVfSFZJU1VBTE9CSiBoT2JqLA0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0hERVZJQ0VTVEFURSYgaFN0YXRlKTsNCisgIHZvaWQgUmVzdG9yZUNsaXAoRkRFX0hERVZJQ0VTVEFURSBoU3RhdGUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGREVfUkVOREVSU1RBVFVTIG1fZVN0YXR1czsNCisgIElGREVfUmVuZGVyRGV2aWNlKiBtX3BSZW5kZXJEZXZpY2U7DQorICBJRkRFX1NvbGlkQnJ1c2gqIG1fcFNvbGlkQnJ1c2g7DQorICBDRlhfTWF0cml4IG1fVHJhbnNmb3JtOw0KKyAgRlhURVhUX0NIQVJQT1MqIG1fcENoYXJQb3M7DQorICBpbnQzMl90IG1faUNoYXJQb3NDb3VudDsNCisgIElGREVfVmlzdWFsU2V0SXRlcmF0b3IqIG1fcEl0ZXJhdG9yOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL3R0by9mZGVfdGV4dG91dC5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvdHRvL2ZkZV90ZXh0b3V0LmNwcAppbmRleCA5NjZjYzgzLi40NjYxYmQ2IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMvdHRvL2ZkZV90ZXh0b3V0LmNwcAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvdHRvL2ZkZV90ZXh0b3V0LmNwcApAQCAtNiw5NDcgKzYsOTQ5IEBACiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCiAjaW5jbHVkZSAiZmRlX3RleHRvdXQuaCINCi1JRkRFX1RleHRPdXQqIElGREVfVGV4dE91dDo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBuZXcgQ0ZERV9UZXh0T3V0Ow0KK0lGREVfVGV4dE91dCogSUZERV9UZXh0T3V0OjpDcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IENGREVfVGV4dE91dDsNCiB9DQogQ0ZERV9UZXh0T3V0OjpDRkRFX1RleHRPdXQoKQ0KLSAgICA6IG1fcEZvbnQoTlVMTCkNCi0gICAgLCBtX2ZGb250U2l6ZSgxMi4wZikNCi0gICAgLCBtX2ZMaW5lU3BhY2UobV9mRm9udFNpemUpDQotICAgICwgbV9mTGluZVBvcygwLjBmKQ0KLSAgICAsIG1fZlRvbGVyYW5jZSgwLjBmKQ0KLSAgICAsIG1faUFsaWdubWVudCgwKQ0KLSAgICAsIG1faVR4dEJrQWxpZ25tZW50KDApDQotICAgICwgbV9wQ2hhcldpZHRocyhOVUxMKQ0KLSAgICAsIG1faUNoYXJzKDApDQotICAgICwgbV9wRWxsQ2hhcldpZHRocyhOVUxMKQ0KLSAgICAsIG1faUVsbENoYXJzKDApDQotICAgICwgbV93UGFyYWdyYXBoQmtDaGFyKEwnXG4nKQ0KLSAgICAsIG1fVHh0Q29sb3IoMHhGRjAwMDAwMCkNCi0gICAgLCBtX2R3U3R5bGVzKDApDQotICAgICwgbV9kd1R4dEJrU3R5bGVzKDApDQotICAgICwgbV9iRWxsaUNoYW5nZWQoRkFMU0UpDQotICAgICwgbV9pRWxsaXBzaXNXaWR0aCgwKQ0KLSAgICAsIG1fdHRvTGluZXMoNSkNCi0gICAgLCBtX2lDdXJMaW5lKDApDQotICAgICwgbV9pVG90YWxMaW5lcygwKQ0KLSAgICAsIG1faUN1clBpZWNlKDApDQotICAgICwgbV9wQ2hhclBvcyhOVUxMKQ0KLSAgICAsIG1faUNoYXJQb3NTaXplKDApDQotICAgICwgbV9wUmVuZGVyRGV2aWNlKE5VTEwpDQotew0KLSAgICBtX3BUeHRCcmVhayA9IElGWF9UeHRCcmVhazo6Q3JlYXRlKEZYX1RYVEJSRUFLUE9MSUNZX05vbmUpOw0KLSAgICBGWFNZU19hc3NlcnQobV9wVHh0QnJlYWsgIT0gTlVMTCk7DQotICAgIG1fTWF0cml4LlJlc2V0KCk7DQotICAgIG1fcnRDbGlwLlJlc2V0KCk7DQotICAgIG1fcnRMb2dpY0NsaXAuUmVzZXQoKTsNCisgICAgOiBtX3BGb250KE5VTEwpLA0KKyAgICAgIG1fZkZvbnRTaXplKDEyLjBmKSwNCisgICAgICBtX2ZMaW5lU3BhY2UobV9mRm9udFNpemUpLA0KKyAgICAgIG1fZkxpbmVQb3MoMC4wZiksDQorICAgICAgbV9mVG9sZXJhbmNlKDAuMGYpLA0KKyAgICAgIG1faUFsaWdubWVudCgwKSwNCisgICAgICBtX2lUeHRCa0FsaWdubWVudCgwKSwNCisgICAgICBtX3BDaGFyV2lkdGhzKE5VTEwpLA0KKyAgICAgIG1faUNoYXJzKDApLA0KKyAgICAgIG1fcEVsbENoYXJXaWR0aHMoTlVMTCksDQorICAgICAgbV9pRWxsQ2hhcnMoMCksDQorICAgICAgbV93UGFyYWdyYXBoQmtDaGFyKEwnXG4nKSwNCisgICAgICBtX1R4dENvbG9yKDB4RkYwMDAwMDApLA0KKyAgICAgIG1fZHdTdHlsZXMoMCksDQorICAgICAgbV9kd1R4dEJrU3R5bGVzKDApLA0KKyAgICAgIG1fYkVsbGlDaGFuZ2VkKEZBTFNFKSwNCisgICAgICBtX2lFbGxpcHNpc1dpZHRoKDApLA0KKyAgICAgIG1fdHRvTGluZXMoNSksDQorICAgICAgbV9pQ3VyTGluZSgwKSwNCisgICAgICBtX2lUb3RhbExpbmVzKDApLA0KKyAgICAgIG1faUN1clBpZWNlKDApLA0KKyAgICAgIG1fcENoYXJQb3MoTlVMTCksDQorICAgICAgbV9pQ2hhclBvc1NpemUoMCksDQorICAgICAgbV9wUmVuZGVyRGV2aWNlKE5VTEwpIHsNCisgIG1fcFR4dEJyZWFrID0gSUZYX1R4dEJyZWFrOjpDcmVhdGUoRlhfVFhUQlJFQUtQT0xJQ1lfTm9uZSk7DQorICBGWFNZU19hc3NlcnQobV9wVHh0QnJlYWsgIT0gTlVMTCk7DQorICBtX01hdHJpeC5SZXNldCgpOw0KKyAgbV9ydENsaXAuUmVzZXQoKTsNCisgIG1fcnRMb2dpY0NsaXAuUmVzZXQoKTsNCiB9DQotQ0ZERV9UZXh0T3V0Ojp+Q0ZERV9UZXh0T3V0KCkNCi17DQotICAgIGlmIChtX3BUeHRCcmVhayAhPSBOVUxMKSB7DQotICAgICAgICBtX3BUeHRCcmVhay0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIGlmIChtX3BDaGFyV2lkdGhzICE9IE5VTEwpIHsNCi0gICAgICAgIEZERV9GcmVlKG1fcENoYXJXaWR0aHMpOw0KLSAgICB9DQotICAgIGlmIChtX3BFbGxDaGFyV2lkdGhzICE9IE5VTEwpIHsNCi0gICAgICAgIEZERV9GcmVlKG1fcEVsbENoYXJXaWR0aHMpOw0KLSAgICB9DQotICAgIGlmIChtX3BSZW5kZXJEZXZpY2UgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wUmVuZGVyRGV2aWNlLT5SZWxlYXNlKCk7DQotICAgIH0NCi0gICAgaWYgKG1fcENoYXJQb3MgIT0gTlVMTCkgew0KLSAgICAgICAgRkRFX0ZyZWUobV9wQ2hhclBvcyk7DQotICAgIH0NCi0gICAgbV90dG9MaW5lcy5SZW1vdmVBbGwoKTsNCitDRkRFX1RleHRPdXQ6On5DRkRFX1RleHRPdXQoKSB7DQorICBpZiAobV9wVHh0QnJlYWsgIT0gTlVMTCkgew0KKyAgICBtX3BUeHRCcmVhay0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgaWYgKG1fcENoYXJXaWR0aHMgIT0gTlVMTCkgew0KKyAgICBGREVfRnJlZShtX3BDaGFyV2lkdGhzKTsNCisgIH0NCisgIGlmIChtX3BFbGxDaGFyV2lkdGhzICE9IE5VTEwpIHsNCisgICAgRkRFX0ZyZWUobV9wRWxsQ2hhcldpZHRocyk7DQorICB9DQorICBpZiAobV9wUmVuZGVyRGV2aWNlICE9IE5VTEwpIHsNCisgICAgbV9wUmVuZGVyRGV2aWNlLT5SZWxlYXNlKCk7DQorICB9DQorICBpZiAobV9wQ2hhclBvcyAhPSBOVUxMKSB7DQorICAgIEZERV9GcmVlKG1fcENoYXJQb3MpOw0KKyAgfQ0KKyAgbV90dG9MaW5lcy5SZW1vdmVBbGwoKTsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldEZvbnQoSUZYX0ZvbnQgKnBGb250KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBGb250ICE9IE5VTEwpOw0KLSAgICBtX3BGb250ID0gcEZvbnQ7DQotICAgIG1fcFR4dEJyZWFrLT5TZXRGb250KHBGb250KTsNCit2b2lkIENGREVfVGV4dE91dDo6U2V0Rm9udChJRlhfRm9udCogcEZvbnQpIHsNCisgIEZYU1lTX2Fzc2VydChwRm9udCAhPSBOVUxMKTsNCisgIG1fcEZvbnQgPSBwRm9udDsNCisgIG1fcFR4dEJyZWFrLT5TZXRGb250KHBGb250KTsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChmRm9udFNpemUgPiAwKTsNCi0gICAgbV9mRm9udFNpemUgPSBmRm9udFNpemU7DQotICAgIG1fcFR4dEJyZWFrLT5TZXRGb250U2l6ZShmRm9udFNpemUpOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChmRm9udFNpemUgPiAwKTsNCisgIG1fZkZvbnRTaXplID0gZkZvbnRTaXplOw0KKyAgbV9wVHh0QnJlYWstPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQogfQ0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRUZXh0Q29sb3IoRlhfQVJHQiBjb2xvcikNCi17DQotICAgIG1fVHh0Q29sb3IgPSBjb2xvcjsNCit2b2lkIENGREVfVGV4dE91dDo6U2V0VGV4dENvbG9yKEZYX0FSR0IgY29sb3IpIHsNCisgIG1fVHh0Q29sb3IgPSBjb2xvcjsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldFN0eWxlcyhGWF9EV09SRCBkd1N0eWxlcykNCi17DQotICAgIG1fZHdTdHlsZXMgPSBkd1N0eWxlczsNCi0gICAgbV9kd1R4dEJrU3R5bGVzID0gMDsNCi0gICAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUpIHsNCi0gICAgICAgIG1fZHdUeHRCa1N0eWxlcyB8PSBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lOw0KLSAgICB9DQotICAgIGlmIChkd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9FeHBhbmRUYWIpIHsNCi0gICAgICAgIG1fZHdUeHRCa1N0eWxlcyB8PSBGWF9UWFRMQVlPVVRTVFlMRV9FeHBhbmRUYWI7DQotICAgIH0NCi0gICAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0FyYWJpY1NoYXBlcykgew0KLSAgICAgICAgbV9kd1R4dEJrU3R5bGVzIHw9IEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY1NoYXBlczsNCi0gICAgfQ0KLSAgICBpZiAoZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfUlRMKSB7DQotICAgICAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyOw0KLSAgICB9DQotICAgIGlmIChkd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9BcmFiaWNDb250ZXh0KSB7DQotICAgICAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljQ29udGV4dDsNCi0gICAgfQ0KLSAgICBpZiAoZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpIHsNCi0gICAgICAgIG1fZHdUeHRCa1N0eWxlcyB8PSAoRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycyB8IEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0KTsNCi0gICAgfQ0KLSAgICBtX3BUeHRCcmVhay0+U2V0TGF5b3V0U3R5bGVzKG1fZHdUeHRCa1N0eWxlcyk7DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldFN0eWxlcyhGWF9EV09SRCBkd1N0eWxlcykgew0KKyAgbV9kd1N0eWxlcyA9IGR3U3R5bGVzOw0KKyAgbV9kd1R4dEJrU3R5bGVzID0gMDsNCisgIGlmIChkd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKSB7DQorICAgIG1fZHdUeHRCa1N0eWxlcyB8PSBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0V4cGFuZFRhYikgew0KKyAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfRXhwYW5kVGFiOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0FyYWJpY1NoYXBlcykgew0KKyAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1JUTCkgew0KKyAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0FyYWJpY0NvbnRleHQpIHsNCisgICAgbV9kd1R4dEJrU3R5bGVzIHw9IEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY0NvbnRleHQ7DQorICB9DQorICBpZiAoZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpIHsNCisgICAgbV9kd1R4dEJrU3R5bGVzIHw9DQorICAgICAgICAoRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycyB8IEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0KTsNCisgIH0NCisgIG1fcFR4dEJyZWFrLT5TZXRMYXlvdXRTdHlsZXMobV9kd1R4dEJrU3R5bGVzKTsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChmVGFiV2lkdGggPiAxLjBmKTsNCi0gICAgbV9wVHh0QnJlYWstPlNldFRhYldpZHRoKGZUYWJXaWR0aCwgRkFMU0UpOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgpIHsNCisgIEZYU1lTX2Fzc2VydChmVGFiV2lkdGggPiAxLjBmKTsNCisgIG1fcFR4dEJyZWFrLT5TZXRUYWJXaWR0aChmVGFiV2lkdGgsIEZBTFNFKTsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldEVsbGlwc2lzU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0VsbGlwc2lzKQ0KLXsNCi0gICAgbV9iRWxsaUNoYW5nZWQJPSBUUlVFOw0KLSAgICBtX3dzRWxsaXBzaXMJPSB3c0VsbGlwc2lzOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRFbGxpcHNpc1N0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NFbGxpcHNpcykgew0KKyAgbV9iRWxsaUNoYW5nZWQgPSBUUlVFOw0KKyAgbV93c0VsbGlwc2lzID0gd3NFbGxpcHNpczsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpDQotew0KLSAgICBtX3dQYXJhZ3JhcGhCa0NoYXIgPSB3Y2g7DQotICAgIG1fcFR4dEJyZWFrLT5TZXRQYXJhZ3JhcGhCcmVha0NoYXIod2NoKTsNCit2b2lkIENGREVfVGV4dE91dDo6U2V0UGFyYWdyYXBoQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCkgew0KKyAgbV93UGFyYWdyYXBoQmtDaGFyID0gd2NoOw0KKyAgbV9wVHh0QnJlYWstPlNldFBhcmFncmFwaEJyZWFrQ2hhcih3Y2gpOw0KIH0NCi12b2lkIENGREVfVGV4dE91dDo6U2V0QWxpZ25tZW50KGludDMyX3QgaUFsaWdubWVudCkNCi17DQotICAgIG1faUFsaWdubWVudCA9IGlBbGlnbm1lbnQ7DQotICAgIHN3aXRjaCAobV9pQWxpZ25tZW50KSB7DQotICAgICAgICBjYXNlIEZERV9UVE9BTElHTk1FTlRfVG9wQ2VudGVyOg0KLSAgICAgICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjoNCi0gICAgICAgIGNhc2UgRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21DZW50ZXI6DQotICAgICAgICAgICAgbV9pVHh0QmtBbGlnbm1lbnQgPSBGWF9UWFRMSU5FQUxJR05NRU5UX0NlbnRlcjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRkRFX1RUT0FMSUdOTUVOVF9Ub3BSaWdodDoNCi0gICAgICAgIGNhc2UgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJSaWdodDoNCi0gICAgICAgIGNhc2UgRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21SaWdodDoNCi0gICAgICAgICAgICBtX2lUeHRCa0FsaWdubWVudCA9IEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIG1faVR4dEJrQWxpZ25tZW50ID0gRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIG1fcFR4dEJyZWFrLT5TZXRBbGlnbm1lbnQobV9pVHh0QmtBbGlnbm1lbnQpOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50KSB7DQorICBtX2lBbGlnbm1lbnQgPSBpQWxpZ25tZW50Ow0KKyAgc3dpdGNoIChtX2lBbGlnbm1lbnQpIHsNCisgICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX1RvcENlbnRlcjoNCisgICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjoNCisgICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUNlbnRlcjoNCisgICAgICBtX2lUeHRCa0FsaWdubWVudCA9IEZYX1RYVExJTkVBTElHTk1FTlRfQ2VudGVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZERV9UVE9BTElHTk1FTlRfVG9wUmlnaHQ6DQorICAgIGNhc2UgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJSaWdodDoNCisgICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbVJpZ2h0Og0KKyAgICAgIG1faVR4dEJrQWxpZ25tZW50ID0gRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodDsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBtX2lUeHRCa0FsaWdubWVudCA9IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdDsNCisgICAgICBicmVhazsNCisgIH0NCisgIG1fcFR4dEJyZWFrLT5TZXRBbGlnbm1lbnQobV9pVHh0QmtBbGlnbm1lbnQpOw0KIH0NCi12b2lkIENGREVfVGV4dE91dDo6U2V0TGluZVNwYWNlKEZYX0ZMT0FUIGZMaW5lU3BhY2UpDQotew0KLSAgICBGWFNZU19hc3NlcnQoZkxpbmVTcGFjZSA+IDEuMGYpOw0KLSAgICBtX2ZMaW5lU3BhY2UgPSBmTGluZVNwYWNlOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRMaW5lU3BhY2UoRlhfRkxPQVQgZkxpbmVTcGFjZSkgew0KKyAgRlhTWVNfYXNzZXJ0KGZMaW5lU3BhY2UgPiAxLjBmKTsNCisgIG1fZkxpbmVTcGFjZSA9IGZMaW5lU3BhY2U7DQogfQ0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRESUJpdG1hcChDRlhfRElCaXRtYXAgKnBESUIpDQotew0KLSAgICBGWFNZU19hc3NlcnQocERJQiAhPSBOVUxMKTsNCi0gICAgaWYgKG1fcFJlbmRlckRldmljZSAhPSBOVUxMKSB7DQotICAgICAgICBtX3BSZW5kZXJEZXZpY2UtPlJlbGVhc2UoKTsNCi0gICAgfQ0KLSAgICBtX3BSZW5kZXJEZXZpY2UgPSBJRkRFX1JlbmRlckRldmljZTo6Q3JlYXRlKHBESUIpOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRESUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUIpIHsNCisgIEZYU1lTX2Fzc2VydChwRElCICE9IE5VTEwpOw0KKyAgaWYgKG1fcFJlbmRlckRldmljZSAhPSBOVUxMKSB7DQorICAgIG1fcFJlbmRlckRldmljZS0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgbV9wUmVuZGVyRGV2aWNlID0gSUZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZShwRElCKTsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlICpwRGV2aWNlKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBEZXZpY2UgIT0gTlVMTCk7DQotICAgIGlmIChtX3BSZW5kZXJEZXZpY2UgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wUmVuZGVyRGV2aWNlLT5SZWxlYXNlKCk7DQotICAgIH0NCi0gICAgbV9wUmVuZGVyRGV2aWNlID0gSUZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZShwRGV2aWNlKTsNCit2b2lkIENGREVfVGV4dE91dDo6U2V0UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UpIHsNCisgIEZYU1lTX2Fzc2VydChwRGV2aWNlICE9IE5VTEwpOw0KKyAgaWYgKG1fcFJlbmRlckRldmljZSAhPSBOVUxMKSB7DQorICAgIG1fcFJlbmRlckRldmljZS0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgbV9wUmVuZGVyRGV2aWNlID0gSUZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZShwRGV2aWNlKTsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0ICZydENsaXApDQotew0KLSAgICBtX3J0Q2xpcC5TZXQoKEZYX0ZMT0FUKXJ0Q2xpcC5sZWZ0LCAoRlhfRkxPQVQpcnRDbGlwLnRvcCwgKEZYX0ZMT0FUKXJ0Q2xpcC5XaWR0aCgpLCAoRlhfRkxPQVQpcnRDbGlwLkhlaWdodCgpKTsNCit2b2lkIENGREVfVGV4dE91dDo6U2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3QmIHJ0Q2xpcCkgew0KKyAgbV9ydENsaXAuU2V0KChGWF9GTE9BVClydENsaXAubGVmdCwgKEZYX0ZMT0FUKXJ0Q2xpcC50b3AsDQorICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXJ0Q2xpcC5XaWR0aCgpLCAoRlhfRkxPQVQpcnRDbGlwLkhlaWdodCgpKTsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiAmcnRDbGlwKQ0KLXsNCi0gICAgbV9ydENsaXAgPSBydENsaXA7DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKSB7DQorICBtX3J0Q2xpcCA9IHJ0Q2xpcDsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldExvZ2ljQ2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZydENsaXApDQotew0KLSAgICBtX3J0TG9naWNDbGlwID0gcnRDbGlwOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRMb2dpY0NsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKSB7DQorICBtX3J0TG9naWNDbGlwID0gcnRDbGlwOw0KIH0NCi12b2lkIENGREVfVGV4dE91dDo6U2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkNCi17DQotICAgIG1fTWF0cml4ID0gbWF0cml4Ow0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7DQorICBtX01hdHJpeCA9IG1hdHJpeDsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKQ0KLXsNCi0gICAgbV9mVG9sZXJhbmNlID0gZlRvbGVyYW5jZTsNCi0gICAgbV9wVHh0QnJlYWstPlNldExpbmVCcmVha1RvbGVyYW5jZShtX2ZUb2xlcmFuY2UpOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRMaW5lQnJlYWtUb2xlcmFuY2UoRlhfRkxPQVQgZlRvbGVyYW5jZSkgew0KKyAgbV9mVG9sZXJhbmNlID0gZlRvbGVyYW5jZTsNCisgIG1fcFR4dEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UobV9mVG9sZXJhbmNlKTsNCiB9DQotaW50MzJfdCBDRkRFX1RleHRPdXQ6OkdldFRvdGFsTGluZXMoKQ0KLXsNCi0gICAgcmV0dXJuIG1faVRvdGFsTGluZXM7DQoraW50MzJfdCBDRkRFX1RleHRPdXQ6OkdldFRvdGFsTGluZXMoKSB7DQorICByZXR1cm4gbV9pVG90YWxMaW5lczsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgQ0ZYX1NpemUgJnNpemUpDQotew0KLSAgICBDRlhfUmVjdEYgcnRUZXh0Ow0KLSAgICBydFRleHQuU2V0KDAuMGYsIDAuMGYsIChGWF9GTE9BVClzaXplLngsIChGWF9GTE9BVClzaXplLnkpOw0KLSAgICBDYWxjU2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQotICAgIHNpemUueCA9IChpbnQzMl90KXJ0VGV4dC5XaWR0aCgpOw0KLSAgICBzaXplLnkgPSAoaW50MzJfdClydFRleHQuSGVpZ2h0KCk7DQordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NpemUmIHNpemUpIHsNCisgIENGWF9SZWN0RiBydFRleHQ7DQorICBydFRleHQuU2V0KDAuMGYsIDAuMGYsIChGWF9GTE9BVClzaXplLngsIChGWF9GTE9BVClzaXplLnkpOw0KKyAgQ2FsY1NpemUocHdzU3RyLCBpTGVuZ3RoLCBydFRleHQpOw0KKyAgc2l6ZS54ID0gKGludDMyX3QpcnRUZXh0LldpZHRoKCk7DQorICBzaXplLnkgPSAoaW50MzJfdClydFRleHQuSGVpZ2h0KCk7DQogfQ0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9TaXplRiAmc2l6ZSkNCi17DQotICAgIENGWF9SZWN0RiBydFRleHQ7DQotICAgIHJ0VGV4dC5TZXQoMC4wZiwgMC4wZiwgc2l6ZS54LCBzaXplLnkpOw0KLSAgICBDYWxjU2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQotICAgIHNpemUueCA9IHJ0VGV4dC5XaWR0aCgpOw0KLSAgICBzaXplLnkgPSBydFRleHQuSGVpZ2h0KCk7DQordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NpemVGJiBzaXplKSB7DQorICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgcnRUZXh0LlNldCgwLjBmLCAwLjBmLCBzaXplLngsIHNpemUueSk7DQorICBDYWxjU2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQorICBzaXplLnggPSBydFRleHQuV2lkdGgoKTsNCisgIHNpemUueSA9IHJ0VGV4dC5IZWlnaHQoKTsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgQ0ZYX1JlY3QgJnJlY3QpDQotew0KLSAgICBDRlhfUmVjdEYgcnRUZXh0Ow0KLSAgICBydFRleHQuU2V0KChGWF9GTE9BVClyZWN0LmxlZnQsIChGWF9GTE9BVClyZWN0LnRvcCwgKEZYX0ZMT0FUKXJlY3QuV2lkdGgoKSwgKEZYX0ZMT0FUKXJlY3QuSGVpZ2h0KCkpOw0KLSAgICBDYWxjU2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQotICAgIHJlY3QuU2V0KChpbnQzMl90KXJ0VGV4dC5sZWZ0LCAoaW50MzJfdClydFRleHQudG9wLCAoaW50MzJfdClydFRleHQuV2lkdGgoKSwgKGludDMyX3QpcnRUZXh0LkhlaWdodCgpKTsNCit2b2lkIENGREVfVGV4dE91dDo6Q2FsY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdCYgcmVjdCkgew0KKyAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgIHJ0VGV4dC5TZXQoKEZYX0ZMT0FUKXJlY3QubGVmdCwgKEZYX0ZMT0FUKXJlY3QudG9wLCAoRlhfRkxPQVQpcmVjdC5XaWR0aCgpLA0KKyAgICAgICAgICAgICAoRlhfRkxPQVQpcmVjdC5IZWlnaHQoKSk7DQorICBDYWxjU2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQorICByZWN0LlNldCgoaW50MzJfdClydFRleHQubGVmdCwgKGludDMyX3QpcnRUZXh0LnRvcCwgKGludDMyX3QpcnRUZXh0LldpZHRoKCksDQorICAgICAgICAgICAoaW50MzJfdClydFRleHQuSGVpZ2h0KCkpOw0KIH0NCi12b2lkIENGREVfVGV4dE91dDo6Q2FsY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBpZiAocHdzU3RyID09IE5VTEwgfHwgaUxlbmd0aCA8IDEpIHsNCi0gICAgICAgIHJlY3Qud2lkdGgJPSAwLjBmOw0KLSAgICAgICAgcmVjdC5oZWlnaHQJPSAwLjBmOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX01hdHJpeCBybTsNCi0gICAgICAgIHJtLlNldFJldmVyc2UobV9NYXRyaXgpOw0KLSAgICAgICAgcm0uVHJhbnNmb3JtUmVjdChyZWN0KTsNCi0gICAgICAgIENhbGNUZXh0U2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJlY3QpOw0KLSAgICAgICAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChyZWN0KTsNCi0gICAgfQ0KLX0NCi12b2lkIENGREVfVGV4dE91dDo6Q2FsY0xvZ2ljU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9TaXplRiAmc2l6ZSkNCi17DQotICAgIENGWF9SZWN0RiBydFRleHQ7DQotICAgIHJ0VGV4dC5TZXQoMC4wZiwgMC4wZiwgc2l6ZS54LCBzaXplLnkpOw0KLSAgICBDYWxjTG9naWNTaXplKHB3c1N0ciwgaUxlbmd0aCwgcnRUZXh0KTsNCi0gICAgc2l6ZS54ID0gcnRUZXh0LldpZHRoKCk7DQotICAgIHNpemUueSA9IHJ0VGV4dC5IZWlnaHQoKTsNCi19DQotdm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNMb2dpY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBpZiAocHdzU3RyID09IE5VTEwgfHwgaUxlbmd0aCA8IDEpIHsNCi0gICAgICAgIHJlY3Qud2lkdGgJPSAwLjBmOw0KLSAgICAgICAgcmVjdC5oZWlnaHQgPSAwLjBmOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ2FsY1RleHRTaXplKHB3c1N0ciwgaUxlbmd0aCwgcmVjdCk7DQotICAgIH0NCi19DQotdm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNUZXh0U2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BGb250ICE9IE5VTEwgJiYgbV9mRm9udFNpemUgPj0gMS4wZik7DQotICAgIFNldExpbmVXaWR0aChyZWN0KTsNCi0gICAgbV9pVG90YWxMaW5lcyA9IDA7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RyCQk9IHB3c1N0cjsNCi0gICAgRlhfQk9PTAliSG90S2V5CQk9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0hvdEtleSkgPyBUUlVFIDogRkFMU0U7DQotICAgIEZYX0JPT0wgYlZlcnRpY2FsCT0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpID8gVFJVRSA6IEZBTFNFOw0KLSAgICBGWF9GTE9BVCBmV2lkdGgJCT0gMC4wZjsNCi0gICAgRlhfRkxPQVQgZkhlaWdodAk9IDAuMGY7DQotICAgIEZYX0ZMT0FUIGZTdGFydFBvcwk9IGJWZXJ0aWNhbCA/IHJlY3QuYm90dG9tKCkgOiByZWN0LnJpZ2h0KCk7DQotICAgIEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMgPSAwOw0KLSAgICBGWF9XQ0hBUiB3UHJlQ2hhcgk9IDA7DQotICAgIEZYX1dDSEFSIHdjaDsNCi0gICAgRlhfV0NIQVIgd0JyZWFrID0gMDsNCi0gICAgd2hpbGUgKGlMZW5ndGgtLSA+IDApIHsNCi0gICAgICAgIHdjaCA9ICpwU3RyKys7DQotICAgICAgICBpZiAod0JyZWFrID09IDAgJiYgKHdjaCA9PSBMJ1xuJyB8fCB3Y2ggPT0gTCdccicpKSB7DQotICAgICAgICAgICAgd0JyZWFrID0gd2NoOw0KLSAgICAgICAgICAgIG1fcFR4dEJyZWFrLT5TZXRQYXJhZ3JhcGhCcmVha0NoYXIod2NoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiSG90S2V5ICYmIHdjaCA9PSBMJyYnICYmIHdQcmVDaGFyICE9IEwnJicpIHsNCi0gICAgICAgICAgICB3UHJlQ2hhciA9IHdjaDsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+QXBwZW5kQ2hhcih3Y2gpOw0KLSAgICAgICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQotICAgICAgICAgICAgUmV0cmlldmVMaW5lV2lkdGgoZHdCcmVha1N0YXR1cywgZlN0YXJ0UG9zLCBmV2lkdGgsIGZIZWlnaHQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd1ByZUNoYXIgPSAwOw0KLSAgICB9DQotICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KLSAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCi0gICAgICAgIFJldHJpZXZlTGluZVdpZHRoKGR3QnJlYWtTdGF0dXMsIGZTdGFydFBvcywgZldpZHRoLCBmSGVpZ2h0KTsNCi0gICAgfQ0KLSAgICBtX3BUeHRCcmVhay0+UmVzZXQoKTsNCi0gICAgRlhfRkxPQVQgZkluYyA9IHJlY3QuSGVpZ2h0KCkgLSBmSGVpZ2h0Ow0KLSAgICBpZiAoYlZlcnRpY2FsKSB7DQotICAgICAgICBmSW5jID0gcmVjdC5XaWR0aCgpIC0gZkhlaWdodDsNCi0gICAgfQ0KLSAgICBpZiAobV9pQWxpZ25tZW50ID49IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdCAmJiBtX2lBbGlnbm1lbnQgPCBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUxlZnQpIHsNCi0gICAgICAgIGZJbmMgLz0gMi4wZjsNCi0gICAgfSBlbHNlIGlmIChtX2lBbGlnbm1lbnQgPCBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQpIHsNCi0gICAgICAgIGZJbmMgPSAwLjBmOw0KLSAgICB9DQotICAgIGlmIChiVmVydGljYWwpIHsNCi0gICAgICAgIHJlY3QudG9wICs9IGZTdGFydFBvczsNCi0gICAgICAgIHJlY3QubGVmdCArPSBmSW5jOw0KLSAgICAgICAgcmVjdC53aWR0aAk9IGZIZWlnaHQ7DQotICAgICAgICByZWN0LmhlaWdodCA9IEZYX01JTihmV2lkdGgsIHJlY3QuSGVpZ2h0KCkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmVjdC5sZWZ0ICs9IGZTdGFydFBvczsNCi0gICAgICAgIHJlY3QudG9wICs9IGZJbmM7DQotICAgICAgICByZWN0LndpZHRoCT0gRlhfTUlOKGZXaWR0aCwgcmVjdC5XaWR0aCgpKTsNCi0gICAgICAgIHJlY3QuaGVpZ2h0ID0gZkhlaWdodDsNCi0gICAgICAgIGlmIChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0xhc3RMaW5lSGVpZ2h0KSB7DQotICAgICAgICAgICAgcmVjdC5oZWlnaHQgLT0gbV9mTGluZVNwYWNlIC0gbV9mRm9udFNpemU7DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldExpbmVXaWR0aChDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBpZiAoKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfU2luZ2xlTGluZSkgPT0gMCkgew0KLSAgICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDAuMGY7DQotICAgICAgICBpZiAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCkgew0KLSAgICAgICAgICAgIGlmIChyZWN0LkhlaWdodCgpIDwgMS4wZikgew0KLSAgICAgICAgICAgICAgICByZWN0LmhlaWdodCA9IG1fZkZvbnRTaXplICogMTAwMC4wZjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZkxpbmVXaWR0aCA9IHJlY3QuSGVpZ2h0KCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChyZWN0LldpZHRoKCkgPCAxLjBmKSB7DQotICAgICAgICAgICAgICAgIHJlY3Qud2lkdGggPSBtX2ZGb250U2l6ZSAqIDEwMDAuMGY7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZMaW5lV2lkdGggPSByZWN0LldpZHRoKCk7DQotICAgICAgICB9DQotICAgICAgICBtX3BUeHRCcmVhay0+U2V0TGluZVdpZHRoKGZMaW5lV2lkdGgpOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ0ZERV9UZXh0T3V0OjpSZXRyaWV2ZUxpbmVXaWR0aChGWF9EV09SRCBkd0JyZWFrU3RhdHVzLCBGWF9GTE9BVCAmZlN0YXJ0UG9zLCBGWF9GTE9BVCAmZldpZHRoLCBGWF9GTE9BVCAmZkhlaWdodCkNCi17DQotICAgIGlmIChkd0JyZWFrU3RhdHVzIDw9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmTGluZVN0ZXAJPSAobV9mTGluZVNwYWNlID4gbV9mRm9udFNpemUpID8gbV9mTGluZVNwYWNlIDogbV9mRm9udFNpemU7DQotICAgIEZYX0JPT0wgYkxpbmVXcmFwCT0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfTGluZVdyYXApID8gVFJVRSA6IEZBTFNFOw0KLSAgICBGWF9GTE9BVCBmTGluZVdpZHRoID0gMC4wZjsNCi0gICAgaW50MzJfdCBpQ291bnQJCT0gbV9wVHh0QnJlYWstPkNvdW50QnJlYWtQaWVjZXMoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgIGNvbnN0IENGWF9UeHRQaWVjZSAqcFBpZWNlID0gbV9wVHh0QnJlYWstPkdldEJyZWFrUGllY2UoaSk7DQotICAgICAgICBmTGluZVdpZHRoICs9IChGWF9GTE9BVClwUGllY2UtPm1faVdpZHRoIC8gMjAwMDAuMGY7DQotICAgICAgICBmU3RhcnRQb3MgPSBGWF9NSU4oZlN0YXJ0UG9zLCAoRlhfRkxPQVQpcFBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmKTsNCi0gICAgfQ0KLSAgICBtX3BUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KLSAgICBpZiAoZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhaykgew0KLSAgICAgICAgbV9wVHh0QnJlYWstPlJlc2V0KCk7DQotICAgIH0NCi0gICAgaWYgKCFiTGluZVdyYXAgJiYgZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsNCi0gICAgICAgIGZXaWR0aCArPSBmTGluZVdpZHRoOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZldpZHRoID0gRlhfTUFYKGZXaWR0aCwgZkxpbmVXaWR0aCk7DQotICAgICAgICBmSGVpZ2h0ICs9IGZMaW5lU3RlcDsNCi0gICAgfQ0KLSAgICBtX2lUb3RhbExpbmVzKys7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENGREVfVGV4dE91dDo6RHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBpbnQzMl90IHgsIGludDMyX3QgeSkNCi17DQotICAgIENGWF9SZWN0RiBydFRleHQ7DQotICAgIHJ0VGV4dC5TZXQoKEZYX0ZMT0FUKXgsIChGWF9GTE9BVCl5LCBtX2ZGb250U2l6ZSAqIDEwMDAuMGYsIG1fZkZvbnRTaXplICogMTAwMC4wZik7DQotICAgIERyYXdUZXh0KHB3c1N0ciwgaUxlbmd0aCwgcnRUZXh0KTsNCi19DQotdm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkNCi17DQotICAgIENGWF9SZWN0RiBydFRleHQ7DQotICAgIHJ0VGV4dC5TZXQoeCwgeSwgbV9mRm9udFNpemUgKiAxMDAwLjBmLCBtX2ZGb250U2l6ZSAqIDEwMDAuMGYpOw0KLSAgICBEcmF3VGV4dChwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQotfQ0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIGNvbnN0IENGWF9SZWN0ICZyZWN0KQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCi0gICAgcnRUZXh0LlNldCgoRlhfRkxPQVQpcmVjdC5sZWZ0LCAoRlhfRkxPQVQpcmVjdC50b3AsIChGWF9GTE9BVClyZWN0LndpZHRoLCAoRlhfRkxPQVQpcmVjdC5oZWlnaHQpOw0KLSAgICBEcmF3VGV4dChwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQotfQ0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIENGWF9SZWN0RiBydFRleHQ7DQotICAgIHJ0VGV4dC5TZXQocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKHB3c1N0ciA9PSBOVUxMIHx8IGlMZW5ndGggPCAxKSB7DQorICAgIHJlY3Qud2lkdGggPSAwLjBmOw0KKyAgICByZWN0LmhlaWdodCA9IDAuMGY7DQorICB9IGVsc2Ugew0KICAgICBDRlhfTWF0cml4IHJtOw0KICAgICBybS5TZXRSZXZlcnNlKG1fTWF0cml4KTsNCi0gICAgcm0uVHJhbnNmb3JtUmVjdChydFRleHQpOw0KLSAgICBEcmF3VGV4dChwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCwgbV9ydENsaXApOw0KKyAgICBybS5UcmFuc2Zvcm1SZWN0KHJlY3QpOw0KKyAgICBDYWxjVGV4dFNpemUocHdzU3RyLCBpTGVuZ3RoLCByZWN0KTsNCisgICAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChyZWN0KTsNCisgIH0NCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdMb2dpY1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCi0gICAgcnRUZXh0LlNldCh4LCB5LCBtX2ZGb250U2l6ZSAqIDEwMDAuMGYsIG1fZkZvbnRTaXplICogMTAwMC4wZik7DQotICAgIERyYXdMb2dpY1RleHQocHdzU3RyLCBpTGVuZ3RoLCBydFRleHQpOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpDYWxjTG9naWNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TaXplRiYgc2l6ZSkgew0KKyAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgIHJ0VGV4dC5TZXQoMC4wZiwgMC4wZiwgc2l6ZS54LCBzaXplLnkpOw0KKyAgQ2FsY0xvZ2ljU2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQorICBzaXplLnggPSBydFRleHQuV2lkdGgoKTsNCisgIHNpemUueSA9IHJ0VGV4dC5IZWlnaHQoKTsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdMb2dpY1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBDRlhfUmVjdEYgcnRDbGlwOw0KLSAgICBydENsaXAuU2V0KG1fcnRMb2dpY0NsaXAubGVmdCwgbV9ydExvZ2ljQ2xpcC50b3AsIG1fcnRMb2dpY0NsaXAud2lkdGgsIG1fcnRMb2dpY0NsaXAuaGVpZ2h0KTsNCi0gICAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChydENsaXApOw0KLSAgICBEcmF3VGV4dChwd3NTdHIsIGlMZW5ndGgsIHJlY3QsIHJ0Q2xpcCk7DQordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNMb2dpY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBpZiAocHdzU3RyID09IE5VTEwgfHwgaUxlbmd0aCA8IDEpIHsNCisgICAgcmVjdC53aWR0aCA9IDAuMGY7DQorICAgIHJlY3QuaGVpZ2h0ID0gMC4wZjsNCisgIH0gZWxzZSB7DQorICAgIENhbGNUZXh0U2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJlY3QpOw0KKyAgfQ0KIH0NCi12b2lkIENGREVfVGV4dE91dDo6RHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QsIGNvbnN0IENGWF9SZWN0RiAmcnRDbGlwKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCAmJiBtX2ZGb250U2l6ZSA+PSAxLjBmKTsNCi0gICAgaWYgKHB3c1N0ciA9PSBOVUxMIHx8IGlMZW5ndGggPCAxKSB7DQotICAgICAgICByZXR1cm47DQordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNUZXh0U2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBGWFNZU19hc3NlcnQobV9wRm9udCAhPSBOVUxMICYmIG1fZkZvbnRTaXplID49IDEuMGYpOw0KKyAgU2V0TGluZVdpZHRoKHJlY3QpOw0KKyAgbV9pVG90YWxMaW5lcyA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHB3c1N0cjsNCisgIEZYX0JPT0wgYkhvdEtleSA9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0hvdEtleSkgPyBUUlVFIDogRkFMU0U7DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0KSA/IFRSVUUgOiBGQUxTRTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IDAuMGY7DQorICBGWF9GTE9BVCBmSGVpZ2h0ID0gMC4wZjsNCisgIEZYX0ZMT0FUIGZTdGFydFBvcyA9IGJWZXJ0aWNhbCA/IHJlY3QuYm90dG9tKCkgOiByZWN0LnJpZ2h0KCk7DQorICBGWF9EV09SRCBkd0JyZWFrU3RhdHVzID0gMDsNCisgIEZYX1dDSEFSIHdQcmVDaGFyID0gMDsNCisgIEZYX1dDSEFSIHdjaDsNCisgIEZYX1dDSEFSIHdCcmVhayA9IDA7DQorICB3aGlsZSAoaUxlbmd0aC0tID4gMCkgew0KKyAgICB3Y2ggPSAqcFN0cisrOw0KKyAgICBpZiAod0JyZWFrID09IDAgJiYgKHdjaCA9PSBMJ1xuJyB8fCB3Y2ggPT0gTCdccicpKSB7DQorICAgICAgd0JyZWFrID0gd2NoOw0KKyAgICAgIG1fcFR4dEJyZWFrLT5TZXRQYXJhZ3JhcGhCcmVha0NoYXIod2NoKTsNCiAgICAgfQ0KLSAgICBpZiAocmVjdC53aWR0aCA8IG1fZkZvbnRTaXplIHx8IHJlY3QuaGVpZ2h0IDwgbV9mRm9udFNpemUpIHsNCi0gICAgICAgIHJldHVybjsNCisgICAgaWYgKGJIb3RLZXkgJiYgd2NoID09IEwnJicgJiYgd1ByZUNoYXIgIT0gTCcmJykgew0KKyAgICAgIHdQcmVDaGFyID0gd2NoOw0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGggPSByZWN0LndpZHRoOw0KKyAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkFwcGVuZENoYXIod2NoKTsNCisgICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgUmV0cmlldmVMaW5lV2lkdGgoZHdCcmVha1N0YXR1cywgZlN0YXJ0UG9zLCBmV2lkdGgsIGZIZWlnaHQpOw0KKyAgICB9DQorICAgIHdQcmVDaGFyID0gMDsNCisgIH0NCisgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgIFJldHJpZXZlTGluZVdpZHRoKGR3QnJlYWtTdGF0dXMsIGZTdGFydFBvcywgZldpZHRoLCBmSGVpZ2h0KTsNCisgIH0NCisgIG1fcFR4dEJyZWFrLT5SZXNldCgpOw0KKyAgRlhfRkxPQVQgZkluYyA9IHJlY3QuSGVpZ2h0KCkgLSBmSGVpZ2h0Ow0KKyAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICBmSW5jID0gcmVjdC5XaWR0aCgpIC0gZkhlaWdodDsNCisgIH0NCisgIGlmIChtX2lBbGlnbm1lbnQgPj0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0ICYmDQorICAgICAgbV9pQWxpZ25tZW50IDwgRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21MZWZ0KSB7DQorICAgIGZJbmMgLz0gMi4wZjsNCisgIH0gZWxzZSBpZiAobV9pQWxpZ25tZW50IDwgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0KSB7DQorICAgIGZJbmMgPSAwLjBmOw0KKyAgfQ0KKyAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICByZWN0LnRvcCArPSBmU3RhcnRQb3M7DQorICAgIHJlY3QubGVmdCArPSBmSW5jOw0KKyAgICByZWN0LndpZHRoID0gZkhlaWdodDsNCisgICAgcmVjdC5oZWlnaHQgPSBGWF9NSU4oZldpZHRoLCByZWN0LkhlaWdodCgpKTsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QubGVmdCArPSBmU3RhcnRQb3M7DQorICAgIHJlY3QudG9wICs9IGZJbmM7DQorICAgIHJlY3Qud2lkdGggPSBGWF9NSU4oZldpZHRoLCByZWN0LldpZHRoKCkpOw0KKyAgICByZWN0LmhlaWdodCA9IGZIZWlnaHQ7DQorICAgIGlmIChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0xhc3RMaW5lSGVpZ2h0KSB7DQorICAgICAgcmVjdC5oZWlnaHQgLT0gbV9mTGluZVNwYWNlIC0gbV9mRm9udFNpemU7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldExpbmVXaWR0aChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIGlmICgobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKSA9PSAwKSB7DQorICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGggPSAwLjBmOw0KICAgICBpZiAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCkgew0KLSAgICAgICAgZkxpbmVXaWR0aCA9IHJlY3QuaGVpZ2h0Ow0KKyAgICAgIGlmIChyZWN0LkhlaWdodCgpIDwgMS4wZikgew0KKyAgICAgICAgcmVjdC5oZWlnaHQgPSBtX2ZGb250U2l6ZSAqIDEwMDAuMGY7DQorICAgICAgfQ0KKyAgICAgIGZMaW5lV2lkdGggPSByZWN0LkhlaWdodCgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChyZWN0LldpZHRoKCkgPCAxLjBmKSB7DQorICAgICAgICByZWN0LndpZHRoID0gbV9mRm9udFNpemUgKiAxMDAwLjBmOw0KKyAgICAgIH0NCisgICAgICBmTGluZVdpZHRoID0gcmVjdC5XaWR0aCgpOw0KICAgICB9DQogICAgIG1fcFR4dEJyZWFrLT5TZXRMaW5lV2lkdGgoZkxpbmVXaWR0aCk7DQotICAgIG1fdHRvTGluZXMuUmVtb3ZlQWxsKFRSVUUpOw0KLSAgICBtX3dzVGV4dC5FbXB0eSgpOw0KLSAgICBMb2FkVGV4dChwd3NTdHIsIGlMZW5ndGgsIHJlY3QpOw0KLSAgICBpZiAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9FbGxpcHNpcykgew0KLSAgICAgICAgUmVwbGFjZVdpZHRoRWxsaXBzaXMoKTsNCi0gICAgfQ0KLSAgICBSZWxvYWQocmVjdCk7DQotICAgIERvQWxpZ25tZW50KHJlY3QpOw0KLSAgICBPbkRyYXcocnRDbGlwKTsNCisgIH0NCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OkV4cGFuZEJ1ZmZlcihpbnQzMl90IGlTaXplLCBpbnQzMl90IGlUeXBlKQ0KLXsNCi0gICAgc3dpdGNoIChpVHlwZSkgew0KLSAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgIGlmIChtX3BDaGFyV2lkdGhzID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgbV9wQ2hhcldpZHRocyA9IChpbnQzMl90KilGREVfQWxsb2MoaVNpemUgKiBzaXplb2YoaW50MzJfdCkpOw0KLSAgICAgICAgICAgICAgICBtX2lDaGFycyA9IGlTaXplOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9pQ2hhcnMgPCBpU2l6ZSkgew0KLSAgICAgICAgICAgICAgICBtX3BDaGFyV2lkdGhzID0gKGludDMyX3QqKUZERV9SZWFsbG9jKG1fcENoYXJXaWR0aHMsIGlTaXplICogc2l6ZW9mKGludDMyX3QpKTsNCi0gICAgICAgICAgICAgICAgbV9pQ2hhcnMgPSBpU2l6ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcENoYXJXaWR0aHMsIDAsIGlTaXplKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICBpZiAobV9wRWxsQ2hhcldpZHRocyA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIG1fcEVsbENoYXJXaWR0aHMgPSAoaW50MzJfdCopRkRFX0FsbG9jKGlTaXplICogc2l6ZW9mKGludDMyX3QpKTsNCi0gICAgICAgICAgICAgICAgbV9pRWxsQ2hhcnMgPSBpU2l6ZTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG1faUVsbENoYXJzIDwgaVNpemUpIHsNCi0gICAgICAgICAgICAgICAgbV9wRWxsQ2hhcldpZHRocyA9IChpbnQzMl90KilGREVfUmVhbGxvYyhtX3BFbGxDaGFyV2lkdGhzLCBpU2l6ZSAqIHNpemVvZihpbnQzMl90KSk7DQotICAgICAgICAgICAgICAgIG1faUVsbENoYXJzID0gaVNpemU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYU1lTX21lbXNldChtX3BFbGxDaGFyV2lkdGhzLCAwLCBpU2l6ZSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgaWYgKG1fcENoYXJQb3MgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBtX3BDaGFyUG9zID0gKEZYVEVYVF9DSEFSUE9TKilGREVfQWxsb2MoaVNpemUgKiBzaXplb2YoRlhURVhUX0NIQVJQT1MpKTsNCi0gICAgICAgICAgICAgICAgbV9pQ2hhclBvc1NpemUgPSBpU2l6ZTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG1faUNoYXJQb3NTaXplIDwgaVNpemUpIHsNCi0gICAgICAgICAgICAgICAgbV9wQ2hhclBvcyA9IChGWFRFWFRfQ0hBUlBPUyopRkRFX1JlYWxsb2MobV9wQ2hhclBvcywgaVNpemUgKiBzaXplb2YoRlhURVhUX0NIQVJQT1MpKTsNCi0gICAgICAgICAgICAgICAgbV9pQ2hhclBvc1NpemUgPSBpU2l6ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi19DQotdm9pZCBDRkRFX1RleHRPdXQ6OkxvYWRFbGxpcHNpcygpDQotew0KLSAgICBpZiAoIW1fYkVsbGlDaGFuZ2VkKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgbV9iRWxsaUNoYW5nZWQgPSBGQUxTRTsNCi0gICAgbV9pRWxsaXBzaXNXaWR0aCA9IDA7DQotICAgIGludDMyX3QgaUxlbmd0aCA9IG1fd3NFbGxpcHNpcy5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggPCAxKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRXhwYW5kQnVmZmVyKGlMZW5ndGgsIDEpOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IChjb25zdCBGWF9XQ0hBUiopbV93c0VsbGlwc2lzOw0KLSAgICBpbnQzMl90ICpwQ2hhcldpZHRocyA9IG1fcEVsbENoYXJXaWR0aHM7DQotICAgIEZYX0RXT1JEIGR3QnJlYWtTdGF0dXM7DQotICAgIEZYX1dDSEFSIHdjaDsNCi0gICAgd2hpbGUgKGlMZW5ndGgtLSA+IDApIHsNCi0gICAgICAgIHdjaCA9ICpwU3RyKys7DQotICAgICAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkFwcGVuZENoYXIod2NoKTsNCi0gICAgICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KLSAgICAgICAgICAgIFJldHJpZXZlRWxsUGllY2VzKHBDaGFyV2lkdGhzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCi0gICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQotICAgICAgICBSZXRyaWV2ZUVsbFBpZWNlcyhwQ2hhcldpZHRocyk7DQotICAgIH0NCitGWF9CT09MIENGREVfVGV4dE91dDo6UmV0cmlldmVMaW5lV2lkdGgoRlhfRFdPUkQgZHdCcmVha1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZTdGFydFBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZIZWlnaHQpIHsNCisgIGlmIChkd0JyZWFrU3RhdHVzIDw9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkxpbmVTdGVwID0NCisgICAgICAobV9mTGluZVNwYWNlID4gbV9mRm9udFNpemUpID8gbV9mTGluZVNwYWNlIDogbV9mRm9udFNpemU7DQorICBGWF9CT09MIGJMaW5lV3JhcCA9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0xpbmVXcmFwKSA/IFRSVUUgOiBGQUxTRTsNCisgIEZYX0ZMT0FUIGZMaW5lV2lkdGggPSAwLjBmOw0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3BUeHRCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgY29uc3QgQ0ZYX1R4dFBpZWNlKiBwUGllY2UgPSBtX3BUeHRCcmVhay0+R2V0QnJlYWtQaWVjZShpKTsNCisgICAgZkxpbmVXaWR0aCArPSAoRlhfRkxPQVQpcFBpZWNlLT5tX2lXaWR0aCAvIDIwMDAwLjBmOw0KKyAgICBmU3RhcnRQb3MgPSBGWF9NSU4oZlN0YXJ0UG9zLCAoRlhfRkxPQVQpcFBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmKTsNCisgIH0NCisgIG1fcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorICBpZiAoZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhaykgew0KICAgICBtX3BUeHRCcmVhay0+UmVzZXQoKTsNCisgIH0NCisgIGlmICghYkxpbmVXcmFwICYmIGR3QnJlYWtTdGF0dXMgPT0gRlhfVFhUQlJFQUtfTGluZUJyZWFrKSB7DQorICAgIGZXaWR0aCArPSBmTGluZVdpZHRoOw0KKyAgfSBlbHNlIHsNCisgICAgZldpZHRoID0gRlhfTUFYKGZXaWR0aCwgZkxpbmVXaWR0aCk7DQorICAgIGZIZWlnaHQgKz0gZkxpbmVTdGVwOw0KKyAgfQ0KKyAgbV9pVG90YWxMaW5lcysrOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpSZXRyaWV2ZUVsbFBpZWNlcyhpbnQzMl90IComcENoYXJXaWR0aHMpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fcFR4dEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7DQotICAgIENGWF9DaGFyICpwVEM7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICBjb25zdCBDRlhfVHh0UGllY2UgKnBQaWVjZSA9IG1fcFR4dEJyZWFrLT5HZXRCcmVha1BpZWNlKGkpOw0KLSAgICAgICAgaW50MzJfdCBpUGllY2VDaGFycyA9IHBQaWVjZS0+R2V0TGVuZ3RoKCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUGllY2VDaGFyczsgaisrKSB7DQotICAgICAgICAgICAgcFRDID0gcFBpZWNlLT5HZXRDaGFyUHRyKGopOw0KLSAgICAgICAgICAgIGlmIChwVEMtPm1faUNoYXJXaWR0aCA8PSAwKSB7DQotICAgICAgICAgICAgICAgICpwQ2hhcldpZHRocyA9IDA7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgKnBDaGFyV2lkdGhzID0gcFRDLT5tX2lDaGFyV2lkdGg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1faUVsbGlwc2lzV2lkdGggKz0gKnBDaGFyV2lkdGhzOw0KLSAgICAgICAgICAgIHBDaGFyV2lkdGhzKys7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9wVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCit2b2lkIENGREVfVGV4dE91dDo6RHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSkgew0KKyAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgIHJ0VGV4dC5TZXQoKEZYX0ZMT0FUKXgsIChGWF9GTE9BVCl5LCBtX2ZGb250U2l6ZSAqIDEwMDAuMGYsDQorICAgICAgICAgICAgIG1fZkZvbnRTaXplICogMTAwMC4wZik7DQorICBEcmF3VGV4dChwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQogfQ0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpMb2FkVGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIEZYX1dDSEFSKiBwU3RyCQk9IG1fd3NUZXh0LkdldEJ1ZmZlcihpTGVuZ3RoKTsNCi0gICAgaW50MzJfdCBpVHh0TGVuZ3RoID0gaUxlbmd0aDsNCi0gICAgRXhwYW5kQnVmZmVyKGlUeHRMZW5ndGgsIDApOw0KLSAgICBGWF9CT09MIGJIb3RLZXkJCT0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfSG90S2V5KSA/IFRSVUUgOiBGQUxTRTsNCi0gICAgRlhfQk9PTCBiVmVydGljYWwJPSAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCkgPyBUUlVFIDogRkFMU0U7DQotICAgIEZYX0JPT0wgYkxpbmVXcmFwCT0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfTGluZVdyYXApID8gVFJVRSA6IEZBTFNFOw0KLSAgICBGWF9GTE9BVCBmTGluZVN0ZXAJPSAobV9mTGluZVNwYWNlID4gbV9mRm9udFNpemUpID8gbV9mTGluZVNwYWNlIDogbV9mRm9udFNpemU7DQotICAgIEZYX0ZMT0FUIGZMaW5lU3RvcAk9IGJWZXJ0aWNhbCA/IHJlY3QubGVmdCA6IHJlY3QuYm90dG9tKCk7DQotICAgIG1fZkxpbmVQb3MJPSBiVmVydGljYWwgPyByZWN0LnJpZ2h0KCkgOiByZWN0LnRvcDsNCi0gICAgaWYgKGJWZXJ0aWNhbCkgew0KLSAgICAgICAgZkxpbmVTdGVwID0gLWZMaW5lU3RlcDsNCi0gICAgfQ0KLSAgICBtX2hvdEtleXMuUmVtb3ZlQWxsKCk7DQotICAgIGludDMyX3QgaVN0YXJ0Q2hhciA9IDA7DQotICAgIGludDMyX3QgaUNoYXJzCQk9IDA7DQotICAgIGludDMyX3QgaVBpZWNlV2lkdGhzID0gMDsNCi0gICAgRlhfRFdPUkQgZHdCcmVha1N0YXR1czsNCi0gICAgRlhfV0NIQVIgd2NoOw0KLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCi0gICAgd2hpbGUgKGlUeHRMZW5ndGgtLSA+IDApIHsNCi0gICAgICAgIHdjaCA9ICpwd3NTdHIrKzsNCi0gICAgICAgIGlmICh3Y2ggPT0gTCcmJyAmJiBiSG90S2V5ICYmIChwU3RyIC0gMSkgIT0gTlVMTCAmJiAqKHBTdHIgLSAxKSAhPSBMJyYnKSB7DQotICAgICAgICAgICAgaWYgKGlUeHRMZW5ndGggPiAwKSB7DQotICAgICAgICAgICAgICAgIG1faG90S2V5cy5BZGQoaUNoYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICAqcFN0cisrID0gd2NoOw0KLSAgICAgICAgaUNoYXJzKys7DQotICAgICAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkFwcGVuZENoYXIod2NoKTsNCi0gICAgICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KLSAgICAgICAgICAgIEZYX0JPT0wgYkVuZG9mTGluZSA9IFJldHJpZWNlUGllY2VzKGR3QnJlYWtTdGF0dXMsIGlTdGFydENoYXIsIGlQaWVjZVdpZHRocywgRkFMU0UsIHJlY3QpOw0KLSAgICAgICAgICAgIGlmIChiRW5kb2ZMaW5lICYmIChiTGluZVdyYXAgfHwgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19MaW5lQnJlYWsgJiYgIWJMaW5lV3JhcCkpKSB7DQotICAgICAgICAgICAgICAgIGlQaWVjZVdpZHRocyA9IDA7DQotICAgICAgICAgICAgICAgIG1faUN1ckxpbmUrKzsNCi0gICAgICAgICAgICAgICAgbV9mTGluZVBvcyArPSBmTGluZVN0ZXA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICgoYlZlcnRpY2FsICYmIG1fZkxpbmVQb3MgKyBmTGluZVN0ZXAgPCBmTGluZVN0b3ApIHx8ICghYlZlcnRpY2FsICYmIG1fZkxpbmVQb3MgKyBmTGluZVN0ZXAgPiBmTGluZVN0b3ApKSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUN1ckxpbmUgPSBtX2lDdXJMaW5lOw0KLSAgICAgICAgICAgICAgICBpZiAoYkVuZG9mTGluZSkgew0KLSAgICAgICAgICAgICAgICAgICAgaUN1ckxpbmUtLTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDRkRFX1RUT0xpbmUgKnBMaW5lID0gbV90dG9MaW5lcy5HZXRQdHJBdChpQ3VyTGluZSk7DQotICAgICAgICAgICAgICAgIHBMaW5lLT5tX2JOZXdSZWxvYWQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBiUmV0ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KLSAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWsgJiYgIWJSZXQpIHsNCi0gICAgICAgIFJldHJpZWNlUGllY2VzKGR3QnJlYWtTdGF0dXMsIGlTdGFydENoYXIsIGlQaWVjZVdpZHRocywgRkFMU0UsIHJlY3QpOw0KLSAgICB9DQotICAgIG1fcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQotICAgIG1fcFR4dEJyZWFrLT5SZXNldCgpOw0KLSAgICBtX3dzVGV4dC5SZWxlYXNlQnVmZmVyKGlMZW5ndGgpOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkpIHsNCisgIENGWF9SZWN0RiBydFRleHQ7DQorICBydFRleHQuU2V0KHgsIHksIG1fZkZvbnRTaXplICogMTAwMC4wZiwgbV9mRm9udFNpemUgKiAxMDAwLjBmKTsNCisgIERyYXdUZXh0KHB3c1N0ciwgaUxlbmd0aCwgcnRUZXh0KTsNCiB9DQotRlhfQk9PTCBDRkRFX1RleHRPdXQ6OlJldHJpZWNlUGllY2VzKEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMsIGludDMyX3QgJmlTdGFydENoYXIsIGludDMyX3QgJmlQaWVjZVdpZHRocywgRlhfQk9PTCBiUmVsb2FkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBGWF9CT09MIGJTaW5nbGVMaW5lID0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfU2luZ2xlTGluZSkgPyBUUlVFIDogRkFMU0U7DQotICAgIEZYX0JPT0wgYkxpbmVXcmFwCT0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfTGluZVdyYXApID8gVFJVRSA6IEZBTFNFOw0KLSAgICBGWF9CT09MIGJWZXJ0aWNhbAk9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0KSA/IFRSVUUgOiBGQUxTRTsNCi0gICAgRlhfRkxPQVQgZkxpbmVTdGVwCT0gKG1fZkxpbmVTcGFjZSA+IG1fZkZvbnRTaXplKSA/IG1fZkxpbmVTcGFjZSA6IG1fZkZvbnRTaXplOw0KLSAgICBpZiAoYlZlcnRpY2FsKSB7DQotICAgICAgICBmTGluZVN0ZXAgPSAtZkxpbmVTdGVwOw0KLSAgICB9DQotICAgIENGWF9DaGFyICpwVEMJCT0gTlVMTDsNCi0gICAgRlhfQk9PTCBiTmVlZFJlbG9hZAk9IEZBTFNFOw0KLSAgICBGWF9GTE9BVCBmTGluZVdpZHRoCT0gYlZlcnRpY2FsID8gcmVjdC5IZWlnaHQoKSA6IHJlY3QuV2lkdGgoKTsNCi0gICAgaW50MzJfdCBpTGluZVdpZHRoID0gRlhTWVNfcm91bmQoZkxpbmVXaWR0aCAqIDIwMDAwLjBmKTsNCi0gICAgaW50MzJfdCBpQ291bnQJCT0gbV9wVHh0QnJlYWstPkNvdW50QnJlYWtQaWVjZXMoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgIGNvbnN0IENGWF9UeHRQaWVjZSAqcFBpZWNlID0gbV9wVHh0QnJlYWstPkdldEJyZWFrUGllY2UoaSk7DQotICAgICAgICBpbnQzMl90IGlQaWVjZUNoYXJzID0gcFBpZWNlLT5HZXRMZW5ndGgoKTsNCi0gICAgICAgIGludDMyX3QgaUNoYXIJPSBpU3RhcnRDaGFyOw0KLSAgICAgICAgaW50MzJfdCBpV2lkdGgJPSAwOw0KLSAgICAgICAgaW50MzJfdCBqID0gMDsNCi0gICAgICAgIGZvciAoOyBqIDwgaVBpZWNlQ2hhcnM7IGorKykgew0KLSAgICAgICAgICAgIHBUQyA9IHBQaWVjZS0+R2V0Q2hhclB0cihqKTsNCi0gICAgICAgICAgICBpbnQzMl90IGlDdXJDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aCA+IDAgPyBwVEMtPm1faUNoYXJXaWR0aCA6IDA7DQotICAgICAgICAgICAgaWYgKGJTaW5nbGVMaW5lIHx8ICFiTGluZVdyYXApIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlMaW5lV2lkdGggLSBpUGllY2VXaWR0aHMgLSBpV2lkdGggPCBpQ3VyQ2hhcldpZHRoKSB7DQotICAgICAgICAgICAgICAgICAgICBiTmVlZFJlbG9hZCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpV2lkdGggKz0gaUN1ckNoYXJXaWR0aDsNCi0gICAgICAgICAgICBtX3BDaGFyV2lkdGhzW2lDaGFyKytdID0gaUN1ckNoYXJXaWR0aDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChqID09IDAgJiYgIWJSZWxvYWQpIHsNCi0gICAgICAgICAgICBDRkRFX1RUT0xpbmUgKnBMaW5lID0gbV90dG9MaW5lcy5HZXRQdHJBdChtX2lDdXJMaW5lKTsNCi0gICAgICAgICAgICBwTGluZS0+bV9iTmV3UmVsb2FkID0gVFJVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAoaiA+IDApIHsNCi0gICAgICAgICAgICBDRlhfUmVjdEYgcnRQaWVjZTsNCi0gICAgICAgICAgICBpZiAoYlZlcnRpY2FsKSB7DQotICAgICAgICAgICAgICAgIHJ0UGllY2UubGVmdAk9IG1fZkxpbmVQb3M7DQotICAgICAgICAgICAgICAgIHJ0UGllY2UudG9wCQk9IHJlY3QudG9wICsgKEZYX0ZMT0FUKXBQaWVjZS0+bV9pU3RhcnRQb3MgLyAyMDAwMC4wZjsNCi0gICAgICAgICAgICAgICAgcnRQaWVjZS53aWR0aAk9IGZMaW5lU3RlcDsNCi0gICAgICAgICAgICAgICAgcnRQaWVjZS5oZWlnaHQJPSBpV2lkdGggLyAyMDAwMC4wZjsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBydFBpZWNlLmxlZnQJPSByZWN0LmxlZnQgKyAoRlhfRkxPQVQpcFBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmOw0KLSAgICAgICAgICAgICAgICBydFBpZWNlLnRvcAkJPSBtX2ZMaW5lUG9zOw0KLSAgICAgICAgICAgICAgICBydFBpZWNlLndpZHRoCT0gaVdpZHRoIC8gMjAwMDAuMGY7DQotICAgICAgICAgICAgICAgIHJ0UGllY2UuaGVpZ2h0CT0gZkxpbmVTdGVwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGREVfVFRPUElFQ0UgdHRvUGllY2U7DQotICAgICAgICAgICAgdHRvUGllY2UuaVN0YXJ0Q2hhciA9IGlTdGFydENoYXI7DQotICAgICAgICAgICAgdHRvUGllY2UuaUNoYXJzCQk9IGo7DQotICAgICAgICAgICAgdHRvUGllY2UucnRQaWVjZQk9IHJ0UGllY2U7DQotICAgICAgICAgICAgdHRvUGllY2UuZHdDaGFyU3R5bGVzID0gcFBpZWNlLT5tX2R3Q2hhclN0eWxlczsNCi0gICAgICAgICAgICBpZiAoRlhfSXNPZGQocFBpZWNlLT5tX2lCaWRpTGV2ZWwpKSB7DQotICAgICAgICAgICAgICAgIHR0b1BpZWNlLmR3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBBcHBlbmRQaWVjZSh0dG9QaWVjZSwgYk5lZWRSZWxvYWQsIChiUmVsb2FkICYmIGkgPT0gaUNvdW50IC0gMSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaVN0YXJ0Q2hhciArPSBpUGllY2VDaGFyczsNCi0gICAgICAgIGlQaWVjZVdpZHRocyArPSBpV2lkdGg7DQotICAgIH0NCi0gICAgbV9wVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCi0gICAgRlhfQk9PTCBiUmV0ID0gYlNpbmdsZUxpbmUgfHwgYkxpbmVXcmFwIHx8ICghYkxpbmVXcmFwICYmIGJOZWVkUmVsb2FkKSB8fCBkd0JyZWFrU3RhdHVzID09IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrOw0KLSAgICByZXR1cm4gYlJldDsNCit2b2lkIENGREVfVGV4dE91dDo6RHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdCYgcmVjdCkgew0KKyAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgIHJ0VGV4dC5TZXQoKEZYX0ZMT0FUKXJlY3QubGVmdCwgKEZYX0ZMT0FUKXJlY3QudG9wLCAoRlhfRkxPQVQpcmVjdC53aWR0aCwNCisgICAgICAgICAgICAgKEZYX0ZMT0FUKXJlY3QuaGVpZ2h0KTsNCisgIERyYXdUZXh0KHB3c1N0ciwgaUxlbmd0aCwgcnRUZXh0KTsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OkFwcGVuZFBpZWNlKGNvbnN0IEZERV9UVE9QSUVDRSAmdHRvUGllY2UsIEZYX0JPT0wgYk5lZWRSZWxvYWQsIEZYX0JPT0wgYkVuZCkNCi17DQotICAgIGlmIChtX2lDdXJMaW5lID49IG1fdHRvTGluZXMuR2V0U2l6ZSgpKSB7DQotICAgICAgICBDRkRFX1RUT0xpbmUgdHRvTGluZTsNCi0gICAgICAgIHR0b0xpbmUubV9iTmV3UmVsb2FkID0gYk5lZWRSZWxvYWQ7DQotICAgICAgICBtX2lDdXJQaWVjZQk9IHR0b0xpbmUuQWRkUGllY2UobV9pQ3VyUGllY2UsIHR0b1BpZWNlKTsNCi0gICAgICAgIG1faUN1ckxpbmUJPSBtX3R0b0xpbmVzLkFkZCh0dG9MaW5lKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGREVfVFRPTGluZSAqcExpbmUJPSBtX3R0b0xpbmVzLkdldFB0ckF0KG1faUN1ckxpbmUpOw0KLSAgICAgICAgcExpbmUtPm1fYk5ld1JlbG9hZAk9IGJOZWVkUmVsb2FkOw0KLSAgICAgICAgbV9pQ3VyUGllY2UgPSBwTGluZS0+QWRkUGllY2UobV9pQ3VyUGllY2UsIHR0b1BpZWNlKTsNCi0gICAgICAgIGlmIChiRW5kKSB7DQotICAgICAgICAgICAgaW50MzJfdCBpUGllY2VzID0gcExpbmUtPkdldFNpemUoKTsNCi0gICAgICAgICAgICBpZiAobV9pQ3VyUGllY2UgPCBpUGllY2VzKSB7DQotICAgICAgICAgICAgICAgIHBMaW5lLT5SZW1vdmVMYXN0KGlQaWVjZXMgLSBtX2lDdXJQaWVjZSAtIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoIWJFbmQgJiYgYk5lZWRSZWxvYWQpIHsNCi0gICAgICAgIG1faUN1clBpZWNlID0gMDsNCi0gICAgfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgIHJ0VGV4dC5TZXQocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOw0KKyAgQ0ZYX01hdHJpeCBybTsNCisgIHJtLlNldFJldmVyc2UobV9NYXRyaXgpOw0KKyAgcm0uVHJhbnNmb3JtUmVjdChydFRleHQpOw0KKyAgRHJhd1RleHQocHdzU3RyLCBpTGVuZ3RoLCBydFRleHQsIG1fcnRDbGlwKTsNCiB9DQotdm9pZCBDRkRFX1RleHRPdXQ6OlJlcGxhY2VXaWR0aEVsbGlwc2lzKCkNCi17DQotICAgIExvYWRFbGxpcHNpcygpOw0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBtX3dzRWxsaXBzaXMuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoIDwgMSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUxpbmVzID0gbV90dG9MaW5lcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMaW5lczsgaSsrKSB7DQotICAgICAgICBDRkRFX1RUT0xpbmUgKnBMaW5lID0gbV90dG9MaW5lcy5HZXRQdHJBdChpKTsNCi0gICAgICAgIGlmICghcExpbmUtPm1fYk5ld1JlbG9hZCkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpRWxsaXBzaXNDaGFySW5kZXggPSBpTGVuZ3RoIC0gMTsNCi0gICAgICAgIGludDMyX3QgaUNoYXJXaWR0aCA9IDA7DQotICAgICAgICBpbnQzMl90IGlDaGFyQ291bnQJPSAwOw0KLSAgICAgICAgaW50MzJfdCBpUGllY2UgPSBwTGluZS0+R2V0U2l6ZSgpOw0KLSAgICAgICAgd2hpbGUgKGlQaWVjZS0tID4gMCkgew0KLSAgICAgICAgICAgIEZERV9MUFRUT1BJRUNFIHBQaWVjZSA9IHBMaW5lLT5HZXRQdHJBdChpUGllY2UpOw0KLSAgICAgICAgICAgIGlmIChwUGllY2UgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSBwUGllY2UtPmlDaGFycyAtIDE7IGogPj0gMDsgai0tKSB7DQotICAgICAgICAgICAgICAgIGlmIChpRWxsaXBzaXNDaGFySW5kZXggPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gcFBpZWNlLT5pU3RhcnRDaGFyICsgajsNCi0gICAgICAgICAgICAgICAgaUNoYXJXaWR0aCArPSBtX3BDaGFyV2lkdGhzW2luZGV4XTsNCi0gICAgICAgICAgICAgICAgaUNoYXJDb3VudCsrOw0KLSAgICAgICAgICAgICAgICBpZiAoaUNoYXJDb3VudCA8PSBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3dzVGV4dC5TZXRBdChpbmRleCwgbV93c0VsbGlwc2lzLkdldEF0KGlFbGxpcHNpc0NoYXJJbmRleCkpOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wQ2hhcldpZHRoc1tpbmRleF0gPSBtX3BFbGxDaGFyV2lkdGhzW2lFbGxpcHNpc0NoYXJJbmRleF07DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaUNoYXJXaWR0aCA8PSBtX2lFbGxpcHNpc1dpZHRoKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3dzVGV4dC5TZXRBdChpbmRleCwgMCk7DQotICAgICAgICAgICAgICAgICAgICBtX3BDaGFyV2lkdGhzW2luZGV4XSA9IDA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaUVsbGlwc2lzQ2hhckluZGV4LS07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChpRWxsaXBzaXNDaGFySW5kZXggPCAwKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3TG9naWNUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSkgew0KKyAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgIHJ0VGV4dC5TZXQoeCwgeSwgbV9mRm9udFNpemUgKiAxMDAwLjBmLCBtX2ZGb250U2l6ZSAqIDEwMDAuMGYpOw0KKyAgRHJhd0xvZ2ljVGV4dChwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQogfQ0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpSZWxvYWQoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX3R0b0xpbmVzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgIENGREVfVFRPTGluZSAqcExpbmUgPSBtX3R0b0xpbmVzLkdldFB0ckF0KGkpOw0KLSAgICAgICAgaWYgKHBMaW5lID09IE5VTEwgfHwgIXBMaW5lLT5tX2JOZXdSZWxvYWQpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1faUN1ckxpbmUJPSBpOw0KLSAgICAgICAgbV9pQ3VyUGllY2UgPSAwOw0KLSAgICAgICAgUmVsb2FkTGluZVBpZWNlKHBMaW5lLCByZWN0KTsNCi0gICAgfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3TG9naWNUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgQ0ZYX1JlY3RGIHJ0Q2xpcDsNCisgIHJ0Q2xpcC5TZXQobV9ydExvZ2ljQ2xpcC5sZWZ0LCBtX3J0TG9naWNDbGlwLnRvcCwgbV9ydExvZ2ljQ2xpcC53aWR0aCwNCisgICAgICAgICAgICAgbV9ydExvZ2ljQ2xpcC5oZWlnaHQpOw0KKyAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChydENsaXApOw0KKyAgRHJhd1RleHQocHdzU3RyLCBpTGVuZ3RoLCByZWN0LCBydENsaXApOw0KIH0NCi12b2lkIENGREVfVGV4dE91dDo6UmVsb2FkTGluZVBpZWNlKENGREVfVFRPTGluZSAqcExpbmUsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIJCT0gKGNvbnN0IEZYX1dDSEFSKiltX3dzVGV4dDsNCi0gICAgRlhfQk9PTCBiVmVydGljYWwJCT0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpID8gVFJVRSA6IEZBTFNFOw0KLSAgICBpbnQzMl90IGlQaWVjZVdpZHRocwk9IDA7DQotICAgIEZERV9MUFRUT1BJRUNFIHBQaWVjZQk9IHBMaW5lLT5HZXRQdHJBdCgwKTsNCi0gICAgaW50MzJfdCBpU3RhcnRDaGFyCQk9IHBQaWVjZS0+aVN0YXJ0Q2hhcjsNCi0gICAgbV9mTGluZVBvcwk9IGJWZXJ0aWNhbCA/IHBQaWVjZS0+cnRQaWVjZS5sZWZ0IDogcFBpZWNlLT5ydFBpZWNlLnRvcDsNCi0gICAgaW50MzJfdCBpUGllY2VDb3VudAk9IHBMaW5lLT5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaVBpZWNlSW5kZXgJPSAwOw0KLSAgICBGWF9EV09SRCBkd0JyZWFrU3RhdHVzCT0gMDsNCi0gICAgRlhfV0NIQVIgd2NoOw0KLSAgICB3aGlsZSAoaVBpZWNlSW5kZXggPCBpUGllY2VDb3VudCkgew0KLSAgICAgICAgaW50MzJfdCBpU3Rhcgk9IGlTdGFydENoYXI7DQotICAgICAgICBpbnQzMl90IGlFbmQJPSBwUGllY2UtPmlDaGFycyArIGlTdGFyOw0KLSAgICAgICAgd2hpbGUgKGlTdGFyIDwgaUVuZCkgew0KLSAgICAgICAgICAgIHdjaCA9ICoocHdzU3RyICsgaVN0YXIpOw0KLSAgICAgICAgICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+QXBwZW5kQ2hhcih3Y2gpOw0KLSAgICAgICAgICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KLSAgICAgICAgICAgICAgICBSZXRyaWVjZVBpZWNlcyhkd0JyZWFrU3RhdHVzLCBpU3RhcnRDaGFyLCBpUGllY2VXaWR0aHMsIFRSVUUsIHJlY3QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpU3RhcisrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaVBpZWNlSW5kZXgrKzsNCi0gICAgICAgIHBQaWVjZSA9IHBMaW5lLT5HZXRQdHJBdChpUGllY2VJbmRleCk7DQotICAgIH0NCi0gICAgZHdCcmVha1N0YXR1cyA9IG1fcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQordm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCAmJiBtX2ZGb250U2l6ZSA+PSAxLjBmKTsNCisgIGlmIChwd3NTdHIgPT0gTlVMTCB8fCBpTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocmVjdC53aWR0aCA8IG1fZkZvbnRTaXplIHx8IHJlY3QuaGVpZ2h0IDwgbV9mRm9udFNpemUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IHJlY3Qud2lkdGg7DQorICBpZiAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCkgew0KKyAgICBmTGluZVdpZHRoID0gcmVjdC5oZWlnaHQ7DQorICB9DQorICBtX3BUeHRCcmVhay0+U2V0TGluZVdpZHRoKGZMaW5lV2lkdGgpOw0KKyAgbV90dG9MaW5lcy5SZW1vdmVBbGwoVFJVRSk7DQorICBtX3dzVGV4dC5FbXB0eSgpOw0KKyAgTG9hZFRleHQocHdzU3RyLCBpTGVuZ3RoLCByZWN0KTsNCisgIGlmIChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0VsbGlwc2lzKSB7DQorICAgIFJlcGxhY2VXaWR0aEVsbGlwc2lzKCk7DQorICB9DQorICBSZWxvYWQocmVjdCk7DQorICBEb0FsaWdubWVudChyZWN0KTsNCisgIE9uRHJhdyhydENsaXApOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6RXhwYW5kQnVmZmVyKGludDMyX3QgaVNpemUsIGludDMyX3QgaVR5cGUpIHsNCisgIHN3aXRjaCAoaVR5cGUpIHsNCisgICAgY2FzZSAwOg0KKyAgICAgIGlmIChtX3BDaGFyV2lkdGhzID09IE5VTEwpIHsNCisgICAgICAgIG1fcENoYXJXaWR0aHMgPSAoaW50MzJfdCopRkRFX0FsbG9jKGlTaXplICogc2l6ZW9mKGludDMyX3QpKTsNCisgICAgICAgIG1faUNoYXJzID0gaVNpemU7DQorICAgICAgfSBlbHNlIGlmIChtX2lDaGFycyA8IGlTaXplKSB7DQorICAgICAgICBtX3BDaGFyV2lkdGhzID0NCisgICAgICAgICAgICAoaW50MzJfdCopRkRFX1JlYWxsb2MobV9wQ2hhcldpZHRocywgaVNpemUgKiBzaXplb2YoaW50MzJfdCkpOw0KKyAgICAgICAgbV9pQ2hhcnMgPSBpU2l6ZTsNCisgICAgICB9DQorICAgICAgRlhTWVNfbWVtc2V0KG1fcENoYXJXaWR0aHMsIDAsIGlTaXplKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxOg0KKyAgICAgIGlmIChtX3BFbGxDaGFyV2lkdGhzID09IE5VTEwpIHsNCisgICAgICAgIG1fcEVsbENoYXJXaWR0aHMgPSAoaW50MzJfdCopRkRFX0FsbG9jKGlTaXplICogc2l6ZW9mKGludDMyX3QpKTsNCisgICAgICAgIG1faUVsbENoYXJzID0gaVNpemU7DQorICAgICAgfSBlbHNlIGlmIChtX2lFbGxDaGFycyA8IGlTaXplKSB7DQorICAgICAgICBtX3BFbGxDaGFyV2lkdGhzID0NCisgICAgICAgICAgICAoaW50MzJfdCopRkRFX1JlYWxsb2MobV9wRWxsQ2hhcldpZHRocywgaVNpemUgKiBzaXplb2YoaW50MzJfdCkpOw0KKyAgICAgICAgbV9pRWxsQ2hhcnMgPSBpU2l6ZTsNCisgICAgICB9DQorICAgICAgRlhTWVNfbWVtc2V0KG1fcEVsbENoYXJXaWR0aHMsIDAsIGlTaXplKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIGlmIChtX3BDaGFyUG9zID09IE5VTEwpIHsNCisgICAgICAgIG1fcENoYXJQb3MgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9BbGxvYyhpU2l6ZSAqIHNpemVvZihGWFRFWFRfQ0hBUlBPUykpOw0KKyAgICAgICAgbV9pQ2hhclBvc1NpemUgPSBpU2l6ZTsNCisgICAgICB9IGVsc2UgaWYgKG1faUNoYXJQb3NTaXplIDwgaVNpemUpIHsNCisgICAgICAgIG1fcENoYXJQb3MgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9SZWFsbG9jKA0KKyAgICAgICAgICAgIG1fcENoYXJQb3MsIGlTaXplICogc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSk7DQorICAgICAgICBtX2lDaGFyUG9zU2l6ZSA9IGlTaXplOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgIH0NCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkxvYWRFbGxpcHNpcygpIHsNCisgIGlmICghbV9iRWxsaUNoYW5nZWQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9iRWxsaUNoYW5nZWQgPSBGQUxTRTsNCisgIG1faUVsbGlwc2lzV2lkdGggPSAwOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gbV93c0VsbGlwc2lzLkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEV4cGFuZEJ1ZmZlcihpTGVuZ3RoLCAxKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gKGNvbnN0IEZYX1dDSEFSKiltX3dzRWxsaXBzaXM7DQorICBpbnQzMl90KiBwQ2hhcldpZHRocyA9IG1fcEVsbENoYXJXaWR0aHM7DQorICBGWF9EV09SRCBkd0JyZWFrU3RhdHVzOw0KKyAgRlhfV0NIQVIgd2NoOw0KKyAgd2hpbGUgKGlMZW5ndGgtLSA+IDApIHsNCisgICAgd2NoID0gKnBTdHIrKzsNCisgICAgZHdCcmVha1N0YXR1cyA9IG1fcFR4dEJyZWFrLT5BcHBlbmRDaGFyKHdjaCk7DQogICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgIFJldHJpZXZlRWxsUGllY2VzKHBDaGFyV2lkdGhzKTsNCisgICAgfQ0KKyAgfQ0KKyAgZHdCcmVha1N0YXR1cyA9IG1fcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgUmV0cmlldmVFbGxQaWVjZXMocENoYXJXaWR0aHMpOw0KKyAgfQ0KKyAgbV9wVHh0QnJlYWstPlJlc2V0KCk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpSZXRyaWV2ZUVsbFBpZWNlcyhpbnQzMl90KiYgcENoYXJXaWR0aHMpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9wVHh0QnJlYWstPkNvdW50QnJlYWtQaWVjZXMoKTsNCisgIENGWF9DaGFyKiBwVEM7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBjb25zdCBDRlhfVHh0UGllY2UqIHBQaWVjZSA9IG1fcFR4dEJyZWFrLT5HZXRCcmVha1BpZWNlKGkpOw0KKyAgICBpbnQzMl90IGlQaWVjZUNoYXJzID0gcFBpZWNlLT5HZXRMZW5ndGgoKTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVBpZWNlQ2hhcnM7IGorKykgew0KKyAgICAgIHBUQyA9IHBQaWVjZS0+R2V0Q2hhclB0cihqKTsNCisgICAgICBpZiAocFRDLT5tX2lDaGFyV2lkdGggPD0gMCkgew0KKyAgICAgICAgKnBDaGFyV2lkdGhzID0gMDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgKnBDaGFyV2lkdGhzID0gcFRDLT5tX2lDaGFyV2lkdGg7DQorICAgICAgfQ0KKyAgICAgIG1faUVsbGlwc2lzV2lkdGggKz0gKnBDaGFyV2lkdGhzOw0KKyAgICAgIHBDaGFyV2lkdGhzKys7DQorICAgIH0NCisgIH0NCisgIG1fcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpMb2FkVGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgRlhfV0NIQVIqIHBTdHIgPSBtX3dzVGV4dC5HZXRCdWZmZXIoaUxlbmd0aCk7DQorICBpbnQzMl90IGlUeHRMZW5ndGggPSBpTGVuZ3RoOw0KKyAgRXhwYW5kQnVmZmVyKGlUeHRMZW5ndGgsIDApOw0KKyAgRlhfQk9PTCBiSG90S2V5ID0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfSG90S2V5KSA/IFRSVUUgOiBGQUxTRTsNCisgIEZYX0JPT0wgYlZlcnRpY2FsID0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpID8gVFJVRSA6IEZBTFNFOw0KKyAgRlhfQk9PTCBiTGluZVdyYXAgPSAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9MaW5lV3JhcCkgPyBUUlVFIDogRkFMU0U7DQorICBGWF9GTE9BVCBmTGluZVN0ZXAgPQ0KKyAgICAgIChtX2ZMaW5lU3BhY2UgPiBtX2ZGb250U2l6ZSkgPyBtX2ZMaW5lU3BhY2UgOiBtX2ZGb250U2l6ZTsNCisgIEZYX0ZMT0FUIGZMaW5lU3RvcCA9IGJWZXJ0aWNhbCA/IHJlY3QubGVmdCA6IHJlY3QuYm90dG9tKCk7DQorICBtX2ZMaW5lUG9zID0gYlZlcnRpY2FsID8gcmVjdC5yaWdodCgpIDogcmVjdC50b3A7DQorICBpZiAoYlZlcnRpY2FsKSB7DQorICAgIGZMaW5lU3RlcCA9IC1mTGluZVN0ZXA7DQorICB9DQorICBtX2hvdEtleXMuUmVtb3ZlQWxsKCk7DQorICBpbnQzMl90IGlTdGFydENoYXIgPSAwOw0KKyAgaW50MzJfdCBpQ2hhcnMgPSAwOw0KKyAgaW50MzJfdCBpUGllY2VXaWR0aHMgPSAwOw0KKyAgRlhfRFdPUkQgZHdCcmVha1N0YXR1czsNCisgIEZYX1dDSEFSIHdjaDsNCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgd2hpbGUgKGlUeHRMZW5ndGgtLSA+IDApIHsNCisgICAgd2NoID0gKnB3c1N0cisrOw0KKyAgICBpZiAod2NoID09IEwnJicgJiYgYkhvdEtleSAmJiAocFN0ciAtIDEpICE9IE5VTEwgJiYgKihwU3RyIC0gMSkgIT0gTCcmJykgew0KKyAgICAgIGlmIChpVHh0TGVuZ3RoID4gMCkgew0KKyAgICAgICAgbV9ob3RLZXlzLkFkZChpQ2hhcnMpOw0KKyAgICAgIH0NCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICAqcFN0cisrID0gd2NoOw0KKyAgICBpQ2hhcnMrKzsNCisgICAgZHdCcmVha1N0YXR1cyA9IG1fcFR4dEJyZWFrLT5BcHBlbmRDaGFyKHdjaCk7DQorICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgIEZYX0JPT0wgYkVuZG9mTGluZSA9DQorICAgICAgICAgIFJldHJpZWNlUGllY2VzKGR3QnJlYWtTdGF0dXMsIGlTdGFydENoYXIsIGlQaWVjZVdpZHRocywgRkFMU0UsIHJlY3QpOw0KKyAgICAgIGlmIChiRW5kb2ZMaW5lICYmIChiTGluZVdyYXAgfHwgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19MaW5lQnJlYWsgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhYkxpbmVXcmFwKSkpIHsNCisgICAgICAgIGlQaWVjZVdpZHRocyA9IDA7DQorICAgICAgICBtX2lDdXJMaW5lKys7DQorICAgICAgICBtX2ZMaW5lUG9zICs9IGZMaW5lU3RlcDsNCisgICAgICB9DQorICAgICAgaWYgKChiVmVydGljYWwgJiYgbV9mTGluZVBvcyArIGZMaW5lU3RlcCA8IGZMaW5lU3RvcCkgfHwNCisgICAgICAgICAgKCFiVmVydGljYWwgJiYgbV9mTGluZVBvcyArIGZMaW5lU3RlcCA+IGZMaW5lU3RvcCkpIHsNCisgICAgICAgIGludDMyX3QgaUN1ckxpbmUgPSBtX2lDdXJMaW5lOw0KKyAgICAgICAgaWYgKGJFbmRvZkxpbmUpIHsNCisgICAgICAgICAgaUN1ckxpbmUtLTsNCisgICAgICAgIH0NCisgICAgICAgIENGREVfVFRPTGluZSogcExpbmUgPSBtX3R0b0xpbmVzLkdldFB0ckF0KGlDdXJMaW5lKTsNCisgICAgICAgIHBMaW5lLT5tX2JOZXdSZWxvYWQgPSBUUlVFOw0KKyAgICAgICAgYlJldCA9IFRSVUU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrICYmICFiUmV0KSB7DQorICAgIFJldHJpZWNlUGllY2VzKGR3QnJlYWtTdGF0dXMsIGlTdGFydENoYXIsIGlQaWVjZVdpZHRocywgRkFMU0UsIHJlY3QpOw0KKyAgfQ0KKyAgbV9wVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCisgIG1fcFR4dEJyZWFrLT5SZXNldCgpOw0KKyAgbV93c1RleHQuUmVsZWFzZUJ1ZmZlcihpTGVuZ3RoKTsNCit9DQorRlhfQk9PTCBDRkRFX1RleHRPdXQ6OlJldHJpZWNlUGllY2VzKEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGFydENoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlQaWVjZVdpZHRocywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVsb2FkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIEZYX0JPT0wgYlNpbmdsZUxpbmUgPSAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKSA/IFRSVUUgOiBGQUxTRTsNCisgIEZYX0JPT0wgYkxpbmVXcmFwID0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfTGluZVdyYXApID8gVFJVRSA6IEZBTFNFOw0KKyAgRlhfQk9PTCBiVmVydGljYWwgPSAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCkgPyBUUlVFIDogRkFMU0U7DQorICBGWF9GTE9BVCBmTGluZVN0ZXAgPQ0KKyAgICAgIChtX2ZMaW5lU3BhY2UgPiBtX2ZGb250U2l6ZSkgPyBtX2ZMaW5lU3BhY2UgOiBtX2ZGb250U2l6ZTsNCisgIGlmIChiVmVydGljYWwpIHsNCisgICAgZkxpbmVTdGVwID0gLWZMaW5lU3RlcDsNCisgIH0NCisgIENGWF9DaGFyKiBwVEMgPSBOVUxMOw0KKyAgRlhfQk9PTCBiTmVlZFJlbG9hZCA9IEZBTFNFOw0KKyAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IGJWZXJ0aWNhbCA/IHJlY3QuSGVpZ2h0KCkgOiByZWN0LldpZHRoKCk7DQorICBpbnQzMl90IGlMaW5lV2lkdGggPSBGWFNZU19yb3VuZChmTGluZVdpZHRoICogMjAwMDAuMGYpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3BUeHRCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgY29uc3QgQ0ZYX1R4dFBpZWNlKiBwUGllY2UgPSBtX3BUeHRCcmVhay0+R2V0QnJlYWtQaWVjZShpKTsNCisgICAgaW50MzJfdCBpUGllY2VDaGFycyA9IHBQaWVjZS0+R2V0TGVuZ3RoKCk7DQorICAgIGludDMyX3QgaUNoYXIgPSBpU3RhcnRDaGFyOw0KKyAgICBpbnQzMl90IGlXaWR0aCA9IDA7DQorICAgIGludDMyX3QgaiA9IDA7DQorICAgIGZvciAoOyBqIDwgaVBpZWNlQ2hhcnM7IGorKykgew0KKyAgICAgIHBUQyA9IHBQaWVjZS0+R2V0Q2hhclB0cihqKTsNCisgICAgICBpbnQzMl90IGlDdXJDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aCA+IDAgPyBwVEMtPm1faUNoYXJXaWR0aCA6IDA7DQorICAgICAgaWYgKGJTaW5nbGVMaW5lIHx8ICFiTGluZVdyYXApIHsNCisgICAgICAgIGlmIChpTGluZVdpZHRoIC0gaVBpZWNlV2lkdGhzIC0gaVdpZHRoIDwgaUN1ckNoYXJXaWR0aCkgew0KKyAgICAgICAgICBiTmVlZFJlbG9hZCA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpV2lkdGggKz0gaUN1ckNoYXJXaWR0aDsNCisgICAgICBtX3BDaGFyV2lkdGhzW2lDaGFyKytdID0gaUN1ckNoYXJXaWR0aDsNCisgICAgfQ0KKyAgICBpZiAoaiA9PSAwICYmICFiUmVsb2FkKSB7DQorICAgICAgQ0ZERV9UVE9MaW5lKiBwTGluZSA9IG1fdHRvTGluZXMuR2V0UHRyQXQobV9pQ3VyTGluZSk7DQorICAgICAgcExpbmUtPm1fYk5ld1JlbG9hZCA9IFRSVUU7DQorICAgIH0gZWxzZSBpZiAoaiA+IDApIHsNCisgICAgICBDRlhfUmVjdEYgcnRQaWVjZTsNCisgICAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgICBydFBpZWNlLmxlZnQgPSBtX2ZMaW5lUG9zOw0KKyAgICAgICAgcnRQaWVjZS50b3AgPSByZWN0LnRvcCArIChGWF9GTE9BVClwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGY7DQorICAgICAgICBydFBpZWNlLndpZHRoID0gZkxpbmVTdGVwOw0KKyAgICAgICAgcnRQaWVjZS5oZWlnaHQgPSBpV2lkdGggLyAyMDAwMC4wZjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcnRQaWVjZS5sZWZ0ID0gcmVjdC5sZWZ0ICsgKEZYX0ZMT0FUKXBQaWVjZS0+bV9pU3RhcnRQb3MgLyAyMDAwMC4wZjsNCisgICAgICAgIHJ0UGllY2UudG9wID0gbV9mTGluZVBvczsNCisgICAgICAgIHJ0UGllY2Uud2lkdGggPSBpV2lkdGggLyAyMDAwMC4wZjsNCisgICAgICAgIHJ0UGllY2UuaGVpZ2h0ID0gZkxpbmVTdGVwOw0KKyAgICAgIH0NCisgICAgICBGREVfVFRPUElFQ0UgdHRvUGllY2U7DQorICAgICAgdHRvUGllY2UuaVN0YXJ0Q2hhciA9IGlTdGFydENoYXI7DQorICAgICAgdHRvUGllY2UuaUNoYXJzID0gajsNCisgICAgICB0dG9QaWVjZS5ydFBpZWNlID0gcnRQaWVjZTsNCisgICAgICB0dG9QaWVjZS5kd0NoYXJTdHlsZXMgPSBwUGllY2UtPm1fZHdDaGFyU3R5bGVzOw0KKyAgICAgIGlmIChGWF9Jc09kZChwUGllY2UtPm1faUJpZGlMZXZlbCkpIHsNCisgICAgICAgIHR0b1BpZWNlLmR3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsOw0KKyAgICAgIH0NCisgICAgICBBcHBlbmRQaWVjZSh0dG9QaWVjZSwgYk5lZWRSZWxvYWQsIChiUmVsb2FkICYmIGkgPT0gaUNvdW50IC0gMSkpOw0KKyAgICB9DQorICAgIGlTdGFydENoYXIgKz0gaVBpZWNlQ2hhcnM7DQorICAgIGlQaWVjZVdpZHRocyArPSBpV2lkdGg7DQorICB9DQorICBtX3BUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgRlhfQk9PTCBiUmV0ID0gYlNpbmdsZUxpbmUgfHwgYkxpbmVXcmFwIHx8ICghYkxpbmVXcmFwICYmIGJOZWVkUmVsb2FkKSB8fA0KKyAgICAgICAgICAgICAgICAgZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhazsNCisgIHJldHVybiBiUmV0Ow0KK30NCit2b2lkIENGREVfVGV4dE91dDo6QXBwZW5kUGllY2UoY29uc3QgRkRFX1RUT1BJRUNFJiB0dG9QaWVjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTmVlZFJlbG9hZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5kKSB7DQorICBpZiAobV9pQ3VyTGluZSA+PSBtX3R0b0xpbmVzLkdldFNpemUoKSkgew0KKyAgICBDRkRFX1RUT0xpbmUgdHRvTGluZTsNCisgICAgdHRvTGluZS5tX2JOZXdSZWxvYWQgPSBiTmVlZFJlbG9hZDsNCisgICAgbV9pQ3VyUGllY2UgPSB0dG9MaW5lLkFkZFBpZWNlKG1faUN1clBpZWNlLCB0dG9QaWVjZSk7DQorICAgIG1faUN1ckxpbmUgPSBtX3R0b0xpbmVzLkFkZCh0dG9MaW5lKTsNCisgIH0gZWxzZSB7DQorICAgIENGREVfVFRPTGluZSogcExpbmUgPSBtX3R0b0xpbmVzLkdldFB0ckF0KG1faUN1ckxpbmUpOw0KKyAgICBwTGluZS0+bV9iTmV3UmVsb2FkID0gYk5lZWRSZWxvYWQ7DQorICAgIG1faUN1clBpZWNlID0gcExpbmUtPkFkZFBpZWNlKG1faUN1clBpZWNlLCB0dG9QaWVjZSk7DQorICAgIGlmIChiRW5kKSB7DQorICAgICAgaW50MzJfdCBpUGllY2VzID0gcExpbmUtPkdldFNpemUoKTsNCisgICAgICBpZiAobV9pQ3VyUGllY2UgPCBpUGllY2VzKSB7DQorICAgICAgICBwTGluZS0+UmVtb3ZlTGFzdChpUGllY2VzIC0gbV9pQ3VyUGllY2UgLSAxKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmICghYkVuZCAmJiBiTmVlZFJlbG9hZCkgew0KKyAgICBtX2lDdXJQaWVjZSA9IDA7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpSZXBsYWNlV2lkdGhFbGxpcHNpcygpIHsNCisgIExvYWRFbGxpcHNpcygpOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gbV93c0VsbGlwc2lzLkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUxpbmVzID0gbV90dG9MaW5lcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGluZXM7IGkrKykgew0KKyAgICBDRkRFX1RUT0xpbmUqIHBMaW5lID0gbV90dG9MaW5lcy5HZXRQdHJBdChpKTsNCisgICAgaWYgKCFwTGluZS0+bV9iTmV3UmVsb2FkKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaW50MzJfdCBpRWxsaXBzaXNDaGFySW5kZXggPSBpTGVuZ3RoIC0gMTsNCisgICAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsNCisgICAgaW50MzJfdCBpQ2hhckNvdW50ID0gMDsNCisgICAgaW50MzJfdCBpUGllY2UgPSBwTGluZS0+R2V0U2l6ZSgpOw0KKyAgICB3aGlsZSAoaVBpZWNlLS0gPiAwKSB7DQorICAgICAgRkRFX0xQVFRPUElFQ0UgcFBpZWNlID0gcExpbmUtPkdldFB0ckF0KGlQaWVjZSk7DQorICAgICAgaWYgKHBQaWVjZSA9PSBOVUxMKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZm9yIChpbnQzMl90IGogPSBwUGllY2UtPmlDaGFycyAtIDE7IGogPj0gMDsgai0tKSB7DQorICAgICAgICBpZiAoaUVsbGlwc2lzQ2hhckluZGV4IDwgMCkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgaW5kZXggPSBwUGllY2UtPmlTdGFydENoYXIgKyBqOw0KKyAgICAgICAgaUNoYXJXaWR0aCArPSBtX3BDaGFyV2lkdGhzW2luZGV4XTsNCisgICAgICAgIGlDaGFyQ291bnQrKzsNCisgICAgICAgIGlmIChpQ2hhckNvdW50IDw9IGlMZW5ndGgpIHsNCisgICAgICAgICAgbV93c1RleHQuU2V0QXQoaW5kZXgsIG1fd3NFbGxpcHNpcy5HZXRBdChpRWxsaXBzaXNDaGFySW5kZXgpKTsNCisgICAgICAgICAgbV9wQ2hhcldpZHRoc1tpbmRleF0gPSBtX3BFbGxDaGFyV2lkdGhzW2lFbGxpcHNpc0NoYXJJbmRleF07DQorICAgICAgICB9IGVsc2UgaWYgKGlDaGFyV2lkdGggPD0gbV9pRWxsaXBzaXNXaWR0aCkgew0KKyAgICAgICAgICBtX3dzVGV4dC5TZXRBdChpbmRleCwgMCk7DQorICAgICAgICAgIG1fcENoYXJXaWR0aHNbaW5kZXhdID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGlFbGxpcHNpc0NoYXJJbmRleC0tOw0KKyAgICAgIH0NCisgICAgICBpZiAoaUVsbGlwc2lzQ2hhckluZGV4IDwgMCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpSZWxvYWQoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fdHRvTGluZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ0ZERV9UVE9MaW5lKiBwTGluZSA9IG1fdHRvTGluZXMuR2V0UHRyQXQoaSk7DQorICAgIGlmIChwTGluZSA9PSBOVUxMIHx8ICFwTGluZS0+bV9iTmV3UmVsb2FkKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgbV9pQ3VyTGluZSA9IGk7DQorICAgIG1faUN1clBpZWNlID0gMDsNCisgICAgUmVsb2FkTGluZVBpZWNlKHBMaW5lLCByZWN0KTsNCisgIH0NCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlJlbG9hZExpbmVQaWVjZShDRkRFX1RUT0xpbmUqIHBMaW5lLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIgPSAoY29uc3QgRlhfV0NIQVIqKW1fd3NUZXh0Ow0KKyAgRlhfQk9PTCBiVmVydGljYWwgPSAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCkgPyBUUlVFIDogRkFMU0U7DQorICBpbnQzMl90IGlQaWVjZVdpZHRocyA9IDA7DQorICBGREVfTFBUVE9QSUVDRSBwUGllY2UgPSBwTGluZS0+R2V0UHRyQXQoMCk7DQorICBpbnQzMl90IGlTdGFydENoYXIgPSBwUGllY2UtPmlTdGFydENoYXI7DQorICBtX2ZMaW5lUG9zID0gYlZlcnRpY2FsID8gcFBpZWNlLT5ydFBpZWNlLmxlZnQgOiBwUGllY2UtPnJ0UGllY2UudG9wOw0KKyAgaW50MzJfdCBpUGllY2VDb3VudCA9IHBMaW5lLT5HZXRTaXplKCk7DQorICBpbnQzMl90IGlQaWVjZUluZGV4ID0gMDsNCisgIEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMgPSAwOw0KKyAgRlhfV0NIQVIgd2NoOw0KKyAgd2hpbGUgKGlQaWVjZUluZGV4IDwgaVBpZWNlQ291bnQpIHsNCisgICAgaW50MzJfdCBpU3RhciA9IGlTdGFydENoYXI7DQorICAgIGludDMyX3QgaUVuZCA9IHBQaWVjZS0+aUNoYXJzICsgaVN0YXI7DQorICAgIHdoaWxlIChpU3RhciA8IGlFbmQpIHsNCisgICAgICB3Y2ggPSAqKHB3c1N0ciArIGlTdGFyKTsNCisgICAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkFwcGVuZENoYXIod2NoKTsNCisgICAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCiAgICAgICAgIFJldHJpZWNlUGllY2VzKGR3QnJlYWtTdGF0dXMsIGlTdGFydENoYXIsIGlQaWVjZVdpZHRocywgVFJVRSwgcmVjdCk7DQorICAgICAgfQ0KKyAgICAgIGlTdGFyKys7DQogICAgIH0NCi0gICAgbV9wVHh0QnJlYWstPlJlc2V0KCk7DQorICAgIGlQaWVjZUluZGV4Kys7DQorICAgIHBQaWVjZSA9IHBMaW5lLT5HZXRQdHJBdChpUGllY2VJbmRleCk7DQorICB9DQorICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICBSZXRyaWVjZVBpZWNlcyhkd0JyZWFrU3RhdHVzLCBpU3RhcnRDaGFyLCBpUGllY2VXaWR0aHMsIFRSVUUsIHJlY3QpOw0KKyAgfQ0KKyAgbV9wVHh0QnJlYWstPlJlc2V0KCk7DQogfQ0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpEb0FsaWdubWVudChjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBGWF9CT09MIGJWZXJ0aWNhbAk9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0KSA/IFRSVUUgOiBGQUxTRTsNCi0gICAgRlhfRkxPQVQgZkxpbmVTdG9wUwk9IGJWZXJ0aWNhbCA/IHJlY3QucmlnaHQoKSA6IHJlY3QuYm90dG9tKCk7DQotICAgIGludDMyX3QgaUxpbmVzCQk9IG1fdHRvTGluZXMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaUxpbmVzIDwgMSkgew0KLSAgICAgICAgcmV0dXJuOw0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEb0FsaWdubWVudChjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIEZYX0JPT0wgYlZlcnRpY2FsID0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpID8gVFJVRSA6IEZBTFNFOw0KKyAgRlhfRkxPQVQgZkxpbmVTdG9wUyA9IGJWZXJ0aWNhbCA/IHJlY3QucmlnaHQoKSA6IHJlY3QuYm90dG9tKCk7DQorICBpbnQzMl90IGlMaW5lcyA9IG1fdHRvTGluZXMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlMaW5lcyA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZERV9UVE9MaW5lKiBwTGluZSA9IG1fdHRvTGluZXMuR2V0UHRyQXQoaUxpbmVzIC0gMSk7DQorICBGREVfTFBUVE9QSUVDRSBwUGllY2UgPSBwTGluZS0+R2V0UHRyQXQoMCk7DQorICBpZiAocFBpZWNlID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkxpbmVTdG9wRCA9DQorICAgICAgYlZlcnRpY2FsID8gcFBpZWNlLT5ydFBpZWNlLnJpZ2h0KCkgOiBwUGllY2UtPnJ0UGllY2UuYm90dG9tKCk7DQorICBGWF9GTE9BVCBmSW5jID0gZkxpbmVTdG9wUyAtIGZMaW5lU3RvcEQ7DQorICBpZiAobV9pQWxpZ25tZW50ID49IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdCAmJg0KKyAgICAgIG1faUFsaWdubWVudCA8IEZERV9UVE9BTElHTk1FTlRfQm90dG9tTGVmdCkgew0KKyAgICBmSW5jIC89IDIuMGY7DQorICB9IGVsc2UgaWYgKG1faUFsaWdubWVudCA8IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdCkgew0KKyAgICBmSW5jID0gMC4wZjsNCisgIH0NCisgIGlmIChmSW5jIDwgMS4wZikgew0KKyAgICByZXR1cm47DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGluZXM7IGkrKykgew0KKyAgICBDRkRFX1RUT0xpbmUqIHBMaW5lID0gbV90dG9MaW5lcy5HZXRQdHJBdChpKTsNCisgICAgaW50MzJfdCBpUGllY2VzID0gcExpbmUtPkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVBpZWNlczsgaisrKSB7DQorICAgICAgRkRFX0xQVFRPUElFQ0UgcFBpZWNlID0gcExpbmUtPkdldFB0ckF0KGopOw0KKyAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgIHBQaWVjZS0+cnRQaWVjZS5sZWZ0ICs9IGZJbmM7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBQaWVjZS0+cnRQaWVjZS50b3AgKz0gZkluYzsNCisgICAgICB9DQogICAgIH0NCi0gICAgQ0ZERV9UVE9MaW5lICpwTGluZSA9IG1fdHRvTGluZXMuR2V0UHRyQXQoaUxpbmVzIC0gMSk7DQotICAgIEZERV9MUFRUT1BJRUNFIHBQaWVjZSA9IHBMaW5lLT5HZXRQdHJBdCgwKTsNCi0gICAgaWYgKHBQaWVjZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpPbkRyYXcoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApIHsNCisgIGlmIChtX3BSZW5kZXJEZXZpY2UgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlMaW5lcyA9IG1fdHRvTGluZXMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlMaW5lcyA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZERV9Tb2xpZEJydXNoKiBwQnJ1c2ggPQ0KKyAgICAgIChJRkRFX1NvbGlkQnJ1c2gqKUlGREVfQnJ1c2g6OkNyZWF0ZShGREVfQlJVU0hUWVBFX1NvbGlkKTsNCisgIHBCcnVzaC0+U2V0Q29sb3IobV9UeHRDb2xvcik7DQorICBJRkRFX1BlbiogcFBlbiA9IE5VTEw7DQorICBGREVfSERFVklDRVNUQVRFIGhEZXYgPSBtX3BSZW5kZXJEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KKyAgaWYgKHJ0Q2xpcC5XaWR0aCgpID4gMC4wZiAmJiBydENsaXAuSGVpZ2h0KCkgPiAwLjBmKSB7DQorICAgIG1fcFJlbmRlckRldmljZS0+U2V0Q2xpcFJlY3QocnRDbGlwKTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMaW5lczsgaSsrKSB7DQorICAgIENGREVfVFRPTGluZSogcExpbmUgPSBtX3R0b0xpbmVzLkdldFB0ckF0KGkpOw0KKyAgICBpbnQzMl90IGlQaWVjZXMgPSBwTGluZS0+R2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUGllY2VzOyBqKyspIHsNCisgICAgICBGREVfTFBUVE9QSUVDRSBwUGllY2UgPSBwTGluZS0+R2V0UHRyQXQoaik7DQorICAgICAgaWYgKHBQaWVjZSA9PSBOVUxMKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBpQ291bnQgPSBHZXREaXNwbGF5UG9zKHBQaWVjZSk7DQorICAgICAgaWYgKGlDb3VudCA+IDApIHsNCisgICAgICAgIG1fcFJlbmRlckRldmljZS0+RHJhd1N0cmluZyhwQnJ1c2gsIG1fcEZvbnQsIG1fcENoYXJQb3MsIGlDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZGb250U2l6ZSwgJm1fTWF0cml4KTsNCisgICAgICB9DQorICAgICAgRHJhd0xpbmUocFBpZWNlLCBwUGVuKTsNCiAgICAgfQ0KLSAgICBGWF9GTE9BVCBmTGluZVN0b3BEID0gYlZlcnRpY2FsID8gcFBpZWNlLT5ydFBpZWNlLnJpZ2h0KCkgOiBwUGllY2UtPnJ0UGllY2UuYm90dG9tKCk7DQotICAgIEZYX0ZMT0FUIGZJbmMJCT0gZkxpbmVTdG9wUyAtIGZMaW5lU3RvcEQ7DQotICAgIGlmIChtX2lBbGlnbm1lbnQgPj0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0ICYmIG1faUFsaWdubWVudCA8IEZERV9UVE9BTElHTk1FTlRfQm90dG9tTGVmdCkgew0KLSAgICAgICAgZkluYyAvPSAyLjBmOw0KLSAgICB9IGVsc2UgaWYgKG1faUFsaWdubWVudCA8IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdCkgew0KLSAgICAgICAgZkluYyA9IDAuMGY7DQorICB9DQorICBtX3BSZW5kZXJEZXZpY2UtPlJlc3RvcmVTdGF0ZShoRGV2KTsNCisgIGlmIChwQnJ1c2gpIHsNCisgICAgcEJydXNoLT5SZWxlYXNlKCk7DQorICB9DQorICBpZiAocFBlbikgew0KKyAgICBwUGVuLT5SZWxlYXNlKCk7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZERV9UZXh0T3V0OjpHZXREaXNwbGF5UG9zKEZERV9MUFRUT1BJRUNFIHBQaWVjZSkgew0KKyAgRlhfVFhUUlVOIHRyOw0KKyAgVG9UZXh0UnVuKHBQaWVjZSwgdHIpOw0KKyAgRXhwYW5kQnVmZmVyKHRyLmlMZW5ndGgsIDIpOw0KKyAgcmV0dXJuIG1fcFR4dEJyZWFrLT5HZXREaXNwbGF5UG9zKCZ0ciwgbV9wQ2hhclBvcyk7DQorfQ0KK2ludDMyX3QgQ0ZERV9UZXh0T3V0OjpHZXRDaGFyUmVjdHMoRkRFX0xQVFRPUElFQ0UgcFBpZWNlKSB7DQorICBGWF9UWFRSVU4gdHI7DQorICBUb1RleHRSdW4ocFBpZWNlLCB0cik7DQorICBtX3JlY3RBcnJheS5SZW1vdmVBbGwoKTsNCisgIHJldHVybiBtX3BUeHRCcmVhay0+R2V0Q2hhclJlY3RzKCZ0ciwgbV9yZWN0QXJyYXkpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6VG9UZXh0UnVuKGNvbnN0IEZERV9MUFRUT1BJRUNFIHBQaWVjZSwgRlhfVFhUUlVOJiB0cikgew0KKyAgdHIucEFjY2VzcyA9IE5VTEw7DQorICB0ci5wSWRlbnRpdHkgPSBOVUxMOw0KKyAgdHIucFN0ciA9IChjb25zdCBGWF9XQ0hBUiopbV93c1RleHQgKyBwUGllY2UtPmlTdGFydENoYXI7DQorICB0ci5wV2lkdGhzID0gbV9wQ2hhcldpZHRocyArIHBQaWVjZS0+aVN0YXJ0Q2hhcjsNCisgIHRyLmlMZW5ndGggPSBwUGllY2UtPmlDaGFyczsNCisgIHRyLnBGb250ID0gbV9wRm9udDsNCisgIHRyLmZGb250U2l6ZSA9IG1fZkZvbnRTaXplOw0KKyAgdHIuZHdTdHlsZXMgPSBtX2R3VHh0QmtTdHlsZXM7DQorICB0ci5pQ2hhclJvdGF0aW9uID0gMDsNCisgIHRyLmR3Q2hhclN0eWxlcyA9IHBQaWVjZS0+ZHdDaGFyU3R5bGVzOw0KKyAgdHIud0xpbmVCcmVha0NoYXIgPSBtX3dQYXJhZ3JhcGhCa0NoYXI7DQorICB0ci5wUmVjdCA9ICZwUGllY2UtPnJ0UGllY2U7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3TGluZShjb25zdCBGREVfTFBUVE9QSUVDRSBwUGllY2UsIElGREVfUGVuKiYgcFBlbikgew0KKyAgRlhfQk9PTCBiVW5kZXJMaW5lID0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVW5kZXJsaW5lKSA/IFRSVUUgOiBGQUxTRTsNCisgIEZYX0JPT0wgYlN0cmlrZU91dCA9IChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1N0cmlrZW91dCkgPyBUUlVFIDogRkFMU0U7DQorICBGWF9CT09MIGJIb3RLZXkgPSAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9Ib3RLZXkpID8gVFJVRSA6IEZBTFNFOw0KKyAgRlhfQk9PTCBiVmVydGljYWwgPSAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCkgPyBUUlVFIDogRkFMU0U7DQorICBpZiAoIWJVbmRlckxpbmUgJiYgIWJTdHJpa2VPdXQgJiYgIWJIb3RLZXkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBQZW4gPT0gTlVMTCkgew0KKyAgICBwUGVuID0gSUZERV9QZW46OkNyZWF0ZSgpOw0KKyAgICBwUGVuLT5TZXRDb2xvcihtX1R4dENvbG9yKTsNCisgIH0NCisgIElGREVfUGF0aCogcFBhdGggPSBJRkRFX1BhdGg6OkNyZWF0ZSgpOw0KKyAgaW50MzJfdCBpTGluZUNvdW50ID0gMDsNCisgIENGWF9SZWN0RiBydFRleHQgPSBwUGllY2UtPnJ0UGllY2U7DQorICBDRlhfUG9pbnRGIHB0MSwgcHQyOw0KKyAgaWYgKGJVbmRlckxpbmUpIHsNCisgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgIHB0MS54ID0gcnRUZXh0LmxlZnQ7DQorICAgICAgcHQxLnkgPSBydFRleHQudG9wOw0KKyAgICAgIHB0Mi54ID0gcnRUZXh0LmxlZnQ7DQorICAgICAgcHQyLnkgPSBydFRleHQuYm90dG9tKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcHQxLnggPSBydFRleHQubGVmdDsNCisgICAgICBwdDEueSA9IHJ0VGV4dC5ib3R0b20oKTsNCisgICAgICBwdDIueCA9IHJ0VGV4dC5yaWdodCgpOw0KKyAgICAgIHB0Mi55ID0gcnRUZXh0LmJvdHRvbSgpOw0KICAgICB9DQotICAgIGlmIChmSW5jIDwgMS4wZikgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7DQorICAgIGlMaW5lQ291bnQrKzsNCisgIH0NCisgIGlmIChiU3RyaWtlT3V0KSB7DQorICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICBwdDEueCA9IHJ0VGV4dC5sZWZ0ICsgcnRUZXh0LndpZHRoICogMi4wZiAvIDUuMGY7DQorICAgICAgcHQxLnkgPSBydFRleHQudG9wOw0KKyAgICAgIDsNCisgICAgICBwdDIueCA9IHB0MS54Ow0KKyAgICAgIHB0Mi55ID0gcnRUZXh0LmJvdHRvbSgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHB0MS54ID0gcnRUZXh0LmxlZnQ7DQorICAgICAgcHQxLnkgPSBydFRleHQuYm90dG9tKCkgLSBydFRleHQuaGVpZ2h0ICogMi4wZiAvIDUuMGY7DQorICAgICAgcHQyLnggPSBydFRleHQucmlnaHQoKTsNCisgICAgICBwdDIueSA9IHB0MS55Ow0KICAgICB9DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMaW5lczsgaSsrKSB7DQotICAgICAgICBDRkRFX1RUT0xpbmUgKnBMaW5lID0gbV90dG9MaW5lcy5HZXRQdHJBdChpKTsNCi0gICAgICAgIGludDMyX3QgaVBpZWNlcyA9IHBMaW5lLT5HZXRTaXplKCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUGllY2VzOyBqKyspIHsNCi0gICAgICAgICAgICBGREVfTFBUVE9QSUVDRSBwUGllY2UgPSBwTGluZS0+R2V0UHRyQXQoaik7DQotICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KLSAgICAgICAgICAgICAgICBwUGllY2UtPnJ0UGllY2UubGVmdCArPSBmSW5jOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBQaWVjZS0+cnRQaWVjZS50b3AJICs9IGZJbmM7DQotICAgICAgICAgICAgfQ0KKyAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7DQorICAgIGlMaW5lQ291bnQrKzsNCisgIH0NCisgIGlmIChiSG90S2V5KSB7DQorICAgIGludDMyX3QgaUhvdEtleXMgPSBtX2hvdEtleXMuR2V0U2l6ZSgpOw0KKyAgICBpbnQzMl90IGlDb3VudCA9IEdldENoYXJSZWN0cyhwUGllY2UpOw0KKyAgICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlIb3RLZXlzOyBpKyspIHsNCisgICAgICAgIGludDMyX3QgaUNoYXJJbmRleCA9IG1faG90S2V5cy5HZXRBdChpKTsNCisgICAgICAgIGlmIChpQ2hhckluZGV4ID49IHBQaWVjZS0+aVN0YXJ0Q2hhciAmJg0KKyAgICAgICAgICAgIGlDaGFySW5kZXggPCBwUGllY2UtPmlTdGFydENoYXIgKyBwUGllY2UtPmlDaGFycykgew0KKyAgICAgICAgICBDRlhfUmVjdEYgcmVjdCA9IG1fcmVjdEFycmF5LkdldEF0KGlDaGFySW5kZXggLSBwUGllY2UtPmlTdGFydENoYXIpOw0KKyAgICAgICAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgICAgICAgcHQxLnggPSByZWN0LmxlZnQ7DQorICAgICAgICAgICAgcHQxLnkgPSByZWN0LnRvcDsNCisgICAgICAgICAgICBwdDIueCA9IHJlY3QubGVmdDsNCisgICAgICAgICAgICBwdDIueSA9IHJlY3QuYm90dG9tKCk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcHQxLnggPSByZWN0LmxlZnQ7DQorICAgICAgICAgICAgcHQxLnkgPSByZWN0LmJvdHRvbSgpOw0KKyAgICAgICAgICAgIHB0Mi54ID0gcmVjdC5yaWdodCgpOw0KKyAgICAgICAgICAgIHB0Mi55ID0gcmVjdC5ib3R0b20oKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7DQorICAgICAgICAgIGlMaW5lQ291bnQrKzsNCiAgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi19DQotdm9pZCBDRkRFX1RleHRPdXQ6Ok9uRHJhdyhjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCkNCi17DQotICAgIGlmIChtX3BSZW5kZXJEZXZpY2UgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUxpbmVzID0gbV90dG9MaW5lcy5HZXRTaXplKCk7DQotICAgIGlmIChpTGluZXMgPCAxKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSUZERV9Tb2xpZEJydXNoICpwQnJ1c2ggPSAoSUZERV9Tb2xpZEJydXNoKilJRkRFX0JydXNoOjpDcmVhdGUoRkRFX0JSVVNIVFlQRV9Tb2xpZCk7DQotICAgIHBCcnVzaC0+U2V0Q29sb3IobV9UeHRDb2xvcik7DQotICAgIElGREVfUGVuICpwUGVuID0gTlVMTDsNCi0gICAgRkRFX0hERVZJQ0VTVEFURSBoRGV2ID0gbV9wUmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsNCi0gICAgaWYgKHJ0Q2xpcC5XaWR0aCgpID4gMC4wZiAmJiBydENsaXAuSGVpZ2h0KCkgPiAwLjBmKSB7DQotICAgICAgICBtX3BSZW5kZXJEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxpbmVzOyBpKyspIHsNCi0gICAgICAgIENGREVfVFRPTGluZSAqcExpbmUgPSBtX3R0b0xpbmVzLkdldFB0ckF0KGkpOw0KLSAgICAgICAgaW50MzJfdCBpUGllY2VzID0gcExpbmUtPkdldFNpemUoKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlQaWVjZXM7IGorKykgew0KLSAgICAgICAgICAgIEZERV9MUFRUT1BJRUNFIHBQaWVjZSA9IHBMaW5lLT5HZXRQdHJBdChqKTsNCi0gICAgICAgICAgICBpZiAocFBpZWNlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gR2V0RGlzcGxheVBvcyhwUGllY2UpOw0KLSAgICAgICAgICAgIGlmIChpQ291bnQgPiAwKSB7DQotICAgICAgICAgICAgICAgIG1fcFJlbmRlckRldmljZS0+RHJhd1N0cmluZyhwQnJ1c2gsIG1fcEZvbnQsIG1fcENoYXJQb3MsIGlDb3VudCwgbV9mRm9udFNpemUsICZtX01hdHJpeCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIERyYXdMaW5lKHBQaWVjZSwgcFBlbik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9wUmVuZGVyRGV2aWNlLT5SZXN0b3JlU3RhdGUoaERldik7DQotICAgIGlmIChwQnJ1c2gpCXsNCi0gICAgICAgIHBCcnVzaC0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIGlmIChwUGVuKQl7DQotICAgICAgICBwUGVuLT5SZWxlYXNlKCk7DQotICAgIH0NCi19DQotaW50MzJfdCBDRkRFX1RleHRPdXQ6OkdldERpc3BsYXlQb3MoRkRFX0xQVFRPUElFQ0UgcFBpZWNlKQ0KLXsNCi0gICAgRlhfVFhUUlVOIHRyOw0KLSAgICBUb1RleHRSdW4ocFBpZWNlLCB0cik7DQotICAgIEV4cGFuZEJ1ZmZlcih0ci5pTGVuZ3RoLCAyKTsNCi0gICAgcmV0dXJuIG1fcFR4dEJyZWFrLT5HZXREaXNwbGF5UG9zKCZ0ciwgbV9wQ2hhclBvcyk7DQotfQ0KLWludDMyX3QgQ0ZERV9UZXh0T3V0OjpHZXRDaGFyUmVjdHMoRkRFX0xQVFRPUElFQ0UgcFBpZWNlKQ0KLXsNCi0gICAgRlhfVFhUUlVOIHRyOw0KLSAgICBUb1RleHRSdW4ocFBpZWNlLCB0cik7DQotICAgIG1fcmVjdEFycmF5LlJlbW92ZUFsbCgpOw0KLSAgICByZXR1cm4gbV9wVHh0QnJlYWstPkdldENoYXJSZWN0cygmdHIsIG1fcmVjdEFycmF5KTsNCi19DQotdm9pZCBDRkRFX1RleHRPdXQ6OlRvVGV4dFJ1bihjb25zdCBGREVfTFBUVE9QSUVDRSBwUGllY2UsIEZYX1RYVFJVTiAmdHIpDQotew0KLSAgICB0ci5wQWNjZXNzCQk9IE5VTEw7DQotICAgIHRyLnBJZGVudGl0eQk9IE5VTEw7DQotICAgIHRyLnBTdHIJCQk9IChjb25zdCBGWF9XQ0hBUiopbV93c1RleHQgKyBwUGllY2UtPmlTdGFydENoYXI7DQotICAgIHRyLnBXaWR0aHMJCT0gbV9wQ2hhcldpZHRocyArIHBQaWVjZS0+aVN0YXJ0Q2hhcjsNCi0gICAgdHIuaUxlbmd0aAkJPSBwUGllY2UtPmlDaGFyczsNCi0gICAgdHIucEZvbnQJCT0gbV9wRm9udDsNCi0gICAgdHIuZkZvbnRTaXplCT0gbV9mRm9udFNpemU7DQotICAgIHRyLmR3U3R5bGVzCQk9IG1fZHdUeHRCa1N0eWxlczsNCi0gICAgdHIuaUNoYXJSb3RhdGlvbiA9IDA7DQotICAgIHRyLmR3Q2hhclN0eWxlcwk9IHBQaWVjZS0+ZHdDaGFyU3R5bGVzOw0KLSAgICB0ci53TGluZUJyZWFrQ2hhciA9IG1fd1BhcmFncmFwaEJrQ2hhcjsNCi0gICAgdHIucFJlY3QJCT0gJnBQaWVjZS0+cnRQaWVjZTsNCi19DQotdm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdMaW5lKGNvbnN0IEZERV9MUFRUT1BJRUNFIHBQaWVjZSwgSUZERV9QZW4gKiZwUGVuKQ0KLXsNCi0gICAgRlhfQk9PTCBiVW5kZXJMaW5lID0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVW5kZXJsaW5lKSA/IFRSVUUgOiBGQUxTRTsNCi0gICAgRlhfQk9PTCBiU3RyaWtlT3V0ID0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfU3RyaWtlb3V0KSA/IFRSVUUgOiBGQUxTRTsNCi0gICAgRlhfQk9PTCBiSG90S2V5CSAgID0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfSG90S2V5KSA/IFRSVUUgOiBGQUxTRTsNCi0gICAgRlhfQk9PTCBiVmVydGljYWwgID0gKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpID8gVFJVRSA6IEZBTFNFOw0KLSAgICBpZiAoIWJVbmRlckxpbmUgJiYgIWJTdHJpa2VPdXQgJiYgIWJIb3RLZXkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAocFBlbiA9PSBOVUxMKSB7DQotICAgICAgICBwUGVuID0gSUZERV9QZW46OkNyZWF0ZSgpOw0KLSAgICAgICAgcFBlbi0+U2V0Q29sb3IobV9UeHRDb2xvcik7DQotICAgIH0NCi0gICAgSUZERV9QYXRoICpwUGF0aCA9IElGREVfUGF0aDo6Q3JlYXRlKCk7DQotICAgIGludDMyX3QgaUxpbmVDb3VudCA9IDA7DQotICAgIENGWF9SZWN0RiBydFRleHQgPSBwUGllY2UtPnJ0UGllY2U7DQotICAgIENGWF9Qb2ludEYgcHQxLCBwdDI7DQotICAgIGlmIChiVW5kZXJMaW5lKSB7DQotICAgICAgICBpZiAoYlZlcnRpY2FsKSB7DQotICAgICAgICAgICAgcHQxLnggPSBydFRleHQubGVmdDsNCi0gICAgICAgICAgICBwdDEueSA9IHJ0VGV4dC50b3A7DQotICAgICAgICAgICAgcHQyLnggPSBydFRleHQubGVmdDsNCi0gICAgICAgICAgICBwdDIueSA9IHJ0VGV4dC5ib3R0b20oKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcHQxLnggPSBydFRleHQubGVmdDsNCi0gICAgICAgICAgICBwdDEueSA9IHJ0VGV4dC5ib3R0b20oKTsNCi0gICAgICAgICAgICBwdDIueCA9IHJ0VGV4dC5yaWdodCgpOw0KLSAgICAgICAgICAgIHB0Mi55ID0gcnRUZXh0LmJvdHRvbSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOw0KLSAgICAgICAgaUxpbmVDb3VudCsrOw0KLSAgICB9DQotICAgIGlmIChiU3RyaWtlT3V0KSB7DQotICAgICAgICBpZiAoYlZlcnRpY2FsKSB7DQotICAgICAgICAgICAgcHQxLnggPSBydFRleHQubGVmdCArIHJ0VGV4dC53aWR0aCAqIDIuMGYgLyA1LjBmOw0KLSAgICAgICAgICAgIHB0MS55ID0gcnRUZXh0LnRvcDs7DQotICAgICAgICAgICAgcHQyLnggPSBwdDEueDsNCi0gICAgICAgICAgICBwdDIueSA9IHJ0VGV4dC5ib3R0b20oKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcHQxLnggPSBydFRleHQubGVmdDsNCi0gICAgICAgICAgICBwdDEueSA9IHJ0VGV4dC5ib3R0b20oKSAtIHJ0VGV4dC5oZWlnaHQgKiAyLjBmIC8gNS4wZjsNCi0gICAgICAgICAgICBwdDIueCA9IHJ0VGV4dC5yaWdodCgpOw0KLSAgICAgICAgICAgIHB0Mi55ID0gcHQxLnk7DQotICAgICAgICB9DQotICAgICAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7DQotICAgICAgICBpTGluZUNvdW50Kys7DQotICAgIH0NCi0gICAgaWYgKGJIb3RLZXkpIHsNCi0gICAgICAgIGludDMyX3QgaUhvdEtleXMgPSBtX2hvdEtleXMuR2V0U2l6ZSgpOw0KLSAgICAgICAgaW50MzJfdCBpQ291bnQJICA9IEdldENoYXJSZWN0cyhwUGllY2UpOw0KLSAgICAgICAgaWYgKGlDb3VudCA+IDApIHsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpSG90S2V5czsgaSsrKSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUNoYXJJbmRleCA9IG1faG90S2V5cy5HZXRBdChpKTsNCi0gICAgICAgICAgICAgICAgaWYgKGlDaGFySW5kZXggPj0gcFBpZWNlLT5pU3RhcnRDaGFyICYmIGlDaGFySW5kZXggPCBwUGllY2UtPmlTdGFydENoYXIgKyBwUGllY2UtPmlDaGFycykgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJlY3QgPSBtX3JlY3RBcnJheS5HZXRBdChpQ2hhckluZGV4IC0gcFBpZWNlLT5pU3RhcnRDaGFyKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiVmVydGljYWwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwdDEueCA9IHJlY3QubGVmdDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwdDEueSA9IHJlY3QudG9wOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0Mi54ID0gcmVjdC5sZWZ0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0Mi55ID0gcmVjdC5ib3R0b20oKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHQxLnggPSByZWN0LmxlZnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHQxLnkgPSByZWN0LmJvdHRvbSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0Mi54ID0gcmVjdC5yaWdodCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0Mi55ID0gcmVjdC5ib3R0b20oKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHBQYXRoLT5BZGRMaW5lKHB0MSwgcHQyKTsNCi0gICAgICAgICAgICAgICAgICAgIGlMaW5lQ291bnQrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoaUxpbmVDb3VudCA+IDApIHsNCi0gICAgICAgIG1fcFJlbmRlckRldmljZS0+RHJhd1BhdGgocFBlbiwgMSwgcFBhdGgsICZtX01hdHJpeCk7DQotICAgIH0NCi0gICAgcFBhdGgtPlJlbGVhc2UoKTsNCisgIH0NCisgIGlmIChpTGluZUNvdW50ID4gMCkgew0KKyAgICBtX3BSZW5kZXJEZXZpY2UtPkRyYXdQYXRoKHBQZW4sIDEsIHBQYXRoLCAmbV9NYXRyaXgpOw0KKyAgfQ0KKyAgcFBhdGgtPlJlbGVhc2UoKTsNCiB9DQogQ0ZERV9UVE9MaW5lOjpDRkRFX1RUT0xpbmUoKQ0KLSAgICA6IG1fYk5ld1JlbG9hZChGQUxTRSkNCi0gICAgLCBtX3BpZWNlcyg1KQ0KLSAgICAsIG1faVBpZWNlQ291bnQoMCkNCi17DQorICAgIDogbV9iTmV3UmVsb2FkKEZBTFNFKSwgbV9waWVjZXMoNSksIG1faVBpZWNlQ291bnQoMCkge30NCitDRkRFX1RUT0xpbmU6OkNGREVfVFRPTGluZShjb25zdCBDRkRFX1RUT0xpbmUmIHR0b0xpbmUpIDogbV9waWVjZXMoNSkgew0KKyAgbV9iTmV3UmVsb2FkID0gdHRvTGluZS5tX2JOZXdSZWxvYWQ7DQorICBtX2lQaWVjZUNvdW50ID0gdHRvTGluZS5tX2lQaWVjZUNvdW50Ow0KKyAgbV9waWVjZXMuQ29weSh0dG9MaW5lLm1fcGllY2VzKTsNCiB9DQotQ0ZERV9UVE9MaW5lOjpDRkRFX1RUT0xpbmUoY29uc3QgQ0ZERV9UVE9MaW5lICZ0dG9MaW5lKQ0KLSAgICA6IG1fcGllY2VzKDUpDQotew0KLSAgICBtX2JOZXdSZWxvYWQJPSB0dG9MaW5lLm1fYk5ld1JlbG9hZDsNCi0gICAgbV9pUGllY2VDb3VudAk9IHR0b0xpbmUubV9pUGllY2VDb3VudDsNCi0gICAgbV9waWVjZXMuQ29weSh0dG9MaW5lLm1fcGllY2VzKTsNCitDRkRFX1RUT0xpbmU6On5DRkRFX1RUT0xpbmUoKSB7fQ0KK2ludDMyX3QgQ0ZERV9UVE9MaW5lOjpBZGRQaWVjZShpbnQzMl90IGluZGV4LCBjb25zdCBGREVfVFRPUElFQ0UmIHR0b1BpZWNlKSB7DQorICBpZiAoaW5kZXggPj0gbV9pUGllY2VDb3VudCkgew0KKyAgICBpbmRleCA9IG1fcGllY2VzLkFkZCh0dG9QaWVjZSkgKyAxOw0KKyAgICBtX2lQaWVjZUNvdW50Kys7DQorICB9IGVsc2Ugew0KKyAgICBGREVfVFRPUElFQ0UmIHBpZWNlID0gbV9waWVjZXMuR2V0QXQoaW5kZXgpOw0KKyAgICBwaWVjZSA9IHR0b1BpZWNlOw0KKyAgfQ0KKyAgcmV0dXJuIGluZGV4Ow0KIH0NCi1DRkRFX1RUT0xpbmU6On5DRkRFX1RUT0xpbmUoKQ0KLXsNCitpbnQzMl90IENGREVfVFRPTGluZTo6R2V0U2l6ZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX2lQaWVjZUNvdW50Ow0KIH0NCi1pbnQzMl90IENGREVfVFRPTGluZTo6QWRkUGllY2UoaW50MzJfdCBpbmRleCwgY29uc3QgRkRFX1RUT1BJRUNFICZ0dG9QaWVjZSkNCi17DQotICAgIGlmIChpbmRleCA+PSBtX2lQaWVjZUNvdW50KSB7DQotICAgICAgICBpbmRleCA9IG1fcGllY2VzLkFkZCh0dG9QaWVjZSkgKyAxOw0KLSAgICAgICAgbV9pUGllY2VDb3VudCsrOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRkRFX1RUT1BJRUNFICZwaWVjZSA9IG1fcGllY2VzLkdldEF0KGluZGV4KTsNCi0gICAgICAgIHBpZWNlID0gdHRvUGllY2U7DQotICAgIH0NCi0gICAgcmV0dXJuIGluZGV4Ow0KK0ZERV9MUFRUT1BJRUNFIENGREVfVFRPTGluZTo6R2V0UHRyQXQoaW50MzJfdCBpbmRleCkgew0KKyAgaWYgKGluZGV4ID49IG1faVBpZWNlQ291bnQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gbV9waWVjZXMuR2V0UHRyQXQoaW5kZXgpOw0KIH0NCi1pbnQzMl90IENGREVfVFRPTGluZTo6R2V0U2l6ZSgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9pUGllY2VDb3VudDsNCit2b2lkIENGREVfVFRPTGluZTo6UmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCkgew0KKyAgbV9waWVjZXMuUmVtb3ZlTGFzdChpQ291bnQpOw0KIH0NCi1GREVfTFBUVE9QSUVDRSBDRkRFX1RUT0xpbmU6OkdldFB0ckF0KGludDMyX3QgaW5kZXgpDQotew0KLSAgICBpZiAoaW5kZXggPj0gbV9pUGllY2VDb3VudCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcGllY2VzLkdldFB0ckF0KGluZGV4KTsNCi19DQotdm9pZCBDRkRFX1RUT0xpbmU6OlJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQpDQotew0KLSAgICBtX3BpZWNlcy5SZW1vdmVMYXN0KGlDb3VudCk7DQotfQ0KLXZvaWQgQ0ZERV9UVE9MaW5lOjpSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkpDQotew0KLSAgICBtX3BpZWNlcy5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCit2b2lkIENGREVfVFRPTGluZTo6UmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5KSB7DQorICBtX3BpZWNlcy5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL3R0by9mZGVfdGV4dG91dC5oIGIveGZhL3NyYy9mZHAvc3JjL3R0by9mZGVfdGV4dG91dC5oCmluZGV4IGY1MWY4YjMuLmVjYjJjNzMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL3NyYy90dG8vZmRlX3RleHRvdXQuaAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvdHRvL2ZkZV90ZXh0b3V0LmgKQEAgLTcsMTI2ICs3LDE2MiBAQAogI2lmbmRlZiBfRkRFX1RFWFRPVVRfSU1QDQogI2RlZmluZSBfRkRFX1RFWFRPVVRfSU1QDQogc3RydWN0IEZERV9UVE9QSUVDRSB7DQotcHVibGljOg0KLSAgICBpbnQzMl90CWlTdGFydENoYXI7DQotICAgIGludDMyX3QJaUNoYXJzOw0KLSAgICBGWF9EV09SRAlkd0NoYXJTdHlsZXM7DQotICAgIENGWF9SZWN0RglydFBpZWNlOw0KKyBwdWJsaWM6DQorICBpbnQzMl90IGlTdGFydENoYXI7DQorICBpbnQzMl90IGlDaGFyczsNCisgIEZYX0RXT1JEIGR3Q2hhclN0eWxlczsNCisgIENGWF9SZWN0RiBydFBpZWNlOw0KIH07DQotdHlwZWRlZiBGREVfVFRPUElFQ0UgKiBGREVfTFBUVE9QSUVDRTsNCit0eXBlZGVmIEZERV9UVE9QSUVDRSogRkRFX0xQVFRPUElFQ0U7DQogdHlwZWRlZiBDRlhfTWFzc0FycmF5VGVtcGxhdGU8RkRFX1RUT1BJRUNFPiBDRkRFX1RUT1BpZWNlQXJyYXk7DQotY2xhc3MgQ0ZERV9UVE9MaW5lIDogcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1RUT0xpbmUoKTsNCi0gICAgQ0ZERV9UVE9MaW5lKGNvbnN0IENGREVfVFRPTGluZSAmdHRvTGluZSk7DQotICAgIH5DRkRFX1RUT0xpbmUoKTsNCi0gICAgaW50MzJfdAkJQWRkUGllY2UoaW50MzJfdCBpbmRleCwgY29uc3QgRkRFX1RUT1BJRUNFICZ0dG9QaWVjZSk7DQotICAgIGludDMyX3QJCUdldFNpemUoKSBjb25zdDsNCi0gICAgRkRFX0xQVFRPUElFQ0UJR2V0UHRyQXQoaW50MzJfdCBpbmRleCk7DQotICAgIHZvaWQJCQlSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50KTsNCi0gICAgdm9pZAkJCVJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSk7DQotICAgIEZYX0JPT0wJCQltX2JOZXdSZWxvYWQ7DQotICAgIENGREVfVFRPUGllY2VBcnJheSBtX3BpZWNlczsNCi1wcm90ZWN0ZWQ6DQotICAgIGludDMyX3QJCW1faVBpZWNlQ291bnQ7DQorY2xhc3MgQ0ZERV9UVE9MaW5lIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX1RUT0xpbmUoKTsNCisgIENGREVfVFRPTGluZShjb25zdCBDRkRFX1RUT0xpbmUmIHR0b0xpbmUpOw0KKyAgfkNGREVfVFRPTGluZSgpOw0KKyAgaW50MzJfdCBBZGRQaWVjZShpbnQzMl90IGluZGV4LCBjb25zdCBGREVfVFRPUElFQ0UmIHR0b1BpZWNlKTsNCisgIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0Ow0KKyAgRkRFX0xQVFRPUElFQ0UgR2V0UHRyQXQoaW50MzJfdCBpbmRleCk7DQorICB2b2lkIFJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQpOw0KKyAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkpOw0KKyAgRlhfQk9PTCBtX2JOZXdSZWxvYWQ7DQorICBDRkRFX1RUT1BpZWNlQXJyYXkgbV9waWVjZXM7DQorDQorIHByb3RlY3RlZDoNCisgIGludDMyX3QgbV9pUGllY2VDb3VudDsNCiB9Ow0KIHR5cGVkZWYgQ0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlPENGREVfVFRPTGluZT4gQ0ZERV9UVE9MaW5lQXJyYXk7DQotY2xhc3MgQ0ZERV9UZXh0T3V0IDogcHVibGljIElGREVfVGV4dE91dCwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1RleHRPdXQoKTsNCi0gICAgfkNGREVfVGV4dE91dCgpOw0KLSAgICB2aXJ0dWFsCXZvaWQJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldEZvbnQoSUZYX0ZvbnQgKnBGb250KTsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldFRleHRDb2xvcihGWF9BUkdCIGNvbG9yKTsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXMpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCk7DQotICAgIHZpcnR1YWwgdm9pZAkJU2V0RWxsaXBzaXNTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRWxsaXBzaXMpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldEFsaWdubWVudChpbnQzMl90IGlBbGlnbm1lbnQpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldExpbmVTcGFjZShGWF9GTE9BVCBmTGluZVNwYWNlKTsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRESUJpdG1hcChDRlhfRElCaXRtYXAgKnBESUIpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlICpwRGV2aWNlKTsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdCAmcnRDbGlwKTsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCk7DQotICAgIHZpcnR1YWwgdm9pZAkJU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCk7DQotICAgIHZpcnR1YWwgdm9pZAkJU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUNhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgQ0ZYX1NpemUgJnNpemUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUNhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgQ0ZYX1NpemVGICZzaXplKTsNCi0gICAgdmlydHVhbCB2b2lkCQlDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9SZWN0ICZyZWN0KTsNCi0gICAgdmlydHVhbCB2b2lkCQlDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9SZWN0RiAmcmVjdCk7DQorY2xhc3MgQ0ZERV9UZXh0T3V0IDogcHVibGljIElGREVfVGV4dE91dCwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX1RleHRPdXQoKTsNCisgIH5DRkRFX1RleHRPdXQoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnQoSUZYX0ZvbnQqIHBGb250KTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOw0KKyAgdmlydHVhbCB2b2lkIFNldFRleHRDb2xvcihGWF9BUkdCIGNvbG9yKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXMpOw0KKyAgdmlydHVhbCB2b2lkIFNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0RWxsaXBzaXNTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRWxsaXBzaXMpOw0KKyAgdmlydHVhbCB2b2lkIFNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpOw0KKyAgdmlydHVhbCB2b2lkIFNldEFsaWdubWVudChpbnQzMl90IGlBbGlnbm1lbnQpOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVTcGFjZShGWF9GTE9BVCBmTGluZVNwYWNlKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRESUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUIpOw0KKyAgdmlydHVhbCB2b2lkIFNldFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdCYgcnRDbGlwKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpOw0KKyAgdmlydHVhbCB2b2lkIENhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TaXplJiBzaXplKTsNCisgIHZpcnR1YWwgdm9pZCBDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU2l6ZUYmIHNpemUpOw0KKyAgdmlydHVhbCB2b2lkIENhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0JiByZWN0KTsNCisgIHZpcnR1YWwgdm9pZCBDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QpOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCURyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgaW50MzJfdCB4LCBpbnQzMl90IHkpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCURyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7DQotICAgIHZpcnR1YWwgdm9pZAkJRHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdCAmcmVjdCk7DQotICAgIHZpcnR1YWwgdm9pZAkJRHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KKyAgdmlydHVhbCB2b2lkIERyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHkpOw0KKyAgdmlydHVhbCB2b2lkIERyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSk7DQorICB2aXJ0dWFsIHZvaWQgRHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3QmIHJlY3QpOw0KKyAgdmlydHVhbCB2b2lkIERyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJU2V0TG9naWNDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCk7DQotICAgIHZpcnR1YWwgdm9pZAkJQ2FsY0xvZ2ljU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9TaXplRiAmc2l6ZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJQ2FsY0xvZ2ljU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9SZWN0RiAmcmVjdCk7DQotICAgIHZpcnR1YWwgdm9pZAkJRHJhd0xvZ2ljVGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCURyYXdMb2dpY1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0VG90YWxMaW5lcygpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAkJCQlDYWxjVGV4dFNpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICBGWF9CT09MCQkJCVJldHJpZXZlTGluZVdpZHRoKEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMsIEZYX0ZMT0FUICZmU3RhcnRQb3MsIEZYX0ZMT0FUICZmV2lkdGgsIEZYX0ZMT0FUICZmSGVpZ2h0KTsNCi0gICAgdm9pZAkJCQlTZXRMaW5lV2lkdGgoQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdm9pZAkJCQlEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCwgY29uc3QgQ0ZYX1JlY3RGICZydENsaXApOw0KLSAgICB2b2lkCQkJCUxvYWRUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdm9pZAkJCQlMb2FkRWxsaXBzaXMoKTsNCi0gICAgdm9pZAkJCQlFeHBhbmRCdWZmZXIoaW50MzJfdCBpU2l6ZSwgaW50MzJfdCBpVHlwZSk7DQotICAgIHZvaWQJCQkJUmV0cmlldmVFbGxQaWVjZXMoaW50MzJfdCAqJnBDaGFyV2lkdGhzKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRMb2dpY0NsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKTsNCisgIHZpcnR1YWwgdm9pZCBDYWxjTG9naWNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU2l6ZUYmIHNpemUpOw0KKyAgdmlydHVhbCB2b2lkIENhbGNMb2dpY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCk7DQorICB2aXJ0dWFsIHZvaWQgRHJhd0xvZ2ljVGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkpOw0KKyAgdmlydHVhbCB2b2lkIERyYXdMb2dpY1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VG90YWxMaW5lcygpOw0KIA0KLSAgICB2b2lkCQkJCVJlbG9hZChjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2b2lkCQkJCVJlbG9hZExpbmVQaWVjZShDRkRFX1RUT0xpbmUgKnBMaW5lLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICBGWF9CT09MCQkJCVJldHJpZWNlUGllY2VzKEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMsIGludDMyX3QgJmlTdGFydENoYXIsIGludDMyX3QgJmlQaWVjZVdpZHRocywgRlhfQk9PTCBiUmVsb2FkLCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2b2lkCQkJCUFwcGVuZFBpZWNlKGNvbnN0IEZERV9UVE9QSUVDRSAmdHRvUGllY2UsIEZYX0JPT0wgYk5lZWRSZWxvYWQsIEZYX0JPT0wgYkVuZCk7DQotICAgIHZvaWQJCQkJUmVwbGFjZVdpZHRoRWxsaXBzaXMoKTsNCi0gICAgdm9pZAkJCQlEb0FsaWdubWVudChjb25zdCBDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2b2lkCQkJCU9uRHJhdyhjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCk7DQotICAgIGludDMyX3QJCQlHZXREaXNwbGF5UG9zKEZERV9MUFRUT1BJRUNFIHBQaWVjZSk7DQotICAgIGludDMyX3QJCQlHZXRDaGFyUmVjdHMoRkRFX0xQVFRPUElFQ0UgcFBpZWNlKTsNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBDYWxjVGV4dFNpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgRlhfQk9PTCBSZXRyaWV2ZUxpbmVXaWR0aChGWF9EV09SRCBkd0JyZWFrU3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlN0YXJ0UG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkhlaWdodCk7DQorICB2b2lkIFNldExpbmVXaWR0aChDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApOw0KKyAgdm9pZCBMb2FkVGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7DQorICB2b2lkIExvYWRFbGxpcHNpcygpOw0KKyAgdm9pZCBFeHBhbmRCdWZmZXIoaW50MzJfdCBpU2l6ZSwgaW50MzJfdCBpVHlwZSk7DQorICB2b2lkIFJldHJpZXZlRWxsUGllY2VzKGludDMyX3QqJiBwQ2hhcldpZHRocyk7DQogDQotICAgIHZvaWQJCQkJVG9UZXh0UnVuKGNvbnN0IEZERV9MUFRUT1BJRUNFIHBQaWVjZSwgRlhfVFhUUlVOICZ0cik7DQotICAgIHZvaWQJCQkJRHJhd0xpbmUoY29uc3QgRkRFX0xQVFRPUElFQ0UgcFBpZWNlLCBJRkRFX1BlbiAqJnBQZW4pOw0KKyAgdm9pZCBSZWxvYWQoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQgUmVsb2FkTGluZVBpZWNlKENGREVfVFRPTGluZSogcExpbmUsIGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7DQorICBGWF9CT09MIFJldHJpZWNlUGllY2VzKEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGFydENoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlQaWVjZVdpZHRocywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVsb2FkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBBcHBlbmRQaWVjZShjb25zdCBGREVfVFRPUElFQ0UmIHR0b1BpZWNlLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOZWVkUmVsb2FkLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmQpOw0KKyAgdm9pZCBSZXBsYWNlV2lkdGhFbGxpcHNpcygpOw0KKyAgdm9pZCBEb0FsaWdubWVudChjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBPbkRyYXcoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApOw0KKyAgaW50MzJfdCBHZXREaXNwbGF5UG9zKEZERV9MUFRUT1BJRUNFIHBQaWVjZSk7DQorICBpbnQzMl90IEdldENoYXJSZWN0cyhGREVfTFBUVE9QSUVDRSBwUGllY2UpOw0KIA0KLSAgICBJRlhfVHh0QnJlYWsJCSptX3BUeHRCcmVhazsNCi0gICAgSUZYX0ZvbnQJCQkqbV9wRm9udDsNCi0gICAgRlhfRkxPQVQJCQltX2ZGb250U2l6ZTsNCi0gICAgRlhfRkxPQVQJCQltX2ZMaW5lU3BhY2U7DQotICAgIEZYX0ZMT0FUCQkJbV9mTGluZVBvczsNCi0gICAgRlhfRkxPQVQJCQltX2ZUb2xlcmFuY2U7DQorICB2b2lkIFRvVGV4dFJ1bihjb25zdCBGREVfTFBUVE9QSUVDRSBwUGllY2UsIEZYX1RYVFJVTiYgdHIpOw0KKyAgdm9pZCBEcmF3TGluZShjb25zdCBGREVfTFBUVE9QSUVDRSBwUGllY2UsIElGREVfUGVuKiYgcFBlbik7DQogDQotICAgIGludDMyX3QJCQltX2lBbGlnbm1lbnQ7DQotICAgIGludDMyX3QJCQltX2lUeHRCa0FsaWdubWVudDsNCi0gICAgaW50MzJfdAkJCSptX3BDaGFyV2lkdGhzOw0KLSAgICBpbnQzMl90CQkJbV9pQ2hhcnM7DQotICAgIGludDMyX3QJCQkqbV9wRWxsQ2hhcldpZHRoczsNCi0gICAgaW50MzJfdAkJCW1faUVsbENoYXJzOw0KLSAgICBGWF9XQ0hBUgkJCW1fd1BhcmFncmFwaEJrQ2hhcjsNCi0gICAgRlhfQVJHQgkJCQltX1R4dENvbG9yOw0KLSAgICBGWF9EV09SRAkJCW1fZHdTdHlsZXM7DQotICAgIEZYX0RXT1JECQkJbV9kd1R4dEJrU3R5bGVzOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJbV93c0VsbGlwc2lzOw0KLSAgICBGWF9CT09MCQkJCW1fYkVsbGlDaGFuZ2VkOw0KLSAgICBpbnQzMl90CQkJbV9pRWxsaXBzaXNXaWR0aDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCW1fd3NUZXh0Ow0KLSAgICBDRlhfUmVjdEYJCQltX3J0Q2xpcDsNCi0gICAgQ0ZYX1JlY3RGCQkJbV9ydExvZ2ljQ2xpcDsNCi0gICAgQ0ZYX01hdHJpeAkJCW1fTWF0cml4Ow0KLSAgICBDRkRFX1RUT0xpbmVBcnJheQltX3R0b0xpbmVzOw0KLSAgICBpbnQzMl90CQkJbV9pQ3VyTGluZTsNCi0gICAgaW50MzJfdAkJCW1faUN1clBpZWNlOw0KLSAgICBpbnQzMl90CQkJbV9pVG90YWxMaW5lczsNCi0gICAgRlhURVhUX0NIQVJQT1MJCSptX3BDaGFyUG9zOw0KLSAgICBpbnQzMl90CQkJbV9pQ2hhclBvc1NpemU7DQotICAgIElGREVfUmVuZGVyRGV2aWNlCSptX3BSZW5kZXJEZXZpY2U7DQotICAgIENGWF9JbnQzMkFycmF5CQltX2hvdEtleXM7DQotICAgIENGWF9SZWN0RkFycmF5CQltX3JlY3RBcnJheTsNCisgIElGWF9UeHRCcmVhayogbV9wVHh0QnJlYWs7DQorICBJRlhfRm9udCogbV9wRm9udDsNCisgIEZYX0ZMT0FUIG1fZkZvbnRTaXplOw0KKyAgRlhfRkxPQVQgbV9mTGluZVNwYWNlOw0KKyAgRlhfRkxPQVQgbV9mTGluZVBvczsNCisgIEZYX0ZMT0FUIG1fZlRvbGVyYW5jZTsNCisNCisgIGludDMyX3QgbV9pQWxpZ25tZW50Ow0KKyAgaW50MzJfdCBtX2lUeHRCa0FsaWdubWVudDsNCisgIGludDMyX3QqIG1fcENoYXJXaWR0aHM7DQorICBpbnQzMl90IG1faUNoYXJzOw0KKyAgaW50MzJfdCogbV9wRWxsQ2hhcldpZHRoczsNCisgIGludDMyX3QgbV9pRWxsQ2hhcnM7DQorICBGWF9XQ0hBUiBtX3dQYXJhZ3JhcGhCa0NoYXI7DQorICBGWF9BUkdCIG1fVHh0Q29sb3I7DQorICBGWF9EV09SRCBtX2R3U3R5bGVzOw0KKyAgRlhfRFdPUkQgbV9kd1R4dEJrU3R5bGVzOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0VsbGlwc2lzOw0KKyAgRlhfQk9PTCBtX2JFbGxpQ2hhbmdlZDsNCisgIGludDMyX3QgbV9pRWxsaXBzaXNXaWR0aDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NUZXh0Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRDbGlwOw0KKyAgQ0ZYX1JlY3RGIG1fcnRMb2dpY0NsaXA7DQorICBDRlhfTWF0cml4IG1fTWF0cml4Ow0KKyAgQ0ZERV9UVE9MaW5lQXJyYXkgbV90dG9MaW5lczsNCisgIGludDMyX3QgbV9pQ3VyTGluZTsNCisgIGludDMyX3QgbV9pQ3VyUGllY2U7DQorICBpbnQzMl90IG1faVRvdGFsTGluZXM7DQorICBGWFRFWFRfQ0hBUlBPUyogbV9wQ2hhclBvczsNCisgIGludDMyX3QgbV9pQ2hhclBvc1NpemU7DQorICBJRkRFX1JlbmRlckRldmljZSogbV9wUmVuZGVyRGV2aWNlOw0KKyAgQ0ZYX0ludDMyQXJyYXkgbV9ob3RLZXlzOw0KKyAgQ0ZYX1JlY3RGQXJyYXkgbV9yZWN0QXJyYXk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMveG1sL2ZkZV94bWwuY3BwIGIveGZhL3NyYy9mZHAvc3JjL3htbC9mZGVfeG1sLmNwcAppbmRleCA2YTgxMThhLi5kYjFlOGZjIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZkcC9zcmMveG1sL2ZkZV94bWwuY3BwCisrKyBiL3hmYS9zcmMvZmRwL3NyYy94bWwvZmRlX3htbC5jcHAKQEAgLTksMjcwNSArOSwyNjUyIEBACiAjaWZkZWYgX19jcGx1c3BsdXMNCiBleHRlcm4gIkMiIHsNCiAjZW5kaWYNCi0jZGVmaW5lIEZERV9YTUxWQUxJRENIQVJSQU5HRU5VTQk1DQotc3RhdGljIEZYX1dDSEFSIGdfWE1MVmFsaWRDaGFyUmFuZ2VbRkRFX1hNTFZBTElEQ0hBUlJBTkdFTlVNXVsyXSA9IHt7MHgwOSwgMHgwOX0sIHsweDBBLCAweDBBfSwgezB4MEQsIDB4MER9LCB7MHgyMCwgMHhEN0ZGfSwgezB4RTAwMCwgMHhGRkZEfX07DQotRlhfQk9PTCBGREVfSXNYTUxWYWxpZENoYXIoRlhfV0NIQVIgY2gpDQotew0KLSAgICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBGREVfWE1MVkFMSURDSEFSUkFOR0VOVU0gLSAxLCBpTWlkOw0KLSAgICB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpIHsNCi0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgaWYgKGNoIDwgZ19YTUxWYWxpZENoYXJSYW5nZVtpTWlkXVswXSkgew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSBpZiAoY2ggPiBnX1hNTFZhbGlkQ2hhclJhbmdlW2lNaWRdWzFdKSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KKyNkZWZpbmUgRkRFX1hNTFZBTElEQ0hBUlJBTkdFTlVNIDUNCitzdGF0aWMgRlhfV0NIQVIgZ19YTUxWYWxpZENoYXJSYW5nZVtGREVfWE1MVkFMSURDSEFSUkFOR0VOVU1dWzJdID0gew0KKyAgICB7MHgwOSwgMHgwOX0sDQorICAgIHsweDBBLCAweDBBfSwNCisgICAgezB4MEQsIDB4MER9LA0KKyAgICB7MHgyMCwgMHhEN0ZGfSwNCisgICAgezB4RTAwMCwgMHhGRkZEfX07DQorRlhfQk9PTCBGREVfSXNYTUxWYWxpZENoYXIoRlhfV0NIQVIgY2gpIHsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IEZERV9YTUxWQUxJRENIQVJSQU5HRU5VTSAtIDEsIGlNaWQ7DQorICB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpIHsNCisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIGlmIChjaCA8IGdfWE1MVmFsaWRDaGFyUmFuZ2VbaU1pZF1bMF0pIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0gZWxzZSBpZiAoY2ggPiBnX1hNTFZhbGlkQ2hhclJhbmdlW2lNaWRdWzFdKSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MIEZERV9Jc1hNTFdoaXRlU3BhY2UoRlhfV0NIQVIgY2gpDQotew0KLSAgICByZXR1cm4gY2ggPT0gTCcgJyB8fCBjaCA9PSAweDBBIHx8IGNoID09IDB4MEQgfHwgY2ggPT0gMHgwOTsNCitGWF9CT09MIEZERV9Jc1hNTFdoaXRlU3BhY2UoRlhfV0NIQVIgY2gpIHsNCisgIHJldHVybiBjaCA9PSBMJyAnIHx8IGNoID09IDB4MEEgfHwgY2ggPT0gMHgwRCB8fCBjaCA9PSAweDA5Ow0KIH0NCiB0eXBlZGVmIHN0cnVjdCBfRkRFX1hNTE5BTUVDSEFSIHsNCi0gICAgRlhfV0NIQVIJd1N0YXJ0Ow0KLSAgICBGWF9XQ0hBUgl3RW5kOw0KLSAgICBGWF9CT09MCWJTdGFydENoYXI7DQorICBGWF9XQ0hBUiB3U3RhcnQ7DQorICBGWF9XQ0hBUiB3RW5kOw0KKyAgRlhfQk9PTCBiU3RhcnRDaGFyOw0KIH0gRkRFX1hNTE5BTUVDSEFSOw0KLSNkZWZpbmUgRkRFX1hNTE5BTUVDSEFSU05VTQkJMjANCisjZGVmaW5lIEZERV9YTUxOQU1FQ0hBUlNOVU0gMjANCiBzdGF0aWMgRkRFX1hNTE5BTUVDSEFSIGdfWE1MTmFtZUNoYXJzW0ZERV9YTUxOQU1FQ0hBUlNOVU1dID0gew0KLSAgICB7TCctJywgTCcuJywgRkFMU0V9LAkJe0wnMCcsIEwnOScsIEZBTFNFfSwJCXtMJzonLCBMJzonLCBGQUxTRX0sCQl7TCdBJywgTCdaJywgVFJVRX0sDQotICAgIHtMJ18nLCBMJ18nLCBUUlVFfSwJCQl7TCdhJywgTCd6JywgVFJVRX0sCQkJezB4QjcsIDB4QjcsIEZBTFNFfSwJCXsweEMwLCAweEQ2LCBUUlVFfSwNCi0gICAgezB4RDgsIDB4RjYsIFRSVUV9LAkJCXsweEY4LCAweDAyRkYsIFRSVUV9LAkJezB4MDMwMCwgMHgwMzZGLCBGQUxTRX0sCXsweDAzNzAsIDB4MDM3RCwgVFJVRX0sDQotICAgIHsweDAzN0YsIDB4MUZGRiwgVFJVRX0sCQl7MHgyMDBDLCAweDIwMEQsIFRSVUV9LAkJezB4MjAzRiwgMHgyMDQwLCBGQUxTRX0sCXsweDIwNzAsIDB4MjE4RiwgVFJVRX0sDQotICAgIHsweDJDMDAsIDB4MkZFRiwgVFJVRX0sCQl7MHgzMDAxLCAweEQ3RkYsIFRSVUV9LAkJezB4RjkwMCwgMHhGRENGLCBUUlVFfSwJCXsweEZERjAsIDB4RkZGRCwgVFJVRX0sDQorICAgIHtMJy0nLCBMJy4nLCBGQUxTRX0sICAgIHtMJzAnLCBMJzknLCBGQUxTRX0sICAgICB7TCc6JywgTCc6JywgRkFMU0V9LA0KKyAgICB7TCdBJywgTCdaJywgVFJVRX0sICAgICB7TCdfJywgTCdfJywgVFJVRX0sICAgICAge0wnYScsIEwneicsIFRSVUV9LA0KKyAgICB7MHhCNywgMHhCNywgRkFMU0V9LCAgICB7MHhDMCwgMHhENiwgVFJVRX0sICAgICAgezB4RDgsIDB4RjYsIFRSVUV9LA0KKyAgICB7MHhGOCwgMHgwMkZGLCBUUlVFfSwgICB7MHgwMzAwLCAweDAzNkYsIEZBTFNFfSwgezB4MDM3MCwgMHgwMzdELCBUUlVFfSwNCisgICAgezB4MDM3RiwgMHgxRkZGLCBUUlVFfSwgezB4MjAwQywgMHgyMDBELCBUUlVFfSwgIHsweDIwM0YsIDB4MjA0MCwgRkFMU0V9LA0KKyAgICB7MHgyMDcwLCAweDIxOEYsIFRSVUV9LCB7MHgyQzAwLCAweDJGRUYsIFRSVUV9LCAgezB4MzAwMSwgMHhEN0ZGLCBUUlVFfSwNCisgICAgezB4RjkwMCwgMHhGRENGLCBUUlVFfSwgezB4RkRGMCwgMHhGRkZELCBUUlVFfSwNCiB9Ow0KLUZYX0JPT0wgRkRFX0lzWE1MTmFtZUNoYXIoRlhfV0NIQVIgY2gsIEZYX0JPT0wgYkZpcnN0Q2hhcikNCi17DQotICAgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IEZERV9YTUxOQU1FQ0hBUlNOVU0gLSAxLCBpTWlkOw0KLSAgICB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpIHsNCi0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgaWYgKGNoIDwgZ19YTUxOYW1lQ2hhcnNbaU1pZF0ud1N0YXJ0KSB7DQotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA+IGdfWE1MTmFtZUNoYXJzW2lNaWRdLndFbmQpIHsNCi0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGJGaXJzdENoYXIpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdfWE1MTmFtZUNoYXJzW2lNaWRdLmJTdGFydENoYXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KK0ZYX0JPT0wgRkRFX0lzWE1MTmFtZUNoYXIoRlhfV0NIQVIgY2gsIEZYX0JPT0wgYkZpcnN0Q2hhcikgew0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gRkRFX1hNTE5BTUVDSEFSU05VTSAtIDEsIGlNaWQ7DQorICB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpIHsNCisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIGlmIChjaCA8IGdfWE1MTmFtZUNoYXJzW2lNaWRdLndTdGFydCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIGlmIChjaCA+IGdfWE1MTmFtZUNoYXJzW2lNaWRdLndFbmQpIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoYkZpcnN0Q2hhcikgew0KKyAgICAgICAgcmV0dXJuIGdfWE1MTmFtZUNoYXJzW2lNaWRdLmJTdGFydENoYXI7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBUUlVFOw0KICAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQogI2lmZGVmIF9fY3BsdXNwbHVzDQogfQ0KICNlbmRpZg0KIENGREVfWE1MTm9kZTo6Q0ZERV9YTUxOb2RlKCkNCi0gICAgOiBtX3BQYXJlbnQoTlVMTCkNCi0gICAgLCBtX3BDaGlsZChOVUxMKQ0KLSAgICAsIG1fcFByaW9yKE5VTEwpDQotICAgICwgbV9wTmV4dChOVUxMKQ0KLXsNCisgICAgOiBtX3BQYXJlbnQoTlVMTCksIG1fcENoaWxkKE5VTEwpLCBtX3BQcmlvcihOVUxMKSwgbV9wTmV4dChOVUxMKSB7fQ0KK0NGREVfWE1MTm9kZTo6fkNGREVfWE1MTm9kZSgpIHsNCisgIERlbGV0ZUNoaWxkcmVuKCk7DQogfQ0KLUNGREVfWE1MTm9kZTo6fkNGREVfWE1MTm9kZSgpDQotew0KLSAgICBEZWxldGVDaGlsZHJlbigpOw0KK3ZvaWQgQ0ZERV9YTUxOb2RlOjpEZWxldGVDaGlsZHJlbigpIHsNCisgIENGREVfWE1MTm9kZSAqcENoaWxkID0gbV9wQ2hpbGQsICpwVGVtcDsNCisgIHdoaWxlIChwQ2hpbGQgIT0gTlVMTCkgew0KKyAgICBwVGVtcCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgICAgcENoaWxkLT5SZWxlYXNlKCk7DQorICAgIHBDaGlsZCA9IHBUZW1wOw0KKyAgfQ0KKyAgbV9wQ2hpbGQgPSBOVUxMOw0KIH0NCi12b2lkIENGREVfWE1MTm9kZTo6RGVsZXRlQ2hpbGRyZW4oKQ0KLXsNCi0gICAgQ0ZERV9YTUxOb2RlICpwQ2hpbGQgPSBtX3BDaGlsZCwgKnBUZW1wOw0KLSAgICB3aGlsZSAocENoaWxkICE9IE5VTEwpIHsNCi0gICAgICAgIHBUZW1wID0gcENoaWxkLT5tX3BOZXh0Ow0KLSAgICAgICAgcENoaWxkLT5SZWxlYXNlKCk7DQotICAgICAgICBwQ2hpbGQgPSBwVGVtcDsNCitpbnQzMl90IENGREVfWE1MTm9kZTo6Q291bnRDaGlsZE5vZGVzKCkgY29uc3Qgew0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsNCisgIHdoaWxlIChwQ2hpbGQgIT0gTlVMTCkgew0KKyAgICBpQ291bnQrKzsNCisgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgfQ0KKyAgcmV0dXJuIGlDb3VudDsNCit9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTE5vZGU6OkdldENoaWxkTm9kZShpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICBDRkRFX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOw0KKyAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQorICAgIGlmIChpbmRleCA9PSAwKSB7DQorICAgICAgcmV0dXJuIHBDaGlsZDsNCiAgICAgfQ0KLSAgICBtX3BDaGlsZCA9IE5VTEw7DQorICAgIGluZGV4LS07DQorICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1pbnQzMl90IENGREVfWE1MTm9kZTo6Q291bnRDaGlsZE5vZGVzKCkgY29uc3QNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgQ0ZERV9YTUxOb2RlICpwQ2hpbGQgPSBtX3BDaGlsZDsNCi0gICAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQotICAgICAgICBpQ291bnQgKys7DQotICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7DQoraW50MzJfdCBDRkRFX1hNTE5vZGU6OkdldENoaWxkTm9kZUluZGV4KENGREVfWE1MTm9kZSogcE5vZGUpIGNvbnN0IHsNCisgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsNCisgIHdoaWxlIChwQ2hpbGQgIT0gTlVMTCkgew0KKyAgICBpZiAocENoaWxkID09IHBOb2RlKSB7DQorICAgICAgcmV0dXJuIGluZGV4Ow0KICAgICB9DQotICAgIHJldHVybiBpQ291bnQ7DQorICAgIGluZGV4Kys7DQorICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgIH0NCisgIHJldHVybiAtMTsNCiB9DQotQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTE5vZGU6OkdldENoaWxkTm9kZShpbnQzMl90IGluZGV4KSBjb25zdA0KLXsNCi0gICAgQ0ZERV9YTUxOb2RlICpwQ2hpbGQgPSBtX3BDaGlsZDsNCi0gICAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQotICAgICAgICBpZiAoaW5kZXggPT0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBwQ2hpbGQ7DQotICAgICAgICB9DQotICAgICAgICBpbmRleCAtLTsNCi0gICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCi0gICAgfQ0KK0NGREVfWE1MTm9kZSogQ0ZERV9YTUxOb2RlOjpHZXRQYXRoKGNvbnN0IEZYX1dDSEFSKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUXVhbGlmaWVkTmFtZSkgY29uc3Qgew0KKyAgRlhTWVNfYXNzZXJ0KHBQYXRoICE9IE5VTEwpOw0KKyAgaWYgKGlMZW5ndGggPCAwKSB7DQorICAgIGlMZW5ndGggPSBGWFNZU193Y3NsZW4ocFBhdGgpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPT0gMCkgew0KICAgICByZXR1cm4gTlVMTDsNCi19DQotaW50MzJfdCBDRkRFX1hNTE5vZGU6OkdldENoaWxkTm9kZUluZGV4KENGREVfWE1MTm9kZSAqcE5vZGUpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGluZGV4ID0gMDsNCi0gICAgQ0ZERV9YTUxOb2RlICpwQ2hpbGQgPSBtX3BDaGlsZDsNCi0gICAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQotICAgICAgICBpZiAocENoaWxkID09IHBOb2RlKSB7DQotICAgICAgICAgICAgcmV0dXJuIGluZGV4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgaW5kZXggKys7DQotICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7DQotICAgIH0NCi0gICAgcmV0dXJuIC0xOw0KLX0NCi1DRkRFX1hNTE5vZGUqIENGREVfWE1MTm9kZTo6R2V0UGF0aChjb25zdCBGWF9XQ0hBUiogcFBhdGgsIGludDMyX3QgaUxlbmd0aCwgRlhfQk9PTCBiUXVhbGlmaWVkTmFtZSkgY29uc3QNCi17DQotICAgIEZYU1lTX2Fzc2VydChwUGF0aCAhPSBOVUxMKTsNCi0gICAgaWYgKGlMZW5ndGggPCAwKSB7DQotICAgICAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBQYXRoKTsNCi0gICAgfQ0KLSAgICBpZiAoaUxlbmd0aCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyBjc1BhdGg7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBwUGF0aDsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBFbmQgPSBwUGF0aCArIGlMZW5ndGg7DQotICAgIEZYX1dDSEFSIGNoOw0KLSAgICB3aGlsZSAocFN0YXJ0IDwgcEVuZCkgew0KLSAgICAgICAgY2ggPSAqcFN0YXJ0ICsrOw0KLSAgICAgICAgaWYgKGNoID09IEwnLycpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgY3NQYXRoICs9IGNoOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlMZW5ndGggLT0gcFN0YXJ0IC0gcFBhdGg7DQotICAgIENGREVfWE1MTm9kZSAqcEZpbmQgPSBOVUxMOw0KLSAgICBpZiAoY3NQYXRoLkdldExlbmd0aCgpIDwgMSkgew0KLSAgICAgICAgcEZpbmQgPSBHZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlJvb3QpOw0KLSAgICB9IGVsc2UgaWYgKGNzUGF0aC5Db21wYXJlKEwiLi4iKSA9PSAwKSB7DQotICAgICAgICBwRmluZCA9IG1fcFBhcmVudDsNCi0gICAgfSBlbHNlIGlmIChjc1BhdGguQ29tcGFyZShMIi4iKSA9PSAwKSB7DQotICAgICAgICBwRmluZCA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyBjc1BhdGg7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gcFBhdGg7DQorICBjb25zdCBGWF9XQ0hBUiogcEVuZCA9IHBQYXRoICsgaUxlbmd0aDsNCisgIEZYX1dDSEFSIGNoOw0KKyAgd2hpbGUgKHBTdGFydCA8IHBFbmQpIHsNCisgICAgY2ggPSAqcFN0YXJ0Kys7DQorICAgIGlmIChjaCA9PSBMJy8nKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RhZzsNCi0gICAgICAgIENGREVfWE1MTm9kZSAqcE5vZGUgPSBtX3BDaGlsZDsNCi0gICAgICAgIHdoaWxlIChwTm9kZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgaWYgKHBOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBpZiAoYlF1YWxpZmllZE5hbWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPkdldFRhZ05hbWUod3NUYWcpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAod3NUYWcuQ29tcGFyZShjc1BhdGgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpTGVuZ3RoIDwgMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBGaW5kID0gcE5vZGU7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBGaW5kID0gcE5vZGUtPkdldFBhdGgocFN0YXJ0LCBpTGVuZ3RoLCBiUXVhbGlmaWVkTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAocEZpbmQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwRmluZDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5tX3BOZXh0Ow0KLSAgICAgICAgfQ0KKyAgICAgIGNzUGF0aCArPSBjaDsNCiAgICAgfQ0KLSAgICBpZiAocEZpbmQgPT0gTlVMTCB8fCBpTGVuZ3RoIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIHBGaW5kOw0KLSAgICB9DQotICAgIHJldHVybiBwRmluZC0+R2V0UGF0aChwU3RhcnQsIGlMZW5ndGgsIGJRdWFsaWZpZWROYW1lKTsNCi19DQotaW50MzJfdCBDRkRFX1hNTE5vZGU6Okluc2VydENoaWxkTm9kZShDRkRFX1hNTE5vZGUgKnBOb2RlLCBpbnQzMl90IGluZGV4KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBOb2RlICE9IE5VTEwpOw0KLSAgICBwTm9kZS0+bV9wUGFyZW50ID0gdGhpczsNCi0gICAgaWYgKG1fcENoaWxkID09IE5VTEwpIHsNCi0gICAgICAgIG1fcENoaWxkID0gcE5vZGU7DQotICAgICAgICBwTm9kZS0+bV9wUHJpb3IgPSBOVUxMOw0KLSAgICAgICAgcE5vZGUtPm1fcE5leHQgPSBOVUxMOw0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMCkgew0KLSAgICAgICAgcE5vZGUtPm1fcE5leHQgPSBtX3BDaGlsZDsNCi0gICAgICAgIHBOb2RlLT5tX3BQcmlvciA9IE5VTEw7DQotICAgICAgICBtX3BDaGlsZC0+bV9wUHJpb3IgPSBwTm9kZTsNCi0gICAgICAgIG1fcENoaWxkID0gcE5vZGU7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIENGREVfWE1MTm9kZSAqcEZpbmQgPSBtX3BDaGlsZDsNCi0gICAgd2hpbGUgKCsraUNvdW50ICE9IGluZGV4ICYmIHBGaW5kLT5tX3BOZXh0ICE9IE5VTEwpIHsNCi0gICAgICAgIHBGaW5kID0gcEZpbmQtPm1fcE5leHQ7DQotICAgIH0NCi0gICAgcE5vZGUtPm1fcFByaW9yID0gcEZpbmQ7DQotICAgIHBOb2RlLT5tX3BOZXh0ID0gcEZpbmQtPm1fcE5leHQ7DQotICAgIGlmIChwRmluZC0+bV9wTmV4dCAhPSBOVUxMKSB7DQotICAgICAgICBwRmluZC0+bV9wTmV4dC0+bV9wUHJpb3IgPSBwTm9kZTsNCi0gICAgfQ0KLSAgICBwRmluZC0+bV9wTmV4dCA9IHBOb2RlOw0KLSAgICByZXR1cm4gaUNvdW50Ow0KLX0NCi12b2lkIENGREVfWE1MTm9kZTo6UmVtb3ZlQ2hpbGROb2RlKENGREVfWE1MTm9kZSAqcE5vZGUpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wQ2hpbGQgIT0gTlVMTCAmJiBwTm9kZSAhPSBOVUxMKTsNCi0gICAgaWYgKG1fcENoaWxkID09IHBOb2RlKSB7DQotICAgICAgICBtX3BDaGlsZCA9IHBOb2RlLT5tX3BOZXh0Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcE5vZGUtPm1fcFByaW9yLT5tX3BOZXh0ID0gcE5vZGUtPm1fcE5leHQ7DQotICAgIH0NCi0gICAgaWYgKHBOb2RlLT5tX3BOZXh0ICE9IE5VTEwpIHsNCi0gICAgICAgIHBOb2RlLT5tX3BOZXh0LT5tX3BQcmlvciA9IHBOb2RlLT5tX3BQcmlvcjsNCi0gICAgfQ0KLSAgICBwTm9kZS0+bV9wUGFyZW50ID0gTlVMTDsNCi0gICAgcE5vZGUtPm1fcE5leHQgPSBOVUxMOw0KLSAgICBwTm9kZS0+bV9wUHJpb3IgPSBOVUxMOw0KLX0NCi1DRkRFX1hNTE5vZGUqIENGREVfWE1MTm9kZTo6R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSkgY29uc3QNCi17DQotICAgIHN3aXRjaCAoZUl0ZW0pIHsNCi0gICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpSb290OiB7DQotICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSAqcFBhcmVudCA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQotICAgICAgICAgICAgICAgIHdoaWxlIChwUGFyZW50LT5tX3BQYXJlbnQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPm1fcFBhcmVudDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gcFBhcmVudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIElGREVfWE1MTm9kZTo6UGFyZW50Og0KLSAgICAgICAgICAgIHJldHVybiBtX3BQYXJlbnQ7DQotICAgICAgICBjYXNlIElGREVfWE1MTm9kZTo6Rmlyc3RTaWJsaW5nOiB7DQotICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSAqcEl0ZW0gPSAoQ0ZERV9YTUxOb2RlKil0aGlzOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAocEl0ZW0tPm1fcFByaW9yICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcFByaW9yOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBwSXRlbSA9PSAoQ0ZERV9YTUxOb2RlKil0aGlzID8gTlVMTCA6IHBJdGVtOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpQcmlvclNpYmxpbmc6DQotICAgICAgICAgICAgcmV0dXJuIG1fcFByaW9yOw0KLSAgICAgICAgY2FzZSBJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nOg0KLSAgICAgICAgICAgIHJldHVybiBtX3BOZXh0Ow0KLSAgICAgICAgY2FzZSBJRkRFX1hNTE5vZGU6Okxhc3RTaWJsaW5nOiB7DQotICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSAqcEl0ZW0gPSAoQ0ZERV9YTUxOb2RlKil0aGlzOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAocEl0ZW0tPm1fcE5leHQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wTmV4dDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gcEl0ZW0gPT0gKENGREVfWE1MTm9kZSopdGhpcyA/IE5VTEwgOiBwSXRlbTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIElGREVfWE1MTm9kZTo6Rmlyc3ROZWlnaGJvcjogew0KLSAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUgKnBQYXJlbnQgPSAoQ0ZERV9YTUxOb2RlKil0aGlzOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAocFBhcmVudC0+bV9wUGFyZW50ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5tX3BQYXJlbnQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBQYXJlbnQgPT0gKENGREVfWE1MTm9kZSopdGhpcyA/IE5VTEwgOiBwUGFyZW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpQcmlvck5laWdoYm9yOiB7DQotICAgICAgICAgICAgICAgIGlmIChtX3BQcmlvciA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9wUGFyZW50Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSAqcEl0ZW0gPSBtX3BQcmlvcjsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKENGREVfWE1MTm9kZSAqcFRlbXAgPSBwSXRlbS0+bV9wQ2hpbGQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBJdGVtID0gcFRlbXA7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHBUZW1wID0gcEl0ZW0tPm1fcE5leHQpICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBUZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBwSXRlbTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIElGREVfWE1MTm9kZTo6TmV4dE5laWdoYm9yOiB7DQotICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9wQ2hpbGQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKG1fcE5leHQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcE5leHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlICpwSXRlbSA9IG1fcFBhcmVudDsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKHBJdGVtICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwSXRlbS0+bV9wTmV4dCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBJdGVtLT5tX3BOZXh0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wUGFyZW50Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpMYXN0TmVpZ2hib3I6IHsNCi0gICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlICpwSXRlbSA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQotICAgICAgICAgICAgICAgIHdoaWxlIChwSXRlbS0+bV9wUGFyZW50ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcFBhcmVudDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB3aGlsZSAoVFJVRSkgew0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBJdGVtLT5tX3BOZXh0ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVtLT5tX3BDaGlsZCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BDaGlsZDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gcEl0ZW0gPT0gKENGREVfWE1MTm9kZSopdGhpcyA/IE5VTEwgOiBwSXRlbTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZDoNCi0gICAgICAgICAgICByZXR1cm4gbV9wQ2hpbGQ7DQotICAgICAgICBjYXNlIElGREVfWE1MTm9kZTo6TGFzdENoaWxkOiB7DQotICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUgKnBDaGlsZCA9IG1fcENoaWxkOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAocENoaWxkLT5tX3BOZXh0ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gcENoaWxkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLWludDMyX3QgQ0ZERV9YTUxOb2RlOjpHZXROb2RlTGV2ZWwoKSBjb25zdA0KLXsNCi0gICAgaW50MzJfdCBpTGV2ZWwgPSAwOw0KLSAgICBDRkRFX1hNTE5vZGUgKnBJdGVtID0gKENGREVfWE1MTm9kZSopdGhpczsNCi0gICAgd2hpbGUgKChwSXRlbSA9IHBJdGVtLT5tX3BQYXJlbnQpICE9IE5VTEwpIHsNCi0gICAgICAgIGlMZXZlbCArKzsNCi0gICAgfQ0KLSAgICByZXR1cm4gaUxldmVsOw0KLX0NCi1GWF9CT09MIENGREVfWE1MTm9kZTo6SW5zZXJ0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSwgQ0ZERV9YTUxOb2RlICpwTm9kZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwTm9kZSAhPSBOVUxMKTsNCi0gICAgc3dpdGNoIChlSXRlbSkgew0KLSAgICAgICAgY2FzZSBJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nOiB7DQotICAgICAgICAgICAgICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBtX3BQYXJlbnQ7DQotICAgICAgICAgICAgICAgIHBOb2RlLT5tX3BOZXh0ID0gbV9wTmV4dDsNCi0gICAgICAgICAgICAgICAgcE5vZGUtPm1fcFByaW9yID0gdGhpczsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcE5leHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcE5leHQtPm1fcFByaW9yID0gcE5vZGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9wTmV4dCA9IHBOb2RlOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIElGREVfWE1MTm9kZTo6UHJpb3JTaWJsaW5nOiB7DQotICAgICAgICAgICAgICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBtX3BQYXJlbnQ7DQotICAgICAgICAgICAgICAgIHBOb2RlLT5tX3BOZXh0ID0gdGhpczsNCi0gICAgICAgICAgICAgICAgcE5vZGUtPm1fcFByaW9yID0gbV9wUHJpb3I7DQotICAgICAgICAgICAgICAgIGlmIChtX3BQcmlvcikgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wUHJpb3ItPm1fcE5leHQgPSBwTm9kZTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX3BQYXJlbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcFBhcmVudC0+bV9wQ2hpbGQgPSBwTm9kZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BQcmlvciA9IHBOb2RlOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUNGREVfWE1MTm9kZSogQ0ZERV9YTUxOb2RlOjpSZW1vdmVOb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtKQ0KLXsNCi0gICAgQ0ZERV9YTUxOb2RlKiBwTm9kZSA9IE5VTEw7DQotICAgIHN3aXRjaCAoZUl0ZW0pIHsNCi0gICAgICAgIGNhc2UgSUZERV9YTUxOb2RlOjpOZXh0U2libGluZzoNCi0gICAgICAgICAgICBpZiAobV9wTmV4dCkgew0KLSAgICAgICAgICAgICAgICBwTm9kZSA9IG1fcE5leHQ7DQotICAgICAgICAgICAgICAgIG1fcE5leHQgPSBwTm9kZS0+bV9wTmV4dDsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcE5leHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcE5leHQtPm1fcFByaW9yID0gdGhpczsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwTm9kZS0+bV9wUGFyZW50ID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgcE5vZGUtPm1fcE5leHQgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBwTm9kZS0+bV9wUHJpb3IgPSBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgcmV0dXJuIHBOb2RlOw0KLX0NCi1DRkRFX1hNTE5vZGUqIENGREVfWE1MTm9kZTo6Q2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLXZvaWQgIENGREVfWE1MTm9kZTo6U2F2ZVhNTE5vZGUoSUZYX1N0cmVhbSAqcFhNTFN0cmVhbSkNCi17DQotICAgIENGREVfWE1MTm9kZSAqcE5vZGUgPSAoQ0ZERV9YTUxOb2RlKil0aGlzOw0KLSAgICBGWFNZU19hc3NlcnQocFhNTFN0cmVhbSAhPSBOVUxMICYmIHBOb2RlICE9IE5VTEwpOw0KLSAgICBzd2l0Y2ggKHBOb2RlLT5HZXRUeXBlKCkpIHsNCi0gICAgICAgIGNhc2UgRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb246IHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3M7DQotICAgICAgICAgICAgICAgIENGREVfWE1MSW5zdHJ1Y3Rpb24gKnBJbnN0cnVjdGlvbiA9IChDRkRFX1hNTEluc3RydWN0aW9uKilwTm9kZTsNCi0gICAgICAgICAgICAgICAgaWYgKHBJbnN0cnVjdGlvbi0+bV93c1RhcmdldC5Db21wYXJlTm9DYXNlKEwieG1sIikgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgd3MgPSBMIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiI7DQotICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IHBYTUxTdHJlYW0tPkdldENvZGVQYWdlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAod0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2TEUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3cyArPSBMIlVURi0xNiI7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEYxNkJFKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCJVVEYtMTZiZSI7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiVVRGLTgiOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCJcIj8+IjsNCi0gICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB3cy5Gb3JtYXQoTCI8PyVzIiwgKGNvbnN0IEZYX1dDSEFSKilwSW5zdHJ1Y3Rpb24tPm1fd3NUYXJnZXQpOw0KLSAgICAgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgJmF0dHJpYnV0ZXMgPSBwSW5zdHJ1Y3Rpb24tPm1fQXR0cmlidXRlczsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaSwgaUNvdW50ID0gYXR0cmlidXRlcy5HZXRTaXplKCk7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3MgPSBMIiAiOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IGF0dHJpYnV0ZXNbaV07DQotICAgICAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCI9XCIiOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgPSBhdHRyaWJ1dGVzW2kgKyAxXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCImIiwgTCImYW1wOyIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCciLCBMIiZhcG9zOyIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3cyArPSB3c1ZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiXCIiOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5ICZ0YXJnZXRkYXRhID0gcEluc3RydWN0aW9uLT5tX1RhcmdldERhdGE7DQotICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSB0YXJnZXRkYXRhLkdldFNpemUoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzID0gTCIgXCIiOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IHRhcmdldGRhdGFbaV07DQotICAgICAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCJcIiI7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHdzID0gTCI/PiI7DQotICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KLSAgICAgICAgICAgICAgICB3cyA9IEwiPCI7DQotICAgICAgICAgICAgICAgIHdzICs9ICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPm1fd3NUYWc7DQotICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgJmF0dHJpYnV0ZXMgPSAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5tX0F0dHJpYnV0ZXM7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gYXR0cmlidXRlcy5HZXRTaXplKCk7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQotICAgICAgICAgICAgICAgICAgICB3cyA9IEwiICI7DQotICAgICAgICAgICAgICAgICAgICB3cyArPSBhdHRyaWJ1dGVzW2ldOw0KLSAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCI9XCIiOw0KLSAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZSA9IGF0dHJpYnV0ZXNbaSArIDFdOw0KLSAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiJiIsIEwiJmFtcDsiKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIj4iLCBMIiZndDsiKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwnIiwgTCImYXBvczsiKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzICs9IHdzVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICB3cyArPSBMIlwiIjsNCi0gICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHBOb2RlLT5tX3BDaGlsZCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICB3cyA9IEwiXG4vPiI7DQotICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgd3MgPSBMIlxuPiI7DQotICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlICpwQ2hpbGQgPSBwTm9kZS0+bV9wQ2hpbGQ7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocENoaWxkICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hpbGQtPlNhdmVYTUxOb2RlKHBYTUxTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHdzID0gTCI8LyI7DQotICAgICAgICAgICAgICAgICAgICB3cyArPSAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5tX3dzVGFnOw0KLSAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCJcbj4iOw0KLSAgICAgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3cyA9ICgoQ0ZERV9YTUxUZXh0KilwTm9kZSktPm1fd3NUZXh0Ow0KLSAgICAgICAgICAgICAgICB3cy5SZXBsYWNlKEwiJiIsIEwiJmFtcDsiKTsNCi0gICAgICAgICAgICAgICAgd3MuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsNCi0gICAgICAgICAgICAgICAgd3MuUmVwbGFjZShMIj4iLCBMIiZndDsiKTsNCi0gICAgICAgICAgICAgICAgd3MuUmVwbGFjZShMIlwnIiwgTCImYXBvczsiKTsNCi0gICAgICAgICAgICAgICAgd3MuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsNCi0gICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOiB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzID0gTCI8IVtDREFUQVsiOw0KLSAgICAgICAgICAgICAgICB3cyArPSAoKENGREVfWE1MQ2hhckRhdGEqKXBOb2RlKS0+bV93c0NoYXJEYXRhOw0KLSAgICAgICAgICAgICAgICB3cyArPSBMIl1dPiI7DQotICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9Vbmtub3duOg0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLX0NCi12b2lkIENGREVfWE1MTm9kZTo6Q2xvbmVDaGlsZHJlbihDRkRFX1hNTE5vZGUqIHBDbG9uZSkNCi17DQotICAgIGlmICghbV9wQ2hpbGQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRkRFX1hNTE5vZGUqIHBOZXh0ID0gbV9wQ2hpbGQ7DQotICAgIENGREVfWE1MTm9kZSogcENsb25lTmV4dCA9IHBOZXh0LT5DbG9uZShUUlVFKTsNCi0gICAgcENsb25lLT5JbnNlcnRDaGlsZE5vZGUocENsb25lTmV4dCk7DQotICAgIHBOZXh0ID0gcE5leHQtPm1fcE5leHQ7DQotICAgIHdoaWxlIChwTmV4dCkgew0KLSAgICAgICAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBwTmV4dC0+Q2xvbmUoVFJVRSk7DQotICAgICAgICBwQ2xvbmVOZXh0LT5JbnNlcnROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nLCBwQ2hpbGQpOw0KLSAgICAgICAgcENsb25lTmV4dCA9IHBDaGlsZDsNCi0gICAgICAgIHBOZXh0ID0gcE5leHQtPm1fcE5leHQ7DQotICAgIH0NCi19DQotSUZERV9YTUxJbnN0cnVjdGlvbiogSUZERV9YTUxJbnN0cnVjdGlvbjo6Q3JlYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCkNCi17DQotICAgIHJldHVybiAoSUZERV9YTUxJbnN0cnVjdGlvbiopbmV3IENGREVfWE1MSW5zdHJ1Y3Rpb24od3NUYXJnZXQpOw0KLX0NCi1DRkRFX1hNTEluc3RydWN0aW9uOjpDRkRFX1hNTEluc3RydWN0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCkNCi0gICAgOiBDRkRFX1hNTE5vZGUoKQ0KLSAgICAsIG1fd3NUYXJnZXQod3NUYXJnZXQpDQotICAgICwgbV9UYXJnZXREYXRhKCkNCi0gICAgLCBtX0F0dHJpYnV0ZXMoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fd3NUYXJnZXQuR2V0TGVuZ3RoKCkgPiAwKTsNCi19DQotQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTEluc3RydWN0aW9uOjpDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpDQotew0KLSAgICBDRkRFX1hNTEluc3RydWN0aW9uKiBwQ2xvbmUgPSBuZXcgQ0ZERV9YTUxJbnN0cnVjdGlvbihtX3dzVGFyZ2V0KTsNCi0gICAgaWYgKCFwQ2xvbmUpIHsNCi0gICAgICAgIHJldHVybiBwQ2xvbmU7DQotICAgIH0NCi0gICAgcENsb25lLT5tX0F0dHJpYnV0ZXMuQ29weShtX0F0dHJpYnV0ZXMpOw0KLSAgICBwQ2xvbmUtPm1fVGFyZ2V0RGF0YS5Db3B5KG1fVGFyZ2V0RGF0YSk7DQotICAgIGlmIChiUmVjdXJzaXZlKSB7DQotICAgICAgICBDbG9uZUNoaWxkcmVuKHBDbG9uZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBDbG9uZTsNCi19DQotaW50MzJfdCBDRkRFX1hNTEluc3RydWN0aW9uOjpDb3VudEF0dHJpYnV0ZXMoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fQXR0cmlidXRlcy5HZXRTaXplKCkgLyAyOw0KLX0NCi1GWF9CT09MIENGREVfWE1MSW5zdHJ1Y3Rpb246OkdldEF0dHJpYnV0ZShpbnQzMl90IGluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaU5hbWUsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQotICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgaUNvdW50IC8gMik7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQotICAgICAgICBpZiAoaW5kZXggPT0gMCkgew0KLSAgICAgICAgICAgIHdzQXR0cmlOYW1lID0gbV9BdHRyaWJ1dGVzW2ldOw0KLSAgICAgICAgICAgIHdzQXR0cmlWYWx1ZSA9IG1fQXR0cmlidXRlc1tpICsgMV07DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBpbmRleCAtLTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6SGFzQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQotICAgICAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi12b2lkIENGREVfWE1MSW5zdHJ1Y3Rpb246OkdldFN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlLCBjb25zdCBGWF9XQ0hBUiogcHdzRGVmVmFsdWUpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQotICAgICAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQotICAgICAgICAgICAgd3NBdHRyaVZhbHVlID0gbV9BdHRyaWJ1dGVzW2kgKyAxXTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgIH0NCi0gICAgd3NBdHRyaVZhbHVlID0gcHdzRGVmVmFsdWU7DQotfQ0KLXZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6U2V0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpTmFtZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydCh3c0F0dHJpTmFtZS5HZXRMZW5ndGgoKSA+IDApOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQotICAgICAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUod3NBdHRyaU5hbWUpID09IDApIHsNCi0gICAgICAgICAgICBtX0F0dHJpYnV0ZXNbaV0gPSB3c0F0dHJpTmFtZTsNCi0gICAgICAgICAgICBtX0F0dHJpYnV0ZXNbaSArIDFdID0gd3NBdHRyaVZhbHVlOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX0F0dHJpYnV0ZXMuQWRkKHdzQXR0cmlOYW1lKTsNCi0gICAgbV9BdHRyaWJ1dGVzLkFkZCh3c0F0dHJpVmFsdWUpOw0KLX0NCi1pbnQzMl90IENGREVfWE1MSW5zdHJ1Y3Rpb246OkdldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgaW50MzJfdCBpRGVmVmFsdWUpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQotICAgICAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZYU1lTX3d0b2koKGNvbnN0IEZYX1dDSEFSKiltX0F0dHJpYnV0ZXNbaSArIDFdKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaURlZlZhbHVlOw0KLX0NCi12b2lkIENGREVfWE1MSW5zdHJ1Y3Rpb246OlNldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgaW50MzJfdCBpQXR0cmlWYWx1ZSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgIHdzVmFsdWUuRm9ybWF0KEwiJWQiLCBpQXR0cmlWYWx1ZSk7DQotICAgIFNldFN0cmluZyhwd3NBdHRyaU5hbWUsIHdzVmFsdWUpOw0KLX0NCi1GWF9GTE9BVCBDRkRFX1hNTEluc3RydWN0aW9uOjpHZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmRGVmVmFsdWUpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQotICAgICAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZYX3djc3RvZigoY29uc3QgRlhfV0NIQVIqKW1fQXR0cmlidXRlc1tpICsgMV0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBmRGVmVmFsdWU7DQotfQ0KLXZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6U2V0RmxvYXQoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkF0dHJpVmFsdWUpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICB3c1ZhbHVlLkZvcm1hdChMIiVmIiwgZkF0dHJpVmFsdWUpOw0KLSAgICBTZXRTdHJpbmcocHdzQXR0cmlOYW1lLCB3c1ZhbHVlKTsNCi19DQotdm9pZCBDRkRFX1hNTEluc3RydWN0aW9uOjpSZW1vdmVBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCi0gICAgICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCi0gICAgICAgICAgICBtX0F0dHJpYnV0ZXMuUmVtb3ZlQXQoaSArIDEpOw0KLSAgICAgICAgICAgIG1fQXR0cmlidXRlcy5SZW1vdmVBdChpKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgIH0NCi19DQotaW50MzJfdCBDRkRFX1hNTEluc3RydWN0aW9uOjpDb3VudERhdGEoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fVGFyZ2V0RGF0YS5HZXRTaXplKCk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6R2V0RGF0YShpbnQzMl90IGluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NEYXRhKSBjb25zdA0KLXsNCi0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX1RhcmdldERhdGEuR2V0U2l6ZSgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgd3NEYXRhID0gbV9UYXJnZXREYXRhW2luZGV4XTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6QXBwZW5kRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NEYXRhKQ0KLXsNCi0gICAgbV9UYXJnZXREYXRhLkFkZCh3c0RhdGEpOw0KLX0NCi12b2lkIENGREVfWE1MSW5zdHJ1Y3Rpb246OlJlbW92ZURhdGEoaW50MzJfdCBpbmRleCkNCi17DQotICAgIG1fVGFyZ2V0RGF0YS5SZW1vdmVBdChpbmRleCk7DQotfQ0KLUlGREVfWE1MRWxlbWVudCogSUZERV9YTUxFbGVtZW50OjpDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKQ0KLXsNCi0gICAgcmV0dXJuIChJRkRFX1hNTEVsZW1lbnQqKW5ldyBDRkRFX1hNTEVsZW1lbnQod3NUYWcpOw0KLX0NCi1DRkRFX1hNTEVsZW1lbnQ6OkNGREVfWE1MRWxlbWVudChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUYWcpDQotICAgIDogQ0ZERV9YTUxOb2RlKCkNCi0gICAgLCBtX3dzVGFnKHdzVGFnKQ0KLSAgICAsIG1fQXR0cmlidXRlcygpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV93c1RhZy5HZXRMZW5ndGgoKSA+IDApOw0KLX0NCi1DRkRFX1hNTEVsZW1lbnQ6On5DRkRFX1hNTEVsZW1lbnQoKQ0KLXsNCi0gICAgbV9BdHRyaWJ1dGVzLlJlbW92ZUFsbCgpOw0KLX0NCi1DRkRFX1hNTE5vZGUqIENGREVfWE1MRWxlbWVudDo6Q2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKQ0KLXsNCi0gICAgQ0ZERV9YTUxFbGVtZW50KiBwQ2xvbmUgPSBuZXcgQ0ZERV9YTUxFbGVtZW50KG1fd3NUYWcpOw0KLSAgICBpZiAoIXBDbG9uZSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcENsb25lLT5tX0F0dHJpYnV0ZXMuQ29weShtX0F0dHJpYnV0ZXMpOw0KLSAgICBpZiAoYlJlY3Vyc2l2ZSkgew0KLSAgICAgICAgQ2xvbmVDaGlsZHJlbihwQ2xvbmUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgQ0ZERV9YTUxOb2RlICpwQ2hpbGQgPSBtX3BDaGlsZDsNCi0gICAgICAgIHdoaWxlIChwQ2hpbGQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIHN3aXRjaCAocENoaWxkLT5HZXRUeXBlKCkpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0Og0KLSAgICAgICAgICAgICAgICAgICAgd3NUZXh0ICs9ICgoQ0ZERV9YTUxUZXh0KilwQ2hpbGQpLT5tX3dzVGV4dDsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCi0gICAgICAgIH0NCi0gICAgICAgIHBDbG9uZS0+U2V0VGV4dERhdGEod3NUZXh0KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcENsb25lOw0KLX0NCi12b2lkIENGREVfWE1MRWxlbWVudDo6R2V0VGFnTmFtZShDRlhfV2lkZVN0cmluZyAmd3NUYWcpIGNvbnN0DQotew0KLSAgICB3c1RhZyA9IG1fd3NUYWc7DQotfQ0KLXZvaWQgQ0ZERV9YTUxFbGVtZW50OjpHZXRMb2NhbFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKSBjb25zdA0KLXsNCi0gICAgRlhfU1RSU0laRSBpRmluZCA9IG1fd3NUYWcuRmluZChMJzonLCAwKTsNCi0gICAgaWYgKGlGaW5kIDwgMCkgew0KLSAgICAgICAgd3NUYWcgPSBtX3dzVGFnOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgd3NUYWcgPSBtX3dzVGFnLlJpZ2h0KG1fd3NUYWcuR2V0TGVuZ3RoKCkgLSBpRmluZCAtIDEpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZERV9YTUxFbGVtZW50OjpHZXROYW1lc3BhY2VQcmVmaXgoQ0ZYX1dpZGVTdHJpbmcgJndzUHJlZml4KSBjb25zdA0KLXsNCi0gICAgRlhfU1RSU0laRSBpRmluZCA9IG1fd3NUYWcuRmluZChMJzonLCAwKTsNCi0gICAgaWYgKGlGaW5kIDwgMCkgew0KLSAgICAgICAgd3NQcmVmaXguRW1wdHkoKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHdzUHJlZml4ID0gbV93c1RhZy5MZWZ0KGlGaW5kKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGREVfWE1MRWxlbWVudDo6R2V0TmFtZXNwYWNlVVJJKENGWF9XaWRlU3RyaW5nICZ3c05hbWVzcGFjZSkgY29uc3QNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmkoTCJ4bWxucyIpLCB3c1ByZWZpeDsNCi0gICAgR2V0TmFtZXNwYWNlUHJlZml4KHdzUHJlZml4KTsNCi0gICAgaWYgKHdzUHJlZml4LkdldExlbmd0aCgpID4gMCkgew0KLSAgICAgICAgd3NBdHRyaSArPSBMIjoiOw0KLSAgICAgICAgd3NBdHRyaSArPSB3c1ByZWZpeDsNCi0gICAgfQ0KLSAgICB3c05hbWVzcGFjZS5FbXB0eSgpOw0KLSAgICBDRkRFX1hNTE5vZGUgKnBOb2RlID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgIH0NCisgIGlMZW5ndGggLT0gcFN0YXJ0IC0gcFBhdGg7DQorICBDRkRFX1hNTE5vZGUqIHBGaW5kID0gTlVMTDsNCisgIGlmIChjc1BhdGguR2V0TGVuZ3RoKCkgPCAxKSB7DQorICAgIHBGaW5kID0gR2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpSb290KTsNCisgIH0gZWxzZSBpZiAoY3NQYXRoLkNvbXBhcmUoTCIuLiIpID09IDApIHsNCisgICAgcEZpbmQgPSBtX3BQYXJlbnQ7DQorICB9IGVsc2UgaWYgKGNzUGF0aC5Db21wYXJlKEwiLiIpID09IDApIHsNCisgICAgcEZpbmQgPSAoQ0ZERV9YTUxOb2RlKil0aGlzOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWc7DQorICAgIENGREVfWE1MTm9kZSogcE5vZGUgPSBtX3BDaGlsZDsNCiAgICAgd2hpbGUgKHBOb2RlICE9IE5VTEwpIHsNCi0gICAgICAgIGlmIChwTm9kZS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCi0gICAgICAgICAgICBicmVhazsNCisgICAgICBpZiAocE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICBpZiAoYlF1YWxpZmllZE5hbWUpIHsNCisgICAgICAgICAgKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+R2V0VGFnTmFtZSh3c1RhZyk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5HZXRMb2NhbFRhZ05hbWUod3NUYWcpOw0KICAgICAgICAgfQ0KLSAgICAgICAgQ0ZERV9YTUxFbGVtZW50ICpwRWxlbWVudCA9IChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlOw0KLSAgICAgICAgaWYgKCFwRWxlbWVudC0+SGFzQXR0cmlidXRlKHdzQXR0cmkpKSB7DQotICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgaWYgKHdzVGFnLkNvbXBhcmUoY3NQYXRoKSA9PSAwKSB7DQorICAgICAgICAgIGlmIChpTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgICAgIHBGaW5kID0gcE5vZGU7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcEZpbmQgPSBwTm9kZS0+R2V0UGF0aChwU3RhcnQsIGlMZW5ndGgsIGJRdWFsaWZpZWROYW1lKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocEZpbmQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybiBwRmluZDsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgcEVsZW1lbnQtPkdldFN0cmluZyh3c0F0dHJpLCB3c05hbWVzcGFjZSk7DQorICAgICAgfQ0KKyAgICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHQ7DQorICAgIH0NCisgIH0NCisgIGlmIChwRmluZCA9PSBOVUxMIHx8IGlMZW5ndGggPCAxKSB7DQorICAgIHJldHVybiBwRmluZDsNCisgIH0NCisgIHJldHVybiBwRmluZC0+R2V0UGF0aChwU3RhcnQsIGlMZW5ndGgsIGJRdWFsaWZpZWROYW1lKTsNCit9DQoraW50MzJfdCBDRkRFX1hNTE5vZGU6Okluc2VydENoaWxkTm9kZShDRkRFX1hNTE5vZGUqIHBOb2RlLCBpbnQzMl90IGluZGV4KSB7DQorICBGWFNZU19hc3NlcnQocE5vZGUgIT0gTlVMTCk7DQorICBwTm9kZS0+bV9wUGFyZW50ID0gdGhpczsNCisgIGlmIChtX3BDaGlsZCA9PSBOVUxMKSB7DQorICAgIG1fcENoaWxkID0gcE5vZGU7DQorICAgIHBOb2RlLT5tX3BQcmlvciA9IE5VTEw7DQorICAgIHBOb2RlLT5tX3BOZXh0ID0gTlVMTDsNCisgICAgcmV0dXJuIDA7DQorICB9IGVsc2UgaWYgKGluZGV4ID09IDApIHsNCisgICAgcE5vZGUtPm1fcE5leHQgPSBtX3BDaGlsZDsNCisgICAgcE5vZGUtPm1fcFByaW9yID0gTlVMTDsNCisgICAgbV9wQ2hpbGQtPm1fcFByaW9yID0gcE5vZGU7DQorICAgIG1fcENoaWxkID0gcE5vZGU7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgQ0ZERV9YTUxOb2RlKiBwRmluZCA9IG1fcENoaWxkOw0KKyAgd2hpbGUgKCsraUNvdW50ICE9IGluZGV4ICYmIHBGaW5kLT5tX3BOZXh0ICE9IE5VTEwpIHsNCisgICAgcEZpbmQgPSBwRmluZC0+bV9wTmV4dDsNCisgIH0NCisgIHBOb2RlLT5tX3BQcmlvciA9IHBGaW5kOw0KKyAgcE5vZGUtPm1fcE5leHQgPSBwRmluZC0+bV9wTmV4dDsNCisgIGlmIChwRmluZC0+bV9wTmV4dCAhPSBOVUxMKSB7DQorICAgIHBGaW5kLT5tX3BOZXh0LT5tX3BQcmlvciA9IHBOb2RlOw0KKyAgfQ0KKyAgcEZpbmQtPm1fcE5leHQgPSBwTm9kZTsNCisgIHJldHVybiBpQ291bnQ7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxOb2RlOjpSZW1vdmVDaGlsZE5vZGUoQ0ZERV9YTUxOb2RlKiBwTm9kZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcENoaWxkICE9IE5VTEwgJiYgcE5vZGUgIT0gTlVMTCk7DQorICBpZiAobV9wQ2hpbGQgPT0gcE5vZGUpIHsNCisgICAgbV9wQ2hpbGQgPSBwTm9kZS0+bV9wTmV4dDsNCisgIH0gZWxzZSB7DQorICAgIHBOb2RlLT5tX3BQcmlvci0+bV9wTmV4dCA9IHBOb2RlLT5tX3BOZXh0Ow0KKyAgfQ0KKyAgaWYgKHBOb2RlLT5tX3BOZXh0ICE9IE5VTEwpIHsNCisgICAgcE5vZGUtPm1fcE5leHQtPm1fcFByaW9yID0gcE5vZGUtPm1fcFByaW9yOw0KKyAgfQ0KKyAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQorICBwTm9kZS0+bV9wTmV4dCA9IE5VTEw7DQorICBwTm9kZS0+bV9wUHJpb3IgPSBOVUxMOw0KK30NCitDRkRFX1hNTE5vZGUqIENGREVfWE1MTm9kZTo6R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSkgY29uc3Qgew0KKyAgc3dpdGNoIChlSXRlbSkgew0KKyAgICBjYXNlIElGREVfWE1MTm9kZTo6Um9vdDogew0KKyAgICAgIENGREVfWE1MTm9kZSogcFBhcmVudCA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQorICAgICAgd2hpbGUgKHBQYXJlbnQtPm1fcFBhcmVudCAhPSBOVUxMKSB7DQorICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+bV9wUGFyZW50Ow0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcFBhcmVudDsNCisgICAgfQ0KKyAgICBjYXNlIElGREVfWE1MTm9kZTo6UGFyZW50Og0KKyAgICAgIHJldHVybiBtX3BQYXJlbnQ7DQorICAgIGNhc2UgSUZERV9YTUxOb2RlOjpGaXJzdFNpYmxpbmc6IHsNCisgICAgICBDRkRFX1hNTE5vZGUqIHBJdGVtID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgICAgICB3aGlsZSAocEl0ZW0tPm1fcFByaW9yICE9IE5VTEwpIHsNCisgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcFByaW9yOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcEl0ZW0gPT0gKENGREVfWE1MTm9kZSopdGhpcyA/IE5VTEwgOiBwSXRlbTsNCisgICAgfQ0KKyAgICBjYXNlIElGREVfWE1MTm9kZTo6UHJpb3JTaWJsaW5nOg0KKyAgICAgIHJldHVybiBtX3BQcmlvcjsNCisgICAgY2FzZSBJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nOg0KKyAgICAgIHJldHVybiBtX3BOZXh0Ow0KKyAgICBjYXNlIElGREVfWE1MTm9kZTo6TGFzdFNpYmxpbmc6IHsNCisgICAgICBDRkRFX1hNTE5vZGUqIHBJdGVtID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgICAgICB3aGlsZSAocEl0ZW0tPm1fcE5leHQgIT0gTlVMTCkgew0KKyAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wTmV4dDsNCisgICAgICB9DQorICAgICAgcmV0dXJuIHBJdGVtID09IChDRkRFX1hNTE5vZGUqKXRoaXMgPyBOVUxMIDogcEl0ZW07DQorICAgIH0NCisgICAgY2FzZSBJRkRFX1hNTE5vZGU6OkZpcnN0TmVpZ2hib3I6IHsNCisgICAgICBDRkRFX1hNTE5vZGUqIHBQYXJlbnQgPSAoQ0ZERV9YTUxOb2RlKil0aGlzOw0KKyAgICAgIHdoaWxlIChwUGFyZW50LT5tX3BQYXJlbnQgIT0gTlVMTCkgew0KKyAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPm1fcFBhcmVudDsNCisgICAgICB9DQorICAgICAgcmV0dXJuIHBQYXJlbnQgPT0gKENGREVfWE1MTm9kZSopdGhpcyA/IE5VTEwgOiBwUGFyZW50Ow0KKyAgICB9DQorICAgIGNhc2UgSUZERV9YTUxOb2RlOjpQcmlvck5laWdoYm9yOiB7DQorICAgICAgaWYgKG1fcFByaW9yID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBtX3BQYXJlbnQ7DQorICAgICAgfQ0KKyAgICAgIENGREVfWE1MTm9kZSogcEl0ZW0gPSBtX3BQcmlvcjsNCisgICAgICB3aGlsZSAoQ0ZERV9YTUxOb2RlKiBwVGVtcCA9IHBJdGVtLT5tX3BDaGlsZCkgew0KKyAgICAgICAgcEl0ZW0gPSBwVGVtcDsNCisgICAgICAgIHdoaWxlICgocFRlbXAgPSBwSXRlbS0+bV9wTmV4dCkgIT0gTlVMTCkgew0KKyAgICAgICAgICBwSXRlbSA9IHBUZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcEl0ZW07DQorICAgIH0NCisgICAgY2FzZSBJRkRFX1hNTE5vZGU6Ok5leHROZWlnaGJvcjogew0KKyAgICAgIGlmIChtX3BDaGlsZCAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gbV9wQ2hpbGQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX3BOZXh0ICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBtX3BOZXh0Ow0KKyAgICAgIH0NCisgICAgICBDRkRFX1hNTE5vZGUqIHBJdGVtID0gbV9wUGFyZW50Ow0KKyAgICAgIHdoaWxlIChwSXRlbSAhPSBOVUxMKSB7DQorICAgICAgICBpZiAocEl0ZW0tPm1fcE5leHQgIT0gTlVMTCkgew0KKyAgICAgICAgICByZXR1cm4gcEl0ZW0tPm1fcE5leHQ7DQorICAgICAgICB9DQorICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BQYXJlbnQ7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGNhc2UgSUZERV9YTUxOb2RlOjpMYXN0TmVpZ2hib3I6IHsNCisgICAgICBDRkRFX1hNTE5vZGUqIHBJdGVtID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgICAgICB3aGlsZSAocEl0ZW0tPm1fcFBhcmVudCAhPSBOVUxMKSB7DQorICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BQYXJlbnQ7DQorICAgICAgfQ0KKyAgICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICB3aGlsZSAocEl0ZW0tPm1fcE5leHQgIT0gTlVMTCkgew0KKyAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBJdGVtLT5tX3BDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wQ2hpbGQ7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBwSXRlbSA9PSAoQ0ZERV9YTUxOb2RlKil0aGlzID8gTlVMTCA6IHBJdGVtOw0KKyAgICB9DQorICAgIGNhc2UgSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkOg0KKyAgICAgIHJldHVybiBtX3BDaGlsZDsNCisgICAgY2FzZSBJRkRFX1hNTE5vZGU6Okxhc3RDaGlsZDogew0KKyAgICAgIGlmIChtX3BDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsNCisgICAgICB3aGlsZSAocENoaWxkLT5tX3BOZXh0ICE9IE5VTEwpIHsNCisgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgICAgICB9DQorICAgICAgcmV0dXJuIHBDaGlsZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK2ludDMyX3QgQ0ZERV9YTUxOb2RlOjpHZXROb2RlTGV2ZWwoKSBjb25zdCB7DQorICBpbnQzMl90IGlMZXZlbCA9IDA7DQorICBDRkRFX1hNTE5vZGUqIHBJdGVtID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgIHdoaWxlICgocEl0ZW0gPSBwSXRlbS0+bV9wUGFyZW50KSAhPSBOVUxMKSB7DQorICAgIGlMZXZlbCsrOw0KKyAgfQ0KKyAgcmV0dXJuIGlMZXZlbDsNCit9DQorRlhfQk9PTCBDRkRFX1hNTE5vZGU6Okluc2VydE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSogcE5vZGUpIHsNCisgIEZYU1lTX2Fzc2VydChwTm9kZSAhPSBOVUxMKTsNCisgIHN3aXRjaCAoZUl0ZW0pIHsNCisgICAgY2FzZSBJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nOiB7DQorICAgICAgcE5vZGUtPm1fcFBhcmVudCA9IG1fcFBhcmVudDsNCisgICAgICBwTm9kZS0+bV9wTmV4dCA9IG1fcE5leHQ7DQorICAgICAgcE5vZGUtPm1fcFByaW9yID0gdGhpczsNCisgICAgICBpZiAobV9wTmV4dCkgew0KKyAgICAgICAgbV9wTmV4dC0+bV9wUHJpb3IgPSBwTm9kZTsNCisgICAgICB9DQorICAgICAgbV9wTmV4dCA9IHBOb2RlOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGNhc2UgSUZERV9YTUxOb2RlOjpQcmlvclNpYmxpbmc6IHsNCisgICAgICBwTm9kZS0+bV9wUGFyZW50ID0gbV9wUGFyZW50Ow0KKyAgICAgIHBOb2RlLT5tX3BOZXh0ID0gdGhpczsNCisgICAgICBwTm9kZS0+bV9wUHJpb3IgPSBtX3BQcmlvcjsNCisgICAgICBpZiAobV9wUHJpb3IpIHsNCisgICAgICAgIG1fcFByaW9yLT5tX3BOZXh0ID0gcE5vZGU7DQorICAgICAgfSBlbHNlIGlmIChtX3BQYXJlbnQpIHsNCisgICAgICAgIG1fcFBhcmVudC0+bV9wQ2hpbGQgPSBwTm9kZTsNCisgICAgICB9DQorICAgICAgbV9wUHJpb3IgPSBwTm9kZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTE5vZGU6OlJlbW92ZU5vZGVJdGVtKElGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0pIHsNCisgIENGREVfWE1MTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgc3dpdGNoIChlSXRlbSkgew0KKyAgICBjYXNlIElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmc6DQorICAgICAgaWYgKG1fcE5leHQpIHsNCisgICAgICAgIHBOb2RlID0gbV9wTmV4dDsNCisgICAgICAgIG1fcE5leHQgPSBwTm9kZS0+bV9wTmV4dDsNCisgICAgICAgIGlmIChtX3BOZXh0KSB7DQorICAgICAgICAgIG1fcE5leHQtPm1fcFByaW9yID0gdGhpczsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgICAgICAgcE5vZGUtPm1fcE5leHQgPSBOVUxMOw0KKyAgICAgICAgcE5vZGUtPm1fcFByaW9yID0gTlVMTDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gcE5vZGU7DQorfQ0KK0NGREVfWE1MTm9kZSogQ0ZERV9YTUxOb2RlOjpDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCit2b2lkIENGREVfWE1MTm9kZTo6U2F2ZVhNTE5vZGUoSUZYX1N0cmVhbSogcFhNTFN0cmVhbSkgew0KKyAgQ0ZERV9YTUxOb2RlKiBwTm9kZSA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQorICBGWFNZU19hc3NlcnQocFhNTFN0cmVhbSAhPSBOVUxMICYmIHBOb2RlICE9IE5VTEwpOw0KKyAgc3dpdGNoIChwTm9kZS0+R2V0VHlwZSgpKSB7DQorICAgIGNhc2UgRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb246IHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3czsNCisgICAgICBDRkRFX1hNTEluc3RydWN0aW9uKiBwSW5zdHJ1Y3Rpb24gPSAoQ0ZERV9YTUxJbnN0cnVjdGlvbiopcE5vZGU7DQorICAgICAgaWYgKHBJbnN0cnVjdGlvbi0+bV93c1RhcmdldC5Db21wYXJlTm9DYXNlKEwieG1sIikgPT0gMCkgew0KKyAgICAgICAgd3MgPSBMIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiI7DQorICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IHBYTUxTdHJlYW0tPkdldENvZGVQYWdlKCk7DQorICAgICAgICBpZiAod0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2TEUpIHsNCisgICAgICAgICAgd3MgKz0gTCJVVEYtMTYiOw0KKyAgICAgICAgfSBlbHNlIGlmICh3Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgew0KKyAgICAgICAgICB3cyArPSBMIlVURi0xNmJlIjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzICs9IEwiVVRGLTgiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3MgKz0gTCJcIj8+IjsNCisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdzLkZvcm1hdChMIjw/JXMiLCAoY29uc3QgRlhfV0NIQVIqKXBJbnN0cnVjdGlvbi0+bV93c1RhcmdldCk7DQorICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgYXR0cmlidXRlcyA9IHBJbnN0cnVjdGlvbi0+bV9BdHRyaWJ1dGVzOw0KKyAgICAgICAgaW50MzJfdCBpLCBpQ291bnQgPSBhdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgICAgICAgd3MgPSBMIiAiOw0KKyAgICAgICAgICB3cyArPSBhdHRyaWJ1dGVzW2ldOw0KKyAgICAgICAgICB3cyArPSBMIj1cIiI7DQorICAgICAgICAgIHdzVmFsdWUgPSBhdHRyaWJ1dGVzW2kgKyAxXTsNCisgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiJiIsIEwiJmFtcDsiKTsNCisgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiPCIsIEwiJmx0OyIpOw0KKyAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7DQorICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwnIiwgTCImYXBvczsiKTsNCisgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCIiLCBMIiZxdW90OyIpOw0KKyAgICAgICAgICB3cyArPSB3c1ZhbHVlOw0KKyAgICAgICAgICB3cyArPSBMIlwiIjsNCisgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIHRhcmdldGRhdGEgPSBwSW5zdHJ1Y3Rpb24tPm1fVGFyZ2V0RGF0YTsNCisgICAgICAgIGlDb3VudCA9IHRhcmdldGRhdGEuR2V0U2l6ZSgpOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICAgIHdzID0gTCIgXCIiOw0KKyAgICAgICAgICB3cyArPSB0YXJnZXRkYXRhW2ldOw0KKyAgICAgICAgICB3cyArPSBMIlwiIjsNCisgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgIH0NCisgICAgICAgIHdzID0gTCI/PiI7DQorICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3M7DQorICAgICAgd3MgPSBMIjwiOw0KKyAgICAgIHdzICs9ICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPm1fd3NUYWc7DQorICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5JiBhdHRyaWJ1dGVzID0gKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+bV9BdHRyaWJ1dGVzOw0KKyAgICAgIGludDMyX3QgaUNvdW50ID0gYXR0cmlidXRlcy5HZXRTaXplKCk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICAgICAgd3MgPSBMIiAiOw0KKyAgICAgICAgd3MgKz0gYXR0cmlidXRlc1tpXTsNCisgICAgICAgIHdzICs9IEwiPVwiIjsNCisgICAgICAgIHdzVmFsdWUgPSBhdHRyaWJ1dGVzW2kgKyAxXTsNCisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIiYiLCBMIiZhbXA7Iik7DQorICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI8IiwgTCImbHQ7Iik7DQorICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7DQorICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcJyIsIEwiJmFwb3M7Iik7DQorICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcIiIsIEwiJnF1b3Q7Iik7DQorICAgICAgICB3cyArPSB3c1ZhbHVlOw0KKyAgICAgICAgd3MgKz0gTCJcIiI7DQorICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIH0NCisgICAgICBpZiAocE5vZGUtPm1fcENoaWxkID09IE5VTEwpIHsNCisgICAgICAgIHdzID0gTCJcbi8+IjsNCisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdzID0gTCJcbj4iOw0KKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgIENGREVfWE1MTm9kZSogcENoaWxkID0gcE5vZGUtPm1fcENoaWxkOw0KKyAgICAgICAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQorICAgICAgICAgIHBDaGlsZC0+U2F2ZVhNTE5vZGUocFhNTFN0cmVhbSk7DQorICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgICAgICAgIH0NCisgICAgICAgIHdzID0gTCI8LyI7DQorICAgICAgICB3cyArPSAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5tX3dzVGFnOw0KKyAgICAgICAgd3MgKz0gTCJcbj4iOw0KKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzID0gKChDRkRFX1hNTFRleHQqKXBOb2RlKS0+bV93c1RleHQ7DQorICAgICAgd3MuUmVwbGFjZShMIiYiLCBMIiZhbXA7Iik7DQorICAgICAgd3MuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsNCisgICAgICB3cy5SZXBsYWNlKEwiPiIsIEwiJmd0OyIpOw0KKyAgICAgIHdzLlJlcGxhY2UoTCJcJyIsIEwiJmFwb3M7Iik7DQorICAgICAgd3MuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsNCisgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSBMIjwhW0NEQVRBWyI7DQorICAgICAgd3MgKz0gKChDRkRFX1hNTENoYXJEYXRhKilwTm9kZSktPm1fd3NDaGFyRGF0YTsNCisgICAgICB3cyArPSBMIl1dPiI7DQorICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfWE1MTk9ERV9Vbmtub3duOg0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCit2b2lkIENGREVfWE1MTm9kZTo6Q2xvbmVDaGlsZHJlbihDRkRFX1hNTE5vZGUqIHBDbG9uZSkgew0KKyAgaWYgKCFtX3BDaGlsZCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRkRFX1hNTE5vZGUqIHBOZXh0ID0gbV9wQ2hpbGQ7DQorICBDRkRFX1hNTE5vZGUqIHBDbG9uZU5leHQgPSBwTmV4dC0+Q2xvbmUoVFJVRSk7DQorICBwQ2xvbmUtPkluc2VydENoaWxkTm9kZShwQ2xvbmVOZXh0KTsNCisgIHBOZXh0ID0gcE5leHQtPm1fcE5leHQ7DQorICB3aGlsZSAocE5leHQpIHsNCisgICAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBwTmV4dC0+Q2xvbmUoVFJVRSk7DQorICAgIHBDbG9uZU5leHQtPkluc2VydE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcsIHBDaGlsZCk7DQorICAgIHBDbG9uZU5leHQgPSBwQ2hpbGQ7DQorICAgIHBOZXh0ID0gcE5leHQtPm1fcE5leHQ7DQorICB9DQorfQ0KK0lGREVfWE1MSW5zdHJ1Y3Rpb24qIElGREVfWE1MSW5zdHJ1Y3Rpb246OkNyZWF0ZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KSB7DQorICByZXR1cm4gKElGREVfWE1MSW5zdHJ1Y3Rpb24qKW5ldyBDRkRFX1hNTEluc3RydWN0aW9uKHdzVGFyZ2V0KTsNCit9DQorQ0ZERV9YTUxJbnN0cnVjdGlvbjo6Q0ZERV9YTUxJbnN0cnVjdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpDQorICAgIDogQ0ZERV9YTUxOb2RlKCksIG1fd3NUYXJnZXQod3NUYXJnZXQpLCBtX1RhcmdldERhdGEoKSwgbV9BdHRyaWJ1dGVzKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fd3NUYXJnZXQuR2V0TGVuZ3RoKCkgPiAwKTsNCit9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTEluc3RydWN0aW9uOjpDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpIHsNCisgIENGREVfWE1MSW5zdHJ1Y3Rpb24qIHBDbG9uZSA9IG5ldyBDRkRFX1hNTEluc3RydWN0aW9uKG1fd3NUYXJnZXQpOw0KKyAgaWYgKCFwQ2xvbmUpIHsNCisgICAgcmV0dXJuIHBDbG9uZTsNCisgIH0NCisgIHBDbG9uZS0+bV9BdHRyaWJ1dGVzLkNvcHkobV9BdHRyaWJ1dGVzKTsNCisgIHBDbG9uZS0+bV9UYXJnZXREYXRhLkNvcHkobV9UYXJnZXREYXRhKTsNCisgIGlmIChiUmVjdXJzaXZlKSB7DQorICAgIENsb25lQ2hpbGRyZW4ocENsb25lKTsNCisgIH0NCisgIHJldHVybiBwQ2xvbmU7DQorfQ0KK2ludDMyX3QgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6Q291bnRBdHRyaWJ1dGVzKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fQXR0cmlidXRlcy5HZXRTaXplKCkgLyAyOw0KK30NCitGWF9CT09MIENGREVfWE1MSW5zdHJ1Y3Rpb246OkdldEF0dHJpYnV0ZShpbnQzMl90IGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IGlDb3VudCAvIDIpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgaWYgKGluZGV4ID09IDApIHsNCisgICAgICB3c0F0dHJpTmFtZSA9IG1fQXR0cmlidXRlc1tpXTsNCisgICAgICB3c0F0dHJpVmFsdWUgPSBtX0F0dHJpYnV0ZXNbaSArIDFdOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGluZGV4LS07DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6SGFzQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpIGNvbnN0IHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENGREVfWE1MSW5zdHJ1Y3Rpb246OkdldFN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHB3c0RlZlZhbHVlKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQorICAgICAgd3NBdHRyaVZhbHVlID0gbV9BdHRyaWJ1dGVzW2kgKyAxXTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIHdzQXR0cmlWYWx1ZSA9IHB3c0RlZlZhbHVlOw0KK30NCit2b2lkIENGREVfWE1MSW5zdHJ1Y3Rpb246OlNldFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHdzQXR0cmlOYW1lLkdldExlbmd0aCgpID4gMCk7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUod3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICBtX0F0dHJpYnV0ZXNbaV0gPSB3c0F0dHJpTmFtZTsNCisgICAgICBtX0F0dHJpYnV0ZXNbaSArIDFdID0gd3NBdHRyaVZhbHVlOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKyAgbV9BdHRyaWJ1dGVzLkFkZCh3c0F0dHJpTmFtZSk7DQorICBtX0F0dHJpYnV0ZXMuQWRkKHdzQXR0cmlWYWx1ZSk7DQorfQ0KK2ludDMyX3QgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6R2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWZWYWx1ZSkgY29uc3Qgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgIHJldHVybiBGWFNZU193dG9pKChjb25zdCBGWF9XQ0hBUiopbV9BdHRyaWJ1dGVzW2kgKyAxXSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpRGVmVmFsdWU7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6U2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBdHRyaVZhbHVlKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgd3NWYWx1ZS5Gb3JtYXQoTCIlZCIsIGlBdHRyaVZhbHVlKTsNCisgIFNldFN0cmluZyhwd3NBdHRyaU5hbWUsIHdzVmFsdWUpOw0KK30NCitGWF9GTE9BVCBDRkRFX1hNTEluc3RydWN0aW9uOjpHZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZEZWZWYWx1ZSkgY29uc3Qgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgIHJldHVybiBGWF93Y3N0b2YoKGNvbnN0IEZYX1dDSEFSKiltX0F0dHJpYnV0ZXNbaSArIDFdKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZEZWZWYWx1ZTsNCit9DQordm9pZCBDRkRFX1hNTEluc3RydWN0aW9uOjpTZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkF0dHJpVmFsdWUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICB3c1ZhbHVlLkZvcm1hdChMIiVmIiwgZkF0dHJpVmFsdWUpOw0KKyAgU2V0U3RyaW5nKHB3c0F0dHJpTmFtZSwgd3NWYWx1ZSk7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6UmVtb3ZlQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICBtX0F0dHJpYnV0ZXMuUmVtb3ZlQXQoaSArIDEpOw0KKyAgICAgIG1fQXR0cmlidXRlcy5SZW1vdmVBdChpKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCit9DQoraW50MzJfdCBDRkRFX1hNTEluc3RydWN0aW9uOjpDb3VudERhdGEoKSBjb25zdCB7DQorICByZXR1cm4gbV9UYXJnZXREYXRhLkdldFNpemUoKTsNCit9DQorRlhfQk9PTCBDRkRFX1hNTEluc3RydWN0aW9uOjpHZXREYXRhKGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RhdGEpIGNvbnN0IHsNCisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9UYXJnZXREYXRhLkdldFNpemUoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3c0RhdGEgPSBtX1RhcmdldERhdGFbaW5kZXhdOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6QXBwZW5kRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRhKSB7DQorICBtX1RhcmdldERhdGEuQWRkKHdzRGF0YSk7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6UmVtb3ZlRGF0YShpbnQzMl90IGluZGV4KSB7DQorICBtX1RhcmdldERhdGEuUmVtb3ZlQXQoaW5kZXgpOw0KK30NCitJRkRFX1hNTEVsZW1lbnQqIElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhZykgew0KKyAgcmV0dXJuIChJRkRFX1hNTEVsZW1lbnQqKW5ldyBDRkRFX1hNTEVsZW1lbnQod3NUYWcpOw0KK30NCitDRkRFX1hNTEVsZW1lbnQ6OkNGREVfWE1MRWxlbWVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYWcpDQorICAgIDogQ0ZERV9YTUxOb2RlKCksIG1fd3NUYWcod3NUYWcpLCBtX0F0dHJpYnV0ZXMoKSB7DQorICBGWFNZU19hc3NlcnQobV93c1RhZy5HZXRMZW5ndGgoKSA+IDApOw0KK30NCitDRkRFX1hNTEVsZW1lbnQ6On5DRkRFX1hNTEVsZW1lbnQoKSB7DQorICBtX0F0dHJpYnV0ZXMuUmVtb3ZlQWxsKCk7DQorfQ0KK0NGREVfWE1MTm9kZSogQ0ZERV9YTUxFbGVtZW50OjpDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpIHsNCisgIENGREVfWE1MRWxlbWVudCogcENsb25lID0gbmV3IENGREVfWE1MRWxlbWVudChtX3dzVGFnKTsNCisgIGlmICghcENsb25lKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcENsb25lLT5tX0F0dHJpYnV0ZXMuQ29weShtX0F0dHJpYnV0ZXMpOw0KKyAgaWYgKGJSZWN1cnNpdmUpIHsNCisgICAgQ2xvbmVDaGlsZHJlbihwQ2xvbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBDRkRFX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOw0KKyAgICB3aGlsZSAocENoaWxkICE9IE5VTEwpIHsNCisgICAgICBzd2l0Y2ggKHBDaGlsZC0+R2V0VHlwZSgpKSB7DQorICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6DQorICAgICAgICAgIHdzVGV4dCArPSAoKENGREVfWE1MVGV4dCopcENoaWxkKS0+bV93c1RleHQ7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgICAgfQ0KKyAgICBwQ2xvbmUtPlNldFRleHREYXRhKHdzVGV4dCk7DQorICB9DQorICByZXR1cm4gcENsb25lOw0KK30NCit2b2lkIENGREVfWE1MRWxlbWVudDo6R2V0VGFnTmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYWcpIGNvbnN0IHsNCisgIHdzVGFnID0gbV93c1RhZzsNCit9DQordm9pZCBDRkRFX1hNTEVsZW1lbnQ6OkdldExvY2FsVGFnTmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYWcpIGNvbnN0IHsNCisgIEZYX1NUUlNJWkUgaUZpbmQgPSBtX3dzVGFnLkZpbmQoTCc6JywgMCk7DQorICBpZiAoaUZpbmQgPCAwKSB7DQorICAgIHdzVGFnID0gbV93c1RhZzsNCisgIH0gZWxzZSB7DQorICAgIHdzVGFnID0gbV93c1RhZy5SaWdodChtX3dzVGFnLkdldExlbmd0aCgpIC0gaUZpbmQgLSAxKTsNCisgIH0NCit9DQordm9pZCBDRkRFX1hNTEVsZW1lbnQ6OkdldE5hbWVzcGFjZVByZWZpeChDRlhfV2lkZVN0cmluZyYgd3NQcmVmaXgpIGNvbnN0IHsNCisgIEZYX1NUUlNJWkUgaUZpbmQgPSBtX3dzVGFnLkZpbmQoTCc6JywgMCk7DQorICBpZiAoaUZpbmQgPCAwKSB7DQorICAgIHdzUHJlZml4LkVtcHR5KCk7DQorICB9IGVsc2Ugew0KKyAgICB3c1ByZWZpeCA9IG1fd3NUYWcuTGVmdChpRmluZCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9YTUxFbGVtZW50OjpHZXROYW1lc3BhY2VVUkkoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlKSBjb25zdCB7DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJpKEwieG1sbnMiKSwgd3NQcmVmaXg7DQorICBHZXROYW1lc3BhY2VQcmVmaXgod3NQcmVmaXgpOw0KKyAgaWYgKHdzUHJlZml4LkdldExlbmd0aCgpID4gMCkgew0KKyAgICB3c0F0dHJpICs9IEwiOiI7DQorICAgIHdzQXR0cmkgKz0gd3NQcmVmaXg7DQorICB9DQorICB3c05hbWVzcGFjZS5FbXB0eSgpOw0KKyAgQ0ZERV9YTUxOb2RlKiBwTm9kZSA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQorICB3aGlsZSAocE5vZGUgIT0gTlVMTCkgew0KKyAgICBpZiAocE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgQ0ZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlOw0KKyAgICBpZiAoIXBFbGVtZW50LT5IYXNBdHRyaWJ1dGUod3NBdHRyaSkpIHsNCisgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgcEVsZW1lbnQtPkdldFN0cmluZyh3c0F0dHJpLCB3c05hbWVzcGFjZSk7DQorICAgIGJyZWFrOw0KKyAgfQ0KK30NCitpbnQzMl90IENGREVfWE1MRWxlbWVudDo6Q291bnRBdHRyaWJ1dGVzKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fQXR0cmlidXRlcy5HZXRTaXplKCkgLyAyOw0KK30NCitGWF9CT09MIENGREVfWE1MRWxlbWVudDo6R2V0QXR0cmlidXRlKGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IGlDb3VudCAvIDIpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgaWYgKGluZGV4ID09IDApIHsNCisgICAgICB3c0F0dHJpTmFtZSA9IG1fQXR0cmlidXRlc1tpXTsNCisgICAgICB3c0F0dHJpVmFsdWUgPSBtX0F0dHJpYnV0ZXNbaSArIDFdOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGluZGV4LS07DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9YTUxFbGVtZW50OjpIYXNBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgY29uc3Qgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxFbGVtZW50OjpHZXRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHdzRGVmVmFsdWUpIGNvbnN0IHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICB3c0F0dHJpVmFsdWUgPSBtX0F0dHJpYnV0ZXNbaSArIDFdOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKyAgd3NBdHRyaVZhbHVlID0gcHdzRGVmVmFsdWU7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxFbGVtZW50OjpTZXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHdzQXR0cmlOYW1lLkdldExlbmd0aCgpID4gMCk7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUod3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICBtX0F0dHJpYnV0ZXNbaV0gPSB3c0F0dHJpTmFtZTsNCisgICAgICBtX0F0dHJpYnV0ZXNbaSArIDFdID0gd3NBdHRyaVZhbHVlOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKyAgbV9BdHRyaWJ1dGVzLkFkZCh3c0F0dHJpTmFtZSk7DQorICBtX0F0dHJpYnV0ZXMuQWRkKHdzQXR0cmlWYWx1ZSk7DQorfQ0KK2ludDMyX3QgQ0ZERV9YTUxFbGVtZW50OjpHZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGVmVmFsdWUpIGNvbnN0IHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICByZXR1cm4gRlhTWVNfd3RvaSgoY29uc3QgRlhfV0NIQVIqKW1fQXR0cmlidXRlc1tpICsgMV0pOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gaURlZlZhbHVlOw0KK30NCit2b2lkIENGREVfWE1MRWxlbWVudDo6U2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUF0dHJpVmFsdWUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICB3c1ZhbHVlLkZvcm1hdChMIiVkIiwgaUF0dHJpVmFsdWUpOw0KKyAgU2V0U3RyaW5nKHB3c0F0dHJpTmFtZSwgd3NWYWx1ZSk7DQorfQ0KK0ZYX0ZMT0FUIENGREVfWE1MRWxlbWVudDo6R2V0RmxvYXQoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZEZWZWYWx1ZSkgY29uc3Qgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgIHJldHVybiBGWF93Y3N0b2YoKGNvbnN0IEZYX1dDSEFSKiltX0F0dHJpYnV0ZXNbaSArIDFdKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZEZWZWYWx1ZTsNCit9DQordm9pZCBDRkRFX1hNTEVsZW1lbnQ6OlNldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZBdHRyaVZhbHVlKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgd3NWYWx1ZS5Gb3JtYXQoTCIlZiIsIGZBdHRyaVZhbHVlKTsNCisgIFNldFN0cmluZyhwd3NBdHRyaU5hbWUsIHdzVmFsdWUpOw0KK30NCit2b2lkIENGREVfWE1MRWxlbWVudDo6UmVtb3ZlQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICBtX0F0dHJpYnV0ZXMuUmVtb3ZlQXQoaSArIDEpOw0KKyAgICAgIG1fQXR0cmlidXRlcy5SZW1vdmVBdChpKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRkRFX1hNTEVsZW1lbnQ6OkdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0IHsNCisgIENGWF9XaWRlVGV4dEJ1ZiBidWZmZXI7DQorICBDRkRFX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOw0KKyAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQorICAgIHN3aXRjaCAocENoaWxkLT5HZXRUeXBlKCkpIHsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6DQorICAgICAgICBidWZmZXIgPDwgKChDRkRFX1hNTFRleHQqKXBDaGlsZCktPm1fd3NUZXh0Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MTk9ERV9DaGFyRGF0YToNCisgICAgICAgIGJ1ZmZlciA8PCAoKENGREVfWE1MQ2hhckRhdGEqKXBDaGlsZCktPm1fd3NDaGFyRGF0YTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQogICAgICAgICBicmVhazsNCiAgICAgfQ0KKyAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7DQorICB9DQorICB3c1RleHQgPSBidWZmZXIuR2V0V2lkZVN0cmluZygpOw0KIH0NCi1pbnQzMl90IENGREVfWE1MRWxlbWVudDo6Q291bnRBdHRyaWJ1dGVzKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpIC8gMjsNCit2b2lkIENGREVfWE1MRWxlbWVudDo6U2V0VGV4dERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSW5zZXJ0Q2hpbGROb2RlKG5ldyBDRkRFX1hNTFRleHQod3NUZXh0KSk7DQogfQ0KLUZYX0JPT0wgQ0ZERV9YTUxFbGVtZW50OjpHZXRBdHRyaWJ1dGUoaW50MzJfdCBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKSBjb25zdA0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KLSAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IGlDb3VudCAvIDIpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KLSAgICAgICAgaWYgKGluZGV4ID09IDApIHsNCi0gICAgICAgICAgICB3c0F0dHJpTmFtZSA9IG1fQXR0cmlidXRlc1tpXTsNCi0gICAgICAgICAgICB3c0F0dHJpVmFsdWUgPSBtX0F0dHJpYnV0ZXNbaSArIDFdOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW5kZXggLS07DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KK0lGREVfWE1MVGV4dCogSUZERV9YTUxUZXh0OjpDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgcmV0dXJuIChJRkRFX1hNTFRleHQqKW5ldyBDRkRFX1hNTFRleHQod3NUZXh0KTsNCiB9DQotRlhfQk9PTCBDRkRFX1hNTEVsZW1lbnQ6Okhhc0F0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKSBjb25zdA0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KLSAgICAgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCitDRkRFX1hNTFRleHQ6OkNGREVfWE1MVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KQ0KKyAgICA6IENGREVfWE1MTm9kZSgpLCBtX3dzVGV4dCh3c1RleHQpIHt9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTFRleHQ6OkNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSkgew0KKyAgQ0ZERV9YTUxUZXh0KiBwQ2xvbmUgPSBuZXcgQ0ZERV9YTUxUZXh0KG1fd3NUZXh0KTsNCisgIHJldHVybiBwQ2xvbmU7DQogfQ0KLXZvaWQgQ0ZERV9YTUxFbGVtZW50OjpHZXRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSwgY29uc3QgRlhfV0NIQVIqIHB3c0RlZlZhbHVlKSBjb25zdA0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KLSAgICAgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KLSAgICAgICAgICAgIHdzQXR0cmlWYWx1ZSA9IG1fQXR0cmlidXRlc1tpICsgMV07DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHdzQXR0cmlWYWx1ZSA9IHB3c0RlZlZhbHVlOw0KK0lGREVfWE1MQ2hhckRhdGEqIElGREVfWE1MQ2hhckRhdGE6OkNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDRGF0YSkgew0KKyAgcmV0dXJuIChJRkRFX1hNTENoYXJEYXRhKiluZXcgQ0ZERV9YTUxDaGFyRGF0YSh3c0NEYXRhKTsNCiB9DQotdm9pZCBDRkRFX1hNTEVsZW1lbnQ6OlNldFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaU5hbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUpDQotew0KLSAgICBGWFNZU19hc3NlcnQod3NBdHRyaU5hbWUuR2V0TGVuZ3RoKCkgPiAwKTsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KLSAgICAgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHdzQXR0cmlOYW1lKSA9PSAwKSB7DQotICAgICAgICAgICAgbV9BdHRyaWJ1dGVzW2ldID0gd3NBdHRyaU5hbWU7DQotICAgICAgICAgICAgbV9BdHRyaWJ1dGVzW2kgKyAxXSA9IHdzQXR0cmlWYWx1ZTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9BdHRyaWJ1dGVzLkFkZCh3c0F0dHJpTmFtZSk7DQotICAgIG1fQXR0cmlidXRlcy5BZGQod3NBdHRyaVZhbHVlKTsNCitDRkRFX1hNTENoYXJEYXRhOjpDRkRFX1hNTENoYXJEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NEYXRhKQ0KKyAgICA6IENGREVfWE1MRGVjbGFyYXRpb24oKSwgbV93c0NoYXJEYXRhKHdzQ0RhdGEpIHt9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTENoYXJEYXRhOjpDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpIHsNCisgIENGREVfWE1MQ2hhckRhdGEqIHBDbG9uZSA9IG5ldyBDRkRFX1hNTENoYXJEYXRhKG1fd3NDaGFyRGF0YSk7DQorICByZXR1cm4gcENsb25lOw0KIH0NCi1pbnQzMl90IENGREVfWE1MRWxlbWVudDo6R2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBpbnQzMl90IGlEZWZWYWx1ZSkgY29uc3QNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCi0gICAgICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gRlhTWVNfd3RvaSgoY29uc3QgRlhfV0NIQVIqKW1fQXR0cmlidXRlc1tpICsgMV0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBpRGVmVmFsdWU7DQotfQ0KLXZvaWQgQ0ZERV9YTUxFbGVtZW50OjpTZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIGludDMyX3QgaUF0dHJpVmFsdWUpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICB3c1ZhbHVlLkZvcm1hdChMIiVkIiwgaUF0dHJpVmFsdWUpOw0KLSAgICBTZXRTdHJpbmcocHdzQXR0cmlOYW1lLCB3c1ZhbHVlKTsNCi19DQotRlhfRkxPQVQgQ0ZERV9YTUxFbGVtZW50OjpHZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmRGVmVmFsdWUpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQotICAgICAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZYX3djc3RvZigoY29uc3QgRlhfV0NIQVIqKW1fQXR0cmlidXRlc1tpICsgMV0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBmRGVmVmFsdWU7DQotfQ0KLXZvaWQgQ0ZERV9YTUxFbGVtZW50OjpTZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmQXR0cmlWYWx1ZSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgIHdzVmFsdWUuRm9ybWF0KEwiJWYiLCBmQXR0cmlWYWx1ZSk7DQotICAgIFNldFN0cmluZyhwd3NBdHRyaU5hbWUsIHdzVmFsdWUpOw0KLX0NCi12b2lkIENGREVfWE1MRWxlbWVudDo6UmVtb3ZlQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQotICAgICAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQotICAgICAgICAgICAgbV9BdHRyaWJ1dGVzLlJlbW92ZUF0KGkgKyAxKTsNCi0gICAgICAgICAgICBtX0F0dHJpYnV0ZXMuUmVtb3ZlQXQoaSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZERV9YTUxFbGVtZW50OjpHZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyAmd3NUZXh0KSBjb25zdA0KLXsNCi0gICAgQ0ZYX1dpZGVUZXh0QnVmIGJ1ZmZlcjsNCi0gICAgQ0ZERV9YTUxOb2RlICpwQ2hpbGQgPSBtX3BDaGlsZDsNCi0gICAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQotICAgICAgICBzd2l0Y2ggKHBDaGlsZC0+R2V0VHlwZSgpKSB7DQotICAgICAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0Og0KLSAgICAgICAgICAgICAgICBidWZmZXIgPDwgKChDRkRFX1hNTFRleHQqKXBDaGlsZCktPm1fd3NUZXh0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOg0KLSAgICAgICAgICAgICAgICBidWZmZXIgPDwgKChDRkRFX1hNTENoYXJEYXRhKilwQ2hpbGQpLT5tX3dzQ2hhckRhdGE7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KLSAgICB9DQotICAgIHdzVGV4dCA9IGJ1ZmZlci5HZXRXaWRlU3RyaW5nKCk7DQotfQ0KLXZvaWQgQ0ZERV9YTUxFbGVtZW50OjpTZXRUZXh0RGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA8IDEpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJbnNlcnRDaGlsZE5vZGUobmV3IENGREVfWE1MVGV4dCh3c1RleHQpKTsNCi19DQotSUZERV9YTUxUZXh0KiBJRkRFX1hNTFRleHQ6OkNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgcmV0dXJuIChJRkRFX1hNTFRleHQqKW5ldyBDRkRFX1hNTFRleHQod3NUZXh0KTsNCi19DQotQ0ZERV9YTUxUZXh0OjpDRkRFX1hNTFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCi0gICAgOiBDRkRFX1hNTE5vZGUoKQ0KLSAgICAsIG1fd3NUZXh0KHdzVGV4dCkNCi17DQotfQ0KLUNGREVfWE1MTm9kZSogQ0ZERV9YTUxUZXh0OjpDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpDQotew0KLSAgICBDRkRFX1hNTFRleHQqIHBDbG9uZSA9IG5ldyBDRkRFX1hNTFRleHQobV93c1RleHQpOw0KLSAgICByZXR1cm4gcENsb25lOw0KLX0NCi1JRkRFX1hNTENoYXJEYXRhKiBJRkRFX1hNTENoYXJEYXRhOjpDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQ0RhdGEpDQotew0KLSAgICByZXR1cm4gKElGREVfWE1MQ2hhckRhdGEqKW5ldyBDRkRFX1hNTENoYXJEYXRhKHdzQ0RhdGEpOw0KLX0NCi1DRkRFX1hNTENoYXJEYXRhOjpDRkRFX1hNTENoYXJEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0NEYXRhKQ0KLSAgICA6IENGREVfWE1MRGVjbGFyYXRpb24oKQ0KLSAgICAsIG1fd3NDaGFyRGF0YSh3c0NEYXRhKQ0KLXsNCi19DQotQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTENoYXJEYXRhOjpDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpDQotew0KLSAgICBDRkRFX1hNTENoYXJEYXRhKiBwQ2xvbmUgPSBuZXcgQ0ZERV9YTUxDaGFyRGF0YShtX3dzQ2hhckRhdGEpOw0KLSAgICByZXR1cm4gcENsb25lOw0KLX0NCi1JRkRFX1hNTERvYyogSUZERV9YTUxEb2M6OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gKElGREVfWE1MRG9jKiluZXcgQ0ZERV9YTUxEb2M7DQorSUZERV9YTUxEb2MqIElGREVfWE1MRG9jOjpDcmVhdGUoKSB7DQorICByZXR1cm4gKElGREVfWE1MRG9jKiluZXcgQ0ZERV9YTUxEb2M7DQogfQ0KIENGREVfWE1MRG9jOjpDRkRFX1hNTERvYygpDQotICAgIDogbV9wUm9vdChOVUxMKQ0KLSAgICAsIG1fcFN5bnRheFBhcnNlcihOVUxMKQ0KLSAgICAsIG1fcFhNTFBhcnNlcihOVUxMKQ0KLXsNCi0gICAgUmVzZXQoVFJVRSk7DQotICAgIENGREVfWE1MSW5zdHJ1Y3Rpb24gKnBYTUwgPSBuZXcgQ0ZERV9YTUxJbnN0cnVjdGlvbihMInhtbCIpOw0KLSAgICBtX3BSb290LT5JbnNlcnRDaGlsZE5vZGUocFhNTCk7DQorICAgIDogbV9wUm9vdChOVUxMKSwgbV9wU3ludGF4UGFyc2VyKE5VTEwpLCBtX3BYTUxQYXJzZXIoTlVMTCkgew0KKyAgUmVzZXQoVFJVRSk7DQorICBDRkRFX1hNTEluc3RydWN0aW9uKiBwWE1MID0gbmV3IENGREVfWE1MSW5zdHJ1Y3Rpb24oTCJ4bWwiKTsNCisgIG1fcFJvb3QtPkluc2VydENoaWxkTm9kZShwWE1MKTsNCiB9DQotQ0ZERV9YTUxEb2M6On5DRkRFX1hNTERvYygpDQotew0KLSAgICBSZXNldChGQUxTRSk7DQorQ0ZERV9YTUxEb2M6On5DRkRFX1hNTERvYygpIHsNCisgIFJlc2V0KEZBTFNFKTsNCiB9DQotdm9pZCBDRkRFX1hNTERvYzo6UmVzZXQoRlhfQk9PTCBiSW5pdFJvb3QpDQotew0KLSAgICBtX2lTdGF0dXMgPSAwOw0KLSAgICBtX3BTdHJlYW0gPSBOVUxMOw0KLSAgICBpZiAoYkluaXRSb290KSB7DQotICAgICAgICBpZiAobV9wUm9vdCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgbV9wUm9vdCA9IG5ldyBDRkRFX1hNTE5vZGU7DQordm9pZCBDRkRFX1hNTERvYzo6UmVzZXQoRlhfQk9PTCBiSW5pdFJvb3QpIHsNCisgIG1faVN0YXR1cyA9IDA7DQorICBtX3BTdHJlYW0gPSBOVUxMOw0KKyAgaWYgKGJJbml0Um9vdCkgew0KKyAgICBpZiAobV9wUm9vdCA9PSBOVUxMKSB7DQorICAgICAgbV9wUm9vdCA9IG5ldyBDRkRFX1hNTE5vZGU7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9wUm9vdC0+RGVsZXRlQ2hpbGRyZW4oKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fcFJvb3QgIT0gTlVMTCkgew0KKyAgICAgIG1fcFJvb3QtPlJlbGVhc2UoKTsNCisgICAgICBtX3BSb290ID0gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgUmVsZWFzZVBhcnNlcigpOw0KK30NCit2b2lkIENGREVfWE1MRG9jOjpSZWxlYXNlUGFyc2VyKCkgew0KKyAgaWYgKG1fcFhNTFBhcnNlciAhPSBOVUxMKSB7DQorICAgIG1fcFhNTFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICBtX3BYTUxQYXJzZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFN5bnRheFBhcnNlciAhPSBOVUxMKSB7DQorICAgIG1fcFN5bnRheFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICBtX3BTeW50YXhQYXJzZXIgPSBOVUxMOw0KKyAgfQ0KK30NCitGWF9CT09MIENGREVfWE1MRG9jOjpMb2FkWE1MKElGWF9TdHJlYW0qIHBYTUxTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlYTUxQbGFuZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUZXh0RGF0YVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfTFBYTUxSRUFERVJIQU5ETEVSIHBIYW5kbGVyKSB7DQorICBpZiAocFhNTFN0cmVhbSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFJlc2V0KFRSVUUpOw0KKyAgaVhNTFBsYW5lU2l6ZSA9IGlYTUxQbGFuZVNpemUgLyAxMDI0Ow0KKyAgaWYgKGlYTUxQbGFuZVNpemUgPCAxKSB7DQorICAgIGlYTUxQbGFuZVNpemUgPSAxOw0KKyAgfQ0KKyAgaVhNTFBsYW5lU2l6ZSAqPSAxMDI0Ow0KKyAgaWYgKGlYTUxQbGFuZVNpemUgPCA0MDk2KSB7DQorICAgIGlYTUxQbGFuZVNpemUgPSA0MDk2Ow0KKyAgfQ0KKyAgaVRleHREYXRhU2l6ZSA9IGlUZXh0RGF0YVNpemUgLyAxMjg7DQorICBpZiAoaVRleHREYXRhU2l6ZSA8IDEpIHsNCisgICAgaVRleHREYXRhU2l6ZSA9IDE7DQorICB9DQorICBpVGV4dERhdGFTaXplICo9IDEyODsNCisgIGlmIChpVGV4dERhdGFTaXplIDwgMTI4KSB7DQorICAgIGlUZXh0RGF0YVNpemUgPSAxMjg7DQorICB9DQorICBtX3BTdHJlYW0gPSBwWE1MU3RyZWFtOw0KKyAgRlhfV09SRCB3Q29kZVBhZ2UgPSBtX3BTdHJlYW0tPkdldENvZGVQYWdlKCk7DQorICBpZiAod0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2TEUgJiYgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2QkUgJiYNCisgICAgICB3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGOCkgew0KKyAgICBtX3BTdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOw0KKyAgfQ0KKyAgbV9wU3ludGF4UGFyc2VyID0gSUZERV9YTUxTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KKyAgaWYgKG1fcFN5bnRheFBhcnNlciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fcFN5bnRheFBhcnNlci0+SW5pdChtX3BTdHJlYW0sIGlYTUxQbGFuZVNpemUsIGlUZXh0RGF0YVNpemUpOw0KKyAgaWYgKHBIYW5kbGVyID09IE5VTEwpIHsNCisgICAgbV9wWE1MUGFyc2VyID0gbmV3IENGREVfWE1MRE9NUGFyc2VyKG1fcFJvb3QsIG1fcFN5bnRheFBhcnNlcik7DQorICB9IGVsc2Ugew0KKyAgICBtX3BYTUxQYXJzZXIgPSBuZXcgQ0ZERV9YTUxTQVhQYXJzZXIocEhhbmRsZXIsIG1fcFN5bnRheFBhcnNlcik7DQorICB9DQorICByZXR1cm4gbV9wWE1MUGFyc2VyICE9IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9YTUxEb2M6OkxvYWRYTUwoSUZERV9YTUxQYXJzZXIqIHBYTUxQYXJzZXIpIHsNCisgIGlmIChwWE1MUGFyc2VyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgUmVzZXQoVFJVRSk7DQorICBtX3BYTUxQYXJzZXIgPSBwWE1MUGFyc2VyOw0KKyAgcmV0dXJuIG1fcFhNTFBhcnNlciAhPSBOVUxMOw0KK30NCitpbnQzMl90IENGREVfWE1MRG9jOjpEb0xvYWQoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmIChtX2lTdGF0dXMgPj0gMTAwKSB7DQorICAgIHJldHVybiBtX2lTdGF0dXM7DQorICB9DQorICBGWFNZU19hc3NlcnQobV9wWE1MUGFyc2VyICE9IE5VTEwpOw0KKyAgcmV0dXJuIG1faVN0YXR1cyA9IG1fcFhNTFBhcnNlci0+RG9QYXJzZXIocFBhdXNlKTsNCit9DQordm9pZCBDRkRFX1hNTERvYzo6Q2xvc2VYTUwoKSB7DQorICBSZWxlYXNlUGFyc2VyKCk7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxEb2M6OlNhdmVYTUxOb2RlKElGWF9TdHJlYW0qIHBYTUxTdHJlYW0sIElGREVfWE1MTm9kZSogcElOb2RlKSB7DQorICBDRkRFX1hNTE5vZGUqIHBOb2RlID0gKENGREVfWE1MTm9kZSopcElOb2RlOw0KKyAgRlhTWVNfYXNzZXJ0KHBYTUxTdHJlYW0gIT0gTlVMTCAmJiBwTm9kZSAhPSBOVUxMKTsNCisgIHN3aXRjaCAocE5vZGUtPkdldFR5cGUoKSkgew0KKyAgICBjYXNlIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3M7DQorICAgICAgQ0ZERV9YTUxJbnN0cnVjdGlvbiogcEluc3RydWN0aW9uID0gKENGREVfWE1MSW5zdHJ1Y3Rpb24qKXBOb2RlOw0KKyAgICAgIGlmIChwSW5zdHJ1Y3Rpb24tPm1fd3NUYXJnZXQuQ29tcGFyZU5vQ2FzZShMInhtbCIpID09IDApIHsNCisgICAgICAgIHdzID0gTCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiOw0KKyAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSBwWE1MU3RyZWFtLT5HZXRDb2RlUGFnZSgpOw0KKyAgICAgICAgaWYgKHdDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEYxNkxFKSB7DQorICAgICAgICAgIHdzICs9IEwiVVRGLTE2IjsNCisgICAgICAgIH0gZWxzZSBpZiAod0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2QkUpIHsNCisgICAgICAgICAgd3MgKz0gTCJVVEYtMTZiZSI7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1fcFJvb3QtPkRlbGV0ZUNoaWxkcmVuKCk7DQorICAgICAgICAgIHdzICs9IEwiVVRGLTgiOw0KICAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKG1fcFJvb3QgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIG1fcFJvb3QtPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICBtX3BSb290ID0gTlVMTDsNCisgICAgICAgIHdzICs9IEwiXCI/PiI7DQorICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB3cy5Gb3JtYXQoTCI8PyVzIiwgKGNvbnN0IEZYX1dDSEFSKilwSW5zdHJ1Y3Rpb24tPm1fd3NUYXJnZXQpOw0KKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIGF0dHJpYnV0ZXMgPSBwSW5zdHJ1Y3Rpb24tPm1fQXR0cmlidXRlczsNCisgICAgICAgIGludDMyX3QgaSwgaUNvdW50ID0gYXR0cmlidXRlcy5HZXRTaXplKCk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgICAgICAgIHdzID0gTCIgIjsNCisgICAgICAgICAgd3MgKz0gYXR0cmlidXRlc1tpXTsNCisgICAgICAgICAgd3MgKz0gTCI9XCIiOw0KKyAgICAgICAgICB3c1ZhbHVlID0gYXR0cmlidXRlc1tpICsgMV07DQorICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIiYiLCBMIiZhbXA7Iik7DQorICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsNCisgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiPiIsIEwiJmd0OyIpOw0KKyAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcJyIsIEwiJmFwb3M7Iik7DQorICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsNCisgICAgICAgICAgd3MgKz0gd3NWYWx1ZTsNCisgICAgICAgICAgd3MgKz0gTCJcIiI7DQorICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQogICAgICAgICB9DQotICAgIH0NCi0gICAgUmVsZWFzZVBhcnNlcigpOw0KLX0NCi12b2lkIENGREVfWE1MRG9jOjpSZWxlYXNlUGFyc2VyKCkNCi17DQotICAgIGlmIChtX3BYTUxQYXJzZXIgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wWE1MUGFyc2VyLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BYTUxQYXJzZXIgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3BTeW50YXhQYXJzZXIgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wU3ludGF4UGFyc2VyLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BTeW50YXhQYXJzZXIgPSBOVUxMOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ0ZERV9YTUxEb2M6OkxvYWRYTUwoSUZYX1N0cmVhbSAqcFhNTFN0cmVhbSwgaW50MzJfdCBpWE1MUGxhbmVTaXplICwgaW50MzJfdCBpVGV4dERhdGFTaXplICwgRkRFX0xQWE1MUkVBREVSSEFORExFUiBwSGFuZGxlciApDQotew0KLSAgICBpZiAocFhNTFN0cmVhbSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgUmVzZXQoVFJVRSk7DQotICAgIGlYTUxQbGFuZVNpemUgPSBpWE1MUGxhbmVTaXplIC8gMTAyNDsNCi0gICAgaWYgKGlYTUxQbGFuZVNpemUgPCAxKSB7DQotICAgICAgICBpWE1MUGxhbmVTaXplID0gMTsNCi0gICAgfQ0KLSAgICBpWE1MUGxhbmVTaXplICo9IDEwMjQ7DQotICAgIGlmIChpWE1MUGxhbmVTaXplIDwgNDA5Nikgew0KLSAgICAgICAgaVhNTFBsYW5lU2l6ZSA9IDQwOTY7DQotICAgIH0NCi0gICAgaVRleHREYXRhU2l6ZSA9IGlUZXh0RGF0YVNpemUgLyAxMjg7DQotICAgIGlmIChpVGV4dERhdGFTaXplIDwgMSkgew0KLSAgICAgICAgaVRleHREYXRhU2l6ZSA9IDE7DQotICAgIH0NCi0gICAgaVRleHREYXRhU2l6ZSAqPSAxMjg7DQotICAgIGlmIChpVGV4dERhdGFTaXplIDwgMTI4KSB7DQotICAgICAgICBpVGV4dERhdGFTaXplID0gMTI4Ow0KLSAgICB9DQotICAgIG1fcFN0cmVhbSA9IHBYTUxTdHJlYW07DQotICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gbV9wU3RyZWFtLT5HZXRDb2RlUGFnZSgpOw0KLSAgICBpZiAod0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2TEUgJiYgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2QkUgJiYgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjgpIHsNCi0gICAgICAgIG1fcFN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7DQotICAgIH0NCi0gICAgbV9wU3ludGF4UGFyc2VyID0gSUZERV9YTUxTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KLSAgICBpZiAobV9wU3ludGF4UGFyc2VyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX3BTeW50YXhQYXJzZXItPkluaXQobV9wU3RyZWFtLCBpWE1MUGxhbmVTaXplLCBpVGV4dERhdGFTaXplKTsNCi0gICAgaWYgKHBIYW5kbGVyID09IE5VTEwpIHsNCi0gICAgICAgIG1fcFhNTFBhcnNlciA9IG5ldyBDRkRFX1hNTERPTVBhcnNlcihtX3BSb290LCBtX3BTeW50YXhQYXJzZXIpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wWE1MUGFyc2VyID0gbmV3IENGREVfWE1MU0FYUGFyc2VyKHBIYW5kbGVyLCBtX3BTeW50YXhQYXJzZXIpOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BYTUxQYXJzZXIgIT0gTlVMTDsNCi19DQotRlhfQk9PTCBDRkRFX1hNTERvYzo6TG9hZFhNTChJRkRFX1hNTFBhcnNlciAqcFhNTFBhcnNlcikNCi17DQotICAgIGlmIChwWE1MUGFyc2VyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBSZXNldChUUlVFKTsNCi0gICAgbV9wWE1MUGFyc2VyID0gcFhNTFBhcnNlcjsNCi0gICAgcmV0dXJuIG1fcFhNTFBhcnNlciAhPSBOVUxMOw0KLX0NCi1pbnQzMl90IENGREVfWE1MRG9jOjpEb0xvYWQoSUZYX1BhdXNlICpwUGF1c2UpDQotew0KLSAgICBpZiAobV9pU3RhdHVzID49IDEwMCkgew0KLSAgICAgICAgcmV0dXJuIG1faVN0YXR1czsNCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQobV9wWE1MUGFyc2VyICE9IE5VTEwpOw0KLSAgICByZXR1cm4gbV9pU3RhdHVzID0gbV9wWE1MUGFyc2VyLT5Eb1BhcnNlcihwUGF1c2UpOw0KLX0NCi12b2lkIENGREVfWE1MRG9jOjpDbG9zZVhNTCgpDQotew0KLSAgICBSZWxlYXNlUGFyc2VyKCk7DQotfQ0KLXZvaWQgQ0ZERV9YTUxEb2M6OlNhdmVYTUxOb2RlKElGWF9TdHJlYW0gKnBYTUxTdHJlYW0sIElGREVfWE1MTm9kZSAqcElOb2RlKQ0KLXsNCi0gICAgQ0ZERV9YTUxOb2RlICpwTm9kZSA9IChDRkRFX1hNTE5vZGUqKXBJTm9kZTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBYTUxTdHJlYW0gIT0gTlVMTCAmJiBwTm9kZSAhPSBOVUxMKTsNCi0gICAgc3dpdGNoIChwTm9kZS0+R2V0VHlwZSgpKSB7DQotICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOiB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KLSAgICAgICAgICAgICAgICBDRkRFX1hNTEluc3RydWN0aW9uICpwSW5zdHJ1Y3Rpb24gPSAoQ0ZERV9YTUxJbnN0cnVjdGlvbiopcE5vZGU7DQotICAgICAgICAgICAgICAgIGlmIChwSW5zdHJ1Y3Rpb24tPm1fd3NUYXJnZXQuQ29tcGFyZU5vQ2FzZShMInhtbCIpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzID0gTCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiOw0KLSAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSBwWE1MU3RyZWFtLT5HZXRDb2RlUGFnZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEYxNkxFKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCJVVEYtMTYiOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiVVRGLTE2YmUiOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3cyArPSBMIlVURi04IjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHdzICs9IEwiXCI/PiI7DQotICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgd3MuRm9ybWF0KEwiPD8lcyIsIChjb25zdCBGWF9XQ0hBUiopcEluc3RydWN0aW9uLT5tX3dzVGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5ICZhdHRyaWJ1dGVzID0gcEluc3RydWN0aW9uLT5tX0F0dHJpYnV0ZXM7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGksIGlDb3VudCA9IGF0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzID0gTCIgIjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3cyArPSBhdHRyaWJ1dGVzW2ldOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiPVwiIjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlID0gYXR0cmlidXRlc1tpICsgMV07DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiJiIsIEwiJmFtcDsiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI8IiwgTCImbHQ7Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiPiIsIEwiJmd0OyIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwnIiwgTCImYXBvczsiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcIiIsIEwiJnF1b3Q7Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3MgKz0gd3NWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3cyArPSBMIlwiIjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSAmdGFyZ2V0ZGF0YSA9IHBJbnN0cnVjdGlvbi0+bV9UYXJnZXREYXRhOw0KLSAgICAgICAgICAgICAgICAgICAgaUNvdW50ID0gdGFyZ2V0ZGF0YS5HZXRTaXplKCk7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3cyA9IEwiIFwiIjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3cyArPSB0YXJnZXRkYXRhW2ldOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzICs9IEwiXCIiOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB3cyA9IEwiPz4iOw0KLSAgICAgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDogew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3czsNCi0gICAgICAgICAgICAgICAgd3MgPSBMIjwiOw0KLSAgICAgICAgICAgICAgICB3cyArPSAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5tX3dzVGFnOw0KLSAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5ICZhdHRyaWJ1dGVzID0gKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+bV9BdHRyaWJ1dGVzOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IGF0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KLSAgICAgICAgICAgICAgICAgICAgd3MgPSBMIiAiOw0KLSAgICAgICAgICAgICAgICAgICAgd3MgKz0gYXR0cmlidXRlc1tpXTsNCi0gICAgICAgICAgICAgICAgICAgIHdzICs9IEwiPVwiIjsNCi0gICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgPSBhdHRyaWJ1dGVzW2kgKyAxXTsNCi0gICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIiYiLCBMIiZhbXA7Iik7DQotICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI8IiwgTCImbHQ7Iik7DQotICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7DQotICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcJyIsIEwiJmFwb3M7Iik7DQotICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcIiIsIEwiJnF1b3Q7Iik7DQotICAgICAgICAgICAgICAgICAgICB3cyArPSB3c1ZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgd3MgKz0gTCJcIiI7DQotICAgICAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChwTm9kZS0+bV9wQ2hpbGQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgd3MgPSBMIlxuLz4iOw0KLSAgICAgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzID0gTCJcbj4iOw0KLSAgICAgICAgICAgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSAqcENoaWxkID0gcE5vZGUtPm1fcENoaWxkOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZVhNTE5vZGUocFhNTFN0cmVhbSwgKElGREVfWE1MTm9kZSopcENoaWxkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB3cyA9IEwiPC8iOw0KLSAgICAgICAgICAgICAgICAgICAgd3MgKz0gKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+bV93c1RhZzsNCi0gICAgICAgICAgICAgICAgICAgIHdzICs9IEwiXG4+IjsNCi0gICAgICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6IHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSAoKENGREVfWE1MVGV4dCopcE5vZGUpLT5tX3dzVGV4dDsNCi0gICAgICAgICAgICAgICAgd3MuUmVwbGFjZShMIiYiLCBMIiZhbXA7Iik7DQotICAgICAgICAgICAgICAgIHdzLlJlcGxhY2UoTCI8IiwgTCImbHQ7Iik7DQotICAgICAgICAgICAgICAgIHdzLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7DQotICAgICAgICAgICAgICAgIHdzLlJlcGxhY2UoTCJcJyIsIEwiJmFwb3M7Iik7DQotICAgICAgICAgICAgICAgIHdzLlJlcGxhY2UoTCJcIiIsIEwiJnF1b3Q7Iik7DQotICAgICAgICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9DaGFyRGF0YTogew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3cyA9IEwiPCFbQ0RBVEFbIjsNCi0gICAgICAgICAgICAgICAgd3MgKz0gKChDRkRFX1hNTENoYXJEYXRhKilwTm9kZSktPm1fd3NDaGFyRGF0YTsNCi0gICAgICAgICAgICAgICAgd3MgKz0gTCJdXT4iOw0KLSAgICAgICAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRkRFX1hNTE5PREVfVW5rbm93bjoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi19DQotdm9pZCBDRkRFX1hNTERvYzo6U2F2ZVhNTChJRlhfU3RyZWFtICpwWE1MU3RyZWFtLCBGWF9CT09MIGJTYXZlQk9NKQ0KLXsNCi0gICAgaWYgKHBYTUxTdHJlYW0gPT0gTlVMTCB8fCBwWE1MU3RyZWFtID09IG1fcFN0cmVhbSkgew0KLSAgICAgICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIDApOw0KLSAgICAgICAgcFhNTFN0cmVhbSA9IG1fcFN0cmVhbTsNCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQoKHBYTUxTdHJlYW0tPkdldEFjY2Vzc01vZGVzKCkgJiBGWF9TVFJFQU1BQ0NFU1NfVGV4dCkgIT0gMCk7DQotICAgIEZYU1lTX2Fzc2VydCgocFhNTFN0cmVhbS0+R2V0QWNjZXNzTW9kZXMoKSAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7DQotICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gcFhNTFN0cmVhbS0+R2V0Q29kZVBhZ2UoKTsNCi0gICAgaWYgKHdDb2RlUGFnZSAhPSBGWF9DT0RFUEFHRV9VVEYxNkxFICYmIHdDb2RlUGFnZSAhPSBGWF9DT0RFUEFHRV9VVEYxNkJFICYmIHdDb2RlUGFnZSAhPSBGWF9DT0RFUEFHRV9VVEY4KSB7DQotICAgICAgICB3Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEY4Ow0KLSAgICAgICAgcFhNTFN0cmVhbS0+U2V0Q29kZVBhZ2Uod0NvZGVQYWdlKTsNCi0gICAgfQ0KLSAgICBpZiAoYlNhdmVCT00pIHsNCi0gICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKEwiXHhGRUZGIiwgMSk7DQotICAgIH0NCi0gICAgQ0ZERV9YTUxOb2RlICpwTm9kZSA9IG1fcFJvb3QtPm1fcENoaWxkOw0KLSAgICB3aGlsZSAocE5vZGUgIT0gTlVMTCkgew0KLSAgICAgICAgU2F2ZVhNTE5vZGUocFhNTFN0cmVhbSwgKElGREVfWE1MTm9kZSopcE5vZGUpOw0KLSAgICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wTmV4dDsNCi0gICAgfQ0KLSAgICBpZiAocFhNTFN0cmVhbSA9PSBtX3BTdHJlYW0pIHsNCi0gICAgICAgIGludDMyX3QgaVBvcyA9IHBYTUxTdHJlYW0tPkdldFBvc2l0aW9uKCk7DQotICAgICAgICBwWE1MU3RyZWFtLT5TZXRMZW5ndGgoaVBvcyk7DQotICAgIH0NCi19DQotQ0ZERV9YTUxET01QYXJzZXI6OkNGREVfWE1MRE9NUGFyc2VyKENGREVfWE1MTm9kZSAqcFJvb3QsIElGREVfWE1MU3ludGF4UGFyc2VyICpwUGFyc2VyKQ0KLSAgICA6IG1fcFJvb3QocFJvb3QpDQotICAgICwgbV9wUGFyc2VyKHBQYXJzZXIpDQotICAgICwgbV9wUGFyZW50KHBSb290KQ0KLSAgICAsIG1fcENoaWxkKE5VTEwpDQotICAgICwgbV9Ob2RlU3RhY2soMTYpDQotICAgICwgbV93czEoKQ0KLSAgICAsIG1fd3MyKCkNCi17DQotICAgIG1fTm9kZVN0YWNrLlB1c2gobV9wUGFyZW50KTsNCi19DQotQ0ZERV9YTUxET01QYXJzZXI6On5DRkRFX1hNTERPTVBhcnNlcigpDQotew0KLSAgICBtX05vZGVTdGFjay5SZW1vdmVBbGwoKTsNCi0gICAgbV93czEuRW1wdHkoKTsNCi0gICAgbV93czIuRW1wdHkoKTsNCi19DQotaW50MzJfdCBDRkRFX1hNTERPTVBhcnNlcjo6RG9QYXJzZXIoSUZYX1BhdXNlICpwUGF1c2UpDQotew0KLSAgICBGWF9EV09SRCBkd1JldDsNCi0gICAgaW50MzJfdCBpQ291bnQgPSAwOw0KLSAgICB3aGlsZSAoVFJVRSkgew0KLSAgICAgICAgZHdSZXQgPSBtX3BQYXJzZXItPkRvU3ludGF4UGFyc2UoKTsNCi0gICAgICAgIHN3aXRjaCAoZHdSZXQpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25PcGVuOg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25DbG9zZToNCi0gICAgICAgICAgICAgICAgaWYgKG1fcENoaWxkLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgIGR3UmV0ID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudE9wZW46DQotICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRCcmVhazoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRDbG9zZToNCi0gICAgICAgICAgICAgICAgaWYgKG1fcENoaWxkLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUYWdOYW1lKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgKChDRkRFX1hNTEVsZW1lbnQqKW1fcENoaWxkKS0+R2V0VGFnTmFtZShtX3dzMik7DQotICAgICAgICAgICAgICAgIGlmIChtX3dzMS5HZXRMZW5ndGgoKSA+IDAgJiYgbV93czEuQ29tcGFyZShtX3dzMikgIT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9Ob2RlU3RhY2suUG9wKCk7DQotICAgICAgICAgICAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPCAxKSB7DQotICAgICAgICAgICAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BQYXJlbnQgPSAoQ0ZERV9YTUxOb2RlKikqbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCi0gICAgICAgICAgICAgICAgaUNvdW50Kys7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXROYW1lOg0KLSAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUobV93czEpOw0KLSAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IG5ldyBDRkRFX1hNTEluc3RydWN0aW9uKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KLSAgICAgICAgICAgICAgICBtX3dzMS5FbXB0eSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFnTmFtZToNCi0gICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUYWdOYW1lKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZERV9YTUxFbGVtZW50KG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KLSAgICAgICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKG1fcENoaWxkKTsNCi0gICAgICAgICAgICAgICAgbV9wUGFyZW50ID0gbV9wQ2hpbGQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaU5hbWU6DQotICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0QXR0cmlidXRlTmFtZShtX3dzMSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaVZhbHVlOg0KLSAgICAgICAgICAgICAgICBpZiAobV9wQ2hpbGQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MyKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcENoaWxkLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgKChDRkRFX1hNTEVsZW1lbnQqKW1fcENoaWxkKS0+U2V0U3RyaW5nKG1fd3MxLCBtX3dzMik7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgKChDRkRFX1hNTEluc3RydWN0aW9uKiltX3BDaGlsZCktPlNldFN0cmluZyhtX3dzMSwgbV93czIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fd3MxLkVtcHR5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UZXh0Og0KLSAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRleHREYXRhKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZERV9YTUxUZXh0KG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KLSAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0NEYXRhOg0KLSAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRleHREYXRhKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZERV9YTUxDaGFyRGF0YShtX3dzMSk7DQotICAgICAgICAgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCi0gICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBtX3BQYXJlbnQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOg0KLSAgICAgICAgICAgICAgICBpZiAobV9wQ2hpbGQgPT0gTlVMTCB8fCBtX3BDaGlsZC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoIW1fd3MxLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgKChDRkRFX1hNTEluc3RydWN0aW9uKiltX3BDaGlsZCktPkFwcGVuZERhdGEobV93czEpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0VGFyZ2V0RGF0YShtX3dzMSk7DQotICAgICAgICAgICAgICAgICgoQ0ZERV9YTUxJbnN0cnVjdGlvbiopbV9wQ2hpbGQpLT5BcHBlbmREYXRhKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgbV93czEuRW1wdHkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5JiB0YXJnZXRkYXRhID0gcEluc3RydWN0aW9uLT5tX1RhcmdldERhdGE7DQorICAgICAgICBpQ291bnQgPSB0YXJnZXRkYXRhLkdldFNpemUoKTsNCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgICB3cyA9IEwiIFwiIjsNCisgICAgICAgICAgd3MgKz0gdGFyZ2V0ZGF0YVtpXTsNCisgICAgICAgICAgd3MgKz0gTCJcIiI7DQorICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQogICAgICAgICB9DQotICAgICAgICBpZiAoZHdSZXQgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvciB8fCBkd1JldCA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUykgew0KLSAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgd3MgPSBMIj8+IjsNCisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9YTUxOT0RFX0VsZW1lbnQ6IHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3czsNCisgICAgICB3cyA9IEwiPCI7DQorICAgICAgd3MgKz0gKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+bV93c1RhZzsNCisgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIGF0dHJpYnV0ZXMgPSAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5tX0F0dHJpYnV0ZXM7DQorICAgICAgaW50MzJfdCBpQ291bnQgPSBhdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgICAgICB3cyA9IEwiICI7DQorICAgICAgICB3cyArPSBhdHRyaWJ1dGVzW2ldOw0KKyAgICAgICAgd3MgKz0gTCI9XCIiOw0KKyAgICAgICAgd3NWYWx1ZSA9IGF0dHJpYnV0ZXNbaSArIDFdOw0KKyAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiJiIsIEwiJmFtcDsiKTsNCisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsNCisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIj4iLCBMIiZndDsiKTsNCisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwnIiwgTCImYXBvczsiKTsNCisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsNCisgICAgICAgIHdzICs9IHdzVmFsdWU7DQorICAgICAgICB3cyArPSBMIlwiIjsNCisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwTm9kZS0+bV9wQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgd3MgPSBMIlxuLz4iOw0KKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgd3MgPSBMIlxuPiI7DQorICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBwTm9kZS0+bV9wQ2hpbGQ7DQorICAgICAgICB3aGlsZSAocENoaWxkICE9IE5VTEwpIHsNCisgICAgICAgICAgU2F2ZVhNTE5vZGUocFhNTFN0cmVhbSwgKElGREVfWE1MTm9kZSopcENoaWxkKTsNCisgICAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KICAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBQYXVzZSAhPSBOVUxMICYmIGlDb3VudCA+IDUwMCAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCi0gICAgICAgICAgICBicmVhazsNCisgICAgICAgIHdzID0gTCI8LyI7DQorICAgICAgICB3cyArPSAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5tX3dzVGFnOw0KKyAgICAgICAgd3MgKz0gTCJcbj4iOw0KKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzID0gKChDRkRFX1hNTFRleHQqKXBOb2RlKS0+bV93c1RleHQ7DQorICAgICAgd3MuUmVwbGFjZShMIiYiLCBMIiZhbXA7Iik7DQorICAgICAgd3MuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsNCisgICAgICB3cy5SZXBsYWNlKEwiPiIsIEwiJmd0OyIpOw0KKyAgICAgIHdzLlJlcGxhY2UoTCJcJyIsIEwiJmFwb3M7Iik7DQorICAgICAgd3MuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsNCisgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSBMIjwhW0NEQVRBWyI7DQorICAgICAgd3MgKz0gKChDRkRFX1hNTENoYXJEYXRhKilwTm9kZSktPm1fd3NDaGFyRGF0YTsNCisgICAgICB3cyArPSBMIl1dPiI7DQorICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfWE1MTk9ERV9Vbmtub3duOg0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCit2b2lkIENGREVfWE1MRG9jOjpTYXZlWE1MKElGWF9TdHJlYW0qIHBYTUxTdHJlYW0sIEZYX0JPT0wgYlNhdmVCT00pIHsNCisgIGlmIChwWE1MU3RyZWFtID09IE5VTEwgfHwgcFhNTFN0cmVhbSA9PSBtX3BTdHJlYW0pIHsNCisgICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIDApOw0KKyAgICBwWE1MU3RyZWFtID0gbV9wU3RyZWFtOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KChwWE1MU3RyZWFtLT5HZXRBY2Nlc3NNb2RlcygpICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpICE9IDApOw0KKyAgRlhTWVNfYXNzZXJ0KChwWE1MU3RyZWFtLT5HZXRBY2Nlc3NNb2RlcygpICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSAhPSAwKTsNCisgIEZYX1dPUkQgd0NvZGVQYWdlID0gcFhNTFN0cmVhbS0+R2V0Q29kZVBhZ2UoKTsNCisgIGlmICh3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGMTZMRSAmJiB3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGMTZCRSAmJg0KKyAgICAgIHdDb2RlUGFnZSAhPSBGWF9DT0RFUEFHRV9VVEY4KSB7DQorICAgIHdDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjg7DQorICAgIHBYTUxTdHJlYW0tPlNldENvZGVQYWdlKHdDb2RlUGFnZSk7DQorICB9DQorICBpZiAoYlNhdmVCT00pIHsNCisgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcoTCJceEZFRkYiLCAxKTsNCisgIH0NCisgIENGREVfWE1MTm9kZSogcE5vZGUgPSBtX3BSb290LT5tX3BDaGlsZDsNCisgIHdoaWxlIChwTm9kZSAhPSBOVUxMKSB7DQorICAgIFNhdmVYTUxOb2RlKHBYTUxTdHJlYW0sIChJRkRFX1hNTE5vZGUqKXBOb2RlKTsNCisgICAgcE5vZGUgPSBwTm9kZS0+bV9wTmV4dDsNCisgIH0NCisgIGlmIChwWE1MU3RyZWFtID09IG1fcFN0cmVhbSkgew0KKyAgICBpbnQzMl90IGlQb3MgPSBwWE1MU3RyZWFtLT5HZXRQb3NpdGlvbigpOw0KKyAgICBwWE1MU3RyZWFtLT5TZXRMZW5ndGgoaVBvcyk7DQorICB9DQorfQ0KK0NGREVfWE1MRE9NUGFyc2VyOjpDRkRFX1hNTERPTVBhcnNlcihDRkRFX1hNTE5vZGUqIHBSb290LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTFN5bnRheFBhcnNlciogcFBhcnNlcikNCisgICAgOiBtX3BSb290KHBSb290KSwNCisgICAgICBtX3BQYXJzZXIocFBhcnNlciksDQorICAgICAgbV9wUGFyZW50KHBSb290KSwNCisgICAgICBtX3BDaGlsZChOVUxMKSwNCisgICAgICBtX05vZGVTdGFjaygxNiksDQorICAgICAgbV93czEoKSwNCisgICAgICBtX3dzMigpIHsNCisgIG1fTm9kZVN0YWNrLlB1c2gobV9wUGFyZW50KTsNCit9DQorQ0ZERV9YTUxET01QYXJzZXI6On5DRkRFX1hNTERPTVBhcnNlcigpIHsNCisgIG1fTm9kZVN0YWNrLlJlbW92ZUFsbCgpOw0KKyAgbV93czEuRW1wdHkoKTsNCisgIG1fd3MyLkVtcHR5KCk7DQorfQ0KK2ludDMyX3QgQ0ZERV9YTUxET01QYXJzZXI6OkRvUGFyc2VyKElGWF9QYXVzZSogcFBhdXNlKSB7DQorICBGWF9EV09SRCBkd1JldDsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGR3UmV0ID0gbV9wUGFyc2VyLT5Eb1N5bnRheFBhcnNlKCk7DQorICAgIHN3aXRjaCAoZHdSZXQpIHsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25PcGVuOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0luc3RydWN0aW9uQ2xvc2U6DQorICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KKyAgICAgICAgbV9wQ2hpbGQgPSBtX3BQYXJlbnQ7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudE9wZW46DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRCcmVhazoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50Q2xvc2U6DQorICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgIGR3UmV0ID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBtX3BQYXJzZXItPkdldFRhZ05hbWUobV93czEpOw0KKyAgICAgICAgKChDRkRFX1hNTEVsZW1lbnQqKW1fcENoaWxkKS0+R2V0VGFnTmFtZShtX3dzMik7DQorICAgICAgICBpZiAobV93czEuR2V0TGVuZ3RoKCkgPiAwICYmIG1fd3MxLkNvbXBhcmUobV93czIpICE9IDApIHsNCisgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG1fTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgICAgaWYgKG1fTm9kZVN0YWNrLkdldFNpemUoKSA8IDEpIHsNCisgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFBhcmVudCA9IChDRkRFX1hNTE5vZGUqKSptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCisgICAgICAgIGlDb3VudCsrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldE5hbWU6DQorICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUobV93czEpOw0KKyAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZERV9YTUxJbnN0cnVjdGlvbihtX3dzMSk7DQorICAgICAgICBtX3BQYXJlbnQtPkluc2VydENoaWxkTm9kZShtX3BDaGlsZCk7DQorICAgICAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhZ05hbWU6DQorICAgICAgICBtX3BQYXJzZXItPkdldFRhZ05hbWUobV93czEpOw0KKyAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZERV9YTUxFbGVtZW50KG1fd3MxKTsNCisgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCisgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gobV9wQ2hpbGQpOw0KKyAgICAgICAgbV9wUGFyZW50ID0gbV9wQ2hpbGQ7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlOYW1lOg0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MxKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaVZhbHVlOg0KKyAgICAgICAgaWYgKG1fcENoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFBhcnNlci0+R2V0QXR0cmlidXRlTmFtZShtX3dzMik7DQorICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICgoQ0ZERV9YTUxFbGVtZW50KiltX3BDaGlsZCktPlNldFN0cmluZyhtX3dzMSwgbV93czIpOw0KKyAgICAgICAgfSBlbHNlIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICgoQ0ZERV9YTUxJbnN0cnVjdGlvbiopbV9wQ2hpbGQpLT5TZXRTdHJpbmcobV93czEsIG1fd3MyKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fd3MxLkVtcHR5KCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGV4dDoNCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGV4dERhdGEobV93czEpOw0KKyAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZERV9YTUxUZXh0KG1fd3MxKTsNCisgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCisgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0NEYXRhOg0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUZXh0RGF0YShtX3dzMSk7DQorICAgICAgICBtX3BDaGlsZCA9IG5ldyBDRkRFX1hNTENoYXJEYXRhKG1fd3MxKTsNCisgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCisgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE6DQorICAgICAgICBpZiAobV9wQ2hpbGQgPT0gTlVMTCB8fA0KKyAgICAgICAgICAgIG1fcENoaWxkLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghbV93czEuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICgoQ0ZERV9YTUxJbnN0cnVjdGlvbiopbV9wQ2hpbGQpLT5BcHBlbmREYXRhKG1fd3MxKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGFyZ2V0RGF0YShtX3dzMSk7DQorICAgICAgICAoKENGREVfWE1MSW5zdHJ1Y3Rpb24qKW1fcENoaWxkKS0+QXBwZW5kRGF0YShtX3dzMSk7DQorICAgICAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBtX3BQYXJzZXItPkdldFN0YXR1cygpOw0KLX0NCi1DRkRFX1hNTFNBWFBhcnNlcjo6Q0ZERV9YTUxTQVhQYXJzZXIoRkRFX0xQWE1MUkVBREVSSEFORExFUiBwSGFuZGxlciwgSUZERV9YTUxTeW50YXhQYXJzZXIgKnBQYXJzZXIpDQotICAgIDogbV9wSGFuZGxlcihwSGFuZGxlcikNCi0gICAgLCBtX3BQYXJzZXIocFBhcnNlcikNCi0gICAgLCBtX1RhZ1N0YWNrKDE2KQ0KLSAgICAsIG1fcFRhZ1RvcChOVUxMKQ0KLSAgICAsIG1fd3MxKCkNCi0gICAgLCBtX3dzMigpDQotew0KLX0NCi1DRkRFX1hNTFNBWFBhcnNlcjo6fkNGREVfWE1MU0FYUGFyc2VyKCkNCi17DQotICAgIG1fVGFnU3RhY2suUmVtb3ZlQWxsKCk7DQotICAgIG1fd3MxLkVtcHR5KCk7DQotICAgIG1fd3MyLkVtcHR5KCk7DQotfQ0KLWludDMyX3QgQ0ZERV9YTUxTQVhQYXJzZXI6OkRvUGFyc2VyKElGWF9QYXVzZSAqcFBhdXNlKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdSZXQgPSAwOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIHdoaWxlIChUUlVFKSB7DQotICAgICAgICBkd1JldCA9IG1fcFBhcnNlci0+RG9TeW50YXhQYXJzZSgpOw0KLSAgICAgICAgc3dpdGNoIChkd1JldCkgew0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50QnJlYWs6DQotICAgICAgICAgICAgICAgIGlmIChtX3BUYWdUb3AgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKG1fcFRhZ1RvcC0+ZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wSGFuZGxlci0+T25UYWdCcmVhayhtX3BIYW5kbGVyLCBtX3BUYWdUb3AtPndzVGFnTmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRDbG9zZToNCi0gICAgICAgICAgICAgICAgaWYgKG1fcFRhZ1RvcCA9PSBOVUxMIHx8IG1fcFRhZ1RvcC0+ZVR5cGUgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUYWdOYW1lKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1fd3MxLkdldExlbmd0aCgpID4gMCAmJiBtX3dzMS5Db21wYXJlKG1fcFRhZ1RvcC0+d3NUYWdOYW1lKSAhPSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX3dzMS5HZXRMZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0JyZWFrKG1fcEhhbmRsZXIsIG1fcFRhZ1RvcC0+d3NUYWdOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0Nsb3NlKG1fcEhhbmRsZXIsIG1fcFRhZ1RvcC0+d3NUYWdOYW1lKTsNCi0gICAgICAgICAgICAgICAgUG9wKCk7DQotICAgICAgICAgICAgICAgIGlDb3VudCsrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0TmFtZTogew0KLSAgICAgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUYXJnZXROYW1lKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgICAgIENGREVfWE1MVEFHCXhtbFRhZzsNCi0gICAgICAgICAgICAgICAgICAgIHhtbFRhZy53c1RhZ05hbWUgPSBtX3dzMTsNCi0gICAgICAgICAgICAgICAgICAgIHhtbFRhZy5lVHlwZSA9IEZERV9YTUxOT0RFX0luc3RydWN0aW9uOw0KLSAgICAgICAgICAgICAgICAgICAgUHVzaCh4bWxUYWcpOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wSGFuZGxlci0+T25UYWdFbnRlcihtX3BIYW5kbGVyLCBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbiwgbV9wVGFnVG9wLT53c1RhZ05hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgbV93czEuRW1wdHkoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFnTmFtZTogew0KLSAgICAgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUYXJnZXROYW1lKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgICAgIENGREVfWE1MVEFHCXhtbFRhZzsNCi0gICAgICAgICAgICAgICAgICAgIHhtbFRhZy53c1RhZ05hbWUgPSBtX3dzMTsNCi0gICAgICAgICAgICAgICAgICAgIHhtbFRhZy5lVHlwZSA9IEZERV9YTUxOT0RFX0VsZW1lbnQ7DQotICAgICAgICAgICAgICAgICAgICBQdXNoKHhtbFRhZyk7DQotICAgICAgICAgICAgICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0VudGVyKG1fcEhhbmRsZXIsIEZERV9YTUxOT0RFX0VsZW1lbnQsIG1fcFRhZ1RvcC0+d3NUYWdOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlOYW1lOg0KLSAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUobV93czEpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlWYWx1ZToNCi0gICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MyKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcFRhZ1RvcCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAobV9wVGFnVG9wLT5lVHlwZSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BIYW5kbGVyLT5PbkF0dHJpYnV0ZShtX3BIYW5kbGVyLCBtX3dzMSwgbV93czIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fd3MxLkVtcHR5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19DRGF0YToNCi0gICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUZXh0RGF0YShtX3dzMSk7DQotICAgICAgICAgICAgICAgIG1fcEhhbmRsZXItPk9uRGF0YShtX3BIYW5kbGVyLCBGREVfWE1MTk9ERV9DaGFyRGF0YSwgbV93czEpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGV4dDoNCi0gICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUZXh0RGF0YShtX3dzMSk7DQotICAgICAgICAgICAgICAgIG1fcEhhbmRsZXItPk9uRGF0YShtX3BIYW5kbGVyLCBGREVfWE1MTk9ERV9UZXh0LCBtX3dzMSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOg0KLSAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldERhdGEobV93czEpOw0KLSAgICAgICAgICAgICAgICBtX3BIYW5kbGVyLT5PbkRhdGEobV9wSGFuZGxlciwgRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24sIG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgbV93czEuRW1wdHkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZHdSZXQgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvciB8fCBkd1JldCA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUykgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBQYXVzZSAhPSBOVUxMICYmIGlDb3VudCA+IDUwMCAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCisgICAgaWYgKGR3UmV0ID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3IgfHwNCisgICAgICAgIGR3UmV0ID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIG1fcFBhcnNlci0+R2V0U3RhdHVzKCk7DQorICAgIGlmIChwUGF1c2UgIT0gTlVMTCAmJiBpQ291bnQgPiA1MDAgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBtX3BQYXJzZXItPkdldFN0YXR1cygpOw0KIH0NCi1pbmxpbmUgdm9pZCBDRkRFX1hNTFNBWFBhcnNlcjo6UHVzaChjb25zdCBDRkRFX1hNTFRBRyAmeG1sVGFnKQ0KLXsNCi0gICAgbV9UYWdTdGFjay5QdXNoKHhtbFRhZyk7DQotICAgIG1fcFRhZ1RvcCA9IG1fVGFnU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KK0NGREVfWE1MU0FYUGFyc2VyOjpDRkRFX1hNTFNBWFBhcnNlcihGREVfTFBYTUxSRUFERVJIQU5ETEVSIHBIYW5kbGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTFN5bnRheFBhcnNlciogcFBhcnNlcikNCisgICAgOiBtX3BIYW5kbGVyKHBIYW5kbGVyKSwNCisgICAgICBtX3BQYXJzZXIocFBhcnNlciksDQorICAgICAgbV9UYWdTdGFjaygxNiksDQorICAgICAgbV9wVGFnVG9wKE5VTEwpLA0KKyAgICAgIG1fd3MxKCksDQorICAgICAgbV93czIoKSB7fQ0KK0NGREVfWE1MU0FYUGFyc2VyOjp+Q0ZERV9YTUxTQVhQYXJzZXIoKSB7DQorICBtX1RhZ1N0YWNrLlJlbW92ZUFsbCgpOw0KKyAgbV93czEuRW1wdHkoKTsNCisgIG1fd3MyLkVtcHR5KCk7DQogfQ0KLWlubGluZSB2b2lkIENGREVfWE1MU0FYUGFyc2VyOjpQb3AoKQ0KLXsNCi0gICAgbV9UYWdTdGFjay5Qb3AoKTsNCi0gICAgbV9wVGFnVG9wID0gbV9UYWdTdGFjay5HZXRUb3BFbGVtZW50KCk7DQoraW50MzJfdCBDRkRFX1hNTFNBWFBhcnNlcjo6RG9QYXJzZXIoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIEZYX0RXT1JEIGR3UmV0ID0gMDsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGR3UmV0ID0gbV9wUGFyc2VyLT5Eb1N5bnRheFBhcnNlKCk7DQorICAgIHN3aXRjaCAoZHdSZXQpIHsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudEJyZWFrOg0KKyAgICAgICAgaWYgKG1fcFRhZ1RvcCA9PSBOVUxMKSB7DQorICAgICAgICAgIGR3UmV0ID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9wVGFnVG9wLT5lVHlwZSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgIG1fcEhhbmRsZXItPk9uVGFnQnJlYWsobV9wSGFuZGxlciwgbV9wVGFnVG9wLT53c1RhZ05hbWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRDbG9zZToNCisgICAgICAgIGlmIChtX3BUYWdUb3AgPT0gTlVMTCB8fCBtX3BUYWdUb3AtPmVUeXBlICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGFnTmFtZShtX3dzMSk7DQorICAgICAgICBpZiAobV93czEuR2V0TGVuZ3RoKCkgPiAwICYmIG1fd3MxLkNvbXBhcmUobV9wVGFnVG9wLT53c1RhZ05hbWUpICE9IDApIHsNCisgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0gZWxzZSBpZiAobV93czEuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0JyZWFrKG1fcEhhbmRsZXIsIG1fcFRhZ1RvcC0+d3NUYWdOYW1lKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcEhhbmRsZXItPk9uVGFnQ2xvc2UobV9wSGFuZGxlciwgbV9wVGFnVG9wLT53c1RhZ05hbWUpOw0KKyAgICAgICAgUG9wKCk7DQorICAgICAgICBpQ291bnQrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXROYW1lOiB7DQorICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUobV93czEpOw0KKyAgICAgICAgQ0ZERV9YTUxUQUcgeG1sVGFnOw0KKyAgICAgICAgeG1sVGFnLndzVGFnTmFtZSA9IG1fd3MxOw0KKyAgICAgICAgeG1sVGFnLmVUeXBlID0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb247DQorICAgICAgICBQdXNoKHhtbFRhZyk7DQorICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0VudGVyKG1fcEhhbmRsZXIsIEZERV9YTUxOT0RFX0luc3RydWN0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUYWdUb3AtPndzVGFnTmFtZSk7DQorICAgICAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhZ05hbWU6IHsNCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGFyZ2V0TmFtZShtX3dzMSk7DQorICAgICAgICBDRkRFX1hNTFRBRyB4bWxUYWc7DQorICAgICAgICB4bWxUYWcud3NUYWdOYW1lID0gbV93czE7DQorICAgICAgICB4bWxUYWcuZVR5cGUgPSBGREVfWE1MTk9ERV9FbGVtZW50Ow0KKyAgICAgICAgUHVzaCh4bWxUYWcpOw0KKyAgICAgICAgbV9wSGFuZGxlci0+T25UYWdFbnRlcihtX3BIYW5kbGVyLCBGREVfWE1MTk9ERV9FbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUYWdUb3AtPndzVGFnTmFtZSk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlOYW1lOg0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUYXJnZXROYW1lKG1fd3MxKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaVZhbHVlOg0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MyKTsNCisgICAgICAgIGlmIChtX3BUYWdUb3AgPT0gTlVMTCkgew0KKyAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcFRhZ1RvcC0+ZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICBtX3BIYW5kbGVyLT5PbkF0dHJpYnV0ZShtX3BIYW5kbGVyLCBtX3dzMSwgbV93czIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV93czEuRW1wdHkoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19DRGF0YToNCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGV4dERhdGEobV93czEpOw0KKyAgICAgICAgbV9wSGFuZGxlci0+T25EYXRhKG1fcEhhbmRsZXIsIEZERV9YTUxOT0RFX0NoYXJEYXRhLCBtX3dzMSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGV4dDoNCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGV4dERhdGEobV93czEpOw0KKyAgICAgICAgbV9wSGFuZGxlci0+T25EYXRhKG1fcEhhbmRsZXIsIEZERV9YTUxOT0RFX1RleHQsIG1fd3MxKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOg0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUYXJnZXREYXRhKG1fd3MxKTsNCisgICAgICAgIG1fcEhhbmRsZXItPk9uRGF0YShtX3BIYW5kbGVyLCBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbiwgbV93czEpOw0KKyAgICAgICAgbV93czEuRW1wdHkoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoZHdSZXQgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvciB8fA0KKyAgICAgICAgZHdSZXQgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAocFBhdXNlICE9IE5VTEwgJiYgaUNvdW50ID4gNTAwICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gbV9wUGFyc2VyLT5HZXRTdGF0dXMoKTsNCit9DQoraW5saW5lIHZvaWQgQ0ZERV9YTUxTQVhQYXJzZXI6OlB1c2goY29uc3QgQ0ZERV9YTUxUQUcmIHhtbFRhZykgew0KKyAgbV9UYWdTdGFjay5QdXNoKHhtbFRhZyk7DQorICBtX3BUYWdUb3AgPSBtX1RhZ1N0YWNrLkdldFRvcEVsZW1lbnQoKTsNCit9DQoraW5saW5lIHZvaWQgQ0ZERV9YTUxTQVhQYXJzZXI6OlBvcCgpIHsNCisgIG1fVGFnU3RhY2suUG9wKCk7DQorICBtX3BUYWdUb3AgPSBtX1RhZ1N0YWNrLkdldFRvcEVsZW1lbnQoKTsNCiB9DQogI2lmZGVmIF9GREVfQkxPQ0tfQlVGRkVSDQogQ0ZERV9CbG9ja0J1ZmZlcjo6Q0ZERV9CbG9ja0J1ZmZlcihpbnQzMl90IGlBbGxvY1N0ZXApDQogICAgIDogbV9pQWxsb2NTdGVwKGlBbGxvY1N0ZXApLA0KICAgICAgIG1faVN0YXJ0UG9zaXRpb24oMCksDQogICAgICAgbV9pQnVmZmVyU2l6ZSgwKSwNCi0gICAgICBtX2lEYXRhTGVuZ3RoKDApDQotew0KKyAgICAgIG1faURhdGFMZW5ndGgoMCkge30NCitDRkRFX0Jsb2NrQnVmZmVyOjp+Q0ZERV9CbG9ja0J1ZmZlcigpIHsNCisgIENsZWFyQnVmZmVyKCk7DQogfQ0KLUNGREVfQmxvY2tCdWZmZXI6On5DRkRFX0Jsb2NrQnVmZmVyKCkNCi17DQotICAgIENsZWFyQnVmZmVyKCk7DQotfQ0KLUZYX1dDSEFSKiBDRkRFX0Jsb2NrQnVmZmVyOjpHZXRBdmFpbGFibGVCbG9jayhpbnQzMl90JiBpSW5kZXhJbkJsb2NrKQ0KLXsNCitGWF9XQ0hBUiogQ0ZERV9CbG9ja0J1ZmZlcjo6R2V0QXZhaWxhYmxlQmxvY2soaW50MzJfdCYgaUluZGV4SW5CbG9jaykgew0KKyAgaUluZGV4SW5CbG9jayA9IDA7DQorICBpbnQzMl90IGlCbG9ja051bSA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQorICBpZiAoaUJsb2NrTnVtID09IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IGlSZWFsSW5kZXggPSBtX2lTdGFydFBvc2l0aW9uICsgbV9pRGF0YUxlbmd0aDsNCisgIEZYX1dDSEFSKiBwRGF0YUJsb2NrID0gTlVMTDsNCisgIGlmIChpUmVhbEluZGV4ID09IG1faUJ1ZmZlclNpemUpIHsNCisgICAgRlhfV0NIQVIqIHBCbG9jayA9IChGWF9XQ0hBUiopRkRFX0FsbG9jKG1faUFsbG9jU3RlcCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBpZiAocEJsb2NrKSB7DQorICAgICAgbV9CbG9ja0FycmF5LkFkZChwQmxvY2spOw0KKyAgICAgIG1faUJ1ZmZlclNpemUgKz0gbV9pQWxsb2NTdGVwOw0KKyAgICB9DQogICAgIGlJbmRleEluQmxvY2sgPSAwOw0KLSAgICBpbnQzMl90IGlCbG9ja051bSA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQotICAgIGlmIChpQmxvY2tOdW0gPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaW50MzJfdCBpUmVhbEluZGV4ID0gbV9pU3RhcnRQb3NpdGlvbiArIG1faURhdGFMZW5ndGg7DQotICAgIEZYX1dDSEFSKiBwRGF0YUJsb2NrID0gTlVMTDsNCi0gICAgaWYoaVJlYWxJbmRleCA9PSBtX2lCdWZmZXJTaXplKSB7DQotICAgICAgICBGWF9XQ0hBUiogcEJsb2NrID0gKEZYX1dDSEFSKilGREVfQWxsb2MobV9pQWxsb2NTdGVwICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgICAgICBpZiAocEJsb2NrKSB7DQotICAgICAgICAgICAgbV9CbG9ja0FycmF5LkFkZChwQmxvY2spOw0KLSAgICAgICAgICAgIG1faUJ1ZmZlclNpemUgKz0gbV9pQWxsb2NTdGVwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaUluZGV4SW5CbG9jayA9IDA7DQotICAgICAgICBwRGF0YUJsb2NrID0gcEJsb2NrOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaW50MzJfdCBpQmxvY2tJbmRleCA9IGlSZWFsSW5kZXggLyBtX2lBbGxvY1N0ZXA7DQotICAgICAgICBpbnQzMl90IGlJbm5lckluZGV4ID0gaVJlYWxJbmRleCAlIG1faUFsbG9jU3RlcDsNCi0gICAgICAgIGlJbmRleEluQmxvY2sgPSBpSW5uZXJJbmRleDsNCi0gICAgICAgIHBEYXRhQmxvY2sgPSAoRlhfV0NIQVIqKW1fQmxvY2tBcnJheVtpQmxvY2tJbmRleF07DQotICAgIH0NCi0gICAgcmV0dXJuIHBEYXRhQmxvY2s7DQotfQ0KLUZYX0JPT0wgQ0ZERV9CbG9ja0J1ZmZlcjo6SW5pdEJ1ZmZlcihpbnQzMl90IGlCdWZmZXJTaXplKQ0KLXsNCi0gICAgQ2xlYXJCdWZmZXIoKTsNCi0gICAgaW50MzJfdCBpTnVtT2ZCbG9jayA9IChpQnVmZmVyU2l6ZSAtIDEpIC8gbV9pQWxsb2NTdGVwICsgMTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaU51bU9mQmxvY2s7IGkrKykgew0KLSAgICAgICAgRlhfV0NIQVIqIHBCbG9ja0J1ZmZlciA9IChGWF9XQ0hBUiopRkRFX0FsbG9jKG1faUFsbG9jU3RlcCAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICAgICAgaWYgKHBCbG9ja0J1ZmZlciA9PSBOVUxMKSB7DQotICAgICAgICAgICAgQ2xlYXJCdWZmZXIoKTsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBtX0Jsb2NrQXJyYXkuQWRkKHBCbG9ja0J1ZmZlcik7DQotICAgIH0NCi0gICAgbV9pQnVmZmVyU2l6ZSA9IGlOdW1PZkJsb2NrICogbV9pQWxsb2NTdGVwOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDRkRFX0Jsb2NrQnVmZmVyOjpTZXRUZXh0Q2hhcihpbnQzMl90IGlJbmRleCwgRlhfV0NIQVIgY2gpDQotew0KLSAgICBpZiAoaUluZGV4IDwgMCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaVJlYWxJbmRleCA9IG1faVN0YXJ0UG9zaXRpb24gKyBpSW5kZXg7DQorICAgIHBEYXRhQmxvY2sgPSBwQmxvY2s7DQorICB9IGVsc2Ugew0KICAgICBpbnQzMl90IGlCbG9ja0luZGV4ID0gaVJlYWxJbmRleCAvIG1faUFsbG9jU3RlcDsNCiAgICAgaW50MzJfdCBpSW5uZXJJbmRleCA9IGlSZWFsSW5kZXggJSBtX2lBbGxvY1N0ZXA7DQotICAgIGludDMyX3QgaUJsb2NrU2l6ZSA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQotICAgIGlmIChpQmxvY2tJbmRleCA+PSBpQmxvY2tTaXplKSB7DQotICAgICAgICBpbnQzMl90IGlOZXdCbG9ja3MgPSBpQmxvY2tJbmRleCAtIGlCbG9ja1NpemUgKyAxOw0KLSAgICAgICAgZG8gew0KLSAgICAgICAgICAgIEZYX1dDSEFSKiBwQmxvY2sgPSAoRlhfV0NIQVIqKUZERV9BbGxvYyhtX2lBbGxvY1N0ZXAgKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgICAgICAgICBpZiAoIXBCbG9jaykgew0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fQmxvY2tBcnJheS5BZGQocEJsb2NrKTsNCi0gICAgICAgICAgICBtX2lCdWZmZXJTaXplICs9IG1faUFsbG9jU3RlcDsNCi0gICAgICAgIH0gd2hpbGUgKC0taU5ld0Jsb2Nrcyk7DQotICAgIH0NCi0gICAgRlhfV0NIQVIqIHBUZXh0RGF0YSA9IChGWF9XQ0hBUiopbV9CbG9ja0FycmF5W2lCbG9ja0luZGV4XTsNCi0gICAgKihwVGV4dERhdGEgKyBpSW5uZXJJbmRleCkgPSBjaDsNCi0gICAgaWYgKG1faURhdGFMZW5ndGggPD0gaUluZGV4KSB7DQotICAgICAgICBtX2lEYXRhTGVuZ3RoID0gaUluZGV4ICsgMTsNCi0gICAgfQ0KKyAgICBpSW5kZXhJbkJsb2NrID0gaUlubmVySW5kZXg7DQorICAgIHBEYXRhQmxvY2sgPSAoRlhfV0NIQVIqKW1fQmxvY2tBcnJheVtpQmxvY2tJbmRleF07DQorICB9DQorICByZXR1cm4gcERhdGFCbG9jazsNCiB9DQotaW50MzJfdCBDRkRFX0Jsb2NrQnVmZmVyOjpEZWxldGVUZXh0Q2hhcnMoaW50MzJfdCBpQ291bnQsIEZYX0JPT0wgYkRpcmVjdGlvbiApDQotew0KLSAgICBpZiAoaUNvdW50IDw9IDApIHsNCi0gICAgICAgIHJldHVybiBtX2lEYXRhTGVuZ3RoOw0KK0ZYX0JPT0wgQ0ZERV9CbG9ja0J1ZmZlcjo6SW5pdEJ1ZmZlcihpbnQzMl90IGlCdWZmZXJTaXplKSB7DQorICBDbGVhckJ1ZmZlcigpOw0KKyAgaW50MzJfdCBpTnVtT2ZCbG9jayA9IChpQnVmZmVyU2l6ZSAtIDEpIC8gbV9pQWxsb2NTdGVwICsgMTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlOdW1PZkJsb2NrOyBpKyspIHsNCisgICAgRlhfV0NIQVIqIHBCbG9ja0J1ZmZlciA9DQorICAgICAgICAoRlhfV0NIQVIqKUZERV9BbGxvYyhtX2lBbGxvY1N0ZXAgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgaWYgKHBCbG9ja0J1ZmZlciA9PSBOVUxMKSB7DQorICAgICAgQ2xlYXJCdWZmZXIoKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgaWYgKGlDb3VudCA+PSBtX2lEYXRhTGVuZ3RoKSB7DQotICAgICAgICBSZXNldChGQUxTRSk7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpZiAoYkRpcmVjdGlvbikgew0KLSAgICAgICAgbV9pU3RhcnRQb3NpdGlvbiArPSBpQ291bnQ7DQotICAgICAgICBtX2lEYXRhTGVuZ3RoIC09IGlDb3VudDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1faURhdGFMZW5ndGggLT0gaUNvdW50Ow0KLSAgICB9DQorICAgIG1fQmxvY2tBcnJheS5BZGQocEJsb2NrQnVmZmVyKTsNCisgIH0NCisgIG1faUJ1ZmZlclNpemUgPSBpTnVtT2ZCbG9jayAqIG1faUFsbG9jU3RlcDsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGREVfQmxvY2tCdWZmZXI6OlNldFRleHRDaGFyKGludDMyX3QgaUluZGV4LCBGWF9XQ0hBUiBjaCkgew0KKyAgaWYgKGlJbmRleCA8IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpUmVhbEluZGV4ID0gbV9pU3RhcnRQb3NpdGlvbiArIGlJbmRleDsNCisgIGludDMyX3QgaUJsb2NrSW5kZXggPSBpUmVhbEluZGV4IC8gbV9pQWxsb2NTdGVwOw0KKyAgaW50MzJfdCBpSW5uZXJJbmRleCA9IGlSZWFsSW5kZXggJSBtX2lBbGxvY1N0ZXA7DQorICBpbnQzMl90IGlCbG9ja1NpemUgPSBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKGlCbG9ja0luZGV4ID49IGlCbG9ja1NpemUpIHsNCisgICAgaW50MzJfdCBpTmV3QmxvY2tzID0gaUJsb2NrSW5kZXggLSBpQmxvY2tTaXplICsgMTsNCisgICAgZG8gew0KKyAgICAgIEZYX1dDSEFSKiBwQmxvY2sgPSAoRlhfV0NIQVIqKUZERV9BbGxvYyhtX2lBbGxvY1N0ZXAgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICBpZiAoIXBCbG9jaykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBtX0Jsb2NrQXJyYXkuQWRkKHBCbG9jayk7DQorICAgICAgbV9pQnVmZmVyU2l6ZSArPSBtX2lBbGxvY1N0ZXA7DQorICAgIH0gd2hpbGUgKC0taU5ld0Jsb2Nrcyk7DQorICB9DQorICBGWF9XQ0hBUiogcFRleHREYXRhID0gKEZYX1dDSEFSKiltX0Jsb2NrQXJyYXlbaUJsb2NrSW5kZXhdOw0KKyAgKihwVGV4dERhdGEgKyBpSW5uZXJJbmRleCkgPSBjaDsNCisgIGlmIChtX2lEYXRhTGVuZ3RoIDw9IGlJbmRleCkgew0KKyAgICBtX2lEYXRhTGVuZ3RoID0gaUluZGV4ICsgMTsNCisgIH0NCit9DQoraW50MzJfdCBDRkRFX0Jsb2NrQnVmZmVyOjpEZWxldGVUZXh0Q2hhcnMoaW50MzJfdCBpQ291bnQsIEZYX0JPT0wgYkRpcmVjdGlvbikgew0KKyAgaWYgKGlDb3VudCA8PSAwKSB7DQogICAgIHJldHVybiBtX2lEYXRhTGVuZ3RoOw0KKyAgfQ0KKyAgaWYgKGlDb3VudCA+PSBtX2lEYXRhTGVuZ3RoKSB7DQorICAgIFJlc2V0KEZBTFNFKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAoYkRpcmVjdGlvbikgew0KKyAgICBtX2lTdGFydFBvc2l0aW9uICs9IGlDb3VudDsNCisgICAgbV9pRGF0YUxlbmd0aCAtPSBpQ291bnQ7DQorICB9IGVsc2Ugew0KKyAgICBtX2lEYXRhTGVuZ3RoIC09IGlDb3VudDsNCisgIH0NCisgIHJldHVybiBtX2lEYXRhTGVuZ3RoOw0KIH0NCi12b2lkICBDRkRFX0Jsb2NrQnVmZmVyOjpHZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NUZXh0RGF0YSwgaW50MzJfdCBpU3RhcnQsIGludDMyX3QgaUxlbmd0aCkgY29uc3QNCi17DQotICAgIHdzVGV4dERhdGEuRW1wdHkoKTsNCi0gICAgaW50MzJfdCBpTWF5YmVEYXRhTGVuZ3RoID0gbV9pQnVmZmVyU2l6ZSAtIDEgLSBtX2lTdGFydFBvc2l0aW9uOw0KLSAgICBpZiAoaVN0YXJ0IDwgMCB8fCBpU3RhcnQgPiBpTWF5YmVEYXRhTGVuZ3RoKSB7DQotICAgICAgICByZXR1cm47DQordm9pZCBDRkRFX0Jsb2NrQnVmZmVyOjpHZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NUZXh0RGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSBjb25zdCB7DQorICB3c1RleHREYXRhLkVtcHR5KCk7DQorICBpbnQzMl90IGlNYXliZURhdGFMZW5ndGggPSBtX2lCdWZmZXJTaXplIC0gMSAtIG1faVN0YXJ0UG9zaXRpb247DQorICBpZiAoaVN0YXJ0IDwgMCB8fCBpU3RhcnQgPiBpTWF5YmVEYXRhTGVuZ3RoKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChpTGVuZ3RoID09IC0xIHx8IGlMZW5ndGggPiBpTWF5YmVEYXRhTGVuZ3RoKSB7DQorICAgIGlMZW5ndGggPSBpTWF5YmVEYXRhTGVuZ3RoOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPD0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9XQ0hBUiogcEJ1ZiA9IHdzVGV4dERhdGEuR2V0QnVmZmVyKGlMZW5ndGgpOw0KKyAgaWYgKCFwQnVmKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaVN0YXJ0QmxvY2tJbmRleCA9IDA7DQorICBpbnQzMl90IGlTdGFydElubmVySW5kZXggPSAwOw0KKyAgVGV4dERhdGFJbmRleDJCdWZJbmRleChpU3RhcnQsIGlTdGFydEJsb2NrSW5kZXgsIGlTdGFydElubmVySW5kZXgpOw0KKyAgaW50MzJfdCBpRW5kQmxvY2tJbmRleCA9IDA7DQorICBpbnQzMl90IGlFbmRJbm5lckluZGV4ID0gMDsNCisgIFRleHREYXRhSW5kZXgyQnVmSW5kZXgoaVN0YXJ0ICsgaUxlbmd0aCwgaUVuZEJsb2NrSW5kZXgsIGlFbmRJbm5lckluZGV4KTsNCisgIGludDMyX3QgaVBvaW50ZXIgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSBpU3RhcnRCbG9ja0luZGV4OyBpIDw9IGlFbmRCbG9ja0luZGV4OyBpKyspIHsNCisgICAgaW50MzJfdCBpQnVmZmVyUG9pbnRlciA9IDA7DQorICAgIGludDMyX3QgaUNvcHlMZW5ndGggPSBtX2lBbGxvY1N0ZXA7DQorICAgIGlmIChpID09IGlTdGFydEJsb2NrSW5kZXgpIHsNCisgICAgICBpQ29weUxlbmd0aCAtPSBpU3RhcnRJbm5lckluZGV4Ow0KKyAgICAgIGlCdWZmZXJQb2ludGVyID0gaVN0YXJ0SW5uZXJJbmRleDsNCiAgICAgfQ0KLSAgICBpZiAoaUxlbmd0aCA9PSAtMSB8fCBpTGVuZ3RoID4gaU1heWJlRGF0YUxlbmd0aCkgew0KLSAgICAgICAgaUxlbmd0aCA9IGlNYXliZURhdGFMZW5ndGg7DQorICAgIGlmIChpID09IGlFbmRCbG9ja0luZGV4KSB7DQorICAgICAgaUNvcHlMZW5ndGggLT0gKChtX2lBbGxvY1N0ZXAgLSAxKSAtIGlFbmRJbm5lckluZGV4KTsNCiAgICAgfQ0KLSAgICBpZiAoaUxlbmd0aCA8PSAwKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfV0NIQVIqIHBCdWYgPSB3c1RleHREYXRhLkdldEJ1ZmZlcihpTGVuZ3RoKTsNCi0gICAgaWYgKCFwQnVmKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBpU3RhcnRCbG9ja0luZGV4ID0gMDsNCi0gICAgaW50MzJfdCBpU3RhcnRJbm5lckluZGV4ID0gMDsNCi0gICAgVGV4dERhdGFJbmRleDJCdWZJbmRleChpU3RhcnQsIGlTdGFydEJsb2NrSW5kZXgsIGlTdGFydElubmVySW5kZXgpOw0KLSAgICBpbnQzMl90IGlFbmRCbG9ja0luZGV4ID0gMDsNCi0gICAgaW50MzJfdCBpRW5kSW5uZXJJbmRleCA9IDA7DQotICAgIFRleHREYXRhSW5kZXgyQnVmSW5kZXgoaVN0YXJ0ICsgaUxlbmd0aCwgaUVuZEJsb2NrSW5kZXgsIGlFbmRJbm5lckluZGV4KTsNCi0gICAgaW50MzJfdCBpUG9pbnRlciA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gaVN0YXJ0QmxvY2tJbmRleDsgaSA8PSBpRW5kQmxvY2tJbmRleDsgaSsrKSB7DQotICAgICAgICBpbnQzMl90IGlCdWZmZXJQb2ludGVyID0gMDsNCi0gICAgICAgIGludDMyX3QgaUNvcHlMZW5ndGggPSBtX2lBbGxvY1N0ZXA7DQotICAgICAgICBpZiAoaSA9PSBpU3RhcnRCbG9ja0luZGV4KSB7DQotICAgICAgICAgICAgaUNvcHlMZW5ndGggLT0gaVN0YXJ0SW5uZXJJbmRleDsNCi0gICAgICAgICAgICBpQnVmZmVyUG9pbnRlciA9IGlTdGFydElubmVySW5kZXg7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaSA9PSBpRW5kQmxvY2tJbmRleCkgew0KLSAgICAgICAgICAgIGlDb3B5TGVuZ3RoIC09ICgobV9pQWxsb2NTdGVwIC0gMSkgLSBpRW5kSW5uZXJJbmRleCk7DQotICAgICAgICB9DQotICAgICAgICBGWF9XQ0hBUiogcEJsb2NrQnVmID0gKEZYX1dDSEFSKiltX0Jsb2NrQXJyYXlbaV07DQotICAgICAgICBGWFNZU19tZW1jcHkocEJ1ZiArIGlQb2ludGVyLCBwQmxvY2tCdWYgKyBpQnVmZmVyUG9pbnRlciwgaUNvcHlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgICAgIGlQb2ludGVyICs9IGlDb3B5TGVuZ3RoOw0KLSAgICB9DQotICAgIHdzVGV4dERhdGEuUmVsZWFzZUJ1ZmZlcihpTGVuZ3RoKTsNCisgICAgRlhfV0NIQVIqIHBCbG9ja0J1ZiA9IChGWF9XQ0hBUiopbV9CbG9ja0FycmF5W2ldOw0KKyAgICBGWFNZU19tZW1jcHkocEJ1ZiArIGlQb2ludGVyLCBwQmxvY2tCdWYgKyBpQnVmZmVyUG9pbnRlciwNCisgICAgICAgICAgICAgICAgIGlDb3B5TGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIGlQb2ludGVyICs9IGlDb3B5TGVuZ3RoOw0KKyAgfQ0KKyAgd3NUZXh0RGF0YS5SZWxlYXNlQnVmZmVyKGlMZW5ndGgpOw0KIH0NCi12b2lkIENGREVfQmxvY2tCdWZmZXI6OlRleHREYXRhSW5kZXgyQnVmSW5kZXgoY29uc3QgaW50MzJfdCBpSW5kZXgsIGludDMyX3QmIGlCbG9ja0luZGV4LCBpbnQzMl90JiBpSW5uZXJJbmRleCkgY29uc3QNCi17DQotICAgIEZYU1lTX2Fzc2VydChpSW5kZXggPj0gMCk7DQotICAgIGludDMyX3QgaVJlYWxJbmRleCA9IG1faVN0YXJ0UG9zaXRpb24gKyBpSW5kZXg7DQotICAgIGlCbG9ja0luZGV4ID0gaVJlYWxJbmRleCAvIG1faUFsbG9jU3RlcDsNCi0gICAgaUlubmVySW5kZXggPSBpUmVhbEluZGV4ICUgbV9pQWxsb2NTdGVwOw0KK3ZvaWQgQ0ZERV9CbG9ja0J1ZmZlcjo6VGV4dERhdGFJbmRleDJCdWZJbmRleChjb25zdCBpbnQzMl90IGlJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUJsb2NrSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbm5lckluZGV4KSBjb25zdCB7DQorICBGWFNZU19hc3NlcnQoaUluZGV4ID49IDApOw0KKyAgaW50MzJfdCBpUmVhbEluZGV4ID0gbV9pU3RhcnRQb3NpdGlvbiArIGlJbmRleDsNCisgIGlCbG9ja0luZGV4ID0gaVJlYWxJbmRleCAvIG1faUFsbG9jU3RlcDsNCisgIGlJbm5lckluZGV4ID0gaVJlYWxJbmRleCAlIG1faUFsbG9jU3RlcDsNCiB9DQotdm9pZCBDRkRFX0Jsb2NrQnVmZmVyOjpDbGVhckJ1ZmZlcigpDQotew0KLSAgICBtX2lCdWZmZXJTaXplID0gMDsNCi0gICAgaW50MzJfdCBpU2l6ZSA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCi0gICAgICAgIEZERV9GcmVlKG1fQmxvY2tBcnJheVtpXSk7DQotICAgICAgICBtX0Jsb2NrQXJyYXlbaV0gPSBOVUxMOw0KLSAgICB9DQotICAgIG1fQmxvY2tBcnJheS5SZW1vdmVBbGwoKTsNCit2b2lkIENGREVfQmxvY2tCdWZmZXI6OkNsZWFyQnVmZmVyKCkgew0KKyAgbV9pQnVmZmVyU2l6ZSA9IDA7DQorICBpbnQzMl90IGlTaXplID0gbV9CbG9ja0FycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgRkRFX0ZyZWUobV9CbG9ja0FycmF5W2ldKTsNCisgICAgbV9CbG9ja0FycmF5W2ldID0gTlVMTDsNCisgIH0NCisgIG1fQmxvY2tBcnJheS5SZW1vdmVBbGwoKTsNCiB9DQogI2VuZGlmDQotSUZERV9YTUxTeW50YXhQYXJzZXIqIElGREVfWE1MU3ludGF4UGFyc2VyOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBDRkRFX1hNTFN5bnRheFBhcnNlcjsNCitJRkRFX1hNTFN5bnRheFBhcnNlciogSUZERV9YTUxTeW50YXhQYXJzZXI6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZERV9YTUxTeW50YXhQYXJzZXI7DQogfQ0KICNpZmRlZiBfRkRFX0JMT0NLX0JVRkZFUg0KIENGREVfWE1MU3ludGF4UGFyc2VyOjpDRkRFX1hNTFN5bnRheFBhcnNlcigpDQotICAgIDogbV9wU3RyZWFtKE5VTEwpDQotICAgICwgbV9pWE1MUGxhbmVTaXplKC0xKQ0KLSAgICAsIG1faUN1cnJlbnRQb3MoMCkNCi0gICAgLCBtX2lDdXJyZW50Tm9kZU51bSgtMSkNCi0gICAgLCBtX2lMYXN0Tm9kZU51bSgtMSkNCi0gICAgLCBtX2lQYXJzZWRDaGFycygwKQ0KLSAgICAsIG1faVBhcnNlZEJ5dGVzKDApDQotICAgICwgbV9wQnVmZmVyKE5VTEwpDQotICAgICwgbV9pQnVmZmVyQ2hhcnMoMCkNCi0gICAgLCBtX2JFT1MoRkFMU0UpDQotICAgICwgbV9wU3RhcnQoTlVMTCkNCi0gICAgLCBtX3BFbmQoTlVMTCkNCi0gICAgLCBtX1hNTE5vZGVTdGFjaygxNikNCi0gICAgLCBtX2R3U3RhdHVzKEZERV9YTUxTWU5UQVhTVEFUVVNfTm9uZSkNCi0gICAgLCBtX2R3TW9kZShGREVfWE1MU1lOVEFYTU9ERV9UZXh0KQ0KLSAgICAsIG1fd1F1b3RhdGlvbk1hcmsoMCkNCi0gICAgLCBtX0Jsb2NrQnVmZmVyKCkNCi0gICAgLCBtX3BDdXJyZW50QmxvY2soTlVMTCkNCi0gICAgLCBtX2lJbmRleEluQmxvY2soMCkNCi0gICAgLCBtX2lEYXRhTGVuZ3RoKG1fQmxvY2tCdWZmZXIuR2V0RGF0YUxlbmd0aFJlZigpKQ0KLSAgICAsIG1faUFsbG9jU3RlcChtX0Jsb2NrQnVmZmVyLkdldEFsbG9jU3RlcCgpKQ0KLSAgICAsIG1faVRleHREYXRhTGVuZ3RoKDApDQotICAgICwgbV9pRW50aXR5U3RhcnQoLTEpDQotICAgICwgbV9Ta2lwU3RhY2soMTYpDQotew0KLSAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSAtMTsNCi0gICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX1Vua25vd247DQorICAgIDogbV9wU3RyZWFtKE5VTEwpLA0KKyAgICAgIG1faVhNTFBsYW5lU2l6ZSgtMSksDQorICAgICAgbV9pQ3VycmVudFBvcygwKSwNCisgICAgICBtX2lDdXJyZW50Tm9kZU51bSgtMSksDQorICAgICAgbV9pTGFzdE5vZGVOdW0oLTEpLA0KKyAgICAgIG1faVBhcnNlZENoYXJzKDApLA0KKyAgICAgIG1faVBhcnNlZEJ5dGVzKDApLA0KKyAgICAgIG1fcEJ1ZmZlcihOVUxMKSwNCisgICAgICBtX2lCdWZmZXJDaGFycygwKSwNCisgICAgICBtX2JFT1MoRkFMU0UpLA0KKyAgICAgIG1fcFN0YXJ0KE5VTEwpLA0KKyAgICAgIG1fcEVuZChOVUxMKSwNCisgICAgICBtX1hNTE5vZGVTdGFjaygxNiksDQorICAgICAgbV9kd1N0YXR1cyhGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUpLA0KKyAgICAgIG1fZHdNb2RlKEZERV9YTUxTWU5UQVhNT0RFX1RleHQpLA0KKyAgICAgIG1fd1F1b3RhdGlvbk1hcmsoMCksDQorICAgICAgbV9CbG9ja0J1ZmZlcigpLA0KKyAgICAgIG1fcEN1cnJlbnRCbG9jayhOVUxMKSwNCisgICAgICBtX2lJbmRleEluQmxvY2soMCksDQorICAgICAgbV9pRGF0YUxlbmd0aChtX0Jsb2NrQnVmZmVyLkdldERhdGFMZW5ndGhSZWYoKSksDQorICAgICAgbV9pQWxsb2NTdGVwKG1fQmxvY2tCdWZmZXIuR2V0QWxsb2NTdGVwKCkpLA0KKyAgICAgIG1faVRleHREYXRhTGVuZ3RoKDApLA0KKyAgICAgIG1faUVudGl0eVN0YXJ0KC0xKSwNCisgICAgICBtX1NraXBTdGFjaygxNikgew0KKyAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQorICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCiB9DQotdm9pZCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6SW5pdChJRlhfU3RyZWFtICpwU3RyZWFtLCBpbnQzMl90IGlYTUxQbGFuZVNpemUsIGludDMyX3QgaVRleHREYXRhU2l6ZSApDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wU3RyZWFtID09IE5VTEwgJiYgbV9wQnVmZmVyID09IE5VTEwpOw0KLSAgICBGWFNZU19hc3NlcnQocFN0cmVhbSAhPSBOVUxMICYmIGlYTUxQbGFuZVNpemUgPiAwKTsNCi0gICAgaW50MzJfdCBpU3RyZWFtTGVuZ3RoID0gcFN0cmVhbS0+R2V0TGVuZ3RoKCk7DQotICAgIEZYU1lTX2Fzc2VydChpU3RyZWFtTGVuZ3RoID4gMCk7DQotICAgIG1fcFN0cmVhbSA9IHBTdHJlYW07DQotICAgIG1faVhNTFBsYW5lU2l6ZSA9IEZYX01JTihpWE1MUGxhbmVTaXplLCBpU3RyZWFtTGVuZ3RoKTsNCi0gICAgdWludDhfdCBib21bNF07DQotICAgIG1faUN1cnJlbnRQb3MgPSBtX3BTdHJlYW0tPkdldEJPTShib20pOw0KLSAgICBGWFNZU19hc3NlcnQobV9wQnVmZmVyID09IE5VTEwpOw0KLSAgICBtX3BCdWZmZXIgPSAoRlhfV0NIQVIqKUZERV9BbGxvYyhtX2lYTUxQbGFuZVNpemUgKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgbV9wU3RhcnQgPSBtX3BFbmQgPSBtX3BCdWZmZXI7DQotICAgIEZYU1lTX2Fzc2VydCghbV9CbG9ja0J1ZmZlci5Jc0luaXRpYWxpemVkKCkpOw0KLSAgICBtX0Jsb2NrQnVmZmVyLkluaXRCdWZmZXIoKTsNCit2b2lkIENGREVfWE1MU3ludGF4UGFyc2VyOjpJbml0KElGWF9TdHJlYW0qIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlYTUxQbGFuZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUZXh0RGF0YVNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BTdHJlYW0gPT0gTlVMTCAmJiBtX3BCdWZmZXIgPT0gTlVMTCk7DQorICBGWFNZU19hc3NlcnQocFN0cmVhbSAhPSBOVUxMICYmIGlYTUxQbGFuZVNpemUgPiAwKTsNCisgIGludDMyX3QgaVN0cmVhbUxlbmd0aCA9IHBTdHJlYW0tPkdldExlbmd0aCgpOw0KKyAgRlhTWVNfYXNzZXJ0KGlTdHJlYW1MZW5ndGggPiAwKTsNCisgIG1fcFN0cmVhbSA9IHBTdHJlYW07DQorICBtX2lYTUxQbGFuZVNpemUgPSBGWF9NSU4oaVhNTFBsYW5lU2l6ZSwgaVN0cmVhbUxlbmd0aCk7DQorICB1aW50OF90IGJvbVs0XTsNCisgIG1faUN1cnJlbnRQb3MgPSBtX3BTdHJlYW0tPkdldEJPTShib20pOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcEJ1ZmZlciA9PSBOVUxMKTsNCisgIG1fcEJ1ZmZlciA9IChGWF9XQ0hBUiopRkRFX0FsbG9jKG1faVhNTFBsYW5lU2l6ZSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgbV9wU3RhcnQgPSBtX3BFbmQgPSBtX3BCdWZmZXI7DQorICBGWFNZU19hc3NlcnQoIW1fQmxvY2tCdWZmZXIuSXNJbml0aWFsaXplZCgpKTsNCisgIG1fQmxvY2tCdWZmZXIuSW5pdEJ1ZmZlcigpOw0KKyAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgbV9pUGFyc2VkQnl0ZXMgPSBtX2lQYXJzZWRDaGFycyA9IDA7DQorICBtX2lCdWZmZXJDaGFycyA9IDA7DQorfQ0KK0ZYX0RXT1JEIENGREVfWE1MU3ludGF4UGFyc2VyOjpEb1N5bnRheFBhcnNlKCkgew0KKyAgaWYgKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvciB8fA0KKyAgICAgIG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MpIHsNCisgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICB9DQorICBGWFNZU19hc3NlcnQobV9wU3RyZWFtICE9IE5VTEwgJiYgbV9wQnVmZmVyICE9IE5VTEwgJiYNCisgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLklzSW5pdGlhbGl6ZWQoKSk7DQorICBpbnQzMl90IGlTdHJlYW1MZW5ndGggPSBtX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpUG9zOw0KKyAgRlhfV0NIQVIgY2g7DQorICBGWF9EV09SRCBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfTm9uZTsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGlmIChtX3BTdGFydCA+PSBtX3BFbmQpIHsNCisgICAgICBpZiAobV9iRU9TIHx8IG1faUN1cnJlbnRQb3MgPj0gaVN0cmVhbUxlbmd0aCkgew0KKyAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TOw0KKyAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgfQ0KKyAgICAgIG1faVBhcnNlZENoYXJzICs9IChtX3BFbmQgLSBtX3BCdWZmZXIpOw0KKyAgICAgIG1faVBhcnNlZEJ5dGVzID0gbV9pQ3VycmVudFBvczsNCisgICAgICBtX3BTdHJlYW0tPkxvY2soKTsNCisgICAgICBpZiAobV9wU3RyZWFtLT5HZXRQb3NpdGlvbigpICE9IG1faUN1cnJlbnRQb3MpIHsNCisgICAgICAgIG1fcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBtX2lDdXJyZW50UG9zKTsNCisgICAgICB9DQorICAgICAgbV9pQnVmZmVyQ2hhcnMgPQ0KKyAgICAgICAgICBtX3BTdHJlYW0tPlJlYWRTdHJpbmcobV9wQnVmZmVyLCBtX2lYTUxQbGFuZVNpemUsIG1fYkVPUyk7DQorICAgICAgaVBvcyA9IG1fcFN0cmVhbS0+R2V0UG9zaXRpb24oKTsNCisgICAgICBtX3BTdHJlYW0tPlVubG9jaygpOw0KKyAgICAgIGlmIChtX2lCdWZmZXJDaGFycyA8IDEpIHsNCisgICAgICAgIG1faUN1cnJlbnRQb3MgPSBpU3RyZWFtTGVuZ3RoOw0KKyAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TOw0KKyAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgfQ0KKyAgICAgIG1faUN1cnJlbnRQb3MgPSBpUG9zOw0KKyAgICAgIG1fcFN0YXJ0ID0gbV9wQnVmZmVyOw0KKyAgICAgIG1fcEVuZCA9IG1fcEJ1ZmZlciArIG1faUJ1ZmZlckNoYXJzOw0KKyAgICB9DQorICAgIHdoaWxlIChtX3BTdGFydCA8IG1fcEVuZCkgew0KKyAgICAgIGNoID0gKm1fcFN0YXJ0Ow0KKyAgICAgIHN3aXRjaCAobV9kd01vZGUpIHsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfVGV4dDoNCisgICAgICAgICAgaWYgKGNoID09IEwnPCcpIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA+IDApIHsNCisgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCisgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgPSAtMTsNCisgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UZXh0Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9Ob2RlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBQYXJzZVRleHRDaGFyKGNoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfTm9kZToNCisgICAgICAgICAgaWYgKGNoID09IEwnIScpIHsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfU2tpcENvbW1lbnRPckRlY2w7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCcvJykgew0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUVsZW1lbnQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCc/Jykgew0KKyAgICAgICAgICAgIG1faUxhc3ROb2RlTnVtKys7DQorICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb247DQorICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUHVzaChtX0N1ck5vZGUpOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQ7DQorICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0luc3RydWN0aW9uT3BlbjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2lMYXN0Tm9kZU51bSsrOw0KKyAgICAgICAgICAgIG1faUN1cnJlbnROb2RlTnVtID0gbV9pTGFzdE5vZGVOdW07DQorICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gbV9pTGFzdE5vZGVOdW07DQorICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX0VsZW1lbnQ7DQorICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUHVzaChtX0N1ck5vZGUpOw0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFnOw0KKyAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50T3BlbjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0Og0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UYWc6DQorICAgICAgICAgIGlmICghRkRFX0lzWE1MTmFtZUNoYXIoY2gsIG1faURhdGFMZW5ndGggPCAxKSkgew0KKyAgICAgICAgICAgIGlmIChtX2lEYXRhTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KKyAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOw0KKyAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0NCisgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgICBpZiAobV9kd01vZGUgIT0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0KSB7DQorICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYWdOYW1lOw0KKyAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldE5hbWU7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpTmFtZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCisgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlOYW1lOg0KKyAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA8IDEgJiYgRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICghRkRFX0lzWE1MTmFtZUNoYXIoY2gsIG1faURhdGFMZW5ndGggPCAxKSkgew0KKyAgICAgICAgICAgIGlmIChtX2lEYXRhTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gTCc+JyB8fCBjaCA9PSBMJy8nKSB7DQorICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9CcmVha0VsZW1lbnQ7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gTCc/Jykgew0KKyAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VJbnN0cnVjdGlvbjsNCisgICAgICAgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGlmIChtX0N1ck5vZGUuZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnPScgJiYgIUZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7DQorICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPQ0KKyAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlFcXVhbFNpZ247DQorICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlOYW1lOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KKyAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0NCisgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOw0KKyAgICAgICAgICAgIG1faURhdGFMZW5ndGgrKzsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaUVxdWFsU2lnbjoNCisgICAgICAgICAgaWYgKEZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoY2ggIT0gTCc9Jykgew0KKyAgICAgICAgICAgIGlmIChtX0N1ck5vZGUuZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVF1b3RhdGlvbjsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVF1b3RhdGlvbjoNCisgICAgICAgICAgaWYgKEZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoY2ggIT0gTCdcIicgJiYgY2ggIT0gTCdcJycpIHsNCisgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gY2g7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVZhbHVlOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpVmFsdWU6DQorICAgICAgICAgIGlmIChjaCA9PSBtX3dRdW90YXRpb25NYXJrKSB7DQorICAgICAgICAgICAgaWYgKG1faUVudGl0eVN0YXJ0ID4gLTEpIHsNCisgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCisgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gMDsNCisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaU5hbWU7DQorICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpVmFsdWU7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlSW5zdHJ1Y3Rpb246DQorICAgICAgICAgIGlmIChjaCAhPSBMJz4nKSB7DQorICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCisgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKG1faURhdGFMZW5ndGggPiAwKSB7DQorICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KKyAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICBGREVfTFBYTUxOT0RFIHBYTUxOb2RlID0gbV9YTUxOb2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5Qb3AoKTsNCisgICAgICAgICAgICBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQorICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgbV9DdXJOb2RlID0gKnBYTUxOb2RlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1fQ3VyTm9kZS5pTm9kZU51bTsNCisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCisgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25DbG9zZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQnJlYWtFbGVtZW50Og0KKyAgICAgICAgICBpZiAoY2ggPT0gTCc+Jykgew0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCisgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudEJyZWFrOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnLycpIHsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlRWxlbWVudDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50Og0KKyAgICAgICAgICBpZiAoIUZERV9Jc1hNTE5hbWVDaGFyKGNoLCBtX2lEYXRhTGVuZ3RoIDwgMSkpIHsNCisgICAgICAgICAgICBpZiAoY2ggPT0gTCc+Jykgew0KKyAgICAgICAgICAgICAgRkRFX0xQWE1MTk9ERSBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1fWE1MTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgICAgICAgICAgcFhNTE5vZGUgPSBtX1hNTE5vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSAtMTsNCisgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX1Vua25vd247DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBtX0N1ck5vZGUgPSAqcFhNTE5vZGU7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1fQ3VyTm9kZS5pTm9kZU51bTsNCisgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCisgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRDbG9zZTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKCFGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgew0KKyAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCisgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50T3JEZWNsOg0KKyAgICAgICAgICBpZiAoY2ggPT0gJy0nKSB7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBEZWNsTm9kZTsNCisgICAgICAgICAgICBtX1NraXBDaGFyID0gTCc+JzsNCisgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnPicpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwRGVjbE5vZGU6DQorICAgICAgICAgIGlmIChtX1NraXBDaGFyID09IEwnXCcnIHx8IG1fU2tpcENoYXIgPT0gTCdcIicpIHsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgIGlmIChjaCAhPSBtX1NraXBDaGFyKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9Ta2lwU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgRlhfRFdPUkQqIHBEV29yZCA9IG1fU2tpcFN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICBpZiAocERXb3JkID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IChGWF9XQ0hBUikqcERXb3JkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7DQorICAgICAgICAgICAgICBjYXNlIEwnPCc6DQorICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJz4nOw0KKyAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnPicpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIGNhc2UgTCdbJzoNCisgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXSc7DQorICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCddJyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgY2FzZSBMJygnOg0KKyAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCcpJzsNCisgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJyknKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICBjYXNlIEwnXCcnOg0KKyAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCdcJyc7DQorICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCdcJycpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIGNhc2UgTCdcIic6DQorICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJ1wiJzsNCisgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJ1wiJyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgaWYgKGNoID09IG1fU2tpcENoYXIpIHsNCisgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5Qb3AoKTsNCisgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcERXb3JkID0gbV9Ta2lwU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgICAgICAgIGlmIChwRFdvcmQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1faURhdGFMZW5ndGggPj0gOSkgew0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hlYWRlcjsNCisgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c0hlYWRlciwgMCwgNyk7DQorICAgICAgICAgICAgICAgICAgICAgIGlmICh3c0hlYWRlci5FcXVhbChGWF9XU1RSQyhMIltDREFUQVsiKSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RhaWxlcjsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzVGFpbGVyLCBtX2lEYXRhTGVuZ3RoIC0gMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3c1RhaWxlci5FcXVhbChGWF9XU1RSQyhMIl1dIikpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkRlbGV0ZVRleHRDaGFycyg3LCBUUlVFKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuRGVsZXRlVGV4dENoYXJzKDIsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19DRGF0YTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCisgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gKEZYX1dDSEFSKSpwRFdvcmQ7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobV9Ta2lwU3RhY2suR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCisgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0NCisgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOw0KKyAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudDoNCisgICAgICAgICAgaWYgKGNoID09IEwnLScpIHsNCisgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KKyAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0NCisgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IEwnLSc7DQorICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCsrOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnPicpIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA+IDEpIHsNCisgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOg0KKyAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA8IDEpIHsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1fd1F1b3RhdGlvbk1hcmsgPT0gMCkgew0KKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KKyAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IDA7DQorICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPQ0KKyAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoY2ggPT0gJz8nKSB7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wiJykgew0KKyAgICAgICAgICAgIGlmIChtX3dRdW90YXRpb25NYXJrID09IDApIHsNCisgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSBjaDsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBtX3dRdW90YXRpb25NYXJrKSB7DQorICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7DQorICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gMDsNCisgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KKyAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0NCisgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOw0KKyAgICAgICAgICAgIG1faURhdGFMZW5ndGgrKzsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChkd1N0YXR1cyAhPSBGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUpIHsNCisgICAgICAgIHJldHVybiBkd1N0YXR1czsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiAwOw0KK30NCisjZWxzZQ0KK0NGREVfWE1MU3ludGF4UGFyc2VyOjpDRkRFX1hNTFN5bnRheFBhcnNlcigpDQorICAgIDogbV9wU3RyZWFtKE5VTEwpLA0KKyAgICAgIG1faVhNTFBsYW5lU2l6ZSgtMSksDQorICAgICAgbV9pVGV4dERhdGFTaXplKDI1NiksDQorICAgICAgbV9pQ3VycmVudFBvcygwKSwNCisgICAgICBtX2lDdXJyZW50Tm9kZU51bSgtMSksDQorICAgICAgbV9pTGFzdE5vZGVOdW0oLTEpLA0KKyAgICAgIG1faVBhcnNlZENoYXJzKDApLA0KKyAgICAgIG1faVBhcnNlZEJ5dGVzKDApLA0KKyAgICAgIG1fcEJ1ZmZlcihOVUxMKSwNCisgICAgICBtX2lCdWZmZXJDaGFycygwKSwNCisgICAgICBtX2JFT1MoRkFMU0UpLA0KKyAgICAgIG1fcFN0YXJ0KE5VTEwpLA0KKyAgICAgIG1fcEVuZChOVUxMKSwNCisgICAgICBtX1hNTE5vZGVTdGFjaygxNiksDQorICAgICAgbV9wd3NUZXh0RGF0YShOVUxMKSwNCisgICAgICBtX2lEYXRhUG9zKDApLA0KKyAgICAgIG1fZHdTdGF0dXMoRkRFX1hNTFNZTlRBWFNUQVRVU19Ob25lKSwNCisgICAgICBtX2R3TW9kZShGREVfWE1MU1lOVEFYTU9ERV9UZXh0KSwNCisgICAgICBtX3dRdW90YXRpb25NYXJrKDApLA0KKyAgICAgIG1faVRleHREYXRhTGVuZ3RoKDApLA0KKyAgICAgIG1faUVudGl0eVN0YXJ0KC0xKSwNCisgICAgICBtX1NraXBTdGFjaygxNikgew0KKyAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQorICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCit9DQordm9pZCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6SW5pdChJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpWE1MUGxhbmVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVGV4dERhdGFTaXplKSB7DQorICBGWFNZU19hc3NlcnQobV9wU3RyZWFtID09IE5VTEwgJiYgbV9wQnVmZmVyID09IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KHBTdHJlYW0gIT0gTlVMTCAmJiBpWE1MUGxhbmVTaXplID4gMCAmJiBpVGV4dERhdGFTaXplID4gMCk7DQorICBpbnQzMl90IGlTdHJlYW1MZW5ndGggPSBwU3RyZWFtLT5HZXRMZW5ndGgoKTsNCisgIEZYU1lTX2Fzc2VydChpU3RyZWFtTGVuZ3RoID4gMCk7DQorICBtX3BTdHJlYW0gPSBwU3RyZWFtOw0KKyAgbV9pWE1MUGxhbmVTaXplID0gRlhfTUlOKGlYTUxQbGFuZVNpemUsIGlTdHJlYW1MZW5ndGgpOw0KKyAgbV9pVGV4dERhdGFTaXplID0gaVRleHREYXRhU2l6ZTsNCisgIHVpbnQ4X3QgYm9tWzRdOw0KKyAgbV9pQ3VycmVudFBvcyA9IG1fcFN0cmVhbS0+R2V0Qk9NKGJvbSk7DQorICBGWFNZU19hc3NlcnQobV9wQnVmZmVyID09IE5VTEwpOw0KKyAgbV9wQnVmZmVyID0gKEZYX1dDSEFSKilGREVfQWxsb2MobV9pWE1MUGxhbmVTaXplICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICBtX3BTdGFydCA9IG1fcEVuZCA9IG1fcEJ1ZmZlcjsNCisgIEZYU1lTX2Fzc2VydChtX3B3c1RleHREYXRhID09IE5VTEwpOw0KKyAgbV9wd3NUZXh0RGF0YSA9IChGWF9XQ0hBUiopRkRFX0FsbG9jKG1faVRleHREYXRhU2l6ZSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgbV9pUGFyc2VkQnl0ZXMgPSBtX2lQYXJzZWRDaGFycyA9IDA7DQorICBtX2lCdWZmZXJDaGFycyA9IDA7DQorfQ0KK0ZYX0RXT1JEIENGREVfWE1MU3ludGF4UGFyc2VyOjpEb1N5bnRheFBhcnNlKCkgew0KKyAgaWYgKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvciB8fA0KKyAgICAgIG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MpIHsNCisgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICB9DQorICBGWFNZU19hc3NlcnQobV9wU3RyZWFtICE9IE5VTEwgJiYgbV9wQnVmZmVyICE9IE5VTEwgJiYgbV9wd3NUZXh0RGF0YSAhPSBOVUxMKTsNCisgIGludDMyX3QgaVN0cmVhbUxlbmd0aCA9IG1fcFN0cmVhbS0+R2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IGlQb3M7DQorICBGWF9XQ0hBUiBjaDsNCisgIEZYX0RXT1JEIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19Ob25lOw0KKyAgd2hpbGUgKFRSVUUpIHsNCisgICAgaWYgKG1fcFN0YXJ0ID49IG1fcEVuZCkgew0KKyAgICAgIGlmIChtX2JFT1MgfHwgbV9pQ3VycmVudFBvcyA+PSBpU3RyZWFtTGVuZ3RoKSB7DQorICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1M7DQorICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICB9DQorICAgICAgbV9pUGFyc2VkQ2hhcnMgKz0gKG1fcEVuZCAtIG1fcEJ1ZmZlcik7DQorICAgICAgbV9pUGFyc2VkQnl0ZXMgPSBtX2lDdXJyZW50UG9zOw0KKyAgICAgIG1fcFN0cmVhbS0+TG9jaygpOw0KKyAgICAgIGlmIChtX3BTdHJlYW0tPkdldFBvc2l0aW9uKCkgIT0gbV9pQ3VycmVudFBvcykgew0KKyAgICAgICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG1faUN1cnJlbnRQb3MpOw0KKyAgICAgIH0NCisgICAgICBtX2lCdWZmZXJDaGFycyA9DQorICAgICAgICAgIG1fcFN0cmVhbS0+UmVhZFN0cmluZyhtX3BCdWZmZXIsIG1faVhNTFBsYW5lU2l6ZSwgbV9iRU9TKTsNCisgICAgICBpUG9zID0gbV9wU3RyZWFtLT5HZXRQb3NpdGlvbigpOw0KKyAgICAgIG1fcFN0cmVhbS0+VW5sb2NrKCk7DQorICAgICAgaWYgKG1faUJ1ZmZlckNoYXJzIDwgMSkgew0KKyAgICAgICAgbV9pQ3VycmVudFBvcyA9IGlTdHJlYW1MZW5ndGg7DQorICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1M7DQorICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICB9DQorICAgICAgbV9pQ3VycmVudFBvcyA9IGlQb3M7DQorICAgICAgbV9wU3RhcnQgPSBtX3BCdWZmZXI7DQorICAgICAgbV9wRW5kID0gbV9wQnVmZmVyICsgbV9pQnVmZmVyQ2hhcnM7DQorICAgIH0NCisgICAgd2hpbGUgKG1fcFN0YXJ0IDwgbV9wRW5kKSB7DQorICAgICAgY2ggPSAqbV9wU3RhcnQ7DQorICAgICAgc3dpdGNoIChtX2R3TW9kZSkgew0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Og0KKyAgICAgICAgICBpZiAoY2ggPT0gTCc8Jykgew0KKyAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID4gMCkgew0KKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KKyAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RleHQ7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX05vZGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIFBhcnNlVGV4dENoYXIoY2gpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ob2RlOg0KKyAgICAgICAgICBpZiAoY2ggPT0gTCchJykgew0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudE9yRGVjbDsNCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBMJy8nKSB7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlRWxlbWVudDsNCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBMJz8nKSB7DQorICAgICAgICAgICAgbV9pTGFzdE5vZGVOdW0rKzsNCisgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOw0KKyAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOw0KKyAgICAgICAgICAgIG1fQ3VyTm9kZS5lTm9kZVR5cGUgPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbjsNCisgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldDsNCisgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25PcGVuOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1faUxhc3ROb2RlTnVtKys7DQorICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfRWxlbWVudDsNCisgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYWc7DQorICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRPcGVuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQ6DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1RhZzoNCisgICAgICAgICAgaWYgKCFGREVfSXNYTUxOYW1lQ2hhcihjaCwgbV9pRGF0YVBvcyA8IDEpKSB7DQorICAgICAgICAgICAgaWYgKG1faURhdGFQb3MgPCAxKSB7DQorICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICAgIGlmIChtX2R3TW9kZSAhPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQpIHsNCisgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhZ05hbWU7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0TmFtZTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlOYW1lOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA+PSBtX2lUZXh0RGF0YVNpemUpIHsNCisgICAgICAgICAgICAgIFJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faURhdGFQb3MrK10gPSBjaDsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaU5hbWU6DQorICAgICAgICAgIGlmIChtX2lEYXRhUG9zIDwgMSAmJiBGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgew0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCFGREVfSXNYTUxOYW1lQ2hhcihjaCwgbV9pRGF0YVBvcyA8IDEpKSB7DQorICAgICAgICAgICAgaWYgKG1faURhdGFQb3MgPCAxKSB7DQorICAgICAgICAgICAgICBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJz4nIHx8IGNoID09IEwnLycpIHsNCisgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0JyZWFrRWxlbWVudDsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX0N1ck5vZGUuZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJz8nKSB7DQorICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOw0KKyAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgICAgICAgaWYgKGNoICE9ICc9JyAmJiAhRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaUVxdWFsU2lnbjsNCisgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaU5hbWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KKyAgICAgICAgICAgICAgUmVhbGxvY1RleHREYXRhQnVmZmVyKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRGF0YVBvcysrXSA9IGNoOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpRXF1YWxTaWduOg0KKyAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChjaCAhPSBMJz0nKSB7DQorICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpUXVvdGF0aW9uOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpUXVvdGF0aW9uOg0KKyAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChjaCAhPSBMJ1wiJyAmJiBjaCAhPSBMJ1wnJykgew0KKyAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSBjaDsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpVmFsdWU7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlWYWx1ZToNCisgICAgICAgICAgaWYgKGNoID09IG1fd1F1b3RhdGlvbk1hcmspIHsNCisgICAgICAgICAgICBpZiAobV9pRW50aXR5U3RhcnQgPiAtMSkgew0KKyAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSAwOw0KKyAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaU5hbWU7DQorICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpVmFsdWU7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlSW5zdHJ1Y3Rpb246DQorICAgICAgICAgIGlmIChjaCAhPSBMJz4nKSB7DQorICAgICAgICAgICAgaWYgKG1faURhdGFQb3MgPj0gbV9pVGV4dERhdGFTaXplKSB7DQorICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zKytdID0gY2g7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKG1faURhdGFQb3MgPiAwKSB7DQorICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgRkRFX0xQWE1MTk9ERSBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgcFhNTE5vZGUgPSBtX1hNTE5vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IC0xOw0KKyAgICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX1Vua25vd247DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIG1fQ3VyTm9kZSA9ICpwWE1MTm9kZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX0N1ck5vZGUuaU5vZGVOdW07DQorICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbkNsb3NlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9CcmVha0VsZW1lbnQ6DQorICAgICAgICAgIGlmIChjaCA9PSBMJz4nKSB7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50QnJlYWs7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCcvJykgew0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUVsZW1lbnQ6DQorICAgICAgICAgIGlmICghRkRFX0lzWE1MTmFtZUNoYXIoY2gsIG1faURhdGFQb3MgPCAxKSkgew0KKyAgICAgICAgICAgIGlmIChjaCA9PSBMJz4nKSB7DQorICAgICAgICAgICAgICBGREVfTFBYTUxOT0RFIHBYTUxOb2RlID0gbV9YTUxOb2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgICBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IC0xOw0KKyAgICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fQ3VyTm9kZSA9ICpwWE1MTm9kZTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1faUN1cnJlbnROb2RlTnVtID0gbV9DdXJOb2RlLmlOb2RlTnVtOw0KKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQorICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudENsb3NlOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIUZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA+PSBtX2lUZXh0RGF0YVNpemUpIHsNCisgICAgICAgICAgICAgIFJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faURhdGFQb3MrK10gPSBjaDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfU2tpcENvbW1lbnRPckRlY2w6DQorICAgICAgICAgIGlmIChjaCA9PSAnLScpIHsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfU2tpcERlY2xOb2RlOw0KKyAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJz4nOw0KKyAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCc+Jyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1NraXBEZWNsTm9kZToNCisgICAgICAgICAgaWYgKG1fU2tpcENoYXIgPT0gTCdcJycgfHwgbV9Ta2lwQ2hhciA9PSBMJ1wiJykgew0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgaWYgKGNoICE9IG1fU2tpcENoYXIpIHsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX1NraXBTdGFjay5Qb3AoKTsNCisgICAgICAgICAgICBGWF9EV09SRCogcERXb3JkID0gbV9Ta2lwU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgIGlmIChwRFdvcmQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBtX1NraXBDaGFyID0gKEZYX1dDSEFSKSpwRFdvcmQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsNCisgICAgICAgICAgICAgIGNhc2UgTCc8JzoNCisgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnPic7DQorICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCc+Jyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgY2FzZSBMJ1snOg0KKyAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCddJzsNCisgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJ10nKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICBjYXNlIEwnKCc6DQorICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJyknOw0KKyAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnKScpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIGNhc2UgTCdcJyc6DQorICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJ1wnJzsNCisgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJ1wnJyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgY2FzZSBMJ1wiJzoNCisgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXCInOw0KKyAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnXCInKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gbV9Ta2lwQ2hhcikgew0KKyAgICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlBvcCgpOw0KKyAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwRFdvcmQgPSBtX1NraXBTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgICAgICAgaWYgKHBEV29yZCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGlmIChtX2lUZXh0RGF0YUxlbmd0aCA+PSA5ICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY21wKG1fcHdzVGV4dERhdGEsIEwiW0NEQVRBWyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgKiBzaXplb2YoRlhfV0NIQVIpKSA9PSAwICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY21wKG1fcHdzVGV4dERhdGEgKyBtX2lUZXh0RGF0YUxlbmd0aCAtIDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiXV0iLCAyICogc2l6ZW9mKEZYX1dDSEFSKSkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCAtPSA5Ow0KKyAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1tb3ZlKG1fcHdzVGV4dERhdGEsIG1fcHdzVGV4dERhdGEgKyA3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19DRGF0YTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCisgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IChGWF9XQ0hBUikqcERXb3JkOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1fU2tpcFN0YWNrLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KKyAgICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRGF0YVBvcysrXSA9IGNoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudDoNCisgICAgICAgICAgaWYgKGNoID09IEwnLScpIHsNCisgICAgICAgICAgICBtX2lEYXRhUG9zKys7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCc+Jykgew0KKyAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID4gMSkgew0KKyAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOg0KKyAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA8IDEpIHsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1fd1F1b3RhdGlvbk1hcmsgPT0gMCkgew0KKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IDA7DQorICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoY2ggPT0gJz8nKSB7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wiJykgew0KKyAgICAgICAgICAgIGlmIChtX3dRdW90YXRpb25NYXJrID09IDApIHsNCisgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSBjaDsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBtX3dRdW90YXRpb25NYXJrKSB7DQorICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gMDsNCisgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA+PSBtX2lUZXh0RGF0YVNpemUpIHsNCisgICAgICAgICAgICAgIFJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faURhdGFQb3MrK10gPSBjaDsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChkd1N0YXR1cyAhPSBGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUpIHsNCisgICAgICAgIHJldHVybiBkd1N0YXR1czsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiAwOw0KK30NCisjZW5kaWYNCitDRkRFX1hNTFN5bnRheFBhcnNlcjo6fkNGREVfWE1MU3ludGF4UGFyc2VyKCkgew0KKyNpZmRlZiBfRkRFX0JMT0NLX0JVRkZFUg0KKyAgaWYgKG1fcEN1cnJlbnRCbG9jaykgew0KKyAgICBtX3BDdXJyZW50QmxvY2sgPSBOVUxMOw0KKyAgfQ0KKyNlbHNlDQorICBpZiAobV9wd3NUZXh0RGF0YSAhPSBOVUxMKSB7DQorICAgIEZERV9GcmVlKG1fcHdzVGV4dERhdGEpOw0KKyAgfQ0KKyNlbmRpZg0KKyAgaWYgKG1fcEJ1ZmZlciAhPSBOVUxMKSB7DQorICAgIEZERV9GcmVlKG1fcEJ1ZmZlcik7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZERV9YTUxTeW50YXhQYXJzZXI6OkdldFN0YXR1cygpIGNvbnN0IHsNCisgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpbnQzMl90IGlTdHJlYW1MZW5ndGggPSBtX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KKyAgaWYgKGlTdHJlYW1MZW5ndGggPCAxKSB7DQorICAgIHJldHVybiAxMDA7DQorICB9DQorICBpZiAobV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGlmIChtX2R3U3RhdHVzID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TKSB7DQorICAgIHJldHVybiAxMDA7DQorICB9DQorICByZXR1cm4gbV9pUGFyc2VkQnl0ZXMgKiAxMDAgLyBpU3RyZWFtTGVuZ3RoOw0KK30NCitzdGF0aWMgaW50MzJfdCBGWF9HZXRVVEY4RW5jb2RlTGVuZ3RoKGNvbnN0IEZYX1dDSEFSKiBwU3JjLCBpbnQzMl90IGlTcmNMZW4pIHsNCisgIEZYX0RXT1JEIHVuaWNvZGUgPSAwOw0KKyAgaW50MzJfdCBpRHN0TnVtID0gMDsNCisgIHdoaWxlIChpU3JjTGVuLS0gPiAwKSB7DQorICAgIHVuaWNvZGUgPSAqcFNyYysrOw0KKyAgICBpbnQgbmJ5dGVzID0gMDsNCisgICAgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHg4MCkgew0KKyAgICAgIG5ieXRlcyA9IDE7DQorICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDgwMCkgew0KKyAgICAgIG5ieXRlcyA9IDI7DQorICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDEwMDAwKSB7DQorICAgICAgbmJ5dGVzID0gMzsNCisgICAgfSBlbHNlIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4MjAwMDAwKSB7DQorICAgICAgbmJ5dGVzID0gNDsNCisgICAgfSBlbHNlIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4NDAwMDAwMCkgew0KKyAgICAgIG5ieXRlcyA9IDU7DQorICAgIH0gZWxzZSB7DQorICAgICAgbmJ5dGVzID0gNjsNCisgICAgfQ0KKyAgICBpRHN0TnVtICs9IG5ieXRlczsNCisgIH0NCisgIHJldHVybiBpRHN0TnVtOw0KK30NCitGWF9GSUxFU0laRSBDRkRFX1hNTFN5bnRheFBhcnNlcjo6R2V0Q3VycmVudEJpbmFyeVBvcygpIGNvbnN0IHsNCisgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgblNyY0xlbiA9IG1fcFN0YXJ0IC0gbV9wQnVmZmVyOw0KKyAgaW50MzJfdCBuRHN0TGVuID0gRlhfR2V0VVRGOEVuY29kZUxlbmd0aChtX3BCdWZmZXIsIG5TcmNMZW4pOw0KKyAgcmV0dXJuIG1faVBhcnNlZEJ5dGVzICsgbkRzdExlbjsNCit9DQorI2lmZGVmIF9GREVfQkxPQ0tfQlVGRkVSDQordm9pZCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6UGFyc2VUZXh0Q2hhcihGWF9XQ0hBUiBjaCkgew0KKyAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCiAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KLSAgICBtX2lQYXJzZWRCeXRlcyA9IG1faVBhcnNlZENoYXJzID0gMDsNCi0gICAgbV9pQnVmZmVyQ2hhcnMgPSAwOw0KLX0NCi1GWF9EV09SRCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6RG9TeW50YXhQYXJzZSgpDQotew0KLSAgICBpZiAobV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yIHx8IG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MpIHsNCi0gICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KLSAgICBGWFNZU19hc3NlcnQobV9wU3RyZWFtICE9IE5VTEwgJiYgbV9wQnVmZmVyICE9IE5VTEwgJiYgbV9CbG9ja0J1ZmZlci5Jc0luaXRpYWxpemVkKCkpOw0KLSAgICBpbnQzMl90IGlTdHJlYW1MZW5ndGggPSBtX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IGlQb3M7DQotICAgIEZYX1dDSEFSIGNoOw0KLSAgICBGWF9EV09SRCBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfTm9uZTsNCi0gICAgd2hpbGUgKFRSVUUpIHsNCi0gICAgICAgIGlmIChtX3BTdGFydCA+PSBtX3BFbmQpIHsNCi0gICAgICAgICAgICBpZiAobV9iRU9TIHx8IG1faUN1cnJlbnRQb3MgPj0gaVN0cmVhbUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1M7DQotICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgfQ0KKyAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOw0KKyAgbV9pRGF0YUxlbmd0aCsrOw0KKyAgaWYgKG1faUVudGl0eVN0YXJ0ID4gLTEgJiYgY2ggPT0gTCc7Jykgew0KKyAgICBDRlhfV2lkZVN0cmluZyBjc0VudGl0eTsNCisgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YShjc0VudGl0eSwgbV9pRW50aXR5U3RhcnQgKyAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX2lEYXRhTGVuZ3RoIC0gMSkgLSBtX2lFbnRpdHlTdGFydCAtIDEpOw0KKyAgICBpbnQzMl90IGlMZW4gPSBjc0VudGl0eS5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW4gPiAwKSB7DQorICAgICAgaWYgKGNzRW50aXR5WzBdID09IEwnIycpIHsNCisgICAgICAgIGNoID0gMDsNCisgICAgICAgIEZYX1dDSEFSIHc7DQorICAgICAgICBpZiAoaUxlbiA+IDEgJiYgY3NFbnRpdHlbMV0gPT0gTCd4Jykgew0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgICAgICAgICB3ID0gY3NFbnRpdHlbaV07DQorICAgICAgICAgICAgaWYgKHcgPj0gTCcwJyAmJiB3IDw9IEwnOScpIHsNCisgICAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgdyAtIEwnMCc7DQorICAgICAgICAgICAgfSBlbHNlIGlmICh3ID49IEwnQScgJiYgdyA8PSBMJ0YnKSB7DQorICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA1NTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gTCdhJyAmJiB3IDw9IEwnZicpIHsNCisgICAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgdyAtIDg3Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9pUGFyc2VkQ2hhcnMgKz0gKG1fcEVuZCAtIG1fcEJ1ZmZlcik7DQotICAgICAgICAgICAgbV9pUGFyc2VkQnl0ZXMgPSBtX2lDdXJyZW50UG9zOw0KLSAgICAgICAgICAgIG1fcFN0cmVhbS0+TG9jaygpOw0KLSAgICAgICAgICAgIGlmIChtX3BTdHJlYW0tPkdldFBvc2l0aW9uKCkgIT0gbV9pQ3VycmVudFBvcykgew0KLSAgICAgICAgICAgICAgICBtX3BTdHJlYW0tPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgbV9pQ3VycmVudFBvcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1faUJ1ZmZlckNoYXJzID0gbV9wU3RyZWFtLT5SZWFkU3RyaW5nKG1fcEJ1ZmZlciwgbV9pWE1MUGxhbmVTaXplLCBtX2JFT1MpOw0KLSAgICAgICAgICAgIGlQb3MgPSBtX3BTdHJlYW0tPkdldFBvc2l0aW9uKCk7DQotICAgICAgICAgICAgbV9wU3RyZWFtLT5VbmxvY2soKTsNCi0gICAgICAgICAgICBpZiAobV9pQnVmZmVyQ2hhcnMgPCAxKSB7DQotICAgICAgICAgICAgICAgIG1faUN1cnJlbnRQb3MgPSBpU3RyZWFtTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1M7DQotICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX2lDdXJyZW50UG9zID0gaVBvczsNCi0gICAgICAgICAgICBtX3BTdGFydCA9IG1fcEJ1ZmZlcjsNCi0gICAgICAgICAgICBtX3BFbmQgPSBtX3BCdWZmZXIgKyBtX2lCdWZmZXJDaGFyczsNCi0gICAgICAgIH0NCi0gICAgICAgIHdoaWxlIChtX3BTdGFydCA8IG1fcEVuZCkgew0KLSAgICAgICAgICAgIGNoID0gKm1fcFN0YXJ0Ow0KLSAgICAgICAgICAgIHN3aXRjaCAobV9kd01vZGUpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Og0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPCcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RleHQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfTm9kZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlVGV4dENoYXIoY2gpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfTm9kZToNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJyEnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudE9yRGVjbDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCcvJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBMJz8nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pTGFzdE5vZGVOdW0gKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb247DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUHVzaChtX0N1ck5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbk9wZW47DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1faUxhc3ROb2RlTnVtICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1faUN1cnJlbnROb2RlTnVtID0gbV9pTGFzdE5vZGVOdW07DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gbV9pTGFzdE5vZGVOdW07DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX0VsZW1lbnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUHVzaChtX0N1ck5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50T3BlbjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldDoNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UYWc6DQotICAgICAgICAgICAgICAgICAgICBpZiAoIUZERV9Jc1hNTE5hbWVDaGFyKGNoLCBtX2lEYXRhTGVuZ3RoIDwgMSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA8IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2R3TW9kZSAhPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYWdOYW1lOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldE5hbWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaU5hbWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbV9wQ3VycmVudEJsb2NrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlOYW1lOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1faURhdGFMZW5ndGggPCAxICYmIEZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAoIUZERV9Jc1hNTE5hbWVDaGFyKGNoLCBtX2lEYXRhTGVuZ3RoIDwgMSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA8IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPicgfHwgY2ggPT0gTCcvJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQnJlYWtFbGVtZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJz8nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9ICc9JyAmJiAhRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaUVxdWFsU2lnbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpTmFtZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lJbmRleEluQmxvY2sgPT0gbV9pQWxsb2NTdGVwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaUVxdWFsU2lnbjoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IEwnPScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVF1b3RhdGlvbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpUXVvdGF0aW9uOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gTCdcIicgJiYgY2ggIT0gTCdcJycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IGNoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpVmFsdWU6DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gbV93UXVvdGF0aW9uTWFyaykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lFbnRpdHlTdGFydCA+IC0xKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaU5hbWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlVGV4dENoYXIoY2gpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VJbnN0cnVjdGlvbjoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBMJz4nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFMZW5ndGgrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1faURhdGFMZW5ndGggPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZERV9MUFhNTE5PREUgcFhNTE5vZGUgPSBtX1hNTE5vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5Qb3AoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSAtMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX1Vua25vd247DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJOb2RlID0gKnBYTUxOb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1fQ3VyTm9kZS5pTm9kZU51bTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25DbG9zZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0JyZWFrRWxlbWVudDoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJz4nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50QnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnLycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlRWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlRWxlbWVudDoNCi0gICAgICAgICAgICAgICAgICAgIGlmICghRkRFX0lzWE1MTmFtZUNoYXIoY2gsIG1faURhdGFMZW5ndGggPCAxKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJz4nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9MUFhNTE5PREUgcFhNTE5vZGUgPSBtX1hNTE5vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fWE1MTm9kZVN0YWNrLlBvcCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IC0xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX1Vua25vd247DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUgPSAqcFhNTE5vZGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX0N1ck5vZGUuaU5vZGVOdW07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRDbG9zZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbV9wQ3VycmVudEJsb2NrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCsrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudE9yRGVjbDoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBEZWNsTm9kZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCc+JzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnPicpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfU2tpcERlY2xOb2RlOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fU2tpcENoYXIgPT0gTCdcJycgfHwgbV9Ta2lwQ2hhciA9PSBMJ1wiJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBtX1NraXBDaGFyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5Qb3AoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcERXb3JkID0gbV9Ta2lwU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRFdvcmQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IChGWF9XQ0hBUikgKiBwRFdvcmQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTCc8JzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJz4nOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJz4nKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEwnWyc6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCddJzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCddJyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMJygnOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnKSc7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnKScpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTCdcJyc6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCdcJyc7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnXCcnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEwnXCInOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXCInOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJ1wiJyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBtX1NraXBDaGFyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUG9wKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBEV29yZCA9IG1fU2tpcFN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocERXb3JkID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faURhdGFMZW5ndGggPj0gOSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIZWFkZXI7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzSGVhZGVyLCAwLCA3KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3c0hlYWRlci5FcXVhbChGWF9XU1RSQyhMIltDREFUQVsiKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RhaWxlcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzVGFpbGVyLCBtX2lEYXRhTGVuZ3RoIC0gMiwgMik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdzVGFpbGVyLkVxdWFsKEZYX1dTVFJDKEwiXV0iKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5EZWxldGVUZXh0Q2hhcnMoNywgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuRGVsZXRlVGV4dENoYXJzKDIsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0NEYXRhOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IChGWF9XQ0hBUikgKiBwRFdvcmQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX1NraXBTdGFjay5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lJbmRleEluQmxvY2sgPT0gbV9pQWxsb2NTdGVwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50Og0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnLScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbV9wQ3VycmVudEJsb2NrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gTCctJzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnPicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA+IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCsrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YToNCi0gICAgICAgICAgICAgICAgICAgIGlmIChGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhTGVuZ3RoIDwgMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX3dRdW90YXRpb25NYXJrID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0RGF0YTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc/Jykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VJbnN0cnVjdGlvbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCsrOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXCInKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fd1F1b3RhdGlvbk1hcmsgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gY2g7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBtX3dRdW90YXRpb25NYXJrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFMZW5ndGgrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChkd1N0YXR1cyAhPSBGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGR3U3RhdHVzOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gMDsNCi19DQotI2Vsc2UNCi1DRkRFX1hNTFN5bnRheFBhcnNlcjo6Q0ZERV9YTUxTeW50YXhQYXJzZXIoKQ0KLSAgICA6IG1fcFN0cmVhbShOVUxMKQ0KLSAgICAsIG1faVhNTFBsYW5lU2l6ZSgtMSkNCi0gICAgLCBtX2lUZXh0RGF0YVNpemUoMjU2KQ0KLSAgICAsIG1faUN1cnJlbnRQb3MoMCkNCi0gICAgLCBtX2lDdXJyZW50Tm9kZU51bSgtMSkNCi0gICAgLCBtX2lMYXN0Tm9kZU51bSgtMSkNCi0gICAgLCBtX2lQYXJzZWRDaGFycygwKQ0KLSAgICAsIG1faVBhcnNlZEJ5dGVzKDApDQotICAgICwgbV9wQnVmZmVyKE5VTEwpDQotICAgICwgbV9pQnVmZmVyQ2hhcnMoMCkNCi0gICAgLCBtX2JFT1MoRkFMU0UpDQotICAgICwgbV9wU3RhcnQoTlVMTCkNCi0gICAgLCBtX3BFbmQoTlVMTCkNCi0gICAgLCBtX1hNTE5vZGVTdGFjaygxNikNCi0gICAgLCBtX3B3c1RleHREYXRhKE5VTEwpDQotICAgICwgbV9pRGF0YVBvcygwKQ0KLSAgICAsIG1fZHdTdGF0dXMoRkRFX1hNTFNZTlRBWFNUQVRVU19Ob25lKQ0KLSAgICAsIG1fZHdNb2RlKEZERV9YTUxTWU5UQVhNT0RFX1RleHQpDQotICAgICwgbV93UXVvdGF0aW9uTWFyaygwKQ0KLSAgICAsIG1faVRleHREYXRhTGVuZ3RoKDApDQotICAgICwgbV9pRW50aXR5U3RhcnQoLTEpDQotICAgICwgbV9Ta2lwU3RhY2soMTYpDQotew0KLSAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSAtMTsNCi0gICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX1Vua25vd247DQotfQ0KLXZvaWQgQ0ZERV9YTUxTeW50YXhQYXJzZXI6OkluaXQoSUZYX1N0cmVhbSAqcFN0cmVhbSwgaW50MzJfdCBpWE1MUGxhbmVTaXplLCBpbnQzMl90IGlUZXh0RGF0YVNpemUgKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSA9PSBOVUxMICYmIG1fcEJ1ZmZlciA9PSBOVUxMKTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBTdHJlYW0gIT0gTlVMTCAmJiBpWE1MUGxhbmVTaXplID4gMCAmJiBpVGV4dERhdGFTaXplID4gMCk7DQotICAgIGludDMyX3QgaVN0cmVhbUxlbmd0aCA9IHBTdHJlYW0tPkdldExlbmd0aCgpOw0KLSAgICBGWFNZU19hc3NlcnQoaVN0cmVhbUxlbmd0aCA+IDApOw0KLSAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOw0KLSAgICBtX2lYTUxQbGFuZVNpemUgPSBGWF9NSU4oaVhNTFBsYW5lU2l6ZSwgaVN0cmVhbUxlbmd0aCk7DQotICAgIG1faVRleHREYXRhU2l6ZSA9IGlUZXh0RGF0YVNpemU7DQotICAgIHVpbnQ4X3QgYm9tWzRdOw0KLSAgICBtX2lDdXJyZW50UG9zID0gbV9wU3RyZWFtLT5HZXRCT00oYm9tKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEJ1ZmZlciA9PSBOVUxMKTsNCi0gICAgbV9wQnVmZmVyID0gKEZYX1dDSEFSKilGREVfQWxsb2MobV9pWE1MUGxhbmVTaXplICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgIG1fcFN0YXJ0ID0gbV9wRW5kID0gbV9wQnVmZmVyOw0KLSAgICBGWFNZU19hc3NlcnQobV9wd3NUZXh0RGF0YSA9PSBOVUxMKTsNCi0gICAgbV9wd3NUZXh0RGF0YSA9IChGWF9XQ0hBUiopRkRFX0FsbG9jKG1faVRleHREYXRhU2l6ZSAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICBtX2lQYXJzZWRCeXRlcyA9IG1faVBhcnNlZENoYXJzID0gMDsNCi0gICAgbV9pQnVmZmVyQ2hhcnMgPSAwOw0KLX0NCi1GWF9EV09SRCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6RG9TeW50YXhQYXJzZSgpDQotew0KLSAgICBpZiAobV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yIHx8IG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MpIHsNCi0gICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KLSAgICB9DQotICAgIEZYU1lTX2Fzc2VydChtX3BTdHJlYW0gIT0gTlVMTCAmJiBtX3BCdWZmZXIgIT0gTlVMTCAmJiBtX3B3c1RleHREYXRhICE9IE5VTEwpOw0KLSAgICBpbnQzMl90IGlTdHJlYW1MZW5ndGggPSBtX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IGlQb3M7DQotICAgIEZYX1dDSEFSIGNoOw0KLSAgICBGWF9EV09SRCBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfTm9uZTsNCi0gICAgd2hpbGUgKFRSVUUpIHsNCi0gICAgICAgIGlmIChtX3BTdGFydCA+PSBtX3BFbmQpIHsNCi0gICAgICAgICAgICBpZiAobV9iRU9TIHx8IG1faUN1cnJlbnRQb3MgPj0gaVN0cmVhbUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1M7DQotICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX2lQYXJzZWRDaGFycyArPSAobV9wRW5kIC0gbV9wQnVmZmVyKTsNCi0gICAgICAgICAgICBtX2lQYXJzZWRCeXRlcyA9IG1faUN1cnJlbnRQb3M7DQotICAgICAgICAgICAgbV9wU3RyZWFtLT5Mb2NrKCk7DQotICAgICAgICAgICAgaWYgKG1fcFN0cmVhbS0+R2V0UG9zaXRpb24oKSAhPSBtX2lDdXJyZW50UG9zKSB7DQotICAgICAgICAgICAgICAgIG1fcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBtX2lDdXJyZW50UG9zKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9pQnVmZmVyQ2hhcnMgPSBtX3BTdHJlYW0tPlJlYWRTdHJpbmcobV9wQnVmZmVyLCBtX2lYTUxQbGFuZVNpemUsIG1fYkVPUyk7DQotICAgICAgICAgICAgaVBvcyA9IG1fcFN0cmVhbS0+R2V0UG9zaXRpb24oKTsNCi0gICAgICAgICAgICBtX3BTdHJlYW0tPlVubG9jaygpOw0KLSAgICAgICAgICAgIGlmIChtX2lCdWZmZXJDaGFycyA8IDEpIHsNCi0gICAgICAgICAgICAgICAgbV9pQ3VycmVudFBvcyA9IGlTdHJlYW1MZW5ndGg7DQotICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUzsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1faUN1cnJlbnRQb3MgPSBpUG9zOw0KLSAgICAgICAgICAgIG1fcFN0YXJ0ID0gbV9wQnVmZmVyOw0KLSAgICAgICAgICAgIG1fcEVuZCA9IG1fcEJ1ZmZlciArIG1faUJ1ZmZlckNoYXJzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2hpbGUgKG1fcFN0YXJ0IDwgbV9wRW5kKSB7DQotICAgICAgICAgICAgY2ggPSAqbV9wU3RhcnQ7DQotICAgICAgICAgICAgc3dpdGNoIChtX2R3TW9kZSkgew0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1RleHQ6DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gTCc8Jykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGV4dDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9Ob2RlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ob2RlOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnIScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50T3JEZWNsOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBMJy8nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUVsZW1lbnQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnPycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2lMYXN0Tm9kZU51bSArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5lTm9kZVR5cGUgPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0luc3RydWN0aW9uT3BlbjsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pTGFzdE5vZGVOdW0gKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfRWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYWc7DQotICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRPcGVuOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0Og0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1RhZzoNCi0gICAgICAgICAgICAgICAgICAgIGlmICghRkRFX0lzWE1MTmFtZUNoYXIoY2gsIG1faURhdGFQb3MgPCAxKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zIDwgMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fZHdNb2RlICE9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhZ05hbWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0TmFtZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpTmFtZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zICsrXSA9IGNoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlOYW1lOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1faURhdGFQb3MgPCAxICYmIEZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAoIUZERV9Jc1hNTE5hbWVDaGFyKGNoLCBtX2lEYXRhUG9zIDwgMSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA8IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPicgfHwgY2ggPT0gTCcvJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQnJlYWtFbGVtZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJz8nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9ICc9JyAmJiAhRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaUVxdWFsU2lnbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpTmFtZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zICsrXSA9IGNoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlFcXVhbFNpZ246DQotICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBMJz0nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlRdW90YXRpb247DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVF1b3RhdGlvbjoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IEwnXCInICYmIGNoICE9IEwnXCcnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSBjaDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVZhbHVlOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IG1fd1F1b3RhdGlvbk1hcmspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRW50aXR5U3RhcnQgPiAtMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpTmFtZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IEwnPicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA+PSBtX2lUZXh0RGF0YVNpemUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbGxvY1RleHREYXRhQnVmZmVyKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRGF0YVBvcyArK10gPSBjaDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1faURhdGFQb3MgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGREVfTFBYTUxOT0RFIHBYTUxOb2RlID0gbV9YTUxOb2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUG9wKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFhNTE5vZGUgPSBtX1hNTE5vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5lTm9kZVR5cGUgPSBGREVfWE1MTk9ERV9Vbmtub3duOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZSA9ICpwWE1MTm9kZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX0N1ck5vZGUuaU5vZGVOdW07DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbkNsb3NlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQnJlYWtFbGVtZW50Og0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRCcmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCcvJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50Og0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFGREVfSXNYTUxOYW1lQ2hhcihjaCwgbV9pRGF0YVBvcyA8IDEpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0xQWE1MTk9ERSBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUG9wKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBYTUxOb2RlID0gbV9YTUxOb2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyTm9kZSA9ICpwWE1MTm9kZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1fQ3VyTm9kZS5pTm9kZU51bTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudENsb3NlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIUZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zICsrXSA9IGNoOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudE9yRGVjbDoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBEZWNsTm9kZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCc+JzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnPicpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfU2tpcERlY2xOb2RlOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fU2tpcENoYXIgPT0gTCdcJycgfHwgbV9Ta2lwQ2hhciA9PSBMJ1wiJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBtX1NraXBDaGFyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5Qb3AoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcERXb3JkID0gbV9Ta2lwU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRFdvcmQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IChGWF9XQ0hBUikgKiBwRFdvcmQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTCc8JzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJz4nOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJz4nKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEwnWyc6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCddJzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCddJyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMJygnOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnKSc7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnKScpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTCdcJyc6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCdcJyc7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnXCcnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEwnXCInOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXCInOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJ1wiJyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBtX1NraXBDaGFyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUG9wKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBEV29yZCA9IG1fU2tpcFN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocERXb3JkID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faVRleHREYXRhTGVuZ3RoID49IDkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBGWFNZU19tZW1jbXAobV9wd3NUZXh0RGF0YSwgTCJbQ0RBVEFbIiwgNyAqIHNpemVvZihGWF9XQ0hBUikpID09IDANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBGWFNZU19tZW1jbXAobV9wd3NUZXh0RGF0YSArIG1faVRleHREYXRhTGVuZ3RoIC0gMiwgTCJdXSIsIDIgKiBzaXplb2YoRlhfV0NIQVIpKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCAtPSA5Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtbW92ZShtX3B3c1RleHREYXRhLCBtX3B3c1RleHREYXRhICsgNywgbV9pVGV4dERhdGFMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19DRGF0YTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IChGWF9XQ0hBUikgKiBwRFdvcmQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX1NraXBTdGFjay5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbGxvY1RleHREYXRhQnVmZmVyKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zICsrXSA9IGNoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50Og0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnLScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zKys7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnPicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA+IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQrKzsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE6DQotICAgICAgICAgICAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA8IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV93UXVvdGF0aW9uTWFyayA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlSW5zdHJ1Y3Rpb247DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wiJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3dRdW90YXRpb25NYXJrID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IGNoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdGFydCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gbV93UXVvdGF0aW9uTWFyaykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RhcnQgKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zICsrXSA9IGNoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGR3U3RhdHVzICE9IEZERV9YTUxTWU5UQVhTVEFUVVNfTm9uZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZHdTdGF0dXM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiAwOw0KLX0NCi0jZW5kaWYNCi1DRkRFX1hNTFN5bnRheFBhcnNlcjo6fkNGREVfWE1MU3ludGF4UGFyc2VyKCkNCi17DQotI2lmZGVmIF9GREVfQkxPQ0tfQlVGRkVSDQotICAgIGlmIChtX3BDdXJyZW50QmxvY2spIHsNCi0gICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IE5VTEw7DQotICAgIH0NCi0jZWxzZQ0KLSAgICBpZiAobV9wd3NUZXh0RGF0YSAhPSBOVUxMKSB7DQotICAgICAgICBGREVfRnJlZShtX3B3c1RleHREYXRhKTsNCi0gICAgfQ0KLSNlbmRpZg0KLSAgICBpZiAobV9wQnVmZmVyICE9IE5VTEwpIHsNCi0gICAgICAgIEZERV9GcmVlKG1fcEJ1ZmZlcik7DQotICAgIH0NCi19DQotaW50MzJfdCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6R2V0U3RhdHVzKCkgY29uc3QNCi17DQotICAgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIGludDMyX3QgaVN0cmVhbUxlbmd0aCA9IG1fcFN0cmVhbS0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpU3RyZWFtTGVuZ3RoIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIDEwMDsNCi0gICAgfQ0KLSAgICBpZiAobV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yKSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgaWYgKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MpIHsNCi0gICAgICAgIHJldHVybiAxMDA7DQotICAgIH0NCi0gICAgcmV0dXJuIG1faVBhcnNlZEJ5dGVzICogMTAwIC8gaVN0cmVhbUxlbmd0aDsNCi19DQotc3RhdGljIGludDMyX3QgRlhfR2V0VVRGOEVuY29kZUxlbmd0aChjb25zdCBGWF9XQ0hBUiogcFNyYywgaW50MzJfdCBpU3JjTGVuKQ0KLXsNCi0gICAgRlhfRFdPUkQgdW5pY29kZSA9IDA7DQotICAgIGludDMyX3QgaURzdE51bSA9IDA7DQotICAgIHdoaWxlIChpU3JjTGVuIC0tID4gMCkgew0KLSAgICAgICAgdW5pY29kZSA9ICpwU3JjICsrOw0KLSAgICAgICAgaW50IG5ieXRlcyA9IDA7DQotICAgICAgICBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDgwKSB7DQotICAgICAgICAgICAgbmJ5dGVzID0gMTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDgwMCkgew0KLSAgICAgICAgICAgIG5ieXRlcyA9IDI7DQotICAgICAgICB9IGVsc2UgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHgxMDAwMCkgew0KLSAgICAgICAgICAgIG5ieXRlcyA9IDM7DQotICAgICAgICB9IGVsc2UgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHgyMDAwMDApIHsNCi0gICAgICAgICAgICBuYnl0ZXMgPSA0Ow0KLSAgICAgICAgfSBlbHNlIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4NDAwMDAwMCkgew0KLSAgICAgICAgICAgIG5ieXRlcyA9IDU7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbmJ5dGVzID0gNjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlEc3ROdW0gKz0gbmJ5dGVzOw0KLSAgICB9DQotICAgIHJldHVybiBpRHN0TnVtOw0KLX0NCi1GWF9GSUxFU0laRSBDRkRFX1hNTFN5bnRheFBhcnNlcjo6R2V0Q3VycmVudEJpbmFyeVBvcygpIGNvbnN0DQotew0KLSAgICBpZiAobV9wU3RyZWFtID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIGludDMyX3QgblNyY0xlbiA9IG1fcFN0YXJ0IC0gbV9wQnVmZmVyOw0KLSAgICBpbnQzMl90IG5Ec3RMZW4gPSBGWF9HZXRVVEY4RW5jb2RlTGVuZ3RoKG1fcEJ1ZmZlciwgblNyY0xlbik7DQotICAgIHJldHVybiBtX2lQYXJzZWRCeXRlcyArIG5Ec3RMZW47DQotfQ0KLSNpZmRlZiBfRkRFX0JMT0NLX0JVRkZFUg0KLXZvaWQgQ0ZERV9YTUxTeW50YXhQYXJzZXI6OlBhcnNlVGV4dENoYXIoRlhfV0NIQVIgY2gpDQotew0KLSAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KLSAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KLSAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOw0KLSAgICBtX2lEYXRhTGVuZ3RoKys7DQotICAgIGlmIChtX2lFbnRpdHlTdGFydCA+IC0xICYmIGNoID09IEwnOycpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzRW50aXR5Ow0KLSAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YShjc0VudGl0eSwgbV9pRW50aXR5U3RhcnQgKyAxLCAobV9pRGF0YUxlbmd0aCAtIDEpIC0gbV9pRW50aXR5U3RhcnQgLSAxKTsNCi0gICAgICAgIGludDMyX3QgaUxlbiA9IGNzRW50aXR5LkdldExlbmd0aCgpOw0KLSAgICAgICAgaWYgKGlMZW4gPiAwKSB7DQotICAgICAgICAgICAgaWYgKGNzRW50aXR5WzBdID09IEwnIycpIHsNCi0gICAgICAgICAgICAgICAgY2ggPSAwOw0KLSAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Ow0KLSAgICAgICAgICAgICAgICBpZiAoaUxlbiA+IDEgJiYgY3NFbnRpdHlbMV0gPT0gTCd4Jykgew0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbjsgaSArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodyA+PSBMJzAnICYmIHcgPD0gTCc5Jykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSBMJzAnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodyA+PSBMJ0EnICYmIHcgPD0gTCdGJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA1NTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gTCdhJyAmJiB3IDw9IEwnZicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gODc7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgaUxlbjsgaSArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodyA8IEwnMCcgfHwgdyA+IEwnOScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gY2ggKiAxMCArIHcgLSBMJzAnOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChjaCAhPSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlNldFRleHRDaGFyKG1faUVudGl0eVN0YXJ0LCBjaCk7DQotICAgICAgICAgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmIChjc0VudGl0eS5Db21wYXJlKEwiYW1wIikgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5TZXRUZXh0Q2hhcihtX2lFbnRpdHlTdGFydCwgTCcmJyk7DQotICAgICAgICAgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwibHQiKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlNldFRleHRDaGFyKG1faUVudGl0eVN0YXJ0LCBMJzwnKTsNCi0gICAgICAgICAgICAgICAgICAgIG1faUVudGl0eVN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJndCIpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnPicpOw0KLSAgICAgICAgICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgKys7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZShMImFwb3MiKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlNldFRleHRDaGFyKG1faUVudGl0eVN0YXJ0LCBMJ1wnJyk7DQotICAgICAgICAgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCArKzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwicXVvdCIpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnXCInKTsNCi0gICAgICAgICAgICAgICAgICAgIG1faUVudGl0eVN0YXJ0ICsrOw0KLSAgICAgICAgICAgICAgICB9DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlMZW47IGkrKykgew0KKyAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsNCisgICAgICAgICAgICBpZiAodyA8IEwnMCcgfHwgdyA+IEwnOScpIHsNCisgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjaCA9IGNoICogMTAgKyB3IC0gTCcwJzsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgbV9CbG9ja0J1ZmZlci5EZWxldGVUZXh0Q2hhcnMobV9pRGF0YUxlbmd0aCAtIG1faUVudGl0eVN0YXJ0LCBGQUxTRSk7DQotICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQotICAgICAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKG1faUVudGl0eVN0YXJ0IDwgMCAmJiBjaCA9PSBMJyYnKSB7DQotICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgPSBtX2lEYXRhTGVuZ3RoIC0gMTsNCisgICAgICAgIGlmIChjaCAhPSAwKSB7DQorICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIGNoKTsNCisgICAgICAgICAgbV9pRW50aXR5U3RhcnQrKzsNCiAgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJhbXAiKSA9PSAwKSB7DQorICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnJicpOw0KKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwibHQiKSA9PSAwKSB7DQorICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnPCcpOw0KKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwiZ3QiKSA9PSAwKSB7DQorICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnPicpOw0KKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwiYXBvcyIpID09IDApIHsNCisgICAgICAgICAgbV9CbG9ja0J1ZmZlci5TZXRUZXh0Q2hhcihtX2lFbnRpdHlTdGFydCwgTCdcJycpOw0KKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwicXVvdCIpID09IDApIHsNCisgICAgICAgICAgbV9CbG9ja0J1ZmZlci5TZXRUZXh0Q2hhcihtX2lFbnRpdHlTdGFydCwgTCdcIicpOw0KKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBtX3BTdGFydCArKzsNCisgICAgbV9CbG9ja0J1ZmZlci5EZWxldGVUZXh0Q2hhcnMobV9pRGF0YUxlbmd0aCAtIG1faUVudGl0eVN0YXJ0LCBGQUxTRSk7DQorICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgbV9pRW50aXR5U3RhcnQgPSAtMTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX2lFbnRpdHlTdGFydCA8IDAgJiYgY2ggPT0gTCcmJykgew0KKyAgICAgIG1faUVudGl0eVN0YXJ0ID0gbV9pRGF0YUxlbmd0aCAtIDE7DQorICAgIH0NCisgIH0NCisgIG1fcFN0YXJ0Kys7DQogfQ0KICNlbHNlDQotdm9pZCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6UGFyc2VUZXh0Q2hhcihGWF9XQ0hBUiBjaCkNCi17DQotICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KLSAgICAgICAgUmVhbGxvY1RleHREYXRhQnVmZmVyKCk7DQotICAgIH0NCi0gICAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zXSA9IGNoOw0KLSAgICBpZiAobV9pRW50aXR5U3RhcnQgPiAtMSAmJiBjaCA9PSBMJzsnKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0VudGl0eShtX3B3c1RleHREYXRhICsgbV9pRW50aXR5U3RhcnQgKyAxLCBtX2lEYXRhUG9zIC0gbV9pRW50aXR5U3RhcnQgLSAxKTsNCi0gICAgICAgIGludDMyX3QgaUxlbiA9IGNzRW50aXR5LkdldExlbmd0aCgpOw0KLSAgICAgICAgaWYgKGlMZW4gPiAwKSB7DQotICAgICAgICAgICAgaWYgKGNzRW50aXR5WzBdID09IEwnIycpIHsNCi0gICAgICAgICAgICAgICAgY2ggPSAwOw0KLSAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Ow0KLSAgICAgICAgICAgICAgICBpZiAoaUxlbiA+IDEgJiYgY3NFbnRpdHlbMV0gPT0gTCd4Jykgew0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbjsgaSArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodyA+PSBMJzAnICYmIHcgPD0gTCc5Jykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSBMJzAnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodyA+PSBMJ0EnICYmIHcgPD0gTCdGJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA1NTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gTCdhJyAmJiB3IDw9IEwnZicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gODc7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgaUxlbjsgaSArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodyA8IEwnMCcgfHwgdyA+IEwnOScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gY2ggKiAxMCArIHcgLSBMJzAnOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChjaCAhPSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faUVudGl0eVN0YXJ0ICsrXSA9IGNoOw0KLSAgICAgICAgICAgICAgICB9DQordm9pZCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6UGFyc2VUZXh0Q2hhcihGWF9XQ0hBUiBjaCkgew0KKyAgaWYgKG1faURhdGFQb3MgPj0gbV9pVGV4dERhdGFTaXplKSB7DQorICAgIFJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpOw0KKyAgfQ0KKyAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zXSA9IGNoOw0KKyAgaWYgKG1faUVudGl0eVN0YXJ0ID4gLTEgJiYgY2ggPT0gTCc7Jykgew0KKyAgICBDRlhfV2lkZVN0cmluZyBjc0VudGl0eShtX3B3c1RleHREYXRhICsgbV9pRW50aXR5U3RhcnQgKyAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zIC0gbV9pRW50aXR5U3RhcnQgLSAxKTsNCisgICAgaW50MzJfdCBpTGVuID0gY3NFbnRpdHkuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuID4gMCkgew0KKyAgICAgIGlmIChjc0VudGl0eVswXSA9PSBMJyMnKSB7DQorICAgICAgICBjaCA9IDA7DQorICAgICAgICBGWF9XQ0hBUiB3Ow0KKyAgICAgICAgaWYgKGlMZW4gPiAxICYmIGNzRW50aXR5WzFdID09IEwneCcpIHsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbjsgaSsrKSB7DQorICAgICAgICAgICAgdyA9IGNzRW50aXR5W2ldOw0KKyAgICAgICAgICAgIGlmICh3ID49IEwnMCcgJiYgdyA8PSBMJzknKSB7DQorICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSBMJzAnOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodyA+PSBMJ0EnICYmIHcgPD0gTCdGJykgew0KKyAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gNTU7DQorICAgICAgICAgICAgfSBlbHNlIGlmICh3ID49IEwnYScgJiYgdyA8PSBMJ2YnKSB7DQorICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA4NzsNCiAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZiAoY3NFbnRpdHkuQ29tcGFyZShMImFtcCIpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRW50aXR5U3RhcnQgKytdID0gTCcmJzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwibHQiKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faUVudGl0eVN0YXJ0ICsrXSA9IEwnPCc7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZShMImd0IikgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSBMJz4nOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJhcG9zIikgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSBMJ1wnJzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwicXVvdCIpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRW50aXR5U3RhcnQgKytdID0gTCdcIic7DQotICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgaUxlbjsgaSsrKSB7DQorICAgICAgICAgICAgdyA9IGNzRW50aXR5W2ldOw0KKyAgICAgICAgICAgIGlmICh3IDwgTCcwJyB8fCB3ID4gTCc5Jykgew0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNoID0gY2ggKiAxMCArIHcgLSBMJzAnOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBtX2lEYXRhUG9zID0gbV9pRW50aXR5U3RhcnQ7DQotICAgICAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKG1faUVudGl0eVN0YXJ0IDwgMCAmJiBjaCA9PSBMJyYnKSB7DQotICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgaWYgKGNoICE9IDApIHsNCisgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9IGNoOw0KICAgICAgICAgfQ0KLSAgICAgICAgbV9pRGF0YVBvcyArKzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJhbXAiKSA9PSAwKSB7DQorICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRW50aXR5U3RhcnQrK10gPSBMJyYnOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwibHQiKSA9PSAwKSB7DQorICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRW50aXR5U3RhcnQrK10gPSBMJzwnOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwiZ3QiKSA9PSAwKSB7DQorICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRW50aXR5U3RhcnQrK10gPSBMJz4nOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwiYXBvcyIpID09IDApIHsNCisgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9IEwnXCcnOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwicXVvdCIpID09IDApIHsNCisgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9IEwnXCInOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBtX3BTdGFydCArKzsNCi19DQotdm9pZCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6UmVhbGxvY1RleHREYXRhQnVmZmVyKCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3B3c1RleHREYXRhICE9IE5VTEwpOw0KLSAgICBpZiAobV9pVGV4dERhdGFTaXplIDw9IDEwMjQgKiAxMDI0KSB7DQotICAgICAgICBtX2lUZXh0RGF0YVNpemUgKj0gMjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1faVRleHREYXRhU2l6ZSArPSAxMDI0ICogMTAyNDsNCisgICAgbV9pRGF0YVBvcyA9IG1faUVudGl0eVN0YXJ0Ow0KKyAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1faUVudGl0eVN0YXJ0IDwgMCAmJiBjaCA9PSBMJyYnKSB7DQorICAgICAgbV9pRW50aXR5U3RhcnQgPSBtX2lEYXRhUG9zOw0KICAgICB9DQotICAgIG1fcHdzVGV4dERhdGEgPSAoRlhfV0NIQVIqKUZERV9SZWFsbG9jKG1fcHdzVGV4dERhdGEsIG1faVRleHREYXRhU2l6ZSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBtX2lEYXRhUG9zKys7DQorICB9DQorICBtX3BTdGFydCsrOw0KIH0NCi12b2lkIENGREVfWE1MU3ludGF4UGFyc2VyOjpHZXREYXRhKENGWF9XaWRlU3RyaW5nICZ3c0RhdGEpIGNvbnN0DQotew0KLSAgICBGWF9XQ0hBUiogcEJ1ZiA9IHdzRGF0YS5HZXRCdWZmZXIobV9pVGV4dERhdGFMZW5ndGgpOw0KLSAgICBGWFNZU19tZW1jcHkocEJ1ZiwgbV9wd3NUZXh0RGF0YSwgbV9pVGV4dERhdGFMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgd3NEYXRhLlJlbGVhc2VCdWZmZXIobV9pVGV4dERhdGFMZW5ndGgpOw0KK3ZvaWQgQ0ZERV9YTUxTeW50YXhQYXJzZXI6OlJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpIHsNCisgIEZYU1lTX2Fzc2VydChtX3B3c1RleHREYXRhICE9IE5VTEwpOw0KKyAgaWYgKG1faVRleHREYXRhU2l6ZSA8PSAxMDI0ICogMTAyNCkgew0KKyAgICBtX2lUZXh0RGF0YVNpemUgKj0gMjsNCisgIH0gZWxzZSB7DQorICAgIG1faVRleHREYXRhU2l6ZSArPSAxMDI0ICogMTAyNDsNCisgIH0NCisgIG1fcHdzVGV4dERhdGEgPQ0KKyAgICAgIChGWF9XQ0hBUiopRkRFX1JlYWxsb2MobV9wd3NUZXh0RGF0YSwgbV9pVGV4dERhdGFTaXplICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxTeW50YXhQYXJzZXI6OkdldERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSkgY29uc3Qgew0KKyAgRlhfV0NIQVIqIHBCdWYgPSB3c0RhdGEuR2V0QnVmZmVyKG1faVRleHREYXRhTGVuZ3RoKTsNCisgIEZYU1lTX21lbWNweShwQnVmLCBtX3B3c1RleHREYXRhLCBtX2lUZXh0RGF0YUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgd3NEYXRhLlJlbGVhc2VCdWZmZXIobV9pVGV4dERhdGFMZW5ndGgpOw0KIH0NCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMveG1sL2ZkZV94bWwuaCBiL3hmYS9zcmMvZmRwL3NyYy94bWwvZmRlX3htbC5oCmluZGV4IGRkYjk0NzQuLjZmN2RhODAgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmRwL3NyYy94bWwvZmRlX3htbC5oCisrKyBiL3hmYS9zcmMvZmRwL3NyYy94bWwvZmRlX3htbC5oCkBAIC0xOSw0MjUgKzE5LDM1NiBAQAogY2xhc3MgQ0ZERV9YTUxET01QYXJzZXI7DQogY2xhc3MgQ0ZERV9YTUxTQVhQYXJzZXI7DQogY2xhc3MgQ0ZERV9YTUxTeW50YXhQYXJzZXI7DQotY2xhc3MgQ0ZERV9YTUxOb2RlIDogcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1hNTE5vZGUoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX1hNTE5PREVUWVBFCUdldFR5cGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gRkRFX1hNTE5PREVfVW5rbm93bjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUNvdW50Q2hpbGROb2RlcygpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIENGREVfWE1MTm9kZSoJR2V0Q2hpbGROb2RlKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldENoaWxkTm9kZUluZGV4KENGREVfWE1MTm9kZSAqcE5vZGUpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIENGREVfWE1MTm9kZSoJR2V0UGF0aChjb25zdCBGWF9XQ0hBUiogcFBhdGgsIGludDMyX3QgaUxlbmd0aCA9IC0xLCBGWF9CT09MIGJRdWFsaWZpZWROYW1lID0gVFJVRSkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJSW5zZXJ0Q2hpbGROb2RlKENGREVfWE1MTm9kZSAqcE5vZGUsIGludDMyX3QgaW5kZXggPSAtMSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbW92ZUNoaWxkTm9kZShDRkRFX1hNTE5vZGUgKnBOb2RlKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJRGVsZXRlQ2hpbGRyZW4oKTsNCi0gICAgdmlydHVhbCBDRkRFX1hNTE5vZGUqCUdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0pIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldE5vZGVMZXZlbCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJbnNlcnROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtLCBDRkRFX1hNTE5vZGUgKnBOb2RlKTsNCi0gICAgdmlydHVhbAlDRkRFX1hNTE5vZGUqCVJlbW92ZU5vZGVJdGVtKElGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0pOw0KLSAgICB2aXJ0dWFsIENGREVfWE1MTm9kZSoJQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2F2ZVhNTE5vZGUoSUZYX1N0cmVhbSAqcFhNTFN0cmVhbSk7DQotcHVibGljOg0KLSAgICB+Q0ZERV9YTUxOb2RlKCk7DQotICAgIHZvaWQJCQkJCUNsb25lQ2hpbGRyZW4oQ0ZERV9YTUxOb2RlKiBwQ2xvbmUpOw0KLSAgICBDRkRFX1hNTE5vZGUJKm1fcFBhcmVudDsNCi0gICAgQ0ZERV9YTUxOb2RlCSptX3BDaGlsZDsNCi0gICAgQ0ZERV9YTUxOb2RlCSptX3BQcmlvcjsNCi0gICAgQ0ZERV9YTUxOb2RlCSptX3BOZXh0Ow0KLX07DQotY2xhc3MgQ0ZERV9YTUxJbnN0cnVjdGlvbiA6IHB1YmxpYyBDRkRFX1hNTE5vZGUNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1hNTEluc3RydWN0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9YTUxOT0RFVFlQRQlHZXRUeXBlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOw0KLSAgICB9DQotICAgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKglDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUYXJnZXROYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgd3NUYXJnZXQgPSBtX3dzVGFyZ2V0Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJQ291bnRBdHRyaWJ1dGVzKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEF0dHJpYnV0ZShpbnQzMl90IGluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaU5hbWUsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlIYXNBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlLCBjb25zdCBGWF9XQ0hBUiogcHdzRGVmVmFsdWUgPSBOVUxMKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpTmFtZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBpbnQzMl90IGlEZWZWYWx1ZSA9IDApIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIGludDMyX3QgaUF0dHJpVmFsdWUpOw0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQlHZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmRGVmVmFsdWUgPSAwKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0RmxvYXQoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkF0dHJpVmFsdWUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZW1vdmVBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJQ291bnREYXRhKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldERhdGEoaW50MzJfdCBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzRGF0YSkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFwcGVuZERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRGF0YSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbW92ZURhdGEoaW50MzJfdCBpbmRleCk7DQotcHVibGljOg0KLSAgICB+Q0ZERV9YTUxJbnN0cnVjdGlvbigpIHt9DQotICAgIENGWF9XaWRlU3RyaW5nCQkJbV93c1RhcmdldDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdBcnJheQkJbV9BdHRyaWJ1dGVzOw0KLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5CQltX1RhcmdldERhdGE7DQotfTsNCi1jbGFzcyBDRkRFX1hNTEVsZW1lbnQgOiBwdWJsaWMgQ0ZERV9YTUxOb2RlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9YTUxFbGVtZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RhZyk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9YTUxOT0RFVFlQRQlHZXRUeXBlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZERV9YTUxOT0RFX0VsZW1lbnQ7DQotICAgIH0NCi0gICAgdmlydHVhbCBDRkRFX1hNTE5vZGUqCUNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0TG9jYWxUYWdOYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhZykgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldE5hbWVzcGFjZVByZWZpeChDRlhfV2lkZVN0cmluZyAmd3NQcmVmaXgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXROYW1lc3BhY2VVUkkoQ0ZYX1dpZGVTdHJpbmcgJndzTmFtZXNwYWNlKSBjb25zdDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlDb3VudEF0dHJpYnV0ZXMoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QXR0cmlidXRlKGludDMyX3QgaW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlWYWx1ZSkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUhhc0F0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0U3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIENGWF9XaWRlU3RyaW5nICZ3c0F0dHJpVmFsdWUsIGNvbnN0IEZYX1dDSEFSKiBwd3NEZWZWYWx1ZSA9IE5VTEwpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlOYW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIGludDMyX3QgaURlZlZhbHVlID0gMCkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgaW50MzJfdCBpQXR0cmlWYWx1ZSk7DQotICAgIHZpcnR1YWwgRlhfRkxPQVQJCUdldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIEZYX0ZMT0FUIGZEZWZWYWx1ZSA9IDApIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmQXR0cmlWYWx1ZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbW92ZUF0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldFRleHREYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLXB1YmxpYzoNCi0gICAgfkNGREVfWE1MRWxlbWVudCgpOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3NUYWc7DQotICAgIENGWF9XaWRlU3RyaW5nQXJyYXkJCW1fQXR0cmlidXRlczsNCi19Ow0KLWNsYXNzIENGREVfWE1MVGV4dCA6IHB1YmxpYyBDRkRFX1hNTE5vZGUNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1hNTFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZERV9YTUxOT0RFVFlQRQlHZXRUeXBlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZERV9YTUxOT0RFX1RleHQ7DQotICAgIH0NCi0gICAgdmlydHVhbCBDRkRFX1hNTE5vZGUqCUNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgd3NUZXh0ID0gbV93c1RleHQ7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLSAgICB7DQotICAgICAgICBtX3dzVGV4dCA9IHdzVGV4dDsNCi0gICAgfQ0KLXB1YmxpYzoNCi0gICAgfkNGREVfWE1MVGV4dCgpIHt9DQotICAgIENGWF9XaWRlU3RyaW5nCQltX3dzVGV4dDsNCi19Ow0KLWNsYXNzIENGREVfWE1MRGVjbGFyYXRpb24gOiBwdWJsaWMgQ0ZERV9YTUxOb2RlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9YTUxEZWNsYXJhdGlvbigpIDogQ0ZERV9YTUxOb2RlKCkgeyB9DQotfTsNCi1jbGFzcyBDRkRFX1hNTENoYXJEYXRhIDogcHVibGljIENGREVfWE1MRGVjbGFyYXRpb24NCi17DQotcHVibGljOg0KLSAgICBDRkRFX1hNTENoYXJEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0NEYXRhKTsNCitjbGFzcyBDRkRFX1hNTE5vZGUgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfWE1MTm9kZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIEZERV9YTUxOT0RFVFlQRSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRkRFX1hNTE5PREVfVW5rbm93bjsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50Q2hpbGROb2RlcygpIGNvbnN0Ow0KKyAgdmlydHVhbCBDRkRFX1hNTE5vZGUqIEdldENoaWxkTm9kZShpbnQzMl90IGluZGV4KSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGlsZE5vZGVJbmRleChDRkRFX1hNTE5vZGUqIHBOb2RlKSBjb25zdDsNCisgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKiBHZXRQYXRoKGNvbnN0IEZYX1dDSEFSKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IC0xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUXVhbGlmaWVkTmFtZSA9IFRSVUUpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEluc2VydENoaWxkTm9kZShDRkRFX1hNTE5vZGUqIHBOb2RlLCBpbnQzMl90IGluZGV4ID0gLTEpOw0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZUNoaWxkTm9kZShDRkRFX1hNTE5vZGUqIHBOb2RlKTsNCisgIHZpcnR1YWwgdm9pZCBEZWxldGVDaGlsZHJlbigpOw0KKyAgdmlydHVhbCBDRkRFX1hNTE5vZGUqIEdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0pIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldE5vZGVMZXZlbCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIEluc2VydE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlKiBwTm9kZSk7DQorICB2aXJ0dWFsIENGREVfWE1MTm9kZSogUmVtb3ZlTm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSk7DQorICB2aXJ0dWFsIENGREVfWE1MTm9kZSogQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKTsNCisgIHZpcnR1YWwgdm9pZCBTYXZlWE1MTm9kZShJRlhfU3RyZWFtKiBwWE1MU3RyZWFtKTsNCiANCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRkRFX1hNTE5PREVUWVBFCUdldFR5cGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gRkRFX1hNTE5PREVfQ2hhckRhdGE7DQotICAgIH0NCi0gICAgdmlydHVhbCBDRkRFX1hNTE5vZGUqCUNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldENoYXJEYXRhKENGWF9XaWRlU3RyaW5nICZ3c0NoYXJEYXRhKSBjb25zdA0KLSAgICB7DQotICAgICAgICB3c0NoYXJEYXRhID0gbV93c0NoYXJEYXRhOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldENoYXJEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0NEYXRhKQ0KLSAgICB7DQotICAgICAgICBtX3dzQ2hhckRhdGEgPSB3c0NEYXRhOw0KLSAgICB9DQotDQotcHVibGljOg0KLSAgICB+Q0ZERV9YTUxDaGFyRGF0YSgpIHt9DQotDQotICAgIENGWF9XaWRlU3RyaW5nCQltX3dzQ2hhckRhdGE7DQorIHB1YmxpYzoNCisgIH5DRkRFX1hNTE5vZGUoKTsNCisgIHZvaWQgQ2xvbmVDaGlsZHJlbihDRkRFX1hNTE5vZGUqIHBDbG9uZSk7DQorICBDRkRFX1hNTE5vZGUqIG1fcFBhcmVudDsNCisgIENGREVfWE1MTm9kZSogbV9wQ2hpbGQ7DQorICBDRkRFX1hNTE5vZGUqIG1fcFByaW9yOw0KKyAgQ0ZERV9YTUxOb2RlKiBtX3BOZXh0Ow0KIH07DQotY2xhc3MgQ0ZERV9YTUxEb2MgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfWE1MRG9jKCk7DQotICAgIH5DRkRFX1hNTERvYygpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQkJTG9hZFhNTChJRlhfU3RyZWFtICpwWE1MU3RyZWFtLCBpbnQzMl90IGlYTUxQbGFuZVNpemUgPSA4MTkyLCBpbnQzMl90IGlUZXh0RGF0YVNpemUgPSAyNTYsIEZERV9MUFhNTFJFQURFUkhBTkRMRVIgcEhhbmRsZXIgPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJTG9hZFhNTChJRkRFX1hNTFBhcnNlciAqcFhNTFBhcnNlcik7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJRG9Mb2FkKElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUNsb3NlWE1MKCk7DQotICAgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKglHZXRSb290KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcFJvb3Q7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJU2F2ZVhNTChJRlhfU3RyZWFtICpwWE1MU3RyZWFtID0gTlVMTCwgRlhfQk9PTCBiU2F2ZUJPTSA9IFRSVUUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTYXZlWE1MTm9kZShJRlhfU3RyZWFtICpwWE1MU3RyZWFtLCBJRkRFX1hNTE5vZGUgKnBOb2RlKTsNCi1wcm90ZWN0ZWQ6DQotICAgIElGWF9TdHJlYW0JCQkJKm1fcFN0cmVhbTsNCi0gICAgaW50MzJfdAkJCQltX2lTdGF0dXM7DQotICAgIENGREVfWE1MTm9kZQkJCSptX3BSb290Ow0KLSAgICBJRkRFX1hNTFN5bnRheFBhcnNlcgkqbV9wU3ludGF4UGFyc2VyOw0KLSAgICBJRkRFX1hNTFBhcnNlcgkJCSptX3BYTUxQYXJzZXI7DQotICAgIHZvaWQJCQlSZXNldChGWF9CT09MIGJJbml0Um9vdCk7DQotICAgIHZvaWQJCQlSZWxlYXNlUGFyc2VyKCk7DQotfTsNCi10eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPENGREVfWE1MTm9kZSo+CUNGREVfWE1MRE9NTm9kZVN0YWNrOw0KLWNsYXNzIENGREVfWE1MRE9NUGFyc2VyIDogcHVibGljIElGREVfWE1MUGFyc2VyLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfWE1MRE9NUGFyc2VyKENGREVfWE1MTm9kZSAqcFJvb3QsIElGREVfWE1MU3ludGF4UGFyc2VyCSpwUGFyc2VyKTsNCi0gICAgfkNGREVfWE1MRE9NUGFyc2VyKCk7DQorY2xhc3MgQ0ZERV9YTUxJbnN0cnVjdGlvbiA6IHB1YmxpYyBDRkRFX1hNTE5vZGUgew0KKyBwdWJsaWM6DQorICBDRkRFX1hNTEluc3RydWN0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRkRFX1hNTE5PREVUWVBFIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbjsgfQ0KKyAgdmlydHVhbCBDRkRFX1hNTE5vZGUqIENsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSk7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGFyZ2V0TmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIGNvbnN0IHsNCisgICAgd3NUYXJnZXQgPSBtX3dzVGFyZ2V0Ow0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50QXR0cmlidXRlcygpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIEdldEF0dHJpYnV0ZShpbnQzMl90IGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIEhhc0F0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHB3c0RlZlZhbHVlID0gTlVMTCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgU2V0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGVmVmFsdWUgPSAwKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBTZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIGludDMyX3QgaUF0dHJpVmFsdWUpOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRGVmVmFsdWUgPSAwKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmQXR0cmlWYWx1ZSk7DQorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50RGF0YSgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIEdldERhdGEoaW50MzJfdCBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgQXBwZW5kRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRhKTsNCisgIHZpcnR1YWwgdm9pZCBSZW1vdmVEYXRhKGludDMyX3QgaW5kZXgpOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQlEb1BhcnNlcihJRlhfUGF1c2UgKnBQYXVzZSk7DQotcHJpdmF0ZToNCi0gICAgQ0ZERV9YTUxOb2RlCQkJKm1fcFJvb3Q7DQotICAgIElGREVfWE1MU3ludGF4UGFyc2VyCSptX3BQYXJzZXI7DQotICAgIENGREVfWE1MTm9kZQkJCSptX3BQYXJlbnQ7DQotICAgIENGREVfWE1MTm9kZQkJCSptX3BDaGlsZDsNCi0gICAgQ0ZERV9YTUxET01Ob2RlU3RhY2sJbV9Ob2RlU3RhY2s7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJbV93czE7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJbV93czI7DQorIHB1YmxpYzoNCisgIH5DRkRFX1hNTEluc3RydWN0aW9uKCkge30NCisgIENGWF9XaWRlU3RyaW5nIG1fd3NUYXJnZXQ7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IG1fQXR0cmlidXRlczsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgbV9UYXJnZXREYXRhOw0KIH07DQotY2xhc3MgQ0ZERV9YTUxUQUcgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfWE1MVEFHKCkgOiBlVHlwZShGREVfWE1MTk9ERV9Vbmtub3duKSB7fQ0KLSAgICBDRkRFX1hNTFRBRyhjb25zdCBDRkRFX1hNTFRBRyAmc3JjKSA6IHdzVGFnTmFtZShzcmMud3NUYWdOYW1lKSwgZVR5cGUoc3JjLmVUeXBlKSB7fQ0KLSAgICBDRlhfV2lkZVN0cmluZwl3c1RhZ05hbWU7DQotICAgIEZERV9YTUxOT0RFVFlQRQllVHlwZTsNCi19Ow0KLXR5cGVkZWYgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGU8Q0ZERV9YTUxUQUc+CUNGREVfWE1MVGFnU3RhY2s7DQotY2xhc3MgQ0ZERV9YTUxTQVhQYXJzZXIgOiBwdWJsaWMgSUZERV9YTUxQYXJzZXIsIHB1YmxpYyBDRlhfVGFyZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9YTUxTQVhQYXJzZXIoRkRFX0xQWE1MUkVBREVSSEFORExFUiBwSGFuZGxlciwgSUZERV9YTUxTeW50YXhQYXJzZXIJKnBQYXJzZXIpOw0KLSAgICB+Q0ZERV9YTUxTQVhQYXJzZXIoKTsNCitjbGFzcyBDRkRFX1hNTEVsZW1lbnQgOiBwdWJsaWMgQ0ZERV9YTUxOb2RlIHsNCisgcHVibGljOg0KKyAgQ0ZERV9YTUxFbGVtZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhZyk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRkRFX1hNTE5PREVUWVBFIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGREVfWE1MTk9ERV9FbGVtZW50OyB9DQorICB2aXJ0dWFsIENGREVfWE1MTm9kZSogQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKTsNCisgIHZpcnR1YWwgdm9pZCBHZXRUYWdOYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhZykgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TG9jYWxUYWdOYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhZykgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TmFtZXNwYWNlUHJlZml4KENGWF9XaWRlU3RyaW5nJiB3c1ByZWZpeCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TmFtZXNwYWNlVVJJKENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZSkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRBdHRyaWJ1dGVzKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0QXR0cmlidXRlKGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0JPT0wgSGFzQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldFN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHdzRGVmVmFsdWUgPSBOVUxMKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBTZXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWZWYWx1ZSA9IDApIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIFNldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgaW50MzJfdCBpQXR0cmlWYWx1ZSk7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZEZWZWYWx1ZSA9IDApIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIFNldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIEZYX0ZMT0FUIGZBdHRyaVZhbHVlKTsNCisgIHZpcnR1YWwgdm9pZCBSZW1vdmVBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSk7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCURvUGFyc2VyKElGWF9QYXVzZSAqcFBhdXNlKTsNCi1wcml2YXRlOg0KLSAgICB2b2lkCQkJCQlQdXNoKGNvbnN0IENGREVfWE1MVEFHICZ4bWxUYWcpOw0KLSAgICB2b2lkCQkJCQlQb3AoKTsNCi0gICAgRkRFX0xQWE1MUkVBREVSSEFORExFUgltX3BIYW5kbGVyOw0KLSAgICBJRkRFX1hNTFN5bnRheFBhcnNlcgkqbV9wUGFyc2VyOw0KLSAgICBDRkRFX1hNTFRhZ1N0YWNrCQltX1RhZ1N0YWNrOw0KLSAgICBDRkRFX1hNTFRBRwkJCQkqbV9wVGFnVG9wOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3MxOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3MyOw0KKyBwdWJsaWM6DQorICB+Q0ZERV9YTUxFbGVtZW50KCk7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzVGFnOw0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSBtX0F0dHJpYnV0ZXM7DQorfTsNCitjbGFzcyBDRkRFX1hNTFRleHQgOiBwdWJsaWMgQ0ZERV9YTUxOb2RlIHsNCisgcHVibGljOg0KKyAgQ0ZERV9YTUxUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIEZERV9YTUxOT0RFVFlQRSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRkRFX1hNTE5PREVfVGV4dDsgfQ0KKyAgdmlydHVhbCBDRkRFX1hNTE5vZGUqIENsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSk7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCB7IHdzVGV4dCA9IG1fd3NUZXh0OyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7IG1fd3NUZXh0ID0gd3NUZXh0OyB9DQorDQorIHB1YmxpYzoNCisgIH5DRkRFX1hNTFRleHQoKSB7fQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1RleHQ7DQorfTsNCitjbGFzcyBDRkRFX1hNTERlY2xhcmF0aW9uIDogcHVibGljIENGREVfWE1MTm9kZSB7DQorIHB1YmxpYzoNCisgIENGREVfWE1MRGVjbGFyYXRpb24oKSA6IENGREVfWE1MTm9kZSgpIHt9DQorfTsNCitjbGFzcyBDRkRFX1hNTENoYXJEYXRhIDogcHVibGljIENGREVfWE1MRGVjbGFyYXRpb24gew0KKyBwdWJsaWM6DQorICBDRkRFX1hNTENoYXJEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NEYXRhKTsNCisNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGREVfWE1MTk9ERVRZUEUgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZERV9YTUxOT0RFX0NoYXJEYXRhOyB9DQorICB2aXJ0dWFsIENGREVfWE1MTm9kZSogQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKTsNCisgIHZpcnR1YWwgdm9pZCBHZXRDaGFyRGF0YShDRlhfV2lkZVN0cmluZyYgd3NDaGFyRGF0YSkgY29uc3Qgew0KKyAgICB3c0NoYXJEYXRhID0gbV93c0NoYXJEYXRhOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldENoYXJEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NEYXRhKSB7DQorICAgIG1fd3NDaGFyRGF0YSA9IHdzQ0RhdGE7DQorICB9DQorDQorIHB1YmxpYzoNCisgIH5DRkRFX1hNTENoYXJEYXRhKCkge30NCisNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NDaGFyRGF0YTsNCit9Ow0KK2NsYXNzIENGREVfWE1MRG9jIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX1hNTERvYygpOw0KKyAgfkNGREVfWE1MRG9jKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkWE1MKElGWF9TdHJlYW0qIHBYTUxTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlYTUxQbGFuZVNpemUgPSA4MTkyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVGV4dERhdGFTaXplID0gMjU2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0xQWE1MUkVBREVSSEFORExFUiBwSGFuZGxlciA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRYTUwoSUZERV9YTUxQYXJzZXIqIHBYTUxQYXJzZXIpOw0KKyAgdmlydHVhbCBpbnQzMl90IERvTG9hZChJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOw0KKyAgdmlydHVhbCB2b2lkIENsb3NlWE1MKCk7DQorICB2aXJ0dWFsIENGREVfWE1MTm9kZSogR2V0Um9vdCgpIGNvbnN0IHsgcmV0dXJuIG1fcFJvb3Q7IH0NCisgIHZpcnR1YWwgdm9pZCBTYXZlWE1MKElGWF9TdHJlYW0qIHBYTUxTdHJlYW0gPSBOVUxMLCBGWF9CT09MIGJTYXZlQk9NID0gVFJVRSk7DQorICB2aXJ0dWFsIHZvaWQgU2F2ZVhNTE5vZGUoSUZYX1N0cmVhbSogcFhNTFN0cmVhbSwgSUZERV9YTUxOb2RlKiBwTm9kZSk7DQorDQorIHByb3RlY3RlZDoNCisgIElGWF9TdHJlYW0qIG1fcFN0cmVhbTsNCisgIGludDMyX3QgbV9pU3RhdHVzOw0KKyAgQ0ZERV9YTUxOb2RlKiBtX3BSb290Ow0KKyAgSUZERV9YTUxTeW50YXhQYXJzZXIqIG1fcFN5bnRheFBhcnNlcjsNCisgIElGREVfWE1MUGFyc2VyKiBtX3BYTUxQYXJzZXI7DQorICB2b2lkIFJlc2V0KEZYX0JPT0wgYkluaXRSb290KTsNCisgIHZvaWQgUmVsZWFzZVBhcnNlcigpOw0KK307DQordHlwZWRlZiBDRlhfU3RhY2tUZW1wbGF0ZTxDRkRFX1hNTE5vZGUqPiBDRkRFX1hNTERPTU5vZGVTdGFjazsNCitjbGFzcyBDRkRFX1hNTERPTVBhcnNlciA6IHB1YmxpYyBJRkRFX1hNTFBhcnNlciwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX1hNTERPTVBhcnNlcihDRkRFX1hNTE5vZGUqIHBSb290LCBJRkRFX1hNTFN5bnRheFBhcnNlciogcFBhcnNlcik7DQorICB+Q0ZERV9YTUxET01QYXJzZXIoKTsNCisNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IERvUGFyc2VyKElGWF9QYXVzZSogcFBhdXNlKTsNCisNCisgcHJpdmF0ZToNCisgIENGREVfWE1MTm9kZSogbV9wUm9vdDsNCisgIElGREVfWE1MU3ludGF4UGFyc2VyKiBtX3BQYXJzZXI7DQorICBDRkRFX1hNTE5vZGUqIG1fcFBhcmVudDsNCisgIENGREVfWE1MTm9kZSogbV9wQ2hpbGQ7DQorICBDRkRFX1hNTERPTU5vZGVTdGFjayBtX05vZGVTdGFjazsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3MxOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93czI7DQorfTsNCitjbGFzcyBDRkRFX1hNTFRBRyA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9YTUxUQUcoKSA6IGVUeXBlKEZERV9YTUxOT0RFX1Vua25vd24pIHt9DQorICBDRkRFX1hNTFRBRyhjb25zdCBDRkRFX1hNTFRBRyYgc3JjKQ0KKyAgICAgIDogd3NUYWdOYW1lKHNyYy53c1RhZ05hbWUpLCBlVHlwZShzcmMuZVR5cGUpIHt9DQorICBDRlhfV2lkZVN0cmluZyB3c1RhZ05hbWU7DQorICBGREVfWE1MTk9ERVRZUEUgZVR5cGU7DQorfTsNCit0eXBlZGVmIENGWF9PYmplY3RTdGFja1RlbXBsYXRlPENGREVfWE1MVEFHPiBDRkRFX1hNTFRhZ1N0YWNrOw0KK2NsYXNzIENGREVfWE1MU0FYUGFyc2VyIDogcHVibGljIElGREVfWE1MUGFyc2VyLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfWE1MU0FYUGFyc2VyKEZERV9MUFhNTFJFQURFUkhBTkRMRVIgcEhhbmRsZXIsDQorICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTFN5bnRheFBhcnNlciogcFBhcnNlcik7DQorICB+Q0ZERV9YTUxTQVhQYXJzZXIoKTsNCisNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IERvUGFyc2VyKElGWF9QYXVzZSogcFBhdXNlKTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgUHVzaChjb25zdCBDRkRFX1hNTFRBRyYgeG1sVGFnKTsNCisgIHZvaWQgUG9wKCk7DQorICBGREVfTFBYTUxSRUFERVJIQU5ETEVSIG1fcEhhbmRsZXI7DQorICBJRkRFX1hNTFN5bnRheFBhcnNlciogbV9wUGFyc2VyOw0KKyAgQ0ZERV9YTUxUYWdTdGFjayBtX1RhZ1N0YWNrOw0KKyAgQ0ZERV9YTUxUQUcqIG1fcFRhZ1RvcDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3MxOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93czI7DQogfTsNCiAjaWZkZWYgX0ZERV9CTE9DS19CVUZGRVINCi1jbGFzcyBDRkRFX0Jsb2NrQnVmZmVyIDogcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX0Jsb2NrQnVmZmVyKGludDMyX3QgaUFsbG9jU3RlcCA9IDEwMjQgKiAxMDI0KTsNCi0gICAgfkNGREVfQmxvY2tCdWZmZXIoKTsNCitjbGFzcyBDRkRFX0Jsb2NrQnVmZmVyIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0Jsb2NrQnVmZmVyKGludDMyX3QgaUFsbG9jU3RlcCA9IDEwMjQgKiAxMDI0KTsNCisgIH5DRkRFX0Jsb2NrQnVmZmVyKCk7DQogDQotICAgIEZYX0JPT0wgSW5pdEJ1ZmZlcihpbnQzMl90IGlCdWZmZXJTaXplID0gMTAyNCAqIDEwMjQpOw0KLSAgICBGWF9CT09MIElzSW5pdGlhbGl6ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9pQnVmZmVyU2l6ZSAvIG1faUFsbG9jU3RlcCA+PSAxOw0KKyAgRlhfQk9PTCBJbml0QnVmZmVyKGludDMyX3QgaUJ1ZmZlclNpemUgPSAxMDI0ICogMTAyNCk7DQorICBGWF9CT09MIElzSW5pdGlhbGl6ZWQoKSB7IHJldHVybiBtX2lCdWZmZXJTaXplIC8gbV9pQWxsb2NTdGVwID49IDE7IH0NCisgIHZvaWQgUmVsZWFzZUJ1ZmZlcigpIHsgZGVsZXRlIHRoaXM7IH0NCisgIEZYX1dDSEFSKiBHZXRBdmFpbGFibGVCbG9jayhpbnQzMl90JiBpSW5kZXhJbkJsb2NrKTsNCisgIGlubGluZSBpbnQzMl90IEdldEFsbG9jU3RlcCgpIGNvbnN0IHsgcmV0dXJuIG1faUFsbG9jU3RlcDsgfQ0KKyAgaW5saW5lIGludDMyX3QmIEdldERhdGFMZW5ndGhSZWYoKSB7IHJldHVybiBtX2lEYXRhTGVuZ3RoOyB9DQorICBpbmxpbmUgdm9pZCBSZXNldChGWF9CT09MIGJSZXNlcnZlRGF0YSA9IFRSVUUpIHsNCisgICAgaWYgKCFiUmVzZXJ2ZURhdGEpIHsNCisgICAgICBtX2lTdGFydFBvc2l0aW9uID0gMDsNCiAgICAgfQ0KLSAgICB2b2lkIFJlbGVhc2VCdWZmZXIoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICBGWF9XQ0hBUiogR2V0QXZhaWxhYmxlQmxvY2soaW50MzJfdCYgaUluZGV4SW5CbG9jayk7DQotICAgIGlubGluZSBpbnQzMl90IEdldEFsbG9jU3RlcCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lBbGxvY1N0ZXA7DQotICAgIH0NCi0gICAgaW5saW5lIGludDMyX3QmIEdldERhdGFMZW5ndGhSZWYoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9pRGF0YUxlbmd0aDsNCi0gICAgfQ0KLSAgICBpbmxpbmUgdm9pZCBSZXNldChGWF9CT09MIGJSZXNlcnZlRGF0YSA9IFRSVUUpDQotICAgIHsNCi0gICAgICAgIGlmICghYlJlc2VydmVEYXRhKSB7DQotICAgICAgICAgICAgbV9pU3RhcnRQb3NpdGlvbiA9IDA7DQotICAgICAgICB9DQotICAgICAgICBtX2lEYXRhTGVuZ3RoID0gMDsNCi0gICAgfQ0KLSAgICB2b2lkIFNldFRleHRDaGFyKGludDMyX3QgaUluZGV4LCBGWF9XQ0hBUiBjaCk7DQotICAgIGludDMyX3QgRGVsZXRlVGV4dENoYXJzKGludDMyX3QgaUNvdW50LCBGWF9CT09MIGJEaXJlY3Rpb24gPSBUUlVFKTsNCi0gICAgdm9pZCAgR2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dERhdGEsIGludDMyX3QgaVN0YXJ0ICA9IDAsIGludDMyX3QgaUxlbmd0aCA9IC0xKSBjb25zdDsNCisgICAgbV9pRGF0YUxlbmd0aCA9IDA7DQorICB9DQorICB2b2lkIFNldFRleHRDaGFyKGludDMyX3QgaUluZGV4LCBGWF9XQ0hBUiBjaCk7DQorICBpbnQzMl90IERlbGV0ZVRleHRDaGFycyhpbnQzMl90IGlDb3VudCwgRlhfQk9PTCBiRGlyZWN0aW9uID0gVFJVRSk7DQorICB2b2lkIEdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nJiB3c1RleHREYXRhLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IC0xKSBjb25zdDsNCiANCi1wcm90ZWN0ZWQ6DQotICAgIGlubGluZSB2b2lkIFRleHREYXRhSW5kZXgyQnVmSW5kZXgoY29uc3QgaW50MzJfdCBpSW5kZXgsIGludDMyX3QmIGlCbG9ja0luZGV4LCBpbnQzMl90JiBpSW5uZXJJbmRleCkgY29uc3Q7DQotICAgIHZvaWQgQ2xlYXJCdWZmZXIoKTsNCi0gICAgQ0ZYX1B0ckFycmF5IG1fQmxvY2tBcnJheTsNCi0gICAgaW50MzJfdCBtX2lEYXRhTGVuZ3RoOw0KLSAgICBpbnQzMl90IG1faUJ1ZmZlclNpemU7DQotICAgIGludDMyX3QgbV9pQWxsb2NTdGVwOw0KLSAgICBpbnQzMl90IG1faVN0YXJ0UG9zaXRpb247DQorIHByb3RlY3RlZDoNCisgIGlubGluZSB2b2lkIFRleHREYXRhSW5kZXgyQnVmSW5kZXgoY29uc3QgaW50MzJfdCBpSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlCbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW5uZXJJbmRleCkgY29uc3Q7DQorICB2b2lkIENsZWFyQnVmZmVyKCk7DQorICBDRlhfUHRyQXJyYXkgbV9CbG9ja0FycmF5Ow0KKyAgaW50MzJfdCBtX2lEYXRhTGVuZ3RoOw0KKyAgaW50MzJfdCBtX2lCdWZmZXJTaXplOw0KKyAgaW50MzJfdCBtX2lBbGxvY1N0ZXA7DQorICBpbnQzMl90IG1faVN0YXJ0UG9zaXRpb247DQogfTsNCiAjZW5kaWYNCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1RleHQJCQkJMA0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfTm9kZQkJCQkxDQotI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQJCQkyDQotI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9UYWcJCQkJMw0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlOYW1lCQkJNA0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlFcXVhbFNpZ24JNQ0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlRdW90YXRpb24JNg0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlWYWx1ZQkJNw0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfRW50aXR5CQkJOA0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfRW50aXR5RGVjaW1hbAkJOQ0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfRW50aXR5SGV4CQkJMTANCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlSW5zdHJ1Y3Rpb24JMTENCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0JyZWFrRWxlbWVudAkJMTINCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlRWxlbWVudAkJMTMNCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1NraXBEZWNsTm9kZQkJMTQNCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0RlY2xDaGFyRGF0YQkJMTUNCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50CQkxNg0KLSNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfU2tpcENvbW1lbnRPckRlY2wJMTcNCi0jZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGEJCTE4DQotY2xhc3MgQ0ZERV9YTUxTeW50YXhQYXJzZXIgOiBwdWJsaWMgSUZERV9YTUxTeW50YXhQYXJzZXIsIHB1YmxpYyBDRlhfVGFyZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9YTUxTeW50YXhQYXJzZXIoKTsNCi0gICAgfkNGREVfWE1MU3ludGF4UGFyc2VyKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlJbml0KElGWF9TdHJlYW0gKnBTdHJlYW0sIGludDMyX3QgaVhNTFBsYW5lU2l6ZSwgaW50MzJfdCBpVGV4dERhdGFTaXplID0gMjU2KTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJRG9TeW50YXhQYXJzZSgpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldFN0YXR1cygpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEN1cnJlbnRQb3MoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9pUGFyc2VkQ2hhcnMgKyAobV9wU3RhcnQgLSBtX3BCdWZmZXIpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldEN1cnJlbnRCaW5hcnlQb3MoKSBjb25zdDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRDdXJyZW50Tm9kZU51bWJlcigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lDdXJyZW50Tm9kZU51bTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldExhc3ROb2RlTnVtYmVyKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faUxhc3ROb2RlTnVtOw0KLSAgICB9DQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0IDANCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX05vZGUgMQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0IDINCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1RhZyAzDQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaU5hbWUgNA0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlFcXVhbFNpZ24gNQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlRdW90YXRpb24gNg0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlWYWx1ZSA3DQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9FbnRpdHkgOA0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfRW50aXR5RGVjaW1hbCA5DQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9FbnRpdHlIZXggMTANCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlSW5zdHJ1Y3Rpb24gMTENCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0JyZWFrRWxlbWVudCAxMg0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50IDEzDQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwRGVjbE5vZGUgMTQNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0RlY2xDaGFyRGF0YSAxNQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfU2tpcENvbW1lbnQgMTYNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50T3JEZWNsIDE3DQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhIDE4DQorY2xhc3MgQ0ZERV9YTUxTeW50YXhQYXJzZXIgOiBwdWJsaWMgSUZERV9YTUxTeW50YXhQYXJzZXIsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9YTUxTeW50YXhQYXJzZXIoKTsNCisgIH5DRkRFX1hNTFN5bnRheFBhcnNlcigpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIHZvaWQgSW5pdChJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpWE1MUGxhbmVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVGV4dERhdGFTaXplID0gMjU2KTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgRG9TeW50YXhQYXJzZSgpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFN0YXR1cygpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldEN1cnJlbnRQb3MoKSBjb25zdCB7DQorICAgIHJldHVybiBtX2lQYXJzZWRDaGFycyArIChtX3BTdGFydCAtIG1fcEJ1ZmZlcik7DQorICB9DQorICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldEN1cnJlbnRCaW5hcnlQb3MoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJyZW50Tm9kZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1faUN1cnJlbnROb2RlTnVtOyB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGFzdE5vZGVOdW1iZXIoKSBjb25zdCB7IHJldHVybiBtX2lMYXN0Tm9kZU51bTsgfQ0KICNpZmRlZiBfRkRFX0JMT0NLX0JVRkZFUg0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUYXJnZXROYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c1RhcmdldCwgMCwgbV9pVGV4dERhdGFMZW5ndGgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzVGFnKSBjb25zdA0KLSAgICB7DQotICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzVGFnLCAwLCBtX2lUZXh0RGF0YUxlbmd0aCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0QXR0cmlidXRlTmFtZShDRlhfV2lkZVN0cmluZyAmd3NBdHRyaU5hbWUpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEod3NBdHRyaU5hbWUsIDAsIG1faVRleHREYXRhTGVuZ3RoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRBdHRyaWJ1dGVWYWx1ZShDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKSBjb25zdA0KLSAgICB7DQotICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzQXR0cmlWYWx1ZSwgMCwgbV9pVGV4dERhdGFMZW5ndGgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEod3NUZXh0LCAwLCBtX2lUZXh0RGF0YUxlbmd0aCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0VGFyZ2V0RGF0YShDRlhfV2lkZVN0cmluZyAmd3NEYXRhKSBjb25zdA0KLSAgICB7DQotICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzRGF0YSwgMCwgbV9pVGV4dERhdGFMZW5ndGgpOw0KLSAgICB9DQorICB2aXJ0dWFsIHZvaWQgR2V0VGFyZ2V0TmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIGNvbnN0IHsNCisgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c1RhcmdldCwgMCwgbV9pVGV4dERhdGFMZW5ndGgpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEdldFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFnKSBjb25zdCB7DQorICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEod3NUYWcsIDAsIG1faVRleHREYXRhTGVuZ3RoKTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXRBdHRyaWJ1dGVOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSkgY29uc3Qgew0KKyAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzQXR0cmlOYW1lLCAwLCBtX2lUZXh0RGF0YUxlbmd0aCk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgR2V0QXR0cmlidXRlVmFsdWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSkgY29uc3Qgew0KKyAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzQXR0cmlWYWx1ZSwgMCwgbV9pVGV4dERhdGFMZW5ndGgpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0IHsNCisgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c1RleHQsIDAsIG1faVRleHREYXRhTGVuZ3RoKTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXRUYXJnZXREYXRhKENGWF9XaWRlU3RyaW5nJiB3c0RhdGEpIGNvbnN0IHsNCisgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c0RhdGEsIDAsIG1faVRleHREYXRhTGVuZ3RoKTsNCisgIH0NCiAjZWxzZQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRUYXJnZXROYW1lKENGWF9XaWRlU3RyaW5nICZ3c1RhcmdldCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgR2V0RGF0YSh3c1RhcmdldCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0VGFnTmFtZShDRlhfV2lkZVN0cmluZyAmd3NUYWcpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIEdldERhdGEod3NUYWcpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldEF0dHJpYnV0ZU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQXR0cmlOYW1lKSBjb25zdA0KLSAgICB7DQotICAgICAgICBHZXREYXRhKHdzQXR0cmlOYW1lKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRBdHRyaWJ1dGVWYWx1ZShDRlhfV2lkZVN0cmluZyAmd3NBdHRyaVZhbHVlKSBjb25zdA0KLSAgICB7DQotICAgICAgICBHZXREYXRhKHdzQXR0cmlWYWx1ZSk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgR2V0RGF0YSh3c1RleHQpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFRhcmdldERhdGEoQ0ZYX1dpZGVTdHJpbmcgJndzRGF0YSkgY29uc3QNCi0gICAgew0KLSAgICAgICAgR2V0RGF0YSh3c0RhdGEpOw0KLSAgICB9DQorICB2aXJ0dWFsIHZvaWQgR2V0VGFyZ2V0TmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIGNvbnN0IHsNCisgICAgR2V0RGF0YSh3c1RhcmdldCk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgR2V0VGFnTmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYWcpIGNvbnN0IHsgR2V0RGF0YSh3c1RhZyk7IH0NCisgIHZpcnR1YWwgdm9pZCBHZXRBdHRyaWJ1dGVOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSkgY29uc3Qgew0KKyAgICBHZXREYXRhKHdzQXR0cmlOYW1lKTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXRBdHRyaWJ1dGVWYWx1ZShDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSBjb25zdCB7DQorICAgIEdldERhdGEod3NBdHRyaVZhbHVlKTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCB7IEdldERhdGEod3NUZXh0KTsgfQ0KKyAgdmlydHVhbCB2b2lkIEdldFRhcmdldERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSkgY29uc3QgeyBHZXREYXRhKHdzRGF0YSk7IH0NCiAjZW5kaWYNCi1wcm90ZWN0ZWQ6DQotICAgIElGWF9TdHJlYW0JCQkqbV9wU3RyZWFtOw0KLSAgICBpbnQzMl90CQkJbV9pWE1MUGxhbmVTaXplOw0KLSAgICBpbnQzMl90CQkJbV9pQ3VycmVudFBvczsNCi0gICAgaW50MzJfdAkJCW1faUN1cnJlbnROb2RlTnVtOw0KLSAgICBpbnQzMl90CQkJbV9pTGFzdE5vZGVOdW07DQotICAgIGludDMyX3QJCQltX2lQYXJzZWRDaGFyczsNCi0gICAgaW50MzJfdAkJCW1faVBhcnNlZEJ5dGVzOw0KLSAgICBGWF9XQ0hBUioJCQltX3BCdWZmZXI7DQotICAgIGludDMyX3QJCQltX2lCdWZmZXJDaGFyczsNCi0gICAgRlhfQk9PTAkJCQltX2JFT1M7DQotICAgIEZYX1dDSEFSKgkJCW1fcFN0YXJ0Ow0KLSAgICBGWF9XQ0hBUioJCQltX3BFbmQ7DQotICAgIEZERV9YTUxOT0RFCQkJbV9DdXJOb2RlOw0KLSAgICBDRkRFX1hNTE5vZGVTdGFjawltX1hNTE5vZGVTdGFjazsNCisgcHJvdGVjdGVkOg0KKyAgSUZYX1N0cmVhbSogbV9wU3RyZWFtOw0KKyAgaW50MzJfdCBtX2lYTUxQbGFuZVNpemU7DQorICBpbnQzMl90IG1faUN1cnJlbnRQb3M7DQorICBpbnQzMl90IG1faUN1cnJlbnROb2RlTnVtOw0KKyAgaW50MzJfdCBtX2lMYXN0Tm9kZU51bTsNCisgIGludDMyX3QgbV9pUGFyc2VkQ2hhcnM7DQorICBpbnQzMl90IG1faVBhcnNlZEJ5dGVzOw0KKyAgRlhfV0NIQVIqIG1fcEJ1ZmZlcjsNCisgIGludDMyX3QgbV9pQnVmZmVyQ2hhcnM7DQorICBGWF9CT09MIG1fYkVPUzsNCisgIEZYX1dDSEFSKiBtX3BTdGFydDsNCisgIEZYX1dDSEFSKiBtX3BFbmQ7DQorICBGREVfWE1MTk9ERSBtX0N1ck5vZGU7DQorICBDRkRFX1hNTE5vZGVTdGFjayBtX1hNTE5vZGVTdGFjazsNCiAjaWZkZWYgX0ZERV9CTE9DS19CVUZGRVINCi0gICAgQ0ZERV9CbG9ja0J1ZmZlcgltX0Jsb2NrQnVmZmVyOw0KLSAgICBpbnQzMl90CQkJbV9pQWxsb2NTdGVwOw0KLSAgICBpbnQzMl90JgkJCW1faURhdGFMZW5ndGg7DQotICAgIEZYX1dDSEFSKgkJCW1fcEN1cnJlbnRCbG9jazsNCi0gICAgaW50MzJfdAkJCW1faUluZGV4SW5CbG9jazsNCisgIENGREVfQmxvY2tCdWZmZXIgbV9CbG9ja0J1ZmZlcjsNCisgIGludDMyX3QgbV9pQWxsb2NTdGVwOw0KKyAgaW50MzJfdCYgbV9pRGF0YUxlbmd0aDsNCisgIEZYX1dDSEFSKiBtX3BDdXJyZW50QmxvY2s7DQorICBpbnQzMl90IG1faUluZGV4SW5CbG9jazsNCiAjZWxzZQ0KLSAgICBpbnQzMl90CQkJbV9pVGV4dERhdGFTaXplOw0KLSAgICBGWF9XQ0hBUioJCQltX3B3c1RleHREYXRhOw0KLSAgICBpbnQzMl90CQkJbV9pRGF0YVBvczsNCisgIGludDMyX3QgbV9pVGV4dERhdGFTaXplOw0KKyAgRlhfV0NIQVIqIG1fcHdzVGV4dERhdGE7DQorICBpbnQzMl90IG1faURhdGFQb3M7DQogI2VuZGlmDQotICAgIGludDMyX3QJCQltX2lUZXh0RGF0YUxlbmd0aDsNCi0gICAgRlhfRFdPUkQJCQltX2R3U3RhdHVzOw0KLSAgICBGWF9EV09SRAkJCW1fZHdNb2RlOw0KLSAgICBGWF9XQ0hBUgkJCW1fd1F1b3RhdGlvbk1hcms7DQotICAgIGludDMyX3QJCQltX2lFbnRpdHlTdGFydDsNCi0gICAgQ0ZYX0RXb3JkU3RhY2sJCW1fU2tpcFN0YWNrOw0KLSAgICBGWF9XQ0hBUgkJCW1fU2tpcENoYXI7DQotICAgIGlubGluZSB2b2lkCQkJCVBhcnNlVGV4dENoYXIoRlhfV0NIQVIgY2gpOw0KKyAgaW50MzJfdCBtX2lUZXh0RGF0YUxlbmd0aDsNCisgIEZYX0RXT1JEIG1fZHdTdGF0dXM7DQorICBGWF9EV09SRCBtX2R3TW9kZTsNCisgIEZYX1dDSEFSIG1fd1F1b3RhdGlvbk1hcms7DQorICBpbnQzMl90IG1faUVudGl0eVN0YXJ0Ow0KKyAgQ0ZYX0RXb3JkU3RhY2sgbV9Ta2lwU3RhY2s7DQorICBGWF9XQ0hBUiBtX1NraXBDaGFyOw0KKyAgaW5saW5lIHZvaWQgUGFyc2VUZXh0Q2hhcihGWF9XQ0hBUiBjaCk7DQogI2lmbmRlZiBfRkRFX0JMT0NLX0JVRkZFUg0KLSAgICB2b2lkCQkJCVJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpOw0KLSAgICB2b2lkCQkJCUdldERhdGEoQ0ZYX1dpZGVTdHJpbmcgJndzRGF0YSkgY29uc3Q7DQorICB2b2lkIFJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpOw0KKyAgdm9pZCBHZXREYXRhKENGWF9XaWRlU3RyaW5nJiB3c0RhdGEpIGNvbnN0Ow0KICNlbmRpZg0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvaW5jbHVkZS9meF93b3JkYnJlYWsuaCBiL3hmYS9zcmMvZmVlL2luY2x1ZGUvZnhfd29yZGJyZWFrLmgKaW5kZXggNWRjMGIxYi4uY2I4ZjUzZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZWUvaW5jbHVkZS9meF93b3JkYnJlYWsuaAorKysgYi94ZmEvc3JjL2ZlZS9pbmNsdWRlL2Z4X3dvcmRicmVhay5oCkBAIC04LDE5ICs4LDE4IEBACiAjZGVmaW5lIF9GWF9XT1JEQlJFQUtfSA0KIGNsYXNzIElGWF9DaGFySXRlcjsNCiANCi1jbGFzcyBJRlhfV29yZEJyZWFrDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZYX1dvcmRCcmVhaygpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlBdHRhY2goSUZYX0NoYXJJdGVyICogcEl0ZXIpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlBdHRhY2goY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB3c1RleHQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlOZXh0KEZYX0JPT0wgYlByZXYpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRBdChpbnQzMl90IG5JbmRleCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0V29yZFBvcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldFdvcmRMZW5ndGgoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJR2V0V29yZChDRlhfV2lkZVN0cmluZyAmd3NXb3JkKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNFT0YoRlhfQk9PTCBiVGFpbCA9IFRSVUUpIGNvbnN0ID0gMDsNCitjbGFzcyBJRlhfV29yZEJyZWFrIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZYX1dvcmRCcmVhaygpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBBdHRhY2goSUZYX0NoYXJJdGVyKiBwSXRlcikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEF0dGFjaChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgTmV4dChGWF9CT09MIGJQcmV2KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0QXQoaW50MzJfdCBuSW5kZXgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXb3JkUG9zKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdvcmRMZW5ndGgoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0V29yZChDRlhfV2lkZVN0cmluZyYgd3NXb3JkKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoRlhfQk9PTCBiVGFpbCA9IFRSVUUpIGNvbnN0ID0gMDsNCiB9Ow0KLUlGWF9Xb3JkQnJlYWsgKiBGWF9Xb3JkQnJlYWtfQ3JlYXRlKCk7DQorSUZYX1dvcmRCcmVhayogRlhfV29yZEJyZWFrX0NyZWF0ZSgpOw0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRidWYuaCBiL3hmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRidWYuaAppbmRleCBiMDcwNjMzLi5hMzY3NDQ2IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0YnVmLmgKKysrIGIveGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdGJ1Zi5oCkBAIC02LDI3ICs2LDMwIEBACiANCiAjaWZuZGVmIF9JRkRFX1RYVEVEVEJVRl9IDQogI2RlZmluZSBfSUZERV9UWFRFRFRCVUZfSA0KLSNkZWZpbmUgRkRFX0RFRkNIVU5LTEVOR1RICSgxMDI0KQ0KKyNkZWZpbmUgRkRFX0RFRkNIVU5LTEVOR1RIICgxMDI0KQ0KIA0KLWNsYXNzIElGREVfVHh0RWR0QnVmDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZERV9UeHRFZHRCdWYoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7DQorY2xhc3MgSUZERV9UeHRFZHRCdWYgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX1R4dEVkdEJ1ZigpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRDaHVua1NpemUoaW50MzJfdCBuQ2h1bmtTaXplKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRDaHVua1NpemUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRUZXh0TGVuZ3RoKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldENoYXJCeUluZGV4KGludDMyX3QgbkluZGV4KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJR2V0UmFuZ2UoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBuQmVnaW4sIGludDMyX3QgbkNvdW50ID0gLSAxKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2h1bmtTaXplKGludDMyX3QgbkNodW5rU2l6ZSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENodW5rU2l6ZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUZXh0TGVuZ3RoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9XQ0hBUiBHZXRDaGFyQnlJbmRleChpbnQzMl90IG5JbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFJhbmdlKENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQmVnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3QgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCUluc2VydChpbnQzMl90IG5Qb3MsIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsIGludDMyX3Qgbkxlbmd0aCA9IDEpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlEZWxldGUoaW50MzJfdCBuSW5kZXgsIGludDMyX3Qgbkxlbmd0aCA9IDEpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBJbnNlcnQoaW50MzJfdCBuUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGggPSAxKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRGVsZXRlKGludDMyX3QgbkluZGV4LCBpbnQzMl90IG5MZW5ndGggPSAxKSA9IDA7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJQ2xlYXIoRlhfQk9PTCBiUmVsZWFzZSA9IFRSVUUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDbGVhcihGWF9CT09MIGJSZWxlYXNlID0gVFJVRSkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wdGltaXplKElGWF9QYXVzZSAqIHBQYXVzZSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPcHRpbWl6ZShJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRlbmdpbmUuaCBiL3hmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRlbmdpbmUuaAppbmRleCBkMTFhMWU5Li42ZDUzMWQ0IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0ZW5naW5lLmgKKysrIGIveGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdGVuZ2luZS5oCkBAIC0xMSwyMjcgKzExLDI0OSBAQAogY2xhc3MgSUZERV9UeHRFZHRFbmdpbmU7DQogY2xhc3MgSUZERV9UeHRFZHRFdmVudFNpbms7DQogY2xhc3MgSUZERV9UeHRFZHRQYXJhZzsNCi0jZGVmaW5lIEZERV9UWFRFRFRfRklORF9GTEFHU19QcmV2CQkoMEwgPDwgMCkNCi0jZGVmaW5lIEZERV9UWFRFRFRfRklORF9GTEFHU19OZXh0CQkoMUwgPDwgMCkNCisjZGVmaW5lIEZERV9UWFRFRFRfRklORF9GTEFHU19QcmV2ICgwTCA8PCAwKQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GSU5EX0ZMQUdTX05leHQgKDFMIDw8IDApDQogI2RlZmluZSBGREVfVFhURURUX0ZJTkRfRkxBR1NfV2hvbGVXb3JkICgxTCA8PCAxKQ0KLSNkZWZpbmUgRkRFX1RYVEVEVF9GSU5EX0ZMQUdTX05vQ2FzZQkoMUwgPDwgMikNCi10eXBlZGVmIHN0cnVjdCBfRkRFX0hUWFRFRFRGSU5EIHsNCi0gICAgdm9pZCogcERhdGE7DQotfSAqIEZERV9IVFhURURURklORDsNCi0jZGVmaW5lIEZERV9URVhURURJVE1PREVfTXVsdGlMaW5lcwkJKDFMIDw8IDApDQotI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX0F1dG9MaW5lV3JhcAkoMUwgPDwgMSkNCi0jZGVmaW5lIEZERV9URVhURURJVE1PREVfUmVhZE9ubHkJCSgxTCA8PCAyKQ0KLSNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfVmVydAkoMUwgPDwgMykNCi0jZGVmaW5lIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX0hvcnoJKDFMIDw8IDQpDQotI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8JCSgxTCA8PCA1KQ0KLSNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9GSUVMRF9UQUIJCSgxTCA8PCA2KQ0KLSNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9GSUVMRF9BVVRPCQkoMUwgPDwgNykNCi0jZGVmaW5lIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUJCSgxTCA8PCA4KQ0KLSNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9QYXNzd29yZAkJKDFMIDw8IDkpDQotI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9MZWZ0CQkJKDBMIDw8IDApDQotI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9DZW50ZXIJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRkRFX1RFWFRFRElUQUxJR05fUmlnaHQJCQkoMkwgPDwgMCkNCi0jZGVmaW5lIEZERV9URVhURURJVEFMSUdOX05vcm1hbAkJKDFMIDw8IDMpDQotI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9KdXN0aWZpZWQJCSgxTCA8PCA0KQ0KLSNkZWZpbmUgRkRFX1RFWFRFRElUQUxJR05fRGlzdHJpYnV0ZWQJKDFMIDw8IDUpDQotI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwJCSgxTCA8PCAwKQ0KLSNkZWZpbmUgRkRFX1RFWFRFRElUTEFZT1VUX0NoYXJWZXJ0aWFsCQkoMUwgPDwgMSkNCi0jZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9MaW5lUmVzZXJ2ZQkJKDFMIDw8IDIpDQotI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfUlRMCQkJCSgxTCA8PCAzKQ0KLSNkZWZpbmUgRkRFX1RFWFRFRElUTEFZT1VUX0NvbWJUZXh0CQkJKDFMIDw8IDQpDQotI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfRXhwYW5kVGFiCQkoMUwgPDwgNSkNCi0jZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9BcmFiaWNDb250ZXh0CSgxTCA8PCA2KQ0KLSNkZWZpbmUgRkRFX1RFWFRFRElUTEFZT1VUX0FyYWJpY1NoYXBlcwkJKDFMIDw8IDcpDQotI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfTGFzdExpbmVIZWlnaHQJKDFMIDw8IDgpDQorI2RlZmluZSBGREVfVFhURURUX0ZJTkRfRkxBR1NfTm9DYXNlICgxTCA8PCAyKQ0KK3R5cGVkZWYgc3RydWN0IF9GREVfSFRYVEVEVEZJTkQgeyB2b2lkKiBwRGF0YTsgfSAqIEZERV9IVFhURURURklORDsNCisjZGVmaW5lIEZERV9URVhURURJVE1PREVfTXVsdGlMaW5lcyAoMUwgPDwgMCkNCisjZGVmaW5lIEZERV9URVhURURJVE1PREVfQXV0b0xpbmVXcmFwICgxTCA8PCAxKQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9SZWFkT25seSAoMUwgPDwgMikNCisjZGVmaW5lIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX1ZlcnQgKDFMIDw8IDMpDQorI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6ICgxTCA8PCA0KQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9Ob1JlZG9VbmRvICgxTCA8PCA1KQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9GSUVMRF9UQUIgKDFMIDw8IDYpDQorI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX0ZJRUxEX0FVVE8gKDFMIDw8IDcpDQorI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX1ZhbGlkYXRlICgxTCA8PCA4KQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9QYXNzd29yZCAoMUwgPDwgOSkNCisjZGVmaW5lIEZERV9URVhURURJVEFMSUdOX0xlZnQgKDBMIDw8IDApDQorI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9DZW50ZXIgKDFMIDw8IDApDQorI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9SaWdodCAoMkwgPDwgMCkNCisjZGVmaW5lIEZERV9URVhURURJVEFMSUdOX05vcm1hbCAoMUwgPDwgMykNCisjZGVmaW5lIEZERV9URVhURURJVEFMSUdOX0p1c3RpZmllZCAoMUwgPDwgNCkNCisjZGVmaW5lIEZERV9URVhURURJVEFMSUdOX0Rpc3RyaWJ1dGVkICgxTCA8PCA1KQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsICgxTCA8PCAwKQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTEFZT1VUX0NoYXJWZXJ0aWFsICgxTCA8PCAxKQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTEFZT1VUX0xpbmVSZXNlcnZlICgxTCA8PCAyKQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTEFZT1VUX1JUTCAoMUwgPDwgMykNCisjZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9Db21iVGV4dCAoMUwgPDwgNCkNCisjZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9FeHBhbmRUYWIgKDFMIDw8IDUpDQorI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfQXJhYmljQ29udGV4dCAoMUwgPDwgNikNCisjZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9BcmFiaWNTaGFwZXMgKDFMIDw8IDcpDQorI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfTGFzdExpbmVIZWlnaHQgKDFMIDw8IDgpDQogZW51bSBGREVfVFhURURUTU9WRUNBUkVUIHsNCi0gICAgTUNfTW92ZU5vbmUJPSAwCSwNCi0gICAgTUNfTGVmdAkJCSwNCi0gICAgTUNfUmlnaHQJCSwNCi0gICAgTUNfVXAJCQksDQotICAgIE1DX0Rvd24JCQksDQotICAgIE1DX1dvcmRCYWNrd2FyZAksDQotICAgIE1DX1dvcmRGb3J3YXJkCSwNCi0gICAgTUNfTGluZVN0YXJ0CSwNCi0gICAgTUNfTGluZUVuZAkJLA0KLSAgICBNQ19QYXJhZ1N0YXJ0CSwNCi0gICAgTUNfUGFyYWdFbmQJCSwNCi0gICAgTUNfUGFnZVVwCQksDQotICAgIE1DX1BhZ2VEb3duCQksDQotICAgIE1DX0hvbWUJCQksDQotICAgIE1DX0VuZAkJCSwNCisgIE1DX01vdmVOb25lID0gMCwNCisgIE1DX0xlZnQsDQorICBNQ19SaWdodCwNCisgIE1DX1VwLA0KKyAgTUNfRG93biwNCisgIE1DX1dvcmRCYWNrd2FyZCwNCisgIE1DX1dvcmRGb3J3YXJkLA0KKyAgTUNfTGluZVN0YXJ0LA0KKyAgTUNfTGluZUVuZCwNCisgIE1DX1BhcmFnU3RhcnQsDQorICBNQ19QYXJhZ0VuZCwNCisgIE1DX1BhZ2VVcCwNCisgIE1DX1BhZ2VEb3duLA0KKyAgTUNfSG9tZSwNCisgIE1DX0VuZCwNCiB9Ow0KIGVudW0gRkRFX1RYVEVEVF9NT0RJRllfUkVUIHsNCi0gICAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfVGFiCQkJPSAtNiwNCi0gICAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfTG9ja2VkCQk9IC01LA0KLSAgICBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlCT0gLTQsDQotICAgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0JvdW5kYXJ5CT0gLTMsDQotICAgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGwJCT0gLTIsDQotICAgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX05vcm1hbAkJPSAtMSwNCi0gICAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsCQk9IDAsDQotICAgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX0Z1bGwJCT0gMSwNCi0gICAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfUGFydAkJPSAyLA0KLSAgICBGREVfVFhURURUX01PRElGWV9SRVRfU19FbXB0eQkJPSAzLA0KLSAgICBGREVfVFhURURUX01PRElGWV9SRVRfVF9UYWIJCQk9IDQsDQorICBGREVfVFhURURUX01PRElGWV9SRVRfRl9UYWIgPSAtNiwNCisgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZCA9IC01LA0KKyAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZSA9IC00LA0KKyAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnkgPSAtMywNCisgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGwgPSAtMiwNCisgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX05vcm1hbCA9IC0xLA0KKyAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsID0gMCwNCisgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX0Z1bGwgPSAxLA0KKyAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfUGFydCA9IDIsDQorICBGREVfVFhURURUX01PRElGWV9SRVRfU19FbXB0eSA9IDMsDQorICBGREVfVFhURURUX01PRElGWV9SRVRfVF9UYWIgPSA0LA0KIH07DQogZW51bSBGREVfVFhURURJVF9MSU5FRU5EIHsNCi0gICAgRkRFX1RYVEVESVRfTElORUVORF9BdXRvLA0KLSAgICBGREVfVFhURURJVF9MSU5FRU5EX0NSTEYsDQotICAgIEZERV9UWFRFRElUX0xJTkVFTkRfQ1IsDQotICAgIEZERV9UWFRFRElUX0xJTkVFTkRfTEYsDQorICBGREVfVFhURURJVF9MSU5FRU5EX0F1dG8sDQorICBGREVfVFhURURJVF9MSU5FRU5EX0NSTEYsDQorICBGREVfVFhURURJVF9MSU5FRU5EX0NSLA0KKyAgRkRFX1RYVEVESVRfTElORUVORF9MRiwNCiB9Ow0KIHN0cnVjdCBfRkRFX1RYVEVEVFBBUkFNUyB7DQotICAgIF9GREVfVFhURURUUEFSQU1TKCkNCi0gICAgICAgIDogZlBsYXRlV2lkdGgoMCkNCi0gICAgICAgICwgZlBsYXRlSGVpZ2h0KDApDQotICAgICAgICAsIG5MaW5lQ291bnQoMCkNCi0gICAgICAgICwgZHdMYXlvdXRTdHlsZXMoMCkNCi0gICAgICAgICwgZHdBbGlnbm1lbnQoMCkNCi0gICAgICAgICwgZHdNb2RlKDApDQotICAgICAgICAsIHBGb250KE5VTEwpDQotICAgICAgICAsIGZGb250U2l6ZSgxMC4wZikNCi0gICAgICAgICwgZHdGb250Q29sb3IoMHhmZjAwMDAwMCkNCi0gICAgICAgICwgZkxpbmVTcGFjZSgxMC4wZikNCi0gICAgICAgICwgZlRhYldpZHRoKDM2KQ0KLSAgICAgICAgLCBiVGFiRXF1aWRpc3RhbnQoRkFMU0UpDQotICAgICAgICAsIHdEZWZDaGFyKDB4RkVGRikNCi0gICAgICAgICwgd0xpbmVCcmVha0NoYXIoJ1xuJykNCi0gICAgICAgICwgbkNoYXJSb3RhdGlvbigwKQ0KLSAgICAgICAgLCBuTGluZUVuZCgwKQ0KLSAgICAgICAgLCBuSG9yelNjYWxlKDEwMCkNCi0gICAgICAgICwgZkNoYXJTcGFjZSgwKQ0KLSAgICAgICAgLCBwRXZlbnRTaW5rKE5VTEwpDQotICAgIHsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVAlmUGxhdGVXaWR0aDsNCi0gICAgRlhfRkxPQVQJZlBsYXRlSGVpZ2h0Ow0KLSAgICBpbnQzMl90CW5MaW5lQ291bnQ7DQotICAgIEZYX0RXT1JECWR3TGF5b3V0U3R5bGVzOw0KLSAgICBGWF9EV09SRAlkd0FsaWdubWVudDsNCi0gICAgRlhfRFdPUkQJZHdNb2RlOw0KLSAgICBJRlhfRm9udAkqcEZvbnQ7DQotICAgIEZYX0ZMT0FUCWZGb250U2l6ZTsNCi0gICAgRlhfQVJHQgkJZHdGb250Q29sb3I7DQotICAgIEZYX0ZMT0FUCWZMaW5lU3BhY2U7DQotICAgIEZYX0ZMT0FUCWZUYWJXaWR0aDsNCi0gICAgRlhfQk9PTAkJYlRhYkVxdWlkaXN0YW50Ow0KLSAgICBGWF9XQ0hBUgl3RGVmQ2hhcjsNCi0gICAgRlhfV0NIQVIJd0xpbmVCcmVha0NoYXI7DQotICAgIGludDMyX3QJbkNoYXJSb3RhdGlvbjsNCi0gICAgaW50MzJfdAluTGluZUVuZDsNCi0gICAgaW50MzJfdAluSG9yelNjYWxlOw0KLSAgICBGWF9GTE9BVAlmQ2hhclNwYWNlOw0KLSAgICBJRkRFX1R4dEVkdEV2ZW50U2luayAqIHBFdmVudFNpbms7DQorICBfRkRFX1RYVEVEVFBBUkFNUygpDQorICAgICAgOiBmUGxhdGVXaWR0aCgwKSwNCisgICAgICAgIGZQbGF0ZUhlaWdodCgwKSwNCisgICAgICAgIG5MaW5lQ291bnQoMCksDQorICAgICAgICBkd0xheW91dFN0eWxlcygwKSwNCisgICAgICAgIGR3QWxpZ25tZW50KDApLA0KKyAgICAgICAgZHdNb2RlKDApLA0KKyAgICAgICAgcEZvbnQoTlVMTCksDQorICAgICAgICBmRm9udFNpemUoMTAuMGYpLA0KKyAgICAgICAgZHdGb250Q29sb3IoMHhmZjAwMDAwMCksDQorICAgICAgICBmTGluZVNwYWNlKDEwLjBmKSwNCisgICAgICAgIGZUYWJXaWR0aCgzNiksDQorICAgICAgICBiVGFiRXF1aWRpc3RhbnQoRkFMU0UpLA0KKyAgICAgICAgd0RlZkNoYXIoMHhGRUZGKSwNCisgICAgICAgIHdMaW5lQnJlYWtDaGFyKCdcbicpLA0KKyAgICAgICAgbkNoYXJSb3RhdGlvbigwKSwNCisgICAgICAgIG5MaW5lRW5kKDApLA0KKyAgICAgICAgbkhvcnpTY2FsZSgxMDApLA0KKyAgICAgICAgZkNoYXJTcGFjZSgwKSwNCisgICAgICAgIHBFdmVudFNpbmsoTlVMTCkge30NCisgIEZYX0ZMT0FUIGZQbGF0ZVdpZHRoOw0KKyAgRlhfRkxPQVQgZlBsYXRlSGVpZ2h0Ow0KKyAgaW50MzJfdCBuTGluZUNvdW50Ow0KKyAgRlhfRFdPUkQgZHdMYXlvdXRTdHlsZXM7DQorICBGWF9EV09SRCBkd0FsaWdubWVudDsNCisgIEZYX0RXT1JEIGR3TW9kZTsNCisgIElGWF9Gb250KiBwRm9udDsNCisgIEZYX0ZMT0FUIGZGb250U2l6ZTsNCisgIEZYX0FSR0IgZHdGb250Q29sb3I7DQorICBGWF9GTE9BVCBmTGluZVNwYWNlOw0KKyAgRlhfRkxPQVQgZlRhYldpZHRoOw0KKyAgRlhfQk9PTCBiVGFiRXF1aWRpc3RhbnQ7DQorICBGWF9XQ0hBUiB3RGVmQ2hhcjsNCisgIEZYX1dDSEFSIHdMaW5lQnJlYWtDaGFyOw0KKyAgaW50MzJfdCBuQ2hhclJvdGF0aW9uOw0KKyAgaW50MzJfdCBuTGluZUVuZDsNCisgIGludDMyX3QgbkhvcnpTY2FsZTsNCisgIEZYX0ZMT0FUIGZDaGFyU3BhY2U7DQorICBJRkRFX1R4dEVkdEV2ZW50U2luayogcEV2ZW50U2luazsNCiB9Ow0KLXR5cGVkZWYgX0ZERV9UWFRFRFRQQVJBTVMJRkRFX1RYVEVEVFBBUkFNUzsNCi10eXBlZGVmIF9GREVfVFhURURUUEFSQU1TKglGREVfTFBUWFRFRFRQQVJBTVM7DQordHlwZWRlZiBfRkRFX1RYVEVEVFBBUkFNUyBGREVfVFhURURUUEFSQU1TOw0KK3R5cGVkZWYgX0ZERV9UWFRFRFRQQVJBTVMqIEZERV9MUFRYVEVEVFBBUkFNUzsNCiBlbnVtIEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFIHsNCi0gICAgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0CT0gMAksDQotICAgIEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0RlbGV0ZQkJLA0KLSAgICBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9SZXBsYWNlCQksDQorICBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9JbnNlcnQgPSAwLA0KKyAgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfRGVsZXRlLA0KKyAgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfUmVwbGFjZSwNCiB9Ow0KIHN0cnVjdCBfRkRFX1RYVEVEVF9URVhUQ0hBTkdFX0lORk8gew0KLSAgICBpbnQzMl90CQluQ2hhbmdlVHlwZTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJd3NJbnNlcnQ7DQotICAgIENGWF9XaWRlU3RyaW5nCXdzRGVsZXRlOw0KLSAgICBDRlhfV2lkZVN0cmluZyAgd3NQcmV2VGV4dDsNCisgIGludDMyX3QgbkNoYW5nZVR5cGU7DQorICBDRlhfV2lkZVN0cmluZyB3c0luc2VydDsNCisgIENGWF9XaWRlU3RyaW5nIHdzRGVsZXRlOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQcmV2VGV4dDsNCiB9Ow0KLXR5cGVkZWYgX0ZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPCQlGREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTzsNCi10eXBlZGVmIF9GREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTyoJRkRFX0xQVFhURURUX1RFWFRDSEFOR0VfSU5GTzsNCi1jbGFzcyBJRkRFX1R4dEVkdEV2ZW50U2luaw0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGREVfVHh0RWR0RXZlbnRTaW5rKCkge30NCi0gICAgdmlydHVhbCB2b2lkCU9uX0NhcmV0Q2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSAqIHBFZGl0LCBpbnQzMl90IG5QYWdlLCBGWF9CT09MIGJWaXNpYmxlID0gVFJVRSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJT25fVGV4dENoYW5nZWQoSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCwgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX0lORk8gJkNoYW5nZUluZm8pID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCU9uX1BhZ2VDb3VudENoYW5nZWQoSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJT25fU2VsQ2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSAqIHBFZGl0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlPbl9QYWdlTG9hZChJRkRFX1R4dEVkdEVuZ2luZSAqIHBFZGl0LCBpbnQzMl90IG5QYWdlSW5kZXgsIGludDMyX3QgblB1cnBvc2UpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCU9uX1BhZ2VVbmxvYWQoSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCwgaW50MzJfdCBuUGFnZUluZGV4LCBpbnQzMl90IG5QdXJwb3NlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlPbl9QYWdlQ2hhbmdlKElGREVfVHh0RWR0RW5naW5lICogcEVkaXQsIGludDMyX3QgblBhZ2VJbmRleCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJT25fQWRkRG9SZWNvcmQoSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTCBPbl9WYWxpZGF0ZUZpZWxkKElGREVfVHh0RWR0RW5naW5lICogcEVkaXQsIGludDMyX3QgbkJsb2NrSW5kZXgsIGludDMyX3QgbkZpZWxkSW5kZXgsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGRUZXh0LCBpbnQzMl90IG5DaGFySW5kZXgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MIE9uX1ZhbGlkYXRlQmxvY2soSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCwgaW50MzJfdCBuQmxvY2tJbmRleCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgT25fR2V0QmxvY2tGb3JtYXRUZXh0KElGREVfVHh0RWR0RW5naW5lICogcEVkaXQsIGludDMyX3QgbkJsb2NrSW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0Jsb2NrVGV4dCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgT25fVmFsaWRhdGUoSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgPSAwOw0KK3R5cGVkZWYgX0ZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPIEZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPOw0KK3R5cGVkZWYgX0ZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPKiBGREVfTFBUWFRFRFRfVEVYVENIQU5HRV9JTkZPOw0KK2NsYXNzIElGREVfVHh0RWR0RXZlbnRTaW5rIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9UeHRFZHRFdmVudFNpbmsoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIE9uX0NhcmV0Q2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZpc2libGUgPSBUUlVFKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgT25fVGV4dENoYW5nZWQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPJiBDaGFuZ2VJbmZvKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgT25fUGFnZUNvdW50Q2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPbl9TZWxDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uX1BhZ2VMb2FkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5QYWdlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUHVycG9zZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uX1BhZ2VVbmxvYWQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUGFnZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUHVycG9zZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uX1BhZ2VDaGFuZ2UoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUGFnZUluZGV4KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgT25fQWRkRG9SZWNvcmQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uX1ZhbGlkYXRlRmllbGQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQmxvY2tJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFySW5kZXgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbl9WYWxpZGF0ZUJsb2NrKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkJsb2NrSW5kZXgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbl9HZXRCbG9ja0Zvcm1hdFRleHQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NCbG9ja1RleHQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbl9WYWxpZGF0ZShJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgPSAwOw0KIH07DQotY2xhc3MgSUZYX0NoYXJJdGVyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZYX0NoYXJJdGVyKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU5leHQoRlhfQk9PTCBiUHJldiA9IEZBTFNFKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfV0NIQVIJR2V0Q2hhcigpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRBdChpbnQzMl90IG5JbmRleCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0QXQoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNFT0YoRlhfQk9PTCBiVGFpbCA9IFRSVUUpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBJRlhfQ2hhckl0ZXIgKiBDbG9uZSgpID0gMDsNCitjbGFzcyBJRlhfQ2hhckl0ZXIgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRlhfQ2hhckl0ZXIoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgTmV4dChGWF9CT09MIGJQcmV2ID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0Q2hhcigpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRBdChpbnQzMl90IG5JbmRleCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEF0KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKEZYX0JPT0wgYlRhaWwgPSBUUlVFKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGWF9DaGFySXRlciogQ2xvbmUoKSA9IDA7DQogfTsNCi1jbGFzcyBJRkRFX1R4dEVkdEVuZ2luZQ0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRkRFX1R4dEVkdEVuZ2luZSoJCUNyZWF0ZSgpOw0KK2NsYXNzIElGREVfVHh0RWR0RW5naW5lIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfVHh0RWR0RW5naW5lKiBDcmVhdGUoKTsNCiANCi0gICAgdmlydHVhbCB+SUZERV9UeHRFZHRFbmdpbmUoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJU2V0RWRpdFBhcmFtcyhjb25zdCBGREVfVFhURURUUEFSQU1TICZwYXJhbXMpID0gMDsNCi0gICAgdmlydHVhbCBjb25zdCBGREVfVFhURURUUEFSQU1TKiBHZXRFZGl0UGFyYW1zKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB+SUZERV9UeHRFZHRFbmdpbmUoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0RWRpdFBhcmFtcyhjb25zdCBGREVfVFhURURUUEFSQU1TJiBwYXJhbXMpID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRkRFX1RYVEVEVFBBUkFNUyogR2V0RWRpdFBhcmFtcygpIGNvbnN0ID0gMDsNCiANCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUNvdW50UGFnZXMoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgSUZERV9UeHRFZHRQYWdlKgkJR2V0UGFnZShpbnQzMl90IG5JbmRleCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCVNldEJ1ZkNodW5rU2l6ZShpbnQzMl90IG5DaHVua1NpemUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRUZXh0QnlTdHJlYW0oSUZYX1N0cmVhbSAqIHBTdHJlYW0pID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUdldFRleHRMZW5ndGgoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJR2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCUNsZWFyVGV4dCgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFBhZ2VzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX1R4dEVkdFBhZ2UqIEdldFBhZ2UoaW50MzJfdCBuSW5kZXgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRCdWZDaHVua1NpemUoaW50MzJfdCBuQ2h1bmtTaXplKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dEJ5U3RyZWFtKElGWF9TdHJlYW0qIHBTdHJlYW0pID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUZXh0TGVuZ3RoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENsZWFyVGV4dCgpID0gMDsNCiANCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUdldENhcmV0UmVjdChDRlhfUmVjdEYgJnJ0Q2FyZXQpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUdldENhcmV0UG9zKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJU2V0Q2FyZXRQb3MoaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUUpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCU1vdmVDYXJldFBvcyhGREVfVFhURURUTU9WRUNBUkVUIGVNb3ZlQ2FyZXQsIEZYX0JPT0wgYlNoaWZ0ID0gRkFMU0UsIEZYX0JPT0wgYkN0cmwgPSBGQUxTRSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENhcmV0UmVjdChDRlhfUmVjdEYmIHJ0Q2FyZXQpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDYXJldFBvcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlID0gVFJVRSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IE1vdmVDYXJldFBvcyhGREVfVFhURURUTU9WRUNBUkVUIGVNb3ZlQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0ID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkN0cmwgPSBGQUxTRSkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCUxvY2soKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJVW5sb2NrKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCUlzTG9ja2VkKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIExvY2soKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2NrKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzTG9ja2VkKCkgY29uc3QgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJSW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGgpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCURlbGV0ZShpbnQzMl90IG5TdGFydCwgRlhfQk9PTCBiQmFja3NwYWNlID0gRkFMU0UpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCURlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlSZXBsYWNlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5MZW5ndGgsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1JlcGxhY2UpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRMaW1pdChpbnQzMl90IG5MaW1pdCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCVNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTZXRGb3JtYXRCbG9jayhpbnQzMl90IG5JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQmxvY2tGb3JtYXQpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUNvdW50RWRpdEJsb2NrcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlHZXRFZGl0QmxvY2tUZXh0KGludDMyX3QgbkluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NCbG9ja1RleHQpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUNvdW50RWRpdEZpZWxkcyhpbnQzMl90IG5CbG9ja0luZGV4KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJR2V0RWRpdEZpZWxkVGV4dChpbnQzMl90IG5CbG9ja0luZGV4LCBpbnQzMl90IG5GaWVsZEluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NGaWVsZFRleHQpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlTdGFydEVkaXQoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJRW5kRWRpdCgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlBZGRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJQ291bnRTZWxSYW5nZXMoKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCAmblN0YXJ0KSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJQ2xlYXJTZWxlY3Rpb24oKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgSW5zZXJ0KGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBEZWxldGUoaW50MzJfdCBuU3RhcnQsIEZYX0JPT0wgYkJhY2tzcGFjZSA9IEZBTFNFKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgRGVsZXRlUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBSZXBsYWNlKGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVwbGFjZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbWl0KGludDMyX3QgbkxpbWl0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdBbGlhcykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvcm1hdEJsb2NrKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Jsb2NrRm9ybWF0KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRFZGl0QmxvY2tzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldEVkaXRCbG9ja1RleHQoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NCbG9ja1RleHQpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEVkaXRGaWVsZHMoaW50MzJfdCBuQmxvY2tJbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldEVkaXRGaWVsZFRleHQoaW50MzJfdCBuQmxvY2tJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZFRleHQpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTdGFydEVkaXQoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRW5kRWRpdCgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBBZGRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50U2VsUmFuZ2VzKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90JiBuU3RhcnQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDbGVhclNlbGVjdGlvbigpID0gMDsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWRvKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJVW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVW5kbykgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlZG8pID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNVbmRvKSA9IDA7DQogDQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlTdGFydExheW91dCgpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCURvTGF5b3V0KElGWF9QYXVzZSAqcFBhdXNlKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJRW5kTGF5b3V0KCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFN0YXJ0TGF5b3V0KCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IERvTGF5b3V0KElGWF9QYXVzZSogcFBhdXNlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRW5kTGF5b3V0KCkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCU9wdGltaXplKElGWF9QYXVzZSAqIHBQYXVzZSA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUNvdW50UGFyYWdzKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfVHh0RWR0UGFyYWcqCQlHZXRQYXJhZyhpbnQzMl90IG5QYXJhZ0luZGV4KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0NoYXJJdGVyKgkJCUNyZWF0ZUNoYXJJdGVyKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9wdGltaXplKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50UGFyYWdzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX1R4dEVkdFBhcmFnKiBHZXRQYXJhZyhpbnQzMl90IG5QYXJhZ0luZGV4KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGWF9DaGFySXRlciogQ3JlYXRlQ2hhckl0ZXIoKSA9IDA7DQogfTsNCi1jbGFzcyBJRkRFX1R4dEVkdFBhcmFnDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZERV9UeHRFZHRQYXJhZygpIHt9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFRleHRMZW5ndGgoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwJaW50MzJfdAkJCUdldFN0YXJ0SW5kZXgoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUNvdW50TGluZXMoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlHZXRMaW5lUmFuZ2UoaW50MzJfdCBuTGluZUluZGV4LCBpbnQzMl90JiBuU3RhcnQsIGludDMyX3QmIG5Db3VudCkgY29uc3QgPSAwOw0KK2NsYXNzIElGREVfVHh0RWR0UGFyYWcgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX1R4dEVkdFBhcmFnKCkge30NCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUZXh0TGVuZ3RoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFN0YXJ0SW5kZXgoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRMaW5lcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRMaW5lUmFuZ2UoaW50MzJfdCBuTGluZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5Db3VudCkgY29uc3QgPSAwOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdHBhZ2UuaCBiL3hmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRwYWdlLmgKaW5kZXggNGU2Yzg1OS4uMDlkYmI0MyAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdHBhZ2UuaAorKysgYi94ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0cGFnZS5oCkBAIC04LDI1ICs4LDMxIEBACiAjZGVmaW5lIF9JRkRFX1RYVEVEVFBBR0VfSA0KIGNsYXNzIElGREVfVHh0RWR0RW5naW5lOw0KIGNsYXNzIElGREVfVHh0RWR0UGFnZTsNCi1jbGFzcyBJRkRFX1R4dEVkdFBhZ2UgOiBwdWJsaWMgSUZERV9DYW52YXNTZXQsIHB1YmxpYyBJRlhfVHh0QWNjZXNzDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGREVfVHh0RWR0UGFnZSAqIENyZWF0ZShJRkRFX1R4dEVkdEVuZ2luZSAqIHBFbmdpbmUsIGludDMyX3QgbkluZGV4KTsNCitjbGFzcyBJRkRFX1R4dEVkdFBhZ2UgOiBwdWJsaWMgSUZERV9DYW52YXNTZXQsIHB1YmxpYyBJRlhfVHh0QWNjZXNzIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfVHh0RWR0UGFnZSogQ3JlYXRlKElGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLCBpbnQzMl90IG5JbmRleCk7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQogDQotICAgIHZpcnR1YWwgSUZERV9UeHRFZHRFbmdpbmUgKiBHZXRFbmdpbmUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRDaGFyUmVjdChpbnQzMl90IG5JbmRleCwgQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJCQm94ID0gRkFMU0UpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldENoYXJJbmRleChjb25zdCBDRlhfUG9pbnRGICZmUG9pbnQsIEZYX0JPT0wgJmJCZWZvcmUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlDYWxjUmFuZ2VSZWN0QXJyYXkoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50LCBDRlhfUmVjdEZBcnJheSAmUmVjdEZBcnIpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CVNlbGVjdFdvcmQgKGNvbnN0IENGWF9Qb2ludEYgJmZQb2ludCwgaW50MzJfdCAmbkNvdW50KSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRDaGFyU3RhcnQoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRDaGFyQ291bnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfVHh0RWR0RW5naW5lKiBHZXRFbmdpbmUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhclJlY3QoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJCb3ggPSBGQUxTRSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENoYXJJbmRleChjb25zdCBDRlhfUG9pbnRGJiBmUG9pbnQsIEZYX0JPT0wmIGJCZWZvcmUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDYWxjUmFuZ2VSZWN0QXJyYXkoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEZBcnJheSYgUmVjdEZBcnIpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBTZWxlY3RXb3JkKGNvbnN0IENGWF9Qb2ludEYmIGZQb2ludCwgaW50MzJfdCYgbkNvdW50KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhclN0YXJ0KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENoYXJDb3VudCgpIGNvbnN0ID0gMDsNCiANCi0gICAgdmlydHVhbCBpbnQzMl90CUdldERpc3BsYXlQb3MoY29uc3QgQ0ZYX1JlY3RGICZydENsaXAsIEZYVEVYVF9DSEFSUE9TKiAmcENoYXJQb3MsIEZYX0xQUkVDVEYgcEJCb3ggPSBOVUxMKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0xvYWRlZChGWF9MUENSRUNURiBwQ2xpcEJveCA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJTG9hZFBhZ2UoRlhfTFBDUkVDVEYgcENsaXBCb3ggPSBOVUxMLCBJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVVubG9hZFBhZ2UoRlhfTFBDUkVDVEYgcENsaXBCb3ggPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgY29uc3QgQ0ZYX1JlY3RGJgkJR2V0Q29udGVudHNCb3goKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGlzcGxheVBvcyhjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiYgcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUFJFQ1RGIHBCQm94ID0gTlVMTCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzTG9hZGVkKEZYX0xQQ1JFQ1RGIHBDbGlwQm94ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IExvYWRQYWdlKEZYX0xQQ1JFQ1RGIHBDbGlwQm94ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBVbmxvYWRQYWdlKEZYX0xQQ1JFQ1RGIHBDbGlwQm94ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBDRlhfUmVjdEYmIEdldENvbnRlbnRzQm94KCkgPSAwOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YmxvY2suY3BwIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YmxvY2suY3BwCmluZGV4IDdiOGVjZjQuLjFhZjgxY2EgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJsb2NrLmNwcAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRibG9jay5jcHAKQEAgLTcsNjY4ICs3LDY2OCBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQogI2luY2x1ZGUgImZkZV90eHRlZHRibG9jay5oIg0KICNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCi0jZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOCQkweEZGRjkNCi0jZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5ECQkweEZGRkINCi0jZGVmaW5lIEZERV9UWFRFRFRfWkVST1dJRFRIU1BBQ0UJCTB4MjAwQg0KLSNkZWZpbmUgRkRFX1RYVEVEVF9JU0lOVEVHRVIoYSkJKChhKSA+PSBMJzAnICYmIChhKSA8PSBMJzknKQ0KLSNkZWZpbmUgRkRFX1RYVEVEVF9JU1NJR04oYSkJKCgoYSkgPT0gTCctJykgfHwgKChhKSA9PSBMJysnKSkNCi1DRkRFX1R4dEVkdEJsb2NrOjpDRkRFX1R4dEVkdEJsb2NrKENGREVfVHh0RWR0RW5naW5lICogcEVuZ2luZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQmxvY2ssIGludDMyX3QgblBvc2l0aW9uKQ0KLSAgICA6IG1fcEVuZ2luZShwRW5naW5lKQ0KLSAgICAsIG1fbkRpc3BsYXlMZW5ndGgoMCkNCi0gICAgLCBtX25JbmRleCgwKQ0KLSAgICAsIG1fblBvc2l0aW9uKG5Qb3NpdGlvbikNCi17DQotICAgIGNvbnN0IEZYX1dDSEFSKiBscEJ1ZiA9IGNvbnN0IEZYX1dDSEFSKih3c0Jsb2NrKTsNCi0gICAgaW50MzJfdCBuQ291bnQJPSB3c0Jsb2NrLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IGkJCT0gMDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaXg7DQotICAgIGludDMyX3QgaiA9IDA7DQotICAgIHdoaWxlIChpIDwgbkNvdW50KSB7DQotICAgICAgICBpZiAobHBCdWZbaV0gIT0gTCclJykgew0KLSAgICAgICAgICAgIHdzRml4ICs9IGxwQnVmW2ldOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpICsrOw0KLSAgICAgICAgICAgIGlmIChpIDwgbkNvdW50KSB7DQotICAgICAgICAgICAgICAgIGlmIChscEJ1ZltpXSA9PSBMJyUnKSB7DQotICAgICAgICAgICAgICAgICAgICB3c0ZpeCArPSBscEJ1ZltpXTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghd3NGaXguSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IENGREVfVHh0RWR0RmllbGQ6OkNyZWF0ZSh3c0ZpeCwgaiwgdGhpcyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaiArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocEZpZWxkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0ZpZWxkQXJyLkFkZChwRmllbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fbkRpc3BsYXlMZW5ndGggKz0gcEZpZWxkLT5HZXREaXNwbGF5TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NGaXguRW1wdHkoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBvcyA9IGkgLSAxOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxwQnVmW2kgKytdICE9IEwnKScpDQotICAgICAgICAgICAgICAgICAgICAgICAgOw0KLSAgICAgICAgICAgICAgICAgICAgaSArKzsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0ZpZWxkKGxwQnVmICsgblBvcywgaSAtIG5Qb3MpOw0KLSAgICAgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IENGREVfVHh0RWR0RmllbGQ6OkNyZWF0ZSh3c0ZpZWxkLCBqLCB0aGlzKTsNCi0gICAgICAgICAgICAgICAgICAgIGogKys7DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocEZpZWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIG1fRmllbGRBcnIuQWRkKHBGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICBtX0VkaXRGaWVsZEFyci5BZGQocEZpZWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIG1fbkRpc3BsYXlMZW5ndGggKz0gcEZpZWxkLT5HZXREaXNwbGF5TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICBpIC0tOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaSArKzsNCi0gICAgfQ0KLSAgICBpZiAoIXdzRml4LklzRW1wdHkoKSkgew0KLSAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IENGREVfVHh0RWR0RmllbGQ6OkNyZWF0ZSh3c0ZpeCwgaiwgdGhpcyk7DQotICAgICAgICBGWFNZU19hc3NlcnQocEZpZWxkKTsNCi0gICAgICAgIG1fRmllbGRBcnIuQWRkKHBGaWVsZCk7DQotICAgICAgICBtX25EaXNwbGF5TGVuZ3RoICs9IHBGaWVsZC0+R2V0RGlzcGxheUxlbmd0aCgpOw0KLSAgICB9DQotfQ0KLUNGREVfVHh0RWR0QmxvY2s6On5DRkRFX1R4dEVkdEJsb2NrKCkNCi17DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9GaWVsZEFyci5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IG1fRmllbGRBcnJbaV07DQotICAgICAgICBwRmllbGQtPlJlbGVhc2UoKTsNCi0gICAgfQ0KLSAgICBtX0ZpZWxkQXJyLlJlbW92ZUFsbCgpOw0KLX0NCi12b2lkIENGREVfVHh0RWR0QmxvY2s6OkdldERpc3BsYXlUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0Rpc3BsYXkpDQotew0KLSAgICBpbnQzMl90IG5Db3VudCA9IG1fRmllbGRBcnIuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQgPSBtX0ZpZWxkQXJyW2ldOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KLSAgICAgICAgcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c1RlbXApOw0KLSAgICAgICAgd3NEaXNwbGF5ICs9IHdzVGVtcDsNCi0gICAgfQ0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0QmxvY2s6OkdldExlbmd0aCgpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IG5EaXNwbGF5TGVuZ3RoID0gMDsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBtX0ZpZWxkQXJyLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQotICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gbV9GaWVsZEFycltpXTsNCi0gICAgICAgIG5EaXNwbGF5TGVuZ3RoICs9IHBGaWVsZC0+R2V0RGlzcGxheUxlbmd0aCgpOw0KLSAgICB9DQotICAgIHJldHVybiBuRGlzcGxheUxlbmd0aDsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEJsb2NrOjpHZXRCbG9ja1RleHQoQ0ZYX1dpZGVTdHJpbmcgJndzQmxvY2spDQotew0KLSAgICBpbnQzMl90IG5Db3VudCA9IG1fRmllbGRBcnIuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQgPSBtX0ZpZWxkQXJyW2ldOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KLSAgICAgICAgcEZpZWxkLT5HZXRGaWVsZFRleHQod3NUZW1wKTsNCi0gICAgICAgIHdzQmxvY2sgKz0gd3NUZW1wOw0KLSAgICB9DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRCbG9jazo6Q291bnRGaWVsZCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9FZGl0RmllbGRBcnIuR2V0U2l6ZSgpOw0KLX0NCi12b2lkIENGREVfVHh0RWR0QmxvY2s6OkdldEZpZWxkVGV4dChpbnQzMl90IG5JbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGQpDQotew0KLSAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gbV9FZGl0RmllbGRBcnJbbkluZGV4XTsNCi0gICAgcEZpZWxkLT5HZXRGaWVsZFRleHQod3NGaWVsZCk7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRCbG9jazo6R2V0RmllbGRUZXh0TGVuZ3RoKCkgY29uc3QNCi17DQotICAgIGludDMyX3QgblRvdGFsTGVuZ3RoID0gMDsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBtX0VkaXRGaWVsZEFyci5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IG1fRWRpdEZpZWxkQXJyW2ldOw0KLSAgICAgICAgblRvdGFsTGVuZ3RoID0gcEZpZWxkLT5HZXRGaWVsZFRleHRMZW5ndGgoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gblRvdGFsTGVuZ3RoOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0QmxvY2s6OkdldFBvcygpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9uUG9zaXRpb247DQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRCbG9jazo6R2V0UmVhbFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3QNCi17DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9GaWVsZEFyci5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IG1fRmllbGRBcnJbaV07DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQotICAgICAgICBwRmllbGQtPkdldEZpZWxkVGV4dCh3c1RlbXApOw0KLSAgICAgICAgd3NUZXh0ICs9IHdzVGVtcDsNCi0gICAgfQ0KLX0NCi12b2lkIENGREVfVHh0RWR0QmxvY2s6OkJhY2t1cCgpDQotew0KLSAgICBpbnQzMl90IG5Db3VudCA9IG1fRWRpdEZpZWxkQXJyLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQotICAgICAgICBtX0VkaXRGaWVsZEFycltpXS0+QmFja3VwKCk7DQotICAgIH0NCi19DQotdm9pZCBDRkRFX1R4dEVkdEJsb2NrOjpSZXN0b3JlKCkNCi17DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9FZGl0RmllbGRBcnIuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIG1fRWRpdEZpZWxkQXJyW2ldLT5SZXN0b3JlKCk7DQotICAgIH0NCi19DQotQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlcjo6Q0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlcigpDQotew0KLX0NCi1DRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyOjp+Q0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlcigpDQotew0KLSAgICBGREVfTFBUWFRFRFRGT1JNQVRJVEVNIGxwSXRlbSA9IE5VTEw7DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9JdGVtQXJyLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQotICAgICAgICBscEl0ZW0gPSBtX0l0ZW1BcnJbaV07DQotICAgICAgICBkZWxldGUgbHBJdGVtOw0KLSAgICB9DQotICAgIG1fSXRlbUFyci5SZW1vdmVBbGwoKTsNCi19DQotRlhfQk9PTCBDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyOjpQYXJzZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGb3JtYXQpDQotew0KLSAgICBtX3dzRm9ybWF0ID0gd3NGb3JtYXQ7DQotICAgIGNvbnN0IEZYX1dDSEFSKglwQnVmCT0gY29uc3QgRlhfV0NIQVIqKG1fd3NGb3JtYXQpOw0KLSAgICBpbnQzMl90CW5Db3VudAk9IG1fd3NGb3JtYXQuR2V0TGVuZ3RoKCk7DQotICAgIG5Db3VudCAtPSAyOw0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBmb3IgKDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgRlhfV0NIQVIgd0NoYXIgPSBwQnVmW2ldOw0KLSAgICAgICAgaWYgKHdDaGFyID09IEwnKCcpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpICsrOw0KLSAgICBGREVfVFhURURURk9STUFUSVRFTSBGb3JtYXRJdGVtOw0KLSAgICBmb3IgKDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgd2hpbGUgKHBCdWZbaV0gPT0gTCcgJykgew0KLSAgICAgICAgICAgIGkgKys7DQotICAgICAgICB9DQotICAgICAgICBGb3JtYXRJdGVtLm5LZXlTdGFydCA9IGk7DQotICAgICAgICB3aGlsZSAocEJ1ZltpXSAhPSBMJzonKSB7DQotICAgICAgICAgICAgaSArKzsNCi0gICAgICAgIH0NCi0gICAgICAgIEZvcm1hdEl0ZW0ubktleUNvdW50ID0gaSAtIEZvcm1hdEl0ZW0ubktleVN0YXJ0Ow0KLSAgICAgICAgaSArKzsNCi0gICAgICAgIEZvcm1hdEl0ZW0ublZhbFN0YXJ0ID0gaTsNCi0gICAgICAgIHdoaWxlIChwQnVmW2ldICE9IEwnOycgJiYgaSA8IG5Db3VudCkgew0KLSAgICAgICAgICAgIGkgKys7DQotICAgICAgICB9DQotICAgICAgICBGb3JtYXRJdGVtLm5WYWxDb3VudCA9IGkgLSBGb3JtYXRJdGVtLm5WYWxTdGFydDsNCi0gICAgICAgIEZERV9MUFRYVEVEVEZPUk1BVElURU0gcEZvcm1hdEl0ZW0gPSBGWF9ORVcgRkRFX1RYVEVEVEZPUk1BVElURU07DQotICAgICAgICBGWFNZU19tZW1jcHkocEZvcm1hdEl0ZW0sICZGb3JtYXRJdGVtLCBzaXplb2YoRkRFX1RYVEVEVEZPUk1BVElURU0pKTsNCi0gICAgICAgIG1fSXRlbUFyci5BZGQocEZvcm1hdEl0ZW0pOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXI6OkNvdW50SXRlbXMoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fSXRlbUFyci5HZXRTaXplKCk7DQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlcjo6R2V0SXRlbShpbnQzMl90IG5JbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzS2V5LCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSkgY29uc3QNCi17DQotICAgIEZERV9MUFRYVEVEVEZPUk1BVElURU0gbHBJdGVtID0gbV9JdGVtQXJyW25JbmRleF07DQotICAgIGNvbnN0IEZYX1dDSEFSKiBscFNyY0J1ZiA9IGNvbnN0IEZYX1dDSEFSKihtX3dzRm9ybWF0KTsNCi0gICAgRlhfV0NIQVIqIGxwRHN0QnVmID0gd3NLZXkuR2V0QnVmZmVyKGxwSXRlbS0+bktleUNvdW50KTsNCi0gICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1ZiArIGxwSXRlbS0+bktleVN0YXJ0LCBscEl0ZW0tPm5LZXlDb3VudCAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICB3c0tleS5SZWxlYXNlQnVmZmVyKGxwSXRlbS0+bktleUNvdW50KTsNCi0gICAgbHBEc3RCdWYgPSB3c1ZhbHVlLkdldEJ1ZmZlcihscEl0ZW0tPm5WYWxDb3VudCk7DQotICAgIEZYU1lTX21lbWNweShscERzdEJ1ZiwgbHBTcmNCdWYgKyBscEl0ZW0tPm5WYWxTdGFydCwgbHBJdGVtLT5uVmFsQ291bnQgKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgd3NWYWx1ZS5SZWxlYXNlQnVmZmVyKGxwSXRlbS0+blZhbENvdW50KTsNCi19DQotQ0ZERV9UeHRFZHRGaWVsZCAqIENGREVfVHh0RWR0RmllbGQ6OkNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGaWVsZCwgaW50MzJfdCBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2spDQotew0KLSAgICBpZiAod3NGaWVsZFswXSAhPSBMJyUnIHx8ICh3c0ZpZWxkWzBdID09IEwnJScgJiYgd3NGaWVsZFsxXSA9PSBMJyUnKSkgew0KLSAgICAgICAgcmV0dXJuIEZYX05FVyBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkKHdzRmllbGQsIG5JbmRleCwgcEJsb2NrKTsNCi0gICAgfQ0KLSAgICBGWF9XQ0hBUiB3Y1R5cGUgPSB3c0ZpZWxkW3dzRmllbGQuR2V0TGVuZ3RoKCkgLSAxXTsNCi0gICAgc3dpdGNoKHdjVHlwZSkgew0KLSAgICAgICAgY2FzZSBMJ2QnOg0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyKHdzRmllbGQsIG5JbmRleCwgcEJsb2NrKTsNCi0gICAgICAgIGNhc2UgTCdmJzoNCi0gICAgICAgICAgICByZXR1cm4gRlhfTkVXIENGREVfVHh0RWR0RmllbGRfRmxvYXQod3NGaWVsZCwgbkluZGV4LCBwQmxvY2spOw0KLSAgICAgICAgY2FzZSBMJ3MnOg0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHRGaWVsZF9TdHJpbmcod3NGaWVsZCwgbkluZGV4LCBwQmxvY2spOw0KLSAgICAgICAgY2FzZSBMJ3AnOg0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHRGaWVsZF9QYXNzd29yZCh3c0ZpZWxkLCBuSW5kZXgsIHBCbG9jayk7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi12b2lkIENGREVfVHh0RWR0RmllbGQ6OlJlbGVhc2UoKQ0KLXsNCi0gICAgZGVsZXRlIHRoaXM7DQotfQ0KLUNGREVfVHh0RWR0RmllbGQ6OkNGREVfVHh0RWR0RmllbGQoaW50MzJfdCBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2spDQotICAgIDogbV9uTGVuZ3RoKC0xKQ0KLSAgICAsIG1fd2NGaWxsKEwnICcpDQotICAgICwgbV9iUmVzZXJ2ZVNwYWNlKEZBTFNFKQ0KLSAgICAsIG1fYkxlZnRBbGlnbm1lbnQoVFJVRSkNCi0gICAgLCBtX25JbmRleChuSW5kZXgpDQotICAgICwgbV9wQmxvY2socEJsb2NrKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBCbG9jayk7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZDo6SW5zZXJ0KGludDMyX3QgbkluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NJbnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJm5DYXJldCwgRlhfQk9PTCAmYkJlZm9yZSkNCi17DQotICAgIGludDMyX3QgbkZpZWxkTGVuZ3RoCT0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IG5Jbm5lckluZGV4CT0gbkluZGV4IC0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRTsNCi0gICAgaWYgKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgew0KLSAgICAgICAgbklubmVySW5kZXggLT0gKG1fbkxlbmd0aCAtIG5GaWVsZExlbmd0aCk7DQotICAgIH0NCi0gICAgRlhTWVNfYXNzZXJ0KG5Jbm5lckluZGV4ID49IDAgJiYgbklubmVySW5kZXggPD0gbkZpZWxkTGVuZ3RoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wID0gbV93c0ZpZWxkOw0KLSAgICBpbnQzMl90IG5JbnNMZW5ndGggPSB3c0lucy5HZXRMZW5ndGgoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkluc0xlbmd0aDsgaSArKywgbklubmVySW5kZXggKyspIHsNCi0gICAgICAgIHdzVGVtcC5JbnNlcnQobklubmVySW5kZXgsIHdzSW5zW2ldKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IG5SZXQgPSBWYWxpZGF0ZSh3c1RlbXApOw0KLSAgICBzd2l0Y2ggKG5SZXQpIHsNCi0gICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0ZVTEw7DQotICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9JTlZBTElEQVRFOw0KLSAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX1M6DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIG1fd3NGaWVsZAk9IHdzVGVtcDsNCi0gICAgbkNhcmV0CQk9IG5JbmRleCArICgobV9iUmVzZXJ2ZVNwYWNlICYmICFtX2JMZWZ0QWxpZ25tZW50KSA/IC1uSW5zTGVuZ3RoIDogbkluc0xlbmd0aCk7DQotICAgIGJCZWZvcmUJCT0gVFJVRTsNCi0gICAgcmV0dXJuIChuRmllbGRMZW5ndGggKyBuSW5zTGVuZ3RoIDwgbV9uTGVuZ3RoKSA/IEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9TX05PUk1BTCA6IEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9TX0ZVTEw7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZDo6RGVsZXRlKGludDMyX3QgbkluZGV4LCBpbnQzMl90IG5Db3VudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgJndzRGVsLCBpbnQzMl90ICZuQ2FyZXQsIEZYX0JPT0wgJmJCZWZvcmUpDQotew0KLSAgICBpbnQzMl90IG5GaWVsZExlbmd0aAk9IG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCi0gICAgaW50MzJfdCBuSW5uZXJJbmRleAk9IG5JbmRleCAtIEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkU7DQotICAgIGlmIChtX2JSZXNlcnZlU3BhY2UgJiYgIW1fYkxlZnRBbGlnbm1lbnQpIHsNCi0gICAgICAgIG5Jbm5lckluZGV4IC09IChtX25MZW5ndGggLSBuRmllbGRMZW5ndGgpOw0KLSAgICB9DQotICAgIGlmIChuSW5uZXJJbmRleCA8IDAgfHwgKG5Jbm5lckluZGV4ICsgbkNvdW50KSA+IG5GaWVsZExlbmd0aCkgew0KLSAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0JPVU5EQVJZOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcCA9IG1fd3NGaWVsZDsNCi0gICAgd3NUZW1wLkRlbGV0ZShuSW5uZXJJbmRleCwgbkNvdW50KTsNCi0gICAgaW50MzJfdCBuUmV0ID0gVmFsaWRhdGUod3NUZW1wKTsNCi0gICAgc3dpdGNoIChuUmV0KSB7DQotICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOg0KLSAgICAgICAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWTsNCi0gICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0lOVkFMSURBVEU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEU7DQotICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfUzoNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgRlhfV0NIQVIqIGxwQnVmID0gd3NEZWwuR2V0QnVmZmVyKG5Db3VudCk7DQotICAgIEZYU1lTX21lbWNweShscEJ1ZiwgY29uc3QgRlhfV0NIQVIqKG1fd3NGaWVsZCkgKyBuSW5uZXJJbmRleCwgbkNvdW50ICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgIHdzRGVsLlJlbGVhc2VCdWZmZXIobkNvdW50KTsNCi0gICAgbV93c0ZpZWxkCT0gd3NUZW1wOw0KLSAgICBuQ2FyZXQJCT0gbkluZGV4ICsgKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgPyBuQ291bnQgOiAwOw0KLSAgICBiQmVmb3JlCQk9IFRSVUU7DQotICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfUzsNCi19DQotaW50MzJfdCBDRkRFX1R4dEVkdEZpZWxkOjpSZXBsYWNlKGludDMyX3QgbkluZGV4LCBpbnQzMl90IG5Db3VudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzSW5zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgJndzRGVsLCBpbnQzMl90ICZuQ2FyZXQsIEZYX0JPT0wgJmJCZWZvcmUpDQotew0KLSAgICBpbnQzMl90CQluSW5uZXJJbmRleAkJPSBuSW5kZXggLSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KLSAgICBpbnQzMl90CQluSW5zTGVuZ3RoCQk9IHdzSW5zLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90CQluRmllbGRMZW5ndGgJPSBtX3dzRmllbGQuR2V0TGVuZ3RoKCk7DQotICAgIENGWF9XaWRlU3RyaW5nCXdzVGVtcAkJCT0gbV93c0ZpZWxkOw0KLSAgICBpZiAobV9iUmVzZXJ2ZVNwYWNlICYmICFtX2JMZWZ0QWxpZ25tZW50KSB7DQotICAgICAgICBuSW5uZXJJbmRleCAtPSAobV9uTGVuZ3RoIC0gbkZpZWxkTGVuZ3RoKTsNCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQobklubmVySW5kZXggPj0gMCAmJiBuSW5uZXJJbmRleCA8PSBuRmllbGRMZW5ndGgpOw0KLSAgICBpZiAobklubmVySW5kZXggKyBuQ291bnQgPiBuRmllbGRMZW5ndGgpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB3c1RlbXAuRGVsZXRlKG5Jbm5lckluZGV4LCBuQ291bnQpOw0KLSAgICBpbnQzMl90IG5Jbm5lckluZGV4QksgPSBuSW5uZXJJbmRleDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkluc0xlbmd0aDsgaSArKywgbklubmVySW5kZXggKyspIHsNCi0gICAgICAgIHdzVGVtcC5JbnNlcnQobklubmVySW5kZXgsIHdzSW5zW2ldKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IG5SZXQgPSBWYWxpZGF0ZSh3c1RlbXApOw0KLSAgICBzd2l0Y2goblJldCkgew0KLSAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfRlVMTDoNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfRlVMTDsNCi0gICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0lOVkFMSURBVEU6DQotICAgICAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEU7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIEZYX1dDSEFSKglscEJ1ZmZlciA9IHdzRGVsLkdldEJ1ZmZlcihuQ291bnQpOw0KLSAgICBjb25zdCBGWF9XQ0hBUioJbHBTcmNCdWYgPSBjb25zdCBGWF9XQ0hBUioobV93c0ZpZWxkKTsNCi0gICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyLCBscFNyY0J1ZiArIG5Jbm5lckluZGV4QkssIG5Db3VudCAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICB3c0RlbC5SZWxlYXNlQnVmZmVyKG5Db3VudCk7DQotICAgIG1fd3NGaWVsZAk9IHdzVGVtcDsNCi0gICAgbkNhcmV0CQk9IG5JbmRleCArICgobV9iUmVzZXJ2ZVNwYWNlICYmICFtX2JMZWZ0QWxpZ25tZW50KSA/IChuQ291bnQgLSBuSW5zTGVuZ3RoKSA6IChuSW5zTGVuZ3RoKSk7DQotICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfU19OT1JNQUw7DQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRGaWVsZDo6R2V0RGlzcGxheVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzRGlzcGxheSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRmllbGQ7DQotICAgIEdldE5vcm1hbGl6ZWRGaWVsZFRleHQod3NGaWVsZCk7DQotICAgIGludDMyX3Qgbkxlbmd0aAk9IHdzRmllbGQuR2V0TGVuZ3RoKCkgKyBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFICsgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX1RBSUxTSVpFOw0KLSAgICBGWF9XQ0hBUiogbHBCdWZmZXIJPSB3c0Rpc3BsYXkuR2V0QnVmZmVyKG5MZW5ndGgpOw0KLSAgICBscEJ1ZmZlclswXQkJCQk9IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOOw0KLSAgICBscEJ1ZmZlcltuTGVuZ3RoIC0gMV0JPSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0VORDsNCi0gICAgRlhfRFdPUkQgbkFkZHJlc3MgPSAoRlhfRFdPUkQpdGhpczsNCi0gICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgMSwgJm5BZGRyZXNzLCBzaXplb2YoRlhfRFdPUkQpKTsNCi0gICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgMywgY29uc3QgRlhfV0NIQVIqKHdzRmllbGQpLCAobkxlbmd0aCAtIDQpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgIHdzRGlzcGxheS5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RmllbGQ6OkdldERpc3BsYXlMZW5ndGgoKQ0KLXsNCi0gICAgcmV0dXJuIChtX2JSZXNlcnZlU3BhY2UgPyBtX25MZW5ndGggOiBtX3dzRmllbGQuR2V0TGVuZ3RoKCkpICsgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSArIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRTsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEZpZWxkOjpHZXRGaWVsZFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGQpDQotew0KLSAgICB3c0ZpZWxkID0gbV93c0ZpZWxkOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RmllbGQ6OkdldEZpZWxkVGV4dExlbmd0aCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RmllbGQ6OkdldFJlYWxJbmRleChpbnQzMl90IG5JbmRleCkgY29uc3QNCi17DQotICAgIGludDMyX3QgbklubmVySW5kZXgJPSBuSW5kZXggLSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KLSAgICBpZiAobklubmVySW5kZXggPCAwKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IG5GaWVsZExlbmd0aAk9IG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgew0KLSAgICAgICAgbklubmVySW5kZXggLT0gKG1fbkxlbmd0aCAtIG5GaWVsZExlbmd0aCk7DQotICAgIH0NCi0gICAgaWYgKG5Jbm5lckluZGV4IDwgMCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaWYgKG5Jbm5lckluZGV4ID49IG5GaWVsZExlbmd0aCkgew0KLSAgICAgICAgcmV0dXJuIG5GaWVsZExlbmd0aDsNCi0gICAgfQ0KLSAgICByZXR1cm4gbklubmVySW5kZXggKyAxOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RmllbGQ6Ok5vcm1hbGl6ZUNhcmV0UG9zKGludDMyX3QgbkluZGV4LCBGREVfRk9STUFUX0NBUkVUX0RJUkVDVElPTiBlRGlyZWN0aW9uICkgY29uc3QNCi17DQotICAgIG5JbmRleCAtPSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KLSAgICBpbnQzMl90IG5MZW5ndGggPSBtX3dzRmllbGQuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChtX2JSZXNlcnZlU3BhY2UpIHsNCi0gICAgICAgIGludDMyX3QgbkZpZWxkTGVuZ3RoID0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KLSAgICAgICAgaWYgKG1fYkxlZnRBbGlnbm1lbnQpIHsNCi0gICAgICAgICAgICBpZiAobkluZGV4ID4gbkZpZWxkTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgIGlmIChlRGlyZWN0aW9uID09IEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG5JbmRleCA9IG5GaWVsZExlbmd0aDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGludDMyX3QgblJlc2VydmVMZW5ndGggPSBtX25MZW5ndGggLSBuRmllbGRMZW5ndGg7DQotICAgICAgICAgICAgaWYgKG5JbmRleCA8IG5SZXNlcnZlTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgIGlmIChlRGlyZWN0aW9uID09IEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBuSW5kZXggPSBuUmVzZXJ2ZUxlbmd0aDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIG5JbmRleCArIEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkU7DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRGaWVsZDo6R2V0RWRpdGFibGVSYW5nZShpbnQzMl90ICZuQmduLCBpbnQzMl90ICZuRW5kKSBjb25zdA0KLXsNCi0gICAgaWYgKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgew0KLSAgICAgICAgbkVuZCA9IEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkUgKyBtX25MZW5ndGg7DQotICAgICAgICBuQmduID0gbkVuZCAtIG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCisjZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOIDB4RkZGOQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQgMHhGRkZCDQorI2RlZmluZSBGREVfVFhURURUX1pFUk9XSURUSFNQQUNFIDB4MjAwQg0KKyNkZWZpbmUgRkRFX1RYVEVEVF9JU0lOVEVHRVIoYSkgKChhKSA+PSBMJzAnICYmIChhKSA8PSBMJzknKQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9JU1NJR04oYSkgKCgoYSkgPT0gTCctJykgfHwgKChhKSA9PSBMJysnKSkNCitDRkRFX1R4dEVkdEJsb2NrOjpDRkRFX1R4dEVkdEJsb2NrKENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQmxvY2ssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Qb3NpdGlvbikNCisgICAgOiBtX3BFbmdpbmUocEVuZ2luZSksDQorICAgICAgbV9uRGlzcGxheUxlbmd0aCgwKSwNCisgICAgICBtX25JbmRleCgwKSwNCisgICAgICBtX25Qb3NpdGlvbihuUG9zaXRpb24pIHsNCisgIGNvbnN0IEZYX1dDSEFSKiBscEJ1ZiA9IGNvbnN0IEZYX1dDSEFSICogKHdzQmxvY2spOw0KKyAgaW50MzJfdCBuQ291bnQgPSB3c0Jsb2NrLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIHdzRml4Ow0KKyAgaW50MzJfdCBqID0gMDsNCisgIHdoaWxlIChpIDwgbkNvdW50KSB7DQorICAgIGlmIChscEJ1ZltpXSAhPSBMJyUnKSB7DQorICAgICAgd3NGaXggKz0gbHBCdWZbaV07DQogICAgIH0gZWxzZSB7DQotICAgICAgICBuQmduID0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRTsNCi0gICAgICAgIG5FbmQgPSBuQmduICsgbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENGREVfVHh0RWR0RmllbGQ6OkJhY2t1cCgpDQotew0KLSAgICBtX3dzQmFja3VwID0gbV93c0ZpZWxkOw0KLX0NCi12b2lkIENGREVfVHh0RWR0RmllbGQ6OlJlc3RvcmUoKQ0KLXsNCi0gICAgbV93c0ZpZWxkID0gbV93c0JhY2t1cDsNCi19DQotaW50MzJfdCBDRkRFX1R4dEVkdEZpZWxkOjpWYWxpZGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHdzVGV4dCkgY29uc3QNCi17DQotICAgIGlmIChtX25MZW5ndGggPCAwKSB7DQotICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX1M7DQotICAgIH0NCi0gICAgcmV0dXJuIHdzVGV4dC5HZXRMZW5ndGgoKSA8PSBtX25MZW5ndGggPyBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX1MgOiBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfRlVMTDsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEZpZWxkOjpHZXROb3JtYWxpemVkRmllbGRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkKSBjb25zdA0KLXsNCi0gICAgd3NGaWVsZCA9IG1fd3NGaWVsZDsNCi0gICAgaWYgKG1fbkxlbmd0aCA9PSAtMSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChtX2JSZXNlcnZlU3BhY2UpIHsNCi0gICAgICAgIGludDMyX3QgbkZpZWxkCT0gd3NGaWVsZC5HZXRMZW5ndGgoKTsNCi0gICAgICAgIGludDMyX3QgbkZpbGwJPSBtX25MZW5ndGggLSBuRmllbGQ7DQotICAgICAgICBpZiAobV9iTGVmdEFsaWdubWVudCkgew0KLSAgICAgICAgICAgIHdoaWxlIChuRmlsbCAtLSkgew0KLSAgICAgICAgICAgICAgICB3c0ZpZWxkLkluc2VydChuRmllbGQrKywgbV93Y0ZpbGwpOw0KLSAgICAgICAgICAgIH0NCisgICAgICBpKys7DQorICAgICAgaWYgKGkgPCBuQ291bnQpIHsNCisgICAgICAgIGlmIChscEJ1ZltpXSA9PSBMJyUnKSB7DQorICAgICAgICAgIHdzRml4ICs9IGxwQnVmW2ldOw0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB3aGlsZSAobkZpbGwgLS0pIHsNCi0gICAgICAgICAgICAgICAgd3NGaWVsZC5JbnNlcnQoMCwgbV93Y0ZpbGwpOw0KLSAgICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCF3c0ZpeC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkKiBwRmllbGQgPSBDRkRFX1R4dEVkdEZpZWxkOjpDcmVhdGUod3NGaXgsIGosIHRoaXMpOw0KKyAgICAgICAgICAgIGorKzsNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQocEZpZWxkKTsNCisgICAgICAgICAgICBtX0ZpZWxkQXJyLkFkZChwRmllbGQpOw0KKyAgICAgICAgICAgIG1fbkRpc3BsYXlMZW5ndGggKz0gcEZpZWxkLT5HZXREaXNwbGF5TGVuZ3RoKCk7DQorICAgICAgICAgICAgd3NGaXguRW1wdHkoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnQzMl90IG5Qb3MgPSBpIC0gMTsNCisgICAgICAgICAgd2hpbGUgKGxwQnVmW2krK10gIT0gTCcpJykNCisgICAgICAgICAgICA7DQorICAgICAgICAgIGkrKzsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzRmllbGQobHBCdWYgKyBuUG9zLCBpIC0gblBvcyk7DQorICAgICAgICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IENGREVfVHh0RWR0RmllbGQ6OkNyZWF0ZSh3c0ZpZWxkLCBqLCB0aGlzKTsNCisgICAgICAgICAgaisrOw0KKyAgICAgICAgICBGWFNZU19hc3NlcnQocEZpZWxkKTsNCisgICAgICAgICAgbV9GaWVsZEFyci5BZGQocEZpZWxkKTsNCisgICAgICAgICAgbV9FZGl0RmllbGRBcnIuQWRkKHBGaWVsZCk7DQorICAgICAgICAgIG1fbkRpc3BsYXlMZW5ndGggKz0gcEZpZWxkLT5HZXREaXNwbGF5TGVuZ3RoKCk7DQorICAgICAgICAgIGktLTsNCiAgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCisgICAgaSsrOw0KKyAgfQ0KKyAgaWYgKCF3c0ZpeC5Jc0VtcHR5KCkpIHsNCisgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gQ0ZERV9UeHRFZHRGaWVsZDo6Q3JlYXRlKHdzRml4LCBqLCB0aGlzKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBGaWVsZCk7DQorICAgIG1fRmllbGRBcnIuQWRkKHBGaWVsZCk7DQorICAgIG1fbkRpc3BsYXlMZW5ndGggKz0gcEZpZWxkLT5HZXREaXNwbGF5TGVuZ3RoKCk7DQorICB9DQogfQ0KLUNGREVfVHh0RWR0RmllbGRfSW50ZWdlcjo6Q0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBpbnQzMl90IG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jaykNCi0gICAgOiBtX2JTaWduKEZBTFNFKQ0KLSAgICAsIENGREVfVHh0RWR0RmllbGQobkluZGV4LCBwQmxvY2spDQotew0KLSAgICBDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyIEZvcm1hdFBhcnNlcjsNCi0gICAgRm9ybWF0UGFyc2VyLlBhcnNlKHdzRmllbGQpOw0KLSAgICBpbnQzMl90IG5Db3VudCA9IEZvcm1hdFBhcnNlci5Db3VudEl0ZW1zKCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdza2V5Ow0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQotICAgICAgICBGb3JtYXRQYXJzZXIuR2V0SXRlbShpLCB3c2tleSwgd3NWYWwpOw0KLSAgICAgICAgaWYgKHdza2V5LkVxdWFsKEwiTGVuZ3RoIikpIHsNCi0gICAgICAgICAgICBtX25MZW5ndGggPSB3c1ZhbC5HZXRJbnRlZ2VyKCk7DQotICAgICAgICB9IGVsc2UgaWYgKHdza2V5LkVxdWFsKEwiU2lnbiIpKSB7DQotICAgICAgICAgICAgbV9iU2lnbiA9IHdzVmFsLkdldEludGVnZXIoKSAhPSAwOw0KLSAgICAgICAgfSBlbHNlIGlmICh3c2tleS5FcXVhbChMIkZpbGxDaGFyIikpIHsNCi0gICAgICAgICAgICBtX3djRmlsbCA9IHdzVmFsWzBdOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQoMCk7DQotICAgICAgICB9DQotICAgICAgICB3c2tleS5FbXB0eSgpOw0KLSAgICAgICAgd3NWYWwuRW1wdHkoKTsNCi0gICAgfQ0KLSAgICBpZiAobV9uTGVuZ3RoID09IC0xKSB7DQotICAgICAgICBtX2JSZXNlcnZlU3BhY2UgPSBGQUxTRTsNCi0gICAgfQ0KK0NGREVfVHh0RWR0QmxvY2s6On5DRkRFX1R4dEVkdEJsb2NrKCkgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0ZpZWxkQXJyLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IG1fRmllbGRBcnJbaV07DQorICAgIHBGaWVsZC0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgbV9GaWVsZEFyci5SZW1vdmVBbGwoKTsNCiB9DQotaW50MzJfdCBDRkRFX1R4dEVkdEZpZWxkX0ludGVnZXI6OlZhbGlkYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGkJPSAwOw0KLSAgICBpZiAobV9iU2lnbikgew0KLSAgICAgICAgRlhfV0NIQVIgd2NUZW1wID0gd3NUZXh0WzBdOw0KLSAgICAgICAgaWYgKEZERV9UWFRFRFRfSVNTSUdOKHdjVGVtcCkpIHsNCi0gICAgICAgICAgICBpICsrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGludDMyX3Qgbkxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKG1fbkxlbmd0aCA+IDApIHsNCi0gICAgICAgIGlmIChuTGVuZ3RoIC0gaSA+IChtX25MZW5ndGggLSAobV9iU2lnbiA/IDEgOiAwKSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZm9yICg7IGkgPCBuTGVuZ3RoOyBpICsrKSB7DQotICAgICAgICBGWF9XQ0hBUiB3Y1RlbXAgPSB3c1RleHRbaV07DQotICAgICAgICBpZiAoIUZERV9UWFRFRFRfSVNJTlRFR0VSKHdjVGVtcCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0lOVkFMSURBVEU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfUzsNCit2b2lkIENGREVfVHh0RWR0QmxvY2s6OkdldERpc3BsYXlUZXh0KENGWF9XaWRlU3RyaW5nJiB3c0Rpc3BsYXkpIHsNCisgIGludDMyX3QgbkNvdW50ID0gbV9GaWVsZEFyci5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBDRkRFX1R4dEVkdEZpZWxkKiBwRmllbGQgPSBtX0ZpZWxkQXJyW2ldOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgIHBGaWVsZC0+R2V0RGlzcGxheVRleHQod3NUZW1wKTsNCisgICAgd3NEaXNwbGF5ICs9IHdzVGVtcDsNCisgIH0NCiB9DQotQ0ZERV9UeHRFZHRGaWVsZF9GbG9hdDo6Q0ZERV9UeHRFZHRGaWVsZF9GbG9hdChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGaWVsZCwgaW50MzJfdCBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2spDQotICAgIDogQ0ZERV9UeHRFZHRGaWVsZChuSW5kZXgsIHBCbG9jaykNCi0gICAgLCBtX2JTaWduZWQoRkFMU0UpDQotICAgICwgbV9uSW50UGFydGxlbmd0aCgtMSkNCi0gICAgLCBtX25EZWNQYXJ0TGVuZ3RoKC0xKQ0KLXsNCi0gICAgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlciBGb3JtYXRQYXJzZXI7DQotICAgIEZvcm1hdFBhcnNlci5QYXJzZSh3c0ZpZWxkKTsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBGb3JtYXRQYXJzZXIuQ291bnRJdGVtcygpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c2tleTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWw7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgRm9ybWF0UGFyc2VyLkdldEl0ZW0oaSwgd3NrZXksIHdzVmFsKTsNCi0gICAgICAgIGlmICh3c2tleS5FcXVhbChMIkRlY0xlbmd0aCIpKSB7DQotICAgICAgICAgICAgbV9uRGVjUGFydExlbmd0aCA9IHdzVmFsLkdldEludGVnZXIoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAod3NrZXkuRXF1YWwoTCJJbnRMZW5ndGgiKSkgew0KLSAgICAgICAgICAgIG1fbkludFBhcnRsZW5ndGggPSB3c1ZhbC5HZXRJbnRlZ2VyKCk7DQotICAgICAgICB9IGVsc2UgaWYgKHdza2V5LkVxdWFsKEwiU2lnbiIpKSB7DQotICAgICAgICAgICAgbV9iU2lnbmVkID0gd3NWYWwuR2V0SW50ZWdlcigpICE9IDA7DQotICAgICAgICB9IGVsc2UgaWYgKHdza2V5LkVxdWFsKEwiRmlsbENoYXIiKSkgew0KLSAgICAgICAgICAgIG1fd2NGaWxsID0gd3NWYWxbMF07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX25JbnRQYXJ0bGVuZ3RoID09IC0xIHx8IG1fbkRlY1BhcnRMZW5ndGggPT0gLTEpIHsNCi0gICAgICAgICAgICBtX25MZW5ndGggPSAtMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9uTGVuZ3RoID0gbV9uSW50UGFydGxlbmd0aCArIG1fbkRlY1BhcnRMZW5ndGggKyAxICsgKG1fYlNpZ25lZCA/IDEgOiAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fYlJlc2VydmVTcGFjZSA9IFRSVUU7DQotICAgICAgICB3c2tleS5FbXB0eSgpOw0KLSAgICAgICAgd3NWYWwuRW1wdHkoKTsNCi0gICAgfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRCbG9jazo6R2V0TGVuZ3RoKCkgY29uc3Qgew0KKyAgaW50MzJfdCBuRGlzcGxheUxlbmd0aCA9IDA7DQorICBpbnQzMl90IG5Db3VudCA9IG1fRmllbGRBcnIuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gbV9GaWVsZEFycltpXTsNCisgICAgbkRpc3BsYXlMZW5ndGggKz0gcEZpZWxkLT5HZXREaXNwbGF5TGVuZ3RoKCk7DQorICB9DQorICByZXR1cm4gbkRpc3BsYXlMZW5ndGg7DQogfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZF9GbG9hdDo6VmFsaWRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB3c1RleHQpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IG5MZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChtX25MZW5ndGggIT0gLTEgJiYgKG5MZW5ndGggPiBtX25MZW5ndGgpKSB7DQotICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw7DQordm9pZCBDRkRFX1R4dEVkdEJsb2NrOjpHZXRCbG9ja1RleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzQmxvY2spIHsNCisgIGludDMyX3QgbkNvdW50ID0gbV9GaWVsZEFyci5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBDRkRFX1R4dEVkdEZpZWxkKiBwRmllbGQgPSBtX0ZpZWxkQXJyW2ldOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgIHBGaWVsZC0+R2V0RmllbGRUZXh0KHdzVGVtcCk7DQorICAgIHdzQmxvY2sgKz0gd3NUZW1wOw0KKyAgfQ0KK30NCitpbnQzMl90IENGREVfVHh0RWR0QmxvY2s6OkNvdW50RmllbGQoKSBjb25zdCB7DQorICByZXR1cm4gbV9FZGl0RmllbGRBcnIuR2V0U2l6ZSgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0QmxvY2s6OkdldEZpZWxkVGV4dChpbnQzMl90IG5JbmRleCwgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQpIHsNCisgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IG1fRWRpdEZpZWxkQXJyW25JbmRleF07DQorICBwRmllbGQtPkdldEZpZWxkVGV4dCh3c0ZpZWxkKTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEJsb2NrOjpHZXRGaWVsZFRleHRMZW5ndGgoKSBjb25zdCB7DQorICBpbnQzMl90IG5Ub3RhbExlbmd0aCA9IDA7DQorICBpbnQzMl90IG5Db3VudCA9IG1fRWRpdEZpZWxkQXJyLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IG1fRWRpdEZpZWxkQXJyW2ldOw0KKyAgICBuVG90YWxMZW5ndGggPSBwRmllbGQtPkdldEZpZWxkVGV4dExlbmd0aCgpOw0KKyAgfQ0KKyAgcmV0dXJuIG5Ub3RhbExlbmd0aDsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEJsb2NrOjpHZXRQb3MoKSBjb25zdCB7DQorICByZXR1cm4gbV9uUG9zaXRpb247DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCbG9jazo6R2V0UmVhbFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Qgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0ZpZWxkQXJyLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IG1fRmllbGRBcnJbaV07DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgcEZpZWxkLT5HZXRGaWVsZFRleHQod3NUZW1wKTsNCisgICAgd3NUZXh0ICs9IHdzVGVtcDsNCisgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdEJsb2NrOjpCYWNrdXAoKSB7DQorICBpbnQzMl90IG5Db3VudCA9IG1fRWRpdEZpZWxkQXJyLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIG1fRWRpdEZpZWxkQXJyW2ldLT5CYWNrdXAoKTsNCisgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdEJsb2NrOjpSZXN0b3JlKCkgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0VkaXRGaWVsZEFyci5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBtX0VkaXRGaWVsZEFycltpXS0+UmVzdG9yZSgpOw0KKyAgfQ0KK30NCitDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyOjpDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyKCkge30NCitDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyOjp+Q0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlcigpIHsNCisgIEZERV9MUFRYVEVEVEZPUk1BVElURU0gbHBJdGVtID0gTlVMTDsNCisgIGludDMyX3QgbkNvdW50ID0gbV9JdGVtQXJyLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIGxwSXRlbSA9IG1fSXRlbUFycltpXTsNCisgICAgZGVsZXRlIGxwSXRlbTsNCisgIH0NCisgIG1fSXRlbUFyci5SZW1vdmVBbGwoKTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyOjpQYXJzZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQpIHsNCisgIG1fd3NGb3JtYXQgPSB3c0Zvcm1hdDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwQnVmID0gY29uc3QgRlhfV0NIQVIgKiAobV93c0Zvcm1hdCk7DQorICBpbnQzMl90IG5Db3VudCA9IG1fd3NGb3JtYXQuR2V0TGVuZ3RoKCk7DQorICBuQ291bnQgLT0gMjsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIEZYX1dDSEFSIHdDaGFyID0gcEJ1ZltpXTsNCisgICAgaWYgKHdDaGFyID09IEwnKCcpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBjb25zdCBGWF9XQ0hBUiogbHBCdWYgPSBjb25zdCBGWF9XQ0hBUiood3NUZXh0KTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgaWYgKG1fYlNpZ25lZCkgew0KLSAgICAgICAgRlhfV0NIQVIgd2NUZW1wID0gbHBCdWZbMF07DQotICAgICAgICBpZiAoRkRFX1RYVEVEVF9JU1NJR04od2NUZW1wKSkgew0KLSAgICAgICAgICAgIGkgKys7DQorICB9DQorICBpKys7DQorICBGREVfVFhURURURk9STUFUSVRFTSBGb3JtYXRJdGVtOw0KKyAgZm9yICg7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICB3aGlsZSAocEJ1ZltpXSA9PSBMJyAnKSB7DQorICAgICAgaSsrOw0KKyAgICB9DQorICAgIEZvcm1hdEl0ZW0ubktleVN0YXJ0ID0gaTsNCisgICAgd2hpbGUgKHBCdWZbaV0gIT0gTCc6Jykgew0KKyAgICAgIGkrKzsNCisgICAgfQ0KKyAgICBGb3JtYXRJdGVtLm5LZXlDb3VudCA9IGkgLSBGb3JtYXRJdGVtLm5LZXlTdGFydDsNCisgICAgaSsrOw0KKyAgICBGb3JtYXRJdGVtLm5WYWxTdGFydCA9IGk7DQorICAgIHdoaWxlIChwQnVmW2ldICE9IEwnOycgJiYgaSA8IG5Db3VudCkgew0KKyAgICAgIGkrKzsNCisgICAgfQ0KKyAgICBGb3JtYXRJdGVtLm5WYWxDb3VudCA9IGkgLSBGb3JtYXRJdGVtLm5WYWxTdGFydDsNCisgICAgRkRFX0xQVFhURURURk9STUFUSVRFTSBwRm9ybWF0SXRlbSA9IEZYX05FVyBGREVfVFhURURURk9STUFUSVRFTTsNCisgICAgRlhTWVNfbWVtY3B5KHBGb3JtYXRJdGVtLCAmRm9ybWF0SXRlbSwgc2l6ZW9mKEZERV9UWFRFRFRGT1JNQVRJVEVNKSk7DQorICAgIG1fSXRlbUFyci5BZGQocEZvcm1hdEl0ZW0pOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlcjo6Q291bnRJdGVtcygpIGNvbnN0IHsNCisgIHJldHVybiBtX0l0ZW1BcnIuR2V0U2l6ZSgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXI6OkdldEl0ZW0oaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0tleSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIGNvbnN0IHsNCisgIEZERV9MUFRYVEVEVEZPUk1BVElURU0gbHBJdGVtID0gbV9JdGVtQXJyW25JbmRleF07DQorICBjb25zdCBGWF9XQ0hBUiogbHBTcmNCdWYgPSBjb25zdCBGWF9XQ0hBUiAqIChtX3dzRm9ybWF0KTsNCisgIEZYX1dDSEFSKiBscERzdEJ1ZiA9IHdzS2V5LkdldEJ1ZmZlcihscEl0ZW0tPm5LZXlDb3VudCk7DQorICBGWFNZU19tZW1jcHkobHBEc3RCdWYsIGxwU3JjQnVmICsgbHBJdGVtLT5uS2V5U3RhcnQsDQorICAgICAgICAgICAgICAgbHBJdGVtLT5uS2V5Q291bnQgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIHdzS2V5LlJlbGVhc2VCdWZmZXIobHBJdGVtLT5uS2V5Q291bnQpOw0KKyAgbHBEc3RCdWYgPSB3c1ZhbHVlLkdldEJ1ZmZlcihscEl0ZW0tPm5WYWxDb3VudCk7DQorICBGWFNZU19tZW1jcHkobHBEc3RCdWYsIGxwU3JjQnVmICsgbHBJdGVtLT5uVmFsU3RhcnQsDQorICAgICAgICAgICAgICAgbHBJdGVtLT5uVmFsQ291bnQgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIHdzVmFsdWUuUmVsZWFzZUJ1ZmZlcihscEl0ZW0tPm5WYWxDb3VudCk7DQorfQ0KK0NGREVfVHh0RWR0RmllbGQqIENGREVfVHh0RWR0RmllbGQ6OkNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jaykgew0KKyAgaWYgKHdzRmllbGRbMF0gIT0gTCclJyB8fCAod3NGaWVsZFswXSA9PSBMJyUnICYmIHdzRmllbGRbMV0gPT0gTCclJykpIHsNCisgICAgcmV0dXJuIEZYX05FVyBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkKHdzRmllbGQsIG5JbmRleCwgcEJsb2NrKTsNCisgIH0NCisgIEZYX1dDSEFSIHdjVHlwZSA9IHdzRmllbGRbd3NGaWVsZC5HZXRMZW5ndGgoKSAtIDFdOw0KKyAgc3dpdGNoICh3Y1R5cGUpIHsNCisgICAgY2FzZSBMJ2QnOg0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyKHdzRmllbGQsIG5JbmRleCwgcEJsb2NrKTsNCisgICAgY2FzZSBMJ2YnOg0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHRGaWVsZF9GbG9hdCh3c0ZpZWxkLCBuSW5kZXgsIHBCbG9jayk7DQorICAgIGNhc2UgTCdzJzoNCisgICAgICByZXR1cm4gRlhfTkVXIENGREVfVHh0RWR0RmllbGRfU3RyaW5nKHdzRmllbGQsIG5JbmRleCwgcEJsb2NrKTsNCisgICAgY2FzZSBMJ3AnOg0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHRGaWVsZF9QYXNzd29yZCh3c0ZpZWxkLCBuSW5kZXgsIHBCbG9jayk7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQorfQ0KK0NGREVfVHh0RWR0RmllbGQ6OkNGREVfVHh0RWR0RmllbGQoaW50MzJfdCBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jaykNCisgICAgOiBtX25MZW5ndGgoLTEpLA0KKyAgICAgIG1fd2NGaWxsKEwnICcpLA0KKyAgICAgIG1fYlJlc2VydmVTcGFjZShGQUxTRSksDQorICAgICAgbV9iTGVmdEFsaWdubWVudChUUlVFKSwNCisgICAgICBtX25JbmRleChuSW5kZXgpLA0KKyAgICAgIG1fcEJsb2NrKHBCbG9jaykgew0KKyAgRlhTWVNfYXNzZXJ0KHBCbG9jayk7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZDo6SW5zZXJ0KGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0lucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkJlZm9yZSkgew0KKyAgaW50MzJfdCBuRmllbGRMZW5ndGggPSBtX3dzRmllbGQuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IG5Jbm5lckluZGV4ID0gbkluZGV4IC0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRTsNCisgIGlmIChtX2JSZXNlcnZlU3BhY2UgJiYgIW1fYkxlZnRBbGlnbm1lbnQpIHsNCisgICAgbklubmVySW5kZXggLT0gKG1fbkxlbmd0aCAtIG5GaWVsZExlbmd0aCk7DQorICB9DQorICBGWFNZU19hc3NlcnQobklubmVySW5kZXggPj0gMCAmJiBuSW5uZXJJbmRleCA8PSBuRmllbGRMZW5ndGgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wID0gbV93c0ZpZWxkOw0KKyAgaW50MzJfdCBuSW5zTGVuZ3RoID0gd3NJbnMuR2V0TGVuZ3RoKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuSW5zTGVuZ3RoOyBpKyssIG5Jbm5lckluZGV4KyspIHsNCisgICAgd3NUZW1wLkluc2VydChuSW5uZXJJbmRleCwgd3NJbnNbaV0pOw0KKyAgfQ0KKyAgaW50MzJfdCBuUmV0ID0gVmFsaWRhdGUod3NUZW1wKTsNCisgIHN3aXRjaCAoblJldCkgew0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOg0KKyAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMOw0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFOg0KKyAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9JTlZBTElEQVRFOw0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfUzoNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIG1fd3NGaWVsZCA9IHdzVGVtcDsNCisgIG5DYXJldCA9IG5JbmRleCArDQorICAgICAgICAgICAoKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgPyAtbkluc0xlbmd0aCA6IG5JbnNMZW5ndGgpOw0KKyAgYkJlZm9yZSA9IFRSVUU7DQorICByZXR1cm4gKG5GaWVsZExlbmd0aCArIG5JbnNMZW5ndGggPCBtX25MZW5ndGgpDQorICAgICAgICAgICAgID8gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfTk9STUFMDQorICAgICAgICAgICAgIDogRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfRlVMTDsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEZpZWxkOjpEZWxldGUoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKSB7DQorICBpbnQzMl90IG5GaWVsZExlbmd0aCA9IG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgbklubmVySW5kZXggPSBuSW5kZXggLSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KKyAgaWYgKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgew0KKyAgICBuSW5uZXJJbmRleCAtPSAobV9uTGVuZ3RoIC0gbkZpZWxkTGVuZ3RoKTsNCisgIH0NCisgIGlmIChuSW5uZXJJbmRleCA8IDAgfHwgKG5Jbm5lckluZGV4ICsgbkNvdW50KSA+IG5GaWVsZExlbmd0aCkgew0KKyAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfQk9VTkRBUlk7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RlbXAgPSBtX3dzRmllbGQ7DQorICB3c1RlbXAuRGVsZXRlKG5Jbm5lckluZGV4LCBuQ291bnQpOw0KKyAgaW50MzJfdCBuUmV0ID0gVmFsaWRhdGUod3NUZW1wKTsNCisgIHN3aXRjaCAoblJldCkgew0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOg0KKyAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWTsNCisgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfSU5WQUxJREFURToNCisgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfSU5WQUxJREFURTsNCisgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX1M6DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBGWF9XQ0hBUiogbHBCdWYgPSB3c0RlbC5HZXRCdWZmZXIobkNvdW50KTsNCisgIEZYU1lTX21lbWNweShscEJ1ZiwgY29uc3QgRlhfV0NIQVIqKG1fd3NGaWVsZCkgKyBuSW5uZXJJbmRleCwNCisgICAgICAgICAgICAgICBuQ291bnQgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIHdzRGVsLlJlbGVhc2VCdWZmZXIobkNvdW50KTsNCisgIG1fd3NGaWVsZCA9IHdzVGVtcDsNCisgIG5DYXJldCA9IG5JbmRleCArIChtX2JSZXNlcnZlU3BhY2UgJiYgIW1fYkxlZnRBbGlnbm1lbnQpID8gbkNvdW50IDogMDsNCisgIGJCZWZvcmUgPSBUUlVFOw0KKyAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9TOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RmllbGQ6OlJlcGxhY2UoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NJbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKSB7DQorICBpbnQzMl90IG5Jbm5lckluZGV4ID0gbkluZGV4IC0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRTsNCisgIGludDMyX3Qgbkluc0xlbmd0aCA9IHdzSW5zLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBuRmllbGRMZW5ndGggPSBtX3dzRmllbGQuR2V0TGVuZ3RoKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RlbXAgPSBtX3dzRmllbGQ7DQorICBpZiAobV9iUmVzZXJ2ZVNwYWNlICYmICFtX2JMZWZ0QWxpZ25tZW50KSB7DQorICAgIG5Jbm5lckluZGV4IC09IChtX25MZW5ndGggLSBuRmllbGRMZW5ndGgpOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KG5Jbm5lckluZGV4ID49IDAgJiYgbklubmVySW5kZXggPD0gbkZpZWxkTGVuZ3RoKTsNCisgIGlmIChuSW5uZXJJbmRleCArIG5Db3VudCA+IG5GaWVsZExlbmd0aCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3c1RlbXAuRGVsZXRlKG5Jbm5lckluZGV4LCBuQ291bnQpOw0KKyAgaW50MzJfdCBuSW5uZXJJbmRleEJLID0gbklubmVySW5kZXg7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuSW5zTGVuZ3RoOyBpKyssIG5Jbm5lckluZGV4KyspIHsNCisgICAgd3NUZW1wLkluc2VydChuSW5uZXJJbmRleCwgd3NJbnNbaV0pOw0KKyAgfQ0KKyAgaW50MzJfdCBuUmV0ID0gVmFsaWRhdGUod3NUZW1wKTsNCisgIHN3aXRjaCAoblJldCkgew0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOg0KKyAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMOw0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFOg0KKyAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9JTlZBTElEQVRFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgRlhfV0NIQVIqIGxwQnVmZmVyID0gd3NEZWwuR2V0QnVmZmVyKG5Db3VudCk7DQorICBjb25zdCBGWF9XQ0hBUiogbHBTcmNCdWYgPSBjb25zdCBGWF9XQ0hBUiAqIChtX3dzRmllbGQpOw0KKyAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyLCBscFNyY0J1ZiArIG5Jbm5lckluZGV4QkssIG5Db3VudCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgd3NEZWwuUmVsZWFzZUJ1ZmZlcihuQ291bnQpOw0KKyAgbV93c0ZpZWxkID0gd3NUZW1wOw0KKyAgbkNhcmV0ID0NCisgICAgICBuSW5kZXggKyAoKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgPyAobkNvdW50IC0gbkluc0xlbmd0aCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobkluc0xlbmd0aCkpOw0KKyAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9TX05PUk1BTDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkOjpHZXREaXNwbGF5VGV4dChDRlhfV2lkZVN0cmluZyYgd3NEaXNwbGF5KSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkOw0KKyAgR2V0Tm9ybWFsaXplZEZpZWxkVGV4dCh3c0ZpZWxkKTsNCisgIGludDMyX3Qgbkxlbmd0aCA9IHdzRmllbGQuR2V0TGVuZ3RoKCkgKyBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFICsNCisgICAgICAgICAgICAgICAgICAgIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRTsNCisgIEZYX1dDSEFSKiBscEJ1ZmZlciA9IHdzRGlzcGxheS5HZXRCdWZmZXIobkxlbmd0aCk7DQorICBscEJ1ZmZlclswXSA9IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOOw0KKyAgbHBCdWZmZXJbbkxlbmd0aCAtIDFdID0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQ7DQorICBGWF9EV09SRCBuQWRkcmVzcyA9IChGWF9EV09SRCkgdGhpczsNCisgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIDEsICZuQWRkcmVzcywgc2l6ZW9mKEZYX0RXT1JEKSk7DQorICBGWFNZU19tZW1jcHkobHBCdWZmZXIgKyAzLCBjb25zdCBGWF9XQ0hBUiood3NGaWVsZCksDQorICAgICAgICAgICAgICAgKG5MZW5ndGggLSA0KSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgd3NEaXNwbGF5LlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZDo6R2V0RGlzcGxheUxlbmd0aCgpIHsNCisgIHJldHVybiAobV9iUmVzZXJ2ZVNwYWNlID8gbV9uTGVuZ3RoIDogbV93c0ZpZWxkLkdldExlbmd0aCgpKSArDQorICAgICAgICAgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSArIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkOjpHZXRGaWVsZFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQpIHsNCisgIHdzRmllbGQgPSBtX3dzRmllbGQ7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZDo6R2V0RmllbGRUZXh0TGVuZ3RoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEZpZWxkOjpHZXRSZWFsSW5kZXgoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsNCisgIGludDMyX3QgbklubmVySW5kZXggPSBuSW5kZXggLSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KKyAgaWYgKG5Jbm5lckluZGV4IDwgMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgbkZpZWxkTGVuZ3RoID0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgaWYgKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgew0KKyAgICBuSW5uZXJJbmRleCAtPSAobV9uTGVuZ3RoIC0gbkZpZWxkTGVuZ3RoKTsNCisgIH0NCisgIGlmIChuSW5uZXJJbmRleCA8IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAobklubmVySW5kZXggPj0gbkZpZWxkTGVuZ3RoKSB7DQorICAgIHJldHVybiBuRmllbGRMZW5ndGg7DQorICB9DQorICByZXR1cm4gbklubmVySW5kZXggKyAxOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RmllbGQ6Ok5vcm1hbGl6ZUNhcmV0UG9zKA0KKyAgICBpbnQzMl90IG5JbmRleCwNCisgICAgRkRFX0ZPUk1BVF9DQVJFVF9ESVJFQ1RJT04gZURpcmVjdGlvbikgY29uc3Qgew0KKyAgbkluZGV4IC09IEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkU7DQorICBpbnQzMl90IG5MZW5ndGggPSBtX3dzRmllbGQuR2V0TGVuZ3RoKCk7DQorICBpZiAobV9iUmVzZXJ2ZVNwYWNlKSB7DQorICAgIGludDMyX3QgbkZpZWxkTGVuZ3RoID0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgICBpZiAobV9iTGVmdEFsaWdubWVudCkgew0KKyAgICAgIGlmIChuSW5kZXggPiBuRmllbGRMZW5ndGgpIHsNCisgICAgICAgIGlmIChlRGlyZWN0aW9uID09IEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCkgew0KKyAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBuSW50UGFydAk9IDA7DQotICAgIGludDMyX3QgblBvaW50CQk9IDA7DQotICAgIGZvciAoOyBpIDwgbkxlbmd0aDsgaSArKykgew0KLSAgICAgICAgRlhfV0NIQVIgd2NUZW1wID0gbHBCdWZbaV07DQotICAgICAgICBpZiAoIUZERV9UWFRFRFRfSVNJTlRFR0VSKHdjVGVtcCkpIHsNCi0gICAgICAgICAgICBpZiAod2NUZW1wICE9IEwnLicpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBuUG9pbnQgPSAxOw0KLSAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgbkluZGV4ID0gbkZpZWxkTGVuZ3RoOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpbnQzMl90IG5SZXNlcnZlTGVuZ3RoID0gbV9uTGVuZ3RoIC0gbkZpZWxkTGVuZ3RoOw0KKyAgICAgIGlmIChuSW5kZXggPCBuUmVzZXJ2ZUxlbmd0aCkgew0KKyAgICAgICAgaWYgKGVEaXJlY3Rpb24gPT0gRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCkgew0KKyAgICAgICAgICByZXR1cm4gLTI7DQogICAgICAgICB9DQotICAgICAgICBuSW50UGFydCArKzsNCisgICAgICAgIG5JbmRleCA9IG5SZXNlcnZlTGVuZ3RoOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAobV9uSW50UGFydGxlbmd0aCAhPSAtMSAmJiAobkludFBhcnQgPiBtX25JbnRQYXJ0bGVuZ3RoKSkgew0KLSAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOw0KLSAgICB9DQotICAgIGlmIChtX25EZWNQYXJ0TGVuZ3RoICE9IC0xICYmIChuTGVuZ3RoIC0gbkludFBhcnQgLSBuUG9pbnQgPiBtX25EZWNQYXJ0TGVuZ3RoKSkgew0KLSAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOw0KLSAgICB9DQotICAgIGkgKys7DQotICAgIGZvciAoOyBpIDwgbkxlbmd0aDsgaSArKykgew0KLSAgICAgICAgRlhfV0NIQVIgd2NUZW1wID0gbHBCdWZbaV07DQotICAgICAgICBpZiAoIUZERV9UWFRFRFRfSVNJTlRFR0VSKHdjVGVtcCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfUzsNCisgIH0NCisgIHJldHVybiBuSW5kZXggKyBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KIH0NCi1DRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkOjpDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBpbnQzMl90IG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jaykNCi0gICAgOiBDRkRFX1R4dEVkdEZpZWxkKG5JbmRleCwgcEJsb2NrKQ0KLSAgICAsIG1fd2NBbGlhcyhMJyonKQ0KLXsNCi0gICAgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlciBGb3JtYXRQYXJzZXI7DQotICAgIEZvcm1hdFBhcnNlci5QYXJzZSh3c0ZpZWxkKTsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBGb3JtYXRQYXJzZXIuQ291bnRJdGVtcygpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c2tleTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWw7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgRm9ybWF0UGFyc2VyLkdldEl0ZW0oaSwgd3NrZXksIHdzVmFsKTsNCi0gICAgICAgIGlmICh3c2tleS5FcXVhbChMIkxlbmd0aCIpKSB7DQotICAgICAgICAgICAgbV9uTGVuZ3RoID0gd3NWYWwuR2V0SW50ZWdlcigpOw0KLSAgICAgICAgfSBlbHNlIGlmICh3c2tleS5FcXVhbChMIkFsaWFzQ2hhciIpKSB7DQotICAgICAgICAgICAgbV93Y0FsaWFzID0gd3NWYWxbMF07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHdza2V5LkVtcHR5KCk7DQotICAgICAgICB3c1ZhbC5FbXB0eSgpOw0KLSAgICB9DQotICAgIGlmIChtX25MZW5ndGggPT0gLTEpIHsNCi0gICAgICAgIG1fYlJlc2VydmVTcGFjZSA9IEZBTFNFOw0KLSAgICB9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEZpZWxkOjpHZXRFZGl0YWJsZVJhbmdlKGludDMyX3QmIG5CZ24sIGludDMyX3QmIG5FbmQpIGNvbnN0IHsNCisgIGlmIChtX2JSZXNlcnZlU3BhY2UgJiYgIW1fYkxlZnRBbGlnbm1lbnQpIHsNCisgICAgbkVuZCA9IEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkUgKyBtX25MZW5ndGg7DQorICAgIG5CZ24gPSBuRW5kIC0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgfSBlbHNlIHsNCisgICAgbkJnbiA9IEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkU7DQorICAgIG5FbmQgPSBuQmduICsgbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ0ZERV9UeHRFZHRGaWVsZF9QYXNzd29yZDo6R2V0Tm9ybWFsaXplZEZpZWxkVGV4dChDRlhfV2lkZVN0cmluZyAmd3NGaWVsZCkgY29uc3QNCi17DQotICAgIGludDMyX3QgbkZpbGVkTGVuZ3RoCT0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IG5MZW5ndGgJCT0gbV9iUmVzZXJ2ZVNwYWNlID8gbV9uTGVuZ3RoIDogbkZpbGVkTGVuZ3RoOw0KLSAgICBGWF9XQ0hBUiogbHBCdWYJCQk9IHdzRmllbGQuR2V0QnVmZmVyKG5MZW5ndGgpOw0KLSAgICBpbnQzMl90IG5TcGFjZUxlbmd0aAk9IG5MZW5ndGggLSBuRmlsZWRMZW5ndGg7DQotICAgIGludDMyX3QgbkZpcnN0UGFydAkJPSBtX2JMZWZ0QWxpZ25tZW50ID8gbkZpbGVkTGVuZ3RoIDogblNwYWNlTGVuZ3RoOw0KLSAgICBGWF9XQ0hBUiB3Rmlyc3RDaGFyCQk9IG1fYkxlZnRBbGlnbm1lbnQgPyBtX3djQWxpYXMgOiBMJyAnOw0KLSAgICBGWF9XQ0hBUiB3U2Vjb25kQ2hhcgk9IG1fYkxlZnRBbGlnbm1lbnQgPyBMJyAnIDogbV93Y0FsaWFzOw0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBmb3IgKDsgaSA8IG5GaXJzdFBhcnQ7IGkgKyspIHsNCi0gICAgICAgIGxwQnVmW2ldID0gd0ZpcnN0Q2hhcjsNCi0gICAgfQ0KLSAgICBmb3IgKDsgaSA8IG5MZW5ndGg7IGkgKyspIHsNCi0gICAgICAgIGxwQnVmW2ldID0gd1NlY29uZENoYXI7DQotICAgIH0NCi0gICAgd3NGaWVsZC5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KK3ZvaWQgQ0ZERV9UeHRFZHRGaWVsZDo6QmFja3VwKCkgew0KKyAgbV93c0JhY2t1cCA9IG1fd3NGaWVsZDsNCiB9DQotQ0ZERV9UeHRFZHRGaWVsZF9TdHJpbmc6OkNGREVfVHh0RWR0RmllbGRfU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBpbnQzMl90IG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jaykNCi0gICAgOiBDRkRFX1R4dEVkdEZpZWxkKG5JbmRleCwgcEJsb2NrKQ0KLXsNCi0gICAgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlciBGb3JtYXRQYXJzZXI7DQotICAgIEZvcm1hdFBhcnNlci5QYXJzZSh3c0ZpZWxkKTsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBGb3JtYXRQYXJzZXIuQ291bnRJdGVtcygpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c2tleTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWw7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgRm9ybWF0UGFyc2VyLkdldEl0ZW0oaSwgd3NrZXksIHdzVmFsKTsNCi0gICAgICAgIGlmICh3c2tleS5FcXVhbChMIkxlbmd0aCIpKSB7DQotICAgICAgICAgICAgbV9uTGVuZ3RoID0gd3NWYWwuR2V0SW50ZWdlcigpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQoMCk7DQotICAgICAgICB9DQotICAgICAgICB3c2tleS5FbXB0eSgpOw0KLSAgICAgICAgd3NWYWwuRW1wdHkoKTsNCit2b2lkIENGREVfVHh0RWR0RmllbGQ6OlJlc3RvcmUoKSB7DQorICBtX3dzRmllbGQgPSBtX3dzQmFja3VwOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RmllbGQ6OlZhbGlkYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0IHsNCisgIGlmIChtX25MZW5ndGggPCAwKSB7DQorICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfUzsNCisgIH0NCisgIHJldHVybiB3c1RleHQuR2V0TGVuZ3RoKCkgPD0gbV9uTGVuZ3RoID8gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9TDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOw0KK30NCit2b2lkIENGREVfVHh0RWR0RmllbGQ6OkdldE5vcm1hbGl6ZWRGaWVsZFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQpIGNvbnN0IHsNCisgIHdzRmllbGQgPSBtX3dzRmllbGQ7DQorICBpZiAobV9uTGVuZ3RoID09IC0xKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX2JSZXNlcnZlU3BhY2UpIHsNCisgICAgaW50MzJfdCBuRmllbGQgPSB3c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgICBpbnQzMl90IG5GaWxsID0gbV9uTGVuZ3RoIC0gbkZpZWxkOw0KKyAgICBpZiAobV9iTGVmdEFsaWdubWVudCkgew0KKyAgICAgIHdoaWxlIChuRmlsbC0tKSB7DQorICAgICAgICB3c0ZpZWxkLkluc2VydChuRmllbGQrKywgbV93Y0ZpbGwpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICB3aGlsZSAobkZpbGwtLSkgew0KKyAgICAgICAgd3NGaWVsZC5JbnNlcnQoMCwgbV93Y0ZpbGwpOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfQ0KIH0NCi1DRkRFX1R4dEVkdEZpZWxkX0ZpeGVkOjpDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBpbnQzMl90IG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jaykNCi0gICAgOiBDRkRFX1R4dEVkdEZpZWxkKG5JbmRleCwgcEJsb2NrKQ0KLXsNCi0gICAgbV93c0ZpZWxkID0gd3NGaWVsZDsNCi0gICAgbV9uTGVuZ3RoID0gd3NGaWVsZC5HZXRMZW5ndGgoKTsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkOjpHZXREaXNwbGF5VGV4dChDRlhfV2lkZVN0cmluZyAmd3NEaXNwbGF5KQ0KLXsNCi0gICAgaW50MzJfdCBuTGVuZ3RoCT0gbV93c0ZpZWxkLkdldExlbmd0aCgpICsgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSArIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRTsNCi0gICAgRlhfV0NIQVIqIGxwQnVmZmVyCT0gd3NEaXNwbGF5LkdldEJ1ZmZlcihuTGVuZ3RoKTsNCi0gICAgbHBCdWZmZXJbMF0JCQkJPSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0JHTjsNCi0gICAgbHBCdWZmZXJbbkxlbmd0aCAtIDFdCT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQ7DQotICAgIEZYX0RXT1JEIG5BZGRyZXNzID0gKEZYX0RXT1JEKXRoaXM7DQotICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIDEsICZuQWRkcmVzcywgc2l6ZW9mKEZYX0RXT1JEKSk7DQotICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIDMsIGNvbnN0IEZYX1dDSEFSKihtX3dzRmllbGQpLCAobkxlbmd0aCAtIDQpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgIHdzRGlzcGxheS5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RmllbGRfRml4ZWQ6Ok5vcm1hbGl6ZUNhcmV0UG9zKGludDMyX3QgbkluZGV4LCBGREVfRk9STUFUX0NBUkVUX0RJUkVDVElPTiBlRGlyZWN0aW9uICkgY29uc3QNCi17DQotICAgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCAmJiBuSW5kZXggPD0gbV9uTGVuZ3RoKTsNCi0gICAgaWYgKGVEaXJlY3Rpb24gPT0gRkRFX0ZPUk1BVF9DQVJFVF9NSURETEUpIHsNCi0gICAgICAgIHJldHVybiAobkluZGV4ID4gbV93c0ZpZWxkLkdldExlbmd0aCgpIC8gMikgPyAtMSA6IC0yOw0KK0NGREVfVHh0RWR0RmllbGRfSW50ZWdlcjo6Q0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCwNCisgICAgaW50MzJfdCBuSW5kZXgsDQorICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jaykNCisgICAgOiBtX2JTaWduKEZBTFNFKSwgQ0ZERV9UeHRFZHRGaWVsZChuSW5kZXgsIHBCbG9jaykgew0KKyAgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlciBGb3JtYXRQYXJzZXI7DQorICBGb3JtYXRQYXJzZXIuUGFyc2Uod3NGaWVsZCk7DQorICBpbnQzMl90IG5Db3VudCA9IEZvcm1hdFBhcnNlci5Db3VudEl0ZW1zKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c2tleTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgRm9ybWF0UGFyc2VyLkdldEl0ZW0oaSwgd3NrZXksIHdzVmFsKTsNCisgICAgaWYgKHdza2V5LkVxdWFsKEwiTGVuZ3RoIikpIHsNCisgICAgICBtX25MZW5ndGggPSB3c1ZhbC5HZXRJbnRlZ2VyKCk7DQorICAgIH0gZWxzZSBpZiAod3NrZXkuRXF1YWwoTCJTaWduIikpIHsNCisgICAgICBtX2JTaWduID0gd3NWYWwuR2V0SW50ZWdlcigpICE9IDA7DQorICAgIH0gZWxzZSBpZiAod3NrZXkuRXF1YWwoTCJGaWxsQ2hhciIpKSB7DQorICAgICAgbV93Y0ZpbGwgPSB3c1ZhbFswXTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWFNZU19hc3NlcnQoMCk7DQogICAgIH0NCi0gICAgcmV0dXJuIGVEaXJlY3Rpb24gPT0gRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCA/IC0yIDogLTE7DQorICAgIHdza2V5LkVtcHR5KCk7DQorICAgIHdzVmFsLkVtcHR5KCk7DQorICB9DQorICBpZiAobV9uTGVuZ3RoID09IC0xKSB7DQorICAgIG1fYlJlc2VydmVTcGFjZSA9IEZBTFNFOw0KKyAgfQ0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RmllbGRfSW50ZWdlcjo6VmFsaWRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Qgew0KKyAgaW50MzJfdCBpID0gMDsNCisgIGlmIChtX2JTaWduKSB7DQorICAgIEZYX1dDSEFSIHdjVGVtcCA9IHdzVGV4dFswXTsNCisgICAgaWYgKEZERV9UWFRFRFRfSVNTSUdOKHdjVGVtcCkpIHsNCisgICAgICBpKys7DQorICAgIH0NCisgIH0NCisgIGludDMyX3Qgbkxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgIGlmIChtX25MZW5ndGggPiAwKSB7DQorICAgIGlmIChuTGVuZ3RoIC0gaSA+IChtX25MZW5ndGggLSAobV9iU2lnbiA/IDEgOiAwKSkpIHsNCisgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw7DQorICAgIH0NCisgIH0NCisgIGZvciAoOyBpIDwgbkxlbmd0aDsgaSsrKSB7DQorICAgIEZYX1dDSEFSIHdjVGVtcCA9IHdzVGV4dFtpXTsNCisgICAgaWYgKCFGREVfVFhURURUX0lTSU5URUdFUih3Y1RlbXApKSB7DQorICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9TOw0KK30NCitDRkRFX1R4dEVkdEZpZWxkX0Zsb2F0OjpDRkRFX1R4dEVkdEZpZWxkX0Zsb2F0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEJsb2NrKiBwQmxvY2spDQorICAgIDogQ0ZERV9UeHRFZHRGaWVsZChuSW5kZXgsIHBCbG9jayksDQorICAgICAgbV9iU2lnbmVkKEZBTFNFKSwNCisgICAgICBtX25JbnRQYXJ0bGVuZ3RoKC0xKSwNCisgICAgICBtX25EZWNQYXJ0TGVuZ3RoKC0xKSB7DQorICBDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyIEZvcm1hdFBhcnNlcjsNCisgIEZvcm1hdFBhcnNlci5QYXJzZSh3c0ZpZWxkKTsNCisgIGludDMyX3QgbkNvdW50ID0gRm9ybWF0UGFyc2VyLkNvdW50SXRlbXMoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdza2V5Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWw7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBGb3JtYXRQYXJzZXIuR2V0SXRlbShpLCB3c2tleSwgd3NWYWwpOw0KKyAgICBpZiAod3NrZXkuRXF1YWwoTCJEZWNMZW5ndGgiKSkgew0KKyAgICAgIG1fbkRlY1BhcnRMZW5ndGggPSB3c1ZhbC5HZXRJbnRlZ2VyKCk7DQorICAgIH0gZWxzZSBpZiAod3NrZXkuRXF1YWwoTCJJbnRMZW5ndGgiKSkgew0KKyAgICAgIG1fbkludFBhcnRsZW5ndGggPSB3c1ZhbC5HZXRJbnRlZ2VyKCk7DQorICAgIH0gZWxzZSBpZiAod3NrZXkuRXF1YWwoTCJTaWduIikpIHsNCisgICAgICBtX2JTaWduZWQgPSB3c1ZhbC5HZXRJbnRlZ2VyKCkgIT0gMDsNCisgICAgfSBlbHNlIGlmICh3c2tleS5FcXVhbChMIkZpbGxDaGFyIikpIHsNCisgICAgICBtX3djRmlsbCA9IHdzVmFsWzBdOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgfQ0KKyAgICBpZiAobV9uSW50UGFydGxlbmd0aCA9PSAtMSB8fCBtX25EZWNQYXJ0TGVuZ3RoID09IC0xKSB7DQorICAgICAgbV9uTGVuZ3RoID0gLTE7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9uTGVuZ3RoID0gbV9uSW50UGFydGxlbmd0aCArIG1fbkRlY1BhcnRMZW5ndGggKyAxICsgKG1fYlNpZ25lZCA/IDEgOiAwKTsNCisgICAgfQ0KKyAgICBtX2JSZXNlcnZlU3BhY2UgPSBUUlVFOw0KKyAgICB3c2tleS5FbXB0eSgpOw0KKyAgICB3c1ZhbC5FbXB0eSgpOw0KKyAgfQ0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RmllbGRfRmxvYXQ6OlZhbGlkYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0IHsNCisgIGludDMyX3Qgbkxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgIGlmIChtX25MZW5ndGggIT0gLTEgJiYgKG5MZW5ndGggPiBtX25MZW5ndGgpKSB7DQorICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfRlVMTDsNCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiBscEJ1ZiA9IGNvbnN0IEZYX1dDSEFSICogKHdzVGV4dCk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaWYgKG1fYlNpZ25lZCkgew0KKyAgICBGWF9XQ0hBUiB3Y1RlbXAgPSBscEJ1ZlswXTsNCisgICAgaWYgKEZERV9UWFRFRFRfSVNTSUdOKHdjVGVtcCkpIHsNCisgICAgICBpKys7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgbkludFBhcnQgPSAwOw0KKyAgaW50MzJfdCBuUG9pbnQgPSAwOw0KKyAgZm9yICg7IGkgPCBuTGVuZ3RoOyBpKyspIHsNCisgICAgRlhfV0NIQVIgd2NUZW1wID0gbHBCdWZbaV07DQorICAgIGlmICghRkRFX1RYVEVEVF9JU0lOVEVHRVIod2NUZW1wKSkgew0KKyAgICAgIGlmICh3Y1RlbXAgIT0gTCcuJykgew0KKyAgICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFOw0KKyAgICAgIH0NCisgICAgICBuUG9pbnQgPSAxOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIG5JbnRQYXJ0Kys7DQorICB9DQorICBpZiAobV9uSW50UGFydGxlbmd0aCAhPSAtMSAmJiAobkludFBhcnQgPiBtX25JbnRQYXJ0bGVuZ3RoKSkgew0KKyAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw7DQorICB9DQorICBpZiAobV9uRGVjUGFydExlbmd0aCAhPSAtMSAmJg0KKyAgICAgIChuTGVuZ3RoIC0gbkludFBhcnQgLSBuUG9pbnQgPiBtX25EZWNQYXJ0TGVuZ3RoKSkgew0KKyAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw7DQorICB9DQorICBpKys7DQorICBmb3IgKDsgaSA8IG5MZW5ndGg7IGkrKykgew0KKyAgICBGWF9XQ0hBUiB3Y1RlbXAgPSBscEJ1ZltpXTsNCisgICAgaWYgKCFGREVfVFhURURUX0lTSU5URUdFUih3Y1RlbXApKSB7DQorICAgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9TOw0KK30NCitDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkOjpDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCwNCisgICAgaW50MzJfdCBuSW5kZXgsDQorICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jaykNCisgICAgOiBDRkRFX1R4dEVkdEZpZWxkKG5JbmRleCwgcEJsb2NrKSwgbV93Y0FsaWFzKEwnKicpIHsNCisgIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXIgRm9ybWF0UGFyc2VyOw0KKyAgRm9ybWF0UGFyc2VyLlBhcnNlKHdzRmllbGQpOw0KKyAgaW50MzJfdCBuQ291bnQgPSBGb3JtYXRQYXJzZXIuQ291bnRJdGVtcygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NrZXk7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIEZvcm1hdFBhcnNlci5HZXRJdGVtKGksIHdza2V5LCB3c1ZhbCk7DQorICAgIGlmICh3c2tleS5FcXVhbChMIkxlbmd0aCIpKSB7DQorICAgICAgbV9uTGVuZ3RoID0gd3NWYWwuR2V0SW50ZWdlcigpOw0KKyAgICB9IGVsc2UgaWYgKHdza2V5LkVxdWFsKEwiQWxpYXNDaGFyIikpIHsNCisgICAgICBtX3djQWxpYXMgPSB3c1ZhbFswXTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWFNZU19hc3NlcnQoMCk7DQorICAgIH0NCisgICAgd3NrZXkuRW1wdHkoKTsNCisgICAgd3NWYWwuRW1wdHkoKTsNCisgIH0NCisgIGlmIChtX25MZW5ndGggPT0gLTEpIHsNCisgICAgbV9iUmVzZXJ2ZVNwYWNlID0gRkFMU0U7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRGaWVsZF9QYXNzd29yZDo6R2V0Tm9ybWFsaXplZEZpZWxkVGV4dCgNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQpIGNvbnN0IHsNCisgIGludDMyX3QgbkZpbGVkTGVuZ3RoID0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBuTGVuZ3RoID0gbV9iUmVzZXJ2ZVNwYWNlID8gbV9uTGVuZ3RoIDogbkZpbGVkTGVuZ3RoOw0KKyAgRlhfV0NIQVIqIGxwQnVmID0gd3NGaWVsZC5HZXRCdWZmZXIobkxlbmd0aCk7DQorICBpbnQzMl90IG5TcGFjZUxlbmd0aCA9IG5MZW5ndGggLSBuRmlsZWRMZW5ndGg7DQorICBpbnQzMl90IG5GaXJzdFBhcnQgPSBtX2JMZWZ0QWxpZ25tZW50ID8gbkZpbGVkTGVuZ3RoIDogblNwYWNlTGVuZ3RoOw0KKyAgRlhfV0NIQVIgd0ZpcnN0Q2hhciA9IG1fYkxlZnRBbGlnbm1lbnQgPyBtX3djQWxpYXMgOiBMJyAnOw0KKyAgRlhfV0NIQVIgd1NlY29uZENoYXIgPSBtX2JMZWZ0QWxpZ25tZW50ID8gTCcgJyA6IG1fd2NBbGlhczsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKDsgaSA8IG5GaXJzdFBhcnQ7IGkrKykgew0KKyAgICBscEJ1ZltpXSA9IHdGaXJzdENoYXI7DQorICB9DQorICBmb3IgKDsgaSA8IG5MZW5ndGg7IGkrKykgew0KKyAgICBscEJ1ZltpXSA9IHdTZWNvbmRDaGFyOw0KKyAgfQ0KKyAgd3NGaWVsZC5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KK30NCitDRkRFX1R4dEVkdEZpZWxkX1N0cmluZzo6Q0ZERV9UeHRFZHRGaWVsZF9TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEJsb2NrKiBwQmxvY2spDQorICAgIDogQ0ZERV9UeHRFZHRGaWVsZChuSW5kZXgsIHBCbG9jaykgew0KKyAgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlciBGb3JtYXRQYXJzZXI7DQorICBGb3JtYXRQYXJzZXIuUGFyc2Uod3NGaWVsZCk7DQorICBpbnQzMl90IG5Db3VudCA9IEZvcm1hdFBhcnNlci5Db3VudEl0ZW1zKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c2tleTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgRm9ybWF0UGFyc2VyLkdldEl0ZW0oaSwgd3NrZXksIHdzVmFsKTsNCisgICAgaWYgKHdza2V5LkVxdWFsKEwiTGVuZ3RoIikpIHsNCisgICAgICBtX25MZW5ndGggPSB3c1ZhbC5HZXRJbnRlZ2VyKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgICB9DQorICAgIHdza2V5LkVtcHR5KCk7DQorICAgIHdzVmFsLkVtcHR5KCk7DQorICB9DQorfQ0KK0NGREVfVHh0RWR0RmllbGRfRml4ZWQ6OkNGREVfVHh0RWR0RmllbGRfRml4ZWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jaykNCisgICAgOiBDRkRFX1R4dEVkdEZpZWxkKG5JbmRleCwgcEJsb2NrKSB7DQorICBtX3dzRmllbGQgPSB3c0ZpZWxkOw0KKyAgbV9uTGVuZ3RoID0gd3NGaWVsZC5HZXRMZW5ndGgoKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkOjpHZXREaXNwbGF5VGV4dChDRlhfV2lkZVN0cmluZyYgd3NEaXNwbGF5KSB7DQorICBpbnQzMl90IG5MZW5ndGggPSBtX3dzRmllbGQuR2V0TGVuZ3RoKCkgKyBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFICsNCisgICAgICAgICAgICAgICAgICAgIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRTsNCisgIEZYX1dDSEFSKiBscEJ1ZmZlciA9IHdzRGlzcGxheS5HZXRCdWZmZXIobkxlbmd0aCk7DQorICBscEJ1ZmZlclswXSA9IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOOw0KKyAgbHBCdWZmZXJbbkxlbmd0aCAtIDFdID0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQ7DQorICBGWF9EV09SRCBuQWRkcmVzcyA9IChGWF9EV09SRCkgdGhpczsNCisgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIDEsICZuQWRkcmVzcywgc2l6ZW9mKEZYX0RXT1JEKSk7DQorICBGWFNZU19tZW1jcHkobHBCdWZmZXIgKyAzLCBjb25zdCBGWF9XQ0hBUioobV93c0ZpZWxkKSwNCisgICAgICAgICAgICAgICAobkxlbmd0aCAtIDQpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICB3c0Rpc3BsYXkuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkOjpOb3JtYWxpemVDYXJldFBvcygNCisgICAgaW50MzJfdCBuSW5kZXgsDQorICAgIEZERV9GT1JNQVRfQ0FSRVRfRElSRUNUSU9OIGVEaXJlY3Rpb24pIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCAmJiBuSW5kZXggPD0gbV9uTGVuZ3RoKTsNCisgIGlmIChlRGlyZWN0aW9uID09IEZERV9GT1JNQVRfQ0FSRVRfTUlERExFKSB7DQorICAgIHJldHVybiAobkluZGV4ID4gbV93c0ZpZWxkLkdldExlbmd0aCgpIC8gMikgPyAtMSA6IC0yOw0KKyAgfQ0KKyAgcmV0dXJuIGVEaXJlY3Rpb24gPT0gRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCA/IC0yIDogLTE7DQogfQ0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJsb2NrLmggYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRibG9jay5oCmluZGV4IDI4MDVmYmQuLmY0NWE4YWUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJsb2NrLmgKKysrIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YmxvY2suaApAQCAtMTcsMjExICsxNywyMjEgQEAKIGNsYXNzIENGREVfVHh0RWR0RmllbGRfU3RyaW5nOw0KIGNsYXNzIENGREVfVHh0RWR0RmllbGRfRml4ZWQ7DQogI2RlZmluZSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFIDMNCi0jZGVmaW5lIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRQkxDQorI2RlZmluZSBGREVfRk9STUFUX0VESVRfRklFTERfVEFJTFNJWkUgMQ0KIGVudW0gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUIHsNCi0gICAgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfTk9STUFMID0gMCwNCi0gICAgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfRlVMTAkJLA0KLSAgICBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMCQksDQotICAgIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEUsDQorICBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfU19OT1JNQUwgPSAwLA0KKyAgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfRlVMTCwNCisgIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0ZVTEwsDQorICBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9JTlZBTElEQVRFLA0KIH07DQogZW51bSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVQgew0KLSAgICBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfUwkJCT0gMAksDQotICAgIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0lOVkFMSURBVEUJLA0KLSAgICBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWQkJLA0KKyAgRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX1MgPSAwLA0KKyAgRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfSU5WQUxJREFURSwNCisgIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0JPVU5EQVJZLA0KIH07DQogZW51bSBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX1JFVCB7DQotICAgIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfUwkJCT0gMAksDQotICAgIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMCQksDQotICAgIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFCSwNCisgIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfUyA9IDAsDQorICBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfRlVMTCwNCisgIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFLA0KIH07DQogZW51bSBGREVfRk9STUFUX0NBUkVUX0RJUkVDVElPTiB7DQotICAgIEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCwNCi0gICAgRkRFX0ZPUk1BVF9DQVJFVF9NSURETEUsDQotICAgIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQNCisgIEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCwNCisgIEZERV9GT1JNQVRfQ0FSRVRfTUlERExFLA0KKyAgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRA0KIH07DQotY2xhc3MgQ0ZERV9UeHRFZHRCbG9jaw0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfVHh0RWR0QmxvY2soQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NCbG9jaywgaW50MzJfdCBuUG9zaXRpb24pOw0KLSAgICB+Q0ZERV9UeHRFZHRCbG9jaygpOw0KLSAgICB2b2lkCQlHZXREaXNwbGF5VGV4dChDRlhfV2lkZVN0cmluZyAmd3NEaXNwbGF5KTsNCi0gICAgaW50MzJfdAlHZXRMZW5ndGgoKSBjb25zdDsNCi0gICAgdm9pZAkJR2V0QmxvY2tUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0Jsb2NrKTsNCi0gICAgaW50MzJfdAlDb3VudEZpZWxkKCkgY29uc3Q7DQotICAgIHZvaWQJCUdldEZpZWxkVGV4dChpbnQzMl90IG5JbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGQpOw0KLSAgICBpbnQzMl90CUdldEZpZWxkVGV4dExlbmd0aCgpIGNvbnN0Ow0KK2NsYXNzIENGREVfVHh0RWR0QmxvY2sgew0KKyBwdWJsaWM6DQorICBDRkRFX1R4dEVkdEJsb2NrKENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NCbG9jaywNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUG9zaXRpb24pOw0KKyAgfkNGREVfVHh0RWR0QmxvY2soKTsNCisgIHZvaWQgR2V0RGlzcGxheVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzRGlzcGxheSk7DQorICBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0Ow0KKyAgdm9pZCBHZXRCbG9ja1RleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzQmxvY2spOw0KKyAgaW50MzJfdCBDb3VudEZpZWxkKCkgY29uc3Q7DQorICB2b2lkIEdldEZpZWxkVGV4dChpbnQzMl90IG5JbmRleCwgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQpOw0KKyAgaW50MzJfdCBHZXRGaWVsZFRleHRMZW5ndGgoKSBjb25zdDsNCiANCi0gICAgaW50MzJfdAlHZXRQb3MoKSBjb25zdDsNCi0gICAgdm9pZAkJR2V0UmVhbFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3Q7DQotICAgIHZvaWQJCUJhY2t1cCgpOw0KLSAgICB2b2lkCQlSZXN0b3JlKCk7DQotICAgIHZvaWQJCVNldEluZGV4KGludDMyX3QgbkluZGV4KQ0KLSAgICB7DQotICAgICAgICBtX25JbmRleCA9IG5JbmRleDsNCi0gICAgfQ0KLSAgICBpbnQzMl90CUdldEluZGV4KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fbkluZGV4Ow0KLSAgICB9DQotcHJpdmF0ZToNCi0gICAgQ0ZERV9UeHRFZHRFbmdpbmUgKiBtX3BFbmdpbmU7DQotICAgIGludDMyX3QgbV9uRGlzcGxheUxlbmd0aDsNCi0gICAgaW50MzJfdCBtX25JbmRleDsNCisgIGludDMyX3QgR2V0UG9zKCkgY29uc3Q7DQorICB2b2lkIEdldFJlYWxUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0Ow0KKyAgdm9pZCBCYWNrdXAoKTsNCisgIHZvaWQgUmVzdG9yZSgpOw0KKyAgdm9pZCBTZXRJbmRleChpbnQzMl90IG5JbmRleCkgeyBtX25JbmRleCA9IG5JbmRleDsgfQ0KKyAgaW50MzJfdCBHZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fbkluZGV4OyB9DQogDQotICAgIGludDMyX3QJbV9uUG9zaXRpb247DQotICAgIENGWF9BcnJheVRlbXBsYXRlPENGREVfVHh0RWR0RmllbGQqPiBtX0ZpZWxkQXJyOw0KLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDRkRFX1R4dEVkdEZpZWxkKj4gbV9FZGl0RmllbGRBcnI7DQorIHByaXZhdGU6DQorICBDRkRFX1R4dEVkdEVuZ2luZSogbV9wRW5naW5lOw0KKyAgaW50MzJfdCBtX25EaXNwbGF5TGVuZ3RoOw0KKyAgaW50MzJfdCBtX25JbmRleDsNCisNCisgIGludDMyX3QgbV9uUG9zaXRpb247DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxDRkRFX1R4dEVkdEZpZWxkKj4gbV9GaWVsZEFycjsNCisgIENGWF9BcnJheVRlbXBsYXRlPENGREVfVHh0RWR0RmllbGQqPiBtX0VkaXRGaWVsZEFycjsNCiB9Ow0KLWNsYXNzIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXINCi17DQotcHVibGljOg0KLSAgICBDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyKCk7DQotICAgIH5DRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyKCk7DQotICAgIEZYX0JPT0wJCVBhcnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0Zvcm1hdCk7DQotICAgIGludDMyX3QJQ291bnRJdGVtcygpIGNvbnN0Ow0KLSAgICB2b2lkCQlHZXRJdGVtKGludDMyX3QgbkluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NLZXksIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKSBjb25zdDsNCi1wcml2YXRlOg0KLSAgICB0eXBlZGVmIHN0cnVjdCB7DQotICAgICAgICBpbnQzMl90IG5LZXlTdGFydDsNCi0gICAgICAgIGludDMyX3QgbktleUNvdW50Ow0KLSAgICAgICAgaW50MzJfdCBuVmFsU3RhcnQ7DQotICAgICAgICBpbnQzMl90IG5WYWxDb3VudDsNCi0gICAgfSBGREVfVFhURURURk9STUFUSVRFTSwgKiBGREVfTFBUWFRFRFRGT1JNQVRJVEVNOw0KK2NsYXNzIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXIgew0KKyBwdWJsaWM6DQorICBDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyKCk7DQorICB+Q0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlcigpOw0KKyAgRlhfQk9PTCBQYXJzZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQpOw0KKyAgaW50MzJfdCBDb3VudEl0ZW1zKCkgY29uc3Q7DQorICB2b2lkIEdldEl0ZW0oaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzS2V5LA0KKyAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSBjb25zdDsNCiANCi0gICAgQ0ZYX1dpZGVTdHJpbmcgbV93c0Zvcm1hdDsNCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8RkRFX0xQVFhURURURk9STUFUSVRFTT4gbV9JdGVtQXJyOw0KLX07DQotY2xhc3MgQ0ZERV9UeHRFZHRGaWVsZA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBDRkRFX1R4dEVkdEZpZWxkICogQ3JlYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBpbnQzMl90IG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jayk7DQotICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJSW5zZXJ0KAlpbnQzMl90IG5JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzSW5zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmbkNhcmV0LCBGWF9CT09MICZiQmVmb3JlKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CURlbGV0ZSgJaW50MzJfdCBuSW5kZXgsIGludDMyX3QgbkNvdW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgJndzRGVsLCBpbnQzMl90ICZuQ2FyZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MICZiQmVmb3JlKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CVJlcGxhY2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QgbkNvdW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzSW5zLCBDRlhfV2lkZVN0cmluZyAmd3NEZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZuQ2FyZXQsIEZYX0JPT0wgJmJCZWZvcmUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUdldERpc3BsYXlUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0Rpc3BsYXkpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0RGlzcGxheUxlbmd0aCgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUdldEZpZWxkVGV4dChDRlhfV2lkZVN0cmluZyAmd3NGaWVsZCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRGaWVsZFRleHRMZW5ndGgoKSBjb25zdDsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldFJlYWxJbmRleChpbnQzMl90IG5JbmRleCkgY29uc3Q7DQorIHByaXZhdGU6DQorICB0eXBlZGVmIHN0cnVjdCB7DQorICAgIGludDMyX3QgbktleVN0YXJ0Ow0KKyAgICBpbnQzMl90IG5LZXlDb3VudDsNCisgICAgaW50MzJfdCBuVmFsU3RhcnQ7DQorICAgIGludDMyX3QgblZhbENvdW50Ow0KKyAgfSBGREVfVFhURURURk9STUFUSVRFTSwgKkZERV9MUFRYVEVEVEZPUk1BVElURU07DQogDQorICBDRlhfV2lkZVN0cmluZyBtX3dzRm9ybWF0Ow0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8RkRFX0xQVFhURURURk9STUFUSVRFTT4gbV9JdGVtQXJyOw0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHRGaWVsZCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRkRFX1R4dEVkdEZpZWxkKiBDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEJsb2NrKiBwQmxvY2spOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBJbnNlcnQoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0lucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKTsNCisgIHZpcnR1YWwgaW50MzJfdCBEZWxldGUoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NEZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkJlZm9yZSk7DQorICB2aXJ0dWFsIGludDMyX3QgUmVwbGFjZShpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSW5zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkJlZm9yZSk7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGlzcGxheVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzRGlzcGxheSk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGlzcGxheUxlbmd0aCgpOw0KKyAgdmlydHVhbCB2b2lkIEdldEZpZWxkVGV4dChDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RmllbGRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0UmVhbEluZGV4KGludDMyX3QgbkluZGV4KSBjb25zdDsNCiANCi0gICAgdmlydHVhbCBpbnQzMl90CU5vcm1hbGl6ZUNhcmV0UG9zKAlpbnQzMl90IG5JbmRleCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9GT1JNQVRfQ0FSRVRfRElSRUNUSU9OIGVEaXJlY3Rpb24gPSBGREVfRk9STUFUX0NBUkVUX01JRERMRSkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgTm9ybWFsaXplQ2FyZXRQb3MoDQorICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgRkRFX0ZPUk1BVF9DQVJFVF9ESVJFQ1RJT04gZURpcmVjdGlvbiA9IEZERV9GT1JNQVRfQ0FSRVRfTUlERExFKSBjb25zdDsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRFZGl0YWJsZVJhbmdlKGludDMyX3QgJm5CZ24sIGludDMyX3QgJm5FbmQpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJCUJhY2t1cCgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVJlc3RvcmUoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc0ZpeCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2b2lkCQkJCVNldEluZGV4KGludDMyX3QgbkluZGV4KQ0KLSAgICB7DQotICAgICAgICBtX25JbmRleCA9IG5JbmRleDsNCi0gICAgfQ0KLSAgICBpbnQzMl90CQkJR2V0SW5kZXgoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9uSW5kZXg7DQotICAgIH0NCi0gICAgaW50MzJfdAkJCUdldEJsb2NrSW5kZXgoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wQmxvY2stPkdldEluZGV4KCk7DQotICAgIH0NCi1wcm90ZWN0ZWQ6DQotICAgIENGREVfVHh0RWR0RmllbGQoaW50MzJfdCBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2spOw0KLSAgICB2aXJ0dWFsCQkJCX5DRkRFX1R4dEVkdEZpZWxkKCkge30NCi0gICAgdmlydHVhbCBpbnQzMl90CVZhbGlkYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgd3NUZXh0KSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCQlHZXROb3JtYWxpemVkRmllbGRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkKSBjb25zdDsNCi0gICAgaW50MzJfdAkJbV9uTGVuZ3RoOw0KLSAgICBDRlhfV2lkZVN0cmluZwltX3dzRmllbGQ7DQotICAgIENGWF9XaWRlU3RyaW5nCW1fd3NCYWNrdXA7DQotICAgIEZYX1dDSEFSCQltX3djRmlsbDsNCi0gICAgRlhfQk9PTAkJCQltX2JSZXNlcnZlU3BhY2U7DQotICAgIEZYX0JPT0wJCQkJbV9iTGVmdEFsaWdubWVudDsNCi0gICAgaW50MzJfdAkJCW1fbkluZGV4Ow0KLSAgICBDRkRFX1R4dEVkdEJsb2NrICoJbV9wQmxvY2s7DQotfTsNCi1jbGFzcyBDRkRFX1R4dEVkdEZpZWxkX0ludGVnZXIgOiBwdWJsaWMgQ0ZERV9UeHRFZHRGaWVsZA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfVHh0RWR0RmllbGRfSW50ZWdlcihjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGaWVsZCwgaW50MzJfdCBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2spOw0KLXByb3RlY3RlZDoNCi0gICAgdmlydHVhbCB+Q0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyKCkge30NCi0gICAgdmlydHVhbCBpbnQzMl90CVZhbGlkYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0Ow0KLXByaXZhdGU6DQotICAgIEZYX0JPT0wJbV9iU2lnbjsNCi19Ow0KLWNsYXNzIENGREVfVHh0RWR0RmllbGRfRmxvYXQgOiBwdWJsaWMgQ0ZERV9UeHRFZHRGaWVsZA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfVHh0RWR0RmllbGRfRmxvYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGQsIGludDMyX3QgbkluZGV4LCBDRkRFX1R4dEVkdEJsb2NrICogcEJsb2NrKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZpcnR1YWwgfkNGREVfVHh0RWR0RmllbGRfRmxvYXQoKSB7fQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJVmFsaWRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB3c1RleHQpIGNvbnN0Ow0KLXByaXZhdGU6DQotICAgIEZYX0JPT0wJCW1fYlNpZ25lZDsNCi0gICAgaW50MzJfdAltX25JbnRQYXJ0bGVuZ3RoOw0KLSAgICBpbnQzMl90CW1fbkRlY1BhcnRMZW5ndGg7DQotfTsNCi1jbGFzcyBDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkIDogcHVibGljIENGREVfVHh0RWR0RmllbGQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBpbnQzMl90IG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jayk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0RWRpdGFibGVSYW5nZShpbnQzMl90JiBuQmduLCBpbnQzMl90JiBuRW5kKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBCYWNrdXAoKTsNCisgIHZpcnR1YWwgdm9pZCBSZXN0b3JlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNGaXgoKSBjb25zdCB7IHJldHVybiBGQUxTRTsgfQ0KKyAgdm9pZCBTZXRJbmRleChpbnQzMl90IG5JbmRleCkgeyBtX25JbmRleCA9IG5JbmRleDsgfQ0KKyAgaW50MzJfdCBHZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fbkluZGV4OyB9DQorICBpbnQzMl90IEdldEJsb2NrSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3BCbG9jay0+R2V0SW5kZXgoKTsgfQ0KIA0KLXByb3RlY3RlZDoNCi0gICAgdmlydHVhbCB+Q0ZERV9UeHRFZHRGaWVsZF9QYXNzd29yZCgpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJR2V0Tm9ybWFsaXplZEZpZWxkVGV4dChDRlhfV2lkZVN0cmluZyAmd3NGaWVsZCkgY29uc3Q7DQotcHJpdmF0ZToNCi0gICAgRlhfV0NIQVIJbV93Y0FsaWFzOw0KKyBwcm90ZWN0ZWQ6DQorICBDRkRFX1R4dEVkdEZpZWxkKGludDMyX3QgbkluZGV4LCBDRkRFX1R4dEVkdEJsb2NrKiBwQmxvY2spOw0KKyAgdmlydHVhbCB+Q0ZERV9UeHRFZHRGaWVsZCgpIHt9DQorICB2aXJ0dWFsIGludDMyX3QgVmFsaWRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0Tm9ybWFsaXplZEZpZWxkVGV4dChDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCkgY29uc3Q7DQorICBpbnQzMl90IG1fbkxlbmd0aDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NGaWVsZDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NCYWNrdXA7DQorICBGWF9XQ0hBUiBtX3djRmlsbDsNCisgIEZYX0JPT0wgbV9iUmVzZXJ2ZVNwYWNlOw0KKyAgRlhfQk9PTCBtX2JMZWZ0QWxpZ25tZW50Ow0KKyAgaW50MzJfdCBtX25JbmRleDsNCisgIENGREVfVHh0RWR0QmxvY2sqIG1fcEJsb2NrOw0KIH07DQotY2xhc3MgQ0ZERV9UeHRFZHRGaWVsZF9TdHJpbmcgOiBwdWJsaWMgQ0ZERV9UeHRFZHRGaWVsZA0KLXsNCi1wdWJsaWM6DQotICAgIENGREVfVHh0RWR0RmllbGRfU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBpbnQzMl90IG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jayk7DQotcHJvdGVjdGVkOg0KLSAgICB2aXJ0dWFsIH5DRkRFX1R4dEVkdEZpZWxkX1N0cmluZygpIHt9DQotfTsNCi1jbGFzcyBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkIDogcHVibGljIENGREVfVHh0RWR0RmllbGQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZpZWxkLCBpbnQzMl90IG5JbmRleCwgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jayk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlJbnNlcnQoCWludDMyX3QgbkluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NJbnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZuQ2FyZXQsIEZYX0JPT0wgJmJCZWZvcmUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJRGVsZXRlKAlpbnQzMl90IG5JbmRleCwgaW50MzJfdCBuQ291bnQsIENGWF9XaWRlU3RyaW5nICZ3c0RlbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJm5DYXJldCwgRlhfQk9PTCAmYkJlZm9yZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgaW50MzJfdAlSZXBsYWNlKGludDMyX3QgbkluZGV4LCBpbnQzMl90IG5Db3VudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzSW5zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgJndzRGVsLCBpbnQzMl90ICZuQ2FyZXQsIEZYX0JPT0wgJmJCZWZvcmUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCUdldERpc3BsYXlUZXh0KENGWF9XaWRlU3RyaW5nICZ3c0Rpc3BsYXkpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJTm9ybWFsaXplQ2FyZXRQb3MoCWludDMyX3QgbkluZGV4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0ZPUk1BVF9DQVJFVF9ESVJFQ1RJT04gZURpcmVjdGlvbiApIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEVkaXRhYmxlUmFuZ2UoaW50MzJfdCAmbkJnbiwgaW50MzJfdCAmbkVuZCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJQmFja3VwKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQlSZXN0b3JlKCkge30NCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX0ludGVnZXIgOiBwdWJsaWMgQ0ZERV9UeHRFZHRGaWVsZCB7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0RmllbGRfSW50ZWdlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEJsb2NrKiBwQmxvY2spOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzRml4KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi1wcm90ZWN0ZWQ6DQotICAgIHZpcnR1YWwgfkNGREVfVHh0RWR0RmllbGRfRml4ZWQoKSB7fQ0KKyBwcm90ZWN0ZWQ6DQorICB2aXJ0dWFsIH5DRkRFX1R4dEVkdEZpZWxkX0ludGVnZXIoKSB7fQ0KKyAgdmlydHVhbCBpbnQzMl90IFZhbGlkYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0Ow0KKw0KKyBwcml2YXRlOg0KKyAgRlhfQk9PTCBtX2JTaWduOw0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHRGaWVsZF9GbG9hdCA6IHB1YmxpYyBDRkRFX1R4dEVkdEZpZWxkIHsNCisgcHVibGljOg0KKyAgQ0ZERV9UeHRFZHRGaWVsZF9GbG9hdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jayk7DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgfkNGREVfVHh0RWR0RmllbGRfRmxvYXQoKSB7fQ0KKyAgdmlydHVhbCBpbnQzMl90IFZhbGlkYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0Ow0KKw0KKyBwcml2YXRlOg0KKyAgRlhfQk9PTCBtX2JTaWduZWQ7DQorICBpbnQzMl90IG1fbkludFBhcnRsZW5ndGg7DQorICBpbnQzMl90IG1fbkRlY1BhcnRMZW5ndGg7DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkIDogcHVibGljIENGREVfVHh0RWR0RmllbGQgew0KKyBwdWJsaWM6DQorICBDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRCbG9jayogcEJsb2NrKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdmlydHVhbCB+Q0ZERV9UeHRFZHRGaWVsZF9QYXNzd29yZCgpIHt9DQorICB2aXJ0dWFsIHZvaWQgR2V0Tm9ybWFsaXplZEZpZWxkVGV4dChDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCkgY29uc3Q7DQorDQorIHByaXZhdGU6DQorICBGWF9XQ0hBUiBtX3djQWxpYXM7DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX1N0cmluZyA6IHB1YmxpYyBDRkRFX1R4dEVkdEZpZWxkIHsNCisgcHVibGljOg0KKyAgQ0ZERV9UeHRFZHRGaWVsZF9TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jayk7DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgfkNGREVfVHh0RWR0RmllbGRfU3RyaW5nKCkge30NCit9Ow0KK2NsYXNzIENGREVfVHh0RWR0RmllbGRfRml4ZWQgOiBwdWJsaWMgQ0ZERV9UeHRFZHRGaWVsZCB7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0RmllbGRfRml4ZWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEJsb2NrKiBwQmxvY2spOw0KKyAgdmlydHVhbCBpbnQzMl90IEluc2VydChpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSW5zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJCZWZvcmUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IERlbGV0ZShpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBSZXBsYWNlKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NJbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NEZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXREaXNwbGF5VGV4dChDRlhfV2lkZVN0cmluZyYgd3NEaXNwbGF5KTsNCisgIHZpcnR1YWwgaW50MzJfdCBOb3JtYWxpemVDYXJldFBvcygNCisgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICBGREVfRk9STUFUX0NBUkVUX0RJUkVDVElPTiBlRGlyZWN0aW9uKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRFZGl0YWJsZVJhbmdlKGludDMyX3QmIG5CZ24sIGludDMyX3QmIG5FbmQpIGNvbnN0IHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEJhY2t1cCgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVzdG9yZSgpIHt9DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgSXNGaXgoKSBjb25zdCB7IHJldHVybiBUUlVFOyB9DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgfkNGREVfVHh0RWR0RmllbGRfRml4ZWQoKSB7fQ0KIH07DQogI2VuZGlmDQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YnVmLmNwcCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJ1Zi5jcHAKaW5kZXggYjFkMzkyNy4uNTU2YjIzYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YnVmLmNwcAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRidWYuY3BwCkBAIC04LDQzOSArOCw0MzIgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2lmZGVfdHh0ZWR0YnVmLmgiDQogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvaWZkZV90eHRlZHRlbmdpbmUuaCINCiAjaW5jbHVkZSAiZmRlX3R4dGVkdGJ1Zi5oIg0KLSNkZWZpbmUgRkRFX0RFRkNIVU5LQ09VTlQJMg0KLSNkZWZpbmUgRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR04JCTB4RkZGOQ0KLSNkZWZpbmUgRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQJCTB4RkZGQg0KLSNkZWZpbmUgRkRFX1RYVEVEVF9aRVJPV0lEVEhTUEFDRQkJMHgyMDBCDQorI2RlZmluZSBGREVfREVGQ0hVTktDT1VOVCAyDQorI2RlZmluZSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0JHTiAweEZGRjkNCisjZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5EIDB4RkZGQg0KKyNkZWZpbmUgRkRFX1RYVEVEVF9aRVJPV0lEVEhTUEFDRSAweDIwMEINCiAjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotQ0ZERV9UeHRFZHRCdWZJdGVyOjpDRkRFX1R4dEVkdEJ1Zkl0ZXIoQ0ZERV9UeHRFZHRCdWYgKiBwQnVmLCBGWF9CT09MIGJGb3JEaXNwbGF5ICkNCitDRkRFX1R4dEVkdEJ1Zkl0ZXI6OkNGREVfVHh0RWR0QnVmSXRlcihDRkRFX1R4dEVkdEJ1ZiogcEJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb3JEaXNwbGF5KQ0KICNlbHNlDQotQ0ZERV9UeHRFZHRCdWZJdGVyOjpDRkRFX1R4dEVkdEJ1Zkl0ZXIoQ0ZERV9UeHRFZHRCdWYgKiBwQnVmLCBGWF9XQ0hBUiB3Y0FsaWFzICkNCitDRkRFX1R4dEVkdEJ1Zkl0ZXI6OkNGREVfVHh0RWR0QnVmSXRlcihDRkRFX1R4dEVkdEJ1ZiogcEJ1ZiwgRlhfV0NIQVIgd2NBbGlhcykNCiAjZW5kaWYNCi0gICAgOiBtX25DdXJDaHVuaygwKQ0KLSAgICAsIG1fbkN1ckluZGV4KDApDQotICAgICwgbV9uSW5kZXgoMCkNCi0gICAgLCBtX3BCdWYocEJ1ZikNCisgICAgOiBtX25DdXJDaHVuaygwKSwNCisgICAgICBtX25DdXJJbmRleCgwKSwNCisgICAgICBtX25JbmRleCgwKSwNCisgICAgICBtX3BCdWYocEJ1ZikNCiAjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotICAgICwgbV9iRm9yRGlzcGxheShiRm9yRGlzcGxheSkNCi0gICAgLCBtX25BbGlhc0NvdW50KDApDQorICAgICAgLA0KKyAgICAgIG1fYkZvckRpc3BsYXkoYkZvckRpc3BsYXkpLA0KKyAgICAgIG1fbkFsaWFzQ291bnQoMCkNCiAjZW5kaWYNCi0gICAgLCBtX2JJbkZpZWxkKEZBTFNFKQ0KLSAgICAsIG1fQWxpYXMod2NBbGlhcykNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BCdWYpOw0KKyAgICAgICwNCisgICAgICBtX2JJbkZpZWxkKEZBTFNFKSwNCisgICAgICBtX0FsaWFzKHdjQWxpYXMpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BCdWYpOw0KIH0NCi1DRkRFX1R4dEVkdEJ1Zkl0ZXI6On5DRkRFX1R4dEVkdEJ1Zkl0ZXIoKQ0KLXsNCitDRkRFX1R4dEVkdEJ1Zkl0ZXI6On5DRkRFX1R4dEVkdEJ1Zkl0ZXIoKSB7fQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWZJdGVyOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQogfQ0KLXZvaWQgQ0ZERV9UeHRFZHRCdWZJdGVyOjpSZWxlYXNlKCkNCi17DQotICAgIGRlbGV0ZSB0aGlzOw0KLX0NCi1GWF9CT09MIENGREVfVHh0RWR0QnVmSXRlcjo6TmV4dChGWF9CT09MIGJQcmV2ICkNCi17DQotICAgIGlmIChiUHJldikgew0KLSAgICAgICAgaWYgKG1fbkluZGV4ID09IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBGWFNZU19hc3NlcnQobV9uQ3VyQ2h1bmsgPCBtX3BCdWYtPm1fQ2h1bmtzLkdldFNpemUoKSk7DQotICAgICAgICBDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IE5VTEw7DQotICAgICAgICBpZiAobV9uQ3VySW5kZXggPiAwKSB7DQotICAgICAgICAgICAgbV9uQ3VySW5kZXggLS07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdoaWxlIChtX25DdXJDaHVuayA+IDApIHsNCi0gICAgICAgICAgICAgICAgLS1tX25DdXJDaHVuazsNCi0gICAgICAgICAgICAgICAgbHBDaHVuayA9IChDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIpbV9wQnVmLT5tX0NodW5rc1ttX25DdXJDaHVua107DQotICAgICAgICAgICAgICAgIGlmIChscENodW5rLT5uVXNlZCA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fbkN1ckluZGV4ID0gbHBDaHVuay0+blVzZWQgLSAxOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBGWFNZU19hc3NlcnQobV9uQ3VyQ2h1bmsgPj0gMCk7DQotICAgICAgICBtX25JbmRleCAtLTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRCdWZJdGVyOjpOZXh0KEZYX0JPT0wgYlByZXYpIHsNCisgIGlmIChiUHJldikgew0KKyAgICBpZiAobV9uSW5kZXggPT0gMCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQobV9uQ3VyQ2h1bmsgPCBtX3BCdWYtPm1fQ2h1bmtzLkdldFNpemUoKSk7DQorICAgIENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiBscENodW5rID0gTlVMTDsNCisgICAgaWYgKG1fbkN1ckluZGV4ID4gMCkgew0KKyAgICAgIG1fbkN1ckluZGV4LS07DQogICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAobV9uSW5kZXggPj0gKG1fcEJ1Zi0+bV9uVG90YWwgLSAxKSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB3aGlsZSAobV9uQ3VyQ2h1bmsgPiAwKSB7DQorICAgICAgICAtLW1fbkN1ckNodW5rOw0KKyAgICAgICAgbHBDaHVuayA9DQorICAgICAgICAgICAgKENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiltX3BCdWYtPm1fQ2h1bmtzW21fbkN1ckNodW5rXTsNCisgICAgICAgIGlmIChscENodW5rLT5uVXNlZCA+IDApIHsNCisgICAgICAgICAgbV9uQ3VySW5kZXggPSBscENodW5rLT5uVXNlZCAtIDE7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fbkN1ckNodW5rIDwgbV9wQnVmLT5tX0NodW5rcy5HZXRTaXplKCkpOw0KLSAgICAgICAgQ0ZERV9UeHRFZHRCdWY6OkZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmsgPSBcDQotICAgICAgICAgICAgICAgIChDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIpbV9wQnVmLT5tX0NodW5rc1ttX25DdXJDaHVua107DQotICAgICAgICBpZiAobHBDaHVuay0+blVzZWQgIT0gKG1fbkN1ckluZGV4ICsgMSkpIHsNCi0gICAgICAgICAgICBtX25DdXJJbmRleCArKzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaW50MzJfdCBuRW5kID0gbV9wQnVmLT5tX0NodW5rcy5HZXRTaXplKCkgLSAxOw0KLSAgICAgICAgICAgIHdoaWxlIChtX25DdXJDaHVuayA8IG5FbmQpIHsNCi0gICAgICAgICAgICAgICAgbV9uQ3VyQ2h1bmsgKys7DQotICAgICAgICAgICAgICAgIENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiBscENodW5rVGVtcCA9IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAoQ0ZERV9UeHRFZHRCdWY6OkZERV9MUENIVU5LSEVBREVSKW1fcEJ1Zi0+bV9DaHVua3NbbV9uQ3VyQ2h1bmtdOw0KLSAgICAgICAgICAgICAgICBpZiAobHBDaHVua1RlbXAtPm5Vc2VkID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9uQ3VySW5kZXggPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBtX25JbmRleCArKzsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCiAgICAgfQ0KLX0NCi12b2lkIENGREVfVHh0RWR0QnVmSXRlcjo6U2V0QXQoaW50MzJfdCBuSW5kZXgpDQotew0KLSAgICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9wQnVmLT5tX25Ub3RhbCk7DQotICAgIENGREVfVHh0RWR0QnVmOjpGREVfQ0hVTktQTEFDRSBjcDsNCi0gICAgbV9wQnVmLT5JbmRleDJDUChuSW5kZXgsIGNwKTsNCi0gICAgbV9uSW5kZXgJPSBuSW5kZXg7DQotICAgIG1fbkN1ckNodW5rID0gY3AubkNodW5rSW5kZXg7DQotICAgIG1fbkN1ckluZGV4CT0gY3AubkNoYXJJbmRleDsNCi19DQotaW50MzJfdCBDRkRFX1R4dEVkdEJ1Zkl0ZXI6OkdldEF0KCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX25JbmRleDsNCi19DQotRlhfV0NIQVIgQ0ZERV9UeHRFZHRCdWZJdGVyOjpHZXRDaGFyKCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX25JbmRleCA+PSAwICYmIG1fbkluZGV4IDwgbV9wQnVmLT5tX25Ub3RhbCk7DQotI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KLSAgICBpZiAobV9iRm9yRGlzcGxheSkgew0KLSAgICAgICAgaWYgKG1fYkluRmllbGQpIHsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQobV9uQWxpYXNDb3VudCA+PSAwICYmIG1fbkFsaWFzQ291bnQgPD0gMik7DQotICAgICAgICAgICAgaWYgKG1fbkFsaWFzQ291bnQgPiAwKSB7DQotICAgICAgICAgICAgICAgIG1fbkFsaWFzQ291bnQgLS07DQotICAgICAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX1pFUk9XSURUSFNQQUNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWF9XQ0hBUiB3YyA9ICgoQ0ZERV9UeHRFZHRCdWY6OkZERV9MUENIVU5LSEVBREVSKW1fcEJ1Zi0+bV9DaHVua3NbbV9uQ3VyQ2h1bmtdKS0+d0NoYXJzW21fbkN1ckluZGV4XTsNCi0gICAgICAgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQpIHsNCi0gICAgICAgICAgICAgICAgbV9uQWxpYXNDb3VudAk9IDA7DQotICAgICAgICAgICAgICAgIG1fYkluRmllbGQJCT0gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiB3YzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhfV0NIQVIgd2MgPSAoKENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiltX3BCdWYtPm1fQ2h1bmtzW21fbkN1ckNodW5rXSktPndDaGFyc1ttX25DdXJJbmRleF07DQotICAgICAgICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOKSB7DQotICAgICAgICAgICAgICAgIG1fbkFsaWFzQ291bnQJPSAyOw0KLSAgICAgICAgICAgICAgICBtX2JJbkZpZWxkCQk9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiB3YzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSNlbmRpZg0KLSAgICBpZiAobV9BbGlhcyA9PSAwIHx8IG1fbkluZGV4ID09IChtX3BCdWYtPm1fblRvdGFsIC0gMSkpIHsNCi0gICAgICAgIHJldHVybiAoKENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiltX3BCdWYtPm1fQ2h1bmtzW21fbkN1ckNodW5rXSktPndDaGFyc1ttX25DdXJJbmRleF07DQotICAgIH0NCi0gICAgcmV0dXJuIG1fQWxpYXM7DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRCdWZJdGVyOjpJc0VPRihGWF9CT09MIGJUYWlsICkgY29uc3QNCi17DQotICAgIHJldHVybiBiVGFpbCA/IG1fbkluZGV4ID09IChtX3BCdWYtPkdldFRleHRMZW5ndGgoKSAtIDIpIDogbV9uSW5kZXggPT0gMDsNCi19DQotSUZYX0NoYXJJdGVyICogQ0ZERV9UeHRFZHRCdWZJdGVyOjpDbG9uZSgpDQotew0KLSAgICBDRkRFX1R4dEVkdEJ1Zkl0ZXIgKiBwSXRlciA9IEZYX05FVyBDRkRFX1R4dEVkdEJ1Zkl0ZXIobV9wQnVmKTsNCi0gICAgcEl0ZXItPm1fbkN1ckNodW5rCT0gbV9uQ3VyQ2h1bms7DQotICAgIHBJdGVyLT5tX25DdXJJbmRleAk9IG1fbkN1ckluZGV4Ow0KLSAgICBwSXRlci0+bV9uSW5kZXgJCT0gbV9uSW5kZXg7DQotICAgIHBJdGVyLT5tX0FsaWFzCQk9IG1fQWxpYXM7DQotICAgIHJldHVybiBwSXRlcjsNCi19DQotQ0ZERV9UeHRFZHRCdWY6OkNGREVfVHh0RWR0QnVmKGludDMyX3QgbkRlZkNodW5rU2l6ZSApDQotICAgIDogbV9uQ2h1bmtTaXplKG5EZWZDaHVua1NpemUpDQotICAgICwgbV9uVG90YWwoMCkNCi0gICAgLCBtX2JDaGFuZ2VkKEZBTFNFKQ0KLSAgICAsIG1fcEFsbG9jYXRvcihOVUxMKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fbkNodW5rU2l6ZSk7DQotICAgIFJlc2V0Q2h1bmtCdWZmZXIoRkRFX0RFRkNIVU5LQ09VTlQsIG1fbkNodW5rU2l6ZSk7DQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRCdWY6OlJlbGVhc2UoKQ0KLXsNCi0gICAgZGVsZXRlIHRoaXM7DQotfQ0KLUNGREVfVHh0RWR0QnVmOjp+Q0ZERV9UeHRFZHRCdWYoKQ0KLXsNCi0gICAgQ2xlYXIoVFJVRSk7DQotICAgIG1fcEFsbG9jYXRvci0+UmVsZWFzZSgpOw0KLSAgICBtX0NodW5rcy5SZW1vdmVBbGwoKTsNCi19DQotRlhfQk9PTCBDRkRFX1R4dEVkdEJ1Zjo6U2V0Q2h1bmtTaXplKGludDMyX3QgbkNodW5rU2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChuQ2h1bmtTaXplKTsNCi0gICAgUmVzZXRDaHVua0J1ZmZlcihGREVfREVGQ0hVTktDT1VOVCwgbkNodW5rU2l6ZSk7DQorICAgIEZYU1lTX2Fzc2VydChtX25DdXJDaHVuayA+PSAwKTsNCisgICAgbV9uSW5kZXgtLTsNCiAgICAgcmV0dXJuIFRSVUU7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRCdWY6OkdldENodW5rU2l6ZSgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9uQ2h1bmtTaXplOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0QnVmOjpHZXRUZXh0TGVuZ3RoKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX25Ub3RhbDsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEJ1Zjo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KCF3c1RleHQuSXNFbXB0eSgpKTsNCi0gICAgQ2xlYXIoRkFMU0UpOw0KLSAgICBpbnQzMl90IG5UZXh0TGVuZ3RoCT0gd3NUZXh0LkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IG5OZWVkQ291bnQJCT0gKChuVGV4dExlbmd0aCAtIDEpIC8gbV9uQ2h1bmtTaXplICsgMSkgLSBtX0NodW5rcy5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGZvciAoaSA9IDA7IGkgPCBuTmVlZENvdW50OyBpICsrKSB7DQotICAgICAgICBGREVfTFBDSFVOS0hFQURFUiBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fcEFsbG9jYXRvci0+QWxsb2Moc2l6ZW9mKEZERV9DSFVOS0hFQURFUikgKyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fbkNodW5rU2l6ZSAtIDEpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgICAgICBscENodW5rLT5uVXNlZCA9IDA7DQotICAgICAgICBtX0NodW5rcy5BZGQobHBDaHVuayk7DQorICB9IGVsc2Ugew0KKyAgICBpZiAobV9uSW5kZXggPj0gKG1fcEJ1Zi0+bV9uVG90YWwgLSAxKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBpbnQzMl90CW5Ub3RhbENvdW50CQk9IG1fQ2h1bmtzLkdldFNpemUoKTsNCi0gICAgY29uc3QgRlhfV0NIQVIqCWxwU3JjQnVmID0gd3NUZXh0LmNfc3RyKCk7DQotICAgIGludDMyX3QJbkxlYXZlCQkJPSBuVGV4dExlbmd0aDsNCi0gICAgaW50MzJfdAluQ29weWVkTGVuZ3RoCT0gbV9uQ2h1bmtTaXplOw0KLSAgICBmb3IgKGkgPSAwOyBpIDwgblRvdGFsQ291bnQgJiYgbkxlYXZlID4gMDsgaSArKykgew0KLSAgICAgICAgaWYgKG5MZWF2ZSA8IG5Db3B5ZWRMZW5ndGgpIHsNCi0gICAgICAgICAgICBuQ29weWVkTGVuZ3RoID0gbkxlYXZlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tpXTsNCi0gICAgICAgIEZYU1lTX21lbWNweShscENodW5rLT53Q2hhcnMsIGxwU3JjQnVmLCBuQ29weWVkTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgICAgICBuTGVhdmUJCQktPSBuQ29weWVkTGVuZ3RoOw0KLSAgICAgICAgbHBTcmNCdWYJCSs9IG5Db3B5ZWRMZW5ndGg7DQotICAgICAgICBscENodW5rLT5uVXNlZAk9IG5Db3B5ZWRMZW5ndGg7DQotICAgIH0NCi0gICAgbV9uVG90YWwJPSBuVGV4dExlbmd0aDsNCi0gICAgbV9iQ2hhbmdlZAk9IFRSVUU7DQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRCdWY6OkdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3QNCi17DQotICAgIEdldFJhbmdlKHdzVGV4dCwgMCwgbV9uVG90YWwpOw0KLX0NCi1GWF9XQ0hBUiBDRkRFX1R4dEVkdEJ1Zjo6R2V0Q2hhckJ5SW5kZXgoaW50MzJfdCBuSW5kZXgpIGNvbnN0DQotew0KLSAgICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgR2V0VGV4dExlbmd0aCgpKTsNCi0gICAgRkRFX0xQQ0hVTktIRUFERVIJcENodW5rSGVhZGVyCT0gTlVMTDsNCi0gICAgaW50MzJfdAkJCW5Ub3RhbAkJCT0gMDsNCi0gICAgaW50MzJfdAkJCW5Db3VudAkJCT0gbV9DaHVua3MuR2V0U2l6ZSgpOw0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQotICAgICAgICBwQ2h1bmtIZWFkZXIgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaV07DQotICAgICAgICBuVG90YWwgKz0gcENodW5rSGVhZGVyLT5uVXNlZDsNCi0gICAgICAgIGlmIChuVG90YWwgPiBuSW5kZXgpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQocENodW5rSGVhZGVyKTsNCi0gICAgcmV0dXJuIHBDaHVua0hlYWRlci0+d0NoYXJzW3BDaHVua0hlYWRlci0+blVzZWQgLSAoblRvdGFsIC0gbkluZGV4KV07DQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRCdWY6OkdldFJhbmdlKENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgbkJlZ2luLCBpbnQzMl90IG5MZW5ndGgpIGNvbnN0DQotew0KLSAgICBGREVfQ0hVTktQTEFDRSBjcDsNCi0gICAgSW5kZXgyQ1AobkJlZ2luLCBjcCk7DQotICAgIGludDMyX3QJbkxlYXZlCQk9IG5MZW5ndGg7DQotICAgIGludDMyX3QJbkNvdW50CQk9IG1fQ2h1bmtzLkdldFNpemUoKTsNCi0gICAgRlhfV0NIQVIqCWxwRHN0QnVmCT0gd3NUZXh0LkdldEJ1ZmZlcihuTGVuZ3RoKTsNCi0gICAgaW50MzJfdAluQ2h1bmtJbmRleAk9IGNwLm5DaHVua0luZGV4Ow0KLSAgICBGREVfTFBDSFVOS0hFQURFUglscENodW5rSGVhZGVyCT0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW25DaHVua0luZGV4XTsNCi0gICAgaW50MzJfdAkJCW5Db3B5TGVuZ3RoCQk9IGxwQ2h1bmtIZWFkZXItPm5Vc2VkIC0gY3AubkNoYXJJbmRleDsNCi0gICAgRlhfV0NIQVIqCQkJbHBTcmNCdWYJCT0gbHBDaHVua0hlYWRlci0+d0NoYXJzICsgY3AubkNoYXJJbmRleDsNCi0gICAgd2hpbGUgKG5MZWF2ZSA+IDApIHsNCi0gICAgICAgIGlmIChuTGVhdmUgPD0gbkNvcHlMZW5ndGgpIHsNCi0gICAgICAgICAgICBuQ29weUxlbmd0aCA9IG5MZWF2ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYU1lTX21lbWNweShscERzdEJ1ZiwgbHBTcmNCdWYsIG5Db3B5TGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgICAgICBuQ2h1bmtJbmRleCArKzsNCi0gICAgICAgIGlmIChuQ2h1bmtJbmRleCA+PSBuQ291bnQpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGxwQ2h1bmtIZWFkZXIJPQkoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbbkNodW5rSW5kZXhdOw0KLSAgICAgICAgbHBTcmNCdWYJCT0JbHBDaHVua0hlYWRlci0+d0NoYXJzOw0KLSAgICAgICAgbkxlYXZlCQkJLT0JbkNvcHlMZW5ndGg7DQotICAgICAgICBscERzdEJ1ZgkJKz0JbkNvcHlMZW5ndGg7DQotICAgICAgICBuQ29weUxlbmd0aAkJPQlscENodW5rSGVhZGVyLT5uVXNlZDsNCi0gICAgfQ0KLSAgICB3c1RleHQuUmVsZWFzZUJ1ZmZlcigpOw0KLX0NCi12b2lkIENGREVfVHh0RWR0QnVmOjpJbnNlcnQoaW50MzJfdCBuUG9zLCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGggKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG5Qb3MgPj0gMCAmJiBuUG9zIDw9IG1fblRvdGFsKTsNCi0gICAgRkRFX0NIVU5LUExBQ0UgY3A7DQotICAgIEluZGV4MkNQKG5Qb3MsIGNwKTsNCi0gICAgaW50MzJfdCBuTGVuZ3RoVGVtcCA9IG5MZW5ndGg7DQotICAgIGlmIChjcC5uQ2hhckluZGV4ICE9IDApIHsNCi0gICAgICAgIEZERV9MUENIVU5LSEVBREVSCWxwTmV3Q2h1bmsJPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9wQWxsb2NhdG9yLT5BbGxvYyhzaXplb2YoRkRFX0NIVU5LSEVBREVSKSArIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9uQ2h1bmtTaXplIC0gMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgICAgIEZERV9MUENIVU5LSEVBREVSCWxwQ2h1bmsJCT0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2NwLm5DaHVua0luZGV4XTsNCi0gICAgICAgIGludDMyX3QgbkNvcHkgPSBscENodW5rLT5uVXNlZCAtIGNwLm5DaGFySW5kZXg7DQotICAgICAgICBGWFNZU19tZW1jcHkobHBOZXdDaHVuay0+d0NoYXJzLCBscENodW5rLT53Q2hhcnMgKyBjcC5uQ2hhckluZGV4LCBuQ29weSAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICAgICAgbHBDaHVuay0+blVzZWQgLT0gbkNvcHk7DQotICAgICAgICBjcC5uQ2h1bmtJbmRleCArKzsNCi0gICAgICAgIG1fQ2h1bmtzLkluc2VydEF0KGNwLm5DaHVua0luZGV4LCBscE5ld0NodW5rKTsNCi0gICAgICAgIGxwTmV3Q2h1bmstPm5Vc2VkCT0gbkNvcHk7DQotICAgICAgICBjcC5uQ2hhckluZGV4CQk9IDA7DQotICAgIH0NCi0gICAgaWYgKGNwLm5DaHVua0luZGV4ICE9IDApIHsNCi0gICAgICAgIEZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmsgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbY3AubkNodW5rSW5kZXggLSAxXTsNCi0gICAgICAgIGlmIChscENodW5rLT5uVXNlZCAhPSBtX25DaHVua1NpemUpIHsNCi0gICAgICAgICAgICBjcC5uQ2h1bmtJbmRleCAtLTsNCi0gICAgICAgICAgICBpbnQzMl90IG5GcmVlID0gbV9uQ2h1bmtTaXplIC0gbHBDaHVuay0+blVzZWQ7DQotICAgICAgICAgICAgaW50MzJfdCBuQ29weSA9IEZYX01JTihuTGVuZ3RoVGVtcCwgbkZyZWUpOw0KLSAgICAgICAgICAgIEZYU1lTX21lbWNweShscENodW5rLT53Q2hhcnMgKyBscENodW5rLT5uVXNlZCwgbHBUZXh0LCBuQ29weSAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICAgICAgICAgIGxwVGV4dAkJCSs9IG5Db3B5Ow0KLSAgICAgICAgICAgIG5MZW5ndGhUZW1wCQktPSBuQ29weTsNCi0gICAgICAgICAgICBscENodW5rLT5uVXNlZAkrPSBuQ29weTsNCi0gICAgICAgICAgICBjcC5uQ2h1bmtJbmRleCsrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHdoaWxlIChuTGVuZ3RoVGVtcCA+IDApIHsNCi0gICAgICAgIEZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmsgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9wQWxsb2NhdG9yLT5BbGxvYyhzaXplb2YoRkRFX0NIVU5LSEVBREVSKSArIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9uQ2h1bmtTaXplIC0gMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChscENodW5rKTsNCi0gICAgICAgIGludDMyX3QgbkNvcHkgPSBGWF9NSU4obkxlbmd0aFRlbXAsIG1fbkNodW5rU2l6ZSk7DQotICAgICAgICBGWFNZU19tZW1jcHkobHBDaHVuay0+d0NoYXJzLCBscFRleHQsIG5Db3B5ICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgICAgICBscFRleHQJCQkrPQluQ29weTsNCi0gICAgICAgIG5MZW5ndGhUZW1wCQktPQluQ29weTsNCi0gICAgICAgIGxwQ2h1bmstPm5Vc2VkCT0JbkNvcHk7DQotICAgICAgICBtX0NodW5rcy5JbnNlcnRBdChjcC5uQ2h1bmtJbmRleCwgbHBDaHVuayk7DQotICAgICAgICBjcC5uQ2h1bmtJbmRleCArKzsNCi0gICAgfQ0KLSAgICBtX25Ub3RhbAkrPQluTGVuZ3RoOw0KLSAgICBtX2JDaGFuZ2VkCT0JVFJVRTsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEJ1Zjo6RGVsZXRlKGludDMyX3QgbkluZGV4LCBpbnQzMl90IG5MZW5ndGggKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG5MZW5ndGggPiAwICYmIG5JbmRleCA+PSAwICYmIG5JbmRleCArIG5MZW5ndGggPD0gbV9uVG90YWwpOw0KLSAgICBGREVfQ0hVTktQTEFDRSBjcEVuZDsNCi0gICAgSW5kZXgyQ1AobkluZGV4ICsgbkxlbmd0aCAtIDEsIGNwRW5kKTsNCi0gICAgbV9uVG90YWwgLT0gbkxlbmd0aDsNCi0gICAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tjcEVuZC5uQ2h1bmtJbmRleF07DQotICAgIGludDMyX3QgbkZpcnN0UGFydAk9IGNwRW5kLm5DaGFySW5kZXggKyAxOw0KLSAgICBpbnQzMl90IG5Nb3ZlUGFydAk9IGxwQ2h1bmstPm5Vc2VkIC0gbkZpcnN0UGFydDsNCi0gICAgaWYgKG5Nb3ZlUGFydCAhPSAwKSB7DQotICAgICAgICBpbnQzMl90IG5EZWxldGUgPSBGWF9NSU4obkZpcnN0UGFydCwgbkxlbmd0aCk7DQotICAgICAgICBGWFNZU19tZW1tb3ZlKGxwQ2h1bmstPndDaGFycyArIG5GaXJzdFBhcnQgLSBuRGVsZXRlLCBcDQotICAgICAgICAgICAgICAgICAgICAgIGxwQ2h1bmstPndDaGFycyArIG5GaXJzdFBhcnQsIG5Nb3ZlUGFydCAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICAgICAgbHBDaHVuay0+blVzZWQJLT0gbkRlbGV0ZTsNCi0gICAgICAgIG5MZW5ndGgJCQktPSBuRGVsZXRlOw0KLSAgICAgICAgY3BFbmQubkNodW5rSW5kZXggLS07DQotICAgIH0NCi0gICAgd2hpbGUgKG5MZW5ndGggPiAwKSB7DQotICAgICAgICBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2NwRW5kLm5DaHVua0luZGV4XTsNCi0gICAgICAgIGludDMyX3QgbkRlbGV0ZWQgPSBGWF9NSU4obHBDaHVuay0+blVzZWQsIG5MZW5ndGgpOw0KLSAgICAgICAgbHBDaHVuay0+blVzZWQgLT0gbkRlbGV0ZWQ7DQotICAgICAgICBpZiAobHBDaHVuay0+blVzZWQgPT0gMCkgew0KLSAgICAgICAgICAgIG1fcEFsbG9jYXRvci0+RnJlZShscENodW5rKTsNCi0gICAgICAgICAgICBtX0NodW5rcy5SZW1vdmVBdChjcEVuZC5uQ2h1bmtJbmRleCk7DQotICAgICAgICAgICAgbHBDaHVuayA9IE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBuTGVuZ3RoIC09IG5EZWxldGVkOw0KLSAgICAgICAgY3BFbmQubkNodW5rSW5kZXggLS07DQotICAgIH0NCi0gICAgbV9iQ2hhbmdlZCA9IFRSVUU7DQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRCdWY6OkNsZWFyKEZYX0JPT0wgYlJlbGVhc2UgKQ0KLXsNCi0gICAgaW50MzJfdCBpCQk9IDA7DQotICAgIGludDMyX3QgbkNvdW50CT0gbV9DaHVua3MuR2V0U2l6ZSgpOw0KLSAgICBpZiAoYlJlbGVhc2UpIHsNCi0gICAgICAgIHdoaWxlIChpIDwgbkNvdW50KSB7DQotICAgICAgICAgICAgbV9wQWxsb2NhdG9yLT5GcmVlKG1fQ2h1bmtzW2krK10pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9DaHVua3MuUmVtb3ZlQWxsKCk7DQorICAgIEZYU1lTX2Fzc2VydChtX25DdXJDaHVuayA8IG1fcEJ1Zi0+bV9DaHVua3MuR2V0U2l6ZSgpKTsNCisgICAgQ0ZERV9UeHRFZHRCdWY6OkZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmsgPQ0KKyAgICAgICAgKENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiltX3BCdWYtPm1fQ2h1bmtzW21fbkN1ckNodW5rXTsNCisgICAgaWYgKGxwQ2h1bmstPm5Vc2VkICE9IChtX25DdXJJbmRleCArIDEpKSB7DQorICAgICAgbV9uQ3VySW5kZXgrKzsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIHdoaWxlIChpIDwgbkNvdW50KSB7DQotICAgICAgICAgICAgKChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tpKytdKS0+blVzZWQgPSAwOw0KKyAgICAgIGludDMyX3QgbkVuZCA9IG1fcEJ1Zi0+bV9DaHVua3MuR2V0U2l6ZSgpIC0gMTsNCisgICAgICB3aGlsZSAobV9uQ3VyQ2h1bmsgPCBuRW5kKSB7DQorICAgICAgICBtX25DdXJDaHVuaysrOw0KKyAgICAgICAgQ0ZERV9UeHRFZHRCdWY6OkZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmtUZW1wID0NCisgICAgICAgICAgICAoQ0ZERV9UeHRFZHRCdWY6OkZERV9MUENIVU5LSEVBREVSKW1fcEJ1Zi0+bV9DaHVua3NbbV9uQ3VyQ2h1bmtdOw0KKyAgICAgICAgaWYgKGxwQ2h1bmtUZW1wLT5uVXNlZCA+IDApIHsNCisgICAgICAgICAgbV9uQ3VySW5kZXggPSAwOw0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi0gICAgbV9uVG90YWwJPSAwOw0KLSAgICBtX2JDaGFuZ2VkCT0gVFJVRTsNCisgICAgbV9uSW5kZXgrKzsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQogfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRCdWY6Ok9wdGltaXplKElGWF9QYXVzZSAqIHBQYXVzZSApDQotew0KLSAgICBpZiAobV9iQ2hhbmdlZCA9PSBGQUxTRSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQordm9pZCBDRkRFX1R4dEVkdEJ1Zkl0ZXI6OlNldEF0KGludDMyX3QgbkluZGV4KSB7DQorICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9wQnVmLT5tX25Ub3RhbCk7DQorICBDRkRFX1R4dEVkdEJ1Zjo6RkRFX0NIVU5LUExBQ0UgY3A7DQorICBtX3BCdWYtPkluZGV4MkNQKG5JbmRleCwgY3ApOw0KKyAgbV9uSW5kZXggPSBuSW5kZXg7DQorICBtX25DdXJDaHVuayA9IGNwLm5DaHVua0luZGV4Ow0KKyAgbV9uQ3VySW5kZXggPSBjcC5uQ2hhckluZGV4Ow0KK30NCitpbnQzMl90IENGREVfVHh0RWR0QnVmSXRlcjo6R2V0QXQoKSBjb25zdCB7DQorICByZXR1cm4gbV9uSW5kZXg7DQorfQ0KK0ZYX1dDSEFSIENGREVfVHh0RWR0QnVmSXRlcjo6R2V0Q2hhcigpIHsNCisgIEZYU1lTX2Fzc2VydChtX25JbmRleCA+PSAwICYmIG1fbkluZGV4IDwgbV9wQnVmLT5tX25Ub3RhbCk7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgaWYgKG1fYkZvckRpc3BsYXkpIHsNCisgICAgaWYgKG1fYkluRmllbGQpIHsNCisgICAgICBGWFNZU19hc3NlcnQobV9uQWxpYXNDb3VudCA+PSAwICYmIG1fbkFsaWFzQ291bnQgPD0gMik7DQorICAgICAgaWYgKG1fbkFsaWFzQ291bnQgPiAwKSB7DQorICAgICAgICBtX25BbGlhc0NvdW50LS07DQorICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9aRVJPV0lEVEhTUEFDRTsNCisgICAgICB9DQorICAgICAgRlhfV0NIQVIgd2MgPQ0KKyAgICAgICAgICAoKENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiltX3BCdWYtPm1fQ2h1bmtzW21fbkN1ckNodW5rXSkNCisgICAgICAgICAgICAgIC0+d0NoYXJzW21fbkN1ckluZGV4XTsNCisgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQpIHsNCisgICAgICAgIG1fbkFsaWFzQ291bnQgPSAwOw0KKyAgICAgICAgbV9iSW5GaWVsZCA9IEZBTFNFOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gd2M7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfV0NIQVIgd2MgPQ0KKyAgICAgICAgICAoKENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiltX3BCdWYtPm1fQ2h1bmtzW21fbkN1ckNodW5rXSkNCisgICAgICAgICAgICAgIC0+d0NoYXJzW21fbkN1ckluZGV4XTsNCisgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR04pIHsNCisgICAgICAgIG1fbkFsaWFzQ291bnQgPSAyOw0KKyAgICAgICAgbV9iSW5GaWVsZCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiB3YzsNCiAgICAgfQ0KLSAgICBpZiAobV9uVG90YWwgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorI2VuZGlmDQorICBpZiAobV9BbGlhcyA9PSAwIHx8IG1fbkluZGV4ID09IChtX3BCdWYtPm1fblRvdGFsIC0gMSkpIHsNCisgICAgcmV0dXJuICgoQ0ZERV9UeHRFZHRCdWY6OkZERV9MUENIVU5LSEVBREVSKW1fcEJ1Zi0+bV9DaHVua3NbbV9uQ3VyQ2h1bmtdKQ0KKyAgICAgICAgLT53Q2hhcnNbbV9uQ3VySW5kZXhdOw0KKyAgfQ0KKyAgcmV0dXJuIG1fQWxpYXM7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRCdWZJdGVyOjpJc0VPRihGWF9CT09MIGJUYWlsKSBjb25zdCB7DQorICByZXR1cm4gYlRhaWwgPyBtX25JbmRleCA9PSAobV9wQnVmLT5HZXRUZXh0TGVuZ3RoKCkgLSAyKSA6IG1fbkluZGV4ID09IDA7DQorfQ0KK0lGWF9DaGFySXRlciogQ0ZERV9UeHRFZHRCdWZJdGVyOjpDbG9uZSgpIHsNCisgIENGREVfVHh0RWR0QnVmSXRlciogcEl0ZXIgPSBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKG1fcEJ1Zik7DQorICBwSXRlci0+bV9uQ3VyQ2h1bmsgPSBtX25DdXJDaHVuazsNCisgIHBJdGVyLT5tX25DdXJJbmRleCA9IG1fbkN1ckluZGV4Ow0KKyAgcEl0ZXItPm1fbkluZGV4ID0gbV9uSW5kZXg7DQorICBwSXRlci0+bV9BbGlhcyA9IG1fQWxpYXM7DQorICByZXR1cm4gcEl0ZXI7DQorfQ0KK0NGREVfVHh0RWR0QnVmOjpDRkRFX1R4dEVkdEJ1ZihpbnQzMl90IG5EZWZDaHVua1NpemUpDQorICAgIDogbV9uQ2h1bmtTaXplKG5EZWZDaHVua1NpemUpLA0KKyAgICAgIG1fblRvdGFsKDApLA0KKyAgICAgIG1fYkNoYW5nZWQoRkFMU0UpLA0KKyAgICAgIG1fcEFsbG9jYXRvcihOVUxMKSB7DQorICBGWFNZU19hc3NlcnQobV9uQ2h1bmtTaXplKTsNCisgIFJlc2V0Q2h1bmtCdWZmZXIoRkRFX0RFRkNIVU5LQ09VTlQsIG1fbkNodW5rU2l6ZSk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWY6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCit9DQorQ0ZERV9UeHRFZHRCdWY6On5DRkRFX1R4dEVkdEJ1ZigpIHsNCisgIENsZWFyKFRSVUUpOw0KKyAgbV9wQWxsb2NhdG9yLT5SZWxlYXNlKCk7DQorICBtX0NodW5rcy5SZW1vdmVBbGwoKTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEJ1Zjo6U2V0Q2h1bmtTaXplKGludDMyX3QgbkNodW5rU2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG5DaHVua1NpemUpOw0KKyAgUmVzZXRDaHVua0J1ZmZlcihGREVfREVGQ0hVTktDT1VOVCwgbkNodW5rU2l6ZSk7DQorICByZXR1cm4gVFJVRTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEJ1Zjo6R2V0Q2h1bmtTaXplKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fbkNodW5rU2l6ZTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEJ1Zjo6R2V0VGV4dExlbmd0aCgpIGNvbnN0IHsNCisgIHJldHVybiBtX25Ub3RhbDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEJ1Zjo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBGWFNZU19hc3NlcnQoIXdzVGV4dC5Jc0VtcHR5KCkpOw0KKyAgQ2xlYXIoRkFMU0UpOw0KKyAgaW50MzJfdCBuVGV4dExlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgIGludDMyX3Qgbk5lZWRDb3VudCA9DQorICAgICAgKChuVGV4dExlbmd0aCAtIDEpIC8gbV9uQ2h1bmtTaXplICsgMSkgLSBtX0NodW5rcy5HZXRTaXplKCk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IG5OZWVkQ291bnQ7IGkrKykgew0KKyAgICBGREVfTFBDSFVOS0hFQURFUiBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fcEFsbG9jYXRvci0+QWxsb2MoDQorICAgICAgICBzaXplb2YoRkRFX0NIVU5LSEVBREVSKSArIChtX25DaHVua1NpemUgLSAxKSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBscENodW5rLT5uVXNlZCA9IDA7DQorICAgIG1fQ2h1bmtzLkFkZChscENodW5rKTsNCisgIH0NCisgIGludDMyX3QgblRvdGFsQ291bnQgPSBtX0NodW5rcy5HZXRTaXplKCk7DQorICBjb25zdCBGWF9XQ0hBUiogbHBTcmNCdWYgPSB3c1RleHQuY19zdHIoKTsNCisgIGludDMyX3QgbkxlYXZlID0gblRleHRMZW5ndGg7DQorICBpbnQzMl90IG5Db3B5ZWRMZW5ndGggPSBtX25DaHVua1NpemU7DQorICBmb3IgKGkgPSAwOyBpIDwgblRvdGFsQ291bnQgJiYgbkxlYXZlID4gMDsgaSsrKSB7DQorICAgIGlmIChuTGVhdmUgPCBuQ29weWVkTGVuZ3RoKSB7DQorICAgICAgbkNvcHllZExlbmd0aCA9IG5MZWF2ZTsNCiAgICAgfQ0KLSAgICBpbnQzMl90IG5Db3VudCA9IG1fQ2h1bmtzLkdldFNpemUoKTsNCi0gICAgaWYgKG5Db3VudCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tpXTsNCisgICAgRlhTWVNfbWVtY3B5KGxwQ2h1bmstPndDaGFycywgbHBTcmNCdWYsIG5Db3B5ZWRMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgbkxlYXZlIC09IG5Db3B5ZWRMZW5ndGg7DQorICAgIGxwU3JjQnVmICs9IG5Db3B5ZWRMZW5ndGg7DQorICAgIGxwQ2h1bmstPm5Vc2VkID0gbkNvcHllZExlbmd0aDsNCisgIH0NCisgIG1fblRvdGFsID0gblRleHRMZW5ndGg7DQorICBtX2JDaGFuZ2VkID0gVFJVRTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEJ1Zjo6R2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCB7DQorICBHZXRSYW5nZSh3c1RleHQsIDAsIG1fblRvdGFsKTsNCit9DQorRlhfV0NIQVIgQ0ZERV9UeHRFZHRCdWY6OkdldENoYXJCeUluZGV4KGludDMyX3QgbkluZGV4KSBjb25zdCB7DQorICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgR2V0VGV4dExlbmd0aCgpKTsNCisgIEZERV9MUENIVU5LSEVBREVSIHBDaHVua0hlYWRlciA9IE5VTEw7DQorICBpbnQzMl90IG5Ub3RhbCA9IDA7DQorICBpbnQzMl90IG5Db3VudCA9IG1fQ2h1bmtzLkdldFNpemUoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgcENodW5rSGVhZGVyID0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2ldOw0KKyAgICBuVG90YWwgKz0gcENodW5rSGVhZGVyLT5uVXNlZDsNCisgICAgaWYgKG5Ub3RhbCA+IG5JbmRleCkgew0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGZvciAoIDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tpXTsNCi0gICAgICAgIGlmIChscENodW5rLT5uVXNlZCA9PSAwKSB7DQotICAgICAgICAgICAgbV9wQWxsb2NhdG9yLT5GcmVlKGxwQ2h1bmspOw0KLSAgICAgICAgICAgIG1fQ2h1bmtzLlJlbW92ZUF0KGkpOw0KLSAgICAgICAgICAgIC0taTsNCi0gICAgICAgICAgICAtLW5Db3VudDsNCi0gICAgICAgIH0NCisgIH0NCisgIEZYU1lTX2Fzc2VydChwQ2h1bmtIZWFkZXIpOw0KKyAgcmV0dXJuIHBDaHVua0hlYWRlci0+d0NoYXJzW3BDaHVua0hlYWRlci0+blVzZWQgLSAoblRvdGFsIC0gbkluZGV4KV07DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWY6OkdldFJhbmdlKENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQmVnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKSBjb25zdCB7DQorICBGREVfQ0hVTktQTEFDRSBjcDsNCisgIEluZGV4MkNQKG5CZWdpbiwgY3ApOw0KKyAgaW50MzJfdCBuTGVhdmUgPSBuTGVuZ3RoOw0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0NodW5rcy5HZXRTaXplKCk7DQorICBGWF9XQ0hBUiogbHBEc3RCdWYgPSB3c1RleHQuR2V0QnVmZmVyKG5MZW5ndGgpOw0KKyAgaW50MzJfdCBuQ2h1bmtJbmRleCA9IGNwLm5DaHVua0luZGV4Ow0KKyAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVua0hlYWRlciA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tuQ2h1bmtJbmRleF07DQorICBpbnQzMl90IG5Db3B5TGVuZ3RoID0gbHBDaHVua0hlYWRlci0+blVzZWQgLSBjcC5uQ2hhckluZGV4Ow0KKyAgRlhfV0NIQVIqIGxwU3JjQnVmID0gbHBDaHVua0hlYWRlci0+d0NoYXJzICsgY3AubkNoYXJJbmRleDsNCisgIHdoaWxlIChuTGVhdmUgPiAwKSB7DQorICAgIGlmIChuTGVhdmUgPD0gbkNvcHlMZW5ndGgpIHsNCisgICAgICBuQ29weUxlbmd0aCA9IG5MZWF2ZTsNCisgICAgfQ0KKyAgICBGWFNZU19tZW1jcHkobHBEc3RCdWYsIGxwU3JjQnVmLCBuQ29weUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBuQ2h1bmtJbmRleCsrOw0KKyAgICBpZiAobkNodW5rSW5kZXggPj0gbkNvdW50KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgbHBDaHVua0hlYWRlciA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tuQ2h1bmtJbmRleF07DQorICAgIGxwU3JjQnVmID0gbHBDaHVua0hlYWRlci0+d0NoYXJzOw0KKyAgICBuTGVhdmUgLT0gbkNvcHlMZW5ndGg7DQorICAgIGxwRHN0QnVmICs9IG5Db3B5TGVuZ3RoOw0KKyAgICBuQ29weUxlbmd0aCA9IGxwQ2h1bmtIZWFkZXItPm5Vc2VkOw0KKyAgfQ0KKyAgd3NUZXh0LlJlbGVhc2VCdWZmZXIoKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEJ1Zjo6SW5zZXJ0KGludDMyX3QgblBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQoblBvcyA+PSAwICYmIG5Qb3MgPD0gbV9uVG90YWwpOw0KKyAgRkRFX0NIVU5LUExBQ0UgY3A7DQorICBJbmRleDJDUChuUG9zLCBjcCk7DQorICBpbnQzMl90IG5MZW5ndGhUZW1wID0gbkxlbmd0aDsNCisgIGlmIChjcC5uQ2hhckluZGV4ICE9IDApIHsNCisgICAgRkRFX0xQQ0hVTktIRUFERVIgbHBOZXdDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX3BBbGxvY2F0b3ItPkFsbG9jKA0KKyAgICAgICAgc2l6ZW9mKEZERV9DSFVOS0hFQURFUikgKyAobV9uQ2h1bmtTaXplIC0gMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tjcC5uQ2h1bmtJbmRleF07DQorICAgIGludDMyX3QgbkNvcHkgPSBscENodW5rLT5uVXNlZCAtIGNwLm5DaGFySW5kZXg7DQorICAgIEZYU1lTX21lbWNweShscE5ld0NodW5rLT53Q2hhcnMsIGxwQ2h1bmstPndDaGFycyArIGNwLm5DaGFySW5kZXgsDQorICAgICAgICAgICAgICAgICBuQ29weSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBscENodW5rLT5uVXNlZCAtPSBuQ29weTsNCisgICAgY3AubkNodW5rSW5kZXgrKzsNCisgICAgbV9DaHVua3MuSW5zZXJ0QXQoY3AubkNodW5rSW5kZXgsIGxwTmV3Q2h1bmspOw0KKyAgICBscE5ld0NodW5rLT5uVXNlZCA9IG5Db3B5Ow0KKyAgICBjcC5uQ2hhckluZGV4ID0gMDsNCisgIH0NCisgIGlmIChjcC5uQ2h1bmtJbmRleCAhPSAwKSB7DQorICAgIEZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmsgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbY3AubkNodW5rSW5kZXggLSAxXTsNCisgICAgaWYgKGxwQ2h1bmstPm5Vc2VkICE9IG1fbkNodW5rU2l6ZSkgew0KKyAgICAgIGNwLm5DaHVua0luZGV4LS07DQorICAgICAgaW50MzJfdCBuRnJlZSA9IG1fbkNodW5rU2l6ZSAtIGxwQ2h1bmstPm5Vc2VkOw0KKyAgICAgIGludDMyX3QgbkNvcHkgPSBGWF9NSU4obkxlbmd0aFRlbXAsIG5GcmVlKTsNCisgICAgICBGWFNZU19tZW1jcHkobHBDaHVuay0+d0NoYXJzICsgbHBDaHVuay0+blVzZWQsIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgbkNvcHkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICBscFRleHQgKz0gbkNvcHk7DQorICAgICAgbkxlbmd0aFRlbXAgLT0gbkNvcHk7DQorICAgICAgbHBDaHVuay0+blVzZWQgKz0gbkNvcHk7DQorICAgICAgY3AubkNodW5rSW5kZXgrKzsNCisgICAgfQ0KKyAgfQ0KKyAgd2hpbGUgKG5MZW5ndGhUZW1wID4gMCkgew0KKyAgICBGREVfTFBDSFVOS0hFQURFUiBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fcEFsbG9jYXRvci0+QWxsb2MoDQorICAgICAgICBzaXplb2YoRkRFX0NIVU5LSEVBREVSKSArIChtX25DaHVua1NpemUgLSAxKSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBGWFNZU19hc3NlcnQobHBDaHVuayk7DQorICAgIGludDMyX3QgbkNvcHkgPSBGWF9NSU4obkxlbmd0aFRlbXAsIG1fbkNodW5rU2l6ZSk7DQorICAgIEZYU1lTX21lbWNweShscENodW5rLT53Q2hhcnMsIGxwVGV4dCwgbkNvcHkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgbHBUZXh0ICs9IG5Db3B5Ow0KKyAgICBuTGVuZ3RoVGVtcCAtPSBuQ29weTsNCisgICAgbHBDaHVuay0+blVzZWQgPSBuQ29weTsNCisgICAgbV9DaHVua3MuSW5zZXJ0QXQoY3AubkNodW5rSW5kZXgsIGxwQ2h1bmspOw0KKyAgICBjcC5uQ2h1bmtJbmRleCsrOw0KKyAgfQ0KKyAgbV9uVG90YWwgKz0gbkxlbmd0aDsNCisgIG1fYkNoYW5nZWQgPSBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0QnVmOjpEZWxldGUoaW50MzJfdCBuSW5kZXgsIGludDMyX3Qgbkxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KG5MZW5ndGggPiAwICYmIG5JbmRleCA+PSAwICYmIG5JbmRleCArIG5MZW5ndGggPD0gbV9uVG90YWwpOw0KKyAgRkRFX0NIVU5LUExBQ0UgY3BFbmQ7DQorICBJbmRleDJDUChuSW5kZXggKyBuTGVuZ3RoIC0gMSwgY3BFbmQpOw0KKyAgbV9uVG90YWwgLT0gbkxlbmd0aDsNCisgIEZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmsgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbY3BFbmQubkNodW5rSW5kZXhdOw0KKyAgaW50MzJfdCBuRmlyc3RQYXJ0ID0gY3BFbmQubkNoYXJJbmRleCArIDE7DQorICBpbnQzMl90IG5Nb3ZlUGFydCA9IGxwQ2h1bmstPm5Vc2VkIC0gbkZpcnN0UGFydDsNCisgIGlmIChuTW92ZVBhcnQgIT0gMCkgew0KKyAgICBpbnQzMl90IG5EZWxldGUgPSBGWF9NSU4obkZpcnN0UGFydCwgbkxlbmd0aCk7DQorICAgIEZYU1lTX21lbW1vdmUobHBDaHVuay0+d0NoYXJzICsgbkZpcnN0UGFydCAtIG5EZWxldGUsDQorICAgICAgICAgICAgICAgICAgbHBDaHVuay0+d0NoYXJzICsgbkZpcnN0UGFydCwgbk1vdmVQYXJ0ICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIGxwQ2h1bmstPm5Vc2VkIC09IG5EZWxldGU7DQorICAgIG5MZW5ndGggLT0gbkRlbGV0ZTsNCisgICAgY3BFbmQubkNodW5rSW5kZXgtLTsNCisgIH0NCisgIHdoaWxlIChuTGVuZ3RoID4gMCkgew0KKyAgICBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2NwRW5kLm5DaHVua0luZGV4XTsNCisgICAgaW50MzJfdCBuRGVsZXRlZCA9IEZYX01JTihscENodW5rLT5uVXNlZCwgbkxlbmd0aCk7DQorICAgIGxwQ2h1bmstPm5Vc2VkIC09IG5EZWxldGVkOw0KKyAgICBpZiAobHBDaHVuay0+blVzZWQgPT0gMCkgew0KKyAgICAgIG1fcEFsbG9jYXRvci0+RnJlZShscENodW5rKTsNCisgICAgICBtX0NodW5rcy5SZW1vdmVBdChjcEVuZC5uQ2h1bmtJbmRleCk7DQorICAgICAgbHBDaHVuayA9IE5VTEw7DQorICAgIH0NCisgICAgbkxlbmd0aCAtPSBuRGVsZXRlZDsNCisgICAgY3BFbmQubkNodW5rSW5kZXgtLTsNCisgIH0NCisgIG1fYkNoYW5nZWQgPSBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0QnVmOjpDbGVhcihGWF9CT09MIGJSZWxlYXNlKSB7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0NodW5rcy5HZXRTaXplKCk7DQorICBpZiAoYlJlbGVhc2UpIHsNCisgICAgd2hpbGUgKGkgPCBuQ291bnQpIHsNCisgICAgICBtX3BBbGxvY2F0b3ItPkZyZWUobV9DaHVua3NbaSsrXSk7DQorICAgIH0NCisgICAgbV9DaHVua3MuUmVtb3ZlQWxsKCk7DQorICB9IGVsc2Ugew0KKyAgICB3aGlsZSAoaSA8IG5Db3VudCkgew0KKyAgICAgICgoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaSsrXSktPm5Vc2VkID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgbV9uVG90YWwgPSAwOw0KKyAgbV9iQ2hhbmdlZCA9IFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRCdWY6Ok9wdGltaXplKElGWF9QYXVzZSogcFBhdXNlKSB7DQorICBpZiAobV9iQ2hhbmdlZCA9PSBGQUxTRSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChtX25Ub3RhbCA9PSAwKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0NodW5rcy5HZXRTaXplKCk7DQorICBpZiAobkNvdW50ID09IDApIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yICg7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBGREVfTFBDSFVOS0hFQURFUiBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2ldOw0KKyAgICBpZiAobHBDaHVuay0+blVzZWQgPT0gMCkgew0KKyAgICAgIG1fcEFsbG9jYXRvci0+RnJlZShscENodW5rKTsNCisgICAgICBtX0NodW5rcy5SZW1vdmVBdChpKTsNCisgICAgICAtLWk7DQorICAgICAgLS1uQ291bnQ7DQorICAgIH0NCisgIH0NCisgIGlmIChwUGF1c2UgIT0gTlVMTCAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRkRFX0xQQ0hVTktIRUFERVIgbHBQcmVDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1swXTsNCisgIEZERV9MUENIVU5LSEVBREVSIGxwQ3VyQ2h1bmsgPSBOVUxMOw0KKyAgZm9yIChpID0gMTsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIGxwQ3VyQ2h1bmsgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaV07DQorICAgIGlmIChscFByZUNodW5rLT5uVXNlZCArIGxwQ3VyQ2h1bmstPm5Vc2VkIDw9IG1fbkNodW5rU2l6ZSkgew0KKyAgICAgIEZYU1lTX21lbWNweShscFByZUNodW5rLT53Q2hhcnMgKyBscFByZUNodW5rLT5uVXNlZCwgbHBDdXJDaHVuay0+d0NoYXJzLA0KKyAgICAgICAgICAgICAgICAgICBscEN1ckNodW5rLT5uVXNlZCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgIGxwUHJlQ2h1bmstPm5Vc2VkICs9IGxwQ3VyQ2h1bmstPm5Vc2VkOw0KKyAgICAgIG1fcEFsbG9jYXRvci0+RnJlZShscEN1ckNodW5rKTsNCisgICAgICBtX0NodW5rcy5SZW1vdmVBdChpKTsNCisgICAgICAtLWk7DQorICAgICAgLS1uQ291bnQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgbHBQcmVDaHVuayA9IGxwQ3VyQ2h1bms7DQogICAgIH0NCiAgICAgaWYgKHBQYXVzZSAhPSBOVUxMICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBGREVfTFBDSFVOS0hFQURFUiBscFByZUNodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzWzBdOw0KLSAgICBGREVfTFBDSFVOS0hFQURFUiBscEN1ckNodW5rID0gTlVMTDsNCi0gICAgZm9yIChpID0gMTsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgbHBDdXJDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tpXTsNCi0gICAgICAgIGlmIChscFByZUNodW5rLT5uVXNlZCArIGxwQ3VyQ2h1bmstPm5Vc2VkIDw9IG1fbkNodW5rU2l6ZSkgew0KLSAgICAgICAgICAgIEZYU1lTX21lbWNweShscFByZUNodW5rLT53Q2hhcnMgKyBscFByZUNodW5rLT5uVXNlZCwgbHBDdXJDaHVuay0+d0NoYXJzLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ3VyQ2h1bmstPm5Vc2VkICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgICAgICAgICAgbHBQcmVDaHVuay0+blVzZWQgKz0gbHBDdXJDaHVuay0+blVzZWQ7DQotICAgICAgICAgICAgbV9wQWxsb2NhdG9yLT5GcmVlKGxwQ3VyQ2h1bmspOw0KLSAgICAgICAgICAgIG1fQ2h1bmtzLlJlbW92ZUF0KGkpOw0KLSAgICAgICAgICAgIC0taTsNCi0gICAgICAgICAgICAtLW5Db3VudDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbHBQcmVDaHVuayA9IGxwQ3VyQ2h1bms7DQotICAgICAgICB9DQotICAgICAgICBpZiAocFBhdXNlICE9IE5VTEwgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fYkNoYW5nZWQgPSBGQUxTRTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBtX2JDaGFuZ2VkID0gRkFMU0U7DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDRkRFX1R4dEVkdEJ1Zjo6UmVzZXRDaHVua0J1ZmZlcihpbnQzMl90IG5EZWZDaHVua0NvdW50LCBpbnQzMl90IG5DaHVua1NpemUpDQotew0KLSAgICBGWFNZU19hc3NlcnQobkNodW5rU2l6ZSk7DQotICAgIEZYU1lTX2Fzc2VydChuRGVmQ2h1bmtDb3VudCk7DQotICAgIGlmIChtX3BBbGxvY2F0b3IpIHsNCi0gICAgICAgIG1fcEFsbG9jYXRvci0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wQWxsb2NhdG9yID0gTlVMTDsNCi0gICAgfQ0KLSAgICBtX0NodW5rcy5SZW1vdmVBbGwoKTsNCi0gICAgbV9uQ2h1bmtTaXplID0gbkNodW5rU2l6ZTsNCi0gICAgaW50MzJfdCBuQ2h1bmtMZW5ndGggPSBzaXplb2YoRkRFX0NIVU5LSEVBREVSKSArIChtX25DaHVua1NpemUgLSAxKSAqIHNpemVvZihGWF9XQ0hBUik7DQotICAgIG1fcEFsbG9jYXRvciA9IEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfRml4ZWQsIG5EZWZDaHVua0NvdW50LCBuQ2h1bmtMZW5ndGgpOw0KLSAgICBGWFNZU19hc3NlcnQobV9wQWxsb2NhdG9yKTsNCi0gICAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVua0hlYWRlciA9IChGREVfTFBDSFVOS0hFQURFUiltX3BBbGxvY2F0b3ItPkFsbG9jKG5DaHVua0xlbmd0aCk7DQotICAgIEZYU1lTX2Fzc2VydChscENodW5rSGVhZGVyKTsNCi0gICAgbHBDaHVua0hlYWRlci0+blVzZWQgPSAwOw0KLSAgICBtX0NodW5rcy5BZGQobHBDaHVua0hlYWRlcik7DQotICAgIG1fblRvdGFsID0gMDsNCit2b2lkIENGREVfVHh0RWR0QnVmOjpSZXNldENodW5rQnVmZmVyKGludDMyX3QgbkRlZkNodW5rQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaHVua1NpemUpIHsNCisgIEZYU1lTX2Fzc2VydChuQ2h1bmtTaXplKTsNCisgIEZYU1lTX2Fzc2VydChuRGVmQ2h1bmtDb3VudCk7DQorICBpZiAobV9wQWxsb2NhdG9yKSB7DQorICAgIG1fcEFsbG9jYXRvci0+UmVsZWFzZSgpOw0KKyAgICBtX3BBbGxvY2F0b3IgPSBOVUxMOw0KKyAgfQ0KKyAgbV9DaHVua3MuUmVtb3ZlQWxsKCk7DQorICBtX25DaHVua1NpemUgPSBuQ2h1bmtTaXplOw0KKyAgaW50MzJfdCBuQ2h1bmtMZW5ndGggPQ0KKyAgICAgIHNpemVvZihGREVfQ0hVTktIRUFERVIpICsgKG1fbkNodW5rU2l6ZSAtIDEpICogc2l6ZW9mKEZYX1dDSEFSKTsNCisgIG1fcEFsbG9jYXRvciA9DQorICAgICAgRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9GaXhlZCwgbkRlZkNodW5rQ291bnQsIG5DaHVua0xlbmd0aCk7DQorICBGWFNZU19hc3NlcnQobV9wQWxsb2NhdG9yKTsNCisgIEZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmtIZWFkZXIgPQ0KKyAgICAgIChGREVfTFBDSFVOS0hFQURFUiltX3BBbGxvY2F0b3ItPkFsbG9jKG5DaHVua0xlbmd0aCk7DQorICBGWFNZU19hc3NlcnQobHBDaHVua0hlYWRlcik7DQorICBscENodW5rSGVhZGVyLT5uVXNlZCA9IDA7DQorICBtX0NodW5rcy5BZGQobHBDaHVua0hlYWRlcik7DQorICBtX25Ub3RhbCA9IDA7DQogfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRCdWY6OkNQMkluZGV4KGNvbnN0IEZERV9DSFVOS1BMQUNFICYgY3ApIGNvbnN0DQotew0KLSAgICBpbnQzMl90IG5Ub3RhbCA9IGNwLm5DaGFySW5kZXg7DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGZvciAoaSA9IDA7IGkgPCBjcC5uQ2h1bmtJbmRleDsgaSArKykgew0KLSAgICAgICAgblRvdGFsICs9ICgoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaV0pLT5uVXNlZDsNCi0gICAgfQ0KLSAgICByZXR1cm4gblRvdGFsOw0KK2ludDMyX3QgQ0ZERV9UeHRFZHRCdWY6OkNQMkluZGV4KGNvbnN0IEZERV9DSFVOS1BMQUNFJiBjcCkgY29uc3Qgew0KKyAgaW50MzJfdCBuVG90YWwgPSBjcC5uQ2hhckluZGV4Ow0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBjcC5uQ2h1bmtJbmRleDsgaSsrKSB7DQorICAgIG5Ub3RhbCArPSAoKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2ldKS0+blVzZWQ7DQorICB9DQorICByZXR1cm4gblRvdGFsOw0KIH0NCi12b2lkIENGREVfVHh0RWR0QnVmOjpJbmRleDJDUChpbnQzMl90IG5JbmRleCwgRkRFX0NIVU5LUExBQ0UgJiBjcCkgY29uc3QNCi17DQotICAgIEZYU1lTX2Fzc2VydChuSW5kZXggPD0gR2V0VGV4dExlbmd0aCgpKTsNCi0gICAgaWYgKG5JbmRleCA9PSBtX25Ub3RhbCkgew0KLSAgICAgICAgY3AubkNodW5rSW5kZXgJPSBtX0NodW5rcy5HZXRTaXplKCkgLSAxOw0KLSAgICAgICAgY3AubkNoYXJJbmRleAk9ICgoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbY3AubkNodW5rSW5kZXhdKS0+blVzZWQ7DQotICAgICAgICByZXR1cm47DQordm9pZCBDRkRFX1R4dEVkdEJ1Zjo6SW5kZXgyQ1AoaW50MzJfdCBuSW5kZXgsIEZERV9DSFVOS1BMQUNFJiBjcCkgY29uc3Qgew0KKyAgRlhTWVNfYXNzZXJ0KG5JbmRleCA8PSBHZXRUZXh0TGVuZ3RoKCkpOw0KKyAgaWYgKG5JbmRleCA9PSBtX25Ub3RhbCkgew0KKyAgICBjcC5uQ2h1bmtJbmRleCA9IG1fQ2h1bmtzLkdldFNpemUoKSAtIDE7DQorICAgIGNwLm5DaGFySW5kZXggPSAoKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2NwLm5DaHVua0luZGV4XSktPm5Vc2VkOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaW50MzJfdCBuVG90YWwgPSAwOw0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0NodW5rcy5HZXRTaXplKCk7DQorICBmb3IgKDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIG5Ub3RhbCArPSAoKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2ldKS0+blVzZWQ7DQorICAgIGlmIChuVG90YWwgPiBuSW5kZXgpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpbnQzMl90CWkJCT0gMDsNCi0gICAgaW50MzJfdAluVG90YWwJPSAwOw0KLSAgICBpbnQzMl90CW5Db3VudAk9IG1fQ2h1bmtzLkdldFNpemUoKTsNCi0gICAgZm9yICggOyBpIDwgbkNvdW50OyBpICsrKSB7DQotICAgICAgICBuVG90YWwgKz0gKChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tpXSktPm5Vc2VkOw0KLSAgICAgICAgaWYgKG5Ub3RhbCA+IG5JbmRleCkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGNwLm5DaHVua0luZGV4CT0gaTsNCi0gICAgY3AubkNoYXJJbmRleAk9ICgoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaV0pLT5uVXNlZCAtIChuVG90YWwgLSBuSW5kZXgpOw0KKyAgfQ0KKyAgY3AubkNodW5rSW5kZXggPSBpOw0KKyAgY3AubkNoYXJJbmRleCA9ICgoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaV0pLT5uVXNlZCAtIChuVG90YWwgLSBuSW5kZXgpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRidWYuaCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJ1Zi5oCmluZGV4IDY3ZTNjYWUuLjI5NTNiZTIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJ1Zi5oCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJ1Zi5oCkBAIC05LDgyICs5LDg3IEBACiBjbGFzcyBJRlhfQ2hhckl0ZXI7DQogY2xhc3MgQ0ZERV9UeHRFZHRCdWZJdGVyOw0KIGNsYXNzIENGREVfVHh0RWR0QnVmOw0KLWNsYXNzIENGREVfVHh0RWR0QnVmSXRlciA6IHB1YmxpYyBJRlhfQ2hhckl0ZXINCi17DQotcHVibGljOg0KK2NsYXNzIENGREVfVHh0RWR0QnVmSXRlciA6IHB1YmxpYyBJRlhfQ2hhckl0ZXIgew0KKyBwdWJsaWM6DQogI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KLSAgICBDRkRFX1R4dEVkdEJ1Zkl0ZXIoQ0ZERV9UeHRFZHRCdWYgKiBwQnVmLCBGWF9CT09MIGJGb3JEaXNwbGF5ID0gVFJVRSk7DQorICBDRkRFX1R4dEVkdEJ1Zkl0ZXIoQ0ZERV9UeHRFZHRCdWYqIHBCdWYsIEZYX0JPT0wgYkZvckRpc3BsYXkgPSBUUlVFKTsNCiAjZWxzZQ0KLSAgICBDRkRFX1R4dEVkdEJ1Zkl0ZXIoQ0ZERV9UeHRFZHRCdWYgKiBwQnVmLCBGWF9XQ0hBUiB3Y0FsaWFzID0gMCk7DQorICBDRkRFX1R4dEVkdEJ1Zkl0ZXIoQ0ZERV9UeHRFZHRCdWYqIHBCdWYsIEZYX1dDSEFSIHdjQWxpYXMgPSAwKTsNCiAjZW5kaWYNCiANCi0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJTmV4dChGWF9CT09MIGJQcmV2ID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldENoYXIoKTsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRBdChpbnQzMl90IG5JbmRleCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRBdCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzRU9GKEZYX0JPT0wgYlRhaWwgPSBUUlVFKSBjb25zdDsNCi0gICAgdmlydHVhbCBJRlhfQ2hhckl0ZXIgKiBDbG9uZSgpOw0KLXByb3RlY3RlZDoNCi0gICAgfkNGREVfVHh0RWR0QnVmSXRlcigpOw0KLXByaXZhdGU6DQotICAgIENGREVfVHh0RWR0QnVmKgltX3BCdWY7DQotICAgIGludDMyX3QJCW1fbkN1ckNodW5rOw0KLSAgICBpbnQzMl90CQltX25DdXJJbmRleDsNCi0gICAgaW50MzJfdAkJbV9uSW5kZXg7DQotICAgIEZYX0JPT0wJCQltX2JJbkZpZWxkOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBOZXh0KEZYX0JPT0wgYlByZXYgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldENoYXIoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRBdChpbnQzMl90IG5JbmRleCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0QXQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRihGWF9CT09MIGJUYWlsID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIElGWF9DaGFySXRlciogQ2xvbmUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgfkNGREVfVHh0RWR0QnVmSXRlcigpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZERV9UeHRFZHRCdWYqIG1fcEJ1ZjsNCisgIGludDMyX3QgbV9uQ3VyQ2h1bms7DQorICBpbnQzMl90IG1fbkN1ckluZGV4Ow0KKyAgaW50MzJfdCBtX25JbmRleDsNCisgIEZYX0JPT0wgbV9iSW5GaWVsZDsNCiAjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotICAgIEZYX0JPT0wJCQltX2JGb3JEaXNwbGF5Ow0KLSAgICBpbnQzMl90CQltX25BbGlhc0NvdW50Ow0KKyAgRlhfQk9PTCBtX2JGb3JEaXNwbGF5Ow0KKyAgaW50MzJfdCBtX25BbGlhc0NvdW50Ow0KICNlbmRpZg0KLSAgICBGWF9XQ0hBUgkJbV9BbGlhczsNCisgIEZYX1dDSEFSIG1fQWxpYXM7DQogfTsNCi1jbGFzcyBDRkRFX1R4dEVkdEJ1ZiA6IHB1YmxpYyBJRkRFX1R4dEVkdEJ1Zg0KLXsNCi0gICAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0QnVmSXRlcjsNCi0gICAgc3RydWN0IF9GREVfQ0hVTktIRUFERVIgew0KLSAgICAgICAgaW50MzJfdAluVXNlZDsNCi0gICAgICAgIEZYX1dDSEFSCXdDaGFyc1sxXTsNCi0gICAgfTsNCi0gICAgdHlwZWRlZiBfRkRFX0NIVU5LSEVBREVSCUZERV9DSFVOS0hFQURFUjsNCi0gICAgdHlwZWRlZiBfRkRFX0NIVU5LSEVBREVSKglGREVfTFBDSFVOS0hFQURFUjsNCi0gICAgc3RydWN0IF9GREVfQ0hVTktQTEFDRSB7DQotICAgICAgICBpbnQzMl90CW5DaHVua0luZGV4Ow0KLSAgICAgICAgaW50MzJfdAluQ2hhckluZGV4Ow0KLSAgICB9Ow0KLSAgICB0eXBlZGVmIF9GREVfQ0hVTktQTEFDRQkJRkRFX0NIVU5LUExBQ0U7DQotICAgIHR5cGVkZWYgX0ZERV9DSFVOS1BMQUNFKglGREVfTFBDSFVOS1BMQUNFOw0KK2NsYXNzIENGREVfVHh0RWR0QnVmIDogcHVibGljIElGREVfVHh0RWR0QnVmIHsNCisgIGZyaWVuZCBjbGFzcyBDRkRFX1R4dEVkdEJ1Zkl0ZXI7DQorICBzdHJ1Y3QgX0ZERV9DSFVOS0hFQURFUiB7DQorICAgIGludDMyX3QgblVzZWQ7DQorICAgIEZYX1dDSEFSIHdDaGFyc1sxXTsNCisgIH07DQorICB0eXBlZGVmIF9GREVfQ0hVTktIRUFERVIgRkRFX0NIVU5LSEVBREVSOw0KKyAgdHlwZWRlZiBfRkRFX0NIVU5LSEVBREVSKiBGREVfTFBDSFVOS0hFQURFUjsNCisgIHN0cnVjdCBfRkRFX0NIVU5LUExBQ0Ugew0KKyAgICBpbnQzMl90IG5DaHVua0luZGV4Ow0KKyAgICBpbnQzMl90IG5DaGFySW5kZXg7DQorICB9Ow0KKyAgdHlwZWRlZiBfRkRFX0NIVU5LUExBQ0UgRkRFX0NIVU5LUExBQ0U7DQorICB0eXBlZGVmIF9GREVfQ0hVTktQTEFDRSogRkRFX0xQQ0hVTktQTEFDRTsNCiANCi1wdWJsaWM6DQotICAgIENGREVfVHh0RWR0QnVmKGludDMyX3QgbkRlZkNodW5rU2l6ZSA9IEZERV9ERUZDSFVOS0xFTkdUSCk7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0QnVmKGludDMyX3QgbkRlZkNodW5rU2l6ZSA9IEZERV9ERUZDSFVOS0xFTkdUSCk7DQogDQotICAgIHZpcnR1YWwJdm9pZAkJUmVsZWFzZSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldENodW5rU2l6ZShpbnQzMl90IG5DaHVua1NpemUpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0Q2h1bmtTaXplKCkgY29uc3Q7DQotICAgIHZpcnR1YWwJaW50MzJfdAlHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCi0gICAgdmlydHVhbCB2b2lkCQlHZXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldENoYXJCeUluZGV4KGludDMyX3QgbkluZGV4KSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCQlHZXRSYW5nZShDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBpbnQzMl90IG5CZWdpbmUsIGludDMyX3QgbkNvdW50ID0gLTEpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDaHVua1NpemUoaW50MzJfdCBuQ2h1bmtTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaHVua1NpemUoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIHZpcnR1YWwgdm9pZCBHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9XQ0hBUiBHZXRDaGFyQnlJbmRleChpbnQzMl90IG5JbmRleCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0UmFuZ2UoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CZWdpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3Q7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJSW5zZXJ0KGludDMyX3QgblBvcywgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwgaW50MzJfdCBuTGVuZ3RoID0gMSk7DQotICAgIHZpcnR1YWwgdm9pZAkJRGVsZXRlKGludDMyX3QgbkluZGV4LCBpbnQzMl90IG5MZW5ndGggPSAxKTsNCi0gICAgdmlydHVhbCB2b2lkCQlDbGVhcihGWF9CT09MIGJSZWxlYXNlID0gVFJVRSk7DQorICB2aXJ0dWFsIHZvaWQgSW5zZXJ0KGludDMyX3QgblBvcywNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoID0gMSk7DQorICB2aXJ0dWFsIHZvaWQgRGVsZXRlKGludDMyX3QgbkluZGV4LCBpbnQzMl90IG5MZW5ndGggPSAxKTsNCisgIHZpcnR1YWwgdm9pZCBDbGVhcihGWF9CT09MIGJSZWxlYXNlID0gVFJVRSk7DQogDQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT3B0aW1pemUoSUZYX1BhdXNlICogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT3B0aW1pemUoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCiANCi1wcm90ZWN0ZWQ6DQotICAgIHZpcnR1YWwgfkNGREVfVHh0RWR0QnVmKCk7DQotcHJpdmF0ZToNCi0gICAgdm9pZAkJUmVzZXRDaHVua0J1ZmZlcihpbnQzMl90IG5EZWZDaHVua0NvdW50LCBpbnQzMl90IG5DaHVua1NpemUpOw0KLSAgICBpbnQzMl90CUNQMkluZGV4KGNvbnN0IEZERV9DSFVOS1BMQUNFICYgY3ApIGNvbnN0Ow0KLSAgICB2b2lkCQlJbmRleDJDUChpbnQzMl90IG5JbmRleCwgRkRFX0NIVU5LUExBQ0UgJiBjcCkgY29uc3Q7DQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgfkNGREVfVHh0RWR0QnVmKCk7DQogDQotICAgIGludDMyX3QJCQltX25DaHVua1NpemU7DQorIHByaXZhdGU6DQorICB2b2lkIFJlc2V0Q2h1bmtCdWZmZXIoaW50MzJfdCBuRGVmQ2h1bmtDb3VudCwgaW50MzJfdCBuQ2h1bmtTaXplKTsNCisgIGludDMyX3QgQ1AySW5kZXgoY29uc3QgRkRFX0NIVU5LUExBQ0UmIGNwKSBjb25zdDsNCisgIHZvaWQgSW5kZXgyQ1AoaW50MzJfdCBuSW5kZXgsIEZERV9DSFVOS1BMQUNFJiBjcCkgY29uc3Q7DQogDQotICAgIGludDMyX3QJCQltX25Ub3RhbDsNCi0gICAgRlhfQk9PTAkJCQltX2JDaGFuZ2VkOw0KLSAgICBDRlhfUHRyQXJyYXkJCW1fQ2h1bmtzOw0KLSAgICBJRlhfTUVNQWxsb2NhdG9yICoJbV9wQWxsb2NhdG9yOw0KKyAgaW50MzJfdCBtX25DaHVua1NpemU7DQorDQorICBpbnQzMl90IG1fblRvdGFsOw0KKyAgRlhfQk9PTCBtX2JDaGFuZ2VkOw0KKyAgQ0ZYX1B0ckFycmF5IG1fQ2h1bmtzOw0KKyAgSUZYX01FTUFsbG9jYXRvciogbV9wQWxsb2NhdG9yOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0ZW5naW5lLmNwcCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGVuZ2luZS5jcHAKaW5kZXggZWM4ODk5Ni4uNDY1NjFkYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0ZW5naW5lLmNwcAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRlbmdpbmUuY3BwCkBAIC0xNSwyODU4ICsxNSwyODYyIEBACiAjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQogI2luY2x1ZGUgImZkZV90eHRlZHRibG9jay5oIg0KICNlbmRpZg0KLSNkZWZpbmUgRkRFX1BBR0VXSURUSF9NQVgJCQkJMHhGRkZGDQotI2RlZmluZSBGREVfVFhUUExBVEVTSVpFCQkJCSgxMDI0ICogMTIpDQotI2RlZmluZSBGREVfVU5JQ09ERV9QQVJBR1JBUEhfU1BFUkFUT1IJKDB4MjAyOSkNCi0jZGVmaW5lIEZERV9UWFRFRFRfRE9SRUNPUkRfSU5TCQkJMA0KLSNkZWZpbmUgRkRFX1RYVEVEVF9ET1JFQ09SRF9ERUwJCQkxDQorI2RlZmluZSBGREVfUEFHRVdJRFRIX01BWCAweEZGRkYNCisjZGVmaW5lIEZERV9UWFRQTEFURVNJWkUgKDEwMjQgKiAxMikNCisjZGVmaW5lIEZERV9VTklDT0RFX1BBUkFHUkFQSF9TUEVSQVRPUiAoMHgyMDI5KQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9ET1JFQ09SRF9JTlMgMA0KKyNkZWZpbmUgRkRFX1RYVEVEVF9ET1JFQ09SRF9ERUwgMQ0KICNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCi0jZGVmaW5lIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUSU5TCTMNCi0jZGVmaW5lIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUREVMCTQNCi0jZGVmaW5lIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUUkVQCTUNCi0jZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOCQkweEZGRjkNCi0jZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5ECQkweEZGRkINCisjZGVmaW5lIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUSU5TIDMNCisjZGVmaW5lIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUREVMIDQNCisjZGVmaW5lIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUUkVQIDUNCisjZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOIDB4RkZGOQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQgMHhGRkZCDQogI2VuZGlmDQotSUZERV9UeHRFZHRFbmdpbmUgKiBJRkRFX1R4dEVkdEVuZ2luZTo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHRFbmdpbmUoKTsNCitJRkRFX1R4dEVkdEVuZ2luZSogSUZERV9UeHRFZHRFbmdpbmU6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHRFbmdpbmUoKTsNCiB9DQogQ0ZERV9UeHRFZHRFbmdpbmU6OkNGREVfVHh0RWR0RW5naW5lKCkNCi0gICAgOiBtX25QYWdlTGluZUNvdW50KDIwKQ0KLSAgICAsIG1fbkxpbmVDb3VudCgwKQ0KLSAgICAsIG1fbkFuY2hvclBvcygtMSkNCi0gICAgLCBtX25MYXlvdXRQb3MoMCkNCi0gICAgLCBtX2ZDYXJldFBvc1Jlc2VydmUoMC4wKQ0KLSAgICAsIG1fbkNhcmV0KDApDQotICAgICwgbV9iQmVmb3JlKFRSVUUpDQotICAgICwgbV9uQ2FyZXRQYWdlKDApDQotICAgICwgbV9iTG9jayhGQUxTRSkNCi0gICAgLCBtX25MaW1pdCgwKQ0KLSAgICAsIG1fd2NBbGlhc0NoYXIoTCcqJykNCi0gICAgLCBtX3BUZXh0QnJlYWsoTlVMTCkNCisgICAgOiBtX25QYWdlTGluZUNvdW50KDIwKSwNCisgICAgICBtX25MaW5lQ291bnQoMCksDQorICAgICAgbV9uQW5jaG9yUG9zKC0xKSwNCisgICAgICBtX25MYXlvdXRQb3MoMCksDQorICAgICAgbV9mQ2FyZXRQb3NSZXNlcnZlKDAuMCksDQorICAgICAgbV9uQ2FyZXQoMCksDQorICAgICAgbV9iQmVmb3JlKFRSVUUpLA0KKyAgICAgIG1fbkNhcmV0UGFnZSgwKSwNCisgICAgICBtX2JMb2NrKEZBTFNFKSwNCisgICAgICBtX25MaW1pdCgwKSwNCisgICAgICBtX3djQWxpYXNDaGFyKEwnKicpLA0KKyAgICAgIG1fcFRleHRCcmVhayhOVUxMKQ0KICNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCi0gICAgLCBtX25GaXhMZW5ndGgoLTEpDQorICAgICAgLA0KKyAgICAgIG1fbkZpeExlbmd0aCgtMSkNCiAjZW5kaWYNCi0gICAgLCBtX2R3RmluZEZsYWdzKDApDQotICAgICwgbV9uRmlyc3RMaW5lRW5kKEZERV9UWFRFRElUX0xJTkVFTkRfQXV0bykNCi0gICAgLCBtX3dMaW5lRW5kKEZERV9VTklDT0RFX1BBUkFHUkFQSF9TUEVSQVRPUikNCi0gICAgLCBtX2JBdXRvTGluZUVuZChUUlVFKQ0KLXsNCi0gICAgRlhTWVNfbWVtc2V0KCZtX3J0Q2FyZXQsIDAsIHNpemVvZihDRlhfUmVjdEYpKTsNCi0gICAgbV9wVHh0QnVmID0gRlhfTkVXIENGREVfVHh0RWR0QnVmKCk7DQotICAgIG1fYkF1dG9MaW5lRW5kCT0gKG1fUGFyYW0ubkxpbmVFbmQgPT0gRkRFX1RYVEVESVRfTElORUVORF9BdXRvKTsNCisgICAgICAsDQorICAgICAgbV9kd0ZpbmRGbGFncygwKSwNCisgICAgICBtX25GaXJzdExpbmVFbmQoRkRFX1RYVEVESVRfTElORUVORF9BdXRvKSwNCisgICAgICBtX3dMaW5lRW5kKEZERV9VTklDT0RFX1BBUkFHUkFQSF9TUEVSQVRPUiksDQorICAgICAgbV9iQXV0b0xpbmVFbmQoVFJVRSkgew0KKyAgRlhTWVNfbWVtc2V0KCZtX3J0Q2FyZXQsIDAsIHNpemVvZihDRlhfUmVjdEYpKTsNCisgIG1fcFR4dEJ1ZiA9IEZYX05FVyBDRkRFX1R4dEVkdEJ1ZigpOw0KKyAgbV9iQXV0b0xpbmVFbmQgPSAobV9QYXJhbS5uTGluZUVuZCA9PSBGREVfVFhURURJVF9MSU5FRU5EX0F1dG8pOw0KIH0NCi1DRkRFX1R4dEVkdEVuZ2luZTo6fkNGREVfVHh0RWR0RW5naW5lKCkNCi17DQotICAgIGlmIChtX3BUeHRCdWYpIHsNCi0gICAgICAgIG1fcFR4dEJ1Zi0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wVHh0QnVmID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wVGV4dEJyZWFrKSB7DQotICAgICAgICBtX3BUZXh0QnJlYWstPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcFRleHRCcmVhayA9IE5VTEw7DQotICAgIH0NCitDRkRFX1R4dEVkdEVuZ2luZTo6fkNGREVfVHh0RWR0RW5naW5lKCkgew0KKyAgaWYgKG1fcFR4dEJ1Zikgew0KKyAgICBtX3BUeHRCdWYtPlJlbGVhc2UoKTsNCisgICAgbV9wVHh0QnVmID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BUZXh0QnJlYWspIHsNCisgICAgbV9wVGV4dEJyZWFrLT5SZWxlYXNlKCk7DQorICAgIG1fcFRleHRCcmVhayA9IE5VTEw7DQorICB9DQogI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KLSAgICBpbnQzMl90IG5CbG9ja0NvdW50ID0gbV9CbG9ja0FycmF5LkdldFNpemUoKTsNCi0gICAgaWYgKG5CbG9ja0NvdW50ID4gMCkgew0KLSAgICAgICAgaW50MzJfdCBpID0gMDsNCi0gICAgICAgIGZvciAoOyBpIDwgbkJsb2NrQ291bnQ7IGkgKyspIHsNCi0gICAgICAgICAgICBDRkRFX1R4dEVkdEJsb2NrICogcEJsb2NrID0gbV9CbG9ja0FycmF5W2ldOw0KLSAgICAgICAgICAgIGRlbGV0ZSBwQmxvY2s7DQotICAgICAgICB9DQotICAgICAgICBtX0Jsb2NrQXJyYXkuUmVtb3ZlQWxsKCk7DQorICBpbnQzMl90IG5CbG9ja0NvdW50ID0gbV9CbG9ja0FycmF5LkdldFNpemUoKTsNCisgIGlmIChuQmxvY2tDb3VudCA+IDApIHsNCisgICAgaW50MzJfdCBpID0gMDsNCisgICAgZm9yICg7IGkgPCBuQmxvY2tDb3VudDsgaSsrKSB7DQorICAgICAgQ0ZERV9UeHRFZHRCbG9jayogcEJsb2NrID0gbV9CbG9ja0FycmF5W2ldOw0KKyAgICAgIGRlbGV0ZSBwQmxvY2s7DQogICAgIH0NCisgICAgbV9CbG9ja0FycmF5LlJlbW92ZUFsbCgpOw0KKyAgfQ0KICNlbmRpZg0KLSAgICBSZW1vdmVBbGxQYXJhZ3MoKTsNCi0gICAgUmVtb3ZlQWxsUGFnZXMoKTsNCi0gICAgbV9QYXJhbS5wRXZlbnRTaW5rID0gTlVMTDsNCi0gICAgQ2xlYXJTZWxlY3Rpb24oKTsNCisgIFJlbW92ZUFsbFBhcmFncygpOw0KKyAgUmVtb3ZlQWxsUGFnZXMoKTsNCisgIG1fUGFyYW0ucEV2ZW50U2luayA9IE5VTEw7DQorICBDbGVhclNlbGVjdGlvbigpOw0KIH0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpSZWxlYXNlKCkNCi17DQotICAgIGRlbGV0ZSB0aGlzOw0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCiB9DQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0RWRpdFBhcmFtcyhjb25zdCBGREVfVFhURURUUEFSQU1TICZwYXJhbXMpDQotew0KLSAgICBpZiAobV9wVGV4dEJyZWFrID09IE5VTEwpIHsNCi0gICAgICAgIG1fcFRleHRCcmVhawk9IElGWF9UeHRCcmVhazo6Q3JlYXRlKEZYX1RYVEJSRUFLUE9MSUNZX05vbmUpOw0KLSAgICB9DQotICAgIEZYU1lTX21lbWNweSgmbV9QYXJhbSwgJnBhcmFtcywgc2l6ZW9mKEZERV9UWFRFRFRQQVJBTVMpKTsNCi0gICAgbV93TGluZUVuZAkJPSBwYXJhbXMud0xpbmVCcmVha0NoYXI7DQotICAgIG1fYkF1dG9MaW5lRW5kCT0gKG1fUGFyYW0ubkxpbmVFbmQgPT0gRkRFX1RYVEVESVRfTElORUVORF9BdXRvKTsNCi0gICAgVXBkYXRlVHh0QnJlYWsoKTsNCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpTZXRFZGl0UGFyYW1zKGNvbnN0IEZERV9UWFRFRFRQQVJBTVMmIHBhcmFtcykgew0KKyAgaWYgKG1fcFRleHRCcmVhayA9PSBOVUxMKSB7DQorICAgIG1fcFRleHRCcmVhayA9IElGWF9UeHRCcmVhazo6Q3JlYXRlKEZYX1RYVEJSRUFLUE9MSUNZX05vbmUpOw0KKyAgfQ0KKyAgRlhTWVNfbWVtY3B5KCZtX1BhcmFtLCAmcGFyYW1zLCBzaXplb2YoRkRFX1RYVEVEVFBBUkFNUykpOw0KKyAgbV93TGluZUVuZCA9IHBhcmFtcy53TGluZUJyZWFrQ2hhcjsNCisgIG1fYkF1dG9MaW5lRW5kID0gKG1fUGFyYW0ubkxpbmVFbmQgPT0gRkRFX1RYVEVESVRfTElORUVORF9BdXRvKTsNCisgIFVwZGF0ZVR4dEJyZWFrKCk7DQogfQ0KLWNvbnN0IEZERV9UWFRFRFRQQVJBTVMgKiBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0RWRpdFBhcmFtcygpIGNvbnN0DQotew0KLSAgICByZXR1cm4gJm1fUGFyYW07DQorY29uc3QgRkRFX1RYVEVEVFBBUkFNUyogQ0ZERV9UeHRFZHRFbmdpbmU6OkdldEVkaXRQYXJhbXMoKSBjb25zdCB7DQorICByZXR1cm4gJm1fUGFyYW07DQogfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkNvdW50UGFnZXMoKSBjb25zdA0KLXsNCi0gICAgaWYgKG1fbkxpbmVDb3VudCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICByZXR1cm4gKChtX25MaW5lQ291bnQgLSAxKSAvIG1fblBhZ2VMaW5lQ291bnQpICsgMTsNCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpDb3VudFBhZ2VzKCkgY29uc3Qgew0KKyAgaWYgKG1fbkxpbmVDb3VudCA9PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcmV0dXJuICgobV9uTGluZUNvdW50IC0gMSkgLyBtX25QYWdlTGluZUNvdW50KSArIDE7DQogfQ0KLUlGREVfVHh0RWR0UGFnZSAqIENGREVfVHh0RWR0RW5naW5lOjpHZXRQYWdlKGludDMyX3QgbkluZGV4KQ0KLXsNCi0gICAgaWYgKG1fUGFnZVB0ckFycmF5LkdldFNpemUoKSA8PSBuSW5kZXgpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiAoSUZERV9UeHRFZHRQYWdlKiltX1BhZ2VQdHJBcnJheVtuSW5kZXhdOw0KK0lGREVfVHh0RWR0UGFnZSogQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFBhZ2UoaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChtX1BhZ2VQdHJBcnJheS5HZXRTaXplKCkgPD0gbkluZGV4KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIChJRkRFX1R4dEVkdFBhZ2UqKW1fUGFnZVB0ckFycmF5W25JbmRleF07DQogfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldEJ1ZkNodW5rU2l6ZShpbnQzMl90IG5DaHVua1NpemUpDQotew0KLSAgICByZXR1cm4gbV9wVHh0QnVmLT5TZXRDaHVua1NpemUobkNodW5rU2l6ZSk7DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0QnVmQ2h1bmtTaXplKGludDMyX3QgbkNodW5rU2l6ZSkgew0KKyAgcmV0dXJuIG1fcFR4dEJ1Zi0+U2V0Q2h1bmtTaXplKG5DaHVua1NpemUpOw0KIH0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpTZXRUZXh0QnlTdHJlYW0oSUZYX1N0cmVhbSAqcFN0cmVhbSkNCi17DQotICAgIFJlc2V0RW5naW5lKCk7DQotICAgIGludDMyX3QJbkluZGV4CT0gMDsNCi0gICAgaWYgKHBTdHJlYW0gIT0gTlVMTCAmJiBwU3RyZWFtLT5HZXRMZW5ndGgoKSkgew0KLSAgICAgICAgaW50MzJfdAluU3RyZWFtTGVuZ3RoCT0gcFN0cmVhbS0+R2V0TGVuZ3RoKCk7DQotICAgICAgICBGWF9CT09MCQliVmFsaWQJCQk9IFRSVUU7DQotICAgICAgICBpZiAobV9uTGltaXQgPiAwICYmIG5TdHJlYW1MZW5ndGggPiBtX25MaW1pdCkgew0KLSAgICAgICAgICAgIGJWYWxpZCA9IEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfQk9PTCBiUHJlSXNDUiA9IEZBTFNFOw0KLSAgICAgICAgaWYgKGJWYWxpZCkgew0KLSAgICAgICAgICAgIHVpbnQ4X3QgYm9tWzRdOw0KLSAgICAgICAgICAgIGludDMyX3QgblBvcyAgPSBwU3RyZWFtLT5HZXRCT00oYm9tKTsNCi0gICAgICAgICAgICBwU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG5Qb3MpOw0KLSAgICAgICAgICAgIGludDMyX3QJblBsYXRlU2l6ZQk9IEZYX01JTihuU3RyZWFtTGVuZ3RoLCBtX3BUeHRCdWYtPkdldENodW5rU2l6ZSgpKTsNCi0gICAgICAgICAgICBGWF9XQ0hBUioJbHB3c3RyCQk9IChGWF9XQ0hBUiopRkRFX0FsbG9jKG5QbGF0ZVNpemUgKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQobHB3c3RyKTsNCi0gICAgICAgICAgICBGWF9CT09MCWJFb3MJCT0gZmFsc2U7DQotICAgICAgICAgICAgd2hpbGUgKCFiRW9zKSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QJblJlYWQgPSBwU3RyZWFtLT5SZWFkU3RyaW5nKGxwd3N0ciwgblBsYXRlU2l6ZSwgYkVvcyk7DQotICAgICAgICAgICAgICAgIGJQcmVJc0NSID0gUmVwbGFjZVBhcmFnRW5kKGxwd3N0ciwgblJlYWQsIGJQcmVJc0NSKTsNCi0gICAgICAgICAgICAgICAgbV9wVHh0QnVmLT5JbnNlcnQobkluZGV4LCBscHdzdHIsIG5SZWFkKTsNCi0gICAgICAgICAgICAgICAgbkluZGV4ICs9IG5SZWFkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGREVfRnJlZShscHdzdHIpOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldFRleHRCeVN0cmVhbShJRlhfU3RyZWFtKiBwU3RyZWFtKSB7DQorICBSZXNldEVuZ2luZSgpOw0KKyAgaW50MzJfdCBuSW5kZXggPSAwOw0KKyAgaWYgKHBTdHJlYW0gIT0gTlVMTCAmJiBwU3RyZWFtLT5HZXRMZW5ndGgoKSkgew0KKyAgICBpbnQzMl90IG5TdHJlYW1MZW5ndGggPSBwU3RyZWFtLT5HZXRMZW5ndGgoKTsNCisgICAgRlhfQk9PTCBiVmFsaWQgPSBUUlVFOw0KKyAgICBpZiAobV9uTGltaXQgPiAwICYmIG5TdHJlYW1MZW5ndGggPiBtX25MaW1pdCkgew0KKyAgICAgIGJWYWxpZCA9IEZBTFNFOw0KICAgICB9DQotICAgIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5JbmRleCwgJm1fd0xpbmVFbmQsIDEpOw0KLSAgICBSZWJ1aWxkUGFyYWdyYXBocygpOw0KKyAgICBGWF9CT09MIGJQcmVJc0NSID0gRkFMU0U7DQorICAgIGlmIChiVmFsaWQpIHsNCisgICAgICB1aW50OF90IGJvbVs0XTsNCisgICAgICBpbnQzMl90IG5Qb3MgPSBwU3RyZWFtLT5HZXRCT00oYm9tKTsNCisgICAgICBwU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG5Qb3MpOw0KKyAgICAgIGludDMyX3QgblBsYXRlU2l6ZSA9IEZYX01JTihuU3RyZWFtTGVuZ3RoLCBtX3BUeHRCdWYtPkdldENodW5rU2l6ZSgpKTsNCisgICAgICBGWF9XQ0hBUiogbHB3c3RyID0gKEZYX1dDSEFSKilGREVfQWxsb2MoblBsYXRlU2l6ZSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgIEZYU1lTX2Fzc2VydChscHdzdHIpOw0KKyAgICAgIEZYX0JPT0wgYkVvcyA9IGZhbHNlOw0KKyAgICAgIHdoaWxlICghYkVvcykgew0KKyAgICAgICAgaW50MzJfdCBuUmVhZCA9IHBTdHJlYW0tPlJlYWRTdHJpbmcobHB3c3RyLCBuUGxhdGVTaXplLCBiRW9zKTsNCisgICAgICAgIGJQcmVJc0NSID0gUmVwbGFjZVBhcmFnRW5kKGxwd3N0ciwgblJlYWQsIGJQcmVJc0NSKTsNCisgICAgICAgIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5JbmRleCwgbHB3c3RyLCBuUmVhZCk7DQorICAgICAgICBuSW5kZXggKz0gblJlYWQ7DQorICAgICAgfQ0KKyAgICAgIEZERV9GcmVlKGxwd3N0cik7DQorICAgIH0NCisgIH0NCisgIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5JbmRleCwgJm1fd0xpbmVFbmQsIDEpOw0KKyAgUmVidWlsZFBhcmFncmFwaHMoKTsNCiB9DQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgUmVzZXRFbmdpbmUoKTsNCi0gICAgaW50MzJfdCBuTGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOw0KLSAgICBpZiAobkxlbmd0aCA+IDApIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCi0gICAgICAgIEZYX1dDSEFSKiBscEJ1ZmZlciA9IHdzVGVtcC5HZXRCdWZmZXIobkxlbmd0aCk7DQotICAgICAgICBGWFNZU19tZW1jcHkobHBCdWZmZXIsIHdzVGV4dC5jX3N0cigpLCBuTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgICAgICBSZXBsYWNlUGFyYWdFbmQobHBCdWZmZXIsIG5MZW5ndGgsIEZBTFNFKTsNCi0gICAgICAgIHdzVGVtcC5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KLSAgICAgICAgaWYgKG1fbkxpbWl0ID4gMCAmJiBuTGVuZ3RoID4gbV9uTGltaXQpIHsNCi0gICAgICAgICAgICB3c1RlbXAuRGVsZXRlKG1fbkxpbWl0LCBuTGVuZ3RoIC0gbV9uTGltaXQpOw0KLSAgICAgICAgICAgIG5MZW5ndGggPSBtX25MaW1pdDsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcFR4dEJ1Zi0+U2V0VGV4dCh3c1RlbXApOw0KLSAgICB9DQotICAgIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5MZW5ndGgsICZtX3dMaW5lRW5kLCAxKTsNCi0gICAgUmVidWlsZFBhcmFncmFwaHMoKTsNCi19DQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0VGV4dExlbmd0aCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCApDQotew0KLSAgICBpbnQzMl90IG5UZXh0QnVmTGVuZ3RoID0gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KLSAgICBpZiAobkNvdW50ID09IC0xKSB7DQotICAgICAgICBuQ291bnQgPSBuVGV4dEJ1Zkxlbmd0aCAtIG5TdGFydDsNCi0gICAgfQ0KLSNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCi0gICAgaW50MzJfdCBuQmxvY2tDb3VudCA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQotICAgIGlmIChuQmxvY2tDb3VudCA9PSAwIHx8IG1fd3NGaXhUZXh0LklzRW1wdHkoKSkgew0KLSAgICAgICAgbV9wVHh0QnVmLT5HZXRSYW5nZSh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQotICAgIGNvbnN0IEZYX1dDSEFSKglscEZpeEJ1ZmZlcgk9IGNvbnN0IEZYX1dDSEFSKihtX3dzRml4VGV4dCk7DQotICAgIEZYX1dDSEFSKglscEJ1ZmZlcgk9IHdzVGVtcC5HZXRCdWZmZXIoblRleHRCdWZMZW5ndGgpOw0KLSAgICBpbnQzMl90IG5SZWFsTGVuZ3RoCT0gMDsNCi0gICAgaW50MzJfdCBuUHJlUG9zCQk9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5CbG9ja0NvdW50OyBpICsrKSB7DQotICAgICAgICBDRkRFX1R4dEVkdEJsb2NrICpwQmxvY2sgPSBtX0Jsb2NrQXJyYXlbaV07DQotICAgICAgICBpbnQzMl90IG5Qb3MgPSBwQmxvY2stPkdldFBvcygpOw0KLSAgICAgICAgaW50MzJfdCBuQ29weUxlbmd0aCA9IG5Qb3MgLSBuUHJlUG9zOw0KLSAgICAgICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgblJlYWxMZW5ndGgsIGxwRml4QnVmZmVyICsgblByZVBvcywgbkNvcHlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgICAgIG5SZWFsTGVuZ3RoICs9IG5Db3B5TGVuZ3RoOw0KLSAgICAgICAgblByZVBvcwkJPSAgblBvczsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQmxvY2s7DQotICAgICAgICBwQmxvY2stPkdldFJlYWxUZXh0KHdzQmxvY2spOw0KLSAgICAgICAgbkNvcHlMZW5ndGggPSB3c0Jsb2NrLkdldExlbmd0aCgpOw0KLSAgICAgICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgblJlYWxMZW5ndGgsIGNvbnN0IEZYX1dDSEFSKih3c0Jsb2NrKSwgbkNvcHlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgICAgIG5SZWFsTGVuZ3RoICs9IG5Db3B5TGVuZ3RoOw0KLSAgICB9DQotICAgIGludDMyX3QgbkxlZnRMZW5ndGggPSBtX3dzRml4VGV4dC5HZXRMZW5ndGgoKSAtIG5QcmVQb3M7DQotICAgIGlmIChuTGVmdExlbmd0aCA+IDApIHsNCi0gICAgICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIG5SZWFsTGVuZ3RoLCBscEZpeEJ1ZmZlciArIG5QcmVQb3MsIG5MZWZ0TGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgICAgICBuUmVhbExlbmd0aCArPSBuTGVmdExlbmd0aDsNCi0gICAgfQ0KLSAgICB3c1RlbXAuUmVsZWFzZUJ1ZmZlcihuUmVhbExlbmd0aCk7DQotICAgIGludDMyX3QgblJlYWxCZ24JPSBHZXRSZWFsSW5kZXgoblN0YXJ0KTsNCi0gICAgaW50MzJfdCBuUmVhbEVuZAk9IEdldFJlYWxJbmRleChuU3RhcnQgKyBuQ291bnQgLSAxKTsNCi0gICAgaW50MzJfdCBuUmVhbENvdW50CT0gblJlYWxFbmQgLSBuUmVhbEJnbjsNCi0gICAgRlhfV0NIQVIqIGxwRGVzdEJ1ZiA9IHdzVGV4dC5HZXRCdWZmZXIoblJlYWxDb3VudCk7DQotICAgIEZYU1lTX21lbWNweShscERlc3RCdWYsIGNvbnN0IEZYX1dDSEFSKih3c1RlbXApICsgblJlYWxCZ24sIG5SZWFsQ291bnQgKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgd3NUZXh0LlJlbGVhc2VCdWZmZXIoKTsNCi0jZWxzZQ0KLSAgICBtX3BUeHRCdWYtPkdldFJhbmdlKHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KLSAgICBSZWNvdmVyUGFyYWdFbmQod3NUZXh0KTsNCi0gICAgcmV0dXJuOw0KLSNlbmRpZg0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpDbGVhclRleHQoKQ0KLXsNCi0gICAgRGVsZXRlUmFuZ2UoMCwgLTEpOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpHZXRDYXJldFJlY3QoQ0ZYX1JlY3RGICZydENhcmV0KSBjb25zdA0KLXsNCi0gICAgcnRDYXJldCA9IG1fcnRDYXJldDsNCi0gICAgcmV0dXJuIG1fbkNhcmV0Ow0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpHZXRDYXJldFBvcygpIGNvbnN0DQotew0KLSAgICBpZiAoSXNMb2NrZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fbkNhcmV0ICsgKG1fYkJlZm9yZSA/IDAgOiAxKTsNCi19DQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0Q2FyZXRQb3MoaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSkNCi17DQotICAgIGlmIChJc0xvY2tlZCgpKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDw9IEdldFRleHRCdWZMZW5ndGgoKSk7DQotICAgIGlmIChtX1BhZ2VQdHJBcnJheS5HZXRTaXplKCkgPD0gbV9uQ2FyZXRQYWdlKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCi0gICAgaWYgKG1fQmxvY2tBcnJheS5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICBuSW5kZXggPSBOb3JtYWxpemVDYXJldFBvcyhuSW5kZXgsIEZERV9GT1JNQVRfQ0FSRVRfTUlERExFLCBiQmVmb3JlKTsNCi0gICAgfQ0KLSNlbmRpZg0KLSAgICBtX2JCZWZvcmUJPSBiQmVmb3JlOw0KLSAgICBtX25DYXJldAk9IG5JbmRleDsNCi0gICAgTW92ZVBhZ2UyQ2hhcihtX25DYXJldCk7DQotICAgIEdldENhcmV0UmVjdChtX3J0Q2FyZXQsIG1fbkNhcmV0UGFnZSwgbV9uQ2FyZXQsIG1fYkJlZm9yZSk7DQotICAgIGlmICghbV9iQmVmb3JlKSB7DQotICAgICAgICBtX25DYXJldCArKzsNCi0gICAgICAgIG1fYkJlZm9yZSA9IFRSVUU7DQotICAgIH0NCi0gICAgbV9mQ2FyZXRQb3NSZXNlcnZlID0gKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwpID8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2FyZXQudG9wIDogbV9ydENhcmV0LmxlZnQ7DQotICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQ2FyZXRDaGFuZ2VkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQotICAgIG1fbkFuY2hvclBvcyA9IC0xOw0KLSAgICByZXR1cm4gbV9uQ2FyZXQ7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVDYXJldFBvcyhGREVfVFhURURUTU9WRUNBUkVUIGVNb3ZlQ2FyZXQsDQotICAgICAgICBGWF9CT09MIGJTaGlmdCAsDQotICAgICAgICBGWF9CT09MIGJDdHJsICkNCi17DQotICAgIGlmIChJc0xvY2tlZCgpKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpZiAobV9QYWdlUHRyQXJyYXkuR2V0U2l6ZSgpIDw9IG1fbkNhcmV0UGFnZSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiU2VsQ2hhbmdlID0gRkFMU0U7DQotICAgIGlmIChJc1NlbGVjdCgpKSB7DQotICAgICAgICBDbGVhclNlbGVjdGlvbigpOw0KLSAgICAgICAgYlNlbENoYW5nZSA9IFRSVUU7DQotICAgIH0NCi0gICAgaWYgKGJTaGlmdCkgew0KLSAgICAgICAgaWYgKG1fbkFuY2hvclBvcyA9PSAtMSkgew0KLSAgICAgICAgICAgIG1fbkFuY2hvclBvcyA9IG1fbkNhcmV0Ow0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9uQW5jaG9yUG9zID0gLTE7DQotICAgIH0NCi0gICAgRlhfQk9PTAkJYlZlcnRpY2FsCT0gbV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbDsNCi0gICAgaW50MzJfdAluQ2FyZXQJCT0gbV9uQ2FyZXQ7DQotICAgIGludDMyX3QJbkNhcmV0UGFnZQk9IG1fbkNhcmV0UGFnZTsNCi0gICAgc3dpdGNoIChlTW92ZUNhcmV0KSB7DQotICAgICAgICBjYXNlIE1DX0xlZnQ6IHsNCi0gICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdENhcmV0Ow0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE1vdmVVcChwdENhcmV0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUNhcmV0SW5kZXgocHRDYXJldCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCZWZvcmUgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSBNb3ZlQmFja3dhcmQoYkJlZm9yZSk7DQotI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fQmxvY2tBcnJheS5HZXRTaXplKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBuSW5kZXggPSBOb3JtYWxpemVDYXJldFBvcyhuSW5kZXgsIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQsIGJCZWZvcmUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSW5kZXggPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX25DYXJldDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotI2VuZGlmDQotICAgICAgICAgICAgICAgICAgICBpZiAobkluZGV4ID49IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCBiQmVmb3JlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgTUNfUmlnaHQ6IHsNCi0gICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdENhcmV0Ow0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE1vdmVEb3duKHB0Q2FyZXQpKQl7DQotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2FyZXRJbmRleChwdENhcmV0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCA9IE1vdmVGb3J3YXJkKGJCZWZvcmUpOw0KLSNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5JbmRleCA9PSAtMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSW5kZXggPSBHZXRUZXh0QnVmTGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5JbmRleCA9IE5vcm1hbGl6ZUNhcmV0UG9zKG5JbmRleCwgRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJELCBiQmVmb3JlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0jZW5kaWYNCi0gICAgICAgICAgICAgICAgICAgIGlmIChuSW5kZXggPj0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUNhcmV0UmVjdChuSW5kZXgsIGJCZWZvcmUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBNQ19VcDogew0KLSAgICAgICAgICAgICAgICBpZiAoYlZlcnRpY2FsKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCZWZvcmUgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSBNb3ZlQmFja3dhcmQoYkJlZm9yZSk7DQotI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fQmxvY2tBcnJheS5HZXRTaXplKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBuSW5kZXggPSBOb3JtYWxpemVDYXJldFBvcyhuSW5kZXgsIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQsIGJCZWZvcmUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5JbmRleCA+PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2FyZXRSZWN0KG5JbmRleCwgYkJlZm9yZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGIHB0Q2FyZXQ7DQotICAgICAgICAgICAgICAgICAgICBpZiAoTW92ZVVwKHB0Q2FyZXQpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2FyZXRJbmRleChwdENhcmV0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgTUNfRG93bjogew0KLSAgICAgICAgICAgICAgICBpZiAoYlZlcnRpY2FsKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCZWZvcmUgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSBNb3ZlRm9yd2FyZChiQmVmb3JlKTsNCi0jaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotICAgICAgICAgICAgICAgICAgICBpZiAobV9CbG9ja0FycmF5LkdldFNpemUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5JbmRleCA9IE5vcm1hbGl6ZUNhcmV0UG9zKG5JbmRleCwgRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJELCBiQmVmb3JlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0jZW5kaWYNCi0gICAgICAgICAgICAgICAgICAgIGlmIChuSW5kZXggPj0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUNhcmV0UmVjdChuSW5kZXgsIGJCZWZvcmUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdENhcmV0Ow0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE1vdmVEb3duKHB0Q2FyZXQpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2FyZXRJbmRleChwdENhcmV0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgTUNfV29yZEJhY2t3YXJkOg0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBNQ19Xb3JkRm9yd2FyZDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgTUNfTGluZVN0YXJ0Og0KLSAgICAgICAgICAgIE1vdmVMaW5lU3RhcnQoKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgTUNfTGluZUVuZDoNCi0gICAgICAgICAgICBNb3ZlTGluZUVuZCgpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBNQ19QYXJhZ1N0YXJ0Og0KLSAgICAgICAgICAgIE1vdmVQYXJhZ1N0YXJ0KCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIE1DX1BhcmFnRW5kOg0KLSAgICAgICAgICAgIE1vdmVQYXJhZ0VuZCgpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBNQ19QYWdlRG93bjoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgTUNfUGFnZVVwOg0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBNQ19Ib21lOg0KLSAgICAgICAgICAgIE1vdmVIb21lKCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIE1DX0VuZDoNCi0gICAgICAgICAgICBNb3ZlRW5kKCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGlmIChiU2hpZnQgJiYgbV9uQW5jaG9yUG9zICE9IC0xICYmIChtX25BbmNob3JQb3MgIT0gbV9uQ2FyZXQpKSB7DQotICAgICAgICBBZGRTZWxSYW5nZShGWF9NSU4obV9uQW5jaG9yUG9zLCBtX25DYXJldCksIEZYU1lTX2FicyhtX25BbmNob3JQb3MgLSBtX25DYXJldCkpOw0KLSAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KLSAgICB9DQotICAgIGlmIChiU2VsQ2hhbmdlKSB7DQotICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1NlbENoYW5nZWQodGhpcyk7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fbkNhcmV0Ow0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpMb2NrKCkNCi17DQotICAgIG1fYkxvY2sgPSBUUlVFOw0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpVbmxvY2soKQ0KLXsNCi0gICAgbV9iTG9jayA9IEZBTFNFOw0KLX0NCi1GWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpJc0xvY2tlZCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9iTG9jazsNCi19DQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6SW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGgpDQotew0KLSAgICBpZiAoSXNMb2NrZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZDsNCi0gICAgfQ0KLSNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCi0gICAgaW50MzJfdCBuQmxvY2tDb3VudCA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQotICAgIGlmIChuQmxvY2tDb3VudCkgew0KLSAgICAgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9GSUVMRF9UQUIgJiYgbkxlbmd0aCA9PSAxICYmIGxwVGV4dFswXSA9PSBMJ1x0Jykgew0KLSAgICAgICAgICAgIHJldHVybiBNb3ZlMk5leHRFZGl0YWJsZUZpZWxkKG5TdGFydCkgPyBGREVfVFhURURUX01PRElGWV9SRVRfVF9UYWIgOiBcDQotICAgICAgICAgICAgICAgICAgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX1RhYjsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgblNlbFJhbmdlQ291bnQgPSBDb3VudFNlbFJhbmdlcygpOw0KLSAgICAgICAgaWYgKG5TZWxSYW5nZUNvdW50ID4gMCkgew0KLSAgICAgICAgICAgIGlmIChuU2VsUmFuZ2VDb3VudCA+IDEpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0JvdW5kYXJ5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpbnQzMl90IG5TZWxTdGFydDsNCi0gICAgICAgICAgICBpbnQzMl90IG5TZWxDb3VudDsNCi0gICAgICAgICAgICBuU2VsQ291bnQgPSBHZXRTZWxSYW5nZSgwLCBuU2VsU3RhcnQpOw0KLSAgICAgICAgICAgIGludDMyX3QgblNlbEVuZCA9IG5TZWxTdGFydCArIG5TZWxDb3VudDsNCi0gICAgICAgICAgICBpbnQzMl90IG5CZ24gPSAwOw0KLSAgICAgICAgICAgIGludDMyX3QgbkVuZCA9IDA7DQotICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IE5VTEw7DQotICAgICAgICAgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkoblNlbFN0YXJ0LCBuQmduLCBuRW5kLCBwRmllbGQpOw0KLSAgICAgICAgICAgIGlmIChuU2VsRW5kID4gbkVuZCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChiSW5GaWVsZCkgew0KLSAgICAgICAgICAgICAgICBwRmllbGQtPkJhY2t1cCgpOw0KLSAgICAgICAgICAgICAgICBGWF9CT09MCWJCZWZvcmUJPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEZWw7DQotICAgICAgICAgICAgICAgIGludDMyX3QgbkNhcmV0Ow0KLSAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleEluRmllbGQgPSBuU2VsU3RhcnQgLSBuQmduOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IG5SZXQgPSBwRmllbGQtPlJlcGxhY2UoblNlbFN0YXJ0IC0gbkJnbiwgblNlbENvdW50LCBDRlhfV2lkZVN0cmluZ0MobHBUZXh0LCBuTGVuZ3RoKSwgd3NEZWwsIG5DYXJldCwgYkJlZm9yZSk7DQotICAgICAgICAgICAgICAgIHN3aXRjaChuUmV0KSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0ZVTEw6DQotICAgICAgICAgICAgICAgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEU6DQotICAgICAgICAgICAgICAgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0ludmFsaWRhdGU7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRmllbGQ7DQotICAgICAgICAgICAgICAgIHBGaWVsZC0+R2V0RmllbGRUZXh0KHdzRmllbGQpOw0KLSAgICAgICAgICAgICAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGVGaWVsZCh0aGlzLCBwRmllbGQtPkdldEJsb2NrSW5kZXgoKSwgcEZpZWxkLT5HZXRJbmRleCgpLCB3c0ZpZWxkLCAwKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQotICAgICAgICAgICAgICAgIHBGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCi0gICAgICAgICAgICAgICAgaWYgKChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX1ZlcnQpIHx8IChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX0hvcnopKSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgICAgICAgICAgICAgICAgICBHZXRQcmVSZXBsYWNlVGV4dCh3c1RleHQsIG5CZ24sIG5FbmQgLSBuQmduICsgMSwgY29uc3QgRlhfV0NIQVIqKHdzRGlzcGxheSksIHdzRGlzcGxheS5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIUlzRml0QXJlYSh3c1RleHQpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgUmVwbGFjZShuQmduLCBuRW5kIC0gbkJnbiArIDEsIHdzRGlzcGxheSk7DQotICAgICAgICAgICAgICAgIGludDMyX3Qgbk5ld0NhcmV0ID0gbkJnbiArIG5DYXJldDsNCi0gICAgICAgICAgICAgICAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pKSB7DQotICAgICAgICAgICAgICAgICAgICBJRkRFX1R4dEVkdERvUmVjb3JkICogcFJlY29yZCA9IEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZSh0aGlzLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkNhcmV0LCBuTmV3Q2FyZXQsIHBGaWVsZCwgbkluZGV4SW5GaWVsZCwgbkJnbiwgd3NEaXNwbGF5LkdldExlbmd0aCgpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRGVsLCBDRlhfV2lkZVN0cmluZ0MobHBUZXh0LCBuTGVuZ3RoKSwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0RvUmVjb3JkOw0KLSAgICAgICAgICAgICAgICAgICAgcFJlY29yZC0+U2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KLSAgICAgICAgICAgICAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9BZGREb1JlY29yZCh0aGlzLCBic0RvUmVjb3JkKTsNCi0gICAgICAgICAgICAgICAgICAgIHBSZWNvcmQtPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBTZXRDYXJldFBvcyhuQmduICsgbkNhcmV0LCBiQmVmb3JlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IG5CZ24gPSAwOw0KLSAgICAgICAgaW50MzJfdCBuRW5kID0gMDsNCi0gICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQgPSBOVUxMOw0KLSAgICAgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkobV9uQ2FyZXQsIG5CZ24sIG5FbmQsIHBGaWVsZCk7DQotICAgICAgICBpbnQzMl90CW5DYXJldEluRmllbGQJPSBtX25DYXJldCAtIG5CZ247DQotICAgICAgICBGWF9CT09MCQliQmVmb3JlCQkJPSBGQUxTRTsNCi0gICAgICAgIGlmIChiSW5GaWVsZCkgew0KLSAgICAgICAgICAgIHBGaWVsZC0+QmFja3VwKCk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDICB3c0lucyhscFRleHQsIG5MZW5ndGgpOw0KLSAgICAgICAgICAgIGludDMyX3QgblJldCA9IHBGaWVsZC0+SW5zZXJ0KG5DYXJldEluRmllbGQsIHdzSW5zLCBuQ2FyZXRJbkZpZWxkLCBiQmVmb3JlKTsNCi0gICAgICAgICAgICBGWF9CT09MIGJGdWxsID0gRkFMU0U7DQotICAgICAgICAgICAgc3dpdGNoIChuUmV0KSB7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfTk9STUFMOg0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfRlVMTDoNCi0gICAgICAgICAgICAgICAgICAgIGJGdWxsID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0ZVTEw6DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfRnVsbDsNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9JTlZBTElEQVRFOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0ludmFsaWRhdGU7DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfTm9ybWFsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkOw0KLSAgICAgICAgICAgIHBGaWVsZC0+R2V0RmllbGRUZXh0KHdzRmllbGQpOw0KLSAgICAgICAgICAgIGlmICghbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9WYWxpZGF0ZUZpZWxkKHRoaXMsIHBGaWVsZC0+R2V0QmxvY2tJbmRleCgpLCBwRmllbGQtPkdldEluZGV4KCksIHdzRmllbGQsIDApKSB7DQotICAgICAgICAgICAgICAgIHBGaWVsZC0+UmVzdG9yZSgpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KLSAgICAgICAgICAgIHBGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCi0gICAgICAgICAgICBpZiAoKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfVmVydCkgfHwgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfSG9yeikpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgICAgICAgICBHZXRQcmVSZXBsYWNlVGV4dCh3c1RleHQsIG5CZ24sIG5FbmQgLSBuQmduICsgMSwgY29uc3QgRlhfV0NIQVIqKHdzRGlzcGxheSksIHdzRGlzcGxheS5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgIGlmICghSXNGaXRBcmVhKHdzVGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBGaWVsZC0+UmVzdG9yZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgUmVwbGFjZShuQmduLCBuRW5kIC0gbkJnbiArIDEsIHdzRGlzcGxheSk7DQotICAgICAgICAgICAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pKSB7DQotICAgICAgICAgICAgICAgIElGREVfVHh0RWR0RG9SZWNvcmQgKiBwUmVjb3JkID0gRlhfTkVXIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQodGhpcywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkNhcmV0LCBwRmllbGQsIG1fbkNhcmV0IC0gbkJnbiwgbkJnbiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbmQgLSBuQmduICsgMSwgd3NEaXNwbGF5LkdldExlbmd0aCgpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDKGxwVGV4dCwgbkxlbmd0aCksIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCi0gICAgICAgICAgICAgICAgcFJlY29yZC0+U2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KLSAgICAgICAgICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0FkZERvUmVjb3JkKHRoaXMsIGJzRG9SZWNvcmQpOw0KLSAgICAgICAgICAgICAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludDMyX3QgbkNhcmV0UG9zID0gbkJnbiArIG5DYXJldEluRmllbGQ7DQotICAgICAgICAgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9GSUVMRF9BVVRPICYmIGJGdWxsICYmIG5DYXJldFBvcyA9PSBuRW5kKSB7DQotICAgICAgICAgICAgICAgIGlmIChNb3ZlMk5leHRFZGl0YWJsZUZpZWxkKG5FbmQsIFRSVUUsIEZBTFNFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgU2V0Q2FyZXRQb3MobkNhcmV0UG9zLCBiQmVmb3JlKTsNCi0gICAgICAgICAgICByZXR1cm4gYkZ1bGwgPyBGREVfVFhURURUX01PRElGWV9SRVRfU19GdWxsIDogRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KLSAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX05vcm1hbDsNCi0gICAgfQ0KLSNlbmRpZg0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgUmVzZXRFbmdpbmUoKTsNCisgIGludDMyX3Qgbkxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgIGlmIChuTGVuZ3RoID4gMCkgew0KICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQogICAgIEZYX1dDSEFSKiBscEJ1ZmZlciA9IHdzVGVtcC5HZXRCdWZmZXIobkxlbmd0aCk7DQotICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciwgbHBUZXh0LCBuTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciwgd3NUZXh0LmNfc3RyKCksIG5MZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCiAgICAgUmVwbGFjZVBhcmFnRW5kKGxwQnVmZmVyLCBuTGVuZ3RoLCBGQUxTRSk7DQogICAgIHdzVGVtcC5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KLSAgICBGWF9CT09MIGJQYXJ0ID0gRkFMU0U7DQotICAgIGlmIChtX25MaW1pdCA+IDApIHsNCi0gICAgICAgIGludDMyX3QgblRvdGFsTGVuZ3RoCT0gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KLSAgICAgICAgaW50MzJfdCBuRGVsTGVuZ3RoCQk9IDA7DQotICAgICAgICBpbnQzMl90IG5Db3VudCA9IG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQotICAgICAgICAgICAgRkRFX0xQVFhURURUU0VMUkFOR0UgbHBTZWxSYW5nZSA9IG1fU2VsUmFuZ2VQdHJBcnIuR2V0QXQoaSk7DQotICAgICAgICAgICAgblRvdGFsTGVuZ3RoIC09IGxwU2VsUmFuZ2UtPm5Db3VudDsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgbkV4cGVjdExlbmd0aAk9IG5Ub3RhbExlbmd0aCArIG5MZW5ndGg7DQotICAgICAgICBpZiAoblRvdGFsTGVuZ3RoID09IG1fbkxpbWl0KSB7DQotICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQotICAgICAgICB9DQotICAgICAgICBpZiAobkV4cGVjdExlbmd0aCA+IG1fbkxpbWl0KSB7DQotICAgICAgICAgICAgbkxlbmd0aCAtPSAobkV4cGVjdExlbmd0aCAtIG1fbkxpbWl0KTsNCi0gICAgICAgICAgICBiUGFydCA9IFRSVUU7DQotICAgICAgICB9DQorICAgIGlmIChtX25MaW1pdCA+IDAgJiYgbkxlbmd0aCA+IG1fbkxpbWl0KSB7DQorICAgICAgd3NUZW1wLkRlbGV0ZShtX25MaW1pdCwgbkxlbmd0aCAtIG1fbkxpbWl0KTsNCisgICAgICBuTGVuZ3RoID0gbV9uTGltaXQ7DQogICAgIH0NCi0gICAgaWYgKChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX1ZlcnQpIHx8IChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX0hvcnopKSB7DQotICAgICAgICBpbnQzMl90IG5UZW1wID0gbkxlbmd0aDsNCi0gICAgICAgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfUGFzc3dvcmQpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgICAgICAgICAgd2hpbGUgKG5MZW5ndGggPiAwKSB7DQotICAgICAgICAgICAgICAgIEdldFByZUluc2VydFRleHQod3NUZXh0LCBtX25DYXJldCwgbHBCdWZmZXIsIG5MZW5ndGgpOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IG5Ub3RhbCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICAgICAgRlhfV0NIQVIqIGxwQnVmID0gd3NUZXh0LkdldEJ1ZmZlcihuVG90YWwpOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuVG90YWw7IGkgKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGxwQnVmW2ldID0gbV93Y0FsaWFzQ2hhcjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB3c1RleHQuUmVsZWFzZUJ1ZmZlcihuVG90YWwpOw0KLSAgICAgICAgICAgICAgICBpZiAoSXNGaXRBcmVhKHdzVGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG5MZW5ndGggLS07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgICAgICAgICAgd2hpbGUgKG5MZW5ndGggPiAwKSB7DQotICAgICAgICAgICAgICAgIEdldFByZUluc2VydFRleHQod3NUZXh0LCBtX25DYXJldCwgbHBCdWZmZXIsIG5MZW5ndGgpOw0KLSAgICAgICAgICAgICAgICBpZiAoSXNGaXRBcmVhKHdzVGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG5MZW5ndGggLS07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG5MZW5ndGggPT0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9GdWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG5MZW5ndGggPCBuVGVtcCkgew0KLSAgICAgICAgICAgIGJQYXJ0ID0gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX1ZhbGlkYXRlKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgICAgICBHZXRQcmVJbnNlcnRUZXh0KHdzVGV4dCwgbV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsNCi0gICAgICAgIGlmICghbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9WYWxpZGF0ZSh0aGlzLCB3c1RleHQpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0ludmFsaWRhdGU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKElzU2VsZWN0KCkpIHsNCi0gICAgICAgIERlbGV0ZVNlbGVjdCgpOw0KLSAgICB9DQotICAgIGlmICghKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9Ob1JlZG9VbmRvKSkgew0KLSAgICAgICAgSUZERV9UeHRFZHREb1JlY29yZCAqIHBSZWNvcmQgPSBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQodGhpcywgbV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRG9SZWNvcmQ7DQotICAgICAgICBwUmVjb3JkLT5TZXJpYWxpemUoYnNEb1JlY29yZCk7DQotICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0FkZERvUmVjb3JkKHRoaXMsIGJzRG9SZWNvcmQpOw0KLSAgICAgICAgcFJlY29yZC0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIEdldFRleHQobV9DaGFuZ2VJbmZvLndzUHJldlRleHQsIDApOw0KLSAgICBJbm5lcl9JbnNlcnQobV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsNCi0gICAgbV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlCT0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0Ow0KLSAgICBtX0NoYW5nZUluZm8ud3NJbnNlcnQJCT0gQ0ZYX1dpZGVTdHJpbmcobHBCdWZmZXIsIG5MZW5ndGgpOw0KLSAgICBuU3RhcnQgPQltX25DYXJldDsNCi0gICAgblN0YXJ0ICs9CW5MZW5ndGg7DQotICAgIEZYX1dDSEFSIHdDaGFyID0gbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQgLSAxKTsNCi0gICAgRlhfQk9PTCBiQmVmb3JlID0gVFJVRTsNCi0gICAgaWYgKHdDaGFyICE9IEwnXG4nICYmIHdDaGFyICE9IEwnXHInKSB7DQotICAgICAgICBuU3RhcnQgLS07DQotICAgICAgICBiQmVmb3JlID0gRkFMU0U7DQotICAgIH0NCi0gICAgU2V0Q2FyZXRQb3MoblN0YXJ0LCBiQmVmb3JlKTsNCi0gICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZCh0aGlzLCBtX0NoYW5nZUluZm8pOw0KLSAgICByZXR1cm4gYlBhcnQgPyBGREVfVFhURURUX01PRElGWV9SRVRfU19QYXJ0IDogRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KKyAgICBtX3BUeHRCdWYtPlNldFRleHQod3NUZW1wKTsNCisgIH0NCisgIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5MZW5ndGgsICZtX3dMaW5lRW5kLCAxKTsNCisgIFJlYnVpbGRQYXJhZ3JhcGhzKCk7DQogfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkRlbGV0ZShpbnQzMl90IG5TdGFydCwgRlhfQk9PTCBiQmFja3NwYWNlICkNCi17DQotICAgIGlmIChJc0xvY2tlZCgpKSB7DQotICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfTG9ja2VkOw0KLSAgICB9DQotICAgIGlmIChJc1NlbGVjdCgpKSB7DQotICAgICAgICBEZWxldGVTZWxlY3QoKTsNCi0gICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7DQotICAgIH0NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0TGVuZ3RoKCkgY29uc3Qgew0KKyAgcmV0dXJuIEdldFRleHRCdWZMZW5ndGgoKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCkgew0KKyAgaW50MzJfdCBuVGV4dEJ1Zkxlbmd0aCA9IEdldFRleHRCdWZMZW5ndGgoKTsNCisgIGlmIChuQ291bnQgPT0gLTEpIHsNCisgICAgbkNvdW50ID0gblRleHRCdWZMZW5ndGggLSBuU3RhcnQ7DQorICB9DQogI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KLSAgICBpbnQzMl90IG5CbG9ja0NvdW50ID0gbV9CbG9ja0FycmF5LkdldFNpemUoKTsNCi0gICAgaWYgKG5CbG9ja0NvdW50ID4gMCkgew0KLSAgICAgICAgaWYgKGJCYWNrc3BhY2UpIHsNCi0gICAgICAgICAgICBuU3RhcnQgLS07DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IG5Db3VudCA9IDE7DQotICAgICAgICBpbnQzMl90IG5CZ24gPSAwOw0KLSAgICAgICAgaW50MzJfdCBuRW5kID0gMDsNCi0gICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQgPSBOVUxMOw0KLSAgICAgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkoblN0YXJ0LCBuQmduLCBuRW5kLCBwRmllbGQpOw0KLSAgICAgICAgaW50MzJfdAluQ2FyZXRJbkZpZWxkCT0gblN0YXJ0IC0gbkJnbjsNCi0gICAgICAgIEZYX0JPT0wJCWJCZWZvcmUJCQk9IEZBTFNFOw0KLSAgICAgICAgaWYgKGJJbkZpZWxkICYmICFwRmllbGQtPklzRml4KCkpIHsNCi0gICAgICAgICAgICBwRmllbGQtPkJhY2t1cCgpOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGVsOw0KLSAgICAgICAgICAgIGludDMyX3QgbkNhcmV0ID0gMDsNCi0gICAgICAgICAgICBpbnQzMl90IG5SZXQgPSBwRmllbGQtPkRlbGV0ZShuQ2FyZXRJbkZpZWxkLCBuQ291bnQsIHdzRGVsLCBuQ2FyZXQsIGJCZWZvcmUpOw0KLSAgICAgICAgICAgIG5DYXJldCArPSBuQmduOw0KLSAgICAgICAgICAgIHN3aXRjaCAoblJldCkgew0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9TOg0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfSU5WQUxJREFURToNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0JPVU5EQVJZOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0JvdW5kYXJ5Ow0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRmllbGQ7DQotICAgICAgICAgICAgcEZpZWxkLT5HZXRGaWVsZFRleHQod3NGaWVsZCk7DQotICAgICAgICAgICAgaWYgKCFtX1BhcmFtLnBFdmVudFNpbmstPk9uX1ZhbGlkYXRlRmllbGQodGhpcywgcEZpZWxkLT5HZXRCbG9ja0luZGV4KCksIHBGaWVsZC0+R2V0SW5kZXgoKSwgd3NGaWVsZCwgMCkpIHsNCi0gICAgICAgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQotICAgICAgICAgICAgcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KLSAgICAgICAgICAgIFJlcGxhY2UobkJnbiwgbkVuZCAtIG5CZ24gKyAxLCB3c0Rpc3BsYXkpOw0KLSAgICAgICAgICAgIGlmICghKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9Ob1JlZG9VbmRvKSkgew0KLSAgICAgICAgICAgICAgICBJRkRFX1R4dEVkdERvUmVjb3JkICogcFJlY29yZCA9IEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKHRoaXMsIG5TdGFydCwgcEZpZWxkLCBuQ2FyZXRJbkZpZWxkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CZ24sIG5FbmQgLSBuQmduICsgMSwgd3NEaXNwbGF5LkdldExlbmd0aCgpLCB3c0RlbCwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0RvUmVjb3JkOw0KLSAgICAgICAgICAgICAgICBwUmVjb3JkLT5TZXJpYWxpemUoYnNEb1JlY29yZCk7DQotICAgICAgICAgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQWRkRG9SZWNvcmQodGhpcywgYnNEb1JlY29yZCk7DQotICAgICAgICAgICAgICAgIHBSZWNvcmQtPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgU2V0Q2FyZXRQb3MoblN0YXJ0LCBiQmVmb3JlKTsNCi0gICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0JvdW5kYXJ5Ow0KLSAgICB9DQotI2VuZGlmDQotICAgIGludDMyX3QgbkNvdW50ID0gMTsNCi0gICAgaWYgKGJCYWNrc3BhY2UpIHsNCi0gICAgICAgIGlmIChuU3RhcnQgPT0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Cb3VuZGFyeTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChuU3RhcnQgPiAyICYmIG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoblN0YXJ0IC0gMSkgPT0gTCdcbicgJiYgXA0KLSAgICAgICAgICAgICAgICBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5TdGFydCAtIDIpID09IEwnXHInKSB7DQotICAgICAgICAgICAgblN0YXJ0IC0tOw0KLSAgICAgICAgICAgIG5Db3VudCArKzsNCi0gICAgICAgIH0NCi0gICAgICAgIG5TdGFydCAtLTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChuU3RhcnQgPT0gR2V0VGV4dEJ1Zkxlbmd0aCgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQotICAgICAgICB9DQotICAgICAgICBpZiAoKG5TdGFydCArIDEgPCBHZXRUZXh0QnVmTGVuZ3RoKCkpICYmIChtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5TdGFydCkgPT0gTCdccicpICYmIFwNCi0gICAgICAgICAgICAgICAgKG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoblN0YXJ0ICsgMSkgPT0gTCdcbicpKSB7DQotICAgICAgICAgICAgbkNvdW50ICsrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgICAgIEdldFByZURlbGV0ZVRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQotICAgICAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGUodGhpcywgd3NUZXh0KSkgew0KLSAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmICghKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9Ob1JlZG9VbmRvKSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSYW5nZTsNCi0gICAgICAgIG1fcFR4dEJ1Zi0+R2V0UmFuZ2Uod3NSYW5nZSwgblN0YXJ0LCBuQ291bnQpOw0KLSAgICAgICAgSUZERV9UeHRFZHREb1JlY29yZCAqIHBSZWNvcmQgPSBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZSh0aGlzLCBuU3RhcnQsIG1fbkNhcmV0LCB3c1JhbmdlKTsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRG9SZWNvcmQ7DQotICAgICAgICBwUmVjb3JkLT5TZXJpYWxpemUoYnNEb1JlY29yZCk7DQotICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0FkZERvUmVjb3JkKHRoaXMsIGJzRG9SZWNvcmQpOw0KLSAgICAgICAgcFJlY29yZC0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIG1fQ2hhbmdlSW5mby5uQ2hhbmdlVHlwZQk9IEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0RlbGV0ZTsNCi0gICAgR2V0VGV4dChtX0NoYW5nZUluZm8ud3NEZWxldGUsIG5TdGFydCwgbkNvdW50KTsNCi0gICAgSW5uZXJfRGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KLSAgICBTZXRDYXJldFBvcyhuU3RhcnQgKyAoKCFiQmFja3NwYWNlICYmIG5TdGFydCA+IDApID8gLTEgOiAwKSwgKGJCYWNrc3BhY2UgfHwgblN0YXJ0ID09IDApKTsNCi0gICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZCh0aGlzLCBtX0NoYW5nZUluZm8pOw0KLSAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpEZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgKQ0KLXsNCi0gICAgaWYgKElzTG9ja2VkKCkpIHsNCi0gICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Mb2NrZWQ7DQotICAgIH0NCi0gICAgaWYgKG5Db3VudCA9PSAtMSkgew0KLSAgICAgICAgbkNvdW50ID0gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KLSAgICB9DQotICAgIGlmIChuQ291bnQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCi0gICAgfQ0KLSAgICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX1ZhbGlkYXRlKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgICAgICBHZXRQcmVEZWxldGVUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KLSAgICAgICAgaWYgKCFtX1BhcmFtLnBFdmVudFNpbmstPk9uX1ZhbGlkYXRlKHRoaXMsIHdzVGV4dCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBEZWxldGVSYW5nZV9Eb1JlY29yZChuU3RhcnQsIG5Db3VudCk7DQotICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQodGhpcywgbV9DaGFuZ2VJbmZvKTsNCi0gICAgU2V0Q2FyZXRQb3MoblN0YXJ0LCBUUlVFKTsNCi0gICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCi19DQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVwbGFjZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuTGVuZ3RoLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NSZXBsYWNlKQ0KLXsNCi0gICAgaWYgKElzTG9ja2VkKCkpIHsNCi0gICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Mb2NrZWQ7DQotICAgIH0NCi0gICAgaWYgKG5TdGFydCA8IDAgfHwgKG5TdGFydCArIG5MZW5ndGggPiBHZXRUZXh0QnVmTGVuZ3RoKCkpKSB7DQotICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnk7DQotICAgIH0NCi0gICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9WYWxpZGF0ZSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgR2V0UHJlUmVwbGFjZVRleHQod3NUZXh0LCBuU3RhcnQsIG5MZW5ndGgsIHdzUmVwbGFjZS5jX3N0cigpLCB3c1JlcGxhY2UuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgaWYgKCFtX1BhcmFtLnBFdmVudFNpbmstPk9uX1ZhbGlkYXRlKHRoaXMsIHdzVGV4dCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoSXNTZWxlY3QoKSkgew0KLSAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsNCi0gICAgfQ0KLSAgICBtX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUJPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9SZXBsYWNlOw0KLSAgICBHZXRUZXh0KG1fQ2hhbmdlSW5mby53c0RlbGV0ZSwgblN0YXJ0LCBuTGVuZ3RoKTsNCi0gICAgaWYgKG5MZW5ndGggPiAwKSB7DQotICAgICAgICBJbm5lcl9EZWxldGVSYW5nZShuU3RhcnQsIG5MZW5ndGgpOw0KLSAgICB9DQotICAgIGludDMyX3QgblRleHRMZW5ndGggPSB3c1JlcGxhY2UuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChuVGV4dExlbmd0aCA+IDApIHsNCi0gICAgICAgIElubmVyX0luc2VydChuU3RhcnQsIHdzUmVwbGFjZS5jX3N0cigpLCBuVGV4dExlbmd0aCk7DQotICAgIH0NCi0gICAgbV9DaGFuZ2VJbmZvLndzSW5zZXJ0ID0gQ0ZYX1dpZGVTdHJpbmcod3NSZXBsYWNlLmNfc3RyKCksIG5UZXh0TGVuZ3RoKTsNCi0gICAgblN0YXJ0ICs9CW5UZXh0TGVuZ3RoOw0KLSAgICBGWF9XQ0hBUiB3Q2hhciA9IG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoblN0YXJ0IC0gMSk7DQotICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQotICAgIGlmICh3Q2hhciAhPSBMJ1xuJyAmJiB3Q2hhciAhPSBMJ1xyJykgew0KLSAgICAgICAgblN0YXJ0IC0tOw0KLSAgICAgICAgYkJlZm9yZSA9IEZBTFNFOw0KLSAgICB9DQotICAgIFNldENhcmV0UG9zKG5TdGFydCwgYkJlZm9yZSk7DQotICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KLSAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VMb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQotICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQodGhpcywgbV9DaGFuZ2VJbmZvKTsNCi0gICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0TGltaXQoaW50MzJfdCBuTGltaXQpDQotew0KLSAgICBtX25MaW1pdCA9IG5MaW1pdDsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdjQWxpYXMpDQotew0KLSAgICBtX3djQWxpYXNDaGFyID0gd2NBbGlhczsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0Rm9ybWF0QmxvY2soaW50MzJfdCBuSW5kZXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0Jsb2NrRm9ybWF0KQ0KLXsNCi0jaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotICAgIGlmIChtX25GaXhMZW5ndGggPT0gLTEpIHsNCi0gICAgICAgIG1fbkZpeExlbmd0aCA9IEdldFRleHRMZW5ndGgoKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChtX3dzRml4VGV4dC5Jc0VtcHR5KCkpOw0KLSAgICAgICAgR2V0VGV4dChtX3dzRml4VGV4dCwgMCwgLTEpOw0KLSAgICB9DQotICAgIEZYX0JPT0wJCWJJbkJsb2NrCT0gRkFMU0U7DQotICAgIGludDMyX3QJbkNoYXJJbmRleAk9IDA7DQotICAgIGludDMyX3QJbkJsb2NrSW5kZXgJPSAwOw0KLSAgICBpbnQzMl90CW5CbG9ja1Bvcwk9IC0xOw0KLSAgICBGWF9XQ0hBUgl3YzsNCi0gICAgQ0ZERV9UeHRFZHRCdWZJdGVyICogcEl0ZXIgPSBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmLCBGQUxTRSk7DQotICAgIHBJdGVyLT5TZXRBdCgwKTsNCi0gICAgZG8gew0KLSAgICAgICAgd2MgPSBwSXRlci0+R2V0Q2hhcigpOw0KLSAgICAgICAgaWYgKGJJbkJsb2NrKSB7DQotICAgICAgICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5EKSB7DQotICAgICAgICAgICAgICAgIG5CbG9ja0luZGV4ICsrOw0KLSAgICAgICAgICAgICAgICBiSW5CbG9jayA9IEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOKSB7DQotICAgICAgICAgICAgICAgIGJJbkJsb2NrID0gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZiAobkNoYXJJbmRleCArKyA9PSBuSW5kZXgpIHsNCi0gICAgICAgICAgICAgICAgICAgIG5CbG9ja1BvcyA9IHBJdGVyLT5HZXRBdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KCkpOw0KLSAgICBwSXRlci0+UmVsZWFzZSgpOw0KLSAgICBpZiAobkJsb2NrUG9zID09IC0xKSB7DQotICAgICAgICBuQmxvY2tQb3MgPSBHZXRUZXh0QnVmTGVuZ3RoKCk7DQotICAgIH0NCi0gICAgQ0ZERV9UeHRFZHRCbG9jayAqIHBFZGl0QmxvY2sgPSBGWF9ORVcgQ0ZERV9UeHRFZHRCbG9jayh0aGlzLCB3c0Jsb2NrRm9ybWF0LCBuSW5kZXgpOw0KLSAgICBtX0Jsb2NrQXJyYXkuSW5zZXJ0QXQobV9CbG9ja0FycmF5LkdldFNpemUoKSwgcEVkaXRCbG9jayk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCi0gICAgcEVkaXRCbG9jay0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCi0gICAgbV9uQ2FyZXQgPSBuQmxvY2tQb3M7DQotICAgIGlmICh3c0Rpc3BsYXkuR2V0TGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICBSYXdJbnNlcnQobkJsb2NrUG9zLCBjb25zdCBGWF9XQ0hBUiood3NEaXNwbGF5KSwgd3NEaXNwbGF5LkdldExlbmd0aCgpKTsNCi0gICAgfQ0KLSNlbmRpZg0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpDb3VudEVkaXRCbG9ja3MoKSBjb25zdA0KLXsNCi0jaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotICAgIHJldHVybiBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KLSNlbHNlDQotICAgIHJldHVybiAwOw0KLSNlbmRpZg0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpHZXRFZGl0QmxvY2tUZXh0KGludDMyX3QgbkluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NCbG9ja1RleHQpIGNvbnN0DQotew0KLSNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCi0gICAgQ0ZERV9UeHRFZHRCbG9jayAqIHBCbG9jayA9IG1fQmxvY2tBcnJheVtuSW5kZXhdOw0KLSAgICBwQmxvY2stPkdldEJsb2NrVGV4dCh3c0Jsb2NrVGV4dCk7DQotI2VuZGlmDQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkNvdW50RWRpdEZpZWxkcyhpbnQzMl90IG5CbG9ja0luZGV4KSBjb25zdA0KLXsNCi0jaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotICAgIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2sgPSBtX0Jsb2NrQXJyYXlbbkJsb2NrSW5kZXhdOw0KLSAgICByZXR1cm4gcEJsb2NrLT5Db3VudEZpZWxkKCk7DQotI2Vsc2UNCi0gICAgcmV0dXJuIDA7DQotI2VuZGlmDQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldEVkaXRGaWVsZFRleHQoaW50MzJfdCBuQmxvY2tJbmRleCwgaW50MzJfdCBuRmllbGRJbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGRUZXh0KSBjb25zdA0KLXsNCi0jaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotICAgIENGREVfVHh0RWR0QmxvY2sgKiBwQmxvY2sgPSBtX0Jsb2NrQXJyYXlbbkJsb2NrSW5kZXhdOw0KLSAgICBwQmxvY2stPkdldEZpZWxkVGV4dChuRmllbGRJbmRleCwgd3NGaWVsZFRleHQpOw0KLSNlbmRpZg0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpTdGFydEVkaXQoKQ0KLXsNCi0jaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotI2VuZGlmDQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkVuZEVkaXQoKQ0KLXsNCi0jaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotI2VuZGlmDQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlbW92ZVNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCApDQotew0KLSAgICBGREVfTFBUWFRFRFRTRUxSQU5HRSBscFRlbXAgPSBOVUxMOw0KLSAgICBpbnQzMl90IG5SYW5nZUNvdW50ID0gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGZvciAoaSA9IDA7IGkgPCBuUmFuZ2VDb3VudDsgaSArKykgew0KLSAgICAgICAgbHBUZW1wID0gbV9TZWxSYW5nZVB0ckFycltpXTsNCi0gICAgICAgIGlmIChscFRlbXAtPm5TdGFydCA9PSBuU3RhcnQgJiYgbHBUZW1wLT5uQ291bnQgPT0gbkNvdW50KSB7DQotICAgICAgICAgICAgZGVsZXRlIGxwVGVtcDsNCi0gICAgICAgICAgICBtX1NlbFJhbmdlUHRyQXJyLlJlbW92ZUF0KGkpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KKyAgaW50MzJfdCBuQmxvY2tDb3VudCA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQorICBpZiAobkJsb2NrQ291bnQgPT0gMCB8fCBtX3dzRml4VGV4dC5Jc0VtcHR5KCkpIHsNCisgICAgbV9wVHh0QnVmLT5HZXRSYW5nZSh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCiAgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgY29uc3QgRlhfV0NIQVIqIGxwRml4QnVmZmVyID0gY29uc3QgRlhfV0NIQVIgKiAobV93c0ZpeFRleHQpOw0KKyAgRlhfV0NIQVIqIGxwQnVmZmVyID0gd3NUZW1wLkdldEJ1ZmZlcihuVGV4dEJ1Zkxlbmd0aCk7DQorICBpbnQzMl90IG5SZWFsTGVuZ3RoID0gMDsNCisgIGludDMyX3QgblByZVBvcyA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQmxvY2tDb3VudDsgaSsrKSB7DQorICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jayA9IG1fQmxvY2tBcnJheVtpXTsNCisgICAgaW50MzJfdCBuUG9zID0gcEJsb2NrLT5HZXRQb3MoKTsNCisgICAgaW50MzJfdCBuQ29weUxlbmd0aCA9IG5Qb3MgLSBuUHJlUG9zOw0KKyAgICBGWFNZU19tZW1jcHkobHBCdWZmZXIgKyBuUmVhbExlbmd0aCwgbHBGaXhCdWZmZXIgKyBuUHJlUG9zLA0KKyAgICAgICAgICAgICAgICAgbkNvcHlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgblJlYWxMZW5ndGggKz0gbkNvcHlMZW5ndGg7DQorICAgIG5QcmVQb3MgPSBuUG9zOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Jsb2NrOw0KKyAgICBwQmxvY2stPkdldFJlYWxUZXh0KHdzQmxvY2spOw0KKyAgICBuQ29weUxlbmd0aCA9IHdzQmxvY2suR2V0TGVuZ3RoKCk7DQorICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIG5SZWFsTGVuZ3RoLCBjb25zdCBGWF9XQ0hBUiood3NCbG9jayksDQorICAgICAgICAgICAgICAgICBuQ29weUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBuUmVhbExlbmd0aCArPSBuQ29weUxlbmd0aDsNCisgIH0NCisgIGludDMyX3QgbkxlZnRMZW5ndGggPSBtX3dzRml4VGV4dC5HZXRMZW5ndGgoKSAtIG5QcmVQb3M7DQorICBpZiAobkxlZnRMZW5ndGggPiAwKSB7DQorICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIG5SZWFsTGVuZ3RoLCBscEZpeEJ1ZmZlciArIG5QcmVQb3MsDQorICAgICAgICAgICAgICAgICBuTGVmdExlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBuUmVhbExlbmd0aCArPSBuTGVmdExlbmd0aDsNCisgIH0NCisgIHdzVGVtcC5SZWxlYXNlQnVmZmVyKG5SZWFsTGVuZ3RoKTsNCisgIGludDMyX3QgblJlYWxCZ24gPSBHZXRSZWFsSW5kZXgoblN0YXJ0KTsNCisgIGludDMyX3QgblJlYWxFbmQgPSBHZXRSZWFsSW5kZXgoblN0YXJ0ICsgbkNvdW50IC0gMSk7DQorICBpbnQzMl90IG5SZWFsQ291bnQgPSBuUmVhbEVuZCAtIG5SZWFsQmduOw0KKyAgRlhfV0NIQVIqIGxwRGVzdEJ1ZiA9IHdzVGV4dC5HZXRCdWZmZXIoblJlYWxDb3VudCk7DQorICBGWFNZU19tZW1jcHkobHBEZXN0QnVmLCBjb25zdCBGWF9XQ0hBUiood3NUZW1wKSArIG5SZWFsQmduLA0KKyAgICAgICAgICAgICAgIG5SZWFsQ291bnQgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIHdzVGV4dC5SZWxlYXNlQnVmZmVyKCk7DQorI2Vsc2UNCisgIG1fcFR4dEJ1Zi0+R2V0UmFuZ2Uod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQorICBSZWNvdmVyUGFyYWdFbmQod3NUZXh0KTsNCisgIHJldHVybjsNCisjZW5kaWYNCiB9DQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6QWRkU2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ICkNCi17DQotICAgIGlmIChuQ291bnQgPT0gLTEpIHsNCi0gICAgICAgIG5Db3VudCA9IEdldFRleHRMZW5ndGgoKSAtIG5TdGFydDsNCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpDbGVhclRleHQoKSB7DQorICBEZWxldGVSYW5nZSgwLCAtMSk7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldENhcmV0UmVjdChDRlhfUmVjdEYmIHJ0Q2FyZXQpIGNvbnN0IHsNCisgIHJ0Q2FyZXQgPSBtX3J0Q2FyZXQ7DQorICByZXR1cm4gbV9uQ2FyZXQ7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldENhcmV0UG9zKCkgY29uc3Qgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gbV9uQ2FyZXQgKyAobV9iQmVmb3JlID8gMCA6IDEpOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCAmJiBuSW5kZXggPD0gR2V0VGV4dEJ1Zkxlbmd0aCgpKTsNCisgIGlmIChtX1BhZ2VQdHJBcnJheS5HZXRTaXplKCkgPD0gbV9uQ2FyZXRQYWdlKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgIGlmIChtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpID4gMCkgew0KKyAgICBuSW5kZXggPSBOb3JtYWxpemVDYXJldFBvcyhuSW5kZXgsIEZERV9GT1JNQVRfQ0FSRVRfTUlERExFLCBiQmVmb3JlKTsNCisgIH0NCisjZW5kaWYNCisgIG1fYkJlZm9yZSA9IGJCZWZvcmU7DQorICBtX25DYXJldCA9IG5JbmRleDsNCisgIE1vdmVQYWdlMkNoYXIobV9uQ2FyZXQpOw0KKyAgR2V0Q2FyZXRSZWN0KG1fcnRDYXJldCwgbV9uQ2FyZXRQYWdlLCBtX25DYXJldCwgbV9iQmVmb3JlKTsNCisgIGlmICghbV9iQmVmb3JlKSB7DQorICAgIG1fbkNhcmV0Kys7DQorICAgIG1fYkJlZm9yZSA9IFRSVUU7DQorICB9DQorICBtX2ZDYXJldFBvc1Jlc2VydmUgPSAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fcnRDYXJldC50b3ANCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fcnRDYXJldC5sZWZ0Ow0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9DYXJldENoYW5nZWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCisgIG1fbkFuY2hvclBvcyA9IC0xOw0KKyAgcmV0dXJuIG1fbkNhcmV0Ow0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpNb3ZlQ2FyZXRQb3MoRkRFX1RYVEVEVE1PVkVDQVJFVCBlTW92ZUNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3RybCkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAobV9QYWdlUHRyQXJyYXkuR2V0U2l6ZSgpIDw9IG1fbkNhcmV0UGFnZSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYX0JPT0wgYlNlbENoYW5nZSA9IEZBTFNFOw0KKyAgaWYgKElzU2VsZWN0KCkpIHsNCisgICAgQ2xlYXJTZWxlY3Rpb24oKTsNCisgICAgYlNlbENoYW5nZSA9IFRSVUU7DQorICB9DQorICBpZiAoYlNoaWZ0KSB7DQorICAgIGlmIChtX25BbmNob3JQb3MgPT0gLTEpIHsNCisgICAgICBtX25BbmNob3JQb3MgPSBtX25DYXJldDsNCiAgICAgfQ0KLSAgICBpbnQzMl90IG5TaXplCT0gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCk7DQotICAgIGlmIChuU2l6ZSA8PSAwKSB7DQotICAgICAgICBGREVfTFBUWFRFRFRTRUxSQU5HRSBscFNlbFJhbmdlID0gRlhfTkVXIEZERV9UWFRFRFRTRUxSQU5HRTsNCi0gICAgICAgIGxwU2VsUmFuZ2UtPm5TdGFydAk9IG5TdGFydDsNCi0gICAgICAgIGxwU2VsUmFuZ2UtPm5Db3VudAk9IG5Db3VudDsNCi0gICAgICAgIG1fU2VsUmFuZ2VQdHJBcnIuQWRkKGxwU2VsUmFuZ2UpOw0KLSAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZERV9MUFRYVEVEVFNFTFJBTkdFIGxwVGVtcCA9IE5VTEw7DQotICAgIGxwVGVtcCA9IG1fU2VsUmFuZ2VQdHJBcnJbblNpemUgLSAxXTsNCi0gICAgaWYgKG5TdGFydCA+PSBscFRlbXAtPm5TdGFydCArIGxwVGVtcC0+bkNvdW50KSB7DQotICAgICAgICBGREVfTFBUWFRFRFRTRUxSQU5HRSBscFNlbFJhbmdlID0gRlhfTkVXIEZERV9UWFRFRFRTRUxSQU5HRTsNCi0gICAgICAgIGxwU2VsUmFuZ2UtPm5TdGFydAk9IG5TdGFydDsNCi0gICAgICAgIGxwU2VsUmFuZ2UtPm5Db3VudAk9IG5Db3VudDsNCi0gICAgICAgIG1fU2VsUmFuZ2VQdHJBcnIuQWRkKGxwU2VsUmFuZ2UpOw0KLSAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QJbkVuZAkJPSBuU3RhcnQgKyBuQ291bnQgLSAxOw0KLSAgICBGWF9CT09MCQliQmVnaW4JCT0gRkFMU0U7DQotICAgIGludDMyX3QJblJhbmdlQmduCT0gMDsNCi0gICAgaW50MzJfdAluUmFuZ2VDbnQJPSAwOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuU2l6ZTsgaSArKykgew0KLSAgICAgICAgbHBUZW1wCQk9IG1fU2VsUmFuZ2VQdHJBcnJbaV07DQotICAgICAgICBpbnQzMl90IG5UZW1wQmduCT0gbHBUZW1wLT5uU3RhcnQ7DQotICAgICAgICBpbnQzMl90IG5UZW1wRW5kCT0gblRlbXBCZ24gKyBscFRlbXAtPm5Db3VudCAtIDE7DQotICAgICAgICBpZiAoYkJlZ2luKSB7DQotICAgICAgICAgICAgaWYgKG5FbmQgPCBuVGVtcEJnbikgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG5TdGFydCA+PSBuVGVtcEJnbiAmJiBuU3RhcnQgPD0gblRlbXBFbmQpIHsNCi0gICAgICAgICAgICAgICAgblJhbmdlQ250ICsrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgblJhbmdlQ250ICsrOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoblN0YXJ0IDw9IG5UZW1wRW5kKSB7DQotICAgICAgICAgICAgICAgIG5SYW5nZUJnbiA9IGk7DQotICAgICAgICAgICAgICAgIGlmIChuRW5kIDwgblRlbXBCZ24pIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG5SYW5nZUNudCA9IDE7DQotICAgICAgICAgICAgICAgIGJCZWdpbiA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgbV9uQW5jaG9yUG9zID0gLTE7DQorICB9DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9IG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWw7DQorICBpbnQzMl90IG5DYXJldCA9IG1fbkNhcmV0Ow0KKyAgaW50MzJfdCBuQ2FyZXRQYWdlID0gbV9uQ2FyZXRQYWdlOw0KKyAgc3dpdGNoIChlTW92ZUNhcmV0KSB7DQorICAgIGNhc2UgTUNfTGVmdDogew0KKyAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgIENGWF9Qb2ludEYgcHRDYXJldDsNCisgICAgICAgIGlmIChNb3ZlVXAocHRDYXJldCkpIHsNCisgICAgICAgICAgVXBkYXRlQ2FyZXRJbmRleChwdENhcmV0KTsNCiAgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfQk9PTCBiQmVmb3JlID0gVFJVRTsNCisgICAgICAgIGludDMyX3QgbkluZGV4ID0gTW92ZUJhY2t3YXJkKGJCZWZvcmUpOw0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgICAgICAgIGlmIChtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgIG5JbmRleCA9DQorICAgICAgICAgICAgICBOb3JtYWxpemVDYXJldFBvcyhuSW5kZXgsIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQsIGJCZWZvcmUpOw0KKyAgICAgICAgICBpZiAobkluZGV4IDwgMCkgew0KKyAgICAgICAgICAgIHJldHVybiBtX25DYXJldDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgICAgaWYgKG5JbmRleCA+PSAwKSB7DQorICAgICAgICAgIFVwZGF0ZUNhcmV0UmVjdChuSW5kZXgsIGJCZWZvcmUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBNQ19SaWdodDogew0KKyAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgIENGWF9Qb2ludEYgcHRDYXJldDsNCisgICAgICAgIGlmIChNb3ZlRG93bihwdENhcmV0KSkgew0KKyAgICAgICAgICBVcGRhdGVDYXJldEluZGV4KHB0Q2FyZXQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9CT09MIGJCZWZvcmUgPSBUUlVFOw0KKyAgICAgICAgaW50MzJfdCBuSW5kZXggPSBNb3ZlRm9yd2FyZChiQmVmb3JlKTsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICAgICAgICBpZiAobV9CbG9ja0FycmF5LkdldFNpemUoKSkgew0KKyAgICAgICAgICBpZiAobkluZGV4ID09IC0xKSB7DQorICAgICAgICAgICAgbkluZGV4ID0gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG5JbmRleCA9IE5vcm1hbGl6ZUNhcmV0UG9zKG5JbmRleCwgRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJELCBiQmVmb3JlKTsNCisgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgIGlmIChuSW5kZXggPj0gMCkgew0KKyAgICAgICAgICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCBiQmVmb3JlKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgTUNfVXA6IHsNCisgICAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgICBGWF9CT09MIGJCZWZvcmUgPSBUUlVFOw0KKyAgICAgICAgaW50MzJfdCBuSW5kZXggPSBNb3ZlQmFja3dhcmQoYkJlZm9yZSk7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICAgICAgaWYgKG1fQmxvY2tBcnJheS5HZXRTaXplKCkpIHsNCisgICAgICAgICAgbkluZGV4ID0NCisgICAgICAgICAgICAgIE5vcm1hbGl6ZUNhcmV0UG9zKG5JbmRleCwgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCwgYkJlZm9yZSk7DQorICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICBpZiAobkluZGV4ID49IDApIHsNCisgICAgICAgICAgVXBkYXRlQ2FyZXRSZWN0KG5JbmRleCwgYkJlZm9yZSk7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9Qb2ludEYgcHRDYXJldDsNCisgICAgICAgIGlmIChNb3ZlVXAocHRDYXJldCkpIHsNCisgICAgICAgICAgVXBkYXRlQ2FyZXRJbmRleChwdENhcmV0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgTUNfRG93bjogew0KKyAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQorICAgICAgICBpbnQzMl90IG5JbmRleCA9IE1vdmVGb3J3YXJkKGJCZWZvcmUpOw0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgICAgICAgIGlmIChtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgIG5JbmRleCA9IE5vcm1hbGl6ZUNhcmV0UG9zKG5JbmRleCwgRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJELCBiQmVmb3JlKTsNCisgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgIGlmIChuSW5kZXggPj0gMCkgew0KKyAgICAgICAgICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCBiQmVmb3JlKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1BvaW50RiBwdENhcmV0Ow0KKyAgICAgICAgaWYgKE1vdmVEb3duKHB0Q2FyZXQpKSB7DQorICAgICAgICAgIFVwZGF0ZUNhcmV0SW5kZXgocHRDYXJldCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIE1DX1dvcmRCYWNrd2FyZDoNCisgICAgICBicmVhazsNCisgICAgY2FzZSBNQ19Xb3JkRm9yd2FyZDoNCisgICAgICBicmVhazsNCisgICAgY2FzZSBNQ19MaW5lU3RhcnQ6DQorICAgICAgTW92ZUxpbmVTdGFydCgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIE1DX0xpbmVFbmQ6DQorICAgICAgTW92ZUxpbmVFbmQoKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBNQ19QYXJhZ1N0YXJ0Og0KKyAgICAgIE1vdmVQYXJhZ1N0YXJ0KCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgTUNfUGFyYWdFbmQ6DQorICAgICAgTW92ZVBhcmFnRW5kKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgTUNfUGFnZURvd246DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgTUNfUGFnZVVwOg0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIE1DX0hvbWU6DQorICAgICAgTW92ZUhvbWUoKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBNQ19FbmQ6DQorICAgICAgTW92ZUVuZCgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKGJTaGlmdCAmJiBtX25BbmNob3JQb3MgIT0gLTEgJiYgKG1fbkFuY2hvclBvcyAhPSBtX25DYXJldCkpIHsNCisgICAgQWRkU2VsUmFuZ2UoRlhfTUlOKG1fbkFuY2hvclBvcywgbV9uQ2FyZXQpLA0KKyAgICAgICAgICAgICAgICBGWFNZU19hYnMobV9uQW5jaG9yUG9zIC0gbV9uQ2FyZXQpKTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KKyAgfQ0KKyAgaWYgKGJTZWxDaGFuZ2UpIHsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fbkNhcmV0Ow0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpMb2NrKCkgew0KKyAgbV9iTG9jayA9IFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlVubG9jaygpIHsNCisgIG1fYkxvY2sgPSBGQUxTRTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6SXNMb2NrZWQoKSBjb25zdCB7DQorICByZXR1cm4gbV9iTG9jazsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6SW5zZXJ0KGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Mb2NrZWQ7DQorICB9DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgaW50MzJfdCBuQmxvY2tDb3VudCA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQorICBpZiAobkJsb2NrQ291bnQpIHsNCisgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9GSUVMRF9UQUIgJiYgbkxlbmd0aCA9PSAxICYmDQorICAgICAgICBscFRleHRbMF0gPT0gTCdcdCcpIHsNCisgICAgICByZXR1cm4gTW92ZTJOZXh0RWRpdGFibGVGaWVsZChuU3RhcnQpID8gRkRFX1RYVEVEVF9NT0RJRllfUkVUX1RfVGFiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX1RhYjsNCiAgICAgfQ0KLSAgICBpZiAoblJhbmdlQ250ID09IDApIHsNCi0gICAgICAgIEZERV9MUFRYVEVEVFNFTFJBTkdFIGxwU2VsUmFuZ2UgPSBGWF9ORVcgRkRFX1RYVEVEVFNFTFJBTkdFOw0KLSAgICAgICAgbHBTZWxSYW5nZS0+blN0YXJ0CT0gblN0YXJ0Ow0KLSAgICAgICAgbHBTZWxSYW5nZS0+bkNvdW50CT0gbkNvdW50Ow0KLSAgICAgICAgbV9TZWxSYW5nZVB0ckFyci5JbnNlcnRBdChuUmFuZ2VCZ24sIGxwU2VsUmFuZ2UpOw0KKyAgICBpbnQzMl90IG5TZWxSYW5nZUNvdW50ID0gQ291bnRTZWxSYW5nZXMoKTsNCisgICAgaWYgKG5TZWxSYW5nZUNvdW50ID4gMCkgew0KKyAgICAgIGlmIChuU2VsUmFuZ2VDb3VudCA+IDEpIHsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Cb3VuZGFyeTsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBuU2VsU3RhcnQ7DQorICAgICAgaW50MzJfdCBuU2VsQ291bnQ7DQorICAgICAgblNlbENvdW50ID0gR2V0U2VsUmFuZ2UoMCwgblNlbFN0YXJ0KTsNCisgICAgICBpbnQzMl90IG5TZWxFbmQgPSBuU2VsU3RhcnQgKyBuU2VsQ291bnQ7DQorICAgICAgaW50MzJfdCBuQmduID0gMDsNCisgICAgICBpbnQzMl90IG5FbmQgPSAwOw0KKyAgICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IE5VTEw7DQorICAgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkoblNlbFN0YXJ0LCBuQmduLCBuRW5kLCBwRmllbGQpOw0KKyAgICAgIGlmIChuU2VsRW5kID4gbkVuZCkgew0KKyAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0JvdW5kYXJ5Ow0KKyAgICAgIH0NCisgICAgICBpZiAoYkluRmllbGQpIHsNCisgICAgICAgIHBGaWVsZC0+QmFja3VwKCk7DQorICAgICAgICBGWF9CT09MIGJCZWZvcmUgPSBGQUxTRTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGVsOw0KKyAgICAgICAgaW50MzJfdCBuQ2FyZXQ7DQorICAgICAgICBpbnQzMl90IG5JbmRleEluRmllbGQgPSBuU2VsU3RhcnQgLSBuQmduOw0KKyAgICAgICAgaW50MzJfdCBuUmV0ID0gcEZpZWxkLT5SZXBsYWNlKG5TZWxTdGFydCAtIG5CZ24sIG5TZWxDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MobHBUZXh0LCBuTGVuZ3RoKSwgd3NEZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNhcmV0LCBiQmVmb3JlKTsNCisgICAgICAgIHN3aXRjaCAoblJldCkgew0KKyAgICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0ZVTEw6DQorICAgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQorICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQorICAgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfSU5WQUxJREFURToNCisgICAgICAgICAgICBwRmllbGQtPlJlc3RvcmUoKTsNCisgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCisgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRmllbGQ7DQorICAgICAgICBwRmllbGQtPkdldEZpZWxkVGV4dCh3c0ZpZWxkKTsNCisgICAgICAgIGlmICghbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9WYWxpZGF0ZUZpZWxkKHRoaXMsIHBGaWVsZC0+R2V0QmxvY2tJbmRleCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpZWxkLT5HZXRJbmRleCgpLCB3c0ZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpIHsNCisgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQorICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KKyAgICAgICAgcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgICAgICAgaWYgKChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX1ZlcnQpIHx8DQorICAgICAgICAgICAgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfSG9yeikpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgICBHZXRQcmVSZXBsYWNlVGV4dCh3c1RleHQsIG5CZ24sIG5FbmQgLSBuQmduICsgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqKHdzRGlzcGxheSksIHdzRGlzcGxheS5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgIGlmICghSXNGaXRBcmVhKHdzVGV4dCkpIHsNCisgICAgICAgICAgICBwRmllbGQtPlJlc3RvcmUoKTsNCisgICAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfRnVsbDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgUmVwbGFjZShuQmduLCBuRW5kIC0gbkJnbiArIDEsIHdzRGlzcGxheSk7DQorICAgICAgICBpbnQzMl90IG5OZXdDYXJldCA9IG5CZ24gKyBuQ2FyZXQ7DQorICAgICAgICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykpIHsNCisgICAgICAgICAgSUZERV9UeHRFZHREb1JlY29yZCogcFJlY29yZCA9DQorICAgICAgICAgICAgICBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoDQorICAgICAgICAgICAgICAgICAgdGhpcywgbV9uQ2FyZXQsIG5OZXdDYXJldCwgcEZpZWxkLCBuSW5kZXhJbkZpZWxkLCBuQmduLA0KKyAgICAgICAgICAgICAgICAgIHdzRGlzcGxheS5HZXRMZW5ndGgoKSwgd3NEZWwsDQorICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDKGxwVGV4dCwgbkxlbmd0aCksIFRSVUUpOw0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0RvUmVjb3JkOw0KKyAgICAgICAgICBwUmVjb3JkLT5TZXJpYWxpemUoYnNEb1JlY29yZCk7DQorICAgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQWRkRG9SZWNvcmQodGhpcywgYnNEb1JlY29yZCk7DQorICAgICAgICAgIHBSZWNvcmQtPlJlbGVhc2UoKTsNCisgICAgICAgIH0NCisgICAgICAgIFNldENhcmV0UG9zKG5CZ24gKyBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCisgICAgICB9DQorICAgIH0NCisgICAgaW50MzJfdCBuQmduID0gMDsNCisgICAgaW50MzJfdCBuRW5kID0gMDsNCisgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gTlVMTDsNCisgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkobV9uQ2FyZXQsIG5CZ24sIG5FbmQsIHBGaWVsZCk7DQorICAgIGludDMyX3QgbkNhcmV0SW5GaWVsZCA9IG1fbkNhcmV0IC0gbkJnbjsNCisgICAgRlhfQk9PTCBiQmVmb3JlID0gRkFMU0U7DQorICAgIGlmIChiSW5GaWVsZCkgew0KKyAgICAgIHBGaWVsZC0+QmFja3VwKCk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zKGxwVGV4dCwgbkxlbmd0aCk7DQorICAgICAgaW50MzJfdCBuUmV0ID0NCisgICAgICAgICAgcEZpZWxkLT5JbnNlcnQobkNhcmV0SW5GaWVsZCwgd3NJbnMsIG5DYXJldEluRmllbGQsIGJCZWZvcmUpOw0KKyAgICAgIEZYX0JPT0wgYkZ1bGwgPSBGQUxTRTsNCisgICAgICBzd2l0Y2ggKG5SZXQpIHsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfTk9STUFMOg0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfRlVMTDoNCisgICAgICAgICAgYkZ1bGwgPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfRlVMTDoNCisgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQorICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEU6DQorICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX05vcm1hbDsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZDsNCisgICAgICBwRmllbGQtPkdldEZpZWxkVGV4dCh3c0ZpZWxkKTsNCisgICAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGVGaWVsZCgNCisgICAgICAgICAgICAgIHRoaXMsIHBGaWVsZC0+R2V0QmxvY2tJbmRleCgpLCBwRmllbGQtPkdldEluZGV4KCksIHdzRmllbGQsIDApKSB7DQorICAgICAgICBwRmllbGQtPlJlc3RvcmUoKTsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICAgICAgcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgICAgIGlmICgobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9WZXJ0KSB8fA0KKyAgICAgICAgICAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6KSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgR2V0UHJlUmVwbGFjZVRleHQod3NUZXh0LCBuQmduLCBuRW5kIC0gbkJnbiArIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiood3NEaXNwbGF5KSwgd3NEaXNwbGF5LkdldExlbmd0aCgpKTsNCisgICAgICAgIGlmICghSXNGaXRBcmVhKHdzVGV4dCkpIHsNCisgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQorICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9GdWxsOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBSZXBsYWNlKG5CZ24sIG5FbmQgLSBuQmduICsgMSwgd3NEaXNwbGF5KTsNCisgICAgICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykpIHsNCisgICAgICAgIElGREVfVHh0RWR0RG9SZWNvcmQqIHBSZWNvcmQgPSBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydCgNCisgICAgICAgICAgICB0aGlzLCBtX25DYXJldCwgcEZpZWxkLCBtX25DYXJldCAtIG5CZ24sIG5CZ24sIG5FbmQgLSBuQmduICsgMSwNCisgICAgICAgICAgICB3c0Rpc3BsYXkuR2V0TGVuZ3RoKCksIENGWF9XaWRlU3RyaW5nQyhscFRleHQsIG5MZW5ndGgpLCBGQUxTRSk7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0RvUmVjb3JkOw0KKyAgICAgICAgcFJlY29yZC0+U2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KKyAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9BZGREb1JlY29yZCh0aGlzLCBic0RvUmVjb3JkKTsNCisgICAgICAgIHBSZWNvcmQtPlJlbGVhc2UoKTsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBuQ2FyZXRQb3MgPSBuQmduICsgbkNhcmV0SW5GaWVsZDsNCisgICAgICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0ZJRUxEX0FVVE8gJiYgYkZ1bGwgJiYNCisgICAgICAgICAgbkNhcmV0UG9zID09IG5FbmQpIHsNCisgICAgICAgIGlmIChNb3ZlMk5leHRFZGl0YWJsZUZpZWxkKG5FbmQsIFRSVUUsIEZBTFNFKSkgew0KKyAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgU2V0Q2FyZXRQb3MobkNhcmV0UG9zLCBiQmVmb3JlKTsNCisgICAgICByZXR1cm4gYkZ1bGwgPyBGREVfVFhURURUX01PRElGWV9SRVRfU19GdWxsDQorICAgICAgICAgICAgICAgICAgIDogRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX05vcm1hbDsNCisgIH0NCisjZW5kaWYNCisgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgIEZYX1dDSEFSKiBscEJ1ZmZlciA9IHdzVGVtcC5HZXRCdWZmZXIobkxlbmd0aCk7DQorICBGWFNZU19tZW1jcHkobHBCdWZmZXIsIGxwVGV4dCwgbkxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgUmVwbGFjZVBhcmFnRW5kKGxwQnVmZmVyLCBuTGVuZ3RoLCBGQUxTRSk7DQorICB3c1RlbXAuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCisgIEZYX0JPT0wgYlBhcnQgPSBGQUxTRTsNCisgIGlmIChtX25MaW1pdCA+IDApIHsNCisgICAgaW50MzJfdCBuVG90YWxMZW5ndGggPSBHZXRUZXh0QnVmTGVuZ3RoKCk7DQorICAgIGludDMyX3QgbkRlbExlbmd0aCA9IDA7DQorICAgIGludDMyX3QgbkNvdW50ID0gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgICAgRkRFX0xQVFhURURUU0VMUkFOR0UgbHBTZWxSYW5nZSA9IG1fU2VsUmFuZ2VQdHJBcnIuR2V0QXQoaSk7DQorICAgICAgblRvdGFsTGVuZ3RoIC09IGxwU2VsUmFuZ2UtPm5Db3VudDsNCisgICAgfQ0KKyAgICBpbnQzMl90IG5FeHBlY3RMZW5ndGggPSBuVG90YWxMZW5ndGggKyBuTGVuZ3RoOw0KKyAgICBpZiAoblRvdGFsTGVuZ3RoID09IG1fbkxpbWl0KSB7DQorICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQorICAgIH0NCisgICAgaWYgKG5FeHBlY3RMZW5ndGggPiBtX25MaW1pdCkgew0KKyAgICAgIG5MZW5ndGggLT0gKG5FeHBlY3RMZW5ndGggLSBtX25MaW1pdCk7DQorICAgICAgYlBhcnQgPSBUUlVFOw0KKyAgICB9DQorICB9DQorICBpZiAoKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfVmVydCkgfHwNCisgICAgICAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6KSkgew0KKyAgICBpbnQzMl90IG5UZW1wID0gbkxlbmd0aDsNCisgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9QYXNzd29yZCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICB3aGlsZSAobkxlbmd0aCA+IDApIHsNCisgICAgICAgIEdldFByZUluc2VydFRleHQod3NUZXh0LCBtX25DYXJldCwgbHBCdWZmZXIsIG5MZW5ndGgpOw0KKyAgICAgICAgaW50MzJfdCBuVG90YWwgPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICAgICAgICBGWF9XQ0hBUiogbHBCdWYgPSB3c1RleHQuR2V0QnVmZmVyKG5Ub3RhbCk7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuVG90YWw7IGkrKykgew0KKyAgICAgICAgICBscEJ1ZltpXSA9IG1fd2NBbGlhc0NoYXI7DQorICAgICAgICB9DQorICAgICAgICB3c1RleHQuUmVsZWFzZUJ1ZmZlcihuVG90YWwpOw0KKyAgICAgICAgaWYgKElzRml0QXJlYSh3c1RleHQpKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkxlbmd0aC0tOw0KKyAgICAgIH0NCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIGxwVGVtcCA9IG1fU2VsUmFuZ2VQdHJBcnJbblJhbmdlQmduXTsNCi0gICAgICAgIGxwVGVtcC0+blN0YXJ0ID0gblN0YXJ0Ow0KLSAgICAgICAgbHBUZW1wLT5uQ291bnQgPSBuQ291bnQ7DQotICAgICAgICBuUmFuZ2VDbnQgLS07DQotICAgICAgICBuUmFuZ2VCZ24gKys7DQotICAgICAgICB3aGlsZSAoblJhbmdlQ250LS0pIHsNCi0gICAgICAgICAgICBkZWxldGUgbV9TZWxSYW5nZVB0ckFycltuUmFuZ2VCZ25dOw0KLSAgICAgICAgICAgIG1fU2VsUmFuZ2VQdHJBcnIuUmVtb3ZlQXQoblJhbmdlQmduKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgd2hpbGUgKG5MZW5ndGggPiAwKSB7DQorICAgICAgICBHZXRQcmVJbnNlcnRUZXh0KHdzVGV4dCwgbV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsNCisgICAgICAgIGlmIChJc0ZpdEFyZWEod3NUZXh0KSkgew0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCisgICAgICAgIG5MZW5ndGgtLTsNCisgICAgICB9DQogICAgIH0NCisgICAgaWYgKG5MZW5ndGggPT0gMCkgew0KKyAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9GdWxsOw0KKyAgICB9DQorICAgIGlmIChuTGVuZ3RoIDwgblRlbXApIHsNCisgICAgICBiUGFydCA9IFRSVUU7DQorICAgIH0NCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBHZXRQcmVJbnNlcnRUZXh0KHdzVGV4dCwgbV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsNCisgICAgaWYgKCFtX1BhcmFtLnBFdmVudFNpbmstPk9uX1ZhbGlkYXRlKHRoaXMsIHdzVGV4dCkpIHsNCisgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKElzU2VsZWN0KCkpIHsNCisgICAgRGVsZXRlU2VsZWN0KCk7DQorICB9DQorICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykpIHsNCisgICAgSUZERV9UeHRFZHREb1JlY29yZCogcFJlY29yZCA9DQorICAgICAgICBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQodGhpcywgbV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCisgICAgcFJlY29yZC0+U2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0FkZERvUmVjb3JkKHRoaXMsIGJzRG9SZWNvcmQpOw0KKyAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQorICB9DQorICBHZXRUZXh0KG1fQ2hhbmdlSW5mby53c1ByZXZUZXh0LCAwKTsNCisgIElubmVyX0luc2VydChtX25DYXJldCwgbHBCdWZmZXIsIG5MZW5ndGgpOw0KKyAgbV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0Ow0KKyAgbV9DaGFuZ2VJbmZvLndzSW5zZXJ0ID0gQ0ZYX1dpZGVTdHJpbmcobHBCdWZmZXIsIG5MZW5ndGgpOw0KKyAgblN0YXJ0ID0gbV9uQ2FyZXQ7DQorICBuU3RhcnQgKz0gbkxlbmd0aDsNCisgIEZYX1dDSEFSIHdDaGFyID0gbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQgLSAxKTsNCisgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQorICBpZiAod0NoYXIgIT0gTCdcbicgJiYgd0NoYXIgIT0gTCdccicpIHsNCisgICAgblN0YXJ0LS07DQorICAgIGJCZWZvcmUgPSBGQUxTRTsNCisgIH0NCisgIFNldENhcmV0UG9zKG5TdGFydCwgYkJlZm9yZSk7DQorICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1RleHRDaGFuZ2VkKHRoaXMsIG1fQ2hhbmdlSW5mbyk7DQorICByZXR1cm4gYlBhcnQgPyBGREVfVFhURURUX01PRElGWV9SRVRfU19QYXJ0IDogRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpEZWxldGUoaW50MzJfdCBuU3RhcnQsIEZYX0JPT0wgYkJhY2tzcGFjZSkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZDsNCisgIH0NCisgIGlmIChJc1NlbGVjdCgpKSB7DQorICAgIERlbGV0ZVNlbGVjdCgpOw0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KKyAgfQ0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgIGludDMyX3QgbkJsb2NrQ291bnQgPSBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKG5CbG9ja0NvdW50ID4gMCkgew0KKyAgICBpZiAoYkJhY2tzcGFjZSkgew0KKyAgICAgIG5TdGFydC0tOw0KKyAgICB9DQorICAgIGludDMyX3QgbkNvdW50ID0gMTsNCisgICAgaW50MzJfdCBuQmduID0gMDsNCisgICAgaW50MzJfdCBuRW5kID0gMDsNCisgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gTlVMTDsNCisgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkoblN0YXJ0LCBuQmduLCBuRW5kLCBwRmllbGQpOw0KKyAgICBpbnQzMl90IG5DYXJldEluRmllbGQgPSBuU3RhcnQgLSBuQmduOw0KKyAgICBGWF9CT09MIGJCZWZvcmUgPSBGQUxTRTsNCisgICAgaWYgKGJJbkZpZWxkICYmICFwRmllbGQtPklzRml4KCkpIHsNCisgICAgICBwRmllbGQtPkJhY2t1cCgpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGVsOw0KKyAgICAgIGludDMyX3QgbkNhcmV0ID0gMDsNCisgICAgICBpbnQzMl90IG5SZXQgPQ0KKyAgICAgICAgICBwRmllbGQtPkRlbGV0ZShuQ2FyZXRJbkZpZWxkLCBuQ291bnQsIHdzRGVsLCBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgICAgIG5DYXJldCArPSBuQmduOw0KKyAgICAgIHN3aXRjaCAoblJldCkgew0KKyAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfUzoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0lOVkFMSURBVEU6DQorICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWToNCisgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0JvdW5kYXJ5Ow0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZDsNCisgICAgICBwRmllbGQtPkdldEZpZWxkVGV4dCh3c0ZpZWxkKTsNCisgICAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGVGaWVsZCgNCisgICAgICAgICAgICAgIHRoaXMsIHBGaWVsZC0+R2V0QmxvY2tJbmRleCgpLCBwRmllbGQtPkdldEluZGV4KCksIHdzRmllbGQsIDApKSB7DQorICAgICAgICBwRmllbGQtPlJlc3RvcmUoKTsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICAgICAgcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgICAgIFJlcGxhY2UobkJnbiwgbkVuZCAtIG5CZ24gKyAxLCB3c0Rpc3BsYXkpOw0KKyAgICAgIGlmICghKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9Ob1JlZG9VbmRvKSkgew0KKyAgICAgICAgSUZERV9UeHRFZHREb1JlY29yZCogcFJlY29yZCA9IEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKA0KKyAgICAgICAgICAgIHRoaXMsIG5TdGFydCwgcEZpZWxkLCBuQ2FyZXRJbkZpZWxkLCBuQmduLCBuRW5kIC0gbkJnbiArIDEsDQorICAgICAgICAgICAgd3NEaXNwbGF5LkdldExlbmd0aCgpLCB3c0RlbCwgRkFMU0UpOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCisgICAgICAgIHBSZWNvcmQtPlNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCisgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQWRkRG9SZWNvcmQodGhpcywgYnNEb1JlY29yZCk7DQorICAgICAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQorICAgICAgfQ0KKyAgICAgIFNldENhcmV0UG9zKG5TdGFydCwgYkJlZm9yZSk7DQorICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCisgICAgfQ0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnk7DQorICB9DQorI2VuZGlmDQorICBpbnQzMl90IG5Db3VudCA9IDE7DQorICBpZiAoYkJhY2tzcGFjZSkgew0KKyAgICBpZiAoblN0YXJ0ID09IDApIHsNCisgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnk7DQorICAgIH0NCisgICAgaWYgKG5TdGFydCA+IDIgJiYgbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQgLSAxKSA9PSBMJ1xuJyAmJg0KKyAgICAgICAgbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQgLSAyKSA9PSBMJ1xyJykgew0KKyAgICAgIG5TdGFydC0tOw0KKyAgICAgIG5Db3VudCsrOw0KKyAgICB9DQorICAgIG5TdGFydC0tOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG5TdGFydCA9PSBHZXRUZXh0QnVmTGVuZ3RoKCkpIHsNCisgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfRnVsbDsNCisgICAgfQ0KKyAgICBpZiAoKG5TdGFydCArIDEgPCBHZXRUZXh0QnVmTGVuZ3RoKCkpICYmDQorICAgICAgICAobV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQpID09IEwnXHInKSAmJg0KKyAgICAgICAgKG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoblN0YXJ0ICsgMSkgPT0gTCdcbicpKSB7DQorICAgICAgbkNvdW50Kys7DQorICAgIH0NCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBHZXRQcmVEZWxldGVUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KKyAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGUodGhpcywgd3NUZXh0KSkgew0KKyAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICB9DQorICB9DQorICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSYW5nZTsNCisgICAgbV9wVHh0QnVmLT5HZXRSYW5nZSh3c1JhbmdlLCBuU3RhcnQsIG5Db3VudCk7DQorICAgIElGREVfVHh0RWR0RG9SZWNvcmQqIHBSZWNvcmQgPQ0KKyAgICAgICAgRlhfTkVXIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UodGhpcywgblN0YXJ0LCBtX25DYXJldCwgd3NSYW5nZSk7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRG9SZWNvcmQ7DQorICAgIHBSZWNvcmQtPlNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9BZGREb1JlY29yZCh0aGlzLCBic0RvUmVjb3JkKTsNCisgICAgcFJlY29yZC0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgbV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfRGVsZXRlOw0KKyAgR2V0VGV4dChtX0NoYW5nZUluZm8ud3NEZWxldGUsIG5TdGFydCwgbkNvdW50KTsNCisgIElubmVyX0RlbGV0ZVJhbmdlKG5TdGFydCwgbkNvdW50KTsNCisgIFNldENhcmV0UG9zKG5TdGFydCArICgoIWJCYWNrc3BhY2UgJiYgblN0YXJ0ID4gMCkgPyAtMSA6IDApLA0KKyAgICAgICAgICAgICAgKGJCYWNrc3BhY2UgfHwgblN0YXJ0ID09IDApKTsNCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQodGhpcywgbV9DaGFuZ2VJbmZvKTsNCisgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkRlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZDsNCisgIH0NCisgIGlmIChuQ291bnQgPT0gLTEpIHsNCisgICAgbkNvdW50ID0gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KKyAgfQ0KKyAgaWYgKG5Db3VudCA9PSAwKSB7DQorICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7DQorICB9DQorICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX1ZhbGlkYXRlKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgR2V0UHJlRGVsZXRlVGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCisgICAgaWYgKCFtX1BhcmFtLnBFdmVudFNpbmstPk9uX1ZhbGlkYXRlKHRoaXMsIHdzVGV4dCkpIHsNCisgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCisgICAgfQ0KKyAgfQ0KKyAgRGVsZXRlUmFuZ2VfRG9SZWNvcmQoblN0YXJ0LCBuQ291bnQpOw0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZCh0aGlzLCBtX0NoYW5nZUluZm8pOw0KKyAgU2V0Q2FyZXRQb3MoblN0YXJ0LCBUUlVFKTsNCisgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlcGxhY2UoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZXBsYWNlKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfTG9ja2VkOw0KKyAgfQ0KKyAgaWYgKG5TdGFydCA8IDAgfHwgKG5TdGFydCArIG5MZW5ndGggPiBHZXRUZXh0QnVmTGVuZ3RoKCkpKSB7DQorICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Cb3VuZGFyeTsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBHZXRQcmVSZXBsYWNlVGV4dCh3c1RleHQsIG5TdGFydCwgbkxlbmd0aCwgd3NSZXBsYWNlLmNfc3RyKCksDQorICAgICAgICAgICAgICAgICAgICAgIHdzUmVwbGFjZS5HZXRMZW5ndGgoKSk7DQorICAgIGlmICghbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9WYWxpZGF0ZSh0aGlzLCB3c1RleHQpKSB7DQorICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0ludmFsaWRhdGU7DQorICAgIH0NCisgIH0NCisgIGlmIChJc1NlbGVjdCgpKSB7DQorICAgIENsZWFyU2VsZWN0aW9uKCk7DQorICB9DQorICBtX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUgPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9SZXBsYWNlOw0KKyAgR2V0VGV4dChtX0NoYW5nZUluZm8ud3NEZWxldGUsIG5TdGFydCwgbkxlbmd0aCk7DQorICBpZiAobkxlbmd0aCA+IDApIHsNCisgICAgSW5uZXJfRGVsZXRlUmFuZ2UoblN0YXJ0LCBuTGVuZ3RoKTsNCisgIH0NCisgIGludDMyX3QgblRleHRMZW5ndGggPSB3c1JlcGxhY2UuR2V0TGVuZ3RoKCk7DQorICBpZiAoblRleHRMZW5ndGggPiAwKSB7DQorICAgIElubmVyX0luc2VydChuU3RhcnQsIHdzUmVwbGFjZS5jX3N0cigpLCBuVGV4dExlbmd0aCk7DQorICB9DQorICBtX0NoYW5nZUluZm8ud3NJbnNlcnQgPSBDRlhfV2lkZVN0cmluZyh3c1JlcGxhY2UuY19zdHIoKSwgblRleHRMZW5ndGgpOw0KKyAgblN0YXJ0ICs9IG5UZXh0TGVuZ3RoOw0KKyAgRlhfV0NIQVIgd0NoYXIgPSBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5TdGFydCAtIDEpOw0KKyAgRlhfQk9PTCBiQmVmb3JlID0gVFJVRTsNCisgIGlmICh3Q2hhciAhPSBMJ1xuJyAmJiB3Q2hhciAhPSBMJ1xyJykgew0KKyAgICBuU3RhcnQtLTsNCisgICAgYkJlZm9yZSA9IEZBTFNFOw0KKyAgfQ0KKyAgU2V0Q2FyZXRQb3MoblN0YXJ0LCBiQmVmb3JlKTsNCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlTG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZCh0aGlzLCBtX0NoYW5nZUluZm8pOw0KKyAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0TGltaXQoaW50MzJfdCBuTGltaXQpIHsNCisgIG1fbkxpbWl0ID0gbkxpbWl0Ow0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpTZXRBbGlhc0NoYXIoRlhfV0NIQVIgd2NBbGlhcykgew0KKyAgbV93Y0FsaWFzQ2hhciA9IHdjQWxpYXM7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldEZvcm1hdEJsb2NrKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Jsb2NrRm9ybWF0KSB7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgaWYgKG1fbkZpeExlbmd0aCA9PSAtMSkgew0KKyAgICBtX25GaXhMZW5ndGggPSBHZXRUZXh0TGVuZ3RoKCk7DQorICAgIEZYU1lTX2Fzc2VydChtX3dzRml4VGV4dC5Jc0VtcHR5KCkpOw0KKyAgICBHZXRUZXh0KG1fd3NGaXhUZXh0LCAwLCAtMSk7DQorICB9DQorICBGWF9CT09MIGJJbkJsb2NrID0gRkFMU0U7DQorICBpbnQzMl90IG5DaGFySW5kZXggPSAwOw0KKyAgaW50MzJfdCBuQmxvY2tJbmRleCA9IDA7DQorICBpbnQzMl90IG5CbG9ja1BvcyA9IC0xOw0KKyAgRlhfV0NIQVIgd2M7DQorICBDRkRFX1R4dEVkdEJ1Zkl0ZXIqIHBJdGVyID0NCisgICAgICBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmLCBGQUxTRSk7DQorICBwSXRlci0+U2V0QXQoMCk7DQorICBkbyB7DQorICAgIHdjID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgaWYgKGJJbkJsb2NrKSB7DQorICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5EKSB7DQorICAgICAgICBuQmxvY2tJbmRleCsrOw0KKyAgICAgICAgYkluQmxvY2sgPSBGQUxTRTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOKSB7DQorICAgICAgICBiSW5CbG9jayA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChuQ2hhckluZGV4KysgPT0gbkluZGV4KSB7DQorICAgICAgICAgIG5CbG9ja1BvcyA9IHBJdGVyLT5HZXRBdCgpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KCkpOw0KKyAgcEl0ZXItPlJlbGVhc2UoKTsNCisgIGlmIChuQmxvY2tQb3MgPT0gLTEpIHsNCisgICAgbkJsb2NrUG9zID0gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KKyAgfQ0KKyAgQ0ZERV9UeHRFZHRCbG9jayogcEVkaXRCbG9jayA9DQorICAgICAgRlhfTkVXIENGREVfVHh0RWR0QmxvY2sodGhpcywgd3NCbG9ja0Zvcm1hdCwgbkluZGV4KTsNCisgIG1fQmxvY2tBcnJheS5JbnNlcnRBdChtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpLCBwRWRpdEJsb2NrKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgIHBFZGl0QmxvY2stPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICBtX25DYXJldCA9IG5CbG9ja1BvczsNCisgIGlmICh3c0Rpc3BsYXkuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgIFJhd0luc2VydChuQmxvY2tQb3MsIGNvbnN0IEZYX1dDSEFSKih3c0Rpc3BsYXkpLCB3c0Rpc3BsYXkuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyNlbmRpZg0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpDb3VudEVkaXRCbG9ja3MoKSBjb25zdCB7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgcmV0dXJuIG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQorI2Vsc2UNCisgIHJldHVybiAwOw0KKyNlbmRpZg0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpHZXRFZGl0QmxvY2tUZXh0KGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQmxvY2tUZXh0KSBjb25zdCB7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgQ0ZERV9UeHRFZHRCbG9jayogcEJsb2NrID0gbV9CbG9ja0FycmF5W25JbmRleF07DQorICBwQmxvY2stPkdldEJsb2NrVGV4dCh3c0Jsb2NrVGV4dCk7DQorI2VuZGlmDQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkNvdW50RWRpdEZpZWxkcyhpbnQzMl90IG5CbG9ja0luZGV4KSBjb25zdCB7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgQ0ZERV9UeHRFZHRCbG9jayogcEJsb2NrID0gbV9CbG9ja0FycmF5W25CbG9ja0luZGV4XTsNCisgIHJldHVybiBwQmxvY2stPkNvdW50RmllbGQoKTsNCisjZWxzZQ0KKyAgcmV0dXJuIDA7DQorI2VuZGlmDQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldEVkaXRGaWVsZFRleHQoaW50MzJfdCBuQmxvY2tJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZFRleHQpIGNvbnN0IHsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICBDRkRFX1R4dEVkdEJsb2NrKiBwQmxvY2sgPSBtX0Jsb2NrQXJyYXlbbkJsb2NrSW5kZXhdOw0KKyAgcEJsb2NrLT5HZXRGaWVsZFRleHQobkZpZWxkSW5kZXgsIHdzRmllbGRUZXh0KTsNCisjZW5kaWYNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U3RhcnRFZGl0KCkgew0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisjZW5kaWYNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6RW5kRWRpdCgpIHsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorI2VuZGlmDQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlbW92ZVNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgew0KKyAgRkRFX0xQVFhURURUU0VMUkFOR0UgbHBUZW1wID0gTlVMTDsNCisgIGludDMyX3QgblJhbmdlQ291bnQgPSBtX1NlbFJhbmdlUHRyQXJyLkdldFNpemUoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgblJhbmdlQ291bnQ7IGkrKykgew0KKyAgICBscFRlbXAgPSBtX1NlbFJhbmdlUHRyQXJyW2ldOw0KKyAgICBpZiAobHBUZW1wLT5uU3RhcnQgPT0gblN0YXJ0ICYmIGxwVGVtcC0+bkNvdW50ID09IG5Db3VudCkgew0KKyAgICAgIGRlbGV0ZSBscFRlbXA7DQorICAgICAgbV9TZWxSYW5nZVB0ckFyci5SZW1vdmVBdChpKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIHJldHVybjsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6QWRkU2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSB7DQorICBpZiAobkNvdW50ID09IC0xKSB7DQorICAgIG5Db3VudCA9IEdldFRleHRMZW5ndGgoKSAtIG5TdGFydDsNCisgIH0NCisgIGludDMyX3QgblNpemUgPSBtX1NlbFJhbmdlUHRyQXJyLkdldFNpemUoKTsNCisgIGlmIChuU2l6ZSA8PSAwKSB7DQorICAgIEZERV9MUFRYVEVEVFNFTFJBTkdFIGxwU2VsUmFuZ2UgPSBGWF9ORVcgRkRFX1RYVEVEVFNFTFJBTkdFOw0KKyAgICBscFNlbFJhbmdlLT5uU3RhcnQgPSBuU3RhcnQ7DQorICAgIGxwU2VsUmFuZ2UtPm5Db3VudCA9IG5Db3VudDsNCisgICAgbV9TZWxSYW5nZVB0ckFyci5BZGQobHBTZWxSYW5nZSk7DQogICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fU2VsQ2hhbmdlZCh0aGlzKTsNCiAgICAgcmV0dXJuOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpDb3VudFNlbFJhbmdlcygpDQotew0KLSAgICByZXR1cm4gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCk7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpDQotew0KLSAgICBuU3RhcnQgPSBtX1NlbFJhbmdlUHRyQXJyW25JbmRleF0tPm5TdGFydDsNCi0gICAgcmV0dXJuIG1fU2VsUmFuZ2VQdHJBcnJbbkluZGV4XS0+bkNvdW50Ow0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpDbGVhclNlbGVjdGlvbigpDQotew0KLSAgICBpbnQzMl90IG5Db3VudCA9IG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpOw0KLSAgICBGREVfTFBUWFRFRFRTRUxSQU5HRSBscFJhbmdlID0gTlVMTDsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgbHBSYW5nZSA9IG1fU2VsUmFuZ2VQdHJBcnJbaV07DQotICAgICAgICBpZiAobHBSYW5nZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgZGVsZXRlIGxwUmFuZ2U7DQotICAgICAgICAgICAgbHBSYW5nZSA9IE5VTEw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9TZWxSYW5nZVB0ckFyci5SZW1vdmVBbGwoKTsNCi0gICAgaWYgKG5Db3VudCAmJiBtX1BhcmFtLnBFdmVudFNpbmspIHsNCi0gICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fU2VsQ2hhbmdlZCh0aGlzKTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWRvKQ0KLXsNCi0gICAgaWYgKElzTG9ja2VkKCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBJRkRFX1R4dEVkdERvUmVjb3JkICogcERvUmVjb3JkID0gSUZERV9UeHRFZHREb1JlY29yZDo6Q3JlYXRlKGJzUmVkbyk7DQotICAgIEZYU1lTX2Fzc2VydChwRG9SZWNvcmQpOw0KLSAgICBpZiAocERvUmVjb3JkID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJPSyA9IHBEb1JlY29yZC0+UmVkbygpOw0KLSAgICBwRG9SZWNvcmQtPlJlbGVhc2UoKTsNCi0gICAgcmV0dXJuIGJPSzsNCi19DQotRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6VW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVW5kbykNCi17DQotICAgIGlmIChJc0xvY2tlZCgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9Ob1JlZG9VbmRvKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgSUZERV9UeHRFZHREb1JlY29yZCAqIHBEb1JlY29yZCA9IElGREVfVHh0RWR0RG9SZWNvcmQ6OkNyZWF0ZShic1VuZG8pOw0KLSAgICBGWFNZU19hc3NlcnQocERvUmVjb3JkKTsNCi0gICAgaWYgKHBEb1JlY29yZCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiT0sgPSBwRG9SZWNvcmQtPlVuZG8oKTsNCi0gICAgcERvUmVjb3JkLT5SZWxlYXNlKCk7DQotICAgIHJldHVybiBiT0s7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OlN0YXJ0TGF5b3V0KCkNCi17DQotICAgIExvY2soKTsNCi0gICAgUmVtb3ZlQWxsUGFnZXMoKTsNCi0gICAgbV9uTGF5b3V0UG9zID0gMDsNCi0gICAgbV9uTGluZUNvdW50ID0gMDsNCi0gICAgcmV0dXJuIDA7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkRvTGF5b3V0KElGWF9QYXVzZSAqIHBQYXVzZSkNCi17DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsNCi0gICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZyA9IE5VTEw7DQotICAgIGludDMyX3QgbkxpbmVDb3VudCA9IDA7DQotICAgIGZvciAoOyBtX25MYXlvdXRQb3MgPCBuQ291bnQ7IG1fbkxheW91dFBvcyArKykgew0KLSAgICAgICAgcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W21fbkxheW91dFBvc107DQotICAgICAgICBwUGFyYWctPkNhbGNMaW5lcygpOw0KLSAgICAgICAgbkxpbmVDb3VudCArPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCi0gICAgICAgIGlmICgocFBhdXNlICE9IE5VTEwpICYmIChuTGluZUNvdW50ID4gbV9uUGFnZUxpbmVDb3VudCkgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQotICAgICAgICAgICAgbV9uTGluZUNvdW50ICs9IG5MaW5lQ291bnQ7DQotICAgICAgICAgICAgcmV0dXJuICgrK21fbkxheW91dFBvcyAgKiAxMDApIC8gbkNvdW50Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fbkxpbmVDb3VudCArPSBuTGluZUNvdW50Ow0KLSAgICByZXR1cm4gMTAwOw0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpFbmRMYXlvdXQoKQ0KLXsNCi0gICAgVXBkYXRlUGFnZXMoKTsNCi0gICAgaW50MzJfdCBuTGVuZ3RoID0gR2V0VGV4dExlbmd0aCgpOw0KLSAgICBpZiAobV9uQ2FyZXQgPiBuTGVuZ3RoKSB7DQotICAgICAgICBtX25DYXJldCA9IG5MZW5ndGg7DQotICAgIH0NCi0gICAgaW50MzJfdCBuSW5kZXggPSBtX25DYXJldDsNCi0gICAgaWYgKCFtX2JCZWZvcmUpIHsNCi0gICAgICAgIG5JbmRleCAtLTsNCi0gICAgfQ0KLSAgICBtX3J0Q2FyZXQuU2V0KDAsIDAsIDEsIG1fUGFyYW0uZkZvbnRTaXplKTsNCi0gICAgVW5sb2NrKCk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok9wdGltaXplKElGWF9QYXVzZSAqIHBQYXVzZSApDQotew0KLSAgICByZXR1cm4gbV9wVHh0QnVmLT5PcHRpbWl6ZShwUGF1c2UpOw0KLX0NCi1JRkRFX1R4dEVkdEJ1ZiAqIENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0QnVmKCkgY29uc3QNCi17DQotICAgIHJldHVybiAoSUZERV9UeHRFZHRCdWYqKW1fcFR4dEJ1ZjsNCi19DQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0VGV4dEJ1Zkxlbmd0aCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkgLSAxOw0KLX0NCi1JRlhfVHh0QnJlYWsgKiBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0VGV4dEJyZWFrKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3BUZXh0QnJlYWs7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldExpbmVDb3VudCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9uTGluZUNvdW50Ow0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpHZXRQYWdlTGluZUNvdW50KCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX25QYWdlTGluZUNvdW50Ow0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpDb3VudFBhcmFncygpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsNCi19DQotSUZERV9UeHRFZHRQYXJhZyogQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFBhcmFnKGludDMyX3QgblBhcmFnSW5kZXgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9QYXJhZ1B0ckFycmF5W25QYXJhZ0luZGV4XTsNCi19DQotSUZYX0NoYXJJdGVyKiBDRkRFX1R4dEVkdEVuZ2luZTo6Q3JlYXRlQ2hhckl0ZXIoKQ0KLXsNCi0gICAgaWYgKCFtX3BUeHRCdWYpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmKTsNCi19DQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6TGluZTJQYXJhZyhpbnQzMl90IG5TdGFydFBhcmFnLCBpbnQzMl90IG5TdGFydExpbmVvZlBhcmFnLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGluZUluZGV4LCBpbnQzMl90ICZuU3RhcnRMaW5lKSBjb25zdA0KLXsNCi0gICAgaW50MzJfdCBuTGluZVRvdGFsID0gblN0YXJ0TGluZW9mUGFyYWc7DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsNCi0gICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZyA9IE5VTEw7DQotICAgIGludDMyX3QgaSA9IG5TdGFydFBhcmFnOw0KLSAgICBmb3IgKDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W2ldOw0KLSAgICAgICAgbkxpbmVUb3RhbCArPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCi0gICAgICAgIGlmIChuTGluZVRvdGFsID4gbkxpbmVJbmRleCkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG5TdGFydExpbmUgPSBuTGluZVRvdGFsIC0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQotICAgIHJldHVybiBpOw0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpHZXRQcmVEZWxldGVUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgbkluZGV4LCBpbnQzMl90IG5MZW5ndGgpDQotew0KLSAgICBHZXRUZXh0KHdzVGV4dCwgMCwgR2V0VGV4dEJ1Zkxlbmd0aCgpKTsNCi0gICAgd3NUZXh0LkRlbGV0ZShuSW5kZXgsIG5MZW5ndGgpOw0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpHZXRQcmVJbnNlcnRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgbkluZGV4LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGgpDQotew0KLSAgICBHZXRUZXh0KHdzVGV4dCwgMCwgR2V0VGV4dEJ1Zkxlbmd0aCgpKTsNCi0gICAgaW50MzJfdCBuU2VsSW5kZXgJPSAwOw0KLSAgICBpbnQzMl90IG5TZWxMZW5ndGgJPSAwOw0KLSAgICBpbnQzMl90IG5TZWxDb3VudAk9IENvdW50U2VsUmFuZ2VzKCk7DQotICAgIHdoaWxlIChuU2VsQ291bnQgLS0pIHsNCi0gICAgICAgIG5TZWxMZW5ndGggPSBHZXRTZWxSYW5nZShuU2VsQ291bnQsIG5TZWxJbmRleCk7DQotICAgICAgICB3c1RleHQuRGVsZXRlKG5TZWxJbmRleCwgblNlbExlbmd0aCk7DQotICAgICAgICBuSW5kZXggPSBuU2VsSW5kZXg7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KLSAgICBpbnQzMl90CW5PbGRMZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKglwT2xkQnVmZmVyID0gd3NUZXh0LmNfc3RyKCk7DQotICAgIEZYX1dDSEFSKiBscEJ1ZmZlciA9IHdzVGVtcC5HZXRCdWZmZXIobk9sZExlbmd0aCArIG5MZW5ndGgpOw0KLSAgICBGWFNZU19tZW1jcHkobHBCdWZmZXIsIHBPbGRCdWZmZXIsIChuSW5kZXgpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIG5JbmRleCwgbHBUZXh0LCBuTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIG5JbmRleCArIG5MZW5ndGgsIHBPbGRCdWZmZXIgKyBuSW5kZXgsIChuT2xkTGVuZ3RoIC0gbkluZGV4KSAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICB3c1RlbXAuUmVsZWFzZUJ1ZmZlcihuT2xkTGVuZ3RoICsgbkxlbmd0aCk7DQotICAgIHdzVGV4dCA9IHdzVGVtcDsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0UHJlUmVwbGFjZVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBuSW5kZXgsIGludDMyX3Qgbk9yaWdpbkxlbmd0aCwgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwgaW50MzJfdCBuTGVuZ3RoKQ0KLXsNCi0gICAgR2V0VGV4dCh3c1RleHQsIDAsIEdldFRleHRCdWZMZW5ndGgoKSk7DQotICAgIGludDMyX3QgblNlbEluZGV4CT0gMDsNCi0gICAgaW50MzJfdCBuU2VsTGVuZ3RoCT0gMDsNCi0gICAgaW50MzJfdCBuU2VsQ291bnQJPSBDb3VudFNlbFJhbmdlcygpOw0KLSAgICB3aGlsZSAoblNlbENvdW50IC0tKSB7DQotICAgICAgICBuU2VsTGVuZ3RoID0gR2V0U2VsUmFuZ2UoblNlbENvdW50LCBuU2VsSW5kZXgpOw0KLSAgICAgICAgd3NUZXh0LkRlbGV0ZShuU2VsSW5kZXgsIG5TZWxMZW5ndGgpOw0KLSAgICB9DQotICAgIHdzVGV4dC5EZWxldGUobkluZGV4LCBuT3JpZ2luTGVuZ3RoKTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yIChpID0gMDsgaSA8IG5MZW5ndGg7IGkgKyspIHsNCi0gICAgICAgIHdzVGV4dC5JbnNlcnQobkluZGV4ICsrLCBscFRleHRbaV0pOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OklubmVyX0luc2VydChpbnQzMl90IG5TdGFydCwgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwgaW50MzJfdCBuTGVuZ3RoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG5MZW5ndGggPiAwKTsNCi0gICAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KLSAgICBUZXh0UG9zMlBhcmFnUG9zKG5TdGFydCwgUGFyYWdQb3MpOw0KLSAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCi0gICAgaW50MzJfdCBuUGFyYWdDb3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGZvciAoaSA9IFBhcmFnUG9zLm5QYXJhZ0luZGV4ICsgMTsgaSA8IG5QYXJhZ0NvdW50OyBpICsrKSB7DQotICAgICAgICBtX1BhcmFnUHRyQXJyYXlbaV0tPm1fbkNoYXJTdGFydCArPSBuTGVuZ3RoOw0KLSAgICB9DQotICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcJPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3MublBhcmFnSW5kZXhdOw0KLSAgICBpbnQzMl90IG5SZXNlcnZlTGluZUNvdW50CT0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQotICAgIGludDMyX3QgblJlc2VydmVDaGFyU3RhcnQJPSBwUGFyYWctPm1fbkNoYXJTdGFydDsNCi0gICAgaW50MzJfdCBuTGVhdmVQYXJ0CQkJPSBQYXJhZ1Bvcy5uQ2hhckluZGV4Ow0KLSAgICBpbnQzMl90IG5DdXRQYXJ0CQkJPSBwUGFyYWctPm1fbkNoYXJDb3VudCAtIFBhcmFnUG9zLm5DaGFySW5kZXg7DQotICAgIGludDMyX3QgblRleHRTdGFydAkJCT0gMDsNCi0gICAgRlhfV0NIQVIgd0N1ckNoYXIJPSBMJyAnOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogbHBQb3MJPSBscFRleHQ7DQotICAgIEZYX0JPT0wgYkZpcnN0CQk9IFRSVUU7DQotICAgIGludDMyX3QgblBhcmFnSW5kZXggPSBQYXJhZ1Bvcy5uUGFyYWdJbmRleDsNCi0gICAgZm9yIChpID0gMDsgaSA8IG5MZW5ndGg7IGkgKyssIGxwUG9zICsrKSB7DQotICAgICAgICB3Q3VyQ2hhciA9ICpscFBvczsNCi0gICAgICAgIGlmICh3Q3VyQ2hhciA9PSBtX3dMaW5lRW5kKSB7DQotICAgICAgICAgICAgaWYgKGJGaXJzdCkgew0KLSAgICAgICAgICAgICAgICBwUGFyYWctPm1fbkNoYXJDb3VudCA9IG5MZWF2ZVBhcnQgKyAoaSAtIG5UZXh0U3RhcnQgKyAxKTsNCi0gICAgICAgICAgICAgICAgcFBhcmFnLT5tX25MaW5lQ291bnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgblJlc2VydmVDaGFyU3RhcnQgKz0gcFBhcmFnLT5tX25DaGFyQ291bnQ7DQotICAgICAgICAgICAgICAgIGJGaXJzdCA9IEZBTFNFOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBQYXJhZyA9IEZYX05FVyBDRkRFX1R4dEVkdFBhcmFnKHRoaXMpOw0KLSAgICAgICAgICAgICAgICBwUGFyYWctPm1fbkxpbmVDb3VudCA9IC0xOw0KLSAgICAgICAgICAgICAgICBwUGFyYWctPm1fbkNoYXJDb3VudCA9IGkgLSBuVGV4dFN0YXJ0ICsgMTsNCi0gICAgICAgICAgICAgICAgcFBhcmFnLT5tX25DaGFyU3RhcnQgPSBuUmVzZXJ2ZUNoYXJTdGFydDsNCi0gICAgICAgICAgICAgICAgbV9QYXJhZ1B0ckFycmF5Lkluc2VydEF0KCsrblBhcmFnSW5kZXgsIHBQYXJhZyk7DQotICAgICAgICAgICAgICAgIG5SZXNlcnZlQ2hhclN0YXJ0ICs9IHBQYXJhZy0+bV9uQ2hhckNvdW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBuVGV4dFN0YXJ0ID0gaSArIDE7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGJGaXJzdCkgew0KLSAgICAgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgKz0gbkxlbmd0aDsNCi0gICAgICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQotICAgICAgICBiRmlyc3QgPSBGQUxTRTsNCisgIH0NCisgIEZERV9MUFRYVEVEVFNFTFJBTkdFIGxwVGVtcCA9IE5VTEw7DQorICBscFRlbXAgPSBtX1NlbFJhbmdlUHRyQXJyW25TaXplIC0gMV07DQorICBpZiAoblN0YXJ0ID49IGxwVGVtcC0+blN0YXJ0ICsgbHBUZW1wLT5uQ291bnQpIHsNCisgICAgRkRFX0xQVFhURURUU0VMUkFOR0UgbHBTZWxSYW5nZSA9IEZYX05FVyBGREVfVFhURURUU0VMUkFOR0U7DQorICAgIGxwU2VsUmFuZ2UtPm5TdGFydCA9IG5TdGFydDsNCisgICAgbHBTZWxSYW5nZS0+bkNvdW50ID0gbkNvdW50Ow0KKyAgICBtX1NlbFJhbmdlUHRyQXJyLkFkZChscFNlbFJhbmdlKTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IG5FbmQgPSBuU3RhcnQgKyBuQ291bnQgLSAxOw0KKyAgRlhfQk9PTCBiQmVnaW4gPSBGQUxTRTsNCisgIGludDMyX3QgblJhbmdlQmduID0gMDsNCisgIGludDMyX3QgblJhbmdlQ250ID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5TaXplOyBpKyspIHsNCisgICAgbHBUZW1wID0gbV9TZWxSYW5nZVB0ckFycltpXTsNCisgICAgaW50MzJfdCBuVGVtcEJnbiA9IGxwVGVtcC0+blN0YXJ0Ow0KKyAgICBpbnQzMl90IG5UZW1wRW5kID0gblRlbXBCZ24gKyBscFRlbXAtPm5Db3VudCAtIDE7DQorICAgIGlmIChiQmVnaW4pIHsNCisgICAgICBpZiAobkVuZCA8IG5UZW1wQmduKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9IGVsc2UgaWYgKG5TdGFydCA+PSBuVGVtcEJnbiAmJiBuU3RhcnQgPD0gblRlbXBFbmQpIHsNCisgICAgICAgIG5SYW5nZUNudCsrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIG5SYW5nZUNudCsrOw0KICAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChuU3RhcnQgPD0gblRlbXBFbmQpIHsNCisgICAgICAgIG5SYW5nZUJnbiA9IGk7DQorICAgICAgICBpZiAobkVuZCA8IG5UZW1wQmduKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgblJhbmdlQ250ID0gMTsNCisgICAgICAgIGJCZWdpbiA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoblJhbmdlQ250ID09IDApIHsNCisgICAgRkRFX0xQVFhURURUU0VMUkFOR0UgbHBTZWxSYW5nZSA9IEZYX05FVyBGREVfVFhURURUU0VMUkFOR0U7DQorICAgIGxwU2VsUmFuZ2UtPm5TdGFydCA9IG5TdGFydDsNCisgICAgbHBTZWxSYW5nZS0+bkNvdW50ID0gbkNvdW50Ow0KKyAgICBtX1NlbFJhbmdlUHRyQXJyLkluc2VydEF0KG5SYW5nZUJnbiwgbHBTZWxSYW5nZSk7DQorICB9IGVsc2Ugew0KKyAgICBscFRlbXAgPSBtX1NlbFJhbmdlUHRyQXJyW25SYW5nZUJnbl07DQorICAgIGxwVGVtcC0+blN0YXJ0ID0gblN0YXJ0Ow0KKyAgICBscFRlbXAtPm5Db3VudCA9IG5Db3VudDsNCisgICAgblJhbmdlQ250LS07DQorICAgIG5SYW5nZUJnbisrOw0KKyAgICB3aGlsZSAoblJhbmdlQ250LS0pIHsNCisgICAgICBkZWxldGUgbV9TZWxSYW5nZVB0ckFycltuUmFuZ2VCZ25dOw0KKyAgICAgIG1fU2VsUmFuZ2VQdHJBcnIuUmVtb3ZlQXQoblJhbmdlQmduKTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KKyAgcmV0dXJuOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpDb3VudFNlbFJhbmdlcygpIHsNCisgIHJldHVybiBtX1NlbFJhbmdlUHRyQXJyLkdldFNpemUoKTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCkgew0KKyAgblN0YXJ0ID0gbV9TZWxSYW5nZVB0ckFycltuSW5kZXhdLT5uU3RhcnQ7DQorICByZXR1cm4gbV9TZWxSYW5nZVB0ckFycltuSW5kZXhdLT5uQ291bnQ7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkNsZWFyU2VsZWN0aW9uKCkgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX1NlbFJhbmdlUHRyQXJyLkdldFNpemUoKTsNCisgIEZERV9MUFRYVEVEVFNFTFJBTkdFIGxwUmFuZ2UgPSBOVUxMOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBscFJhbmdlID0gbV9TZWxSYW5nZVB0ckFycltpXTsNCisgICAgaWYgKGxwUmFuZ2UgIT0gTlVMTCkgew0KKyAgICAgIGRlbGV0ZSBscFJhbmdlOw0KKyAgICAgIGxwUmFuZ2UgPSBOVUxMOw0KKyAgICB9DQorICB9DQorICBtX1NlbFJhbmdlUHRyQXJyLlJlbW92ZUFsbCgpOw0KKyAgaWYgKG5Db3VudCAmJiBtX1BhcmFtLnBFdmVudFNpbmspIHsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWRvKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSUZERV9UeHRFZHREb1JlY29yZCogcERvUmVjb3JkID0gSUZERV9UeHRFZHREb1JlY29yZDo6Q3JlYXRlKGJzUmVkbyk7DQorICBGWFNZU19hc3NlcnQocERvUmVjb3JkKTsNCisgIGlmIChwRG9SZWNvcmQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9CT09MIGJPSyA9IHBEb1JlY29yZC0+UmVkbygpOw0KKyAgcERvUmVjb3JkLT5SZWxlYXNlKCk7DQorICByZXR1cm4gYk9LOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNVbmRvKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSUZERV9UeHRFZHREb1JlY29yZCogcERvUmVjb3JkID0gSUZERV9UeHRFZHREb1JlY29yZDo6Q3JlYXRlKGJzVW5kbyk7DQorICBGWFNZU19hc3NlcnQocERvUmVjb3JkKTsNCisgIGlmIChwRG9SZWNvcmQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9CT09MIGJPSyA9IHBEb1JlY29yZC0+VW5kbygpOw0KKyAgcERvUmVjb3JkLT5SZWxlYXNlKCk7DQorICByZXR1cm4gYk9LOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpTdGFydExheW91dCgpIHsNCisgIExvY2soKTsNCisgIFJlbW92ZUFsbFBhZ2VzKCk7DQorICBtX25MYXlvdXRQb3MgPSAwOw0KKyAgbV9uTGluZUNvdW50ID0gMDsNCisgIHJldHVybiAwOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpEb0xheW91dChJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gTlVMTDsNCisgIGludDMyX3QgbkxpbmVDb3VudCA9IDA7DQorICBmb3IgKDsgbV9uTGF5b3V0UG9zIDwgbkNvdW50OyBtX25MYXlvdXRQb3MrKykgew0KKyAgICBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbbV9uTGF5b3V0UG9zXTsNCisgICAgcFBhcmFnLT5DYWxjTGluZXMoKTsNCisgICAgbkxpbmVDb3VudCArPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgICAgaWYgKChwUGF1c2UgIT0gTlVMTCkgJiYgKG5MaW5lQ291bnQgPiBtX25QYWdlTGluZUNvdW50KSAmJg0KKyAgICAgICAgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgbV9uTGluZUNvdW50ICs9IG5MaW5lQ291bnQ7DQorICAgICAgcmV0dXJuICgrK21fbkxheW91dFBvcyAqIDEwMCkgLyBuQ291bnQ7DQorICAgIH0NCisgIH0NCisgIG1fbkxpbmVDb3VudCArPSBuTGluZUNvdW50Ow0KKyAgcmV0dXJuIDEwMDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6RW5kTGF5b3V0KCkgew0KKyAgVXBkYXRlUGFnZXMoKTsNCisgIGludDMyX3Qgbkxlbmd0aCA9IEdldFRleHRMZW5ndGgoKTsNCisgIGlmIChtX25DYXJldCA+IG5MZW5ndGgpIHsNCisgICAgbV9uQ2FyZXQgPSBuTGVuZ3RoOw0KKyAgfQ0KKyAgaW50MzJfdCBuSW5kZXggPSBtX25DYXJldDsNCisgIGlmICghbV9iQmVmb3JlKSB7DQorICAgIG5JbmRleC0tOw0KKyAgfQ0KKyAgbV9ydENhcmV0LlNldCgwLCAwLCAxLCBtX1BhcmFtLmZGb250U2l6ZSk7DQorICBVbmxvY2soKTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6T3B0aW1pemUoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIHJldHVybiBtX3BUeHRCdWYtPk9wdGltaXplKHBQYXVzZSk7DQorfQ0KK0lGREVfVHh0RWR0QnVmKiBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0VGV4dEJ1ZigpIGNvbnN0IHsNCisgIHJldHVybiAoSUZERV9UeHRFZHRCdWYqKW1fcFR4dEJ1ZjsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0VGV4dEJ1Zkxlbmd0aCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSAtIDE7DQorfQ0KK0lGWF9UeHRCcmVhayogQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFRleHRCcmVhaygpIGNvbnN0IHsNCisgIHJldHVybiBtX3BUZXh0QnJlYWs7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldExpbmVDb3VudCgpIGNvbnN0IHsNCisgIHJldHVybiBtX25MaW5lQ291bnQ7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFBhZ2VMaW5lQ291bnQoKSBjb25zdCB7DQorICByZXR1cm4gbV9uUGFnZUxpbmVDb3VudDsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6Q291bnRQYXJhZ3MoKSBjb25zdCB7DQorICByZXR1cm4gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsNCit9DQorSUZERV9UeHRFZHRQYXJhZyogQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFBhcmFnKGludDMyX3QgblBhcmFnSW5kZXgpIGNvbnN0IHsNCisgIHJldHVybiBtX1BhcmFnUHRyQXJyYXlbblBhcmFnSW5kZXhdOw0KK30NCitJRlhfQ2hhckl0ZXIqIENGREVfVHh0RWR0RW5naW5lOjpDcmVhdGVDaGFySXRlcigpIHsNCisgIGlmICghbV9wVHh0QnVmKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX05FVyBDRkRFX1R4dEVkdEJ1Zkl0ZXIoKENGREVfVHh0RWR0QnVmKiltX3BUeHRCdWYpOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpMaW5lMlBhcmFnKGludDMyX3QgblN0YXJ0UGFyYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydExpbmVvZlBhcmFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGluZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblN0YXJ0TGluZSkgY29uc3Qgew0KKyAgaW50MzJfdCBuTGluZVRvdGFsID0gblN0YXJ0TGluZW9mUGFyYWc7DQorICBpbnQzMl90IG5Db3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBOVUxMOw0KKyAgaW50MzJfdCBpID0gblN0YXJ0UGFyYWc7DQorICBmb3IgKDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtpXTsNCisgICAgbkxpbmVUb3RhbCArPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgICAgaWYgKG5MaW5lVG90YWwgPiBuTGluZUluZGV4KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIG5TdGFydExpbmUgPSBuTGluZVRvdGFsIC0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQorICByZXR1cm4gaTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0UHJlRGVsZXRlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpIHsNCisgIEdldFRleHQod3NUZXh0LCAwLCBHZXRUZXh0QnVmTGVuZ3RoKCkpOw0KKyAgd3NUZXh0LkRlbGV0ZShuSW5kZXgsIG5MZW5ndGgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpHZXRQcmVJbnNlcnRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpIHsNCisgIEdldFRleHQod3NUZXh0LCAwLCBHZXRUZXh0QnVmTGVuZ3RoKCkpOw0KKyAgaW50MzJfdCBuU2VsSW5kZXggPSAwOw0KKyAgaW50MzJfdCBuU2VsTGVuZ3RoID0gMDsNCisgIGludDMyX3QgblNlbENvdW50ID0gQ291bnRTZWxSYW5nZXMoKTsNCisgIHdoaWxlIChuU2VsQ291bnQtLSkgew0KKyAgICBuU2VsTGVuZ3RoID0gR2V0U2VsUmFuZ2UoblNlbENvdW50LCBuU2VsSW5kZXgpOw0KKyAgICB3c1RleHQuRGVsZXRlKG5TZWxJbmRleCwgblNlbExlbmd0aCk7DQorICAgIG5JbmRleCA9IG5TZWxJbmRleDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgIGludDMyX3Qgbk9sZExlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwT2xkQnVmZmVyID0gd3NUZXh0LmNfc3RyKCk7DQorICBGWF9XQ0hBUiogbHBCdWZmZXIgPSB3c1RlbXAuR2V0QnVmZmVyKG5PbGRMZW5ndGggKyBuTGVuZ3RoKTsNCisgIEZYU1lTX21lbWNweShscEJ1ZmZlciwgcE9sZEJ1ZmZlciwgKG5JbmRleCkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIG5JbmRleCwgbHBUZXh0LCBuTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICBGWFNZU19tZW1jcHkobHBCdWZmZXIgKyBuSW5kZXggKyBuTGVuZ3RoLCBwT2xkQnVmZmVyICsgbkluZGV4LA0KKyAgICAgICAgICAgICAgIChuT2xkTGVuZ3RoIC0gbkluZGV4KSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgd3NUZW1wLlJlbGVhc2VCdWZmZXIobk9sZExlbmd0aCArIG5MZW5ndGgpOw0KKyAgd3NUZXh0ID0gd3NUZW1wOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpHZXRQcmVSZXBsYWNlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbk9yaWdpbkxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCkgew0KKyAgR2V0VGV4dCh3c1RleHQsIDAsIEdldFRleHRCdWZMZW5ndGgoKSk7DQorICBpbnQzMl90IG5TZWxJbmRleCA9IDA7DQorICBpbnQzMl90IG5TZWxMZW5ndGggPSAwOw0KKyAgaW50MzJfdCBuU2VsQ291bnQgPSBDb3VudFNlbFJhbmdlcygpOw0KKyAgd2hpbGUgKG5TZWxDb3VudC0tKSB7DQorICAgIG5TZWxMZW5ndGggPSBHZXRTZWxSYW5nZShuU2VsQ291bnQsIG5TZWxJbmRleCk7DQorICAgIHdzVGV4dC5EZWxldGUoblNlbEluZGV4LCBuU2VsTGVuZ3RoKTsNCisgIH0NCisgIHdzVGV4dC5EZWxldGUobkluZGV4LCBuT3JpZ2luTGVuZ3RoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgbkxlbmd0aDsgaSsrKSB7DQorICAgIHdzVGV4dC5JbnNlcnQobkluZGV4KyssIGxwVGV4dFtpXSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OklubmVyX0luc2VydChpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQobkxlbmd0aCA+IDApOw0KKyAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KKyAgVGV4dFBvczJQYXJhZ1BvcyhuU3RhcnQsIFBhcmFnUG9zKTsNCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgaW50MzJfdCBuUGFyYWdDb3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gUGFyYWdQb3MublBhcmFnSW5kZXggKyAxOyBpIDwgblBhcmFnQ291bnQ7IGkrKykgew0KKyAgICBtX1BhcmFnUHRyQXJyYXlbaV0tPm1fbkNoYXJTdGFydCArPSBuTGVuZ3RoOw0KKyAgfQ0KKyAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W1BhcmFnUG9zLm5QYXJhZ0luZGV4XTsNCisgIGludDMyX3QgblJlc2VydmVMaW5lQ291bnQgPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgIGludDMyX3QgblJlc2VydmVDaGFyU3RhcnQgPSBwUGFyYWctPm1fbkNoYXJTdGFydDsNCisgIGludDMyX3QgbkxlYXZlUGFydCA9IFBhcmFnUG9zLm5DaGFySW5kZXg7DQorICBpbnQzMl90IG5DdXRQYXJ0ID0gcFBhcmFnLT5tX25DaGFyQ291bnQgLSBQYXJhZ1Bvcy5uQ2hhckluZGV4Ow0KKyAgaW50MzJfdCBuVGV4dFN0YXJ0ID0gMDsNCisgIEZYX1dDSEFSIHdDdXJDaGFyID0gTCcgJzsNCisgIGNvbnN0IEZYX1dDSEFSKiBscFBvcyA9IGxwVGV4dDsNCisgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsNCisgIGludDMyX3QgblBhcmFnSW5kZXggPSBQYXJhZ1Bvcy5uUGFyYWdJbmRleDsNCisgIGZvciAoaSA9IDA7IGkgPCBuTGVuZ3RoOyBpKyssIGxwUG9zKyspIHsNCisgICAgd0N1ckNoYXIgPSAqbHBQb3M7DQorICAgIGlmICh3Q3VyQ2hhciA9PSBtX3dMaW5lRW5kKSB7DQorICAgICAgaWYgKGJGaXJzdCkgew0KKyAgICAgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgPSBuTGVhdmVQYXJ0ICsgKGkgLSBuVGV4dFN0YXJ0ICsgMSk7DQorICAgICAgICBwUGFyYWctPm1fbkxpbmVDb3VudCA9IC0xOw0KKyAgICAgICAgblJlc2VydmVDaGFyU3RhcnQgKz0gcFBhcmFnLT5tX25DaGFyQ291bnQ7DQorICAgICAgICBiRmlyc3QgPSBGQUxTRTsNCisgICAgICB9IGVsc2Ugew0KICAgICAgICAgcFBhcmFnID0gRlhfTkVXIENGREVfVHh0RWR0UGFyYWcodGhpcyk7DQogICAgICAgICBwUGFyYWctPm1fbkxpbmVDb3VudCA9IC0xOw0KLSAgICAgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgPSBuTGVuZ3RoIC0gblRleHRTdGFydCArIG5DdXRQYXJ0Ow0KKyAgICAgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgPSBpIC0gblRleHRTdGFydCArIDE7DQogICAgICAgICBwUGFyYWctPm1fbkNoYXJTdGFydCA9IG5SZXNlcnZlQ2hhclN0YXJ0Ow0KICAgICAgICAgbV9QYXJhZ1B0ckFycmF5Lkluc2VydEF0KCsrblBhcmFnSW5kZXgsIHBQYXJhZyk7DQorICAgICAgICBuUmVzZXJ2ZUNoYXJTdGFydCArPSBwUGFyYWctPm1fbkNoYXJDb3VudDsNCisgICAgICB9DQorICAgICAgblRleHRTdGFydCA9IGkgKyAxOw0KICAgICB9DQotICAgIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5TdGFydCwgbHBUZXh0LCBuTGVuZ3RoKTsNCi0gICAgaW50MzJfdCBuVG90YWxMaW5lQ291bnQgPSAwOw0KLSAgICBmb3IgKGkgPSBQYXJhZ1Bvcy5uUGFyYWdJbmRleDsgaSA8PSBuUGFyYWdJbmRleDsgaSArKykgew0KLSAgICAgICAgcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W2ldOw0KLSAgICAgICAgcFBhcmFnLT5DYWxjTGluZXMoKTsNCi0gICAgICAgIG5Ub3RhbExpbmVDb3VudCArPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCi0gICAgfQ0KLSAgICBtX25MaW5lQ291bnQgKz0gIG5Ub3RhbExpbmVDb3VudCAtIG5SZXNlcnZlTGluZUNvdW50Ow0KLSAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VMb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQotICAgIFVwZGF0ZVBhZ2VzKCk7DQorICB9DQorICBpZiAoYkZpcnN0KSB7DQorICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ICs9IG5MZW5ndGg7DQorICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQorICAgIGJGaXJzdCA9IEZBTFNFOw0KKyAgfSBlbHNlIHsNCisgICAgcFBhcmFnID0gRlhfTkVXIENGREVfVHh0RWR0UGFyYWcodGhpcyk7DQorICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQorICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gbkxlbmd0aCAtIG5UZXh0U3RhcnQgKyBuQ3V0UGFydDsNCisgICAgcFBhcmFnLT5tX25DaGFyU3RhcnQgPSBuUmVzZXJ2ZUNoYXJTdGFydDsNCisgICAgbV9QYXJhZ1B0ckFycmF5Lkluc2VydEF0KCsrblBhcmFnSW5kZXgsIHBQYXJhZyk7DQorICB9DQorICBtX3BUeHRCdWYtPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbmd0aCk7DQorICBpbnQzMl90IG5Ub3RhbExpbmVDb3VudCA9IDA7DQorICBmb3IgKGkgPSBQYXJhZ1Bvcy5uUGFyYWdJbmRleDsgaSA8PSBuUGFyYWdJbmRleDsgaSsrKSB7DQorICAgIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtpXTsNCisgICAgcFBhcmFnLT5DYWxjTGluZXMoKTsNCisgICAgblRvdGFsTGluZUNvdW50ICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgfQ0KKyAgbV9uTGluZUNvdW50ICs9IG5Ub3RhbExpbmVDb3VudCAtIG5SZXNlcnZlTGluZUNvdW50Ow0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlTG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgVXBkYXRlUGFnZXMoKTsNCiB9DQogI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJhd0luc2VydChpbnQzMl90IG5TdGFydCwgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwgaW50MzJfdCBuTGVuZ3RoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG5MZW5ndGggPiAwKTsNCi0gICAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KLSAgICBUZXh0UG9zMlBhcmFnUG9zKG5TdGFydCwgUGFyYWdQb3MpOw0KLSAgICBpbnQzMl90IG5QYXJhZ0NvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yIChpID0gUGFyYWdQb3MublBhcmFnSW5kZXggKyAxOyBpIDwgblBhcmFnQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIG1fUGFyYWdQdHJBcnJheVtpXS0+bV9uQ2hhclN0YXJ0ICs9IG5MZW5ndGg7DQotICAgIH0NCi0gICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZwk9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07DQotICAgIGludDMyX3QgblJlc2VydmVMaW5lQ291bnQJPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCi0gICAgaW50MzJfdCBuUmVzZXJ2ZUNoYXJTdGFydAk9IHBQYXJhZy0+bV9uQ2hhclN0YXJ0Ow0KLSAgICBpbnQzMl90IG5MZWF2ZVBhcnQJCQk9IFBhcmFnUG9zLm5DaGFySW5kZXg7DQotICAgIGludDMyX3QgbkN1dFBhcnQJCQk9IHBQYXJhZy0+bV9uQ2hhckNvdW50IC0gUGFyYWdQb3MubkNoYXJJbmRleDsNCi0gICAgaW50MzJfdCBuVGV4dFN0YXJ0CQkJPSAwOw0KLSAgICBGWF9XQ0hBUiB3Q3VyQ2hhcgk9IEwnICc7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBscFBvcwk9IGxwVGV4dDsNCi0gICAgRlhfQk9PTCBiRmlyc3QJCT0gVFJVRTsNCi0gICAgaW50MzJfdCBuUGFyYWdJbmRleCA9IFBhcmFnUG9zLm5QYXJhZ0luZGV4Ow0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbkxlbmd0aDsgaSArKywgbHBQb3MgKyspIHsNCi0gICAgICAgIHdDdXJDaGFyID0gKmxwUG9zOw0KLSAgICAgICAgaWYgKHdDdXJDaGFyID09IG1fd0xpbmVFbmQpIHsNCi0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7DQotICAgICAgICAgICAgICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gbkxlYXZlUGFydCArIChpIC0gblRleHRTdGFydCArIDEpOw0KLSAgICAgICAgICAgICAgICBwUGFyYWctPm1fbkxpbmVDb3VudCA9IC0xOw0KLSAgICAgICAgICAgICAgICBuUmVzZXJ2ZUNoYXJTdGFydCArPSBwUGFyYWctPm1fbkNoYXJDb3VudDsNCi0gICAgICAgICAgICAgICAgYkZpcnN0ID0gRkFMU0U7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcFBhcmFnID0gRlhfTkVXIENGREVfVHh0RWR0UGFyYWcodGhpcyk7DQotICAgICAgICAgICAgICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQotICAgICAgICAgICAgICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gaSAtIG5UZXh0U3RhcnQgKyAxOw0KLSAgICAgICAgICAgICAgICBwUGFyYWctPm1fbkNoYXJTdGFydCA9IG5SZXNlcnZlQ2hhclN0YXJ0Ow0KLSAgICAgICAgICAgICAgICBtX1BhcmFnUHRyQXJyYXkuSW5zZXJ0QXQoKytuUGFyYWdJbmRleCwgcFBhcmFnKTsNCi0gICAgICAgICAgICAgICAgblJlc2VydmVDaGFyU3RhcnQgKz0gcFBhcmFnLT5tX25DaGFyQ291bnQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG5UZXh0U3RhcnQgPSBpICsgMTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoYkZpcnN0KSB7DQotICAgICAgICBwUGFyYWctPm1fbkNoYXJDb3VudCArPSBuTGVuZ3RoOw0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJhd0luc2VydChpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQobkxlbmd0aCA+IDApOw0KKyAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KKyAgVGV4dFBvczJQYXJhZ1BvcyhuU3RhcnQsIFBhcmFnUG9zKTsNCisgIGludDMyX3QgblBhcmFnQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IFBhcmFnUG9zLm5QYXJhZ0luZGV4ICsgMTsgaSA8IG5QYXJhZ0NvdW50OyBpKyspIHsNCisgICAgbV9QYXJhZ1B0ckFycmF5W2ldLT5tX25DaGFyU3RhcnQgKz0gbkxlbmd0aDsNCisgIH0NCisgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07DQorICBpbnQzMl90IG5SZXNlcnZlTGluZUNvdW50ID0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQorICBpbnQzMl90IG5SZXNlcnZlQ2hhclN0YXJ0ID0gcFBhcmFnLT5tX25DaGFyU3RhcnQ7DQorICBpbnQzMl90IG5MZWF2ZVBhcnQgPSBQYXJhZ1Bvcy5uQ2hhckluZGV4Ow0KKyAgaW50MzJfdCBuQ3V0UGFydCA9IHBQYXJhZy0+bV9uQ2hhckNvdW50IC0gUGFyYWdQb3MubkNoYXJJbmRleDsNCisgIGludDMyX3QgblRleHRTdGFydCA9IDA7DQorICBGWF9XQ0hBUiB3Q3VyQ2hhciA9IEwnICc7DQorICBjb25zdCBGWF9XQ0hBUiogbHBQb3MgPSBscFRleHQ7DQorICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7DQorICBpbnQzMl90IG5QYXJhZ0luZGV4ID0gUGFyYWdQb3MublBhcmFnSW5kZXg7DQorICBmb3IgKGkgPSAwOyBpIDwgbkxlbmd0aDsgaSsrLCBscFBvcysrKSB7DQorICAgIHdDdXJDaGFyID0gKmxwUG9zOw0KKyAgICBpZiAod0N1ckNoYXIgPT0gbV93TGluZUVuZCkgew0KKyAgICAgIGlmIChiRmlyc3QpIHsNCisgICAgICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gbkxlYXZlUGFydCArIChpIC0gblRleHRTdGFydCArIDEpOw0KICAgICAgICAgcFBhcmFnLT5tX25MaW5lQ291bnQgPSAtMTsNCisgICAgICAgIG5SZXNlcnZlQ2hhclN0YXJ0ICs9IHBQYXJhZy0+bV9uQ2hhckNvdW50Ow0KICAgICAgICAgYkZpcnN0ID0gRkFMU0U7DQotICAgIH0gZWxzZSB7DQorICAgICAgfSBlbHNlIHsNCiAgICAgICAgIHBQYXJhZyA9IEZYX05FVyBDRkRFX1R4dEVkdFBhcmFnKHRoaXMpOw0KICAgICAgICAgcFBhcmFnLT5tX25MaW5lQ291bnQgPSAtMTsNCi0gICAgICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gbkxlbmd0aCAtIG5UZXh0U3RhcnQgKyBuQ3V0UGFydDsNCisgICAgICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gaSAtIG5UZXh0U3RhcnQgKyAxOw0KICAgICAgICAgcFBhcmFnLT5tX25DaGFyU3RhcnQgPSBuUmVzZXJ2ZUNoYXJTdGFydDsNCiAgICAgICAgIG1fUGFyYWdQdHJBcnJheS5JbnNlcnRBdCgrK25QYXJhZ0luZGV4LCBwUGFyYWcpOw0KKyAgICAgICAgblJlc2VydmVDaGFyU3RhcnQgKz0gcFBhcmFnLT5tX25DaGFyQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIG5UZXh0U3RhcnQgPSBpICsgMTsNCiAgICAgfQ0KLSAgICBtX3BUeHRCdWYtPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbmd0aCk7DQorICB9DQorICBpZiAoYkZpcnN0KSB7DQorICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ICs9IG5MZW5ndGg7DQorICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQorICAgIGJGaXJzdCA9IEZBTFNFOw0KKyAgfSBlbHNlIHsNCisgICAgcFBhcmFnID0gRlhfTkVXIENGREVfVHh0RWR0UGFyYWcodGhpcyk7DQorICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQorICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gbkxlbmd0aCAtIG5UZXh0U3RhcnQgKyBuQ3V0UGFydDsNCisgICAgcFBhcmFnLT5tX25DaGFyU3RhcnQgPSBuUmVzZXJ2ZUNoYXJTdGFydDsNCisgICAgbV9QYXJhZ1B0ckFycmF5Lkluc2VydEF0KCsrblBhcmFnSW5kZXgsIHBQYXJhZyk7DQorICB9DQorICBtX3BUeHRCdWYtPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbmd0aCk7DQogfQ0KICNlbmRpZg0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OklubmVyX0RlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCApDQotew0KLSAgICBpZiAobkNvdW50ID09IC0xKSB7DQotICAgICAgICBuQ291bnQgPSBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSAtIG5TdGFydDsNCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpJbm5lcl9EZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIHsNCisgIGlmIChuQ291bnQgPT0gLTEpIHsNCisgICAgbkNvdW50ID0gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkgLSBuU3RhcnQ7DQorICB9DQorICBpbnQzMl90IG5FbmQgPSBuU3RhcnQgKyBuQ291bnQgLSAxOw0KKyAgRlhTWVNfYXNzZXJ0KG5TdGFydCA+PSAwICYmIG5FbmQgPCBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSk7DQorICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCisgIEZERV9UWFRFRFRQQVJBR1BPUyBQYXJhZ1Bvc0JnbiwgUGFyYWdQb3NFbmQ7DQorICBUZXh0UG9zMlBhcmFnUG9zKG5TdGFydCwgUGFyYWdQb3NCZ24pOw0KKyAgVGV4dFBvczJQYXJhZ1BvcyhuRW5kLCBQYXJhZ1Bvc0VuZCk7DQorICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3NFbmQublBhcmFnSW5kZXhdOw0KKyAgRlhfQk9PTCBiTGFzdFBhcmFnID0gRkFMU0U7DQorICBpZiAoUGFyYWdQb3NFbmQubkNoYXJJbmRleCA9PSBwUGFyYWctPm1fbkNoYXJDb3VudCAtIDEpIHsNCisgICAgaWYgKFBhcmFnUG9zRW5kLm5QYXJhZ0luZGV4IDwgbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKSAtIDEpIHsNCisgICAgICBQYXJhZ1Bvc0VuZC5uUGFyYWdJbmRleCsrOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJMYXN0UGFyYWcgPSBUUlVFOw0KICAgICB9DQotICAgIGludDMyX3QgbkVuZCA9IG5TdGFydCArIG5Db3VudCAtIDE7DQotICAgIEZYU1lTX2Fzc2VydChuU3RhcnQgPj0gMCAmJiBuRW5kIDwgbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpOw0KLSAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCi0gICAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zQmduLCBQYXJhZ1Bvc0VuZDsNCi0gICAgVGV4dFBvczJQYXJhZ1BvcyhuU3RhcnQsIFBhcmFnUG9zQmduKTsNCi0gICAgVGV4dFBvczJQYXJhZ1BvcyhuRW5kLCBQYXJhZ1Bvc0VuZCk7DQotICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3NFbmQublBhcmFnSW5kZXhdOw0KLSAgICBGWF9CT09MIGJMYXN0UGFyYWcgPSBGQUxTRTsNCi0gICAgaWYgKFBhcmFnUG9zRW5kLm5DaGFySW5kZXggPT0gcFBhcmFnLT5tX25DaGFyQ291bnQgLSAxKSB7DQotICAgICAgICBpZiAoUGFyYWdQb3NFbmQublBhcmFnSW5kZXggPCBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpIC0gMSkgew0KLSAgICAgICAgICAgIFBhcmFnUG9zRW5kLm5QYXJhZ0luZGV4ICsrOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBiTGFzdFBhcmFnID0gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpbnQzMl90IG5Ub3RhbExpbmVDb3VudAk9IDA7DQotICAgIGludDMyX3QgblRvdGFsQ2hhckNvdW50CT0gMDsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yIChpID0gUGFyYWdQb3NCZ24ublBhcmFnSW5kZXg7IGkgPD0gUGFyYWdQb3NFbmQublBhcmFnSW5kZXg7IGkgKyspIHsNCi0gICAgICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbaV07DQotICAgICAgICBwUGFyYWctPkNhbGNMaW5lcygpOw0KLSAgICAgICAgblRvdGFsTGluZUNvdW50ICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KLSAgICAgICAgblRvdGFsQ2hhckNvdW50ICs9IHBQYXJhZy0+bV9uQ2hhckNvdW50Ow0KLSAgICB9DQotICAgIG1fcFR4dEJ1Zi0+RGVsZXRlKG5TdGFydCwgbkNvdW50KTsNCi0gICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBFbmRQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvc0VuZC5uUGFyYWdJbmRleF07DQotICAgIGludDMyX3Qgbk5leHRQYXJhZ0luZGV4ID0gKFBhcmFnUG9zQmduLm5DaGFySW5kZXggPT0gMCAmJiBiTGFzdFBhcmFnKSA/IFBhcmFnUG9zQmduLm5QYXJhZ0luZGV4IDogXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGFyYWdQb3NCZ24ublBhcmFnSW5kZXggKyAxKTsNCi0gICAgZm9yIChpID0gbk5leHRQYXJhZ0luZGV4OyBpIDw9IFBhcmFnUG9zRW5kLm5QYXJhZ0luZGV4OyBpICsrKSB7DQotICAgICAgICBDRkRFX1R4dEVkdFBhcmFnICogcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W25OZXh0UGFyYWdJbmRleF07DQotICAgICAgICBkZWxldGUgcFBhcmFnOw0KLSAgICAgICAgbV9QYXJhZ1B0ckFycmF5LlJlbW92ZUF0KG5OZXh0UGFyYWdJbmRleCk7DQotICAgIH0NCi0gICAgaWYgKCEoYkxhc3RQYXJhZyAmJiBQYXJhZ1Bvc0Jnbi5uQ2hhckluZGV4ID09IDApKSB7DQotICAgICAgICBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3NCZ24ublBhcmFnSW5kZXhdOw0KLSAgICAgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgPSBuVG90YWxDaGFyQ291bnQgLSBuQ291bnQ7DQotICAgICAgICBwUGFyYWctPkNhbGNMaW5lcygpOw0KLSAgICAgICAgblRvdGFsTGluZUNvdW50IC09IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KLSAgICB9DQotICAgIGludDMyX3QgblBhcmFnQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGkgPSBuTmV4dFBhcmFnSW5kZXg7IGkgPCBuUGFyYWdDb3VudDsgaSArKykgew0KLSAgICAgICAgbV9QYXJhZ1B0ckFycmF5W2ldLT5tX25DaGFyU3RhcnQgLT0gbkNvdW50Ow0KLSAgICB9DQotICAgIG1fbkxpbmVDb3VudCAtPSBuVG90YWxMaW5lQ291bnQ7DQotICAgIFVwZGF0ZVBhZ2VzKCk7DQotICAgIGludDMyX3QgblBhZ2VDb3VudCA9IENvdW50UGFnZXMoKTsNCi0gICAgaWYgKG1fbkNhcmV0UGFnZSA+PSBuUGFnZUNvdW50KSB7DQotICAgICAgICBtX25DYXJldFBhZ2UgPSBuUGFnZUNvdW50IC0gMTsNCi0gICAgfQ0KLSAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VMb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQorICB9DQorICBpbnQzMl90IG5Ub3RhbExpbmVDb3VudCA9IDA7DQorICBpbnQzMl90IG5Ub3RhbENoYXJDb3VudCA9IDA7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gUGFyYWdQb3NCZ24ublBhcmFnSW5kZXg7IGkgPD0gUGFyYWdQb3NFbmQublBhcmFnSW5kZXg7IGkrKykgew0KKyAgICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbaV07DQorICAgIHBQYXJhZy0+Q2FsY0xpbmVzKCk7DQorICAgIG5Ub3RhbExpbmVDb3VudCArPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgICAgblRvdGFsQ2hhckNvdW50ICs9IHBQYXJhZy0+bV9uQ2hhckNvdW50Ow0KKyAgfQ0KKyAgbV9wVHh0QnVmLT5EZWxldGUoblN0YXJ0LCBuQ291bnQpOw0KKyAgQ0ZERV9UeHRFZHRQYXJhZyogcEVuZFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W1BhcmFnUG9zRW5kLm5QYXJhZ0luZGV4XTsNCisgIGludDMyX3Qgbk5leHRQYXJhZ0luZGV4ID0gKFBhcmFnUG9zQmduLm5DaGFySW5kZXggPT0gMCAmJiBiTGFzdFBhcmFnKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQYXJhZ1Bvc0Jnbi5uUGFyYWdJbmRleA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoUGFyYWdQb3NCZ24ublBhcmFnSW5kZXggKyAxKTsNCisgIGZvciAoaSA9IG5OZXh0UGFyYWdJbmRleDsgaSA8PSBQYXJhZ1Bvc0VuZC5uUGFyYWdJbmRleDsgaSsrKSB7DQorICAgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtuTmV4dFBhcmFnSW5kZXhdOw0KKyAgICBkZWxldGUgcFBhcmFnOw0KKyAgICBtX1BhcmFnUHRyQXJyYXkuUmVtb3ZlQXQobk5leHRQYXJhZ0luZGV4KTsNCisgIH0NCisgIGlmICghKGJMYXN0UGFyYWcgJiYgUGFyYWdQb3NCZ24ubkNoYXJJbmRleCA9PSAwKSkgew0KKyAgICBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3NCZ24ublBhcmFnSW5kZXhdOw0KKyAgICBwUGFyYWctPm1fbkNoYXJDb3VudCA9IG5Ub3RhbENoYXJDb3VudCAtIG5Db3VudDsNCisgICAgcFBhcmFnLT5DYWxjTGluZXMoKTsNCisgICAgblRvdGFsTGluZUNvdW50IC09IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgfQ0KKyAgaW50MzJfdCBuUGFyYWdDb3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGkgPSBuTmV4dFBhcmFnSW5kZXg7IGkgPCBuUGFyYWdDb3VudDsgaSsrKSB7DQorICAgIG1fUGFyYWdQdHJBcnJheVtpXS0+bV9uQ2hhclN0YXJ0IC09IG5Db3VudDsNCisgIH0NCisgIG1fbkxpbmVDb3VudCAtPSBuVG90YWxMaW5lQ291bnQ7DQorICBVcGRhdGVQYWdlcygpOw0KKyAgaW50MzJfdCBuUGFnZUNvdW50ID0gQ291bnRQYWdlcygpOw0KKyAgaWYgKG1fbkNhcmV0UGFnZSA+PSBuUGFnZUNvdW50KSB7DQorICAgIG1fbkNhcmV0UGFnZSA9IG5QYWdlQ291bnQgLSAxOw0KKyAgfQ0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlTG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KIH0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpEZWxldGVSYW5nZV9Eb1JlY29yZChpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQsIEZYX0JPT0wgYlNlbCApDQotew0KLSAgICBGWFNZU19hc3NlcnQoblN0YXJ0ID49IDApOw0KLSAgICBpZiAobkNvdW50ID09IC0xKSB7DQotICAgICAgICBuQ291bnQgPSBHZXRUZXh0TGVuZ3RoKCkgLSBuU3RhcnQ7DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6RGVsZXRlUmFuZ2VfRG9SZWNvcmQoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsKSB7DQorICBGWFNZU19hc3NlcnQoblN0YXJ0ID49IDApOw0KKyAgaWYgKG5Db3VudCA9PSAtMSkgew0KKyAgICBuQ291bnQgPSBHZXRUZXh0TGVuZ3RoKCkgLSBuU3RhcnQ7DQorICB9DQorICBGWFNZU19hc3NlcnQoKG5TdGFydCArIG5Db3VudCkgPD0gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpOw0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgIGludDMyX3QgbkJsb2NrQ291bnQgPSBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKG5CbG9ja0NvdW50ID4gMCkgew0KKyAgfQ0KKyNlbmRpZg0KKyAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUmFuZ2U7DQorICAgIG1fcFR4dEJ1Zi0+R2V0UmFuZ2Uod3NSYW5nZSwgblN0YXJ0LCBuQ291bnQpOw0KKyAgICBJRkRFX1R4dEVkdERvUmVjb3JkKiBwUmVjb3JkID0gRlhfTkVXIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoDQorICAgICAgICB0aGlzLCBuU3RhcnQsIG1fbkNhcmV0LCB3c1JhbmdlLCBiU2VsKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCisgICAgcFJlY29yZC0+U2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0FkZERvUmVjb3JkKHRoaXMsIGJzRG9SZWNvcmQpOw0KKyAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQorICB9DQorICBtX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUgPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9EZWxldGU7DQorICBHZXRUZXh0KG1fQ2hhbmdlSW5mby53c0RlbGV0ZSwgblN0YXJ0LCBuQ291bnQpOw0KKyAgSW5uZXJfRGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpSZXNldEVuZ2luZSgpIHsNCisgIFJlbW92ZUFsbFBhZ2VzKCk7DQorICBSZW1vdmVBbGxQYXJhZ3MoKTsNCisgIENsZWFyU2VsZWN0aW9uKCk7DQorICBtX25DYXJldCA9IDA7DQorICBtX3BUeHRCdWYtPkNsZWFyKEZBTFNFKTsNCisgIG1fbkNhcmV0ID0gMDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVidWlsZFBhcmFncmFwaHMoKSB7DQorICBSZW1vdmVBbGxQYXJhZ3MoKTsNCisgIEZYX1dDSEFSIHdDaGFyID0gTCcgJzsNCisgIEZYX1dDSEFSIHdDaGFyUHJlID0gTCcgJzsNCisgIGludDMyX3QgblBhcmFnU3RhcnQgPSAwOw0KKyAgaW50MzJfdCBuQ291bnQgPSBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKTsNCisgIGludDMyX3QgbkluZGV4ID0gMDsNCisgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IE5VTEw7DQorICBJRlhfQ2hhckl0ZXIqIHBJdGVyID0gRlhfTkVXIENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKW1fcFR4dEJ1Zik7DQorICBwSXRlci0+U2V0QXQoMCk7DQorICBkbyB7DQorICAgIHdDaGFyID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgbkluZGV4ID0gcEl0ZXItPkdldEF0KCk7DQorICAgIGlmICh3Q2hhciA9PSBtX3dMaW5lRW5kKSB7DQorICAgICAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gRlhfTkVXIENGREVfVHh0RWR0UGFyYWcodGhpcyk7DQorICAgICAgcFBhcmFnLT5tX25DaGFyU3RhcnQgPSBuUGFyYWdTdGFydDsNCisgICAgICBwUGFyYWctPm1fbkNoYXJDb3VudCA9IG5JbmRleCAtIG5QYXJhZ1N0YXJ0ICsgMTsNCisgICAgICBwUGFyYWctPm1fbkxpbmVDb3VudCA9IC0xOw0KKyAgICAgIG1fUGFyYWdQdHJBcnJheS5BZGQocFBhcmFnKTsNCisgICAgICBuUGFyYWdTdGFydCA9IG5JbmRleCArIDE7DQogICAgIH0NCi0gICAgRlhTWVNfYXNzZXJ0KChuU3RhcnQgKyBuQ291bnQpIDw9IG1fcFR4dEJ1Zi0+R2V0VGV4dExlbmd0aCgpKTsNCisgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KCkpOw0KKyAgcEl0ZXItPlJlbGVhc2UoKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVtb3ZlQWxsUGFyYWdzKCkgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbaV07DQorICAgIGlmIChwUGFyYWcpIHsNCisgICAgICBkZWxldGUgcFBhcmFnOw0KKyAgICB9DQorICB9DQorICBtX1BhcmFnUHRyQXJyYXkuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlbW92ZUFsbFBhZ2VzKCkgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX1BhZ2VQdHJBcnJheS5HZXRTaXplKCk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX1BhZ2VQdHJBcnJheVtpXTsNCisgICAgaWYgKHBQYWdlKSB7DQorICAgICAgcFBhZ2UtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9QYWdlUHRyQXJyYXkuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlVwZGF0ZVBhcmFncygpIHsNCisgIGludDMyX3QgbkNvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsNCisgIGlmIChuQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBOVUxMOw0KKyAgaW50MzJfdCBuTGluZUNvdW50ID0gMDsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W2ldOw0KKyAgICBpZiAocFBhcmFnLT5tX25MaW5lQ291bnQgPT0gLTEpIHsNCisgICAgICBwUGFyYWctPkNhbGNMaW5lcygpOw0KKyAgICB9DQorICAgIG5MaW5lQ291bnQgKz0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQorICB9DQorICBtX25MaW5lQ291bnQgPSBuTGluZUNvdW50Ow0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVQYWdlcygpIHsNCisgIGlmIChtX25MaW5lQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IG5QYWdlQ291bnQgPSAobV9uTGluZUNvdW50IC0gMSkgLyAobV9uUGFnZUxpbmVDb3VudCkgKyAxOw0KKyAgaW50MzJfdCBuU2l6ZSA9IG1fUGFnZVB0ckFycmF5LkdldFNpemUoKTsNCisgIGlmIChuU2l6ZSA9PSBuUGFnZUNvdW50KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChuU2l6ZSA+IG5QYWdlQ291bnQpIHsNCisgICAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IE5VTEw7DQorICAgIGludDMyX3QgaSA9IDA7DQorICAgIGZvciAoaSA9IG5TaXplIC0gMTsgaSA+PSBuUGFnZUNvdW50OyBpLS0pIHsNCisgICAgICBwUGFnZSA9IG1fUGFnZVB0ckFycmF5W2ldOw0KKyAgICAgIGlmIChwUGFnZSkgew0KKyAgICAgICAgcFBhZ2UtPlJlbGVhc2UoKTsNCisgICAgICB9DQorICAgICAgbV9QYWdlUHRyQXJyYXkuUmVtb3ZlQXQoaSk7DQorICAgIH0NCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlQ291bnRDaGFuZ2VkKHRoaXMpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoblNpemUgPCBuUGFnZUNvdW50KSB7DQorICAgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBOVUxMOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBmb3IgKGkgPSBuU2l6ZTsgaSA8IG5QYWdlQ291bnQ7IGkrKykgew0KKyAgICAgIHBQYWdlID0gSUZERV9UeHRFZHRQYWdlOjpDcmVhdGUodGhpcywgaSk7DQorICAgICAgbV9QYWdlUHRyQXJyYXkuQWRkKHBQYWdlKTsNCisgICAgfQ0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VDb3VudENoYW5nZWQodGhpcyk7DQorICAgIHJldHVybjsNCisgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6VXBkYXRlVHh0QnJlYWsoKSB7DQorICBGWF9EV09SRCBkd1N0eWxlID0gbV9wVGV4dEJyZWFrLT5HZXRMYXlvdXRTdHlsZXMoKTsNCisgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTXVsdGlMaW5lcykgew0KKyAgICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lOw0KKyAgfSBlbHNlIHsNCisgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lOw0KKyAgfQ0KKyAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwpIHsNCisgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dDsNCisgIH0gZWxzZSB7DQorICAgIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0Ow0KKyAgfQ0KKyAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfTGluZVJlc2VydmUpIHsNCisgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9SZXZlcnNlTGluZTsNCisgIH0gZWxzZSB7DQorICAgIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX1JldmVyc2VMaW5lOw0KKyAgfQ0KKyAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfUlRMKSB7DQorICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyOw0KKyAgfSBlbHNlIHsNCisgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyOw0KKyAgfQ0KKyAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQpIHsNCisgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9Db21iVGV4dDsNCisgIH0gZWxzZSB7DQorICAgIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0Ow0KKyAgfQ0KKyAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ2hhclZlcnRpYWwpIHsNCisgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbENoYXJzOw0KKyAgfSBlbHNlIHsNCisgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxDaGFyczsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0V4cGFuZFRhYikgew0KKyAgICBkd1N0eWxlIHw9IEZYX1RYVExBWU9VVFNUWUxFX0V4cGFuZFRhYjsNCisgIH0gZWxzZSB7DQorICAgIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX0V4cGFuZFRhYjsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0FyYWJpY0NvbnRleHQpIHsNCisgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNDb250ZXh0Ow0KKyAgfSBlbHNlIHsNCisgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljQ29udGV4dDsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0FyYWJpY1NoYXBlcykgew0KKyAgICBkd1N0eWxlIHw9IEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY1NoYXBlczsNCisgIH0gZWxzZSB7DQorICAgIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY1NoYXBlczsNCisgIH0NCisgIG1fcFRleHRCcmVhay0+U2V0TGF5b3V0U3R5bGVzKGR3U3R5bGUpOw0KKyAgRlhfRFdPUkQgZHdBbGlnbWVudCA9IDA7DQorICBpZiAobV9QYXJhbS5kd0FsaWdubWVudCAmIEZERV9URVhURURJVEFMSUdOX0p1c3RpZmllZCkgew0KKyAgICBkd0FsaWdtZW50IHw9IEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkOw0KKyAgfSBlbHNlIGlmIChtX1BhcmFtLmR3QWxpZ25tZW50ICYgRkRFX1RFWFRFRElUQUxJR05fRGlzdHJpYnV0ZWQpIHsNCisgICAgZHdBbGlnbWVudCB8PSBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkOw0KKyAgfQ0KKyAgaWYgKG1fUGFyYW0uZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9DZW50ZXIpIHsNCisgICAgZHdBbGlnbWVudCB8PSBGWF9UWFRMSU5FQUxJR05NRU5UX0NlbnRlcjsNCisgIH0gZWxzZSBpZiAobV9QYXJhbS5kd0FsaWdubWVudCAmIEZERV9URVhURURJVEFMSUdOX1JpZ2h0KSB7DQorICAgIGR3QWxpZ21lbnQgfD0gRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodDsNCisgIH0NCisgIG1fcFRleHRCcmVhay0+U2V0QWxpZ25tZW50KGR3QWxpZ21lbnQpOw0KKyAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwpIHsNCisgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9BdXRvTGluZVdyYXApIHsNCisgICAgICBtX3BUZXh0QnJlYWstPlNldExpbmVXaWR0aChtX1BhcmFtLmZQbGF0ZUhlaWdodCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9wVGV4dEJyZWFrLT5TZXRMaW5lV2lkdGgoRkRFX1BBR0VXSURUSF9NQVgpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0F1dG9MaW5lV3JhcCkgew0KKyAgICAgIG1fcFRleHRCcmVhay0+U2V0TGluZVdpZHRoKG1fUGFyYW0uZlBsYXRlV2lkdGgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fcFRleHRCcmVhay0+U2V0TGluZVdpZHRoKEZERV9QQUdFV0lEVEhfTUFYKTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9uUGFnZUxpbmVDb3VudCA9IG1fUGFyYW0ubkxpbmVDb3VudDsNCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0NvbWJUZXh0KSB7DQorICAgIEZYX0ZMT0FUIGZDb21iV2lkdGggPQ0KKyAgICAgICAgbV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbA0KKyAgICAgICAgICAgID8gbV9QYXJhbS5mUGxhdGVIZWlnaHQNCisgICAgICAgICAgICA6IG1fUGFyYW0uZlBsYXRlV2lkdGg7DQorICAgIGlmIChtX25MaW1pdCA+IDApIHsNCisgICAgICBmQ29tYldpZHRoIC89IG1fbkxpbWl0Ow0KKyAgICB9DQorICAgIG1fcFRleHRCcmVhay0+U2V0Q29tYldpZHRoKGZDb21iV2lkdGgpOw0KKyAgfQ0KKyAgbV9wVGV4dEJyZWFrLT5TZXRGb250KG1fUGFyYW0ucEZvbnQpOw0KKyAgbV9wVGV4dEJyZWFrLT5TZXRGb250U2l6ZShtX1BhcmFtLmZGb250U2l6ZSk7DQorICBtX3BUZXh0QnJlYWstPlNldFRhYldpZHRoKG1fUGFyYW0uZlRhYldpZHRoLCBtX1BhcmFtLmJUYWJFcXVpZGlzdGFudCk7DQorICBtX3BUZXh0QnJlYWstPlNldERlZmF1bHRDaGFyKG1fUGFyYW0ud0RlZkNoYXIpOw0KKyAgbV9wVGV4dEJyZWFrLT5TZXRQYXJhZ3JhcGhCcmVha0NoYXIobV9QYXJhbS53TGluZUJyZWFrQ2hhcik7DQorICBtX3BUZXh0QnJlYWstPlNldENoYXJSb3RhdGlvbihtX1BhcmFtLm5DaGFyUm90YXRpb24pOw0KKyAgbV9wVGV4dEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UobV9QYXJhbS5mRm9udFNpemUgKiAwLjJmKTsNCisgIG1fcFRleHRCcmVhay0+U2V0SG9yaXpvbnRhbFNjYWxlKG1fUGFyYW0ubkhvcnpTY2FsZSk7DQorICBtX3BUZXh0QnJlYWstPlNldENoYXJTcGFjZShtX1BhcmFtLmZDaGFyU3BhY2UpOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpSZXBsYWNlUGFyYWdFbmQoRlhfV0NIQVIqJiBscFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByZUlzQ1IpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5MZW5ndGg7IGkrKykgew0KKyAgICBGWF9XQ0hBUiB3YyA9IGxwVGV4dFtpXTsNCisgICAgc3dpdGNoICh3Yykgew0KKyAgICAgIGNhc2UgTCdccic6IHsNCisgICAgICAgIGxwVGV4dFtpXSA9IG1fd0xpbmVFbmQ7DQorICAgICAgICBiUHJlSXNDUiA9IFRSVUU7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEwnXG4nOiB7DQorICAgICAgICBpZiAoYlByZUlzQ1IgPT0gVFJVRSkgew0KKyAgICAgICAgICBpbnQzMl90IG5OZXh0ID0gaSArIDE7DQorICAgICAgICAgIGlmIChuTmV4dCA8IG5MZW5ndGgpIHsNCisgICAgICAgICAgICBGWFNZU19tZW1tb3ZlKGxwVGV4dCArIGksIGxwVGV4dCArIG5OZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG5MZW5ndGggLSBuTmV4dCkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpLS07DQorICAgICAgICAgIG5MZW5ndGgtLTsNCisgICAgICAgICAgYlByZUlzQ1IgPSBGQUxTRTsNCisgICAgICAgICAgaWYgKG1fYkF1dG9MaW5lRW5kKSB7DQorICAgICAgICAgICAgbV9uRmlyc3RMaW5lRW5kID0gRkRFX1RYVEVESVRfTElORUVORF9DUkxGOw0KKyAgICAgICAgICAgIG1fYkF1dG9MaW5lRW5kID0gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGxwVGV4dFtpXSA9IG1fd0xpbmVFbmQ7DQorICAgICAgICAgIGlmIChtX2JBdXRvTGluZUVuZCkgew0KKyAgICAgICAgICAgIG1fbkZpcnN0TGluZUVuZCA9IEZERV9UWFRFRElUX0xJTkVFTkRfTEY7DQorICAgICAgICAgICAgbV9iQXV0b0xpbmVFbmQgPSBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgaWYgKGJQcmVJc0NSICYmIG1fYkF1dG9MaW5lRW5kKSB7DQorICAgICAgICAgIG1fbkZpcnN0TGluZUVuZCA9IEZERV9UWFRFRElUX0xJTkVFTkRfQ1I7DQorICAgICAgICAgIG1fYkF1dG9MaW5lRW5kID0gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBiUHJlSXNDUiA9IEZBTFNFOw0KKyAgICAgIH0gYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBiUHJlSXNDUjsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVjb3ZlclBhcmFnRW5kKENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIEZYX1dDSEFSIHdjID0gKG1fbkZpcnN0TGluZUVuZCA9PSBGREVfVFhURURJVF9MSU5FRU5EX0NSKSA/IEwnXG4nIDogTCdccic7DQorICBpZiAobV9uRmlyc3RMaW5lRW5kID09IEZERV9UWFRFRElUX0xJTkVFTkRfQ1JMRikgew0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBQb3NBcnI7DQorICAgIGludDMyX3Qgbkxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgaW50MzJfdCBpID0gMDsNCisgICAgRlhfV0NIQVIqIGxwUG9zID0gKEZYX1dDSEFSKikoY29uc3QgRlhfV0NIQVIqKXdzVGV4dDsNCisgICAgZm9yIChpID0gMDsgaSA8IG5MZW5ndGg7IGkrKywgbHBQb3MrKykgew0KKyAgICAgIGlmICgqbHBQb3MgPT0gbV93TGluZUVuZCkgew0KKyAgICAgICAgKmxwUG9zID0gd2M7DQorICAgICAgICBQb3NBcnIuQWRkKGkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBjb25zdCBGWF9XQ0hBUiogbHBTcmNCdWYgPSB3c1RleHQuY19zdHIoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICBpbnQzMl90IG5Db3VudCA9IFBvc0Fyci5HZXRTaXplKCk7DQorICAgIEZYX1dDSEFSKiBscERzdEJ1ZiA9IHdzVGVtcC5HZXRCdWZmZXIobkxlbmd0aCArIG5Db3VudCk7DQorICAgIGludDMyX3QgbkRzdFBvcyA9IDA7DQorICAgIGludDMyX3QgblNyY1BvcyA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICAgIGludDMyX3QgblBvcyA9IFBvc0FycltpXTsNCisgICAgICBpbnQzMl90IG5Db3B5TGVuID0gblBvcyAtIG5TcmNQb3MgKyAxOw0KKyAgICAgIEZYU1lTX21lbWNweShscERzdEJ1ZiArIG5Ec3RQb3MsIGxwU3JjQnVmICsgblNyY1BvcywNCisgICAgICAgICAgICAgICAgICAgbkNvcHlMZW4gKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICBuRHN0UG9zICs9IG5Db3B5TGVuOw0KKyAgICAgIG5TcmNQb3MgKz0gbkNvcHlMZW47DQorICAgICAgbHBEc3RCdWZbbkRzdFBvc10gPSBMJ1xuJzsNCisgICAgICBuRHN0UG9zKys7DQorICAgIH0NCisgICAgaWYgKG5TcmNQb3MgPCBuTGVuZ3RoKSB7DQorICAgICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmICsgbkRzdFBvcywgbHBTcmNCdWYgKyBuU3JjUG9zLA0KKyAgICAgICAgICAgICAgICAgICAobkxlbmd0aCAtIG5TcmNQb3MpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIH0NCisgICAgd3NUZW1wLlJlbGVhc2VCdWZmZXIobkxlbmd0aCArIG5Db3VudCk7DQorICAgIHdzVGV4dCA9IHdzVGVtcDsNCisgIH0gZWxzZSB7DQorICAgIGludDMyX3Qgbkxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgRlhfV0NIQVIqIGxwQnVmID0gKEZYX1dDSEFSKikoY29uc3QgRlhfV0NIQVIqKXdzVGV4dDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkxlbmd0aDsgaSsrLCBscEJ1ZisrKSB7DQorICAgICAgaWYgKCpscEJ1ZiA9PSBtX3dMaW5lRW5kKSB7DQorICAgICAgICAqbHBCdWYgPSB3YzsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZVBhZ2UyQ2hhcihpbnQzMl90IG5JbmRleCkgew0KKyAgRlhTWVNfYXNzZXJ0KG5JbmRleCA+PSAwKTsNCisgIEZYU1lTX2Fzc2VydChuSW5kZXggPD0gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpOw0KKyAgaWYgKG1fbkNhcmV0UGFnZSA+PSAwKSB7DQorICAgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX1BhZ2VQdHJBcnJheVttX25DYXJldFBhZ2VdOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VMb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQorICAgIGludDMyX3QgblBhZ2VDaGFyU3RhcnQgPSBwUGFnZS0+R2V0Q2hhclN0YXJ0KCk7DQorICAgIGludDMyX3QgblBhZ2VDaGFyQ291bnQgPSBwUGFnZS0+R2V0Q2hhckNvdW50KCk7DQorICAgIGlmIChuSW5kZXggPj0gblBhZ2VDaGFyU3RhcnQgJiYgbkluZGV4IDwgblBhZ2VDaGFyU3RhcnQgKyBuUGFnZUNoYXJDb3VudCkgew0KKyAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgICAgIHJldHVybiBtX25DYXJldFBhZ2U7DQorICAgIH0NCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlVW5sb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQorICB9DQorICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBOVUxMOw0KKyAgaW50MzJfdCBuTGluZUNvdW50ID0gMDsNCisgIGludDMyX3QgblBhcmFnQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBuUGFyYWdDb3VudDsgaSsrKSB7DQorICAgIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtpXTsNCisgICAgaWYgKHBQYXJhZy0+bV9uQ2hhclN0YXJ0IDw9IG5JbmRleCAmJg0KKyAgICAgICAgbkluZGV4IDwgKHBQYXJhZy0+bV9uQ2hhclN0YXJ0ICsgcFBhcmFnLT5tX25DaGFyQ291bnQpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgbkxpbmVDb3VudCArPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgIH0NCisgIHBQYXJhZy0+TG9hZFBhcmFnKCk7DQorICBpbnQzMl90IG5MaW5lU3RhcnQgPSAtMTsNCisgIGludDMyX3QgbkxpbmVDaGFyQ291bnQgPSAtMTsNCisgIGZvciAoaSA9IDA7IGkgPCBwUGFyYWctPm1fbkxpbmVDb3VudDsgaSsrKSB7DQorICAgIHBQYXJhZy0+R2V0TGluZVJhbmdlKGksIG5MaW5lU3RhcnQsIG5MaW5lQ2hhckNvdW50KTsNCisgICAgaWYgKG5MaW5lU3RhcnQgPD0gbkluZGV4ICYmIG5JbmRleCA8IChuTGluZVN0YXJ0ICsgbkxpbmVDaGFyQ291bnQpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIEZYU1lTX2Fzc2VydChpIDwgcFBhcmFnLT5tX25MaW5lQ291bnQpOw0KKyAgbkxpbmVDb3VudCArPSAoaSArIDEpOw0KKyAgbV9uQ2FyZXRQYWdlID0gKG5MaW5lQ291bnQgLSAxKSAvIG1fblBhZ2VMaW5lQ291bnQgKyAxIC0gMTsNCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUNoYW5nZSh0aGlzLCBtX25DYXJldFBhZ2UpOw0KKyAgcFBhcmFnLT5VbmxvYWRQYXJhZygpOw0KKyAgcmV0dXJuIG1fbkNhcmV0UGFnZTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6VGV4dFBvczJQYXJhZ1BvcyhpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9UWFRFRFRQQVJBR1BPUyYgUGFyYWdQb3MpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSk7DQorICBpbnQzMl90IG5Db3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICBpbnQzMl90IG5CZ24gPSAwOw0KKyAgaW50MzJfdCBuTWlkID0gMDsNCisgIGludDMyX3QgbkVuZCA9IG5Db3VudCAtIDE7DQorICB3aGlsZSAobkVuZCA+IG5CZ24pIHsNCisgICAgbk1pZCA9IChuQmduICsgbkVuZCkgLyAyOw0KKyAgICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbbk1pZF07DQorICAgIGlmIChuSW5kZXggPCBwUGFyYWctPm1fbkNoYXJTdGFydCkgew0KKyAgICAgIG5FbmQgPSBuTWlkIC0gMTsNCisgICAgfSBlbHNlIGlmIChuSW5kZXggPj0gKHBQYXJhZy0+bV9uQ2hhclN0YXJ0ICsgcFBhcmFnLT5tX25DaGFyQ291bnQpKSB7DQorICAgICAgbkJnbiA9IG5NaWQgKyAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAobkJnbiA9PSBuRW5kKSB7DQorICAgIG5NaWQgPSBuQmduOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KG5JbmRleCA+PSBtX1BhcmFnUHRyQXJyYXlbbk1pZF0tPm1fbkNoYXJTdGFydCAmJg0KKyAgICAgICAgICAgICAgIChuSW5kZXggPCBtX1BhcmFnUHRyQXJyYXlbbk1pZF0tPm1fbkNoYXJTdGFydCArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1BhcmFnUHRyQXJyYXlbbk1pZF0tPm1fbkNoYXJDb3VudCkpOw0KKyAgUGFyYWdQb3MublBhcmFnSW5kZXggPSBuTWlkOw0KKyAgUGFyYWdQb3MubkNoYXJJbmRleCA9IG5JbmRleCAtIG1fUGFyYWdQdHJBcnJheVtuTWlkXS0+bV9uQ2hhclN0YXJ0Ow0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpNb3ZlRm9yd2FyZChGWF9CT09MJiBiQmVmb3JlKSB7DQorICBpZiAobV9uQ2FyZXQgPT0gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkgLSAxKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGludDMyX3QgbkNhcmV0ID0gbV9uQ2FyZXQ7DQorICBpZiAoKG5DYXJldCArIDEgPCBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSkgJiYNCisgICAgICAobV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuQ2FyZXQpID09IEwnXHInKSAmJg0KKyAgICAgIChtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5DYXJldCArIDEpID09IEwnXG4nKSkgew0KKyAgICBuQ2FyZXQrKzsNCisgIH0NCisgIG5DYXJldCsrOw0KKyAgYkJlZm9yZSA9IFRSVUU7DQorICByZXR1cm4gbkNhcmV0Ow0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpNb3ZlQmFja3dhcmQoRlhfQk9PTCYgYkJlZm9yZSkgew0KKyAgaWYgKG1fbkNhcmV0ID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBuQ2FyZXQgPSBtX25DYXJldDsNCisgIGlmIChuQ2FyZXQgPiAyICYmIG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkNhcmV0IC0gMSkgPT0gTCdcbicgJiYNCisgICAgICBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5DYXJldCAtIDIpID09IEwnXHInKSB7DQorICAgIG5DYXJldC0tOw0KKyAgfQ0KKyAgbkNhcmV0LS07DQorICBiQmVmb3JlID0gVFJVRTsNCisgIHJldHVybiBuQ2FyZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVVcChDRlhfUG9pbnRGJiBwdENhcmV0KSB7DQorICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gR2V0UGFnZShtX25DYXJldFBhZ2UpOw0KKyAgY29uc3QgQ0ZYX1JlY3RGJiBydENvbnRlbnQgPSBwUGFnZS0+R2V0Q29udGVudHNCb3goKTsNCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsKSB7DQorICAgIHB0Q2FyZXQueCA9IG1fcnRDYXJldC5sZWZ0ICsgbV9ydENhcmV0LndpZHRoIC8gMiAtIG1fUGFyYW0uZkxpbmVTcGFjZTsNCisgICAgcHRDYXJldC55ID0gbV9mQ2FyZXRQb3NSZXNlcnZlOw0KKyAgICBGWF9CT09MIGJMaW5lUmVzZXJ2ZSA9DQorICAgICAgICBtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0xpbmVSZXNlcnZlOw0KKyAgICBpZiAocHRDYXJldC54IDwgcnRDb250ZW50LmxlZnQpIHsNCisgICAgICBpZiAoYkxpbmVSZXNlcnZlKSB7DQorICAgICAgICBpZiAobV9uQ2FyZXRQYWdlID09IENvdW50UGFnZXMoKSAtIDEpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9uQ2FyZXRQYWdlID09IDApIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoYkxpbmVSZXNlcnZlKSB7DQorICAgICAgICBtX25DYXJldFBhZ2UrKzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9uQ2FyZXRQYWdlLS07DQorICAgICAgfQ0KKyAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUNoYW5nZSh0aGlzLCBtX25DYXJldFBhZ2UpOw0KKyAgICAgIHB0Q2FyZXQueCAtPSBydENvbnRlbnQubGVmdDsNCisgICAgICBJRkRFX1R4dEVkdFBhZ2UqIHBDdXJQYWdlID0gR2V0UGFnZShtX25DYXJldFBhZ2UpOw0KKyAgICAgIHB0Q2FyZXQueCArPSBwQ3VyUGFnZS0+R2V0Q29udGVudHNCb3goKS5yaWdodCgpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBwdENhcmV0LnggPSBtX2ZDYXJldFBvc1Jlc2VydmU7DQorICAgIHB0Q2FyZXQueSA9IG1fcnRDYXJldC50b3AgKyBtX3J0Q2FyZXQuaGVpZ2h0IC8gMiAtIG1fUGFyYW0uZkxpbmVTcGFjZTsNCisgICAgaWYgKHB0Q2FyZXQueSA8IHJ0Q29udGVudC50b3ApIHsNCisgICAgICBpZiAobV9uQ2FyZXRQYWdlID09IDApIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgcHRDYXJldC55IC09IHJ0Q29udGVudC50b3A7DQorICAgICAgbV9uQ2FyZXRQYWdlLS07DQorICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlQ2hhbmdlKHRoaXMsIG1fbkNhcmV0UGFnZSk7DQorICAgICAgSUZERV9UeHRFZHRQYWdlKiBwQ3VyUGFnZSA9IEdldFBhZ2UobV9uQ2FyZXRQYWdlKTsNCisgICAgICBwdENhcmV0LnkgKz0gcEN1clBhZ2UtPkdldENvbnRlbnRzQm94KCkuYm90dG9tKCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlRG93bihDRlhfUG9pbnRGJiBwdENhcmV0KSB7DQorICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gR2V0UGFnZShtX25DYXJldFBhZ2UpOw0KKyAgY29uc3QgQ0ZYX1JlY3RGJiBydENvbnRlbnQgPSBwUGFnZS0+R2V0Q29udGVudHNCb3goKTsNCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsKSB7DQorICAgIHB0Q2FyZXQueCA9IG1fcnRDYXJldC5sZWZ0ICsgbV9ydENhcmV0LndpZHRoIC8gMiArIG1fUGFyYW0uZkxpbmVTcGFjZTsNCisgICAgcHRDYXJldC55ID0gbV9mQ2FyZXRQb3NSZXNlcnZlOw0KKyAgICBpZiAocHRDYXJldC54ID49IHJ0Q29udGVudC5yaWdodCgpKSB7DQorICAgICAgRlhfQk9PTCBiTGluZVJlc2VydmUgPQ0KKyAgICAgICAgICBtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0xpbmVSZXNlcnZlOw0KKyAgICAgIGlmIChiTGluZVJlc2VydmUpIHsNCisgICAgICAgIGlmIChtX25DYXJldFBhZ2UgPT0gMCkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChtX25DYXJldFBhZ2UgPT0gQ291bnRQYWdlcygpIC0gMSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChiTGluZVJlc2VydmUpIHsNCisgICAgICAgIG1fbkNhcmV0UGFnZS0tOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX25DYXJldFBhZ2UrKzsNCisgICAgICB9DQorICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlQ2hhbmdlKHRoaXMsIG1fbkNhcmV0UGFnZSk7DQorICAgICAgcHRDYXJldC54IC09IHJ0Q29udGVudC5yaWdodCgpOw0KKyAgICAgIElGREVfVHh0RWR0UGFnZSogcEN1clBhZ2UgPSBHZXRQYWdlKG1fbkNhcmV0UGFnZSk7DQorICAgICAgcHRDYXJldC54ICs9IHBDdXJQYWdlLT5HZXRDb250ZW50c0JveCgpLmxlZnQ7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHB0Q2FyZXQueCA9IG1fZkNhcmV0UG9zUmVzZXJ2ZTsNCisgICAgcHRDYXJldC55ID0gbV9ydENhcmV0LnRvcCArIG1fcnRDYXJldC5oZWlnaHQgLyAyICsgbV9QYXJhbS5mTGluZVNwYWNlOw0KKyAgICBpZiAocHRDYXJldC55ID49IHJ0Q29udGVudC5ib3R0b20oKSkgew0KKyAgICAgIGlmIChtX25DYXJldFBhZ2UgPT0gQ291bnRQYWdlcygpIC0gMSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBwdENhcmV0LnkgLT0gcnRDb250ZW50LmJvdHRvbSgpOw0KKyAgICAgIG1fbkNhcmV0UGFnZSsrOw0KKyAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUNoYW5nZSh0aGlzLCBtX25DYXJldFBhZ2UpOw0KKyAgICAgIElGREVfVHh0RWR0UGFnZSogcEN1clBhZ2UgPSBHZXRQYWdlKG1fbkNhcmV0UGFnZSk7DQorICAgICAgcHRDYXJldC55ICs9IHBDdXJQYWdlLT5HZXRDb250ZW50c0JveCgpLnRvcDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVMaW5lU3RhcnQoKSB7DQorICBpbnQzMl90IG5JbmRleCA9IG1fYkJlZm9yZSA/IG1fbkNhcmV0IDogbV9uQ2FyZXQgLSAxOw0KKyAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KKyAgVGV4dFBvczJQYXJhZ1BvcyhuSW5kZXgsIFBhcmFnUG9zKTsNCisgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07DQorICBwUGFyYWctPkxvYWRQYXJhZygpOw0KKyAgaW50MzJfdCBuTGluZUNvdW50ID0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaW50MzJfdCBuU3RhcnQgPSAwOw0KKyAgaW50MzJfdCBuQ291bnQgPSAwOw0KKyAgZm9yICg7IGkgPCBuTGluZUNvdW50OyBpKyspIHsNCisgICAgcFBhcmFnLT5HZXRMaW5lUmFuZ2UoaSwgblN0YXJ0LCBuQ291bnQpOw0KKyAgICBpZiAobkluZGV4ID49IG5TdGFydCAmJiBuSW5kZXggPCBuU3RhcnQgKyBuQ291bnQpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgVXBkYXRlQ2FyZXRSZWN0KG5TdGFydCwgVFJVRSk7DQorICBwUGFyYWctPlVubG9hZFBhcmFnKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZUxpbmVFbmQoKSB7DQorICBpbnQzMl90IG5JbmRleCA9IG1fYkJlZm9yZSA/IG1fbkNhcmV0IDogbV9uQ2FyZXQgLSAxOw0KKyAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KKyAgVGV4dFBvczJQYXJhZ1BvcyhuSW5kZXgsIFBhcmFnUG9zKTsNCisgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07DQorICBwUGFyYWctPkxvYWRQYXJhZygpOw0KKyAgaW50MzJfdCBuTGluZUNvdW50ID0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaW50MzJfdCBuU3RhcnQgPSAwOw0KKyAgaW50MzJfdCBuQ291bnQgPSAwOw0KKyAgZm9yICg7IGkgPCBuTGluZUNvdW50OyBpKyspIHsNCisgICAgcFBhcmFnLT5HZXRMaW5lUmFuZ2UoaSwgblN0YXJ0LCBuQ291bnQpOw0KKyAgICBpZiAobkluZGV4ID49IG5TdGFydCAmJiBuSW5kZXggPCBuU3RhcnQgKyBuQ291bnQpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgbkluZGV4ID0gblN0YXJ0ICsgbkNvdW50IC0gMTsNCisgIEZYU1lTX2Fzc2VydChuSW5kZXggPD0gR2V0VGV4dEJ1Zkxlbmd0aCgpKTsNCisgIEZYX1dDSEFSIHdDaGFyID0gbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuSW5kZXgpOw0KKyAgRlhfQk9PTCBiQmVmb3JlID0gRkFMU0U7DQorICBpZiAobkluZGV4IDw9IEdldFRleHRCdWZMZW5ndGgoKSkgew0KKyAgICBpZiAod0NoYXIgPT0gTCdccicpIHsNCisgICAgICBiQmVmb3JlID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICh3Q2hhciA9PSBMJ1xuJyAmJiBuSW5kZXggPiBuU3RhcnQpIHsNCisgICAgICBiQmVmb3JlID0gVFJVRTsNCisgICAgICBuSW5kZXgtLTsNCisgICAgICB3Q2hhciA9IG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkluZGV4KTsNCisgICAgICBpZiAod0NoYXIgIT0gTCdccicpIHsNCisgICAgICAgIG5JbmRleCsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgVXBkYXRlQ2FyZXRSZWN0KG5JbmRleCwgYkJlZm9yZSk7DQorICBwUGFyYWctPlVubG9hZFBhcmFnKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZVBhcmFnU3RhcnQoKSB7DQorICBpbnQzMl90IG5JbmRleCA9IG1fYkJlZm9yZSA/IG1fbkNhcmV0IDogbV9uQ2FyZXQgLSAxOw0KKyAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KKyAgVGV4dFBvczJQYXJhZ1BvcyhuSW5kZXgsIFBhcmFnUG9zKTsNCisgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07DQorICBVcGRhdGVDYXJldFJlY3QocFBhcmFnLT5tX25DaGFyU3RhcnQsIFRSVUUpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVQYXJhZ0VuZCgpIHsNCisgIGludDMyX3QgbkluZGV4ID0gbV9iQmVmb3JlID8gbV9uQ2FyZXQgOiBtX25DYXJldCAtIDE7DQorICBGREVfVFhURURUUEFSQUdQT1MgUGFyYWdQb3M7DQorICBUZXh0UG9zMlBhcmFnUG9zKG5JbmRleCwgUGFyYWdQb3MpOw0KKyAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W1BhcmFnUG9zLm5QYXJhZ0luZGV4XTsNCisgIG5JbmRleCA9IHBQYXJhZy0+bV9uQ2hhclN0YXJ0ICsgcFBhcmFnLT5tX25DaGFyQ291bnQgLSAxOw0KKyAgRlhfV0NIQVIgd0NoYXIgPSBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5JbmRleCk7DQorICBpZiAod0NoYXIgPT0gTCdcbicgJiYgbkluZGV4ID4gMCkgew0KKyAgICBuSW5kZXgtLTsNCisgICAgd0NoYXIgPSBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5JbmRleCk7DQorICAgIGlmICh3Q2hhciAhPSBMJ1xyJykgew0KKyAgICAgIG5JbmRleCsrOw0KKyAgICB9DQorICB9DQorICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlSG9tZSgpIHsNCisgIFVwZGF0ZUNhcmV0UmVjdCgwLCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlRW5kKCkgew0KKyAgVXBkYXRlQ2FyZXRSZWN0KEdldFRleHRCdWZMZW5ndGgoKSwgVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6Ok5vcm1hbGl6ZUNhcmV0UG9zKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJCZWZvcmUpIHsNCisgIGJCZWZvcmUgPSBUUlVFOw0KKyAgaW50MzJfdCBuQmduID0gMCwgbkVuZCA9IDA7DQorICBpbnQzMl90IG5SZWNvcmQgPSAtMTsNCisgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IE5VTEw7DQorICBGWF9CT09MIGJSZXQgPSBHZXRGaWVsZEJvdW5kYXJ5KG5JbmRleCwgbkJnbiwgbkVuZCwgcEZpZWxkKTsNCisgIGludDMyX3QgbkRlbHRhID0gMDsNCisgIGlmIChiUmV0ICYmICFwRmllbGQtPklzRml4KCkpIHsNCisgICAgaWYgKG5JbmRleCAtIG5CZ24gPCBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFKSB7DQorICAgICAgaWYgKG5GbGFncyA9PSBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJEKSB7DQorICAgICAgICBDRkRFX1R4dEVkdEZpZWxkKiBwRWRpdGFibGVGaWVsZCA9IE5VTEw7DQorICAgICAgICBpZiAoRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRWRpdGFibGVGaWVsZCwgRkFMU0UpKSB7DQorICAgICAgICAgIHJldHVybiBwRWRpdGFibGVGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MobkVuZCAtIG5CZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCkgKw0KKyAgICAgICAgICAgICAgICAgbkJnbjsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgbkluZGV4ID0gbkJnbiArIEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkU7DQorICAgIH0NCisgICAgaW50MzJfdCBuUmV0ID0gcEZpZWxkLT5Ob3JtYWxpemVDYXJldFBvcygNCisgICAgICAgIG5JbmRleCAtIG5CZ24sIChGREVfRk9STUFUX0NBUkVUX0RJUkVDVElPTiluRmxhZ3MpOw0KKyAgICBpZiAoblJldCA+PSAwKSB7DQorICAgICAgcmV0dXJuIG5SZXQgKyBuQmduOw0KKyAgICB9DQorICAgIGlmIChuUmV0ID09IC0yKSB7DQorICAgICAgaW50MzJfdCBuRWRpdGFibGVQb3NCZ24gPSAwLCBuRWRpdGFibGVQb3NFbmQgPSAwOw0KKyAgICAgIHBGaWVsZC0+R2V0RWRpdGFibGVSYW5nZShuRWRpdGFibGVQb3NCZ24sIG5FZGl0YWJsZVBvc0VuZCk7DQorICAgICAgblJlY29yZCA9IG5CZ24gKyBuRWRpdGFibGVQb3NCZ247DQorICAgICAgbkZsYWdzID0gRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRDsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWFNZU19hc3NlcnQoblJldCA9PSAtMSk7DQorICAgICAgaW50MzJfdCBuRWRpdGFibGVQb3NCZ24gPSAwLCBuRWRpdGFibGVQb3NFbmQgPSAwOw0KKyAgICAgIHBGaWVsZC0+R2V0RWRpdGFibGVSYW5nZShuRWRpdGFibGVQb3NCZ24sIG5FZGl0YWJsZVBvc0VuZCk7DQorICAgICAgblJlY29yZCA9IG5CZ24gKyBuRWRpdGFibGVQb3NFbmQ7DQorICAgICAgbkZsYWdzID0gRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJEOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKCFiUmV0KSB7DQorICAgIG5EZWx0YSA9IEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkUgLSBGREVfRk9STUFUX0VESVRfRklFTERfVEFJTFNJWkU7DQorICB9DQorICBzd2l0Y2ggKG5GbGFncykgew0KKyAgICBjYXNlIEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRDogew0KKyAgICAgIGlmIChGaW5kRWRpdGFibGVGaWVsZChuSW5kZXgsIG5CZ24sIG5FbmQsIHBGaWVsZCkpIHsNCisgICAgICAgIHJldHVybiBwRmllbGQtPk5vcm1hbGl6ZUNhcmV0UG9zKEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfRk9STUFUX0NBUkVUX0ZPUldBUkQpICsNCisgICAgICAgICAgICAgICBuQmduOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoblJlY29yZCAhPSAtMSkgew0KKyAgICAgICAgICByZXR1cm4gblJlY29yZDsNCisgICAgICAgIH0NCisgICAgICAgIGJSZXQgPSBGaW5kRWRpdGFibGVGaWVsZChuSW5kZXgsIG5CZ24sIG5FbmQsIHBGaWVsZCwgRkFMU0UpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KGJSZXQpOw0KKyAgICAgICAgcmV0dXJuIHBGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MobkVuZCAtIG5CZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJEKSArDQorICAgICAgICAgICAgICAgbkJnbjsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRkRFX0ZPUk1BVF9DQVJFVF9NSURETEU6IHsNCisgICAgICBpbnQzMl90IG5CZ24xID0gMCwgbkVuZDEgPSAwLCBuQmduMiA9IDAsIG5FbmQyID0gMDsNCisgICAgICBDRkRFX1R4dEVkdEZpZWxkKiBwRWRpdGFibGVGaWVsZDEgPSBOVUxMOw0KKyAgICAgIENGREVfVHh0RWR0RmllbGQqIHBFZGl0YWJsZUZpZWxkMiA9IE5VTEw7DQorICAgICAgRlhfQk9PTCBiUmV0MSA9DQorICAgICAgICAgIEZpbmRFZGl0YWJsZUZpZWxkKG5JbmRleCwgbkJnbjEsIG5FbmQxLCBwRWRpdGFibGVGaWVsZDEsIEZBTFNFKTsNCisgICAgICBGWF9CT09MIGJSZXQyID0gRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduMiwgbkVuZDIsIHBFZGl0YWJsZUZpZWxkMik7DQorICAgICAgaWYgKGJSZXQxID09IEZBTFNFKSB7DQorICAgICAgICBGWFNZU19hc3NlcnQoYlJldDIpOw0KKyAgICAgICAgcmV0dXJuIHBFZGl0YWJsZUZpZWxkMi0+Tm9ybWFsaXplQ2FyZXRQb3MoDQorICAgICAgICAgICAgICAgICAgIEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkUsIEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCkgKw0KKyAgICAgICAgICAgICAgIG5CZ24yOw0KKyAgICAgIH0gZWxzZSBpZiAoYlJldDIgPT0gRkFMU0UpIHsNCisgICAgICAgIEZYU1lTX2Fzc2VydChiUmV0MSk7DQorICAgICAgICByZXR1cm4gcEVkaXRhYmxlRmllbGQxLT5Ob3JtYWxpemVDYXJldFBvcyhuRW5kMSAtIG5CZ24xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCkgKw0KKyAgICAgICAgICAgICAgIG5CZ24xOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpbnQzMl90IG5FZGl0YWJsZVBvc0JnbiA9IDAsIG5FZGl0YWJsZVBvc0VuZCA9IDA7DQorICAgICAgICBpZiAobkluZGV4IC0gbkVuZDEgPCBuQmduMiArIG5EZWx0YSAtIG5JbmRleCkgew0KKyAgICAgICAgICBwRWRpdGFibGVGaWVsZDEtPkdldEVkaXRhYmxlUmFuZ2UobkVkaXRhYmxlUG9zQmduLCBuRWRpdGFibGVQb3NFbmQpOw0KKyAgICAgICAgICByZXR1cm4gbkVkaXRhYmxlUG9zRW5kICsgbkJnbjE7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBwRWRpdGFibGVGaWVsZDItPkdldEVkaXRhYmxlUmFuZ2UobkVkaXRhYmxlUG9zQmduLCBuRWRpdGFibGVQb3NFbmQpOw0KKyAgICAgICAgICByZXR1cm4gbkVkaXRhYmxlUG9zQmduICsgbkJnbjI7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQ6IHsNCisgICAgICBpZiAoRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRmllbGQsIEZBTFNFKSkgew0KKyAgICAgICAgcmV0dXJuIHBGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MobkVuZCAtIG5CZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJEKSArDQorICAgICAgICAgICAgICAgbkJnbjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG5SZWNvcmQgIT0gLTEpIHsNCisgICAgICAgICAgcmV0dXJuIG5SZWNvcmQ7DQorICAgICAgICB9DQorICAgICAgICBiUmV0ID0gRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRmllbGQpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KGJSZXQpOw0KKyAgICAgICAgcmV0dXJuIHBGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MoRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCkgKw0KKyAgICAgICAgICAgICAgIG5CZ247DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgICByZXR1cm4gbkluZGV4Ow0KKyAgfQ0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpHZXRGaWVsZEJvdW5kYXJ5KGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkJnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5FbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkKiYgcEZpZWxkKSB7DQorICBDRkRFX1R4dEVkdEJ1Zkl0ZXIqIHBJdGVyID0NCisgICAgICBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmLCBGQUxTRSk7DQorICBwSXRlci0+U2V0QXQobkluZGV4KTsNCisgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsNCisgIGRvIHsNCisgICAgRlhfV0NIQVIgd2MgPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQpIHsNCisgICAgICBuRW5kID0gcEl0ZXItPkdldEF0KCk7DQorICAgICAgYkZpbmQgPSBUUlVFOw0KKyAgICAgIG5JbmRleC0tOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmICh3YyA9PSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0JHTikgew0KKyAgICAgIHBJdGVyLT5SZWxlYXNlKCk7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9IHdoaWxlIChwSXRlci0+TmV4dCgpKTsNCisgIGlmICghYkZpbmQpIHsNCisgICAgcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcEl0ZXItPlNldEF0KG5JbmRleCk7DQorICBkbyB7DQorICAgIEZYX1dDSEFSIHdjID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOKSB7DQorICAgICAgbkJnbiA9IHBJdGVyLT5HZXRBdCgpOw0KKyAgICAgIHBJdGVyLT5OZXh0KCk7DQorICAgICAgRlhfRFdPUkQgZHdQcmUgPSAoRlhfRFdPUkQpcEl0ZXItPkdldENoYXIoKTsNCisgICAgICBwSXRlci0+TmV4dCgpOw0KKyAgICAgIEZYX0RXT1JEIGR3Q3VyID0gKEZYX0RXT1JEKXBJdGVyLT5HZXRDaGFyKCk7DQorICAgICAgcEZpZWxkID0gKENGREVfVHh0RWR0RmllbGQqKSgoZHdDdXIgPDwgMTYpIHwgZHdQcmUpOw0KKyAgICAgIHBJdGVyLT5SZWxlYXNlKCk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5EKSB7DQorICAgICAgcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KFRSVUUpKTsNCisgIHBJdGVyLT5SZWxlYXNlKCk7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OkZpbmRFZGl0YWJsZUZpZWxkKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5CZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkKiYgcEZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvcndhcmQpIHsNCisgIEZYX1dDSEFSIHdjRmlyc3QgPSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0JHTjsNCisgIEZYX1dDSEFSIHdjU2Vjb25kID0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQ7DQorICBpZiAoIWJGb3J3YXJkKSB7DQorICAgIHdjRmlyc3QgPSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0VORDsNCisgICAgd2NTZWNvbmQgPSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0JHTjsNCisgIH0NCisgIENGREVfVHh0RWR0QnVmSXRlciogcEl0ZXIgPQ0KKyAgICAgIEZYX05FVyBDRkRFX1R4dEVkdEJ1Zkl0ZXIoKENGREVfVHh0RWR0QnVmKiltX3BUeHRCdWYsIEZBTFNFKTsNCisgIHBJdGVyLT5TZXRBdChuSW5kZXgpOw0KKyAgaW50MzJfdCBiRmluZCA9IEZBTFNFOw0KKyAgZG8gew0KKyAgICBGWF9XQ0hBUiB3YyA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgIGlmICh3YyA9PSB3Y0ZpcnN0KSB7DQorICAgICAgbkJnbiA9IHBJdGVyLT5HZXRBdCgpOw0KKyAgICAgIGJGaW5kID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfSB3aGlsZSAocEl0ZXItPk5leHQoIWJGb3J3YXJkKSk7DQorICBpZiAoIWJGaW5kKSB7DQorICAgIHBJdGVyLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGJGaW5kID0gRkFMU0U7DQorICBkbyB7DQorICAgIEZYX1dDSEFSIHdjID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgaWYgKHdjID09IHdjU2Vjb25kKSB7DQorICAgICAgbkVuZCA9IHBJdGVyLT5HZXRBdCgpOw0KKyAgICAgIGJGaW5kID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfSB3aGlsZSAocEl0ZXItPk5leHQoIWJGb3J3YXJkKSk7DQorICBGWFNZU19hc3NlcnQoYkZpbmQpOw0KKyAgaWYgKCFiRm9yd2FyZCkgew0KKyAgICBpbnQzMl90IG5UZW1wID0gbkJnbjsNCisgICAgbkJnbiA9IG5FbmQ7DQorICAgIG5FbmQgPSBuVGVtcDsNCisgIH0NCisgIHBJdGVyLT5TZXRBdChuQmduICsgMSk7DQorICBGWF9EV09SRCBkd1ByZSA9IChGWF9EV09SRClwSXRlci0+R2V0Q2hhcigpOw0KKyAgcEl0ZXItPk5leHQoKTsNCisgIEZYX0RXT1JEIGR3Q3VyID0gKEZYX0RXT1JEKXBJdGVyLT5HZXRDaGFyKCk7DQorICBwRmllbGQgPSAoQ0ZERV9UeHRFZHRGaWVsZCopKChkd0N1ciA8PCAxNikgfCBkd1ByZSk7DQorICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgaWYgKCFwRmllbGQtPklzRml4KCkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRmluZEVkaXRhYmxlRmllbGQoKGJGb3J3YXJkID8gbkVuZCA6IG5CZ24pLCBuQmduLCBuRW5kLCBwRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZvcndhcmQpOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlMk5leHRFZGl0YWJsZUZpZWxkKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9yd2FyZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdCkgew0KKyAgaWYgKG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpID4gMCkgew0KKyAgICBDbGVhclNlbGVjdGlvbigpOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1NlbENoYW5nZWQodGhpcyk7DQorICB9DQorICBpbnQzMl90IG5CZ24gPSAwLCBuRW5kID0gMDsNCisgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IE5VTEw7DQorICBGWF9CT09MIGJSZXQgPSBGaW5kRWRpdGFibGVGaWVsZChuSW5kZXgsIG5CZ24sIG5FbmQsIHBGaWVsZCwgYkZvcndhcmQpOw0KKyAgaWYgKCFiUmV0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgbkVkaXRhYmxlQmduID0gMCwgbkVkaXRhYmxlRW5kID0gMDsNCisgIHBGaWVsZC0+R2V0RWRpdGFibGVSYW5nZShuRWRpdGFibGVCZ24sIG5FZGl0YWJsZUVuZCk7DQorICBuRWRpdGFibGVCZ24gKz0gbkJnbjsNCisgIG5FZGl0YWJsZUVuZCArPSBuQmduOw0KKyAgaWYgKGJTZWxlY3QpIHsNCisgICAgaW50MzJfdCBuUmFuZ2VDb3VudCA9IG5FZGl0YWJsZUVuZCAtIG5FZGl0YWJsZUJnbjsNCisgICAgaWYgKG5SYW5nZUNvdW50ID4gMCkgew0KKyAgICAgIEFkZFNlbFJhbmdlKG5FZGl0YWJsZUJnbiwgbkVkaXRhYmxlRW5kIC0gbkVkaXRhYmxlQmduKTsNCisgICAgfQ0KKyAgfQ0KKyAgU2V0Q2FyZXRQb3MobkVkaXRhYmxlRW5kLCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpHZXRSZWFsSW5kZXgoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsNCisgIENGREVfVHh0RWR0QnVmSXRlciogcEl0ZXIgPQ0KKyAgICAgIEZYX05FVyBDRkRFX1R4dEVkdEJ1Zkl0ZXIoKENGREVfVHh0RWR0QnVmKiltX3BUeHRCdWYsIEZBTFNFKTsNCisgIHBJdGVyLT5TZXRBdCgwKTsNCisgIEZYX0JPT0wgYkluRmllbGQgPSBGQUxTRTsNCisgIGludDMyX3QgbkZpZWxkQmduID0gMDsNCisgIGludDMyX3QgblJlYWxJbmRleCA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPD0gbkluZGV4OyBpKyspIHsNCisgICAgRlhfV0NIQVIgd2MgPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICBpZiAoYkluRmllbGQpIHsNCisgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQpIHsNCisgICAgICAgIEZYX0RXT1JEIGR3UHJlID0gKEZYX0RXT1JEKW1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkZpZWxkQmduICsgMSk7DQorICAgICAgICBGWF9EV09SRCBkd0N1ciA9IChGWF9EV09SRCltX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5GaWVsZEJnbiArIDIpOw0KKyAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gKENGREVfVHh0RWR0RmllbGQqKSgoZHdDdXIgPDwgMTYpIHwgZHdQcmUpOw0KKyAgICAgICAgblJlYWxJbmRleCArPSBwRmllbGQtPkdldEZpZWxkVGV4dExlbmd0aCgpOw0KKyAgICAgICAgYkluRmllbGQgPSBGQUxTRTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOKSB7DQorICAgICAgICBiSW5GaWVsZCA9IFRSVUU7DQorICAgICAgICBuRmllbGRCZ24gPSBwSXRlci0+R2V0QXQoKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgblJlYWxJbmRleCsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBwSXRlci0+TmV4dCgpOw0KKyAgfQ0KKyAgaWYgKCFiSW5GaWVsZCkgew0KKyAgICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gblJlYWxJbmRleDsNCisgIH0NCisgIHBJdGVyLT5TZXRBdChuRmllbGRCZ24gKyAxKTsNCisgIEZYX0RXT1JEIGR3UHJlID0gKEZYX0RXT1JEKXBJdGVyLT5HZXRDaGFyKCk7DQorICBwSXRlci0+TmV4dCgpOw0KKyAgRlhfRFdPUkQgZHdDdXIgPSAoRlhfRFdPUkQpcEl0ZXItPkdldENoYXIoKTsNCisgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IChDRkRFX1R4dEVkdEZpZWxkKikoKGR3Q3VyIDw8IDE2KSB8IGR3UHJlKTsNCisgIHBJdGVyLT5SZWxlYXNlKCk7DQorICBpZiAocEZpZWxkLT5Jc0ZpeCgpKSB7DQorICAgIGludDMyX3QgbkRlbHRhID0gbkluZGV4IC0gbkZpZWxkQmduIC0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSArIDE7DQorICAgIHJldHVybiBuUmVhbEluZGV4ICsgKG5EZWx0YSA+IDAgPyBuRGVsdGEgOiAwKTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBuUmVhbEluZGV4ICsgcEZpZWxkLT5HZXRSZWFsSW5kZXgobkluZGV4IC0gbkZpZWxkQmduKTsNCisgIH0NCit9DQorI2VuZGlmDQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6SXNGaXRBcmVhKENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIElGREVfVGV4dE91dCogcFRleHRPdXQgPSBJRkRFX1RleHRPdXQ6OkNyZWF0ZSgpOw0KKyAgcFRleHRPdXQtPlNldExpbmVTcGFjZShtX1BhcmFtLmZMaW5lU3BhY2UpOw0KKyAgcFRleHRPdXQtPlNldEZvbnQobV9QYXJhbS5wRm9udCk7DQorICBwVGV4dE91dC0+U2V0Rm9udFNpemUobV9QYXJhbS5mRm9udFNpemUpOw0KKyAgQ0ZYX1JlY3RGIHJjVGV4dDsNCisgIEZYU1lTX21lbXNldCgmcmNUZXh0LCAwLCBzaXplb2YocmNUZXh0KSk7DQorICBGWF9EV09SRCBkd1N0eWxlID0gMDsNCisgIGlmICghKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9NdWx0aUxpbmVzKSkgew0KKyAgICBkd1N0eWxlIHw9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KKyAgfQ0KKyAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9BdXRvTGluZVdyYXApIHsNCisgICAgZHdTdHlsZSB8PSBGREVfVFRPU1RZTEVfTGluZVdyYXA7DQorICAgIHJjVGV4dC53aWR0aCA9IG1fUGFyYW0uZlBsYXRlV2lkdGg7DQorICB9IGVsc2Ugew0KKyAgICByY1RleHQud2lkdGggPSA2NTUzNTsNCisgIH0NCisgIHBUZXh0T3V0LT5TZXRTdHlsZXMoZHdTdHlsZSk7DQorICB3c1RleHQgKz0gTCJcbiI7DQorICBwVGV4dE91dC0+Q2FsY0xvZ2ljU2l6ZSh3c1RleHQsIHdzVGV4dC5HZXRMZW5ndGgoKSwgcmNUZXh0KTsNCisgIHBUZXh0T3V0LT5SZWxlYXNlKCk7DQorICB3c1RleHQuRGVsZXRlKHdzVGV4dC5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgaWYgKChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX0hvcnopICYmDQorICAgICAgKHJjVGV4dC53aWR0aCA+IG1fUGFyYW0uZlBsYXRlV2lkdGgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICgobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9WZXJ0KSAmJg0KKyAgICAgIChyY1RleHQuaGVpZ2h0ID4gbV9QYXJhbS5mTGluZVNwYWNlICogbV9QYXJhbS5uTGluZUNvdW50KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6VXBkYXRlQ2FyZXRSZWN0KGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJCZWZvcmUpIHsNCisgIE1vdmVQYWdlMkNoYXIobkluZGV4KTsNCisgIEdldENhcmV0UmVjdChtX3J0Q2FyZXQsIG1fbkNhcmV0UGFnZSwgbkluZGV4LCBiQmVmb3JlKTsNCisgIG1fbkNhcmV0ID0gbkluZGV4Ow0KKyAgbV9iQmVmb3JlID0gYkJlZm9yZTsNCisgIGlmICghbV9iQmVmb3JlKSB7DQorICAgIG1fbkNhcmV0Kys7DQorICAgIG1fYkJlZm9yZSA9IFRSVUU7DQorICB9DQorICBtX2ZDYXJldFBvc1Jlc2VydmUgPSAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fcnRDYXJldC50b3ANCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fcnRDYXJldC5sZWZ0Ow0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9DYXJldENoYW5nZWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0Q2FyZXRSZWN0KENGWF9SZWN0RiYgcnRDYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUGFnZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQmVmb3JlKSB7DQorICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9QYWdlUHRyQXJyYXlbbV9uQ2FyZXRQYWdlXTsNCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCisgIEZYX0JPT0wgYkNvbWJUZXh0ID0gbV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Db21iVGV4dDsNCisgIGludDMyX3QgbkluZGV4SW5wYWdlID0gbkNhcmV0IC0gcFBhZ2UtPkdldENoYXJTdGFydCgpOw0KKyAgaWYgKGJCZWZvcmUgJiYgYkNvbWJUZXh0ICYmIG5JbmRleElucGFnZSA+IDApIHsNCisgICAgbkluZGV4SW5wYWdlLS07DQorICAgIGJCZWZvcmUgPSBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgbkJJRElMZXZlbCA9IHBQYWdlLT5HZXRDaGFyUmVjdChuSW5kZXhJbnBhZ2UsIHJ0Q2FyZXQsIGJDb21iVGV4dCk7DQorICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbCkgew0KKyAgICBpZiAoKCFGWF9Jc09kZChuQklESUxldmVsKSAmJiAhYkJlZm9yZSkgfHwNCisgICAgICAgIChGWF9Jc09kZChuQklESUxldmVsKSAmJiBiQmVmb3JlKSkgew0KKyAgICAgIHJ0Q2FyZXQuT2Zmc2V0KDAsIHJ0Q2FyZXQuaGVpZ2h0IC0gMS4wZik7DQorICAgIH0NCisgICAgaWYgKHJ0Q2FyZXQuaGVpZ2h0ID09IDAgJiYgcnRDYXJldC50b3AgPiAxLjBmKSB7DQorICAgICAgcnRDYXJldC50b3AgLT0gMS4wZjsNCisgICAgfQ0KKyAgICBydENhcmV0LmhlaWdodCA9IDEuMGY7DQorICB9IGVsc2Ugew0KKyAgICBpZiAoKCFGWF9Jc09kZChuQklESUxldmVsKSAmJiAhYkJlZm9yZSkgfHwNCisgICAgICAgIChGWF9Jc09kZChuQklESUxldmVsKSAmJiBiQmVmb3JlKSkgew0KKyAgICAgIHJ0Q2FyZXQuT2Zmc2V0KHJ0Q2FyZXQud2lkdGggLSAxLjBmLCAwKTsNCisgICAgfQ0KKyAgICBpZiAocnRDYXJldC53aWR0aCA9PSAwICYmIHJ0Q2FyZXQubGVmdCA+IDEuMGYpIHsNCisgICAgICBydENhcmV0LmxlZnQgLT0gMS4wZjsNCisgICAgfQ0KKyAgICBydENhcmV0LndpZHRoID0gMS4wZjsNCisgIH0NCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVDYXJldEluZGV4KGNvbnN0IENGWF9Qb2ludEYmIHB0Q2FyZXQpIHsNCisgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX1BhZ2VQdHJBcnJheVttX25DYXJldFBhZ2VdOw0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlTG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgbV9uQ2FyZXQgPSBwUGFnZS0+R2V0Q2hhckluZGV4KHB0Q2FyZXQsIG1fYkJlZm9yZSk7DQorICBHZXRDYXJldFJlY3QobV9ydENhcmV0LCBtX25DYXJldFBhZ2UsIG1fbkNhcmV0LCBtX2JCZWZvcmUpOw0KKyAgaWYgKCFtX2JCZWZvcmUpIHsNCisgICAgbV9uQ2FyZXQrKzsNCisgICAgbV9iQmVmb3JlID0gVFJVRTsNCisgIH0NCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQ2FyZXRDaGFuZ2VkKHRoaXMsIG1fbkNhcmV0UGFnZSk7DQorICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6SXNTZWxlY3QoKSB7DQorICByZXR1cm4gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCkgPiAwOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpEZWxldGVTZWxlY3QoKSB7DQorICBpbnQzMl90IG5Db3VudFJhbmdlID0gQ291bnRTZWxSYW5nZXMoKTsNCisgIGlmIChuQ291bnRSYW5nZSA+IDApIHsNCiAjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQogICAgIGludDMyX3QgbkJsb2NrQ291bnQgPSBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KICAgICBpZiAobkJsb2NrQ291bnQgPiAwKSB7DQotICAgIH0NCi0jZW5kaWYNCi0gICAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1JhbmdlOw0KLSAgICAgICAgbV9wVHh0QnVmLT5HZXRSYW5nZSh3c1JhbmdlLCBuU3RhcnQsIG5Db3VudCk7DQotICAgICAgICBJRkRFX1R4dEVkdERvUmVjb3JkICogcFJlY29yZCA9IEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlKHRoaXMsIG5TdGFydCwgbV9uQ2FyZXQsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NSYW5nZSwgYlNlbCk7DQorICAgICAgaWYgKG5Db3VudFJhbmdlID4gMSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBpbnQzMl90IG5TZWxTdGFydDsNCisgICAgICBpbnQzMl90IG5TZWxDb3VudDsNCisgICAgICBuU2VsQ291bnQgPSBHZXRTZWxSYW5nZSgwLCBuU2VsU3RhcnQpOw0KKyAgICAgIGludDMyX3QgblNlbEVuZCA9IG5TZWxTdGFydCArIG5TZWxDb3VudDsNCisgICAgICBpbnQzMl90IG5CZ24gPSAwOw0KKyAgICAgIGludDMyX3QgbkVuZCA9IDA7DQorICAgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gTlVMTDsNCisgICAgICBGWF9CT09MIGJJbkZpZWxkID0gR2V0RmllbGRCb3VuZGFyeShuU2VsU3RhcnQsIG5CZ24sIG5FbmQsIHBGaWVsZCk7DQorICAgICAgaW50MzJfdCBuQ2FyZXRJbkZpZWxkID0gblNlbFN0YXJ0IC0gbkJnbjsNCisgICAgICBGWF9CT09MIGJCZWZvcmUgPSBGQUxTRTsNCisgICAgICBpZiAoIWJJbkZpZWxkIHx8IHBGaWVsZC0+SXNGaXgoKSB8fCBuU2VsRW5kID4gbkVuZCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBwRmllbGQtPkJhY2t1cCgpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGVsOw0KKyAgICAgIGludDMyX3QgbkNhcmV0ID0gMDsNCisgICAgICBpbnQzMl90IG5SZXQgPQ0KKyAgICAgICAgICBwRmllbGQtPkRlbGV0ZShuQ2FyZXRJbkZpZWxkLCBuU2VsQ291bnQsIHdzRGVsLCBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgICAgIG5DYXJldCArPSBuQmduOw0KKyAgICAgIHN3aXRjaCAoblJldCkgew0KKyAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfUzoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0lOVkFMSURBVEU6DQorICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0JPVU5EQVJZOg0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBGWFNZU19hc3NlcnQoMCk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkOw0KKyAgICAgIHBGaWVsZC0+R2V0RmllbGRUZXh0KHdzRmllbGQpOw0KKyAgICAgIGlmICghbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9WYWxpZGF0ZUZpZWxkKA0KKyAgICAgICAgICAgICAgdGhpcywgcEZpZWxkLT5HZXRCbG9ja0luZGV4KCksIHBGaWVsZC0+R2V0SW5kZXgoKSwgd3NGaWVsZCwgMCkpIHsNCisgICAgICAgIHBGaWVsZC0+UmVzdG9yZSgpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICAgICAgcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgICAgIFJlcGxhY2UobkJnbiwgbkVuZCAtIG5CZ24gKyAxLCB3c0Rpc3BsYXkpOw0KKyAgICAgIGlmICghKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9Ob1JlZG9VbmRvKSkgew0KKyAgICAgICAgSUZERV9UeHRFZHREb1JlY29yZCogcFJlY29yZCA9IEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKA0KKyAgICAgICAgICAgIHRoaXMsIG5TZWxTdGFydCwgcEZpZWxkLCBuQ2FyZXRJbkZpZWxkLCBuQmduLCBuRW5kIC0gbkJnbiArIDEsDQorICAgICAgICAgICAgd3NEaXNwbGF5LkdldExlbmd0aCgpLCB3c0RlbCwgRkFMU0UpOw0KICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCiAgICAgICAgIHBSZWNvcmQtPlNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCiAgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQWRkRG9SZWNvcmQodGhpcywgYnNEb1JlY29yZCk7DQogICAgICAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQorICAgICAgfQ0KKyAgICAgIFNldENhcmV0UG9zKG5TZWxTdGFydCwgYkJlZm9yZSk7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQotICAgIG1fQ2hhbmdlSW5mby5uQ2hhbmdlVHlwZQk9IEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0RlbGV0ZTsNCi0gICAgR2V0VGV4dChtX0NoYW5nZUluZm8ud3NEZWxldGUsIG5TdGFydCwgbkNvdW50KTsNCi0gICAgSW5uZXJfRGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpSZXNldEVuZ2luZSgpDQotew0KLSAgICBSZW1vdmVBbGxQYWdlcygpOw0KLSAgICBSZW1vdmVBbGxQYXJhZ3MoKTsNCisjZW5kaWYNCisgICAgaW50MzJfdCBuU2VsU3RhcnQ7DQorICAgIGludDMyX3QgblNlbENvdW50Ow0KKyAgICB3aGlsZSAobkNvdW50UmFuZ2UgPiAwKSB7DQorICAgICAgblNlbENvdW50ID0gR2V0U2VsUmFuZ2UoLS1uQ291bnRSYW5nZSwgblNlbFN0YXJ0KTsNCisgICAgICBGREVfTFBUWFRFRFRTRUxSQU5HRSBscFRlbXAgPSBtX1NlbFJhbmdlUHRyQXJyW25Db3VudFJhbmdlXTsNCisgICAgICBkZWxldGUgbHBUZW1wOw0KKyAgICAgIG1fU2VsUmFuZ2VQdHJBcnIuUmVtb3ZlQXQobkNvdW50UmFuZ2UpOw0KKyAgICAgIERlbGV0ZVJhbmdlX0RvUmVjb3JkKG5TZWxTdGFydCwgblNlbENvdW50LCBUUlVFKTsNCisgICAgfQ0KICAgICBDbGVhclNlbGVjdGlvbigpOw0KLSAgICBtX25DYXJldCA9IDA7DQotICAgIG1fcFR4dEJ1Zi0+Q2xlYXIoRkFMU0UpOw0KLSAgICBtX25DYXJldCA9IDA7DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQodGhpcywgbV9DaGFuZ2VJbmZvKTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KKyAgICBTZXRDYXJldFBvcyhuU2VsU3RhcnQsIFRSVUUpOw0KKyAgICByZXR1cm47DQorICB9DQogfQ0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlYnVpbGRQYXJhZ3JhcGhzKCkNCi17DQotICAgIFJlbW92ZUFsbFBhcmFncygpOw0KLSAgICBGWF9XQ0hBUiB3Q2hhcgkJCT0gTCcgJzsNCi0gICAgRlhfV0NIQVIgd0NoYXJQcmUJCT0gTCcgJzsNCi0gICAgaW50MzJfdCBuUGFyYWdTdGFydAk9IDA7DQotICAgIGludDMyX3QgbkNvdW50CQkJPSBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKTsNCi0gICAgaW50MzJfdCBuSW5kZXgJCQkJPSAwOw0KLSAgICBDRkRFX1R4dEVkdFBhcmFnICogcFBhcmFnCT0gTlVMTDsNCi0gICAgSUZYX0NoYXJJdGVyICogcEl0ZXIJPSBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmKTsNCi0gICAgcEl0ZXItPlNldEF0KDApOw0KLSAgICBkbyB7DQotICAgICAgICB3Q2hhcgk9IHBJdGVyLT5HZXRDaGFyKCk7DQotICAgICAgICBuSW5kZXgJPSBwSXRlci0+R2V0QXQoKTsNCi0gICAgICAgIGlmICh3Q2hhciA9PSBtX3dMaW5lRW5kKSB7DQotICAgICAgICAgICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZyA9IEZYX05FVyBDRkRFX1R4dEVkdFBhcmFnKHRoaXMpOw0KLSAgICAgICAgICAgIHBQYXJhZy0+bV9uQ2hhclN0YXJ0ID0gblBhcmFnU3RhcnQ7DQotICAgICAgICAgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgPSBuSW5kZXggLSBuUGFyYWdTdGFydCArIDE7DQotICAgICAgICAgICAgcFBhcmFnLT5tX25MaW5lQ291bnQgPSAtMTsNCi0gICAgICAgICAgICBtX1BhcmFnUHRyQXJyYXkuQWRkKHBQYXJhZyk7DQotICAgICAgICAgICAgblBhcmFnU3RhcnQgPSBuSW5kZXggKyAxOw0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlIChwSXRlci0+TmV4dCgpKTsNCi0gICAgcEl0ZXItPlJlbGVhc2UoKTsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVtb3ZlQWxsUGFyYWdzKCkNCi17DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtpXTsNCi0gICAgICAgIGlmIChwUGFyYWcpIHsNCi0gICAgICAgICAgICBkZWxldGUgcFBhcmFnOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fUGFyYWdQdHJBcnJheS5SZW1vdmVBbGwoKTsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVtb3ZlQWxsUGFnZXMoKQ0KLXsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBtX1BhZ2VQdHJBcnJheS5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIElGREVfVHh0RWR0UGFnZSAqIHBQYWdlID0gbV9QYWdlUHRyQXJyYXlbaV07DQotICAgICAgICBpZiAocFBhZ2UpIHsNCi0gICAgICAgICAgICBwUGFnZS0+UmVsZWFzZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fUGFnZVB0ckFycmF5LlJlbW92ZUFsbCgpOw0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVQYXJhZ3MoKQ0KLXsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBpZiAobkNvdW50ID09IDApIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRkRFX1R4dEVkdFBhcmFnICogcFBhcmFnID0gTlVMTDsNCi0gICAgaW50MzJfdCBuTGluZUNvdW50ID0gMDsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W2ldOw0KLSAgICAgICAgaWYgKHBQYXJhZy0+bV9uTGluZUNvdW50ID09IC0xKSB7DQotICAgICAgICAgICAgcFBhcmFnLT5DYWxjTGluZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG5MaW5lQ291bnQgKz0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQotICAgIH0NCi0gICAgbV9uTGluZUNvdW50ID0gbkxpbmVDb3VudDsNCi19DQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6VXBkYXRlUGFnZXMoKQ0KLXsNCi0gICAgaWYgKG1fbkxpbmVDb3VudCA9PSAwKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBuUGFnZUNvdW50CT0gKG1fbkxpbmVDb3VudCAtIDEpIC8gKG1fblBhZ2VMaW5lQ291bnQpICsgMTsNCi0gICAgaW50MzJfdCBuU2l6ZQkJPSBtX1BhZ2VQdHJBcnJheS5HZXRTaXplKCk7DQotICAgIGlmIChuU2l6ZSA9PSBuUGFnZUNvdW50KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG5TaXplID4gblBhZ2VDb3VudCkgew0KLSAgICAgICAgSUZERV9UeHRFZHRQYWdlICogcFBhZ2UgPSBOVUxMOw0KLSAgICAgICAgaW50MzJfdCBpID0gMDsNCi0gICAgICAgIGZvciAoaSA9IG5TaXplIC0gMTsgaSA+PSBuUGFnZUNvdW50OyBpIC0tKSB7DQotICAgICAgICAgICAgcFBhZ2UgPSBtX1BhZ2VQdHJBcnJheVtpXTsNCi0gICAgICAgICAgICBpZiAocFBhZ2UpIHsNCi0gICAgICAgICAgICAgICAgcFBhZ2UtPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9QYWdlUHRyQXJyYXkuUmVtb3ZlQXQoaSk7DQotICAgICAgICB9DQotICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VDb3VudENoYW5nZWQodGhpcyk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG5TaXplIDwgblBhZ2VDb3VudCkgew0KLSAgICAgICAgSUZERV9UeHRFZHRQYWdlICogcFBhZ2UgPSBOVUxMOw0KLSAgICAgICAgaW50MzJfdCBpID0gMDsNCi0gICAgICAgIGZvciAoaSA9IG5TaXplOyBpIDwgblBhZ2VDb3VudDsgaSArKykgew0KLSAgICAgICAgICAgIHBQYWdlID0gSUZERV9UeHRFZHRQYWdlOjpDcmVhdGUodGhpcywgaSk7DQotICAgICAgICAgICAgbV9QYWdlUHRyQXJyYXkuQWRkKHBQYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUNvdW50Q2hhbmdlZCh0aGlzKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLX0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVUeHRCcmVhaygpDQotew0KLSAgICBGWF9EV09SRCBkd1N0eWxlID0gbV9wVGV4dEJyZWFrLT5HZXRMYXlvdXRTdHlsZXMoKTsNCi0gICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9NdWx0aUxpbmVzKSB7DQotICAgICAgICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lOw0KLSAgICB9DQotICAgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsKSB7DQotICAgICAgICBkd1N0eWxlIHw9IEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQ7DQotICAgIH0NCi0gICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfTGluZVJlc2VydmUpIHsNCi0gICAgICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfUmV2ZXJzZUxpbmU7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9SZXZlcnNlTGluZTsNCi0gICAgfQ0KLSAgICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9SVEwpIHsNCi0gICAgICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyOw0KLSAgICB9DQotICAgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0NvbWJUZXh0KSB7DQotICAgICAgICBkd1N0eWxlIHw9IEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQ7DQotICAgIH0NCi0gICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ2hhclZlcnRpYWwpIHsNCi0gICAgICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxDaGFyczsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnM7DQotICAgIH0NCi0gICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRXhwYW5kVGFiKSB7DQotICAgICAgICBkd1N0eWxlIHw9IEZYX1RYVExBWU9VVFNUWUxFX0V4cGFuZFRhYjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGR3U3R5bGUgJj0gfiBGWF9UWFRMQVlPVVRTVFlMRV9FeHBhbmRUYWI7DQotICAgIH0NCi0gICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQXJhYmljQ29udGV4dCkgew0KLSAgICAgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNDb250ZXh0Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljQ29udGV4dDsNCi0gICAgfQ0KLSAgICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9BcmFiaWNTaGFwZXMpIHsNCi0gICAgICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzOw0KLSAgICB9DQotICAgIG1fcFRleHRCcmVhay0+U2V0TGF5b3V0U3R5bGVzKGR3U3R5bGUpOw0KLSAgICBGWF9EV09SRCBkd0FsaWdtZW50ID0gMDsNCi0gICAgaWYgKG1fUGFyYW0uZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9KdXN0aWZpZWQpIHsNCi0gICAgICAgIGR3QWxpZ21lbnQgfD0gRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWQ7DQotICAgIH0gZWxzZSBpZiAobV9QYXJhbS5kd0FsaWdubWVudCAmIEZERV9URVhURURJVEFMSUdOX0Rpc3RyaWJ1dGVkKSB7DQotICAgICAgICBkd0FsaWdtZW50IHw9IEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQ7DQotICAgIH0NCi0gICAgaWYgKG1fUGFyYW0uZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9DZW50ZXIpIHsNCi0gICAgICAgIGR3QWxpZ21lbnQgfD0gRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXI7DQotICAgIH0gZWxzZSBpZihtX1BhcmFtLmR3QWxpZ25tZW50ICYgRkRFX1RFWFRFRElUQUxJR05fUmlnaHQpIHsNCi0gICAgICAgIGR3QWxpZ21lbnQgfD0gRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodDsNCi0gICAgfQ0KLSAgICBtX3BUZXh0QnJlYWstPlNldEFsaWdubWVudChkd0FsaWdtZW50KTsNCi0gICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwpIHsNCi0gICAgICAgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfQXV0b0xpbmVXcmFwKSB7DQotICAgICAgICAgICAgbV9wVGV4dEJyZWFrLT5TZXRMaW5lV2lkdGgobV9QYXJhbS5mUGxhdGVIZWlnaHQpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX3BUZXh0QnJlYWstPlNldExpbmVXaWR0aChGREVfUEFHRVdJRFRIX01BWCk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0F1dG9MaW5lV3JhcCkgew0KLSAgICAgICAgICAgIG1fcFRleHRCcmVhay0+U2V0TGluZVdpZHRoKG1fUGFyYW0uZlBsYXRlV2lkdGgpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX3BUZXh0QnJlYWstPlNldExpbmVXaWR0aChGREVfUEFHRVdJRFRIX01BWCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9uUGFnZUxpbmVDb3VudCA9IG1fUGFyYW0ubkxpbmVDb3VudDsNCi0gICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQpIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZDb21iV2lkdGggPSBtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsID8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1BhcmFtLmZQbGF0ZUhlaWdodCA6IG1fUGFyYW0uZlBsYXRlV2lkdGg7DQotICAgICAgICBpZiAobV9uTGltaXQgPiAwKSB7DQotICAgICAgICAgICAgZkNvbWJXaWR0aCAvPSBtX25MaW1pdDsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcFRleHRCcmVhay0+U2V0Q29tYldpZHRoKGZDb21iV2lkdGgpOw0KLSAgICB9DQotICAgIG1fcFRleHRCcmVhay0+U2V0Rm9udChtX1BhcmFtLnBGb250KTsNCi0gICAgbV9wVGV4dEJyZWFrLT5TZXRGb250U2l6ZShtX1BhcmFtLmZGb250U2l6ZSk7DQotICAgIG1fcFRleHRCcmVhay0+U2V0VGFiV2lkdGgobV9QYXJhbS5mVGFiV2lkdGgsIG1fUGFyYW0uYlRhYkVxdWlkaXN0YW50KTsNCi0gICAgbV9wVGV4dEJyZWFrLT5TZXREZWZhdWx0Q2hhcihtX1BhcmFtLndEZWZDaGFyKTsNCi0gICAgbV9wVGV4dEJyZWFrLT5TZXRQYXJhZ3JhcGhCcmVha0NoYXIobV9QYXJhbS53TGluZUJyZWFrQ2hhcik7DQotICAgIG1fcFRleHRCcmVhay0+U2V0Q2hhclJvdGF0aW9uKG1fUGFyYW0ubkNoYXJSb3RhdGlvbik7DQotICAgIG1fcFRleHRCcmVhay0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKG1fUGFyYW0uZkZvbnRTaXplICogMC4yZik7DQotICAgIG1fcFRleHRCcmVhay0+U2V0SG9yaXpvbnRhbFNjYWxlKG1fUGFyYW0ubkhvcnpTY2FsZSk7DQotICAgIG1fcFRleHRCcmVhay0+U2V0Q2hhclNwYWNlKG1fUGFyYW0uZkNoYXJTcGFjZSk7DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlcGxhY2VQYXJhZ0VuZChGWF9XQ0hBUiogJmxwVGV4dCwgaW50MzJfdCAmbkxlbmd0aCwgRlhfQk9PTCBiUHJlSXNDUiApDQotew0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuTGVuZ3RoOyBpICsrKSB7DQotICAgICAgICBGWF9XQ0hBUiB3YyA9IGxwVGV4dFtpXTsNCi0gICAgICAgIHN3aXRjaCh3Yykgew0KLSAgICAgICAgICAgIGNhc2UgTCdccic6IHsNCi0gICAgICAgICAgICAgICAgICAgIGxwVGV4dFtpXQk9IG1fd0xpbmVFbmQ7DQotICAgICAgICAgICAgICAgICAgICBiUHJlSXNDUgk9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBMJ1xuJzogew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJQcmVJc0NSID09IFRSVUUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5OZXh0ID0gaSArIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5OZXh0IDwgbkxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1tb3ZlKGxwVGV4dCArIGksIGxwVGV4dCArIG5OZXh0LCAobkxlbmd0aCAtIG5OZXh0KSAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpIC0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5MZW5ndGgJLS07DQotICAgICAgICAgICAgICAgICAgICAgICAgYlByZUlzQ1IgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9iQXV0b0xpbmVFbmQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRmlyc3RMaW5lRW5kID0gRkRFX1RYVEVESVRfTElORUVORF9DUkxGOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JBdXRvTGluZUVuZAk9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbHBUZXh0W2ldID0gbV93TGluZUVuZDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9iQXV0b0xpbmVFbmQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRmlyc3RMaW5lRW5kID0gRkRFX1RYVEVESVRfTElORUVORF9MRjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQXV0b0xpbmVFbmQJPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJQcmVJc0NSICYmIG1fYkF1dG9MaW5lRW5kKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9uRmlyc3RMaW5lRW5kID0gRkRFX1RYVEVESVRfTElORUVORF9DUjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2JBdXRvTGluZUVuZAk9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYlByZUlzQ1IgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gYlByZUlzQ1I7DQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlY292ZXJQYXJhZ0VuZChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgRlhfV0NIQVIgd2MgPSAobV9uRmlyc3RMaW5lRW5kID09IEZERV9UWFRFRElUX0xJTkVFTkRfQ1IpID8gTCdcbicgOiBMJ1xyJzsNCi0gICAgaWYgKG1fbkZpcnN0TGluZUVuZCA9PSBGREVfVFhURURJVF9MSU5FRU5EX0NSTEYpIHsNCi0gICAgICAgIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IFBvc0FycjsNCi0gICAgICAgIGludDMyX3Qgbkxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCi0gICAgICAgIGludDMyX3QgaSA9IDA7DQotICAgICAgICBGWF9XQ0hBUiogbHBQb3MgPSAoRlhfV0NIQVIqKShjb25zdCBGWF9XQ0hBUiopd3NUZXh0Ow0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG5MZW5ndGg7IGkgKyssIGxwUG9zICsrKSB7DQotICAgICAgICAgICAgaWYgKCpscFBvcyA9PSBtX3dMaW5lRW5kKSB7DQotICAgICAgICAgICAgICAgICpscFBvcyA9IHdjOw0KLSAgICAgICAgICAgICAgICBQb3NBcnIuQWRkKGkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscFNyY0J1ZiA9IHdzVGV4dC5jX3N0cigpOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KLSAgICAgICAgaW50MzJfdCBuQ291bnQgPSBQb3NBcnIuR2V0U2l6ZSgpOw0KLSAgICAgICAgRlhfV0NIQVIqIGxwRHN0QnVmID0gd3NUZW1wLkdldEJ1ZmZlcihuTGVuZ3RoICsgbkNvdW50KTsNCi0gICAgICAgIGludDMyX3QgbkRzdFBvcyA9IDA7DQotICAgICAgICBpbnQzMl90IG5TcmNQb3MgPSAwOw0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgICAgIGludDMyX3QgblBvcyA9IFBvc0FycltpXTsNCi0gICAgICAgICAgICBpbnQzMl90IG5Db3B5TGVuID0gblBvcyAtIG5TcmNQb3MgKyAxOw0KLSAgICAgICAgICAgIEZYU1lTX21lbWNweShscERzdEJ1ZiArIG5Ec3RQb3MsIGxwU3JjQnVmICsgblNyY1BvcywgbkNvcHlMZW4gKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgICAgICAgICBuRHN0UG9zICs9IG5Db3B5TGVuOw0KLSAgICAgICAgICAgIG5TcmNQb3MgKz0gbkNvcHlMZW47DQotICAgICAgICAgICAgbHBEc3RCdWZbbkRzdFBvc10gPSBMJ1xuJzsNCi0gICAgICAgICAgICBuRHN0UG9zICsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG5TcmNQb3MgPCBuTGVuZ3RoKSB7DQotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmICsgbkRzdFBvcywgbHBTcmNCdWYgKyBuU3JjUG9zLCAobkxlbmd0aCAtIG5TcmNQb3MpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgICAgICB9DQotICAgICAgICB3c1RlbXAuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoICsgbkNvdW50KTsNCi0gICAgICAgIHdzVGV4dCA9IHdzVGVtcDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGludDMyX3Qgbkxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCi0gICAgICAgIEZYX1dDSEFSKiBscEJ1ZiA9IChGWF9XQ0hBUiopKGNvbnN0IEZYX1dDSEFSKil3c1RleHQ7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuTGVuZ3RoOyBpICsrLCBscEJ1ZisrKSB7DQotICAgICAgICAgICAgaWYgKCpscEJ1ZiA9PSBtX3dMaW5lRW5kKSB7DQotICAgICAgICAgICAgICAgICpscEJ1ZiA9IHdjOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpNb3ZlUGFnZTJDaGFyKGludDMyX3QgbkluZGV4KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG5JbmRleCA+PSAwKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG5JbmRleCA8PSBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSk7DQotICAgIGlmIChtX25DYXJldFBhZ2UgPj0gMCkgew0KLSAgICAgICAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fUGFnZVB0ckFycmF5W21fbkNhcmV0UGFnZV07DQotICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VMb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQotICAgICAgICBpbnQzMl90IG5QYWdlQ2hhclN0YXJ0ID0gcFBhZ2UtPkdldENoYXJTdGFydCgpOw0KLSAgICAgICAgaW50MzJfdCBuUGFnZUNoYXJDb3VudCA9IHBQYWdlLT5HZXRDaGFyQ291bnQoKTsNCi0gICAgICAgIGlmIChuSW5kZXggPj0gblBhZ2VDaGFyU3RhcnQgJiYgbkluZGV4IDwgblBhZ2VDaGFyU3RhcnQgKyBuUGFnZUNoYXJDb3VudCkgew0KLSAgICAgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KLSAgICAgICAgICAgIHJldHVybiBtX25DYXJldFBhZ2U7DQotICAgICAgICB9DQotICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCi0gICAgfQ0KLSAgICBDRkRFX1R4dEVkdFBhcmFnICogcFBhcmFnID0gTlVMTDsNCi0gICAgaW50MzJfdCBuTGluZUNvdW50CQk9IDA7DQotICAgIGludDMyX3QgblBhcmFnQ291bnQJPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBmb3IgKGkgPSAwOyBpIDwgblBhcmFnQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtpXTsNCi0gICAgICAgIGlmIChwUGFyYWctPm1fbkNoYXJTdGFydCA8PSBuSW5kZXggJiYgbkluZGV4IDwgKHBQYXJhZy0+bV9uQ2hhclN0YXJ0ICsgcFBhcmFnLT5tX25DaGFyQ291bnQpKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBuTGluZUNvdW50ICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KLSAgICB9DQotICAgIHBQYXJhZy0+TG9hZFBhcmFnKCk7DQotICAgIGludDMyX3QgbkxpbmVTdGFydAkJPSAtMTsNCi0gICAgaW50MzJfdCBuTGluZUNoYXJDb3VudCA9IC0xOw0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcFBhcmFnLT5tX25MaW5lQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIHBQYXJhZy0+R2V0TGluZVJhbmdlKGksIG5MaW5lU3RhcnQsIG5MaW5lQ2hhckNvdW50KTsNCi0gICAgICAgIGlmIChuTGluZVN0YXJ0IDw9IG5JbmRleCAmJiBuSW5kZXggPCAobkxpbmVTdGFydCArIG5MaW5lQ2hhckNvdW50KSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIEZYU1lTX2Fzc2VydChpIDwgcFBhcmFnLT5tX25MaW5lQ291bnQpOw0KLSAgICBuTGluZUNvdW50ICs9IChpICsgMSk7DQotICAgIG1fbkNhcmV0UGFnZSA9IChuTGluZUNvdW50IC0gMSkgLyBtX25QYWdlTGluZUNvdW50ICsgMSAtIDE7DQotICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUNoYW5nZSh0aGlzLCBtX25DYXJldFBhZ2UpOw0KLSAgICBwUGFyYWctPlVubG9hZFBhcmFnKCk7DQotICAgIHJldHVybiBtX25DYXJldFBhZ2U7DQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlRleHRQb3MyUGFyYWdQb3MoaW50MzJfdCBuSW5kZXgsIEZERV9UWFRFRFRQQVJBR1BPUyAmUGFyYWdQb3MpIGNvbnN0DQotew0KLSAgICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpOw0KLSAgICBpbnQzMl90IG5Db3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQotICAgIGludDMyX3QgbkJnbiA9IDA7DQotICAgIGludDMyX3Qgbk1pZCA9IDA7DQotICAgIGludDMyX3QgbkVuZCA9IG5Db3VudCAtIDE7DQotICAgIHdoaWxlIChuRW5kID4gbkJnbikgew0KLSAgICAgICAgbk1pZCA9IChuQmduICsgbkVuZCkgLyAyOw0KLSAgICAgICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtuTWlkXTsNCi0gICAgICAgIGlmIChuSW5kZXggPCBwUGFyYWctPm1fbkNoYXJTdGFydCkgew0KLSAgICAgICAgICAgIG5FbmQgPSBuTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSBpZiAobkluZGV4ID49IChwUGFyYWctPm1fbkNoYXJTdGFydCArIHBQYXJhZy0+bV9uQ2hhckNvdW50KSkgew0KLSAgICAgICAgICAgIG5CZ24gPSBuTWlkICsgMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKG5CZ24gPT0gbkVuZCkgew0KLSAgICAgICAgbk1pZCA9IG5CZ247DQotICAgIH0NCi0gICAgRlhTWVNfYXNzZXJ0KG5JbmRleCA+PSBtX1BhcmFnUHRyQXJyYXlbbk1pZF0tPm1fbkNoYXJTdGFydCAmJiBcDQotICAgICAgICAgICAgICAgICAobkluZGV4IDwgbV9QYXJhZ1B0ckFycmF5W25NaWRdLT5tX25DaGFyU3RhcnQgKyBtX1BhcmFnUHRyQXJyYXlbbk1pZF0tPm1fbkNoYXJDb3VudCkpOw0KLSAgICBQYXJhZ1Bvcy5uUGFyYWdJbmRleAk9IG5NaWQ7DQotICAgIFBhcmFnUG9zLm5DaGFySW5kZXgJCT0gbkluZGV4IC0gbV9QYXJhZ1B0ckFycmF5W25NaWRdLT5tX25DaGFyU3RhcnQ7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVGb3J3YXJkKEZYX0JPT0wgJmJCZWZvcmUpDQotew0KLSAgICBpZiAobV9uQ2FyZXQgPT0gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkgLSAxKSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgaW50MzJfdCBuQ2FyZXQgPSBtX25DYXJldDsNCi0gICAgaWYgKChuQ2FyZXQgKyAxIDwgbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpICYmIChtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5DYXJldCkgPT0gTCdccicpICYmIFwNCi0gICAgICAgICAgICAobV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuQ2FyZXQgKyAxKSA9PSBMJ1xuJykpIHsNCi0gICAgICAgIG5DYXJldCArKzsNCi0gICAgfQ0KLSAgICBuQ2FyZXQgKys7DQotICAgIGJCZWZvcmUgPSBUUlVFOw0KLSAgICByZXR1cm4gbkNhcmV0Ow0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpNb3ZlQmFja3dhcmQoRlhfQk9PTCAmYkJlZm9yZSkNCi17DQotICAgIGlmIChtX25DYXJldCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaW50MzJfdCBuQ2FyZXQgPSBtX25DYXJldDsNCi0gICAgaWYgKG5DYXJldCA+IDIgJiYgbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuQ2FyZXQgLSAxKSA9PSBMJ1xuJyAmJiBcDQotICAgICAgICAgICAgbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuQ2FyZXQgLSAyKSA9PSBMJ1xyJykgew0KLSAgICAgICAgbkNhcmV0IC0tOw0KLSAgICB9DQotICAgIG5DYXJldCAtLTsNCi0gICAgYkJlZm9yZSA9IFRSVUU7DQotICAgIHJldHVybiBuQ2FyZXQ7DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVVcChDRlhfUG9pbnRGICZwdENhcmV0KQ0KLXsNCi0gICAgSUZERV9UeHRFZHRQYWdlICogcFBhZ2UJCT0gR2V0UGFnZShtX25DYXJldFBhZ2UpOw0KLSAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q29udGVudAk9IHBQYWdlLT5HZXRDb250ZW50c0JveCgpOw0KLSAgICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbCkgew0KLSAgICAgICAgcHRDYXJldC54ID0gbV9ydENhcmV0LmxlZnQgKyBtX3J0Q2FyZXQud2lkdGggLyAyIC0gbV9QYXJhbS5mTGluZVNwYWNlOw0KLSAgICAgICAgcHRDYXJldC55ID0gbV9mQ2FyZXRQb3NSZXNlcnZlOw0KLSAgICAgICAgRlhfQk9PTCBiTGluZVJlc2VydmUgPSBtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0xpbmVSZXNlcnZlOw0KLSAgICAgICAgaWYgKHB0Q2FyZXQueCA8IHJ0Q29udGVudC5sZWZ0KSB7DQotICAgICAgICAgICAgaWYgKGJMaW5lUmVzZXJ2ZSkgew0KLSAgICAgICAgICAgICAgICBpZiAobV9uQ2FyZXRQYWdlID09IENvdW50UGFnZXMoKSAtIDEpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmIChtX25DYXJldFBhZ2UgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChiTGluZVJlc2VydmUpIHsNCi0gICAgICAgICAgICAgICAgbV9uQ2FyZXRQYWdlICsrOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIG1fbkNhcmV0UGFnZSAtLTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlQ2hhbmdlKHRoaXMsIG1fbkNhcmV0UGFnZSk7DQotICAgICAgICAgICAgcHRDYXJldC54IC09IHJ0Q29udGVudC5sZWZ0Ow0KLSAgICAgICAgICAgIElGREVfVHh0RWR0UGFnZSAqIHBDdXJQYWdlID0gR2V0UGFnZShtX25DYXJldFBhZ2UpOw0KLSAgICAgICAgICAgIHB0Q2FyZXQueCArPSBwQ3VyUGFnZS0+R2V0Q29udGVudHNCb3goKS5yaWdodCgpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcHRDYXJldC54ID0gbV9mQ2FyZXRQb3NSZXNlcnZlOw0KLSAgICAgICAgcHRDYXJldC55ID0gbV9ydENhcmV0LnRvcCArIG1fcnRDYXJldC5oZWlnaHQgLyAyIC0gbV9QYXJhbS5mTGluZVNwYWNlOw0KLSAgICAgICAgaWYgKHB0Q2FyZXQueSA8IHJ0Q29udGVudC50b3ApIHsNCi0gICAgICAgICAgICBpZiAobV9uQ2FyZXRQYWdlID09IDApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwdENhcmV0LnkgLT0gcnRDb250ZW50LnRvcDsNCi0gICAgICAgICAgICBtX25DYXJldFBhZ2UgLS07DQotICAgICAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlQ2hhbmdlKHRoaXMsIG1fbkNhcmV0UGFnZSk7DQotICAgICAgICAgICAgSUZERV9UeHRFZHRQYWdlICogcEN1clBhZ2UgPSBHZXRQYWdlKG1fbkNhcmV0UGFnZSk7DQotICAgICAgICAgICAgcHRDYXJldC55ICs9IHBDdXJQYWdlLT5HZXRDb250ZW50c0JveCgpLmJvdHRvbSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlRG93bihDRlhfUG9pbnRGICZwdENhcmV0KQ0KLXsNCi0gICAgSUZERV9UeHRFZHRQYWdlICogcFBhZ2UgPSBHZXRQYWdlKG1fbkNhcmV0UGFnZSk7DQotICAgIGNvbnN0IENGWF9SZWN0RiYgcnRDb250ZW50ID0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7DQotICAgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsKSB7DQotICAgICAgICBwdENhcmV0LnggPSBtX3J0Q2FyZXQubGVmdCArIG1fcnRDYXJldC53aWR0aCAvIDIgKyBtX1BhcmFtLmZMaW5lU3BhY2U7DQotICAgICAgICBwdENhcmV0LnkgPSBtX2ZDYXJldFBvc1Jlc2VydmU7DQotICAgICAgICBpZiAocHRDYXJldC54ID49IHJ0Q29udGVudC5yaWdodCgpKSB7DQotICAgICAgICAgICAgRlhfQk9PTCBiTGluZVJlc2VydmUgPSBtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0xpbmVSZXNlcnZlOw0KLSAgICAgICAgICAgIGlmIChiTGluZVJlc2VydmUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKG1fbkNhcmV0UGFnZSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZiAobV9uQ2FyZXRQYWdlID09IENvdW50UGFnZXMoKSAtIDEpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoYkxpbmVSZXNlcnZlKSB7DQotICAgICAgICAgICAgICAgIG1fbkNhcmV0UGFnZSAtLTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX25DYXJldFBhZ2UgKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUNoYW5nZSh0aGlzLCBtX25DYXJldFBhZ2UpOw0KLSAgICAgICAgICAgIHB0Q2FyZXQueCAtPSBydENvbnRlbnQucmlnaHQoKTsNCi0gICAgICAgICAgICBJRkRFX1R4dEVkdFBhZ2UgKiBwQ3VyUGFnZSA9IEdldFBhZ2UobV9uQ2FyZXRQYWdlKTsNCi0gICAgICAgICAgICBwdENhcmV0LnggKz0gcEN1clBhZ2UtPkdldENvbnRlbnRzQm94KCkubGVmdDsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHB0Q2FyZXQueCA9IG1fZkNhcmV0UG9zUmVzZXJ2ZTsNCi0gICAgICAgIHB0Q2FyZXQueSA9IG1fcnRDYXJldC50b3AgKyBtX3J0Q2FyZXQuaGVpZ2h0IC8gMiArIG1fUGFyYW0uZkxpbmVTcGFjZTsNCi0gICAgICAgIGlmIChwdENhcmV0LnkgPj0gcnRDb250ZW50LmJvdHRvbSgpKSB7DQotICAgICAgICAgICAgaWYgKG1fbkNhcmV0UGFnZSA9PSBDb3VudFBhZ2VzKCkgLSAxKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcHRDYXJldC55IC09IHJ0Q29udGVudC5ib3R0b20oKTsNCi0gICAgICAgICAgICBtX25DYXJldFBhZ2UgKys7DQotICAgICAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlQ2hhbmdlKHRoaXMsIG1fbkNhcmV0UGFnZSk7DQotICAgICAgICAgICAgSUZERV9UeHRFZHRQYWdlICogcEN1clBhZ2UgPSBHZXRQYWdlKG1fbkNhcmV0UGFnZSk7DQotICAgICAgICAgICAgcHRDYXJldC55ICs9IHBDdXJQYWdlLT5HZXRDb250ZW50c0JveCgpLnRvcDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZUxpbmVTdGFydCgpDQotew0KLSAgICBpbnQzMl90IG5JbmRleCA9IG1fYkJlZm9yZSA/IG1fbkNhcmV0IDogbV9uQ2FyZXQgLSAxOw0KLSAgICBGREVfVFhURURUUEFSQUdQT1MgUGFyYWdQb3M7DQotICAgIFRleHRQb3MyUGFyYWdQb3MobkluZGV4LCBQYXJhZ1Bvcyk7DQotICAgIENGREVfVHh0RWR0UGFyYWcgKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3MublBhcmFnSW5kZXhdOw0KLSAgICBwUGFyYWctPkxvYWRQYXJhZygpOw0KLSAgICBpbnQzMl90IG5MaW5lQ291bnQgPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgaW50MzJfdCBuU3RhcnQgPSAwOw0KLSAgICBpbnQzMl90IG5Db3VudCA9IDA7DQotICAgIGZvciAoOyBpIDwgbkxpbmVDb3VudDsgaSArKykgew0KLSAgICAgICAgcFBhcmFnLT5HZXRMaW5lUmFuZ2UoaSwgblN0YXJ0LCBuQ291bnQpOw0KLSAgICAgICAgaWYgKG5JbmRleCA+PSBuU3RhcnQgJiYgbkluZGV4IDwgblN0YXJ0ICsgbkNvdW50KSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgVXBkYXRlQ2FyZXRSZWN0KG5TdGFydCwgVFJVRSk7DQotICAgIHBQYXJhZy0+VW5sb2FkUGFyYWcoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVMaW5lRW5kKCkNCi17DQotICAgIGludDMyX3QgbkluZGV4ID0gbV9iQmVmb3JlID8gbV9uQ2FyZXQgOiBtX25DYXJldCAtIDE7DQotICAgIEZERV9UWFRFRFRQQVJBR1BPUyBQYXJhZ1BvczsNCi0gICAgVGV4dFBvczJQYXJhZ1BvcyhuSW5kZXgsIFBhcmFnUG9zKTsNCi0gICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07DQotICAgIHBQYXJhZy0+TG9hZFBhcmFnKCk7DQotICAgIGludDMyX3QgbkxpbmVDb3VudCA9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBpbnQzMl90IG5TdGFydCA9IDA7DQotICAgIGludDMyX3QgbkNvdW50ID0gMDsNCi0gICAgZm9yICg7IGkgPCBuTGluZUNvdW50OyBpICsrKSB7DQotICAgICAgICBwUGFyYWctPkdldExpbmVSYW5nZShpLCBuU3RhcnQsIG5Db3VudCk7DQotICAgICAgICBpZiAobkluZGV4ID49IG5TdGFydCAmJiBuSW5kZXggPCBuU3RhcnQgKyBuQ291bnQpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBuSW5kZXgJPSBuU3RhcnQgKyBuQ291bnQgLSAxOw0KLSAgICBGWFNZU19hc3NlcnQobkluZGV4IDw9IEdldFRleHRCdWZMZW5ndGgoKSk7DQotICAgIEZYX1dDSEFSIHdDaGFyCT0gbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuSW5kZXgpOw0KLSAgICBGWF9CT09MIGJCZWZvcmUgPSBGQUxTRTsNCi0gICAgaWYgKG5JbmRleCA8PSBHZXRUZXh0QnVmTGVuZ3RoKCkpIHsNCi0gICAgICAgIGlmICh3Q2hhciA9PSBMJ1xyJykgew0KLSAgICAgICAgICAgIGJCZWZvcmUgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIGlmICh3Q2hhciA9PSBMJ1xuJyAmJiBuSW5kZXggPiBuU3RhcnQpIHsNCi0gICAgICAgICAgICBiQmVmb3JlID0gVFJVRTsNCi0gICAgICAgICAgICBuSW5kZXggLS07DQotICAgICAgICAgICAgd0NoYXIgPSBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5JbmRleCk7DQotICAgICAgICAgICAgaWYgKHdDaGFyICE9IEwnXHInKSB7DQotICAgICAgICAgICAgICAgIG5JbmRleCArKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgVXBkYXRlQ2FyZXRSZWN0KG5JbmRleCwgYkJlZm9yZSk7DQotICAgIHBQYXJhZy0+VW5sb2FkUGFyYWcoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVQYXJhZ1N0YXJ0KCkNCi17DQotICAgIGludDMyX3QgbkluZGV4ID0gbV9iQmVmb3JlID8gbV9uQ2FyZXQgOiBtX25DYXJldCAtIDE7DQotICAgIEZERV9UWFRFRFRQQVJBR1BPUyBQYXJhZ1BvczsNCi0gICAgVGV4dFBvczJQYXJhZ1BvcyhuSW5kZXgsIFBhcmFnUG9zKTsNCi0gICAgQ0ZERV9UeHRFZHRQYXJhZyAqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07DQotICAgIFVwZGF0ZUNhcmV0UmVjdChwUGFyYWctPm1fbkNoYXJTdGFydCwgVFJVRSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlUGFyYWdFbmQoKQ0KLXsNCi0gICAgaW50MzJfdCBuSW5kZXggPSBtX2JCZWZvcmUgPyBtX25DYXJldCA6IG1fbkNhcmV0IC0gMTsNCi0gICAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KLSAgICBUZXh0UG9zMlBhcmFnUG9zKG5JbmRleCwgUGFyYWdQb3MpOw0KLSAgICBDRkRFX1R4dEVkdFBhcmFnICogcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W1BhcmFnUG9zLm5QYXJhZ0luZGV4XTsNCi0gICAgbkluZGV4CT0gcFBhcmFnLT5tX25DaGFyU3RhcnQgKyBwUGFyYWctPm1fbkNoYXJDb3VudCAtIDE7DQotICAgIEZYX1dDSEFSIHdDaGFyCT0gbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuSW5kZXgpOw0KLSAgICBpZiAod0NoYXIgPT0gTCdcbicgJiYgbkluZGV4ID4gMCkgew0KLSAgICAgICAgbkluZGV4IC0tOw0KLSAgICAgICAgd0NoYXIgPSBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5JbmRleCk7DQotICAgICAgICBpZiAod0NoYXIgIT0gTCdccicpIHsNCi0gICAgICAgICAgICBuSW5kZXggKys7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgVXBkYXRlQ2FyZXRSZWN0KG5JbmRleCwgVFJVRSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlSG9tZSgpDQotew0KLSAgICBVcGRhdGVDYXJldFJlY3QoMCwgVFJVRSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlRW5kKCkNCi17DQotICAgIFVwZGF0ZUNhcmV0UmVjdChHZXRUZXh0QnVmTGVuZ3RoKCksIFRSVUUpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQorSUZERV9UeHRFZHREb1JlY29yZCogSUZERV9UeHRFZHREb1JlY29yZDo6Q3JlYXRlKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIHsNCisgIGNvbnN0IEZYX0NIQVIqIGxwQnVmID0gYnNEb1JlY29yZC5HZXRDU3RyKCk7DQorICBpbnQzMl90IG5UeXBlID0gKigoaW50MzJfdCopbHBCdWYpOw0KKyAgc3dpdGNoIChuVHlwZSkgew0KKyAgICBjYXNlIEZERV9UWFRFRFRfRE9SRUNPUkRfSU5TOg0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoYnNEb1JlY29yZCk7DQorICAgIGNhc2UgRkRFX1RYVEVEVF9ET1JFQ09SRF9ERUw6DQorICAgICAgcmV0dXJuIEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlKGJzRG9SZWNvcmQpOw0KICNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpOb3JtYWxpemVDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgaW50MzJfdCBuRmxhZ3MsIEZYX0JPT0wgJmJCZWZvcmUpDQotew0KLSAgICBiQmVmb3JlID0gVFJVRTsNCi0gICAgaW50MzJfdCBuQmduID0gMCwgbkVuZCA9IDA7DQotICAgIGludDMyX3QgblJlY29yZCA9IC0xOw0KLSAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkID0gTlVMTDsNCi0gICAgRlhfQk9PTCBiUmV0ID0gR2V0RmllbGRCb3VuZGFyeShuSW5kZXgsIG5CZ24sIG5FbmQsIHBGaWVsZCk7DQotICAgIGludDMyX3QgbkRlbHRhID0gMDsNCi0gICAgaWYgKGJSZXQgJiYgIXBGaWVsZC0+SXNGaXgoKSkgew0KLSAgICAgICAgaWYgKG5JbmRleCAtIG5CZ24gPCBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFKSB7DQotICAgICAgICAgICAgaWYgKG5GbGFncyA9PSBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJEKSB7DQotICAgICAgICAgICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRWRpdGFibGVGaWVsZCA9IE5VTEw7DQotICAgICAgICAgICAgICAgIGlmIChGaW5kRWRpdGFibGVGaWVsZChuSW5kZXgsIG5CZ24sIG5FbmQsIHBFZGl0YWJsZUZpZWxkLCBGQUxTRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwRWRpdGFibGVGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MobkVuZCAtIG5CZ24sIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQpICsgbkJnbjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBuSW5kZXggPSBuQmduICsgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgblJldCA9IHBGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MobkluZGV4IC0gbkJnbiwgKEZERV9GT1JNQVRfQ0FSRVRfRElSRUNUSU9OKW5GbGFncyk7DQotICAgICAgICBpZiAoblJldCA+PSAwKSB7DQotICAgICAgICAgICAgcmV0dXJuIG5SZXQgKyBuQmduOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG5SZXQgPT0gLTIpIHsNCi0gICAgICAgICAgICBpbnQzMl90IG5FZGl0YWJsZVBvc0JnbiA9IDAsIG5FZGl0YWJsZVBvc0VuZCA9IDA7DQotICAgICAgICAgICAgcEZpZWxkLT5HZXRFZGl0YWJsZVJhbmdlKG5FZGl0YWJsZVBvc0JnbiwgbkVkaXRhYmxlUG9zRW5kKTsNCi0gICAgICAgICAgICBuUmVjb3JkID0gbkJnbiArIG5FZGl0YWJsZVBvc0JnbjsNCi0gICAgICAgICAgICBuRmxhZ3MgPSBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJEOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQoblJldCA9PSAtMSk7DQotICAgICAgICAgICAgaW50MzJfdCBuRWRpdGFibGVQb3NCZ24gPSAwLCBuRWRpdGFibGVQb3NFbmQgPSAwOw0KLSAgICAgICAgICAgIHBGaWVsZC0+R2V0RWRpdGFibGVSYW5nZShuRWRpdGFibGVQb3NCZ24sIG5FZGl0YWJsZVBvc0VuZCk7DQotICAgICAgICAgICAgblJlY29yZCA9IG5CZ24gKyBuRWRpdGFibGVQb3NFbmQ7DQotICAgICAgICAgICAgbkZsYWdzID0gRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJEOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKCFiUmV0KSB7DQotICAgICAgICBuRGVsdGEgPSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFIC0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX1RBSUxTSVpFOw0KLSAgICB9DQotICAgIHN3aXRjaCAobkZsYWdzKSB7DQotICAgICAgICBjYXNlIEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRDogew0KLSAgICAgICAgICAgICAgICBpZiAoRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRmllbGQpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEZpZWxkLT5Ob3JtYWxpemVDYXJldFBvcyhGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFLCBGREVfRk9STUFUX0NBUkVUX0ZPUldBUkQpICsgIG5CZ247DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoblJlY29yZCAhPSAtMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuUmVjb3JkOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYlJldCA9IEZpbmRFZGl0YWJsZUZpZWxkKG5JbmRleCwgbkJnbiwgbkVuZCwgcEZpZWxkLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQoYlJldCk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEZpZWxkLT5Ob3JtYWxpemVDYXJldFBvcyhuRW5kIC0gbkJnbiwgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCkgKyBuQmduOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGREVfRk9STUFUX0NBUkVUX01JRERMRTogew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IG5CZ24xID0gMCwgbkVuZDEgPSAwLCBuQmduMiA9IDAsIG5FbmQyID0gMDsNCi0gICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBFZGl0YWJsZUZpZWxkMSA9IE5VTEw7DQotICAgICAgICAgICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRWRpdGFibGVGaWVsZDIgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXQxID0gRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduMSwgbkVuZDEsIHBFZGl0YWJsZUZpZWxkMSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXQyID0gRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduMiwgbkVuZDIsIHBFZGl0YWJsZUZpZWxkMik7DQotICAgICAgICAgICAgICAgIGlmIChiUmV0MSA9PSBGQUxTRSkgew0KLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGJSZXQyKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwRWRpdGFibGVGaWVsZDItPk5vcm1hbGl6ZUNhcmV0UG9zKEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkUsIEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCkgKyBuQmduMjsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiUmV0MiA9PSBGQUxTRSkgew0KLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGJSZXQxKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwRWRpdGFibGVGaWVsZDEtPk5vcm1hbGl6ZUNhcmV0UG9zKG5FbmQxIC0gbkJnbjEsIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQpICsgbkJnbjE7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5FZGl0YWJsZVBvc0JnbiA9IDAsIG5FZGl0YWJsZVBvc0VuZCA9IDA7DQotICAgICAgICAgICAgICAgICAgICBpZiAobkluZGV4IC0gbkVuZDEgPCBuQmduMiArIG5EZWx0YSAtIG5JbmRleCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGl0YWJsZUZpZWxkMS0+R2V0RWRpdGFibGVSYW5nZShuRWRpdGFibGVQb3NCZ24sIG5FZGl0YWJsZVBvc0VuZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5FZGl0YWJsZVBvc0VuZCArIG5CZ24xOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRpdGFibGVGaWVsZDItPkdldEVkaXRhYmxlUmFuZ2UobkVkaXRhYmxlUG9zQmduLCBuRWRpdGFibGVQb3NFbmQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuRWRpdGFibGVQb3NCZ24gKyBuQmduMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRDogew0KLSAgICAgICAgICAgICAgICBpZiAoRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRmllbGQsIEZBTFNFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MobkVuZCAtIG5CZ24sIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQpICsgbkJnbjsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChuUmVjb3JkICE9IC0xKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5SZWNvcmQ7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBiUmV0ID0gRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRmllbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGJSZXQpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MoRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSwgRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJEKSArIG5CZ247DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCi0gICAgICAgICAgICByZXR1cm4gbkluZGV4Ow0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldEZpZWxkQm91bmRhcnkoaW50MzJfdCBuSW5kZXgsIGludDMyX3QgJm5CZ24sIGludDMyX3QgJm5FbmQsIENGREVfVHh0RWR0RmllbGQgKiAmcEZpZWxkKQ0KLXsNCi0gICAgQ0ZERV9UeHRFZHRCdWZJdGVyICogcEl0ZXIgPSBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmLCBGQUxTRSk7DQotICAgIHBJdGVyLT5TZXRBdChuSW5kZXgpOw0KLSAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7DQotICAgIGRvIHsNCi0gICAgICAgIEZYX1dDSEFSIHdjID0gcEl0ZXItPkdldENoYXIoKTsNCi0gICAgICAgIGlmICh3YyA9PSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0VORCkgew0KLSAgICAgICAgICAgIG5FbmQJPSBwSXRlci0+R2V0QXQoKTsNCi0gICAgICAgICAgICBiRmluZAk9IFRSVUU7DQotICAgICAgICAgICAgbkluZGV4IC0tOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOKSB7DQotICAgICAgICAgICAgcEl0ZXItPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KCkpOw0KLSAgICBpZiAoIWJGaW5kKSB7DQotICAgICAgICBwSXRlci0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHBJdGVyLT5TZXRBdChuSW5kZXgpOw0KLSAgICBkbyB7DQotICAgICAgICBGWF9XQ0hBUiB3YyA9IHBJdGVyLT5HZXRDaGFyKCk7DQotICAgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR04pIHsNCi0gICAgICAgICAgICBuQmduID0gcEl0ZXItPkdldEF0KCk7DQotICAgICAgICAgICAgcEl0ZXItPk5leHQoKTsNCi0gICAgICAgICAgICBGWF9EV09SRCBkd1ByZSA9IChGWF9EV09SRClwSXRlci0+R2V0Q2hhcigpOw0KLSAgICAgICAgICAgIHBJdGVyLT5OZXh0KCk7DQotICAgICAgICAgICAgRlhfRFdPUkQgZHdDdXIgPSAoRlhfRFdPUkQpcEl0ZXItPkdldENoYXIoKTsNCi0gICAgICAgICAgICBwRmllbGQgPSAoQ0ZERV9UeHRFZHRGaWVsZCAqKSgoZHdDdXIgPDwgMTYpIHwgZHdQcmUpOw0KLSAgICAgICAgICAgIHBJdGVyLT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQpIHsNCi0gICAgICAgICAgICBwSXRlci0+UmVsZWFzZSgpOw0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAocEl0ZXItPk5leHQoVFJVRSkpOw0KLSAgICBwSXRlci0+UmVsZWFzZSgpOw0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OkZpbmRFZGl0YWJsZUZpZWxkKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuQmduLCBpbnQzMl90ICZuRW5kLCBDRkRFX1R4dEVkdEZpZWxkICogJnBGaWVsZCwgRlhfQk9PTCBiRm9yd2FyZCApDQotew0KLSAgICBGWF9XQ0hBUiB3Y0ZpcnN0CT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR047DQotICAgIEZYX1dDSEFSIHdjU2Vjb25kCT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQ7DQotICAgIGlmICghYkZvcndhcmQpIHsNCi0gICAgICAgIHdjRmlyc3QJCT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQ7DQotICAgICAgICB3Y1NlY29uZAk9IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOOw0KLSAgICB9DQotICAgIENGREVfVHh0RWR0QnVmSXRlciAqIHBJdGVyID0gRlhfTkVXIENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKW1fcFR4dEJ1ZiwgRkFMU0UpOw0KLSAgICBwSXRlci0+U2V0QXQobkluZGV4KTsNCi0gICAgaW50MzJfdCBiRmluZCA9IEZBTFNFOw0KLSAgICBkbyB7DQotICAgICAgICBGWF9XQ0hBUiB3YyA9IHBJdGVyLT5HZXRDaGFyKCk7DQotICAgICAgICBpZiAod2MgPT0gd2NGaXJzdCkgew0KLSAgICAgICAgICAgIG5CZ24JPSBwSXRlci0+R2V0QXQoKTsNCi0gICAgICAgICAgICBiRmluZAk9IFRSVUU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KCFiRm9yd2FyZCkpOw0KLSAgICBpZiAoIWJGaW5kKSB7DQotICAgICAgICBwSXRlci0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGJGaW5kID0gRkFMU0U7DQotICAgIGRvIHsNCi0gICAgICAgIEZYX1dDSEFSIHdjID0gcEl0ZXItPkdldENoYXIoKTsNCi0gICAgICAgIGlmICh3YyA9PSB3Y1NlY29uZCkgew0KLSAgICAgICAgICAgIG5FbmQgPSBwSXRlci0+R2V0QXQoKTsNCi0gICAgICAgICAgICBiRmluZCA9IFRSVUU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KCFiRm9yd2FyZCkpOw0KLSAgICBGWFNZU19hc3NlcnQoYkZpbmQpOw0KLSAgICBpZiAoIWJGb3J3YXJkKSB7DQotICAgICAgICBpbnQzMl90IG5UZW1wID0gbkJnbjsNCi0gICAgICAgIG5CZ24gPSBuRW5kOw0KLSAgICAgICAgbkVuZCA9IG5UZW1wOw0KLSAgICB9DQotICAgIHBJdGVyLT5TZXRBdChuQmduICsgMSk7DQotICAgIEZYX0RXT1JEIGR3UHJlID0gKEZYX0RXT1JEKXBJdGVyLT5HZXRDaGFyKCk7DQotICAgIHBJdGVyLT5OZXh0KCk7DQotICAgIEZYX0RXT1JEIGR3Q3VyID0gKEZYX0RXT1JEKXBJdGVyLT5HZXRDaGFyKCk7DQotICAgIHBGaWVsZCA9IChDRkRFX1R4dEVkdEZpZWxkICopKChkd0N1ciA8PCAxNikgfCBkd1ByZSk7DQotICAgIHBJdGVyLT5SZWxlYXNlKCk7DQotICAgIGlmICghcEZpZWxkLT5Jc0ZpeCgpKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRmluZEVkaXRhYmxlRmllbGQoKGJGb3J3YXJkID8gbkVuZCA6IG5CZ24pLCBuQmduLCBuRW5kLCBwRmllbGQsIGJGb3J3YXJkKTsNCi19DQotRlhfQk9PTAlDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZTJOZXh0RWRpdGFibGVGaWVsZChpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiRm9yd2FyZCAsIEZYX0JPT0wgYlNlbGVjdCAgKQ0KLXsNCi0gICAgaWYgKG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsNCi0gICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fU2VsQ2hhbmdlZCh0aGlzKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IG5CZ24gPSAwLCBuRW5kID0gMDsNCi0gICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IE5VTEw7DQotICAgIEZYX0JPT0wgYlJldCA9IEZpbmRFZGl0YWJsZUZpZWxkKG5JbmRleCwgbkJnbiwgbkVuZCwgcEZpZWxkLCBiRm9yd2FyZCk7DQotICAgIGlmICghYlJldCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGludDMyX3QgbkVkaXRhYmxlQmduID0gMCwgbkVkaXRhYmxlRW5kID0gMDsNCi0gICAgcEZpZWxkLT5HZXRFZGl0YWJsZVJhbmdlKG5FZGl0YWJsZUJnbiwgbkVkaXRhYmxlRW5kKTsNCi0gICAgbkVkaXRhYmxlQmduICs9IG5CZ247DQotICAgIG5FZGl0YWJsZUVuZCArPSBuQmduOw0KLSAgICBpZiAoYlNlbGVjdCkgew0KLSAgICAgICAgaW50MzJfdCBuUmFuZ2VDb3VudCA9IG5FZGl0YWJsZUVuZCAtIG5FZGl0YWJsZUJnbjsNCi0gICAgICAgIGlmIChuUmFuZ2VDb3VudCA+IDApIHsNCi0gICAgICAgICAgICBBZGRTZWxSYW5nZShuRWRpdGFibGVCZ24sIG5FZGl0YWJsZUVuZCAtIG5FZGl0YWJsZUJnbik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgU2V0Q2FyZXRQb3MobkVkaXRhYmxlRW5kLCBUUlVFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFJlYWxJbmRleChpbnQzMl90IG5JbmRleCkgY29uc3QNCi17DQotICAgIENGREVfVHh0RWR0QnVmSXRlciAqIHBJdGVyID0gRlhfTkVXIENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKW1fcFR4dEJ1ZiwgRkFMU0UpOw0KLSAgICBwSXRlci0+U2V0QXQoMCk7DQotICAgIEZYX0JPT0wJCWJJbkZpZWxkCT0gRkFMU0U7DQotICAgIGludDMyX3QJbkZpZWxkQmduCT0gMDsNCi0gICAgaW50MzJfdAluUmVhbEluZGV4CT0gMDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IG5JbmRleDsgaSArKykgew0KLSAgICAgICAgRlhfV0NIQVIgd2MgPSBwSXRlci0+R2V0Q2hhcigpOw0KLSAgICAgICAgaWYgKGJJbkZpZWxkKSB7DQotICAgICAgICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5EKSB7DQotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UHJlID0gKEZYX0RXT1JEKW1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkZpZWxkQmduICsgMSk7DQotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q3VyID0gKEZYX0RXT1JEKW1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkZpZWxkQmduICsgMik7DQotICAgICAgICAgICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQgPSAoQ0ZERV9UeHRFZHRGaWVsZCAqKSgoZHdDdXIgPDwgMTYpIHwgZHdQcmUpOw0KLSAgICAgICAgICAgICAgICBuUmVhbEluZGV4ICs9IHBGaWVsZC0+R2V0RmllbGRUZXh0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIGJJbkZpZWxkID0gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR04pIHsNCi0gICAgICAgICAgICAgICAgYkluRmllbGQJPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBuRmllbGRCZ24JPSBwSXRlci0+R2V0QXQoKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBuUmVhbEluZGV4ICsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHBJdGVyLT5OZXh0KCk7DQotICAgIH0NCi0gICAgaWYgKCFiSW5GaWVsZCkgew0KLSAgICAgICAgcEl0ZXItPlJlbGVhc2UoKTsNCi0gICAgICAgIHJldHVybiBuUmVhbEluZGV4Ow0KLSAgICB9DQotICAgIHBJdGVyLT5TZXRBdChuRmllbGRCZ24gKyAxKTsNCi0gICAgRlhfRFdPUkQgZHdQcmUgPSAoRlhfRFdPUkQpcEl0ZXItPkdldENoYXIoKTsNCi0gICAgcEl0ZXItPk5leHQoKTsNCi0gICAgRlhfRFdPUkQgZHdDdXIgPSAoRlhfRFdPUkQpcEl0ZXItPkdldENoYXIoKTsNCi0gICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IChDRkRFX1R4dEVkdEZpZWxkICopKChkd0N1ciA8PCAxNikgfCBkd1ByZSk7DQotICAgIHBJdGVyLT5SZWxlYXNlKCk7DQotICAgIGlmIChwRmllbGQtPklzRml4KCkpIHsNCi0gICAgICAgIGludDMyX3QgbkRlbHRhID0gbkluZGV4IC0gbkZpZWxkQmduIC0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSArIDE7DQotICAgICAgICByZXR1cm4gblJlYWxJbmRleCArIChuRGVsdGEgPiAwID8gbkRlbHRhIDogMCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gblJlYWxJbmRleCArIHBGaWVsZC0+R2V0UmVhbEluZGV4KG5JbmRleCAtIG5GaWVsZEJnbik7DQotICAgIH0NCi19DQorICAgIGNhc2UgRkRFX1RYVEVEVF9ET1JFQ09SRF9GT1JNQVRJTlM6DQorICAgICAgcmV0dXJuIEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0KGJzRG9SZWNvcmQpOw0KKyAgICBjYXNlIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUREVMOg0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZShic0RvUmVjb3JkKTsNCisgICAgY2FzZSBGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVFJFUDoNCisgICAgICByZXR1cm4gRlhfTkVXIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlKGJzRG9SZWNvcmQpOw0KICNlbmRpZg0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OklzRml0QXJlYShDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgSUZERV9UZXh0T3V0ICogcFRleHRPdXQgPSBJRkRFX1RleHRPdXQ6OkNyZWF0ZSgpOw0KLSAgICBwVGV4dE91dC0+U2V0TGluZVNwYWNlKG1fUGFyYW0uZkxpbmVTcGFjZSk7DQotICAgIHBUZXh0T3V0LT5TZXRGb250KG1fUGFyYW0ucEZvbnQpOw0KLSAgICBwVGV4dE91dC0+U2V0Rm9udFNpemUobV9QYXJhbS5mRm9udFNpemUpOw0KLSAgICBDRlhfUmVjdEYgcmNUZXh0Ow0KLSAgICBGWFNZU19tZW1zZXQoJnJjVGV4dCwgMCwgc2l6ZW9mKHJjVGV4dCkpOw0KLSAgICBGWF9EV09SRCBkd1N0eWxlID0gMDsNCi0gICAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX011bHRpTGluZXMpKSB7DQotICAgICAgICBkd1N0eWxlIHw9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KLSAgICB9DQotICAgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfQXV0b0xpbmVXcmFwKSB7DQotICAgICAgICBkd1N0eWxlIHw9IEZERV9UVE9TVFlMRV9MaW5lV3JhcDsNCi0gICAgICAgIHJjVGV4dC53aWR0aCA9IG1fUGFyYW0uZlBsYXRlV2lkdGg7DQotICAgIH0gZWxzZSB7DQotICAgICAgICByY1RleHQud2lkdGggPSA2NTUzNTsNCi0gICAgfQ0KLSAgICBwVGV4dE91dC0+U2V0U3R5bGVzKGR3U3R5bGUpOw0KLSAgICB3c1RleHQgKz0gTCJcbiI7DQotICAgIHBUZXh0T3V0LT5DYWxjTG9naWNTaXplKHdzVGV4dCwgd3NUZXh0LkdldExlbmd0aCgpLCByY1RleHQpOw0KLSAgICBwVGV4dE91dC0+UmVsZWFzZSgpOw0KLSAgICB3c1RleHQuRGVsZXRlKHdzVGV4dC5HZXRMZW5ndGgoKSAtIDEpOw0KLSAgICBpZiAoKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfSG9yeikgJiYgKHJjVGV4dC53aWR0aCA+IG1fUGFyYW0uZlBsYXRlV2lkdGgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX1ZlcnQpICYmIFwNCi0gICAgICAgICAgICAocmNUZXh0LmhlaWdodCA+IG1fUGFyYW0uZkxpbmVTcGFjZSAqIG1fUGFyYW0ubkxpbmVDb3VudCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVDYXJldFJlY3QoaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSkNCi17DQotICAgIE1vdmVQYWdlMkNoYXIobkluZGV4KTsNCi0gICAgR2V0Q2FyZXRSZWN0KG1fcnRDYXJldCwgbV9uQ2FyZXRQYWdlLCBuSW5kZXgsIGJCZWZvcmUpOw0KLSAgICBtX25DYXJldAk9IG5JbmRleDsNCi0gICAgbV9iQmVmb3JlCT0gYkJlZm9yZTsNCi0gICAgaWYgKCFtX2JCZWZvcmUpIHsNCi0gICAgICAgIG1fbkNhcmV0ICsrOw0KLSAgICAgICAgbV9iQmVmb3JlID0gVFJVRTsNCi0gICAgfQ0KLSAgICBtX2ZDYXJldFBvc1Jlc2VydmUgPSAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbCkgPyBcDQotICAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRDYXJldC50b3AgOiBtX3J0Q2FyZXQubGVmdDsNCi0gICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9DYXJldENoYW5nZWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCitDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDo6Q0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgew0KKyAgRGVzZXJpYWxpemUoYnNEb1JlY29yZCk7DQogfQ0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldENhcmV0UmVjdChDRlhfUmVjdEYgJnJ0Q2FyZXQsIGludDMyX3QgblBhZ2VJbmRleCwgaW50MzJfdCBuQ2FyZXQsIEZYX0JPT0wgYkJlZm9yZSApDQotew0KLSAgICBJRkRFX1R4dEVkdFBhZ2UgKiBwUGFnZSA9IG1fUGFnZVB0ckFycmF5W21fbkNhcmV0UGFnZV07DQotICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCi0gICAgRlhfQk9PTAkJYkNvbWJUZXh0CQk9IG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQ7DQotICAgIGludDMyX3QJbkluZGV4SW5wYWdlCT0gbkNhcmV0IC0gcFBhZ2UtPkdldENoYXJTdGFydCgpOw0KLSAgICBpZiAoYkJlZm9yZSAmJiBiQ29tYlRleHQgJiYgbkluZGV4SW5wYWdlID4gMCkgew0KLSAgICAgICAgbkluZGV4SW5wYWdlLS07DQotICAgICAgICBiQmVmb3JlCT0gRkFMU0U7DQotICAgIH0NCi0gICAgaW50MzJfdCBuQklESUxldmVsID0gcFBhZ2UtPkdldENoYXJSZWN0KG5JbmRleElucGFnZSwgcnRDYXJldCwgYkNvbWJUZXh0KTsNCi0gICAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwpIHsNCi0gICAgICAgIGlmICgoIUZYX0lzT2RkKG5CSURJTGV2ZWwpICYmICFiQmVmb3JlKSB8fCAoRlhfSXNPZGQobkJJRElMZXZlbCkgJiYgYkJlZm9yZSkpIHsNCi0gICAgICAgICAgICBydENhcmV0Lk9mZnNldCgwLCBydENhcmV0LmhlaWdodCAtIDEuMGYpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHJ0Q2FyZXQuaGVpZ2h0ID09IDAgJiYgcnRDYXJldC50b3AgPiAxLjBmKSB7DQotICAgICAgICAgICAgcnRDYXJldC50b3AgLT0gMS4wZjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJ0Q2FyZXQuaGVpZ2h0ID0gMS4wZjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmICgoIUZYX0lzT2RkKG5CSURJTGV2ZWwpICYmICFiQmVmb3JlKSB8fCAoRlhfSXNPZGQobkJJRElMZXZlbCkgJiYgYkJlZm9yZSkpIHsNCi0gICAgICAgICAgICBydENhcmV0Lk9mZnNldChydENhcmV0LndpZHRoIC0gMS4wZiwgMCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAocnRDYXJldC53aWR0aCA9PSAwICYmIHJ0Q2FyZXQubGVmdCA+IDEuMGYpIHsNCi0gICAgICAgICAgICBydENhcmV0LmxlZnQgLT0gMS4wZjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJ0Q2FyZXQud2lkdGggPSAxLjBmOw0KLSAgICB9DQotICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KK0NGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydCgNCisgICAgQ0ZERV9UeHRFZHRFbmdpbmUqIHBFbmdpbmUsDQorICAgIGludDMyX3QgbkNhcmV0LA0KKyAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICBpbnQzMl90IG5MZW5ndGgpDQorICAgIDogbV9wRW5naW5lKHBFbmdpbmUpLCBtX25DYXJldChuQ2FyZXQpIHsNCisgIEZYU1lTX2Fzc2VydChwRW5naW5lKTsNCisgIEZYX1dDSEFSKiBscEJ1ZmZlciA9IG1fd3NJbnNlcnQuR2V0QnVmZmVyKG5MZW5ndGgpOw0KKyAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyLCBscFRleHQsIG5MZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIG1fd3NJbnNlcnQuUmVsZWFzZUJ1ZmZlcigpOw0KIH0NCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVDYXJldEluZGV4KGNvbnN0IENGWF9Qb2ludEYgJiBwdENhcmV0KQ0KLXsNCi0gICAgSUZERV9UeHRFZHRQYWdlICogcFBhZ2UgPSBtX1BhZ2VQdHJBcnJheVttX25DYXJldFBhZ2VdOw0KLSAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VMb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQotICAgIG1fbkNhcmV0ID0gcFBhZ2UtPkdldENoYXJJbmRleChwdENhcmV0LCBtX2JCZWZvcmUpOw0KLSAgICBHZXRDYXJldFJlY3QobV9ydENhcmV0LCBtX25DYXJldFBhZ2UsIG1fbkNhcmV0LCBtX2JCZWZvcmUpOw0KLSAgICBpZiAoIW1fYkJlZm9yZSkgew0KLSAgICAgICAgbV9uQ2FyZXQgKys7DQotICAgICAgICBtX2JCZWZvcmUgPSBUUlVFOw0KLSAgICB9DQotICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQ2FyZXRDaGFuZ2VkKHRoaXMsIG1fbkNhcmV0UGFnZSk7DQotICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KK0NGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0Ojp+Q0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoKSB7fQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCiB9DQotRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6SXNTZWxlY3QoKQ0KLXsNCi0gICAgcmV0dXJuIG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpID4gMDsNCitGWF9CT09MIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpVbmRvKCkgew0KKyAgaWYgKG1fcEVuZ2luZS0+SXNTZWxlY3QoKSkgew0KKyAgICBtX3BFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQorICB9DQorICBtX3BFbmdpbmUtPklubmVyX0RlbGV0ZVJhbmdlKG1fbkNhcmV0LCBtX3dzSW5zZXJ0LkdldExlbmd0aCgpKTsNCisgIEZERV9UWFRFRFRQQVJBTVMmIFBhcmFtID0gbV9wRW5naW5lLT5tX1BhcmFtOw0KKyAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUgPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9EZWxldGU7DQorICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby53c0RlbGV0ZSA9IG1fd3NJbnNlcnQ7DQorICBQYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZChtX3BFbmdpbmUsIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvKTsNCisgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQsIFRSVUUpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkRlbGV0ZVNlbGVjdCgpDQotew0KLSAgICBpbnQzMl90IG5Db3VudFJhbmdlID0gQ291bnRTZWxSYW5nZXMoKTsNCi0gICAgaWYgKG5Db3VudFJhbmdlID4gMCkgew0KLSNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCi0gICAgICAgIGludDMyX3QgbkJsb2NrQ291bnQgPSBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICAgICAgaWYgKG5CbG9ja0NvdW50ID4gMCkgew0KLSAgICAgICAgICAgIGlmIChuQ291bnRSYW5nZSA+IDEpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpbnQzMl90IG5TZWxTdGFydDsNCi0gICAgICAgICAgICBpbnQzMl90IG5TZWxDb3VudDsNCi0gICAgICAgICAgICBuU2VsQ291bnQgPSBHZXRTZWxSYW5nZSgwLCBuU2VsU3RhcnQpOw0KLSAgICAgICAgICAgIGludDMyX3QgblNlbEVuZCA9IG5TZWxTdGFydCArIG5TZWxDb3VudDsNCi0gICAgICAgICAgICBpbnQzMl90IG5CZ24gPSAwOw0KLSAgICAgICAgICAgIGludDMyX3QgbkVuZCA9IDA7DQotICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCA9IE5VTEw7DQotICAgICAgICAgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkoblNlbFN0YXJ0LCBuQmduLCBuRW5kLCBwRmllbGQpOw0KLSAgICAgICAgICAgIGludDMyX3QJbkNhcmV0SW5GaWVsZAk9IG5TZWxTdGFydCAtIG5CZ247DQotICAgICAgICAgICAgRlhfQk9PTAkJYkJlZm9yZQkJCT0gRkFMU0U7DQotICAgICAgICAgICAgaWYgKCFiSW5GaWVsZCB8fCBwRmllbGQtPklzRml4KCkgfHwgblNlbEVuZCA+IG5FbmQpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwRmllbGQtPkJhY2t1cCgpOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGVsOw0KLSAgICAgICAgICAgIGludDMyX3QgbkNhcmV0ID0gMDsNCi0gICAgICAgICAgICBpbnQzMl90IG5SZXQgPSBwRmllbGQtPkRlbGV0ZShuQ2FyZXRJbkZpZWxkLCBuU2VsQ291bnQsIHdzRGVsLCBuQ2FyZXQsIGJCZWZvcmUpOw0KLSAgICAgICAgICAgIG5DYXJldCArPSBuQmduOw0KLSAgICAgICAgICAgIHN3aXRjaCAoblJldCkgew0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9TOg0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfSU5WQUxJREFURToNCi0gICAgICAgICAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWToNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkOw0KLSAgICAgICAgICAgIHBGaWVsZC0+R2V0RmllbGRUZXh0KHdzRmllbGQpOw0KLSAgICAgICAgICAgIGlmICghbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9WYWxpZGF0ZUZpZWxkKHRoaXMsIHBGaWVsZC0+R2V0QmxvY2tJbmRleCgpLCBwRmllbGQtPkdldEluZGV4KCksIHdzRmllbGQsIDApKSB7DQotICAgICAgICAgICAgICAgIHBGaWVsZC0+UmVzdG9yZSgpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCi0gICAgICAgICAgICBwRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQotICAgICAgICAgICAgUmVwbGFjZShuQmduLCBuRW5kIC0gbkJnbiArIDEsIHdzRGlzcGxheSk7DQotICAgICAgICAgICAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pKSB7DQotICAgICAgICAgICAgICAgIElGREVfVHh0RWR0RG9SZWNvcmQgKiBwUmVjb3JkID0gRlhfTkVXIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGUodGhpcywgblNlbFN0YXJ0LCBwRmllbGQsIG5DYXJldEluRmllbGQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJnbiwgbkVuZCAtIG5CZ24gKyAxLCB3c0Rpc3BsYXkuR2V0TGVuZ3RoKCksIHdzRGVsLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRG9SZWNvcmQ7DQotICAgICAgICAgICAgICAgIHBSZWNvcmQtPlNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCi0gICAgICAgICAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9BZGREb1JlY29yZCh0aGlzLCBic0RvUmVjb3JkKTsNCi0gICAgICAgICAgICAgICAgcFJlY29yZC0+UmVsZWFzZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBTZXRDYXJldFBvcyhuU2VsU3RhcnQsIGJCZWZvcmUpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0jZW5kaWYNCi0gICAgICAgIGludDMyX3QgblNlbFN0YXJ0Ow0KLSAgICAgICAgaW50MzJfdCBuU2VsQ291bnQ7DQotICAgICAgICB3aGlsZSAobkNvdW50UmFuZ2UgPiAwKSB7DQotICAgICAgICAgICAgblNlbENvdW50ID0gR2V0U2VsUmFuZ2UoLS1uQ291bnRSYW5nZSwgblNlbFN0YXJ0KTsNCi0gICAgICAgICAgICBGREVfTFBUWFRFRFRTRUxSQU5HRSBscFRlbXAgPSBtX1NlbFJhbmdlUHRyQXJyW25Db3VudFJhbmdlXTsNCi0gICAgICAgICAgICBkZWxldGUgbHBUZW1wOw0KLSAgICAgICAgICAgIG1fU2VsUmFuZ2VQdHJBcnIuUmVtb3ZlQXQobkNvdW50UmFuZ2UpOw0KLSAgICAgICAgICAgIERlbGV0ZVJhbmdlX0RvUmVjb3JkKG5TZWxTdGFydCwgblNlbENvdW50LCBUUlVFKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENsZWFyU2VsZWN0aW9uKCk7DQotICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1RleHRDaGFuZ2VkKHRoaXMsIG1fQ2hhbmdlSW5mbyk7DQotICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1NlbENoYW5nZWQodGhpcyk7DQotICAgICAgICBTZXRDYXJldFBvcyhuU2VsU3RhcnQsIFRSVUUpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQorRlhfQk9PTCBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDo6UmVkbygpIHsNCisgIG1fcEVuZ2luZS0+SW5uZXJfSW5zZXJ0KG1fbkNhcmV0LCBtX3dzSW5zZXJ0LmNfc3RyKCksIG1fd3NJbnNlcnQuR2V0TGVuZ3RoKCkpOw0KKyAgRkRFX1RYVEVEVFBBUkFNUyYgUGFyYW0gPSBtX3BFbmdpbmUtPm1fUGFyYW07DQorICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby5uQ2hhbmdlVHlwZSA9IEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0luc2VydDsNCisgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLndzRGVsZXRlID0gbV93c0luc2VydDsNCisgIFBhcmFtLnBFdmVudFNpbmstPk9uX1RleHRDaGFuZ2VkKG1fcEVuZ2luZSwgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8pOw0KKyAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUlGREVfVHh0RWR0RG9SZWNvcmQgKiBJRkRFX1R4dEVkdERvUmVjb3JkOjpDcmVhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKQ0KLXsNCi0gICAgY29uc3QgRlhfQ0hBUioJbHBCdWYJPQlic0RvUmVjb3JkLkdldENTdHIoKTsNCi0gICAgaW50MzJfdAluVHlwZQk9CSooKGludDMyX3QqKWxwQnVmKTsNCi0gICAgc3dpdGNoKG5UeXBlKSB7DQotICAgICAgICBjYXNlIEZERV9UWFRFRFRfRE9SRUNPUkRfSU5TOg0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoYnNEb1JlY29yZCk7DQotICAgICAgICBjYXNlIEZERV9UWFRFRFRfRE9SRUNPUkRfREVMOg0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZShic0RvUmVjb3JkKTsNCi0jaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotICAgICAgICBjYXNlIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUSU5TOg0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydChic0RvUmVjb3JkKTsNCi0gICAgICAgIGNhc2UgRkRFX1RYVEVEVF9ET1JFQ09SRF9GT1JNQVRERUw6DQotICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKGJzRG9SZWNvcmQpOw0KLSAgICAgICAgY2FzZSBGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVFJFUDoNCi0gICAgICAgICAgICByZXR1cm4gRlhfTkVXIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlKGJzRG9SZWNvcmQpOw0KLSNlbmRpZg0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcmIGJzRG9SZWNvcmQpIGNvbnN0IHsNCisgIENGWF9BcmNoaXZlU2F2ZXIgQXJjaGl2ZVNhdmVyOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IGludDMyX3QoRkRFX1RYVEVEVF9ET1JFQ09SRF9JTlMpOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IChpbnQzMl90KSh1aW50cHRyX3QpbV9wRW5naW5lOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkNhcmV0Ow0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fd3NJbnNlcnQ7DQorICBpbnQzMl90IG5MZW5ndGggPSBBcmNoaXZlU2F2ZXIuR2V0TGVuZ3RoKCk7DQorICBjb25zdCB1aW50OF90KiBscFNyY0J1ZiA9IEFyY2hpdmVTYXZlci5HZXRCdWZmZXIoKTsNCisgIEZYX0NIQVIqIGxwRHN0QnVmID0gYnNEb1JlY29yZC5HZXRCdWZmZXIobkxlbmd0aCk7DQorICBGWFNZU19tZW1jcHkobHBEc3RCdWYsIGxwU3JjQnVmLCBuTGVuZ3RoKTsNCisgIGJzRG9SZWNvcmQuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCiB9DQotQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ6OkNGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkNCi17DQotICAgIERlc2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ6OkRlc2VyaWFsaXplKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIHsNCisgIENGWF9BcmNoaXZlTG9hZGVyIEFyY2hpdmVMb2FkZXIoKGNvbnN0IHVpbnQ4X3QqKWJzRG9SZWNvcmQuR2V0Q1N0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0RvUmVjb3JkLkdldExlbmd0aCgpKTsNCisgIGludDMyX3QgblR5cGUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuVHlwZTsNCisgIEZYU1lTX2Fzc2VydChuVHlwZSA9PSBGREVfVFhURURUX0RPUkVDT1JEX0lOUyk7DQorICBpbnQzMl90IG5FbmdpbmUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuRW5naW5lOw0KKyAgbV9wRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikodWludHB0cl90KW5FbmdpbmU7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbkNhcmV0Ow0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX3dzSW5zZXJ0Ow0KIH0NCi1DRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDo6Q0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLA0KLSAgICAgICAgaW50MzJfdCBuQ2FyZXQsDQotICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KLSAgICAgICAgaW50MzJfdCBuTGVuZ3RoKQ0KLSAgICA6IG1fcEVuZ2luZShwRW5naW5lKQ0KLSAgICAsIG1fbkNhcmV0KG5DYXJldCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwRW5naW5lKTsNCi0gICAgRlhfV0NIQVIqIGxwQnVmZmVyID0gbV93c0luc2VydC5HZXRCdWZmZXIobkxlbmd0aCk7DQotICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciwgbHBUZXh0LCBuTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgIG1fd3NJbnNlcnQuUmVsZWFzZUJ1ZmZlcigpOw0KK0NGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6OkNGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgew0KKyAgRGVzZXJpYWxpemUoYnNEb1JlY29yZCk7DQogfQ0KLUNGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0Ojp+Q0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoKQ0KLXsNCitDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlKA0KKyAgICBDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgaW50MzJfdCBuSW5kZXgsDQorICAgIGludDMyX3QgbkNhcmV0LA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSYW5nZSwNCisgICAgRlhfQk9PTCBiU2VsKQ0KKyAgICA6IG1fcEVuZ2luZShwRW5naW5lKSwNCisgICAgICBtX25JbmRleChuSW5kZXgpLA0KKyAgICAgIG1fbkNhcmV0KG5DYXJldCksDQorICAgICAgbV93c1JhbmdlKHdzUmFuZ2UpLA0KKyAgICAgIG1fYlNlbChiU2VsKSB7DQorICBGWFNZU19hc3NlcnQocEVuZ2luZSk7DQogfQ0KLXZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ6OlJlbGVhc2UoKQ0KLXsNCi0gICAgZGVsZXRlIHRoaXM7DQorQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTo6fkNGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoKSB7fQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTo6UmVsZWFzZSgpIHsNCisgIGRlbGV0ZSB0aGlzOw0KIH0NCi1GWF9CT09MIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpVbmRvKCkNCi17DQotICAgIGlmIChtX3BFbmdpbmUtPklzU2VsZWN0KCkpIHsNCi0gICAgICAgIG1fcEVuZ2luZS0+Q2xlYXJTZWxlY3Rpb24oKTsNCi0gICAgfQ0KLSAgICBtX3BFbmdpbmUtPklubmVyX0RlbGV0ZVJhbmdlKG1fbkNhcmV0LCBtX3dzSW5zZXJ0LkdldExlbmd0aCgpKTsNCi0gICAgRkRFX1RYVEVEVFBBUkFNUyYgUGFyYW0gPSBtX3BFbmdpbmUtPm1fUGFyYW07DQotICAgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfRGVsZXRlOw0KLSAgICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby53c0RlbGV0ZQk9IG1fd3NJbnNlcnQ7DQotICAgIFBhcmFtLnBFdmVudFNpbmstPk9uX1RleHRDaGFuZ2VkKG1fcEVuZ2luZSwgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8pOw0KLSAgICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbkNhcmV0LCBUUlVFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpVbmRvKCkgew0KKyAgaWYgKG1fcEVuZ2luZS0+SXNTZWxlY3QoKSkgew0KKyAgICBtX3BFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQorICB9DQorICBtX3BFbmdpbmUtPklubmVyX0luc2VydChtX25JbmRleCwgbV93c1JhbmdlLmNfc3RyKCksIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7DQorICBpZiAobV9iU2VsKSB7DQorICAgIG1fcEVuZ2luZS0+QWRkU2VsUmFuZ2UobV9uSW5kZXgsIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7DQorICB9DQorICBGREVfVFhURURUUEFSQU1TJiBQYXJhbSA9IG1fcEVuZ2luZS0+bV9QYXJhbTsNCisgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0Ow0KKyAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ud3NEZWxldGUgPSBtX3dzUmFuZ2U7DQorICBQYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZChtX3BFbmdpbmUsIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvKTsNCisgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQsIFRSVUUpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ6OlJlZG8oKQ0KLXsNCi0gICAgbV9wRW5naW5lLT5Jbm5lcl9JbnNlcnQobV9uQ2FyZXQsIG1fd3NJbnNlcnQuY19zdHIoKSwgbV93c0luc2VydC5HZXRMZW5ndGgoKSk7DQotICAgIEZERV9UWFRFRFRQQVJBTVMmIFBhcmFtID0gbV9wRW5naW5lLT5tX1BhcmFtOw0KLSAgICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby5uQ2hhbmdlVHlwZSA9IEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0luc2VydDsNCi0gICAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ud3NEZWxldGUJPSBtX3dzSW5zZXJ0Ow0KLSAgICBQYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZChtX3BFbmdpbmUsIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvKTsNCi0gICAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCwgRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6OlJlZG8oKSB7DQorICBtX3BFbmdpbmUtPklubmVyX0RlbGV0ZVJhbmdlKG1fbkluZGV4LCBtX3dzUmFuZ2UuR2V0TGVuZ3RoKCkpOw0KKyAgaWYgKG1fYlNlbCkgew0KKyAgICBtX3BFbmdpbmUtPlJlbW92ZVNlbFJhbmdlKG1fbkluZGV4LCBtX3dzUmFuZ2UuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgRkRFX1RYVEVEVFBBUkFNUyYgUGFyYW0gPSBtX3BFbmdpbmUtPm1fUGFyYW07DQorICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby5uQ2hhbmdlVHlwZSA9IEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0luc2VydDsNCisgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLndzRGVsZXRlID0gbV93c1JhbmdlOw0KKyAgUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQobV9wRW5naW5lLCBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mbyk7DQorICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbkluZGV4LCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi12b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcgJmJzRG9SZWNvcmQpIGNvbnN0DQotew0KLSAgICBDRlhfQXJjaGl2ZVNhdmVyIEFyY2hpdmVTYXZlcjsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IGludDMyX3QoRkRFX1RYVEVEVF9ET1JFQ09SRF9JTlMpOw0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgKGludDMyX3QpKHVpbnRwdHJfdCltX3BFbmdpbmU7DQotICAgIEFyY2hpdmVTYXZlciA8PCBtX25DYXJldDsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IG1fd3NJbnNlcnQ7DQotICAgIGludDMyX3QJbkxlbmd0aAkJPSBBcmNoaXZlU2F2ZXIuR2V0TGVuZ3RoKCk7DQotICAgIGNvbnN0IHVpbnQ4X3QqCWxwU3JjQnVmCT0gQXJjaGl2ZVNhdmVyLkdldEJ1ZmZlcigpOw0KLSAgICBGWF9DSEFSKglscERzdEJ1Zgk9IGJzRG9SZWNvcmQuR2V0QnVmZmVyKG5MZW5ndGgpOw0KLSAgICBGWFNZU19tZW1jcHkobHBEc3RCdWYsIGxwU3JjQnVmLCBuTGVuZ3RoKTsNCi0gICAgYnNEb1JlY29yZC5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTo6U2VyaWFsaXplKA0KKyAgICBDRlhfQnl0ZVN0cmluZyYgYnNEb1JlY29yZCkgY29uc3Qgew0KKyAgQ0ZYX0FyY2hpdmVTYXZlciBBcmNoaXZlU2F2ZXI7DQorICBBcmNoaXZlU2F2ZXIgPDwgaW50MzJfdChGREVfVFhURURUX0RPUkVDT1JEX0RFTCk7DQorICBBcmNoaXZlU2F2ZXIgPDwgKGludDMyX3QpKHVpbnRwdHJfdCltX3BFbmdpbmU7DQorICBBcmNoaXZlU2F2ZXIgPDwgKGludDMyX3QpbV9iU2VsOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkluZGV4Ow0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkNhcmV0Ow0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fd3NSYW5nZTsNCisgIGludDMyX3Qgbkxlbmd0aCA9IEFyY2hpdmVTYXZlci5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IHVpbnQ4X3QqIGxwU3JjQnVmID0gQXJjaGl2ZVNhdmVyLkdldEJ1ZmZlcigpOw0KKyAgRlhfQ0hBUiogbHBEc3RCdWYgPSBic0RvUmVjb3JkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgIEZYU1lTX21lbWNweShscERzdEJ1ZiwgbHBTcmNCdWYsIG5MZW5ndGgpOw0KKyAgYnNEb1JlY29yZC5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KIH0NCi12b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpEZXNlcmlhbGl6ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpDQotew0KLSAgICBDRlhfQXJjaGl2ZUxvYWRlciBBcmNoaXZlTG9hZGVyKChjb25zdCB1aW50OF90Kilic0RvUmVjb3JkLkdldENTdHIoKSwgYnNEb1JlY29yZC5HZXRMZW5ndGgoKSk7DQotICAgIGludDMyX3QgblR5cGUgPSAwOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG5UeXBlOw0KLSAgICBGWFNZU19hc3NlcnQoblR5cGUgPT0gRkRFX1RYVEVEVF9ET1JFQ09SRF9JTlMpOw0KLSAgICBpbnQzMl90IG5FbmdpbmUgPSAwOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG5FbmdpbmU7DQotICAgIG1fcEVuZ2luZSA9IChDRkRFX1R4dEVkdEVuZ2luZSopKHVpbnRwdHJfdCluRW5naW5lOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG1fbkNhcmV0Ow0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG1fd3NJbnNlcnQ7DQotfQ0KLUNGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6OkNGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKQ0KLXsNCi0gICAgRGVzZXJpYWxpemUoYnNEb1JlY29yZCk7DQotfQ0KLUNGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6OkNGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLA0KLSAgICAgICAgaW50MzJfdCBuSW5kZXgsDQotICAgICAgICBpbnQzMl90IG5DYXJldCwNCi0gICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1JhbmdlLA0KLSAgICAgICAgRlhfQk9PTCBiU2VsKQ0KLSAgICA6IG1fcEVuZ2luZShwRW5naW5lKQ0KLSAgICAsIG1fbkluZGV4KG5JbmRleCkNCi0gICAgLCBtX25DYXJldChuQ2FyZXQpDQotICAgICwgbV93c1JhbmdlKHdzUmFuZ2UpDQotICAgICwgbV9iU2VsKGJTZWwpDQotew0KLSAgICBGWFNZU19hc3NlcnQocEVuZ2luZSk7DQotfQ0KLUNGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6On5DRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlKCkNCi17DQotfQ0KLXZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTo6UmVsZWFzZSgpDQotew0KLSAgICBkZWxldGUgdGhpczsNCi19DQotRlhfQk9PTCBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpVbmRvKCkNCi17DQotICAgIGlmIChtX3BFbmdpbmUtPklzU2VsZWN0KCkpIHsNCi0gICAgICAgIG1fcEVuZ2luZS0+Q2xlYXJTZWxlY3Rpb24oKTsNCi0gICAgfQ0KLSAgICBtX3BFbmdpbmUtPklubmVyX0luc2VydChtX25JbmRleCwgbV93c1JhbmdlLmNfc3RyKCksIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7DQotICAgIGlmIChtX2JTZWwpIHsNCi0gICAgICAgIG1fcEVuZ2luZS0+QWRkU2VsUmFuZ2UobV9uSW5kZXgsIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgRkRFX1RYVEVEVFBBUkFNUyYgUGFyYW0gPSBtX3BFbmdpbmUtPm1fUGFyYW07DQotICAgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0Ow0KLSAgICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby53c0RlbGV0ZQk9IG1fd3NSYW5nZTsNCi0gICAgUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQobV9wRW5naW5lLCBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mbyk7DQotICAgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQsIFRSVUUpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpSZWRvKCkNCi17DQotICAgIG1fcEVuZ2luZS0+SW5uZXJfRGVsZXRlUmFuZ2UobV9uSW5kZXgsIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7DQotICAgIGlmIChtX2JTZWwpIHsNCi0gICAgICAgIG1fcEVuZ2luZS0+UmVtb3ZlU2VsUmFuZ2UobV9uSW5kZXgsIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgRkRFX1RYVEVEVFBBUkFNUyYgUGFyYW0gPSBtX3BFbmdpbmUtPm1fUGFyYW07DQotICAgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0Ow0KLSAgICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby53c0RlbGV0ZQk9IG1fd3NSYW5nZTsNCi0gICAgUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQobV9wRW5naW5lLCBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mbyk7DQotICAgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uSW5kZXgsIFRSVUUpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcgJmJzRG9SZWNvcmQpIGNvbnN0DQotew0KLSAgICBDRlhfQXJjaGl2ZVNhdmVyIEFyY2hpdmVTYXZlcjsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IGludDMyX3QoRkRFX1RYVEVEVF9ET1JFQ09SRF9ERUwpOw0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgKGludDMyX3QpKHVpbnRwdHJfdCltX3BFbmdpbmU7DQotICAgIEFyY2hpdmVTYXZlciA8PCAoaW50MzJfdCltX2JTZWw7DQotICAgIEFyY2hpdmVTYXZlciA8PCBtX25JbmRleDsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IG1fbkNhcmV0Ow0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgbV93c1JhbmdlOw0KLSAgICBpbnQzMl90CW5MZW5ndGgJCT0gQXJjaGl2ZVNhdmVyLkdldExlbmd0aCgpOw0KLSAgICBjb25zdCB1aW50OF90KglscFNyY0J1Zgk9IEFyY2hpdmVTYXZlci5HZXRCdWZmZXIoKTsNCi0gICAgRlhfQ0hBUioJbHBEc3RCdWYJPSBic0RvUmVjb3JkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCi0gICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1Ziwgbkxlbmd0aCk7DQotICAgIGJzRG9SZWNvcmQuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCi19DQotdm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpEZXNlcmlhbGl6ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpDQotew0KLSAgICBDRlhfQXJjaGl2ZUxvYWRlciBBcmNoaXZlTG9hZGVyKChjb25zdCB1aW50OF90Kilic0RvUmVjb3JkLkdldENTdHIoKSwgYnNEb1JlY29yZC5HZXRMZW5ndGgoKSk7DQotICAgIGludDMyX3QgblR5cGUgPSAwOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG5UeXBlOw0KLSAgICBGWFNZU19hc3NlcnQoblR5cGUgPT0gRkRFX1RYVEVEVF9ET1JFQ09SRF9ERUwpOw0KLSAgICBpbnQzMl90IG5FbmdpbmUgPSAwOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG5FbmdpbmU7DQotICAgIG1fcEVuZ2luZSA9IChDRkRFX1R4dEVkdEVuZ2luZSopKHVpbnRwdHJfdCluRW5naW5lOw0KLSAgICBpbnQzMl90IGlTZWwgPSAwOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IGlTZWw7DQotICAgIG1fYlNlbCA9ICEhaVNlbDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX25JbmRleDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX25DYXJldDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX3dzUmFuZ2U7DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpEZXNlcmlhbGl6ZSgNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKSB7DQorICBDRlhfQXJjaGl2ZUxvYWRlciBBcmNoaXZlTG9hZGVyKChjb25zdCB1aW50OF90Kilic0RvUmVjb3JkLkdldENTdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNEb1JlY29yZC5HZXRMZW5ndGgoKSk7DQorICBpbnQzMl90IG5UeXBlID0gMDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gblR5cGU7DQorICBGWFNZU19hc3NlcnQoblR5cGUgPT0gRkRFX1RYVEVEVF9ET1JFQ09SRF9ERUwpOw0KKyAgaW50MzJfdCBuRW5naW5lID0gMDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbkVuZ2luZTsNCisgIG1fcEVuZ2luZSA9IChDRkRFX1R4dEVkdEVuZ2luZSopKHVpbnRwdHJfdCluRW5naW5lOw0KKyAgaW50MzJfdCBpU2VsID0gMDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gaVNlbDsNCisgIG1fYlNlbCA9ICEhaVNlbDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uSW5kZXg7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbkNhcmV0Ow0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX3dzUmFuZ2U7DQogfQ0KICNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCi1DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0OjpDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkNCi17DQotICAgIERlc2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KK0NGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQoDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgew0KKyAgRGVzZXJpYWxpemUoYnNEb1JlY29yZCk7DQogfQ0KLUNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQoQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLA0KLSAgICAgICAgaW50MzJfdCBuQ2FyZXQsDQotICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkLA0KLSAgICAgICAgaW50MzJfdCBuSW5kZXhJbkZpZWxkLA0KLSAgICAgICAgaW50MzJfdCBuRmllbGRCZ24sDQotICAgICAgICBpbnQzMl90IG5PbGRGaWVsZExlbmd0aCwNCi0gICAgICAgIGludDMyX3Qgbk5ld0ZpZWxkTGVuZ3RoLA0KLSAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzSW5zLA0KLSAgICAgICAgRlhfQk9PTCBiU2VsICkNCi0gICAgOiBtX3BFbmdpbmUocEVuZ2luZSkNCi0gICAgLCBtX25DYXJldChuQ2FyZXQpDQotICAgICwgbV9wRmllbGQocEZpZWxkKQ0KLSAgICAsIG1fbkluZGV4SW5GaWVsZChuSW5kZXhJbkZpZWxkKQ0KLSAgICAsIG1fbkZpZWxkQmduKG5GaWVsZEJnbikNCi0gICAgLCBtX25PbGRGaWVsZExlbmd0aChuT2xkRmllbGRMZW5ndGgpDQotICAgICwgbV9uTmV3RmllbGRMZW5ndGgobk5ld0ZpZWxkTGVuZ3RoKQ0KLSAgICAsIG1fd3NJbnMod3NJbnMpDQotICAgICwgbV9iU2VsKGJTZWwpDQotew0KLSAgICBGWFNZU19hc3NlcnQocEVuZ2luZSk7DQotICAgIEZYU1lTX2Fzc2VydChwRmllbGQpOw0KK0NGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQoDQorICAgIENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLA0KKyAgICBpbnQzMl90IG5DYXJldCwNCisgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkLA0KKyAgICBpbnQzMl90IG5JbmRleEluRmllbGQsDQorICAgIGludDMyX3QgbkZpZWxkQmduLA0KKyAgICBpbnQzMl90IG5PbGRGaWVsZExlbmd0aCwNCisgICAgaW50MzJfdCBuTmV3RmllbGRMZW5ndGgsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0lucywNCisgICAgRlhfQk9PTCBiU2VsKQ0KKyAgICA6IG1fcEVuZ2luZShwRW5naW5lKSwNCisgICAgICBtX25DYXJldChuQ2FyZXQpLA0KKyAgICAgIG1fcEZpZWxkKHBGaWVsZCksDQorICAgICAgbV9uSW5kZXhJbkZpZWxkKG5JbmRleEluRmllbGQpLA0KKyAgICAgIG1fbkZpZWxkQmduKG5GaWVsZEJnbiksDQorICAgICAgbV9uT2xkRmllbGRMZW5ndGgobk9sZEZpZWxkTGVuZ3RoKSwNCisgICAgICBtX25OZXdGaWVsZExlbmd0aChuTmV3RmllbGRMZW5ndGgpLA0KKyAgICAgIG1fd3NJbnMod3NJbnMpLA0KKyAgICAgIG1fYlNlbChiU2VsKSB7DQorICBGWFNZU19hc3NlcnQocEVuZ2luZSk7DQorICBGWFNZU19hc3NlcnQocEZpZWxkKTsNCiB9DQotQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDo6fkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQoKQ0KLXsNCitDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0Ojp+Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydCgpIHt9DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0OjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQogfQ0KLXZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDo6UmVsZWFzZSgpDQotew0KLSAgICBkZWxldGUgdGhpczsNCitGWF9CT09MIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OlVuZG8oKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0RlbDsNCisgIGludDMyX3QgbkNhcmV0ID0gMDsNCisgIEZYX0JPT0wgYkJlZm9yZSA9IEZBTFNFOw0KKyAgaW50MzJfdCBuUmV0ID0gbV9wRmllbGQtPkRlbGV0ZShtX25JbmRleEluRmllbGQsIG1fd3NJbnMuR2V0TGVuZ3RoKCksIHdzRGVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgRlhTWVNfYXNzZXJ0KG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfSU5WQUxJREFURSAmJg0KKyAgICAgICAgICAgICAgIG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfQk9VTkRBUlkpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KKyAgbV9wRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICBtX3BFbmdpbmUtPlJlcGxhY2UobV9uRmllbGRCZ24sIG1fbk5ld0ZpZWxkTGVuZ3RoLCB3c0Rpc3BsYXkpOw0KKyAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCwgVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAlDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0OjpVbmRvKCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRGVsOw0KLSAgICBpbnQzMl90CW5DYXJldAkJPSAwOw0KLSAgICBGWF9CT09MCQliQmVmb3JlCT0gRkFMU0U7DQotICAgIGludDMyX3QgblJldCA9IG1fcEZpZWxkLT5EZWxldGUobV9uSW5kZXhJbkZpZWxkLCBtX3dzSW5zLkdldExlbmd0aCgpLCB3c0RlbCwgbkNhcmV0LCBiQmVmb3JlKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfSU5WQUxJREFURSAmJiBuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0JPVU5EQVJZKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KLSAgICBtX3BGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCi0gICAgbV9wRW5naW5lLT5SZXBsYWNlKG1fbkZpZWxkQmduLCBtX25OZXdGaWVsZExlbmd0aCwgd3NEaXNwbGF5KTsNCi0gICAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCwgVFJVRSk7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDo6UmVkbygpIHsNCisgIGludDMyX3QgbkNhcmV0ID0gMDsNCisgIEZYX0JPT0wgYkJlZm9yZSA9IEZBTFNFOw0KKyAgaW50MzJfdCBuUmV0ID0gbV9wRmllbGQtPkluc2VydChtX25JbmRleEluRmllbGQsIG1fd3NJbnMsIG5DYXJldCwgYkJlZm9yZSk7DQorICBGWFNZU19hc3NlcnQoblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMICYmDQorICAgICAgICAgICAgICAgblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9JTlZBTElEQVRFKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgIG1fcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgbV9wRW5naW5lLT5SZXBsYWNlKG1fbkZpZWxkQmduLCBtX25PbGRGaWVsZExlbmd0aCwgd3NEaXNwbGF5KTsNCisgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQgKyBtX3dzSW5zLkdldExlbmd0aCgpLCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MCUNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OlJlZG8oKQ0KLXsNCi0gICAgaW50MzJfdAluQ2FyZXQJPSAwOw0KLSAgICBGWF9CT09MCQliQmVmb3JlCT0gRkFMU0U7DQotICAgIGludDMyX3QgblJldCA9IG1fcEZpZWxkLT5JbnNlcnQobV9uSW5kZXhJbkZpZWxkLCBtX3dzSW5zLCBuQ2FyZXQsIGJCZWZvcmUpOw0KLSAgICBGWFNZU19hc3NlcnQoblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMICYmIG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfSU5WQUxJREFURSk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCi0gICAgbV9wRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQotICAgIG1fcEVuZ2luZS0+UmVwbGFjZShtX25GaWVsZEJnbiwgbV9uT2xkRmllbGRMZW5ndGgsIHdzRGlzcGxheSk7DQotICAgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQgKyBtX3dzSW5zLkdldExlbmd0aCgpLCBUUlVFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0OjpTZXJpYWxpemUoDQorICAgIENGWF9CeXRlU3RyaW5nJiBic0RvUmVjb3JkKSBjb25zdCB7DQorICBDRlhfQXJjaGl2ZVNhdmVyIEFyY2hpdmVTYXZlcjsNCisgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUSU5TKTsNCisgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KG1fcEVuZ2luZSk7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9uQ2FyZXQ7DQorICBBcmNoaXZlU2F2ZXIgPDwgaW50MzJfdChtX3BGaWVsZCk7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9uSW5kZXhJbkZpZWxkOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkZpZWxkQmduOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbk9sZEZpZWxkTGVuZ3RoOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbk5ld0ZpZWxkTGVuZ3RoOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fd3NJbnM7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9iU2VsOw0KKyAgaW50MzJfdCBuTGVuZ3RoID0gQXJjaGl2ZVNhdmVyLkdldExlbmd0aCgpOw0KKyAgY29uc3QgdWludDhfdCogbHBTcmNCdWYgPSBBcmNoaXZlU2F2ZXIuR2V0QnVmZmVyKCk7DQorICBGWF9DSEFSKiBscERzdEJ1ZiA9IGJzRG9SZWNvcmQuR2V0QnVmZmVyKG5MZW5ndGgpOw0KKyAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1Ziwgbkxlbmd0aCk7DQorICBic0RvUmVjb3JkLlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7DQogfQ0KLXZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDo6U2VyaWFsaXplKENGWF9CeXRlU3RyaW5nICZic0RvUmVjb3JkKSBjb25zdA0KLXsNCi0gICAgQ0ZYX0FyY2hpdmVTYXZlciBBcmNoaXZlU2F2ZXI7DQotICAgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUSU5TKTsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IGludDMyX3QobV9wRW5naW5lKTsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IG1fbkNhcmV0Ow0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgaW50MzJfdChtX3BGaWVsZCk7DQotICAgIEFyY2hpdmVTYXZlciA8PCBtX25JbmRleEluRmllbGQ7DQotICAgIEFyY2hpdmVTYXZlciA8PCBtX25GaWVsZEJnbjsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IG1fbk9sZEZpZWxkTGVuZ3RoOw0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uTmV3RmllbGRMZW5ndGg7DQotICAgIEFyY2hpdmVTYXZlciA8PCBtX3dzSW5zOw0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgbV9iU2VsOw0KLSAgICBpbnQzMl90CW5MZW5ndGgJCT0gQXJjaGl2ZVNhdmVyLkdldExlbmd0aCgpOw0KLSAgICBjb25zdCB1aW50OF90KglscFNyY0J1Zgk9IEFyY2hpdmVTYXZlci5HZXRCdWZmZXIoKTsNCi0gICAgRlhfQ0hBUioJbHBEc3RCdWYJPSBic0RvUmVjb3JkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCi0gICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1Ziwgbkxlbmd0aCk7DQotICAgIGJzRG9SZWNvcmQuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OkRlc2VyaWFsaXplKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIHsNCisgIENGWF9BcmNoaXZlTG9hZGVyIEFyY2hpdmVMb2FkZXIoKGNvbnN0IHVpbnQ4X3QqKWJzRG9SZWNvcmQuR2V0Q1N0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0RvUmVjb3JkLkdldExlbmd0aCgpKTsNCisgIGludDMyX3QgblR5cGUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuVHlwZTsNCisgIEZYU1lTX2Fzc2VydChuVHlwZSA9PSBGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVElOUyk7DQorICBpbnQzMl90IG5FbmdpbmUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuRW5naW5lOw0KKyAgbV9wRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikodWludHB0cl90KW5FbmdpbmU7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbkNhcmV0Ow0KKyAgaW50MzJfdCBuRmllbGQgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuRmllbGQ7DQorICBtX3BGaWVsZCA9IChDRkRFX1R4dEVkdEZpZWxkKiluRmllbGQ7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbkluZGV4SW5GaWVsZDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uRmllbGRCZ247DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbk9sZEZpZWxkTGVuZ3RoOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX25OZXdGaWVsZExlbmd0aDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV93c0luczsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9iU2VsOw0KIH0NCi12b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OkRlc2VyaWFsaXplKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkNCi17DQotICAgIENGWF9BcmNoaXZlTG9hZGVyIEFyY2hpdmVMb2FkZXIoKGNvbnN0IHVpbnQ4X3QqKWJzRG9SZWNvcmQuR2V0Q1N0cigpLCBic0RvUmVjb3JkLkdldExlbmd0aCgpKTsNCi0gICAgaW50MzJfdCBuVHlwZSA9IDA7DQotICAgIEFyY2hpdmVMb2FkZXIgPj4gblR5cGU7DQotICAgIEZYU1lTX2Fzc2VydChuVHlwZSA9PSBGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVElOUyk7DQotICAgIGludDMyX3QgbkVuZ2luZSA9IDA7DQotICAgIEFyY2hpdmVMb2FkZXIgPj4gbkVuZ2luZTsNCi0gICAgbV9wRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikodWludHB0cl90KW5FbmdpbmU7DQotICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uQ2FyZXQ7DQotICAgIGludDMyX3QgbkZpZWxkID0gMDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBuRmllbGQ7DQotICAgIG1fcEZpZWxkID0gKENGREVfVHh0RWR0RmllbGQqKW5GaWVsZDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX25JbmRleEluRmllbGQ7DQotICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uRmllbGRCZ247DQotICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uT2xkRmllbGRMZW5ndGg7DQotICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9uTmV3RmllbGRMZW5ndGg7DQotICAgIEFyY2hpdmVMb2FkZXIgPj4gbV93c0luczsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX2JTZWw7DQorQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZSgNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKSB7DQorICBEZXNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCiB9DQotQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpDQotew0KLSAgICBEZXNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCitDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKA0KKyAgICBDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgaW50MzJfdCBuQ2FyZXQsDQorICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCwNCisgICAgaW50MzJfdCBuSW5kZXhJbkZpZWxkLA0KKyAgICBpbnQzMl90IG5GaWVsZEJnbiwNCisgICAgaW50MzJfdCBuT2xkTGVuZ3RoLA0KKyAgICBpbnQzMl90IG5OZXdMZW5ndGgsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RlbCwNCisgICAgRlhfQk9PTCBiU2VsKQ0KKyAgICA6IG1fcEVuZ2luZShwRW5naW5lKSwNCisgICAgICBtX25DYXJldChuQ2FyZXQpLA0KKyAgICAgIG1fcEZpZWxkKHBGaWVsZCksDQorICAgICAgbV9uSW5kZXhJbkZpZWxkKG5JbmRleEluRmllbGQpLA0KKyAgICAgIG1fbkZpZWxkQmduKG5GaWVsZEJnbiksDQorICAgICAgbV9uT2xkRmllbGRMZW5ndGgobk9sZExlbmd0aCksDQorICAgICAgbV9uTmV3RmllbGRMZW5ndGgobk5ld0xlbmd0aCksDQorICAgICAgbV93c0RlbCh3c0RlbCksDQorICAgICAgbV9iU2VsKGJTZWwpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BFbmdpbmUpOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZpZWxkKTsNCiB9DQotQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZShDRkRFX1R4dEVkdEVuZ2luZSAqIHBFbmdpbmUsDQotICAgICAgICBpbnQzMl90IG5DYXJldCwNCi0gICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQsDQotICAgICAgICBpbnQzMl90IG5JbmRleEluRmllbGQsDQotICAgICAgICBpbnQzMl90IG5GaWVsZEJnbiwNCi0gICAgICAgIGludDMyX3Qgbk9sZExlbmd0aCwNCi0gICAgICAgIGludDMyX3Qgbk5ld0xlbmd0aCwNCi0gICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0RlbCwNCi0gICAgICAgIEZYX0JPT0wgYlNlbCApDQotICAgIDogbV9wRW5naW5lKHBFbmdpbmUpDQotICAgICwgbV9uQ2FyZXQobkNhcmV0KQ0KLSAgICAsIG1fcEZpZWxkKHBGaWVsZCkNCi0gICAgLCBtX25JbmRleEluRmllbGQobkluZGV4SW5GaWVsZCkNCi0gICAgLCBtX25GaWVsZEJnbihuRmllbGRCZ24pDQotICAgICwgbV9uT2xkRmllbGRMZW5ndGgobk9sZExlbmd0aCkNCi0gICAgLCBtX25OZXdGaWVsZExlbmd0aChuTmV3TGVuZ3RoKQ0KLSAgICAsIG1fd3NEZWwod3NEZWwpDQotICAgICwgbV9iU2VsKGJTZWwpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wRW5naW5lKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEZpZWxkKTsNCitDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjp+Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZSgpIHt9DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQogfQ0KLUNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGU6On5DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKCkNCi17DQorRlhfQk9PTCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpVbmRvKCkgew0KKyAgaW50MzJfdCBuQ2FyZXQgPSAwOw0KKyAgRlhfQk9PTCBiQmVmb3JlID0gRkFMU0U7DQorICBpbnQzMl90IG5SZXQgPSBtX3BGaWVsZC0+SW5zZXJ0KG1fbkluZGV4SW5GaWVsZCwgbV93c0RlbCwgbkNhcmV0LCBiQmVmb3JlKTsNCisgIEZYU1lTX2Fzc2VydChuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0ZVTEwgJiYNCisgICAgICAgICAgICAgICBuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KKyAgbV9wRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICBtX3BFbmdpbmUtPlJlcGxhY2UobV9uRmllbGRCZ24sIG1fbk5ld0ZpZWxkTGVuZ3RoLCB3c0Rpc3BsYXkpOw0KKyAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCwgVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpSZWxlYXNlKCkNCi17DQotICAgIGRlbGV0ZSB0aGlzOw0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6UmVkbygpIHsNCisgIGludDMyX3QgbkNhcmV0ID0gMDsNCisgIEZYX0JPT0wgYkJlZm9yZSA9IDA7DQorICBDRlhfV2lkZVN0cmluZyB3c0RlbDsNCisgIGludDMyX3QgblJldCA9IG1fcEZpZWxkLT5EZWxldGUobV9uSW5kZXhJbkZpZWxkLCBtX3dzRGVsLkdldExlbmd0aCgpLCB3c0RlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNhcmV0LCBiQmVmb3JlKTsNCisgIEZYU1lTX2Fzc2VydChuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0lOVkFMSURBVEUgJiYNCisgICAgICAgICAgICAgICBuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0JPVU5EQVJZKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgIG1fcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgbV9wRW5naW5lLT5SZXBsYWNlKG1fbkZpZWxkQmduLCBtX25PbGRGaWVsZExlbmd0aCwgd3NEaXNwbGF5KTsNCisgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQgLSBtX3dzRGVsLkdldExlbmd0aCgpLCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MCUNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGU6OlVuZG8oKQ0KLXsNCi0gICAgaW50MzJfdAluQ2FyZXQJPSAwOw0KLSAgICBGWF9CT09MCQliQmVmb3JlCT0gRkFMU0U7DQotICAgIGludDMyX3QgIG5SZXQgPSBtX3BGaWVsZC0+SW5zZXJ0KG1fbkluZGV4SW5GaWVsZCwgbV93c0RlbCwgbkNhcmV0LCBiQmVmb3JlKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfRlVMTCAmJiBuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEUpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQotICAgIG1fcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KLSAgICBtX3BFbmdpbmUtPlJlcGxhY2UobV9uRmllbGRCZ24sIG1fbk5ld0ZpZWxkTGVuZ3RoLCB3c0Rpc3BsYXkpOw0KLSAgICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbkNhcmV0LCBUUlVFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpTZXJpYWxpemUoDQorICAgIENGWF9CeXRlU3RyaW5nJiBic0RvUmVjb3JkKSBjb25zdCB7DQorICBDRlhfQXJjaGl2ZVNhdmVyIEFyY2hpdmVTYXZlcjsNCisgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUREVMKTsNCisgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KG1fcEVuZ2luZSk7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9uQ2FyZXQ7DQorICBBcmNoaXZlU2F2ZXIgPDwgaW50MzJfdChtX3BGaWVsZCk7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9uSW5kZXhJbkZpZWxkOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkZpZWxkQmduOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbk9sZEZpZWxkTGVuZ3RoOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbk5ld0ZpZWxkTGVuZ3RoOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fd3NEZWw7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9iU2VsOw0KKyAgaW50MzJfdCBuTGVuZ3RoID0gQXJjaGl2ZVNhdmVyLkdldExlbmd0aCgpOw0KKyAgY29uc3QgdWludDhfdCogbHBTcmNCdWYgPSBBcmNoaXZlU2F2ZXIuR2V0QnVmZmVyKCk7DQorICBGWF9DSEFSKiBscERzdEJ1ZiA9IGJzRG9SZWNvcmQuR2V0QnVmZmVyKG5MZW5ndGgpOw0KKyAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1Ziwgbkxlbmd0aCk7DQorICBic0RvUmVjb3JkLlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7DQogfQ0KLUZYX0JPT0wJQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6UmVkbygpDQotew0KLSAgICBpbnQzMl90CW5DYXJldAk9IDA7DQotICAgIEZYX0JPT0wJCWJCZWZvcmUJPSAwOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0RlbDsNCi0gICAgaW50MzJfdCBuUmV0ID0gbV9wRmllbGQtPkRlbGV0ZShtX25JbmRleEluRmllbGQsIG1fd3NEZWwuR2V0TGVuZ3RoKCksIHdzRGVsLCBuQ2FyZXQsIGJCZWZvcmUpOw0KLSAgICBGWFNZU19hc3NlcnQoblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9JTlZBTElEQVRFICYmIG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfQk9VTkRBUlkpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQotICAgIG1fcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KLSAgICBtX3BFbmdpbmUtPlJlcGxhY2UobV9uRmllbGRCZ24sIG1fbk9sZEZpZWxkTGVuZ3RoLCB3c0Rpc3BsYXkpOw0KLSAgICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbkNhcmV0IC0gbV93c0RlbC5HZXRMZW5ndGgoKSwgVFJVRSk7DQotICAgIHJldHVybiBUUlVFOw0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6RGVzZXJpYWxpemUoDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgew0KKyAgQ0ZYX0FyY2hpdmVMb2FkZXIgQXJjaGl2ZUxvYWRlcigoY29uc3QgdWludDhfdCopYnNEb1JlY29yZC5HZXRDU3RyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzRG9SZWNvcmQuR2V0TGVuZ3RoKCkpOw0KKyAgaW50MzJfdCBuVHlwZSA9IDA7DQorICBBcmNoaXZlTG9hZGVyID4+IG5UeXBlOw0KKyAgRlhTWVNfYXNzZXJ0KG5UeXBlID09IEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUREVMKTsNCisgIGludDMyX3QgbkVuZ2luZSA9IDA7DQorICBBcmNoaXZlTG9hZGVyID4+IG5FbmdpbmU7DQorICBtX3BFbmdpbmUgPSAoQ0ZERV9UeHRFZHRFbmdpbmUqKSh1aW50cHRyX3QpbkVuZ2luZTsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uQ2FyZXQ7DQorICBpbnQzMl90IG5GaWVsZCA9IDA7DQorICBBcmNoaXZlTG9hZGVyID4+IG5GaWVsZDsNCisgIG1fcEZpZWxkID0gKENGREVfVHh0RWR0RmllbGQqKW5GaWVsZDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uSW5kZXhJbkZpZWxkOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX25GaWVsZEJnbjsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uT2xkRmllbGRMZW5ndGg7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbk5ld0ZpZWxkTGVuZ3RoOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX3dzRGVsOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX2JTZWw7DQogfQ0KLXZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6U2VyaWFsaXplKENGWF9CeXRlU3RyaW5nICZic0RvUmVjb3JkKSBjb25zdA0KLXsNCi0gICAgQ0ZYX0FyY2hpdmVTYXZlciBBcmNoaXZlU2F2ZXI7DQotICAgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUREVMKTsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IGludDMyX3QobV9wRW5naW5lKTsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IG1fbkNhcmV0Ow0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgaW50MzJfdChtX3BGaWVsZCk7DQotICAgIEFyY2hpdmVTYXZlciA8PCBtX25JbmRleEluRmllbGQ7DQotICAgIEFyY2hpdmVTYXZlciA8PCBtX25GaWVsZEJnbjsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IG1fbk9sZEZpZWxkTGVuZ3RoOw0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uTmV3RmllbGRMZW5ndGg7DQotICAgIEFyY2hpdmVTYXZlciA8PCBtX3dzRGVsOw0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgbV9iU2VsOw0KLSAgICBpbnQzMl90CW5MZW5ndGgJCT0gQXJjaGl2ZVNhdmVyLkdldExlbmd0aCgpOw0KLSAgICBjb25zdCB1aW50OF90KglscFNyY0J1Zgk9IEFyY2hpdmVTYXZlci5HZXRCdWZmZXIoKTsNCi0gICAgRlhfQ0hBUioJbHBEc3RCdWYJPSBic0RvUmVjb3JkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCi0gICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1Ziwgbkxlbmd0aCk7DQotICAgIGJzRG9SZWNvcmQuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCitDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZTo6Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgew0KKyAgRGVzZXJpYWxpemUoYnNEb1JlY29yZCk7DQogfQ0KLXZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6RGVzZXJpYWxpemUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKQ0KLXsNCi0gICAgQ0ZYX0FyY2hpdmVMb2FkZXIgQXJjaGl2ZUxvYWRlcigoY29uc3QgdWludDhfdCopYnNEb1JlY29yZC5HZXRDU3RyKCksIGJzRG9SZWNvcmQuR2V0TGVuZ3RoKCkpOw0KLSAgICBpbnQzMl90IG5UeXBlID0gMDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBuVHlwZTsNCi0gICAgRlhTWVNfYXNzZXJ0KG5UeXBlID09IEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUREVMKTsNCi0gICAgaW50MzJfdCBuRW5naW5lID0gMDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBuRW5naW5lOw0KLSAgICBtX3BFbmdpbmUgPSAoQ0ZERV9UeHRFZHRFbmdpbmUqKSh1aW50cHRyX3QpbkVuZ2luZTsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX25DYXJldDsNCi0gICAgaW50MzJfdCBuRmllbGQgPSAwOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG5GaWVsZDsNCi0gICAgbV9wRmllbGQgPSAoQ0ZERV9UeHRFZHRGaWVsZCopbkZpZWxkOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG1fbkluZGV4SW5GaWVsZDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX25GaWVsZEJnbjsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX25PbGRGaWVsZExlbmd0aDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX25OZXdGaWVsZExlbmd0aDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX3dzRGVsOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG1fYlNlbDsNCitDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZTo6Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoDQorICAgIENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLA0KKyAgICBpbnQzMl90IG5DYXJldCwNCisgICAgaW50MzJfdCBuTmV3Q2FyZXQsDQorICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCwNCisgICAgaW50MzJfdCBuSW5kZXhJbkZpZWxkLA0KKyAgICBpbnQzMl90IG5GaWVsZEJnbiwNCisgICAgaW50MzJfdCBuRmllbGROZXdMZW5ndGgsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RlbCwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSW5zLA0KKyAgICBGWF9CT09MIGJTZWwpDQorICAgIDogbV9wRW5naW5lKHBFbmdpbmUpLA0KKyAgICAgIG1fbkNhcmV0KG5DYXJldCksDQorICAgICAgbV9uTmV3Q2FyZXQobk5ld0NhcmV0KSwNCisgICAgICBtX3BGaWVsZChwRmllbGQpLA0KKyAgICAgIG1fbkluZGV4SW5GaWVsZChuSW5kZXhJbkZpZWxkKSwNCisgICAgICBtX25GaWVsZEJnbihuRmllbGRCZ24pLA0KKyAgICAgIG1fbkZpZWxkTmV3TGVuZ3RoKG5GaWVsZE5ld0xlbmd0aCksDQorICAgICAgbV93c0RlbCh3c0RlbCksDQorICAgICAgbV93c0lucyh3c0lucyksDQorICAgICAgbV9iU2VsKGJTZWwpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BFbmdpbmUpOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZpZWxkKTsNCiB9DQotQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6OkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkNCi17DQotICAgIERlc2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KK0NGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjp+Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoKSB7fQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCiB9DQotQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6OkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlKAlDRkRFX1R4dEVkdEVuZ2luZSAqIHBFbmdpbmUsDQotICAgICAgICBpbnQzMl90IG5DYXJldCwNCi0gICAgICAgIGludDMyX3Qgbk5ld0NhcmV0LA0KLSAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCAqIHBGaWVsZCwNCi0gICAgICAgIGludDMyX3QJbkluZGV4SW5GaWVsZCwNCi0gICAgICAgIGludDMyX3QJbkZpZWxkQmduLA0KLSAgICAgICAgaW50MzJfdAluRmllbGROZXdMZW5ndGgsDQotICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NEZWwsDQotICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NJbnMsDQotICAgICAgICBGWF9CT09MCWJTZWwpDQotICAgIDogbV9wRW5naW5lKHBFbmdpbmUpDQotICAgICwgbV9uQ2FyZXQobkNhcmV0KQ0KLSAgICAsIG1fbk5ld0NhcmV0KG5OZXdDYXJldCkNCi0gICAgLCBtX3BGaWVsZChwRmllbGQpDQotICAgICwgbV9uSW5kZXhJbkZpZWxkKG5JbmRleEluRmllbGQpDQotICAgICwgbV9uRmllbGRCZ24obkZpZWxkQmduKQ0KLSAgICAsIG1fbkZpZWxkTmV3TGVuZ3RoKG5GaWVsZE5ld0xlbmd0aCkNCi0gICAgLCBtX3dzRGVsKHdzRGVsKQ0KLSAgICAsIG1fd3NJbnMod3NJbnMpDQotICAgICwgbV9iU2VsKGJTZWwpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wRW5naW5lKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEZpZWxkKTsNCitGWF9CT09MIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjpVbmRvKCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEZWw7DQorICBpbnQzMl90IG5DYXJldCA9IDA7DQorICBGWF9CT09MIGJCZWZvcmUgPSBGQUxTRTsNCisgIGludDMyX3QgblJldCA9IG1fcEZpZWxkLT5SZXBsYWNlKG1fbkluZGV4SW5GaWVsZCwgbV93c0lucy5HZXRMZW5ndGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fd3NEZWwsIHdzRGVsLCBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgRlhTWVNfYXNzZXJ0KG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfSU5WQUxJREFURSAmJg0KKyAgICAgICAgICAgICAgIG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfQk9VTkRBUlkpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KKyAgbV9wRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICBtX3BFbmdpbmUtPlJlcGxhY2UobV9uRmllbGRCZ24sIG1fbkZpZWxkTmV3TGVuZ3RoLCB3c0Rpc3BsYXkpOw0KKyAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCwgVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6On5DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZSgpDQotew0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6OlJlZG8oKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0RlbDsNCisgIGludDMyX3QgbkNhcmV0ID0gMDsNCisgIEZYX0JPT0wgYkJlZm9yZSA9IEZBTFNFOw0KKyAgaW50MzJfdCBuUmV0ID0gbV9wRmllbGQtPlJlcGxhY2UobV9uSW5kZXhJbkZpZWxkLCBtX3dzRGVsLkdldExlbmd0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93c0lucywgd3NEZWwsIG5DYXJldCwgYkJlZm9yZSk7DQorICBGWFNZU19hc3NlcnQoblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9JTlZBTElEQVRFICYmDQorICAgICAgICAgICAgICAgblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWSk7DQorICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICBtX3BGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCisgIG1fcEVuZ2luZS0+UmVwbGFjZShtX25GaWVsZEJnbiwgbV9uRmllbGROZXdMZW5ndGgsIHdzRGlzcGxheSk7DQorICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbk5ld0NhcmV0LCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi12b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjpSZWxlYXNlKCkNCi17DQotICAgIGRlbGV0ZSB0aGlzOw0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6OlNlcmlhbGl6ZSgNCisgICAgQ0ZYX0J5dGVTdHJpbmcmIGJzRG9SZWNvcmQpIGNvbnN0IHsNCisgIENGWF9BcmNoaXZlU2F2ZXIgQXJjaGl2ZVNhdmVyOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IGludDMyX3QoRkRFX1RYVEVEVF9ET1JFQ09SRF9GT1JNQVRSRVApOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IGludDMyX3QobV9wRW5naW5lKTsNCisgIEFyY2hpdmVTYXZlciA8PCBtX25DYXJldDsNCisgIEFyY2hpdmVTYXZlciA8PCBtX25OZXdDYXJldDsNCisgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KG1fcEZpZWxkKTsNCisgIEFyY2hpdmVTYXZlciA8PCBtX25JbmRleEluRmllbGQ7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9uRmllbGRCZ247DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9uRmllbGROZXdMZW5ndGg7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV93c0RlbDsNCisgIEFyY2hpdmVTYXZlciA8PCBtX3dzSW5zOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fYlNlbDsNCisgIGludDMyX3Qgbkxlbmd0aCA9IEFyY2hpdmVTYXZlci5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IHVpbnQ4X3QqIGxwU3JjQnVmID0gQXJjaGl2ZVNhdmVyLkdldEJ1ZmZlcigpOw0KKyAgRlhfQ0hBUiogbHBEc3RCdWYgPSBic0RvUmVjb3JkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgIEZYU1lTX21lbWNweShscERzdEJ1ZiwgbHBTcmNCdWYsIG5MZW5ndGgpOw0KKyAgYnNEb1JlY29yZC5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KIH0NCi1GWF9CT09MCUNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjpVbmRvKCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRGVsOw0KLSAgICBpbnQzMl90CW5DYXJldAk9IDA7DQotICAgIEZYX0JPT0wJCWJCZWZvcmUJPSBGQUxTRTsNCi0gICAgaW50MzJfdAluUmV0CT0gbV9wRmllbGQtPlJlcGxhY2UobV9uSW5kZXhJbkZpZWxkLCBtX3dzSW5zLkdldExlbmd0aCgpLCBtX3dzRGVsLCB3c0RlbCwgbkNhcmV0LCBiQmVmb3JlKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfSU5WQUxJREFURSAmJiBuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0JPVU5EQVJZKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KLSAgICBtX3BGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCi0gICAgbV9wRW5naW5lLT5SZXBsYWNlKG1fbkZpZWxkQmduLCBtX25GaWVsZE5ld0xlbmd0aCwgd3NEaXNwbGF5KTsNCi0gICAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCwgVFJVRSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjpSZWRvKCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRGVsOw0KLSAgICBpbnQzMl90CW5DYXJldAk9IDA7DQotICAgIEZYX0JPT0wJCWJCZWZvcmUJPSBGQUxTRTsNCi0gICAgaW50MzJfdAluUmV0CT0gbV9wRmllbGQtPlJlcGxhY2UobV9uSW5kZXhJbkZpZWxkLCBtX3dzRGVsLkdldExlbmd0aCgpLCBtX3dzSW5zLCB3c0RlbCwgbkNhcmV0LCBiQmVmb3JlKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfSU5WQUxJREFURSAmJiBuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0JPVU5EQVJZKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KLSAgICBtX3BGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCi0gICAgbV9wRW5naW5lLT5SZXBsYWNlKG1fbkZpZWxkQmduLCBtX25GaWVsZE5ld0xlbmd0aCwgd3NEaXNwbGF5KTsNCi0gICAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25OZXdDYXJldCwgVFJVRSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjpTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcgJmJzRG9SZWNvcmQpIGNvbnN0DQotew0KLSAgICBDRlhfQXJjaGl2ZVNhdmVyIEFyY2hpdmVTYXZlcjsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IGludDMyX3QoRkRFX1RYVEVEVF9ET1JFQ09SRF9GT1JNQVRSRVApOw0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgaW50MzJfdChtX3BFbmdpbmUpOw0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uQ2FyZXQ7DQotICAgIEFyY2hpdmVTYXZlciA8PCBtX25OZXdDYXJldDsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IGludDMyX3QobV9wRmllbGQpOw0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uSW5kZXhJbkZpZWxkOw0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgbV9uRmllbGRCZ247DQotICAgIEFyY2hpdmVTYXZlciA8PCBtX25GaWVsZE5ld0xlbmd0aDsNCi0gICAgQXJjaGl2ZVNhdmVyIDw8IG1fd3NEZWw7DQotICAgIEFyY2hpdmVTYXZlciA8PCBtX3dzSW5zOw0KLSAgICBBcmNoaXZlU2F2ZXIgPDwgbV9iU2VsOw0KLSAgICBpbnQzMl90CW5MZW5ndGgJCT0gQXJjaGl2ZVNhdmVyLkdldExlbmd0aCgpOw0KLSAgICBjb25zdCB1aW50OF90KglscFNyY0J1Zgk9IEFyY2hpdmVTYXZlci5HZXRCdWZmZXIoKTsNCi0gICAgRlhfQ0hBUioJbHBEc3RCdWYJPSBic0RvUmVjb3JkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCi0gICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1Ziwgbkxlbmd0aCk7DQotICAgIGJzRG9SZWNvcmQuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCi19DQotdm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZTo6RGVzZXJpYWxpemUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKQ0KLXsNCi0gICAgQ0ZYX0FyY2hpdmVMb2FkZXIgQXJjaGl2ZUxvYWRlcigoY29uc3QgdWludDhfdCopYnNEb1JlY29yZC5HZXRDU3RyKCksIGJzRG9SZWNvcmQuR2V0TGVuZ3RoKCkpOw0KLSAgICBpbnQzMl90IG5UeXBlID0gMDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBuVHlwZTsNCi0gICAgRlhTWVNfYXNzZXJ0KG5UeXBlID09IEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUUkVQKTsNCi0gICAgaW50MzJfdCBuRW5naW5lID0gMDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBuRW5naW5lOw0KLSAgICBtX3BFbmdpbmUgPSAoQ0ZERV9UeHRFZHRFbmdpbmUqKSh1aW50cHRyX3QpbkVuZ2luZTsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX25DYXJldDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX25OZXdDYXJldDsNCi0gICAgaW50MzJfdCBuRmllbGQgPSAwOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG5GaWVsZDsNCi0gICAgbV9wRmllbGQgPSAoQ0ZERV9UeHRFZHRGaWVsZCopbkZpZWxkOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG1fbkluZGV4SW5GaWVsZDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX25GaWVsZEJnbjsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX25GaWVsZE5ld0xlbmd0aDsNCi0gICAgQXJjaGl2ZUxvYWRlciA+PiBtX3dzRGVsOw0KLSAgICBBcmNoaXZlTG9hZGVyID4+IG1fd3NJbnM7DQotICAgIEFyY2hpdmVMb2FkZXIgPj4gbV9iU2VsOw0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6OkRlc2VyaWFsaXplKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIHsNCisgIENGWF9BcmNoaXZlTG9hZGVyIEFyY2hpdmVMb2FkZXIoKGNvbnN0IHVpbnQ4X3QqKWJzRG9SZWNvcmQuR2V0Q1N0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0RvUmVjb3JkLkdldExlbmd0aCgpKTsNCisgIGludDMyX3QgblR5cGUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuVHlwZTsNCisgIEZYU1lTX2Fzc2VydChuVHlwZSA9PSBGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVFJFUCk7DQorICBpbnQzMl90IG5FbmdpbmUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuRW5naW5lOw0KKyAgbV9wRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikodWludHB0cl90KW5FbmdpbmU7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbkNhcmV0Ow0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX25OZXdDYXJldDsNCisgIGludDMyX3QgbkZpZWxkID0gMDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbkZpZWxkOw0KKyAgbV9wRmllbGQgPSAoQ0ZERV9UeHRFZHRGaWVsZCopbkZpZWxkOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX25JbmRleEluRmllbGQ7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbkZpZWxkQmduOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX25GaWVsZE5ld0xlbmd0aDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV93c0RlbDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV93c0luczsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9iU2VsOw0KIH0NCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRlbmdpbmUuaCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGVuZ2luZS5oCmluZGV4IGYwMzlmMWEuLmVlZjUxMjkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGVuZ2luZS5oCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGVuZ2luZS5oCkBAIC0yNiwzMTcgKzI2LDM0OCBAQAogY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTsNCiBjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZTsNCiAjZW5kaWYNCi1jbGFzcyBJRkRFX1R4dEVkdERvUmVjb3JkDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGREVfVHh0RWR0RG9SZWNvcmQgKiBDcmVhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCi0gICAgdmlydHVhbCB+SUZERV9UeHRFZHREb1JlY29yZCgpIHt9DQotICAgIHZpcnR1YWwgdm9pZAlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MIFVuZG8oKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAlTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcgJmJzRG9SZWNvcmQpIGNvbnN0ID0gMDsNCitjbGFzcyBJRkRFX1R4dEVkdERvUmVjb3JkIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfVHh0RWR0RG9SZWNvcmQqIENyZWF0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpOw0KKyAgdmlydHVhbCB+SUZERV9UeHRFZHREb1JlY29yZCgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZWRvKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFVuZG8oKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2VyaWFsaXplKENGWF9CeXRlU3RyaW5nJiBic0RvUmVjb3JkKSBjb25zdCA9IDA7DQogfTsNCi1jbGFzcyBDRkRFX1R4dEVkdEVuZ2luZSA6IHB1YmxpYyBJRkRFX1R4dEVkdEVuZ2luZQ0KLXsNCi0gICAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0Ow0KLSAgICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTsNCi0gICAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0UGFnZTsNCitjbGFzcyBDRkRFX1R4dEVkdEVuZ2luZSA6IHB1YmxpYyBJRkRFX1R4dEVkdEVuZ2luZSB7DQorICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ7DQorICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTsNCisgIGZyaWVuZCBjbGFzcyBDRkRFX1R4dEVkdFBhZ2U7DQogI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KLSAgICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9Gb3JtYXRJbnNlcnQ7DQotICAgIGZyaWVuZCBjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0Zvcm1hdERlbGV0ZTsNCi0gICAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRm9ybWF0UmVwbGFjZTsNCi0gICAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0QmxvY2s7DQorICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9Gb3JtYXRJbnNlcnQ7DQorICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9Gb3JtYXREZWxldGU7DQorICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9Gb3JtYXRSZXBsYWNlOw0KKyAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0QmxvY2s7DQogI2VuZGlmDQotICAgIHN0cnVjdCBfRkRFX1RYVEVEVFNFTFJBTkdFIHsNCi0gICAgICAgIGludDMyX3QgblN0YXJ0Ow0KLSAgICAgICAgaW50MzJfdCBuQ291bnQ7DQotICAgIH07DQotICAgIHR5cGVkZWYgX0ZERV9UWFRFRFRTRUxSQU5HRQkJRkRFX1RYVEVEVFNFTFJBTkdFOw0KLSAgICB0eXBlZGVmIF9GREVfVFhURURUU0VMUkFOR0UgKglGREVfTFBUWFRFRFRTRUxSQU5HRTsNCi0gICAgc3RydWN0IF9GREVfVFhURURUUEFSQUdQT1Mgew0KLSAgICAgICAgaW50MzJfdAluUGFyYWdJbmRleDsNCi0gICAgICAgIGludDMyX3QJbkNoYXJJbmRleDsNCi0gICAgfTsNCi0gICAgdHlwZWRlZiBfRkRFX1RYVEVEVFBBUkFHUE9TCQlGREVfVFhURURUUEFSQUdQT1M7DQotICAgIHR5cGVkZWYgX0ZERV9UWFRFRFRQQVJBR1BPUyAqCUZERV9MUFRYVEVEVFBBUkFHUE9TOw0KLXB1YmxpYzoNCi0gICAgQ0ZERV9UeHRFZHRFbmdpbmUoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJUmVsZWFzZSgpOw0KKyAgc3RydWN0IF9GREVfVFhURURUU0VMUkFOR0Ugew0KKyAgICBpbnQzMl90IG5TdGFydDsNCisgICAgaW50MzJfdCBuQ291bnQ7DQorICB9Ow0KKyAgdHlwZWRlZiBfRkRFX1RYVEVEVFNFTFJBTkdFIEZERV9UWFRFRFRTRUxSQU5HRTsNCisgIHR5cGVkZWYgX0ZERV9UWFRFRFRTRUxSQU5HRSogRkRFX0xQVFhURURUU0VMUkFOR0U7DQorICBzdHJ1Y3QgX0ZERV9UWFRFRFRQQVJBR1BPUyB7DQorICAgIGludDMyX3QgblBhcmFnSW5kZXg7DQorICAgIGludDMyX3QgbkNoYXJJbmRleDsNCisgIH07DQorICB0eXBlZGVmIF9GREVfVFhURURUUEFSQUdQT1MgRkRFX1RYVEVEVFBBUkFHUE9TOw0KKyAgdHlwZWRlZiBfRkRFX1RYVEVEVFBBUkFHUE9TKiBGREVfTFBUWFRFRFRQQVJBR1BPUzsNCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJU2V0RWRpdFBhcmFtcyhjb25zdCBGREVfVFhURURUUEFSQU1TICZwYXJhbXMpOw0KLSAgICB2aXJ0dWFsIGNvbnN0IEZERV9UWFRFRFRQQVJBTVMqCQlHZXRFZGl0UGFyYW1zKCkgY29uc3Q7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0RW5naW5lKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KIA0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJCUNvdW50UGFnZXMoKSBjb25zdDsNCi0gICAgdmlydHVhbCBJRkRFX1R4dEVkdFBhZ2UqCQkJR2V0UGFnZShpbnQzMl90IG5JbmRleCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0RWRpdFBhcmFtcyhjb25zdCBGREVfVFhURURUUEFSQU1TJiBwYXJhbXMpOw0KKyAgdmlydHVhbCBjb25zdCBGREVfVFhURURUUEFSQU1TKiBHZXRFZGl0UGFyYW1zKCkgY29uc3Q7DQogDQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0QnVmQ2h1bmtTaXplKGludDMyX3QgbkNodW5rU2l6ZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJU2V0VGV4dEJ5U3RyZWFtKElGWF9TdHJlYW0gKnBTdHJlYW0pOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJR2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQotICAgIHZpcnR1YWwgdm9pZAkJQ2xlYXJUZXh0KCk7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRQYWdlcygpIGNvbnN0Ow0KKyAgdmlydHVhbCBJRkRFX1R4dEVkdFBhZ2UqIEdldFBhZ2UoaW50MzJfdCBuSW5kZXgpOw0KIA0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0Q2FyZXRSZWN0KENGWF9SZWN0RiAmcnRDYXJldCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRDYXJldFBvcygpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJU2V0Q2FyZXRQb3MoaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlNb3ZlQ2FyZXRQb3MoRkRFX1RYVEVEVE1PVkVDQVJFVCBlTW92ZUNhcmV0LCBGWF9CT09MIGJTaGlmdCA9IEZBTFNFLCBGWF9CT09MIGJDdHJsID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIHZvaWQJTG9jaygpOw0KLSAgICB2aXJ0dWFsIHZvaWQJVW5sb2NrKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlJc0xvY2tlZCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIFNldEJ1ZkNodW5rU2l6ZShpbnQzMl90IG5DaHVua1NpemUpOw0KKyAgdmlydHVhbCB2b2lkIFNldFRleHRCeVN0cmVhbShJRlhfU3RyZWFtKiBwU3RyZWFtKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFRleHRMZW5ndGgoKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50ID0gLTEpOw0KKyAgdmlydHVhbCB2b2lkIENsZWFyVGV4dCgpOw0KIA0KLSAgICB2aXJ0dWFsIGludDMyX3QJSW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGgpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJRGVsZXRlKGludDMyX3QgblN0YXJ0LCBGWF9CT09MIGJCYWNrc3BhY2UgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlEZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlSZXBsYWNlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5MZW5ndGgsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1JlcGxhY2UpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENhcmV0UmVjdChDRlhfUmVjdEYmIHJ0Q2FyZXQpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldENhcmV0UG9zKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgU2V0Q2FyZXRQb3MoaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSk7DQorICB2aXJ0dWFsIGludDMyX3QgTW92ZUNhcmV0UG9zKEZERV9UWFRFRFRNT1ZFQ0FSRVQgZU1vdmVDYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3RybCA9IEZBTFNFKTsNCisgIHZpcnR1YWwgdm9pZCBMb2NrKCk7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2NrKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNMb2NrZWQoKSBjb25zdDsNCiANCi0gICAgdmlydHVhbAl2b2lkCQlTZXRMaW1pdChpbnQzMl90IG5MaW1pdCk7DQotICAgIHZpcnR1YWwJdm9pZAkJU2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdjQWxpYXMpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldEZvcm1hdEJsb2NrKGludDMyX3QgbkluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NCbG9ja0Zvcm1hdCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlDb3VudEVkaXRCbG9ja3MoKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCQlHZXRFZGl0QmxvY2tUZXh0KGludDMyX3QgbkluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NCbG9ja1RleHQpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJQ291bnRFZGl0RmllbGRzKGludDMyX3QgbkJsb2NrSW5kZXgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJCUdldEVkaXRGaWVsZFRleHQoaW50MzJfdCBuQmxvY2tJbmRleCwgaW50MzJfdCBuRmllbGRJbmRleCwgQ0ZYX1dpZGVTdHJpbmcgJndzRmllbGRUZXh0KSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCQlTdGFydEVkaXQoKTsNCi0gICAgdmlydHVhbCB2b2lkCQlFbmRFZGl0KCk7DQorICB2aXJ0dWFsIGludDMyX3QgSW5zZXJ0KGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpOw0KKyAgdmlydHVhbCBpbnQzMl90IERlbGV0ZShpbnQzMl90IG5TdGFydCwgRlhfQk9PTCBiQmFja3NwYWNlID0gRkFMU0UpOw0KKyAgdmlydHVhbCBpbnQzMl90IERlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCisgIHZpcnR1YWwgaW50MzJfdCBSZXBsYWNlKGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVwbGFjZSk7DQogDQotICAgIHZvaWQJCQkJUmVtb3ZlU2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbWl0KGludDMyX3QgbkxpbWl0KTsNCisgIHZpcnR1YWwgdm9pZCBTZXRBbGlhc0NoYXIoRlhfV0NIQVIgd2NBbGlhcyk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9ybWF0QmxvY2soaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQmxvY2tGb3JtYXQpOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50RWRpdEJsb2NrcygpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldEVkaXRCbG9ja1RleHQoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NCbG9ja1RleHQpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50RWRpdEZpZWxkcyhpbnQzMl90IG5CbG9ja0luZGV4KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRFZGl0RmllbGRUZXh0KGludDMyX3QgbkJsb2NrSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5GaWVsZEluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGRUZXh0KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBTdGFydEVkaXQoKTsNCisgIHZpcnR1YWwgdm9pZCBFbmRFZGl0KCk7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJQWRkU2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJQ291bnRTZWxSYW5nZXMoKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUNsZWFyU2VsZWN0aW9uKCk7DQorICB2b2lkIFJlbW92ZVNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQlSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWRvKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNVbmRvKTsNCisgIHZpcnR1YWwgdm9pZCBBZGRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRTZWxSYW5nZXMoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KTsNCisgIHZpcnR1YWwgdm9pZCBDbGVhclNlbGVjdGlvbigpOw0KIA0KLSAgICB2aXJ0dWFsIGludDMyX3QJU3RhcnRMYXlvdXQoKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CURvTGF5b3V0KElGWF9QYXVzZSAqcFBhdXNlKTsNCi0gICAgdmlydHVhbCB2b2lkCQlFbmRMYXlvdXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWRvKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNVbmRvKTsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQlPcHRpbWl6ZShJRlhfUGF1c2UgKiBwUGF1c2UgPSBOVUxMKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJQ291bnRQYXJhZ3MoKSBjb25zdDsNCi0gICAgdmlydHVhbCBJRkRFX1R4dEVkdFBhcmFnKglHZXRQYXJhZyhpbnQzMl90IG5QYXJhZ0luZGV4KSBjb25zdDsNCi0gICAgdmlydHVhbCBJRlhfQ2hhckl0ZXIqCQlDcmVhdGVDaGFySXRlcigpOw0KLSAgICBJRkRFX1R4dEVkdEJ1ZioJR2V0VGV4dEJ1ZigpIGNvbnN0Ow0KLSAgICBpbnQzMl90CQlHZXRUZXh0QnVmTGVuZ3RoKCkgY29uc3Q7DQotICAgIElGWF9UeHRCcmVhayoJR2V0VGV4dEJyZWFrKCkgY29uc3Q7DQotICAgIGludDMyX3QJR2V0TGluZUNvdW50KCkgY29uc3Q7DQotICAgIGludDMyX3QJR2V0UGFnZUxpbmVDb3VudCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IFN0YXJ0TGF5b3V0KCk7DQorICB2aXJ0dWFsIGludDMyX3QgRG9MYXlvdXQoSUZYX1BhdXNlKiBwUGF1c2UpOw0KKyAgdmlydHVhbCB2b2lkIEVuZExheW91dCgpOw0KIA0KLSAgICBpbnQzMl90CQkJTGluZTJQYXJhZyhpbnQzMl90IG5TdGFydFBhcmFnLCBpbnQzMl90IG5TdGFydExpbmVvZlBhcmFnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGluZUluZGV4LCBpbnQzMl90ICZuU3RhcnRMaW5lKSBjb25zdDsNCi0gICAgRlhfV0NIQVIJCQlHZXRBbGlhc0NoYXIoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV93Y0FsaWFzQ2hhcjsNCi0gICAgfQ0KKyAgdmlydHVhbCBGWF9CT09MIE9wdGltaXplKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRQYXJhZ3MoKSBjb25zdDsNCisgIHZpcnR1YWwgSUZERV9UeHRFZHRQYXJhZyogR2V0UGFyYWcoaW50MzJfdCBuUGFyYWdJbmRleCkgY29uc3Q7DQorICB2aXJ0dWFsIElGWF9DaGFySXRlciogQ3JlYXRlQ2hhckl0ZXIoKTsNCisgIElGREVfVHh0RWR0QnVmKiBHZXRUZXh0QnVmKCkgY29uc3Q7DQorICBpbnQzMl90IEdldFRleHRCdWZMZW5ndGgoKSBjb25zdDsNCisgIElGWF9UeHRCcmVhayogR2V0VGV4dEJyZWFrKCkgY29uc3Q7DQorICBpbnQzMl90IEdldExpbmVDb3VudCgpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXRQYWdlTGluZUNvdW50KCkgY29uc3Q7DQogDQotcHJvdGVjdGVkOg0KLSAgICB2aXJ0dWFsIH5DRkRFX1R4dEVkdEVuZ2luZSgpOw0KLXByaXZhdGU6DQotICAgIHZvaWQJSW5uZXJfSW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGgpOw0KKyAgaW50MzJfdCBMaW5lMlBhcmFnKGludDMyX3QgblN0YXJ0UGFyYWcsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnRMaW5lb2ZQYXJhZywNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MaW5lSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblN0YXJ0TGluZSkgY29uc3Q7DQorICBGWF9XQ0hBUiBHZXRBbGlhc0NoYXIoKSBjb25zdCB7IHJldHVybiBtX3djQWxpYXNDaGFyOyB9DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgfkNGREVfVHh0RWR0RW5naW5lKCk7DQorDQorIHByaXZhdGU6DQorICB2b2lkIElubmVyX0luc2VydChpbnQzMl90IG5TdGFydCwgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwgaW50MzJfdCBuTGVuZ3RoKTsNCiAjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotICAgIHZvaWQJUmF3SW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGgpOw0KKyAgdm9pZCBSYXdJbnNlcnQoaW50MzJfdCBuU3RhcnQsIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsIGludDMyX3Qgbkxlbmd0aCk7DQogI2VuZGlmDQotICAgIHZvaWQJR2V0UHJlRGVsZXRlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBpbnQzMl90IG5JbmRleCwgaW50MzJfdCBuTGVuZ3RoKTsNCi0gICAgdm9pZAlHZXRQcmVJbnNlcnRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgbkluZGV4LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGgpOw0KLSAgICB2b2lkCUdldFByZVJlcGxhY2VUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgbkluZGV4LCBpbnQzMl90IG5PcmlnaW5MZW5ndGgsIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsIGludDMyX3Qgbkxlbmd0aCk7DQorICB2b2lkIEdldFByZURlbGV0ZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpOw0KKyAgdm9pZCBHZXRQcmVJbnNlcnRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpOw0KKyAgdm9pZCBHZXRQcmVSZXBsYWNlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuT3JpZ2luTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpOw0KIA0KLSAgICB2b2lkCUlubmVyX0RlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCi0gICAgdm9pZAlEZWxldGVSYW5nZV9Eb1JlY29yZChpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQsIEZYX0JPT0wgYlNlbCA9IEZBTFNFKTsNCi0gICAgdm9pZAlSZXNldEVuZ2luZSgpOw0KLSAgICB2b2lkCVJlYnVpbGRQYXJhZ3JhcGhzKCk7DQotICAgIHZvaWQJUmVtb3ZlQWxsUGFyYWdzKCk7DQotICAgIHZvaWQJUmVtb3ZlQWxsUGFnZXMoKTsNCi0gICAgdm9pZAlVcGRhdGVQYXJhZ3MoKTsNCi0gICAgdm9pZAlVcGRhdGVQYWdlcygpOw0KLSAgICB2b2lkCVVwZGF0ZVR4dEJyZWFrKCk7DQorICB2b2lkIElubmVyX0RlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCisgIHZvaWQgRGVsZXRlUmFuZ2VfRG9SZWNvcmQoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWwgPSBGQUxTRSk7DQorICB2b2lkIFJlc2V0RW5naW5lKCk7DQorICB2b2lkIFJlYnVpbGRQYXJhZ3JhcGhzKCk7DQorICB2b2lkIFJlbW92ZUFsbFBhcmFncygpOw0KKyAgdm9pZCBSZW1vdmVBbGxQYWdlcygpOw0KKyAgdm9pZCBVcGRhdGVQYXJhZ3MoKTsNCisgIHZvaWQgVXBkYXRlUGFnZXMoKTsNCisgIHZvaWQgVXBkYXRlVHh0QnJlYWsoKTsNCiANCi0gICAgRlhfQk9PTAlSZXBsYWNlUGFyYWdFbmQoRlhfV0NIQVIqICZscFRleHQsIGludDMyX3QgJm5MZW5ndGgsIEZYX0JPT0wgYlByZUlzQ1IgPSBGQUxTRSk7DQotICAgIHZvaWQJUmVjb3ZlclBhcmFnRW5kKENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICBpbnQzMl90CU1vdmVQYWdlMkNoYXIoaW50MzJfdCBuSW5kZXgpOw0KLSAgICB2b2lkCQlUZXh0UG9zMlBhcmFnUG9zKGludDMyX3QgbkluZGV4LCBGREVfVFhURURUUEFSQUdQT1MgJlBhcmFnUG9zKSBjb25zdDsNCi0gICAgaW50MzJfdAlNb3ZlRm9yd2FyZChGWF9CT09MICZiQmVmb3JlKTsNCi0gICAgaW50MzJfdAlNb3ZlQmFja3dhcmQoRlhfQk9PTCAmYkJlZm9yZSk7DQotICAgIEZYX0JPT0wJCU1vdmVVcChDRlhfUG9pbnRGICZwdENhcmV0KTsNCi0gICAgRlhfQk9PTAkJTW92ZURvd24oQ0ZYX1BvaW50RiAmcHRDYXJldCk7DQotICAgIEZYX0JPT0wJCU1vdmVMaW5lU3RhcnQoKTsNCi0gICAgRlhfQk9PTAkJTW92ZUxpbmVFbmQoKTsNCi0gICAgRlhfQk9PTAkJTW92ZVBhcmFnU3RhcnQoKTsNCi0gICAgRlhfQk9PTAkJTW92ZVBhcmFnRW5kKCk7DQotICAgIEZYX0JPT0wJCU1vdmVIb21lKCk7DQotICAgIEZYX0JPT0wJCU1vdmVFbmQoKTsNCi0gICAgRlhfQk9PTAkJSXNGaXRBcmVhKENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICB2b2lkCVVwZGF0ZUNhcmV0UmVjdChpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlID0gVFJVRSk7DQotICAgIHZvaWQJR2V0Q2FyZXRSZWN0KENGWF9SZWN0RiAmcnRDYXJldCwgaW50MzJfdCBuUGFnZUluZGV4LCBpbnQzMl90IG5DYXJldCwgRlhfQk9PTCBiQmVmb3JlID0gVFJVRSk7DQotICAgIHZvaWQJVXBkYXRlQ2FyZXRJbmRleChjb25zdCBDRlhfUG9pbnRGICYgcHRDYXJldCk7DQorICBGWF9CT09MIFJlcGxhY2VQYXJhZ0VuZChGWF9XQ0hBUiomIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmVJc0NSID0gRkFMU0UpOw0KKyAgdm9pZCBSZWNvdmVyUGFyYWdFbmQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBpbnQzMl90IE1vdmVQYWdlMkNoYXIoaW50MzJfdCBuSW5kZXgpOw0KKyAgdm9pZCBUZXh0UG9zMlBhcmFnUG9zKGludDMyX3QgbkluZGV4LCBGREVfVFhURURUUEFSQUdQT1MmIFBhcmFnUG9zKSBjb25zdDsNCisgIGludDMyX3QgTW92ZUZvcndhcmQoRlhfQk9PTCYgYkJlZm9yZSk7DQorICBpbnQzMl90IE1vdmVCYWNrd2FyZChGWF9CT09MJiBiQmVmb3JlKTsNCisgIEZYX0JPT0wgTW92ZVVwKENGWF9Qb2ludEYmIHB0Q2FyZXQpOw0KKyAgRlhfQk9PTCBNb3ZlRG93bihDRlhfUG9pbnRGJiBwdENhcmV0KTsNCisgIEZYX0JPT0wgTW92ZUxpbmVTdGFydCgpOw0KKyAgRlhfQk9PTCBNb3ZlTGluZUVuZCgpOw0KKyAgRlhfQk9PTCBNb3ZlUGFyYWdTdGFydCgpOw0KKyAgRlhfQk9PTCBNb3ZlUGFyYWdFbmQoKTsNCisgIEZYX0JPT0wgTW92ZUhvbWUoKTsNCisgIEZYX0JPT0wgTW92ZUVuZCgpOw0KKyAgRlhfQk9PTCBJc0ZpdEFyZWEoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2b2lkIFVwZGF0ZUNhcmV0UmVjdChpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlID0gVFJVRSk7DQorICB2b2lkIEdldENhcmV0UmVjdChDRlhfUmVjdEYmIHJ0Q2FyZXQsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5QYWdlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUUpOw0KKyAgdm9pZCBVcGRhdGVDYXJldEluZGV4KGNvbnN0IENGWF9Qb2ludEYmIHB0Q2FyZXQpOw0KIA0KLSAgICBGWF9CT09MCUlzU2VsZWN0KCk7DQotICAgIHZvaWQJRGVsZXRlU2VsZWN0KCk7DQotICAgIElGREVfVHh0RWR0QnVmKgkJbV9wVHh0QnVmOw0KLSAgICBJRlhfVHh0QnJlYWsqCQltX3BUZXh0QnJlYWs7DQotICAgIEZERV9UWFRFRFRQQVJBTVMJbV9QYXJhbTsNCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8SUZERV9UeHRFZHRQYWdlKj4JCQltX1BhZ2VQdHJBcnJheTsNCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZERV9UeHRFZHRQYXJhZyo+CQltX1BhcmFnUHRyQXJyYXk7DQotICAgIENGWF9BcnJheVRlbXBsYXRlPEZERV9MUFRYVEVEVFNFTFJBTkdFPgkJbV9TZWxSYW5nZVB0ckFycjsNCi0gICAgaW50MzJfdAltX25QYWdlTGluZUNvdW50Ow0KLSAgICBpbnQzMl90CW1fbkxpbmVDb3VudDsNCi0gICAgaW50MzJfdAltX25BbmNob3JQb3M7DQotICAgIGludDMyX3QJbV9uTGF5b3V0UG9zOw0KLSAgICBGWF9GTE9BVAltX2ZDYXJldFBvc1Jlc2VydmU7DQotICAgIGludDMyX3QJbV9uQ2FyZXQ7DQotICAgIEZYX0JPT0wJCW1fYkJlZm9yZTsNCi0gICAgaW50MzJfdAltX25DYXJldFBhZ2U7DQotICAgIENGWF9SZWN0RgltX3J0Q2FyZXQ7DQotICAgIEZYX0RXT1JECW1fZHdGaW5kRmxhZ3M7DQorICBGWF9CT09MIElzU2VsZWN0KCk7DQorICB2b2lkIERlbGV0ZVNlbGVjdCgpOw0KKyAgSUZERV9UeHRFZHRCdWYqIG1fcFR4dEJ1ZjsNCisgIElGWF9UeHRCcmVhayogbV9wVGV4dEJyZWFrOw0KKyAgRkRFX1RYVEVEVFBBUkFNUyBtX1BhcmFtOw0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8SUZERV9UeHRFZHRQYWdlKj4gbV9QYWdlUHRyQXJyYXk7DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxDRkRFX1R4dEVkdFBhcmFnKj4gbV9QYXJhZ1B0ckFycmF5Ow0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8RkRFX0xQVFhURURUU0VMUkFOR0U+IG1fU2VsUmFuZ2VQdHJBcnI7DQorICBpbnQzMl90IG1fblBhZ2VMaW5lQ291bnQ7DQorICBpbnQzMl90IG1fbkxpbmVDb3VudDsNCisgIGludDMyX3QgbV9uQW5jaG9yUG9zOw0KKyAgaW50MzJfdCBtX25MYXlvdXRQb3M7DQorICBGWF9GTE9BVCBtX2ZDYXJldFBvc1Jlc2VydmU7DQorICBpbnQzMl90IG1fbkNhcmV0Ow0KKyAgRlhfQk9PTCBtX2JCZWZvcmU7DQorICBpbnQzMl90IG1fbkNhcmV0UGFnZTsNCisgIENGWF9SZWN0RiBtX3J0Q2FyZXQ7DQorICBGWF9EV09SRCBtX2R3RmluZEZsYWdzOw0KIA0KLSAgICBGWF9CT09MCQltX2JMb2NrOw0KLSAgICBpbnQzMl90CW1fbkxpbWl0Ow0KLSAgICBGWF9XQ0hBUgltX3djQWxpYXNDaGFyOw0KLSAgICBpbnQzMl90CW1fbkZpcnN0TGluZUVuZDsNCi0gICAgRlhfQk9PTAkJbV9iQXV0b0xpbmVFbmQ7DQotICAgIEZYX1dDSEFSCW1fd0xpbmVFbmQ7DQorICBGWF9CT09MIG1fYkxvY2s7DQorICBpbnQzMl90IG1fbkxpbWl0Ow0KKyAgRlhfV0NIQVIgbV93Y0FsaWFzQ2hhcjsNCisgIGludDMyX3QgbV9uRmlyc3RMaW5lRW5kOw0KKyAgRlhfQk9PTCBtX2JBdXRvTGluZUVuZDsNCisgIEZYX1dDSEFSIG1fd0xpbmVFbmQ7DQogDQotICAgIEZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPIG1fQ2hhbmdlSW5mbzsNCisgIEZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPIG1fQ2hhbmdlSW5mbzsNCiB9Ow0KLWNsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0IDogcHVibGljIElGREVfVHh0RWR0RG9SZWNvcmQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpOw0KLSAgICBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydCgJQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKTsNCi0gICAgdmlydHVhbCB2b2lkCVJlbGVhc2UoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MIFVuZG8oKTsNCi0gICAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCi0gICAgdmlydHVhbCB2b2lkCVNlcmlhbGl6ZShDRlhfQnl0ZVN0cmluZyAmYnNEb1JlY29yZCkgY29uc3Q7DQotcHJvdGVjdGVkOg0KLSAgICB+Q0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoKTsNCi0gICAgdm9pZAkJCURlc2VyaWFsaXplKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQotcHJpdmF0ZToNCi0gICAgQ0ZERV9UeHRFZHRFbmdpbmUgKgltX3BFbmdpbmU7DQotICAgIGludDMyX3QJCQltX25DYXJldDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCW1fd3NJbnNlcnQ7DQorY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQgOiBwdWJsaWMgSUZERV9UeHRFZHREb1JlY29yZCB7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQorICBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydChDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFVuZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZWRvKCk7DQorICB2aXJ0dWFsIHZvaWQgU2VyaWFsaXplKENGWF9CeXRlU3RyaW5nJiBic0RvUmVjb3JkKSBjb25zdDsNCisNCisgcHJvdGVjdGVkOg0KKyAgfkNGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0KCk7DQorICB2b2lkIERlc2VyaWFsaXplKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQorDQorIHByaXZhdGU6DQorICBDRkRFX1R4dEVkdEVuZ2luZSogbV9wRW5naW5lOw0KKyAgaW50MzJfdCBtX25DYXJldDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NJbnNlcnQ7DQogfTsNCi1jbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlIDogcHVibGljIElGREVfVHh0RWR0RG9SZWNvcmQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQotICAgIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNhcmV0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1JhbmdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbCA9IEZBTFNFKTsNCi0gICAgdmlydHVhbAl2b2lkCVJlbGVhc2UoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MIFVuZG8oKTsNCi0gICAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCi0gICAgdmlydHVhbCB2b2lkCVNlcmlhbGl6ZShDRlhfQnl0ZVN0cmluZyAmYnNEb1JlY29yZCkgY29uc3Q7DQotcHJvdGVjdGVkOg0KLSAgICB+Q0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZSgpOw0KLSAgICB2b2lkCQkJRGVzZXJpYWxpemUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCi1wcml2YXRlOg0KLSAgICBDRkRFX1R4dEVkdEVuZ2luZSAqCW1fcEVuZ2luZTsNCi0gICAgRlhfQk9PTAkJCQltX2JTZWw7DQotICAgIGludDMyX3QJCQltX25JbmRleDsNCi0gICAgaW50MzJfdAkJCW1fbkNhcmV0Ow0KLSAgICBDRlhfV2lkZVN0cmluZwkJbV93c1JhbmdlOw0KK2NsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UgOiBwdWJsaWMgSUZERV9UeHRFZHREb1JlY29yZCB7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCisgIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoQ0ZERV9UeHRFZHRFbmdpbmUqIHBFbmdpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmFuZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbCA9IEZBTFNFKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCisgIHZpcnR1YWwgdm9pZCBTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcmIGJzRG9SZWNvcmQpIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICB+Q0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZSgpOw0KKyAgdm9pZCBEZXNlcmlhbGl6ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZERV9UeHRFZHRFbmdpbmUqIG1fcEVuZ2luZTsNCisgIEZYX0JPT0wgbV9iU2VsOw0KKyAgaW50MzJfdCBtX25JbmRleDsNCisgIGludDMyX3QgbV9uQ2FyZXQ7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzUmFuZ2U7DQogfTsNCiAjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQotY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydCA6IHB1YmxpYyBJRkRFX1R4dEVkdERvUmVjb3JkDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpOw0KLSAgICBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0KENGREVfVHh0RWR0RW5naW5lICogcEVuZ2luZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DYXJldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4SW5GaWVsZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5GaWVsZEJnbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5PbGRGaWVsZExlbmd0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5OZXdGaWVsZExlbmd0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NJbnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIHZvaWQJUmVsZWFzZSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJVW5kbygpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJUmVkbygpOw0KLSAgICB2aXJ0dWFsIHZvaWQJU2VyaWFsaXplKENGWF9CeXRlU3RyaW5nICZic0RvUmVjb3JkKSBjb25zdDsNCi1wcm90ZWN0ZWQ6DQotICAgIH5DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0KCk7DQotICAgIHZvaWQJRGVzZXJpYWxpemUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCitjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0IDogcHVibGljIElGREVfVHh0RWR0RG9SZWNvcmQgew0KKyBwdWJsaWM6DQorICBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQorICBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0KENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleEluRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkQmduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5PbGRGaWVsZExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTmV3RmllbGRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0lucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsID0gRkFMU0UpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpOw0KKyAgdmlydHVhbCB2b2lkIFNlcmlhbGl6ZShDRlhfQnl0ZVN0cmluZyYgYnNEb1JlY29yZCkgY29uc3Q7DQogDQotcHJpdmF0ZToNCi0gICAgQ0ZERV9UeHRFZHRFbmdpbmUgKgltX3BFbmdpbmU7DQotICAgIGludDMyX3QJCQltX25DYXJldDsNCi0gICAgQ0ZERV9UeHRFZHRGaWVsZCAqCW1fcEZpZWxkOw0KLSAgICBpbnQzMl90CQkJbV9uSW5kZXhJbkZpZWxkOw0KLSAgICBpbnQzMl90CQkJbV9uRmllbGRCZ247DQotICAgIGludDMyX3QJCQltX25PbGRGaWVsZExlbmd0aDsNCi0gICAgaW50MzJfdAkJCW1fbk5ld0ZpZWxkTGVuZ3RoOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJbV93c0luczsNCi0gICAgRlhfQk9PTAkJCQltX2JTZWw7DQorIHByb3RlY3RlZDoNCisgIH5DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0KCk7DQorICB2b2lkIERlc2VyaWFsaXplKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQorDQorIHByaXZhdGU6DQorICBDRkRFX1R4dEVkdEVuZ2luZSogbV9wRW5naW5lOw0KKyAgaW50MzJfdCBtX25DYXJldDsNCisgIENGREVfVHh0RWR0RmllbGQqIG1fcEZpZWxkOw0KKyAgaW50MzJfdCBtX25JbmRleEluRmllbGQ7DQorICBpbnQzMl90IG1fbkZpZWxkQmduOw0KKyAgaW50MzJfdCBtX25PbGRGaWVsZExlbmd0aDsNCisgIGludDMyX3QgbV9uTmV3RmllbGRMZW5ndGg7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzSW5zOw0KKyAgRlhfQk9PTCBtX2JTZWw7DQogfTsNCi1jbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlIDogcHVibGljIElGREVfVHh0RWR0RG9SZWNvcmQNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQotICAgIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGUoQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNhcmV0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0RmllbGQgKiBwRmllbGQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXhJbkZpZWxkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkQmduLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbk9sZExlbmd0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5OZXdMZW5ndGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRGVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbCA9IEZBTFNFKTsNCi0gICAgdmlydHVhbCB2b2lkCVJlbGVhc2UoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCVVuZG8oKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCVJlZG8oKTsNCi0gICAgdmlydHVhbCB2b2lkCVNlcmlhbGl6ZShDRlhfQnl0ZVN0cmluZyAmYnNEb1JlY29yZCkgY29uc3Q7DQotcHJvdGVjdGVkOg0KLSAgICB+Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZSgpOw0KLSAgICB2b2lkCURlc2VyaWFsaXplKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQotcHJpdmF0ZToNCi0gICAgQ0ZERV9UeHRFZHRFbmdpbmUgKiBtX3BFbmdpbmU7DQotICAgIGludDMyX3QJCQltX25DYXJldDsNCi0gICAgQ0ZERV9UeHRFZHRGaWVsZCAqCW1fcEZpZWxkOw0KLSAgICBpbnQzMl90CQkJbV9uSW5kZXhJbkZpZWxkOw0KLSAgICBpbnQzMl90CQkJbV9uRmllbGRCZ247DQotICAgIGludDMyX3QJCQltX25PbGRGaWVsZExlbmd0aDsNCi0gICAgaW50MzJfdAkJCW1fbk5ld0ZpZWxkTGVuZ3RoOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJbV93c0RlbDsNCi0gICAgRlhfQk9PTAkJCQltX2JTZWw7DQorY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZSA6IHB1YmxpYyBJRkRFX1R4dEVkdERvUmVjb3JkIHsNCisgcHVibGljOg0KKyAgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpOw0KKyAgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZShDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXhJbkZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5GaWVsZEJnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuT2xkTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5OZXdMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsID0gRkFMU0UpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpOw0KKyAgdmlydHVhbCB2b2lkIFNlcmlhbGl6ZShDRlhfQnl0ZVN0cmluZyYgYnNEb1JlY29yZCkgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIH5DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKCk7DQorICB2b2lkIERlc2VyaWFsaXplKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQorDQorIHByaXZhdGU6DQorICBDRkRFX1R4dEVkdEVuZ2luZSogbV9wRW5naW5lOw0KKyAgaW50MzJfdCBtX25DYXJldDsNCisgIENGREVfVHh0RWR0RmllbGQqIG1fcEZpZWxkOw0KKyAgaW50MzJfdCBtX25JbmRleEluRmllbGQ7DQorICBpbnQzMl90IG1fbkZpZWxkQmduOw0KKyAgaW50MzJfdCBtX25PbGRGaWVsZExlbmd0aDsNCisgIGludDMyX3QgbV9uTmV3RmllbGRMZW5ndGg7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzRGVsOw0KKyAgRlhfQk9PTCBtX2JTZWw7DQogfTsNCi1jbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZSA6IHB1YmxpYyBJRkRFX1R4dEVkdERvUmVjb3JkDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCi0gICAgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoCUNGREVfVHh0RWR0RW5naW5lICogcEVuZ2luZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbk5ld0NhcmV0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkICogcEZpZWxkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90CW5JbmRleEluRmllbGQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QJbkZpZWxkQmduLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90CW5GaWVsZE5ld0xlbmd0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRGVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NJbnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wJYlNlbCk7DQotICAgIHZpcnR1YWwgdm9pZAlSZWxlYXNlKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlVbmRvKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlSZWRvKCk7DQotICAgIHZpcnR1YWwgdm9pZAlTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcgJmJzRG9SZWNvcmQpIGNvbnN0Ow0KLXByb3RlY3RlZDoNCi0gICAgfkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlKCk7DQotICAgIHZvaWQJRGVzZXJpYWxpemUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCi1wcml2YXRlOg0KLSAgICBDRkRFX1R4dEVkdEVuZ2luZSAqIG1fcEVuZ2luZTsNCi0gICAgaW50MzJfdAkJCW1fbkNhcmV0Ow0KLSAgICBpbnQzMl90CQkJbV9uTmV3Q2FyZXQ7DQotICAgIENGREVfVHh0RWR0RmllbGQgKgltX3BGaWVsZDsNCi0gICAgaW50MzJfdAkJCW1fbkluZGV4SW5GaWVsZDsNCi0gICAgaW50MzJfdAkJCW1fbkZpZWxkQmduOw0KLSAgICBpbnQzMl90CQkJbV9uRmllbGROZXdMZW5ndGg7DQotICAgIENGWF9XaWRlU3RyaW5nCQltX3dzRGVsOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJbV93c0luczsNCi0gICAgRlhfQk9PTAkJCQltX2JTZWw7DQorY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UgOiBwdWJsaWMgSUZERV9UeHRFZHREb1JlY29yZCB7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQorICBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZShDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTmV3Q2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkKiBwRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleEluRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5GaWVsZEJnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkTmV3TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSW5zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCisgIHZpcnR1YWwgdm9pZCBTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcmIGJzRG9SZWNvcmQpIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICB+Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoKTsNCisgIHZvaWQgRGVzZXJpYWxpemUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCisNCisgcHJpdmF0ZToNCisgIENGREVfVHh0RWR0RW5naW5lKiBtX3BFbmdpbmU7DQorICBpbnQzMl90IG1fbkNhcmV0Ow0KKyAgaW50MzJfdCBtX25OZXdDYXJldDsNCisgIENGREVfVHh0RWR0RmllbGQqIG1fcEZpZWxkOw0KKyAgaW50MzJfdCBtX25JbmRleEluRmllbGQ7DQorICBpbnQzMl90IG1fbkZpZWxkQmduOw0KKyAgaW50MzJfdCBtX25GaWVsZE5ld0xlbmd0aDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NEZWw7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzSW5zOw0KKyAgRlhfQk9PTCBtX2JTZWw7DQogfTsNCiAjZW5kaWYNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYWdlLmNwcCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhZ2UuY3BwCmluZGV4IDg5NDI0NWQuLmE4ZTkxNDIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhZ2UuY3BwCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhZ2UuY3BwCkBAIC0xNCw2MzQgKzE0LDYzOSBAQAogI2luY2x1ZGUgImZkZV90eHRlZHRwYXJhZy5oIg0KICNpbmNsdWRlICJmZGVfdHh0ZWR0YnVmLmgiDQogI2RlZmluZSBGREVfVFhURURUX1RPTEVSQU5DRSAwLjFmDQotSUZERV9UeHRFZHRQYWdlICogSUZERV9UeHRFZHRQYWdlOjpDcmVhdGUoSUZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLCBpbnQzMl90IG5JbmRleCkNCi17DQotICAgIHJldHVybiAoSUZERV9UeHRFZHRQYWdlKilGWF9ORVcgQ0ZERV9UeHRFZHRQYWdlKHBFbmdpbmUsIG5JbmRleCk7DQorSUZERV9UeHRFZHRQYWdlKiBJRkRFX1R4dEVkdFBhZ2U6OkNyZWF0ZShJRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7DQorICByZXR1cm4gKElGREVfVHh0RWR0UGFnZSopRlhfTkVXIENGREVfVHh0RWR0UGFnZShwRW5naW5lLCBuSW5kZXgpOw0KIH0NCi1DRkRFX1R4dEVkdFRleHRTZXQ6OkNGREVfVHh0RWR0VGV4dFNldChDRkRFX1R4dEVkdFBhZ2UgKiBwUGFnZSkNCi0gICAgOiBtX3BQYWdlKHBQYWdlKQ0KLXsNCitDRkRFX1R4dEVkdFRleHRTZXQ6OkNGREVfVHh0RWR0VGV4dFNldChDRkRFX1R4dEVkdFBhZ2UqIHBQYWdlKQ0KKyAgICA6IG1fcFBhZ2UocFBhZ2UpIHt9DQorQ0ZERV9UeHRFZHRUZXh0U2V0Ojp+Q0ZERV9UeHRFZHRUZXh0U2V0KCkge30NCitGREVfVklTVUFMT0JKVFlQRSBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldFR5cGUoKSB7DQorICByZXR1cm4gRkRFX1ZJU1VBTE9CSl9UZXh0Ow0KIH0NCi1DRkRFX1R4dEVkdFRleHRTZXQ6On5DRkRFX1R4dEVkdFRleHRTZXQoKQ0KLXsNCitGWF9CT09MIENGREVfVHh0RWR0VGV4dFNldDo6R2V0QkJveChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgYmJveCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GREVfVklTVUFMT0JKVFlQRSBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldFR5cGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZERV9WSVNVQUxPQkpfVGV4dDsNCitGWF9CT09MIENGREVfVHh0RWR0VGV4dFNldDo6R2V0TWF0cml4KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4JiBtYXRyaXgpIHsNCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldEJCb3goRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGICZiYm94KQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRSZWN0KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiYgcnQpIHsNCisgIHJ0ID0gKChGREVfTFBURVhURURJVFBJRUNFKShoVmlzdWFsT2JqKSktPnJ0UGllY2U7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldE1hdHJpeChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfTWF0cml4ICZtYXRyaXgpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldENsaXAoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBydCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MIENGREVfVHh0RWR0VGV4dFNldDo6R2V0UmVjdChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJnJ0KQ0KLXsNCi0gICAgcnQgPSAoKEZERV9MUFRFWFRFRElUUElFQ0UpKGhWaXN1YWxPYmopKS0+cnRQaWVjZTsNCi0gICAgcmV0dXJuIFRSVUU7DQoraW50MzJfdCBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldFN0cmluZyhGREVfSFZJU1VBTE9CSiBoVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIEZERV9MUFRFWFRFRElUUElFQ0UgcFBpZWNlID0gKEZERV9MUFRFWFRFRElUUElFQ0UpaFRleHQ7DQorICBGWF9XQ0hBUiogcEJ1ZmZlciA9IHdzVGV4dC5HZXRCdWZmZXIocFBpZWNlLT5uQ291bnQpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFBpZWNlLT5uQ291bnQ7IGkrKykgew0KKyAgICBwQnVmZmVyW2ldID0gbV9wUGFnZS0+R2V0Q2hhcigodm9pZCopaFRleHQsIGkpOw0KKyAgfQ0KKyAgd3NUZXh0LlJlbGVhc2VCdWZmZXIocFBpZWNlLT5uQ291bnQpOw0KKyAgcmV0dXJuIHBQaWVjZS0+bkNvdW50Ow0KIH0NCi1GWF9CT09MIENGREVfVHh0RWR0VGV4dFNldDo6R2V0Q2xpcChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJnJ0KQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KK0lGWF9Gb250KiBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldEZvbnQoRkRFX0hWSVNVQUxPQkogaFRleHQpIHsNCisgIHJldHVybiBtX3BQYWdlLT5HZXRFbmdpbmUoKS0+R2V0RWRpdFBhcmFtcygpLT5wRm9udDsNCiB9DQotaW50MzJfdCBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldFN0cmluZyhGREVfSFZJU1VBTE9CSiBoVGV4dCwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCi17DQotICAgIEZERV9MUFRFWFRFRElUUElFQ0UgcFBpZWNlID0gKEZERV9MUFRFWFRFRElUUElFQ0UpaFRleHQ7DQotICAgIEZYX1dDSEFSKiBwQnVmZmVyID0gd3NUZXh0LkdldEJ1ZmZlcihwUGllY2UtPm5Db3VudCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBQaWVjZS0+bkNvdW50OyBpKyspIHsNCi0gICAgICAgIHBCdWZmZXJbaV0gPSBtX3BQYWdlLT5HZXRDaGFyKCh2b2lkKiloVGV4dCwgaSk7DQorRlhfRkxPQVQgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRGb250U2l6ZShGREVfSFZJU1VBTE9CSiBoVGV4dCkgew0KKyAgcmV0dXJuIG1fcFBhZ2UtPkdldEVuZ2luZSgpLT5HZXRFZGl0UGFyYW1zKCktPmZGb250U2l6ZTsNCit9DQorRlhfQVJHQiBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldEZvbnRDb2xvcihGREVfSFZJU1VBTE9CSiBoVGV4dCkgew0KKyAgcmV0dXJuIG1fcFBhZ2UtPkdldEVuZ2luZSgpLT5HZXRFZGl0UGFyYW1zKCktPmR3Rm9udENvbG9yOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0VGV4dFNldDo6R2V0RGlzcGxheVBvcyhGREVfSFZJU1VBTE9CSiBoVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBXU0Zvcm1zKSB7DQorICBpZiAoaFRleHQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZERV9MUFRFWFRFRElUUElFQ0UgcFBpZWNlID0gKEZERV9MUFRFWFRFRElUUElFQ0UpaFRleHQ7DQorICBpbnQzMl90IG5MZW5ndGggPSBwUGllY2UtPm5Db3VudDsNCisgIGlmIChuTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikobV9wUGFnZS0+R2V0RW5naW5lKCkpOw0KKyAgY29uc3QgRkRFX1RYVEVEVFBBUkFNUyogcFRleHRQYXJhbXMgPSBwRW5naW5lLT5HZXRFZGl0UGFyYW1zKCk7DQorICBJRlhfVHh0QnJlYWsqIHBCcmVhayA9IHBFbmdpbmUtPkdldFRleHRCcmVhaygpOw0KKyAgRlhfRFdPUkQgZHdMYXlvdXRTdHlsZSA9IHBCcmVhay0+R2V0TGF5b3V0U3R5bGVzKCk7DQorICBGWF9UWFRSVU4gdHI7DQorICB0ci5wQWNjZXNzID0gbV9wUGFnZTsNCisgIHRyLnBJZGVudGl0eSA9ICh2b2lkKiloVGV4dDsNCisgIHRyLnBTdHIgPSBOVUxMOw0KKyAgdHIucFdpZHRocyA9IE5VTEw7DQorICB0ci5pTGVuZ3RoID0gbkxlbmd0aDsNCisgIHRyLnBGb250ID0gcFRleHRQYXJhbXMtPnBGb250Ow0KKyAgdHIuZkZvbnRTaXplID0gcFRleHRQYXJhbXMtPmZGb250U2l6ZTsNCisgIHRyLmR3U3R5bGVzID0gZHdMYXlvdXRTdHlsZTsNCisgIHRyLmlDaGFyUm90YXRpb24gPSBwVGV4dFBhcmFtcy0+bkNoYXJSb3RhdGlvbjsNCisgIHRyLmR3Q2hhclN0eWxlcyA9IHBQaWVjZS0+ZHdDaGFyU3R5bGVzOw0KKyAgdHIucFJlY3QgPSAmKHBQaWVjZS0+cnRQaWVjZSk7DQorICB0ci53TGluZUJyZWFrQ2hhciA9IHBUZXh0UGFyYW1zLT53TGluZUJyZWFrQ2hhcjsNCisgIHJldHVybiBwQnJlYWstPkdldERpc3BsYXlQb3MoJnRyLCBwQ2hhclBvcywgYkNoYXJDb2RlLCBwV1NGb3Jtcyk7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRDaGFyUmVjdHMoRkRFX0hWSVNVQUxPQkogaFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEZBcnJheSYgcnRBcnJheSkgew0KKyAgcmV0dXJuIEdldENoYXJSZWN0c19JbXBsKGhUZXh0LCBydEFycmF5KTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldENoYXJSZWN0c19JbXBsKEZERV9IVklTVUFMT0JKIGhUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEZBcnJheSYgcnRBcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQkJveCkgew0KKyAgaWYgKGhUZXh0ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IChGREVfTFBURVhURURJVFBJRUNFKWhUZXh0Ow0KKyAgQ0ZERV9UeHRFZHRFbmdpbmUqIHBFbmdpbmUgPSAoQ0ZERV9UeHRFZHRFbmdpbmUqKShtX3BQYWdlLT5HZXRFbmdpbmUoKSk7DQorICBpbnQzMl90IG5MZW5ndGggPSBwUGllY2UtPm5Db3VudDsNCisgIGlmIChuTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGNvbnN0IEZERV9UWFRFRFRQQVJBTVMqIHBUZXh0UGFyYW1zID0gcEVuZ2luZS0+R2V0RWRpdFBhcmFtcygpOw0KKyAgRlhfRFdPUkQgZHdMYXlvdXRTdHlsZSA9IHBFbmdpbmUtPkdldFRleHRCcmVhaygpLT5HZXRMYXlvdXRTdHlsZXMoKTsNCisgIEZYX1RYVFJVTiB0cjsNCisgIHRyLnBBY2Nlc3MgPSBtX3BQYWdlOw0KKyAgdHIucElkZW50aXR5ID0gKHZvaWQqKWhUZXh0Ow0KKyAgdHIucFN0ciA9IE5VTEw7DQorICB0ci5wV2lkdGhzID0gTlVMTDsNCisgIHRyLmlMZW5ndGggPSBuTGVuZ3RoOw0KKyAgdHIucEZvbnQgPSBwVGV4dFBhcmFtcy0+cEZvbnQ7DQorICB0ci5mRm9udFNpemUgPSBwVGV4dFBhcmFtcy0+ZkZvbnRTaXplOw0KKyAgdHIuZHdTdHlsZXMgPSBkd0xheW91dFN0eWxlOw0KKyAgdHIuaUNoYXJSb3RhdGlvbiA9IHBUZXh0UGFyYW1zLT5uQ2hhclJvdGF0aW9uOw0KKyAgdHIuZHdDaGFyU3R5bGVzID0gcFBpZWNlLT5kd0NoYXJTdHlsZXM7DQorICB0ci5wUmVjdCA9ICYocFBpZWNlLT5ydFBpZWNlKTsNCisgIHRyLndMaW5lQnJlYWtDaGFyID0gcFRleHRQYXJhbXMtPndMaW5lQnJlYWtDaGFyOw0KKyAgcmV0dXJuIHBFbmdpbmUtPkdldFRleHRCcmVhaygpLT5HZXRDaGFyUmVjdHMoJnRyLCBydEFycmF5LCBiQkJveCk7DQorfQ0KK0NGREVfVHh0RWR0UGFnZTo6Q0ZERV9UeHRFZHRQYWdlKElGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLCBpbnQzMl90IG5QYWdlSW5kZXgpDQorICAgIDogbV9wSXRlcihOVUxMKSwNCisgICAgICBtX3BUZXh0U2V0KE5VTEwpLA0KKyAgICAgIG1fblJlZkNvdW50KDApLA0KKyAgICAgIG1fblBhZ2VTdGFydCgtMSksDQorICAgICAgbV9uQ2hhckNvdW50KDApLA0KKyAgICAgIG1fblBhZ2VJbmRleChuUGFnZUluZGV4KSwNCisgICAgICBtX2JMb2FkZWQoRkFMU0UpLA0KKyAgICAgIG1fYkxhc3RQYWdlKEZBTFNFKSwNCisgICAgICBtX3BDaGFyV2lkdGgoTlVMTCksDQorICAgICAgbV9wQmduUGFyYWcoTlVMTCksDQorICAgICAgbV9wRW5kUGFyYWcoTlVMTCkgew0KKyAgRlhTWVNfbWVtc2V0KCZtX3J0UGFnZSwgMCwgc2l6ZW9mKENGWF9SZWN0RikpOw0KKyAgRlhTWVNfbWVtc2V0KCZtX3J0UGFnZU1hcmdpbiwgMCwgc2l6ZW9mKENGWF9SZWN0RikpOw0KKyAgRlhTWVNfbWVtc2V0KCZtX3J0UGFnZUNvbnRlbnRzLCAwLCBzaXplb2YoQ0ZYX1JlY3RGKSk7DQorICBGWFNZU19tZW1zZXQoJm1fcnRQYWdlQ2FudmFzLCAwLCBzaXplb2YoQ0ZYX1JlY3RGKSk7DQorICBtX3BFZGl0RW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKilwRW5naW5lOw0KK30NCitDRkRFX1R4dEVkdFBhZ2U6On5DRkRFX1R4dEVkdFBhZ2UoKSB7DQorICBtX1BpZWNlTWFzc0Fyci5SZW1vdmVBbGwoVFJVRSk7DQorICBpZiAobV9wVGV4dFNldCkgew0KKyAgICBkZWxldGUgbV9wVGV4dFNldDsNCisgICAgbV9wVGV4dFNldCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wQ2hhcldpZHRoKSB7DQorICAgIGRlbGV0ZVtdIG1fcENoYXJXaWR0aDsNCisgICAgbV9wQ2hhcldpZHRoID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BJdGVyICE9IE5VTEwpIHsNCisgICAgbV9wSXRlci0+UmVsZWFzZSgpOw0KKyAgICBtX3BJdGVyID0gTlVMTDsNCisgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdFBhZ2U6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCit9DQorSUZERV9UeHRFZHRFbmdpbmUqIENGREVfVHh0RWR0UGFnZTo6R2V0RW5naW5lKCkgY29uc3Qgew0KKyAgcmV0dXJuIChJRkRFX1R4dEVkdEVuZ2luZSopbV9wRWRpdEVuZ2luZTsNCit9DQorRkRFX1ZJU1VBTE9CSlRZUEUgQ0ZERV9UeHRFZHRQYWdlOjpHZXRUeXBlKCkgew0KKyAgcmV0dXJuIEZERV9WSVNVQUxPQkpfVGV4dDsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdFBhZ2U6OkdldEJCb3goRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBiYm94KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRQYWdlOjpHZXRNYXRyaXgoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0UGFnZTo6R2V0UmVjdChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYmIHJ0KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRQYWdlOjpHZXRDbGlwKEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiYgcnQpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJSZWN0KGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJCb3gpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChtX25SZWZDb3VudCA+IDApOw0KKyAgRlhTWVNfYXNzZXJ0KG5JbmRleCA+PSAwICYmIG5JbmRleCA8IG1fbkNoYXJDb3VudCk7DQorICBpZiAobV9uUmVmQ291bnQgPCAxKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCBuQ291bnQgPSBtX1BpZWNlTWFzc0Fyci5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBjb25zdCBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KKyAgICBpZiAobkluZGV4ID49IHBQaWVjZS0+blN0YXJ0ICYmDQorICAgICAgICBuSW5kZXggPCAocFBpZWNlLT5uU3RhcnQgKyBwUGllY2UtPm5Db3VudCkpIHsNCisgICAgICBDRlhfUmVjdEZBcnJheSByZWN0QXJyOw0KKyAgICAgIGlmIChiQkJveCkgew0KKyAgICAgICAgbV9wVGV4dFNldC0+R2V0Q2hhclJlY3RzX0ltcGwoKEZERV9IVklTVUFMT0JKKXBQaWVjZSwgcmVjdEFyciwgYkJCb3gpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BUZXh0U2V0LT5HZXRDaGFyUmVjdHMoKEZERV9IVklTVUFMT0JKKXBQaWVjZSwgcmVjdEFycik7DQorICAgICAgfQ0KKyAgICAgIHJlY3QgPSByZWN0QXJyW25JbmRleCAtIHBQaWVjZS0+blN0YXJ0XTsNCisgICAgICByZXR1cm4gcFBpZWNlLT5uQmlkaUxldmVsOw0KICAgICB9DQotICAgIHdzVGV4dC5SZWxlYXNlQnVmZmVyKHBQaWVjZS0+bkNvdW50KTsNCi0gICAgcmV0dXJuIHBQaWVjZS0+bkNvdW50Ow0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgcmV0dXJuIDA7DQogfQ0KLUlGWF9Gb250KiBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldEZvbnQoRkRFX0hWSVNVQUxPQkogaFRleHQpDQotew0KLSAgICByZXR1cm4gbV9wUGFnZS0+R2V0RW5naW5lKCktPkdldEVkaXRQYXJhbXMoKS0+cEZvbnQ7DQotfQ0KLUZYX0ZMT0FUIENGREVfVHh0RWR0VGV4dFNldDo6R2V0Rm9udFNpemUoRkRFX0hWSVNVQUxPQkogaFRleHQpDQotew0KLSAgICByZXR1cm4gbV9wUGFnZS0+R2V0RW5naW5lKCktPkdldEVkaXRQYXJhbXMoKS0+ZkZvbnRTaXplOw0KLX0NCi1GWF9BUkdCIENGREVfVHh0RWR0VGV4dFNldDo6R2V0Rm9udENvbG9yKEZERV9IVklTVUFMT0JKIGhUZXh0KQ0KLXsNCi0gICAgcmV0dXJuIG1fcFBhZ2UtPkdldEVuZ2luZSgpLT5HZXRFZGl0UGFyYW1zKCktPmR3Rm9udENvbG9yOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0VGV4dFNldDo6R2V0RGlzcGxheVBvcyhGREVfSFZJU1VBTE9CSiBoVGV4dCwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9CT09MIGJDaGFyQ29kZSAsIENGWF9XaWRlU3RyaW5nICpwV1NGb3JtcyApDQotew0KLSAgICBpZiAoaFRleHQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQoraW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJJbmRleChjb25zdCBDRlhfUG9pbnRGJiBmUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKSB7DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9IG1fcEVkaXRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKS0+ZHdMYXlvdXRTdHlsZXMgJg0KKyAgICAgICAgICAgICAgICAgICAgICBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWw7DQorICBDRlhfUG9pbnRGIHB0RiA9IGZQb2ludDsNCisgIE5vcm1hbGl6ZVB0MlJlY3QocHRGLCBtX3J0UGFnZUNvbnRlbnRzLCBGREVfVFhURURUX1RPTEVSQU5DRSk7DQorICBpbnQzMl90IG5Db3VudCA9IG1fUGllY2VNYXNzQXJyLkdldFNpemUoKTsNCisgIENGWF9SZWN0RiBydExpbmU7DQorICBpbnQzMl90IG5CZ24gPSAwOw0KKyAgaW50MzJfdCBuRW5kID0gMDsNCisgIEZYX0JPT0wgYkluTGluZSA9IEZBTFNFOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBjb25zdCBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KKyAgICBpZiAoIWJJbkxpbmUgJiYgKGJWZXJ0aWNhbCA/IChwUGllY2UtPnJ0UGllY2UubGVmdCA8PSBwdEYueCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGllY2UtPnJ0UGllY2UucmlnaHQoKSA+IHB0Ri54KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChwUGllY2UtPnJ0UGllY2UudG9wIDw9IHB0Ri55ICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWVjZS0+cnRQaWVjZS5ib3R0b20oKSA+IHB0Ri55KSkpIHsNCisgICAgICBuQmduID0gbkVuZCA9IGk7DQorICAgICAgcnRMaW5lID0gcFBpZWNlLT5ydFBpZWNlOw0KKyAgICAgIGJJbkxpbmUgPSBUUlVFOw0KKyAgICB9IGVsc2UgaWYgKGJJbkxpbmUpIHsNCisgICAgICBpZiAoYlZlcnRpY2FsID8gKCEocFBpZWNlLT5ydFBpZWNlLmxlZnQgPD0gcHRGLnggJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgcFBpZWNlLT5ydFBpZWNlLnJpZ2h0KCkgPiBwdEYueCkpDQorICAgICAgICAgICAgICAgICAgICA6IChwUGllY2UtPnJ0UGllY2UuYm90dG9tKCkgPD0gcHRGLnkgfHwNCisgICAgICAgICAgICAgICAgICAgICAgIHBQaWVjZS0+cnRQaWVjZS50b3AgPiBwdEYueSkpIHsNCisgICAgICAgIG5FbmQgPSBpIC0gMTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBydExpbmUuVW5pb24ocFBpZWNlLT5ydFBpZWNlKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwUGllY2UgPSAoRkRFX0xQVEVYVEVESVRQSUVDRSloVGV4dDsNCi0gICAgaW50MzJfdCBuTGVuZ3RoID0gcFBpZWNlLT5uQ291bnQ7DQotICAgIGlmIChuTGVuZ3RoIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQorICB9DQorICBOb3JtYWxpemVQdDJSZWN0KHB0RiwgcnRMaW5lLCBGREVfVFhURURUX1RPTEVSQU5DRSk7DQorICBpbnQzMl90IG5DYXJldCA9IDA7DQorICBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IE5VTEw7DQorICBmb3IgKGkgPSBuQmduOyBpIDw9IG5FbmQ7IGkrKykgew0KKyAgICBwUGllY2UgPSBtX1BpZWNlTWFzc0Fyci5HZXRQdHJBdChpKTsNCisgICAgbkNhcmV0ID0gbV9uUGFnZVN0YXJ0ICsgcFBpZWNlLT5uU3RhcnQ7DQorICAgIGlmIChwUGllY2UtPnJ0UGllY2UuQ29udGFpbnMocHRGKSkgew0KKyAgICAgIENGWF9SZWN0RkFycmF5IHJlY3RBcnI7DQorICAgICAgbV9wVGV4dFNldC0+R2V0Q2hhclJlY3RzKChGREVfSFZJU1VBTE9CSilwUGllY2UsIHJlY3RBcnIpOw0KKyAgICAgIGludDMyX3QgblJ0Q291bnQgPSByZWN0QXJyLkdldFNpemUoKTsNCisgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBuUnRDb3VudDsgaisrKSB7DQorICAgICAgICBpZiAocmVjdEFycltqXS5Db250YWlucyhwdEYpKSB7DQorICAgICAgICAgIG5DYXJldCA9IG1fblBhZ2VTdGFydCArIHBQaWVjZS0+blN0YXJ0ICsgajsNCisgICAgICAgICAgaWYgKG5DYXJldCA+PSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmTGVuZ3RoKCkpIHsNCisgICAgICAgICAgICBiQmVmb3JlID0gVFJVRTsNCisgICAgICAgICAgICByZXR1cm4gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX1dDSEFSIHdDaGFyID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1ZigpLT5HZXRDaGFyQnlJbmRleChuQ2FyZXQpOw0KKyAgICAgICAgICBpZiAod0NoYXIgPT0gTCdcbicgfHwgd0NoYXIgPT0gTCdccicpIHsNCisgICAgICAgICAgICBpZiAod0NoYXIgPT0gTCdcbicpIHsNCisgICAgICAgICAgICAgIGlmIChtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmKCktPkdldENoYXJCeUluZGV4KG5DYXJldCAtIDEpID09DQorICAgICAgICAgICAgICAgICAgTCdccicpIHsNCisgICAgICAgICAgICAgICAgbkNhcmV0LS07DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJCZWZvcmUgPSBUUlVFOw0KKyAgICAgICAgICAgIHJldHVybiBuQ2FyZXQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGJWZXJ0aWNhbA0KKyAgICAgICAgICAgICAgICAgID8gKHB0Ri55ID4gKChyZWN0QXJyW2pdLnRvcCArIHJlY3RBcnJbal0uYm90dG9tKCkpIC8gMikpDQorICAgICAgICAgICAgICAgICAgOiAocHRGLnggPiAoKHJlY3RBcnJbal0ubGVmdCArIHJlY3RBcnJbal0ucmlnaHQoKSkgLyAyKSkpIHsNCisgICAgICAgICAgICBiQmVmb3JlID0gRlhfSXNPZGQocFBpZWNlLT5uQmlkaUxldmVsKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBiQmVmb3JlID0gIUZYX0lzT2RkKHBQaWVjZS0+bkJpZGlMZXZlbCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcmV0dXJuIG5DYXJldDsNCisgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi0gICAgQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikobV9wUGFnZS0+R2V0RW5naW5lKCkpOw0KLSAgICBjb25zdCBGREVfVFhURURUUEFSQU1TICogcFRleHRQYXJhbXMgPSBwRW5naW5lLT5HZXRFZGl0UGFyYW1zKCk7DQotICAgIElGWF9UeHRCcmVhayAqIHBCcmVhayA9IHBFbmdpbmUtPkdldFRleHRCcmVhaygpOw0KLSAgICBGWF9EV09SRCBkd0xheW91dFN0eWxlID0gcEJyZWFrLT5HZXRMYXlvdXRTdHlsZXMoKTsNCi0gICAgRlhfVFhUUlVOIHRyOw0KLSAgICB0ci5wQWNjZXNzCQkJPSBtX3BQYWdlOw0KLSAgICB0ci5wSWRlbnRpdHkJCT0gKHZvaWQqKWhUZXh0Ow0KLSAgICB0ci5wU3RyCQkJCT0gTlVMTDsNCi0gICAgdHIucFdpZHRocwkJCT0gTlVMTDsNCi0gICAgdHIuaUxlbmd0aAkJCT0gbkxlbmd0aDsNCi0gICAgdHIucEZvbnQJCQk9IHBUZXh0UGFyYW1zLT5wRm9udDsNCi0gICAgdHIuZkZvbnRTaXplCQk9IHBUZXh0UGFyYW1zLT5mRm9udFNpemU7DQotICAgIHRyLmR3U3R5bGVzCQkJPSBkd0xheW91dFN0eWxlOw0KLSAgICB0ci5pQ2hhclJvdGF0aW9uCT0gcFRleHRQYXJhbXMtPm5DaGFyUm90YXRpb247DQotICAgIHRyLmR3Q2hhclN0eWxlcwkJPSBwUGllY2UtPmR3Q2hhclN0eWxlczsNCi0gICAgdHIucFJlY3QJCQk9ICYocFBpZWNlLT5ydFBpZWNlKTsNCi0gICAgdHIud0xpbmVCcmVha0NoYXIJPSBwVGV4dFBhcmFtcy0+d0xpbmVCcmVha0NoYXI7DQotICAgIHJldHVybiBwQnJlYWstPkdldERpc3BsYXlQb3MoJnRyLCBwQ2hhclBvcywgYkNoYXJDb2RlLCBwV1NGb3Jtcyk7DQorICB9DQorICBiQmVmb3JlID0gVFJVRTsNCisgIHJldHVybiBuQ2FyZXQ7DQogfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRDaGFyUmVjdHMoRkRFX0hWSVNVQUxPQkogaFRleHQsIENGWF9SZWN0RkFycmF5ICZydEFycmF5KQ0KLXsNCi0gICAgcmV0dXJuIEdldENoYXJSZWN0c19JbXBsKGhUZXh0LCBydEFycmF5KTsNCitpbnQzMl90IENGREVfVHh0RWR0UGFnZTo6R2V0Q2hhclN0YXJ0KCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fblBhZ2VTdGFydDsNCiB9DQotaW50MzJfdCBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldENoYXJSZWN0c19JbXBsKEZERV9IVklTVUFMT0JKIGhUZXh0LCBDRlhfUmVjdEZBcnJheSAmcnRBcnJheSwgRlhfQk9PTCBiQkJveCApDQotew0KLSAgICBpZiAoaFRleHQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQoraW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJDb3VudCgpIGNvbnN0IHsNCisgIHJldHVybiBtX25DaGFyQ291bnQ7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRQYWdlOjpHZXREaXNwbGF5UG9zKGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiYgcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBSRUNURiBwQkJveCkgY29uc3Qgew0KKyAgcENoYXJQb3MgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9BbGxvYyhzaXplb2YoRlhURVhUX0NIQVJQT1MpICogbV9uQ2hhckNvdW50KTsNCisgIGludDMyX3QgbkNoYXJQb3NDb3VudCA9IDA7DQorICBGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqID0gTlVMTDsNCisgIGludDMyX3QgblZpc3VhbE9iakNvdW50ID0gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpOw0KKyAgRlhURVhUX0NIQVJQT1MqIHBvcyA9IHBDaGFyUG9zOw0KKyAgQ0ZYX1JlY3RGIHJ0T2JqOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblZpc3VhbE9iakNvdW50OyBpKyspIHsNCisgICAgaFZpc3VhbE9iaiA9IChGREVfSFZJU1VBTE9CSiltX1BpZWNlTWFzc0Fyci5HZXRQdHJBdChpKTsNCisgICAgbV9wVGV4dFNldC0+R2V0UmVjdChoVmlzdWFsT2JqLCBydE9iaik7DQorICAgIGlmICghcnRDbGlwLkludGVyc2VjdFdpdGgocnRPYmopKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwUGllY2UgPSAoRkRFX0xQVEVYVEVESVRQSUVDRSloVGV4dDsNCi0gICAgQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikobV9wUGFnZS0+R2V0RW5naW5lKCkpOw0KLSAgICBpbnQzMl90IG5MZW5ndGggPSBwUGllY2UtPm5Db3VudDsNCi0gICAgaWYgKG5MZW5ndGggPCAxKSB7DQotICAgICAgICByZXR1cm4gMDsNCisgICAgaW50MzJfdCBuQ291bnQgPSBtX3BUZXh0U2V0LT5HZXREaXNwbGF5UG9zKGhWaXN1YWxPYmosIHBvcywgRkFMU0UpOw0KKyAgICBuQ2hhclBvc0NvdW50ICs9IG5Db3VudDsNCisgICAgcG9zICs9IG5Db3VudDsNCisgIH0NCisgIGlmICgobkNoYXJQb3NDb3VudCAqIDUpIDwgKG1fbkNoYXJDb3VudCA8PCAyKSkgew0KKyAgICBpbnQzMl90IG5MZW5ndGggPSBzaXplb2YoRlhURVhUX0NIQVJQT1MpICogbkNoYXJQb3NDb3VudDsNCisgICAgRlhURVhUX0NIQVJQT1MqIHBUZW1wID0gKEZYVEVYVF9DSEFSUE9TKilGREVfQWxsb2Mobkxlbmd0aCk7DQorICAgIEZYU1lTX21lbWNweShwVGVtcCwgcENoYXJQb3MsIG5MZW5ndGgpOw0KKyAgICBGREVfRnJlZShwQ2hhclBvcyk7DQorICAgIHBDaGFyUG9zID0gcFRlbXA7DQorICB9DQorICByZXR1cm4gbkNoYXJQb3NDb3VudDsNCit9DQordm9pZCBDRkRFX1R4dEVkdFBhZ2U6OkNhbGNSYW5nZVJlY3RBcnJheShpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIFJlY3RGQXJyKSBjb25zdCB7DQorICBpbnQzMl90IG5QaWVjZUNvdW50ID0gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBuRW5kID0gblN0YXJ0ICsgbkNvdW50IC0gMTsNCisgIEZYX0JPT0wgYkluUmFuZ2UgPSBGQUxTRTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5QaWVjZUNvdW50OyBpKyspIHsNCisgICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KKyAgICBpZiAoIWJJblJhbmdlKSB7DQorICAgICAgaWYgKG5TdGFydCA+PSBwaWVjZS0+blN0YXJ0ICYmIG5TdGFydCA8IChwaWVjZS0+blN0YXJ0ICsgcGllY2UtPm5Db3VudCkpIHsNCisgICAgICAgIGludDMyX3QgblJhbmdlRW5kID0gcGllY2UtPm5Db3VudCAtIDE7DQorICAgICAgICBGWF9CT09MIGJFbmQgPSBGQUxTRTsNCisgICAgICAgIGlmIChuRW5kID49IHBpZWNlLT5uU3RhcnQgJiYgbkVuZCA8IChwaWVjZS0+blN0YXJ0ICsgcGllY2UtPm5Db3VudCkpIHsNCisgICAgICAgICAgblJhbmdlRW5kID0gbkVuZCAtIHBpZWNlLT5uU3RhcnQ7DQorICAgICAgICAgIGJFbmQgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1JlY3RGQXJyYXkgcmNBcnI7DQorICAgICAgICBtX3BUZXh0U2V0LT5HZXRDaGFyUmVjdHMoKEZERV9IVklTVUFMT0JKKXBpZWNlLCByY0Fycik7DQorICAgICAgICBpbnQzMl90IG5TaXplID0gcmNBcnIuR2V0U2l6ZSgpOw0KKyAgICAgICAgQ0ZYX1JlY3RGIHJlY3RQaWVjZSA9IHJjQXJyW25TdGFydCAtIHBpZWNlLT5uU3RhcnRdOw0KKyAgICAgICAgcmVjdFBpZWNlLlVuaW9uKHJjQXJyW25SYW5nZUVuZF0pOw0KKyAgICAgICAgUmVjdEZBcnIuQWRkKHJlY3RQaWVjZSk7DQorICAgICAgICBpZiAoYkVuZCkgew0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBiSW5SYW5nZSA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChuRW5kID49IHBpZWNlLT5uU3RhcnQgJiYgbkVuZCA8IChwaWVjZS0+blN0YXJ0ICsgcGllY2UtPm5Db3VudCkpIHsNCisgICAgICAgIENGWF9SZWN0RkFycmF5IHJjQXJyOw0KKyAgICAgICAgbV9wVGV4dFNldC0+R2V0Q2hhclJlY3RzKChGREVfSFZJU1VBTE9CSilwaWVjZSwgcmNBcnIpOw0KKyAgICAgICAgQ0ZYX1JlY3RGIHJlY3RQaWVjZSA9IHJjQXJyWzBdOw0KKyAgICAgICAgcmVjdFBpZWNlLlVuaW9uKHJjQXJyW25FbmQgLSBwaWVjZS0+blN0YXJ0XSk7DQorICAgICAgICBSZWN0RkFyci5BZGQocmVjdFBpZWNlKTsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgUmVjdEZBcnIuQWRkKHBpZWNlLT5ydFBpZWNlKTsNCiAgICAgfQ0KLSAgICBjb25zdCBGREVfVFhURURUUEFSQU1TICogcFRleHRQYXJhbXMgPSBwRW5naW5lLT5HZXRFZGl0UGFyYW1zKCk7DQotICAgIEZYX0RXT1JEIGR3TGF5b3V0U3R5bGUgPSBwRW5naW5lLT5HZXRUZXh0QnJlYWsoKS0+R2V0TGF5b3V0U3R5bGVzKCk7DQotICAgIEZYX1RYVFJVTiB0cjsNCi0gICAgdHIucEFjY2VzcwkJCT0gbV9wUGFnZTsNCi0gICAgdHIucElkZW50aXR5CQk9ICh2b2lkKiloVGV4dDsNCi0gICAgdHIucFN0cgkJCQk9IE5VTEw7DQotICAgIHRyLnBXaWR0aHMJCQk9IE5VTEw7DQotICAgIHRyLmlMZW5ndGgJCQk9IG5MZW5ndGg7DQotICAgIHRyLnBGb250CQkJPSBwVGV4dFBhcmFtcy0+cEZvbnQ7DQotICAgIHRyLmZGb250U2l6ZQkJPSBwVGV4dFBhcmFtcy0+ZkZvbnRTaXplOw0KLSAgICB0ci5kd1N0eWxlcwkJCT0gZHdMYXlvdXRTdHlsZTsNCi0gICAgdHIuaUNoYXJSb3RhdGlvbgk9IHBUZXh0UGFyYW1zLT5uQ2hhclJvdGF0aW9uOw0KLSAgICB0ci5kd0NoYXJTdHlsZXMJCT0gcFBpZWNlLT5kd0NoYXJTdHlsZXM7DQotICAgIHRyLnBSZWN0CQkJPSAmKHBQaWVjZS0+cnRQaWVjZSk7DQotICAgIHRyLndMaW5lQnJlYWtDaGFyCT0gcFRleHRQYXJhbXMtPndMaW5lQnJlYWtDaGFyOw0KLSAgICByZXR1cm4gcEVuZ2luZS0+R2V0VGV4dEJyZWFrKCktPkdldENoYXJSZWN0cygmdHIsIHJ0QXJyYXksIGJCQm94KTsNCisgIH0NCisgIHJldHVybjsNCiB9DQotQ0ZERV9UeHRFZHRQYWdlOjpDRkRFX1R4dEVkdFBhZ2UoSUZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLCBpbnQzMl90IG5QYWdlSW5kZXgpDQotICAgIDogbV9wSXRlcihOVUxMKQ0KLSAgICAsIG1fcFRleHRTZXQoTlVMTCkNCi0gICAgLCBtX25SZWZDb3VudCgwKQ0KLSAgICAsIG1fblBhZ2VTdGFydCgtMSkNCi0gICAgLCBtX25DaGFyQ291bnQoMCkNCi0gICAgLCBtX25QYWdlSW5kZXgoblBhZ2VJbmRleCkNCi0gICAgLCBtX2JMb2FkZWQoRkFMU0UpDQotICAgICwgbV9iTGFzdFBhZ2UoRkFMU0UpDQotICAgICwgbV9wQ2hhcldpZHRoKE5VTEwpDQotICAgICwgbV9wQmduUGFyYWcoTlVMTCkNCi0gICAgLCBtX3BFbmRQYXJhZyhOVUxMKQ0KLXsNCi0gICAgRlhTWVNfbWVtc2V0KCZtX3J0UGFnZSwgMCwgc2l6ZW9mKENGWF9SZWN0RikpOw0KLSAgICBGWFNZU19tZW1zZXQoJm1fcnRQYWdlTWFyZ2luLCAwLCBzaXplb2YoQ0ZYX1JlY3RGKSk7DQotICAgIEZYU1lTX21lbXNldCgmbV9ydFBhZ2VDb250ZW50cywgMCwgc2l6ZW9mKENGWF9SZWN0RikpOw0KLSAgICBGWFNZU19tZW1zZXQoJm1fcnRQYWdlQ2FudmFzLCAwLCBzaXplb2YoQ0ZYX1JlY3RGKSk7DQotICAgIG1fcEVkaXRFbmdpbmUgPSAoQ0ZERV9UeHRFZHRFbmdpbmUqKXBFbmdpbmU7DQoraW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OlNlbGVjdFdvcmQoY29uc3QgQ0ZYX1BvaW50RiYgZlBvaW50LCBpbnQzMl90JiBuQ291bnQpIHsNCisgIGlmIChtX25SZWZDb3VudCA8IDApIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgSUZERV9UeHRFZHRCdWYqIHBCdWYgPSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmKCk7DQorICBGWF9CT09MIGJCZWZvcmU7DQorICBpbnQzMl90IG5JbmRleCA9IEdldENoYXJJbmRleChmUG9pbnQsIGJCZWZvcmUpOw0KKyAgaWYgKG5JbmRleCA9PSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmTGVuZ3RoKCkpIHsNCisgICAgbkluZGV4ID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpIC0gMTsNCisgIH0NCisgIGlmIChuSW5kZXggPCAwKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIElGWF9Xb3JkQnJlYWsqIHBJdGVyID0gRlhfV29yZEJyZWFrX0NyZWF0ZSgpOw0KKyAgcEl0ZXItPkF0dGFjaChGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopcEJ1ZikpOw0KKyAgcEl0ZXItPlNldEF0KG5JbmRleCk7DQorICBuQ291bnQgPSBwSXRlci0+R2V0V29yZExlbmd0aCgpOw0KKyAgaW50MzJfdCBuUmV0ID0gcEl0ZXItPkdldFdvcmRQb3MoKTsNCisgIHBJdGVyLT5SZWxlYXNlKCk7DQorICByZXR1cm4gblJldDsNCiB9DQotQ0ZERV9UeHRFZHRQYWdlOjp+Q0ZERV9UeHRFZHRQYWdlKCkNCi17DQotICAgIG1fUGllY2VNYXNzQXJyLlJlbW92ZUFsbChUUlVFKTsNCitGWF9CT09MIENGREVfVHh0RWR0UGFnZTo6SXNMb2FkZWQoRlhfTFBDUkVDVEYgcENsaXBCb3gpIHsNCisgIHJldHVybiBtX2JMb2FkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRQYWdlOjpMb2FkUGFnZShGWF9MUENSRUNURiBwQ2xpcEJveCwgSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmIChtX25SZWZDb3VudCA+IDApIHsNCisgICAgbV9uUmVmQ291bnQrKzsNCisgICAgcmV0dXJuIG1fblJlZkNvdW50Ow0KKyAgfQ0KKyAgSUZERV9UeHRFZHRCdWYqIHBCdWYgPSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmKCk7DQorICBjb25zdCBGREVfVFhURURUUEFSQU1TKiBwUGFyYW1zID0gbV9wRWRpdEVuZ2luZS0+R2V0RWRpdFBhcmFtcygpOw0KKyAgaWYgKG1fcEl0ZXIgIT0gTlVMTCkgew0KKyAgICBtX3BJdGVyLT5SZWxlYXNlKCk7DQorICB9DQorICBGWF9XQ0hBUiB3Y0FsaWFzID0gMDsNCisgIGlmIChwUGFyYW1zLT5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX1Bhc3N3b3JkKSB7DQorICAgIHdjQWxpYXMgPSBtX3BFZGl0RW5naW5lLT5HZXRBbGlhc0NoYXIoKTsNCisgIH0NCisgIG1fcEl0ZXIgPSBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopcEJ1Ziwgd2NBbGlhcyk7DQorICBJRlhfVHh0QnJlYWsqIHBCcmVhayA9IG1fcEVkaXRFbmdpbmUtPkdldFRleHRCcmVhaygpOw0KKyAgcEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICBwQnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCisgIGludDMyX3QgbkxpbmVDb3VudCA9IG1fcEVkaXRFbmdpbmUtPkdldExpbmVDb3VudCgpOw0KKyAgaW50MzJfdCBuUGFnZUxpbmVDb3VudCA9IG1fcEVkaXRFbmdpbmUtPkdldFBhZ2VMaW5lQ291bnQoKTsNCisgIGludDMyX3Qgbkxlbmd0aCA9IHBCdWYtPkdldFRleHRMZW5ndGgoKTsNCisgIGludDMyX3QgblN0YXJ0TGluZSA9IG5QYWdlTGluZUNvdW50ICogbV9uUGFnZUluZGV4Ow0KKyAgaW50MzJfdCBuRW5kTGluZSA9IEZYX01JTigoblN0YXJ0TGluZSArIG5QYWdlTGluZUNvdW50IC0gMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3BFZGl0RW5naW5lLT5HZXRMaW5lQ291bnQoKSAtIDEpKTsNCisgIGludDMyX3QgblBhZ2VTdGFydCwgblBhZ2VFbmQsIG5UZW1wLCBuQmduUGFyYWcsIG5TdGFydExpbmVJblBhcmFnLCBuRW5kUGFyYWcsDQorICAgICAgbkVuZExpbmVJblBhcmFnOw0KKyAgbkJnblBhcmFnID0gbV9wRWRpdEVuZ2luZS0+TGluZTJQYXJhZygwLCAwLCBuU3RhcnRMaW5lLCBuU3RhcnRMaW5lSW5QYXJhZyk7DQorICBtX3BCZ25QYXJhZyA9IChDRkRFX1R4dEVkdFBhcmFnKiltX3BFZGl0RW5naW5lLT5HZXRQYXJhZyhuQmduUGFyYWcpOw0KKyAgbV9wQmduUGFyYWctPkxvYWRQYXJhZygpOw0KKyAgbV9wQmduUGFyYWctPkdldExpbmVSYW5nZShuU3RhcnRMaW5lIC0gblN0YXJ0TGluZUluUGFyYWcsIG5QYWdlU3RhcnQsIG5UZW1wKTsNCisgIG5FbmRQYXJhZyA9IG1fcEVkaXRFbmdpbmUtPkxpbmUyUGFyYWcobkJnblBhcmFnLCBuU3RhcnRMaW5lSW5QYXJhZywgbkVuZExpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbmRMaW5lSW5QYXJhZyk7DQorICBtX3BFbmRQYXJhZyA9IChDRkRFX1R4dEVkdFBhcmFnKiltX3BFZGl0RW5naW5lLT5HZXRQYXJhZyhuRW5kUGFyYWcpOw0KKyAgbV9wRW5kUGFyYWctPkxvYWRQYXJhZygpOw0KKyAgbV9wRW5kUGFyYWctPkdldExpbmVSYW5nZShuRW5kTGluZSAtIG5FbmRMaW5lSW5QYXJhZywgblBhZ2VFbmQsIG5UZW1wKTsNCisgIG5QYWdlRW5kICs9IChuVGVtcCAtIDEpOw0KKyAgRlhfQk9PTCBiVmVydGlhbCA9IHBQYXJhbXMtPmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsOw0KKyAgRlhfQk9PTCBiTGluZVJlc2VydmUgPQ0KKyAgICAgIHBQYXJhbXMtPmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0xpbmVSZXNlcnZlOw0KKyAgRlhfRkxPQVQgZkxpbmVTdGFydCA9DQorICAgICAgYlZlcnRpYWwNCisgICAgICAgICAgPyAoYkxpbmVSZXNlcnZlID8gKHBQYXJhbXMtPmZQbGF0ZVdpZHRoIC0gcFBhcmFtcy0+ZkxpbmVTcGFjZSkgOiAwLjBmKQ0KKyAgICAgICAgICA6IDAuMGY7DQorICBGWF9GTE9BVCBmTGluZVN0ZXAgPQ0KKyAgICAgIChiVmVydGlhbCAmJiBiTGluZVJlc2VydmUpID8gKC1wUGFyYW1zLT5mTGluZVNwYWNlKSA6IHBQYXJhbXMtPmZMaW5lU3BhY2U7DQorICBGWF9GTE9BVCBmTGluZVBvcyA9IGZMaW5lU3RhcnQ7DQorICBpZiAobV9wVGV4dFNldCA9PSBOVUxMKSB7DQorICAgIG1fcFRleHRTZXQgPSBGWF9ORVcgQ0ZERV9UeHRFZHRUZXh0U2V0KHRoaXMpOw0KKyAgfQ0KKyAgbV9QaWVjZU1hc3NBcnIuUmVtb3ZlQWxsKFRSVUUpOw0KKyAgRlhfRFdPUkQgZHdCcmVha1N0YXR1cyA9IEZYX1RYVEJSRUFLX05vbmU7DQorICBpbnQzMl90IG5MaW5lU3RhcnQgPSBuUGFnZVN0YXJ0Ow0KKyAgaW50MzJfdCBuUGllY2VTdGFydCA9IDA7DQorICBpZiAobV9wQ2hhcldpZHRoICE9IE5VTEwpIHsNCisgICAgZGVsZXRlW10gbV9wQ2hhcldpZHRoOw0KKyAgfQ0KKyAgbV9wQ2hhcldpZHRoID0gbmV3IGludDMyX3RbblBhZ2VFbmQgLSBuUGFnZVN0YXJ0ICsgMV07DQorICBwQnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgIHBCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgbV9uUGFnZVN0YXJ0ID0gblBhZ2VTdGFydDsNCisgIG1fbkNoYXJDb3VudCA9IG5QYWdlRW5kIC0gblBhZ2VTdGFydCArIDE7DQorICBGWF9CT09MIGJSZWxvYWQgPSBGQUxTRTsNCisgIEZYX0ZMT0FUIGZEZWZDaGFyV2lkdGggPSAwOw0KKyAgSUZYX0NoYXJJdGVyKiBwSXRlciA9IG1fcEl0ZXItPkNsb25lKCk7DQorICBwSXRlci0+U2V0QXQoblBhZ2VTdGFydCk7DQorICBtX3BJdGVyLT5TZXRBdChuUGFnZVN0YXJ0KTsNCisgIGludDMyX3QgblRleHRFbmQgPSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmTGVuZ3RoKCk7DQorICBGWF9CT09MIGJGaXJzdFBpZWNlID0gVFJVRTsNCisgIGRvIHsNCisgICAgaWYgKGJSZWxvYWQpIHsNCisgICAgICBkd0JyZWFrU3RhdHVzID0gcEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfV0NIQVIgd0FwcGVuZCA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgICAgZHdCcmVha1N0YXR1cyA9IHBCcmVhay0+QXBwZW5kQ2hhcih3QXBwZW5kKTsNCisgICAgfQ0KKyAgICBpZiAocEl0ZXItPkdldEF0KCkgPT0gblBhZ2VFbmQgJiYgZHdCcmVha1N0YXR1cyA8IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykgew0KKyAgICAgIGR3QnJlYWtTdGF0dXMgPSBwQnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgICAgfQ0KKyAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICBpbnQzMl90IG5QaWVjZUNvdW50ID0gcEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7DQorICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgblBpZWNlQ291bnQ7IGorKykgew0KKyAgICAgICAgY29uc3QgQ0ZYX1R4dFBpZWNlKiBwUGllY2UgPSBwQnJlYWstPkdldEJyZWFrUGllY2Uoaik7DQorICAgICAgICBGREVfVEVYVEVESVRQSUVDRSBUeHRFZHRQaWVjZTsNCisgICAgICAgIEZYU1lTX21lbXNldCgmVHh0RWR0UGllY2UsIDAsIHNpemVvZihGREVfVEVYVEVESVRQSUVDRSkpOw0KKyAgICAgICAgVHh0RWR0UGllY2UubkJpZGlMZXZlbCA9IHBQaWVjZS0+bV9pQmlkaUxldmVsOw0KKyAgICAgICAgVHh0RWR0UGllY2UubkNvdW50ID0gcFBpZWNlLT5HZXRMZW5ndGgoKTsNCisgICAgICAgIFR4dEVkdFBpZWNlLm5TdGFydCA9IG5QaWVjZVN0YXJ0Ow0KKyAgICAgICAgVHh0RWR0UGllY2UuZHdDaGFyU3R5bGVzID0gcFBpZWNlLT5tX2R3Q2hhclN0eWxlczsNCisgICAgICAgIGlmIChGWF9Jc09kZChwUGllY2UtPm1faUJpZGlMZXZlbCkpIHsNCisgICAgICAgICAgVHh0RWR0UGllY2UuZHdDaGFyU3R5bGVzIHw9IEZYX1RYVENIQVJTVFlMRV9PZGRCaWRpTGV2ZWw7DQorICAgICAgICB9DQorICAgICAgICBGWF9GTE9BVCBmUGFyYUJyZWFrV2lkdGggPSAwLjBmOw0KKyAgICAgICAgaWYgKHBQaWVjZS0+bV9kd1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICAgICAgRlhfV0NIQVIgd1J0Q2hhciA9IHBQYXJhbXMtPndMaW5lQnJlYWtDaGFyOw0KKyAgICAgICAgICBpZiAoVHh0RWR0UGllY2UubkNvdW50ID49IDIpIHsNCisgICAgICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IHBCdWYtPkdldENoYXJCeUluZGV4KA0KKyAgICAgICAgICAgICAgICBtX25QYWdlU3RhcnQgKyBUeHRFZHRQaWVjZS5uU3RhcnQgKyBUeHRFZHRQaWVjZS5uQ291bnQgLSAxKTsNCisgICAgICAgICAgICBGWF9XQ0hBUiB3Q2hhclByZSA9IHBCdWYtPkdldENoYXJCeUluZGV4KA0KKyAgICAgICAgICAgICAgICBtX25QYWdlU3RhcnQgKyBUeHRFZHRQaWVjZS5uU3RhcnQgKyBUeHRFZHRQaWVjZS5uQ291bnQgLSAyKTsNCisgICAgICAgICAgICBpZiAod0NoYXIgPT0gd1J0Q2hhcikgew0KKyAgICAgICAgICAgICAgZlBhcmFCcmVha1dpZHRoICs9IGZEZWZDaGFyV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh3Q2hhclByZSA9PSB3UnRDaGFyKSB7DQorICAgICAgICAgICAgICBmUGFyYUJyZWFrV2lkdGggKz0gZkRlZkNoYXJXaWR0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSBpZiAoVHh0RWR0UGllY2UubkNvdW50ID49IDEpIHsNCisgICAgICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IHBCdWYtPkdldENoYXJCeUluZGV4KA0KKyAgICAgICAgICAgICAgICBtX25QYWdlU3RhcnQgKyBUeHRFZHRQaWVjZS5uU3RhcnQgKyBUeHRFZHRQaWVjZS5uQ291bnQgLSAxKTsNCisgICAgICAgICAgICBpZiAod0NoYXIgPT0gd1J0Q2hhcikgew0KKyAgICAgICAgICAgICAgZlBhcmFCcmVha1dpZHRoICs9IGZEZWZDaGFyV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAocFBhcmFtcy0+ZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwpIHsNCisgICAgICAgICAgVHh0RWR0UGllY2UucnRQaWVjZS5sZWZ0ID0gZkxpbmVQb3M7DQorICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UudG9wID0gKEZYX0ZMT0FUKXBQaWVjZS0+bV9pU3RhcnRQb3MgLyAyMDAwMC4wZjsNCisgICAgICAgICAgVHh0RWR0UGllY2UucnRQaWVjZS53aWR0aCA9IHBQYXJhbXMtPmZMaW5lU3BhY2U7DQorICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UuaGVpZ2h0ID0NCisgICAgICAgICAgICAgIChGWF9GTE9BVClwUGllY2UtPm1faVdpZHRoIC8gMjAwMDAuMGYgKyBmUGFyYUJyZWFrV2lkdGg7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBUeHRFZHRQaWVjZS5ydFBpZWNlLmxlZnQgPSAoRlhfRkxPQVQpcFBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmOw0KKyAgICAgICAgICBUeHRFZHRQaWVjZS5ydFBpZWNlLnRvcCA9IGZMaW5lUG9zOw0KKyAgICAgICAgICBUeHRFZHRQaWVjZS5ydFBpZWNlLndpZHRoID0NCisgICAgICAgICAgICAgIChGWF9GTE9BVClwUGllY2UtPm1faVdpZHRoIC8gMjAwMDAuMGYgKyBmUGFyYUJyZWFrV2lkdGg7DQorICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UuaGVpZ2h0ID0gcFBhcmFtcy0+ZkxpbmVTcGFjZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiRmlyc3RQaWVjZSkgew0KKyAgICAgICAgICBtX3J0UGFnZUNvbnRlbnRzID0gVHh0RWR0UGllY2UucnRQaWVjZTsNCisgICAgICAgICAgYkZpcnN0UGllY2UgPSBGQUxTRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIG1fcnRQYWdlQ29udGVudHMuVW5pb24oVHh0RWR0UGllY2UucnRQaWVjZSk7DQorICAgICAgICB9DQorICAgICAgICBuUGllY2VTdGFydCArPSBUeHRFZHRQaWVjZS5uQ291bnQ7DQorICAgICAgICBtX1BpZWNlTWFzc0Fyci5BZGQoVHh0RWR0UGllY2UpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgVHh0RWR0UGllY2UubkNvdW50OyBrKyspIHsNCisgICAgICAgICAgQ0ZYX0NoYXIqIHB0YyA9IHBQaWVjZS0+R2V0Q2hhclB0cihrKTsNCisgICAgICAgICAgbV9wQ2hhcldpZHRoW1R4dEVkdFBpZWNlLm5TdGFydCArIGtdID0gcHRjLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGZMaW5lUG9zICs9IGZMaW5lU3RlcDsNCisgICAgICBwQnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCisgICAgfQ0KKyAgICBpZiAocEl0ZXItPkdldEF0KCkgPT0gblBhZ2VFbmQgJiYgZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsNCisgICAgICBiUmVsb2FkID0gVFJVRTsNCisgICAgICBwSXRlci0+TmV4dChUUlVFKTsNCisgICAgfQ0KKyAgfSB3aGlsZSAocEl0ZXItPk5leHQoRkFMU0UpICYmIChwSXRlci0+R2V0QXQoKSA8PSBuUGFnZUVuZCkpOw0KKyAgaWYgKG1fcnRQYWdlQ29udGVudHMubGVmdCAhPSAwKSB7DQorICAgIEZYX0ZMT0FUIGZEZWx0YSA9IDAuMGY7DQorICAgIGlmIChtX3J0UGFnZUNvbnRlbnRzLndpZHRoIDwgcFBhcmFtcy0+ZlBsYXRlV2lkdGgpIHsNCisgICAgICBpZiAocFBhcmFtcy0+ZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9SaWdodCkgew0KKyAgICAgICAgZkRlbHRhID0gcFBhcmFtcy0+ZlBsYXRlV2lkdGggLSBtX3J0UGFnZUNvbnRlbnRzLndpZHRoOw0KKyAgICAgIH0gZWxzZSBpZiAocFBhcmFtcy0+ZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9DZW50ZXIpIHsNCisgICAgICAgIGlmICgocFBhcmFtcy0+ZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQpICYmDQorICAgICAgICAgICAgbV9uQ2hhckNvdW50ID4gMSkgew0KKyAgICAgICAgICBpbnQzMl90IG5Db3VudCA9IG1fbkNoYXJDb3VudCAtIDE7DQorICAgICAgICAgIGludDMyX3QgbiA9IChtX3BFZGl0RW5naW5lLT5tX25MaW1pdCAtIG5Db3VudCkgLyAyOw0KKyAgICAgICAgICBmRGVsdGEgPSAobV9ydFBhZ2VDb250ZW50cy53aWR0aCAvIG5Db3VudCkgKiBuOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZkRlbHRhID0gKHBQYXJhbXMtPmZQbGF0ZVdpZHRoIC0gbV9ydFBhZ2VDb250ZW50cy53aWR0aCkgLyAyOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmT2Zmc2V0ID0gbV9ydFBhZ2VDb250ZW50cy5sZWZ0IC0gZkRlbHRhOw0KKyAgICBpbnQzMl90IG5Db3VudCA9IG1fUGllY2VNYXNzQXJyLkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgICBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KKyAgICAgIHBQaWVjZS0+cnRQaWVjZS5PZmZzZXQoLWZPZmZzZXQsIDAuMGYpOw0KKyAgICB9DQorICAgIG1fcnRQYWdlQ29udGVudHMuT2Zmc2V0KC1mT2Zmc2V0LCAwLjBmKTsNCisgIH0NCisgIGlmIChtX3BFZGl0RW5naW5lLT5HZXRFZGl0UGFyYW1zKCktPmR3TGF5b3V0U3R5bGVzICYNCisgICAgICBGREVfVEVYVEVESVRMQVlPVVRfTGFzdExpbmVIZWlnaHQpIHsNCisgICAgbV9ydFBhZ2VDb250ZW50cy5oZWlnaHQgLT0gcFBhcmFtcy0+ZkxpbmVTcGFjZSAtIHBQYXJhbXMtPmZGb250U2l6ZTsNCisgICAgaW50MzJfdCBuQ291bnQgPSBtX1BpZWNlTWFzc0Fyci5HZXRTaXplKCk7DQorICAgIEZERV9MUFRFWFRFRElUUElFQ0UgcFBpZWNlID0gbV9QaWVjZU1hc3NBcnIuR2V0UHRyQXQobkNvdW50IC0gMSk7DQorICAgIHBQaWVjZS0+cnRQaWVjZS5oZWlnaHQgPSBwUGFyYW1zLT5mRm9udFNpemU7DQorICB9DQorICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgbV9uUmVmQ291bnQgPSAxOw0KKyAgbV9iTG9hZGVkID0gVFJVRTsNCisgIHJldHVybiAwOw0KK30NCit2b2lkIENGREVfVHh0RWR0UGFnZTo6VW5sb2FkUGFnZShGWF9MUENSRUNURiBwQ2xpcEJveCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fblJlZkNvdW50ID4gMCk7DQorICBtX25SZWZDb3VudC0tOw0KKyAgaWYgKG1fblJlZkNvdW50ID09IDApIHsNCisgICAgbV9QaWVjZU1hc3NBcnIuUmVtb3ZlQWxsKCk7DQogICAgIGlmIChtX3BUZXh0U2V0KSB7DQotICAgICAgICBkZWxldGUgbV9wVGV4dFNldDsNCi0gICAgICAgIG1fcFRleHRTZXQgPSBOVUxMOw0KKyAgICAgIGRlbGV0ZSBtX3BUZXh0U2V0Ow0KKyAgICAgIG1fcFRleHRTZXQgPSBOVUxMOw0KICAgICB9DQogICAgIGlmIChtX3BDaGFyV2lkdGgpIHsNCi0gICAgICAgIGRlbGV0ZSBbXSBtX3BDaGFyV2lkdGg7DQotICAgICAgICBtX3BDaGFyV2lkdGggPSBOVUxMOw0KKyAgICAgIGRlbGV0ZVtdIG1fcENoYXJXaWR0aDsNCisgICAgICBtX3BDaGFyV2lkdGggPSBOVUxMOw0KICAgICB9DQotICAgIGlmIChtX3BJdGVyICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcEl0ZXItPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcEl0ZXIgPSBOVUxMOw0KKyAgICBpZiAobV9wQmduUGFyYWcpIHsNCisgICAgICBtX3BCZ25QYXJhZy0+VW5sb2FkUGFyYWcoKTsNCiAgICAgfQ0KKyAgICBpZiAobV9wRW5kUGFyYWcpIHsNCisgICAgICBtX3BFbmRQYXJhZy0+VW5sb2FkUGFyYWcoKTsNCisgICAgfQ0KKyAgICBpZiAobV9wSXRlcikgew0KKyAgICAgIG1fcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgICBtX3BJdGVyID0gTlVMTDsNCisgICAgfQ0KKyAgICBtX3BCZ25QYXJhZyA9IE5VTEw7DQorICAgIG1fcEVuZFBhcmFnID0gTlVMTDsNCisgIH0NCisgIHJldHVybjsNCiB9DQotdm9pZCBDRkRFX1R4dEVkdFBhZ2U6OlJlbGVhc2UoKQ0KLXsNCi0gICAgZGVsZXRlIHRoaXM7DQorY29uc3QgQ0ZYX1JlY3RGJiBDRkRFX1R4dEVkdFBhZ2U6OkdldENvbnRlbnRzQm94KCkgew0KKyAgcmV0dXJuIG1fcnRQYWdlQ29udGVudHM7DQogfQ0KLUlGREVfVHh0RWR0RW5naW5lICogQ0ZERV9UeHRFZHRQYWdlOjpHZXRFbmdpbmUoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIChJRkRFX1R4dEVkdEVuZ2luZSopbV9wRWRpdEVuZ2luZTsNCi19DQotRkRFX1ZJU1VBTE9CSlRZUEUgQ0ZERV9UeHRFZHRQYWdlOjpHZXRUeXBlKCkNCi17DQotICAgIHJldHVybiBGREVfVklTVUFMT0JKX1RleHQ7DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRQYWdlOjpHZXRCQm94KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiAmYmJveCkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDRkRFX1R4dEVkdFBhZ2U6OkdldE1hdHJpeChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfTWF0cml4ICZtYXRyaXgpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRQYWdlOjpHZXRSZWN0KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiAmcnQpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ0ZERV9UeHRFZHRQYWdlOjpHZXRDbGlwKEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiAmcnQpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRQYWdlOjpHZXRDaGFyUmVjdChpbnQzMl90IG5JbmRleCwgQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJCQm94ICkgY29uc3QNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX25SZWZDb3VudCA+IDApOw0KLSAgICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9uQ2hhckNvdW50KTsNCi0gICAgaWYgKG1fblJlZkNvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaW50MzJfdCBuQ291bnQgPSBtX1BpZWNlTWFzc0Fyci5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgY29uc3QgRkRFX0xQVEVYVEVESVRQSUVDRSAgcFBpZWNlID0gbV9QaWVjZU1hc3NBcnIuR2V0UHRyQXQoaSk7DQotICAgICAgICBpZiAobkluZGV4ID49IHBQaWVjZS0+blN0YXJ0ICYmIG5JbmRleCA8IChwUGllY2UtPm5TdGFydCArIHBQaWVjZS0+bkNvdW50KSkgew0KLSAgICAgICAgICAgIENGWF9SZWN0RkFycmF5IHJlY3RBcnI7DQotICAgICAgICAgICAgaWYgKGJCQm94KSB7DQotICAgICAgICAgICAgICAgIG1fcFRleHRTZXQtPkdldENoYXJSZWN0c19JbXBsKChGREVfSFZJU1VBTE9CSilwUGllY2UsIHJlY3RBcnIsIGJCQm94KTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX3BUZXh0U2V0LT5HZXRDaGFyUmVjdHMoKEZERV9IVklTVUFMT0JKKXBQaWVjZSwgcmVjdEFycik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlY3QgPSByZWN0QXJyW25JbmRleCAtIHBQaWVjZS0+blN0YXJ0XTsNCi0gICAgICAgICAgICByZXR1cm4gcFBpZWNlLT5uQmlkaUxldmVsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIEZYU1lTX2Fzc2VydCgwKTsNCi0gICAgcmV0dXJuIDA7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRQYWdlOjpHZXRDaGFySW5kZXgoY29uc3QgQ0ZYX1BvaW50RiAmZlBvaW50LCBGWF9CT09MICZiQmVmb3JlKQ0KLXsNCi0gICAgRlhfQk9PTAliVmVydGljYWwJPSBtX3BFZGl0RW5naW5lLT5HZXRFZGl0UGFyYW1zKCktPmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsOw0KLSAgICBDRlhfUG9pbnRGIHB0RiA9IGZQb2ludDsNCi0gICAgTm9ybWFsaXplUHQyUmVjdChwdEYsIG1fcnRQYWdlQ29udGVudHMsIEZERV9UWFRFRFRfVE9MRVJBTkNFKTsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBtX1BpZWNlTWFzc0Fyci5HZXRTaXplKCk7DQotICAgIENGWF9SZWN0RiBydExpbmU7DQotICAgIGludDMyX3QgbkJnbiA9IDA7DQotICAgIGludDMyX3QgbkVuZCA9IDA7DQotICAgIEZYX0JPT0wgYkluTGluZSA9IEZBTFNFOw0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQotICAgICAgICBjb25zdCBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KLSAgICAgICAgaWYgKCFiSW5MaW5lICYmIChiVmVydGljYWwgPyAocFBpZWNlLT5ydFBpZWNlLmxlZnQgPD0gcHRGLnggJiYgcFBpZWNlLT5ydFBpZWNlLnJpZ2h0KCkgPiBwdEYueCkgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICA6IChwUGllY2UtPnJ0UGllY2UudG9wIDw9IHB0Ri55ICYmIHBQaWVjZS0+cnRQaWVjZS5ib3R0b20oKSA+IHB0Ri55KSkpIHsNCi0gICAgICAgICAgICBuQmduID0gbkVuZCA9IGk7DQotICAgICAgICAgICAgcnRMaW5lID0gcFBpZWNlLT5ydFBpZWNlOw0KLSAgICAgICAgICAgIGJJbkxpbmUgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIGlmIChiSW5MaW5lKSB7DQotICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbCA/ICghKHBQaWVjZS0+cnRQaWVjZS5sZWZ0IDw9IHB0Ri54ICYmIHBQaWVjZS0+cnRQaWVjZS5yaWdodCgpID4gcHRGLngpKSA6IFwNCi0gICAgICAgICAgICAgICAgICAgIChwUGllY2UtPnJ0UGllY2UuYm90dG9tKCkgPD0gcHRGLnkgfHwgcFBpZWNlLT5ydFBpZWNlLnRvcCA+IHB0Ri55KSkgew0KLSAgICAgICAgICAgICAgICBuRW5kID0gaSAtIDE7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJ0TGluZS5VbmlvbihwUGllY2UtPnJ0UGllY2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBOb3JtYWxpemVQdDJSZWN0KHB0RiwgcnRMaW5lLCBGREVfVFhURURUX1RPTEVSQU5DRSk7DQotICAgIGludDMyX3QgbkNhcmV0ID0gMDsNCi0gICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwUGllY2UgPSBOVUxMOw0KLSAgICBmb3IgKGkgPSBuQmduOyBpIDw9IG5FbmQ7IGkgKyspIHsNCi0gICAgICAgIHBQaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KLSAgICAgICAgbkNhcmV0ID0gbV9uUGFnZVN0YXJ0ICsgcFBpZWNlLT5uU3RhcnQ7DQotICAgICAgICBpZiAocFBpZWNlLT5ydFBpZWNlLkNvbnRhaW5zKHB0RikpIHsNCi0gICAgICAgICAgICBDRlhfUmVjdEZBcnJheSByZWN0QXJyOw0KLSAgICAgICAgICAgIG1fcFRleHRTZXQtPkdldENoYXJSZWN0cygoRkRFX0hWSVNVQUxPQkopcFBpZWNlLCByZWN0QXJyKTsNCi0gICAgICAgICAgICBpbnQzMl90IG5SdENvdW50ID0gcmVjdEFyci5HZXRTaXplKCk7DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgblJ0Q291bnQ7IGogKyspIHsNCi0gICAgICAgICAgICAgICAgaWYgKHJlY3RBcnJbal0uQ29udGFpbnMocHRGKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbkNhcmV0ID0gbV9uUGFnZVN0YXJ0ICsgcFBpZWNlLT5uU3RhcnQgKyBqOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5DYXJldCA+PSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmTGVuZ3RoKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiQmVmb3JlID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd0NoYXIgPSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmKCktPkdldENoYXJCeUluZGV4KG5DYXJldCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAod0NoYXIgPT0gTCdcbicgfHwgd0NoYXIgPT0gTCdccicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod0NoYXIgPT0gTCdcbicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcEVkaXRFbmdpbmUtPkdldFRleHRCdWYoKS0+R2V0Q2hhckJ5SW5kZXgobkNhcmV0IC0gMSkgPT0gTCdccicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DYXJldCAtLTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBiQmVmb3JlID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbkNhcmV0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbCA/IChwdEYueSA+ICgocmVjdEFycltqXS50b3AgKyByZWN0QXJyW2pdLmJvdHRvbSgpKSAvIDIpKSA6IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0Ri54ID4gKChyZWN0QXJyW2pdLmxlZnQgKyByZWN0QXJyW2pdLnJpZ2h0KCkpIC8gMikpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYkJlZm9yZSA9IEZYX0lzT2RkKHBQaWVjZS0+bkJpZGlMZXZlbCk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJCZWZvcmUgPSAhRlhfSXNPZGQocFBpZWNlLT5uQmlkaUxldmVsKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuQ2FyZXQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgYkJlZm9yZSA9IFRSVUU7DQotICAgIHJldHVybiBuQ2FyZXQ7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRQYWdlOjpHZXRDaGFyU3RhcnQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fblBhZ2VTdGFydDsNCi19DQotaW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJDb3VudCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9uQ2hhckNvdW50Ow0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0UGFnZTo6R2V0RGlzcGxheVBvcyhjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCwgRlhURVhUX0NIQVJQT1MgKiZwQ2hhclBvcywgRlhfTFBSRUNURiBwQkJveCApIGNvbnN0DQotew0KLSAgICBwQ2hhclBvcyA9IChGWFRFWFRfQ0hBUlBPUyopRkRFX0FsbG9jKHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBtX25DaGFyQ291bnQpOw0KLSAgICBpbnQzMl90CQluQ2hhclBvc0NvdW50CT0gMDsNCi0gICAgRkRFX0hWSVNVQUxPQkoJaFZpc3VhbE9iagkJPSBOVUxMOw0KLSAgICBpbnQzMl90CQluVmlzdWFsT2JqQ291bnQJPSBtX1BpZWNlTWFzc0Fyci5HZXRTaXplKCk7DQotICAgIEZYVEVYVF9DSEFSUE9TKglwb3MJCQkJPSBwQ2hhclBvczsNCi0gICAgQ0ZYX1JlY3RGIHJ0T2JqOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuVmlzdWFsT2JqQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIGhWaXN1YWxPYmogPSAoRkRFX0hWSVNVQUxPQkopbV9QaWVjZU1hc3NBcnIuR2V0UHRyQXQoaSk7DQotICAgICAgICBtX3BUZXh0U2V0LT5HZXRSZWN0KGhWaXN1YWxPYmosIHJ0T2JqKTsNCi0gICAgICAgIGlmICghcnRDbGlwLkludGVyc2VjdFdpdGgocnRPYmopKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IG5Db3VudAk9IG1fcFRleHRTZXQtPkdldERpc3BsYXlQb3MoaFZpc3VhbE9iaiwgcG9zLCBGQUxTRSk7DQotICAgICAgICBuQ2hhclBvc0NvdW50CSs9IG5Db3VudDsNCi0gICAgICAgIHBvcwkJCQkrPSBuQ291bnQ7DQotICAgIH0NCi0gICAgaWYgKChuQ2hhclBvc0NvdW50ICogNSkgPCAobV9uQ2hhckNvdW50IDw8IDIpKSB7DQotICAgICAgICBpbnQzMl90IG5MZW5ndGggPSBzaXplb2YoRlhURVhUX0NIQVJQT1MpICogbkNoYXJQb3NDb3VudDsNCi0gICAgICAgIEZYVEVYVF9DSEFSUE9TICogcFRlbXAgPSAoRlhURVhUX0NIQVJQT1MqKUZERV9BbGxvYyhuTGVuZ3RoKTsNCi0gICAgICAgIEZYU1lTX21lbWNweShwVGVtcCwgcENoYXJQb3MsIG5MZW5ndGgpOw0KLSAgICAgICAgRkRFX0ZyZWUocENoYXJQb3MpOw0KLSAgICAgICAgcENoYXJQb3MgPSBwVGVtcDsNCi0gICAgfQ0KLSAgICByZXR1cm4gbkNoYXJQb3NDb3VudDsNCi19DQotdm9pZCBDRkRFX1R4dEVkdFBhZ2U6OkNhbGNSYW5nZVJlY3RBcnJheShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQsIENGWF9SZWN0RkFycmF5ICZSZWN0RkFycikgY29uc3QNCi17DQotICAgIGludDMyX3QJblBpZWNlQ291bnQJPSBtX1BpZWNlTWFzc0Fyci5HZXRTaXplKCk7DQotICAgIGludDMyX3QJbkVuZAkJPSBuU3RhcnQgKyBuQ291bnQgLSAxOw0KLSAgICBGWF9CT09MCQliSW5SYW5nZQk9IEZBTFNFOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuUGllY2VDb3VudDsgaSArKykgew0KLSAgICAgICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KLSAgICAgICAgaWYgKCFiSW5SYW5nZSkgew0KLSAgICAgICAgICAgIGlmIChuU3RhcnQgPj0gcGllY2UtPm5TdGFydCAmJiBuU3RhcnQgPCAocGllY2UtPm5TdGFydCArIHBpZWNlLT5uQ291bnQpKSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgblJhbmdlRW5kID0gcGllY2UtPm5Db3VudCAtIDE7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuZCA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICBpZiAobkVuZCA+PSBwaWVjZS0+blN0YXJ0ICYmIG5FbmQgPCAocGllY2UtPm5TdGFydCArIHBpZWNlLT5uQ291bnQpKSB7DQotICAgICAgICAgICAgICAgICAgICBuUmFuZ2VFbmQgPSBuRW5kIC0gcGllY2UtPm5TdGFydDsNCi0gICAgICAgICAgICAgICAgICAgIGJFbmQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENGWF9SZWN0RkFycmF5IHJjQXJyOw0KLSAgICAgICAgICAgICAgICBtX3BUZXh0U2V0LT5HZXRDaGFyUmVjdHMoKEZERV9IVklTVUFMT0JKKXBpZWNlLCByY0Fycik7DQotICAgICAgICAgICAgICAgIGludDMyX3QgblNpemUgPSByY0Fyci5HZXRTaXplKCk7DQotICAgICAgICAgICAgICAgIENGWF9SZWN0RiByZWN0UGllY2UgPSByY0FycltuU3RhcnQgLSBwaWVjZS0+blN0YXJ0XTsNCi0gICAgICAgICAgICAgICAgcmVjdFBpZWNlLlVuaW9uKHJjQXJyW25SYW5nZUVuZF0pOw0KLSAgICAgICAgICAgICAgICBSZWN0RkFyci5BZGQocmVjdFBpZWNlKTsNCi0gICAgICAgICAgICAgICAgaWYgKGJFbmQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBiSW5SYW5nZSA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAobkVuZCA+PSBwaWVjZS0+blN0YXJ0ICYmIG5FbmQgPCAocGllY2UtPm5TdGFydCArIHBpZWNlLT5uQ291bnQpKSB7DQotICAgICAgICAgICAgICAgIENGWF9SZWN0RkFycmF5IHJjQXJyOw0KLSAgICAgICAgICAgICAgICBtX3BUZXh0U2V0LT5HZXRDaGFyUmVjdHMoKEZERV9IVklTVUFMT0JKKXBpZWNlLCByY0Fycik7DQotICAgICAgICAgICAgICAgIENGWF9SZWN0RiByZWN0UGllY2UgPSByY0FyclswXTsNCi0gICAgICAgICAgICAgICAgcmVjdFBpZWNlLlVuaW9uKHJjQXJyW25FbmQgLSBwaWVjZS0+blN0YXJ0XSk7DQotICAgICAgICAgICAgICAgIFJlY3RGQXJyLkFkZChyZWN0UGllY2UpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFJlY3RGQXJyLkFkZChwaWVjZS0+cnRQaWVjZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi1pbnQzMl90IENGREVfVHh0RWR0UGFnZTo6U2VsZWN0V29yZChjb25zdCBDRlhfUG9pbnRGICZmUG9pbnQsIGludDMyX3QgJm5Db3VudCkNCi17DQotICAgIGlmIChtX25SZWZDb3VudCA8IDApIHsNCi0gICAgICAgIHJldHVybiAtIDE7DQotICAgIH0NCi0gICAgSUZERV9UeHRFZHRCdWYgKiBwQnVmID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1ZigpOw0KLSAgICBGWF9CT09MIGJCZWZvcmU7DQotICAgIGludDMyX3QgbkluZGV4ID0gR2V0Q2hhckluZGV4KGZQb2ludCwgYkJlZm9yZSk7DQotICAgIGlmIChuSW5kZXggPT0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpKSB7DQotICAgICAgICBuSW5kZXggPSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmTGVuZ3RoKCkgLSAxOw0KLSAgICB9DQotICAgIGlmIChuSW5kZXggPCAwKSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgSUZYX1dvcmRCcmVhayAqIHBJdGVyID0gRlhfV29yZEJyZWFrX0NyZWF0ZSgpOw0KLSAgICBwSXRlci0+QXR0YWNoKEZYX05FVyBDRkRFX1R4dEVkdEJ1Zkl0ZXIoKENGREVfVHh0RWR0QnVmKilwQnVmKSk7DQotICAgIHBJdGVyLT5TZXRBdChuSW5kZXgpOw0KLSAgICBuQ291bnQgPSBwSXRlci0+R2V0V29yZExlbmd0aCgpOw0KLSAgICBpbnQzMl90IG5SZXQgPSBwSXRlci0+R2V0V29yZFBvcygpOw0KLSAgICBwSXRlci0+UmVsZWFzZSgpOw0KLSAgICByZXR1cm4gblJldDsNCi19DQotRlhfQk9PTCBDRkRFX1R4dEVkdFBhZ2U6OklzTG9hZGVkKEZYX0xQQ1JFQ1RGIHBDbGlwQm94ICkNCi17DQotICAgIHJldHVybiBtX2JMb2FkZWQ7DQotfQ0KLWludDMyX3QgQ0ZERV9UeHRFZHRQYWdlOjpMb2FkUGFnZShGWF9MUENSRUNURiBwQ2xpcEJveCAsIElGWF9QYXVzZSAqcFBhdXNlICkNCi17DQotICAgIGlmIChtX25SZWZDb3VudCA+IDApIHsNCi0gICAgICAgIG1fblJlZkNvdW50ICsrOw0KLSAgICAgICAgcmV0dXJuIG1fblJlZkNvdW50Ow0KLSAgICB9DQotICAgIElGREVfVHh0RWR0QnVmICogcEJ1Zgk9IG1fcEVkaXRFbmdpbmUtPkdldFRleHRCdWYoKTsNCi0gICAgY29uc3QgRkRFX1RYVEVEVFBBUkFNUyAqIHBQYXJhbXMgPSBtX3BFZGl0RW5naW5lLT5HZXRFZGl0UGFyYW1zKCk7DQotICAgIGlmIChtX3BJdGVyICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcEl0ZXItPlJlbGVhc2UoKTsNCi0gICAgfQ0KLSAgICBGWF9XQ0hBUiB3Y0FsaWFzID0gMDsNCi0gICAgaWYgKHBQYXJhbXMtPmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfUGFzc3dvcmQpIHsNCi0gICAgICAgIHdjQWxpYXMgPSBtX3BFZGl0RW5naW5lLT5HZXRBbGlhc0NoYXIoKTsNCi0gICAgfQ0KLSAgICBtX3BJdGVyID0gRlhfTkVXIENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKXBCdWYsIHdjQWxpYXMpOw0KLSAgICBJRlhfVHh0QnJlYWsgKglwQnJlYWsJPSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnJlYWsoKTsNCi0gICAgcEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQotICAgIHBCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KLSAgICBpbnQzMl90IG5MaW5lQ291bnQJCT0gbV9wRWRpdEVuZ2luZS0+R2V0TGluZUNvdW50KCk7DQotICAgIGludDMyX3QgblBhZ2VMaW5lQ291bnQgPSBtX3BFZGl0RW5naW5lLT5HZXRQYWdlTGluZUNvdW50KCk7DQotICAgIGludDMyX3Qgbkxlbmd0aCA9IHBCdWYtPkdldFRleHRMZW5ndGgoKTsNCi0gICAgaW50MzJfdCBuU3RhcnRMaW5lCT0gblBhZ2VMaW5lQ291bnQgKiBtX25QYWdlSW5kZXg7DQotICAgIGludDMyX3QgbkVuZExpbmUJPSBGWF9NSU4oKG5TdGFydExpbmUgKyBuUGFnZUxpbmVDb3VudCAtIDEpLCAobV9wRWRpdEVuZ2luZS0+R2V0TGluZUNvdW50KCkgLSAxKSk7DQotICAgIGludDMyX3QgblBhZ2VTdGFydCwgblBhZ2VFbmQsIG5UZW1wLCBuQmduUGFyYWcsIG5TdGFydExpbmVJblBhcmFnLCBuRW5kUGFyYWcsIG5FbmRMaW5lSW5QYXJhZzsNCi0gICAgbkJnblBhcmFnID0gbV9wRWRpdEVuZ2luZS0+TGluZTJQYXJhZygwLCAwLCBuU3RhcnRMaW5lLCBuU3RhcnRMaW5lSW5QYXJhZyk7DQotICAgIG1fcEJnblBhcmFnID0gKENGREVfVHh0RWR0UGFyYWcqKW1fcEVkaXRFbmdpbmUtPkdldFBhcmFnKG5CZ25QYXJhZyk7DQotICAgIG1fcEJnblBhcmFnLT5Mb2FkUGFyYWcoKTsNCi0gICAgbV9wQmduUGFyYWctPkdldExpbmVSYW5nZShuU3RhcnRMaW5lIC0gblN0YXJ0TGluZUluUGFyYWcsIG5QYWdlU3RhcnQsIG5UZW1wKTsNCi0gICAgbkVuZFBhcmFnID0gbV9wRWRpdEVuZ2luZS0+TGluZTJQYXJhZyhuQmduUGFyYWcsIG5TdGFydExpbmVJblBhcmFnLCBuRW5kTGluZSwgbkVuZExpbmVJblBhcmFnKTsNCi0gICAgbV9wRW5kUGFyYWcgPSAoQ0ZERV9UeHRFZHRQYXJhZyopbV9wRWRpdEVuZ2luZS0+R2V0UGFyYWcobkVuZFBhcmFnKTsNCi0gICAgbV9wRW5kUGFyYWctPkxvYWRQYXJhZygpOw0KLSAgICBtX3BFbmRQYXJhZy0+R2V0TGluZVJhbmdlKG5FbmRMaW5lIC0gbkVuZExpbmVJblBhcmFnLCBuUGFnZUVuZCwgblRlbXApOw0KLSAgICBuUGFnZUVuZCArPSAoblRlbXAgLSAxKTsNCi0gICAgRlhfQk9PTCBiVmVydGlhbCA9IHBQYXJhbXMtPmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsOw0KLSAgICBGWF9CT09MIGJMaW5lUmVzZXJ2ZSA9IHBQYXJhbXMtPmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0xpbmVSZXNlcnZlOw0KLSAgICBGWF9GTE9BVCBmTGluZVN0YXJ0ID0gYlZlcnRpYWwgPyAoYkxpbmVSZXNlcnZlID8gKHBQYXJhbXMtPmZQbGF0ZVdpZHRoIC0gcFBhcmFtcy0+ZkxpbmVTcGFjZSkgOiAwLjBmKSA6IDAuMGY7DQotICAgIEZYX0ZMT0FUIGZMaW5lU3RlcAk9IChiVmVydGlhbCAmJiBiTGluZVJlc2VydmUpID8gKC1wUGFyYW1zLT5mTGluZVNwYWNlKSA6IHBQYXJhbXMtPmZMaW5lU3BhY2U7DQotICAgIEZYX0ZMT0FUIGZMaW5lUG9zCT0gZkxpbmVTdGFydDsNCi0gICAgaWYgKG1fcFRleHRTZXQgPT0gTlVMTCkgew0KLSAgICAgICAgbV9wVGV4dFNldCA9IEZYX05FVyBDRkRFX1R4dEVkdFRleHRTZXQodGhpcyk7DQotICAgIH0NCi0gICAgbV9QaWVjZU1hc3NBcnIuUmVtb3ZlQWxsKFRSVUUpOw0KLSAgICBGWF9EV09SRCBkd0JyZWFrU3RhdHVzCT0gRlhfVFhUQlJFQUtfTm9uZTsNCi0gICAgaW50MzJfdCBuTGluZVN0YXJ0CQk9IG5QYWdlU3RhcnQ7DQotICAgIGludDMyX3QgblBpZWNlU3RhcnQJPSAwOw0KLSAgICBpZiAobV9wQ2hhcldpZHRoICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBbXSBtX3BDaGFyV2lkdGg7DQotICAgIH0NCi0gICAgbV9wQ2hhcldpZHRoID0gbmV3IGludDMyX3RbblBhZ2VFbmQgLSBuUGFnZVN0YXJ0ICsgMV07DQotICAgIHBCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KLSAgICBwQnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCi0gICAgbV9uUGFnZVN0YXJ0ID0gblBhZ2VTdGFydDsNCi0gICAgbV9uQ2hhckNvdW50ID0gblBhZ2VFbmQgLSBuUGFnZVN0YXJ0ICsgMTsNCi0gICAgRlhfQk9PTAkJYlJlbG9hZAkJCT0gRkFMU0U7DQotICAgIEZYX0ZMT0FUCWZEZWZDaGFyV2lkdGgJPSAwOw0KLSAgICBJRlhfQ2hhckl0ZXIgKiBwSXRlciA9IG1fcEl0ZXItPkNsb25lKCk7DQotICAgIHBJdGVyLT5TZXRBdChuUGFnZVN0YXJ0KTsNCi0gICAgbV9wSXRlci0+U2V0QXQoblBhZ2VTdGFydCk7DQotICAgIGludDMyX3QgblRleHRFbmQgPSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmTGVuZ3RoKCk7DQotICAgIEZYX0JPT0wJYkZpcnN0UGllY2UgPSBUUlVFOw0KLSAgICBkbyB7DQotICAgICAgICBpZiAoYlJlbG9hZCkgew0KLSAgICAgICAgICAgIGR3QnJlYWtTdGF0dXMgPSBwQnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhfV0NIQVIgd0FwcGVuZCA9IHBJdGVyLT5HZXRDaGFyKCk7DQotICAgICAgICAgICAgZHdCcmVha1N0YXR1cyA9IHBCcmVhay0+QXBwZW5kQ2hhcih3QXBwZW5kKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwSXRlci0+R2V0QXQoKSA9PSBuUGFnZUVuZCAmJiBkd0JyZWFrU3RhdHVzIDwgRlhfVFhUQlJFQUtfTGluZUJyZWFrKSB7DQotICAgICAgICAgICAgZHdCcmVha1N0YXR1cyA9IHBCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQotICAgICAgICAgICAgaW50MzJfdCBuUGllY2VDb3VudCA9IHBCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOw0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG5QaWVjZUNvdW50OyBqICsrKSB7DQotICAgICAgICAgICAgICAgIGNvbnN0IENGWF9UeHRQaWVjZSAqIHBQaWVjZSA9IHBCcmVhay0+R2V0QnJlYWtQaWVjZShqKTsNCi0gICAgICAgICAgICAgICAgRkRFX1RFWFRFRElUUElFQ0UgVHh0RWR0UGllY2U7DQotICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldCgmVHh0RWR0UGllY2UsIDAsIHNpemVvZihGREVfVEVYVEVESVRQSUVDRSkpOw0KLSAgICAgICAgICAgICAgICBUeHRFZHRQaWVjZS5uQmlkaUxldmVsCT0gcFBpZWNlLT5tX2lCaWRpTGV2ZWw7DQotICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLm5Db3VudAkJPSBwUGllY2UtPkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICBUeHRFZHRQaWVjZS5uU3RhcnQJCT0gblBpZWNlU3RhcnQ7DQotICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLmR3Q2hhclN0eWxlcyA9IHBQaWVjZS0+bV9kd0NoYXJTdHlsZXM7DQotICAgICAgICAgICAgICAgIGlmIChGWF9Jc09kZChwUGllY2UtPm1faUJpZGlMZXZlbCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLmR3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQYXJhQnJlYWtXaWR0aCA9IDAuMGY7DQotICAgICAgICAgICAgICAgIGlmIChwUGllY2UtPm1fZHdTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3UnRDaGFyID0gIHBQYXJhbXMtPndMaW5lQnJlYWtDaGFyOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFR4dEVkdFBpZWNlLm5Db3VudCA+PSAyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd0NoYXIgPSBwQnVmLT5HZXRDaGFyQnlJbmRleChtX25QYWdlU3RhcnQgKyBUeHRFZHRQaWVjZS5uU3RhcnQgKyBUeHRFZHRQaWVjZS5uQ291bnQgLSAxKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Q2hhclByZSA9IHBCdWYtPkdldENoYXJCeUluZGV4KG1fblBhZ2VTdGFydCArIFR4dEVkdFBpZWNlLm5TdGFydCArIFR4dEVkdFBpZWNlLm5Db3VudCAtIDIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3Q2hhciA9PSB3UnRDaGFyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQYXJhQnJlYWtXaWR0aCArPSBmRGVmQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod0NoYXJQcmUgPT0gd1J0Q2hhcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUGFyYUJyZWFrV2lkdGggKz0gZkRlZkNoYXJXaWR0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFR4dEVkdFBpZWNlLm5Db3VudCA+PSAxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd0NoYXIgPSBwQnVmLT5HZXRDaGFyQnlJbmRleChtX25QYWdlU3RhcnQgKyBUeHRFZHRQaWVjZS5uU3RhcnQgKyBUeHRFZHRQaWVjZS5uQ291bnQgLSAxKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod0NoYXIgPT0gd1J0Q2hhcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUGFyYUJyZWFrV2lkdGggKz0gZkRlZkNoYXJXaWR0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbXMtPmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsKSB7DQotICAgICAgICAgICAgICAgICAgICBUeHRFZHRQaWVjZS5ydFBpZWNlLmxlZnQJPSBmTGluZVBvczsNCi0gICAgICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UudG9wCQk9IChGWF9GTE9BVClwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGY7DQotICAgICAgICAgICAgICAgICAgICBUeHRFZHRQaWVjZS5ydFBpZWNlLndpZHRoCT0gcFBhcmFtcy0+ZkxpbmVTcGFjZTsNCi0gICAgICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UuaGVpZ2h0CT0gKEZYX0ZMT0FUKXBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZiArIGZQYXJhQnJlYWtXaWR0aDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UubGVmdAk9IChGWF9GTE9BVClwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGY7DQotICAgICAgICAgICAgICAgICAgICBUeHRFZHRQaWVjZS5ydFBpZWNlLnRvcAkJPSBmTGluZVBvczsNCi0gICAgICAgICAgICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2Uud2lkdGgJPSAoRlhfRkxPQVQpcFBpZWNlLT5tX2lXaWR0aCAvIDIwMDAwLjBmICsgZlBhcmFCcmVha1dpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgVHh0RWR0UGllY2UucnRQaWVjZS5oZWlnaHQJPSBwUGFyYW1zLT5mTGluZVNwYWNlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChiRmlyc3RQaWVjZSkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9ydFBhZ2VDb250ZW50cyA9IFR4dEVkdFBpZWNlLnJ0UGllY2U7DQotICAgICAgICAgICAgICAgICAgICBiRmlyc3RQaWVjZSA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgbV9ydFBhZ2VDb250ZW50cy5VbmlvbihUeHRFZHRQaWVjZS5ydFBpZWNlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBuUGllY2VTdGFydCArPSBUeHRFZHRQaWVjZS5uQ291bnQ7DQotICAgICAgICAgICAgICAgIG1fUGllY2VNYXNzQXJyLkFkZChUeHRFZHRQaWVjZSk7DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IFR4dEVkdFBpZWNlLm5Db3VudDsgayArKykgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0NoYXIqIHB0YyA9IHBQaWVjZS0+R2V0Q2hhclB0cihrKTsNCi0gICAgICAgICAgICAgICAgICAgIG1fcENoYXJXaWR0aFtUeHRFZHRQaWVjZS5uU3RhcnQgKyBrXSA9IHB0Yy0+bV9pQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZMaW5lUG9zICs9IGZMaW5lU3RlcDsNCi0gICAgICAgICAgICBwQnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwSXRlci0+R2V0QXQoKSA9PSBuUGFnZUVuZCAmJiBkd0JyZWFrU3RhdHVzID09IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykgew0KLSAgICAgICAgICAgIGJSZWxvYWQgPSBUUlVFOw0KLSAgICAgICAgICAgIHBJdGVyLT5OZXh0KFRSVUUpOw0KLSAgICAgICAgfQ0KLSAgICB9ICB3aGlsZSAocEl0ZXItPk5leHQoRkFMU0UpICYmIChwSXRlci0+R2V0QXQoKSA8PSBuUGFnZUVuZCkpOw0KLSAgICBpZiAobV9ydFBhZ2VDb250ZW50cy5sZWZ0ICE9IDApIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZEZWx0YSA9IDAuMGY7DQotICAgICAgICBpZiAobV9ydFBhZ2VDb250ZW50cy53aWR0aCA8IHBQYXJhbXMtPmZQbGF0ZVdpZHRoKSB7DQotICAgICAgICAgICAgaWYgKHBQYXJhbXMtPmR3QWxpZ25tZW50ICYgRkRFX1RFWFRFRElUQUxJR05fUmlnaHQpIHsNCi0gICAgICAgICAgICAgICAgZkRlbHRhID0gcFBhcmFtcy0+ZlBsYXRlV2lkdGggLSBtX3J0UGFnZUNvbnRlbnRzLndpZHRoOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocFBhcmFtcy0+ZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9DZW50ZXIpIHsNCi0gICAgICAgICAgICAgICAgaWYgKChwUGFyYW1zLT5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Db21iVGV4dCkgJiYgbV9uQ2hhckNvdW50ID4gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSBtX25DaGFyQ291bnQgLSAxOw0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuID0gKG1fcEVkaXRFbmdpbmUtPm1fbkxpbWl0IC0gbkNvdW50KSAvIDI7DQotICAgICAgICAgICAgICAgICAgICBmRGVsdGEgPSAobV9ydFBhZ2VDb250ZW50cy53aWR0aCAvIG5Db3VudCkgKiBuOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZkRlbHRhID0gKHBQYXJhbXMtPmZQbGF0ZVdpZHRoIC0gbV9ydFBhZ2VDb250ZW50cy53aWR0aCkgLyAyOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRkxPQVQgZk9mZnNldCA9IG1fcnRQYWdlQ29udGVudHMubGVmdCAtIGZEZWx0YTsNCi0gICAgICAgIGludDMyX3QgbkNvdW50ID0gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7DQotICAgICAgICAgICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwUGllY2UgPSBtX1BpZWNlTWFzc0Fyci5HZXRQdHJBdChpKTsNCi0gICAgICAgICAgICBwUGllY2UtPnJ0UGllY2UuT2Zmc2V0KC1mT2Zmc2V0LCAwLjBmKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcnRQYWdlQ29udGVudHMuT2Zmc2V0KC1mT2Zmc2V0LCAwLjBmKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wRWRpdEVuZ2luZS0+R2V0RWRpdFBhcmFtcygpLT5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9MYXN0TGluZUhlaWdodCkgew0KLSAgICAgICAgbV9ydFBhZ2VDb250ZW50cy5oZWlnaHQgLT0gcFBhcmFtcy0+ZkxpbmVTcGFjZSAtIHBQYXJhbXMtPmZGb250U2l6ZTsNCi0gICAgICAgIGludDMyX3QgbkNvdW50ID0gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpOw0KLSAgICAgICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwUGllY2UgPSBtX1BpZWNlTWFzc0Fyci5HZXRQdHJBdChuQ291bnQgLSAxKTsNCi0gICAgICAgIHBQaWVjZS0+cnRQaWVjZS5oZWlnaHQgPSBwUGFyYW1zLT5mRm9udFNpemU7DQotICAgIH0NCi0gICAgcEl0ZXItPlJlbGVhc2UoKTsNCi0gICAgbV9uUmVmQ291bnQgPSAxOw0KLSAgICBtX2JMb2FkZWQgPSBUUlVFOw0KLSAgICByZXR1cm4gMDsNCi19DQotdm9pZCBDRkRFX1R4dEVkdFBhZ2U6OlVubG9hZFBhZ2UoRlhfTFBDUkVDVEYgcENsaXBCb3ggKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fblJlZkNvdW50ID4gMCk7DQotICAgIG1fblJlZkNvdW50IC0tOw0KLSAgICBpZiAobV9uUmVmQ291bnQgPT0gMCkgew0KLSAgICAgICAgbV9QaWVjZU1hc3NBcnIuUmVtb3ZlQWxsKCk7DQotICAgICAgICBpZiAobV9wVGV4dFNldCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBtX3BUZXh0U2V0Ow0KLSAgICAgICAgICAgIG1fcFRleHRTZXQgPSBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG1fcENoYXJXaWR0aCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBbXSBtX3BDaGFyV2lkdGg7DQotICAgICAgICAgICAgbV9wQ2hhcldpZHRoID0gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX3BCZ25QYXJhZykgew0KLSAgICAgICAgICAgIG1fcEJnblBhcmFnLT5VbmxvYWRQYXJhZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG1fcEVuZFBhcmFnKSB7DQotICAgICAgICAgICAgbV9wRW5kUGFyYWctPlVubG9hZFBhcmFnKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wSXRlcikgew0KLSAgICAgICAgICAgIG1fcEl0ZXItPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICBtX3BJdGVyID0gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcEJnblBhcmFnID0gTlVMTDsNCi0gICAgICAgIG1fcEVuZFBhcmFnID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLWNvbnN0IENGWF9SZWN0RiYgQ0ZERV9UeHRFZHRQYWdlOjpHZXRDb250ZW50c0JveCgpDQotew0KLSAgICByZXR1cm4gbV9ydFBhZ2VDb250ZW50czsNCi19DQotRlhfUE9TSVRJT04gQ0ZERV9UeHRFZHRQYWdlOjpHZXRGaXJzdFBvc2l0aW9uKEZERV9IVklTVUFMT0JKIGhDYW52YXMpDQotew0KLSAgICBpZiAobV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIChGWF9QT1NJVElPTikxOw0KLX0NCi1GREVfSFZJU1VBTE9CSiBDRkRFX1R4dEVkdFBhZ2U6OkdldE5leHQoRkRFX0hWSVNVQUxPQkogaENhbnZhcywgRlhfUE9TSVRJT04gJnBvcywgSUZERV9WaXN1YWxTZXQgKiZwVmlzdWFsU2V0KQ0KLXsNCi0gICAgaWYgKG1fcFRleHRTZXQgPT0gTlVMTCkgew0KLSAgICAgICAgcG9zID0gTlVMTDsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGludDMyX3QgblBvcyA9IChpbnQzMl90KSh1aW50cHRyX3QpcG9zOw0KLSAgICBwVmlzdWFsU2V0ID0gbV9wVGV4dFNldDsNCi0gICAgaWYgKG5Qb3MgKyAxID4gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpKSB7DQotICAgICAgICBwb3MgPSBOVUxMOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcG9zID0gKEZYX1BPU0lUSU9OKSh1aW50cHRyX3QpKG5Qb3MgKyAxKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gKEZERV9IVklTVUFMT0JKKShtX1BpZWNlTWFzc0Fyci5HZXRQdHJBdChuUG9zIC0gMSkpOw0KLX0NCi1GREVfSFZJU1VBTE9CSiBDRkRFX1R4dEVkdFBhZ2U6OkdldFBhcmVudENhbnZhcyhGREVfSFZJU1VBTE9CSiBoQ2FudmFzLCBJRkRFX1Zpc3VhbFNldCAqJnBWaXN1YWxTZXQpDQotew0KK0ZYX1BPU0lUSU9OIENGREVfVHh0RWR0UGFnZTo6R2V0Rmlyc3RQb3NpdGlvbihGREVfSFZJU1VBTE9CSiBoQ2FudmFzKSB7DQorICBpZiAobV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpIDwgMSkgew0KICAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiAoRlhfUE9TSVRJT04pMTsNCiB9DQotRlhfV0NIQVIgQ0ZERV9UeHRFZHRQYWdlOjpHZXRDaGFyKHZvaWQqIHBJZGVudGl0eSwgaW50MzJfdCBpbmRleCkgY29uc3QNCi17DQotICAgIGludDMyX3QgbkluZGV4ID0gbV9uUGFnZVN0YXJ0ICsgKChGREVfTFBURVhURURJVFBJRUNFKXBJZGVudGl0eSktPm5TdGFydCArIGluZGV4Ow0KLSAgICBpZiAobkluZGV4ICE9IG1fcEl0ZXItPkdldEF0KCkpIHsNCi0gICAgICAgIG1fcEl0ZXItPlNldEF0KG5JbmRleCk7DQotICAgIH0NCi0gICAgRlhfV0NIQVIgd0NoYXIgPSBtX3BJdGVyLT5HZXRDaGFyKCk7DQotICAgIG1fcEl0ZXItPk5leHQoKTsNCi0gICAgcmV0dXJuIHdDaGFyOw0KK0ZERV9IVklTVUFMT0JKIENGREVfVHh0RWR0UGFnZTo6R2V0TmV4dChGREVfSFZJU1VBTE9CSiBoQ2FudmFzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiYgcG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQpIHsNCisgIGlmIChtX3BUZXh0U2V0ID09IE5VTEwpIHsNCisgICAgcG9zID0gTlVMTDsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IG5Qb3MgPSAoaW50MzJfdCkodWludHB0cl90KXBvczsNCisgIHBWaXN1YWxTZXQgPSBtX3BUZXh0U2V0Ow0KKyAgaWYgKG5Qb3MgKyAxID4gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpKSB7DQorICAgIHBvcyA9IE5VTEw7DQorICB9IGVsc2Ugew0KKyAgICBwb3MgPSAoRlhfUE9TSVRJT04pKHVpbnRwdHJfdCkoblBvcyArIDEpOw0KKyAgfQ0KKyAgcmV0dXJuIChGREVfSFZJU1VBTE9CSikobV9QaWVjZU1hc3NBcnIuR2V0UHRyQXQoblBvcyAtIDEpKTsNCiB9DQotaW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkdldFdpZHRoKHZvaWQqIHBJZGVudGl0eSwgaW50MzJfdCBpbmRleCkgY29uc3QNCi17DQotICAgIGludDMyX3QgbldpZHRoID0gbV9wQ2hhcldpZHRoWygoRkRFX0xQVEVYVEVESVRQSUVDRSlwSWRlbnRpdHkpLT5uU3RhcnQgKyBpbmRleF07DQotICAgIHJldHVybiBuV2lkdGg7DQorRkRFX0hWSVNVQUxPQkogQ0ZERV9UeHRFZHRQYWdlOjpHZXRQYXJlbnRDYW52YXMoRkRFX0hWSVNVQUxPQkogaENhbnZhcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQpIHsNCisgIHJldHVybiBOVUxMOw0KIH0NCi12b2lkIENGREVfVHh0RWR0UGFnZTo6Tm9ybWFsaXplUHQyUmVjdChDRlhfUG9pbnRGICZwdEYsIGNvbnN0IENGWF9SZWN0RiAmcnRGLCBGWF9GTE9BVCBmVG9sZXJhbmNlKSBjb25zdA0KLXsNCi0gICAgaWYgKHJ0Ri5Db250YWlucyhwdEYueCwgcHRGLnkpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKHB0Ri54IDwgcnRGLmxlZnQpIHsNCi0gICAgICAgIHB0Ri54ID0gcnRGLmxlZnQ7DQotICAgIH0gZWxzZSBpZiAocHRGLnggPj0gcnRGLnJpZ2h0KCkpIHsNCi0gICAgICAgIHB0Ri54ID0gcnRGLnJpZ2h0KCkgLSBmVG9sZXJhbmNlOw0KLSAgICB9DQotICAgIGlmIChwdEYueSA8IHJ0Ri50b3ApIHsNCi0gICAgICAgIHB0Ri55ID0gcnRGLnRvcDsNCi0gICAgfSBlbHNlIGlmIChwdEYueSA+PSBydEYuYm90dG9tKCkpIHsNCi0gICAgICAgIHB0Ri55ID0gcnRGLmJvdHRvbSgpIC0gZlRvbGVyYW5jZTsNCi0gICAgfQ0KK0ZYX1dDSEFSIENGREVfVHh0RWR0UGFnZTo6R2V0Q2hhcih2b2lkKiBwSWRlbnRpdHksIGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgIGludDMyX3QgbkluZGV4ID0NCisgICAgICBtX25QYWdlU3RhcnQgKyAoKEZERV9MUFRFWFRFRElUUElFQ0UpcElkZW50aXR5KS0+blN0YXJ0ICsgaW5kZXg7DQorICBpZiAobkluZGV4ICE9IG1fcEl0ZXItPkdldEF0KCkpIHsNCisgICAgbV9wSXRlci0+U2V0QXQobkluZGV4KTsNCisgIH0NCisgIEZYX1dDSEFSIHdDaGFyID0gbV9wSXRlci0+R2V0Q2hhcigpOw0KKyAgbV9wSXRlci0+TmV4dCgpOw0KKyAgcmV0dXJuIHdDaGFyOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0UGFnZTo6R2V0V2lkdGgodm9pZCogcElkZW50aXR5LCBpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICBpbnQzMl90IG5XaWR0aCA9DQorICAgICAgbV9wQ2hhcldpZHRoWygoRkRFX0xQVEVYVEVESVRQSUVDRSlwSWRlbnRpdHkpLT5uU3RhcnQgKyBpbmRleF07DQorICByZXR1cm4gbldpZHRoOw0KK30NCit2b2lkIENGREVfVHh0RWR0UGFnZTo6Tm9ybWFsaXplUHQyUmVjdChDRlhfUG9pbnRGJiBwdEYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvbGVyYW5jZSkgY29uc3Qgew0KKyAgaWYgKHJ0Ri5Db250YWlucyhwdEYueCwgcHRGLnkpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwdEYueCA8IHJ0Ri5sZWZ0KSB7DQorICAgIHB0Ri54ID0gcnRGLmxlZnQ7DQorICB9IGVsc2UgaWYgKHB0Ri54ID49IHJ0Ri5yaWdodCgpKSB7DQorICAgIHB0Ri54ID0gcnRGLnJpZ2h0KCkgLSBmVG9sZXJhbmNlOw0KKyAgfQ0KKyAgaWYgKHB0Ri55IDwgcnRGLnRvcCkgew0KKyAgICBwdEYueSA9IHJ0Ri50b3A7DQorICB9IGVsc2UgaWYgKHB0Ri55ID49IHJ0Ri5ib3R0b20oKSkgew0KKyAgICBwdEYueSA9IHJ0Ri5ib3R0b20oKSAtIGZUb2xlcmFuY2U7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhZ2UuaCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhZ2UuaAppbmRleCAxZjVjYWUyLi4zMGY3MTdlIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYWdlLmgKKysrIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFnZS5oCkBAIC0xMywxMTggKzEzLDE0MyBAQAogY2xhc3MgQ0ZERV9UeHRFZHRUZXh0U2V0Ow0KIGNsYXNzIENGREVfVHh0RWR0UGFyYWc7DQogZW51bSBGREVfVFhURURUX0NIQVJUWVBFIHsNCi0gICAgRkRFX1RYVEVEVF9DSEFSVFlQRV9Vbmtub3duCT0gMAksDQotICAgIEZERV9UWFRFRFRfQ0hBUlRZUEVfVGFiCQkJLA0KLSAgICBGREVfVFhURURUX0NIQVJUWVBFX1NwYWNlCQksDQotICAgIEZERV9UWFRFRFRfQ0hBUlRZUEVfUHVuY3R1YXRpb24JLA0KLSAgICBGREVfVFhURURUX0NIQVJUWVBFX0xpbmVCcmVhawksDQotICAgIEZERV9UWFRFRFRfQ0hBUlRZUEVfTnVtYmVyCQksDQotICAgIEZERV9UWFRFRFRfQ0hBUlRZUEVfQ2hhcgkJLA0KLSAgICBGREVfVFhURURUX0NIQVJUWVBFX0NKSwkJCSwNCisgIEZERV9UWFRFRFRfQ0hBUlRZUEVfVW5rbm93biA9IDAsDQorICBGREVfVFhURURUX0NIQVJUWVBFX1RhYiwNCisgIEZERV9UWFRFRFRfQ0hBUlRZUEVfU3BhY2UsDQorICBGREVfVFhURURUX0NIQVJUWVBFX1B1bmN0dWF0aW9uLA0KKyAgRkRFX1RYVEVEVF9DSEFSVFlQRV9MaW5lQnJlYWssDQorICBGREVfVFhURURUX0NIQVJUWVBFX051bWJlciwNCisgIEZERV9UWFRFRFRfQ0hBUlRZUEVfQ2hhciwNCisgIEZERV9UWFRFRFRfQ0hBUlRZUEVfQ0pLLA0KIH07DQotc3RhdGljIEZERV9UWFRFRFRfQ0hBUlRZUEUgRkRFX0dldEVkaXRTZWxDaGFyVHlwZShGWF9XQ0hBUiB3Q2hhcikNCi17DQotICAgIGlmICh3Q2hhciA9PSAweDkpIHsNCi0gICAgICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX1RhYjsNCi0gICAgfSBlbHNlIGlmICh3Q2hhciA9PSAweDIwIHx8IHdDaGFyID09IDB4QTApIHsNCi0gICAgICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX1NwYWNlOw0KLSAgICB9IGVsc2UgaWYgKHdDaGFyID09IDB4OSB8fCB3Q2hhciA9PSAweDIwIHx8IHdDaGFyID09IDB4QTAgfHwgKHdDaGFyID49IEwnIScgJiYgd0NoYXIgPD0gTCcvJykgfHwgKHdDaGFyID49IEwnOicgJiYgd0NoYXIgPD0gTCdAJykgfHwgKHdDaGFyID49IEwnWycgJiYgd0NoYXIgPD0gTCdeJykgfHwNCi0gICAgICAgICAgICAgICAod0NoYXIgPj0gTCd7JyAmJiB3Q2hhciA8PSBMJ34nKSB8fCB3Q2hhciA9PSAweDYwKSB7DQotICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9DSEFSVFlQRV9QdW5jdHVhdGlvbjsNCi0gICAgfSBlbHNlIGlmICh3Q2hhciA9PSAweDBhIHx8IHdDaGFyID09IDB4MGQpIHsNCi0gICAgICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX0xpbmVCcmVhazsNCi0gICAgfSBlbHNlIGlmICh3Q2hhciA+PSAnMCcgJiYgd0NoYXIgPD0gJzknKSB7DQotICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9DSEFSVFlQRV9OdW1iZXI7DQotICAgIH0gZWxzZSBpZiAoKHdDaGFyID49IDB4MmU4MCAmJiB3Q2hhciA8PSAweDJlZmYpIHx8ICh3Q2hhciA+PSAweDMwMDAgJiYgd0NoYXIgPD0gMHgzMDNmKSB8fCAod0NoYXIgPj0gMHgzMWMwICYmIHdDaGFyIDw9IDB4MzFlZikNCi0gICAgICAgICAgICAgICB8fCAod0NoYXIgPj0gMHgzMjAwICYmIHdDaGFyIDw9IDB4MzJmZikgfHwgKHdDaGFyID49IDB4MzMwMCAmJiB3Q2hhciA8PSAweDMzZmYpIHx8ICh3Q2hhciA+PSAweDM0MDAgJiYgd0NoYXIgPD0gMHg0ZGJmKQ0KLSAgICAgICAgICAgICAgIHx8ICh3Q2hhciA+PSAweDRlMDAgJiYgd0NoYXIgPD0gMHg5ZmZmKSB8fCAod0NoYXIgPj0gMHhmOTAwICYmIHdDaGFyIDw9IDB4ZmFmZikgfHwgKHdDaGFyID49IDB4ZmUzMCAmJiB3Q2hhciA8PSAweGZlNGYpKSB7DQotICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9DSEFSVFlQRV9DSks7DQotICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9DSEFSVFlQRV9DaGFyOw0KLSAgICB9DQorc3RhdGljIEZERV9UWFRFRFRfQ0hBUlRZUEUgRkRFX0dldEVkaXRTZWxDaGFyVHlwZShGWF9XQ0hBUiB3Q2hhcikgew0KKyAgaWYgKHdDaGFyID09IDB4OSkgew0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9DSEFSVFlQRV9UYWI7DQorICB9IGVsc2UgaWYgKHdDaGFyID09IDB4MjAgfHwgd0NoYXIgPT0gMHhBMCkgew0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9DSEFSVFlQRV9TcGFjZTsNCisgIH0gZWxzZSBpZiAod0NoYXIgPT0gMHg5IHx8IHdDaGFyID09IDB4MjAgfHwgd0NoYXIgPT0gMHhBMCB8fA0KKyAgICAgICAgICAgICAod0NoYXIgPj0gTCchJyAmJiB3Q2hhciA8PSBMJy8nKSB8fA0KKyAgICAgICAgICAgICAod0NoYXIgPj0gTCc6JyAmJiB3Q2hhciA8PSBMJ0AnKSB8fA0KKyAgICAgICAgICAgICAod0NoYXIgPj0gTCdbJyAmJiB3Q2hhciA8PSBMJ14nKSB8fA0KKyAgICAgICAgICAgICAod0NoYXIgPj0gTCd7JyAmJiB3Q2hhciA8PSBMJ34nKSB8fCB3Q2hhciA9PSAweDYwKSB7DQorICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX1B1bmN0dWF0aW9uOw0KKyAgfSBlbHNlIGlmICh3Q2hhciA9PSAweDBhIHx8IHdDaGFyID09IDB4MGQpIHsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfQ0hBUlRZUEVfTGluZUJyZWFrOw0KKyAgfSBlbHNlIGlmICh3Q2hhciA+PSAnMCcgJiYgd0NoYXIgPD0gJzknKSB7DQorICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX051bWJlcjsNCisgIH0gZWxzZSBpZiAoKHdDaGFyID49IDB4MmU4MCAmJiB3Q2hhciA8PSAweDJlZmYpIHx8DQorICAgICAgICAgICAgICh3Q2hhciA+PSAweDMwMDAgJiYgd0NoYXIgPD0gMHgzMDNmKSB8fA0KKyAgICAgICAgICAgICAod0NoYXIgPj0gMHgzMWMwICYmIHdDaGFyIDw9IDB4MzFlZikgfHwNCisgICAgICAgICAgICAgKHdDaGFyID49IDB4MzIwMCAmJiB3Q2hhciA8PSAweDMyZmYpIHx8DQorICAgICAgICAgICAgICh3Q2hhciA+PSAweDMzMDAgJiYgd0NoYXIgPD0gMHgzM2ZmKSB8fA0KKyAgICAgICAgICAgICAod0NoYXIgPj0gMHgzNDAwICYmIHdDaGFyIDw9IDB4NGRiZikgfHwNCisgICAgICAgICAgICAgKHdDaGFyID49IDB4NGUwMCAmJiB3Q2hhciA8PSAweDlmZmYpIHx8DQorICAgICAgICAgICAgICh3Q2hhciA+PSAweGY5MDAgJiYgd0NoYXIgPD0gMHhmYWZmKSB8fA0KKyAgICAgICAgICAgICAod0NoYXIgPj0gMHhmZTMwICYmIHdDaGFyIDw9IDB4ZmU0ZikpIHsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfQ0hBUlRZUEVfQ0pLOw0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfQ0hBUlRZUEVfQ2hhcjsNCisgIH0NCiB9DQogdHlwZWRlZiBzdHJ1Y3QgX0ZERV9UWFRFRFRQSUVDRSB7DQotICAgIGludDMyX3QJblN0YXJ0Ow0KLSAgICBpbnQzMl90CW5Db3VudDsNCi0gICAgaW50MzJfdAluQmlkaUxldmVsOw0KLSAgICBDRlhfUmVjdEYJcnRQaWVjZTsNCi0gICAgRlhfRFdPUkQJZHdDaGFyU3R5bGVzOw0KLX0gRkRFX1RFWFRFRElUUElFQ0UsICogRkRFX0xQVEVYVEVESVRQSUVDRTsNCisgIGludDMyX3QgblN0YXJ0Ow0KKyAgaW50MzJfdCBuQ291bnQ7DQorICBpbnQzMl90IG5CaWRpTGV2ZWw7DQorICBDRlhfUmVjdEYgcnRQaWVjZTsNCisgIEZYX0RXT1JEIGR3Q2hhclN0eWxlczsNCit9IEZERV9URVhURURJVFBJRUNFLCAqRkRFX0xQVEVYVEVESVRQSUVDRTsNCiB0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxGREVfVEVYVEVESVRQSUVDRT4gQ0ZERV9UWFRFRFRQaWVjZU1hc3NBcnJheTsNCi1jbGFzcyBDRkRFX1R4dEVkdFRleHRTZXQgOiBwdWJsaWMgSUZERV9UZXh0U2V0DQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9UeHRFZHRUZXh0U2V0KENGREVfVHh0RWR0UGFnZSAqIHBQYWdlKTsNCi0gICAgfkNGREVfVHh0RWR0VGV4dFNldCgpOw0KK2NsYXNzIENGREVfVHh0RWR0VGV4dFNldCA6IHB1YmxpYyBJRkRFX1RleHRTZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX1R4dEVkdFRleHRTZXQoQ0ZERV9UeHRFZHRQYWdlKiBwUGFnZSk7DQorICB+Q0ZERV9UeHRFZHRUZXh0U2V0KCk7DQogDQotICAgIHZpcnR1YWwgRkRFX1ZJU1VBTE9CSlRZUEUJR2V0VHlwZSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEJCb3goRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGICZiYm94KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRNYXRyaXgoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX01hdHJpeCAmbWF0cml4KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRSZWN0KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiAmcnQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldENsaXAoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGICZydCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRTdHJpbmcoRkRFX0hWSVNVQUxPQkogaFRleHQsIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KglHZXRGb250KEZERV9IVklTVUFMT0JKIGhUZXh0KTsNCi0gICAgdmlydHVhbCBGWF9GTE9BVAlHZXRGb250U2l6ZShGREVfSFZJU1VBTE9CSiBoVGV4dCk7DQotICAgIHZpcnR1YWwgRlhfQVJHQgkJR2V0Rm9udENvbG9yKEZERV9IVklTVUFMT0JKIGhUZXh0KTsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldERpc3BsYXlQb3MoRkRFX0hWSVNVQUxPQkogaFRleHQsIEZYVEVYVF9DSEFSUE9TICpwQ2hhclBvcywgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSwgQ0ZYX1dpZGVTdHJpbmcgKnBXU0Zvcm1zID0gTlVMTCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRDaGFyUmVjdHMoRkRFX0hWSVNVQUxPQkogaFRleHQsIENGWF9SZWN0RkFycmF5ICZydEFycmF5KTsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldENoYXJSZWN0c19JbXBsKEZERV9IVklTVUFMT0JKIGhUZXh0LCBDRlhfUmVjdEZBcnJheSAmcnRBcnJheSwgRlhfQk9PTCBiQkJveCA9IEZBTFNFKTsNCi1wcml2YXRlOg0KKyAgdmlydHVhbCBGREVfVklTVUFMT0JKVFlQRSBHZXRUeXBlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0QkJveChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYmIGJib3gpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldE1hdHJpeChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfTWF0cml4JiBtYXRyaXgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldFJlY3QoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBydCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2xpcChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYmIHJ0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRTdHJpbmcoRkRFX0hWSVNVQUxPQkogaFRleHQsIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0Rm9udChGREVfSFZJU1VBTE9CSiBoVGV4dCk7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZvbnRTaXplKEZERV9IVklTVUFMT0JKIGhUZXh0KTsNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRGb250Q29sb3IoRkRFX0hWSVNVQUxPQkogaFRleHQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldERpc3BsYXlQb3MoRkRFX0hWSVNVQUxPQkogaFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBXU0Zvcm1zID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhclJlY3RzKEZERV9IVklTVUFMT0JKIGhUZXh0LCBDRlhfUmVjdEZBcnJheSYgcnRBcnJheSk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhclJlY3RzX0ltcGwoRkRFX0hWSVNVQUxPQkogaFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIHJ0QXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQkJveCA9IEZBTFNFKTsNCiANCi0gICAgQ0ZERV9UeHRFZHRQYWdlICogbV9wUGFnZTsNCisgcHJpdmF0ZToNCisgIENGREVfVHh0RWR0UGFnZSogbV9wUGFnZTsNCiB9Ow0KLWNsYXNzIENGREVfVHh0RWR0UGFnZSA6IHB1YmxpYyBJRkRFX1R4dEVkdFBhZ2UNCi17DQotcHVibGljOg0KLSAgICBDRkRFX1R4dEVkdFBhZ2UoSUZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lLCBpbnQzMl90IG5MaW5lSW5kZXgpOw0KK2NsYXNzIENGREVfVHh0RWR0UGFnZSA6IHB1YmxpYyBJRkRFX1R4dEVkdFBhZ2Ugew0KKyBwdWJsaWM6DQorICBDRkRFX1R4dEVkdFBhZ2UoSUZERV9UeHRFZHRFbmdpbmUqIHBFbmdpbmUsIGludDMyX3QgbkxpbmVJbmRleCk7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCk7DQotICAgIHZpcnR1YWwgSUZERV9UeHRFZHRFbmdpbmUgKiBHZXRFbmdpbmUoKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIElGREVfVHh0RWR0RW5naW5lKiBHZXRFbmdpbmUoKSBjb25zdDsNCiANCi0gICAgdmlydHVhbCBGREVfVklTVUFMT0JKVFlQRQlHZXRUeXBlKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0QkJveChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJmJib3gpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldE1hdHJpeChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfTWF0cml4ICZtYXRyaXgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFJlY3QoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGICZydCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Q2xpcChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYgJnJ0KTsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldENoYXJSZWN0KGludDMyX3QgbkluZGV4LCBDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkJCb3ggPSBGQUxTRSkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRDaGFySW5kZXgoY29uc3QgQ0ZYX1BvaW50RiAmZlBvaW50LCBGWF9CT09MICZiQmVmb3JlKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CVNlbGVjdFdvcmQoY29uc3QgQ0ZYX1BvaW50RiAmZlBvaW50LCBpbnQzMl90ICZuQ291bnQpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0Q2hhclN0YXJ0KCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRDaGFyQ291bnQoKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCQlDYWxjUmFuZ2VSZWN0QXJyYXkoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50LCBDRlhfUmVjdEZBcnJheSAmUmVjdEZBcnIpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0RGlzcGxheVBvcyhjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCwgRlhURVhUX0NIQVJQT1MgKiZwQ2hhclBvcywgRlhfTFBSRUNURiBwQkJveCkgY29uc3Q7DQorICB2aXJ0dWFsIEZERV9WSVNVQUxPQkpUWVBFIEdldFR5cGUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCQm94KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiYgYmJveCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0TWF0cml4KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9NYXRyaXgmIG1hdHJpeCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UmVjdChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYmIHJ0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwKEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiYgcnQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENoYXJSZWN0KGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCQm94ID0gRkFMU0UpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldENoYXJJbmRleChjb25zdCBDRlhfUG9pbnRGJiBmUG9pbnQsIEZYX0JPT0wmIGJCZWZvcmUpOw0KKyAgdmlydHVhbCBpbnQzMl90IFNlbGVjdFdvcmQoY29uc3QgQ0ZYX1BvaW50RiYgZlBvaW50LCBpbnQzMl90JiBuQ291bnQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENoYXJTdGFydCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldENoYXJDb3VudCgpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIENhbGNSYW5nZVJlY3RBcnJheShpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RkFycmF5JiBSZWN0RkFycikgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGlzcGxheVBvcyhjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiYgcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUFJFQ1RGIHBCQm94KSBjb25zdDsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUlzTG9hZGVkKEZYX0xQQ1JFQ1RGIHBDbGlwQm94ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUxvYWRQYWdlKEZYX0xQQ1JFQ1RGIHBDbGlwQm94ID0gTlVMTCwgSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVVubG9hZFBhZ2UoRlhfTFBDUkVDVEYgcENsaXBCb3ggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0xvYWRlZChGWF9MUENSRUNURiBwQ2xpcEJveCA9IE5VTEwpOw0KKyAgdmlydHVhbCBpbnQzMl90IExvYWRQYWdlKEZYX0xQQ1JFQ1RGIHBDbGlwQm94ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOw0KKyAgdmlydHVhbCB2b2lkIFVubG9hZFBhZ2UoRlhfTFBDUkVDVEYgcENsaXBCb3ggPSBOVUxMKTsNCiANCi0gICAgdmlydHVhbCBjb25zdCBDRlhfUmVjdEYmCUdldENvbnRlbnRzQm94KCk7DQotICAgIHZpcnR1YWwgRlhfUE9TSVRJT04JCQlHZXRGaXJzdFBvc2l0aW9uKEZERV9IVklTVUFMT0JKIGhDYW52YXMpOw0KLSAgICB2aXJ0dWFsIEZERV9IVklTVUFMT0JKCQlHZXROZXh0KEZERV9IVklTVUFMT0JKIGhDYW52YXMsIEZYX1BPU0lUSU9OICZwb3MsIElGREVfVmlzdWFsU2V0IComcFZpc3VhbFNldCk7DQotICAgIHZpcnR1YWwgRkRFX0hWSVNVQUxPQkoJCUdldFBhcmVudENhbnZhcyhGREVfSFZJU1VBTE9CSiBoQ2FudmFzLCBJRkRFX1Zpc3VhbFNldCAqJnBWaXN1YWxTZXQpOw0KLSAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldENoYXIodm9pZCogcElkZW50aXR5LCBpbnQzMl90IGluZGV4KSBjb25zdDsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldFdpZHRoKHZvaWQqIHBJZGVudGl0eSwgaW50MzJfdCBpbmRleCkgY29uc3Q7DQotcHJvdGVjdGVkOg0KLSAgICB2aXJ0dWFsIH5DRkRFX1R4dEVkdFBhZ2UoKTsNCi1wcml2YXRlOg0KLSAgICB2b2lkIE5vcm1hbGl6ZVB0MlJlY3QoQ0ZYX1BvaW50RiAmcHRGLCBjb25zdCBDRlhfUmVjdEYgJnJ0RiwgRlhfRkxPQVQgZlRvbGVyYW5jZSkgY29uc3Q7DQotICAgIElGWF9DaGFySXRlcgkJCQkqbV9wSXRlcjsNCi0gICAgQ0ZERV9UeHRFZHRUZXh0U2V0CQkJKm1fcFRleHRTZXQ7DQotICAgIENGREVfVHh0RWR0RW5naW5lCQkJKm1fcEVkaXRFbmdpbmU7DQotICAgIENGREVfVFhURURUUGllY2VNYXNzQXJyYXkJbV9QaWVjZU1hc3NBcnI7DQotICAgIENGREVfVHh0RWR0UGFyYWcgKgkJCW1fcEJnblBhcmFnOw0KLSAgICBDRkRFX1R4dEVkdFBhcmFnICoJCQltX3BFbmRQYXJhZzsNCisgIHZpcnR1YWwgY29uc3QgQ0ZYX1JlY3RGJiBHZXRDb250ZW50c0JveCgpOw0KKyAgdmlydHVhbCBGWF9QT1NJVElPTiBHZXRGaXJzdFBvc2l0aW9uKEZERV9IVklTVUFMT0JKIGhDYW52YXMpOw0KKyAgdmlydHVhbCBGREVfSFZJU1VBTE9CSiBHZXROZXh0KEZERV9IVklTVUFMT0JKIGhDYW52YXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQpOw0KKyAgdmlydHVhbCBGREVfSFZJU1VBTE9CSiBHZXRQYXJlbnRDYW52YXMoRkRFX0hWSVNVQUxPQkogaENhbnZhcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfVmlzdWFsU2V0KiYgcFZpc3VhbFNldCk7DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldENoYXIodm9pZCogcElkZW50aXR5LCBpbnQzMl90IGluZGV4KSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXaWR0aCh2b2lkKiBwSWRlbnRpdHksIGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KIA0KLSAgICBpbnQzMl90CW1fblJlZkNvdW50Ow0KLSAgICBpbnQzMl90CW1fblBhZ2VTdGFydDsNCi0gICAgaW50MzJfdAltX25DaGFyQ291bnQ7DQotICAgIGludDMyX3QJbV9uUGFnZUluZGV4Ow0KLSAgICBGWF9CT09MCQltX2JMb2FkZWQ7DQotICAgIEZYX0JPT0wJCW1fYkxhc3RQYWdlOw0KLSAgICBDRlhfUmVjdEYJbV9ydFBhZ2U7DQotICAgIENGWF9SZWN0RgltX3J0UGFnZU1hcmdpbjsNCi0gICAgQ0ZYX1JlY3RGCW1fcnRQYWdlQ29udGVudHM7DQotICAgIENGWF9SZWN0RgltX3J0UGFnZUNhbnZhczsNCi0gICAgaW50MzJfdCoJbV9wQ2hhcldpZHRoOw0KKyBwcm90ZWN0ZWQ6DQorICB2aXJ0dWFsIH5DRkRFX1R4dEVkdFBhZ2UoKTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgTm9ybWFsaXplUHQyUmVjdChDRlhfUG9pbnRGJiBwdEYsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEYsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvbGVyYW5jZSkgY29uc3Q7DQorICBJRlhfQ2hhckl0ZXIqIG1fcEl0ZXI7DQorICBDRkRFX1R4dEVkdFRleHRTZXQqIG1fcFRleHRTZXQ7DQorICBDRkRFX1R4dEVkdEVuZ2luZSogbV9wRWRpdEVuZ2luZTsNCisgIENGREVfVFhURURUUGllY2VNYXNzQXJyYXkgbV9QaWVjZU1hc3NBcnI7DQorICBDRkRFX1R4dEVkdFBhcmFnKiBtX3BCZ25QYXJhZzsNCisgIENGREVfVHh0RWR0UGFyYWcqIG1fcEVuZFBhcmFnOw0KKw0KKyAgaW50MzJfdCBtX25SZWZDb3VudDsNCisgIGludDMyX3QgbV9uUGFnZVN0YXJ0Ow0KKyAgaW50MzJfdCBtX25DaGFyQ291bnQ7DQorICBpbnQzMl90IG1fblBhZ2VJbmRleDsNCisgIEZYX0JPT0wgbV9iTG9hZGVkOw0KKyAgRlhfQk9PTCBtX2JMYXN0UGFnZTsNCisgIENGWF9SZWN0RiBtX3J0UGFnZTsNCisgIENGWF9SZWN0RiBtX3J0UGFnZU1hcmdpbjsNCisgIENGWF9SZWN0RiBtX3J0UGFnZUNvbnRlbnRzOw0KKyAgQ0ZYX1JlY3RGIG1fcnRQYWdlQ2FudmFzOw0KKyAgaW50MzJfdCogbV9wQ2hhcldpZHRoOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFyYWcuY3BwIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFyYWcuY3BwCmluZGV4IGFkOTA4MmMuLjU2MWFhMmYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhcmFnLmNwcAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYXJhZy5jcHAKQEAgLTExLDEzOSArMTEsMTQwIEBACiAjaW5jbHVkZSAiZmRlX3R4dGVkdHBhcmFnLmgiDQogI2luY2x1ZGUgImZkZV90eHRlZHRlbmdpbmUuaCINCiAjaW5jbHVkZSAiZmRlX3R4dGVkdGJ1Zi5oIg0KLUNGREVfVHh0RWR0UGFyYWc6OkNGREVfVHh0RWR0UGFyYWcoQ0ZERV9UeHRFZHRFbmdpbmUgKiBwRW5naW5lKQ0KLSAgICA6IG1fbkxpbmVDb3VudCgwKQ0KLSAgICAsIG1fbkNoYXJTdGFydCgwKQ0KLSAgICAsIG1fbkNoYXJDb3VudCgwKQ0KLSAgICAsIG1fbHBEYXRhKE5VTEwpDQotICAgICwgbV9wRW5naW5lKHBFbmdpbmUpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wRW5naW5lKTsNCitDRkRFX1R4dEVkdFBhcmFnOjpDRkRFX1R4dEVkdFBhcmFnKENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lKQ0KKyAgICA6IG1fbkxpbmVDb3VudCgwKSwNCisgICAgICBtX25DaGFyU3RhcnQoMCksDQorICAgICAgbV9uQ2hhckNvdW50KDApLA0KKyAgICAgIG1fbHBEYXRhKE5VTEwpLA0KKyAgICAgIG1fcEVuZ2luZShwRW5naW5lKSB7DQorICBGWFNZU19hc3NlcnQobV9wRW5naW5lKTsNCiB9DQotQ0ZERV9UeHRFZHRQYXJhZzo6fkNGREVfVHh0RWR0UGFyYWcoKQ0KLXsNCi0gICAgaWYgKG1fbHBEYXRhICE9IE5VTEwpIHsNCi0gICAgICAgIEZYX0ZyZWUobV9scERhdGEpOw0KLSAgICB9DQorQ0ZERV9UeHRFZHRQYXJhZzo6fkNGREVfVHh0RWR0UGFyYWcoKSB7DQorICBpZiAobV9scERhdGEgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fbHBEYXRhKTsNCisgIH0NCiB9DQotdm9pZCBDRkRFX1R4dEVkdFBhcmFnOjpMb2FkUGFyYWcoKQ0KLXsNCi0gICAgaWYgKG1fbHBEYXRhICE9IE5VTEwpIHsNCi0gICAgICAgICgoaW50MzJfdCopbV9scERhdGEpWzBdKys7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSUZYX1R4dEJyZWFrICogcFR4dEJyZWFrCT0gbV9wRW5naW5lLT5HZXRUZXh0QnJlYWsoKTsNCi0gICAgSUZERV9UeHRFZHRCdWYgKiBwVHh0QnVmCT0gbV9wRW5naW5lLT5HZXRUZXh0QnVmKCk7DQotICAgIGNvbnN0IEZERV9UWFRFRFRQQVJBTVMgKnBQYXJhbQk9IG1fcEVuZ2luZS0+R2V0RWRpdFBhcmFtcygpOw0KLSAgICBGWF9XQ0hBUiB3Y0FsaWFzID0gMDsNCi0gICAgaWYgKHBQYXJhbS0+ZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9QYXNzd29yZCkgew0KLSAgICAgICAgd2NBbGlhcyA9IG1fcEVuZ2luZS0+R2V0QWxpYXNDaGFyKCk7DQotICAgIH0NCi0gICAgSUZYX0NoYXJJdGVyICogcEl0ZXIJPSBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopcFR4dEJ1Ziwgd2NBbGlhcyk7DQotICAgIHBJdGVyLT5TZXRBdChtX25DaGFyU3RhcnQpOw0KLSAgICBpbnQzMl90IG5FbmRJbmRleCA9IG1fbkNoYXJTdGFydCArIG1fbkNoYXJDb3VudDsNCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gTGluZUJhc2VBcnI7DQotICAgIEZYX0JPT0wJCWJSZWxvYWQJCQk9IEZBTFNFOw0KLSAgICBGWF9EV09SRAlkd0JyZWFrU3RhdHVzCT0gRlhfVFhUQlJFQUtfTm9uZTsNCi0gICAgaW50MzJfdCBuVGV4dEVuZCA9IG1fcEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpOw0KLSAgICBkbwl7DQotICAgICAgICBpZiAoYlJlbG9hZCkgew0KLSAgICAgICAgICAgIGR3QnJlYWtTdGF0dXMgPSBwVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhfV0NIQVIgd0FwcGVuZCA9IHBJdGVyLT5HZXRDaGFyKCk7DQotICAgICAgICAgICAgZHdCcmVha1N0YXR1cyA9IHBUeHRCcmVhay0+QXBwZW5kQ2hhcih3QXBwZW5kKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwSXRlci0+R2V0QXQoKSArIDEgPT0gbkVuZEluZGV4ICYmIGR3QnJlYWtTdGF0dXMgPCBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsNCi0gICAgICAgICAgICBkd0JyZWFrU3RhdHVzID0gcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCi0gICAgICAgICAgICBpbnQzMl90IG5Db3VudCA9IHBUeHRCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOw0KLSAgICAgICAgICAgIGludDMyX3QgblRvdGFsID0gMDsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBuQ291bnQ7IGogKyspIHsNCi0gICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1R4dFBpZWNlICogUGllY2UgPSBwVHh0QnJlYWstPkdldEJyZWFrUGllY2Uoaik7DQotICAgICAgICAgICAgICAgIG5Ub3RhbCArPSBQaWVjZS0+R2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIExpbmVCYXNlQXJyLkFkZChuVG90YWwpOw0KLSAgICAgICAgICAgIHBUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKChwSXRlci0+R2V0QXQoKSArIDEgPT0gbkVuZEluZGV4KSAmJiAoZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19MaW5lQnJlYWspKSB7DQotICAgICAgICAgICAgYlJlbG9hZCA9IFRSVUU7DQotICAgICAgICAgICAgcEl0ZXItPk5leHQoVFJVRSk7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KEZBTFNFKSAmJiAocEl0ZXItPkdldEF0KCkgPCBuRW5kSW5kZXgpKTsNCi0gICAgcEl0ZXItPlJlbGVhc2UoKTsNCi0gICAgcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQotICAgIHBUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KLSAgICBpbnQzMl90IG5MaW5lQ291bnQgPSBMaW5lQmFzZUFyci5HZXRTaXplKCk7DQotICAgIG1fbkxpbmVDb3VudCA9IG5MaW5lQ291bnQ7DQotICAgIGlmIChtX2xwRGF0YSA9PSBOVUxMKSB7DQotICAgICAgICBtX2xwRGF0YSA9IEZYX0FsbG9jKGludDMyX3QsIG5MaW5lQ291bnQgKyAxKTsNCit2b2lkIENGREVfVHh0RWR0UGFyYWc6OkxvYWRQYXJhZygpIHsNCisgIGlmIChtX2xwRGF0YSAhPSBOVUxMKSB7DQorICAgICgoaW50MzJfdCopbV9scERhdGEpWzBdKys7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGWF9UeHRCcmVhayogcFR4dEJyZWFrID0gbV9wRW5naW5lLT5HZXRUZXh0QnJlYWsoKTsNCisgIElGREVfVHh0RWR0QnVmKiBwVHh0QnVmID0gbV9wRW5naW5lLT5HZXRUZXh0QnVmKCk7DQorICBjb25zdCBGREVfVFhURURUUEFSQU1TKiBwUGFyYW0gPSBtX3BFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsNCisgIEZYX1dDSEFSIHdjQWxpYXMgPSAwOw0KKyAgaWYgKHBQYXJhbS0+ZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9QYXNzd29yZCkgew0KKyAgICB3Y0FsaWFzID0gbV9wRW5naW5lLT5HZXRBbGlhc0NoYXIoKTsNCisgIH0NCisgIElGWF9DaGFySXRlciogcEl0ZXIgPQ0KKyAgICAgIEZYX05FVyBDRkRFX1R4dEVkdEJ1Zkl0ZXIoKENGREVfVHh0RWR0QnVmKilwVHh0QnVmLCB3Y0FsaWFzKTsNCisgIHBJdGVyLT5TZXRBdChtX25DaGFyU3RhcnQpOw0KKyAgaW50MzJfdCBuRW5kSW5kZXggPSBtX25DaGFyU3RhcnQgKyBtX25DaGFyQ291bnQ7DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBMaW5lQmFzZUFycjsNCisgIEZYX0JPT0wgYlJlbG9hZCA9IEZBTFNFOw0KKyAgRlhfRFdPUkQgZHdCcmVha1N0YXR1cyA9IEZYX1RYVEJSRUFLX05vbmU7DQorICBpbnQzMl90IG5UZXh0RW5kID0gbV9wRW5naW5lLT5HZXRUZXh0QnVmTGVuZ3RoKCk7DQorICBkbyB7DQorICAgIGlmIChiUmVsb2FkKSB7DQorICAgICAgZHdCcmVha1N0YXR1cyA9IHBUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9scERhdGEgPSBGWF9SZWFsbG9jKGludDMyX3QsIG1fbHBEYXRhLCAobkxpbmVDb3VudCArIDEpKTsNCisgICAgICBGWF9XQ0hBUiB3QXBwZW5kID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgICBkd0JyZWFrU3RhdHVzID0gcFR4dEJyZWFrLT5BcHBlbmRDaGFyKHdBcHBlbmQpOw0KICAgICB9DQotICAgIGludDMyX3QgKiBwSW50QXJyID0gKGludDMyX3QqKW1fbHBEYXRhOw0KLSAgICBwSW50QXJyWzBdID0gMTsNCi0gICAgbV9uTGluZUNvdW50ID0gbkxpbmVDb3VudDsNCi0gICAgcEludEFyciArKzsNCi0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbkxpbmVDb3VudDsgaiArKywgcEludEFyciArKykgew0KLSAgICAgICAgKnBJbnRBcnIgPSBMaW5lQmFzZUFycltqXTsNCisgICAgaWYgKHBJdGVyLT5HZXRBdCgpICsgMSA9PSBuRW5kSW5kZXggJiYNCisgICAgICAgIGR3QnJlYWtTdGF0dXMgPCBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsNCisgICAgICBkd0JyZWFrU3RhdHVzID0gcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQogICAgIH0NCi0gICAgTGluZUJhc2VBcnIuUmVtb3ZlQWxsKCk7DQorICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgIGludDMyX3QgbkNvdW50ID0gcFR4dEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7DQorICAgICAgaW50MzJfdCBuVG90YWwgPSAwOw0KKyAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG5Db3VudDsgaisrKSB7DQorICAgICAgICBjb25zdCBDRlhfVHh0UGllY2UqIFBpZWNlID0gcFR4dEJyZWFrLT5HZXRCcmVha1BpZWNlKGopOw0KKyAgICAgICAgblRvdGFsICs9IFBpZWNlLT5HZXRMZW5ndGgoKTsNCisgICAgICB9DQorICAgICAgTGluZUJhc2VBcnIuQWRkKG5Ub3RhbCk7DQorICAgICAgcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorICAgIH0NCisgICAgaWYgKChwSXRlci0+R2V0QXQoKSArIDEgPT0gbkVuZEluZGV4KSAmJg0KKyAgICAgICAgKGR3QnJlYWtTdGF0dXMgPT0gRlhfVFhUQlJFQUtfTGluZUJyZWFrKSkgew0KKyAgICAgIGJSZWxvYWQgPSBUUlVFOw0KKyAgICAgIHBJdGVyLT5OZXh0KFRSVUUpOw0KKyAgICB9DQorICB9IHdoaWxlIChwSXRlci0+TmV4dChGQUxTRSkgJiYgKHBJdGVyLT5HZXRBdCgpIDwgbkVuZEluZGV4KSk7DQorICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICBwVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCisgIGludDMyX3QgbkxpbmVDb3VudCA9IExpbmVCYXNlQXJyLkdldFNpemUoKTsNCisgIG1fbkxpbmVDb3VudCA9IG5MaW5lQ291bnQ7DQorICBpZiAobV9scERhdGEgPT0gTlVMTCkgew0KKyAgICBtX2xwRGF0YSA9IEZYX0FsbG9jKGludDMyX3QsIG5MaW5lQ291bnQgKyAxKTsNCisgIH0gZWxzZSB7DQorICAgIG1fbHBEYXRhID0gRlhfUmVhbGxvYyhpbnQzMl90LCBtX2xwRGF0YSwgKG5MaW5lQ291bnQgKyAxKSk7DQorICB9DQorICBpbnQzMl90KiBwSW50QXJyID0gKGludDMyX3QqKW1fbHBEYXRhOw0KKyAgcEludEFyclswXSA9IDE7DQorICBtX25MaW5lQ291bnQgPSBuTGluZUNvdW50Ow0KKyAgcEludEFycisrOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbkxpbmVDb3VudDsgaisrLCBwSW50QXJyKyspIHsNCisgICAgKnBJbnRBcnIgPSBMaW5lQmFzZUFycltqXTsNCisgIH0NCisgIExpbmVCYXNlQXJyLlJlbW92ZUFsbCgpOw0KIH0NCi12b2lkIENGREVfVHh0RWR0UGFyYWc6OlVubG9hZFBhcmFnKCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX2xwRGF0YSAhPSBOVUxMKTsNCi0gICAgKChpbnQzMl90KiltX2xwRGF0YSlbMF0tLTsNCi0gICAgRlhTWVNfYXNzZXJ0KCgoaW50MzJfdCopbV9scERhdGEpWzBdID49IDApOw0KLSAgICBpZiAoKChpbnQzMl90KiltX2xwRGF0YSlbMF0gPT0gMCkgew0KLSAgICAgICAgRlhfRnJlZShtX2xwRGF0YSk7DQotICAgICAgICBtX2xwRGF0YSA9IE5VTEw7DQotICAgIH0NCit2b2lkIENGREVfVHh0RWR0UGFyYWc6OlVubG9hZFBhcmFnKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fbHBEYXRhICE9IE5VTEwpOw0KKyAgKChpbnQzMl90KiltX2xwRGF0YSlbMF0tLTsNCisgIEZYU1lTX2Fzc2VydCgoKGludDMyX3QqKW1fbHBEYXRhKVswXSA+PSAwKTsNCisgIGlmICgoKGludDMyX3QqKW1fbHBEYXRhKVswXSA9PSAwKSB7DQorICAgIEZYX0ZyZWUobV9scERhdGEpOw0KKyAgICBtX2xwRGF0YSA9IE5VTEw7DQorICB9DQogfQ0KLXZvaWQgQ0ZERV9UeHRFZHRQYXJhZzo6Q2FsY0xpbmVzKCkNCi17DQotICAgIElGWF9UeHRCcmVhayAqIHBUeHRCcmVhawk9IG1fcEVuZ2luZS0+R2V0VGV4dEJyZWFrKCk7DQotICAgIElGREVfVHh0RWR0QnVmICogcFR4dEJ1Zgk9IG1fcEVuZ2luZS0+R2V0VGV4dEJ1ZigpOw0KLSAgICBJRlhfQ2hhckl0ZXIgKiBwSXRlcgk9IEZYX05FVyBDRkRFX1R4dEVkdEJ1Zkl0ZXIoKENGREVfVHh0RWR0QnVmKilwVHh0QnVmKTsNCi0gICAgaW50MzJfdCBuQ291bnQgPSAwOw0KLSAgICBGWF9EV09SRCBkd0JyZWFrU3RhdHVzID0gRlhfVFhUQlJFQUtfTm9uZTsNCi0gICAgaW50MzJfdCBuRW5kSW5kZXggPSBtX25DaGFyU3RhcnQgKyBtX25DaGFyQ291bnQ7DQotICAgIHBJdGVyLT5TZXRBdChtX25DaGFyU3RhcnQpOw0KLSAgICBGWF9CT09MIGJSZWxvYWQgPSBGQUxTRTsNCi0gICAgaW50MzJfdCBuVGV4dEVuZCA9IG1fcEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpOw0KLSAgICBkbyB7DQotICAgICAgICBpZiAoYlJlbG9hZCkgew0KLSAgICAgICAgICAgIGR3QnJlYWtTdGF0dXMgPSBwVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhfV0NIQVIgd0FwcGVuZCA9IHBJdGVyLT5HZXRDaGFyKCk7DQotICAgICAgICAgICAgZHdCcmVha1N0YXR1cyA9IHBUeHRCcmVhay0+QXBwZW5kQ2hhcih3QXBwZW5kKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwSXRlci0+R2V0QXQoKSArIDEgPT0gbkVuZEluZGV4ICYmIGR3QnJlYWtTdGF0dXMgPCBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsNCi0gICAgICAgICAgICBkd0JyZWFrU3RhdHVzID0gcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCi0gICAgICAgICAgICBuQ291bnQgKys7DQotICAgICAgICAgICAgcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoKHBJdGVyLT5HZXRBdCgpICsgMSA9PSBuRW5kSW5kZXgpICYmIChkd0JyZWFrU3RhdHVzID09IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykpIHsNCi0gICAgICAgICAgICBiUmVsb2FkID0gVFJVRTsNCi0gICAgICAgICAgICBwSXRlci0+TmV4dChUUlVFKTsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAocEl0ZXItPk5leHQoRkFMU0UpICYmIChwSXRlci0+R2V0QXQoKSA8IG5FbmRJbmRleCkpOw0KLSAgICBwSXRlci0+UmVsZWFzZSgpOw0KLSAgICBwVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCi0gICAgcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQotICAgIG1fbkxpbmVDb3VudCA9IG5Db3VudDsNCi19DQotdm9pZCBDRkRFX1R4dEVkdFBhcmFnOjpHZXRMaW5lUmFuZ2UoaW50MzJfdCBuTGluZUluZGV4LCBpbnQzMl90JiBuU3RhcnQsIGludDMyX3QmIG5Db3VudCkgY29uc3QNCi17DQotICAgIGludDMyX3QgKiBwTGluZUJhc2VBcnIgPSAoaW50MzJfdCopbV9scERhdGE7DQotICAgIEZYU1lTX2Fzc2VydChuTGluZUluZGV4IDwgbV9uTGluZUNvdW50KTsNCi0gICAgblN0YXJ0ID0gbV9uQ2hhclN0YXJ0Ow0KLSAgICBwTGluZUJhc2VBcnIgKys7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5MaW5lSW5kZXg7IGkgKyspIHsNCi0gICAgICAgIG5TdGFydCArPSAqcExpbmVCYXNlQXJyOw0KLSAgICAgICAgcExpbmVCYXNlQXJyICsrOw0KK3ZvaWQgQ0ZERV9UeHRFZHRQYXJhZzo6Q2FsY0xpbmVzKCkgew0KKyAgSUZYX1R4dEJyZWFrKiBwVHh0QnJlYWsgPSBtX3BFbmdpbmUtPkdldFRleHRCcmVhaygpOw0KKyAgSUZERV9UeHRFZHRCdWYqIHBUeHRCdWYgPSBtX3BFbmdpbmUtPkdldFRleHRCdWYoKTsNCisgIElGWF9DaGFySXRlciogcEl0ZXIgPSBGWF9ORVcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopcFR4dEJ1Zik7DQorICBpbnQzMl90IG5Db3VudCA9IDA7DQorICBGWF9EV09SRCBkd0JyZWFrU3RhdHVzID0gRlhfVFhUQlJFQUtfTm9uZTsNCisgIGludDMyX3QgbkVuZEluZGV4ID0gbV9uQ2hhclN0YXJ0ICsgbV9uQ2hhckNvdW50Ow0KKyAgcEl0ZXItPlNldEF0KG1fbkNoYXJTdGFydCk7DQorICBGWF9CT09MIGJSZWxvYWQgPSBGQUxTRTsNCisgIGludDMyX3QgblRleHRFbmQgPSBtX3BFbmdpbmUtPkdldFRleHRCdWZMZW5ndGgoKTsNCisgIGRvIHsNCisgICAgaWYgKGJSZWxvYWQpIHsNCisgICAgICBkd0JyZWFrU3RhdHVzID0gcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfV0NIQVIgd0FwcGVuZCA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgICAgZHdCcmVha1N0YXR1cyA9IHBUeHRCcmVhay0+QXBwZW5kQ2hhcih3QXBwZW5kKTsNCiAgICAgfQ0KLSAgICBuQ291bnQgPSAqcExpbmVCYXNlQXJyOw0KKyAgICBpZiAocEl0ZXItPkdldEF0KCkgKyAxID09IG5FbmRJbmRleCAmJg0KKyAgICAgICAgZHdCcmVha1N0YXR1cyA8IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykgew0KKyAgICAgIGR3QnJlYWtTdGF0dXMgPSBwVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgICAgfQ0KKyAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICBuQ291bnQrKzsNCisgICAgICBwVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCisgICAgfQ0KKyAgICBpZiAoKHBJdGVyLT5HZXRBdCgpICsgMSA9PSBuRW5kSW5kZXgpICYmDQorICAgICAgICAoZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19MaW5lQnJlYWspKSB7DQorICAgICAgYlJlbG9hZCA9IFRSVUU7DQorICAgICAgcEl0ZXItPk5leHQoVFJVRSk7DQorICAgIH0NCisgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KEZBTFNFKSAmJiAocEl0ZXItPkdldEF0KCkgPCBuRW5kSW5kZXgpKTsNCisgIHBJdGVyLT5SZWxlYXNlKCk7DQorICBwVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgIHBUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgbV9uTGluZUNvdW50ID0gbkNvdW50Ow0KK30NCit2b2lkIENGREVfVHh0RWR0UGFyYWc6OkdldExpbmVSYW5nZShpbnQzMl90IG5MaW5lSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5Db3VudCkgY29uc3Qgew0KKyAgaW50MzJfdCogcExpbmVCYXNlQXJyID0gKGludDMyX3QqKW1fbHBEYXRhOw0KKyAgRlhTWVNfYXNzZXJ0KG5MaW5lSW5kZXggPCBtX25MaW5lQ291bnQpOw0KKyAgblN0YXJ0ID0gbV9uQ2hhclN0YXJ0Ow0KKyAgcExpbmVCYXNlQXJyKys7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuTGluZUluZGV4OyBpKyspIHsNCisgICAgblN0YXJ0ICs9ICpwTGluZUJhc2VBcnI7DQorICAgIHBMaW5lQmFzZUFycisrOw0KKyAgfQ0KKyAgbkNvdW50ID0gKnBMaW5lQmFzZUFycjsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFyYWcuaCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhcmFnLmgKaW5kZXggOTM0ZGQ1NC4uYzM2ODViZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFyYWcuaAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYXJhZy5oCkBAIC04LDMyICs4LDI1IEBACiAjZGVmaW5lIF9GREVfVFhURURUUEFSQUdfSA0KIGNsYXNzIENGREVfVHh0RWR0RW5naW5lOw0KIGNsYXNzIENGREVfVHh0RWR0UGFyYWc7DQotY2xhc3MgQ0ZERV9UeHRFZHRQYXJhZyA6IHB1YmxpYyBJRkRFX1R4dEVkdFBhcmFnDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZERV9UeHRFZHRQYXJhZyhDRkRFX1R4dEVkdEVuZ2luZSAqIHBFbmdpbmUpOw0KLSAgICB+Q0ZERV9UeHRFZHRQYXJhZygpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRUZXh0TGVuZ3RoKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fbkNoYXJDb3VudDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsCWludDMyX3QJCQlHZXRTdGFydEluZGV4KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fbkNoYXJTdGFydDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlDb3VudExpbmVzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fbkxpbmVDb3VudDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJR2V0TGluZVJhbmdlKGludDMyX3QgbkxpbmVJbmRleCwgaW50MzJfdCYgblN0YXJ0LCBpbnQzMl90JiBuQ291bnQpIGNvbnN0Ow0KLSAgICB2b2lkCUxvYWRQYXJhZygpOw0KLSAgICB2b2lkCVVubG9hZFBhcmFnKCk7DQotICAgIHZvaWQJQ2FsY0xpbmVzKCk7DQotICAgIGludDMyX3QJbV9uQ2hhclN0YXJ0Ow0KLSAgICBpbnQzMl90CW1fbkNoYXJDb3VudDsNCi0gICAgaW50MzJfdAltX25MaW5lQ291bnQ7DQotcHJpdmF0ZToNCi0gICAgdm9pZCoJCQltX2xwRGF0YTsNCi0gICAgQ0ZERV9UeHRFZHRFbmdpbmUqCW1fcEVuZ2luZTsNCitjbGFzcyBDRkRFX1R4dEVkdFBhcmFnIDogcHVibGljIElGREVfVHh0RWR0UGFyYWcgew0KKyBwdWJsaWM6DQorICBDRkRFX1R4dEVkdFBhcmFnKENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lKTsNCisgIH5DRkRFX1R4dEVkdFBhcmFnKCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VGV4dExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbkNoYXJDb3VudDsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldFN0YXJ0SW5kZXgoKSBjb25zdCB7IHJldHVybiBtX25DaGFyU3RhcnQ7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudExpbmVzKCkgY29uc3QgeyByZXR1cm4gbV9uTGluZUNvdW50OyB9DQorICB2aXJ0dWFsIHZvaWQgR2V0TGluZVJhbmdlKGludDMyX3QgbkxpbmVJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ291bnQpIGNvbnN0Ow0KKyAgdm9pZCBMb2FkUGFyYWcoKTsNCisgIHZvaWQgVW5sb2FkUGFyYWcoKTsNCisgIHZvaWQgQ2FsY0xpbmVzKCk7DQorICBpbnQzMl90IG1fbkNoYXJTdGFydDsNCisgIGludDMyX3QgbV9uQ2hhckNvdW50Ow0KKyAgaW50MzJfdCBtX25MaW5lQ291bnQ7DQorDQorIHByaXZhdGU6DQorICB2b2lkKiBtX2xwRGF0YTsNCisgIENGREVfVHh0RWR0RW5naW5lKiBtX3BFbmdpbmU7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZnhfd29yZGJyZWFrL2Z4X3dvcmRicmVha19pbXBsLmNwcCBiL3hmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrX2ltcGwuY3BwCmluZGV4IDFmYWQwMjMuLmUzZDFmYzIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrX2ltcGwuY3BwCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrX2ltcGwuY3BwCkBAIC02LDI1OCArNiwyMzQgQEAKIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KICNpbmNsdWRlICJmeF93b3JkYnJlYWtfaW1wbC5oIg0KLSNkZWZpbmUgRlhfSXNPZGQoYSkgKChhKSAmIDEpDQotRlhfV29yZEJyZWFrUHJvcCBGWF9HZXRXb3JkQnJlYWtQcm9wZXJ0eShGWF9XQ0hBUiB3Y0NvZGVQb2ludCkNCi17DQotICAgIEZYX0RXT1JECWR3UHJvcGVydHkgPSAoRlhfRFdPUkQpZ3NfRlhfV29yZEJyZWFrX0NvZGVQb2ludFByb3BlcnRpZXNbd2NDb2RlUG9pbnQgPj4gMV07DQotICAgIHJldHVybiAoRlhfV29yZEJyZWFrUHJvcCkoRlhfSXNPZGQod2NDb2RlUG9pbnQpID8gKGR3UHJvcGVydHkgJiAweDBGKSA6IChkd1Byb3BlcnR5ID4+IDQpKTsNCisjZGVmaW5lIEZYX0lzT2RkKGEpICgoYSkmMSkNCitGWF9Xb3JkQnJlYWtQcm9wIEZYX0dldFdvcmRCcmVha1Byb3BlcnR5KEZYX1dDSEFSIHdjQ29kZVBvaW50KSB7DQorICBGWF9EV09SRCBkd1Byb3BlcnR5ID0NCisgICAgICAoRlhfRFdPUkQpZ3NfRlhfV29yZEJyZWFrX0NvZGVQb2ludFByb3BlcnRpZXNbd2NDb2RlUG9pbnQgPj4gMV07DQorICByZXR1cm4gKEZYX1dvcmRCcmVha1Byb3ApKEZYX0lzT2RkKHdjQ29kZVBvaW50KSA/IChkd1Byb3BlcnR5ICYgMHgwRikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGR3UHJvcGVydHkgPj4gNCkpOw0KIH0NCi1DRlhfQ2hhckl0ZXI6OkNGWF9DaGFySXRlcihjb25zdCBDRlhfV2lkZVN0cmluZyAmIHdzVGV4dCkNCi0gICAgOiBtX3dzVGV4dCh3c1RleHQpDQotICAgICwgbV9uSW5kZXgoMCkNCi17DQotICAgIEZYU1lTX2Fzc2VydCghd3NUZXh0LklzRW1wdHkoKSk7DQorQ0ZYX0NoYXJJdGVyOjpDRlhfQ2hhckl0ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkNCisgICAgOiBtX3dzVGV4dCh3c1RleHQpLCBtX25JbmRleCgwKSB7DQorICBGWFNZU19hc3NlcnQoIXdzVGV4dC5Jc0VtcHR5KCkpOw0KIH0NCi1DRlhfQ2hhckl0ZXI6On5DRlhfQ2hhckl0ZXIoKQ0KLXsNCitDRlhfQ2hhckl0ZXI6On5DRlhfQ2hhckl0ZXIoKSB7fQ0KK3ZvaWQgQ0ZYX0NoYXJJdGVyOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQogfQ0KLXZvaWQgQ0ZYX0NoYXJJdGVyOjpSZWxlYXNlKCkNCi17DQotICAgIGRlbGV0ZSB0aGlzOw0KLX0NCi1GWF9CT09MIENGWF9DaGFySXRlcjo6TmV4dChGWF9CT09MIGJQcmV2ICkNCi17DQotICAgIGlmIChiUHJldikgew0KLSAgICAgICAgaWYgKG1fbkluZGV4IDw9IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBtX25JbmRleCAtLTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChtX25JbmRleCArIDEgPj0gbV93c1RleHQuR2V0TGVuZ3RoKCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBtX25JbmRleCArKzsNCitGWF9CT09MIENGWF9DaGFySXRlcjo6TmV4dChGWF9CT09MIGJQcmV2KSB7DQorICBpZiAoYlByZXYpIHsNCisgICAgaWYgKG1fbkluZGV4IDw9IDApIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX1dDSEFSIENGWF9DaGFySXRlcjo6R2V0Q2hhcigpDQotew0KLSAgICByZXR1cm4gbV93c1RleHQuR2V0QXQobV9uSW5kZXgpOw0KLX0NCi12b2lkIENGWF9DaGFySXRlcjo6U2V0QXQoaW50MzJfdCBuSW5kZXgpDQotew0KLSAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV93c1RleHQuR2V0TGVuZ3RoKCkpIHsNCi0gICAgICAgIHJldHVybjsNCisgICAgbV9uSW5kZXgtLTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX25JbmRleCArIDEgPj0gbV93c1RleHQuR2V0TGVuZ3RoKCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgbV9uSW5kZXggPSBuSW5kZXg7DQorICAgIG1fbkluZGV4Kys7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotaW50MzJfdCBDRlhfQ2hhckl0ZXI6OkdldEF0KCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX25JbmRleDsNCitGWF9XQ0hBUiBDRlhfQ2hhckl0ZXI6OkdldENoYXIoKSB7DQorICByZXR1cm4gbV93c1RleHQuR2V0QXQobV9uSW5kZXgpOw0KIH0NCi1GWF9CT09MIENGWF9DaGFySXRlcjo6SXNFT0YoRlhfQk9PTCBiVGFpbCApIGNvbnN0DQotew0KLSAgICByZXR1cm4gYlRhaWwgPyAobV9uSW5kZXggKyAxID09IG1fd3NUZXh0LkdldExlbmd0aCgpKSA6IChtX25JbmRleCA9PSAwKTsNCit2b2lkIENGWF9DaGFySXRlcjo6U2V0QXQoaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX3dzVGV4dC5HZXRMZW5ndGgoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX25JbmRleCA9IG5JbmRleDsNCiB9DQotSUZYX0NoYXJJdGVyICogQ0ZYX0NoYXJJdGVyOjpDbG9uZSgpDQotew0KLSAgICBDRlhfQ2hhckl0ZXIgKiBwSXRlciA9IG5ldyBDRlhfQ2hhckl0ZXIobV93c1RleHQpOw0KLSAgICBwSXRlci0+bV9uSW5kZXggPSBtX25JbmRleDsNCi0gICAgcmV0dXJuIHBJdGVyOw0KK2ludDMyX3QgQ0ZYX0NoYXJJdGVyOjpHZXRBdCgpIGNvbnN0IHsNCisgIHJldHVybiBtX25JbmRleDsNCiB9DQotQ0ZYX1dvcmRCcmVhazo6Q0ZYX1dvcmRCcmVhaygpDQotICAgIDogbV9wUHJlSXRlcihOVUxMKQ0KLSAgICAsIG1fcEN1ckl0ZXIoTlVMTCkNCi17DQorRlhfQk9PTCBDRlhfQ2hhckl0ZXI6OklzRU9GKEZYX0JPT0wgYlRhaWwpIGNvbnN0IHsNCisgIHJldHVybiBiVGFpbCA/IChtX25JbmRleCArIDEgPT0gbV93c1RleHQuR2V0TGVuZ3RoKCkpIDogKG1fbkluZGV4ID09IDApOw0KIH0NCi1DRlhfV29yZEJyZWFrOjp+Q0ZYX1dvcmRCcmVhaygpDQotew0KLSAgICBpZiAobV9wUHJlSXRlcikgew0KLSAgICAgICAgbV9wUHJlSXRlci0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wUHJlSXRlciA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKG1fcEN1ckl0ZXIpIHsNCi0gICAgICAgIG1fcEN1ckl0ZXItPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcEN1ckl0ZXIgPSBOVUxMOw0KLSAgICB9DQorSUZYX0NoYXJJdGVyKiBDRlhfQ2hhckl0ZXI6OkNsb25lKCkgew0KKyAgQ0ZYX0NoYXJJdGVyKiBwSXRlciA9IG5ldyBDRlhfQ2hhckl0ZXIobV93c1RleHQpOw0KKyAgcEl0ZXItPm1fbkluZGV4ID0gbV9uSW5kZXg7DQorICByZXR1cm4gcEl0ZXI7DQogfQ0KLXZvaWQgQ0ZYX1dvcmRCcmVhazo6UmVsZWFzZSgpDQotew0KLSAgICBkZWxldGUgdGhpczsNCitDRlhfV29yZEJyZWFrOjpDRlhfV29yZEJyZWFrKCkgOiBtX3BQcmVJdGVyKE5VTEwpLCBtX3BDdXJJdGVyKE5VTEwpIHt9DQorQ0ZYX1dvcmRCcmVhazo6fkNGWF9Xb3JkQnJlYWsoKSB7DQorICBpZiAobV9wUHJlSXRlcikgew0KKyAgICBtX3BQcmVJdGVyLT5SZWxlYXNlKCk7DQorICAgIG1fcFByZUl0ZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEN1ckl0ZXIpIHsNCisgICAgbV9wQ3VySXRlci0+UmVsZWFzZSgpOw0KKyAgICBtX3BDdXJJdGVyID0gTlVMTDsNCisgIH0NCiB9DQotdm9pZCBDRlhfV29yZEJyZWFrOjpBdHRhY2goSUZYX0NoYXJJdGVyICogcEl0ZXIpDQotew0KLSAgICBGWFNZU19hc3NlcnQocEl0ZXIpOw0KLSAgICBtX3BDdXJJdGVyID0gcEl0ZXI7DQordm9pZCBDRlhfV29yZEJyZWFrOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQogfQ0KLXZvaWQgQ0ZYX1dvcmRCcmVhazo6QXR0YWNoKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICBtX3BDdXJJdGVyID0gbmV3IENGWF9DaGFySXRlcih3c1RleHQpOw0KK3ZvaWQgQ0ZYX1dvcmRCcmVhazo6QXR0YWNoKElGWF9DaGFySXRlciogcEl0ZXIpIHsNCisgIEZYU1lTX2Fzc2VydChwSXRlcik7DQorICBtX3BDdXJJdGVyID0gcEl0ZXI7DQogfQ0KLUZYX0JPT0wgQ0ZYX1dvcmRCcmVhazo6TmV4dChGWF9CT09MIGJQcmV2KQ0KLXsNCi0gICAgSUZYX0NoYXJJdGVyICogcEl0ZXIgPSBiUHJldiA/IG1fcFByZUl0ZXItPkNsb25lKCkgOiBtX3BDdXJJdGVyLT5DbG9uZSgpOw0KLSAgICBpZiAocEl0ZXItPklzRU9GKCFiUHJldikpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBwSXRlci0+TmV4dChiUHJldik7DQotICAgIGlmICghRmluZE5leHRCcmVha1BvcyhwSXRlciwgYlByZXYsIFRSVUUpKSB7DQotICAgICAgICBwSXRlci0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmIChiUHJldikgew0KLSAgICAgICAgbV9wQ3VySXRlci0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wQ3VySXRlciA9IG1fcFByZUl0ZXI7DQotICAgICAgICBtX3BDdXJJdGVyLT5OZXh0KFRSVUUpOw0KLSAgICAgICAgbV9wUHJlSXRlciA9IHBJdGVyOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wUHJlSXRlci0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wUHJlSXRlciA9IG1fcEN1ckl0ZXI7DQotICAgICAgICBtX3BQcmVJdGVyLT5OZXh0KCk7DQotICAgICAgICBtX3BDdXJJdGVyID0gcEl0ZXI7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQordm9pZCBDRlhfV29yZEJyZWFrOjpBdHRhY2goY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgbV9wQ3VySXRlciA9IG5ldyBDRlhfQ2hhckl0ZXIod3NUZXh0KTsNCiB9DQotdm9pZCBDRlhfV29yZEJyZWFrOjpTZXRBdChpbnQzMl90IG5JbmRleCkNCi17DQotICAgIGlmIChtX3BQcmVJdGVyKSB7DQotICAgICAgICBtX3BQcmVJdGVyLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BQcmVJdGVyID0gTlVMTDsNCi0gICAgfQ0KLSAgICBtX3BDdXJJdGVyLT5TZXRBdChuSW5kZXgpOw0KLSAgICBGaW5kTmV4dEJyZWFrUG9zKG1fcEN1ckl0ZXIsIFRSVUUsIEZBTFNFKTsNCitGWF9CT09MIENGWF9Xb3JkQnJlYWs6Ok5leHQoRlhfQk9PTCBiUHJldikgew0KKyAgSUZYX0NoYXJJdGVyKiBwSXRlciA9IGJQcmV2ID8gbV9wUHJlSXRlci0+Q2xvbmUoKSA6IG1fcEN1ckl0ZXItPkNsb25lKCk7DQorICBpZiAocEl0ZXItPklzRU9GKCFiUHJldikpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcEl0ZXItPk5leHQoYlByZXYpOw0KKyAgaWYgKCFGaW5kTmV4dEJyZWFrUG9zKHBJdGVyLCBiUHJldiwgVFJVRSkpIHsNCisgICAgcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJQcmV2KSB7DQorICAgIG1fcEN1ckl0ZXItPlJlbGVhc2UoKTsNCisgICAgbV9wQ3VySXRlciA9IG1fcFByZUl0ZXI7DQorICAgIG1fcEN1ckl0ZXItPk5leHQoVFJVRSk7DQorICAgIG1fcFByZUl0ZXIgPSBwSXRlcjsNCisgIH0gZWxzZSB7DQorICAgIG1fcFByZUl0ZXItPlJlbGVhc2UoKTsNCiAgICAgbV9wUHJlSXRlciA9IG1fcEN1ckl0ZXI7DQotICAgIG1fcEN1ckl0ZXIgPSBtX3BQcmVJdGVyLT5DbG9uZSgpOw0KLSAgICBGaW5kTmV4dEJyZWFrUG9zKG1fcEN1ckl0ZXIsIEZBTFNFLCBGQUxTRSk7DQorICAgIG1fcFByZUl0ZXItPk5leHQoKTsNCisgICAgbV9wQ3VySXRlciA9IHBJdGVyOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLWludDMyX3QgQ0ZYX1dvcmRCcmVhazo6R2V0V29yZFBvcygpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wUHJlSXRlci0+R2V0QXQoKTsNCit2b2lkIENGWF9Xb3JkQnJlYWs6OlNldEF0KGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobV9wUHJlSXRlcikgew0KKyAgICBtX3BQcmVJdGVyLT5SZWxlYXNlKCk7DQorICAgIG1fcFByZUl0ZXIgPSBOVUxMOw0KKyAgfQ0KKyAgbV9wQ3VySXRlci0+U2V0QXQobkluZGV4KTsNCisgIEZpbmROZXh0QnJlYWtQb3MobV9wQ3VySXRlciwgVFJVRSwgRkFMU0UpOw0KKyAgbV9wUHJlSXRlciA9IG1fcEN1ckl0ZXI7DQorICBtX3BDdXJJdGVyID0gbV9wUHJlSXRlci0+Q2xvbmUoKTsNCisgIEZpbmROZXh0QnJlYWtQb3MobV9wQ3VySXRlciwgRkFMU0UsIEZBTFNFKTsNCiB9DQotaW50MzJfdCBDRlhfV29yZEJyZWFrOjpHZXRXb3JkTGVuZ3RoKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3BDdXJJdGVyLT5HZXRBdCgpIC0gbV9wUHJlSXRlci0+R2V0QXQoKSArIDE7DQoraW50MzJfdCBDRlhfV29yZEJyZWFrOjpHZXRXb3JkUG9zKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcFByZUl0ZXItPkdldEF0KCk7DQogfQ0KLXZvaWQgQ0ZYX1dvcmRCcmVhazo6R2V0V29yZChDRlhfV2lkZVN0cmluZyAmd3NXb3JkKSBjb25zdA0KLXsNCi0gICAgaW50MzJfdCBuV29yZExlbmd0aCA9IEdldFdvcmRMZW5ndGgoKTsNCi0gICAgaWYgKG5Xb3JkTGVuZ3RoIDw9IDApIHsNCi0gICAgICAgIHJldHVybjsNCitpbnQzMl90IENGWF9Xb3JkQnJlYWs6OkdldFdvcmRMZW5ndGgoKSBjb25zdCB7DQorICByZXR1cm4gbV9wQ3VySXRlci0+R2V0QXQoKSAtIG1fcFByZUl0ZXItPkdldEF0KCkgKyAxOw0KK30NCit2b2lkIENGWF9Xb3JkQnJlYWs6OkdldFdvcmQoQ0ZYX1dpZGVTdHJpbmcmIHdzV29yZCkgY29uc3Qgew0KKyAgaW50MzJfdCBuV29yZExlbmd0aCA9IEdldFdvcmRMZW5ndGgoKTsNCisgIGlmIChuV29yZExlbmd0aCA8PSAwKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX1dDSEFSKiBscEJ1ZiA9IHdzV29yZC5HZXRCdWZmZXIobldvcmRMZW5ndGgpOw0KKyAgSUZYX0NoYXJJdGVyKiBwVGVtcEl0ZXIgPSBtX3BQcmVJdGVyLT5DbG9uZSgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIHdoaWxlIChwVGVtcEl0ZXItPkdldEF0KCkgPD0gbV9wQ3VySXRlci0+R2V0QXQoKSkgew0KKyAgICBscEJ1ZltpKytdID0gcFRlbXBJdGVyLT5HZXRDaGFyKCk7DQorICAgIEZYX0JPT0wgYkVuZCA9IHBUZW1wSXRlci0+TmV4dCgpOw0KKyAgICBpZiAoIWJFbmQpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBGWF9XQ0hBUiogbHBCdWYgPSB3c1dvcmQuR2V0QnVmZmVyKG5Xb3JkTGVuZ3RoKTsNCi0gICAgSUZYX0NoYXJJdGVyICogcFRlbXBJdGVyID0gbV9wUHJlSXRlci0+Q2xvbmUoKTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgd2hpbGUgKHBUZW1wSXRlci0+R2V0QXQoKSA8PSBtX3BDdXJJdGVyLT5HZXRBdCgpKSB7DQotICAgICAgICBscEJ1ZltpKytdID0gcFRlbXBJdGVyLT5HZXRDaGFyKCk7DQotICAgICAgICBGWF9CT09MIGJFbmQgPSBwVGVtcEl0ZXItPk5leHQoKTsNCi0gICAgICAgIGlmICghYkVuZCkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHBUZW1wSXRlci0+UmVsZWFzZSgpOw0KLSAgICB3c1dvcmQuUmVsZWFzZUJ1ZmZlcihuV29yZExlbmd0aCk7DQorICB9DQorICBwVGVtcEl0ZXItPlJlbGVhc2UoKTsNCisgIHdzV29yZC5SZWxlYXNlQnVmZmVyKG5Xb3JkTGVuZ3RoKTsNCiB9DQotRlhfQk9PTCBDRlhfV29yZEJyZWFrOjpJc0VPRihGWF9CT09MIGJUYWlsKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fcEN1ckl0ZXItPklzRU9GKGJUYWlsKTsNCitGWF9CT09MIENGWF9Xb3JkQnJlYWs6OklzRU9GKEZYX0JPT0wgYlRhaWwpIGNvbnN0IHsNCisgIHJldHVybiBtX3BDdXJJdGVyLT5Jc0VPRihiVGFpbCk7DQogfQ0KLUZYX0JPT0wgQ0ZYX1dvcmRCcmVhazo6RmluZE5leHRCcmVha1BvcyhJRlhfQ2hhckl0ZXIgKiBwSXRlciwgRlhfQk9PTCBiUHJldiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRnJvbU5leHQgKQ0KLXsNCi0gICAgRlhfV29yZEJyZWFrUHJvcCBlUHJlVHlwZQk9IEZYX1dvcmRCcmVha1Byb3BfTm9uZTsNCi0gICAgRlhfV29yZEJyZWFrUHJvcCBlQ3VyVHlwZQk9IEZYX1dvcmRCcmVha1Byb3BfTm9uZTsNCi0gICAgRlhfV29yZEJyZWFrUHJvcCBlTmV4dFR5cGUgPSBGWF9Xb3JkQnJlYWtQcm9wX05vbmU7DQotICAgIGlmIChwSXRlci0+SXNFT0YoIWJQcmV2KSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgaWYgKCEoYkZyb21OZXh0IHx8IHBJdGVyLT5Jc0VPRihiUHJldikpKSB7DQotICAgICAgICBwSXRlci0+TmV4dCghYlByZXYpOw0KLSAgICAgICAgRlhfV0NIQVIJd2NUZW1wCT0gcEl0ZXItPkdldENoYXIoKTsNCi0gICAgICAgIGVQcmVUeXBlID0gRlhfR2V0V29yZEJyZWFrUHJvcGVydHkod2NUZW1wKTsNCi0gICAgICAgIHBJdGVyLT5OZXh0KGJQcmV2KTsNCi0gICAgfQ0KLSAgICBGWF9XQ0hBUgl3Y1RlbXAJPSBwSXRlci0+R2V0Q2hhcigpOw0KLSAgICBlQ3VyVHlwZSA9IEZYX0dldFdvcmRCcmVha1Byb3BlcnR5KHdjVGVtcCk7DQotICAgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsNCi0gICAgZG8gew0KLSAgICAgICAgcEl0ZXItPk5leHQoYlByZXYpOw0KLSAgICAgICAgRlhfV0NIQVIJd2NUZW1wCT0gcEl0ZXItPkdldENoYXIoKTsNCi0gICAgICAgIGVOZXh0VHlwZSA9IEZYX0dldFdvcmRCcmVha1Byb3BlcnR5KHdjVGVtcCk7DQotICAgICAgICBGWF9XT1JEIHdCcmVhayA9IGdzX0ZYX1dvcmRCcmVha19UYWJsZVtlQ3VyVHlwZV0gJiAoKEZYX1dPUkQpKDEgPDwgZU5leHRUeXBlKSk7DQotICAgICAgICBpZiAod0JyZWFrKSB7DQotICAgICAgICAgICAgaWYgKHBJdGVyLT5Jc0VPRighYlByZXYpKSB7DQotICAgICAgICAgICAgICAgIHBJdGVyLT5OZXh0KCFiUHJldik7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgbkZsYWdzID0gMDsNCi0gICAgICAgICAgICAgICAgaWYgKGVDdXJUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTWlkTGV0dGVyKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5GbGFncyA9IDE7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWROdW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9OdW1iZXJpYykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5GbGFncyA9IDI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWROdW1MZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9BTGV0dGVyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbkZsYWdzID0gMTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBuRmxhZ3MgPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChuRmxhZ3MgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQobkZsYWdzIDw9IDIpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoKG5GbGFncyA9PSAxICYmIGVQcmVUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5GbGFncyA9PSAyICYmIGVQcmVUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBJdGVyLT5OZXh0KCFiUHJldik7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwSXRlci0+TmV4dChiUHJldik7DQotICAgICAgICAgICAgICAgICAgICB3QnJlYWsgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHdCcmVhaykgew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IG5GbGFncyA9IDA7DQotICAgICAgICAgICAgICAgIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWRMZXR0ZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChlQ3VyVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBuRmxhZ3MgPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX01pZE51bSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVDdXJUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBuRmxhZ3MgPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX01pZE51bUxldCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVDdXJUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5GbGFncyA9IDE7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVDdXJUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBuRmxhZ3MgPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChuRmxhZ3MgPD0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgcEl0ZXItPk5leHQoIWJQcmV2KTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChuRmxhZ3MgPD0gMik7DQotICAgICAgICAgICAgICAgIHBJdGVyLT5OZXh0KGJQcmV2KTsNCi0gICAgICAgICAgICAgICAgd2NUZW1wID0gcEl0ZXItPkdldENoYXIoKTsNCi0gICAgICAgICAgICAgICAgZU5leHRUeXBlID0gKEZYX1dvcmRCcmVha1Byb3ApRlhfR2V0V29yZEJyZWFrUHJvcGVydHkod2NUZW1wKTsNCi0gICAgICAgICAgICAgICAgaWYgKCEoKG5GbGFncyA9PSAxICYmIGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIpIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgKG5GbGFncyA9PSAyICYmIGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBJdGVyLT5OZXh0KCFiUHJldik7DQotICAgICAgICAgICAgICAgICAgICBwSXRlci0+TmV4dCghYlByZXYpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlUHJlVHlwZQk9IGVDdXJUeXBlOw0KLSAgICAgICAgZUN1clR5cGUJPSBlTmV4dFR5cGU7DQotICAgICAgICBiRmlyc3QJCT0gRkFMU0U7DQotICAgIH0gd2hpbGUgKCFwSXRlci0+SXNFT0YoIWJQcmV2KSk7DQorRlhfQk9PTCBDRlhfV29yZEJyZWFrOjpGaW5kTmV4dEJyZWFrUG9zKElGWF9DaGFySXRlciogcEl0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByZXYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZyb21OZXh0KSB7DQorICBGWF9Xb3JkQnJlYWtQcm9wIGVQcmVUeXBlID0gRlhfV29yZEJyZWFrUHJvcF9Ob25lOw0KKyAgRlhfV29yZEJyZWFrUHJvcCBlQ3VyVHlwZSA9IEZYX1dvcmRCcmVha1Byb3BfTm9uZTsNCisgIEZYX1dvcmRCcmVha1Byb3AgZU5leHRUeXBlID0gRlhfV29yZEJyZWFrUHJvcF9Ob25lOw0KKyAgaWYgKHBJdGVyLT5Jc0VPRighYlByZXYpKSB7DQogICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKCEoYkZyb21OZXh0IHx8IHBJdGVyLT5Jc0VPRihiUHJldikpKSB7DQorICAgIHBJdGVyLT5OZXh0KCFiUHJldik7DQorICAgIEZYX1dDSEFSIHdjVGVtcCA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgIGVQcmVUeXBlID0gRlhfR2V0V29yZEJyZWFrUHJvcGVydHkod2NUZW1wKTsNCisgICAgcEl0ZXItPk5leHQoYlByZXYpOw0KKyAgfQ0KKyAgRlhfV0NIQVIgd2NUZW1wID0gcEl0ZXItPkdldENoYXIoKTsNCisgIGVDdXJUeXBlID0gRlhfR2V0V29yZEJyZWFrUHJvcGVydHkod2NUZW1wKTsNCisgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsNCisgIGRvIHsNCisgICAgcEl0ZXItPk5leHQoYlByZXYpOw0KKyAgICBGWF9XQ0hBUiB3Y1RlbXAgPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICBlTmV4dFR5cGUgPSBGWF9HZXRXb3JkQnJlYWtQcm9wZXJ0eSh3Y1RlbXApOw0KKyAgICBGWF9XT1JEIHdCcmVhayA9DQorICAgICAgICBnc19GWF9Xb3JkQnJlYWtfVGFibGVbZUN1clR5cGVdICYgKChGWF9XT1JEKSgxIDw8IGVOZXh0VHlwZSkpOw0KKyAgICBpZiAod0JyZWFrKSB7DQorICAgICAgaWYgKHBJdGVyLT5Jc0VPRighYlByZXYpKSB7DQorICAgICAgICBwSXRlci0+TmV4dCghYlByZXYpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGlmIChiRmlyc3QpIHsNCisgICAgICAgIGludDMyX3QgbkZsYWdzID0gMDsNCisgICAgICAgIGlmIChlQ3VyVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX01pZExldHRlcikgew0KKyAgICAgICAgICBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgew0KKyAgICAgICAgICAgIG5GbGFncyA9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWROdW0pIHsNCisgICAgICAgICAgaWYgKGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljKSB7DQorICAgICAgICAgICAgbkZsYWdzID0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChlQ3VyVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX01pZE51bUxldCkgew0KKyAgICAgICAgICBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgew0KKyAgICAgICAgICAgIG5GbGFncyA9IDE7DQorICAgICAgICAgIH0gZWxzZSBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMpIHsNCisgICAgICAgICAgICBuRmxhZ3MgPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAobkZsYWdzID4gMCkgew0KKyAgICAgICAgICBGWFNZU19hc3NlcnQobkZsYWdzIDw9IDIpOw0KKyAgICAgICAgICBpZiAoISgobkZsYWdzID09IDEgJiYgZVByZVR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9BTGV0dGVyKSB8fA0KKyAgICAgICAgICAgICAgICAobkZsYWdzID09IDIgJiYgZVByZVR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9OdW1iZXJpYykpKSB7DQorICAgICAgICAgICAgcEl0ZXItPk5leHQoIWJQcmV2KTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwSXRlci0+TmV4dChiUHJldik7DQorICAgICAgICAgIHdCcmVhayA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYkZpcnN0ID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmICh3QnJlYWspIHsNCisgICAgICAgIGludDMyX3QgbkZsYWdzID0gMDsNCisgICAgICAgIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWRMZXR0ZXIpIHsNCisgICAgICAgICAgaWYgKGVDdXJUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgew0KKyAgICAgICAgICAgIG5GbGFncyA9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTWlkTnVtKSB7DQorICAgICAgICAgIGlmIChlQ3VyVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljKSB7DQorICAgICAgICAgICAgbkZsYWdzID0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWROdW1MZXQpIHsNCisgICAgICAgICAgaWYgKGVDdXJUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgew0KKyAgICAgICAgICAgIG5GbGFncyA9IDE7DQorICAgICAgICAgIH0gZWxzZSBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9OdW1iZXJpYykgew0KKyAgICAgICAgICAgIG5GbGFncyA9IDI7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChuRmxhZ3MgPD0gMCkgew0KKyAgICAgICAgICBwSXRlci0+TmV4dCghYlByZXYpOw0KKyAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIEZYU1lTX2Fzc2VydChuRmxhZ3MgPD0gMik7DQorICAgICAgICBwSXRlci0+TmV4dChiUHJldik7DQorICAgICAgICB3Y1RlbXAgPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICAgICAgZU5leHRUeXBlID0gKEZYX1dvcmRCcmVha1Byb3ApRlhfR2V0V29yZEJyZWFrUHJvcGVydHkod2NUZW1wKTsNCisgICAgICAgIGlmICghKChuRmxhZ3MgPT0gMSAmJiBlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9BTGV0dGVyKSB8fA0KKyAgICAgICAgICAgICAgKG5GbGFncyA9PSAyICYmIGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljKSkpIHsNCisgICAgICAgICAgcEl0ZXItPk5leHQoIWJQcmV2KTsNCisgICAgICAgICAgcEl0ZXItPk5leHQoIWJQcmV2KTsNCisgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVQcmVUeXBlID0gZUN1clR5cGU7DQorICAgIGVDdXJUeXBlID0gZU5leHRUeXBlOw0KKyAgICBiRmlyc3QgPSBGQUxTRTsNCisgIH0gd2hpbGUgKCFwSXRlci0+SXNFT0YoIWJQcmV2KSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotSUZYX1dvcmRCcmVhayAqIEZYX1dvcmRCcmVha19DcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBDRlhfV29yZEJyZWFrOw0KK0lGWF9Xb3JkQnJlYWsqIEZYX1dvcmRCcmVha19DcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IENGWF9Xb3JkQnJlYWs7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrX2ltcGwuaCBiL3hmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrX2ltcGwuaAppbmRleCAzOTU0ZjAxLi40NDE4NTk1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZlZS9zcmMvZnhfd29yZGJyZWFrL2Z4X3dvcmRicmVha19pbXBsLmgKKysrIGIveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtfaW1wbC5oCkBAIC05LDU2ICs5LDYwIEBACiBleHRlcm4gY29uc3QgRlhfV09SRCBnc19GWF9Xb3JkQnJlYWtfVGFibGVbMTZdOw0KIGV4dGVybiBjb25zdCB1aW50OF90IGdzX0ZYX1dvcmRCcmVha19Db2RlUG9pbnRQcm9wZXJ0aWVzWygweEZGRkYgLSAxKSAvIDIgKyAxXTsNCiBlbnVtIEZYX1dvcmRCcmVha1Byb3Agew0KLSAgICBGWF9Xb3JkQnJlYWtQcm9wX05vbmUJCT0gMAksDQotICAgIEZYX1dvcmRCcmVha1Byb3BfQ1IJCQkJLA0KLSAgICBGWF9Xb3JkQnJlYWtQcm9wX0xGCQkJCSwNCi0gICAgRlhfV29yZEJyZWFrUHJvcF9OZXdMaW5lCQksDQotICAgIEZYX1dvcmRCcmVha1Byb3BfRXh0ZW5kCQkJLA0KLSAgICBGWF9Xb3JkQnJlYWtQcm9wX0Zvcm1hdAkJCSwNCi0gICAgRlhfV29yZEJyZWFrUHJvcF9LYXRhS2FuYQkJLA0KLSAgICBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIJCSwNCi0gICAgRlhfV29yZEJyZWFrUHJvcF9NaWRMZXR0ZXIJCSwNCi0gICAgRlhfV29yZEJyZWFrUHJvcF9NaWROdW0JCQksDQotICAgIEZYX1dvcmRCcmVha1Byb3BfTWlkTnVtTGV0CQksDQotICAgIEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMJCSwNCi0gICAgRlhfV29yZEJyZWFrUHJvcF9FeHRlbmROdW1MZXQJLA0KKyAgRlhfV29yZEJyZWFrUHJvcF9Ob25lID0gMCwNCisgIEZYX1dvcmRCcmVha1Byb3BfQ1IsDQorICBGWF9Xb3JkQnJlYWtQcm9wX0xGLA0KKyAgRlhfV29yZEJyZWFrUHJvcF9OZXdMaW5lLA0KKyAgRlhfV29yZEJyZWFrUHJvcF9FeHRlbmQsDQorICBGWF9Xb3JkQnJlYWtQcm9wX0Zvcm1hdCwNCisgIEZYX1dvcmRCcmVha1Byb3BfS2F0YUthbmEsDQorICBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIsDQorICBGWF9Xb3JkQnJlYWtQcm9wX01pZExldHRlciwNCisgIEZYX1dvcmRCcmVha1Byb3BfTWlkTnVtLA0KKyAgRlhfV29yZEJyZWFrUHJvcF9NaWROdW1MZXQsDQorICBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljLA0KKyAgRlhfV29yZEJyZWFrUHJvcF9FeHRlbmROdW1MZXQsDQogfTsNCiBGWF9Xb3JkQnJlYWtQcm9wIEZYX0dldFdvcmRCcmVha1Byb3BlcnR5KEZYX1dDSEFSIHdjQ29kZVBvaW50KTsNCi1jbGFzcyBDRlhfQ2hhckl0ZXIgOiBwdWJsaWMgSUZYX0NoYXJJdGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX0NoYXJJdGVyKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgd3NUZXh0KTsNCi0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJTmV4dChGWF9CT09MIGJQcmV2ID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldENoYXIoKTsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRBdChpbnQzMl90IG5JbmRleCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRBdCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzRU9GKEZYX0JPT0wgYlRhaWwgPSBUUlVFKSBjb25zdDsNCi0gICAgdmlydHVhbCBJRlhfQ2hhckl0ZXIgKiBDbG9uZSgpOw0KLXByb3RlY3RlZDoNCi0gICAgfkNGWF9DaGFySXRlcigpOw0KLXByaXZhdGU6DQotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nICZtX3dzVGV4dDsNCi0gICAgaW50MzJfdAltX25JbmRleDsNCitjbGFzcyBDRlhfQ2hhckl0ZXIgOiBwdWJsaWMgSUZYX0NoYXJJdGVyIHsNCisgcHVibGljOg0KKyAgQ0ZYX0NoYXJJdGVyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBOZXh0KEZYX0JPT0wgYlByZXYgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldENoYXIoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRBdChpbnQzMl90IG5JbmRleCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0QXQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRihGWF9CT09MIGJUYWlsID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIElGWF9DaGFySXRlciogQ2xvbmUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgfkNGWF9DaGFySXRlcigpOw0KKw0KKyBwcml2YXRlOg0KKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG1fd3NUZXh0Ow0KKyAgaW50MzJfdCBtX25JbmRleDsNCiB9Ow0KLWNsYXNzIENGWF9Xb3JkQnJlYWsgOiBwdWJsaWMgSUZYX1dvcmRCcmVhaw0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9Xb3JkQnJlYWsoKTsNCi0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJQXR0YWNoKElGWF9DaGFySXRlciAqIHBJdGVyKTsNCi0gICAgdmlydHVhbCB2b2lkCQlBdHRhY2goY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJTmV4dChGWF9CT09MIGJQcmV2KTsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRBdChpbnQzMl90IG5JbmRleCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRXb3JkUG9zKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRXb3JkTGVuZ3RoKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJR2V0V29yZChDRlhfV2lkZVN0cmluZyAmd3NXb3JkKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc0VPRihGWF9CT09MIGJUYWlsICkgY29uc3Q7DQotcHJvdGVjdGVkOg0KLSAgICB+Q0ZYX1dvcmRCcmVhaygpOw0KLSAgICBGWF9CT09MIEZpbmROZXh0QnJlYWtQb3MoSUZYX0NoYXJJdGVyICogcEl0ZXIsIEZYX0JPT0wgYlByZXYsIEZYX0JPT0wgYkZyb21OZXh0ID0gVFJVRSk7DQotcHJpdmF0ZToNCi0gICAgSUZYX0NoYXJJdGVyICogbV9wUHJlSXRlcjsNCi0gICAgSUZYX0NoYXJJdGVyICogbV9wQ3VySXRlcjsNCitjbGFzcyBDRlhfV29yZEJyZWFrIDogcHVibGljIElGWF9Xb3JkQnJlYWsgew0KKyBwdWJsaWM6DQorICBDRlhfV29yZEJyZWFrKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCB2b2lkIEF0dGFjaChJRlhfQ2hhckl0ZXIqIHBJdGVyKTsNCisgIHZpcnR1YWwgdm9pZCBBdHRhY2goY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTmV4dChGWF9CT09MIGJQcmV2KTsNCisgIHZpcnR1YWwgdm9pZCBTZXRBdChpbnQzMl90IG5JbmRleCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0V29yZFBvcygpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdvcmRMZW5ndGgoKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRXb3JkKENGWF9XaWRlU3RyaW5nJiB3c1dvcmQpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKEZYX0JPT0wgYlRhaWwpIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICB+Q0ZYX1dvcmRCcmVhaygpOw0KKyAgRlhfQk9PTCBGaW5kTmV4dEJyZWFrUG9zKElGWF9DaGFySXRlciogcEl0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJldiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGcm9tTmV4dCA9IFRSVUUpOw0KKw0KKyBwcml2YXRlOg0KKyAgSUZYX0NoYXJJdGVyKiBtX3BQcmVJdGVyOw0KKyAgSUZYX0NoYXJJdGVyKiBtX3BDdXJJdGVyOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtkYXRhLmNwcCBiL3hmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrZGF0YS5jcHAKaW5kZXggOTU3ZDJmYy4uOGNmMmMyYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtkYXRhLmNwcAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZnhfd29yZGJyZWFrL2Z4X3dvcmRicmVha2RhdGEuY3BwCkBAIC0xMCwyMDUzICsxMCwyNzM3IEBACiAgICAgMHhGRkZGLCAweEZGRjksIDB4RkZGQiwgMHhGRkZCLCAweEZGRkIsIDB4RkZGQiwgMHhFRkJCLCAweEU3N0IsDQogICAgIDB4RkZGQiwgMHhGRkZCLCAweEZGRkIsIDB4RTc3QiwgMHhFNzNCLCAweEZGRkIsIDB4RkZGQiwgMHhGRkZCLA0KIH07DQotZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ3NfRlhfV29yZEJyZWFrX0NvZGVQb2ludFByb3BlcnRpZXNbKDB4RkZGRiAtIDEpIC8gMiArIDFdID0gew0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIzLCAweDMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDkwLCAweEEwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDg5LCAweDAwLCAweDAwLA0KLSAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDBDLA0KLSAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDA4LCAweDAwLCAweDcwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDkwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDc4LCAweDc3LCAweDcwLCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LA0KLSAgICAweDA0LCAweDQwLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLA0KLSAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLA0KLSAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDBCLCAweDkwLCAweDc3LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ1LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ3LCAweDc0LCAweDQwLCAweDQ0LCAweDQ0LCAweDc3LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDcwLCAweDA3LA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDc0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc3LCAweDAwLCAweDkwLCAweDcwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDc0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDc0LCAweDQ0LCAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDA3LCAweDcwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LCAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQwLCAweDA0LCAweDQwLCAweDA0LCAweDQ0LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDc3LCAweDA3LA0KLSAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDA3LCAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDA3LCAweDcwLCAweDc3LCAweDAwLCAweDQwLCAweDQ0LA0KLSAgICAweDQ0LCAweDQwLCAweDAwLCAweDA0LCAweDQwLCAweDA0LCAweDQ0LCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDcwLCAweDcwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDQ0LCAweDc3LCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LCAweDQ0LCAweDA0LCAweDQ0LCAweDAwLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LCAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQwLCAweDA0LCAweDQwLCAweDA0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDc3LCAweDA3LA0KLSAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDQ3LCAweDA3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDcwLCAweDcwLCAweDc3LA0KLSAgICAweDAwLCAweDA3LCAweDcwLCAweDAwLCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDQ0LA0KLSAgICAweDQ0LCAweDQwLCAweDAwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDAwLCAweDcwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQwLCAweDc3LCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLA0KLSAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDAwLCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDQwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQwLCAweDQwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LCAweDQwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDQ0LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLA0KLSAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDQ0LA0KLSAgICAweDQwLCAweDQ0LCAweDQwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDA0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDQ0LCAweDQ0LCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDcwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDcwLCAweDc3LCAweDc3LCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KLSAgICAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDA0LA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDcwLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU1LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLA0KLSAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDcwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEIwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDA0LA0KLSAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDQ0LCAweDQ0LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDQ0LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDc3LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDA3LCAweDc3LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ3LCAweDc3LCAweDc0LCAweDc3LCAweDc3LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDcwLA0KLSAgICAweDAwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFBLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweEEwLCAweDA4LCAweDMzLCAweDU1LCAweDU1LCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLA0KLSAgICAweEMwLCAweDAwLCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDU1LCAweDU1LCAweDUwLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDU1LCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDcwLCAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDcwLCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LA0KLSAgICAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDA2LCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDA3LCAweDcwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ2LCAweDYwLCAweDAwLA0KLSAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KLSAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KLSAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDYwLCAweDY2LCAweDY2LA0KLSAgICAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KLSAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDYwLA0KLSAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KLSAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KLSAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDA3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDQ3LCAweDc3LCAweDQ3LCAweDc3LCAweDc0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDAwLCAweDAwLA0KLSAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLA0KLSAgICAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KLSAgICAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDQ0LCAweDQwLCAweDA0LCAweDQwLCAweDAwLCAweDAwLCAweDQ0LA0KLSAgICAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDA3LCAweDQ3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDcwLCAweDcwLA0KLSAgICAweDc3LCAweDA3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDkwLCAweDA4LCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweENDLCAweDkwLCAweEEwLCAweDk4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA1LA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDkwLCAweEEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDAwLCAweDAwLA0KLSAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDBDLA0KLSAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KLSAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDQ0LA0KLSAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KLSAgICAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDcwLCAweDAwLA0KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDU1LCAweDAwLCAweDAwLA0KK2V4dGVybiBjb25zdCB1aW50OF90IGdzX0ZYX1dvcmRCcmVha19Db2RlUG9pbnRQcm9wZXJ0aWVzWygweEZGRkYgLSAxKSAvIDIgKyAxXSA9DQorICAgIHsNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDkwLCAweEEwLA0KKyAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MEMsDQorICAgICAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDcwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDA4LCAweDAwLCAweDcwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsDQorICAgICAgICAweDAwLCAweDc3LCAweDc3LCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDc4LCAweDc3LCAweDcwLCAweDcwLCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4MDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwNCisgICAgICAgIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LCAweDA0LCAweDQwLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLA0KKyAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwQiwgMHg5MCwgMHg3NywgMHg0NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDcsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ1LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ3LCAweDc0LCAweDQwLCAweDQ0LCAweDQ0LCAweDc3LA0KKyAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHg3NywgMHg3MCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4NzQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwNywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLA0KKyAgICAgICAgMHhCQiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NzcsIDB4MDAsDQorICAgICAgICAweDkwLCAweDcwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg3NCwgMHg0NCwNCisgICAgICAgIDB4NzQsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg0NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4NzQsIDB4NDQsIDB4NDQsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDA3LCAweDcwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHgwNCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwNywNCisgICAgICAgIDB4NzAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0MCwgMHgwNCwgMHg0MCwgMHgwNCwgMHg0NCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDcsIDB4NzcsIDB4NDQsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsDQorICAgICAgICAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDA3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3MCwgMHgwMCwgMHgwNywgMHg3MCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4MDcsIDB4NzAsDQorICAgICAgICAweDc3LCAweDAwLCAweDQwLCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDA0LCAweDQwLCAweDA0LCAweDQ0LCAweDAwLA0KKyAgICAgICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwNCisgICAgICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4NDQsIDB4NzcsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzAsIDB4NzcsIDB4MDcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NDcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4MDQsDQorICAgICAgICAweDQ0LCAweDA0LCAweDQ0LCAweDAwLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4NDQsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDcsDQorICAgICAgICAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHgwNywgMHg3NywgMHg3NywgMHgwMCwgMHg0NywgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDQsIDB4NDAsIDB4MDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsDQorICAgICAgICAweDAwLCAweDAwLCAweDc3LCAweDA3LCAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLA0KKyAgICAgICAgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NywgMHgwNywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzAsIDB4MDAsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDcsIDB4NzAsIDB4NzAsIDB4NzcsDQorICAgICAgICAweDAwLCAweDA3LCAweDcwLCAweDAwLCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHgwMCwNCisgICAgICAgIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsDQorICAgICAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwNCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LA0KKyAgICAgICAgMHg0MCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0MCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NDQsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LA0KKyAgICAgICAgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NDcsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MDcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4MDAsIDB4MDcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4NDQsIDB4NDAsIDB4NDQsIDB4NDQsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDQ0LCAweDAwLCAweEJCLA0KKyAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4MDAsIDB4NDQsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsDQorICAgICAgICAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwNCisgICAgICAgIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4NDAsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwNCisgICAgICAgIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDA0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLA0KKyAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4NDQsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDAsIDB4NDQsIDB4NDAsIDB4MDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDA0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwNCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwNCisgICAgICAgIDB4QkIsIDB4NDQsIDB4NDQsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDcwLCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzAsIDB4NzcsIDB4NzcsIDB4MDAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KKyAgICAgICAgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NDQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsDQorICAgICAgICAweDcwLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwNCisgICAgICAgIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLA0KKyAgICAgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NCwgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDQsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsDQorICAgICAgICAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQwLCAweDAwLCAweDc3LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDA3LCAweDc3LA0KKyAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NywgMHg3NywgMHg3NCwgMHg3NywgMHg3NywgMHg0MCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3MCwgMHgwMCwgMHg3NywgMHg3MCwgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDc3LCAweDcwLCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg1NSwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTAsIDB4MDgsDQorICAgICAgICAweDMzLCAweDU1LCAweDU1LCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLA0KKyAgICAgICAgMHhDMCwgMHgwMCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4NTAsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4NTUsDQorICAgICAgICAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDcwLCAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDAwLA0KKyAgICAgICAgMHgwNywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHg3MCwgMHg3NywgMHg3NywgMHgwNywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwNywgMHg3NywgMHg3NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDA2LCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDA3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NiwgMHg2MCwgMHgwMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwNCisgICAgICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsDQorICAgICAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwNCisgICAgICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwNCisgICAgICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjAsDQorICAgICAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwNCisgICAgICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsDQorICAgICAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwNywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3MCwgMHgwNywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDQ3LCAweDc3LCAweDQ3LCAweDc3LCAweDc0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsDQorICAgICAgICAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwNCisgICAgICAgIDB4QkIsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDc3LCAweDc0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLA0KKyAgICAgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0NCwgMHg0MCwgMHgwNCwNCisgICAgICAgIDB4NDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4NDQsIDB4MDAsDQorICAgICAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwNywgMHg0NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzAsDQorICAgICAgICAweDc3LCAweDA3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDkwLCAweDA4LCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4Q0MsIDB4OTAsIDB4QTAsIDB4OTgsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA1LA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDBDLCAweDA3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsDQorICAgICAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg0NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsDQorICAgICAgICAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHgwMCwgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4NTUsIDB4MDAsIDB4MDAsDQogfTsNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9hbGcuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2FsZy5oCmluZGV4IDY1NDAzZWMuLjViZTdlMzEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2FsZy5oCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2FsZy5oCkBAIC02LDQxICs2LDQyIEBACiANCiAjaWZuZGVmIF9GWF9BTEdPUklUSE0NCiAjZGVmaW5lIF9GWF9BTEdPUklUSE0NCi0jZGVmaW5lIEZYX0lzT2RkKGEpCSgoYSkgJiAxKQ0KKyNkZWZpbmUgRlhfSXNPZGQoYSkgKChhKSYxKQ0KICNpZmRlZiBfX2NwbHVzcGx1cw0KIGV4dGVybiAiQyIgew0KICNlbmRpZg0KLWludDMyX3QJRlhfQmFzZTY0RW5jb2RlQShjb25zdCB1aW50OF90KiBwU3JjLCBpbnQzMl90IGlTcmNMZW4sIEZYX0NIQVIqIHBEc3QpOw0KLWludDMyX3QJRlhfQmFzZTY0RGVjb2RlQShjb25zdCBGWF9DSEFSKiBwU3JjLCBpbnQzMl90IGlTcmNMZW4sIHVpbnQ4X3QqIHBEc3QpOw0KLWludDMyX3QJRlhfQmFzZTY0RGVjb2RlVyhjb25zdCBGWF9XQ0hBUiogcFNyYywgaW50MzJfdCBpU3JjTGVuLCB1aW50OF90KiBwRHN0KTsNCi11aW50OF90CQlGWF9IZXgyRGVjKHVpbnQ4X3QgaGV4SGlnaCwgdWludDhfdCBoZXhMb3cpOw0KLWludDMyX3QJRlhfU2VwYXJhdGVTdHJpbmdXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlTdHJMZW4sIEZYX1dDSEFSIGRlbGltaXRlciwgQ0ZYX1dpZGVTdHJpbmdBcnJheSAmcGllY2VzKTsNCitpbnQzMl90IEZYX0Jhc2U2NEVuY29kZUEoY29uc3QgdWludDhfdCogcFNyYywgaW50MzJfdCBpU3JjTGVuLCBGWF9DSEFSKiBwRHN0KTsNCitpbnQzMl90IEZYX0Jhc2U2NERlY29kZUEoY29uc3QgRlhfQ0hBUiogcFNyYywgaW50MzJfdCBpU3JjTGVuLCB1aW50OF90KiBwRHN0KTsNCitpbnQzMl90IEZYX0Jhc2U2NERlY29kZVcoY29uc3QgRlhfV0NIQVIqIHBTcmMsIGludDMyX3QgaVNyY0xlbiwgdWludDhfdCogcERzdCk7DQordWludDhfdCBGWF9IZXgyRGVjKHVpbnQ4X3QgaGV4SGlnaCwgdWludDhfdCBoZXhMb3cpOw0KK2ludDMyX3QgRlhfU2VwYXJhdGVTdHJpbmdXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0ckxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBkZWxpbWl0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgcGllY2VzKTsNCiAjaWZkZWYgX19jcGx1c3BsdXMNCiB9Ow0KICNlbmRpZg0KLXRlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPg0KLWNsYXNzIENGWF9EU1BBVGVtcGxhdGUNCi17DQotcHVibGljOg0KLSAgICBpbnQzMl90IExvb2t1cChjb25zdCBiYXNlVHlwZSAmZmluZCwgY29uc3QgYmFzZVR5cGUgKnBBcnJheSwgaW50MzJfdCBpQ291bnQpDQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwQXJyYXkgIT0gTlVMTCk7DQotICAgICAgICBpZiAoaUNvdW50IDwgMSkgew0KLSAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IGlDb3VudCAtIDEsIGlNaWQ7DQotICAgICAgICBkbyB7DQotICAgICAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICAgICAgY29uc3QgYmFzZVR5cGUgJnYgPSBwQXJyYXlbaU1pZF07DQotICAgICAgICAgICAgaWYgKGZpbmQgPT0gdikgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gaU1pZDsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbmQgPCB2KSB7DQotICAgICAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQotICAgICAgICByZXR1cm4gLTE7DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9EU1BBVGVtcGxhdGUgew0KKyBwdWJsaWM6DQorICBpbnQzMl90IExvb2t1cChjb25zdCBiYXNlVHlwZSYgZmluZCwgY29uc3QgYmFzZVR5cGUqIHBBcnJheSwgaW50MzJfdCBpQ291bnQpIHsNCisgICAgRlhTWVNfYXNzZXJ0KHBBcnJheSAhPSBOVUxMKTsNCisgICAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgICByZXR1cm4gLTE7DQogICAgIH0NCisgICAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gaUNvdW50IC0gMSwgaU1pZDsNCisgICAgZG8gew0KKyAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgIGNvbnN0IGJhc2VUeXBlJiB2ID0gcEFycmF5W2lNaWRdOw0KKyAgICAgIGlmIChmaW5kID09IHYpIHsNCisgICAgICAgIHJldHVybiBpTWlkOw0KKyAgICAgIH0gZWxzZSBpZiAoZmluZCA8IHYpIHsNCisgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgfQ0KKyAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgIHJldHVybiAtMTsNCisgIH0NCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2NwZy5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfY3BnLmgKaW5kZXggNDI5NTNiMC4uMzE1NWU0NiAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfY3BnLmgKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfY3BnLmgKQEAgLTcsMjI5ICs3LDI0MiBAQAogI2lmbmRlZiBfRlhfQ09ERVBBR0UNCiAjZGVmaW5lIF9GWF9DT0RFUEFHRQ0KIGNsYXNzIElGWF9Db2RlUGFnZTsNCi0jZGVmaW5lIEZYX0NPREVQQUdFX0RlZkFOU0kJCQkJCQkwDQotI2RlZmluZSBGWF9DT0RFUEFHRV9EZWZPRU0JCQkJCQkxDQotI2RlZmluZSBGWF9DT0RFUEFHRV9EZWZNQUMJCQkJCQkyDQotI2RlZmluZSBGWF9DT0RFUEFHRV9UaHJlYWQJCQkJCQkzDQotI2RlZmluZSBGWF9DT0RFUEFHRV9TeW1ib2wJCQkJCQk0Mg0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfVVMJCQkJCTQzNw0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX0FTTU83MDgJCQkJNzA4DQotI2RlZmluZSBGWF9DT0RFUEFHRV9BcmFiaWNfQVNNTzQ0OVBsdXMJCQk3MDkNCi0jZGVmaW5lIEZYX0NPREVQQUdFX0FyYWJpY19UcmFuc3BhcmVudAkJCTcxMA0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX05hZml0aGFFbmhhbmNlZAkJNzExDQotI2RlZmluZSBGWF9DT0RFUEFHRV9BcmFiaWNfVHJhbnNwYXJlbnRBU01PCQk3MjANCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0dyZWVrMQkJCQk3MzcNCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0JhbHRpYwkJCQk3NzUNCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TV2luMzFfV2VzdGVybkV1cm9wZWFuCQk4MTkNCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX1dlc3Rlcm5FdXJvcGVhbgkJODUwDQotI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19FYXN0ZXJuRXVyb3BlYW4JCTg1Mg0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfTGF0aW4zCQkJCTg1Mw0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfQ3lyaWxsaWMJCQkJODU1DQotI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19UdXJraXNoCQkJCTg1Nw0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfTGF0aW4xRXVybwkJCTg1OA0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfUG9ydHVndWVzZQkJCTg2MA0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfSWNlbGFuZGljCQkJCTg2MQ0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfSGVicmV3CQkJCTg2Mg0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfRnJlbmNoQ2FuYWRpYW4JCTg2Mw0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfQXJhYmljCQkJCTg2NA0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfTm9yd2VnaWFuCQkJCTg2NQ0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfUnVzc2lhbgkJCQk4NjYNCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0dyZWVrMgkJCQk4NjkNCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX1RoYWkJCQkJCTg3NA0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfS2FtZW5pY2t5Q1MJCQk4OTUNCi0jZGVmaW5lIEZYX0NPREVQQUdFX1NoaWZ0SklTCQkJCQk5MzINCi0jZGVmaW5lIEZYX0NPREVQQUdFX0NoaW5lc2VTaW1wbGlmaWVkCQkJOTM2DQotI2RlZmluZSBGWF9DT0RFUEFHRV9Lb3JlYW4JCQkJCQk5NDkNCi0jZGVmaW5lIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbAkJCTk1MA0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfVVRGMTZMRQkJCQkJCTEyMDANCi0jZGVmaW5lIEZYX0NPREVQQUdFX1VURjE2QkUJCQkJCQkxMjAxDQotI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW4JCTEyNTANCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljCQkJCTEyNTENCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbgkJMTI1Mg0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fR3JlZWsJCQkJCTEyNTMNCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX1R1cmtpc2gJCQkJMTI1NA0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fSGVicmV3CQkJCTEyNTUNCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0FyYWJpYwkJCQkxMjU2DQotI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWMJCQkJMTI1Nw0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fVmlldG5hbWVzZQkJCTEyNTgNCi0jZGVmaW5lIEZYX0NPREVQQUdFX0pvaGFiCQkJCQkJMTM2MQ0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX1JvbWFuCQkJCQkxMDAwMA0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX1NoaWZ0SklTCQkJCTEwMDAxDQotI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfQ2hpbmVzZVRyYWRpdGlvbmFsCQkxMDAwMg0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0tvcmVhbgkJCQkJMTAwMDMNCi0jZGVmaW5lIEZYX0NPREVQQUdFX01BQ19BcmFiaWMJCQkJCTEwMDA0DQotI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfSGVicmV3CQkJCQkxMDAwNQ0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0dyZWVrCQkJCQkxMDAwNg0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0N5cmlsbGljCQkJCTEwMDA3DQotI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfQ2hpbmVzZVNpbXBsaWZpZWQJCTEwMDA4DQotI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfVGhhaQkJCQkJMTAwMjENCi0jZGVmaW5lIEZYX0NPREVQQUdFX01BQ19FYXN0ZXJuRXVyb3BlYW4JCQkxMDAyOQ0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX1R1cmtpc2gJCQkJCTEwMDgxDQotI2RlZmluZSBGWF9DT0RFUEFHRV9VVEYzMkxFCQkJCQkJMTIwMDANCi0jZGVmaW5lIEZYX0NPREVQQUdFX1VURjMyQkUJCQkJCQkxMjAwMQ0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8xCQkJCQkyODU5MQ0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8yCQkJCQkyODU5Mg0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8zCQkJCQkyODU5Mw0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV80CQkJCQkyODU5NA0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV81CQkJCQkyODU5NQ0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV82CQkJCQkyODU5Ng0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV83CQkJCQkyODU5Nw0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV84CQkJCQkyODU5OA0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV85CQkJCQkyODU5OQ0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8xMAkJCQkJMjg2MDANCi0jZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfMTEJCQkJCTI4NjAxDQotI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzEyCQkJCQkyODYwMg0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8xMwkJCQkJMjg2MDMNCi0jZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfMTQJCQkJCTI4NjA0DQotI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzE1CQkJCQkyODYwNQ0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8xNgkJCQkJMjg2MDYNCi0jZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX0RldmFuYWdhcmkJCQk1NzAwMg0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfQmVuZ2FsaQkJCQk1NzAwMw0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfVGFtaWwJCQkJCTU3MDA0DQotI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9UZWx1Z3UJCQkJNTcwMDUNCi0jZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX0Fzc2FtZXNlCQkJCTU3MDA2DQotI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9Pcml5YQkJCQkJNTcwMDcNCi0jZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX0thbm5hZGEJCQkJNTcwMDgNCi0jZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX01hbGF5YWxhbQkJCQk1NzAwOQ0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfR3VqYXJhdGkJCQkJNTcwMTANCi0jZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX1B1bmphYmkJCQkJNTcwMTENCi0jZGVmaW5lIEZYX0NPREVQQUdFX1VURjcJCQkJCQk2NTAwMA0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfVVRGOAkJCQkJCTY1MDAxDQotI2RlZmluZSBGWF9DSEFSU0VUX0FOU0kJCQkJCQkJMA0KLSNkZWZpbmUgRlhfQ0hBUlNFVF9EZWZhdWx0CQkJCQkJMQ0KLSNkZWZpbmUgRlhfQ0hBUlNFVF9TeW1ib2wJCQkJCQkyDQotI2RlZmluZSBGWF9DSEFSU0VUX01BQ19Sb21hbgkJCQkJNzcNCi0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1NoaWZ0SklTCQkJCQk3OA0KLSNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfS29yZWFuCQkJCQk3OQ0KLSNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfQ2hpbmVzZVNpbXBsaWZpZWQJCTgwDQotI2RlZmluZSBGWF9DSEFSU0VUX01BQ19DaGluZXNlVHJpZGl0aW9uYWwJCTgxDQotI2RlZmluZSBGWF9DSEFSU0VUX01BQ19Kb2hhYgkJCQkJODINCi0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0hlYnJldwkJCQkJODMNCi0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0FyYWJpYwkJCQkJODQNCi0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0dyZWVrCQkJCQk4NQ0KLSNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfVHVya2lzaAkJCQkJODYNCi0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1RoYWkJCQkJCQk4Nw0KLSNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfRWFzdGVybkV1cm9wZWFuCQkJODgNCi0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0N5cmlsbGljCQkJCQk4OQ0KLSNkZWZpbmUgRlhfQ0hBUlNFVF9TaGlmdEpJUwkJCQkJCTEyOA0KLSNkZWZpbmUgRlhfQ0hBUlNFVF9Lb3JlYW4JCQkJCQkxMjkNCi0jZGVmaW5lIEZYX0NIQVJTRVRfSm9oYWIJCQkJCQkxMzANCi0jZGVmaW5lIEZYX0NIQVJTRVRfQ2hpbmVzZVNpbXBsaWZpZWQJCQkxMzQNCi0jZGVmaW5lIEZYX0NIQVJTRVRfQ2hpbmVzZVRyaWRpdGlvbmFsCQkJMTM2DQotI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0dyZWVrCQkJCQkxNjENCi0jZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fVHVya2lzaAkJCQkxNjINCi0jZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fVmlldG5hbWVzZQkJCQkxNjMNCi0jZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fSGVicmV3CQkJCQkxNzcNCi0jZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fQXJhYmljCQkJCQkxNzgNCi0jZGVmaW5lIEZYX0NIQVJTRVRfQXJhYmljVHJhZGl0aW9uYWwJCQkxNzkNCi0jZGVmaW5lIEZYX0NIQVJTRVRfQXJhYmljVXNlcgkJCQkJMTgwDQotI2RlZmluZSBGWF9DSEFSU0VUX0hlYnJld1VzZXIJCQkJCTE4MQ0KLSNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9CYWx0aWMJCQkJCTE4Ng0KLSNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9DeXJpbGxpYwkJCQkyMDQNCi0jZGVmaW5lIEZYX0NIQVJTRVRfVGhhaQkJCQkJCQkyMjINCi0jZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fRWFzdGVyRXVyb3BlYW4JCQkyMzgNCi0jZGVmaW5lIEZYX0NIQVJTRVRfVVMJCQkJCQkJMjU0DQotI2RlZmluZSBGWF9DSEFSU0VUX09FTQkJCQkJCQkyNTUNCi1GWF9XT1JECUZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQodWludDhfdCBjaGFyc2V0KTsNCisjZGVmaW5lIEZYX0NPREVQQUdFX0RlZkFOU0kgMA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfRGVmT0VNIDENCisjZGVmaW5lIEZYX0NPREVQQUdFX0RlZk1BQyAyDQorI2RlZmluZSBGWF9DT0RFUEFHRV9UaHJlYWQgMw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfU3ltYm9sIDQyDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19VUyA0MzcNCisjZGVmaW5lIEZYX0NPREVQQUdFX0FyYWJpY19BU01PNzA4IDcwOA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX0FTTU80NDlQbHVzIDcwOQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX1RyYW5zcGFyZW50IDcxMA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX05hZml0aGFFbmhhbmNlZCA3MTENCisjZGVmaW5lIEZYX0NPREVQQUdFX0FyYWJpY19UcmFuc3BhcmVudEFTTU8gNzIwDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19HcmVlazEgNzM3DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19CYWx0aWMgNzc1DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbjMxX1dlc3Rlcm5FdXJvcGVhbiA4MTkNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX1dlc3Rlcm5FdXJvcGVhbiA4NTANCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0Vhc3Rlcm5FdXJvcGVhbiA4NTINCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0xhdGluMyA4NTMNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0N5cmlsbGljIDg1NQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfVHVya2lzaCA4NTcNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0xhdGluMUV1cm8gODU4DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19Qb3J0dWd1ZXNlIDg2MA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfSWNlbGFuZGljIDg2MQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfSGVicmV3IDg2Mg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfRnJlbmNoQ2FuYWRpYW4gODYzDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19BcmFiaWMgODY0DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19Ob3J3ZWdpYW4gODY1DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19SdXNzaWFuIDg2Ng0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfR3JlZWsyIDg2OQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfVGhhaSA4NzQNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0thbWVuaWNreUNTIDg5NQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfU2hpZnRKSVMgOTMyDQorI2RlZmluZSBGWF9DT0RFUEFHRV9DaGluZXNlU2ltcGxpZmllZCA5MzYNCisjZGVmaW5lIEZYX0NPREVQQUdFX0tvcmVhbiA5NDkNCisjZGVmaW5lIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbCA5NTANCisjZGVmaW5lIEZYX0NPREVQQUdFX1VURjE2TEUgMTIwMA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfVVRGMTZCRSAxMjAxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW4gMTI1MA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWMgMTI1MQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFuIDEyNTINCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0dyZWVrIDEyNTMNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX1R1cmtpc2ggMTI1NA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fSGVicmV3IDEyNTUNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0FyYWJpYyAxMjU2DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWMgMTI1Nw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fVmlldG5hbWVzZSAxMjU4DQorI2RlZmluZSBGWF9DT0RFUEFHRV9Kb2hhYiAxMzYxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfUm9tYW4gMTAwMDANCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19TaGlmdEpJUyAxMDAwMQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0NoaW5lc2VUcmFkaXRpb25hbCAxMDAwMg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0tvcmVhbiAxMDAwMw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0FyYWJpYyAxMDAwNA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0hlYnJldyAxMDAwNQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0dyZWVrIDEwMDA2DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfQ3lyaWxsaWMgMTAwMDcNCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19DaGluZXNlU2ltcGxpZmllZCAxMDAwOA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX1RoYWkgMTAwMjENCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19FYXN0ZXJuRXVyb3BlYW4gMTAwMjkNCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19UdXJraXNoIDEwMDgxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9VVEYzMkxFIDEyMDAwDQorI2RlZmluZSBGWF9DT0RFUEFHRV9VVEYzMkJFIDEyMDAxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzEgMjg1OTENCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfMiAyODU5Mg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8zIDI4NTkzDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzQgMjg1OTQNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfNSAyODU5NQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV82IDI4NTk2DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzcgMjg1OTcNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfOCAyODU5OA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV85IDI4NTk5DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzEwIDI4NjAwDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzExIDI4NjAxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzEyIDI4NjAyDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzEzIDI4NjAzDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzE0IDI4NjA0DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzE1IDI4NjA1DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzE2IDI4NjA2DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9EZXZhbmFnYXJpIDU3MDAyDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9CZW5nYWxpIDU3MDAzDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9UYW1pbCA1NzAwNA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfVGVsdWd1IDU3MDA1DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9Bc3NhbWVzZSA1NzAwNg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfT3JpeWEgNTcwMDcNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX0thbm5hZGEgNTcwMDgNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX01hbGF5YWxhbSA1NzAwOQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfR3VqYXJhdGkgNTcwMTANCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX1B1bmphYmkgNTcwMTENCisjZGVmaW5lIEZYX0NPREVQQUdFX1VURjcgNjUwMDANCisjZGVmaW5lIEZYX0NPREVQQUdFX1VURjggNjUwMDENCisjZGVmaW5lIEZYX0NIQVJTRVRfQU5TSSAwDQorI2RlZmluZSBGWF9DSEFSU0VUX0RlZmF1bHQgMQ0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9TeW1ib2wgMg0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfUm9tYW4gNzcNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1NoaWZ0SklTIDc4DQorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19Lb3JlYW4gNzkNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0NoaW5lc2VTaW1wbGlmaWVkIDgwDQorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19DaGluZXNlVHJpZGl0aW9uYWwgODENCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0pvaGFiIDgyDQorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19IZWJyZXcgODMNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0FyYWJpYyA4NA0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfR3JlZWsgODUNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1R1cmtpc2ggODYNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1RoYWkgODcNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0Vhc3Rlcm5FdXJvcGVhbiA4OA0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfQ3lyaWxsaWMgODkNCisjZGVmaW5lIEZYX0NIQVJTRVRfU2hpZnRKSVMgMTI4DQorI2RlZmluZSBGWF9DSEFSU0VUX0tvcmVhbiAxMjkNCisjZGVmaW5lIEZYX0NIQVJTRVRfSm9oYWIgMTMwDQorI2RlZmluZSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkIDEzNA0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9DaGluZXNlVHJpZGl0aW9uYWwgMTM2DQorI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0dyZWVrIDE2MQ0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9UdXJraXNoIDE2Mg0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9WaWV0bmFtZXNlIDE2Mw0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9IZWJyZXcgMTc3DQorI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0FyYWJpYyAxNzgNCisjZGVmaW5lIEZYX0NIQVJTRVRfQXJhYmljVHJhZGl0aW9uYWwgMTc5DQorI2RlZmluZSBGWF9DSEFSU0VUX0FyYWJpY1VzZXIgMTgwDQorI2RlZmluZSBGWF9DSEFSU0VUX0hlYnJld1VzZXIgMTgxDQorI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0JhbHRpYyAxODYNCisjZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fQ3lyaWxsaWMgMjA0DQorI2RlZmluZSBGWF9DSEFSU0VUX1RoYWkgMjIyDQorI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0Vhc3RlckV1cm9wZWFuIDIzOA0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9VUyAyNTQNCisjZGVmaW5lIEZYX0NIQVJTRVRfT0VNIDI1NQ0KK0ZYX1dPUkQgRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldCh1aW50OF90IGNoYXJzZXQpOw0KIEZYX1dPUkQgRlhfR2V0Q2hhcnNldEZyb21Db2RlUGFnZShGWF9XT1JEIGNvZGVwYWdlKTsNCi1GWF9XT1JECUZYX0dldENvZGVQYWdlRnJvbVN0cmluZ0EoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKTsNCitGWF9XT1JEIEZYX0dldENvZGVQYWdlRnJvbVN0cmluZ0EoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKTsNCiBGWF9XT1JEIEZYX0dldENvZGVQYWdlRm9ybVN0cmluZ1coY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCk7DQotRlhfV09SRAlGWF9HZXREZWZDb2RlUGFnZUJ5TGFuZ3VhZ2UoRlhfV09SRCB3TGFuZ3VhZ2UpOw0KLXZvaWQJRlhfU3dhcEJ5dGVPcmRlcihGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKTsNCi12b2lkCUZYX1N3YXBCeXRlT3JkZXJDb3B5KGNvbnN0IEZYX1dDSEFSKiBwU3JjLCBGWF9XQ0hBUiogcERzdCwgaW50MzJfdCBpTGVuZ3RoKTsNCi12b2lkCUZYX1VURjE2VG9XQ2hhcih2b2lkKiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgpOw0KLXZvaWQJRlhfVVRGMTZUb1dDaGFyQ29weShjb25zdCBGWF9XT1JEICpwVVRGMTYsIEZYX1dDSEFSKiBwV0NoYXIsIGludDMyX3QgaUxlbmd0aCk7DQotdm9pZAlGWF9XQ2hhclRvVVRGMTYodm9pZCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoKTsNCi12b2lkCUZYX1dDaGFyVG9VVEYxNkNvcHkoY29uc3QgRlhfV0NIQVIqIHBXQ2hhciwgRlhfV09SRCAqcFVURjE2LCBpbnQzMl90IGlMZW5ndGgpOw0KLWludDMyX3QJRlhfRGVjb2RlU3RyaW5nKEZYX1dPUkQgd0NvZGVQYWdlLCBjb25zdCBGWF9DSEFSKiBwU3JjLCBpbnQzMl90ICpwU3JjTGVuLCBGWF9XQ0hBUiogcERzdCwgaW50MzJfdCAqcERzdExlbiwgRlhfQk9PTCBiRXJyQnJlYWsgPSBGQUxTRSk7DQotaW50MzJfdAlGWF9VVEY4RGVjb2RlKGNvbnN0IEZYX0NIQVIqIHBTcmMsIGludDMyX3QgKnBTcmNMZW4sIEZYX1dDSEFSKiBwRHN0LCBpbnQzMl90ICpwRHN0TGVuKTsNCitGWF9XT1JEIEZYX0dldERlZkNvZGVQYWdlQnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSk7DQordm9pZCBGWF9Td2FwQnl0ZU9yZGVyKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpOw0KK3ZvaWQgRlhfU3dhcEJ5dGVPcmRlckNvcHkoY29uc3QgRlhfV0NIQVIqIHBTcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiogcERzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCk7DQordm9pZCBGWF9VVEYxNlRvV0NoYXIodm9pZCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoKTsNCit2b2lkIEZYX1VURjE2VG9XQ2hhckNvcHkoY29uc3QgRlhfV09SRCogcFVURjE2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiogcFdDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpOw0KK3ZvaWQgRlhfV0NoYXJUb1VURjE2KHZvaWQqIHBCdWZmZXIsIGludDMyX3QgaUxlbmd0aCk7DQordm9pZCBGWF9XQ2hhclRvVVRGMTZDb3B5KGNvbnN0IEZYX1dDSEFSKiBwV0NoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQqIHBVVEYxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKTsNCitpbnQzMl90IEZYX0RlY29kZVN0cmluZyhGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBwU3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBTcmNMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIHBEc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcERzdExlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFcnJCcmVhayA9IEZBTFNFKTsNCitpbnQzMl90IEZYX1VURjhEZWNvZGUoY29uc3QgRlhfQ0hBUiogcFNyYywNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFNyY0xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIHBEc3QsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBEc3RMZW4pOw0KIGVudW0gRlhfQ09ERVNZU1RFTSB7DQotICAgIEZYX01CQ1MJCT0gIDAsDQotICAgIEZYX1NCQ1MJCQksDQotICAgIEZYX0RCQ1MJCQksDQorICBGWF9NQkNTID0gMCwNCisgIEZYX1NCQ1MsDQorICBGWF9EQkNTLA0KIH07DQogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0NPREVQQUdFX0hFQURFUiB7DQotICAgIHVpbnQxNl90CQl1Q1BJRDsNCi0gICAgdWludDhfdAkJdU1pbkNoYXJCeXRlczsNCi0gICAgdWludDhfdAkJdU1heENoYXJCeXRlczsNCi0gICAgRlhfQ09ERVNZU1RFTQllQ1BUeXBlOw0KLSAgICBGWF9CT09MCQkJYkhhc0xlYWRCeXRlOw0KLSAgICBGWF9XQ0hBUgkJd01pbkNoYXI7DQotICAgIEZYX1dDSEFSCQl3TWF4Q2hhcjsNCi0gICAgRlhfV0NIQVIJCXdEZWZDaGFyOw0KLSAgICBGWF9XQ0hBUgkJd01pblVuaWNvZGU7DQotICAgIEZYX1dDSEFSCQl3TWF4VW5pY29kZTsNCi0gICAgRlhfV0NIQVIJCXdEZWZVbmljb2RlOw0KKyAgdWludDE2X3QgdUNQSUQ7DQorICB1aW50OF90IHVNaW5DaGFyQnl0ZXM7DQorICB1aW50OF90IHVNYXhDaGFyQnl0ZXM7DQorICBGWF9DT0RFU1lTVEVNIGVDUFR5cGU7DQorICBGWF9CT09MIGJIYXNMZWFkQnl0ZTsNCisgIEZYX1dDSEFSIHdNaW5DaGFyOw0KKyAgRlhfV0NIQVIgd01heENoYXI7DQorICBGWF9XQ0hBUiB3RGVmQ2hhcjsNCisgIEZYX1dDSEFSIHdNaW5Vbmljb2RlOw0KKyAgRlhfV0NIQVIgd01heFVuaWNvZGU7DQorICBGWF9XQ0hBUiB3RGVmVW5pY29kZTsNCiB9IEZYX0NPREVQQUdFX0hFQURFUjsNCi0jZGVmaW5lIEZYX0NQTUFQVFlQRV9Db25zZWN1dGlvbgkxDQotI2RlZmluZSBGWF9DUE1BUFRZUEVfU3RyaWN0CQkJMg0KLSNkZWZpbmUgRlhfQ1BNQVBUWVBFX05vTWFwcGluZwkJMw0KLSNkZWZpbmUgRlhfQ1BNQVBUWVBFX0RlbHRhCQkJNA0KKyNkZWZpbmUgRlhfQ1BNQVBUWVBFX0NvbnNlY3V0aW9uIDENCisjZGVmaW5lIEZYX0NQTUFQVFlQRV9TdHJpY3QgMg0KKyNkZWZpbmUgRlhfQ1BNQVBUWVBFX05vTWFwcGluZyAzDQorI2RlZmluZSBGWF9DUE1BUFRZUEVfRGVsdGEgNA0KIHR5cGVkZWYgc3RydWN0IF9GWF9DUENVX01BUFRBQkxFMSB7DQotICAgIHVpbnQxNl90ICB1TWFwVHlwZTsNCi0gICAgdWludDE2X3QgIHVVbmlvY2RlOw0KKyAgdWludDE2X3QgdU1hcFR5cGU7DQorICB1aW50MTZfdCB1VW5pb2NkZTsNCiB9IEZYX0NQQ1VfTUFQVEFCTEUxOw0KIHR5cGVkZWYgc3RydWN0IF9GWF9DUENVX01BUFRBQkxFMiB7DQotICAgIHVpbnQ4X3QJdVRyYWlsQnl0ZTsNCi0gICAgdWludDhfdAl1TWFwVHlwZTsNCi0gICAgdWludDE2X3QJdU9mZnNldDsNCisgIHVpbnQ4X3QgdVRyYWlsQnl0ZTsNCisgIHVpbnQ4X3QgdU1hcFR5cGU7DQorICB1aW50MTZfdCB1T2Zmc2V0Ow0KIH0gRlhfQ1BDVV9NQVBUQUJMRTI7DQogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0NQQ1VfTUFQSU5GTyB7DQotICAgIEZYX0NQQ1VfTUFQVEFCTEUxCQkqcE1hcFRhYmxlMTsNCi0gICAgRlhfQ1BDVV9NQVBUQUJMRTIJCSpwTWFwVGFibGUyOw0KLSAgICBjb25zdCB1aW50OF90KgkJCQlwTWFwRGF0YTsNCisgIEZYX0NQQ1VfTUFQVEFCTEUxKiBwTWFwVGFibGUxOw0KKyAgRlhfQ1BDVV9NQVBUQUJMRTIqIHBNYXBUYWJsZTI7DQorICBjb25zdCB1aW50OF90KiBwTWFwRGF0YTsNCiB9IEZYX0NQQ1VfTUFQSU5GTzsNCiB0eXBlZGVmIHN0cnVjdCBfRlhfQ1BVQ19NQVBUQUJMRSB7DQotICAgIHVpbnQxNl90CXVTdGFydFVuaWNvZGU7DQotICAgIHVpbnQxNl90CXVFbmRVbmljb2RlOw0KLSAgICB1aW50MTZfdAl1TWFwVHlwZTsNCi0gICAgdWludDE2X3QJdU9mZnNldDsNCisgIHVpbnQxNl90IHVTdGFydFVuaWNvZGU7DQorICB1aW50MTZfdCB1RW5kVW5pY29kZTsNCisgIHVpbnQxNl90IHVNYXBUeXBlOw0KKyAgdWludDE2X3QgdU9mZnNldDsNCiB9IEZYX0NQVUNfTUFQVEFCTEU7DQogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0NQVUNfTUFQSU5GTyB7DQotICAgIHVpbnQzMl90CQkJdU1hcENvdW50Ow0KLSAgICBGWF9DUFVDX01BUFRBQkxFCSpwTWFwVGFibGU7DQotICAgIGNvbnN0IHVpbnQ4X3QqCQkJcE1hcERhdGE7DQorICB1aW50MzJfdCB1TWFwQ291bnQ7DQorICBGWF9DUFVDX01BUFRBQkxFKiBwTWFwVGFibGU7DQorICBjb25zdCB1aW50OF90KiBwTWFwRGF0YTsNCiB9IEZYX0NQVUNfTUFQSU5GTzsNCiB0eXBlZGVmIHN0cnVjdCBfRlhfQ09ERVBBR0Ugew0KLSAgICBGWF9DT0RFUEFHRV9IRUFERVIgY29uc3QJKnBDUEhlYWRlcjsNCi0gICAgRlhfQ1BDVV9NQVBJTkZPIGNvbnN0CQkqcENQQ1VNYXBJbmZvOw0KLSAgICBGWF9DUFVDX01BUElORk8gY29uc3QJCSpwQ1BVQ01hcEluZm87DQotfSBGWF9DT0RFUEFHRSwgKiBGWF9MUENPREVQQUdFOw0KLXR5cGVkZWYgRlhfQ09ERVBBR0UgY29uc3QgKiBGWF9MUENDT0RFUEFHRTsNCisgIEZYX0NPREVQQUdFX0hFQURFUiBjb25zdCogcENQSGVhZGVyOw0KKyAgRlhfQ1BDVV9NQVBJTkZPIGNvbnN0KiBwQ1BDVU1hcEluZm87DQorICBGWF9DUFVDX01BUElORk8gY29uc3QqIHBDUFVDTWFwSW5mbzsNCit9IEZYX0NPREVQQUdFLCAqRlhfTFBDT0RFUEFHRTsNCit0eXBlZGVmIEZYX0NPREVQQUdFIGNvbnN0KiBGWF9MUENDT0RFUEFHRTsNCiB0eXBlZGVmIHN0cnVjdCBfRlhfU1RSMkNQSEFTSCB7DQotICAgIHVpbnQzMl90ICB1SGFzaDsNCi0gICAgdWludDMyX3QgIHVDb2RlUGFnZTsNCisgIHVpbnQzMl90IHVIYXNoOw0KKyAgdWludDMyX3QgdUNvZGVQYWdlOw0KIH0gRlhfU1RSMkNQSEFTSDsNCiB0eXBlZGVmIHN0cnVjdCBfRlhfQ0hBUlNFVF9NQVAgew0KLSAgICB1aW50MTZfdCBjaGFyc2V0Ow0KLSAgICB1aW50MTZfdCBjb2RlcGFnZTsNCisgIHVpbnQxNl90IGNoYXJzZXQ7DQorICB1aW50MTZfdCBjb2RlcGFnZTsNCiB9IEZYX0NIQVJTRVRfTUFQOw0KIHR5cGVkZWYgc3RydWN0IF9GWF9MQU5HMkNQTUFQIHsNCi0gICAgRlhfV09SRAl3TGFuZ3VhZ2U7DQotICAgIEZYX1dPUkQJd0NvZGVwYWdlOw0KKyAgRlhfV09SRCB3TGFuZ3VhZ2U7DQorICBGWF9XT1JEIHdDb2RlcGFnZTsNCiB9IEZYX0xBTkcyQ1BNQVA7DQogDQotY2xhc3MgSUZYX0NvZGVQYWdlDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGWF9Db2RlUGFnZSoJQ3JlYXRlKEZYX1dPUkQgd0NvZGVQYWdlKTsNCi0gICAgdmlydHVhbCB+SUZYX0NvZGVQYWdlKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9XT1JECQkJR2V0Q29kZVBhZ2VOdW1iZXIoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfQ09ERVNZU1RFTQlHZXRDb2RlU3lzdGVtVHlwZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSGFzTGVhZEJ5dGUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzTGVhZEJ5dGUodWludDhfdCBieXRlKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0TWluQnl0ZXNQZXJDaGFyKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldE1heEJ5dGVzUGVyQ2hhcigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9XQ0hBUgkJR2V0TWluQ2hhcmNvZGUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfV0NIQVIJCUdldE1heENoYXJjb2RlKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX1dDSEFSCQlHZXREZWZDaGFyY29kZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9XQ0hBUgkJR2V0TWluVW5pY29kZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9XQ0hBUgkJR2V0TWF4VW5pY29kZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9XQ0hBUgkJR2V0RGVmVW5pY29kZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNWYWxpZENoYXJjb2RlKEZYX1dPUkQgd0NoYXJjb2RlKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfV0NIQVIJCUdldFVuaWNvZGUoRlhfV09SRCB3Q2hhcmNvZGUpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNWYWxpZFVuaWNvZGUoRlhfV0NIQVIgd1VuaWNvZGUpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWF9XT1JECQkJR2V0Q2hhcmNvZGUoRlhfV0NIQVIgd1VuaWNvZGUpIGNvbnN0ID0gMDsNCitjbGFzcyBJRlhfQ29kZVBhZ2Ugew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZYX0NvZGVQYWdlKiBDcmVhdGUoRlhfV09SRCB3Q29kZVBhZ2UpOw0KKyAgdmlydHVhbCB+SUZYX0NvZGVQYWdlKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9XT1JEIEdldENvZGVQYWdlTnVtYmVyKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9DT0RFU1lTVEVNIEdldENvZGVTeXN0ZW1UeXBlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEhhc0xlYWRCeXRlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzTGVhZEJ5dGUodWludDhfdCBieXRlKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TWluQnl0ZXNQZXJDaGFyKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldE1heEJ5dGVzUGVyQ2hhcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0TWluQ2hhcmNvZGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldE1heENoYXJjb2RlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9XQ0hBUiBHZXREZWZDaGFyY29kZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0TWluVW5pY29kZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0TWF4VW5pY29kZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0RGVmVW5pY29kZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc1ZhbGlkQ2hhcmNvZGUoRlhfV09SRCB3Q2hhcmNvZGUpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0VW5pY29kZShGWF9XT1JEIHdDaGFyY29kZSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1dPUkQgR2V0Q2hhcmNvZGUoRlhfV0NIQVIgd1VuaWNvZGUpIGNvbnN0ID0gMDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2RhdGV0aW1lLmggYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9kYXRldGltZS5oCmluZGV4IGI4NjdiMzYuLmQ3MjNiNDMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2RhdGV0aW1lLmgKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfZGF0ZXRpbWUuaApAQCAtOCw0NjQgKzgsMzg1IEBACiAjZGVmaW5lIF9GWF9EQVRFVElNRV9IXw0KIGNsYXNzIENGWF9Vbml0aW1lOw0KIGNsYXNzIENGWF9EYXRlVGltZTsNCi10eXBlZGVmIGludDY0X3QJRlhfVU5JVElNRTsNCit0eXBlZGVmIGludDY0X3QgRlhfVU5JVElNRTsNCiBlbnVtIEZYX1dFRUtEQVkgew0KLSAgICBGWF9TdW5kYXkJCQk9ICAwLA0KLSAgICBGWF9Nb25kYXkJCQkJLA0KLSAgICBGWF9UdWVzZGF5CQkJCSwNCi0gICAgRlhfV2VkbmVzZGF5CQkJLA0KLSAgICBGWF9UaHVyc2RheQkJCQksDQotICAgIEZYX0ZyaWRheQkJCQksDQotICAgIEZYX1NhdHVyZGF5CQkJCSwNCisgIEZYX1N1bmRheSA9IDAsDQorICBGWF9Nb25kYXksDQorICBGWF9UdWVzZGF5LA0KKyAgRlhfV2VkbmVzZGF5LA0KKyAgRlhfVGh1cnNkYXksDQorICBGWF9GcmlkYXksDQorICBGWF9TYXR1cmRheSwNCiB9Ow0KLUZYX0JPT0wJCUZYX0lzTGVhcFllYXIoaW50MzJfdCBpWWVhcik7DQotaW50MzJfdAlGWF9EYXlzSW5ZZWFyKGludDMyX3QgaVllYXIpOw0KLXVpbnQ4X3QJCUZYX0RheXNJbk1vbnRoKGludDMyX3QgaVllYXIsIHVpbnQ4X3QgaU1vbnRoKTsNCi1jbGFzcyBDRlhfVW5pdGltZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9Vbml0aW1lKCkNCi0gICAgew0KLSAgICAgICAgbV9pVW5pdGltZSA9IDA7DQotICAgIH0NCi0gICAgQ0ZYX1VuaXRpbWUoRlhfVU5JVElNRSBpVW5pdGltZSkNCi0gICAgew0KLSAgICAgICAgbV9pVW5pdGltZSA9IGlVbml0aW1lOw0KLSAgICB9DQotICAgIENGWF9Vbml0aW1lKGNvbnN0IENGWF9Vbml0aW1lICZ1bml0aW1lKQ0KLSAgICB7DQotICAgICAgICBtX2lVbml0aW1lID0gdW5pdGltZS5tX2lVbml0aW1lOw0KLSAgICB9DQotICAgIG9wZXJhdG9yIEZYX1VOSVRJTUUgKiAoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gJm1faVVuaXRpbWU7DQotICAgIH0NCi0gICAgb3BlcmF0b3IgRlhfVU5JVElNRSBjb25zdCAqICgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAmbV9pVW5pdGltZTsNCi0gICAgfQ0KLSAgICBvcGVyYXRvciBGWF9VTklUSU1FJiAoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9pVW5pdGltZTsNCi0gICAgfQ0KLSAgICBvcGVyYXRvciBjb25zdCBGWF9VTklUSU1FJiAoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9pVW5pdGltZTsNCi0gICAgfQ0KLSAgICBDRlhfVW5pdGltZSYJb3BlcmF0b3IgPSAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQpDQotICAgIHsNCi0gICAgICAgIG1faVVuaXRpbWUgPSB0Lm1faVVuaXRpbWU7DQotICAgICAgICByZXR1cm4gKnRoaXM7DQotICAgIH0NCi0gICAgQ0ZYX1VuaXRpbWUmCW9wZXJhdG9yID0gKEZYX1VOSVRJTUUgdCkNCi0gICAgew0KLSAgICAgICAgbV9pVW5pdGltZSA9IHQ7DQotICAgICAgICByZXR1cm4gKnRoaXM7DQotICAgIH0NCi0gICAgQ0ZYX1VuaXRpbWUmCW9wZXJhdG9yICs9IChjb25zdCBDRlhfVW5pdGltZSAmdCkNCi0gICAgew0KLSAgICAgICAgbV9pVW5pdGltZSArPSB0Lm1faVVuaXRpbWU7DQotICAgICAgICByZXR1cm4gKnRoaXM7DQotICAgIH0NCi0gICAgQ0ZYX1VuaXRpbWUmCW9wZXJhdG9yICs9IChGWF9VTklUSU1FIHQpDQotICAgIHsNCi0gICAgICAgIG1faVVuaXRpbWUgKz0gdDsNCi0gICAgICAgIHJldHVybiAqdGhpczsNCi0gICAgfQ0KLSAgICBDRlhfVW5pdGltZSYJb3BlcmF0b3IgLT0gKGNvbnN0IENGWF9Vbml0aW1lICZ0KQ0KLSAgICB7DQotICAgICAgICBtX2lVbml0aW1lIC09IHQubV9pVW5pdGltZTsNCi0gICAgICAgIHJldHVybiAqdGhpczsNCi0gICAgfQ0KLSAgICBDRlhfVW5pdGltZSYJb3BlcmF0b3IgLT0gKEZYX1VOSVRJTUUgdCkNCi0gICAgew0KLSAgICAgICAgbV9pVW5pdGltZSAtPSB0Ow0KLSAgICAgICAgcmV0dXJuICp0aGlzOw0KLSAgICB9DQotICAgIHZvaWQJCQlOb3coKTsNCi0gICAgdm9pZAkJCVNldEdNVGltZSgpOw0KLSAgICB2b2lkCQkJU2V0KGludDMyX3QgeWVhciwgdWludDhfdCBtb250aCwgdWludDhfdCBkYXksIHVpbnQ4X3QgaG91ciA9IDAsIHVpbnQ4X3QgbWludXRlID0gMCwgdWludDhfdCBzZWNvbmQgPSAwLCBGWF9XT1JEIG1pbGxpc2Vjb25kID0gMCk7DQotICAgIHZvaWQJCQlTZXQoRlhfVU5JVElNRSB0KTsNCi0gICAgaW50MzJfdAkJR2V0WWVhcigpIGNvbnN0Ow0KLSAgICB1aW50OF90CQkJR2V0TW9udGgoKSBjb25zdDsNCi0gICAgdWludDhfdAkJCUdldERheSgpIGNvbnN0Ow0KLSAgICBGWF9XRUVLREFZCQlHZXREYXlPZldlZWsoKSBjb25zdDsNCi0gICAgRlhfV09SRAkJCUdldERheU9mWWVhcigpIGNvbnN0Ow0KLSAgICBpbnQ2NF90CQlHZXREYXlPZkFEKCkgY29uc3Q7DQotICAgIHVpbnQ4X3QJCQlHZXRIb3VyKCkgY29uc3Q7DQotICAgIHVpbnQ4X3QJCQlHZXRNaW51dGUoKSBjb25zdDsNCi0gICAgdWludDhfdAkJCUdldFNlY29uZCgpIGNvbnN0Ow0KLSAgICBGWF9XT1JECQkJR2V0TWlsbGlzZWNvbmQoKSBjb25zdDsNCi0gICAgRlhfQk9PTAkJCUFkZFllYXJzKGludDMyX3QgaVllYXJzKTsNCi0gICAgRlhfQk9PTAkJCUFkZE1vbnRocyhpbnQzMl90IGlNb250aHMpOw0KLSAgICBGWF9CT09MCQkJQWRkRGF5cyhpbnQzMl90IGlEYXlzKTsNCi0gICAgRlhfQk9PTAkJCUFkZEhvdXJzKGludDMyX3QgaUhvdXJzKTsNCi0gICAgRlhfQk9PTAkJCUFkZE1pbnV0ZXMoaW50MzJfdCBpTWludXRlcyk7DQotICAgIEZYX0JPT0wJCQlBZGRTZWNvbmRzKGludDMyX3QgaVNlY29uZHMpOw0KLSAgICBGWF9CT09MCQkJQWRkTWlsbGlzZWNvbmRzKGludDMyX3QgaU1pbGxpc2Vjb25kcyk7DQotICAgIGZyaWVuZCBDRlhfVW5pdGltZQlvcGVyYXRvciArIChjb25zdCBDRlhfVW5pdGltZSAmdDEsIGNvbnN0IENGWF9Vbml0aW1lICZ0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxLm1faVVuaXRpbWUgKyB0Mi5tX2lVbml0aW1lKTsNCi0gICAgfQ0KLSAgICBmcmllbmQgQ0ZYX1VuaXRpbWUJb3BlcmF0b3IgKyAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBGWF9VTklUSU1FIHQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX1VuaXRpbWUodDEubV9pVW5pdGltZSArIHQyKTsNCi0gICAgfQ0KLSAgICBmcmllbmQgQ0ZYX1VuaXRpbWUJb3BlcmF0b3IgKyAoRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUgJnQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX1VuaXRpbWUodDEgKyB0Mi5tX2lVbml0aW1lKTsNCi0gICAgfQ0KLSAgICBmcmllbmQgQ0ZYX1VuaXRpbWUJb3BlcmF0b3IgLSAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDRlhfVW5pdGltZSh0MS5tX2lVbml0aW1lICsgdDIubV9pVW5pdGltZSk7DQotICAgIH0NCi0gICAgZnJpZW5kIENGWF9Vbml0aW1lCW9wZXJhdG9yIC0gKGNvbnN0IENGWF9Vbml0aW1lICZ0MSwgRlhfVU5JVElNRSB0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxLm1faVVuaXRpbWUgKyB0Mik7DQotICAgIH0NCi0gICAgZnJpZW5kIENGWF9Vbml0aW1lCW9wZXJhdG9yIC0gKEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lICZ0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxICsgdDIubV9pVW5pdGltZSk7DQotICAgIH0NCi0gICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yID09IChjb25zdCBDRlhfVW5pdGltZSAmdDEsIGNvbnN0IENGWF9Vbml0aW1lICZ0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPT0gdDIubV9pVW5pdGltZTsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgPT0gKGNvbnN0IENGWF9Vbml0aW1lICZ0MSwgRlhfVU5JVElNRSB0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPT0gdDI7DQotICAgIH0NCi0gICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yID09IChGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0MSA9PSB0Mi5tX2lVbml0aW1lOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciAhPSAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0MS5tX2lVbml0aW1lICE9IHQyLm1faVVuaXRpbWU7DQotICAgIH0NCi0gICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yICE9IChjb25zdCBDRlhfVW5pdGltZSAmdDEsIEZYX1VOSVRJTUUgdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0MS5tX2lVbml0aW1lICE9IHQyOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciAhPSAoRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUgJnQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdDEgIT0gdDIubV9pVW5pdGltZTsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgPiAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0MS5tX2lVbml0aW1lID4gdDIubV9pVW5pdGltZTsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgPiAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBGWF9VTklUSU1FIHQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdDEubV9pVW5pdGltZSA+IHQyOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciA+IChGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0MSA+IHQyLm1faVVuaXRpbWU7DQotICAgIH0NCi0gICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yID49IChjb25zdCBDRlhfVW5pdGltZSAmdDEsIGNvbnN0IENGWF9Vbml0aW1lICZ0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPj0gdDIubV9pVW5pdGltZTsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgPj0gKGNvbnN0IENGWF9Vbml0aW1lICZ0MSwgRlhfVU5JVElNRSB0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPj0gdDI7DQotICAgIH0NCi0gICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yID49IChGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSAmdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0MSA+PSB0Mi5tX2lVbml0aW1lOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciA8IChjb25zdCBDRlhfVW5pdGltZSAmdDEsIGNvbnN0IENGWF9Vbml0aW1lICZ0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPCB0Mi5tX2lVbml0aW1lOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciA8IChjb25zdCBDRlhfVW5pdGltZSAmdDEsIEZYX1VOSVRJTUUgdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0MS5tX2lVbml0aW1lIDwgdDI7DQotICAgIH0NCi0gICAgZnJpZW5kIEZYX0JPT0wJCW9wZXJhdG9yIDwgKEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lICZ0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHQxIDwgdDIubV9pVW5pdGltZTsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgPD0gKGNvbnN0IENGWF9Vbml0aW1lICZ0MSwgY29uc3QgQ0ZYX1VuaXRpbWUgJnQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdDEubV9pVW5pdGltZSA8PSB0Mi5tX2lVbml0aW1lOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQlvcGVyYXRvciA8PSAoY29uc3QgQ0ZYX1VuaXRpbWUgJnQxLCBGWF9VTklUSU1FIHQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdDEubV9pVW5pdGltZSA8PSB0MjsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJb3BlcmF0b3IgPD0gKEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lICZ0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHQxIDw9IHQyLm1faVVuaXRpbWU7DQotICAgIH0NCi1wcml2YXRlOg0KLSAgICBGWF9VTklUSU1FIG1faVVuaXRpbWU7DQorRlhfQk9PTCBGWF9Jc0xlYXBZZWFyKGludDMyX3QgaVllYXIpOw0KK2ludDMyX3QgRlhfRGF5c0luWWVhcihpbnQzMl90IGlZZWFyKTsNCit1aW50OF90IEZYX0RheXNJbk1vbnRoKGludDMyX3QgaVllYXIsIHVpbnQ4X3QgaU1vbnRoKTsNCitjbGFzcyBDRlhfVW5pdGltZSB7DQorIHB1YmxpYzoNCisgIENGWF9Vbml0aW1lKCkgeyBtX2lVbml0aW1lID0gMDsgfQ0KKyAgQ0ZYX1VuaXRpbWUoRlhfVU5JVElNRSBpVW5pdGltZSkgeyBtX2lVbml0aW1lID0gaVVuaXRpbWU7IH0NCisgIENGWF9Vbml0aW1lKGNvbnN0IENGWF9Vbml0aW1lJiB1bml0aW1lKSB7IG1faVVuaXRpbWUgPSB1bml0aW1lLm1faVVuaXRpbWU7IH0NCisgIG9wZXJhdG9yIEZYX1VOSVRJTUUqKCkgeyByZXR1cm4gJm1faVVuaXRpbWU7IH0NCisgIG9wZXJhdG9yIEZYX1VOSVRJTUUgY29uc3QqKCkgY29uc3QgeyByZXR1cm4gJm1faVVuaXRpbWU7IH0NCisgIG9wZXJhdG9yIEZYX1VOSVRJTUUmKCkgeyByZXR1cm4gbV9pVW5pdGltZTsgfQ0KKyAgb3BlcmF0b3IgY29uc3QgRlhfVU5JVElNRSYoKSBjb25zdCB7IHJldHVybiBtX2lVbml0aW1lOyB9DQorICBDRlhfVW5pdGltZSYgb3BlcmF0b3I9KGNvbnN0IENGWF9Vbml0aW1lJiB0KSB7DQorICAgIG1faVVuaXRpbWUgPSB0Lm1faVVuaXRpbWU7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisgIENGWF9Vbml0aW1lJiBvcGVyYXRvcj0oRlhfVU5JVElNRSB0KSB7DQorICAgIG1faVVuaXRpbWUgPSB0Ow0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICBDRlhfVW5pdGltZSYgb3BlcmF0b3IrPShjb25zdCBDRlhfVW5pdGltZSYgdCkgew0KKyAgICBtX2lVbml0aW1lICs9IHQubV9pVW5pdGltZTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUmIG9wZXJhdG9yKz0oRlhfVU5JVElNRSB0KSB7DQorICAgIG1faVVuaXRpbWUgKz0gdDsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUmIG9wZXJhdG9yLT0oY29uc3QgQ0ZYX1VuaXRpbWUmIHQpIHsNCisgICAgbV9pVW5pdGltZSAtPSB0Lm1faVVuaXRpbWU7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisgIENGWF9Vbml0aW1lJiBvcGVyYXRvci09KEZYX1VOSVRJTUUgdCkgew0KKyAgICBtX2lVbml0aW1lIC09IHQ7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisgIHZvaWQgTm93KCk7DQorICB2b2lkIFNldEdNVGltZSgpOw0KKyAgdm9pZCBTZXQoaW50MzJfdCB5ZWFyLA0KKyAgICAgICAgICAgdWludDhfdCBtb250aCwNCisgICAgICAgICAgIHVpbnQ4X3QgZGF5LA0KKyAgICAgICAgICAgdWludDhfdCBob3VyID0gMCwNCisgICAgICAgICAgIHVpbnQ4X3QgbWludXRlID0gMCwNCisgICAgICAgICAgIHVpbnQ4X3Qgc2Vjb25kID0gMCwNCisgICAgICAgICAgIEZYX1dPUkQgbWlsbGlzZWNvbmQgPSAwKTsNCisgIHZvaWQgU2V0KEZYX1VOSVRJTUUgdCk7DQorICBpbnQzMl90IEdldFllYXIoKSBjb25zdDsNCisgIHVpbnQ4X3QgR2V0TW9udGgoKSBjb25zdDsNCisgIHVpbnQ4X3QgR2V0RGF5KCkgY29uc3Q7DQorICBGWF9XRUVLREFZIEdldERheU9mV2VlaygpIGNvbnN0Ow0KKyAgRlhfV09SRCBHZXREYXlPZlllYXIoKSBjb25zdDsNCisgIGludDY0X3QgR2V0RGF5T2ZBRCgpIGNvbnN0Ow0KKyAgdWludDhfdCBHZXRIb3VyKCkgY29uc3Q7DQorICB1aW50OF90IEdldE1pbnV0ZSgpIGNvbnN0Ow0KKyAgdWludDhfdCBHZXRTZWNvbmQoKSBjb25zdDsNCisgIEZYX1dPUkQgR2V0TWlsbGlzZWNvbmQoKSBjb25zdDsNCisgIEZYX0JPT0wgQWRkWWVhcnMoaW50MzJfdCBpWWVhcnMpOw0KKyAgRlhfQk9PTCBBZGRNb250aHMoaW50MzJfdCBpTW9udGhzKTsNCisgIEZYX0JPT0wgQWRkRGF5cyhpbnQzMl90IGlEYXlzKTsNCisgIEZYX0JPT0wgQWRkSG91cnMoaW50MzJfdCBpSG91cnMpOw0KKyAgRlhfQk9PTCBBZGRNaW51dGVzKGludDMyX3QgaU1pbnV0ZXMpOw0KKyAgRlhfQk9PTCBBZGRTZWNvbmRzKGludDMyX3QgaVNlY29uZHMpOw0KKyAgRlhfQk9PTCBBZGRNaWxsaXNlY29uZHMoaW50MzJfdCBpTWlsbGlzZWNvbmRzKTsNCisgIGZyaWVuZCBDRlhfVW5pdGltZSBvcGVyYXRvcisoY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsNCisgICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxLm1faVVuaXRpbWUgKyB0Mi5tX2lVbml0aW1lKTsNCisgIH0NCisgIGZyaWVuZCBDRlhfVW5pdGltZSBvcGVyYXRvcisoY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBGWF9VTklUSU1FIHQyKSB7DQorICAgIHJldHVybiBDRlhfVW5pdGltZSh0MS5tX2lVbml0aW1lICsgdDIpOw0KKyAgfQ0KKyAgZnJpZW5kIENGWF9Vbml0aW1lIG9wZXJhdG9yKyhGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsNCisgICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxICsgdDIubV9pVW5pdGltZSk7DQorICB9DQorICBmcmllbmQgQ0ZYX1VuaXRpbWUgb3BlcmF0b3ItKGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7DQorICAgIHJldHVybiBDRlhfVW5pdGltZSh0MS5tX2lVbml0aW1lICsgdDIubV9pVW5pdGltZSk7DQorICB9DQorICBmcmllbmQgQ0ZYX1VuaXRpbWUgb3BlcmF0b3ItKGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgRlhfVU5JVElNRSB0Mikgew0KKyAgICByZXR1cm4gQ0ZYX1VuaXRpbWUodDEubV9pVW5pdGltZSArIHQyKTsNCisgIH0NCisgIGZyaWVuZCBDRlhfVW5pdGltZSBvcGVyYXRvci0oRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7DQorICAgIHJldHVybiBDRlhfVW5pdGltZSh0MSArIHQyLm1faVVuaXRpbWUpOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBDRlhfVW5pdGltZSYgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0Mikgew0KKyAgICByZXR1cm4gdDEubV9pVW5pdGltZSA9PSB0Mi5tX2lVbml0aW1lOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBDRlhfVW5pdGltZSYgdDEsIEZYX1VOSVRJTUUgdDIpIHsNCisgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPT0gdDI7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj09KEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0Mikgew0KKyAgICByZXR1cm4gdDEgPT0gdDIubV9pVW5pdGltZTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsNCisgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgIT0gdDIubV9pVW5pdGltZTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBGWF9VTklUSU1FIHQyKSB7DQorICAgIHJldHVybiB0MS5tX2lVbml0aW1lICE9IHQyOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3IhPShGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsNCisgICAgcmV0dXJuIHQxICE9IHQyLm1faVVuaXRpbWU7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj4oY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsNCisgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPiB0Mi5tX2lVbml0aW1lOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I+KGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgRlhfVU5JVElNRSB0Mikgew0KKyAgICByZXR1cm4gdDEubV9pVW5pdGltZSA+IHQyOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I+KEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0Mikgew0KKyAgICByZXR1cm4gdDEgPiB0Mi5tX2lVbml0aW1lOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I+PShjb25zdCBDRlhfVW5pdGltZSYgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0Mikgew0KKyAgICByZXR1cm4gdDEubV9pVW5pdGltZSA+PSB0Mi5tX2lVbml0aW1lOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I+PShjb25zdCBDRlhfVW5pdGltZSYgdDEsIEZYX1VOSVRJTUUgdDIpIHsNCisgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPj0gdDI7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj49KEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0Mikgew0KKyAgICByZXR1cm4gdDEgPj0gdDIubV9pVW5pdGltZTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPChjb25zdCBDRlhfVW5pdGltZSYgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0Mikgew0KKyAgICByZXR1cm4gdDEubV9pVW5pdGltZSA8IHQyLm1faVVuaXRpbWU7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcjwoY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBGWF9VTklUSU1FIHQyKSB7DQorICAgIHJldHVybiB0MS5tX2lVbml0aW1lIDwgdDI7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcjwoRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7DQorICAgIHJldHVybiB0MSA8IHQyLm1faVVuaXRpbWU7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcjw9KGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7DQorICAgIHJldHVybiB0MS5tX2lVbml0aW1lIDw9IHQyLm1faVVuaXRpbWU7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcjw9KGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgRlhfVU5JVElNRSB0Mikgew0KKyAgICByZXR1cm4gdDEubV9pVW5pdGltZSA8PSB0MjsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPD0oRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7DQorICAgIHJldHVybiB0MSA8PSB0Mi5tX2lVbml0aW1lOw0KKyAgfQ0KKw0KKyBwcml2YXRlOg0KKyAgRlhfVU5JVElNRSBtX2lVbml0aW1lOw0KIH07DQogI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfDQogI3ByYWdtYSBwYWNrKHB1c2gsIDEpDQogI2VuZGlmDQogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0RBVEUgew0KLSAgICBpbnQzMl90CXllYXI7DQotICAgIHVpbnQ4X3QJCW1vbnRoOw0KLSAgICB1aW50OF90CQlkYXk7DQotfSBGWF9EQVRFLCAqIEZYX0xQREFURTsNCi10eXBlZGVmIEZYX0RBVEUgY29uc3QgKiBGWF9MUENEQVRFOw0KKyAgaW50MzJfdCB5ZWFyOw0KKyAgdWludDhfdCBtb250aDsNCisgIHVpbnQ4X3QgZGF5Ow0KK30gRlhfREFURSwgKkZYX0xQREFURTsNCit0eXBlZGVmIEZYX0RBVEUgY29uc3QqIEZYX0xQQ0RBVEU7DQogdHlwZWRlZiBzdHJ1Y3QgX0ZYX1RJTUUgew0KLSAgICB1aW50OF90CQlob3VyOw0KLSAgICB1aW50OF90CQltaW51dGU7DQotICAgIHVpbnQ4X3QJCXNlY29uZDsNCi0gICAgRlhfV09SRAkJbWlsbGlzZWNvbmQ7DQotfSBGWF9USU1FLCAqIEZYX0xQVElNRTsNCi10eXBlZGVmIEZYX1RJTUUgY29uc3QgKiBGWF9MUENUSU1FOw0KKyAgdWludDhfdCBob3VyOw0KKyAgdWludDhfdCBtaW51dGU7DQorICB1aW50OF90IHNlY29uZDsNCisgIEZYX1dPUkQgbWlsbGlzZWNvbmQ7DQorfSBGWF9USU1FLCAqRlhfTFBUSU1FOw0KK3R5cGVkZWYgRlhfVElNRSBjb25zdCogRlhfTFBDVElNRTsNCiB0eXBlZGVmIHN0cnVjdCBfRlhfVElNRVpPTkUgew0KLSAgICBpbnQ4X3QJCXR6SG91cjsNCi0gICAgdWludDhfdAkJdHpNaW51dGU7DQotfSBGWF9USU1FWk9ORSwgKiBGWF9MUFRJTUVaT05FOw0KLXR5cGVkZWYgRlhfVElNRVpPTkUgY29uc3QgKiBGWF9MUENUSU1FWk9ORTsNCisgIGludDhfdCB0ekhvdXI7DQorICB1aW50OF90IHR6TWludXRlOw0KK30gRlhfVElNRVpPTkUsICpGWF9MUFRJTUVaT05FOw0KK3R5cGVkZWYgRlhfVElNRVpPTkUgY29uc3QqIEZYX0xQQ1RJTUVaT05FOw0KIHR5cGVkZWYgc3RydWN0IF9GWF9EQVRFVElNRSB7DQotICAgIHVuaW9uIHsNCi0gICAgICAgIHN0cnVjdCB7DQotICAgICAgICAgICAgaW50MzJfdAl5ZWFyOw0KLSAgICAgICAgICAgIHVpbnQ4X3QJCW1vbnRoOw0KLSAgICAgICAgICAgIHVpbnQ4X3QJCWRheTsNCi0gICAgICAgIH0gc0RhdGU7DQotICAgICAgICBGWF9EQVRFIGFEYXRlOw0KLSAgICB9IERhdGU7DQotICAgIHVuaW9uIHsNCi0gICAgICAgIHN0cnVjdCB7DQotICAgICAgICAgICAgdWludDhfdAkJaG91cjsNCi0gICAgICAgICAgICB1aW50OF90CQltaW51dGU7DQotICAgICAgICAgICAgdWludDhfdAkJc2Vjb25kOw0KLSAgICAgICAgICAgIEZYX1dPUkQJCW1pbGxpc2Vjb25kOw0KLSAgICAgICAgfSBzVGltZTsNCi0gICAgICAgIEZYX1RJTUUgYVRpbWU7DQotICAgIH0gVGltZTsNCi19IEZYX0RBVEVUSU1FLCAqIEZYX0xQREFURVRJTUU7DQotdHlwZWRlZiBGWF9EQVRFVElNRSBjb25zdCAqIEZYX0xQQ0RBVEVUSU1FOw0KKyAgdW5pb24gew0KKyAgICBzdHJ1Y3Qgew0KKyAgICAgIGludDMyX3QgeWVhcjsNCisgICAgICB1aW50OF90IG1vbnRoOw0KKyAgICAgIHVpbnQ4X3QgZGF5Ow0KKyAgICB9IHNEYXRlOw0KKyAgICBGWF9EQVRFIGFEYXRlOw0KKyAgfSBEYXRlOw0KKyAgdW5pb24gew0KKyAgICBzdHJ1Y3Qgew0KKyAgICAgIHVpbnQ4X3QgaG91cjsNCisgICAgICB1aW50OF90IG1pbnV0ZTsNCisgICAgICB1aW50OF90IHNlY29uZDsNCisgICAgICBGWF9XT1JEIG1pbGxpc2Vjb25kOw0KKyAgICB9IHNUaW1lOw0KKyAgICBGWF9USU1FIGFUaW1lOw0KKyAgfSBUaW1lOw0KK30gRlhfREFURVRJTUUsICpGWF9MUERBVEVUSU1FOw0KK3R5cGVkZWYgRlhfREFURVRJTUUgY29uc3QqIEZYX0xQQ0RBVEVUSU1FOw0KIHR5cGVkZWYgc3RydWN0IF9GWF9EQVRFVElNRVpPTkUgew0KLSAgICB1bmlvbiB7DQorICB1bmlvbiB7DQorICAgIHN0cnVjdCB7DQorICAgICAgdW5pb24gew0KICAgICAgICAgc3RydWN0IHsNCi0gICAgICAgICAgICB1bmlvbiB7DQotICAgICAgICAgICAgICAgIHN0cnVjdCB7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90CXllYXI7DQotICAgICAgICAgICAgICAgICAgICB1aW50OF90CQltb250aDsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QJCWRheTsNCi0gICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgRlhfREFURQlkYXRlOw0KLSAgICAgICAgICAgIH07DQotICAgICAgICAgICAgdW5pb24gew0KLSAgICAgICAgICAgICAgICBzdHJ1Y3Qgew0KLSAgICAgICAgICAgICAgICAgICAgdWludDhfdAkJaG91cjsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QJCW1pbnV0ZTsNCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QJCXNlY29uZDsNCi0gICAgICAgICAgICAgICAgICAgIEZYX1dPUkQJCW1pbGxpc2Vjb25kOw0KLSAgICAgICAgICAgICAgICB9Ow0KLSAgICAgICAgICAgICAgICBGWF9USU1FIHRpbWU7DQotICAgICAgICAgICAgfTsNCisgICAgICAgICAgaW50MzJfdCB5ZWFyOw0KKyAgICAgICAgICB1aW50OF90IG1vbnRoOw0KKyAgICAgICAgICB1aW50OF90IGRheTsNCiAgICAgICAgIH07DQotICAgICAgICBGWF9EQVRFVElNRSBkdDsNCi0gICAgfTsNCi0gICAgdW5pb24gew0KKyAgICAgICAgRlhfREFURSBkYXRlOw0KKyAgICAgIH07DQorICAgICAgdW5pb24gew0KICAgICAgICAgc3RydWN0IHsNCi0gICAgICAgICAgICBpbnQ4X3QJdHpIb3VyOw0KLSAgICAgICAgICAgIHVpbnQ4X3QJdHpNaW51dGU7DQorICAgICAgICAgIHVpbnQ4X3QgaG91cjsNCisgICAgICAgICAgdWludDhfdCBtaW51dGU7DQorICAgICAgICAgIHVpbnQ4X3Qgc2Vjb25kOw0KKyAgICAgICAgICBGWF9XT1JEIG1pbGxpc2Vjb25kOw0KICAgICAgICAgfTsNCi0gICAgICAgIEZYX1RJTUVaT05FIHR6Ow0KKyAgICAgICAgRlhfVElNRSB0aW1lOw0KKyAgICAgIH07DQogICAgIH07DQotfSBGWF9EQVRFVElNRVpPTkUsICogRlhfTFBEQVRFVElNRVpPTkU7DQotdHlwZWRlZiBGWF9EQVRFVElNRVpPTkUgY29uc3QgKiBGWF9MUENEQVRFVElNRVpPTkU7DQorICAgIEZYX0RBVEVUSU1FIGR0Ow0KKyAgfTsNCisgIHVuaW9uIHsNCisgICAgc3RydWN0IHsNCisgICAgICBpbnQ4X3QgdHpIb3VyOw0KKyAgICAgIHVpbnQ4X3QgdHpNaW51dGU7DQorICAgIH07DQorICAgIEZYX1RJTUVaT05FIHR6Ow0KKyAgfTsNCit9IEZYX0RBVEVUSU1FWk9ORSwgKkZYX0xQREFURVRJTUVaT05FOw0KK3R5cGVkZWYgRlhfREFURVRJTUVaT05FIGNvbnN0KiBGWF9MUENEQVRFVElNRVpPTkU7DQogI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfDQogI3ByYWdtYSBwYWNrKHBvcCkNCiAjZW5kaWYNCi1jbGFzcyBDRlhfRGF0ZVRpbWUNCi17DQotcHVibGljOg0KLSAgICBDRlhfRGF0ZVRpbWUoKSB7fQ0KLSAgICBDRlhfRGF0ZVRpbWUoY29uc3QgRlhfREFURVRJTUUgJmR0KQ0KLSAgICB7DQotICAgICAgICBtX0RhdGVUaW1lID0gZHQ7DQotICAgIH0NCi0gICAgQ0ZYX0RhdGVUaW1lKGNvbnN0IENGWF9EYXRlVGltZSAmZHQpDQotICAgIHsNCi0gICAgICAgIG1fRGF0ZVRpbWUgPSBkdC5tX0RhdGVUaW1lOw0KLSAgICB9DQotICAgIHZpcnR1YWwgfkNGWF9EYXRlVGltZSgpIHt9DQotICAgIG9wZXJhdG9yIEZYX0RBVEVUSU1FICogKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICZtX0RhdGVUaW1lOw0KLSAgICB9DQotICAgIG9wZXJhdG9yIEZYX0RBVEVUSU1FIGNvbnN0ICogKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICZtX0RhdGVUaW1lOw0KLSAgICB9DQotICAgIG9wZXJhdG9yIEZYX0RBVEVUSU1FJiAoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9EYXRlVGltZTsNCi0gICAgfQ0KLSAgICBvcGVyYXRvciBjb25zdCBGWF9EQVRFVElNRSYgKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fRGF0ZVRpbWU7DQotICAgIH0NCi0gICAgQ0ZYX0RhdGVUaW1lJglvcGVyYXRvciA9IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0KQ0KLSAgICB7DQotICAgICAgICBtX0RhdGVUaW1lID0gZHQubV9EYXRlVGltZTsNCi0gICAgICAgIHJldHVybiAqdGhpczsNCi0gICAgfQ0KLSAgICBDRlhfRGF0ZVRpbWUmCW9wZXJhdG9yID0gKGNvbnN0IEZYX0RBVEVUSU1FICZkdCkNCi0gICAgew0KLSAgICAgICAgbV9EYXRlVGltZSA9IGR0Ow0KLSAgICAgICAgcmV0dXJuICp0aGlzOw0KLSAgICB9DQotICAgIENGWF9EYXRlVGltZSYJb3BlcmF0b3IgKz0gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQpDQotICAgIHsNCi0gICAgICAgIEZyb21Vbml0aW1lKFRvVW5pdGltZSgpICsgZHQuVG9Vbml0aW1lKCkpOw0KLSAgICAgICAgcmV0dXJuICp0aGlzOw0KLSAgICB9DQotICAgIENGWF9EYXRlVGltZSYJb3BlcmF0b3IgKz0gKGNvbnN0IEZYX0RBVEVUSU1FICZkdCkNCi0gICAgew0KLSAgICAgICAgRnJvbVVuaXRpbWUoVG9Vbml0aW1lKCkgKyAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQpLlRvVW5pdGltZSgpKTsNCi0gICAgICAgIHJldHVybiAqdGhpczsNCi0gICAgfQ0KLSAgICBDRlhfRGF0ZVRpbWUmCW9wZXJhdG9yIC09IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0KQ0KLSAgICB7DQotICAgICAgICBGcm9tVW5pdGltZShUb1VuaXRpbWUoKSAtIGR0LlRvVW5pdGltZSgpKTsNCi0gICAgICAgIHJldHVybiAqdGhpczsNCi0gICAgfQ0KLSAgICBDRlhfRGF0ZVRpbWUmCW9wZXJhdG9yIC09IChjb25zdCBGWF9EQVRFVElNRSAmZHQpDQotICAgIHsNCi0gICAgICAgIEZyb21Vbml0aW1lKFRvVW5pdGltZSgpIC0gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0KS5Ub1VuaXRpbWUoKSk7DQotICAgICAgICByZXR1cm4gKnRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0KGludDMyX3QgeWVhciwgdWludDhfdCBtb250aCwgdWludDhfdCBkYXksIHVpbnQ4X3QgaG91ciA9IDAsIHVpbnQ4X3QgbWludXRlID0gMCwgdWludDhfdCBzZWNvbmQgPSAwLCBGWF9XT1JEIG1pbGxpc2Vjb25kID0gMCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUZyb21Vbml0aW1lKEZYX1VOSVRJTUUgdCk7DQotICAgIHZpcnR1YWwgRlhfVU5JVElNRQkJVG9Vbml0aW1lKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0WWVhcigpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHVpbnQ4X3QJCQlHZXRNb250aCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHVpbnQ4X3QJCQlHZXREYXkoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9XRUVLREFZCQlHZXREYXlPZldlZWsoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9XT1JECQkJR2V0RGF5T2ZZZWFyKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50NjRfdAkJR2V0RGF5T2ZBRCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHVpbnQ4X3QJCQlHZXRIb3VyKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgdWludDhfdAkJCUdldE1pbnV0ZSgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHVpbnQ4X3QJCQlHZXRTZWNvbmQoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9XT1JECQkJR2V0TWlsbGlzZWNvbmQoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJQWRkWWVhcnMoaW50MzJfdCBpWWVhcnMpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlBZGRNb250aHMoaW50MzJfdCBpTW9udGhzKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJQWRkRGF5cyhpbnQzMl90IGlEYXlzKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJQWRkSG91cnMoaW50MzJfdCBpSG91cnMpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlBZGRNaW51dGVzKGludDMyX3QgaU1pbnV0ZXMpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlBZGRTZWNvbmRzKGludDMyX3QgaVNlY29uZHMpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlBZGRNaWxsaXNlY29uZHMoaW50MzJfdCBpTWlsbGlzZWNvbmRzKTsNCi0gICAgZnJpZW5kIENGWF9EYXRlVGltZQlvcGVyYXRvciArIChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQotICAgIHsNCi0gICAgICAgIENGWF9EYXRlVGltZSBkdDsNCi0gICAgICAgIGR0LkZyb21Vbml0aW1lKGR0MS5Ub1VuaXRpbWUoKSArIGR0Mi5Ub1VuaXRpbWUoKSk7DQotICAgICAgICByZXR1cm4gZHQ7DQotICAgIH0NCi0gICAgZnJpZW5kIENGWF9EYXRlVGltZQlvcGVyYXRvciArIChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MSwgY29uc3QgRlhfREFURVRJTUUgJmR0MikNCi0gICAgew0KLSAgICAgICAgQ0ZYX0RhdGVUaW1lIGR0Ow0KLSAgICAgICAgZHQuRnJvbVVuaXRpbWUoZHQxLlRvVW5pdGltZSgpICsgKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MikuVG9Vbml0aW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIGR0Ow0KLSAgICB9DQotICAgIGZyaWVuZCBDRlhfRGF0ZVRpbWUJb3BlcmF0b3IgKyAoY29uc3QgRlhfREFURVRJTUUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQotICAgIHsNCi0gICAgICAgIENGWF9EYXRlVGltZSBkdDsNCi0gICAgICAgIGR0LkZyb21Vbml0aW1lKCgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDEpLlRvVW5pdGltZSgpICsgZHQyLlRvVW5pdGltZSgpKTsNCi0gICAgICAgIHJldHVybiBkdDsNCi0gICAgfQ0KLSAgICBmcmllbmQgQ0ZYX0RhdGVUaW1lCW9wZXJhdG9yIC0gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MikNCi0gICAgew0KLSAgICAgICAgQ0ZYX0RhdGVUaW1lIGR0Ow0KLSAgICAgICAgZHQuRnJvbVVuaXRpbWUoZHQxLlRvVW5pdGltZSgpIC0gZHQyLlRvVW5pdGltZSgpKTsNCi0gICAgICAgIHJldHVybiBkdDsNCi0gICAgfQ0KLSAgICBmcmllbmQgQ0ZYX0RhdGVUaW1lCW9wZXJhdG9yIC0gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBGWF9EQVRFVElNRSAmZHQyKQ0KLSAgICB7DQotICAgICAgICBDRlhfRGF0ZVRpbWUgZHQ7DQotICAgICAgICBkdC5Gcm9tVW5pdGltZShkdDEuVG9Vbml0aW1lKCkgLSAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKSk7DQotICAgICAgICByZXR1cm4gZHQ7DQotICAgIH0NCi0gICAgZnJpZW5kIENGWF9EYXRlVGltZQlvcGVyYXRvciAtIChjb25zdCBGWF9EQVRFVElNRSAmZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MikNCi0gICAgew0KLSAgICAgICAgQ0ZYX0RhdGVUaW1lIGR0Ow0KLSAgICAgICAgZHQuRnJvbVVuaXRpbWUoKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MSkuVG9Vbml0aW1lKCkgLSBkdDIuVG9Vbml0aW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIGR0Ow0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgPT0gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgoRlhfTFBDREFURVRJTUUpZHQxLCAoRlhfTFBDREFURVRJTUUpZHQyLCBzaXplb2YoRlhfREFURVRJTUUpKSA9PSAwOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgPT0gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBGWF9EQVRFVElNRSAmZHQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbWVtY21wKChGWF9MUENEQVRFVElNRSlkdDEsICZkdDIsIHNpemVvZihGWF9EQVRFVElNRSkpID09IDA7DQotICAgIH0NCi0gICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciA9PSAoY29uc3QgRlhfREFURVRJTUUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGWFNZU19tZW1jbXAoJmR0MSwgKEZYX0xQQ0RBVEVUSU1FKWR0Miwgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgPT0gMDsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJCW9wZXJhdG9yICE9IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGWFNZU19tZW1jbXAoKEZYX0xQQ0RBVEVUSU1FKWR0MSwgKEZYX0xQQ0RBVEVUSU1FKWR0Miwgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgIT0gMDsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJCW9wZXJhdG9yICE9IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MSwgY29uc3QgRlhfREFURVRJTUUgJmR0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgoRlhfTFBDREFURVRJTUUpZHQxLCAmZHQyLCBzaXplb2YoRlhfREFURVRJTUUpKSAhPSAwOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgIT0gKGNvbnN0IEZYX0RBVEVUSU1FICZkdDEsIGNvbnN0IENGWF9EYXRlVGltZSAmZHQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbWVtY21wKCZkdDEsIChGWF9MUENEQVRFVElNRSlkdDIsIHNpemVvZihGWF9EQVRFVElNRSkpICE9IDA7DQotICAgIH0NCi0gICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciA+IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPiBkdDIuVG9Vbml0aW1lKCk7DQotICAgIH0NCi0gICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciA+IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MSwgY29uc3QgRlhfREFURVRJTUUgJmR0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA+ICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDIpLlRvVW5pdGltZSgpOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgPiAoY29uc3QgRlhfREFURVRJTUUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQxKS5Ub1VuaXRpbWUoKSA+IGR0Mi5Ub1VuaXRpbWUoKTsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJCW9wZXJhdG9yID49IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPj0gZHQyLlRvVW5pdGltZSgpOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgPj0gKGNvbnN0IENGWF9EYXRlVGltZSAmZHQxLCBjb25zdCBGWF9EQVRFVElNRSAmZHQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpID49ICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDIpLlRvVW5pdGltZSgpOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgPj0gKGNvbnN0IEZYX0RBVEVUSU1FICZkdDEsIGNvbnN0IENGWF9EYXRlVGltZSAmZHQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MSkuVG9Vbml0aW1lKCkgPj0gZHQyLlRvVW5pdGltZSgpOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgPCAoY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDEsIGNvbnN0IENGWF9EYXRlVGltZSAmZHQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpIDwgZHQyLlRvVW5pdGltZSgpOw0KLSAgICB9DQotICAgIGZyaWVuZCBGWF9CT09MCQkJb3BlcmF0b3IgPCAoY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDEsIGNvbnN0IEZYX0RBVEVUSU1FICZkdDIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPCAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKTsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJCW9wZXJhdG9yIDwgKGNvbnN0IEZYX0RBVEVUSU1FICZkdDEsIGNvbnN0IENGWF9EYXRlVGltZSAmZHQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MSkuVG9Vbml0aW1lKCkgPCBkdDIuVG9Vbml0aW1lKCk7DQotICAgIH0NCi0gICAgZnJpZW5kIEZYX0JPT0wJCQlvcGVyYXRvciA8PSAoY29uc3QgQ0ZYX0RhdGVUaW1lICZkdDEsIGNvbnN0IENGWF9EYXRlVGltZSAmZHQyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpIDw9IGR0Mi5Ub1VuaXRpbWUoKTsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJCW9wZXJhdG9yIDw9IChjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MSwgY29uc3QgRlhfREFURVRJTUUgJmR0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA8PSAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKTsNCi0gICAgfQ0KLSAgICBmcmllbmQgRlhfQk9PTAkJCW9wZXJhdG9yIDw9IChjb25zdCBGWF9EQVRFVElNRSAmZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUgJmR0MikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDEpLlRvVW5pdGltZSgpIDw9IGR0Mi5Ub1VuaXRpbWUoKTsNCi0gICAgfQ0KLXByaXZhdGU6DQotICAgIEZYX0RBVEVUSU1FIG1fRGF0ZVRpbWU7DQorY2xhc3MgQ0ZYX0RhdGVUaW1lIHsNCisgcHVibGljOg0KKyAgQ0ZYX0RhdGVUaW1lKCkge30NCisgIENGWF9EYXRlVGltZShjb25zdCBGWF9EQVRFVElNRSYgZHQpIHsgbV9EYXRlVGltZSA9IGR0OyB9DQorICBDRlhfRGF0ZVRpbWUoY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdCkgeyBtX0RhdGVUaW1lID0gZHQubV9EYXRlVGltZTsgfQ0KKyAgdmlydHVhbCB+Q0ZYX0RhdGVUaW1lKCkge30NCisgIG9wZXJhdG9yIEZYX0RBVEVUSU1FKigpIHsgcmV0dXJuICZtX0RhdGVUaW1lOyB9DQorICBvcGVyYXRvciBGWF9EQVRFVElNRSBjb25zdCooKSBjb25zdCB7IHJldHVybiAmbV9EYXRlVGltZTsgfQ0KKyAgb3BlcmF0b3IgRlhfREFURVRJTUUmKCkgeyByZXR1cm4gbV9EYXRlVGltZTsgfQ0KKyAgb3BlcmF0b3IgY29uc3QgRlhfREFURVRJTUUmKCkgY29uc3QgeyByZXR1cm4gbV9EYXRlVGltZTsgfQ0KKyAgQ0ZYX0RhdGVUaW1lJiBvcGVyYXRvcj0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdCkgew0KKyAgICBtX0RhdGVUaW1lID0gZHQubV9EYXRlVGltZTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgQ0ZYX0RhdGVUaW1lJiBvcGVyYXRvcj0oY29uc3QgRlhfREFURVRJTUUmIGR0KSB7DQorICAgIG1fRGF0ZVRpbWUgPSBkdDsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgQ0ZYX0RhdGVUaW1lJiBvcGVyYXRvcis9KGNvbnN0IENGWF9EYXRlVGltZSYgZHQpIHsNCisgICAgRnJvbVVuaXRpbWUoVG9Vbml0aW1lKCkgKyBkdC5Ub1VuaXRpbWUoKSk7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisgIENGWF9EYXRlVGltZSYgb3BlcmF0b3IrPShjb25zdCBGWF9EQVRFVElNRSYgZHQpIHsNCisgICAgRnJvbVVuaXRpbWUoVG9Vbml0aW1lKCkgKyAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQpLlRvVW5pdGltZSgpKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgQ0ZYX0RhdGVUaW1lJiBvcGVyYXRvci09KGNvbnN0IENGWF9EYXRlVGltZSYgZHQpIHsNCisgICAgRnJvbVVuaXRpbWUoVG9Vbml0aW1lKCkgLSBkdC5Ub1VuaXRpbWUoKSk7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisgIENGWF9EYXRlVGltZSYgb3BlcmF0b3ItPShjb25zdCBGWF9EQVRFVElNRSYgZHQpIHsNCisgICAgRnJvbVVuaXRpbWUoVG9Vbml0aW1lKCkgLSAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQpLlRvVW5pdGltZSgpKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9CT09MIFNldChpbnQzMl90IHllYXIsDQorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF5LA0KKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhvdXIgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1pbnV0ZSA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Vjb25kID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBtaWxsaXNlY29uZCA9IDApOw0KKyAgdmlydHVhbCBGWF9CT09MIEZyb21Vbml0aW1lKEZYX1VOSVRJTUUgdCk7DQorICB2aXJ0dWFsIEZYX1VOSVRJTUUgVG9Vbml0aW1lKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0WWVhcigpIGNvbnN0Ow0KKyAgdmlydHVhbCB1aW50OF90IEdldE1vbnRoKCkgY29uc3Q7DQorICB2aXJ0dWFsIHVpbnQ4X3QgR2V0RGF5KCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX1dFRUtEQVkgR2V0RGF5T2ZXZWVrKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX1dPUkQgR2V0RGF5T2ZZZWFyKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDY0X3QgR2V0RGF5T2ZBRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCB1aW50OF90IEdldEhvdXIoKSBjb25zdDsNCisgIHZpcnR1YWwgdWludDhfdCBHZXRNaW51dGUoKSBjb25zdDsNCisgIHZpcnR1YWwgdWludDhfdCBHZXRTZWNvbmQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfV09SRCBHZXRNaWxsaXNlY29uZCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIEFkZFllYXJzKGludDMyX3QgaVllYXJzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBBZGRNb250aHMoaW50MzJfdCBpTW9udGhzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBBZGREYXlzKGludDMyX3QgaURheXMpOw0KKyAgdmlydHVhbCBGWF9CT09MIEFkZEhvdXJzKGludDMyX3QgaUhvdXJzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBBZGRNaW51dGVzKGludDMyX3QgaU1pbnV0ZXMpOw0KKyAgdmlydHVhbCBGWF9CT09MIEFkZFNlY29uZHMoaW50MzJfdCBpU2Vjb25kcyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQWRkTWlsbGlzZWNvbmRzKGludDMyX3QgaU1pbGxpc2Vjb25kcyk7DQorICBmcmllbmQgQ0ZYX0RhdGVUaW1lIG9wZXJhdG9yKyhjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7DQorICAgIENGWF9EYXRlVGltZSBkdDsNCisgICAgZHQuRnJvbVVuaXRpbWUoZHQxLlRvVW5pdGltZSgpICsgZHQyLlRvVW5pdGltZSgpKTsNCisgICAgcmV0dXJuIGR0Ow0KKyAgfQ0KKyAgZnJpZW5kIENGWF9EYXRlVGltZSBvcGVyYXRvcisoY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9EQVRFVElNRSYgZHQyKSB7DQorICAgIENGWF9EYXRlVGltZSBkdDsNCisgICAgZHQuRnJvbVVuaXRpbWUoZHQxLlRvVW5pdGltZSgpICsgKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MikuVG9Vbml0aW1lKCkpOw0KKyAgICByZXR1cm4gZHQ7DQorICB9DQorICBmcmllbmQgQ0ZYX0RhdGVUaW1lIG9wZXJhdG9yKyhjb25zdCBGWF9EQVRFVElNRSYgZHQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgQ0ZYX0RhdGVUaW1lIGR0Ow0KKyAgICBkdC5Gcm9tVW5pdGltZSgoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQxKS5Ub1VuaXRpbWUoKSArIGR0Mi5Ub1VuaXRpbWUoKSk7DQorICAgIHJldHVybiBkdDsNCisgIH0NCisgIGZyaWVuZCBDRlhfRGF0ZVRpbWUgb3BlcmF0b3ItKGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgQ0ZYX0RhdGVUaW1lIGR0Ow0KKyAgICBkdC5Gcm9tVW5pdGltZShkdDEuVG9Vbml0aW1lKCkgLSBkdDIuVG9Vbml0aW1lKCkpOw0KKyAgICByZXR1cm4gZHQ7DQorICB9DQorICBmcmllbmQgQ0ZYX0RhdGVUaW1lIG9wZXJhdG9yLShjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0RBVEVUSU1FJiBkdDIpIHsNCisgICAgQ0ZYX0RhdGVUaW1lIGR0Ow0KKyAgICBkdC5Gcm9tVW5pdGltZShkdDEuVG9Vbml0aW1lKCkgLSAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKSk7DQorICAgIHJldHVybiBkdDsNCisgIH0NCisgIGZyaWVuZCBDRlhfRGF0ZVRpbWUgb3BlcmF0b3ItKGNvbnN0IEZYX0RBVEVUSU1FJiBkdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICBDRlhfRGF0ZVRpbWUgZHQ7DQorICAgIGR0LkZyb21Vbml0aW1lKCgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDEpLlRvVW5pdGltZSgpIC0gZHQyLlRvVW5pdGltZSgpKTsNCisgICAgcmV0dXJuIGR0Ow0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgoRlhfTFBDREFURVRJTUUpZHQxLCAoRlhfTFBDREFURVRJTUUpZHQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9EQVRFVElNRSkpID09IDA7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj09KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBGWF9EQVRFVElNRSYgZHQyKSB7DQorICAgIHJldHVybiBGWFNZU19tZW1jbXAoKEZYX0xQQ0RBVEVUSU1FKWR0MSwgJmR0Miwgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgPT0gMDsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPT0oY29uc3QgRlhfREFURVRJTUUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgmZHQxLCAoRlhfTFBDREFURVRJTUUpZHQyLCBzaXplb2YoRlhfREFURVRJTUUpKSA9PSAwOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3IhPShjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgoRlhfTFBDREFURVRJTUUpZHQxLCAoRlhfTFBDREFURVRJTUUpZHQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9EQVRFVElNRSkpICE9IDA7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvciE9KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBGWF9EQVRFVElNRSYgZHQyKSB7DQorICAgIHJldHVybiBGWFNZU19tZW1jbXAoKEZYX0xQQ0RBVEVUSU1FKWR0MSwgJmR0Miwgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgIT0gMDsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgRlhfREFURVRJTUUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgmZHQxLCAoRlhfTFBDREFURVRJTUUpZHQyLCBzaXplb2YoRlhfREFURVRJTUUpKSAhPSAwOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I+KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpID4gZHQyLlRvVW5pdGltZSgpOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I+KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBGWF9EQVRFVElNRSYgZHQyKSB7DQorICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPiAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPihjb25zdCBGWF9EQVRFVElNRSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICByZXR1cm4gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MSkuVG9Vbml0aW1lKCkgPiBkdDIuVG9Vbml0aW1lKCk7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj49KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpID49IGR0Mi5Ub1VuaXRpbWUoKTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPj0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsIGNvbnN0IEZYX0RBVEVUSU1FJiBkdDIpIHsNCisgICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA+PSAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPj0oY29uc3QgRlhfREFURVRJTUUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgcmV0dXJuICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDEpLlRvVW5pdGltZSgpID49IGR0Mi5Ub1VuaXRpbWUoKTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPChjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA8IGR0Mi5Ub1VuaXRpbWUoKTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPChjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgRlhfREFURVRJTUUmIGR0Mikgew0KKyAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpIDwgKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MikuVG9Vbml0aW1lKCk7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcjwoY29uc3QgRlhfREFURVRJTUUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgcmV0dXJuICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDEpLlRvVW5pdGltZSgpIDwgZHQyLlRvVW5pdGltZSgpOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I8PShjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA8PSBkdDIuVG9Vbml0aW1lKCk7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcjw9KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBGWF9EQVRFVElNRSYgZHQyKSB7DQorICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPD0gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MikuVG9Vbml0aW1lKCk7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcjw9KGNvbnN0IEZYX0RBVEVUSU1FJiBkdDEsIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7DQorICAgIHJldHVybiAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQxKS5Ub1VuaXRpbWUoKSA8PSBkdDIuVG9Vbml0aW1lKCk7DQorICB9DQorDQorIHByaXZhdGU6DQorICBGWF9EQVRFVElNRSBtX0RhdGVUaW1lOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfZm50LmggYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9mbnQuaAppbmRleCA5MjQyZDk3Li40YTEwZWUzIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9mbnQuaAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9mbnQuaApAQCAtOCwxNzEgKzgsMjU3IEBACiAjZGVmaW5lIF9GWF9GT05UDQogY2xhc3MgSUZYX0ZvbnQ7DQogY2xhc3MgSUZYX0ZvbnRNZ3I7DQotI2RlZmluZSBGWF9GT05UU1RZTEVfTm9ybWFsCQkJCQkweDAwDQotI2RlZmluZSBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaAkJCQkweDAxDQotI2RlZmluZSBGWF9GT05UU1RZTEVfU2VyaWYJCQkJCTB4MDINCi0jZGVmaW5lIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYwkJCQkweDA0DQotI2RlZmluZSBGWF9GT05UU1RZTEVfU2NyaXB0CQkJCQkweDA4DQotI2RlZmluZSBGWF9GT05UU1RZTEVfSXRhbGljCQkJCQkweDQwDQotI2RlZmluZSBGWF9GT05UU1RZTEVfQm9sZAkJCQkJMHg0MDAwMA0KLSNkZWZpbmUgRlhfRk9OVFNUWUxFX0JvbGRJdGFsaWMJCQkJKEZYX0ZPTlRTVFlMRV9Cb2xkfEZYX0ZPTlRTVFlMRV9JdGFsaWMpDQotI2RlZmluZSBGWF9GT05UU1RZTEVfRXhhY3RNYXRjaAkJCQkweDgwMDAwMDAwDQotI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9VbmRlcmxpbmUJCQkweDAwMDAwMDAxDQotI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9TdHJpa2VvdXQJCQkweDAwMDAwMDAyDQotI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9PdmVybGluZQkJCTB4MDAwMDAwMDQNCi0jZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0VtcGhhc2lzCQkJMHgwMDAwMDAwOA0KLSNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fU3VwZXJzY3JpcHQJCTB4MDAwMDAwMTANCi0jZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1N1YnNjcmlwdAkJCTB4MDAwMDAwMjANCi0jZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1NtYWxsQ2FwaXRhbAkJMHgwMDAwMDA0MA0KLSNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fQ2FwaXRhbAkJCTB4MDAwMDAwODANCi0jZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0xvd2VyY2FzZQkJCTB4MDAwMDAwQzANCi0jZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1JhaXNlZAkJCTB4MDAwMDAxMDANCi0jZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1N1bmtlbgkJCTB4MDAwMDAyMDANCi0jZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1NoYWRvdwkJCTB4MDAwMDA0MDANCi0jZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0JvdW5kaW5nU2hhcGUJCTB4MjAwMDAwMDANCi0jZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0hpZGUJCQkJMHg0MDAwMDAwMA0KLSNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fU3Ryb2tlRmlsbAkJMHg4MDAwMDAwMA0KLSNkZWZpbmUgRlhfQk9VTkRJTkdTSEFQRV9Ob25lCQkJMA0KLSNkZWZpbmUgRlhfQk9VTkRJTkdTSEFQRV9DaXJjbGUJCQkxDQotI2RlZmluZSBGWF9CT1VORElOR1NIQVBFX1NxdWFyZQkJCTINCi0jZGVmaW5lIEZYX0JPVU5ESU5HU0hBUEVfVHJpYW5nbGUJCTMNCi0jZGVmaW5lIEZYX0JPVU5ESU5HU0hBUEVfRGlhbW9uZAkJNA0KKyNkZWZpbmUgRlhfRk9OVFNUWUxFX05vcm1hbCAweDAwDQorI2RlZmluZSBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCAweDAxDQorI2RlZmluZSBGWF9GT05UU1RZTEVfU2VyaWYgMHgwMg0KKyNkZWZpbmUgRlhfRk9OVFNUWUxFX1N5bWJvbGljIDB4MDQNCisjZGVmaW5lIEZYX0ZPTlRTVFlMRV9TY3JpcHQgMHgwOA0KKyNkZWZpbmUgRlhfRk9OVFNUWUxFX0l0YWxpYyAweDQwDQorI2RlZmluZSBGWF9GT05UU1RZTEVfQm9sZCAweDQwMDAwDQorI2RlZmluZSBGWF9GT05UU1RZTEVfQm9sZEl0YWxpYyAoRlhfRk9OVFNUWUxFX0JvbGQgfCBGWF9GT05UU1RZTEVfSXRhbGljKQ0KKyNkZWZpbmUgRlhfRk9OVFNUWUxFX0V4YWN0TWF0Y2ggMHg4MDAwMDAwMA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fVW5kZXJsaW5lIDB4MDAwMDAwMDENCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1N0cmlrZW91dCAweDAwMDAwMDAyDQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9PdmVybGluZSAweDAwMDAwMDA0DQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9FbXBoYXNpcyAweDAwMDAwMDA4DQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9TdXBlcnNjcmlwdCAweDAwMDAwMDEwDQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9TdWJzY3JpcHQgMHgwMDAwMDAyMA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fU21hbGxDYXBpdGFsIDB4MDAwMDAwNDANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0NhcGl0YWwgMHgwMDAwMDA4MA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fTG93ZXJjYXNlIDB4MDAwMDAwQzANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1JhaXNlZCAweDAwMDAwMTAwDQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9TdW5rZW4gMHgwMDAwMDIwMA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fU2hhZG93IDB4MDAwMDA0MDANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0JvdW5kaW5nU2hhcGUgMHgyMDAwMDAwMA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fSGlkZSAweDQwMDAwMDAwDQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9TdHJva2VGaWxsIDB4ODAwMDAwMDANCisjZGVmaW5lIEZYX0JPVU5ESU5HU0hBUEVfTm9uZSAwDQorI2RlZmluZSBGWF9CT1VORElOR1NIQVBFX0NpcmNsZSAxDQorI2RlZmluZSBGWF9CT1VORElOR1NIQVBFX1NxdWFyZSAyDQorI2RlZmluZSBGWF9CT1VORElOR1NIQVBFX1RyaWFuZ2xlIDMNCisjZGVmaW5lIEZYX0JPVU5ESU5HU0hBUEVfRGlhbW9uZCA0DQogDQotY2xhc3MgSUZYX0ZvbnRQcm92aWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGWF9Gb250UHJvdmlkZXIoKSB7fQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldENoYXJXaWR0aChJRlhfRm9udCogcEZvbnQsIEZYX1dDSEFSIHdVbmljb2RlLCBpbnQzMl90ICZpV2lkdGgsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpID0gMDsNCitjbGFzcyBJRlhfRm9udFByb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZYX0ZvbnRQcm92aWRlcigpIHt9DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2hhcldpZHRoKElGWF9Gb250KiBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSkgPSAwOw0KIH07DQogDQotY2xhc3MgSUZYX0ZvbnQNCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZYX0ZvbnQqCQlMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSwgSUZYX0ZvbnRNZ3IgKnBGb250TWdyKTsNCi0gICAgc3RhdGljIElGWF9Gb250KgkJTG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IpOw0KLSAgICBzdGF0aWMgSUZYX0ZvbnQqCQlMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUsIElGWF9Gb250TWdyICpwRm9udE1ncik7DQotICAgIHN0YXRpYyBJRlhfRm9udCoJCUxvYWRGb250KElGWF9TdHJlYW0gKnBGb250U3RyZWFtLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IsIEZYX0JPT0wgYlNhdmVTdHJlYW0gPSBGQUxTRSk7DQotICAgIHN0YXRpYyBJRlhfRm9udCoJCUxvYWRGb250KENGWF9Gb250ICpwRXh0Rm9udCwgSUZYX0ZvbnRNZ3IgKnBGb250TWdyLCBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKTsNCi0gICAgdmlydHVhbCB+SUZYX0ZvbnQoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJUmV0YWluKCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJRGVyaXZlKEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UgPSAwKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldEZhbWlseU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzRmFtaWx5KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFBzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NOYW1lKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldEZvbnRTdHlsZXMoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdWludDhfdAkJCUdldENoYXJTZXQoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwgaW50MzJfdCAmaVdpZHRoLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEFzY2VudCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXREZXNjZW50KCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRDaGFyQkJveChGWF9XQ0hBUiB3VW5pY29kZSwgQ0ZYX1JlY3QgJmJib3gsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QkJveChDRlhfUmVjdCAmYmJveCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEl0YWxpY0FuZ2xlKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZXNldCgpID0gMDsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUdldFN1YnN0Rm9udChpbnQzMl90IGlHbHlwaEluZGV4KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZCoJCQlHZXREZXZGb250KCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250UHJvdmlkZXIoSUZYX0ZvbnRQcm92aWRlciogcFByb3ZpZGVyKSA9IDA7DQorY2xhc3MgSUZYX0ZvbnQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZYX0ZvbnQqIExvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IpOw0KKyAgc3RhdGljIElGWF9Gb250KiBMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyKiBwRm9udE1ncik7DQorICBzdGF0aWMgSUZYX0ZvbnQqIExvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSwgSUZYX0ZvbnRNZ3IqIHBGb250TWdyKTsNCisgIHN0YXRpYyBJRlhfRm9udCogTG9hZEZvbnQoSUZYX1N0cmVhbSogcEZvbnRTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyKiBwRm9udE1nciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVN0cmVhbSA9IEZBTFNFKTsNCisgIHN0YXRpYyBJRlhfRm9udCogTG9hZEZvbnQoQ0ZYX0ZvbnQqIHBFeHRGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRha2VPdmVyID0gRkFMU0UpOw0KKyAgdmlydHVhbCB+SUZYX0ZvbnQoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBSZXRhaW4oKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBEZXJpdmUoRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDApID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRGYW1pbHlOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0ZhbWlseSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFBzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldEZvbnRTdHlsZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHVpbnQ4X3QgR2V0Q2hhclNldCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDaGFyV2lkdGgoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0QXNjZW50KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldERlc2NlbnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3QmIGJib3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goQ0ZYX1JlY3QmIGJib3gpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJdGFsaWNBbmdsZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldFN1YnN0Rm9udChpbnQzMl90IGlHbHlwaEluZGV4KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQqIEdldERldkZvbnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFByb3ZpZGVyKElGWF9Gb250UHJvdmlkZXIqIHBQcm92aWRlcikgPSAwOw0KICNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQotICAgIHZpcnR1YWwgdm9pZAkJCVNldExvZ2ljYWxGb250U3R5bGUoRlhfRFdPUkQgZHdMb2dGb250U3R5bGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRMb2dpY2FsRm9udFN0eWxlKEZYX0RXT1JEIGR3TG9nRm9udFN0eWxlKSA9IDA7DQogI2VuZGlmDQogfTsNCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KIHR5cGVkZWYgc3RydWN0IF9GWF9GT05UTUFUQ0hQQVJBTVMgew0KLSAgICBjb25zdCBGWF9XQ0hBUioJCQkJcHdzRmFtaWx5Ow0KLSAgICBGWF9EV09SRAkJCQlkd0ZvbnRTdHlsZXM7DQotICAgIEZYX0RXT1JECQkJCWR3VVNCOw0KLSAgICBGWF9EV09SRAkJCQlkd01hdGNoRmxhZ3M7DQotICAgIEZYX1dDSEFSCQkJCXdVbmljb2RlOw0KLSAgICBGWF9XT1JECQkJCQl3Q29kZVBhZ2U7DQotfSBGWF9GT05UTUFUQ0hQQVJBTVMsICogRlhfTFBGT05UTUFUQ0hQQVJBTVM7DQotdHlwZWRlZiBGWF9GT05UTUFUQ0hQQVJBTVMgY29uc3QgKiBGWF9MUENGT05UTUFUQ0hQQVJBTVM7DQorICBjb25zdCBGWF9XQ0hBUiogcHdzRmFtaWx5Ow0KKyAgRlhfRFdPUkQgZHdGb250U3R5bGVzOw0KKyAgRlhfRFdPUkQgZHdVU0I7DQorICBGWF9EV09SRCBkd01hdGNoRmxhZ3M7DQorICBGWF9XQ0hBUiB3VW5pY29kZTsNCisgIEZYX1dPUkQgd0NvZGVQYWdlOw0KK30gRlhfRk9OVE1BVENIUEFSQU1TLCAqRlhfTFBGT05UTUFUQ0hQQVJBTVM7DQordHlwZWRlZiBGWF9GT05UTUFUQ0hQQVJBTVMgY29uc3QqIEZYX0xQQ0ZPTlRNQVRDSFBBUkFNUzsNCiB0eXBlZGVmIHN0cnVjdCBfRlhfRk9OVFNJR05BVFVSRSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCi0gICAgRlhfRFdPUkQJCQkJZnNVc2JbNF07DQotICAgIEZYX0RXT1JECQkJCWZzQ3NiWzJdOw0KKyAgRlhfRFdPUkQgZnNVc2JbNF07DQorICBGWF9EV09SRCBmc0NzYlsyXTsNCiB9IEZYX0ZPTlRTSUdOQVRVUkU7DQogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0ZPTlRERVNDUklQVE9SIDogcHVibGljIENGWF9UYXJnZXQgew0KLSAgICBGWF9XQ0hBUgkJCQl3c0ZvbnRGYWNlWzMyXTsNCi0gICAgRlhfRFdPUkQJCQkJZHdGb250U3R5bGVzOw0KLSAgICB1aW50OF90CQkJCQl1Q2hhclNldDsNCi0gICAgRlhfRk9OVFNJR05BVFVSRQkJRm9udFNpZ25hdHVyZTsNCi19IEZYX0ZPTlRERVNDUklQVE9SLCAqIEZYX0xQRk9OVERFU0NSSVBUT1I7DQotdHlwZWRlZiBGWF9GT05UREVTQ1JJUFRPUiBjb25zdCAqIEZYX0xQQ0ZPTlRERVNDUklQVE9SOw0KKyAgRlhfV0NIQVIgd3NGb250RmFjZVszMl07DQorICBGWF9EV09SRCBkd0ZvbnRTdHlsZXM7DQorICB1aW50OF90IHVDaGFyU2V0Ow0KKyAgRlhfRk9OVFNJR05BVFVSRSBGb250U2lnbmF0dXJlOw0KK30gRlhfRk9OVERFU0NSSVBUT1IsICpGWF9MUEZPTlRERVNDUklQVE9SOw0KK3R5cGVkZWYgRlhfRk9OVERFU0NSSVBUT1IgY29uc3QqIEZYX0xQQ0ZPTlRERVNDUklQVE9SOw0KIHR5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPEZYX0ZPTlRERVNDUklQVE9SPiBDRlhfRm9udERlc2NyaXB0b3JzOw0KLWlubGluZSBGWF9CT09MIG9wZXJhdG9yID09IChjb25zdCBGWF9GT05UREVTQ1JJUFRPUiAmbGVmdCwgY29uc3QgRlhfRk9OVERFU0NSSVBUT1IgJnJpZ2h0KQ0KLXsNCi0gICAgcmV0dXJuIGxlZnQudUNoYXJTZXQgPT0gcmlnaHQudUNoYXJTZXQNCi0gICAgICAgICAgICYmIGxlZnQuZHdGb250U3R5bGVzID09IHJpZ2h0LmR3Rm9udFN0eWxlcw0KLSAgICAgICAgICAgJiYgRlhTWVNfd2NzY21wKGxlZnQud3NGb250RmFjZSwgcmlnaHQud3NGb250RmFjZSkgPT0gMA0KLSAgICAgICAgICAgJiYgRlhTWVNfbWVtY21wKCZsZWZ0LkZvbnRTaWduYXR1cmUsICZyaWdodC5Gb250U2lnbmF0dXJlLCBzaXplb2YoRlhfRk9OVFNJR05BVFVSRSkpID09IDA7DQoraW5saW5lIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBGWF9GT05UREVTQ1JJUFRPUiYgbGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZPTlRERVNDUklQVE9SJiByaWdodCkgew0KKyAgcmV0dXJuIGxlZnQudUNoYXJTZXQgPT0gcmlnaHQudUNoYXJTZXQgJiYNCisgICAgICAgICBsZWZ0LmR3Rm9udFN0eWxlcyA9PSByaWdodC5kd0ZvbnRTdHlsZXMgJiYNCisgICAgICAgICBGWFNZU193Y3NjbXAobGVmdC53c0ZvbnRGYWNlLCByaWdodC53c0ZvbnRGYWNlKSA9PSAwICYmDQorICAgICAgICAgRlhTWVNfbWVtY21wKCZsZWZ0LkZvbnRTaWduYXR1cmUsICZyaWdodC5Gb250U2lnbmF0dXJlLA0KKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlhfRk9OVFNJR05BVFVSRSkpID09IDA7DQogfQ0KLSNkZWZpbmUgRlhfRk9OVE1BVENIUEFSQV9NYWN0aFN0eWxlCQkweDAxDQotI2RlZmluZSBGWF9GT05UTUFUQ0hQQVJBX01hY3RoRmFtaWx5CTB4MDINCi0jZGVmaW5lIEZYX0ZPTlRNQVRDSFBBUkFfTWFjdGhVbmljb2RlCTB4MDQNCi10eXBlZGVmIHZvaWQgKCpGWF9MUEVudW1BbGxGb250cykoQ0ZYX0ZvbnREZXNjcmlwdG9ycyAmZm9udHMsIHZvaWQqIHBVc2VyRGF0YSwgY29uc3QgRlhfV0NIQVIqIHB3c0ZhY2VOYW1lLCBGWF9XQ0hBUiB3VW5pY29kZSk7DQorI2RlZmluZSBGWF9GT05UTUFUQ0hQQVJBX01hY3RoU3R5bGUgMHgwMQ0KKyNkZWZpbmUgRlhfRk9OVE1BVENIUEFSQV9NYWN0aEZhbWlseSAweDAyDQorI2RlZmluZSBGWF9GT05UTUFUQ0hQQVJBX01hY3RoVW5pY29kZSAweDA0DQordHlwZWRlZiB2b2lkICgqRlhfTFBFbnVtQWxsRm9udHMpKENGWF9Gb250RGVzY3JpcHRvcnMmIGZvbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwd3NGYWNlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd1VuaWNvZGUpOw0KIEZYX0xQRW51bUFsbEZvbnRzIEZYX0dldERlZkZvbnRFbnVtZXJhdG9yKCk7DQotdHlwZWRlZiBGWF9MUENGT05UREVTQ1JJUFRPUiAoKkZYX0xQTWF0Y2hGb250KShGWF9MUEZPTlRNQVRDSFBBUkFNUyBwUGFyYW1zLCBjb25zdCBDRlhfRm9udERlc2NyaXB0b3JzICZmb250cywgdm9pZCogcFVzZXJEYXRhKTsNCit0eXBlZGVmIEZYX0xQQ0ZPTlRERVNDUklQVE9SICgqRlhfTFBNYXRjaEZvbnQpKEZYX0xQRk9OVE1BVENIUEFSQU1TIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRm9udERlc2NyaXB0b3JzJiBmb250cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSk7DQogRlhfTFBNYXRjaEZvbnQgRlhfR2V0RGVmRm9udE1hdGNob3IoKTsNCi1jbGFzcyBJRlhfRm9udE1ncg0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRlhfRm9udE1ncioJQ3JlYXRlKEZYX0xQRW51bUFsbEZvbnRzIHBFbnVtZXJhdG9yLCBGWF9MUE1hdGNoRm9udCBwTWF0Y2hlciA9IE5VTEwsIHZvaWQqIHBVc2VyRGF0YSA9IE5VTEwpOw0KLSAgICB+dmlydHVhbCB+SUZYX0ZvbnRNZ3IoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmRm9udEJ5Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlDaGFyc2V0KHVpbnQ4X3QgbkNoYXJzZXQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmRm9udEJ5TGFuZ3VhZ2UoRlhfV09SRCB3TGFuZ3VhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDB4RkZGRikgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJTG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoKSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUpID0gMDsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUxvYWRGb250KElGWF9TdHJlYW0gKnBGb250U3RyZWFtLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEFsaWFzID0gTlVMTCwgRlhfRFdPUkQgZHdGb250U3R5bGVzID0gMCwgRlhfV09SRCB3Q29kZVBhZ2UgPSAwLCBGWF9CT09MIGJTYXZlU3RyZWFtID0gRkFMU0UpID0gMDsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUxvYWRGb250KElGWF9Gb250ICpwU3JjRm9udCwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDB4RkZGRikgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlDbGVhckZvbnRDYWNoZSgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVtb3ZlRm9udChJRlhfRm9udCAqcEZvbnQpID0gMDsNCitjbGFzcyBJRlhfRm9udE1nciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRlhfRm9udE1nciogQ3JlYXRlKEZYX0xQRW51bUFsbEZvbnRzIHBFbnVtZXJhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBNYXRjaEZvbnQgcE1hdGNoZXIgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhID0gTlVMTCk7DQorICB+dmlydHVhbCB+SUZYX0ZvbnRNZ3IoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlDb2RlUGFnZSgNCisgICAgICBGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlDaGFyc2V0KA0KKyAgICAgIHVpbnQ4X3QgbkNoYXJzZXQsDQorICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5VW5pY29kZSgNCisgICAgICBGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlMYW5ndWFnZSgNCisgICAgICBGWF9XT1JEIHdMYW5ndWFnZSwNCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIExvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoSUZYX1N0cmVhbSogcEZvbnRTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEFsaWFzID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcyA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3RyZWFtID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIExvYWRGb250KElGWF9Gb250KiBwU3JjRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQ2xlYXJGb250Q2FjaGUoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlRm9udChJRlhfRm9udCogcEZvbnQpID0gMDsNCiB9Ow0KICNlbHNlDQotY2xhc3MgSUZYX0ZvbnRNZ3JEZWxlZ2F0ZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGWF9Gb250TWdyRGVsZWdhdGUoKSB7fQ0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmRm9udEJ5Q29kZVBhZ2UoSUZYX0ZvbnRNZ3IqIHBGb250TWdyLCBGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeUNoYXJzZXQoSUZYX0ZvbnRNZ3IqIHBGb250TWdyLCB1aW50OF90IG5DaGFyc2V0LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmRm9udEJ5VW5pY29kZShJRlhfRm9udE1nciogcEZvbnRNZ3IsIEZYX1dDSEFSIHdVbmljb2RlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmRm9udEJ5TGFuZ3VhZ2UoSUZYX0ZvbnRNZ3IqIHBGb250TWdyLCBGWF9XT1JEIHdMYW5ndWFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCitjbGFzcyBJRlhfRm9udE1nckRlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZYX0ZvbnRNZ3JEZWxlZ2F0ZSgpIHt9DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlDb2RlUGFnZSgNCisgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IsDQorICAgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5Q2hhcnNldCgNCisgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IsDQorICAgICAgdWludDhfdCBuQ2hhcnNldCwNCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlVbmljb2RlKA0KKyAgICAgIElGWF9Gb250TWdyKiBwRm9udE1nciwNCisgICAgICBGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlMYW5ndWFnZSgNCisgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IsDQorICAgICAgRlhfV09SRCB3TGFuZ3VhZ2UsDQorICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KIH07DQotY2xhc3MgSUZYX0ZvbnRTb3VyY2VFbnVtDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZYX0ZvbnRTb3VyY2VFbnVtKCkge30NCi0gICAgdmlydHVhbAl2b2lkCQkJUmVsZWFzZSgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9QT1NJVElPTgkJR2V0U3RhcnRQb3NpdGlvbih2b2lkKiBwVXNlckRhdGEgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0ZpbGVBY2Nlc3MqCUdldE5leHQoRlhfUE9TSVRJT04mIHBvcywgdm9pZCogcFVzZXJEYXRhID0gTlVMTCkgPSAwOw0KK2NsYXNzIElGWF9Gb250U291cmNlRW51bSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGWF9Gb250U291cmNlRW51bSgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfUE9TSVRJT04gR2V0U3RhcnRQb3NpdGlvbih2b2lkKiBwVXNlckRhdGEgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9GaWxlQWNjZXNzKiBHZXROZXh0KEZYX1BPU0lUSU9OJiBwb3MsIHZvaWQqIHBVc2VyRGF0YSA9IE5VTEwpID0gMDsNCiB9Ow0KLUlGWF9Gb250U291cmNlRW51bSoJRlhfQ3JlYXRlRGVmYXVsdEZvbnRTb3VyY2VFbnVtKCk7DQotY2xhc3MgSUZYX0ZvbnRNZ3INCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSUZYX0ZvbnRNZ3IqIENyZWF0ZShJRlhfRm9udFNvdXJjZUVudW0qIHBGb250RW51bSwgSUZYX0ZvbnRNZ3JEZWxlZ2F0ZSogcERlbGVnYXRlID0gTlVMTCwgdm9pZCogcFVzZXJEYXRhID0gTlVMTCk7DQotICAgIHZpcnR1YWwgfklGWF9Gb250TWdyKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmRm9udEJ5Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlDaGFyc2V0KHVpbnQ4X3QgbkNoYXJzZXQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmRm9udEJ5TGFuZ3VhZ2UoRlhfV09SRCB3TGFuZ3VhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXRGb250QnlDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCi0gICAgaW5saW5lIElGWF9Gb250KgkJTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBHZXRGb250QnlDb2RlUGFnZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywgcHN6Rm9udEZhbWlseSk7DQotICAgIH0NCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUdldEZvbnRCeUNoYXJzZXQodWludDhfdCBuQ2hhcnNldCwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUdldEZvbnRCeVVuaWNvZGUoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXRGb250QnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUxvYWRGb250KGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUxlbmd0aCwgaW50MzJfdCBpRmFjZUluZGV4LCBpbnQzMl90KiBwRmFjZUNvdW50ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lLCBpbnQzMl90IGlGYWNlSW5kZXgsIGludDMyX3QqIHBGYWNlQ291bnQgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlMb2FkRm9udChJRlhfU3RyZWFtICpwRm9udFN0cmVhbSwgaW50MzJfdCBpRmFjZUluZGV4LCBpbnQzMl90KiBwRmFjZUNvdW50ID0gTlVMTCwgRlhfQk9PTCBiU2F2ZVN0cmVhbSA9IEZBTFNFKSA9IDA7DQorSUZYX0ZvbnRTb3VyY2VFbnVtKiBGWF9DcmVhdGVEZWZhdWx0Rm9udFNvdXJjZUVudW0oKTsNCitjbGFzcyBJRlhfRm9udE1nciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRlhfRm9udE1nciogQ3JlYXRlKElGWF9Gb250U291cmNlRW51bSogcEZvbnRFbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3JEZWxlZ2F0ZSogcERlbGVnYXRlID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSA9IE5VTEwpOw0KKyAgdmlydHVhbCB+SUZYX0ZvbnRNZ3IoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlDb2RlUGFnZSgNCisgICAgICBGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlDaGFyc2V0KA0KKyAgICAgIHVpbnQ4X3QgbkNoYXJzZXQsDQorICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5VW5pY29kZSgNCisgICAgICBGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlMYW5ndWFnZSgNCisgICAgICBGWF9XT1JEIHdMYW5ndWFnZSwNCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXRGb250QnlDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgaW5saW5lIElGWF9Gb250KiBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSkgew0KKyAgICByZXR1cm4gR2V0Rm9udEJ5Q29kZVBhZ2Uod0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KKyAgfQ0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0Rm9udEJ5Q2hhcnNldCh1aW50OF90IG5DaGFyc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0Rm9udEJ5VW5pY29kZShGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnRCeUxhbmd1YWdlKEZYX1dPUkQgd0xhbmd1YWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcEZhY2VDb3VudCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIExvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChJRlhfU3RyZWFtKiBwRm9udFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVN0cmVhbSA9IEZBTFNFKSA9IDA7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCUNsZWFyRm9udENhY2hlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZW1vdmVGb250KElGWF9Gb250ICpwRm9udCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENsZWFyRm9udENhY2hlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZUZvbnQoSUZYX0ZvbnQqIHBGb250KSA9IDA7DQogfTsNCiAjZW5kaWYNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sYmsuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xiay5oCmluZGV4IDI3YTA3MmEuLjBkZGY1N2UgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xiay5oCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xiay5oCkBAIC03LDIxICs3LDI1IEBACiAjaWZuZGVmIF9GWF9MSU5FQlJFQUsNCiAjZGVmaW5lIF9GWF9MSU5FQlJFQUsNCiBlbnVtIEZYX0xJTkVCUkVBS1RZUEUgew0KLSAgICBGWF9MQlRfVU5LTk9XTgkJCQk9IDB4MDAsDQotICAgIEZYX0xCVF9ESVJFQ1RfQlJLCQkJPSAweDFBLA0KLSAgICBGWF9MQlRfSU5ESVJFQ1RfQlJLCQkJPSAweDJCLA0KLSAgICBGWF9MQlRfQ09NX0lORElSRUNUX0JSSwkJPSAweDNDLA0KLSAgICBGWF9MQlRfQ09NX1BST0hJQklURURfQlJLCT0gMHg0RCwNCi0gICAgRlhfTEJUX1BST0hJQklURURfQlJLCQk9IDB4NUUsDQotICAgIEZYX0xCVF9IQU5HVUxfU1BBQ0VfQlJLCQk9IDB4NkYsDQorICBGWF9MQlRfVU5LTk9XTiA9IDB4MDAsDQorICBGWF9MQlRfRElSRUNUX0JSSyA9IDB4MUEsDQorICBGWF9MQlRfSU5ESVJFQ1RfQlJLID0gMHgyQiwNCisgIEZYX0xCVF9DT01fSU5ESVJFQ1RfQlJLID0gMHgzQywNCisgIEZYX0xCVF9DT01fUFJPSElCSVRFRF9CUksgPSAweDRELA0KKyAgRlhfTEJUX1BST0hJQklURURfQlJLID0gMHg1RSwNCisgIEZYX0xCVF9IQU5HVUxfU1BBQ0VfQlJLID0gMHg2RiwNCiB9Ow0KLSNkZWZpbmUgRlhfTEJVTglGWF9MQlRfVU5LTk9XTg0KLSNkZWZpbmUgRlhfTEJEQglGWF9MQlRfRElSRUNUX0JSSw0KLSNkZWZpbmUgRlhfTEJJQglGWF9MQlRfSU5ESVJFQ1RfQlJLDQotI2RlZmluZSBGWF9MQkNCCUZYX0xCVF9DT01fSU5ESVJFQ1RfQlJLDQotI2RlZmluZSBGWF9MQkNQCUZYX0xCVF9DT01fUFJPSElCSVRFRF9CUksNCi0jZGVmaW5lIEZYX0xCUEIJRlhfTEJUX1BST0hJQklURURfQlJLDQotI2RlZmluZSBGWF9MQkhTCUZYX0xCVF9IQU5HVUxfU1BBQ0VfQlJLDQotdm9pZAlGWF9HZXRMaW5lQnJlYWtQb3NpdGlvbnMoY29uc3QgRlhfV0NIQVIqIHB3c1RleHQsIEZYX0xJTkVCUkVBS1RZUEUgKnBCcmtUeXBlLCBpbnQzMl90IGlMZW5ndGgpOw0KLXZvaWQJRlhfR2V0TGluZUJyZWFrUG9zaXRpb25zKGNvbnN0IEZYX1dDSEFSKiBwd3NUZXh0LCBpbnQzMl90IGlMZW5ndGgsIENGWF9JbnQzMk1hc3NBcnJheSAmYnApOw0KKyNkZWZpbmUgRlhfTEJVTiBGWF9MQlRfVU5LTk9XTg0KKyNkZWZpbmUgRlhfTEJEQiBGWF9MQlRfRElSRUNUX0JSSw0KKyNkZWZpbmUgRlhfTEJJQiBGWF9MQlRfSU5ESVJFQ1RfQlJLDQorI2RlZmluZSBGWF9MQkNCIEZYX0xCVF9DT01fSU5ESVJFQ1RfQlJLDQorI2RlZmluZSBGWF9MQkNQIEZYX0xCVF9DT01fUFJPSElCSVRFRF9CUksNCisjZGVmaW5lIEZYX0xCUEIgRlhfTEJUX1BST0hJQklURURfQlJLDQorI2RlZmluZSBGWF9MQkhTIEZYX0xCVF9IQU5HVUxfU1BBQ0VfQlJLDQordm9pZCBGWF9HZXRMaW5lQnJlYWtQb3NpdGlvbnMoY29uc3QgRlhfV0NIQVIqIHB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTElORUJSRUFLVFlQRSogcEJya1R5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKTsNCit2b2lkIEZYX0dldExpbmVCcmVha1Bvc2l0aW9ucyhjb25zdCBGWF9XQ0hBUiogcHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyTWFzc0FycmF5JiBicCk7DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbGdnLmggYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sZ2cuaAppbmRleCA2ZjQ3ODZlLi45Yjk4MWZjIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sZ2cuaAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sZ2cuaApAQCAtNiwyNjIgKzYsMjYyIEBACiANCiAjaWZuZGVmIF9GWF9MQU5HVUFHRQ0KICNkZWZpbmUgX0ZYX0xBTkdVQUdFDQotI2RlZmluZSBGWF9MQU5HX05ldXRyYWwJCQkJCQkJMHgwMDAwDQotI2RlZmluZSBGWF9MQU5HX0ludmFyaWFudAkJCQkJCTB4MDA3Zg0KLSNkZWZpbmUgRlhfTEFOR19Vc2VyRGVmYXVsdAkJCQkJCTB4MDQwMA0KLSNkZWZpbmUgRlhfTEFOR19TeXN0ZW1EZWZhdWx0CQkJCQkweDA4MDANCi0jZGVmaW5lIEZYX0xBTkdfQWZyaWthYW5zX1NvdXRoQWZyaWNhCQkJMHgwNDM2DQotI2RlZmluZSBGWF9MQU5HX0FsYmFuaWFuX0FsYmFuaWEJCQkJMHgwNDFjDQotI2RlZmluZSBGWF9MQU5HX0Fsc2F0aWFuX0ZyYW5jZQkJCQkJMHgwNDg0DQotI2RlZmluZSBGWF9MQU5HX0FtaGFyaWNfRXRoaW9waWEJCQkJMHgwNDVlDQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19BbGdlcmlhCQkJCQkweDE0MDENCi0jZGVmaW5lIEZYX0xBTkdfQXJhYmljX0JhaHJhaW4JCQkJCTB4M2MwMQ0KLSNkZWZpbmUgRlhfTEFOR19BcmFiaWNfRWd5cHQJCQkJCTB4MGMwMQ0KLSNkZWZpbmUgRlhfTEFOR19BcmFiaWNfSXJhcQkJCQkJCTB4MDgwMQ0KLSNkZWZpbmUgRlhfTEFOR19BcmFiaWNfSm9yZGFuCQkJCQkweDJjMDENCi0jZGVmaW5lIEZYX0xBTkdfQXJhYmljX0t1d2FpdAkJCQkJMHgzNDAxDQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19MZWJhbm9uCQkJCQkweDMwMDENCi0jZGVmaW5lIEZYX0xBTkdfQXJhYmljX0xpYnlhCQkJCQkweDEwMDENCi0jZGVmaW5lIEZYX0xBTkdfQXJhYmljX01vcm9jY28JCQkJCTB4MTgwMQ0KLSNkZWZpbmUgRlhfTEFOR19BcmFiaWNfT21hbgkJCQkJCTB4MjAwMQ0KLSNkZWZpbmUgRlhfTEFOR19BcmFiaWNfUWF0YXIJCQkJCTB4NDAwMQ0KLSNkZWZpbmUgRlhfTEFOR19BcmFiaWNfU2F1ZGlBcmFiaWEJCQkJMHgwNDAxDQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19TeXJpYQkJCQkJMHgyODAxDQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19UdW5pc2lhCQkJCQkweDFjMDENCi0jZGVmaW5lIEZYX0xBTkdfQXJhYmljX1VBRQkJCQkJCTB4MzgwMQ0KLSNkZWZpbmUgRlhfTEFOR19BcmFiaWNfWWVtZW4JCQkJCTB4MjQwMQ0KLSNkZWZpbmUgRlhfTEFOR19Bcm1lbmlhbl9Bcm1lbmlhCQkJCTB4MDQyYg0KLSNkZWZpbmUgRlhfTEFOR19Bc3NhbWVzZV9JbmRpYQkJCQkJMHgwNDRkDQotI2RlZmluZSBGWF9MQU5HX0F6ZXJiYWlqYW5fQ3lyaWxsaWMJCQkJMHgwODJjDQotI2RlZmluZSBGWF9MQU5HX0F6ZXJiYWlqYW5fTGF0aW4JCQkJMHgwNDJjDQotI2RlZmluZSBGWF9MQU5HX0Jhc2hraXJfUnVzc2lhCQkJCQkweDA0NmQNCi0jZGVmaW5lIEZYX0xBTkdfQmFzcXVlX0Jhc3F1ZQkJCQkJMHgwNDJkDQotI2RlZmluZSBGWF9MQU5HX0JlbGFydXNpYW5fQmVsYXJ1cwkJCQkweDA0MjMNCi0jZGVmaW5lIEZYX0xBTkdfQmVuZ2FsaV9CYW5nbGFkZXNoCQkJCTB4MDg0NQ0KLSNkZWZpbmUgRlhfTEFOR19CZW5nYWxpX0luZGlhCQkJCQkweDA0NDUNCi0jZGVmaW5lIEZYX0xBTkdfQm9zbmlhX0hlcnplZ292aW5hCQkJCTB4MTAxYQ0KLSNkZWZpbmUgRlhfTEFOR19Cb3NuaWFuX0N5cmlsbGljCQkJCTB4MjAxYQ0KLSNkZWZpbmUgRlhfTEFOR19Cb3NuaWFuX0xhdGluCQkJCQkweDE0MWENCi0jZGVmaW5lIEZYX0xBTkdfQnJldG9uX0ZyYW5jZQkJCQkJMHgwNDdlDQotI2RlZmluZSBGWF9MQU5HX0J1bGdhcmlhbl9CdWxnYXJpYQkJCQkweDA0MDINCi0jZGVmaW5lIEZYX0xBTkdfQnVybWVzZQkJCQkJCQkweDA0NTUNCi0jZGVmaW5lIEZYX0xBTkdfQ2F0YWxhbl9DYXRhbGFuCQkJCQkweDA0MDMNCi0jZGVmaW5lIEZYX0xBTkdfQ2hlcm9rZWUJCQkJCQkweDA0NWMNCi0jZGVmaW5lIEZYX0xBTkdfQ2hpbmVzZV9Ib25nS29uZwkJCQkweDBjMDQNCi0jZGVmaW5lIEZYX0xBTkdfQ2hpbmVzZV9NYWNhbwkJCQkJMHgxNDA0DQotI2RlZmluZSBGWF9MQU5HX0NoaW5lc2VfUFJDCQkJCQkJMHgwODA0DQotI2RlZmluZSBGWF9MQU5HX0NoaW5lc2VfU2luZ2Fwb3JlCQkJCTB4MTAwNA0KLSNkZWZpbmUgRlhfTEFOR19DaGluZXNlX1RhaXdhbgkJCQkJMHgwNDA0DQotI2RlZmluZSBGWF9MQU5HX0NvcnNpY2FuX0ZyYW5jZQkJCQkJMHgwNDgzDQotI2RlZmluZSBGWF9MQU5HX0Nyb2F0aWFuX0Nyb2F0aWEJCQkJMHgwNDFhDQotI2RlZmluZSBGWF9MQU5HX0Nyb2F0aWFuX0xhdGluCQkJCQkweDEwMWENCi0jZGVmaW5lIEZYX0xBTkdfQ3VzdG9tQ3VycmVudAkJCQkJMHgwYzAwDQotI2RlZmluZSBGWF9MQU5HX0N6ZWNoUmVwdWJsaWMJCQkJCTB4MDQwNQ0KLSNkZWZpbmUgRlhfTEFOR19EYW5pc2hfRGVubWFyawkJCQkJMHgwNDA2DQotI2RlZmluZSBGWF9MQU5HX0RhcmlfQWZnaGFuaXN0YW4JCQkJMHgwNDhjDQotI2RlZmluZSBGWF9MQU5HX0RpdmVoaV9NYWxkaXZlcwkJCQkJMHgwNDY1DQotI2RlZmluZSBGWF9MQU5HX0R1dGNoX0JlbGdpdW0JCQkJCTB4MDgxMw0KLSNkZWZpbmUgRlhfTEFOR19EdXRjaF9OZXRoZXJsYW5kcwkJCQkweDA0MTMNCi0jZGVmaW5lIEZYX0xBTkdfRHV0Y2hfUHJlZmVycmVkCQkJCQkweDAwMTMNCi0jZGVmaW5lIEZYX0xBTkdfRHpvbmdraGEJCQkJCQkweDA4NTENCi0jZGVmaW5lIEZYX0xBTkdfRWRvCQkJCQkJCQkweDA0NjYNCi0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9BdXN0cmFsaWEJCQkJMHgwYzA5DQotI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfQmVsaXplCQkJCQkweDI4MDkNCi0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9DYW5hZGEJCQkJCTB4MTAwOQ0KLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0NhcmliYmVhbgkJCQkweDI0MDkNCi0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9Ib25nS29uZwkJCQkweDNjMDkNCi0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9JbmRpYQkJCQkJMHg0MDA5DQotI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSW5kb25lc2lhCQkJCTB4MzgwOQ0KLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0lyZWxhbmQJCQkJCTB4MTgwOQ0KLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0phbWFpY2EJCQkJCTB4MjAwOQ0KLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX01hbGF5c2lhCQkJCTB4NDQwOQ0KLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX05ld1plYWxhbmQJCQkJMHgxNDA5DQotI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfUGhpbGlwcGluZXMJCQkJMHgzNDA5DQotI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfU2luZ2Fwb3JlCQkJCTB4NDgwOQ0KLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1NvdXRoQWZyaWNhCQkJCTB4MWMwOQ0KLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1RyaW5pZGFkVG9iYWdvCQkJMHgyYzA5DQotI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfVW5pdGVkS2luZ2RvbQkJCTB4MDgwOQ0KLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1VuaXRlZFN0YXRlcwkJCTB4MDQwOQ0KLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1ppbWJhYndlCQkJCTB4MzAwOQ0KLSNkZWZpbmUgRlhfTEFOR19Fc3Rvbmlhbl9Fc3RvbmlhCQkJCTB4MDQyNQ0KLSNkZWZpbmUgRlhfTEFOR19GYXJvZXNlX0Zhcm9lSXNsYW5kcwkJCTB4MDQzOA0KLSNkZWZpbmUgRlhfTEFOR19GaWxpcGlub19QaGlsaXBwaW5lcwkJCTB4MDQ2NA0KLSNkZWZpbmUgRlhfTEFOR19GaW5uaXNoX0ZpbmxhbmQJCQkJCTB4MDQwYg0KLSNkZWZpbmUgRlhfTEFOR19GcmVuY2hfQmVsZ2l1bQkJCQkJMHgwODBjDQotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9DYW1lcm9vbgkJCQkJMHgyYzBjDQotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9DYW5hZGEJCQkJCTB4MGMwYw0KLSNkZWZpbmUgRlhfTEFOR19GcmVuY2hfQ29uZ29EUkMJCQkJCTB4MjQwYw0KLSNkZWZpbmUgRlhfTEFOR19GcmVuY2hfQ290ZWRJdm9pcmUJCQkJMHgzMDBjDQotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9GcmFuY2UJCQkJCTB4MDQwYw0KLSNkZWZpbmUgRlhfTEFOR19GcmVuY2hfSGFpdGkJCQkJCTB4M2MwYw0KLSNkZWZpbmUgRlhfTEFOR19GcmVuY2hfTHV4ZW1ib3VyZwkJCQkweDE0MGMNCi0jZGVmaW5lIEZYX0xBTkdfRnJlbmNoX01hbGkJCQkJCQkweDM0MGMNCi0jZGVmaW5lIEZYX0xBTkdfRnJlbmNoX01vbmFjbwkJCQkJMHgxODBjDQotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9Nb3JvY2NvCQkJCQkweDM4MGMNCi0jZGVmaW5lIEZYX0xBTkdfRnJlbmNoX1JldW5pb24JCQkJCTB4MjAwYw0KLSNkZWZpbmUgRlhfTEFOR19GcmVuY2hfU2VuZWdhbAkJCQkJMHgyODBjDQotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9Td2l0emVybGFuZAkJCQkweDEwMGMNCi0jZGVmaW5lIEZYX0xBTkdfRnJlbmNoX1dlc3RJbmRpZXMJCQkJMHgxYzBjDQotI2RlZmluZSBGWF9MQU5HX0ZyaXNpYW5fTmV0aGVybGFuZHMJCQkJMHgwNDYyDQotI2RlZmluZSBGWF9MQU5HX0Z1bGZ1bGRlCQkJCQkJMHgwNDY3DQotI2RlZmluZSBGWF9MQU5HX0dhZWxpY19JcmVsYW5kCQkJCQkweDA4M2MNCi0jZGVmaW5lIEZYX0xBTkdfR2FlbGljX1Njb3RsYW5kCQkJCQkweDA0M2MNCi0jZGVmaW5lIEZYX0xBTkdfR2FsaWNpYW5fR2FsaWNpYW4JCQkJMHgwNDU2DQotI2RlZmluZSBGWF9MQU5HX0dlb3JnaWFuX0dlb3JnaWEJCQkJMHgwNDM3DQotI2RlZmluZSBGWF9MQU5HX0dlcm1hbl9BdXN0cmlhCQkJCQkweDBjMDcNCi0jZGVmaW5lIEZYX0xBTkdfR2VybWFuX0dlcm1hbnkJCQkJCTB4MDQwNw0KLSNkZWZpbmUgRlhfTEFOR19HZXJtYW5fTGllY2h0ZW5zdGVpbgkJCTB4MTQwNw0KLSNkZWZpbmUgRlhfTEFOR19HZXJtYW5fTHV4ZW1ib3VyZwkJCQkweDEwMDcNCi0jZGVmaW5lIEZYX0xBTkdfR2VybWFuX1N3aXR6ZXJsYW5kCQkJCTB4MDgwNw0KLSNkZWZpbmUgRlhfTEFOR19HcmVla19HcmVlY2UJCQkJCTB4MDQwOA0KLSNkZWZpbmUgRlhfTEFOR19HcmVlbmxhbmRpY19HcmVlbmxhbmQJCQkweDA0NmYNCi0jZGVmaW5lIEZYX0xBTkdfR3VhcmFuaQkJCQkJCQkweDA0NzQNCi0jZGVmaW5lIEZYX0xBTkdfR3VqYXJhdGlfSW5kaWEJCQkJCTB4MDQ0Nw0KLSNkZWZpbmUgRlhfTEFOR19IYXVzYV9MYXRpbk5pZ2VyaWEJCQkJMHgwNDY4DQotI2RlZmluZSBGWF9MQU5HX0hhd2FpaWFuCQkJCQkJMHgwNDc1DQotI2RlZmluZSBGWF9MQU5HX0hlYnJld19Jc3JhZWwJCQkJCTB4MDQwZA0KLSNkZWZpbmUgRlhfTEFOR19IaW5kaV9JbmRpYQkJCQkJCTB4MDQzOQ0KLSNkZWZpbmUgRlhfTEFOR19IdW5nYXJpYW5fSHVuZ2FyeQkJCQkweDA0MGUNCi0jZGVmaW5lIEZYX0xBTkdfSWJpYmlvX05pZ2VyaWEJCQkJCTB4MDQ2OQ0KLSNkZWZpbmUgRlhfTEFOR19JY2VsYW5kaWNfSWNlbGFuZAkJCQkweDA0MGYNCi0jZGVmaW5lIEZYX0xBTkdfSWdib19OaWdlcmlhCQkJCQkweDA0NzANCi0jZGVmaW5lIEZYX0xBTkdfSW5kb25lc2lhbl9JbmRvbmVzaWEJCQkweDA0MjENCi0jZGVmaW5lIEZYX0xBTkdfSW51a3RpdHV0X0xhdGluQ2FuYWRhCQkJMHgwODVkDQotI2RlZmluZSBGWF9MQU5HX0ludWt0aXR1dF9TeWxsYWJpY3NDYW5hZGEJCTB4MDQ1ZA0KLSNkZWZpbmUgRlhfTEFOR19Jc2lYaG9zYV9Tb3V0aEFmcmljYQkJCTB4MDQzNA0KLSNkZWZpbmUgRlhfTEFOR19Jc2ladWx1X1NvdXRoQWZyaWNhCQkJCTB4MDQzNQ0KLSNkZWZpbmUgRlhfTEFOR19JdGFsaWFuX0l0YWx5CQkJCQkweDA0MTANCi0jZGVmaW5lIEZYX0xBTkdfSXRhbGlhbl9Td2l0emVybGFuZAkJCQkweDA4MTANCi0jZGVmaW5lIEZYX0xBTkdfSmFwYW5lc2VfSmFwYW4JCQkJCTB4MDQxMQ0KLSNkZWZpbmUgRlhfTEFOR19LYW5uYWRhX0luZGlhCQkJCQkweDA0NGINCi0jZGVmaW5lIEZYX0xBTkdfS2FudXJpCQkJCQkJCTB4MDQ3MQ0KLSNkZWZpbmUgRlhfTEFOR19LYXNobWlyaQkJCQkJCTB4MDg2MA0KLSNkZWZpbmUgRlhfTEFOR19LYXNobWlyaV9BcmFiaWMJCQkJCTB4MDQ2MA0KLSNkZWZpbmUgRlhfTEFOR19LYXpha2hfS2F6YWtoc3RhbgkJCQkweDA0M2YNCi0jZGVmaW5lIEZYX0xBTkdfS2htZXJfQ2FtYm9kaWEJCQkJCTB4MDQ1Mw0KLSNkZWZpbmUgRlhfTEFOR19LaWNoZV9HdWF0ZW1hbGEJCQkJCTB4MDQ4Ng0KLSNkZWZpbmUgRlhfTEFOR19LaW55YXJ3YW5kYV9Sd2FuZGEJCQkJMHgwNDg3DQotI2RlZmluZSBGWF9MQU5HX0tpc3dhaGlsaV9LZW55YQkJCQkJMHgwNDQxDQotI2RlZmluZSBGWF9MQU5HX0tvbmthbmlfSW5kaWEJCQkJCTB4MDQ1Nw0KLSNkZWZpbmUgRlhfTEFOR19Lb3JlYW5fS29yZWEJCQkJCTB4MDQxMg0KLSNkZWZpbmUgRlhfTEFOR19LeXJneXpfS3lyZ3l6c3RhbgkJCQkweDA0NDANCi0jZGVmaW5lIEZYX0xBTkdfTGFvX0xhb1BEUgkJCQkJCTB4MDQ1NA0KLSNkZWZpbmUgRlhfTEFOR19MYXRpbgkJCQkJCQkweDA0NzYNCi0jZGVmaW5lIEZYX0xBTkdfTGF0dmlhbl9MYXR2aWEJCQkJCTB4MDQyNg0KLSNkZWZpbmUgRlhfTEFOR19MaXRodWFuaWFuX0xpdGh1YW5pYQkJCTB4MDQyNw0KLSNkZWZpbmUgRlhfTEFOR19MaXRodWFuaWFuVHJhZAkJCQkJMHgwODI3DQotI2RlZmluZSBGWF9MQU5HX0xvd2VyIFNvcmJpYW5fR2VybWFueQkJCTB4MDgyZQ0KLSNkZWZpbmUgRlhfTEFOR19MdXhlbWJvdXJnaXNoX0x1eGVtYm91cmcJCTB4MDQ2ZQ0KLSNkZWZpbmUgRlhfTEFOR19NYWNlZG9uaWFuCQkJCQkJMHgwNDJmDQotI2RlZmluZSBGWF9MQU5HX01hbGF5X0JydW5laURhcnVzc2FsYW0JCQkweDA4M2UNCi0jZGVmaW5lIEZYX0xBTkdfTWFsYXlfTWFsYXlzaWEJCQkJCTB4MDQzZQ0KLSNkZWZpbmUgRlhfTEFOR19NYWxheWFsYW1fSW5kaWEJCQkJCTB4MDQ0Yw0KLSNkZWZpbmUgRlhfTEFOR19NYWxkaXZpYW4JCQkJCQkweDA0NjUNCi0jZGVmaW5lIEZYX0xBTkdfTWFsdGVzZV9NYWx0YQkJCQkJMHgwNDNhDQotI2RlZmluZSBGWF9MQU5HX01hbmlwdXJpCQkJCQkJMHgwNDU4DQotI2RlZmluZSBGWF9MQU5HX01hb3JpX05ld1plYWxhbmQJCQkJMHgwNDgxDQotI2RlZmluZSBGWF9MQU5HX01hcHVkdW5ndW5fQ2hpbGUJCQkJMHgwNDdhDQotI2RlZmluZSBGWF9MQU5HX01hcmF0aGlfSW5kaWEJCQkJCTB4MDQ0ZQ0KLSNkZWZpbmUgRlhfTEFOR19Nb2hhd2tfTW9oYXdrCQkJCQkweDA0N2MNCi0jZGVmaW5lIEZYX0xBTkdfTW9uZ29saWFuX0N5cmlsbGljTW9uZ29saWEJCTB4MDQ1MA0KLSNkZWZpbmUgRlhfTEFOR19Nb25nb2xpYW5fVHJhZGl0aW9uYWxNb25nb2xpYW4JMHgwODUwDQotI2RlZmluZSBGWF9MQU5HX05lcGFsaV9JbmRpYQkJCQkJMHgwODYxDQotI2RlZmluZSBGWF9MQU5HX05lcGFsaV9OZXBhbAkJCQkJMHgwNDYxDQotI2RlZmluZSBGWF9MQU5HX05vcndlZ2lhbl9Cb2ttYWwJCQkJMHgwNDE0DQotI2RlZmluZSBGWF9MQU5HX05vcndlZ2lhbl9OeW5vcnNrCQkJCTB4MDgxNA0KLSNkZWZpbmUgRlhfTEFOR19PY2NpdGFuX0ZyYW5jZQkJCQkJMHgwNDgyDQotI2RlZmluZSBGWF9MQU5HX09yaXlhX0luZGlhCQkJCQkJMHgwNDQ4DQotI2RlZmluZSBGWF9MQU5HX09yb21vCQkJCQkJCTB4MDQ3Mg0KLSNkZWZpbmUgRlhfTEFOR19QYXBpYW1lbnR1CQkJCQkJMHgwNDc5DQotI2RlZmluZSBGWF9MQU5HX1Bhc2h0b19BZmdoYW5pc3RhbgkJCQkweDA0NjMNCi0jZGVmaW5lIEZYX0xBTkdfUGVyc2lhbgkJCQkJCQkweDA0MjkNCi0jZGVmaW5lIEZYX0xBTkdfUG9saXNoX1BvbGFuZAkJCQkJMHgwNDE1DQotI2RlZmluZSBGWF9MQU5HX1BvcnR1Z3Vlc2VfQnJhemlsCQkJCTB4MDQxNg0KLSNkZWZpbmUgRlhfTEFOR19Qb3J0dWd1ZXNlX1BvcnR1Z2FsCQkJCTB4MDgxNg0KLSNkZWZpbmUgRlhfTEFOR19QdW5qYWJpX0luZGlhCQkJCQkweDA0NDYNCi0jZGVmaW5lIEZYX0xBTkdfUHVuamFiaV9QYWtpc3RhbgkJCQkweDA4NDYNCi0jZGVmaW5lIEZYX0xBTkdfUXVlY2h1YV9Cb2xpdmlhCQkJCQkweDA0NmINCi0jZGVmaW5lIEZYX0xBTkdfUXVlY2h1YV9FY3VhZG9yCQkJCQkweDA4NmINCi0jZGVmaW5lIEZYX0xBTkdfUXVlY2h1YV9QZXJ1CQkJCQkweDBjNmINCi0jZGVmaW5lIEZYX0xBTkdfUm9tYW5pYW5fTW9sZG92YQkJCQkweDA4MTgNCi0jZGVmaW5lIEZYX0xBTkdfUm9tYW5pYW5fUm9tYW5pYQkJCQkweDA0MTgNCi0jZGVmaW5lIEZYX0xBTkdfUm9tYW5zaF9Td2l0emVybGFuZAkJCQkweDA0MTcNCi0jZGVmaW5lIEZYX0xBTkdfUnVzc2lhbl9Nb2xkb3ZhCQkJCQkweDA4MTkNCi0jZGVmaW5lIEZYX0xBTkdfUnVzc2lhbl9SdXNzaWEJCQkJCTB4MDQxOQ0KLSNkZWZpbmUgRlhfTEFOR19TYW1pX0luYXJpRmlubGFuZAkJCQkweDI0M2INCi0jZGVmaW5lIEZYX0xBTkdfU2FtaV9MdWxlTm9yd2F5CQkJCQkweDEwM2INCi0jZGVmaW5lIEZYX0xBTkdfU2FtaV9MdWxlU3dlZGVuCQkJCQkweDE0M2INCi0jZGVmaW5lIEZYX0xBTkdfU2FtaV9Ob3J0aGVybkZpbmxhbmQJCQkweDBjM2INCi0jZGVmaW5lIEZYX0xBTkdfU2FtaV9Ob3J0aGVybk5vcndheQkJCQkweDA0M2INCi0jZGVmaW5lIEZYX0xBTkdfU2FtaV9Ob3J0aGVyblN3ZWRlbgkJCQkweDA4M2INCi0jZGVmaW5lIEZYX0xBTkdfU2FtaV9Ta29sdEZpbmxhbmQJCQkJMHgyMDNiDQotI2RlZmluZSBGWF9MQU5HX1NhbWlfU291dGhlcm5Ob3J3YXkJCQkJMHgxODNiDQotI2RlZmluZSBGWF9MQU5HX1NhbWlfU291dGhlcm5Td2VkZW4JCQkJMHgxYzNiDQotI2RlZmluZSBGWF9MQU5HX1NhbnNrcml0SW5kaWEJCQkJCTB4MDQ0Zg0KLSNkZWZpbmUgRlhfTEFOR19TZXJiaWFuQ3lyaWxsaWNfQm9zbmlhSGVyemVnb3ZpbmEJMHgxYzFhDQotI2RlZmluZSBGWF9MQU5HX1NlcmJpYW5DeXJpbGxpY19TZXJiaWEJCQkJMHgwYzFhDQotI2RlZmluZSBGWF9MQU5HX1NlcmJpYW5MYXRpbl9Cb3NuaWFIZXJ6ZWdvdmluYQkJMHgxODFhDQotI2RlZmluZSBGWF9MQU5HX1NlcmJpYW5MYXRpbl9TZXJiaWEJCQkJMHgwODFhDQotI2RlZmluZSBGWF9MQU5HX1Nlc290aG9TYUxlYm9hCQkJCQkweDA0NmMNCi0jZGVmaW5lIEZYX0xBTkdfU2V0c3dhbmFfU291dGhBZnJpY2EJCQkweDA0MzINCi0jZGVmaW5lIEZYX0xBTkdfU2luZGhpX0FyYWJpYwkJCQkJMHgwODU5DQotI2RlZmluZSBGWF9MQU5HX1NpbmRoaV9EZXZhbmFnYXJpCQkJCTB4MDQ1OQ0KLSNkZWZpbmUgRlhfTEFOR19TaW5oYWxhX1NyaUxhbmthCQkJCTB4MDQ1Yg0KLSNkZWZpbmUgRlhfTEFOR19TbG92YWtfU2xvdmFraWEJCQkJCTB4MDQxYg0KLSNkZWZpbmUgRlhfTEFOR19TbG92ZW5pYW5fU2xvdmVuaWEJCQkJMHgwNDI0DQotI2RlZmluZSBGWF9MQU5HX1NvbWFsaQkJCQkJCQkweDA0NzcNCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9BcmdlbnRpbmEJCQkJMHgyYzBhDQotI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQm9saXZpYQkJCQkJMHg0MDBhDQotI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQ2hpbGUJCQkJCTB4MzQwYQ0KLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0NvbG9tYmlhCQkJCTB4MjQwYQ0KLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0Nvc3RhUmljYQkJCQkweDE0MGENCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9Eb21pbmljYW5SZXB1YmxpYwkJMHgxYzBhDQotI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfRWN1YWRvcgkJCQkJMHgzMDBhDQotI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfRWxTYWx2YWRvcgkJCQkweDQ0MGENCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9HdWF0ZW1hbGEJCQkJMHgxMDBhDQotI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfSG9uZHVyYXMJCQkJMHg0ODBhDQotI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfTWV4aWNvCQkJCQkweDA4MGENCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9OaWNhcmFndWEJCQkJMHg0YzBhDQotI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfUGFuYW1hCQkJCQkweDE4MGENCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9QYXJhZ3VheQkJCQkweDNjMGENCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9QZXJ1CQkJCQkweDI4MGENCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9QdWVydG9SaWNvCQkJCTB4NTAwYQ0KLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0ludGVybmF0aW9uYWxTb3J0CQkweDBjMGENCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9UcmFkaXRpb25hbFNvcnQJCQkweDA0MGENCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9Vbml0ZWRTdGF0ZXMJCQkweDU0MGENCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9VcnVndWF5CQkJCQkweDM4MGENCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9WZW5lenVlbGEJCQkJMHgyMDBhDQotI2RlZmluZSBGWF9MQU5HX1N1dHVfU291dGhBZnJpY2EJCQkJMHgwNDMwDQotI2RlZmluZSBGWF9MQU5HX1N3ZWRpc2hfRmlubGFuZAkJCQkJMHgwODFkDQotI2RlZmluZSBGWF9MQU5HX1N3ZWRpc2hfU3dlZGVuCQkJCQkweDA0MWQNCi0jZGVmaW5lIEZYX0xBTkdfU3lyaWFjX1N5cmlhCQkJCQkweDA0NWENCi0jZGVmaW5lIEZYX0xBTkdfVGFqaWtfQ3lyaWxsaWNUYWppa2lzdGFuCQkweDA0MjgNCi0jZGVmaW5lIEZYX0xBTkdfVGFtYXppZ2h0X0FyYWJpY01vcm9jY28JCQkweDA0NWYNCi0jZGVmaW5lIEZYX0xBTkdfVGFtYXppZ2h0X0xhdGluQWxnZXJpYQkJCTB4MDg1Zg0KLSNkZWZpbmUgRlhfTEFOR19UYW1pbF9JbmRpYQkJCQkJCTB4MDQ0OQ0KLSNkZWZpbmUgRlhfTEFOR19UYXRhcl9SdXNzaWEJCQkJCTB4MDQ0NA0KLSNkZWZpbmUgRlhfTEFOR19UZWx1Z3VfSW5kaWEJCQkJCTB4MDQ0YQ0KLSNkZWZpbmUgRlhfTEFOR19UaGFpX1RoYWlsYW5kCQkJCQkweDA0MWUNCi0jZGVmaW5lIEZYX0xBTkdfVGliZXRhblBSQwkJCQkJCTB4MDQ1MQ0KLSNkZWZpbmUgRlhfTEFOR19UaWdyaWduYV9Fcml0cmVhCQkJCTB4MDg3Mw0KLSNkZWZpbmUgRlhfTEFOR19UaWdyaWduYV9FdGhpb3BpYQkJCQkweDA0NzMNCi0jZGVmaW5lIEZYX0xBTkdfVHNvbmdhCQkJCQkJCTB4MDQzMQ0KLSNkZWZpbmUgRlhfTEFOR19UdXJraXNoX1R1cmtleQkJCQkJMHgwNDFmDQotI2RlZmluZSBGWF9MQU5HX1R1cmttZW5fVHVya21lbmlzdGFuCQkJMHgwNDQyDQotI2RlZmluZSBGWF9MQU5HX1VpZ2h1clBSQwkJCQkJCTB4MDQ4MA0KLSNkZWZpbmUgRlhfTEFOR19Va3JhaW5pYW5fVWtyYWluZQkJCQkweDA0MjINCi0jZGVmaW5lIEZYX0xBTkdfVXBwZXJTb3JiaWFuX0dlcm1hbnkJCQkweDA0MmUNCi0jZGVmaW5lIEZYX0xBTkdfVXJkdV9QYWtpc3RhbgkJCQkJMHgwNDIwDQotI2RlZmluZSBGWF9MQU5HX1VyZHVfSW5kaWEJCQkJCQkweDA4MjANCi0jZGVmaW5lIEZYX0xBTkdfVXpiZWtfQ3lyaWxsaWNVemJla2lzdGFuCQkweDA4NDMNCi0jZGVmaW5lIEZYX0xBTkdfVXpiZWtfTGF0aW5VemJla2lzdGFuCQkJMHgwNDQzDQotI2RlZmluZSBGWF9MQU5HX1ZlbmRhCQkJCQkJCTB4MDQzMw0KLSNkZWZpbmUgRlhfTEFOR19WaWV0bmFtZXNlX1ZpZXRuYW0JCQkJMHgwNDJhDQotI2RlZmluZSBGWF9MQU5HX1dlbHNoX1VuaXRlZEtpbmdkb20JCQkJMHgwNDUyDQotI2RlZmluZSBGWF9MQU5HX1dvbG9mX1NlbmVnYWwJCQkJCTB4MDQ4OA0KLSNkZWZpbmUgRlhfTEFOR19YaG9zYQkJCQkJCQkweDA0MzQNCi0jZGVmaW5lIEZYX0xBTkdfWWFrdXRfUnVzc2lhCQkJCQkweDA0ODUNCi0jZGVmaW5lIEZYX0xBTkdfWWlQUkMJCQkJCQkJMHgwNDc4DQotI2RlZmluZSBGWF9MQU5HX1lpZGRpc2gJCQkJCQkJMHgwNDNkDQotI2RlZmluZSBGWF9MQU5HX1lvcnViYV9OaWdlcmlhCQkJCQkweDA0NmENCisjZGVmaW5lIEZYX0xBTkdfTmV1dHJhbCAweDAwMDANCisjZGVmaW5lIEZYX0xBTkdfSW52YXJpYW50IDB4MDA3Zg0KKyNkZWZpbmUgRlhfTEFOR19Vc2VyRGVmYXVsdCAweDA0MDANCisjZGVmaW5lIEZYX0xBTkdfU3lzdGVtRGVmYXVsdCAweDA4MDANCisjZGVmaW5lIEZYX0xBTkdfQWZyaWthYW5zX1NvdXRoQWZyaWNhIDB4MDQzNg0KKyNkZWZpbmUgRlhfTEFOR19BbGJhbmlhbl9BbGJhbmlhIDB4MDQxYw0KKyNkZWZpbmUgRlhfTEFOR19BbHNhdGlhbl9GcmFuY2UgMHgwNDg0DQorI2RlZmluZSBGWF9MQU5HX0FtaGFyaWNfRXRoaW9waWEgMHgwNDVlDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19BbGdlcmlhIDB4MTQwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfQmFocmFpbiAweDNjMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX0VneXB0IDB4MGMwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfSXJhcSAweDA4MDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX0pvcmRhbiAweDJjMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX0t1d2FpdCAweDM0MDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX0xlYmFub24gMHgzMDAxDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19MaWJ5YSAweDEwMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX01vcm9jY28gMHgxODAxDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19PbWFuIDB4MjAwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfUWF0YXIgMHg0MDAxDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19TYXVkaUFyYWJpYSAweDA0MDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX1N5cmlhIDB4MjgwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfVHVuaXNpYSAweDFjMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX1VBRSAweDM4MDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX1llbWVuIDB4MjQwMQ0KKyNkZWZpbmUgRlhfTEFOR19Bcm1lbmlhbl9Bcm1lbmlhIDB4MDQyYg0KKyNkZWZpbmUgRlhfTEFOR19Bc3NhbWVzZV9JbmRpYSAweDA0NGQNCisjZGVmaW5lIEZYX0xBTkdfQXplcmJhaWphbl9DeXJpbGxpYyAweDA4MmMNCisjZGVmaW5lIEZYX0xBTkdfQXplcmJhaWphbl9MYXRpbiAweDA0MmMNCisjZGVmaW5lIEZYX0xBTkdfQmFzaGtpcl9SdXNzaWEgMHgwNDZkDQorI2RlZmluZSBGWF9MQU5HX0Jhc3F1ZV9CYXNxdWUgMHgwNDJkDQorI2RlZmluZSBGWF9MQU5HX0JlbGFydXNpYW5fQmVsYXJ1cyAweDA0MjMNCisjZGVmaW5lIEZYX0xBTkdfQmVuZ2FsaV9CYW5nbGFkZXNoIDB4MDg0NQ0KKyNkZWZpbmUgRlhfTEFOR19CZW5nYWxpX0luZGlhIDB4MDQ0NQ0KKyNkZWZpbmUgRlhfTEFOR19Cb3NuaWFfSGVyemVnb3ZpbmEgMHgxMDFhDQorI2RlZmluZSBGWF9MQU5HX0Jvc25pYW5fQ3lyaWxsaWMgMHgyMDFhDQorI2RlZmluZSBGWF9MQU5HX0Jvc25pYW5fTGF0aW4gMHgxNDFhDQorI2RlZmluZSBGWF9MQU5HX0JyZXRvbl9GcmFuY2UgMHgwNDdlDQorI2RlZmluZSBGWF9MQU5HX0J1bGdhcmlhbl9CdWxnYXJpYSAweDA0MDINCisjZGVmaW5lIEZYX0xBTkdfQnVybWVzZSAweDA0NTUNCisjZGVmaW5lIEZYX0xBTkdfQ2F0YWxhbl9DYXRhbGFuIDB4MDQwMw0KKyNkZWZpbmUgRlhfTEFOR19DaGVyb2tlZSAweDA0NWMNCisjZGVmaW5lIEZYX0xBTkdfQ2hpbmVzZV9Ib25nS29uZyAweDBjMDQNCisjZGVmaW5lIEZYX0xBTkdfQ2hpbmVzZV9NYWNhbyAweDE0MDQNCisjZGVmaW5lIEZYX0xBTkdfQ2hpbmVzZV9QUkMgMHgwODA0DQorI2RlZmluZSBGWF9MQU5HX0NoaW5lc2VfU2luZ2Fwb3JlIDB4MTAwNA0KKyNkZWZpbmUgRlhfTEFOR19DaGluZXNlX1RhaXdhbiAweDA0MDQNCisjZGVmaW5lIEZYX0xBTkdfQ29yc2ljYW5fRnJhbmNlIDB4MDQ4Mw0KKyNkZWZpbmUgRlhfTEFOR19Dcm9hdGlhbl9Dcm9hdGlhIDB4MDQxYQ0KKyNkZWZpbmUgRlhfTEFOR19Dcm9hdGlhbl9MYXRpbiAweDEwMWENCisjZGVmaW5lIEZYX0xBTkdfQ3VzdG9tQ3VycmVudCAweDBjMDANCisjZGVmaW5lIEZYX0xBTkdfQ3plY2hSZXB1YmxpYyAweDA0MDUNCisjZGVmaW5lIEZYX0xBTkdfRGFuaXNoX0Rlbm1hcmsgMHgwNDA2DQorI2RlZmluZSBGWF9MQU5HX0RhcmlfQWZnaGFuaXN0YW4gMHgwNDhjDQorI2RlZmluZSBGWF9MQU5HX0RpdmVoaV9NYWxkaXZlcyAweDA0NjUNCisjZGVmaW5lIEZYX0xBTkdfRHV0Y2hfQmVsZ2l1bSAweDA4MTMNCisjZGVmaW5lIEZYX0xBTkdfRHV0Y2hfTmV0aGVybGFuZHMgMHgwNDEzDQorI2RlZmluZSBGWF9MQU5HX0R1dGNoX1ByZWZlcnJlZCAweDAwMTMNCisjZGVmaW5lIEZYX0xBTkdfRHpvbmdraGEgMHgwODUxDQorI2RlZmluZSBGWF9MQU5HX0VkbyAweDA0NjYNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9BdXN0cmFsaWEgMHgwYzA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfQmVsaXplIDB4MjgwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0NhbmFkYSAweDEwMDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9DYXJpYmJlYW4gMHgyNDA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSG9uZ0tvbmcgMHgzYzA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSW5kaWEgMHg0MDA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSW5kb25lc2lhIDB4MzgwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0lyZWxhbmQgMHgxODA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSmFtYWljYSAweDIwMDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9NYWxheXNpYSAweDQ0MDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9OZXdaZWFsYW5kIDB4MTQwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1BoaWxpcHBpbmVzIDB4MzQwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1NpbmdhcG9yZSAweDQ4MDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9Tb3V0aEFmcmljYSAweDFjMDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9UcmluaWRhZFRvYmFnbyAweDJjMDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9Vbml0ZWRLaW5nZG9tIDB4MDgwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1VuaXRlZFN0YXRlcyAweDA0MDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9aaW1iYWJ3ZSAweDMwMDkNCisjZGVmaW5lIEZYX0xBTkdfRXN0b25pYW5fRXN0b25pYSAweDA0MjUNCisjZGVmaW5lIEZYX0xBTkdfRmFyb2VzZV9GYXJvZUlzbGFuZHMgMHgwNDM4DQorI2RlZmluZSBGWF9MQU5HX0ZpbGlwaW5vX1BoaWxpcHBpbmVzIDB4MDQ2NA0KKyNkZWZpbmUgRlhfTEFOR19GaW5uaXNoX0ZpbmxhbmQgMHgwNDBiDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9CZWxnaXVtIDB4MDgwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfQ2FtZXJvb24gMHgyYzBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9DYW5hZGEgMHgwYzBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9Db25nb0RSQyAweDI0MGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX0NvdGVkSXZvaXJlIDB4MzAwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfRnJhbmNlIDB4MDQwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfSGFpdGkgMHgzYzBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9MdXhlbWJvdXJnIDB4MTQwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfTWFsaSAweDM0MGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX01vbmFjbyAweDE4MGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX01vcm9jY28gMHgzODBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9SZXVuaW9uIDB4MjAwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfU2VuZWdhbCAweDI4MGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX1N3aXR6ZXJsYW5kIDB4MTAwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfV2VzdEluZGllcyAweDFjMGMNCisjZGVmaW5lIEZYX0xBTkdfRnJpc2lhbl9OZXRoZXJsYW5kcyAweDA0NjINCisjZGVmaW5lIEZYX0xBTkdfRnVsZnVsZGUgMHgwNDY3DQorI2RlZmluZSBGWF9MQU5HX0dhZWxpY19JcmVsYW5kIDB4MDgzYw0KKyNkZWZpbmUgRlhfTEFOR19HYWVsaWNfU2NvdGxhbmQgMHgwNDNjDQorI2RlZmluZSBGWF9MQU5HX0dhbGljaWFuX0dhbGljaWFuIDB4MDQ1Ng0KKyNkZWZpbmUgRlhfTEFOR19HZW9yZ2lhbl9HZW9yZ2lhIDB4MDQzNw0KKyNkZWZpbmUgRlhfTEFOR19HZXJtYW5fQXVzdHJpYSAweDBjMDcNCisjZGVmaW5lIEZYX0xBTkdfR2VybWFuX0dlcm1hbnkgMHgwNDA3DQorI2RlZmluZSBGWF9MQU5HX0dlcm1hbl9MaWVjaHRlbnN0ZWluIDB4MTQwNw0KKyNkZWZpbmUgRlhfTEFOR19HZXJtYW5fTHV4ZW1ib3VyZyAweDEwMDcNCisjZGVmaW5lIEZYX0xBTkdfR2VybWFuX1N3aXR6ZXJsYW5kIDB4MDgwNw0KKyNkZWZpbmUgRlhfTEFOR19HcmVla19HcmVlY2UgMHgwNDA4DQorI2RlZmluZSBGWF9MQU5HX0dyZWVubGFuZGljX0dyZWVubGFuZCAweDA0NmYNCisjZGVmaW5lIEZYX0xBTkdfR3VhcmFuaSAweDA0NzQNCisjZGVmaW5lIEZYX0xBTkdfR3VqYXJhdGlfSW5kaWEgMHgwNDQ3DQorI2RlZmluZSBGWF9MQU5HX0hhdXNhX0xhdGluTmlnZXJpYSAweDA0NjgNCisjZGVmaW5lIEZYX0xBTkdfSGF3YWlpYW4gMHgwNDc1DQorI2RlZmluZSBGWF9MQU5HX0hlYnJld19Jc3JhZWwgMHgwNDBkDQorI2RlZmluZSBGWF9MQU5HX0hpbmRpX0luZGlhIDB4MDQzOQ0KKyNkZWZpbmUgRlhfTEFOR19IdW5nYXJpYW5fSHVuZ2FyeSAweDA0MGUNCisjZGVmaW5lIEZYX0xBTkdfSWJpYmlvX05pZ2VyaWEgMHgwNDY5DQorI2RlZmluZSBGWF9MQU5HX0ljZWxhbmRpY19JY2VsYW5kIDB4MDQwZg0KKyNkZWZpbmUgRlhfTEFOR19JZ2JvX05pZ2VyaWEgMHgwNDcwDQorI2RlZmluZSBGWF9MQU5HX0luZG9uZXNpYW5fSW5kb25lc2lhIDB4MDQyMQ0KKyNkZWZpbmUgRlhfTEFOR19JbnVrdGl0dXRfTGF0aW5DYW5hZGEgMHgwODVkDQorI2RlZmluZSBGWF9MQU5HX0ludWt0aXR1dF9TeWxsYWJpY3NDYW5hZGEgMHgwNDVkDQorI2RlZmluZSBGWF9MQU5HX0lzaVhob3NhX1NvdXRoQWZyaWNhIDB4MDQzNA0KKyNkZWZpbmUgRlhfTEFOR19Jc2ladWx1X1NvdXRoQWZyaWNhIDB4MDQzNQ0KKyNkZWZpbmUgRlhfTEFOR19JdGFsaWFuX0l0YWx5IDB4MDQxMA0KKyNkZWZpbmUgRlhfTEFOR19JdGFsaWFuX1N3aXR6ZXJsYW5kIDB4MDgxMA0KKyNkZWZpbmUgRlhfTEFOR19KYXBhbmVzZV9KYXBhbiAweDA0MTENCisjZGVmaW5lIEZYX0xBTkdfS2FubmFkYV9JbmRpYSAweDA0NGINCisjZGVmaW5lIEZYX0xBTkdfS2FudXJpIDB4MDQ3MQ0KKyNkZWZpbmUgRlhfTEFOR19LYXNobWlyaSAweDA4NjANCisjZGVmaW5lIEZYX0xBTkdfS2FzaG1pcmlfQXJhYmljIDB4MDQ2MA0KKyNkZWZpbmUgRlhfTEFOR19LYXpha2hfS2F6YWtoc3RhbiAweDA0M2YNCisjZGVmaW5lIEZYX0xBTkdfS2htZXJfQ2FtYm9kaWEgMHgwNDUzDQorI2RlZmluZSBGWF9MQU5HX0tpY2hlX0d1YXRlbWFsYSAweDA0ODYNCisjZGVmaW5lIEZYX0xBTkdfS2lueWFyd2FuZGFfUndhbmRhIDB4MDQ4Nw0KKyNkZWZpbmUgRlhfTEFOR19LaXN3YWhpbGlfS2VueWEgMHgwNDQxDQorI2RlZmluZSBGWF9MQU5HX0tvbmthbmlfSW5kaWEgMHgwNDU3DQorI2RlZmluZSBGWF9MQU5HX0tvcmVhbl9Lb3JlYSAweDA0MTINCisjZGVmaW5lIEZYX0xBTkdfS3lyZ3l6X0t5cmd5enN0YW4gMHgwNDQwDQorI2RlZmluZSBGWF9MQU5HX0xhb19MYW9QRFIgMHgwNDU0DQorI2RlZmluZSBGWF9MQU5HX0xhdGluIDB4MDQ3Ng0KKyNkZWZpbmUgRlhfTEFOR19MYXR2aWFuX0xhdHZpYSAweDA0MjYNCisjZGVmaW5lIEZYX0xBTkdfTGl0aHVhbmlhbl9MaXRodWFuaWEgMHgwNDI3DQorI2RlZmluZSBGWF9MQU5HX0xpdGh1YW5pYW5UcmFkIDB4MDgyNw0KKyNkZWZpbmUgRlhfTEFOR19Mb3dlciBTb3JiaWFuX0dlcm1hbnkgMHgwODJlDQorI2RlZmluZSBGWF9MQU5HX0x1eGVtYm91cmdpc2hfTHV4ZW1ib3VyZyAweDA0NmUNCisjZGVmaW5lIEZYX0xBTkdfTWFjZWRvbmlhbiAweDA0MmYNCisjZGVmaW5lIEZYX0xBTkdfTWFsYXlfQnJ1bmVpRGFydXNzYWxhbSAweDA4M2UNCisjZGVmaW5lIEZYX0xBTkdfTWFsYXlfTWFsYXlzaWEgMHgwNDNlDQorI2RlZmluZSBGWF9MQU5HX01hbGF5YWxhbV9JbmRpYSAweDA0NGMNCisjZGVmaW5lIEZYX0xBTkdfTWFsZGl2aWFuIDB4MDQ2NQ0KKyNkZWZpbmUgRlhfTEFOR19NYWx0ZXNlX01hbHRhIDB4MDQzYQ0KKyNkZWZpbmUgRlhfTEFOR19NYW5pcHVyaSAweDA0NTgNCisjZGVmaW5lIEZYX0xBTkdfTWFvcmlfTmV3WmVhbGFuZCAweDA0ODENCisjZGVmaW5lIEZYX0xBTkdfTWFwdWR1bmd1bl9DaGlsZSAweDA0N2ENCisjZGVmaW5lIEZYX0xBTkdfTWFyYXRoaV9JbmRpYSAweDA0NGUNCisjZGVmaW5lIEZYX0xBTkdfTW9oYXdrX01vaGF3ayAweDA0N2MNCisjZGVmaW5lIEZYX0xBTkdfTW9uZ29saWFuX0N5cmlsbGljTW9uZ29saWEgMHgwNDUwDQorI2RlZmluZSBGWF9MQU5HX01vbmdvbGlhbl9UcmFkaXRpb25hbE1vbmdvbGlhbiAweDA4NTANCisjZGVmaW5lIEZYX0xBTkdfTmVwYWxpX0luZGlhIDB4MDg2MQ0KKyNkZWZpbmUgRlhfTEFOR19OZXBhbGlfTmVwYWwgMHgwNDYxDQorI2RlZmluZSBGWF9MQU5HX05vcndlZ2lhbl9Cb2ttYWwgMHgwNDE0DQorI2RlZmluZSBGWF9MQU5HX05vcndlZ2lhbl9OeW5vcnNrIDB4MDgxNA0KKyNkZWZpbmUgRlhfTEFOR19PY2NpdGFuX0ZyYW5jZSAweDA0ODINCisjZGVmaW5lIEZYX0xBTkdfT3JpeWFfSW5kaWEgMHgwNDQ4DQorI2RlZmluZSBGWF9MQU5HX09yb21vIDB4MDQ3Mg0KKyNkZWZpbmUgRlhfTEFOR19QYXBpYW1lbnR1IDB4MDQ3OQ0KKyNkZWZpbmUgRlhfTEFOR19QYXNodG9fQWZnaGFuaXN0YW4gMHgwNDYzDQorI2RlZmluZSBGWF9MQU5HX1BlcnNpYW4gMHgwNDI5DQorI2RlZmluZSBGWF9MQU5HX1BvbGlzaF9Qb2xhbmQgMHgwNDE1DQorI2RlZmluZSBGWF9MQU5HX1BvcnR1Z3Vlc2VfQnJhemlsIDB4MDQxNg0KKyNkZWZpbmUgRlhfTEFOR19Qb3J0dWd1ZXNlX1BvcnR1Z2FsIDB4MDgxNg0KKyNkZWZpbmUgRlhfTEFOR19QdW5qYWJpX0luZGlhIDB4MDQ0Ng0KKyNkZWZpbmUgRlhfTEFOR19QdW5qYWJpX1Bha2lzdGFuIDB4MDg0Ng0KKyNkZWZpbmUgRlhfTEFOR19RdWVjaHVhX0JvbGl2aWEgMHgwNDZiDQorI2RlZmluZSBGWF9MQU5HX1F1ZWNodWFfRWN1YWRvciAweDA4NmINCisjZGVmaW5lIEZYX0xBTkdfUXVlY2h1YV9QZXJ1IDB4MGM2Yg0KKyNkZWZpbmUgRlhfTEFOR19Sb21hbmlhbl9Nb2xkb3ZhIDB4MDgxOA0KKyNkZWZpbmUgRlhfTEFOR19Sb21hbmlhbl9Sb21hbmlhIDB4MDQxOA0KKyNkZWZpbmUgRlhfTEFOR19Sb21hbnNoX1N3aXR6ZXJsYW5kIDB4MDQxNw0KKyNkZWZpbmUgRlhfTEFOR19SdXNzaWFuX01vbGRvdmEgMHgwODE5DQorI2RlZmluZSBGWF9MQU5HX1J1c3NpYW5fUnVzc2lhIDB4MDQxOQ0KKyNkZWZpbmUgRlhfTEFOR19TYW1pX0luYXJpRmlubGFuZCAweDI0M2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9MdWxlTm9yd2F5IDB4MTAzYg0KKyNkZWZpbmUgRlhfTEFOR19TYW1pX0x1bGVTd2VkZW4gMHgxNDNiDQorI2RlZmluZSBGWF9MQU5HX1NhbWlfTm9ydGhlcm5GaW5sYW5kIDB4MGMzYg0KKyNkZWZpbmUgRlhfTEFOR19TYW1pX05vcnRoZXJuTm9yd2F5IDB4MDQzYg0KKyNkZWZpbmUgRlhfTEFOR19TYW1pX05vcnRoZXJuU3dlZGVuIDB4MDgzYg0KKyNkZWZpbmUgRlhfTEFOR19TYW1pX1Nrb2x0RmlubGFuZCAweDIwM2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9Tb3V0aGVybk5vcndheSAweDE4M2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9Tb3V0aGVyblN3ZWRlbiAweDFjM2INCisjZGVmaW5lIEZYX0xBTkdfU2Fuc2tyaXRJbmRpYSAweDA0NGYNCisjZGVmaW5lIEZYX0xBTkdfU2VyYmlhbkN5cmlsbGljX0Jvc25pYUhlcnplZ292aW5hIDB4MWMxYQ0KKyNkZWZpbmUgRlhfTEFOR19TZXJiaWFuQ3lyaWxsaWNfU2VyYmlhIDB4MGMxYQ0KKyNkZWZpbmUgRlhfTEFOR19TZXJiaWFuTGF0aW5fQm9zbmlhSGVyemVnb3ZpbmEgMHgxODFhDQorI2RlZmluZSBGWF9MQU5HX1NlcmJpYW5MYXRpbl9TZXJiaWEgMHgwODFhDQorI2RlZmluZSBGWF9MQU5HX1Nlc290aG9TYUxlYm9hIDB4MDQ2Yw0KKyNkZWZpbmUgRlhfTEFOR19TZXRzd2FuYV9Tb3V0aEFmcmljYSAweDA0MzINCisjZGVmaW5lIEZYX0xBTkdfU2luZGhpX0FyYWJpYyAweDA4NTkNCisjZGVmaW5lIEZYX0xBTkdfU2luZGhpX0RldmFuYWdhcmkgMHgwNDU5DQorI2RlZmluZSBGWF9MQU5HX1NpbmhhbGFfU3JpTGFua2EgMHgwNDViDQorI2RlZmluZSBGWF9MQU5HX1Nsb3Zha19TbG92YWtpYSAweDA0MWINCisjZGVmaW5lIEZYX0xBTkdfU2xvdmVuaWFuX1Nsb3ZlbmlhIDB4MDQyNA0KKyNkZWZpbmUgRlhfTEFOR19Tb21hbGkgMHgwNDc3DQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQXJnZW50aW5hIDB4MmMwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0JvbGl2aWEgMHg0MDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQ2hpbGUgMHgzNDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQ29sb21iaWEgMHgyNDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQ29zdGFSaWNhIDB4MTQwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0RvbWluaWNhblJlcHVibGljIDB4MWMwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0VjdWFkb3IgMHgzMDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfRWxTYWx2YWRvciAweDQ0MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9HdWF0ZW1hbGEgMHgxMDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfSG9uZHVyYXMgMHg0ODBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfTWV4aWNvIDB4MDgwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX05pY2FyYWd1YSAweDRjMGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9QYW5hbWEgMHgxODBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfUGFyYWd1YXkgMHgzYzBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfUGVydSAweDI4MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9QdWVydG9SaWNvIDB4NTAwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0ludGVybmF0aW9uYWxTb3J0IDB4MGMwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX1RyYWRpdGlvbmFsU29ydCAweDA0MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9Vbml0ZWRTdGF0ZXMgMHg1NDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfVXJ1Z3VheSAweDM4MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9WZW5lenVlbGEgMHgyMDBhDQorI2RlZmluZSBGWF9MQU5HX1N1dHVfU291dGhBZnJpY2EgMHgwNDMwDQorI2RlZmluZSBGWF9MQU5HX1N3ZWRpc2hfRmlubGFuZCAweDA4MWQNCisjZGVmaW5lIEZYX0xBTkdfU3dlZGlzaF9Td2VkZW4gMHgwNDFkDQorI2RlZmluZSBGWF9MQU5HX1N5cmlhY19TeXJpYSAweDA0NWENCisjZGVmaW5lIEZYX0xBTkdfVGFqaWtfQ3lyaWxsaWNUYWppa2lzdGFuIDB4MDQyOA0KKyNkZWZpbmUgRlhfTEFOR19UYW1hemlnaHRfQXJhYmljTW9yb2NjbyAweDA0NWYNCisjZGVmaW5lIEZYX0xBTkdfVGFtYXppZ2h0X0xhdGluQWxnZXJpYSAweDA4NWYNCisjZGVmaW5lIEZYX0xBTkdfVGFtaWxfSW5kaWEgMHgwNDQ5DQorI2RlZmluZSBGWF9MQU5HX1RhdGFyX1J1c3NpYSAweDA0NDQNCisjZGVmaW5lIEZYX0xBTkdfVGVsdWd1X0luZGlhIDB4MDQ0YQ0KKyNkZWZpbmUgRlhfTEFOR19UaGFpX1RoYWlsYW5kIDB4MDQxZQ0KKyNkZWZpbmUgRlhfTEFOR19UaWJldGFuUFJDIDB4MDQ1MQ0KKyNkZWZpbmUgRlhfTEFOR19UaWdyaWduYV9Fcml0cmVhIDB4MDg3Mw0KKyNkZWZpbmUgRlhfTEFOR19UaWdyaWduYV9FdGhpb3BpYSAweDA0NzMNCisjZGVmaW5lIEZYX0xBTkdfVHNvbmdhIDB4MDQzMQ0KKyNkZWZpbmUgRlhfTEFOR19UdXJraXNoX1R1cmtleSAweDA0MWYNCisjZGVmaW5lIEZYX0xBTkdfVHVya21lbl9UdXJrbWVuaXN0YW4gMHgwNDQyDQorI2RlZmluZSBGWF9MQU5HX1VpZ2h1clBSQyAweDA0ODANCisjZGVmaW5lIEZYX0xBTkdfVWtyYWluaWFuX1VrcmFpbmUgMHgwNDIyDQorI2RlZmluZSBGWF9MQU5HX1VwcGVyU29yYmlhbl9HZXJtYW55IDB4MDQyZQ0KKyNkZWZpbmUgRlhfTEFOR19VcmR1X1Bha2lzdGFuIDB4MDQyMA0KKyNkZWZpbmUgRlhfTEFOR19VcmR1X0luZGlhIDB4MDgyMA0KKyNkZWZpbmUgRlhfTEFOR19VemJla19DeXJpbGxpY1V6YmVraXN0YW4gMHgwODQzDQorI2RlZmluZSBGWF9MQU5HX1V6YmVrX0xhdGluVXpiZWtpc3RhbiAweDA0NDMNCisjZGVmaW5lIEZYX0xBTkdfVmVuZGEgMHgwNDMzDQorI2RlZmluZSBGWF9MQU5HX1ZpZXRuYW1lc2VfVmlldG5hbSAweDA0MmENCisjZGVmaW5lIEZYX0xBTkdfV2Vsc2hfVW5pdGVkS2luZ2RvbSAweDA0NTINCisjZGVmaW5lIEZYX0xBTkdfV29sb2ZfU2VuZWdhbCAweDA0ODgNCisjZGVmaW5lIEZYX0xBTkdfWGhvc2EgMHgwNDM0DQorI2RlZmluZSBGWF9MQU5HX1lha3V0X1J1c3NpYSAweDA0ODUNCisjZGVmaW5lIEZYX0xBTkdfWWlQUkMgMHgwNDc4DQorI2RlZmluZSBGWF9MQU5HX1lpZGRpc2ggMHgwNDNkDQorI2RlZmluZSBGWF9MQU5HX1lvcnViYV9OaWdlcmlhIDB4MDQ2YQ0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xvY2FsZS5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbG9jYWxlLmgKaW5kZXggMDI1ODE0Yy4uMTdhMmY5MSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbG9jYWxlLmgKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbG9jYWxlLmgKQEAgLTExLDE1NCArMTEsMTkzIEBACiBjbGFzcyBJRlhfRm9ybWF0U3RyaW5nOw0KIGNsYXNzIElGWF9Mb2NhbGVNZ3I7DQogZW51bSBGWF9MT0NBTEVOVU1TWU1CT0wgew0KLSAgICBGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwNCi0gICAgRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLA0KLSAgICBGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwNCi0gICAgRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLA0KLSAgICBGWF9MT0NBTEVOVU1TWU1CT0xfWmVybywNCi0gICAgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLA0KLSAgICBGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lOYW1lLA0KKyAgRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsDQorICBGWF9MT0NBTEVOVU1TWU1CT0xfR3JvdXBpbmcsDQorICBGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwNCisgIEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywNCisgIEZYX0xPQ0FMRU5VTVNZTUJPTF9aZXJvLA0KKyAgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLA0KKyAgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5TmFtZSwNCiB9Ow0KIGVudW0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSB7DQotICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdCwNCi0gICAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCwNCi0gICAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW0sDQotICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbCwNCi0gICAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nLA0KKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LA0KKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCwNCisgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtLA0KKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsLA0KKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nLA0KIH07DQogZW51bSBGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSB7DQotICAgIEZYX0xPQ0FMRU5VTVBBVFRFUk5fUGVyY2VudCwNCi0gICAgRlhfTE9DQUxFTlVNUEFUVEVSTl9DdXJyZW5jeSwNCi0gICAgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsLA0KLSAgICBGWF9MT0NBTEVOVU1QQVRURVJOX0ludGVnZXIsDQorICBGWF9MT0NBTEVOVU1QQVRURVJOX1BlcmNlbnQsDQorICBGWF9MT0NBTEVOVU1QQVRURVJOX0N1cnJlbmN5LA0KKyAgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsLA0KKyAgRlhfTE9DQUxFTlVNUEFUVEVSTl9JbnRlZ2VyLA0KIH07DQogZW51bSBGWF9MT0NBTEVDQVRFR09SWSB7DQotICAgIEZYX0xPQ0FMRUNBVEVHT1JZX1Vua25vd24sDQotICAgIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUsDQotICAgIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWUsDQotICAgIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lLA0KLSAgICBGWF9MT0NBTEVDQVRFR09SWV9OdW0sDQotICAgIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQsDQotICAgIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm8sDQotICAgIEZYX0xPQ0FMRUNBVEVHT1JZX051bGwsDQorICBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duLA0KKyAgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZSwNCisgIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWUsDQorICBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZSwNCisgIEZYX0xPQ0FMRUNBVEVHT1JZX051bSwNCisgIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQsDQorICBGWF9MT0NBTEVDQVRFR09SWV9aZXJvLA0KKyAgRlhfTE9DQUxFQ0FURUdPUllfTnVsbCwNCiB9Ow0KIGVudW0gRlhfREFURVRJTUVUWVBFIHsNCi0gICAgRlhfREFURVRJTUVUWVBFX1Vua25vd24sDQotICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlLA0KLSAgICBGWF9EQVRFVElNRVRZUEVfVGltZSwNCi0gICAgRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lLA0KLSAgICBGWF9EQVRFVElNRVRZUEVfVGltZURhdGUsDQorICBGWF9EQVRFVElNRVRZUEVfVW5rbm93biwNCisgIEZYX0RBVEVUSU1FVFlQRV9EYXRlLA0KKyAgRlhfREFURVRJTUVUWVBFX1RpbWUsDQorICBGWF9EQVRFVElNRVRZUEVfRGF0ZVRpbWUsDQorICBGWF9EQVRFVElNRVRZUEVfVGltZURhdGUsDQogfTsNCiANCi1jbGFzcyBJRlhfTG9jYWxlDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGWF9Mb2NhbGUqIENyZWF0ZShDWE1MX0VsZW1lbnQqIHBMb2NhbGVEYXRhKTsNCitjbGFzcyBJRlhfTG9jYWxlIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGWF9Mb2NhbGUqIENyZWF0ZShDWE1MX0VsZW1lbnQqIHBMb2NhbGVEYXRhKTsNCiANCi0gICAgdmlydHVhbCB+SUZYX0xvY2FsZSgpIHt9DQotICAgIHZpcnR1YWwgdm9pZAlSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB+SUZYX0xvY2FsZSgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCiANCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXROYW1lKCkgPSAwOw0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXROYW1lKCkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJR2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NOdW1TeW1ib2wpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCUdldERhdGVUaW1lU3ltYm9scyhDRlhfV2lkZVN0cmluZyYgd3NEdFN5bWJvbCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJR2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLCBDRlhfV2lkZVN0cmluZyYgd3NNb250aE5hbWUsIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAlHZXREYXlOYW1lKGludDMyX3QgbldlZWssIENGWF9XaWRlU3RyaW5nJiB3c0RheU5hbWUsIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAlHZXRNZXJpZGllbU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVyaWRpZW1OYW1lLCBGWF9CT09MIGJBTSA9IFRSVUUpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCUdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJR2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLCBGWF9CT09MIGJBRCA9IFRSVUUpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCUdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCUdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCUdldE51bVBhdHRlcm4oRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NNb250aE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGF5TmFtZShpbnQzMl90IG5XZWVrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQU0gPSBUUlVFKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQUQgPSBUUlVFKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0ID0gMDsNCiB9Ow0KIA0KLWNsYXNzIElGWF9Mb2NhbGVNZ3INCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JRlhfTG9jYWxlTWdyKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9XT1JECQkJR2V0RGVmTG9jYWxlSUQoKSA9IDA7DQotICAgIHZpcnR1YWwgSUZYX0xvY2FsZSogCUdldERlZkxvY2FsZSgpID0gMDsNCi0gICAgdmlydHVhbCBJRlhfTG9jYWxlKiAJR2V0TG9jYWxlKEZYX1dPUkQgbGNpZCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9Mb2NhbGUqIAlHZXRMb2NhbGVCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xvY2FsZU5hbWUpID0gMDsNCitjbGFzcyBJRlhfTG9jYWxlTWdyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZYX0xvY2FsZU1ncigpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfV09SRCBHZXREZWZMb2NhbGVJRCgpID0gMDsNCisgIHZpcnR1YWwgSUZYX0xvY2FsZSogR2V0RGVmTG9jYWxlKCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfTG9jYWxlKiBHZXRMb2NhbGUoRlhfV09SRCBsY2lkKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Mb2NhbGUqIEdldExvY2FsZUJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTG9jYWxlTmFtZSkgPSAwOw0KIH07DQotSUZYX0xvY2FsZU1ncioJRlhfTG9jYWxlTWdyX0NyZWF0ZShjb25zdCBGWF9XQ0hBUiogcHN6TG9jYWxQYXRoLCBGWF9XT1JEIHdEZWZhdWx0TENJRCk7DQotdm9pZAkJCUZYX1BhcnNlTnVtU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c051bSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzdWx0KTsNCi1GWF9CT09MCQkJRlhfRGF0ZUZyb21DYW5vbmljYWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lKTsNCi1GWF9CT09MCQkJRlhfVGltZUZyb21DYW5vbmljYWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpbWUsIENGWF9Vbml0aW1lJiBkYXRldGltZSwgSUZYX0xvY2FsZSogcExvY2FsZSk7DQotY2xhc3MgSUZYX0Zvcm1hdFN0cmluZw0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJRlhfRm9ybWF0U3RyaW5nKiBDcmVhdGUoSUZYX0xvY2FsZU1nciogcExvY2FsZU1nciwgRlhfQk9PTCBiVXNlTENJRCk7DQorSUZYX0xvY2FsZU1nciogRlhfTG9jYWxlTWdyX0NyZWF0ZShjb25zdCBGWF9XQ0hBUiogcHN6TG9jYWxQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3RGVmYXVsdExDSUQpOw0KK3ZvaWQgRlhfUGFyc2VOdW1TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtLCBDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQpOw0KK0ZYX0JPT0wgRlhfRGF0ZUZyb21DYW5vbmljYWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiBkYXRldGltZSk7DQorRlhfQk9PTCBGWF9UaW1lRnJvbUNhbm9uaWNhbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiBkYXRldGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpOw0KK2NsYXNzIElGWF9Gb3JtYXRTdHJpbmcgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZYX0Zvcm1hdFN0cmluZyogQ3JlYXRlKElGWF9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IsIEZYX0JPT0wgYlVzZUxDSUQpOw0KIA0KLSAgICB2aXJ0dWFsIH5JRlhfRm9ybWF0U3RyaW5nKCkge30NCi0gICAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZCBTcGxpdEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXRTdHJpbmcsIENGWF9XaWRlU3RyaW5nQXJyYXkmIHdzUGF0dGVybnMpID0gMDsNCi0gICAgdmlydHVhbCBGWF9MT0NBTEVDQVRFR09SWQlHZXRDYXRlZ29yeShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfV09SRAkJCQlHZXRMQ0lEKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pID0gMDsNCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJR2V0TG9jYWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlQYXJzZVRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCVBhcnNlTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgRlhfRkxPQVQgJmZWYWx1ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJUGFyc2VOdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJUGFyc2VEYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgRlhfREFURVRJTUVUWVBFIGVEYXRlVGltZVR5cGUsIENGWF9Vbml0aW1lJiBkdFZhbHVlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZVplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VOdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCUZvcm1hdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlGb3JtYXROdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCUZvcm1hdE51bShGWF9GTE9BVCBmTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCUZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCUZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQsIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlGb3JtYXREYXRlVGltZShjb25zdCBDRlhfVW5pdGltZSYgZHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgRm9ybWF0WmVybyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MIEZvcm1hdE51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSA9IDA7DQorICB2aXJ0dWFsIH5JRlhfRm9ybWF0U3RyaW5nKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNwbGl0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5JiB3c1BhdHRlcm5zKSA9IDA7DQorICB2aXJ0dWFsIEZYX0xPQ0FMRUNBVEVHT1JZIEdldENhdGVnb3J5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pID0gMDsNCisgIHZpcnR1YWwgRlhfV09SRCBHZXRMQ0lEKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pID0gMDsNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0TG9jYWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VOdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZWYWx1ZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFBhcnNlTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY051bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VEYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiBkdFZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VaZXJvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZU51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGb3JtYXROdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGb3JtYXROdW0oRlhfRkxPQVQgZk51bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGb3JtYXREYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdFplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdE51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgPSAwOw0KIH07DQotY2xhc3MgQ0ZYX0RlY2ltYWwNCi17DQotcHVibGljOg0KLSAgICBDRlhfRGVjaW1hbCgpOw0KLSAgICBDRlhfRGVjaW1hbCh1aW50MzJfdCB2YWwpOw0KLSAgICBDRlhfRGVjaW1hbCh1aW50NjRfdCB2YWwpOw0KLSAgICBDRlhfRGVjaW1hbChpbnQzMl90IHZhbCk7DQotICAgIENGWF9EZWNpbWFsKGludDY0X3QgdmFsKTsNCi0gICAgQ0ZYX0RlY2ltYWwoRlhfRkxPQVQgdmFsLCB1aW50OF90IHNjYWxlID0gMyk7DQotICAgIENGWF9EZWNpbWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKTsNCi0gICAgQ0ZYX0RlY2ltYWwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOw0KLSAgICBvcGVyYXRvciBDRlhfV2lkZVN0cmluZygpIGNvbnN0Ow0KLSAgICBvcGVyYXRvciBkb3VibGUoKSBjb25zdDsNCi0gICAgRlhfQk9PTCBvcGVyYXRvciA9PSAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQotICAgIEZYX0JPT0wgb3BlcmF0b3IgPD0gKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KLSAgICBGWF9CT09MIG9wZXJhdG9yID49IChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCi0gICAgRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQotICAgIEZYX0JPT0wgb3BlcmF0b3IgPCAgKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KLSAgICBGWF9CT09MIG9wZXJhdG9yID4gIChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCi0gICAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3IgKyAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQotICAgIENGWF9EZWNpbWFsIG9wZXJhdG9yIC0gKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KLSAgICBDRlhfRGVjaW1hbCBvcGVyYXRvciAqIChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCi0gICAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3IgLyAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQotICAgIENGWF9EZWNpbWFsIG9wZXJhdG9yICUgKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KLSAgICB2b2lkCQlTZXRTY2FsZSh1aW50OF90IG5ld1NjYWxlKTsNCi0gICAgdWludDhfdAlHZXRTY2FsZSgpOw0KLSAgICB2b2lkCQlTZXRBYnMoKTsNCi0gICAgdm9pZAkJU2V0TmVnYXRlKCk7DQotICAgIHZvaWQJCVNldEZsb29yKCk7DQotICAgIHZvaWQJCVNldENlaWxpbmcoKTsNCi0gICAgdm9pZAkJU2V0VHJ1bmNhdGUoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGWF9EZWNpbWFsKHVpbnQzMl90IGhpLCB1aW50MzJfdCBtaWQsIHVpbnQzMl90IGxvLCBGWF9CT09MIG5lZywgdWludDhfdCBzY2FsZSk7DQotICAgIGlubGluZSBGWF9CT09MCUlzTm90WmVybygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3VIaSB8fCBtX3VNaWQgfHwgbV91TG87DQotICAgIH0NCi0gICAgaW5saW5lIGludDhfdAlDb21wYXJlIChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCi0gICAgaW5saW5lIHZvaWQJCVN3YXAoQ0ZYX0RlY2ltYWwmIHZhbCk7DQotICAgIGlubGluZSB2b2lkCQlGbG9vck9yQ2VpbChGWF9CT09MIGJGbG9vcik7DQotICAgIENGWF9EZWNpbWFsCQlBZGRPck1pbnVzKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwsIEZYX0JPT0wgaXNBZGRpbmcpIGNvbnN0Ow0KLSAgICBDRlhfRGVjaW1hbAkJTXVsdGlwbHkoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQotICAgIENGWF9EZWNpbWFsCQlEaXZpZGUoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQotICAgIENGWF9EZWNpbWFsCQlNb2R1bHVzKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KLSAgICB1aW50MzJfdAkJbV91RmxhZ3M7DQotICAgIHVpbnQzMl90CQltX3VIaTsNCi0gICAgdWludDMyX3QJCW1fdUxvOw0KLSAgICB1aW50MzJfdAkJbV91TWlkOw0KK2NsYXNzIENGWF9EZWNpbWFsIHsNCisgcHVibGljOg0KKyAgQ0ZYX0RlY2ltYWwoKTsNCisgIENGWF9EZWNpbWFsKHVpbnQzMl90IHZhbCk7DQorICBDRlhfRGVjaW1hbCh1aW50NjRfdCB2YWwpOw0KKyAgQ0ZYX0RlY2ltYWwoaW50MzJfdCB2YWwpOw0KKyAgQ0ZYX0RlY2ltYWwoaW50NjRfdCB2YWwpOw0KKyAgQ0ZYX0RlY2ltYWwoRlhfRkxPQVQgdmFsLCB1aW50OF90IHNjYWxlID0gMyk7DQorICBDRlhfRGVjaW1hbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cik7DQorICBDRlhfRGVjaW1hbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7DQorICBvcGVyYXRvciBDRlhfV2lkZVN0cmluZygpIGNvbnN0Ow0KKyAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3Q7DQorICBGWF9CT09MIG9wZXJhdG9yPT0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBGWF9CT09MIG9wZXJhdG9yPD0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBGWF9CT09MIG9wZXJhdG9yPj0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBGWF9CT09MIG9wZXJhdG9yPChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgIEZYX0JPT0wgb3BlcmF0b3I+KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3IrKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3ItKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3IqKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3IvKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3IlKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgdm9pZCBTZXRTY2FsZSh1aW50OF90IG5ld1NjYWxlKTsNCisgIHVpbnQ4X3QgR2V0U2NhbGUoKTsNCisgIHZvaWQgU2V0QWJzKCk7DQorICB2b2lkIFNldE5lZ2F0ZSgpOw0KKyAgdm9pZCBTZXRGbG9vcigpOw0KKyAgdm9pZCBTZXRDZWlsaW5nKCk7DQorICB2b2lkIFNldFRydW5jYXRlKCk7DQorDQorIHByb3RlY3RlZDoNCisgIENGWF9EZWNpbWFsKHVpbnQzMl90IGhpLA0KKyAgICAgICAgICAgICAgdWludDMyX3QgbWlkLA0KKyAgICAgICAgICAgICAgdWludDMyX3QgbG8sDQorICAgICAgICAgICAgICBGWF9CT09MIG5lZywNCisgICAgICAgICAgICAgIHVpbnQ4X3Qgc2NhbGUpOw0KKyAgaW5saW5lIEZYX0JPT0wgSXNOb3RaZXJvKCkgY29uc3QgeyByZXR1cm4gbV91SGkgfHwgbV91TWlkIHx8IG1fdUxvOyB9DQorICBpbmxpbmUgaW50OF90IENvbXBhcmUoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBpbmxpbmUgdm9pZCBTd2FwKENGWF9EZWNpbWFsJiB2YWwpOw0KKyAgaW5saW5lIHZvaWQgRmxvb3JPckNlaWwoRlhfQk9PTCBiRmxvb3IpOw0KKyAgQ0ZYX0RlY2ltYWwgQWRkT3JNaW51cyhjb25zdCBDRlhfRGVjaW1hbCYgdmFsLCBGWF9CT09MIGlzQWRkaW5nKSBjb25zdDsNCisgIENGWF9EZWNpbWFsIE11bHRpcGx5KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgQ0ZYX0RlY2ltYWwgRGl2aWRlKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgQ0ZYX0RlY2ltYWwgTW9kdWx1cyhjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgIHVpbnQzMl90IG1fdUZsYWdzOw0KKyAgdWludDMyX3QgbV91SGk7DQorICB1aW50MzJfdCBtX3VMbzsNCisgIHVpbnQzMl90IG1fdU1pZDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X21lbS5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbWVtLmgKaW5kZXggNmMwZTFmYS4uZmU1MjQ4OSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbWVtLmgKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbWVtLmgKQEAgLTksNTIgKzksNDUgQEAKIGNsYXNzIElGWF9NRU1BbGxvY2F0b3I7DQogY2xhc3MgQ0ZYX1RhcmdldDsNCiBlbnVtIEZYX0FMTE9DVFlQRSB7DQotICAgIEZYX0FMTE9DVFlQRV9EZWZhdWx0CQk9ICAwLA0KLSAgICBGWF9BTExPQ1RZUEVfU3RhdGljCQkJCSwNCi0gICAgRlhfQUxMT0NUWVBFX0ZpeGVkCQkJCSwNCi0gICAgRlhfQUxMT0NUWVBFX0R5bmFtaWMJCQksDQorICBGWF9BTExPQ1RZUEVfRGVmYXVsdCA9IDAsDQorICBGWF9BTExPQ1RZUEVfU3RhdGljLA0KKyAgRlhfQUxMT0NUWVBFX0ZpeGVkLA0KKyAgRlhfQUxMT0NUWVBFX0R5bmFtaWMsDQogfTsNCiANCi1jbGFzcyBJRlhfTUVNQWxsb2NhdG9yDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZYX01FTUFsbG9jYXRvcigpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZCoJCQlBbGxvYyhzaXplX3Qgc2l6ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlGcmVlKHZvaWQgKnBCbG9jaykgPSAwOw0KLSAgICB2aXJ0dWFsIHNpemVfdAkJCUdldEJsb2NrU2l6ZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBzaXplX3QJCQlHZXREZWZDaHVua1NpemUoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgc2l6ZV90CQkJU2V0RGVmQ2h1bmtTaXplKHNpemVfdCBzaXplKSA9IDA7DQotICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0Q3VycmVudERhdGFTaXplKCkgY29uc3QgPSAwOw0KK2NsYXNzIElGWF9NRU1BbGxvY2F0b3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRlhfTUVNQWxsb2NhdG9yKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkKiBBbGxvYyhzaXplX3Qgc2l6ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEZyZWUodm9pZCogcEJsb2NrKSA9IDA7DQorICB2aXJ0dWFsIHNpemVfdCBHZXRCbG9ja1NpemUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHNpemVfdCBHZXREZWZDaHVua1NpemUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHNpemVfdCBTZXREZWZDaHVua1NpemUoc2l6ZV90IHNpemUpID0gMDsNCisgIHZpcnR1YWwgc2l6ZV90IEdldEN1cnJlbnREYXRhU2l6ZSgpIGNvbnN0ID0gMDsNCiB9Ow0KIA0KLUlGWF9NRU1BbGxvY2F0b3IqCUZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEUgZVR5cGUsIHNpemVfdCBjaHVua1NpemUsIHNpemVfdCBibG9ja1NpemUpOw0KLWNsYXNzIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5DRlhfVGFyZ2V0KCkge30NCi0gICAgdm9pZCoJb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7DQotICAgIH0NCi0gICAgdm9pZAlvcGVyYXRvciBkZWxldGUodm9pZCAqcCkNCi0gICAgew0KLSAgICAgICAgRlhfRnJlZShwKTsNCi0gICAgfQ0KLSAgICB2b2lkKglvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIElGWF9NRU1BbGxvY2F0b3IgKnBBbGxvY2F0b3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwQWxsb2NhdG9yLT5BbGxvYyhzaXplKTsNCi0gICAgfQ0KLSAgICB2b2lkCW9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwLCBJRlhfTUVNQWxsb2NhdG9yICpwQWxsb2NhdG9yKQ0KLSAgICB7DQotICAgICAgICBwQWxsb2NhdG9yLT5GcmVlKHApOw0KLSAgICB9DQotICAgIHZvaWQqCW9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgdm9pZCAqcGxhY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwbGFjZTsNCi0gICAgfQ0KLSAgICB2b2lkCW9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwLCB2b2lkICpwbGFjZSkJe30NCitJRlhfTUVNQWxsb2NhdG9yKiBGWF9DcmVhdGVBbGxvY2F0b3IoRlhfQUxMT0NUWVBFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY2h1bmtTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYmxvY2tTaXplKTsNCitjbGFzcyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+Q0ZYX1RhcmdldCgpIHt9DQorICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpIHsgcmV0dXJuIEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOyB9DQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwKSB7IEZYX0ZyZWUocCk7IH0NCisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgSUZYX01FTUFsbG9jYXRvciogcEFsbG9jYXRvcikgew0KKyAgICByZXR1cm4gcEFsbG9jYXRvci0+QWxsb2Moc2l6ZSk7DQorICB9DQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwLCBJRlhfTUVNQWxsb2NhdG9yKiBwQWxsb2NhdG9yKSB7DQorICAgIHBBbGxvY2F0b3ItPkZyZWUocCk7DQorICB9DQorICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIHZvaWQqIHBsYWNlKSB7IHJldHVybiBwbGFjZTsgfQ0KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCogcCwgdm9pZCogcGxhY2UpIHt9DQogfTsNCi0jZGVmaW5lIEZYVEFSR0VUX05ld1dpdGgoX19hbGxvY2F0b3JfXykJCQkJCQkJbmV3KF9fYWxsb2NhdG9yX18pDQotI2RlZmluZSBGWFRBUkdFVF9EZWxldGVXaXRoKF9fY2xhc3NfXywgX19hbGxvY2F0b3JfXywgcG9pbnRlcikJeyhwb2ludGVyKS0+fl9fY2xhc3NfXygpOyAocG9pbnRlciktPm9wZXJhdG9yIGRlbGV0ZSgocG9pbnRlciksIChfX2FsbG9jYXRvcl9fKSk7fQ0KKyNkZWZpbmUgRlhUQVJHRVRfTmV3V2l0aChfX2FsbG9jYXRvcl9fKSBuZXcgKF9fYWxsb2NhdG9yX18pDQorI2RlZmluZSBGWFRBUkdFVF9EZWxldGVXaXRoKF9fY2xhc3NfXywgX19hbGxvY2F0b3JfXywgcG9pbnRlcikgXA0KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgKHBvaW50ZXIpLT5+X19jbGFzc19fKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIChwb2ludGVyKS0+b3BlcmF0b3IgZGVsZXRlKChwb2ludGVyKSwgKF9fYWxsb2NhdG9yX18pKTsgICAgXA0KKyAgfQ0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Jiay5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfcmJrLmgKaW5kZXggYTg1NDRiMC4uOWE0NzUxNCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfcmJrLmgKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfcmJrLmgKQEAgLTEyLDIyNSArMTIsMjE3IEBACiBjbGFzcyBDRlhfUlRGQ2hhcjsNCiBjbGFzcyBDRlhfUlRGQnJlYWtQaWVjZTsNCiBjbGFzcyBJRlhfUlRGQnJlYWs7DQotI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9Ob25lCQkJCQkweDAwDQotI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9TcGFjZUJyZWFrCQkJMHgwMQ0KLSNkZWZpbmUgRlhfUlRGQlJFQUtQT0xJQ1lfTnVtYmVyQnJlYWsJCQkweDAyDQotI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9JbmZpeEJyZWFrCQkJMHgwNA0KLSNkZWZpbmUgRlhfUlRGQlJFQUtQT0xJQ1lfVGFiQnJlYWsJCQkJMHgwOA0KLSNkZWZpbmUgRlhfUlRGQlJFQUtQT0xJQ1lfT3JwaGFuUG9zaXRpb25lZFRhYgkweDEwDQotI2RlZmluZSBGWF9SVEZCUkVBS19Ob25lCQkJCQkJMHgwMA0KLSNkZWZpbmUgRlhfUlRGQlJFQUtfUGllY2VCcmVhawkJCQkJMHgwMQ0KLSNkZWZpbmUgRlhfUlRGQlJFQUtfTGluZUJyZWFrCQkJCQkweDAyDQotI2RlZmluZSBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhawkJCQkweDAzDQotI2RlZmluZSBGWF9SVEZCUkVBS19QYWdlQnJlYWsJCQkJCTB4MDQNCi0jZGVmaW5lIEZYX1JURkxBWU9VVFNUWUxFX1BhZ2luYXRpb24JCQkweDAxDQotI2RlZmluZSBGWF9SVEZMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dAkJMHgwMg0KLSNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycwkJCTB4MDQNCi0jZGVmaW5lIEZYX1JURkxBWU9VVFNUWUxFX0xpbmVEaXJlY3Rpb24JCQkweDA4DQotI2RlZmluZSBGWF9SVEZMQVlPVVRTVFlMRV9FeHBhbmRUYWIJCQkJMHgxMA0KLSNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfQXJhYmljTnVtYmVyCQkJMHgyMA0KLSNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfU2luZ2xlTGluZQkJCTB4NDANCi0jZGVmaW5lIEZYX1JURkxBWU9VVFNUWUxFX01CQ1NDb2RlCQkJCTB4ODANCi0jZGVmaW5lIEZYX1JURkNIQVJTVFlMRV9BbGlnbm1lbnQJCQkJMHgwMDBGDQotI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfQXJhYmljTnVtYmVyCQkJMHgwMDEwDQotI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfQXJhYmljU2hhZGRhCQkJMHgwMDIwDQotI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfT2RkQmlkaUxldmVsCQkJMHgwMDQwDQotI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfUlRMUmVhZGluZ09yZGVyCQkJMHgwMDgwDQotI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfQXJhYmljQ29udGV4dAkJCTB4MDMwMA0KLSNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX0FyYWJpY0luZGljCQkJCTB4MDQwMA0KLSNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX0FyYWJpY0NvbW1hCQkJCTB4MDgwMA0KLSNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0CQkJCTANCi0jZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfQ2VudGVyCQkJCTENCi0jZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfUmlnaHQJCQkJMg0KLSNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9KdXN0aWZpZWQJCQkoMSA8PCAyKQ0KLSNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZAkJCSgyIDw8IDIpDQotI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZExlZnQJCShGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCi0jZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkQ2VudGVyCQkoRlhfUlRGTElORUFMSUdOTUVOVF9DZW50ZXIgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCi0jZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkUmlnaHQJCShGWF9SVEZMSU5FQUxJR05NRU5UX1JpZ2h0IHwgRlhfUlRGTElORUFMSUdOTUVOVF9KdXN0aWZpZWQpDQotI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkTGVmdAkJKEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCB8IEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQpDQotI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkQ2VudGVyCShGWF9SVEZMSU5FQUxJR05NRU5UX0NlbnRlciB8IEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQpDQotI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkUmlnaHQJKEZYX1JURkxJTkVBTElHTk1FTlRfUmlnaHQgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKQ0KLSNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9Mb3dlck1hc2sJCQkweDAzDQotI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0hpZ2hlck1hc2sJCQkweDBDDQorI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9Ob25lIDB4MDANCisjZGVmaW5lIEZYX1JURkJSRUFLUE9MSUNZX1NwYWNlQnJlYWsgMHgwMQ0KKyNkZWZpbmUgRlhfUlRGQlJFQUtQT0xJQ1lfTnVtYmVyQnJlYWsgMHgwMg0KKyNkZWZpbmUgRlhfUlRGQlJFQUtQT0xJQ1lfSW5maXhCcmVhayAweDA0DQorI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9UYWJCcmVhayAweDA4DQorI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9PcnBoYW5Qb3NpdGlvbmVkVGFiIDB4MTANCisjZGVmaW5lIEZYX1JURkJSRUFLX05vbmUgMHgwMA0KKyNkZWZpbmUgRlhfUlRGQlJFQUtfUGllY2VCcmVhayAweDAxDQorI2RlZmluZSBGWF9SVEZCUkVBS19MaW5lQnJlYWsgMHgwMg0KKyNkZWZpbmUgRlhfUlRGQlJFQUtfUGFyYWdyYXBoQnJlYWsgMHgwMw0KKyNkZWZpbmUgRlhfUlRGQlJFQUtfUGFnZUJyZWFrIDB4MDQNCisjZGVmaW5lIEZYX1JURkxBWU9VVFNUWUxFX1BhZ2luYXRpb24gMHgwMQ0KKyNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQgMHgwMg0KKyNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycyAweDA0DQorI2RlZmluZSBGWF9SVEZMQVlPVVRTVFlMRV9MaW5lRGlyZWN0aW9uIDB4MDgNCisjZGVmaW5lIEZYX1JURkxBWU9VVFNUWUxFX0V4cGFuZFRhYiAweDEwDQorI2RlZmluZSBGWF9SVEZMQVlPVVRTVFlMRV9BcmFiaWNOdW1iZXIgMHgyMA0KKyNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfU2luZ2xlTGluZSAweDQwDQorI2RlZmluZSBGWF9SVEZMQVlPVVRTVFlMRV9NQkNTQ29kZSAweDgwDQorI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfQWxpZ25tZW50IDB4MDAwRg0KKyNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX0FyYWJpY051bWJlciAweDAwMTANCisjZGVmaW5lIEZYX1JURkNIQVJTVFlMRV9BcmFiaWNTaGFkZGEgMHgwMDIwDQorI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfT2RkQmlkaUxldmVsIDB4MDA0MA0KKyNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX1JUTFJlYWRpbmdPcmRlciAweDAwODANCisjZGVmaW5lIEZYX1JURkNIQVJTVFlMRV9BcmFiaWNDb250ZXh0IDB4MDMwMA0KKyNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX0FyYWJpY0luZGljIDB4MDQwMA0KKyNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX0FyYWJpY0NvbW1hIDB4MDgwMA0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0IDANCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfQ2VudGVyIDENCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfUmlnaHQgMg0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9KdXN0aWZpZWQgKDEgPDwgMikNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQgKDIgPDwgMikNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkTGVmdCBcDQorICAoRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0IHwgRlhfUlRGTElORUFMSUdOTUVOVF9KdXN0aWZpZWQpDQorI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZENlbnRlciBcDQorICAoRlhfUlRGTElORUFMSUdOTUVOVF9DZW50ZXIgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkUmlnaHQgXA0KKyAgKEZYX1JURkxJTkVBTElHTk1FTlRfUmlnaHQgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWRMZWZ0IFwNCisgIChGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKQ0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZENlbnRlciBcDQorICAoRlhfUlRGTElORUFMSUdOTUVOVF9DZW50ZXIgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKQ0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZFJpZ2h0IFwNCisgIChGWF9SVEZMSU5FQUxJR05NRU5UX1JpZ2h0IHwgRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCkNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfTG93ZXJNYXNrIDB4MDMNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfSGlnaGVyTWFzayAweDBDDQogdHlwZWRlZiBzdHJ1Y3QgX0ZYX1JURlRFWFRPQkogew0KLSAgICBfRlhfUlRGVEVYVE9CSigpDQotICAgIHsNCi0gICAgICAgIHBTdHIgPSBOVUxMOw0KLSAgICAgICAgcFdpZHRocyA9IE5VTEw7DQotICAgICAgICBpTGVuZ3RoID0gMDsNCi0gICAgICAgIHBGb250ID0gTlVMTDsNCi0gICAgICAgIGZGb250U2l6ZSA9IDEyLjBmOw0KLSAgICAgICAgZHdMYXlvdXRTdHlsZXMgPSAwOw0KLSAgICAgICAgaUNoYXJSb3RhdGlvbiA9IDA7DQotICAgICAgICBpQmlkaUxldmVsID0gMDsNCi0gICAgICAgIHBSZWN0ID0gTlVMTDsNCi0gICAgICAgIHdMaW5lQnJlYWtDaGFyID0gTCdcbic7DQotICAgICAgICBpSG9yaXpvbnRhbFNjYWxlID0gMTAwOw0KLSAgICAgICAgaVZlcnRpY2FsU2NhbGUgPSAxMDA7DQorICBfRlhfUlRGVEVYVE9CSigpIHsNCisgICAgcFN0ciA9IE5VTEw7DQorICAgIHBXaWR0aHMgPSBOVUxMOw0KKyAgICBpTGVuZ3RoID0gMDsNCisgICAgcEZvbnQgPSBOVUxMOw0KKyAgICBmRm9udFNpemUgPSAxMi4wZjsNCisgICAgZHdMYXlvdXRTdHlsZXMgPSAwOw0KKyAgICBpQ2hhclJvdGF0aW9uID0gMDsNCisgICAgaUJpZGlMZXZlbCA9IDA7DQorICAgIHBSZWN0ID0gTlVMTDsNCisgICAgd0xpbmVCcmVha0NoYXIgPSBMJ1xuJzsNCisgICAgaUhvcml6b250YWxTY2FsZSA9IDEwMDsNCisgICAgaVZlcnRpY2FsU2NhbGUgPSAxMDA7DQorICB9DQorICBjb25zdCBGWF9XQ0hBUiogcFN0cjsNCisgIGludDMyX3QqIHBXaWR0aHM7DQorICBpbnQzMl90IGlMZW5ndGg7DQorICBJRlhfRm9udCogcEZvbnQ7DQorICBGWF9GTE9BVCBmRm9udFNpemU7DQorICBGWF9EV09SRCBkd0xheW91dFN0eWxlczsNCisgIGludDMyX3QgaUNoYXJSb3RhdGlvbjsNCisgIGludDMyX3QgaUJpZGlMZXZlbDsNCisgIEZYX0xQQ1JFQ1RGIHBSZWN0Ow0KKyAgRlhfV0NIQVIgd0xpbmVCcmVha0NoYXI7DQorICBpbnQzMl90IGlIb3Jpem9udGFsU2NhbGU7DQorICBpbnQzMl90IGlWZXJ0aWNhbFNjYWxlOw0KK30gRlhfUlRGVEVYVE9CSiwgKkZYX0xQUlRGVEVYVE9CSjsNCit0eXBlZGVmIEZYX1JURlRFWFRPQkogY29uc3QqIEZYX0xQQ1JURlRFWFRPQko7DQorY2xhc3MgQ0ZYX1JURlBpZWNlIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRlhfUlRGUGllY2UoKQ0KKyAgICAgIDogbV9kd1N0YXR1cyhGWF9SVEZCUkVBS19QaWVjZUJyZWFrKSwNCisgICAgICAgIG1faVN0YXJ0UG9zKDApLA0KKyAgICAgICAgbV9pV2lkdGgoLTEpLA0KKyAgICAgICAgbV9pU3RhcnRDaGFyKDApLA0KKyAgICAgICAgbV9pQ2hhcnMoMCksDQorICAgICAgICBtX2lCaWRpTGV2ZWwoMCksDQorICAgICAgICBtX2lCaWRpUG9zKDApLA0KKyAgICAgICAgbV9pRm9udFNpemUoMCksDQorICAgICAgICBtX2lGb250SGVpZ2h0KDApLA0KKyAgICAgICAgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCksDQorICAgICAgICBtX2lWZXJ0aWNhbFNjYWxlKDEwMCksDQorICAgICAgICBtX2R3TGF5b3V0U3R5bGVzKDApLA0KKyAgICAgICAgbV9kd0lkZW50aXR5KDApLA0KKyAgICAgICAgbV9wQ2hhcnMoTlVMTCksDQorICAgICAgICBtX3BVc2VyRGF0YShOVUxMKSB7fQ0KKyAgfkNGWF9SVEZQaWVjZSgpIHsgUmVzZXQoKTsgfQ0KKyAgdm9pZCBBcHBlbmRDaGFyKGNvbnN0IENGWF9SVEZDaGFyJiB0Yykgew0KKyAgICBGWFNZU19hc3NlcnQobV9wQ2hhcnMgIT0gTlVMTCk7DQorICAgIG1fcENoYXJzLT5BZGQodGMpOw0KKyAgICBpZiAobV9pV2lkdGggPCAwKSB7DQorICAgICAgbV9pV2lkdGggPSB0Yy5tX2lDaGFyV2lkdGg7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9pV2lkdGggKz0gdGMubV9pQ2hhcldpZHRoOw0KICAgICB9DQotICAgIGNvbnN0IEZYX1dDSEFSKgkJcFN0cjsNCi0gICAgaW50MzJfdAkJKnBXaWR0aHM7DQotICAgIGludDMyX3QJCWlMZW5ndGg7DQotICAgIElGWF9Gb250CQkqcEZvbnQ7DQotICAgIEZYX0ZMT0FUCQlmRm9udFNpemU7DQotICAgIEZYX0RXT1JECQlkd0xheW91dFN0eWxlczsNCi0gICAgaW50MzJfdAkJaUNoYXJSb3RhdGlvbjsNCi0gICAgaW50MzJfdAkJaUJpZGlMZXZlbDsNCi0gICAgRlhfTFBDUkVDVEYJCXBSZWN0Ow0KLSAgICBGWF9XQ0hBUgkJd0xpbmVCcmVha0NoYXI7DQotICAgIGludDMyX3QJCWlIb3Jpem9udGFsU2NhbGU7DQotICAgIGludDMyX3QJCWlWZXJ0aWNhbFNjYWxlOw0KLX0gRlhfUlRGVEVYVE9CSiwgKiBGWF9MUFJURlRFWFRPQko7DQotdHlwZWRlZiBGWF9SVEZURVhUT0JKIGNvbnN0ICogRlhfTFBDUlRGVEVYVE9CSjsNCi1jbGFzcyBDRlhfUlRGUGllY2UgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9SVEZQaWVjZSgpIDogbV9kd1N0YXR1cyhGWF9SVEZCUkVBS19QaWVjZUJyZWFrKQ0KLSAgICAgICAgLCBtX2lTdGFydFBvcygwKQ0KLSAgICAgICAgLCBtX2lXaWR0aCgtMSkNCi0gICAgICAgICwgbV9pU3RhcnRDaGFyKDApDQotICAgICAgICAsIG1faUNoYXJzKDApDQotICAgICAgICAsIG1faUJpZGlMZXZlbCgwKQ0KLSAgICAgICAgLCBtX2lCaWRpUG9zKDApDQotICAgICAgICAsIG1faUZvbnRTaXplKDApDQotICAgICAgICAsIG1faUZvbnRIZWlnaHQoMCkNCi0gICAgICAgICwgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCkNCi0gICAgICAgICwgbV9pVmVydGljYWxTY2FsZSgxMDApDQotICAgICAgICAsIG1fZHdMYXlvdXRTdHlsZXMoMCkNCi0gICAgICAgICwgbV9kd0lkZW50aXR5KDApDQotICAgICAgICAsIG1fcENoYXJzKE5VTEwpDQotICAgICAgICAsIG1fcFVzZXJEYXRhKE5VTEwpDQotICAgIHsNCisgICAgbV9pQ2hhcnMrKzsNCisgIH0NCisgIGludDMyX3QgR2V0RW5kUG9zKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9pV2lkdGggPCAwID8gbV9pU3RhcnRQb3MgOiBtX2lTdGFydFBvcyArIG1faVdpZHRoOw0KKyAgfQ0KKyAgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2lDaGFyczsgfQ0KKyAgaW50MzJfdCBHZXRFbmRDaGFyKCkgY29uc3QgeyByZXR1cm4gbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7IH0NCisgIENGWF9SVEZDaGFyJiBHZXRDaGFyKGludDMyX3QgaW5kZXgpIHsNCisgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX2lDaGFycyAmJiBtX3BDaGFycyAhPSBOVUxMKTsNCisgICAgcmV0dXJuICptX3BDaGFycy0+R2V0RGF0YVB0cihtX2lTdGFydENoYXIgKyBpbmRleCk7DQorICB9DQorICBDRlhfUlRGQ2hhciogR2V0Q2hhclB0cihpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9pQ2hhcnMgJiYgbV9wQ2hhcnMgIT0gTlVMTCk7DQorICAgIHJldHVybiBtX3BDaGFycy0+R2V0RGF0YVB0cihtX2lTdGFydENoYXIgKyBpbmRleCk7DQorICB9DQorICB2b2lkIEdldFN0cmluZyhGWF9XQ0hBUiogcFRleHQpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KHBUZXh0ICE9IE5VTEwpOw0KKyAgICBpbnQzMl90IGlFbmRDaGFyID0gbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7DQorICAgIENGWF9SVEZDaGFyKiBwQ2hhcjsNCisgICAgZm9yIChpbnQzMl90IGkgPSBtX2lTdGFydENoYXI7IGkgPCBpRW5kQ2hhcjsgaSsrKSB7DQorICAgICAgcENoYXIgPSBtX3BDaGFycy0+R2V0RGF0YVB0cihpKTsNCisgICAgICAqcFRleHQrKyA9IChGWF9XQ0hBUilwQ2hhci0+bV93Q2hhckNvZGU7DQogICAgIH0NCi0gICAgfkNGWF9SVEZQaWVjZSgpDQotICAgIHsNCi0gICAgICAgIFJlc2V0KCk7DQorICB9DQorICB2b2lkIEdldFN0cmluZyhDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCB7DQorICAgIEZYX1dDSEFSKiBwVGV4dCA9IHdzVGV4dC5HZXRCdWZmZXIobV9pQ2hhcnMpOw0KKyAgICBHZXRTdHJpbmcocFRleHQpOw0KKyAgICB3c1RleHQuUmVsZWFzZUJ1ZmZlcihtX2lDaGFycyk7DQorICB9DQorICB2b2lkIEdldFdpZHRocyhpbnQzMl90KiBwV2lkdGhzKSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChwV2lkdGhzICE9IE5VTEwpOw0KKyAgICBpbnQzMl90IGlFbmRDaGFyID0gbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7DQorICAgIENGWF9SVEZDaGFyKiBwQ2hhcjsNCisgICAgZm9yIChpbnQzMl90IGkgPSBtX2lTdGFydENoYXI7IGkgPCBpRW5kQ2hhcjsgaSsrKSB7DQorICAgICAgcENoYXIgPSBtX3BDaGFycy0+R2V0RGF0YVB0cihpKTsNCisgICAgICAqcFdpZHRocysrID0gcENoYXItPm1faUNoYXJXaWR0aDsNCiAgICAgfQ0KLSAgICB2b2lkIEFwcGVuZENoYXIoY29uc3QgQ0ZYX1JURkNoYXIgJnRjKQ0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQobV9wQ2hhcnMgIT0gTlVMTCk7DQotICAgICAgICBtX3BDaGFycy0+QWRkKHRjKTsNCi0gICAgICAgIGlmIChtX2lXaWR0aCA8IDApIHsNCi0gICAgICAgICAgICBtX2lXaWR0aCA9IHRjLm1faUNoYXJXaWR0aDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9pV2lkdGggKz0gdGMubV9pQ2hhcldpZHRoOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9pQ2hhcnMgKys7DQorICB9DQorICB2b2lkIFJlc2V0KCkgew0KKyAgICBtX2R3U3RhdHVzID0gRlhfUlRGQlJFQUtfUGllY2VCcmVhazsNCisgICAgaWYgKG1faVdpZHRoID4gLTEpIHsNCisgICAgICBtX2lTdGFydFBvcyArPSBtX2lXaWR0aDsNCiAgICAgfQ0KLSAgICBpbnQzMl90IEdldEVuZFBvcygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lXaWR0aCA8IDAgPyBtX2lTdGFydFBvcyA6IG1faVN0YXJ0UG9zICsgbV9pV2lkdGg7DQotICAgIH0NCi0gICAgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9pQ2hhcnM7DQotICAgIH0NCi0gICAgaW50MzJfdCBHZXRFbmRDaGFyKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faVN0YXJ0Q2hhciArIG1faUNoYXJzOw0KLSAgICB9DQotICAgIENGWF9SVEZDaGFyJiBHZXRDaGFyKGludDMyX3QgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9pQ2hhcnMgJiYgbV9wQ2hhcnMgIT0gTlVMTCk7DQotICAgICAgICByZXR1cm4gKm1fcENoYXJzLT5HZXREYXRhUHRyKG1faVN0YXJ0Q2hhciArIGluZGV4KTsNCi0gICAgfQ0KLSAgICBDRlhfUlRGQ2hhciogR2V0Q2hhclB0cihpbnQzMl90IGluZGV4KSBjb25zdA0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1faUNoYXJzICYmIG1fcENoYXJzICE9IE5VTEwpOw0KLSAgICAgICAgcmV0dXJuIG1fcENoYXJzLT5HZXREYXRhUHRyKG1faVN0YXJ0Q2hhciArIGluZGV4KTsNCi0gICAgfQ0KLSAgICB2b2lkIEdldFN0cmluZyAoRlhfV0NIQVIqIHBUZXh0KSBjb25zdA0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQocFRleHQgIT0gTlVMTCk7DQotICAgICAgICBpbnQzMl90IGlFbmRDaGFyID0gbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7DQotICAgICAgICBDRlhfUlRGQ2hhciAqcENoYXI7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IG1faVN0YXJ0Q2hhcjsgaSA8IGlFbmRDaGFyOyBpICsrKSB7DQotICAgICAgICAgICAgcENoYXIgPSBtX3BDaGFycy0+R2V0RGF0YVB0cihpKTsNCi0gICAgICAgICAgICAqcFRleHQgKysgPSAoRlhfV0NIQVIpcENoYXItPm1fd0NoYXJDb2RlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHZvaWQgR2V0U3RyaW5nKENGWF9XaWRlU3RyaW5nICZ3c1RleHQpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIEZYX1dDSEFSKiBwVGV4dCA9IHdzVGV4dC5HZXRCdWZmZXIobV9pQ2hhcnMpOw0KLSAgICAgICAgR2V0U3RyaW5nKHBUZXh0KTsNCi0gICAgICAgIHdzVGV4dC5SZWxlYXNlQnVmZmVyKG1faUNoYXJzKTsNCi0gICAgfQ0KLSAgICB2b2lkIEdldFdpZHRocyhpbnQzMl90ICpwV2lkdGhzKSBjb25zdA0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQocFdpZHRocyAhPSBOVUxMKTsNCi0gICAgICAgIGludDMyX3QgaUVuZENoYXIgPSBtX2lTdGFydENoYXIgKyBtX2lDaGFyczsNCi0gICAgICAgIENGWF9SVEZDaGFyICpwQ2hhcjsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gbV9pU3RhcnRDaGFyOyBpIDwgaUVuZENoYXI7IGkgKyspIHsNCi0gICAgICAgICAgICBwQ2hhciA9IG1fcENoYXJzLT5HZXREYXRhUHRyKGkpOw0KLSAgICAgICAgICAgICpwV2lkdGhzICsrID0gcENoYXItPm1faUNoYXJXaWR0aDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB2b2lkIFJlc2V0KCkNCi0gICAgew0KLSAgICAgICAgbV9kd1N0YXR1cyA9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWs7DQotICAgICAgICBpZiAobV9pV2lkdGggPiAtMSkgew0KLSAgICAgICAgICAgIG1faVN0YXJ0UG9zICs9IG1faVdpZHRoOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9pV2lkdGggPSAtMTsNCi0gICAgICAgIG1faVN0YXJ0Q2hhciArPSBtX2lDaGFyczsNCi0gICAgICAgIG1faUNoYXJzID0gMDsNCi0gICAgICAgIG1faUJpZGlMZXZlbCA9IDA7DQotICAgICAgICBtX2lCaWRpUG9zID0gMDsNCi0gICAgICAgIG1faUhvcml6b250YWxTY2FsZSA9IDEwMDsNCi0gICAgICAgIG1faVZlcnRpY2FsU2NhbGUgPSAxMDA7DQotICAgIH0NCi0gICAgRlhfRFdPUkQJCQltX2R3U3RhdHVzOw0KLSAgICBpbnQzMl90CQkJbV9pU3RhcnRQb3M7DQotICAgIGludDMyX3QJCQltX2lXaWR0aDsNCi0gICAgaW50MzJfdAkJCW1faVN0YXJ0Q2hhcjsNCi0gICAgaW50MzJfdAkJCW1faUNoYXJzOw0KLSAgICBpbnQzMl90CQkJbV9pQmlkaUxldmVsOw0KLSAgICBpbnQzMl90CQkJbV9pQmlkaVBvczsNCi0gICAgaW50MzJfdAkJCW1faUZvbnRTaXplOw0KLSAgICBpbnQzMl90CQkJbV9pRm9udEhlaWdodDsNCi0gICAgaW50MzJfdAkJCW1faUhvcml6b250YWxTY2FsZTsNCi0gICAgaW50MzJfdAkJCW1faVZlcnRpY2FsU2NhbGU7DQotICAgIEZYX0RXT1JECQkJbV9kd0xheW91dFN0eWxlczsNCi0gICAgRlhfRFdPUkQJCQltX2R3SWRlbnRpdHk7DQotICAgIENGWF9SVEZDaGFyQXJyYXkJKm1fcENoYXJzOw0KLSAgICBJRlhfVW5rbm93bgkJCSptX3BVc2VyRGF0YTsNCisgICAgbV9pV2lkdGggPSAtMTsNCisgICAgbV9pU3RhcnRDaGFyICs9IG1faUNoYXJzOw0KKyAgICBtX2lDaGFycyA9IDA7DQorICAgIG1faUJpZGlMZXZlbCA9IDA7DQorICAgIG1faUJpZGlQb3MgPSAwOw0KKyAgICBtX2lIb3Jpem9udGFsU2NhbGUgPSAxMDA7DQorICAgIG1faVZlcnRpY2FsU2NhbGUgPSAxMDA7DQorICB9DQorICBGWF9EV09SRCBtX2R3U3RhdHVzOw0KKyAgaW50MzJfdCBtX2lTdGFydFBvczsNCisgIGludDMyX3QgbV9pV2lkdGg7DQorICBpbnQzMl90IG1faVN0YXJ0Q2hhcjsNCisgIGludDMyX3QgbV9pQ2hhcnM7DQorICBpbnQzMl90IG1faUJpZGlMZXZlbDsNCisgIGludDMyX3QgbV9pQmlkaVBvczsNCisgIGludDMyX3QgbV9pRm9udFNpemU7DQorICBpbnQzMl90IG1faUZvbnRIZWlnaHQ7DQorICBpbnQzMl90IG1faUhvcml6b250YWxTY2FsZTsNCisgIGludDMyX3QgbV9pVmVydGljYWxTY2FsZTsNCisgIEZYX0RXT1JEIG1fZHdMYXlvdXRTdHlsZXM7DQorICBGWF9EV09SRCBtX2R3SWRlbnRpdHk7DQorICBDRlhfUlRGQ2hhckFycmF5KiBtX3BDaGFyczsNCisgIElGWF9Vbmtub3duKiBtX3BVc2VyRGF0YTsNCiB9Ow0KIHR5cGVkZWYgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlPENGWF9SVEZQaWVjZT4gQ0ZYX1JURlBpZWNlQXJyYXk7DQotY2xhc3MgSUZYX1JURkJyZWFrDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGWF9SVEZCcmVhayoJQ3JlYXRlKEZYX0RXT1JEIGR3UG9saWNpZXMpOw0KLSAgICB2aXJ0dWFsIH5JRlhfUlRGQnJlYWsoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRMaW5lV2lkdGgoRlhfRkxPQVQgZkxpbmVTdGFydCwgRlhfRkxPQVQgZkxpbmVFbmQpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZVBvcyhGWF9GTE9BVCBmTGluZVBvcykgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRMYXlvdXRTdHlsZXMoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250KElGWF9Gb250ICpwRm9udCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFkZFBvc2l0aW9uZWRUYWIoRlhfRkxPQVQgZlRhYlBvcykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRQb3NpdGlvbmVkVGFicyhjb25zdCBDRlhfRmxvYXRBcnJheSAmdGFicykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlDbGVhclBvc2l0aW9uZWRUYWJzKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXREZWZhdWx0Q2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZUJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0SG9yaXpvbnRhbFNjYWxlKGludDMyX3QgaVNjYWxlKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldFZlcnRpY2FsU2NhbGUoaW50MzJfdCBpU2NhbGUpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0Q2hhclJvdGF0aW9uKGludDMyX3QgaUNoYXJSb3RhdGlvbikgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRXb3JkU3BhY2UoRlhfQk9PTCBiRGVmYXVsdCwgRlhfRkxPQVQgZldvcmRTcGFjZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRSZWFkaW5nT3JkZXIoRlhfQk9PTCBiUlRMID0gRkFMU0UpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0QWxpZ25tZW50KGludDMyX3QgaUFsaWdubWVudCA9IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRVc2VyRGF0YShJRlhfVW5rbm93biAqcFVzZXJEYXRhKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJCUFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJCUVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzID0gRlhfUlRGQlJFQUtfUGllY2VCcmVhaykgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJCUNvdW50QnJlYWtQaWVjZXMoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgY29uc3QgQ0ZYX1JURlBpZWNlKgkJCUdldEJyZWFrUGllY2UoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQlHZXRMaW5lUmVjdChDRlhfUmVjdEYgJnJlY3QpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJQ2xlYXJCcmVha1BpZWNlcygpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVzZXQoKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0RGlzcGxheVBvcyhGWF9MUENSVEZURVhUT0JKIHBUZXh0LCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UsIENGWF9XaWRlU3RyaW5nICpwV1NGb3JtcyA9IE5VTEwsIEZYX0FkanVzdENoYXJEaXNwbGF5UG9zIHBBZGp1c3RQb3MgPSBOVUxMKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0Q2hhclJlY3RzKEZYX0xQQ1JURlRFWFRPQkogcFRleHQsIENGWF9SZWN0RkFycmF5ICZydEFycmF5LCBGWF9CT09MIGJDaGFyQkJveCA9IEZBTFNFKSBjb25zdCA9IDA7DQorY2xhc3MgSUZYX1JURkJyZWFrIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGWF9SVEZCcmVhayogQ3JlYXRlKEZYX0RXT1JEIGR3UG9saWNpZXMpOw0KKyAgdmlydHVhbCB+SUZYX1JURkJyZWFrKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVXaWR0aChGWF9GTE9BVCBmTGluZVN0YXJ0LCBGWF9GTE9BVCBmTGluZUVuZCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVQb3MoRlhfRkxPQVQgZkxpbmVQb3MpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0TGF5b3V0U3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnQoSUZYX0ZvbnQqIHBGb250KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkUG9zaXRpb25lZFRhYihGWF9GTE9BVCBmVGFiUG9zKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0UG9zaXRpb25lZFRhYnMoY29uc3QgQ0ZYX0Zsb2F0QXJyYXkmIHRhYnMpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDbGVhclBvc2l0aW9uZWRUYWJzKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldERlZmF1bHRDaGFyKEZYX1dDSEFSIHdjaCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVCcmVha0NoYXIoRlhfV0NIQVIgd2NoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRIb3Jpem9udGFsU2NhbGUoaW50MzJfdCBpU2NhbGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRWZXJ0aWNhbFNjYWxlKGludDMyX3QgaVNjYWxlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhclJvdGF0aW9uKGludDMyX3QgaUNoYXJSb3RhdGlvbikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0V29yZFNwYWNlKEZYX0JPT0wgYkRlZmF1bHQsIEZYX0ZMT0FUIGZXb3JkU3BhY2UpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRSZWFkaW5nT3JkZXIoRlhfQk9PTCBiUlRMID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50ID0gRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VXNlckRhdGEoSUZYX1Vua25vd24qIHBVc2VyRGF0YSkgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cyA9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWspID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEJyZWFrUGllY2VzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBDRlhfUlRGUGllY2UqIEdldEJyZWFrUGllY2UoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldExpbmVSZWN0KENGWF9SZWN0RiYgcmVjdCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENsZWFyQnJlYWtQaWVjZXMoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGlzcGxheVBvcygNCisgICAgICBGWF9MUENSVEZURVhUT0JKIHBUZXh0LA0KKyAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFLA0KKyAgICAgIENGWF9XaWRlU3RyaW5nKiBwV1NGb3JtcyA9IE5VTEwsDQorICAgICAgRlhfQWRqdXN0Q2hhckRpc3BsYXlQb3MgcEFkanVzdFBvcyA9IE5VTEwpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyUmVjdHMoRlhfTFBDUlRGVEVYVE9CSiBwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIHJ0QXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJCQm94ID0gRkFMU0UpIGNvbnN0ID0gMDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3NheC5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc2F4LmgKaW5kZXggMTJhN2QxMy4uOTQ5NDM1NCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc2F4LmgKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc2F4LmgKQEAgLTgsNDMgKzgsNTYgQEAKICNkZWZpbmUgX0ZYX1NBWF8NCiBjbGFzcyBJRlhfU0FYUmVhZGVySGFuZGxlcjsNCiBjbGFzcyBJRlhfU0FYUmVhZGVyOw0KLSNkZWZpbmUgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfYW1wCQkweDAwMDENCi0jZGVmaW5lIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2x0CQkweDAwMDINCi0jZGVmaW5lIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2d0CQkweDAwMDQNCi0jZGVmaW5lIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2Fwb3MJCTB4MDAwOA0KLSNkZWZpbmUgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfcXVvdAkJMHgwMDEwDQotI2RlZmluZSBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9zaGFycAkweDAwMjANCi0jZGVmaW5lIEZYX1NBWFBBUlNFTU9ERV9Ob3RTa2lwU3BhY2UJCTB4MDEwMA0KKyNkZWZpbmUgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfYW1wIDB4MDAwMQ0KKyNkZWZpbmUgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfbHQgMHgwMDAyDQorI2RlZmluZSBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9ndCAweDAwMDQNCisjZGVmaW5lIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2Fwb3MgMHgwMDA4DQorI2RlZmluZSBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9xdW90IDB4MDAxMA0KKyNkZWZpbmUgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfc2hhcnAgMHgwMDIwDQorI2RlZmluZSBGWF9TQVhQQVJTRU1PREVfTm90U2tpcFNwYWNlIDB4MDEwMA0KIGVudW0gRlhfU0FYTk9ERSB7DQotICAgIEZYX1NBWE5PREVfVW5rbm93biA9IDAsDQotICAgIEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24sDQotICAgIEZYX1NBWE5PREVfRGVjbGFyYXRpb24sDQotICAgIEZYX1NBWE5PREVfQ29tbWVudCwNCi0gICAgRlhfU0FYTk9ERV9UYWcsDQotICAgIEZYX1NBWE5PREVfVGV4dCwNCi0gICAgRlhfU0FYTk9ERV9DaGFyRGF0YSwNCisgIEZYX1NBWE5PREVfVW5rbm93biA9IDAsDQorICBGWF9TQVhOT0RFX0luc3RydWN0aW9uLA0KKyAgRlhfU0FYTk9ERV9EZWNsYXJhdGlvbiwNCisgIEZYX1NBWE5PREVfQ29tbWVudCwNCisgIEZYX1NBWE5PREVfVGFnLA0KKyAgRlhfU0FYTk9ERV9UZXh0LA0KKyAgRlhfU0FYTk9ERV9DaGFyRGF0YSwNCiB9Ow0KLWNsYXNzIElGWF9TQVhSZWFkZXJIYW5kbGVyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SUZYX1NBWFJlYWRlckhhbmRsZXIoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQqCU9uVGFnRW50ZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RhZ05hbWUsIEZYX1NBWE5PREUgZVR5cGUsIEZYX0RXT1JEIGR3U3RhcnRQb3MpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlPblRhZ0F0dHJpYnV0ZSh2b2lkKiBwVGFnLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzQXR0cmksIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNWYWx1ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCU9uVGFnQnJlYWsodm9pZCogcFRhZykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCU9uVGFnRGF0YSh2b2lkKiBwVGFnLCBGWF9TQVhOT0RFIGVUeXBlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRGF0YSwgRlhfRFdPUkQgZHdTdGFydFBvcykgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCU9uVGFnQ2xvc2Uodm9pZCogcFRhZywgRlhfRFdPUkQgZHdFbmRQb3MpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlPblRhZ0VuZCh2b2lkKiBwVGFnLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnTmFtZSwgRlhfRFdPUkQgZHdFbmRQb3MpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQlPblRhcmdldERhdGEodm9pZCogcFRhZywgRlhfU0FYTk9ERSBlVHlwZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RhdGEsIEZYX0RXT1JEIGR3U3RhcnRQb3MpID0gMDsNCitjbGFzcyBJRlhfU0FYUmVhZGVySGFuZGxlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGWF9TQVhSZWFkZXJIYW5kbGVyKCkge30NCisgIHZpcnR1YWwgdm9pZCogT25UYWdFbnRlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhcnRQb3MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPblRhZ0F0dHJpYnV0ZSh2b2lkKiBwVGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNBdHRyaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVmFsdWUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPblRhZ0JyZWFrKHZvaWQqIHBUYWcpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPblRhZ0RhdGEodm9pZCogcFRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU0FYTk9ERSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhcnRQb3MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPblRhZ0Nsb3NlKHZvaWQqIHBUYWcsIEZYX0RXT1JEIGR3RW5kUG9zKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgT25UYWdFbmQodm9pZCogcFRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0VuZFBvcykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIE9uVGFyZ2V0RGF0YSh2b2lkKiBwVGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGFydFBvcykgPSAwOw0KIH07DQotY2xhc3MgSUZYX1NBWFJlYWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGWF9TQVhSZWFkZXIoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAlTdGFydFBhcnNlKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0RXT1JEIGR3U3RhcnQgPSAwLCBGWF9EV09SRCBkd0xlbiA9IC0xLCBGWF9EV09SRCBkd1BhcnNlTW9kZSA9IDApID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CUNvbnRpbnVlUGFyc2UoSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJU2tpcEN1cnJlbnROb2RlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldEhhbmRsZXIoSUZYX1NBWFJlYWRlckhhbmRsZXIgKnBIYW5kbGVyKSA9IDA7DQorY2xhc3MgSUZYX1NBWFJlYWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGWF9TQVhSZWFkZXIoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0xlbiA9IC0xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYXJzZU1vZGUgPSAwKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ29udGludWVQYXJzZShJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTa2lwQ3VycmVudE5vZGUoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0SGFuZGxlcihJRlhfU0FYUmVhZGVySGFuZGxlciogcEhhbmRsZXIpID0gMDsNCiB9Ow0KLUlGWF9TQVhSZWFkZXIqCUZYX1NBWFJlYWRlcl9DcmVhdGUoKTsNCitJRlhfU0FYUmVhZGVyKiBGWF9TQVhSZWFkZXJfQ3JlYXRlKCk7DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc3RtLmggYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9zdG0uaAppbmRleCA5YjI4NDMyLi5lNjQ3OTI0IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9zdG0uaAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9zdG0uaApAQCAtNyw1NSArNyw3MiBAQAogI2lmbmRlZiBfRlhfU1RSRUFNDQogI2RlZmluZSBfRlhfU1RSRUFNDQogY2xhc3MgSUZYX1N0cmVhbTsNCi1JRlhfRmlsZVJlYWQqCUZYX0NyZWF0ZUZpbGVSZWFkKElGWF9TdHJlYW0gKnBCYXNlU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtID0gRkFMU0UpOw0KK0lGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoSUZYX1N0cmVhbSogcEJhc2VTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlU3RyZWFtID0gRkFMU0UpOw0KICNpZmRlZiBGWF9GSUxFU0laRQ0KLUlGWF9GaWxlUmVhZCoJRlhfQ3JlYXRlRmlsZVJlYWQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9GSUxFU0laRSBpRmlsZVNpemUgPSAtMSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSA9IFRSVUUpOw0KK0lGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoSUZYX0J1ZmZlclJlYWQqIHBCdWZmZXJSZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgaUZpbGVTaXplID0gLTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlU3RyZWFtID0gVFJVRSk7DQogI2Vsc2UNCi1JRlhfRmlsZVJlYWQqCUZYX0NyZWF0ZUZpbGVSZWFkKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyUmVhZCwgaW50MzJfdCBpRmlsZVNpemUgPSAtMSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSA9IFRSVUUpOw0KK0lGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoSUZYX0J1ZmZlclJlYWQqIHBCdWZmZXJSZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmlsZVNpemUgPSAtMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0gPSBUUlVFKTsNCiAjZW5kaWYNCi1JRlhfRmlsZVdyaXRlKglGWF9DcmVhdGVGaWxlV3JpdGUoSUZYX1N0cmVhbSAqcEJhc2VTdHJlYW0sIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0gPSBGQUxTRSk7DQorSUZYX0ZpbGVXcml0ZSogRlhfQ3JlYXRlRmlsZVdyaXRlKElGWF9TdHJlYW0qIHBCYXNlU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlU3RyZWFtID0gRkFMU0UpOw0KIGVudW0gRlhfU1RSRUFNQUNDRVNTIHsNCi0gICAgRlhfU1RSRUFNQUNDRVNTX0JpbmFyeQkJPSAweDAwLA0KLSAgICBGWF9TVFJFQU1BQ0NFU1NfVGV4dAkJPSAweDAxLA0KLSAgICBGWF9TVFJFQU1BQ0NFU1NfUmVhZAkJPSAweDAyLA0KLSAgICBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUJCT0gMHgwNCwNCi0gICAgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlCT0gMHgxMCwNCi0gICAgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZAkJPSAweDIwLA0KLSAgICBGWF9TVFJFQU1BQ0NFU1NfQ3JlYXRlCQk9IDB4ODAsDQorICBGWF9TVFJFQU1BQ0NFU1NfQmluYXJ5ID0gMHgwMCwNCisgIEZYX1NUUkVBTUFDQ0VTU19UZXh0ID0gMHgwMSwNCisgIEZYX1NUUkVBTUFDQ0VTU19SZWFkID0gMHgwMiwNCisgIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSA9IDB4MDQsDQorICBGWF9TVFJFQU1BQ0NFU1NfVHJ1bmNhdGUgPSAweDEwLA0KKyAgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCA9IDB4MjAsDQorICBGWF9TVFJFQU1BQ0NFU1NfQ3JlYXRlID0gMHg4MCwNCiB9Ow0KIGVudW0gRlhfU1RSRUFNU0VFSyB7DQotICAgIEZYX1NUUkVBTVNFRUtfQmVnaW4JCQk9IDAgLA0KLSAgICBGWF9TVFJFQU1TRUVLX0N1cnJlbnQJCQksDQotICAgIEZYX1NUUkVBTVNFRUtfRW5kCQkJCSwNCisgIEZYX1NUUkVBTVNFRUtfQmVnaW4gPSAwLA0KKyAgRlhfU1RSRUFNU0VFS19DdXJyZW50LA0KKyAgRlhfU1RSRUFNU0VFS19FbmQsDQogfTsNCi1jbGFzcyBJRlhfU3RyZWFtDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGWF9TdHJlYW0qCQkJQ3JlYXRlU3RyZWFtKElGWF9GaWxlUmVhZCAqcEZpbGVSZWFkLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQotICAgIHN0YXRpYyBJRlhfU3RyZWFtKgkJCUNyZWF0ZVN0cmVhbShJRlhfRmlsZVdyaXRlICpwRmlsZVdyaXRlLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQotICAgIHN0YXRpYyBJRlhfU3RyZWFtKgkJCUNyZWF0ZVN0cmVhbShjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUsIEZYX0RXT1JEIGR3QWNjZXNzKTsNCi0gICAgc3RhdGljIElGWF9TdHJlYW0qCQkJQ3JlYXRlU3RyZWFtKHVpbnQ4X3QqIHBEYXRhLCBpbnQzMl90IGxlbmd0aCwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KLSAgICBzdGF0aWMgSUZYX1N0cmVhbSoJCQlDcmVhdGVTdHJlYW0oSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9EV09SRCBkd0FjY2VzcywgaW50MzJfdCBpRmlsZVNpemUgPSAtMSwgRlhfQk9PTCBiUmVsZWFzZUJ1ZmZlclJlYWQgPSBUUlVFKTsNCi0gICAgc3RhdGljIElGWF9TdHJlYW0qCQkJQ3JlYXRlVGV4dFN0cmVhbShJRlhfU3RyZWFtICpwQmFzZVN0cmVhbSwgRlhfQk9PTCBiRGVsZXRlT25SZWxlYXNlKTsNCi0gICAgdmlydHVhbCB+SUZYX1N0cmVhbSgpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIElGWF9TdHJlYW0qCQkJUmV0YWluKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQkJR2V0QWNjZXNzTW9kZXMoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldExlbmd0aCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0UG9zaXRpb24oKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0VPRigpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MsIGludDMyX3QgY29uc3QgKnBCeXRlU2l6ZSA9IE5VTEwpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJV3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJV3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJRmx1c2goKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldEJPTSh1aW50OF90IGJvbVs0XSkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX1dPUkQJCQkJR2V0Q29kZVBhZ2UoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgRlhfV09SRAkJCQlTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJTG9jaygpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVVubG9jaygpID0gMDsNCi0gICAgdmlydHVhbCBJRlhfU3RyZWFtKgkJCUNyZWF0ZVNoYXJlZFN0cmVhbShGWF9EV09SRCBkd0FjY2VzcywgaW50MzJfdCBpT2Zmc2V0LCBpbnQzMl90IGlMZW5ndGgpID0gMDsNCitjbGFzcyBJRlhfU3RyZWFtIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGWF9TdHJlYW0qIENyZWF0ZVN0cmVhbShJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgc3RhdGljIElGWF9TdHJlYW0qIENyZWF0ZVN0cmVhbShJRlhfRmlsZVdyaXRlKiBwRmlsZVdyaXRlLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICBzdGF0aWMgSUZYX1N0cmVhbSogQ3JlYXRlU3RyZWFtKGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgc3RhdGljIElGWF9TdHJlYW0qIENyZWF0ZVN0cmVhbSh1aW50OF90KiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzKTsNCisgIHN0YXRpYyBJRlhfU3RyZWFtKiBDcmVhdGVTdHJlYW0oSUZYX0J1ZmZlclJlYWQqIHBCdWZmZXJSZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0FjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmlsZVNpemUgPSAtMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVsZWFzZUJ1ZmZlclJlYWQgPSBUUlVFKTsNCisgIHN0YXRpYyBJRlhfU3RyZWFtKiBDcmVhdGVUZXh0U3RyZWFtKElGWF9TdHJlYW0qIHBCYXNlU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVsZXRlT25SZWxlYXNlKTsNCisgIHZpcnR1YWwgfklGWF9TdHJlYW0oKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIElGWF9TdHJlYW0qIFJldGFpbigpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0QWNjZXNzTW9kZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0UG9zaXRpb24oKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb25zdCogcEJ5dGVTaXplID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgV3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEZsdXNoKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRCT00odWludDhfdCBib21bNF0pIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfV09SRCBHZXRDb2RlUGFnZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfV09SRCBTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIExvY2soKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2NrKCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfU3RyZWFtKiBDcmVhdGVTaGFyZWRTdHJlYW0oRlhfRFdPUkQgZHdBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpID0gMDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3N5cy5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc3lzLmgKaW5kZXggMzk4MmUwZC4uNzY2YjI2YSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc3lzLmgKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc3lzLmgKQEAgLTksNTQgKzksNTYgQEAKICNpZmRlZiBfX2NwbHVzcGx1cw0KIGV4dGVybiAiQyIgew0KICNlbmRpZg0KLSNkZWZpbmUgRlhfUkFEMkRFRyhyKQkJKChyKSAqIDE4MC4wZiAvIEZYX1BJKQ0KLSNkZWZpbmUgRlhfREVHMlJBRChhKQkJKChhKSAqIEZYX1BJIC8gMTgwLjBmKQ0KLXR5cGVkZWYgaW50OF90ICoJCQlGWF9MUElOVDg7DQotdHlwZWRlZiBpbnQ4X3QgY29uc3QgKgkJRlhfTFBDSU5UODsNCi10eXBlZGVmIGludDMyX3QgKgkJCUZYX0xQSU5UMzI7DQotdHlwZWRlZiBpbnQzMl90IGNvbnN0ICoJRlhfTFBDSU5UMzI7DQotdHlwZWRlZiBsb25nCQkJCUZYX0xPTkc7DQotdHlwZWRlZiBGWF9MT05HICoJCQlGWF9MUExPTkc7DQotdHlwZWRlZiBGWF9MT05HIGNvbnN0ICoJCUZYX0xQQ0xPTkc7DQotdHlwZWRlZiBGWF9GTE9BVCBjb25zdCAqCUZYX0xQQ0ZMT0FUOw0KLXR5cGVkZWYgZG91YmxlCQkJCUZYX0RPVUJMRTsNCi10eXBlZGVmIEZYX0RPVUJMRSAqCQkJRlhfTFBET1VCTEU7DQotdHlwZWRlZiBGWF9ET1VCTEUgY29uc3QgKglGWF9MUENET1VCTEU7DQotRlhfRkxPQVQJRlhfdGFuKEZYX0ZMT0FUIGEpOw0KLUZYX0ZMT0FUCUZYX2xvZyhGWF9GTE9BVCBiLCBGWF9GTE9BVCB4KTsNCi1GWF9GTE9BVAlGWF9zdHJ0b2YoY29uc3QgRlhfQ0hBUiogcGNzU3RyLCBpbnQzMl90IGlMZW5ndGggPSAtMSwgaW50MzJfdCAqcFVzZWRMZW4gPSBOVUxMKTsNCi1GWF9GTE9BVAlGWF93Y3N0b2YoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoID0gLTEsIGludDMyX3QgKnBVc2VkTGVuID0gTlVMTCk7DQotRlhfV0NIQVIqCUZYX3djc25jcHkoRlhfV0NIQVIqIGRzdFN0ciwgY29uc3QgRlhfV0NIQVIqIHNyY1N0ciwgc2l6ZV90IGNvdW50KTsNCi1pbnQzMl90CUZYX3djc25pY21wKGNvbnN0IEZYX1dDSEFSKiBzMSwgY29uc3QgRlhfV0NIQVIqIHMyLCBzaXplX3QgY291bnQpOw0KLWludDMyX3QJRlhfc3RybmljbXAoY29uc3QgRlhfQ0hBUiogczEsIGNvbnN0IEZYX0NIQVIqIHMyLCBzaXplX3QgY291bnQpOw0KLWlubGluZSBGWF9CT09MCUZYX2lzbG93ZXIoaW50MzJfdCBjaCkNCi17DQotICAgIHJldHVybiBjaCA+PSAnYScgJiYgY2ggPD0gJ3onOw0KKyNkZWZpbmUgRlhfUkFEMkRFRyhyKSAoKHIpKjE4MC4wZiAvIEZYX1BJKQ0KKyNkZWZpbmUgRlhfREVHMlJBRChhKSAoKGEpKkZYX1BJIC8gMTgwLjBmKQ0KK3R5cGVkZWYgaW50OF90KiBGWF9MUElOVDg7DQordHlwZWRlZiBpbnQ4X3QgY29uc3QqIEZYX0xQQ0lOVDg7DQordHlwZWRlZiBpbnQzMl90KiBGWF9MUElOVDMyOw0KK3R5cGVkZWYgaW50MzJfdCBjb25zdCogRlhfTFBDSU5UMzI7DQordHlwZWRlZiBsb25nIEZYX0xPTkc7DQordHlwZWRlZiBGWF9MT05HKiBGWF9MUExPTkc7DQordHlwZWRlZiBGWF9MT05HIGNvbnN0KiBGWF9MUENMT05HOw0KK3R5cGVkZWYgRlhfRkxPQVQgY29uc3QqIEZYX0xQQ0ZMT0FUOw0KK3R5cGVkZWYgZG91YmxlIEZYX0RPVUJMRTsNCit0eXBlZGVmIEZYX0RPVUJMRSogRlhfTFBET1VCTEU7DQordHlwZWRlZiBGWF9ET1VCTEUgY29uc3QqIEZYX0xQQ0RPVUJMRTsNCitGWF9GTE9BVCBGWF90YW4oRlhfRkxPQVQgYSk7DQorRlhfRkxPQVQgRlhfbG9nKEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIHgpOw0KK0ZYX0ZMT0FUIEZYX3N0cnRvZihjb25zdCBGWF9DSEFSKiBwY3NTdHIsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IC0xLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwVXNlZExlbiA9IE5VTEwpOw0KK0ZYX0ZMT0FUIEZYX3djc3RvZihjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSAtMSwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFVzZWRMZW4gPSBOVUxMKTsNCitGWF9XQ0hBUiogRlhfd2NzbmNweShGWF9XQ0hBUiogZHN0U3RyLCBjb25zdCBGWF9XQ0hBUiogc3JjU3RyLCBzaXplX3QgY291bnQpOw0KK2ludDMyX3QgRlhfd2NzbmljbXAoY29uc3QgRlhfV0NIQVIqIHMxLCBjb25zdCBGWF9XQ0hBUiogczIsIHNpemVfdCBjb3VudCk7DQoraW50MzJfdCBGWF9zdHJuaWNtcChjb25zdCBGWF9DSEFSKiBzMSwgY29uc3QgRlhfQ0hBUiogczIsIHNpemVfdCBjb3VudCk7DQoraW5saW5lIEZYX0JPT0wgRlhfaXNsb3dlcihpbnQzMl90IGNoKSB7DQorICByZXR1cm4gY2ggPj0gJ2EnICYmIGNoIDw9ICd6JzsNCiB9DQotaW5saW5lIEZYX0JPT0wJRlhfaXN1cHBlcihpbnQzMl90IGNoKQ0KLXsNCi0gICAgcmV0dXJuIGNoID49ICdBJyAmJiBjaCA8PSAnWic7DQoraW5saW5lIEZYX0JPT0wgRlhfaXN1cHBlcihpbnQzMl90IGNoKSB7DQorICByZXR1cm4gY2ggPj0gJ0EnICYmIGNoIDw9ICdaJzsNCiB9DQotaW5saW5lIGludDMyX3QJRlhfdG9sb3dlcihpbnQzMl90IGNoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX2lzdXBwZXIoY2gpID8gKGNoICsgMHgyMCkgOiBjaDsNCitpbmxpbmUgaW50MzJfdCBGWF90b2xvd2VyKGludDMyX3QgY2gpIHsNCisgIHJldHVybiBGWF9pc3VwcGVyKGNoKSA/IChjaCArIDB4MjApIDogY2g7DQogfQ0KLWlubGluZSBpbnQzMl90IEZYX3RvdXBwZXIoaW50MzJfdCBjaCkNCi17DQotICAgIHJldHVybiBGWF9pc2xvd2VyKGNoKSA/IChjaCAtIDB4MjApIDogY2g7DQoraW5saW5lIGludDMyX3QgRlhfdG91cHBlcihpbnQzMl90IGNoKSB7DQorICByZXR1cm4gRlhfaXNsb3dlcihjaCkgPyAoY2ggLSAweDIwKSA6IGNoOw0KIH0NCi1pbnQzMl90CUZYX2ZpbGVsZW5ndGgoRlhTWVNfRklMRSAqZmlsZSk7DQotRlhfQk9PTAkJRlhfZnNldHNpemUoRlhTWVNfRklMRSAqZmlsZSwgaW50MzJfdCBzaXplKTsNCi12b2lkCQlGWF9tZW1zZXQodm9pZCogcEJ1ZiwgaW50MzJfdCBpVmFsdWUsIHNpemVfdCBzaXplKTsNCi12b2lkCQlGWF9tZW1jcHkodm9pZCogcERzdCwgY29uc3Qgdm9pZCogcFNyYywgc2l6ZV90IHNpemUpOw0KLUZYX0JPT0wJCUZYX0lzUmVsYXRpdmVQYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NQYXRoKTsNCi1GWF9CT09MCQlGWF9Kb2luUGF0aChjb25zdCBDRlhfV2lkZVN0cmluZ0MgJndzQmFzZVBhdGgsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NSZWxhdGl2ZVBhdGgsIENGWF9XaWRlU3RyaW5nICZ3c0Fic29sdXRlUGF0aCk7DQoraW50MzJfdCBGWF9maWxlbGVuZ3RoKEZYU1lTX0ZJTEUqIGZpbGUpOw0KK0ZYX0JPT0wgRlhfZnNldHNpemUoRlhTWVNfRklMRSogZmlsZSwgaW50MzJfdCBzaXplKTsNCit2b2lkIEZYX21lbXNldCh2b2lkKiBwQnVmLCBpbnQzMl90IGlWYWx1ZSwgc2l6ZV90IHNpemUpOw0KK3ZvaWQgRlhfbWVtY3B5KHZvaWQqIHBEc3QsIGNvbnN0IHZvaWQqIHBTcmMsIHNpemVfdCBzaXplKTsNCitGWF9CT09MIEZYX0lzUmVsYXRpdmVQYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYXRoKTsNCitGWF9CT09MIEZYX0pvaW5QYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NCYXNlUGF0aCwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NSZWxhdGl2ZVBhdGgsDQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBYnNvbHV0ZVBhdGgpOw0KIHR5cGVkZWYgc3RydWN0IF9GWF9WRVJTSU9OIHsNCi0gICAgRlhfRFdPUkQJZHdNYWpvclZlcnNpb247DQotICAgIEZYX0RXT1JECWR3TWlub3JWZXJzaW9uOw0KLSAgICBGWF9EV09SRAlkd0J1aWxkVmVyc2lvbjsNCi19IEZYX1ZFUlNJT04sICogRlhfTFBWRVJTSU9OOw0KLXR5cGVkZWYgRlhfVkVSU0lPTiBjb25zdCAqIEZYX0xQQ1ZFUlNJT047DQorICBGWF9EV09SRCBkd01ham9yVmVyc2lvbjsNCisgIEZYX0RXT1JEIGR3TWlub3JWZXJzaW9uOw0KKyAgRlhfRFdPUkQgZHdCdWlsZFZlcnNpb247DQorfSBGWF9WRVJTSU9OLCAqRlhfTFBWRVJTSU9OOw0KK3R5cGVkZWYgRlhfVkVSU0lPTiBjb25zdCogRlhfTFBDVkVSU0lPTjsNCiAjaWZkZWYgX19jcGx1c3BsdXMNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Riay5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfdGJrLmgKaW5kZXggZWVmMmRiNC4uN2NjMWRiMiAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfdGJrLmgKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfdGJrLmgKQEAgLTE1LDIwMyArMTUsMjAwIEBACiBjbGFzcyBDRlhfVHh0Q2hhcjsNCiBjbGFzcyBDRlhfVHh0UGllY2U7DQogY2xhc3MgSUZYX1R4dEJyZWFrOw0KLSNkZWZpbmUgRlhfVFhUQlJFQUtQT0xJQ1lfTm9uZQkJCQkweDAwDQotI2RlZmluZSBGWF9UWFRCUkVBS1BPTElDWV9QYWdpbmF0aW9uCQkweDAxDQotI2RlZmluZSBGWF9UWFRCUkVBS1BPTElDWV9TcGFjZUJyZWFrCQkweDAyDQotI2RlZmluZSBGWF9UWFRCUkVBS1BPTElDWV9OdW1iZXJCcmVhawkJMHgwNA0KLSNkZWZpbmUgRlhfVFhUQlJFQUtfTm9uZQkJCQkJMHgwMA0KLSNkZWZpbmUgRlhfVFhUQlJFQUtfUGllY2VCcmVhawkJCQkweDAxDQotI2RlZmluZSBGWF9UWFRCUkVBS19MaW5lQnJlYWsJCQkJMHgwMg0KLSNkZWZpbmUgRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWsJCQkweDAzDQotI2RlZmluZSBGWF9UWFRCUkVBS19QYWdlQnJlYWsJCQkJMHgwNA0KLSNkZWZpbmUgRlhfVFhUQlJFQUtfQ29udHJvbENoYXIJCQkJMHgxMA0KLSNkZWZpbmUgRlhfVFhUQlJFQUtfQnJlYWtDaGFyCQkJCTB4MjANCi0jZGVmaW5lIEZYX1RYVEJSRUFLX1Vua25vd25DaGFyCQkJCTB4NDANCi0jZGVmaW5lIEZYX1RYVEJSRUFLX1JlbW92ZUNoYXIJCQkJMHg4MA0KLSNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfTXV0aXBsZUZvcm1hdAkJMHgwMDAxDQotI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dAkweDAwMDINCi0jZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMJCTB4MDAwNA0KLSNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfUmV2ZXJzZUxpbmUJCTB4MDAwOA0KLSNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljQ29udGV4dAkJMHgwMDEwDQotI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNTaGFwZXMJCTB4MDAyMA0KLSNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyCTB4MDA0MA0KLSNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfRXhwYW5kVGFiCQkJMHgwMTAwDQotI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lCQkweDAyMDANCi0jZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0CQkJMHgwNDAwDQotI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQWxpZ25tZW50CQkJMHgwMDBGDQotI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljTnVtYmVyCQkweDAwMTANCi0jZGVmaW5lIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNTaGFkZGEJCTB4MDAyMA0KLSNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX09kZEJpZGlMZXZlbAkJMHgwMDQwDQotI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfUlRMUmVhZGluZ09yZGVyCQkweDAwODANCi0jZGVmaW5lIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNDb250ZXh0CQkweDAzMDANCi0jZGVmaW5lIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNJbmRpYwkJCTB4MDQwMA0KLSNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0NvbW1hCQkJMHgwODAwDQotI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQJCQkJMA0KLSNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXIJCQkJMQ0KLSNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodAkJCQkyDQotI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZAkJCSgxIDw8IDIpDQotI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkCQkJKDIgPDwgMikNCi0jZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkTGVmdAkJKEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdCB8IEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkKQ0KLSNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWRDZW50ZXIJCShGWF9UWFRMSU5FQUxJR05NRU5UX0NlbnRlciB8IEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkKQ0KLSNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWRSaWdodAkJKEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCi0jZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWRMZWZ0CQkoRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0IHwgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCkNCi0jZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWRDZW50ZXIJKEZYX1RYVExJTkVBTElHTk1FTlRfQ2VudGVyIHwgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCkNCi0jZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWRSaWdodAkoRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodCB8IEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQpDQotI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0xvd2VyTWFzawkJCTB4MDMNCi0jZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfSGlnaGVyTWFzawkJCTB4MEMNCi0jZGVmaW5lIEZYX1RYVEJSRUFLX01pbmltdW1UYWJXaWR0aAkJCQkxNjAwMDANCisjZGVmaW5lIEZYX1RYVEJSRUFLUE9MSUNZX05vbmUgMHgwMA0KKyNkZWZpbmUgRlhfVFhUQlJFQUtQT0xJQ1lfUGFnaW5hdGlvbiAweDAxDQorI2RlZmluZSBGWF9UWFRCUkVBS1BPTElDWV9TcGFjZUJyZWFrIDB4MDINCisjZGVmaW5lIEZYX1RYVEJSRUFLUE9MSUNZX051bWJlckJyZWFrIDB4MDQNCisjZGVmaW5lIEZYX1RYVEJSRUFLX05vbmUgMHgwMA0KKyNkZWZpbmUgRlhfVFhUQlJFQUtfUGllY2VCcmVhayAweDAxDQorI2RlZmluZSBGWF9UWFRCUkVBS19MaW5lQnJlYWsgMHgwMg0KKyNkZWZpbmUgRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWsgMHgwMw0KKyNkZWZpbmUgRlhfVFhUQlJFQUtfUGFnZUJyZWFrIDB4MDQNCisjZGVmaW5lIEZYX1RYVEJSRUFLX0NvbnRyb2xDaGFyIDB4MTANCisjZGVmaW5lIEZYX1RYVEJSRUFLX0JyZWFrQ2hhciAweDIwDQorI2RlZmluZSBGWF9UWFRCUkVBS19Vbmtub3duQ2hhciAweDQwDQorI2RlZmluZSBGWF9UWFRCUkVBS19SZW1vdmVDaGFyIDB4ODANCisjZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX011dGlwbGVGb3JtYXQgMHgwMDAxDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dCAweDAwMDINCisjZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMgMHgwMDA0DQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9SZXZlcnNlTGluZSAweDAwMDgNCisjZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY0NvbnRleHQgMHgwMDEwDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNTaGFwZXMgMHgwMDIwDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9SVExSZWFkaW5nT3JkZXIgMHgwMDQwDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9FeHBhbmRUYWIgMHgwMTAwDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lIDB4MDIwMA0KKyNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQgMHgwNDAwDQorI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQWxpZ25tZW50IDB4MDAwRg0KKyNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY051bWJlciAweDAwMTANCisjZGVmaW5lIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNTaGFkZGEgMHgwMDIwDQorI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsIDB4MDA0MA0KKyNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX1JUTFJlYWRpbmdPcmRlciAweDAwODANCisjZGVmaW5lIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNDb250ZXh0IDB4MDMwMA0KKyNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0luZGljIDB4MDQwMA0KKyNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0NvbW1hIDB4MDgwMA0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0IDANCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfQ2VudGVyIDENCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQgMg0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWQgKDEgPDwgMikNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQgKDIgPDwgMikNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkTGVmdCBcDQorICAoRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0IHwgRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWQpDQorI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZENlbnRlciBcDQorICAoRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXIgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkUmlnaHQgXA0KKyAgKEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWRMZWZ0IFwNCisgIChGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKQ0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZENlbnRlciBcDQorICAoRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXIgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKQ0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZFJpZ2h0IFwNCisgIChGWF9UWFRMSU5FQUxJR05NRU5UX1JpZ2h0IHwgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCkNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfTG93ZXJNYXNrIDB4MDMNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfSGlnaGVyTWFzayAweDBDDQorI2RlZmluZSBGWF9UWFRCUkVBS19NaW5pbXVtVGFiV2lkdGggMTYwMDAwDQogDQotY2xhc3MgSUZYX1R4dEFjY2Vzcw0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklGWF9UeHRBY2Nlc3MoKSB7fQ0KLSAgICB2aXJ0dWFsIEZYX1dDSEFSCUdldENoYXIodm9pZCogcElkZW50aXR5LCBpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRXaWR0aCh2b2lkKiBwSWRlbnRpdHksIGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsNCitjbGFzcyBJRlhfVHh0QWNjZXNzIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZYX1R4dEFjY2VzcygpIHt9DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldENoYXIodm9pZCogcElkZW50aXR5LCBpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0V2lkdGgodm9pZCogcElkZW50aXR5LCBpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7DQogfTsNCiB0eXBlZGVmIHN0cnVjdCBfRlhfVFhUUlVOIHsNCi0gICAgX0ZYX1RYVFJVTigpDQotICAgIHsNCi0gICAgICAgIHBBY2Nlc3MJCQk9IE5VTEw7DQotICAgICAgICBwSWRlbnRpdHkJCT0gTlVMTDsNCi0gICAgICAgIHBTdHIJCQk9IE5VTEw7DQotICAgICAgICBwV2lkdGhzCQkJPSBOVUxMOw0KLSAgICAgICAgaUxlbmd0aAkJCT0gMDsNCi0gICAgICAgIHBGb250CQkJPSBOVUxMOw0KLSAgICAgICAgZkZvbnRTaXplCQk9IDEyOw0KLSAgICAgICAgZHdTdHlsZXMJCT0gMDsNCi0gICAgICAgIGlIb3Jpem9udGFsU2NhbGUgPSAxMDA7DQotICAgICAgICBpVmVydGljYWxTY2FsZQk9IDEwMDsNCi0gICAgICAgIGlDaGFyUm90YXRpb24JPSAwOw0KLSAgICAgICAgZHdDaGFyU3R5bGVzCT0gMDsNCi0gICAgICAgIHBSZWN0CQkJPSBOVUxMOw0KLSAgICAgICAgd0xpbmVCcmVha0NoYXIJPSBMJ1xuJzsNCi0gICAgICAgIGJTa2lwU3BhY2UJCT0gVFJVRTsNCisgIF9GWF9UWFRSVU4oKSB7DQorICAgIHBBY2Nlc3MgPSBOVUxMOw0KKyAgICBwSWRlbnRpdHkgPSBOVUxMOw0KKyAgICBwU3RyID0gTlVMTDsNCisgICAgcFdpZHRocyA9IE5VTEw7DQorICAgIGlMZW5ndGggPSAwOw0KKyAgICBwRm9udCA9IE5VTEw7DQorICAgIGZGb250U2l6ZSA9IDEyOw0KKyAgICBkd1N0eWxlcyA9IDA7DQorICAgIGlIb3Jpem9udGFsU2NhbGUgPSAxMDA7DQorICAgIGlWZXJ0aWNhbFNjYWxlID0gMTAwOw0KKyAgICBpQ2hhclJvdGF0aW9uID0gMDsNCisgICAgZHdDaGFyU3R5bGVzID0gMDsNCisgICAgcFJlY3QgPSBOVUxMOw0KKyAgICB3TGluZUJyZWFrQ2hhciA9IEwnXG4nOw0KKyAgICBiU2tpcFNwYWNlID0gVFJVRTsNCisgIH0NCisgIElGWF9UeHRBY2Nlc3MqIHBBY2Nlc3M7DQorICB2b2lkKiBwSWRlbnRpdHk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0cjsNCisgIGludDMyX3QqIHBXaWR0aHM7DQorICBpbnQzMl90IGlMZW5ndGg7DQorICBJRlhfRm9udCogcEZvbnQ7DQorICBGWF9GTE9BVCBmRm9udFNpemU7DQorICBGWF9EV09SRCBkd1N0eWxlczsNCisgIGludDMyX3QgaUhvcml6b250YWxTY2FsZTsNCisgIGludDMyX3QgaVZlcnRpY2FsU2NhbGU7DQorICBpbnQzMl90IGlDaGFyUm90YXRpb247DQorICBGWF9EV09SRCBkd0NoYXJTdHlsZXM7DQorICBGWF9MUENSRUNURiBwUmVjdDsNCisgIEZYX1dDSEFSIHdMaW5lQnJlYWtDaGFyOw0KKyAgRlhfQk9PTCBiU2tpcFNwYWNlOw0KK30gRlhfVFhUUlVOLCAqRlhfTFBUWFRSVU47DQordHlwZWRlZiBGWF9UWFRSVU4gY29uc3QqIEZYX0xQQ1RYVFJVTjsNCitjbGFzcyBDRlhfVHh0UGllY2UgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGWF9UeHRQaWVjZSgpDQorICAgICAgOiBtX2R3U3RhdHVzKEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspLA0KKyAgICAgICAgbV9pU3RhcnRQb3MoMCksDQorICAgICAgICBtX2lXaWR0aCgtMSksDQorICAgICAgICBtX2lTdGFydENoYXIoMCksDQorICAgICAgICBtX2lDaGFycygwKSwNCisgICAgICAgIG1faUJpZGlMZXZlbCgwKSwNCisgICAgICAgIG1faUJpZGlQb3MoMCksDQorICAgICAgICBtX2lIb3Jpem9udGFsU2NhbGUoMTAwKSwNCisgICAgICAgIG1faVZlcnRpY2FsU2NhbGUoMTAwKSwNCisgICAgICAgIG1fZHdDaGFyU3R5bGVzKDApLA0KKyAgICAgICAgbV9wQ2hhcnMoTlVMTCksDQorICAgICAgICBtX3BVc2VyRGF0YShOVUxMKSB7fQ0KKyAgaW50MzJfdCBHZXRFbmRQb3MoKSBjb25zdCB7DQorICAgIHJldHVybiBtX2lXaWR0aCA8IDAgPyBtX2lTdGFydFBvcyA6IG1faVN0YXJ0UG9zICsgbV9pV2lkdGg7DQorICB9DQorICBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1faUNoYXJzOyB9DQorICBpbnQzMl90IEdldEVuZENoYXIoKSBjb25zdCB7IHJldHVybiBtX2lTdGFydENoYXIgKyBtX2lDaGFyczsgfQ0KKyAgQ0ZYX1R4dENoYXIqIEdldENoYXJQdHIoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1faUNoYXJzICYmIG1fcENoYXJzICE9IE5VTEwpOw0KKyAgICByZXR1cm4gbV9wQ2hhcnMtPkdldERhdGFQdHIobV9pU3RhcnRDaGFyICsgaW5kZXgpOw0KKyAgfQ0KKyAgdm9pZCBHZXRTdHJpbmcoRlhfV0NIQVIqIHBUZXh0KSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChwVGV4dCAhPSBOVUxMKTsNCisgICAgaW50MzJfdCBpRW5kQ2hhciA9IG1faVN0YXJ0Q2hhciArIG1faUNoYXJzOw0KKyAgICBDRlhfQ2hhciogcENoYXI7DQorICAgIGZvciAoaW50MzJfdCBpID0gbV9pU3RhcnRDaGFyOyBpIDwgaUVuZENoYXI7IGkrKykgew0KKyAgICAgIHBDaGFyID0gbV9wQ2hhcnMtPkdldERhdGFQdHIoaSk7DQorICAgICAgKnBUZXh0KysgPSAoRlhfV0NIQVIpcENoYXItPm1fd0NoYXJDb2RlOw0KICAgICB9DQotICAgIElGWF9UeHRBY2Nlc3MJKnBBY2Nlc3M7DQotICAgIHZvaWQqCQlwSWRlbnRpdHk7DQotICAgIGNvbnN0IEZYX1dDSEFSKgkJcFN0cjsNCi0gICAgaW50MzJfdAkJKnBXaWR0aHM7DQotICAgIGludDMyX3QJCWlMZW5ndGg7DQotICAgIElGWF9Gb250CQkqcEZvbnQ7DQotICAgIEZYX0ZMT0FUCQlmRm9udFNpemU7DQotICAgIEZYX0RXT1JECQlkd1N0eWxlczsNCi0gICAgaW50MzJfdAkJaUhvcml6b250YWxTY2FsZTsNCi0gICAgaW50MzJfdAkJaVZlcnRpY2FsU2NhbGU7DQotICAgIGludDMyX3QJCWlDaGFyUm90YXRpb247DQotICAgIEZYX0RXT1JECQlkd0NoYXJTdHlsZXM7DQotICAgIEZYX0xQQ1JFQ1RGCQlwUmVjdDsNCi0gICAgRlhfV0NIQVIJCXdMaW5lQnJlYWtDaGFyOw0KLSAgICBGWF9CT09MCQkJYlNraXBTcGFjZTsNCi19IEZYX1RYVFJVTiwgKiBGWF9MUFRYVFJVTjsNCi10eXBlZGVmIEZYX1RYVFJVTiBjb25zdCAqIEZYX0xQQ1RYVFJVTjsNCi1jbGFzcyBDRlhfVHh0UGllY2UgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9UeHRQaWVjZSgpIDogbV9kd1N0YXR1cyhGWF9UWFRCUkVBS19QaWVjZUJyZWFrKQ0KLSAgICAgICAgLCBtX2lTdGFydFBvcygwKQ0KLSAgICAgICAgLCBtX2lXaWR0aCgtMSkNCi0gICAgICAgICwgbV9pU3RhcnRDaGFyKDApDQotICAgICAgICAsIG1faUNoYXJzKDApDQotICAgICAgICAsIG1faUJpZGlMZXZlbCgwKQ0KLSAgICAgICAgLCBtX2lCaWRpUG9zKDApDQotICAgICAgICAsIG1faUhvcml6b250YWxTY2FsZSgxMDApDQotICAgICAgICAsIG1faVZlcnRpY2FsU2NhbGUoMTAwKQ0KLSAgICAgICAgLCBtX2R3Q2hhclN0eWxlcygwKQ0KLSAgICAgICAgLCBtX3BDaGFycyhOVUxMKQ0KLSAgICAgICAgLCBtX3BVc2VyRGF0YShOVUxMKQ0KLSAgICB7DQotICAgIH0NCi0gICAgaW50MzJfdCBHZXRFbmRQb3MoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9pV2lkdGggPCAwID8gbV9pU3RhcnRQb3MgOiBtX2lTdGFydFBvcyArIG1faVdpZHRoOw0KLSAgICB9DQotICAgIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faUNoYXJzOw0KLSAgICB9DQotICAgIGludDMyX3QgR2V0RW5kQ2hhcigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lTdGFydENoYXIgKyBtX2lDaGFyczsNCi0gICAgfQ0KLSAgICBDRlhfVHh0Q2hhciogR2V0Q2hhclB0cihpbnQzMl90IGluZGV4KSBjb25zdA0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1faUNoYXJzICYmIG1fcENoYXJzICE9IE5VTEwpOw0KLSAgICAgICAgcmV0dXJuIG1fcENoYXJzLT5HZXREYXRhUHRyKG1faVN0YXJ0Q2hhciArIGluZGV4KTsNCi0gICAgfQ0KLSAgICB2b2lkIEdldFN0cmluZyhGWF9XQ0hBUiogcFRleHQpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwVGV4dCAhPSBOVUxMKTsNCi0gICAgICAgIGludDMyX3QgaUVuZENoYXIgPSBtX2lTdGFydENoYXIgKyBtX2lDaGFyczsNCi0gICAgICAgIENGWF9DaGFyICpwQ2hhcjsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gbV9pU3RhcnRDaGFyOyBpIDwgaUVuZENoYXI7IGkgKyspIHsNCi0gICAgICAgICAgICBwQ2hhciA9IG1fcENoYXJzLT5HZXREYXRhUHRyKGkpOw0KLSAgICAgICAgICAgICpwVGV4dCArKyA9IChGWF9XQ0hBUilwQ2hhci0+bV93Q2hhckNvZGU7DQotICAgICAgICB9DQotICAgIH0NCisgIH0NCiANCi0gICAgdm9pZCBHZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhfV0NIQVIqIHBUZXh0ID0gd3NUZXh0LkdldEJ1ZmZlcihtX2lDaGFycyk7DQotICAgICAgICBHZXRTdHJpbmcocFRleHQpOw0KLSAgICAgICAgd3NUZXh0LlJlbGVhc2VCdWZmZXIobV9pQ2hhcnMpOw0KKyAgdm9pZCBHZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Qgew0KKyAgICBGWF9XQ0hBUiogcFRleHQgPSB3c1RleHQuR2V0QnVmZmVyKG1faUNoYXJzKTsNCisgICAgR2V0U3RyaW5nKHBUZXh0KTsNCisgICAgd3NUZXh0LlJlbGVhc2VCdWZmZXIobV9pQ2hhcnMpOw0KKyAgfQ0KKyAgdm9pZCBHZXRXaWR0aHMoaW50MzJfdCogcFdpZHRocykgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQocFdpZHRocyAhPSBOVUxMKTsNCisgICAgaW50MzJfdCBpRW5kQ2hhciA9IG1faVN0YXJ0Q2hhciArIG1faUNoYXJzOw0KKyAgICBDRlhfQ2hhciogcENoYXI7DQorICAgIGZvciAoaW50MzJfdCBpID0gbV9pU3RhcnRDaGFyOyBpIDwgaUVuZENoYXI7IGkrKykgew0KKyAgICAgIHBDaGFyID0gbV9wQ2hhcnMtPkdldERhdGFQdHIoaSk7DQorICAgICAgKnBXaWR0aHMrKyA9IHBDaGFyLT5tX2lDaGFyV2lkdGg7DQogICAgIH0NCi0gICAgdm9pZCBHZXRXaWR0aHMoaW50MzJfdCAqcFdpZHRocykgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBXaWR0aHMgIT0gTlVMTCk7DQotICAgICAgICBpbnQzMl90IGlFbmRDaGFyID0gbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7DQotICAgICAgICBDRlhfQ2hhciAqcENoYXI7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IG1faVN0YXJ0Q2hhcjsgaSA8IGlFbmRDaGFyOyBpICsrKSB7DQotICAgICAgICAgICAgcENoYXIgPSBtX3BDaGFycy0+R2V0RGF0YVB0cihpKTsNCi0gICAgICAgICAgICAqcFdpZHRocyArKyA9IHBDaGFyLT5tX2lDaGFyV2lkdGg7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgRlhfRFdPUkQJCQltX2R3U3RhdHVzOw0KLSAgICBpbnQzMl90CQkJbV9pU3RhcnRQb3M7DQotICAgIGludDMyX3QJCQltX2lXaWR0aDsNCi0gICAgaW50MzJfdAkJCW1faVN0YXJ0Q2hhcjsNCi0gICAgaW50MzJfdAkJCW1faUNoYXJzOw0KLSAgICBpbnQzMl90CQkJbV9pQmlkaUxldmVsOw0KLSAgICBpbnQzMl90CQkJbV9pQmlkaVBvczsNCi0gICAgaW50MzJfdAkJCW1faUhvcml6b250YWxTY2FsZTsNCi0gICAgaW50MzJfdAkJCW1faVZlcnRpY2FsU2NhbGU7DQotICAgIEZYX0RXT1JECQkJbV9kd0NoYXJTdHlsZXM7DQotICAgIENGWF9UeHRDaGFyQXJyYXkJKm1fcENoYXJzOw0KLSAgICB2b2lkKgkJCW1fcFVzZXJEYXRhOw0KKyAgfQ0KKyAgRlhfRFdPUkQgbV9kd1N0YXR1czsNCisgIGludDMyX3QgbV9pU3RhcnRQb3M7DQorICBpbnQzMl90IG1faVdpZHRoOw0KKyAgaW50MzJfdCBtX2lTdGFydENoYXI7DQorICBpbnQzMl90IG1faUNoYXJzOw0KKyAgaW50MzJfdCBtX2lCaWRpTGV2ZWw7DQorICBpbnQzMl90IG1faUJpZGlQb3M7DQorICBpbnQzMl90IG1faUhvcml6b250YWxTY2FsZTsNCisgIGludDMyX3QgbV9pVmVydGljYWxTY2FsZTsNCisgIEZYX0RXT1JEIG1fZHdDaGFyU3R5bGVzOw0KKyAgQ0ZYX1R4dENoYXJBcnJheSogbV9wQ2hhcnM7DQorICB2b2lkKiBtX3BVc2VyRGF0YTsNCiB9Ow0KIHR5cGVkZWYgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlPENGWF9UeHRQaWVjZT4gQ0ZYX1R4dFBpZWNlQXJyYXk7DQotY2xhc3MgSUZYX1R4dEJyZWFrDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElGWF9UeHRCcmVhayoJQ3JlYXRlKEZYX0RXT1JEIGR3UG9saWNpZXMpOw0KLSAgICB2aXJ0dWFsIH5JRlhfVHh0QnJlYWsoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRMaW5lV2lkdGgoRlhfRkxPQVQgZkxpbmVXaWR0aCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRMaW5lUG9zKEZYX0ZMT0FUIGZMaW5lUG9zKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldExheW91dFN0eWxlcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0TGF5b3V0U3R5bGVzKEZYX0RXT1JEIGR3TGF5b3V0U3R5bGVzKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldEZvbnQoSUZYX0ZvbnQgKnBGb250KSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldERlZmF1bHRDaGFyKEZYX1dDSEFSIHdjaCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRQYXJhZ3JhcGhCcmVha0NoYXIoRlhfV0NIQVIgd2NoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldEhvcml6b250YWxTY2FsZShpbnQzMl90IGlTY2FsZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRWZXJ0aWNhbFNjYWxlKGludDMyX3QgaVNjYWxlKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldENoYXJSb3RhdGlvbihpbnQzMl90IGlDaGFyUm90YXRpb24pID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0QWxpZ25tZW50KGludDMyX3QgaUFsaWdubWVudCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRDb250ZXh0Q2hhclN0eWxlcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0Q29udGV4dENoYXJTdHlsZXMoRlhfRFdPUkQgZHdDaGFyU3R5bGVzKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldENvbWJXaWR0aChGWF9GTE9BVCBmQ29tYldpZHRoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldFVzZXJEYXRhKHZvaWQqIHBVc2VyRGF0YSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCQlBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCQlFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cyA9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCQlDb3VudEJyZWFrQ2hhcnMoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQkJQ291bnRCcmVha1BpZWNlcygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBjb25zdCBDRlhfVHh0UGllY2UqCQkJR2V0QnJlYWtQaWVjZShpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJCUNsZWFyQnJlYWtQaWVjZXMoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlc2V0KCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldERpc3BsYXlQb3MoRlhfTFBDVFhUUlVOIHBUeHRSdW4sIEZYVEVYVF9DSEFSUE9TICpwQ2hhclBvcywgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSwgQ0ZYX1dpZGVTdHJpbmcgKnBXU0Zvcm1zID0gTlVMTCwgRlhfQWRqdXN0Q2hhckRpc3BsYXlQb3MgcEFkanVzdFBvcyA9IE5VTEwpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRDaGFyUmVjdHMoRlhfTFBDVFhUUlVOIHBUeHRSdW4sIENGWF9SZWN0RkFycmF5ICZydEFycmF5LCBGWF9CT09MIGJDaGFyQkJveCA9IEZBTFNFKSBjb25zdCA9IDA7DQorY2xhc3MgSUZYX1R4dEJyZWFrIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGWF9UeHRCcmVhayogQ3JlYXRlKEZYX0RXT1JEIGR3UG9saWNpZXMpOw0KKyAgdmlydHVhbCB+SUZYX1R4dEJyZWFrKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVXaWR0aChGWF9GTE9BVCBmTGluZVdpZHRoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZVBvcyhGWF9GTE9BVCBmTGluZVBvcykgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRMYXlvdXRTdHlsZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGF5b3V0U3R5bGVzKEZYX0RXT1JEIGR3TGF5b3V0U3R5bGVzKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udChJRlhfRm9udCogcEZvbnQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0RGVmYXVsdENoYXIoRlhfV0NIQVIgd2NoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0UGFyYWdyYXBoQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0SG9yaXpvbnRhbFNjYWxlKGludDMyX3QgaVNjYWxlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VmVydGljYWxTY2FsZShpbnQzMl90IGlTY2FsZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENoYXJSb3RhdGlvbihpbnQzMl90IGlDaGFyUm90YXRpb24pID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEFsaWdubWVudChpbnQzMl90IGlBbGlnbm1lbnQpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q29udGV4dENoYXJTdHlsZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29udGV4dENoYXJTdHlsZXMoRlhfRFdPUkQgZHdDaGFyU3R5bGVzKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29tYldpZHRoKEZYX0ZMT0FUIGZDb21iV2lkdGgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRVc2VyRGF0YSh2b2lkKiBwVXNlckRhdGEpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgRW5kQnJlYWsoRlhfRFdPUkQgZHdTdGF0dXMgPSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRCcmVha0NoYXJzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50QnJlYWtQaWVjZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IENGWF9UeHRQaWVjZSogR2V0QnJlYWtQaWVjZShpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQ2xlYXJCcmVha1BpZWNlcygpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXREaXNwbGF5UG9zKA0KKyAgICAgIEZYX0xQQ1RYVFJVTiBwVHh0UnVuLA0KKyAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFLA0KKyAgICAgIENGWF9XaWRlU3RyaW5nKiBwV1NGb3JtcyA9IE5VTEwsDQorICAgICAgRlhfQWRqdXN0Q2hhckRpc3BsYXlQb3MgcEFkanVzdFBvcyA9IE5VTEwpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyUmVjdHMoRlhfTFBDVFhUUlVOIHBUeHRSdW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RkFycmF5JiBydEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQkJveCA9IEZBTFNFKSBjb25zdCA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91Y2QuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3VjZC5oCmluZGV4IDdiNWI2NTMuLjAyZDJjZTUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3VjZC5oCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3VjZC5oCkBAIC02LDE4ICs2LDI4IEBACiANCiAjaWZuZGVmIF9GR0FTX1VOSUNPREVfDQogI2RlZmluZSBfRkdBU19VTklDT0RFXw0KLSNkZWZpbmUgRlhfSkFQQ0hBUlBST1BFUlRZRVhfTGVmdAkJMHgwMQ0KLSNkZWZpbmUgRlhfSkFQQ0hBUlBST1BFUlRZRVhfQ2VudGVyCQkweDAyDQotI2RlZmluZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9SaWdodAkJMHgwMw0KLSNkZWZpbmUgRlhfSkFQQ0hBUlBST1BFUlRZRVhfVG9wCQkweDEwDQotI2RlZmluZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9NaWRkbGUJCTB4MjANCi0jZGVmaW5lIEZYX0pBUENIQVJQUk9QRVJUWUVYX0JvdHRvbQkJMHgzMA0KKyNkZWZpbmUgRlhfSkFQQ0hBUlBST1BFUlRZRVhfTGVmdCAweDAxDQorI2RlZmluZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9DZW50ZXIgMHgwMg0KKyNkZWZpbmUgRlhfSkFQQ0hBUlBST1BFUlRZRVhfUmlnaHQgMHgwMw0KKyNkZWZpbmUgRlhfSkFQQ0hBUlBST1BFUlRZRVhfVG9wIDB4MTANCisjZGVmaW5lIEZYX0pBUENIQVJQUk9QRVJUWUVYX01pZGRsZSAweDIwDQorI2RlZmluZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9Cb3R0b20gMHgzMA0KIHR5cGVkZWYgc3RydWN0IF9GWF9KQVBDSEFSUFJPUEVSVFlFWCB7DQotICAgIEZYX1dDSEFSCXdDaGFyOw0KLSAgICB1aW50OF90CQl1QWxpZ247DQorICBGWF9XQ0hBUiB3Q2hhcjsNCisgIHVpbnQ4X3QgdUFsaWduOw0KIH0gRlhfSkFQQ0hBUlBST1BFUlRZRVgsICpGWF9MUEpBUENIQVJQUk9QRVJUWUVYOw0KLXR5cGVkZWYgRlhfSkFQQ0hBUlBST1BFUlRZRVggY29uc3QgKiBGWF9MUENKQVBDSEFSUFJPUEVSVFlFWDsNCit0eXBlZGVmIEZYX0pBUENIQVJQUk9QRVJUWUVYIGNvbnN0KiBGWF9MUENKQVBDSEFSUFJPUEVSVFlFWDsNCiBGWF9MUENKQVBDSEFSUFJPUEVSVFlFWCBGWF9HZXRKYXBDaGFyUHJvcGVydHlFeChGWF9XQ0hBUiB3Y2gpOw0KLXR5cGVkZWYgRlhfQk9PTCAoKkZYX0FkanVzdENoYXJEaXNwbGF5UG9zKShGWF9XQ0hBUiB3Y2gsIEZYX0JPT0wgYk1CQ1NDb2RlLCBJRlhfRm9udCAqcEZvbnQsIEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiVmVydGljYWwsIENGWF9Qb2ludEYgJnB0T2Zmc2V0KTsNCi1GWF9CT09MIEZYX0FkanVzdEphcENoYXJEaXNwbGF5UG9zKEZYX1dDSEFSIHdjaCwgRlhfQk9PTCBiTUJDU0NvZGUsIElGWF9Gb250ICpwRm9udCwgRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9CT09MIGJWZXJ0aWNhbCwgQ0ZYX1BvaW50RiAmcHRPZmZzZXQpOw0KK3R5cGVkZWYgRlhfQk9PTCAoKkZYX0FkanVzdENoYXJEaXNwbGF5UG9zKShGWF9XQ0hBUiB3Y2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1CQ1NDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udCogcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydGljYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYmIHB0T2Zmc2V0KTsNCitGWF9CT09MIEZYX0FkanVzdEphcENoYXJEaXNwbGF5UG9zKEZYX1dDSEFSIHdjaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1CQ1NDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqIHBGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydGljYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGJiBwdE9mZnNldCk7DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfdXRsLmggYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91dGwuaAppbmRleCAyZTRhZDQxLi44NmE1MTZiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91dGwuaAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91dGwuaApAQCAtOCw3OTEgKzgsNzEzIEBACiAjZGVmaW5lIF9GWF9VVElMUw0KIGNsYXNzIENGWF9UaHJlYWRMb2NrOw0KIGNsYXNzIENGWF9CYXNlQXJyYXk7DQotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+IGNsYXNzIENGWF9CYXNlQXJyYXlUZW1wbGF0ZTsNCi10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX09iamVjdEJhc2VBcnJheVRlbXBsYXRlOw0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfQmFzZUFycmF5VGVtcGxhdGU7DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9PYmplY3RCYXNlQXJyYXlUZW1wbGF0ZTsNCiBjbGFzcyBDRlhfQmFzZU1hc3NBcnJheTsNCiBjbGFzcyBDRlhfQmFzZU1hc3NBcnJheUltcDsNCi10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX01hc3NBcnJheVRlbXBsYXRlOw0KLXRlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPiBjbGFzcyBDRlhfT2JqZWN0TWFzc0FycmF5VGVtcGxhdGU7DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTsNCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlOw0KIGNsYXNzIENGWF9CYXNlRGlzY3JldGVBcnJheTsNCi10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZTsNCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZTsNCiBjbGFzcyBDRlhfQmFzZVN0YWNrOw0KLXRlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPiBjbGFzcyBDRlhfU3RhY2tUZW1wbGF0ZTsNCi10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGU7DQotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+IGNsYXNzIENGWF9DUExUcmVlTm9kZTsNCi10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX0NQTFRyZWU7DQotY2xhc3MgQ0ZYX1RocmVhZExvY2sNCi17DQotcHVibGljOg0KLSAgICBDRlhfVGhyZWFkTG9jaygpOw0KLSAgICB2aXJ0dWFsIH5DRlhfVGhyZWFkTG9jaygpOw0KLSAgICB2b2lkCUxvY2soKTsNCi0gICAgdm9pZAlVbmxvY2soKTsNCi1wcml2YXRlOg0KLSAgICB2b2lkKgltX3BEYXRhOw0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfU3RhY2tUZW1wbGF0ZTsNCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGU7DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9DUExUcmVlTm9kZTsNCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX0NQTFRyZWU7DQorY2xhc3MgQ0ZYX1RocmVhZExvY2sgew0KKyBwdWJsaWM6DQorICBDRlhfVGhyZWFkTG9jaygpOw0KKyAgdmlydHVhbCB+Q0ZYX1RocmVhZExvY2soKTsNCisgIHZvaWQgTG9jaygpOw0KKyAgdm9pZCBVbmxvY2soKTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQqIG1fcERhdGE7DQogfTsNCi1jbGFzcyBDRlhfQmFzZUFycmF5IDogcHVibGljIENGWF9UYXJnZXQNCi17DQotcHJvdGVjdGVkOg0KLSAgICBDRlhfQmFzZUFycmF5KGludDMyX3QgaUdyb3dTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpOw0KLSAgICB+Q0ZYX0Jhc2VBcnJheSgpOw0KLSAgICBpbnQzMl90CUdldFNpemUoKSBjb25zdDsNCi0gICAgaW50MzJfdAlHZXRCbG9ja1NpemUoKSBjb25zdDsNCi0gICAgdWludDhfdCoJQWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KTsNCi0gICAgdWludDhfdCoJR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Q7DQotICAgIHVpbnQ4X3QqCUdldEJ1ZmZlcigpIGNvbnN0Ow0KLSAgICBpbnQzMl90CUFwcGVuZChjb25zdCBDRlhfQmFzZUFycmF5ICZzcmMsIGludDMyX3QgaVN0YXJ0ID0gMCwgaW50MzJfdCBpQ291bnQgPSAtMSk7DQotICAgIGludDMyX3QJQ29weShjb25zdCBDRlhfQmFzZUFycmF5ICZzcmMsIGludDMyX3QgaVN0YXJ0ID0gMCwgaW50MzJfdCBpQ291bnQgPSAtMSk7DQotICAgIGludDMyX3QJUmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCA9IC0xKTsNCi0gICAgdm9pZAkJUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpOw0KLSAgICB2b2lkKgltX3BEYXRhOw0KK2NsYXNzIENGWF9CYXNlQXJyYXkgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHByb3RlY3RlZDoNCisgIENGWF9CYXNlQXJyYXkoaW50MzJfdCBpR3Jvd1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSk7DQorICB+Q0ZYX0Jhc2VBcnJheSgpOw0KKyAgaW50MzJfdCBHZXRTaXplKCkgY29uc3Q7DQorICBpbnQzMl90IEdldEJsb2NrU2l6ZSgpIGNvbnN0Ow0KKyAgdWludDhfdCogQWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KTsNCisgIHVpbnQ4X3QqIEdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3Q7DQorICBpbnQzMl90IEFwcGVuZChjb25zdCBDRlhfQmFzZUFycmF5JiBzcmMsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IC0xKTsNCisgIGludDMyX3QgQ29weShjb25zdCBDRlhfQmFzZUFycmF5JiBzcmMsDQorICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gLTEpOw0KKyAgaW50MzJfdCBSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50ID0gLTEpOw0KKyAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSk7DQorICB2b2lkKiBtX3BEYXRhOw0KIH07DQotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQotY2xhc3MgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9CYXNlQXJyYXkNCi17DQotcHVibGljOg0KLSAgICBDRlhfQmFzZUFycmF5VGVtcGxhdGUoaW50MzJfdCBpR3Jvd1NpemUgPSAxMDApIDogQ0ZYX0Jhc2VBcnJheShpR3Jvd1NpemUsIHNpemVvZihiYXNlVHlwZSkpIHt9DQotICAgIENGWF9CYXNlQXJyYXlUZW1wbGF0ZShpbnQzMl90IGlHcm93U2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKSA6IENGWF9CYXNlQXJyYXkoaUdyb3dTaXplLCBpQmxvY2tTaXplKSB7fQ0KLSAgICBpbnQzMl90CUdldFNpemUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpOw0KLSAgICB9DQotICAgIGludDMyX3QJR2V0QmxvY2tTaXplKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENGWF9CYXNlQXJyYXk6OkdldEJsb2NrU2l6ZSgpOw0KLSAgICB9DQotICAgIGJhc2VUeXBlKglBZGRTcGFjZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlQXJyYXk6OkFkZFNwYWNlVG8oQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90CUFkZChjb25zdCBiYXNlVHlwZSAmZWxlbWVudCkNCi0gICAgew0KLSAgICAgICAgaW50MzJfdCBpbmRleCA9IENGWF9CYXNlQXJyYXk6OkdldFNpemUoKTsNCi0gICAgICAgICooYmFzZVR5cGUqKUNGWF9CYXNlQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCi0gICAgICAgIHJldHVybiBpbmRleDsNCi0gICAgfQ0KLSAgICBiYXNlVHlwZSoJR2V0QnVmZmVyKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QnVmZmVyKCk7DQotICAgIH0NCi0gICAgYmFzZVR5cGUmCUdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAqKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpHZXRBdChpbmRleCk7DQotICAgIH0NCi0gICAgYmFzZVR5cGUqCUdldFB0ckF0KGludDMyX3QgaW5kZXgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlQXJyYXk6OkdldEF0KGluZGV4KTsNCi0gICAgfQ0KLSAgICB2b2lkCQlTZXRBdChpbnQzMl90IGluZGV4LCBjb25zdCBiYXNlVHlwZSAmZWxlbWVudCkNCi0gICAgew0KLSAgICAgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpID0gZWxlbWVudDsNCi0gICAgfQ0KLSAgICB2b2lkCQlTZXRBdEdyb3coaW50MzJfdCBpbmRleCwgY29uc3QgYmFzZVR5cGUgJmVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgICooYmFzZVR5cGUqKUNGWF9CYXNlQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCi0gICAgfQ0KLSAgICBpbnQzMl90CUFwcGVuZChjb25zdCBDRlhfQmFzZUFycmF5VGVtcGxhdGUgJnNyYywgaW50MzJfdCBpU3RhcnQgPSAwLCBpbnQzMl90IGlDb3VudCA9IC0xKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6QXBwZW5kKHNyYywgaVN0YXJ0LCBpQ291bnQpOw0KLSAgICB9DQotICAgIGludDMyX3QJQ29weShjb25zdCBDRlhfQmFzZUFycmF5VGVtcGxhdGUgJnNyYywgaW50MzJfdCBpU3RhcnQgPSAwLCBpbnQzMl90IGlDb3VudCA9IC0xKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6Q29weShzcmMsIGlTdGFydCwgaUNvdW50KTsNCi0gICAgfQ0KLSAgICBpbnQzMl90CVJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQgPSAtMSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENGWF9CYXNlQXJyYXk6OlJlbW92ZUxhc3QoaUNvdW50KTsNCi0gICAgfQ0KLSAgICB2b2lkCQlSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkNCi0gICAgew0KLSAgICAgICAgQ0ZYX0Jhc2VBcnJheTo6UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQotICAgIH0NCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9CYXNlQXJyYXkgew0KKyBwdWJsaWM6DQorICBDRlhfQmFzZUFycmF5VGVtcGxhdGUoaW50MzJfdCBpR3Jvd1NpemUgPSAxMDApDQorICAgICAgOiBDRlhfQmFzZUFycmF5KGlHcm93U2l6ZSwgc2l6ZW9mKGJhc2VUeXBlKSkge30NCisgIENGWF9CYXNlQXJyYXlUZW1wbGF0ZShpbnQzMl90IGlHcm93U2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKQ0KKyAgICAgIDogQ0ZYX0Jhc2VBcnJheShpR3Jvd1NpemUsIGlCbG9ja1NpemUpIHt9DQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCk7IH0NCisgIGludDMyX3QgR2V0QmxvY2tTaXplKCkgY29uc3QgeyByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6R2V0QmxvY2tTaXplKCk7IH0NCisgIGJhc2VUeXBlKiBBZGRTcGFjZSgpIHsNCisgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6QWRkU3BhY2VUbyhDRlhfQmFzZUFycmF5OjpHZXRTaXplKCkpOw0KKyAgfQ0KKyAgaW50MzJfdCBBZGQoY29uc3QgYmFzZVR5cGUmIGVsZW1lbnQpIHsNCisgICAgaW50MzJfdCBpbmRleCA9IENGWF9CYXNlQXJyYXk6OkdldFNpemUoKTsNCisgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6QWRkU3BhY2VUbyhpbmRleCkgPSBlbGVtZW50Ow0KKyAgICByZXR1cm4gaW5kZXg7DQorICB9DQorICBiYXNlVHlwZSogR2V0QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpHZXRCdWZmZXIoKTsgfQ0KKyAgYmFzZVR5cGUmIEdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgcmV0dXJuICooYmFzZVR5cGUqKUNGWF9CYXNlQXJyYXk6OkdldEF0KGluZGV4KTsNCisgIH0NCisgIGJhc2VUeXBlKiBHZXRQdHJBdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlQXJyYXk6OkdldEF0KGluZGV4KTsNCisgIH0NCisgIHZvaWQgU2V0QXQoaW50MzJfdCBpbmRleCwgY29uc3QgYmFzZVR5cGUmIGVsZW1lbnQpIHsNCisgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpID0gZWxlbWVudDsNCisgIH0NCisgIHZvaWQgU2V0QXRHcm93KGludDMyX3QgaW5kZXgsIGNvbnN0IGJhc2VUeXBlJiBlbGVtZW50KSB7DQorICAgICooYmFzZVR5cGUqKUNGWF9CYXNlQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCisgIH0NCisgIGludDMyX3QgQXBwZW5kKGNvbnN0IENGWF9CYXNlQXJyYXlUZW1wbGF0ZSYgc3JjLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSkgew0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6QXBwZW5kKHNyYywgaVN0YXJ0LCBpQ291bnQpOw0KKyAgfQ0KKyAgaW50MzJfdCBDb3B5KGNvbnN0IENGWF9CYXNlQXJyYXlUZW1wbGF0ZSYgc3JjLA0KKyAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IC0xKSB7DQorICAgIHJldHVybiBDRlhfQmFzZUFycmF5OjpDb3B5KHNyYywgaVN0YXJ0LCBpQ291bnQpOw0KKyAgfQ0KKyAgaW50MzJfdCBSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50ID0gLTEpIHsNCisgICAgcmV0dXJuIENGWF9CYXNlQXJyYXk6OlJlbW92ZUxhc3QoaUNvdW50KTsNCisgIH0NCisgIHZvaWQgUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpIHsNCisgICAgQ0ZYX0Jhc2VBcnJheTo6UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorICB9DQogfTsNCi10eXBlZGVmIENGWF9CYXNlQXJyYXlUZW1wbGF0ZTx2b2lkKj4JQ0ZERV9QdHJBcnJheTsNCi10eXBlZGVmIENGWF9CYXNlQXJyYXlUZW1wbGF0ZTxGWF9EV09SRD4JCUNGREVfRFdvcmRBcnJheTsNCi10eXBlZGVmIENGWF9CYXNlQXJyYXlUZW1wbGF0ZTxGWF9XT1JEPgkJQ0ZERV9Xb3JkQXJyYXk7DQotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQotY2xhc3MgQ0ZYX09iamVjdEJhc2VBcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9CYXNlQXJyYXkNCi17DQotcHVibGljOg0KLSAgICBDRlhfT2JqZWN0QmFzZUFycmF5VGVtcGxhdGUoaW50MzJfdCBpR3Jvd1NpemUgPSAxMDApIDogQ0ZYX0Jhc2VBcnJheShpR3Jvd1NpemUsIHNpemVvZihiYXNlVHlwZSkpIHt9DQotICAgIH5DRlhfT2JqZWN0QmFzZUFycmF5VGVtcGxhdGUoKQ0KLSAgICB7DQotICAgICAgICBSZW1vdmVBbGwoRkFMU0UpOw0KK3R5cGVkZWYgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlPHZvaWQqPiBDRkRFX1B0ckFycmF5Ow0KK3R5cGVkZWYgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlPEZYX0RXT1JEPiBDRkRFX0RXb3JkQXJyYXk7DQordHlwZWRlZiBDRlhfQmFzZUFycmF5VGVtcGxhdGU8RlhfV09SRD4gQ0ZERV9Xb3JkQXJyYXk7DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9PYmplY3RCYXNlQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQmFzZUFycmF5IHsNCisgcHVibGljOg0KKyAgQ0ZYX09iamVjdEJhc2VBcnJheVRlbXBsYXRlKGludDMyX3QgaUdyb3dTaXplID0gMTAwKQ0KKyAgICAgIDogQ0ZYX0Jhc2VBcnJheShpR3Jvd1NpemUsIHNpemVvZihiYXNlVHlwZSkpIHt9DQorICB+Q0ZYX09iamVjdEJhc2VBcnJheVRlbXBsYXRlKCkgeyBSZW1vdmVBbGwoRkFMU0UpOyB9DQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCk7IH0NCisgIGludDMyX3QgR2V0QmxvY2tTaXplKCkgY29uc3QgeyByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6R2V0QmxvY2tTaXplKCk7IH0NCisgIGludDMyX3QgQWRkKGNvbnN0IGJhc2VUeXBlJiBlbGVtZW50KSB7DQorICAgIGludDMyX3QgaW5kZXggPSBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCk7DQorICAgIGJhc2VUeXBlKiBwID0gKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKGluZGV4KTsNCisgICAgbmV3ICgodm9pZCopcCkgYmFzZVR5cGUoZWxlbWVudCk7DQorICAgIHJldHVybiBpbmRleDsNCisgIH0NCisgIGJhc2VUeXBlJiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIHJldHVybiAqKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpHZXRBdChpbmRleCk7DQorICB9DQorICBiYXNlVHlwZSogR2V0UHRyQXQoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpHZXRBdChpbmRleCk7DQorICB9DQorICBpbnQzMl90IEFwcGVuZChjb25zdCBDRlhfT2JqZWN0QmFzZUFycmF5VGVtcGxhdGUmIHNyYywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gLTEpIHsNCisgICAgRlhTWVNfYXNzZXJ0KEdldEJsb2NrU2l6ZSgpID09IHNyYy5HZXRCbG9ja1NpemUoKSk7DQorICAgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICAgIHJldHVybiAwOw0KICAgICB9DQotICAgIGludDMyX3QJR2V0U2l6ZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCk7DQorICAgIGludDMyX3QgaVNpemUgPSBzcmMuR2V0U2l6ZSgpOw0KKyAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgaVNpemUpOw0KKyAgICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICAgIGlDb3VudCA9IGlTaXplOw0KICAgICB9DQotICAgIGludDMyX3QJR2V0QmxvY2tTaXplKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENGWF9CYXNlQXJyYXk6OkdldEJsb2NrU2l6ZSgpOw0KKyAgICBpZiAoaVN0YXJ0ICsgaUNvdW50ID4gaVNpemUpIHsNCisgICAgICBpQ291bnQgPSBpU2l6ZSAtIGlTdGFydDsNCiAgICAgfQ0KLSAgICBpbnQzMl90CUFkZChjb25zdCBiYXNlVHlwZSAmZWxlbWVudCkNCi0gICAgew0KLSAgICAgICAgaW50MzJfdCBpbmRleCA9IENGWF9CYXNlQXJyYXk6OkdldFNpemUoKTsNCi0gICAgICAgIGJhc2VUeXBlICpwID0gKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKGluZGV4KTsNCi0gICAgICAgIG5ldyAoKHZvaWQqKXApIGJhc2VUeXBlKGVsZW1lbnQpOw0KLSAgICAgICAgcmV0dXJuIGluZGV4Ow0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgIHJldHVybiAwOw0KICAgICB9DQotICAgIGJhc2VUeXBlJglHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKihiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgICBpU2l6ZSA9IENGWF9CYXNlQXJyYXk6OkdldFNpemUoKTsNCisgICAgQ0ZYX0Jhc2VBcnJheTo6QWRkU3BhY2VUbyhpU2l6ZSArIGlDb3VudCAtIDEpOw0KKyAgICB1aW50OF90KiogcFN0YXJ0ID0gQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaVNpemUpOw0KKyAgICBpbnQzMl90IGlCbG9ja1NpemUgPSBDRlhfQmFzZUFycmF5OjpHZXRCbG9ja1NpemUoKTsNCisgICAgaVNpemUgPSBpU3RhcnQgKyBpQ291bnQ7DQorICAgIGZvciAoaW50MzJfdCBpID0gaVN0YXJ0OyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgIEZYVEFSR0VUX05ld1dpdGgoKHZvaWQqKXBTdGFydCkgYmFzZVR5cGUoc3JjLkdldEF0KGkpKTsNCisgICAgICBwU3RhcnQgKz0gaUJsb2NrU2l6ZTsNCiAgICAgfQ0KLSAgICBiYXNlVHlwZSoJR2V0UHRyQXQoaW50MzJfdCBpbmRleCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgICByZXR1cm4gaUNvdW50Ow0KKyAgfQ0KKyAgaW50MzJfdCBDb3B5KGNvbnN0IENGWF9PYmplY3RCYXNlQXJyYXlUZW1wbGF0ZSYgc3JjLA0KKyAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IC0xKSB7DQorICAgIEZYU1lTX2Fzc2VydChHZXRCbG9ja1NpemUoKSA9PSBzcmMuR2V0QmxvY2tTaXplKCkpOw0KKyAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICByZXR1cm4gMDsNCiAgICAgfQ0KLSAgICBpbnQzMl90CUFwcGVuZChjb25zdCBDRlhfT2JqZWN0QmFzZUFycmF5VGVtcGxhdGUgJnNyYywgaW50MzJfdCBpU3RhcnQgPSAwLCBpbnQzMl90IGlDb3VudCA9IC0xKQ0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQoR2V0QmxvY2tTaXplKCkgPT0gc3JjLkdldEJsb2NrU2l6ZSgpKTsNCi0gICAgICAgIGlmIChpQ291bnQgPT0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpU2l6ZSA9IHNyYy5HZXRTaXplKCk7DQotICAgICAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgaVNpemUpOw0KLSAgICAgICAgaWYgKGlDb3VudCA8IDApIHsNCi0gICAgICAgICAgICBpQ291bnQgPSBpU2l6ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpU2l6ZSkgew0KLSAgICAgICAgICAgIGlDb3VudCA9IGlTaXplIC0gaVN0YXJ0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlDb3VudCA8IDEpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlTaXplID0gQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpOw0KLSAgICAgICAgQ0ZYX0Jhc2VBcnJheTo6QWRkU3BhY2VUbyhpU2l6ZSArIGlDb3VudCAtIDEpOw0KLSAgICAgICAgdWludDhfdCogKnBTdGFydCA9IENGWF9CYXNlQXJyYXk6OkdldEF0KGlTaXplKTsNCi0gICAgICAgIGludDMyX3QgaUJsb2NrU2l6ZSA9IENGWF9CYXNlQXJyYXk6OkdldEJsb2NrU2l6ZSgpOw0KLSAgICAgICAgaVNpemUgPSBpU3RhcnQgKyBpQ291bnQ7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGlTaXplOyBpICsrKSB7DQotICAgICAgICAgICAgRlhUQVJHRVRfTmV3V2l0aCAoKHZvaWQqKXBTdGFydCliYXNlVHlwZShzcmMuR2V0QXQoaSkpOw0KLSAgICAgICAgICAgIHBTdGFydCArPSBpQmxvY2tTaXplOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGlDb3VudDsNCisgICAgaW50MzJfdCBpU2l6ZSA9IHNyYy5HZXRTaXplKCk7DQorICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpU2l6ZSk7DQorICAgIGlmIChpQ291bnQgPCAwKSB7DQorICAgICAgaUNvdW50ID0gaVNpemU7DQogICAgIH0NCi0gICAgaW50MzJfdAlDb3B5KGNvbnN0IENGWF9PYmplY3RCYXNlQXJyYXlUZW1wbGF0ZSAmc3JjLCBpbnQzMl90IGlTdGFydCA9IDAsIGludDMyX3QgaUNvdW50ID0gLTEpDQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChHZXRCbG9ja1NpemUoKSA9PSBzcmMuR2V0QmxvY2tTaXplKCkpOw0KLSAgICAgICAgaWYgKGlDb3VudCA9PSAwKSB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlTaXplID0gc3JjLkdldFNpemUoKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpU2l6ZSk7DQotICAgICAgICBpZiAoaUNvdW50IDwgMCkgew0KLSAgICAgICAgICAgIGlDb3VudCA9IGlTaXplOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlTdGFydCArIGlDb3VudCA+IGlTaXplKSB7DQotICAgICAgICAgICAgaUNvdW50ID0gaVNpemUgLSBpU3RhcnQ7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaUNvdW50IDwgMSkgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgUmVtb3ZlQWxsKFRSVUUpOw0KLSAgICAgICAgQ0ZYX0Jhc2VBcnJheTo6QWRkU3BhY2VUbyhpQ291bnQgLSAxKTsNCi0gICAgICAgIHVpbnQ4X3QqICpwU3RhcnQgPSBDRlhfQmFzZUFycmF5OjpHZXRBdCgwKTsNCi0gICAgICAgIGludDMyX3QgaUJsb2NrU2l6ZSA9IENGWF9CYXNlQXJyYXk6OkdldEJsb2NrU2l6ZSgpOw0KLSAgICAgICAgaVNpemUgPSBpU3RhcnQgKyBpQ291bnQ7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGlTaXplOyBpICsrKSB7DQotICAgICAgICAgICAgbmV3ICgodm9pZCopcFN0YXJ0KWJhc2VUeXBlKHNyYy5HZXRBdChpKSk7DQotICAgICAgICAgICAgcFN0YXJ0ICs9IGlCbG9ja1NpemU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaUNvdW50Ow0KKyAgICBpZiAoaVN0YXJ0ICsgaUNvdW50ID4gaVNpemUpIHsNCisgICAgICBpQ291bnQgPSBpU2l6ZSAtIGlTdGFydDsNCiAgICAgfQ0KLSAgICBpbnQzMl90CVJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQgPSAtMSkNCi0gICAgew0KLSAgICAgICAgaW50MzJfdCBpU2l6ZSA9IENGWF9CYXNlQXJyYXk6OkdldFNpemUoKTsNCi0gICAgICAgIGlmIChpQ291bnQgPCAwIHx8IGlDb3VudCA+IGlTaXplKSB7DQotICAgICAgICAgICAgaUNvdW50ID0gaVNpemU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaUNvdW50ID09IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gaVNpemU7DQotICAgICAgICB9DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IGlTaXplIC0gaUNvdW50OyBpIDwgaVNpemU7IGkgKyspIHsNCi0gICAgICAgICAgICAoKGJhc2VUeXBlKilHZXRQdHJBdChpKSktPn5iYXNlVHlwZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIENGWF9CYXNlQXJyYXk6OlJlbW92ZUxhc3QoaUNvdW50KTsNCisgICAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgICByZXR1cm4gMDsNCiAgICAgfQ0KLSAgICB2b2lkCQlSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkNCi0gICAgew0KLSAgICAgICAgaW50MzJfdCBpU2l6ZSA9IENGWF9CYXNlQXJyYXk6OkdldFNpemUoKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpICsrKSB7DQotICAgICAgICAgICAgKChiYXNlVHlwZSopR2V0UHRyQXQoaSkpLT5+YmFzZVR5cGUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9CYXNlQXJyYXk6OlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOw0KKyAgICBSZW1vdmVBbGwoVFJVRSk7DQorICAgIENGWF9CYXNlQXJyYXk6OkFkZFNwYWNlVG8oaUNvdW50IC0gMSk7DQorICAgIHVpbnQ4X3QqKiBwU3RhcnQgPSBDRlhfQmFzZUFycmF5OjpHZXRBdCgwKTsNCisgICAgaW50MzJfdCBpQmxvY2tTaXplID0gQ0ZYX0Jhc2VBcnJheTo6R2V0QmxvY2tTaXplKCk7DQorICAgIGlTaXplID0gaVN0YXJ0ICsgaUNvdW50Ow0KKyAgICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICBuZXcgKCh2b2lkKilwU3RhcnQpIGJhc2VUeXBlKHNyYy5HZXRBdChpKSk7DQorICAgICAgcFN0YXJ0ICs9IGlCbG9ja1NpemU7DQogICAgIH0NCisgICAgcmV0dXJuIGlDb3VudDsNCisgIH0NCisgIGludDMyX3QgUmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCA9IC0xKSB7DQorICAgIGludDMyX3QgaVNpemUgPSBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCk7DQorICAgIGlmIChpQ291bnQgPCAwIHx8IGlDb3VudCA+IGlTaXplKSB7DQorICAgICAgaUNvdW50ID0gaVNpemU7DQorICAgIH0NCisgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgcmV0dXJuIGlTaXplOw0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBpID0gaVNpemUgLSBpQ291bnQ7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgKChiYXNlVHlwZSopR2V0UHRyQXQoaSkpLT5+YmFzZVR5cGUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6UmVtb3ZlTGFzdChpQ291bnQpOw0KKyAgfQ0KKyAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkgew0KKyAgICBpbnQzMl90IGlTaXplID0gQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgKChiYXNlVHlwZSopR2V0UHRyQXQoaSkpLT5+YmFzZVR5cGUoKTsNCisgICAgfQ0KKyAgICBDRlhfQmFzZUFycmF5OjpSZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCisgIH0NCiB9Ow0KLWNsYXNzIENGWF9CYXNlTWFzc0FycmF5IDogcHVibGljIENGWF9UYXJnZXQNCi17DQotcHJvdGVjdGVkOg0KLSAgICBDRlhfQmFzZU1hc3NBcnJheShpbnQzMl90IGlDaHVua1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSk7DQotICAgIH5DRlhfQmFzZU1hc3NBcnJheSgpOw0KLSAgICBpbnQzMl90CUdldFNpemUoKSBjb25zdDsNCi0gICAgdWludDhfdCoJQWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KTsNCi0gICAgdWludDhfdCoJR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Q7DQotICAgIGludDMyX3QJQXBwZW5kKGNvbnN0IENGWF9CYXNlTWFzc0FycmF5ICZzcmMsIGludDMyX3QgaVN0YXJ0ID0gMCwgaW50MzJfdCBpQ291bnQgPSAtMSk7DQotICAgIGludDMyX3QJQ29weShjb25zdCBDRlhfQmFzZU1hc3NBcnJheSAmc3JjLCBpbnQzMl90IGlTdGFydCA9IDAsIGludDMyX3QgaUNvdW50ID0gLTEpOw0KLSAgICBpbnQzMl90CVJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQgPSAtMSk7DQotICAgIHZvaWQJCVJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKTsNCi0gICAgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqIG1fcERhdGE7DQorY2xhc3MgQ0ZYX0Jhc2VNYXNzQXJyYXkgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHByb3RlY3RlZDoNCisgIENGWF9CYXNlTWFzc0FycmF5KGludDMyX3QgaUNodW5rU2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKTsNCisgIH5DRlhfQmFzZU1hc3NBcnJheSgpOw0KKyAgaW50MzJfdCBHZXRTaXplKCkgY29uc3Q7DQorICB1aW50OF90KiBBZGRTcGFjZVRvKGludDMyX3QgaW5kZXgpOw0KKyAgdWludDhfdCogR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Q7DQorICBpbnQzMl90IEFwcGVuZChjb25zdCBDRlhfQmFzZU1hc3NBcnJheSYgc3JjLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSk7DQorICBpbnQzMl90IENvcHkoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXkmIHNyYywNCisgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSk7DQorICBpbnQzMl90IFJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQgPSAtMSk7DQorICB2b2lkIFJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKTsNCisgIENGWF9CYXNlTWFzc0FycmF5SW1wKiBtX3BEYXRhOw0KIH07DQotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQotY2xhc3MgQ0ZYX01hc3NBcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9CYXNlTWFzc0FycmF5DQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX01hc3NBcnJheVRlbXBsYXRlKGludDMyX3QgaUNodW5rU2l6ZSA9IDEwMCkgOiBDRlhfQmFzZU1hc3NBcnJheShpQ2h1bmtTaXplLCBzaXplb2YoYmFzZVR5cGUpKSB7fQ0KLSAgICBDRlhfTWFzc0FycmF5VGVtcGxhdGUoaW50MzJfdCBpQ2h1bmtTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpIDogQ0ZYX0Jhc2VNYXNzQXJyYXkoaUNodW5rU2l6ZSwgaUJsb2NrU2l6ZSkge30NCi0gICAgaW50MzJfdAlHZXRTaXplKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQotICAgIH0NCi0gICAgYmFzZVR5cGUqCUFkZFNwYWNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFkZFNwYWNlVG8oQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKSk7DQotICAgIH0NCi0gICAgaW50MzJfdAlBZGQoY29uc3QgYmFzZVR5cGUgJmVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgIGludDMyX3QgaW5kZXggPSBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KLSAgICAgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCi0gICAgICAgIHJldHVybiBpbmRleDsNCi0gICAgfQ0KLSAgICBiYXNlVHlwZSYJR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICooYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpHZXRBdChpbmRleCk7DQotICAgIH0NCi0gICAgYmFzZVR5cGUqCUdldFB0ckF0KGludDMyX3QgaW5kZXgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpHZXRBdChpbmRleCk7DQotICAgIH0NCi0gICAgdm9pZAkJU2V0QXQoaW50MzJfdCBpbmRleCwgY29uc3QgYmFzZVR5cGUgJmVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgICooYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpHZXRBdChpbmRleCkgPSBlbGVtZW50Ow0KLSAgICB9DQotICAgIHZvaWQJCVNldEF0R3JvdyhpbnQzMl90IGluZGV4LCBjb25zdCBiYXNlVHlwZSAmZWxlbWVudCkNCi0gICAgew0KLSAgICAgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCi0gICAgfQ0KLSAgICBpbnQzMl90CUFwcGVuZChjb25zdCBDRlhfTWFzc0FycmF5VGVtcGxhdGUgJnNyYywgaW50MzJfdCBpU3RhcnQgPSAwLCBpbnQzMl90IGlDb3VudCA9IC0xKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFwcGVuZChzcmMsIGlTdGFydCwgaUNvdW50KTsNCi0gICAgfQ0KLSAgICBpbnQzMl90CUNvcHkoY29uc3QgQ0ZYX01hc3NBcnJheVRlbXBsYXRlICZzcmMsIGludDMyX3QgaVN0YXJ0ID0gMCwgaW50MzJfdCBpQ291bnQgPSAtMSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpDb3B5KHNyYywgaVN0YXJ0LCBpQ291bnQpOw0KLSAgICB9DQotICAgIGludDMyX3QJUmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCA9IC0xKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OlJlbW92ZUxhc3QoaUNvdW50KTsNCi0gICAgfQ0KLSAgICB2b2lkCQlSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkNCi0gICAgew0KLSAgICAgICAgQ0ZYX0Jhc2VNYXNzQXJyYXk6OlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOw0KLSAgICB9DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9NYXNzQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQmFzZU1hc3NBcnJheSB7DQorIHB1YmxpYzoNCisgIENGWF9NYXNzQXJyYXlUZW1wbGF0ZShpbnQzMl90IGlDaHVua1NpemUgPSAxMDApDQorICAgICAgOiBDRlhfQmFzZU1hc3NBcnJheShpQ2h1bmtTaXplLCBzaXplb2YoYmFzZVR5cGUpKSB7fQ0KKyAgQ0ZYX01hc3NBcnJheVRlbXBsYXRlKGludDMyX3QgaUNodW5rU2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKQ0KKyAgICAgIDogQ0ZYX0Jhc2VNYXNzQXJyYXkoaUNodW5rU2l6ZSwgaUJsb2NrU2l6ZSkge30NCisgIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7IH0NCisgIGJhc2VUeXBlKiBBZGRTcGFjZSgpIHsNCisgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFkZFNwYWNlVG8oDQorICAgICAgICBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpKTsNCisgIH0NCisgIGludDMyX3QgQWRkKGNvbnN0IGJhc2VUeXBlJiBlbGVtZW50KSB7DQorICAgIGludDMyX3QgaW5kZXggPSBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KKyAgICAqKGJhc2VUeXBlKilDRlhfQmFzZU1hc3NBcnJheTo6QWRkU3BhY2VUbyhpbmRleCkgPSBlbGVtZW50Ow0KKyAgICByZXR1cm4gaW5kZXg7DQorICB9DQorICBiYXNlVHlwZSYgR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICByZXR1cm4gKihiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldEF0KGluZGV4KTsNCisgIH0NCisgIGJhc2VUeXBlKiBHZXRQdHJBdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpHZXRBdChpbmRleCk7DQorICB9DQorICB2b2lkIFNldEF0KGludDMyX3QgaW5kZXgsIGNvbnN0IGJhc2VUeXBlJiBlbGVtZW50KSB7DQorICAgICooYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpHZXRBdChpbmRleCkgPSBlbGVtZW50Ow0KKyAgfQ0KKyAgdm9pZCBTZXRBdEdyb3coaW50MzJfdCBpbmRleCwgY29uc3QgYmFzZVR5cGUmIGVsZW1lbnQpIHsNCisgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCisgIH0NCisgIGludDMyX3QgQXBwZW5kKGNvbnN0IENGWF9NYXNzQXJyYXlUZW1wbGF0ZSYgc3JjLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSkgew0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFwcGVuZChzcmMsIGlTdGFydCwgaUNvdW50KTsNCisgIH0NCisgIGludDMyX3QgQ29weShjb25zdCBDRlhfTWFzc0FycmF5VGVtcGxhdGUmIHNyYywNCisgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSkgew0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkNvcHkoc3JjLCBpU3RhcnQsIGlDb3VudCk7DQorICB9DQorICBpbnQzMl90IFJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQgPSAtMSkgew0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OlJlbW92ZUxhc3QoaUNvdW50KTsNCisgIH0NCisgIHZvaWQgUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpIHsNCisgICAgQ0ZYX0Jhc2VNYXNzQXJyYXk6OlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOw0KKyAgfQ0KIH07DQotdHlwZWRlZiBDRlhfTWFzc0FycmF5VGVtcGxhdGU8dm9pZCo+CUNGWF9QdHJNYXNzQXJyYXk7DQotdHlwZWRlZiBDRlhfTWFzc0FycmF5VGVtcGxhdGU8aW50MzJfdD4JCUNGWF9JbnQzMk1hc3NBcnJheTsNCi10eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxGWF9EV09SRD4JCUNGWF9EV29yZE1hc3NBcnJheTsNCi10eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxGWF9XT1JEPgkJQ0ZYX1dvcmRNYXNzQXJyYXk7DQotdHlwZWRlZiBDRlhfTWFzc0FycmF5VGVtcGxhdGU8Q0ZYX1JlY3Q+CQlDRlhfUmVjdE1hc3NBcnJheTsNCi10eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxDRlhfUmVjdEY+CUNGWF9SZWN0Rk1hc3NBcnJheTsNCi10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4NCi1jbGFzcyBDRlhfT2JqZWN0TWFzc0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VNYXNzQXJyYXkNCi17DQotcHVibGljOg0KLSAgICBDRlhfT2JqZWN0TWFzc0FycmF5VGVtcGxhdGUoaW50MzJfdCBpQ2h1bmtTaXplID0gMTAwKSA6IENGWF9CYXNlTWFzc0FycmF5KGlDaHVua1NpemUsIHNpemVvZihiYXNlVHlwZSkpIHt9DQotICAgIH5DRlhfT2JqZWN0TWFzc0FycmF5VGVtcGxhdGUoKQ0KLSAgICB7DQotICAgICAgICBSZW1vdmVBbGwoRkFMU0UpOw0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPHZvaWQqPiBDRlhfUHRyTWFzc0FycmF5Ow0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPGludDMyX3Q+IENGWF9JbnQzMk1hc3NBcnJheTsNCit0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxGWF9EV09SRD4gQ0ZYX0RXb3JkTWFzc0FycmF5Ow0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPEZYX1dPUkQ+IENGWF9Xb3JkTWFzc0FycmF5Ow0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPENGWF9SZWN0PiBDRlhfUmVjdE1hc3NBcnJheTsNCit0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxDRlhfUmVjdEY+IENGWF9SZWN0Rk1hc3NBcnJheTsNCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9CYXNlTWFzc0FycmF5IHsNCisgcHVibGljOg0KKyAgQ0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlKGludDMyX3QgaUNodW5rU2l6ZSA9IDEwMCkNCisgICAgICA6IENGWF9CYXNlTWFzc0FycmF5KGlDaHVua1NpemUsIHNpemVvZihiYXNlVHlwZSkpIHt9DQorICB+Q0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlKCkgeyBSZW1vdmVBbGwoRkFMU0UpOyB9DQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOyB9DQorICBpbnQzMl90IEFkZChjb25zdCBiYXNlVHlwZSYgZWxlbWVudCkgew0KKyAgICBpbnQzMl90IGluZGV4ID0gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCisgICAgYmFzZVR5cGUqIHAgPSAoYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpBZGRTcGFjZVRvKGluZGV4KTsNCisgICAgbmV3ICgodm9pZCopcCkgYmFzZVR5cGUoZWxlbWVudCk7DQorICAgIHJldHVybiBpbmRleDsNCisgIH0NCisgIGJhc2VUeXBlJiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIHJldHVybiAqKGJhc2VUeXBlKilDRlhfQmFzZU1hc3NBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgfQ0KKyAgYmFzZVR5cGUqIEdldFB0ckF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldEF0KGluZGV4KTsNCisgIH0NCisgIGludDMyX3QgQXBwZW5kKGNvbnN0IENGWF9PYmplY3RNYXNzQXJyYXlUZW1wbGF0ZSYgc3JjLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSkgew0KKyAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCiAgICAgfQ0KLSAgICBpbnQzMl90CUdldFNpemUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCisgICAgaW50MzJfdCBpU2l6ZSA9IHNyYy5HZXRTaXplKCk7DQorICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpU2l6ZSk7DQorICAgIGlmIChpQ291bnQgPCAwKSB7DQorICAgICAgaUNvdW50ID0gaVNpemU7DQogICAgIH0NCi0gICAgaW50MzJfdAlBZGQoY29uc3QgYmFzZVR5cGUgJmVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgIGludDMyX3QgaW5kZXggPSBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KLSAgICAgICAgYmFzZVR5cGUgKnAgPSAoYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpBZGRTcGFjZVRvKGluZGV4KTsNCi0gICAgICAgIG5ldyAoKHZvaWQqKXApYmFzZVR5cGUoZWxlbWVudCk7DQotICAgICAgICByZXR1cm4gaW5kZXg7DQorICAgIGludDMyX3QgaUVuZCA9IGlTdGFydCArIGlDb3VudDsNCisgICAgaWYgKGlFbmQgPiBpU2l6ZSkgew0KKyAgICAgIGlFbmQgPSBpU2l6ZTsNCiAgICAgfQ0KLSAgICBiYXNlVHlwZSYJR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICooYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpHZXRBdChpbmRleCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gaVN0YXJ0OyBpIDwgaUVuZDsgaSsrKSB7DQorICAgICAgQWRkKHNyYy5HZXRBdChpKSk7DQogICAgIH0NCi0gICAgYmFzZVR5cGUqCUdldFB0ckF0KGludDMyX3QgaW5kZXgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpHZXRBdChpbmRleCk7DQorICAgIHJldHVybiBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KKyAgfQ0KKyAgaW50MzJfdCBDb3B5KGNvbnN0IENGWF9PYmplY3RNYXNzQXJyYXlUZW1wbGF0ZSYgc3JjLA0KKyAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IC0xKSB7DQorICAgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICAgIHJldHVybiBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KICAgICB9DQotICAgIGludDMyX3QJQXBwZW5kKGNvbnN0IENGWF9PYmplY3RNYXNzQXJyYXlUZW1wbGF0ZSAmc3JjLCBpbnQzMl90IGlTdGFydCA9IDAsIGludDMyX3QgaUNvdW50ID0gLTEpDQotICAgIHsNCi0gICAgICAgIGlmIChpQ291bnQgPT0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpU2l6ZSA9IHNyYy5HZXRTaXplKCk7DQotICAgICAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgaVNpemUpOw0KLSAgICAgICAgaWYgKGlDb3VudCA8IDApIHsNCi0gICAgICAgICAgICBpQ291bnQgPSBpU2l6ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaUVuZCA9IGlTdGFydCArIGlDb3VudDsNCi0gICAgICAgIGlmIChpRW5kID4gaVNpemUpIHsNCi0gICAgICAgICAgICBpRW5kID0gaVNpemU7DQotICAgICAgICB9DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGlFbmQ7IGkgKyspIHsNCi0gICAgICAgICAgICBBZGQoc3JjLkdldEF0KGkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KKyAgICBpbnQzMl90IGlTaXplID0gc3JjLkdldFNpemUoKTsNCisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IGlTaXplKTsNCisgICAgaWYgKGlDb3VudCA8IDApIHsNCisgICAgICBpQ291bnQgPSBpU2l6ZTsNCiAgICAgfQ0KLSAgICBpbnQzMl90CUNvcHkoY29uc3QgQ0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlICZzcmMsIGludDMyX3QgaVN0YXJ0ID0gMCwgaW50MzJfdCBpQ291bnQgPSAtMSkNCi0gICAgew0KLSAgICAgICAgaWYgKGlDb3VudCA9PSAwKSB7DQotICAgICAgICAgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlTaXplID0gc3JjLkdldFNpemUoKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpU2l6ZSk7DQotICAgICAgICBpZiAoaUNvdW50IDwgMCkgew0KLSAgICAgICAgICAgIGlDb3VudCA9IGlTaXplOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpRW5kID0gaVN0YXJ0ICsgaUNvdW50Ow0KLSAgICAgICAgaWYgKGlFbmQgPiBpU2l6ZSkgew0KLSAgICAgICAgICAgIGlFbmQgPSBpU2l6ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIFJlbW92ZUFsbChUUlVFKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gaVN0YXJ0OyBpIDwgaUVuZDsgaSArKykgew0KLSAgICAgICAgICAgIEFkZChzcmMuR2V0QXQoaSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQorICAgIGludDMyX3QgaUVuZCA9IGlTdGFydCArIGlDb3VudDsNCisgICAgaWYgKGlFbmQgPiBpU2l6ZSkgew0KKyAgICAgIGlFbmQgPSBpU2l6ZTsNCiAgICAgfQ0KLSAgICBpbnQzMl90CVJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQgPSAtMSkNCi0gICAgew0KLSAgICAgICAgaW50MzJfdCBpU2l6ZSA9IENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQotICAgICAgICBpZiAoaUNvdW50IDwgMCB8fCBpQ291bnQgPiBpU2l6ZSkgew0KLSAgICAgICAgICAgIGlDb3VudCA9IGlTaXplOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlDb3VudCA9PSAwKSB7DQotICAgICAgICAgICAgcmV0dXJuIGlTaXplOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSBpU2l6ZSAtIGlDb3VudDsgaSA8IGlTaXplOyBpICsrKSB7DQotICAgICAgICAgICAgKChiYXNlVHlwZSopR2V0UHRyQXQoaSkpLT5+YmFzZVR5cGUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDRlhfQmFzZU1hc3NBcnJheTo6UmVtb3ZlTGFzdChpQ291bnQpOw0KKyAgICBSZW1vdmVBbGwoVFJVRSk7DQorICAgIGZvciAoaW50MzJfdCBpID0gaVN0YXJ0OyBpIDwgaUVuZDsgaSsrKSB7DQorICAgICAgQWRkKHNyYy5HZXRBdChpKSk7DQogICAgIH0NCi0gICAgdm9pZAkJUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpDQotICAgIHsNCi0gICAgICAgIGludDMyX3QgaVNpemUgPSBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkgKyspIHsNCi0gICAgICAgICAgICAoKGJhc2VUeXBlKilHZXRQdHJBdChpKSktPn5iYXNlVHlwZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX0Jhc2VNYXNzQXJyYXk6OlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOw0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCisgIH0NCisgIGludDMyX3QgUmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCA9IC0xKSB7DQorICAgIGludDMyX3QgaVNpemUgPSBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KKyAgICBpZiAoaUNvdW50IDwgMCB8fCBpQ291bnQgPiBpU2l6ZSkgew0KKyAgICAgIGlDb3VudCA9IGlTaXplOw0KICAgICB9DQorICAgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICAgIHJldHVybiBpU2l6ZTsNCisgICAgfQ0KKyAgICBmb3IgKGludDMyX3QgaSA9IGlTaXplIC0gaUNvdW50OyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgICgoYmFzZVR5cGUqKUdldFB0ckF0KGkpKS0+fmJhc2VUeXBlKCk7DQorICAgIH0NCisgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpSZW1vdmVMYXN0KGlDb3VudCk7DQorICB9DQorICB2b2lkIFJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKSB7DQorICAgIGludDMyX3QgaVNpemUgPSBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgKChiYXNlVHlwZSopR2V0UHRyQXQoaSkpLT5+YmFzZVR5cGUoKTsNCisgICAgfQ0KKyAgICBDRlhfQmFzZU1hc3NBcnJheTo6UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorICB9DQogfTsNCi1jbGFzcyBDRlhfQmFzZURpc2NyZXRlQXJyYXkgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wcm90ZWN0ZWQ6DQotICAgIENGWF9CYXNlRGlzY3JldGVBcnJheShpbnQzMl90IGlDaHVua1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSk7DQotICAgIH5DRlhfQmFzZURpc2NyZXRlQXJyYXkoKTsNCi0gICAgdWludDhfdCoJQWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KTsNCi0gICAgdWludDhfdCoJR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Q7DQotICAgIHZvaWQJCVJlbW92ZUFsbCgpOw0KLSAgICB2b2lkKgltX3BEYXRhOw0KK2NsYXNzIENGWF9CYXNlRGlzY3JldGVBcnJheSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5KGludDMyX3QgaUNodW5rU2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKTsNCisgIH5DRlhfQmFzZURpc2NyZXRlQXJyYXkoKTsNCisgIHVpbnQ4X3QqIEFkZFNwYWNlVG8oaW50MzJfdCBpbmRleCk7DQorICB1aW50OF90KiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdDsNCisgIHZvaWQgUmVtb3ZlQWxsKCk7DQorICB2b2lkKiBtX3BEYXRhOw0KIH07DQotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQotY2xhc3MgQ0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQmFzZURpc2NyZXRlQXJyYXkNCi17DQotcHVibGljOg0KLSAgICBDRlhfRGlzY3JldGVBcnJheVRlbXBsYXRlKGludDMyX3QgaUNodW5rU2l6ZSA9IDEwMCkgOiBDRlhfQmFzZURpc2NyZXRlQXJyYXkoaUNodW5rU2l6ZSwgc2l6ZW9mKGJhc2VUeXBlKSkge30NCi0gICAgYmFzZVR5cGUmCUdldEF0KGludDMyX3QgaW5kZXgsIGNvbnN0IGJhc2VUeXBlICZkZWZWYWx1ZSkgY29uc3QNCi0gICAgew0KLSAgICAgICAgYmFzZVR5cGUgKnAgPSAoYmFzZVR5cGUqKUNGWF9CYXNlRGlzY3JldGVBcnJheTo6R2V0QXQoaW5kZXgpOw0KLSAgICAgICAgcmV0dXJuIHAgPT0gTlVMTCA/IChiYXNlVHlwZSYpZGVmVmFsdWUgOiAqcDsNCi0gICAgfQ0KLSAgICBiYXNlVHlwZSoJR2V0UHRyQXQoaW50MzJfdCBpbmRleCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpHZXRBdChpbmRleCk7DQotICAgIH0NCi0gICAgdm9pZAkJU2V0QXRHcm93KGludDMyX3QgaW5kZXgsIGNvbnN0IGJhc2VUeXBlICZlbGVtZW50KQ0KLSAgICB7DQotICAgICAgICAqKGJhc2VUeXBlKilDRlhfQmFzZURpc2NyZXRlQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCi0gICAgfQ0KLSAgICB2b2lkCQlSZW1vdmVBbGwoKQ0KLSAgICB7DQotICAgICAgICBDRlhfQmFzZURpc2NyZXRlQXJyYXk6OlJlbW92ZUFsbCgpOw0KLSAgICB9DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9EaXNjcmV0ZUFycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5IHsNCisgcHVibGljOg0KKyAgQ0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZShpbnQzMl90IGlDaHVua1NpemUgPSAxMDApDQorICAgICAgOiBDRlhfQmFzZURpc2NyZXRlQXJyYXkoaUNodW5rU2l6ZSwgc2l6ZW9mKGJhc2VUeXBlKSkge30NCisgIGJhc2VUeXBlJiBHZXRBdChpbnQzMl90IGluZGV4LCBjb25zdCBiYXNlVHlwZSYgZGVmVmFsdWUpIGNvbnN0IHsNCisgICAgYmFzZVR5cGUqIHAgPSAoYmFzZVR5cGUqKUNGWF9CYXNlRGlzY3JldGVBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgICByZXR1cm4gcCA9PSBOVUxMID8gKGJhc2VUeXBlJilkZWZWYWx1ZSA6ICpwOw0KKyAgfQ0KKyAgYmFzZVR5cGUqIEdldFB0ckF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpHZXRBdChpbmRleCk7DQorICB9DQorICB2b2lkIFNldEF0R3JvdyhpbnQzMl90IGluZGV4LCBjb25zdCBiYXNlVHlwZSYgZWxlbWVudCkgew0KKyAgICAqKGJhc2VUeXBlKilDRlhfQmFzZURpc2NyZXRlQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCisgIH0NCisgIHZvaWQgUmVtb3ZlQWxsKCkgeyBDRlhfQmFzZURpc2NyZXRlQXJyYXk6OlJlbW92ZUFsbCgpOyB9DQogfTsNCi10eXBlZGVmIENGWF9EaXNjcmV0ZUFycmF5VGVtcGxhdGU8dm9pZCo+CUNGWF9QdHJEaXNjcmV0ZUFycmF5Ow0KLXR5cGVkZWYgQ0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZTxGWF9EV09SRD4JCUNGWF9EV29yZERpc2NyZXRlQXJyYXk7DQotdHlwZWRlZiBDRlhfRGlzY3JldGVBcnJheVRlbXBsYXRlPEZYX1dPUkQ+CQlDRlhfV29yZERpc2NyZXRlQXJyYXk7DQotY2xhc3MgQ0ZYX0Jhc2VTdGFjayA6IHB1YmxpYyBDRlhfVGFyZ2V0DQotew0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX0Jhc2VTdGFjayhpbnQzMl90IGlDaHVua1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSk7DQotICAgIH5DRlhfQmFzZVN0YWNrKCk7DQotICAgIHVpbnQ4X3QqCVB1c2goKTsNCi0gICAgdm9pZAkJUG9wKCk7DQotICAgIHVpbnQ4X3QqCUdldFRvcEVsZW1lbnQoKSBjb25zdDsNCi0gICAgaW50MzJfdAlHZXRTaXplKCkgY29uc3Q7DQotICAgIHVpbnQ4X3QqCUdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KLSAgICB2b2lkCQlSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSk7DQotICAgIENGWF9CYXNlTWFzc0FycmF5SW1wKiBtX3BEYXRhOw0KK3R5cGVkZWYgQ0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZTx2b2lkKj4gQ0ZYX1B0ckRpc2NyZXRlQXJyYXk7DQordHlwZWRlZiBDRlhfRGlzY3JldGVBcnJheVRlbXBsYXRlPEZYX0RXT1JEPiBDRlhfRFdvcmREaXNjcmV0ZUFycmF5Ow0KK3R5cGVkZWYgQ0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZTxGWF9XT1JEPiBDRlhfV29yZERpc2NyZXRlQXJyYXk7DQorY2xhc3MgQ0ZYX0Jhc2VTdGFjayA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX0Jhc2VTdGFjayhpbnQzMl90IGlDaHVua1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSk7DQorICB+Q0ZYX0Jhc2VTdGFjaygpOw0KKyAgdWludDhfdCogUHVzaCgpOw0KKyAgdm9pZCBQb3AoKTsNCisgIHVpbnQ4X3QqIEdldFRvcEVsZW1lbnQoKSBjb25zdDsNCisgIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0Ow0KKyAgdWludDhfdCogR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Q7DQorICB2b2lkIFJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKTsNCisgIENGWF9CYXNlTWFzc0FycmF5SW1wKiBtX3BEYXRhOw0KIH07DQotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQotY2xhc3MgQ0ZYX1N0YWNrVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VTdGFjaw0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9TdGFja1RlbXBsYXRlKGludDMyX3QgaUNodW5rU2l6ZSA9IDEwMCkgOiBDRlhfQmFzZVN0YWNrKGlDaHVua1NpemUsIHNpemVvZihiYXNlVHlwZSkpIHt9DQotICAgIGludDMyX3QJUHVzaChjb25zdCBiYXNlVHlwZSAmZWxlbWVudCkNCi0gICAgew0KLSAgICAgICAgaW50MzJfdCBpbmRleCA9IENGWF9CYXNlU3RhY2s6OkdldFNpemUoKTsNCi0gICAgICAgICooYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OlB1c2goKSA9IGVsZW1lbnQ7DQotICAgICAgICByZXR1cm4gaW5kZXg7DQotICAgIH0NCi0gICAgdm9pZAkJUG9wKCkNCi0gICAgew0KLSAgICAgICAgQ0ZYX0Jhc2VTdGFjazo6UG9wKCk7DQotICAgIH0NCi0gICAgYmFzZVR5cGUqCUdldFRvcEVsZW1lbnQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRUb3BFbGVtZW50KCk7DQotICAgIH0NCi0gICAgaW50MzJfdAlHZXRTaXplKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENGWF9CYXNlU3RhY2s6OkdldFNpemUoKTsNCi0gICAgfQ0KLSAgICBiYXNlVHlwZSoJR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VTdGFjazo6R2V0QXQoaW5kZXgpOw0KLSAgICB9DQotICAgIHZvaWQJCVJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKQ0KLSAgICB7DQotICAgICAgICBDRlhfQmFzZVN0YWNrOjpSZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCi0gICAgfQ0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfU3RhY2tUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQmFzZVN0YWNrIHsNCisgcHVibGljOg0KKyAgQ0ZYX1N0YWNrVGVtcGxhdGUoaW50MzJfdCBpQ2h1bmtTaXplID0gMTAwKQ0KKyAgICAgIDogQ0ZYX0Jhc2VTdGFjayhpQ2h1bmtTaXplLCBzaXplb2YoYmFzZVR5cGUpKSB7fQ0KKyAgaW50MzJfdCBQdXNoKGNvbnN0IGJhc2VUeXBlJiBlbGVtZW50KSB7DQorICAgIGludDMyX3QgaW5kZXggPSBDRlhfQmFzZVN0YWNrOjpHZXRTaXplKCk7DQorICAgICooYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OlB1c2goKSA9IGVsZW1lbnQ7DQorICAgIHJldHVybiBpbmRleDsNCisgIH0NCisgIHZvaWQgUG9wKCkgeyBDRlhfQmFzZVN0YWNrOjpQb3AoKTsgfQ0KKyAgYmFzZVR5cGUqIEdldFRvcEVsZW1lbnQoKSBjb25zdCB7DQorICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OkdldFRvcEVsZW1lbnQoKTsNCisgIH0NCisgIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIENGWF9CYXNlU3RhY2s6OkdldFNpemUoKTsgfQ0KKyAgYmFzZVR5cGUqIEdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VTdGFjazo6R2V0QXQoaW5kZXgpOw0KKyAgfQ0KKyAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkgew0KKyAgICBDRlhfQmFzZVN0YWNrOjpSZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCisgIH0NCiB9Ow0KLXR5cGVkZWYgQ0ZYX1N0YWNrVGVtcGxhdGU8dm9pZCo+CUNGWF9QdHJTdGFjazsNCi10eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPEZYX0RXT1JEPglDRlhfRFdvcmRTdGFjazsNCi10eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPEZYX1dPUkQ+CQlDRlhfV29yZFN0YWNrOw0KLXR5cGVkZWYgQ0ZYX1N0YWNrVGVtcGxhdGU8aW50MzJfdD4JQ0ZYX0ludDMyU3RhY2s7DQotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQotY2xhc3MgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VTdGFjaw0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9PYmplY3RTdGFja1RlbXBsYXRlKGludDMyX3QgaUNodW5rU2l6ZSA9IDEwMCkgOiBDRlhfQmFzZVN0YWNrKGlDaHVua1NpemUsIHNpemVvZihiYXNlVHlwZSkpIHt9DQotICAgIH5DRlhfT2JqZWN0U3RhY2tUZW1wbGF0ZSgpDQotICAgIHsNCi0gICAgICAgIFJlbW92ZUFsbCgpOw0KK3R5cGVkZWYgQ0ZYX1N0YWNrVGVtcGxhdGU8dm9pZCo+IENGWF9QdHJTdGFjazsNCit0eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPEZYX0RXT1JEPiBDRlhfRFdvcmRTdGFjazsNCit0eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPEZYX1dPUkQ+IENGWF9Xb3JkU3RhY2s7DQordHlwZWRlZiBDRlhfU3RhY2tUZW1wbGF0ZTxpbnQzMl90PiBDRlhfSW50MzJTdGFjazsNCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VTdGFjayB7DQorIHB1YmxpYzoNCisgIENGWF9PYmplY3RTdGFja1RlbXBsYXRlKGludDMyX3QgaUNodW5rU2l6ZSA9IDEwMCkNCisgICAgICA6IENGWF9CYXNlU3RhY2soaUNodW5rU2l6ZSwgc2l6ZW9mKGJhc2VUeXBlKSkge30NCisgIH5DRlhfT2JqZWN0U3RhY2tUZW1wbGF0ZSgpIHsgUmVtb3ZlQWxsKCk7IH0NCisgIGludDMyX3QgUHVzaChjb25zdCBiYXNlVHlwZSYgZWxlbWVudCkgew0KKyAgICBpbnQzMl90IGluZGV4ID0gQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpOw0KKyAgICBiYXNlVHlwZSogcCA9IChiYXNlVHlwZSopQ0ZYX0Jhc2VTdGFjazo6UHVzaCgpOw0KKyAgICBuZXcgKCh2b2lkKilwKSBiYXNlVHlwZShlbGVtZW50KTsNCisgICAgcmV0dXJuIGluZGV4Ow0KKyAgfQ0KKyAgdm9pZCBQb3AoKSB7DQorICAgIGJhc2VUeXBlKiBwID0gKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRUb3BFbGVtZW50KCk7DQorICAgIGlmIChwICE9IE5VTEwpIHsNCisgICAgICBwLT5+YmFzZVR5cGUoKTsNCiAgICAgfQ0KLSAgICBpbnQzMl90CVB1c2goY29uc3QgYmFzZVR5cGUgJmVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgIGludDMyX3QgaW5kZXggPSBDRlhfQmFzZVN0YWNrOjpHZXRTaXplKCk7DQotICAgICAgICBiYXNlVHlwZSAqcCA9IChiYXNlVHlwZSopQ0ZYX0Jhc2VTdGFjazo6UHVzaCgpOw0KLSAgICAgICAgbmV3ICgodm9pZCopcCliYXNlVHlwZShlbGVtZW50KTsNCi0gICAgICAgIHJldHVybiBpbmRleDsNCisgICAgQ0ZYX0Jhc2VTdGFjazo6UG9wKCk7DQorICB9DQorICBiYXNlVHlwZSogR2V0VG9wRWxlbWVudCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VTdGFjazo6R2V0VG9wRWxlbWVudCgpOw0KKyAgfQ0KKyAgaW50MzJfdCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpOyB9DQorICBiYXNlVHlwZSogR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRBdChpbmRleCk7DQorICB9DQorICB2b2lkIFJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKSB7DQorICAgIGludDMyX3QgaVNpemUgPSBDRlhfQmFzZVN0YWNrOjpHZXRTaXplKCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICAoKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRBdChpKSktPn5iYXNlVHlwZSgpOw0KICAgICB9DQotICAgIHZvaWQJCVBvcCgpDQotICAgIHsNCi0gICAgICAgIGJhc2VUeXBlICpwID0gKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRUb3BFbGVtZW50KCk7DQotICAgICAgICBpZiAocCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgcC0+fmJhc2VUeXBlKCk7DQotICAgICAgICB9DQotICAgICAgICBDRlhfQmFzZVN0YWNrOjpQb3AoKTsNCisgICAgQ0ZYX0Jhc2VTdGFjazo6UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorICB9DQorICBpbnQzMl90IENvcHkoY29uc3QgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGUmIHNyYywNCisgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSkgew0KKyAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICByZXR1cm4gQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpOw0KICAgICB9DQotICAgIGJhc2VUeXBlKglHZXRUb3BFbGVtZW50KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VTdGFjazo6R2V0VG9wRWxlbWVudCgpOw0KKyAgICBpbnQzMl90IGlTaXplID0gc3JjLkdldFNpemUoKTsNCisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IGlTaXplKTsNCisgICAgaWYgKGlDb3VudCA8IDApIHsNCisgICAgICBpQ291bnQgPSBpU2l6ZTsNCiAgICAgfQ0KLSAgICBpbnQzMl90CUdldFNpemUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpOw0KKyAgICBpbnQzMl90IGlFbmQgPSBpU3RhcnQgKyBpQ291bnQ7DQorICAgIGlmIChpRW5kID4gaVNpemUpIHsNCisgICAgICBpRW5kID0gaVNpemU7DQogICAgIH0NCi0gICAgYmFzZVR5cGUqCUdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OkdldEF0KGluZGV4KTsNCisgICAgUmVtb3ZlQWxsKFRSVUUpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGlFbmQ7IGkrKykgew0KKyAgICAgIFB1c2goKnNyYy5HZXRBdChpKSk7DQogICAgIH0NCi0gICAgdm9pZAkJUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpDQotICAgIHsNCi0gICAgICAgIGludDMyX3QgaVNpemUgPSBDRlhfQmFzZVN0YWNrOjpHZXRTaXplKCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSArKykgew0KLSAgICAgICAgICAgICgoYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OkdldEF0KGkpKS0+fmJhc2VUeXBlKCk7DQotICAgICAgICB9DQotICAgICAgICBDRlhfQmFzZVN0YWNrOjpSZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCi0gICAgfQ0KLSAgICBpbnQzMl90CUNvcHkoY29uc3QgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGUgJnNyYywgaW50MzJfdCBpU3RhcnQgPSAwLCBpbnQzMl90IGlDb3VudCA9IC0xKQ0KLSAgICB7DQotICAgICAgICBpZiAoaUNvdW50ID09IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpU2l6ZSA9IHNyYy5HZXRTaXplKCk7DQotICAgICAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgaVNpemUpOw0KLSAgICAgICAgaWYgKGlDb3VudCA8IDApIHsNCi0gICAgICAgICAgICBpQ291bnQgPSBpU2l6ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaUVuZCA9IGlTdGFydCArIGlDb3VudDsNCi0gICAgICAgIGlmIChpRW5kID4gaVNpemUpIHsNCi0gICAgICAgICAgICBpRW5kID0gaVNpemU7DQotICAgICAgICB9DQotICAgICAgICBSZW1vdmVBbGwoVFJVRSk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGlFbmQ7IGkgKyspIHsNCi0gICAgICAgICAgICBQdXNoKCpzcmMuR2V0QXQoaSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIENGWF9CYXNlU3RhY2s6OkdldFNpemUoKTsNCi0gICAgfQ0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpOw0KKyAgfQ0KIH07DQotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+DQotY2xhc3MgQ0ZYX0NQTFRyZWVOb2RlIDogcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICB0eXBlZGVmIENGWF9DUExUcmVlTm9kZTxiYXNlVHlwZT4JQ1BMVHJlZU5vZGU7DQotICAgIENGWF9DUExUcmVlTm9kZSgpIDogbV9wUGFyZW50Tm9kZShOVUxMKQ0KLSAgICAgICAgLCBtX3BDaGlsZE5vZGUoTlVMTCkNCi0gICAgICAgICwgbV9wUHJldk5vZGUoTlVMTCkNCi0gICAgICAgICwgbV9wTmV4dE5vZGUoTlVMTCkNCi0gICAgICAgICwgbV9EYXRhKCkNCi0gICAgew0KLSAgICB9DQotICAgIGVudW0gVHJlZU5vZGUge1Jvb3QgPSAwLCBQYXJlbnQsIEZpcnN0U2libGluZywgUHJldmlvdXNTaWJsaW5nLCBOZXh0U2libGluZywgTGFzdFNpYmxpbmcsIEZpcnN0TmVpZ2hib3IsIFByZXZpb3VzTmVpZ2hib3IsIE5leHROZWlnaGJvciwgTGFzdE5laWdoYm9yLCBGaXJzdENoaWxkLCBMYXN0Q2hpbGR9Ow0KLSAgICBDUExUcmVlTm9kZSogR2V0Tm9kZShUcmVlTm9kZSBlTm9kZSkgY29uc3QNCi0gICAgew0KLSAgICAgICAgc3dpdGNoIChlTm9kZSkgew0KLSAgICAgICAgICAgIGNhc2UgUm9vdDogew0KLSAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBQYXJlbnQgPSAoQ1BMVHJlZU5vZGUqKXRoaXM7DQotICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcFRlbXA7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHBUZW1wID0gcFBhcmVudC0+bV9wUGFyZW50Tm9kZSkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJlbnQgPSBwVGVtcDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwUGFyZW50Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBQYXJlbnQ6DQotICAgICAgICAgICAgICAgIHJldHVybiBtX3BQYXJlbnROb2RlOw0KLSAgICAgICAgICAgIGNhc2UgRmlyc3RTaWJsaW5nOiB7DQotICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcE5vZGUgPSAoQ1BMVHJlZU5vZGUqKXRoaXM7DQotICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcFRlbXA7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHBUZW1wID0gcE5vZGUtPm1fcFByZXZOb2RlKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBwVGVtcDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwTm9kZSA9PSAoQ1BMVHJlZU5vZGUqKXRoaXMgPyBOVUxMIDogcE5vZGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIFByZXZpb3VzU2libGluZzoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1fcFByZXZOb2RlOw0KLSAgICAgICAgICAgIGNhc2UgTmV4dFNpYmxpbmc6DQotICAgICAgICAgICAgICAgIHJldHVybiBtX3BOZXh0Tm9kZTsNCi0gICAgICAgICAgICBjYXNlIExhc3RTaWJsaW5nOiB7DQotICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcE5vZGUgPSAoQ1BMVHJlZU5vZGUqKXRoaXM7DQotICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcFRlbXA7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHBUZW1wID0gcE5vZGUtPm1fcE5leHROb2RlKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBwVGVtcDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwTm9kZSA9PSAoQ1BMVHJlZU5vZGUqKXRoaXMgPyBOVUxMIDogcE5vZGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIEZpcnN0TmVpZ2hib3I6IHsNCi0gICAgICAgICAgICAgICAgICAgIENQTFRyZWVOb2RlICpwUGFyZW50ID0gKENQTFRyZWVOb2RlKil0aGlzOw0KLSAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBUZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBQYXJlbnQtPm1fcFBhcmVudE5vZGUpICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyZW50ID0gcFRlbXA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcFBhcmVudCA9PSAoQ1BMVHJlZU5vZGUqKXRoaXMgPyBOVUxMIDogcFBhcmVudDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgUHJldmlvdXNOZWlnaGJvcjogew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFByZXZOb2RlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9wUGFyZW50Tm9kZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIENQTFRyZWVOb2RlICpwTm9kZSA9IG1fcFByZXZOb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBUZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBOb2RlLT5tX3BDaGlsZE5vZGUpICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwTm9kZSA9IHBUZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocFRlbXAgPSBwTm9kZS0+bV9wTmV4dE5vZGUpICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBwVGVtcDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcE5vZGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIE5leHROZWlnaGJvcjogew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fcENoaWxkTm9kZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcENoaWxkTm9kZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BOZXh0Tm9kZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcE5leHROb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBOb2RlID0gbV9wUGFyZW50Tm9kZTsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwTm9kZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBOb2RlLT5tX3BOZXh0Tm9kZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwTm9kZS0+bV9wTmV4dE5vZGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcFBhcmVudE5vZGU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgTGFzdE5laWdoYm9yOiB7DQotICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcE5vZGUgPSAoQ1BMVHJlZU5vZGUqKXRoaXM7DQotICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcFRlbXA7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHBUZW1wID0gcE5vZGUtPm1fcFBhcmVudE5vZGUpICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwTm9kZSA9IHBUZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKFRSVUUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcFRlbXA7DQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBOb2RlLT5tX3BOZXh0Tm9kZSkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZSA9IHBUZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocE5vZGUtPm1fcENoaWxkTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5tX3BDaGlsZE5vZGU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcE5vZGUgPT0gKENQTFRyZWVOb2RlKil0aGlzID8gTlVMTCA6IHBOb2RlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBGaXJzdENoaWxkOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9wQ2hpbGROb2RlOw0KLSAgICAgICAgICAgIGNhc2UgTGFzdENoaWxkOiB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobV9wQ2hpbGROb2RlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIENQTFRyZWVOb2RlICpwQ2hpbGQgPSBtX3BDaGlsZE5vZGU7DQotICAgICAgICAgICAgICAgICAgICBDUExUcmVlTm9kZSAqcFRlbXA7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHBUZW1wID0gcENoaWxkLT5tX3BOZXh0Tm9kZSkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGlsZCA9IHBUZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBDaGlsZDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfQ1BMVHJlZU5vZGUgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIHR5cGVkZWYgQ0ZYX0NQTFRyZWVOb2RlPGJhc2VUeXBlPiBDUExUcmVlTm9kZTsNCisgIENGWF9DUExUcmVlTm9kZSgpDQorICAgICAgOiBtX3BQYXJlbnROb2RlKE5VTEwpLA0KKyAgICAgICAgbV9wQ2hpbGROb2RlKE5VTEwpLA0KKyAgICAgICAgbV9wUHJldk5vZGUoTlVMTCksDQorICAgICAgICBtX3BOZXh0Tm9kZShOVUxMKSwNCisgICAgICAgIG1fRGF0YSgpIHt9DQorICBlbnVtIFRyZWVOb2RlIHsNCisgICAgUm9vdCA9IDAsDQorICAgIFBhcmVudCwNCisgICAgRmlyc3RTaWJsaW5nLA0KKyAgICBQcmV2aW91c1NpYmxpbmcsDQorICAgIE5leHRTaWJsaW5nLA0KKyAgICBMYXN0U2libGluZywNCisgICAgRmlyc3ROZWlnaGJvciwNCisgICAgUHJldmlvdXNOZWlnaGJvciwNCisgICAgTmV4dE5laWdoYm9yLA0KKyAgICBMYXN0TmVpZ2hib3IsDQorICAgIEZpcnN0Q2hpbGQsDQorICAgIExhc3RDaGlsZA0KKyAgfTsNCisgIENQTFRyZWVOb2RlKiBHZXROb2RlKFRyZWVOb2RlIGVOb2RlKSBjb25zdCB7DQorICAgIHN3aXRjaCAoZU5vZGUpIHsNCisgICAgICBjYXNlIFJvb3Q6IHsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwUGFyZW50ID0gKENQTFRyZWVOb2RlKil0aGlzOw0KKyAgICAgICAgQ1BMVHJlZU5vZGUqIHBUZW1wOw0KKyAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBQYXJlbnQtPm1fcFBhcmVudE5vZGUpICE9IE5VTEwpIHsNCisgICAgICAgICAgcFBhcmVudCA9IHBUZW1wOw0KICAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgdm9pZCBTZXRQYXJlbnROb2RlKENQTFRyZWVOb2RlICpwTm9kZSkNCi0gICAgew0KLSAgICAgICAgbV9wUGFyZW50Tm9kZSA9IHBOb2RlOw0KLSAgICB9DQotICAgIGludDMyX3QgQ291bnRDaGlsZE5vZGVzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgaW50MzJfdCBpQ291bnQgPSAwOw0KLSAgICAgICAgQ1BMVHJlZU5vZGUgKnBOb2RlID0gbV9wQ2hpbGROb2RlOw0KLSAgICAgICAgd2hpbGUgKHBOb2RlKSB7DQotICAgICAgICAgICAgaUNvdW50ICsrOw0KLSAgICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHROb2RlOw0KKyAgICAgICAgcmV0dXJuIHBQYXJlbnQ7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgUGFyZW50Og0KKyAgICAgICAgcmV0dXJuIG1fcFBhcmVudE5vZGU7DQorICAgICAgY2FzZSBGaXJzdFNpYmxpbmc6IHsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwTm9kZSA9IChDUExUcmVlTm9kZSopdGhpczsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwVGVtcDsNCisgICAgICAgIHdoaWxlICgocFRlbXAgPSBwTm9kZS0+bV9wUHJldk5vZGUpICE9IE5VTEwpIHsNCisgICAgICAgICAgcE5vZGUgPSBwVGVtcDsNCiAgICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpQ291bnQ7DQotICAgIH0NCi0gICAgQ1BMVHJlZU5vZGUqIEdldENoaWxkTm9kZShpbnQzMl90IGlJbmRleCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgaW50MzJfdCBpQ291bnQgPSAwOw0KLSAgICAgICAgQ1BMVHJlZU5vZGUgKnBOb2RlID0gbV9wQ2hpbGROb2RlOw0KLSAgICAgICAgd2hpbGUgKHBOb2RlKSB7DQotICAgICAgICAgICAgaWYgKGlJbmRleCA9PSBpQ291bnQpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBOb2RlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpQ291bnQgKys7DQotICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wTmV4dE5vZGU7DQorICAgICAgICByZXR1cm4gcE5vZGUgPT0gKENQTFRyZWVOb2RlKil0aGlzID8gTlVMTCA6IHBOb2RlOw0KKyAgICAgIH0NCisgICAgICBjYXNlIFByZXZpb3VzU2libGluZzoNCisgICAgICAgIHJldHVybiBtX3BQcmV2Tm9kZTsNCisgICAgICBjYXNlIE5leHRTaWJsaW5nOg0KKyAgICAgICAgcmV0dXJuIG1fcE5leHROb2RlOw0KKyAgICAgIGNhc2UgTGFzdFNpYmxpbmc6IHsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwTm9kZSA9IChDUExUcmVlTm9kZSopdGhpczsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwVGVtcDsNCisgICAgICAgIHdoaWxlICgocFRlbXAgPSBwTm9kZS0+bV9wTmV4dE5vZGUpICE9IE5VTEwpIHsNCisgICAgICAgICAgcE5vZGUgPSBwVGVtcDsNCiAgICAgICAgIH0NCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGludDMyX3QgR2V0Tm9kZUluZGV4KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgaW50MzJfdCBpbmRleCA9IDA7DQotICAgICAgICBDUExUcmVlTm9kZSAqcE5vZGUgPSBtX3BQcmV2Tm9kZTsNCi0gICAgICAgIHdoaWxlIChwTm9kZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgaW5kZXggKys7DQotICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wUHJldk5vZGU7DQorICAgICAgICByZXR1cm4gcE5vZGUgPT0gKENQTFRyZWVOb2RlKil0aGlzID8gTlVMTCA6IHBOb2RlOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZpcnN0TmVpZ2hib3I6IHsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwUGFyZW50ID0gKENQTFRyZWVOb2RlKil0aGlzOw0KKyAgICAgICAgQ1BMVHJlZU5vZGUqIHBUZW1wOw0KKyAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBQYXJlbnQtPm1fcFBhcmVudE5vZGUpICE9IE5VTEwpIHsNCisgICAgICAgICAgcFBhcmVudCA9IHBUZW1wOw0KICAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGluZGV4Ow0KLSAgICB9DQotICAgIEZYX0JPT0wgSXNQYXJlbnROb2RlKGNvbnN0IENQTFRyZWVOb2RlICpwTm9kZSkgY29uc3QNCi0gICAgew0KLSAgICAgICAgQ1BMVHJlZU5vZGUgKnBQYXJlbnQgPSBtX3BQYXJlbnROb2RlOw0KLSAgICAgICAgd2hpbGUgKHBQYXJlbnQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGlmIChwUGFyZW50ID09IHBOb2RlKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0VHJlZU5vZGUoUGFyZW50KTsNCisgICAgICAgIHJldHVybiBwUGFyZW50ID09IChDUExUcmVlTm9kZSopdGhpcyA/IE5VTEwgOiBwUGFyZW50Ow0KKyAgICAgIH0NCisgICAgICBjYXNlIFByZXZpb3VzTmVpZ2hib3I6IHsNCisgICAgICAgIGlmIChtX3BQcmV2Tm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybiBtX3BQYXJlbnROb2RlOw0KICAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEZYX0JPT0wgSXNDaGlsZE5vZGUoY29uc3QgQ1BMVHJlZU5vZGUgKnBOb2RlKSBjb25zdA0KLSAgICB7DQotICAgICAgICBpZiAocE5vZGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwTm9kZS0+SXNQYXJlbnROb2RlKChjb25zdCBDUExUcmVlTm9kZSopdGhpcyk7DQotICAgIH0NCi0gICAgdm9pZCBTZXRDaGlsZE5vZGUoQ1BMVHJlZU5vZGUgKnBOb2RlKQ0KLSAgICB7DQotICAgICAgICBtX3BDaGlsZE5vZGUgPSBwTm9kZTsNCi0gICAgfQ0KLSAgICB2b2lkIFNldFByZXZOb2RlKENQTFRyZWVOb2RlICpwTm9kZSkNCi0gICAgew0KLSAgICAgICAgbV9wUHJldk5vZGUgPSBwTm9kZTsNCi0gICAgfQ0KLSAgICB2b2lkIFNldE5leHROb2RlKENQTFRyZWVOb2RlICpwTm9kZSkNCi0gICAgew0KLSAgICAgICAgbV9wTmV4dE5vZGUgPSBwTm9kZTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IEdldE5vZGVMZXZlbCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIGludDMyX3QgaUxldmVsID0gMDsNCi0gICAgICAgIENQTFRyZWVOb2RlICpwTm9kZSA9IChDUExUcmVlTm9kZSopdGhpczsNCi0gICAgICAgIHdoaWxlICgocE5vZGUgPSBwTm9kZS0+bV9wUGFyZW50Tm9kZSkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGlMZXZlbCArKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpTGV2ZWw7DQotICAgIH0NCi0gICAgRlhfQk9PTCBJc1Jvb3ROb2RlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcFBhcmVudE5vZGUgPT0gTlVMTDsNCi0gICAgfQ0KLSAgICBiYXNlVHlwZSBHZXREYXRhKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fRGF0YTsNCi0gICAgfQ0KLSAgICB2b2lkIFNldERhdGEoYmFzZVR5cGUgZGF0YSkNCi0gICAgew0KLSAgICAgICAgbV9EYXRhID0gZGF0YTsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgQ1BMVHJlZU5vZGUJCSptX3BQYXJlbnROb2RlOw0KLSAgICBDUExUcmVlTm9kZQkJKm1fcENoaWxkTm9kZTsNCi0gICAgQ1BMVHJlZU5vZGUJCSptX3BQcmV2Tm9kZTsNCi0gICAgQ1BMVHJlZU5vZGUJCSptX3BOZXh0Tm9kZTsNCi0gICAgYmFzZVR5cGUJCW1fRGF0YTsNCi0gICAgZnJpZW5kIGNsYXNzIENGWF9DUExUcmVlPGJhc2VUeXBlPjsNCi19Ow0KLXRlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPg0KLWNsYXNzIENGWF9DUExUcmVlDQotew0KLXB1YmxpYzoNCi0gICAgdHlwZWRlZiBDRlhfQ1BMVHJlZU5vZGU8YmFzZVR5cGU+CUNQTFRyZWVOb2RlOw0KLSAgICBDRlhfQ1BMVHJlZSgpIDogbV9Sb290KCkNCi0gICAgew0KLSAgICB9DQotICAgIH5DRlhfQ1BMVHJlZSgpDQotICAgIHsNCi0gICAgICAgIENQTFRyZWVOb2RlICpwTm9kZSA9IG1fUm9vdC5HZXROb2RlKENQTFRyZWVOb2RlOjpMYXN0TmVpZ2hib3IpOw0KLSAgICAgICAgd2hpbGUgKHBOb2RlICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBpZiAocE5vZGUtPklzUm9vdE5vZGUoKSkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBUZW1wID0gcE5vZGUtPkdldE5vZGUoQ1BMVHJlZU5vZGU6OlByZXZpb3VzTmVpZ2hib3IpOw0KLSAgICAgICAgICAgIGRlbGV0ZSBwTm9kZTsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwTm9kZSA9IG1fcFByZXZOb2RlOw0KKyAgICAgICAgQ1BMVHJlZU5vZGUqIHBUZW1wOw0KKyAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBOb2RlLT5tX3BDaGlsZE5vZGUpICE9IE5VTEwpIHsNCisgICAgICAgICAgcE5vZGUgPSBwVGVtcDsNCisgICAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBOb2RlLT5tX3BOZXh0Tm9kZSkgIT0gTlVMTCkgew0KICAgICAgICAgICAgIHBOb2RlID0gcFRlbXA7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBDUExUcmVlTm9kZSogR2V0Um9vdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAmbV9Sb290Ow0KLSAgICB9DQotICAgIENQTFRyZWVOb2RlKiBBZGRDaGlsZChiYXNlVHlwZSBkYXRhLCBDUExUcmVlTm9kZSAqcFBhcmVudCA9IE5VTEwpDQotICAgIHsNCi0gICAgICAgIGlmIChwUGFyZW50ID09IE5VTEwpIHsNCi0gICAgICAgICAgICBwUGFyZW50ID0gJm1fUm9vdDsNCisgICAgICAgIHJldHVybiBwTm9kZTsNCisgICAgICB9DQorICAgICAgY2FzZSBOZXh0TmVpZ2hib3I6IHsNCisgICAgICAgIGlmIChtX3BDaGlsZE5vZGUgIT0gTlVMTCkgew0KKyAgICAgICAgICByZXR1cm4gbV9wQ2hpbGROb2RlOw0KICAgICAgICAgfQ0KLSAgICAgICAgQ1BMVHJlZU5vZGUgKnBDaGlsZCA9IG5ldyBDUExUcmVlTm9kZTsNCi0gICAgICAgIHBDaGlsZC0+U2V0UGFyZW50Tm9kZShwUGFyZW50KTsNCi0gICAgICAgIHBDaGlsZC0+U2V0RGF0YShkYXRhKTsNCi0gICAgICAgIGlmIChwUGFyZW50LT5tX3BDaGlsZE5vZGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHBQYXJlbnQtPm1fcENoaWxkTm9kZSA9IHBDaGlsZDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgQ1BMVHJlZU5vZGUgKnBMYXN0ID0gcFBhcmVudC0+R2V0Tm9kZShDUExUcmVlTm9kZTo6TGFzdENoaWxkKTsNCi0gICAgICAgICAgICBwQ2hpbGQtPlNldFByZXZOb2RlKHBMYXN0KTsNCi0gICAgICAgICAgICBwTGFzdC0+U2V0TmV4dE5vZGUocENoaWxkKTsNCisgICAgICAgIGlmIChtX3BOZXh0Tm9kZSAhPSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybiBtX3BOZXh0Tm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIENQTFRyZWVOb2RlKiBwTm9kZSA9IG1fcFBhcmVudE5vZGU7DQorICAgICAgICB3aGlsZSAocE5vZGUgIT0gTlVMTCkgew0KKyAgICAgICAgICBpZiAocE5vZGUtPm1fcE5leHROb2RlICE9IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gcE5vZGUtPm1fcE5leHROb2RlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcFBhcmVudE5vZGU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgY2FzZSBMYXN0TmVpZ2hib3I6IHsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwTm9kZSA9IChDUExUcmVlTm9kZSopdGhpczsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwVGVtcDsNCisgICAgICAgIHdoaWxlICgocFRlbXAgPSBwTm9kZS0+bV9wUGFyZW50Tm9kZSkgIT0gTlVMTCkgew0KKyAgICAgICAgICBwTm9kZSA9IHBUZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgICAgQ1BMVHJlZU5vZGUqIHBUZW1wOw0KKyAgICAgICAgICB3aGlsZSAoKHBUZW1wID0gcE5vZGUtPm1fcE5leHROb2RlKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcE5vZGUgPSBwVGVtcDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocE5vZGUtPm1fcENoaWxkTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wQ2hpbGROb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBOb2RlID09IChDUExUcmVlTm9kZSopdGhpcyA/IE5VTEwgOiBwTm9kZTsNCisgICAgICB9DQorICAgICAgY2FzZSBGaXJzdENoaWxkOg0KKyAgICAgICAgcmV0dXJuIG1fcENoaWxkTm9kZTsNCisgICAgICBjYXNlIExhc3RDaGlsZDogew0KKyAgICAgICAgaWYgKG1fcENoaWxkTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1BMVHJlZU5vZGUqIHBDaGlsZCA9IG1fcENoaWxkTm9kZTsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwVGVtcDsNCisgICAgICAgIHdoaWxlICgocFRlbXAgPSBwQ2hpbGQtPm1fcE5leHROb2RlKSAhPSBOVUxMKSB7DQorICAgICAgICAgIHBDaGlsZCA9IHBUZW1wOw0KICAgICAgICAgfQ0KICAgICAgICAgcmV0dXJuIHBDaGlsZDsNCisgICAgICB9DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotcHJvdGVjdGVkOg0KLSAgICBDUExUcmVlTm9kZQkJbV9Sb290Ow0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHZvaWQgU2V0UGFyZW50Tm9kZShDUExUcmVlTm9kZSogcE5vZGUpIHsgbV9wUGFyZW50Tm9kZSA9IHBOb2RlOyB9DQorICBpbnQzMl90IENvdW50Q2hpbGROb2RlcygpIGNvbnN0IHsNCisgICAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgICBDUExUcmVlTm9kZSogcE5vZGUgPSBtX3BDaGlsZE5vZGU7DQorICAgIHdoaWxlIChwTm9kZSkgew0KKyAgICAgIGlDb3VudCsrOw0KKyAgICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHROb2RlOw0KKyAgICB9DQorICAgIHJldHVybiBpQ291bnQ7DQorICB9DQorICBDUExUcmVlTm9kZSogR2V0Q2hpbGROb2RlKGludDMyX3QgaUluZGV4KSBjb25zdCB7DQorICAgIGludDMyX3QgaUNvdW50ID0gMDsNCisgICAgQ1BMVHJlZU5vZGUqIHBOb2RlID0gbV9wQ2hpbGROb2RlOw0KKyAgICB3aGlsZSAocE5vZGUpIHsNCisgICAgICBpZiAoaUluZGV4ID09IGlDb3VudCkgew0KKyAgICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICAgIH0NCisgICAgICBpQ291bnQrKzsNCisgICAgICBwTm9kZSA9IHBOb2RlLT5tX3BOZXh0Tm9kZTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3QgR2V0Tm9kZUluZGV4KCkgY29uc3Qgew0KKyAgICBpbnQzMl90IGluZGV4ID0gMDsNCisgICAgQ1BMVHJlZU5vZGUqIHBOb2RlID0gbV9wUHJldk5vZGU7DQorICAgIHdoaWxlIChwTm9kZSAhPSBOVUxMKSB7DQorICAgICAgaW5kZXgrKzsNCisgICAgICBwTm9kZSA9IHBOb2RlLT5tX3BQcmV2Tm9kZTsNCisgICAgfQ0KKyAgICByZXR1cm4gaW5kZXg7DQorICB9DQorICBGWF9CT09MIElzUGFyZW50Tm9kZShjb25zdCBDUExUcmVlTm9kZSogcE5vZGUpIGNvbnN0IHsNCisgICAgQ1BMVHJlZU5vZGUqIHBQYXJlbnQgPSBtX3BQYXJlbnROb2RlOw0KKyAgICB3aGlsZSAocFBhcmVudCAhPSBOVUxMKSB7DQorICAgICAgaWYgKHBQYXJlbnQgPT0gcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0VHJlZU5vZGUoUGFyZW50KTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9CT09MIElzQ2hpbGROb2RlKGNvbnN0IENQTFRyZWVOb2RlKiBwTm9kZSkgY29uc3Qgew0KKyAgICBpZiAocE5vZGUgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gcE5vZGUtPklzUGFyZW50Tm9kZSgoY29uc3QgQ1BMVHJlZU5vZGUqKXRoaXMpOw0KKyAgfQ0KKyAgdm9pZCBTZXRDaGlsZE5vZGUoQ1BMVHJlZU5vZGUqIHBOb2RlKSB7IG1fcENoaWxkTm9kZSA9IHBOb2RlOyB9DQorICB2b2lkIFNldFByZXZOb2RlKENQTFRyZWVOb2RlKiBwTm9kZSkgeyBtX3BQcmV2Tm9kZSA9IHBOb2RlOyB9DQorICB2b2lkIFNldE5leHROb2RlKENQTFRyZWVOb2RlKiBwTm9kZSkgeyBtX3BOZXh0Tm9kZSA9IHBOb2RlOyB9DQorICBpbnQzMl90IEdldE5vZGVMZXZlbCgpIGNvbnN0IHsNCisgICAgaW50MzJfdCBpTGV2ZWwgPSAwOw0KKyAgICBDUExUcmVlTm9kZSogcE5vZGUgPSAoQ1BMVHJlZU5vZGUqKXRoaXM7DQorICAgIHdoaWxlICgocE5vZGUgPSBwTm9kZS0+bV9wUGFyZW50Tm9kZSkgIT0gTlVMTCkgew0KKyAgICAgIGlMZXZlbCsrOw0KKyAgICB9DQorICAgIHJldHVybiBpTGV2ZWw7DQorICB9DQorICBGWF9CT09MIElzUm9vdE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3BQYXJlbnROb2RlID09IE5VTEw7IH0NCisgIGJhc2VUeXBlIEdldERhdGEoKSBjb25zdCB7IHJldHVybiBtX0RhdGE7IH0NCisgIHZvaWQgU2V0RGF0YShiYXNlVHlwZSBkYXRhKSB7IG1fRGF0YSA9IGRhdGE7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgQ1BMVHJlZU5vZGUqIG1fcFBhcmVudE5vZGU7DQorICBDUExUcmVlTm9kZSogbV9wQ2hpbGROb2RlOw0KKyAgQ1BMVHJlZU5vZGUqIG1fcFByZXZOb2RlOw0KKyAgQ1BMVHJlZU5vZGUqIG1fcE5leHROb2RlOw0KKyAgYmFzZVR5cGUgbV9EYXRhOw0KKyAgZnJpZW5kIGNsYXNzIENGWF9DUExUcmVlPGJhc2VUeXBlPjsNCit9Ow0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfQ1BMVHJlZSB7DQorIHB1YmxpYzoNCisgIHR5cGVkZWYgQ0ZYX0NQTFRyZWVOb2RlPGJhc2VUeXBlPiBDUExUcmVlTm9kZTsNCisgIENGWF9DUExUcmVlKCkgOiBtX1Jvb3QoKSB7fQ0KKyAgfkNGWF9DUExUcmVlKCkgew0KKyAgICBDUExUcmVlTm9kZSogcE5vZGUgPSBtX1Jvb3QuR2V0Tm9kZShDUExUcmVlTm9kZTo6TGFzdE5laWdoYm9yKTsNCisgICAgd2hpbGUgKHBOb2RlICE9IE5VTEwpIHsNCisgICAgICBpZiAocE5vZGUtPklzUm9vdE5vZGUoKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIENQTFRyZWVOb2RlKiBwVGVtcCA9IHBOb2RlLT5HZXROb2RlKENQTFRyZWVOb2RlOjpQcmV2aW91c05laWdoYm9yKTsNCisgICAgICBkZWxldGUgcE5vZGU7DQorICAgICAgcE5vZGUgPSBwVGVtcDsNCisgICAgfQ0KKyAgfQ0KKyAgQ1BMVHJlZU5vZGUqIEdldFJvb3QoKSB7IHJldHVybiAmbV9Sb290OyB9DQorICBDUExUcmVlTm9kZSogQWRkQ2hpbGQoYmFzZVR5cGUgZGF0YSwgQ1BMVHJlZU5vZGUqIHBQYXJlbnQgPSBOVUxMKSB7DQorICAgIGlmIChwUGFyZW50ID09IE5VTEwpIHsNCisgICAgICBwUGFyZW50ID0gJm1fUm9vdDsNCisgICAgfQ0KKyAgICBDUExUcmVlTm9kZSogcENoaWxkID0gbmV3IENQTFRyZWVOb2RlOw0KKyAgICBwQ2hpbGQtPlNldFBhcmVudE5vZGUocFBhcmVudCk7DQorICAgIHBDaGlsZC0+U2V0RGF0YShkYXRhKTsNCisgICAgaWYgKHBQYXJlbnQtPm1fcENoaWxkTm9kZSA9PSBOVUxMKSB7DQorICAgICAgcFBhcmVudC0+bV9wQ2hpbGROb2RlID0gcENoaWxkOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENQTFRyZWVOb2RlKiBwTGFzdCA9IHBQYXJlbnQtPkdldE5vZGUoQ1BMVHJlZU5vZGU6Okxhc3RDaGlsZCk7DQorICAgICAgcENoaWxkLT5TZXRQcmV2Tm9kZShwTGFzdCk7DQorICAgICAgcExhc3QtPlNldE5leHROb2RlKHBDaGlsZCk7DQorICAgIH0NCisgICAgcmV0dXJuIHBDaGlsZDsNCisgIH0NCisNCisgcHJvdGVjdGVkOg0KKyAgQ1BMVHJlZU5vZGUgbV9Sb290Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTAuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTAuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjUwLmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1MC5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTEuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTEuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjUxLmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1MS5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTIuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTIuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjUyLmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1Mi5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTMuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTMuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjUzLmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1My5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTQuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTQuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjU0LmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1NC5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTUuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTUuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjU1LmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1NS5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTYuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTYuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjU2LmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1Ni5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTcuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTcuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjU3LmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1Ny5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTguY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTEyNTguY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3UxMjU4LmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1MTI1OC5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTg3NC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1ODc0LmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1ODc0LmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1ODc0LmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1OTMyLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U5MzIuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U5MzIuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U5MzIuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U5MzYuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTkzNi5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTkzNi5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTkzNi5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BjdTk0OS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1OTQ5LmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1OTQ5LmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1OTQ5LmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGN1OTUwLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U5NTAuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U5NTAuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwY3U5NTAuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjUwLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjUwLmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1MC5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTAuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjUxLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjUxLmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1MS5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTEuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjUyLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjUyLmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1Mi5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTIuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjUzLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjUzLmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1My5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTMuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU0LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU0LmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1NC5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTQuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU1LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU1LmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1NS5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTUuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU2LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU2LmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1Ni5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTYuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU3LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU3LmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1Ny5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTcuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU4LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGkxMjU4LmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpMTI1OC5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTEyNTguY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGk4NzQuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTg3NC5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTg3NC5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTg3NC5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTkzMi5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpOTMyLmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpOTMyLmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpOTMyLmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpOTM2LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGk5MzYuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGk5MzYuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGk5MzYuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwaGk5NDkuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTk0OS5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTk0OS5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTk0OS5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3BoaTk1MC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpOTUwLmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpOTUwLmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcGhpOTUwLmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1MC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1MC5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTAuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjUwLmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1MS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1MS5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTEuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjUxLmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1Mi5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1Mi5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTIuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjUyLmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1My5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1My5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTMuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjUzLmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1NC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1NC5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTQuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjU0LmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1NS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1NS5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTUuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjU1LmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1Ni5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1Ni5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTYuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjU2LmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1Ny5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1Ny5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTcuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjU3LmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1OC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjMTI1OC5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzEyNTguY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWMxMjU4LmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjODc0LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM4NzQuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM4NzQuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM4NzQuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM5MzIuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzkzMi5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzkzMi5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzkzMi5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1YzkzNi5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjOTM2LmNwcAppbmRleCA2Y2QyNTJiLi40NDU1NmJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjOTM2LmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjOTM2LmNwcApAQCAtMyw0ICszLDMgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9jb2RlcGFnZS9jcHVjOTQ5LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM5NDkuY3BwCmluZGV4IDZjZDI1MmIuLjQ0NTU2YmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM5NDkuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM5NDkuY3BwCkBAIC0zLDQgKzMsMyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2NvZGVwYWdlL2NwdWM5NTAuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1Yzk1MC5jcHAKaW5kZXggNmNkMjUyYi4uNDQ1NTZiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1Yzk1MC5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvY29kZXBhZ2UvY3B1Yzk1MC5jcHAKQEAgLTMsNCArMywzIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfYWxnb3JpdGhtLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2FsZ29yaXRobS5jcHAKaW5kZXggZWIxMzNhMy4uZWI1OGNkYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfYWxnb3JpdGhtLmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9hbGdvcml0aG0uY3BwCkBAIC05LDMwNiArOSwyOTAgQEAKIGV4dGVybiAiQyIgew0KICNlbmRpZg0KIGNvbnN0IHN0YXRpYyBGWF9DSEFSIGdfRlhCYXNlNjRFbmNvZGVyTWFwWzY0XSA9IHsNCi0gICAgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsDQotICAgICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLA0KLSAgICAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywNCi0gICAgJ1knLCAnWicsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsDQotICAgICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLA0KLSAgICAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywNCi0gICAgJ3cnLCAneCcsICd5JywgJ3onLCAnMCcsICcxJywgJzInLCAnMycsDQotICAgICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcrJywgJy8nLA0KKyAgICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsDQorICAgICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywNCisgICAgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLA0KKyAgICAnbicsICdvJywgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsDQorICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJysnLCAnLycsDQogfTsNCiB0eXBlZGVmIHN0cnVjdCBfRlhfQkFTRTY0REFUQSB7DQotDQotICAgIEZYX0RXT1JECWRhdGExIDogMjsNCi0gICAgRlhfRFdPUkQJZGF0YTIgOiA2Ow0KLSAgICBGWF9EV09SRAlkYXRhMyA6IDQ7DQotICAgIEZYX0RXT1JECWRhdGE0IDogNDsNCi0gICAgRlhfRFdPUkQJZGF0YTUgOiA2Ow0KLSAgICBGWF9EV09SRAlkYXRhNiA6IDI7DQotICAgIEZYX0RXT1JECWRhdGE3IDogODsNCi19IEZYX0JBU0U2NERBVEEsICogRlhfTFBCQVNFNjRFTkNPREVEQVRBOw0KLXR5cGVkZWYgRlhfQkFTRTY0REFUQSBjb25zdCAqIEZYX0xQQ0JBU0U2NERBVEE7DQotc3RhdGljIHZvaWQgRlhfQmFzZTY0RW5jb2RlUGllY2UoY29uc3QgRlhfQkFTRTY0REFUQSAmc3JjLCBpbnQzMl90IGlCeXRlcywgRlhfQ0hBUiBkc3RbNF0pDQotew0KLSAgICBkc3RbMF0gPSBnX0ZYQmFzZTY0RW5jb2Rlck1hcFtzcmMuZGF0YTJdOw0KLSAgICBGWF9EV09SRCBiID0gc3JjLmRhdGExIDw8IDQ7DQotICAgIGlmIChpQnl0ZXMgPiAxKSB7DQotICAgICAgICBiIHw9IHNyYy5kYXRhNDsNCisgIEZYX0RXT1JEIGRhdGExIDogMjsNCisgIEZYX0RXT1JEIGRhdGEyIDogNjsNCisgIEZYX0RXT1JEIGRhdGEzIDogNDsNCisgIEZYX0RXT1JEIGRhdGE0IDogNDsNCisgIEZYX0RXT1JEIGRhdGE1IDogNjsNCisgIEZYX0RXT1JEIGRhdGE2IDogMjsNCisgIEZYX0RXT1JEIGRhdGE3IDogODsNCit9IEZYX0JBU0U2NERBVEEsICpGWF9MUEJBU0U2NEVOQ09ERURBVEE7DQordHlwZWRlZiBGWF9CQVNFNjREQVRBIGNvbnN0KiBGWF9MUENCQVNFNjREQVRBOw0KK3N0YXRpYyB2b2lkIEZYX0Jhc2U2NEVuY29kZVBpZWNlKGNvbnN0IEZYX0JBU0U2NERBVEEmIHNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIGRzdFs0XSkgew0KKyAgZHN0WzBdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbc3JjLmRhdGEyXTsNCisgIEZYX0RXT1JEIGIgPSBzcmMuZGF0YTEgPDwgNDsNCisgIGlmIChpQnl0ZXMgPiAxKSB7DQorICAgIGIgfD0gc3JjLmRhdGE0Ow0KKyAgfQ0KKyAgZHN0WzFdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbYl07DQorICBpZiAoaUJ5dGVzID4gMSkgew0KKyAgICBiID0gc3JjLmRhdGEzIDw8IDI7DQorICAgIGlmIChpQnl0ZXMgPiAyKSB7DQorICAgICAgYiB8PSBzcmMuZGF0YTY7DQogICAgIH0NCi0gICAgZHN0WzFdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbYl07DQotICAgIGlmIChpQnl0ZXMgPiAxKSB7DQotICAgICAgICBiID0gc3JjLmRhdGEzIDw8IDI7DQotICAgICAgICBpZiAoaUJ5dGVzID4gMikgew0KLSAgICAgICAgICAgIGIgfD0gc3JjLmRhdGE2Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZHN0WzJdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbYl07DQotICAgICAgICBpZiAoaUJ5dGVzID4gMikgew0KLSAgICAgICAgICAgIGRzdFszXSA9IGdfRlhCYXNlNjRFbmNvZGVyTWFwW3NyYy5kYXRhNV07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGRzdFszXSA9ICc9JzsNCi0gICAgICAgIH0NCisgICAgZHN0WzJdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbYl07DQorICAgIGlmIChpQnl0ZXMgPiAyKSB7DQorICAgICAgZHN0WzNdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbc3JjLmRhdGE1XTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIGRzdFsyXSA9IGRzdFszXSA9ICc9JzsNCisgICAgICBkc3RbM10gPSAnPSc7DQogICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGRzdFsyXSA9IGRzdFszXSA9ICc9JzsNCisgIH0NCiB9DQotaW50MzJfdCBGWF9CYXNlNjRFbmNvZGVBKGNvbnN0IHVpbnQ4X3QqIHBTcmMsIGludDMyX3QgaVNyY0xlbiwgRlhfQ0hBUiogcERzdCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwU3JjICE9IE5VTEwpOw0KLSAgICBpZiAoaVNyY0xlbiA8IDEpIHsNCi0gICAgICAgIHJldHVybiAwOw0KK2ludDMyX3QgRlhfQmFzZTY0RW5jb2RlQShjb25zdCB1aW50OF90KiBwU3JjLCBpbnQzMl90IGlTcmNMZW4sIEZYX0NIQVIqIHBEc3QpIHsNCisgIEZYU1lTX2Fzc2VydChwU3JjICE9IE5VTEwpOw0KKyAgaWYgKGlTcmNMZW4gPCAxKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKHBEc3QgPT0gTlVMTCkgew0KKyAgICBpbnQzMl90IGlEc3RMZW4gPSBpU3JjTGVuIC8gMyAqIDQ7DQorICAgIGlmICgoaVNyY0xlbiAlIDMpICE9IDApIHsNCisgICAgICBpRHN0TGVuICs9IDQ7DQogICAgIH0NCi0gICAgaWYgKHBEc3QgPT0gTlVMTCkgew0KLSAgICAgICAgaW50MzJfdCBpRHN0TGVuID0gaVNyY0xlbiAvIDMgKiA0Ow0KLSAgICAgICAgaWYgKChpU3JjTGVuICUgMykgIT0gMCkgew0KLSAgICAgICAgICAgIGlEc3RMZW4gKz0gNDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpRHN0TGVuOw0KKyAgICByZXR1cm4gaURzdExlbjsNCisgIH0NCisgIEZYX0JBU0U2NERBVEEgc3JjRGF0YTsNCisgIGludDMyX3QgaUJ5dGVzID0gMzsNCisgIEZYX0NIQVIqIHBEc3RFbmQgPSBwRHN0Ow0KKyAgd2hpbGUgKGlTcmNMZW4gPiAwKSB7DQorICAgIGlmIChpU3JjTGVuID4gMikgew0KKyAgICAgICgodWludDhfdCopJnNyY0RhdGEpWzBdID0gKnBTcmMrKzsNCisgICAgICAoKHVpbnQ4X3QqKSZzcmNEYXRhKVsxXSA9ICpwU3JjKys7DQorICAgICAgKCh1aW50OF90Kikmc3JjRGF0YSlbMl0gPSAqcFNyYysrOw0KKyAgICAgIGlTcmNMZW4gLT0gMzsNCisgICAgfSBlbHNlIHsNCisgICAgICAqKChGWF9EV09SRCopJnNyY0RhdGEpID0gMDsNCisgICAgICAoKHVpbnQ4X3QqKSZzcmNEYXRhKVswXSA9ICpwU3JjKys7DQorICAgICAgaWYgKGlTcmNMZW4gPiAxKSB7DQorICAgICAgICAoKHVpbnQ4X3QqKSZzcmNEYXRhKVsxXSA9ICpwU3JjKys7DQorICAgICAgfQ0KKyAgICAgIGlCeXRlcyA9IGlTcmNMZW47DQorICAgICAgaVNyY0xlbiA9IDA7DQogICAgIH0NCi0gICAgRlhfQkFTRTY0REFUQSBzcmNEYXRhOw0KLSAgICBpbnQzMl90IGlCeXRlcyA9IDM7DQotICAgIEZYX0NIQVIqIHBEc3RFbmQgPSBwRHN0Ow0KLSAgICB3aGlsZSAoaVNyY0xlbiA+IDApIHsNCi0gICAgICAgIGlmIChpU3JjTGVuID4gMikgew0KLSAgICAgICAgICAgICgodWludDhfdCopJnNyY0RhdGEpWzBdID0gKnBTcmMgKys7DQotICAgICAgICAgICAgKCh1aW50OF90Kikmc3JjRGF0YSlbMV0gPSAqcFNyYyArKzsNCi0gICAgICAgICAgICAoKHVpbnQ4X3QqKSZzcmNEYXRhKVsyXSA9ICpwU3JjICsrOw0KLSAgICAgICAgICAgIGlTcmNMZW4gLT0gMzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgKigoRlhfRFdPUkQqKSZzcmNEYXRhKSA9IDA7DQotICAgICAgICAgICAgKCh1aW50OF90Kikmc3JjRGF0YSlbMF0gPSAqcFNyYyArKzsNCi0gICAgICAgICAgICBpZiAoaVNyY0xlbiA+IDEpIHsNCi0gICAgICAgICAgICAgICAgKCh1aW50OF90Kikmc3JjRGF0YSlbMV0gPSAqcFNyYyArKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaUJ5dGVzID0gaVNyY0xlbjsNCi0gICAgICAgICAgICBpU3JjTGVuID0gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0Jhc2U2NEVuY29kZVBpZWNlKHNyY0RhdGEsIGlCeXRlcywgcERzdEVuZCk7DQotICAgICAgICBwRHN0RW5kICs9IDQ7DQotICAgIH0NCi0gICAgcmV0dXJuIHBEc3RFbmQgLSBwRHN0Ow0KKyAgICBGWF9CYXNlNjRFbmNvZGVQaWVjZShzcmNEYXRhLCBpQnl0ZXMsIHBEc3RFbmQpOw0KKyAgICBwRHN0RW5kICs9IDQ7DQorICB9DQorICByZXR1cm4gcERzdEVuZCAtIHBEc3Q7DQogfQ0KIGNvbnN0IHN0YXRpYyB1aW50OF90IGdfRlhCYXNlNjREZWNvZGVyTWFwWzI1Nl0gPSB7DQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0YsDQotICAgIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4M0IsDQotICAgIDB4M0MsIDB4M0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsDQotICAgIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsDQotICAgIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsDQotICAgIDB4MTcsIDB4MTgsIDB4MTksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsIDB4MjAsDQotICAgIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsDQotICAgIDB4MjksIDB4MkEsIDB4MkIsIDB4MkMsIDB4MkQsIDB4MkUsIDB4MkYsIDB4MzAsDQotICAgIDB4MzEsIDB4MzIsIDB4MzMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0YsDQorICAgIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4M0IsIDB4M0MsIDB4M0QsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsDQorICAgIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTIsDQorICAgIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsDQorICAgIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MkEsIDB4MkIsIDB4MkMsIDB4MkQsIDB4MkUsIDB4MkYsIDB4MzAsDQorICAgIDB4MzEsIDB4MzIsIDB4MzMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsDQogfTsNCi1zdGF0aWMgdm9pZCBGWF9CYXNlNjREZWNvZGVQaWVjZShjb25zdCBGWF9DSEFSIHNyY1s0XSwgaW50MzJfdCBpQ2hhcnMsIEZYX0JBU0U2NERBVEEgJmRzdCwgaW50MzJfdCAmaUJ5dGVzKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KGlDaGFycyA+IDAgJiYgaUNoYXJzIDwgNSk7DQotICAgIGlCeXRlcyA9IDE7DQotICAgIGRzdC5kYXRhMiA9IGdfRlhCYXNlNjREZWNvZGVyTWFwWyh1aW50OF90KXNyY1swXV07DQotICAgIGlmIChpQ2hhcnMgPiAxKSB7DQotICAgICAgICB1aW50OF90IGIgPSBnX0ZYQmFzZTY0RGVjb2Rlck1hcFsodWludDhfdClzcmNbMV1dOw0KLSAgICAgICAgZHN0LmRhdGExID0gYiA+PiA0Ow0KLSAgICAgICAgZHN0LmRhdGE0ID0gYjsNCi0gICAgICAgIGlmIChpQ2hhcnMgPiAyKSB7DQotICAgICAgICAgICAgaUJ5dGVzID0gMjsNCi0gICAgICAgICAgICBiID0gZ19GWEJhc2U2NERlY29kZXJNYXBbKHVpbnQ4X3Qpc3JjWzJdXTsNCi0gICAgICAgICAgICBkc3QuZGF0YTMgPSBiID4+IDI7DQotICAgICAgICAgICAgZHN0LmRhdGE2ID0gYjsNCi0gICAgICAgICAgICBpZiAoaUNoYXJzID4gMykgew0KLSAgICAgICAgICAgICAgICBpQnl0ZXMgPSAzOw0KLSAgICAgICAgICAgICAgICBkc3QuZGF0YTUgPSBnX0ZYQmFzZTY0RGVjb2Rlck1hcFsodWludDhfdClzcmNbM11dOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGRzdC5kYXRhNSA9IDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBkc3QuZGF0YTMgPSAwOw0KLSAgICAgICAgfQ0KK3N0YXRpYyB2b2lkIEZYX0Jhc2U2NERlY29kZVBpZWNlKGNvbnN0IEZYX0NIQVIgc3JjWzRdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JBU0U2NERBVEEmIGRzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQnl0ZXMpIHsNCisgIEZYU1lTX2Fzc2VydChpQ2hhcnMgPiAwICYmIGlDaGFycyA8IDUpOw0KKyAgaUJ5dGVzID0gMTsNCisgIGRzdC5kYXRhMiA9IGdfRlhCYXNlNjREZWNvZGVyTWFwWyh1aW50OF90KXNyY1swXV07DQorICBpZiAoaUNoYXJzID4gMSkgew0KKyAgICB1aW50OF90IGIgPSBnX0ZYQmFzZTY0RGVjb2Rlck1hcFsodWludDhfdClzcmNbMV1dOw0KKyAgICBkc3QuZGF0YTEgPSBiID4+IDQ7DQorICAgIGRzdC5kYXRhNCA9IGI7DQorICAgIGlmIChpQ2hhcnMgPiAyKSB7DQorICAgICAgaUJ5dGVzID0gMjsNCisgICAgICBiID0gZ19GWEJhc2U2NERlY29kZXJNYXBbKHVpbnQ4X3Qpc3JjWzJdXTsNCisgICAgICBkc3QuZGF0YTMgPSBiID4+IDI7DQorICAgICAgZHN0LmRhdGE2ID0gYjsNCisgICAgICBpZiAoaUNoYXJzID4gMykgew0KKyAgICAgICAgaUJ5dGVzID0gMzsNCisgICAgICAgIGRzdC5kYXRhNSA9IGdfRlhCYXNlNjREZWNvZGVyTWFwWyh1aW50OF90KXNyY1szXV07DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGRzdC5kYXRhNSA9IDA7DQorICAgICAgfQ0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgZHN0LmRhdGExID0gMDsNCisgICAgICBkc3QuZGF0YTMgPSAwOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBkc3QuZGF0YTEgPSAwOw0KKyAgfQ0KIH0NCi1pbnQzMl90IEZYX0Jhc2U2NERlY29kZUEoY29uc3QgRlhfQ0hBUiogcFNyYywgaW50MzJfdCBpU3JjTGVuLCB1aW50OF90KiBwRHN0KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBTcmMgIT0gTlVMTCk7DQotICAgIGlmIChpU3JjTGVuIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQoraW50MzJfdCBGWF9CYXNlNjREZWNvZGVBKGNvbnN0IEZYX0NIQVIqIHBTcmMsIGludDMyX3QgaVNyY0xlbiwgdWludDhfdCogcERzdCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBTcmMgIT0gTlVMTCk7DQorICBpZiAoaVNyY0xlbiA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB3aGlsZSAoaVNyY0xlbiA+IDAgJiYgcFNyY1tpU3JjTGVuIC0gMV0gPT0gJz0nKSB7DQorICAgIGlTcmNMZW4tLTsNCisgIH0NCisgIGlmIChpU3JjTGVuIDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChwRHN0ID09IE5VTEwpIHsNCisgICAgaW50MzJfdCBpRHN0TGVuID0gaVNyY0xlbiAvIDQgKiAzOw0KKyAgICBpU3JjTGVuICU9IDQ7DQorICAgIGlmIChpU3JjTGVuID09IDEpIHsNCisgICAgICBpRHN0TGVuICs9IDE7DQorICAgIH0gZWxzZSBpZiAoaVNyY0xlbiA9PSAyKSB7DQorICAgICAgaURzdExlbiArPSAxOw0KKyAgICB9IGVsc2UgaWYgKGlTcmNMZW4gPT0gMykgew0KKyAgICAgIGlEc3RMZW4gKz0gMjsNCiAgICAgfQ0KLSAgICB3aGlsZSAoaVNyY0xlbiA+IDAgJiYgcFNyY1tpU3JjTGVuIC0gMV0gPT0gJz0nKSB7DQotICAgICAgICBpU3JjTGVuIC0tOw0KKyAgICByZXR1cm4gaURzdExlbjsNCisgIH0NCisgIEZYX0NIQVIgc3JjRGF0YVs0XTsNCisgIEZYX0JBU0U2NERBVEEgZHN0RGF0YTsNCisgIGludDMyX3QgaUNoYXJzID0gNCwgaUJ5dGVzOw0KKyAgdWludDhfdCogcERzdEVuZCA9IHBEc3Q7DQorICB3aGlsZSAoaVNyY0xlbiA+IDApIHsNCisgICAgaWYgKGlTcmNMZW4gPiAzKSB7DQorICAgICAgKigoRlhfRFdPUkQqKXNyY0RhdGEpID0gKigoRlhfRFdPUkQqKXBTcmMpOw0KKyAgICAgIHBTcmMgKz0gNDsNCisgICAgICBpU3JjTGVuIC09IDQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgKigoRlhfRFdPUkQqKSZkc3REYXRhKSA9IDA7DQorICAgICAgKigoRlhfRFdPUkQqKXNyY0RhdGEpID0gMDsNCisgICAgICBzcmNEYXRhWzBdID0gKnBTcmMrKzsNCisgICAgICBpZiAoaVNyY0xlbiA+IDEpIHsNCisgICAgICAgIHNyY0RhdGFbMV0gPSAqcFNyYysrOw0KKyAgICAgIH0NCisgICAgICBpZiAoaVNyY0xlbiA+IDIpIHsNCisgICAgICAgIHNyY0RhdGFbMl0gPSAqcFNyYysrOw0KKyAgICAgIH0NCisgICAgICBpQ2hhcnMgPSBpU3JjTGVuOw0KKyAgICAgIGlTcmNMZW4gPSAwOw0KICAgICB9DQotICAgIGlmIChpU3JjTGVuIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQorICAgIEZYX0Jhc2U2NERlY29kZVBpZWNlKHNyY0RhdGEsIGlDaGFycywgZHN0RGF0YSwgaUJ5dGVzKTsNCisgICAgKnBEc3RFbmQrKyA9ICgodWludDhfdCopJmRzdERhdGEpWzBdOw0KKyAgICBpZiAoaUJ5dGVzID4gMSkgew0KKyAgICAgICpwRHN0RW5kKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsxXTsNCiAgICAgfQ0KLSAgICBpZiAocERzdCA9PSBOVUxMKSB7DQotICAgICAgICBpbnQzMl90IGlEc3RMZW4gPSBpU3JjTGVuIC8gNCAqIDM7DQotICAgICAgICBpU3JjTGVuICU9IDQ7DQotICAgICAgICBpZiAoaVNyY0xlbiA9PSAxKSB7DQotICAgICAgICAgICAgaURzdExlbiArPSAxOw0KLSAgICAgICAgfSBlbHNlIGlmIChpU3JjTGVuID09IDIpIHsNCi0gICAgICAgICAgICBpRHN0TGVuICs9IDE7DQotICAgICAgICB9IGVsc2UgaWYgKGlTcmNMZW4gPT0gMykgew0KLSAgICAgICAgICAgIGlEc3RMZW4gKz0gMjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpRHN0TGVuOw0KKyAgICBpZiAoaUJ5dGVzID4gMikgew0KKyAgICAgICpwRHN0RW5kKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsyXTsNCiAgICAgfQ0KLSAgICBGWF9DSEFSIHNyY0RhdGFbNF07DQotICAgIEZYX0JBU0U2NERBVEEgZHN0RGF0YTsNCi0gICAgaW50MzJfdCBpQ2hhcnMgPSA0LCBpQnl0ZXM7DQotICAgIHVpbnQ4X3QqIHBEc3RFbmQgPSBwRHN0Ow0KLSAgICB3aGlsZSAoaVNyY0xlbiA+IDApIHsNCi0gICAgICAgIGlmIChpU3JjTGVuID4gMykgew0KLSAgICAgICAgICAgICooKEZYX0RXT1JEKilzcmNEYXRhKSA9ICooKEZYX0RXT1JEKilwU3JjKTsNCi0gICAgICAgICAgICBwU3JjICs9IDQ7DQotICAgICAgICAgICAgaVNyY0xlbiAtPSA0Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAqKChGWF9EV09SRCopJmRzdERhdGEpID0gMDsNCi0gICAgICAgICAgICAqKChGWF9EV09SRCopc3JjRGF0YSkgPSAwOw0KLSAgICAgICAgICAgIHNyY0RhdGFbMF0gPSAqcFNyYyArKzsNCi0gICAgICAgICAgICBpZiAoaVNyY0xlbiA+IDEpIHsNCi0gICAgICAgICAgICAgICAgc3JjRGF0YVsxXSA9ICpwU3JjICsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoaVNyY0xlbiA+IDIpIHsNCi0gICAgICAgICAgICAgICAgc3JjRGF0YVsyXSA9ICpwU3JjICsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpQ2hhcnMgPSBpU3JjTGVuOw0KLSAgICAgICAgICAgIGlTcmNMZW4gPSAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfQmFzZTY0RGVjb2RlUGllY2Uoc3JjRGF0YSwgaUNoYXJzLCBkc3REYXRhLCBpQnl0ZXMpOw0KLSAgICAgICAgKnBEc3RFbmQgKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVswXTsNCi0gICAgICAgIGlmIChpQnl0ZXMgPiAxKSB7DQotICAgICAgICAgICAgKnBEc3RFbmQgKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsxXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpQnl0ZXMgPiAyKSB7DQotICAgICAgICAgICAgKnBEc3RFbmQgKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsyXTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcERzdEVuZCAtIHBEc3Q7DQorICB9DQorICByZXR1cm4gcERzdEVuZCAtIHBEc3Q7DQogfQ0KLWludDMyX3QgRlhfQmFzZTY0RGVjb2RlVyhjb25zdCBGWF9XQ0hBUiogcFNyYywgaW50MzJfdCBpU3JjTGVuLCB1aW50OF90KiBwRHN0KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBTcmMgIT0gTlVMTCk7DQotICAgIGlmIChpU3JjTGVuIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQoraW50MzJfdCBGWF9CYXNlNjREZWNvZGVXKGNvbnN0IEZYX1dDSEFSKiBwU3JjLCBpbnQzMl90IGlTcmNMZW4sIHVpbnQ4X3QqIHBEc3QpIHsNCisgIEZYU1lTX2Fzc2VydChwU3JjICE9IE5VTEwpOw0KKyAgaWYgKGlTcmNMZW4gPCAxKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgd2hpbGUgKGlTcmNMZW4gPiAwICYmIHBTcmNbaVNyY0xlbiAtIDFdID09ICc9Jykgew0KKyAgICBpU3JjTGVuLS07DQorICB9DQorICBpZiAoaVNyY0xlbiA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAocERzdCA9PSBOVUxMKSB7DQorICAgIGludDMyX3QgaURzdExlbiA9IGlTcmNMZW4gLyA0ICogMzsNCisgICAgaVNyY0xlbiAlPSA0Ow0KKyAgICBpZiAoaVNyY0xlbiA9PSAxKSB7DQorICAgICAgaURzdExlbiArPSAxOw0KKyAgICB9IGVsc2UgaWYgKGlTcmNMZW4gPT0gMikgew0KKyAgICAgIGlEc3RMZW4gKz0gMTsNCisgICAgfSBlbHNlIGlmIChpU3JjTGVuID09IDMpIHsNCisgICAgICBpRHN0TGVuICs9IDI7DQogICAgIH0NCi0gICAgd2hpbGUgKGlTcmNMZW4gPiAwICYmIHBTcmNbaVNyY0xlbiAtIDFdID09ICc9Jykgew0KLSAgICAgICAgaVNyY0xlbiAtLTsNCisgICAgcmV0dXJuIGlEc3RMZW47DQorICB9DQorICBGWF9DSEFSIHNyY0RhdGFbNF07DQorICBGWF9CQVNFNjREQVRBIGRzdERhdGE7DQorICBpbnQzMl90IGlDaGFycyA9IDQsIGlCeXRlczsNCisgIHVpbnQ4X3QqIHBEc3RFbmQgPSBwRHN0Ow0KKyAgd2hpbGUgKGlTcmNMZW4gPiAwKSB7DQorICAgIGlmIChpU3JjTGVuID4gMykgew0KKyAgICAgIHNyY0RhdGFbMF0gPSAoRlhfQ0hBUikqcFNyYysrOw0KKyAgICAgIHNyY0RhdGFbMV0gPSAoRlhfQ0hBUikqcFNyYysrOw0KKyAgICAgIHNyY0RhdGFbMl0gPSAoRlhfQ0hBUikqcFNyYysrOw0KKyAgICAgIHNyY0RhdGFbM10gPSAoRlhfQ0hBUikqcFNyYysrOw0KKyAgICAgIGlTcmNMZW4gLT0gNDsNCisgICAgfSBlbHNlIHsNCisgICAgICAqKChGWF9EV09SRCopJmRzdERhdGEpID0gMDsNCisgICAgICAqKChGWF9EV09SRCopc3JjRGF0YSkgPSAwOw0KKyAgICAgIHNyY0RhdGFbMF0gPSAoRlhfQ0hBUikqcFNyYysrOw0KKyAgICAgIGlmIChpU3JjTGVuID4gMSkgew0KKyAgICAgICAgc3JjRGF0YVsxXSA9IChGWF9DSEFSKSpwU3JjKys7DQorICAgICAgfQ0KKyAgICAgIGlmIChpU3JjTGVuID4gMikgew0KKyAgICAgICAgc3JjRGF0YVsyXSA9IChGWF9DSEFSKSpwU3JjKys7DQorICAgICAgfQ0KKyAgICAgIGlDaGFycyA9IGlTcmNMZW47DQorICAgICAgaVNyY0xlbiA9IDA7DQogICAgIH0NCi0gICAgaWYgKGlTcmNMZW4gPCAxKSB7DQotICAgICAgICByZXR1cm4gMDsNCisgICAgRlhfQmFzZTY0RGVjb2RlUGllY2Uoc3JjRGF0YSwgaUNoYXJzLCBkc3REYXRhLCBpQnl0ZXMpOw0KKyAgICAqcERzdEVuZCsrID0gKCh1aW50OF90KikmZHN0RGF0YSlbMF07DQorICAgIGlmIChpQnl0ZXMgPiAxKSB7DQorICAgICAgKnBEc3RFbmQrKyA9ICgodWludDhfdCopJmRzdERhdGEpWzFdOw0KICAgICB9DQotICAgIGlmIChwRHN0ID09IE5VTEwpIHsNCi0gICAgICAgIGludDMyX3QgaURzdExlbiA9IGlTcmNMZW4gLyA0ICogMzsNCi0gICAgICAgIGlTcmNMZW4gJT0gNDsNCi0gICAgICAgIGlmIChpU3JjTGVuID09IDEpIHsNCi0gICAgICAgICAgICBpRHN0TGVuICs9IDE7DQotICAgICAgICB9IGVsc2UgaWYgKGlTcmNMZW4gPT0gMikgew0KLSAgICAgICAgICAgIGlEc3RMZW4gKz0gMTsNCi0gICAgICAgIH0gZWxzZSBpZiAoaVNyY0xlbiA9PSAzKSB7DQotICAgICAgICAgICAgaURzdExlbiArPSAyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGlEc3RMZW47DQorICAgIGlmIChpQnl0ZXMgPiAyKSB7DQorICAgICAgKnBEc3RFbmQrKyA9ICgodWludDhfdCopJmRzdERhdGEpWzJdOw0KICAgICB9DQotICAgIEZYX0NIQVIgc3JjRGF0YVs0XTsNCi0gICAgRlhfQkFTRTY0REFUQSBkc3REYXRhOw0KLSAgICBpbnQzMl90IGlDaGFycyA9IDQsIGlCeXRlczsNCi0gICAgdWludDhfdCogcERzdEVuZCA9IHBEc3Q7DQotICAgIHdoaWxlIChpU3JjTGVuID4gMCkgew0KLSAgICAgICAgaWYgKGlTcmNMZW4gPiAzKSB7DQotICAgICAgICAgICAgc3JjRGF0YVswXSA9IChGWF9DSEFSKSAqIHBTcmMgKys7DQotICAgICAgICAgICAgc3JjRGF0YVsxXSA9IChGWF9DSEFSKSAqIHBTcmMgKys7DQotICAgICAgICAgICAgc3JjRGF0YVsyXSA9IChGWF9DSEFSKSAqIHBTcmMgKys7DQotICAgICAgICAgICAgc3JjRGF0YVszXSA9IChGWF9DSEFSKSAqIHBTcmMgKys7DQotICAgICAgICAgICAgaVNyY0xlbiAtPSA0Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAqKChGWF9EV09SRCopJmRzdERhdGEpID0gMDsNCi0gICAgICAgICAgICAqKChGWF9EV09SRCopc3JjRGF0YSkgPSAwOw0KLSAgICAgICAgICAgIHNyY0RhdGFbMF0gPSAoRlhfQ0hBUikgKiBwU3JjICsrOw0KLSAgICAgICAgICAgIGlmIChpU3JjTGVuID4gMSkgew0KLSAgICAgICAgICAgICAgICBzcmNEYXRhWzFdID0gKEZYX0NIQVIpICogcFNyYyArKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGlTcmNMZW4gPiAyKSB7DQotICAgICAgICAgICAgICAgIHNyY0RhdGFbMl0gPSAoRlhfQ0hBUikgKiBwU3JjICsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpQ2hhcnMgPSBpU3JjTGVuOw0KLSAgICAgICAgICAgIGlTcmNMZW4gPSAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfQmFzZTY0RGVjb2RlUGllY2Uoc3JjRGF0YSwgaUNoYXJzLCBkc3REYXRhLCBpQnl0ZXMpOw0KLSAgICAgICAgKnBEc3RFbmQgKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVswXTsNCi0gICAgICAgIGlmIChpQnl0ZXMgPiAxKSB7DQotICAgICAgICAgICAgKnBEc3RFbmQgKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsxXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpQnl0ZXMgPiAyKSB7DQotICAgICAgICAgICAgKnBEc3RFbmQgKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsyXTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcERzdEVuZCAtIHBEc3Q7DQorICB9DQorICByZXR1cm4gcERzdEVuZCAtIHBEc3Q7DQogfQ0KIGNvbnN0IHN0YXRpYyB1aW50OF90IGdfRlhIZXgyRGVjTWFwWzI1Nl0gPSB7DQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTEsCTIsCTMsCTQsCTUsCTYsCTcsCTgsCTksCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTEwLAkxMSwJMTIsCTEzLAkxNCwJMTUsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTEwLAkxMSwJMTIsCTEzLAkxNCwJMTUsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQotICAgIDAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsDQorICAgIDAsICAwLCAgMCwgIDAsIDAsIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAgMCwNCisgICAgMCwgIDAsICAwLCAgMCwgMCwgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsICAwLA0KKyAgICAwLCAgMCwgIDAsICAwLCAwLCAwLCAgMCwgIDAsICAwLCAgMSwgIDIsICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAgMCwgIDAsDQorICAgIDAsICAwLCAgMCwgIDAsIDAsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAgMCwNCisgICAgMCwgIDAsICAwLCAgMCwgMCwgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMTAsIDExLCAxMiwNCisgICAgMTMsIDE0LCAxNSwgMCwgMCwgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsICAwLA0KKyAgICAwLCAgMCwgIDAsICAwLCAwLCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgIDAsDQorICAgIDAsICAwLCAgMCwgIDAsIDAsIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAgMCwNCisgICAgMCwgIDAsICAwLCAgMCwgMCwgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsICAwLA0KKyAgICAwLCAgMCwgIDAsICAwLCAwLCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgIDAsDQorICAgIDAsICAwLCAgMCwgIDAsIDAsIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAgMCwNCisgICAgMCwgIDAsICAwLCAgMCwgMCwgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsICAwLA0KKyAgICAwLCAgMCwgIDAsICAwLCAwLCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLA0KIH07DQotdWludDhfdCBGWF9IZXgyRGVjKHVpbnQ4X3QgaGV4SGlnaCwgdWludDhfdCBoZXhMb3cpDQotew0KLSAgICByZXR1cm4gKGdfRlhIZXgyRGVjTWFwW2hleEhpZ2hdIDw8IDQpICsgZ19GWEhleDJEZWNNYXBbaGV4TG93XTsNCit1aW50OF90IEZYX0hleDJEZWModWludDhfdCBoZXhIaWdoLCB1aW50OF90IGhleExvdykgew0KKyAgcmV0dXJuIChnX0ZYSGV4MkRlY01hcFtoZXhIaWdoXSA8PCA0KSArIGdfRlhIZXgyRGVjTWFwW2hleExvd107DQogfQ0KLWludDMyX3QgRlhfU2VwYXJhdGVTdHJpbmdXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlTdHJMZW4sIEZYX1dDSEFSIGRlbGltaXRlciwgQ0ZYX1dpZGVTdHJpbmdBcnJheSAmcGllY2VzKQ0KLXsNCi0gICAgaWYgKHBTdHIgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQoraW50MzJfdCBGWF9TZXBhcmF0ZVN0cmluZ1coY29uc3QgRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RyTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIGRlbGltaXRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5JiBwaWVjZXMpIHsNCisgIGlmIChwU3RyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAoaVN0ckxlbiA8IDApIHsNCisgICAgaVN0ckxlbiA9IEZYU1lTX3djc2xlbihwU3RyKTsNCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiBwVG9rZW4gPSBwU3RyOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBFbmQgPSBwU3RyICsgaVN0ckxlbjsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGlmIChwU3RyID49IHBFbmQgfHwgZGVsaW1pdGVyID09ICpwU3RyKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3ViKHBUb2tlbiwgcFN0ciAtIHBUb2tlbik7DQorICAgICAgcGllY2VzLkFkZChzdWIpOw0KKyAgICAgIHBUb2tlbiA9IHBTdHIgKyAxOw0KKyAgICAgIGlmIChwU3RyID49IHBFbmQpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAoaVN0ckxlbiA8IDApIHsNCi0gICAgICAgIGlTdHJMZW4gPSBGWFNZU193Y3NsZW4ocFN0cik7DQotICAgIH0NCi0gICAgY29uc3QgRlhfV0NIQVIqIHBUb2tlbiA9IHBTdHI7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwRW5kID0gcFN0ciArIGlTdHJMZW47DQotICAgIHdoaWxlIChUUlVFKSB7DQotICAgICAgICBpZiAocFN0ciA+PSBwRW5kIHx8IGRlbGltaXRlciA9PSAqcFN0cikgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN1YihwVG9rZW4sIHBTdHIgLSBwVG9rZW4pOw0KLSAgICAgICAgICAgIHBpZWNlcy5BZGQoc3ViKTsNCi0gICAgICAgICAgICBwVG9rZW4gPSBwU3RyICsgMTsNCi0gICAgICAgICAgICBpZiAocFN0ciA+PSBwRW5kKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHBTdHIgKys7DQotICAgIH0NCi0gICAgcmV0dXJuIHBpZWNlcy5HZXRTaXplKCk7DQorICAgIHBTdHIrKzsNCisgIH0NCisgIHJldHVybiBwaWVjZXMuR2V0U2l6ZSgpOw0KIH0NCiAjaWZkZWYgX19jcGx1c3BsdXMNCiB9Ow0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2NvZGVwYWdlLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2NvZGVwYWdlLmNwcAppbmRleCA4NmQ4YjQ1Li43MTU0YjljIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9jb2RlcGFnZS5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfY29kZXBhZ2UuY3BwCkBAIC03LDM2NyArNywzMzUgQEAKICNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCiAjaW5jbHVkZSAiZnhfY29kZXBhZ2UuaCINCiBzdGF0aWMgY29uc3QgRlhfQ0hBUlNFVF9NQVAgZ19GWENoYXJzZXQyQ29kZVBhZ2VUYWJsZVtdID0gew0KLSAgICB7IDAsCTEyNTIgIH0sDQotICAgIHsgMSwJMAkgIH0sDQotICAgIHsgMiwJNDIJICB9LA0KLSAgICB7IDc3LAkxMDAwMCB9LA0KLSAgICB7IDc4LAkxMDAwMSB9LA0KLSAgICB7IDc5LAkxMDAwMyB9LA0KLSAgICB7IDgwLAkxMDAwOCB9LA0KLSAgICB7IDgxLAkxMDAwMiB9LA0KLSAgICB7IDgzLAkxMDAwNSB9LA0KLSAgICB7IDg0LAkxMDAwNCB9LA0KLSAgICB7IDg1LAkxMDAwNiB9LA0KLSAgICB7IDg2LAkxMDA4MSB9LA0KLSAgICB7IDg3LAkxMDAyMSB9LA0KLSAgICB7IDg4LAkxMDAyOSB9LA0KLSAgICB7IDg5LAkxMDAwNyB9LA0KLSAgICB7IDEyOCwJOTMyCX0sDQotICAgIHsgMTI5LAk5NDkJfSwNCi0gICAgeyAxMzAsCTEzNjEgfSwNCi0gICAgeyAxMzQsCTkzNgl9LA0KLSAgICB7IDEzNiwJOTUwCX0sDQotICAgIHsgMTYxLAkxMjUzIH0sDQotICAgIHsgMTYyLAkxMjU0IH0sDQotICAgIHsgMTYzLAkxMjU4IH0sDQotICAgIHsgMTc3LAkxMjU1IH0sDQotICAgIHsgMTc4LAkxMjU2IH0sDQotICAgIHsgMTg2LAkxMjU3IH0sDQotICAgIHsgMjA0LAkxMjUxIH0sDQotICAgIHsgMjIyLAk4NzQJfSwNCi0gICAgeyAyMzgsCTEyNTAgfSwNCi0gICAgeyAyNTQsCTQzNwl9LA0KLSAgICB7IDI1NSwJODUwCX0sDQorICAgIHswLCAxMjUyfSwgICB7MSwgMH0sICAgICAgezIsIDQyfSwgICAgIHs3NywgMTAwMDB9LCB7NzgsIDEwMDAxfSwNCisgICAgezc5LCAxMDAwM30sIHs4MCwgMTAwMDh9LCB7ODEsIDEwMDAyfSwgezgzLCAxMDAwNX0sIHs4NCwgMTAwMDR9LA0KKyAgICB7ODUsIDEwMDA2fSwgezg2LCAxMDA4MX0sIHs4NywgMTAwMjF9LCB7ODgsIDEwMDI5fSwgezg5LCAxMDAwN30sDQorICAgIHsxMjgsIDkzMn0sICB7MTI5LCA5NDl9LCAgezEzMCwgMTM2MX0sIHsxMzQsIDkzNn0sICB7MTM2LCA5NTB9LA0KKyAgICB7MTYxLCAxMjUzfSwgezE2MiwgMTI1NH0sIHsxNjMsIDEyNTh9LCB7MTc3LCAxMjU1fSwgezE3OCwgMTI1Nn0sDQorICAgIHsxODYsIDEyNTd9LCB7MjA0LCAxMjUxfSwgezIyMiwgODc0fSwgIHsyMzgsIDEyNTB9LCB7MjU0LCA0Mzd9LA0KKyAgICB7MjU1LCA4NTB9LA0KIH07DQotRlhfV09SRCBGWF9HZXRDb2RlUGFnZUZyb21DaGFyc2V0KHVpbnQ4X3QgY2hhcnNldCkNCi17DQotICAgIGludDMyX3QgaUVuZCA9IHNpemVvZihnX0ZYQ2hhcnNldDJDb2RlUGFnZVRhYmxlKSAvIHNpemVvZihGWF9DSEFSU0VUX01BUCkgLSAxOw0KLSAgICBGWFNZU19hc3NlcnQoaUVuZCA+PSAwKTsNCi0gICAgaW50MzJfdCBpU3RhcnQgPSAwLCBpTWlkOw0KLSAgICBkbyB7DQotICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCi0gICAgICAgIGNvbnN0IEZYX0NIQVJTRVRfTUFQICYgY3AgPSBnX0ZYQ2hhcnNldDJDb2RlUGFnZVRhYmxlW2lNaWRdOw0KLSAgICAgICAgaWYgKGNoYXJzZXQgPT0gY3AuY2hhcnNldCkgew0KLSAgICAgICAgICAgIHJldHVybiBjcC5jb2RlcGFnZTsNCi0gICAgICAgIH0gZWxzZSBpZiAoY2hhcnNldCA8IGNwLmNoYXJzZXQpIHsNCi0gICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQotICAgIHJldHVybiAweEZGRkY7DQorRlhfV09SRCBGWF9HZXRDb2RlUGFnZUZyb21DaGFyc2V0KHVpbnQ4X3QgY2hhcnNldCkgew0KKyAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfRlhDaGFyc2V0MkNvZGVQYWdlVGFibGUpIC8gc2l6ZW9mKEZYX0NIQVJTRVRfTUFQKSAtIDE7DQorICBGWFNZU19hc3NlcnQoaUVuZCA+PSAwKTsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaU1pZDsNCisgIGRvIHsNCisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIGNvbnN0IEZYX0NIQVJTRVRfTUFQJiBjcCA9IGdfRlhDaGFyc2V0MkNvZGVQYWdlVGFibGVbaU1pZF07DQorICAgIGlmIChjaGFyc2V0ID09IGNwLmNoYXJzZXQpIHsNCisgICAgICByZXR1cm4gY3AuY29kZXBhZ2U7DQorICAgIH0gZWxzZSBpZiAoY2hhcnNldCA8IGNwLmNoYXJzZXQpIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0NCisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgIHJldHVybiAweEZGRkY7DQogfQ0KIHN0YXRpYyBjb25zdCBGWF9DSEFSU0VUX01BUCBnX0ZYQ29kZXBhZ2UyQ2hhcnNldFRhYmxlW10gPSB7DQotICAgIHsgMSwJMAkgIH0sDQotICAgIHsgMiwJNDIJICB9LA0KLSAgICB7IDI1NCwJNDM3CX0sDQotICAgIHsgMjU1LAk4NTAJfSwNCi0gICAgeyAyMjIsCTg3NAl9LA0KLSAgICB7IDEyOCwJOTMyCX0sDQotICAgIHsgMTM0LAk5MzYJfSwNCi0gICAgeyAxMjksCTk0OQl9LA0KLSAgICB7IDEzNiwJOTUwCX0sDQotICAgIHsgMjM4LAkxMjUwIH0sDQotICAgIHsgMjA0LAkxMjUxIH0sDQotICAgIHsgMCwJMTI1MiAgfSwNCi0gICAgeyAxNjEsCTEyNTMgfSwNCi0gICAgeyAxNjIsCTEyNTQgfSwNCi0gICAgeyAxNzcsCTEyNTUgfSwNCi0gICAgeyAxNzgsCTEyNTYgfSwNCi0gICAgeyAxODYsCTEyNTcgfSwNCi0gICAgeyAxNjMsCTEyNTggfSwNCi0gICAgeyAxMzAsCTEzNjEgfSwNCi0gICAgeyA3NywJMTAwMDAgfSwNCi0gICAgeyA3OCwJMTAwMDEgfSwNCi0gICAgeyA3OSwJMTAwMDMgfSwNCi0gICAgeyA4MCwJMTAwMDggfSwNCi0gICAgeyA4MSwJMTAwMDIgfSwNCi0gICAgeyA4MywJMTAwMDUgfSwNCi0gICAgeyA4NCwJMTAwMDQgfSwNCi0gICAgeyA4NSwJMTAwMDYgfSwNCi0gICAgeyA4NiwJMTAwODEgfSwNCi0gICAgeyA4NywJMTAwMjEgfSwNCi0gICAgeyA4OCwJMTAwMjkgfSwNCi0gICAgeyA4OSwJMTAwMDcgfSwNCisgICAgezEsIDB9LCAgICAgIHsyLCA0Mn0sICAgICB7MjU0LCA0Mzd9LCAgezI1NSwgODUwfSwgIHsyMjIsIDg3NH0sDQorICAgIHsxMjgsIDkzMn0sICB7MTM0LCA5MzZ9LCAgezEyOSwgOTQ5fSwgIHsxMzYsIDk1MH0sICB7MjM4LCAxMjUwfSwNCisgICAgezIwNCwgMTI1MX0sIHswLCAxMjUyfSwgICB7MTYxLCAxMjUzfSwgezE2MiwgMTI1NH0sIHsxNzcsIDEyNTV9LA0KKyAgICB7MTc4LCAxMjU2fSwgezE4NiwgMTI1N30sIHsxNjMsIDEyNTh9LCB7MTMwLCAxMzYxfSwgezc3LCAxMDAwMH0sDQorICAgIHs3OCwgMTAwMDF9LCB7NzksIDEwMDAzfSwgezgwLCAxMDAwOH0sIHs4MSwgMTAwMDJ9LCB7ODMsIDEwMDA1fSwNCisgICAgezg0LCAxMDAwNH0sIHs4NSwgMTAwMDZ9LCB7ODYsIDEwMDgxfSwgezg3LCAxMDAyMX0sIHs4OCwgMTAwMjl9LA0KKyAgICB7ODksIDEwMDA3fSwNCiB9Ow0KLUZYX1dPUkQgRlhfR2V0Q2hhcnNldEZyb21Db2RlUGFnZShGWF9XT1JEIGNvZGVwYWdlKQ0KLXsNCi0gICAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfRlhDb2RlcGFnZTJDaGFyc2V0VGFibGUpIC8gc2l6ZW9mKEZYX0NIQVJTRVRfTUFQKSAtIDE7DQotICAgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KLSAgICBpbnQzMl90IGlTdGFydCA9IDAsIGlNaWQ7DQotICAgIGRvIHsNCi0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgY29uc3QgRlhfQ0hBUlNFVF9NQVAgJiBjcCA9IGdfRlhDb2RlcGFnZTJDaGFyc2V0VGFibGVbaU1pZF07DQotICAgICAgICBpZiAoY29kZXBhZ2UgPT0gY3AuY29kZXBhZ2UpIHsNCi0gICAgICAgICAgICByZXR1cm4gY3AuY2hhcnNldDsNCi0gICAgICAgIH0gZWxzZSBpZiAoY29kZXBhZ2UgPCBjcC5jb2RlcGFnZSkgew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgcmV0dXJuIDB4RkZGRjsNCitGWF9XT1JEIEZYX0dldENoYXJzZXRGcm9tQ29kZVBhZ2UoRlhfV09SRCBjb2RlcGFnZSkgew0KKyAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfRlhDb2RlcGFnZTJDaGFyc2V0VGFibGUpIC8gc2l6ZW9mKEZYX0NIQVJTRVRfTUFQKSAtIDE7DQorICBGWFNZU19hc3NlcnQoaUVuZCA+PSAwKTsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaU1pZDsNCisgIGRvIHsNCisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIGNvbnN0IEZYX0NIQVJTRVRfTUFQJiBjcCA9IGdfRlhDb2RlcGFnZTJDaGFyc2V0VGFibGVbaU1pZF07DQorICAgIGlmIChjb2RlcGFnZSA9PSBjcC5jb2RlcGFnZSkgew0KKyAgICAgIHJldHVybiBjcC5jaGFyc2V0Ow0KKyAgICB9IGVsc2UgaWYgKGNvZGVwYWdlIDwgY3AuY29kZXBhZ2UpIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0NCisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgIHJldHVybiAweEZGRkY7DQogfQ0KIGNvbnN0IEZYX0xBTkcyQ1BNQVAgZ19GWExhbmcyQ29kZXBhZ2VUYWJsZVtdID0gew0KLSAgICB7RlhfTEFOR19BcmFiaWNfU2F1ZGlBcmFiaWEgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWMgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19CdWxnYXJpYW5fQnVsZ2FyaWEgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KLSAgICB7RlhfTEFOR19DYXRhbGFuX0NhdGFsYW4gICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19DaGluZXNlX1RhaXdhbiAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9DaGluZXNlVHJhZGl0aW9uYWwgICB9LA0KLSAgICB7RlhfTEFOR19DemVjaFJlcHVibGljICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19EYW5pc2hfRGVubWFyayAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19HZXJtYW5fR2VybWFueSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19HcmVla19HcmVlY2UgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9HcmVlayAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19FbmdsaXNoX1VuaXRlZFN0YXRlcyAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19TcGFuaXNoX1RyYWRpdGlvbmFsU29ydCAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19GaW5uaXNoX0ZpbmxhbmQgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19GcmVuY2hfRnJhbmNlICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19IZWJyZXdfSXNyYWVsICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9IZWJyZXcgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19IdW5nYXJpYW5fSHVuZ2FyeSAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19JY2VsYW5kaWNfSWNlbGFuZCAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19JdGFsaWFuX0l0YWx5ICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19KYXBhbmVzZV9KYXBhbiAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9TaGlmdEpJUyAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19Lb3JlYW5fS29yZWEgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9Lb3JlYW4gICAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19EdXRjaF9OZXRoZXJsYW5kcyAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19Ob3J3ZWdpYW5fQm9rbWFsICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19Qb2xpc2hfUG9sYW5kICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19Qb3J0dWd1ZXNlX0JyYXppbCAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19Sb21hbmlhbl9Sb21hbmlhICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19SdXNzaWFuX1J1c3NpYSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KLSAgICB7RlhfTEFOR19Dcm9hdGlhbl9Dcm9hdGlhICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19TbG92YWtfU2xvdmFraWEgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19BbGJhbmlhbl9BbGJhbmlhICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19Td2VkaXNoX1N3ZWRlbiAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19UaGFpX1RoYWlsYW5kICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU0RPU19UaGFpICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19UdXJraXNoX1R1cmtleSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9UdXJraXNoICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19VcmR1X1Bha2lzdGFuICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWMgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19JbmRvbmVzaWFuX0luZG9uZXNpYSAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19Va3JhaW5pYW5fVWtyYWluZSAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KLSAgICB7RlhfTEFOR19CZWxhcnVzaWFuX0JlbGFydXMgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KLSAgICB7RlhfTEFOR19TbG92ZW5pYW5fU2xvdmVuaWEgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19Fc3Rvbmlhbl9Fc3RvbmlhICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWMgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19MYXR2aWFuX0xhdHZpYSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWMgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19MaXRodWFuaWFuX0xpdGh1YW5pYSAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWMgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19QZXJzaWFuICAgICAgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWMgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19WaWV0bmFtZXNlX1ZpZXRuYW0gICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9WaWV0bmFtZXNlICAgICB9LA0KLSAgICB7RlhfTEFOR19Bcm1lbmlhbl9Bcm1lbmlhICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19BemVyYmFpamFuX0xhdGluICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9UdXJraXNoICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19CYXNxdWVfQmFzcXVlICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19NYWNlZG9uaWFuICAgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KLSAgICB7RlhfTEFOR19BZnJpa2FhbnNfU291dGhBZnJpY2EgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19HZW9yZ2lhbl9HZW9yZ2lhICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19GYXJvZXNlX0Zhcm9lSXNsYW5kcyAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19IaW5kaV9JbmRpYSAgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19NYWxheV9NYWxheXNpYSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19LYXpha2hfS2F6YWtoc3RhbiAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KLSAgICB7RlhfTEFOR19LeXJneXpfS3lyZ3l6c3RhbiAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KLSAgICB7RlhfTEFOR19LaXN3YWhpbGlfS2VueWEgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KLSAgICB7RlhfTEFOR19VemJla19MYXRpblV6YmVraXN0YW4gICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9UdXJraXNoICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19UYXRhcl9SdXNzaWEgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAgICAgICB9LA0KLSAgICB7RlhfTEFOR19QdW5qYWJpX0luZGlhICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19HdWphcmF0aV9JbmRpYSAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19UYW1pbF9JbmRpYSAgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19UZWx1Z3VfSW5kaWEgICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19LYW5uYWRhX0luZGlhICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19NYXJhdGhpX0luZGlhICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19TYW5za3JpdEluZGlhICAgICAgICAgICAgLAlGWF9DT0RFUEFHRV9EZWZBTlNJICAgICAgICAgICAgICB9LA0KLSAgICB7RlhfTEFOR19Nb25nb2xpYW5fQ3lyaWxsaWNNb25nb2xpYSwJRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWMgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfR2FsaWNpYW5fR2FsaWNpYW4gICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfS29ua2FuaV9JbmRpYSAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfRGVmQU5TSSAgICAgICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfU3lyaWFjX1N5cmlhICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfRGVmQU5TSSAgICAgICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfRGl2ZWhpX01hbGRpdmVzICAgICAgICAgICwJRlhfQ09ERVBBR0VfRGVmQU5TSSAgICAgICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX0lyYXEgICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfQ2hpbmVzZV9QUkMgICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWQgICAgfSwNCi0gICAge0ZYX0xBTkdfR2VybWFuX1N3aXR6ZXJsYW5kICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9Vbml0ZWRLaW5nZG9tICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9NZXhpY28gICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfRnJlbmNoX0JlbGdpdW0gICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfSXRhbGlhbl9Td2l0emVybGFuZCAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfRHV0Y2hfQmVsZ2l1bSAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfTm9yd2VnaWFuX055bm9yc2sgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfUG9ydHVndWVzZV9Qb3J0dWdhbCAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU2VyYmlhbkxhdGluX1NlcmJpYSAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3dlZGlzaF9GaW5sYW5kICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXplcmJhaWphbl9DeXJpbGxpYyAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWMgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfTWFsYXlfQnJ1bmVpRGFydXNzYWxhbSAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfVXpiZWtfQ3lyaWxsaWNVemJla2lzdGFuICwJRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWMgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX0VneXB0ICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfQ2hpbmVzZV9Ib25nS29uZyAgICAgICAgICwJRlhfQ09ERVBBR0VfQ2hpbmVzZVRyYWRpdGlvbmFsICAgfSwNCi0gICAge0ZYX0xBTkdfR2VybWFuX0F1c3RyaWEgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9BdXN0cmFsaWEgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9JbnRlcm5hdGlvbmFsU29ydCwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfRnJlbmNoX0NhbmFkYSAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU2VyYmlhbkN5cmlsbGljX1NlcmJpYSAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWMgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX0xpYnlhICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfQ2hpbmVzZV9TaW5nYXBvcmUgICAgICAgICwJRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWQgICAgfSwNCi0gICAge0ZYX0xBTkdfR2VybWFuX0x1eGVtYm91cmcgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9DYW5hZGEgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9HdWF0ZW1hbGEgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfRnJlbmNoX1N3aXR6ZXJsYW5kICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX0FsZ2VyaWEgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfQ2hpbmVzZV9NYWNhbyAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfQ2hpbmVzZVRyYWRpdGlvbmFsICAgfSwNCi0gICAge0ZYX0xBTkdfR2VybWFuX0xpZWNodGVuc3RlaW4gICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9OZXdaZWFsYW5kICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9Db3N0YVJpY2EgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfRnJlbmNoX0x1eGVtYm91cmcgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX01vcm9jY28gICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9JcmVsYW5kICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9QYW5hbWEgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfRnJlbmNoX01vbmFjbyAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX1R1bmlzaWEgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9Tb3V0aEFmcmljYSAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9Eb21pbmljYW5SZXB1YmxpYywJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX09tYW4gICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9KYW1haWNhICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9WZW5lenVlbGEgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX1llbWVuICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9DYXJpYmJlYW4gICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9Db2xvbWJpYSAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX1N5cmlhICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9CZWxpemUgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9QZXJ1ICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX0pvcmRhbiAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9UcmluaWRhZFRvYmFnbyAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9BcmdlbnRpbmEgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX0xlYmFub24gICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9aaW1iYWJ3ZSAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9FY3VhZG9yICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX0t1d2FpdCAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9QaGlsaXBwaW5lcyAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9DaGlsZSAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX1VBRSAgICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9VcnVndWF5ICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX0JhaHJhaW4gICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9QYXJhZ3VheSAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfQXJhYmljX1FhdGFyICAgICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljICAgICAgICAgfSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9Cb2xpdmlhICAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9FbFNhbHZhZG9yICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9Ib25kdXJhcyAgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9OaWNhcmFndWEgICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9QdWVydG9SaWNvICAgICAgICwJRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX1NhdWRpQXJhYmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19CdWxnYXJpYW5fQnVsZ2FyaWEsIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwNCisgICAge0ZYX0xBTkdfQ2F0YWxhbl9DYXRhbGFuLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19DaGluZXNlX1RhaXdhbiwgRlhfQ09ERVBBR0VfQ2hpbmVzZVRyYWRpdGlvbmFsfSwNCisgICAge0ZYX0xBTkdfQ3plY2hSZXB1YmxpYywgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRGFuaXNoX0Rlbm1hcmssIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0dlcm1hbl9HZXJtYW55LCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19HcmVla19HcmVlY2UsIEZYX0NPREVQQUdFX01TV2luX0dyZWVrfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9Vbml0ZWRTdGF0ZXMsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfVHJhZGl0aW9uYWxTb3J0LCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19GaW5uaXNoX0ZpbmxhbmQsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0ZyZW5jaF9GcmFuY2UsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0hlYnJld19Jc3JhZWwsIEZYX0NPREVQQUdFX01TV2luX0hlYnJld30sDQorICAgIHtGWF9MQU5HX0h1bmdhcmlhbl9IdW5nYXJ5LCBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19JY2VsYW5kaWNfSWNlbGFuZCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfSXRhbGlhbl9JdGFseSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfSmFwYW5lc2VfSmFwYW4sIEZYX0NPREVQQUdFX1NoaWZ0SklTfSwNCisgICAge0ZYX0xBTkdfS29yZWFuX0tvcmVhLCBGWF9DT0RFUEFHRV9Lb3JlYW59LA0KKyAgICB7RlhfTEFOR19EdXRjaF9OZXRoZXJsYW5kcywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfTm9yd2VnaWFuX0Jva21hbCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfUG9saXNoX1BvbGFuZCwgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfUG9ydHVndWVzZV9CcmF6aWwsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1JvbWFuaWFuX1JvbWFuaWEsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1J1c3NpYW5fUnVzc2lhLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sDQorICAgIHtGWF9MQU5HX0Nyb2F0aWFuX0Nyb2F0aWEsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1Nsb3Zha19TbG92YWtpYSwgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQWxiYW5pYW5fQWxiYW5pYSwgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3dlZGlzaF9Td2VkZW4sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1RoYWlfVGhhaWxhbmQsIEZYX0NPREVQQUdFX01TRE9TX1RoYWl9LA0KKyAgICB7RlhfTEFOR19UdXJraXNoX1R1cmtleSwgRlhfQ09ERVBBR0VfTVNXaW5fVHVya2lzaH0sDQorICAgIHtGWF9MQU5HX1VyZHVfUGFraXN0YW4sIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sDQorICAgIHtGWF9MQU5HX0luZG9uZXNpYW5fSW5kb25lc2lhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19Va3JhaW5pYW5fVWtyYWluZSwgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LA0KKyAgICB7RlhfTEFOR19CZWxhcnVzaWFuX0JlbGFydXMsIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwNCisgICAge0ZYX0xBTkdfU2xvdmVuaWFuX1Nsb3ZlbmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19Fc3Rvbmlhbl9Fc3RvbmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWN9LA0KKyAgICB7RlhfTEFOR19MYXR2aWFuX0xhdHZpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQmFsdGljfSwNCisgICAge0ZYX0xBTkdfTGl0aHVhbmlhbl9MaXRodWFuaWEsIEZYX0NPREVQQUdFX01TV2luX0JhbHRpY30sDQorICAgIHtGWF9MQU5HX1BlcnNpYW4sIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sDQorICAgIHtGWF9MQU5HX1ZpZXRuYW1lc2VfVmlldG5hbSwgRlhfQ09ERVBBR0VfTVNXaW5fVmlldG5hbWVzZX0sDQorICAgIHtGWF9MQU5HX0FybWVuaWFuX0FybWVuaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LA0KKyAgICB7RlhfTEFOR19BemVyYmFpamFuX0xhdGluLCBGWF9DT0RFUEFHRV9NU1dpbl9UdXJraXNofSwNCisgICAge0ZYX0xBTkdfQmFzcXVlX0Jhc3F1ZSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfTWFjZWRvbmlhbiwgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LA0KKyAgICB7RlhfTEFOR19BZnJpa2FhbnNfU291dGhBZnJpY2EsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0dlb3JnaWFuX0dlb3JnaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LA0KKyAgICB7RlhfTEFOR19GYXJvZXNlX0Zhcm9lSXNsYW5kcywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfSGluZGlfSW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LA0KKyAgICB7RlhfTEFOR19NYWxheV9NYWxheXNpYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfS2F6YWtoX0themFraHN0YW4sIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwNCisgICAge0ZYX0xBTkdfS3lyZ3l6X0t5cmd5enN0YW4sIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwNCisgICAge0ZYX0xBTkdfS2lzd2FoaWxpX0tlbnlhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19VemJla19MYXRpblV6YmVraXN0YW4sIEZYX0NPREVQQUdFX01TV2luX1R1cmtpc2h9LA0KKyAgICB7RlhfTEFOR19UYXRhcl9SdXNzaWEsIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwNCisgICAge0ZYX0xBTkdfUHVuamFiaV9JbmRpYSwgRlhfQ09ERVBBR0VfRGVmQU5TSX0sDQorICAgIHtGWF9MQU5HX0d1amFyYXRpX0luZGlhLCBGWF9DT0RFUEFHRV9EZWZBTlNJfSwNCisgICAge0ZYX0xBTkdfVGFtaWxfSW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LA0KKyAgICB7RlhfTEFOR19UZWx1Z3VfSW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LA0KKyAgICB7RlhfTEFOR19LYW5uYWRhX0luZGlhLCBGWF9DT0RFUEFHRV9EZWZBTlNJfSwNCisgICAge0ZYX0xBTkdfTWFyYXRoaV9JbmRpYSwgRlhfQ09ERVBBR0VfRGVmQU5TSX0sDQorICAgIHtGWF9MQU5HX1NhbnNrcml0SW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LA0KKyAgICB7RlhfTEFOR19Nb25nb2xpYW5fQ3lyaWxsaWNNb25nb2xpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LA0KKyAgICB7RlhfTEFOR19HYWxpY2lhbl9HYWxpY2lhbiwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfS29ua2FuaV9JbmRpYSwgRlhfQ09ERVBBR0VfRGVmQU5TSX0sDQorICAgIHtGWF9MQU5HX1N5cmlhY19TeXJpYSwgRlhfQ09ERVBBR0VfRGVmQU5TSX0sDQorICAgIHtGWF9MQU5HX0RpdmVoaV9NYWxkaXZlcywgRlhfQ09ERVBBR0VfRGVmQU5TSX0sDQorICAgIHtGWF9MQU5HX0FyYWJpY19JcmFxLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19DaGluZXNlX1BSQywgRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWR9LA0KKyAgICB7RlhfTEFOR19HZXJtYW5fU3dpdHplcmxhbmQsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0VuZ2xpc2hfVW5pdGVkS2luZ2RvbSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9NZXhpY28sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0ZyZW5jaF9CZWxnaXVtLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19JdGFsaWFuX1N3aXR6ZXJsYW5kLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19EdXRjaF9CZWxnaXVtLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19Ob3J3ZWdpYW5fTnlub3JzaywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfUG9ydHVndWVzZV9Qb3J0dWdhbCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU2VyYmlhbkxhdGluX1NlcmJpYSwgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3dlZGlzaF9GaW5sYW5kLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19BemVyYmFpamFuX0N5cmlsbGljLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sDQorICAgIHtGWF9MQU5HX01hbGF5X0JydW5laURhcnVzc2FsYW0sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1V6YmVrX0N5cmlsbGljVXpiZWtpc3RhbiwgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LA0KKyAgICB7RlhfTEFOR19BcmFiaWNfRWd5cHQsIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sDQorICAgIHtGWF9MQU5HX0NoaW5lc2VfSG9uZ0tvbmcsIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbH0sDQorICAgIHtGWF9MQU5HX0dlcm1hbl9BdXN0cmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19FbmdsaXNoX0F1c3RyYWxpYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9JbnRlcm5hdGlvbmFsU29ydCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRnJlbmNoX0NhbmFkYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU2VyYmlhbkN5cmlsbGljX1NlcmJpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LA0KKyAgICB7RlhfTEFOR19BcmFiaWNfTGlieWEsIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sDQorICAgIHtGWF9MQU5HX0NoaW5lc2VfU2luZ2Fwb3JlLCBGWF9DT0RFUEFHRV9DaGluZXNlU2ltcGxpZmllZH0sDQorICAgIHtGWF9MQU5HX0dlcm1hbl9MdXhlbWJvdXJnLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19FbmdsaXNoX0NhbmFkYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9HdWF0ZW1hbGEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0ZyZW5jaF9Td2l0emVybGFuZCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0FsZ2VyaWEsIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sDQorICAgIHtGWF9MQU5HX0NoaW5lc2VfTWFjYW8sIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbH0sDQorICAgIHtGWF9MQU5HX0dlcm1hbl9MaWVjaHRlbnN0ZWluLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19FbmdsaXNoX05ld1plYWxhbmQsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfQ29zdGFSaWNhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19GcmVuY2hfTHV4ZW1ib3VyZywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX01vcm9jY28sIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sDQorICAgIHtGWF9MQU5HX0VuZ2xpc2hfSXJlbGFuZCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9QYW5hbWEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0ZyZW5jaF9Nb25hY28sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0FyYWJpY19UdW5pc2lhLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19FbmdsaXNoX1NvdXRoQWZyaWNhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19TcGFuaXNoX0RvbWluaWNhblJlcHVibGljLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19BcmFiaWNfT21hbiwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9KYW1haWNhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19TcGFuaXNoX1ZlbmV6dWVsYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX1llbWVuLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19FbmdsaXNoX0NhcmliYmVhbiwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9Db2xvbWJpYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX1N5cmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19FbmdsaXNoX0JlbGl6ZSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9QZXJ1LCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19BcmFiaWNfSm9yZGFuLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19FbmdsaXNoX1RyaW5pZGFkVG9iYWdvLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19TcGFuaXNoX0FyZ2VudGluYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0xlYmFub24sIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sDQorICAgIHtGWF9MQU5HX0VuZ2xpc2hfWmltYmFid2UsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfRWN1YWRvciwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0t1d2FpdCwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9QaGlsaXBwaW5lcywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9DaGlsZSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX1VBRSwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9VcnVndWF5LCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19BcmFiaWNfQmFocmFpbiwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9QYXJhZ3VheSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX1FhdGFyLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19TcGFuaXNoX0JvbGl2aWEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfRWxTYWx2YWRvciwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9Ib25kdXJhcywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9OaWNhcmFndWEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfUHVlcnRvUmljbywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCiB9Ow0KLUZYX1dPUkQgRlhfR2V0RGVmQ29kZVBhZ2VCeUxhbmd1YWdlKEZYX1dPUkQgd0xhbmd1YWdlKQ0KLXsNCi0gICAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfRlhMYW5nMkNvZGVwYWdlVGFibGUpIC8gc2l6ZW9mKEZYX0xBTkcyQ1BNQVApIC0gMTsNCi0gICAgRlhTWVNfYXNzZXJ0KGlFbmQgPj0gMCk7DQotICAgIGludDMyX3QgaVN0YXJ0ID0gMCwgaU1pZDsNCi0gICAgZG8gew0KLSAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICBjb25zdCBGWF9MQU5HMkNQTUFQICZjcCA9IGdfRlhMYW5nMkNvZGVwYWdlVGFibGVbaU1pZF07DQotICAgICAgICBpZiAod0xhbmd1YWdlID09IGNwLndMYW5ndWFnZSkgew0KLSAgICAgICAgICAgIHJldHVybiBjcC53Q29kZXBhZ2U7DQotICAgICAgICB9IGVsc2UgaWYgKHdMYW5ndWFnZSA8IGNwLndMYW5ndWFnZSkgew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgcmV0dXJuIDB4RkZGRjsNCitGWF9XT1JEIEZYX0dldERlZkNvZGVQYWdlQnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSkgew0KKyAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfRlhMYW5nMkNvZGVwYWdlVGFibGUpIC8gc2l6ZW9mKEZYX0xBTkcyQ1BNQVApIC0gMTsNCisgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpTWlkOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgY29uc3QgRlhfTEFORzJDUE1BUCYgY3AgPSBnX0ZYTGFuZzJDb2RlcGFnZVRhYmxlW2lNaWRdOw0KKyAgICBpZiAod0xhbmd1YWdlID09IGNwLndMYW5ndWFnZSkgew0KKyAgICAgIHJldHVybiBjcC53Q29kZXBhZ2U7DQorICAgIH0gZWxzZSBpZiAod0xhbmd1YWdlIDwgY3Aud0xhbmd1YWdlKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gMHhGRkZGOw0KIH0NCiBzdGF0aWMgY29uc3QgRlhfU1RSMkNQSEFTSCBnX0ZYQ1BIYXNoVGFibGVbXSA9IHsNCi0gICAgeyAweGQ0NSwJMHg2ZmFmIH0sCQl7IDB4ZDQ2LAkweDZmYjAgfSwJCXsgMHhkNDcsCTB4NmZiMSB9LAkJeyAweGQ0OCwJMHg2ZmIyIH0sDQotICAgIHsgMHhkNDksCTB4NGU2IH0sCQl7IDB4ZDRkLAkweDZmYmQgfSwJCXsgMHhlOWUsCTB4NGU0IH0sCQl7IDB4Yzk5OCwJMHgxYjUgfSwNCi0gICAgeyAweDE4ZWYwLAkweDNhOCB9LAkJeyAweDE5Zjg1LAkweDUxODIgfSwJCXsgMHgyZTIzMzUsCTB4M2I2IH0sCQl7IDB4MzI1MTUzLAkweDUxODIgfSwNCi0gICAgeyAweDE0NWJkZWQsCTB4MjcxNiB9LAl7IDB4M2M5YTVmMiwJMHhjNmYzIH0sCXsgMHg0YzQ1ZjJkLAkweDNhNCB9LAl7IDB4NGM0NWY0ZSwJMHhjNDMxIH0sDQotICAgIHsgMHg1OGNhZjUxLAkweDRlNCB9LAl7IDB4NWE1Y2Q3ZCwJMHgzYTggfSwJeyAweDVhNmM2YTcsCTB4NGU0IH0sCXsgMHg1YTZjYTBiLAkweDFiNSB9LA0KLSAgICB7IDB4NWE2Y2Q2OCwJMHgzMDcgfSwJeyAweDVhNmQ4ZDMsCTB4NGU0IH0sCXsgMHg1YTZkOTQ4LAkweDM1NCB9LAl7IDB4NWE2ZDk2YiwJMHgzNjIgfSwNCi0gICAgeyAweDVhNmQ5ODQsCTB4MzY2IH0sCXsgMHg1YTkwZTM1LAkweDFiNSB9LAl7IDB4NWUwY2YwMCwJMHg2ZmI1IH0sCXsgMHg2MDljMzI0LAkweDU1MSB9LA0KLSAgICB7IDB4NjE3ZDk3ZiwJMHg1MTgyIH0sCXsgMHg2YTZmZDkxLAkweGZkZTggfSwJeyAweDZhNmZkOTIsCTB4ZmRlOSB9LAl7IDB4NmIxMDJkZSwJMHhjYWRjIH0sDQotICAgIHsgMHg2YjEwZjQ4LAkweDRlODkgfSwJeyAweDEwMjA4MDVmLAkweDRlNCB9LAl7IDB4MTBmMDUyNGMsCTB4NmZiNSB9LAl7IDB4MTFkNTU4ZmUsCTB4NmZiMCB9LA0KLSAgICB7IDB4MTM4OThkMTksCTB4YzQyZCB9LAl7IDB4MTM4OThkM2EsCTB4YzQzMSB9LAl7IDB4MTM4YTMxOWUsCTB4NmZiMSB9LAl7IDB4MTQ2NzljMDksCTB4OTZjNiB9LA0KLSAgICB7IDB4MTUzZjBhM2QsCTB4NmZiMiB9LAl7IDB4MTU3NmVlYjMsCTB4NGUyMCB9LAl7IDB4MTY5YTBjZTYsCTB4YzZmOSB9LAl7IDB4MTZmM2UyZGMsCTB4NmZiMyB9LA0KLSAgICB7IDB4MThhOGJiN2EsCTB4NmZiNCB9LAl7IDB4MWE1ZDk0MTksCTB4NmZiNSB9LAl7IDB4MWE4NDdiNDgsCTB4M2E4IH0sCXsgMHgxYjc2MjQxOSwJMHhjZWM4IH0sDQotICAgIHsgMHgxYjlkNzg0NywJMHg0NzUgfSwJeyAweDFjMTI2Y2I5LAkweDZmYjYgfSwJeyAweDFjY2RiYzdkLAkweDRmNDIgfSwJeyAweDFkMzMwZjVmLAkweDI3MTQgfSwNCi0gICAgeyAweDFkYzc0NTU5LAkweDRlNiB9LAl7IDB4MWVkZDgwZGEsCTB4NGU0IH0sCXsgMHgyM2U0YjAzZCwJMHhmZGU4IH0sCXsgMHgyNGYyOGExNiwJMHg0ZjNkIH0sDQotICAgIHsgMHgyODZlN2EzMiwJMHgyNzE1IH0sCXsgMHgyYzdjMThlZCwJMHgzYTggfSwJeyAweDJlMjEwM2I3LAkweDI3MTMgfSwJeyAweDMwNGJmNDc5LAkweDZmYjQgfSwNCi0gICAgeyAweDMwNGJmNDdkLAkweDZmYjUgfSwJeyAweDMwOWJiODY5LAkweGZkZTggfSwJeyAweDMwOWJiODZhLAkweGZkZTkgfSwJeyAweDMzNjY0MzU3LAkweDNiNiB9LA0KLSAgICB7IDB4MzUyZDZiNDksCTB4M2E0IH0sCXsgMHgzNmY1NjYxYywJMHgxYjUgfSwJeyAweDM5MmU4ZjQ4LAkweGNhZGMgfSwJeyAweDNkYzdjNjRjLAkweDQ3YyB9LA0KLSAgICB7IDB4M2VkMmU4ZTEsCTB4NGU0IH0sCXsgMHgzZjBjMmZlYSwJMHhjYWVkIH0sCXsgMHgzZjBmZWY4ZiwJMHhjNmYyIH0sCXsgMHgzZjVlMTMwZiwJMHg1MTgyIH0sDQotICAgIHsgMHg0NzE3NGQxZiwJMHgzYTggfSwJeyAweDQ5Njg2YjdiLAkweDZmYjQgfSwJeyAweDRiODBiMGQ5LAkweDNhNCB9LAl7IDB4NGRjZGE5N2EsCTB4NGU0IH0sDQotICAgIHsgMHg0ZGNkYTliNiwJMHg0ZTQgfSwJeyAweDRlODgxZTZhLAkweDUyMjEgfSwJeyAweDRmZmRmNWExLAkweDM2YSB9LAl7IDB4NGZmZGY1YTUsCTB4NmZiZCB9LA0KLSAgICB7IDB4NTI0MWNlMTYsCTB4NGU4YiB9LAl7IDB4NTQ2YmFiOWQsCTB4NGU0IH0sCXsgMHg1NGEzZDY0ZSwJMHg2ZmI2IH0sCXsgMHg1NjIxNzliZCwJMHg1MTYxIH0sDQotICAgIHsgMHg1N2MxZGYxNSwJMHhjNmY3IH0sCXsgMHg2MWZmNmU2MiwJMHg0ZjM2IH0sCXsgMHg2MzU5YzdkOCwJMHg0ZjM1IH0sCXsgMHg2M2YzYzMzNSwJMHgzYTggfSwNCi0gICAgeyAweDY0NWEwZjc4LAkweDQ3NyB9LAl7IDB4NjkxYWMyZmQsCTB4Mjc1ZiB9LAl7IDB4NmRjMmVhYjAsCTB4MmQwIH0sCXsgMHg2ZGMyZWVlZiwJMHgzNWUgfSwNCi0gICAgeyAweDZkYzJlZjEwLAkweDM2YSB9LAl7IDB4NzEwMzEzOGEsCTB4NDdkIH0sCXsgMHg3MTBkZmJkMCwJMHhjNmY1IH0sCXsgMHg3MzE5ZjZjYiwJMHgzNmEgfSwNCi0gICAgeyAweDc0NTA5NmFkLAkweDNhOCB9LAl7IDB4NzQ4NjYyMjksCTB4NGU4YyB9LAl7IDB4NzcxODVmYTUsCTB4M2E4IH0sCXsgMHg3OTUzZjAwMiwJMHg2ZmFmIH0sDQotICAgIHsgMHg3OTUzZjAwMywJMHg2ZmIwIH0sCXsgMHg3OTUzZjAwNCwJMHg2ZmIxIH0sCXsgMHg3OTUzZjAwNSwJMHg2ZmIyIH0sCXsgMHg3OTUzZjAwNiwJMHg2ZmI3IH0sDQotICAgIHsgMHg3OTUzZjAwYSwJMHg2ZmJkIH0sCXsgMHg3YzU3NzU3MSwJMHgyNzYxIH0sCXsgMHg3ZThjOGZmMSwJMHg0NzkgfSwJeyAweDgwMzFmNDdmLAkweDNiNSB9LA0KLSAgICB7IDB4ODAzMWY0ODEsCTB4M2I1IH0sCXsgMHg4MGM0YTcxMCwJMHg1MTg3IH0sCXsgMHg4NTdjN2UxNCwJMHhmZGU4IH0sCXsgMHg4NTdjN2UxNSwJMHhmZGU5IH0sDQotICAgIHsgMHg4NmI1OWM5MCwJMHg0ZTQgfSwJeyAweDg2YjU5YzkxLAkweDZmYjAgfSwJeyAweDg2YjU5YzkyLAkweDZmYjEgfSwJeyAweDg2YjU5YzkzLAkweDZmYjIgfSwNCi0gICAgeyAweDg2YjU5Yzk0LAkweDZmYjMgfSwJeyAweDg2YjU5Yzk1LAkweDZmYjQgfSwJeyAweDg2YjU5Yzk2LAkweDZmYjUgfSwJeyAweDg2YjU5Yzk3LAkweDRlNyB9LA0KLSAgICB7IDB4ODZiNTljOTgsCTB4NGU2IH0sCXsgMHg4YjRiMjRlYywJMHg1MTkwIH0sCXsgMHg4ZmFjZTM2MiwJMHg0ZTQgfSwJeyAweDhmZjllYzJhLAkweGZkZTkgfSwNCi0gICAgeyAweDkxOWQzOTg5LAkweGNhZGMgfSwJeyAweDk5NjdlNWFkLAkweDRlMjIgfSwJeyAweDk5ZjhiOTMzLAkweDZmYmQgfSwJeyAweDliZDJhMzgwLAkweDRmYzcgfSwNCi0gICAgeyAweDliZWZhZDIzLAkweDRmMzggfSwJeyAweDljN2FjNjQ5LAkweDRmM2MgfSwJeyAweGEwMjQ2OGRiLAkweGRlYWUgfSwJeyAweGEwMjQ2OGVjLAkweGRlYWIgfSwNCi0gICAgeyAweGEwMjQ2OTJhLAkweGRlYWEgfSwJeyAweGEwMjQ2OTk3LAkweGRlYjIgfSwJeyAweGEwMjQ2OWZmLAkweGRlYjAgfSwJeyAweGEwMjQ2YTNkLAkweGRlYjEgfSwNCi0gICAgeyAweGEwMjQ2YThjLAkweGRlYWYgfSwJeyAweGEwMjQ2YTlhLAkweGRlYjMgfSwJeyAweGEwMjQ2YjE2LAkweGRlYWMgfSwJeyAweGEwMjQ2YjFhLAkweGRlYWQgfSwNCi0gICAgeyAweGEwNzFhZGRjLAkweDRiMSB9LAl7IDB4YTM4YjYyZGMsCTB4NDc0IH0sCXsgMHhhNGMwOWZlZCwJMHgzYTggfSwJeyAweGE1MWU4NmU1LAkweDRlNyB9LA0KLSAgICB7IDB4YTY3YWIxM2UsCTB4M2E0IH0sCXsgMHhhNzQxNDI0NCwJMHg1MWE5IH0sCXsgMHhhOWRkYmVhZCwJMHhjNmZiIH0sCXsgMHhhYjI0ZmZhYiwJMHg0ZThhIH0sDQotICAgIHsgMHhhYmVmOGFjNCwJMHgyNzEwIH0sCXsgMHhhYmZhMjBhYywJMHg2ZmI0IH0sCXsgMHhhZDM2ODk1ZSwJMHg0ZTIgfSwJeyAweGFkMzY4OTVmLAkweDRlMyB9LA0KLSAgICB7IDB4YWYzMTBlOTAsCTB4NDAyIH0sCXsgMHhhZjMxMTY2ZiwJMHg0ZTggfSwJeyAweGFmNzI3N2E1LAkweDNiNiB9LAl7IDB4YWZjMGQ4YjMsCTB4OTZjNiB9LA0KLSAgICB7IDB4YjBmZDVkYmEsCTB4Y2FlMCB9LAl7IDB4YjBmZDVlOTUsCTB4Y2FkYyB9LAl7IDB4YjEwNTI4OTMsCTB4NzE0OSB9LAl7IDB4YjFlOTg3NDUsCTB4MzZhIH0sDQotICAgIHsgMHhiMjc3ZTkxYywJMHg1MTY2IH0sCXsgMHhiMmY3ZWFjNSwJMHhjYWUwIH0sCXsgMHhiMmY3ZWJhMCwJMHhjYWRjIH0sCXsgMHhiMmY3ZWJjMSwJMHgzYjUgfSwNCi0gICAgeyAweGI1M2ZhNzdkLAkweDNhOCB9LAl7IDB4YjYzOTExMzgsCTB4NmZiNSB9LAl7IDB4YjczNThiN2YsCTB4NmZiNiB9LAl7IDB4YjhjNDJiNDAsCTB4NGU0IH0sDQotICAgIHsgMHhiOGM0MmVhNCwJMHgxYjUgfSwJeyAweGI4YzQzOWU3LAkweDJlMSB9LAl7IDB4YjhjNDNhNjEsCTB4MzA3IH0sCXsgMHhiOGM0M2Q2YywJMHg0ZTQgfSwNCi0gICAgeyAweGI4YzQzZGRmLAkweDM1MiB9LAl7IDB4YjhjNDNkZTEsCTB4MzU0IH0sCXsgMHhiOGM0M2RlNiwJMHgzNTkgfSwJeyAweGI4YzQzZGZmLAkweDM1ZCB9LA0KLSAgICB7IDB4YjhjNDNlMDQsCTB4MzYyIH0sCXsgMHhiOGM0M2UwNywJMHgzNjUgfSwJeyAweGJjZDI5YTdmLAkweDNhOCB9LAl7IDB4YmNlMzRlNzgsCTB4NTE4MiB9LA0KLSAgICB7IDB4YmNlMzRlN2IsCTB4NTU2YSB9LAl7IDB4YmNlODE1MDQsCTB4M2I1IH0sCXsgMHhiZDhhNGM5NSwJMHgyNzJkIH0sCXsgMHhiZGQ4OWRhZCwJMHg0ZTQgfSwNCi0gICAgeyAweGJkZDg5ZGFlLAkweDZmYjAgfSwJeyAweGJkZDg5ZGFmLAkweDZmYjEgfSwJeyAweGJkZDg5ZGIwLAkweDZmYjIgfSwJeyAweGJkZDg5ZGIxLAkweDRlNiB9LA0KLSAgICB7IDB4YmRkODlkYjUsCTB4NmZiZCB9LAl7IDB4YzE3NTZlOWYsCTB4MzZiIH0sCXsgMHhjNzQ4MjQ0NCwJMHg0N2EgfSwJeyAweGM5MjgxYzE4LAkweDRlNCB9LA0KLSAgICB7IDB4YzllZjk1ZGYsCTB4NDdiIH0sCXsgMHhjY2M5ZGIwZCwJMHg0ZTQgfSwJeyAweGNjYzlkYjBlLAkweDZmYjAgfSwJeyAweGNkNzM0MjVmLAkweDNiNiB9LA0KLSAgICB7IDB4Y2UzOGI0MGIsCTB4NGIwIH0sCXsgMHhjZTk5ZTU0OSwJMHgyNSB9LAkJeyAweGNmNTk4NzQwLAkweDRlNyB9LAl7IDB4Y2Y2ZDZmNzgsCTB4NGU0IH0sDQotICAgIHsgMHhjZjc1OGRmNiwJMHgzYTQgfSwJeyAweGQxMjY2ZTUxLAkweDZmYjUgfSwJeyAweGQyOTEwMjEzLAkweDI3MTggfSwJeyAweGQyOTE5NmJiLAkweDI3MTIgfSwNCi0gICAgeyAweGQzZWIyZmMyLAkweDQ3NiB9LAl7IDB4ZDQ0MmRjMmMsCTB4NGZjNCB9LAl7IDB4ZDlkYTRkYTQsCTB4MjcxMSB9LAl7IDB4ZGJhZDJmNDIsCTB4NGU0IH0sDQotICAgIHsgMHhkYmFkMmY0MywJMHg2ZmIwIH0sCXsgMHhkYmFkMmY0NCwJMHg2ZmIxIH0sCXsgMHhkYmFkMmY0NSwJMHg2ZmIyIH0sCXsgMHhkYmFkMmY0NiwJMHg2ZmIzIH0sDQotICAgIHsgMHhkYmFkMmY0NywJMHg2ZmI0IH0sCXsgMHhkYmFkMmY0OCwJMHg2ZmI1IH0sCXsgMHhkYmFkMmY0OSwJMHg2ZmI2IH0sCXsgMHhkYmFkMmY0YSwJMHg0ZTYgfSwNCi0gICAgeyAweGRjNDM4MDMzLAkweDRmMzEgfSwJeyAweGRjY2I0MzliLAkweDQ3NyB9LAl7IDB4ZGNjZGM2MjYsCTB4M2I1IH0sCXsgMHhkZDgwYTU5NSwJMHg0ZTQgfSwNCi0gICAgeyAweGRkODBhNTk2LAkweDZmYjAgfSwJeyAweGRkODBhNTllLAkweDZmYjEgfSwJeyAweGRkODBhNWI0LAkweDZmYjIgfSwJeyAweGRkODBhNWQ5LAkweDZmYjUgfSwNCi0gICAgeyAweGRkODBhNWRhLAkweDZmYjQgfSwJeyAweGRkODBhNWZhLAkweDZmYjYgfSwJeyAweGRkODBhNjE1LAkweDZmYjMgfSwJeyAweGRkODBhNjE5LAkweDRlNiB9LA0KLSAgICB7IDB4ZGQ4MGE2MWEsCTB4M2I1IH0sCXsgMHhkZDgwYzBmOCwJMHg0ZTlmIH0sCXsgMHhkZjdlNDZmZiwJMHg0ZmM4IH0sCXsgMHhkZjg2ODBmZCwJMHg1NTZhIH0sDQotICAgIHsgMHhkZmIwYmQ2ZSwJMHhjNDJkIH0sCXsgMHhkZmYwNTQ4NiwJMHgyYzQgfSwJeyAweGUzMzIzMzk5LAkweDNhNCB9LAl7IDB4ZTYwNDEyZGQsCTB4M2I1IH0sDQotICAgIHsgMHhlZWU0N2FkZCwJMHg0YjAgfSwJeyAweGYwMjFhMTg2LAkweDRlMiB9LAl7IDB4ZjAyMWExODcsCTB4NGUzIH0sCXsgMHhmMDIxYTE4OCwJMHg0ZTQgfSwNCi0gICAgeyAweGYwMjFhMTg5LAkweDRlNSB9LAl7IDB4ZjAyMWExOGEsCTB4NGU2IH0sCXsgMHhmMDIxYTE4YiwJMHg0ZTcgfSwJeyAweGYwMjFhMThjLAkweDRlOCB9LA0KLSAgICB7IDB4ZjAyMWExOGQsCTB4NGU5IH0sCXsgMHhmMDIxYTE4ZSwJMHg0ZWEgfSwJeyAweGYwNzAwNDU2LAkweDZmYjMgfSwJeyAweGYyNzRmMTc1LAkweDNiNSB9LA0KLSAgICB7IDB4ZjJhOTczMGIsCTB4M2E4IH0sCXsgMHhmM2Q0NjNjMiwJMHgzYTQgfSwJeyAweGY1MmE3MGEzLAkweGM0MmUgfSwJeyAweGY1NjkzMTQ3LAkweDZmYjMgfSwNCi0gICAgeyAweGY2MzdlMTU3LAkweDQ3OCB9LAl7IDB4ZmMyMTNmM2EsCTB4MjcxNyB9LAl7IDB4ZmY2NTRkMTQsCTB4M2I1IH0sDQorICAgIHsweGQ0NSwgMHg2ZmFmfSwgICAgICB7MHhkNDYsIDB4NmZiMH0sICAgICAgezB4ZDQ3LCAweDZmYjF9LA0KKyAgICB7MHhkNDgsIDB4NmZiMn0sICAgICAgezB4ZDQ5LCAweDRlNn0sICAgICAgIHsweGQ0ZCwgMHg2ZmJkfSwNCisgICAgezB4ZTllLCAweDRlNH0sICAgICAgIHsweGM5OTgsIDB4MWI1fSwgICAgICB7MHgxOGVmMCwgMHgzYTh9LA0KKyAgICB7MHgxOWY4NSwgMHg1MTgyfSwgICAgezB4MmUyMzM1LCAweDNiNn0sICAgIHsweDMyNTE1MywgMHg1MTgyfSwNCisgICAgezB4MTQ1YmRlZCwgMHgyNzE2fSwgIHsweDNjOWE1ZjIsIDB4YzZmM30sICB7MHg0YzQ1ZjJkLCAweDNhNH0sDQorICAgIHsweDRjNDVmNGUsIDB4YzQzMX0sICB7MHg1OGNhZjUxLCAweDRlNH0sICAgezB4NWE1Y2Q3ZCwgMHgzYTh9LA0KKyAgICB7MHg1YTZjNmE3LCAweDRlNH0sICAgezB4NWE2Y2EwYiwgMHgxYjV9LCAgIHsweDVhNmNkNjgsIDB4MzA3fSwNCisgICAgezB4NWE2ZDhkMywgMHg0ZTR9LCAgIHsweDVhNmQ5NDgsIDB4MzU0fSwgICB7MHg1YTZkOTZiLCAweDM2Mn0sDQorICAgIHsweDVhNmQ5ODQsIDB4MzY2fSwgICB7MHg1YTkwZTM1LCAweDFiNX0sICAgezB4NWUwY2YwMCwgMHg2ZmI1fSwNCisgICAgezB4NjA5YzMyNCwgMHg1NTF9LCAgIHsweDYxN2Q5N2YsIDB4NTE4Mn0sICB7MHg2YTZmZDkxLCAweGZkZTh9LA0KKyAgICB7MHg2YTZmZDkyLCAweGZkZTl9LCAgezB4NmIxMDJkZSwgMHhjYWRjfSwgIHsweDZiMTBmNDgsIDB4NGU4OX0sDQorICAgIHsweDEwMjA4MDVmLCAweDRlNH0sICB7MHgxMGYwNTI0YywgMHg2ZmI1fSwgezB4MTFkNTU4ZmUsIDB4NmZiMH0sDQorICAgIHsweDEzODk4ZDE5LCAweGM0MmR9LCB7MHgxMzg5OGQzYSwgMHhjNDMxfSwgezB4MTM4YTMxOWUsIDB4NmZiMX0sDQorICAgIHsweDE0Njc5YzA5LCAweDk2YzZ9LCB7MHgxNTNmMGEzZCwgMHg2ZmIyfSwgezB4MTU3NmVlYjMsIDB4NGUyMH0sDQorICAgIHsweDE2OWEwY2U2LCAweGM2Zjl9LCB7MHgxNmYzZTJkYywgMHg2ZmIzfSwgezB4MThhOGJiN2EsIDB4NmZiNH0sDQorICAgIHsweDFhNWQ5NDE5LCAweDZmYjV9LCB7MHgxYTg0N2I0OCwgMHgzYTh9LCAgezB4MWI3NjI0MTksIDB4Y2VjOH0sDQorICAgIHsweDFiOWQ3ODQ3LCAweDQ3NX0sICB7MHgxYzEyNmNiOSwgMHg2ZmI2fSwgezB4MWNjZGJjN2QsIDB4NGY0Mn0sDQorICAgIHsweDFkMzMwZjVmLCAweDI3MTR9LCB7MHgxZGM3NDU1OSwgMHg0ZTZ9LCAgezB4MWVkZDgwZGEsIDB4NGU0fSwNCisgICAgezB4MjNlNGIwM2QsIDB4ZmRlOH0sIHsweDI0ZjI4YTE2LCAweDRmM2R9LCB7MHgyODZlN2EzMiwgMHgyNzE1fSwNCisgICAgezB4MmM3YzE4ZWQsIDB4M2E4fSwgIHsweDJlMjEwM2I3LCAweDI3MTN9LCB7MHgzMDRiZjQ3OSwgMHg2ZmI0fSwNCisgICAgezB4MzA0YmY0N2QsIDB4NmZiNX0sIHsweDMwOWJiODY5LCAweGZkZTh9LCB7MHgzMDliYjg2YSwgMHhmZGU5fSwNCisgICAgezB4MzM2NjQzNTcsIDB4M2I2fSwgIHsweDM1MmQ2YjQ5LCAweDNhNH0sICB7MHgzNmY1NjYxYywgMHgxYjV9LA0KKyAgICB7MHgzOTJlOGY0OCwgMHhjYWRjfSwgezB4M2RjN2M2NGMsIDB4NDdjfSwgIHsweDNlZDJlOGUxLCAweDRlNH0sDQorICAgIHsweDNmMGMyZmVhLCAweGNhZWR9LCB7MHgzZjBmZWY4ZiwgMHhjNmYyfSwgezB4M2Y1ZTEzMGYsIDB4NTE4Mn0sDQorICAgIHsweDQ3MTc0ZDFmLCAweDNhOH0sICB7MHg0OTY4NmI3YiwgMHg2ZmI0fSwgezB4NGI4MGIwZDksIDB4M2E0fSwNCisgICAgezB4NGRjZGE5N2EsIDB4NGU0fSwgIHsweDRkY2RhOWI2LCAweDRlNH0sICB7MHg0ZTg4MWU2YSwgMHg1MjIxfSwNCisgICAgezB4NGZmZGY1YTEsIDB4MzZhfSwgIHsweDRmZmRmNWE1LCAweDZmYmR9LCB7MHg1MjQxY2UxNiwgMHg0ZThifSwNCisgICAgezB4NTQ2YmFiOWQsIDB4NGU0fSwgIHsweDU0YTNkNjRlLCAweDZmYjZ9LCB7MHg1NjIxNzliZCwgMHg1MTYxfSwNCisgICAgezB4NTdjMWRmMTUsIDB4YzZmN30sIHsweDYxZmY2ZTYyLCAweDRmMzZ9LCB7MHg2MzU5YzdkOCwgMHg0ZjM1fSwNCisgICAgezB4NjNmM2MzMzUsIDB4M2E4fSwgIHsweDY0NWEwZjc4LCAweDQ3N30sICB7MHg2OTFhYzJmZCwgMHgyNzVmfSwNCisgICAgezB4NmRjMmVhYjAsIDB4MmQwfSwgIHsweDZkYzJlZWVmLCAweDM1ZX0sICB7MHg2ZGMyZWYxMCwgMHgzNmF9LA0KKyAgICB7MHg3MTAzMTM4YSwgMHg0N2R9LCAgezB4NzEwZGZiZDAsIDB4YzZmNX0sIHsweDczMTlmNmNiLCAweDM2YX0sDQorICAgIHsweDc0NTA5NmFkLCAweDNhOH0sICB7MHg3NDg2NjIyOSwgMHg0ZThjfSwgezB4NzcxODVmYTUsIDB4M2E4fSwNCisgICAgezB4Nzk1M2YwMDIsIDB4NmZhZn0sIHsweDc5NTNmMDAzLCAweDZmYjB9LCB7MHg3OTUzZjAwNCwgMHg2ZmIxfSwNCisgICAgezB4Nzk1M2YwMDUsIDB4NmZiMn0sIHsweDc5NTNmMDA2LCAweDZmYjd9LCB7MHg3OTUzZjAwYSwgMHg2ZmJkfSwNCisgICAgezB4N2M1Nzc1NzEsIDB4Mjc2MX0sIHsweDdlOGM4ZmYxLCAweDQ3OX0sICB7MHg4MDMxZjQ3ZiwgMHgzYjV9LA0KKyAgICB7MHg4MDMxZjQ4MSwgMHgzYjV9LCAgezB4ODBjNGE3MTAsIDB4NTE4N30sIHsweDg1N2M3ZTE0LCAweGZkZTh9LA0KKyAgICB7MHg4NTdjN2UxNSwgMHhmZGU5fSwgezB4ODZiNTljOTAsIDB4NGU0fSwgIHsweDg2YjU5YzkxLCAweDZmYjB9LA0KKyAgICB7MHg4NmI1OWM5MiwgMHg2ZmIxfSwgezB4ODZiNTljOTMsIDB4NmZiMn0sIHsweDg2YjU5Yzk0LCAweDZmYjN9LA0KKyAgICB7MHg4NmI1OWM5NSwgMHg2ZmI0fSwgezB4ODZiNTljOTYsIDB4NmZiNX0sIHsweDg2YjU5Yzk3LCAweDRlN30sDQorICAgIHsweDg2YjU5Yzk4LCAweDRlNn0sICB7MHg4YjRiMjRlYywgMHg1MTkwfSwgezB4OGZhY2UzNjIsIDB4NGU0fSwNCisgICAgezB4OGZmOWVjMmEsIDB4ZmRlOX0sIHsweDkxOWQzOTg5LCAweGNhZGN9LCB7MHg5OTY3ZTVhZCwgMHg0ZTIyfSwNCisgICAgezB4OTlmOGI5MzMsIDB4NmZiZH0sIHsweDliZDJhMzgwLCAweDRmYzd9LCB7MHg5YmVmYWQyMywgMHg0ZjM4fSwNCisgICAgezB4OWM3YWM2NDksIDB4NGYzY30sIHsweGEwMjQ2OGRiLCAweGRlYWV9LCB7MHhhMDI0NjhlYywgMHhkZWFifSwNCisgICAgezB4YTAyNDY5MmEsIDB4ZGVhYX0sIHsweGEwMjQ2OTk3LCAweGRlYjJ9LCB7MHhhMDI0NjlmZiwgMHhkZWIwfSwNCisgICAgezB4YTAyNDZhM2QsIDB4ZGViMX0sIHsweGEwMjQ2YThjLCAweGRlYWZ9LCB7MHhhMDI0NmE5YSwgMHhkZWIzfSwNCisgICAgezB4YTAyNDZiMTYsIDB4ZGVhY30sIHsweGEwMjQ2YjFhLCAweGRlYWR9LCB7MHhhMDcxYWRkYywgMHg0YjF9LA0KKyAgICB7MHhhMzhiNjJkYywgMHg0NzR9LCAgezB4YTRjMDlmZWQsIDB4M2E4fSwgIHsweGE1MWU4NmU1LCAweDRlN30sDQorICAgIHsweGE2N2FiMTNlLCAweDNhNH0sICB7MHhhNzQxNDI0NCwgMHg1MWE5fSwgezB4YTlkZGJlYWQsIDB4YzZmYn0sDQorICAgIHsweGFiMjRmZmFiLCAweDRlOGF9LCB7MHhhYmVmOGFjNCwgMHgyNzEwfSwgezB4YWJmYTIwYWMsIDB4NmZiNH0sDQorICAgIHsweGFkMzY4OTVlLCAweDRlMn0sICB7MHhhZDM2ODk1ZiwgMHg0ZTN9LCAgezB4YWYzMTBlOTAsIDB4NDAyfSwNCisgICAgezB4YWYzMTE2NmYsIDB4NGU4fSwgIHsweGFmNzI3N2E1LCAweDNiNn0sICB7MHhhZmMwZDhiMywgMHg5NmM2fSwNCisgICAgezB4YjBmZDVkYmEsIDB4Y2FlMH0sIHsweGIwZmQ1ZTk1LCAweGNhZGN9LCB7MHhiMTA1Mjg5MywgMHg3MTQ5fSwNCisgICAgezB4YjFlOTg3NDUsIDB4MzZhfSwgIHsweGIyNzdlOTFjLCAweDUxNjZ9LCB7MHhiMmY3ZWFjNSwgMHhjYWUwfSwNCisgICAgezB4YjJmN2ViYTAsIDB4Y2FkY30sIHsweGIyZjdlYmMxLCAweDNiNX0sICB7MHhiNTNmYTc3ZCwgMHgzYTh9LA0KKyAgICB7MHhiNjM5MTEzOCwgMHg2ZmI1fSwgezB4YjczNThiN2YsIDB4NmZiNn0sIHsweGI4YzQyYjQwLCAweDRlNH0sDQorICAgIHsweGI4YzQyZWE0LCAweDFiNX0sICB7MHhiOGM0MzllNywgMHgyZTF9LCAgezB4YjhjNDNhNjEsIDB4MzA3fSwNCisgICAgezB4YjhjNDNkNmMsIDB4NGU0fSwgIHsweGI4YzQzZGRmLCAweDM1Mn0sICB7MHhiOGM0M2RlMSwgMHgzNTR9LA0KKyAgICB7MHhiOGM0M2RlNiwgMHgzNTl9LCAgezB4YjhjNDNkZmYsIDB4MzVkfSwgIHsweGI4YzQzZTA0LCAweDM2Mn0sDQorICAgIHsweGI4YzQzZTA3LCAweDM2NX0sICB7MHhiY2QyOWE3ZiwgMHgzYTh9LCAgezB4YmNlMzRlNzgsIDB4NTE4Mn0sDQorICAgIHsweGJjZTM0ZTdiLCAweDU1NmF9LCB7MHhiY2U4MTUwNCwgMHgzYjV9LCAgezB4YmQ4YTRjOTUsIDB4MjcyZH0sDQorICAgIHsweGJkZDg5ZGFkLCAweDRlNH0sICB7MHhiZGQ4OWRhZSwgMHg2ZmIwfSwgezB4YmRkODlkYWYsIDB4NmZiMX0sDQorICAgIHsweGJkZDg5ZGIwLCAweDZmYjJ9LCB7MHhiZGQ4OWRiMSwgMHg0ZTZ9LCAgezB4YmRkODlkYjUsIDB4NmZiZH0sDQorICAgIHsweGMxNzU2ZTlmLCAweDM2Yn0sICB7MHhjNzQ4MjQ0NCwgMHg0N2F9LCAgezB4YzkyODFjMTgsIDB4NGU0fSwNCisgICAgezB4YzllZjk1ZGYsIDB4NDdifSwgIHsweGNjYzlkYjBkLCAweDRlNH0sICB7MHhjY2M5ZGIwZSwgMHg2ZmIwfSwNCisgICAgezB4Y2Q3MzQyNWYsIDB4M2I2fSwgIHsweGNlMzhiNDBiLCAweDRiMH0sICB7MHhjZTk5ZTU0OSwgMHgyNX0sDQorICAgIHsweGNmNTk4NzQwLCAweDRlN30sICB7MHhjZjZkNmY3OCwgMHg0ZTR9LCAgezB4Y2Y3NThkZjYsIDB4M2E0fSwNCisgICAgezB4ZDEyNjZlNTEsIDB4NmZiNX0sIHsweGQyOTEwMjEzLCAweDI3MTh9LCB7MHhkMjkxOTZiYiwgMHgyNzEyfSwNCisgICAgezB4ZDNlYjJmYzIsIDB4NDc2fSwgIHsweGQ0NDJkYzJjLCAweDRmYzR9LCB7MHhkOWRhNGRhNCwgMHgyNzExfSwNCisgICAgezB4ZGJhZDJmNDIsIDB4NGU0fSwgIHsweGRiYWQyZjQzLCAweDZmYjB9LCB7MHhkYmFkMmY0NCwgMHg2ZmIxfSwNCisgICAgezB4ZGJhZDJmNDUsIDB4NmZiMn0sIHsweGRiYWQyZjQ2LCAweDZmYjN9LCB7MHhkYmFkMmY0NywgMHg2ZmI0fSwNCisgICAgezB4ZGJhZDJmNDgsIDB4NmZiNX0sIHsweGRiYWQyZjQ5LCAweDZmYjZ9LCB7MHhkYmFkMmY0YSwgMHg0ZTZ9LA0KKyAgICB7MHhkYzQzODAzMywgMHg0ZjMxfSwgezB4ZGNjYjQzOWIsIDB4NDc3fSwgIHsweGRjY2RjNjI2LCAweDNiNX0sDQorICAgIHsweGRkODBhNTk1LCAweDRlNH0sICB7MHhkZDgwYTU5NiwgMHg2ZmIwfSwgezB4ZGQ4MGE1OWUsIDB4NmZiMX0sDQorICAgIHsweGRkODBhNWI0LCAweDZmYjJ9LCB7MHhkZDgwYTVkOSwgMHg2ZmI1fSwgezB4ZGQ4MGE1ZGEsIDB4NmZiNH0sDQorICAgIHsweGRkODBhNWZhLCAweDZmYjZ9LCB7MHhkZDgwYTYxNSwgMHg2ZmIzfSwgezB4ZGQ4MGE2MTksIDB4NGU2fSwNCisgICAgezB4ZGQ4MGE2MWEsIDB4M2I1fSwgIHsweGRkODBjMGY4LCAweDRlOWZ9LCB7MHhkZjdlNDZmZiwgMHg0ZmM4fSwNCisgICAgezB4ZGY4NjgwZmQsIDB4NTU2YX0sIHsweGRmYjBiZDZlLCAweGM0MmR9LCB7MHhkZmYwNTQ4NiwgMHgyYzR9LA0KKyAgICB7MHhlMzMyMzM5OSwgMHgzYTR9LCAgezB4ZTYwNDEyZGQsIDB4M2I1fSwgIHsweGVlZTQ3YWRkLCAweDRiMH0sDQorICAgIHsweGYwMjFhMTg2LCAweDRlMn0sICB7MHhmMDIxYTE4NywgMHg0ZTN9LCAgezB4ZjAyMWExODgsIDB4NGU0fSwNCisgICAgezB4ZjAyMWExODksIDB4NGU1fSwgIHsweGYwMjFhMThhLCAweDRlNn0sICB7MHhmMDIxYTE4YiwgMHg0ZTd9LA0KKyAgICB7MHhmMDIxYTE4YywgMHg0ZTh9LCAgezB4ZjAyMWExOGQsIDB4NGU5fSwgIHsweGYwMjFhMThlLCAweDRlYX0sDQorICAgIHsweGYwNzAwNDU2LCAweDZmYjN9LCB7MHhmMjc0ZjE3NSwgMHgzYjV9LCAgezB4ZjJhOTczMGIsIDB4M2E4fSwNCisgICAgezB4ZjNkNDYzYzIsIDB4M2E0fSwgIHsweGY1MmE3MGEzLCAweGM0MmV9LCB7MHhmNTY5MzE0NywgMHg2ZmIzfSwNCisgICAgezB4ZjYzN2UxNTcsIDB4NDc4fSwgIHsweGZjMjEzZjNhLCAweDI3MTd9LCB7MHhmZjY1NGQxNCwgMHgzYjV9LA0KIH07DQotRlhfV09SRCBGWF9HZXRDb2RlUGFnZUZyb21TdHJpbmdBKGNvbnN0IEZYX0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwpOw0KLSAgICBpZiAoaUxlbmd0aCA8IDApIHsNCi0gICAgICAgIGlMZW5ndGggPSBGWFNZU19zdHJsZW4ocFN0cik7DQotICAgIH0NCi0gICAgaWYgKGlMZW5ndGggPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIDB4RkZGRjsNCi0gICAgfQ0KLSAgICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKHBTdHIsIGlMZW5ndGgsIFRSVUUpOw0KLSAgICBpbnQzMl90IGlTdGFydCA9IDAsIGlNaWQ7DQotICAgIGludDMyX3QgaUVuZCA9IHNpemVvZihnX0ZYQ1BIYXNoVGFibGUpIC8gc2l6ZW9mKEZYX1NUUjJDUEhBU0gpIC0gMTsNCi0gICAgRlhTWVNfYXNzZXJ0KGlFbmQgPj0gMCk7DQotICAgIGRvIHsNCi0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgY29uc3QgRlhfU1RSMkNQSEFTSCAmIGNwID0gZ19GWENQSGFzaFRhYmxlW2lNaWRdOw0KLSAgICAgICAgaWYgKHVIYXNoID09IGNwLnVIYXNoKSB7DQotICAgICAgICAgICAgcmV0dXJuIChGWF9XT1JEKWNwLnVDb2RlUGFnZTsNCi0gICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBjcC51SGFzaCkgew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCitGWF9XT1JEIEZYX0dldENvZGVQYWdlRnJvbVN0cmluZ0EoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMKTsNCisgIGlmIChpTGVuZ3RoIDwgMCkgew0KKyAgICBpTGVuZ3RoID0gRlhTWVNfc3RybGVuKHBTdHIpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPT0gMCkgew0KICAgICByZXR1cm4gMHhGRkZGOw0KKyAgfQ0KKyAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShwU3RyLCBpTGVuZ3RoLCBUUlVFKTsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaU1pZDsNCisgIGludDMyX3QgaUVuZCA9IHNpemVvZihnX0ZYQ1BIYXNoVGFibGUpIC8gc2l6ZW9mKEZYX1NUUjJDUEhBU0gpIC0gMTsNCisgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgY29uc3QgRlhfU1RSMkNQSEFTSCYgY3AgPSBnX0ZYQ1BIYXNoVGFibGVbaU1pZF07DQorICAgIGlmICh1SGFzaCA9PSBjcC51SGFzaCkgew0KKyAgICAgIHJldHVybiAoRlhfV09SRCljcC51Q29kZVBhZ2U7DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBjcC51SGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIDB4RkZGRjsNCiB9DQotRlhfV09SRCBGWF9HZXRDb2RlUGFnZUZvcm1TdHJpbmdXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpDQotew0KLSAgICBpZiAoaUxlbmd0aCA8IDApIHsNCi0gICAgICAgIGlMZW5ndGggPSBGWFNZU193Y3NsZW4ocFN0cik7DQotICAgIH0NCi0gICAgaWYgKGlMZW5ndGggPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIDB4RkZGRjsNCi0gICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1N0cjsNCi0gICAgRlhfQ0hBUiogcEJ1ZiA9IGNzU3RyLkdldEJ1ZmZlcihpTGVuZ3RoICsgMSk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGg7ICsraSkgew0KLSAgICAgICAgKnBCdWYgKysgPSAoRlhfQ0hBUikgKiBwU3RyICsrOw0KLSAgICB9DQotICAgIGNzU3RyLlJlbGVhc2VCdWZmZXIoaUxlbmd0aCk7DQotICAgIHJldHVybiBGWF9HZXRDb2RlUGFnZUZyb21TdHJpbmdBKGNzU3RyLCBpTGVuZ3RoKTsNCitGWF9XT1JEIEZYX0dldENvZGVQYWdlRm9ybVN0cmluZ1coY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgew0KKyAgaWYgKGlMZW5ndGggPCAwKSB7DQorICAgIGlMZW5ndGggPSBGWFNZU193Y3NsZW4ocFN0cik7DQorICB9DQorICBpZiAoaUxlbmd0aCA9PSAwKSB7DQorICAgIHJldHVybiAweEZGRkY7DQorICB9DQorICBDRlhfQnl0ZVN0cmluZyBjc1N0cjsNCisgIEZYX0NIQVIqIHBCdWYgPSBjc1N0ci5HZXRCdWZmZXIoaUxlbmd0aCArIDEpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbmd0aDsgKytpKSB7DQorICAgICpwQnVmKysgPSAoRlhfQ0hBUikqcFN0cisrOw0KKyAgfQ0KKyAgY3NTdHIuUmVsZWFzZUJ1ZmZlcihpTGVuZ3RoKTsNCisgIHJldHVybiBGWF9HZXRDb2RlUGFnZUZyb21TdHJpbmdBKGNzU3RyLCBpTGVuZ3RoKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfY3BtZ3IuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfY3BtZ3IuY3BwCmluZGV4IGU1NzI3M2QuLjQ4MDM1MTMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2NwbWdyLmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9jcG1nci5jcHAKQEAgLTgsOCArOCw3IEBACiAjaW5jbHVkZSAiZnhfY29kZXBhZ2UuaCINCiAjaWZkZWYgX0ZYQ1ANCiAjaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiDQotew0KK2V4dGVybiAiQyIgew0KICNlbmRpZg0KIGV4dGVybiBjb25zdCBGWF9DT0RFUEFHRV9IRUFERVIgZ19DUDkzNl9NYXBIZWFkZXI7DQogZXh0ZXJuIGNvbnN0IEZYX0NPREVQQUdFX0hFQURFUiBnX0NQOTMyX01hcEhlYWRlcjsNCkBAIC0zOSwyNSArMzgsMjQgQEAKIGV4dGVybiBjb25zdCBGWF9DUENVX01BUElORk8gZ19DUDEyNTZfQ1VNYXA7DQogZXh0ZXJuIGNvbnN0IEZYX0NQQ1VfTUFQSU5GTyBnX0NQMTI1N19DVU1hcDsNCiBleHRlcm4gY29uc3QgRlhfQ1BDVV9NQVBJTkZPIGdfQ1AxMjU4X0NVTWFwOw0KLUZYX0xQQ0NPREVQQUdFIEZYX0dldENvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlKQ0KLXsNCi0gICAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfRlhDb2RlUGFnZU1ncikgLyBzaXplb2YoRlhfQ09ERVBBR0UpIC0gMTsNCi0gICAgRlhTWVNfYXNzZXJ0KGlFbmQgPj0gMCk7DQotICAgIGludDMyX3QgaVN0YXJ0ID0gMCwgaU1pZDsNCi0gICAgdWludDE2X3QgdUNQSUQ7DQotICAgIGRvIHsNCi0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgY29uc3QgRlhfQ09ERVBBR0UgJmNwID0gZ19GWENvZGVQYWdlTWdyW2lNaWRdOw0KLSAgICAgICAgdUNQSUQgPSBjcC5wQ1BIZWFkZXItPnVDUElEOw0KLSAgICAgICAgaWYgKHdDb2RlUGFnZSA9PSB1Q1BJRCkgew0KLSAgICAgICAgICAgIHJldHVybiBnX0ZYQ29kZVBhZ2VNZ3IgKyBpTWlkOw0KLSAgICAgICAgfSBlbHNlIGlmICh3Q29kZVBhZ2UgPCB1Q1BJRCkgew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgcmV0dXJuIE5VTEw7DQorRlhfTFBDQ09ERVBBR0UgRlhfR2V0Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgIGludDMyX3QgaUVuZCA9IHNpemVvZihnX0ZYQ29kZVBhZ2VNZ3IpIC8gc2l6ZW9mKEZYX0NPREVQQUdFKSAtIDE7DQorICBGWFNZU19hc3NlcnQoaUVuZCA+PSAwKTsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaU1pZDsNCisgIHVpbnQxNl90IHVDUElEOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgY29uc3QgRlhfQ09ERVBBR0UmIGNwID0gZ19GWENvZGVQYWdlTWdyW2lNaWRdOw0KKyAgICB1Q1BJRCA9IGNwLnBDUEhlYWRlci0+dUNQSUQ7DQorICAgIGlmICh3Q29kZVBhZ2UgPT0gdUNQSUQpIHsNCisgICAgICByZXR1cm4gZ19GWENvZGVQYWdlTWdyICsgaU1pZDsNCisgICAgfSBlbHNlIGlmICh3Q29kZVBhZ2UgPCB1Q1BJRCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KICNpZmRlZiBfX2NwbHVzcGx1cw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9lbmNvZGUuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfZW5jb2RlLmNwcAppbmRleCAwZjliYjFhLi5mNTYzOTYxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9lbmNvZGUuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2VuY29kZS5jcHAKQEAgLTYsMTg0ICs2LDE4OCBAQAogDQogI2luY2x1ZGUgIi4uL2ZnYXNfYmFzZS5oIg0KICNpbmNsdWRlICJmeF9jb2RlcGFnZS5oIg0KLXZvaWQgRlhfU3dhcEJ5dGVPcmRlcihGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCk7DQotICAgIGlmIChpTGVuZ3RoIDwgMCkgew0KLSAgICAgICAgaUxlbmd0aCA9IEZYU1lTX3djc2xlbihwU3RyKTsNCit2b2lkIEZYX1N3YXBCeXRlT3JkZXIoRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCk7DQorICBpZiAoaUxlbmd0aCA8IDApIHsNCisgICAgaUxlbmd0aCA9IEZYU1lTX3djc2xlbihwU3RyKTsNCisgIH0NCisgIEZYX1dPUkQgd2NoOw0KKyAgaWYgKHNpemVvZihGWF9XQ0hBUikgPiAyKSB7DQorICAgIHdoaWxlIChpTGVuZ3RoLS0gPiAwKSB7DQorICAgICAgd2NoID0gKEZYX1dPUkQpKnBTdHI7DQorICAgICAgd2NoID0gKHdjaCA+PiA4KSB8ICh3Y2ggPDwgOCk7DQorICAgICAgd2NoICY9IDB4MDBGRjsNCisgICAgICAqcFN0cisrID0gd2NoOw0KICAgICB9DQotICAgIEZYX1dPUkQgd2NoOw0KLSAgICBpZiAoc2l6ZW9mKEZYX1dDSEFSKSA+IDIpIHsNCi0gICAgICAgIHdoaWxlIChpTGVuZ3RoIC0tID4gMCkgew0KLSAgICAgICAgICAgIHdjaCA9IChGWF9XT1JEKSAqIHBTdHI7DQotICAgICAgICAgICAgd2NoID0gKHdjaCA+PiA4KSB8ICh3Y2ggPDwgOCk7DQotICAgICAgICAgICAgd2NoICY9IDB4MDBGRjsNCi0gICAgICAgICAgICAqcFN0ciArKyA9IHdjaDsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHdoaWxlIChpTGVuZ3RoIC0tID4gMCkgew0KLSAgICAgICAgICAgIHdjaCA9IChGWF9XT1JEKSAqIHBTdHI7DQotICAgICAgICAgICAgd2NoID0gKHdjaCA+PiA4KSB8ICh3Y2ggPDwgOCk7DQotICAgICAgICAgICAgKnBTdHIgKysgPSB3Y2g7DQotICAgICAgICB9DQorICB9IGVsc2Ugew0KKyAgICB3aGlsZSAoaUxlbmd0aC0tID4gMCkgew0KKyAgICAgIHdjaCA9IChGWF9XT1JEKSpwU3RyOw0KKyAgICAgIHdjaCA9ICh3Y2ggPj4gOCkgfCAod2NoIDw8IDgpOw0KKyAgICAgICpwU3RyKysgPSB3Y2g7DQogICAgIH0NCisgIH0NCiB9DQotdm9pZCBGWF9Td2FwQnl0ZU9yZGVyQ29weShjb25zdCBGWF9XQ0hBUiogcFNyYywgRlhfV0NIQVIqIHBEc3QsIGludDMyX3QgaUxlbmd0aCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwU3JjICE9IE5VTEwgJiYgcERzdCAhPSBOVUxMKTsNCi0gICAgaWYgKGlMZW5ndGggPCAwKSB7DQotICAgICAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBTcmMpOw0KK3ZvaWQgRlhfU3dhcEJ5dGVPcmRlckNvcHkoY29uc3QgRlhfV0NIQVIqIHBTcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiogcERzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBTcmMgIT0gTlVMTCAmJiBwRHN0ICE9IE5VTEwpOw0KKyAgaWYgKGlMZW5ndGggPCAwKSB7DQorICAgIGlMZW5ndGggPSBGWFNZU193Y3NsZW4ocFNyYyk7DQorICB9DQorICBGWF9XT1JEIHdjaDsNCisgIGlmIChzaXplb2YoRlhfV0NIQVIpID4gMikgew0KKyAgICB3aGlsZSAoaUxlbmd0aC0tID4gMCkgew0KKyAgICAgIHdjaCA9IChGWF9XT1JEKSpwU3JjKys7DQorICAgICAgd2NoID0gKHdjaCA+PiA4KSB8ICh3Y2ggPDwgOCk7DQorICAgICAgd2NoICY9IDB4MDBGRjsNCisgICAgICAqcERzdCsrID0gd2NoOw0KICAgICB9DQotICAgIEZYX1dPUkQgd2NoOw0KLSAgICBpZiAoc2l6ZW9mKEZYX1dDSEFSKSA+IDIpIHsNCi0gICAgICAgIHdoaWxlIChpTGVuZ3RoIC0tID4gMCkgew0KLSAgICAgICAgICAgIHdjaCA9IChGWF9XT1JEKSAqIHBTcmMgKys7DQotICAgICAgICAgICAgd2NoID0gKHdjaCA+PiA4KSB8ICh3Y2ggPDwgOCk7DQotICAgICAgICAgICAgd2NoICY9IDB4MDBGRjsNCi0gICAgICAgICAgICAqcERzdCArKyA9IHdjaDsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHdoaWxlIChpTGVuZ3RoIC0tID4gMCkgew0KLSAgICAgICAgICAgIHdjaCA9IChGWF9XT1JEKSAqIHBTcmMgKys7DQotICAgICAgICAgICAgd2NoID0gKHdjaCA+PiA4KSB8ICh3Y2ggPDwgOCk7DQotICAgICAgICAgICAgKnBEc3QgKysgPSB3Y2g7DQotICAgICAgICB9DQorICB9IGVsc2Ugew0KKyAgICB3aGlsZSAoaUxlbmd0aC0tID4gMCkgew0KKyAgICAgIHdjaCA9IChGWF9XT1JEKSpwU3JjKys7DQorICAgICAgd2NoID0gKHdjaCA+PiA4KSB8ICh3Y2ggPDwgOCk7DQorICAgICAgKnBEc3QrKyA9IHdjaDsNCiAgICAgfQ0KKyAgfQ0KIH0NCi12b2lkIEZYX1VURjE2VG9XQ2hhcih2b2lkKiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgpDQotew0KLSAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCi0gICAgaWYgKHNpemVvZihGWF9XQ0hBUikgPT0gMikgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX1dPUkQgKnBTcmMgPSAoRlhfV09SRCopcEJ1ZmZlcjsNCi0gICAgRlhfV0NIQVIqIHBEc3QgPSAoRlhfV0NIQVIqKXBCdWZmZXI7DQordm9pZCBGWF9VVEYxNlRvV0NoYXIodm9pZCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIGlmIChzaXplb2YoRlhfV0NIQVIpID09IDIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfV09SRCogcFNyYyA9IChGWF9XT1JEKilwQnVmZmVyOw0KKyAgRlhfV0NIQVIqIHBEc3QgPSAoRlhfV0NIQVIqKXBCdWZmZXI7DQorICB3aGlsZSAoLS1pTGVuZ3RoID49IDApIHsNCisgICAgcERzdFtpTGVuZ3RoXSA9IChGWF9XQ0hBUilwU3JjW2lMZW5ndGhdOw0KKyAgfQ0KK30NCit2b2lkIEZYX1VURjE2VG9XQ2hhckNvcHkoY29uc3QgRlhfV09SRCogcFVURjE2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiogcFdDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChwVVRGMTYgIT0gTlVMTCAmJiBwV0NoYXIgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICBpZiAoc2l6ZW9mKEZYX1dDSEFSKSA9PSAyKSB7DQorICAgIEZYU1lTX21lbWNweShwV0NoYXIsIHBVVEYxNiwgaUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgfSBlbHNlIHsNCiAgICAgd2hpbGUgKC0taUxlbmd0aCA+PSAwKSB7DQotICAgICAgICBwRHN0W2lMZW5ndGhdID0gKEZYX1dDSEFSKXBTcmNbaUxlbmd0aF07DQorICAgICAgcFdDaGFyW2lMZW5ndGhdID0gKEZYX1dDSEFSKXBVVEYxNltpTGVuZ3RoXTsNCiAgICAgfQ0KKyAgfQ0KIH0NCi12b2lkIEZYX1VURjE2VG9XQ2hhckNvcHkoY29uc3QgRlhfV09SRCAqcFVURjE2LCBGWF9XQ0hBUiogcFdDaGFyLCBpbnQzMl90IGlMZW5ndGgpDQotew0KLSAgICBGWFNZU19hc3NlcnQocFVURjE2ICE9IE5VTEwgJiYgcFdDaGFyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KLSAgICBpZiAoc2l6ZW9mKEZYX1dDSEFSKSA9PSAyKSB7DQotICAgICAgICBGWFNZU19tZW1jcHkocFdDaGFyLCBwVVRGMTYsIGlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHdoaWxlICgtLWlMZW5ndGggPj0gMCkgew0KLSAgICAgICAgICAgIHBXQ2hhcltpTGVuZ3RoXSA9IChGWF9XQ0hBUilwVVRGMTZbaUxlbmd0aF07DQotICAgICAgICB9DQotICAgIH0NCit2b2lkIEZYX1dDaGFyVG9VVEYxNih2b2lkKiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgaWYgKHNpemVvZihGWF9XQ0hBUikgPT0gMikgew0KKyAgICByZXR1cm47DQorICB9DQorICBjb25zdCBGWF9XQ0hBUiogcFNyYyA9IChjb25zdCBGWF9XQ0hBUiopcEJ1ZmZlcjsNCisgIEZYX1dPUkQqIHBEc3QgPSAoRlhfV09SRCopcEJ1ZmZlcjsNCisgIHdoaWxlICgtLWlMZW5ndGggPj0gMCkgew0KKyAgICAqcERzdCsrID0gKEZYX1dPUkQpKnBTcmMrKzsNCisgIH0NCiB9DQotdm9pZCBGWF9XQ2hhclRvVVRGMTYodm9pZCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQotICAgIGlmIChzaXplb2YoRlhfV0NIQVIpID09IDIpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFNyYyA9IChjb25zdCBGWF9XQ0hBUiopcEJ1ZmZlcjsNCi0gICAgRlhfV09SRCAqcERzdCA9IChGWF9XT1JEKilwQnVmZmVyOw0KK3ZvaWQgRlhfV0NoYXJUb1VURjE2Q29weShjb25zdCBGWF9XQ0hBUiogcFdDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEKiBwVVRGMTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBXQ2hhciAhPSBOVUxMICYmIHBVVEYxNiAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIGlmIChzaXplb2YoRlhfV0NIQVIpID09IDIpIHsNCisgICAgRlhTWVNfbWVtY3B5KHBVVEYxNiwgcFdDaGFyLCBpTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICB9IGVsc2Ugew0KICAgICB3aGlsZSAoLS1pTGVuZ3RoID49IDApIHsNCi0gICAgICAgICpwRHN0KysgPSAoRlhfV09SRCkgKiBwU3JjKys7DQorICAgICAgKnBVVEYxNisrID0gKEZYX1dPUkQpKnBXQ2hhcisrOw0KICAgICB9DQorICB9DQogfQ0KLXZvaWQgRlhfV0NoYXJUb1VURjE2Q29weShjb25zdCBGWF9XQ0hBUiogcFdDaGFyLCBGWF9XT1JEICpwVVRGMTYsIGludDMyX3QgaUxlbmd0aCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwV0NoYXIgIT0gTlVMTCAmJiBwVVRGMTYgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQotICAgIGlmIChzaXplb2YoRlhfV0NIQVIpID09IDIpIHsNCi0gICAgICAgIEZYU1lTX21lbWNweShwVVRGMTYsIHBXQ2hhciwgaUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgd2hpbGUgKC0taUxlbmd0aCA+PSAwKSB7DQotICAgICAgICAgICAgKnBVVEYxNisrID0gKEZYX1dPUkQpICogcFdDaGFyKys7DQotICAgICAgICB9DQotICAgIH0NCitpbmxpbmUgRlhfRFdPUkQgRlhfRFdvcmRGcm9tQnl0ZXMoY29uc3QgdWludDhfdCogcFN0cikgew0KKyAgcmV0dXJuIEZYQlNUUl9JRChwU3RyWzNdLCBwU3RyWzJdLCBwU3RyWzFdLCBwU3RyWzBdKTsNCiB9DQotaW5saW5lIEZYX0RXT1JEIEZYX0RXb3JkRnJvbUJ5dGVzKGNvbnN0IHVpbnQ4X3QqIHBTdHIpDQotew0KLSAgICByZXR1cm4gRlhCU1RSX0lEKHBTdHJbM10sIHBTdHJbMl0sIHBTdHJbMV0sIHBTdHJbMF0pOw0KK2lubGluZSBGWF9XT1JEIEZYX1dvcmRGcm9tQnl0ZXMoY29uc3QgdWludDhfdCogcFN0cikgew0KKyAgcmV0dXJuIChwU3RyWzFdIDw8IDggfCBwU3RyWzBdKTsNCiB9DQotaW5saW5lIEZYX1dPUkQgRlhfV29yZEZyb21CeXRlcyhjb25zdCB1aW50OF90KiBwU3RyKQ0KLXsNCi0gICAgcmV0dXJuIChwU3RyWzFdIDw8IDggfCBwU3RyWzBdKTsNCitpbnQzMl90IEZYX0RlY29kZVN0cmluZyhGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBwU3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBTcmNMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIHBEc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcERzdExlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFcnJCcmVhaykgew0KKyAgaWYgKHdDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEY4KSB7DQorICAgIHJldHVybiBGWF9VVEY4RGVjb2RlKHBTcmMsIHBTcmNMZW4sIHBEc3QsIHBEc3RMZW4pOw0KKyAgfQ0KKyAgcmV0dXJuIC0xOw0KIH0NCi1pbnQzMl90IEZYX0RlY29kZVN0cmluZyhGWF9XT1JEIHdDb2RlUGFnZSwgY29uc3QgRlhfQ0hBUiogcFNyYywgaW50MzJfdCAqcFNyY0xlbiwgRlhfV0NIQVIqIHBEc3QsIGludDMyX3QgKnBEc3RMZW4sIEZYX0JPT0wgYkVyckJyZWFrKQ0KLXsNCi0gICAgaWYgKHdDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEY4KSB7DQotICAgICAgICByZXR1cm4gRlhfVVRGOERlY29kZShwU3JjLCBwU3JjTGVuLCBwRHN0LCBwRHN0TGVuKTsNCi0gICAgfQ0KK2ludDMyX3QgRlhfVVRGOERlY29kZShjb25zdCBGWF9DSEFSKiBwU3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwU3JjTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiogcERzdCwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcERzdExlbikgew0KKyAgaWYgKHBTcmNMZW4gPT0gTlVMTCB8fCBwRHN0TGVuID09IE5VTEwpIHsNCiAgICAgcmV0dXJuIC0xOw0KLX0NCi1pbnQzMl90IEZYX1VURjhEZWNvZGUoY29uc3QgRlhfQ0hBUiogcFNyYywgaW50MzJfdCAqcFNyY0xlbiwgRlhfV0NIQVIqIHBEc3QsIGludDMyX3QgKnBEc3RMZW4pDQotew0KLSAgICBpZiAocFNyY0xlbiA9PSBOVUxMIHx8IHBEc3RMZW4gPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIGludDMyX3QgaVNyY0xlbiA9ICpwU3JjTGVuOw0KLSAgICBpZiAoaVNyY0xlbiA8IDEpIHsNCi0gICAgICAgICpwU3JjTGVuID0gKnBEc3RMZW4gPSAwOw0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0NCi0gICAgaW50MzJfdCBpRHN0TGVuID0gKnBEc3RMZW47DQotICAgIEZYX0JPT0wgYlZhbGlkRHN0ID0gKHBEc3QgIT0gTlVMTCAmJiBpRHN0TGVuID4gMCk7DQotICAgIEZYX0RXT1JEIGR3Q29kZSA9IDA7DQotICAgIGludDMyX3QgaVBlbmRpbmcgPSAwOw0KLSAgICBpbnQzMl90IGlTcmNOdW0gPSAwLCBpRHN0TnVtID0gMDsNCi0gICAgaW50MzJfdCBrID0gMDsNCi0gICAgaW50MzJfdCBpSW5kZXggPSAwOw0KLSAgICBrID0gMTsNCi0gICAgd2hpbGUgKGlJbmRleCA8IGlTcmNMZW4pIHsNCi0gICAgICAgIHVpbnQ4X3QgYnl0ZSA9ICh1aW50OF90KSAqIChwU3JjICsgaUluZGV4KTsNCi0gICAgICAgIGlmIChieXRlIDwgMHg4MCkgew0KLSAgICAgICAgICAgIGlQZW5kaW5nID0gMDsNCi0gICAgICAgICAgICBrID0gMTsNCi0gICAgICAgICAgICBpRHN0TnVtICsrOw0KLSAgICAgICAgICAgIGlTcmNOdW0gKz0gazsNCi0gICAgICAgICAgICBpZiAoYlZhbGlkRHN0KSB7DQotICAgICAgICAgICAgICAgICpwRHN0ICsrID0gYnl0ZTsNCi0gICAgICAgICAgICAgICAgaWYgKGlEc3ROdW0gPj0gaURzdExlbikgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGMwKSB7DQotICAgICAgICAgICAgaWYgKGlQZW5kaW5nIDwgMSkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaVBlbmRpbmctLTsNCi0gICAgICAgICAgICBkd0NvZGUgfD0gKGJ5dGUgJiAweDNmKSA8PCAoaVBlbmRpbmcgKiA2KTsNCi0gICAgICAgICAgICBpZiAoaVBlbmRpbmcgPT0gMCkgew0KLSAgICAgICAgICAgICAgICBpRHN0TnVtICsrOw0KLSAgICAgICAgICAgICAgICBpU3JjTnVtICs9IGs7DQotICAgICAgICAgICAgICAgIGlmIChiVmFsaWREc3QpIHsNCi0gICAgICAgICAgICAgICAgICAgICpwRHN0ICsrID0gZHdDb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlEc3ROdW0gPj0gaURzdExlbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChieXRlIDwgMHhlMCkgew0KLSAgICAgICAgICAgIGlQZW5kaW5nID0gMTsNCi0gICAgICAgICAgICBrID0gMjsNCi0gICAgICAgICAgICBkd0NvZGUgPSAoYnl0ZSAmIDB4MWYpIDw8IDY7DQotICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGYwKSB7DQotICAgICAgICAgICAgaVBlbmRpbmcgPSAyOw0KLSAgICAgICAgICAgIGsgPSAzOw0KLSAgICAgICAgICAgIGR3Q29kZSA9IChieXRlICYgMHgwZikgPDwgMTI7DQotICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGY4KSB7DQotICAgICAgICAgICAgaVBlbmRpbmcgPSAzOw0KLSAgICAgICAgICAgIGsgPSA0Ow0KLSAgICAgICAgICAgIGR3Q29kZSA9IChieXRlICYgMHgwNykgPDwgMTg7DQotICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGZjKSB7DQotICAgICAgICAgICAgaVBlbmRpbmcgPSA0Ow0KLSAgICAgICAgICAgIGsgPSA1Ow0KLSAgICAgICAgICAgIGR3Q29kZSA9IChieXRlICYgMHgwMykgPDwgMjQ7DQotICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGZlKSB7DQotICAgICAgICAgICAgaVBlbmRpbmcgPSA1Ow0KLSAgICAgICAgICAgIGsgPSA2Ow0KLSAgICAgICAgICAgIGR3Q29kZSA9IChieXRlICYgMHgwMSkgPDwgMzA7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaUluZGV4Kys7DQotICAgIH0NCi0gICAgKnBTcmNMZW4gPSBpU3JjTnVtOw0KLSAgICAqcERzdExlbiA9IGlEc3ROdW07DQorICB9DQorICBpbnQzMl90IGlTcmNMZW4gPSAqcFNyY0xlbjsNCisgIGlmIChpU3JjTGVuIDwgMSkgew0KKyAgICAqcFNyY0xlbiA9ICpwRHN0TGVuID0gMDsNCiAgICAgcmV0dXJuIDE7DQorICB9DQorICBpbnQzMl90IGlEc3RMZW4gPSAqcERzdExlbjsNCisgIEZYX0JPT0wgYlZhbGlkRHN0ID0gKHBEc3QgIT0gTlVMTCAmJiBpRHN0TGVuID4gMCk7DQorICBGWF9EV09SRCBkd0NvZGUgPSAwOw0KKyAgaW50MzJfdCBpUGVuZGluZyA9IDA7DQorICBpbnQzMl90IGlTcmNOdW0gPSAwLCBpRHN0TnVtID0gMDsNCisgIGludDMyX3QgayA9IDA7DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBrID0gMTsNCisgIHdoaWxlIChpSW5kZXggPCBpU3JjTGVuKSB7DQorICAgIHVpbnQ4X3QgYnl0ZSA9ICh1aW50OF90KSAqIChwU3JjICsgaUluZGV4KTsNCisgICAgaWYgKGJ5dGUgPCAweDgwKSB7DQorICAgICAgaVBlbmRpbmcgPSAwOw0KKyAgICAgIGsgPSAxOw0KKyAgICAgIGlEc3ROdW0rKzsNCisgICAgICBpU3JjTnVtICs9IGs7DQorICAgICAgaWYgKGJWYWxpZERzdCkgew0KKyAgICAgICAgKnBEc3QrKyA9IGJ5dGU7DQorICAgICAgICBpZiAoaURzdE51bSA+PSBpRHN0TGVuKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChieXRlIDwgMHhjMCkgew0KKyAgICAgIGlmIChpUGVuZGluZyA8IDEpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpUGVuZGluZy0tOw0KKyAgICAgIGR3Q29kZSB8PSAoYnl0ZSAmIDB4M2YpIDw8IChpUGVuZGluZyAqIDYpOw0KKyAgICAgIGlmIChpUGVuZGluZyA9PSAwKSB7DQorICAgICAgICBpRHN0TnVtKys7DQorICAgICAgICBpU3JjTnVtICs9IGs7DQorICAgICAgICBpZiAoYlZhbGlkRHN0KSB7DQorICAgICAgICAgICpwRHN0KysgPSBkd0NvZGU7DQorICAgICAgICAgIGlmIChpRHN0TnVtID49IGlEc3RMZW4pIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChieXRlIDwgMHhlMCkgew0KKyAgICAgIGlQZW5kaW5nID0gMTsNCisgICAgICBrID0gMjsNCisgICAgICBkd0NvZGUgPSAoYnl0ZSAmIDB4MWYpIDw8IDY7DQorICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZjApIHsNCisgICAgICBpUGVuZGluZyA9IDI7DQorICAgICAgayA9IDM7DQorICAgICAgZHdDb2RlID0gKGJ5dGUgJiAweDBmKSA8PCAxMjsNCisgICAgfSBlbHNlIGlmIChieXRlIDwgMHhmOCkgew0KKyAgICAgIGlQZW5kaW5nID0gMzsNCisgICAgICBrID0gNDsNCisgICAgICBkd0NvZGUgPSAoYnl0ZSAmIDB4MDcpIDw8IDE4Ow0KKyAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGZjKSB7DQorICAgICAgaVBlbmRpbmcgPSA0Ow0KKyAgICAgIGsgPSA1Ow0KKyAgICAgIGR3Q29kZSA9IChieXRlICYgMHgwMykgPDwgMjQ7DQorICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZmUpIHsNCisgICAgICBpUGVuZGluZyA9IDU7DQorICAgICAgayA9IDY7DQorICAgICAgZHdDb2RlID0gKGJ5dGUgJiAweDAxKSA8PCAzMDsNCisgICAgfSBlbHNlIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpSW5kZXgrKzsNCisgIH0NCisgICpwU3JjTGVuID0gaVNyY051bTsNCisgICpwRHN0TGVuID0gaURzdE51bTsNCisgIHJldHVybiAxOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9tZW1vcnkuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfbWVtb3J5LmNwcAppbmRleCA2OTk2MGUxLi4zOTM5MWQ0IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9tZW1vcnkuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X21lbW9yeS5jcHAKQEAgLTYsMzMwICs2LDMyMCBAQAogDQogI2luY2x1ZGUgIi4uL2ZnYXNfYmFzZS5oIg0KICNpbmNsdWRlICJmeF9tZW1vcnkuaCINCi0jZGVmaW5lIEZYXzRCWVRFQUxJR04oc2l6ZSkJKCgoc2l6ZSkgKyAzKSAvIDQgKiA0KQ0KLUlGWF9NRU1BbGxvY2F0b3IqIEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEUgZVR5cGUsIHNpemVfdCBjaHVua1NpemUsIHNpemVfdCBibG9ja1NpemUpDQotew0KLSAgICBzd2l0Y2ggKGVUeXBlKSB7DQorI2RlZmluZSBGWF80QllURUFMSUdOKHNpemUpICgoKHNpemUpICsgMykgLyA0ICogNCkNCitJRlhfTUVNQWxsb2NhdG9yKiBGWF9DcmVhdGVBbGxvY2F0b3IoRlhfQUxMT0NUWVBFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY2h1bmtTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYmxvY2tTaXplKSB7DQorICBzd2l0Y2ggKGVUeXBlKSB7DQogI2lmbmRlZiBfRlhFTUINCi0gICAgICAgIGNhc2UgRlhfQUxMT0NUWVBFX0R5bmFtaWM6DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDRlhfRHluYW1pY1N0b3JlKGNodW5rU2l6ZSk7DQorICAgIGNhc2UgRlhfQUxMT0NUWVBFX0R5bmFtaWM6DQorICAgICAgcmV0dXJuIG5ldyBDRlhfRHluYW1pY1N0b3JlKGNodW5rU2l6ZSk7DQogI2VuZGlmDQotICAgICAgICBjYXNlIEZYX0FMTE9DVFlQRV9EZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ0ZYX0RlZlN0b3JlKCk7DQotICAgICAgICBjYXNlIEZYX0FMTE9DVFlQRV9TdGF0aWM6DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDRlhfU3RhdGljU3RvcmUoY2h1bmtTaXplKTsNCi0gICAgICAgIGNhc2UgRlhfQUxMT0NUWVBFX0ZpeGVkOg0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ0ZYX0ZpeGVkU3RvcmUoYmxvY2tTaXplLCBjaHVua1NpemUpOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KKyAgICBjYXNlIEZYX0FMTE9DVFlQRV9EZWZhdWx0Og0KKyAgICAgIHJldHVybiBuZXcgQ0ZYX0RlZlN0b3JlKCk7DQorICAgIGNhc2UgRlhfQUxMT0NUWVBFX1N0YXRpYzoNCisgICAgICByZXR1cm4gbmV3IENGWF9TdGF0aWNTdG9yZShjaHVua1NpemUpOw0KKyAgICBjYXNlIEZYX0FMTE9DVFlQRV9GaXhlZDoNCisgICAgICByZXR1cm4gbmV3IENGWF9GaXhlZFN0b3JlKGJsb2NrU2l6ZSwgY2h1bmtTaXplKTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gTlVMTDsNCisgIH0NCiB9DQogQ0ZYX1N0YXRpY1N0b3JlOjpDRlhfU3RhdGljU3RvcmUoc2l6ZV90IGlEZWZDaHVua1NpemUpDQotICAgIDogbV9pQWxsb2NhdGVkU2l6ZSgwKQ0KLSAgICAsIG1faURlZkNodW5rU2l6ZShpRGVmQ2h1bmtTaXplKQ0KLSAgICAsIG1fcENodW5rKE5VTEwpDQotICAgICwgbV9wTGFzdENodW5rKE5VTEwpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9pRGVmQ2h1bmtTaXplICE9IDApOw0KKyAgICA6IG1faUFsbG9jYXRlZFNpemUoMCksDQorICAgICAgbV9pRGVmQ2h1bmtTaXplKGlEZWZDaHVua1NpemUpLA0KKyAgICAgIG1fcENodW5rKE5VTEwpLA0KKyAgICAgIG1fcExhc3RDaHVuayhOVUxMKSB7DQorICBGWFNZU19hc3NlcnQobV9pRGVmQ2h1bmtTaXplICE9IDApOw0KIH0NCi1DRlhfU3RhdGljU3RvcmU6On5DRlhfU3RhdGljU3RvcmUoKQ0KLXsNCi0gICAgcmVnaXN0ZXIgRlhfTFBTVEFUSUNTVE9SRUNIVU5LIHBDaHVuaywgcE5leHQ7DQotICAgIHBDaHVuayA9IG1fcENodW5rOw0KLSAgICB3aGlsZSAocENodW5rICE9IE5VTEwpIHsNCi0gICAgICAgIHBOZXh0ID0gcENodW5rLT5wTmV4dENodW5rOw0KLSAgICAgICAgRlhfRnJlZShwQ2h1bmspOw0KLSAgICAgICAgcENodW5rID0gcE5leHQ7DQotICAgIH0NCitDRlhfU3RhdGljU3RvcmU6On5DRlhfU3RhdGljU3RvcmUoKSB7DQorICByZWdpc3RlciBGWF9MUFNUQVRJQ1NUT1JFQ0hVTksgcENodW5rLCBwTmV4dDsNCisgIHBDaHVuayA9IG1fcENodW5rOw0KKyAgd2hpbGUgKHBDaHVuayAhPSBOVUxMKSB7DQorICAgIHBOZXh0ID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgICBGWF9GcmVlKHBDaHVuayk7DQorICAgIHBDaHVuayA9IHBOZXh0Ow0KKyAgfQ0KIH0NCi1GWF9MUFNUQVRJQ1NUT1JFQ0hVTksgQ0ZYX1N0YXRpY1N0b3JlOjpBbGxvY0NodW5rKHNpemVfdCBzaXplKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQotICAgIHJlZ2lzdGVyIEZYX0xQU1RBVElDU1RPUkVDSFVOSyBwQ2h1bmsgPSAoRlhfTFBTVEFUSUNTVE9SRUNIVU5LKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihGWF9TVEFUSUNTVE9SRUNIVU5LKSArIHNpemUpOw0KLSAgICBpZiAocENodW5rID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHBDaHVuay0+aUNodW5rU2l6ZSA9IHNpemU7DQotICAgIHBDaHVuay0+aUZyZWVTaXplID0gc2l6ZTsNCi0gICAgcENodW5rLT5wTmV4dENodW5rID0gTlVMTDsNCi0gICAgaWYgKG1fcExhc3RDaHVuayA9PSBOVUxMKSB7DQotICAgICAgICBtX3BDaHVuayA9IHBDaHVuazsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1fcExhc3RDaHVuay0+cE5leHRDaHVuayA9IHBDaHVuazsNCi0gICAgfQ0KLSAgICBtX3BMYXN0Q2h1bmsgPSBwQ2h1bms7DQotICAgIHJldHVybiBwQ2h1bms7DQorRlhfTFBTVEFUSUNTVE9SRUNIVU5LIENGWF9TdGF0aWNTdG9yZTo6QWxsb2NDaHVuayhzaXplX3Qgc2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQorICByZWdpc3RlciBGWF9MUFNUQVRJQ1NUT1JFQ0hVTksgcENodW5rID0gKEZYX0xQU1RBVElDU1RPUkVDSFVOSylGWF9BbGxvYygNCisgICAgICB1aW50OF90LCBzaXplb2YoRlhfU1RBVElDU1RPUkVDSFVOSykgKyBzaXplKTsNCisgIGlmIChwQ2h1bmsgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBDaHVuay0+aUNodW5rU2l6ZSA9IHNpemU7DQorICBwQ2h1bmstPmlGcmVlU2l6ZSA9IHNpemU7DQorICBwQ2h1bmstPnBOZXh0Q2h1bmsgPSBOVUxMOw0KKyAgaWYgKG1fcExhc3RDaHVuayA9PSBOVUxMKSB7DQorICAgIG1fcENodW5rID0gcENodW5rOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wTGFzdENodW5rLT5wTmV4dENodW5rID0gcENodW5rOw0KKyAgfQ0KKyAgbV9wTGFzdENodW5rID0gcENodW5rOw0KKyAgcmV0dXJuIHBDaHVuazsNCiB9DQotRlhfTFBTVEFUSUNTVE9SRUNIVU5LIENGWF9TdGF0aWNTdG9yZTo6RmluZENodW5rKHNpemVfdCBzaXplKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQotICAgIGlmIChtX3BMYXN0Q2h1bmsgPT0gTlVMTCB8fCBtX3BMYXN0Q2h1bmstPmlGcmVlU2l6ZSA8IHNpemUpIHsNCi0gICAgICAgIHJldHVybiBBbGxvY0NodW5rKEZYX01BWChtX2lEZWZDaHVua1NpemUsIHNpemUpKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wTGFzdENodW5rOw0KK0ZYX0xQU1RBVElDU1RPUkVDSFVOSyBDRlhfU3RhdGljU3RvcmU6OkZpbmRDaHVuayhzaXplX3Qgc2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQorICBpZiAobV9wTGFzdENodW5rID09IE5VTEwgfHwgbV9wTGFzdENodW5rLT5pRnJlZVNpemUgPCBzaXplKSB7DQorICAgIHJldHVybiBBbGxvY0NodW5rKEZYX01BWChtX2lEZWZDaHVua1NpemUsIHNpemUpKTsNCisgIH0NCisgIHJldHVybiBtX3BMYXN0Q2h1bms7DQogfQ0KLXZvaWQqIENGWF9TdGF0aWNTdG9yZTo6QWxsb2Moc2l6ZV90IHNpemUpDQotew0KLSAgICBzaXplID0gRlhfNEJZVEVBTElHTihzaXplKTsNCi0gICAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQotICAgIHJlZ2lzdGVyIEZYX0xQU1RBVElDU1RPUkVDSFVOSyBwQ2h1bmsgPSBGaW5kQ2h1bmsoc2l6ZSk7DQotICAgIEZYU1lTX2Fzc2VydChwQ2h1bmsgIT0gTlVMTCAmJiBwQ2h1bmstPmlGcmVlU2l6ZSA+PSBzaXplKTsNCi0gICAgcmVnaXN0ZXIgdWludDhfdCogcCA9ICh1aW50OF90KilwQ2h1bms7DQotICAgIHAgKz0gc2l6ZW9mKEZYX1NUQVRJQ1NUT1JFQ0hVTkspICsgcENodW5rLT5pQ2h1bmtTaXplIC0gcENodW5rLT5pRnJlZVNpemU7DQotICAgIHBDaHVuay0+aUZyZWVTaXplIC09IHNpemU7DQotICAgIG1faUFsbG9jYXRlZFNpemUgKz0gc2l6ZTsNCi0gICAgcmV0dXJuIHA7DQordm9pZCogQ0ZYX1N0YXRpY1N0b3JlOjpBbGxvYyhzaXplX3Qgc2l6ZSkgew0KKyAgc2l6ZSA9IEZYXzRCWVRFQUxJR04oc2l6ZSk7DQorICBGWFNZU19hc3NlcnQoc2l6ZSAhPSAwKTsNCisgIHJlZ2lzdGVyIEZYX0xQU1RBVElDU1RPUkVDSFVOSyBwQ2h1bmsgPSBGaW5kQ2h1bmsoc2l6ZSk7DQorICBGWFNZU19hc3NlcnQocENodW5rICE9IE5VTEwgJiYgcENodW5rLT5pRnJlZVNpemUgPj0gc2l6ZSk7DQorICByZWdpc3RlciB1aW50OF90KiBwID0gKHVpbnQ4X3QqKXBDaHVuazsNCisgIHAgKz0gc2l6ZW9mKEZYX1NUQVRJQ1NUT1JFQ0hVTkspICsgcENodW5rLT5pQ2h1bmtTaXplIC0gcENodW5rLT5pRnJlZVNpemU7DQorICBwQ2h1bmstPmlGcmVlU2l6ZSAtPSBzaXplOw0KKyAgbV9pQWxsb2NhdGVkU2l6ZSArPSBzaXplOw0KKyAgcmV0dXJuIHA7DQogfQ0KLXNpemVfdCBDRlhfU3RhdGljU3RvcmU6OlNldERlZkNodW5rU2l6ZShzaXplX3Qgc2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChzaXplICE9IDApOw0KLSAgICBzaXplX3QgdiA9IG1faURlZkNodW5rU2l6ZTsNCi0gICAgbV9pRGVmQ2h1bmtTaXplID0gc2l6ZTsNCi0gICAgcmV0dXJuIHY7DQorc2l6ZV90IENGWF9TdGF0aWNTdG9yZTo6U2V0RGVmQ2h1bmtTaXplKHNpemVfdCBzaXplKSB7DQorICBGWFNZU19hc3NlcnQoc2l6ZSAhPSAwKTsNCisgIHNpemVfdCB2ID0gbV9pRGVmQ2h1bmtTaXplOw0KKyAgbV9pRGVmQ2h1bmtTaXplID0gc2l6ZTsNCisgIHJldHVybiB2Ow0KIH0NCiBDRlhfRml4ZWRTdG9yZTo6Q0ZYX0ZpeGVkU3RvcmUoc2l6ZV90IGlCbG9ja1NpemUsIHNpemVfdCBpQmxvY2tOdW1zSW5DaHVuaykNCi0gICAgOiBtX2lCbG9ja1NpemUoRlhfNEJZVEVBTElHTihpQmxvY2tTaXplKSkNCi0gICAgLCBtX2lEZWZDaHVua1NpemUoRlhfNEJZVEVBTElHTihpQmxvY2tOdW1zSW5DaHVuaykpDQotICAgICwgbV9wQ2h1bmsoTlVMTCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX2lCbG9ja1NpemUgIT0gMCAmJiBtX2lEZWZDaHVua1NpemUgIT0gMCk7DQorICAgIDogbV9pQmxvY2tTaXplKEZYXzRCWVRFQUxJR04oaUJsb2NrU2l6ZSkpLA0KKyAgICAgIG1faURlZkNodW5rU2l6ZShGWF80QllURUFMSUdOKGlCbG9ja051bXNJbkNodW5rKSksDQorICAgICAgbV9wQ2h1bmsoTlVMTCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faUJsb2NrU2l6ZSAhPSAwICYmIG1faURlZkNodW5rU2l6ZSAhPSAwKTsNCiB9DQotQ0ZYX0ZpeGVkU3RvcmU6On5DRlhfRml4ZWRTdG9yZSgpDQotew0KLSAgICByZWdpc3RlciBGWF9MUEZJWEVEU1RPUkVDSFVOSyBwQ2h1bmssIHBOZXh0Ow0KLSAgICBwQ2h1bmsgPSBtX3BDaHVuazsNCi0gICAgd2hpbGUgKHBDaHVuayAhPSBOVUxMKSB7DQotICAgICAgICBwTmV4dCA9IHBDaHVuay0+cE5leHRDaHVuazsNCi0gICAgICAgIEZYX0ZyZWUocENodW5rKTsNCi0gICAgICAgIHBDaHVuayA9IHBOZXh0Ow0KLSAgICB9DQorQ0ZYX0ZpeGVkU3RvcmU6On5DRlhfRml4ZWRTdG9yZSgpIHsNCisgIHJlZ2lzdGVyIEZYX0xQRklYRURTVE9SRUNIVU5LIHBDaHVuaywgcE5leHQ7DQorICBwQ2h1bmsgPSBtX3BDaHVuazsNCisgIHdoaWxlIChwQ2h1bmsgIT0gTlVMTCkgew0KKyAgICBwTmV4dCA9IHBDaHVuay0+cE5leHRDaHVuazsNCisgICAgRlhfRnJlZShwQ2h1bmspOw0KKyAgICBwQ2h1bmsgPSBwTmV4dDsNCisgIH0NCiB9DQotRlhfTFBGSVhFRFNUT1JFQ0hVTksgQ0ZYX0ZpeGVkU3RvcmU6OkFsbG9jQ2h1bmsoKQ0KLXsNCi0gICAgaW50MzJfdCBpVG90YWxTaXplID0gc2l6ZW9mKEZYX0ZJWEVEU1RPUkVDSFVOSykgKyBtX2lEZWZDaHVua1NpemUgKyBtX2lCbG9ja1NpemUgKiBtX2lEZWZDaHVua1NpemU7DQotICAgIHJlZ2lzdGVyIEZYX0xQRklYRURTVE9SRUNIVU5LIHBDaHVuayA9IChGWF9MUEZJWEVEU1RPUkVDSFVOSylGWF9BbGxvYyh1aW50OF90LCBpVG90YWxTaXplKTsNCi0gICAgaWYgKHBDaHVuayA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBGWFNZU19tZW1zZXQocENodW5rLT5GaXJzdEZsYWcoKSwgMCwgbV9pRGVmQ2h1bmtTaXplKTsNCi0gICAgcENodW5rLT5wTmV4dENodW5rID0gbV9wQ2h1bms7DQotICAgIHBDaHVuay0+aUNodW5rU2l6ZSA9IG1faURlZkNodW5rU2l6ZTsNCi0gICAgcENodW5rLT5pRnJlZU51bSA9IG1faURlZkNodW5rU2l6ZTsNCi0gICAgbV9wQ2h1bmsgPSBwQ2h1bms7DQotICAgIHJldHVybiBwQ2h1bms7DQorRlhfTFBGSVhFRFNUT1JFQ0hVTksgQ0ZYX0ZpeGVkU3RvcmU6OkFsbG9jQ2h1bmsoKSB7DQorICBpbnQzMl90IGlUb3RhbFNpemUgPSBzaXplb2YoRlhfRklYRURTVE9SRUNIVU5LKSArIG1faURlZkNodW5rU2l6ZSArDQorICAgICAgICAgICAgICAgICAgICAgICBtX2lCbG9ja1NpemUgKiBtX2lEZWZDaHVua1NpemU7DQorICByZWdpc3RlciBGWF9MUEZJWEVEU1RPUkVDSFVOSyBwQ2h1bmsgPQ0KKyAgICAgIChGWF9MUEZJWEVEU1RPUkVDSFVOSylGWF9BbGxvYyh1aW50OF90LCBpVG90YWxTaXplKTsNCisgIGlmIChwQ2h1bmsgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZYU1lTX21lbXNldChwQ2h1bmstPkZpcnN0RmxhZygpLCAwLCBtX2lEZWZDaHVua1NpemUpOw0KKyAgcENodW5rLT5wTmV4dENodW5rID0gbV9wQ2h1bms7DQorICBwQ2h1bmstPmlDaHVua1NpemUgPSBtX2lEZWZDaHVua1NpemU7DQorICBwQ2h1bmstPmlGcmVlTnVtID0gbV9pRGVmQ2h1bmtTaXplOw0KKyAgbV9wQ2h1bmsgPSBwQ2h1bms7DQorICByZXR1cm4gcENodW5rOw0KIH0NCi12b2lkKiBDRlhfRml4ZWRTdG9yZTo6QWxsb2Moc2l6ZV90IHNpemUpDQotew0KLSAgICBpZiAoc2l6ZSA+IG1faUJsb2NrU2l6ZSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQordm9pZCogQ0ZYX0ZpeGVkU3RvcmU6OkFsbG9jKHNpemVfdCBzaXplKSB7DQorICBpZiAoc2l6ZSA+IG1faUJsb2NrU2l6ZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJlZ2lzdGVyIEZYX0xQRklYRURTVE9SRUNIVU5LIHBDaHVuayA9IG1fcENodW5rOw0KKyAgd2hpbGUgKHBDaHVuayAhPSBOVUxMKSB7DQorICAgIGlmIChwQ2h1bmstPmlGcmVlTnVtID4gMCkgew0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJlZ2lzdGVyIEZYX0xQRklYRURTVE9SRUNIVU5LIHBDaHVuayA9IG1fcENodW5rOw0KLSAgICB3aGlsZSAocENodW5rICE9IE5VTEwpIHsNCi0gICAgICAgIGlmIChwQ2h1bmstPmlGcmVlTnVtID4gMCkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcENodW5rID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgICBwQ2h1bmsgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQorICB9DQorICBpZiAocENodW5rID09IE5VTEwpIHsNCisgICAgcENodW5rID0gQWxsb2NDaHVuaygpOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KHBDaHVuayAhPSBOVUxMKTsNCisgIHJlZ2lzdGVyIHVpbnQ4X3QqIHBGbGFncyA9IHBDaHVuay0+Rmlyc3RGbGFnKCk7DQorICByZWdpc3RlciBzaXplX3QgaSA9IDA7DQorICBmb3IgKDsgaSA8IHBDaHVuay0+aUNodW5rU2l6ZTsgaSsrKQ0KKyAgICBpZiAocEZsYWdzW2ldID09IDApIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpZiAocENodW5rID09IE5VTEwpIHsNCi0gICAgICAgIHBDaHVuayA9IEFsbG9jQ2h1bmsoKTsNCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQocENodW5rICE9IE5VTEwpOw0KLSAgICByZWdpc3RlciB1aW50OF90KiBwRmxhZ3MgPSBwQ2h1bmstPkZpcnN0RmxhZygpOw0KLSAgICByZWdpc3RlciBzaXplX3QgaSA9IDA7DQotICAgIGZvciAoOyBpIDwgcENodW5rLT5pQ2h1bmtTaXplOyBpICsrKQ0KLSAgICAgICAgaWYgKHBGbGFnc1tpXSA9PSAwKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIEZYU1lTX2Fzc2VydChpIDwgcENodW5rLT5pQ2h1bmtTaXplKTsNCi0gICAgcEZsYWdzW2ldID0gMTsNCi0gICAgcENodW5rLT5pRnJlZU51bSAtLTsNCi0gICAgcmV0dXJuIHBDaHVuay0+Rmlyc3RCbG9jaygpICsgaSAqIG1faUJsb2NrU2l6ZTsNCisgIEZYU1lTX2Fzc2VydChpIDwgcENodW5rLT5pQ2h1bmtTaXplKTsNCisgIHBGbGFnc1tpXSA9IDE7DQorICBwQ2h1bmstPmlGcmVlTnVtLS07DQorICByZXR1cm4gcENodW5rLT5GaXJzdEJsb2NrKCkgKyBpICogbV9pQmxvY2tTaXplOw0KIH0NCi12b2lkIENGWF9GaXhlZFN0b3JlOjpGcmVlKHZvaWQqIHBCbG9jaykNCi17DQotICAgIEZYU1lTX2Fzc2VydChwQmxvY2sgIT0gTlVMTCk7DQotICAgIHJlZ2lzdGVyIEZYX0xQRklYRURTVE9SRUNIVU5LIHBQcmlvciwgcENodW5rOw0KLSAgICBwUHJpb3IgPSBOVUxMLCBwQ2h1bmsgPSBtX3BDaHVuazsNCi0gICAgdWludDhfdCogcFN0YXJ0ID0gTlVMTDsNCi0gICAgdWludDhfdCogcEVuZDsNCi0gICAgd2hpbGUgKHBDaHVuayAhPSBOVUxMKSB7DQotICAgICAgICBwU3RhcnQgPSBwQ2h1bmstPkZpcnN0QmxvY2soKTsNCi0gICAgICAgIGlmIChwQmxvY2sgPj0gcFN0YXJ0KSB7DQotICAgICAgICAgICAgcEVuZCA9IHBTdGFydCArIG1faUJsb2NrU2l6ZSAqIHBDaHVuay0+aUNodW5rU2l6ZTsNCi0gICAgICAgICAgICBpZiAocEJsb2NrIDwgcEVuZCkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBwUHJpb3IgPSBwQ2h1bmssIHBDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCit2b2lkIENGWF9GaXhlZFN0b3JlOjpGcmVlKHZvaWQqIHBCbG9jaykgew0KKyAgRlhTWVNfYXNzZXJ0KHBCbG9jayAhPSBOVUxMKTsNCisgIHJlZ2lzdGVyIEZYX0xQRklYRURTVE9SRUNIVU5LIHBQcmlvciwgcENodW5rOw0KKyAgcFByaW9yID0gTlVMTCwgcENodW5rID0gbV9wQ2h1bms7DQorICB1aW50OF90KiBwU3RhcnQgPSBOVUxMOw0KKyAgdWludDhfdCogcEVuZDsNCisgIHdoaWxlIChwQ2h1bmsgIT0gTlVMTCkgew0KKyAgICBwU3RhcnQgPSBwQ2h1bmstPkZpcnN0QmxvY2soKTsNCisgICAgaWYgKHBCbG9jayA+PSBwU3RhcnQpIHsNCisgICAgICBwRW5kID0gcFN0YXJ0ICsgbV9pQmxvY2tTaXplICogcENodW5rLT5pQ2h1bmtTaXplOw0KKyAgICAgIGlmIChwQmxvY2sgPCBwRW5kKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQogICAgIH0NCi0gICAgRlhTWVNfYXNzZXJ0KHBDaHVuayAhPSBOVUxMKTsNCi0gICAgcmVnaXN0ZXIgc2l6ZV90IGlQb3MgPSAoKHVpbnQ4X3QqKXBCbG9jayAtIHBTdGFydCkgLyBtX2lCbG9ja1NpemU7DQotICAgIEZYU1lTX2Fzc2VydChpUG9zIDwgcENodW5rLT5pQ2h1bmtTaXplKTsNCi0gICAgcmVnaXN0ZXIgdWludDhfdCogcEZsYWdzID0gcENodW5rLT5GaXJzdEZsYWcoKTsNCi0gICAgaWYgKHBGbGFnc1tpUG9zXSA9PSAwKSB7DQotICAgICAgICByZXR1cm47DQorICAgIHBQcmlvciA9IHBDaHVuaywgcENodW5rID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KHBDaHVuayAhPSBOVUxMKTsNCisgIHJlZ2lzdGVyIHNpemVfdCBpUG9zID0gKCh1aW50OF90KilwQmxvY2sgLSBwU3RhcnQpIC8gbV9pQmxvY2tTaXplOw0KKyAgRlhTWVNfYXNzZXJ0KGlQb3MgPCBwQ2h1bmstPmlDaHVua1NpemUpOw0KKyAgcmVnaXN0ZXIgdWludDhfdCogcEZsYWdzID0gcENodW5rLT5GaXJzdEZsYWcoKTsNCisgIGlmIChwRmxhZ3NbaVBvc10gPT0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwRmxhZ3NbaVBvc10gPSAwOw0KKyAgcENodW5rLT5pRnJlZU51bSsrOw0KKyAgaWYgKHBDaHVuay0+aUZyZWVOdW0gPT0gcENodW5rLT5pQ2h1bmtTaXplKSB7DQorICAgIGlmIChwUHJpb3IgPT0gTlVMTCkgew0KKyAgICAgIG1fcENodW5rID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBQcmlvci0+cE5leHRDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCiAgICAgfQ0KLSAgICBwRmxhZ3NbaVBvc10gPSAwOw0KLSAgICBwQ2h1bmstPmlGcmVlTnVtICsrOw0KLSAgICBpZiAocENodW5rLT5pRnJlZU51bSA9PSBwQ2h1bmstPmlDaHVua1NpemUpIHsNCi0gICAgICAgIGlmIChwUHJpb3IgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIG1fcENodW5rID0gcENodW5rLT5wTmV4dENodW5rOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwUHJpb3ItPnBOZXh0Q2h1bmsgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQotICAgICAgICB9DQotICAgICAgICBGWF9GcmVlKHBDaHVuayk7DQotICAgIH0NCisgICAgRlhfRnJlZShwQ2h1bmspOw0KKyAgfQ0KIH0NCi1zaXplX3QgQ0ZYX0ZpeGVkU3RvcmU6OlNldERlZkNodW5rU2l6ZShzaXplX3QgaUNodW5rU2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChpQ2h1bmtTaXplICE9IDApOw0KLSAgICBzaXplX3QgdiA9IG1faURlZkNodW5rU2l6ZTsNCi0gICAgbV9pRGVmQ2h1bmtTaXplID0gRlhfNEJZVEVBTElHTihpQ2h1bmtTaXplKTsNCi0gICAgcmV0dXJuIHY7DQorc2l6ZV90IENGWF9GaXhlZFN0b3JlOjpTZXREZWZDaHVua1NpemUoc2l6ZV90IGlDaHVua1NpemUpIHsNCisgIEZYU1lTX2Fzc2VydChpQ2h1bmtTaXplICE9IDApOw0KKyAgc2l6ZV90IHYgPSBtX2lEZWZDaHVua1NpemU7DQorICBtX2lEZWZDaHVua1NpemUgPSBGWF80QllURUFMSUdOKGlDaHVua1NpemUpOw0KKyAgcmV0dXJuIHY7DQogfQ0KICNpZm5kZWYgX0ZYRU1CDQogQ0ZYX0R5bmFtaWNTdG9yZTo6Q0ZYX0R5bmFtaWNTdG9yZShzaXplX3QgaURlZkNodW5rU2l6ZSkNCi0gICAgOiBtX2lEZWZDaHVua1NpemUoaURlZkNodW5rU2l6ZSkNCi0gICAgLCBtX3BDaHVuayhOVUxMKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1faURlZkNodW5rU2l6ZSAhPSAwKTsNCisgICAgOiBtX2lEZWZDaHVua1NpemUoaURlZkNodW5rU2l6ZSksIG1fcENodW5rKE5VTEwpIHsNCisgIEZYU1lTX2Fzc2VydChtX2lEZWZDaHVua1NpemUgIT0gMCk7DQogfQ0KLUNGWF9EeW5hbWljU3RvcmU6On5DRlhfRHluYW1pY1N0b3JlKCkNCi17DQotICAgIHJlZ2lzdGVyIEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksgcENodW5rLCBwTmV4dDsNCi0gICAgcENodW5rID0gbV9wQ2h1bms7DQotICAgIHdoaWxlIChwQ2h1bmsgIT0gTlVMTCkgew0KLSAgICAgICAgcE5leHQgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQotICAgICAgICBGWF9GcmVlKHBDaHVuayk7DQotICAgICAgICBwQ2h1bmsgPSBwTmV4dDsNCi0gICAgfQ0KK0NGWF9EeW5hbWljU3RvcmU6On5DRlhfRHluYW1pY1N0b3JlKCkgew0KKyAgcmVnaXN0ZXIgRlhfTFBEWU5BTUlDU1RPUkVDSFVOSyBwQ2h1bmssIHBOZXh0Ow0KKyAgcENodW5rID0gbV9wQ2h1bms7DQorICB3aGlsZSAocENodW5rICE9IE5VTEwpIHsNCisgICAgcE5leHQgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQorICAgIEZYX0ZyZWUocENodW5rKTsNCisgICAgcENodW5rID0gcE5leHQ7DQorICB9DQogfQ0KLUZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksgQ0ZYX0R5bmFtaWNTdG9yZTo6QWxsb2NDaHVuayhzaXplX3Qgc2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChzaXplICE9IDApOw0KLSAgICByZWdpc3RlciBGWF9MUERZTkFNSUNTVE9SRUNIVU5LIHBDaHVuayA9IChGWF9MUERZTkFNSUNTVE9SRUNIVU5LKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihGWF9EWU5BTUlDU1RPUkVDSFVOSykgKyBzaXplb2YoRlhfRFlOQU1JQ1NUT1JFQkxPQ0spICogMiArIHNpemUpOw0KLSAgICBpZiAocENodW5rID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KK0ZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksgQ0ZYX0R5bmFtaWNTdG9yZTo6QWxsb2NDaHVuayhzaXplX3Qgc2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQorICByZWdpc3RlciBGWF9MUERZTkFNSUNTVE9SRUNIVU5LIHBDaHVuayA9IChGWF9MUERZTkFNSUNTVE9SRUNIVU5LKUZYX0FsbG9jKA0KKyAgICAgIHVpbnQ4X3QsDQorICAgICAgc2l6ZW9mKEZYX0RZTkFNSUNTVE9SRUNIVU5LKSArIHNpemVvZihGWF9EWU5BTUlDU1RPUkVCTE9DSykgKiAyICsgc2l6ZSk7DQorICBpZiAocENodW5rID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwQ2h1bmstPmlDaHVua1NpemUgPSBzaXplOw0KKyAgcENodW5rLT5pRnJlZVNpemUgPSBzaXplOw0KKyAgcmVnaXN0ZXIgRlhfTFBEWU5BTUlDU1RPUkVCTE9DSyBwQmxvY2sgPSBwQ2h1bmstPkZpcnN0QmxvY2soKTsNCisgIHBCbG9jay0+aUJsb2NrU2l6ZSA9IHNpemU7DQorICBwQmxvY2stPmJVc2VkID0gRkFMU0U7DQorICBwQmxvY2sgPSBwQmxvY2stPk5leHRCbG9jaygpOw0KKyAgcEJsb2NrLT5pQmxvY2tTaXplID0gMDsNCisgIHBCbG9jay0+YlVzZWQgPSBUUlVFOw0KKyAgaWYgKG1fcENodW5rICE9IE5VTEwgJiYgc2l6ZSA+PSBtX2lEZWZDaHVua1NpemUpIHsNCisgICAgRlhfTFBEWU5BTUlDU1RPUkVDSFVOSyBwTGFzdCA9IG1fcENodW5rOw0KKyAgICB3aGlsZSAocExhc3QtPnBOZXh0Q2h1bmsgIT0gTlVMTCkgew0KKyAgICAgIHBMYXN0ID0gcExhc3QtPnBOZXh0Q2h1bms7DQogICAgIH0NCi0gICAgcENodW5rLT5pQ2h1bmtTaXplID0gc2l6ZTsNCi0gICAgcENodW5rLT5pRnJlZVNpemUgPSBzaXplOw0KLSAgICByZWdpc3RlciBGWF9MUERZTkFNSUNTVE9SRUJMT0NLIHBCbG9jayA9IHBDaHVuay0+Rmlyc3RCbG9jaygpOw0KKyAgICBwTGFzdC0+cE5leHRDaHVuayA9IHBDaHVuazsNCisgICAgcENodW5rLT5wTmV4dENodW5rID0gTlVMTDsNCisgIH0gZWxzZSB7DQorICAgIHBDaHVuay0+cE5leHRDaHVuayA9IG1fcENodW5rOw0KKyAgICBtX3BDaHVuayA9IHBDaHVuazsNCisgIH0NCisgIHJldHVybiBwQ2h1bms7DQorfQ0KK3ZvaWQqIENGWF9EeW5hbWljU3RvcmU6OkFsbG9jKHNpemVfdCBzaXplKSB7DQorICBzaXplID0gRlhfNEJZVEVBTElHTihzaXplKTsNCisgIEZYU1lTX2Fzc2VydChzaXplICE9IDApOw0KKyAgcmVnaXN0ZXIgRlhfTFBEWU5BTUlDU1RPUkVDSFVOSyBwQ2h1bmsgPSBtX3BDaHVuazsNCisgIHJlZ2lzdGVyIEZYX0xQRFlOQU1JQ1NUT1JFQkxPQ0sgcEJsb2NrID0gTlVMTDsNCisgIHdoaWxlIChwQ2h1bmsgIT0gTlVMTCkgew0KKyAgICBpZiAocENodW5rLT5pRnJlZVNpemUgPj0gc2l6ZSkgew0KKyAgICAgIHBCbG9jayA9IHBDaHVuay0+Rmlyc3RCbG9jaygpOw0KKyAgICAgIHJlZ2lzdGVyIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsNCisgICAgICB3aGlsZSAocEJsb2NrLT5pQmxvY2tTaXplICE9IDApIHsNCisgICAgICAgIGlmICghcEJsb2NrLT5iVXNlZCAmJiBwQmxvY2stPmlCbG9ja1NpemUgPj0gc2l6ZSkgew0KKyAgICAgICAgICBiRmluZCA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEJsb2NrID0gcEJsb2NrLT5OZXh0QmxvY2soKTsNCisgICAgICB9DQorICAgICAgaWYgKGJGaW5kKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgcENodW5rID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgfQ0KKyAgaWYgKHBDaHVuayA9PSBOVUxMKSB7DQorICAgIHBDaHVuayA9IEFsbG9jQ2h1bmsoRlhfTUFYKG1faURlZkNodW5rU2l6ZSwgc2l6ZSkpOw0KKyAgICBwQmxvY2sgPSBwQ2h1bmstPkZpcnN0QmxvY2soKTsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChwQ2h1bmsgIT0gTlVMTCAmJiBwQmxvY2sgIT0gTlVMTCk7DQorICByZWdpc3RlciBzaXplX3QgbSA9IHNpemUgKyBzaXplb2YoRlhfRFlOQU1JQ1NUT1JFQkxPQ0spOw0KKyAgcEJsb2NrLT5iVXNlZCA9IFRSVUU7DQorICBpZiAocEJsb2NrLT5pQmxvY2tTaXplID4gbSkgew0KKyAgICByZWdpc3RlciBzaXplX3QgbiA9IHBCbG9jay0+aUJsb2NrU2l6ZTsNCiAgICAgcEJsb2NrLT5pQmxvY2tTaXplID0gc2l6ZTsNCi0gICAgcEJsb2NrLT5iVXNlZCA9IEZBTFNFOw0KLSAgICBwQmxvY2sgPSBwQmxvY2stPk5leHRCbG9jaygpOw0KLSAgICBwQmxvY2stPmlCbG9ja1NpemUgPSAwOw0KLSAgICBwQmxvY2stPmJVc2VkID0gVFJVRTsNCi0gICAgaWYgKG1fcENodW5rICE9IE5VTEwgJiYgc2l6ZSA+PSBtX2lEZWZDaHVua1NpemUpIHsNCi0gICAgICAgIEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksgcExhc3QgPSBtX3BDaHVuazsNCi0gICAgICAgIHdoaWxlIChwTGFzdC0+cE5leHRDaHVuayAhPSBOVUxMKSB7DQotICAgICAgICAgICAgcExhc3QgPSBwTGFzdC0+cE5leHRDaHVuazsNCi0gICAgICAgIH0NCi0gICAgICAgIHBMYXN0LT5wTmV4dENodW5rID0gcENodW5rOw0KLSAgICAgICAgcENodW5rLT5wTmV4dENodW5rID0gTlVMTDsNCisgICAgcmVnaXN0ZXIgRlhfTFBEWU5BTUlDU1RPUkVCTE9DSyBwTmV4dEJsb2NrID0gcEJsb2NrLT5OZXh0QmxvY2soKTsNCisgICAgcE5leHRCbG9jay0+YlVzZWQgPSBGQUxTRTsNCisgICAgcE5leHRCbG9jay0+aUJsb2NrU2l6ZSA9IG4gLSBzaXplIC0gc2l6ZW9mKEZYX0RZTkFNSUNTVE9SRUJMT0NLKTsNCisgICAgcENodW5rLT5pRnJlZVNpemUgLT0gc2l6ZSArIHNpemVvZihGWF9EWU5BTUlDU1RPUkVCTE9DSyk7DQorICB9IGVsc2Ugew0KKyAgICBwQ2h1bmstPmlGcmVlU2l6ZSAtPSBwQmxvY2stPmlCbG9ja1NpemU7DQorICB9DQorICByZXR1cm4gcEJsb2NrLT5EYXRhKCk7DQorfQ0KK3ZvaWQgQ0ZYX0R5bmFtaWNTdG9yZTo6RnJlZSh2b2lkKiBwQmxvY2spIHsNCisgIEZYU1lTX2Fzc2VydChwQmxvY2sgIT0gTlVMTCk7DQorICByZWdpc3RlciBGWF9MUERZTkFNSUNTVE9SRUNIVU5LIHBQcmlvckNodW5rLCBwQ2h1bms7DQorICBwUHJpb3JDaHVuayA9IE5VTEwsIHBDaHVuayA9IG1fcENodW5rOw0KKyAgd2hpbGUgKHBDaHVuayAhPSBOVUxMKSB7DQorICAgIGlmIChwQmxvY2sgPiBwQ2h1bmsgJiYNCisgICAgICAgIHBCbG9jayA8PSAoKHVpbnQ4X3QqKXBDaHVuayArIHNpemVvZihGWF9EWU5BTUlDU1RPUkVDSFVOSykgKw0KKyAgICAgICAgICAgICAgICAgICBwQ2h1bmstPmlDaHVua1NpemUpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcFByaW9yQ2h1bmsgPSBwQ2h1bmssIHBDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChwQ2h1bmsgIT0gTlVMTCk7DQorICByZWdpc3RlciBGWF9MUERZTkFNSUNTVE9SRUJMT0NLIHBQcmlvckJsb2NrLCBwRmluZEJsb2NrOw0KKyAgcFByaW9yQmxvY2sgPSBOVUxMLCBwRmluZEJsb2NrID0gcENodW5rLT5GaXJzdEJsb2NrKCk7DQorICB3aGlsZSAocEZpbmRCbG9jay0+aUJsb2NrU2l6ZSAhPSAwKSB7DQorICAgIGlmIChwQmxvY2sgPT0gKHZvaWQqKXBGaW5kQmxvY2stPkRhdGEoKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHBQcmlvckJsb2NrID0gcEZpbmRCbG9jazsNCisgICAgcEZpbmRCbG9jayA9IHBGaW5kQmxvY2stPk5leHRCbG9jaygpOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KHBGaW5kQmxvY2stPmlCbG9ja1NpemUgIT0gMCAmJiBwRmluZEJsb2NrLT5iVXNlZCAmJg0KKyAgICAgICAgICAgICAgIHBCbG9jayA9PSAodm9pZCopcEZpbmRCbG9jay0+RGF0YSgpKTsNCisgIHBGaW5kQmxvY2stPmJVc2VkID0gRkFMU0U7DQorICBwQ2h1bmstPmlGcmVlU2l6ZSArPSBwRmluZEJsb2NrLT5pQmxvY2tTaXplOw0KKyAgaWYgKHBQcmlvckJsb2NrID09IE5VTEwpIHsNCisgICAgcFByaW9yQmxvY2sgPSBwQ2h1bmstPkZpcnN0QmxvY2soKTsNCisgIH0gZWxzZSBpZiAocFByaW9yQmxvY2stPmJVc2VkKSB7DQorICAgIHBQcmlvckJsb2NrID0gcEZpbmRCbG9jazsNCisgIH0NCisgIHBGaW5kQmxvY2sgPSBwUHJpb3JCbG9jazsNCisgIHJlZ2lzdGVyIHNpemVfdCBzaXplRnJlZSA9IDA7DQorICByZWdpc3RlciBzaXplX3Qgc2l6ZUJsb2NrID0gMDsNCisgIHdoaWxlIChwRmluZEJsb2NrLT5pQmxvY2tTaXplICE9IDAgJiYgIXBGaW5kQmxvY2stPmJVc2VkKSB7DQorICAgIGlmIChwRmluZEJsb2NrICE9IHBQcmlvckJsb2NrKSB7DQorICAgICAgc2l6ZUZyZWUgKz0gc2l6ZW9mKEZYX0RZTkFNSUNTVE9SRUJMT0NLKTsNCisgICAgICBzaXplQmxvY2sgKz0gc2l6ZW9mKEZYX0RZTkFNSUNTVE9SRUJMT0NLKTsNCisgICAgfQ0KKyAgICBzaXplQmxvY2sgKz0gcEZpbmRCbG9jay0+aUJsb2NrU2l6ZTsNCisgICAgcEZpbmRCbG9jayA9IHBGaW5kQmxvY2stPk5leHRCbG9jaygpOw0KKyAgfQ0KKyAgcFByaW9yQmxvY2stPmlCbG9ja1NpemUgPSBzaXplQmxvY2s7DQorICBwQ2h1bmstPmlGcmVlU2l6ZSArPSBzaXplRnJlZTsNCisgIGlmIChwQ2h1bmstPmlGcmVlU2l6ZSA9PSBwQ2h1bmstPmlDaHVua1NpemUpIHsNCisgICAgaWYgKHBQcmlvckNodW5rID09IE5VTEwpIHsNCisgICAgICBtX3BDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIHBDaHVuay0+cE5leHRDaHVuayA9IG1fcENodW5rOw0KLSAgICAgICAgbV9wQ2h1bmsgPSBwQ2h1bms7DQorICAgICAgcFByaW9yQ2h1bmstPnBOZXh0Q2h1bmsgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQogICAgIH0NCi0gICAgcmV0dXJuIHBDaHVuazsNCisgICAgRlhfRnJlZShwQ2h1bmspOw0KKyAgfQ0KIH0NCi12b2lkKiBDRlhfRHluYW1pY1N0b3JlOjpBbGxvYyhzaXplX3Qgc2l6ZSkNCi17DQotICAgIHNpemUgPSBGWF80QllURUFMSUdOKHNpemUpOw0KLSAgICBGWFNZU19hc3NlcnQoc2l6ZSAhPSAwKTsNCi0gICAgcmVnaXN0ZXIgRlhfTFBEWU5BTUlDU1RPUkVDSFVOSyBwQ2h1bmsgPSBtX3BDaHVuazsNCi0gICAgcmVnaXN0ZXIgRlhfTFBEWU5BTUlDU1RPUkVCTE9DSyBwQmxvY2sgPSBOVUxMOw0KLSAgICB3aGlsZSAocENodW5rICE9IE5VTEwpIHsNCi0gICAgICAgIGlmIChwQ2h1bmstPmlGcmVlU2l6ZSA+PSBzaXplKSB7DQotICAgICAgICAgICAgcEJsb2NrID0gcENodW5rLT5GaXJzdEJsb2NrKCk7DQotICAgICAgICAgICAgcmVnaXN0ZXIgRlhfQk9PTCBiRmluZCA9IEZBTFNFOw0KLSAgICAgICAgICAgIHdoaWxlKHBCbG9jay0+aUJsb2NrU2l6ZSAhPSAwKSB7DQotICAgICAgICAgICAgICAgIGlmICghcEJsb2NrLT5iVXNlZCAmJiBwQmxvY2stPmlCbG9ja1NpemUgPj0gc2l6ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcEJsb2NrID0gcEJsb2NrLT5OZXh0QmxvY2soKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGJGaW5kKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHBDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCi0gICAgfQ0KLSAgICBpZiAocENodW5rID09IE5VTEwpIHsNCi0gICAgICAgIHBDaHVuayA9IEFsbG9jQ2h1bmsoRlhfTUFYKG1faURlZkNodW5rU2l6ZSwgc2l6ZSkpOw0KLSAgICAgICAgcEJsb2NrID0gcENodW5rLT5GaXJzdEJsb2NrKCk7DQotICAgIH0NCi0gICAgRlhTWVNfYXNzZXJ0KHBDaHVuayAhPSBOVUxMICYmIHBCbG9jayAhPSBOVUxMKTsNCi0gICAgcmVnaXN0ZXIgc2l6ZV90IG0gPSBzaXplICsgc2l6ZW9mKEZYX0RZTkFNSUNTVE9SRUJMT0NLKTsNCi0gICAgcEJsb2NrLT5iVXNlZCA9IFRSVUU7DQotICAgIGlmIChwQmxvY2stPmlCbG9ja1NpemUgPiBtKSB7DQotICAgICAgICByZWdpc3RlciBzaXplX3QgbiA9IHBCbG9jay0+aUJsb2NrU2l6ZTsNCi0gICAgICAgIHBCbG9jay0+aUJsb2NrU2l6ZSA9IHNpemU7DQotICAgICAgICByZWdpc3RlciBGWF9MUERZTkFNSUNTVE9SRUJMT0NLIHBOZXh0QmxvY2sgPSBwQmxvY2stPk5leHRCbG9jaygpOw0KLSAgICAgICAgcE5leHRCbG9jay0+YlVzZWQgPSBGQUxTRTsNCi0gICAgICAgIHBOZXh0QmxvY2stPmlCbG9ja1NpemUgPSBuIC0gc2l6ZSAtIHNpemVvZihGWF9EWU5BTUlDU1RPUkVCTE9DSyk7DQotICAgICAgICBwQ2h1bmstPmlGcmVlU2l6ZSAtPSBzaXplICsgc2l6ZW9mKEZYX0RZTkFNSUNTVE9SRUJMT0NLKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDaHVuay0+aUZyZWVTaXplIC09IHBCbG9jay0+aUJsb2NrU2l6ZTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcEJsb2NrLT5EYXRhKCk7DQotfQ0KLXZvaWQgQ0ZYX0R5bmFtaWNTdG9yZTo6RnJlZSh2b2lkKiBwQmxvY2spDQotew0KLSAgICBGWFNZU19hc3NlcnQocEJsb2NrICE9IE5VTEwpOw0KLSAgICByZWdpc3RlciBGWF9MUERZTkFNSUNTVE9SRUNIVU5LIHBQcmlvckNodW5rLCBwQ2h1bms7DQotICAgIHBQcmlvckNodW5rID0gTlVMTCwgcENodW5rID0gbV9wQ2h1bms7DQotICAgIHdoaWxlIChwQ2h1bmsgIT0gTlVMTCkgew0KLSAgICAgICAgaWYgKHBCbG9jayA+IHBDaHVuayAmJiBwQmxvY2sgPD0gKCh1aW50OF90KilwQ2h1bmsgKyBzaXplb2YoRlhfRFlOQU1JQ1NUT1JFQ0hVTkspICsgcENodW5rLT5pQ2h1bmtTaXplKSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFByaW9yQ2h1bmsgPSBwQ2h1bmssIHBDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQocENodW5rICE9IE5VTEwpOw0KLSAgICByZWdpc3RlciBGWF9MUERZTkFNSUNTVE9SRUJMT0NLIHBQcmlvckJsb2NrLCBwRmluZEJsb2NrOw0KLSAgICBwUHJpb3JCbG9jayA9IE5VTEwsIHBGaW5kQmxvY2sgPSBwQ2h1bmstPkZpcnN0QmxvY2soKTsNCi0gICAgd2hpbGUocEZpbmRCbG9jay0+aUJsb2NrU2l6ZSAhPSAwKSB7DQotICAgICAgICBpZiAocEJsb2NrID09ICh2b2lkKilwRmluZEJsb2NrLT5EYXRhKCkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIHBQcmlvckJsb2NrID0gcEZpbmRCbG9jazsNCi0gICAgICAgIHBGaW5kQmxvY2sgPSBwRmluZEJsb2NrLT5OZXh0QmxvY2soKTsNCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQocEZpbmRCbG9jay0+aUJsb2NrU2l6ZSAhPSAwICYmIHBGaW5kQmxvY2stPmJVc2VkICYmIHBCbG9jayA9PSAodm9pZCopcEZpbmRCbG9jay0+RGF0YSgpKTsNCi0gICAgcEZpbmRCbG9jay0+YlVzZWQgPSBGQUxTRTsNCi0gICAgcENodW5rLT5pRnJlZVNpemUgKz0gcEZpbmRCbG9jay0+aUJsb2NrU2l6ZTsNCi0gICAgaWYgKHBQcmlvckJsb2NrID09IE5VTEwpIHsNCi0gICAgICAgIHBQcmlvckJsb2NrID0gcENodW5rLT5GaXJzdEJsb2NrKCk7DQotICAgIH0gZWxzZSBpZiAocFByaW9yQmxvY2stPmJVc2VkKSB7DQotICAgICAgICBwUHJpb3JCbG9jayA9IHBGaW5kQmxvY2s7DQotICAgIH0NCi0gICAgcEZpbmRCbG9jayA9IHBQcmlvckJsb2NrOw0KLSAgICByZWdpc3RlciBzaXplX3Qgc2l6ZUZyZWUgPSAwOw0KLSAgICByZWdpc3RlciBzaXplX3Qgc2l6ZUJsb2NrID0gMDsNCi0gICAgd2hpbGUgKHBGaW5kQmxvY2stPmlCbG9ja1NpemUgIT0gMCAmJiAhcEZpbmRCbG9jay0+YlVzZWQpIHsNCi0gICAgICAgIGlmIChwRmluZEJsb2NrICE9IHBQcmlvckJsb2NrKSB7DQotICAgICAgICAgICAgc2l6ZUZyZWUgKz0gc2l6ZW9mKEZYX0RZTkFNSUNTVE9SRUJMT0NLKTsNCi0gICAgICAgICAgICBzaXplQmxvY2sgKz0gc2l6ZW9mKEZYX0RZTkFNSUNTVE9SRUJMT0NLKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHNpemVCbG9jayArPSBwRmluZEJsb2NrLT5pQmxvY2tTaXplOw0KLSAgICAgICAgcEZpbmRCbG9jayA9IHBGaW5kQmxvY2stPk5leHRCbG9jaygpOw0KLSAgICB9DQotICAgIHBQcmlvckJsb2NrLT5pQmxvY2tTaXplID0gc2l6ZUJsb2NrOw0KLSAgICBwQ2h1bmstPmlGcmVlU2l6ZSArPSBzaXplRnJlZTsNCi0gICAgaWYgKHBDaHVuay0+aUZyZWVTaXplID09IHBDaHVuay0+aUNodW5rU2l6ZSkgew0KLSAgICAgICAgaWYgKHBQcmlvckNodW5rID09IE5VTEwpIHsNCi0gICAgICAgICAgICBtX3BDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcFByaW9yQ2h1bmstPnBOZXh0Q2h1bmsgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQotICAgICAgICB9DQotICAgICAgICBGWF9GcmVlKHBDaHVuayk7DQotICAgIH0NCi19DQotc2l6ZV90IENGWF9EeW5hbWljU3RvcmU6OlNldERlZkNodW5rU2l6ZShzaXplX3Qgc2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChzaXplICE9IDApOw0KLSAgICBzaXplX3QgdiA9IG1faURlZkNodW5rU2l6ZTsNCi0gICAgbV9pRGVmQ2h1bmtTaXplID0gc2l6ZTsNCi0gICAgcmV0dXJuIHY7DQorc2l6ZV90IENGWF9EeW5hbWljU3RvcmU6OlNldERlZkNodW5rU2l6ZShzaXplX3Qgc2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQorICBzaXplX3QgdiA9IG1faURlZkNodW5rU2l6ZTsNCisgIG1faURlZkNodW5rU2l6ZSA9IHNpemU7DQorICByZXR1cm4gdjsNCiB9DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfbWVtb3J5LmggYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9tZW1vcnkuaAppbmRleCBlYWJmZWM1Li4yZjQyNzczIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9tZW1vcnkuaAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9tZW1vcnkuaApAQCAtMTAsMTkwICsxMCwxMjYgQEAKIGNsYXNzIENGWF9TdGF0aWNTdG9yZTsNCiBjbGFzcyBDRlhfRml4ZWRTdG9yZTsNCiBjbGFzcyBDRlhfRHluYW1pY1N0b3JlOw0KLWNsYXNzIENGWF9EZWZTdG9yZSA6IHB1YmxpYyBJRlhfTUVNQWxsb2NhdG9yLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9EZWZTdG9yZSgpIHt9DQotICAgIH5DRlhfRGVmU3RvcmUoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkKgkJCUFsbG9jKHNpemVfdCBzaXplKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJRnJlZSh2b2lkICpwQmxvY2spDQotICAgIHsNCi0gICAgICAgIEZYX0ZyZWUocEJsb2NrKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHNpemVfdAkJCUdldEJsb2NrU2l6ZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0RGVmQ2h1bmtTaXplKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgdmlydHVhbCBzaXplX3QJCQlTZXREZWZDaHVua1NpemUoc2l6ZV90IHNpemUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0Q3VycmVudERhdGFTaXplKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCitjbGFzcyBDRlhfRGVmU3RvcmUgOiBwdWJsaWMgSUZYX01FTUFsbG9jYXRvciwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRlhfRGVmU3RvcmUoKSB7fQ0KKyAgfkNGWF9EZWZTdG9yZSgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgdm9pZCogQWxsb2Moc2l6ZV90IHNpemUpIHsgcmV0dXJuIEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOyB9DQorICB2aXJ0dWFsIHZvaWQgRnJlZSh2b2lkKiBwQmxvY2spIHsgRlhfRnJlZShwQmxvY2spOyB9DQorICB2aXJ0dWFsIHNpemVfdCBHZXRCbG9ja1NpemUoKSBjb25zdCB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIHNpemVfdCBHZXREZWZDaHVua1NpemUoKSBjb25zdCB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIHNpemVfdCBTZXREZWZDaHVua1NpemUoc2l6ZV90IHNpemUpIHsgcmV0dXJuIDA7IH0NCisgIHZpcnR1YWwgc2l6ZV90IEdldEN1cnJlbnREYXRhU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0NCiB9Ow0KICNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXw0KICNwcmFnbWEgcGFjayhwdXNoLCAxKQ0KICNlbmRpZg0KIHR5cGVkZWYgc3RydWN0IF9GWF9TVEFUSUNTVE9SRUNIVU5LIHsNCi0gICAgX0ZYX1NUQVRJQ1NUT1JFQ0hVTksqCXBOZXh0Q2h1bms7DQotICAgIHNpemVfdAkJCQkJaUNodW5rU2l6ZTsNCi0gICAgc2l6ZV90CQkJCQlpRnJlZVNpemU7DQotfSBGWF9TVEFUSUNTVE9SRUNIVU5LLCAqIEZYX0xQU1RBVElDU1RPUkVDSFVOSzsNCi10eXBlZGVmIEZYX1NUQVRJQ1NUT1JFQ0hVTksgY29uc3QgKiBGWF9MUENTVEFUSUNTVE9SRUNIVU5LOw0KKyAgX0ZYX1NUQVRJQ1NUT1JFQ0hVTksqIHBOZXh0Q2h1bms7DQorICBzaXplX3QgaUNodW5rU2l6ZTsNCisgIHNpemVfdCBpRnJlZVNpemU7DQorfSBGWF9TVEFUSUNTVE9SRUNIVU5LLCAqRlhfTFBTVEFUSUNTVE9SRUNIVU5LOw0KK3R5cGVkZWYgRlhfU1RBVElDU1RPUkVDSFVOSyBjb25zdCogRlhfTFBDU1RBVElDU1RPUkVDSFVOSzsNCiAjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCiAjcHJhZ21hIHBhY2socG9wKQ0KICNlbmRpZg0KLWNsYXNzIENGWF9TdGF0aWNTdG9yZSA6IHB1YmxpYyBJRlhfTUVNQWxsb2NhdG9yLCBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9TdGF0aWNTdG9yZShzaXplX3QgaURlZkNodW5rU2l6ZSA9IDQwOTYpOw0KLSAgICB+Q0ZYX1N0YXRpY1N0b3JlKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQqCQkJQWxsb2Moc2l6ZV90IHNpemUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlGcmVlKHZvaWQqIHBCbG9jaykge30NCi0gICAgdmlydHVhbCBzaXplX3QJCQlHZXRCbG9ja1NpemUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHNpemVfdAkJCUdldERlZkNodW5rU2l6ZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lEZWZDaHVua1NpemU7DQotICAgIH0NCi0gICAgdmlydHVhbCBzaXplX3QJCQlTZXREZWZDaHVua1NpemUoc2l6ZV90IHNpemUpOw0KLSAgICB2aXJ0dWFsIHNpemVfdAkJCUdldEN1cnJlbnREYXRhU2l6ZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lBbGxvY2F0ZWRTaXplOw0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICBzaXplX3QJCQkJCW1faUFsbG9jYXRlZFNpemU7DQotICAgIHNpemVfdAkJCQkJbV9pRGVmQ2h1bmtTaXplOw0KLSAgICBGWF9MUFNUQVRJQ1NUT1JFQ0hVTksJbV9wQ2h1bms7DQotICAgIEZYX0xQU1RBVElDU1RPUkVDSFVOSwltX3BMYXN0Q2h1bms7DQotICAgIEZYX0xQU1RBVElDU1RPUkVDSFVOSwlBbGxvY0NodW5rKHNpemVfdCBzaXplKTsNCi0gICAgRlhfTFBTVEFUSUNTVE9SRUNIVU5LCUZpbmRDaHVuayhzaXplX3Qgc2l6ZSk7DQorY2xhc3MgQ0ZYX1N0YXRpY1N0b3JlIDogcHVibGljIElGWF9NRU1BbGxvY2F0b3IsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZYX1N0YXRpY1N0b3JlKHNpemVfdCBpRGVmQ2h1bmtTaXplID0gNDA5Nik7DQorICB+Q0ZYX1N0YXRpY1N0b3JlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgdm9pZCogQWxsb2Moc2l6ZV90IHNpemUpOw0KKyAgdmlydHVhbCB2b2lkIEZyZWUodm9pZCogcEJsb2NrKSB7fQ0KKyAgdmlydHVhbCBzaXplX3QgR2V0QmxvY2tTaXplKCkgY29uc3QgeyByZXR1cm4gMDsgfQ0KKyAgdmlydHVhbCBzaXplX3QgR2V0RGVmQ2h1bmtTaXplKCkgY29uc3QgeyByZXR1cm4gbV9pRGVmQ2h1bmtTaXplOyB9DQorICB2aXJ0dWFsIHNpemVfdCBTZXREZWZDaHVua1NpemUoc2l6ZV90IHNpemUpOw0KKyAgdmlydHVhbCBzaXplX3QgR2V0Q3VycmVudERhdGFTaXplKCkgY29uc3QgeyByZXR1cm4gbV9pQWxsb2NhdGVkU2l6ZTsgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBzaXplX3QgbV9pQWxsb2NhdGVkU2l6ZTsNCisgIHNpemVfdCBtX2lEZWZDaHVua1NpemU7DQorICBGWF9MUFNUQVRJQ1NUT1JFQ0hVTksgbV9wQ2h1bms7DQorICBGWF9MUFNUQVRJQ1NUT1JFQ0hVTksgbV9wTGFzdENodW5rOw0KKyAgRlhfTFBTVEFUSUNTVE9SRUNIVU5LIEFsbG9jQ2h1bmsoc2l6ZV90IHNpemUpOw0KKyAgRlhfTFBTVEFUSUNTVE9SRUNIVU5LIEZpbmRDaHVuayhzaXplX3Qgc2l6ZSk7DQogfTsNCiAjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCiAjcHJhZ21hIHBhY2socHVzaCwgMSkNCiAjZW5kaWYNCiB0eXBlZGVmIHN0cnVjdCBfRlhfRklYRURTVE9SRUNIVU5LIHsNCi0gICAgdWludDhfdCoJCQkJRmlyc3RGbGFnKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh1aW50OF90Kil0aGlzICsgc2l6ZW9mKF9GWF9GSVhFRFNUT1JFQ0hVTkspOw0KLSAgICB9DQotICAgIHVpbnQ4X3QqCQkJCUZpcnN0QmxvY2soKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmlyc3RGbGFnKCkgKyBpQ2h1bmtTaXplOw0KLSAgICB9DQotICAgIF9GWF9GSVhFRFNUT1JFQ0hVTksqCXBOZXh0Q2h1bms7DQotICAgIHNpemVfdAkJCQkJaUNodW5rU2l6ZTsNCi0gICAgc2l6ZV90CQkJCQlpRnJlZU51bTsNCi19IEZYX0ZJWEVEU1RPUkVDSFVOSywgKiBGWF9MUEZJWEVEU1RPUkVDSFVOSzsNCi10eXBlZGVmIEZYX0ZJWEVEU1RPUkVDSFVOSyBjb25zdCAqIEZYX0xQQ0ZJWEVEU1RPUkVDSFVOSzsNCisgIHVpbnQ4X3QqIEZpcnN0RmxhZygpIGNvbnN0IHsNCisgICAgcmV0dXJuICh1aW50OF90Kil0aGlzICsgc2l6ZW9mKF9GWF9GSVhFRFNUT1JFQ0hVTkspOw0KKyAgfQ0KKyAgdWludDhfdCogRmlyc3RCbG9jaygpIGNvbnN0IHsgcmV0dXJuIEZpcnN0RmxhZygpICsgaUNodW5rU2l6ZTsgfQ0KKyAgX0ZYX0ZJWEVEU1RPUkVDSFVOSyogcE5leHRDaHVuazsNCisgIHNpemVfdCBpQ2h1bmtTaXplOw0KKyAgc2l6ZV90IGlGcmVlTnVtOw0KK30gRlhfRklYRURTVE9SRUNIVU5LLCAqRlhfTFBGSVhFRFNUT1JFQ0hVTks7DQordHlwZWRlZiBGWF9GSVhFRFNUT1JFQ0hVTksgY29uc3QqIEZYX0xQQ0ZJWEVEU1RPUkVDSFVOSzsNCiAjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCiAjcHJhZ21hIHBhY2socG9wKQ0KICNlbmRpZg0KLWNsYXNzIENGWF9GaXhlZFN0b3JlIDogcHVibGljIElGWF9NRU1BbGxvY2F0b3IsIHB1YmxpYyBDRlhfVGFyZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX0ZpeGVkU3RvcmUoc2l6ZV90IGlCbG9ja1NpemUsIHNpemVfdCBpQmxvY2tOdW1zSW5DaHVuayk7DQotICAgIHZpcnR1YWwgfkNGWF9GaXhlZFN0b3JlKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQqCQkJQWxsb2Moc2l6ZV90IHNpemUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlGcmVlKHZvaWQqIHBCbG9jayk7DQotICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0QmxvY2tTaXplKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faUJsb2NrU2l6ZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHNpemVfdAkJCUdldERlZkNodW5rU2l6ZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lEZWZDaHVua1NpemU7DQotICAgIH0NCi0gICAgdmlydHVhbCBzaXplX3QJCQlTZXREZWZDaHVua1NpemUoc2l6ZV90IGlDaHVua1NpemUpOw0KLSAgICB2aXJ0dWFsIHNpemVfdAkJCUdldEN1cnJlbnREYXRhU2l6ZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICBzaXplX3QJCQkJCW1faUJsb2NrU2l6ZTsNCi0gICAgc2l6ZV90CQkJCQltX2lEZWZDaHVua1NpemU7DQotICAgIEZYX0xQRklYRURTVE9SRUNIVU5LCW1fcENodW5rOw0KLSAgICBGWF9MUEZJWEVEU1RPUkVDSFVOSwlBbGxvY0NodW5rKCk7DQorY2xhc3MgQ0ZYX0ZpeGVkU3RvcmUgOiBwdWJsaWMgSUZYX01FTUFsbG9jYXRvciwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRlhfRml4ZWRTdG9yZShzaXplX3QgaUJsb2NrU2l6ZSwgc2l6ZV90IGlCbG9ja051bXNJbkNodW5rKTsNCisgIHZpcnR1YWwgfkNGWF9GaXhlZFN0b3JlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgdm9pZCogQWxsb2Moc2l6ZV90IHNpemUpOw0KKyAgdmlydHVhbCB2b2lkIEZyZWUodm9pZCogcEJsb2NrKTsNCisgIHZpcnR1YWwgc2l6ZV90IEdldEJsb2NrU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faUJsb2NrU2l6ZTsgfQ0KKyAgdmlydHVhbCBzaXplX3QgR2V0RGVmQ2h1bmtTaXplKCkgY29uc3QgeyByZXR1cm4gbV9pRGVmQ2h1bmtTaXplOyB9DQorICB2aXJ0dWFsIHNpemVfdCBTZXREZWZDaHVua1NpemUoc2l6ZV90IGlDaHVua1NpemUpOw0KKyAgdmlydHVhbCBzaXplX3QgR2V0Q3VycmVudERhdGFTaXplKCkgY29uc3QgeyByZXR1cm4gMDsgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBzaXplX3QgbV9pQmxvY2tTaXplOw0KKyAgc2l6ZV90IG1faURlZkNodW5rU2l6ZTsNCisgIEZYX0xQRklYRURTVE9SRUNIVU5LIG1fcENodW5rOw0KKyAgRlhfTFBGSVhFRFNUT1JFQ0hVTksgQWxsb2NDaHVuaygpOw0KIH07DQogI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfDQogI3ByYWdtYSBwYWNrKHB1c2gsIDEpDQogI2VuZGlmDQogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0RZTkFNSUNTVE9SRUJMT0NLIHsNCi0gICAgX0ZYX0RZTkFNSUNTVE9SRUJMT0NLKglOZXh0QmxvY2soKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKF9GWF9EWU5BTUlDU1RPUkVCTE9DSyopKERhdGEoKSArIGlCbG9ja1NpemUpOw0KLSAgICB9DQotICAgIHVpbnQ4X3QqCQkJCURhdGEoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHVpbnQ4X3QqKXRoaXMgKyBzaXplb2YoX0ZYX0RZTkFNSUNTVE9SRUJMT0NLKTsNCi0gICAgfQ0KLSAgICBzaXplX3QJCWlCbG9ja1NpemU7DQotICAgIEZYX0JPT0wJCWJVc2VkOw0KLX0gRlhfRFlOQU1JQ1NUT1JFQkxPQ0ssICogRlhfTFBEWU5BTUlDU1RPUkVCTE9DSzsNCi10eXBlZGVmIEZYX0RZTkFNSUNTVE9SRUJMT0NLIGNvbnN0ICogRlhfTFBDRFlOQU1JQ1NUT1JFQkxPQ0s7DQorICBfRlhfRFlOQU1JQ1NUT1JFQkxPQ0sqIE5leHRCbG9jaygpIGNvbnN0IHsNCisgICAgcmV0dXJuIChfRlhfRFlOQU1JQ1NUT1JFQkxPQ0sqKShEYXRhKCkgKyBpQmxvY2tTaXplKTsNCisgIH0NCisgIHVpbnQ4X3QqIERhdGEoKSBjb25zdCB7DQorICAgIHJldHVybiAodWludDhfdCopdGhpcyArIHNpemVvZihfRlhfRFlOQU1JQ1NUT1JFQkxPQ0spOw0KKyAgfQ0KKyAgc2l6ZV90IGlCbG9ja1NpemU7DQorICBGWF9CT09MIGJVc2VkOw0KK30gRlhfRFlOQU1JQ1NUT1JFQkxPQ0ssICpGWF9MUERZTkFNSUNTVE9SRUJMT0NLOw0KK3R5cGVkZWYgRlhfRFlOQU1JQ1NUT1JFQkxPQ0sgY29uc3QqIEZYX0xQQ0RZTkFNSUNTVE9SRUJMT0NLOw0KIHR5cGVkZWYgc3RydWN0IF9GWF9EWU5BTUlDU1RPUkVDSFVOSyB7DQotICAgIEZYX0xQRFlOQU1JQ1NUT1JFQkxPQ0sJRmlyc3RCbG9jaygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRlhfTFBEWU5BTUlDU1RPUkVCTE9DSykoKHVpbnQ4X3QqKXRoaXMgKyBzaXplb2YoX0ZYX0RZTkFNSUNTVE9SRUNIVU5LKSk7DQotICAgIH0NCi0gICAgX0ZYX0RZTkFNSUNTVE9SRUNIVU5LKglwTmV4dENodW5rOw0KLSAgICBzaXplX3QJCQkJCWlDaHVua1NpemU7DQotICAgIHNpemVfdAkJCQkJaUZyZWVTaXplOw0KLX0gRlhfRFlOQU1JQ1NUT1JFQ0hVTkssICogRlhfTFBEWU5BTUlDU1RPUkVDSFVOSzsNCi10eXBlZGVmIEZYX0RZTkFNSUNTVE9SRUNIVU5LIGNvbnN0ICogRlhfTFBDRFlOQU1JQ1NUT1JFQ0hVTks7DQorICBGWF9MUERZTkFNSUNTVE9SRUJMT0NLIEZpcnN0QmxvY2soKSBjb25zdCB7DQorICAgIHJldHVybiAoRlhfTFBEWU5BTUlDU1RPUkVCTE9DSykoKHVpbnQ4X3QqKXRoaXMgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfRlhfRFlOQU1JQ1NUT1JFQ0hVTkspKTsNCisgIH0NCisgIF9GWF9EWU5BTUlDU1RPUkVDSFVOSyogcE5leHRDaHVuazsNCisgIHNpemVfdCBpQ2h1bmtTaXplOw0KKyAgc2l6ZV90IGlGcmVlU2l6ZTsNCit9IEZYX0RZTkFNSUNTVE9SRUNIVU5LLCAqRlhfTFBEWU5BTUlDU1RPUkVDSFVOSzsNCit0eXBlZGVmIEZYX0RZTkFNSUNTVE9SRUNIVU5LIGNvbnN0KiBGWF9MUENEWU5BTUlDU1RPUkVDSFVOSzsNCiAjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCiAjcHJhZ21hIHBhY2socG9wKQ0KICNlbmRpZg0KLWNsYXNzIENGWF9EeW5hbWljU3RvcmUgOiBwdWJsaWMgSUZYX01FTUFsbG9jYXRvciwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDRlhfRHluYW1pY1N0b3JlKHNpemVfdCBpRGVmQ2h1bmtTaXplID0gNDA5Nik7DQotICAgIHZpcnR1YWwgfkNGWF9EeW5hbWljU3RvcmUoKTsNCi0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkKgkJQWxsb2Moc2l6ZV90IHNpemUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCUZyZWUodm9pZCogcEJsb2NrKTsNCi0gICAgdmlydHVhbCBzaXplX3QJCUdldEJsb2NrU2l6ZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIHZpcnR1YWwgc2l6ZV90CQlHZXREZWZDaHVua1NpemUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9pRGVmQ2h1bmtTaXplOw0KLSAgICB9DQotICAgIHZpcnR1YWwgc2l6ZV90CQlTZXREZWZDaHVua1NpemUoc2l6ZV90IHNpemUpOw0KLSAgICB2aXJ0dWFsIHNpemVfdAkJR2V0Q3VycmVudERhdGFTaXplKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi1wcm90ZWN0ZWQ6DQotICAgIHNpemVfdAkJCQkJCW1faURlZkNodW5rU2l6ZTsNCi0gICAgRlhfTFBEWU5BTUlDU1RPUkVDSFVOSwkJbV9wQ2h1bms7DQotICAgIEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksJCUFsbG9jQ2h1bmsoc2l6ZV90IHNpemUpOw0KK2NsYXNzIENGWF9EeW5hbWljU3RvcmUgOiBwdWJsaWMgSUZYX01FTUFsbG9jYXRvciwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRlhfRHluYW1pY1N0b3JlKHNpemVfdCBpRGVmQ2h1bmtTaXplID0gNDA5Nik7DQorICB2aXJ0dWFsIH5DRlhfRHluYW1pY1N0b3JlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgdm9pZCogQWxsb2Moc2l6ZV90IHNpemUpOw0KKyAgdmlydHVhbCB2b2lkIEZyZWUodm9pZCogcEJsb2NrKTsNCisgIHZpcnR1YWwgc2l6ZV90IEdldEJsb2NrU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0NCisgIHZpcnR1YWwgc2l6ZV90IEdldERlZkNodW5rU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faURlZkNodW5rU2l6ZTsgfQ0KKyAgdmlydHVhbCBzaXplX3QgU2V0RGVmQ2h1bmtTaXplKHNpemVfdCBzaXplKTsNCisgIHZpcnR1YWwgc2l6ZV90IEdldEN1cnJlbnREYXRhU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgc2l6ZV90IG1faURlZkNodW5rU2l6ZTsNCisgIEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksgbV9wQ2h1bms7DQorICBGWF9MUERZTkFNSUNTVE9SRUNIVU5LIEFsbG9jQ2h1bmsoc2l6ZV90IHNpemUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfc3RyZWFtLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5jcHAKaW5kZXggYTcwZmJiNi4uNjkwOWJiNyAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfc3RyZWFtLmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9zdHJlYW0uY3BwCkBAIC02LDE2MDggKzYsMTU2MCBAQAogDQogI2luY2x1ZGUgIi4uL2ZnYXNfYmFzZS5oIg0KICNpbmNsdWRlICJmeF9zdHJlYW0uaCINCi1JRlhfU3RyZWFtKiBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0oSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9EV09SRCBkd0FjY2VzcywgaW50MzJfdCBpRmlsZVNpemUsIEZYX0JPT0wgYlJlbGVhc2VCdWZmZXJSZWFkICkNCi17DQotICAgIENGWF9TdHJlYW0gKnBTUiA9IEZYX05FVyBDRlhfU3RyZWFtOw0KLSAgICBpZiAoIXBTUikgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQorSUZYX1N0cmVhbSogSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKElGWF9CdWZmZXJSZWFkKiBwQnVmZmVyUmVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZpbGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlQnVmZmVyUmVhZCkgew0KKyAgQ0ZYX1N0cmVhbSogcFNSID0gRlhfTkVXIENGWF9TdHJlYW07DQorICBpZiAoIXBTUikgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmICghcFNSLT5Mb2FkQnVmZmVyUmVhZChwQnVmZmVyUmVhZCwgaUZpbGVTaXplLCBkd0FjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVsZWFzZUJ1ZmZlclJlYWQpKSB7DQorICAgIHBTUi0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQorICAgIElGWF9TdHJlYW0qIHBUUiA9IEZYX05FVyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KKyAgICBpZiAoIXBUUikgew0KKyAgICAgIHBUUi0+UmVsZWFzZSgpOw0KKyAgICAgIHBUUiA9IE5VTEw7DQogICAgIH0NCi0gICAgaWYgKCFwU1ItPkxvYWRCdWZmZXJSZWFkKHBCdWZmZXJSZWFkLCBpRmlsZVNpemUsIGR3QWNjZXNzLCBiUmVsZWFzZUJ1ZmZlclJlYWQpKSB7DQotICAgICAgICBwU1ItPlJlbGVhc2UoKTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQotICAgICAgICBJRlhfU3RyZWFtICpwVFIgPSBGWF9ORVcgQ0ZYX1RleHRTdHJlYW0ocFNSLCBUUlVFKTsNCi0gICAgICAgIGlmICghcFRSKSB7DQotICAgICAgICAgICAgcFRSLT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgcFRSID0gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwVFI7DQotICAgIH0NCi0gICAgcmV0dXJuIHBTUjsNCisgICAgcmV0dXJuIHBUUjsNCisgIH0NCisgIHJldHVybiBwU1I7DQogfQ0KLUlGWF9TdHJlYW0qIElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbShJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCwgRlhfRFdPUkQgZHdBY2Nlc3MpDQotew0KLSAgICBDRlhfU3RyZWFtICpwU1IgPSBGWF9ORVcgQ0ZYX1N0cmVhbTsNCi0gICAgaWYgKHBTUiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCitJRlhfU3RyZWFtKiBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0oSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzKSB7DQorICBDRlhfU3RyZWFtKiBwU1IgPSBGWF9ORVcgQ0ZYX1N0cmVhbTsNCisgIGlmIChwU1IgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmICghcFNSLT5Mb2FkRmlsZVJlYWQocEZpbGVSZWFkLCBkd0FjY2VzcykpIHsNCisgICAgcFNSLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpIHsNCisgICAgSUZYX1N0cmVhbSogcFRSID0gRlhfTkVXIENGWF9UZXh0U3RyZWFtKHBTUiwgVFJVRSk7DQorICAgIGlmIChwVFIgPT0gTlVMTCkgew0KKyAgICAgIHBTUi0+UmVsZWFzZSgpOw0KKyAgICAgIHJldHVybiBOVUxMOw0KICAgICB9DQotICAgIGlmICghcFNSLT5Mb2FkRmlsZVJlYWQocEZpbGVSZWFkLCBkd0FjY2VzcykpIHsNCi0gICAgICAgIHBTUi0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpIHsNCi0gICAgICAgIElGWF9TdHJlYW0gKnBUUiA9IEZYX05FVyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KLSAgICAgICAgaWYgKHBUUiA9PSBOVUxMKSB7DQotICAgICAgICAgICAgcFNSLT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcFRSOw0KLSAgICB9DQotICAgIHJldHVybiBwU1I7DQorICAgIHJldHVybiBwVFI7DQorICB9DQorICByZXR1cm4gcFNSOw0KIH0NCi1JRlhfU3RyZWFtKiBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0oSUZYX0ZpbGVXcml0ZSAqcEZpbGVXcml0ZSwgRlhfRFdPUkQgZHdBY2Nlc3MpDQotew0KLSAgICBDRlhfU3RyZWFtICpwU1IgPSBGWF9ORVcgQ0ZYX1N0cmVhbTsNCi0gICAgaWYgKHBTUiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCitJRlhfU3RyZWFtKiBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0oSUZYX0ZpbGVXcml0ZSogcEZpbGVXcml0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MpIHsNCisgIENGWF9TdHJlYW0qIHBTUiA9IEZYX05FVyBDRlhfU3RyZWFtOw0KKyAgaWYgKHBTUiA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKCFwU1ItPkxvYWRGaWxlV3JpdGUocEZpbGVXcml0ZSwgZHdBY2Nlc3MpKSB7DQorICAgIHBTUi0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQorICAgIElGWF9TdHJlYW0qIHBUUiA9IEZYX05FVyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KKyAgICBpZiAocFRSID09IE5VTEwpIHsNCisgICAgICBwU1ItPlJlbGVhc2UoKTsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICBpZiAoIXBTUi0+TG9hZEZpbGVXcml0ZShwRmlsZVdyaXRlLCBkd0FjY2VzcykpIHsNCi0gICAgICAgIHBTUi0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpIHsNCi0gICAgICAgIElGWF9TdHJlYW0gKnBUUiA9IEZYX05FVyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KLSAgICAgICAgaWYgKHBUUiA9PSBOVUxMKSB7DQotICAgICAgICAgICAgcFNSLT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcFRSOw0KLSAgICB9DQotICAgIHJldHVybiBwU1I7DQorICAgIHJldHVybiBwVFI7DQorICB9DQorICByZXR1cm4gcFNSOw0KIH0NCi1JRlhfU3RyZWFtKiBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0oY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lLCBGWF9EV09SRCBkd0FjY2VzcykNCi17DQotICAgIENGWF9TdHJlYW0gKnBTUiA9IEZYX05FVyBDRlhfU3RyZWFtOw0KLSAgICBpZiAocFNSID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KK0lGWF9TdHJlYW0qIElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbShjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzKSB7DQorICBDRlhfU3RyZWFtKiBwU1IgPSBGWF9ORVcgQ0ZYX1N0cmVhbTsNCisgIGlmIChwU1IgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmICghcFNSLT5Mb2FkRmlsZShwc3pGaWxlTmFtZSwgZHdBY2Nlc3MpKSB7DQorICAgIHBTUi0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQorICAgIElGWF9TdHJlYW0qIHBUUiA9IEZYX05FVyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KKyAgICBpZiAocFRSID09IE5VTEwpIHsNCisgICAgICBwU1ItPlJlbGVhc2UoKTsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICBpZiAoIXBTUi0+TG9hZEZpbGUocHN6RmlsZU5hbWUsIGR3QWNjZXNzKSkgew0KLSAgICAgICAgcFNSLT5SZWxlYXNlKCk7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVGV4dCkgew0KLSAgICAgICAgSUZYX1N0cmVhbSAqcFRSID0gRlhfTkVXIENGWF9UZXh0U3RyZWFtKHBTUiwgVFJVRSk7DQotICAgICAgICBpZiAocFRSID09IE5VTEwpIHsNCi0gICAgICAgICAgICBwU1ItPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwVFI7DQotICAgIH0NCi0gICAgcmV0dXJuIHBTUjsNCisgICAgcmV0dXJuIHBUUjsNCisgIH0NCisgIHJldHVybiBwU1I7DQogfQ0KLUlGWF9TdHJlYW0qIElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbSh1aW50OF90KiBwRGF0YSwgaW50MzJfdCBsZW5ndGgsIEZYX0RXT1JEIGR3QWNjZXNzKQ0KLXsNCi0gICAgQ0ZYX1N0cmVhbSAqcFNSID0gRlhfTkVXIENGWF9TdHJlYW07DQotICAgIGlmIChwU1IgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQorSUZYX1N0cmVhbSogSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKHVpbnQ4X3QqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MpIHsNCisgIENGWF9TdHJlYW0qIHBTUiA9IEZYX05FVyBDRlhfU3RyZWFtOw0KKyAgaWYgKHBTUiA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKCFwU1ItPkxvYWRCdWZmZXIocERhdGEsIGxlbmd0aCwgZHdBY2Nlc3MpKSB7DQorICAgIHBTUi0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQorICAgIElGWF9TdHJlYW0qIHBUUiA9IEZYX05FVyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KKyAgICBpZiAocFRSID09IE5VTEwpIHsNCisgICAgICBwU1ItPlJlbGVhc2UoKTsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICBpZiAoIXBTUi0+TG9hZEJ1ZmZlcihwRGF0YSwgbGVuZ3RoLCBkd0FjY2VzcykpIHsNCi0gICAgICAgIHBTUi0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpIHsNCi0gICAgICAgIElGWF9TdHJlYW0gKnBUUiA9IEZYX05FVyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KLSAgICAgICAgaWYgKHBUUiA9PSBOVUxMKSB7DQotICAgICAgICAgICAgcFNSLT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcFRSOw0KLSAgICB9DQotICAgIHJldHVybiBwU1I7DQorICAgIHJldHVybiBwVFI7DQorICB9DQorICByZXR1cm4gcFNSOw0KIH0NCi1DRlhfU3RyZWFtSW1wOjpDRlhfU3RyZWFtSW1wKCkNCi0gICAgOiBDRlhfVGhyZWFkTG9jaygpDQotICAgICwgbV9kd0FjY2VzcygwKQ0KLXsNCi19DQorQ0ZYX1N0cmVhbUltcDo6Q0ZYX1N0cmVhbUltcCgpIDogQ0ZYX1RocmVhZExvY2soKSwgbV9kd0FjY2VzcygwKSB7fQ0KIENGWF9GaWxlU3RyZWFtSW1wOjpDRlhfRmlsZVN0cmVhbUltcCgpDQotICAgIDogQ0ZYX1N0cmVhbUltcCgpDQotICAgICwgbV9oRmlsZShOVUxMKQ0KLSAgICAsIG1faUxlbmd0aCgwKQ0KLXsNCisgICAgOiBDRlhfU3RyZWFtSW1wKCksIG1faEZpbGUoTlVMTCksIG1faUxlbmd0aCgwKSB7fQ0KK0NGWF9GaWxlU3RyZWFtSW1wOjp+Q0ZYX0ZpbGVTdHJlYW1JbXAoKSB7DQorICBpZiAobV9oRmlsZSAhPSBOVUxMKSB7DQorICAgIEZYU1lTX2ZjbG9zZShtX2hGaWxlKTsNCisgIH0NCiB9DQotQ0ZYX0ZpbGVTdHJlYW1JbXA6On5DRlhfRmlsZVN0cmVhbUltcCgpDQotew0KLSAgICBpZiAobV9oRmlsZSAhPSBOVUxMKSB7DQotICAgICAgICBGWFNZU19mY2xvc2UobV9oRmlsZSk7DQorRlhfQk9PTCBDRlhfRmlsZVN0cmVhbUltcDo6TG9hZEZpbGUoY29uc3QgRlhfV0NIQVIqIHBzelNyY0ZpbGVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzKSB7DQorICBGWFNZU19hc3NlcnQobV9oRmlsZSA9PSBOVUxMKTsNCisgIEZYU1lTX2Fzc2VydChwc3pTcmNGaWxlTmFtZSAhPSBOVUxMICYmIEZYU1lTX3djc2xlbihwc3pTcmNGaWxlTmFtZSkgPiAwKTsNCisjaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBcDQorICAgIF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NNb2RlOw0KKyAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSB7DQorICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpIHsNCisgICAgICB3c01vZGUgPSBMImErYiI7DQorICAgIH0gZWxzZSBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVHJ1bmNhdGUpIHsNCisgICAgICB3c01vZGUgPSBMIncrYiI7DQorICAgIH0gZWxzZSB7DQorICAgICAgd3NNb2RlID0gTCJyK2IiOw0KICAgICB9DQotfQ0KLUZYX0JPT0wgQ0ZYX0ZpbGVTdHJlYW1JbXA6OkxvYWRGaWxlKGNvbnN0IEZYX1dDSEFSKiBwc3pTcmNGaWxlTmFtZSwgRlhfRFdPUkQgZHdBY2Nlc3MpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9oRmlsZSA9PSBOVUxMKTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBzelNyY0ZpbGVOYW1lICE9IE5VTEwgJiYgRlhTWVNfd2NzbGVuKHBzelNyY0ZpbGVOYW1lKSA+IDApOw0KLSNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c01vZGU7DQorICB9IGVsc2Ugew0KKyAgICB3c01vZGUgPSBMInJiIjsNCisgIH0NCisjaWZkZWYgX0ZYX1dJTkFQSV9QQVJUSVRJT05fQVBQXw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NTcmNGaWxlTmFtZShwc3pTcmNGaWxlTmFtZSk7DQorICBfd2ZvcGVuX3MoJm1faEZpbGUsIHdzU3JjRmlsZU5hbWUsIHdzTW9kZSk7DQorI2Vsc2UNCisgIG1faEZpbGUgPSBGWFNZU193Zm9wZW4ocHN6U3JjRmlsZU5hbWUsIHdzTW9kZSk7DQorI2VuZGlmDQorICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQogICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgew0KLSAgICAgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCkgew0KLSAgICAgICAgICAgIHdzTW9kZSA9IEwiYStiIjsNCi0gICAgICAgIH0gZWxzZSBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVHJ1bmNhdGUpIHsNCi0gICAgICAgICAgICB3c01vZGUgPSBMIncrYiI7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdzTW9kZSA9IEwicitiIjsNCisgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfQ3JlYXRlKSB7DQorI2lmZGVmIF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3JjRmlsZU5hbWUocHN6U3JjRmlsZU5hbWUpOw0KKyAgICAgICAgX3dmb3Blbl9zKCZtX2hGaWxlLCB3c1NyY0ZpbGVOYW1lLCBMIncrYiIpOw0KKyNlbHNlDQorICAgICAgICBtX2hGaWxlID0gRlhTWVNfd2ZvcGVuKHBzelNyY0ZpbGVOYW1lLCBMIncrYiIpOw0KKyNlbmRpZg0KKyAgICAgIH0NCisgICAgICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQorI2lmZGVmIF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3JjRmlsZU5hbWUocHN6U3JjRmlsZU5hbWUpOw0KKyAgICAgICAgX3dmb3Blbl9zKCZtX2hGaWxlLCB3c1NyY0ZpbGVOYW1lLCBMInIrYiIpOw0KKyNlbHNlDQorICAgICAgICBtX2hGaWxlID0gRlhTWVNfd2ZvcGVuKHBzelNyY0ZpbGVOYW1lLCBMInIrYiIpOw0KKyNlbmRpZg0KKyAgICAgICAgaWYgKG1faEZpbGUgPT0gTlVMTCkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQogICAgICAgICB9DQorICAgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVHJ1bmNhdGUpIHsNCisgICAgICAgICAgRlhfZnNldHNpemUobV9oRmlsZSwgMCk7DQorICAgICAgICB9DQorICAgICAgfQ0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgd3NNb2RlID0gTCJyYiI7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotI2lmZGVmIF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NTcmNGaWxlTmFtZShwc3pTcmNGaWxlTmFtZSk7DQotICAgIF93Zm9wZW5fcygmbV9oRmlsZSwgd3NTcmNGaWxlTmFtZSwgd3NNb2RlKTsNCisgIH0NCiAjZWxzZQ0KLSAgICBtX2hGaWxlID0gRlhTWVNfd2ZvcGVuKHBzelNyY0ZpbGVOYW1lLCB3c01vZGUpOw0KLSNlbmRpZg0KLSAgICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQotICAgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpIHsNCi0gICAgICAgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfQ3JlYXRlKSB7DQotI2lmZGVmIF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8NCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTcmNGaWxlTmFtZShwc3pTcmNGaWxlTmFtZSk7DQotICAgICAgICAgICAgICAgIF93Zm9wZW5fcygmbV9oRmlsZSwgd3NTcmNGaWxlTmFtZSwgTCJ3K2IiKTsNCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICBtX2hGaWxlID0gRlhTWVNfd2ZvcGVuKHBzelNyY0ZpbGVOYW1lLCBMIncrYiIpOw0KLSNlbmRpZg0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQotI2lmZGVmIF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8NCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTcmNGaWxlTmFtZShwc3pTcmNGaWxlTmFtZSk7DQotICAgICAgICAgICAgICAgIF93Zm9wZW5fcygmbV9oRmlsZSwgd3NTcmNGaWxlTmFtZSwgTCJyK2IiKTsNCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICBtX2hGaWxlID0gRlhTWVNfd2ZvcGVuKHBzelNyY0ZpbGVOYW1lLCBMInIrYiIpOw0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9mc2V0c2l6ZShtX2hGaWxlLCAwKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgd3NNb2RlOw0KKyAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSB7DQorICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpIHsNCisgICAgICB3c01vZGUgPSAiYStiIjsNCisgICAgfSBlbHNlIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UcnVuY2F0ZSkgew0KKyAgICAgIHdzTW9kZSA9ICJ3K2IiOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdzTW9kZSA9ICJyK2IiOw0KICAgICB9DQotI2Vsc2UNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgd3NNb2RlOw0KKyAgfSBlbHNlIHsNCisgICAgd3NNb2RlID0gInJiIjsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIHN6RmlsZU5hbWUgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocHN6U3JjRmlsZU5hbWUpOw0KKyAgbV9oRmlsZSA9IEZYU1lTX2ZvcGVuKHN6RmlsZU5hbWUsIHdzTW9kZSk7DQorICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQogICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgew0KLSAgICAgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCkgew0KLSAgICAgICAgICAgIHdzTW9kZSA9ICJhK2IiOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UcnVuY2F0ZSkgew0KLSAgICAgICAgICAgIHdzTW9kZSA9ICJ3K2IiOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB3c01vZGUgPSAicitiIjsNCisgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfQ3JlYXRlKSB7DQorICAgICAgICBtX2hGaWxlID0gRlhTWVNfZm9wZW4oc3pGaWxlTmFtZSwgIncrYiIpOw0KKyAgICAgIH0NCisgICAgICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQorICAgICAgICBtX2hGaWxlID0gRlhTWVNfZm9wZW4oc3pGaWxlTmFtZSwgInIrYiIpOw0KKyAgICAgICAgaWYgKG1faEZpbGUgPT0gTlVMTCkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQogICAgICAgICB9DQorICAgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVHJ1bmNhdGUpIHsNCisgICAgICAgICAgRlhfZnNldHNpemUobV9oRmlsZSwgMCk7DQorICAgICAgICB9DQorICAgICAgfQ0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgd3NNb2RlID0gInJiIjsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc3pGaWxlTmFtZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwc3pTcmNGaWxlTmFtZSk7DQotICAgIG1faEZpbGUgPSBGWFNZU19mb3BlbihzekZpbGVOYW1lLCB3c01vZGUpOw0KLSAgICBpZiAobV9oRmlsZSA9PSBOVUxMKSB7DQotICAgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpIHsNCi0gICAgICAgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfQ3JlYXRlKSB7DQotICAgICAgICAgICAgICAgIG1faEZpbGUgPSBGWFNZU19mb3BlbihzekZpbGVOYW1lLCAidytiIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChtX2hGaWxlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgbV9oRmlsZSA9IEZYU1lTX2ZvcGVuKHN6RmlsZU5hbWUsICJyK2IiKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1faEZpbGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UcnVuY2F0ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgRlhfZnNldHNpemUobV9oRmlsZSwgMCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KKyAgfQ0KICNlbmRpZg0KLSAgICBtX2R3QWNjZXNzID0gZHdBY2Nlc3M7DQotICAgIGlmICgoZHdBY2Nlc3MgJiAoRlhfU1RSRUFNQUNDRVNTX1dyaXRlIHwgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlKSkgPT0gKEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSB8IEZYX1NUUkVBTUFDQ0VTU19UcnVuY2F0ZSkpIHsNCi0gICAgICAgIG1faUxlbmd0aCA9IDA7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX2lMZW5ndGggPSBGWF9maWxlbGVuZ3RoKG1faEZpbGUpOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1pbnQzMl90IENGWF9GaWxlU3RyZWFtSW1wOjpHZXRMZW5ndGgoKSBjb25zdA0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCk7DQotICAgIHJldHVybiBtX2lMZW5ndGg7DQotfQ0KLWludDMyX3QgQ0ZYX0ZpbGVTdHJlYW1JbXA6OlNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCk7DQotICAgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIGlPZmZzZXQsIGVTZWVrKTsNCi0gICAgcmV0dXJuIEZYU1lTX2Z0ZWxsKG1faEZpbGUpOw0KLX0NCi1pbnQzMl90IENGWF9GaWxlU3RyZWFtSW1wOjpHZXRQb3NpdGlvbigpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMKTsNCi0gICAgcmV0dXJuIEZYU1lTX2Z0ZWxsKG1faEZpbGUpOw0KLX0NCi1GWF9CT09MIENGWF9GaWxlU3RyZWFtSW1wOjpJc0VPRigpIGNvbnN0DQotew0KLSAgICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMKTsNCi0gICAgcmV0dXJuIEZYU1lTX2Z0ZWxsKG1faEZpbGUpID49IG1faUxlbmd0aDsNCi19DQotaW50MzJfdCBDRlhfRmlsZVN0cmVhbUltcDo6UmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwpOw0KLSAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQotICAgIHJldHVybiBGWFNZU19mcmVhZChwQnVmZmVyLCAxLCBpQnVmZmVyU2l6ZSwgbV9oRmlsZSk7DQotfQ0KLWludDMyX3QgQ0ZYX0ZpbGVTdHJlYW1JbXA6OlJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaU1heExlbmd0aCwgRlhfQk9PTCAmYkVPUykNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwpOw0KLSAgICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlNYXhMZW5ndGggPiAwKTsNCi0gICAgaWYgKG1faUxlbmd0aCA8PSAwKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlQb3NpdGlvbiA9IEZYU1lTX2Z0ZWxsKG1faEZpbGUpOw0KLSAgICBpbnQzMl90IGlMZW4gPSBGWF9NSU4oKG1faUxlbmd0aCAtIGlQb3NpdGlvbikgLyAyLCBpTWF4TGVuZ3RoKTsNCi0gICAgaWYgKGlMZW4gPD0gMCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaUxlbiA9IEZYU1lTX2ZyZWFkKHBTdHIsIDIsIGlMZW4sIG1faEZpbGUpOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIHdoaWxlICgqcFN0ciAhPSBMJ1wwJyAmJiBpQ291bnQgPCBpTGVuKSB7DQotICAgICAgICBwU3RyICsrLCBpQ291bnQgKys7DQotICAgIH0NCi0gICAgaVBvc2l0aW9uICs9IGlDb3VudCAqIDI7DQotICAgIGlmIChGWFNZU19mdGVsbChtX2hGaWxlKSAhPSBpUG9zaXRpb24pIHsNCi0gICAgICAgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIGlQb3NpdGlvbiwgMCk7DQotICAgIH0NCi0gICAgYkVPUyA9IChpUG9zaXRpb24gPj0gbV9pTGVuZ3RoKTsNCi0gICAgcmV0dXJuIGlDb3VudDsNCi19DQotaW50MzJfdCBDRlhfRmlsZVN0cmVhbUltcDo6V3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMICYmIChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSAhPSAwKTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmZmVyU2l6ZSA+IDApOw0KLSAgICBpbnQzMl90IGlSZXQgPSBGWFNZU19md3JpdGUocEJ1ZmZlciwgMSwgaUJ1ZmZlclNpemUsIG1faEZpbGUpOw0KLSAgICBpZiAoaVJldCAhPSAwKSB7DQotICAgICAgICBpbnQzMl90IGlQb3MgPSBGWFNZU19mdGVsbChtX2hGaWxlKTsNCi0gICAgICAgIGlmIChpUG9zID4gbV9pTGVuZ3RoKSB7DQotICAgICAgICAgICAgbV9pTGVuZ3RoID0gaVBvczsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaVJldDsNCi19DQotaW50MzJfdCBDRlhfRmlsZVN0cmVhbUltcDo6V3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwgJiYgKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KLSAgICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCi0gICAgaW50MzJfdCBpUmV0ID0gRlhTWVNfZndyaXRlKHBTdHIsIDIsIGlMZW5ndGgsIG1faEZpbGUpOw0KLSAgICBpZiAoaVJldCAhPSAwKSB7DQotICAgICAgICBpbnQzMl90IGlQb3MgPSBGWFNZU19mdGVsbChtX2hGaWxlKTsNCi0gICAgICAgIGlmIChpUG9zID4gbV9pTGVuZ3RoKSB7DQotICAgICAgICAgICAgbV9pTGVuZ3RoID0gaVBvczsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaVJldDsNCi19DQotdm9pZCBDRlhfRmlsZVN0cmVhbUltcDo6Rmx1c2goKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCAmJiAobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7DQotICAgIEZYU1lTX2ZmbHVzaChtX2hGaWxlKTsNCi19DQotRlhfQk9PTCBDRlhfRmlsZVN0cmVhbUltcDo6U2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwgJiYgKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KLSAgICBGWF9CT09MIGJSZXQgPSBGWF9mc2V0c2l6ZShtX2hGaWxlLCBpTGVuZ3RoKTsNCisgIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCisgIGlmICgoZHdBY2Nlc3MgJiAoRlhfU1RSRUFNQUNDRVNTX1dyaXRlIHwgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlKSkgPT0NCisgICAgICAoRlhfU1RSRUFNQUNDRVNTX1dyaXRlIHwgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlKSkgew0KKyAgICBtX2lMZW5ndGggPSAwOw0KKyAgfSBlbHNlIHsNCiAgICAgbV9pTGVuZ3RoID0gRlhfZmlsZWxlbmd0aChtX2hGaWxlKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQoraW50MzJfdCBDRlhfRmlsZVN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3Qgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCk7DQorICByZXR1cm4gbV9pTGVuZ3RoOw0KK30NCitpbnQzMl90IENGWF9GaWxlU3RyZWFtSW1wOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCk7DQorICBGWFNZU19mc2VlayhtX2hGaWxlLCBpT2Zmc2V0LCBlU2Vlayk7DQorICByZXR1cm4gRlhTWVNfZnRlbGwobV9oRmlsZSk7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVTdHJlYW1JbXA6OkdldFBvc2l0aW9uKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCk7DQorICByZXR1cm4gRlhTWVNfZnRlbGwobV9oRmlsZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0ZpbGVTdHJlYW1JbXA6OklzRU9GKCkgY29uc3Qgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCk7DQorICByZXR1cm4gRlhTWVNfZnRlbGwobV9oRmlsZSkgPj0gbV9pTGVuZ3RoOw0KK30NCitpbnQzMl90IENGWF9GaWxlU3RyZWFtSW1wOjpSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSB7DQorICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMKTsNCisgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwKTsNCisgIHJldHVybiBGWFNZU19mcmVhZChwQnVmZmVyLCAxLCBpQnVmZmVyU2l6ZSwgbV9oRmlsZSk7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVTdHJlYW1JbXA6OlJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TKSB7DQorICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMKTsNCisgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaU1heExlbmd0aCA+IDApOw0KKyAgaWYgKG1faUxlbmd0aCA8PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCBpUG9zaXRpb24gPSBGWFNZU19mdGVsbChtX2hGaWxlKTsNCisgIGludDMyX3QgaUxlbiA9IEZYX01JTigobV9pTGVuZ3RoIC0gaVBvc2l0aW9uKSAvIDIsIGlNYXhMZW5ndGgpOw0KKyAgaWYgKGlMZW4gPD0gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlMZW4gPSBGWFNZU19mcmVhZChwU3RyLCAyLCBpTGVuLCBtX2hGaWxlKTsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIHdoaWxlICgqcFN0ciAhPSBMJ1wwJyAmJiBpQ291bnQgPCBpTGVuKSB7DQorICAgIHBTdHIrKywgaUNvdW50Kys7DQorICB9DQorICBpUG9zaXRpb24gKz0gaUNvdW50ICogMjsNCisgIGlmIChGWFNZU19mdGVsbChtX2hGaWxlKSAhPSBpUG9zaXRpb24pIHsNCisgICAgRlhTWVNfZnNlZWsobV9oRmlsZSwgaVBvc2l0aW9uLCAwKTsNCisgIH0NCisgIGJFT1MgPSAoaVBvc2l0aW9uID49IG1faUxlbmd0aCk7DQorICByZXR1cm4gaUNvdW50Ow0KK30NCitpbnQzMl90IENGWF9GaWxlU3RyZWFtSW1wOjpXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCAmJiAobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7DQorICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQorICBpbnQzMl90IGlSZXQgPSBGWFNZU19md3JpdGUocEJ1ZmZlciwgMSwgaUJ1ZmZlclNpemUsIG1faEZpbGUpOw0KKyAgaWYgKGlSZXQgIT0gMCkgew0KKyAgICBpbnQzMl90IGlQb3MgPSBGWFNZU19mdGVsbChtX2hGaWxlKTsNCisgICAgaWYgKGlQb3MgPiBtX2lMZW5ndGgpIHsNCisgICAgICBtX2lMZW5ndGggPSBpUG9zOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gaVJldDsNCit9DQoraW50MzJfdCBDRlhfRmlsZVN0cmVhbUltcDo6V3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCAmJiAobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIGludDMyX3QgaVJldCA9IEZYU1lTX2Z3cml0ZShwU3RyLCAyLCBpTGVuZ3RoLCBtX2hGaWxlKTsNCisgIGlmIChpUmV0ICE9IDApIHsNCisgICAgaW50MzJfdCBpUG9zID0gRlhTWVNfZnRlbGwobV9oRmlsZSk7DQorICAgIGlmIChpUG9zID4gbV9pTGVuZ3RoKSB7DQorICAgICAgbV9pTGVuZ3RoID0gaVBvczsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlSZXQ7DQorfQ0KK3ZvaWQgQ0ZYX0ZpbGVTdHJlYW1JbXA6OkZsdXNoKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZpbGUgIT0gTlVMTCAmJiAobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7DQorICBGWFNZU19mZmx1c2gobV9oRmlsZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0ZpbGVTdHJlYW1JbXA6OlNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwgJiYgKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KKyAgRlhfQk9PTCBiUmV0ID0gRlhfZnNldHNpemUobV9oRmlsZSwgaUxlbmd0aCk7DQorICBtX2lMZW5ndGggPSBGWF9maWxlbGVuZ3RoKG1faEZpbGUpOw0KKyAgcmV0dXJuIGJSZXQ7DQogfQ0KIENGWF9GaWxlUmVhZFN0cmVhbUltcDo6Q0ZYX0ZpbGVSZWFkU3RyZWFtSW1wKCkNCi0gICAgOiBtX3BGaWxlUmVhZChOVUxMKQ0KLSAgICAsIG1faVBvc2l0aW9uKDApDQotICAgICwgbV9pTGVuZ3RoKDApDQotew0KKyAgICA6IG1fcEZpbGVSZWFkKE5VTEwpLCBtX2lQb3NpdGlvbigwKSwgbV9pTGVuZ3RoKDApIHt9DQorRlhfQk9PTCBDRlhfRmlsZVJlYWRTdHJlYW1JbXA6OkxvYWRGaWxlUmVhZChJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzKSB7DQorICBGWFNZU19hc3NlcnQobV9wRmlsZVJlYWQgPT0gTlVMTCAmJiBwRmlsZVJlYWQgIT0gTlVMTCk7DQorICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9wRmlsZVJlYWQgPSBwRmlsZVJlYWQ7DQorICBtX2lMZW5ndGggPSBtX3BGaWxlUmVhZC0+R2V0U2l6ZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wOjpMb2FkRmlsZVJlYWQoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQsIEZYX0RXT1JEIGR3QWNjZXNzKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEZpbGVSZWFkID09IE5VTEwgJiYgcEZpbGVSZWFkICE9IE5VTEwpOw0KLSAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX3BGaWxlUmVhZCA9IHBGaWxlUmVhZDsNCi0gICAgbV9pTGVuZ3RoID0gbV9wRmlsZVJlYWQtPkdldFNpemUoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQoraW50MzJfdCBDRlhfRmlsZVJlYWRTdHJlYW1JbXA6OkdldExlbmd0aCgpIGNvbnN0IHsNCisgIHJldHVybiBtX2lMZW5ndGg7DQogfQ0KLWludDMyX3QgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wOjpHZXRMZW5ndGgoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1faUxlbmd0aDsNCitpbnQzMl90IENGWF9GaWxlUmVhZFN0cmVhbUltcDo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpIHsNCisgIHN3aXRjaCAoZVNlZWspIHsNCisgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0JlZ2luOg0KKyAgICAgIG1faVBvc2l0aW9uID0gaU9mZnNldDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0N1cnJlbnQ6DQorICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0VuZDoNCisgICAgICBtX2lQb3NpdGlvbiA9IG1faUxlbmd0aCArIGlPZmZzZXQ7DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAobV9pUG9zaXRpb24gPCAwKSB7DQorICAgIG1faVBvc2l0aW9uID0gMDsNCisgIH0gZWxzZSBpZiAobV9pUG9zaXRpb24gPj0gbV9pTGVuZ3RoKSB7DQorICAgIG1faVBvc2l0aW9uID0gbV9pTGVuZ3RoOw0KKyAgfQ0KKyAgcmV0dXJuIG1faVBvc2l0aW9uOw0KIH0NCi1pbnQzMl90IENGWF9GaWxlUmVhZFN0cmVhbUltcDo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpDQotew0KLSAgICBzd2l0Y2ggKGVTZWVrKSB7DQotICAgICAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQmVnaW46DQotICAgICAgICAgICAgbV9pUG9zaXRpb24gPSBpT2Zmc2V0Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0N1cnJlbnQ6DQotICAgICAgICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfU1RSRUFNU0VFS19FbmQ6DQotICAgICAgICAgICAgbV9pUG9zaXRpb24gPSBtX2lMZW5ndGggKyBpT2Zmc2V0Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGlmIChtX2lQb3NpdGlvbiA8IDApIHsNCi0gICAgICAgIG1faVBvc2l0aW9uID0gMDsNCi0gICAgfSBlbHNlIGlmIChtX2lQb3NpdGlvbiA+PSBtX2lMZW5ndGgpIHsNCi0gICAgICAgIG1faVBvc2l0aW9uID0gbV9pTGVuZ3RoOw0KLSAgICB9DQotICAgIHJldHVybiBtX2lQb3NpdGlvbjsNCitGWF9CT09MIENGWF9GaWxlUmVhZFN0cmVhbUltcDo6SXNFT0YoKSBjb25zdCB7DQorICByZXR1cm4gbV9pUG9zaXRpb24gPj0gbV9pTGVuZ3RoOw0KIH0NCi1GWF9CT09MIENGWF9GaWxlUmVhZFN0cmVhbUltcDo6SXNFT0YoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1faVBvc2l0aW9uID49IG1faUxlbmd0aDsNCitpbnQzMl90IENGWF9GaWxlUmVhZFN0cmVhbUltcDo6UmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZpbGVSZWFkICE9IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmZmVyU2l6ZSA+IDApOw0KKyAgaWYgKGlCdWZmZXJTaXplID4gbV9pTGVuZ3RoIC0gbV9pUG9zaXRpb24pIHsNCisgICAgaUJ1ZmZlclNpemUgPSBtX2lMZW5ndGggLSBtX2lQb3NpdGlvbjsNCisgIH0NCisgIGlmIChtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKHBCdWZmZXIsIG1faVBvc2l0aW9uLCBpQnVmZmVyU2l6ZSkpIHsNCisgICAgbV9pUG9zaXRpb24gKz0gaUJ1ZmZlclNpemU7DQorICAgIHJldHVybiBpQnVmZmVyU2l6ZTsNCisgIH0NCisgIHJldHVybiAwOw0KIH0NCi1pbnQzMl90IENGWF9GaWxlUmVhZFN0cmVhbUltcDo6UmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BGaWxlUmVhZCAhPSBOVUxMKTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmZmVyU2l6ZSA+IDApOw0KLSAgICBpZiAoaUJ1ZmZlclNpemUgPiBtX2lMZW5ndGggLSBtX2lQb3NpdGlvbikgew0KLSAgICAgICAgaUJ1ZmZlclNpemUgPSBtX2lMZW5ndGggLSBtX2lQb3NpdGlvbjsNCi0gICAgfQ0KLSAgICBpZiAobV9wRmlsZVJlYWQtPlJlYWRCbG9jayhwQnVmZmVyLCBtX2lQb3NpdGlvbiwgaUJ1ZmZlclNpemUpKSB7DQotICAgICAgICBtX2lQb3NpdGlvbiArPSBpQnVmZmVyU2l6ZTsNCi0gICAgICAgIHJldHVybiBpQnVmZmVyU2l6ZTsNCi0gICAgfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TKSB7DQorICBGWFNZU19hc3NlcnQobV9wRmlsZVJlYWQgIT0gTlVMTCk7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlNYXhMZW5ndGggPiAwKTsNCisgIGlNYXhMZW5ndGggPSBSZWFkRGF0YSgodWludDhfdCopcFN0ciwgaU1heExlbmd0aCAqIDIpIC8gMjsNCisgIGlmIChpTWF4TGVuZ3RoIDw9IDApIHsNCiAgICAgcmV0dXJuIDA7DQotfQ0KLWludDMyX3QgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wRmlsZVJlYWQgIT0gTlVMTCk7DQotICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaU1heExlbmd0aCA+IDApOw0KLSAgICBpTWF4TGVuZ3RoID0gUmVhZERhdGEoKHVpbnQ4X3QqKXBTdHIsIGlNYXhMZW5ndGggKiAyKSAvIDI7DQotICAgIGlmIChpTWF4TGVuZ3RoIDw9IDApIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIHdoaWxlIChpIDwgaU1heExlbmd0aCAmJiBwU3RyW2ldICE9IEwnXDAnKSB7DQotICAgICAgICArK2k7DQotICAgIH0NCi0gICAgYkVPUyA9IChtX2lQb3NpdGlvbiA+PSBtX2lMZW5ndGgpIHx8IHBTdHJbaV0gPT0gTCdcMCc7DQotICAgIHJldHVybiBpOw0KKyAgfQ0KKyAgaW50MzJfdCBpID0gMDsNCisgIHdoaWxlIChpIDwgaU1heExlbmd0aCAmJiBwU3RyW2ldICE9IEwnXDAnKSB7DQorICAgICsraTsNCisgIH0NCisgIGJFT1MgPSAobV9pUG9zaXRpb24gPj0gbV9pTGVuZ3RoKSB8fCBwU3RyW2ldID09IEwnXDAnOw0KKyAgcmV0dXJuIGk7DQogfQ0KIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpDRlhfQnVmZmVyUmVhZFN0cmVhbUltcCgpDQotICAgIDogbV9wQnVmZmVyUmVhZChOVUxMKQ0KLSAgICAsIG1fYlJlbGVhc2VCdWZmZXJSZWFkKEZBTFNFKQ0KLSAgICAsIG1faVBvc2l0aW9uKDApDQotICAgICwgbV9pQnVmZmVyU2l6ZSgwKQ0KLXsNCisgICAgOiBtX3BCdWZmZXJSZWFkKE5VTEwpLA0KKyAgICAgIG1fYlJlbGVhc2VCdWZmZXJSZWFkKEZBTFNFKSwNCisgICAgICBtX2lQb3NpdGlvbigwKSwNCisgICAgICBtX2lCdWZmZXJTaXplKDApIHt9DQorQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXA6On5DRlhfQnVmZmVyUmVhZFN0cmVhbUltcCgpIHsNCisgIGlmIChtX2JSZWxlYXNlQnVmZmVyUmVhZCAmJiBtX3BCdWZmZXJSZWFkICE9IE5VTEwpIHsNCisgICAgbV9wQnVmZmVyUmVhZC0+UmVsZWFzZSgpOw0KKyAgfQ0KIH0NCi1DRlhfQnVmZmVyUmVhZFN0cmVhbUltcDo6fkNGWF9CdWZmZXJSZWFkU3RyZWFtSW1wKCkNCi17DQotICAgIGlmIChtX2JSZWxlYXNlQnVmZmVyUmVhZCAmJiBtX3BCdWZmZXJSZWFkICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcEJ1ZmZlclJlYWQtPlJlbGVhc2UoKTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpMb2FkQnVmZmVyUmVhZChJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlclJlYWQsIGludDMyX3QgaUZpbGVTaXplLCBGWF9EV09SRCBkd0FjY2VzcywgRlhfQk9PTCBiUmVsZWFzZUJ1ZmZlclJlYWQpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wQnVmZmVyUmVhZCA9PSBOVUxMICYmIHBCdWZmZXJSZWFkICE9IE5VTEwpOw0KLSAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX2JSZWxlYXNlQnVmZmVyUmVhZCA9IGJSZWxlYXNlQnVmZmVyUmVhZDsNCi0gICAgbV9wQnVmZmVyUmVhZCA9IHBCdWZmZXJSZWFkOw0KLSAgICBtX2lCdWZmZXJTaXplID0gaUZpbGVTaXplOw0KLSAgICBpZiAobV9pQnVmZmVyU2l6ZSA+PSAwKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soVFJVRSkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX2lCdWZmZXJTaXplID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQotICAgIHdoaWxlICghbV9wQnVmZmVyUmVhZC0+SXNFT0YoKSkgew0KLSAgICAgICAgbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSk7DQotICAgICAgICBtX2lCdWZmZXJTaXplICs9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KLSAgICB9DQorRlhfQk9PTCBDRlhfQnVmZmVyUmVhZFN0cmVhbUltcDo6TG9hZEJ1ZmZlclJlYWQoSUZYX0J1ZmZlclJlYWQqIHBCdWZmZXJSZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZpbGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlbGVhc2VCdWZmZXJSZWFkKSB7DQorICBGWFNZU19hc3NlcnQobV9wQnVmZmVyUmVhZCA9PSBOVUxMICYmIHBCdWZmZXJSZWFkICE9IE5VTEwpOw0KKyAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fYlJlbGVhc2VCdWZmZXJSZWFkID0gYlJlbGVhc2VCdWZmZXJSZWFkOw0KKyAgbV9wQnVmZmVyUmVhZCA9IHBCdWZmZXJSZWFkOw0KKyAgbV9pQnVmZmVyU2l6ZSA9IGlGaWxlU2l6ZTsNCisgIGlmIChtX2lCdWZmZXJTaXplID49IDApIHsNCiAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soVFJVRSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9pQnVmZmVyU2l6ZSA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgd2hpbGUgKCFtX3BCdWZmZXJSZWFkLT5Jc0VPRigpKSB7DQorICAgIG1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soRkFMU0UpOw0KKyAgICBtX2lCdWZmZXJTaXplICs9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLWludDMyX3QgQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXA6OkdldExlbmd0aCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9pQnVmZmVyU2l6ZTsNCitpbnQzMl90IENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpHZXRMZW5ndGgoKSBjb25zdCB7DQorICByZXR1cm4gbV9pQnVmZmVyU2l6ZTsNCiB9DQotaW50MzJfdCBDRlhfQnVmZmVyUmVhZFN0cmVhbUltcDo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBHZXRMZW5ndGgoKTsNCi0gICAgc3dpdGNoIChlU2Vlaykgew0KLSAgICAgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0JlZ2luOg0KLSAgICAgICAgICAgIG1faVBvc2l0aW9uID0gaU9mZnNldDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfU1RSRUFNU0VFS19DdXJyZW50Og0KLSAgICAgICAgICAgIG1faVBvc2l0aW9uICs9IGlPZmZzZXQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX1NUUkVBTVNFRUtfRW5kOg0KLSAgICAgICAgICAgIG1faVBvc2l0aW9uID0gaUxlbmd0aCArIGlPZmZzZXQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgaWYgKG1faVBvc2l0aW9uIDwgMCkgew0KLSAgICAgICAgbV9pUG9zaXRpb24gPSAwOw0KLSAgICB9IGVsc2UgaWYgKG1faVBvc2l0aW9uID49IGlMZW5ndGgpIHsNCi0gICAgICAgIG1faVBvc2l0aW9uID0gaUxlbmd0aDsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9pUG9zaXRpb247DQoraW50MzJfdCBDRlhfQnVmZmVyUmVhZFN0cmVhbUltcDo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IEdldExlbmd0aCgpOw0KKyAgc3dpdGNoIChlU2Vlaykgew0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQmVnaW46DQorICAgICAgbV9pUG9zaXRpb24gPSBpT2Zmc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQ3VycmVudDoNCisgICAgICBtX2lQb3NpdGlvbiArPSBpT2Zmc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfRW5kOg0KKyAgICAgIG1faVBvc2l0aW9uID0gaUxlbmd0aCArIGlPZmZzZXQ7DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAobV9pUG9zaXRpb24gPCAwKSB7DQorICAgIG1faVBvc2l0aW9uID0gMDsNCisgIH0gZWxzZSBpZiAobV9pUG9zaXRpb24gPj0gaUxlbmd0aCkgew0KKyAgICBtX2lQb3NpdGlvbiA9IGlMZW5ndGg7DQorICB9DQorICByZXR1cm4gbV9pUG9zaXRpb247DQogfQ0KLUZYX0JPT0wgQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXA6OklzRU9GKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3BCdWZmZXJSZWFkID8gbV9wQnVmZmVyUmVhZC0+SXNFT0YoKSA6IFRSVUU7DQorRlhfQk9PTCBDRlhfQnVmZmVyUmVhZFN0cmVhbUltcDo6SXNFT0YoKSBjb25zdCB7DQorICByZXR1cm4gbV9wQnVmZmVyUmVhZCA/IG1fcEJ1ZmZlclJlYWQtPklzRU9GKCkgOiBUUlVFOw0KIH0NCi1pbnQzMl90IENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEJ1ZmZlclJlYWQgIT0gTlVMTCk7DQotICAgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwKTsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gR2V0TGVuZ3RoKCk7DQotICAgIGlmIChtX2lQb3NpdGlvbiA+PSBpTGVuZ3RoKSB7DQotICAgICAgICByZXR1cm4gMDsNCitpbnQzMl90IENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BCdWZmZXJSZWFkICE9IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmZmVyU2l6ZSA+IDApOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gR2V0TGVuZ3RoKCk7DQorICBpZiAobV9pUG9zaXRpb24gPj0gaUxlbmd0aCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChpQnVmZmVyU2l6ZSA+IGlMZW5ndGggLSBtX2lQb3NpdGlvbikgew0KKyAgICBpQnVmZmVyU2l6ZSA9IGlMZW5ndGggLSBtX2lQb3NpdGlvbjsNCisgIH0NCisgIEZYX0RXT1JEIGR3QmxvY2tPZmZzZXQgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KKyAgRlhfRFdPUkQgZHdCbG9ja1NpemUgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgIGlmIChtX2lQb3NpdGlvbiA8IChpbnQzMl90KWR3QmxvY2tPZmZzZXQpIHsNCisgICAgaWYgKCFtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKFRSVUUpKSB7DQorICAgICAgcmV0dXJuIDA7DQogICAgIH0NCi0gICAgaWYgKGlCdWZmZXJTaXplID4gaUxlbmd0aCAtIG1faVBvc2l0aW9uKSB7DQotICAgICAgICBpQnVmZmVyU2l6ZSA9IGlMZW5ndGggLSBtX2lQb3NpdGlvbjsNCisgICAgZHdCbG9ja09mZnNldCA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQorICAgIGR3QmxvY2tTaXplID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICB9DQorICB3aGlsZSAobV9pUG9zaXRpb24gPCAoaW50MzJfdClkd0Jsb2NrT2Zmc2V0IHx8DQorICAgICAgICAgbV9pUG9zaXRpb24gPj0gKGludDMyX3QpKGR3QmxvY2tPZmZzZXQgKyBkd0Jsb2NrU2l6ZSkpIHsNCisgICAgaWYgKG1fcEJ1ZmZlclJlYWQtPklzRU9GKCkgfHwgIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soRkFMU0UpKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgRlhfRFdPUkQgZHdCbG9ja09mZnNldAk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQotICAgIEZYX0RXT1JEIGR3QmxvY2tTaXplCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQotICAgIGlmIChtX2lQb3NpdGlvbiA8IChpbnQzMl90KWR3QmxvY2tPZmZzZXQpIHsNCi0gICAgICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhUUlVFKSkgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZHdCbG9ja09mZnNldAk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQotICAgICAgICBkd0Jsb2NrU2l6ZQkJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgZHdCbG9ja09mZnNldCA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQorICAgIGR3QmxvY2tTaXplID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICB9DQorICBpZiAobV9pUG9zaXRpb24gPCAoaW50MzJfdClkd0Jsb2NrT2Zmc2V0IHx8DQorICAgICAgbV9pUG9zaXRpb24gPj0gKGludDMyX3QpKGR3QmxvY2tPZmZzZXQgKyBkd0Jsb2NrU2l6ZSkpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBjb25zdCB1aW50OF90KiBwQnVmZmVyVG1wID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tCdWZmZXIoKTsNCisgIEZYX0RXT1JEIGR3T2Zmc2V0VG1wID0gbV9pUG9zaXRpb24gLSBkd0Jsb2NrT2Zmc2V0Ow0KKyAgRlhfRFdPUkQgZHdDb3B5U2l6ZSA9DQorICAgICAgRlhfTUlOKGlCdWZmZXJTaXplLCAoaW50MzJfdCkoZHdCbG9ja1NpemUgLSBkd09mZnNldFRtcCkpOw0KKyAgRlhTWVNfbWVtY3B5KHBCdWZmZXIsIHBCdWZmZXJUbXAgKyBkd09mZnNldFRtcCwgZHdDb3B5U2l6ZSk7DQorICBkd09mZnNldFRtcCA9IGR3Q29weVNpemU7DQorICBpQnVmZmVyU2l6ZSAtPSBkd0NvcHlTaXplOw0KKyAgd2hpbGUgKGlCdWZmZXJTaXplID4gMCkgew0KKyAgICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soRkFMU0UpKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgd2hpbGUgKG1faVBvc2l0aW9uIDwgKGludDMyX3QpZHdCbG9ja09mZnNldCB8fCBtX2lQb3NpdGlvbiA+PSAoaW50MzJfdCkoZHdCbG9ja09mZnNldCArIGR3QmxvY2tTaXplKSkgew0KLSAgICAgICAgaWYgKG1fcEJ1ZmZlclJlYWQtPklzRU9GKCkgfHwgIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soRkFMU0UpKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBkd0Jsb2NrT2Zmc2V0CT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCi0gICAgICAgIGR3QmxvY2tTaXplCQk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KLSAgICB9DQotICAgIGlmIChtX2lQb3NpdGlvbiA8IChpbnQzMl90KWR3QmxvY2tPZmZzZXQgfHwgbV9pUG9zaXRpb24gPj0gKGludDMyX3QpKGR3QmxvY2tPZmZzZXQgKyBkd0Jsb2NrU2l6ZSkpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXJUbXAJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja0J1ZmZlcigpOw0KLSAgICBGWF9EV09SRCBkd09mZnNldFRtcAk9IG1faVBvc2l0aW9uIC0gZHdCbG9ja09mZnNldDsNCi0gICAgRlhfRFdPUkQgZHdDb3B5U2l6ZQkJPSBGWF9NSU4oaUJ1ZmZlclNpemUsIChpbnQzMl90KShkd0Jsb2NrU2l6ZSAtIGR3T2Zmc2V0VG1wKSk7DQotICAgIEZYU1lTX21lbWNweShwQnVmZmVyLCBwQnVmZmVyVG1wICsgZHdPZmZzZXRUbXAsIGR3Q29weVNpemUpOw0KLSAgICBkd09mZnNldFRtcCA9IGR3Q29weVNpemU7DQorICAgIGR3QmxvY2tPZmZzZXQgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KKyAgICBkd0Jsb2NrU2l6ZSA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgICBwQnVmZmVyVG1wID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tCdWZmZXIoKTsNCisgICAgZHdDb3B5U2l6ZSA9IEZYX01JTigoRlhfRFdPUkQpaUJ1ZmZlclNpemUsIGR3QmxvY2tTaXplKTsNCisgICAgRlhTWVNfbWVtY3B5KHBCdWZmZXIgKyBkd09mZnNldFRtcCwgcEJ1ZmZlclRtcCwgZHdDb3B5U2l6ZSk7DQorICAgIGR3T2Zmc2V0VG1wICs9IGR3Q29weVNpemU7DQogICAgIGlCdWZmZXJTaXplIC09IGR3Q29weVNpemU7DQotICAgIHdoaWxlIChpQnVmZmVyU2l6ZSA+IDApIHsNCi0gICAgICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGR3QmxvY2tPZmZzZXQJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KLSAgICAgICAgZHdCbG9ja1NpemUJCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQotICAgICAgICBwQnVmZmVyVG1wCQk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrQnVmZmVyKCk7DQotICAgICAgICBkd0NvcHlTaXplCQk9IEZYX01JTigoRlhfRFdPUkQpaUJ1ZmZlclNpemUsIGR3QmxvY2tTaXplKTsNCi0gICAgICAgIEZYU1lTX21lbWNweShwQnVmZmVyICsgZHdPZmZzZXRUbXAsIHBCdWZmZXJUbXAsIGR3Q29weVNpemUpOw0KLSAgICAgICAgZHdPZmZzZXRUbXAgKz0gZHdDb3B5U2l6ZTsNCi0gICAgICAgIGlCdWZmZXJTaXplIC09IGR3Q29weVNpemU7DQotICAgIH0NCi0gICAgbV9pUG9zaXRpb24gKz0gZHdPZmZzZXRUbXA7DQotICAgIHJldHVybiBkd09mZnNldFRtcDsNCisgIH0NCisgIG1faVBvc2l0aW9uICs9IGR3T2Zmc2V0VG1wOw0KKyAgcmV0dXJuIGR3T2Zmc2V0VG1wOw0KIH0NCi1pbnQzMl90IENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wQnVmZmVyUmVhZCAhPSBOVUxMKTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCAmJiBpTWF4TGVuZ3RoID4gMCk7DQotICAgIGlNYXhMZW5ndGggPSBSZWFkRGF0YSgodWludDhfdCopcFN0ciwgaU1heExlbmd0aCAqIDIpIC8gMjsNCi0gICAgaWYgKGlNYXhMZW5ndGggPD0gMCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgd2hpbGUgKGkgPCBpTWF4TGVuZ3RoICYmIHBTdHJbaV0gIT0gTCdcMCcpIHsNCi0gICAgICAgICsraTsNCi0gICAgfQ0KLSAgICBiRU9TID0gKG1faVBvc2l0aW9uID49IEdldExlbmd0aCgpKSB8fCBwU3RyW2ldID09IEwnXDAnOw0KLSAgICByZXR1cm4gaTsNCitpbnQzMl90IENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWF4TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVPUykgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEJ1ZmZlclJlYWQgIT0gTlVMTCk7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlNYXhMZW5ndGggPiAwKTsNCisgIGlNYXhMZW5ndGggPSBSZWFkRGF0YSgodWludDhfdCopcFN0ciwgaU1heExlbmd0aCAqIDIpIC8gMjsNCisgIGlmIChpTWF4TGVuZ3RoIDw9IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgd2hpbGUgKGkgPCBpTWF4TGVuZ3RoICYmIHBTdHJbaV0gIT0gTCdcMCcpIHsNCisgICAgKytpOw0KKyAgfQ0KKyAgYkVPUyA9IChtX2lQb3NpdGlvbiA+PSBHZXRMZW5ndGgoKSkgfHwgcFN0cltpXSA9PSBMJ1wwJzsNCisgIHJldHVybiBpOw0KIH0NCiBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpDRlhfRmlsZVdyaXRlU3RyZWFtSW1wKCkNCi0gICAgOiBtX3BGaWxlV3JpdGUoTlVMTCkNCi0gICAgLCBtX2lQb3NpdGlvbigwKQ0KLXsNCisgICAgOiBtX3BGaWxlV3JpdGUoTlVMTCksIG1faVBvc2l0aW9uKDApIHt9DQorRlhfQk9PTCBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpMb2FkRmlsZVdyaXRlKElGWF9GaWxlV3JpdGUqIHBGaWxlV3JpdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzKSB7DQorICBGWFNZU19hc3NlcnQobV9wRmlsZVdyaXRlID09IE5VTEwgJiYgcEZpbGVXcml0ZSAhPSBOVUxMKTsNCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19SZWFkKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpIHsNCisgICAgbV9pUG9zaXRpb24gPSBwRmlsZVdyaXRlLT5HZXRTaXplKCk7DQorICB9DQorICBtX3BGaWxlV3JpdGUgPSBwRmlsZVdyaXRlOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDo6TG9hZEZpbGVXcml0ZShJRlhfRmlsZVdyaXRlICpwRmlsZVdyaXRlLCBGWF9EV09SRCBkd0FjY2VzcykNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BGaWxlV3JpdGUgPT0gTlVMTCAmJiBwRmlsZVdyaXRlICE9IE5VTEwpOw0KLSAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfUmVhZCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpIHsNCi0gICAgICAgIG1faVBvc2l0aW9uID0gcEZpbGVXcml0ZS0+R2V0U2l6ZSgpOw0KLSAgICB9DQotICAgIG1fcEZpbGVXcml0ZSA9IHBGaWxlV3JpdGU7DQotICAgIHJldHVybiBUUlVFOw0KK2ludDMyX3QgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3Qgew0KKyAgaWYgKCFtX3BGaWxlV3JpdGUpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gKGludDMyX3QpbV9wRmlsZVdyaXRlLT5HZXRTaXplKCk7DQogfQ0KLWludDMyX3QgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3QNCi17DQotICAgIGlmICghbV9wRmlsZVdyaXRlKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICByZXR1cm4gKGludDMyX3QpbV9wRmlsZVdyaXRlLT5HZXRTaXplKCk7DQoraW50MzJfdCBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gR2V0TGVuZ3RoKCk7DQorICBzd2l0Y2ggKGVTZWVrKSB7DQorICAgIGNhc2UgRlhfU1RSRUFNU0VFS19CZWdpbjoNCisgICAgICBtX2lQb3NpdGlvbiA9IGlPZmZzZXQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfU1RSRUFNU0VFS19DdXJyZW50Og0KKyAgICAgIG1faVBvc2l0aW9uICs9IGlPZmZzZXQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfU1RSRUFNU0VFS19FbmQ6DQorICAgICAgbV9pUG9zaXRpb24gPSBpTGVuZ3RoICsgaU9mZnNldDsNCisgICAgICBicmVhazsNCisgIH0NCisgIGlmIChtX2lQb3NpdGlvbiA8IDApIHsNCisgICAgbV9pUG9zaXRpb24gPSAwOw0KKyAgfSBlbHNlIGlmIChtX2lQb3NpdGlvbiA+PSBpTGVuZ3RoKSB7DQorICAgIG1faVBvc2l0aW9uID0gaUxlbmd0aDsNCisgIH0NCisgIHJldHVybiBtX2lQb3NpdGlvbjsNCiB9DQotaW50MzJfdCBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IEdldExlbmd0aCgpOw0KLSAgICBzd2l0Y2ggKGVTZWVrKSB7DQotICAgICAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQmVnaW46DQotICAgICAgICAgICAgbV9pUG9zaXRpb24gPSBpT2Zmc2V0Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0N1cnJlbnQ6DQotICAgICAgICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfU1RSRUFNU0VFS19FbmQ6DQotICAgICAgICAgICAgbV9pUG9zaXRpb24gPSBpTGVuZ3RoICsgaU9mZnNldDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBpZiAobV9pUG9zaXRpb24gPCAwKSB7DQotICAgICAgICBtX2lQb3NpdGlvbiA9IDA7DQotICAgIH0gZWxzZSBpZiAobV9pUG9zaXRpb24gPj0gaUxlbmd0aCkgew0KLSAgICAgICAgbV9pUG9zaXRpb24gPSBpTGVuZ3RoOw0KLSAgICB9DQotICAgIHJldHVybiBtX2lQb3NpdGlvbjsNCitGWF9CT09MIENGWF9GaWxlV3JpdGVTdHJlYW1JbXA6OklzRU9GKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1faVBvc2l0aW9uID49IEdldExlbmd0aCgpOw0KIH0NCi1GWF9CT09MIENGWF9GaWxlV3JpdGVTdHJlYW1JbXA6OklzRU9GKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX2lQb3NpdGlvbiA+PSBHZXRMZW5ndGgoKTsNCitpbnQzMl90IENGWF9GaWxlV3JpdGVTdHJlYW1JbXA6OldyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIGlmICghbV9wRmlsZVdyaXRlKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKG1fcEZpbGVXcml0ZS0+V3JpdGVCbG9jayhwQnVmZmVyLCBtX2lQb3NpdGlvbiwgaUJ1ZmZlclNpemUpKSB7DQorICAgIG1faVBvc2l0aW9uICs9IGlCdWZmZXJTaXplOw0KKyAgfQ0KKyAgcmV0dXJuIGlCdWZmZXJTaXplOw0KIH0NCi1pbnQzMl90IENGWF9GaWxlV3JpdGVTdHJlYW1JbXA6OldyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKQ0KLXsNCi0gICAgaWYgKCFtX3BGaWxlV3JpdGUpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIGlmIChtX3BGaWxlV3JpdGUtPldyaXRlQmxvY2socEJ1ZmZlciwgbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKSkgew0KLSAgICAgICAgbV9pUG9zaXRpb24gKz0gaUJ1ZmZlclNpemU7DQotICAgIH0NCi0gICAgcmV0dXJuIGlCdWZmZXJTaXplOw0KK2ludDMyX3QgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDo6V3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsNCisgIHJldHVybiBXcml0ZURhdGEoKGNvbnN0IHVpbnQ4X3QqKXBTdHIsIGlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCiB9DQotaW50MzJfdCBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKQ0KLXsNCi0gICAgcmV0dXJuIFdyaXRlRGF0YSgoY29uc3QgdWludDhfdCopcFN0ciwgaUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KLX0NCi12b2lkIENGWF9GaWxlV3JpdGVTdHJlYW1JbXA6OkZsdXNoKCkNCi17DQotICAgIGlmIChtX3BGaWxlV3JpdGUpIHsNCi0gICAgICAgIG1fcEZpbGVXcml0ZS0+Rmx1c2goKTsNCi0gICAgfQ0KK3ZvaWQgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDo6Rmx1c2goKSB7DQorICBpZiAobV9wRmlsZVdyaXRlKSB7DQorICAgIG1fcEZpbGVXcml0ZS0+Rmx1c2goKTsNCisgIH0NCiB9DQogQ0ZYX0J1ZmZlclN0cmVhbUltcDo6Q0ZYX0J1ZmZlclN0cmVhbUltcCgpDQotICAgIDogQ0ZYX1N0cmVhbUltcCgpDQotICAgICwgbV9wRGF0YShOVUxMKQ0KLSAgICAsIG1faVRvdGFsU2l6ZSgwKQ0KLSAgICAsIG1faVBvc2l0aW9uKDApDQotICAgICwgbV9pTGVuZ3RoKDApDQotew0KKyAgICA6IENGWF9TdHJlYW1JbXAoKSwNCisgICAgICBtX3BEYXRhKE5VTEwpLA0KKyAgICAgIG1faVRvdGFsU2l6ZSgwKSwNCisgICAgICBtX2lQb3NpdGlvbigwKSwNCisgICAgICBtX2lMZW5ndGgoMCkge30NCitGWF9CT09MIENGWF9CdWZmZXJTdHJlYW1JbXA6OkxvYWRCdWZmZXIodWludDhfdCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRvdGFsU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BEYXRhID09IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KHBEYXRhICE9IE5VTEwgJiYgaVRvdGFsU2l6ZSA+IDApOw0KKyAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KKyAgbV9wRGF0YSA9IHBEYXRhOw0KKyAgbV9pVG90YWxTaXplID0gaVRvdGFsU2l6ZTsNCisgIG1faVBvc2l0aW9uID0gMDsNCisgIG1faUxlbmd0aCA9IChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCA/IDAgOiBpVG90YWxTaXplOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX0J1ZmZlclN0cmVhbUltcDo6TG9hZEJ1ZmZlcih1aW50OF90KiBwRGF0YSwgaW50MzJfdCBpVG90YWxTaXplLCBGWF9EV09SRCBkd0FjY2VzcykNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhID09IE5VTEwpOw0KLSAgICBGWFNZU19hc3NlcnQocERhdGEgIT0gTlVMTCAmJiBpVG90YWxTaXplID4gMCk7DQotICAgIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCi0gICAgbV9wRGF0YSA9IHBEYXRhOw0KLSAgICBtX2lUb3RhbFNpemUgPSBpVG90YWxTaXplOw0KK2ludDMyX3QgQ0ZYX0J1ZmZlclN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3Qgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcERhdGEgIT0gTlVMTCk7DQorICByZXR1cm4gbV9pTGVuZ3RoOw0KK30NCitpbnQzMl90IENGWF9CdWZmZXJTdHJlYW1JbXA6OlNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSB7DQorICBGWFNZU19hc3NlcnQobV9wRGF0YSAhPSBOVUxMKTsNCisgIGlmIChlU2VlayA9PSBGWF9TVFJFQU1TRUVLX0JlZ2luKSB7DQorICAgIG1faVBvc2l0aW9uID0gaU9mZnNldDsNCisgIH0gZWxzZSBpZiAoZVNlZWsgPT0gRlhfU1RSRUFNU0VFS19DdXJyZW50KSB7DQorICAgIG1faVBvc2l0aW9uICs9IGlPZmZzZXQ7DQorICB9IGVsc2UgaWYgKGVTZWVrID09IEZYX1NUUkVBTVNFRUtfRW5kKSB7DQorICAgIG1faVBvc2l0aW9uID0gbV9pTGVuZ3RoICsgaU9mZnNldDsNCisgIH0NCisgIGlmIChtX2lQb3NpdGlvbiA+IG1faUxlbmd0aCkgew0KKyAgICBtX2lQb3NpdGlvbiA9IG1faUxlbmd0aDsNCisgIH0NCisgIGlmIChtX2lQb3NpdGlvbiA8IDApIHsNCiAgICAgbV9pUG9zaXRpb24gPSAwOw0KLSAgICBtX2lMZW5ndGggPSAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDAgPyAwIDogaVRvdGFsU2l6ZTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gbV9pUG9zaXRpb247DQogfQ0KLWludDMyX3QgQ0ZYX0J1ZmZlclN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3QNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOw0KLSAgICByZXR1cm4gbV9pTGVuZ3RoOw0KK2ludDMyX3QgQ0ZYX0J1ZmZlclN0cmVhbUltcDo6R2V0UG9zaXRpb24oKSB7DQorICBGWFNZU19hc3NlcnQobV9wRGF0YSAhPSBOVUxMKTsNCisgIHJldHVybiBtX2lQb3NpdGlvbjsNCiB9DQotaW50MzJfdCBDRlhfQnVmZmVyU3RyZWFtSW1wOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOw0KLSAgICBpZiAoZVNlZWsgPT0gRlhfU1RSRUFNU0VFS19CZWdpbikgew0KLSAgICAgICAgbV9pUG9zaXRpb24gPSBpT2Zmc2V0Ow0KLSAgICB9IGVsc2UgaWYgKGVTZWVrID09IEZYX1NUUkVBTVNFRUtfQ3VycmVudCkgew0KLSAgICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsNCi0gICAgfSBlbHNlIGlmIChlU2VlayA9PSBGWF9TVFJFQU1TRUVLX0VuZCkgew0KLSAgICAgICAgbV9pUG9zaXRpb24gPSBtX2lMZW5ndGggKyBpT2Zmc2V0Ow0KLSAgICB9DQotICAgIGlmIChtX2lQb3NpdGlvbiA+IG1faUxlbmd0aCkgew0KLSAgICAgICAgbV9pUG9zaXRpb24gPSBtX2lMZW5ndGg7DQotICAgIH0NCi0gICAgaWYgKG1faVBvc2l0aW9uIDwgMCkgew0KLSAgICAgICAgbV9pUG9zaXRpb24gPSAwOw0KLSAgICB9DQotICAgIHJldHVybiBtX2lQb3NpdGlvbjsNCitGWF9CT09MIENGWF9CdWZmZXJTdHJlYW1JbXA6OklzRU9GKCkgY29uc3Qgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcERhdGEgIT0gTlVMTCk7DQorICByZXR1cm4gbV9pUG9zaXRpb24gPj0gbV9pTGVuZ3RoOw0KIH0NCi1pbnQzMl90IENGWF9CdWZmZXJTdHJlYW1JbXA6OkdldFBvc2l0aW9uKCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOw0KLSAgICByZXR1cm4gbV9pUG9zaXRpb247DQoraW50MzJfdCBDRlhfQnVmZmVyU3RyZWFtSW1wOjpSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSB7DQorICBGWFNZU19hc3NlcnQobV9wRGF0YSAhPSBOVUxMKTsNCisgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwKTsNCisgIGludDMyX3QgaUxlbiA9IEZYX01JTihtX2lMZW5ndGggLSBtX2lQb3NpdGlvbiwgaUJ1ZmZlclNpemUpOw0KKyAgaWYgKGlMZW4gPD0gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYU1lTX21lbWNweShwQnVmZmVyLCBtX3BEYXRhICsgbV9pUG9zaXRpb24sIGlMZW4pOw0KKyAgbV9pUG9zaXRpb24gKz0gaUxlbjsNCisgIHJldHVybiBpTGVuOw0KIH0NCi1GWF9CT09MIENGWF9CdWZmZXJTdHJlYW1JbXA6OklzRU9GKCkgY29uc3QNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOw0KLSAgICByZXR1cm4gbV9pUG9zaXRpb24gPj0gbV9pTGVuZ3RoOw0KK2ludDMyX3QgQ0ZYX0J1ZmZlclN0cmVhbUltcDo6UmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWF4TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TKSB7DQorICBGWFNZU19hc3NlcnQobV9wRGF0YSAhPSBOVUxMKTsNCisgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaU1heExlbmd0aCA+IDApOw0KKyAgaW50MzJfdCBpTGVuID0gRlhfTUlOKChtX2lMZW5ndGggLSBtX2lQb3NpdGlvbikgLyAyLCBpTWF4TGVuZ3RoKTsNCisgIGlmIChpTGVuIDw9IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBjb25zdCBGWF9XQ0hBUiogcFNyYyA9IChjb25zdCBGWF9XQ0hBUiopKEZYX0NIQVIqKShtX3BEYXRhICsgbV9pUG9zaXRpb24pOw0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgd2hpbGUgKCpwU3JjICE9IEwnXDAnICYmIGlDb3VudCA8IGlMZW4pIHsNCisgICAgKnBTdHIrKyA9ICpwU3JjKyssIGlDb3VudCsrOw0KKyAgfQ0KKyAgbV9pUG9zaXRpb24gKz0gaUNvdW50ICogMjsNCisgIGJFT1MgPSAoKnBTcmMgPT0gTCdcMCcpIHx8IChtX2lQb3NpdGlvbiA+PSBtX2lMZW5ndGgpOw0KKyAgcmV0dXJuIGlDb3VudDsNCiB9DQotaW50MzJfdCBDRlhfQnVmZmVyU3RyZWFtSW1wOjpSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcERhdGEgIT0gTlVMTCk7DQotICAgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwKTsNCi0gICAgaW50MzJfdCBpTGVuID0gRlhfTUlOKG1faUxlbmd0aCAtIG1faVBvc2l0aW9uLCBpQnVmZmVyU2l6ZSk7DQotICAgIGlmIChpTGVuIDw9IDApIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIEZYU1lTX21lbWNweShwQnVmZmVyLCBtX3BEYXRhICsgbV9pUG9zaXRpb24sIGlMZW4pOw0KLSAgICBtX2lQb3NpdGlvbiArPSBpTGVuOw0KLSAgICByZXR1cm4gaUxlbjsNCitpbnQzMl90IENGWF9CdWZmZXJTdHJlYW1JbXA6OldyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwgJiYgKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KKyAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmZmVyU2l6ZSA+IDApOw0KKyAgaW50MzJfdCBpTGVuID0gRlhfTUlOKG1faVRvdGFsU2l6ZSAtIG1faVBvc2l0aW9uLCBpQnVmZmVyU2l6ZSk7DQorICBpZiAoaUxlbiA8PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBtX2lQb3NpdGlvbiwgcEJ1ZmZlciwgaUxlbik7DQorICBtX2lQb3NpdGlvbiArPSBpTGVuOw0KKyAgaWYgKG1faVBvc2l0aW9uID4gbV9pTGVuZ3RoKSB7DQorICAgIG1faUxlbmd0aCA9IG1faVBvc2l0aW9uOw0KKyAgfQ0KKyAgcmV0dXJuIGlMZW47DQogfQ0KLWludDMyX3QgQ0ZYX0J1ZmZlclN0cmVhbUltcDo6UmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTWF4TGVuZ3RoLCBGWF9CT09MICZiRU9TKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcERhdGEgIT0gTlVMTCk7DQotICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaU1heExlbmd0aCA+IDApOw0KLSAgICBpbnQzMl90IGlMZW4gPSBGWF9NSU4oKG1faUxlbmd0aCAtIG1faVBvc2l0aW9uKSAvIDIsIGlNYXhMZW5ndGgpOw0KLSAgICBpZiAoaUxlbiA8PSAwKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFNyYyA9IChjb25zdCBGWF9XQ0hBUiopKEZYX0NIQVIqKShtX3BEYXRhICsgbV9pUG9zaXRpb24pOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIHdoaWxlICgqcFNyYyAhPSBMJ1wwJyAmJiBpQ291bnQgPCBpTGVuKSB7DQotICAgICAgICAqcFN0ciArKyA9ICpwU3JjICsrLCBpQ291bnQgKys7DQotICAgIH0NCi0gICAgbV9pUG9zaXRpb24gKz0gaUNvdW50ICogMjsNCi0gICAgYkVPUyA9ICgqcFNyYyA9PSBMJ1wwJykgfHwgKG1faVBvc2l0aW9uID49IG1faUxlbmd0aCk7DQotICAgIHJldHVybiBpQ291bnQ7DQoraW50MzJfdCBDRlhfQnVmZmVyU3RyZWFtSW1wOjpXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcERhdGEgIT0gTlVMTCAmJiAobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIGludDMyX3QgaUxlbiA9IEZYX01JTigobV9pVG90YWxTaXplIC0gbV9pUG9zaXRpb24pIC8gMiwgaUxlbmd0aCk7DQorICBpZiAoaUxlbiA8PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBtX2lQb3NpdGlvbiwgcFN0ciwgaUxlbiAqIDIpOw0KKyAgbV9pUG9zaXRpb24gKz0gaUxlbiAqIDI7DQorICBpZiAobV9pUG9zaXRpb24gPiBtX2lMZW5ndGgpIHsNCisgICAgbV9pTGVuZ3RoID0gbV9pUG9zaXRpb247DQorICB9DQorICByZXR1cm4gaUxlbjsNCiB9DQotaW50MzJfdCBDRlhfQnVmZmVyU3RyZWFtSW1wOjpXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwgJiYgKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KLSAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQotICAgIGludDMyX3QgaUxlbiA9IEZYX01JTihtX2lUb3RhbFNpemUgLSBtX2lQb3NpdGlvbiwgaUJ1ZmZlclNpemUpOw0KLSAgICBpZiAoaUxlbiA8PSAwKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBGWFNZU19tZW1jcHkobV9wRGF0YSArIG1faVBvc2l0aW9uLCBwQnVmZmVyLCBpTGVuKTsNCi0gICAgbV9pUG9zaXRpb24gKz0gaUxlbjsNCi0gICAgaWYgKG1faVBvc2l0aW9uID4gbV9pTGVuZ3RoKSB7DQotICAgICAgICBtX2lMZW5ndGggPSBtX2lQb3NpdGlvbjsNCi0gICAgfQ0KLSAgICByZXR1cm4gaUxlbjsNCitJRlhfU3RyZWFtKiBJRlhfU3RyZWFtOjpDcmVhdGVUZXh0U3RyZWFtKElGWF9TdHJlYW0qIHBCYXNlU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVsZXRlT25SZWxlYXNlKSB7DQorICBGWFNZU19hc3NlcnQocEJhc2VTdHJlYW0gIT0gTlVMTCk7DQorICByZXR1cm4gRlhfTkVXIENGWF9UZXh0U3RyZWFtKHBCYXNlU3RyZWFtLCBiRGVsZXRlT25SZWxlYXNlKTsNCiB9DQotaW50MzJfdCBDRlhfQnVmZmVyU3RyZWFtSW1wOjpXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcERhdGEgIT0gTlVMTCAmJiAobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7DQotICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KLSAgICBpbnQzMl90IGlMZW4gPSBGWF9NSU4oKG1faVRvdGFsU2l6ZSAtIG1faVBvc2l0aW9uKSAvIDIsIGlMZW5ndGgpOw0KLSAgICBpZiAoaUxlbiA8PSAwKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBGWFNZU19tZW1jcHkobV9wRGF0YSArIG1faVBvc2l0aW9uLCBwU3RyLCBpTGVuICogMik7DQotICAgIG1faVBvc2l0aW9uICs9IGlMZW4gKiAyOw0KLSAgICBpZiAobV9pUG9zaXRpb24gPiBtX2lMZW5ndGgpIHsNCi0gICAgICAgIG1faUxlbmd0aCA9IG1faVBvc2l0aW9uOw0KLSAgICB9DQotICAgIHJldHVybiBpTGVuOw0KK0NGWF9UZXh0U3RyZWFtOjpDRlhfVGV4dFN0cmVhbShJRlhfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJEZWxTdHJlYW0pDQorICAgIDogbV93Q29kZVBhZ2UoRlhfQ09ERVBBR0VfRGVmQU5TSSksDQorICAgICAgbV93Qk9NTGVuZ3RoKDApLA0KKyAgICAgIG1fZHdCT00oMCksDQorICAgICAgbV9wQnVmKE5VTEwpLA0KKyAgICAgIG1faUJ1ZlNpemUoMCksDQorICAgICAgbV9iRGVsU3RyZWFtKGJEZWxTdHJlYW0pLA0KKyAgICAgIG1fcFN0cmVhbUltcChwU3RyZWFtKSwNCisgICAgICBtX2lSZWZDb3VudCgxKSB7DQorICBGWFNZU19hc3NlcnQobV9wU3RyZWFtSW1wICE9IE5VTEwpOw0KKyAgbV9wU3RyZWFtSW1wLT5SZXRhaW4oKTsNCisgIEluaXRTdHJlYW0oKTsNCiB9DQotSUZYX1N0cmVhbSogSUZYX1N0cmVhbTo6Q3JlYXRlVGV4dFN0cmVhbShJRlhfU3RyZWFtICpwQmFzZVN0cmVhbSwgRlhfQk9PTCBiRGVsZXRlT25SZWxlYXNlKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBCYXNlU3RyZWFtICE9IE5VTEwpOw0KLSAgICByZXR1cm4gRlhfTkVXIENGWF9UZXh0U3RyZWFtKHBCYXNlU3RyZWFtLCBiRGVsZXRlT25SZWxlYXNlKTsNCi19DQotQ0ZYX1RleHRTdHJlYW06OkNGWF9UZXh0U3RyZWFtKElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX0JPT0wgYkRlbFN0cmVhbSkNCi0gICAgOiBtX3dDb2RlUGFnZShGWF9DT0RFUEFHRV9EZWZBTlNJKQ0KLSAgICAsIG1fd0JPTUxlbmd0aCgwKQ0KLSAgICAsIG1fZHdCT00oMCkNCi0gICAgLCBtX3BCdWYoTlVMTCkNCi0gICAgLCBtX2lCdWZTaXplKDApDQotICAgICwgbV9iRGVsU3RyZWFtKGJEZWxTdHJlYW0pDQotICAgICwgbV9wU3RyZWFtSW1wKHBTdHJlYW0pDQotICAgICwgbV9pUmVmQ291bnQoMSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BTdHJlYW1JbXAgIT0gTlVMTCk7DQotICAgIG1fcFN0cmVhbUltcC0+UmV0YWluKCk7DQotICAgIEluaXRTdHJlYW0oKTsNCi19DQotQ0ZYX1RleHRTdHJlYW06On5DRlhfVGV4dFN0cmVhbSgpDQotew0KK0NGWF9UZXh0U3RyZWFtOjp+Q0ZYX1RleHRTdHJlYW0oKSB7DQorICBtX3BTdHJlYW1JbXAtPlJlbGVhc2UoKTsNCisgIGlmIChtX2JEZWxTdHJlYW0pIHsNCiAgICAgbV9wU3RyZWFtSW1wLT5SZWxlYXNlKCk7DQotICAgIGlmIChtX2JEZWxTdHJlYW0pIHsNCi0gICAgICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIGlmIChtX3BCdWYgIT0gTlVMTCkgew0KLSAgICAgICAgRlhfRnJlZShtX3BCdWYpOw0KLSAgICB9DQorICB9DQorICBpZiAobV9wQnVmICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShtX3BCdWYpOw0KKyAgfQ0KIH0NCi12b2lkIENGWF9UZXh0U3RyZWFtOjpJbml0U3RyZWFtKCkNCi17DQotICAgIGludDMyX3QgaVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpOw0KLSAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgMCk7DQotICAgIG1fcFN0cmVhbUltcC0+UmVhZERhdGEoKHVpbnQ4X3QqKSZtX2R3Qk9NLCAzKTsNCit2b2lkIENGWF9UZXh0U3RyZWFtOjpJbml0U3RyZWFtKCkgew0KKyAgaW50MzJfdCBpUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgMCk7DQorICBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKCh1aW50OF90KikmbV9kd0JPTSwgMyk7DQogI2lmIF9GWF9FTkRJQU5fID09IF9GWF9MSVRUTEVfRU5ESUFOXw0KLSAgICBtX2R3Qk9NICY9IDB4MDBGRkZGRkY7DQotICAgIGlmIChtX2R3Qk9NID09IDB4MDBCRkJCRUYpIHsNCi0gICAgICAgIG1fd0JPTUxlbmd0aCA9IDM7DQotICAgICAgICBtX3dDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjg7DQorICBtX2R3Qk9NICY9IDB4MDBGRkZGRkY7DQorICBpZiAobV9kd0JPTSA9PSAweDAwQkZCQkVGKSB7DQorICAgIG1fd0JPTUxlbmd0aCA9IDM7DQorICAgIG1fd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGODsNCisgIH0gZWxzZSB7DQorICAgIG1fZHdCT00gJj0gMHgwMDAwRkZGRjsNCisgICAgaWYgKG1fZHdCT00gPT0gMHgwMDAwRkZGRSkgew0KKyAgICAgIG1fd0JPTUxlbmd0aCA9IDI7DQorICAgICAgbV93Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEYxNkJFOw0KKyAgICB9IGVsc2UgaWYgKG1fZHdCT00gPT0gMHgwMDAwRkVGRikgew0KKyAgICAgIG1fd0JPTUxlbmd0aCA9IDI7DQorICAgICAgbV93Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEYxNkxFOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9kd0JPTSAmPSAweDAwMDBGRkZGOw0KLSAgICAgICAgaWYgKG1fZHdCT00gPT0gMHgwMDAwRkZGRSkgew0KLSAgICAgICAgICAgIG1fd0JPTUxlbmd0aCA9IDI7DQotICAgICAgICAgICAgbV93Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEYxNkJFOw0KLSAgICAgICAgfSBlbHNlIGlmIChtX2R3Qk9NID09IDB4MDAwMEZFRkYpIHsNCi0gICAgICAgICAgICBtX3dCT01MZW5ndGggPSAyOw0KLSAgICAgICAgICAgIG1fd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGMTZMRTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV93Qk9NTGVuZ3RoID0gMDsNCi0gICAgICAgICAgICBtX2R3Qk9NID0gMDsNCi0gICAgICAgICAgICBtX3dDb2RlUGFnZSA9IEZYU1lTX0dldEFDUCgpOw0KLSAgICAgICAgfQ0KKyAgICAgIG1fd0JPTUxlbmd0aCA9IDA7DQorICAgICAgbV9kd0JPTSA9IDA7DQorICAgICAgbV93Q29kZVBhZ2UgPSBGWFNZU19HZXRBQ1AoKTsNCiAgICAgfQ0KKyAgfQ0KICNlbHNlDQotICAgIG1fZHdCT00gJj0gMHhGRkZGRkYwMDsNCi0gICAgaWYgKG1fZHdCT00gPT0gMHhFRkJCQkYwMCkgew0KLSAgICAgICAgbV93Qk9NTGVuZ3RoID0gMzsNCi0gICAgICAgIG1fd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGODsNCisgIG1fZHdCT00gJj0gMHhGRkZGRkYwMDsNCisgIGlmIChtX2R3Qk9NID09IDB4RUZCQkJGMDApIHsNCisgICAgbV93Qk9NTGVuZ3RoID0gMzsNCisgICAgbV93Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEY4Ow0KKyAgfSBlbHNlIHsNCisgICAgbV9kd0JPTSAmPSAweEZGRkYwMDAwOw0KKyAgICBpZiAobV9kd0JPTSA9PSAweEZFRkYwMDAwKSB7DQorICAgICAgbV93Qk9NTGVuZ3RoID0gMjsNCisgICAgICBtX3dDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjE2QkU7DQorICAgIH0gZWxzZSBpZiAobV9kd0JPTSA9PSAweEZGRkUwMDAwKSB7DQorICAgICAgbV93Qk9NTGVuZ3RoID0gMjsNCisgICAgICBtX3dDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjE2TEU7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBtX2R3Qk9NICY9IDB4RkZGRjAwMDA7DQotICAgICAgICBpZiAobV9kd0JPTSA9PSAweEZFRkYwMDAwKSB7DQotICAgICAgICAgICAgbV93Qk9NTGVuZ3RoID0gMjsNCi0gICAgICAgICAgICBtX3dDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjE2QkU7DQotICAgICAgICB9IGVsc2UgaWYgKG1fZHdCT00gPT0gMHhGRkZFMDAwMCkgew0KLSAgICAgICAgICAgIG1fd0JPTUxlbmd0aCA9IDI7DQotICAgICAgICAgICAgbV93Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEYxNkxFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX3dCT01MZW5ndGggPSAwOw0KLSAgICAgICAgICAgIG1fZHdCT00gPSAwOw0KLSAgICAgICAgICAgIG1fd0NvZGVQYWdlID0gRlhTWVNfR2V0QUNQKCk7DQotICAgICAgICB9DQorICAgICAgbV93Qk9NTGVuZ3RoID0gMDsNCisgICAgICBtX2R3Qk9NID0gMDsNCisgICAgICBtX3dDb2RlUGFnZSA9IEZYU1lTX0dldEFDUCgpOw0KICAgICB9DQorICB9DQogI2VuZGlmDQotICAgIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBGWF9NQVgobV93Qk9NTGVuZ3RoLCBpUG9zaXRpb24pKTsNCisgIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBGWF9NQVgobV93Qk9NTGVuZ3RoLCBpUG9zaXRpb24pKTsNCiB9DQotdm9pZCBDRlhfVGV4dFN0cmVhbTo6UmVsZWFzZSgpDQotew0KLSAgICBpZiAoLS1tX2lSZWZDb3VudCA8IDEpIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KK3ZvaWQgQ0ZYX1RleHRTdHJlYW06OlJlbGVhc2UoKSB7DQorICBpZiAoLS1tX2lSZWZDb3VudCA8IDEpIHsNCisgICAgZGVsZXRlIHRoaXM7DQorICB9DQorfQ0KK0lGWF9TdHJlYW0qIENGWF9UZXh0U3RyZWFtOjpSZXRhaW4oKSB7DQorICBtX2lSZWZDb3VudCsrOw0KKyAgcmV0dXJuIHRoaXM7DQorfQ0KK0ZYX0RXT1JEIENGWF9UZXh0U3RyZWFtOjpHZXRBY2Nlc3NNb2RlcygpIGNvbnN0IHsNCisgIHJldHVybiBtX3BTdHJlYW1JbXAtPkdldEFjY2Vzc01vZGVzKCkgfCBGWF9TVFJFQU1BQ0NFU1NfVGV4dDsNCit9DQoraW50MzJfdCBDRlhfVGV4dFN0cmVhbTo6R2V0TGVuZ3RoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCk7DQorfQ0KK2ludDMyX3QgQ0ZYX1RleHRTdHJlYW06OlNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSB7DQorICByZXR1cm4gbV9wU3RyZWFtSW1wLT5TZWVrKGVTZWVrLCBpT2Zmc2V0KTsNCit9DQoraW50MzJfdCBDRlhfVGV4dFN0cmVhbTo6R2V0UG9zaXRpb24oKSB7DQorICByZXR1cm4gbV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpOw0KK30NCitGWF9CT09MIENGWF9UZXh0U3RyZWFtOjpJc0VPRigpIGNvbnN0IHsNCisgIHJldHVybiBtX3BTdHJlYW1JbXAtPklzRU9GKCk7DQorfQ0KK2ludDMyX3QgQ0ZYX1RleHRTdHJlYW06OlJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIHJldHVybiBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKHBCdWZmZXIsIGlCdWZmZXJTaXplKTsNCit9DQoraW50MzJfdCBDRlhfVGV4dFN0cmVhbTo6V3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIHJldHVybiBtX3BTdHJlYW1JbXAtPldyaXRlRGF0YShwQnVmZmVyLCBpQnVmZmVyU2l6ZSk7DQorfQ0KK3ZvaWQgQ0ZYX1RleHRTdHJlYW06OkZsdXNoKCkgew0KKyAgbV9wU3RyZWFtSW1wLT5GbHVzaCgpOw0KK30NCitGWF9CT09MIENGWF9UZXh0U3RyZWFtOjpTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKSB7DQorICByZXR1cm4gbV9wU3RyZWFtSW1wLT5TZXRMZW5ndGgoaUxlbmd0aCk7DQorfQ0KK0ZYX1dPUkQgQ0ZYX1RleHRTdHJlYW06OkdldENvZGVQYWdlKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fd0NvZGVQYWdlOw0KK30NCitJRlhfU3RyZWFtKiBDRlhfVGV4dFN0cmVhbTo6Q3JlYXRlU2hhcmVkU3RyZWFtKEZYX0RXT1JEIGR3QWNjZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpT2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBJRlhfU3RyZWFtKiBwU1IgPQ0KKyAgICAgIG1fcFN0cmVhbUltcC0+Q3JlYXRlU2hhcmVkU3RyZWFtKGR3QWNjZXNzLCBpT2Zmc2V0LCBpTGVuZ3RoKTsNCisgIGlmIChwU1IgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQorICAgIElGWF9TdHJlYW0qIHBUUiA9IEZYX05FVyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KKyAgICBpZiAocFRSID09IE5VTEwpIHsNCisgICAgICBwU1ItPlJlbGVhc2UoKTsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KKyAgICByZXR1cm4gcFRSOw0KKyAgfQ0KKyAgcmV0dXJuIHBTUjsNCiB9DQotSUZYX1N0cmVhbSogQ0ZYX1RleHRTdHJlYW06OlJldGFpbigpDQotew0KLSAgICBtX2lSZWZDb3VudCsrOw0KLSAgICByZXR1cm4gdGhpczsNCitpbnQzMl90IENGWF9UZXh0U3RyZWFtOjpHZXRCT00odWludDhfdCBib21bNF0pIGNvbnN0IHsNCisgIGlmIChtX3dCT01MZW5ndGggPCAxKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgKihGWF9EV09SRCopYm9tID0gbV9kd0JPTTsNCisgIHJldHVybiAoaW50MzJfdCltX3dCT01MZW5ndGg7DQogfQ0KLUZYX0RXT1JEIENGWF9UZXh0U3RyZWFtOjpHZXRBY2Nlc3NNb2RlcygpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wU3RyZWFtSW1wLT5HZXRBY2Nlc3NNb2RlcygpIHwgRlhfU1RSRUFNQUNDRVNTX1RleHQ7DQotfQ0KLWludDMyX3QgQ0ZYX1RleHRTdHJlYW06OkdldExlbmd0aCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCi19DQotaW50MzJfdCBDRlhfVGV4dFN0cmVhbTo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpDQotew0KLSAgICByZXR1cm4gbV9wU3RyZWFtSW1wLT5TZWVrKGVTZWVrLCBpT2Zmc2V0KTsNCi19DQotaW50MzJfdCBDRlhfVGV4dFN0cmVhbTo6R2V0UG9zaXRpb24oKQ0KLXsNCi0gICAgcmV0dXJuIG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKTsNCi19DQotRlhfQk9PTCBDRlhfVGV4dFN0cmVhbTo6SXNFT0YoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fcFN0cmVhbUltcC0+SXNFT0YoKTsNCi19DQotaW50MzJfdCBDRlhfVGV4dFN0cmVhbTo6UmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkNCi17DQotICAgIHJldHVybiBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKHBCdWZmZXIsIGlCdWZmZXJTaXplKTsNCi19DQotaW50MzJfdCBDRlhfVGV4dFN0cmVhbTo6V3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpDQotew0KLSAgICByZXR1cm4gbV9wU3RyZWFtSW1wLT5Xcml0ZURhdGEocEJ1ZmZlciwgaUJ1ZmZlclNpemUpOw0KLX0NCi12b2lkIENGWF9UZXh0U3RyZWFtOjpGbHVzaCgpDQotew0KLSAgICBtX3BTdHJlYW1JbXAtPkZsdXNoKCk7DQotfQ0KLUZYX0JPT0wgQ0ZYX1RleHRTdHJlYW06OlNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpDQotew0KLSAgICByZXR1cm4gbV9wU3RyZWFtSW1wLT5TZXRMZW5ndGgoaUxlbmd0aCk7DQotfQ0KLUZYX1dPUkQgQ0ZYX1RleHRTdHJlYW06OkdldENvZGVQYWdlKCkgY29uc3QNCi17DQorRlhfV09SRCBDRlhfVGV4dFN0cmVhbTo6U2V0Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgIGlmIChtX3dCT01MZW5ndGggPiAwKSB7DQogICAgIHJldHVybiBtX3dDb2RlUGFnZTsNCisgIH0NCisgIEZYX1dPUkQgdiA9IG1fd0NvZGVQYWdlOw0KKyAgbV93Q29kZVBhZ2UgPSB3Q29kZVBhZ2U7DQorICByZXR1cm4gdjsNCiB9DQotSUZYX1N0cmVhbSogQ0ZYX1RleHRTdHJlYW06OkNyZWF0ZVNoYXJlZFN0cmVhbShGWF9EV09SRCBkd0FjY2VzcywgaW50MzJfdCBpT2Zmc2V0LCBpbnQzMl90IGlMZW5ndGgpDQotew0KLSAgICBJRlhfU3RyZWFtICpwU1IgPSBtX3BTdHJlYW1JbXAtPkNyZWF0ZVNoYXJlZFN0cmVhbShkd0FjY2VzcywgaU9mZnNldCwgaUxlbmd0aCk7DQotICAgIGlmIChwU1IgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQoraW50MzJfdCBDRlhfVGV4dFN0cmVhbTo6UmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFT1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnN0KiBwQnl0ZVNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaU1heExlbmd0aCA+IDApOw0KKyAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGludDMyX3QgaUxlbjsNCisgIGlmIChtX3dDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEYxNkxFIHx8DQorICAgICAgbV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgew0KKyAgICBpbnQzMl90IGlCeXRlcyA9IHBCeXRlU2l6ZSA9PSBOVUxMID8gaU1heExlbmd0aCAqIDIgOiAqcEJ5dGVTaXplOw0KKyAgICBtX3BTdHJlYW1JbXAtPkxvY2soKTsNCisgICAgaUxlbiA9IG1fcFN0cmVhbUltcC0+UmVhZERhdGEoKHVpbnQ4X3QqKXBTdHIsIGlCeXRlcyk7DQorICAgIG1fcFN0cmVhbUltcC0+VW5sb2NrKCk7DQorICAgIGlNYXhMZW5ndGggPSBpTGVuIC8gMjsNCisgICAgaWYgKHNpemVvZihGWF9XQ0hBUikgPiAyKSB7DQorICAgICAgRlhfVVRGMTZUb1dDaGFyKHBTdHIsIGlNYXhMZW5ndGgpOw0KICAgICB9DQotICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQotICAgICAgICBJRlhfU3RyZWFtICpwVFIgPSBGWF9ORVcgQ0ZYX1RleHRTdHJlYW0ocFNSLCBUUlVFKTsNCi0gICAgICAgIGlmIChwVFIgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHBTUi0+UmVsZWFzZSgpOw0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHBUUjsNCi0gICAgfQ0KLSAgICByZXR1cm4gcFNSOw0KLX0NCi1pbnQzMl90IENGWF9UZXh0U3RyZWFtOjpHZXRCT00odWludDhfdCBib21bNF0pIGNvbnN0DQotew0KLSAgICBpZiAobV93Qk9NTGVuZ3RoIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgKihGWF9EV09SRCopYm9tID0gbV9kd0JPTTsNCi0gICAgcmV0dXJuIChpbnQzMl90KW1fd0JPTUxlbmd0aDsNCi19DQotRlhfV09SRCBDRlhfVGV4dFN0cmVhbTo6U2V0Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UpDQotew0KLSAgICBpZiAobV93Qk9NTGVuZ3RoID4gMCkgew0KLSAgICAgICAgcmV0dXJuIG1fd0NvZGVQYWdlOw0KLSAgICB9DQotICAgIEZYX1dPUkQgdiA9IG1fd0NvZGVQYWdlOw0KLSAgICBtX3dDb2RlUGFnZSA9IHdDb2RlUGFnZTsNCi0gICAgcmV0dXJuIHY7DQotfQ0KLWludDMyX3QgQ0ZYX1RleHRTdHJlYW06OlJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaU1heExlbmd0aCwgRlhfQk9PTCAmYkVPUywgaW50MzJfdCBjb25zdCAqcEJ5dGVTaXplKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCAmJiBpTWF4TGVuZ3RoID4gMCk7DQotICAgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIGludDMyX3QgaUxlbjsNCi0gICAgaWYgKG1fd0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2TEUgfHwgbV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgew0KLSAgICAgICAgaW50MzJfdCBpQnl0ZXMgPSBwQnl0ZVNpemUgPT0gTlVMTCA/IGlNYXhMZW5ndGggKiAyIDogKnBCeXRlU2l6ZTsNCi0gICAgICAgIG1fcFN0cmVhbUltcC0+TG9jaygpOw0KLSAgICAgICAgaUxlbiA9IG1fcFN0cmVhbUltcC0+UmVhZERhdGEoKHVpbnQ4X3QqKXBTdHIsIGlCeXRlcyk7DQotICAgICAgICBtX3BTdHJlYW1JbXAtPlVubG9jaygpOw0KLSAgICAgICAgaU1heExlbmd0aCA9IGlMZW4gLyAyOw0KLSAgICAgICAgaWYgKHNpemVvZihGWF9XQ0hBUikgPiAyKSB7DQotICAgICAgICAgICAgRlhfVVRGMTZUb1dDaGFyKHBTdHIsIGlNYXhMZW5ndGgpOw0KLSAgICAgICAgfQ0KICNpZiBfRlhfRU5ESUFOXyA9PSBfRlhfQklHX0VORElBTl8NCi0gICAgICAgIGlmIChtX3dDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEYxNkxFKSB7DQotICAgICAgICAgICAgRlhfU3dhcEJ5dGVPcmRlcihwU3RyLCBpTWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCisgICAgaWYgKG1fd0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2TEUpIHsNCisgICAgICBGWF9Td2FwQnl0ZU9yZGVyKHBTdHIsIGlNYXhMZW5ndGgpOw0KKyAgICB9DQogI2Vsc2UNCi0gICAgICAgIGlmIChtX3dDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEYxNkJFKSB7DQotICAgICAgICAgICAgRlhfU3dhcEJ5dGVPcmRlcihwU3RyLCBpTWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCisgICAgaWYgKG1fd0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2QkUpIHsNCisgICAgICBGWF9Td2FwQnl0ZU9yZGVyKHBTdHIsIGlNYXhMZW5ndGgpOw0KKyAgICB9DQogI2VuZGlmDQotICAgIH0gZWxzZSB7DQotICAgICAgICBpbnQzMl90IHBvcyA9IG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKTsNCi0gICAgICAgIGludDMyX3QgaUJ5dGVzID0gcEJ5dGVTaXplID09IE5VTEwgPyBpTWF4TGVuZ3RoIDogKnBCeXRlU2l6ZTsNCi0gICAgICAgIGlCeXRlcyA9IEZYX01JTihpQnl0ZXMsIG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCkgLSBwb3MpOw0KLSAgICAgICAgaWYgKGlCeXRlcyA+IDApIHsNCi0gICAgICAgICAgICBpZiAobV9wQnVmID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgbV9wQnVmID0gKHVpbnQ4X3QqKUZYX0FsbG9jKHVpbnQ4X3QsIGlCeXRlcyk7DQotICAgICAgICAgICAgICAgIG1faUJ1ZlNpemUgPSBpQnl0ZXM7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChpQnl0ZXMgPiBtX2lCdWZTaXplKSB7DQotICAgICAgICAgICAgICAgIG1fcEJ1ZiA9ICh1aW50OF90KilGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcEJ1ZiwgaUJ5dGVzKTsNCi0gICAgICAgICAgICAgICAgbV9pQnVmU2l6ZSA9IGlCeXRlczsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9wU3RyZWFtSW1wLT5Mb2NrKCk7DQotICAgICAgICAgICAgaUxlbiA9IG1fcFN0cmVhbUltcC0+UmVhZERhdGEobV9wQnVmLCBpQnl0ZXMpOw0KLSAgICAgICAgICAgIGludDMyX3QgaVNyYyA9IGlMZW47DQotICAgICAgICAgICAgaW50MzJfdCBpRGVjb2RlID0gRlhfRGVjb2RlU3RyaW5nKG1fd0NvZGVQYWdlLCAoY29uc3QgRlhfQ0hBUiopbV9wQnVmLCAmaVNyYywgcFN0ciwgJmlNYXhMZW5ndGgsIFRSVUUpOw0KLSAgICAgICAgICAgIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0N1cnJlbnQsIGlTcmMgLSBpTGVuKTsNCi0gICAgICAgICAgICBtX3BTdHJlYW1JbXAtPlVubG9jaygpOw0KLSAgICAgICAgICAgIGlmIChpRGVjb2RlIDwgMSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpTWF4TGVuZ3RoID0gMDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBiRU9TID0gbV9wU3RyZWFtSW1wLT5Jc0VPRigpOw0KLSAgICByZXR1cm4gaU1heExlbmd0aDsNCi19DQotaW50MzJfdCBDRlhfVGV4dFN0cmVhbTo6V3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KLSAgICBpZiAoKG1fcFN0cmVhbUltcC0+R2V0QWNjZXNzTW9kZXMoKSAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBwb3MgPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICAgIGludDMyX3QgaUJ5dGVzID0gcEJ5dGVTaXplID09IE5VTEwgPyBpTWF4TGVuZ3RoIDogKnBCeXRlU2l6ZTsNCisgICAgaUJ5dGVzID0gRlhfTUlOKGlCeXRlcywgbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKSAtIHBvcyk7DQorICAgIGlmIChpQnl0ZXMgPiAwKSB7DQorICAgICAgaWYgKG1fcEJ1ZiA9PSBOVUxMKSB7DQorICAgICAgICBtX3BCdWYgPSAodWludDhfdCopRlhfQWxsb2ModWludDhfdCwgaUJ5dGVzKTsNCisgICAgICAgIG1faUJ1ZlNpemUgPSBpQnl0ZXM7DQorICAgICAgfSBlbHNlIGlmIChpQnl0ZXMgPiBtX2lCdWZTaXplKSB7DQorICAgICAgICBtX3BCdWYgPSAodWludDhfdCopRlhfUmVhbGxvYyh1aW50OF90LCBtX3BCdWYsIGlCeXRlcyk7DQorICAgICAgICBtX2lCdWZTaXplID0gaUJ5dGVzOw0KKyAgICAgIH0NCisgICAgICBtX3BTdHJlYW1JbXAtPkxvY2soKTsNCisgICAgICBpTGVuID0gbV9wU3RyZWFtSW1wLT5SZWFkRGF0YShtX3BCdWYsIGlCeXRlcyk7DQorICAgICAgaW50MzJfdCBpU3JjID0gaUxlbjsNCisgICAgICBpbnQzMl90IGlEZWNvZGUgPSBGWF9EZWNvZGVTdHJpbmcobV93Q29kZVBhZ2UsIChjb25zdCBGWF9DSEFSKiltX3BCdWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpU3JjLCBwU3RyLCAmaU1heExlbmd0aCwgVFJVRSk7DQorICAgICAgbV9wU3RyZWFtSW1wLT5TZWVrKEZYX1NUUkVBTVNFRUtfQ3VycmVudCwgaVNyYyAtIGlMZW4pOw0KKyAgICAgIG1fcFN0cmVhbUltcC0+VW5sb2NrKCk7DQorICAgICAgaWYgKGlEZWNvZGUgPCAxKSB7DQogICAgICAgICByZXR1cm4gLTE7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlNYXhMZW5ndGggPSAwOw0KICAgICB9DQotICAgIGlmIChtX3dDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEY4KSB7DQotICAgICAgICBpbnQzMl90IGxlbiA9IGlMZW5ndGg7DQotICAgICAgICBDRlhfVVRGOEVuY29kZXIgZW5jb2RlcjsNCi0gICAgICAgIHdoaWxlIChsZW4gLS0gPiAwKSB7DQotICAgICAgICAgICAgZW5jb2Rlci5JbnB1dCgqcFN0ciArKyk7DQotICAgICAgICB9DQotICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNSZXN1bHQgPSBlbmNvZGVyLkdldFJlc3VsdCgpOw0KLSAgICAgICAgbV9wU3RyZWFtSW1wLT5Mb2NrKCk7DQotICAgICAgICBtX3BTdHJlYW1JbXAtPldyaXRlRGF0YSgoY29uc3QgdWludDhfdCopYnNSZXN1bHQuR2V0Q1N0cigpLCBic1Jlc3VsdC5HZXRMZW5ndGgoKSk7DQotICAgICAgICBtX3BTdHJlYW1JbXAtPlVubG9jaygpOw0KKyAgfQ0KKyAgYkVPUyA9IG1fcFN0cmVhbUltcC0+SXNFT0YoKTsNCisgIHJldHVybiBpTWF4TGVuZ3RoOw0KK30NCitpbnQzMl90IENGWF9UZXh0U3RyZWFtOjpXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIGlmICgobV9wU3RyZWFtSW1wLT5HZXRBY2Nlc3NNb2RlcygpICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSA9PSAwKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGlmIChtX3dDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEY4KSB7DQorICAgIGludDMyX3QgbGVuID0gaUxlbmd0aDsNCisgICAgQ0ZYX1VURjhFbmNvZGVyIGVuY29kZXI7DQorICAgIHdoaWxlIChsZW4tLSA+IDApIHsNCisgICAgICBlbmNvZGVyLklucHV0KCpwU3RyKyspOw0KICAgICB9DQotICAgIHJldHVybiBpTGVuZ3RoOw0KKyAgICBDRlhfQnl0ZVN0cmluZ0MgYnNSZXN1bHQgPSBlbmNvZGVyLkdldFJlc3VsdCgpOw0KKyAgICBtX3BTdHJlYW1JbXAtPkxvY2soKTsNCisgICAgbV9wU3RyZWFtSW1wLT5Xcml0ZURhdGEoKGNvbnN0IHVpbnQ4X3QqKWJzUmVzdWx0LkdldENTdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNSZXN1bHQuR2V0TGVuZ3RoKCkpOw0KKyAgICBtX3BTdHJlYW1JbXAtPlVubG9jaygpOw0KKyAgfQ0KKyAgcmV0dXJuIGlMZW5ndGg7DQogfQ0KIENGWF9TdHJlYW06OkNGWF9TdHJlYW0oKQ0KLSAgICA6IG1fZVN0cmVhbVR5cGUoRlhfU1JFQU1UWVBFX1Vua25vd24pDQotICAgICwgbV9wU3RyZWFtSW1wKE5VTEwpDQotICAgICwgbV9kd0FjY2VzcygwKQ0KLSAgICAsIG1faVRvdGFsU2l6ZSgwKQ0KLSAgICAsIG1faVBvc2l0aW9uKDApDQotICAgICwgbV9pU3RhcnQoMCkNCi0gICAgLCBtX2lMZW5ndGgoMCkNCi0gICAgLCBtX2lSZWZDb3VudCgxKQ0KLXsNCisgICAgOiBtX2VTdHJlYW1UeXBlKEZYX1NSRUFNVFlQRV9Vbmtub3duKSwNCisgICAgICBtX3BTdHJlYW1JbXAoTlVMTCksDQorICAgICAgbV9kd0FjY2VzcygwKSwNCisgICAgICBtX2lUb3RhbFNpemUoMCksDQorICAgICAgbV9pUG9zaXRpb24oMCksDQorICAgICAgbV9pU3RhcnQoMCksDQorICAgICAgbV9pTGVuZ3RoKDApLA0KKyAgICAgIG1faVJlZkNvdW50KDEpIHt9DQorQ0ZYX1N0cmVhbTo6fkNGWF9TdHJlYW0oKSB7DQorICBpZiAobV9lU3RyZWFtVHlwZSAhPSBGWF9TVFJFQU1UWVBFX1N0cmVhbSAmJiBtX3BTdHJlYW1JbXAgIT0gTlVMTCkgew0KKyAgICBtX3BTdHJlYW1JbXAtPlJlbGVhc2UoKTsNCisgIH0NCiB9DQotQ0ZYX1N0cmVhbTo6fkNGWF9TdHJlYW0oKQ0KLXsNCi0gICAgaWYgKG1fZVN0cmVhbVR5cGUgIT0gRlhfU1RSRUFNVFlQRV9TdHJlYW0gJiYgbV9wU3RyZWFtSW1wICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KLSAgICB9DQorRlhfQk9PTCBDRlhfU3RyZWFtOjpMb2FkRmlsZShjb25zdCBGWF9XQ0hBUiogcHN6U3JjRmlsZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0FjY2Vzcykgew0KKyAgaWYgKG1fZVN0cmVhbVR5cGUgIT0gRlhfU1JFQU1UWVBFX1Vua25vd24gfHwgbV9wU3RyZWFtSW1wICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBzelNyY0ZpbGVOYW1lID09IE5VTEwgfHwgRlhTWVNfd2NzbGVuKHBzelNyY0ZpbGVOYW1lKSA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9wU3RyZWFtSW1wID0gRlhfTkVXIENGWF9GaWxlU3RyZWFtSW1wKCk7DQorICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmV0ID0NCisgICAgICAoKENGWF9GaWxlU3RyZWFtSW1wKiltX3BTdHJlYW1JbXApLT5Mb2FkRmlsZShwc3pTcmNGaWxlTmFtZSwgZHdBY2Nlc3MpOw0KKyAgaWYgKCFiUmV0KSB7DQorICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KKyAgICBtX3BTdHJlYW1JbXAgPSBOVUxMOw0KKyAgfSBlbHNlIHsNCisgICAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfRmlsZTsNCisgICAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KKyAgICBtX2lMZW5ndGggPSBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQogfQ0KLUZYX0JPT0wgQ0ZYX1N0cmVhbTo6TG9hZEZpbGUoY29uc3QgRlhfV0NIQVIqIHBzelNyY0ZpbGVOYW1lLCBGWF9EV09SRCBkd0FjY2VzcykNCi17DQotICAgIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCAhPSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKHBzelNyY0ZpbGVOYW1lID09IE5VTEwgfHwgRlhTWVNfd2NzbGVuKHBzelNyY0ZpbGVOYW1lKSA8IDEpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX3BTdHJlYW1JbXAgPSBGWF9ORVcgQ0ZYX0ZpbGVTdHJlYW1JbXAoKTsNCi0gICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiUmV0ID0gKChDRlhfRmlsZVN0cmVhbUltcCopbV9wU3RyZWFtSW1wKS0+TG9hZEZpbGUocHN6U3JjRmlsZU5hbWUsIGR3QWNjZXNzKTsNCi0gICAgaWYgKCFiUmV0KSB7DQotICAgICAgICBtX3BTdHJlYW1JbXAtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcFN0cmVhbUltcCA9IE5VTEw7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX2VTdHJlYW1UeXBlID0gRlhfU1RSRUFNVFlQRV9GaWxlOw0KLSAgICAgICAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KLSAgICAgICAgbV9pTGVuZ3RoID0gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gYlJldDsNCitGWF9CT09MIENGWF9TdHJlYW06OkxvYWRGaWxlUmVhZChJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCwgRlhfRFdPUkQgZHdBY2Nlc3MpIHsNCisgIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwRmlsZVJlYWQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3BTdHJlYW1JbXAgPSBGWF9ORVcgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wKCk7DQorICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmV0ID0NCisgICAgICAoKENGWF9GaWxlUmVhZFN0cmVhbUltcCopbV9wU3RyZWFtSW1wKS0+TG9hZEZpbGVSZWFkKHBGaWxlUmVhZCwgZHdBY2Nlc3MpOw0KKyAgaWYgKCFiUmV0KSB7DQorICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KKyAgICBtX3BTdHJlYW1JbXAgPSBOVUxMOw0KKyAgfSBlbHNlIHsNCisgICAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfRmlsZTsNCisgICAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KKyAgICBtX2lMZW5ndGggPSBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQogfQ0KLUZYX0JPT0wgQ0ZYX1N0cmVhbTo6TG9hZEZpbGVSZWFkKElGWF9GaWxlUmVhZCAqcEZpbGVSZWFkLCBGWF9EV09SRCBkd0FjY2VzcykNCi17DQotICAgIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCAhPSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKHBGaWxlUmVhZCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgbV9wU3RyZWFtSW1wID0gRlhfTkVXIENGWF9GaWxlUmVhZFN0cmVhbUltcCgpOw0KLSAgICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJSZXQgPSAoKENGWF9GaWxlUmVhZFN0cmVhbUltcCopbV9wU3RyZWFtSW1wKS0+TG9hZEZpbGVSZWFkKHBGaWxlUmVhZCwgZHdBY2Nlc3MpOw0KLSAgICBpZiAoIWJSZXQpIHsNCi0gICAgICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wU3RyZWFtSW1wID0gTlVMTDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1fZVN0cmVhbVR5cGUgPSBGWF9TVFJFQU1UWVBFX0ZpbGU7DQotICAgICAgICBtX2R3QWNjZXNzID0gZHdBY2Nlc3M7DQotICAgICAgICBtX2lMZW5ndGggPSBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOw0KLSAgICB9DQotICAgIHJldHVybiBiUmV0Ow0KK0ZYX0JPT0wgQ0ZYX1N0cmVhbTo6TG9hZEZpbGVXcml0ZShJRlhfRmlsZVdyaXRlKiBwRmlsZVdyaXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0FjY2Vzcykgew0KKyAgaWYgKG1fZVN0cmVhbVR5cGUgIT0gRlhfU1JFQU1UWVBFX1Vua25vd24gfHwgbV9wU3RyZWFtSW1wICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBGaWxlV3JpdGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3BTdHJlYW1JbXAgPSBGWF9ORVcgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcCgpOw0KKyAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0JPT0wgYlJldCA9ICgoQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcCopbV9wU3RyZWFtSW1wKQ0KKyAgICAgICAgICAgICAgICAgICAgIC0+TG9hZEZpbGVXcml0ZShwRmlsZVdyaXRlLCBkd0FjY2Vzcyk7DQorICBpZiAoIWJSZXQpIHsNCisgICAgbV9wU3RyZWFtSW1wLT5SZWxlYXNlKCk7DQorICAgIG1fcFN0cmVhbUltcCA9IE5VTEw7DQorICB9IGVsc2Ugew0KKyAgICBtX2VTdHJlYW1UeXBlID0gRlhfU1RSRUFNVFlQRV9GaWxlOw0KKyAgICBtX2R3QWNjZXNzID0gZHdBY2Nlc3M7DQorICAgIG1faUxlbmd0aCA9IG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCk7DQorICB9DQorICByZXR1cm4gYlJldDsNCiB9DQotRlhfQk9PTCBDRlhfU3RyZWFtOjpMb2FkRmlsZVdyaXRlKElGWF9GaWxlV3JpdGUgKnBGaWxlV3JpdGUsIEZYX0RXT1JEIGR3QWNjZXNzKQ0KLXsNCi0gICAgaWYgKG1fZVN0cmVhbVR5cGUgIT0gRlhfU1JFQU1UWVBFX1Vua25vd24gfHwgbV9wU3RyZWFtSW1wICE9IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAocEZpbGVXcml0ZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgbV9wU3RyZWFtSW1wID0gRlhfTkVXIENGWF9GaWxlV3JpdGVTdHJlYW1JbXAoKTsNCi0gICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiUmV0ID0gKChDRlhfRmlsZVdyaXRlU3RyZWFtSW1wKiltX3BTdHJlYW1JbXApLT5Mb2FkRmlsZVdyaXRlKHBGaWxlV3JpdGUsIGR3QWNjZXNzKTsNCi0gICAgaWYgKCFiUmV0KSB7DQotICAgICAgICBtX3BTdHJlYW1JbXAtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcFN0cmVhbUltcCA9IE5VTEw7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX2VTdHJlYW1UeXBlID0gRlhfU1RSRUFNVFlQRV9GaWxlOw0KLSAgICAgICAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KLSAgICAgICAgbV9pTGVuZ3RoID0gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gYlJldDsNCitGWF9CT09MIENGWF9TdHJlYW06OkxvYWRCdWZmZXIodWludDhfdCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRvdGFsU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MpIHsNCisgIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwRGF0YSA9PSBOVUxMIHx8IGlUb3RhbFNpemUgPCAxKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fcFN0cmVhbUltcCA9IEZYX05FVyBDRlhfQnVmZmVyU3RyZWFtSW1wKCk7DQorICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmV0ID0gKChDRlhfQnVmZmVyU3RyZWFtSW1wKiltX3BTdHJlYW1JbXApDQorICAgICAgICAgICAgICAgICAgICAgLT5Mb2FkQnVmZmVyKHBEYXRhLCBpVG90YWxTaXplLCBkd0FjY2Vzcyk7DQorICBpZiAoIWJSZXQpIHsNCisgICAgbV9wU3RyZWFtSW1wLT5SZWxlYXNlKCk7DQorICAgIG1fcFN0cmVhbUltcCA9IE5VTEw7DQorICB9IGVsc2Ugew0KKyAgICBtX2VTdHJlYW1UeXBlID0gRlhfU1RSRUFNVFlQRV9CdWZmZXI7DQorICAgIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCisgICAgbV9pTGVuZ3RoID0gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KIH0NCi1GWF9CT09MIENGWF9TdHJlYW06OkxvYWRCdWZmZXIodWludDhfdCogcERhdGEsIGludDMyX3QgaVRvdGFsU2l6ZSwgRlhfRFdPUkQgZHdBY2Nlc3MpDQotew0KLSAgICBpZiAobV9lU3RyZWFtVHlwZSAhPSBGWF9TUkVBTVRZUEVfVW5rbm93biB8fCBtX3BTdHJlYW1JbXAgIT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmIChwRGF0YSA9PSBOVUxMIHx8IGlUb3RhbFNpemUgPCAxKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgbV9wU3RyZWFtSW1wID0gRlhfTkVXIENGWF9CdWZmZXJTdHJlYW1JbXAoKTsNCi0gICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiUmV0ID0gKChDRlhfQnVmZmVyU3RyZWFtSW1wKiltX3BTdHJlYW1JbXApLT5Mb2FkQnVmZmVyKHBEYXRhLCBpVG90YWxTaXplLCBkd0FjY2Vzcyk7DQotICAgIGlmICghYlJldCkgew0KLSAgICAgICAgbV9wU3RyZWFtSW1wLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BTdHJlYW1JbXAgPSBOVUxMOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfQnVmZmVyOw0KLSAgICAgICAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KLSAgICAgICAgbV9pTGVuZ3RoID0gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gYlJldDsNCitGWF9CT09MIENGWF9TdHJlYW06OkxvYWRCdWZmZXJSZWFkKElGWF9CdWZmZXJSZWFkKiBwQnVmZmVyUmVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZpbGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlQnVmZmVyUmVhZCkgew0KKyAgaWYgKG1fZVN0cmVhbVR5cGUgIT0gRlhfU1JFQU1UWVBFX1Vua25vd24gfHwgbV9wU3RyZWFtSW1wICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFwQnVmZmVyUmVhZCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3BTdHJlYW1JbXAgPSBGWF9ORVcgQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXA7DQorICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmV0ID0gKChDRlhfQnVmZmVyUmVhZFN0cmVhbUltcCopbV9wU3RyZWFtSW1wKQ0KKyAgICAgICAgICAgICAgICAgICAgIC0+TG9hZEJ1ZmZlclJlYWQocEJ1ZmZlclJlYWQsIGlGaWxlU2l6ZSwgZHdBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVsZWFzZUJ1ZmZlclJlYWQpOw0KKyAgaWYgKCFiUmV0KSB7DQorICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KKyAgICBtX3BTdHJlYW1JbXAgPSBOVUxMOw0KKyAgfSBlbHNlIHsNCisgICAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfQnVmZmVyUmVhZDsNCisgICAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KKyAgICBtX2lMZW5ndGggPSBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQogfQ0KLUZYX0JPT0wgQ0ZYX1N0cmVhbTo6TG9hZEJ1ZmZlclJlYWQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBpbnQzMl90IGlGaWxlU2l6ZSwgRlhfRFdPUkQgZHdBY2Nlc3MsIEZYX0JPT0wgYlJlbGVhc2VCdWZmZXJSZWFkKQ0KLXsNCi0gICAgaWYgKG1fZVN0cmVhbVR5cGUgIT0gRlhfU1JFQU1UWVBFX1Vua25vd24gfHwgbV9wU3RyZWFtSW1wICE9IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoIXBCdWZmZXJSZWFkKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgbV9wU3RyZWFtSW1wID0gRlhfTkVXIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOw0KLSAgICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJSZXQgPSAoKENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wKiltX3BTdHJlYW1JbXApLT5Mb2FkQnVmZmVyUmVhZChwQnVmZmVyUmVhZCwgaUZpbGVTaXplLCBkd0FjY2VzcywgYlJlbGVhc2VCdWZmZXJSZWFkKTsNCi0gICAgaWYgKCFiUmV0KSB7DQotICAgICAgICBtX3BTdHJlYW1JbXAtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcFN0cmVhbUltcCA9IE5VTEw7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX2VTdHJlYW1UeXBlID0gRlhfU1RSRUFNVFlQRV9CdWZmZXJSZWFkOw0KLSAgICAgICAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KLSAgICAgICAgbV9pTGVuZ3RoID0gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gYlJldDsNCit2b2lkIENGWF9TdHJlYW06OlJlbGVhc2UoKSB7DQorICBpZiAoLS1tX2lSZWZDb3VudCA8IDEpIHsNCisgICAgZGVsZXRlIHRoaXM7DQorICB9DQogfQ0KLXZvaWQgQ0ZYX1N0cmVhbTo6UmVsZWFzZSgpDQotew0KLSAgICBpZiAoLS1tX2lSZWZDb3VudCA8IDEpIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQorSUZYX1N0cmVhbSogQ0ZYX1N0cmVhbTo6UmV0YWluKCkgew0KKyAgbV9pUmVmQ291bnQrKzsNCisgIHJldHVybiB0aGlzOw0KIH0NCi1JRlhfU3RyZWFtKiBDRlhfU3RyZWFtOjpSZXRhaW4oKQ0KLXsNCi0gICAgbV9pUmVmQ291bnQrKzsNCi0gICAgcmV0dXJuIHRoaXM7DQoraW50MzJfdCBDRlhfU3RyZWFtOjpHZXRMZW5ndGgoKSBjb25zdCB7DQorICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaWYgKG1fZVN0cmVhbVR5cGUgPT0gRlhfU1RSRUFNVFlQRV9GaWxlIHx8DQorICAgICAgbV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0J1ZmZlcikgew0KKyAgICByZXR1cm4gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCisgIH0NCisgIHJldHVybiBtX2lMZW5ndGg7DQogfQ0KLWludDMyX3QgQ0ZYX1N0cmVhbTo6R2V0TGVuZ3RoKCkgY29uc3QNCi17DQotICAgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIGlmIChtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfRmlsZSB8fCBtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfQnVmZmVyKSB7DQotICAgICAgICByZXR1cm4gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9pTGVuZ3RoOw0KK2ludDMyX3QgQ0ZYX1N0cmVhbTo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpIHsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0ZpbGUgfHwNCisgICAgICBtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfQnVmZmVyKSB7DQorICAgIHJldHVybiBtX2lQb3NpdGlvbiA9IG1fcFN0cmVhbUltcC0+U2VlayhlU2VlaywgaU9mZnNldCk7DQorICB9DQorICBpbnQzMl90IGlFbmQgPSBtX2lTdGFydCArIG1faUxlbmd0aDsNCisgIGludDMyX3QgaVBvc2l0aW9uID0gbV9pU3RhcnQgKyBpT2Zmc2V0Ow0KKyAgaWYgKGVTZWVrID09IEZYX1NUUkVBTVNFRUtfQmVnaW4pIHsNCisgICAgbV9pUG9zaXRpb24gPSBpUG9zaXRpb247DQorICB9IGVsc2UgaWYgKGVTZWVrID09IEZYX1NUUkVBTVNFRUtfQ3VycmVudCkgew0KKyAgICBtX2lQb3NpdGlvbiArPSBpT2Zmc2V0Ow0KKyAgfSBlbHNlIGlmIChlU2VlayA9PSBGWF9TVFJFQU1TRUVLX0VuZCkgew0KKyAgICBtX2lQb3NpdGlvbiA9IGlFbmQgKyBpT2Zmc2V0Ow0KKyAgfQ0KKyAgaWYgKG1faVBvc2l0aW9uID4gaUVuZCkgew0KKyAgICBtX2lQb3NpdGlvbiA9IGlFbmQ7DQorICB9DQorICBpZiAobV9pUG9zaXRpb24gPCBtX2lTdGFydCkgew0KKyAgICBtX2lQb3NpdGlvbiA9IG1faVN0YXJ0Ow0KKyAgfQ0KKyAgcmV0dXJuIG1faVBvc2l0aW9uIC0gbV9pU3RhcnQ7DQogfQ0KLWludDMyX3QgQ0ZYX1N0cmVhbTo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpDQotew0KLSAgICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0ZpbGUgfHwgbV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0J1ZmZlcikgew0KLSAgICAgICAgcmV0dXJuIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5TZWVrKGVTZWVrLCBpT2Zmc2V0KTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlFbmQgPSBtX2lTdGFydCArIG1faUxlbmd0aDsNCi0gICAgaW50MzJfdCBpUG9zaXRpb24gPSBtX2lTdGFydCArIGlPZmZzZXQ7DQotICAgIGlmIChlU2VlayA9PSBGWF9TVFJFQU1TRUVLX0JlZ2luKSB7DQotICAgICAgICBtX2lQb3NpdGlvbiA9IGlQb3NpdGlvbjsNCi0gICAgfSBlbHNlIGlmIChlU2VlayA9PSBGWF9TVFJFQU1TRUVLX0N1cnJlbnQpIHsNCi0gICAgICAgIG1faVBvc2l0aW9uICs9IGlPZmZzZXQ7DQotICAgIH0gZWxzZSBpZiAoZVNlZWsgPT0gRlhfU1RSRUFNU0VFS19FbmQpIHsNCi0gICAgICAgIG1faVBvc2l0aW9uID0gaUVuZCArIGlPZmZzZXQ7DQotICAgIH0NCi0gICAgaWYgKG1faVBvc2l0aW9uID4gaUVuZCkgew0KLSAgICAgICAgbV9pUG9zaXRpb24gPSBpRW5kOw0KLSAgICB9DQotICAgIGlmIChtX2lQb3NpdGlvbiA8IG1faVN0YXJ0KSB7DQotICAgICAgICBtX2lQb3NpdGlvbiA9IG1faVN0YXJ0Ow0KLSAgICB9DQotICAgIHJldHVybiBtX2lQb3NpdGlvbiAtIG1faVN0YXJ0Ow0KK2ludDMyX3QgQ0ZYX1N0cmVhbTo6R2V0UG9zaXRpb24oKSB7DQorICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaWYgKG1fZVN0cmVhbVR5cGUgPT0gRlhfU1RSRUFNVFlQRV9GaWxlIHx8DQorICAgICAgbV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0J1ZmZlcikgew0KKyAgICByZXR1cm4gbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICB9DQorICByZXR1cm4gbV9pUG9zaXRpb24gLSBtX2lTdGFydDsNCiB9DQotaW50MzJfdCBDRlhfU3RyZWFtOjpHZXRQb3NpdGlvbigpDQotew0KLSAgICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0ZpbGUgfHwgbV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0J1ZmZlcikgew0KLSAgICAgICAgcmV0dXJuIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpOw0KLSAgICB9DQotICAgIHJldHVybiBtX2lQb3NpdGlvbiAtIG1faVN0YXJ0Ow0KK0ZYX0JPT0wgQ0ZYX1N0cmVhbTo6SXNFT0YoKSBjb25zdCB7DQorICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0ZpbGUgfHwNCisgICAgICBtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfQnVmZmVyKSB7DQorICAgIHJldHVybiBtX3BTdHJlYW1JbXAtPklzRU9GKCk7DQorICB9DQorICByZXR1cm4gbV9pUG9zaXRpb24gPj0gbV9pU3RhcnQgKyBtX2lMZW5ndGg7DQogfQ0KLUZYX0JPT0wgQ0ZYX1N0cmVhbTo6SXNFT0YoKSBjb25zdA0KLXsNCi0gICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0ZpbGUgfHwgbV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0J1ZmZlcikgew0KLSAgICAgICAgcmV0dXJuIG1fcFN0cmVhbUltcC0+SXNFT0YoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9pUG9zaXRpb24gPj0gbV9pU3RhcnQgKyBtX2lMZW5ndGg7DQotfQ0KLWludDMyX3QgQ0ZYX1N0cmVhbTo6UmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwKTsNCi0gICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgaW50MzJfdCBpTGVuID0gRlhfTUlOKG1faVN0YXJ0ICsgbV9pTGVuZ3RoIC0gbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKTsNCi0gICAgaWYgKGlMZW4gPD0gMCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgbV9wU3RyZWFtSW1wLT5Mb2NrKCk7DQotICAgIGlmIChtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCkgIT0gbV9pUG9zaXRpb24pIHsNCi0gICAgICAgIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBtX2lQb3NpdGlvbik7DQotICAgIH0NCi0gICAgaUxlbiA9IG1fcFN0cmVhbUltcC0+UmVhZERhdGEocEJ1ZmZlciwgaUxlbik7DQotICAgIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpOw0KLSAgICBtX3BTdHJlYW1JbXAtPlVubG9jaygpOw0KLSAgICByZXR1cm4gaUxlbjsNCi19DQotaW50MzJfdCBDRlhfU3RyZWFtOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MsIGludDMyX3QgY29uc3QgKnBCeXRlU2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaU1heExlbmd0aCA+IDApOw0KLSAgICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlFbmQgPSBtX2lTdGFydCArIG1faUxlbmd0aDsNCi0gICAgaW50MzJfdCBpTGVuID0gaUVuZCAtIG1faVBvc2l0aW9uOw0KLSAgICBpZiAocEJ5dGVTaXplICE9IE5VTEwpIHsNCi0gICAgICAgIGlMZW4gPSBGWF9NSU4oaUxlbiwgKnBCeXRlU2l6ZSk7DQotICAgIH0NCi0gICAgaUxlbiA9IEZYX01JTihpRW5kIC8gMiwgaU1heExlbmd0aCk7DQotICAgIGlmIChpTGVuIDw9IDApIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIG1fcFN0cmVhbUltcC0+TG9jaygpOw0KLSAgICBpZiAobV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpICE9IG1faVBvc2l0aW9uKSB7DQotICAgICAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgbV9pUG9zaXRpb24pOw0KLSAgICB9DQotICAgIGlMZW4gPSBtX3BTdHJlYW1JbXAtPlJlYWRTdHJpbmcocFN0ciwgaUxlbiwgYkVPUyk7DQotICAgIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpOw0KLSAgICBpZiAoaUxlbiA+IDAgJiYgbV9pUG9zaXRpb24gPj0gaUVuZCkgew0KLSAgICAgICAgYkVPUyA9IFRSVUU7DQotICAgIH0NCi0gICAgbV9wU3RyZWFtSW1wLT5VbmxvY2soKTsNCi0gICAgcmV0dXJuIGlMZW47DQotfQ0KLWludDMyX3QgQ0ZYX1N0cmVhbTo6V3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpDQotew0KLSAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQotICAgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIGlmICgobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIGludDMyX3QgaUxlbiA9IGlCdWZmZXJTaXplOw0KLSAgICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX1N0cmVhbSkgew0KLSAgICAgICAgaUxlbiA9IEZYX01JTihtX2lTdGFydCArIG1faVRvdGFsU2l6ZSAtIG1faVBvc2l0aW9uLCBpQnVmZmVyU2l6ZSk7DQotICAgICAgICBpZiAoaUxlbiA8PSAwKSB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9wU3RyZWFtSW1wLT5Mb2NrKCk7DQotICAgIGludDMyX3QgaUVuZCA9IG1faVN0YXJ0ICsgbV9pTGVuZ3RoOw0KLSAgICBpZiAobV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpICE9IG1faVBvc2l0aW9uKSB7DQotICAgICAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgbV9pUG9zaXRpb24pOw0KLSAgICB9DQotICAgIGlMZW4gPSBtX3BTdHJlYW1JbXAtPldyaXRlRGF0YShwQnVmZmVyLCBpTGVuKTsNCi0gICAgbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQotICAgIGlmIChtX2lQb3NpdGlvbiA+IGlFbmQpIHsNCi0gICAgICAgIG1faUxlbmd0aCA9IG1faVBvc2l0aW9uIC0gbV9pU3RhcnQ7DQotICAgIH0NCi0gICAgbV9wU3RyZWFtSW1wLT5VbmxvY2soKTsNCi0gICAgcmV0dXJuIGlMZW47DQotfQ0KLWludDMyX3QgQ0ZYX1N0cmVhbTo6V3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KLSAgICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlMZW4gPSBpTGVuZ3RoOw0KLSAgICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX1N0cmVhbSkgew0KLSAgICAgICAgaUxlbiA9IEZYX01JTigobV9pU3RhcnQgKyBtX2lUb3RhbFNpemUgLSBtX2lQb3NpdGlvbikgLyAyLCBpTGVuZ3RoKTsNCi0gICAgICAgIGlmIChpTGVuIDw9IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX3BTdHJlYW1JbXAtPkxvY2soKTsNCi0gICAgaW50MzJfdCBpRW5kID0gbV9pU3RhcnQgKyBtX2lMZW5ndGg7DQotICAgIGlmIChtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCkgIT0gbV9pUG9zaXRpb24pIHsNCi0gICAgICAgIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBtX2lQb3NpdGlvbik7DQotICAgIH0NCi0gICAgaUxlbiA9IG1fcFN0cmVhbUltcC0+V3JpdGVTdHJpbmcocFN0ciwgaUxlbik7DQotICAgIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpOw0KLSAgICBpZiAobV9pUG9zaXRpb24gPiBpRW5kKSB7DQotICAgICAgICBtX2lMZW5ndGggPSBtX2lQb3NpdGlvbiAtIG1faVN0YXJ0Ow0KLSAgICB9DQotICAgIG1fcFN0cmVhbUltcC0+VW5sb2NrKCk7DQotICAgIHJldHVybiBpTGVuOw0KLX0NCi12b2lkIENGWF9TdHJlYW06OkZsdXNoKCkNCi17DQotICAgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmICgobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIG1fcFN0cmVhbUltcC0+Rmx1c2goKTsNCi19DQotRlhfQk9PTCBDRlhfU3RyZWFtOjpTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKQ0KLXsNCi0gICAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSA9PSAwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcFN0cmVhbUltcC0+U2V0TGVuZ3RoKGlMZW5ndGgpOw0KLX0NCi1pbnQzMl90IENGWF9TdHJlYW06OkdldEJPTSh1aW50OF90IGJvbVs0XSkgY29uc3QNCi17DQotICAgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQoraW50MzJfdCBDRlhfU3RyZWFtOjpSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSB7DQorICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQorICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuID0gRlhfTUlOKG1faVN0YXJ0ICsgbV9pTGVuZ3RoIC0gbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKTsNCisgIGlmIChpTGVuIDw9IDApIHsNCiAgICAgcmV0dXJuIDA7DQorICB9DQorICBtX3BTdHJlYW1JbXAtPkxvY2soKTsNCisgIGlmIChtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCkgIT0gbV9pUG9zaXRpb24pIHsNCisgICAgbV9wU3RyZWFtSW1wLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG1faVBvc2l0aW9uKTsNCisgIH0NCisgIGlMZW4gPSBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKHBCdWZmZXIsIGlMZW4pOw0KKyAgbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICBtX3BTdHJlYW1JbXAtPlVubG9jaygpOw0KKyAgcmV0dXJuIGlMZW47DQogfQ0KLUZYX1dPUkQgQ0ZYX1N0cmVhbTo6R2V0Q29kZVBhZ2UoKSBjb25zdA0KLXsNCi0jaWYgX0ZYX0VORElBTl8gPT0gX0ZYX0xJVFRMRV9FTkRJQU5fDQotICAgIHJldHVybiBGWF9DT0RFUEFHRV9VVEYxNkxFOw0KLSNlbHNlDQotICAgIHJldHVybiBGWF9DT0RFUEFHRV9VVEYxNkJFOw0KLSNlbmRpZg0KLX0NCi1GWF9XT1JEIENGWF9TdHJlYW06OlNldENvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlKQ0KLXsNCi0jaWYgX0ZYX0VORElBTl8gPT0gX0ZYX0xJVFRMRV9FTkRJQU5fDQotICAgIHJldHVybiBGWF9DT0RFUEFHRV9VVEYxNkxFOw0KLSNlbHNlDQotICAgIHJldHVybiBGWF9DT0RFUEFHRV9VVEYxNkJFOw0KLSNlbmRpZg0KLX0NCi1JRlhfU3RyZWFtKiBDRlhfU3RyZWFtOjpDcmVhdGVTaGFyZWRTdHJlYW0oRlhfRFdPUkQgZHdBY2Nlc3MsIGludDMyX3QgaU9mZnNldCwgaW50MzJfdCBpTGVuZ3RoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KCBpTGVuZ3RoID4gMCk7DQotICAgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaWYgKChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpICE9IDAgJiYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpID09IDApIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGlmICgobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgPT0gMCAmJiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJlZ2lzdGVyIGludDMyX3QgaVN0YXJ0ID0gbV9pU3RhcnQgKyBpT2Zmc2V0Ow0KLSAgICByZWdpc3RlciBpbnQzMl90IGlUb3RhbCA9IG1faVN0YXJ0ICsgbV9pTGVuZ3RoOw0KLSAgICBpZiAoaVN0YXJ0IDwgbV9pU3RhcnQgfHwgaVN0YXJ0ID49IGlUb3RhbCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmVnaXN0ZXIgaW50MzJfdCBpRW5kID0gaVN0YXJ0ICsgaUxlbmd0aDsNCi0gICAgaWYgKGlFbmQgPCBpU3RhcnQgfHwgaUVuZCA+IGlUb3RhbCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0ZYX1N0cmVhbSAqcFNoYXJlZCA9IEZYX05FVyBDRlhfU3RyZWFtOw0KLSAgICBpZiAocFNoYXJlZCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBwU2hhcmVkLT5tX2VTdHJlYW1UeXBlID0gRlhfU1RSRUFNVFlQRV9TdHJlYW07DQotICAgIHBTaGFyZWQtPm1fcFN0cmVhbUltcCA9IG1fcFN0cmVhbUltcDsNCi0gICAgcFNoYXJlZC0+bV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KLSAgICBwU2hhcmVkLT5tX2lUb3RhbFNpemUgPSBpTGVuZ3RoOw0KLSAgICBwU2hhcmVkLT5tX2lQb3NpdGlvbiA9IGlTdGFydDsNCi0gICAgcFNoYXJlZC0+bV9pU3RhcnQgPSBpU3RhcnQ7DQotICAgIHBTaGFyZWQtPm1faUxlbmd0aCA9IChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCA/IDAgOiBpTGVuZ3RoOw0KLSAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVGV4dCkgew0KLSAgICAgICAgcmV0dXJuIElGWF9TdHJlYW06OkNyZWF0ZVRleHRTdHJlYW0ocFNoYXJlZCwgVFJVRSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBTaGFyZWQ7DQotfQ0KLUlGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoSUZYX1N0cmVhbSAqcEJhc2VTdHJlYW0sIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQotew0KLSAgICBGWFNZU19hc3NlcnQocEJhc2VTdHJlYW0gIT0gTlVMTCk7DQotICAgIHJldHVybiBGWF9ORVcgQ0ZHQVNfRmlsZVJlYWQocEJhc2VTdHJlYW0sIGJSZWxlYXNlU3RyZWFtKTsNCi19DQotI2lmZGVmIEZYX0ZJTEVTSVpFDQotQ0ZHQVNfRmlsZVJlYWQ6OkNGR0FTX0ZpbGVSZWFkKElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQotICAgIDogbV9iUmVsZWFzZVN0cmVhbShiUmVsZWFzZVN0cmVhbSkNCi0gICAgLCBtX3BTdHJlYW0ocFN0cmVhbSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BTdHJlYW0gIT0gTlVMTCk7DQotfQ0KLUNGR0FTX0ZpbGVSZWFkOjp+Q0ZHQVNfRmlsZVJlYWQoKQ0KLXsNCi0gICAgaWYgKG1fYlJlbGVhc2VTdHJlYW0pIHsNCi0gICAgICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOw0KLSAgICB9DQotfQ0KLUZYX0ZJTEVTSVpFIENGR0FTX0ZpbGVSZWFkOjpHZXRTaXplKCkNCi17DQotICAgIHJldHVybiAoRlhfRklMRVNJWkUpbV9wU3RyZWFtLT5HZXRMZW5ndGgoKTsNCi19DQotRlhfQk9PTCBDRkdBU19GaWxlUmVhZDo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkNCi17DQotICAgIG1fcFN0cmVhbS0+TG9jaygpOw0KLSAgICBtX3BTdHJlYW0tPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgKGludDMyX3Qpb2Zmc2V0KTsNCi0gICAgaW50MzJfdCBpTGVuID0gbV9wU3RyZWFtLT5SZWFkRGF0YSgodWludDhfdCopYnVmZmVyLCAoaW50MzJfdClzaXplKTsNCi0gICAgbV9wU3RyZWFtLT5VbmxvY2soKTsNCi0gICAgcmV0dXJuIGlMZW4gPT0gKGludDMyX3Qpc2l6ZTsNCi19DQotI2Vsc2UNCi1DRkdBU19GaWxlUmVhZDo6Q0ZHQVNfRmlsZVJlYWQoSUZYX1N0cmVhbSAqcFN0cmVhbSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSkNCi0gICAgOiBtX2JSZWxlYXNlU3RyZWFtKGJSZWxlYXNlU3RyZWFtKQ0KLSAgICAsIG1fcFN0cmVhbShwU3RyZWFtKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSAhPSBOVUxMKTsNCi19DQotQ0ZHQVNfRmlsZVJlYWQ6On5DRkdBU19GaWxlUmVhZCgpDQotew0KLSAgICBpZiAobV9iUmVsZWFzZVN0cmVhbSkgew0KLSAgICAgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQotICAgIH0NCi19DQotRlhfRFdPUkQgQ0ZHQVNfRmlsZVJlYWQ6OkdldFNpemUoKQ0KLXsNCi0gICAgcmV0dXJuIChGWF9EV09SRCltX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KLX0NCi1GWF9CT09MIENGR0FTX0ZpbGVSZWFkOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9EV09SRCBvZmZzZXQsIEZYX0RXT1JEIHNpemUpDQotew0KLSAgICBtX3BTdHJlYW0tPkxvY2soKTsNCi0gICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIChpbnQzMl90KW9mZnNldCk7DQotICAgIGludDMyX3QgaUxlbiA9IG1fcFN0cmVhbS0+UmVhZERhdGEoKHVpbnQ4X3QqKWJ1ZmZlciwgKGludDMyX3Qpc2l6ZSk7DQotICAgIG1fcFN0cmVhbS0+VW5sb2NrKCk7DQotICAgIHJldHVybiBpTGVuID09IChpbnQzMl90KXNpemU7DQotfQ0KLSNlbmRpZg0KLSNpZmRlZiBGWF9GSUxFU0laRQ0KLUlGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBGWF9GSUxFU0laRSBpRmlsZVNpemUsIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQotew0KLSAgICBpZiAoIXBCdWZmZXJSZWFkKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhfTkVXIENGWF9CdWZmZXJBY2NJbXAocEJ1ZmZlclJlYWQsIGlGaWxlU2l6ZSwgYlJlbGVhc2VTdHJlYW0pOw0KLX0NCi1DRlhfQnVmZmVyQWNjSW1wOjpDRlhfQnVmZmVyQWNjSW1wKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyUmVhZCwgRlhfRklMRVNJWkUgaUZpbGVTaXplLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KLSAgICA6IG1fcEJ1ZmZlclJlYWQocEJ1ZmZlclJlYWQpDQotICAgICwgbV9iUmVsZWFzZVN0cmVhbShiUmVsZWFzZVN0cmVhbSkNCi0gICAgLCBtX2lCdWZTaXplKGlGaWxlU2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BCdWZmZXJSZWFkKTsNCi19DQotQ0ZYX0J1ZmZlckFjY0ltcDo6fkNGWF9CdWZmZXJBY2NJbXAoKQ0KLXsNCi0gICAgaWYgKG1fYlJlbGVhc2VTdHJlYW0gJiYgbV9wQnVmZmVyUmVhZCkgew0KLSAgICAgICAgbV9wQnVmZmVyUmVhZC0+UmVsZWFzZSgpOw0KLSAgICB9DQotfQ0KLUZYX0ZJTEVTSVpFIENGWF9CdWZmZXJBY2NJbXA6OkdldFNpemUoKQ0KLXsNCi0gICAgaWYgKCFtX3BCdWZmZXJSZWFkKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpZiAobV9pQnVmU2l6ZSA+PSAwKQl7DQotICAgICAgICByZXR1cm4gbV9pQnVmU2l6ZTsNCi0gICAgfQ0KLSAgICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soVFJVRSkpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIG1faUJ1ZlNpemUgPSAoRlhfRklMRVNJWkUpbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQotICAgIHdoaWxlICghbV9wQnVmZmVyUmVhZC0+SXNFT0YoKSkgew0KLSAgICAgICAgbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSk7DQotICAgICAgICBtX2lCdWZTaXplICs9IChGWF9GSUxFU0laRSltX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9pQnVmU2l6ZTsNCi19DQotRlhfQk9PTCBDRlhfQnVmZmVyQWNjSW1wOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQ0KLXsNCi0gICAgaWYgKCFtX3BCdWZmZXJSZWFkKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKCFidWZmZXIgfHwgIXNpemUpCXsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIEZYX0ZJTEVTSVpFIGR3QnVmU2l6ZSA9IEdldFNpemUoKTsNCi0gICAgaWYgKG9mZnNldCA+PSBkd0J1ZlNpemUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBzaXplX3QgZHdCbG9ja1NpemUJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCi0gICAgRlhfRklMRVNJWkUgZHdCbG9ja09mZnNldAk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQotICAgIGlmIChvZmZzZXQgPCBkd0Jsb2NrT2Zmc2V0KSB7DQotICAgICAgICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soVFJVRSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBkd0Jsb2NrU2l6ZQkJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCi0gICAgICAgIGR3QmxvY2tPZmZzZXQJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KLSAgICB9DQotICAgIHdoaWxlIChvZmZzZXQgPCBkd0Jsb2NrT2Zmc2V0IHx8IG9mZnNldCA+PSAoRlhfRklMRVNJWkUpKGR3QmxvY2tPZmZzZXQgKyBkd0Jsb2NrU2l6ZSkpIHsNCi0gICAgICAgIGlmIChtX3BCdWZmZXJSZWFkLT5Jc0VPRigpIHx8ICFtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKEZBTFNFKSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZHdCbG9ja1NpemUJCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQotICAgICAgICBkd0Jsb2NrT2Zmc2V0CT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCi0gICAgfQ0KLSAgICBpZiAob2Zmc2V0IDwgZHdCbG9ja09mZnNldCB8fCBvZmZzZXQgPj0gKEZYX0ZJTEVTSVpFKShkd0Jsb2NrT2Zmc2V0ICsgZHdCbG9ja1NpemUpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgY29uc3QgdWludDhfdCogcEJ1ZmZlcgkJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja0J1ZmZlcigpOw0KLSAgICBGWF9GSUxFU0laRSBkd09mZnNldAkJPSBvZmZzZXQgLSBkd0Jsb2NrT2Zmc2V0Ow0KLSAgICBzaXplX3QgZHdDb3B5U2l6ZQkJPSBGWF9NSU4oc2l6ZSwgZHdCbG9ja1NpemUgLSBkd09mZnNldCk7DQotICAgIEZYU1lTX21lbWNweShidWZmZXIsIHBCdWZmZXIgKyBkd09mZnNldCwgZHdDb3B5U2l6ZSk7DQotICAgIG9mZnNldCA9IGR3Q29weVNpemU7DQotICAgIHNpemUgLT0gZHdDb3B5U2l6ZTsNCi0gICAgd2hpbGUgKHNpemUpIHsNCi0gICAgICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGR3QmxvY2tPZmZzZXQJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KLSAgICAgICAgZHdCbG9ja1NpemUJCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQotICAgICAgICBwQnVmZmVyCQkJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja0J1ZmZlcigpOw0KLSAgICAgICAgZHdDb3B5U2l6ZQkJPSBGWF9NSU4oc2l6ZSwgZHdCbG9ja1NpemUpOw0KLSAgICAgICAgRlhTWVNfbWVtY3B5KCgodWludDhfdCopYnVmZmVyKSArIG9mZnNldCwgcEJ1ZmZlciwgZHdDb3B5U2l6ZSk7DQotICAgICAgICBvZmZzZXQJKz0gZHdDb3B5U2l6ZTsNCi0gICAgICAgIHNpemUJLT0gZHdDb3B5U2l6ZTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotI2Vsc2UNCi1JRlhfRmlsZVJlYWQqIEZYX0NyZWF0ZUZpbGVSZWFkKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyUmVhZCwgaW50MzJfdCBpRmlsZVNpemUsIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQotew0KLSAgICBpZiAoIXBCdWZmZXJSZWFkKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhfTkVXIENGWF9CdWZmZXJBY2NJbXAocEJ1ZmZlclJlYWQsIGlGaWxlU2l6ZSwgYlJlbGVhc2VTdHJlYW0pOw0KLX0NCi1DRlhfQnVmZmVyQWNjSW1wOjpDRlhfQnVmZmVyQWNjSW1wKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyUmVhZCwgaW50MzJfdCBpRmlsZVNpemUsIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQotICAgIDogbV9wQnVmZmVyUmVhZChwQnVmZmVyUmVhZCkNCi0gICAgLCBtX2JSZWxlYXNlU3RyZWFtKGJSZWxlYXNlU3RyZWFtKQ0KLSAgICAsIG1faUJ1ZlNpemUoaUZpbGVTaXplKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEJ1ZmZlclJlYWQpOw0KLX0NCi1DRlhfQnVmZmVyQWNjSW1wOjp+Q0ZYX0J1ZmZlckFjY0ltcCgpDQotew0KLSAgICBpZiAobV9iUmVsZWFzZVN0cmVhbSAmJiBtX3BCdWZmZXJSZWFkKSB7DQotICAgICAgICBtX3BCdWZmZXJSZWFkLT5SZWxlYXNlKCk7DQotICAgIH0NCi19DQotRlhfRFdPUkQgQ0ZYX0J1ZmZlckFjY0ltcDo6R2V0U2l6ZSgpDQotew0KLSAgICBpZiAoIW1fcEJ1ZmZlclJlYWQpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIGlmIChtX2lCdWZTaXplID49IDApCXsNCi0gICAgICAgIHJldHVybiBtX2lCdWZTaXplOw0KLSAgICB9DQotICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhUUlVFKSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgbV9pQnVmU2l6ZSA9IChGWF9EV09SRCltX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCi0gICAgd2hpbGUgKCFtX3BCdWZmZXJSZWFkLT5Jc0VPRigpKSB7DQotICAgICAgICBtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKEZBTFNFKTsNCi0gICAgICAgIG1faUJ1ZlNpemUgKz0gKEZYX0RXT1JEKW1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KLSAgICB9DQotICAgIHJldHVybiBtX2lCdWZTaXplOw0KLX0NCi1GWF9CT09MIENGWF9CdWZmZXJBY2NJbXA6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0RXT1JEIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkNCi17DQotICAgIGlmICghbV9wQnVmZmVyUmVhZCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmICghYnVmZmVyIHx8ICFzaXplKQl7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBkd0J1ZlNpemUgPSBHZXRTaXplKCk7DQotICAgIGlmIChvZmZzZXQgPj0gZHdCdWZTaXplKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgc2l6ZV90IGR3QmxvY2tTaXplCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQotICAgIEZYX0RXT1JEIGR3QmxvY2tPZmZzZXQJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KLSAgICBpZiAob2Zmc2V0IDwgZHdCbG9ja09mZnNldCkgew0KLSAgICAgICAgaWYgKCFtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKFRSVUUpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZHdCbG9ja1NpemUJCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQotICAgICAgICBkd0Jsb2NrT2Zmc2V0CT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCi0gICAgfQ0KLSAgICB3aGlsZSAob2Zmc2V0IDwgZHdCbG9ja09mZnNldCB8fCBvZmZzZXQgPj0gKEZYX0RXT1JEKShkd0Jsb2NrT2Zmc2V0ICsgZHdCbG9ja1NpemUpKSB7DQotICAgICAgICBpZiAobV9wQnVmZmVyUmVhZC0+SXNFT0YoKSB8fCAhbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGR3QmxvY2tTaXplCQk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KLSAgICAgICAgZHdCbG9ja09mZnNldAk9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQotICAgIH0NCi0gICAgaWYgKG9mZnNldCA8IGR3QmxvY2tPZmZzZXQgfHwgb2Zmc2V0ID49IChGWF9EV09SRCkoZHdCbG9ja09mZnNldCArIGR3QmxvY2tTaXplKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIJCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tCdWZmZXIoKTsNCi0gICAgRlhfRFdPUkQgZHdPZmZzZXQJCT0gb2Zmc2V0IC0gZHdCbG9ja09mZnNldDsNCi0gICAgRlhfRFdPUkQgZHdDb3B5U2l6ZQkJPSBGWF9NSU4oc2l6ZSwgZHdCbG9ja1NpemUgLSBkd09mZnNldCk7DQotICAgIEZYU1lTX21lbWNweShidWZmZXIsIHBCdWZmZXIgKyBkd09mZnNldCwgZHdDb3B5U2l6ZSk7DQotICAgIG9mZnNldCA9IGR3Q29weVNpemU7DQotICAgIHNpemUgLT0gZHdDb3B5U2l6ZTsNCi0gICAgd2hpbGUgKHNpemUpIHsNCi0gICAgICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGR3QmxvY2tPZmZzZXQJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KLSAgICAgICAgZHdCbG9ja1NpemUJCT0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQotICAgICAgICBwQnVmZmVyCQkJPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja0J1ZmZlcigpOw0KLSAgICAgICAgZHdDb3B5U2l6ZQkJPSBGWF9NSU4oc2l6ZSwgZHdCbG9ja1NpemUpOw0KLSAgICAgICAgRlhTWVNfbWVtY3B5KCgodWludDhfdCopYnVmZmVyKSArIG9mZnNldCwgcEJ1ZmZlciwgZHdDb3B5U2l6ZSk7DQotICAgICAgICBvZmZzZXQJKz0gZHdDb3B5U2l6ZTsNCi0gICAgICAgIHNpemUJLT0gZHdDb3B5U2l6ZTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotI2VuZGlmDQotSUZYX0ZpbGVXcml0ZSoJRlhfQ3JlYXRlRmlsZVdyaXRlKElGWF9TdHJlYW0gKnBCYXNlU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBCYXNlU3RyZWFtICE9IE5VTEwpOw0KLSAgICByZXR1cm4gRlhfTkVXIENGR0FTX0ZpbGVXcml0ZShwQmFzZVN0cmVhbSwgYlJlbGVhc2VTdHJlYW0pOw0KLX0NCi0jaWZkZWYgRlhfRklMRVNJWkUNCi1DRkdBU19GaWxlV3JpdGU6OkNGR0FTX0ZpbGVXcml0ZShJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KLSAgICA6IG1fcFN0cmVhbShwU3RyZWFtKQ0KLSAgICAsIG1fYlJlbGVhc2VTdHJlYW0oYlJlbGVhc2VTdHJlYW0pDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wU3RyZWFtICE9IE5VTEwpOw0KLX0NCi1DRkdBU19GaWxlV3JpdGU6On5DRkdBU19GaWxlV3JpdGUoKQ0KLXsNCi0gICAgaWYgKG1fYlJlbGVhc2VTdHJlYW0pIHsNCi0gICAgICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOw0KLSAgICB9DQotfQ0KLUZYX0ZJTEVTSVpFIENGR0FTX0ZpbGVXcml0ZTo6R2V0U2l6ZSgpDQotew0KLSAgICByZXR1cm4gbV9wU3RyZWFtLT5HZXRMZW5ndGgoKTsNCi19DQotRlhfQk9PTCBDRkdBU19GaWxlV3JpdGU6OkZsdXNoKCkNCi17DQotICAgIG1fcFN0cmVhbS0+Rmx1c2goKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZHQVNfRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkNCi17DQotICAgIHJldHVybiBtX3BTdHJlYW0tPldyaXRlRGF0YSgoY29uc3QgdWludDhfdCopcERhdGEsIChpbnQzMl90KXNpemUpID09IChpbnQzMl90KXNpemU7DQotfQ0KLUZYX0JPT0wgQ0ZHQVNfRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQ0KLXsNCi0gICAgbV9wU3RyZWFtLT5Mb2NrKCk7DQotICAgIG1fcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBvZmZzZXQpOw0KLSAgICBpbnQzMl90IGlMZW4gPSBtX3BTdHJlYW0tPldyaXRlRGF0YSgodWludDhfdCopcERhdGEsIChpbnQzMl90KXNpemUpOw0KLSAgICBtX3BTdHJlYW0tPlVubG9jaygpOw0KLSAgICByZXR1cm4gaUxlbiA9PSAoaW50MzJfdClzaXplOw0KLX0NCi0jZWxzZQ0KLUNGR0FTX0ZpbGVXcml0ZTo6Q0ZHQVNfRmlsZVdyaXRlKElGWF9TdHJlYW0gKnBTdHJlYW0sIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQotICAgIDogbV9wU3RyZWFtKHBTdHJlYW0pDQotICAgICwgbV9iUmVsZWFzZVN0cmVhbShiUmVsZWFzZVN0cmVhbSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BTdHJlYW0gIT0gTlVMTCk7DQotfQ0KLUNGR0FTX0ZpbGVXcml0ZTo6fkNGR0FTX0ZpbGVXcml0ZSgpDQotew0KLSAgICBpZiAobV9iUmVsZWFzZVN0cmVhbSkgew0KLSAgICAgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQotICAgIH0NCi19DQotRlhfRFdPUkQgQ0ZHQVNfRmlsZVdyaXRlOjpHZXRTaXplKCkNCi17DQotICAgIHJldHVybiBtX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KLX0NCi1GWF9EV09SRCBDRkdBU19GaWxlV3JpdGU6OkZsdXNoKCkNCi17DQotICAgIG1fcFN0cmVhbS0+Rmx1c2goKTsNCitpbnQzMl90IENGWF9TdHJlYW06OlJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVPUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb25zdCogcEJ5dGVTaXplKSB7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlNYXhMZW5ndGggPiAwKTsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpbnQzMl90IGlFbmQgPSBtX2lTdGFydCArIG1faUxlbmd0aDsNCisgIGludDMyX3QgaUxlbiA9IGlFbmQgLSBtX2lQb3NpdGlvbjsNCisgIGlmIChwQnl0ZVNpemUgIT0gTlVMTCkgew0KKyAgICBpTGVuID0gRlhfTUlOKGlMZW4sICpwQnl0ZVNpemUpOw0KKyAgfQ0KKyAgaUxlbiA9IEZYX01JTihpRW5kIC8gMiwgaU1heExlbmd0aCk7DQorICBpZiAoaUxlbiA8PSAwKSB7DQogICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgbV9wU3RyZWFtSW1wLT5Mb2NrKCk7DQorICBpZiAobV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpICE9IG1faVBvc2l0aW9uKSB7DQorICAgIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBtX2lQb3NpdGlvbik7DQorICB9DQorICBpTGVuID0gbV9wU3RyZWFtSW1wLT5SZWFkU3RyaW5nKHBTdHIsIGlMZW4sIGJFT1MpOw0KKyAgbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICBpZiAoaUxlbiA+IDAgJiYgbV9pUG9zaXRpb24gPj0gaUVuZCkgew0KKyAgICBiRU9TID0gVFJVRTsNCisgIH0NCisgIG1fcFN0cmVhbUltcC0+VW5sb2NrKCk7DQorICByZXR1cm4gaUxlbjsNCiB9DQotRlhfQk9PTCBDRkdBU19GaWxlV3JpdGU6OldyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIEZYX0RXT1JEIHNpemUpDQotew0KLSAgICByZXR1cm4gbV9wU3RyZWFtLT5Xcml0ZURhdGEoKGNvbnN0IHVpbnQ4X3QqKXBEYXRhLCAoaW50MzJfdClzaXplKSA9PSAoaW50MzJfdClzaXplOw0KK2ludDMyX3QgQ0ZYX1N0cmVhbTo6V3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwKTsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuID0gaUJ1ZmZlclNpemU7DQorICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX1N0cmVhbSkgew0KKyAgICBpTGVuID0gRlhfTUlOKG1faVN0YXJ0ICsgbV9pVG90YWxTaXplIC0gbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKTsNCisgICAgaWYgKGlMZW4gPD0gMCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICB9DQorICBtX3BTdHJlYW1JbXAtPkxvY2soKTsNCisgIGludDMyX3QgaUVuZCA9IG1faVN0YXJ0ICsgbV9pTGVuZ3RoOw0KKyAgaWYgKG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKSAhPSBtX2lQb3NpdGlvbikgew0KKyAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgbV9pUG9zaXRpb24pOw0KKyAgfQ0KKyAgaUxlbiA9IG1fcFN0cmVhbUltcC0+V3JpdGVEYXRhKHBCdWZmZXIsIGlMZW4pOw0KKyAgbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICBpZiAobV9pUG9zaXRpb24gPiBpRW5kKSB7DQorICAgIG1faUxlbmd0aCA9IG1faVBvc2l0aW9uIC0gbV9pU3RhcnQ7DQorICB9DQorICBtX3BTdHJlYW1JbXAtPlVubG9jaygpOw0KKyAgcmV0dXJuIGlMZW47DQogfQ0KLUZYX0JPT0wgQ0ZHQVNfRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9EV09SRCBvZmZzZXQsIEZYX0RXT1JEIHNpemUpDQotew0KLSAgICBtX3BTdHJlYW0tPkxvY2soKTsNCi0gICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG9mZnNldCk7DQotICAgIGludDMyX3QgaUxlbiA9IG1fcFN0cmVhbS0+V3JpdGVEYXRhKCh1aW50OF90KilwRGF0YSwgKGludDMyX3Qpc2l6ZSk7DQotICAgIG1fcFN0cmVhbS0+VW5sb2NrKCk7DQotICAgIHJldHVybiBpTGVuID09IChpbnQzMl90KXNpemU7DQoraW50MzJfdCBDRlhfU3RyZWFtOjpXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuID0gaUxlbmd0aDsNCisgIGlmIChtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfU3RyZWFtKSB7DQorICAgIGlMZW4gPSBGWF9NSU4oKG1faVN0YXJ0ICsgbV9pVG90YWxTaXplIC0gbV9pUG9zaXRpb24pIC8gMiwgaUxlbmd0aCk7DQorICAgIGlmIChpTGVuIDw9IDApIHsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgfQ0KKyAgbV9wU3RyZWFtSW1wLT5Mb2NrKCk7DQorICBpbnQzMl90IGlFbmQgPSBtX2lTdGFydCArIG1faUxlbmd0aDsNCisgIGlmIChtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCkgIT0gbV9pUG9zaXRpb24pIHsNCisgICAgbV9wU3RyZWFtSW1wLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG1faVBvc2l0aW9uKTsNCisgIH0NCisgIGlMZW4gPSBtX3BTdHJlYW1JbXAtPldyaXRlU3RyaW5nKHBTdHIsIGlMZW4pOw0KKyAgbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICBpZiAobV9pUG9zaXRpb24gPiBpRW5kKSB7DQorICAgIG1faUxlbmd0aCA9IG1faVBvc2l0aW9uIC0gbV9pU3RhcnQ7DQorICB9DQorICBtX3BTdHJlYW1JbXAtPlVubG9jaygpOw0KKyAgcmV0dXJuIGlMZW47DQorfQ0KK3ZvaWQgQ0ZYX1N0cmVhbTo6Rmx1c2goKSB7DQorICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSA9PSAwKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcFN0cmVhbUltcC0+Rmx1c2goKTsNCit9DQorRlhfQk9PTCBDRlhfU3RyZWFtOjpTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKSB7DQorICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBtX3BTdHJlYW1JbXAtPlNldExlbmd0aChpTGVuZ3RoKTsNCit9DQoraW50MzJfdCBDRlhfU3RyZWFtOjpHZXRCT00odWludDhfdCBib21bNF0pIGNvbnN0IHsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorRlhfV09SRCBDRlhfU3RyZWFtOjpHZXRDb2RlUGFnZSgpIGNvbnN0IHsNCisjaWYgX0ZYX0VORElBTl8gPT0gX0ZYX0xJVFRMRV9FTkRJQU5fDQorICByZXR1cm4gRlhfQ09ERVBBR0VfVVRGMTZMRTsNCisjZWxzZQ0KKyAgcmV0dXJuIEZYX0NPREVQQUdFX1VURjE2QkU7DQorI2VuZGlmDQorfQ0KK0ZYX1dPUkQgQ0ZYX1N0cmVhbTo6U2V0Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisjaWYgX0ZYX0VORElBTl8gPT0gX0ZYX0xJVFRMRV9FTkRJQU5fDQorICByZXR1cm4gRlhfQ09ERVBBR0VfVVRGMTZMRTsNCisjZWxzZQ0KKyAgcmV0dXJuIEZYX0NPREVQQUdFX1VURjE2QkU7DQorI2VuZGlmDQorfQ0KK0lGWF9TdHJlYW0qIENGWF9TdHJlYW06OkNyZWF0ZVNoYXJlZFN0cmVhbShGWF9EV09SRCBkd0FjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpT2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChpTGVuZ3RoID4gMCk7DQorICBpZiAobV9wU3RyZWFtSW1wID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVGV4dCkgIT0gMCAmJg0KKyAgICAgIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSA9PSAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSA9PSAwICYmDQorICAgICAgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSAhPSAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmVnaXN0ZXIgaW50MzJfdCBpU3RhcnQgPSBtX2lTdGFydCArIGlPZmZzZXQ7DQorICByZWdpc3RlciBpbnQzMl90IGlUb3RhbCA9IG1faVN0YXJ0ICsgbV9pTGVuZ3RoOw0KKyAgaWYgKGlTdGFydCA8IG1faVN0YXJ0IHx8IGlTdGFydCA+PSBpVG90YWwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZWdpc3RlciBpbnQzMl90IGlFbmQgPSBpU3RhcnQgKyBpTGVuZ3RoOw0KKyAgaWYgKGlFbmQgPCBpU3RhcnQgfHwgaUVuZCA+IGlUb3RhbCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9TdHJlYW0qIHBTaGFyZWQgPSBGWF9ORVcgQ0ZYX1N0cmVhbTsNCisgIGlmIChwU2hhcmVkID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwU2hhcmVkLT5tX2VTdHJlYW1UeXBlID0gRlhfU1RSRUFNVFlQRV9TdHJlYW07DQorICBwU2hhcmVkLT5tX3BTdHJlYW1JbXAgPSBtX3BTdHJlYW1JbXA7DQorICBwU2hhcmVkLT5tX2R3QWNjZXNzID0gZHdBY2Nlc3M7DQorICBwU2hhcmVkLT5tX2lUb3RhbFNpemUgPSBpTGVuZ3RoOw0KKyAgcFNoYXJlZC0+bV9pUG9zaXRpb24gPSBpU3RhcnQ7DQorICBwU2hhcmVkLT5tX2lTdGFydCA9IGlTdGFydDsNCisgIHBTaGFyZWQtPm1faUxlbmd0aCA9IChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCA/IDAgOiBpTGVuZ3RoOw0KKyAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpIHsNCisgICAgcmV0dXJuIElGWF9TdHJlYW06OkNyZWF0ZVRleHRTdHJlYW0ocFNoYXJlZCwgVFJVRSk7DQorICB9DQorICByZXR1cm4gcFNoYXJlZDsNCit9DQorSUZYX0ZpbGVSZWFkKiBGWF9DcmVhdGVGaWxlUmVhZChJRlhfU3RyZWFtKiBwQmFzZVN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pIHsNCisgIEZYU1lTX2Fzc2VydChwQmFzZVN0cmVhbSAhPSBOVUxMKTsNCisgIHJldHVybiBGWF9ORVcgQ0ZHQVNfRmlsZVJlYWQocEJhc2VTdHJlYW0sIGJSZWxlYXNlU3RyZWFtKTsNCit9DQorI2lmZGVmIEZYX0ZJTEVTSVpFDQorQ0ZHQVNfRmlsZVJlYWQ6OkNGR0FTX0ZpbGVSZWFkKElGWF9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQorICAgIDogbV9iUmVsZWFzZVN0cmVhbShiUmVsZWFzZVN0cmVhbSksIG1fcFN0cmVhbShwU3RyZWFtKSB7DQorICBGWFNZU19hc3NlcnQobV9wU3RyZWFtICE9IE5VTEwpOw0KK30NCitDRkdBU19GaWxlUmVhZDo6fkNGR0FTX0ZpbGVSZWFkKCkgew0KKyAgaWYgKG1fYlJlbGVhc2VTdHJlYW0pIHsNCisgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQorICB9DQorfQ0KK0ZYX0ZJTEVTSVpFIENGR0FTX0ZpbGVSZWFkOjpHZXRTaXplKCkgew0KKyAgcmV0dXJuIChGWF9GSUxFU0laRSltX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KK30NCitGWF9CT09MIENGR0FTX0ZpbGVSZWFkOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7DQorICBtX3BTdHJlYW0tPkxvY2soKTsNCisgIG1fcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCAoaW50MzJfdClvZmZzZXQpOw0KKyAgaW50MzJfdCBpTGVuID0gbV9wU3RyZWFtLT5SZWFkRGF0YSgodWludDhfdCopYnVmZmVyLCAoaW50MzJfdClzaXplKTsNCisgIG1fcFN0cmVhbS0+VW5sb2NrKCk7DQorICByZXR1cm4gaUxlbiA9PSAoaW50MzJfdClzaXplOw0KK30NCisjZWxzZQ0KK0NGR0FTX0ZpbGVSZWFkOjpDRkdBU19GaWxlUmVhZChJRlhfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KKyAgICA6IG1fYlJlbGVhc2VTdHJlYW0oYlJlbGVhc2VTdHJlYW0pLCBtX3BTdHJlYW0ocFN0cmVhbSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSAhPSBOVUxMKTsNCit9DQorQ0ZHQVNfRmlsZVJlYWQ6On5DRkdBU19GaWxlUmVhZCgpIHsNCisgIGlmIChtX2JSZWxlYXNlU3RyZWFtKSB7DQorICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgfQ0KK30NCitGWF9EV09SRCBDRkdBU19GaWxlUmVhZDo6R2V0U2l6ZSgpIHsNCisgIHJldHVybiAoRlhfRFdPUkQpbV9wU3RyZWFtLT5HZXRMZW5ndGgoKTsNCit9DQorRlhfQk9PTCBDRkdBU19GaWxlUmVhZDo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplKSB7DQorICBtX3BTdHJlYW0tPkxvY2soKTsNCisgIG1fcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCAoaW50MzJfdClvZmZzZXQpOw0KKyAgaW50MzJfdCBpTGVuID0gbV9wU3RyZWFtLT5SZWFkRGF0YSgodWludDhfdCopYnVmZmVyLCAoaW50MzJfdClzaXplKTsNCisgIG1fcFN0cmVhbS0+VW5sb2NrKCk7DQorICByZXR1cm4gaUxlbiA9PSAoaW50MzJfdClzaXplOw0KK30NCisjZW5kaWYNCisjaWZkZWYgRlhfRklMRVNJWkUNCitJRlhfRmlsZVJlYWQqIEZYX0NyZWF0ZUZpbGVSZWFkKElGWF9CdWZmZXJSZWFkKiBwQnVmZmVyUmVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGlGaWxlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pIHsNCisgIGlmICghcEJ1ZmZlclJlYWQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gRlhfTkVXIENGWF9CdWZmZXJBY2NJbXAocEJ1ZmZlclJlYWQsIGlGaWxlU2l6ZSwgYlJlbGVhc2VTdHJlYW0pOw0KK30NCitDRlhfQnVmZmVyQWNjSW1wOjpDRlhfQnVmZmVyQWNjSW1wKElGWF9CdWZmZXJSZWFkKiBwQnVmZmVyUmVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGlGaWxlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQorICAgIDogbV9wQnVmZmVyUmVhZChwQnVmZmVyUmVhZCksDQorICAgICAgbV9iUmVsZWFzZVN0cmVhbShiUmVsZWFzZVN0cmVhbSksDQorICAgICAgbV9pQnVmU2l6ZShpRmlsZVNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BCdWZmZXJSZWFkKTsNCit9DQorQ0ZYX0J1ZmZlckFjY0ltcDo6fkNGWF9CdWZmZXJBY2NJbXAoKSB7DQorICBpZiAobV9iUmVsZWFzZVN0cmVhbSAmJiBtX3BCdWZmZXJSZWFkKSB7DQorICAgIG1fcEJ1ZmZlclJlYWQtPlJlbGVhc2UoKTsNCisgIH0NCit9DQorRlhfRklMRVNJWkUgQ0ZYX0J1ZmZlckFjY0ltcDo6R2V0U2l6ZSgpIHsNCisgIGlmICghbV9wQnVmZmVyUmVhZCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChtX2lCdWZTaXplID49IDApIHsNCisgICAgcmV0dXJuIG1faUJ1ZlNpemU7DQorICB9DQorICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soVFJVRSkpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBtX2lCdWZTaXplID0gKEZYX0ZJTEVTSVpFKW1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgd2hpbGUgKCFtX3BCdWZmZXJSZWFkLT5Jc0VPRigpKSB7DQorICAgIG1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soRkFMU0UpOw0KKyAgICBtX2lCdWZTaXplICs9IChGWF9GSUxFU0laRSltX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgIH0NCisgIHJldHVybiBtX2lCdWZTaXplOw0KK30NCitGWF9CT09MIENGWF9CdWZmZXJBY2NJbXA6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7DQorICBpZiAoIW1fcEJ1ZmZlclJlYWQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFidWZmZXIgfHwgIXNpemUpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBGWF9GSUxFU0laRSBkd0J1ZlNpemUgPSBHZXRTaXplKCk7DQorICBpZiAob2Zmc2V0ID49IGR3QnVmU2l6ZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBzaXplX3QgZHdCbG9ja1NpemUgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgIEZYX0ZJTEVTSVpFIGR3QmxvY2tPZmZzZXQgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KKyAgaWYgKG9mZnNldCA8IGR3QmxvY2tPZmZzZXQpIHsNCisgICAgaWYgKCFtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKFRSVUUpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGR3QmxvY2tTaXplID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICAgIGR3QmxvY2tPZmZzZXQgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KKyAgfQ0KKyAgd2hpbGUgKG9mZnNldCA8IGR3QmxvY2tPZmZzZXQgfHwNCisgICAgICAgICBvZmZzZXQgPj0gKEZYX0ZJTEVTSVpFKShkd0Jsb2NrT2Zmc2V0ICsgZHdCbG9ja1NpemUpKSB7DQorICAgIGlmIChtX3BCdWZmZXJSZWFkLT5Jc0VPRigpIHx8ICFtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKEZBTFNFKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGR3QmxvY2tTaXplID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICAgIGR3QmxvY2tPZmZzZXQgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KKyAgfQ0KKyAgaWYgKG9mZnNldCA8IGR3QmxvY2tPZmZzZXQgfHwNCisgICAgICBvZmZzZXQgPj0gKEZYX0ZJTEVTSVpFKShkd0Jsb2NrT2Zmc2V0ICsgZHdCbG9ja1NpemUpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja0J1ZmZlcigpOw0KKyAgRlhfRklMRVNJWkUgZHdPZmZzZXQgPSBvZmZzZXQgLSBkd0Jsb2NrT2Zmc2V0Ow0KKyAgc2l6ZV90IGR3Q29weVNpemUgPSBGWF9NSU4oc2l6ZSwgZHdCbG9ja1NpemUgLSBkd09mZnNldCk7DQorICBGWFNZU19tZW1jcHkoYnVmZmVyLCBwQnVmZmVyICsgZHdPZmZzZXQsIGR3Q29weVNpemUpOw0KKyAgb2Zmc2V0ID0gZHdDb3B5U2l6ZTsNCisgIHNpemUgLT0gZHdDb3B5U2l6ZTsNCisgIHdoaWxlIChzaXplKSB7DQorICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSkpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkd0Jsb2NrT2Zmc2V0ID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCisgICAgZHdCbG9ja1NpemUgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgcEJ1ZmZlciA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrQnVmZmVyKCk7DQorICAgIGR3Q29weVNpemUgPSBGWF9NSU4oc2l6ZSwgZHdCbG9ja1NpemUpOw0KKyAgICBGWFNZU19tZW1jcHkoKCh1aW50OF90KilidWZmZXIpICsgb2Zmc2V0LCBwQnVmZmVyLCBkd0NvcHlTaXplKTsNCisgICAgb2Zmc2V0ICs9IGR3Q29weVNpemU7DQorICAgIHNpemUgLT0gZHdDb3B5U2l6ZTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCisjZWxzZQ0KK0lGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoSUZYX0J1ZmZlclJlYWQqIHBCdWZmZXJSZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmlsZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKSB7DQorICBpZiAoIXBCdWZmZXJSZWFkKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX05FVyBDRlhfQnVmZmVyQWNjSW1wKHBCdWZmZXJSZWFkLCBpRmlsZVNpemUsIGJSZWxlYXNlU3RyZWFtKTsNCit9DQorQ0ZYX0J1ZmZlckFjY0ltcDo6Q0ZYX0J1ZmZlckFjY0ltcChJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGaWxlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pDQorICAgIDogbV9wQnVmZmVyUmVhZChwQnVmZmVyUmVhZCksDQorICAgICAgbV9iUmVsZWFzZVN0cmVhbShiUmVsZWFzZVN0cmVhbSksDQorICAgICAgbV9pQnVmU2l6ZShpRmlsZVNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BCdWZmZXJSZWFkKTsNCit9DQorQ0ZYX0J1ZmZlckFjY0ltcDo6fkNGWF9CdWZmZXJBY2NJbXAoKSB7DQorICBpZiAobV9iUmVsZWFzZVN0cmVhbSAmJiBtX3BCdWZmZXJSZWFkKSB7DQorICAgIG1fcEJ1ZmZlclJlYWQtPlJlbGVhc2UoKTsNCisgIH0NCit9DQorRlhfRFdPUkQgQ0ZYX0J1ZmZlckFjY0ltcDo6R2V0U2l6ZSgpIHsNCisgIGlmICghbV9wQnVmZmVyUmVhZCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChtX2lCdWZTaXplID49IDApIHsNCisgICAgcmV0dXJuIG1faUJ1ZlNpemU7DQorICB9DQorICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soVFJVRSkpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBtX2lCdWZTaXplID0gKEZYX0RXT1JEKW1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgd2hpbGUgKCFtX3BCdWZmZXJSZWFkLT5Jc0VPRigpKSB7DQorICAgIG1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soRkFMU0UpOw0KKyAgICBtX2lCdWZTaXplICs9IChGWF9EV09SRCltX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgIH0NCisgIHJldHVybiBtX2lCdWZTaXplOw0KK30NCitGWF9CT09MIENGWF9CdWZmZXJBY2NJbXA6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUpIHsNCisgIGlmICghbV9wQnVmZmVyUmVhZCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIEZYX0RXT1JEIGR3QnVmU2l6ZSA9IEdldFNpemUoKTsNCisgIGlmIChvZmZzZXQgPj0gZHdCdWZTaXplKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHNpemVfdCBkd0Jsb2NrU2l6ZSA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgRlhfRFdPUkQgZHdCbG9ja09mZnNldCA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQorICBpZiAob2Zmc2V0IDwgZHdCbG9ja09mZnNldCkgew0KKyAgICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soVFJVRSkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgZHdCbG9ja1NpemUgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgZHdCbG9ja09mZnNldCA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQorICB9DQorICB3aGlsZSAob2Zmc2V0IDwgZHdCbG9ja09mZnNldCB8fA0KKyAgICAgICAgIG9mZnNldCA+PSAoRlhfRFdPUkQpKGR3QmxvY2tPZmZzZXQgKyBkd0Jsb2NrU2l6ZSkpIHsNCisgICAgaWYgKG1fcEJ1ZmZlclJlYWQtPklzRU9GKCkgfHwgIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soRkFMU0UpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZHdCbG9ja1NpemUgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgICAgZHdCbG9ja09mZnNldCA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQorICB9DQorICBpZiAob2Zmc2V0IDwgZHdCbG9ja09mZnNldCB8fA0KKyAgICAgIG9mZnNldCA+PSAoRlhfRFdPUkQpKGR3QmxvY2tPZmZzZXQgKyBkd0Jsb2NrU2l6ZSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgY29uc3QgdWludDhfdCogcEJ1ZmZlciA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrQnVmZmVyKCk7DQorICBGWF9EV09SRCBkd09mZnNldCA9IG9mZnNldCAtIGR3QmxvY2tPZmZzZXQ7DQorICBGWF9EV09SRCBkd0NvcHlTaXplID0gRlhfTUlOKHNpemUsIGR3QmxvY2tTaXplIC0gZHdPZmZzZXQpOw0KKyAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgcEJ1ZmZlciArIGR3T2Zmc2V0LCBkd0NvcHlTaXplKTsNCisgIG9mZnNldCA9IGR3Q29weVNpemU7DQorICBzaXplIC09IGR3Q29weVNpemU7DQorICB3aGlsZSAoc2l6ZSkgew0KKyAgICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soRkFMU0UpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZHdCbG9ja09mZnNldCA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQorICAgIGR3QmxvY2tTaXplID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICAgIHBCdWZmZXIgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja0J1ZmZlcigpOw0KKyAgICBkd0NvcHlTaXplID0gRlhfTUlOKHNpemUsIGR3QmxvY2tTaXplKTsNCisgICAgRlhTWVNfbWVtY3B5KCgodWludDhfdCopYnVmZmVyKSArIG9mZnNldCwgcEJ1ZmZlciwgZHdDb3B5U2l6ZSk7DQorICAgIG9mZnNldCArPSBkd0NvcHlTaXplOw0KKyAgICBzaXplIC09IGR3Q29weVNpemU7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorI2VuZGlmDQorSUZYX0ZpbGVXcml0ZSogRlhfQ3JlYXRlRmlsZVdyaXRlKElGWF9TdHJlYW0qIHBCYXNlU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKSB7DQorICBGWFNZU19hc3NlcnQocEJhc2VTdHJlYW0gIT0gTlVMTCk7DQorICByZXR1cm4gRlhfTkVXIENGR0FTX0ZpbGVXcml0ZShwQmFzZVN0cmVhbSwgYlJlbGVhc2VTdHJlYW0pOw0KK30NCisjaWZkZWYgRlhfRklMRVNJWkUNCitDRkdBU19GaWxlV3JpdGU6OkNGR0FTX0ZpbGVXcml0ZShJRlhfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KKyAgICA6IG1fcFN0cmVhbShwU3RyZWFtKSwgbV9iUmVsZWFzZVN0cmVhbShiUmVsZWFzZVN0cmVhbSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSAhPSBOVUxMKTsNCit9DQorQ0ZHQVNfRmlsZVdyaXRlOjp+Q0ZHQVNfRmlsZVdyaXRlKCkgew0KKyAgaWYgKG1fYlJlbGVhc2VTdHJlYW0pIHsNCisgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQorICB9DQorfQ0KK0ZYX0ZJTEVTSVpFIENGR0FTX0ZpbGVXcml0ZTo6R2V0U2l6ZSgpIHsNCisgIHJldHVybiBtX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KK30NCitGWF9CT09MIENGR0FTX0ZpbGVXcml0ZTo6Rmx1c2goKSB7DQorICBtX3BTdHJlYW0tPkZsdXNoKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkdBU19GaWxlV3JpdGU6OldyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSB7DQorICByZXR1cm4gbV9wU3RyZWFtLT5Xcml0ZURhdGEoKGNvbnN0IHVpbnQ4X3QqKXBEYXRhLCAoaW50MzJfdClzaXplKSA9PQ0KKyAgICAgICAgIChpbnQzMl90KXNpemU7DQorfQ0KK0ZYX0JPT0wgQ0ZHQVNfRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgew0KKyAgbV9wU3RyZWFtLT5Mb2NrKCk7DQorICBtX3BTdHJlYW0tPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgb2Zmc2V0KTsNCisgIGludDMyX3QgaUxlbiA9IG1fcFN0cmVhbS0+V3JpdGVEYXRhKCh1aW50OF90KilwRGF0YSwgKGludDMyX3Qpc2l6ZSk7DQorICBtX3BTdHJlYW0tPlVubG9jaygpOw0KKyAgcmV0dXJuIGlMZW4gPT0gKGludDMyX3Qpc2l6ZTsNCit9DQorI2Vsc2UNCitDRkdBU19GaWxlV3JpdGU6OkNGR0FTX0ZpbGVXcml0ZShJRlhfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KKyAgICA6IG1fcFN0cmVhbShwU3RyZWFtKSwgbV9iUmVsZWFzZVN0cmVhbShiUmVsZWFzZVN0cmVhbSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSAhPSBOVUxMKTsNCit9DQorQ0ZHQVNfRmlsZVdyaXRlOjp+Q0ZHQVNfRmlsZVdyaXRlKCkgew0KKyAgaWYgKG1fYlJlbGVhc2VTdHJlYW0pIHsNCisgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQorICB9DQorfQ0KK0ZYX0RXT1JEIENGR0FTX0ZpbGVXcml0ZTo6R2V0U2l6ZSgpIHsNCisgIHJldHVybiBtX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KK30NCitGWF9EV09SRCBDRkdBU19GaWxlV3JpdGU6OkZsdXNoKCkgew0KKyAgbV9wU3RyZWFtLT5GbHVzaCgpOw0KKyAgcmV0dXJuIDA7DQorfQ0KK0ZYX0JPT0wgQ0ZHQVNfRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9EV09SRCBzaXplKSB7DQorICByZXR1cm4gbV9wU3RyZWFtLT5Xcml0ZURhdGEoKGNvbnN0IHVpbnQ4X3QqKXBEYXRhLCAoaW50MzJfdClzaXplKSA9PQ0KKyAgICAgICAgIChpbnQzMl90KXNpemU7DQorfQ0KK0ZYX0JPT0wgQ0ZHQVNfRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplKSB7DQorICBtX3BTdHJlYW0tPkxvY2soKTsNCisgIG1fcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBvZmZzZXQpOw0KKyAgaW50MzJfdCBpTGVuID0gbV9wU3RyZWFtLT5Xcml0ZURhdGEoKHVpbnQ4X3QqKXBEYXRhLCAoaW50MzJfdClzaXplKTsNCisgIG1fcFN0cmVhbS0+VW5sb2NrKCk7DQorICByZXR1cm4gaUxlbiA9PSAoaW50MzJfdClzaXplOw0KIH0NCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9zdHJlYW0uaCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5oCmluZGV4IGQ4OTczMWIuLmJiMTM3NTggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5oCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5oCkBAIC0xNywzODkgKzE3LDM0NCBAQAogY2xhc3MgQ0ZYX0ZpbGVSZWFkOw0KIGNsYXNzIENGWF9GaWxlV3JpdGU7DQogY2xhc3MgQ0ZYX0J1ZmZlckFjY0ltcDsNCi1jbGFzcyBDRlhfU3RyZWFtSW1wIDogcHVibGljIENGWF9UaHJlYWRMb2NrDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldEFjY2Vzc01vZGVzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZHdBY2Nlc3M7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRMZW5ndGgoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRQb3NpdGlvbigpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaU1heExlbmd0aCwgRlhfQk9PTCAmYkVPUykgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJV3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlGbHVzaCgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgPSAwOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX1N0cmVhbUltcCgpOw0KLSAgICB2aXJ0dWFsIH5DRlhfU3RyZWFtSW1wKCkge30NCi0gICAgRlhfRFdPUkQJCQkJbV9kd0FjY2VzczsNCi19Ow0KLWNsYXNzIENGWF9GaWxlU3RyZWFtSW1wIDogcHVibGljIENGWF9TdHJlYW1JbXANCi17DQotcHVibGljOg0KLSAgICBDRlhfRmlsZVN0cmVhbUltcCgpOw0KLSAgICB2aXJ0dWFsIH5DRlhfRmlsZVN0cmVhbUltcCgpOw0KLSAgICBGWF9CT09MCQkJTG9hZEZpbGUoY29uc3QgRlhfV0NIQVIqIHBzelNyY0ZpbGVOYW1lLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0TGVuZ3RoKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldFBvc2l0aW9uKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTWF4TGVuZ3RoLCBGWF9CT09MICZiRU9TKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJV3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUZsdXNoKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpOw0KLXByb3RlY3RlZDoNCi0gICAgRlhTWVNfRklMRQkqbV9oRmlsZTsNCi0gICAgaW50MzJfdAltX2lMZW5ndGg7DQotfTsNCi1jbGFzcyBDRlhfQnVmZmVyU3RyZWFtSW1wIDogcHVibGljIENGWF9TdHJlYW1JbXANCi17DQotcHVibGljOg0KLSAgICBDRlhfQnVmZmVyU3RyZWFtSW1wKCk7DQotICAgIHZpcnR1YWwgfkNGWF9CdWZmZXJTdHJlYW1JbXAoKSB7fQ0KLSAgICBGWF9CT09MCQkJTG9hZEJ1ZmZlcih1aW50OF90KiBwRGF0YSwgaW50MzJfdCBpVG90YWxTaXplLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0TGVuZ3RoKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldFBvc2l0aW9uKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTWF4TGVuZ3RoLCBGWF9CT09MICZiRU9TKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJV3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUZsdXNoKCkge30NCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICB1aW50OF90KgltX3BEYXRhOw0KLSAgICBpbnQzMl90CW1faVRvdGFsU2l6ZTsNCi0gICAgaW50MzJfdAltX2lQb3NpdGlvbjsNCi0gICAgaW50MzJfdAltX2lMZW5ndGg7DQotfTsNCi1jbGFzcyBDRlhfRmlsZVJlYWRTdHJlYW1JbXAgOiBwdWJsaWMgQ0ZYX1N0cmVhbUltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9GaWxlUmVhZFN0cmVhbUltcCgpOw0KLSAgICB2aXJ0dWFsIH5DRlhfRmlsZVJlYWRTdHJlYW1JbXAoKSB7fQ0KLSAgICBGWF9CT09MCQkJTG9hZEZpbGVSZWFkKElGWF9GaWxlUmVhZCAqcEZpbGVSZWFkLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0TGVuZ3RoKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldFBvc2l0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faVBvc2l0aW9uOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkgY29uc3Q7DQorY2xhc3MgQ0ZYX1N0cmVhbUltcCA6IHB1YmxpYyBDRlhfVGhyZWFkTG9jayB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRBY2Nlc3NNb2RlcygpIGNvbnN0IHsgcmV0dXJuIG1fZHdBY2Nlc3M7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRQb3NpdGlvbigpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFT1MpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBGbHVzaCgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKSA9IDA7DQogDQotICAgIHZpcnR1YWwgaW50MzJfdAkJUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTWF4TGVuZ3RoLCBGWF9CT09MICZiRU9TKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQlXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlGbHVzaCgpIHt9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgSUZYX0ZpbGVSZWFkCQkJKm1fcEZpbGVSZWFkOw0KLSAgICBpbnQzMl90CQkJCW1faVBvc2l0aW9uOw0KLSAgICBpbnQzMl90CQkJCW1faUxlbmd0aDsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1N0cmVhbUltcCgpOw0KKyAgdmlydHVhbCB+Q0ZYX1N0cmVhbUltcCgpIHt9DQorICBGWF9EV09SRCBtX2R3QWNjZXNzOw0KIH07DQotY2xhc3MgQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXAgOiBwdWJsaWMgQ0ZYX1N0cmVhbUltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wKCk7DQotICAgIH5DRlhfQnVmZmVyUmVhZFN0cmVhbUltcCgpOw0KLSAgICBGWF9CT09MCQkJTG9hZEJ1ZmZlclJlYWQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBpbnQzMl90IGlGaWxlU2l6ZSwgRlhfRFdPUkQgZHdBY2Nlc3MsIEZYX0JPT0wgYlJlbGVhc2VCdWZmZXJSZWFkKTsNCitjbGFzcyBDRlhfRmlsZVN0cmVhbUltcCA6IHB1YmxpYyBDRlhfU3RyZWFtSW1wIHsNCisgcHVibGljOg0KKyAgQ0ZYX0ZpbGVTdHJlYW1JbXAoKTsNCisgIHZpcnR1YWwgfkNGWF9GaWxlU3RyZWFtSW1wKCk7DQorICBGWF9CT09MIExvYWRGaWxlKGNvbnN0IEZYX1dDSEFSKiBwc3pTcmNGaWxlTmFtZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRQb3NpdGlvbigpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTWF4TGVuZ3RoLCBGWF9CT09MJiBiRU9TKTsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQorICB2aXJ0dWFsIGludDMyX3QgV3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCk7DQorICB2aXJ0dWFsIHZvaWQgRmx1c2goKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKTsNCiANCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRMZW5ndGgoKSBjb25zdDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0UG9zaXRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9pUG9zaXRpb247DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKSBjb25zdDsNCi0NCi0gICAgdmlydHVhbCBpbnQzMl90CQlSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCUZsdXNoKCkge30NCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotcHJpdmF0ZToNCi0gICAgSUZYX0J1ZmZlclJlYWQJCQkqbV9wQnVmZmVyUmVhZDsNCi0gICAgRlhfQk9PTAkJCQkJbV9iUmVsZWFzZUJ1ZmZlclJlYWQ7DQotICAgIGludDMyX3QJCQkJbV9pUG9zaXRpb247DQotICAgIGludDMyX3QJCQkJbV9pQnVmZmVyU2l6ZTsNCisgcHJvdGVjdGVkOg0KKyAgRlhTWVNfRklMRSogbV9oRmlsZTsNCisgIGludDMyX3QgbV9pTGVuZ3RoOw0KIH07DQotY2xhc3MgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcCA6IHB1YmxpYyBDRlhfU3RyZWFtSW1wDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcCgpOw0KLSAgICB2aXJ0dWFsIH5DRlhfRmlsZVdyaXRlU3RyZWFtSW1wKCkge30NCi0gICAgRlhfQk9PTAkJCUxvYWRGaWxlV3JpdGUoSUZYX0ZpbGVXcml0ZSAqcEZpbGVXcml0ZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldExlbmd0aCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRQb3NpdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lQb3NpdGlvbjsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTWF4TGVuZ3RoLCBGWF9CT09MICZiRU9TKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJRmx1c2goKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICBJRlhfRmlsZVdyaXRlCQkJKm1fcEZpbGVXcml0ZTsNCi0gICAgaW50MzJfdAkJCQltX2lQb3NpdGlvbjsNCitjbGFzcyBDRlhfQnVmZmVyU3RyZWFtSW1wIDogcHVibGljIENGWF9TdHJlYW1JbXAgew0KKyBwdWJsaWM6DQorICBDRlhfQnVmZmVyU3RyZWFtSW1wKCk7DQorICB2aXJ0dWFsIH5DRlhfQnVmZmVyU3RyZWFtSW1wKCkge30NCisgIEZYX0JPT0wgTG9hZEJ1ZmZlcih1aW50OF90KiBwRGF0YSwgaW50MzJfdCBpVG90YWxTaXplLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFBvc2l0aW9uKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIEZYX0JPT0wmIGJFT1MpOw0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKTsNCisgIHZpcnR1YWwgdm9pZCBGbHVzaCgpIHt9DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgeyByZXR1cm4gRkFMU0U7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgdWludDhfdCogbV9wRGF0YTsNCisgIGludDMyX3QgbV9pVG90YWxTaXplOw0KKyAgaW50MzJfdCBtX2lQb3NpdGlvbjsNCisgIGludDMyX3QgbV9pTGVuZ3RoOw0KK307DQorY2xhc3MgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wIDogcHVibGljIENGWF9TdHJlYW1JbXAgew0KKyBwdWJsaWM6DQorICBDRlhfRmlsZVJlYWRTdHJlYW1JbXAoKTsNCisgIHZpcnR1YWwgfkNGWF9GaWxlUmVhZFN0cmVhbUltcCgpIHt9DQorICBGWF9CT09MIExvYWRGaWxlUmVhZChJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRQb3NpdGlvbigpIHsgcmV0dXJuIG1faVBvc2l0aW9uOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKSBjb25zdDsNCisNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIEZYX0JPT0wmIGJFT1MpOw0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgRmx1c2goKSB7fQ0KKyAgdmlydHVhbCBGWF9CT09MIFNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpIHsgcmV0dXJuIEZBTFNFOyB9DQorDQorIHByb3RlY3RlZDoNCisgIElGWF9GaWxlUmVhZCogbV9wRmlsZVJlYWQ7DQorICBpbnQzMl90IG1faVBvc2l0aW9uOw0KKyAgaW50MzJfdCBtX2lMZW5ndGg7DQorfTsNCitjbGFzcyBDRlhfQnVmZmVyUmVhZFN0cmVhbUltcCA6IHB1YmxpYyBDRlhfU3RyZWFtSW1wIHsNCisgcHVibGljOg0KKyAgQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXAoKTsNCisgIH5DRlhfQnVmZmVyUmVhZFN0cmVhbUltcCgpOw0KKyAgRlhfQk9PTCBMb2FkQnVmZmVyUmVhZChJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZpbGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0FjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVsZWFzZUJ1ZmZlclJlYWQpOw0KKw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRQb3NpdGlvbigpIHsgcmV0dXJuIG1faVBvc2l0aW9uOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKSBjb25zdDsNCisNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIEZYX0JPT0wmIGJFT1MpOw0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgRmx1c2goKSB7fQ0KKyAgdmlydHVhbCBGWF9CT09MIFNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpIHsgcmV0dXJuIEZBTFNFOyB9DQorDQorIHByaXZhdGU6DQorICBJRlhfQnVmZmVyUmVhZCogbV9wQnVmZmVyUmVhZDsNCisgIEZYX0JPT0wgbV9iUmVsZWFzZUJ1ZmZlclJlYWQ7DQorICBpbnQzMl90IG1faVBvc2l0aW9uOw0KKyAgaW50MzJfdCBtX2lCdWZmZXJTaXplOw0KK307DQorY2xhc3MgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcCA6IHB1YmxpYyBDRlhfU3RyZWFtSW1wIHsNCisgcHVibGljOg0KKyAgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcCgpOw0KKyAgdmlydHVhbCB+Q0ZYX0ZpbGVXcml0ZVN0cmVhbUltcCgpIHt9DQorICBGWF9CT09MIExvYWRGaWxlV3JpdGUoSUZYX0ZpbGVXcml0ZSogcEZpbGVXcml0ZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRQb3NpdGlvbigpIHsgcmV0dXJuIG1faVBvc2l0aW9uOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFT1MpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgV3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpOw0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpOw0KKyAgdmlydHVhbCB2b2lkIEZsdXNoKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgeyByZXR1cm4gRkFMU0U7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgSUZYX0ZpbGVXcml0ZSogbV9wRmlsZVdyaXRlOw0KKyAgaW50MzJfdCBtX2lQb3NpdGlvbjsNCiB9Ow0KIGVudW0gRlhfU1RSRUFNVFlQRSB7DQotICAgIEZYX1NSRUFNVFlQRV9Vbmtub3duCT0gIDAsDQotICAgIEZYX1NUUkVBTVRZUEVfRmlsZQkJCSwNCi0gICAgRlhfU1RSRUFNVFlQRV9CdWZmZXIJCSwNCi0gICAgRlhfU1RSRUFNVFlQRV9TdHJlYW0JCSwNCi0gICAgRlhfU1RSRUFNVFlQRV9CdWZmZXJSZWFkCSwNCisgIEZYX1NSRUFNVFlQRV9Vbmtub3duID0gMCwNCisgIEZYX1NUUkVBTVRZUEVfRmlsZSwNCisgIEZYX1NUUkVBTVRZUEVfQnVmZmVyLA0KKyAgRlhfU1RSRUFNVFlQRV9TdHJlYW0sDQorICBGWF9TVFJFQU1UWVBFX0J1ZmZlclJlYWQsDQogfTsNCi1jbGFzcyBDRlhfU3RyZWFtIDogcHVibGljIElGWF9TdHJlYW0sIHB1YmxpYyBDRlhfVGhyZWFkTG9jaw0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9TdHJlYW0oKTsNCi0gICAgfkNGWF9TdHJlYW0oKTsNCi0gICAgRlhfQk9PTAkJCUxvYWRGaWxlKGNvbnN0IEZYX1dDSEFSKiBwc3pTcmNGaWxlTmFtZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KLSAgICBGWF9CT09MCQkJTG9hZEJ1ZmZlcih1aW50OF90KiBwRGF0YSwgaW50MzJfdCBpVG90YWxTaXplLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQotICAgIEZYX0JPT0wJCQlMb2FkRmlsZVJlYWQoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQsIEZYX0RXT1JEIGR3QWNjZXNzKTsNCi0gICAgRlhfQk9PTAkJCUxvYWRGaWxlV3JpdGUoSUZYX0ZpbGVXcml0ZSAqcEZpbGVXcml0ZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KLSAgICBGWF9CT09MCQkJTG9hZEJ1ZmZlclJlYWQoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXJSZWFkLCBpbnQzMl90IGlGaWxlU2l6ZSwgRlhfRFdPUkQgZHdBY2Nlc3MsIEZYX0JPT0wgYlJlbGVhc2VCdWZmZXJSZWFkKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpOw0KLSAgICB2aXJ0dWFsIElGWF9TdHJlYW0qCQlSZXRhaW4oKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2V0QWNjZXNzTW9kZXMoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9kd0FjY2VzczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldExlbmd0aCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRQb3NpdGlvbigpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaU1heExlbmd0aCwgRlhfQk9PTCAmYkVPUywgaW50MzJfdCBjb25zdCAqcEJ5dGVTaXplID0gTlVMTCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJV3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlGbHVzaCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRCT00odWludDhfdCBib21bNF0pIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX1dPUkQJCQlHZXRDb2RlUGFnZSgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX1dPUkQJCQlTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUxvY2soKQ0KLSAgICB7DQotICAgICAgICBDRlhfVGhyZWFkTG9jazo6TG9jaygpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCVVubG9jaygpDQotICAgIHsNCi0gICAgICAgIENGWF9UaHJlYWRMb2NrOjpVbmxvY2soKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGWF9TdHJlYW0qCQlDcmVhdGVTaGFyZWRTdHJlYW0oRlhfRFdPUkQgZHdBY2Nlc3MsIGludDMyX3QgaU9mZnNldCwgaW50MzJfdCBpTGVuZ3RoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIEZYX1NUUkVBTVRZUEUJCQltX2VTdHJlYW1UeXBlOw0KLSAgICBDRlhfU3RyZWFtSW1wCQkJKm1fcFN0cmVhbUltcDsNCi0gICAgRlhfRFdPUkQJCQkJbV9kd0FjY2VzczsNCi0gICAgaW50MzJfdAkJCQltX2lUb3RhbFNpemU7DQotICAgIGludDMyX3QJCQkJbV9pUG9zaXRpb247DQotICAgIGludDMyX3QJCQkJbV9pU3RhcnQ7DQotICAgIGludDMyX3QJCQkJbV9pTGVuZ3RoOw0KLSAgICBpbnQzMl90CQkJCW1faVJlZkNvdW50Ow0KK2NsYXNzIENGWF9TdHJlYW0gOiBwdWJsaWMgSUZYX1N0cmVhbSwgcHVibGljIENGWF9UaHJlYWRMb2NrIHsNCisgcHVibGljOg0KKyAgQ0ZYX1N0cmVhbSgpOw0KKyAgfkNGWF9TdHJlYW0oKTsNCisgIEZYX0JPT0wgTG9hZEZpbGUoY29uc3QgRlhfV0NIQVIqIHBzelNyY0ZpbGVOYW1lLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICBGWF9CT09MIExvYWRCdWZmZXIodWludDhfdCogcERhdGEsIGludDMyX3QgaVRvdGFsU2l6ZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgRlhfQk9PTCBMb2FkRmlsZVJlYWQoSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQsIEZYX0RXT1JEIGR3QWNjZXNzKTsNCisgIEZYX0JPT0wgTG9hZEZpbGVXcml0ZShJRlhfRmlsZVdyaXRlKiBwRmlsZVdyaXRlLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICBGWF9CT09MIExvYWRCdWZmZXJSZWFkKElGWF9CdWZmZXJSZWFkKiBwQnVmZmVyUmVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmlsZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlQnVmZmVyUmVhZCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCBJRlhfU3RyZWFtKiBSZXRhaW4oKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0QWNjZXNzTW9kZXMoKSBjb25zdCB7IHJldHVybiBtX2R3QWNjZXNzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFBvc2l0aW9uKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWF4TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVPUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29uc3QqIHBCeXRlU2l6ZSA9IE5VTEwpOw0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKTsNCisgIHZpcnR1YWwgdm9pZCBGbHVzaCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEJPTSh1aW50OF90IGJvbVs0XSkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX1dPUkQgR2V0Q29kZVBhZ2UoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfV09SRCBTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSk7DQorICB2aXJ0dWFsIHZvaWQgTG9jaygpIHsgQ0ZYX1RocmVhZExvY2s6OkxvY2soKTsgfQ0KKyAgdmlydHVhbCB2b2lkIFVubG9jaygpIHsgQ0ZYX1RocmVhZExvY2s6OlVubG9jaygpOyB9DQorICB2aXJ0dWFsIElGWF9TdHJlYW0qIENyZWF0ZVNoYXJlZFN0cmVhbShGWF9EV09SRCBkd0FjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCk7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX1NUUkVBTVRZUEUgbV9lU3RyZWFtVHlwZTsNCisgIENGWF9TdHJlYW1JbXAqIG1fcFN0cmVhbUltcDsNCisgIEZYX0RXT1JEIG1fZHdBY2Nlc3M7DQorICBpbnQzMl90IG1faVRvdGFsU2l6ZTsNCisgIGludDMyX3QgbV9pUG9zaXRpb247DQorICBpbnQzMl90IG1faVN0YXJ0Ow0KKyAgaW50MzJfdCBtX2lMZW5ndGg7DQorICBpbnQzMl90IG1faVJlZkNvdW50Ow0KIH07DQotY2xhc3MgQ0ZYX1RleHRTdHJlYW0gOiBwdWJsaWMgSUZYX1N0cmVhbSwgcHVibGljIENGWF9UaHJlYWRMb2NrDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX1RleHRTdHJlYW0oSUZYX1N0cmVhbSAqcFN0cmVhbSwgRlhfQk9PTCBiRGVsU3RyZWFtKTsNCi0gICAgfkNGWF9UZXh0U3RyZWFtKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCk7DQotICAgIHZpcnR1YWwgSUZYX1N0cmVhbSoJCQlSZXRhaW4oKTsNCitjbGFzcyBDRlhfVGV4dFN0cmVhbSA6IHB1YmxpYyBJRlhfU3RyZWFtLCBwdWJsaWMgQ0ZYX1RocmVhZExvY2sgew0KKyBwdWJsaWM6DQorICBDRlhfVGV4dFN0cmVhbShJRlhfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJEZWxTdHJlYW0pOw0KKyAgfkNGWF9UZXh0U3RyZWFtKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCBJRlhfU3RyZWFtKiBSZXRhaW4oKTsNCiANCi0gICAgdmlydHVhbCBGWF9EV09SRAkJCUdldEFjY2Vzc01vZGVzKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldExlbmd0aCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFBvc2l0aW9uKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0VPRigpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRBY2Nlc3NNb2RlcygpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRQb3NpdGlvbigpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgY29uc3Q7DQogDQotICAgIHZpcnR1YWwgaW50MzJfdAkJCVJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MsIGludDMyX3QgY29uc3QgKnBCeXRlU2l6ZSA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCVdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJRmx1c2goKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCVNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpOw0KKyAgdmlydHVhbCBpbnQzMl90IFJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpOw0KKyAgdmlydHVhbCBpbnQzMl90IFJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb25zdCogcEJ5dGVTaXplID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgV3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpOw0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpOw0KKyAgdmlydHVhbCB2b2lkIEZsdXNoKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCk7DQogDQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldEJPTSh1aW50OF90IGJvbVs0XSkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfV09SRAkJCQlHZXRDb2RlUGFnZSgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX1dPUkQJCQkJU2V0Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEJPTSh1aW50OF90IGJvbVs0XSkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX1dPUkQgR2V0Q29kZVBhZ2UoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfV09SRCBTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSk7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCQlMb2NrKCkNCi0gICAgew0KLSAgICAgICAgQ0ZYX1RocmVhZExvY2s6OkxvY2soKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJVW5sb2NrKCkNCi0gICAgew0KLSAgICAgICAgQ0ZYX1RocmVhZExvY2s6OlVubG9jaygpOw0KLSAgICB9DQorICB2aXJ0dWFsIHZvaWQgTG9jaygpIHsgQ0ZYX1RocmVhZExvY2s6OkxvY2soKTsgfQ0KKyAgdmlydHVhbCB2b2lkIFVubG9jaygpIHsgQ0ZYX1RocmVhZExvY2s6OlVubG9jaygpOyB9DQogDQotICAgIHZpcnR1YWwgSUZYX1N0cmVhbSoJCQlDcmVhdGVTaGFyZWRTdHJlYW0oRlhfRFdPUkQgZHdBY2Nlc3MsIGludDMyX3QgaU9mZnNldCwgaW50MzJfdCBpTGVuZ3RoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIEZYX1dPUkQJCW1fd0NvZGVQYWdlOw0KLSAgICBGWF9XT1JECQltX3dCT01MZW5ndGg7DQotICAgIEZYX0RXT1JECW1fZHdCT007DQotICAgIHVpbnQ4X3QqCW1fcEJ1ZjsNCi0gICAgaW50MzJfdAltX2lCdWZTaXplOw0KLSAgICBGWF9CT09MCQltX2JEZWxTdHJlYW07DQotICAgIElGWF9TdHJlYW0JKm1fcFN0cmVhbUltcDsNCi0gICAgaW50MzJfdAltX2lSZWZDb3VudDsNCi0gICAgdm9pZAkJSW5pdFN0cmVhbSgpOw0KKyAgdmlydHVhbCBJRlhfU3RyZWFtKiBDcmVhdGVTaGFyZWRTdHJlYW0oRlhfRFdPUkQgZHdBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9XT1JEIG1fd0NvZGVQYWdlOw0KKyAgRlhfV09SRCBtX3dCT01MZW5ndGg7DQorICBGWF9EV09SRCBtX2R3Qk9NOw0KKyAgdWludDhfdCogbV9wQnVmOw0KKyAgaW50MzJfdCBtX2lCdWZTaXplOw0KKyAgRlhfQk9PTCBtX2JEZWxTdHJlYW07DQorICBJRlhfU3RyZWFtKiBtX3BTdHJlYW1JbXA7DQorICBpbnQzMl90IG1faVJlZkNvdW50Ow0KKyAgdm9pZCBJbml0U3RyZWFtKCk7DQogfTsNCiAjaWZkZWYgRlhfRklMRVNJWkUNCi1jbGFzcyBDRkdBU19GaWxlUmVhZCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQNCi17DQotcHVibGljOg0KLSAgICBDRkdBU19GaWxlUmVhZChJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKTsNCi0gICAgdmlydHVhbCB+Q0ZHQVNfRmlsZVJlYWQoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFNpemUoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9CT09MCQkJCQltX2JSZWxlYXNlU3RyZWFtOw0KLSAgICBJRlhfU3RyZWFtCQkJCSptX3BTdHJlYW07DQorY2xhc3MgQ0ZHQVNfRmlsZVJlYWQgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkIHsNCisgcHVibGljOg0KKyAgQ0ZHQVNfRmlsZVJlYWQoSUZYX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSk7DQorICB2aXJ0dWFsIH5DRkdBU19GaWxlUmVhZCgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFNpemUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBtX2JSZWxlYXNlU3RyZWFtOw0KKyAgSUZYX1N0cmVhbSogbV9wU3RyZWFtOw0KIH07DQogI2Vsc2UNCi1jbGFzcyBDRkdBU19GaWxlUmVhZCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQNCi17DQotcHVibGljOg0KLSAgICBDRkdBU19GaWxlUmVhZChJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKTsNCi0gICAgdmlydHVhbCB+Q0ZHQVNfRmlsZVJlYWQoKTsNCitjbGFzcyBDRkdBU19GaWxlUmVhZCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQgew0KKyBwdWJsaWM6DQorICBDRkdBU19GaWxlUmVhZChJRlhfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKTsNCisgIHZpcnR1YWwgfkNGR0FTX0ZpbGVSZWFkKCk7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRTaXplKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0RXT1JEIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0U2l6ZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0RXT1JEIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSk7DQogDQotcHJvdGVjdGVkOg0KLSAgICBGWF9CT09MCQkJCQltX2JSZWxlYXNlU3RyZWFtOw0KLSAgICBJRlhfU3RyZWFtCQkJCSptX3BTdHJlYW07DQorIHByb3RlY3RlZDoNCisgIEZYX0JPT0wgbV9iUmVsZWFzZVN0cmVhbTsNCisgIElGWF9TdHJlYW0qIG1fcFN0cmVhbTsNCiB9Ow0KICNlbmRpZg0KICNpZmRlZiBGWF9GSUxFU0laRQ0KLWNsYXNzIENGWF9CdWZmZXJBY2NJbXAgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX0J1ZmZlckFjY0ltcChJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlclJlYWQsIEZYX0ZJTEVTSVpFIGlGaWxlU2l6ZSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSk7DQotICAgIHZpcnR1YWwgfkNGWF9CdWZmZXJBY2NJbXAoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFNpemUoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7DQotcHJvdGVjdGVkOg0KLSAgICBJRlhfQnVmZmVyUmVhZAkJCSptX3BCdWZmZXJSZWFkOw0KLSAgICBGWF9CT09MCQkJCQltX2JSZWxlYXNlU3RyZWFtOw0KLSAgICBGWF9GSUxFU0laRQkJCQltX2lCdWZTaXplOw0KK2NsYXNzIENGWF9CdWZmZXJBY2NJbXAgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkIHsNCisgcHVibGljOg0KKyAgQ0ZYX0J1ZmZlckFjY0ltcChJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGlGaWxlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSk7DQorICB2aXJ0dWFsIH5DRlhfQnVmZmVyQWNjSW1wKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0U2l6ZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRlhfQnVmZmVyUmVhZCogbV9wQnVmZmVyUmVhZDsNCisgIEZYX0JPT0wgbV9iUmVsZWFzZVN0cmVhbTsNCisgIEZYX0ZJTEVTSVpFIG1faUJ1ZlNpemU7DQogfTsNCiAjZWxzZQ0KLWNsYXNzIENGWF9CdWZmZXJBY2NJbXAgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX0J1ZmZlckFjY0ltcChJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlclJlYWQsIGludDMyX3QgaUZpbGVTaXplLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKTsNCi0gICAgdmlydHVhbCB+Q0ZYX0J1ZmZlckFjY0ltcCgpOw0KK2NsYXNzIENGWF9CdWZmZXJBY2NJbXAgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkIHsNCisgcHVibGljOg0KKyAgQ0ZYX0J1ZmZlckFjY0ltcChJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZpbGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKTsNCisgIHZpcnR1YWwgfkNGWF9CdWZmZXJBY2NJbXAoKTsNCiANCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldFNpemUoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRFdPUkQgb2Zmc2V0LCBGWF9EV09SRCBzaXplKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRTaXplKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRFdPUkQgb2Zmc2V0LCBGWF9EV09SRCBzaXplKTsNCiANCi1wcm90ZWN0ZWQ6DQotICAgIElGWF9CdWZmZXJSZWFkCQkJKm1fcEJ1ZmZlclJlYWQ7DQotICAgIEZYX0JPT0wJCQkJCW1fYlJlbGVhc2VTdHJlYW07DQotICAgIGludDMyX3QJCQkJbV9pQnVmU2l6ZTsNCisgcHJvdGVjdGVkOg0KKyAgSUZYX0J1ZmZlclJlYWQqIG1fcEJ1ZmZlclJlYWQ7DQorICBGWF9CT09MIG1fYlJlbGVhc2VTdHJlYW07DQorICBpbnQzMl90IG1faUJ1ZlNpemU7DQogfTsNCiAjZW5kaWYNCiAjaWZkZWYgRlhfRklMRVNJWkUNCi1jbGFzcyBDRkdBU19GaWxlV3JpdGUgOiBwdWJsaWMgSUZYX0ZpbGVXcml0ZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGR0FTX0ZpbGVXcml0ZShJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKTsNCi0gICAgdmlydHVhbCB+Q0ZHQVNfRmlsZVdyaXRlKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRTaXplKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUZsdXNoKCk7DQotICAgIHZpcnR1YWwJRlhfQk9PTAkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKTsNCi0gICAgdmlydHVhbAlGWF9CT09MCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7DQotcHJvdGVjdGVkOg0KLSAgICBJRlhfU3RyZWFtCQkJCSptX3BTdHJlYW07DQotICAgIEZYX0JPT0wJCQkJCW1fYlJlbGVhc2VTdHJlYW07DQorY2xhc3MgQ0ZHQVNfRmlsZVdyaXRlIDogcHVibGljIElGWF9GaWxlV3JpdGUgew0KKyBwdWJsaWM6DQorICBDRkdBU19GaWxlV3JpdGUoSUZYX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSk7DQorICB2aXJ0dWFsIH5DRkdBU19GaWxlV3JpdGUoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRTaXplKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmx1c2goKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZYX1N0cmVhbSogbV9wU3RyZWFtOw0KKyAgRlhfQk9PTCBtX2JSZWxlYXNlU3RyZWFtOw0KIH07DQogI2Vsc2UNCi1jbGFzcyBDRkdBU19GaWxlV3JpdGUgOiBwdWJsaWMgSUZYX0ZpbGVXcml0ZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGR0FTX0ZpbGVXcml0ZShJRlhfU3RyZWFtICpwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKTsNCi0gICAgdmlydHVhbCB+Q0ZHQVNfRmlsZVdyaXRlKCk7DQorY2xhc3MgQ0ZHQVNfRmlsZVdyaXRlIDogcHVibGljIElGWF9GaWxlV3JpdGUgew0KKyBwdWJsaWM6DQorICBDRkdBU19GaWxlV3JpdGUoSUZYX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSk7DQorICB2aXJ0dWFsIH5DRkdBU19GaWxlV3JpdGUoKTsNCiANCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldFNpemUoKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJRmx1c2goKTsNCi0gICAgdmlydHVhbAlGWF9CT09MCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSk7DQotICAgIHZpcnR1YWwJRlhfQk9PTAkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIEZYX0RXT1JEIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0U2l6ZSgpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBGbHVzaCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIEZYX0RXT1JEIHNpemUpOw0KKyAgdmlydHVhbCBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIEZYX0RXT1JEIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSk7DQogDQotcHJvdGVjdGVkOg0KLSAgICBJRlhfU3RyZWFtCQkJCSptX3BTdHJlYW07DQotICAgIEZYX0JPT0wJCQkJCW1fYlJlbGVhc2VTdHJlYW07DQorIHByb3RlY3RlZDoNCisgIElGWF9TdHJlYW0qIG1fcFN0cmVhbTsNCisgIEZYX0JPT0wgbV9iUmVsZWFzZVN0cmVhbTsNCiB9Ow0KICNlbmRpZg0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N5c3RlbS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9zeXN0ZW0uY3BwCmluZGV4IDg0M2UyOWMuLmM5NjVhYjIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N5c3RlbS5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfc3lzdGVtLmNwcApAQCAtNSw3ICs1LDggQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQogDQogI2luY2x1ZGUgIi4uL2ZnYXNfYmFzZS5oIg0KLSNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IFwNCisgICAgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQogI2luY2x1ZGUgPGlvLmg+DQogI2VsaWYgX0ZYX09TXyA9PSBfRlhfTElOVVhfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfTElOVVhfTWluaV8NCiAjaW5jbHVkZSA8c3lzL3RpbWVzLmg+DQpAQCAtMTMsMjIzICsxNCwyMTMgQEAKICNpZmRlZiBfX2NwbHVzcGx1cw0KIGV4dGVybiAiQyIgew0KICNlbmRpZg0KLUZYX0ZMT0FUIEZYX3RhbihGWF9GTE9BVCBhKQ0KLXsNCi0gICAgcmV0dXJuIChGWF9GTE9BVCl0YW4oYSk7DQorRlhfRkxPQVQgRlhfdGFuKEZYX0ZMT0FUIGEpIHsNCisgIHJldHVybiAoRlhfRkxPQVQpdGFuKGEpOw0KIH0NCi1GWF9GTE9BVCBGWF9sb2coRlhfRkxPQVQgYiwgRlhfRkxPQVQgeCkNCi17DQotICAgIHJldHVybiBGWFNZU19sb2coeCkgLyBGWFNZU19sb2coYik7DQorRlhfRkxPQVQgRlhfbG9nKEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIHgpIHsNCisgIHJldHVybiBGWFNZU19sb2coeCkgLyBGWFNZU19sb2coYik7DQogfQ0KLUZYX1dDSEFSKiBGWF93Y3NuY3B5KEZYX1dDSEFSKiBkc3RTdHIsIGNvbnN0IEZYX1dDSEFSKiBzcmNTdHIsIHNpemVfdCBjb3VudCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChkc3RTdHIgIT0gTlVMTCAmJiBzcmNTdHIgIT0gTlVMTCAmJiBjb3VudCA+IDApOw0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpDQotICAgICAgICBpZiAoKGRzdFN0cltpXSA9IHNyY1N0cltpXSkgPT0gTCdcMCcpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgcmV0dXJuIGRzdFN0cjsNCi19DQotaW50MzJfdCBGWF93Y3NuaWNtcChjb25zdCBGWF9XQ0hBUiogczEsIGNvbnN0IEZYX1dDSEFSKiBzMiwgc2l6ZV90IGNvdW50KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHMxICE9IE5VTEwgJiYgczIgIT0gTlVMTCAmJiBjb3VudCA+IDApOw0KLSAgICBGWF9XQ0hBUiB3Y2gxID0gMCwgd2NoMiA9IDA7DQotICAgIHdoaWxlIChjb3VudC0tID4gMCkgew0KLSAgICAgICAgd2NoMSA9IChGWF9XQ0hBUilGWF90b2xvd2VyKCpzMSsrKTsNCi0gICAgICAgIHdjaDIgPSAoRlhfV0NIQVIpRlhfdG9sb3dlcigqczIrKyk7DQotICAgICAgICBpZiAod2NoMSAhPSB3Y2gyKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQorRlhfV0NIQVIqIEZYX3djc25jcHkoRlhfV0NIQVIqIGRzdFN0ciwgY29uc3QgRlhfV0NIQVIqIHNyY1N0ciwgc2l6ZV90IGNvdW50KSB7DQorICBGWFNZU19hc3NlcnQoZHN0U3RyICE9IE5VTEwgJiYgc3JjU3RyICE9IE5VTEwgJiYgY291bnQgPiAwKTsNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkNCisgICAgaWYgKChkc3RTdHJbaV0gPSBzcmNTdHJbaV0pID09IEwnXDAnKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIHdjaDEgLSB3Y2gyOw0KKyAgcmV0dXJuIGRzdFN0cjsNCiB9DQotaW50MzJfdCBGWF9zdHJuaWNtcChjb25zdCBGWF9DSEFSKiBzMSwgY29uc3QgRlhfQ0hBUiogczIsIHNpemVfdCBjb3VudCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChzMSAhPSBOVUxMICYmIHMyICE9IE5VTEwgJiYgY291bnQgPiAwKTsNCi0gICAgRlhfQ0hBUiBjaDEgPSAwLCBjaDIgPSAwOw0KLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsNCi0gICAgICAgIGNoMSA9IChGWF9DSEFSKUZYX3RvbG93ZXIoKnMxKyspOw0KLSAgICAgICAgY2gyID0gKEZYX0NIQVIpRlhfdG9sb3dlcigqczIrKyk7DQotICAgICAgICBpZiAoY2gxICE9IGNoMikgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KK2ludDMyX3QgRlhfd2NzbmljbXAoY29uc3QgRlhfV0NIQVIqIHMxLCBjb25zdCBGWF9XQ0hBUiogczIsIHNpemVfdCBjb3VudCkgew0KKyAgRlhTWVNfYXNzZXJ0KHMxICE9IE5VTEwgJiYgczIgIT0gTlVMTCAmJiBjb3VudCA+IDApOw0KKyAgRlhfV0NIQVIgd2NoMSA9IDAsIHdjaDIgPSAwOw0KKyAgd2hpbGUgKGNvdW50LS0gPiAwKSB7DQorICAgIHdjaDEgPSAoRlhfV0NIQVIpRlhfdG9sb3dlcigqczErKyk7DQorICAgIHdjaDIgPSAoRlhfV0NIQVIpRlhfdG9sb3dlcigqczIrKyk7DQorICAgIGlmICh3Y2gxICE9IHdjaDIpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gY2gxIC0gY2gyOw0KKyAgfQ0KKyAgcmV0dXJuIHdjaDEgLSB3Y2gyOw0KIH0NCi1pbnQzMl90IEZYX2ZpbGVsZW5ndGgoRlhTWVNfRklMRSAqZmlsZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChmaWxlICE9IE5VTEwpOw0KK2ludDMyX3QgRlhfc3RybmljbXAoY29uc3QgRlhfQ0hBUiogczEsIGNvbnN0IEZYX0NIQVIqIHMyLCBzaXplX3QgY291bnQpIHsNCisgIEZYU1lTX2Fzc2VydChzMSAhPSBOVUxMICYmIHMyICE9IE5VTEwgJiYgY291bnQgPiAwKTsNCisgIEZYX0NIQVIgY2gxID0gMCwgY2gyID0gMDsNCisgIHdoaWxlIChjb3VudC0tID4gMCkgew0KKyAgICBjaDEgPSAoRlhfQ0hBUilGWF90b2xvd2VyKCpzMSsrKTsNCisgICAgY2gyID0gKEZYX0NIQVIpRlhfdG9sb3dlcigqczIrKyk7DQorICAgIGlmIChjaDEgIT0gY2gyKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBjaDEgLSBjaDI7DQorfQ0KK2ludDMyX3QgRlhfZmlsZWxlbmd0aChGWFNZU19GSUxFKiBmaWxlKSB7DQorICBGWFNZU19hc3NlcnQoZmlsZSAhPSBOVUxMKTsNCiAjaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQotICAgIHJldHVybiBfZmlsZWxlbmd0aChfZmlsZW5vKGZpbGUpKTsNCisgIHJldHVybiBfZmlsZWxlbmd0aChfZmlsZW5vKGZpbGUpKTsNCiAjZWxzZQ0KLSAgICBpbnQzMl90IGlQb3MgPSBGWFNZU19mdGVsbChmaWxlKTsNCi0gICAgRlhTWVNfZnNlZWsoZmlsZSwgMCwgRlhTWVNfU0VFS19FTkQpOw0KLSAgICBpbnQzMl90IGlMZW4gPSBGWFNZU19mdGVsbChmaWxlKTsNCi0gICAgRlhTWVNfZnNlZWsoZmlsZSwgaVBvcywgRlhTWVNfU0VFS19TRVQpOw0KLSAgICByZXR1cm4gaUxlbjsNCisgIGludDMyX3QgaVBvcyA9IEZYU1lTX2Z0ZWxsKGZpbGUpOw0KKyAgRlhTWVNfZnNlZWsoZmlsZSwgMCwgRlhTWVNfU0VFS19FTkQpOw0KKyAgaW50MzJfdCBpTGVuID0gRlhTWVNfZnRlbGwoZmlsZSk7DQorICBGWFNZU19mc2VlayhmaWxlLCBpUG9zLCBGWFNZU19TRUVLX1NFVCk7DQorICByZXR1cm4gaUxlbjsNCiAjZW5kaWYNCiB9DQotRlhfQk9PTCBGWF9mc2V0c2l6ZShGWFNZU19GSUxFICpmaWxlLCBpbnQzMl90IHNpemUpDQotew0KLSAgICBGWFNZU19hc3NlcnQoZmlsZSAhPSBOVUxMKTsNCitGWF9CT09MIEZYX2ZzZXRzaXplKEZYU1lTX0ZJTEUqIGZpbGUsIGludDMyX3Qgc2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KGZpbGUgIT0gTlVMTCk7DQogI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KLSAgICByZXR1cm4gX2Noc2l6ZShfZmlsZW5vKGZpbGUpLCBzaXplKSA9PSAwOw0KKyAgcmV0dXJuIF9jaHNpemUoX2ZpbGVubyhmaWxlKSwgc2l6ZSkgPT0gMDsNCiAjZWxpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfDQotICAgIEhBTkRMRSBoRmlsZSA9IF9maWxlbm8oZmlsZSk7DQotICAgIEZYX0RXT1JEIGR3UG9zID0gOjpTZXRGaWxlUG9pbnRlcihoRmlsZSwgMCwgMCwgRklMRV9DVVJSRU5UKTsNCi0gICAgOjpTZXRGaWxlUG9pbnRlcihoRmlsZSwgc2l6ZSwgMCwgRklMRV9CRUdJTik7DQotICAgIEZYX0JPT0wgYlJldCA9IDo6U2V0RW5kT2ZGaWxlKGhGaWxlKTsNCi0gICAgOjpTZXRGaWxlUG9pbnRlcihoRmlsZSwgKGludDMyX3QpZHdQb3MsIDAsIEZJTEVfQkVHSU4pOw0KLSAgICByZXR1cm4gYlJldDsNCisgIEhBTkRMRSBoRmlsZSA9IF9maWxlbm8oZmlsZSk7DQorICBGWF9EV09SRCBkd1BvcyA9IDo6U2V0RmlsZVBvaW50ZXIoaEZpbGUsIDAsIDAsIEZJTEVfQ1VSUkVOVCk7DQorICA6OlNldEZpbGVQb2ludGVyKGhGaWxlLCBzaXplLCAwLCBGSUxFX0JFR0lOKTsNCisgIEZYX0JPT0wgYlJldCA9IDo6U2V0RW5kT2ZGaWxlKGhGaWxlKTsNCisgIDo6U2V0RmlsZVBvaW50ZXIoaEZpbGUsIChpbnQzMl90KWR3UG9zLCAwLCBGSUxFX0JFR0lOKTsNCisgIHJldHVybiBiUmV0Ow0KICNlbHNlDQotICAgIHJldHVybiBGQUxTRTsNCisgIHJldHVybiBGQUxTRTsNCiAjZW5kaWYNCiB9DQotRlhfRkxPQVQgRlhfc3RydG9mKGNvbnN0IEZYX0NIQVIqIHBjc1N0ciwgaW50MzJfdCBpTGVuZ3RoICwgaW50MzJfdCAqcFVzZWRMZW4gKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBjc1N0ciAhPSBOVUxMKTsNCi0gICAgaWYgKGlMZW5ndGggPCAwKSB7DQotICAgICAgICBpTGVuZ3RoID0gRlhTWVNfc3RybGVuKHBjc1N0cik7DQotICAgIH0NCi0gICAgcmV0dXJuIEZYX3djc3RvZihDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBjc1N0ciwgaUxlbmd0aCksIGlMZW5ndGgsIHBVc2VkTGVuKTsNCitGWF9GTE9BVCBGWF9zdHJ0b2YoY29uc3QgRlhfQ0hBUiogcGNzU3RyLCBpbnQzMl90IGlMZW5ndGgsIGludDMyX3QqIHBVc2VkTGVuKSB7DQorICBGWFNZU19hc3NlcnQocGNzU3RyICE9IE5VTEwpOw0KKyAgaWYgKGlMZW5ndGggPCAwKSB7DQorICAgIGlMZW5ndGggPSBGWFNZU19zdHJsZW4ocGNzU3RyKTsNCisgIH0NCisgIHJldHVybiBGWF93Y3N0b2YoQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwY3NTdHIsIGlMZW5ndGgpLCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICBwVXNlZExlbik7DQogfQ0KLUZYX0ZMT0FUIEZYX3djc3RvZihjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGggLCBpbnQzMl90ICpwVXNlZExlbiApDQotew0KLSAgICBGWFNZU19hc3NlcnQocHdzU3RyICE9IE5VTEwpOw0KLSAgICBpZiAoaUxlbmd0aCA8IDApIHsNCi0gICAgICAgIGlMZW5ndGggPSBGWFNZU193Y3NsZW4ocHdzU3RyKTsNCitGWF9GTE9BVCBGWF93Y3N0b2YoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBpbnQzMl90KiBwVXNlZExlbikgew0KKyAgRlhTWVNfYXNzZXJ0KHB3c1N0ciAhPSBOVUxMKTsNCisgIGlmIChpTGVuZ3RoIDwgMCkgew0KKyAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHB3c1N0cik7DQorICB9DQorICBpZiAoaUxlbmd0aCA9PSAwKSB7DQorICAgIHJldHVybiAwLjBmOw0KKyAgfQ0KKyAgaW50MzJfdCBpVXNlZExlbiA9IDA7DQorICBGWF9CT09MIGJOZWd0aXZlID0gRkFMU0U7DQorICBzd2l0Y2ggKHB3c1N0cltpVXNlZExlbl0pIHsNCisgICAgY2FzZSAnLSc6DQorICAgICAgYk5lZ3RpdmUgPSBUUlVFOw0KKyAgICBjYXNlICcrJzoNCisgICAgICBpVXNlZExlbisrOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlZhbHVlID0gMC4wZjsNCisgIHdoaWxlIChpVXNlZExlbiA8IGlMZW5ndGgpIHsNCisgICAgRlhfV0NIQVIgd2NoID0gcHdzU3RyW2lVc2VkTGVuXTsNCisgICAgaWYgKHdjaCA+PSBMJzAnICYmIHdjaCA8PSBMJzknKSB7DQorICAgICAgZlZhbHVlID0gZlZhbHVlICogMTAuMGYgKyAod2NoIC0gTCcwJyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKGlMZW5ndGggPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIDAuMGY7DQorICAgIGlVc2VkTGVuKys7DQorICB9DQorICBpZiAoaVVzZWRMZW4gPCBpTGVuZ3RoICYmIHB3c1N0cltpVXNlZExlbl0gPT0gTCcuJykgew0KKyAgICBGWF9GTE9BVCBmUHJlY2lzZSA9IDAuMWY7DQorICAgIHdoaWxlICgrK2lVc2VkTGVuIDwgaUxlbmd0aCkgew0KKyAgICAgIEZYX1dDSEFSIHdjaCA9IHB3c1N0cltpVXNlZExlbl07DQorICAgICAgaWYgKHdjaCA+PSBMJzAnICYmIHdjaCA8PSBMJzknKSB7DQorICAgICAgICBmVmFsdWUgKz0gKHdjaCAtIEwnMCcpICogZlByZWNpc2U7DQorICAgICAgICBmUHJlY2lzZSAqPSAwLjFmOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQogICAgIH0NCi0gICAgaW50MzJfdCBpVXNlZExlbiA9IDA7DQotICAgIEZYX0JPT0wgYk5lZ3RpdmUgPSBGQUxTRTsNCi0gICAgc3dpdGNoIChwd3NTdHJbaVVzZWRMZW5dKSB7DQotICAgICAgICBjYXNlICctJzoNCi0gICAgICAgICAgICBiTmVndGl2ZSA9IFRSVUU7DQotICAgICAgICBjYXNlICcrJzoNCi0gICAgICAgICAgICBpVXNlZExlbisrOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IDAuMGY7DQotICAgIHdoaWxlIChpVXNlZExlbiA8IGlMZW5ndGgpIHsNCi0gICAgICAgIEZYX1dDSEFSIHdjaCA9IHB3c1N0cltpVXNlZExlbl07DQotICAgICAgICBpZiAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpIHsNCi0gICAgICAgICAgICBmVmFsdWUgPSBmVmFsdWUgKiAxMC4wZiArICh3Y2ggLSBMJzAnKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpVXNlZExlbisrOw0KLSAgICB9DQotICAgIGlmIChpVXNlZExlbiA8IGlMZW5ndGggJiYgcHdzU3RyW2lVc2VkTGVuXSA9PSBMJy4nKSB7DQotICAgICAgICBGWF9GTE9BVCBmUHJlY2lzZSA9IDAuMWY7DQotICAgICAgICB3aGlsZSAoKytpVXNlZExlbiA8IGlMZW5ndGgpIHsNCi0gICAgICAgICAgICBGWF9XQ0hBUiB3Y2ggPSBwd3NTdHJbaVVzZWRMZW5dOw0KLSAgICAgICAgICAgIGlmICh3Y2ggPj0gTCcwJyAmJiB3Y2ggPD0gTCc5Jykgew0KLSAgICAgICAgICAgICAgICBmVmFsdWUgKz0gKHdjaCAtIEwnMCcpICogZlByZWNpc2U7DQotICAgICAgICAgICAgICAgIGZQcmVjaXNlICo9IDAuMWY7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChwVXNlZExlbikgew0KLSAgICAgICAgKnBVc2VkTGVuID0gaVVzZWRMZW47DQotICAgIH0NCi0gICAgcmV0dXJuIGJOZWd0aXZlID8gLWZWYWx1ZSA6IGZWYWx1ZTsNCisgIH0NCisgIGlmIChwVXNlZExlbikgew0KKyAgICAqcFVzZWRMZW4gPSBpVXNlZExlbjsNCisgIH0NCisgIHJldHVybiBiTmVndGl2ZSA/IC1mVmFsdWUgOiBmVmFsdWU7DQogfQ0KLXZvaWQgRlhfbWVtc2V0KHZvaWQqIHBCdWYsIGludDMyX3QgaVZhbHVlLCBzaXplX3Qgc2l6ZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwQnVmICE9IE5VTEwgJiYgc2l6ZSA+IDAgJiYgKHNpemUgJiAweDAzKSA9PSAwKTsNCi0gICAgRlhTWVNfYXNzZXJ0KCgoKHNpemVfdClwQnVmKSAmIDB4MDMpID09IDApOw0KLSAgICBGWF9EV09SRCAqcFN0YXJ0ID0gKEZYX0RXT1JEKilwQnVmOw0KLSAgICBGWF9EV09SRCAqcEVuZCA9IHBTdGFydCArIChzaXplID4+IDIpOw0KLSAgICB3aGlsZSAocFN0YXJ0IDwgcEVuZCkgew0KLSAgICAgICAgKnBTdGFydCArKyA9IGlWYWx1ZTsNCi0gICAgfQ0KK3ZvaWQgRlhfbWVtc2V0KHZvaWQqIHBCdWYsIGludDMyX3QgaVZhbHVlLCBzaXplX3Qgc2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBCdWYgIT0gTlVMTCAmJiBzaXplID4gMCAmJiAoc2l6ZSAmIDB4MDMpID09IDApOw0KKyAgRlhTWVNfYXNzZXJ0KCgoKHNpemVfdClwQnVmKSAmIDB4MDMpID09IDApOw0KKyAgRlhfRFdPUkQqIHBTdGFydCA9IChGWF9EV09SRCopcEJ1ZjsNCisgIEZYX0RXT1JEKiBwRW5kID0gcFN0YXJ0ICsgKHNpemUgPj4gMik7DQorICB3aGlsZSAocFN0YXJ0IDwgcEVuZCkgew0KKyAgICAqcFN0YXJ0KysgPSBpVmFsdWU7DQorICB9DQogfQ0KLXZvaWQgRlhfbWVtY3B5KHZvaWQqIHBEc3QsIGNvbnN0IHZvaWQqIHBTcmMsIHNpemVfdCBzaXplKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBEc3QgIT0gTlVMTCAmJiBwU3JjICE9IE5VTEwgJiYgc2l6ZSA+IDAgJiYgKHNpemUgJiAweDAzKSA9PSAwKTsNCi0gICAgRlhTWVNfYXNzZXJ0KCgoKHNpemVfdClwRHN0KSAmIDB4MDMpID09IDAgJiYgKCgoc2l6ZV90KXBTcmMpICYgMHgwMykgPT0gMCk7DQotICAgIEZYX0RXT1JEICpwU3RhcnQgPSAoRlhfRFdPUkQqKXBEc3Q7DQotICAgIEZYX0RXT1JEICpwRW5kID0gcFN0YXJ0ICsgKHNpemUgPj4gMik7DQotICAgIEZYX0RXT1JEICpwVmFsdWUgPSAoRlhfRFdPUkQqKXBTcmM7DQotICAgIHdoaWxlIChwU3RhcnQgPCBwRW5kKSB7DQotICAgICAgICAqcFN0YXJ0ICsrID0gKnBWYWx1ZSArKzsNCi0gICAgfQ0KK3ZvaWQgRlhfbWVtY3B5KHZvaWQqIHBEc3QsIGNvbnN0IHZvaWQqIHBTcmMsIHNpemVfdCBzaXplKSB7DQorICBGWFNZU19hc3NlcnQocERzdCAhPSBOVUxMICYmIHBTcmMgIT0gTlVMTCAmJiBzaXplID4gMCAmJiAoc2l6ZSAmIDB4MDMpID09IDApOw0KKyAgRlhTWVNfYXNzZXJ0KCgoKHNpemVfdClwRHN0KSAmIDB4MDMpID09IDAgJiYgKCgoc2l6ZV90KXBTcmMpICYgMHgwMykgPT0gMCk7DQorICBGWF9EV09SRCogcFN0YXJ0ID0gKEZYX0RXT1JEKilwRHN0Ow0KKyAgRlhfRFdPUkQqIHBFbmQgPSBwU3RhcnQgKyAoc2l6ZSA+PiAyKTsNCisgIEZYX0RXT1JEKiBwVmFsdWUgPSAoRlhfRFdPUkQqKXBTcmM7DQorICB3aGlsZSAocFN0YXJ0IDwgcEVuZCkgew0KKyAgICAqcFN0YXJ0KysgPSAqcFZhbHVlKys7DQorICB9DQogfQ0KLUZYX0JPT0wgRlhfSXNSZWxhdGl2ZVBhdGgoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1VybCkNCi17DQotICAgIGludDMyX3QgaVVybExlbiA9IHdzVXJsLkdldExlbmd0aCgpOw0KLSAgICBpZiAoaVVybExlbiA9PSAwKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBmb3IgKGludDMyX3QgaSA9IEZYX01JTig1LCBpVXJsTGVuKSAtIDE7IGkgPj0gMDsgLS1pKQ0KLSAgICAgICAgaWYgKHdzVXJsLkdldEF0KGkpID09ICc6Jykgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCitGWF9CT09MIEZYX0lzUmVsYXRpdmVQYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVcmwpIHsNCisgIGludDMyX3QgaVVybExlbiA9IHdzVXJsLkdldExlbmd0aCgpOw0KKyAgaWYgKGlVcmxMZW4gPT0gMCkgew0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gRlhfTUlOKDUsIGlVcmxMZW4pIC0gMTsgaSA+PSAwOyAtLWkpDQorICAgIGlmICh3c1VybC5HZXRBdChpKSA9PSAnOicpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIEZYX0pvaW5QYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NCYXNlUGF0aCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlbGF0aXZlUGF0aCwgQ0ZYX1dpZGVTdHJpbmcgJndzQWJzb2x1dGVQYXRoKQ0KLXsNCi0gICAgaWYgKCFGWF9Jc1JlbGF0aXZlUGF0aCh3c1JlbGF0aXZlUGF0aCkpIHsNCitGWF9CT09MIEZYX0pvaW5QYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NCYXNlUGF0aCwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NSZWxhdGl2ZVBhdGgsDQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBYnNvbHV0ZVBhdGgpIHsNCisgIGlmICghRlhfSXNSZWxhdGl2ZVBhdGgod3NSZWxhdGl2ZVBhdGgpKSB7DQorICAgIHdzQWJzb2x1dGVQYXRoID0gd3NSZWxhdGl2ZVBhdGg7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIHBSZWxTdGFydCA9IHdzUmVsYXRpdmVQYXRoLkdldFB0cigpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBSZWxFbmQgPSBwUmVsU3RhcnQgKyB3c1JlbGF0aXZlUGF0aC5HZXRMZW5ndGgoKTsNCisgIGlmIChwUmVsU3RhcnQgPCBwUmVsRW5kKSB7DQorICAgIHN3aXRjaCAoKnBSZWxTdGFydCkgew0KKyAgICAgIGNhc2UgJyMnOg0KKyAgICAgICAgd3NBYnNvbHV0ZVBhdGggPSBDRlhfV2lkZVN0cmluZyh3c0Jhc2VQYXRoLCB3c1JlbGF0aXZlUGF0aCk7DQorICAgICAgICByZXR1cm4gd3NBYnNvbHV0ZVBhdGguR2V0TGVuZ3RoKCkgPiAwOw0KKyAgICAgIGNhc2UgJy8nOg0KKyAgICAgIGNhc2UgJ1xcJzoNCiAgICAgICAgIHdzQWJzb2x1dGVQYXRoID0gd3NSZWxhdGl2ZVBhdGg7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFJlbFN0YXJ0ID0gd3NSZWxhdGl2ZVBhdGguR2V0UHRyKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwUmVsRW5kICAgPSBwUmVsU3RhcnQgKyB3c1JlbGF0aXZlUGF0aC5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKHBSZWxTdGFydCA8IHBSZWxFbmQpIHsNCi0gICAgICAgIHN3aXRjaCAoKnBSZWxTdGFydCkgew0KLSAgICAgICAgICAgIGNhc2UgJyMnOg0KLSAgICAgICAgICAgICAgICB3c0Fic29sdXRlUGF0aCA9IENGWF9XaWRlU3RyaW5nKHdzQmFzZVBhdGgsIHdzUmVsYXRpdmVQYXRoKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdzQWJzb2x1dGVQYXRoLkdldExlbmd0aCgpID4gMDsNCi0gICAgICAgICAgICBjYXNlICcvJzoNCi0gICAgICAgICAgICBjYXNlICdcXCc6DQotICAgICAgICAgICAgICAgIHdzQWJzb2x1dGVQYXRoID0gd3NSZWxhdGl2ZVBhdGg7DQotICAgICAgICAgICAgICAgIHJldHVybiB3c0Fic29sdXRlUGF0aC5HZXRMZW5ndGgoKSA+IDA7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBuQmFja0NvdW50ID0gMDsNCi0gICAgZm9yKDs7KSB7DQotICAgICAgICBpZiAocFJlbFN0YXJ0ID49IHBSZWxFbmQpIHsNCi0gICAgICAgICAgICB3c0Fic29sdXRlUGF0aCA9IHdzQmFzZVBhdGg7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoKnBSZWxTdGFydCAhPSAnLicpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwUmVsU3RhcnQgKyAxIDwgcFJlbEVuZCAmJg0KLSAgICAgICAgICAgICAgICAocFJlbFN0YXJ0WzFdID09ICcvJyB8fCBwUmVsU3RhcnRbMV0gPT0gJ1xcJykpIHsNCi0gICAgICAgICAgICBwUmVsU3RhcnQgKz0gMjsNCi0gICAgICAgIH0gZWxzZSBpZiAocFJlbFN0YXJ0ICsgMiA8IHBSZWxFbmQNCi0gICAgICAgICAgICAgICAgICAgJiYgcFJlbFN0YXJ0WzFdID09ICcuJw0KLSAgICAgICAgICAgICAgICAgICAmJiAocFJlbFN0YXJ0WzJdID09ICcvJyB8fCBwUmVsU3RhcnRbMl0gPT0gJ1xcJykpIHsNCi0gICAgICAgICAgICBwUmVsU3RhcnQgKz0gMzsNCi0gICAgICAgICAgICBuQmFja0NvdW50Kys7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBjb25zdCBGWF9XQ0hBUiogcEJhc2VTdGFydCA9IHdzQmFzZVBhdGguR2V0UHRyKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwQmFzZUVuZCAgID0gcEJhc2VTdGFydCArIHdzQmFzZVBhdGguR2V0TGVuZ3RoKCk7DQotICAgIHdoaWxlKHBCYXNlU3RhcnQgPCAoLS1wQmFzZUVuZCkgJiYgKnBCYXNlRW5kICE9ICcvJyAmJiAqcEJhc2VFbmQgIT0gJ1xcJykNCi0gICAgICAgIDsNCi0gICAgaWYgKHBCYXNlU3RhcnQgPT0gcEJhc2VFbmQpIHsNCi0gICAgICAgIHdzQWJzb2x1dGVQYXRoID0gQ0ZYX1dpZGVTdHJpbmdDKHBSZWxTdGFydCwgcFJlbEVuZCAtIHBSZWxTdGFydCk7DQogICAgICAgICByZXR1cm4gd3NBYnNvbHV0ZVBhdGguR2V0TGVuZ3RoKCkgPiAwOw0KICAgICB9DQotICAgIHdoaWxlIChuQmFja0NvdW50ID4gMCkgew0KLSAgICAgICAgaWYgKHBCYXNlU3RhcnQgPj0gKC0tcEJhc2VFbmQpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfSBlbHNlIGlmICgqcEJhc2VFbmQgPT0gJy8nIHx8ICpwQmFzZUVuZCA9PSAnXFwnKQ0KLSAgICAgICAgICAgIGlmICgoLS1uQmFja0NvdW50KSA8PSAwKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCisgIH0NCisgIGludDMyX3QgbkJhY2tDb3VudCA9IDA7DQorICBmb3IgKDs7KSB7DQorICAgIGlmIChwUmVsU3RhcnQgPj0gcFJlbEVuZCkgew0KKyAgICAgIHdzQWJzb2x1dGVQYXRoID0gd3NCYXNlUGF0aDsNCisgICAgICByZXR1cm4gVFJVRTsNCiAgICAgfQ0KLSAgICB3c0Fic29sdXRlUGF0aCA9IENGWF9XaWRlU3RyaW5nKENGWF9XaWRlU3RyaW5nQyhwQmFzZVN0YXJ0LCBwQmFzZUVuZCAtIHBCYXNlU3RhcnQgKyAxKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MocFJlbFN0YXJ0LCBwUmVsRW5kIC0gcFJlbFN0YXJ0KSk7DQorICAgIGlmICgqcFJlbFN0YXJ0ICE9ICcuJykgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChwUmVsU3RhcnQgKyAxIDwgcFJlbEVuZCAmJg0KKyAgICAgICAgKHBSZWxTdGFydFsxXSA9PSAnLycgfHwgcFJlbFN0YXJ0WzFdID09ICdcXCcpKSB7DQorICAgICAgcFJlbFN0YXJ0ICs9IDI7DQorICAgIH0gZWxzZSBpZiAocFJlbFN0YXJ0ICsgMiA8IHBSZWxFbmQgJiYgcFJlbFN0YXJ0WzFdID09ICcuJyAmJg0KKyAgICAgICAgICAgICAgIChwUmVsU3RhcnRbMl0gPT0gJy8nIHx8IHBSZWxTdGFydFsyXSA9PSAnXFwnKSkgew0KKyAgICAgIHBSZWxTdGFydCArPSAzOw0KKyAgICAgIG5CYWNrQ291bnQrKzsNCisgICAgfSBlbHNlIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiBwQmFzZVN0YXJ0ID0gd3NCYXNlUGF0aC5HZXRQdHIoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwQmFzZUVuZCA9IHBCYXNlU3RhcnQgKyB3c0Jhc2VQYXRoLkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKHBCYXNlU3RhcnQgPCAoLS1wQmFzZUVuZCkgJiYgKnBCYXNlRW5kICE9ICcvJyAmJiAqcEJhc2VFbmQgIT0gJ1xcJykNCisgICAgOw0KKyAgaWYgKHBCYXNlU3RhcnQgPT0gcEJhc2VFbmQpIHsNCisgICAgd3NBYnNvbHV0ZVBhdGggPSBDRlhfV2lkZVN0cmluZ0MocFJlbFN0YXJ0LCBwUmVsRW5kIC0gcFJlbFN0YXJ0KTsNCiAgICAgcmV0dXJuIHdzQWJzb2x1dGVQYXRoLkdldExlbmd0aCgpID4gMDsNCisgIH0NCisgIHdoaWxlIChuQmFja0NvdW50ID4gMCkgew0KKyAgICBpZiAocEJhc2VTdGFydCA+PSAoLS1wQmFzZUVuZCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0gZWxzZSBpZiAoKnBCYXNlRW5kID09ICcvJyB8fCAqcEJhc2VFbmQgPT0gJ1xcJykNCisgICAgICBpZiAoKC0tbkJhY2tDb3VudCkgPD0gMCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgfQ0KKyAgd3NBYnNvbHV0ZVBhdGggPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nKENGWF9XaWRlU3RyaW5nQyhwQmFzZVN0YXJ0LCBwQmFzZUVuZCAtIHBCYXNlU3RhcnQgKyAxKSwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MocFJlbFN0YXJ0LCBwUmVsRW5kIC0gcFJlbFN0YXJ0KSk7DQorICByZXR1cm4gd3NBYnNvbHV0ZVBhdGguR2V0TGVuZ3RoKCkgPiAwOw0KIH0NCiAjaWZkZWYgX19jcGx1c3BsdXMNCiB9Ow0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmNwcAppbmRleCBhNGIxODc3Li4wNzZjZDRkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF91dGlscy5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfdXRpbHMuY3BwCkBAIC02LDQ1MSArNiw0MjUgQEAKIA0KICNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCiAjaW5jbHVkZSAiZnhfdXRpbHMuaCINCi1DRlhfVGhyZWFkTG9jazo6Q0ZYX1RocmVhZExvY2soKQ0KLSAgICA6IG1fcERhdGEoTlVMTCkNCi17DQotfQ0KLUNGWF9UaHJlYWRMb2NrOjp+Q0ZYX1RocmVhZExvY2soKQ0KLXsNCi19DQotdm9pZCBDRlhfVGhyZWFkTG9jazo6TG9jaygpDQotew0KLX0NCi12b2lkIENGWF9UaHJlYWRMb2NrOjpVbmxvY2soKQ0KLXsNCi19DQorQ0ZYX1RocmVhZExvY2s6OkNGWF9UaHJlYWRMb2NrKCkgOiBtX3BEYXRhKE5VTEwpIHt9DQorQ0ZYX1RocmVhZExvY2s6On5DRlhfVGhyZWFkTG9jaygpIHt9DQordm9pZCBDRlhfVGhyZWFkTG9jazo6TG9jaygpIHt9DQordm9pZCBDRlhfVGhyZWFkTG9jazo6VW5sb2NrKCkge30NCiB0eXBlZGVmIHN0cnVjdCBfRlhfQkFTRUFSUkFZREFUQSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCi0gICAgaW50MzJfdAlpR3Jvd1NpemU7DQotICAgIGludDMyX3QJaUJsb2NrU2l6ZTsNCi0gICAgaW50MzJfdAlpVG90YWxDb3VudDsNCi0gICAgaW50MzJfdAlpQmxvY2tDb3VudDsNCi0gICAgdWludDhfdCoJcEJ1ZmZlcjsNCi19IEZYX0JBU0VBUlJBWURBVEEsICogRlhfTFBCQVNFQVJSQVlEQVRBOw0KLXR5cGVkZWYgRlhfQkFTRUFSUkFZREFUQSBjb25zdCAqIEZYX0xQQ0JBU0VBUlJBWURBVEE7DQotQ0ZYX0Jhc2VBcnJheTo6Q0ZYX0Jhc2VBcnJheShpbnQzMl90IGlHcm93U2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KGlHcm93U2l6ZSA+IDAgJiYgaUJsb2NrU2l6ZSA+IDApOw0KLSAgICBtX3BEYXRhID0gbmV3IEZYX0JBU0VBUlJBWURBVEE7DQotICAgIEZYX21lbXNldChtX3BEYXRhLCAwLCBzaXplb2YoRlhfQkFTRUFSUkFZREFUQSkpOw0KLSAgICAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUdyb3dTaXplID0gaUdyb3dTaXplOw0KLSAgICAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrU2l6ZSA9IGlCbG9ja1NpemU7DQorICBpbnQzMl90IGlHcm93U2l6ZTsNCisgIGludDMyX3QgaUJsb2NrU2l6ZTsNCisgIGludDMyX3QgaVRvdGFsQ291bnQ7DQorICBpbnQzMl90IGlCbG9ja0NvdW50Ow0KKyAgdWludDhfdCogcEJ1ZmZlcjsNCit9IEZYX0JBU0VBUlJBWURBVEEsICpGWF9MUEJBU0VBUlJBWURBVEE7DQordHlwZWRlZiBGWF9CQVNFQVJSQVlEQVRBIGNvbnN0KiBGWF9MUENCQVNFQVJSQVlEQVRBOw0KK0NGWF9CYXNlQXJyYXk6OkNGWF9CYXNlQXJyYXkoaW50MzJfdCBpR3Jvd1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KGlHcm93U2l6ZSA+IDAgJiYgaUJsb2NrU2l6ZSA+IDApOw0KKyAgbV9wRGF0YSA9IG5ldyBGWF9CQVNFQVJSQVlEQVRBOw0KKyAgRlhfbWVtc2V0KG1fcERhdGEsIDAsIHNpemVvZihGWF9CQVNFQVJSQVlEQVRBKSk7DQorICAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUdyb3dTaXplID0gaUdyb3dTaXplOw0KKyAgKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlCbG9ja1NpemUgPSBpQmxvY2tTaXplOw0KIH0NCi1DRlhfQmFzZUFycmF5Ojp+Q0ZYX0Jhc2VBcnJheSgpDQotew0KLSAgICBGWF9MUEJBU0VBUlJBWURBVEEgcERhdGEgPSAoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGE7DQotICAgIGlmIChwRGF0YS0+cEJ1ZmZlciAhPSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKHBEYXRhLT5wQnVmZmVyKTsNCi0gICAgfQ0KLSAgICBkZWxldGUgcERhdGE7DQorQ0ZYX0Jhc2VBcnJheTo6fkNGWF9CYXNlQXJyYXkoKSB7DQorICBGWF9MUEJBU0VBUlJBWURBVEEgcERhdGEgPSAoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGE7DQorICBpZiAocERhdGEtPnBCdWZmZXIgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKHBEYXRhLT5wQnVmZmVyKTsNCisgIH0NCisgIGRlbGV0ZSBwRGF0YTsNCiB9DQotaW50MzJfdCBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCkgY29uc3QNCi17DQotICAgIHJldHVybiAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrQ291bnQ7DQoraW50MzJfdCBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCkgY29uc3Qgew0KKyAgcmV0dXJuICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pQmxvY2tDb3VudDsNCiB9DQotaW50MzJfdCBDRlhfQmFzZUFycmF5OjpHZXRCbG9ja1NpemUoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pQmxvY2tTaXplOw0KK2ludDMyX3QgQ0ZYX0Jhc2VBcnJheTo6R2V0QmxvY2tTaXplKCkgY29uc3Qgew0KKyAgcmV0dXJuICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pQmxvY2tTaXplOw0KIH0NCi11aW50OF90KiBDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKGludDMyX3QgaW5kZXgpDQotew0KLSAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSk7DQotICAgIHVpbnQ4X3QqICZwQnVmZmVyID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPnBCdWZmZXI7DQotICAgIGludDMyX3QgJmlUb3RhbENvdW50ID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlUb3RhbENvdW50Ow0KLSAgICBpbnQzMl90IGlCbG9ja1NpemUgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrU2l6ZTsNCi0gICAgaWYgKGluZGV4ID49IGlUb3RhbENvdW50KSB7DQotICAgICAgICBpbnQzMl90IGlHcm93U2l6ZSA9ICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pR3Jvd1NpemU7DQotICAgICAgICBpVG90YWxDb3VudCA9IChpbmRleCAvIGlHcm93U2l6ZSArIDEpICogaUdyb3dTaXplOw0KLSAgICAgICAgaW50MzJfdCBpTmV3U2l6ZSA9IGlUb3RhbENvdW50ICogaUJsb2NrU2l6ZTsNCi0gICAgICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCi0gICAgICAgICAgICBwQnVmZmVyID0gKHVpbnQ4X3QqKUZYX0FsbG9jKHVpbnQ4X3QsIGlOZXdTaXplKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcEJ1ZmZlciA9ICh1aW50OF90KilGWF9SZWFsbG9jKHVpbnQ4X3QsIHBCdWZmZXIsIGlOZXdTaXplKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMKTsNCi0gICAgaW50MzJfdCAmaUJsb2NrQ291bnQgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrQ291bnQ7DQotICAgIGlmIChpbmRleCA+PSBpQmxvY2tDb3VudCkgew0KLSAgICAgICAgaUJsb2NrQ291bnQgPSBpbmRleCArIDE7DQotICAgIH0NCi0gICAgcmV0dXJuIHBCdWZmZXIgKyBpbmRleCAqIGlCbG9ja1NpemU7DQotfQ0KLXVpbnQ4X3QqIENGWF9CYXNlQXJyYXk6OkdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0DQotew0KLSAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8ICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pQmxvY2tDb3VudCk7DQotICAgIHJldHVybiAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+cEJ1ZmZlciArIGluZGV4ICogKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlCbG9ja1NpemU7DQotfQ0KLXVpbnQ4X3QqIENGWF9CYXNlQXJyYXk6OkdldEJ1ZmZlcigpIGNvbnN0DQotew0KLSAgICByZXR1cm4gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPnBCdWZmZXI7DQotfQ0KLWludDMyX3QgQ0ZYX0Jhc2VBcnJheTo6QXBwZW5kKGNvbnN0IENGWF9CYXNlQXJyYXkgJnNyYywgaW50MzJfdCBpU3RhcnQsIGludDMyX3QgaUNvdW50KQ0KLXsNCi0gICAgaW50MzJfdCBpQmxvY2tTaXplID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlCbG9ja1NpemU7DQotICAgIEZYU1lTX2Fzc2VydChpQmxvY2tTaXplID09ICgoRlhfTFBCQVNFQVJSQVlEQVRBKXNyYy5tX3BEYXRhKS0+aUJsb2NrU2l6ZSk7DQotICAgIGludDMyX3QgJmlCbG9ja0NvdW50ID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlCbG9ja0NvdW50Ow0KLSAgICBpbnQzMl90IGlBZGRlZCA9IHNyYy5HZXRTaXplKCk7DQotICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpQWRkZWQpOw0KLSAgICBpZiAoaUNvdW50IDwgMCkgew0KLSAgICAgICAgaUNvdW50ID0gaUFkZGVkOw0KLSAgICB9DQotICAgIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpQWRkZWQpIHsNCi0gICAgICAgIGlDb3VudCA9IGlBZGRlZCAtIGlTdGFydDsNCi0gICAgfQ0KLSAgICBpZiAoaUNvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgdWludDhfdCogcERzdCA9ICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5wQnVmZmVyICsgaUJsb2NrQ291bnQgKiBpQmxvY2tTaXplOw0KLSAgICBBZGRTcGFjZVRvKGlCbG9ja0NvdW50ICsgaUNvdW50IC0gMSk7DQotICAgIEZYX21lbWNweShwRHN0LCAoKEZYX0xQQkFTRUFSUkFZREFUQSlzcmMubV9wRGF0YSktPnBCdWZmZXIgKyBpU3RhcnQgKiBpQmxvY2tTaXplLCBpQ291bnQgKiBpQmxvY2tTaXplKTsNCi0gICAgcmV0dXJuIGlDb3VudDsNCi19DQotaW50MzJfdCBDRlhfQmFzZUFycmF5OjpDb3B5KGNvbnN0IENGWF9CYXNlQXJyYXkgJnNyYywgaW50MzJfdCBpU3RhcnQsIGludDMyX3QgaUNvdW50KQ0KLXsNCi0gICAgaW50MzJfdCBpQmxvY2tTaXplID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlCbG9ja1NpemU7DQotICAgIEZYU1lTX2Fzc2VydChpQmxvY2tTaXplID09ICgoRlhfTFBCQVNFQVJSQVlEQVRBKXNyYy5tX3BEYXRhKS0+aUJsb2NrU2l6ZSk7DQotICAgIGludDMyX3QgaUNvcGllZCA9IHNyYy5HZXRTaXplKCk7DQotICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpQ29waWVkKTsNCi0gICAgaWYgKGlDb3VudCA8IDApIHsNCi0gICAgICAgIGlDb3VudCA9IGlDb3BpZWQ7DQotICAgIH0NCi0gICAgaWYgKGlTdGFydCArIGlDb3VudCA+IGlDb3BpZWQpIHsNCi0gICAgICAgIGlDb3VudCA9IGlDb3BpZWQgLSBpU3RhcnQ7DQotICAgIH0NCi0gICAgaWYgKGlDb3VudCA8IDEpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIFJlbW92ZUFsbChUUlVFKTsNCi0gICAgQWRkU3BhY2VUbyhpQ291bnQgLSAxKTsNCi0gICAgRlhfbWVtY3B5KCgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5wQnVmZmVyLCAoKEZYX0xQQkFTRUFSUkFZREFUQSlzcmMubV9wRGF0YSktPnBCdWZmZXIgKyBpU3RhcnQgKiBpQmxvY2tTaXplLCBpQ291bnQgKiBpQmxvY2tTaXplKTsNCi0gICAgcmV0dXJuIGlDb3VudDsNCi19DQotaW50MzJfdCBDRlhfQmFzZUFycmF5OjpSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50KQ0KLXsNCi0gICAgaW50MzJfdCAmaUJsb2NrQ291bnQgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrQ291bnQ7DQotICAgIGlmIChpQ291bnQgPCAwIHx8IGlDb3VudCA+IGlCbG9ja0NvdW50KSB7DQotICAgICAgICBpQ291bnQgPSBpQmxvY2tDb3VudDsNCi0gICAgICAgIGlCbG9ja0NvdW50ID0gMDsNCit1aW50OF90KiBDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKGludDMyX3QgaW5kZXgpIHsNCisgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xKTsNCisgIHVpbnQ4X3QqJiBwQnVmZmVyID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPnBCdWZmZXI7DQorICBpbnQzMl90JiBpVG90YWxDb3VudCA9ICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pVG90YWxDb3VudDsNCisgIGludDMyX3QgaUJsb2NrU2l6ZSA9ICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pQmxvY2tTaXplOw0KKyAgaWYgKGluZGV4ID49IGlUb3RhbENvdW50KSB7DQorICAgIGludDMyX3QgaUdyb3dTaXplID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlHcm93U2l6ZTsNCisgICAgaVRvdGFsQ291bnQgPSAoaW5kZXggLyBpR3Jvd1NpemUgKyAxKSAqIGlHcm93U2l6ZTsNCisgICAgaW50MzJfdCBpTmV3U2l6ZSA9IGlUb3RhbENvdW50ICogaUJsb2NrU2l6ZTsNCisgICAgaWYgKHBCdWZmZXIgPT0gTlVMTCkgew0KKyAgICAgIHBCdWZmZXIgPSAodWludDhfdCopRlhfQWxsb2ModWludDhfdCwgaU5ld1NpemUpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgaUJsb2NrQ291bnQgLT0gaUNvdW50Ow0KKyAgICAgIHBCdWZmZXIgPSAodWludDhfdCopRlhfUmVhbGxvYyh1aW50OF90LCBwQnVmZmVyLCBpTmV3U2l6ZSk7DQogICAgIH0NCi0gICAgcmV0dXJuIGlDb3VudDsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwpOw0KKyAgaW50MzJfdCYgaUJsb2NrQ291bnQgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrQ291bnQ7DQorICBpZiAoaW5kZXggPj0gaUJsb2NrQ291bnQpIHsNCisgICAgaUJsb2NrQ291bnQgPSBpbmRleCArIDE7DQorICB9DQorICByZXR1cm4gcEJ1ZmZlciArIGluZGV4ICogaUJsb2NrU2l6ZTsNCiB9DQotdm9pZCBDRlhfQmFzZUFycmF5OjpSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkpDQotew0KLSAgICBpZiAoIWJMZWF2ZU1lbW9yeSkgew0KLSAgICAgICAgdWludDhfdCogJnBCdWZmZXIgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+cEJ1ZmZlcjsNCi0gICAgICAgIGlmIChwQnVmZmVyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBGWF9GcmVlKHBCdWZmZXIpOw0KLSAgICAgICAgICAgIHBCdWZmZXIgPSBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlUb3RhbENvdW50ID0gMDsNCit1aW50OF90KiBDRlhfQmFzZUFycmF5OjpHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJg0KKyAgICAgICAgICAgICAgIGluZGV4IDwgKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlCbG9ja0NvdW50KTsNCisgIHJldHVybiAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+cEJ1ZmZlciArDQorICAgICAgICAgaW5kZXggKiAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrU2l6ZTsNCit9DQordWludDhfdCogQ0ZYX0Jhc2VBcnJheTo6R2V0QnVmZmVyKCkgY29uc3Qgew0KKyAgcmV0dXJuICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5wQnVmZmVyOw0KK30NCitpbnQzMl90IENGWF9CYXNlQXJyYXk6OkFwcGVuZChjb25zdCBDRlhfQmFzZUFycmF5JiBzcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsNCisgIGludDMyX3QgaUJsb2NrU2l6ZSA9ICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pQmxvY2tTaXplOw0KKyAgRlhTWVNfYXNzZXJ0KGlCbG9ja1NpemUgPT0gKChGWF9MUEJBU0VBUlJBWURBVEEpc3JjLm1fcERhdGEpLT5pQmxvY2tTaXplKTsNCisgIGludDMyX3QmIGlCbG9ja0NvdW50ID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPmlCbG9ja0NvdW50Ow0KKyAgaW50MzJfdCBpQWRkZWQgPSBzcmMuR2V0U2l6ZSgpOw0KKyAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IGlBZGRlZCk7DQorICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICBpQ291bnQgPSBpQWRkZWQ7DQorICB9DQorICBpZiAoaVN0YXJ0ICsgaUNvdW50ID4gaUFkZGVkKSB7DQorICAgIGlDb3VudCA9IGlBZGRlZCAtIGlTdGFydDsNCisgIH0NCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdWludDhfdCogcERzdCA9DQorICAgICAgKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPnBCdWZmZXIgKyBpQmxvY2tDb3VudCAqIGlCbG9ja1NpemU7DQorICBBZGRTcGFjZVRvKGlCbG9ja0NvdW50ICsgaUNvdW50IC0gMSk7DQorICBGWF9tZW1jcHkocERzdCwNCisgICAgICAgICAgICAoKEZYX0xQQkFTRUFSUkFZREFUQSlzcmMubV9wRGF0YSktPnBCdWZmZXIgKyBpU3RhcnQgKiBpQmxvY2tTaXplLA0KKyAgICAgICAgICAgIGlDb3VudCAqIGlCbG9ja1NpemUpOw0KKyAgcmV0dXJuIGlDb3VudDsNCit9DQoraW50MzJfdCBDRlhfQmFzZUFycmF5OjpDb3B5KGNvbnN0IENGWF9CYXNlQXJyYXkmIHNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50KSB7DQorICBpbnQzMl90IGlCbG9ja1NpemUgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrU2l6ZTsNCisgIEZYU1lTX2Fzc2VydChpQmxvY2tTaXplID09ICgoRlhfTFBCQVNFQVJSQVlEQVRBKXNyYy5tX3BEYXRhKS0+aUJsb2NrU2l6ZSk7DQorICBpbnQzMl90IGlDb3BpZWQgPSBzcmMuR2V0U2l6ZSgpOw0KKyAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IGlDb3BpZWQpOw0KKyAgaWYgKGlDb3VudCA8IDApIHsNCisgICAgaUNvdW50ID0gaUNvcGllZDsNCisgIH0NCisgIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpQ29waWVkKSB7DQorICAgIGlDb3VudCA9IGlDb3BpZWQgLSBpU3RhcnQ7DQorICB9DQorICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIFJlbW92ZUFsbChUUlVFKTsNCisgIEFkZFNwYWNlVG8oaUNvdW50IC0gMSk7DQorICBGWF9tZW1jcHkoKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPnBCdWZmZXIsDQorICAgICAgICAgICAgKChGWF9MUEJBU0VBUlJBWURBVEEpc3JjLm1fcERhdGEpLT5wQnVmZmVyICsgaVN0YXJ0ICogaUJsb2NrU2l6ZSwNCisgICAgICAgICAgICBpQ291bnQgKiBpQmxvY2tTaXplKTsNCisgIHJldHVybiBpQ291bnQ7DQorfQ0KK2ludDMyX3QgQ0ZYX0Jhc2VBcnJheTo6UmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCkgew0KKyAgaW50MzJfdCYgaUJsb2NrQ291bnQgPSAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrQ291bnQ7DQorICBpZiAoaUNvdW50IDwgMCB8fCBpQ291bnQgPiBpQmxvY2tDb3VudCkgew0KKyAgICBpQ291bnQgPSBpQmxvY2tDb3VudDsNCisgICAgaUJsb2NrQ291bnQgPSAwOw0KKyAgfSBlbHNlIHsNCisgICAgaUJsb2NrQ291bnQgLT0gaUNvdW50Ow0KKyAgfQ0KKyAgcmV0dXJuIGlDb3VudDsNCit9DQordm9pZCBDRlhfQmFzZUFycmF5OjpSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkpIHsNCisgIGlmICghYkxlYXZlTWVtb3J5KSB7DQorICAgIHVpbnQ4X3QqJiBwQnVmZmVyID0gKChGWF9MUEJBU0VBUlJBWURBVEEpbV9wRGF0YSktPnBCdWZmZXI7DQorICAgIGlmIChwQnVmZmVyICE9IE5VTEwpIHsNCisgICAgICBGWF9GcmVlKHBCdWZmZXIpOw0KKyAgICAgIHBCdWZmZXIgPSBOVUxMOw0KICAgICB9DQotICAgICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pQmxvY2tDb3VudCA9IDA7DQorICAgICgoRlhfTFBCQVNFQVJSQVlEQVRBKW1fcERhdGEpLT5pVG90YWxDb3VudCA9IDA7DQorICB9DQorICAoKEZYX0xQQkFTRUFSUkFZREFUQSltX3BEYXRhKS0+aUJsb2NrQ291bnQgPSAwOw0KIH0NCi1DRlhfQmFzZU1hc3NBcnJheUltcDo6Q0ZYX0Jhc2VNYXNzQXJyYXlJbXAoaW50MzJfdCBpQ2h1bmtTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpDQotICAgIDogbV9pQ2h1bmtTaXplKGlDaHVua1NpemUpDQotICAgICwgbV9pQmxvY2tTaXplKGlCbG9ja1NpemUpDQotICAgICwgbV9pQ2h1bmtDb3VudCgwKQ0KLSAgICAsIG1faUJsb2NrQ291bnQoMCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX2lDaHVua1NpemUgPiAwICYmIG1faUJsb2NrU2l6ZSA+IDApOw0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCi0gICAgbV9wRGF0YS0+U2V0U2l6ZSgxNik7DQorQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6OkNGWF9CYXNlTWFzc0FycmF5SW1wKGludDMyX3QgaUNodW5rU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmxvY2tTaXplKQ0KKyAgICA6IG1faUNodW5rU2l6ZShpQ2h1bmtTaXplKSwNCisgICAgICBtX2lCbG9ja1NpemUoaUJsb2NrU2l6ZSksDQorICAgICAgbV9pQ2h1bmtDb3VudCgwKSwNCisgICAgICBtX2lCbG9ja0NvdW50KDApIHsNCisgIEZYU1lTX2Fzc2VydChtX2lDaHVua1NpemUgPiAwICYmIG1faUJsb2NrU2l6ZSA+IDApOw0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQorICBtX3BEYXRhLT5TZXRTaXplKDE2KTsNCiB9DQotQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6On5DRlhfQmFzZU1hc3NBcnJheUltcCgpDQotew0KLSAgICBSZW1vdmVBbGwoKTsNCi0gICAgZGVsZXRlIG1fcERhdGE7DQorQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6On5DRlhfQmFzZU1hc3NBcnJheUltcCgpIHsNCisgIFJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIG1fcERhdGE7DQogfQ0KLXVpbnQ4X3QqIENGWF9CYXNlTWFzc0FycmF5SW1wOjpBZGRTcGFjZVRvKGludDMyX3QgaW5kZXgpDQotew0KLSAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSk7DQotICAgIHVpbnQ4X3QqIHBDaHVuazsNCi0gICAgaWYgKGluZGV4IDwgbV9pQmxvY2tDb3VudCkgew0KK3VpbnQ4X3QqIENGWF9CYXNlTWFzc0FycmF5SW1wOjpBZGRTcGFjZVRvKGludDMyX3QgaW5kZXgpIHsNCisgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xKTsNCisgIHVpbnQ4X3QqIHBDaHVuazsNCisgIGlmIChpbmRleCA8IG1faUJsb2NrQ291bnQpIHsNCisgICAgcENodW5rID0gKHVpbnQ4X3QqKW1fcERhdGEtPkdldEF0KGluZGV4IC8gbV9pQ2h1bmtTaXplKTsNCisgIH0gZWxzZSB7DQorICAgIGludDMyX3QgaU1lbVNpemUgPSBtX2lDaHVua1NpemUgKiBtX2lCbG9ja1NpemU7DQorICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgaWYgKGluZGV4IDwgbV9pQ2h1bmtDb3VudCAqIG1faUNodW5rU2l6ZSkgew0KICAgICAgICAgcENodW5rID0gKHVpbnQ4X3QqKW1fcERhdGEtPkdldEF0KGluZGV4IC8gbV9pQ2h1bmtTaXplKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGludDMyX3QgaU1lbVNpemUgPSBtX2lDaHVua1NpemUgKiBtX2lCbG9ja1NpemU7DQotICAgICAgICB3aGlsZSAoVFJVRSkgew0KLSAgICAgICAgICAgIGlmIChpbmRleCA8IG1faUNodW5rQ291bnQgKiBtX2lDaHVua1NpemUpIHsNCi0gICAgICAgICAgICAgICAgcENodW5rID0gKHVpbnQ4X3QqKW1fcERhdGEtPkdldEF0KGluZGV4IC8gbV9pQ2h1bmtTaXplKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcENodW5rID0gKHVpbnQ4X3QqKUZYX0FsbG9jKHVpbnQ4X3QsIGlNZW1TaXplKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1faUNodW5rQ291bnQgPCBtX3BEYXRhLT5HZXRTaXplKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcERhdGEtPlNldEF0KG1faUNodW5rQ291bnQsIHBDaHVuayk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BEYXRhLT5BZGQocENodW5rKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX2lDaHVua0NvdW50ICsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQocENodW5rICE9IE5VTEwpOw0KLSAgICBtX2lCbG9ja0NvdW50ID0gaW5kZXggKyAxOw0KLSAgICByZXR1cm4gcENodW5rICsgKGluZGV4ICUgbV9pQ2h1bmtTaXplKSAqIG1faUJsb2NrU2l6ZTsNCi19DQotdWludDhfdCogQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6OkdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0DQotew0KLSAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1faUJsb2NrQ291bnQpOw0KLSAgICB1aW50OF90KiBwQ2h1bmsgPSAodWludDhfdCopbV9wRGF0YS0+R2V0QXQoaW5kZXggLyBtX2lDaHVua1NpemUpOw0KLSAgICBGWFNZU19hc3NlcnQocENodW5rICE9IE5VTEwpOw0KLSAgICByZXR1cm4gcENodW5rICsgKGluZGV4ICUgbV9pQ2h1bmtTaXplKSAqIG1faUJsb2NrU2l6ZTsNCi19DQotaW50MzJfdCBDRlhfQmFzZU1hc3NBcnJheUltcDo6QXBwZW5kKGNvbnN0IENGWF9CYXNlTWFzc0FycmF5SW1wICZzcmMsIGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlDb3VudCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX2lCbG9ja1NpemUgPT0gc3JjLm1faUJsb2NrU2l6ZSk7DQotICAgIGludDMyX3QgaUFkZGVkID0gc3JjLm1faUJsb2NrQ291bnQ7DQotICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpQWRkZWQpOw0KLSAgICBpZiAoaUNvdW50IDwgMCkgew0KLSAgICAgICAgaUNvdW50ID0gaUFkZGVkOw0KLSAgICB9DQotICAgIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpQWRkZWQpIHsNCi0gICAgICAgIGlDb3VudCA9IGlBZGRlZCAtIGlTdGFydDsNCi0gICAgfQ0KLSAgICBpZiAoaUNvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIG1faUJsb2NrQ291bnQ7DQotICAgIH0NCi0gICAgaW50MzJfdCBpQmxvY2tDb3VudCA9IG1faUJsb2NrQ291bnQ7DQotICAgIGludDMyX3QgaVRvdGFsID0gbV9pQmxvY2tDb3VudCArIGlDb3VudDsNCi0gICAgQWRkU3BhY2VUbyhpVG90YWwgLSAxKTsNCi0gICAgQXBwZW5kKGlCbG9ja0NvdW50LCBzcmMsIGlTdGFydCwgaUNvdW50KTsNCi0gICAgcmV0dXJuIG1faUJsb2NrQ291bnQ7DQotfQ0KLWludDMyX3QgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6OkNvcHkoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAgJnNyYywgaW50MzJfdCBpU3RhcnQsIGludDMyX3QgaUNvdW50KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1faUJsb2NrU2l6ZSA9PSBzcmMubV9pQmxvY2tTaXplKTsNCi0gICAgaW50MzJfdCBpQ29waWVkID0gc3JjLm1faUJsb2NrQ291bnQ7DQotICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSk7DQotICAgIGlmIChpU3RhcnQgPj0gaUNvcGllZCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgUmVtb3ZlQWxsKFRSVUUpOw0KLSAgICBpZiAoaUNvdW50IDwgMCkgew0KLSAgICAgICAgaUNvdW50ID0gaUNvcGllZDsNCi0gICAgfQ0KLSAgICBpZiAoaVN0YXJ0ICsgaUNvdW50ID4gaUNvcGllZCkgew0KLSAgICAgICAgaUNvdW50ID0gaUNvcGllZCAtIGlTdGFydDsNCi0gICAgfQ0KLSAgICBpZiAoaUNvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaWYgKG1faUJsb2NrQ291bnQgPCBpQ291bnQpIHsNCi0gICAgICAgIEFkZFNwYWNlVG8oaUNvdW50IC0gMSk7DQotICAgIH0NCi0gICAgQXBwZW5kKDAsIHNyYywgaVN0YXJ0LCBpQ291bnQpOw0KLSAgICByZXR1cm4gbV9pQmxvY2tDb3VudDsNCi19DQotdm9pZCBDRlhfQmFzZU1hc3NBcnJheUltcDo6QXBwZW5kKGludDMyX3QgaURzdFN0YXJ0LCBjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCAmc3JjLCBpbnQzMl90IGlTcmNTdGFydCwgaW50MzJfdCBpU3JjQ291bnQpDQotew0KLSAgICBGWFNZU19hc3NlcnQoaURzdFN0YXJ0ID4gLTEgJiYgbV9pQmxvY2tTaXplID09IHNyYy5tX2lCbG9ja1NpemUpOw0KLSAgICBpbnQzMl90IGlTcmNUb3RhbCA9IHNyYy5tX2lCbG9ja0NvdW50Ow0KLSAgICBGWFNZU19hc3NlcnQoaVNyY1RvdGFsID4gMCAmJiBtX2lCbG9ja0NvdW50ID49IGlEc3RTdGFydCArIGlTcmNDb3VudCk7DQotICAgIEZYU1lTX2Fzc2VydChpU3JjU3RhcnQgPiAtMSAmJiBpU3JjU3RhcnQgPCBpU3JjVG90YWwgJiYgaVNyY0NvdW50ID4gMCAmJiBpU3JjU3RhcnQgKyBpU3JjQ291bnQgPD0gaVNyY1RvdGFsKTsNCi0gICAgaW50MzJfdCBpRHN0Q2h1bmtJbmRleCA9IGlEc3RTdGFydCAvIG1faUNodW5rU2l6ZTsNCi0gICAgaW50MzJfdCBpU3JjQ2h1bmtJbmRleCA9IGlTcmNTdGFydCAvIHNyYy5tX2lDaHVua1NpemU7DQotICAgIHVpbnQ4X3QqIHBEc3RDaHVuayA9ICh1aW50OF90KilHZXRBdChpRHN0U3RhcnQpOw0KLSAgICB1aW50OF90KiBwU3JjQ2h1bmsgPSAodWludDhfdCopc3JjLkdldEF0KGlTcmNTdGFydCk7DQotICAgIGludDMyX3QgaURzdENodW5rU2l6ZSA9IG1faUNodW5rU2l6ZSAtIChpRHN0U3RhcnQgJSBtX2lDaHVua1NpemUpOw0KLSAgICBpbnQzMl90IGlTcmNDaHVua1NpemUgPSBzcmMubV9pQ2h1bmtTaXplIC0gKGlTcmNTdGFydCAlIHNyYy5tX2lDaHVua1NpemUpOw0KLSAgICBpbnQzMl90IGlDb3B5U2l6ZSA9IEZYX01JTihpU3JjQ291bnQsIEZYX01JTihpU3JjQ2h1bmtTaXplLCBpRHN0Q2h1bmtTaXplKSk7DQotICAgIGludDMyX3QgaUNvcHlCeXRlcyA9IGlDb3B5U2l6ZSAqIG1faUJsb2NrU2l6ZTsNCi0gICAgd2hpbGUgKGlTcmNDb3VudCA+IDApIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwRHN0Q2h1bmsgIT0gTlVMTCAmJiBwU3JjQ2h1bmsgIT0gTlVMTCk7DQotICAgICAgICBGWFNZU19tZW1jcHkocERzdENodW5rLCBwU3JjQ2h1bmssIGlDb3B5Qnl0ZXMpOw0KLSAgICAgICAgaVNyY0NvdW50IC09IGlDb3B5U2l6ZTsNCi0gICAgICAgIGlTcmNDaHVua1NpemUgLT0gaUNvcHlTaXplOw0KLSAgICAgICAgaWYgKGlTcmNDaHVua1NpemUgPCAxKSB7DQotICAgICAgICAgICAgaVNyY0NodW5rU2l6ZSA9IHNyYy5tX2lDaHVua1NpemU7DQotICAgICAgICAgICAgaVNyY0NodW5rSW5kZXggKys7DQotICAgICAgICAgICAgcFNyY0NodW5rID0gKHVpbnQ4X3QqKXNyYy5tX3BEYXRhLT5HZXRBdChpU3JjQ2h1bmtJbmRleCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcENodW5rID0gKHVpbnQ4X3QqKUZYX0FsbG9jKHVpbnQ4X3QsIGlNZW1TaXplKTsNCisgICAgICAgIGlmIChtX2lDaHVua0NvdW50IDwgbV9wRGF0YS0+R2V0U2l6ZSgpKSB7DQorICAgICAgICAgIG1fcERhdGEtPlNldEF0KG1faUNodW5rQ291bnQsIHBDaHVuayk7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBTcmNDaHVuayArPSBpQ29weUJ5dGVzOw0KKyAgICAgICAgICBtX3BEYXRhLT5BZGQocENodW5rKTsNCiAgICAgICAgIH0NCi0gICAgICAgIGlEc3RDaHVua1NpemUgLT0gaUNvcHlTaXplOw0KLSAgICAgICAgaWYgKGlEc3RDaHVua1NpemUgPCAxKSB7DQotICAgICAgICAgICAgaURzdENodW5rU2l6ZSA9IG1faUNodW5rU2l6ZTsNCi0gICAgICAgICAgICBpRHN0Q2h1bmtJbmRleCArKzsNCi0gICAgICAgICAgICBwRHN0Q2h1bmsgPSAodWludDhfdCopbV9wRGF0YS0+R2V0QXQoaURzdENodW5rSW5kZXgpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwRHN0Q2h1bmsgKz0gaUNvcHlCeXRlczsNCi0gICAgICAgIH0NCi0gICAgICAgIGlDb3B5U2l6ZSA9IEZYX01JTihpU3JjQ291bnQsIEZYX01JTihpU3JjQ2h1bmtTaXplLCBpRHN0Q2h1bmtTaXplKSk7DQotICAgICAgICBpQ29weUJ5dGVzID0gaUNvcHlTaXplICogbV9pQmxvY2tTaXplOw0KKyAgICAgICAgbV9pQ2h1bmtDb3VudCsrOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KHBDaHVuayAhPSBOVUxMKTsNCisgIG1faUJsb2NrQ291bnQgPSBpbmRleCArIDE7DQorICByZXR1cm4gcENodW5rICsgKGluZGV4ICUgbV9pQ2h1bmtTaXplKSAqIG1faUJsb2NrU2l6ZTsNCiB9DQotaW50MzJfdCBDRlhfQmFzZU1hc3NBcnJheUltcDo6UmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCkNCi17DQotICAgIGlmIChpQ291bnQgPCAwIHx8IGlDb3VudCA+PSBtX2lCbG9ja0NvdW50KSB7DQotICAgICAgICBtX2lCbG9ja0NvdW50ID0gMDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1faUJsb2NrQ291bnQgLT0gaUNvdW50Ow0KLSAgICB9DQordWludDhfdCogQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6OkdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9pQmxvY2tDb3VudCk7DQorICB1aW50OF90KiBwQ2h1bmsgPSAodWludDhfdCopbV9wRGF0YS0+R2V0QXQoaW5kZXggLyBtX2lDaHVua1NpemUpOw0KKyAgRlhTWVNfYXNzZXJ0KHBDaHVuayAhPSBOVUxMKTsNCisgIHJldHVybiBwQ2h1bmsgKyAoaW5kZXggJSBtX2lDaHVua1NpemUpICogbV9pQmxvY2tTaXplOw0KK30NCitpbnQzMl90IENGWF9CYXNlTWFzc0FycmF5SW1wOjpBcHBlbmQoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAmIHNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50KSB7DQorICBGWFNZU19hc3NlcnQobV9pQmxvY2tTaXplID09IHNyYy5tX2lCbG9ja1NpemUpOw0KKyAgaW50MzJfdCBpQWRkZWQgPSBzcmMubV9pQmxvY2tDb3VudDsNCisgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpQWRkZWQpOw0KKyAgaWYgKGlDb3VudCA8IDApIHsNCisgICAgaUNvdW50ID0gaUFkZGVkOw0KKyAgfQ0KKyAgaWYgKGlTdGFydCArIGlDb3VudCA+IGlBZGRlZCkgew0KKyAgICBpQ291bnQgPSBpQWRkZWQgLSBpU3RhcnQ7DQorICB9DQorICBpZiAoaUNvdW50IDwgMSkgew0KICAgICByZXR1cm4gbV9pQmxvY2tDb3VudDsNCisgIH0NCisgIGludDMyX3QgaUJsb2NrQ291bnQgPSBtX2lCbG9ja0NvdW50Ow0KKyAgaW50MzJfdCBpVG90YWwgPSBtX2lCbG9ja0NvdW50ICsgaUNvdW50Ow0KKyAgQWRkU3BhY2VUbyhpVG90YWwgLSAxKTsNCisgIEFwcGVuZChpQmxvY2tDb3VudCwgc3JjLCBpU3RhcnQsIGlDb3VudCk7DQorICByZXR1cm4gbV9pQmxvY2tDb3VudDsNCiB9DQotdm9pZCBDRlhfQmFzZU1hc3NBcnJheUltcDo6UmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5KQ0KLXsNCi0gICAgaWYgKGJMZWF2ZU1lbW9yeSkgew0KLSAgICAgICAgbV9pQmxvY2tDb3VudCA9IDA7DQotICAgICAgICByZXR1cm47DQoraW50MzJfdCBDRlhfQmFzZU1hc3NBcnJheUltcDo6Q29weShjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCYgc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faUJsb2NrU2l6ZSA9PSBzcmMubV9pQmxvY2tTaXplKTsNCisgIGludDMyX3QgaUNvcGllZCA9IHNyYy5tX2lCbG9ja0NvdW50Ow0KKyAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xKTsNCisgIGlmIChpU3RhcnQgPj0gaUNvcGllZCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIFJlbW92ZUFsbChUUlVFKTsNCisgIGlmIChpQ291bnQgPCAwKSB7DQorICAgIGlDb3VudCA9IGlDb3BpZWQ7DQorICB9DQorICBpZiAoaVN0YXJ0ICsgaUNvdW50ID4gaUNvcGllZCkgew0KKyAgICBpQ291bnQgPSBpQ29waWVkIC0gaVN0YXJ0Ow0KKyAgfQ0KKyAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAobV9pQmxvY2tDb3VudCA8IGlDb3VudCkgew0KKyAgICBBZGRTcGFjZVRvKGlDb3VudCAtIDEpOw0KKyAgfQ0KKyAgQXBwZW5kKDAsIHNyYywgaVN0YXJ0LCBpQ291bnQpOw0KKyAgcmV0dXJuIG1faUJsb2NrQ291bnQ7DQorfQ0KK3ZvaWQgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6OkFwcGVuZChpbnQzMl90IGlEc3RTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAmIHNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3JjU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVNyY0NvdW50KSB7DQorICBGWFNZU19hc3NlcnQoaURzdFN0YXJ0ID4gLTEgJiYgbV9pQmxvY2tTaXplID09IHNyYy5tX2lCbG9ja1NpemUpOw0KKyAgaW50MzJfdCBpU3JjVG90YWwgPSBzcmMubV9pQmxvY2tDb3VudDsNCisgIEZYU1lTX2Fzc2VydChpU3JjVG90YWwgPiAwICYmIG1faUJsb2NrQ291bnQgPj0gaURzdFN0YXJ0ICsgaVNyY0NvdW50KTsNCisgIEZYU1lTX2Fzc2VydChpU3JjU3RhcnQgPiAtMSAmJiBpU3JjU3RhcnQgPCBpU3JjVG90YWwgJiYgaVNyY0NvdW50ID4gMCAmJg0KKyAgICAgICAgICAgICAgIGlTcmNTdGFydCArIGlTcmNDb3VudCA8PSBpU3JjVG90YWwpOw0KKyAgaW50MzJfdCBpRHN0Q2h1bmtJbmRleCA9IGlEc3RTdGFydCAvIG1faUNodW5rU2l6ZTsNCisgIGludDMyX3QgaVNyY0NodW5rSW5kZXggPSBpU3JjU3RhcnQgLyBzcmMubV9pQ2h1bmtTaXplOw0KKyAgdWludDhfdCogcERzdENodW5rID0gKHVpbnQ4X3QqKUdldEF0KGlEc3RTdGFydCk7DQorICB1aW50OF90KiBwU3JjQ2h1bmsgPSAodWludDhfdCopc3JjLkdldEF0KGlTcmNTdGFydCk7DQorICBpbnQzMl90IGlEc3RDaHVua1NpemUgPSBtX2lDaHVua1NpemUgLSAoaURzdFN0YXJ0ICUgbV9pQ2h1bmtTaXplKTsNCisgIGludDMyX3QgaVNyY0NodW5rU2l6ZSA9IHNyYy5tX2lDaHVua1NpemUgLSAoaVNyY1N0YXJ0ICUgc3JjLm1faUNodW5rU2l6ZSk7DQorICBpbnQzMl90IGlDb3B5U2l6ZSA9IEZYX01JTihpU3JjQ291bnQsIEZYX01JTihpU3JjQ2h1bmtTaXplLCBpRHN0Q2h1bmtTaXplKSk7DQorICBpbnQzMl90IGlDb3B5Qnl0ZXMgPSBpQ29weVNpemUgKiBtX2lCbG9ja1NpemU7DQorICB3aGlsZSAoaVNyY0NvdW50ID4gMCkgew0KKyAgICBGWFNZU19hc3NlcnQocERzdENodW5rICE9IE5VTEwgJiYgcFNyY0NodW5rICE9IE5VTEwpOw0KKyAgICBGWFNZU19tZW1jcHkocERzdENodW5rLCBwU3JjQ2h1bmssIGlDb3B5Qnl0ZXMpOw0KKyAgICBpU3JjQ291bnQgLT0gaUNvcHlTaXplOw0KKyAgICBpU3JjQ2h1bmtTaXplIC09IGlDb3B5U2l6ZTsNCisgICAgaWYgKGlTcmNDaHVua1NpemUgPCAxKSB7DQorICAgICAgaVNyY0NodW5rU2l6ZSA9IHNyYy5tX2lDaHVua1NpemU7DQorICAgICAgaVNyY0NodW5rSW5kZXgrKzsNCisgICAgICBwU3JjQ2h1bmsgPSAodWludDhfdCopc3JjLm1fcERhdGEtPkdldEF0KGlTcmNDaHVua0luZGV4KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwU3JjQ2h1bmsgKz0gaUNvcHlCeXRlczsNCiAgICAgfQ0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2lDaHVua0NvdW50OyBpICsrKSB7DQotICAgICAgICB2b2lkKiBwID0gbV9wRGF0YS0+R2V0QXQoaSk7DQotICAgICAgICBpZiAocCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBGWF9GcmVlKHApOw0KKyAgICBpRHN0Q2h1bmtTaXplIC09IGlDb3B5U2l6ZTsNCisgICAgaWYgKGlEc3RDaHVua1NpemUgPCAxKSB7DQorICAgICAgaURzdENodW5rU2l6ZSA9IG1faUNodW5rU2l6ZTsNCisgICAgICBpRHN0Q2h1bmtJbmRleCsrOw0KKyAgICAgIHBEc3RDaHVuayA9ICh1aW50OF90KiltX3BEYXRhLT5HZXRBdChpRHN0Q2h1bmtJbmRleCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcERzdENodW5rICs9IGlDb3B5Qnl0ZXM7DQogICAgIH0NCi0gICAgbV9wRGF0YS0+UmVtb3ZlQWxsKCk7DQotICAgIG1faUNodW5rQ291bnQgPSAwOw0KKyAgICBpQ29weVNpemUgPSBGWF9NSU4oaVNyY0NvdW50LCBGWF9NSU4oaVNyY0NodW5rU2l6ZSwgaURzdENodW5rU2l6ZSkpOw0KKyAgICBpQ29weUJ5dGVzID0gaUNvcHlTaXplICogbV9pQmxvY2tTaXplOw0KKyAgfQ0KK30NCitpbnQzMl90IENGWF9CYXNlTWFzc0FycmF5SW1wOjpSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50KSB7DQorICBpZiAoaUNvdW50IDwgMCB8fCBpQ291bnQgPj0gbV9pQmxvY2tDb3VudCkgew0KICAgICBtX2lCbG9ja0NvdW50ID0gMDsNCisgIH0gZWxzZSB7DQorICAgIG1faUJsb2NrQ291bnQgLT0gaUNvdW50Ow0KKyAgfQ0KKyAgcmV0dXJuIG1faUJsb2NrQ291bnQ7DQogfQ0KLUNGWF9CYXNlTWFzc0FycmF5OjpDRlhfQmFzZU1hc3NBcnJheShpbnQzMl90IGlDaHVua1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSkNCi17DQotICAgIG1fcERhdGEgPSBuZXcgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAoaUNodW5rU2l6ZSwgaUJsb2NrU2l6ZSk7DQordm9pZCBDRlhfQmFzZU1hc3NBcnJheUltcDo6UmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5KSB7DQorICBpZiAoYkxlYXZlTWVtb3J5KSB7DQorICAgIG1faUJsb2NrQ291bnQgPSAwOw0KKyAgICByZXR1cm47DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2lDaHVua0NvdW50OyBpKyspIHsNCisgICAgdm9pZCogcCA9IG1fcERhdGEtPkdldEF0KGkpOw0KKyAgICBpZiAocCA9PSBOVUxMKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgRlhfRnJlZShwKTsNCisgIH0NCisgIG1fcERhdGEtPlJlbW92ZUFsbCgpOw0KKyAgbV9pQ2h1bmtDb3VudCA9IDA7DQorICBtX2lCbG9ja0NvdW50ID0gMDsNCiB9DQotQ0ZYX0Jhc2VNYXNzQXJyYXk6On5DRlhfQmFzZU1hc3NBcnJheSgpDQotew0KLSAgICBkZWxldGUgbV9wRGF0YTsNCitDRlhfQmFzZU1hc3NBcnJheTo6Q0ZYX0Jhc2VNYXNzQXJyYXkoaW50MzJfdCBpQ2h1bmtTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpIHsNCisgIG1fcERhdGEgPSBuZXcgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAoaUNodW5rU2l6ZSwgaUJsb2NrU2l6ZSk7DQogfQ0KLWludDMyX3QgQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fcERhdGEtPm1faUJsb2NrQ291bnQ7DQorQ0ZYX0Jhc2VNYXNzQXJyYXk6On5DRlhfQmFzZU1hc3NBcnJheSgpIHsNCisgIGRlbGV0ZSBtX3BEYXRhOw0KIH0NCi11aW50OF90KiBDRlhfQmFzZU1hc3NBcnJheTo6QWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KQ0KLXsNCi0gICAgcmV0dXJuIG1fcERhdGEtPkFkZFNwYWNlVG8oaW5kZXgpOw0KK2ludDMyX3QgQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKSBjb25zdCB7DQorICByZXR1cm4gbV9wRGF0YS0+bV9pQmxvY2tDb3VudDsNCiB9DQotdWludDhfdCogQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wRGF0YS0+R2V0QXQoaW5kZXgpOw0KK3VpbnQ4X3QqIENGWF9CYXNlTWFzc0FycmF5OjpBZGRTcGFjZVRvKGludDMyX3QgaW5kZXgpIHsNCisgIHJldHVybiBtX3BEYXRhLT5BZGRTcGFjZVRvKGluZGV4KTsNCiB9DQotaW50MzJfdCBDRlhfQmFzZU1hc3NBcnJheTo6QXBwZW5kKGNvbnN0IENGWF9CYXNlTWFzc0FycmF5ICZzcmMsIGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlDb3VudCkNCi17DQotICAgIHJldHVybiBtX3BEYXRhLT5BcHBlbmQoKihDRlhfQmFzZU1hc3NBcnJheUltcCopc3JjLm1fcERhdGEsIGlTdGFydCwgaUNvdW50KTsNCit1aW50OF90KiBDRlhfQmFzZU1hc3NBcnJheTo6R2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcERhdGEtPkdldEF0KGluZGV4KTsNCiB9DQotaW50MzJfdCBDRlhfQmFzZU1hc3NBcnJheTo6Q29weShjb25zdCBDRlhfQmFzZU1hc3NBcnJheSAmc3JjLCBpbnQzMl90IGlTdGFydCwgaW50MzJfdCBpQ291bnQpDQotew0KLSAgICByZXR1cm4gbV9wRGF0YS0+Q29weSgqKENGWF9CYXNlTWFzc0FycmF5SW1wKilzcmMubV9wRGF0YSwgaVN0YXJ0LCBpQ291bnQpOw0KK2ludDMyX3QgQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFwcGVuZChjb25zdCBDRlhfQmFzZU1hc3NBcnJheSYgc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsNCisgIHJldHVybiBtX3BEYXRhLT5BcHBlbmQoKihDRlhfQmFzZU1hc3NBcnJheUltcCopc3JjLm1fcERhdGEsIGlTdGFydCwgaUNvdW50KTsNCiB9DQotaW50MzJfdCBDRlhfQmFzZU1hc3NBcnJheTo6UmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCkNCi17DQotICAgIHJldHVybiBtX3BEYXRhLT5SZW1vdmVMYXN0KGlDb3VudCk7DQoraW50MzJfdCBDRlhfQmFzZU1hc3NBcnJheTo6Q29weShjb25zdCBDRlhfQmFzZU1hc3NBcnJheSYgc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCkgew0KKyAgcmV0dXJuIG1fcERhdGEtPkNvcHkoKihDRlhfQmFzZU1hc3NBcnJheUltcCopc3JjLm1fcERhdGEsIGlTdGFydCwgaUNvdW50KTsNCiB9DQotdm9pZCBDRlhfQmFzZU1hc3NBcnJheTo6UmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5KQ0KLXsNCi0gICAgbV9wRGF0YS0+UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQoraW50MzJfdCBDRlhfQmFzZU1hc3NBcnJheTo6UmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCkgew0KKyAgcmV0dXJuIG1fcERhdGEtPlJlbW92ZUxhc3QoaUNvdW50KTsNCit9DQordm9pZCBDRlhfQmFzZU1hc3NBcnJheTo6UmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5KSB7DQorICBtX3BEYXRhLT5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCiB9DQogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0JBU0VESVNDUkVURUFSUkFZREFUQSB7DQotICAgIGludDMyX3QJCWlCbG9ja1NpemU7DQotICAgIGludDMyX3QJCWlDaHVua1NpemU7DQotICAgIGludDMyX3QJCWlDaHVua0NvdW50Ow0KLSAgICBDRlhfUHRyQXJyYXkJQ2h1bmtCdWZmZXI7DQotfSBGWF9CQVNFRElTQ1JFVEVBUlJBWURBVEEsICogRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEE7DQotdHlwZWRlZiBGWF9CQVNFRElTQ1JFVEVBUlJBWURBVEEgY29uc3QgKiBGWF9MUENCQVNFRElTQ1JFVEVBUlJBWURBVEE7DQotQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpDRlhfQmFzZURpc2NyZXRlQXJyYXkoaW50MzJfdCBpQ2h1bmtTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpDQotew0KLSAgICBGWFNZU19hc3NlcnQoaUNodW5rU2l6ZSA+IDAgJiYgaUJsb2NrU2l6ZSA+IDApOw0KLSAgICBGWF9MUEJBU0VESVNDUkVURUFSUkFZREFUQSBwRGF0YTsNCi0gICAgbV9wRGF0YSA9IHBEYXRhID0gRlhfTkVXIEZYX0JBU0VESVNDUkVURUFSUkFZREFUQTsNCi0gICAgcERhdGEtPkNodW5rQnVmZmVyLlNldFNpemUoMTYpOw0KLSAgICBwRGF0YS0+aUNodW5rQ291bnQgPSAwOw0KLSAgICBwRGF0YS0+aUNodW5rU2l6ZSA9IGlDaHVua1NpemU7DQotICAgIHBEYXRhLT5pQmxvY2tTaXplID0gaUJsb2NrU2l6ZTsNCisgIGludDMyX3QgaUJsb2NrU2l6ZTsNCisgIGludDMyX3QgaUNodW5rU2l6ZTsNCisgIGludDMyX3QgaUNodW5rQ291bnQ7DQorICBDRlhfUHRyQXJyYXkgQ2h1bmtCdWZmZXI7DQorfSBGWF9CQVNFRElTQ1JFVEVBUlJBWURBVEEsICpGWF9MUEJBU0VESVNDUkVURUFSUkFZREFUQTsNCit0eXBlZGVmIEZYX0JBU0VESVNDUkVURUFSUkFZREFUQSBjb25zdCogRlhfTFBDQkFTRURJU0NSRVRFQVJSQVlEQVRBOw0KK0NGWF9CYXNlRGlzY3JldGVBcnJheTo6Q0ZYX0Jhc2VEaXNjcmV0ZUFycmF5KGludDMyX3QgaUNodW5rU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCbG9ja1NpemUpIHsNCisgIEZYU1lTX2Fzc2VydChpQ2h1bmtTaXplID4gMCAmJiBpQmxvY2tTaXplID4gMCk7DQorICBGWF9MUEJBU0VESVNDUkVURUFSUkFZREFUQSBwRGF0YTsNCisgIG1fcERhdGEgPSBwRGF0YSA9IEZYX05FVyBGWF9CQVNFRElTQ1JFVEVBUlJBWURBVEE7DQorICBwRGF0YS0+Q2h1bmtCdWZmZXIuU2V0U2l6ZSgxNik7DQorICBwRGF0YS0+aUNodW5rQ291bnQgPSAwOw0KKyAgcERhdGEtPmlDaHVua1NpemUgPSBpQ2h1bmtTaXplOw0KKyAgcERhdGEtPmlCbG9ja1NpemUgPSBpQmxvY2tTaXplOw0KIH0NCi1DRlhfQmFzZURpc2NyZXRlQXJyYXk6On5DRlhfQmFzZURpc2NyZXRlQXJyYXkoKQ0KLXsNCi0gICAgUmVtb3ZlQWxsKCk7DQotICAgIGRlbGV0ZSAoRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEpbV9wRGF0YTsNCitDRlhfQmFzZURpc2NyZXRlQXJyYXk6On5DRlhfQmFzZURpc2NyZXRlQXJyYXkoKSB7DQorICBSZW1vdmVBbGwoKTsNCisgIGRlbGV0ZSAoRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEpIG1fcERhdGE7DQogfQ0KLXVpbnQ4X3QqIENGWF9CYXNlRGlzY3JldGVBcnJheTo6QWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEpOw0KLSAgICBGWF9MUEJBU0VESVNDUkVURUFSUkFZREFUQSBwRGF0YSA9IChGWF9MUEJBU0VESVNDUkVURUFSUkFZREFUQSltX3BEYXRhOw0KLSAgICBpbnQzMl90ICZpQ2h1bmtDb3VudCA9IHBEYXRhLT5pQ2h1bmtDb3VudDsNCi0gICAgaW50MzJfdCBpQ2h1bmtTaXplID0gcERhdGEtPmlDaHVua1NpemU7DQotICAgIHVpbnQ4X3QqIHBDaHVuayA9IE5VTEw7DQotICAgIGludDMyX3QgaUNodW5rID0gaW5kZXggLyBpQ2h1bmtTaXplOw0KLSAgICBpZiAoaUNodW5rIDwgaUNodW5rQ291bnQpIHsNCi0gICAgICAgIHBDaHVuayA9ICh1aW50OF90KilwRGF0YS0+Q2h1bmtCdWZmZXIuR2V0QXQoaUNodW5rKTsNCit1aW50OF90KiBDRlhfQmFzZURpc2NyZXRlQXJyYXk6OkFkZFNwYWNlVG8oaW50MzJfdCBpbmRleCkgew0KKyAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEpOw0KKyAgRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEgcERhdGEgPSAoRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEpbV9wRGF0YTsNCisgIGludDMyX3QmIGlDaHVua0NvdW50ID0gcERhdGEtPmlDaHVua0NvdW50Ow0KKyAgaW50MzJfdCBpQ2h1bmtTaXplID0gcERhdGEtPmlDaHVua1NpemU7DQorICB1aW50OF90KiBwQ2h1bmsgPSBOVUxMOw0KKyAgaW50MzJfdCBpQ2h1bmsgPSBpbmRleCAvIGlDaHVua1NpemU7DQorICBpZiAoaUNodW5rIDwgaUNodW5rQ291bnQpIHsNCisgICAgcENodW5rID0gKHVpbnQ4X3QqKXBEYXRhLT5DaHVua0J1ZmZlci5HZXRBdChpQ2h1bmspOw0KKyAgfQ0KKyAgaWYgKHBDaHVuayA9PSBOVUxMKSB7DQorICAgIGludDMyX3QgaU1lbVNpemUgPSBpQ2h1bmtTaXplICogcERhdGEtPmlCbG9ja1NpemU7DQorICAgIHBDaHVuayA9ICh1aW50OF90KilGWF9BbGxvYyh1aW50OF90LCBpTWVtU2l6ZSk7DQorICAgIEZYU1lTX21lbXNldChwQ2h1bmssIDAsIGlNZW1TaXplKTsNCisgICAgcERhdGEtPkNodW5rQnVmZmVyLlNldEF0R3JvdyhpQ2h1bmssIHBDaHVuayk7DQorICAgIGlmIChpQ2h1bmtDb3VudCA8PSBpQ2h1bmspIHsNCisgICAgICBpQ2h1bmtDb3VudCA9IGlDaHVuayArIDE7DQogICAgIH0NCi0gICAgaWYgKHBDaHVuayA9PSBOVUxMKSB7DQotICAgICAgICBpbnQzMl90IGlNZW1TaXplID0gaUNodW5rU2l6ZSAqIHBEYXRhLT5pQmxvY2tTaXplOw0KLSAgICAgICAgcENodW5rID0gKHVpbnQ4X3QqKUZYX0FsbG9jKHVpbnQ4X3QsIGlNZW1TaXplKTsNCi0gICAgICAgIEZYU1lTX21lbXNldChwQ2h1bmssIDAsIGlNZW1TaXplKTsNCi0gICAgICAgIHBEYXRhLT5DaHVua0J1ZmZlci5TZXRBdEdyb3coaUNodW5rLCBwQ2h1bmspOw0KLSAgICAgICAgaWYgKGlDaHVua0NvdW50IDw9IGlDaHVuaykgew0KLSAgICAgICAgICAgIGlDaHVua0NvdW50ID0gaUNodW5rICsgMTsNCi0gICAgICAgIH0NCisgIH0NCisgIHJldHVybiBwQ2h1bmsgKyAoaW5kZXggJSBpQ2h1bmtTaXplKSAqIHBEYXRhLT5pQmxvY2tTaXplOw0KK30NCit1aW50OF90KiBDRlhfQmFzZURpc2NyZXRlQXJyYXk6OkdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xKTsNCisgIEZYX0xQQkFTRURJU0NSRVRFQVJSQVlEQVRBIHBEYXRhID0gKEZYX0xQQkFTRURJU0NSRVRFQVJSQVlEQVRBKW1fcERhdGE7DQorICBpbnQzMl90IGlDaHVua1NpemUgPSBwRGF0YS0+aUNodW5rU2l6ZTsNCisgIGludDMyX3QgaUNodW5rID0gaW5kZXggLyBpQ2h1bmtTaXplOw0KKyAgaWYgKGlDaHVuayA+PSBwRGF0YS0+aUNodW5rQ291bnQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB1aW50OF90KiBwQ2h1bmsgPSAodWludDhfdCopcERhdGEtPkNodW5rQnVmZmVyLkdldEF0KGlDaHVuayk7DQorICBpZiAocENodW5rID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcENodW5rICsgKGluZGV4ICUgaUNodW5rU2l6ZSkgKiBwRGF0YS0+aUJsb2NrU2l6ZTsNCit9DQordm9pZCBDRlhfQmFzZURpc2NyZXRlQXJyYXk6OlJlbW92ZUFsbCgpIHsNCisgIEZYX0xQQkFTRURJU0NSRVRFQVJSQVlEQVRBIHBEYXRhID0gKEZYX0xQQkFTRURJU0NSRVRFQVJSQVlEQVRBKW1fcERhdGE7DQorICBDRlhfUHRyQXJyYXkmIENodW5rQnVmZmVyID0gcERhdGEtPkNodW5rQnVmZmVyOw0KKyAgaW50MzJfdCYgaUNodW5rQ291bnQgPSBwRGF0YS0+aUNodW5rQ291bnQ7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ2h1bmtDb3VudDsgaSsrKSB7DQorICAgIHZvaWQqIHAgPSBDaHVua0J1ZmZlci5HZXRBdChpKTsNCisgICAgaWYgKHAgPT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIHJldHVybiBwQ2h1bmsgKyAoaW5kZXggJSBpQ2h1bmtTaXplKSAqIHBEYXRhLT5pQmxvY2tTaXplOw0KKyAgICBGWF9GcmVlKHApOw0KKyAgfQ0KKyAgQ2h1bmtCdWZmZXIuUmVtb3ZlQWxsKCk7DQorICBpQ2h1bmtDb3VudCA9IDA7DQogfQ0KLXVpbnQ4X3QqIENGWF9CYXNlRGlzY3JldGVBcnJheTo6R2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3QNCi17DQotICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xKTsNCi0gICAgRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEgcERhdGEgPSAoRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEpbV9wRGF0YTsNCi0gICAgaW50MzJfdCBpQ2h1bmtTaXplID0gcERhdGEtPmlDaHVua1NpemU7DQotICAgIGludDMyX3QgaUNodW5rID0gaW5kZXggLyBpQ2h1bmtTaXplOw0KLSAgICBpZiAoaUNodW5rID49IHBEYXRhLT5pQ2h1bmtDb3VudCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgdWludDhfdCogcENodW5rID0gKHVpbnQ4X3QqKXBEYXRhLT5DaHVua0J1ZmZlci5HZXRBdChpQ2h1bmspOw0KLSAgICBpZiAocENodW5rID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBwQ2h1bmsgKyAoaW5kZXggJSBpQ2h1bmtTaXplKSAqIHBEYXRhLT5pQmxvY2tTaXplOw0KK0NGWF9CYXNlU3RhY2s6OkNGWF9CYXNlU3RhY2soaW50MzJfdCBpQ2h1bmtTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpIHsNCisgIG1fcERhdGEgPSBuZXcgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAoaUNodW5rU2l6ZSwgaUJsb2NrU2l6ZSk7DQogfQ0KLXZvaWQgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpSZW1vdmVBbGwoKQ0KLXsNCi0gICAgRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEgcERhdGEgPSAoRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEpbV9wRGF0YTsNCi0gICAgQ0ZYX1B0ckFycmF5ICZDaHVua0J1ZmZlciA9IHBEYXRhLT5DaHVua0J1ZmZlcjsNCi0gICAgaW50MzJfdCAmaUNodW5rQ291bnQgPSBwRGF0YS0+aUNodW5rQ291bnQ7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDaHVua0NvdW50OyBpKyspIHsNCi0gICAgICAgIHZvaWQqIHAgPSBDaHVua0J1ZmZlci5HZXRBdChpKTsNCi0gICAgICAgIGlmIChwID09IE5VTEwpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZyZWUocCk7DQotICAgIH0NCi0gICAgQ2h1bmtCdWZmZXIuUmVtb3ZlQWxsKCk7DQotICAgIGlDaHVua0NvdW50ID0gMDsNCitDRlhfQmFzZVN0YWNrOjp+Q0ZYX0Jhc2VTdGFjaygpIHsNCisgIGRlbGV0ZSAoQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKW1fcERhdGE7DQogfQ0KLUNGWF9CYXNlU3RhY2s6OkNGWF9CYXNlU3RhY2soaW50MzJfdCBpQ2h1bmtTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpDQotew0KLSAgICBtX3BEYXRhID0gbmV3IENGWF9CYXNlTWFzc0FycmF5SW1wKGlDaHVua1NpemUsIGlCbG9ja1NpemUpOw0KK3VpbnQ4X3QqIENGWF9CYXNlU3RhY2s6OlB1c2goKSB7DQorICByZXR1cm4gbV9wRGF0YS0+QWRkU3BhY2UoKTsNCiB9DQotQ0ZYX0Jhc2VTdGFjazo6fkNGWF9CYXNlU3RhY2soKQ0KLXsNCi0gICAgZGVsZXRlIChDRlhfQmFzZU1hc3NBcnJheUltcCopbV9wRGF0YTsNCit2b2lkIENGWF9CYXNlU3RhY2s6OlBvcCgpIHsNCisgIGludDMyX3QmIGlCbG9ja0NvdW50ID0gbV9wRGF0YS0+bV9pQmxvY2tDb3VudDsNCisgIGlmIChpQmxvY2tDb3VudCA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaUJsb2NrQ291bnQtLTsNCiB9DQotdWludDhfdCogQ0ZYX0Jhc2VTdGFjazo6UHVzaCgpDQotew0KLSAgICByZXR1cm4gbV9wRGF0YS0+QWRkU3BhY2UoKTsNCit1aW50OF90KiBDRlhfQmFzZVN0YWNrOjpHZXRUb3BFbGVtZW50KCkgY29uc3Qgew0KKyAgaW50MzJfdCBpU2l6ZSA9IG1fcERhdGEtPm1faUJsb2NrQ291bnQ7DQorICBpZiAoaVNpemUgPCAxKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcERhdGEtPkdldEF0KGlTaXplIC0gMSk7DQogfQ0KLXZvaWQgQ0ZYX0Jhc2VTdGFjazo6UG9wKCkNCi17DQotICAgIGludDMyX3QgJmlCbG9ja0NvdW50ID0gbV9wRGF0YS0+bV9pQmxvY2tDb3VudDsNCi0gICAgaWYgKGlCbG9ja0NvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlCbG9ja0NvdW50IC0tOw0KK2ludDMyX3QgQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BEYXRhLT5tX2lCbG9ja0NvdW50Ow0KIH0NCi11aW50OF90KiBDRlhfQmFzZVN0YWNrOjpHZXRUb3BFbGVtZW50KCkgY29uc3QNCi17DQotICAgIGludDMyX3QgaVNpemUgPSBtX3BEYXRhLT5tX2lCbG9ja0NvdW50Ow0KLSAgICBpZiAoaVNpemUgPCAxKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wRGF0YS0+R2V0QXQoaVNpemUgLSAxKTsNCit1aW50OF90KiBDRlhfQmFzZVN0YWNrOjpHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICByZXR1cm4gbV9wRGF0YS0+R2V0QXQoaW5kZXgpOw0KIH0NCi1pbnQzMl90IENGWF9CYXNlU3RhY2s6OkdldFNpemUoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fcERhdGEtPm1faUJsb2NrQ291bnQ7DQotfQ0KLXVpbnQ4X3QqIENGWF9CYXNlU3RhY2s6OkdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wRGF0YS0+R2V0QXQoaW5kZXgpOw0KLX0NCi12b2lkIENGWF9CYXNlU3RhY2s6OlJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSApDQotew0KLSAgICBtX3BEYXRhLT5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCit2b2lkIENGWF9CYXNlU3RhY2s6OlJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSkgew0KKyAgbV9wRGF0YS0+UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmggYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF91dGlscy5oCmluZGV4IDQyMzI2NTcuLmFiZWU0M2QgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmgKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfdXRpbHMuaApAQCAtNiwyNyArNiwzMSBAQAogDQogI2lmbmRlZiBfRlhfVVRJTFNfSU1QDQogI2RlZmluZSBfRlhfVVRJTFNfSU1QDQotY2xhc3MgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9CYXNlTWFzc0FycmF5SW1wKGludDMyX3QgaUNodW5rU2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKTsNCi0gICAgfkNGWF9CYXNlTWFzc0FycmF5SW1wKCk7DQotICAgIHVpbnQ4X3QqCUFkZFNwYWNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEFkZFNwYWNlVG8obV9pQmxvY2tDb3VudCk7DQotICAgIH0NCi0gICAgdWludDhfdCoJQWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KTsNCi0gICAgdWludDhfdCoJR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Q7DQotICAgIGludDMyX3QJQXBwZW5kKGNvbnN0IENGWF9CYXNlTWFzc0FycmF5SW1wICZzcmMsIGludDMyX3QgaVN0YXJ0ID0gMCwgaW50MzJfdCBpQ291bnQgPSAtMSk7DQotICAgIGludDMyX3QJQ29weShjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCAmc3JjLCBpbnQzMl90IGlTdGFydCA9IDAsIGludDMyX3QgaUNvdW50ID0gLTEpOw0KLSAgICBpbnQzMl90CVJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQgPSAtMSk7DQotICAgIHZvaWQJCVJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKTsNCi0gICAgaW50MzJfdAkJbV9pQ2h1bmtTaXplOw0KLSAgICBpbnQzMl90CQltX2lCbG9ja1NpemU7DQotICAgIGludDMyX3QJCW1faUNodW5rQ291bnQ7DQotICAgIGludDMyX3QJCW1faUJsb2NrQ291bnQ7DQotICAgIENGWF9QdHJBcnJheQkqbV9wRGF0YTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJQXBwZW5kKGludDMyX3QgaURzdFN0YXJ0LCBjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCAmc3JjLCBpbnQzMl90IGlTcmNTdGFydCA9IDAsIGludDMyX3QgaVNyY0NvdW50ID0gLTEpOw0KK2NsYXNzIENGWF9CYXNlTWFzc0FycmF5SW1wIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRlhfQmFzZU1hc3NBcnJheUltcChpbnQzMl90IGlDaHVua1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSk7DQorICB+Q0ZYX0Jhc2VNYXNzQXJyYXlJbXAoKTsNCisgIHVpbnQ4X3QqIEFkZFNwYWNlKCkgeyByZXR1cm4gQWRkU3BhY2VUbyhtX2lCbG9ja0NvdW50KTsgfQ0KKyAgdWludDhfdCogQWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KTsNCisgIHVpbnQ4X3QqIEdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgaW50MzJfdCBBcHBlbmQoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAmIHNyYywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gLTEpOw0KKyAgaW50MzJfdCBDb3B5KGNvbnN0IENGWF9CYXNlTWFzc0FycmF5SW1wJiBzcmMsDQorICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gLTEpOw0KKyAgaW50MzJfdCBSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50ID0gLTEpOw0KKyAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSk7DQorICBpbnQzMl90IG1faUNodW5rU2l6ZTsNCisgIGludDMyX3QgbV9pQmxvY2tTaXplOw0KKyAgaW50MzJfdCBtX2lDaHVua0NvdW50Ow0KKyAgaW50MzJfdCBtX2lCbG9ja0NvdW50Ow0KKyAgQ0ZYX1B0ckFycmF5KiBtX3BEYXRhOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIEFwcGVuZChpbnQzMl90IGlEc3RTdGFydCwNCisgICAgICAgICAgICAgIGNvbnN0IENGWF9CYXNlTWFzc0FycmF5SW1wJiBzcmMsDQorICAgICAgICAgICAgICBpbnQzMl90IGlTcmNTdGFydCA9IDAsDQorICAgICAgICAgICAgICBpbnQzMl90IGlTcmNDb3VudCA9IC0xKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9mb250dXRpbHMuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2ZvbnR1dGlscy5jcHAKaW5kZXggZjZmZTljNi4uNTM1MzJmNyAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2ZvbnR1dGlscy5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2ZvbnR1dGlscy5jcHAKQEAgLTYsMjMxICs2LDE0NCBAQAogDQogI2luY2x1ZGUgIi4uL2ZnYXNfYmFzZS5oIg0KICNpbmNsdWRlICJmeF9mb250dXRpbHMuaCINCi1GWF9EV09SRCBGR0FTX0dldEZvbnRIYXNoQ29kZShGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdIYXNoID0gd0NvZGVQYWdlOw0KLSAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2gpIHsNCi0gICAgICAgIGR3SGFzaCB8PSAweDAwMDEwMDAwOw0KLSAgICB9DQotICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2VyaWYpIHsNCi0gICAgICAgIGR3SGFzaCB8PSAweDAwMDIwMDAwOw0KLSAgICB9DQotICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpIHsNCi0gICAgICAgIGR3SGFzaCB8PSAweDAwMDQwMDAwOw0KLSAgICB9DQotICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSB7DQotICAgICAgICBkd0hhc2ggfD0gMHgwMDA4MDAwMDsNCi0gICAgfQ0KLSAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgew0KLSAgICAgICAgZHdIYXNoIHw9IDB4MDAxMDAwMDA7DQotICAgIH0NCi0gICAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9Cb2xkKSB7DQotICAgICAgICBkd0hhc2ggfD0gMHgwMDIwMDAwMDsNCi0gICAgfQ0KLSAgICByZXR1cm4gZHdIYXNoOw0KK0ZYX0RXT1JEIEZHQVNfR2V0Rm9udEhhc2hDb2RlKEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMpIHsNCisgIEZYX0RXT1JEIGR3SGFzaCA9IHdDb2RlUGFnZTsNCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCkgew0KKyAgICBkd0hhc2ggfD0gMHgwMDAxMDAwMDsNCisgIH0NCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2VyaWYpIHsNCisgICAgZHdIYXNoIHw9IDB4MDAwMjAwMDA7DQorICB9DQorICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1N5bWJvbGljKSB7DQorICAgIGR3SGFzaCB8PSAweDAwMDQwMDAwOw0KKyAgfQ0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TY3JpcHQpIHsNCisgICAgZHdIYXNoIHw9IDB4MDAwODAwMDA7DQorICB9DQorICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgew0KKyAgICBkd0hhc2ggfD0gMHgwMDEwMDAwMDsNCisgIH0NCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgew0KKyAgICBkd0hhc2ggfD0gMHgwMDIwMDAwMDsNCisgIH0NCisgIHJldHVybiBkd0hhc2g7DQogfQ0KLUZYX0RXT1JEIEZHQVNfR2V0Rm9udEZhbWlseUhhc2goY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0ZvbnQocHN6Rm9udEZhbWlseSk7DQotICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgew0KLSAgICAgICAgd3NGb250ICs9IEwiQm9sZCI7DQotICAgIH0NCi0gICAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMpIHsNCi0gICAgICAgIHdzRm9udCArPSBMIkl0YWxpYyI7DQotICAgIH0NCi0gICAgd3NGb250ICs9IHdDb2RlUGFnZTsNCi0gICAgcmV0dXJuIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKChjb25zdCBGWF9XQ0hBUiopd3NGb250LCB3c0ZvbnQuR2V0TGVuZ3RoKCkpOw0KK0ZYX0RXT1JEIEZHQVNfR2V0Rm9udEZhbWlseUhhc2goY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb250KHBzekZvbnRGYW1pbHkpOw0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9Cb2xkKSB7DQorICAgIHdzRm9udCArPSBMIkJvbGQiOw0KKyAgfQ0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMpIHsNCisgICAgd3NGb250ICs9IEwiSXRhbGljIjsNCisgIH0NCisgIHdzRm9udCArPSB3Q29kZVBhZ2U7DQorICByZXR1cm4gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoKGNvbnN0IEZYX1dDSEFSKil3c0ZvbnQsIHdzRm9udC5HZXRMZW5ndGgoKSk7DQogfQ0KIHN0YXRpYyBjb25zdCBGR0FTX0ZPTlRVU0IgZ19GWEdkaUZvbnRVU0JUYWJsZVtdID0gew0KLSAgICB7MHgwMDAwICAsCTB4MDA3RiAgLAkwICAsCTEyNTIgIH0sDQotICAgIHsweDAwODAgICwJMHgwMEZGICAsCTEgICwJMTI1MiAgfSwNCi0gICAgezB4MDEwMCAgLAkweDAxN0YgICwJMiAgLAkxMjUwICB9LA0KLSAgICB7MHgwMTgwICAsCTB4MDI0RiAgLAkzICAsCTEyNTAgIH0sDQotICAgIHsweDAyNTAgICwJMHgwMkFGICAsCTQgICwJMHhGRkZGfSwNCi0gICAgezB4MDJCMCAgLAkweDAyRkYgICwJNSAgLAkweEZGRkZ9LA0KLSAgICB7MHgwMzAwICAsCTB4MDM2RiAgLAk2ICAsCTB4RkZGRn0sDQotICAgIHsweDAzNzAgICwJMHgwM0ZGICAsCTcgICwJMTI1MyAgfSwNCi0gICAgezB4MDQwMCAgLAkweDA0RkYgICwJOSAgLAkxMjUxICB9LA0KLSAgICB7MHgwNTAwICAsCTB4MDUyRiAgLAk5ICAsCTB4RkZGRn0sDQotICAgIHsweDA1MzAgICwJMHgwNThGICAsCTEwICwJMHhGRkZGfSwNCi0gICAgezB4MDU5MCAgLAkweDA1RkYgICwJMTEgLAkxMjU1ICB9LA0KLSAgICB7MHgwNjAwICAsCTB4MDZGRiAgLAkxMyAsCTEyNTYgIH0sDQotICAgIHsweDA3MDAgICwJMHgwNzRGICAsCTcxICwJMHhGRkZGfSwNCi0gICAgezB4MDc1MCAgLAkweDA3N0YgICwJMTMgLAkweEZGRkZ9LA0KLSAgICB7MHgwNzgwICAsCTB4MDdCRiAgLAk3MiAsCTB4RkZGRn0sDQotICAgIHsweDA3QzAgICwJMHgwN0ZGICAsCTE0ICwJMHhGRkZGfSwNCi0gICAgezB4MDgwMCAgLAkweDA4RkYgICwJOTk5LAkweEZGRkZ9LA0KLSAgICB7MHgwOTAwICAsCTB4MDk3RiAgLAkxNSAsCTB4RkZGRn0sDQotICAgIHsweDA5ODAgICwJMHgwOUZGICAsCTE2ICwJMHhGRkZGfSwNCi0gICAgezB4MEEwMCAgLAkweDBBN0YgICwJMTcgLAkweEZGRkZ9LA0KLSAgICB7MHgwQTgwICAsCTB4MEFGRiAgLAkxOCAsCTB4RkZGRn0sDQotICAgIHsweDBCMDAgICwJMHgwQjdGICAsCTE5ICwJMHhGRkZGfSwNCi0gICAgezB4MEI4MCAgLAkweDBCRkYgICwJMjAgLAkweEZGRkZ9LA0KLSAgICB7MHgwQzAwICAsCTB4MEM3RiAgLAkyMSAsCTB4RkZGRn0sDQotICAgIHsweDBDODAgICwJMHgwQ0ZGICAsCTIyICwJMHhGRkZGfSwNCi0gICAgezB4MEQwMCAgLAkweDBEN0YgICwJMjMgLAkweEZGRkZ9LA0KLSAgICB7MHgwRDgwICAsCTB4MERGRiAgLAk3MyAsCTB4RkZGRn0sDQotICAgIHsweDBFMDAgICwJMHgwRTdGICAsCTI0ICwJODc0ICAgfSwNCi0gICAgezB4MEU4MCAgLAkweDBFRkYgICwJMjUgLAkweEZGRkZ9LA0KLSAgICB7MHgwRjAwICAsCTB4MEZGRiAgLAk3MCAsCTB4RkZGRn0sDQotICAgIHsweDEwMDAgICwJMHgxMDlGICAsCTc0ICwJMHhGRkZGfSwNCi0gICAgezB4MTBBMCAgLAkweDEwRkYgICwJMjYgLAkweEZGRkZ9LA0KLSAgICB7MHgxMTAwICAsCTB4MTFGRiAgLAkyOCAsCTB4RkZGRn0sDQotICAgIHsweDEyMDAgICwJMHgxMzdGICAsCTc1ICwJMHhGRkZGfSwNCi0gICAgezB4MTM4MCAgLAkweDEzOUYgICwJNzUgLAkweEZGRkZ9LA0KLSAgICB7MHgxM0EwICAsCTB4MTNGRiAgLAk3NiAsCTB4RkZGRn0sDQotICAgIHsweDE0MDAgICwJMHgxNjdGICAsCTc3ICwJMHhGRkZGfSwNCi0gICAgezB4MTY4MCAgLAkweDE2OUYgICwJNzggLAkweEZGRkZ9LA0KLSAgICB7MHgxNkEwICAsCTB4MTZGRiAgLAk3OSAsCTB4RkZGRn0sDQotICAgIHsweDE3MDAgICwJMHgxNzFGICAsCTg0ICwJMHhGRkZGfSwNCi0gICAgezB4MTcyMCAgLAkweDE3M0YgICwJODQgLAkweEZGRkZ9LA0KLSAgICB7MHgxNzQwICAsCTB4MTc1RiAgLAk4NCAsCTB4RkZGRn0sDQotICAgIHsweDE3NjAgICwJMHgxNzdGICAsCTg0ICwJMHhGRkZGfSwNCi0gICAgezB4MTc4MCAgLAkweDE3RkYgICwJODAgLAkweEZGRkZ9LA0KLSAgICB7MHgxODAwICAsCTB4MThBRiAgLAk4MSAsCTB4RkZGRn0sDQotICAgIHsweDE4QjAgICwJMHgxOEZGICAsCTk5OSwJMHhGRkZGfSwNCi0gICAgezB4MTkwMCAgLAkweDE5NEYgICwJOTMgLAkweEZGRkZ9LA0KLSAgICB7MHgxOTUwICAsCTB4MTk3RiAgLAk5NCAsCTB4RkZGRn0sDQotICAgIHsweDE5ODAgICwJMHgxOURGICAsCTk1ICwJMHhGRkZGfSwNCi0gICAgezB4MTlFMCAgLAkweDE5RkYgICwJODAgLAkweEZGRkZ9LA0KLSAgICB7MHgxQTAwICAsCTB4MUExRiAgLAk5NiAsCTB4RkZGRn0sDQotICAgIHsweDFBMjAgICwJMHgxQUZGICAsCTk5OSwJMHhGRkZGfSwNCi0gICAgezB4MUIwMCAgLAkweDFCN0YgICwJMjcgLAkweEZGRkZ9LA0KLSAgICB7MHgxQjgwICAsCTB4MUJCRiAgLAkxMTIsCTB4RkZGRn0sDQotICAgIHsweDFCQzAgICwJMHgxQkZGICAsCTk5OSwJMHhGRkZGfSwNCi0gICAgezB4MUMwMCAgLAkweDFDNEYgICwJMTEzLAkweEZGRkZ9LA0KLSAgICB7MHgxQzUwICAsCTB4MUM3RiAgLAkxMTQsCTB4RkZGRn0sDQotICAgIHsweDFDODAgICwJMHgxQ0ZGICAsCTk5OSwJMHhGRkZGfSwNCi0gICAgezB4MUQwMCAgLAkweDFEN0YgICwJNCAgLAkweEZGRkZ9LA0KLSAgICB7MHgxRDgwICAsCTB4MURCRiAgLAk0ICAsCTB4RkZGRn0sDQotICAgIHsweDFEQzAgICwJMHgxREZGICAsCTYgICwJMHhGRkZGfSwNCi0gICAgezB4MUUwMCAgLAkweDFFRkYgICwJMjkgLAkweEZGRkZ9LA0KLSAgICB7MHgxRjAwICAsCTB4MUZGRiAgLAkzMCAsCTB4RkZGRn0sDQotICAgIHsweDIwMDAgICwJMHgyMDZGICAsCTMxICwJMHhGRkZGfSwNCi0gICAgezB4MjA3MCAgLAkweDIwOUYgICwJMzIgLAkweEZGRkZ9LA0KLSAgICB7MHgyMEEwICAsCTB4MjBDRiAgLAkzMyAsCTB4RkZGRn0sDQotICAgIHsweDIwRDAgICwJMHgyMEZGICAsCTM0ICwJMHhGRkZGfSwNCi0gICAgezB4MjEwMCAgLAkweDIxNEYgICwJMzUgLAkweEZGRkZ9LA0KLSAgICB7MHgyMTUwICAsCTB4MjE1RiAgLAkzNiAsCTB4RkZGRn0sDQotICAgIHsweDIxNjAgICwJMHgyMTZCICAsCTM2ICwJOTM2ICAgfSwNCi0gICAgezB4MjE2QyAgLAkweDIxNkYgICwJMzYgLAkweEZGRkZ9LA0KLSAgICB7MHgyMTcwICAsCTB4MjE3OSAgLAkzNiAsCTkzNiAgIH0sDQotICAgIHsweDIxN0EgICwJMHgyMThGICAsCTM2ICwJMHhGRkZGfSwNCi0gICAgezB4MjE5MCAgLAkweDIxOTkgICwJMzcgLAk5NDkgICB9LA0KLSAgICB7MHgyMTlBICAsCTB4MjFGRiAgLAkzNyAsCTB4RkZGRn0sDQotICAgIHsweDIyMDAgICwJMHgyMkZGICAsCTM4ICwJMHhGRkZGfSwNCi0gICAgezB4MjMwMCAgLAkweDIzRkYgICwJMzkgLAkweEZGRkZ9LA0KLSAgICB7MHgyNDAwICAsCTB4MjQzRiAgLAk0MCAsCTB4RkZGRn0sDQotICAgIHsweDI0NDAgICwJMHgyNDVGICAsCTQxICwJMHhGRkZGfSwNCi0gICAgezB4MjQ2MCAgLAkweDI0NzMgICwJNDIgLAk5MzIgICB9LA0KLSAgICB7MHgyNDc0ICAsCTB4MjQ5QiAgLAk0MiAsCTkzNiAgIH0sDQotICAgIHsweDI0OUMgICwJMHgyNEU5ICAsCTQyICwJOTQ5ICAgfSwNCi0gICAgezB4MjRFQSAgLAkweDI0RkYgICwJNDIgLAkweEZGRkZ9LA0KLSAgICB7MHgyNTAwICAsCTB4MjU3MyAgLAk0MyAsCTkzNiAgIH0sDQotICAgIHsweDI1NzQgICwJMHgyNTdGICAsCTQzICwJMHhGRkZGfSwNCi0gICAgezB4MjU4MCAgLAkweDI1ODAgICwJNDQgLAkweEZGRkZ9LA0KLSAgICB7MHgyNTgxICAsCTB4MjU4RiAgLAk0NCAsCTkzNiAgIH0sDQotICAgIHsweDI1OTAgICwJMHgyNTlGICAsCTQ0ICwJMHhGRkZGfSwNCi0gICAgezB4MjVBMCAgLAkweDI1RkYgICwJNDUgLAkweEZGRkZ9LA0KLSAgICB7MHgyNjAwICAsCTB4MjZGRiAgLAk0NiAsCTB4RkZGRn0sDQotICAgIHsweDI3MDAgICwJMHgyN0JGICAsCTQ3ICwJMHhGRkZGfSwNCi0gICAgezB4MjdDMCAgLAkweDI3RUYgICwJMzggLAkweEZGRkZ9LA0KLSAgICB7MHgyN0YwICAsCTB4MjdGRiAgLAkzNyAsCTB4RkZGRn0sDQotICAgIHsweDI4MDAgICwJMHgyOEZGICAsCTgyICwJMHhGRkZGfSwNCi0gICAgezB4MjkwMCAgLAkweDI5N0YgICwJMzcgLAkweEZGRkZ9LA0KLSAgICB7MHgyOTgwICAsCTB4MjlGRiAgLAkzOCAsCTB4RkZGRn0sDQotICAgIHsweDJBMDAgICwJMHgyQUZGICAsCTM4ICwJMHhGRkZGfSwNCi0gICAgezB4MkIwMCAgLAkweDJCRkYgICwJMzcgLAkweEZGRkZ9LA0KLSAgICB7MHgyQzAwICAsCTB4MkM1RiAgLAk5NyAsCTB4RkZGRn0sDQotICAgIHsweDJDNjAgICwJMHgyQzdGICAsCTI5ICwJMHhGRkZGfSwNCi0gICAgezB4MkM4MCAgLAkweDJDRkYgICwJOCAgLAkweEZGRkZ9LA0KLSAgICB7MHgyRDAwICAsCTB4MkQyRiAgLAkyNiAsCTB4RkZGRn0sDQotICAgIHsweDJEMzAgICwJMHgyRDdGICAsCTk4ICwJMHhGRkZGfSwNCi0gICAgezB4MkQ4MCAgLAkweDJEREYgICwJNzUgLAkweEZGRkZ9LA0KLSAgICB7MHgyREUwICAsCTB4MkRGRiAgLAk5ICAsCTB4RkZGRn0sDQotICAgIHsweDJFMDAgICwJMHgyRTdGICAsCTMxICwJMHhGRkZGfSwNCi0gICAgezB4MkU4MCAgLAkweDJFRkYgICwJNTkgLAkweEZGRkZ9LA0KLSAgICB7MHgyRjAwICAsCTB4MkZERiAgLAk1OSAsCTB4RkZGRn0sDQotICAgIHsweDJGRTAgICwJMHgyRkVGICAsCTk5OSwJMHhGRkZGfSwNCi0gICAgezB4MkZGMCAgLAkweDJGRkYgICwJNTkgLAkweEZGRkZ9LA0KLSAgICB7MHgzMDAwICAsCTB4MzAzRiAgLAk0OCAsCTB4RkZGRn0sDQotICAgIHsweDMwNDAgICwJMHgzMDlGICAsCTQ5ICwJOTMyICAgfSwNCi0gICAgezB4MzBBMCAgLAkweDMwRkYgICwJNTAgLAk5MzIgICB9LA0KLSAgICB7MHgzMTAwICAsCTB4MzEyOSAgLAk1MSAsCTkzNiAgIH0sDQotICAgIHsweDMxMkEgICwJMHgzMTJGICAsCTUxICwJMHhGRkZGfSwNCi0gICAgezB4MzEzMCAgLAkweDMxOEYgICwJNTIgLAk5NDkgICB9LA0KLSAgICB7MHgzMTkwICAsCTB4MzE5RiAgLAk1OSAsCTB4RkZGRn0sDQotICAgIHsweDMxQTAgICwJMHgzMUJGICAsCTUxICwJMHhGRkZGfSwNCi0gICAgezB4MzFDMCAgLAkweDMxRUYgICwJNjEgLAkweEZGRkZ9LA0KLSAgICB7MHgzMUYwICAsCTB4MzFGRiAgLAk1MCAsCTB4RkZGRn0sDQotICAgIHsweDMyMDAgICwJMHgzMjFDICAsCTU0ICwJOTQ5ICAgfSwNCi0gICAgezB4MzIxRCAgLAkweDMyNUYgICwJNTQgLAkweEZGRkZ9LA0KLSAgICB7MHgzMjYwICAsCTB4MzI3RiAgLAk1NCAsCTk0OSAgIH0sDQotICAgIHsweDMyODAgICwJMHgzMkZGICAsCTU0ICwJMHhGRkZGfSwNCi0gICAgezB4MzMwMCAgLAkweDMzODcgICwJNTUgLAkweEZGRkZ9LA0KLSAgICB7MHgzMzg4ICAsCTB4MzNEMCAgLAk1NSAsCTk0OSAgIH0sDQotICAgIHsweDMzRDEgICwJMHgzM0ZGICAsCTU1ICwJMHhGRkZGfSwNCi0gICAgezB4MzQwMCAgLAkweDREQkYgICwJNTkgLAkweEZGRkZ9LA0KLSAgICB7MHg0REMwICAsCTB4NERGRiAgLAk5OSAsCTB4RkZGRn0sDQotICAgIHsweDRFMDAgICwJMHg5RkE1ICAsCTU5ICwJOTM2ICAgfSwNCi0gICAgezB4OUZBNiAgLAkweDlGRkYgICwJNTkgLAkweEZGRkZ9LA0KLSAgICB7MHhBMDAwICAsCTB4QTQ4RiAgLAk4MyAsCTB4RkZGRn0sDQotICAgIHsweEE0OTAgICwJMHhBNENGICAsCTgzICwJMHhGRkZGfSwNCi0gICAgezB4QTREMCAgLAkweEE0RkYgICwJOTk5LAkweEZGRkZ9LA0KLSAgICB7MHhBNTAwICAsCTB4QTYzRiAgLAkxMiAsCTB4RkZGRn0sDQotICAgIHsweEE2NDAgICwJMHhBNjlGICAsCTkgICwJMHhGRkZGfSwNCi0gICAgezB4QTZBMCAgLAkweEE2RkYgICwJOTk5LAkweEZGRkZ9LA0KLSAgICB7MHhBNzAwICAsCTB4QTcxRiAgLAk1ICAsCTB4RkZGRn0sDQotICAgIHsweEE3MjAgICwJMHhBN0ZGICAsCTI5ICwJMHhGRkZGfSwNCi0gICAgezB4QTgwMCAgLAkweEE4MkYgICwJMTAwLAkweEZGRkZ9LA0KLSAgICB7MHhBODMwICAsCTB4QThGRiAgLAk5OTksCTB4RkZGRn0sDQotICAgIHsweEE4NDAgICwJMHhBODdGICAsCTUzICwJMHhGRkZGfSwNCi0gICAgezB4QTg4MCAgLAkweEE4REYgICwJMTE1LAkweEZGRkZ9LA0KLSAgICB7MHhBOEUwICAsCTB4QThGRiAgLAk5OTksCTB4RkZGRn0sDQotICAgIHsweEE5MDAgICwJMHhBOTJGICAsCTExNiwJMHhGRkZGfSwNCi0gICAgezB4QTkzMCAgLAkweEE5NUYgICwJMTE3LAkweEZGRkZ9LA0KLSAgICB7MHhBOTYwICAsCTB4QTlGRiAgLAk5OTksCTB4RkZGRn0sDQotICAgIHsweEFBMDAgICwJMHhBQTVGICAsCTExOCwJMHhGRkZGfSwNCi0gICAgezB4QUE2MCAgLAkweEFCRkYgICwJOTk5LAkweEZGRkZ9LA0KLSAgICB7MHhBQzAwICAsCTB4RDdBRiAgLAk1NiAsCTk0OSAgIH0sDQotICAgIHsweEQ3QjAgICwJMHhEN0ZGICAsCTk5OSwJMHhGRkZGfSwNCi0gICAgezB4RDgwMCAgLAkweERCN0YgICwJNTcgLAkweEZGRkZ9LA0KLSAgICB7MHhEQjgwICAsCTB4REJGRiAgLAk1NyAsCTB4RkZGRn0sDQotICAgIHsweERDMDAgICwJMHhERkZGICAsCTU3ICwJMHhGRkZGfSwNCi0gICAgezB4RTAwMCAgLAkweEU4MTQgICwJNjAgLAkweEZGRkZ9LA0KLSAgICB7MHhFODE1ICAsCTB4RTg2NCAgLAk2MCAsCTkzNiAgIH0sDQotICAgIHsweEU4NjUgICwJMHhGOEZGICAsCTYwICwJMHhGRkZGfSwNCi0gICAgezB4RjkwMCAgLAkweEZBMEIgICwJNjEgLAk5NDkgICB9LA0KLSAgICB7MHhGQTBDICAsCTB4RkEwRCAgLAk2MSAsCTkzNiAgIH0sDQotICAgIHsweEZBMEUgICwJMHhGQTJEICAsCTYxICwJOTMyICAgfSwNCi0gICAgezB4RkEyRSAgLAkweEZBRkYgICwJNjEgLAkweEZGRkZ9LA0KLSAgICB7MHhGQjAwICAsCTB4RkI0RiAgLAk2MiAsCTB4RkZGRn0sDQotICAgIHsweEZCNTAgICwJMHhGREZGICAsCTYzICwJMTI1NiAgfSwNCi0gICAgezB4RkUwMCAgLAkweEZFMEYgICwJOTEgLAkweEZGRkZ9LA0KLSAgICB7MHhGRTEwICAsCTB4RkUxRiAgLAk2NSAsCTB4RkZGRn0sDQotICAgIHsweEZFMjAgICwJMHhGRTJGICAsCTY0ICwJMHhGRkZGfSwNCi0gICAgezB4RkUzMCAgLAkweEZFNEYgICwJNjUgLAkweEZGRkZ9LA0KLSAgICB7MHhGRTUwICAsCTB4RkU2RiAgLAk2NiAsCTB4RkZGRn0sDQotICAgIHsweEZFNzAgICwJMHhGRUZGICAsCTY3ICwJMTI1NiAgfSwNCi0gICAgezB4RkYwMCAgLAkweEZGNUYgICwJNjggLAk5MzYgICB9LA0KLSAgICB7MHhGRjYwICAsCTB4RkY5RiAgLAk2OCAsCTkzMiAgIH0sDQotICAgIHsweEZGQTAgICwJMHhGRkVGICAsCTY4ICwJMHhGRkZGfSwNCisgICAgezB4MDAwMCwgMHgwMDdGLCAwLCAxMjUyfSwgICAgIHsweDAwODAsIDB4MDBGRiwgMSwgMTI1Mn0sDQorICAgIHsweDAxMDAsIDB4MDE3RiwgMiwgMTI1MH0sICAgICB7MHgwMTgwLCAweDAyNEYsIDMsIDEyNTB9LA0KKyAgICB7MHgwMjUwLCAweDAyQUYsIDQsIDB4RkZGRn0sICAgezB4MDJCMCwgMHgwMkZGLCA1LCAweEZGRkZ9LA0KKyAgICB7MHgwMzAwLCAweDAzNkYsIDYsIDB4RkZGRn0sICAgezB4MDM3MCwgMHgwM0ZGLCA3LCAxMjUzfSwNCisgICAgezB4MDQwMCwgMHgwNEZGLCA5LCAxMjUxfSwgICAgIHsweDA1MDAsIDB4MDUyRiwgOSwgMHhGRkZGfSwNCisgICAgezB4MDUzMCwgMHgwNThGLCAxMCwgMHhGRkZGfSwgIHsweDA1OTAsIDB4MDVGRiwgMTEsIDEyNTV9LA0KKyAgICB7MHgwNjAwLCAweDA2RkYsIDEzLCAxMjU2fSwgICAgezB4MDcwMCwgMHgwNzRGLCA3MSwgMHhGRkZGfSwNCisgICAgezB4MDc1MCwgMHgwNzdGLCAxMywgMHhGRkZGfSwgIHsweDA3ODAsIDB4MDdCRiwgNzIsIDB4RkZGRn0sDQorICAgIHsweDA3QzAsIDB4MDdGRiwgMTQsIDB4RkZGRn0sICB7MHgwODAwLCAweDA4RkYsIDk5OSwgMHhGRkZGfSwNCisgICAgezB4MDkwMCwgMHgwOTdGLCAxNSwgMHhGRkZGfSwgIHsweDA5ODAsIDB4MDlGRiwgMTYsIDB4RkZGRn0sDQorICAgIHsweDBBMDAsIDB4MEE3RiwgMTcsIDB4RkZGRn0sICB7MHgwQTgwLCAweDBBRkYsIDE4LCAweEZGRkZ9LA0KKyAgICB7MHgwQjAwLCAweDBCN0YsIDE5LCAweEZGRkZ9LCAgezB4MEI4MCwgMHgwQkZGLCAyMCwgMHhGRkZGfSwNCisgICAgezB4MEMwMCwgMHgwQzdGLCAyMSwgMHhGRkZGfSwgIHsweDBDODAsIDB4MENGRiwgMjIsIDB4RkZGRn0sDQorICAgIHsweDBEMDAsIDB4MEQ3RiwgMjMsIDB4RkZGRn0sICB7MHgwRDgwLCAweDBERkYsIDczLCAweEZGRkZ9LA0KKyAgICB7MHgwRTAwLCAweDBFN0YsIDI0LCA4NzR9LCAgICAgezB4MEU4MCwgMHgwRUZGLCAyNSwgMHhGRkZGfSwNCisgICAgezB4MEYwMCwgMHgwRkZGLCA3MCwgMHhGRkZGfSwgIHsweDEwMDAsIDB4MTA5RiwgNzQsIDB4RkZGRn0sDQorICAgIHsweDEwQTAsIDB4MTBGRiwgMjYsIDB4RkZGRn0sICB7MHgxMTAwLCAweDExRkYsIDI4LCAweEZGRkZ9LA0KKyAgICB7MHgxMjAwLCAweDEzN0YsIDc1LCAweEZGRkZ9LCAgezB4MTM4MCwgMHgxMzlGLCA3NSwgMHhGRkZGfSwNCisgICAgezB4MTNBMCwgMHgxM0ZGLCA3NiwgMHhGRkZGfSwgIHsweDE0MDAsIDB4MTY3RiwgNzcsIDB4RkZGRn0sDQorICAgIHsweDE2ODAsIDB4MTY5RiwgNzgsIDB4RkZGRn0sICB7MHgxNkEwLCAweDE2RkYsIDc5LCAweEZGRkZ9LA0KKyAgICB7MHgxNzAwLCAweDE3MUYsIDg0LCAweEZGRkZ9LCAgezB4MTcyMCwgMHgxNzNGLCA4NCwgMHhGRkZGfSwNCisgICAgezB4MTc0MCwgMHgxNzVGLCA4NCwgMHhGRkZGfSwgIHsweDE3NjAsIDB4MTc3RiwgODQsIDB4RkZGRn0sDQorICAgIHsweDE3ODAsIDB4MTdGRiwgODAsIDB4RkZGRn0sICB7MHgxODAwLCAweDE4QUYsIDgxLCAweEZGRkZ9LA0KKyAgICB7MHgxOEIwLCAweDE4RkYsIDk5OSwgMHhGRkZGfSwgezB4MTkwMCwgMHgxOTRGLCA5MywgMHhGRkZGfSwNCisgICAgezB4MTk1MCwgMHgxOTdGLCA5NCwgMHhGRkZGfSwgIHsweDE5ODAsIDB4MTlERiwgOTUsIDB4RkZGRn0sDQorICAgIHsweDE5RTAsIDB4MTlGRiwgODAsIDB4RkZGRn0sICB7MHgxQTAwLCAweDFBMUYsIDk2LCAweEZGRkZ9LA0KKyAgICB7MHgxQTIwLCAweDFBRkYsIDk5OSwgMHhGRkZGfSwgezB4MUIwMCwgMHgxQjdGLCAyNywgMHhGRkZGfSwNCisgICAgezB4MUI4MCwgMHgxQkJGLCAxMTIsIDB4RkZGRn0sIHsweDFCQzAsIDB4MUJGRiwgOTk5LCAweEZGRkZ9LA0KKyAgICB7MHgxQzAwLCAweDFDNEYsIDExMywgMHhGRkZGfSwgezB4MUM1MCwgMHgxQzdGLCAxMTQsIDB4RkZGRn0sDQorICAgIHsweDFDODAsIDB4MUNGRiwgOTk5LCAweEZGRkZ9LCB7MHgxRDAwLCAweDFEN0YsIDQsIDB4RkZGRn0sDQorICAgIHsweDFEODAsIDB4MURCRiwgNCwgMHhGRkZGfSwgICB7MHgxREMwLCAweDFERkYsIDYsIDB4RkZGRn0sDQorICAgIHsweDFFMDAsIDB4MUVGRiwgMjksIDB4RkZGRn0sICB7MHgxRjAwLCAweDFGRkYsIDMwLCAweEZGRkZ9LA0KKyAgICB7MHgyMDAwLCAweDIwNkYsIDMxLCAweEZGRkZ9LCAgezB4MjA3MCwgMHgyMDlGLCAzMiwgMHhGRkZGfSwNCisgICAgezB4MjBBMCwgMHgyMENGLCAzMywgMHhGRkZGfSwgIHsweDIwRDAsIDB4MjBGRiwgMzQsIDB4RkZGRn0sDQorICAgIHsweDIxMDAsIDB4MjE0RiwgMzUsIDB4RkZGRn0sICB7MHgyMTUwLCAweDIxNUYsIDM2LCAweEZGRkZ9LA0KKyAgICB7MHgyMTYwLCAweDIxNkIsIDM2LCA5MzZ9LCAgICAgezB4MjE2QywgMHgyMTZGLCAzNiwgMHhGRkZGfSwNCisgICAgezB4MjE3MCwgMHgyMTc5LCAzNiwgOTM2fSwgICAgIHsweDIxN0EsIDB4MjE4RiwgMzYsIDB4RkZGRn0sDQorICAgIHsweDIxOTAsIDB4MjE5OSwgMzcsIDk0OX0sICAgICB7MHgyMTlBLCAweDIxRkYsIDM3LCAweEZGRkZ9LA0KKyAgICB7MHgyMjAwLCAweDIyRkYsIDM4LCAweEZGRkZ9LCAgezB4MjMwMCwgMHgyM0ZGLCAzOSwgMHhGRkZGfSwNCisgICAgezB4MjQwMCwgMHgyNDNGLCA0MCwgMHhGRkZGfSwgIHsweDI0NDAsIDB4MjQ1RiwgNDEsIDB4RkZGRn0sDQorICAgIHsweDI0NjAsIDB4MjQ3MywgNDIsIDkzMn0sICAgICB7MHgyNDc0LCAweDI0OUIsIDQyLCA5MzZ9LA0KKyAgICB7MHgyNDlDLCAweDI0RTksIDQyLCA5NDl9LCAgICAgezB4MjRFQSwgMHgyNEZGLCA0MiwgMHhGRkZGfSwNCisgICAgezB4MjUwMCwgMHgyNTczLCA0MywgOTM2fSwgICAgIHsweDI1NzQsIDB4MjU3RiwgNDMsIDB4RkZGRn0sDQorICAgIHsweDI1ODAsIDB4MjU4MCwgNDQsIDB4RkZGRn0sICB7MHgyNTgxLCAweDI1OEYsIDQ0LCA5MzZ9LA0KKyAgICB7MHgyNTkwLCAweDI1OUYsIDQ0LCAweEZGRkZ9LCAgezB4MjVBMCwgMHgyNUZGLCA0NSwgMHhGRkZGfSwNCisgICAgezB4MjYwMCwgMHgyNkZGLCA0NiwgMHhGRkZGfSwgIHsweDI3MDAsIDB4MjdCRiwgNDcsIDB4RkZGRn0sDQorICAgIHsweDI3QzAsIDB4MjdFRiwgMzgsIDB4RkZGRn0sICB7MHgyN0YwLCAweDI3RkYsIDM3LCAweEZGRkZ9LA0KKyAgICB7MHgyODAwLCAweDI4RkYsIDgyLCAweEZGRkZ9LCAgezB4MjkwMCwgMHgyOTdGLCAzNywgMHhGRkZGfSwNCisgICAgezB4Mjk4MCwgMHgyOUZGLCAzOCwgMHhGRkZGfSwgIHsweDJBMDAsIDB4MkFGRiwgMzgsIDB4RkZGRn0sDQorICAgIHsweDJCMDAsIDB4MkJGRiwgMzcsIDB4RkZGRn0sICB7MHgyQzAwLCAweDJDNUYsIDk3LCAweEZGRkZ9LA0KKyAgICB7MHgyQzYwLCAweDJDN0YsIDI5LCAweEZGRkZ9LCAgezB4MkM4MCwgMHgyQ0ZGLCA4LCAweEZGRkZ9LA0KKyAgICB7MHgyRDAwLCAweDJEMkYsIDI2LCAweEZGRkZ9LCAgezB4MkQzMCwgMHgyRDdGLCA5OCwgMHhGRkZGfSwNCisgICAgezB4MkQ4MCwgMHgyRERGLCA3NSwgMHhGRkZGfSwgIHsweDJERTAsIDB4MkRGRiwgOSwgMHhGRkZGfSwNCisgICAgezB4MkUwMCwgMHgyRTdGLCAzMSwgMHhGRkZGfSwgIHsweDJFODAsIDB4MkVGRiwgNTksIDB4RkZGRn0sDQorICAgIHsweDJGMDAsIDB4MkZERiwgNTksIDB4RkZGRn0sICB7MHgyRkUwLCAweDJGRUYsIDk5OSwgMHhGRkZGfSwNCisgICAgezB4MkZGMCwgMHgyRkZGLCA1OSwgMHhGRkZGfSwgIHsweDMwMDAsIDB4MzAzRiwgNDgsIDB4RkZGRn0sDQorICAgIHsweDMwNDAsIDB4MzA5RiwgNDksIDkzMn0sICAgICB7MHgzMEEwLCAweDMwRkYsIDUwLCA5MzJ9LA0KKyAgICB7MHgzMTAwLCAweDMxMjksIDUxLCA5MzZ9LCAgICAgezB4MzEyQSwgMHgzMTJGLCA1MSwgMHhGRkZGfSwNCisgICAgezB4MzEzMCwgMHgzMThGLCA1MiwgOTQ5fSwgICAgIHsweDMxOTAsIDB4MzE5RiwgNTksIDB4RkZGRn0sDQorICAgIHsweDMxQTAsIDB4MzFCRiwgNTEsIDB4RkZGRn0sICB7MHgzMUMwLCAweDMxRUYsIDYxLCAweEZGRkZ9LA0KKyAgICB7MHgzMUYwLCAweDMxRkYsIDUwLCAweEZGRkZ9LCAgezB4MzIwMCwgMHgzMjFDLCA1NCwgOTQ5fSwNCisgICAgezB4MzIxRCwgMHgzMjVGLCA1NCwgMHhGRkZGfSwgIHsweDMyNjAsIDB4MzI3RiwgNTQsIDk0OX0sDQorICAgIHsweDMyODAsIDB4MzJGRiwgNTQsIDB4RkZGRn0sICB7MHgzMzAwLCAweDMzODcsIDU1LCAweEZGRkZ9LA0KKyAgICB7MHgzMzg4LCAweDMzRDAsIDU1LCA5NDl9LCAgICAgezB4MzNEMSwgMHgzM0ZGLCA1NSwgMHhGRkZGfSwNCisgICAgezB4MzQwMCwgMHg0REJGLCA1OSwgMHhGRkZGfSwgIHsweDREQzAsIDB4NERGRiwgOTksIDB4RkZGRn0sDQorICAgIHsweDRFMDAsIDB4OUZBNSwgNTksIDkzNn0sICAgICB7MHg5RkE2LCAweDlGRkYsIDU5LCAweEZGRkZ9LA0KKyAgICB7MHhBMDAwLCAweEE0OEYsIDgzLCAweEZGRkZ9LCAgezB4QTQ5MCwgMHhBNENGLCA4MywgMHhGRkZGfSwNCisgICAgezB4QTREMCwgMHhBNEZGLCA5OTksIDB4RkZGRn0sIHsweEE1MDAsIDB4QTYzRiwgMTIsIDB4RkZGRn0sDQorICAgIHsweEE2NDAsIDB4QTY5RiwgOSwgMHhGRkZGfSwgICB7MHhBNkEwLCAweEE2RkYsIDk5OSwgMHhGRkZGfSwNCisgICAgezB4QTcwMCwgMHhBNzFGLCA1LCAweEZGRkZ9LCAgIHsweEE3MjAsIDB4QTdGRiwgMjksIDB4RkZGRn0sDQorICAgIHsweEE4MDAsIDB4QTgyRiwgMTAwLCAweEZGRkZ9LCB7MHhBODMwLCAweEE4RkYsIDk5OSwgMHhGRkZGfSwNCisgICAgezB4QTg0MCwgMHhBODdGLCA1MywgMHhGRkZGfSwgIHsweEE4ODAsIDB4QThERiwgMTE1LCAweEZGRkZ9LA0KKyAgICB7MHhBOEUwLCAweEE4RkYsIDk5OSwgMHhGRkZGfSwgezB4QTkwMCwgMHhBOTJGLCAxMTYsIDB4RkZGRn0sDQorICAgIHsweEE5MzAsIDB4QTk1RiwgMTE3LCAweEZGRkZ9LCB7MHhBOTYwLCAweEE5RkYsIDk5OSwgMHhGRkZGfSwNCisgICAgezB4QUEwMCwgMHhBQTVGLCAxMTgsIDB4RkZGRn0sIHsweEFBNjAsIDB4QUJGRiwgOTk5LCAweEZGRkZ9LA0KKyAgICB7MHhBQzAwLCAweEQ3QUYsIDU2LCA5NDl9LCAgICAgezB4RDdCMCwgMHhEN0ZGLCA5OTksIDB4RkZGRn0sDQorICAgIHsweEQ4MDAsIDB4REI3RiwgNTcsIDB4RkZGRn0sICB7MHhEQjgwLCAweERCRkYsIDU3LCAweEZGRkZ9LA0KKyAgICB7MHhEQzAwLCAweERGRkYsIDU3LCAweEZGRkZ9LCAgezB4RTAwMCwgMHhFODE0LCA2MCwgMHhGRkZGfSwNCisgICAgezB4RTgxNSwgMHhFODY0LCA2MCwgOTM2fSwgICAgIHsweEU4NjUsIDB4RjhGRiwgNjAsIDB4RkZGRn0sDQorICAgIHsweEY5MDAsIDB4RkEwQiwgNjEsIDk0OX0sICAgICB7MHhGQTBDLCAweEZBMEQsIDYxLCA5MzZ9LA0KKyAgICB7MHhGQTBFLCAweEZBMkQsIDYxLCA5MzJ9LCAgICAgezB4RkEyRSwgMHhGQUZGLCA2MSwgMHhGRkZGfSwNCisgICAgezB4RkIwMCwgMHhGQjRGLCA2MiwgMHhGRkZGfSwgIHsweEZCNTAsIDB4RkRGRiwgNjMsIDEyNTZ9LA0KKyAgICB7MHhGRTAwLCAweEZFMEYsIDkxLCAweEZGRkZ9LCAgezB4RkUxMCwgMHhGRTFGLCA2NSwgMHhGRkZGfSwNCisgICAgezB4RkUyMCwgMHhGRTJGLCA2NCwgMHhGRkZGfSwgIHsweEZFMzAsIDB4RkU0RiwgNjUsIDB4RkZGRn0sDQorICAgIHsweEZFNTAsIDB4RkU2RiwgNjYsIDB4RkZGRn0sICB7MHhGRTcwLCAweEZFRkYsIDY3LCAxMjU2fSwNCisgICAgezB4RkYwMCwgMHhGRjVGLCA2OCwgOTM2fSwgICAgIHsweEZGNjAsIDB4RkY5RiwgNjgsIDkzMn0sDQorICAgIHsweEZGQTAsIDB4RkZFRiwgNjgsIDB4RkZGRn0sDQogfTsNCi1GR0FTX0xQQ0ZPTlRVU0IgRkdBU19HZXRVbmljb2RlQml0RmllbGQoRlhfV0NIQVIgd1VuaWNvZGUpDQotew0KLSAgICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19GWEdkaUZvbnRVU0JUYWJsZSkgLyBzaXplb2YoRkdBU19GT05UVVNCKSAtIDE7DQotICAgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KLSAgICBpbnQzMl90IGlTdGFydCA9IDAsIGlNaWQ7DQotICAgIGRvIHsNCi0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgY29uc3QgRkdBU19GT05UVVNCICZ1c2IgPSBnX0ZYR2RpRm9udFVTQlRhYmxlW2lNaWRdOw0KLSAgICAgICAgaWYgKHdVbmljb2RlIDwgdXNiLndTdGFydFVuaWNvZGUpIHsNCi0gICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQotICAgICAgICB9IGVsc2UgaWYgKHdVbmljb2RlID4gdXNiLndFbmRVbmljb2RlKSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiAmdXNiOw0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQotICAgIHJldHVybiBOVUxMOw0KK0ZHQVNfTFBDRk9OVFVTQiBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZChGWF9XQ0hBUiB3VW5pY29kZSkgew0KKyAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfRlhHZGlGb250VVNCVGFibGUpIC8gc2l6ZW9mKEZHQVNfRk9OVFVTQikgLSAxOw0KKyAgRlhTWVNfYXNzZXJ0KGlFbmQgPj0gMCk7DQorICBpbnQzMl90IGlTdGFydCA9IDAsIGlNaWQ7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBjb25zdCBGR0FTX0ZPTlRVU0ImIHVzYiA9IGdfRlhHZGlGb250VVNCVGFibGVbaU1pZF07DQorICAgIGlmICh3VW5pY29kZSA8IHVzYi53U3RhcnRVbmljb2RlKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2UgaWYgKHdVbmljb2RlID4gdXNiLndFbmRVbmljb2RlKSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgcmV0dXJuICZ1c2I7DQorICAgIH0NCisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgIHJldHVybiBOVUxMOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZm9udHV0aWxzLmggYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZm9udHV0aWxzLmgKaW5kZXggMmYxM2U3ZC4uMzhmZjU3NiAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2ZvbnR1dGlscy5oCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9mb250dXRpbHMuaApAQCAtNywxMyArNywxNSBAQAogI2lmbmRlZiBfRkdBU19GT05UVVRJTF9IXw0KICNkZWZpbmUgX0ZHQVNfRk9OVFVUSUxfSF8NCiB0eXBlZGVmIHN0cnVjdCBfRkdBU19GT05UVVNCIHsNCi0gICAgRlhfV0NIQVIJd1N0YXJ0VW5pY29kZTsNCi0gICAgRlhfV0NIQVIJd0VuZFVuaWNvZGU7DQotICAgIEZYX1dPUkQJCXdCaXRGaWVsZDsNCi0gICAgRlhfV09SRAkJd0NvZGVQYWdlOw0KLX0gRkdBU19GT05UVVNCLCAqIEZHQVNfTFBGT05UVVNCOw0KLXR5cGVkZWYgRkdBU19GT05UVVNCIGNvbnN0ICogRkdBU19MUENGT05UVVNCOw0KKyAgRlhfV0NIQVIgd1N0YXJ0VW5pY29kZTsNCisgIEZYX1dDSEFSIHdFbmRVbmljb2RlOw0KKyAgRlhfV09SRCB3Qml0RmllbGQ7DQorICBGWF9XT1JEIHdDb2RlUGFnZTsNCit9IEZHQVNfRk9OVFVTQiwgKkZHQVNfTFBGT05UVVNCOw0KK3R5cGVkZWYgRkdBU19GT05UVVNCIGNvbnN0KiBGR0FTX0xQQ0ZPTlRVU0I7DQogRlhfRFdPUkQgRkdBU19HZXRGb250SGFzaENvZGUoRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcyk7DQotRlhfRFdPUkQgRkdBU19HZXRGb250RmFtaWx5SGFzaChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSk7DQorRlhfRFdPUkQgRkdBU19HZXRGb250RmFtaWx5SGFzaChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKTsNCiBGR0FTX0xQQ0ZPTlRVU0IgRkdBU19HZXRVbmljb2RlQml0RmllbGQoRlhfV0NIQVIgd1VuaWNvZGUpOw0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZGlmb250LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZGlmb250LmNwcAppbmRleCA3MjlhZjQwLi4xNGJkMjRlIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2RpZm9udC5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dkaWZvbnQuY3BwCkBAIC04LDUyNSArOCw1MzkgQEAKICNpbmNsdWRlICJmeF9nZGlmb250LmgiDQogI2luY2x1ZGUgImZ4X3N0ZGZvbnRtZ3IuaCINCiAjaWZkZWYgX0ZYUExVUw0KLSNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KLUNGWF9HZGlGb250Q2FjaGU6OkNGWF9HZGlGb250Q2FjaGUoKQ0KLSAgICA6IG1fR2x5cGhNYXAoMTI4KQ0KLXsNCi19DQotQ0ZYX0dkaUZvbnRDYWNoZTo6fkNGWF9HZGlGb250Q2FjaGUoKQ0KLXsNCi0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9HbHlwaE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIGludDMyX3QgaUdseXBoOw0KLSAgICBGWF9MUEdESUdPQ0FDSEUgcEdseXBoOw0KLSAgICB3aGlsZSAocG9zICE9IE5VTEwpIHsNCi0gICAgICAgIHBHbHlwaCA9IE5VTEw7DQotICAgICAgICBtX0dseXBoTWFwLkdldE5leHRBc3NvYyhwb3MsICh2b2lkKiYpaUdseXBoLCAodm9pZComKXBHbHlwaCk7DQotICAgICAgICBpZiAocEdseXBoICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBGREVfRnJlZShwR2x5cGgtPnBPdXRsaW5lKTsNCi0gICAgICAgICAgICBGREVfRnJlZShwR2x5cGgpOw0KLSAgICAgICAgfQ0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IFwNCisgICAgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQorQ0ZYX0dkaUZvbnRDYWNoZTo6Q0ZYX0dkaUZvbnRDYWNoZSgpIDogbV9HbHlwaE1hcCgxMjgpIHt9DQorQ0ZYX0dkaUZvbnRDYWNoZTo6fkNGWF9HZGlGb250Q2FjaGUoKSB7DQorICBGWF9QT1NJVElPTiBwb3MgPSBtX0dseXBoTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIGludDMyX3QgaUdseXBoOw0KKyAgRlhfTFBHRElHT0NBQ0hFIHBHbHlwaDsNCisgIHdoaWxlIChwb3MgIT0gTlVMTCkgew0KKyAgICBwR2x5cGggPSBOVUxMOw0KKyAgICBtX0dseXBoTWFwLkdldE5leHRBc3NvYyhwb3MsICh2b2lkKiYpaUdseXBoLCAodm9pZComKXBHbHlwaCk7DQorICAgIGlmIChwR2x5cGggIT0gTlVMTCkgew0KKyAgICAgIEZERV9GcmVlKHBHbHlwaC0+cE91dGxpbmUpOw0KKyAgICAgIEZERV9GcmVlKHBHbHlwaCk7DQogICAgIH0NCi0gICAgbV9HbHlwaE1hcC5SZW1vdmVBbGwoKTsNCisgIH0NCisgIG1fR2x5cGhNYXAuUmVtb3ZlQWxsKCk7DQogfQ0KLXZvaWQgQ0ZYX0dkaUZvbnRDYWNoZTo6U2V0Q2FjaGVkR2x5cGhPdXRsaW5lKEZYX0RXT1JEIGR3R2x5cGgsIGNvbnN0IEdMWVBITUVUUklDUyAmZ20sIHVpbnQ4X3QqIHBPdXRsaW5lKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBPdXRsaW5lICE9IE5VTEwpOw0KLSAgICBGWF9MUEdESUdPQ0FDSEUgcEdseXBoID0gKEZYX0xQR0RJR09DQUNIRSlGREVfQWxsb2Moc2l6ZW9mKEZYX0dESUdPQ0FDSEUpKTsNCi0gICAgcEdseXBoLT5nbSA9IGdtOw0KLSAgICBwR2x5cGgtPnBPdXRsaW5lID0gcE91dGxpbmU7DQotICAgIG1fR2x5cGhNYXAuU2V0QXQoKHZvaWQqKWR3R2x5cGgsICh2b2lkKilwR2x5cGgpOw0KK3ZvaWQgQ0ZYX0dkaUZvbnRDYWNoZTo6U2V0Q2FjaGVkR2x5cGhPdXRsaW5lKEZYX0RXT1JEIGR3R2x5cGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xZUEhNRVRSSUNTJiBnbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwT3V0bGluZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBPdXRsaW5lICE9IE5VTEwpOw0KKyAgRlhfTFBHRElHT0NBQ0hFIHBHbHlwaCA9IChGWF9MUEdESUdPQ0FDSEUpRkRFX0FsbG9jKHNpemVvZihGWF9HRElHT0NBQ0hFKSk7DQorICBwR2x5cGgtPmdtID0gZ207DQorICBwR2x5cGgtPnBPdXRsaW5lID0gcE91dGxpbmU7DQorICBtX0dseXBoTWFwLlNldEF0KCh2b2lkKilkd0dseXBoLCAodm9pZCopcEdseXBoKTsNCiB9DQotRlhfTFBDR0RJR09DQUNIRSBDRlhfR2RpRm9udENhY2hlOjpHZXRDYWNoZWRHbHlwaE91dGxpbmUoRlhfRFdPUkQgZHdHbHlwaCkgY29uc3QNCi17DQotICAgIEZYX0xQQ0dESUdPQ0FDSEUgcEdseXBoID0gTlVMTDsNCi0gICAgaWYgKCFtX0dseXBoTWFwLkxvb2t1cCgodm9pZCopZHdHbHlwaCwgKHZvaWQqJilwR2x5cGgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIHBHbHlwaDsNCitGWF9MUENHRElHT0NBQ0hFIENGWF9HZGlGb250Q2FjaGU6OkdldENhY2hlZEdseXBoT3V0bGluZSgNCisgICAgRlhfRFdPUkQgZHdHbHlwaCkgY29uc3Qgew0KKyAgRlhfTFBDR0RJR09DQUNIRSBwR2x5cGggPSBOVUxMOw0KKyAgaWYgKCFtX0dseXBoTWFwLkxvb2t1cCgodm9pZCopZHdHbHlwaCwgKHZvaWQqJilwR2x5cGgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBwR2x5cGg7DQogfQ0KLUlGWF9Gb250KiBJRlhfRm9udDo6TG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UsIElGWF9Gb250TWdyICpwRm9udE1ncikNCi17DQotICAgIENGWF9HZGlGb250ICpwRm9udCA9IEZYX05FVyBDRlhfR2RpRm9udChwRm9udE1ncik7DQotICAgIGlmICghcEZvbnQtPkxvYWRGb250KHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKSkgew0KLSAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBwRm9udDsNCi19DQotSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgsIElGWF9Gb250TWdyICpwRm9udE1ncikNCi17DQotICAgIENGWF9HZGlGb250ICpwRm9udCA9IEZYX05FVyBDRlhfR2RpRm9udChwRm9udE1ncik7DQotICAgIGlmICghcEZvbnQtPkxvYWRGb250KHBCdWZmZXIsIGlMZW5ndGgpKSB7DQotICAgICAgICBwRm9udC0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHBGb250Ow0KLX0NCi1JRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSwgSUZYX0ZvbnRNZ3IgKnBGb250TWdyKQ0KLXsNCi0gICAgQ0ZYX0dkaUZvbnQgKnBGb250ID0gRlhfTkVXIENGWF9HZGlGb250KHBGb250TWdyKTsNCi0gICAgaWYgKCFwRm9udC0+TG9hZEZvbnQocHN6RmlsZU5hbWUpKSB7DQotICAgICAgICBwRm9udC0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHBGb250Ow0KLX0NCi1JRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KElGWF9TdHJlYW0gKnBGb250U3RyZWFtLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IsIEZYX0JPT0wgYlNhdmVTdHJlYW0gKQ0KLXsNCi0gICAgQ0ZYX0dkaUZvbnQgKnBGb250ID0gRlhfTkVXIENGWF9HZGlGb250KHBGb250TWdyKTsNCi0gICAgaWYgKCFwRm9udC0+TG9hZEZvbnQocEZvbnRTdHJlYW0pKSB7DQotICAgICAgICBwRm9udC0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHBGb250Ow0KLX0NCi1JRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KENGWF9Gb250ICpwRXh0Rm9udCwgSUZYX0ZvbnRNZ3IgKnBGb250TWdyKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCitJRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IpIHsNCisgIENGWF9HZGlGb250KiBwRm9udCA9IEZYX05FVyBDRlhfR2RpRm9udChwRm9udE1ncik7DQorICBpZiAoIXBGb250LT5Mb2FkRm9udChwc3pGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSkpIHsNCisgICAgcEZvbnQtPlJlbGVhc2UoKTsNCiAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcEZvbnQ7DQogfQ0KLSNkZWZpbmUgRlhfR0RJRk9OVF9GT05UQ0FDSEVTSVpFCTgNCi1DRlhfR2RpRm9udDo6Q0ZYX0dkaUZvbnQoSUZYX0ZvbnRNZ3IgKnBGb250TWdyKQ0KLSAgICA6IG1fcEZvbnRNZ3IocEZvbnRNZ3IpDQotICAgICwgbV9pUmVmQ291bnQoMSkNCi0gICAgLCBtX1dpZHRoQ2FjaGUoMTAyNCkNCi0gICAgLCBtX2hPbGRGb250KE5VTEwpDQotICAgICwgbV9oRm9udChOVUxMKQ0KLSAgICAsIG1faERDKE5VTEwpDQotICAgICwgbV93c0ZvbnRGaWxlTmFtZSgpDQotICAgICwgbV9Gb250RmFtaWxpZXMoKQ0KLSAgICAsIG1faFJlcyhOVUxMKQ0KLSAgICAsIG1fZHdTdHlsZXMoMCkNCi0gICAgLCBtX1N1YnN0Rm9udHMoKQ0KLSAgICAsIG1fRm9udE1hcHBlcigxNikNCi0gICAgLCBtX0ZvbnRDYWNoZShGWF9HRElGT05UX0ZPTlRDQUNIRVNJWkUpDQotew0KLSAgICBtX2hEQyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOw0KLSAgICBGWF9tZW1zZXQoJm1fTG9nRm9udCwgMCwgc2l6ZW9mKG1fTG9nRm9udCkpOw0KLSAgICBGWFNZU19hc3NlcnQobV9oREMgIT0gTlVMTCk7DQorSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyKSB7DQorICBDRlhfR2RpRm9udCogcEZvbnQgPSBGWF9ORVcgQ0ZYX0dkaUZvbnQocEZvbnRNZ3IpOw0KKyAgaWYgKCFwRm9udC0+TG9hZEZvbnQocEJ1ZmZlciwgaUxlbmd0aCkpIHsNCisgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcEZvbnQ7DQogfQ0KLUNGWF9HZGlGb250Ojp+Q0ZYX0dkaUZvbnQoKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX1N1YnN0Rm9udHMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIElGWF9Gb250ICpwRm9udCA9IChJRlhfRm9udCopbV9TdWJzdEZvbnRzW2ldOw0KLSAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCi0gICAgfQ0KLSAgICBtX1N1YnN0Rm9udHMuUmVtb3ZlQWxsKCk7DQotICAgIG1fRm9udE1hcHBlci5SZW1vdmVBbGwoKTsNCi0gICAgaWYgKG1faEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgOjpTZWxlY3RPYmplY3QobV9oREMsIG1faE9sZEZvbnQpOw0KLSAgICAgICAgOjpEZWxldGVPYmplY3QobV9oRm9udCk7DQotICAgIH0NCi0gICAgOjpEZWxldGVEQyhtX2hEQyk7DQotICAgIGlmIChtX2hSZXMgIT0gTlVMTCkgew0KLSAgICAgICAgaWYgKG1fd3NGb250RmlsZU5hbWUuR2V0TGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgOjpSZW1vdmVGb250UmVzb3VyY2VXKChjb25zdCBGWF9XQ0hBUiopbV93c0ZvbnRGaWxlTmFtZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIDo6UmVtb3ZlRm9udE1lbVJlc291cmNlRXgobV9oUmVzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX1dpZHRoQ2FjaGUuUmVtb3ZlQWxsKCk7DQotICAgIENsZWFyQ2FjaGUoKTsNCitJRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyKiBwRm9udE1ncikgew0KKyAgQ0ZYX0dkaUZvbnQqIHBGb250ID0gRlhfTkVXIENGWF9HZGlGb250KHBGb250TWdyKTsNCisgIGlmICghcEZvbnQtPkxvYWRGb250KHBzekZpbGVOYW1lKSkgew0KKyAgICBwRm9udC0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBwRm9udDsNCiB9DQotdm9pZCBDRlhfR2RpRm9udDo6Q2xlYXJDYWNoZSgpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fU3Vic3RGb250cy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgSUZYX0ZvbnQgKnBGb250ID0gKElGWF9Gb250KiltX1N1YnN0Rm9udHNbaV07DQotICAgICAgICAoKENGWF9HZGlGb250KilwRm9udCktPkNsZWFyQ2FjaGUoKTsNCi0gICAgfQ0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0ZvbnRDYWNoZS5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIEZYX0RXT1JEIGR3TUFUMjsNCi0gICAgQ0ZYX0dkaUZvbnRDYWNoZSAqcENhY2hlOw0KLSAgICB3aGlsZSAocG9zICE9IE5VTEwpIHsNCi0gICAgICAgIHBDYWNoZSA9IE5VTEw7DQotICAgICAgICBtX0ZvbnRDYWNoZS5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKWR3TUFUMiwgKHZvaWQqJilwQ2FjaGUpOw0KLSAgICAgICAgaWYgKHBDYWNoZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgZGVsZXRlIHBDYWNoZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX0ZvbnRDYWNoZS5SZW1vdmVBbGwoKTsNCitJRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KElGWF9TdHJlYW0qIHBGb250U3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVN0cmVhbSkgew0KKyAgQ0ZYX0dkaUZvbnQqIHBGb250ID0gRlhfTkVXIENGWF9HZGlGb250KHBGb250TWdyKTsNCisgIGlmICghcEZvbnQtPkxvYWRGb250KHBGb250U3RyZWFtKSkgew0KKyAgICBwRm9udC0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBwRm9udDsNCiB9DQotdm9pZCBDRlhfR2RpRm9udDo6UmVsZWFzZSgpDQotew0KLSAgICBpZiAoLS0gbV9pUmVmQ291bnQgPCAxKSB7DQotICAgICAgICBpZiAobV9wRm9udE1nciAhPSBOVUxMKSB7DQotICAgICAgICAgICAgbV9wRm9udE1nci0+UmVtb3ZlRm9udCh0aGlzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQorSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChDRlhfRm9udCogcEV4dEZvbnQsIElGWF9Gb250TWdyKiBwRm9udE1ncikgew0KKyAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgIHJldHVybiBOVUxMOw0KIH0NCi1JRlhfRm9udCogQ0ZYX0dkaUZvbnQ6OlJldGFpbigpDQotew0KLSAgICArKyBtX2lSZWZDb3VudDsNCi0gICAgcmV0dXJuIHRoaXM7DQorI2RlZmluZSBGWF9HRElGT05UX0ZPTlRDQUNIRVNJWkUgOA0KK0NGWF9HZGlGb250OjpDRlhfR2RpRm9udChJRlhfRm9udE1nciogcEZvbnRNZ3IpDQorICAgIDogbV9wRm9udE1ncihwRm9udE1nciksDQorICAgICAgbV9pUmVmQ291bnQoMSksDQorICAgICAgbV9XaWR0aENhY2hlKDEwMjQpLA0KKyAgICAgIG1faE9sZEZvbnQoTlVMTCksDQorICAgICAgbV9oRm9udChOVUxMKSwNCisgICAgICBtX2hEQyhOVUxMKSwNCisgICAgICBtX3dzRm9udEZpbGVOYW1lKCksDQorICAgICAgbV9Gb250RmFtaWxpZXMoKSwNCisgICAgICBtX2hSZXMoTlVMTCksDQorICAgICAgbV9kd1N0eWxlcygwKSwNCisgICAgICBtX1N1YnN0Rm9udHMoKSwNCisgICAgICBtX0ZvbnRNYXBwZXIoMTYpLA0KKyAgICAgIG1fRm9udENhY2hlKEZYX0dESUZPTlRfRk9OVENBQ0hFU0laRSkgew0KKyAgbV9oREMgPSA6OkNyZWF0ZUNvbXBhdGlibGVEQyhOVUxMKTsNCisgIEZYX21lbXNldCgmbV9Mb2dGb250LCAwLCBzaXplb2YobV9Mb2dGb250KSk7DQorICBGWFNZU19hc3NlcnQobV9oREMgIT0gTlVMTCk7DQogfQ0KLUZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgPT0gTlVMTCk7DQotICAgIExPR0ZPTlRXIGxmOw0KLSAgICBGWF9tZW1zZXQoJmxmLCAwLCBzaXplb2YobGYpKTsNCi0gICAgbGYubGZIZWlnaHQgPSAtMTAwMDsNCi0gICAgbGYubGZXZWlnaHQgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpID8gRldfQk9MRCA6IEZXX05PUk1BTDsNCi0gICAgbGYubGZJdGFsaWMgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgIT0gMDsNCi0gICAgbGYubGZQaXRjaEFuZEZhbWlseSA9IChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCkgPyBGSVhFRF9QSVRDSCA6IFZBUklBQkxFX1BJVENIOw0KLSAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1NlcmlmKSB7DQotICAgICAgICBsZi5sZlBpdGNoQW5kRmFtaWx5IHw9IEZGX1JPTUFOOw0KLSAgICB9DQotICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSB7DQotICAgICAgICBsZi5sZlBpdGNoQW5kRmFtaWx5IHw9IEZGX1NDUklQVDsNCi0gICAgfQ0KLSAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1N5bWJvbGljKSB7DQotICAgICAgICBsZi5sZkNoYXJTZXQgPSBTWU1CT0xfQ0hBUlNFVDsNCitDRlhfR2RpRm9udDo6fkNGWF9HZGlGb250KCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX1N1YnN0Rm9udHMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgSUZYX0ZvbnQqIHBGb250ID0gKElGWF9Gb250KiltX1N1YnN0Rm9udHNbaV07DQorICAgIHBGb250LT5SZWxlYXNlKCk7DQorICB9DQorICBtX1N1YnN0Rm9udHMuUmVtb3ZlQWxsKCk7DQorICBtX0ZvbnRNYXBwZXIuUmVtb3ZlQWxsKCk7DQorICBpZiAobV9oRm9udCAhPSBOVUxMKSB7DQorICAgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBtX2hPbGRGb250KTsNCisgICAgOjpEZWxldGVPYmplY3QobV9oRm9udCk7DQorICB9DQorICA6OkRlbGV0ZURDKG1faERDKTsNCisgIGlmIChtX2hSZXMgIT0gTlVMTCkgew0KKyAgICBpZiAobV93c0ZvbnRGaWxlTmFtZS5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgICA6OlJlbW92ZUZvbnRSZXNvdXJjZVcoKGNvbnN0IEZYX1dDSEFSKiltX3dzRm9udEZpbGVOYW1lKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIEZYX1dPUkQgd0NoYXJTZXQgPSBGWF9HZXRDaGFyc2V0RnJvbUNvZGVQYWdlKHdDb2RlUGFnZSk7DQotICAgICAgICBsZi5sZkNoYXJTZXQgPSB3Q2hhclNldCAhPSAweEZGRkYgPyAodWludDhfdCl3Q2hhclNldCA6IERFRkFVTFRfQ0hBUlNFVDsNCisgICAgICA6OlJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KG1faFJlcyk7DQogICAgIH0NCi0gICAgaWYgKHBzekZvbnRGYW1pbHkgPT0gTlVMTCkgew0KLSAgICAgICAgbGYubGZGYWNlTmFtZVswXSA9IEwnXDAnOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhTWVNfd2NzbmNweShsZi5sZkZhY2VOYW1lLCBwc3pGb250RmFtaWx5LCAzMSk7DQotICAgIH0NCi0gICAgcmV0dXJuIExvYWRGb250KGxmKTsNCisgIH0NCisgIG1fV2lkdGhDYWNoZS5SZW1vdmVBbGwoKTsNCisgIENsZWFyQ2FjaGUoKTsNCiB9DQotRlhfQk9PTCBDRlhfR2RpRm9udDo6TG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgPT0gTlVMTCAmJiBwQnVmZmVyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KLSAgICBHZGlwbHVzOjpQcml2YXRlRm9udENvbGxlY3Rpb24gcGZjOw0KLSAgICBpZiAocGZjLkFkZE1lbW9yeUZvbnQocEJ1ZmZlciwgaUxlbmd0aCkgIT0gR2RpcGx1czo6T2spIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCit2b2lkIENGWF9HZGlGb250OjpDbGVhckNhY2hlKCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX1N1YnN0Rm9udHMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgSUZYX0ZvbnQqIHBGb250ID0gKElGWF9Gb250KiltX1N1YnN0Rm9udHNbaV07DQorICAgICgoQ0ZYX0dkaUZvbnQqKXBGb250KS0+Q2xlYXJDYWNoZSgpOw0KKyAgfQ0KKyAgRlhfUE9TSVRJT04gcG9zID0gbV9Gb250Q2FjaGUuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgRlhfRFdPUkQgZHdNQVQyOw0KKyAgQ0ZYX0dkaUZvbnRDYWNoZSogcENhY2hlOw0KKyAgd2hpbGUgKHBvcyAhPSBOVUxMKSB7DQorICAgIHBDYWNoZSA9IE5VTEw7DQorICAgIG1fRm9udENhY2hlLkdldE5leHRBc3NvYyhwb3MsICh2b2lkKiYpZHdNQVQyLCAodm9pZComKXBDYWNoZSk7DQorICAgIGlmIChwQ2FjaGUgIT0gTlVMTCkgew0KKyAgICAgIGRlbGV0ZSBwQ2FjaGU7DQogICAgIH0NCi0gICAgaWYgKEdldEZvbnRGYW1pbGllcyhwZmMpIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3Q291bnQgPSAwOw0KLSAgICBtX2hSZXMgPSA6OkFkZEZvbnRNZW1SZXNvdXJjZUV4KCh2b2lkKilwQnVmZmVyLCBpTGVuZ3RoLCAwLCAmZHdDb3VudCk7DQotICAgIGlmIChtX2hSZXMgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRmFtaWx5ID0gbV9Gb250RmFtaWxpZXNbMF07DQotICAgIG1faEZvbnQgPSA6OkNyZWF0ZUZvbnRXKC0xMDAwLCAwLCAwLCAwLCBGV19OT1JNQUwsIEZBTFNFLCAwLCAwLCBERUZBVUxUX0NIQVJTRVQsIDAsIDAsIDAsIDAsIChjb25zdCBGWF9XQ0hBUiopd3NGYW1pbHkpOw0KLSAgICBpZiAobV9oRm9udCA9PSBOVUxMKSB7DQotICAgICAgICA6OlJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KG1faFJlcyk7DQotICAgICAgICBtX2hSZXMgPSBOVUxMOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIFJldHJpZXZlRm9udFN0eWxlcygpOw0KLSAgICBtX2hPbGRGb250ID0gOjpTZWxlY3RPYmplY3QobV9oREMsIG1faEZvbnQpOw0KLSAgICA6OkdldE91dGxpbmVUZXh0TWV0cmljc1cobV9oREMsIHNpemVvZihtX091dGxpbmVUTSksICZtX091dGxpbmVUTSk7DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgbV9Gb250Q2FjaGUuUmVtb3ZlQWxsKCk7DQogfQ0KLUZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX2hGb250ID09IE5VTEwgJiYgcHN6RmlsZU5hbWUgIT0gTlVMTCk7DQotICAgIEdkaXBsdXM6OlByaXZhdGVGb250Q29sbGVjdGlvbiBwZmM7DQotICAgIGlmIChwZmMuQWRkRm9udEZpbGUocHN6RmlsZU5hbWUpICE9IEdkaXBsdXM6Ok9rKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQordm9pZCBDRlhfR2RpRm9udDo6UmVsZWFzZSgpIHsNCisgIGlmICgtLW1faVJlZkNvdW50IDwgMSkgew0KKyAgICBpZiAobV9wRm9udE1nciAhPSBOVUxMKSB7DQorICAgICAgbV9wRm9udE1nci0+UmVtb3ZlRm9udCh0aGlzKTsNCiAgICAgfQ0KLSAgICBpZiAoR2V0Rm9udEZhbWlsaWVzKHBmYykgPCAxKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgbV93c0ZvbnRGaWxlTmFtZSA9IHBzekZpbGVOYW1lOw0KLSAgICBtX2hSZXMgPSAoSEFORExFKTo6QWRkRm9udFJlc291cmNlVyhwc3pGaWxlTmFtZSk7DQotICAgIGlmIChtX2hSZXMgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRmFtaWx5ID0gbV9Gb250RmFtaWxpZXNbMF07DQotICAgIG1faEZvbnQgPSA6OkNyZWF0ZUZvbnRXKC0xMDAwLCAwLCAwLCAwLCBGV19OT1JNQUwsIEZBTFNFLCAwLCAwLCBERUZBVUxUX0NIQVJTRVQsIDAsIDAsIDAsIDAsIChjb25zdCBGWF9XQ0hBUiopd3NGYW1pbHkpOw0KLSAgICBpZiAobV9oRm9udCA9PSBOVUxMKSB7DQotICAgICAgICA6OlJlbW92ZUZvbnRSZXNvdXJjZVcocHN6RmlsZU5hbWUpOw0KLSAgICAgICAgbV9oUmVzID0gTlVMTDsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBSZXRyaWV2ZUZvbnRTdHlsZXMoKTsNCi0gICAgOjpTZWxlY3RPYmplY3QobV9oREMsIG1faEZvbnQpOw0KLSAgICA6OkdldE91dGxpbmVUZXh0TWV0cmljc1cobV9oREMsIHNpemVvZihtX091dGxpbmVUTSksICZtX091dGxpbmVUTSk7DQotICAgIHJldHVybiBUUlVFOw0KKyAgICBkZWxldGUgdGhpczsNCisgIH0NCiB9DQotRlhfQk9PTCBDRlhfR2RpRm9udDo6TG9hZEZvbnQoSUZYX1N0cmVhbSAqcEZvbnRTdHJlYW0pDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9oRm9udCA9PSBOVUxMICYmIHBGb250U3RyZWFtICE9IE5VTEwpOw0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwRm9udFN0cmVhbS0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHVpbnQ4X3QqIHBCdWYgPSAodWludDhfdCopRkRFX0FsbG9jKGlMZW5ndGgpOw0KLSAgICBpZiAocEJ1ZiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaUxlbmd0aCA9IHBGb250U3RyZWFtLT5SZWFkRGF0YShwQnVmLCBpTGVuZ3RoKTsNCi0gICAgRlhfQk9PTCBiUmV0ID0gTG9hZEZvbnQocEJ1ZiwgaUxlbmd0aCk7DQotICAgIEZERV9GcmVlKHBCdWYpOw0KLSAgICByZXR1cm4gYlJldDsNCitJRlhfRm9udCogQ0ZYX0dkaUZvbnQ6OlJldGFpbigpIHsNCisgICsrbV9pUmVmQ291bnQ7DQorICByZXR1cm4gdGhpczsNCiB9DQotRlhfQk9PTCBDRlhfR2RpRm9udDo6TG9hZEZvbnQoY29uc3QgTE9HRk9OVFcgJmxmKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgPT0gTlVMTCk7DQotICAgIG1faEZvbnQgPSA6OkNyZWF0ZUZvbnRJbmRpcmVjdFcoKExQTE9HRk9OVFcpJmxmKTsNCi0gICAgaWYgKG1faEZvbnQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIFJldHJpZXZlRm9udFN0eWxlcygpOw0KLSAgICA6OlNlbGVjdE9iamVjdChtX2hEQywgbV9oRm9udCk7DQotICAgIDo6R2V0T3V0bGluZVRleHRNZXRyaWNzVyhtX2hEQywgc2l6ZW9mKG1fT3V0bGluZVRNKSwgJm1fT3V0bGluZVRNKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDRlhfR2RpRm9udDo6TG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBGWFNZU19hc3NlcnQobV9oRm9udCA9PSBOVUxMKTsNCisgIExPR0ZPTlRXIGxmOw0KKyAgRlhfbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKGxmKSk7DQorICBsZi5sZkhlaWdodCA9IC0xMDAwOw0KKyAgbGYubGZXZWlnaHQgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpID8gRldfQk9MRCA6IEZXX05PUk1BTDsNCisgIGxmLmxmSXRhbGljID0gKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMpICE9IDA7DQorICBsZi5sZlBpdGNoQW5kRmFtaWx5ID0NCisgICAgICAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2gpID8gRklYRURfUElUQ0ggOiBWQVJJQUJMRV9QSVRDSDsNCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2VyaWYpIHsNCisgICAgbGYubGZQaXRjaEFuZEZhbWlseSB8PSBGRl9ST01BTjsNCisgIH0NCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSB7DQorICAgIGxmLmxmUGl0Y2hBbmRGYW1pbHkgfD0gRkZfU0NSSVBUOw0KKyAgfQ0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYykgew0KKyAgICBsZi5sZkNoYXJTZXQgPSBTWU1CT0xfQ0hBUlNFVDsNCisgIH0gZWxzZSB7DQorICAgIEZYX1dPUkQgd0NoYXJTZXQgPSBGWF9HZXRDaGFyc2V0RnJvbUNvZGVQYWdlKHdDb2RlUGFnZSk7DQorICAgIGxmLmxmQ2hhclNldCA9IHdDaGFyU2V0ICE9IDB4RkZGRiA/ICh1aW50OF90KXdDaGFyU2V0IDogREVGQVVMVF9DSEFSU0VUOw0KKyAgfQ0KKyAgaWYgKHBzekZvbnRGYW1pbHkgPT0gTlVMTCkgew0KKyAgICBsZi5sZkZhY2VOYW1lWzBdID0gTCdcMCc7DQorICB9IGVsc2Ugew0KKyAgICBGWFNZU193Y3NuY3B5KGxmLmxmRmFjZU5hbWUsIHBzekZvbnRGYW1pbHksIDMxKTsNCisgIH0NCisgIHJldHVybiBMb2FkRm9udChsZik7DQogfQ0KLWludDMyX3QgQ0ZYX0dkaUZvbnQ6OkdldEZvbnRGYW1pbGllcyhHZGlwbHVzOjpGb250Q29sbGVjdGlvbiAmZmMpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IGZjLkdldEZhbWlseUNvdW50KCk7DQotICAgIGlmIChpQ291bnQgPCAxKSB7DQotICAgICAgICByZXR1cm4gaUNvdW50Ow0KLSAgICB9DQotICAgIEdkaXBsdXM6OkZvbnRGYW1pbHkgKnBGb250RmFtaWxpZXMgPSAoR2RpcGx1czo6Rm9udEZhbWlseSopRkRFX0FsbG9jKGlDb3VudCAqIHNpemVvZihHZGlwbHVzOjpGb250RmFtaWx5KSk7DQotICAgIGlmIChwRm9udEZhbWlsaWVzID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlGaW5kID0gMDsNCi0gICAgZmMuR2V0RmFtaWxpZXMoaUNvdW50LCBwRm9udEZhbWlsaWVzLCAmaUZpbmQpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRmFtaWx5TmFtZTsNCi0gICAgICAgIEZYX1dDSEFSKiBwTmFtZSA9IHdzRmFtaWx5TmFtZS5HZXRCdWZmZXIoTEZfRkFDRVNJWkUpOw0KLSAgICAgICAgcEZvbnRGYW1pbGllc1tpXS5HZXRGYW1pbHlOYW1lKHBOYW1lKTsNCi0gICAgICAgIHdzRmFtaWx5TmFtZS5SZWxlYXNlQnVmZmVyKCk7DQotICAgICAgICBtX0ZvbnRGYW1pbGllcy5BZGQod3NGYW1pbHlOYW1lKTsNCi0gICAgfQ0KLSAgICBGREVfRnJlZShwRm9udEZhbWlsaWVzKTsNCitGWF9CT09MIENGWF9HZGlGb250OjpMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChtX2hGb250ID09IE5VTEwgJiYgcEJ1ZmZlciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIEdkaXBsdXM6OlByaXZhdGVGb250Q29sbGVjdGlvbiBwZmM7DQorICBpZiAocGZjLkFkZE1lbW9yeUZvbnQocEJ1ZmZlciwgaUxlbmd0aCkgIT0gR2RpcGx1czo6T2spIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKEdldEZvbnRGYW1pbGllcyhwZmMpIDwgMSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9EV09SRCBkd0NvdW50ID0gMDsNCisgIG1faFJlcyA9IDo6QWRkRm9udE1lbVJlc291cmNlRXgoKHZvaWQqKXBCdWZmZXIsIGlMZW5ndGgsIDAsICZkd0NvdW50KTsNCisgIGlmIChtX2hSZXMgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0ZhbWlseSA9IG1fRm9udEZhbWlsaWVzWzBdOw0KKyAgbV9oRm9udCA9DQorICAgICAgOjpDcmVhdGVGb250VygtMTAwMCwgMCwgMCwgMCwgRldfTk9STUFMLCBGQUxTRSwgMCwgMCwgREVGQVVMVF9DSEFSU0VULCAwLA0KKyAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgKGNvbnN0IEZYX1dDSEFSKil3c0ZhbWlseSk7DQorICBpZiAobV9oRm9udCA9PSBOVUxMKSB7DQorICAgIDo6UmVtb3ZlRm9udE1lbVJlc291cmNlRXgobV9oUmVzKTsNCisgICAgbV9oUmVzID0gTlVMTDsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgUmV0cmlldmVGb250U3R5bGVzKCk7DQorICBtX2hPbGRGb250ID0gOjpTZWxlY3RPYmplY3QobV9oREMsIG1faEZvbnQpOw0KKyAgOjpHZXRPdXRsaW5lVGV4dE1ldHJpY3NXKG1faERDLCBzaXplb2YobV9PdXRsaW5lVE0pLCAmbV9PdXRsaW5lVE0pOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgPT0gTlVMTCAmJiBwc3pGaWxlTmFtZSAhPSBOVUxMKTsNCisgIEdkaXBsdXM6OlByaXZhdGVGb250Q29sbGVjdGlvbiBwZmM7DQorICBpZiAocGZjLkFkZEZvbnRGaWxlKHBzekZpbGVOYW1lKSAhPSBHZGlwbHVzOjpPaykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoR2V0Rm9udEZhbWlsaWVzKHBmYykgPCAxKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fd3NGb250RmlsZU5hbWUgPSBwc3pGaWxlTmFtZTsNCisgIG1faFJlcyA9IChIQU5ETEUpOjpBZGRGb250UmVzb3VyY2VXKHBzekZpbGVOYW1lKTsNCisgIGlmIChtX2hSZXMgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0ZhbWlseSA9IG1fRm9udEZhbWlsaWVzWzBdOw0KKyAgbV9oRm9udCA9DQorICAgICAgOjpDcmVhdGVGb250VygtMTAwMCwgMCwgMCwgMCwgRldfTk9STUFMLCBGQUxTRSwgMCwgMCwgREVGQVVMVF9DSEFSU0VULCAwLA0KKyAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgKGNvbnN0IEZYX1dDSEFSKil3c0ZhbWlseSk7DQorICBpZiAobV9oRm9udCA9PSBOVUxMKSB7DQorICAgIDo6UmVtb3ZlRm9udFJlc291cmNlVyhwc3pGaWxlTmFtZSk7DQorICAgIG1faFJlcyA9IE5VTEw7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFJldHJpZXZlRm9udFN0eWxlcygpOw0KKyAgOjpTZWxlY3RPYmplY3QobV9oREMsIG1faEZvbnQpOw0KKyAgOjpHZXRPdXRsaW5lVGV4dE1ldHJpY3NXKG1faERDLCBzaXplb2YobV9PdXRsaW5lVE0pLCAmbV9PdXRsaW5lVE0pOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkxvYWRGb250KElGWF9TdHJlYW0qIHBGb250U3RyZWFtKSB7DQorICBGWFNZU19hc3NlcnQobV9oRm9udCA9PSBOVUxMICYmIHBGb250U3RyZWFtICE9IE5VTEwpOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEZvbnRTdHJlYW0tPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPCAxKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHVpbnQ4X3QqIHBCdWYgPSAodWludDhfdCopRkRFX0FsbG9jKGlMZW5ndGgpOw0KKyAgaWYgKHBCdWYgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpTGVuZ3RoID0gcEZvbnRTdHJlYW0tPlJlYWREYXRhKHBCdWYsIGlMZW5ndGgpOw0KKyAgRlhfQk9PTCBiUmV0ID0gTG9hZEZvbnQocEJ1ZiwgaUxlbmd0aCk7DQorICBGREVfRnJlZShwQnVmKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENGWF9HZGlGb250OjpMb2FkRm9udChjb25zdCBMT0dGT05UVyYgbGYpIHsNCisgIEZYU1lTX2Fzc2VydChtX2hGb250ID09IE5VTEwpOw0KKyAgbV9oRm9udCA9IDo6Q3JlYXRlRm9udEluZGlyZWN0VygoTFBMT0dGT05UVykmbGYpOw0KKyAgaWYgKG1faEZvbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBSZXRyaWV2ZUZvbnRTdHlsZXMoKTsNCisgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBtX2hGb250KTsNCisgIDo6R2V0T3V0bGluZVRleHRNZXRyaWNzVyhtX2hEQywgc2l6ZW9mKG1fT3V0bGluZVRNKSwgJm1fT3V0bGluZVRNKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitpbnQzMl90IENGWF9HZGlGb250OjpHZXRGb250RmFtaWxpZXMoR2RpcGx1czo6Rm9udENvbGxlY3Rpb24mIGZjKSB7DQorICBpbnQzMl90IGlDb3VudCA9IGZjLkdldEZhbWlseUNvdW50KCk7DQorICBpZiAoaUNvdW50IDwgMSkgew0KICAgICByZXR1cm4gaUNvdW50Ow0KKyAgfQ0KKyAgR2RpcGx1czo6Rm9udEZhbWlseSogcEZvbnRGYW1pbGllcyA9DQorICAgICAgKEdkaXBsdXM6OkZvbnRGYW1pbHkqKUZERV9BbGxvYyhpQ291bnQgKiBzaXplb2YoR2RpcGx1czo6Rm9udEZhbWlseSkpOw0KKyAgaWYgKHBGb250RmFtaWxpZXMgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpbnQzMl90IGlGaW5kID0gMDsNCisgIGZjLkdldEZhbWlsaWVzKGlDb3VudCwgcEZvbnRGYW1pbGllcywgJmlGaW5kKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRmFtaWx5TmFtZTsNCisgICAgRlhfV0NIQVIqIHBOYW1lID0gd3NGYW1pbHlOYW1lLkdldEJ1ZmZlcihMRl9GQUNFU0laRSk7DQorICAgIHBGb250RmFtaWxpZXNbaV0uR2V0RmFtaWx5TmFtZShwTmFtZSk7DQorICAgIHdzRmFtaWx5TmFtZS5SZWxlYXNlQnVmZmVyKCk7DQorICAgIG1fRm9udEZhbWlsaWVzLkFkZCh3c0ZhbWlseU5hbWUpOw0KKyAgfQ0KKyAgRkRFX0ZyZWUocEZvbnRGYW1pbGllcyk7DQorICByZXR1cm4gaUNvdW50Ow0KIH0NCi12b2lkIENGWF9HZGlGb250OjpSZXRyaWV2ZUZvbnRTdHlsZXMoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgIT0gTlVMTCk7DQotICAgIEZYX21lbXNldCgmbV9Mb2dGb250LCAwLCBzaXplb2YobV9Mb2dGb250KSk7DQotICAgIDo6R2V0T2JqZWN0VyhtX2hGb250LCBzaXplb2YobV9Mb2dGb250KSwgJm1fTG9nRm9udCk7DQotICAgIG1fZHdTdHlsZXMgPSBGWF9HZXRHZGlGb250U3R5bGVzKG1fTG9nRm9udCk7DQordm9pZCBDRlhfR2RpRm9udDo6UmV0cmlldmVGb250U3R5bGVzKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgIT0gTlVMTCk7DQorICBGWF9tZW1zZXQoJm1fTG9nRm9udCwgMCwgc2l6ZW9mKG1fTG9nRm9udCkpOw0KKyAgOjpHZXRPYmplY3RXKG1faEZvbnQsIHNpemVvZihtX0xvZ0ZvbnQpLCAmbV9Mb2dGb250KTsNCisgIG1fZHdTdHlsZXMgPSBGWF9HZXRHZGlGb250U3R5bGVzKG1fTG9nRm9udCk7DQogfQ0KLXZvaWQgQ0ZYX0dkaUZvbnQ6OkdldEZhbWlseU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzRmFtaWx5KSBjb25zdA0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgIT0gTlVMTCk7DQotICAgIHdzRmFtaWx5ID0gbV9Mb2dGb250LmxmRmFjZU5hbWU7DQordm9pZCBDRlhfR2RpRm9udDo6R2V0RmFtaWx5TmFtZShDRlhfV2lkZVN0cmluZyYgd3NGYW1pbHkpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChtX2hGb250ICE9IE5VTEwpOw0KKyAgd3NGYW1pbHkgPSBtX0xvZ0ZvbnQubGZGYWNlTmFtZTsNCiB9DQotRlhfQk9PTCBDRlhfR2RpRm9udDo6R2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLCBpbnQzMl90ICZpV2lkdGgsIEZYX0JPT0wgYlJlY3Vyc2l2ZSwgRlhfQk9PTCBiQ2hhckNvZGUpDQotew0KLSAgICBpV2lkdGggPSAoaW50MzJfdCkoaW50MTZfdCltX1dpZHRoQ2FjaGUuR2V0QXQod1VuaWNvZGUsIDApOw0KLSAgICBpZiAoaVdpZHRoID09IDAgfHwgaVdpZHRoID09IC0xKSB7DQotICAgICAgICBJRlhfRm9udCAqcEZvbnQgPSBOVUxMOw0KLSAgICAgICAgaW50MzJfdCBpR2x5cGggPSBHZXRHbHlwaEluZGV4KHdVbmljb2RlLCBUUlVFLCAmcEZvbnQsIGJDaGFyQ29kZSk7DQotICAgICAgICBpZiAoaUdseXBoICE9IDB4RkZGRiAmJiBwRm9udCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgaWYgKHBGb250ID09IChJRlhfRm9udCopdGhpcykgew0KLSAgICAgICAgICAgICAgICBpZiAoITo6R2V0Q2hhcldpZHRoSShtX2hEQywgaUdseXBoLCAxLCBOVUxMLCAmaVdpZHRoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaVdpZHRoID0gLTE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCgoQ0ZYX0dkaUZvbnQqKXBGb250KS0+R2V0Q2hhcldpZHRoKHdVbmljb2RlLCBpV2lkdGgsIEZBTFNFLCBiQ2hhckNvZGUpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVdpZHRoID0gLTE7DQorRlhfQk9PTCBDRlhfR2RpRm9udDo6R2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUpIHsNCisgIGlXaWR0aCA9IChpbnQzMl90KShpbnQxNl90KW1fV2lkdGhDYWNoZS5HZXRBdCh3VW5pY29kZSwgMCk7DQorICBpZiAoaVdpZHRoID09IDAgfHwgaVdpZHRoID09IC0xKSB7DQorICAgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICAgIGludDMyX3QgaUdseXBoID0gR2V0R2x5cGhJbmRleCh3VW5pY29kZSwgVFJVRSwgJnBGb250LCBiQ2hhckNvZGUpOw0KKyAgICBpZiAoaUdseXBoICE9IDB4RkZGRiAmJiBwRm9udCAhPSBOVUxMKSB7DQorICAgICAgaWYgKHBGb250ID09IChJRlhfRm9udCopdGhpcykgew0KKyAgICAgICAgaWYgKCE6OkdldENoYXJXaWR0aEkobV9oREMsIGlHbHlwaCwgMSwgTlVMTCwgJmlXaWR0aCkpIHsNCisgICAgICAgICAgaVdpZHRoID0gLTE7DQogICAgICAgICB9DQotICAgICAgICBMb2NrKCk7DQotICAgICAgICBtX1dpZHRoQ2FjaGUuU2V0QXRHcm93KHdVbmljb2RlLCAoaW50MTZfdClpV2lkdGgpOw0KLSAgICAgICAgVW5sb2NrKCk7DQorICAgICAgfSBlbHNlIGlmICgoKENGWF9HZGlGb250KilwRm9udCkNCisgICAgICAgICAgICAgICAgICAgICAtPkdldENoYXJXaWR0aCh3VW5pY29kZSwgaVdpZHRoLCBGQUxTRSwgYkNoYXJDb2RlKSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlXaWR0aCA9IC0xOw0KICAgICB9DQotICAgIHJldHVybiBpV2lkdGggPiAwOw0KKyAgICBMb2NrKCk7DQorICAgIG1fV2lkdGhDYWNoZS5TZXRBdEdyb3cod1VuaWNvZGUsIChpbnQxNl90KWlXaWR0aCk7DQorICAgIFVubG9jaygpOw0KKyAgfQ0KKyAgcmV0dXJuIGlXaWR0aCA+IDA7DQogfQ0KLUZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwgaW50MzJfdCAmaVdpZHRoLCBGWF9CT09MIGJDaGFyQ29kZSkNCi17DQotICAgIHJldHVybiBHZXRDaGFyV2lkdGgod1VuaWNvZGUsIGlXaWR0aCwgVFJVRSwgYkNoYXJDb2RlKTsNCitGWF9CT09MIENGWF9HZGlGb250OjpHZXRDaGFyV2lkdGgoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUpIHsNCisgIHJldHVybiBHZXRDaGFyV2lkdGgod1VuaWNvZGUsIGlXaWR0aCwgVFJVRSwgYkNoYXJDb2RlKTsNCiB9DQotaW50MzJfdCBDRlhfR2RpRm9udDo6R2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfQk9PTCBiUmVjdXJzaXZlLCBJRlhfRm9udCAqKnBwRm9udCwgRlhfQk9PTCBiQ2hhckNvZGUpDQotew0KLSAgICBpbnQzMl90IGlHbHlwaCA9IDBYRkZGRjsNCi0gICAgaWYgKDo6R2V0R2x5cGhJbmRpY2VzVyhtX2hEQywgJndVbmljb2RlLCAxLCAoTFBXT1JEKSZpR2x5cGgsIEdHSV9NQVJLX05PTkVYSVNUSU5HX0dMWVBIUykgIT0gR0RJX0VSUk9SICYmIGlHbHlwaCAhPSAweEZGRkYpIHsNCitpbnQzMl90IENGWF9HZGlGb250OjpHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVjdXJzaXZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqKiBwcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSkgew0KKyAgaW50MzJfdCBpR2x5cGggPSAwWEZGRkY7DQorICBpZiAoOjpHZXRHbHlwaEluZGljZXNXKG1faERDLCAmd1VuaWNvZGUsIDEsIChMUFdPUkQpJmlHbHlwaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgR0dJX01BUktfTk9ORVhJU1RJTkdfR0xZUEhTKSAhPSBHRElfRVJST1IgJiYNCisgICAgICBpR2x5cGggIT0gMHhGRkZGKSB7DQorICAgIGlmIChwcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICpwcEZvbnQgPSAoSUZYX0ZvbnQqKXRoaXM7DQorICAgIH0NCisgICAgcmV0dXJuIGlHbHlwaDsNCisgIH0NCisgIEZYX0xQQ0ZPTlRVU0IgcEZvbnRVU0IgPSBGWF9HZXRVbmljb2RlQml0RmllbGQod1VuaWNvZGUpOw0KKyAgaWYgKHBGb250VVNCID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDB4RkZGRjsNCisgIH0NCisgIEZYX1dPUkQgd0JpdEZpZWxkID0gcEZvbnRVU0ItPndCaXRGaWVsZDsNCisgIGlmICh3Qml0RmllbGQgPj0gMTI4KSB7DQorICAgIHJldHVybiAweEZGRkY7DQorICB9DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgbV9Gb250TWFwcGVyLkxvb2t1cCgodm9pZCopd0JpdEZpZWxkLCAodm9pZComKXBGb250KTsNCisgIGlmIChwRm9udCAhPSBOVUxMICYmIHBGb250ICE9IChJRlhfRm9udCopdGhpcykgew0KKyAgICBpR2x5cGggPQ0KKyAgICAgICAgKChDRlhfR2RpRm9udCopcEZvbnQpLT5HZXRHbHlwaEluZGV4KHdVbmljb2RlLCBGQUxTRSwgTlVMTCwgYkNoYXJDb2RlKTsNCisgICAgaWYgKGlHbHlwaCAhPSAweEZGRkYpIHsNCisgICAgICBpbnQzMl90IGkgPSBtX1N1YnN0Rm9udHMuRmluZChwRm9udCk7DQorICAgICAgaWYgKGkgPiAtMSkgew0KKyAgICAgICAgaUdseXBoIHw9ICgoaSArIDEpIDw8IDI0KTsNCiAgICAgICAgIGlmIChwcEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICpwcEZvbnQgPSAoSUZYX0ZvbnQqKXRoaXM7DQorICAgICAgICAgICpwcEZvbnQgPSBwRm9udDsNCiAgICAgICAgIH0NCiAgICAgICAgIHJldHVybiBpR2x5cGg7DQorICAgICAgfQ0KICAgICB9DQotICAgIEZYX0xQQ0ZPTlRVU0IgcEZvbnRVU0IgPSBGWF9HZXRVbmljb2RlQml0RmllbGQod1VuaWNvZGUpOw0KLSAgICBpZiAocEZvbnRVU0IgPT0gTlVMTCkgew0KKyAgfQ0KKyAgaWYgKG1fcEZvbnRNZ3IgIT0gTlVMTCAmJiBiUmVjdXJzaXZlKSB7DQorICAgIElGWF9Gb250KiBwRm9udCA9IG1fcEZvbnRNZ3ItPkdldERlZkZvbnRCeVVuaWNvZGUod1VuaWNvZGUsIG1fZHdTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Mb2dGb250LmxmRmFjZU5hbWUpOw0KKyAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgIGlmIChwRm9udCA9PSAoSUZYX0ZvbnQqKXRoaXMpIHsNCisgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQogICAgICAgICByZXR1cm4gMHhGRkZGOw0KLSAgICB9DQotICAgIEZYX1dPUkQgd0JpdEZpZWxkID0gcEZvbnRVU0ItPndCaXRGaWVsZDsNCi0gICAgaWYgKHdCaXRGaWVsZCA+PSAxMjgpIHsNCi0gICAgICAgIHJldHVybiAweEZGRkY7DQotICAgIH0NCi0gICAgSUZYX0ZvbnQgKnBGb250ID0gTlVMTDsNCi0gICAgbV9Gb250TWFwcGVyLkxvb2t1cCgodm9pZCopd0JpdEZpZWxkLCAodm9pZComKXBGb250KTsNCi0gICAgaWYgKHBGb250ICE9IE5VTEwgJiYgcEZvbnQgIT0gKElGWF9Gb250Kil0aGlzKSB7DQotICAgICAgICBpR2x5cGggPSAoKENGWF9HZGlGb250KilwRm9udCktPkdldEdseXBoSW5kZXgod1VuaWNvZGUsIEZBTFNFLCBOVUxMLCBiQ2hhckNvZGUpOw0KLSAgICAgICAgaWYgKGlHbHlwaCAhPSAweEZGRkYpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGkgPSBtX1N1YnN0Rm9udHMuRmluZChwRm9udCk7DQotICAgICAgICAgICAgaWYgKGkgPiAtMSkgew0KLSAgICAgICAgICAgICAgICBpR2x5cGggfD0gKChpICsgMSkgPDwgMjQpOw0KLSAgICAgICAgICAgICAgICBpZiAocHBGb250ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICpwcEZvbnQgPSBwRm9udDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gaUdseXBoOw0KLSAgICAgICAgICAgIH0NCisgICAgICB9DQorICAgICAgbV9Gb250TWFwcGVyLlNldEF0KCh2b2lkKil3Qml0RmllbGQsICh2b2lkKilwRm9udCk7DQorICAgICAgaW50MzJfdCBpID0gbV9TdWJzdEZvbnRzLkdldFNpemUoKTsNCisgICAgICBtX1N1YnN0Rm9udHMuQWRkKHBGb250KTsNCisgICAgICBpR2x5cGggPSAoKENGWF9HZGlGb250KilwRm9udCkNCisgICAgICAgICAgICAgICAgICAgLT5HZXRHbHlwaEluZGV4KHdVbmljb2RlLCBGQUxTRSwgTlVMTCwgYkNoYXJDb2RlKTsNCisgICAgICBpZiAoaUdseXBoICE9IDB4RkZGRikgew0KKyAgICAgICAgaUdseXBoIHw9ICgoaSArIDEpIDw8IDI0KTsNCisgICAgICAgIGlmIChwcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAqcHBGb250ID0gcEZvbnQ7DQogICAgICAgICB9DQorICAgICAgICByZXR1cm4gaUdseXBoOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAobV9wRm9udE1nciAhPSBOVUxMICYmIGJSZWN1cnNpdmUpIHsNCi0gICAgICAgIElGWF9Gb250ICpwRm9udCA9IG1fcEZvbnRNZ3ItPkdldERlZkZvbnRCeVVuaWNvZGUod1VuaWNvZGUsIG1fZHdTdHlsZXMsIG1fTG9nRm9udC5sZkZhY2VOYW1lKTsNCi0gICAgICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgaWYgKHBGb250ID09IChJRlhfRm9udCopdGhpcykgew0KLSAgICAgICAgICAgICAgICBwRm9udC0+UmVsZWFzZSgpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gMHhGRkZGOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX0ZvbnRNYXBwZXIuU2V0QXQoKHZvaWQqKXdCaXRGaWVsZCwgKHZvaWQqKXBGb250KTsNCi0gICAgICAgICAgICBpbnQzMl90IGkgPSBtX1N1YnN0Rm9udHMuR2V0U2l6ZSgpOw0KLSAgICAgICAgICAgIG1fU3Vic3RGb250cy5BZGQocEZvbnQpOw0KLSAgICAgICAgICAgIGlHbHlwaCA9ICgoQ0ZYX0dkaUZvbnQqKXBGb250KS0+R2V0R2x5cGhJbmRleCh3VW5pY29kZSwgRkFMU0UsIE5VTEwsIGJDaGFyQ29kZSk7DQotICAgICAgICAgICAgaWYgKGlHbHlwaCAhPSAweEZGRkYpIHsNCi0gICAgICAgICAgICAgICAgaUdseXBoIHw9ICgoaSArIDEpIDw8IDI0KTsNCi0gICAgICAgICAgICAgICAgaWYgKHBwRm9udCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAqcHBGb250ID0gcEZvbnQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIGlHbHlwaDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIDB4RkZGRjsNCisgIH0NCisgIHJldHVybiAweEZGRkY7DQogfQ0KLWludDMyX3QgQ0ZYX0dkaUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KLXsNCi0gICAgcmV0dXJuIEdldEdseXBoSW5kZXgod1VuaWNvZGUsIFRSVUUsIE5VTEwsIGJDaGFyQ29kZSk7DQoraW50MzJfdCBDRlhfR2RpRm9udDo6R2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfQk9PTCBiQ2hhckNvZGUpIHsNCisgIHJldHVybiBHZXRHbHlwaEluZGV4KHdVbmljb2RlLCBUUlVFLCBOVUxMLCBiQ2hhckNvZGUpOw0KIH0NCi1pbnQzMl90IENGWF9HZGlGb250OjpHZXRBc2NlbnQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fT3V0bGluZVRNLm90bUFzY2VudDsNCitpbnQzMl90IENGWF9HZGlGb250OjpHZXRBc2NlbnQoKSBjb25zdCB7DQorICByZXR1cm4gbV9PdXRsaW5lVE0ub3RtQXNjZW50Ow0KIH0NCi1pbnQzMl90IENGWF9HZGlGb250OjpHZXREZXNjZW50KCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX091dGxpbmVUTS5vdG1EZXNjZW50Ow0KK2ludDMyX3QgQ0ZYX0dkaUZvbnQ6OkdldERlc2NlbnQoKSBjb25zdCB7DQorICByZXR1cm4gbV9PdXRsaW5lVE0ub3RtRGVzY2VudDsNCiB9DQotRlhfQk9PTCBDRlhfR2RpRm9udDo6R2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsIENGWF9SZWN0ICZiYm94LCBGWF9CT09MIGJDaGFyQ29kZSkNCi17DQotICAgIGludDMyX3QgaUdseXBoSW5kZXggPSBHZXRHbHlwaEluZGV4KHdVbmljb2RlLCBiQ2hhckNvZGUpOw0KLSAgICBpZiAoaUdseXBoSW5kZXggPT0gMHhGRkZGKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgSUZYX0ZvbnQgKnBGb250ID0gR2V0U3Vic3RGb250KGlHbHlwaEluZGV4KTsNCi0gICAgaWYgKHBGb250ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBHTFlQSE1FVFJJQ1MgZ207DQotICAgIGlHbHlwaEluZGV4ICY9IDB4MDBGRkZGRkY7DQotICAgIHN0YXRpYyBjb25zdCBNQVQyIG1hdDIgPSB7ezAsIDF9LCB7MCwgMH0sIHswLCAwfSwgezAsIDF9fTsNCi0gICAgaWYgKDo6R2V0R2x5cGhPdXRsaW5lVygoKENGWF9HZGlGb250KilwRm9udCktPm1faERDLCBpR2x5cGhJbmRleCwgR0dPX0dMWVBIX0lOREVYIHwgR0dPX01FVFJJQ1MsICZnbSwgMCwgTlVMTCwgJm1hdDIpICE9IEdESV9FUlJPUikgew0KLSAgICAgICAgYmJveC5sZWZ0ID0gZ20uZ21wdEdseXBoT3JpZ2luLng7DQotICAgICAgICBiYm94LnRvcCA9IGdtLmdtcHRHbHlwaE9yaWdpbi55Ow0KLSAgICAgICAgYmJveC53aWR0aCA9IGdtLmdtQmxhY2tCb3hYOw0KLSAgICAgICAgYmJveC5oZWlnaHQgPSBnbS5nbUJsYWNrQm94WTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQorRlhfQk9PTCBDRlhfR2RpRm9udDo6R2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3QmIGJib3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUpIHsNCisgIGludDMyX3QgaUdseXBoSW5kZXggPSBHZXRHbHlwaEluZGV4KHdVbmljb2RlLCBiQ2hhckNvZGUpOw0KKyAgaWYgKGlHbHlwaEluZGV4ID09IDB4RkZGRikgew0KICAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkdldEJCb3goQ0ZYX1JlY3QgJmJib3gpDQotew0KLSAgICBiYm94LmxlZnQgPSBtX091dGxpbmVUTS5vdG1yY0ZvbnRCb3gubGVmdDsNCi0gICAgYmJveC50b3AgPSBtX091dGxpbmVUTS5vdG1yY0ZvbnRCb3gudG9wOw0KLSAgICBiYm94LndpZHRoID0gbV9PdXRsaW5lVE0ub3RtcmNGb250Qm94LnJpZ2h0IC0gbV9PdXRsaW5lVE0ub3RtcmNGb250Qm94LmxlZnQ7DQotICAgIGJib3guaGVpZ2h0ID0gbV9PdXRsaW5lVE0ub3RtcmNGb250Qm94LmJvdHRvbSAtIG1fT3V0bGluZVRNLm90bXJjRm9udEJveC50b3A7DQorICB9DQorICBJRlhfRm9udCogcEZvbnQgPSBHZXRTdWJzdEZvbnQoaUdseXBoSW5kZXgpOw0KKyAgaWYgKHBGb250ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgR0xZUEhNRVRSSUNTIGdtOw0KKyAgaUdseXBoSW5kZXggJj0gMHgwMEZGRkZGRjsNCisgIHN0YXRpYyBjb25zdCBNQVQyIG1hdDIgPSB7ezAsIDF9LCB7MCwgMH0sIHswLCAwfSwgezAsIDF9fTsNCisgIGlmICg6OkdldEdseXBoT3V0bGluZVcoKChDRlhfR2RpRm9udCopcEZvbnQpLT5tX2hEQywgaUdseXBoSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEdHT19HTFlQSF9JTkRFWCB8IEdHT19NRVRSSUNTLCAmZ20sIDAsIE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICZtYXQyKSAhPSBHRElfRVJST1IpIHsNCisgICAgYmJveC5sZWZ0ID0gZ20uZ21wdEdseXBoT3JpZ2luLng7DQorICAgIGJib3gudG9wID0gZ20uZ21wdEdseXBoT3JpZ2luLnk7DQorICAgIGJib3gud2lkdGggPSBnbS5nbUJsYWNrQm94WDsNCisgICAgYmJveC5oZWlnaHQgPSBnbS5nbUJsYWNrQm94WTsNCiAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLWludDMyX3QgQ0ZYX0dkaUZvbnQ6OkdldEl0YWxpY0FuZ2xlKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX091dGxpbmVUTS5vdG1JdGFsaWNBbmdsZSAvIDEwOw0KK0ZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkdldEJCb3goQ0ZYX1JlY3QmIGJib3gpIHsNCisgIGJib3gubGVmdCA9IG1fT3V0bGluZVRNLm90bXJjRm9udEJveC5sZWZ0Ow0KKyAgYmJveC50b3AgPSBtX091dGxpbmVUTS5vdG1yY0ZvbnRCb3gudG9wOw0KKyAgYmJveC53aWR0aCA9IG1fT3V0bGluZVRNLm90bXJjRm9udEJveC5yaWdodCAtIG1fT3V0bGluZVRNLm90bXJjRm9udEJveC5sZWZ0Ow0KKyAgYmJveC5oZWlnaHQgPSBtX091dGxpbmVUTS5vdG1yY0ZvbnRCb3guYm90dG9tIC0gbV9PdXRsaW5lVE0ub3RtcmNGb250Qm94LnRvcDsNCisgIHJldHVybiBUUlVFOw0KIH0NCi12b2lkIENGWF9HZGlGb250OjpSZXNldCgpDQotew0KLSAgICBMb2NrKCk7DQotICAgIG1fV2lkdGhDYWNoZS5SZW1vdmVBbGwoKTsNCi0gICAgQ2xlYXJDYWNoZSgpOw0KLSAgICBVbmxvY2soKTsNCitpbnQzMl90IENGWF9HZGlGb250OjpHZXRJdGFsaWNBbmdsZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX091dGxpbmVUTS5vdG1JdGFsaWNBbmdsZSAvIDEwOw0KIH0NCi1JRlhfRm9udCogQ0ZYX0dkaUZvbnQ6OkdldFN1YnN0Rm9udChpbnQzMl90IGlHbHlwaEluZGV4KSBjb25zdA0KLXsNCi0gICAgaW50MzJfdCBpSGlnaGVyID0gKGlHbHlwaEluZGV4ICYgMHg3RjAwMDAwMCkgPj4gMjQ7DQotICAgIGlmIChpSGlnaGVyID09IDApIHsNCi0gICAgICAgIHJldHVybiAoSUZYX0ZvbnQqKXRoaXM7DQotICAgIH0NCi0gICAgaWYgKGlIaWdoZXIgPiBtX1N1YnN0Rm9udHMuR2V0U2l6ZSgpKSB7DQotICAgICAgICByZXR1cm4gKElGWF9Gb250Kil0aGlzOw0KLSAgICB9DQotICAgIHJldHVybiAoSUZYX0ZvbnQqKW1fU3Vic3RGb250c1tpSGlnaGVyIC0gMV07DQordm9pZCBDRlhfR2RpRm9udDo6UmVzZXQoKSB7DQorICBMb2NrKCk7DQorICBtX1dpZHRoQ2FjaGUuUmVtb3ZlQWxsKCk7DQorICBDbGVhckNhY2hlKCk7DQorICBVbmxvY2soKTsNCiB9DQotRlhfRFdPUkQgQ0ZYX0dkaUZvbnQ6OkdldEdseXBoRElCaXRzKGludDMyX3QgaUdseXBoSW5kZXgsIEZYX0FSR0IgYXJnYiwgY29uc3QgTUFUMiAqcE1hdHJpeCwgR0xZUEhNRVRSSUNTICZnbSwgdm9pZCogcEJ1ZmZlciwgRlhfRFdPUkQgYnVmU2l6ZSkNCi17DQotICAgIHN0YXRpYyBjb25zdCBVSU5UIHVGb3JtYXQgPSBHR09fR0xZUEhfSU5ERVggfCBHR09fR1JBWThfQklUTUFQOw0KLSAgICBJRlhfRm9udCAqcEZvbnQgPSBHZXRTdWJzdEZvbnQoaUdseXBoSW5kZXgpOw0KLSAgICBpZiAocEZvbnQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQorSUZYX0ZvbnQqIENGWF9HZGlGb250OjpHZXRTdWJzdEZvbnQoaW50MzJfdCBpR2x5cGhJbmRleCkgY29uc3Qgew0KKyAgaW50MzJfdCBpSGlnaGVyID0gKGlHbHlwaEluZGV4ICYgMHg3RjAwMDAwMCkgPj4gMjQ7DQorICBpZiAoaUhpZ2hlciA9PSAwKSB7DQorICAgIHJldHVybiAoSUZYX0ZvbnQqKXRoaXM7DQorICB9DQorICBpZiAoaUhpZ2hlciA+IG1fU3Vic3RGb250cy5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuIChJRlhfRm9udCopdGhpczsNCisgIH0NCisgIHJldHVybiAoSUZYX0ZvbnQqKW1fU3Vic3RGb250c1tpSGlnaGVyIC0gMV07DQorfQ0KK0ZYX0RXT1JEIENGWF9HZGlGb250OjpHZXRHbHlwaERJQml0cyhpbnQzMl90IGlHbHlwaEluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1BVDIqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMWVBITUVUUklDUyYgZ20sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJ1ZlNpemUpIHsNCisgIHN0YXRpYyBjb25zdCBVSU5UIHVGb3JtYXQgPSBHR09fR0xZUEhfSU5ERVggfCBHR09fR1JBWThfQklUTUFQOw0KKyAgSUZYX0ZvbnQqIHBGb250ID0gR2V0U3Vic3RGb250KGlHbHlwaEluZGV4KTsNCisgIGlmIChwRm9udCA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKHBGb250ICE9IChJRlhfRm9udCopdGhpcykgew0KKyAgICByZXR1cm4gKChDRlhfR2RpRm9udCopcEZvbnQpDQorICAgICAgICAtPkdldEdseXBoRElCaXRzKGlHbHlwaEluZGV4ICYgMHgwMEZGRkZGRiwgYXJnYiwgcE1hdHJpeCwgZ20sIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUpOw0KKyAgfQ0KKyAgdWludDhfdCogcEdseXBoT3V0bGluZSA9IE5VTEw7DQorICBGWFNZU19hc3NlcnQocE1hdHJpeCAhPSBOVUxMKTsNCisgIEZYX0RXT1JEIGR3TUFUMiA9IEdldE1BVDJIYXNoQ29kZSgoY29uc3QgRklYRUQqKXBNYXRyaXgpOw0KKyAgQ0ZYX0dkaUZvbnRDYWNoZSogcENhY2hlID0gTlVMTDsNCisgIGlmIChtX0ZvbnRDYWNoZS5Mb29rdXAoKHZvaWQqKWR3TUFUMiwgKHZvaWQqJilwQ2FjaGUpICYmIHBDYWNoZSAhPSBOVUxMKSB7DQorICAgIEZYX0xQQ0dESUdPQ0FDSEUgcEdPID0gcENhY2hlLT5HZXRDYWNoZWRHbHlwaE91dGxpbmUoaUdseXBoSW5kZXgpOw0KKyAgICBpZiAocEdPICE9IE5VTEwpIHsNCisgICAgICBnbSA9IHBHTy0+Z207DQorICAgICAgcEdseXBoT3V0bGluZSA9IHBHTy0+cE91dGxpbmU7DQogICAgIH0NCi0gICAgaWYgKHBGb250ICE9IChJRlhfRm9udCopdGhpcykgew0KLSAgICAgICAgcmV0dXJuICgoQ0ZYX0dkaUZvbnQqKXBGb250KS0+R2V0R2x5cGhESUJpdHMoaUdseXBoSW5kZXggJiAweDAwRkZGRkZGLCBhcmdiLCBwTWF0cml4LCBnbSwgcEJ1ZmZlciwgYnVmU2l6ZSk7DQorICB9DQorICBpZiAocEdseXBoT3V0bGluZSA9PSBOVUxMKSB7DQorICAgIEZYX0RXT1JEIGR3R2x5cGhTaXplID0NCisgICAgICAgIDo6R2V0R2x5cGhPdXRsaW5lVyhtX2hEQywgaUdseXBoSW5kZXgsIHVGb3JtYXQsICZnbSwgMCwgTlVMTCwgcE1hdHJpeCk7DQorICAgIGlmIChkd0dseXBoU2l6ZSA9PSAwIHx8IGR3R2x5cGhTaXplID09IEdESV9FUlJPUikgew0KKyAgICAgIHJldHVybiAwOw0KICAgICB9DQotICAgIHVpbnQ4X3QqIHBHbHlwaE91dGxpbmUgPSBOVUxMOw0KLSAgICBGWFNZU19hc3NlcnQocE1hdHJpeCAhPSBOVUxMKTsNCi0gICAgRlhfRFdPUkQgZHdNQVQyID0gR2V0TUFUMkhhc2hDb2RlKChjb25zdCBGSVhFRCopcE1hdHJpeCk7DQotICAgIENGWF9HZGlGb250Q2FjaGUgKnBDYWNoZSA9IE5VTEw7DQotICAgIGlmIChtX0ZvbnRDYWNoZS5Mb29rdXAoKHZvaWQqKWR3TUFUMiwgKHZvaWQqJilwQ2FjaGUpICYmIHBDYWNoZSAhPSBOVUxMKSB7DQotICAgICAgICBGWF9MUENHRElHT0NBQ0hFIHBHTyA9IHBDYWNoZS0+R2V0Q2FjaGVkR2x5cGhPdXRsaW5lKGlHbHlwaEluZGV4KTsNCi0gICAgICAgIGlmIChwR08gIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGdtID0gcEdPLT5nbTsNCi0gICAgICAgICAgICBwR2x5cGhPdXRsaW5lID0gcEdPLT5wT3V0bGluZTsNCi0gICAgICAgIH0NCisgICAgcEdseXBoT3V0bGluZSA9ICh1aW50OF90KilGWF9BbGxvYyhkd0dseXBoU2l6ZSk7DQorICAgIDo6R2V0R2x5cGhPdXRsaW5lVyhtX2hEQywgaUdseXBoSW5kZXgsIHVGb3JtYXQsICZnbSwgZHdHbHlwaFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICBwR2x5cGhPdXRsaW5lLCBwTWF0cml4KTsNCisgICAgaWYgKHBDYWNoZSA9PSBOVUxMKSB7DQorICAgICAgcENhY2hlID0gRlhfTkVXIENGWF9HZGlGb250Q2FjaGU7DQorICAgICAgaWYgKG1fRm9udENhY2hlLkdldENvdW50KCkgPj0gRlhfR0RJRk9OVF9GT05UQ0FDSEVTSVpFKSB7DQorICAgICAgICBDbGVhckNhY2hlKCk7DQorICAgICAgfQ0KKyAgICAgIG1fRm9udENhY2hlLlNldEF0KCh2b2lkKilkd01BVDIsICh2b2lkKilwQ2FjaGUpOw0KICAgICB9DQotICAgIGlmIChwR2x5cGhPdXRsaW5lID09IE5VTEwpIHsNCi0gICAgICAgIEZYX0RXT1JEIGR3R2x5cGhTaXplID0gOjpHZXRHbHlwaE91dGxpbmVXKG1faERDLCBpR2x5cGhJbmRleCwgdUZvcm1hdCwgJmdtLCAwLCBOVUxMLCBwTWF0cml4KTsNCi0gICAgICAgIGlmIChkd0dseXBoU2l6ZSA9PSAwIHx8IGR3R2x5cGhTaXplID09IEdESV9FUlJPUikgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcEdseXBoT3V0bGluZSA9ICh1aW50OF90KilGWF9BbGxvYyhkd0dseXBoU2l6ZSk7DQotICAgICAgICA6OkdldEdseXBoT3V0bGluZVcobV9oREMsIGlHbHlwaEluZGV4LCB1Rm9ybWF0LCAmZ20sIGR3R2x5cGhTaXplLCBwR2x5cGhPdXRsaW5lLCBwTWF0cml4KTsNCi0gICAgICAgIGlmIChwQ2FjaGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHBDYWNoZSA9IEZYX05FVyBDRlhfR2RpRm9udENhY2hlOw0KLSAgICAgICAgICAgIGlmIChtX0ZvbnRDYWNoZS5HZXRDb3VudCgpID49IEZYX0dESUZPTlRfRk9OVENBQ0hFU0laRSkgew0KLSAgICAgICAgICAgICAgICBDbGVhckNhY2hlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fRm9udENhY2hlLlNldEF0KCh2b2lkKilkd01BVDIsICh2b2lkKilwQ2FjaGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcENhY2hlLT5TZXRDYWNoZWRHbHlwaE91dGxpbmUoaUdseXBoSW5kZXgsIGdtLCBwR2x5cGhPdXRsaW5lKTsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBkd0RpYlNpemUgPSBnbS5nbUJsYWNrQm94WCAqIDQgKiBnbS5nbUJsYWNrQm94WTsNCi0gICAgaWYgKHBCdWZmZXIgPT0gTlVMTCB8fCBidWZTaXplIDwgZHdEaWJTaXplKSB7DQotICAgICAgICByZXR1cm4gZHdEaWJTaXplOw0KLSAgICB9DQotICAgIENyZWF0ZUdseXBoQml0bWFwKGdtLmdtQmxhY2tCb3hYLCBnbS5nbUJsYWNrQm94WSwgcEdseXBoT3V0bGluZSwgKEZYX0RXT1JEKilwQnVmZmVyLCBhcmdiKTsNCisgICAgcENhY2hlLT5TZXRDYWNoZWRHbHlwaE91dGxpbmUoaUdseXBoSW5kZXgsIGdtLCBwR2x5cGhPdXRsaW5lKTsNCisgIH0NCisgIEZYX0RXT1JEIGR3RGliU2l6ZSA9IGdtLmdtQmxhY2tCb3hYICogNCAqIGdtLmdtQmxhY2tCb3hZOw0KKyAgaWYgKHBCdWZmZXIgPT0gTlVMTCB8fCBidWZTaXplIDwgZHdEaWJTaXplKSB7DQogICAgIHJldHVybiBkd0RpYlNpemU7DQorICB9DQorICBDcmVhdGVHbHlwaEJpdG1hcChnbS5nbUJsYWNrQm94WCwgZ20uZ21CbGFja0JveFksIHBHbHlwaE91dGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAoRlhfRFdPUkQqKXBCdWZmZXIsIGFyZ2IpOw0KKyAgcmV0dXJuIGR3RGliU2l6ZTsNCiB9DQotRlhfRFdPUkQgQ0ZYX0dkaUZvbnQ6OkdldEhhc2hDb2RlKCkgY29uc3QNCi17DQotICAgIHJldHVybiBGWF9HZXRGb250SGFzaENvZGUoRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldChtX0xvZ0ZvbnQubGZDaGFyU2V0KSwgRlhfR2V0R2RpRm9udFN0eWxlcyhtX0xvZ0ZvbnQpKTsNCitGWF9EV09SRCBDRlhfR2RpRm9udDo6R2V0SGFzaENvZGUoKSBjb25zdCB7DQorICByZXR1cm4gRlhfR2V0Rm9udEhhc2hDb2RlKEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQobV9Mb2dGb250LmxmQ2hhclNldCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0dldEdkaUZvbnRTdHlsZXMobV9Mb2dGb250KSk7DQogfQ0KLUZYX0RXT1JEIENGWF9HZGlGb250OjpHZXRNQVQySGFzaENvZGUoY29uc3QgRklYRUQgKnBGaXhlZCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwRml4ZWQgIT0gTlVMTCk7DQotICAgIEZYX0RXT1JEIGR3SGFzaDEgPSAwLCBkd0hhc2gyID0gNTM4MSwgZHdSZXQ7DQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSArKykgew0KLSAgICAgICAgZHdSZXQgPSAqKChjb25zdCBGWF9EV09SRCopcEZpeGVkKTsNCi0gICAgICAgIGR3SGFzaDEgPSAxMzEzICogZHdIYXNoMSArIGR3UmV0Ow0KLSAgICAgICAgZHdIYXNoMiArPSAoZHdIYXNoMiA8PCA1KSArIGR3UmV0Ow0KLSAgICAgICAgcEZpeGVkICsrOw0KK0ZYX0RXT1JEIENGWF9HZGlGb250OjpHZXRNQVQySGFzaENvZGUoY29uc3QgRklYRUQqIHBGaXhlZCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBGaXhlZCAhPSBOVUxMKTsNCisgIEZYX0RXT1JEIGR3SGFzaDEgPSAwLCBkd0hhc2gyID0gNTM4MSwgZHdSZXQ7DQorICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgew0KKyAgICBkd1JldCA9ICooKGNvbnN0IEZYX0RXT1JEKilwRml4ZWQpOw0KKyAgICBkd0hhc2gxID0gMTMxMyAqIGR3SGFzaDEgKyBkd1JldDsNCisgICAgZHdIYXNoMiArPSAoZHdIYXNoMiA8PCA1KSArIGR3UmV0Ow0KKyAgICBwRml4ZWQrKzsNCisgIH0NCisgIHJldHVybiAoKGR3SGFzaDEgJiAweDAwMDBGRkZGKSA8PCAxNikgfCAoZHdIYXNoMiAmIDB4MDAwMEZGRkYpOw0KK30NCit2b2lkIENGWF9HZGlGb250OjpDcmVhdGVHbHlwaEJpdG1hcChpbnQzMl90IGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcE91dGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBESUIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiKSB7DQorICBpbnQzMl90IHBhZGRpbmcgPSAoKGlXaWR0aCArIDMpIC8gNCkgKiA0IC0gaVdpZHRoOw0KKyAgRlhfRFdPUkQgYWxwaGE7DQorICBpbnQzMl90IGksIGo7DQorICBmb3IgKGogPSBpSGVpZ2h0IC0gMTsgaiA+PSAwOyAtLWopIHsNCisgICAgZm9yIChpID0gaVdpZHRoIC0gMTsgaSA+PSAwOyAtLWkpIHsNCisgICAgICBpZiAoKGFscGhhID0gKnBPdXRsaW5lKyspID09IDApIHsNCisgICAgICAgICpwRElCKysgPSAwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBhbHBoYSA9IChhcmdiID4+IDI0KSAqIChhbHBoYSAqIDQgLSAxKSAvIDI1NjsNCisgICAgICAgICpwRElCKysgPSAoYWxwaGEgPDwgMjQpIHwgKGFyZ2IgJiAweDAwRkZGRkZGKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuICgoZHdIYXNoMSAmIDB4MDAwMEZGRkYpIDw8IDE2KSB8IChkd0hhc2gyICYgMHgwMDAwRkZGRik7DQotfQ0KLXZvaWQgQ0ZYX0dkaUZvbnQ6OkNyZWF0ZUdseXBoQml0bWFwKGludDMyX3QgaVdpZHRoLCBpbnQzMl90IGlIZWlnaHQsIHVpbnQ4X3QqIHBPdXRsaW5lLCBGWF9EV09SRCogcERJQiwgRlhfQVJHQiBhcmdiKQ0KLXsNCi0gICAgaW50MzJfdCBwYWRkaW5nID0gKChpV2lkdGggKyAzKSAvIDQpICogNCAtIGlXaWR0aDsNCi0gICAgRlhfRFdPUkQgYWxwaGE7DQotICAgIGludDMyX3QgaSwgajsNCi0gICAgZm9yIChqID0gaUhlaWdodCAtIDE7IGogPj0gMDsgLS1qKSB7DQotICAgICAgICBmb3IgKGkgPSBpV2lkdGggLSAxOyBpID49IDA7IC0taSkgew0KLSAgICAgICAgICAgIGlmICgoYWxwaGEgPSAqcE91dGxpbmUrKykgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAqcERJQisrID0gMDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBhbHBoYSA9IChhcmdiID4+IDI0KSAqIChhbHBoYSAqIDQgLSAxKSAvIDI1NjsNCi0gICAgICAgICAgICAgICAgKnBESUIrKyA9IChhbHBoYSA8PCAyNCkgfCAoYXJnYiAmIDB4MDBGRkZGRkYpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHBPdXRsaW5lICs9IHBhZGRpbmc7DQotICAgIH0NCisgICAgcE91dGxpbmUgKz0gcGFkZGluZzsNCisgIH0NCiB9DQogI2VuZGlmDQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dkaWZvbnQuaCBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZGlmb250LmgKaW5kZXggODVhZjFjOS4uYzUwNTYzYiAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dkaWZvbnQuaAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2RpZm9udC5oCkBAIC03LDgyICs3LDk5IEBACiAjaWZuZGVmIF9GWF9HRElPQkpFQ1RfSU1QDQogI2RlZmluZSBfRlhfR0RJT0JKRUNUX0lNUA0KICNpZmRlZiBfRlhQTFVTDQotI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQorI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgXA0KKyAgICBfRlhfT1NfID09IF9GWF9XSU42NF8NCiB0eXBlZGVmIHN0cnVjdCBfRlhfR0RJR09DQUNIRSB7DQotICAgIEdMWVBITUVUUklDUwlnbTsNCi0gICAgdWludDhfdCoJCXBPdXRsaW5lOw0KLX0gRlhfR0RJR09DQUNIRSwgKiBGWF9MUEdESUdPQ0FDSEU7DQotdHlwZWRlZiBGWF9HRElHT0NBQ0hFIGNvbnN0ICogRlhfTFBDR0RJR09DQUNIRTsNCi1jbGFzcyBDRlhfR2RpRm9udENhY2hlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX0dkaUZvbnRDYWNoZSgpOw0KLSAgICB+Q0ZYX0dkaUZvbnRDYWNoZSgpOw0KLSAgICB2b2lkCQkJCVNldENhY2hlZEdseXBoT3V0bGluZShGWF9EV09SRCBkd0dseXBoLCBjb25zdCBHTFlQSE1FVFJJQ1MgJmdtLCB1aW50OF90KiBwT3V0bGluZSk7DQotICAgIEZYX0xQQ0dESUdPQ0FDSEUJR2V0Q2FjaGVkR2x5cGhPdXRsaW5lKEZYX0RXT1JEIGR3R2x5cGgpIGNvbnN0Ow0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX01hcFB0clRvUHRyCQltX0dseXBoTWFwOw0KKyAgR0xZUEhNRVRSSUNTIGdtOw0KKyAgdWludDhfdCogcE91dGxpbmU7DQorfSBGWF9HRElHT0NBQ0hFLCAqRlhfTFBHRElHT0NBQ0hFOw0KK3R5cGVkZWYgRlhfR0RJR09DQUNIRSBjb25zdCogRlhfTFBDR0RJR09DQUNIRTsNCitjbGFzcyBDRlhfR2RpRm9udENhY2hlIHsNCisgcHVibGljOg0KKyAgQ0ZYX0dkaUZvbnRDYWNoZSgpOw0KKyAgfkNGWF9HZGlGb250Q2FjaGUoKTsNCisgIHZvaWQgU2V0Q2FjaGVkR2x5cGhPdXRsaW5lKEZYX0RXT1JEIGR3R2x5cGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTFlQSE1FVFJJQ1MmIGdtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcE91dGxpbmUpOw0KKyAgRlhfTFBDR0RJR09DQUNIRSBHZXRDYWNoZWRHbHlwaE91dGxpbmUoRlhfRFdPUkQgZHdHbHlwaCkgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIENGWF9NYXBQdHJUb1B0ciBtX0dseXBoTWFwOw0KIH07DQotY2xhc3MgQ0ZYX0dkaUZvbnQgOiBwdWJsaWMgSUZYX0ZvbnQsIHB1YmxpYyBDRlhfVGhyZWFkTG9jaw0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9HZGlGb250KElGWF9Gb250TWdyICpwRm9udE1ncik7DQotICAgIH5DRlhfR2RpRm9udCgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCk7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlSZXRhaW4oKTsNCi0gICAgRlhfQk9PTAkJCUxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKTsNCi0gICAgRlhfQk9PTAkJCUxvYWRGb250KGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUxlbmd0aCk7DQotICAgIEZYX0JPT0wJCQlMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUpOw0KLSAgICBGWF9CT09MCQkJTG9hZEZvbnQoSUZYX1N0cmVhbSAqcEZvbnRTdHJlYW0pOw0KLSAgICBGWF9CT09MCQkJTG9hZEZvbnQoY29uc3QgTE9HRk9OVFcgJmxmKTsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCURlcml2ZShGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlID0gMCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0RmFtaWx5TmFtZShDRlhfV2lkZVN0cmluZyAmd3NGYW1pbHkpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRGb250U3R5bGVzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZHdTdHlsZXM7DQotICAgIH0NCi0gICAgdmlydHVhbCB1aW50OF90CQkJR2V0Q2hhclNldCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX0xvZ0ZvbnQubGZDaGFyU2V0Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwgaW50MzJfdCAmaVdpZHRoLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRBc2NlbnQoKSBjb25zdDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXREZXNjZW50KCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldENoYXJCQm94KEZYX1dDSEFSIHdVbmljb2RlLCBDRlhfUmVjdCAmYmJveCwgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEJCb3goQ0ZYX1JlY3QgJmJib3gpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEl0YWxpY0FuZ2xlKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlc2V0KCk7DQotICAgIEZYX0RXT1JECQlHZXRHbHlwaERJQml0cyhpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9BUkdCIGFyZ2IsIGNvbnN0IE1BVDIgKnBNYXRyaXgsIEdMWVBITUVUUklDUyAmZ20sIHZvaWQqIHBCdWZmZXIsIEZYX0RXT1JEIGJ1ZlNpemUpOw0KLSAgICBGWF9EV09SRAkJR2V0SGFzaENvZGUoKSBjb25zdDsNCi1wcm90ZWN0ZWQ6DQotICAgIElGWF9Gb250TWdyCQkJCSptX3BGb250TWdyOw0KLSAgICBpbnQzMl90CQkJCW1faVJlZkNvdW50Ow0KLSAgICBDRlhfV29yZERpc2NyZXRlQXJyYXkJbV9XaWR0aENhY2hlOw0KLSAgICBPVVRMSU5FVEVYVE1FVFJJQ1cJCW1fT3V0bGluZVRNOw0KLSAgICBIR0RJT0JKCQkJCQltX2hPbGRGb250Ow0KLSAgICBIRk9OVAkJCQkJbV9oRm9udDsNCi0gICAgSERDCQkJCQkJbV9oREM7DQotICAgIExPR0ZPTlRXCQkJCW1fTG9nRm9udDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQltX3dzRm9udEZpbGVOYW1lOw0KLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5CQltX0ZvbnRGYW1pbGllczsNCi0gICAgSEFORExFCQkJCQltX2hSZXM7DQotICAgIEZYX0RXT1JECQkJCW1fZHdTdHlsZXM7DQotICAgIENGWF9QdHJBcnJheQkJCW1fU3Vic3RGb250czsNCi0gICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9Gb250TWFwcGVyOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCQltX0ZvbnRDYWNoZTsNCi0gICAgdm9pZAkJCUNsZWFyQ2FjaGUoKTsNCi0gICAgaW50MzJfdAkJR2V0Rm9udEZhbWlsaWVzKEdkaXBsdXM6OkZvbnRDb2xsZWN0aW9uICZmYyk7DQotICAgIHZvaWQJCQlSZXRyaWV2ZUZvbnRTdHlsZXMoKTsNCi0gICAgSUZYX0ZvbnQqCQlHZXRTdWJzdEZvbnQoaW50MzJfdCBpR2x5cGhJbmRleCkgY29uc3Q7DQotICAgIEZYX0JPT0wJCQlHZXRDaGFyV2lkdGgoRlhfV0NIQVIgd1VuaWNvZGUsIGludDMyX3QgJmlXaWR0aCwgRlhfQk9PTCBiUmVjdXJzaXZlLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCi0gICAgaW50MzJfdAkJR2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfQk9PTCBiUmVjdXJzaXZlLCBJRlhfRm9udCAqKnBwRm9udCwgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQotICAgIEZYX0RXT1JECQlHZXRNQVQySGFzaENvZGUoY29uc3QgRklYRUQgKnBGaXhlZCk7DQotICAgIHZvaWQJCQlDcmVhdGVHbHlwaEJpdG1hcChpbnQzMl90IGlXaWR0aCwgaW50MzJfdCBpSGVpZ2h0LCB1aW50OF90KiBwT3V0bGluZSwgRlhfRFdPUkQqIHBESUIsIEZYX0FSR0IgYXJnYik7DQotICAgIGZyaWVuZCBjbGFzcyBDRlhfR2RpRm9udE1ncjsNCitjbGFzcyBDRlhfR2RpRm9udCA6IHB1YmxpYyBJRlhfRm9udCwgcHVibGljIENGWF9UaHJlYWRMb2NrIHsNCisgcHVibGljOg0KKyAgQ0ZYX0dkaUZvbnQoSUZYX0ZvbnRNZ3IqIHBGb250TWdyKTsNCisgIH5DRlhfR2RpRm9udCgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIFJldGFpbigpOw0KKyAgRlhfQk9PTCBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSk7DQorICBGWF9CT09MIExvYWRGb250KGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUxlbmd0aCk7DQorICBGWF9CT09MIExvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSk7DQorICBGWF9CT09MIExvYWRGb250KElGWF9TdHJlYW0qIHBGb250U3RyZWFtKTsNCisgIEZYX0JPT0wgTG9hZEZvbnQoY29uc3QgTE9HRk9OVFcmIGxmKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIERlcml2ZShGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlID0gMCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXRGYW1pbHlOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0ZhbWlseSkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldEZvbnRTdHlsZXMoKSBjb25zdCB7IHJldHVybiBtX2R3U3R5bGVzOyB9DQorICB2aXJ0dWFsIHVpbnQ4X3QgR2V0Q2hhclNldCgpIGNvbnN0IHsgcmV0dXJuIG1fTG9nRm9udC5sZkNoYXJTZXQ7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDaGFyV2lkdGgoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0QXNjZW50KCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGVzY2VudCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIEdldENoYXJCQm94KEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0JiBiYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goQ0ZYX1JlY3QmIGJib3gpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEl0YWxpY0FuZ2xlKCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKTsNCisgIEZYX0RXT1JEIEdldEdseXBoRElCaXRzKGludDMyX3QgaUdseXBoSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQVQyKiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xZUEhNRVRSSUNTJiBnbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBidWZTaXplKTsNCisgIEZYX0RXT1JEIEdldEhhc2hDb2RlKCkgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIElGWF9Gb250TWdyKiBtX3BGb250TWdyOw0KKyAgaW50MzJfdCBtX2lSZWZDb3VudDsNCisgIENGWF9Xb3JkRGlzY3JldGVBcnJheSBtX1dpZHRoQ2FjaGU7DQorICBPVVRMSU5FVEVYVE1FVFJJQ1cgbV9PdXRsaW5lVE07DQorICBIR0RJT0JKIG1faE9sZEZvbnQ7DQorICBIRk9OVCBtX2hGb250Ow0KKyAgSERDIG1faERDOw0KKyAgTE9HRk9OVFcgbV9Mb2dGb250Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0ZvbnRGaWxlTmFtZTsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgbV9Gb250RmFtaWxpZXM7DQorICBIQU5ETEUgbV9oUmVzOw0KKyAgRlhfRFdPUkQgbV9kd1N0eWxlczsNCisgIENGWF9QdHJBcnJheSBtX1N1YnN0Rm9udHM7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9Gb250TWFwcGVyOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fRm9udENhY2hlOw0KKyAgdm9pZCBDbGVhckNhY2hlKCk7DQorICBpbnQzMl90IEdldEZvbnRGYW1pbGllcyhHZGlwbHVzOjpGb250Q29sbGVjdGlvbiYgZmMpOw0KKyAgdm9pZCBSZXRyaWV2ZUZvbnRTdHlsZXMoKTsNCisgIElGWF9Gb250KiBHZXRTdWJzdEZvbnQoaW50MzJfdCBpR2x5cGhJbmRleCkgY29uc3Q7DQorICBGWF9CT09MIEdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgaW50MzJfdCBHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udCoqIHBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCisgIEZYX0RXT1JEIEdldE1BVDJIYXNoQ29kZShjb25zdCBGSVhFRCogcEZpeGVkKTsNCisgIHZvaWQgQ3JlYXRlR2x5cGhCaXRtYXAoaW50MzJfdCBpV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcE91dGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwRElCLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IpOw0KKyAgZnJpZW5kIGNsYXNzIENGWF9HZGlGb250TWdyOw0KIH07DQogI2VuZGlmDQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dlZm9udC5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2Vmb250LmNwcAppbmRleCBlMGFkNGE5Li5lZjVhZTRlIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2Vmb250LmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2Vmb250LmNwcApAQCAtOCw1ODggKzgsNTk1IEBACiAjaW5jbHVkZSAiZnhfZ2Vmb250LmgiDQogI2luY2x1ZGUgImZ4X2ZvbnR1dGlscy5oIg0KICNpZm5kZWYgX0ZYUExVUw0KLUlGWF9Gb250KiBJRlhfRm9udDo6TG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UsIElGWF9Gb250TWdyICpwRm9udE1ncikNCi17DQorSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyKSB7DQogI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgaWYgKE5VTEwgIT0gcEZvbnRNZ3IpIHsNCi0gICAgICAgIHJldHVybiBwRm9udE1nci0+R2V0Rm9udEJ5Q29kZVBhZ2Uod0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KKyAgaWYgKE5VTEwgIT0gcEZvbnRNZ3IpIHsNCisgICAgcmV0dXJuIHBGb250TWdyLT5HZXRGb250QnlDb2RlUGFnZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywgcHN6Rm9udEZhbWlseSk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiAjZWxzZQ0KLSAgICBDRlhfR0VGb250ICpwRm9udCA9IEZYX05FVyBDRlhfR0VGb250KHBGb250TWdyKTsNCi0gICAgaWYgKCFwRm9udC0+TG9hZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpKSB7DQotICAgICAgICBwRm9udC0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHBGb250Ow0KLSNlbmRpZg0KLX0NCi1JRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUxlbmd0aCwgSUZYX0ZvbnRNZ3IgKnBGb250TWdyKQ0KLXsNCi0jaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KLSAgICBpZiAoTlVMTCAhPSBwRm9udE1ncikgew0KLSAgICAgICAgcmV0dXJuIHBGb250TWdyLT5Mb2FkRm9udChwQnVmZmVyLCBpTGVuZ3RoLCAwLCBOVUxMKTsNCi0gICAgfQ0KKyAgQ0ZYX0dFRm9udCogcEZvbnQgPSBGWF9ORVcgQ0ZYX0dFRm9udChwRm9udE1ncik7DQorICBpZiAoIXBGb250LT5Mb2FkRm9udChwc3pGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSkpIHsNCisgICAgcEZvbnQtPlJlbGVhc2UoKTsNCiAgICAgcmV0dXJuIE5VTEw7DQotI2Vsc2UNCi0gICAgQ0ZYX0dFRm9udCAqcEZvbnQgPSBGWF9ORVcgQ0ZYX0dFRm9udChwRm9udE1ncik7DQotICAgIGlmICghcEZvbnQtPkxvYWRGb250KHBCdWZmZXIsIGlMZW5ndGgpKSB7DQotICAgICAgICBwRm9udC0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHBGb250Ow0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KICNlbmRpZg0KIH0NCi1JRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSwgSUZYX0ZvbnRNZ3IgKnBGb250TWdyKQ0KLXsNCitJRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IpIHsNCiAjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KLSAgICBpZiAoTlVMTCAhPSBwRm9udE1ncikgew0KLSAgICAgICAgcmV0dXJuIHBGb250TWdyLT5Mb2FkRm9udChwc3pGaWxlTmFtZSwgMCwgTlVMTCk7DQotICAgIH0NCisgIGlmIChOVUxMICE9IHBGb250TWdyKSB7DQorICAgIHJldHVybiBwRm9udE1nci0+TG9hZEZvbnQocEJ1ZmZlciwgaUxlbmd0aCwgMCwgTlVMTCk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCisjZWxzZQ0KKyAgQ0ZYX0dFRm9udCogcEZvbnQgPSBGWF9ORVcgQ0ZYX0dFRm9udChwRm9udE1ncik7DQorICBpZiAoIXBGb250LT5Mb2FkRm9udChwQnVmZmVyLCBpTGVuZ3RoKSkgew0KKyAgICBwRm9udC0+UmVsZWFzZSgpOw0KICAgICByZXR1cm4gTlVMTDsNCi0jZWxzZQ0KLSAgICBDRlhfR0VGb250ICpwRm9udCA9IEZYX05FVyBDRlhfR0VGb250KHBGb250TWdyKTsNCi0gICAgaWYgKCFwRm9udC0+TG9hZEZvbnQocHN6RmlsZU5hbWUpKSB7DQotICAgICAgICBwRm9udC0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHBGb250Ow0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KICNlbmRpZg0KIH0NCi1JRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KElGWF9TdHJlYW0gKnBGb250U3RyZWFtLCBJRlhfRm9udE1nciAqcEZvbnRNZ3IsIEZYX0JPT0wgYlNhdmVTdHJlYW0pDQotew0KK0lGWF9Gb250KiBJRlhfRm9udDo6TG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyKSB7DQogI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgaWYgKE5VTEwgIT0gcEZvbnRNZ3IpIHsNCi0gICAgICAgIHJldHVybiBwRm9udE1nci0+TG9hZEZvbnQocEZvbnRTdHJlYW0sIDAsIE5VTEwpOw0KLSAgICB9DQorICBpZiAoTlVMTCAhPSBwRm9udE1ncikgew0KKyAgICByZXR1cm4gcEZvbnRNZ3ItPkxvYWRGb250KHBzekZpbGVOYW1lLCAwLCBOVUxMKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KKyNlbHNlDQorICBDRlhfR0VGb250KiBwRm9udCA9IEZYX05FVyBDRlhfR0VGb250KHBGb250TWdyKTsNCisgIGlmICghcEZvbnQtPkxvYWRGb250KHBzekZpbGVOYW1lKSkgew0KKyAgICBwRm9udC0+UmVsZWFzZSgpOw0KICAgICByZXR1cm4gTlVMTDsNCi0jZWxzZQ0KLSAgICBDRlhfR0VGb250ICpwRm9udCA9IEZYX05FVyBDRlhfR0VGb250KHBGb250TWdyKTsNCi0gICAgaWYgKCFwRm9udC0+TG9hZEZvbnQocEZvbnRTdHJlYW0sIGJTYXZlU3RyZWFtKSkgew0KLSAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBwRm9udDsNCisgIH0NCisgIHJldHVybiBwRm9udDsNCiAjZW5kaWYNCiB9DQotSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChDRlhfRm9udCAqcEV4dEZvbnQsIElGWF9Gb250TWdyICpwRm9udE1nciwgRlhfQk9PTCBiVGFrZU92ZXIpDQotew0KLSAgICBDRlhfR0VGb250ICpwRm9udCA9IEZYX05FVyBDRlhfR0VGb250KHBGb250TWdyKTsNCi0gICAgaWYgKCFwRm9udC0+TG9hZEZvbnQocEV4dEZvbnQsIGJUYWtlT3ZlcikpIHsNCi0gICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gcEZvbnQ7DQotfQ0KLUNGWF9HRUZvbnQ6OkNGWF9HRUZvbnQoSUZYX0ZvbnRNZ3IgKnBGb250TWdyKQ0KLSAgICA6IENGWF9UaHJlYWRMb2NrKCkNCi0gICAgLCBtX3BGb250KE5VTEwpDQotICAgICwgbV9wRm9udE1ncihwRm9udE1ncikNCi0gICAgLCBtX2lSZWZDb3VudCgxKQ0KLSAgICAsIG1fYkV4dEZvbnQoRkFMU0UpDQotICAgICwgbV9wU3RyZWFtKE5VTEwpDQotICAgICwgbV9wRmlsZVJlYWQoTlVMTCkNCi0gICAgLCBtX3BGb250RW5jb2RpbmcoTlVMTCkNCi0gICAgLCBtX3BDaGFyV2lkdGhNYXAoTlVMTCkNCi0gICAgLCBtX3BSZWN0QXJyYXkoTlVMTCkNCi0gICAgLCBtX3BCQm94TWFwKE5VTEwpDQotICAgICwgbV93Q2hhclNldCgweEZGRkYpDQotICAgICwgbV9wUHJvdmlkZXIoTlVMTCkNCitJRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KElGWF9TdHJlYW0qIHBGb250U3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVN0cmVhbSkgew0KICNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQotICAgICwgbV9iVXNlTG9nRm9udFN0eWxlKEZBTFNFKQ0KLSAgICAsIG1fZHdMb2dGb250U3R5bGUoMCkNCisgIGlmIChOVUxMICE9IHBGb250TWdyKSB7DQorICAgIHJldHVybiBwRm9udE1nci0+TG9hZEZvbnQocEZvbnRTdHJlYW0sIDAsIE5VTEwpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorI2Vsc2UNCisgIENGWF9HRUZvbnQqIHBGb250ID0gRlhfTkVXIENGWF9HRUZvbnQocEZvbnRNZ3IpOw0KKyAgaWYgKCFwRm9udC0+TG9hZEZvbnQocEZvbnRTdHJlYW0sIGJTYXZlU3RyZWFtKSkgew0KKyAgICBwRm9udC0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBwRm9udDsNCiAjZW5kaWYNCi0gICAgLCBtX1N1YnN0Rm9udHMoKQ0KLSAgICAsIG1fRm9udE1hcHBlcigxNikNCi17DQogfQ0KLUNGWF9HRUZvbnQ6OkNGWF9HRUZvbnQoY29uc3QgQ0ZYX0dFRm9udCAmc3JjLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMpDQotICAgIDogQ0ZYX1RocmVhZExvY2soKQ0KLSAgICAsIG1fcEZvbnQoTlVMTCkNCi0gICAgLCBtX3BGb250TWdyKHNyYy5tX3BGb250TWdyKQ0KLSAgICAsIG1faVJlZkNvdW50KDEpDQotICAgICwgbV9iRXh0Rm9udChGQUxTRSkNCi0gICAgLCBtX3BTdHJlYW0oTlVMTCkNCi0gICAgLCBtX3BGaWxlUmVhZChOVUxMKQ0KLSAgICAsIG1fcEZvbnRFbmNvZGluZyhOVUxMKQ0KLSAgICAsIG1fcENoYXJXaWR0aE1hcChOVUxMKQ0KLSAgICAsIG1fcFJlY3RBcnJheShOVUxMKQ0KLSAgICAsIG1fcEJCb3hNYXAoTlVMTCkNCi0gICAgLCBtX3dDaGFyU2V0KDB4RkZGRikNCi0gICAgLCBtX3BQcm92aWRlcihOVUxMKQ0KLSAgICAsIG1fU3Vic3RGb250cygpDQotICAgICwgbV9Gb250TWFwcGVyKDE2KQ0KLXsNCi0gICAgbV9wRm9udCA9IEZYX05FVyBDRlhfRm9udDsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCk7DQotICAgIEZYU1lTX2Fzc2VydChzcmMubV9wRm9udCAhPSBOVUxMKTsNCi0gICAgbV9wRm9udC0+TG9hZENsb25lKHNyYy5tX3BGb250KTsNCi0gICAgQ0ZYX1N1YnN0Rm9udCAqJnBTdWJzdCA9IG1fcEZvbnQtPm1fcFN1YnN0Rm9udDsNCi0gICAgaWYgKHBTdWJzdCA9PSBOVUxMKSB7DQotICAgICAgICBwU3Vic3QgPSBGWF9ORVcgQ0ZYX1N1YnN0Rm9udDsNCi0gICAgfQ0KLSAgICBpZiAocFN1YnN0KSB7DQotICAgICAgICBwU3Vic3QtPm1fV2VpZ2h0ID0gKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9Cb2xkKSA/IEZYRk9OVF9GV19CT0xEIDogRlhGT05UX0ZXX05PUk1BTDsNCi0gICAgICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfSXRhbGljKSB7DQotICAgICAgICAgICAgcFN1YnN0LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX0lUQUxJQzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBJbml0Rm9udCgpOw0KK0lGWF9Gb250KiBJRlhfRm9udDo6TG9hZEZvbnQoQ0ZYX0ZvbnQqIHBFeHRGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVGFrZU92ZXIpIHsNCisgIENGWF9HRUZvbnQqIHBGb250ID0gRlhfTkVXIENGWF9HRUZvbnQocEZvbnRNZ3IpOw0KKyAgaWYgKCFwRm9udC0+TG9hZEZvbnQocEV4dEZvbnQsIGJUYWtlT3ZlcikpIHsNCisgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcEZvbnQ7DQogfQ0KLUNGWF9HRUZvbnQ6On5DRlhfR0VGb250KCkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9TdWJzdEZvbnRzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICBJRlhfRm9udCAqcEZvbnQgPSAoSUZYX0ZvbnQqKW1fU3Vic3RGb250c1tpXTsNCi0gICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQotICAgIH0NCi0gICAgbV9TdWJzdEZvbnRzLlJlbW92ZUFsbCgpOw0KLSAgICBtX0ZvbnRNYXBwZXIuUmVtb3ZlQWxsKCk7DQotICAgIGlmIChtX3BGaWxlUmVhZCAhPSBOVUxMKSB7DQotICAgICAgICBtX3BGaWxlUmVhZC0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIGlmIChtX3BTdHJlYW0gIT0gTlVMTCkgew0KLSAgICAgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQotICAgIH0NCi0gICAgaWYgKG1fcEZvbnRFbmNvZGluZyAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgbV9wRm9udEVuY29kaW5nOw0KLSAgICB9DQotICAgIGlmIChtX3BDaGFyV2lkdGhNYXAgIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIG1fcENoYXJXaWR0aE1hcDsNCi0gICAgfQ0KLSAgICBpZiAobV9wUmVjdEFycmF5ICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BSZWN0QXJyYXk7DQotICAgIH0NCi0gICAgaWYgKG1fcEJCb3hNYXAgIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIG1fcEJCb3hNYXA7DQotICAgIH0NCi0gICAgaWYgKG1fcEZvbnQgIT0gTlVMTCAmJiAhbV9iRXh0Rm9udCkgew0KLSAgICAgICAgZGVsZXRlIG1fcEZvbnQ7DQotICAgIH0NCitDRlhfR0VGb250OjpDRlhfR0VGb250KElGWF9Gb250TWdyKiBwRm9udE1ncikNCisgICAgOiBDRlhfVGhyZWFkTG9jaygpLA0KKyAgICAgIG1fcEZvbnQoTlVMTCksDQorICAgICAgbV9wRm9udE1ncihwRm9udE1nciksDQorICAgICAgbV9pUmVmQ291bnQoMSksDQorICAgICAgbV9iRXh0Rm9udChGQUxTRSksDQorICAgICAgbV9wU3RyZWFtKE5VTEwpLA0KKyAgICAgIG1fcEZpbGVSZWFkKE5VTEwpLA0KKyAgICAgIG1fcEZvbnRFbmNvZGluZyhOVUxMKSwNCisgICAgICBtX3BDaGFyV2lkdGhNYXAoTlVMTCksDQorICAgICAgbV9wUmVjdEFycmF5KE5VTEwpLA0KKyAgICAgIG1fcEJCb3hNYXAoTlVMTCksDQorICAgICAgbV93Q2hhclNldCgweEZGRkYpLA0KKyAgICAgIG1fcFByb3ZpZGVyKE5VTEwpDQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgICAsDQorICAgICAgbV9iVXNlTG9nRm9udFN0eWxlKEZBTFNFKSwNCisgICAgICBtX2R3TG9nRm9udFN0eWxlKDApDQorI2VuZGlmDQorICAgICAgLA0KKyAgICAgIG1fU3Vic3RGb250cygpLA0KKyAgICAgIG1fRm9udE1hcHBlcigxNikgew0KIH0NCi12b2lkIENGWF9HRUZvbnQ6OlJlbGVhc2UoKQ0KLXsNCi0gICAgaWYgKC0tIG1faVJlZkNvdW50IDwgMSkgew0KLSAgICAgICAgaWYgKG1fcEZvbnRNZ3IgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIG1fcEZvbnRNZ3ItPlJlbW92ZUZvbnQodGhpcyk7DQotICAgICAgICB9DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLX0NCi1JRlhfRm9udCogQ0ZYX0dFRm9udDo6UmV0YWluKCkNCi17DQotICAgICsrIG1faVJlZkNvdW50Ow0KLSAgICByZXR1cm4gdGhpczsNCi19DQotRlhfQk9PTCBDRlhfR0VGb250OjpMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSkNCi17DQotICAgIGlmIChtX3BGb250ICE9IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBMb2NrKCk7DQotICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udEZhbWlseTsNCi0gICAgaWYgKHBzekZvbnRGYW1pbHkgIT0gTlVMTCkgew0KLSAgICAgICAgY3NGb250RmFtaWx5ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBzekZvbnRGYW1pbHkpOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSAwOw0KLSAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2gpIHsNCi0gICAgICAgIGR3RmxhZ3MgfD0gRlhGT05UX0ZJWEVEX1BJVENIOw0KLSAgICB9DQotICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2VyaWYpIHsNCi0gICAgICAgIGR3RmxhZ3MgfD0gRlhGT05UX1NFUklGOw0KLSAgICB9DQotICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpIHsNCi0gICAgICAgIGR3RmxhZ3MgfD0gRlhGT05UX1NZTUJPTElDOw0KLSAgICB9DQotICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSB7DQotICAgICAgICBkd0ZsYWdzIHw9IEZYRk9OVF9TQ1JJUFQ7DQotICAgIH0NCitDRlhfR0VGb250OjpDRlhfR0VGb250KGNvbnN0IENGWF9HRUZvbnQmIHNyYywgRlhfRFdPUkQgZHdGb250U3R5bGVzKQ0KKyAgICA6IENGWF9UaHJlYWRMb2NrKCksDQorICAgICAgbV9wRm9udChOVUxMKSwNCisgICAgICBtX3BGb250TWdyKHNyYy5tX3BGb250TWdyKSwNCisgICAgICBtX2lSZWZDb3VudCgxKSwNCisgICAgICBtX2JFeHRGb250KEZBTFNFKSwNCisgICAgICBtX3BTdHJlYW0oTlVMTCksDQorICAgICAgbV9wRmlsZVJlYWQoTlVMTCksDQorICAgICAgbV9wRm9udEVuY29kaW5nKE5VTEwpLA0KKyAgICAgIG1fcENoYXJXaWR0aE1hcChOVUxMKSwNCisgICAgICBtX3BSZWN0QXJyYXkoTlVMTCksDQorICAgICAgbV9wQkJveE1hcChOVUxMKSwNCisgICAgICBtX3dDaGFyU2V0KDB4RkZGRiksDQorICAgICAgbV9wUHJvdmlkZXIoTlVMTCksDQorICAgICAgbV9TdWJzdEZvbnRzKCksDQorICAgICAgbV9Gb250TWFwcGVyKDE2KSB7DQorICBtX3BGb250ID0gRlhfTkVXIENGWF9Gb250Ow0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCk7DQorICBGWFNZU19hc3NlcnQoc3JjLm1fcEZvbnQgIT0gTlVMTCk7DQorICBtX3BGb250LT5Mb2FkQ2xvbmUoc3JjLm1fcEZvbnQpOw0KKyAgQ0ZYX1N1YnN0Rm9udComIHBTdWJzdCA9IG1fcEZvbnQtPm1fcFN1YnN0Rm9udDsNCisgIGlmIChwU3Vic3QgPT0gTlVMTCkgew0KKyAgICBwU3Vic3QgPSBGWF9ORVcgQ0ZYX1N1YnN0Rm9udDsNCisgIH0NCisgIGlmIChwU3Vic3QpIHsNCisgICAgcFN1YnN0LT5tX1dlaWdodCA9DQorICAgICAgICAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMOw0KICAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgew0KLSAgICAgICAgZHdGbGFncyB8PSBGWEZPTlRfSVRBTElDOw0KKyAgICAgIHBTdWJzdC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9JVEFMSUM7DQogICAgIH0NCi0gICAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9Cb2xkKSB7DQotICAgICAgICBkd0ZsYWdzIHw9IEZYRk9OVF9CT0xEOw0KLSAgICB9DQotICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRXhhY3RNYXRjaCkgew0KLSAgICAgICAgZHdGbGFncyB8PSBGWEZPTlRfRVhBQ1RNQVRDSDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlXZWlnaHQgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMOw0KLSAgICBGWF9XT1JEIHdDaGFyU2V0ID0gRlhfR2V0Q2hhcnNldEZyb21Db2RlUGFnZSh3Q29kZVBhZ2UpOw0KLSAgICBpZiAod0NoYXJTZXQgPT0gMHhGRkZGKSB7DQotICAgICAgICB3Q2hhclNldCA9IEZYU1lTX0dldEFDUCgpOw0KLSAgICB9DQotICAgIG1fd0NoYXJTZXQgPSB3Q2hhclNldDsNCi0gICAgbV9wRm9udCA9IEZYX05FVyBDRlhfRm9udDsNCi0gICAgaWYgKChkd0ZsYWdzICYgRlhGT05UX0lUQUxJQykgJiYgKGR3RmxhZ3MgJiBGWEZPTlRfQk9MRCkpIHsNCi0gICAgICAgIGNzRm9udEZhbWlseSArPSAiLEJvbGRJdGFsaWMiOw0KLSAgICB9IGVsc2UgaWYgKGR3RmxhZ3MgJiBGWEZPTlRfQk9MRCkgew0KLSAgICAgICAgY3NGb250RmFtaWx5ICs9ICIsQm9sZCI7DQotICAgIH0gZWxzZSBpZiAoZHdGbGFncyAmIEZYRk9OVF9JVEFMSUMpIHsNCi0gICAgICAgIGNzRm9udEZhbWlseSArPSAiLEl0YWxpYyI7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiUmV0ID0gbV9wRm9udC0+TG9hZFN1YnN0KGNzRm9udEZhbWlseSwgVFJVRSwgZHdGbGFncywgaVdlaWdodCwgMCwgd0NvZGVQYWdlKTsNCi0gICAgYlJldCA9IG1fcEZvbnQtPm1fRmFjZSAhPSBOVUxMOw0KLSAgICBpZiAoYlJldCkgew0KLSAgICAgICAgSW5pdEZvbnQoKTsNCi0gICAgfQ0KLSAgICBVbmxvY2soKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQorICB9DQorICBJbml0Rm9udCgpOw0KIH0NCi1GWF9CT09MIENGWF9HRUZvbnQ6OkxvYWRGb250KGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgbGVuZ3RoKQ0KLXsNCi0gICAgaWYgKG1fcEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIExvY2soKTsNCi0gICAgbV9wRm9udCA9IEZYX05FVyBDRlhfRm9udDsNCi0gICAgRlhfQk9PTCBiUmV0ID0gbV9wRm9udC0+TG9hZEVtYmVkZGVkKHBCdWZmZXIsIGxlbmd0aCk7DQotICAgIGlmIChiUmV0KSB7DQotICAgICAgICBJbml0Rm9udCgpOw0KLSAgICB9DQotICAgIG1fd0NoYXJTZXQgPSAweEZGRkY7DQotICAgIFVubG9jaygpOw0KLSAgICByZXR1cm4gYlJldDsNCitDRlhfR0VGb250Ojp+Q0ZYX0dFRm9udCgpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9TdWJzdEZvbnRzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIElGWF9Gb250KiBwRm9udCA9IChJRlhfRm9udCopbV9TdWJzdEZvbnRzW2ldOw0KKyAgICBwRm9udC0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgbV9TdWJzdEZvbnRzLlJlbW92ZUFsbCgpOw0KKyAgbV9Gb250TWFwcGVyLlJlbW92ZUFsbCgpOw0KKyAgaWYgKG1fcEZpbGVSZWFkICE9IE5VTEwpIHsNCisgICAgbV9wRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgIH0NCisgIGlmIChtX3BTdHJlYW0gIT0gTlVMTCkgew0KKyAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCisgIH0NCisgIGlmIChtX3BGb250RW5jb2RpbmcgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9wRm9udEVuY29kaW5nOw0KKyAgfQ0KKyAgaWYgKG1fcENoYXJXaWR0aE1hcCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX3BDaGFyV2lkdGhNYXA7DQorICB9DQorICBpZiAobV9wUmVjdEFycmF5ICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fcFJlY3RBcnJheTsNCisgIH0NCisgIGlmIChtX3BCQm94TWFwICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fcEJCb3hNYXA7DQorICB9DQorICBpZiAobV9wRm9udCAhPSBOVUxMICYmICFtX2JFeHRGb250KSB7DQorICAgIGRlbGV0ZSBtX3BGb250Ow0KKyAgfQ0KIH0NCi1GWF9CT09MIENGWF9HRUZvbnQ6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSkNCi17DQotICAgIGlmIChtX3BGb250ICE9IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCit2b2lkIENGWF9HRUZvbnQ6OlJlbGVhc2UoKSB7DQorICBpZiAoLS1tX2lSZWZDb3VudCA8IDEpIHsNCisgICAgaWYgKG1fcEZvbnRNZ3IgIT0gTlVMTCkgew0KKyAgICAgIG1fcEZvbnRNZ3ItPlJlbW92ZUZvbnQodGhpcyk7DQogICAgIH0NCi0gICAgaWYgKG1fcFN0cmVhbSAhPSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG1fcEZpbGVSZWFkICE9IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBMb2NrKCk7DQotICAgIG1fcFN0cmVhbSA9IElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbShwc3pGaWxlTmFtZSwgRlhfU1RSRUFNQUNDRVNTX0JpbmFyeSB8IEZYX1NUUkVBTUFDQ0VTU19SZWFkKTsNCi0gICAgbV9wRmlsZVJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZChtX3BTdHJlYW0pOw0KLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCi0gICAgaWYgKG1fcFN0cmVhbSAhPSBOVUxMICYmIG1fcEZpbGVSZWFkICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcEZvbnQgPSBGWF9ORVcgQ0ZYX0ZvbnQ7DQotICAgICAgICBiUmV0ID0gbV9wRm9udC0+TG9hZEZpbGUobV9wRmlsZVJlYWQpOw0KLSAgICAgICAgaWYgKCFiUmV0KSB7DQotICAgICAgICAgICAgbV9wRmlsZVJlYWQtPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICBtX3BGaWxlUmVhZCA9IE5VTEw7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEluaXRGb250KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV93Q2hhclNldCA9IDB4RkZGRjsNCi0gICAgVW5sb2NrKCk7DQotICAgIHJldHVybiBiUmV0Ow0KKyAgICBkZWxldGUgdGhpczsNCisgIH0NCiB9DQotRlhfQk9PTCBDRlhfR0VGb250OjpMb2FkRm9udChJRlhfU3RyZWFtICpwRm9udFN0cmVhbSwgRlhfQk9PTCBiU2F2ZVN0cmVhbSkNCi17DQotICAgIGlmIChtX3BGb250ICE9IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAocEZvbnRTdHJlYW0gPT0gTlVMTCB8fCBwRm9udFN0cmVhbS0+R2V0TGVuZ3RoKCkgPCAxKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG1fcEZpbGVSZWFkICE9IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBMb2NrKCk7DQotICAgIGlmIChiU2F2ZVN0cmVhbSkgew0KLSAgICAgICAgbV9wU3RyZWFtID0gcEZvbnRTdHJlYW07DQotICAgIH0NCi0gICAgbV9wRmlsZVJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZChwRm9udFN0cmVhbSk7DQorSUZYX0ZvbnQqIENGWF9HRUZvbnQ6OlJldGFpbigpIHsNCisgICsrbV9pUmVmQ291bnQ7DQorICByZXR1cm4gdGhpczsNCit9DQorRlhfQk9PTCBDRlhfR0VGb250OjpMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBpZiAobV9wRm9udCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIExvY2soKTsNCisgIENGWF9CeXRlU3RyaW5nIGNzRm9udEZhbWlseTsNCisgIGlmIChwc3pGb250RmFtaWx5ICE9IE5VTEwpIHsNCisgICAgY3NGb250RmFtaWx5ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBzekZvbnRGYW1pbHkpOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdGbGFncyA9IDA7DQorICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2gpIHsNCisgICAgZHdGbGFncyB8PSBGWEZPTlRfRklYRURfUElUQ0g7DQorICB9DQorICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1NlcmlmKSB7DQorICAgIGR3RmxhZ3MgfD0gRlhGT05UX1NFUklGOw0KKyAgfQ0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYykgew0KKyAgICBkd0ZsYWdzIHw9IEZYRk9OVF9TWU1CT0xJQzsNCisgIH0NCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSB7DQorICAgIGR3RmxhZ3MgfD0gRlhGT05UX1NDUklQVDsNCisgIH0NCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfSXRhbGljKSB7DQorICAgIGR3RmxhZ3MgfD0gRlhGT05UX0lUQUxJQzsNCisgIH0NCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgew0KKyAgICBkd0ZsYWdzIHw9IEZYRk9OVF9CT0xEOw0KKyAgfQ0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9FeGFjdE1hdGNoKSB7DQorICAgIGR3RmxhZ3MgfD0gRlhGT05UX0VYQUNUTUFUQ0g7DQorICB9DQorICBpbnQzMl90IGlXZWlnaHQgPQ0KKyAgICAgIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgPyBGWEZPTlRfRldfQk9MRCA6IEZYRk9OVF9GV19OT1JNQUw7DQorICBGWF9XT1JEIHdDaGFyU2V0ID0gRlhfR2V0Q2hhcnNldEZyb21Db2RlUGFnZSh3Q29kZVBhZ2UpOw0KKyAgaWYgKHdDaGFyU2V0ID09IDB4RkZGRikgew0KKyAgICB3Q2hhclNldCA9IEZYU1lTX0dldEFDUCgpOw0KKyAgfQ0KKyAgbV93Q2hhclNldCA9IHdDaGFyU2V0Ow0KKyAgbV9wRm9udCA9IEZYX05FVyBDRlhfRm9udDsNCisgIGlmICgoZHdGbGFncyAmIEZYRk9OVF9JVEFMSUMpICYmIChkd0ZsYWdzICYgRlhGT05UX0JPTEQpKSB7DQorICAgIGNzRm9udEZhbWlseSArPSAiLEJvbGRJdGFsaWMiOw0KKyAgfSBlbHNlIGlmIChkd0ZsYWdzICYgRlhGT05UX0JPTEQpIHsNCisgICAgY3NGb250RmFtaWx5ICs9ICIsQm9sZCI7DQorICB9IGVsc2UgaWYgKGR3RmxhZ3MgJiBGWEZPTlRfSVRBTElDKSB7DQorICAgIGNzRm9udEZhbWlseSArPSAiLEl0YWxpYyI7DQorICB9DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgIG1fcEZvbnQtPkxvYWRTdWJzdChjc0ZvbnRGYW1pbHksIFRSVUUsIGR3RmxhZ3MsIGlXZWlnaHQsIDAsIHdDb2RlUGFnZSk7DQorICBiUmV0ID0gbV9wRm9udC0+bV9GYWNlICE9IE5VTEw7DQorICBpZiAoYlJldCkgew0KKyAgICBJbml0Rm9udCgpOw0KKyAgfQ0KKyAgVW5sb2NrKCk7DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRlhfR0VGb250OjpMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGxlbmd0aCkgew0KKyAgaWYgKG1fcEZvbnQgIT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBMb2NrKCk7DQorICBtX3BGb250ID0gRlhfTkVXIENGWF9Gb250Ow0KKyAgRlhfQk9PTCBiUmV0ID0gbV9wRm9udC0+TG9hZEVtYmVkZGVkKHBCdWZmZXIsIGxlbmd0aCk7DQorICBpZiAoYlJldCkgew0KKyAgICBJbml0Rm9udCgpOw0KKyAgfQ0KKyAgbV93Q2hhclNldCA9IDB4RkZGRjsNCisgIFVubG9jaygpOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dFRm9udDo6TG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lKSB7DQorICBpZiAobV9wRm9udCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChtX3BTdHJlYW0gIT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9wRmlsZVJlYWQgIT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBMb2NrKCk7DQorICBtX3BTdHJlYW0gPSBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0oDQorICAgICAgcHN6RmlsZU5hbWUsIEZYX1NUUkVBTUFDQ0VTU19CaW5hcnkgfCBGWF9TVFJFQU1BQ0NFU1NfUmVhZCk7DQorICBtX3BGaWxlUmVhZCA9IEZYX0NyZWF0ZUZpbGVSZWFkKG1fcFN0cmVhbSk7DQorICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgIGlmIChtX3BTdHJlYW0gIT0gTlVMTCAmJiBtX3BGaWxlUmVhZCAhPSBOVUxMKSB7DQogICAgIG1fcEZvbnQgPSBGWF9ORVcgQ0ZYX0ZvbnQ7DQotICAgIEZYX0JPT0wgYlJldCA9IG1fcEZvbnQtPkxvYWRGaWxlKG1fcEZpbGVSZWFkKTsNCisgICAgYlJldCA9IG1fcEZvbnQtPkxvYWRGaWxlKG1fcEZpbGVSZWFkKTsNCiAgICAgaWYgKCFiUmV0KSB7DQotICAgICAgICBtX3BGaWxlUmVhZC0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wRmlsZVJlYWQgPSBOVUxMOw0KKyAgICAgIG1fcEZpbGVSZWFkLT5SZWxlYXNlKCk7DQorICAgICAgbV9wRmlsZVJlYWQgPSBOVUxMOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgSW5pdEZvbnQoKTsNCisgICAgICBJbml0Rm9udCgpOw0KICAgICB9DQotICAgIG1fd0NoYXJTZXQgPSAweEZGRkY7DQotICAgIFVubG9jaygpOw0KLSAgICByZXR1cm4gYlJldDsNCisgIH0NCisgIG1fd0NoYXJTZXQgPSAweEZGRkY7DQorICBVbmxvY2soKTsNCisgIHJldHVybiBiUmV0Ow0KIH0NCi1GWF9CT09MIENGWF9HRUZvbnQ6OkxvYWRGb250KENGWF9Gb250ICpwRXh0Rm9udCwgRlhfQk9PTCBiVGFrZU92ZXIpDQotew0KLSAgICBpZiAobV9wRm9udCAhPSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDRlhfR0VGb250OjpMb2FkRm9udChJRlhfU3RyZWFtKiBwRm9udFN0cmVhbSwgRlhfQk9PTCBiU2F2ZVN0cmVhbSkgew0KKyAgaWYgKG1fcEZvbnQgIT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocEZvbnRTdHJlYW0gPT0gTlVMTCB8fCBwRm9udFN0cmVhbS0+R2V0TGVuZ3RoKCkgPCAxKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChtX3BGaWxlUmVhZCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIExvY2soKTsNCisgIGlmIChiU2F2ZVN0cmVhbSkgew0KKyAgICBtX3BTdHJlYW0gPSBwRm9udFN0cmVhbTsNCisgIH0NCisgIG1fcEZpbGVSZWFkID0gRlhfQ3JlYXRlRmlsZVJlYWQocEZvbnRTdHJlYW0pOw0KKyAgbV9wRm9udCA9IEZYX05FVyBDRlhfRm9udDsNCisgIEZYX0JPT0wgYlJldCA9IG1fcEZvbnQtPkxvYWRGaWxlKG1fcEZpbGVSZWFkKTsNCisgIGlmICghYlJldCkgew0KKyAgICBtX3BGaWxlUmVhZC0+UmVsZWFzZSgpOw0KKyAgICBtX3BGaWxlUmVhZCA9IE5VTEw7DQorICB9IGVsc2Ugew0KKyAgICBJbml0Rm9udCgpOw0KKyAgfQ0KKyAgbV93Q2hhclNldCA9IDB4RkZGRjsNCisgIFVubG9jaygpOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dFRm9udDo6TG9hZEZvbnQoQ0ZYX0ZvbnQqIHBFeHRGb250LCBGWF9CT09MIGJUYWtlT3Zlcikgew0KKyAgaWYgKG1fcEZvbnQgIT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocEV4dEZvbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBMb2NrKCk7DQorICBpZiAoKG1fcEZvbnQgPSBwRXh0Rm9udCkgIT0gTlVMTCkgew0KKyAgICBtX2JFeHRGb250ID0gIWJUYWtlT3ZlcjsNCisgICAgSW5pdEZvbnQoKTsNCisgIH0gZWxzZSB7DQorICAgIG1fYkV4dEZvbnQgPSBUUlVFOw0KKyAgfQ0KKyAgbV93Q2hhclNldCA9IDB4RkZGRjsNCisgIFVubG9jaygpOw0KKyAgcmV0dXJuIG1fcEZvbnQgIT0gTlVMTDsNCit9DQordm9pZCBDRlhfR0VGb250OjpJbml0Rm9udCgpIHsNCisgIGlmIChtX3BGb250ID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcEZvbnRFbmNvZGluZyA9PSBOVUxMKSB7DQorI2lmZGVmIEZYRk1fRU5DT0RJTkdfTk9ORQ0KKyAgICBtX3BGb250RW5jb2RpbmcgPSBGWF9DcmVhdGVGb250RW5jb2RpbmdFeChtX3BGb250KTsNCisjZWxzZQ0KKyAgICBtX3BGb250RW5jb2RpbmcgPSBGWEdFX0NyZWF0ZVVuaWNvZGVFbmNvZGluZyhtX3BGb250KTsNCisjZW5kaWYNCisgIH0NCisgIGlmIChtX3BDaGFyV2lkdGhNYXAgPT0gTlVMTCkgew0KKyAgICBtX3BDaGFyV2lkdGhNYXAgPSBuZXcgQ0ZYX1dvcmREaXNjcmV0ZUFycmF5KDEwMjQpOw0KKyAgfQ0KKyAgaWYgKG1fcFJlY3RBcnJheSA9PSBOVUxMKSB7DQorICAgIG1fcFJlY3RBcnJheSA9IG5ldyBDRlhfUmVjdE1hc3NBcnJheSgxNik7DQorICB9DQorICBpZiAobV9wQkJveE1hcCA9PSBOVUxMKSB7DQorICAgIG1fcEJCb3hNYXAgPSBGWF9ORVcgQ0ZYX01hcFB0clRvUHRyKDE2KTsNCisgIH0NCit9DQorSUZYX0ZvbnQqIENGWF9HRUZvbnQ6OkRlcml2ZShGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBpZiAoR2V0Rm9udFN0eWxlcygpID09IGR3Rm9udFN0eWxlcykgew0KKyAgICByZXR1cm4gUmV0YWluKCk7DQorICB9DQorICByZXR1cm4gRlhfTkVXIENGWF9HRUZvbnQoKnRoaXMsIGR3Rm9udFN0eWxlcyk7DQorfQ0KK3VpbnQ4X3QgQ0ZYX0dFRm9udDo6R2V0Q2hhclNldCgpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChtX3BGb250ICE9IE5VTEwpOw0KKyAgaWYgKG1fd0NoYXJTZXQgIT0gMHhGRkZGKSB7DQorICAgIHJldHVybiAodWludDhfdCltX3dDaGFyU2V0Ow0KKyAgfQ0KKyAgaWYgKG1fcEZvbnQtPm1fcFN1YnN0Rm9udCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGWF9DSEFSU0VUX0RlZmF1bHQ7DQorICB9DQorICByZXR1cm4gbV9wRm9udC0+bV9wU3Vic3RGb250LT5tX0NoYXJzZXQ7DQorfQ0KK3ZvaWQgQ0ZYX0dFRm9udDo6R2V0RmFtaWx5TmFtZShDRlhfV2lkZVN0cmluZyYgd3NGYW1pbHkpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChtX3BGb250ICE9IE5VTEwpOw0KKyAgaWYgKG1fcEZvbnQtPm1fcFN1YnN0Rm9udCA9PSBOVUxMIHx8DQorICAgICAgbV9wRm9udC0+bV9wU3Vic3RGb250LT5tX0ZhbWlseS5HZXRMZW5ndGgoKSA9PSAwKSB7DQorICAgIHdzRmFtaWx5ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChtX3BGb250LT5HZXRGYW1pbHlOYW1lKCkpOw0KKyAgfSBlbHNlIHsNCisgICAgd3NGYW1pbHkgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKG1fcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9GYW1pbHkpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9HRUZvbnQ6OkdldFBzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSBjb25zdCB7DQorICB3c05hbWUgPSBtX3BGb250LT5HZXRQc05hbWUoKTsNCit9DQorRlhfRFdPUkQgQ0ZYX0dFRm9udDo6R2V0Rm9udFN0eWxlcygpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChtX3BGb250ICE9IE5VTEwpOw0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICBpZiAobV9iVXNlTG9nRm9udFN0eWxlKSB7DQorICAgIHJldHVybiBtX2R3TG9nRm9udFN0eWxlOw0KKyAgfQ0KKyNlbmRpZg0KKyAgRlhfRFdPUkQgZHdTdHlsZXMgPSAwOw0KKyAgaWYgKG1fcEZvbnQtPm1fcFN1YnN0Rm9udCA9PSBOVUxMKSB7DQorICAgIGlmIChtX3BGb250LT5Jc0JvbGQoKSkgew0KKyAgICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOw0KICAgICB9DQotICAgIGlmIChwRXh0Rm9udCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIGlmIChtX3BGb250LT5Jc0l0YWxpYygpKSB7DQorICAgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9XZWlnaHQgPT0gRlhGT05UX0ZXX0JPTEQpIHsNCisgICAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfQm9sZDsNCisgICAgfQ0KKyAgICBpZiAobV9wRm9udC0+bV9wU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfSVRBTElDKSB7DQorICAgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGR3U3R5bGVzOw0KK30NCitGWF9CT09MIENGWF9HRUZvbnQ6OkdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUpIHsNCisgIHJldHVybiBHZXRDaGFyV2lkdGgod1VuaWNvZGUsIGlXaWR0aCwgVFJVRSwgYkNoYXJDb2RlKTsNCit9DQorRlhfQk9PTCBDRlhfR0VGb250OjpHZXRDaGFyV2lkdGgoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcENoYXJXaWR0aE1hcCAhPSBOVUxMKTsNCisgIGlXaWR0aCA9IG1fcENoYXJXaWR0aE1hcC0+R2V0QXQod1VuaWNvZGUsIDApOw0KKyAgaWYgKGlXaWR0aCA8IDEpIHsNCisgICAgaWYgKCFtX3BQcm92aWRlciB8fA0KKyAgICAgICAgIW1fcFByb3ZpZGVyLT5HZXRDaGFyV2lkdGgodGhpcywgd1VuaWNvZGUsIGlXaWR0aCwgYkNoYXJDb2RlKSkgew0KKyAgICAgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICAgICAgaW50MzJfdCBpR2x5cGggPSBHZXRHbHlwaEluZGV4KHdVbmljb2RlLCBUUlVFLCAmcEZvbnQsIGJDaGFyQ29kZSk7DQorICAgICAgaWYgKGlHbHlwaCAhPSAweEZGRkYgJiYgcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgaWYgKHBGb250ID09IChJRlhfRm9udCopdGhpcykgew0KKyAgICAgICAgICBpV2lkdGggPSBtX3BGb250LT5HZXRHbHlwaFdpZHRoKGlHbHlwaCk7DQorICAgICAgICAgIGlmIChpV2lkdGggPCAwKSB7DQorICAgICAgICAgICAgaVdpZHRoID0gLTE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoKChDRlhfR0VGb250KilwRm9udCkNCisgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0Q2hhcldpZHRoKHdVbmljb2RlLCBpV2lkdGgsIEZBTFNFLCBiQ2hhckNvZGUpKSB7DQorICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpV2lkdGggPSAtMTsNCisgICAgICB9DQogICAgIH0NCiAgICAgTG9jaygpOw0KLSAgICBpZiAoKG1fcEZvbnQgPSBwRXh0Rm9udCkgIT0gTlVMTCkgew0KLSAgICAgICAgbV9iRXh0Rm9udCA9ICFiVGFrZU92ZXI7DQotICAgICAgICBJbml0Rm9udCgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9iRXh0Rm9udCA9IFRSVUU7DQotICAgIH0NCi0gICAgbV93Q2hhclNldCA9IDB4RkZGRjsNCisgICAgbV9wQ2hhcldpZHRoTWFwLT5TZXRBdEdyb3cod1VuaWNvZGUsIChpbnQxNl90KWlXaWR0aCk7DQogICAgIFVubG9jaygpOw0KLSAgICByZXR1cm4gbV9wRm9udCAhPSBOVUxMOw0KKyAgfSBlbHNlIGlmIChpV2lkdGggPT0gNjU1MzUpIHsNCisgICAgaVdpZHRoID0gLTE7DQorICB9DQorICByZXR1cm4gaVdpZHRoID4gMDsNCiB9DQotdm9pZCBDRlhfR0VGb250OjpJbml0Rm9udCgpDQotew0KLSAgICBpZiAobV9wRm9udCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1fcEZvbnRFbmNvZGluZyA9PSBOVUxMKSB7DQotI2lmZGVmIEZYRk1fRU5DT0RJTkdfTk9ORQ0KLSAgICAgICAgbV9wRm9udEVuY29kaW5nID0gRlhfQ3JlYXRlRm9udEVuY29kaW5nRXgobV9wRm9udCk7DQotI2Vsc2UNCi0gICAgICAgIG1fcEZvbnRFbmNvZGluZyA9IEZYR0VfQ3JlYXRlVW5pY29kZUVuY29kaW5nKG1fcEZvbnQpOw0KLSNlbmRpZg0KLSAgICB9DQotICAgIGlmIChtX3BDaGFyV2lkdGhNYXAgPT0gTlVMTCkgew0KLSAgICAgICAgbV9wQ2hhcldpZHRoTWFwID0gbmV3IENGWF9Xb3JkRGlzY3JldGVBcnJheSgxMDI0KTsNCi0gICAgfQ0KLSAgICBpZiAobV9wUmVjdEFycmF5ID09IE5VTEwpIHsNCi0gICAgICAgIG1fcFJlY3RBcnJheSA9IG5ldyBDRlhfUmVjdE1hc3NBcnJheSgxNik7DQotICAgIH0NCi0gICAgaWYgKG1fcEJCb3hNYXAgPT0gTlVMTCkgew0KLSAgICAgICAgbV9wQkJveE1hcCA9IEZYX05FVyBDRlhfTWFwUHRyVG9QdHIoMTYpOw0KLSAgICB9DQorRlhfQk9PTCBDRlhfR0VGb250OjpHZXRDaGFyQkJveChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0JiBiYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUpIHsNCisgIHJldHVybiBHZXRDaGFyQkJveCh3VW5pY29kZSwgYmJveCwgVFJVRSwgYkNoYXJDb2RlKTsNCiB9DQotSUZYX0ZvbnQqIENGWF9HRUZvbnQ6OkRlcml2ZShGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlICkNCi17DQotICAgIGlmIChHZXRGb250U3R5bGVzKCkgPT0gZHdGb250U3R5bGVzKSB7DQotICAgICAgICByZXR1cm4gUmV0YWluKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZYX05FVyBDRlhfR0VGb250KCp0aGlzLCBkd0ZvbnRTdHlsZXMpOw0KLX0NCi11aW50OF90IENGWF9HRUZvbnQ6OkdldENoYXJTZXQoKSBjb25zdA0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCk7DQotICAgIGlmIChtX3dDaGFyU2V0ICE9IDB4RkZGRikgew0KLSAgICAgICAgcmV0dXJuICh1aW50OF90KW1fd0NoYXJTZXQ7DQotICAgIH0NCi0gICAgaWYgKG1fcEZvbnQtPm1fcFN1YnN0Rm9udCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRlhfQ0hBUlNFVF9EZWZhdWx0Ow0KLSAgICB9DQotICAgIHJldHVybiBtX3BGb250LT5tX3BTdWJzdEZvbnQtPm1fQ2hhcnNldDsNCi19DQotdm9pZCBDRlhfR0VGb250OjpHZXRGYW1pbHlOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0ZhbWlseSkgY29uc3QNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BGb250ICE9IE5VTEwpOw0KLSAgICBpZiAobV9wRm9udC0+bV9wU3Vic3RGb250ID09IE5VTEwgfHwgbV9wRm9udC0+bV9wU3Vic3RGb250LT5tX0ZhbWlseS5HZXRMZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICB3c0ZhbWlseSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwobV9wRm9udC0+R2V0RmFtaWx5TmFtZSgpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHdzRmFtaWx5ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChtX3BGb250LT5tX3BTdWJzdEZvbnQtPm1fRmFtaWx5KTsNCi0gICAgfQ0KLX0NCi12b2lkIENGWF9HRUZvbnQ6OkdldFBzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NOYW1lKSBjb25zdA0KLXsNCi0gICAgd3NOYW1lID0gbV9wRm9udC0+R2V0UHNOYW1lKCk7DQotfQ0KLUZYX0RXT1JEIENGWF9HRUZvbnQ6OkdldEZvbnRTdHlsZXMoKSBjb25zdA0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCk7DQotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgaWYgKG1fYlVzZUxvZ0ZvbnRTdHlsZSkgew0KLSAgICAgICAgcmV0dXJuIG1fZHdMb2dGb250U3R5bGU7DQotICAgIH0NCi0jZW5kaWYNCi0gICAgRlhfRFdPUkQgZHdTdHlsZXMgPSAwOw0KLSAgICBpZiAobV9wRm9udC0+bV9wU3Vic3RGb250ID09IE5VTEwpIHsNCi0gICAgICAgIGlmIChtX3BGb250LT5Jc0JvbGQoKSkgew0KLSAgICAgICAgICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOw0KK0ZYX0JPT0wgQ0ZYX0dFRm9udDo6R2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdCYgYmJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlKSB7DQorICBGWFNZU19hc3NlcnQobV9wUmVjdEFycmF5ICE9IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcEJCb3hNYXAgIT0gTlVMTCk7DQorICB2b2lkKiBwUmVjdCA9IE5VTEw7DQorICBpZiAoIW1fcEJCb3hNYXAtPkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdCl3VW5pY29kZSwgcFJlY3QpKSB7DQorICAgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICAgIGludDMyX3QgaUdseXBoID0gR2V0R2x5cGhJbmRleCh3VW5pY29kZSwgVFJVRSwgJnBGb250LCBiQ2hhckNvZGUpOw0KKyAgICBpZiAoaUdseXBoICE9IDB4RkZGRiAmJiBwRm9udCAhPSBOVUxMKSB7DQorICAgICAgaWYgKHBGb250ID09IChJRlhfRm9udCopdGhpcykgew0KKyAgICAgICAgRlhfUkVDVCBydEJCb3g7DQorICAgICAgICBpZiAobV9wRm9udC0+R2V0R2x5cGhCQm94KGlHbHlwaCwgcnRCQm94KSkgew0KKyAgICAgICAgICBMb2NrKCk7DQorICAgICAgICAgIENGWF9SZWN0IHJ0Ow0KKyAgICAgICAgICBydC5TZXQocnRCQm94LmxlZnQsIHJ0QkJveC50b3AsIHJ0QkJveC5XaWR0aCgpLCBydEJCb3guSGVpZ2h0KCkpOw0KKyAgICAgICAgICBpbnQzMl90IGluZGV4ID0gbV9wUmVjdEFycmF5LT5BZGQocnQpOw0KKyAgICAgICAgICBwUmVjdCA9IG1fcFJlY3RBcnJheS0+R2V0UHRyQXQoaW5kZXgpOw0KKyAgICAgICAgICBtX3BCQm94TWFwLT5TZXRBdCgodm9pZCopKHVpbnRwdHJfdCl3VW5pY29kZSwgcFJlY3QpOw0KKyAgICAgICAgICBVbmxvY2soKTsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmIChtX3BGb250LT5Jc0l0YWxpYygpKSB7DQotICAgICAgICAgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChtX3BGb250LT5tX3BTdWJzdEZvbnQtPm1fV2VpZ2h0ID09IEZYRk9OVF9GV19CT0xEKSB7DQotICAgICAgICAgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX0JvbGQ7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wRm9udC0+bV9wU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfSVRBTElDKSB7DQotICAgICAgICAgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCi0gICAgICAgIH0NCisgICAgICB9IGVsc2UgaWYgKCgoQ0ZYX0dFRm9udCopcEZvbnQpDQorICAgICAgICAgICAgICAgICAgICAgLT5HZXRDaGFyQkJveCh3VW5pY29kZSwgYmJveCwgRkFMU0UsIGJDaGFyQ29kZSkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gZHdTdHlsZXM7DQorICB9DQorICBpZiAocFJlY3QgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBiYm94ID0gKihGWF9MUENSRUNUKXBSZWN0Ow0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX0dFRm9udDo6R2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLCBpbnQzMl90ICZpV2lkdGgsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KLXsNCi0gICAgcmV0dXJuIEdldENoYXJXaWR0aCh3VW5pY29kZSwgaVdpZHRoLCBUUlVFLCBiQ2hhckNvZGUpOw0KK0ZYX0JPT0wgQ0ZYX0dFRm9udDo6R2V0QkJveChDRlhfUmVjdCYgYmJveCkgew0KKyAgRlhfUkVDVCBydCgwLCAwLCAwLCAwKTsNCisgIEZYX0JPT0wgYlJldCA9IG1fcEZvbnQtPkdldEJCb3gocnQpOw0KKyAgaWYgKGJSZXQpIHsNCisgICAgYmJveC5sZWZ0ID0gcnQubGVmdDsNCisgICAgYmJveC53aWR0aCA9IHJ0LldpZHRoKCk7DQorICAgIGJib3gudG9wID0gcnQuYm90dG9tOw0KKyAgICBiYm94LmhlaWdodCA9IC1ydC5IZWlnaHQoKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KIH0NCi1GWF9CT09MIENGWF9HRUZvbnQ6OkdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwgaW50MzJfdCAmaVdpZHRoLCBGWF9CT09MIGJSZWN1cnNpdmUsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0IChtX3BDaGFyV2lkdGhNYXAgIT0gTlVMTCk7DQotICAgIGlXaWR0aCA9IG1fcENoYXJXaWR0aE1hcC0+R2V0QXQod1VuaWNvZGUsIDApOw0KLSAgICBpZiAoaVdpZHRoIDwgMSkgew0KLSAgICAgICAgaWYgKCFtX3BQcm92aWRlciB8fCAhbV9wUHJvdmlkZXItPkdldENoYXJXaWR0aCh0aGlzLCB3VW5pY29kZSwgaVdpZHRoLCBiQ2hhckNvZGUpKSB7DQotICAgICAgICAgICAgSUZYX0ZvbnQgKnBGb250ID0gTlVMTDsNCi0gICAgICAgICAgICBpbnQzMl90IGlHbHlwaCA9IEdldEdseXBoSW5kZXgod1VuaWNvZGUsIFRSVUUsICZwRm9udCwgYkNoYXJDb2RlKTsNCi0gICAgICAgICAgICBpZiAoaUdseXBoICE9IDB4RkZGRiAmJiBwRm9udCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGlmIChwRm9udCA9PSAoSUZYX0ZvbnQqKXRoaXMpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlXaWR0aCA9IG1fcEZvbnQtPkdldEdseXBoV2lkdGgoaUdseXBoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpV2lkdGggPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaVdpZHRoID0gLTE7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKChDRlhfR0VGb250KilwRm9udCktPkdldENoYXJXaWR0aCh3VW5pY29kZSwgaVdpZHRoLCBGQUxTRSwgYkNoYXJDb2RlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpV2lkdGggPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBMb2NrKCk7DQotICAgICAgICBtX3BDaGFyV2lkdGhNYXAtPlNldEF0R3Jvdyh3VW5pY29kZSwgKGludDE2X3QpaVdpZHRoKTsNCi0gICAgICAgIFVubG9jaygpOw0KLSAgICB9IGVsc2UgaWYgKGlXaWR0aCA9PSA2NTUzNSkgew0KLSAgICAgICAgaVdpZHRoID0gLTE7DQoraW50MzJfdCBDRlhfR0VGb250OjpHZXRJdGFsaWNBbmdsZSgpIGNvbnN0IHsNCisgIGlmIChtX3BGb250LT5tX3BTdWJzdEZvbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiBtX3BGb250LT5tX3BTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGU7DQorfQ0KK2ludDMyX3QgQ0ZYX0dFRm9udDo6R2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfQk9PTCBiQ2hhckNvZGUpIHsNCisgIHJldHVybiBHZXRHbHlwaEluZGV4KHdVbmljb2RlLCBUUlVFLCBOVUxMLCBiQ2hhckNvZGUpOw0KK30NCitpbnQzMl90IENGWF9HRUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqKiBwcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlKSB7DQorICBGWFNZU19hc3NlcnQobV9wRm9udEVuY29kaW5nICE9IE5VTEwpOw0KKyAgaW50MzJfdCBpR2x5cGhJbmRleCA9IG1fcEZvbnRFbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUod1VuaWNvZGUpOw0KKyAgaWYgKGlHbHlwaEluZGV4ID4gMCkgew0KKyAgICBpZiAocHBGb250ICE9IE5VTEwpIHsNCisgICAgICAqcHBGb250ID0gKElGWF9Gb250Kil0aGlzOw0KICAgICB9DQotICAgIHJldHVybiBpV2lkdGggPiAwOw0KLX0NCi1GWF9CT09MIENGWF9HRUZvbnQ6OkdldENoYXJCQm94KEZYX1dDSEFSIHdVbmljb2RlLCBDRlhfUmVjdCAmYmJveCwgRlhfQk9PTCBiQ2hhckNvZGUpDQotew0KLSAgICByZXR1cm4gR2V0Q2hhckJCb3god1VuaWNvZGUsIGJib3gsIFRSVUUsIGJDaGFyQ29kZSk7DQotfQ0KLUZYX0JPT0wgQ0ZYX0dFRm9udDo6R2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsIENGWF9SZWN0ICZiYm94LCBGWF9CT09MIGJSZWN1cnNpdmUsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcFJlY3RBcnJheSAhPSBOVUxMKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEJCb3hNYXAgIT0gTlVMTCk7DQotICAgIHZvaWQqIHBSZWN0ID0gTlVMTDsNCi0gICAgaWYgKCFtX3BCQm94TWFwLT5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3Qpd1VuaWNvZGUsIHBSZWN0KSkgew0KLSAgICAgICAgSUZYX0ZvbnQgKnBGb250ID0gTlVMTDsNCi0gICAgICAgIGludDMyX3QgaUdseXBoID0gR2V0R2x5cGhJbmRleCh3VW5pY29kZSwgVFJVRSwgJnBGb250LCBiQ2hhckNvZGUpOw0KLSAgICAgICAgaWYgKGlHbHlwaCAhPSAweEZGRkYgJiYgcEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGlmIChwRm9udCA9PSAoSUZYX0ZvbnQqKXRoaXMpIHsNCi0gICAgICAgICAgICAgICAgRlhfUkVDVCBydEJCb3g7DQotICAgICAgICAgICAgICAgIGlmIChtX3BGb250LT5HZXRHbHlwaEJCb3goaUdseXBoLCBydEJCb3gpKSB7DQotICAgICAgICAgICAgICAgICAgICBMb2NrKCk7DQotICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdCBydDsNCi0gICAgICAgICAgICAgICAgICAgIHJ0LlNldChydEJCb3gubGVmdCwgcnRCQm94LnRvcCwgcnRCQm94LldpZHRoKCksIHJ0QkJveC5IZWlnaHQoKSk7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gbV9wUmVjdEFycmF5LT5BZGQocnQpOw0KLSAgICAgICAgICAgICAgICAgICAgcFJlY3QgPSBtX3BSZWN0QXJyYXktPkdldFB0ckF0KGluZGV4KTsNCi0gICAgICAgICAgICAgICAgICAgIG1fcEJCb3hNYXAtPlNldEF0KCh2b2lkKikodWludHB0cl90KXdVbmljb2RlLCBwUmVjdCk7DQotICAgICAgICAgICAgICAgICAgICBVbmxvY2soKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKChDRlhfR0VGb250KilwRm9udCktPkdldENoYXJCQm94KHdVbmljb2RlLCBiYm94LCBGQUxTRSwgYkNoYXJDb2RlKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBSZWN0ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBiYm94ID0gKihGWF9MUENSRUNUKXBSZWN0Ow0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRlhfR0VGb250OjpHZXRCQm94KENGWF9SZWN0ICZiYm94KQ0KLXsNCi0gICAgRlhfUkVDVCBydCgwLCAwLCAwLCAwKTsNCi0gICAgRlhfQk9PTCBiUmV0ID0gbV9wRm9udC0+R2V0QkJveChydCk7DQotICAgIGlmIChiUmV0KSB7DQotICAgICAgICBiYm94LmxlZnQgPSBydC5sZWZ0Ow0KLSAgICAgICAgYmJveC53aWR0aCA9IHJ0LldpZHRoKCk7DQotICAgICAgICBiYm94LnRvcCA9IHJ0LmJvdHRvbTsNCi0gICAgICAgIGJib3guaGVpZ2h0ID0gLXJ0LkhlaWdodCgpOw0KLSAgICB9DQotICAgIHJldHVybiBiUmV0Ow0KLX0NCi1pbnQzMl90IENGWF9HRUZvbnQ6OkdldEl0YWxpY0FuZ2xlKCkgY29uc3QNCi17DQotICAgIGlmIChtX3BGb250LT5tX3BTdWJzdEZvbnQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZTsNCi19DQotaW50MzJfdCBDRlhfR0VGb250OjpHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlLCBGWF9CT09MIGJDaGFyQ29kZSkNCi17DQotICAgIHJldHVybiBHZXRHbHlwaEluZGV4KHdVbmljb2RlLCBUUlVFLCBOVUxMLCBiQ2hhckNvZGUpOw0KLX0NCi1pbnQzMl90IENGWF9HRUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0JPT0wgYlJlY3Vyc2l2ZSwgSUZYX0ZvbnQgKipwcEZvbnQsIEZYX0JPT0wgYkNoYXJDb2RlKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0IChtX3BGb250RW5jb2RpbmcgIT0gTlVMTCk7DQotICAgIGludDMyX3QgaUdseXBoSW5kZXggPSBtX3BGb250RW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHdVbmljb2RlKTsNCi0gICAgaWYgKGlHbHlwaEluZGV4ID4gMCkgew0KKyAgICByZXR1cm4gaUdseXBoSW5kZXg7DQorICB9DQorICBGR0FTX0xQQ0ZPTlRVU0IgcEZvbnRVU0IgPSBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZCh3VW5pY29kZSk7DQorICBpZiAocEZvbnRVU0IgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMHhGRkZGOw0KKyAgfQ0KKyAgRlhfV09SRCB3Qml0RmllbGQgPSBwRm9udFVTQi0+d0JpdEZpZWxkOw0KKyAgaWYgKHdCaXRGaWVsZCA+PSAxMjgpIHsNCisgICAgcmV0dXJuIDB4RkZGRjsNCisgIH0NCisgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICBtX0ZvbnRNYXBwZXIuTG9va3VwKCh2b2lkKikodWludHB0cl90KXdVbmljb2RlLCAodm9pZComKXBGb250KTsNCisgIGlmIChwRm9udCAhPSBOVUxMICYmIHBGb250ICE9IChJRlhfRm9udCopdGhpcykgew0KKyAgICBpR2x5cGhJbmRleCA9DQorICAgICAgICAoKENGWF9HRUZvbnQqKXBGb250KS0+R2V0R2x5cGhJbmRleCh3VW5pY29kZSwgRkFMU0UsIE5VTEwsIGJDaGFyQ29kZSk7DQorICAgIGlmIChpR2x5cGhJbmRleCAhPSAweEZGRkYpIHsNCisgICAgICBpbnQzMl90IGkgPSBtX1N1YnN0Rm9udHMuRmluZChwRm9udCk7DQorICAgICAgaWYgKGkgPiAtMSkgew0KKyAgICAgICAgaUdseXBoSW5kZXggfD0gKChpICsgMSkgPDwgMjQpOw0KICAgICAgICAgaWYgKHBwRm9udCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgKnBwRm9udCA9IChJRlhfRm9udCopdGhpczsNCisgICAgICAgICAgKnBwRm9udCA9IHBGb250Ow0KICAgICAgICAgfQ0KICAgICAgICAgcmV0dXJuIGlHbHlwaEluZGV4Ow0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGR0FTX0xQQ0ZPTlRVU0IgcEZvbnRVU0IgPSBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZCh3VW5pY29kZSk7DQotICAgIGlmIChwRm9udFVTQiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gMHhGRkZGOw0KLSAgICB9DQotICAgIEZYX1dPUkQgd0JpdEZpZWxkID0gcEZvbnRVU0ItPndCaXRGaWVsZDsNCi0gICAgaWYgKHdCaXRGaWVsZCA+PSAxMjgpIHsNCi0gICAgICAgIHJldHVybiAweEZGRkY7DQotICAgIH0NCi0gICAgSUZYX0ZvbnQgKnBGb250ID0gTlVMTDsNCi0gICAgbV9Gb250TWFwcGVyLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdCl3VW5pY29kZSwgKHZvaWQqJilwRm9udCk7DQotICAgIGlmIChwRm9udCAhPSBOVUxMICYmIHBGb250ICE9IChJRlhfRm9udCopdGhpcykgew0KLSAgICAgICAgaUdseXBoSW5kZXggPSAoKENGWF9HRUZvbnQqKXBGb250KS0+R2V0R2x5cGhJbmRleCh3VW5pY29kZSwgRkFMU0UsIE5VTEwsIGJDaGFyQ29kZSk7DQotICAgICAgICBpZiAoaUdseXBoSW5kZXggIT0gMHhGRkZGKSB7DQotICAgICAgICAgICAgaW50MzJfdCBpID0gbV9TdWJzdEZvbnRzLkZpbmQocEZvbnQpOw0KLSAgICAgICAgICAgIGlmIChpID4gLTEpIHsNCi0gICAgICAgICAgICAgICAgaUdseXBoSW5kZXggfD0gKChpICsgMSkgPDwgMjQpOw0KLSAgICAgICAgICAgICAgICBpZiAocHBGb250ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICpwcEZvbnQgPSBwRm9udDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gaUdseXBoSW5kZXg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChtX3BGb250TWdyICE9IE5VTEwgJiYgYlJlY3Vyc2l2ZSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGYW1pbHk7DQotICAgICAgICBHZXRGYW1pbHlOYW1lKHdzRmFtaWx5KTsNCisgIH0NCisgIGlmIChtX3BGb250TWdyICE9IE5VTEwgJiYgYlJlY3Vyc2l2ZSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0ZhbWlseTsNCisgICAgR2V0RmFtaWx5TmFtZSh3c0ZhbWlseSk7DQogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgICAgIElGWF9Gb250ICpwRm9udCA9IG1fcEZvbnRNZ3ItPkdldERlZkZvbnRCeVVuaWNvZGUod1VuaWNvZGUsIEdldEZvbnRTdHlsZXMoKSwgKGNvbnN0IEZYX1dDSEFSKil3c0ZhbWlseSk7DQorICAgIElGWF9Gb250KiBwRm9udCA9IG1fcEZvbnRNZ3ItPkdldERlZkZvbnRCeVVuaWNvZGUoDQorICAgICAgICB3VW5pY29kZSwgR2V0Rm9udFN0eWxlcygpLCAoY29uc3QgRlhfV0NIQVIqKXdzRmFtaWx5KTsNCiAjZWxzZQ0KLSAgICAgICAgSUZYX0ZvbnQgKnBGb250ID0gbV9wRm9udE1nci0+R2V0Rm9udEJ5VW5pY29kZSh3VW5pY29kZSwgR2V0Rm9udFN0eWxlcygpLCAoY29uc3QgRlhfV0NIQVIqKXdzRmFtaWx5KTsNCi0gICAgICAgIGlmIChOVUxMID09IHBGb250KSB7DQotICAgICAgICAgICAgcEZvbnQgPSBtX3BGb250TWdyLT5HZXRGb250QnlVbmljb2RlKHdVbmljb2RlLCBHZXRGb250U3R5bGVzKCksIE5VTEwpOw0KLSAgICAgICAgfQ0KKyAgICBJRlhfRm9udCogcEZvbnQgPSBtX3BGb250TWdyLT5HZXRGb250QnlVbmljb2RlKHdVbmljb2RlLCBHZXRGb250U3R5bGVzKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c0ZhbWlseSk7DQorICAgIGlmIChOVUxMID09IHBGb250KSB7DQorICAgICAgcEZvbnQgPSBtX3BGb250TWdyLT5HZXRGb250QnlVbmljb2RlKHdVbmljb2RlLCBHZXRGb250U3R5bGVzKCksIE5VTEwpOw0KKyAgICB9DQogI2VuZGlmDQotICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGlmIChwRm9udCA9PSAoSUZYX0ZvbnQqKXRoaXMpIHsNCi0gICAgICAgICAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDB4RkZGRjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9Gb250TWFwcGVyLlNldEF0KCh2b2lkKikodWludHB0cl90KXdVbmljb2RlLCAodm9pZCopcEZvbnQpOw0KLSAgICAgICAgICAgIGludDMyX3QgaSA9IG1fU3Vic3RGb250cy5HZXRTaXplKCk7DQotICAgICAgICAgICAgbV9TdWJzdEZvbnRzLkFkZChwRm9udCk7DQotICAgICAgICAgICAgaUdseXBoSW5kZXggPSAoKENGWF9HRUZvbnQqKXBGb250KS0+R2V0R2x5cGhJbmRleCh3VW5pY29kZSwgRkFMU0UsIE5VTEwsIGJDaGFyQ29kZSk7DQotICAgICAgICAgICAgaWYgKGlHbHlwaEluZGV4ICE9IDB4RkZGRikgew0KLSAgICAgICAgICAgICAgICBpR2x5cGhJbmRleCB8PSAoKGkgKyAxKSA8PCAyNCk7DQotICAgICAgICAgICAgICAgIGlmIChwcEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgKnBwRm9udCA9IHBGb250Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBpR2x5cGhJbmRleDsNCi0gICAgICAgICAgICB9DQorICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgaWYgKHBGb250ID09IChJRlhfRm9udCopdGhpcykgew0KKyAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgICAgIHJldHVybiAweEZGRkY7DQorICAgICAgfQ0KKyAgICAgIG1fRm9udE1hcHBlci5TZXRBdCgodm9pZCopKHVpbnRwdHJfdCl3VW5pY29kZSwgKHZvaWQqKXBGb250KTsNCisgICAgICBpbnQzMl90IGkgPSBtX1N1YnN0Rm9udHMuR2V0U2l6ZSgpOw0KKyAgICAgIG1fU3Vic3RGb250cy5BZGQocEZvbnQpOw0KKyAgICAgIGlHbHlwaEluZGV4ID0NCisgICAgICAgICAgKChDRlhfR0VGb250KilwRm9udCktPkdldEdseXBoSW5kZXgod1VuaWNvZGUsIEZBTFNFLCBOVUxMLCBiQ2hhckNvZGUpOw0KKyAgICAgIGlmIChpR2x5cGhJbmRleCAhPSAweEZGRkYpIHsNCisgICAgICAgIGlHbHlwaEluZGV4IHw9ICgoaSArIDEpIDw8IDI0KTsNCisgICAgICAgIGlmIChwcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAqcHBGb250ID0gcEZvbnQ7DQogICAgICAgICB9DQorICAgICAgICByZXR1cm4gaUdseXBoSW5kZXg7DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiAweEZGRkY7DQorICB9DQorICByZXR1cm4gMHhGRkZGOw0KIH0NCi1pbnQzMl90IENGWF9HRUZvbnQ6OkdldEFzY2VudCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wRm9udC0+R2V0QXNjZW50KCk7DQoraW50MzJfdCBDRlhfR0VGb250OjpHZXRBc2NlbnQoKSBjb25zdCB7DQorICByZXR1cm4gbV9wRm9udC0+R2V0QXNjZW50KCk7DQogfQ0KLWludDMyX3QgQ0ZYX0dFRm9udDo6R2V0RGVzY2VudCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wRm9udC0+R2V0RGVzY2VudCgpOw0KK2ludDMyX3QgQ0ZYX0dFRm9udDo6R2V0RGVzY2VudCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BGb250LT5HZXREZXNjZW50KCk7DQogfQ0KLXZvaWQgQ0ZYX0dFRm9udDo6UmVzZXQoKQ0KLXsNCi0gICAgTG9jaygpOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fU3Vic3RGb250cy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgSUZYX0ZvbnQgKnBGb250ID0gKElGWF9Gb250KiltX1N1YnN0Rm9udHNbaV07DQotICAgICAgICAoKENGWF9HRUZvbnQqKXBGb250KS0+UmVzZXQoKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wQ2hhcldpZHRoTWFwICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcENoYXJXaWR0aE1hcC0+UmVtb3ZlQWxsKCk7DQotICAgIH0NCi0gICAgaWYgKG1fcEJCb3hNYXAgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wQkJveE1hcC0+UmVtb3ZlQWxsKCk7DQotICAgIH0NCi0gICAgaWYgKG1fcFJlY3RBcnJheSAhPSBOVUxMKSB7DQotICAgICAgICBtX3BSZWN0QXJyYXktPlJlbW92ZUFsbCgpOw0KLSAgICB9DQotICAgIFVubG9jaygpOw0KK3ZvaWQgQ0ZYX0dFRm9udDo6UmVzZXQoKSB7DQorICBMb2NrKCk7DQorICBpbnQzMl90IGlDb3VudCA9IG1fU3Vic3RGb250cy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBJRlhfRm9udCogcEZvbnQgPSAoSUZYX0ZvbnQqKW1fU3Vic3RGb250c1tpXTsNCisgICAgKChDRlhfR0VGb250KilwRm9udCktPlJlc2V0KCk7DQorICB9DQorICBpZiAobV9wQ2hhcldpZHRoTWFwICE9IE5VTEwpIHsNCisgICAgbV9wQ2hhcldpZHRoTWFwLT5SZW1vdmVBbGwoKTsNCisgIH0NCisgIGlmIChtX3BCQm94TWFwICE9IE5VTEwpIHsNCisgICAgbV9wQkJveE1hcC0+UmVtb3ZlQWxsKCk7DQorICB9DQorICBpZiAobV9wUmVjdEFycmF5ICE9IE5VTEwpIHsNCisgICAgbV9wUmVjdEFycmF5LT5SZW1vdmVBbGwoKTsNCisgIH0NCisgIFVubG9jaygpOw0KIH0NCi1JRlhfRm9udCogQ0ZYX0dFRm9udDo6R2V0U3Vic3RGb250KGludDMyX3QgaUdseXBoSW5kZXgpIGNvbnN0DQotew0KLSAgICBpR2x5cGhJbmRleCA9ICgoRlhfRFdPUkQpaUdseXBoSW5kZXgpID4+IDI0Ow0KLSAgICByZXR1cm4gaUdseXBoSW5kZXggPT0gMCA/IChJRlhfRm9udCopdGhpcyA6IChJRlhfRm9udCopbV9TdWJzdEZvbnRzW2lHbHlwaEluZGV4IC0gMV07DQorSUZYX0ZvbnQqIENGWF9HRUZvbnQ6OkdldFN1YnN0Rm9udChpbnQzMl90IGlHbHlwaEluZGV4KSBjb25zdCB7DQorICBpR2x5cGhJbmRleCA9ICgoRlhfRFdPUkQpaUdseXBoSW5kZXgpID4+IDI0Ow0KKyAgcmV0dXJuIGlHbHlwaEluZGV4ID09IDAgPyAoSUZYX0ZvbnQqKXRoaXMNCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogKElGWF9Gb250KiltX1N1YnN0Rm9udHNbaUdseXBoSW5kZXggLSAxXTsNCiB9DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dlZm9udC5oIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dlZm9udC5oCmluZGV4IDdjNGFhNzUuLmEwYzlhYTggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZWZvbnQuaAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2Vmb250LmgKQEAgLTksNzMgKzksODIgQEAKICNpZm5kZWYgX0ZYUExVUw0KIGNsYXNzIENGWF9HRUZvbnRNZ3I7DQogI2lmbmRlZiBGWEZPTlRfU1VCU1RfSVRBTElDDQotI2RlZmluZSBGWEZPTlRfU1VCU1RfSVRBTElDCTB4MDINCisjZGVmaW5lIEZYRk9OVF9TVUJTVF9JVEFMSUMgMHgwMg0KICNlbmRpZg0KLWNsYXNzIENGWF9HRUZvbnQgOiBwdWJsaWMgSUZYX0ZvbnQsIHB1YmxpYyBDRlhfVGhyZWFkTG9jaw0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9HRUZvbnQoY29uc3QgQ0ZYX0dFRm9udCAmc3JjLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMpOw0KLSAgICBDRlhfR0VGb250KElGWF9Gb250TWdyICpwRm9udE1ncik7DQotICAgIH5DRlhfR0VGb250KCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKTsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCVJldGFpbigpOw0KLSAgICBGWF9CT09MCQkJTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UpOw0KLSAgICBGWF9CT09MCQkJTG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBsZW5ndGgpOw0KLSAgICBGWF9CT09MCQkJTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lKTsNCi0gICAgRlhfQk9PTAkJCUxvYWRGb250KElGWF9TdHJlYW0gKnBGb250U3RyZWFtLCBGWF9CT09MIGJTYXZlU3RyZWFtKTsNCi0gICAgRlhfQk9PTAkJCUxvYWRGb250KENGWF9Gb250ICpwRXh0Rm9udCwgRlhfQk9PTCBiVGFrZU92ZXIgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlEZXJpdmUoRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDApOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRGYW1pbHlOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0ZhbWlseSkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFBzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NOYW1lKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2V0Rm9udFN0eWxlcygpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHVpbnQ4X3QJCQlHZXRDaGFyU2V0KCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwgaW50MzJfdCAmaVdpZHRoLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRBc2NlbnQoKSBjb25zdDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXREZXNjZW50KCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldENoYXJCQm94KEZYX1dDSEFSIHdVbmljb2RlLCBDRlhfUmVjdCAmYmJveCwgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEJCb3goQ0ZYX1JlY3QgJmJib3gpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEl0YWxpY0FuZ2xlKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlc2V0KCk7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXRTdWJzdEZvbnQoaW50MzJfdCBpR2x5cGhJbmRleCkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZCoJCQlHZXREZXZGb250KCljb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHZvaWQqKW1fcEZvbnQ7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0Rm9udFByb3ZpZGVyKElGWF9Gb250UHJvdmlkZXIqIHBQcm92aWRlcikNCi0gICAgew0KLSAgICAgICAgbV9wUHJvdmlkZXIgPSBwUHJvdmlkZXI7DQotICAgIH0NCitjbGFzcyBDRlhfR0VGb250IDogcHVibGljIElGWF9Gb250LCBwdWJsaWMgQ0ZYX1RocmVhZExvY2sgew0KKyBwdWJsaWM6DQorICBDRlhfR0VGb250KGNvbnN0IENGWF9HRUZvbnQmIHNyYywgRlhfRFdPUkQgZHdGb250U3R5bGVzKTsNCisgIENGWF9HRUZvbnQoSUZYX0ZvbnRNZ3IqIHBGb250TWdyKTsNCisgIH5DRlhfR0VGb250KCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogUmV0YWluKCk7DQorICBGWF9CT09MIExvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKTsNCisgIEZYX0JPT0wgTG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBsZW5ndGgpOw0KKyAgRlhfQk9PTCBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUpOw0KKyAgRlhfQk9PTCBMb2FkRm9udChJRlhfU3RyZWFtKiBwRm9udFN0cmVhbSwgRlhfQk9PTCBiU2F2ZVN0cmVhbSk7DQorICBGWF9CT09MIExvYWRGb250KENGWF9Gb250KiBwRXh0Rm9udCwgRlhfQk9PTCBiVGFrZU92ZXIgPSBGQUxTRSk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBEZXJpdmUoRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDApOw0KKyAgdmlydHVhbCB2b2lkIEdldEZhbWlseU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRmFtaWx5KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRQc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldEZvbnRTdHlsZXMoKSBjb25zdDsNCisgIHZpcnR1YWwgdWludDhfdCBHZXRDaGFyU2V0KCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEFzY2VudCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldERlc2NlbnQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDaGFyQkJveChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdCYgYmJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCQm94KENGWF9SZWN0JiBiYm94KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJdGFsaWNBbmdsZSgpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIFJlc2V0KCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXRTdWJzdEZvbnQoaW50MzJfdCBpR2x5cGhJbmRleCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQqIEdldERldkZvbnQoKSBjb25zdCB7IHJldHVybiAodm9pZCopbV9wRm9udDsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRQcm92aWRlcihJRlhfRm9udFByb3ZpZGVyKiBwUHJvdmlkZXIpIHsNCisgICAgbV9wUHJvdmlkZXIgPSBwUHJvdmlkZXI7DQorICB9DQogI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0TG9naWNhbEZvbnRTdHlsZShGWF9EV09SRCBkd0xvZ0ZvbnRTdHlsZSkNCi0gICAgew0KLSAgICAgICAgbV9iVXNlTG9nRm9udFN0eWxlID0gVFJVRTsNCi0gICAgICAgIG1fZHdMb2dGb250U3R5bGUgPSBkd0xvZ0ZvbnRTdHlsZTsNCi0gICAgfTsNCisgIHZpcnR1YWwgdm9pZCBTZXRMb2dpY2FsRm9udFN0eWxlKEZYX0RXT1JEIGR3TG9nRm9udFN0eWxlKSB7DQorICAgIG1fYlVzZUxvZ0ZvbnRTdHlsZSA9IFRSVUU7DQorICAgIG1fZHdMb2dGb250U3R5bGUgPSBkd0xvZ0ZvbnRTdHlsZTsNCisgIH07DQogI2VuZGlmDQotcHJvdGVjdGVkOg0KKyBwcm90ZWN0ZWQ6DQogI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgRlhfQk9PTAkJCQkJbV9iVXNlTG9nRm9udFN0eWxlOw0KLSAgICBGWF9EV09SRAkJCQltX2R3TG9nRm9udFN0eWxlOw0KKyAgRlhfQk9PTCBtX2JVc2VMb2dGb250U3R5bGU7DQorICBGWF9EV09SRCBtX2R3TG9nRm9udFN0eWxlOw0KICNlbmRpZg0KLSAgICBDRlhfRm9udAkJCQkqbV9wRm9udDsNCi0gICAgSUZYX0ZvbnRNZ3IJCQkJKm1fcEZvbnRNZ3I7DQotICAgIGludDMyX3QJCQkJbV9pUmVmQ291bnQ7DQotICAgIEZYX0JPT0wJCQkJCW1fYkV4dEZvbnQ7DQotICAgIElGWF9TdHJlYW0JCQkJKm1fcFN0cmVhbTsNCi0gICAgSUZYX0ZpbGVSZWFkCQkJKm1fcEZpbGVSZWFkOw0KLSAgICBJRlhfRm9udEVuY29kaW5nCQkqbV9wRm9udEVuY29kaW5nOw0KLSAgICBDRlhfV29yZERpc2NyZXRlQXJyYXkJKm1fcENoYXJXaWR0aE1hcDsNCi0gICAgQ0ZYX1JlY3RNYXNzQXJyYXkJCSptX3BSZWN0QXJyYXk7DQotICAgIENGWF9NYXBQdHJUb1B0cgkJCSptX3BCQm94TWFwOw0KLSAgICBJRlhfRm9udFByb3ZpZGVyCQkqbV9wUHJvdmlkZXI7DQotICAgIEZYX1dPUkQJCQkJCW1fd0NoYXJTZXQ7DQotICAgIENGWF9QdHJBcnJheQkJbV9TdWJzdEZvbnRzOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCW1fRm9udE1hcHBlcjsNCi0gICAgdm9pZAkJCUluaXRGb250KCk7DQotICAgIEZYX0JPT0wJCUdldENoYXJCQm94KEZYX1dDSEFSIHdVbmljb2RlLCBDRlhfUmVjdCAmYmJveCwgRlhfQk9PTCBiUmVjdXJzaXZlLCBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCi0gICAgRlhfQk9PTAkJR2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLCBpbnQzMl90ICZpV2lkdGgsIEZYX0JPT0wgYlJlY3Vyc2l2ZSwgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQotICAgIGludDMyX3QJR2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfQk9PTCBiUmVjdXJzaXZlLCBJRlhfRm9udCAqKnBwRm9udCwgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQorICBDRlhfRm9udCogbV9wRm9udDsNCisgIElGWF9Gb250TWdyKiBtX3BGb250TWdyOw0KKyAgaW50MzJfdCBtX2lSZWZDb3VudDsNCisgIEZYX0JPT0wgbV9iRXh0Rm9udDsNCisgIElGWF9TdHJlYW0qIG1fcFN0cmVhbTsNCisgIElGWF9GaWxlUmVhZCogbV9wRmlsZVJlYWQ7DQorICBJRlhfRm9udEVuY29kaW5nKiBtX3BGb250RW5jb2Rpbmc7DQorICBDRlhfV29yZERpc2NyZXRlQXJyYXkqIG1fcENoYXJXaWR0aE1hcDsNCisgIENGWF9SZWN0TWFzc0FycmF5KiBtX3BSZWN0QXJyYXk7DQorICBDRlhfTWFwUHRyVG9QdHIqIG1fcEJCb3hNYXA7DQorICBJRlhfRm9udFByb3ZpZGVyKiBtX3BQcm92aWRlcjsNCisgIEZYX1dPUkQgbV93Q2hhclNldDsNCisgIENGWF9QdHJBcnJheSBtX1N1YnN0Rm9udHM7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9Gb250TWFwcGVyOw0KKyAgdm9pZCBJbml0Rm9udCgpOw0KKyAgRlhfQk9PTCBHZXRDaGFyQkJveChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3QmIGJib3gsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQorICBGWF9CT09MIEdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgaW50MzJfdCBHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udCoqIHBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCiB9Ow0KICNlbmRpZg0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmNwcAppbmRleCAzNTY5Zjc4Li5iYzZiM2U3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfc3RkZm9udG1nci5jcHAKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X3N0ZGZvbnRtZ3IuY3BwCkBAIC04LDE0ODMgKzgsMTQ4OCBAQAogI2luY2x1ZGUgImZ4X3N0ZGZvbnRtZ3IuaCINCiAjaW5jbHVkZSAiZnhfZm9udHV0aWxzLmgiDQogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi1JRlhfRm9udE1nciogSUZYX0ZvbnRNZ3I6OkNyZWF0ZShGWF9MUEVudW1BbGxGb250cyBwRW51bWVyYXRvciwgRlhfTFBNYXRjaEZvbnQgcE1hdGNoZXIgLCB2b2lkKiBwVXNlckRhdGEgKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDRlhfU3RkRm9udE1nckltcChwRW51bWVyYXRvciwgcE1hdGNoZXIsIHBVc2VyRGF0YSk7DQorSUZYX0ZvbnRNZ3IqIElGWF9Gb250TWdyOjpDcmVhdGUoRlhfTFBFbnVtQWxsRm9udHMgcEVudW1lcmF0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBNYXRjaEZvbnQgcE1hdGNoZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKSB7DQorICByZXR1cm4gRlhfTkVXIENGWF9TdGRGb250TWdySW1wKHBFbnVtZXJhdG9yLCBwTWF0Y2hlciwgcFVzZXJEYXRhKTsNCiB9DQotQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkNGWF9TdGRGb250TWdySW1wKEZYX0xQRW51bUFsbEZvbnRzIHBFbnVtZXJhdG9yLCBGWF9MUE1hdGNoRm9udCBwTWF0Y2hlciwgdm9pZCogcFVzZXJEYXRhKQ0KLSAgICA6IG1fcE1hdGNoZXIocE1hdGNoZXIpDQotICAgICwgbV9wRW51bWVyYXRvcihwRW51bWVyYXRvcikNCi0gICAgLCBtX0ZvbnRGYWNlcygpDQotICAgICwgbV9Gb250cygpDQotICAgICwgbV9DUEZvbnRzKDgpDQotICAgICwgbV9GYW1pbHlGb250cygxNikNCi0gICAgLCBtX1VuaWNvZGVGb250cygxNikNCi0gICAgLCBtX0J1ZmZlckZvbnRzKDQpDQotICAgICwgbV9GaWxlRm9udHMoNCkNCi0gICAgLCBtX1N0cmVhbUZvbnRzKDQpDQotICAgICwgbV9EZXJpdmVGb250cyg0KQ0KLSAgICAsIG1fcFVzZXJEYXRhKHBVc2VyRGF0YSkNCi17DQotICAgIGlmIChtX3BFbnVtZXJhdG9yICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcEVudW1lcmF0b3IobV9Gb250RmFjZXMsIG1fcFVzZXJEYXRhLCBOVUxMLCAweEZFRkYpOw0KLSAgICB9DQotICAgIGlmIChtX3BNYXRjaGVyID09IE5VTEwpIHsNCi0gICAgICAgIG1fcE1hdGNoZXIgPSBGWF9EZWZGb250TWF0Y2hlcjsNCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQobV9wTWF0Y2hlciAhPSBOVUxMKTsNCitDRlhfU3RkRm9udE1nckltcDo6Q0ZYX1N0ZEZvbnRNZ3JJbXAoRlhfTFBFbnVtQWxsRm9udHMgcEVudW1lcmF0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQTWF0Y2hGb250IHBNYXRjaGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpDQorICAgIDogbV9wTWF0Y2hlcihwTWF0Y2hlciksDQorICAgICAgbV9wRW51bWVyYXRvcihwRW51bWVyYXRvciksDQorICAgICAgbV9Gb250RmFjZXMoKSwNCisgICAgICBtX0ZvbnRzKCksDQorICAgICAgbV9DUEZvbnRzKDgpLA0KKyAgICAgIG1fRmFtaWx5Rm9udHMoMTYpLA0KKyAgICAgIG1fVW5pY29kZUZvbnRzKDE2KSwNCisgICAgICBtX0J1ZmZlckZvbnRzKDQpLA0KKyAgICAgIG1fRmlsZUZvbnRzKDQpLA0KKyAgICAgIG1fU3RyZWFtRm9udHMoNCksDQorICAgICAgbV9EZXJpdmVGb250cyg0KSwNCisgICAgICBtX3BVc2VyRGF0YShwVXNlckRhdGEpIHsNCisgIGlmIChtX3BFbnVtZXJhdG9yICE9IE5VTEwpIHsNCisgICAgbV9wRW51bWVyYXRvcihtX0ZvbnRGYWNlcywgbV9wVXNlckRhdGEsIE5VTEwsIDB4RkVGRik7DQorICB9DQorICBpZiAobV9wTWF0Y2hlciA9PSBOVUxMKSB7DQorICAgIG1fcE1hdGNoZXIgPSBGWF9EZWZGb250TWF0Y2hlcjsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChtX3BNYXRjaGVyICE9IE5VTEwpOw0KIH0NCi1DRlhfU3RkRm9udE1nckltcDo6fkNGWF9TdGRGb250TWdySW1wKCkNCi17DQotICAgIG1fRm9udEZhY2VzLlJlbW92ZUFsbCgpOw0KLSAgICBtX0NQRm9udHMuUmVtb3ZlQWxsKCk7DQotICAgIG1fRmFtaWx5Rm9udHMuUmVtb3ZlQWxsKCk7DQotICAgIG1fVW5pY29kZUZvbnRzLlJlbW92ZUFsbCgpOw0KLSAgICBtX0J1ZmZlckZvbnRzLlJlbW92ZUFsbCgpOw0KLSAgICBtX0ZpbGVGb250cy5SZW1vdmVBbGwoKTsNCi0gICAgbV9TdHJlYW1Gb250cy5SZW1vdmVBbGwoKTsNCi0gICAgbV9EZXJpdmVGb250cy5SZW1vdmVBbGwoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSBtX0ZvbnRzLkdldFVwcGVyQm91bmQoKTsgaSA+PSAwOyBpLS0pIHsNCi0gICAgICAgIElGWF9Gb250ICpwRm9udCA9IChJRlhfRm9udCopbV9Gb250c1tpXTsNCi0gICAgICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX0ZvbnRzLlJlbW92ZUFsbCgpOw0KLX0NCi1JRlhfRm9udCogQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkdldERlZkZvbnRCeUNvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdIYXNoID0gRkdBU19HZXRGb250SGFzaENvZGUod0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMpOw0KLSAgICBJRlhfRm9udCAqcEZvbnQgPSBOVUxMOw0KLSAgICBpZiAobV9DUEZvbnRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKiYpcEZvbnQpKSB7DQotICAgICAgICByZXR1cm4gcEZvbnQgPyBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpIDogTlVMTDsNCi0gICAgfQ0KLSAgICBGWF9MUENGT05UREVTQ1JJUFRPUiBwRkQ7DQotICAgIGlmICgocEZEID0gRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBUUlVFLCB3Q29kZVBhZ2UpKSA9PSBOVUxMKQ0KLSAgICAgICAgaWYgKChwRkQgPSBGaW5kRm9udChOVUxMLCBkd0ZvbnRTdHlsZXMsIFRSVUUsIHdDb2RlUGFnZSkpID09IE5VTEwpDQotICAgICAgICAgICAgaWYgKChwRkQgPSBGaW5kRm9udChOVUxMLCBkd0ZvbnRTdHlsZXMsIEZBTFNFLCB3Q29kZVBhZ2UpKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgRlhTWVNfYXNzZXJ0KHBGRCAhPSBOVUxMKTsNCi0gICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEZELT53c0ZvbnRGYWNlLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSwgdGhpcyk7DQorQ0ZYX1N0ZEZvbnRNZ3JJbXA6On5DRlhfU3RkRm9udE1nckltcCgpIHsNCisgIG1fRm9udEZhY2VzLlJlbW92ZUFsbCgpOw0KKyAgbV9DUEZvbnRzLlJlbW92ZUFsbCgpOw0KKyAgbV9GYW1pbHlGb250cy5SZW1vdmVBbGwoKTsNCisgIG1fVW5pY29kZUZvbnRzLlJlbW92ZUFsbCgpOw0KKyAgbV9CdWZmZXJGb250cy5SZW1vdmVBbGwoKTsNCisgIG1fRmlsZUZvbnRzLlJlbW92ZUFsbCgpOw0KKyAgbV9TdHJlYW1Gb250cy5SZW1vdmVBbGwoKTsNCisgIG1fRGVyaXZlRm9udHMuUmVtb3ZlQWxsKCk7DQorICBmb3IgKGludDMyX3QgaSA9IG1fRm9udHMuR2V0VXBwZXJCb3VuZCgpOyBpID49IDA7IGktLSkgew0KKyAgICBJRlhfRm9udCogcEZvbnQgPSAoSUZYX0ZvbnQqKW1fRm9udHNbaV07DQogICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQotICAgICAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQotICAgICAgICBtX0NQRm9udHMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZCopcEZvbnQpOw0KLSAgICAgICAgZHdIYXNoID0gRkdBU19HZXRGb250RmFtaWx5SGFzaChwRkQtPndzRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCi0gICAgICAgIG1fRmFtaWx5Rm9udHMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZCopcEZvbnQpOw0KLSAgICAgICAgcmV0dXJuIExvYWRGb250KHBGb250LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIG1fRm9udHMuUmVtb3ZlQWxsKCk7DQogfQ0KLUlGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6R2V0RGVmRm9udEJ5Q2hhcnNldCh1aW50OF90IG5DaGFyc2V0LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KQ0KLXsNCi0gICAgcmV0dXJuIEdldERlZkZvbnRCeUNvZGVQYWdlKEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQobkNoYXJzZXQpLCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6R2V0RGVmRm9udEJ5Q29kZVBhZ2UoDQorICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7DQorICBGWF9EV09SRCBkd0hhc2ggPSBGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgaWYgKG1fQ1BGb250cy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZComKXBGb250KSkgew0KKyAgICByZXR1cm4gcEZvbnQgPyBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpIDogTlVMTDsNCisgIH0NCisgIEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBGRDsNCisgIGlmICgocEZEID0gRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBUUlVFLCB3Q29kZVBhZ2UpKSA9PSBOVUxMKQ0KKyAgICBpZiAoKHBGRCA9IEZpbmRGb250KE5VTEwsIGR3Rm9udFN0eWxlcywgVFJVRSwgd0NvZGVQYWdlKSkgPT0gTlVMTCkNCisgICAgICBpZiAoKHBGRCA9IEZpbmRGb250KE5VTEwsIGR3Rm9udFN0eWxlcywgRkFMU0UsIHdDb2RlUGFnZSkpID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgIEZYU1lTX2Fzc2VydChwRkQgIT0gTlVMTCk7DQorICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChwRkQtPndzRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlLCB0aGlzKTsNCisgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgIG1fRm9udHMuQWRkKHBGb250KTsNCisgICAgbV9DUEZvbnRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCisgICAgZHdIYXNoID0gRkdBU19HZXRGb250RmFtaWx5SGFzaChwRkQtPndzRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgbV9GYW1pbHlGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6R2V0RGVmRm9udEJ5Q2hhcnNldCgNCisgICAgdWludDhfdCBuQ2hhcnNldCwNCisgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSkgew0KKyAgcmV0dXJuIEdldERlZkZvbnRCeUNvZGVQYWdlKEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQobkNoYXJzZXQpLCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN6Rm9udEZhbWlseSk7DQogfQ0KICNkZWZpbmUgX0ZYX1VTRUdBU0ZPTlRNR1JfDQotSUZYX0ZvbnQqIENGWF9TdGRGb250TWdySW1wOjpHZXREZWZGb250QnlVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KQ0KLXsNCi0gICAgRkdBU19MUENGT05UVVNCIHBSZXQgPSBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZCh3VW5pY29kZSk7DQotICAgIGlmIChwUmV0LT53Qml0RmllbGQgPT0gOTk5KSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBkd0hhc2ggPSBGR0FTX0dldEZvbnRGYW1pbHlIYXNoKHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgcFJldC0+d0JpdEZpZWxkKTsNCi0gICAgSUZYX0ZvbnQgKnBGb250ID0gTlVMTDsNCi0gICAgaWYgKG1fVW5pY29kZUZvbnRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKiYpcEZvbnQpKSB7DQotICAgICAgICByZXR1cm4gcEZvbnQgPyBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCBwUmV0LT53Q29kZVBhZ2UpIDogTlVMTDsNCi0gICAgfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6R2V0RGVmRm9udEJ5VW5pY29kZSgNCisgICAgRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkpIHsNCisgIEZHQVNfTFBDRk9OVFVTQiBwUmV0ID0gRkdBU19HZXRVbmljb2RlQml0RmllbGQod1VuaWNvZGUpOw0KKyAgaWYgKHBSZXQtPndCaXRGaWVsZCA9PSA5OTkpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBGWF9EV09SRCBkd0hhc2ggPQ0KKyAgICAgIEZHQVNfR2V0Rm9udEZhbWlseUhhc2gocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBwUmV0LT53Qml0RmllbGQpOw0KKyAgSUZYX0ZvbnQqIHBGb250ID0gTlVMTDsNCisgIGlmIChtX1VuaWNvZGVGb250cy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZComKXBGb250KSkgew0KKyAgICByZXR1cm4gcEZvbnQgPyBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCBwUmV0LT53Q29kZVBhZ2UpIDogTlVMTDsNCisgIH0NCiAjaWZkZWYgX0ZYX1VTRUdBU0ZPTlRNR1JfDQotICAgIEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBGRCA9IEZpbmRGb250KHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgRkFMU0UsIHBSZXQtPndDb2RlUGFnZSwgcFJldC0+d0JpdEZpZWxkLCB3VW5pY29kZSk7DQotICAgIGlmIChwRkQgPT0gTlVMTCAmJiBwc3pGb250RmFtaWx5KSB7DQotICAgICAgICBwRkQgPSBGaW5kRm9udChOVUxMLCBkd0ZvbnRTdHlsZXMsIEZBTFNFLCBwUmV0LT53Q29kZVBhZ2UsIHBSZXQtPndCaXRGaWVsZCwgd1VuaWNvZGUpOw0KLSAgICB9DQotICAgIGlmIChwRkQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgRlhTWVNfYXNzZXJ0KHBGRCk7DQotICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldChwRkQtPnVDaGFyU2V0KTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBGb250RmFjZSA9IHBGRC0+d3NGb250RmFjZTsNCi0gICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEZvbnRGYWNlLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSwgdGhpcyk7DQorICBGWF9MUENGT05UREVTQ1JJUFRPUiBwRkQgPQ0KKyAgICAgIEZpbmRGb250KHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgRkFMU0UsIHBSZXQtPndDb2RlUGFnZSwNCisgICAgICAgICAgICAgICBwUmV0LT53Qml0RmllbGQsIHdVbmljb2RlKTsNCisgIGlmIChwRkQgPT0gTlVMTCAmJiBwc3pGb250RmFtaWx5KSB7DQorICAgIHBGRCA9IEZpbmRGb250KE5VTEwsIGR3Rm9udFN0eWxlcywgRkFMU0UsIHBSZXQtPndDb2RlUGFnZSwgcFJldC0+d0JpdEZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICB3VW5pY29kZSk7DQorICB9DQorICBpZiAocEZEID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBGWFNZU19hc3NlcnQocEZEKTsNCisgIEZYX1dPUkQgd0NvZGVQYWdlID0gRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldChwRkQtPnVDaGFyU2V0KTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwRm9udEZhY2UgPSBwRkQtPndzRm9udEZhY2U7DQorICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChwRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlLCB0aGlzKTsNCiAjZWxzZQ0KLSAgICBDRlhfRm9udE1hcHBlciogcEJ1aWx0aW5NYXBwZXIgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fcEJ1aWx0aW5NYXBwZXI7DQotICAgIGlmIChwQnVpbHRpbk1hcHBlciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlXZWlnaHQgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMOw0KLSAgICBpbnQgaXRhbGljX2FuZ2xlID0gMDsNCi0gICAgRlhGVF9GYWNlIGZ0RmFjZSA9IHBCdWlsdGluTWFwcGVyLT5GaW5kU3Vic3RGb250QnlVbmljb2RlKHdVbmljb2RlLCBkd0ZvbnRTdHlsZXMsIGlXZWlnaHQsIGl0YWxpY19hbmdsZSk7DQotICAgIGlmIChmdEZhY2UgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0ZYX0ZvbnQqIHBGWEZvbnQgPSBGWF9ORVcgQ0ZYX0ZvbnQ7DQotICAgIGlmIChwRlhGb250ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHBGWEZvbnQtPm1fRmFjZSA9IGZ0RmFjZTsNCi0gICAgcEZYRm9udC0+bV9wRm9udERhdGEgPSBGWEZUX0dldF9GYWNlX1N0cmVhbV9CYXNlKGZ0RmFjZSk7DQotICAgIHBGWEZvbnQtPm1fZHdTaXplID0gRlhGVF9HZXRfRmFjZV9TdHJlYW1fU2l6ZShmdEZhY2UpOw0KLSAgICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChwRlhGb250LCB0aGlzKTsNCi0gICAgRlhfV09SRCB3Q29kZVBhZ2UgPSBwUmV0LT53Q29kZVBhZ2U7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzUHNOYW1lID0gcEZYRm9udC0+R2V0UHNOYW1lKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwRm9udEZhY2UgPSB3c1BzTmFtZTsNCisgIENGWF9Gb250TWFwcGVyKiBwQnVpbHRpbk1hcHBlciA9DQorICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX3BCdWlsdGluTWFwcGVyOw0KKyAgaWYgKHBCdWlsdGluTWFwcGVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IGlXZWlnaHQgPQ0KKyAgICAgIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgPyBGWEZPTlRfRldfQk9MRCA6IEZYRk9OVF9GV19OT1JNQUw7DQorICBpbnQgaXRhbGljX2FuZ2xlID0gMDsNCisgIEZYRlRfRmFjZSBmdEZhY2UgPSBwQnVpbHRpbk1hcHBlci0+RmluZFN1YnN0Rm9udEJ5VW5pY29kZSgNCisgICAgICB3VW5pY29kZSwgZHdGb250U3R5bGVzLCBpV2VpZ2h0LCBpdGFsaWNfYW5nbGUpOw0KKyAgaWYgKGZ0RmFjZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX0ZvbnQqIHBGWEZvbnQgPSBGWF9ORVcgQ0ZYX0ZvbnQ7DQorICBpZiAocEZYRm9udCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcEZYRm9udC0+bV9GYWNlID0gZnRGYWNlOw0KKyAgcEZYRm9udC0+bV9wRm9udERhdGEgPSBGWEZUX0dldF9GYWNlX1N0cmVhbV9CYXNlKGZ0RmFjZSk7DQorICBwRlhGb250LT5tX2R3U2l6ZSA9IEZYRlRfR2V0X0ZhY2VfU3RyZWFtX1NpemUoZnRGYWNlKTsNCisgIHBGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KHBGWEZvbnQsIHRoaXMpOw0KKyAgRlhfV09SRCB3Q29kZVBhZ2UgPSBwUmV0LT53Q29kZVBhZ2U7DQorICBDRlhfV2lkZVN0cmluZyB3c1BzTmFtZSA9IHBGWEZvbnQtPkdldFBzTmFtZSgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBGb250RmFjZSA9IHdzUHNOYW1lOw0KICNlbmRpZg0KKyAgaWYgKHBGb250ICE9IE5VTEwpIHsNCisgICAgbV9Gb250cy5BZGQocEZvbnQpOw0KKyAgICBtX1VuaWNvZGVGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgIGR3SGFzaCA9IEZHQVNfR2V0Rm9udEhhc2hDb2RlKHdDb2RlUGFnZSwgZHdGb250U3R5bGVzKTsNCisgICAgbV9DUEZvbnRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCisgICAgZHdIYXNoID0gRkdBU19HZXRGb250RmFtaWx5SGFzaChwRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgbV9GYW1pbHlGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6R2V0RGVmRm9udEJ5TGFuZ3VhZ2UoDQorICAgIEZYX1dPUkQgd0xhbmd1YWdlLA0KKyAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7DQorICByZXR1cm4gR2V0RGVmRm9udEJ5Q29kZVBhZ2UoRlhfR2V0RGVmQ29kZVBhZ2VCeUxhbmd1YWdlKHdMYW5ndWFnZSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGb250U3R5bGVzLCBwc3pGb250RmFtaWx5KTsNCit9DQorSUZYX0ZvbnQqIENGWF9TdGRGb250TWdySW1wOjpMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBGWF9EV09SRCBkd0hhc2ggPQ0KKyAgICAgIEZHQVNfR2V0Rm9udEZhbWlseUhhc2gocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgSUZYX0ZvbnQqIHBGb250ID0gTlVMTDsNCisgIGlmIChtX0ZhbWlseUZvbnRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKiYpcEZvbnQpKSB7DQorICAgIHJldHVybiBwRm9udCA/IExvYWRGb250KHBGb250LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSkgOiBOVUxMOw0KKyAgfQ0KKyAgRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZEID0gTlVMTDsNCisgIGlmICgocEZEID0gRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBUUlVFLCB3Q29kZVBhZ2UpKSA9PSBOVUxMKQ0KKyAgICBpZiAoKHBGRCA9IEZpbmRGb250KHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgRkFMU0UsIHdDb2RlUGFnZSkpID09DQorICAgICAgICBOVUxMKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgIEZYU1lTX2Fzc2VydChwRkQgIT0gTlVMTCk7DQorICBpZiAod0NvZGVQYWdlID09IDB4RkZGRikgew0KKyAgICB3Q29kZVBhZ2UgPSBGWF9HZXRDb2RlUGFnZUZyb21DaGFyc2V0KHBGRC0+dUNoYXJTZXQpOw0KKyAgfQ0KKyAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEZELT53c0ZvbnRGYWNlLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSwgdGhpcyk7DQorICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQorICAgIG1fRmFtaWx5Rm9udHMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZCopcEZvbnQpOw0KKyAgICBkd0hhc2ggPSBGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQorICAgIG1fQ1BGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6TG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICBpZiAobV9CdWZmZXJGb250cy5Mb29rdXAoKHZvaWQqKXBCdWZmZXIsICh2b2lkKiYpcEZvbnQpKSB7DQogICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQotICAgICAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQotICAgICAgICBtX1VuaWNvZGVGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQotICAgICAgICBkd0hhc2ggPSBGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQotICAgICAgICBtX0NQRm9udHMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZCopcEZvbnQpOw0KLSAgICAgICAgZHdIYXNoID0gRkdBU19HZXRGb250RmFtaWx5SGFzaChwRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KKyAgICB9DQorICB9DQorICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChwQnVmZmVyLCBpTGVuZ3RoLCB0aGlzKTsNCisgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgIG1fRm9udHMuQWRkKHBGb250KTsNCisgICAgbV9CdWZmZXJGb250cy5TZXRBdCgodm9pZCopcEJ1ZmZlciwgcEZvbnQpOw0KKyAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6TG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lKSB7DQorICBGWFNZU19hc3NlcnQocHN6RmlsZU5hbWUgIT0gTlVMTCk7DQorICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhwc3pGaWxlTmFtZSwgLTEpOw0KKyAgSUZYX0ZvbnQqIHBGb250ID0gTlVMTDsNCisgIGlmIChtX0ZpbGVGb250cy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZComKXBGb250KSkgew0KKyAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgIHJldHVybiBwRm9udC0+UmV0YWluKCk7DQorICAgIH0NCisgIH0NCisgIHBGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KHBzekZpbGVOYW1lLCBOVUxMKTsNCisgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgIG1fRm9udHMuQWRkKHBGb250KTsNCisgICAgbV9GaWxlRm9udHMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZCopcEZvbnQpOw0KKyAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6TG9hZEZvbnQoSUZYX1N0cmVhbSogcEZvbnRTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEFsaWFzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3RyZWFtKSB7DQorICBGWFNZU19hc3NlcnQocEZvbnRTdHJlYW0gIT0gTlVMTCAmJiBwRm9udFN0cmVhbS0+R2V0TGVuZ3RoKCkgPiAwKTsNCisgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICBpZiAobV9TdHJlYW1Gb250cy5Mb29rdXAoKHZvaWQqKXBGb250U3RyZWFtLCAodm9pZComKXBGb250KSkgew0KKyAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgIGlmIChwc3pGb250QWxpYXMgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRFdPUkQgZHdIYXNoID0NCisgICAgICAgICAgICBGR0FTX0dldEZvbnRGYW1pbHlIYXNoKHBzekZvbnRBbGlhcywgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KICAgICAgICAgbV9GYW1pbHlGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQotICAgICAgICByZXR1cm4gTG9hZEZvbnQocEZvbnQsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIExvYWRGb250KHBGb250LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChwRm9udFN0cmVhbSwgdGhpcywgYlNhdmVTdHJlYW0pOw0KKyAgaWYgKHBGb250ICE9IE5VTEwpIHsNCisgICAgbV9Gb250cy5BZGQocEZvbnQpOw0KKyAgICBtX1N0cmVhbUZvbnRzLlNldEF0KCh2b2lkKilwRm9udFN0cmVhbSwgKHZvaWQqKXBGb250KTsNCisgICAgaWYgKHBzekZvbnRBbGlhcyAhPSBOVUxMKSB7DQorICAgICAgRlhfRFdPUkQgZHdIYXNoID0NCisgICAgICAgICAgRkdBU19HZXRGb250RmFtaWx5SGFzaChwc3pGb250QWxpYXMsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgICBtX0ZhbWlseUZvbnRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCisgICAgfQ0KKyAgICByZXR1cm4gTG9hZEZvbnQocEZvbnQsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1JRlhfRm9udCogQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkdldERlZkZvbnRCeUxhbmd1YWdlKEZYX1dPUkQgd0xhbmd1YWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KQ0KLXsNCi0gICAgcmV0dXJuIEdldERlZkZvbnRCeUNvZGVQYWdlKEZYX0dldERlZkNvZGVQYWdlQnlMYW5ndWFnZSh3TGFuZ3VhZ2UpLCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KLX0NCi1JRlhfRm9udCogQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdIYXNoID0gRkdBU19HZXRGb250RmFtaWx5SGFzaChwc3pGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQotICAgIElGWF9Gb250ICpwRm9udCA9IE5VTEw7DQotICAgIGlmIChtX0ZhbWlseUZvbnRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKiYpcEZvbnQpKSB7DQotICAgICAgICByZXR1cm4gcEZvbnQgPyBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpIDogTlVMTDsNCi0gICAgfQ0KLSAgICBGWF9MUENGT05UREVTQ1JJUFRPUiBwRkQgPSBOVUxMOw0KLSAgICBpZiAoKHBGRCA9IEZpbmRGb250KHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgVFJVRSwgd0NvZGVQYWdlKSkgPT0gTlVMTCkNCi0gICAgICAgIGlmICgocEZEID0gRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBGQUxTRSwgd0NvZGVQYWdlKSkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICBGWFNZU19hc3NlcnQocEZEICE9IE5VTEwpOw0KLSAgICBpZiAod0NvZGVQYWdlID09IDB4RkZGRikgew0KLSAgICAgICAgd0NvZGVQYWdlID0gRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldChwRkQtPnVDaGFyU2V0KTsNCi0gICAgfQ0KLSAgICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChwRkQtPndzRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlLCB0aGlzKTsNCitJRlhfRm9udCogQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkxvYWRGb250KElGWF9Gb250KiBwU3JjRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBGWFNZU19hc3NlcnQocFNyY0ZvbnQgIT0gTlVMTCk7DQorICBpZiAocFNyY0ZvbnQtPkdldEZvbnRTdHlsZXMoKSA9PSBkd0ZvbnRTdHlsZXMpIHsNCisgICAgcmV0dXJuIHBTcmNGb250LT5SZXRhaW4oKTsNCisgIH0NCisgIHZvaWQqIGJ1ZmZlclszXSA9IHtwU3JjRm9udCwgKHZvaWQqKSh1aW50cHRyX3QpZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICh2b2lkKikodWludHB0cl90KXdDb2RlUGFnZX07DQorICBGWF9EV09SRCBkd0hhc2ggPQ0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKilidWZmZXIsIDMgKiBzaXplb2Yodm9pZCopKTsNCisgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICBpZiAobV9EZXJpdmVGb250cy5HZXRDb3VudCgpID4gMCkgew0KKyAgICBtX0Rlcml2ZUZvbnRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKiYpcEZvbnQpOw0KICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgbV9Gb250cy5BZGQocEZvbnQpOw0KLSAgICAgICAgbV9GYW1pbHlGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQotICAgICAgICBkd0hhc2ggPSBGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQotICAgICAgICBtX0NQRm9udHMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZCopcEZvbnQpOw0KLSAgICAgICAgcmV0dXJuIExvYWRGb250KHBGb250LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorICAgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBGb250ID0gcFNyY0ZvbnQtPkRlcml2ZShkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICBtX0Rlcml2ZUZvbnRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCisgICAgaW50MzJfdCBpbmRleCA9IG1fRm9udHMuRmluZChwRm9udCk7DQorICAgIGlmIChpbmRleCA8IDApIHsNCisgICAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQorICAgICAgcEZvbnQtPlJldGFpbigpOw0KKyAgICB9DQorICAgIHJldHVybiBwRm9udDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1JRlhfRm9udCogQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkxvYWRGb250KGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUxlbmd0aCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KLSAgICBJRlhfRm9udCAqcEZvbnQgPSBOVUxMOw0KLSAgICBpZiAobV9CdWZmZXJGb250cy5Mb29rdXAoKHZvaWQqKXBCdWZmZXIsICh2b2lkKiYpcEZvbnQpKSB7DQotICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiBwRm9udC0+UmV0YWluKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEJ1ZmZlciwgaUxlbmd0aCwgdGhpcyk7DQordm9pZCBDRlhfU3RkRm9udE1nckltcDo6Q2xlYXJGb250Q2FjaGUoKSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fRm9udHMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgSUZYX0ZvbnQqIHBGb250ID0gKElGWF9Gb250KiltX0ZvbnRzW2ldOw0KICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgbV9Gb250cy5BZGQocEZvbnQpOw0KLSAgICAgICAgbV9CdWZmZXJGb250cy5TZXRBdCgodm9pZCopcEJ1ZmZlciwgcEZvbnQpOw0KLSAgICAgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsNCisgICAgICBwRm9udC0+UmVzZXQoKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCisgIH0NCiB9DQotSUZYX0ZvbnQqIENGWF9TdGRGb250TWdySW1wOjpMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUpDQotew0KLSAgICBGWFNZU19hc3NlcnQocHN6RmlsZU5hbWUgIT0gTlVMTCk7DQotICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzekZpbGVOYW1lLCAtMSk7DQotICAgIElGWF9Gb250ICpwRm9udCA9IE5VTEw7DQotICAgIGlmIChtX0ZpbGVGb250cy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZComKXBGb250KSkgew0KLSAgICAgICAgaWYgKHBGb250ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ0ZYX1N0ZEZvbnRNZ3JJbXA6OlJlbW92ZUZvbnQoQ0ZYX01hcFB0clRvUHRyJiBmb250TWFwLCBJRlhfRm9udCogcEZvbnQpIHsNCisgIEZYX1BPU0lUSU9OIHBvcyA9IGZvbnRNYXAuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgdm9pZCogcEtleTsNCisgIHZvaWQqIHBGaW5kOw0KKyAgd2hpbGUgKHBvcyAhPSBOVUxMKSB7DQorICAgIHBGaW5kID0gTlVMTDsNCisgICAgZm9udE1hcC5HZXROZXh0QXNzb2MocG9zLCBwS2V5LCBwRmluZCk7DQorICAgIGlmIChwRmluZCAhPSAodm9pZCopcEZvbnQpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChwc3pGaWxlTmFtZSwgTlVMTCk7DQotICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQotICAgICAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQotICAgICAgICBtX0ZpbGVGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQotICAgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KKyAgICBmb250TWFwLlJlbW92ZUtleShwS2V5KTsNCisgICAgYnJlYWs7DQorICB9DQogfQ0KLUlGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6TG9hZEZvbnQoSUZYX1N0cmVhbSAqcEZvbnRTdHJlYW0sIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250QWxpYXMgLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMgLCBGWF9XT1JEIHdDb2RlUGFnZSAsIEZYX0JPT0wgYlNhdmVTdHJlYW0gKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBGb250U3RyZWFtICE9IE5VTEwgJiYgcEZvbnRTdHJlYW0tPkdldExlbmd0aCgpID4gMCk7DQotICAgIElGWF9Gb250ICpwRm9udCA9IE5VTEw7DQotICAgIGlmIChtX1N0cmVhbUZvbnRzLkxvb2t1cCgodm9pZCopcEZvbnRTdHJlYW0sICh2b2lkKiYpcEZvbnQpKSB7DQotICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGlmIChwc3pGb250QWxpYXMgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0hhc2ggPSBGR0FTX0dldEZvbnRGYW1pbHlIYXNoKHBzekZvbnRBbGlhcywgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KLSAgICAgICAgICAgICAgICBtX0ZhbWlseUZvbnRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIExvYWRGb250KHBGb250LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEZvbnRTdHJlYW0sIHRoaXMsIGJTYXZlU3RyZWFtKTsNCi0gICAgaWYgKHBGb250ICE9IE5VTEwpIHsNCi0gICAgICAgIG1fRm9udHMuQWRkKHBGb250KTsNCi0gICAgICAgIG1fU3RyZWFtRm9udHMuU2V0QXQoKHZvaWQqKXBGb250U3RyZWFtLCAodm9pZCopcEZvbnQpOw0KLSAgICAgICAgaWYgKHBzekZvbnRBbGlhcyAhPSBOVUxMKSB7DQotICAgICAgICAgICAgRlhfRFdPUkQgZHdIYXNoID0gRkdBU19HZXRGb250RmFtaWx5SGFzaChwc3pGb250QWxpYXMsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCi0gICAgICAgICAgICBtX0ZhbWlseUZvbnRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KK3ZvaWQgQ0ZYX1N0ZEZvbnRNZ3JJbXA6OlJlbW92ZUZvbnQoSUZYX0ZvbnQqIHBGb250KSB7DQorICBSZW1vdmVGb250KG1fQ1BGb250cywgcEZvbnQpOw0KKyAgUmVtb3ZlRm9udChtX0ZhbWlseUZvbnRzLCBwRm9udCk7DQorICBSZW1vdmVGb250KG1fVW5pY29kZUZvbnRzLCBwRm9udCk7DQorICBSZW1vdmVGb250KG1fQnVmZmVyRm9udHMsIHBGb250KTsNCisgIFJlbW92ZUZvbnQobV9GaWxlRm9udHMsIHBGb250KTsNCisgIFJlbW92ZUZvbnQobV9TdHJlYW1Gb250cywgcEZvbnQpOw0KKyAgUmVtb3ZlRm9udChtX0Rlcml2ZUZvbnRzLCBwRm9udCk7DQorICBpbnQzMl90IGlGaW5kID0gbV9Gb250cy5GaW5kKHBGb250KTsNCisgIGlmIChpRmluZCA+IC0xKSB7DQorICAgIG1fRm9udHMuUmVtb3ZlQXQoaUZpbmQsIDEpOw0KKyAgfQ0KIH0NCi1JRlhfRm9udCogQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkxvYWRGb250KElGWF9Gb250ICpwU3JjRm9udCwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwU3JjRm9udCAhPSBOVUxMKTsNCi0gICAgaWYgKHBTcmNGb250LT5HZXRGb250U3R5bGVzKCkgPT0gZHdGb250U3R5bGVzKSB7DQotICAgICAgICByZXR1cm4gcFNyY0ZvbnQtPlJldGFpbigpOw0KK0ZYX0xQQ0ZPTlRERVNDUklQVE9SIENGWF9TdGRGb250TWdySW1wOjpGaW5kRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd01hdGNoRmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1VTQiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd1VuaWNvZGUpIHsNCisgIGlmIChtX3BNYXRjaGVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBGWF9GT05UTUFUQ0hQQVJBTVMgcGFyYW1zOw0KKyAgRlhfbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsNCisgIHBhcmFtcy5kd1VTQiA9IGR3VVNCOw0KKyAgcGFyYW1zLndVbmljb2RlID0gd1VuaWNvZGU7DQorICBwYXJhbXMud0NvZGVQYWdlID0gd0NvZGVQYWdlOw0KKyAgcGFyYW1zLnB3c0ZhbWlseSA9IHBzekZvbnRGYW1pbHk7DQorICBwYXJhbXMuZHdGb250U3R5bGVzID0gZHdGb250U3R5bGVzOw0KKyAgcGFyYW1zLmR3TWF0Y2hGbGFncyA9IGR3TWF0Y2hGbGFnczsNCisgIEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBEZXNjID0gbV9wTWF0Y2hlcigmcGFyYW1zLCBtX0ZvbnRGYWNlcywgbV9wVXNlckRhdGEpOw0KKyAgaWYgKHBEZXNjKSB7DQorICAgIHJldHVybiBwRGVzYzsNCisgIH0NCisgIGlmIChwc3pGb250RmFtaWx5ICYmIG1fcEVudW1lcmF0b3IpIHsNCisgICAgQ0ZYX0ZvbnREZXNjcmlwdG9ycyBuYW1lZEZvbnRzOw0KKyAgICBtX3BFbnVtZXJhdG9yKG5hbWVkRm9udHMsIG1fcFVzZXJEYXRhLCBwc3pGb250RmFtaWx5LCB3VW5pY29kZSk7DQorICAgIHBhcmFtcy5wd3NGYW1pbHkgPSBOVUxMOw0KKyAgICBwRGVzYyA9IG1fcE1hdGNoZXIoJnBhcmFtcywgbmFtZWRGb250cywgbV9wVXNlckRhdGEpOw0KKyAgICBpZiAocERlc2MgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KICAgICB9DQotICAgIHZvaWQqIGJ1ZmZlclszXSA9IHtwU3JjRm9udCwgKHZvaWQqKSh1aW50cHRyX3QpZHdGb250U3R5bGVzLCAodm9pZCopKHVpbnRwdHJfdCl3Q29kZVBhZ2V9Ow0KLSAgICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QSgoY29uc3QgRlhfQ0hBUiopYnVmZmVyLCAzICogc2l6ZW9mKHZvaWQqKSk7DQotICAgIElGWF9Gb250ICpwRm9udCA9IE5VTEw7DQotICAgIGlmIChtX0Rlcml2ZUZvbnRzLkdldENvdW50KCkgPiAwKSB7DQotICAgICAgICBtX0Rlcml2ZUZvbnRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKiYpcEZvbnQpOw0KLSAgICAgICAgaWYgKHBGb250ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KLSAgICAgICAgfQ0KKyAgICBmb3IgKGludDMyX3QgaSA9IG1fRm9udEZhY2VzLkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorICAgICAgRlhfTFBDRk9OVERFU0NSSVBUT1IgcE1hdGNoID0gbV9Gb250RmFjZXMuR2V0UHRyQXQoaSk7DQorICAgICAgaWYgKCpwTWF0Y2ggPT0gKnBEZXNjKSB7DQorICAgICAgICByZXR1cm4gcE1hdGNoOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBwRm9udCA9IHBTcmNGb250LT5EZXJpdmUoZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KLSAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgbV9EZXJpdmVGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQotICAgICAgICBpbnQzMl90IGluZGV4ID0gbV9Gb250cy5GaW5kKHBGb250KTsNCi0gICAgICAgIGlmIChpbmRleCA8IDApIHsNCi0gICAgICAgICAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQotICAgICAgICAgICAgcEZvbnQtPlJldGFpbigpOw0KLSAgICAgICAgfQ0KKyAgICBpbnQgaW5kZXggPSBtX0ZvbnRGYWNlcy5BZGQoKnBEZXNjKTsNCisgICAgcmV0dXJuIG1fRm9udEZhY2VzLkdldFB0ckF0KGluZGV4KTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9MUENGT05UREVTQ1JJUFRPUiBGWF9EZWZGb250TWF0Y2hlcihGWF9MUEZPTlRNQVRDSFBBUkFNUyBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Gb250RGVzY3JpcHRvcnMmIGZvbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSkgew0KKyAgRlhfTFBDRk9OVERFU0NSSVBUT1IgcEJlc3RGb250ID0gTlVMTDsNCisgIGludDMyX3QgaUJlc3RTaW1pbGFyID0gMDsNCisgIEZYX0JPT0wgYk1hdGNoU3R5bGUgPQ0KKyAgICAgIChwUGFyYW1zLT5kd01hdGNoRmxhZ3MgJiBGWF9GT05UTUFUQ0hQQVJBX01hY3RoU3R5bGUpID4gMDsNCisgIGludDMyX3QgaUNvdW50ID0gZm9udHMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsNCisgICAgRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZvbnQgPSBmb250cy5HZXRQdHJBdChpKTsNCisgICAgaWYgKChwRm9udC0+ZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGRJdGFsaWMpID09DQorICAgICAgICBGWF9GT05UU1RZTEVfQm9sZEl0YWxpYykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChwUGFyYW1zLT5wd3NGYW1pbHkpIHsNCisgICAgICBpZiAoRlhTWVNfd2NzaWNtcChwUGFyYW1zLT5wd3NGYW1pbHksIHBGb250LT53c0ZvbnRGYWNlKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChwRm9udC0+dUNoYXJTZXQgPT0gRlhfQ0hBUlNFVF9TeW1ib2wpIHsNCiAgICAgICAgIHJldHVybiBwRm9udDsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorICAgIGlmIChwRm9udC0+dUNoYXJTZXQgPT0gRlhfQ0hBUlNFVF9TeW1ib2wpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAocFBhcmFtcy0+d0NvZGVQYWdlICE9IDB4RkZGRikgew0KKyAgICAgIGlmIChGWF9HZXRDb2RlUGFnZUZyb21DaGFyc2V0KHBGb250LT51Q2hhclNldCkgIT0gcFBhcmFtcy0+d0NvZGVQYWdlKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKHBQYXJhbXMtPmR3VVNCIDwgMTI4KSB7DQorICAgICAgICBGWF9EV09SRCBkd0J5dGUgPSBwUGFyYW1zLT5kd1VTQiAvIDMyOw0KKyAgICAgICAgRlhfRFdPUkQgZHdVU0IgPSAxIDw8IChwUGFyYW1zLT5kd1VTQiAlIDMyKTsNCisgICAgICAgIGlmICgocEZvbnQtPkZvbnRTaWduYXR1cmUuZnNVc2JbZHdCeXRlXSAmIGR3VVNCKSA9PSAwKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYk1hdGNoU3R5bGUpIHsNCisgICAgICBpZiAoKHBGb250LT5kd0ZvbnRTdHlsZXMgJiAweDBGKSA9PSAocFBhcmFtcy0+ZHdGb250U3R5bGVzICYgMHgwRikpIHsNCisgICAgICAgIHJldHVybiBwRm9udDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwUGFyYW1zLT5wd3NGYW1pbHkgIT0gTlVMTCkgew0KKyAgICAgIGlmIChGWFNZU193Y3NpY21wKHBQYXJhbXMtPnB3c0ZhbWlseSwgcEZvbnQtPndzRm9udEZhY2UpID09IDApIHsNCisgICAgICAgIHJldHVybiBwRm9udDsNCisgICAgICB9DQorICAgIH0NCisgICAgaW50MzJfdCBpU2ltaWxhclZhbHVlID0gRlhfR2V0U2ltaWxhclZhbHVlKHBGb250LCBwUGFyYW1zLT5kd0ZvbnRTdHlsZXMpOw0KKyAgICBpZiAoaUJlc3RTaW1pbGFyIDwgaVNpbWlsYXJWYWx1ZSkgew0KKyAgICAgIGlCZXN0U2ltaWxhciA9IGlTaW1pbGFyVmFsdWU7DQorICAgICAgcEJlc3RGb250ID0gcEZvbnQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpQmVzdFNpbWlsYXIgPCAxID8gTlVMTCA6IHBCZXN0Rm9udDsNCiB9DQotdm9pZCBDRlhfU3RkRm9udE1nckltcDo6Q2xlYXJGb250Q2FjaGUoKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX0ZvbnRzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICBJRlhfRm9udCAqcEZvbnQgPSAoSUZYX0ZvbnQqKW1fRm9udHNbaV07DQotICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIHBGb250LT5SZXNldCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQoraW50MzJfdCBGWF9HZXRTaW1pbGFyVmFsdWUoRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZvbnQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcykgew0KKyAgaW50MzJfdCBpVmFsdWUgPSAwOw0KKyAgaWYgKChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpID09DQorICAgICAgKHBGb250LT5kd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpKSB7DQorICAgIGlWYWx1ZSArPSA2NDsNCisgIH0NCisgIGlmICgoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2gpID09DQorICAgICAgKHBGb250LT5kd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCkpIHsNCisgICAgaVZhbHVlICs9IDMyOw0KKyAgfQ0KKyAgaWYgKChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2VyaWYpID09DQorICAgICAgKHBGb250LT5kd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2VyaWYpKSB7DQorICAgIGlWYWx1ZSArPSAxNjsNCisgIH0NCisgIGlmICgoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1NjcmlwdCkgPT0NCisgICAgICAocEZvbnQtPmR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TY3JpcHQpKSB7DQorICAgIGlWYWx1ZSArPSA4Ow0KKyAgfQ0KKyAgcmV0dXJuIGlWYWx1ZTsNCiB9DQotdm9pZCBDRlhfU3RkRm9udE1nckltcDo6UmVtb3ZlRm9udChDRlhfTWFwUHRyVG9QdHIgJmZvbnRNYXAsIElGWF9Gb250ICpwRm9udCkNCi17DQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IGZvbnRNYXAuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB2b2lkKiBwS2V5Ow0KLSAgICB2b2lkKiBwRmluZDsNCi0gICAgd2hpbGUgKHBvcyAhPSBOVUxMKSB7DQotICAgICAgICBwRmluZCA9IE5VTEw7DQotICAgICAgICBmb250TWFwLkdldE5leHRBc3NvYyhwb3MsIHBLZXksIHBGaW5kKTsNCi0gICAgICAgIGlmIChwRmluZCAhPSAodm9pZCopcEZvbnQpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZvbnRNYXAuUmVtb3ZlS2V5KHBLZXkpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCitGWF9MUE1hdGNoRm9udCBGWF9HZXREZWZGb250TWF0Y2hvcigpIHsNCisgIHJldHVybiBGWF9EZWZGb250TWF0Y2hlcjsNCiB9DQotdm9pZCBDRlhfU3RkRm9udE1nckltcDo6UmVtb3ZlRm9udChJRlhfRm9udCAqcEZvbnQpDQotew0KLSAgICBSZW1vdmVGb250KG1fQ1BGb250cywgcEZvbnQpOw0KLSAgICBSZW1vdmVGb250KG1fRmFtaWx5Rm9udHMsIHBGb250KTsNCi0gICAgUmVtb3ZlRm9udChtX1VuaWNvZGVGb250cywgcEZvbnQpOw0KLSAgICBSZW1vdmVGb250KG1fQnVmZmVyRm9udHMsIHBGb250KTsNCi0gICAgUmVtb3ZlRm9udChtX0ZpbGVGb250cywgcEZvbnQpOw0KLSAgICBSZW1vdmVGb250KG1fU3RyZWFtRm9udHMsIHBGb250KTsNCi0gICAgUmVtb3ZlRm9udChtX0Rlcml2ZUZvbnRzLCBwRm9udCk7DQotICAgIGludDMyX3QgaUZpbmQgPSBtX0ZvbnRzLkZpbmQocEZvbnQpOw0KLSAgICBpZiAoaUZpbmQgPiAtMSkgew0KLSAgICAgICAgbV9Gb250cy5SZW1vdmVBdChpRmluZCwgMSk7DQotICAgIH0NCitGWF9EV09SRCBGWF9HZXRHZGlGb250U3R5bGVzKGNvbnN0IExPR0ZPTlRXJiBsZikgew0KKyAgRlhfRFdPUkQgZHdTdHlsZXMgPSAwOw0KKyAgaWYgKChsZi5sZlBpdGNoQW5kRmFtaWx5ICYgMHgwMykgPT0gRklYRURfUElUQ0gpIHsNCisgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2g7DQorICB9DQorICB1aW50OF90IG5GYW1pbGllcyA9IGxmLmxmUGl0Y2hBbmRGYW1pbHkgJiAweEYwOw0KKyAgaWYgKG5GYW1pbGllcyA9PSBGRl9ST01BTikgew0KKyAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfU2VyaWY7DQorICB9DQorICBpZiAobkZhbWlsaWVzID09IEZGX1NDUklQVCkgew0KKyAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfU2NyaXB0Ow0KKyAgfQ0KKyAgaWYgKGxmLmxmQ2hhclNldCA9PSBTWU1CT0xfQ0hBUlNFVCkgew0KKyAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfU3ltYm9saWM7DQorICB9DQorICByZXR1cm4gZHdTdHlsZXM7DQogfQ0KLUZYX0xQQ0ZPTlRERVNDUklQVE9SIENGWF9TdGRGb250TWdySW1wOjpGaW5kRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9EV09SRCBkd01hdGNoRmxhZ3MsIEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd1VTQiAsIEZYX1dDSEFSIHdVbmljb2RlICkNCi17DQotICAgIGlmIChtX3BNYXRjaGVyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIEZYX0ZPTlRNQVRDSFBBUkFNUyBwYXJhbXM7DQotICAgIEZYX21lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7DQotICAgIHBhcmFtcy5kd1VTQiA9IGR3VVNCOw0KLSAgICBwYXJhbXMud1VuaWNvZGUgPSB3VW5pY29kZTsNCi0gICAgcGFyYW1zLndDb2RlUGFnZSA9IHdDb2RlUGFnZTsNCi0gICAgcGFyYW1zLnB3c0ZhbWlseSA9IHBzekZvbnRGYW1pbHk7DQotICAgIHBhcmFtcy5kd0ZvbnRTdHlsZXMgPSBkd0ZvbnRTdHlsZXM7DQotICAgIHBhcmFtcy5kd01hdGNoRmxhZ3MgPSBkd01hdGNoRmxhZ3M7DQotICAgIEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBEZXNjID0gbV9wTWF0Y2hlcigmcGFyYW1zLCBtX0ZvbnRGYWNlcywgbV9wVXNlckRhdGEpOw0KLSAgICBpZiAocERlc2MpIHsNCi0gICAgICAgIHJldHVybiBwRGVzYzsNCi0gICAgfQ0KLSAgICBpZiAocHN6Rm9udEZhbWlseSAmJiBtX3BFbnVtZXJhdG9yKSB7DQotICAgICAgICBDRlhfRm9udERlc2NyaXB0b3JzIG5hbWVkRm9udHM7DQotICAgICAgICBtX3BFbnVtZXJhdG9yKG5hbWVkRm9udHMsIG1fcFVzZXJEYXRhLCBwc3pGb250RmFtaWx5LCB3VW5pY29kZSk7DQotICAgICAgICBwYXJhbXMucHdzRmFtaWx5ID0gTlVMTDsNCi0gICAgICAgIHBEZXNjID0gbV9wTWF0Y2hlcigmcGFyYW1zLCBuYW1lZEZvbnRzLCBtX3BVc2VyRGF0YSk7DQotICAgICAgICBpZiAocERlc2MgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSBtX0ZvbnRGYWNlcy5HZXRTaXplKCkgLSAxOyBpID49IDA7IGktLSkgew0KLSAgICAgICAgICAgIEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBNYXRjaCA9IG1fRm9udEZhY2VzLkdldFB0ckF0KGkpOw0KLSAgICAgICAgICAgIGlmICgqcE1hdGNoID09ICpwRGVzYykgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcE1hdGNoOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGludCBpbmRleCA9IG1fRm9udEZhY2VzLkFkZCgqcERlc2MpOw0KLSAgICAgICAgcmV0dXJuIG1fRm9udEZhY2VzLkdldFB0ckF0KGluZGV4KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotRlhfTFBDRk9OVERFU0NSSVBUT1IgRlhfRGVmRm9udE1hdGNoZXIoRlhfTFBGT05UTUFUQ0hQQVJBTVMgcFBhcmFtcywgY29uc3QgQ0ZYX0ZvbnREZXNjcmlwdG9ycyAmZm9udHMsIHZvaWQqIHBVc2VyRGF0YSkNCi17DQotICAgIEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBCZXN0Rm9udCA9IE5VTEw7DQotICAgIGludDMyX3QgaUJlc3RTaW1pbGFyID0gMDsNCi0gICAgRlhfQk9PTCBiTWF0Y2hTdHlsZSA9IChwUGFyYW1zLT5kd01hdGNoRmxhZ3MgJiBGWF9GT05UTUFUQ0hQQVJBX01hY3RoU3R5bGUpID4gMDsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBmb250cy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgKytpKSB7DQotICAgICAgICBGWF9MUENGT05UREVTQ1JJUFRPUiBwRm9udCA9IGZvbnRzLkdldFB0ckF0KGkpOw0KLSAgICAgICAgaWYgKChwRm9udC0+ZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGRJdGFsaWMpID09IEZYX0ZPTlRTVFlMRV9Cb2xkSXRhbGljKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAocFBhcmFtcy0+cHdzRmFtaWx5KSB7DQotICAgICAgICAgICAgaWYgKEZYU1lTX3djc2ljbXAocFBhcmFtcy0+cHdzRmFtaWx5LCBwRm9udC0+d3NGb250RmFjZSkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwRm9udC0+dUNoYXJTZXQgPT0gRlhfQ0hBUlNFVF9TeW1ib2wpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBGb250Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwRm9udC0+dUNoYXJTZXQgPT0gRlhfQ0hBUlNFVF9TeW1ib2wpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwUGFyYW1zLT53Q29kZVBhZ2UgIT0gMHhGRkZGKSB7DQotICAgICAgICAgICAgaWYgKEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQocEZvbnQtPnVDaGFyU2V0KSAhPSBwUGFyYW1zLT53Q29kZVBhZ2UpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAocFBhcmFtcy0+ZHdVU0IgPCAxMjgpIHsNCi0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdCeXRlID0gcFBhcmFtcy0+ZHdVU0IgLyAzMjsNCi0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdVU0IgPSAxIDw8IChwUGFyYW1zLT5kd1VTQiAlIDMyKTsNCi0gICAgICAgICAgICAgICAgaWYgKChwRm9udC0+Rm9udFNpZ25hdHVyZS5mc1VzYltkd0J5dGVdICYgZHdVU0IpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJNYXRjaFN0eWxlKSB7DQotICAgICAgICAgICAgaWYgKChwRm9udC0+ZHdGb250U3R5bGVzICYgMHgwRikgPT0gKHBQYXJhbXMtPmR3Rm9udFN0eWxlcyAmIDB4MEYpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwRm9udDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAocFBhcmFtcy0+cHdzRmFtaWx5ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBpZiAoRlhTWVNfd2NzaWNtcChwUGFyYW1zLT5wd3NGYW1pbHksIHBGb250LT53c0ZvbnRGYWNlKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwRm9udDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlTaW1pbGFyVmFsdWUgPSBGWF9HZXRTaW1pbGFyVmFsdWUocEZvbnQsIHBQYXJhbXMtPmR3Rm9udFN0eWxlcyk7DQotICAgICAgICBpZiAoaUJlc3RTaW1pbGFyIDwgaVNpbWlsYXJWYWx1ZSkgew0KLSAgICAgICAgICAgIGlCZXN0U2ltaWxhciA9IGlTaW1pbGFyVmFsdWU7DQotICAgICAgICAgICAgcEJlc3RGb250ID0gcEZvbnQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGlCZXN0U2ltaWxhciA8IDEgPyBOVUxMIDogcEJlc3RGb250Ow0KLX0NCi1pbnQzMl90IEZYX0dldFNpbWlsYXJWYWx1ZShGWF9MUENGT05UREVTQ1JJUFRPUiBwRm9udCwgRlhfRFdPUkQgZHdGb250U3R5bGVzKQ0KLXsNCi0gICAgaW50MzJfdCBpVmFsdWUgPSAwOw0KLSAgICBpZiAoKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYykgPT0gKHBGb250LT5kd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpKSB7DQotICAgICAgICBpVmFsdWUgKz0gNjQ7DQotICAgIH0NCi0gICAgaWYgKChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCkgPT0gKHBGb250LT5kd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCkpIHsNCi0gICAgICAgIGlWYWx1ZSArPSAzMjsNCi0gICAgfQ0KLSAgICBpZiAoKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TZXJpZikgPT0gKHBGb250LT5kd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2VyaWYpKSB7DQotICAgICAgICBpVmFsdWUgKz0gMTY7DQotICAgIH0NCi0gICAgaWYgKChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSA9PSAocEZvbnQtPmR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TY3JpcHQpKSB7DQotICAgICAgICBpVmFsdWUgKz0gODsNCi0gICAgfQ0KLSAgICByZXR1cm4gaVZhbHVlOw0KLX0NCi1GWF9MUE1hdGNoRm9udCBGWF9HZXREZWZGb250TWF0Y2hvcigpDQotew0KLSAgICByZXR1cm4gRlhfRGVmRm9udE1hdGNoZXI7DQotfQ0KLUZYX0RXT1JEIEZYX0dldEdkaUZvbnRTdHlsZXMoY29uc3QgTE9HRk9OVFcgJmxmKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdTdHlsZXMgPSAwOw0KLSAgICBpZiAoKGxmLmxmUGl0Y2hBbmRGYW1pbHkgJiAweDAzKSA9PSBGSVhFRF9QSVRDSCkgew0KLSAgICAgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2g7DQotICAgIH0NCi0gICAgdWludDhfdCBuRmFtaWxpZXMgPSBsZi5sZlBpdGNoQW5kRmFtaWx5ICYgMHhGMDsNCi0gICAgaWYgKG5GYW1pbGllcyA9PSBGRl9ST01BTikgew0KLSAgICAgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX1NlcmlmOw0KLSAgICB9DQotICAgIGlmIChuRmFtaWxpZXMgPT0gRkZfU0NSSVBUKSB7DQotICAgICAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfU2NyaXB0Ow0KLSAgICB9DQotICAgIGlmIChsZi5sZkNoYXJTZXQgPT0gU1lNQk9MX0NIQVJTRVQpIHsNCi0gICAgICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9TeW1ib2xpYzsNCi0gICAgfQ0KLSAgICByZXR1cm4gZHdTdHlsZXM7DQotfQ0KLXN0YXRpYyBpbnQzMl90IENBTExCQUNLIEZYX0dkaUZvbnRFbnVtUHJvYyhFTlVNTE9HRk9OVEVYICpscGVsZmUsIE5FV1RFWFRNRVRSSUNFWCAqbHBudG1lLCBEV09SRCBkd0ZvbnRUeXBlLCBMUEFSQU0gbFBhcmFtKQ0KLXsNCi0gICAgaWYgKGR3Rm9udFR5cGUgIT0gVFJVRVRZUEVfRk9OVFRZUEUpIHsNCi0gICAgICAgIHJldHVybiAxOw0KLSAgICB9DQotICAgIGNvbnN0IExPR0ZPTlRXICZsZiA9ICgoTFBFTlVNTE9HRk9OVEVYVylscGVsZmUpLT5lbGZMb2dGb250Ow0KLSAgICBpZiAobGYubGZGYWNlTmFtZVswXSA9PSBMJ0AnKSB7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfQ0KLSAgICBGWF9MUEZPTlRERVNDUklQVE9SIHBGb250ID0gRlhfQWxsb2MoRlhfRk9OVERFU0NSSVBUT1IsIDEpOw0KLSAgICBpZiAoTlVMTCA9PSBwRm9udCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgRlhTWVNfbWVtc2V0KHBGb250LCAwLCBzaXplb2YoRlhfRk9OVERFU0NSSVBUT1IpKTsNCi0gICAgcEZvbnQtPnVDaGFyU2V0ID0gbGYubGZDaGFyU2V0Ow0KLSAgICBwRm9udC0+ZHdGb250U3R5bGVzID0gRlhfR2V0R2RpRm9udFN0eWxlcyhsZik7DQotICAgIEZYU1lTX3djc25jcHkocEZvbnQtPndzRm9udEZhY2UsIChjb25zdCBGWF9XQ0hBUiopbGYubGZGYWNlTmFtZSwgMzEpOw0KLSAgICBwRm9udC0+d3NGb250RmFjZVszMV0gPSAwOw0KLSAgICBGWF9tZW1jcHkoJnBGb250LT5Gb250U2lnbmF0dXJlLCAmbHBudG1lLT5udG1Gb250U2lnLCBzaXplb2YobHBudG1lLT5udG1Gb250U2lnKSk7DQotICAgICgoQ0ZYX0ZvbnREZXNjcmlwdG9ycyopbFBhcmFtKS0+QWRkKCpwRm9udCk7DQotICAgIEZYX0ZyZWUocEZvbnQpOw0KK3N0YXRpYyBpbnQzMl90IENBTExCQUNLIEZYX0dkaUZvbnRFbnVtUHJvYyhFTlVNTE9HRk9OVEVYKiBscGVsZmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FV1RFWFRNRVRSSUNFWCogbHBudG1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZvbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtKSB7DQorICBpZiAoZHdGb250VHlwZSAhPSBUUlVFVFlQRV9GT05UVFlQRSkgew0KICAgICByZXR1cm4gMTsNCisgIH0NCisgIGNvbnN0IExPR0ZPTlRXJiBsZiA9ICgoTFBFTlVNTE9HRk9OVEVYVylscGVsZmUpLT5lbGZMb2dGb250Ow0KKyAgaWYgKGxmLmxmRmFjZU5hbWVbMF0gPT0gTCdAJykgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIEZYX0xQRk9OVERFU0NSSVBUT1IgcEZvbnQgPSBGWF9BbGxvYyhGWF9GT05UREVTQ1JJUFRPUiwgMSk7DQorICBpZiAoTlVMTCA9PSBwRm9udCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYU1lTX21lbXNldChwRm9udCwgMCwgc2l6ZW9mKEZYX0ZPTlRERVNDUklQVE9SKSk7DQorICBwRm9udC0+dUNoYXJTZXQgPSBsZi5sZkNoYXJTZXQ7DQorICBwRm9udC0+ZHdGb250U3R5bGVzID0gRlhfR2V0R2RpRm9udFN0eWxlcyhsZik7DQorICBGWFNZU193Y3NuY3B5KHBGb250LT53c0ZvbnRGYWNlLCAoY29uc3QgRlhfV0NIQVIqKWxmLmxmRmFjZU5hbWUsIDMxKTsNCisgIHBGb250LT53c0ZvbnRGYWNlWzMxXSA9IDA7DQorICBGWF9tZW1jcHkoJnBGb250LT5Gb250U2lnbmF0dXJlLCAmbHBudG1lLT5udG1Gb250U2lnLA0KKyAgICAgICAgICAgIHNpemVvZihscG50bWUtPm50bUZvbnRTaWcpKTsNCisgICgoQ0ZYX0ZvbnREZXNjcmlwdG9ycyopbFBhcmFtKS0+QWRkKCpwRm9udCk7DQorICBGWF9GcmVlKHBGb250KTsNCisgIHJldHVybiAxOw0KIH0NCi1zdGF0aWMgdm9pZCBGWF9FbnVtR2RpRm9udHMoQ0ZYX0ZvbnREZXNjcmlwdG9ycyAmZm9udHMsIHZvaWQqIHBVc2VyRGF0YSwgY29uc3QgRlhfV0NIQVIqIHB3c0ZhY2VOYW1lLCBGWF9XQ0hBUiB3VW5pY29kZSkNCi17DQotICAgIEhEQyBoREMgPSA6OkdldERDKE5VTEwpOw0KLSAgICBMT0dGT05UVyBsZkZpbmQ7DQotICAgIEZYX21lbXNldCgmbGZGaW5kLCAwLCBzaXplb2YobGZGaW5kKSk7DQotICAgIGxmRmluZC5sZkNoYXJTZXQgPSBERUZBVUxUX0NIQVJTRVQ7DQotICAgIGlmIChwd3NGYWNlTmFtZSkgew0KLSAgICAgICAgRlhTWVNfd2NzbmNweSgoRlhfV0NIQVIqKWxmRmluZC5sZkZhY2VOYW1lLCBwd3NGYWNlTmFtZSwgMzEpOw0KLSAgICAgICAgbGZGaW5kLmxmRmFjZU5hbWVbMzFdID0gMDsNCi0gICAgfQ0KLSAgICBFbnVtRm9udEZhbWlsaWVzRXhXKGhEQywgKExQTE9HRk9OVFcpJmxmRmluZCwgKEZPTlRFTlVNUFJPQ1cpRlhfR2RpRm9udEVudW1Qcm9jLCAoTFBBUkFNKSZmb250cywgMCk7DQotICAgIDo6UmVsZWFzZURDKE5VTEwsIGhEQyk7DQorc3RhdGljIHZvaWQgRlhfRW51bUdkaUZvbnRzKENGWF9Gb250RGVzY3JpcHRvcnMmIGZvbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwd3NGYWNlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd1VuaWNvZGUpIHsNCisgIEhEQyBoREMgPSA6OkdldERDKE5VTEwpOw0KKyAgTE9HRk9OVFcgbGZGaW5kOw0KKyAgRlhfbWVtc2V0KCZsZkZpbmQsIDAsIHNpemVvZihsZkZpbmQpKTsNCisgIGxmRmluZC5sZkNoYXJTZXQgPSBERUZBVUxUX0NIQVJTRVQ7DQorICBpZiAocHdzRmFjZU5hbWUpIHsNCisgICAgRlhTWVNfd2NzbmNweSgoRlhfV0NIQVIqKWxmRmluZC5sZkZhY2VOYW1lLCBwd3NGYWNlTmFtZSwgMzEpOw0KKyAgICBsZkZpbmQubGZGYWNlTmFtZVszMV0gPSAwOw0KKyAgfQ0KKyAgRW51bUZvbnRGYW1pbGllc0V4VyhoREMsIChMUExPR0ZPTlRXKSZsZkZpbmQsDQorICAgICAgICAgICAgICAgICAgICAgIChGT05URU5VTVBST0NXKUZYX0dkaUZvbnRFbnVtUHJvYywgKExQQVJBTSkmZm9udHMsIDApOw0KKyAgOjpSZWxlYXNlREMoTlVMTCwgaERDKTsNCiB9DQotRlhfTFBFbnVtQWxsRm9udHMgRlhfR2V0RGVmRm9udEVudW1lcmF0b3IoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX0VudW1HZGlGb250czsNCitGWF9MUEVudW1BbGxGb250cyBGWF9HZXREZWZGb250RW51bWVyYXRvcigpIHsNCisgIHJldHVybiBGWF9FbnVtR2RpRm9udHM7DQogfQ0KICNlbHNlDQogY29uc3QgRlhfQ0hBUiogZ19Gb250Rm9sZGVyc1tdID0gew0KICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0xJTlVYXw0KLSAgICAiL3Vzci9zaGFyZS9mb250cyIsDQotICAgICIvdXNyL3NoYXJlL1gxMS9mb250cy9UeXBlMSIsDQotICAgICIvdXNyL3NoYXJlL1gxMS9mb250cy9UVEYiLA0KLSAgICAiL3Vzci9sb2NhbC9zaGFyZS9mb250cyIsDQorICAgICIvdXNyL3NoYXJlL2ZvbnRzIiwgIi91c3Ivc2hhcmUvWDExL2ZvbnRzL1R5cGUxIiwNCisgICAgIi91c3Ivc2hhcmUvWDExL2ZvbnRzL1RURiIsICIvdXNyL2xvY2FsL3NoYXJlL2ZvbnRzIiwNCiAjZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXw0KLSAgICAifi9MaWJyYXJ5L0ZvbnRzIiwNCi0gICAgIi9MaWJyYXJ5L0ZvbnRzIiwNCi0gICAgIi9TeXN0ZW0vTGlicmFyeS9Gb250cyIsDQorICAgICJ+L0xpYnJhcnkvRm9udHMiLCAiL0xpYnJhcnkvRm9udHMiLCAiL1N5c3RlbS9MaWJyYXJ5L0ZvbnRzIiwNCiAjZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FORFJPSURfDQogICAgICIvc3lzdGVtL2ZvbnRzIiwNCiAjZW5kaWYNCiB9Ow0KLUNGWF9Gb250U291cmNlRW51bV9GaWxlOjpDRlhfRm9udFNvdXJjZUVudW1fRmlsZSgpDQotew0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplb2YoZ19Gb250Rm9sZGVycykgLyBzaXplb2YoY29uc3QgRlhfQ0hBUiopOyBpKyspIHsNCi0gICAgICAgIG1fRm9sZGVyUGF0aHMuQWRkKGdfRm9udEZvbGRlcnNbaV0pOw0KLSAgICB9DQorQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU6OkNGWF9Gb250U291cmNlRW51bV9GaWxlKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZW9mKGdfRm9udEZvbGRlcnMpIC8gc2l6ZW9mKGNvbnN0IEZYX0NIQVIqKTsgaSsrKSB7DQorICAgIG1fRm9sZGVyUGF0aHMuQWRkKGdfRm9udEZvbGRlcnNbaV0pOw0KKyAgfQ0KIH0NCi1DRlhfQnl0ZVN0cmluZyBDRlhfRm9udFNvdXJjZUVudW1fRmlsZTo6R2V0TmV4dEZpbGUoKQ0KLXsNCitDRlhfQnl0ZVN0cmluZyBDRlhfRm9udFNvdXJjZUVudW1fRmlsZTo6R2V0TmV4dEZpbGUoKSB7DQogUmVzdGFydDoNCi0gICAgdm9pZCogcEN1ckhhbmRsZSA9IG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpID09IDAgPyBOVUxMIDogbV9Gb2xkZXJRdWV1ZS5HZXREYXRhUHRyKG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpIC0gMSktPnBGaWxlSGFuZGxlOw0KLSAgICBpZiAoTlVMTCA9PSBwQ3VySGFuZGxlKSB7DQotICAgICAgICBpZiAobV9Gb2xkZXJQYXRocy5HZXRTaXplKCkgPCAxKSB7DQotICAgICAgICAgICAgcmV0dXJuICIiOw0KKyAgdm9pZCogcEN1ckhhbmRsZSA9DQorICAgICAgbV9Gb2xkZXJRdWV1ZS5HZXRTaXplKCkgPT0gMA0KKyAgICAgICAgICA/IE5VTEwNCisgICAgICAgICAgOiBtX0ZvbGRlclF1ZXVlLkdldERhdGFQdHIobV9Gb2xkZXJRdWV1ZS5HZXRTaXplKCkgLSAxKS0+cEZpbGVIYW5kbGU7DQorICBpZiAoTlVMTCA9PSBwQ3VySGFuZGxlKSB7DQorICAgIGlmIChtX0ZvbGRlclBhdGhzLkdldFNpemUoKSA8IDEpIHsNCisgICAgICByZXR1cm4gIiI7DQorICAgIH0NCisgICAgcEN1ckhhbmRsZSA9IEZYX09wZW5Gb2xkZXIobV9Gb2xkZXJQYXRoc1ttX0ZvbGRlclBhdGhzLkdldFNpemUoKSAtIDFdKTsNCisgICAgRlhfSGFuZGxlUGFyZW50UGF0aCBocHA7DQorICAgIGhwcC5wRmlsZUhhbmRsZSA9IHBDdXJIYW5kbGU7DQorICAgIGhwcC5ic1BhcmVudFBhdGggPSBtX0ZvbGRlclBhdGhzW21fRm9sZGVyUGF0aHMuR2V0U2l6ZSgpIC0gMV07DQorICAgIG1fRm9sZGVyUXVldWUuQWRkKGhwcCk7DQorICB9DQorICBDRlhfQnl0ZVN0cmluZyBic05hbWU7DQorICBGWF9CT09MIGJGb2xkZXI7DQorICBDRlhfQnl0ZVN0cmluZyBic0ZvbGRlclNwZWFyYXRvciA9DQorICAgICAgQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKENGWF9XaWRlU3RyaW5nKEZYX0dldEZvbGRlclNlcGFyYXRvcigpKSk7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBpZiAoIUZYX0dldE5leHRGaWxlKHBDdXJIYW5kbGUsIGJzTmFtZSwgYkZvbGRlcikpIHsNCisgICAgICBGWF9DbG9zZUZvbGRlcihwQ3VySGFuZGxlKTsNCisgICAgICBtX0ZvbGRlclF1ZXVlLlJlbW92ZUF0KG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpIC0gMSk7DQorICAgICAgaWYgKG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpID09IDApIHsNCisgICAgICAgIG1fRm9sZGVyUGF0aHMuUmVtb3ZlQXQobV9Gb2xkZXJQYXRocy5HZXRTaXplKCkgLSAxKTsNCisgICAgICAgIGlmIChtX0ZvbGRlclBhdGhzLkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICAgIHJldHVybiAiIjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGdvdG8gUmVzdGFydDsNCiAgICAgICAgIH0NCi0gICAgICAgIHBDdXJIYW5kbGUgPSBGWF9PcGVuRm9sZGVyKG1fRm9sZGVyUGF0aHNbbV9Gb2xkZXJQYXRocy5HZXRTaXplKCkgLSAxXSk7DQotICAgICAgICBGWF9IYW5kbGVQYXJlbnRQYXRoIGhwcDsNCi0gICAgICAgIGhwcC5wRmlsZUhhbmRsZSA9IHBDdXJIYW5kbGU7DQotICAgICAgICBocHAuYnNQYXJlbnRQYXRoID0gbV9Gb2xkZXJQYXRoc1ttX0ZvbGRlclBhdGhzLkdldFNpemUoKSAtIDFdOw0KLSAgICAgICAgbV9Gb2xkZXJRdWV1ZS5BZGQoaHBwKTsNCisgICAgICB9DQorICAgICAgcEN1ckhhbmRsZSA9DQorICAgICAgICAgIG1fRm9sZGVyUXVldWUuR2V0RGF0YVB0cihtX0ZvbGRlclF1ZXVlLkdldFNpemUoKSAtIDEpLT5wRmlsZUhhbmRsZTsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZyBic05hbWU7DQotICAgIEZYX0JPT0wJYkZvbGRlcjsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNGb2xkZXJTcGVhcmF0b3IgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoQ0ZYX1dpZGVTdHJpbmcoRlhfR2V0Rm9sZGVyU2VwYXJhdG9yKCkpKTsNCi0gICAgd2hpbGUgKFRSVUUpIHsNCi0gICAgICAgIGlmICghRlhfR2V0TmV4dEZpbGUocEN1ckhhbmRsZSwgYnNOYW1lLCBiRm9sZGVyKSkgew0KLSAgICAgICAgICAgIEZYX0Nsb3NlRm9sZGVyKHBDdXJIYW5kbGUpOw0KLSAgICAgICAgICAgIG1fRm9sZGVyUXVldWUuUmVtb3ZlQXQobV9Gb2xkZXJRdWV1ZS5HZXRTaXplKCkgLSAxKTsNCi0gICAgICAgICAgICBpZiAobV9Gb2xkZXJRdWV1ZS5HZXRTaXplKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICBtX0ZvbGRlclBhdGhzLlJlbW92ZUF0KG1fRm9sZGVyUGF0aHMuR2V0U2l6ZSgpIC0gMSk7DQotICAgICAgICAgICAgICAgIGlmIChtX0ZvbGRlclBhdGhzLkdldFNpemUoKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBnb3RvIFJlc3RhcnQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcEN1ckhhbmRsZSA9IG1fRm9sZGVyUXVldWUuR2V0RGF0YVB0cihtX0ZvbGRlclF1ZXVlLkdldFNpemUoKSAtIDEpLT5wRmlsZUhhbmRsZTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChic05hbWUgPT0gIi4iIHx8IGJzTmFtZSA9PSAiLi4iKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYkZvbGRlcikgew0KLSAgICAgICAgICAgIEZYX0hhbmRsZVBhcmVudFBhdGggaHBwOw0KLSAgICAgICAgICAgIGhwcC5ic1BhcmVudFBhdGggPSBtX0ZvbGRlclF1ZXVlLkdldERhdGFQdHIobV9Gb2xkZXJRdWV1ZS5HZXRTaXplKCkgLSAxKS0+YnNQYXJlbnRQYXRoICsgYnNGb2xkZXJTcGVhcmF0b3IgKyBic05hbWU7DQotICAgICAgICAgICAgaHBwLnBGaWxlSGFuZGxlID0gRlhfT3BlbkZvbGRlcihocHAuYnNQYXJlbnRQYXRoKTsNCi0gICAgICAgICAgICBpZiAoaHBwLnBGaWxlSGFuZGxlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fRm9sZGVyUXVldWUuQWRkKGhwcCk7DQotICAgICAgICAgICAgcEN1ckhhbmRsZSA9IGhwcC5wRmlsZUhhbmRsZTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGJzTmFtZSA9IG1fRm9sZGVyUXVldWUuR2V0RGF0YVB0cihtX0ZvbGRlclF1ZXVlLkdldFNpemUoKSAtIDEpLT5ic1BhcmVudFBhdGggKyBic0ZvbGRlclNwZWFyYXRvciArIGJzTmFtZTsNCi0gICAgICAgIGJyZWFrOw0KKyAgICBpZiAoYnNOYW1lID09ICIuIiB8fCBic05hbWUgPT0gIi4uIikgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIHJldHVybiBic05hbWU7DQorICAgIGlmIChiRm9sZGVyKSB7DQorICAgICAgRlhfSGFuZGxlUGFyZW50UGF0aCBocHA7DQorICAgICAgaHBwLmJzUGFyZW50UGF0aCA9DQorICAgICAgICAgIG1fRm9sZGVyUXVldWUuR2V0RGF0YVB0cihtX0ZvbGRlclF1ZXVlLkdldFNpemUoKSAtIDEpLT5ic1BhcmVudFBhdGggKw0KKyAgICAgICAgICBic0ZvbGRlclNwZWFyYXRvciArIGJzTmFtZTsNCisgICAgICBocHAucEZpbGVIYW5kbGUgPSBGWF9PcGVuRm9sZGVyKGhwcC5ic1BhcmVudFBhdGgpOw0KKyAgICAgIGlmIChocHAucEZpbGVIYW5kbGUgPT0gTlVMTCkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIG1fRm9sZGVyUXVldWUuQWRkKGhwcCk7DQorICAgICAgcEN1ckhhbmRsZSA9IGhwcC5wRmlsZUhhbmRsZTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBic05hbWUgPQ0KKyAgICAgICAgbV9Gb2xkZXJRdWV1ZS5HZXREYXRhUHRyKG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpIC0gMSktPmJzUGFyZW50UGF0aCArDQorICAgICAgICBic0ZvbGRlclNwZWFyYXRvciArIGJzTmFtZTsNCisgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gYnNOYW1lOw0KIH0NCi1GWF9QT1NJVElPTiBDRlhfRm9udFNvdXJjZUVudW1fRmlsZTo6R2V0U3RhcnRQb3NpdGlvbiggdm9pZCogcFVzZXJEYXRhICApDQotew0KLSAgICBtX3dzTmV4dCA9IEdldE5leHRGaWxlKCkuVVRGOERlY29kZSgpOw0KLSAgICBpZiAoMCA9PSBtX3dzTmV4dC5HZXRMZW5ndGgoKSkgew0KLSAgICAgICAgcmV0dXJuIChGWF9QT1NJVElPTikwOw0KLSAgICB9DQotICAgIHJldHVybiAoRlhfUE9TSVRJT04pIC0gMTsNCitGWF9QT1NJVElPTiBDRlhfRm9udFNvdXJjZUVudW1fRmlsZTo6R2V0U3RhcnRQb3NpdGlvbih2b2lkKiBwVXNlckRhdGEpIHsNCisgIG1fd3NOZXh0ID0gR2V0TmV4dEZpbGUoKS5VVEY4RGVjb2RlKCk7DQorICBpZiAoMCA9PSBtX3dzTmV4dC5HZXRMZW5ndGgoKSkgew0KKyAgICByZXR1cm4gKEZYX1BPU0lUSU9OKTA7DQorICB9DQorICByZXR1cm4gKEZYX1BPU0lUSU9OKS0xOw0KIH0NCi1JRlhfRmlsZUFjY2VzcyogQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU6OkdldE5leHQoIEZYX1BPU0lUSU9OJiBwb3MsIHZvaWQqIHBVc2VyRGF0YSAgKQ0KLXsNCi0gICAgSUZYX0ZpbGVBY2Nlc3MqIHBBY2Nlc3MgPSBGWF9DcmVhdGVEZWZhdWx0RmlsZUFjY2VzcyhtX3dzTmV4dCk7DQotICAgIG1fd3NOZXh0ID0gR2V0TmV4dEZpbGUoKS5VVEY4RGVjb2RlKCk7DQotICAgIHBvcyA9IDAgIT0gbV93c05leHQuR2V0TGVuZ3RoKCkgPyBwQWNjZXNzIDogTlVMTDsNCi0gICAgcmV0dXJuIChJRlhfRmlsZUFjY2VzcyopcEFjY2VzczsNCitJRlhfRmlsZUFjY2VzcyogQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU6OkdldE5leHQoRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKSB7DQorICBJRlhfRmlsZUFjY2VzcyogcEFjY2VzcyA9IEZYX0NyZWF0ZURlZmF1bHRGaWxlQWNjZXNzKG1fd3NOZXh0KTsNCisgIG1fd3NOZXh0ID0gR2V0TmV4dEZpbGUoKS5VVEY4RGVjb2RlKCk7DQorICBwb3MgPSAwICE9IG1fd3NOZXh0LkdldExlbmd0aCgpID8gcEFjY2VzcyA6IE5VTEw7DQorICByZXR1cm4gKElGWF9GaWxlQWNjZXNzKilwQWNjZXNzOw0KIH0NCi1JRlhfRm9udFNvdXJjZUVudW0qCUZYX0NyZWF0ZURlZmF1bHRGb250U291cmNlRW51bSgpDQotew0KLSAgICByZXR1cm4gKElGWF9Gb250U291cmNlRW51bSopRlhfTkVXIENGWF9Gb250U291cmNlRW51bV9GaWxlOw0KK0lGWF9Gb250U291cmNlRW51bSogRlhfQ3JlYXRlRGVmYXVsdEZvbnRTb3VyY2VFbnVtKCkgew0KKyAgcmV0dXJuIChJRlhfRm9udFNvdXJjZUVudW0qKUZYX05FVyBDRlhfRm9udFNvdXJjZUVudW1fRmlsZTsNCiB9DQotSUZYX0ZvbnRNZ3IqIElGWF9Gb250TWdyOjpDcmVhdGUoSUZYX0ZvbnRTb3VyY2VFbnVtKiBwRm9udEVudW0sIElGWF9Gb250TWdyRGVsZWdhdGUqIHBEZWxlZ2F0ZSwgdm9pZCogcFVzZXJEYXRhKQ0KLXsNCi0gICAgaWYgKE5VTEwgPT0gcEZvbnRFbnVtKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfRm9udE1nckltcCogcEZvbnRNZ3IgPSBGWF9ORVcgQ0ZYX0ZvbnRNZ3JJbXAocEZvbnRFbnVtLCBwRGVsZWdhdGUsIHBVc2VyRGF0YSk7DQotICAgIGlmIChOVUxMID09IHBGb250TWdyKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAocEZvbnRNZ3ItPkVudW1Gb250cygpKSB7DQotICAgICAgICByZXR1cm4gcEZvbnRNZ3I7DQotICAgIH0NCi0gICAgZGVsZXRlIHBGb250TWdyOw0KK0lGWF9Gb250TWdyKiBJRlhfRm9udE1ncjo6Q3JlYXRlKElGWF9Gb250U291cmNlRW51bSogcEZvbnRFbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyRGVsZWdhdGUqIHBEZWxlZ2F0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpIHsNCisgIGlmIChOVUxMID09IHBGb250RW51bSkgew0KICAgICByZXR1cm4gTlVMTDsNCi19DQotQ0ZYX0ZvbnRNZ3JJbXA6OkNGWF9Gb250TWdySW1wKCBJRlhfRm9udFNvdXJjZUVudW0qIHBGb250RW51bSwgSUZYX0ZvbnRNZ3JEZWxlZ2F0ZSogcERlbGVnYXRlICwgdm9pZCogcFVzZXJEYXRhICApDQotICAgIDogbV9wRm9udFNvdXJjZShwRm9udEVudW0pDQotICAgICwgbV9wRGVsZWdhdGUocERlbGVnYXRlKQ0KLSAgICAsIG1fcFVzZXJEYXRhKHBVc2VyRGF0YSkNCi17DQotfQ0KLUZYX0JPT0wgQ0ZYX0ZvbnRNZ3JJbXA6OkVudW1Gb250cygpDQotew0KLSAgICBGWEZUX0xpYnJhcnkmIGxpYnJhcnkgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5Ow0KLSAgICBpZiAobGlicmFyeSA9PSBOVUxMKSB7DQotICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJmxpYnJhcnkpOw0KLSAgICB9DQotICAgIGlmIChsaWJyYXJ5ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWEZUX0ZhY2UgcEZhY2UgPSBOVUxMOw0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX3BGb250U291cmNlLT5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIElGWF9GaWxlQWNjZXNzKiBwRm9udFNvdXJjZSA9IE5VTEw7DQotICAgIElGWF9GaWxlUmVhZCogcEZvbnRTdHJlYW0gPSBOVUxMOw0KLSAgICB3aGlsZSAocG9zKSB7DQotICAgICAgICBwRm9udFNvdXJjZSA9IG1fcEZvbnRTb3VyY2UtPkdldE5leHQocG9zKTsNCi0gICAgICAgIHBGb250U3RyZWFtID0gcEZvbnRTb3VyY2UtPkNyZWF0ZUZpbGVTdHJlYW0oRlhfRklMRU1PREVfUmVhZE9ubHkpOw0KLSAgICAgICAgaWYgKE5VTEwgPT0gcEZvbnRTdHJlYW0pIHsNCi0gICAgICAgICAgICBwRm9udFNvdXJjZS0+UmVsZWFzZSgpOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKE5VTEwgPT0gKHBGYWNlID0gTG9hZEZhY2UocEZvbnRTdHJlYW0sIDApKSkgew0KLSAgICAgICAgICAgIHBGb250U3RyZWFtLT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgcEZvbnRTb3VyY2UtPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgbkZhY2VDb3VudCA9IHBGYWNlLT5udW1fZmFjZXM7DQotICAgICAgICBSZXBvcnRGYWNlKHBGYWNlLCBtX0luc3RhbGxlZEZvbnRzLCBwRm9udFNvdXJjZSk7DQotICAgICAgICBpZiAoRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpKSB7DQotICAgICAgICAgICAgRlhGVF9DbGVhcl9GYWNlX0V4dGVybmFsX1N0cmVhbShwRmFjZSk7DQotICAgICAgICB9DQotICAgICAgICBGWEZUX0RvbmVfRmFjZShwRmFjZSk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBuRmFjZUNvdW50OyBpKyspIHsNCi0gICAgICAgICAgICBpZiAoTlVMTCA9PSAocEZhY2UgPSBMb2FkRmFjZShwRm9udFN0cmVhbSwgaSkpKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBSZXBvcnRGYWNlKHBGYWNlLCBtX0luc3RhbGxlZEZvbnRzLCBwRm9udFNvdXJjZSk7DQotICAgICAgICAgICAgaWYgKEZYRlRfR2V0X0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKHBGYWNlKSkgew0KLSAgICAgICAgICAgICAgICBGWEZUX0NsZWFyX0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKHBGYWNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhGVF9Eb25lX0ZhY2UocEZhY2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcEZvbnRTdHJlYW0tPlJlbGVhc2UoKTsNCi0gICAgICAgIHBGb250U291cmNlLT5SZWxlYXNlKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXZvaWQgQ0ZYX0ZvbnRNZ3JJbXA6OlJlbGVhc2UoKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9JbnN0YWxsZWRGb250cy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgZGVsZXRlIG1fSW5zdGFsbGVkRm9udHNbaV07DQotICAgIH0NCi0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9IYXNoMkNhbmRpZGF0ZUxpc3QuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocG9zKSB7DQotICAgICAgICBGWF9EV09SRCBkd0hhc2g7DQotICAgICAgICBDRlhfRm9udERlc2NyaXB0b3JJbmZvcyogcERlc2NzOw0KLSAgICAgICAgbV9IYXNoMkNhbmRpZGF0ZUxpc3QuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRGVzY3MpOw0KLSAgICAgICAgaWYgKE5VTEwgIT0gcERlc2NzKSB7DQotICAgICAgICAgICAgZGVsZXRlIHBEZXNjczsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwb3MgPSBtX0hhc2gyRm9udHMuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocG9zKSB7DQotICAgICAgICBGWF9EV09SRCBkd0hhc2g7DQotICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+KiBwRm9udHM7DQotICAgICAgICBtX0hhc2gyRm9udHMuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRm9udHMpOw0KLSAgICAgICAgaWYgKE5VTEwgIT0gcEZvbnRzKSB7DQotICAgICAgICAgICAgZGVsZXRlIHBGb250czsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX0hhc2gyRm9udHMuUmVtb3ZlQWxsKCk7DQotICAgIHBvcyA9IG1fSGFzaDJGaWxlQWNjZXNzLkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBvcykgew0KLSAgICAgICAgRlhfRFdPUkQgZHdIYXNoOw0KLSAgICAgICAgSUZYX0ZpbGVBY2Nlc3MqIHBGaWxlQWNjZXNzOw0KLSAgICAgICAgbV9IYXNoMkZpbGVBY2Nlc3MuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRmlsZUFjY2Vzcyk7DQotICAgICAgICBpZiAoTlVMTCAhPSBwRmlsZUFjY2Vzcykgew0KLSAgICAgICAgICAgIHBGaWxlQWNjZXNzLT5SZWxlYXNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcG9zID0gbV9GaWxlQWNjZXNzMklGWEZvbnQuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocG9zKSB7DQotICAgICAgICBGWF9EV09SRCBkd0hhc2g7DQotICAgICAgICBJRlhfRm9udCogcEZvbnQ7DQotICAgICAgICBtX0ZpbGVBY2Nlc3MySUZYRm9udC5HZXROZXh0QXNzb2MocG9zLCBkd0hhc2gsIHBGb250KTsNCi0gICAgICAgIGlmIChOVUxMICE9IHBGb250KSB7DQotICAgICAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwb3MgPSBtX0lGWEZvbnQyRmlsZVJlYWQuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocG9zKSB7DQotICAgICAgICBJRlhfRm9udCogcEZvbnQ7DQotICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZDsNCi0gICAgICAgIG1fSUZYRm9udDJGaWxlUmVhZC5HZXROZXh0QXNzb2MocG9zLCBwRm9udCwgcEZpbGVSZWFkKTsNCi0gICAgICAgIHBGaWxlUmVhZC0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIGRlbGV0ZSB0aGlzOw0KLX0NCi1JRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkdldERlZkZvbnRCeUNvZGVQYWdlKCBGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSAgKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEwgPT0gbV9wRGVsZWdhdGUgPyBOVUxMIDogbV9wRGVsZWdhdGUtPkdldERlZkZvbnRCeUNvZGVQYWdlKHRoaXMsIHdDb2RlUGFnZSwgZHdGb250U3R5bGVzLCBwc3pGb250RmFtaWx5KTsNCi19DQotSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXREZWZGb250QnlDaGFyc2V0KCB1aW50OF90IG5DaGFyc2V0LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ICApDQotew0KLSAgICByZXR1cm4gTlVMTCA9PSBtX3BEZWxlZ2F0ZSA/IE5VTEwgOiBtX3BEZWxlZ2F0ZS0+R2V0RGVmRm9udEJ5Q2hhcnNldCh0aGlzLCBuQ2hhcnNldCwgZHdGb250U3R5bGVzLCBwc3pGb250RmFtaWx5KTsNCi19DQotSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXREZWZGb250QnlVbmljb2RlKCBGWF9XQ0hBUiB3VW5pY29kZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSAgKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEwgPT0gbV9wRGVsZWdhdGUgPyBOVUxMIDogbV9wRGVsZWdhdGUtPkdldERlZkZvbnRCeVVuaWNvZGUodGhpcywgd1VuaWNvZGUsIGR3Rm9udFN0eWxlcywgcHN6Rm9udEZhbWlseSk7DQotfQ0KLUlGWF9Gb250KiBDRlhfRm9udE1nckltcDo6R2V0RGVmRm9udEJ5TGFuZ3VhZ2UoIEZYX1dPUkQgd0xhbmd1YWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ICApDQotew0KLSAgICByZXR1cm4gTlVMTCA9PSBtX3BEZWxlZ2F0ZSA/IE5VTEwgOiBtX3BEZWxlZ2F0ZS0+R2V0RGVmRm9udEJ5TGFuZ3VhZ2UodGhpcywgd0xhbmd1YWdlLCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KLX0NCi1JRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkdldEZvbnRCeUNvZGVQYWdlKCBGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSAgKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNIYXNoOw0KLSAgICBic0hhc2guRm9ybWF0KCIlZCwgJWQiLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQotICAgIGJzSGFzaCArPSBDRlhfV2lkZVN0cmluZyhwc3pGb250RmFtaWx5KS5VVEY4RW5jb2RlKCk7DQotICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKGJzSGFzaCwgYnNIYXNoLkdldExlbmd0aCgpKTsNCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPiogcEZvbnRzID0gTlVMTDsNCi0gICAgSUZYX0ZvbnQqIHBGb250ID0gTlVMTDsNCi0gICAgaWYgKG1fSGFzaDJGb250cy5Mb29rdXAoZHdIYXNoLCBwRm9udHMpKSB7DQotICAgICAgICBpZiAoTlVMTCA9PSBwRm9udHMpIHsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICgwICE9IHBGb250cy0+R2V0U2l6ZSgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIHBGb250cy0+R2V0QXQoMCktPlJldGFpbigpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChOVUxMID09IHBGb250cykgew0KLSAgICAgICAgcEZvbnRzID0gRlhfTkVXIENGWF9BcnJheVRlbXBsYXRlPElGWF9Gb250Kj47DQotICAgIH0NCi0gICAgaWYgKE5VTEwgPT0gcEZvbnRzKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBtX0hhc2gyRm9udHMuU2V0QXQoZHdIYXNoLCBwRm9udHMpOw0KLSAgICBDRlhfRm9udERlc2NyaXB0b3JJbmZvcyogc29ydGVkRm9udHMgPSBOVUxMOw0KLSAgICBpZiAoIW1fSGFzaDJDYW5kaWRhdGVMaXN0Lkxvb2t1cChkd0hhc2gsIHNvcnRlZEZvbnRzKSkgew0KLSAgICAgICAgc29ydGVkRm9udHMgPSBGWF9ORVcgQ0ZYX0ZvbnREZXNjcmlwdG9ySW5mb3M7DQotICAgICAgICBNYXRjaEZvbnRzKCpzb3J0ZWRGb250cywgd0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMsIENGWF9XaWRlU3RyaW5nKHBzekZvbnRGYW1pbHkpLCAwKTsNCi0gICAgICAgIG1fSGFzaDJDYW5kaWRhdGVMaXN0LlNldEF0KGR3SGFzaCwgc29ydGVkRm9udHMpOw0KLSAgICB9DQotICAgIGlmIChzb3J0ZWRGb250cy0+R2V0U2l6ZSgpID09IDApIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENGWF9Gb250RGVzY3JpcHRvciogcERlc2MgPSBzb3J0ZWRGb250cy0+R2V0QXQoMCkucEZvbnQ7DQotICAgIHBGb250ID0gTG9hZEZvbnQocERlc2MtPm1fcEZpbGVBY2Nlc3MsIHBEZXNjLT5tX25GYWNlSW5kZXgsIE5VTEwpOw0KLSAgICBpZiAoTlVMTCAhPSBwRm9udCkgew0KLSAgICAgICAgcEZvbnQtPlNldExvZ2ljYWxGb250U3R5bGUoZHdGb250U3R5bGVzKTsNCi0gICAgfQ0KLSAgICBwRm9udHMtPkFkZChwRm9udCk7DQotICAgIHJldHVybiBwRm9udDsNCi19DQotSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXRGb250QnlDaGFyc2V0KCB1aW50OF90IG5DaGFyc2V0LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ICApDQotew0KLSAgICByZXR1cm4gR2V0Rm9udEJ5Q29kZVBhZ2UoRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldChuQ2hhcnNldCksIGR3Rm9udFN0eWxlcywgcHN6Rm9udEZhbWlseSk7DQotfQ0KLUlGWF9Gb250KiBDRlhfRm9udE1nckltcDo6R2V0Rm9udEJ5VW5pY29kZSggRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgICkNCi17DQotICAgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQotICAgIGlmIChtX0ZhaWxlZFVuaWNvZGVzMk5VTEwuTG9va3VwKHdVbmljb2RlLCBwRm9udCkpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIEZHQVNfTFBDRk9OVFVTQiB4ID0gRkdBU19HZXRVbmljb2RlQml0RmllbGQod1VuaWNvZGUpOw0KLSAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IE5VTEwgPT0geCA/IDB4RkZGRiA6IHgtPndDb2RlUGFnZTsNCi0gICAgRlhfV09SRCB3Qml0RmllbGQgPSBOVUxMID09IHggPyA5OTkgOiB4LT53Qml0RmllbGQ7DQotICAgIENGWF9CeXRlU3RyaW5nIGJzSGFzaDsNCi0gICAgaWYgKHdDb2RlUGFnZSA9PSAweEZGRkYpIHsNCi0gICAgICAgIGJzSGFzaC5Gb3JtYXQoIiVkLCAlZCwgJWQiLCB3Q29kZVBhZ2UsIHdCaXRGaWVsZCwgZHdGb250U3R5bGVzKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGJzSGFzaC5Gb3JtYXQoIiVkLCAlZCIsIHdDb2RlUGFnZSwgZHdGb250U3R5bGVzKTsNCi0gICAgfQ0KLSAgICBic0hhc2ggKz0gQ0ZYX1dpZGVTdHJpbmcocHN6Rm9udEZhbWlseSkuVVRGOEVuY29kZSgpOw0KLSAgICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShic0hhc2gsIGJzSGFzaC5HZXRMZW5ndGgoKSk7DQotICAgIENGWF9BcnJheVRlbXBsYXRlPElGWF9Gb250Kj4qIHBGb250cyA9IE5VTEw7DQotICAgIGlmIChtX0hhc2gyRm9udHMuTG9va3VwKGR3SGFzaCwgcEZvbnRzKSkgew0KLSAgICAgICAgaWYgKE5VTEwgPT0gcEZvbnRzKSB7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBpZiAoMCAhPSBwRm9udHMtPkdldFNpemUoKSkgew0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBGb250cy0+R2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgaWYgKFZlcmlmeVVuaWNvZGUocEZvbnRzLT5HZXRBdChpKSwgd1VuaWNvZGUpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEZvbnRzLT5HZXRBdChpKS0+UmV0YWluKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKE5VTEwgPT0gcEZvbnRzKSB7DQotICAgICAgICBwRm9udHMgPSBGWF9ORVcgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPjsNCi0gICAgfQ0KLSAgICBpZiAoTlVMTCA9PSBwRm9udHMpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIG1fSGFzaDJGb250cy5TZXRBdChkd0hhc2gsIHBGb250cyk7DQotICAgIENGWF9Gb250RGVzY3JpcHRvckluZm9zKiBzb3J0ZWRGb250cyA9IE5VTEw7DQotICAgIGlmICghbV9IYXNoMkNhbmRpZGF0ZUxpc3QuTG9va3VwKGR3SGFzaCwgc29ydGVkRm9udHMpKSB7DQotICAgICAgICBzb3J0ZWRGb250cyA9IEZYX05FVyBDRlhfRm9udERlc2NyaXB0b3JJbmZvczsNCi0gICAgICAgIE1hdGNoRm9udHMoKnNvcnRlZEZvbnRzLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywgQ0ZYX1dpZGVTdHJpbmcocHN6Rm9udEZhbWlseSksIHdVbmljb2RlKTsNCi0gICAgICAgIG1fSGFzaDJDYW5kaWRhdGVMaXN0LlNldEF0KGR3SGFzaCwgc29ydGVkRm9udHMpOw0KLSAgICB9DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNvcnRlZEZvbnRzLT5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRGVzYyA9IHNvcnRlZEZvbnRzLT5HZXRBdChpKS5wRm9udDsNCi0gICAgICAgIGlmIChWZXJpZnlVbmljb2RlKHBEZXNjLCB3VW5pY29kZSkpIHsNCi0gICAgICAgICAgICBwRm9udCA9IExvYWRGb250KHBEZXNjLT5tX3BGaWxlQWNjZXNzLCBwRGVzYy0+bV9uRmFjZUluZGV4LCBOVUxMKTsNCi0gICAgICAgICAgICBpZiAoTlVMTCAhPSBwRm9udCkgew0KLSAgICAgICAgICAgICAgICBwRm9udC0+U2V0TG9naWNhbEZvbnRTdHlsZShkd0ZvbnRTdHlsZXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwRm9udHMtPkFkZChwRm9udCk7DQotICAgICAgICAgICAgcmV0dXJuIHBGb250Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChOVUxMID09IHBzekZvbnRGYW1pbHkpIHsNCi0gICAgICAgIG1fRmFpbGVkVW5pY29kZXMyTlVMTC5TZXRBdCh3VW5pY29kZSwgTlVMTCk7DQotICAgIH0NCisgIH0NCisgIENGWF9Gb250TWdySW1wKiBwRm9udE1nciA9DQorICAgICAgRlhfTkVXIENGWF9Gb250TWdySW1wKHBGb250RW51bSwgcERlbGVnYXRlLCBwVXNlckRhdGEpOw0KKyAgaWYgKE5VTEwgPT0gcEZvbnRNZ3IpIHsNCiAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAocEZvbnRNZ3ItPkVudW1Gb250cygpKSB7DQorICAgIHJldHVybiBwRm9udE1ncjsNCisgIH0NCisgIGRlbGV0ZSBwRm9udE1ncjsNCisgIHJldHVybiBOVUxMOw0KIH0NCi1GWF9CT09MIENGWF9Gb250TWdySW1wOjpWZXJpZnlVbmljb2RlKCBDRlhfRm9udERlc2NyaXB0b3IqIHBEZXNjLCBGWF9XQ0hBUiB3Y1VuaWNvZGUgKQ0KLXsNCi0gICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQgPSBwRGVzYy0+bV9wRmlsZUFjY2Vzcy0+Q3JlYXRlRmlsZVN0cmVhbShGWF9GSUxFTU9ERV9SZWFkT25seSk7DQotICAgIGlmIChOVUxMID09IHBGaWxlUmVhZCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK0NGWF9Gb250TWdySW1wOjpDRlhfRm9udE1nckltcChJRlhfRm9udFNvdXJjZUVudW0qIHBGb250RW51bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3JEZWxlZ2F0ZSogcERlbGVnYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpDQorICAgIDogbV9wRm9udFNvdXJjZShwRm9udEVudW0pLA0KKyAgICAgIG1fcERlbGVnYXRlKHBEZWxlZ2F0ZSksDQorICAgICAgbV9wVXNlckRhdGEocFVzZXJEYXRhKSB7fQ0KK0ZYX0JPT0wgQ0ZYX0ZvbnRNZ3JJbXA6OkVudW1Gb250cygpIHsNCisgIEZYRlRfTGlicmFyeSYgbGlicmFyeSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnk7DQorICBpZiAobGlicmFyeSA9PSBOVUxMKSB7DQorICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmbGlicmFyeSk7DQorICB9DQorICBpZiAobGlicmFyeSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYRlRfRmFjZSBwRmFjZSA9IE5VTEw7DQorICBGWF9QT1NJVElPTiBwb3MgPSBtX3BGb250U291cmNlLT5HZXRTdGFydFBvc2l0aW9uKCk7DQorICBJRlhfRmlsZUFjY2VzcyogcEZvbnRTb3VyY2UgPSBOVUxMOw0KKyAgSUZYX0ZpbGVSZWFkKiBwRm9udFN0cmVhbSA9IE5VTEw7DQorICB3aGlsZSAocG9zKSB7DQorICAgIHBGb250U291cmNlID0gbV9wRm9udFNvdXJjZS0+R2V0TmV4dChwb3MpOw0KKyAgICBwRm9udFN0cmVhbSA9IHBGb250U291cmNlLT5DcmVhdGVGaWxlU3RyZWFtKEZYX0ZJTEVNT0RFX1JlYWRPbmx5KTsNCisgICAgaWYgKE5VTEwgPT0gcEZvbnRTdHJlYW0pIHsNCisgICAgICBwRm9udFNvdXJjZS0+UmVsZWFzZSgpOw0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIEZYRlRfRmFjZSBwRmFjZSA9IExvYWRGYWNlKHBGaWxlUmVhZCwgcERlc2MtPm1fbkZhY2VJbmRleCk7DQotICAgIGlmIChOVUxMID09IHBGYWNlKSB7DQotICAgICAgICBnb3RvIEJhZFJldDsNCisgICAgaWYgKE5VTEwgPT0gKHBGYWNlID0gTG9hZEZhY2UocEZvbnRTdHJlYW0sIDApKSkgew0KKyAgICAgIHBGb250U3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgcEZvbnRTb3VyY2UtPlJlbGVhc2UoKTsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBpZiAoMCAhPSBGWEZUX1NlbGVjdF9DaGFybWFwKHBGYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpKSB7DQotICAgICAgICBnb3RvIEJhZFJldDsNCi0gICAgfQ0KLSAgICBpZiAoMCA9PSBGWEZUX0dldF9DaGFyX0luZGV4KHBGYWNlLCB3Y1VuaWNvZGUpKSB7DQotICAgICAgICBnb3RvIEJhZFJldDsNCi0gICAgfQ0KLSAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgICAgaW50MzJfdCBuRmFjZUNvdW50ID0gcEZhY2UtPm51bV9mYWNlczsNCisgICAgUmVwb3J0RmFjZShwRmFjZSwgbV9JbnN0YWxsZWRGb250cywgcEZvbnRTb3VyY2UpOw0KICAgICBpZiAoRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpKSB7DQotICAgICAgICBGWEZUX0NsZWFyX0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKHBGYWNlKTsNCisgICAgICBGWEZUX0NsZWFyX0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKHBGYWNlKTsNCiAgICAgfQ0KICAgICBGWEZUX0RvbmVfRmFjZShwRmFjZSk7DQotICAgIHJldHVybiBUUlVFOw0KLUJhZFJldDoNCi0gICAgaWYgKE5VTEwgIT0gcEZpbGVSZWFkKSB7DQotICAgICAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbkZhY2VDb3VudDsgaSsrKSB7DQorICAgICAgaWYgKE5VTEwgPT0gKHBGYWNlID0gTG9hZEZhY2UocEZvbnRTdHJlYW0sIGkpKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIFJlcG9ydEZhY2UocEZhY2UsIG1fSW5zdGFsbGVkRm9udHMsIHBGb250U291cmNlKTsNCisgICAgICBpZiAoRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpKSB7DQorICAgICAgICBGWEZUX0NsZWFyX0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKHBGYWNlKTsNCisgICAgICB9DQorICAgICAgRlhGVF9Eb25lX0ZhY2UocEZhY2UpOw0KICAgICB9DQotICAgIGlmIChOVUxMICE9IHBGYWNlKSB7DQotICAgICAgICBpZiAoRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpKSB7DQotICAgICAgICAgICAgRlhGVF9DbGVhcl9GYWNlX0V4dGVybmFsX1N0cmVhbShwRmFjZSk7DQotICAgICAgICB9DQotICAgICAgICBGWEZUX0RvbmVfRmFjZShwRmFjZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KKyAgICBwRm9udFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICBwRm9udFNvdXJjZS0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX0ZvbnRNZ3JJbXA6OlZlcmlmeVVuaWNvZGUoIElGWF9Gb250KiBwRm9udCwgRlhfV0NIQVIgd2NVbmljb2RlICkNCi17DQotICAgIGlmIChOVUxMID09IHBGb250KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQordm9pZCBDRlhfRm9udE1nckltcDo6UmVsZWFzZSgpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fSW5zdGFsbGVkRm9udHMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgZGVsZXRlIG1fSW5zdGFsbGVkRm9udHNbaV07DQorICB9DQorICBGWF9QT1NJVElPTiBwb3MgPSBtX0hhc2gyQ2FuZGlkYXRlTGlzdC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIEZYX0RXT1JEIGR3SGFzaDsNCisgICAgQ0ZYX0ZvbnREZXNjcmlwdG9ySW5mb3MqIHBEZXNjczsNCisgICAgbV9IYXNoMkNhbmRpZGF0ZUxpc3QuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRGVzY3MpOw0KKyAgICBpZiAoTlVMTCAhPSBwRGVzY3MpIHsNCisgICAgICBkZWxldGUgcERlc2NzOw0KICAgICB9DQotICAgIEZYRlRfRmFjZSBwRmFjZSA9ICgoQ0ZYX0ZvbnQqKXBGb250LT5HZXREZXZGb250KCkpLT5tX0ZhY2U7DQotICAgIEZYRlRfQ2hhck1hcCBjaGFybWFwID0gRlhGVF9HZXRfRmFjZV9DaGFybWFwKHBGYWNlKTsNCi0gICAgaWYgKDAgIT0gRlhGVF9TZWxlY3RfQ2hhcm1hcChwRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcG9zID0gbV9IYXNoMkZvbnRzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwb3MpIHsNCisgICAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+KiBwRm9udHM7DQorICAgIG1fSGFzaDJGb250cy5HZXROZXh0QXNzb2MocG9zLCBkd0hhc2gsIHBGb250cyk7DQorICAgIGlmIChOVUxMICE9IHBGb250cykgew0KKyAgICAgIGRlbGV0ZSBwRm9udHM7DQogICAgIH0NCi0gICAgaWYgKDAgPT0gRlhGVF9HZXRfQ2hhcl9JbmRleChwRmFjZSwgd2NVbmljb2RlKSkgew0KLSAgICAgICAgRlhGVF9TZXRfQ2hhcm1hcChwRmFjZSwgY2hhcm1hcCk7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX0hhc2gyRm9udHMuUmVtb3ZlQWxsKCk7DQorICBwb3MgPSBtX0hhc2gyRmlsZUFjY2Vzcy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIEZYX0RXT1JEIGR3SGFzaDsNCisgICAgSUZYX0ZpbGVBY2Nlc3MqIHBGaWxlQWNjZXNzOw0KKyAgICBtX0hhc2gyRmlsZUFjY2Vzcy5HZXROZXh0QXNzb2MocG9zLCBkd0hhc2gsIHBGaWxlQWNjZXNzKTsNCisgICAgaWYgKE5VTEwgIT0gcEZpbGVBY2Nlc3MpIHsNCisgICAgICBwRmlsZUFjY2Vzcy0+UmVsZWFzZSgpOw0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcG9zID0gbV9GaWxlQWNjZXNzMklGWEZvbnQuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBGWF9EV09SRCBkd0hhc2g7DQorICAgIElGWF9Gb250KiBwRm9udDsNCisgICAgbV9GaWxlQWNjZXNzMklGWEZvbnQuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRm9udCk7DQorICAgIGlmIChOVUxMICE9IHBGb250KSB7DQorICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgfQ0KKyAgcG9zID0gbV9JRlhGb250MkZpbGVSZWFkLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwb3MpIHsNCisgICAgSUZYX0ZvbnQqIHBGb250Ow0KKyAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZDsNCisgICAgbV9JRlhGb250MkZpbGVSZWFkLkdldE5leHRBc3NvYyhwb3MsIHBGb250LCBwRmlsZVJlYWQpOw0KKyAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgIH0NCisgIGRlbGV0ZSB0aGlzOw0KIH0NCi1JRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkdldEZvbnRCeUxhbmd1YWdlKCBGWF9XT1JEIHdMYW5ndWFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSAgKQ0KLXsNCi0gICAgcmV0dXJuIEdldEZvbnRCeUNvZGVQYWdlKEZYX0dldERlZkNvZGVQYWdlQnlMYW5ndWFnZSh3TGFuZ3VhZ2UpLCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KK0lGWF9Gb250KiBDRlhfRm9udE1nckltcDo6R2V0RGVmRm9udEJ5Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSkgew0KKyAgcmV0dXJuIE5VTEwgPT0gbV9wRGVsZWdhdGUgPyBOVUxMIDogbV9wRGVsZWdhdGUtPkdldERlZkZvbnRCeUNvZGVQYWdlKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHdDb2RlUGFnZSwgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzekZvbnRGYW1pbHkpOw0KIH0NCi1JRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkxvYWRGb250KCBjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgsIGludDMyX3QgaUZhY2VJbmRleCwgaW50MzJfdCogcEZhY2VDb3VudCApDQotew0KLSAgICB2b2lkKiBIYXNoWzJdID0geyh2b2lkKikodWludHB0cl90KXBCdWZmZXIsICh2b2lkKikodWludHB0cl90KWlMZW5ndGh9Ow0KLSAgICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QSgoY29uc3QgRlhfQ0hBUiopSGFzaCwgMiAqIHNpemVvZiAodm9pZCopKTsNCi0gICAgSUZYX0ZpbGVBY2Nlc3MqIHBGb250QWNjZXNzID0gTlVMTDsNCi0gICAgaWYgKCFtX0hhc2gyRmlsZUFjY2Vzcy5Mb29rdXAoZHdIYXNoLCBwRm9udEFjY2VzcykpIHsNCi0gICAgfQ0KLSAgICBpZiAoTlVMTCAhPSBwRm9udEFjY2Vzcykgew0KLSAgICAgICAgcmV0dXJuIExvYWRGb250KHBGb250QWNjZXNzLCBpRmFjZUluZGV4LCBwRmFjZUNvdW50LCBUUlVFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXREZWZGb250QnlDaGFyc2V0KHVpbnQ4X3QgbkNoYXJzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkpIHsNCisgIHJldHVybiBOVUxMID09IG1fcERlbGVnYXRlID8gTlVMTA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX3BEZWxlZ2F0ZS0+R2V0RGVmRm9udEJ5Q2hhcnNldCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG5DaGFyc2V0LCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KIH0NCi1JRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkxvYWRGb250KCBjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUsIGludDMyX3QgaUZhY2VJbmRleCwgaW50MzJfdCogcEZhY2VDb3VudCApDQotew0KLSAgICBDRlhfQnl0ZVN0cmluZyBic0hhc2g7DQotICAgIGJzSGFzaCArPSBDRlhfV2lkZVN0cmluZyhwc3pGaWxlTmFtZSkuVVRGOEVuY29kZSgpOw0KLSAgICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QSgoY29uc3QgRlhfQ0hBUiopYnNIYXNoLCBic0hhc2guR2V0TGVuZ3RoKCkpOw0KLSAgICBJRlhfRmlsZUFjY2VzcyogcEZvbnRBY2Nlc3MgPSBOVUxMOw0KLSAgICBpZiAoIW1fSGFzaDJGaWxlQWNjZXNzLkxvb2t1cChkd0hhc2gsIHBGb250QWNjZXNzKSkgew0KLSAgICAgICAgcEZvbnRBY2Nlc3MgPSBGWF9DcmVhdGVEZWZhdWx0RmlsZUFjY2Vzcyhwc3pGaWxlTmFtZSk7DQotICAgICAgICBtX0hhc2gyRmlsZUFjY2Vzcy5TZXRBdChkd0hhc2gsIHBGb250QWNjZXNzKTsNCi0gICAgfQ0KLSAgICBpZiAoTlVMTCAhPSBwRm9udEFjY2Vzcykgew0KLSAgICAgICAgcmV0dXJuIExvYWRGb250KHBGb250QWNjZXNzLCBpRmFjZUluZGV4LCBwRmFjZUNvdW50LCBUUlVFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXREZWZGb250QnlVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7DQorICByZXR1cm4gTlVMTCA9PSBtX3BEZWxlZ2F0ZSA/IE5VTEwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9wRGVsZWdhdGUtPkdldERlZkZvbnRCeVVuaWNvZGUoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCB3VW5pY29kZSwgZHdGb250U3R5bGVzLCBwc3pGb250RmFtaWx5KTsNCiB9DQotSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpMb2FkRm9udCggSUZYX1N0cmVhbSogcEZvbnRTdHJlYW0sIGludDMyX3QgaUZhY2VJbmRleCwgaW50MzJfdCogcEZhY2VDb3VudCwgRlhfQk9PTCBiU2F2ZVN0cmVhbSAgKQ0KLXsNCi0gICAgdm9pZCogSGFzaFsxXSA9IHsodm9pZCopKHVpbnRwdHJfdClwRm9udFN0cmVhbX07DQotICAgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKilIYXNoLCAxICogc2l6ZW9mICh2b2lkKikpOw0KLSAgICBJRlhfRmlsZUFjY2VzcyogcEZvbnRBY2Nlc3MgPSBOVUxMOw0KLSAgICBpZiAoIW1fSGFzaDJGaWxlQWNjZXNzLkxvb2t1cChkd0hhc2gsIHBGb250QWNjZXNzKSkgew0KLSAgICB9DQotICAgIGlmIChOVUxMICE9IHBGb250QWNjZXNzKSB7DQotICAgICAgICByZXR1cm4gTG9hZEZvbnQocEZvbnRBY2Nlc3MsIGlGYWNlSW5kZXgsIHBGYWNlQ291bnQsIFRSVUUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkdldERlZkZvbnRCeUxhbmd1YWdlKEZYX1dPUkQgd0xhbmd1YWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkpIHsNCisgIHJldHVybiBOVUxMID09IG1fcERlbGVnYXRlID8gTlVMTCA6IG1fcERlbGVnYXRlLT5HZXREZWZGb250QnlMYW5ndWFnZSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCB3TGFuZ3VhZ2UsIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3pGb250RmFtaWx5KTsNCiB9DQotSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpMb2FkRm9udCggSUZYX0ZpbGVBY2Nlc3MqIHBGb250QWNjZXNzLCBpbnQzMl90IGlGYWNlSW5kZXgsIGludDMyX3QqIHBGYWNlQ291bnQsIEZYX0JPT0wgYldhbnRDYWNoZSApDQotew0KLSAgICBGWF9EV09SRCBkd0hhc2ggPSAwOw0KLSAgICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KLSAgICBpZiAoYldhbnRDYWNoZSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNIYXNoOw0KLSAgICAgICAgYnNIYXNoLkZvcm1hdCgiJWQsICVkIiwgKHVpbnRwdHJfdClwRm9udEFjY2VzcywgaUZhY2VJbmRleCk7DQotICAgICAgICBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShic0hhc2gsIGJzSGFzaC5HZXRMZW5ndGgoKSk7DQotICAgICAgICBpZiAobV9GaWxlQWNjZXNzMklGWEZvbnQuTG9va3VwKGR3SGFzaCwgcEZvbnQpKSB7DQotICAgICAgICAgICAgaWYgKE5VTEwgIT0gcEZvbnQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gcEZhY2VDb3VudCkgew0KLSAgICAgICAgICAgICAgICAgICAgKnBGYWNlQ291bnQgPSAoKENGWF9Gb250KilwRm9udC0+R2V0RGV2Rm9udCgpKS0+bV9GYWNlLT5udW1fZmFjZXM7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXRGb250QnlDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7DQorICBDRlhfQnl0ZVN0cmluZyBic0hhc2g7DQorICBic0hhc2guRm9ybWF0KCIlZCwgJWQiLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQorICBic0hhc2ggKz0gQ0ZYX1dpZGVTdHJpbmcocHN6Rm9udEZhbWlseSkuVVRGOEVuY29kZSgpOw0KKyAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoYnNIYXNoLCBic0hhc2guR2V0TGVuZ3RoKCkpOw0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPiogcEZvbnRzID0gTlVMTDsNCisgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICBpZiAobV9IYXNoMkZvbnRzLkxvb2t1cChkd0hhc2gsIHBGb250cykpIHsNCisgICAgaWYgKE5VTEwgPT0gcEZvbnRzKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQogICAgIH0NCi0gICAgQ0ZYX0ZvbnQqIHBJbnRlcm5hbEZvbnQgPSBGWF9ORVcgQ0ZYX0ZvbnQ7DQotICAgIGlmIChOVUxMID09IHBJbnRlcm5hbEZvbnQpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KKyAgICBpZiAoMCAhPSBwRm9udHMtPkdldFNpemUoKSkgew0KKyAgICAgIHJldHVybiBwRm9udHMtPkdldEF0KDApLT5SZXRhaW4oKTsNCiAgICAgfQ0KLSAgICBJRlhfRmlsZVJlYWQqIHBGb250U3RyZWFtID0gcEZvbnRBY2Nlc3MtPkNyZWF0ZUZpbGVTdHJlYW0oRlhfRklMRU1PREVfUmVhZE9ubHkpOw0KLSAgICBpZiAoTlVMTCA9PSBwRm9udFN0cmVhbSkgew0KLSAgICAgICAgZGVsZXRlIHBJbnRlcm5hbEZvbnQ7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAoIXBJbnRlcm5hbEZvbnQtPkxvYWRGaWxlKHBGb250U3RyZWFtLCBpRmFjZUluZGV4KSkgew0KLSAgICAgICAgZGVsZXRlIHBJbnRlcm5hbEZvbnQ7DQotICAgICAgICBwRm9udFN0cmVhbS0+UmVsZWFzZSgpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEludGVybmFsRm9udCwgdGhpcywgVFJVRSk7DQotICAgIGlmIChOVUxMID09IHBGb250KSB7DQotICAgICAgICBkZWxldGUgcEludGVybmFsRm9udDsNCi0gICAgICAgIHBGb250U3RyZWFtLT5SZWxlYXNlKCk7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAoYldhbnRDYWNoZSkgew0KLSAgICAgICAgbV9GaWxlQWNjZXNzMklGWEZvbnQuU2V0QXQoZHdIYXNoLCBwRm9udCk7DQotICAgIH0NCi0gICAgbV9JRlhGb250MkZpbGVSZWFkLlNldEF0KHBGb250LCBwRm9udFN0cmVhbSk7DQotICAgIGlmIChOVUxMICE9IHBGYWNlQ291bnQpIHsNCi0gICAgICAgICpwRmFjZUNvdW50ID0gKChDRlhfRm9udCopcEZvbnQtPkdldERldkZvbnQoKSktPm1fRmFjZS0+bnVtX2ZhY2VzOw0KLSAgICB9DQotICAgIHJldHVybiBwRm9udDsNCi19DQotZXh0ZXJuICJDIg0KLXsNCi0gICAgdW5zaWduZWQgbG9uZyBfZnRTdHJlYW1SZWFkKEZYRlRfU3RyZWFtIHN0cmVhbSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCkNCi0gICAgew0KLSAgICAgICAgaWYgKGNvdW50ID09IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIElGWF9GaWxlUmVhZCogcEZpbGUgPSAoSUZYX0ZpbGVSZWFkKilzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlcjsNCi0gICAgICAgIGludCByZXMgPSBwRmlsZS0+UmVhZEJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7DQotICAgICAgICBpZiAocmVzKSB7DQotICAgICAgICAgICAgcmV0dXJuIGNvdW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgdm9pZCBfZnRTdHJlYW1DbG9zZShGWEZUX1N0cmVhbSBzdHJlYW0pDQotICAgIHsNCi0gICAgfQ0KLX07DQotRlhGVF9GYWNlIENGWF9Gb250TWdySW1wOjpMb2FkRmFjZSggSUZYX0ZpbGVSZWFkKiBwRm9udFN0cmVhbSwgaW50MzJfdCBpRmFjZUluZGV4ICkNCi17DQotICAgIEZYRlRfTGlicmFyeSYgbGlicmFyeSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnk7DQotICAgIEZYRlRfT3Blbl9BcmdzIGZ0QXJnczsNCi0gICAgRlhGVF9TdHJlYW0gZnRTdHJlYW0gPSBGWF9BbGxvYyhGWEZUX1N0cmVhbVJlYywgMSk7DQotICAgIEZYRlRfRmFjZSBwRmFjZSA9IE5VTEw7DQotICAgIGlmIChsaWJyYXJ5ID09IE5VTEwpIHsNCi0gICAgICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmbGlicmFyeSk7DQotICAgIH0NCi0gICAgaWYgKGxpYnJhcnkgPT0gTlVMTCkgew0KLSAgICAgICAgZ290byBCYWRSZXQ7DQotICAgIH0NCi0gICAgRlhTWVNfbWVtc2V0KCZmdEFyZ3MsIDAsIHNpemVvZihGWEZUX09wZW5fQXJncykpOw0KLSAgICBpZiAoTlVMTCA9PSBmdFN0cmVhbSkgew0KLSAgICAgICAgZ290byBCYWRSZXQ7DQotICAgIH0NCi0gICAgRlhTWVNfbWVtc2V0KGZ0U3RyZWFtLCAwLCBzaXplb2YoRlhGVF9TdHJlYW1SZWMpKTsNCi0gICAgaWYgKE5VTEwgPT0gcEZvbnRTdHJlYW0pIHsNCi0gICAgICAgIGdvdG8gQmFkUmV0Ow0KLSAgICB9DQotICAgIGZ0U3RyZWFtLT5iYXNlID0gTlVMTDsNCi0gICAgZnRTdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IHBGb250U3RyZWFtOw0KLSAgICBmdFN0cmVhbS0+cG9zID0gMDsNCi0gICAgZnRTdHJlYW0tPnNpemUgPSAodW5zaWduZWQgbG9uZylwRm9udFN0cmVhbS0+R2V0U2l6ZSgpOw0KLSAgICBmdFN0cmVhbS0+cmVhZCA9IF9mdFN0cmVhbVJlYWQ7DQotICAgIGZ0U3RyZWFtLT5jbG9zZSA9IF9mdFN0cmVhbUNsb3NlOw0KLSAgICBmdEFyZ3MuZmxhZ3MgfD0gRlRfT1BFTl9TVFJFQU07DQotICAgIGZ0QXJncy5zdHJlYW0gPSBmdFN0cmVhbTsNCi0gICAgaWYgKDAgIT0gRlhGVF9PcGVuX0ZhY2UobGlicmFyeSwgJmZ0QXJncywgaUZhY2VJbmRleCwgJnBGYWNlKSkgew0KLSAgICAgICAgZ290byBCYWRSZXQ7DQotICAgIH0NCi0gICAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMocEZhY2UsIDAsIDY0KTsNCi0gICAgcmV0dXJuIHBGYWNlOw0KLUJhZFJldDoNCi0gICAgaWYgKE5VTEwgIT0gZnRTdHJlYW0pIHsNCi0gICAgICAgIEZYX0ZyZWUoZnRTdHJlYW0pOw0KLSAgICB9DQorICB9DQorICBpZiAoTlVMTCA9PSBwRm9udHMpIHsNCisgICAgcEZvbnRzID0gRlhfTkVXIENGWF9BcnJheVRlbXBsYXRlPElGWF9Gb250Kj47DQorICB9DQorICBpZiAoTlVMTCA9PSBwRm9udHMpIHsNCiAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBtX0hhc2gyRm9udHMuU2V0QXQoZHdIYXNoLCBwRm9udHMpOw0KKyAgQ0ZYX0ZvbnREZXNjcmlwdG9ySW5mb3MqIHNvcnRlZEZvbnRzID0gTlVMTDsNCisgIGlmICghbV9IYXNoMkNhbmRpZGF0ZUxpc3QuTG9va3VwKGR3SGFzaCwgc29ydGVkRm9udHMpKSB7DQorICAgIHNvcnRlZEZvbnRzID0gRlhfTkVXIENGWF9Gb250RGVzY3JpcHRvckluZm9zOw0KKyAgICBNYXRjaEZvbnRzKCpzb3J0ZWRGb250cywgd0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcocHN6Rm9udEZhbWlseSksIDApOw0KKyAgICBtX0hhc2gyQ2FuZGlkYXRlTGlzdC5TZXRBdChkd0hhc2gsIHNvcnRlZEZvbnRzKTsNCisgIH0NCisgIGlmIChzb3J0ZWRGb250cy0+R2V0U2l6ZSgpID09IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfRm9udERlc2NyaXB0b3IqIHBEZXNjID0gc29ydGVkRm9udHMtPkdldEF0KDApLnBGb250Ow0KKyAgcEZvbnQgPSBMb2FkRm9udChwRGVzYy0+bV9wRmlsZUFjY2VzcywgcERlc2MtPm1fbkZhY2VJbmRleCwgTlVMTCk7DQorICBpZiAoTlVMTCAhPSBwRm9udCkgew0KKyAgICBwRm9udC0+U2V0TG9naWNhbEZvbnRTdHlsZShkd0ZvbnRTdHlsZXMpOw0KKyAgfQ0KKyAgcEZvbnRzLT5BZGQocEZvbnQpOw0KKyAgcmV0dXJuIHBGb250Ow0KIH0NCi1pbnQzMl90IENGWF9Gb250TWdySW1wOjpNYXRjaEZvbnRzKCBDRlhfRm9udERlc2NyaXB0b3JJbmZvcyYgTWF0Y2hlZEZvbnRzLCBGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgRm9udE5hbWUsIEZYX1dDSEFSIHdjVW5pY29kZSApDQotew0KLSAgICBNYXRjaGVkRm9udHMuUmVtb3ZlQWxsKCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTm9ybWFsaXplZEZvbnROYW1lID0gRm9udE5hbWU7DQotICAgIE5vcm1hbGl6ZUZvbnROYW1lKHdzTm9ybWFsaXplZEZvbnROYW1lKTsNCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3Qgbk1heCA9IDB4ZmZmZjsNCi0gICAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRm9udCA9IE5VTEw7DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9JbnN0YWxsZWRGb250cy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQotICAgICAgICBwRm9udCA9IG1fSW5zdGFsbGVkRm9udHNbaV07DQotICAgICAgICBpbnQzMl90IG5QZW5hbHR5ID0gQ2FsY1BlbmFsdHkocEZvbnQsIHdDb2RlUGFnZSwgZHdGb250U3R5bGVzLCB3c05vcm1hbGl6ZWRGb250TmFtZSwgd2NVbmljb2RlKTsNCi0gICAgICAgIGlmIChuUGVuYWx0eSA+PSAweEZGRkYpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZvbnREZXNjcmlwdG9ySW5mbyBGb250SW5mbzsNCi0gICAgICAgIEZvbnRJbmZvLnBGb250ID0gcEZvbnQ7DQotICAgICAgICBGb250SW5mby5uUGVuYWx0eSA9IG5QZW5hbHR5Ow0KLSAgICAgICAgTWF0Y2hlZEZvbnRzLkFkZChGb250SW5mbyk7DQotICAgICAgICBpZiAoTWF0Y2hlZEZvbnRzLkdldFNpemUoKSA9PSBuTWF4KSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXRGb250QnlDaGFyc2V0KHVpbnQ4X3QgbkNoYXJzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkpIHsNCisgIHJldHVybiBHZXRGb250QnlDb2RlUGFnZShGWF9HZXRDb2RlUGFnZUZyb21DaGFyc2V0KG5DaGFyc2V0KSwgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzekZvbnRGYW1pbHkpOw0KK30NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkdldEZvbnRCeVVuaWNvZGUoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkpIHsNCisgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICBpZiAobV9GYWlsZWRVbmljb2RlczJOVUxMLkxvb2t1cCh3VW5pY29kZSwgcEZvbnQpKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRkdBU19MUENGT05UVVNCIHggPSBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZCh3VW5pY29kZSk7DQorICBGWF9XT1JEIHdDb2RlUGFnZSA9IE5VTEwgPT0geCA/IDB4RkZGRiA6IHgtPndDb2RlUGFnZTsNCisgIEZYX1dPUkQgd0JpdEZpZWxkID0gTlVMTCA9PSB4ID8gOTk5IDogeC0+d0JpdEZpZWxkOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNIYXNoOw0KKyAgaWYgKHdDb2RlUGFnZSA9PSAweEZGRkYpIHsNCisgICAgYnNIYXNoLkZvcm1hdCgiJWQsICVkLCAlZCIsIHdDb2RlUGFnZSwgd0JpdEZpZWxkLCBkd0ZvbnRTdHlsZXMpOw0KKyAgfSBlbHNlIHsNCisgICAgYnNIYXNoLkZvcm1hdCgiJWQsICVkIiwgd0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMpOw0KKyAgfQ0KKyAgYnNIYXNoICs9IENGWF9XaWRlU3RyaW5nKHBzekZvbnRGYW1pbHkpLlVURjhFbmNvZGUoKTsNCisgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKGJzSGFzaCwgYnNIYXNoLkdldExlbmd0aCgpKTsNCisgIENGWF9BcnJheVRlbXBsYXRlPElGWF9Gb250Kj4qIHBGb250cyA9IE5VTEw7DQorICBpZiAobV9IYXNoMkZvbnRzLkxvb2t1cChkd0hhc2gsIHBGb250cykpIHsNCisgICAgaWYgKE5VTEwgPT0gcEZvbnRzKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQogICAgIH0NCi0gICAgaWYgKE1hdGNoZWRGb250cy5HZXRTaXplKCkgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQorICAgIGlmICgwICE9IHBGb250cy0+R2V0U2l6ZSgpKSB7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcEZvbnRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgaWYgKFZlcmlmeVVuaWNvZGUocEZvbnRzLT5HZXRBdChpKSwgd1VuaWNvZGUpKSB7DQorICAgICAgICAgIHJldHVybiBwRm9udHMtPkdldEF0KGkpLT5SZXRhaW4oKTsNCisgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi0gICAgQ0ZYX1NTb3J0VGVtcGxhdGU8RlhfRm9udERlc2NyaXB0b3JJbmZvPiBzc29ydDsNCi0gICAgc3NvcnQuU2hlbGxTb3J0KE1hdGNoZWRGb250cy5HZXREYXRhKCksIE1hdGNoZWRGb250cy5HZXRTaXplKCkpOw0KLSAgICByZXR1cm4gTWF0Y2hlZEZvbnRzLkdldFNpemUoKTsNCisgIH0NCisgIGlmIChOVUxMID09IHBGb250cykgew0KKyAgICBwRm9udHMgPSBGWF9ORVcgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPjsNCisgIH0NCisgIGlmIChOVUxMID09IHBGb250cykgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIG1fSGFzaDJGb250cy5TZXRBdChkd0hhc2gsIHBGb250cyk7DQorICBDRlhfRm9udERlc2NyaXB0b3JJbmZvcyogc29ydGVkRm9udHMgPSBOVUxMOw0KKyAgaWYgKCFtX0hhc2gyQ2FuZGlkYXRlTGlzdC5Mb29rdXAoZHdIYXNoLCBzb3J0ZWRGb250cykpIHsNCisgICAgc29ydGVkRm9udHMgPSBGWF9ORVcgQ0ZYX0ZvbnREZXNjcmlwdG9ySW5mb3M7DQorICAgIE1hdGNoRm9udHMoKnNvcnRlZEZvbnRzLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyhwc3pGb250RmFtaWx5KSwgd1VuaWNvZGUpOw0KKyAgICBtX0hhc2gyQ2FuZGlkYXRlTGlzdC5TZXRBdChkd0hhc2gsIHNvcnRlZEZvbnRzKTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNvcnRlZEZvbnRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICBDRlhfRm9udERlc2NyaXB0b3IqIHBEZXNjID0gc29ydGVkRm9udHMtPkdldEF0KGkpLnBGb250Ow0KKyAgICBpZiAoVmVyaWZ5VW5pY29kZShwRGVzYywgd1VuaWNvZGUpKSB7DQorICAgICAgcEZvbnQgPSBMb2FkRm9udChwRGVzYy0+bV9wRmlsZUFjY2VzcywgcERlc2MtPm1fbkZhY2VJbmRleCwgTlVMTCk7DQorICAgICAgaWYgKE5VTEwgIT0gcEZvbnQpIHsNCisgICAgICAgIHBGb250LT5TZXRMb2dpY2FsRm9udFN0eWxlKGR3Rm9udFN0eWxlcyk7DQorICAgICAgfQ0KKyAgICAgIHBGb250cy0+QWRkKHBGb250KTsNCisgICAgICByZXR1cm4gcEZvbnQ7DQorICAgIH0NCisgIH0NCisgIGlmIChOVUxMID09IHBzekZvbnRGYW1pbHkpIHsNCisgICAgbV9GYWlsZWRVbmljb2RlczJOVUxMLlNldEF0KHdVbmljb2RlLCBOVUxMKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MIENGWF9Gb250TWdySW1wOjpWZXJpZnlVbmljb2RlKENGWF9Gb250RGVzY3JpcHRvciogcERlc2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Y1VuaWNvZGUpIHsNCisgIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkID0NCisgICAgICBwRGVzYy0+bV9wRmlsZUFjY2Vzcy0+Q3JlYXRlRmlsZVN0cmVhbShGWF9GSUxFTU9ERV9SZWFkT25seSk7DQorICBpZiAoTlVMTCA9PSBwRmlsZVJlYWQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhGVF9GYWNlIHBGYWNlID0gTG9hZEZhY2UocEZpbGVSZWFkLCBwRGVzYy0+bV9uRmFjZUluZGV4KTsNCisgIGlmIChOVUxMID09IHBGYWNlKSB7DQorICAgIGdvdG8gQmFkUmV0Ow0KKyAgfQ0KKyAgaWYgKDAgIT0gRlhGVF9TZWxlY3RfQ2hhcm1hcChwRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgew0KKyAgICBnb3RvIEJhZFJldDsNCisgIH0NCisgIGlmICgwID09IEZYRlRfR2V0X0NoYXJfSW5kZXgocEZhY2UsIHdjVW5pY29kZSkpIHsNCisgICAgZ290byBCYWRSZXQ7DQorICB9DQorICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgIGlmIChGWEZUX0dldF9GYWNlX0V4dGVybmFsX1N0cmVhbShwRmFjZSkpIHsNCisgICAgRlhGVF9DbGVhcl9GYWNlX0V4dGVybmFsX1N0cmVhbShwRmFjZSk7DQorICB9DQorICBGWEZUX0RvbmVfRmFjZShwRmFjZSk7DQorICByZXR1cm4gVFJVRTsNCitCYWRSZXQ6DQorICBpZiAoTlVMTCAhPSBwRmlsZVJlYWQpIHsNCisgICAgcEZpbGVSZWFkLT5SZWxlYXNlKCk7DQorICB9DQorICBpZiAoTlVMTCAhPSBwRmFjZSkgew0KKyAgICBpZiAoRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpKSB7DQorICAgICAgRlhGVF9DbGVhcl9GYWNlX0V4dGVybmFsX1N0cmVhbShwRmFjZSk7DQorICAgIH0NCisgICAgRlhGVF9Eb25lX0ZhY2UocEZhY2UpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGWF9Gb250TWdySW1wOjpWZXJpZnlVbmljb2RlKElGWF9Gb250KiBwRm9udCwgRlhfV0NIQVIgd2NVbmljb2RlKSB7DQorICBpZiAoTlVMTCA9PSBwRm9udCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWEZUX0ZhY2UgcEZhY2UgPSAoKENGWF9Gb250KilwRm9udC0+R2V0RGV2Rm9udCgpKS0+bV9GYWNlOw0KKyAgRlhGVF9DaGFyTWFwIGNoYXJtYXAgPSBGWEZUX0dldF9GYWNlX0NoYXJtYXAocEZhY2UpOw0KKyAgaWYgKDAgIT0gRlhGVF9TZWxlY3RfQ2hhcm1hcChwRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoMCA9PSBGWEZUX0dldF9DaGFyX0luZGV4KHBGYWNlLCB3Y1VuaWNvZGUpKSB7DQorICAgIEZYRlRfU2V0X0NoYXJtYXAocEZhY2UsIGNoYXJtYXApOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXRGb250QnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7DQorICByZXR1cm4gR2V0Rm9udEJ5Q29kZVBhZ2UoRlhfR2V0RGVmQ29kZVBhZ2VCeUxhbmd1YWdlKHdMYW5ndWFnZSksIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3pGb250RmFtaWx5KTsNCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcEZhY2VDb3VudCkgew0KKyAgdm9pZCogSGFzaFsyXSA9IHsodm9pZCopKHVpbnRwdHJfdClwQnVmZmVyLCAodm9pZCopKHVpbnRwdHJfdClpTGVuZ3RofTsNCisgIEZYX0RXT1JEIGR3SGFzaCA9DQorICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKGNvbnN0IEZYX0NIQVIqKUhhc2gsIDIgKiBzaXplb2Yodm9pZCopKTsNCisgIElGWF9GaWxlQWNjZXNzKiBwRm9udEFjY2VzcyA9IE5VTEw7DQorICBpZiAoIW1fSGFzaDJGaWxlQWNjZXNzLkxvb2t1cChkd0hhc2gsIHBGb250QWNjZXNzKSkgew0KKyAgfQ0KKyAgaWYgKE5VTEwgIT0gcEZvbnRBY2Nlc3MpIHsNCisgICAgcmV0dXJuIExvYWRGb250KHBGb250QWNjZXNzLCBpRmFjZUluZGV4LCBwRmFjZUNvdW50LCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KK30NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQpIHsNCisgIENGWF9CeXRlU3RyaW5nIGJzSGFzaDsNCisgIGJzSGFzaCArPSBDRlhfV2lkZVN0cmluZyhwc3pGaWxlTmFtZSkuVVRGOEVuY29kZSgpOw0KKyAgRlhfRFdPUkQgZHdIYXNoID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QSgoY29uc3QgRlhfQ0hBUiopYnNIYXNoLCBic0hhc2guR2V0TGVuZ3RoKCkpOw0KKyAgSUZYX0ZpbGVBY2Nlc3MqIHBGb250QWNjZXNzID0gTlVMTDsNCisgIGlmICghbV9IYXNoMkZpbGVBY2Nlc3MuTG9va3VwKGR3SGFzaCwgcEZvbnRBY2Nlc3MpKSB7DQorICAgIHBGb250QWNjZXNzID0gRlhfQ3JlYXRlRGVmYXVsdEZpbGVBY2Nlc3MocHN6RmlsZU5hbWUpOw0KKyAgICBtX0hhc2gyRmlsZUFjY2Vzcy5TZXRBdChkd0hhc2gsIHBGb250QWNjZXNzKTsNCisgIH0NCisgIGlmIChOVUxMICE9IHBGb250QWNjZXNzKSB7DQorICAgIHJldHVybiBMb2FkRm9udChwRm9udEFjY2VzcywgaUZhY2VJbmRleCwgcEZhY2VDb3VudCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpMb2FkRm9udChJRlhfU3RyZWFtKiBwRm9udFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3RyZWFtKSB7DQorICB2b2lkKiBIYXNoWzFdID0geyh2b2lkKikodWludHB0cl90KXBGb250U3RyZWFtfTsNCisgIEZYX0RXT1JEIGR3SGFzaCA9DQorICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKGNvbnN0IEZYX0NIQVIqKUhhc2gsIDEgKiBzaXplb2Yodm9pZCopKTsNCisgIElGWF9GaWxlQWNjZXNzKiBwRm9udEFjY2VzcyA9IE5VTEw7DQorICBpZiAoIW1fSGFzaDJGaWxlQWNjZXNzLkxvb2t1cChkd0hhc2gsIHBGb250QWNjZXNzKSkgew0KKyAgfQ0KKyAgaWYgKE5VTEwgIT0gcEZvbnRBY2Nlc3MpIHsNCisgICAgcmV0dXJuIExvYWRGb250KHBGb250QWNjZXNzLCBpRmFjZUluZGV4LCBwRmFjZUNvdW50LCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KK30NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkxvYWRGb250KElGWF9GaWxlQWNjZXNzKiBwRm9udEFjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXYW50Q2FjaGUpIHsNCisgIEZYX0RXT1JEIGR3SGFzaCA9IDA7DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgaWYgKGJXYW50Q2FjaGUpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNIYXNoOw0KKyAgICBic0hhc2guRm9ybWF0KCIlZCwgJWQiLCAodWludHB0cl90KXBGb250QWNjZXNzLCBpRmFjZUluZGV4KTsNCisgICAgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoYnNIYXNoLCBic0hhc2guR2V0TGVuZ3RoKCkpOw0KKyAgICBpZiAobV9GaWxlQWNjZXNzMklGWEZvbnQuTG9va3VwKGR3SGFzaCwgcEZvbnQpKSB7DQorICAgICAgaWYgKE5VTEwgIT0gcEZvbnQpIHsNCisgICAgICAgIGlmIChOVUxMICE9IHBGYWNlQ291bnQpIHsNCisgICAgICAgICAgKnBGYWNlQ291bnQgPSAoKENGWF9Gb250KilwRm9udC0+R2V0RGV2Rm9udCgpKS0+bV9GYWNlLT5udW1fZmFjZXM7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgQ0ZYX0ZvbnQqIHBJbnRlcm5hbEZvbnQgPSBGWF9ORVcgQ0ZYX0ZvbnQ7DQorICBpZiAoTlVMTCA9PSBwSW50ZXJuYWxGb250KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgSUZYX0ZpbGVSZWFkKiBwRm9udFN0cmVhbSA9DQorICAgICAgcEZvbnRBY2Nlc3MtPkNyZWF0ZUZpbGVTdHJlYW0oRlhfRklMRU1PREVfUmVhZE9ubHkpOw0KKyAgaWYgKE5VTEwgPT0gcEZvbnRTdHJlYW0pIHsNCisgICAgZGVsZXRlIHBJbnRlcm5hbEZvbnQ7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKCFwSW50ZXJuYWxGb250LT5Mb2FkRmlsZShwRm9udFN0cmVhbSwgaUZhY2VJbmRleCkpIHsNCisgICAgZGVsZXRlIHBJbnRlcm5hbEZvbnQ7DQorICAgIHBGb250U3RyZWFtLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEludGVybmFsRm9udCwgdGhpcywgVFJVRSk7DQorICBpZiAoTlVMTCA9PSBwRm9udCkgew0KKyAgICBkZWxldGUgcEludGVybmFsRm9udDsNCisgICAgcEZvbnRTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAoYldhbnRDYWNoZSkgew0KKyAgICBtX0ZpbGVBY2Nlc3MySUZYRm9udC5TZXRBdChkd0hhc2gsIHBGb250KTsNCisgIH0NCisgIG1fSUZYRm9udDJGaWxlUmVhZC5TZXRBdChwRm9udCwgcEZvbnRTdHJlYW0pOw0KKyAgaWYgKE5VTEwgIT0gcEZhY2VDb3VudCkgew0KKyAgICAqcEZhY2VDb3VudCA9ICgoQ0ZYX0ZvbnQqKXBGb250LT5HZXREZXZGb250KCkpLT5tX0ZhY2UtPm51bV9mYWNlczsNCisgIH0NCisgIHJldHVybiBwRm9udDsNCit9DQorZXh0ZXJuICJDIiB7DQordW5zaWduZWQgbG9uZyBfZnRTdHJlYW1SZWFkKEZYRlRfU3RyZWFtIHN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkgew0KKyAgaWYgKGNvdW50ID09IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBJRlhfRmlsZVJlYWQqIHBGaWxlID0gKElGWF9GaWxlUmVhZCopc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXI7DQorICBpbnQgcmVzID0gcEZpbGUtPlJlYWRCbG9jayhidWZmZXIsIG9mZnNldCwgY291bnQpOw0KKyAgaWYgKHJlcykgew0KKyAgICByZXR1cm4gY291bnQ7DQorICB9DQorICByZXR1cm4gMDsNCit9DQordm9pZCBfZnRTdHJlYW1DbG9zZShGWEZUX1N0cmVhbSBzdHJlYW0pIHt9DQorfTsNCitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3JJbXA6OkxvYWRGYWNlKElGWF9GaWxlUmVhZCogcEZvbnRTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGYWNlSW5kZXgpIHsNCisgIEZYRlRfTGlicmFyeSYgbGlicmFyeSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnk7DQorICBGWEZUX09wZW5fQXJncyBmdEFyZ3M7DQorICBGWEZUX1N0cmVhbSBmdFN0cmVhbSA9IEZYX0FsbG9jKEZYRlRfU3RyZWFtUmVjLCAxKTsNCisgIEZYRlRfRmFjZSBwRmFjZSA9IE5VTEw7DQorICBpZiAobGlicmFyeSA9PSBOVUxMKSB7DQorICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmbGlicmFyeSk7DQorICB9DQorICBpZiAobGlicmFyeSA9PSBOVUxMKSB7DQorICAgIGdvdG8gQmFkUmV0Ow0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KCZmdEFyZ3MsIDAsIHNpemVvZihGWEZUX09wZW5fQXJncykpOw0KKyAgaWYgKE5VTEwgPT0gZnRTdHJlYW0pIHsNCisgICAgZ290byBCYWRSZXQ7DQorICB9DQorICBGWFNZU19tZW1zZXQoZnRTdHJlYW0sIDAsIHNpemVvZihGWEZUX1N0cmVhbVJlYykpOw0KKyAgaWYgKE5VTEwgPT0gcEZvbnRTdHJlYW0pIHsNCisgICAgZ290byBCYWRSZXQ7DQorICB9DQorICBmdFN0cmVhbS0+YmFzZSA9IE5VTEw7DQorICBmdFN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyID0gcEZvbnRTdHJlYW07DQorICBmdFN0cmVhbS0+cG9zID0gMDsNCisgIGZ0U3RyZWFtLT5zaXplID0gKHVuc2lnbmVkIGxvbmcpcEZvbnRTdHJlYW0tPkdldFNpemUoKTsNCisgIGZ0U3RyZWFtLT5yZWFkID0gX2Z0U3RyZWFtUmVhZDsNCisgIGZ0U3RyZWFtLT5jbG9zZSA9IF9mdFN0cmVhbUNsb3NlOw0KKyAgZnRBcmdzLmZsYWdzIHw9IEZUX09QRU5fU1RSRUFNOw0KKyAgZnRBcmdzLnN0cmVhbSA9IGZ0U3RyZWFtOw0KKyAgaWYgKDAgIT0gRlhGVF9PcGVuX0ZhY2UobGlicmFyeSwgJmZ0QXJncywgaUZhY2VJbmRleCwgJnBGYWNlKSkgew0KKyAgICBnb3RvIEJhZFJldDsNCisgIH0NCisgIEZYRlRfU2V0X1BpeGVsX1NpemVzKHBGYWNlLCAwLCA2NCk7DQorICByZXR1cm4gcEZhY2U7DQorQmFkUmV0Og0KKyAgaWYgKE5VTEwgIT0gZnRTdHJlYW0pIHsNCisgICAgRlhfRnJlZShmdFN0cmVhbSk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDRlhfRm9udE1nckltcDo6TWF0Y2hGb250cyhDRlhfRm9udERlc2NyaXB0b3JJbmZvcyYgTWF0Y2hlZEZvbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgRm9udE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Y1VuaWNvZGUpIHsNCisgIE1hdGNoZWRGb250cy5SZW1vdmVBbGwoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzTm9ybWFsaXplZEZvbnROYW1lID0gRm9udE5hbWU7DQorICBOb3JtYWxpemVGb250TmFtZSh3c05vcm1hbGl6ZWRGb250TmFtZSk7DQorICBzdGF0aWMgY29uc3QgaW50MzJfdCBuTWF4ID0gMHhmZmZmOw0KKyAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRm9udCA9IE5VTEw7DQorICBpbnQzMl90IG5Db3VudCA9IG1fSW5zdGFsbGVkRm9udHMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgcEZvbnQgPSBtX0luc3RhbGxlZEZvbnRzW2ldOw0KKyAgICBpbnQzMl90IG5QZW5hbHR5ID0gQ2FsY1BlbmFsdHkocEZvbnQsIHdDb2RlUGFnZSwgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NOb3JtYWxpemVkRm9udE5hbWUsIHdjVW5pY29kZSk7DQorICAgIGlmIChuUGVuYWx0eSA+PSAweEZGRkYpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBGWF9Gb250RGVzY3JpcHRvckluZm8gRm9udEluZm87DQorICAgIEZvbnRJbmZvLnBGb250ID0gcEZvbnQ7DQorICAgIEZvbnRJbmZvLm5QZW5hbHR5ID0gblBlbmFsdHk7DQorICAgIE1hdGNoZWRGb250cy5BZGQoRm9udEluZm8pOw0KKyAgICBpZiAoTWF0Y2hlZEZvbnRzLkdldFNpemUoKSA9PSBuTWF4KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChNYXRjaGVkRm9udHMuR2V0U2l6ZSgpID09IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBDRlhfU1NvcnRUZW1wbGF0ZTxGWF9Gb250RGVzY3JpcHRvckluZm8+IHNzb3J0Ow0KKyAgc3NvcnQuU2hlbGxTb3J0KE1hdGNoZWRGb250cy5HZXREYXRhKCksIE1hdGNoZWRGb250cy5HZXRTaXplKCkpOw0KKyAgcmV0dXJuIE1hdGNoZWRGb250cy5HZXRTaXplKCk7DQogfQ0KIHN0cnVjdCBGWF9CaXRDb2RlUGFnZSB7DQotICAgIEZYX1dPUkQgd0JpdDsNCi0gICAgRlhfV09SRCB3Q29kZVBhZ2U7DQorICBGWF9XT1JEIHdCaXQ7DQorICBGWF9XT1JEIHdDb2RlUGFnZTsNCiB9Ow0KIHN0YXRpYyBjb25zdCBGWF9CaXRDb2RlUGFnZSBnX0JpdDJDb2RlUGFnZVtdID0gew0KLSAgICB7MCwgMTI1Mn0sDQotICAgIHsxLCAxMjUwfSwNCi0gICAgezIsIDEyNTF9LA0KLSAgICB7MywgMTI1M30sDQotICAgIHs0LCAxMjU0fSwNCi0gICAgezUsIDEyNTV9LA0KLSAgICB7NiwgMTI1Nn0sDQotICAgIHs3LCAxMjU3fSwNCi0gICAgezgsIDEyNTh9LA0KLSAgICB7OSwgMH0sDQotICAgIHsxMCwgMH0sDQotICAgIHsxMSwgMH0sDQotICAgIHsxMiwgMH0sDQotICAgIHsxMywgMH0sDQotICAgIHsxNCwgMH0sDQotICAgIHsxNSwgMH0sDQotICAgIHsxNiwgODc0fSwNCi0gICAgezE3LCA5MzJ9LA0KLSAgICB7MTgsIDkzNn0sDQotICAgIHsxOSwgOTQ5fSwNCi0gICAgezIwLCA5NTB9LA0KLSAgICB7MjEsIDEzNjF9LA0KLSAgICB7MjIsIDB9LA0KLSAgICB7MjMsIDB9LA0KLSAgICB7MjQsIDB9LA0KLSAgICB7MjUsIDB9LA0KLSAgICB7MjYsIDB9LA0KLSAgICB7MjcsIDB9LA0KLSAgICB7MjgsIDB9LA0KLSAgICB7MjksIDB9LA0KLSAgICB7MzAsIDB9LA0KLSAgICB7MzEsIDB9LA0KLSAgICB7MzIsIDB9LA0KLSAgICB7MzMsIDB9LA0KLSAgICB7MzQsIDB9LA0KLSAgICB7MzUsIDB9LA0KLSAgICB7MzYsIDB9LA0KLSAgICB7MzcsIDB9LA0KLSAgICB7MzgsIDB9LA0KLSAgICB7MzksIDB9LA0KLSAgICB7NDAsIDB9LA0KLSAgICB7NDEsIDB9LA0KLSAgICB7NDIsIDB9LA0KLSAgICB7NDMsIDB9LA0KLSAgICB7NDQsIDB9LA0KLSAgICB7NDUsIDB9LA0KLSAgICB7NDYsIDB9LA0KLSAgICB7NDcsIDB9LA0KLSAgICB7NDgsIDg2OX0sDQotICAgIHs0OSwgODY2fSwNCi0gICAgezUwLCA4NjV9LA0KLSAgICB7NTEsIDg2NH0sDQotICAgIHs1MiwgODYzfSwNCi0gICAgezUzLCA4NjJ9LA0KLSAgICB7NTQsIDg2MX0sDQotICAgIHs1NSwgODYwfSwNCi0gICAgezU2LCA4NTd9LA0KLSAgICB7NTcsIDg1NX0sDQotICAgIHs1OCwgODUyfSwNCi0gICAgezU5LCA3NzV9LA0KLSAgICB7NjAsIDczN30sDQotICAgIHs2MSwgNzA4fSwNCi0gICAgezYyLCA4NTB9LA0KLSAgICB7NjMsIDQzN30sDQorICAgIHswLCAxMjUyfSwgezEsIDEyNTB9LCB7MiwgMTI1MX0sIHszLCAxMjUzfSwgIHs0LCAxMjU0fSwgezUsIDEyNTV9LA0KKyAgICB7NiwgMTI1Nn0sIHs3LCAxMjU3fSwgezgsIDEyNTh9LCB7OSwgMH0sICAgICB7MTAsIDB9LCAgIHsxMSwgMH0sDQorICAgIHsxMiwgMH0sICAgezEzLCAwfSwgICB7MTQsIDB9LCAgIHsxNSwgMH0sICAgIHsxNiwgODc0fSwgezE3LCA5MzJ9LA0KKyAgICB7MTgsIDkzNn0sIHsxOSwgOTQ5fSwgezIwLCA5NTB9LCB7MjEsIDEzNjF9LCB7MjIsIDB9LCAgIHsyMywgMH0sDQorICAgIHsyNCwgMH0sICAgezI1LCAwfSwgICB7MjYsIDB9LCAgIHsyNywgMH0sICAgIHsyOCwgMH0sICAgezI5LCAwfSwNCisgICAgezMwLCAwfSwgICB7MzEsIDB9LCAgIHszMiwgMH0sICAgezMzLCAwfSwgICAgezM0LCAwfSwgICB7MzUsIDB9LA0KKyAgICB7MzYsIDB9LCAgIHszNywgMH0sICAgezM4LCAwfSwgICB7MzksIDB9LCAgICB7NDAsIDB9LCAgIHs0MSwgMH0sDQorICAgIHs0MiwgMH0sICAgezQzLCAwfSwgICB7NDQsIDB9LCAgIHs0NSwgMH0sICAgIHs0NiwgMH0sICAgezQ3LCAwfSwNCisgICAgezQ4LCA4Njl9LCB7NDksIDg2Nn0sIHs1MCwgODY1fSwgezUxLCA4NjR9LCAgezUyLCA4NjN9LCB7NTMsIDg2Mn0sDQorICAgIHs1NCwgODYxfSwgezU1LCA4NjB9LCB7NTYsIDg1N30sIHs1NywgODU1fSwgIHs1OCwgODUyfSwgezU5LCA3NzV9LA0KKyAgICB7NjAsIDczN30sIHs2MSwgNzA4fSwgezYyLCA4NTB9LCB7NjMsIDQzN30sDQogfTsNCi1GWF9XT1JEIEZYX0dldENvZGVQYWdlQml0KEZYX1dPUkQgd0NvZGVQYWdlKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZW9mKGdfQml0MkNvZGVQYWdlKSAvIHNpemVvZiAoRlhfQml0Q29kZVBhZ2UpOyBpKyspIHsNCi0gICAgICAgIGlmIChnX0JpdDJDb2RlUGFnZVtpXS53Q29kZVBhZ2UgPT0gd0NvZGVQYWdlKSB7DQotICAgICAgICAgICAgcmV0dXJuIGdfQml0MkNvZGVQYWdlW2ldLndCaXQ7DQotICAgICAgICB9DQorRlhfV09SRCBGWF9HZXRDb2RlUGFnZUJpdChGWF9XT1JEIHdDb2RlUGFnZSkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZW9mKGdfQml0MkNvZGVQYWdlKSAvIHNpemVvZihGWF9CaXRDb2RlUGFnZSk7DQorICAgICAgIGkrKykgew0KKyAgICBpZiAoZ19CaXQyQ29kZVBhZ2VbaV0ud0NvZGVQYWdlID09IHdDb2RlUGFnZSkgew0KKyAgICAgIHJldHVybiBnX0JpdDJDb2RlUGFnZVtpXS53Qml0Ow0KICAgICB9DQotICAgIHJldHVybiAoRlhfV09SRCkgLSAxOw0KKyAgfQ0KKyAgcmV0dXJuIChGWF9XT1JEKS0xOw0KIH0NCi1GWF9XT1JEIEZYX0dldFVuaWNvZGVCaXQoRlhfV0NIQVIgd2NVbmljb2RlKQ0KLXsNCi0gICAgRkdBU19MUENGT05UVVNCIHggPSBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZCh3Y1VuaWNvZGUpOw0KLSAgICBpZiAoTlVMTCA9PSB4KSB7DQotICAgICAgICByZXR1cm4gOTk5Ow0KLSAgICB9DQotICAgIHJldHVybiB4LT53Qml0RmllbGQ7DQorRlhfV09SRCBGWF9HZXRVbmljb2RlQml0KEZYX1dDSEFSIHdjVW5pY29kZSkgew0KKyAgRkdBU19MUENGT05UVVNCIHggPSBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZCh3Y1VuaWNvZGUpOw0KKyAgaWYgKE5VTEwgPT0geCkgew0KKyAgICByZXR1cm4gOTk5Ow0KKyAgfQ0KKyAgcmV0dXJuIHgtPndCaXRGaWVsZDsNCiB9DQotaW50MzJfdCBDRlhfRm9udE1nckltcDo6Q2FsY1BlbmFsdHkoIENGWF9Gb250RGVzY3JpcHRvciogcEluc3RhbGxlZCwgRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIEZvbnROYW1lLCBGWF9XQ0hBUiB3Y1VuaWNvZGUgKQ0KLXsNCi0gICAgaW50MzJfdCBuUGVuYWx0eSA9IDMwMDAwOw0KLSAgICBpZiAoMCAhPSBGb250TmFtZS5HZXRMZW5ndGgoKSkgew0KLSAgICAgICAgaWYgKEZvbnROYW1lICE9IHBJbnN0YWxsZWQtPm1fd3NGYWNlTmFtZSkgew0KLSAgICAgICAgICAgIGludDMyX3QgaTsNCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEluc3RhbGxlZC0+bV93c0ZhbWlseU5hbWVzLkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIGlmIChwSW5zdGFsbGVkLT5tX3dzRmFtaWx5TmFtZXNbaV0gPT0gRm9udE5hbWUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChpID09IHBJbnN0YWxsZWQtPm1fd3NGYW1pbHlOYW1lcy5HZXRTaXplKCkpIHsNCi0gICAgICAgICAgICAgICAgblBlbmFsdHkgKz0gMHhGRkZGOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIG5QZW5hbHR5IC09IDI4MDAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgblBlbmFsdHkgLT0gMzAwMDA7DQoraW50MzJfdCBDRlhfRm9udE1nckltcDo6Q2FsY1BlbmFsdHkoQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwSW5zdGFsbGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgRm9udE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd2NVbmljb2RlKSB7DQorICBpbnQzMl90IG5QZW5hbHR5ID0gMzAwMDA7DQorICBpZiAoMCAhPSBGb250TmFtZS5HZXRMZW5ndGgoKSkgew0KKyAgICBpZiAoRm9udE5hbWUgIT0gcEluc3RhbGxlZC0+bV93c0ZhY2VOYW1lKSB7DQorICAgICAgaW50MzJfdCBpOw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFsbGVkLT5tX3dzRmFtaWx5TmFtZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGlmIChwSW5zdGFsbGVkLT5tX3dzRmFtaWx5TmFtZXNbaV0gPT0gRm9udE5hbWUpIHsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQotICAgICAgICBpZiAoMzAwMDAgPT0gblBlbmFsdHkgJiYgMCA9PSBJc1BhcnROYW1lKHBJbnN0YWxsZWQtPm1fd3NGYWNlTmFtZSwgRm9udE5hbWUpKSB7DQotICAgICAgICAgICAgaW50MzJfdCBpOw0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFsbGVkLT5tX3dzRmFtaWx5TmFtZXMuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgaWYgKDAgIT0gSXNQYXJ0TmFtZShwSW5zdGFsbGVkLT5tX3dzRmFtaWx5TmFtZXNbaV0sIEZvbnROYW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGkgPT0gcEluc3RhbGxlZC0+bV93c0ZhbWlseU5hbWVzLkdldFNpemUoKSkgew0KLSAgICAgICAgICAgICAgICBuUGVuYWx0eSArPSAweEZGRkY7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgblBlbmFsdHkgLT0gMjYwMDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBuUGVuYWx0eSAtPSAyNzAwMDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWF9EV09SRCBkd1N0eWxlTWFzayA9IHBJbnN0YWxsZWQtPm1fZHdGb250U3R5bGVzIF4gZHdGb250U3R5bGVzOw0KLSAgICBpZiAoZHdTdHlsZU1hc2sgJiBGWF9GT05UU1RZTEVfQm9sZCkgew0KLSAgICAgICAgblBlbmFsdHkgKz0gNDUwMDsNCi0gICAgfQ0KLSAgICBpZiAoZHdTdHlsZU1hc2sgJiBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCkgew0KLSAgICAgICAgblBlbmFsdHkgKz0gMTAwMDA7DQotICAgIH0NCi0gICAgaWYgKGR3U3R5bGVNYXNrICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgew0KLSAgICAgICAgblBlbmFsdHkgKz0gMTAwMDA7DQotICAgIH0NCi0gICAgaWYgKGR3U3R5bGVNYXNrICYgRlhfRk9OVFNUWUxFX1NlcmlmKSB7DQotICAgICAgICBuUGVuYWx0eSArPSA1MDA7DQotICAgIH0NCi0gICAgaWYgKGR3U3R5bGVNYXNrICYgRlhfRk9OVFNUWUxFX1N5bWJvbGljKSB7DQorICAgICAgfQ0KKyAgICAgIGlmIChpID09IHBJbnN0YWxsZWQtPm1fd3NGYW1pbHlOYW1lcy5HZXRTaXplKCkpIHsNCiAgICAgICAgIG5QZW5hbHR5ICs9IDB4RkZGRjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgblBlbmFsdHkgLT0gMjgwMDA7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5QZW5hbHR5IC09IDMwMDAwOw0KICAgICB9DQotICAgIGlmIChuUGVuYWx0eSA+PSAweEZGRkYpIHsNCi0gICAgICAgIHJldHVybiAweEZGRkY7DQotICAgIH0NCi0gICAgRlhfV09SRCB3Qml0ID0gKCgwID09IHdDb2RlUGFnZSB8fCAweEZGRkYgPT0gd0NvZGVQYWdlKSA/IChGWF9XT1JEKSAtIDEgOiBGWF9HZXRDb2RlUGFnZUJpdCh3Q29kZVBhZ2UpKTsNCi0gICAgaWYgKHdCaXQgIT0gKEZYX1dPUkQpIC0gMSkgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHdCaXQgPCA2NCk7DQotICAgICAgICBpZiAoMCA9PSAocEluc3RhbGxlZC0+bV9kd0NzYlt3Qml0IC8gMzJdICYgKDEgPDwgKHdCaXQgJSAzMikpKSkgew0KLSAgICAgICAgICAgIG5QZW5hbHR5ICs9IDB4RkZGRjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgblBlbmFsdHkgLT0gNjAwMDA7DQorICAgIGlmICgzMDAwMCA9PSBuUGVuYWx0eSAmJg0KKyAgICAgICAgMCA9PSBJc1BhcnROYW1lKHBJbnN0YWxsZWQtPm1fd3NGYWNlTmFtZSwgRm9udE5hbWUpKSB7DQorICAgICAgaW50MzJfdCBpOw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFsbGVkLT5tX3dzRmFtaWx5TmFtZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGlmICgwICE9IElzUGFydE5hbWUocEluc3RhbGxlZC0+bV93c0ZhbWlseU5hbWVzW2ldLCBGb250TmFtZSkpIHsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChpID09IHBJbnN0YWxsZWQtPm1fd3NGYW1pbHlOYW1lcy5HZXRTaXplKCkpIHsNCisgICAgICAgIG5QZW5hbHR5ICs9IDB4RkZGRjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgblBlbmFsdHkgLT0gMjYwMDA7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5QZW5hbHR5IC09IDI3MDAwOw0KICAgICB9DQotICAgIHdCaXQgPSAoKDAgPT0gd2NVbmljb2RlIHx8IDB4RkZGRSA9PSB3Y1VuaWNvZGUpID8gKEZYX1dPUkQpOTk5IDogRlhfR2V0VW5pY29kZUJpdCh3Y1VuaWNvZGUpKTsNCi0gICAgaWYgKHdCaXQgIT0gKEZYX1dPUkQpOTk5KSB7DQotICAgICAgICBGWFNZU19hc3NlcnQod0JpdCA8IDEyOCk7DQotICAgICAgICBpZiAoMCA9PSAocEluc3RhbGxlZC0+bV9kd1VzYlt3Qml0IC8gMzJdICYgKDEgPDwgKHdCaXQgJSAzMikpKSkgew0KLSAgICAgICAgICAgIG5QZW5hbHR5ICs9IDB4RkZGRjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgblBlbmFsdHkgLT0gNjAwMDA7DQotICAgICAgICB9DQorICB9DQorICBGWF9EV09SRCBkd1N0eWxlTWFzayA9IHBJbnN0YWxsZWQtPm1fZHdGb250U3R5bGVzIF4gZHdGb250U3R5bGVzOw0KKyAgaWYgKGR3U3R5bGVNYXNrICYgRlhfRk9OVFNUWUxFX0JvbGQpIHsNCisgICAgblBlbmFsdHkgKz0gNDUwMDsNCisgIH0NCisgIGlmIChkd1N0eWxlTWFzayAmIEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoKSB7DQorICAgIG5QZW5hbHR5ICs9IDEwMDAwOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bGVNYXNrICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgew0KKyAgICBuUGVuYWx0eSArPSAxMDAwMDsNCisgIH0NCisgIGlmIChkd1N0eWxlTWFzayAmIEZYX0ZPTlRTVFlMRV9TZXJpZikgew0KKyAgICBuUGVuYWx0eSArPSA1MDA7DQorICB9DQorICBpZiAoZHdTdHlsZU1hc2sgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpIHsNCisgICAgblBlbmFsdHkgKz0gMHhGRkZGOw0KKyAgfQ0KKyAgaWYgKG5QZW5hbHR5ID49IDB4RkZGRikgew0KKyAgICByZXR1cm4gMHhGRkZGOw0KKyAgfQ0KKyAgRlhfV09SRCB3Qml0ID0NCisgICAgICAoKDAgPT0gd0NvZGVQYWdlIHx8IDB4RkZGRiA9PSB3Q29kZVBhZ2UpID8gKEZYX1dPUkQpLTENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhfR2V0Q29kZVBhZ2VCaXQod0NvZGVQYWdlKSk7DQorICBpZiAod0JpdCAhPSAoRlhfV09SRCktMSkgew0KKyAgICBGWFNZU19hc3NlcnQod0JpdCA8IDY0KTsNCisgICAgaWYgKDAgPT0gKHBJbnN0YWxsZWQtPm1fZHdDc2Jbd0JpdCAvIDMyXSAmICgxIDw8ICh3Qml0ICUgMzIpKSkpIHsNCisgICAgICBuUGVuYWx0eSArPSAweEZGRkY7DQorICAgIH0gZWxzZSB7DQorICAgICAgblBlbmFsdHkgLT0gNjAwMDA7DQogICAgIH0NCi0gICAgcmV0dXJuIG5QZW5hbHR5Ow0KKyAgfQ0KKyAgd0JpdCA9DQorICAgICAgKCgwID09IHdjVW5pY29kZSB8fCAweEZGRkUgPT0gd2NVbmljb2RlKSA/IChGWF9XT1JEKTk5OQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWF9HZXRVbmljb2RlQml0KHdjVW5pY29kZSkpOw0KKyAgaWYgKHdCaXQgIT0gKEZYX1dPUkQpOTk5KSB7DQorICAgIEZYU1lTX2Fzc2VydCh3Qml0IDwgMTI4KTsNCisgICAgaWYgKDAgPT0gKHBJbnN0YWxsZWQtPm1fZHdVc2Jbd0JpdCAvIDMyXSAmICgxIDw8ICh3Qml0ICUgMzIpKSkpIHsNCisgICAgICBuUGVuYWx0eSArPSAweEZGRkY7DQorICAgIH0gZWxzZSB7DQorICAgICAgblBlbmFsdHkgLT0gNjAwMDA7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBuUGVuYWx0eTsNCiB9DQotdm9pZCBDRlhfRm9udE1nckltcDo6Q2xlYXJGb250Q2FjaGUoKQ0KLXsNCi0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9IYXNoMkNhbmRpZGF0ZUxpc3QuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocG9zKSB7DQotICAgICAgICBGWF9EV09SRCBkd0hhc2g7DQotICAgICAgICBDRlhfRm9udERlc2NyaXB0b3JJbmZvcyogcERlc2NzOw0KLSAgICAgICAgbV9IYXNoMkNhbmRpZGF0ZUxpc3QuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRGVzY3MpOw0KLSAgICAgICAgaWYgKE5VTEwgIT0gcERlc2NzKSB7DQotICAgICAgICAgICAgZGVsZXRlIHBEZXNjczsNCi0gICAgICAgIH0NCit2b2lkIENGWF9Gb250TWdySW1wOjpDbGVhckZvbnRDYWNoZSgpIHsNCisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fSGFzaDJDYW5kaWRhdGVMaXN0LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwb3MpIHsNCisgICAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgICBDRlhfRm9udERlc2NyaXB0b3JJbmZvcyogcERlc2NzOw0KKyAgICBtX0hhc2gyQ2FuZGlkYXRlTGlzdC5HZXROZXh0QXNzb2MocG9zLCBkd0hhc2gsIHBEZXNjcyk7DQorICAgIGlmIChOVUxMICE9IHBEZXNjcykgew0KKyAgICAgIGRlbGV0ZSBwRGVzY3M7DQogICAgIH0NCi0gICAgcG9zID0gbV9GaWxlQWNjZXNzMklGWEZvbnQuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocG9zKSB7DQotICAgICAgICBGWF9EV09SRCBkd0hhc2g7DQotICAgICAgICBJRlhfRm9udCogcEZvbnQ7DQotICAgICAgICBtX0ZpbGVBY2Nlc3MySUZYRm9udC5HZXROZXh0QXNzb2MocG9zLCBkd0hhc2gsIHBGb250KTsNCi0gICAgICAgIGlmIChOVUxMICE9IHBGb250KSB7DQotICAgICAgICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCi0gICAgICAgIH0NCisgIH0NCisgIHBvcyA9IG1fRmlsZUFjY2VzczJJRlhGb250LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwb3MpIHsNCisgICAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgICBJRlhfRm9udCogcEZvbnQ7DQorICAgIG1fRmlsZUFjY2VzczJJRlhGb250LkdldE5leHRBc3NvYyhwb3MsIGR3SGFzaCwgcEZvbnQpOw0KKyAgICBpZiAoTlVMTCAhPSBwRm9udCkgew0KKyAgICAgIHBGb250LT5SZWxlYXNlKCk7DQogICAgIH0NCi0gICAgcG9zID0gbV9JRlhGb250MkZpbGVSZWFkLkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBvcykgew0KLSAgICAgICAgSUZYX0ZvbnQqIHBGb250Ow0KLSAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQ7DQotICAgICAgICBtX0lGWEZvbnQyRmlsZVJlYWQuR2V0TmV4dEFzc29jKHBvcywgcEZvbnQsIHBGaWxlUmVhZCk7DQotICAgICAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGWF9Gb250TWdySW1wOjpSZW1vdmVGb250KCBJRlhfRm9udCogcEVGb250ICkNCi17DQotICAgIGlmIChOVUxMID09IHBFRm9udCkgew0KLSAgICAgICAgcmV0dXJuIDsNCi0gICAgfQ0KKyAgfQ0KKyAgcG9zID0gbV9JRlhGb250MkZpbGVSZWFkLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwb3MpIHsNCisgICAgSUZYX0ZvbnQqIHBGb250Ow0KICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZDsNCi0gICAgaWYgKG1fSUZYRm9udDJGaWxlUmVhZC5Mb29rdXAocEVGb250LCBwRmlsZVJlYWQpKSB7DQotICAgICAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fSUZYRm9udDJGaWxlUmVhZC5SZW1vdmVLZXkocEVGb250KTsNCi0gICAgfQ0KLSAgICBGWF9QT1NJVElPTiBwb3M7DQotICAgIHBvcyA9IG1fRmlsZUFjY2VzczJJRlhGb250LkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBvcykgew0KLSAgICAgICAgRlhfRFdPUkQgZHdIYXNoOw0KLSAgICAgICAgSUZYX0ZvbnQqIHBDRm9udDsNCi0gICAgICAgIG1fRmlsZUFjY2VzczJJRlhGb250LkdldE5leHRBc3NvYyhwb3MsIGR3SGFzaCwgcENGb250KTsNCi0gICAgICAgIGlmIChwQ0ZvbnQgPT0gcEVGb250KSB7DQotICAgICAgICAgICAgbV9GaWxlQWNjZXNzMklGWEZvbnQuUmVtb3ZlS2V5KGR3SGFzaCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcG9zID0gbV9IYXNoMkZvbnRzLkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBvcykgew0KLSAgICAgICAgRlhfRFdPUkQgZHdIYXNoOw0KLSAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPiogcEZvbnRzOw0KLSAgICAgICAgbV9IYXNoMkZvbnRzLkdldE5leHRBc3NvYyhwb3MsIGR3SGFzaCwgcEZvbnRzKTsNCi0gICAgICAgIGlmIChOVUxMICE9IHBGb250cykgew0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBGb250cy0+R2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgaWYgKHBGb250cy0+R2V0QXQoaSkgPT0gcEVGb250KSB7DQotICAgICAgICAgICAgICAgICAgICBwRm9udHMtPlNldEF0KGksIE5VTEwpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX0hhc2gyRm9udHMuUmVtb3ZlS2V5KGR3SGFzaCk7DQotICAgICAgICB9DQotICAgIH0NCisgICAgbV9JRlhGb250MkZpbGVSZWFkLkdldE5leHRBc3NvYyhwb3MsIHBGb250LCBwRmlsZVJlYWQpOw0KKyAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgIH0NCiB9DQotdm9pZCBDRlhfRm9udE1nckltcDo6UmVwb3J0RmFjZSggRlhGVF9GYWNlIHBGYWNlLCBDRlhfRm9udERlc2NyaXB0b3JzJiBGb250cywgSUZYX0ZpbGVBY2Nlc3MqIHBGb250QWNjZXNzKQ0KLXsNCi0gICAgaWYgKDAgPT0gKHBGYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKSkgew0KLSAgICAgICAgcmV0dXJuIDsNCit2b2lkIENGWF9Gb250TWdySW1wOjpSZW1vdmVGb250KElGWF9Gb250KiBwRUZvbnQpIHsNCisgIGlmIChOVUxMID09IHBFRm9udCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZDsNCisgIGlmIChtX0lGWEZvbnQyRmlsZVJlYWQuTG9va3VwKHBFRm9udCwgcEZpbGVSZWFkKSkgew0KKyAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgICAgbV9JRlhGb250MkZpbGVSZWFkLlJlbW92ZUtleShwRUZvbnQpOw0KKyAgfQ0KKyAgRlhfUE9TSVRJT04gcG9zOw0KKyAgcG9zID0gbV9GaWxlQWNjZXNzMklGWEZvbnQuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBGWF9EV09SRCBkd0hhc2g7DQorICAgIElGWF9Gb250KiBwQ0ZvbnQ7DQorICAgIG1fRmlsZUFjY2VzczJJRlhGb250LkdldE5leHRBc3NvYyhwb3MsIGR3SGFzaCwgcENGb250KTsNCisgICAgaWYgKHBDRm9udCA9PSBwRUZvbnQpIHsNCisgICAgICBtX0ZpbGVBY2Nlc3MySUZYRm9udC5SZW1vdmVLZXkoZHdIYXNoKTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBDRlhfRm9udERlc2NyaXB0b3IqIHBGb250ID0gRlhfTkVXIENGWF9Gb250RGVzY3JpcHRvcjsNCi0gICAgaWYgKE5VTEwgPT0gcEZvbnQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwRm9udC0+bV9kd0ZvbnRTdHlsZXMgfD0gRlhGVF9Jc19GYWNlX0JvbGQocEZhY2UpID8gRlhfRk9OVFNUWUxFX0JvbGQgOiAwOw0KLSAgICBwRm9udC0+bV9kd0ZvbnRTdHlsZXMgfD0gRlhGVF9Jc19GYWNlX0l0YWxpYyhwRmFjZSkgPyBGWF9GT05UU1RZTEVfSXRhbGljIDogMDsNCi0gICAgcEZvbnQtPm1fZHdGb250U3R5bGVzIHw9IEdldEZsYWdzKHBGYWNlKTsNCi0gICAgQ0ZYX1dvcmRBcnJheSBDaGFyc2V0czsNCi0gICAgR2V0Q2hhcnNldHMocEZhY2UsIENoYXJzZXRzKTsNCi0gICAgR2V0VVNCQ1NCKHBGYWNlLCBwRm9udC0+bV9kd1VzYiwgcEZvbnQtPm1fZHdDc2IpOw0KLSAgICB1bnNpZ25lZCBsb25nIG5MZW5ndGggPSAwOw0KLSAgICBGVF9VTG9uZyBkd1RhZzsNCi0gICAgdWludDhfdCogcFRhYmxlID0gTlVMTDsNCi0gICAgRlRfRU5DX1RBRyhkd1RhZywgJ24nLCAnYScsICdtJywgJ2UnKTsNCi0gICAgdW5zaWduZWQgaW50IGVycm9yID0gRlhGVF9Mb2FkX1NmbnRfVGFibGUocEZhY2UsIGR3VGFnLCAwLCBOVUxMLCAmbkxlbmd0aCk7DQotICAgIGlmICgwID09IGVycm9yICYmIDAgIT0gbkxlbmd0aCkgew0KLSAgICAgICAgcFRhYmxlID0gRlhfQWxsb2ModWludDhfdCwgbkxlbmd0aCk7DQotICAgICAgICBpZiAoTlVMTCAhPSBwVGFibGUpIHsNCi0gICAgICAgICAgICBlcnJvciA9IEZYRlRfTG9hZF9TZm50X1RhYmxlKHBGYWNlLCBkd1RhZywgMCwgcFRhYmxlLCBOVUxMKTsNCi0gICAgICAgICAgICBpZiAoMCAhPSBlcnJvcikgew0KLSAgICAgICAgICAgICAgICBGWF9GcmVlKHBUYWJsZSk7DQotICAgICAgICAgICAgICAgIHBUYWJsZSA9IE5VTEw7DQotICAgICAgICAgICAgfQ0KKyAgfQ0KKyAgcG9zID0gbV9IYXNoMkZvbnRzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwb3MpIHsNCisgICAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+KiBwRm9udHM7DQorICAgIG1fSGFzaDJGb250cy5HZXROZXh0QXNzb2MocG9zLCBkd0hhc2gsIHBGb250cyk7DQorICAgIGlmIChOVUxMICE9IHBGb250cykgew0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBGb250cy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGlmIChwRm9udHMtPkdldEF0KGkpID09IHBFRm9udCkgew0KKyAgICAgICAgICBwRm9udHMtPlNldEF0KGksIE5VTEwpOw0KICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBtX0hhc2gyRm9udHMuUmVtb3ZlS2V5KGR3SGFzaCk7DQogICAgIH0NCi0gICAgR2V0TmFtZXMocFRhYmxlLCBwRm9udC0+bV93c0ZhbWlseU5hbWVzKTsNCisgIH0NCit9DQordm9pZCBDRlhfRm9udE1nckltcDo6UmVwb3J0RmFjZShGWEZUX0ZhY2UgcEZhY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udERlc2NyaXB0b3JzJiBGb250cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9GaWxlQWNjZXNzKiBwRm9udEFjY2Vzcykgew0KKyAgaWYgKDAgPT0gKHBGYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfRm9udERlc2NyaXB0b3IqIHBGb250ID0gRlhfTkVXIENGWF9Gb250RGVzY3JpcHRvcjsNCisgIGlmIChOVUxMID09IHBGb250KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBGb250LT5tX2R3Rm9udFN0eWxlcyB8PSBGWEZUX0lzX0ZhY2VfQm9sZChwRmFjZSkgPyBGWF9GT05UU1RZTEVfQm9sZCA6IDA7DQorICBwRm9udC0+bV9kd0ZvbnRTdHlsZXMgfD0gRlhGVF9Jc19GYWNlX0l0YWxpYyhwRmFjZSkgPyBGWF9GT05UU1RZTEVfSXRhbGljIDogMDsNCisgIHBGb250LT5tX2R3Rm9udFN0eWxlcyB8PSBHZXRGbGFncyhwRmFjZSk7DQorICBDRlhfV29yZEFycmF5IENoYXJzZXRzOw0KKyAgR2V0Q2hhcnNldHMocEZhY2UsIENoYXJzZXRzKTsNCisgIEdldFVTQkNTQihwRmFjZSwgcEZvbnQtPm1fZHdVc2IsIHBGb250LT5tX2R3Q3NiKTsNCisgIHVuc2lnbmVkIGxvbmcgbkxlbmd0aCA9IDA7DQorICBGVF9VTG9uZyBkd1RhZzsNCisgIHVpbnQ4X3QqIHBUYWJsZSA9IE5VTEw7DQorICBGVF9FTkNfVEFHKGR3VGFnLCAnbicsICdhJywgJ20nLCAnZScpOw0KKyAgdW5zaWduZWQgaW50IGVycm9yID0gRlhGVF9Mb2FkX1NmbnRfVGFibGUocEZhY2UsIGR3VGFnLCAwLCBOVUxMLCAmbkxlbmd0aCk7DQorICBpZiAoMCA9PSBlcnJvciAmJiAwICE9IG5MZW5ndGgpIHsNCisgICAgcFRhYmxlID0gRlhfQWxsb2ModWludDhfdCwgbkxlbmd0aCk7DQogICAgIGlmIChOVUxMICE9IHBUYWJsZSkgew0KKyAgICAgIGVycm9yID0gRlhGVF9Mb2FkX1NmbnRfVGFibGUocEZhY2UsIGR3VGFnLCAwLCBwVGFibGUsIE5VTEwpOw0KKyAgICAgIGlmICgwICE9IGVycm9yKSB7DQogICAgICAgICBGWF9GcmVlKHBUYWJsZSk7DQorICAgICAgICBwVGFibGUgPSBOVUxMOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBwRm9udC0+bV93c0ZhbWlseU5hbWVzLkFkZChDRlhfQnl0ZVN0cmluZyhwRmFjZS0+ZmFtaWx5X25hbWUpLlVURjhEZWNvZGUoKSk7DQotICAgIHBGb250LT5tX3dzRmFjZU5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKEZYRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShwRmFjZSkpOw0KLSAgICBwRm9udC0+bV9uRmFjZUluZGV4ID0gcEZhY2UtPmZhY2VfaW5kZXg7DQotICAgIHBGb250LT5tX3BGaWxlQWNjZXNzID0gcEZvbnRBY2Nlc3MtPlJldGFpbigpOw0KLSAgICBOb3JtYWxpemVGb250TmFtZShwRm9udC0+bV93c0ZhY2VOYW1lKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcEZvbnQtPm1fd3NGYW1pbHlOYW1lcy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgTm9ybWFsaXplRm9udE5hbWUocEZvbnQtPm1fd3NGYW1pbHlOYW1lc1tpXSk7DQotICAgIH0NCi0gICAgRm9udHMuQWRkKHBGb250KTsNCisgIH0NCisgIEdldE5hbWVzKHBUYWJsZSwgcEZvbnQtPm1fd3NGYW1pbHlOYW1lcyk7DQorICBpZiAoTlVMTCAhPSBwVGFibGUpIHsNCisgICAgRlhfRnJlZShwVGFibGUpOw0KKyAgfQ0KKyAgcEZvbnQtPm1fd3NGYW1pbHlOYW1lcy5BZGQoQ0ZYX0J5dGVTdHJpbmcocEZhY2UtPmZhbWlseV9uYW1lKS5VVEY4RGVjb2RlKCkpOw0KKyAgcEZvbnQtPm1fd3NGYWNlTmFtZSA9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChGWEZUX0dldF9Qb3N0c2NyaXB0X05hbWUocEZhY2UpKTsNCisgIHBGb250LT5tX25GYWNlSW5kZXggPSBwRmFjZS0+ZmFjZV9pbmRleDsNCisgIHBGb250LT5tX3BGaWxlQWNjZXNzID0gcEZvbnRBY2Nlc3MtPlJldGFpbigpOw0KKyAgTm9ybWFsaXplRm9udE5hbWUocEZvbnQtPm1fd3NGYWNlTmFtZSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwRm9udC0+bV93c0ZhbWlseU5hbWVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIE5vcm1hbGl6ZUZvbnROYW1lKHBGb250LT5tX3dzRmFtaWx5TmFtZXNbaV0pOw0KKyAgfQ0KKyAgRm9udHMuQWRkKHBGb250KTsNCiB9DQotRlhfRFdPUkQgQ0ZYX0ZvbnRNZ3JJbXA6OkdldEZsYWdzKEZYRlRfRmFjZSBwRmFjZSkNCi17DQotICAgIEZYX0RXT1JEIGZsYWcgPSAwOw0KLSAgICBpZiAoRlRfSVNfRklYRURfV0lEVEgocEZhY2UpKSB7DQotICAgICAgICBmbGFnIHw9IEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoOw0KLSAgICB9DQotICAgIFRUX09TMiogcE9TMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKHBGYWNlLCBmdF9zZm50X29zMik7DQotICAgIGlmICghcE9TMikgew0KLSAgICAgICAgcmV0dXJuIGZsYWc7DQotICAgIH0NCi0gICAgaWYgKHBPUzItPnVsQ29kZVBhZ2VSYW5nZTEgJiAoMSA8PCAzMSkpIHsNCi0gICAgICAgIGZsYWcgfD0gRlhfRk9OVFNUWUxFX1N5bWJvbGljOw0KLSAgICB9DQotICAgIGlmIChwT1MyLT5wYW5vc2VbMF0gPT0gMikgew0KLSAgICAgICAgdWludDhfdCB1U2VyaWYgPSBwT1MyLT5wYW5vc2VbMV07DQotICAgICAgICBpZiAoKHVTZXJpZiA+IDEgJiYgdVNlcmlmIDwgMTApIHx8IHVTZXJpZiA+IDEzKSB7DQotICAgICAgICAgICAgZmxhZyB8PSBGWF9GT05UU1RZTEVfU2VyaWY7DQotICAgICAgICB9DQotICAgIH0NCitGWF9EV09SRCBDRlhfRm9udE1nckltcDo6R2V0RmxhZ3MoRlhGVF9GYWNlIHBGYWNlKSB7DQorICBGWF9EV09SRCBmbGFnID0gMDsNCisgIGlmIChGVF9JU19GSVhFRF9XSURUSChwRmFjZSkpIHsNCisgICAgZmxhZyB8PSBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaDsNCisgIH0NCisgIFRUX09TMiogcE9TMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKHBGYWNlLCBmdF9zZm50X29zMik7DQorICBpZiAoIXBPUzIpIHsNCiAgICAgcmV0dXJuIGZsYWc7DQorICB9DQorICBpZiAocE9TMi0+dWxDb2RlUGFnZVJhbmdlMSAmICgxIDw8IDMxKSkgew0KKyAgICBmbGFnIHw9IEZYX0ZPTlRTVFlMRV9TeW1ib2xpYzsNCisgIH0NCisgIGlmIChwT1MyLT5wYW5vc2VbMF0gPT0gMikgew0KKyAgICB1aW50OF90IHVTZXJpZiA9IHBPUzItPnBhbm9zZVsxXTsNCisgICAgaWYgKCh1U2VyaWYgPiAxICYmIHVTZXJpZiA8IDEwKSB8fCB1U2VyaWYgPiAxMykgew0KKyAgICAgIGZsYWcgfD0gRlhfRk9OVFNUWUxFX1NlcmlmOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZmxhZzsNCiB9DQogI2RlZmluZSBHZXRVSW50OChwKSAoKHVpbnQ4X3QpKChwKVswXSkpDQogI2RlZmluZSBHZXRVSW50MTYocCkgKCh1aW50MTZfdCkoKHApWzBdIDw8IDggfCAocClbMV0pKQ0KLSNkZWZpbmUgR2V0VUludDMyKHApICgodWludDMyX3QpKChwKVswXSA8PCAyNCB8IChwKVsxXSA8PCAxNiB8IChwKVsyXSA8PCA4IHwgKHApWzNdKSkNCi12b2lkIENGWF9Gb250TWdySW1wOjpHZXROYW1lcyhjb25zdCB1aW50OF90KiBuYW1lX3RhYmxlLCBDRlhfV2lkZVN0cmluZ0FycmF5JiBOYW1lcykNCi17DQotICAgIGlmIChOVUxMID09IG5hbWVfdGFibGUpIHsNCi0gICAgICAgIHJldHVybjsNCisjZGVmaW5lIEdldFVJbnQzMihwKSBcDQorICAoKHVpbnQzMl90KSgocClbMF0gPDwgMjQgfCAocClbMV0gPDwgMTYgfCAocClbMl0gPDwgOCB8IChwKVszXSkpDQordm9pZCBDRlhfRm9udE1nckltcDo6R2V0TmFtZXMoY29uc3QgdWludDhfdCogbmFtZV90YWJsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5JiBOYW1lcykgew0KKyAgaWYgKE5VTEwgPT0gbmFtZV90YWJsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICB1aW50OF90KiBscFRhYmxlID0gKHVpbnQ4X3QqKW5hbWVfdGFibGU7DQorICBDRlhfV2lkZVN0cmluZyB3c0ZhbWlseTsNCisgIHVpbnQ4X3QqIHNwID0gbHBUYWJsZSArIDI7DQorICB1aW50OF90KiBscE5hbWVSZWNvcmQgPSBscFRhYmxlICsgNjsNCisgIHVpbnQxNl90IG5OYW1lQ291bnQgPSBHZXRVSW50MTYoc3ApOw0KKyAgdWludDhfdCogbHBTdHIgPSBscFRhYmxlICsgR2V0VUludDE2KHNwICsgMik7DQorICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgbk5hbWVDb3VudDsgaisrKSB7DQorICAgIHVpbnQxNl90IG5OYW1lSUQgPSBHZXRVSW50MTYobHBOYW1lUmVjb3JkICsgaiAqIDEyICsgNik7DQorICAgIGlmIChuTmFtZUlEICE9IDEpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICB1aW50OF90KiBscFRhYmxlID0gKHVpbnQ4X3QqKW5hbWVfdGFibGU7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRmFtaWx5Ow0KLSAgICB1aW50OF90KiBzcCA9IGxwVGFibGUgKyAyOw0KLSAgICB1aW50OF90KiBscE5hbWVSZWNvcmQgPSBscFRhYmxlICsgNjsNCi0gICAgdWludDE2X3Qgbk5hbWVDb3VudCA9IEdldFVJbnQxNihzcCk7DQotICAgIHVpbnQ4X3QqIGxwU3RyID0gbHBUYWJsZSArIEdldFVJbnQxNihzcCArIDIpOw0KLSAgICBmb3IgKHVpbnQxNl90IGogPSAwOyBqIDwgbk5hbWVDb3VudDsgaisrKSB7DQotICAgICAgICB1aW50MTZfdCBuTmFtZUlEID0gR2V0VUludDE2KGxwTmFtZVJlY29yZCArIGogKiAxMiArIDYpOw0KLSAgICAgICAgaWYgKG5OYW1lSUQgIT0gMSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdWludDE2X3QgblBsYXRmb3JtSUQgPSBHZXRVSW50MTYobHBOYW1lUmVjb3JkICsgaiAqIDEyICsgMCk7DQotICAgICAgICB1aW50MTZfdCBuTmFtZUxlbmd0aCA9IEdldFVJbnQxNihscE5hbWVSZWNvcmQgKyBqICogMTIgKyA4KTsNCi0gICAgICAgIHVpbnQxNl90IG5OYW1lT2Zmc2V0ID0gR2V0VUludDE2KGxwTmFtZVJlY29yZCArIGogKiAxMiArIDEwKTsNCi0gICAgICAgIHdzRmFtaWx5LkVtcHR5KCk7DQotICAgICAgICBpZiAoblBsYXRmb3JtSUQgIT0gMSkgew0KLSAgICAgICAgICAgIGZvciAodWludDE2X3QgayA9IDA7IGsgPCBuTmFtZUxlbmd0aCAvIDI7IGsrKykgew0KLSAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Y1RlbXAgPSBHZXRVSW50MTYobHBTdHIgKyBuTmFtZU9mZnNldCArIGsgKiAyKTsNCi0gICAgICAgICAgICAgICAgd3NGYW1pbHkgKz0gd2NUZW1wOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBOYW1lcy5BZGQod3NGYW1pbHkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgbk5hbWVMZW5ndGg7IGsrKykgew0KLSAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Y1RlbXAgPSBHZXRVSW50OChscFN0ciArIG5OYW1lT2Zmc2V0ICsgayk7DQotICAgICAgICAgICAgICAgIHdzRmFtaWx5ICs9IHdjVGVtcDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgTmFtZXMuQWRkKHdzRmFtaWx5KTsNCi0gICAgICAgIH0NCisgICAgdWludDE2X3QgblBsYXRmb3JtSUQgPSBHZXRVSW50MTYobHBOYW1lUmVjb3JkICsgaiAqIDEyICsgMCk7DQorICAgIHVpbnQxNl90IG5OYW1lTGVuZ3RoID0gR2V0VUludDE2KGxwTmFtZVJlY29yZCArIGogKiAxMiArIDgpOw0KKyAgICB1aW50MTZfdCBuTmFtZU9mZnNldCA9IEdldFVJbnQxNihscE5hbWVSZWNvcmQgKyBqICogMTIgKyAxMCk7DQorICAgIHdzRmFtaWx5LkVtcHR5KCk7DQorICAgIGlmIChuUGxhdGZvcm1JRCAhPSAxKSB7DQorICAgICAgZm9yICh1aW50MTZfdCBrID0gMDsgayA8IG5OYW1lTGVuZ3RoIC8gMjsgaysrKSB7DQorICAgICAgICBGWF9XQ0hBUiB3Y1RlbXAgPSBHZXRVSW50MTYobHBTdHIgKyBuTmFtZU9mZnNldCArIGsgKiAyKTsNCisgICAgICAgIHdzRmFtaWx5ICs9IHdjVGVtcDsNCisgICAgICB9DQorICAgICAgTmFtZXMuQWRkKHdzRmFtaWx5KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgbk5hbWVMZW5ndGg7IGsrKykgew0KKyAgICAgICAgRlhfV0NIQVIgd2NUZW1wID0gR2V0VUludDgobHBTdHIgKyBuTmFtZU9mZnNldCArIGspOw0KKyAgICAgICAgd3NGYW1pbHkgKz0gd2NUZW1wOw0KKyAgICAgIH0NCisgICAgICBOYW1lcy5BZGQod3NGYW1pbHkpOw0KICAgICB9DQorICB9DQogfQ0KICN1bmRlZiBHZXRVSW50OA0KICN1bmRlZiBHZXRVSW50MTYNCiAjdW5kZWYgR2V0VUludDMyDQogc3RydWN0IEZYX0JJVDJDSEFSU0VUIHsNCi0gICAgRlhfV09SRCB3Qml0Ow0KLSAgICBGWF9XT1JEIHdDaGFyc2V0Ow0KKyAgRlhfV09SRCB3Qml0Ow0KKyAgRlhfV09SRCB3Q2hhcnNldDsNCiB9Ow0KIEZYX0JJVDJDSEFSU0VUIGdfRlhfQml0MkNoYXJzZXQxWzE2XSA9IHsNCi0gICAgezEgPDwgMCAsIEZYX0NIQVJTRVRfQU5TSX0sDQotICAgIHsxIDw8IDEgLCBGWF9DSEFSU0VUX01TV2luX0Vhc3RlckV1cm9wZWFufSwNCi0gICAgezEgPDwgMiAsIEZYX0NIQVJTRVRfTVNXaW5fQ3lyaWxsaWN9LA0KLSAgICB7MSA8PCAzICwgRlhfQ0hBUlNFVF9NU1dpbl9HcmVla30sDQotICAgIHsxIDw8IDQgLCBGWF9DSEFSU0VUX01TV2luX1R1cmtpc2h9LA0KLSAgICB7MSA8PCA1ICwgRlhfQ0hBUlNFVF9NU1dpbl9IZWJyZXd9LA0KLSAgICB7MSA8PCA2ICwgRlhfQ0hBUlNFVF9NU1dpbl9BcmFiaWN9LA0KLSAgICB7MSA8PCA3ICwgRlhfQ0hBUlNFVF9NU1dpbl9CYWx0aWN9LA0KLSAgICB7MSA8PCA4ICwgRlhfQ0hBUlNFVF9NU1dpbl9WaWV0bmFtZXNlfSwNCi0gICAgezEgPDwgOSAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQotICAgIHsxIDw8IDEwICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCi0gICAgezEgPDwgMTEgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KLSAgICB7MSA8PCAxMiAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQotICAgIHsxIDw8IDEzICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCi0gICAgezEgPDwgMTQgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KLSAgICB7MSA8PCAxNSAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDAsIEZYX0NIQVJTRVRfQU5TSX0sDQorICAgIHsxIDw8IDEsIEZYX0NIQVJTRVRfTVNXaW5fRWFzdGVyRXVyb3BlYW59LA0KKyAgICB7MSA8PCAyLCBGWF9DSEFSU0VUX01TV2luX0N5cmlsbGljfSwNCisgICAgezEgPDwgMywgRlhfQ0hBUlNFVF9NU1dpbl9HcmVla30sDQorICAgIHsxIDw8IDQsIEZYX0NIQVJTRVRfTVNXaW5fVHVya2lzaH0sDQorICAgIHsxIDw8IDUsIEZYX0NIQVJTRVRfTVNXaW5fSGVicmV3fSwNCisgICAgezEgPDwgNiwgRlhfQ0hBUlNFVF9NU1dpbl9BcmFiaWN9LA0KKyAgICB7MSA8PCA3LCBGWF9DSEFSU0VUX01TV2luX0JhbHRpY30sDQorICAgIHsxIDw8IDgsIEZYX0NIQVJTRVRfTVNXaW5fVmlldG5hbWVzZX0sDQorICAgIHsxIDw8IDksIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDEwLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMSwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTIsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDEzLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxNCwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTUsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQogfTsNCiBGWF9CSVQyQ0hBUlNFVCBnX0ZYX0JpdDJDaGFyc2V0MlsxNl0gPSB7DQotICAgIHsxIDw8IDAgLCBGWF9DSEFSU0VUX1RoYWl9LA0KLSAgICB7MSA8PCAxICwgRlhfQ0hBUlNFVF9TaGlmdEpJU30sDQotICAgIHsxIDw8IDIgLCBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkfSwNCi0gICAgezEgPDwgMyAsIEZYX0NIQVJTRVRfS29yZWFufSwNCi0gICAgezEgPDwgNCAsIEZYX0NIQVJTRVRfQ2hpbmVzZVRyaWRpdGlvbmFsfSwNCi0gICAgezEgPDwgNSAsIEZYX0NIQVJTRVRfSm9oYWJ9LA0KLSAgICB7MSA8PCA2ICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCi0gICAgezEgPDwgNyAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQotICAgIHsxIDw8IDggLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KLSAgICB7MSA8PCA5ICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCi0gICAgezEgPDwgMTAgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KLSAgICB7MSA8PCAxMSAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQotICAgIHsxIDw8IDEyICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCi0gICAgezEgPDwgMTMgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KLSAgICB7MSA8PCAxNCAsIEZYX0NIQVJTRVRfT0VNfSwNCi0gICAgezEgPDwgMTUgLCBGWF9DSEFSU0VUX1N5bWJvbH0sDQorICAgIHsxIDw8IDAsIEZYX0NIQVJTRVRfVGhhaX0sDQorICAgIHsxIDw8IDEsIEZYX0NIQVJTRVRfU2hpZnRKSVN9LA0KKyAgICB7MSA8PCAyLCBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkfSwNCisgICAgezEgPDwgMywgRlhfQ0hBUlNFVF9Lb3JlYW59LA0KKyAgICB7MSA8PCA0LCBGWF9DSEFSU0VUX0NoaW5lc2VUcmlkaXRpb25hbH0sDQorICAgIHsxIDw8IDUsIEZYX0NIQVJTRVRfSm9oYWJ9LA0KKyAgICB7MSA8PCA2LCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCA3LCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCA4LCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCA5LCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMCwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTEsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDEyLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMywgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTQsIEZYX0NIQVJTRVRfT0VNfSwNCisgICAgezEgPDwgMTUsIEZYX0NIQVJTRVRfU3ltYm9sfSwNCiB9Ow0KIEZYX0JJVDJDSEFSU0VUIGdfRlhfQml0MkNoYXJzZXQzWzE2XSA9IHsNCi0gICAgezEgPDwgMCAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQotICAgIHsxIDw8IDEgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KLSAgICB7MSA8PCAyICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCi0gICAgezEgPDwgMyAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQotICAgIHsxIDw8IDQgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KLSAgICB7MSA8PCA1ICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCi0gICAgezEgPDwgNiAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQotICAgIHsxIDw8IDcgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KLSAgICB7MSA8PCA4ICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCi0gICAgezEgPDwgOSAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQotICAgIHsxIDw8IDEwICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCi0gICAgezEgPDwgMTEgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KLSAgICB7MSA8PCAxMiAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQotICAgIHsxIDw8IDEzICwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCi0gICAgezEgPDwgMTQgLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KLSAgICB7MSA8PCAxNSAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sICB7MSA8PCAxLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAyLCBGWF9DSEFSU0VUX0RlZmF1bHR9LCAgezEgPDwgMywgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgNCwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwgIHsxIDw8IDUsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDYsIEZYX0NIQVJTRVRfRGVmYXVsdH0sICB7MSA8PCA3LCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCA4LCBGWF9DSEFSU0VUX0RlZmF1bHR9LCAgezEgPDwgOSwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sIHsxIDw8IDExLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMiwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwgezEgPDwgMTMsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDE0LCBGWF9DSEFSU0VUX0RlZmF1bHR9LCB7MSA8PCAxNSwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCiB9Ow0KIEZYX0JJVDJDSEFSU0VUIGdfRlhfQml0MkNoYXJzZXQ0WzE2XSA9IHsNCi0gICAgezEgPDwgMCAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KLSAgICB7MSA8PCAxICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQotICAgIHsxIDw8IDIgLCBGWF9DSEFSU0VUX0RlZmF1bHQgfSwNCi0gICAgezEgPDwgMyAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KLSAgICB7MSA8PCA0ICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQotICAgIHsxIDw8IDUgLCBGWF9DSEFSU0VUX0RlZmF1bHQgfSwNCi0gICAgezEgPDwgNiAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KLSAgICB7MSA8PCA3ICwgRlhfQ0hBUlNFVF9EZWZhdWx0IH0sDQotICAgIHsxIDw8IDggLCBGWF9DSEFSU0VUX0RlZmF1bHQgfSwNCi0gICAgezEgPDwgOSAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KLSAgICB7MSA8PCAxMCAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KLSAgICB7MSA8PCAxMSAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KLSAgICB7MSA8PCAxMiAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KLSAgICB7MSA8PCAxMyAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KLSAgICB7MSA8PCAxNCAsIEZYX0NIQVJTRVRfRGVmYXVsdCB9LA0KLSAgICB7MSA8PCAxNSAsIEZYX0NIQVJTRVRfVVMgfSwNCisgICAgezEgPDwgMCwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwgIHsxIDw8IDEsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDIsIEZYX0NIQVJTRVRfRGVmYXVsdH0sICB7MSA8PCAzLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCA0LCBGWF9DSEFSU0VUX0RlZmF1bHR9LCAgezEgPDwgNSwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgNiwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwgIHsxIDw8IDcsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDgsIEZYX0NIQVJTRVRfRGVmYXVsdH0sICB7MSA8PCA5LCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMCwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwgezEgPDwgMTEsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDEyLCBGWF9DSEFSU0VUX0RlZmF1bHR9LCB7MSA8PCAxMywgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTQsIEZYX0NIQVJTRVRfRGVmYXVsdH0sIHsxIDw8IDE1LCBGWF9DSEFSU0VUX1VTfSwNCiB9Ow0KLSNkZWZpbmUgQ09ERVBBR0VSQU5HRV9JTVBMRU1FTlQobikgXA0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAxNjsgaSsrKVwNCi0gICAge1wNCi0gICAgICAgIGlmICgoYSMjbiAmIGdfRlhfQml0MkNoYXJzZXQjI25baV0ud0JpdCkgIT0gMClcDQotICAgICAgICB7XA0KLSAgICAgICAgICAgIENoYXJzZXRzLkFkZChnX0ZYX0JpdDJDaGFyc2V0IyNuW2ldLndDaGFyc2V0KTtcDQotICAgICAgICB9XA0KLSAgICB9DQotdm9pZCBDRlhfRm9udE1nckltcDo6R2V0Q2hhcnNldHMoIEZYRlRfRmFjZSBwRmFjZSwgQ0ZYX1dvcmRBcnJheSYgQ2hhcnNldHMgKQ0KLXsNCi0gICAgQ2hhcnNldHMuUmVtb3ZlQWxsKCk7DQotICAgIFRUX09TMiogcE9TMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKHBGYWNlLCBmdF9zZm50X29zMik7DQotICAgIGlmIChOVUxMICE9IHBPUzIpIHsNCi0gICAgICAgIEZYX1dPUkQgYTEsIGEyLCBhMywgYTQ7DQotICAgICAgICBhMSA9IHBPUzItPnVsQ29kZVBhZ2VSYW5nZTEgJiAweDAwMDBmZmZmOw0KLSAgICAgICAgQ09ERVBBR0VSQU5HRV9JTVBMRU1FTlQoMSk7DQotICAgICAgICBhMiA9IChwT1MyLT51bENvZGVQYWdlUmFuZ2UxID4+IDE2KSAmIDB4MDAwMGZmZmY7DQotICAgICAgICBDT0RFUEFHRVJBTkdFX0lNUExFTUVOVCgyKTsNCi0gICAgICAgIGEzID0gcE9TMi0+dWxDb2RlUGFnZVJhbmdlMiAmIDB4MDAwMGZmZmY7DQotICAgICAgICBDT0RFUEFHRVJBTkdFX0lNUExFTUVOVCgzKTsNCi0gICAgICAgIGE0ID0gKHBPUzItPnVsQ29kZVBhZ2VSYW5nZTIgPj4gMTYpICYgMHgwMDAwZmZmZjsNCi0gICAgICAgIENPREVQQUdFUkFOR0VfSU1QTEVNRU5UKDQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ2hhcnNldHMuQWRkKEZYX0NIQVJTRVRfRGVmYXVsdCk7DQotICAgIH0NCisjZGVmaW5lIENPREVQQUdFUkFOR0VfSU1QTEVNRU5UKG4pICAgICAgICAgICAgICAgICAgIFwNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDE2OyBpKyspIHsgICAgICAgICAgICAgICAgIFwNCisgICAgaWYgKChhIyNuICYgZ19GWF9CaXQyQ2hhcnNldCMjbltpXS53Qml0KSAhPSAwKSB7IFwNCisgICAgICBDaGFyc2V0cy5BZGQoZ19GWF9CaXQyQ2hhcnNldCMjbltpXS53Q2hhcnNldCk7IFwNCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgIH0NCit2b2lkIENGWF9Gb250TWdySW1wOjpHZXRDaGFyc2V0cyhGWEZUX0ZhY2UgcEZhY2UsIENGWF9Xb3JkQXJyYXkmIENoYXJzZXRzKSB7DQorICBDaGFyc2V0cy5SZW1vdmVBbGwoKTsNCisgIFRUX09TMiogcE9TMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKHBGYWNlLCBmdF9zZm50X29zMik7DQorICBpZiAoTlVMTCAhPSBwT1MyKSB7DQorICAgIEZYX1dPUkQgYTEsIGEyLCBhMywgYTQ7DQorICAgIGExID0gcE9TMi0+dWxDb2RlUGFnZVJhbmdlMSAmIDB4MDAwMGZmZmY7DQorICAgIENPREVQQUdFUkFOR0VfSU1QTEVNRU5UKDEpOw0KKyAgICBhMiA9IChwT1MyLT51bENvZGVQYWdlUmFuZ2UxID4+IDE2KSAmIDB4MDAwMGZmZmY7DQorICAgIENPREVQQUdFUkFOR0VfSU1QTEVNRU5UKDIpOw0KKyAgICBhMyA9IHBPUzItPnVsQ29kZVBhZ2VSYW5nZTIgJiAweDAwMDBmZmZmOw0KKyAgICBDT0RFUEFHRVJBTkdFX0lNUExFTUVOVCgzKTsNCisgICAgYTQgPSAocE9TMi0+dWxDb2RlUGFnZVJhbmdlMiA+PiAxNikgJiAweDAwMDBmZmZmOw0KKyAgICBDT0RFUEFHRVJBTkdFX0lNUExFTUVOVCg0KTsNCisgIH0gZWxzZSB7DQorICAgIENoYXJzZXRzLkFkZChGWF9DSEFSU0VUX0RlZmF1bHQpOw0KKyAgfQ0KIH0NCiAjdW5kZWYgQ09ERVBBR0VSQU5HRV9JTVBMRU1FTlQNCi12b2lkIENGWF9Gb250TWdySW1wOjpHZXRVU0JDU0IoIEZYRlRfRmFjZSBwRmFjZSwgRlhfRFdPUkQqIFVTQiwgRlhfRFdPUkQqIENTQiApDQotew0KLSAgICBUVF9PUzIqIHBPUzIgPSAoVFRfT1MyKilGVF9HZXRfU2ZudF9UYWJsZShwRmFjZSwgZnRfc2ZudF9vczIpOw0KLSAgICBpZiAoTlVMTCAhPSBwT1MyKSB7DQotICAgICAgICBVU0JbMF0gPSBwT1MyLT51bFVuaWNvZGVSYW5nZTE7DQotICAgICAgICBVU0JbMV0gPSBwT1MyLT51bFVuaWNvZGVSYW5nZTI7DQotICAgICAgICBVU0JbMl0gPSBwT1MyLT51bFVuaWNvZGVSYW5nZTM7DQotICAgICAgICBVU0JbM10gPSBwT1MyLT51bFVuaWNvZGVSYW5nZTQ7DQotICAgICAgICBDU0JbMF0gPSBwT1MyLT51bENvZGVQYWdlUmFuZ2UxOw0KLSAgICAgICAgQ1NCWzFdID0gcE9TMi0+dWxDb2RlUGFnZVJhbmdlMjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFVTQlswXSA9IDA7DQotICAgICAgICBVU0JbMV0gPSAwOw0KLSAgICAgICAgVVNCWzJdID0gMDsNCi0gICAgICAgIFVTQlszXSA9IDA7DQotICAgICAgICBDU0JbMF0gPSAwOw0KLSAgICAgICAgQ1NCWzFdID0gMDsNCi0gICAgfQ0KK3ZvaWQgQ0ZYX0ZvbnRNZ3JJbXA6OkdldFVTQkNTQihGWEZUX0ZhY2UgcEZhY2UsIEZYX0RXT1JEKiBVU0IsIEZYX0RXT1JEKiBDU0IpIHsNCisgIFRUX09TMiogcE9TMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKHBGYWNlLCBmdF9zZm50X29zMik7DQorICBpZiAoTlVMTCAhPSBwT1MyKSB7DQorICAgIFVTQlswXSA9IHBPUzItPnVsVW5pY29kZVJhbmdlMTsNCisgICAgVVNCWzFdID0gcE9TMi0+dWxVbmljb2RlUmFuZ2UyOw0KKyAgICBVU0JbMl0gPSBwT1MyLT51bFVuaWNvZGVSYW5nZTM7DQorICAgIFVTQlszXSA9IHBPUzItPnVsVW5pY29kZVJhbmdlNDsNCisgICAgQ1NCWzBdID0gcE9TMi0+dWxDb2RlUGFnZVJhbmdlMTsNCisgICAgQ1NCWzFdID0gcE9TMi0+dWxDb2RlUGFnZVJhbmdlMjsNCisgIH0gZWxzZSB7DQorICAgIFVTQlswXSA9IDA7DQorICAgIFVTQlsxXSA9IDA7DQorICAgIFVTQlsyXSA9IDA7DQorICAgIFVTQlszXSA9IDA7DQorICAgIENTQlswXSA9IDA7DQorICAgIENTQlsxXSA9IDA7DQorICB9DQogfQ0KLXZvaWQgQ0ZYX0ZvbnRNZ3JJbXA6Ok5vcm1hbGl6ZUZvbnROYW1lKCBDRlhfV2lkZVN0cmluZyYgRm9udE5hbWUgKQ0KLXsNCi0gICAgRm9udE5hbWUuTWFrZUxvd2VyKCk7DQotICAgIEZvbnROYW1lLlJlbW92ZSgnICcpOw0KLSAgICBGb250TmFtZS5SZW1vdmUoJy0nKTsNCit2b2lkIENGWF9Gb250TWdySW1wOjpOb3JtYWxpemVGb250TmFtZShDRlhfV2lkZVN0cmluZyYgRm9udE5hbWUpIHsNCisgIEZvbnROYW1lLk1ha2VMb3dlcigpOw0KKyAgRm9udE5hbWUuUmVtb3ZlKCcgJyk7DQorICBGb250TmFtZS5SZW1vdmUoJy0nKTsNCiB9DQotaW50MzJfdCBDRlhfRm9udE1nckltcDo6SXNQYXJ0TmFtZSggY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIE5hbWUxLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgTmFtZTIgKQ0KLXsNCi0gICAgaWYgKE5hbWUxLkZpbmQoKGNvbnN0IEZYX1dDSEFSKilOYW1lMikgIT0gLTEpIHsNCi0gICAgICAgIHJldHVybiAxOw0KLSAgICB9DQotICAgIHJldHVybiAwOw0KK2ludDMyX3QgQ0ZYX0ZvbnRNZ3JJbXA6OklzUGFydE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIE5hbWUxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIE5hbWUyKSB7DQorICBpZiAoTmFtZTEuRmluZCgoY29uc3QgRlhfV0NIQVIqKU5hbWUyKSAhPSAtMSkgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIHJldHVybiAwOw0KIH0NCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfc3RkZm9udG1nci5oIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X3N0ZGZvbnRtZ3IuaAppbmRleCAzMzc3OTk1Li4zYWI5ODRmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfc3RkZm9udG1nci5oCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmgKQEAgLTgsMTY4ICs4LDIxOCBAQAogI2RlZmluZSBfRlhfRk9OVE1HUl9JTVANCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KIGludDMyX3QgRlhfR2V0U2ltaWxhclZhbHVlKEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBGb250LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMpOw0KLUZYX0xQQ0ZPTlRERVNDUklQVE9SIEZYX0RlZkZvbnRNYXRjaGVyKEZYX0xQRk9OVE1BVENIUEFSQU1TIHBQYXJhbXMsIGNvbnN0IENGWF9Gb250RGVzY3JpcHRvcnMgJmZvbnRzLCB2b2lkKiBwVXNlckRhdGEpOw0KLWNsYXNzIENGWF9TdGRGb250TWdySW1wIDogcHVibGljIElGWF9Gb250TWdyDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX1N0ZEZvbnRNZ3JJbXAoRlhfTFBFbnVtQWxsRm9udHMgcEVudW1lcmF0b3IsIEZYX0xQTWF0Y2hGb250IHBNYXRjaGVyLCB2b2lkKiBwVXNlckRhdGEpOw0KLSAgICB+Q0ZYX1N0ZEZvbnRNZ3JJbXAoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmRm9udEJ5Q2hhcnNldCh1aW50OF90IG5DaGFyc2V0LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJTG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoKTsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSk7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlMb2FkRm9udChJRlhfU3RyZWFtICpwRm9udFN0cmVhbSwgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRBbGlhcyA9IE5VTEwsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcyA9IDAsIEZYX1dPUkQgd0NvZGVQYWdlID0gMCwgRlhfQk9PTCBiU2F2ZVN0cmVhbSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUxvYWRGb250KElGWF9Gb250ICpwU3JjRm9udCwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDB4RkZGRik7DQotICAgIHZpcnR1YWwgdm9pZAkJCUNsZWFyRm9udENhY2hlKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbW92ZUZvbnQoSUZYX0ZvbnQgKnBGb250KTsNCi1wcm90ZWN0ZWQ6DQotICAgIEZYX0xQTWF0Y2hGb250CQkJbV9wTWF0Y2hlcjsNCi0gICAgRlhfTFBFbnVtQWxsRm9udHMJCW1fcEVudW1lcmF0b3I7DQotICAgIENGWF9Gb250RGVzY3JpcHRvcnMJCW1fRm9udEZhY2VzOw0KLSAgICBDRlhfUHRyQXJyYXkJCQltX0ZvbnRzOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCQltX0NQRm9udHM7DQotICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fRmFtaWx5Rm9udHM7DQotICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fVW5pY29kZUZvbnRzOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCQltX0J1ZmZlckZvbnRzOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCQltX0ZpbGVGb250czsNCi0gICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9TdHJlYW1Gb250czsNCi0gICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9EZXJpdmVGb250czsNCi0gICAgdm9pZCoJCQkJbV9wVXNlckRhdGE7DQotICAgIHZvaWQJCQkJCVJlbW92ZUZvbnQoQ0ZYX01hcFB0clRvUHRyICZmb250TWFwLCBJRlhfRm9udCAqcEZvbnQpOw0KLSAgICBGWF9MUENGT05UREVTQ1JJUFRPUglGaW5kRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9EV09SRCBkd01hdGNoRmxhZ3MsIEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd1VTQiA9IDk5OSwgRlhfV0NIQVIgd1VuaWNvZGUgPSAwKTsNCi0gICAgSUZYX0ZvbnQqCQkJCUdldEZvbnQoRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZELCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMpOw0KK0ZYX0xQQ0ZPTlRERVNDUklQVE9SIEZYX0RlZkZvbnRNYXRjaGVyKEZYX0xQRk9OVE1BVENIUEFSQU1TIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0ZvbnREZXNjcmlwdG9ycyYgZm9udHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKTsNCitjbGFzcyBDRlhfU3RkRm9udE1nckltcCA6IHB1YmxpYyBJRlhfRm9udE1nciB7DQorIHB1YmxpYzoNCisgIENGWF9TdGRGb250TWdySW1wKEZYX0xQRW51bUFsbEZvbnRzIHBFbnVtZXJhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfTFBNYXRjaEZvbnQgcE1hdGNoZXIsDQorICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpOw0KKyAgfkNGWF9TdGRGb250TWdySW1wKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldERlZkZvbnRCeUNvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldERlZkZvbnRCeUNoYXJzZXQodWludDhfdCBuQ2hhcnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5VW5pY29kZShGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5TGFuZ3VhZ2UoRlhfV09SRCB3TGFuZ3VhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IDB4RkZGRik7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIExvYWRGb250KElGWF9TdHJlYW0qIHBGb250U3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRBbGlhcyA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVN0cmVhbSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIExvYWRGb250KElGWF9Gb250KiBwU3JjRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKTsNCisgIHZpcnR1YWwgdm9pZCBDbGVhckZvbnRDYWNoZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZUZvbnQoSUZYX0ZvbnQqIHBGb250KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfTFBNYXRjaEZvbnQgbV9wTWF0Y2hlcjsNCisgIEZYX0xQRW51bUFsbEZvbnRzIG1fcEVudW1lcmF0b3I7DQorICBDRlhfRm9udERlc2NyaXB0b3JzIG1fRm9udEZhY2VzOw0KKyAgQ0ZYX1B0ckFycmF5IG1fRm9udHM7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9DUEZvbnRzOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fRmFtaWx5Rm9udHM7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9Vbmljb2RlRm9udHM7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9CdWZmZXJGb250czsNCisgIENGWF9NYXBQdHJUb1B0ciBtX0ZpbGVGb250czsNCisgIENGWF9NYXBQdHJUb1B0ciBtX1N0cmVhbUZvbnRzOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fRGVyaXZlRm9udHM7DQorICB2b2lkKiBtX3BVc2VyRGF0YTsNCisgIHZvaWQgUmVtb3ZlRm9udChDRlhfTWFwUHRyVG9QdHImIGZvbnRNYXAsIElGWF9Gb250KiBwRm9udCk7DQorICBGWF9MUENGT05UREVTQ1JJUFRPUiBGaW5kRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TWF0Y2hGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdVU0IgPSA5OTksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3VW5pY29kZSA9IDApOw0KKyAgSUZYX0ZvbnQqIEdldEZvbnQoRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZELCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMpOw0KIH07DQotRlhfRFdPUkQgRlhfR2V0R2RpRm9udFN0eWxlcyhjb25zdCBMT0dGT05UVyAmbGYpOw0KK0ZYX0RXT1JEIEZYX0dldEdkaUZvbnRTdHlsZXMoY29uc3QgTE9HRk9OVFcmIGxmKTsNCiAjZWxzZQ0KLWNsYXNzIENGWF9Gb250RGVzY3JpcHRvcg0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9Gb250RGVzY3JpcHRvcigpDQotICAgICAgICA6IG1fcEZpbGVBY2Nlc3MoTlVMTCkNCi0gICAgICAgICwgbV9uRmFjZUluZGV4KDApDQotICAgICAgICAsIG1fZHdGb250U3R5bGVzKDApDQotICAgIHsNCi0gICAgICAgIG1fZHdVc2JbMF0gPSBtX2R3VXNiWzFdID0gbV9kd1VzYlsyXSA9IG1fZHdVc2JbM10gPSAwOw0KLSAgICAgICAgbV9kd0NzYlswXSA9IG1fZHdDc2JbMV0gPSAwOw0KK2NsYXNzIENGWF9Gb250RGVzY3JpcHRvciB7DQorIHB1YmxpYzoNCisgIENGWF9Gb250RGVzY3JpcHRvcigpDQorICAgICAgOiBtX3BGaWxlQWNjZXNzKE5VTEwpLCBtX25GYWNlSW5kZXgoMCksIG1fZHdGb250U3R5bGVzKDApIHsNCisgICAgbV9kd1VzYlswXSA9IG1fZHdVc2JbMV0gPSBtX2R3VXNiWzJdID0gbV9kd1VzYlszXSA9IDA7DQorICAgIG1fZHdDc2JbMF0gPSBtX2R3Q3NiWzFdID0gMDsNCisgIH0NCisgIH5DRlhfRm9udERlc2NyaXB0b3IoKSB7DQorICAgIGlmIChOVUxMICE9IG1fcEZpbGVBY2Nlc3MpIHsNCisgICAgICBtX3BGaWxlQWNjZXNzLT5SZWxlYXNlKCk7DQogICAgIH0NCi0gICAgfkNGWF9Gb250RGVzY3JpcHRvcigpDQotICAgIHsNCi0gICAgICAgIGlmIChOVUxMICE9IG1fcEZpbGVBY2Nlc3MpIHsNCi0gICAgICAgICAgICBtX3BGaWxlQWNjZXNzLT5SZWxlYXNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgSUZYX0ZpbGVBY2Nlc3MqCQkJbV9wRmlsZUFjY2VzczsNCi0gICAgaW50MzJfdAkJCQltX25GYWNlSW5kZXg7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJbV93c0ZhY2VOYW1lOw0KLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5CQltX3dzRmFtaWx5TmFtZXM7DQotICAgIEZYX0RXT1JECQkJCW1fZHdGb250U3R5bGVzOw0KLSAgICBGWF9EV09SRAkJCQltX2R3VXNiWzRdOw0KLSAgICBGWF9EV09SRAkJCQltX2R3Q3NiWzJdOw0KKyAgfQ0KKyAgSUZYX0ZpbGVBY2Nlc3MqIG1fcEZpbGVBY2Nlc3M7DQorICBpbnQzMl90IG1fbkZhY2VJbmRleDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NGYWNlTmFtZTsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgbV93c0ZhbWlseU5hbWVzOw0KKyAgRlhfRFdPUkQgbV9kd0ZvbnRTdHlsZXM7DQorICBGWF9EV09SRCBtX2R3VXNiWzRdOw0KKyAgRlhfRFdPUkQgbV9kd0NzYlsyXTsNCiB9Ow0KIHR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX0ZvbnREZXNjcmlwdG9yKj4gQ0ZYX0ZvbnREZXNjcmlwdG9yczsNCiBzdHJ1Y3QgRlhfRm9udERlc2NyaXB0b3JJbmZvIHsNCi1wdWJsaWM6DQotICAgIENGWF9Gb250RGVzY3JpcHRvciogcEZvbnQ7DQotICAgIGludDMyX3QgblBlbmFsdHk7DQotICAgIEZYX0JPT0wgb3BlcmF0b3IgPiAoY29uc3QgRlhfRm9udERlc2NyaXB0b3JJbmZvJiB4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy0+blBlbmFsdHkgPiB4Lm5QZW5hbHR5Ow0KLSAgICB9Ow0KLSAgICBGWF9CT09MIG9wZXJhdG9yIDwgKGNvbnN0IEZYX0ZvbnREZXNjcmlwdG9ySW5mbyYgeCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMtPm5QZW5hbHR5IDwgeC5uUGVuYWx0eTsNCi0gICAgfTsNCi0gICAgRlhfQk9PTCBvcGVyYXRvciA9PSAoY29uc3QgRlhfRm9udERlc2NyaXB0b3JJbmZvJiB4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy0+blBlbmFsdHkgPT0geC5uUGVuYWx0eTsNCi0gICAgfTsNCisgcHVibGljOg0KKyAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRm9udDsNCisgIGludDMyX3QgblBlbmFsdHk7DQorICBGWF9CT09MIG9wZXJhdG9yPihjb25zdCBGWF9Gb250RGVzY3JpcHRvckluZm8mIHgpIHsNCisgICAgcmV0dXJuIHRoaXMtPm5QZW5hbHR5ID4geC5uUGVuYWx0eTsNCisgIH07DQorICBGWF9CT09MIG9wZXJhdG9yPChjb25zdCBGWF9Gb250RGVzY3JpcHRvckluZm8mIHgpIHsNCisgICAgcmV0dXJuIHRoaXMtPm5QZW5hbHR5IDwgeC5uUGVuYWx0eTsNCisgIH07DQorICBGWF9CT09MIG9wZXJhdG9yPT0oY29uc3QgRlhfRm9udERlc2NyaXB0b3JJbmZvJiB4KSB7DQorICAgIHJldHVybiB0aGlzLT5uUGVuYWx0eSA9PSB4Lm5QZW5hbHR5Ow0KKyAgfTsNCiB9Ow0KIHR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRm9udERlc2NyaXB0b3JJbmZvPiBDRlhfRm9udERlc2NyaXB0b3JJbmZvczsNCiBzdHJ1Y3QgRlhfSGFuZGxlUGFyZW50UGF0aCB7DQotICAgIEZYX0hhbmRsZVBhcmVudFBhdGgoKQ0KLSAgICB7DQotICAgIH0NCi0gICAgRlhfSGFuZGxlUGFyZW50UGF0aChjb25zdCBGWF9IYW5kbGVQYXJlbnRQYXRoJiB4KQ0KLSAgICB7DQotICAgICAgICBwRmlsZUhhbmRsZSA9IHgucEZpbGVIYW5kbGU7DQotICAgICAgICBic1BhcmVudFBhdGggPSB4LmJzUGFyZW50UGF0aDsNCi0gICAgfQ0KLSAgICB2b2lkKiBwRmlsZUhhbmRsZTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNQYXJlbnRQYXRoOw0KKyAgRlhfSGFuZGxlUGFyZW50UGF0aCgpIHt9DQorICBGWF9IYW5kbGVQYXJlbnRQYXRoKGNvbnN0IEZYX0hhbmRsZVBhcmVudFBhdGgmIHgpIHsNCisgICAgcEZpbGVIYW5kbGUgPSB4LnBGaWxlSGFuZGxlOw0KKyAgICBic1BhcmVudFBhdGggPSB4LmJzUGFyZW50UGF0aDsNCisgIH0NCisgIHZvaWQqIHBGaWxlSGFuZGxlOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNQYXJlbnRQYXRoOw0KIH07DQotY2xhc3MgQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGUgOiBwdWJsaWMgSUZYX0ZvbnRTb3VyY2VFbnVtDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGUoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9Ow0KLSAgICB2aXJ0dWFsIEZYX1BPU0lUSU9OCQlHZXRTdGFydFBvc2l0aW9uKHZvaWQqIHBVc2VyRGF0YSA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIElGWF9GaWxlQWNjZXNzKglHZXROZXh0KEZYX1BPU0lUSU9OJiBwb3MsIHZvaWQqIHBVc2VyRGF0YSA9IE5VTEwpOw0KLXByaXZhdGU6DQotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0TmV4dEZpbGUoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQltX3dzTmV4dDsNCi0gICAgQ0ZYX09iamVjdEFycmF5PEZYX0hhbmRsZVBhcmVudFBhdGg+CW1fRm9sZGVyUXVldWU7DQotICAgIENGWF9CeXRlU3RyaW5nQXJyYXkJCW1fRm9sZGVyUGF0aHM7DQorY2xhc3MgQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGUgOiBwdWJsaWMgSUZYX0ZvbnRTb3VyY2VFbnVtIHsNCisgcHVibGljOg0KKyAgQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGUoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfTsNCisgIHZpcnR1YWwgRlhfUE9TSVRJT04gR2V0U3RhcnRQb3NpdGlvbih2b2lkKiBwVXNlckRhdGEgPSBOVUxMKTsNCisgIHZpcnR1YWwgSUZYX0ZpbGVBY2Nlc3MqIEdldE5leHQoRlhfUE9TSVRJT04mIHBvcywgdm9pZCogcFVzZXJEYXRhID0gTlVMTCk7DQorDQorIHByaXZhdGU6DQorICBDRlhfQnl0ZVN0cmluZyBHZXROZXh0RmlsZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c05leHQ7DQorICBDRlhfT2JqZWN0QXJyYXk8RlhfSGFuZGxlUGFyZW50UGF0aD4gbV9Gb2xkZXJRdWV1ZTsNCisgIENGWF9CeXRlU3RyaW5nQXJyYXkgbV9Gb2xkZXJQYXRoczsNCiB9Ow0KIHR5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBJRlhfRmlsZUFjY2Vzcyo+IENGWF9IYXNoRmlsZU1hcDsNCiB0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgSUZYX0ZvbnQqPiBDRlhfSGFzaEZvbnRNYXA7DQotdHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENGWF9Gb250RGVzY3JpcHRvckluZm9zKj4gQ0ZYX0hhc2hGb250RGVzY3NNYXA7DQotdHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENGWF9BcnJheVRlbXBsYXRlPElGWF9Gb250Kj4qID4gQ0ZYX0hhc2hGb250c01hcDsNCit0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ0ZYX0ZvbnREZXNjcmlwdG9ySW5mb3MqPg0KKyAgICBDRlhfSGFzaEZvbnREZXNjc01hcDsNCit0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPio+DQorICAgIENGWF9IYXNoRm9udHNNYXA7DQogdHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfV0NIQVIsIElGWF9Gb250Kj4gQ0ZYX1VuaWNvZGVGb250TWFwOw0KLXR5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPElGWF9GaWxlQWNjZXNzKiwgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPiogPiBDRlhfRmlsZUZvbnRNYXA7DQordHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8SUZYX0ZpbGVBY2Nlc3MqLCBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+Kj4NCisgICAgQ0ZYX0ZpbGVGb250TWFwOw0KIHR5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPElGWF9Gb250KiwgSUZYX0ZpbGVSZWFkKj4gQ0ZYX0ZvblN0cmVhbXRNYXA7DQotY2xhc3MgQ0ZYX0ZvbnRNZ3JJbXAgOiBwdWJsaWMgSUZYX0ZvbnRNZ3INCi17DQotcHVibGljOg0KLSAgICBDRlhfRm9udE1nckltcChJRlhfRm9udFNvdXJjZUVudW0qIHBGb250RW51bSwgSUZYX0ZvbnRNZ3JEZWxlZ2F0ZSogcERlbGVnYXRlID0gTlVMTCwgdm9pZCogcFVzZXJEYXRhID0gTlVMTCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKTsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeUNvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXREZWZGb250QnlDaGFyc2V0KHVpbnQ4X3QgbkNoYXJzZXQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeVVuaWNvZGUoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCi0gICAgdmlydHVhbCBJRlhfRm9udCoJCUdldERlZkZvbnRCeUxhbmd1YWdlKEZYX1dPUkQgd0xhbmd1YWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXRGb250QnlDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0Rm9udEJ5Q2hhcnNldCh1aW50OF90IG5DaGFyc2V0LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXRGb250QnlVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgSUZYX0ZvbnQqCQlHZXRGb250QnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJTG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoLCBpbnQzMl90IGlGYWNlSW5kZXgsIGludDMyX3QqIHBGYWNlQ291bnQpOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lLCBpbnQzMl90IGlGYWNlSW5kZXgsIGludDMyX3QqIHBGYWNlQ291bnQpOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJTG9hZEZvbnQoSUZYX1N0cmVhbSogcEZvbnRTdHJlYW0sIGludDMyX3QgaUZhY2VJbmRleCwgaW50MzJfdCogcEZhY2VDb3VudCwgRlhfQk9PTCBiU2F2ZVN0cmVhbSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJQ2xlYXJGb250Q2FjaGUoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVtb3ZlRm9udChJRlhfRm9udCogcEZvbnQpOw0KLSAgICBGWF9CT09MCQkJCQlFbnVtRm9udHMoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJCQkJCVJlcG9ydEZhY2UoRlhGVF9GYWNlIHBGYWNlLCBDRlhfRm9udERlc2NyaXB0b3JzJiBGb250cywgSUZYX0ZpbGVBY2Nlc3MqIHBGb250QWNjZXNzKTsNCi0gICAgdm9pZAkJCQkJR2V0TmFtZXMoY29uc3QgdWludDhfdCogbmFtZV90YWJsZSwgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgTmFtZXMpOw0KLSAgICB2b2lkCQkJCQlHZXRDaGFyc2V0cyhGWEZUX0ZhY2UgcEZhY2UsIENGWF9Xb3JkQXJyYXkmIENoYXJzZXRzKTsNCi0gICAgdm9pZAkJCQkJR2V0VVNCQ1NCKEZYRlRfRmFjZSBwRmFjZSwgRlhfRFdPUkQqIFVTQiwgRlhfRFdPUkQqIENTQik7DQotICAgIEZYX0RXT1JECQkJCUdldEZsYWdzKEZYRlRfRmFjZSBwRmFjZSk7DQotICAgIENGWF9Gb250RGVzY3JpcHRvcnMJCW1fSW5zdGFsbGVkRm9udHM7DQotICAgIEZYX0JPT0wJCQkJCVZlcmlmeVVuaWNvZGUoQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRGVzYywgRlhfV0NIQVIgd2NVbmljb2RlKTsNCi0gICAgRlhfQk9PTAkJCQkJVmVyaWZ5VW5pY29kZShJRlhfRm9udCogcEZvbnQsIEZYX1dDSEFSIHdjVW5pY29kZSk7DQotICAgIHZvaWQJCQkJCU5vcm1hbGl6ZUZvbnROYW1lKCBDRlhfV2lkZVN0cmluZyYgRm9udE5hbWUgKTsNCi0gICAgaW50MzJfdAkJCQlJc1BhcnROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBOYW1lMSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIE5hbWUyKTsNCi0gICAgaW50MzJfdAkJCQlNYXRjaEZvbnRzKENGWF9Gb250RGVzY3JpcHRvckluZm9zJiBNYXRjaGVkRm9udHMsIEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSwgRlhfV0NIQVIgd2NVbmljb2RlID0gMHhGRkZFKTsNCi0gICAgaW50MzJfdAkJCQlDYWxjUGVuYWx0eShDRlhfRm9udERlc2NyaXB0b3IqIHBJbnN0YWxsZWQsIEZYX1dPUkQgd0NvZGVQYWdlLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSwgRlhfV0NIQVIgd2NVbmljb2RlID0gMHhGRkZFKTsNCi0gICAgSUZYX0ZvbnQqCQkJCUxvYWRGb250KElGWF9GaWxlQWNjZXNzKiBwRm9udEFjY2VzcywgaW50MzJfdCBpRmFjZUluZGV4LCBpbnQzMl90KiBwRmFjZUNvdW50LCBGWF9CT09MIGJXYW50Q2FjaGUgPSBGQUxTRSk7DQotICAgIEZYRlRfRmFjZQkJCQlMb2FkRmFjZShJRlhfRmlsZVJlYWQqIHBGb250U3RyZWFtLCBpbnQzMl90IGlGYWNlSW5kZXgpOw0KLSAgICBDRlhfSGFzaEZvbnREZXNjc01hcAltX0hhc2gyQ2FuZGlkYXRlTGlzdDsNCi0gICAgQ0ZYX0hhc2hGb250c01hcAkJbV9IYXNoMkZvbnRzOw0KLSAgICBDRlhfSGFzaEZpbGVNYXAJCQltX0hhc2gyRmlsZUFjY2VzczsNCi0gICAgQ0ZYX0hhc2hGb250TWFwCQkJbV9GaWxlQWNjZXNzMklGWEZvbnQ7DQotICAgIENGWF9Gb25TdHJlYW10TWFwCQltX0lGWEZvbnQyRmlsZVJlYWQ7DQotICAgIENGWF9Vbmljb2RlRm9udE1hcAkJbV9GYWlsZWRVbmljb2RlczJOVUxMOw0KLSAgICBJRlhfRm9udFNvdXJjZUVudW0qCQltX3BGb250U291cmNlOw0KLSAgICBJRlhfRm9udE1nckRlbGVnYXRlKgltX3BEZWxlZ2F0ZTsNCi0gICAgdm9pZCoJCQkJbV9wVXNlckRhdGE7DQorY2xhc3MgQ0ZYX0ZvbnRNZ3JJbXAgOiBwdWJsaWMgSUZYX0ZvbnRNZ3Igew0KKyBwdWJsaWM6DQorICBDRlhfRm9udE1nckltcChJRlhfRm9udFNvdXJjZUVudW0qIHBGb250RW51bSwNCisgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyRGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEgPSBOVUxMKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlDaGFyc2V0KHVpbnQ4X3QgbkNoYXJzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldERlZkZvbnRCeVVuaWNvZGUoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldERlZkZvbnRCeUxhbmd1YWdlKEZYX1dPUkQgd0xhbmd1YWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnRCeUNvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnRCeUNoYXJzZXQodWludDhfdCBuQ2hhcnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0Rm9udEJ5VW5pY29kZShGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0Rm9udEJ5TGFuZ3VhZ2UoRlhfV09SRCB3TGFuZ3VhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcEZhY2VDb3VudCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChJRlhfU3RyZWFtKiBwRm9udFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3RyZWFtID0gRkFMU0UpOw0KKyAgdmlydHVhbCB2b2lkIENsZWFyRm9udENhY2hlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlRm9udChJRlhfRm9udCogcEZvbnQpOw0KKyAgRlhfQk9PTCBFbnVtRm9udHMoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBSZXBvcnRGYWNlKEZYRlRfRmFjZSBwRmFjZSwNCisgICAgICAgICAgICAgICAgICBDRlhfRm9udERlc2NyaXB0b3JzJiBGb250cywNCisgICAgICAgICAgICAgICAgICBJRlhfRmlsZUFjY2VzcyogcEZvbnRBY2Nlc3MpOw0KKyAgdm9pZCBHZXROYW1lcyhjb25zdCB1aW50OF90KiBuYW1lX3RhYmxlLCBDRlhfV2lkZVN0cmluZ0FycmF5JiBOYW1lcyk7DQorICB2b2lkIEdldENoYXJzZXRzKEZYRlRfRmFjZSBwRmFjZSwgQ0ZYX1dvcmRBcnJheSYgQ2hhcnNldHMpOw0KKyAgdm9pZCBHZXRVU0JDU0IoRlhGVF9GYWNlIHBGYWNlLCBGWF9EV09SRCogVVNCLCBGWF9EV09SRCogQ1NCKTsNCisgIEZYX0RXT1JEIEdldEZsYWdzKEZYRlRfRmFjZSBwRmFjZSk7DQorICBDRlhfRm9udERlc2NyaXB0b3JzIG1fSW5zdGFsbGVkRm9udHM7DQorICBGWF9CT09MIFZlcmlmeVVuaWNvZGUoQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRGVzYywgRlhfV0NIQVIgd2NVbmljb2RlKTsNCisgIEZYX0JPT0wgVmVyaWZ5VW5pY29kZShJRlhfRm9udCogcEZvbnQsIEZYX1dDSEFSIHdjVW5pY29kZSk7DQorICB2b2lkIE5vcm1hbGl6ZUZvbnROYW1lKENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSk7DQorICBpbnQzMl90IElzUGFydE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIE5hbWUxLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgTmFtZTIpOw0KKyAgaW50MzJfdCBNYXRjaEZvbnRzKENGWF9Gb250RGVzY3JpcHRvckluZm9zJiBNYXRjaGVkRm9udHMsDQorICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Y1VuaWNvZGUgPSAweEZGRkUpOw0KKyAgaW50MzJfdCBDYWxjUGVuYWx0eShDRlhfRm9udERlc2NyaXB0b3IqIHBJbnN0YWxsZWQsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd2NVbmljb2RlID0gMHhGRkZFKTsNCisgIElGWF9Gb250KiBMb2FkRm9udChJRlhfRmlsZUFjY2VzcyogcEZvbnRBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2FudENhY2hlID0gRkFMU0UpOw0KKyAgRlhGVF9GYWNlIExvYWRGYWNlKElGWF9GaWxlUmVhZCogcEZvbnRTdHJlYW0sIGludDMyX3QgaUZhY2VJbmRleCk7DQorICBDRlhfSGFzaEZvbnREZXNjc01hcCBtX0hhc2gyQ2FuZGlkYXRlTGlzdDsNCisgIENGWF9IYXNoRm9udHNNYXAgbV9IYXNoMkZvbnRzOw0KKyAgQ0ZYX0hhc2hGaWxlTWFwIG1fSGFzaDJGaWxlQWNjZXNzOw0KKyAgQ0ZYX0hhc2hGb250TWFwIG1fRmlsZUFjY2VzczJJRlhGb250Ow0KKyAgQ0ZYX0ZvblN0cmVhbXRNYXAgbV9JRlhGb250MkZpbGVSZWFkOw0KKyAgQ0ZYX1VuaWNvZGVGb250TWFwIG1fRmFpbGVkVW5pY29kZXMyTlVMTDsNCisgIElGWF9Gb250U291cmNlRW51bSogbV9wRm9udFNvdXJjZTsNCisgIElGWF9Gb250TWdyRGVsZWdhdGUqIG1fcERlbGVnYXRlOw0KKyAgdm9pZCogbV9wVXNlckRhdGE7DQogfTsNCiAjZW5kaWYNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9saW5lYnJlYWsuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfbGluZWJyZWFrLmNwcAppbmRleCBlNGEwOTg3Li4zZWVmNTUwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9saW5lYnJlYWsuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X2xpbmVicmVhay5jcHAKQEAgLTcsMTE1ICs3LDMxMSBAQAogI2luY2x1ZGUgIi4uL2ZnYXNfYmFzZS5oIg0KIGV4dGVybiBjb25zdCBGWF9EV09SRCBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWzY1NTM2XTsNCiBleHRlcm4gY29uc3QgRlhfTElORUJSRUFLVFlQRSBnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlWzY0XVszMl0gPSB7DQotICAgIHtGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkNQLCBGWF9MQlBCLAlGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLAlGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwJRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJEQiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsCUZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCUZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwJRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAlGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJDUCwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KIH07DQotdm9pZCBGWF9HZXRMaW5lQnJlYWtQb3NpdGlvbnMoY29uc3QgRlhfV0NIQVIqIHB3c1RleHQsIEZYX0xJTkVCUkVBS1RZUEUgKnBCcmtUeXBlLCBpbnQzMl90IGlMZW5ndGgpDQotew0KLSAgICBpZiAoaUxlbmd0aCA8IDIpIHsNCi0gICAgICAgIHJldHVybjsNCit2b2lkIEZYX0dldExpbmVCcmVha1Bvc2l0aW9ucyhjb25zdCBGWF9XQ0hBUiogcHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MSU5FQlJFQUtUWVBFKiBwQnJrVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsNCisgIGlmIChpTGVuZ3RoIDwgMikgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9EV09SRCBkd0N1ciwgZHdOZXh0Ow0KKyAgRlhfV0NIQVIgd2NoOw0KKyAgd2NoID0gKnB3c1RleHQrKzsNCisgIGR3Q3VyID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdICYgMHgwMDNGOw0KKyAgaUxlbmd0aC0tOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgIHdjaCA9ICpwd3NUZXh0Kys7DQorICAgIGR3TmV4dCA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXSAmIDB4MDAzRjsNCisgICAgaWYgKGR3TmV4dCA9PSBGWF9DQlBfU1ApIHsNCisgICAgICBwQnJrVHlwZVtpXSA9IEZYX0xCVF9QUk9ISUJJVEVEX0JSSzsNCisgICAgfSBlbHNlIHsNCisgICAgICBwQnJrVHlwZVtpXSA9ICooKGNvbnN0IEZYX0xJTkVCUkVBS1RZUEUqKWdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGUgKw0KKyAgICAgICAgICAgICAgICAgICAgICAoZHdDdXIgPDwgNSkgKyBkd05leHQpOw0KICAgICB9DQotICAgIEZYX0RXT1JEIGR3Q3VyLCBkd05leHQ7DQotICAgIEZYX1dDSEFSIHdjaDsNCi0gICAgd2NoID0gKnB3c1RleHQgKys7DQotICAgIGR3Q3VyID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdICYgMHgwMDNGOw0KLSAgICBpTGVuZ3RoIC0tOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpICsrKSB7DQotICAgICAgICB3Y2ggPSAqcHdzVGV4dCArKzsNCi0gICAgICAgIGR3TmV4dCA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXSAmIDB4MDAzRjsNCi0gICAgICAgIGlmIChkd05leHQgPT0gRlhfQ0JQX1NQKSB7DQotICAgICAgICAgICAgcEJya1R5cGVbaV0gPSBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBCcmtUeXBlW2ldID0gKigoY29uc3QgRlhfTElORUJSRUFLVFlQRSAqKWdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGUgKyAoZHdDdXIgPDwgNSkgKyBkd05leHQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZHdDdXIgPSBkd05leHQ7DQotICAgIH0NCi0gICAgcEJya1R5cGVbaUxlbmd0aF0gPSBGWF9MQlRfSU5ESVJFQ1RfQlJLOw0KKyAgICBkd0N1ciA9IGR3TmV4dDsNCisgIH0NCisgIHBCcmtUeXBlW2lMZW5ndGhdID0gRlhfTEJUX0lORElSRUNUX0JSSzsNCiB9DQotdm9pZCBGWF9HZXRMaW5lQnJlYWtQb3NpdGlvbnMoY29uc3QgRlhfV0NIQVIqIHB3c1RleHQsIGludDMyX3QgaUxlbmd0aCwgQ0ZYX0ludDMyTWFzc0FycmF5ICZicCkNCi17DQotICAgIGlmIChpTGVuZ3RoIDwgMikgew0KLSAgICAgICAgcmV0dXJuOw0KK3ZvaWQgRlhfR2V0TGluZUJyZWFrUG9zaXRpb25zKGNvbnN0IEZYX1dDSEFSKiBwd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJNYXNzQXJyYXkmIGJwKSB7DQorICBpZiAoaUxlbmd0aCA8IDIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfTElORUJSRUFLVFlQRSBlVHlwZTsNCisgIEZYX0RXT1JEIGR3Q3VyLCBkd05leHQ7DQorICBGWF9XQ0hBUiB3Y2g7DQorICB3Y2ggPSAqcHdzVGV4dCsrOw0KKyAgZHdDdXIgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiAweDAwM0Y7DQorICBpTGVuZ3RoLS07DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgd2NoID0gKnB3c1RleHQrKzsNCisgICAgZHdOZXh0ID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdICYgMHgwMDNGOw0KKyAgICBpZiAoZHdOZXh0ID09IEZYX0NCUF9TUCkgew0KKyAgICAgIGVUeXBlID0gRlhfTEJUX1BST0hJQklURURfQlJLOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGVUeXBlID0gKigoY29uc3QgRlhfTElORUJSRUFLVFlQRSopZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZSArDQorICAgICAgICAgICAgICAgIChkd0N1ciA8PCA1KSArIGR3TmV4dCk7DQogICAgIH0NCi0gICAgRlhfTElORUJSRUFLVFlQRSBlVHlwZTsNCi0gICAgRlhfRFdPUkQgZHdDdXIsIGR3TmV4dDsNCi0gICAgRlhfV0NIQVIgd2NoOw0KLSAgICB3Y2ggPSAqcHdzVGV4dCArKzsNCi0gICAgZHdDdXIgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiAweDAwM0Y7DQotICAgIGlMZW5ndGggLS07DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGg7IGkgKyspIHsNCi0gICAgICAgIHdjaCA9ICpwd3NUZXh0ICsrOw0KLSAgICAgICAgZHdOZXh0ID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdICYgMHgwMDNGOw0KLSAgICAgICAgaWYgKGR3TmV4dCA9PSBGWF9DQlBfU1ApIHsNCi0gICAgICAgICAgICBlVHlwZSA9IEZYX0xCVF9QUk9ISUJJVEVEX0JSSzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZVR5cGUgPSAqKChjb25zdCBGWF9MSU5FQlJFQUtUWVBFICopZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZSArIChkd0N1ciA8PCA1KSArIGR3TmV4dCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZVR5cGUgPT0gRlhfTEJUX0RJUkVDVF9CUkspIHsNCi0gICAgICAgICAgICBicC5BZGQoaSk7DQotICAgICAgICB9DQotICAgICAgICBkd0N1ciA9IGR3TmV4dDsNCisgICAgaWYgKGVUeXBlID09IEZYX0xCVF9ESVJFQ1RfQlJLKSB7DQorICAgICAgYnAuQWRkKGkpOw0KICAgICB9DQorICAgIGR3Q3VyID0gZHdOZXh0Ow0KKyAgfQ0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9ydGZicmVhay5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9ydGZicmVhay5jcHAKaW5kZXggNDRiMGRjOC4uNWZhNTAzZiAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfcnRmYnJlYWsuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3J0ZmJyZWFrLmNwcApAQCAtMTEsMTUxMiArMTEsMTUxNiBAQAogZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGdzX0ZYX1RleHRMYXlvdXRfVmVydGljYWxNaXJyb3JbNjRdOw0KIGV4dGVybiBjb25zdCBGWF9XQ0hBUiBnc19GWF9UZXh0TGF5b3V0X0JpZGlNaXJyb3JbNTEyXTsNCiBleHRlcm4gY29uc3QgRlhfTElORUJSRUFLVFlQRSBnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlWzY0XVszMl07DQotSUZYX1JURkJyZWFrKiBJRlhfUlRGQnJlYWs6OkNyZWF0ZShGWF9EV09SRCBkd1BvbGljaWVzKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDRlhfUlRGQnJlYWsoZHdQb2xpY2llcyk7DQorSUZYX1JURkJyZWFrKiBJRlhfUlRGQnJlYWs6OkNyZWF0ZShGWF9EV09SRCBkd1BvbGljaWVzKSB7DQorICByZXR1cm4gRlhfTkVXIENGWF9SVEZCcmVhayhkd1BvbGljaWVzKTsNCiB9DQogQ0ZYX1JURkJyZWFrOjpDRlhfUlRGQnJlYWsoRlhfRFdPUkQgZHdQb2xpY2llcykNCi0gICAgOiBtX2R3UG9saWNpZXMoZHdQb2xpY2llcykNCi0gICAgLCBtX3BBcmFiaWNDaGFyKE5VTEwpDQotICAgICwgbV9pTGluZVN0YXJ0KDApDQotICAgICwgbV9pTGluZUVuZCgyMDAwMDAwKQ0KLSAgICAsIG1fZHdMYXlvdXRTdHlsZXMoMCkNCi0gICAgLCBtX2JQYWdpbmF0aW9uKEZBTFNFKQ0KLSAgICAsIG1fYlZlcnRpY2FsKEZBTFNFKQ0KLSAgICAsIG1fYlNpbmdsZUxpbmUoRkFMU0UpDQotICAgICwgbV9iQ2hhckNvZGUoRkFMU0UpDQotICAgICwgbV9wRm9udChOVUxMKQ0KLSAgICAsIG1faUZvbnRIZWlnaHQoMjQwKQ0KLSAgICAsIG1faUZvbnRTaXplKDI0MCkNCi0gICAgLCBtX2lUYWJXaWR0aCg3MjAwMDApDQotICAgICwgbV9Qb3NpdGlvbmVkVGFicygpDQotICAgICwgbV9iT3JwaGFuTGluZShGQUxTRSkNCi0gICAgLCBtX3dEZWZDaGFyKDB4RkVGRikNCi0gICAgLCBtX2lEZWZDaGFyKDApDQotICAgICwgbV93TGluZUJyZWFrQ2hhcihMJ1xuJykNCi0gICAgLCBtX2lIb3Jpem9udGFsU2NhbGUoMTAwKQ0KLSAgICAsIG1faVZlcnRpY2FsU2NhbGUoMTAwKQ0KLSAgICAsIG1faUxpbmVSb3RhdGlvbigwKQ0KLSAgICAsIG1faUNoYXJSb3RhdGlvbigwKQ0KLSAgICAsIG1faVJvdGF0aW9uKDApDQotICAgICwgbV9pQ2hhclNwYWNlKDApDQotICAgICwgbV9iV29yZFNwYWNlKEZBTFNFKQ0KLSAgICAsIG1faVdvcmRTcGFjZSgwKQ0KLSAgICAsIG1fYlJUTChGQUxTRSkNCi0gICAgLCBtX2lBbGlnbm1lbnQoRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0KQ0KLSAgICAsIG1fcFVzZXJEYXRhKE5VTEwpDQotICAgICwgbV9kd0NoYXJUeXBlKDApDQotICAgICwgbV9kd0lkZW50aXR5KDApDQotICAgICwgbV9SVEZMaW5lMSgpDQotICAgICwgbV9SVEZMaW5lMigpDQotICAgICwgbV9wQ3VyTGluZShOVUxMKQ0KLSAgICAsIG1faVJlYWR5KDApDQotICAgICwgbV9pVG9sZXJhbmNlKDApDQotew0KLSAgICBtX3BBcmFiaWNDaGFyID0gSUZYX0FyYWJpY0NoYXI6OkNyZWF0ZSgpOw0KLSAgICBtX3BDdXJMaW5lID0gJm1fUlRGTGluZTE7DQorICAgIDogbV9kd1BvbGljaWVzKGR3UG9saWNpZXMpLA0KKyAgICAgIG1fcEFyYWJpY0NoYXIoTlVMTCksDQorICAgICAgbV9pTGluZVN0YXJ0KDApLA0KKyAgICAgIG1faUxpbmVFbmQoMjAwMDAwMCksDQorICAgICAgbV9kd0xheW91dFN0eWxlcygwKSwNCisgICAgICBtX2JQYWdpbmF0aW9uKEZBTFNFKSwNCisgICAgICBtX2JWZXJ0aWNhbChGQUxTRSksDQorICAgICAgbV9iU2luZ2xlTGluZShGQUxTRSksDQorICAgICAgbV9iQ2hhckNvZGUoRkFMU0UpLA0KKyAgICAgIG1fcEZvbnQoTlVMTCksDQorICAgICAgbV9pRm9udEhlaWdodCgyNDApLA0KKyAgICAgIG1faUZvbnRTaXplKDI0MCksDQorICAgICAgbV9pVGFiV2lkdGgoNzIwMDAwKSwNCisgICAgICBtX1Bvc2l0aW9uZWRUYWJzKCksDQorICAgICAgbV9iT3JwaGFuTGluZShGQUxTRSksDQorICAgICAgbV93RGVmQ2hhcigweEZFRkYpLA0KKyAgICAgIG1faURlZkNoYXIoMCksDQorICAgICAgbV93TGluZUJyZWFrQ2hhcihMJ1xuJyksDQorICAgICAgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCksDQorICAgICAgbV9pVmVydGljYWxTY2FsZSgxMDApLA0KKyAgICAgIG1faUxpbmVSb3RhdGlvbigwKSwNCisgICAgICBtX2lDaGFyUm90YXRpb24oMCksDQorICAgICAgbV9pUm90YXRpb24oMCksDQorICAgICAgbV9pQ2hhclNwYWNlKDApLA0KKyAgICAgIG1fYldvcmRTcGFjZShGQUxTRSksDQorICAgICAgbV9pV29yZFNwYWNlKDApLA0KKyAgICAgIG1fYlJUTChGQUxTRSksDQorICAgICAgbV9pQWxpZ25tZW50KEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCksDQorICAgICAgbV9wVXNlckRhdGEoTlVMTCksDQorICAgICAgbV9kd0NoYXJUeXBlKDApLA0KKyAgICAgIG1fZHdJZGVudGl0eSgwKSwNCisgICAgICBtX1JURkxpbmUxKCksDQorICAgICAgbV9SVEZMaW5lMigpLA0KKyAgICAgIG1fcEN1ckxpbmUoTlVMTCksDQorICAgICAgbV9pUmVhZHkoMCksDQorICAgICAgbV9pVG9sZXJhbmNlKDApIHsNCisgIG1fcEFyYWJpY0NoYXIgPSBJRlhfQXJhYmljQ2hhcjo6Q3JlYXRlKCk7DQorICBtX3BDdXJMaW5lID0gJm1fUlRGTGluZTE7DQogfQ0KLUNGWF9SVEZCcmVhazo6fkNGWF9SVEZCcmVhaygpDQotew0KLSAgICBSZXNldCgpOw0KLSAgICBtX1Bvc2l0aW9uZWRUYWJzLlJlbW92ZUFsbCgpOw0KLSAgICBtX3BBcmFiaWNDaGFyLT5SZWxlYXNlKCk7DQotICAgIGlmIChtX3BVc2VyRGF0YSAhPSBOVUxMKSB7DQotICAgICAgICBtX3BVc2VyRGF0YS0+UmVsZWFzZSgpOw0KLSAgICB9DQorQ0ZYX1JURkJyZWFrOjp+Q0ZYX1JURkJyZWFrKCkgew0KKyAgUmVzZXQoKTsNCisgIG1fUG9zaXRpb25lZFRhYnMuUmVtb3ZlQWxsKCk7DQorICBtX3BBcmFiaWNDaGFyLT5SZWxlYXNlKCk7DQorICBpZiAobV9wVXNlckRhdGEgIT0gTlVMTCkgew0KKyAgICBtX3BVc2VyRGF0YS0+UmVsZWFzZSgpOw0KKyAgfQ0KIH0NCi12b2lkIENGWF9SVEZCcmVhazo6U2V0TGluZVdpZHRoKEZYX0ZMT0FUIGZMaW5lU3RhcnQsIEZYX0ZMT0FUIGZMaW5lRW5kKQ0KLXsNCi0gICAgbV9pTGluZVN0YXJ0ID0gRlhTWVNfcm91bmQoZkxpbmVTdGFydCAqIDIwMDAwLjBmKTsNCi0gICAgbV9pTGluZUVuZCA9IEZYU1lTX3JvdW5kKGZMaW5lRW5kICogMjAwMDAuMGYpOw0KLSAgICBGWFNZU19hc3NlcnQobV9pTGluZUVuZCA+PSBtX2lMaW5lU3RhcnQpOw0KLSAgICBpZiAobV9wQ3VyTGluZS0+bV9pU3RhcnQgPCBtX2lMaW5lU3RhcnQpIHsNCi0gICAgICAgIG1fcEN1ckxpbmUtPm1faVN0YXJ0ID0gbV9pTGluZVN0YXJ0Ow0KLSAgICB9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldExpbmVXaWR0aChGWF9GTE9BVCBmTGluZVN0YXJ0LCBGWF9GTE9BVCBmTGluZUVuZCkgew0KKyAgbV9pTGluZVN0YXJ0ID0gRlhTWVNfcm91bmQoZkxpbmVTdGFydCAqIDIwMDAwLjBmKTsNCisgIG1faUxpbmVFbmQgPSBGWFNZU19yb3VuZChmTGluZUVuZCAqIDIwMDAwLjBmKTsNCisgIEZYU1lTX2Fzc2VydChtX2lMaW5lRW5kID49IG1faUxpbmVTdGFydCk7DQorICBpZiAobV9wQ3VyTGluZS0+bV9pU3RhcnQgPCBtX2lMaW5lU3RhcnQpIHsNCisgICAgbV9wQ3VyTGluZS0+bV9pU3RhcnQgPSBtX2lMaW5lU3RhcnQ7DQorICB9DQogfQ0KLXZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRMaW5lUG9zKEZYX0ZMT0FUIGZMaW5lUG9zKQ0KLXsNCi0gICAgaW50MzJfdCBpTGluZVBvcyA9IEZYU1lTX3JvdW5kKGZMaW5lUG9zICogMjAwMDAuMGYpOw0KLSAgICBpZiAoaUxpbmVQb3MgPiBtX2lMaW5lRW5kKSB7DQotICAgICAgICBpTGluZVBvcyA9IG1faUxpbmVFbmQ7DQotICAgIH0NCi0gICAgbV9wQ3VyTGluZS0+bV9pU3RhcnQgPSBpTGluZVBvczsNCit2b2lkIENGWF9SVEZCcmVhazo6U2V0TGluZVBvcyhGWF9GTE9BVCBmTGluZVBvcykgew0KKyAgaW50MzJfdCBpTGluZVBvcyA9IEZYU1lTX3JvdW5kKGZMaW5lUG9zICogMjAwMDAuMGYpOw0KKyAgaWYgKGlMaW5lUG9zID4gbV9pTGluZUVuZCkgew0KKyAgICBpTGluZVBvcyA9IG1faUxpbmVFbmQ7DQorICB9DQorICBtX3BDdXJMaW5lLT5tX2lTdGFydCA9IGlMaW5lUG9zOw0KIH0NCi12b2lkIENGWF9SVEZCcmVhazo6U2V0TGF5b3V0U3R5bGVzKEZYX0RXT1JEIGR3TGF5b3V0U3R5bGVzKQ0KLXsNCi0gICAgaWYgKG1fZHdMYXlvdXRTdHlsZXMgPT0gZHdMYXlvdXRTdHlsZXMpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBTZXRCcmVha1N0YXR1cygpOw0KLSAgICBtX2R3TGF5b3V0U3R5bGVzID0gZHdMYXlvdXRTdHlsZXM7DQotICAgIG1fYlBhZ2luYXRpb24gPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX1BhZ2luYXRpb24pICE9IDA7DQotICAgIG1fYlZlcnRpY2FsID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9WZXJ0aWNhbENoYXJzKSAhPSAwOw0KLSAgICBtX2JTaW5nbGVMaW5lID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9TaW5nbGVMaW5lKSAhPSAwOw0KLSAgICBtX2JDaGFyQ29kZSA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfTUJDU0NvZGUpICE9IDA7DQotICAgIG1faUxpbmVSb3RhdGlvbiA9IEdldExpbmVSb3RhdGlvbihtX2R3TGF5b3V0U3R5bGVzKTsNCi0gICAgbV9pUm90YXRpb24gPSBtX2lMaW5lUm90YXRpb24gKyBtX2lDaGFyUm90YXRpb247DQotICAgIG1faVJvdGF0aW9uICU9IDQ7DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcykgew0KKyAgaWYgKG1fZHdMYXlvdXRTdHlsZXMgPT0gZHdMYXlvdXRTdHlsZXMpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU2V0QnJlYWtTdGF0dXMoKTsNCisgIG1fZHdMYXlvdXRTdHlsZXMgPSBkd0xheW91dFN0eWxlczsNCisgIG1fYlBhZ2luYXRpb24gPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX1BhZ2luYXRpb24pICE9IDA7DQorICBtX2JWZXJ0aWNhbCA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycykgIT0gMDsNCisgIG1fYlNpbmdsZUxpbmUgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX1NpbmdsZUxpbmUpICE9IDA7DQorICBtX2JDaGFyQ29kZSA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfTUJDU0NvZGUpICE9IDA7DQorICBtX2lMaW5lUm90YXRpb24gPSBHZXRMaW5lUm90YXRpb24obV9kd0xheW91dFN0eWxlcyk7DQorICBtX2lSb3RhdGlvbiA9IG1faUxpbmVSb3RhdGlvbiArIG1faUNoYXJSb3RhdGlvbjsNCisgIG1faVJvdGF0aW9uICU9IDQ7DQogfQ0KLXZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRGb250KElGWF9Gb250ICpwRm9udCkNCi17DQotICAgIGlmIChwRm9udCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldEZvbnQoSUZYX0ZvbnQqIHBGb250KSB7DQorICBpZiAocEZvbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9wRm9udCA9PSBwRm9udCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBTZXRCcmVha1N0YXR1cygpOw0KKyAgbV9wRm9udCA9IHBGb250Ow0KKyAgbV9pRGVmQ2hhciA9IDA7DQorICBpZiAobV9wRm9udCAhPSBOVUxMKSB7DQorICAgIG1faUZvbnRIZWlnaHQgPSBtX2lGb250U2l6ZTsNCisgICAgaWYgKG1fd0RlZkNoYXIgIT0gMHhGRUZGKSB7DQorICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIEZBTFNFKTsNCisgICAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KICAgICB9DQotICAgIGlmIChtX3BGb250ID09IHBGb250KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgU2V0QnJlYWtTdGF0dXMoKTsNCi0gICAgbV9wRm9udCA9IHBGb250Ow0KLSAgICBtX2lEZWZDaGFyID0gMDsNCi0gICAgaWYgKG1fcEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgbV9pRm9udEhlaWdodCA9IG1faUZvbnRTaXplOw0KLSAgICAgICAgaWYgKG1fd0RlZkNoYXIgIT0gMHhGRUZGKSB7DQotICAgICAgICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIEZBTFNFKTsNCi0gICAgICAgICAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICB9DQogfQ0KLXZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpDQotew0KLSAgICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsNCi0gICAgaWYgKG1faUZvbnRTaXplID09IGlGb250U2l6ZSkgew0KLSAgICAgICAgcmV0dXJuOw0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsNCisgIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KKyAgaWYgKG1faUZvbnRTaXplID09IGlGb250U2l6ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBTZXRCcmVha1N0YXR1cygpOw0KKyAgbV9pRm9udFNpemUgPSBpRm9udFNpemU7DQorICBtX2lEZWZDaGFyID0gMDsNCisgIGlmIChtX3BGb250ICE9IE5VTEwpIHsNCisgICAgbV9pRm9udEhlaWdodCA9IG1faUZvbnRTaXplOw0KKyAgICBpZiAobV93RGVmQ2hhciAhPSAweEZFRkYpIHsNCisgICAgICBtX3BGb250LT5HZXRDaGFyV2lkdGgobV93RGVmQ2hhciwgbV9pRGVmQ2hhciwgRkFMU0UpOw0KKyAgICAgIG1faURlZkNoYXIgKj0gbV9pRm9udFNpemU7DQogICAgIH0NCi0gICAgU2V0QnJlYWtTdGF0dXMoKTsNCi0gICAgbV9pRm9udFNpemUgPSBpRm9udFNpemU7DQotICAgIG1faURlZkNoYXIgPSAwOw0KLSAgICBpZiAobV9wRm9udCAhPSBOVUxMKSB7DQotICAgICAgICBtX2lGb250SGVpZ2h0ID0gbV9pRm9udFNpemU7DQotICAgICAgICBpZiAobV93RGVmQ2hhciAhPSAweEZFRkYpIHsNCi0gICAgICAgICAgICBtX3BGb250LT5HZXRDaGFyV2lkdGgobV93RGVmQ2hhciwgbV9pRGVmQ2hhciwgRkFMU0UpOw0KLSAgICAgICAgICAgIG1faURlZkNoYXIgKj0gbV9pRm9udFNpemU7DQotICAgICAgICB9DQotICAgIH0NCisgIH0NCiB9DQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCkNCi17DQotICAgIG1faVRhYldpZHRoID0gRlhTWVNfcm91bmQoZlRhYldpZHRoICogMjAwMDAuMGYpOw0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgpIHsNCisgIG1faVRhYldpZHRoID0gRlhTWVNfcm91bmQoZlRhYldpZHRoICogMjAwMDAuMGYpOw0KIH0NCi12b2lkIENGWF9SVEZCcmVhazo6QWRkUG9zaXRpb25lZFRhYihGWF9GTE9BVCBmVGFiUG9zKQ0KLXsNCi0gICAgaW50MzJfdCBpTGluZUVuZCA9IG1faUxpbmVFbmQ7DQotICAgIGludDMyX3QgaVRhYlBvcyA9IEZYU1lTX3JvdW5kKGZUYWJQb3MgKiAyMDAwMC4wZikgKyBtX2lMaW5lU3RhcnQ7DQotICAgIGlmIChpVGFiUG9zID4gaUxpbmVFbmQpIHsNCi0gICAgICAgIGlUYWJQb3MgPSBpTGluZUVuZDsNCit2b2lkIENGWF9SVEZCcmVhazo6QWRkUG9zaXRpb25lZFRhYihGWF9GTE9BVCBmVGFiUG9zKSB7DQorICBpbnQzMl90IGlMaW5lRW5kID0gbV9pTGluZUVuZDsNCisgIGludDMyX3QgaVRhYlBvcyA9IEZYU1lTX3JvdW5kKGZUYWJQb3MgKiAyMDAwMC4wZikgKyBtX2lMaW5lU3RhcnQ7DQorICBpZiAoaVRhYlBvcyA+IGlMaW5lRW5kKSB7DQorICAgIGlUYWJQb3MgPSBpTGluZUVuZDsNCisgIH0NCisgIGlmIChtX1Bvc2l0aW9uZWRUYWJzLkZpbmQoaVRhYlBvcywgMCkgPiAtMSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IG1fUG9zaXRpb25lZFRhYnMuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBpRmluZCA9IDA7DQorICBmb3IgKDsgaUZpbmQgPCBpQ291bnQ7IGlGaW5kKyspIHsNCisgICAgaWYgKG1fUG9zaXRpb25lZFRhYnNbaUZpbmRdID4gaVRhYlBvcykgew0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGlmIChtX1Bvc2l0aW9uZWRUYWJzLkZpbmQoaVRhYlBvcywgMCkgPiAtMSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9Qb3NpdGlvbmVkVGFicy5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaUZpbmQgPSAwOw0KLSAgICBmb3IgKDsgaUZpbmQgPCBpQ291bnQ7IGlGaW5kICsrKSB7DQotICAgICAgICBpZiAobV9Qb3NpdGlvbmVkVGFic1tpRmluZF0gPiBpVGFiUG9zKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9Qb3NpdGlvbmVkVGFicy5JbnNlcnRBdChpRmluZCwgaVRhYlBvcyk7DQotICAgIGlmIChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9PcnBoYW5Qb3NpdGlvbmVkVGFiKSB7DQotICAgICAgICBtX2JPcnBoYW5MaW5lID0gR2V0TGFzdFBvc2l0aW9uZWRUYWIoKSA+PSBpTGluZUVuZDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1fYk9ycGhhbkxpbmUgPSBGQUxTRTsNCi0gICAgfQ0KLX0NCi12b2lkIENGWF9SVEZCcmVhazo6U2V0UG9zaXRpb25lZFRhYnMoY29uc3QgQ0ZYX0Zsb2F0QXJyYXkgJnRhYnMpDQotew0KLSAgICBtX1Bvc2l0aW9uZWRUYWJzLlJlbW92ZUFsbCgpOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IHRhYnMuR2V0U2l6ZSgpOw0KLSAgICBtX1Bvc2l0aW9uZWRUYWJzLlNldFNpemUoaUNvdW50KTsNCi0gICAgaW50MzJfdCBpTGluZUVuZCA9IG1faUxpbmVFbmQ7DQotICAgIGludDMyX3QgaVRhYlBvczsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICBpVGFiUG9zID0gRlhTWVNfcm91bmQodGFic1tpXSAqIDIwMDAwLjBmKSArIG1faUxpbmVTdGFydDsNCi0gICAgICAgIGlmIChpVGFiUG9zID4gaUxpbmVFbmQpIHsNCi0gICAgICAgICAgICBpVGFiUG9zID0gaUxpbmVFbmQ7DQotICAgICAgICB9DQotICAgICAgICBtX1Bvc2l0aW9uZWRUYWJzW2ldID0gaVRhYlBvczsNCi0gICAgfQ0KLSAgICBpZiAobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfT3JwaGFuUG9zaXRpb25lZFRhYikgew0KLSAgICAgICAgbV9iT3JwaGFuTGluZSA9IEdldExhc3RQb3NpdGlvbmVkVGFiKCkgPj0gaUxpbmVFbmQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX2JPcnBoYW5MaW5lID0gRkFMU0U7DQotICAgIH0NCi19DQotdm9pZCBDRlhfUlRGQnJlYWs6OkNsZWFyUG9zaXRpb25lZFRhYnMoKQ0KLXsNCi0gICAgbV9Qb3NpdGlvbmVkVGFicy5SZW1vdmVBbGwoKTsNCisgIH0NCisgIG1fUG9zaXRpb25lZFRhYnMuSW5zZXJ0QXQoaUZpbmQsIGlUYWJQb3MpOw0KKyAgaWYgKG1fZHdQb2xpY2llcyAmIEZYX1JURkJSRUFLUE9MSUNZX09ycGhhblBvc2l0aW9uZWRUYWIpIHsNCisgICAgbV9iT3JwaGFuTGluZSA9IEdldExhc3RQb3NpdGlvbmVkVGFiKCkgPj0gaUxpbmVFbmQ7DQorICB9IGVsc2Ugew0KICAgICBtX2JPcnBoYW5MaW5lID0gRkFMU0U7DQorICB9DQogfQ0KLXZvaWQgQ0ZYX1JURkJyZWFrOjpTZXREZWZhdWx0Q2hhcihGWF9XQ0hBUiB3Y2gpDQotew0KLSAgICBtX3dEZWZDaGFyID0gd2NoOw0KLSAgICBtX2lEZWZDaGFyID0gMDsNCi0gICAgaWYgKG1fd0RlZkNoYXIgIT0gMHhGRUZGICYmIG1fcEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIEZBTFNFKTsNCi0gICAgICAgIGlmIChtX2lEZWZDaGFyIDwgMCkgew0KLSAgICAgICAgICAgIG1faURlZkNoYXIgPSAwOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRQb3NpdGlvbmVkVGFicyhjb25zdCBDRlhfRmxvYXRBcnJheSYgdGFicykgew0KKyAgbV9Qb3NpdGlvbmVkVGFicy5SZW1vdmVBbGwoKTsNCisgIGludDMyX3QgaUNvdW50ID0gdGFicy5HZXRTaXplKCk7DQorICBtX1Bvc2l0aW9uZWRUYWJzLlNldFNpemUoaUNvdW50KTsNCisgIGludDMyX3QgaUxpbmVFbmQgPSBtX2lMaW5lRW5kOw0KKyAgaW50MzJfdCBpVGFiUG9zOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgaVRhYlBvcyA9IEZYU1lTX3JvdW5kKHRhYnNbaV0gKiAyMDAwMC4wZikgKyBtX2lMaW5lU3RhcnQ7DQorICAgIGlmIChpVGFiUG9zID4gaUxpbmVFbmQpIHsNCisgICAgICBpVGFiUG9zID0gaUxpbmVFbmQ7DQogICAgIH0NCisgICAgbV9Qb3NpdGlvbmVkVGFic1tpXSA9IGlUYWJQb3M7DQorICB9DQorICBpZiAobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfT3JwaGFuUG9zaXRpb25lZFRhYikgew0KKyAgICBtX2JPcnBoYW5MaW5lID0gR2V0TGFzdFBvc2l0aW9uZWRUYWIoKSA+PSBpTGluZUVuZDsNCisgIH0gZWxzZSB7DQorICAgIG1fYk9ycGhhbkxpbmUgPSBGQUxTRTsNCisgIH0NCiB9DQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldExpbmVCcmVha0NoYXIoRlhfV0NIQVIgd2NoKQ0KLXsNCi0gICAgaWYgKHdjaCAhPSBMJ1xyJyAmJiB3Y2ggIT0gTCdcbicpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBtX3dMaW5lQnJlYWtDaGFyID0gd2NoOw0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpDbGVhclBvc2l0aW9uZWRUYWJzKCkgew0KKyAgbV9Qb3NpdGlvbmVkVGFicy5SZW1vdmVBbGwoKTsNCisgIG1fYk9ycGhhbkxpbmUgPSBGQUxTRTsNCiB9DQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKQ0KLXsNCi0gICAgbV9pVG9sZXJhbmNlID0gRlhTWVNfcm91bmQoZlRvbGVyYW5jZSAqIDIwMDAwLjBmKTsNCit2b2lkIENGWF9SVEZCcmVhazo6U2V0RGVmYXVsdENoYXIoRlhfV0NIQVIgd2NoKSB7DQorICBtX3dEZWZDaGFyID0gd2NoOw0KKyAgbV9pRGVmQ2hhciA9IDA7DQorICBpZiAobV93RGVmQ2hhciAhPSAweEZFRkYgJiYgbV9wRm9udCAhPSBOVUxMKSB7DQorICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aChtX3dEZWZDaGFyLCBtX2lEZWZDaGFyLCBGQUxTRSk7DQorICAgIGlmIChtX2lEZWZDaGFyIDwgMCkgew0KKyAgICAgIG1faURlZkNoYXIgPSAwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1faURlZkNoYXIgKj0gbV9pRm9udFNpemU7DQorICAgIH0NCisgIH0NCiB9DQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldEhvcml6b250YWxTY2FsZShpbnQzMl90IGlTY2FsZSkNCi17DQotICAgIGlmIChpU2NhbGUgPCAwKSB7DQotICAgICAgICBpU2NhbGUgPSAwOw0KLSAgICB9DQotICAgIGlmIChtX2lIb3Jpem9udGFsU2NhbGUgPT0gaVNjYWxlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgU2V0QnJlYWtTdGF0dXMoKTsNCi0gICAgbV9pSG9yaXpvbnRhbFNjYWxlID0gaVNjYWxlOw0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRMaW5lQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCkgew0KKyAgaWYgKHdjaCAhPSBMJ1xyJyAmJiB3Y2ggIT0gTCdcbicpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV93TGluZUJyZWFrQ2hhciA9IHdjaDsNCiB9DQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldFZlcnRpY2FsU2NhbGUoaW50MzJfdCBpU2NhbGUpDQotew0KLSAgICBpZiAoaVNjYWxlIDwgMCkgew0KLSAgICAgICAgaVNjYWxlID0gMDsNCi0gICAgfQ0KLSAgICBpZiAobV9pVmVydGljYWxTY2FsZSA9PSBpU2NhbGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBTZXRCcmVha1N0YXR1cygpOw0KLSAgICBtX2lWZXJ0aWNhbFNjYWxlID0gaVNjYWxlOw0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRMaW5lQnJlYWtUb2xlcmFuY2UoRlhfRkxPQVQgZlRvbGVyYW5jZSkgew0KKyAgbV9pVG9sZXJhbmNlID0gRlhTWVNfcm91bmQoZlRvbGVyYW5jZSAqIDIwMDAwLjBmKTsNCiB9DQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldENoYXJSb3RhdGlvbihpbnQzMl90IGlDaGFyUm90YXRpb24pDQotew0KLSAgICBpZiAoaUNoYXJSb3RhdGlvbiA8IDApIHsNCi0gICAgICAgIGlDaGFyUm90YXRpb24gKz0gKC1pQ2hhclJvdGF0aW9uIC8gNCArIDEpICogNDsNCi0gICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID4gMykgew0KLSAgICAgICAgaUNoYXJSb3RhdGlvbiAtPSAoaUNoYXJSb3RhdGlvbiAvIDQpICogNDsNCi0gICAgfQ0KLSAgICBpZiAobV9pQ2hhclJvdGF0aW9uID09IGlDaGFyUm90YXRpb24pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBTZXRCcmVha1N0YXR1cygpOw0KLSAgICBtX2lDaGFyUm90YXRpb24gPSBpQ2hhclJvdGF0aW9uOw0KLSAgICBtX2lSb3RhdGlvbiA9IG1faUxpbmVSb3RhdGlvbiArIG1faUNoYXJSb3RhdGlvbjsNCi0gICAgbV9pUm90YXRpb24gJT0gNDsNCit2b2lkIENGWF9SVEZCcmVhazo6U2V0SG9yaXpvbnRhbFNjYWxlKGludDMyX3QgaVNjYWxlKSB7DQorICBpZiAoaVNjYWxlIDwgMCkgew0KKyAgICBpU2NhbGUgPSAwOw0KKyAgfQ0KKyAgaWYgKG1faUhvcml6b250YWxTY2FsZSA9PSBpU2NhbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU2V0QnJlYWtTdGF0dXMoKTsNCisgIG1faUhvcml6b250YWxTY2FsZSA9IGlTY2FsZTsNCiB9DQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKQ0KLXsNCi0gICAgbV9pQ2hhclNwYWNlID0gRlhTWVNfcm91bmQoZkNoYXJTcGFjZSAqIDIwMDAwLjBmKTsNCit2b2lkIENGWF9SVEZCcmVhazo6U2V0VmVydGljYWxTY2FsZShpbnQzMl90IGlTY2FsZSkgew0KKyAgaWYgKGlTY2FsZSA8IDApIHsNCisgICAgaVNjYWxlID0gMDsNCisgIH0NCisgIGlmIChtX2lWZXJ0aWNhbFNjYWxlID09IGlTY2FsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBTZXRCcmVha1N0YXR1cygpOw0KKyAgbV9pVmVydGljYWxTY2FsZSA9IGlTY2FsZTsNCiB9DQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldFdvcmRTcGFjZShGWF9CT09MIGJEZWZhdWx0LCBGWF9GTE9BVCBmV29yZFNwYWNlKQ0KLXsNCi0gICAgbV9iV29yZFNwYWNlID0gIWJEZWZhdWx0Ow0KLSAgICBtX2lXb3JkU3BhY2UgPSBGWFNZU19yb3VuZChmV29yZFNwYWNlICogMjAwMDAuMGYpOw0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRDaGFyUm90YXRpb24oaW50MzJfdCBpQ2hhclJvdGF0aW9uKSB7DQorICBpZiAoaUNoYXJSb3RhdGlvbiA8IDApIHsNCisgICAgaUNoYXJSb3RhdGlvbiArPSAoLWlDaGFyUm90YXRpb24gLyA0ICsgMSkgKiA0Ow0KKyAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID4gMykgew0KKyAgICBpQ2hhclJvdGF0aW9uIC09IChpQ2hhclJvdGF0aW9uIC8gNCkgKiA0Ow0KKyAgfQ0KKyAgaWYgKG1faUNoYXJSb3RhdGlvbiA9PSBpQ2hhclJvdGF0aW9uKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFNldEJyZWFrU3RhdHVzKCk7DQorICBtX2lDaGFyUm90YXRpb24gPSBpQ2hhclJvdGF0aW9uOw0KKyAgbV9pUm90YXRpb24gPSBtX2lMaW5lUm90YXRpb24gKyBtX2lDaGFyUm90YXRpb247DQorICBtX2lSb3RhdGlvbiAlPSA0Ow0KIH0NCi12b2lkIENGWF9SVEZCcmVhazo6U2V0UmVhZGluZ09yZGVyKEZYX0JPT0wgYlJUTCkNCi17DQotICAgIG1fYlJUTCA9IGJSVEw7DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSB7DQorICBtX2lDaGFyU3BhY2UgPSBGWFNZU19yb3VuZChmQ2hhclNwYWNlICogMjAwMDAuMGYpOw0KIH0NCi12b2lkIENGWF9SVEZCcmVhazo6U2V0QWxpZ25tZW50KGludDMyX3QgaUFsaWdubWVudCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChpQWxpZ25tZW50ID49IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCAmJiBpQWxpZ25tZW50IDw9IEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQpOw0KLSAgICBtX2lBbGlnbm1lbnQgPSBpQWxpZ25tZW50Ow0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRXb3JkU3BhY2UoRlhfQk9PTCBiRGVmYXVsdCwgRlhfRkxPQVQgZldvcmRTcGFjZSkgew0KKyAgbV9iV29yZFNwYWNlID0gIWJEZWZhdWx0Ow0KKyAgbV9pV29yZFNwYWNlID0gRlhTWVNfcm91bmQoZldvcmRTcGFjZSAqIDIwMDAwLjBmKTsNCiB9DQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldFVzZXJEYXRhKElGWF9Vbmtub3duICpwVXNlckRhdGEpDQotew0KLSAgICBpZiAobV9wVXNlckRhdGEgPT0gcFVzZXJEYXRhKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgU2V0QnJlYWtTdGF0dXMoKTsNCi0gICAgaWYgKG1fcFVzZXJEYXRhICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcFVzZXJEYXRhLT5SZWxlYXNlKCk7DQotICAgIH0NCi0gICAgbV9wVXNlckRhdGEgPSBwVXNlckRhdGE7DQotICAgIGlmIChtX3BVc2VyRGF0YSAhPSBOVUxMKSB7DQotICAgICAgICBtX3BVc2VyRGF0YS0+QWRkUmVmKCk7DQotICAgIH0NCit2b2lkIENGWF9SVEZCcmVhazo6U2V0UmVhZGluZ09yZGVyKEZYX0JPT0wgYlJUTCkgew0KKyAgbV9iUlRMID0gYlJUTDsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldEFsaWdubWVudChpbnQzMl90IGlBbGlnbm1lbnQpIHsNCisgIEZYU1lTX2Fzc2VydChpQWxpZ25tZW50ID49IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCAmJg0KKyAgICAgICAgICAgICAgIGlBbGlnbm1lbnQgPD0gRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCk7DQorICBtX2lBbGlnbm1lbnQgPSBpQWxpZ25tZW50Ow0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6U2V0VXNlckRhdGEoSUZYX1Vua25vd24qIHBVc2VyRGF0YSkgew0KKyAgaWYgKG1fcFVzZXJEYXRhID09IHBVc2VyRGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBTZXRCcmVha1N0YXR1cygpOw0KKyAgaWYgKG1fcFVzZXJEYXRhICE9IE5VTEwpIHsNCisgICAgbV9wVXNlckRhdGEtPlJlbGVhc2UoKTsNCisgIH0NCisgIG1fcFVzZXJEYXRhID0gcFVzZXJEYXRhOw0KKyAgaWYgKG1fcFVzZXJEYXRhICE9IE5VTEwpIHsNCisgICAgbV9wVXNlckRhdGEtPkFkZFJlZigpOw0KKyAgfQ0KIH0NCiBzdGF0aWMgY29uc3QgaW50MzJfdCBnc19GWF9SVEZMaW5lUm90YXRpb25zWzhdID0gezAsIDMsIDEsIDAsIDIsIDEsIDMsIDJ9Ow0KLWludDMyX3QgQ0ZYX1JURkJyZWFrOjpHZXRMaW5lUm90YXRpb24oRlhfRFdPUkQgZHdTdHlsZXMpIGNvbnN0DQotew0KLSAgICByZXR1cm4gZ3NfRlhfUlRGTGluZVJvdGF0aW9uc1soZHdTdHlsZXMgJiAweDBFKSA+PiAxXTsNCitpbnQzMl90IENGWF9SVEZCcmVhazo6R2V0TGluZVJvdGF0aW9uKEZYX0RXT1JEIGR3U3R5bGVzKSBjb25zdCB7DQorICByZXR1cm4gZ3NfRlhfUlRGTGluZVJvdGF0aW9uc1soZHdTdHlsZXMgJiAweDBFKSA+PiAxXTsNCiB9DQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldEJyZWFrU3RhdHVzKCkNCi17DQotICAgIG1fZHdJZGVudGl0eSArKzsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQotICAgIGlmIChpQ291bnQgPCAxKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1JURkNoYXIgJnRjID0gbV9wQ3VyTGluZS0+R2V0Q2hhcihpQ291bnQgLSAxKTsNCi0gICAgaWYgKHRjLm1fZHdTdGF0dXMgPT0gMCkgew0KLSAgICAgICAgdGMubV9kd1N0YXR1cyA9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWs7DQotICAgIH0NCit2b2lkIENGWF9SVEZCcmVhazo6U2V0QnJlYWtTdGF0dXMoKSB7DQorICBtX2R3SWRlbnRpdHkrKzsNCisgIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1JURkNoYXImIHRjID0gbV9wQ3VyTGluZS0+R2V0Q2hhcihpQ291bnQgLSAxKTsNCisgIGlmICh0Yy5tX2R3U3RhdHVzID09IDApIHsNCisgICAgdGMubV9kd1N0YXR1cyA9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWs7DQorICB9DQogfQ0KLUNGWF9SVEZDaGFyKiBDRlhfUlRGQnJlYWs6OkdldExhc3RDaGFyKGludDMyX3QgaW5kZXgpIGNvbnN0DQotew0KLSAgICBDRlhfUlRGQ2hhckFycmF5ICZ0Y2EgPSBtX3BDdXJMaW5lLT5tX0xpbmVDaGFyczsNCi0gICAgaW50MzJfdCBpQ291bnQgPSB0Y2EuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGlDb3VudCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0ZYX1JURkNoYXIgKnBUQzsNCi0gICAgaW50MzJfdCBpU3RhcnQgPSBpQ291bnQgLSAxOw0KLSAgICB3aGlsZSAoaVN0YXJ0ID4gLTEpIHsNCi0gICAgICAgIHBUQyA9IHRjYS5HZXREYXRhUHRyKGlTdGFydCAtLSk7DQotICAgICAgICBpZiAocFRDLT5tX2lDaGFyV2lkdGggPj0gMCB8fCBwVEMtPkdldENoYXJUeXBlKCkgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCi0gICAgICAgICAgICBpZiAoLS1pbmRleCA8IDApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBUQzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCitDRlhfUlRGQ2hhciogQ0ZYX1JURkJyZWFrOjpHZXRMYXN0Q2hhcihpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICBDRlhfUlRGQ2hhckFycmF5JiB0Y2EgPSBtX3BDdXJMaW5lLT5tX0xpbmVDaGFyczsNCisgIGludDMyX3QgaUNvdW50ID0gdGNhLkdldFNpemUoKTsNCisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaUNvdW50KSB7DQogICAgIHJldHVybiBOVUxMOw0KLX0NCi1DRlhfUlRGTGluZSogQ0ZYX1JURkJyZWFrOjpHZXRSVEZMaW5lKEZYX0JPT0wgYlJlYWR5KSBjb25zdA0KLXsNCi0gICAgaWYgKGJSZWFkeSkgew0KLSAgICAgICAgaWYgKG1faVJlYWR5ID09IDEpIHsNCi0gICAgICAgICAgICByZXR1cm4gKENGWF9SVEZMaW5lKikmbV9SVEZMaW5lMTsNCi0gICAgICAgIH0gZWxzZSBpZiAobV9pUmVhZHkgPT0gMikgew0KLSAgICAgICAgICAgIHJldHVybiAoQ0ZYX1JURkxpbmUqKSZtX1JURkxpbmUyOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCisgIH0NCisgIENGWF9SVEZDaGFyKiBwVEM7DQorICBpbnQzMl90IGlTdGFydCA9IGlDb3VudCAtIDE7DQorICB3aGlsZSAoaVN0YXJ0ID4gLTEpIHsNCisgICAgcFRDID0gdGNhLkdldERhdGFQdHIoaVN0YXJ0LS0pOw0KKyAgICBpZiAocFRDLT5tX2lDaGFyV2lkdGggPj0gMCB8fA0KKyAgICAgICAgcFRDLT5HZXRDaGFyVHlwZSgpICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQorICAgICAgaWYgKC0taW5kZXggPCAwKSB7DQorICAgICAgICByZXR1cm4gcFRDOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGWFNZU19hc3NlcnQobV9wQ3VyTGluZSAhPSBOVUxMKTsNCi0gICAgcmV0dXJuIG1fcEN1ckxpbmU7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotQ0ZYX1JURlBpZWNlQXJyYXkqIENGWF9SVEZCcmVhazo6R2V0UlRGUGllY2VzKEZYX0JPT0wgYlJlYWR5KSBjb25zdA0KLXsNCi0gICAgQ0ZYX1JURkxpbmUgKnBSVEZMaW5lID0gR2V0UlRGTGluZShiUmVhZHkpOw0KLSAgICBpZiAocFJURkxpbmUgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQorQ0ZYX1JURkxpbmUqIENGWF9SVEZCcmVhazo6R2V0UlRGTGluZShGWF9CT09MIGJSZWFkeSkgY29uc3Qgew0KKyAgaWYgKGJSZWFkeSkgew0KKyAgICBpZiAobV9pUmVhZHkgPT0gMSkgew0KKyAgICAgIHJldHVybiAoQ0ZYX1JURkxpbmUqKSZtX1JURkxpbmUxOw0KKyAgICB9IGVsc2UgaWYgKG1faVJlYWR5ID09IDIpIHsNCisgICAgICByZXR1cm4gKENGWF9SVEZMaW5lKikmbV9SVEZMaW5lMjsNCisgICAgfSBlbHNlIHsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICByZXR1cm4gJnBSVEZMaW5lLT5tX0xpbmVQaWVjZXM7DQorICB9DQorICBGWFNZU19hc3NlcnQobV9wQ3VyTGluZSAhPSBOVUxMKTsNCisgIHJldHVybiBtX3BDdXJMaW5lOw0KIH0NCi1pbmxpbmUgRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpHZXRVbmlmaWVkQ2hhclR5cGUoRlhfRFdPUkQgZHdUeXBlKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIGR3VHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmID8gRlhfQ0hBUlRZUEVfQXJhYmljIDogZHdUeXBlOw0KK0NGWF9SVEZQaWVjZUFycmF5KiBDRlhfUlRGQnJlYWs6OkdldFJURlBpZWNlcyhGWF9CT09MIGJSZWFkeSkgY29uc3Qgew0KKyAgQ0ZYX1JURkxpbmUqIHBSVEZMaW5lID0gR2V0UlRGTGluZShiUmVhZHkpOw0KKyAgaWYgKHBSVEZMaW5lID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gJnBSVEZMaW5lLT5tX0xpbmVQaWVjZXM7DQogfQ0KLWludDMyX3QgQ0ZYX1JURkJyZWFrOjpHZXRMYXN0UG9zaXRpb25lZFRhYigpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fUG9zaXRpb25lZFRhYnMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaUNvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIG1faUxpbmVTdGFydDsNCitpbmxpbmUgRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpHZXRVbmlmaWVkQ2hhclR5cGUoRlhfRFdPUkQgZHdUeXBlKSBjb25zdCB7DQorICByZXR1cm4gZHdUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgPyBGWF9DSEFSVFlQRV9BcmFiaWMgOiBkd1R5cGU7DQorfQ0KK2ludDMyX3QgQ0ZYX1JURkJyZWFrOjpHZXRMYXN0UG9zaXRpb25lZFRhYigpIGNvbnN0IHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9Qb3NpdGlvbmVkVGFicy5HZXRTaXplKCk7DQorICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICByZXR1cm4gbV9pTGluZVN0YXJ0Ow0KKyAgfQ0KKyAgcmV0dXJuIG1fUG9zaXRpb25lZFRhYnNbaUNvdW50IC0gMV07DQorfQ0KK0ZYX0JPT0wgQ0ZYX1JURkJyZWFrOjpHZXRQb3NpdGlvbmVkVGFiKGludDMyX3QmIGlUYWJQb3MpIGNvbnN0IHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9Qb3NpdGlvbmVkVGFicy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBpZiAobV9Qb3NpdGlvbmVkVGFic1tpXSA+IGlUYWJQb3MpIHsNCisgICAgICBpVGFiUG9zID0gbV9Qb3NpdGlvbmVkVGFic1tpXTsNCisgICAgICByZXR1cm4gVFJVRTsNCiAgICAgfQ0KLSAgICByZXR1cm4gbV9Qb3NpdGlvbmVkVGFic1tpQ291bnQgLSAxXTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDRlhfUlRGQnJlYWs6OkdldFBvc2l0aW9uZWRUYWIoaW50MzJfdCAmaVRhYlBvcykgY29uc3QNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9Qb3NpdGlvbmVkVGFicy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgaWYgKG1fUG9zaXRpb25lZFRhYnNbaV0gPiBpVGFiUG9zKSB7DQotICAgICAgICAgICAgaVRhYlBvcyA9IG1fUG9zaXRpb25lZFRhYnNbaV07DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi10eXBlZGVmIEZYX0RXT1JEIChDRlhfUlRGQnJlYWs6OipGWF9SVEZCcmVha19MUEZBcHBlbmRDaGFyKShDRlhfUlRGQ2hhciAqcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsNCit0eXBlZGVmIEZYX0RXT1JEIChDRlhfUlRGQnJlYWs6OipGWF9SVEZCcmVha19MUEZBcHBlbmRDaGFyKSgNCisgICAgQ0ZYX1JURkNoYXIqIHBDdXJDaGFyLA0KKyAgICBpbnQzMl90IGlSb3RhdGlvbik7DQogc3RhdGljIGNvbnN0IEZYX1JURkJyZWFrX0xQRkFwcGVuZENoYXIgZ19GWF9SVEZCcmVha19scGZBcHBlbmRDaGFyWzE2XSA9IHsNCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQotICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfVGFiLA0KLSAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9Db250cm9sLA0KLSAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0NvbWJpbmF0aW9uLA0KLSAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQotICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KLSAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQotICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KLSAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQotICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLA0KLSAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQorICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLCAgICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfVGFiLA0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywgICAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0NvbnRyb2wsDQorICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQ29tYmluYXRpb24sICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLA0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywgICAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCisgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsICAgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQorICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLCAgICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywgICAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCisgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsICAgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQogfTsNCi1GWF9EV09SRCBDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCAmJiBtX3BDdXJMaW5lICE9IE5VTEwgJiYgbV9wQXJhYmljQ2hhciAhPSBOVUxMKTsNCi0gICAgaWYgKG1fYkNoYXJDb2RlKSB7DQotICAgICAgICByZXR1cm4gQXBwZW5kQ2hhcl9DaGFyQ29kZSh3Y2gpOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3UHJvcHMgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07DQotICAgIEZYX0RXT1JEIGR3VHlwZSA9IChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7DQotICAgIENGWF9SVEZDaGFyQXJyYXkgJnRjYSA9IG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOw0KLSAgICBDRlhfUlRGQ2hhciAqcEN1ckNoYXIgPSB0Y2EuQWRkU3BhY2UoKTsNCi0gICAgcEN1ckNoYXItPm1fZHdTdGF0dXMgPSAwOw0KLSAgICBwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPSB3Y2g7DQotICAgIHBDdXJDaGFyLT5tX2R3Q2hhclByb3BzID0gZHdQcm9wczsNCi0gICAgcEN1ckNoYXItPm1fZHdDaGFyU3R5bGVzID0gMDsNCi0gICAgcEN1ckNoYXItPm1fZHdMYXlvdXRTdHlsZXMgPSAwOw0KLSAgICBwQ3VyQ2hhci0+bV9pRm9udFNpemUgPSBtX2lGb250U2l6ZTsNCi0gICAgcEN1ckNoYXItPm1faUZvbnRIZWlnaHQgPSBtX2lGb250SGVpZ2h0Ow0KLSAgICBwQ3VyQ2hhci0+bV9pSG9yaXpvbnRhbFNjYWxlID0gbV9pSG9yaXpvbnRhbFNjYWxlOw0KLSAgICBwQ3VyQ2hhci0+bV9pVmVydGlhbFNjYWxlID0gbV9pVmVydGljYWxTY2FsZTsNCi0gICAgcEN1ckNoYXItPm1fblJvdGF0aW9uID0gbV9pQ2hhclJvdGF0aW9uOw0KLSAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gMDsNCi0gICAgcEN1ckNoYXItPm1fZHdJZGVudGl0eSA9IG1fZHdJZGVudGl0eTsNCi0gICAgaWYgKG1fcFVzZXJEYXRhICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcFVzZXJEYXRhLT5BZGRSZWYoKTsNCi0gICAgfQ0KLSAgICBwQ3VyQ2hhci0+bV9wVXNlckRhdGEgPSBtX3BVc2VyRGF0YTsNCi0gICAgRlhfRFdPUkQgZHdSZXQxID0gRlhfUlRGQlJFQUtfTm9uZTsNCi0gICAgaWYgKGR3VHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbiAmJiBHZXRVbmlmaWVkQ2hhclR5cGUobV9kd0NoYXJUeXBlKSAhPSBHZXRVbmlmaWVkQ2hhclR5cGUoZHdUeXBlKSkgew0KLSAgICAgICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmICFtX2JPcnBoYW5MaW5lICYmIG1fZHdDaGFyVHlwZSA+IDAgJiYgbV9wQ3VyTGluZS0+R2V0TGluZUVuZCgpID4gbV9pTGluZUVuZCArIG1faVRvbGVyYW5jZSkgew0KLSAgICAgICAgICAgIGlmIChtX2R3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfU3BhY2UgfHwgZHdUeXBlICE9IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsNCi0gICAgICAgICAgICAgICAgZHdSZXQxID0gRW5kQnJlYWsoRlhfUlRGQlJFQUtfTGluZUJyZWFrKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQotICAgICAgICAgICAgICAgIGlmIChpQ291bnQgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBwQ3VyQ2hhciA9IG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzLkdldERhdGFQdHIoaUNvdW50IC0gMSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCAmJiBtX3BDdXJMaW5lICE9IE5VTEwgJiYgbV9wQXJhYmljQ2hhciAhPSBOVUxMKTsNCisgIGlmIChtX2JDaGFyQ29kZSkgew0KKyAgICByZXR1cm4gQXBwZW5kQ2hhcl9DaGFyQ29kZSh3Y2gpOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdQcm9wcyA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsNCisgIEZYX0RXT1JEIGR3VHlwZSA9IChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7DQorICBDRlhfUlRGQ2hhckFycmF5JiB0Y2EgPSBtX3BDdXJMaW5lLT5tX0xpbmVDaGFyczsNCisgIENGWF9SVEZDaGFyKiBwQ3VyQ2hhciA9IHRjYS5BZGRTcGFjZSgpOw0KKyAgcEN1ckNoYXItPm1fZHdTdGF0dXMgPSAwOw0KKyAgcEN1ckNoYXItPm1fd0NoYXJDb2RlID0gd2NoOw0KKyAgcEN1ckNoYXItPm1fZHdDaGFyUHJvcHMgPSBkd1Byb3BzOw0KKyAgcEN1ckNoYXItPm1fZHdDaGFyU3R5bGVzID0gMDsNCisgIHBDdXJDaGFyLT5tX2R3TGF5b3V0U3R5bGVzID0gMDsNCisgIHBDdXJDaGFyLT5tX2lGb250U2l6ZSA9IG1faUZvbnRTaXplOw0KKyAgcEN1ckNoYXItPm1faUZvbnRIZWlnaHQgPSBtX2lGb250SGVpZ2h0Ow0KKyAgcEN1ckNoYXItPm1faUhvcml6b250YWxTY2FsZSA9IG1faUhvcml6b250YWxTY2FsZTsNCisgIHBDdXJDaGFyLT5tX2lWZXJ0aWFsU2NhbGUgPSBtX2lWZXJ0aWNhbFNjYWxlOw0KKyAgcEN1ckNoYXItPm1fblJvdGF0aW9uID0gbV9pQ2hhclJvdGF0aW9uOw0KKyAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IDA7DQorICBwQ3VyQ2hhci0+bV9kd0lkZW50aXR5ID0gbV9kd0lkZW50aXR5Ow0KKyAgaWYgKG1fcFVzZXJEYXRhICE9IE5VTEwpIHsNCisgICAgbV9wVXNlckRhdGEtPkFkZFJlZigpOw0KKyAgfQ0KKyAgcEN1ckNoYXItPm1fcFVzZXJEYXRhID0gbV9wVXNlckRhdGE7DQorICBGWF9EV09SRCBkd1JldDEgPSBGWF9SVEZCUkVBS19Ob25lOw0KKyAgaWYgKGR3VHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbiAmJg0KKyAgICAgIEdldFVuaWZpZWRDaGFyVHlwZShtX2R3Q2hhclR5cGUpICE9IEdldFVuaWZpZWRDaGFyVHlwZShkd1R5cGUpKSB7DQorICAgIGlmICghbV9iU2luZ2xlTGluZSAmJiAhbV9iT3JwaGFuTGluZSAmJiBtX2R3Q2hhclR5cGUgPiAwICYmDQorICAgICAgICBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lMaW5lRW5kICsgbV9pVG9sZXJhbmNlKSB7DQorICAgICAgaWYgKG1fZHdDaGFyVHlwZSAhPSBGWF9DSEFSVFlQRV9TcGFjZSB8fCBkd1R5cGUgIT0gRlhfQ0hBUlRZUEVfQ29udHJvbCkgew0KKyAgICAgICAgZHdSZXQxID0gRW5kQnJlYWsoRlhfUlRGQlJFQUtfTGluZUJyZWFrKTsNCisgICAgICAgIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgICAgICAgaWYgKGlDb3VudCA+IDApIHsNCisgICAgICAgICAgcEN1ckNoYXIgPSBtX3BDdXJMaW5lLT5tX0xpbmVDaGFycy5HZXREYXRhUHRyKGlDb3VudCAtIDEpOw0KICAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpbnQzMl90IGlSb3RhdGlvbiA9IG1faVJvdGF0aW9uOw0KLSAgICBpZiAobV9iVmVydGljYWwgJiYgKGR3UHJvcHMgJiAweDgwMDApICE9IDApIHsNCi0gICAgICAgIGlSb3RhdGlvbiA9IChpUm90YXRpb24gKyAxKSAlIDQ7DQotICAgIH0NCi0gICAgRlhfRFdPUkQgZHdSZXQyID0gKHRoaXMtPipnX0ZYX1JURkJyZWFrX2xwZkFwcGVuZENoYXJbZHdUeXBlID4+IEZYX0NIQVJUWVBFQklUU10pKHBDdXJDaGFyLCBpUm90YXRpb24pOw0KLSAgICBtX2R3Q2hhclR5cGUgPSBkd1R5cGU7DQotICAgIHJldHVybiBGWF9NQVgoZHdSZXQxLCBkd1JldDIpOw0KKyAgfQ0KKyAgaW50MzJfdCBpUm90YXRpb24gPSBtX2lSb3RhdGlvbjsNCisgIGlmIChtX2JWZXJ0aWNhbCAmJiAoZHdQcm9wcyAmIDB4ODAwMCkgIT0gMCkgew0KKyAgICBpUm90YXRpb24gPSAoaVJvdGF0aW9uICsgMSkgJSA0Ow0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdSZXQyID0NCisgICAgICAodGhpcy0+KmdfRlhfUlRGQnJlYWtfbHBmQXBwZW5kQ2hhcltkd1R5cGUgPj4gRlhfQ0hBUlRZUEVCSVRTXSkoDQorICAgICAgICAgIHBDdXJDaGFyLCBpUm90YXRpb24pOw0KKyAgbV9kd0NoYXJUeXBlID0gZHdUeXBlOw0KKyAgcmV0dXJuIEZYX01BWChkd1JldDEsIGR3UmV0Mik7DQogfQ0KLUZYX0RXT1JEIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9DaGFyQ29kZShGWF9XQ0hBUiB3Y2gpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wRm9udCAhPSBOVUxMICYmIG1fcEN1ckxpbmUgIT0gTlVMTCk7DQotICAgIEZYU1lTX2Fzc2VydChtX2JDaGFyQ29kZSk7DQotICAgIG1fcEN1ckxpbmUtPm1faU1CQ1NDaGFycyArKzsNCi0gICAgQ0ZYX1JURkNoYXJBcnJheSAmdGNhID0gbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnM7DQotICAgIENGWF9SVEZDaGFyICpwQ3VyQ2hhciA9IHRjYS5BZGRTcGFjZSgpOw0KLSAgICBwQ3VyQ2hhci0+bV9kd1N0YXR1cyA9IDA7DQotICAgIHBDdXJDaGFyLT5tX3dDaGFyQ29kZSA9IHdjaDsNCi0gICAgcEN1ckNoYXItPm1fZHdDaGFyUHJvcHMgPSAwOw0KLSAgICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgPSAwOw0KLSAgICBwQ3VyQ2hhci0+bV9kd0xheW91dFN0eWxlcyA9IG1fZHdMYXlvdXRTdHlsZXM7DQotICAgIHBDdXJDaGFyLT5tX2lGb250U2l6ZSA9IG1faUZvbnRTaXplOw0KLSAgICBwQ3VyQ2hhci0+bV9pRm9udEhlaWdodCA9IG1faUZvbnRIZWlnaHQ7DQotICAgIHBDdXJDaGFyLT5tX2lIb3Jpem9udGFsU2NhbGUgPSBtX2lIb3Jpem9udGFsU2NhbGU7DQotICAgIHBDdXJDaGFyLT5tX2lWZXJ0aWFsU2NhbGUgPSBtX2lWZXJ0aWNhbFNjYWxlOw0KLSAgICBwQ3VyQ2hhci0+bV9uUm90YXRpb24gPSBtX2lDaGFyUm90YXRpb247DQotICAgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSAwOw0KLSAgICBwQ3VyQ2hhci0+bV9kd0lkZW50aXR5ID0gbV9kd0lkZW50aXR5Ow0KLSAgICBpZiAobV9wVXNlckRhdGEgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wVXNlckRhdGEtPkFkZFJlZigpOw0KK0ZYX0RXT1JEIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9DaGFyQ29kZShGWF9XQ0hBUiB3Y2gpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BGb250ICE9IE5VTEwgJiYgbV9wQ3VyTGluZSAhPSBOVUxMKTsNCisgIEZYU1lTX2Fzc2VydChtX2JDaGFyQ29kZSk7DQorICBtX3BDdXJMaW5lLT5tX2lNQkNTQ2hhcnMrKzsNCisgIENGWF9SVEZDaGFyQXJyYXkmIHRjYSA9IG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOw0KKyAgQ0ZYX1JURkNoYXIqIHBDdXJDaGFyID0gdGNhLkFkZFNwYWNlKCk7DQorICBwQ3VyQ2hhci0+bV9kd1N0YXR1cyA9IDA7DQorICBwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPSB3Y2g7DQorICBwQ3VyQ2hhci0+bV9kd0NoYXJQcm9wcyA9IDA7DQorICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgPSAwOw0KKyAgcEN1ckNoYXItPm1fZHdMYXlvdXRTdHlsZXMgPSBtX2R3TGF5b3V0U3R5bGVzOw0KKyAgcEN1ckNoYXItPm1faUZvbnRTaXplID0gbV9pRm9udFNpemU7DQorICBwQ3VyQ2hhci0+bV9pRm9udEhlaWdodCA9IG1faUZvbnRIZWlnaHQ7DQorICBwQ3VyQ2hhci0+bV9pSG9yaXpvbnRhbFNjYWxlID0gbV9pSG9yaXpvbnRhbFNjYWxlOw0KKyAgcEN1ckNoYXItPm1faVZlcnRpYWxTY2FsZSA9IG1faVZlcnRpY2FsU2NhbGU7DQorICBwQ3VyQ2hhci0+bV9uUm90YXRpb24gPSBtX2lDaGFyUm90YXRpb247DQorICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gMDsNCisgIHBDdXJDaGFyLT5tX2R3SWRlbnRpdHkgPSBtX2R3SWRlbnRpdHk7DQorICBpZiAobV9wVXNlckRhdGEgIT0gTlVMTCkgew0KKyAgICBtX3BVc2VyRGF0YS0+QWRkUmVmKCk7DQorICB9DQorICBwQ3VyQ2hhci0+bV9wVXNlckRhdGEgPSBtX3BVc2VyRGF0YTsNCisgIGludDMyX3QgaUNoYXJXaWR0aCA9IDA7DQorICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQobV9pUm90YXRpb24pKSB7DQorICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod2NoLCBpQ2hhcldpZHRoLCBUUlVFKSkgew0KKyAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KICAgICB9DQotICAgIHBDdXJDaGFyLT5tX3BVc2VyRGF0YSA9IG1fcFVzZXJEYXRhOw0KLSAgICBpbnQzMl90IGlDaGFyV2lkdGggPSAwOw0KLSAgICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQobV9pUm90YXRpb24pKSB7DQotICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdjaCwgaUNoYXJXaWR0aCwgVFJVRSkpIHsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsNCi0gICAgICAgIH0NCisgIH0NCisgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsNCisgIGlDaGFyV2lkdGggKz0gbV9pQ2hhclNwYWNlOw0KKyAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQorICBtX3BDdXJMaW5lLT5tX2lXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgbV9kd0NoYXJUeXBlID0gMDsNCisgIGlmICghbV9iU2luZ2xlTGluZSAmJiBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lMaW5lRW5kICsgbV9pVG9sZXJhbmNlKSB7DQorICAgIHJldHVybiBFbmRCcmVhayhGWF9SVEZCUkVBS19MaW5lQnJlYWspOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX1JURkJSRUFLX05vbmU7DQorfQ0KK0ZYX0RXT1JEIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9Db21iaW5hdGlvbihDRlhfUlRGQ2hhciogcEN1ckNoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0aW9uKSB7DQorICBpbnQzMl90IGlDaGFyV2lkdGggPSAwOw0KKyAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlSb3RhdGlvbikpIHsNCisgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQorICB9IGVsc2Ugew0KKyAgICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aChwQ3VyQ2hhci0+bV93Q2hhckNvZGUsIGlDaGFyV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkNoYXJDb2RlKSkgew0KKyAgICAgIGlDaGFyV2lkdGggPSAwOw0KICAgICB9DQotICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQotICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yaXpvbnRhbFNjYWxlIC8gMTAwOw0KLSAgICBpQ2hhcldpZHRoICs9IG1faUNoYXJTcGFjZTsNCi0gICAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQorICB9DQorICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOw0KKyAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3Jpem9udGFsU2NhbGUgLyAxMDA7DQorICBDRlhfUlRGQ2hhciogcExhc3RDaGFyID0gR2V0TGFzdENoYXIoMCk7DQorICBpZiAocExhc3RDaGFyICE9IE5VTEwgJiYgcExhc3RDaGFyLT5HZXRDaGFyVHlwZSgpID4gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgaUNoYXJXaWR0aCA9IC1pQ2hhcldpZHRoOw0KKyAgfSBlbHNlIHsNCisgICAgbV9kd0NoYXJUeXBlID0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb247DQorICB9DQorICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KICAgICBtX3BDdXJMaW5lLT5tX2lXaWR0aCArPSBpQ2hhcldpZHRoOw0KLSAgICBtX2R3Q2hhclR5cGUgPSAwOw0KLSAgICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgbV9wQ3VyTGluZS0+R2V0TGluZUVuZCgpID4gbV9pTGluZUVuZCArIG1faVRvbGVyYW5jZSkgew0KLSAgICAgICAgcmV0dXJuIEVuZEJyZWFrKEZYX1JURkJSRUFLX0xpbmVCcmVhayk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZYX1JURkJSRUFLX05vbmU7DQorICB9DQorICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCiB9DQotRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0NvbWJpbmF0aW9uKENGWF9SVEZDaGFyICpwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pDQotew0KLSAgICBpbnQzMl90IGlDaGFyV2lkdGggPSAwOw0KLSAgICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQoaVJvdGF0aW9uKSkgew0KLSAgICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX1RhYihDRlhfUlRGQ2hhciogcEN1ckNoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGlvbikgew0KKyAgaWYgKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9FeHBhbmRUYWIpIHsNCisgICAgRlhfQk9PTCBiQnJlYWsgPSBGQUxTRTsNCisgICAgaWYgKChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9UYWJCcmVhaykgIT0gMCkgew0KKyAgICAgIGJCcmVhayA9IChtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lMaW5lRW5kICsgbV9pVG9sZXJhbmNlKTsNCisgICAgfQ0KKyAgICBpbnQzMl90JiBpTGluZVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQorICAgIGludDMyX3QgaUNoYXJXaWR0aCA9IGlMaW5lV2lkdGg7DQorICAgIGlmIChHZXRQb3NpdGlvbmVkVGFiKGlDaGFyV2lkdGgpKSB7DQorICAgICAgaUNoYXJXaWR0aCAtPSBpTGluZVdpZHRoOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgocEN1ckNoYXItPm1fd0NoYXJDb2RlLCBpQ2hhcldpZHRoLCBtX2JDaGFyQ29kZSkpIHsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gMDsNCi0gICAgICAgIH0NCisgICAgICBpQ2hhcldpZHRoID0gbV9pVGFiV2lkdGggKiAoaUxpbmVXaWR0aCAvIG1faVRhYldpZHRoICsgMSkgLSBpTGluZVdpZHRoOw0KICAgICB9DQotICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQotICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yaXpvbnRhbFNjYWxlIC8gMTAwOw0KLSAgICBDRlhfUlRGQ2hhciAqcExhc3RDaGFyID0gR2V0TGFzdENoYXIoMCk7DQotICAgIGlmIChwTGFzdENoYXIgIT0gTlVMTCAmJiBwTGFzdENoYXItPkdldENoYXJUeXBlKCkgPiBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KLSAgICAgICAgaUNoYXJXaWR0aCA9IC1pQ2hhcldpZHRoOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9kd0NoYXJUeXBlID0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb247DQotICAgIH0NCi0gICAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQotICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KLSAgICAgICAgbV9wQ3VyTGluZS0+bV9pV2lkdGggKz0gaUNoYXJXaWR0aDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCi19DQotRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX1RhYihDRlhfUlRGQ2hhciAqcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKQ0KLXsNCi0gICAgaWYgKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9FeHBhbmRUYWIpIHsNCi0gICAgICAgIEZYX0JPT0wgYkJyZWFrID0gRkFMU0U7DQotICAgICAgICBpZiAoKG1fZHdQb2xpY2llcyAmIEZYX1JURkJSRUFLUE9MSUNZX1RhYkJyZWFrKSAhPSAwKSB7DQotICAgICAgICAgICAgYkJyZWFrID0gKG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUxpbmVFbmQgKyBtX2lUb2xlcmFuY2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCAmaUxpbmVXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KLSAgICAgICAgaW50MzJfdCBpQ2hhcldpZHRoID0gaUxpbmVXaWR0aDsNCi0gICAgICAgIGlmIChHZXRQb3NpdGlvbmVkVGFiKGlDaGFyV2lkdGgpKSB7DQotICAgICAgICAgICAgaUNoYXJXaWR0aCAtPSBpTGluZVdpZHRoOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pVGFiV2lkdGggKiAoaUxpbmVXaWR0aCAvIG1faVRhYldpZHRoICsgMSkgLSBpTGluZVdpZHRoOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQotICAgICAgICBpTGluZVdpZHRoICs9IGlDaGFyV2lkdGg7DQotICAgICAgICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgIW1fYk9ycGhhbkxpbmUgJiYgYkJyZWFrKSB7DQotICAgICAgICAgICAgcmV0dXJuIEVuZEJyZWFrKEZYX1JURkJSRUFLX0xpbmVCcmVhayk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZYX1JURkJSRUFLX05vbmU7DQotfQ0KLUZYX0RXT1JEIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9Db250cm9sKENGWF9SVEZDaGFyICpwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pDQotew0KLSAgICBGWF9EV09SRCBkd1JldDIgPSBGWF9SVEZCUkVBS19Ob25lOw0KLSAgICBpZiAoIW1fYlNpbmdsZUxpbmUpIHsNCi0gICAgICAgIHN3aXRjaCAocEN1ckNoYXItPm1fd0NoYXJDb2RlKSB7DQotICAgICAgICAgICAgY2FzZSBMJ1x2JzoNCi0gICAgICAgICAgICBjYXNlIDB4MjAyODoNCi0gICAgICAgICAgICAgICAgZHdSZXQyID0gRlhfUlRGQlJFQUtfTGluZUJyZWFrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEwnXGYnOg0KLSAgICAgICAgICAgICAgICBkd1JldDIgPSBGWF9SVEZCUkVBS19QYWdlQnJlYWs7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgMHgyMDI5Og0KLSAgICAgICAgICAgICAgICBkd1JldDIgPSBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhazsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgaWYgKHBDdXJDaGFyLT5tX3dDaGFyQ29kZSA9PSBtX3dMaW5lQnJlYWtDaGFyKSB7DQotICAgICAgICAgICAgICAgICAgICBkd1JldDIgPSBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChkd1JldDIgIT0gRlhfUlRGQlJFQUtfTm9uZSkgew0KLSAgICAgICAgICAgIGR3UmV0MiA9IEVuZEJyZWFrKGR3UmV0Mik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGR3UmV0MjsNCi19DQotRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYyhDRlhfUlRGQ2hhciAqcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKQ0KLXsNCi0gICAgQ0ZYX1JURkNoYXIgKnBMYXN0Q2hhciA9IE5VTEw7DQotICAgIGludDMyX3QgJmlMaW5lV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsNCi0gICAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsNCi0gICAgRlhfV0NIQVIgd0Zvcm07DQotICAgIEZYX0JPT0wgYkFsZWYgPSBGQUxTRTsNCi0gICAgaWYgKG1fZHdDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmIG1fZHdDaGFyVHlwZSA8PSBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uKSB7DQotICAgICAgICBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigxKTsNCi0gICAgICAgIGlmIChwTGFzdENoYXIgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGlMaW5lV2lkdGggLT0gcExhc3RDaGFyLT5tX2lDaGFyV2lkdGg7DQotICAgICAgICAgICAgQ0ZYX1JURkNoYXIgKnBQcmV2Q2hhciA9IEdldExhc3RDaGFyKDIpOw0KLSAgICAgICAgICAgIHdGb3JtID0gbV9wQXJhYmljQ2hhci0+R2V0Rm9ybUNoYXIocExhc3RDaGFyLCBwUHJldkNoYXIsIHBDdXJDaGFyKTsNCi0gICAgICAgICAgICBiQWxlZiA9ICh3Rm9ybSA9PSAweEZFRkYgJiYgcExhc3RDaGFyLT5HZXRDaGFyVHlwZSgpID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxhc3RSb3RhdGlvbiA9IHBMYXN0Q2hhci0+bV9uUm90YXRpb24gKyBtX2lMaW5lUm90YXRpb247DQotICAgICAgICAgICAgaWYgKG1fYlZlcnRpY2FsICYmIChwTGFzdENoYXItPm1fZHdDaGFyUHJvcHMgJiAweDgwMDApICE9IDApIHsNCi0gICAgICAgICAgICAgICAgaUxhc3RSb3RhdGlvbiArKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlMYXN0Um90YXRpb24pKSB7DQotICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBtX2JDaGFyQ29kZSkpDQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aChwTGFzdENoYXItPm1fd0NoYXJDb2RlLCBpQ2hhcldpZHRoLCBtX2JDaGFyQ29kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsNCi0gICAgICAgICAgICBwTGFzdENoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQotICAgICAgICAgICAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOw0KLSAgICAgICAgICAgIGlDaGFyV2lkdGggPSAwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHdGb3JtID0gbV9wQXJhYmljQ2hhci0+R2V0Rm9ybUNoYXIocEN1ckNoYXIsIChiQWxlZiA/IE5VTEwgOiBwTGFzdENoYXIpLCBOVUxMKTsNCi0gICAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlSb3RhdGlvbikpIHsNCi0gICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIG1fYkNoYXJDb2RlKSkNCi0gICAgICAgICAgICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aChwQ3VyQ2hhci0+bV93Q2hhckNvZGUsIGlDaGFyV2lkdGgsIG1fYkNoYXJDb2RlKSkgew0KLSAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsNCi0gICAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3Jpem9udGFsU2NhbGUgLyAxMDA7DQogICAgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KICAgICBpTGluZVdpZHRoICs9IGlDaGFyV2lkdGg7DQotICAgIG1fcEN1ckxpbmUtPm1faUFyYWJpY0NoYXJzICsrOw0KLSAgICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgIW1fYk9ycGhhbkxpbmUgJiYgbV9wQ3VyTGluZS0+R2V0TGluZUVuZCgpID4gbV9pTGluZUVuZCArIG1faVRvbGVyYW5jZSkgew0KLSAgICAgICAgcmV0dXJuIEVuZEJyZWFrKEZYX1JURkJSRUFLX0xpbmVCcmVhayk7DQorICAgIGlmICghbV9iU2luZ2xlTGluZSAmJiAhbV9iT3JwaGFuTGluZSAmJiBiQnJlYWspIHsNCisgICAgICByZXR1cm4gRW5kQnJlYWsoRlhfUlRGQlJFQUtfTGluZUJyZWFrKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCisgIH0NCisgIHJldHVybiBGWF9SVEZCUkVBS19Ob25lOw0KIH0NCi1GWF9EV09SRCBDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzKENGWF9SVEZDaGFyICpwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pDQotew0KLSAgICBGWF9EV09SRCBkd1R5cGUgPSAocEN1ckNoYXItPm1fZHdDaGFyUHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsNCi0gICAgRlhfV0NIQVIgd0Zvcm07DQotICAgIGlmIChkd1R5cGUgPT0gRlhfQ0hBUlRZUEVfTnVtZXJpYykgew0KLSAgICAgICAgaWYgKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9BcmFiaWNOdW1iZXIpIHsNCi0gICAgICAgICAgICB3Rm9ybSA9IHBDdXJDaGFyLT5tX3dDaGFyQ29kZSArIDB4MDYzMDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgd0Zvcm0gPSBwQ3VyQ2hhci0+bV93Q2hhckNvZGU7DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0NvbnRyb2woQ0ZYX1JURkNoYXIqIHBDdXJDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0aW9uKSB7DQorICBGWF9EV09SRCBkd1JldDIgPSBGWF9SVEZCUkVBS19Ob25lOw0KKyAgaWYgKCFtX2JTaW5nbGVMaW5lKSB7DQorICAgIHN3aXRjaCAocEN1ckNoYXItPm1fd0NoYXJDb2RlKSB7DQorICAgICAgY2FzZSBMJ1x2JzoNCisgICAgICBjYXNlIDB4MjAyODoNCisgICAgICAgIGR3UmV0MiA9IEZYX1JURkJSRUFLX0xpbmVCcmVhazsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgTCdcZic6DQorICAgICAgICBkd1JldDIgPSBGWF9SVEZCUkVBS19QYWdlQnJlYWs7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDB4MjAyOToNCisgICAgICAgIGR3UmV0MiA9IEZYX1JURkJSRUFLX1BhcmFncmFwaEJyZWFrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGlmIChwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPT0gbV93TGluZUJyZWFrQ2hhcikgew0KKyAgICAgICAgICBkd1JldDIgPSBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhazsNCiAgICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChtX2JSVEwgfHwgbV9iVmVydGljYWwpIHsNCi0gICAgICAgIHdGb3JtID0gRlhfR2V0TWlycm9yQ2hhcihwQ3VyQ2hhci0+bV93Q2hhckNvZGUsIHBDdXJDaGFyLT5tX2R3Q2hhclByb3BzLCBtX2JSVEwsIG1fYlZlcnRpY2FsKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHdGb3JtID0gcEN1ckNoYXItPm1fd0NoYXJDb2RlOw0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsNCi0gICAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlSb3RhdGlvbikpIHsNCisgICAgaWYgKGR3UmV0MiAhPSBGWF9SVEZCUkVBS19Ob25lKSB7DQorICAgICAgZHdSZXQyID0gRW5kQnJlYWsoZHdSZXQyKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGR3UmV0MjsNCit9DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYyhDRlhfUlRGQ2hhciogcEN1ckNoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGlvbikgew0KKyAgQ0ZYX1JURkNoYXIqIHBMYXN0Q2hhciA9IE5VTEw7DQorICBpbnQzMl90JiBpTGluZVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQorICBpbnQzMl90IGlDaGFyV2lkdGggPSAwOw0KKyAgRlhfV0NIQVIgd0Zvcm07DQorICBGWF9CT09MIGJBbGVmID0gRkFMU0U7DQorICBpZiAobV9kd0NoYXJUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgJiYNCisgICAgICBtX2R3Q2hhclR5cGUgPD0gRlhfQ0hBUlRZUEVfQXJhYmljRGlzdG9ydGlvbikgew0KKyAgICBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigxKTsNCisgICAgaWYgKHBMYXN0Q2hhciAhPSBOVUxMKSB7DQorICAgICAgaUxpbmVXaWR0aCAtPSBwTGFzdENoYXItPm1faUNoYXJXaWR0aDsNCisgICAgICBDRlhfUlRGQ2hhciogcFByZXZDaGFyID0gR2V0TGFzdENoYXIoMik7DQorICAgICAgd0Zvcm0gPSBtX3BBcmFiaWNDaGFyLT5HZXRGb3JtQ2hhcihwTGFzdENoYXIsIHBQcmV2Q2hhciwgcEN1ckNoYXIpOw0KKyAgICAgIGJBbGVmID0gKHdGb3JtID09IDB4RkVGRiAmJg0KKyAgICAgICAgICAgICAgIHBMYXN0Q2hhci0+R2V0Q2hhclR5cGUoKSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKTsNCisgICAgICBpbnQzMl90IGlMYXN0Um90YXRpb24gPSBwTGFzdENoYXItPm1fblJvdGF0aW9uICsgbV9pTGluZVJvdGF0aW9uOw0KKyAgICAgIGlmIChtX2JWZXJ0aWNhbCAmJiAocExhc3RDaGFyLT5tX2R3Q2hhclByb3BzICYgMHg4MDAwKSAhPSAwKSB7DQorICAgICAgICBpTGFzdFJvdGF0aW9uKys7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpTGFzdFJvdGF0aW9uKSkgew0KICAgICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgbV9iQ2hhckNvZGUpKSB7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBtX2JDaGFyQ29kZSkpDQorICAgICAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHBMYXN0Q2hhci0+bV93Q2hhckNvZGUsIGlDaGFyV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkNoYXJDb2RlKSkgew0KICAgICAgICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KLSAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICAgICAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3Jpem9udGFsU2NhbGUgLyAxMDA7DQorICAgICAgcExhc3RDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgICBpQ2hhcldpZHRoID0gMDsNCiAgICAgfQ0KLSAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOw0KLSAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsNCi0gICAgaUNoYXJXaWR0aCArPSBtX2lDaGFyU3BhY2U7DQotICAgIGlmIChkd1R5cGUgPT0gRlhfQ0hBUlRZUEVfU3BhY2UgJiYgbV9iV29yZFNwYWNlKSB7DQotICAgICAgICBpQ2hhcldpZHRoICs9IG1faVdvcmRTcGFjZTsNCi0gICAgfQ0KLSAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCi0gICAgbV9wQ3VyTGluZS0+bV9pV2lkdGggKz0gaUNoYXJXaWR0aDsNCi0gICAgRlhfQk9PTCBiQnJlYWsgPSAoZHdUeXBlICE9IEZYX0NIQVJUWVBFX1NwYWNlIHx8IChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9TcGFjZUJyZWFrKSAhPSAwKTsNCi0gICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmICFtX2JPcnBoYW5MaW5lICYmIGJCcmVhayAmJiBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lMaW5lRW5kICsgbV9pVG9sZXJhbmNlKSB7DQotICAgICAgICByZXR1cm4gRW5kQnJlYWsoRlhfUlRGQlJFQUtfTGluZUJyZWFrKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCisgIH0NCisgIHdGb3JtID0NCisgICAgICBtX3BBcmFiaWNDaGFyLT5HZXRGb3JtQ2hhcihwQ3VyQ2hhciwgKGJBbGVmID8gTlVMTCA6IHBMYXN0Q2hhciksIE5VTEwpOw0KKyAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlSb3RhdGlvbikpIHsNCisgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQorICB9IGVsc2Ugew0KKyAgICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgbV9iQ2hhckNvZGUpKQ0KKyAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHBDdXJDaGFyLT5tX3dDaGFyQ29kZSwgaUNoYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JDaGFyQ29kZSkpIHsNCisgICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICAgIH0NCisgIH0NCisgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsNCisgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgbV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMrKzsNCisgIGlmICghbV9iU2luZ2xlTGluZSAmJiAhbV9iT3JwaGFuTGluZSAmJg0KKyAgICAgIG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUxpbmVFbmQgKyBtX2lUb2xlcmFuY2UpIHsNCisgICAgcmV0dXJuIEVuZEJyZWFrKEZYX1JURkJSRUFLX0xpbmVCcmVhayk7DQorICB9DQorICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCiB9DQotRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cykNCi17DQotICAgIEZYU1lTX2Fzc2VydChkd1N0YXR1cyA+PSBGWF9SVEZCUkVBS19QaWVjZUJyZWFrICYmIGR3U3RhdHVzIDw9IEZYX1JURkJSRUFLX1BhZ2VCcmVhayk7DQotICAgIG1fZHdJZGVudGl0eSArKzsNCi0gICAgQ0ZYX1JURlBpZWNlQXJyYXkgKnBDdXJQaWVjZXMgPSAmbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IHBDdXJQaWVjZXMtPkdldFNpemUoKTsNCi0gICAgaWYgKGlDb3VudCA+IDApIHsNCi0gICAgICAgIENGWF9SVEZQaWVjZSAqcExhc3RQaWVjZSA9IHBDdXJQaWVjZXMtPkdldFB0ckF0KC0tIGlDb3VudCk7DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycyhDRlhfUlRGQ2hhciogcEN1ckNoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGlvbikgew0KKyAgRlhfRFdPUkQgZHdUeXBlID0gKHBDdXJDaGFyLT5tX2R3Q2hhclByb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7DQorICBGWF9XQ0hBUiB3Rm9ybTsNCisgIGlmIChkd1R5cGUgPT0gRlhfQ0hBUlRZUEVfTnVtZXJpYykgew0KKyAgICBpZiAobV9kd0xheW91dFN0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX0FyYWJpY051bWJlcikgew0KKyAgICAgIHdGb3JtID0gcEN1ckNoYXItPm1fd0NoYXJDb2RlICsgMHgwNjMwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdGb3JtID0gcEN1ckNoYXItPm1fd0NoYXJDb2RlOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKG1fYlJUTCB8fCBtX2JWZXJ0aWNhbCkgew0KKyAgICB3Rm9ybSA9IEZYX0dldE1pcnJvckNoYXIocEN1ckNoYXItPm1fd0NoYXJDb2RlLCBwQ3VyQ2hhci0+bV9kd0NoYXJQcm9wcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYlJUTCwgbV9iVmVydGljYWwpOw0KKyAgfSBlbHNlIHsNCisgICAgd0Zvcm0gPSBwQ3VyQ2hhci0+bV93Q2hhckNvZGU7DQorICB9DQorICBpbnQzMl90IGlDaGFyV2lkdGggPSAwOw0KKyAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlSb3RhdGlvbikpIHsNCisgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQorICB9IGVsc2Ugew0KKyAgICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgbV9iQ2hhckNvZGUpKSB7DQorICAgICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7DQorICAgIH0NCisgIH0NCisgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsNCisgIGlDaGFyV2lkdGggKz0gbV9pQ2hhclNwYWNlOw0KKyAgaWYgKGR3VHlwZSA9PSBGWF9DSEFSVFlQRV9TcGFjZSAmJiBtX2JXb3JkU3BhY2UpIHsNCisgICAgaUNoYXJXaWR0aCArPSBtX2lXb3JkU3BhY2U7DQorICB9DQorICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgIG1fcEN1ckxpbmUtPm1faVdpZHRoICs9IGlDaGFyV2lkdGg7DQorICBGWF9CT09MIGJCcmVhayA9IChkd1R5cGUgIT0gRlhfQ0hBUlRZUEVfU3BhY2UgfHwNCisgICAgICAgICAgICAgICAgICAgIChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9TcGFjZUJyZWFrKSAhPSAwKTsNCisgIGlmICghbV9iU2luZ2xlTGluZSAmJiAhbV9iT3JwaGFuTGluZSAmJiBiQnJlYWsgJiYNCisgICAgICBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lMaW5lRW5kICsgbV9pVG9sZXJhbmNlKSB7DQorICAgIHJldHVybiBFbmRCcmVhayhGWF9SVEZCUkVBS19MaW5lQnJlYWspOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX1JURkJSRUFLX05vbmU7DQorfQ0KK0ZYX0RXT1JEIENGWF9SVEZCcmVhazo6RW5kQnJlYWsoRlhfRFdPUkQgZHdTdGF0dXMpIHsNCisgIEZYU1lTX2Fzc2VydChkd1N0YXR1cyA+PSBGWF9SVEZCUkVBS19QaWVjZUJyZWFrICYmDQorICAgICAgICAgICAgICAgZHdTdGF0dXMgPD0gRlhfUlRGQlJFQUtfUGFnZUJyZWFrKTsNCisgIG1fZHdJZGVudGl0eSsrOw0KKyAgQ0ZYX1JURlBpZWNlQXJyYXkqIHBDdXJQaWVjZXMgPSAmbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7DQorICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICBDRlhfUlRGUGllY2UqIHBMYXN0UGllY2UgPSBwQ3VyUGllY2VzLT5HZXRQdHJBdCgtLWlDb3VudCk7DQorICAgIGlmIChkd1N0YXR1cyA+IEZYX1JURkJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzID0gZHdTdGF0dXM7DQorICAgIH0gZWxzZSB7DQorICAgICAgZHdTdGF0dXMgPSBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzOw0KKyAgICB9DQorICAgIHJldHVybiBkd1N0YXR1czsNCisgIH0gZWxzZSB7DQorICAgIENGWF9SVEZMaW5lKiBwTGFzdExpbmUgPSBHZXRSVEZMaW5lKFRSVUUpOw0KKyAgICBpZiAocExhc3RMaW5lICE9IE5VTEwpIHsNCisgICAgICBwQ3VyUGllY2VzID0gJnBMYXN0TGluZS0+bV9MaW5lUGllY2VzOw0KKyAgICAgIGlDb3VudCA9IHBDdXJQaWVjZXMtPkdldFNpemUoKTsNCisgICAgICBpZiAoaUNvdW50LS0gPiAwKSB7DQorICAgICAgICBDRlhfUlRGUGllY2UqIHBMYXN0UGllY2UgPSBwQ3VyUGllY2VzLT5HZXRQdHJBdChpQ291bnQpOw0KICAgICAgICAgaWYgKGR3U3RhdHVzID4gRlhfUlRGQlJFQUtfUGllY2VCcmVhaykgew0KLSAgICAgICAgICAgIHBMYXN0UGllY2UtPm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgICAgICAgcExhc3RQaWVjZS0+bV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBkd1N0YXR1cyA9IHBMYXN0UGllY2UtPm1fZHdTdGF0dXM7DQorICAgICAgICAgIGR3U3RhdHVzID0gcExhc3RQaWVjZS0+bV9kd1N0YXR1czsNCiAgICAgICAgIH0NCiAgICAgICAgIHJldHVybiBkd1N0YXR1czsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9SVEZMaW5lICpwTGFzdExpbmUgPSBHZXRSVEZMaW5lKFRSVUUpOw0KLSAgICAgICAgaWYgKHBMYXN0TGluZSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgcEN1clBpZWNlcyA9ICZwTGFzdExpbmUtPm1fTGluZVBpZWNlczsNCi0gICAgICAgICAgICBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7DQotICAgICAgICAgICAgaWYgKGlDb3VudCAtLSA+IDApIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1JURlBpZWNlICpwTGFzdFBpZWNlID0gcEN1clBpZWNlcy0+R2V0UHRyQXQoaUNvdW50KTsNCi0gICAgICAgICAgICAgICAgaWYgKGR3U3RhdHVzID4gRlhfUlRGQlJFQUtfUGllY2VCcmVhaykgew0KLSAgICAgICAgICAgICAgICAgICAgcExhc3RQaWVjZS0+bV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBkd1N0YXR1czsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIEZYX1JURkJSRUFLX05vbmU7DQotICAgICAgICB9DQotICAgICAgICBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQotICAgICAgICBpZiAoaUNvdW50IDwgMSkgew0KLSAgICAgICAgICAgIHJldHVybiBGWF9SVEZCUkVBS19Ob25lOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1JURkNoYXIgJnRjID0gbV9wQ3VyTGluZS0+R2V0Q2hhcihpQ291bnQgLSAxKTsNCi0gICAgICAgIHRjLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCi0gICAgICAgIGlmIChkd1N0YXR1cyA8PSBGWF9SVEZCUkVBS19QaWVjZUJyZWFrKSB7DQotICAgICAgICAgICAgcmV0dXJuIGR3U3RhdHVzOw0KLSAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCiAgICAgfQ0KLSAgICBtX2lSZWFkeSA9IChtX3BDdXJMaW5lID09ICZtX1JURkxpbmUxKSA/IDEgOiAyOw0KLSAgICBDRlhfUlRGTGluZSAqcE5leHRMaW5lID0gKG1fcEN1ckxpbmUgPT0gJm1fUlRGTGluZTEpID8gJm1fUlRGTGluZTIgOiAmbV9SVEZMaW5lMTsNCi0gICAgRlhfQk9PTCBiQWxsQ2hhcnMgPSAobV9pQWxpZ25tZW50ID4gRlhfUlRGTElORUFMSUdOTUVOVF9SaWdodCk7DQotICAgIENGWF9UUE9BcnJheSB0cG9zOw0KLSAgICBpZiAoRW5kQnJlYWtfU3BsaXRMaW5lKHBOZXh0TGluZSwgYkFsbENoYXJzLCBkd1N0YXR1cykpIHsNCi0gICAgICAgIGdvdG8gRW5kQnJlYWtfUmV0Ow0KLSAgICB9DQotICAgIGlmICghbV9iQ2hhckNvZGUpIHsNCi0gICAgICAgIEVuZEJyZWFrX0JpZGlMaW5lKHRwb3MsIGR3U3RhdHVzKTsNCi0gICAgfQ0KLSAgICBpZiAoIW1fYlBhZ2luYXRpb24gJiYgbV9pQWxpZ25tZW50ID4gRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0KSB7DQotICAgICAgICBFbmRCcmVha19BbGlnbm1lbnQodHBvcywgYkFsbENoYXJzLCBkd1N0YXR1cyk7DQotICAgIH0NCi1FbmRCcmVha19SZXQ6DQotICAgIG1fcEN1ckxpbmUgPSBwTmV4dExpbmU7DQotICAgIG1fcEN1ckxpbmUtPm1faVN0YXJ0ID0gbV9pTGluZVN0YXJ0Ow0KLSAgICBDRlhfUlRGQ2hhciAqcFRDID0gR2V0TGFzdENoYXIoMCk7DQotICAgIG1fZHdDaGFyVHlwZSA9IHBUQyA9PSBOVUxMID8gMCA6IHBUQy0+R2V0Q2hhclR5cGUoKTsNCi0gICAgcmV0dXJuIGR3U3RhdHVzOw0KLX0NCi1GWF9CT09MIENGWF9SVEZCcmVhazo6RW5kQnJlYWtfU3BsaXRMaW5lKENGWF9SVEZMaW5lICpwTmV4dExpbmUsIEZYX0JPT0wgYkFsbENoYXJzLCBGWF9EV09SRCBkd1N0YXR1cykNCi17DQotICAgIEZYX0JPT0wgYkRvbmUgPSBGQUxTRTsNCi0gICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmICFtX2JPcnBoYW5MaW5lICYmIG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUxpbmVFbmQgKyBtX2lUb2xlcmFuY2UpIHsNCi0gICAgICAgIENGWF9SVEZDaGFyICZ0YyA9IG1fcEN1ckxpbmUtPkdldENoYXIobV9wQ3VyTGluZS0+Q291bnRDaGFycygpIC0gMSk7DQotICAgICAgICBzd2l0Y2ggKHRjLkdldENoYXJUeXBlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIEZYX0NIQVJUWVBFX1RhYjoNCi0gICAgICAgICAgICAgICAgaWYgKChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9UYWJCcmVhaykgIT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgU3BsaXRUZXh0TGluZShtX3BDdXJMaW5lLCBwTmV4dExpbmUsICFtX2JQYWdpbmF0aW9uICYmIGJBbGxDaGFycyk7DQotICAgICAgICAgICAgICAgICAgICBiRG9uZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGWF9DSEFSVFlQRV9Db250cm9sOg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZYX0NIQVJUWVBFX1NwYWNlOg0KLSAgICAgICAgICAgICAgICBpZiAoKG1fZHdQb2xpY2llcyAmIEZYX1JURkJSRUFLUE9MSUNZX1NwYWNlQnJlYWspICE9IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIFNwbGl0VGV4dExpbmUobV9wQ3VyTGluZSwgcE5leHRMaW5lLCAhbV9iUGFnaW5hdGlvbiAmJiBiQWxsQ2hhcnMpOw0KLSAgICAgICAgICAgICAgICAgICAgYkRvbmUgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIFNwbGl0VGV4dExpbmUobV9wQ3VyTGluZSwgcE5leHRMaW5lLCAhbV9iUGFnaW5hdGlvbiAmJiBiQWxsQ2hhcnMpOw0KLSAgICAgICAgICAgICAgICBiRG9uZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChtX2JQYWdpbmF0aW9uIHx8IG1fcEN1ckxpbmUtPm1faU1CQ1NDaGFycyA+IDApIHsNCi0gICAgICAgIGNvbnN0IENGWF9SVEZDaGFyICpwQ3VyQ2hhcnMgPSBtX3BDdXJMaW5lLT5tX0xpbmVDaGFycy5HZXREYXRhKCk7DQotICAgICAgICBjb25zdCBDRlhfUlRGQ2hhciAqcFRDOw0KLSAgICAgICAgQ0ZYX1JURlBpZWNlQXJyYXkgKnBDdXJQaWVjZXMgPSAmbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzOw0KLSAgICAgICAgQ0ZYX1JURlBpZWNlIHRwOw0KLSAgICAgICAgdHAubV9wQ2hhcnMgPSAmbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnM7DQotICAgICAgICBGWF9CT09MIGJOZXcgPSBUUlVFOw0KLSAgICAgICAgRlhfRFdPUkQgZHdJZGVudGl0eSA9IChGWF9EV09SRCkgLSAxOw0KLSAgICAgICAgaW50MzJfdCBpTGFzdCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKSAtIDEsIGogPSAwOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IGlMYXN0Oykgew0KLSAgICAgICAgICAgIHBUQyA9IHBDdXJDaGFycyArIGk7DQotICAgICAgICAgICAgaWYgKGJOZXcpIHsNCi0gICAgICAgICAgICAgICAgdHAubV9pU3RhcnRDaGFyID0gaTsNCi0gICAgICAgICAgICAgICAgdHAubV9pU3RhcnRQb3MgKz0gdHAubV9pV2lkdGg7DQotICAgICAgICAgICAgICAgIHRwLm1faVdpZHRoID0gMDsNCi0gICAgICAgICAgICAgICAgdHAubV9kd1N0YXR1cyA9IHBUQy0+bV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgdHAubV9pRm9udFNpemUgPSBwVEMtPm1faUZvbnRTaXplOw0KLSAgICAgICAgICAgICAgICB0cC5tX2lGb250SGVpZ2h0ID0gcFRDLT5tX2lGb250SGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICB0cC5tX2lIb3Jpem9udGFsU2NhbGUgPSBwVEMtPm1faUhvcml6b250YWxTY2FsZTsNCi0gICAgICAgICAgICAgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KLSAgICAgICAgICAgICAgICB0cC5tX2R3TGF5b3V0U3R5bGVzID0gcFRDLT5tX2R3TGF5b3V0U3R5bGVzOw0KLSAgICAgICAgICAgICAgICBkd0lkZW50aXR5ID0gcFRDLT5tX2R3SWRlbnRpdHk7DQotICAgICAgICAgICAgICAgIHRwLm1fZHdJZGVudGl0eSA9IGR3SWRlbnRpdHk7DQotICAgICAgICAgICAgICAgIHRwLm1fcFVzZXJEYXRhID0gcFRDLT5tX3BVc2VyRGF0YTsNCi0gICAgICAgICAgICAgICAgaiA9IGk7DQotICAgICAgICAgICAgICAgIGJOZXcgPSBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGkgPT0gaUxhc3QgfHwgcFRDLT5tX2R3U3RhdHVzICE9IEZYX1JURkJSRUFLX05vbmUgfHwgcFRDLT5tX2R3SWRlbnRpdHkgIT0gZHdJZGVudGl0eSkgew0KLSAgICAgICAgICAgICAgICB0cC5tX2lDaGFycyA9IGkgLSBqOw0KLSAgICAgICAgICAgICAgICBpZiAocFRDLT5tX2R3SWRlbnRpdHkgPT0gZHdJZGVudGl0eSkgew0KLSAgICAgICAgICAgICAgICAgICAgdHAubV9kd1N0YXR1cyA9IHBUQy0+bV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgIHRwLm1faVdpZHRoICs9IHBUQy0+bV9pQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgdHAubV9pQ2hhcnMgKz0gMTsNCi0gICAgICAgICAgICAgICAgICAgIGkgKys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCi0gICAgICAgICAgICAgICAgYk5ldyA9IFRSVUU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdHAubV9pV2lkdGggKz0gcFRDLT5tX2lDaGFyV2lkdGg7DQotICAgICAgICAgICAgICAgIGkgKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgaWYgKGJBbGxDaGFycyAmJiAhYkRvbmUpIHsNCi0gICAgICAgIGludDMyX3QgaUVuZFBvcyA9IG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKTsNCi0gICAgICAgIEdldEJyZWFrUG9zKG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzLCBpRW5kUG9zLCBiQWxsQ2hhcnMsIFRSVUUpOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotdm9pZCBDRlhfUlRGQnJlYWs6OkVuZEJyZWFrX0JpZGlMaW5lKENGWF9UUE9BcnJheSAmdHBvcywgRlhfRFdPUkQgZHdTdGF0dXMpDQotew0KLSAgICBGWF9UUE8gdHBvOw0KLSAgICBDRlhfUlRGUGllY2UgdHA7DQotICAgIENGWF9SVEZDaGFyICpwVEM7DQotICAgIGludDMyX3QgaSwgajsNCi0gICAgQ0ZYX1JURkNoYXJBcnJheSAmY2hhcnMgPSBtX3BDdXJMaW5lLT5tX0xpbmVDaGFyczsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQotICAgIEZYX0JPT0wgYkRvbmUgPSAoIW1fYlBhZ2luYXRpb24gJiYgIW1fYkNoYXJDb2RlICYmIChtX3BDdXJMaW5lLT5tX2lBcmFiaWNDaGFycyA+IDAgfHwgbV9iUlRMKSk7DQotICAgIGlmIChiRG9uZSkgew0KLSAgICAgICAgaW50MzJfdCBpQmlkaU51bSA9IDA7DQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsNCi0gICAgICAgICAgICBwVEMtPm1faUJpZGlQb3MgPSBpOw0KLSAgICAgICAgICAgIGlmIChwVEMtPkdldENoYXJUeXBlKCkgIT0gRlhfQ0hBUlRZUEVfQ29udHJvbCkgew0KLSAgICAgICAgICAgICAgICBpQmlkaU51bSA9IGk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChpID09IDApIHsNCi0gICAgICAgICAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0JpZGlMaW5lKGNoYXJzLCBpQmlkaU51bSArIDEsIG1fYlJUTCA/IDEgOiAwKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOw0KLSAgICAgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gMDsNCi0gICAgICAgICAgICBwVEMtPm1faUJpZGlQb3MgPSAwOw0KLSAgICAgICAgICAgIHBUQy0+bV9pQmlkaU9yZGVyID0gMDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB0cC5tX2R3U3RhdHVzID0gRlhfUlRGQlJFQUtfUGllY2VCcmVhazsNCi0gICAgdHAubV9pU3RhcnRQb3MgPSBtX3BDdXJMaW5lLT5tX2lTdGFydDsNCi0gICAgdHAubV9wQ2hhcnMgPSAmY2hhcnM7DQotICAgIENGWF9SVEZQaWVjZUFycmF5ICpwQ3VyUGllY2VzID0gJm1fcEN1ckxpbmUtPm1fTGluZVBpZWNlczsNCi0gICAgaW50MzJfdCBpQmlkaUxldmVsID0gLTEsIGlDaGFyV2lkdGg7DQotICAgIEZYX0RXT1JEIGR3SWRlbnRpdHkgPSAoRlhfRFdPUkQpIC0gMTsNCi0gICAgaSA9IGogPSAwOw0KLSAgICB3aGlsZSAoaSA8IGlDb3VudCkgew0KLSAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsNCi0gICAgICAgIGlmIChpQmlkaUxldmVsIDwgMCkgew0KLSAgICAgICAgICAgIGlCaWRpTGV2ZWwgPSBwVEMtPm1faUJpZGlMZXZlbDsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7DQotICAgICAgICAgICAgaWYgKGlDaGFyV2lkdGggPCAxKSB7DQotICAgICAgICAgICAgICAgIHRwLm1faVdpZHRoID0gMDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0cC5tX2lXaWR0aCA9IGlDaGFyV2lkdGg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRwLm1faUJpZGlMZXZlbCA9IGlCaWRpTGV2ZWw7DQotICAgICAgICAgICAgdHAubV9pQmlkaVBvcyA9IHBUQy0+bV9pQmlkaU9yZGVyOw0KLSAgICAgICAgICAgIHRwLm1faUZvbnRTaXplID0gcFRDLT5tX2lGb250U2l6ZTsNCi0gICAgICAgICAgICB0cC5tX2lGb250SGVpZ2h0ID0gcFRDLT5tX2lGb250SGVpZ2h0Ow0KLSAgICAgICAgICAgIHRwLm1faUhvcml6b250YWxTY2FsZSA9IHBUQy0+bV9pSG9yaXpvbnRhbFNjYWxlOw0KLSAgICAgICAgICAgIHRwLm1faVZlcnRpY2FsU2NhbGUgPSBwVEMtPm1faVZlcnRpYWxTY2FsZTsNCi0gICAgICAgICAgICBkd0lkZW50aXR5ID0gcFRDLT5tX2R3SWRlbnRpdHk7DQotICAgICAgICAgICAgdHAubV9kd0lkZW50aXR5ID0gZHdJZGVudGl0eTsNCi0gICAgICAgICAgICB0cC5tX3BVc2VyRGF0YSA9IHBUQy0+bV9wVXNlckRhdGE7DQotICAgICAgICAgICAgdHAubV9kd1N0YXR1cyA9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWs7DQotICAgICAgICAgICAgaSArKzsNCi0gICAgICAgIH0gZWxzZSBpZiAoaUJpZGlMZXZlbCAhPSBwVEMtPm1faUJpZGlMZXZlbCB8fCBwVEMtPm1fZHdJZGVudGl0eSAhPSBkd0lkZW50aXR5KSB7DQotICAgICAgICAgICAgdHAubV9pQ2hhcnMgPSBpIC0gdHAubV9pU3RhcnRDaGFyOw0KLSAgICAgICAgICAgIHBDdXJQaWVjZXMtPkFkZCh0cCk7DQotICAgICAgICAgICAgdHAubV9pU3RhcnRQb3MgKz0gdHAubV9pV2lkdGg7DQotICAgICAgICAgICAgdHAubV9pU3RhcnRDaGFyID0gaTsNCi0gICAgICAgICAgICB0cG8uaW5kZXggPSBqICsrOw0KLSAgICAgICAgICAgIHRwby5wb3MgPSB0cC5tX2lCaWRpUG9zOw0KLSAgICAgICAgICAgIHRwb3MuQWRkKHRwbyk7DQotICAgICAgICAgICAgaUJpZGlMZXZlbCA9IC0xOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7DQotICAgICAgICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQotICAgICAgICAgICAgICAgIHRwLm1faVdpZHRoICs9IGlDaGFyV2lkdGg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGkgKys7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGkgPiB0cC5tX2lTdGFydENoYXIpIHsNCi0gICAgICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCi0gICAgICAgIHRwLm1faUNoYXJzID0gaSAtIHRwLm1faVN0YXJ0Q2hhcjsNCi0gICAgICAgIHBDdXJQaWVjZXMtPkFkZCh0cCk7DQotICAgICAgICB0cG8uaW5kZXggPSBqOw0KLSAgICAgICAgdHBvLnBvcyA9IHRwLm1faUJpZGlQb3M7DQotICAgICAgICB0cG9zLkFkZCh0cG8pOw0KLSAgICB9DQotICAgIGlmICghbV9iQ2hhckNvZGUpIHsNCi0gICAgICAgIGogPSB0cG9zLkdldFNpemUoKSAtIDE7DQotICAgICAgICBGWF9URVhUTEFZT1VUX1BpZWNlU29ydCh0cG9zLCAwLCBqKTsNCi0gICAgICAgIGludDMyX3QgaVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGo7IGkgKyspIHsNCi0gICAgICAgICAgICB0cG8gPSB0cG9zLkdldEF0KGkpOw0KLSAgICAgICAgICAgIENGWF9SVEZQaWVjZSAmdHRwID0gcEN1clBpZWNlcy0+R2V0QXQodHBvLmluZGV4KTsNCi0gICAgICAgICAgICB0dHAubV9pU3RhcnRQb3MgPSBpU3RhcnRQb3M7DQotICAgICAgICAgICAgaVN0YXJ0UG9zICs9IHR0cC5tX2lXaWR0aDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENGWF9SVEZCcmVhazo6RW5kQnJlYWtfQWxpZ25tZW50KENGWF9UUE9BcnJheSAmdHBvcywgRlhfQk9PTCBiQWxsQ2hhcnMsIEZYX0RXT1JEIGR3U3RhdHVzKQ0KLXsNCi0gICAgQ0ZYX1JURlBpZWNlQXJyYXkgKnBDdXJQaWVjZXMgPSAmbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzOw0KLSAgICBpbnQzMl90IGlOZXRXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoLCBpR2FwQ2hhcnMgPSAwLCBpQ2hhcldpZHRoOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IHBDdXJQaWVjZXMtPkdldFNpemUoKTsNCi0gICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOw0KLSAgICBGWF9EV09SRCBkd0NoYXJUeXBlOw0KLSAgICBpbnQzMl90IGksIGo7DQotICAgIEZYX1RQTyB0cG87DQotICAgIGZvciAoaSA9IGlDb3VudCAtIDE7IGkgPiAtMTsgaSAtLSkgew0KLSAgICAgICAgdHBvID0gdHBvcy5HZXRBdChpKTsNCi0gICAgICAgIENGWF9SVEZQaWVjZSAmdHRwID0gcEN1clBpZWNlcy0+R2V0QXQodHBvLmluZGV4KTsNCi0gICAgICAgIGlmICghYkZpbmQpIHsNCi0gICAgICAgICAgICBpTmV0V2lkdGggPSB0dHAuR2V0RW5kUG9zKCk7DQotICAgICAgICB9DQotICAgICAgICBGWF9CT09MIGJBcmFiaWMgPSBGWF9Jc09kZCh0dHAubV9pQmlkaUxldmVsKTsNCi0gICAgICAgIGogPSBiQXJhYmljID8gMCA6IHR0cC5tX2lDaGFycyAtIDE7DQotICAgICAgICB3aGlsZSAoaiA+IC0xICYmIGogPCB0dHAubV9pQ2hhcnMpIHsNCi0gICAgICAgICAgICBjb25zdCBDRlhfUlRGQ2hhciAmdGMgPSB0dHAuR2V0Q2hhcihqKTsNCi0gICAgICAgICAgICBpZiAodGMubV9uQnJlYWtUeXBlID09IEZYX0xCVF9ESVJFQ1RfQlJLKSB7DQotICAgICAgICAgICAgICAgIGlHYXBDaGFycyArKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCFiRmluZCB8fCAhYkFsbENoYXJzKSB7DQotICAgICAgICAgICAgICAgIGR3Q2hhclR5cGUgPSB0Yy5HZXRDaGFyVHlwZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9TcGFjZSB8fCBkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghYkZpbmQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gdGMubV9pQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiQWxsQ2hhcnMgJiYgaUNoYXJXaWR0aCA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaU5ldFdpZHRoIC09IGlDaGFyV2lkdGg7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiQWxsQ2hhcnMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBqICs9IGJBcmFiaWMgPyAxIDogLTE7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJBbGxDaGFycyAmJiBiRmluZCkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGludDMyX3QgaU9mZnNldCA9IG1faUxpbmVFbmQgLSBpTmV0V2lkdGg7DQotICAgIGludDMyX3QgaUxvd2VyQWxpZ25tZW50ID0gKG1faUFsaWdubWVudCAmIEZYX1JURkxJTkVBTElHTk1FTlRfTG93ZXJNYXNrKTsNCi0gICAgaW50MzJfdCBpSGlnaGVyQWxpZ25tZW50ID0gKG1faUFsaWdubWVudCAmIEZYX1JURkxJTkVBTElHTk1FTlRfSGlnaGVyTWFzayk7DQotICAgIGlmIChpR2FwQ2hhcnMgPiAwICYmIChpSGlnaGVyQWxpZ25tZW50ID09IEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQgfHwgKGlIaWdoZXJBbGlnbm1lbnQgPT0gRlhfUlRGTElORUFMSUdOTUVOVF9KdXN0aWZpZWQgJiYgZHdTdGF0dXMgIT0gRlhfUlRGQlJFQUtfUGFyYWdyYXBoQnJlYWspKSkgew0KLSAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAtMTsNCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgICAgICB0cG8gPSB0cG9zLkdldEF0KGkpOw0KLSAgICAgICAgICAgIENGWF9SVEZQaWVjZSAmdHRwID0gcEN1clBpZWNlcy0+R2V0QXQodHBvLmluZGV4KTsNCi0gICAgICAgICAgICBpZiAoaVN0YXJ0IDwgMCkgew0KLSAgICAgICAgICAgICAgICBpU3RhcnQgPSB0dHAubV9pU3RhcnRQb3M7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdHRwLm1faVN0YXJ0UG9zID0gaVN0YXJ0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpbnQzMl90IGs7DQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHR0cC5tX2lDaGFyczsgaiArKykgew0KLSAgICAgICAgICAgICAgICBDRlhfUlRGQ2hhciAmdGMgPSB0dHAuR2V0Q2hhcihqKTsNCi0gICAgICAgICAgICAgICAgaWYgKHRjLm1fbkJyZWFrVHlwZSAhPSBGWF9MQlRfRElSRUNUX0JSSyB8fCB0Yy5tX2lDaGFyV2lkdGggPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBrID0gaU9mZnNldCAvIGlHYXBDaGFyczsNCi0gICAgICAgICAgICAgICAgdGMubV9pQ2hhcldpZHRoICs9IGs7DQotICAgICAgICAgICAgICAgIHR0cC5tX2lXaWR0aCArPSBrOw0KLSAgICAgICAgICAgICAgICBpT2Zmc2V0IC09IGs7DQotICAgICAgICAgICAgICAgIGlHYXBDaGFycyAtLTsNCi0gICAgICAgICAgICAgICAgaWYgKGlHYXBDaGFycyA8IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlTdGFydCArPSB0dHAubV9pV2lkdGg7DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZiAoaUxvd2VyQWxpZ25tZW50ID4gRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0KSB7DQotICAgICAgICBpZiAoaUxvd2VyQWxpZ25tZW50ID09IEZYX1JURkxJTkVBTElHTk1FTlRfQ2VudGVyKSB7DQotICAgICAgICAgICAgaU9mZnNldCAvPSAyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlPZmZzZXQgPiAwKSB7DQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgICAgICAgICBDRlhfUlRGUGllY2UgJnR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KGkpOw0KLSAgICAgICAgICAgICAgICB0dHAubV9pU3RhcnRQb3MgKz0gaU9mZnNldDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQotaW50MzJfdCBDRlhfUlRGQnJlYWs6OkdldEJyZWFrUG9zKENGWF9SVEZDaGFyQXJyYXkgJnRjYSwgaW50MzJfdCAmaUVuZFBvcywgRlhfQk9PTCBiQWxsQ2hhcnMsIEZYX0JPT0wgYk9ubHlCcmspDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSB0Y2EuR2V0U2l6ZSgpIC0gMTsNCi0gICAgaWYgKGlMZW5ndGggPCAxKSB7DQotICAgICAgICByZXR1cm4gaUxlbmd0aDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlCcmVhayA9IC0xLCBpQnJlYWtQb3MgPSAtMSwgaUluZGlyZWN0ID0gLTEsIGlJbmRpcmVjdFBvcyA9IC0xLCBpTGFzdCA9IC0xLCBpTGFzdFBvcyA9IC0xOw0KLSAgICBpZiAobV9iU2luZ2xlTGluZSB8fCBtX2JPcnBoYW5MaW5lIHx8IGlFbmRQb3MgPD0gbV9pTGluZUVuZCkgew0KLSAgICAgICAgaWYgKCFiQWxsQ2hhcnMgfHwgbV9iQ2hhckNvZGUpIHsNCi0gICAgICAgICAgICByZXR1cm4gaUxlbmd0aDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlCcmVhayA9IGlMZW5ndGg7DQotICAgICAgICBpQnJlYWtQb3MgPSBpRW5kUG9zOw0KLSAgICB9DQotICAgIENGWF9SVEZDaGFyICpwQ2hhckFycmF5ID0gdGNhLkdldERhdGEoKTsNCi0gICAgaWYgKG1fYkNoYXJDb2RlKSB7DQotICAgICAgICBjb25zdCBDRlhfUlRGQ2hhciAqcENoYXI7DQotICAgICAgICBpbnQzMl90IGlDaGFyV2lkdGg7DQotICAgICAgICB3aGlsZSAoaUxlbmd0aCA+IDApIHsNCi0gICAgICAgICAgICBpZiAoaUVuZFBvcyA8PSBtX2lMaW5lRW5kKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwQ2hhciA9IHBDaGFyQXJyYXkgKyBpTGVuZ3RoLS07DQotICAgICAgICAgICAgaUNoYXJXaWR0aCA9IHBDaGFyLT5tX2lDaGFyV2lkdGg7DQotICAgICAgICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQotICAgICAgICAgICAgICAgIGlFbmRQb3MgLT0gaUNoYXJXaWR0aDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaUxlbmd0aDsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJTcGFjZUJyZWFrID0gKG1fZHdQb2xpY2llcyAmIEZYX1JURkJSRUFLUE9MSUNZX1NwYWNlQnJlYWspICE9IDA7DQotICAgIEZYX0JPT0wgYlRhYkJyZWFrID0gKG1fZHdQb2xpY2llcyAmIEZYX1JURkJSRUFLUE9MSUNZX1RhYkJyZWFrKSAhPSAwOw0KLSAgICBGWF9CT09MIGJOdW1iZXJCcmVhayA9IChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9OdW1iZXJCcmVhaykgIT0gMDsNCi0gICAgRlhfQk9PTCBiSW5maXhCcmVhayA9IChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9JbmZpeEJyZWFrKSAhPSAwOw0KLSAgICBGWF9MSU5FQlJFQUtUWVBFIGVUeXBlOw0KLSAgICBGWF9EV09SRCBuQ29kZVByb3AsIG5DdXIsIG5OZXh0Ow0KLSAgICBDRlhfUlRGQ2hhciAqcEN1ciA9IHBDaGFyQXJyYXkgKyBpTGVuZ3RoLS07DQotICAgIGlmIChiQWxsQ2hhcnMpIHsNCi0gICAgICAgIHBDdXItPm1fbkJyZWFrVHlwZSA9IEZYX0xCVF9VTktOT1dOOw0KLSAgICB9DQotICAgIG5Db2RlUHJvcCA9IHBDdXItPm1fZHdDaGFyUHJvcHM7DQotICAgIG5OZXh0ID0gbkNvZGVQcm9wICYgMHgwMDNGOw0KLSAgICBpbnQzMl90IGlDaGFyV2lkdGggPSBwQ3VyLT5tX2lDaGFyV2lkdGg7DQotICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KLSAgICAgICAgaUVuZFBvcyAtPSBpQ2hhcldpZHRoOw0KLSAgICB9DQotICAgIHdoaWxlIChpTGVuZ3RoID49IDApIHsNCi0gICAgICAgIHBDdXIgPSBwQ2hhckFycmF5ICsgaUxlbmd0aDsNCi0gICAgICAgIG5Db2RlUHJvcCA9IHBDdXItPm1fZHdDaGFyUHJvcHM7DQotICAgICAgICBuQ3VyID0gbkNvZGVQcm9wICYgMHgwMDNGOw0KLSAgICAgICAgRlhfQk9PTCBiTmVlZEJyZWFrID0gRkFMU0U7DQotICAgICAgICBpZiAobkN1ciA9PSBGWF9DQlBfU1ApIHsNCi0gICAgICAgICAgICBiTmVlZEJyZWFrID0gIWJTcGFjZUJyZWFrOw0KLSAgICAgICAgICAgIGlmIChuTmV4dCA9PSBGWF9DQlBfU1ApIHsNCi0gICAgICAgICAgICAgICAgZVR5cGUgPSBiU3BhY2VCcmVhayA/IEZYX0xCVF9ESVJFQ1RfQlJLIDogRlhfTEJUX1BST0hJQklURURfQlJLOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGVUeXBlID0gKigoY29uc3QgRlhfTElORUJSRUFLVFlQRSAqKWdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGUgKyAobkN1ciA8PCA1KSArIG5OZXh0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKG5DdXIgPT0gRlhfQ0JQX1RCKSB7DQotICAgICAgICAgICAgYk5lZWRCcmVhayA9ICFiVGFiQnJlYWs7DQotICAgICAgICAgICAgaWYgKG5OZXh0ID09IEZYX0NCUF9UQikgew0KLSAgICAgICAgICAgICAgICBlVHlwZSA9IGJUYWJCcmVhayA/IEZYX0xCVF9ESVJFQ1RfQlJLIDogRlhfTEJUX1BST0hJQklURURfQlJLOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGVUeXBlID0gKigoY29uc3QgRlhfTElORUJSRUFLVFlQRSAqKWdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGUgKyAobkN1ciA8PCA1KSArIG5OZXh0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGJOdW1iZXJCcmVhayAmJiBuQ3VyID09IEZYX0NCUF9OVSAmJiBuTmV4dCA9PSBGWF9DQlBfTlUpIHsNCi0gICAgICAgICAgICBlVHlwZSA9IEZYX0xCVF9ESVJFQ1RfQlJLOw0KLSAgICAgICAgfSBlbHNlIGlmIChiSW5maXhCcmVhayAmJiBuQ3VyID09IEZYX0NCUF9JUyAmJiBuTmV4dCA9PSBGWF9DQlBfSVMpIHsNCi0gICAgICAgICAgICBlVHlwZSA9IEZYX0xCVF9ESVJFQ1RfQlJLOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAobk5leHQgPT0gRlhfQ0JQX1NQKSB7DQotICAgICAgICAgICAgICAgIGVUeXBlID0gRlhfTEJUX1BST0hJQklURURfQlJLOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGVUeXBlID0gKigoY29uc3QgRlhfTElORUJSRUFLVFlQRSAqKWdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGUgKyAobkN1ciA8PCA1KSArIG5OZXh0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoYkFsbENoYXJzKSB7DQotICAgICAgICAgICAgcEN1ci0+bV9uQnJlYWtUeXBlID0gZVR5cGU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJPbmx5QnJrKSB7DQotICAgICAgICAgICAgaUNoYXJXaWR0aCA9IHBDdXItPm1faUNoYXJXaWR0aDsNCi0gICAgICAgICAgICBGWF9CT09MIGJCcmVhayA9IEZBTFNFOw0KLSAgICAgICAgICAgIGlmIChuQ3VyID09IEZYX0NCUF9UQiAmJiBiVGFiQnJlYWspIHsNCi0gICAgICAgICAgICAgICAgYkJyZWFrID0gaUNoYXJXaWR0aCA+IDAgJiYgaUVuZFBvcyAtIGlDaGFyV2lkdGggPD0gbV9pTGluZUVuZDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBiQnJlYWsgPSBpRW5kUG9zIDw9IG1faUxpbmVFbmQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChtX2JTaW5nbGVMaW5lIHx8IG1fYk9ycGhhbkxpbmUgfHwgYkJyZWFrIHx8IGJOZWVkQnJlYWspIHsNCi0gICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IEZYX0xCVF9ESVJFQ1RfQlJLICYmIGlCcmVhayA8IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGlCcmVhayA9IGlMZW5ndGg7DQotICAgICAgICAgICAgICAgICAgICBpQnJlYWtQb3MgPSBpRW5kUG9zOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiQWxsQ2hhcnMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaUxlbmd0aDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGWF9MQlRfSU5ESVJFQ1RfQlJLICYmIGlJbmRpcmVjdCA8IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGlJbmRpcmVjdCA9IGlMZW5ndGg7DQotICAgICAgICAgICAgICAgICAgICBpSW5kaXJlY3RQb3MgPSBpRW5kUG9zOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChpTGFzdCA8IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGlMYXN0ID0gaUxlbmd0aDsNCi0gICAgICAgICAgICAgICAgICAgIGlMYXN0UG9zID0gaUVuZFBvczsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCi0gICAgICAgICAgICAgICAgaUVuZFBvcyAtPSBpQ2hhcldpZHRoOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIG5OZXh0ID0gbkNvZGVQcm9wICYgMHgwMDNGOw0KLSAgICAgICAgaUxlbmd0aCAtLTsNCi0gICAgfQ0KLSAgICBpZiAoYk9ubHlCcmspIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIGlmIChpQnJlYWsgPiAtMSkgew0KLSAgICAgICAgaUVuZFBvcyA9IGlCcmVha1BvczsNCi0gICAgICAgIHJldHVybiBpQnJlYWs7DQotICAgIH0NCi0gICAgaWYgKGlJbmRpcmVjdCA+IC0xKSB7DQotICAgICAgICBpRW5kUG9zID0gaUluZGlyZWN0UG9zOw0KLSAgICAgICAgcmV0dXJuIGlJbmRpcmVjdDsNCi0gICAgfQ0KLSAgICBpZiAoaUxhc3QgPiAtMSkgew0KLSAgICAgICAgaUVuZFBvcyA9IGlMYXN0UG9zOw0KLSAgICAgICAgcmV0dXJuIGlMYXN0Ow0KLSAgICB9DQotICAgIHJldHVybiAwOw0KLX0NCi12b2lkIENGWF9SVEZCcmVhazo6U3BsaXRUZXh0TGluZShDRlhfUlRGTGluZSAqcEN1ckxpbmUsIENGWF9SVEZMaW5lICpwTmV4dExpbmUsIEZYX0JPT0wgYkFsbENoYXJzKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBDdXJMaW5lICE9IE5VTEwgJiYgcE5leHRMaW5lICE9IE5VTEwpOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IHBDdXJMaW5lLT5Db3VudENoYXJzKCk7DQotICAgIGlmIChpQ291bnQgPCAyKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBpRW5kUG9zID0gcEN1ckxpbmUtPkdldExpbmVFbmQoKTsNCi0gICAgQ0ZYX1JURkNoYXJBcnJheSAmY3VyQ2hhcnMgPSBwQ3VyTGluZS0+bV9MaW5lQ2hhcnM7DQotICAgIGludDMyX3QgaUNoYXJQb3MgPSBHZXRCcmVha1BvcyhjdXJDaGFycywgaUVuZFBvcywgYkFsbENoYXJzLCBGQUxTRSk7DQotICAgIGlmIChpQ2hhclBvcyA8IDApIHsNCi0gICAgICAgIGlDaGFyUG9zID0gMDsNCi0gICAgfQ0KLSAgICBpQ2hhclBvcyArKzsNCi0gICAgaWYgKGlDaGFyUG9zID49IGlDb3VudCkgew0KLSAgICAgICAgcE5leHRMaW5lLT5SZW1vdmVBbGwoVFJVRSk7DQotICAgICAgICBDRlhfQ2hhciAqcFRDID0gY3VyQ2hhcnMuR2V0RGF0YVB0cihpQ2hhclBvcyAtIDEpOw0KLSAgICAgICAgcFRDLT5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfUlRGQ2hhckFycmF5ICZuZXh0Q2hhcnMgPSBwTmV4dExpbmUtPm1fTGluZUNoYXJzOw0KLSAgICBpbnQgY3VyX3NpemUgPSBjdXJDaGFycy5HZXRTaXplKCk7DQotICAgIG5leHRDaGFycy5TZXRTaXplKGN1cl9zaXplIC0gaUNoYXJQb3MpOw0KLSAgICBGWFNZU19tZW1jcHkobmV4dENoYXJzLkdldERhdGEoKSwgY3VyQ2hhcnMuR2V0RGF0YVB0cihpQ2hhclBvcyksIChjdXJfc2l6ZSAtIGlDaGFyUG9zKSAqIHNpemVvZihDRlhfUlRGQ2hhcikpOw0KLSAgICBpQ291bnQgLT0gaUNoYXJQb3M7DQotICAgIGN1cl9zaXplID0gY3VyQ2hhcnMuR2V0U2l6ZSgpOw0KLSAgICBjdXJDaGFycy5SZW1vdmVBdChjdXJfc2l6ZSAtIGlDb3VudCwgaUNvdW50KTsNCi0gICAgcE5leHRMaW5lLT5tX2lTdGFydCA9IHBDdXJMaW5lLT5tX2lTdGFydDsNCi0gICAgcE5leHRMaW5lLT5tX2lXaWR0aCA9IHBDdXJMaW5lLT5HZXRMaW5lRW5kKCkgLSBpRW5kUG9zOw0KLSAgICBwQ3VyTGluZS0+bV9pV2lkdGggPSBpRW5kUG9zOw0KLSAgICBDRlhfUlRGQ2hhciogdGMgPSBjdXJDaGFycy5HZXREYXRhUHRyKGlDaGFyUG9zIC0gMSk7DQotICAgIHRjLT5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsNCi0gICAgaUNvdW50ID0gbmV4dENoYXJzLkdldFNpemUoKTsNCi0gICAgQ0ZYX1JURkNoYXIgKnBOZXh0Q2hhcnMgPSBuZXh0Q2hhcnMuR2V0RGF0YSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIENGWF9SVEZDaGFyKiB0YyA9IHBOZXh0Q2hhcnMgKyBpOw0KLSAgICAgICAgaWYgKHRjLT5HZXRDaGFyVHlwZSgpID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsNCi0gICAgICAgICAgICBwQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMgLS07DQotICAgICAgICAgICAgcE5leHRMaW5lLT5tX2lBcmFiaWNDaGFycyArKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh0Yy0+bV9kd0xheW91dFN0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX01CQ1NDb2RlKSB7DQotICAgICAgICAgICAgcEN1ckxpbmUtPm1faU1CQ1NDaGFycyAtLTsNCi0gICAgICAgICAgICBwTmV4dExpbmUtPm1faU1CQ1NDaGFycyArKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHRjLT5tX2R3U3RhdHVzID0gMDsNCi0gICAgfQ0KLX0NCi1pbnQzMl90IENGWF9SVEZCcmVhazo6Q291bnRCcmVha1BpZWNlcygpIGNvbnN0DQotew0KLSAgICBDRlhfUlRGUGllY2VBcnJheSAqcFJURlBpZWNlcyA9IEdldFJURlBpZWNlcyhUUlVFKTsNCi0gICAgaWYgKHBSVEZQaWVjZXMgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgcmV0dXJuIHBSVEZQaWVjZXMtPkdldFNpemUoKTsNCi19DQotY29uc3QgQ0ZYX1JURlBpZWNlKiBDRlhfUlRGQnJlYWs6OkdldEJyZWFrUGllY2UoaW50MzJfdCBpbmRleCkgY29uc3QNCi17DQotICAgIENGWF9SVEZQaWVjZUFycmF5ICpwUlRGUGllY2VzID0gR2V0UlRGUGllY2VzKFRSVUUpOw0KLSAgICBpZiAocFJURlBpZWNlcyA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHBSVEZQaWVjZXMtPkdldFNpemUoKSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHBSVEZQaWVjZXMtPkdldFB0ckF0KGluZGV4KTsNCi19DQotdm9pZCBDRlhfUlRGQnJlYWs6OkdldExpbmVSZWN0KENGWF9SZWN0RiAmcmVjdCkgY29uc3QNCi17DQotICAgIHJlY3QudG9wID0gMDsNCi0gICAgQ0ZYX1JURkxpbmUgKnBSVEZMaW5lID0gR2V0UlRGTGluZShUUlVFKTsNCi0gICAgaWYgKHBSVEZMaW5lID09IE5VTEwpIHsNCi0gICAgICAgIHJlY3QubGVmdCA9ICgoRlhfRkxPQVQpbV9pTGluZVN0YXJ0KSAvIDIwMDAwLjBmOw0KLSAgICAgICAgcmVjdC53aWR0aCA9IHJlY3QuaGVpZ2h0ID0gMDsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICByZWN0LmxlZnQgPSAoKEZYX0ZMT0FUKXBSVEZMaW5lLT5tX2lTdGFydCkgLyAyMDAwMC4wZjsNCi0gICAgcmVjdC53aWR0aCA9ICgoRlhfRkxPQVQpcFJURkxpbmUtPm1faVdpZHRoKSAvIDIwMDAwLjBmOw0KLSAgICBDRlhfUlRGUGllY2VBcnJheSAmcnRmUGllY2VzID0gcFJURkxpbmUtPm1fTGluZVBpZWNlczsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBydGZQaWVjZXMuR2V0U2l6ZSgpOw0KKyAgICBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQogICAgIGlmIChpQ291bnQgPCAxKSB7DQotICAgICAgICByZWN0LndpZHRoID0gMDsNCi0gICAgICAgIHJldHVybjsNCisgICAgICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCiAgICAgfQ0KLSAgICBDRlhfUlRGUGllY2UgKnBCcmVha1BpZWNlOw0KLSAgICBpbnQzMl90IGlMaW5lSGVpZ2h0ID0gMCwgaU1heDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICBwQnJlYWtQaWVjZSA9IHJ0ZlBpZWNlcy5HZXRQdHJBdChpKTsNCi0gICAgICAgIGludDMyX3QgaUZvbnRIZWlnaHQgPSBGWFNZU19yb3VuZChwQnJlYWtQaWVjZS0+bV9pRm9udEhlaWdodCAqIHBCcmVha1BpZWNlLT5tX2lWZXJ0aWNhbFNjYWxlIC8gMTAwLjBmKTsNCi0gICAgICAgIGlNYXggPSBGWF9NQVgocEJyZWFrUGllY2UtPm1faUZvbnRTaXplLCBpRm9udEhlaWdodCk7DQotICAgICAgICBpZiAoaSA9PSAwKSB7DQotICAgICAgICAgICAgaUxpbmVIZWlnaHQgPSBpTWF4Ow0KLSAgICAgICAgfSBlbHNlIGlmIChpTGluZUhlaWdodCA8IGlNYXgpIHsNCi0gICAgICAgICAgICBpTGluZUhlaWdodCA9IGlNYXg7DQorICAgIENGWF9SVEZDaGFyJiB0YyA9IG1fcEN1ckxpbmUtPkdldENoYXIoaUNvdW50IC0gMSk7DQorICAgIHRjLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgaWYgKGR3U3RhdHVzIDw9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICByZXR1cm4gZHdTdGF0dXM7DQorICAgIH0NCisgIH0NCisgIG1faVJlYWR5ID0gKG1fcEN1ckxpbmUgPT0gJm1fUlRGTGluZTEpID8gMSA6IDI7DQorICBDRlhfUlRGTGluZSogcE5leHRMaW5lID0NCisgICAgICAobV9wQ3VyTGluZSA9PSAmbV9SVEZMaW5lMSkgPyAmbV9SVEZMaW5lMiA6ICZtX1JURkxpbmUxOw0KKyAgRlhfQk9PTCBiQWxsQ2hhcnMgPSAobV9pQWxpZ25tZW50ID4gRlhfUlRGTElORUFMSUdOTUVOVF9SaWdodCk7DQorICBDRlhfVFBPQXJyYXkgdHBvczsNCisgIGlmIChFbmRCcmVha19TcGxpdExpbmUocE5leHRMaW5lLCBiQWxsQ2hhcnMsIGR3U3RhdHVzKSkgew0KKyAgICBnb3RvIEVuZEJyZWFrX1JldDsNCisgIH0NCisgIGlmICghbV9iQ2hhckNvZGUpIHsNCisgICAgRW5kQnJlYWtfQmlkaUxpbmUodHBvcywgZHdTdGF0dXMpOw0KKyAgfQ0KKyAgaWYgKCFtX2JQYWdpbmF0aW9uICYmIG1faUFsaWdubWVudCA+IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCkgew0KKyAgICBFbmRCcmVha19BbGlnbm1lbnQodHBvcywgYkFsbENoYXJzLCBkd1N0YXR1cyk7DQorICB9DQorRW5kQnJlYWtfUmV0Og0KKyAgbV9wQ3VyTGluZSA9IHBOZXh0TGluZTsNCisgIG1fcEN1ckxpbmUtPm1faVN0YXJ0ID0gbV9pTGluZVN0YXJ0Ow0KKyAgQ0ZYX1JURkNoYXIqIHBUQyA9IEdldExhc3RDaGFyKDApOw0KKyAgbV9kd0NoYXJUeXBlID0gcFRDID09IE5VTEwgPyAwIDogcFRDLT5HZXRDaGFyVHlwZSgpOw0KKyAgcmV0dXJuIGR3U3RhdHVzOw0KK30NCitGWF9CT09MIENGWF9SVEZCcmVhazo6RW5kQnJlYWtfU3BsaXRMaW5lKENGWF9SVEZMaW5lKiBwTmV4dExpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzKSB7DQorICBGWF9CT09MIGJEb25lID0gRkFMU0U7DQorICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgIW1fYk9ycGhhbkxpbmUgJiYNCisgICAgICBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lMaW5lRW5kICsgbV9pVG9sZXJhbmNlKSB7DQorICAgIENGWF9SVEZDaGFyJiB0YyA9IG1fcEN1ckxpbmUtPkdldENoYXIobV9wQ3VyTGluZS0+Q291bnRDaGFycygpIC0gMSk7DQorICAgIHN3aXRjaCAodGMuR2V0Q2hhclR5cGUoKSkgew0KKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfVGFiOg0KKyAgICAgICAgaWYgKChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9UYWJCcmVhaykgIT0gMCkgew0KKyAgICAgICAgICBTcGxpdFRleHRMaW5lKG1fcEN1ckxpbmUsIHBOZXh0TGluZSwgIW1fYlBhZ2luYXRpb24gJiYgYkFsbENoYXJzKTsNCisgICAgICAgICAgYkRvbmUgPSBUUlVFOw0KICAgICAgICAgfQ0KLSAgICB9DQotICAgIHJlY3QuaGVpZ2h0ID0gKChGWF9GTE9BVClpTGluZUhlaWdodCkgLyAyMC4wZjsNCi19DQotdm9pZCBDRlhfUlRGQnJlYWs6OkNsZWFyQnJlYWtQaWVjZXMoKQ0KLXsNCi0gICAgQ0ZYX1JURkxpbmUgKnBSVEZMaW5lID0gR2V0UlRGTGluZShUUlVFKTsNCi0gICAgaWYgKHBSVEZMaW5lICE9IE5VTEwpIHsNCi0gICAgICAgIHBSVEZMaW5lLT5SZW1vdmVBbGwoVFJVRSk7DQotICAgIH0NCi0gICAgbV9pUmVhZHkgPSAwOw0KLX0NCi12b2lkIENGWF9SVEZCcmVhazo6UmVzZXQoKQ0KLXsNCi0gICAgbV9kd0NoYXJUeXBlID0gMDsNCi0gICAgbV9SVEZMaW5lMS5SZW1vdmVBbGwoVFJVRSk7DQotICAgIG1fUlRGTGluZTIuUmVtb3ZlQWxsKFRSVUUpOw0KLX0NCi1pbnQzMl90IENGWF9SVEZCcmVhazo6R2V0RGlzcGxheVBvcyhGWF9MUENSVEZURVhUT0JKIHBUZXh0LCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0JPT0wgYkNoYXJDb2RlICwgQ0ZYX1dpZGVTdHJpbmcgKnBXU0Zvcm1zICwgRlhfQWRqdXN0Q2hhckRpc3BsYXlQb3MgcEFkanVzdFBvcyApIGNvbnN0DQotew0KLSAgICBpZiAocFRleHQgPT0gTlVMTCB8fCBwVGV4dC0+aUxlbmd0aCA8IDEpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIEZYU1lTX2Fzc2VydChwVGV4dC0+cFN0ciAhPSBOVUxMICYmIHBUZXh0LT5wV2lkdGhzICE9IE5VTEwgJiYgcFRleHQtPnBGb250ICE9IE5VTEwgJiYgcFRleHQtPnBSZWN0ICE9IE5VTEwpOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHBUZXh0LT5wU3RyOw0KLSAgICBpbnQzMl90ICpwV2lkdGhzID0gcFRleHQtPnBXaWR0aHM7DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBUZXh0LT5pTGVuZ3RoIC0gMTsNCi0gICAgSUZYX0ZvbnQgKnBGb250ID0gcFRleHQtPnBGb250Ow0KLSAgICBGWF9EV09SRCBkd1N0eWxlcyA9IHBUZXh0LT5kd0xheW91dFN0eWxlczsNCi0gICAgQ0ZYX1JlY3RGIHJ0VGV4dCgqcFRleHQtPnBSZWN0KTsNCi0gICAgRlhfQk9PTCBiUlRMUGllY2UgPSBGWF9Jc09kZChwVGV4dC0+aUJpZGlMZXZlbCk7DQotICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IHBUZXh0LT5mRm9udFNpemU7DQotICAgIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KLSAgICBpbnQzMl90IGlBc2NlbnQgPSBwRm9udC0+R2V0QXNjZW50KCk7DQotICAgIGludDMyX3QgaURlc2NlbnQgPSBwRm9udC0+R2V0RGVzY2VudCgpOw0KLSAgICBpbnQzMl90IGlNYXhIZWlnaHQgPSBpQXNjZW50IC0gaURlc2NlbnQ7DQotICAgIEZYX0ZMT0FUIGZGb250SGVpZ2h0ID0gZkZvbnRTaXplOw0KLSAgICBGWF9GTE9BVCBmQXNjZW50ID0gZkZvbnRIZWlnaHQgKiAoRlhfRkxPQVQpaUFzY2VudCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0Ow0KLSAgICBGWF9GTE9BVCBmRGVzY2VudCA9IGZGb250SGVpZ2h0ICogKEZYX0ZMT0FUKWlEZXNjZW50IC8gKEZYX0ZMT0FUKWlNYXhIZWlnaHQ7DQotICAgIEZYX0JPT0wgYlZlcnRpY2FsRG9jID0gKGR3U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQpICE9IDA7DQotICAgIEZYX0JPT0wgYlZlcnRpY2FsQ2hhciA9IChkd1N0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMpICE9IDA7DQotICAgIEZYX0JPT0wgYkFyYWJpY051bWJlciA9IChkd1N0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX0FyYWJpY051bWJlcikgIT0gMDsNCi0gICAgRlhfQk9PTCBiTUJDU0NvZGUgPSAoZHdTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9NQkNTQ29kZSkgIT0gMDsNCi0gICAgaW50MzJfdCBpUm90YXRpb24gPSBHZXRMaW5lUm90YXRpb24oZHdTdHlsZXMpICsgcFRleHQtPmlDaGFyUm90YXRpb247DQotICAgIGludDMyX3QgaUNoYXJSb3RhdGlvbjsNCi0gICAgRlhfV0NIQVIgd2NoLCB3UHJldiA9IDB4RkVGRiwgd05leHQsIHdGb3JtOw0KLSAgICBpbnQzMl90IGlXaWR0aCwgaUNoYXJXaWR0aCwgaUNoYXJIZWlnaHQ7DQotICAgIEZYX0ZMT0FUIGZYLCBmWSwgZkNoYXJXaWR0aCwgZkNoYXJIZWlnaHQ7DQotICAgIGludDMyX3QgaUhvclNjYWxlID0gcFRleHQtPmlIb3Jpem9udGFsU2NhbGU7DQotICAgIGludDMyX3QgaVZlclNjYWxlID0gcFRleHQtPmlWZXJ0aWNhbFNjYWxlOw0KLSAgICBGWF9CT09MIGJFbXB0eUNoYXI7DQotICAgIEZYX0RXT1JEIGR3UHJvcHMsIGR3Q2hhclR5cGU7DQotICAgIGZYID0gcnRUZXh0LmxlZnQ7DQotICAgIGZZID0gcnRUZXh0LnRvcDsNCi0gICAgaWYgKGJWZXJ0aWNhbERvYykgew0KLSAgICAgICAgZlggKz0gKHJ0VGV4dC53aWR0aCAtIGZGb250U2l6ZSkgLyAyLjBmOw0KLSAgICAgICAgaWYgKGJSVExQaWVjZSkgew0KLSAgICAgICAgICAgIGZZID0gcnRUZXh0LmJvdHRvbSgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGWF9DSEFSVFlQRV9Db250cm9sOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGWF9DSEFSVFlQRV9TcGFjZToNCisgICAgICAgIGlmICgobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfU3BhY2VCcmVhaykgIT0gMCkgew0KKyAgICAgICAgICBTcGxpdFRleHRMaW5lKG1fcEN1ckxpbmUsIHBOZXh0TGluZSwgIW1fYlBhZ2luYXRpb24gJiYgYkFsbENoYXJzKTsNCisgICAgICAgICAgYkRvbmUgPSBUUlVFOw0KICAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIFNwbGl0VGV4dExpbmUobV9wQ3VyTGluZSwgcE5leHRMaW5lLCAhbV9iUGFnaW5hdGlvbiAmJiBiQWxsQ2hhcnMpOw0KKyAgICAgICAgYkRvbmUgPSBUUlVFOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChtX2JQYWdpbmF0aW9uIHx8IG1fcEN1ckxpbmUtPm1faU1CQ1NDaGFycyA+IDApIHsNCisgICAgY29uc3QgQ0ZYX1JURkNoYXIqIHBDdXJDaGFycyA9IG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzLkdldERhdGEoKTsNCisgICAgY29uc3QgQ0ZYX1JURkNoYXIqIHBUQzsNCisgICAgQ0ZYX1JURlBpZWNlQXJyYXkqIHBDdXJQaWVjZXMgPSAmbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzOw0KKyAgICBDRlhfUlRGUGllY2UgdHA7DQorICAgIHRwLm1fcENoYXJzID0gJm1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOw0KKyAgICBGWF9CT09MIGJOZXcgPSBUUlVFOw0KKyAgICBGWF9EV09SRCBkd0lkZW50aXR5ID0gKEZYX0RXT1JEKS0xOw0KKyAgICBpbnQzMl90IGlMYXN0ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpIC0gMSwgaiA9IDA7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8PSBpTGFzdDspIHsNCisgICAgICBwVEMgPSBwQ3VyQ2hhcnMgKyBpOw0KKyAgICAgIGlmIChiTmV3KSB7DQorICAgICAgICB0cC5tX2lTdGFydENoYXIgPSBpOw0KKyAgICAgICAgdHAubV9pU3RhcnRQb3MgKz0gdHAubV9pV2lkdGg7DQorICAgICAgICB0cC5tX2lXaWR0aCA9IDA7DQorICAgICAgICB0cC5tX2R3U3RhdHVzID0gcFRDLT5tX2R3U3RhdHVzOw0KKyAgICAgICAgdHAubV9pRm9udFNpemUgPSBwVEMtPm1faUZvbnRTaXplOw0KKyAgICAgICAgdHAubV9pRm9udEhlaWdodCA9IHBUQy0+bV9pRm9udEhlaWdodDsNCisgICAgICAgIHRwLm1faUhvcml6b250YWxTY2FsZSA9IHBUQy0+bV9pSG9yaXpvbnRhbFNjYWxlOw0KKyAgICAgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KKyAgICAgICAgdHAubV9kd0xheW91dFN0eWxlcyA9IHBUQy0+bV9kd0xheW91dFN0eWxlczsNCisgICAgICAgIGR3SWRlbnRpdHkgPSBwVEMtPm1fZHdJZGVudGl0eTsNCisgICAgICAgIHRwLm1fZHdJZGVudGl0eSA9IGR3SWRlbnRpdHk7DQorICAgICAgICB0cC5tX3BVc2VyRGF0YSA9IHBUQy0+bV9wVXNlckRhdGE7DQorICAgICAgICBqID0gaTsNCisgICAgICAgIGJOZXcgPSBGQUxTRTsNCisgICAgICB9DQorICAgICAgaWYgKGkgPT0gaUxhc3QgfHwgcFRDLT5tX2R3U3RhdHVzICE9IEZYX1JURkJSRUFLX05vbmUgfHwNCisgICAgICAgICAgcFRDLT5tX2R3SWRlbnRpdHkgIT0gZHdJZGVudGl0eSkgew0KKyAgICAgICAgdHAubV9pQ2hhcnMgPSBpIC0gajsNCisgICAgICAgIGlmIChwVEMtPm1fZHdJZGVudGl0eSA9PSBkd0lkZW50aXR5KSB7DQorICAgICAgICAgIHRwLm1fZHdTdGF0dXMgPSBwVEMtPm1fZHdTdGF0dXM7DQorICAgICAgICAgIHRwLm1faVdpZHRoICs9IHBUQy0+bV9pQ2hhcldpZHRoOw0KKyAgICAgICAgICB0cC5tX2lDaGFycyArPSAxOw0KKyAgICAgICAgICBpKys7DQorICAgICAgICB9DQorICAgICAgICBwQ3VyUGllY2VzLT5BZGQodHApOw0KKyAgICAgICAgYk5ldyA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHRwLm1faVdpZHRoICs9IHBUQy0+bV9pQ2hhcldpZHRoOw0KKyAgICAgICAgaSsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChiQWxsQ2hhcnMgJiYgIWJEb25lKSB7DQorICAgIGludDMyX3QgaUVuZFBvcyA9IG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKTsNCisgICAgR2V0QnJlYWtQb3MobV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnMsIGlFbmRQb3MsIGJBbGxDaGFycywgVFJVRSk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpFbmRCcmVha19CaWRpTGluZShDRlhfVFBPQXJyYXkmIHRwb3MsIEZYX0RXT1JEIGR3U3RhdHVzKSB7DQorICBGWF9UUE8gdHBvOw0KKyAgQ0ZYX1JURlBpZWNlIHRwOw0KKyAgQ0ZYX1JURkNoYXIqIHBUQzsNCisgIGludDMyX3QgaSwgajsNCisgIENGWF9SVEZDaGFyQXJyYXkmIGNoYXJzID0gbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnM7DQorICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgIEZYX0JPT0wgYkRvbmUgPSAoIW1fYlBhZ2luYXRpb24gJiYgIW1fYkNoYXJDb2RlICYmDQorICAgICAgICAgICAgICAgICAgIChtX3BDdXJMaW5lLT5tX2lBcmFiaWNDaGFycyA+IDAgfHwgbV9iUlRMKSk7DQorICBpZiAoYkRvbmUpIHsNCisgICAgaW50MzJfdCBpQmlkaU51bSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7DQorICAgICAgcFRDLT5tX2lCaWRpUG9zID0gaTsNCisgICAgICBpZiAocFRDLT5HZXRDaGFyVHlwZSgpICE9IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsNCisgICAgICAgIGlCaWRpTnVtID0gaTsNCisgICAgICB9DQorICAgICAgaWYgKGkgPT0gMCkgew0KKyAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAxOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9CaWRpTGluZShjaGFycywgaUJpZGlOdW0gKyAxLCBtX2JSVEwgPyAxIDogMCk7DQorICB9IGVsc2Ugew0KKyAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOw0KKyAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gMDsNCisgICAgICBwVEMtPm1faUJpZGlQb3MgPSAwOw0KKyAgICAgIHBUQy0+bV9pQmlkaU9yZGVyID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgdHAubV9kd1N0YXR1cyA9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWs7DQorICB0cC5tX2lTdGFydFBvcyA9IG1fcEN1ckxpbmUtPm1faVN0YXJ0Ow0KKyAgdHAubV9wQ2hhcnMgPSAmY2hhcnM7DQorICBDRlhfUlRGUGllY2VBcnJheSogcEN1clBpZWNlcyA9ICZtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXM7DQorICBpbnQzMl90IGlCaWRpTGV2ZWwgPSAtMSwgaUNoYXJXaWR0aDsNCisgIEZYX0RXT1JEIGR3SWRlbnRpdHkgPSAoRlhfRFdPUkQpLTE7DQorICBpID0gaiA9IDA7DQorICB3aGlsZSAoaSA8IGlDb3VudCkgew0KKyAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOw0KKyAgICBpZiAoaUJpZGlMZXZlbCA8IDApIHsNCisgICAgICBpQmlkaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7DQorICAgICAgaUNoYXJXaWR0aCA9IHBUQy0+bV9pQ2hhcldpZHRoOw0KKyAgICAgIGlmIChpQ2hhcldpZHRoIDwgMSkgew0KKyAgICAgICAgdHAubV9pV2lkdGggPSAwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB0cC5tX2lXaWR0aCA9IGlDaGFyV2lkdGg7DQorICAgICAgfQ0KKyAgICAgIHRwLm1faUJpZGlMZXZlbCA9IGlCaWRpTGV2ZWw7DQorICAgICAgdHAubV9pQmlkaVBvcyA9IHBUQy0+bV9pQmlkaU9yZGVyOw0KKyAgICAgIHRwLm1faUZvbnRTaXplID0gcFRDLT5tX2lGb250U2l6ZTsNCisgICAgICB0cC5tX2lGb250SGVpZ2h0ID0gcFRDLT5tX2lGb250SGVpZ2h0Ow0KKyAgICAgIHRwLm1faUhvcml6b250YWxTY2FsZSA9IHBUQy0+bV9pSG9yaXpvbnRhbFNjYWxlOw0KKyAgICAgIHRwLm1faVZlcnRpY2FsU2NhbGUgPSBwVEMtPm1faVZlcnRpYWxTY2FsZTsNCisgICAgICBkd0lkZW50aXR5ID0gcFRDLT5tX2R3SWRlbnRpdHk7DQorICAgICAgdHAubV9kd0lkZW50aXR5ID0gZHdJZGVudGl0eTsNCisgICAgICB0cC5tX3BVc2VyRGF0YSA9IHBUQy0+bV9wVXNlckRhdGE7DQorICAgICAgdHAubV9kd1N0YXR1cyA9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWs7DQorICAgICAgaSsrOw0KKyAgICB9IGVsc2UgaWYgKGlCaWRpTGV2ZWwgIT0gcFRDLT5tX2lCaWRpTGV2ZWwgfHwNCisgICAgICAgICAgICAgICBwVEMtPm1fZHdJZGVudGl0eSAhPSBkd0lkZW50aXR5KSB7DQorICAgICAgdHAubV9pQ2hhcnMgPSBpIC0gdHAubV9pU3RhcnRDaGFyOw0KKyAgICAgIHBDdXJQaWVjZXMtPkFkZCh0cCk7DQorICAgICAgdHAubV9pU3RhcnRQb3MgKz0gdHAubV9pV2lkdGg7DQorICAgICAgdHAubV9pU3RhcnRDaGFyID0gaTsNCisgICAgICB0cG8uaW5kZXggPSBqKys7DQorICAgICAgdHBvLnBvcyA9IHRwLm1faUJpZGlQb3M7DQorICAgICAgdHBvcy5BZGQodHBvKTsNCisgICAgICBpQmlkaUxldmVsID0gLTE7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoYlJUTFBpZWNlKSB7DQotICAgICAgICAgICAgZlggPSBydFRleHQucmlnaHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZZICs9IGZBc2NlbnQ7DQorICAgICAgaUNoYXJXaWR0aCA9IHBUQy0+bV9pQ2hhcldpZHRoOw0KKyAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgdHAubV9pV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgICB9DQorICAgICAgaSsrOw0KICAgICB9DQotICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IGlMZW5ndGg7IGkgKyspIHsNCi0gICAgICAgIHdjaCA9ICpwU3RyICsrOw0KLSAgICAgICAgaVdpZHRoID0gKnBXaWR0aHMgKys7DQotICAgICAgICBpZiAoIWJNQkNTQ29kZSkgew0KLSAgICAgICAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Y2gpOw0KLSAgICAgICAgICAgIGR3Q2hhclR5cGUgPSAoZHdQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spOw0KLSAgICAgICAgICAgIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgJiYgaVdpZHRoID09IDApIHsNCi0gICAgICAgICAgICAgICAgd1ByZXYgPSAweEZFRkY7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZHdQcm9wcyA9IDA7DQotICAgICAgICAgICAgZHdDaGFyVHlwZSA9IDA7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaVdpZHRoICE9IDApIHsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gaVdpZHRoOw0KLSAgICAgICAgICAgIGlmIChpQ2hhcldpZHRoIDwgMCkgew0KLSAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gLWlDaGFyV2lkdGg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghYk1CQ1NDb2RlKSB7DQotICAgICAgICAgICAgICAgIGJFbXB0eUNoYXIgPSAoZHdDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9UYWIgJiYgZHdDaGFyVHlwZSA8PSBGWF9DSEFSVFlQRV9Db250cm9sKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBiRW1wdHlDaGFyID0gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhcikgew0KLSAgICAgICAgICAgICAgICBpQ291bnQgKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwQ2hhclBvcyAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggLz0gaUZvbnRTaXplOw0KLSAgICAgICAgICAgICAgICB3Rm9ybSA9IHdjaDsNCi0gICAgICAgICAgICAgICAgaWYgKCFiTUJDU0NvZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChkd0NoYXJUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGlMZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd05leHQgPSAqcFN0cjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpwV2lkdGhzIDwgMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gcFN0clsxXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gMHhGRUZGOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB3Rm9ybSA9IG1fcEFyYWJpY0NoYXItPkdldEZvcm1DaGFyKHdjaCwgd1ByZXYsIHdOZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYlJUTFBpZWNlIHx8IGJWZXJ0aWNhbENoYXIpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3Rm9ybSA9IEZYX0dldE1pcnJvckNoYXIod2NoLCBkd1Byb3BzLCBiUlRMUGllY2UsIGJWZXJ0aWNhbENoYXIpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX051bWVyaWMgJiYgYkFyYWJpY051bWJlcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdGb3JtID0gd2NoICsgMHgwNjMwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdGb3JtKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpQ2hhclJvdGF0aW9uID0gaVJvdGF0aW9uOw0KLSAgICAgICAgICAgICAgICBpZiAoIWJNQkNTQ29kZSAmJiBiVmVydGljYWxDaGFyICYmIChkd1Byb3BzICYgMHg4MDAwKSAhPSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBpQ2hhclJvdGF0aW9uICsrOw0KLSAgICAgICAgICAgICAgICAgICAgaUNoYXJSb3RhdGlvbiAlPSA0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhcikgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJDaGFyQ29kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPSB3Y2g7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPSBwRm9udC0+R2V0R2x5cGhJbmRleCh3Rm9ybSwgYk1CQ1NDb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwQ2hhclBvcy0+bV9HbHlwaEluZGV4ID09IDB4RkZGRikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9HbHlwaEluZGV4ID0gcEZvbnQtPkdldEdseXBoSW5kZXgod2NoLCBiTUJDU0NvZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0V4dEdJRCA9IHBDaGFyUG9zLT5tX0dseXBoSW5kZXg7DQotICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9Gb250Q2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwV1NGb3Jtcykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwV1NGb3JtcyArPSB3Rm9ybTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoYlZlcnRpY2FsRG9jKSB7DQotICAgICAgICAgICAgICAgICAgICBpQ2hhckhlaWdodCA9IGlDaGFyV2lkdGg7DQotICAgICAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlDaGFySGVpZ2h0ID0gMTAwMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmQ2hhcldpZHRoID0gZkZvbnRTaXplICogaUNoYXJXaWR0aCAvIDEwMDAuMGY7DQotICAgICAgICAgICAgICAgIGZDaGFySGVpZ2h0ID0gZkZvbnRTaXplICogaUNoYXJIZWlnaHQgLyAxMDAwLjBmOw0KLSAgICAgICAgICAgICAgICBpZiAoIWJNQkNTQ29kZSAmJiBiUlRMUGllY2UgJiYgZHdDaGFyVHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZZIC09IGZDaGFySGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmWCAtPSBmQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhcikgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdE9mZnNldDsNCi0gICAgICAgICAgICAgICAgICAgIHB0T2Zmc2V0LlJlc2V0KCk7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGp1c3RlZCA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGp1c3RQb3MpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiQWRqdXN0ZWQgPSBwQWRqdXN0UG9zKHdGb3JtLCBiTUJDU0NvZGUsIHBGb250LCBmRm9udFNpemUsIGJWZXJ0aWNhbENoYXIsIHB0T2Zmc2V0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmICghcEFkanVzdFBvcyAmJiBiVmVydGljYWxDaGFyICYmIChkd1Byb3BzICYgMHgwMDAxMDAwMCkgIT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0IHJ0QkJveDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBydEJCb3guUmVzZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEZvbnQtPkdldENoYXJCQm94KHdGb3JtLCBydEJCb3gsIGJNQkNTQ29kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRPZmZzZXQueCA9IGZGb250U2l6ZSAqICg4NTAgLSBydEJCb3gucmlnaHQoKSkgLyAxMDAwLjBmOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdE9mZnNldC55ID0gZkZvbnRTaXplICogKDEwMDAgLSBydEJCb3guaGVpZ2h0KSAvIDIwMDAuMGY7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCA9IGZYICsgcHRPZmZzZXQueDsNCi0gICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgPSBmWSAtIHB0T2Zmc2V0Lnk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKCFiUlRMUGllY2UgJiYgZHdDaGFyVHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZZICs9IGZDaGFySGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmWCArPSBmQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhcikgew0KLSAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fYkdseXBoQWRqdXN0ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUNoYXJSb3RhdGlvbiA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZBc2NlbnQgKiBpVmVyU2NhbGUgLyAxMDAuMGY7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gLTE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IC0xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YIC09IGZEZXNjZW50ICsgZkFzY2VudCAqIGlWZXJTY2FsZSAvIDEwMC4wZiAtIGZBc2NlbnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDIpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gLTE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkNoYXJXaWR0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmQXNjZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkFzY2VudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlDaGFyUm90YXRpb24gPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAtMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmQXNjZW50ICogaVZlclNjYWxlIC8gMTAwLjBmIC0gZkFzY2VudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAtMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gLTE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggLT0gZkRlc2NlbnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgLT0gZkFzY2VudCArIGZEZXNjZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA9PSAyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IC0xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZDaGFyV2lkdGg7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgLT0gZkFzY2VudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZBc2NlbnQgKiBpVmVyU2NhbGUgLyAxMDAuMGY7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlIb3JTY2FsZSAhPSAxMDAgfHwgaVZlclNjYWxlICE9IDEwMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSAqIGlIb3JTY2FsZSAvIDEwMC4wZjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gKiBpSG9yU2NhbGUgLyAxMDAuMGY7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdICogaVZlclNjYWxlIC8gMTAwLjBmOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSAqIGlWZXJTY2FsZSAvIDEwMC4wZjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zICsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlXaWR0aCA+IDApIHsNCi0gICAgICAgICAgICB3UHJldiA9IHdjaDsNCi0gICAgICAgIH0NCisgIH0NCisgIGlmIChpID4gdHAubV9pU3RhcnRDaGFyKSB7DQorICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgdHAubV9pQ2hhcnMgPSBpIC0gdHAubV9pU3RhcnRDaGFyOw0KKyAgICBwQ3VyUGllY2VzLT5BZGQodHApOw0KKyAgICB0cG8uaW5kZXggPSBqOw0KKyAgICB0cG8ucG9zID0gdHAubV9pQmlkaVBvczsNCisgICAgdHBvcy5BZGQodHBvKTsNCisgIH0NCisgIGlmICghbV9iQ2hhckNvZGUpIHsNCisgICAgaiA9IHRwb3MuR2V0U2l6ZSgpIC0gMTsNCisgICAgRlhfVEVYVExBWU9VVF9QaWVjZVNvcnQodHBvcywgMCwgaik7DQorICAgIGludDMyX3QgaVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQorICAgIGZvciAoaSA9IDA7IGkgPD0gajsgaSsrKSB7DQorICAgICAgdHBvID0gdHBvcy5HZXRBdChpKTsNCisgICAgICBDRlhfUlRGUGllY2UmIHR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgICAgdHRwLm1faVN0YXJ0UG9zID0gaVN0YXJ0UG9zOw0KKyAgICAgIGlTdGFydFBvcyArPSB0dHAubV9pV2lkdGg7DQogICAgIH0NCi0gICAgcmV0dXJuIGlDb3VudDsNCisgIH0NCiB9DQotaW50MzJfdCBDRlhfUlRGQnJlYWs6OkdldENoYXJSZWN0cyhGWF9MUENSVEZURVhUT0JKIHBUZXh0LCBDRlhfUmVjdEZBcnJheSAmcnRBcnJheSwgRlhfQk9PTCBiQ2hhckJCb3ggKSBjb25zdA0KLXsNCi0gICAgaWYgKHBUZXh0ID09IE5VTEwgfHwgcFRleHQtPmlMZW5ndGggPCAxKSB7DQotICAgICAgICByZXR1cm4gMDsNCit2b2lkIENGWF9SVEZCcmVhazo6RW5kQnJlYWtfQWxpZ25tZW50KENGWF9UUE9BcnJheSYgdHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMpIHsNCisgIENGWF9SVEZQaWVjZUFycmF5KiBwQ3VyUGllY2VzID0gJm1fcEN1ckxpbmUtPm1fTGluZVBpZWNlczsNCisgIGludDMyX3QgaU5ldFdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGgsIGlHYXBDaGFycyA9IDAsIGlDaGFyV2lkdGg7DQorICBpbnQzMl90IGlDb3VudCA9IHBDdXJQaWVjZXMtPkdldFNpemUoKTsNCisgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsNCisgIEZYX0RXT1JEIGR3Q2hhclR5cGU7DQorICBpbnQzMl90IGksIGo7DQorICBGWF9UUE8gdHBvOw0KKyAgZm9yIChpID0gaUNvdW50IC0gMTsgaSA+IC0xOyBpLS0pIHsNCisgICAgdHBvID0gdHBvcy5HZXRBdChpKTsNCisgICAgQ0ZYX1JURlBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdCh0cG8uaW5kZXgpOw0KKyAgICBpZiAoIWJGaW5kKSB7DQorICAgICAgaU5ldFdpZHRoID0gdHRwLkdldEVuZFBvcygpOw0KICAgICB9DQotICAgIEZYU1lTX2Fzc2VydChwVGV4dC0+cFN0ciAhPSBOVUxMICYmIHBUZXh0LT5wV2lkdGhzICE9IE5VTEwgJiYgcFRleHQtPnBGb250ICE9IE5VTEwgJiYgcFRleHQtPnBSZWN0ICE9IE5VTEwpOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHBUZXh0LT5wU3RyOw0KLSAgICBpbnQzMl90ICpwV2lkdGhzID0gcFRleHQtPnBXaWR0aHM7DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBUZXh0LT5pTGVuZ3RoOw0KLSAgICBDRlhfUmVjdEYgcmVjdCgqcFRleHQtPnBSZWN0KTsNCi0gICAgRlhfQk9PTCBiUlRMUGllY2UgPSBGWF9Jc09kZChwVGV4dC0+aUJpZGlMZXZlbCk7DQotICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IHBUZXh0LT5mRm9udFNpemU7DQotICAgIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KLSAgICBGWF9GTE9BVCBmU2NhbGUgPSBmRm9udFNpemUgLyAxMDAwLjBmOw0KLSAgICBJRlhfRm9udCAqcEZvbnQgPSBwVGV4dC0+cEZvbnQ7DQotICAgIGlmIChwRm9udCA9PSBOVUxMKSB7DQotICAgICAgICBiQ2hhckJCb3ggPSBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfUmVjdCBiYm94Ow0KLSAgICBiYm94LlNldCgwLCAwLCAwLCAwKTsNCi0gICAgaWYgKGJDaGFyQkJveCkgew0KLSAgICAgICAgYkNoYXJCQm94ID0gcEZvbnQtPkdldEJCb3goYmJveCk7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZkxlZnQgPSBGWF9NQVgoMCwgYmJveC5sZWZ0ICogZlNjYWxlKTsNCi0gICAgRlhfRkxPQVQgZkhlaWdodCA9IEZYU1lTX2ZhYnMoYmJveC5oZWlnaHQgKiBmU2NhbGUpOw0KLSAgICBydEFycmF5LlJlbW92ZUFsbCgpOw0KLSAgICBydEFycmF5LlNldFNpemUoaUxlbmd0aCk7DQotICAgIEZYX0RXT1JEIGR3U3R5bGVzID0gcFRleHQtPmR3TGF5b3V0U3R5bGVzOw0KLSAgICBGWF9CT09MIGJWZXJ0aWNhbCA9IChkd1N0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0KSAhPSAwOw0KLSAgICBGWF9CT09MIGJNQkNTQ29kZSA9IChkd1N0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX01CQ1NDb2RlKSAhPSAwOw0KLSAgICBGWF9CT09MIGJTaW5nbGVMaW5lID0gKGR3U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfU2luZ2xlTGluZSkgIT0gMDsNCi0gICAgRlhfQk9PTCBiQ29tYlRleHQgPSAoZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9Db21iVGV4dCkgIT0gMDsNCi0gICAgRlhfV0NIQVIgd2NoLCB3TGluZUJyZWFrQ2hhciA9IHBUZXh0LT53TGluZUJyZWFrQ2hhcjsNCi0gICAgaW50MzJfdCBpQ2hhclNpemU7DQotICAgIEZYX0ZMT0FUIGZDaGFyU2l6ZSwgZlN0YXJ0Ow0KLSAgICBpZiAoYlZlcnRpY2FsKSB7DQotICAgICAgICBmU3RhcnQgPSBiUlRMUGllY2UgPyByZWN0LmJvdHRvbSgpIDogcmVjdC50b3A7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBmU3RhcnQgPSBiUlRMUGllY2UgPyByZWN0LnJpZ2h0KCkgOiByZWN0LmxlZnQ7DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbmd0aDsgaSArKykgew0KLSAgICAgICAgd2NoID0gKnBTdHIgKys7DQotICAgICAgICBpQ2hhclNpemUgPSAqcFdpZHRocyArKzsNCi0gICAgICAgIGZDaGFyU2l6ZSA9IChGWF9GTE9BVClpQ2hhclNpemUgLyAyMDAwMC4wZjsNCi0gICAgICAgIEZYX0JPT0wgYlJldCA9ICghYlNpbmdsZUxpbmUgJiYgRlhfSXNDdHJsQ29kZSh3Y2gpKTsNCi0gICAgICAgIGlmICghKHdjaCA9PSBMJ1x2JyB8fCB3Y2ggPT0gTCdcZicgfHwgd2NoID09IDB4MjAyOCB8fCB3Y2ggPT0gMHgyMDI5IHx8ICh3TGluZUJyZWFrQ2hhciAhPSAweEZFRkYgJiYgd2NoID09IHdMaW5lQnJlYWtDaGFyKSkpIHsNCi0gICAgICAgICAgICBiUmV0ID0gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYlJldCkgew0KLSAgICAgICAgICAgIGlDaGFyU2l6ZSA9IGlGb250U2l6ZSAqIDUwMDsNCi0gICAgICAgICAgICBmQ2hhclNpemUgPSBmRm9udFNpemUgLyAyLjBmOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KLSAgICAgICAgICAgIHJlY3QudG9wID0gZlN0YXJ0Ow0KLSAgICAgICAgICAgIGlmIChiUlRMUGllY2UpIHsNCi0gICAgICAgICAgICAgICAgcmVjdC50b3AgLT0gZkNoYXJTaXplOw0KLSAgICAgICAgICAgICAgICBmU3RhcnQgLT0gZkNoYXJTaXplOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGZTdGFydCArPSBmQ2hhclNpemU7DQorICAgIEZYX0JPT0wgYkFyYWJpYyA9IEZYX0lzT2RkKHR0cC5tX2lCaWRpTGV2ZWwpOw0KKyAgICBqID0gYkFyYWJpYyA/IDAgOiB0dHAubV9pQ2hhcnMgLSAxOw0KKyAgICB3aGlsZSAoaiA+IC0xICYmIGogPCB0dHAubV9pQ2hhcnMpIHsNCisgICAgICBjb25zdCBDRlhfUlRGQ2hhciYgdGMgPSB0dHAuR2V0Q2hhcihqKTsNCisgICAgICBpZiAodGMubV9uQnJlYWtUeXBlID09IEZYX0xCVF9ESVJFQ1RfQlJLKSB7DQorICAgICAgICBpR2FwQ2hhcnMrKzsNCisgICAgICB9DQorICAgICAgaWYgKCFiRmluZCB8fCAhYkFsbENoYXJzKSB7DQorICAgICAgICBkd0NoYXJUeXBlID0gdGMuR2V0Q2hhclR5cGUoKTsNCisgICAgICAgIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX1NwYWNlIHx8DQorICAgICAgICAgICAgZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9Db250cm9sKSB7DQorICAgICAgICAgIGlmICghYkZpbmQpIHsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gdGMubV9pQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIGlmIChiQWxsQ2hhcnMgJiYgaUNoYXJXaWR0aCA+IDApIHsNCisgICAgICAgICAgICAgIGlOZXRXaWR0aCAtPSBpQ2hhcldpZHRoOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZWN0LmhlaWdodCA9IGZDaGFyU2l6ZTsNCisgICAgICAgICAgfQ0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZWN0LmxlZnQgPSBmU3RhcnQ7DQotICAgICAgICAgICAgaWYgKGJSVExQaWVjZSkgew0KLSAgICAgICAgICAgICAgICByZWN0LmxlZnQgLT0gZkNoYXJTaXplOw0KLSAgICAgICAgICAgICAgICBmU3RhcnQgLT0gZkNoYXJTaXplOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGZTdGFydCArPSBmQ2hhclNpemU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlY3Qud2lkdGggPSBmQ2hhclNpemU7DQorICAgICAgICAgIGJGaW5kID0gVFJVRTsNCisgICAgICAgICAgaWYgKCFiQWxsQ2hhcnMpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJDaGFyQkJveCAmJiAhYlJldCkgew0KLSAgICAgICAgICAgIGludDMyX3QgaUNoYXJXaWR0aCA9IDEwMDA7DQotICAgICAgICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCh3Y2gsIGlDaGFyV2lkdGgpOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZSVExlZnQgPSAwLCBmQ2hhcldpZHRoID0gMDsNCi0gICAgICAgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCi0gICAgICAgICAgICAgICAgZkNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBmU2NhbGU7DQotICAgICAgICAgICAgICAgIGZSVExlZnQgPSBmTGVmdDsNCi0gICAgICAgICAgICAgICAgaWYgKGJDb21iVGV4dCkgew0KLSAgICAgICAgICAgICAgICAgICAgZlJUTGVmdCA9IChyZWN0LndpZHRoIC0gZkNoYXJXaWR0aCkgLyAyLjBmOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9SZWN0RiBydEJCb3hGOw0KLSAgICAgICAgICAgIGlmIChiVmVydGljYWwpIHsNCi0gICAgICAgICAgICAgICAgcnRCQm94Ri50b3AgPSByZWN0LmxlZnQgKyBmUlRMZWZ0Ow0KLSAgICAgICAgICAgICAgICBydEJCb3hGLmxlZnQgPSByZWN0LnRvcCArIChyZWN0LmhlaWdodCAtIGZIZWlnaHQpIC8gMi4wZjsNCi0gICAgICAgICAgICAgICAgcnRCQm94Ri5oZWlnaHQgPSBmQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICBydEJCb3hGLndpZHRoID0gZkhlaWdodDsNCi0gICAgICAgICAgICAgICAgcnRCQm94Ri5sZWZ0ID0gRlhfTUFYKHJ0QkJveEYubGVmdCwgMCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcnRCQm94Ri5sZWZ0ID0gcmVjdC5sZWZ0ICsgZlJUTGVmdDsNCi0gICAgICAgICAgICAgICAgcnRCQm94Ri50b3AgPSByZWN0LnRvcCArIChyZWN0LmhlaWdodCAtIGZIZWlnaHQpIC8gMi4wZjsNCi0gICAgICAgICAgICAgICAgcnRCQm94Ri53aWR0aCA9IGZDaGFyV2lkdGg7DQotICAgICAgICAgICAgICAgIHJ0QkJveEYuaGVpZ2h0ID0gZkhlaWdodDsNCi0gICAgICAgICAgICAgICAgcnRCQm94Ri50b3AgPSBGWF9NQVgocnRCQm94Ri50b3AsIDApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBydEFycmF5LlNldEF0KGksIHJ0QkJveEYpOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBqICs9IGJBcmFiaWMgPyAxIDogLTE7DQorICAgIH0NCisgICAgaWYgKCFiQWxsQ2hhcnMgJiYgYkZpbmQpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpT2Zmc2V0ID0gbV9pTGluZUVuZCAtIGlOZXRXaWR0aDsNCisgIGludDMyX3QgaUxvd2VyQWxpZ25tZW50ID0gKG1faUFsaWdubWVudCAmIEZYX1JURkxJTkVBTElHTk1FTlRfTG93ZXJNYXNrKTsNCisgIGludDMyX3QgaUhpZ2hlckFsaWdubWVudCA9IChtX2lBbGlnbm1lbnQgJiBGWF9SVEZMSU5FQUxJR05NRU5UX0hpZ2hlck1hc2spOw0KKyAgaWYgKGlHYXBDaGFycyA+IDAgJiYgKGlIaWdoZXJBbGlnbm1lbnQgPT0gRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpSGlnaGVyQWxpZ25tZW50ID09IEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzICE9IEZYX1JURkJSRUFLX1BhcmFncmFwaEJyZWFrKSkpIHsNCisgICAgaW50MzJfdCBpU3RhcnQgPSAtMTsNCisgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgdHBvID0gdHBvcy5HZXRBdChpKTsNCisgICAgICBDRlhfUlRGUGllY2UmIHR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgICAgaWYgKGlTdGFydCA8IDApIHsNCisgICAgICAgIGlTdGFydCA9IHR0cC5tX2lTdGFydFBvczsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgdHRwLm1faVN0YXJ0UG9zID0gaVN0YXJ0Ow0KKyAgICAgIH0NCisgICAgICBpbnQzMl90IGs7DQorICAgICAgZm9yIChqID0gMDsgaiA8IHR0cC5tX2lDaGFyczsgaisrKSB7DQorICAgICAgICBDRlhfUlRGQ2hhciYgdGMgPSB0dHAuR2V0Q2hhcihqKTsNCisgICAgICAgIGlmICh0Yy5tX25CcmVha1R5cGUgIT0gRlhfTEJUX0RJUkVDVF9CUksgfHwgdGMubV9pQ2hhcldpZHRoIDwgMCkgew0KKyAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCi0gICAgICAgIHJ0QXJyYXkuU2V0QXQoaSwgcmVjdCk7DQorICAgICAgICBrID0gaU9mZnNldCAvIGlHYXBDaGFyczsNCisgICAgICAgIHRjLm1faUNoYXJXaWR0aCArPSBrOw0KKyAgICAgICAgdHRwLm1faVdpZHRoICs9IGs7DQorICAgICAgICBpT2Zmc2V0IC09IGs7DQorICAgICAgICBpR2FwQ2hhcnMtLTsNCisgICAgICAgIGlmIChpR2FwQ2hhcnMgPCAxKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpU3RhcnQgKz0gdHRwLm1faVdpZHRoOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKGlMb3dlckFsaWdubWVudCA+IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCkgew0KKyAgICBpZiAoaUxvd2VyQWxpZ25tZW50ID09IEZYX1JURkxJTkVBTElHTk1FTlRfQ2VudGVyKSB7DQorICAgICAgaU9mZnNldCAvPSAyOw0KKyAgICB9DQorICAgIGlmIChpT2Zmc2V0ID4gMCkgew0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgQ0ZYX1JURlBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdChpKTsNCisgICAgICAgIHR0cC5tX2lTdGFydFBvcyArPSBpT2Zmc2V0Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCitpbnQzMl90IENGWF9SVEZCcmVhazo6R2V0QnJlYWtQb3MoQ0ZYX1JURkNoYXJBcnJheSYgdGNhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRW5kUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seUJyaykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gdGNhLkdldFNpemUoKSAtIDE7DQorICBpZiAoaUxlbmd0aCA8IDEpIHsNCisgICAgcmV0dXJuIGlMZW5ndGg7DQorICB9DQorICBpbnQzMl90IGlCcmVhayA9IC0xLCBpQnJlYWtQb3MgPSAtMSwgaUluZGlyZWN0ID0gLTEsIGlJbmRpcmVjdFBvcyA9IC0xLA0KKyAgICAgICAgICBpTGFzdCA9IC0xLCBpTGFzdFBvcyA9IC0xOw0KKyAgaWYgKG1fYlNpbmdsZUxpbmUgfHwgbV9iT3JwaGFuTGluZSB8fCBpRW5kUG9zIDw9IG1faUxpbmVFbmQpIHsNCisgICAgaWYgKCFiQWxsQ2hhcnMgfHwgbV9iQ2hhckNvZGUpIHsNCisgICAgICByZXR1cm4gaUxlbmd0aDsNCisgICAgfQ0KKyAgICBpQnJlYWsgPSBpTGVuZ3RoOw0KKyAgICBpQnJlYWtQb3MgPSBpRW5kUG9zOw0KKyAgfQ0KKyAgQ0ZYX1JURkNoYXIqIHBDaGFyQXJyYXkgPSB0Y2EuR2V0RGF0YSgpOw0KKyAgaWYgKG1fYkNoYXJDb2RlKSB7DQorICAgIGNvbnN0IENGWF9SVEZDaGFyKiBwQ2hhcjsNCisgICAgaW50MzJfdCBpQ2hhcldpZHRoOw0KKyAgICB3aGlsZSAoaUxlbmd0aCA+IDApIHsNCisgICAgICBpZiAoaUVuZFBvcyA8PSBtX2lMaW5lRW5kKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgcENoYXIgPSBwQ2hhckFycmF5ICsgaUxlbmd0aC0tOw0KKyAgICAgIGlDaGFyV2lkdGggPSBwQ2hhci0+bV9pQ2hhcldpZHRoOw0KKyAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgaUVuZFBvcyAtPSBpQ2hhcldpZHRoOw0KKyAgICAgIH0NCiAgICAgfQ0KICAgICByZXR1cm4gaUxlbmd0aDsNCisgIH0NCisgIEZYX0JPT0wgYlNwYWNlQnJlYWsgPSAobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfU3BhY2VCcmVhaykgIT0gMDsNCisgIEZYX0JPT0wgYlRhYkJyZWFrID0gKG1fZHdQb2xpY2llcyAmIEZYX1JURkJSRUFLUE9MSUNZX1RhYkJyZWFrKSAhPSAwOw0KKyAgRlhfQk9PTCBiTnVtYmVyQnJlYWsgPSAobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfTnVtYmVyQnJlYWspICE9IDA7DQorICBGWF9CT09MIGJJbmZpeEJyZWFrID0gKG1fZHdQb2xpY2llcyAmIEZYX1JURkJSRUFLUE9MSUNZX0luZml4QnJlYWspICE9IDA7DQorICBGWF9MSU5FQlJFQUtUWVBFIGVUeXBlOw0KKyAgRlhfRFdPUkQgbkNvZGVQcm9wLCBuQ3VyLCBuTmV4dDsNCisgIENGWF9SVEZDaGFyKiBwQ3VyID0gcENoYXJBcnJheSArIGlMZW5ndGgtLTsNCisgIGlmIChiQWxsQ2hhcnMpIHsNCisgICAgcEN1ci0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047DQorICB9DQorICBuQ29kZVByb3AgPSBwQ3VyLT5tX2R3Q2hhclByb3BzOw0KKyAgbk5leHQgPSBuQ29kZVByb3AgJiAweDAwM0Y7DQorICBpbnQzMl90IGlDaGFyV2lkdGggPSBwQ3VyLT5tX2lDaGFyV2lkdGg7DQorICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgaUVuZFBvcyAtPSBpQ2hhcldpZHRoOw0KKyAgfQ0KKyAgd2hpbGUgKGlMZW5ndGggPj0gMCkgew0KKyAgICBwQ3VyID0gcENoYXJBcnJheSArIGlMZW5ndGg7DQorICAgIG5Db2RlUHJvcCA9IHBDdXItPm1fZHdDaGFyUHJvcHM7DQorICAgIG5DdXIgPSBuQ29kZVByb3AgJiAweDAwM0Y7DQorICAgIEZYX0JPT0wgYk5lZWRCcmVhayA9IEZBTFNFOw0KKyAgICBpZiAobkN1ciA9PSBGWF9DQlBfU1ApIHsNCisgICAgICBiTmVlZEJyZWFrID0gIWJTcGFjZUJyZWFrOw0KKyAgICAgIGlmIChuTmV4dCA9PSBGWF9DQlBfU1ApIHsNCisgICAgICAgIGVUeXBlID0gYlNwYWNlQnJlYWsgPyBGWF9MQlRfRElSRUNUX0JSSyA6IEZYX0xCVF9QUk9ISUJJVEVEX0JSSzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZVR5cGUgPSAqKChjb25zdCBGWF9MSU5FQlJFQUtUWVBFKilnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlICsNCisgICAgICAgICAgICAgICAgICAobkN1ciA8PCA1KSArIG5OZXh0KTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAobkN1ciA9PSBGWF9DQlBfVEIpIHsNCisgICAgICBiTmVlZEJyZWFrID0gIWJUYWJCcmVhazsNCisgICAgICBpZiAobk5leHQgPT0gRlhfQ0JQX1RCKSB7DQorICAgICAgICBlVHlwZSA9IGJUYWJCcmVhayA/IEZYX0xCVF9ESVJFQ1RfQlJLIDogRlhfTEJUX1BST0hJQklURURfQlJLOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBlVHlwZSA9ICooKGNvbnN0IEZYX0xJTkVCUkVBS1RZUEUqKWdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGUgKw0KKyAgICAgICAgICAgICAgICAgIChuQ3VyIDw8IDUpICsgbk5leHQpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChiTnVtYmVyQnJlYWsgJiYgbkN1ciA9PSBGWF9DQlBfTlUgJiYgbk5leHQgPT0gRlhfQ0JQX05VKSB7DQorICAgICAgZVR5cGUgPSBGWF9MQlRfRElSRUNUX0JSSzsNCisgICAgfSBlbHNlIGlmIChiSW5maXhCcmVhayAmJiBuQ3VyID09IEZYX0NCUF9JUyAmJiBuTmV4dCA9PSBGWF9DQlBfSVMpIHsNCisgICAgICBlVHlwZSA9IEZYX0xCVF9ESVJFQ1RfQlJLOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChuTmV4dCA9PSBGWF9DQlBfU1ApIHsNCisgICAgICAgIGVUeXBlID0gRlhfTEJUX1BST0hJQklURURfQlJLOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBlVHlwZSA9ICooKGNvbnN0IEZYX0xJTkVCUkVBS1RZUEUqKWdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGUgKw0KKyAgICAgICAgICAgICAgICAgIChuQ3VyIDw8IDUpICsgbk5leHQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYkFsbENoYXJzKSB7DQorICAgICAgcEN1ci0+bV9uQnJlYWtUeXBlID0gZVR5cGU7DQorICAgIH0NCisgICAgaWYgKCFiT25seUJyaykgew0KKyAgICAgIGlDaGFyV2lkdGggPSBwQ3VyLT5tX2lDaGFyV2lkdGg7DQorICAgICAgRlhfQk9PTCBiQnJlYWsgPSBGQUxTRTsNCisgICAgICBpZiAobkN1ciA9PSBGWF9DQlBfVEIgJiYgYlRhYkJyZWFrKSB7DQorICAgICAgICBiQnJlYWsgPSBpQ2hhcldpZHRoID4gMCAmJiBpRW5kUG9zIC0gaUNoYXJXaWR0aCA8PSBtX2lMaW5lRW5kOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBiQnJlYWsgPSBpRW5kUG9zIDw9IG1faUxpbmVFbmQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX2JTaW5nbGVMaW5lIHx8IG1fYk9ycGhhbkxpbmUgfHwgYkJyZWFrIHx8IGJOZWVkQnJlYWspIHsNCisgICAgICAgIGlmIChlVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSyAmJiBpQnJlYWsgPCAwKSB7DQorICAgICAgICAgIGlCcmVhayA9IGlMZW5ndGg7DQorICAgICAgICAgIGlCcmVha1BvcyA9IGlFbmRQb3M7DQorICAgICAgICAgIGlmICghYkFsbENoYXJzKSB7DQorICAgICAgICAgICAgcmV0dXJuIGlMZW5ndGg7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRlhfTEJUX0lORElSRUNUX0JSSyAmJiBpSW5kaXJlY3QgPCAwKSB7DQorICAgICAgICAgIGlJbmRpcmVjdCA9IGlMZW5ndGg7DQorICAgICAgICAgIGlJbmRpcmVjdFBvcyA9IGlFbmRQb3M7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUxhc3QgPCAwKSB7DQorICAgICAgICAgIGlMYXN0ID0gaUxlbmd0aDsNCisgICAgICAgICAgaUxhc3RQb3MgPSBpRW5kUG9zOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgICAgIGlFbmRQb3MgLT0gaUNoYXJXaWR0aDsNCisgICAgICB9DQorICAgIH0NCisgICAgbk5leHQgPSBuQ29kZVByb3AgJiAweDAwM0Y7DQorICAgIGlMZW5ndGgtLTsNCisgIH0NCisgIGlmIChiT25seUJyaykgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChpQnJlYWsgPiAtMSkgew0KKyAgICBpRW5kUG9zID0gaUJyZWFrUG9zOw0KKyAgICByZXR1cm4gaUJyZWFrOw0KKyAgfQ0KKyAgaWYgKGlJbmRpcmVjdCA+IC0xKSB7DQorICAgIGlFbmRQb3MgPSBpSW5kaXJlY3RQb3M7DQorICAgIHJldHVybiBpSW5kaXJlY3Q7DQorICB9DQorICBpZiAoaUxhc3QgPiAtMSkgew0KKyAgICBpRW5kUG9zID0gaUxhc3RQb3M7DQorICAgIHJldHVybiBpTGFzdDsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6U3BsaXRUZXh0TGluZShDRlhfUlRGTGluZSogcEN1ckxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JURkxpbmUqIHBOZXh0TGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycykgew0KKyAgRlhTWVNfYXNzZXJ0KHBDdXJMaW5lICE9IE5VTEwgJiYgcE5leHRMaW5lICE9IE5VTEwpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgaWYgKGlDb3VudCA8IDIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpRW5kUG9zID0gcEN1ckxpbmUtPkdldExpbmVFbmQoKTsNCisgIENGWF9SVEZDaGFyQXJyYXkmIGN1ckNoYXJzID0gcEN1ckxpbmUtPm1fTGluZUNoYXJzOw0KKyAgaW50MzJfdCBpQ2hhclBvcyA9IEdldEJyZWFrUG9zKGN1ckNoYXJzLCBpRW5kUG9zLCBiQWxsQ2hhcnMsIEZBTFNFKTsNCisgIGlmIChpQ2hhclBvcyA8IDApIHsNCisgICAgaUNoYXJQb3MgPSAwOw0KKyAgfQ0KKyAgaUNoYXJQb3MrKzsNCisgIGlmIChpQ2hhclBvcyA+PSBpQ291bnQpIHsNCisgICAgcE5leHRMaW5lLT5SZW1vdmVBbGwoVFJVRSk7DQorICAgIENGWF9DaGFyKiBwVEMgPSBjdXJDaGFycy5HZXREYXRhUHRyKGlDaGFyUG9zIC0gMSk7DQorICAgIHBUQy0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9SVEZDaGFyQXJyYXkmIG5leHRDaGFycyA9IHBOZXh0TGluZS0+bV9MaW5lQ2hhcnM7DQorICBpbnQgY3VyX3NpemUgPSBjdXJDaGFycy5HZXRTaXplKCk7DQorICBuZXh0Q2hhcnMuU2V0U2l6ZShjdXJfc2l6ZSAtIGlDaGFyUG9zKTsNCisgIEZYU1lTX21lbWNweShuZXh0Q2hhcnMuR2V0RGF0YSgpLCBjdXJDaGFycy5HZXREYXRhUHRyKGlDaGFyUG9zKSwNCisgICAgICAgICAgICAgICAoY3VyX3NpemUgLSBpQ2hhclBvcykgKiBzaXplb2YoQ0ZYX1JURkNoYXIpKTsNCisgIGlDb3VudCAtPSBpQ2hhclBvczsNCisgIGN1cl9zaXplID0gY3VyQ2hhcnMuR2V0U2l6ZSgpOw0KKyAgY3VyQ2hhcnMuUmVtb3ZlQXQoY3VyX3NpemUgLSBpQ291bnQsIGlDb3VudCk7DQorICBwTmV4dExpbmUtPm1faVN0YXJ0ID0gcEN1ckxpbmUtPm1faVN0YXJ0Ow0KKyAgcE5leHRMaW5lLT5tX2lXaWR0aCA9IHBDdXJMaW5lLT5HZXRMaW5lRW5kKCkgLSBpRW5kUG9zOw0KKyAgcEN1ckxpbmUtPm1faVdpZHRoID0gaUVuZFBvczsNCisgIENGWF9SVEZDaGFyKiB0YyA9IGN1ckNoYXJzLkdldERhdGFQdHIoaUNoYXJQb3MgLSAxKTsNCisgIHRjLT5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsNCisgIGlDb3VudCA9IG5leHRDaGFycy5HZXRTaXplKCk7DQorICBDRlhfUlRGQ2hhciogcE5leHRDaGFycyA9IG5leHRDaGFycy5HZXREYXRhKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDRlhfUlRGQ2hhciogdGMgPSBwTmV4dENoYXJzICsgaTsNCisgICAgaWYgKHRjLT5HZXRDaGFyVHlwZSgpID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsNCisgICAgICBwQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMtLTsNCisgICAgICBwTmV4dExpbmUtPm1faUFyYWJpY0NoYXJzKys7DQorICAgIH0NCisgICAgaWYgKHRjLT5tX2R3TGF5b3V0U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfTUJDU0NvZGUpIHsNCisgICAgICBwQ3VyTGluZS0+bV9pTUJDU0NoYXJzLS07DQorICAgICAgcE5leHRMaW5lLT5tX2lNQkNTQ2hhcnMrKzsNCisgICAgfQ0KKyAgICB0Yy0+bV9kd1N0YXR1cyA9IDA7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZYX1JURkJyZWFrOjpDb3VudEJyZWFrUGllY2VzKCkgY29uc3Qgew0KKyAgQ0ZYX1JURlBpZWNlQXJyYXkqIHBSVEZQaWVjZXMgPSBHZXRSVEZQaWVjZXMoVFJVRSk7DQorICBpZiAocFJURlBpZWNlcyA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcmV0dXJuIHBSVEZQaWVjZXMtPkdldFNpemUoKTsNCit9DQorY29uc3QgQ0ZYX1JURlBpZWNlKiBDRlhfUlRGQnJlYWs6OkdldEJyZWFrUGllY2UoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgQ0ZYX1JURlBpZWNlQXJyYXkqIHBSVEZQaWVjZXMgPSBHZXRSVEZQaWVjZXMoVFJVRSk7DQorICBpZiAocFJURlBpZWNlcyA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBwUlRGUGllY2VzLT5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcFJURlBpZWNlcy0+R2V0UHRyQXQoaW5kZXgpOw0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6R2V0TGluZVJlY3QoQ0ZYX1JlY3RGJiByZWN0KSBjb25zdCB7DQorICByZWN0LnRvcCA9IDA7DQorICBDRlhfUlRGTGluZSogcFJURkxpbmUgPSBHZXRSVEZMaW5lKFRSVUUpOw0KKyAgaWYgKHBSVEZMaW5lID09IE5VTEwpIHsNCisgICAgcmVjdC5sZWZ0ID0gKChGWF9GTE9BVCltX2lMaW5lU3RhcnQpIC8gMjAwMDAuMGY7DQorICAgIHJlY3Qud2lkdGggPSByZWN0LmhlaWdodCA9IDA7DQorICAgIHJldHVybjsNCisgIH0NCisgIHJlY3QubGVmdCA9ICgoRlhfRkxPQVQpcFJURkxpbmUtPm1faVN0YXJ0KSAvIDIwMDAwLjBmOw0KKyAgcmVjdC53aWR0aCA9ICgoRlhfRkxPQVQpcFJURkxpbmUtPm1faVdpZHRoKSAvIDIwMDAwLjBmOw0KKyAgQ0ZYX1JURlBpZWNlQXJyYXkmIHJ0ZlBpZWNlcyA9IHBSVEZMaW5lLT5tX0xpbmVQaWVjZXM7DQorICBpbnQzMl90IGlDb3VudCA9IHJ0ZlBpZWNlcy5HZXRTaXplKCk7DQorICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICByZWN0LndpZHRoID0gMDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1JURlBpZWNlKiBwQnJlYWtQaWVjZTsNCisgIGludDMyX3QgaUxpbmVIZWlnaHQgPSAwLCBpTWF4Ow0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgcEJyZWFrUGllY2UgPSBydGZQaWVjZXMuR2V0UHRyQXQoaSk7DQorICAgIGludDMyX3QgaUZvbnRIZWlnaHQgPSBGWFNZU19yb3VuZChwQnJlYWtQaWVjZS0+bV9pRm9udEhlaWdodCAqDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnJlYWtQaWVjZS0+bV9pVmVydGljYWxTY2FsZSAvIDEwMC4wZik7DQorICAgIGlNYXggPSBGWF9NQVgocEJyZWFrUGllY2UtPm1faUZvbnRTaXplLCBpRm9udEhlaWdodCk7DQorICAgIGlmIChpID09IDApIHsNCisgICAgICBpTGluZUhlaWdodCA9IGlNYXg7DQorICAgIH0gZWxzZSBpZiAoaUxpbmVIZWlnaHQgPCBpTWF4KSB7DQorICAgICAgaUxpbmVIZWlnaHQgPSBpTWF4Ow0KKyAgICB9DQorICB9DQorICByZWN0LmhlaWdodCA9ICgoRlhfRkxPQVQpaUxpbmVIZWlnaHQpIC8gMjAuMGY7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpDbGVhckJyZWFrUGllY2VzKCkgew0KKyAgQ0ZYX1JURkxpbmUqIHBSVEZMaW5lID0gR2V0UlRGTGluZShUUlVFKTsNCisgIGlmIChwUlRGTGluZSAhPSBOVUxMKSB7DQorICAgIHBSVEZMaW5lLT5SZW1vdmVBbGwoVFJVRSk7DQorICB9DQorICBtX2lSZWFkeSA9IDA7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpSZXNldCgpIHsNCisgIG1fZHdDaGFyVHlwZSA9IDA7DQorICBtX1JURkxpbmUxLlJlbW92ZUFsbChUUlVFKTsNCisgIG1fUlRGTGluZTIuUmVtb3ZlQWxsKFRSVUUpOw0KK30NCitpbnQzMl90IENGWF9SVEZCcmVhazo6R2V0RGlzcGxheVBvcyhGWF9MUENSVEZURVhUT0JKIHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogcFdTRm9ybXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQWRqdXN0Q2hhckRpc3BsYXlQb3MgcEFkanVzdFBvcykgY29uc3Qgew0KKyAgaWYgKHBUZXh0ID09IE5VTEwgfHwgcFRleHQtPmlMZW5ndGggPCAxKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KHBUZXh0LT5wU3RyICE9IE5VTEwgJiYgcFRleHQtPnBXaWR0aHMgIT0gTlVMTCAmJg0KKyAgICAgICAgICAgICAgIHBUZXh0LT5wRm9udCAhPSBOVUxMICYmIHBUZXh0LT5wUmVjdCAhPSBOVUxMKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gcFRleHQtPnBTdHI7DQorICBpbnQzMl90KiBwV2lkdGhzID0gcFRleHQtPnBXaWR0aHM7DQorICBpbnQzMl90IGlMZW5ndGggPSBwVGV4dC0+aUxlbmd0aCAtIDE7DQorICBJRlhfRm9udCogcEZvbnQgPSBwVGV4dC0+cEZvbnQ7DQorICBGWF9EV09SRCBkd1N0eWxlcyA9IHBUZXh0LT5kd0xheW91dFN0eWxlczsNCisgIENGWF9SZWN0RiBydFRleHQoKnBUZXh0LT5wUmVjdCk7DQorICBGWF9CT09MIGJSVExQaWVjZSA9IEZYX0lzT2RkKHBUZXh0LT5pQmlkaUxldmVsKTsNCisgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IHBUZXh0LT5mRm9udFNpemU7DQorICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsNCisgIGludDMyX3QgaUFzY2VudCA9IHBGb250LT5HZXRBc2NlbnQoKTsNCisgIGludDMyX3QgaURlc2NlbnQgPSBwRm9udC0+R2V0RGVzY2VudCgpOw0KKyAgaW50MzJfdCBpTWF4SGVpZ2h0ID0gaUFzY2VudCAtIGlEZXNjZW50Ow0KKyAgRlhfRkxPQVQgZkZvbnRIZWlnaHQgPSBmRm9udFNpemU7DQorICBGWF9GTE9BVCBmQXNjZW50ID0gZkZvbnRIZWlnaHQgKiAoRlhfRkxPQVQpaUFzY2VudCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0Ow0KKyAgRlhfRkxPQVQgZkRlc2NlbnQgPSBmRm9udEhlaWdodCAqIChGWF9GTE9BVClpRGVzY2VudCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0Ow0KKyAgRlhfQk9PTCBiVmVydGljYWxEb2MgPSAoZHdTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dCkgIT0gMDsNCisgIEZYX0JPT0wgYlZlcnRpY2FsQ2hhciA9IChkd1N0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMpICE9IDA7DQorICBGWF9CT09MIGJBcmFiaWNOdW1iZXIgPSAoZHdTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9BcmFiaWNOdW1iZXIpICE9IDA7DQorICBGWF9CT09MIGJNQkNTQ29kZSA9IChkd1N0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX01CQ1NDb2RlKSAhPSAwOw0KKyAgaW50MzJfdCBpUm90YXRpb24gPSBHZXRMaW5lUm90YXRpb24oZHdTdHlsZXMpICsgcFRleHQtPmlDaGFyUm90YXRpb247DQorICBpbnQzMl90IGlDaGFyUm90YXRpb247DQorICBGWF9XQ0hBUiB3Y2gsIHdQcmV2ID0gMHhGRUZGLCB3TmV4dCwgd0Zvcm07DQorICBpbnQzMl90IGlXaWR0aCwgaUNoYXJXaWR0aCwgaUNoYXJIZWlnaHQ7DQorICBGWF9GTE9BVCBmWCwgZlksIGZDaGFyV2lkdGgsIGZDaGFySGVpZ2h0Ow0KKyAgaW50MzJfdCBpSG9yU2NhbGUgPSBwVGV4dC0+aUhvcml6b250YWxTY2FsZTsNCisgIGludDMyX3QgaVZlclNjYWxlID0gcFRleHQtPmlWZXJ0aWNhbFNjYWxlOw0KKyAgRlhfQk9PTCBiRW1wdHlDaGFyOw0KKyAgRlhfRFdPUkQgZHdQcm9wcywgZHdDaGFyVHlwZTsNCisgIGZYID0gcnRUZXh0LmxlZnQ7DQorICBmWSA9IHJ0VGV4dC50b3A7DQorICBpZiAoYlZlcnRpY2FsRG9jKSB7DQorICAgIGZYICs9IChydFRleHQud2lkdGggLSBmRm9udFNpemUpIC8gMi4wZjsNCisgICAgaWYgKGJSVExQaWVjZSkgew0KKyAgICAgIGZZID0gcnRUZXh0LmJvdHRvbSgpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAoYlJUTFBpZWNlKSB7DQorICAgICAgZlggPSBydFRleHQucmlnaHQoKTsNCisgICAgfQ0KKyAgICBmWSArPSBmQXNjZW50Ow0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IGlMZW5ndGg7IGkrKykgew0KKyAgICB3Y2ggPSAqcFN0cisrOw0KKyAgICBpV2lkdGggPSAqcFdpZHRocysrOw0KKyAgICBpZiAoIWJNQkNTQ29kZSkgew0KKyAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Y2gpOw0KKyAgICAgIGR3Q2hhclR5cGUgPSAoZHdQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spOw0KKyAgICAgIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgJiYgaVdpZHRoID09IDApIHsNCisgICAgICAgIHdQcmV2ID0gMHhGRUZGOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGR3UHJvcHMgPSAwOw0KKyAgICAgIGR3Q2hhclR5cGUgPSAwOw0KKyAgICB9DQorICAgIGlmIChpV2lkdGggIT0gMCkgew0KKyAgICAgIGlDaGFyV2lkdGggPSBpV2lkdGg7DQorICAgICAgaWYgKGlDaGFyV2lkdGggPCAwKSB7DQorICAgICAgICBpQ2hhcldpZHRoID0gLWlDaGFyV2lkdGg7DQorICAgICAgfQ0KKyAgICAgIGlmICghYk1CQ1NDb2RlKSB7DQorICAgICAgICBiRW1wdHlDaGFyID0gKGR3Q2hhclR5cGUgPj0gRlhfQ0hBUlRZUEVfVGFiICYmDQorICAgICAgICAgICAgICAgICAgICAgIGR3Q2hhclR5cGUgPD0gRlhfQ0hBUlRZUEVfQ29udHJvbCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJFbXB0eUNoYXIgPSBGQUxTRTsNCisgICAgICB9DQorICAgICAgaWYgKCFiRW1wdHlDaGFyKSB7DQorICAgICAgICBpQ291bnQrKzsNCisgICAgICB9DQorICAgICAgaWYgKHBDaGFyUG9zICE9IE5VTEwpIHsNCisgICAgICAgIGlDaGFyV2lkdGggLz0gaUZvbnRTaXplOw0KKyAgICAgICAgd0Zvcm0gPSB3Y2g7DQorICAgICAgICBpZiAoIWJNQkNTQ29kZSkgew0KKyAgICAgICAgICBpZiAoZHdDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSB7DQorICAgICAgICAgICAgaWYgKGkgPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICB3TmV4dCA9ICpwU3RyOw0KKyAgICAgICAgICAgICAgaWYgKCpwV2lkdGhzIDwgMCkgew0KKyAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgICAgd05leHQgPSBwU3RyWzFdOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHdOZXh0ID0gMHhGRUZGOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3Rm9ybSA9IG1fcEFyYWJpY0NoYXItPkdldEZvcm1DaGFyKHdjaCwgd1ByZXYsIHdOZXh0KTsNCisgICAgICAgICAgfSBlbHNlIGlmIChiUlRMUGllY2UgfHwgYlZlcnRpY2FsQ2hhcikgew0KKyAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0TWlycm9yQ2hhcih3Y2gsIGR3UHJvcHMsIGJSVExQaWVjZSwgYlZlcnRpY2FsQ2hhcik7DQorICAgICAgICAgIH0gZWxzZSBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9OdW1lcmljICYmIGJBcmFiaWNOdW1iZXIpIHsNCisgICAgICAgICAgICB3Rm9ybSA9IHdjaCArIDB4MDYzMDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod0Zvcm0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUNoYXJSb3RhdGlvbiA9IGlSb3RhdGlvbjsNCisgICAgICAgIGlmICghYk1CQ1NDb2RlICYmIGJWZXJ0aWNhbENoYXIgJiYgKGR3UHJvcHMgJiAweDgwMDApICE9IDApIHsNCisgICAgICAgICAgaUNoYXJSb3RhdGlvbisrOw0KKyAgICAgICAgICBpQ2hhclJvdGF0aW9uICU9IDQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWJFbXB0eUNoYXIpIHsNCisgICAgICAgICAgaWYgKGJDaGFyQ29kZSkgew0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPSB3Y2g7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fR2x5cGhJbmRleCA9IHBGb250LT5HZXRHbHlwaEluZGV4KHdGb3JtLCBiTUJDU0NvZGUpOw0KKyAgICAgICAgICAgIGlmIChwQ2hhclBvcy0+bV9HbHlwaEluZGV4ID09IDB4RkZGRikgew0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fR2x5cGhJbmRleCA9IHBGb250LT5HZXRHbHlwaEluZGV4KHdjaCwgYk1CQ1NDb2RlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcENoYXJQb3MtPm1fRXh0R0lEID0gcENoYXJQb3MtPm1fR2x5cGhJbmRleDsNCisgICAgICAgICAgcENoYXJQb3MtPm1fRm9udENoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQorICAgICAgICAgIGlmIChwV1NGb3Jtcykgew0KKyAgICAgICAgICAgICpwV1NGb3JtcyArPSB3Rm9ybTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICAgICAgICBpQ2hhckhlaWdodCA9IGlDaGFyV2lkdGg7DQorICAgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaUNoYXJIZWlnaHQgPSAxMDAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZkNoYXJXaWR0aCA9IGZGb250U2l6ZSAqIGlDaGFyV2lkdGggLyAxMDAwLjBmOw0KKyAgICAgICAgZkNoYXJIZWlnaHQgPSBmRm9udFNpemUgKiBpQ2hhckhlaWdodCAvIDEwMDAuMGY7DQorICAgICAgICBpZiAoIWJNQkNTQ29kZSAmJiBiUlRMUGllY2UgJiYgZHdDaGFyVHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KKyAgICAgICAgICBpZiAoYlZlcnRpY2FsRG9jKSB7DQorICAgICAgICAgICAgZlkgLT0gZkNoYXJIZWlnaHQ7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZlggLT0gZkNoYXJXaWR0aDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFiRW1wdHlDaGFyKSB7DQorICAgICAgICAgIENGWF9Qb2ludEYgcHRPZmZzZXQ7DQorICAgICAgICAgIHB0T2Zmc2V0LlJlc2V0KCk7DQorICAgICAgICAgIEZYX0JPT0wgYkFkanVzdGVkID0gRkFMU0U7DQorICAgICAgICAgIGlmIChwQWRqdXN0UG9zKSB7DQorICAgICAgICAgICAgYkFkanVzdGVkID0gcEFkanVzdFBvcyh3Rm9ybSwgYk1CQ1NDb2RlLCBwRm9udCwgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZlcnRpY2FsQ2hhciwgcHRPZmZzZXQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICghcEFkanVzdFBvcyAmJiBiVmVydGljYWxDaGFyICYmIChkd1Byb3BzICYgMHgwMDAxMDAwMCkgIT0gMCkgew0KKyAgICAgICAgICAgIENGWF9SZWN0IHJ0QkJveDsNCisgICAgICAgICAgICBydEJCb3guUmVzZXQoKTsNCisgICAgICAgICAgICBpZiAocEZvbnQtPkdldENoYXJCQm94KHdGb3JtLCBydEJCb3gsIGJNQkNTQ29kZSkpIHsNCisgICAgICAgICAgICAgIHB0T2Zmc2V0LnggPSBmRm9udFNpemUgKiAoODUwIC0gcnRCQm94LnJpZ2h0KCkpIC8gMTAwMC4wZjsNCisgICAgICAgICAgICAgIHB0T2Zmc2V0LnkgPSBmRm9udFNpemUgKiAoMTAwMCAtIHJ0QkJveC5oZWlnaHQpIC8gMjAwMC4wZjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCA9IGZYICsgcHRPZmZzZXQueDsNCisgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSA9IGZZIC0gcHRPZmZzZXQueTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghYlJUTFBpZWNlICYmIGR3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICAgICAgICAgIGZZICs9IGZDaGFySGVpZ2h0Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGZYICs9IGZDaGFyV2lkdGg7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkVtcHR5Q2hhcikgew0KKyAgICAgICAgICBwQ2hhclBvcy0+bV9iR2x5cGhBZGp1c3QgPSBUUlVFOw0KKyAgICAgICAgICBpZiAoYlZlcnRpY2FsRG9jKSB7DQorICAgICAgICAgICAgaWYgKGlDaGFyUm90YXRpb24gPT0gMCkgew0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gLTE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAwOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZBc2NlbnQgKiBpVmVyU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDEpIHsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAtMTsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IC0xOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggLT0NCisgICAgICAgICAgICAgICAgICBmRGVzY2VudCArIGZBc2NlbnQgKiBpVmVyU2NhbGUgLyAxMDAuMGYgLSBmQXNjZW50Ow0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA9PSAyKSB7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAxOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAtMTsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkNoYXJXaWR0aDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgKz0gZkFzY2VudDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAxOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkFzY2VudDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgKz0gZkNoYXJXaWR0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGlDaGFyUm90YXRpb24gPT0gMCkgew0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gLTE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAwOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZBc2NlbnQgKiBpVmVyU2NhbGUgLyAxMDAuMGYgLSBmQXNjZW50Ow0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA9PSAxKSB7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAwOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gLTE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAtMTsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YIC09IGZEZXNjZW50Ow0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSAtPSBmQXNjZW50ICsgZkRlc2NlbnQ7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDIpIHsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAwOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IC0xOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSAtPSBmQXNjZW50Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAwOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMTsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAwOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBmQXNjZW50ICogaVZlclNjYWxlIC8gMTAwLjBmOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaUhvclNjYWxlICE9IDEwMCB8fCBpVmVyU2NhbGUgIT0gMTAwKSB7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0NCisgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdICogaUhvclNjYWxlIC8gMTAwLjBmOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9DQorICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSAqIGlIb3JTY2FsZSAvIDEwMC4wZjsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPQ0KKyAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gKiBpVmVyU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0NCisgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdICogaVZlclNjYWxlIC8gMTAwLjBmOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBDaGFyUG9zKys7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpV2lkdGggPiAwKSB7DQorICAgICAgd1ByZXYgPSB3Y2g7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpQ291bnQ7DQorfQ0KK2ludDMyX3QgQ0ZYX1JURkJyZWFrOjpHZXRDaGFyUmVjdHMoRlhfTFBDUlRGVEVYVE9CSiBwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RkFycmF5JiBydEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckJCb3gpIGNvbnN0IHsNCisgIGlmIChwVGV4dCA9PSBOVUxMIHx8IHBUZXh0LT5pTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChwVGV4dC0+cFN0ciAhPSBOVUxMICYmIHBUZXh0LT5wV2lkdGhzICE9IE5VTEwgJiYNCisgICAgICAgICAgICAgICBwVGV4dC0+cEZvbnQgIT0gTlVMTCAmJiBwVGV4dC0+cFJlY3QgIT0gTlVMTCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHBUZXh0LT5wU3RyOw0KKyAgaW50MzJfdCogcFdpZHRocyA9IHBUZXh0LT5wV2lkdGhzOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcFRleHQtPmlMZW5ndGg7DQorICBDRlhfUmVjdEYgcmVjdCgqcFRleHQtPnBSZWN0KTsNCisgIEZYX0JPT0wgYlJUTFBpZWNlID0gRlhfSXNPZGQocFRleHQtPmlCaWRpTGV2ZWwpOw0KKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gcFRleHQtPmZGb250U2l6ZTsNCisgIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KKyAgRlhfRkxPQVQgZlNjYWxlID0gZkZvbnRTaXplIC8gMTAwMC4wZjsNCisgIElGWF9Gb250KiBwRm9udCA9IHBUZXh0LT5wRm9udDsNCisgIGlmIChwRm9udCA9PSBOVUxMKSB7DQorICAgIGJDaGFyQkJveCA9IEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1JlY3QgYmJveDsNCisgIGJib3guU2V0KDAsIDAsIDAsIDApOw0KKyAgaWYgKGJDaGFyQkJveCkgew0KKyAgICBiQ2hhckJCb3ggPSBwRm9udC0+R2V0QkJveChiYm94KTsNCisgIH0NCisgIEZYX0ZMT0FUIGZMZWZ0ID0gRlhfTUFYKDAsIGJib3gubGVmdCAqIGZTY2FsZSk7DQorICBGWF9GTE9BVCBmSGVpZ2h0ID0gRlhTWVNfZmFicyhiYm94LmhlaWdodCAqIGZTY2FsZSk7DQorICBydEFycmF5LlJlbW92ZUFsbCgpOw0KKyAgcnRBcnJheS5TZXRTaXplKGlMZW5ndGgpOw0KKyAgRlhfRFdPUkQgZHdTdHlsZXMgPSBwVGV4dC0+ZHdMYXlvdXRTdHlsZXM7DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9IChkd1N0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0KSAhPSAwOw0KKyAgRlhfQk9PTCBiTUJDU0NvZGUgPSAoZHdTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9NQkNTQ29kZSkgIT0gMDsNCisgIEZYX0JPT0wgYlNpbmdsZUxpbmUgPSAoZHdTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9TaW5nbGVMaW5lKSAhPSAwOw0KKyAgRlhfQk9PTCBiQ29tYlRleHQgPSAoZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9Db21iVGV4dCkgIT0gMDsNCisgIEZYX1dDSEFSIHdjaCwgd0xpbmVCcmVha0NoYXIgPSBwVGV4dC0+d0xpbmVCcmVha0NoYXI7DQorICBpbnQzMl90IGlDaGFyU2l6ZTsNCisgIEZYX0ZMT0FUIGZDaGFyU2l6ZSwgZlN0YXJ0Ow0KKyAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICBmU3RhcnQgPSBiUlRMUGllY2UgPyByZWN0LmJvdHRvbSgpIDogcmVjdC50b3A7DQorICB9IGVsc2Ugew0KKyAgICBmU3RhcnQgPSBiUlRMUGllY2UgPyByZWN0LnJpZ2h0KCkgOiByZWN0LmxlZnQ7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgd2NoID0gKnBTdHIrKzsNCisgICAgaUNoYXJTaXplID0gKnBXaWR0aHMrKzsNCisgICAgZkNoYXJTaXplID0gKEZYX0ZMT0FUKWlDaGFyU2l6ZSAvIDIwMDAwLjBmOw0KKyAgICBGWF9CT09MIGJSZXQgPSAoIWJTaW5nbGVMaW5lICYmIEZYX0lzQ3RybENvZGUod2NoKSk7DQorICAgIGlmICghKHdjaCA9PSBMJ1x2JyB8fCB3Y2ggPT0gTCdcZicgfHwgd2NoID09IDB4MjAyOCB8fCB3Y2ggPT0gMHgyMDI5IHx8DQorICAgICAgICAgICh3TGluZUJyZWFrQ2hhciAhPSAweEZFRkYgJiYgd2NoID09IHdMaW5lQnJlYWtDaGFyKSkpIHsNCisgICAgICBiUmV0ID0gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKGJSZXQpIHsNCisgICAgICBpQ2hhclNpemUgPSBpRm9udFNpemUgKiA1MDA7DQorICAgICAgZkNoYXJTaXplID0gZkZvbnRTaXplIC8gMi4wZjsNCisgICAgfQ0KKyAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgcmVjdC50b3AgPSBmU3RhcnQ7DQorICAgICAgaWYgKGJSVExQaWVjZSkgew0KKyAgICAgICAgcmVjdC50b3AgLT0gZkNoYXJTaXplOw0KKyAgICAgICAgZlN0YXJ0IC09IGZDaGFyU2l6ZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZlN0YXJ0ICs9IGZDaGFyU2l6ZTsNCisgICAgICB9DQorICAgICAgcmVjdC5oZWlnaHQgPSBmQ2hhclNpemU7DQorICAgIH0gZWxzZSB7DQorICAgICAgcmVjdC5sZWZ0ID0gZlN0YXJ0Ow0KKyAgICAgIGlmIChiUlRMUGllY2UpIHsNCisgICAgICAgIHJlY3QubGVmdCAtPSBmQ2hhclNpemU7DQorICAgICAgICBmU3RhcnQgLT0gZkNoYXJTaXplOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBmU3RhcnQgKz0gZkNoYXJTaXplOw0KKyAgICAgIH0NCisgICAgICByZWN0LndpZHRoID0gZkNoYXJTaXplOw0KKyAgICB9DQorICAgIGlmIChiQ2hhckJCb3ggJiYgIWJSZXQpIHsNCisgICAgICBpbnQzMl90IGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICAgIHBGb250LT5HZXRDaGFyV2lkdGgod2NoLCBpQ2hhcldpZHRoKTsNCisgICAgICBGWF9GTE9BVCBmUlRMZWZ0ID0gMCwgZkNoYXJXaWR0aCA9IDA7DQorICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICBmQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIGZTY2FsZTsNCisgICAgICAgIGZSVExlZnQgPSBmTGVmdDsNCisgICAgICAgIGlmIChiQ29tYlRleHQpIHsNCisgICAgICAgICAgZlJUTGVmdCA9IChyZWN0LndpZHRoIC0gZkNoYXJXaWR0aCkgLyAyLjBmOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBDRlhfUmVjdEYgcnRCQm94RjsNCisgICAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgICBydEJCb3hGLnRvcCA9IHJlY3QubGVmdCArIGZSVExlZnQ7DQorICAgICAgICBydEJCb3hGLmxlZnQgPSByZWN0LnRvcCArIChyZWN0LmhlaWdodCAtIGZIZWlnaHQpIC8gMi4wZjsNCisgICAgICAgIHJ0QkJveEYuaGVpZ2h0ID0gZkNoYXJXaWR0aDsNCisgICAgICAgIHJ0QkJveEYud2lkdGggPSBmSGVpZ2h0Ow0KKyAgICAgICAgcnRCQm94Ri5sZWZ0ID0gRlhfTUFYKHJ0QkJveEYubGVmdCwgMCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0QkJveEYubGVmdCA9IHJlY3QubGVmdCArIGZSVExlZnQ7DQorICAgICAgICBydEJCb3hGLnRvcCA9IHJlY3QudG9wICsgKHJlY3QuaGVpZ2h0IC0gZkhlaWdodCkgLyAyLjBmOw0KKyAgICAgICAgcnRCQm94Ri53aWR0aCA9IGZDaGFyV2lkdGg7DQorICAgICAgICBydEJCb3hGLmhlaWdodCA9IGZIZWlnaHQ7DQorICAgICAgICBydEJCb3hGLnRvcCA9IEZYX01BWChydEJCb3hGLnRvcCwgMCk7DQorICAgICAgfQ0KKyAgICAgIHJ0QXJyYXkuU2V0QXQoaSwgcnRCQm94Rik7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgcnRBcnJheS5TZXRBdChpLCByZWN0KTsNCisgIH0NCisgIHJldHVybiBpTGVuZ3RoOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9ydGZicmVhay5oIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfcnRmYnJlYWsuaAppbmRleCAwOTMwMmRmLi4zZDFhMDI5IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9ydGZicmVhay5oCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3J0ZmJyZWFrLmgKQEAgLTExLDE3MyArMTEsMTY0IEBACiANCiBjbGFzcyBDRlhfUlRGTGluZTsNCiBjbGFzcyBDRlhfUlRGQnJlYWs7DQotY2xhc3MgQ0ZYX1JURkxpbmUNCi17DQotcHVibGljOg0KLSAgICBDRlhfUlRGTGluZSgpIDogbV9MaW5lUGllY2VzKDE2KQ0KLSAgICAgICAgLCBtX2lTdGFydCgwKQ0KLSAgICAgICAgLCBtX2lXaWR0aCgwKQ0KLSAgICAgICAgLCBtX2lBcmFiaWNDaGFycygwKQ0KLSAgICAgICAgLCBtX2lNQkNTQ2hhcnMoMCkNCi0gICAgew0KK2NsYXNzIENGWF9SVEZMaW5lIHsNCisgcHVibGljOg0KKyAgQ0ZYX1JURkxpbmUoKQ0KKyAgICAgIDogbV9MaW5lUGllY2VzKDE2KSwNCisgICAgICAgIG1faVN0YXJ0KDApLA0KKyAgICAgICAgbV9pV2lkdGgoMCksDQorICAgICAgICBtX2lBcmFiaWNDaGFycygwKSwNCisgICAgICAgIG1faU1CQ1NDaGFycygwKSB7fQ0KKyAgfkNGWF9SVEZMaW5lKCkgeyBSZW1vdmVBbGwoKTsgfQ0KKyAgaW50MzJfdCBDb3VudENoYXJzKCkgY29uc3QgeyByZXR1cm4gbV9MaW5lQ2hhcnMuR2V0U2l6ZSgpOyB9DQorICBDRlhfUlRGQ2hhciYgR2V0Q2hhcihpbnQzMl90IGluZGV4KSB7DQorICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9MaW5lQ2hhcnMuR2V0U2l6ZSgpKTsNCisgICAgcmV0dXJuICptX0xpbmVDaGFycy5HZXREYXRhUHRyKGluZGV4KTsNCisgIH0NCisgIENGWF9SVEZDaGFyKiBHZXRDaGFyUHRyKGludDMyX3QgaW5kZXgpIHsNCisgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX0xpbmVDaGFycy5HZXRTaXplKCkpOw0KKyAgICByZXR1cm4gbV9MaW5lQ2hhcnMuR2V0RGF0YVB0cihpbmRleCk7DQorICB9DQorICBpbnQzMl90IENvdW50UGllY2VzKCkgY29uc3QgeyByZXR1cm4gbV9MaW5lUGllY2VzLkdldFNpemUoKTsgfQ0KKyAgQ0ZYX1JURlBpZWNlJiBHZXRQaWVjZShpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9MaW5lUGllY2VzLkdldFNpemUoKSk7DQorICAgIHJldHVybiBtX0xpbmVQaWVjZXMuR2V0QXQoaW5kZXgpOw0KKyAgfQ0KKyAgQ0ZYX1JURlBpZWNlKiBHZXRQaWVjZVB0cihpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9MaW5lUGllY2VzLkdldFNpemUoKSk7DQorICAgIHJldHVybiBtX0xpbmVQaWVjZXMuR2V0UHRyQXQoaW5kZXgpOw0KKyAgfQ0KKyAgaW50MzJfdCBHZXRMaW5lRW5kKCkgY29uc3QgeyByZXR1cm4gbV9pU3RhcnQgKyBtX2lXaWR0aDsgfQ0KKyAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkgew0KKyAgICBDRlhfUlRGQ2hhciogcENoYXI7DQorICAgIElGWF9Vbmtub3duKiBwVW5rbm93bjsNCisgICAgaW50MzJfdCBpQ291bnQgPSBtX0xpbmVDaGFycy5HZXRTaXplKCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgcENoYXIgPSBtX0xpbmVDaGFycy5HZXREYXRhUHRyKGkpOw0KKyAgICAgIGlmICgocFVua25vd24gPSBwQ2hhci0+bV9wVXNlckRhdGEpICE9IE5VTEwpIHsNCisgICAgICAgIHBVbmtub3duLT5SZWxlYXNlKCk7DQorICAgICAgfQ0KICAgICB9DQotICAgIH5DRlhfUlRGTGluZSgpDQotICAgIHsNCi0gICAgICAgIFJlbW92ZUFsbCgpOw0KLSAgICB9DQotICAgIGludDMyX3QgQ291bnRDaGFycygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX0xpbmVDaGFycy5HZXRTaXplKCk7DQotICAgIH0NCi0gICAgQ0ZYX1JURkNoYXImIEdldENoYXIoaW50MzJfdCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX0xpbmVDaGFycy5HZXRTaXplKCkpOw0KLSAgICAgICAgcmV0dXJuICptX0xpbmVDaGFycy5HZXREYXRhUHRyKGluZGV4KTsNCi0gICAgfQ0KLSAgICBDRlhfUlRGQ2hhciogR2V0Q2hhclB0cihpbnQzMl90IGluZGV4KQ0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1fTGluZUNoYXJzLkdldFNpemUoKSk7DQotICAgICAgICByZXR1cm4gbV9MaW5lQ2hhcnMuR2V0RGF0YVB0cihpbmRleCk7DQotICAgIH0NCi0gICAgaW50MzJfdCBDb3VudFBpZWNlcygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX0xpbmVQaWVjZXMuR2V0U2l6ZSgpOw0KLSAgICB9DQotICAgIENGWF9SVEZQaWVjZSYgR2V0UGllY2UoaW50MzJfdCBpbmRleCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX0xpbmVQaWVjZXMuR2V0U2l6ZSgpKTsNCi0gICAgICAgIHJldHVybiBtX0xpbmVQaWVjZXMuR2V0QXQoaW5kZXgpOw0KLSAgICB9DQotICAgIENGWF9SVEZQaWVjZSogR2V0UGllY2VQdHIoaW50MzJfdCBpbmRleCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX0xpbmVQaWVjZXMuR2V0U2l6ZSgpKTsNCi0gICAgICAgIHJldHVybiBtX0xpbmVQaWVjZXMuR2V0UHRyQXQoaW5kZXgpOw0KLSAgICB9DQotICAgIGludDMyX3QgR2V0TGluZUVuZCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lTdGFydCArIG1faVdpZHRoOw0KLSAgICB9DQotICAgIHZvaWQgUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpDQotICAgIHsNCi0gICAgICAgIENGWF9SVEZDaGFyICpwQ2hhcjsNCi0gICAgICAgIElGWF9Vbmtub3duICpwVW5rbm93bjsNCi0gICAgICAgIGludDMyX3QgaUNvdW50ID0gbV9MaW5lQ2hhcnMuR2V0U2l6ZSgpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICAgICAgcENoYXIgPSBtX0xpbmVDaGFycy5HZXREYXRhUHRyKGkpOw0KLSAgICAgICAgICAgIGlmICgocFVua25vd24gPSBwQ2hhci0+bV9wVXNlckRhdGEpICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcFVua25vd24tPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBtX0xpbmVDaGFycy5SZW1vdmVBbGwoKTsNCi0gICAgICAgIG1fTGluZVBpZWNlcy5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCi0gICAgICAgIG1faVdpZHRoID0gMDsNCi0gICAgICAgIG1faUFyYWJpY0NoYXJzID0gMDsNCi0gICAgICAgIG1faU1CQ1NDaGFycyA9IDA7DQotICAgIH0NCi0gICAgQ0ZYX1JURkNoYXJBcnJheQltX0xpbmVDaGFyczsNCi0gICAgQ0ZYX1JURlBpZWNlQXJyYXkJbV9MaW5lUGllY2VzOw0KLSAgICBpbnQzMl90CQkJbV9pU3RhcnQ7DQotICAgIGludDMyX3QJCQltX2lXaWR0aDsNCi0gICAgaW50MzJfdAkJCW1faUFyYWJpY0NoYXJzOw0KLSAgICBpbnQzMl90CQkJbV9pTUJDU0NoYXJzOw0KKyAgICBtX0xpbmVDaGFycy5SZW1vdmVBbGwoKTsNCisgICAgbV9MaW5lUGllY2VzLlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOw0KKyAgICBtX2lXaWR0aCA9IDA7DQorICAgIG1faUFyYWJpY0NoYXJzID0gMDsNCisgICAgbV9pTUJDU0NoYXJzID0gMDsNCisgIH0NCisgIENGWF9SVEZDaGFyQXJyYXkgbV9MaW5lQ2hhcnM7DQorICBDRlhfUlRGUGllY2VBcnJheSBtX0xpbmVQaWVjZXM7DQorICBpbnQzMl90IG1faVN0YXJ0Ow0KKyAgaW50MzJfdCBtX2lXaWR0aDsNCisgIGludDMyX3QgbV9pQXJhYmljQ2hhcnM7DQorICBpbnQzMl90IG1faU1CQ1NDaGFyczsNCiB9Ow0KLWNsYXNzIENGWF9SVEZCcmVhayA6IHB1YmxpYyBJRlhfUlRGQnJlYWsNCi17DQotcHVibGljOg0KLSAgICBDRlhfUlRGQnJlYWsoRlhfRFdPUkQgZHdQb2xpY2llcyk7DQotICAgIH5DRlhfUlRGQnJlYWsoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldExpbmVXaWR0aChGWF9GTE9BVCBmTGluZVN0YXJ0LCBGWF9GTE9BVCBmTGluZUVuZCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldExpbmVQb3MoRlhfRkxPQVQgZkxpbmVQb3MpOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRMYXlvdXRTdHlsZXMoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9kd0xheW91dFN0eWxlczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRMYXlvdXRTdHlsZXMoRlhfRFdPUkQgZHdMYXlvdXRTdHlsZXMpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250KElGWF9Gb250ICpwRm9udCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFkZFBvc2l0aW9uZWRUYWIoRlhfRkxPQVQgZlRhYlBvcyk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldFBvc2l0aW9uZWRUYWJzKGNvbnN0IENGWF9GbG9hdEFycmF5ICZ0YWJzKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJQ2xlYXJQb3NpdGlvbmVkVGFicygpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXREZWZhdWx0Q2hhcihGWF9XQ0hBUiB3Y2gpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRMaW5lQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0SG9yaXpvbnRhbFNjYWxlKGludDMyX3QgaVNjYWxlKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0VmVydGljYWxTY2FsZShpbnQzMl90IGlTY2FsZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldENoYXJSb3RhdGlvbihpbnQzMl90IGlDaGFyUm90YXRpb24pOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldFdvcmRTcGFjZShGWF9CT09MIGJEZWZhdWx0LCBGWF9GTE9BVCBmV29yZFNwYWNlKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0UmVhZGluZ09yZGVyKEZYX0JPT0wgYlJUTCA9IEZBTFNFKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0QWxpZ25tZW50KGludDMyX3QgaUFsaWdubWVudCA9IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldFVzZXJEYXRhKElGWF9Vbmtub3duICpwVXNlckRhdGEpOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCQlBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJCUVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzID0gRlhfUlRGQlJFQUtfUGllY2VCcmVhayk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQkJQ291bnRCcmVha1BpZWNlcygpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGNvbnN0IENGWF9SVEZQaWVjZSoJCQlHZXRCcmVha1BpZWNlKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQlHZXRMaW5lUmVjdChDRlhfUmVjdEYgJnJlY3QpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQlDbGVhckJyZWFrUGllY2VzKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlc2V0KCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0RGlzcGxheVBvcyhGWF9MUENSVEZURVhUT0JKIHBUZXh0LCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UsIENGWF9XaWRlU3RyaW5nICpwV1NGb3JtcyA9IE5VTEwsIEZYX0FkanVzdENoYXJEaXNwbGF5UG9zIHBBZGp1c3RQb3MgPSBOVUxMKSBjb25zdDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRDaGFyUmVjdHMoRlhfTFBDUlRGVEVYVE9CSiBwVGV4dCwgQ0ZYX1JlY3RGQXJyYXkgJnJ0QXJyYXksIEZYX0JPT0wgYkNoYXJCQm94ID0gRkFMU0UpIGNvbnN0Ow0KLSAgICBGWF9EV09SRAkJCQlBcHBlbmRDaGFyX0NoYXJDb2RlKEZYX1dDSEFSIHdjaCk7DQotICAgIEZYX0RXT1JECQkJCUFwcGVuZENoYXJfQ29tYmluYXRpb24oQ0ZYX1JURkNoYXIgKnBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQotICAgIEZYX0RXT1JECQkJCUFwcGVuZENoYXJfVGFiKENGWF9SVEZDaGFyICpwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pOw0KLSAgICBGWF9EV09SRAkJCQlBcHBlbmRDaGFyX0NvbnRyb2woQ0ZYX1JURkNoYXIgKnBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQotICAgIEZYX0RXT1JECQkJCUFwcGVuZENoYXJfQXJhYmljKENGWF9SVEZDaGFyICpwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pOw0KLSAgICBGWF9EV09SRAkJCQlBcHBlbmRDaGFyX090aGVycyhDRlhfUlRGQ2hhciAqcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsNCi1wcm90ZWN0ZWQ6DQotICAgIEZYX0RXT1JECQkJbV9kd1BvbGljaWVzOw0KLSAgICBJRlhfQXJhYmljQ2hhcgkJKm1fcEFyYWJpY0NoYXI7DQotICAgIGludDMyX3QJCQltX2lMaW5lU3RhcnQ7DQotICAgIGludDMyX3QJCQltX2lMaW5lRW5kOw0KLSAgICBGWF9EV09SRAkJCW1fZHdMYXlvdXRTdHlsZXM7DQotICAgIEZYX0JPT0wJCQkJbV9iUGFnaW5hdGlvbjsNCi0gICAgRlhfQk9PTAkJCQltX2JWZXJ0aWNhbDsNCi0gICAgRlhfQk9PTAkJCQltX2JTaW5nbGVMaW5lOw0KLSAgICBGWF9CT09MCQkJCW1fYkNoYXJDb2RlOw0KLSAgICBJRlhfRm9udAkJCSptX3BGb250Ow0KLSAgICBpbnQzMl90CQkJbV9pRm9udEhlaWdodDsNCi0gICAgaW50MzJfdAkJCW1faUZvbnRTaXplOw0KLSAgICBpbnQzMl90CQkJbV9pVGFiV2lkdGg7DQotICAgIENGWF9JbnQzMkFycmF5CQltX1Bvc2l0aW9uZWRUYWJzOw0KLSAgICBGWF9CT09MCQkJCW1fYk9ycGhhbkxpbmU7DQotICAgIEZYX1dDSEFSCQkJbV93RGVmQ2hhcjsNCi0gICAgaW50MzJfdAkJCW1faURlZkNoYXI7DQotICAgIEZYX1dDSEFSCQkJbV93TGluZUJyZWFrQ2hhcjsNCi0gICAgaW50MzJfdAkJCW1faUhvcml6b250YWxTY2FsZTsNCi0gICAgaW50MzJfdAkJCW1faVZlcnRpY2FsU2NhbGU7DQotICAgIGludDMyX3QJCQltX2lMaW5lUm90YXRpb247DQotICAgIGludDMyX3QJCQltX2lDaGFyUm90YXRpb247DQotICAgIGludDMyX3QJCQltX2lSb3RhdGlvbjsNCi0gICAgaW50MzJfdAkJCW1faUNoYXJTcGFjZTsNCi0gICAgRlhfQk9PTAkJCQltX2JXb3JkU3BhY2U7DQotICAgIGludDMyX3QJCQltX2lXb3JkU3BhY2U7DQotICAgIEZYX0JPT0wJCQkJbV9iUlRMOw0KLSAgICBpbnQzMl90CQkJbV9pQWxpZ25tZW50Ow0KLSAgICBJRlhfVW5rbm93bgkJCSptX3BVc2VyRGF0YTsNCi0gICAgRlhfRFdPUkQJCQltX2R3Q2hhclR5cGU7DQotICAgIEZYX0RXT1JECQkJbV9kd0lkZW50aXR5Ow0KLSAgICBDRlhfUlRGTGluZQkJCW1fUlRGTGluZTE7DQotICAgIENGWF9SVEZMaW5lCQkJbV9SVEZMaW5lMjsNCi0gICAgQ0ZYX1JURkxpbmUJCQkqbV9wQ3VyTGluZTsNCi0gICAgaW50MzJfdAkJCW1faVJlYWR5Ow0KLSAgICBpbnQzMl90CQkJbV9pVG9sZXJhbmNlOw0KLSAgICBpbnQzMl90CQkJR2V0TGluZVJvdGF0aW9uKEZYX0RXT1JEIGR3U3R5bGVzKSBjb25zdDsNCi0gICAgdm9pZAkJCQlTZXRCcmVha1N0YXR1cygpOw0KLSAgICBDRlhfUlRGQ2hhcioJCUdldExhc3RDaGFyKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KLSAgICBDRlhfUlRGTGluZSoJCUdldFJURkxpbmUoRlhfQk9PTCBiUmVhZHkpIGNvbnN0Ow0KLSAgICBDRlhfUlRGUGllY2VBcnJheSoJR2V0UlRGUGllY2VzKEZYX0JPT0wgYlJlYWR5KSBjb25zdDsNCi0gICAgRlhfRFdPUkQJCQlHZXRVbmlmaWVkQ2hhclR5cGUoRlhfRFdPUkQgZHdUeXBlKSBjb25zdDsNCi0gICAgaW50MzJfdAkJCUdldExhc3RQb3NpdGlvbmVkVGFiKCkgY29uc3Q7DQotICAgIEZYX0JPT0wJCQkJR2V0UG9zaXRpb25lZFRhYihpbnQzMl90ICZpVGFiUG9zKSBjb25zdDsNCi0gICAgaW50MzJfdAkJCUdldEJyZWFrUG9zKENGWF9SVEZDaGFyQXJyYXkgJnRjYSwgaW50MzJfdCAmaUVuZFBvcywgRlhfQk9PTCBiQWxsQ2hhcnMgPSBGQUxTRSwgRlhfQk9PTCBiT25seUJyayA9IEZBTFNFKTsNCi0gICAgdm9pZAkJCQlTcGxpdFRleHRMaW5lKENGWF9SVEZMaW5lICpwQ3VyTGluZSwgQ0ZYX1JURkxpbmUgKnBOZXh0TGluZSwgRlhfQk9PTCBiQWxsQ2hhcnMgPSBGQUxTRSk7DQotICAgIEZYX0JPT0wJCQkJRW5kQnJlYWtfU3BsaXRMaW5lKENGWF9SVEZMaW5lICpwTmV4dExpbmUsIEZYX0JPT0wgYkFsbENoYXJzLCBGWF9EV09SRCBkd1N0YXR1cyk7DQotICAgIHZvaWQJCQkJRW5kQnJlYWtfQmlkaUxpbmUoQ0ZYX1RQT0FycmF5ICZ0cG9zLCBGWF9EV09SRCBkd1N0YXR1cyk7DQotICAgIHZvaWQJCQkJRW5kQnJlYWtfQWxpZ25tZW50KENGWF9UUE9BcnJheSAmdHBvcywgRlhfQk9PTCBiQWxsQ2hhcnMsIEZYX0RXT1JEIGR3U3RhdHVzKTsNCitjbGFzcyBDRlhfUlRGQnJlYWsgOiBwdWJsaWMgSUZYX1JURkJyZWFrIHsNCisgcHVibGljOg0KKyAgQ0ZYX1JURkJyZWFrKEZYX0RXT1JEIGR3UG9saWNpZXMpOw0KKyAgfkNGWF9SVEZCcmVhaygpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZVdpZHRoKEZYX0ZMT0FUIGZMaW5lU3RhcnQsIEZYX0ZMT0FUIGZMaW5lRW5kKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lUG9zKEZYX0ZMT0FUIGZMaW5lUG9zKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0TGF5b3V0U3R5bGVzKCkgY29uc3QgeyByZXR1cm4gbV9kd0xheW91dFN0eWxlczsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcyk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udChJRlhfRm9udCogcEZvbnQpOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoKTsNCisgIHZpcnR1YWwgdm9pZCBBZGRQb3NpdGlvbmVkVGFiKEZYX0ZMT0FUIGZUYWJQb3MpOw0KKyAgdmlydHVhbCB2b2lkIFNldFBvc2l0aW9uZWRUYWJzKGNvbnN0IENGWF9GbG9hdEFycmF5JiB0YWJzKTsNCisgIHZpcnR1YWwgdm9pZCBDbGVhclBvc2l0aW9uZWRUYWJzKCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0RGVmYXVsdENoYXIoRlhfV0NIQVIgd2NoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpOw0KKyAgdmlydHVhbCB2b2lkIFNldEhvcml6b250YWxTY2FsZShpbnQzMl90IGlTY2FsZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0VmVydGljYWxTY2FsZShpbnQzMl90IGlTY2FsZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhclJvdGF0aW9uKGludDMyX3QgaUNoYXJSb3RhdGlvbik7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpOw0KKyAgdmlydHVhbCB2b2lkIFNldFdvcmRTcGFjZShGWF9CT09MIGJEZWZhdWx0LCBGWF9GTE9BVCBmV29yZFNwYWNlKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRSZWFkaW5nT3JkZXIoRlhfQk9PTCBiUlRMID0gRkFMU0UpOw0KKyAgdmlydHVhbCB2b2lkIFNldEFsaWdubWVudChpbnQzMl90IGlBbGlnbm1lbnQgPSBGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQpOw0KKyAgdmlydHVhbCB2b2lkIFNldFVzZXJEYXRhKElGWF9Vbmtub3duKiBwVXNlckRhdGEpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzID0gRlhfUlRGQlJFQUtfUGllY2VCcmVhayk7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRCcmVha1BpZWNlcygpIGNvbnN0Ow0KKyAgdmlydHVhbCBjb25zdCBDRlhfUlRGUGllY2UqIEdldEJyZWFrUGllY2UoaW50MzJfdCBpbmRleCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TGluZVJlY3QoQ0ZYX1JlY3RGJiByZWN0KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBDbGVhckJyZWFrUGllY2VzKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXREaXNwbGF5UG9zKA0KKyAgICAgIEZYX0xQQ1JURlRFWFRPQkogcFRleHQsDQorICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UsDQorICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBXU0Zvcm1zID0gTlVMTCwNCisgICAgICBGWF9BZGp1c3RDaGFyRGlzcGxheVBvcyBwQWRqdXN0UG9zID0gTlVMTCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhclJlY3RzKEZYX0xQQ1JURlRFWFRPQkogcFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RkFycmF5JiBydEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQkJveCA9IEZBTFNFKSBjb25zdDsNCisgIEZYX0RXT1JEIEFwcGVuZENoYXJfQ2hhckNvZGUoRlhfV0NIQVIgd2NoKTsNCisgIEZYX0RXT1JEIEFwcGVuZENoYXJfQ29tYmluYXRpb24oQ0ZYX1JURkNoYXIqIHBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQorICBGWF9EV09SRCBBcHBlbmRDaGFyX1RhYihDRlhfUlRGQ2hhciogcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsNCisgIEZYX0RXT1JEIEFwcGVuZENoYXJfQ29udHJvbChDRlhfUlRGQ2hhciogcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsNCisgIEZYX0RXT1JEIEFwcGVuZENoYXJfQXJhYmljKENGWF9SVEZDaGFyKiBwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pOw0KKyAgRlhfRFdPUkQgQXBwZW5kQ2hhcl9PdGhlcnMoQ0ZYX1JURkNoYXIqIHBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0RXT1JEIG1fZHdQb2xpY2llczsNCisgIElGWF9BcmFiaWNDaGFyKiBtX3BBcmFiaWNDaGFyOw0KKyAgaW50MzJfdCBtX2lMaW5lU3RhcnQ7DQorICBpbnQzMl90IG1faUxpbmVFbmQ7DQorICBGWF9EV09SRCBtX2R3TGF5b3V0U3R5bGVzOw0KKyAgRlhfQk9PTCBtX2JQYWdpbmF0aW9uOw0KKyAgRlhfQk9PTCBtX2JWZXJ0aWNhbDsNCisgIEZYX0JPT0wgbV9iU2luZ2xlTGluZTsNCisgIEZYX0JPT0wgbV9iQ2hhckNvZGU7DQorICBJRlhfRm9udCogbV9wRm9udDsNCisgIGludDMyX3QgbV9pRm9udEhlaWdodDsNCisgIGludDMyX3QgbV9pRm9udFNpemU7DQorICBpbnQzMl90IG1faVRhYldpZHRoOw0KKyAgQ0ZYX0ludDMyQXJyYXkgbV9Qb3NpdGlvbmVkVGFiczsNCisgIEZYX0JPT0wgbV9iT3JwaGFuTGluZTsNCisgIEZYX1dDSEFSIG1fd0RlZkNoYXI7DQorICBpbnQzMl90IG1faURlZkNoYXI7DQorICBGWF9XQ0hBUiBtX3dMaW5lQnJlYWtDaGFyOw0KKyAgaW50MzJfdCBtX2lIb3Jpem9udGFsU2NhbGU7DQorICBpbnQzMl90IG1faVZlcnRpY2FsU2NhbGU7DQorICBpbnQzMl90IG1faUxpbmVSb3RhdGlvbjsNCisgIGludDMyX3QgbV9pQ2hhclJvdGF0aW9uOw0KKyAgaW50MzJfdCBtX2lSb3RhdGlvbjsNCisgIGludDMyX3QgbV9pQ2hhclNwYWNlOw0KKyAgRlhfQk9PTCBtX2JXb3JkU3BhY2U7DQorICBpbnQzMl90IG1faVdvcmRTcGFjZTsNCisgIEZYX0JPT0wgbV9iUlRMOw0KKyAgaW50MzJfdCBtX2lBbGlnbm1lbnQ7DQorICBJRlhfVW5rbm93biogbV9wVXNlckRhdGE7DQorICBGWF9EV09SRCBtX2R3Q2hhclR5cGU7DQorICBGWF9EV09SRCBtX2R3SWRlbnRpdHk7DQorICBDRlhfUlRGTGluZSBtX1JURkxpbmUxOw0KKyAgQ0ZYX1JURkxpbmUgbV9SVEZMaW5lMjsNCisgIENGWF9SVEZMaW5lKiBtX3BDdXJMaW5lOw0KKyAgaW50MzJfdCBtX2lSZWFkeTsNCisgIGludDMyX3QgbV9pVG9sZXJhbmNlOw0KKyAgaW50MzJfdCBHZXRMaW5lUm90YXRpb24oRlhfRFdPUkQgZHdTdHlsZXMpIGNvbnN0Ow0KKyAgdm9pZCBTZXRCcmVha1N0YXR1cygpOw0KKyAgQ0ZYX1JURkNoYXIqIEdldExhc3RDaGFyKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgQ0ZYX1JURkxpbmUqIEdldFJURkxpbmUoRlhfQk9PTCBiUmVhZHkpIGNvbnN0Ow0KKyAgQ0ZYX1JURlBpZWNlQXJyYXkqIEdldFJURlBpZWNlcyhGWF9CT09MIGJSZWFkeSkgY29uc3Q7DQorICBGWF9EV09SRCBHZXRVbmlmaWVkQ2hhclR5cGUoRlhfRFdPUkQgZHdUeXBlKSBjb25zdDsNCisgIGludDMyX3QgR2V0TGFzdFBvc2l0aW9uZWRUYWIoKSBjb25zdDsNCisgIEZYX0JPT0wgR2V0UG9zaXRpb25lZFRhYihpbnQzMl90JiBpVGFiUG9zKSBjb25zdDsNCisgIGludDMyX3QgR2V0QnJlYWtQb3MoQ0ZYX1JURkNoYXJBcnJheSYgdGNhLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRW5kUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycyA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPbmx5QnJrID0gRkFMU0UpOw0KKyAgdm9pZCBTcGxpdFRleHRMaW5lKENGWF9SVEZMaW5lKiBwQ3VyTGluZSwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfUlRGTGluZSogcE5leHRMaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzID0gRkFMU0UpOw0KKyAgRlhfQk9PTCBFbmRCcmVha19TcGxpdExpbmUoQ0ZYX1JURkxpbmUqIHBOZXh0TGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMpOw0KKyAgdm9pZCBFbmRCcmVha19CaWRpTGluZShDRlhfVFBPQXJyYXkmIHRwb3MsIEZYX0RXT1JEIGR3U3RhdHVzKTsNCisgIHZvaWQgRW5kQnJlYWtfQWxpZ25tZW50KENGWF9UUE9BcnJheSYgdHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdGV4dGJyZWFrLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3RleHRicmVhay5jcHAKaW5kZXggZjQ4M2I4Ny4uYjVhYTgyYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdGV4dGJyZWFrLmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF90ZXh0YnJlYWsuY3BwCkBAIC0xMywxNjQzICsxMywxNjQ5IEBACiBleHRlcm4gY29uc3QgRlhfV0NIQVIgZ3NfRlhfVGV4dExheW91dF9WZXJ0aWNhbE1pcnJvcls2NF07DQogZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGdzX0ZYX1RleHRMYXlvdXRfQmlkaU1pcnJvcls1MTJdOw0KIGV4dGVybiBjb25zdCBGWF9MSU5FQlJFQUtUWVBFIGdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGVbNjRdWzMyXTsNCi1JRlhfVHh0QnJlYWsqIElGWF9UeHRCcmVhazo6Q3JlYXRlKEZYX0RXT1JEIGR3UG9saWNpZXMpDQotew0KLSAgICByZXR1cm4gRlhfTkVXIENGWF9UeHRCcmVhayhkd1BvbGljaWVzKTsNCitJRlhfVHh0QnJlYWsqIElGWF9UeHRCcmVhazo6Q3JlYXRlKEZYX0RXT1JEIGR3UG9saWNpZXMpIHsNCisgIHJldHVybiBGWF9ORVcgQ0ZYX1R4dEJyZWFrKGR3UG9saWNpZXMpOw0KIH0NCiBDRlhfVHh0QnJlYWs6OkNGWF9UeHRCcmVhayhGWF9EV09SRCBkd1BvbGljaWVzKQ0KLSAgICA6IG1fZHdQb2xpY2llcyhkd1BvbGljaWVzKQ0KLSAgICAsIG1fcEFyYWJpY0NoYXIoTlVMTCkNCi0gICAgLCBtX2lMaW5lV2lkdGgoMjAwMDAwMCkNCi0gICAgLCBtX2R3TGF5b3V0U3R5bGVzKDApDQotICAgICwgbV9iVmVydGljYWwoRkFMU0UpDQotICAgICwgbV9iQXJhYmljQ29udGV4dChGQUxTRSkNCi0gICAgLCBtX2JBcmFiaWNTaGFwZXMoRkFMU0UpDQotICAgICwgbV9iUlRMKEZBTFNFKQ0KLSAgICAsIG1fYlNpbmdsZUxpbmUoRkFMU0UpDQotICAgICwgbV9iQ29tYlRleHQoRkFMU0UpDQotICAgICwgbV9pQXJhYmljQ29udGV4dCgxKQ0KLSAgICAsIG1faUN1ckFyYWJpY0NvbnRleHQoMSkNCi0gICAgLCBtX3BGb250KE5VTEwpDQotICAgICwgbV9pRm9udFNpemUoMjQwKQ0KLSAgICAsIG1fYkVxdWlkaXN0YW50KFRSVUUpDQotICAgICwgbV9pVGFiV2lkdGgoNzIwMDAwKQ0KLSAgICAsIG1fd0RlZkNoYXIoMHhGRUZGKQ0KLSAgICAsIG1fd1BhcmFnQnJlYWtDaGFyKEwnXG4nKQ0KLSAgICAsIG1faURlZkNoYXIoMCkNCi0gICAgLCBtX2lMaW5lUm90YXRpb24oMCkNCi0gICAgLCBtX2lDaGFyUm90YXRpb24oMCkNCi0gICAgLCBtX2lSb3RhdGlvbigwKQ0KLSAgICAsIG1faUFsaWdubWVudChGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQpDQotICAgICwgbV9kd0NvbnRleHRDaGFyU3R5bGVzKDApDQotICAgICwgbV9pQ29tYldpZHRoKDM2MDAwMCkNCi0gICAgLCBtX3BVc2VyRGF0YShOVUxMKQ0KLSAgICAsIG1fZHdDaGFyVHlwZSgwKQ0KLSAgICAsIG1fYkFyYWJpY051bWJlcihGQUxTRSkNCi0gICAgLCBtX2JBcmFiaWNDb21tYShGQUxTRSkNCi0gICAgLCBtX3BDdXJMaW5lKE5VTEwpDQotICAgICwgbV9pUmVhZHkoMCkNCi0gICAgLCBtX2lUb2xlcmFuY2UoMCkNCi0gICAgLCBtX2lIb3JTY2FsZSgxMDApDQotICAgICwgbV9pVmVyU2NhbGUoMTAwKQ0KLSAgICAsIG1faUNoYXJTcGFjZSgwKQ0KLXsNCi0gICAgbV9iUGFnaW5hdGlvbiA9IChtX2R3UG9saWNpZXMgJiBGWF9UWFRCUkVBS1BPTElDWV9QYWdpbmF0aW9uKSAhPSAwOw0KLSAgICBtX3BBcmFiaWNDaGFyID0gSUZYX0FyYWJpY0NoYXI6OkNyZWF0ZSgpOw0KLSAgICBpZiAobV9iUGFnaW5hdGlvbikgew0KLSAgICAgICAgbV9wVHh0TGluZTEgPSBGWF9ORVcgQ0ZYX1R4dExpbmUoc2l6ZW9mKENGWF9DaGFyKSk7DQotICAgICAgICBtX3BUeHRMaW5lMiA9IEZYX05FVyBDRlhfVHh0TGluZShzaXplb2YoQ0ZYX0NoYXIpKTsNCisgICAgOiBtX2R3UG9saWNpZXMoZHdQb2xpY2llcyksDQorICAgICAgbV9wQXJhYmljQ2hhcihOVUxMKSwNCisgICAgICBtX2lMaW5lV2lkdGgoMjAwMDAwMCksDQorICAgICAgbV9kd0xheW91dFN0eWxlcygwKSwNCisgICAgICBtX2JWZXJ0aWNhbChGQUxTRSksDQorICAgICAgbV9iQXJhYmljQ29udGV4dChGQUxTRSksDQorICAgICAgbV9iQXJhYmljU2hhcGVzKEZBTFNFKSwNCisgICAgICBtX2JSVEwoRkFMU0UpLA0KKyAgICAgIG1fYlNpbmdsZUxpbmUoRkFMU0UpLA0KKyAgICAgIG1fYkNvbWJUZXh0KEZBTFNFKSwNCisgICAgICBtX2lBcmFiaWNDb250ZXh0KDEpLA0KKyAgICAgIG1faUN1ckFyYWJpY0NvbnRleHQoMSksDQorICAgICAgbV9wRm9udChOVUxMKSwNCisgICAgICBtX2lGb250U2l6ZSgyNDApLA0KKyAgICAgIG1fYkVxdWlkaXN0YW50KFRSVUUpLA0KKyAgICAgIG1faVRhYldpZHRoKDcyMDAwMCksDQorICAgICAgbV93RGVmQ2hhcigweEZFRkYpLA0KKyAgICAgIG1fd1BhcmFnQnJlYWtDaGFyKEwnXG4nKSwNCisgICAgICBtX2lEZWZDaGFyKDApLA0KKyAgICAgIG1faUxpbmVSb3RhdGlvbigwKSwNCisgICAgICBtX2lDaGFyUm90YXRpb24oMCksDQorICAgICAgbV9pUm90YXRpb24oMCksDQorICAgICAgbV9pQWxpZ25tZW50KEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdCksDQorICAgICAgbV9kd0NvbnRleHRDaGFyU3R5bGVzKDApLA0KKyAgICAgIG1faUNvbWJXaWR0aCgzNjAwMDApLA0KKyAgICAgIG1fcFVzZXJEYXRhKE5VTEwpLA0KKyAgICAgIG1fZHdDaGFyVHlwZSgwKSwNCisgICAgICBtX2JBcmFiaWNOdW1iZXIoRkFMU0UpLA0KKyAgICAgIG1fYkFyYWJpY0NvbW1hKEZBTFNFKSwNCisgICAgICBtX3BDdXJMaW5lKE5VTEwpLA0KKyAgICAgIG1faVJlYWR5KDApLA0KKyAgICAgIG1faVRvbGVyYW5jZSgwKSwNCisgICAgICBtX2lIb3JTY2FsZSgxMDApLA0KKyAgICAgIG1faVZlclNjYWxlKDEwMCksDQorICAgICAgbV9pQ2hhclNwYWNlKDApIHsNCisgIG1fYlBhZ2luYXRpb24gPSAobV9kd1BvbGljaWVzICYgRlhfVFhUQlJFQUtQT0xJQ1lfUGFnaW5hdGlvbikgIT0gMDsNCisgIG1fcEFyYWJpY0NoYXIgPSBJRlhfQXJhYmljQ2hhcjo6Q3JlYXRlKCk7DQorICBpZiAobV9iUGFnaW5hdGlvbikgew0KKyAgICBtX3BUeHRMaW5lMSA9IEZYX05FVyBDRlhfVHh0TGluZShzaXplb2YoQ0ZYX0NoYXIpKTsNCisgICAgbV9wVHh0TGluZTIgPSBGWF9ORVcgQ0ZYX1R4dExpbmUoc2l6ZW9mKENGWF9DaGFyKSk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BUeHRMaW5lMSA9IEZYX05FVyBDRlhfVHh0TGluZShzaXplb2YoQ0ZYX1R4dENoYXIpKTsNCisgICAgbV9wVHh0TGluZTIgPSBGWF9ORVcgQ0ZYX1R4dExpbmUoc2l6ZW9mKENGWF9UeHRDaGFyKSk7DQorICB9DQorICBtX3BDdXJMaW5lID0gbV9wVHh0TGluZTE7DQorICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCit9DQorQ0ZYX1R4dEJyZWFrOjp+Q0ZYX1R4dEJyZWFrKCkgew0KKyAgUmVzZXQoKTsNCisgIGRlbGV0ZSBtX3BUeHRMaW5lMTsNCisgIGRlbGV0ZSBtX3BUeHRMaW5lMjsNCisgIG1fcEFyYWJpY0NoYXItPlJlbGVhc2UoKTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldExpbmVXaWR0aChGWF9GTE9BVCBmTGluZVdpZHRoKSB7DQorICBtX2lMaW5lV2lkdGggPSBGWFNZU19yb3VuZChmTGluZVdpZHRoICogMjAwMDAuMGYpOw0KKyAgRlhTWVNfYXNzZXJ0KG1faUxpbmVXaWR0aCA+PSAyMDAwMCk7DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRMaW5lUG9zKEZYX0ZMT0FUIGZMaW5lUG9zKSB7DQorICBpbnQzMl90IGlMaW5lUG9zID0gRlhTWVNfcm91bmQoZkxpbmVQb3MgKiAyMDAwMC4wZik7DQorICBpZiAoaUxpbmVQb3MgPCAwKSB7DQorICAgIGlMaW5lUG9zID0gMDsNCisgIH0NCisgIGlmIChpTGluZVBvcyA+IG1faUxpbmVXaWR0aCkgew0KKyAgICBpTGluZVBvcyA9IG1faUxpbmVXaWR0aDsNCisgIH0NCisgIG1fcEN1ckxpbmUtPm1faVN0YXJ0ID0gaUxpbmVQb3M7DQorICBtX3BDdXJMaW5lLT5tX2lXaWR0aCArPSBpTGluZVBvczsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcykgew0KKyAgbV9kd0xheW91dFN0eWxlcyA9IGR3TGF5b3V0U3R5bGVzOw0KKyAgbV9iVmVydGljYWwgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMpICE9IDA7DQorICBtX2JBcmFiaWNDb250ZXh0ID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNDb250ZXh0KSAhPSAwOw0KKyAgbV9iQXJhYmljU2hhcGVzID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNTaGFwZXMpICE9IDA7DQorICBtX2JSVEwgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1JUTFJlYWRpbmdPcmRlcikgIT0gMDsNCisgIG1fYlNpbmdsZUxpbmUgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1NpbmdsZUxpbmUpICE9IDA7DQorICBtX2JDb21iVGV4dCA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQpICE9IDA7DQorICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCisgIG1faUxpbmVSb3RhdGlvbiA9IEdldExpbmVSb3RhdGlvbihtX2R3TGF5b3V0U3R5bGVzKTsNCisgIG1faVJvdGF0aW9uID0gbV9pTGluZVJvdGF0aW9uICsgbV9pQ2hhclJvdGF0aW9uOw0KKyAgbV9pUm90YXRpb24gJT0gNDsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldEZvbnQoSUZYX0ZvbnQqIHBGb250KSB7DQorICBpZiAocEZvbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9wRm9udCA9PSBwRm9udCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBTZXRCcmVha1N0YXR1cygpOw0KKyAgbV9wRm9udCA9IHBGb250Ow0KKyAgbV9pRGVmQ2hhciA9IDA7DQorICBpZiAobV93RGVmQ2hhciAhPSAweEZFRkYgJiYgbV9wRm9udCAhPSBOVUxMKSB7DQorICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aChtX3dEZWZDaGFyLCBtX2lEZWZDaGFyLCBGQUxTRSk7DQorICAgIG1faURlZkNoYXIgKj0gbV9pRm9udFNpemU7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsNCisgIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KKyAgaWYgKG1faUZvbnRTaXplID09IGlGb250U2l6ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBTZXRCcmVha1N0YXR1cygpOw0KKyAgbV9pRm9udFNpemUgPSBpRm9udFNpemU7DQorICBtX2lEZWZDaGFyID0gMDsNCisgIGlmIChtX3dEZWZDaGFyICE9IDB4RkVGRiAmJiBtX3BGb250ICE9IE5VTEwpIHsNCisgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIEZBTFNFKTsNCisgICAgbV9pRGVmQ2hhciAqPSBtX2lGb250U2l6ZTsNCisgIH0NCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgRlhfQk9PTCBiRXF1aWRpc3RhbnQpIHsNCisgIG1faVRhYldpZHRoID0gRlhTWVNfcm91bmQoZlRhYldpZHRoICogMjAwMDAuMGYpOw0KKyAgaWYgKG1faVRhYldpZHRoIDwgRlhfVFhUQlJFQUtfTWluaW11bVRhYldpZHRoKSB7DQorICAgIG1faVRhYldpZHRoID0gRlhfVFhUQlJFQUtfTWluaW11bVRhYldpZHRoOw0KKyAgfQ0KKyAgbV9iRXF1aWRpc3RhbnQgPSBiRXF1aWRpc3RhbnQ7DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXREZWZhdWx0Q2hhcihGWF9XQ0hBUiB3Y2gpIHsNCisgIG1fd0RlZkNoYXIgPSB3Y2g7DQorICBtX2lEZWZDaGFyID0gMDsNCisgIGlmIChtX3dEZWZDaGFyICE9IDB4RkVGRiAmJiBtX3BGb250ICE9IE5VTEwpIHsNCisgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIEZBTFNFKTsNCisgICAgaWYgKG1faURlZkNoYXIgPCAwKSB7DQorICAgICAgbV9pRGVmQ2hhciA9IDA7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BUeHRMaW5lMSA9IEZYX05FVyBDRlhfVHh0TGluZShzaXplb2YoQ0ZYX1R4dENoYXIpKTsNCi0gICAgICAgIG1fcFR4dExpbmUyID0gRlhfTkVXIENGWF9UeHRMaW5lKHNpemVvZihDRlhfVHh0Q2hhcikpOw0KKyAgICAgIG1faURlZkNoYXIgKj0gbV9pRm9udFNpemU7DQogICAgIH0NCi0gICAgbV9wQ3VyTGluZSA9IG1fcFR4dExpbmUxOw0KLSAgICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCisgIH0NCiB9DQotQ0ZYX1R4dEJyZWFrOjp+Q0ZYX1R4dEJyZWFrKCkNCi17DQotICAgIFJlc2V0KCk7DQotICAgIGRlbGV0ZSBtX3BUeHRMaW5lMTsNCi0gICAgZGVsZXRlIG1fcFR4dExpbmUyOw0KLSAgICBtX3BBcmFiaWNDaGFyLT5SZWxlYXNlKCk7DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpIHsNCisgIGlmICh3Y2ggIT0gTCdccicgJiYgd2NoICE9IEwnXG4nKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fd1BhcmFnQnJlYWtDaGFyID0gd2NoOw0KIH0NCi12b2lkIENGWF9UeHRCcmVhazo6U2V0TGluZVdpZHRoKEZYX0ZMT0FUIGZMaW5lV2lkdGgpDQotew0KLSAgICBtX2lMaW5lV2lkdGggPSBGWFNZU19yb3VuZChmTGluZVdpZHRoICogMjAwMDAuMGYpOw0KLSAgICBGWFNZU19hc3NlcnQobV9pTGluZVdpZHRoID49IDIwMDAwKTsNCit2b2lkIENGWF9UeHRCcmVhazo6U2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpIHsNCisgIG1faVRvbGVyYW5jZSA9IEZYU1lTX3JvdW5kKGZUb2xlcmFuY2UgKiAyMDAwMC4wZik7DQogfQ0KLXZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRMaW5lUG9zKEZYX0ZMT0FUIGZMaW5lUG9zKQ0KLXsNCi0gICAgaW50MzJfdCBpTGluZVBvcyA9IEZYU1lTX3JvdW5kKGZMaW5lUG9zICogMjAwMDAuMGYpOw0KLSAgICBpZiAoaUxpbmVQb3MgPCAwKSB7DQotICAgICAgICBpTGluZVBvcyA9IDA7DQotICAgIH0NCi0gICAgaWYgKGlMaW5lUG9zID4gbV9pTGluZVdpZHRoKSB7DQotICAgICAgICBpTGluZVBvcyA9IG1faUxpbmVXaWR0aDsNCi0gICAgfQ0KLSAgICBtX3BDdXJMaW5lLT5tX2lTdGFydCA9IGlMaW5lUG9zOw0KLSAgICBtX3BDdXJMaW5lLT5tX2lXaWR0aCArPSBpTGluZVBvczsNCit2b2lkIENGWF9UeHRCcmVhazo6U2V0Q2hhclJvdGF0aW9uKGludDMyX3QgaUNoYXJSb3RhdGlvbikgew0KKyAgaWYgKGlDaGFyUm90YXRpb24gPCAwKSB7DQorICAgIGlDaGFyUm90YXRpb24gKz0gKC1pQ2hhclJvdGF0aW9uIC8gNCArIDEpICogNDsNCisgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA+IDMpIHsNCisgICAgaUNoYXJSb3RhdGlvbiAtPSAoaUNoYXJSb3RhdGlvbiAvIDQpICogNDsNCisgIH0NCisgIGlmIChtX2lDaGFyUm90YXRpb24gPT0gaUNoYXJSb3RhdGlvbikgew0KKyAgICByZXR1cm47DQorICB9DQorICBTZXRCcmVha1N0YXR1cygpOw0KKyAgbV9pQ2hhclJvdGF0aW9uID0gaUNoYXJSb3RhdGlvbjsNCisgIG1faVJvdGF0aW9uID0gbV9pTGluZVJvdGF0aW9uICsgbV9pQ2hhclJvdGF0aW9uOw0KKyAgbV9pUm90YXRpb24gJT0gNDsNCiB9DQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcykNCi17DQotICAgIG1fZHdMYXlvdXRTdHlsZXMgPSBkd0xheW91dFN0eWxlczsNCi0gICAgbV9iVmVydGljYWwgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMpICE9IDA7DQotICAgIG1fYkFyYWJpY0NvbnRleHQgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY0NvbnRleHQpICE9IDA7DQotICAgIG1fYkFyYWJpY1NoYXBlcyA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzKSAhPSAwOw0KLSAgICBtX2JSVEwgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1JUTFJlYWRpbmdPcmRlcikgIT0gMDsNCi0gICAgbV9iU2luZ2xlTGluZSA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfU2luZ2xlTGluZSkgIT0gMDsNCi0gICAgbV9iQ29tYlRleHQgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0KSAhPSAwOw0KLSAgICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCi0gICAgbV9pTGluZVJvdGF0aW9uID0gR2V0TGluZVJvdGF0aW9uKG1fZHdMYXlvdXRTdHlsZXMpOw0KLSAgICBtX2lSb3RhdGlvbiA9IG1faUxpbmVSb3RhdGlvbiArIG1faUNoYXJSb3RhdGlvbjsNCi0gICAgbV9pUm90YXRpb24gJT0gNDsNCit2b2lkIENGWF9UeHRCcmVhazo6U2V0QWxpZ25tZW50KGludDMyX3QgaUFsaWdubWVudCkgew0KKyAgRlhTWVNfYXNzZXJ0KGlBbGlnbm1lbnQgPj0gRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0ICYmDQorICAgICAgICAgICAgICAgaUFsaWdubWVudCA8PSBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKTsNCisgIG1faUFsaWdubWVudCA9IGlBbGlnbm1lbnQ7DQorICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCiB9DQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldEZvbnQoSUZYX0ZvbnQgKnBGb250KQ0KLXsNCi0gICAgaWYgKHBGb250ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAobV9wRm9udCA9PSBwRm9udCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIFNldEJyZWFrU3RhdHVzKCk7DQotICAgIG1fcEZvbnQgPSBwRm9udDsNCi0gICAgbV9pRGVmQ2hhciA9IDA7DQotICAgIGlmIChtX3dEZWZDaGFyICE9IDB4RkVGRiAmJiBtX3BGb250ICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aChtX3dEZWZDaGFyLCBtX2lEZWZDaGFyLCBGQUxTRSk7DQotICAgICAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KLSAgICB9DQordm9pZCBDRlhfVHh0QnJlYWs6OlJlc2V0Q29udGV4dENoYXJTdHlsZXMoKSB7DQorICBtX2R3Q29udGV4dENoYXJTdHlsZXMgPSBtX2JBcmFiaWNDb250ZXh0ID8gbV9pQ3VyQWxpZ25tZW50IDogbV9pQWxpZ25tZW50Ow0KKyAgaWYgKG1fYkFyYWJpY051bWJlcikgew0KKyAgICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY051bWJlcjsNCisgIH0NCisgIGlmIChtX2JBcmFiaWNDb21tYSkgew0KKyAgICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0NvbW1hOw0KKyAgfQ0KKyAgaWYgKChtX2JBcmFiaWNDb250ZXh0ICYmIG1fYkN1clJUTCkgfHwgKCFtX2JBcmFiaWNDb250ZXh0ICYmIG1fYlJUTCkpIHsNCisgICAgbV9kd0NvbnRleHRDaGFyU3R5bGVzIHw9IEZYX1RYVENIQVJTVFlMRV9SVExSZWFkaW5nT3JkZXI7DQorICB9DQorICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gKG1faUFyYWJpY0NvbnRleHQgPDwgOCk7DQogfQ0KLXZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpDQotew0KLSAgICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsNCi0gICAgaWYgKG1faUZvbnRTaXplID09IGlGb250U2l6ZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIFNldEJyZWFrU3RhdHVzKCk7DQotICAgIG1faUZvbnRTaXplID0gaUZvbnRTaXplOw0KLSAgICBtX2lEZWZDaGFyID0gMDsNCi0gICAgaWYgKG1fd0RlZkNoYXIgIT0gMHhGRUZGICYmIG1fcEZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIEZBTFNFKTsNCi0gICAgICAgIG1faURlZkNoYXIgKj0gbV9pRm9udFNpemU7DQotICAgIH0NCitGWF9EV09SRCBDRlhfVHh0QnJlYWs6OkdldENvbnRleHRDaGFyU3R5bGVzKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fZHdDb250ZXh0Q2hhclN0eWxlczsNCiB9DQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgRlhfQk9PTCBiRXF1aWRpc3RhbnQpDQotew0KLSAgICBtX2lUYWJXaWR0aCA9IEZYU1lTX3JvdW5kKGZUYWJXaWR0aCAqIDIwMDAwLjBmKTsNCi0gICAgaWYgKG1faVRhYldpZHRoIDwgRlhfVFhUQlJFQUtfTWluaW11bVRhYldpZHRoKSB7DQotICAgICAgICBtX2lUYWJXaWR0aCA9IEZYX1RYVEJSRUFLX01pbmltdW1UYWJXaWR0aDsNCi0gICAgfQ0KLSAgICBtX2JFcXVpZGlzdGFudCA9IGJFcXVpZGlzdGFudDsNCit2b2lkIENGWF9UeHRCcmVhazo6U2V0Q29udGV4dENoYXJTdHlsZXMoRlhfRFdPUkQgZHdDaGFyU3R5bGVzKSB7DQorICBtX2lDdXJBbGlnbm1lbnQgPSBkd0NoYXJTdHlsZXMgJiAweDBGOw0KKyAgbV9iQXJhYmljTnVtYmVyID0gKGR3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNOdW1iZXIpICE9IDA7DQorICBtX2JBcmFiaWNDb21tYSA9IChkd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29tbWEpICE9IDA7DQorICBtX2JDdXJSVEwgPSAoZHdDaGFyU3R5bGVzICYgRlhfVFhUQ0hBUlNUWUxFX1JUTFJlYWRpbmdPcmRlcikgIT0gMDsNCisgIG1faUN1ckFyYWJpY0NvbnRleHQgPSBtX2lBcmFiaWNDb250ZXh0ID0gKChkd0NoYXJTdHlsZXMgJiAweDAzMDApID4+IDgpOw0KKyAgUmVzZXRDb250ZXh0Q2hhclN0eWxlcygpOw0KIH0NCi12b2lkIENGWF9UeHRCcmVhazo6U2V0RGVmYXVsdENoYXIoRlhfV0NIQVIgd2NoKQ0KLXsNCi0gICAgbV93RGVmQ2hhciA9IHdjaDsNCi0gICAgbV9pRGVmQ2hhciA9IDA7DQotICAgIGlmIChtX3dEZWZDaGFyICE9IDB4RkVGRiAmJiBtX3BGb250ICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aChtX3dEZWZDaGFyLCBtX2lEZWZDaGFyLCBGQUxTRSk7DQotICAgICAgICBpZiAobV9pRGVmQ2hhciA8IDApIHsNCi0gICAgICAgICAgICBtX2lEZWZDaGFyID0gMDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9pRGVmQ2hhciAqPSBtX2lGb250U2l6ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRDb21iV2lkdGgoRlhfRkxPQVQgZkNvbWJXaWR0aCkgew0KKyAgbV9pQ29tYldpZHRoID0gRlhTWVNfcm91bmQoZkNvbWJXaWR0aCAqIDIwMDAwLjBmKTsNCiB9DQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpDQotew0KLSAgICBpZiAod2NoICE9IEwnXHInICYmIHdjaCAhPSBMJ1xuJykgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIG1fd1BhcmFnQnJlYWtDaGFyID0gd2NoOw0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRVc2VyRGF0YSh2b2lkKiBwVXNlckRhdGEpIHsNCisgIGlmIChtX3BVc2VyRGF0YSA9PSBwVXNlckRhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU2V0QnJlYWtTdGF0dXMoKTsNCisgIG1fcFVzZXJEYXRhID0gcFVzZXJEYXRhOw0KIH0NCi12b2lkIENGWF9UeHRCcmVhazo6U2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpDQotew0KLSAgICBtX2lUb2xlcmFuY2UgPSBGWFNZU19yb3VuZChmVG9sZXJhbmNlICogMjAwMDAuMGYpOw0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRCcmVha1N0YXR1cygpIHsNCisgIGlmIChtX2JQYWdpbmF0aW9uKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1R4dENoYXIqIHBUQyA9IChDRlhfVHh0Q2hhciopbV9wQ3VyTGluZS0+R2V0Q2hhclB0cihpQ291bnQgLSAxKTsNCisgIGlmIChwVEMtPm1fZHdTdGF0dXMgPT0gMCkgew0KKyAgICBwVEMtPm1fZHdTdGF0dXMgPSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrOw0KKyAgfQ0KIH0NCi12b2lkIENGWF9UeHRCcmVhazo6U2V0Q2hhclJvdGF0aW9uKGludDMyX3QgaUNoYXJSb3RhdGlvbikNCi17DQotICAgIGlmIChpQ2hhclJvdGF0aW9uIDwgMCkgew0KLSAgICAgICAgaUNoYXJSb3RhdGlvbiArPSAoLWlDaGFyUm90YXRpb24gLyA0ICsgMSkgKiA0Ow0KLSAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPiAzKSB7DQotICAgICAgICBpQ2hhclJvdGF0aW9uIC09IChpQ2hhclJvdGF0aW9uIC8gNCkgKiA0Ow0KLSAgICB9DQotICAgIGlmIChtX2lDaGFyUm90YXRpb24gPT0gaUNoYXJSb3RhdGlvbikgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIFNldEJyZWFrU3RhdHVzKCk7DQotICAgIG1faUNoYXJSb3RhdGlvbiA9IGlDaGFyUm90YXRpb247DQotICAgIG1faVJvdGF0aW9uID0gbV9pTGluZVJvdGF0aW9uICsgbV9pQ2hhclJvdGF0aW9uOw0KLSAgICBtX2lSb3RhdGlvbiAlPSA0Ow0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRIb3Jpem9udGFsU2NhbGUoaW50MzJfdCBpU2NhbGUpIHsNCisgIGlmIChpU2NhbGUgPCAwKSB7DQorICAgIGlTY2FsZSA9IDA7DQorICB9DQorICBpZiAoaVNjYWxlID09IG1faUhvclNjYWxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFNldEJyZWFrU3RhdHVzKCk7DQorICBtX2lIb3JTY2FsZSA9IGlTY2FsZTsNCiB9DQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldEFsaWdubWVudChpbnQzMl90IGlBbGlnbm1lbnQpDQotew0KLSAgICBGWFNZU19hc3NlcnQoaUFsaWdubWVudCA+PSBGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQgJiYgaUFsaWdubWVudCA8PSBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKTsNCi0gICAgbV9pQWxpZ25tZW50ID0gaUFsaWdubWVudDsNCi0gICAgUmVzZXRBcmFiaWNDb250ZXh0KCk7DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldFZlcnRpY2FsU2NhbGUoaW50MzJfdCBpU2NhbGUpIHsNCisgIGlmIChpU2NhbGUgPCAwKSB7DQorICAgIGlTY2FsZSA9IDA7DQorICB9DQorICBpZiAoaVNjYWxlID09IG1faUhvclNjYWxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFNldEJyZWFrU3RhdHVzKCk7DQorICBtX2lWZXJTY2FsZSA9IGlTY2FsZTsNCiB9DQotdm9pZCBDRlhfVHh0QnJlYWs6OlJlc2V0Q29udGV4dENoYXJTdHlsZXMoKQ0KLXsNCi0gICAgbV9kd0NvbnRleHRDaGFyU3R5bGVzID0gbV9iQXJhYmljQ29udGV4dCA/IG1faUN1ckFsaWdubWVudCA6IG1faUFsaWdubWVudDsNCi0gICAgaWYgKG1fYkFyYWJpY051bWJlcikgew0KLSAgICAgICAgbV9kd0NvbnRleHRDaGFyU3R5bGVzIHw9IEZYX1RYVENIQVJTVFlMRV9BcmFiaWNOdW1iZXI7DQotICAgIH0NCi0gICAgaWYgKG1fYkFyYWJpY0NvbW1hKSB7DQotICAgICAgICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0NvbW1hOw0KLSAgICB9DQotICAgIGlmICgobV9iQXJhYmljQ29udGV4dCAmJiBtX2JDdXJSVEwpIHx8ICghbV9iQXJhYmljQ29udGV4dCAmJiBtX2JSVEwpKSB7DQotICAgICAgICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX1JUTFJlYWRpbmdPcmRlcjsNCi0gICAgfQ0KLSAgICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gKG1faUFyYWJpY0NvbnRleHQgPDwgOCk7DQotfQ0KLUZYX0RXT1JEIENGWF9UeHRCcmVhazo6R2V0Q29udGV4dENoYXJTdHlsZXMoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fZHdDb250ZXh0Q2hhclN0eWxlczsNCi19DQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldENvbnRleHRDaGFyU3R5bGVzKEZYX0RXT1JEIGR3Q2hhclN0eWxlcykNCi17DQotICAgIG1faUN1ckFsaWdubWVudCA9IGR3Q2hhclN0eWxlcyAmIDB4MEY7DQotICAgIG1fYkFyYWJpY051bWJlciA9IChkd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljTnVtYmVyKSAhPSAwOw0KLSAgICBtX2JBcmFiaWNDb21tYSA9IChkd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29tbWEpICE9IDA7DQotICAgIG1fYkN1clJUTCA9IChkd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfUlRMUmVhZGluZ09yZGVyKSAhPSAwOw0KLSAgICBtX2lDdXJBcmFiaWNDb250ZXh0ID0gbV9pQXJhYmljQ29udGV4dCA9ICgoZHdDaGFyU3R5bGVzICYgMHgwMzAwKSA+PiA4KTsNCi0gICAgUmVzZXRDb250ZXh0Q2hhclN0eWxlcygpOw0KLX0NCi12b2lkIENGWF9UeHRCcmVhazo6U2V0Q29tYldpZHRoKEZYX0ZMT0FUIGZDb21iV2lkdGgpDQotew0KLSAgICBtX2lDb21iV2lkdGggPSBGWFNZU19yb3VuZChmQ29tYldpZHRoICogMjAwMDAuMGYpOw0KLX0NCi12b2lkIENGWF9UeHRCcmVhazo6U2V0VXNlckRhdGEodm9pZCogcFVzZXJEYXRhKQ0KLXsNCi0gICAgaWYgKG1fcFVzZXJEYXRhID09IHBVc2VyRGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIFNldEJyZWFrU3RhdHVzKCk7DQotICAgIG1fcFVzZXJEYXRhID0gcFVzZXJEYXRhOw0KLX0NCi12b2lkIENGWF9UeHRCcmVhazo6U2V0QnJlYWtTdGF0dXMoKQ0KLXsNCi0gICAgaWYgKG1fYlBhZ2luYXRpb24pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCi0gICAgaWYgKGlDb3VudCA8IDEpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfVHh0Q2hhciAqcFRDID0gKENGWF9UeHRDaGFyKiltX3BDdXJMaW5lLT5HZXRDaGFyUHRyKGlDb3VudCAtIDEpOw0KLSAgICBpZiAocFRDLT5tX2R3U3RhdHVzID09IDApIHsNCi0gICAgICAgIHBUQy0+bV9kd1N0YXR1cyA9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWs7DQotICAgIH0NCi19DQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldEhvcml6b250YWxTY2FsZShpbnQzMl90IGlTY2FsZSkNCi17DQotICAgIGlmIChpU2NhbGUgPCAwKSB7DQotICAgICAgICBpU2NhbGUgPSAwOw0KLSAgICB9DQotICAgIGlmIChpU2NhbGUgPT0gbV9pSG9yU2NhbGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBTZXRCcmVha1N0YXR1cygpOw0KLSAgICBtX2lIb3JTY2FsZSA9IGlTY2FsZTsNCi19DQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldFZlcnRpY2FsU2NhbGUoaW50MzJfdCBpU2NhbGUpDQotew0KLSAgICBpZiAoaVNjYWxlIDwgMCkgew0KLSAgICAgICAgaVNjYWxlID0gMDsNCi0gICAgfQ0KLSAgICBpZiAoaVNjYWxlID09IG1faUhvclNjYWxlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgU2V0QnJlYWtTdGF0dXMoKTsNCi0gICAgbV9pVmVyU2NhbGUgPSBpU2NhbGU7DQotfQ0KLXZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkNCi17DQotICAgIG1faUNoYXJTcGFjZSA9IEZYU1lTX3JvdW5kKGZDaGFyU3BhY2UgKiAyMDAwMC4wZik7DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSB7DQorICBtX2lDaGFyU3BhY2UgPSBGWFNZU19yb3VuZChmQ2hhclNwYWNlICogMjAwMDAuMGYpOw0KIH0NCiBzdGF0aWMgY29uc3QgaW50MzJfdCBnc19GWF9UeHRMaW5lUm90YXRpb25zWzhdID0gezAsIDMsIDEsIDAsIDIsIDEsIDMsIDJ9Ow0KLWludDMyX3QgQ0ZYX1R4dEJyZWFrOjpHZXRMaW5lUm90YXRpb24oRlhfRFdPUkQgZHdTdHlsZXMpIGNvbnN0DQotew0KLSAgICByZXR1cm4gZ3NfRlhfVHh0TGluZVJvdGF0aW9uc1soZHdTdHlsZXMgJiAweDBFKSA+PiAxXTsNCitpbnQzMl90IENGWF9UeHRCcmVhazo6R2V0TGluZVJvdGF0aW9uKEZYX0RXT1JEIGR3U3R5bGVzKSBjb25zdCB7DQorICByZXR1cm4gZ3NfRlhfVHh0TGluZVJvdGF0aW9uc1soZHdTdHlsZXMgJiAweDBFKSA+PiAxXTsNCiB9DQotQ0ZYX1R4dENoYXIqIENGWF9UeHRCcmVhazo6R2V0TGFzdENoYXIoaW50MzJfdCBpbmRleCwgRlhfQk9PTCBiT21pdENoYXIpIGNvbnN0DQotew0KLSAgICBDRlhfVHh0Q2hhckFycmF5ICZjYSA9ICptX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQotICAgIGludDMyX3QgaUNvdW50ID0gY2EuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGlDb3VudCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0ZYX1R4dENoYXIgKnBUQzsNCi0gICAgaW50MzJfdCBpU3RhcnQgPSBpQ291bnQgLSAxOw0KLSAgICB3aGlsZSAoaVN0YXJ0ID4gLTEpIHsNCi0gICAgICAgIHBUQyA9IGNhLkdldERhdGFQdHIoaVN0YXJ0IC0tKTsNCi0gICAgICAgIGlmIChiT21pdENoYXIgJiYgcFRDLT5HZXRDaGFyVHlwZSgpID09IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoLS1pbmRleCA8IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gcFRDOw0KLSAgICAgICAgfQ0KLSAgICB9DQorQ0ZYX1R4dENoYXIqIENGWF9UeHRCcmVhazo6R2V0TGFzdENoYXIoaW50MzJfdCBpbmRleCwgRlhfQk9PTCBiT21pdENoYXIpIGNvbnN0IHsNCisgIENGWF9UeHRDaGFyQXJyYXkmIGNhID0gKm1fcEN1ckxpbmUtPm1fcExpbmVDaGFyczsNCisgIGludDMyX3QgaUNvdW50ID0gY2EuR2V0U2l6ZSgpOw0KKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpQ291bnQpIHsNCiAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfVHh0Q2hhciogcFRDOw0KKyAgaW50MzJfdCBpU3RhcnQgPSBpQ291bnQgLSAxOw0KKyAgd2hpbGUgKGlTdGFydCA+IC0xKSB7DQorICAgIHBUQyA9IGNhLkdldERhdGFQdHIoaVN0YXJ0LS0pOw0KKyAgICBpZiAoYk9taXRDaGFyICYmIHBUQy0+R2V0Q2hhclR5cGUoKSA9PSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmICgtLWluZGV4IDwgMCkgew0KKyAgICAgIHJldHVybiBwVEM7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1DRlhfVHh0TGluZSogQ0ZYX1R4dEJyZWFrOjpHZXRUeHRMaW5lKEZYX0JPT0wgYlJlYWR5KSBjb25zdA0KLXsNCi0gICAgaWYgKCFiUmVhZHkpIHsNCi0gICAgICAgIHJldHVybiBtX3BDdXJMaW5lOw0KLSAgICB9DQotICAgIGlmIChtX2lSZWFkeSA9PSAxKSB7DQotICAgICAgICByZXR1cm4gbV9wVHh0TGluZTE7DQotICAgIH0gZWxzZSBpZiAobV9pUmVhZHkgPT0gMikgew0KLSAgICAgICAgcmV0dXJuIG1fcFR4dExpbmUyOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCitDRlhfVHh0TGluZSogQ0ZYX1R4dEJyZWFrOjpHZXRUeHRMaW5lKEZYX0JPT0wgYlJlYWR5KSBjb25zdCB7DQorICBpZiAoIWJSZWFkeSkgew0KKyAgICByZXR1cm4gbV9wQ3VyTGluZTsNCisgIH0NCisgIGlmIChtX2lSZWFkeSA9PSAxKSB7DQorICAgIHJldHVybiBtX3BUeHRMaW5lMTsNCisgIH0gZWxzZSBpZiAobV9pUmVhZHkgPT0gMikgew0KKyAgICByZXR1cm4gbV9wVHh0TGluZTI7DQorICB9IGVsc2Ugew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCiB9DQotQ0ZYX1R4dFBpZWNlQXJyYXkqIENGWF9UeHRCcmVhazo6R2V0VHh0UGllY2VzKEZYX0JPT0wgYlJlYWR5KSBjb25zdA0KLXsNCi0gICAgQ0ZYX1R4dExpbmUgKnBUeHRMaW5lID0gR2V0VHh0TGluZShiUmVhZHkpOw0KLSAgICBpZiAocFR4dExpbmUgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHBUeHRMaW5lLT5tX3BMaW5lUGllY2VzOw0KK0NGWF9UeHRQaWVjZUFycmF5KiBDRlhfVHh0QnJlYWs6OkdldFR4dFBpZWNlcyhGWF9CT09MIGJSZWFkeSkgY29uc3Qgew0KKyAgQ0ZYX1R4dExpbmUqIHBUeHRMaW5lID0gR2V0VHh0TGluZShiUmVhZHkpOw0KKyAgaWYgKHBUeHRMaW5lID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcFR4dExpbmUtPm1fcExpbmVQaWVjZXM7DQogfQ0KLWlubGluZSBGWF9EV09SRCBDRlhfVHh0QnJlYWs6OkdldFVuaWZpZWRDaGFyVHlwZShGWF9EV09SRCBkd1R5cGUpIGNvbnN0DQotew0KLSAgICByZXR1cm4gZHdUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgPyBGWF9DSEFSVFlQRV9BcmFiaWMgOiBkd1R5cGU7DQoraW5saW5lIEZYX0RXT1JEIENGWF9UeHRCcmVhazo6R2V0VW5pZmllZENoYXJUeXBlKEZYX0RXT1JEIGR3VHlwZSkgY29uc3Qgew0KKyAgcmV0dXJuIGR3VHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmID8gRlhfQ0hBUlRZUEVfQXJhYmljIDogZHdUeXBlOw0KIH0NCi12b2lkIENGWF9UeHRCcmVhazo6UmVzZXRBcmFiaWNDb250ZXh0KCkNCi17DQotICAgIGlmIChtX2JBcmFiaWNDb250ZXh0KSB7DQotICAgICAgICBtX2JDdXJSVEwgPSBtX2lDdXJBcmFiaWNDb250ZXh0ID4gMTsNCi0gICAgICAgIG1faUN1ckFsaWdubWVudCA9IG1faUN1ckFyYWJpY0NvbnRleHQgPiAxID8gRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodCA6IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdDsNCi0gICAgICAgIG1faUN1ckFsaWdubWVudCB8PSAobV9pQWxpZ25tZW50ICYgRlhfVFhUTElORUFMSUdOTUVOVF9IaWdoZXJNYXNrKTsNCi0gICAgICAgIG1fYkFyYWJpY051bWJlciA9IG1faUFyYWJpY0NvbnRleHQgPj0gMSAmJiBtX2JBcmFiaWNTaGFwZXM7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAobV9iUGFnaW5hdGlvbikgew0KLSAgICAgICAgICAgIG1fYkN1clJUTCA9IEZBTFNFOw0KLSAgICAgICAgICAgIG1faUN1ckFsaWdubWVudCA9IDA7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1fYkN1clJUTCA9IG1fYlJUTDsNCi0gICAgICAgICAgICBtX2lDdXJBbGlnbm1lbnQgPSBtX2lBbGlnbm1lbnQ7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9iUlRMKSB7DQotICAgICAgICAgICAgbV9iQXJhYmljTnVtYmVyID0gbV9pQXJhYmljQ29udGV4dCA+PSAxOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX2JBcmFiaWNOdW1iZXIgPSBtX2lBcmFiaWNDb250ZXh0ID4gMTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fYkFyYWJpY051bWJlciA9IG1fYkFyYWJpY051bWJlciAmJiBtX2JBcmFiaWNTaGFwZXM7DQotICAgIH0NCi0gICAgbV9iQXJhYmljQ29tbWEgPSBtX2JBcmFiaWNOdW1iZXI7DQotICAgIFJlc2V0Q29udGV4dENoYXJTdHlsZXMoKTsNCi19DQotdm9pZCBDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfUGFnZUxvYWQoQ0ZYX0NoYXIgKnBDdXJDaGFyLCBGWF9EV09SRCBkd1Byb3BzKQ0KLXsNCi0gICAgaWYgKCFtX2JQYWdpbmF0aW9uKSB7DQotICAgICAgICAoKENGWF9UeHRDaGFyKilwQ3VyQ2hhciktPm1fZHdTdGF0dXMgPSAwOw0KLSAgICAgICAgKChDRlhfVHh0Q2hhciopcEN1ckNoYXIpLT5tX3BVc2VyRGF0YSA9IG1fcFVzZXJEYXRhOw0KLSAgICB9DQotICAgIGlmIChtX2JBcmFiaWNDb250ZXh0IHx8IG1fYkFyYWJpY1NoYXBlcykgew0KLSAgICAgICAgaW50MzJfdCBpQmlkaUNscyA9IChkd1Byb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+IEZYX0JJRElDTEFTU0JJVFM7DQotICAgICAgICBpbnQzMl90IGlBcmFiaWNDb250ZXh0ID0gKGlCaWRpQ2xzID09IEZYX0JJRElDTEFTU19SIHx8IGlCaWRpQ2xzID09IEZYX0JJRElDTEFTU19BTCkgPyAyIDogKChpQmlkaUNscyA9PSBGWF9CSURJQ0xBU1NfTCB8fCBpQmlkaUNscyA9PSBGWF9CSURJQ0xBU1NfUykgPyAwIDogMSk7DQotICAgICAgICBpZiAoaUFyYWJpY0NvbnRleHQgIT0gbV9pQXJhYmljQ29udGV4dCAmJiBpQXJhYmljQ29udGV4dCAhPSAxKSB7DQotICAgICAgICAgICAgbV9pQXJhYmljQ29udGV4dCA9IGlBcmFiaWNDb250ZXh0Ow0KLSAgICAgICAgICAgIGlmIChtX2lDdXJBcmFiaWNDb250ZXh0ID09IDEpIHsNCi0gICAgICAgICAgICAgICAgbV9pQ3VyQXJhYmljQ29udGV4dCA9IGlBcmFiaWNDb250ZXh0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCi0gICAgICAgICAgICBpZiAoIW1fYlBhZ2luYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1R4dENoYXIgKnBMYXN0Q2hhciA9IChDRlhfVHh0Q2hhciopR2V0TGFzdENoYXIoMSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICBpZiAocExhc3RDaGFyICE9IE5VTEwgJiYgcExhc3RDaGFyLT5tX2R3U3RhdHVzIDwgMSkgew0KLSAgICAgICAgICAgICAgICAgICAgcExhc3RDaGFyLT5tX2R3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgPSBtX2R3Q29udGV4dENoYXJTdHlsZXM7DQotfQ0KLUZYX0RXT1JEIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9Db21iaW5hdGlvbihDRlhfQ2hhciAqcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBDdXJDaGFyICE9IE5VTEwpOw0KLSAgICBGWF9XQ0hBUiB3Y2ggPSBwQ3VyQ2hhci0+bV93Q2hhckNvZGU7DQotICAgIEZYX1dDSEFSIHdGb3JtOw0KLSAgICBpbnQzMl90IGlDaGFyV2lkdGggPSAwOw0KLSAgICBDRlhfQ2hhciAqcExhc3RDaGFyOw0KLSAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gLTE7DQotICAgIGlmIChtX2JDb21iVGV4dCkgew0KLSAgICAgICAgaUNoYXJXaWR0aCA9IG1faUNvbWJXaWR0aDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7DQotICAgICAgICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdGb3JtID0gd2NoOw0KLSAgICAgICAgICAgIGlmICghbV9iUGFnaW5hdGlvbikgew0KLSAgICAgICAgICAgICAgICBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigwLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIGlmIChwTGFzdENoYXIgIT0gTlVMTCAmJiAoKChDRlhfVHh0Q2hhciopcExhc3RDaGFyKS0+bV9kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGFkZGEgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICh3Y2ggPT0gMHgwNjUxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd0xhc3QgPSBwTGFzdENoYXItPm1fd0NoYXJDb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3TGFzdCA+PSAweDA2NEMgJiYgd0xhc3QgPD0gMHgwNjUwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdMYXN0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNoYWRkYSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3Y2ggPj0gMHgwNjRDICYmIHdjaCA8PSAweDA2NTApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocExhc3RDaGFyLT5tX3dDaGFyQ29kZSA9PSAweDA2NTEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd0Zvcm0gPSBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUod2NoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNoYWRkYSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJTaGFkZGEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKENGWF9UeHRDaGFyKilwTGFzdENoYXIpLT5tX2R3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoQ0ZYX1R4dENoYXIqKXBMYXN0Q2hhciktPm1faUNoYXJXaWR0aCA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgKChDRlhfVHh0Q2hhciopcEN1ckNoYXIpLT5tX2R3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBGQUxTRSkpIHsNCi0gICAgICAgICAgICAgICAgaUNoYXJXaWR0aCA9IDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsNCi0gICAgICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7DQotICAgIH0NCi0gICAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IC1pQ2hhcldpZHRoOw0KLSAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCi19DQotRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX1RhYihDRlhfQ2hhciAqcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKQ0KLXsNCi0gICAgbV9kd0NoYXJUeXBlID0gRlhfQ0hBUlRZUEVfVGFiOw0KLSAgICBpZiAoKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9FeHBhbmRUYWIpID09IDApIHsNCi0gICAgICAgIHJldHVybiBGWF9UWFRCUkVBS19Ob25lOw0KLSAgICB9DQotICAgIGludDMyX3QgJmlMaW5lV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsNCi0gICAgaW50MzJfdCBpQ2hhcldpZHRoOw0KLSAgICBpZiAobV9iQ29tYlRleHQpIHsNCi0gICAgICAgIGlDaGFyV2lkdGggPSBtX2lDb21iV2lkdGg7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAobV9iRXF1aWRpc3RhbnQpIHsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gaUxpbmVXaWR0aDsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pVGFiV2lkdGggKiAoaUNoYXJXaWR0aCAvIG1faVRhYldpZHRoICsgMSkgLSBpQ2hhcldpZHRoOw0KLSAgICAgICAgICAgIGlmIChpQ2hhcldpZHRoIDwgRlhfVFhUQlJFQUtfTWluaW11bVRhYldpZHRoKSB7DQotICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggKz0gbV9pVGFiV2lkdGg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pVGFiV2lkdGg7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQotICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCi0gICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmIGlMaW5lV2lkdGggPj0gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKSB7DQotICAgICAgICByZXR1cm4gRW5kQnJlYWsoRlhfVFhUQlJFQUtfTGluZUJyZWFrKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCi19DQotRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0NvbnRyb2woQ0ZYX0NoYXIgKnBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbikNCi17DQotICAgIG1fZHdDaGFyVHlwZSA9IEZYX0NIQVJUWVBFX0NvbnRyb2w7DQotICAgIEZYX0RXT1JEIGR3UmV0ID0gRlhfVFhUQlJFQUtfTm9uZTsNCi0gICAgaWYgKCFtX2JTaW5nbGVMaW5lKSB7DQotICAgICAgICBGWF9XQ0hBUiB3Y2ggPSBwQ3VyQ2hhci0+bV93Q2hhckNvZGU7DQotICAgICAgICBzd2l0Y2ggKHdjaCkgew0KLSAgICAgICAgICAgIGNhc2UgTCdcdic6DQotICAgICAgICAgICAgY2FzZSAweDIwMjg6DQotICAgICAgICAgICAgICAgIGR3UmV0ID0gRlhfVFhUQlJFQUtfTGluZUJyZWFrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEwnXGYnOg0KLSAgICAgICAgICAgICAgICBkd1JldCA9IEZYX1RYVEJSRUFLX1BhZ2VCcmVhazsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAweDIwMjk6DQotICAgICAgICAgICAgICAgIGR3UmV0ID0gRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWs7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGlmICh3Y2ggPT0gbV93UGFyYWdCcmVha0NoYXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIGR3UmV0ID0gRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZHdSZXQgIT0gRlhfVFhUQlJFQUtfTm9uZSkgew0KLSAgICAgICAgICAgIGR3UmV0ID0gRW5kQnJlYWsoZHdSZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBkd1JldDsNCi19DQotRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYyhDRlhfQ2hhciAqcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdUeXBlID0gKHBDdXJDaGFyLT5tX2R3Q2hhclByb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7DQotICAgIGludDMyX3QgJmlMaW5lV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsNCi0gICAgRlhfV0NIQVIgd0Zvcm07DQotICAgIGludDMyX3QgaUNoYXJXaWR0aCA9IDA7DQotICAgIENGWF9DaGFyICpwTGFzdENoYXIgPSBOVUxMOw0KLSAgICBGWF9CT09MIGJBbGVmID0gRkFMU0U7DQotICAgIGlmICghbV9iQ29tYlRleHQgJiYgbV9kd0NoYXJUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgJiYgbV9kd0NoYXJUeXBlIDw9IEZYX0NIQVJUWVBFX0FyYWJpY0Rpc3RvcnRpb24pIHsNCi0gICAgICAgIHBMYXN0Q2hhciA9IEdldExhc3RDaGFyKDEpOw0KLSAgICAgICAgaWYgKHBMYXN0Q2hhciAhPSBOVUxMKSB7DQotICAgICAgICAgICAgaUNoYXJXaWR0aCA9IHBMYXN0Q2hhci0+bV9pQ2hhcldpZHRoOw0KLSAgICAgICAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KLSAgICAgICAgICAgICAgICBpTGluZVdpZHRoIC09IGlDaGFyV2lkdGg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9DaGFyICpwUHJldkNoYXIgPSBHZXRMYXN0Q2hhcigyKTsNCi0gICAgICAgICAgICB3Rm9ybSA9IG1fcEFyYWJpY0NoYXItPkdldEZvcm1DaGFyKHBMYXN0Q2hhciwgcFByZXZDaGFyLCBwQ3VyQ2hhcik7DQotICAgICAgICAgICAgYkFsZWYgPSAod0Zvcm0gPT0gMHhGRUZGICYmIHBMYXN0Q2hhci0+R2V0Q2hhclR5cGUoKSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKTsNCi0gICAgICAgICAgICBpbnQzMl90IGlMYXN0Um90YXRpb24gPSBwTGFzdENoYXItPm1fblJvdGF0aW9uICsgbV9pTGluZVJvdGF0aW9uOw0KLSAgICAgICAgICAgIGlmIChtX2JWZXJ0aWNhbCAmJiAocExhc3RDaGFyLT5tX2R3Q2hhclByb3BzICYgMHg4MDAwKSAhPSAwKSB7DQotICAgICAgICAgICAgICAgIGlMYXN0Um90YXRpb24gKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpTGFzdFJvdGF0aW9uKSkgew0KLSAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIEZBTFNFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHdGb3JtID09IDB4RkVGRikgew0KLSAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvclNjYWxlIC8gMTAwOw0KLSAgICAgICAgICAgIHBMYXN0Q2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCi0gICAgICAgICAgICBpTGluZVdpZHRoICs9IGlDaGFyV2lkdGg7DQotICAgICAgICAgICAgaUNoYXJXaWR0aCA9IDA7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9kd0NoYXJUeXBlID0gZHdUeXBlOw0KLSAgICB3Rm9ybSA9IG1fcEFyYWJpY0NoYXItPkdldEZvcm1DaGFyKHBDdXJDaGFyLCBiQWxlZiA/IE5VTEwgOiBwTGFzdENoYXIsIE5VTEwpOw0KLSAgICBpZiAobV9iQ29tYlRleHQpIHsNCi0gICAgICAgIGlDaGFyV2lkdGggPSBtX2lDb21iV2lkdGg7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQoaVJvdGF0aW9uKSkgew0KLSAgICAgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIEZBTFNFKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3Rm9ybSA9PSAweEZFRkYpIHsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQotICAgICAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvclNjYWxlIC8gMTAwOw0KLSAgICB9DQotICAgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KLSAgICBpTGluZVdpZHRoICs9IGlDaGFyV2lkdGg7DQotICAgIG1fcEN1ckxpbmUtPm1faUFyYWJpY0NoYXJzICsrOw0KLSAgICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgaUxpbmVXaWR0aCA+IG1faUxpbmVXaWR0aCArIG1faVRvbGVyYW5jZSkgew0KLSAgICAgICAgcmV0dXJuIEVuZEJyZWFrKEZYX1RYVEJSRUFLX0xpbmVCcmVhayk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZYX1RYVEJSRUFLX05vbmU7DQotfQ0KLUZYX0RXT1JEIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMoQ0ZYX0NoYXIgKnBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbikNCi17DQotICAgIEZYX0RXT1JEIGR3UHJvcHMgPSBwQ3VyQ2hhci0+bV9kd0NoYXJQcm9wczsNCi0gICAgRlhfRFdPUkQgZHdUeXBlID0gKGR3UHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsNCi0gICAgaW50MzJfdCAmaUxpbmVXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KLSAgICBpbnQzMl90IGlDaGFyV2lkdGggPSAwOw0KLSAgICBtX2R3Q2hhclR5cGUgPSBkd1R5cGU7DQotICAgIEZYX1dDSEFSIHdjaCA9IHBDdXJDaGFyLT5tX3dDaGFyQ29kZTsNCi0gICAgRlhfV0NIQVIgd0Zvcm0gPSB3Y2g7DQotICAgIGlmIChkd1R5cGUgPT0gRlhfQ0hBUlRZUEVfTnVtZXJpYykgew0KLSAgICAgICAgaWYgKG1fYkFyYWJpY051bWJlcikgew0KLSAgICAgICAgICAgIHdGb3JtID0gd2NoICsgMHgwNjMwOw0KLSAgICAgICAgICAgIHBDdXJDaGFyLT5tX2R3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljSW5kaWM7DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZiAod2NoID09IEwnLCcpIHsNCi0gICAgICAgIGlmIChtX2JBcmFiaWNTaGFwZXMgJiYgbV9pQ3VyQXJhYmljQ29udGV4dCA+IDApIHsNCi0gICAgICAgICAgICB3Rm9ybSA9IDB4MDYwQzsNCi0gICAgICAgICAgICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0NvbW1hOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKG1fYkN1clJUTCB8fCBtX2JWZXJ0aWNhbCkgew0KLSAgICAgICAgd0Zvcm0gPSBGWF9HZXRNaXJyb3JDaGFyKHdjaCwgZHdQcm9wcywgbV9iQ3VyUlRMLCBtX2JWZXJ0aWNhbCk7DQotICAgIH0NCi0gICAgaWYgKG1fYkNvbWJUZXh0KSB7DQotICAgICAgICBpQ2hhcldpZHRoID0gbV9pQ29tYldpZHRoOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlSb3RhdGlvbikpIHsNCi0gICAgICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCi0gICAgICAgIH0gZWxzZSBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgRkFMU0UpKSB7DQotICAgICAgICAgICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7DQotICAgICAgICB9DQotICAgICAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOw0KLSAgICAgICAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3JTY2FsZSAvIDEwMDsNCi0gICAgfQ0KLSAgICBpQ2hhcldpZHRoICs9IG1faUNoYXJTcGFjZTsNCi0gICAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQotICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCi0gICAgRlhfQk9PTCBiQnJlYWsgPSAoZHdUeXBlICE9IEZYX0NIQVJUWVBFX1NwYWNlIHx8IChtX2R3UG9saWNpZXMgJiBGWF9UWFRCUkVBS1BPTElDWV9TcGFjZUJyZWFrKSAhPSAwKTsNCi0gICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmIGJCcmVhayAmJiBpTGluZVdpZHRoID4gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKSB7DQotICAgICAgICByZXR1cm4gRW5kQnJlYWsoRlhfVFhUQlJFQUtfTGluZUJyZWFrKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCi19DQotdHlwZWRlZiBGWF9EV09SRCAoQ0ZYX1R4dEJyZWFrOjoqRlhfVHh0QnJlYWtfTFBGQXBwZW5kQ2hhcikoQ0ZYX0NoYXIgKnBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQotc3RhdGljIGNvbnN0IEZYX1R4dEJyZWFrX0xQRkFwcGVuZENoYXIgZ19GWF9UeHRCcmVha19scGZBcHBlbmRDaGFyWzE2XSA9IHsNCi0gICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQotICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfVGFiLA0KLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCi0gICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9Db250cm9sLA0KLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0NvbWJpbmF0aW9uLA0KLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCi0gICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQotICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCi0gICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQotICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCi0gICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQotICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLA0KLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCi0gICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQotfTsNCi1GWF9EV09SRCBDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdQcm9wcyA9IGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsNCi0gICAgRlhfRFdPUkQgZHdUeXBlID0gKGR3UHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsNCi0gICAgQ0ZYX1R4dENoYXIgKnBDdXJDaGFyID0gbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzLT5BZGRTcGFjZSgpOw0KLSAgICBwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPSAoRlhfV09SRCl3Y2g7DQotICAgIHBDdXJDaGFyLT5tX25Sb3RhdGlvbiA9IG1faUNoYXJSb3RhdGlvbjsNCi0gICAgcEN1ckNoYXItPm1fZHdDaGFyUHJvcHMgPSBkd1Byb3BzOw0KLSAgICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgPSAwOw0KLSAgICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gMDsNCi0gICAgcEN1ckNoYXItPm1faUhvcml6b250YWxTY2FsZSA9IG1faUhvclNjYWxlOw0KLSAgICBwQ3VyQ2hhci0+bV9pVmVydGlhbFNjYWxlID0gbV9pVmVyU2NhbGU7DQotICAgIHBDdXJDaGFyLT5tX2R3U3RhdHVzID0gMDsNCi0gICAgcEN1ckNoYXItPm1faUJpZGlDbGFzcyA9IDA7DQotICAgIHBDdXJDaGFyLT5tX2lCaWRpTGV2ZWwgPSAwOw0KLSAgICBwQ3VyQ2hhci0+bV9pQmlkaVBvcyA9IDA7DQotICAgIHBDdXJDaGFyLT5tX2lCaWRpT3JkZXIgPSAwOw0KLSAgICBwQ3VyQ2hhci0+bV9wVXNlckRhdGEgPSBOVUxMOw0KLSAgICBBcHBlbmRDaGFyX1BhZ2VMb2FkKHBDdXJDaGFyLCBkd1Byb3BzKTsNCi0gICAgRlhfRFdPUkQgZHdSZXQxID0gRlhfVFhUQlJFQUtfTm9uZTsNCi0gICAgaWYgKGR3VHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbiAmJiBHZXRVbmlmaWVkQ2hhclR5cGUobV9kd0NoYXJUeXBlKSAhPSBHZXRVbmlmaWVkQ2hhclR5cGUoZHdUeXBlKSkgew0KLSAgICAgICAgaWYgKG1fZHdDaGFyVHlwZSA+IDAgJiYgbV9wQ3VyTGluZS0+bV9pV2lkdGggPiBtX2lMaW5lV2lkdGggKyBtX2lUb2xlcmFuY2UgJiYgIW1fYlNpbmdsZUxpbmUpIHsNCi0gICAgICAgICAgICBpZiAobV9kd0NoYXJUeXBlICE9IEZYX0NIQVJUWVBFX1NwYWNlIHx8IGR3VHlwZSAhPSBGWF9DSEFSVFlQRV9Db250cm9sKSB7DQotICAgICAgICAgICAgICAgIGR3UmV0MSA9IEVuZEJyZWFrKEZYX1RYVEJSRUFLX0xpbmVCcmVhayk7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KLSAgICAgICAgICAgICAgICBpZiAoaUNvdW50ID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgcEN1ckNoYXIgPSBtX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnMtPkdldERhdGFQdHIoaUNvdW50IC0gMSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBpUm90YXRpb24gPSBtX2lSb3RhdGlvbjsNCi0gICAgaWYgKG1fYlZlcnRpY2FsICYmIChkd1Byb3BzICYgMHg4MDAwKSAhPSAwKSB7DQotICAgICAgICBpUm90YXRpb24gPSAoaVJvdGF0aW9uICsgMSkgJSA0Ow0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3UmV0MiA9ICh0aGlzLT4qZ19GWF9UeHRCcmVha19scGZBcHBlbmRDaGFyW2R3VHlwZSA+PiBGWF9DSEFSVFlQRUJJVFNdKShwQ3VyQ2hhciwgaVJvdGF0aW9uKTsNCi0gICAgcmV0dXJuIEZYX01BWChkd1JldDEsIGR3UmV0Mik7DQotfQ0KLXZvaWQgQ0ZYX1R4dEJyZWFrOjpFbmRCcmVha19VcGRhdGVBcmFiaWNTaGFwZXMoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fYkFyYWJpY1NoYXBlcyk7DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KLSAgICBpZiAoaUNvdW50IDwgMikgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgJmlMaW5lV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsNCi0gICAgQ0ZYX0NoYXIgKnBDdXIsICpwTmV4dDsNCi0gICAgcEN1ciA9IG1fcEN1ckxpbmUtPkdldENoYXJQdHIoMCk7DQotICAgIEZYX0JPT0wgYlByZXZOdW0gPSAocEN1ci0+bV9kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljSW5kaWMpICE9IDA7DQotICAgIHBDdXIgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKDEpOw0KLSAgICBGWF9XQ0hBUiB3Y2gsIHdGb3JtOw0KLSAgICBGWF9CT09MIGJOZXh0TnVtOw0KLSAgICBpbnQzMl90IGkgPSAxLCBpQ2hhcldpZHRoLCBpUm90YXRpb247DQotICAgIGRvIHsNCi0gICAgICAgIGkgKys7DQotICAgICAgICBpZiAoaSA8IGlDb3VudCkgew0KLSAgICAgICAgICAgIHBOZXh0ID0gbV9wQ3VyTGluZS0+R2V0Q2hhclB0cihpKTsNCi0gICAgICAgICAgICBiTmV4dE51bSA9IChwTmV4dC0+bV9kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljSW5kaWMpICE9IDA7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBOZXh0ID0gTlVMTDsNCi0gICAgICAgICAgICBiTmV4dE51bSA9IEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2NoID0gcEN1ci0+bV93Q2hhckNvZGU7DQotICAgICAgICBpZiAod2NoID09IEwnLicpIHsNCi0gICAgICAgICAgICBpZiAoYlByZXZOdW0gJiYgYk5leHROdW0pIHsNCi0gICAgICAgICAgICAgICAgaVJvdGF0aW9uID0gbV9pUm90YXRpb247DQotICAgICAgICAgICAgICAgIGlmIChtX2JWZXJ0aWNhbCAmJiAocEN1ci0+bV9kd0NoYXJQcm9wcyAmIDB4ODAwMCkgIT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaVJvdGF0aW9uID0gKChpUm90YXRpb24gKyAxKSAmIDB4MDMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdGb3JtID0gd2NoID09IEwnLicgPyAweDA2NkIgOiAweDA2NkM7DQotICAgICAgICAgICAgICAgIGlMaW5lV2lkdGggLT0gcEN1ci0+bV9pQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICBpZiAobV9iQ29tYlRleHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggPSBtX2lDb21iV2lkdGg7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQoaVJvdGF0aW9uKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBGQUxTRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQotICAgICAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvclNjYWxlIC8gMTAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBDdXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQotICAgICAgICAgICAgICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBiUHJldk51bSA9IChwQ3VyLT5tX2R3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNJbmRpYykgIT0gMDsNCi0gICAgICAgIHBDdXIgPSBwTmV4dDsNCi0gICAgfSB3aGlsZSAoaSA8IGlDb3VudCk7DQotfQ0KLUZYX0JPT0wgQ0ZYX1R4dEJyZWFrOjpFbmRCcmVha19TcGxpdExpbmUoQ0ZYX1R4dExpbmUgKnBOZXh0TGluZSwgRlhfQk9PTCBiQWxsQ2hhcnMsIEZYX0RXT1JEIGR3U3RhdHVzKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQotICAgIEZYX0JPT0wgYkRvbmUgPSBGQUxTRTsNCi0gICAgQ0ZYX0NoYXIgKnBUQzsNCi0gICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmIG1fcEN1ckxpbmUtPm1faVdpZHRoID4gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKSB7DQotICAgICAgICBwVEMgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKGlDb3VudCAtIDEpOw0KLSAgICAgICAgc3dpdGNoIChwVEMtPkdldENoYXJUeXBlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIEZYX0NIQVJUWVBFX1RhYjoNCi0gICAgICAgICAgICBjYXNlIEZYX0NIQVJUWVBFX0NvbnRyb2w6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfU3BhY2U6DQotICAgICAgICAgICAgICAgIGlmICgobV9kd1BvbGljaWVzICYgRlhfVFhUQlJFQUtQT0xJQ1lfU3BhY2VCcmVhaykgIT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgU3BsaXRUZXh0TGluZShtX3BDdXJMaW5lLCBwTmV4dExpbmUsICFtX2JQYWdpbmF0aW9uICYmIGJBbGxDaGFycyk7DQotICAgICAgICAgICAgICAgICAgICBiRG9uZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgU3BsaXRUZXh0TGluZShtX3BDdXJMaW5lLCBwTmV4dExpbmUsICFtX2JQYWdpbmF0aW9uICYmIGJBbGxDaGFycyk7DQotICAgICAgICAgICAgICAgIGJEb25lID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KLSAgICBDRlhfVHh0UGllY2VBcnJheSAqcEN1clBpZWNlcyA9IG1fcEN1ckxpbmUtPm1fcExpbmVQaWVjZXM7DQotICAgIENGWF9UeHRQaWVjZSB0cDsNCit2b2lkIENGWF9UeHRCcmVhazo6UmVzZXRBcmFiaWNDb250ZXh0KCkgew0KKyAgaWYgKG1fYkFyYWJpY0NvbnRleHQpIHsNCisgICAgbV9iQ3VyUlRMID0gbV9pQ3VyQXJhYmljQ29udGV4dCA+IDE7DQorICAgIG1faUN1ckFsaWdubWVudCA9IG1faUN1ckFyYWJpY0NvbnRleHQgPiAxID8gRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdDsNCisgICAgbV9pQ3VyQWxpZ25tZW50IHw9IChtX2lBbGlnbm1lbnQgJiBGWF9UWFRMSU5FQUxJR05NRU5UX0hpZ2hlck1hc2spOw0KKyAgICBtX2JBcmFiaWNOdW1iZXIgPSBtX2lBcmFiaWNDb250ZXh0ID49IDEgJiYgbV9iQXJhYmljU2hhcGVzOw0KKyAgfSBlbHNlIHsNCiAgICAgaWYgKG1fYlBhZ2luYXRpb24pIHsNCi0gICAgICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCi0gICAgICAgIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQotICAgICAgICB0cC5tX2lXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KLSAgICAgICAgdHAubV9pU3RhcnRDaGFyID0gMDsNCi0gICAgICAgIHRwLm1faUNoYXJzID0gaUNvdW50Ow0KLSAgICAgICAgdHAubV9wQ2hhcnMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQotICAgICAgICB0cC5tX3BVc2VyRGF0YSA9IG1fcFVzZXJEYXRhOw0KLSAgICAgICAgcFRDID0gbV9wQ3VyTGluZS0+R2V0Q2hhclB0cigwKTsNCi0gICAgICAgIHRwLm1fZHdDaGFyU3R5bGVzID0gcFRDLT5tX2R3Q2hhclN0eWxlczsNCi0gICAgICAgIHRwLm1faUhvcml6b250YWxTY2FsZSA9IHBUQy0+bV9pSG9yaXpvbnRhbFNjYWxlOw0KLSAgICAgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KLSAgICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCi0gICAgICAgIG1fcEN1ckxpbmUgPSBwTmV4dExpbmU7DQotICAgICAgICBtX2R3Q2hhclR5cGUgPSAwOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgaWYgKGJBbGxDaGFycyAmJiAhYkRvbmUpIHsNCi0gICAgICAgIGludDMyX3QgaUVuZFBvcyA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KLSAgICAgICAgR2V0QnJlYWtQb3MoKm1fcEN1ckxpbmUtPm1fcExpbmVDaGFycywgaUVuZFBvcywgYkFsbENoYXJzLCBUUlVFKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLXZvaWQgQ0ZYX1R4dEJyZWFrOjpFbmRCcmVha19CaWRpTGluZShDRlhfVFBPQXJyYXkgJnRwb3MsIEZYX0RXT1JEIGR3U3RhdHVzKQ0KLXsNCi0gICAgQ0ZYX1R4dFBpZWNlIHRwOw0KLSAgICBGWF9UUE8gdHBvOw0KLSAgICBDRlhfVHh0Q2hhciAqcFRDOw0KLSAgICBpbnQzMl90IGksIGo7DQotICAgIENGWF9UeHRDaGFyQXJyYXkgJmNoYXJzID0gKm1fcEN1ckxpbmUtPm1fcExpbmVDaGFyczsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQotICAgIEZYX0JPT0wgYkRvbmUgPSAobV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMgPiAwIHx8IG1fYkN1clJUTCk7DQotICAgIGlmICghbV9iUGFnaW5hdGlvbiAmJiBiRG9uZSkgew0KLSAgICAgICAgaW50MzJfdCBpQmlkaU51bSA9IDA7DQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsNCi0gICAgICAgICAgICBwVEMtPm1faUJpZGlQb3MgPSBpOw0KLSAgICAgICAgICAgIGlmIChwVEMtPkdldENoYXJUeXBlKCkgIT0gRlhfQ0hBUlRZUEVfQ29udHJvbCkgew0KLSAgICAgICAgICAgICAgICBpQmlkaU51bSA9IGk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChpID09IDApIHsNCi0gICAgICAgICAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0JpZGlMaW5lKGNoYXJzLCBpQmlkaU51bSArIDEsIG1fYkN1clJUTCA/IDEgOiAwKTsNCi0gICAgfQ0KLSAgICBDRlhfVHh0UGllY2VBcnJheSAqcEN1clBpZWNlcyA9IG1fcEN1ckxpbmUtPm1fcExpbmVQaWVjZXM7DQotICAgIGlmICghbV9iUGFnaW5hdGlvbiAmJiAoYkRvbmUgfHwgKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9NdXRpcGxlRm9ybWF0KSAhPSAwKSkgew0KLSAgICAgICAgdHAubV9kd1N0YXR1cyA9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWs7DQotICAgICAgICB0cC5tX2lTdGFydFBvcyA9IG1fcEN1ckxpbmUtPm1faVN0YXJ0Ow0KLSAgICAgICAgdHAubV9wQ2hhcnMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQotICAgICAgICBpbnQzMl90IGlCaWRpTGV2ZWwgPSAtMSwgaUNoYXJXaWR0aDsNCi0gICAgICAgIGkgPSAwLCBqID0gLTE7DQotICAgICAgICB3aGlsZSAoaSA8IGlDb3VudCkgew0KLSAgICAgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7DQotICAgICAgICAgICAgaWYgKGlCaWRpTGV2ZWwgPCAwKSB7DQotICAgICAgICAgICAgICAgIGlCaWRpTGV2ZWwgPSBwVEMtPm1faUJpZGlMZXZlbDsNCi0gICAgICAgICAgICAgICAgdHAubV9pV2lkdGggPSAwOw0KLSAgICAgICAgICAgICAgICB0cC5tX2lCaWRpTGV2ZWwgPSBpQmlkaUxldmVsOw0KLSAgICAgICAgICAgICAgICB0cC5tX2lCaWRpUG9zID0gcFRDLT5tX2lCaWRpT3JkZXI7DQotICAgICAgICAgICAgICAgIHRwLm1fZHdDaGFyU3R5bGVzID0gcFRDLT5tX2R3Q2hhclN0eWxlczsNCi0gICAgICAgICAgICAgICAgdHAubV9wVXNlckRhdGEgPSBwVEMtPm1fcFVzZXJEYXRhOw0KLSAgICAgICAgICAgICAgICB0cC5tX2lIb3Jpem9udGFsU2NhbGUgPSBwVEMtPm1faUhvcml6b250YWxTY2FsZTsNCi0gICAgICAgICAgICAgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KLSAgICAgICAgICAgICAgICB0cC5tX2R3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGlCaWRpTGV2ZWwgIT0gcFRDLT5tX2lCaWRpTGV2ZWwgfHwgcFRDLT5tX2R3U3RhdHVzICE9IDApIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlCaWRpTGV2ZWwgPT0gcFRDLT5tX2lCaWRpTGV2ZWwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRwLm1fZHdTdGF0dXMgPSBwVEMtPm1fZHdTdGF0dXM7DQotICAgICAgICAgICAgICAgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cC5tX2lXaWR0aCArPSBpQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaSArKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB0cC5tX2lDaGFycyA9IGkgLSB0cC5tX2lTdGFydENoYXI7DQotICAgICAgICAgICAgICAgIHBDdXJQaWVjZXMtPkFkZCh0cCk7DQotICAgICAgICAgICAgICAgIHRwLm1faVN0YXJ0UG9zICs9IHRwLm1faVdpZHRoOw0KLSAgICAgICAgICAgICAgICB0cC5tX2lTdGFydENoYXIgPSBpOw0KLSAgICAgICAgICAgICAgICB0cG8uaW5kZXggPSArKyBqOw0KLSAgICAgICAgICAgICAgICB0cG8ucG9zID0gdHAubV9pQmlkaVBvczsNCi0gICAgICAgICAgICAgICAgdHBvcy5BZGQodHBvKTsNCi0gICAgICAgICAgICAgICAgaUJpZGlMZXZlbCA9IC0xOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsNCi0gICAgICAgICAgICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICB0cC5tX2lXaWR0aCArPSBpQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGkgKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGkgPiB0cC5tX2lTdGFydENoYXIpIHsNCi0gICAgICAgICAgICB0cC5tX2R3U3RhdHVzID0gZHdTdGF0dXM7DQotICAgICAgICAgICAgdHAubV9pQ2hhcnMgPSBpIC0gdHAubV9pU3RhcnRDaGFyOw0KLSAgICAgICAgICAgIHBDdXJQaWVjZXMtPkFkZCh0cCk7DQotICAgICAgICAgICAgdHBvLmluZGV4ID0gKysgajsNCi0gICAgICAgICAgICB0cG8ucG9zID0gdHAubV9pQmlkaVBvczsNCi0gICAgICAgICAgICB0cG9zLkFkZCh0cG8pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGogPiAtMSkgew0KLSAgICAgICAgICAgIGlmIChqID4gMCkgew0KLSAgICAgICAgICAgICAgICBGWF9URVhUTEFZT1VUX1BpZWNlU29ydCh0cG9zLCAwLCBqKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnRQb3MgPSAwOw0KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGo7IGkgKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIHRwbyA9IHRwb3MuR2V0QXQoaSk7DQotICAgICAgICAgICAgICAgICAgICBDRlhfVHh0UGllY2UgJnR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQotICAgICAgICAgICAgICAgICAgICB0dHAubV9pU3RhcnRQb3MgPSBpU3RhcnRQb3M7DQotICAgICAgICAgICAgICAgICAgICBpU3RhcnRQb3MgKz0gdHRwLm1faVdpZHRoOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9UeHRQaWVjZSAmdHRwID0gcEN1clBpZWNlcy0+R2V0QXQoaik7DQotICAgICAgICAgICAgdHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCi0gICAgICAgIH0NCisgICAgICBtX2JDdXJSVEwgPSBGQUxTRTsNCisgICAgICBtX2lDdXJBbGlnbm1lbnQgPSAwOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgdHAubV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KLSAgICAgICAgdHAubV9pU3RhcnRQb3MgPSBtX3BDdXJMaW5lLT5tX2lTdGFydDsNCi0gICAgICAgIHRwLm1faVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQotICAgICAgICB0cC5tX2lTdGFydENoYXIgPSAwOw0KLSAgICAgICAgdHAubV9pQ2hhcnMgPSBpQ291bnQ7DQotICAgICAgICB0cC5tX3BDaGFycyA9IG1fcEN1ckxpbmUtPm1fcExpbmVDaGFyczsNCi0gICAgICAgIHRwLm1fcFVzZXJEYXRhID0gbV9wVXNlckRhdGE7DQotICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKDApOw0KLSAgICAgICAgdHAubV9kd0NoYXJTdHlsZXMgPSBwVEMtPm1fZHdDaGFyU3R5bGVzOw0KLSAgICAgICAgdHAubV9pSG9yaXpvbnRhbFNjYWxlID0gcFRDLT5tX2lIb3Jpem9udGFsU2NhbGU7DQotICAgICAgICB0cC5tX2lWZXJ0aWNhbFNjYWxlID0gcFRDLT5tX2lWZXJ0aWFsU2NhbGU7DQotICAgICAgICBwQ3VyUGllY2VzLT5BZGQodHApOw0KLSAgICAgICAgdHBvLmluZGV4ID0gMDsNCi0gICAgICAgIHRwby5wb3MgPSAwOw0KLSAgICAgICAgdHBvcy5BZGQodHBvKTsNCisgICAgICBtX2JDdXJSVEwgPSBtX2JSVEw7DQorICAgICAgbV9pQ3VyQWxpZ25tZW50ID0gbV9pQWxpZ25tZW50Ow0KICAgICB9DQorICAgIGlmIChtX2JSVEwpIHsNCisgICAgICBtX2JBcmFiaWNOdW1iZXIgPSBtX2lBcmFiaWNDb250ZXh0ID49IDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9iQXJhYmljTnVtYmVyID0gbV9pQXJhYmljQ29udGV4dCA+IDE7DQorICAgIH0NCisgICAgbV9iQXJhYmljTnVtYmVyID0gbV9iQXJhYmljTnVtYmVyICYmIG1fYkFyYWJpY1NoYXBlczsNCisgIH0NCisgIG1fYkFyYWJpY0NvbW1hID0gbV9iQXJhYmljTnVtYmVyOw0KKyAgUmVzZXRDb250ZXh0Q2hhclN0eWxlcygpOw0KIH0NCi12b2lkIENGWF9UeHRCcmVhazo6RW5kQnJlYWtfQWxpZ25tZW50KENGWF9UUE9BcnJheSAmdHBvcywgRlhfQk9PTCBiQWxsQ2hhcnMsIEZYX0RXT1JEIGR3U3RhdHVzKQ0KLXsNCi0gICAgaW50MzJfdCBpTmV0V2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aCwgaUdhcENoYXJzID0gMCwgaUNoYXJXaWR0aDsNCi0gICAgQ0ZYX1R4dFBpZWNlQXJyYXkgKnBDdXJQaWVjZXMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lUGllY2VzOw0KLSAgICBpbnQzMl90IGksIGosIGlDb3VudCA9IHBDdXJQaWVjZXMtPkdldFNpemUoKTsNCi0gICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOw0KLSAgICBGWF9UUE8gdHBvOw0KLSAgICBDRlhfVHh0Q2hhciAqcFRDOw0KLSAgICBGWF9EV09SRCBkd0NoYXJUeXBlOw0KLSAgICBmb3IgKGkgPSBpQ291bnQgLSAxOyBpID4gLTE7IGkgLS0pIHsNCi0gICAgICAgIHRwbyA9IHRwb3MuR2V0QXQoaSk7DQotICAgICAgICBDRlhfVHh0UGllY2UgJnR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQotICAgICAgICBpZiAoIWJGaW5kKSB7DQotICAgICAgICAgICAgaU5ldFdpZHRoID0gdHRwLkdldEVuZFBvcygpOw0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX1BhZ2VMb2FkKENGWF9DaGFyKiBwQ3VyQ2hhciwgRlhfRFdPUkQgZHdQcm9wcykgew0KKyAgaWYgKCFtX2JQYWdpbmF0aW9uKSB7DQorICAgICgoQ0ZYX1R4dENoYXIqKXBDdXJDaGFyKS0+bV9kd1N0YXR1cyA9IDA7DQorICAgICgoQ0ZYX1R4dENoYXIqKXBDdXJDaGFyKS0+bV9wVXNlckRhdGEgPSBtX3BVc2VyRGF0YTsNCisgIH0NCisgIGlmIChtX2JBcmFiaWNDb250ZXh0IHx8IG1fYkFyYWJpY1NoYXBlcykgew0KKyAgICBpbnQzMl90IGlCaWRpQ2xzID0gKGR3UHJvcHMgJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4gRlhfQklESUNMQVNTQklUUzsNCisgICAgaW50MzJfdCBpQXJhYmljQ29udGV4dCA9DQorICAgICAgICAoaUJpZGlDbHMgPT0gRlhfQklESUNMQVNTX1IgfHwgaUJpZGlDbHMgPT0gRlhfQklESUNMQVNTX0FMKQ0KKyAgICAgICAgICAgID8gMg0KKyAgICAgICAgICAgIDogKChpQmlkaUNscyA9PSBGWF9CSURJQ0xBU1NfTCB8fCBpQmlkaUNscyA9PSBGWF9CSURJQ0xBU1NfUykgPyAwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDEpOw0KKyAgICBpZiAoaUFyYWJpY0NvbnRleHQgIT0gbV9pQXJhYmljQ29udGV4dCAmJiBpQXJhYmljQ29udGV4dCAhPSAxKSB7DQorICAgICAgbV9pQXJhYmljQ29udGV4dCA9IGlBcmFiaWNDb250ZXh0Ow0KKyAgICAgIGlmIChtX2lDdXJBcmFiaWNDb250ZXh0ID09IDEpIHsNCisgICAgICAgIG1faUN1ckFyYWJpY0NvbnRleHQgPSBpQXJhYmljQ29udGV4dDsNCisgICAgICB9DQorICAgICAgUmVzZXRBcmFiaWNDb250ZXh0KCk7DQorICAgICAgaWYgKCFtX2JQYWdpbmF0aW9uKSB7DQorICAgICAgICBDRlhfVHh0Q2hhciogcExhc3RDaGFyID0gKENGWF9UeHRDaGFyKilHZXRMYXN0Q2hhcigxLCBGQUxTRSk7DQorICAgICAgICBpZiAocExhc3RDaGFyICE9IE5VTEwgJiYgcExhc3RDaGFyLT5tX2R3U3RhdHVzIDwgMSkgew0KKyAgICAgICAgICBwTGFzdENoYXItPm1fZHdTdGF0dXMgPSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrOw0KICAgICAgICAgfQ0KLSAgICAgICAgRlhfQk9PTCBiQXJhYmljID0gRlhfSXNPZGQodHRwLm1faUJpZGlMZXZlbCk7DQotICAgICAgICBqID0gYkFyYWJpYyA/IDAgOiB0dHAubV9pQ2hhcnMgLSAxOw0KLSAgICAgICAgd2hpbGUgKGogPiAtMSAmJiBqIDwgdHRwLm1faUNoYXJzKSB7DQotICAgICAgICAgICAgcFRDID0gdHRwLkdldENoYXJQdHIoaik7DQotICAgICAgICAgICAgaWYgKHBUQy0+bV9uQnJlYWtUeXBlID09IEZYX0xCVF9ESVJFQ1RfQlJLKSB7DQotICAgICAgICAgICAgICAgIGlHYXBDaGFycyArKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCFiRmluZCB8fCAhYkFsbENoYXJzKSB7DQotICAgICAgICAgICAgICAgIGR3Q2hhclR5cGUgPSBwVEMtPkdldENoYXJUeXBlKCk7DQotICAgICAgICAgICAgICAgIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX1NwYWNlIHx8IGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfQ29udHJvbCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiRmluZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkFsbENoYXJzICYmIGlDaGFyV2lkdGggPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlOZXRXaWR0aCAtPSBpQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghYkFsbENoYXJzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaiArPSBiQXJhYmljID8gMSA6IC0xOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiQWxsQ2hhcnMgJiYgYkZpbmQpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi0gICAgaW50MzJfdCBpT2Zmc2V0ID0gbV9pTGluZVdpZHRoIC0gaU5ldFdpZHRoOw0KLSAgICBpbnQzMl90IGlMb3dlckFsaWdubWVudCA9IChtX2lDdXJBbGlnbm1lbnQgJiBGWF9UWFRMSU5FQUxJR05NRU5UX0xvd2VyTWFzayk7DQotICAgIGludDMyX3QgaUhpZ2hlckFsaWdubWVudCA9IChtX2lDdXJBbGlnbm1lbnQgJiBGWF9UWFRMSU5FQUxJR05NRU5UX0hpZ2hlck1hc2spOw0KLSAgICBpZiAoaUdhcENoYXJzID4gMCAmJiAoaUhpZ2hlckFsaWdubWVudCA9PSBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkIHx8IChpSGlnaGVyQWxpZ25tZW50ID09IEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkICYmIGR3U3RhdHVzICE9IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKSkpIHsNCi0gICAgICAgIGludDMyX3QgaVN0YXJ0ID0gLTE7DQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICAgICAgdHBvID0gdHBvcy5HZXRBdChpKTsNCi0gICAgICAgICAgICBDRlhfVHh0UGllY2UgJnR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQotICAgICAgICAgICAgaWYgKGlTdGFydCA8IC0xKSB7DQotICAgICAgICAgICAgICAgIGlTdGFydCA9IHR0cC5tX2lTdGFydFBvczsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0dHAubV9pU3RhcnRQb3MgPSBpU3RhcnQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludDMyX3QgazsNCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdHRwLm1faUNoYXJzOyBqICsrKSB7DQotICAgICAgICAgICAgICAgIHBUQyA9IHR0cC5HZXRDaGFyUHRyKGopOw0KLSAgICAgICAgICAgICAgICBpZiAocFRDLT5tX25CcmVha1R5cGUgIT0gRlhfTEJUX0RJUkVDVF9CUksgfHwgcFRDLT5tX2lDaGFyV2lkdGggPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBrID0gaU9mZnNldCAvIGlHYXBDaGFyczsNCi0gICAgICAgICAgICAgICAgcFRDLT5tX2lDaGFyV2lkdGggKz0gazsNCi0gICAgICAgICAgICAgICAgdHRwLm1faVdpZHRoICs9IGs7DQotICAgICAgICAgICAgICAgIGlPZmZzZXQgLT0gazsNCi0gICAgICAgICAgICAgICAgaUdhcENoYXJzIC0tOw0KLSAgICAgICAgICAgICAgICBpZiAoaUdhcENoYXJzIDwgMSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaVN0YXJ0ICs9IHR0cC5tX2lXaWR0aDsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChpTG93ZXJBbGlnbm1lbnQgPiBGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQpIHsNCi0gICAgICAgIGlmIChpTG93ZXJBbGlnbm1lbnQgPT0gRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXIpIHsNCi0gICAgICAgICAgICBpT2Zmc2V0IC89IDI7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaU9mZnNldCA+IDApIHsNCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICAgICAgICAgIENGWF9UeHRQaWVjZSAmdHRwID0gcEN1clBpZWNlcy0+R2V0QXQoaSk7DQotICAgICAgICAgICAgICAgIHR0cC5tX2lTdGFydFBvcyArPSBpT2Zmc2V0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KKyAgfQ0KKyAgcEN1ckNoYXItPm1fZHdDaGFyU3R5bGVzID0gbV9kd0NvbnRleHRDaGFyU3R5bGVzOw0KIH0NCi1GWF9EV09SRCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KGR3U3RhdHVzID49IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWsgJiYgZHdTdGF0dXMgPD0gRlhfVFhUQlJFQUtfUGFnZUJyZWFrKTsNCi0gICAgQ0ZYX1R4dFBpZWNlQXJyYXkgKnBDdXJQaWVjZXMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lUGllY2VzOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IHBDdXJQaWVjZXMtPkdldFNpemUoKTsNCi0gICAgaWYgKGlDb3VudCA+IDApIHsNCi0gICAgICAgIENGWF9UeHRQaWVjZSAqcExhc3RQaWVjZSA9IHBDdXJQaWVjZXMtPkdldFB0ckF0KC0tIGlDb3VudCk7DQotICAgICAgICBpZiAoZHdTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQotICAgICAgICAgICAgcExhc3RQaWVjZS0+bV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KK0ZYX0RXT1JEIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9Db21iaW5hdGlvbihDRlhfQ2hhciogcEN1ckNoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0aW9uKSB7DQorICBGWFNZU19hc3NlcnQocEN1ckNoYXIgIT0gTlVMTCk7DQorICBGWF9XQ0hBUiB3Y2ggPSBwQ3VyQ2hhci0+bV93Q2hhckNvZGU7DQorICBGWF9XQ0hBUiB3Rm9ybTsNCisgIGludDMyX3QgaUNoYXJXaWR0aCA9IDA7DQorICBDRlhfQ2hhciogcExhc3RDaGFyOw0KKyAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IC0xOw0KKyAgaWYgKG1fYkNvbWJUZXh0KSB7DQorICAgIGlDaGFyV2lkdGggPSBtX2lDb21iV2lkdGg7DQorICB9IGVsc2Ugew0KKyAgICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQoaVJvdGF0aW9uKSkgew0KKyAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdGb3JtID0gd2NoOw0KKyAgICAgIGlmICghbV9iUGFnaW5hdGlvbikgew0KKyAgICAgICAgcExhc3RDaGFyID0gR2V0TGFzdENoYXIoMCwgRkFMU0UpOw0KKyAgICAgICAgaWYgKHBMYXN0Q2hhciAhPSBOVUxMICYmDQorICAgICAgICAgICAgKCgoQ0ZYX1R4dENoYXIqKXBMYXN0Q2hhciktPm1fZHdDaGFyU3R5bGVzICYNCisgICAgICAgICAgICAgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY1NoYWRkYSkgPT0gMCkgew0KKyAgICAgICAgICBGWF9CT09MIGJTaGFkZGEgPSBGQUxTRTsNCisgICAgICAgICAgaWYgKHdjaCA9PSAweDA2NTEpIHsNCisgICAgICAgICAgICBGWF9XQ0hBUiB3TGFzdCA9IHBMYXN0Q2hhci0+bV93Q2hhckNvZGU7DQorICAgICAgICAgICAgaWYgKHdMYXN0ID49IDB4MDY0QyAmJiB3TGFzdCA8PSAweDA2NTApIHsNCisgICAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdMYXN0KTsNCisgICAgICAgICAgICAgIGJTaGFkZGEgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIGlmICh3Y2ggPj0gMHgwNjRDICYmIHdjaCA8PSAweDA2NTApIHsNCisgICAgICAgICAgICBpZiAocExhc3RDaGFyLT5tX3dDaGFyQ29kZSA9PSAweDA2NTEpIHsNCisgICAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdjaCk7DQorICAgICAgICAgICAgICBiU2hhZGRhID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGJTaGFkZGEpIHsNCisgICAgICAgICAgICAoKENGWF9UeHRDaGFyKilwTGFzdENoYXIpLT5tX2R3Q2hhclN0eWxlcyB8PQ0KKyAgICAgICAgICAgICAgICBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhOw0KKyAgICAgICAgICAgICgoQ0ZYX1R4dENoYXIqKXBMYXN0Q2hhciktPm1faUNoYXJXaWR0aCA9IDA7DQorICAgICAgICAgICAgKChDRlhfVHh0Q2hhciopcEN1ckNoYXIpLT5tX2R3Q2hhclN0eWxlcyB8PQ0KKyAgICAgICAgICAgICAgICBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBGQUxTRSkpIHsNCisgICAgICAgIGlDaGFyV2lkdGggPSAwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOw0KKyAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvclNjYWxlIC8gMTAwOw0KKyAgfQ0KKyAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IC1pQ2hhcldpZHRoOw0KKyAgcmV0dXJuIEZYX1RYVEJSRUFLX05vbmU7DQorfQ0KK0ZYX0RXT1JEIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9UYWIoQ0ZYX0NoYXIqIHBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbikgew0KKyAgbV9kd0NoYXJUeXBlID0gRlhfQ0hBUlRZUEVfVGFiOw0KKyAgaWYgKChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfRXhwYW5kVGFiKSA9PSAwKSB7DQorICAgIHJldHVybiBGWF9UWFRCUkVBS19Ob25lOw0KKyAgfQ0KKyAgaW50MzJfdCYgaUxpbmVXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KKyAgaW50MzJfdCBpQ2hhcldpZHRoOw0KKyAgaWYgKG1fYkNvbWJUZXh0KSB7DQorICAgIGlDaGFyV2lkdGggPSBtX2lDb21iV2lkdGg7DQorICB9IGVsc2Ugew0KKyAgICBpZiAobV9iRXF1aWRpc3RhbnQpIHsNCisgICAgICBpQ2hhcldpZHRoID0gaUxpbmVXaWR0aDsNCisgICAgICBpQ2hhcldpZHRoID0gbV9pVGFiV2lkdGggKiAoaUNoYXJXaWR0aCAvIG1faVRhYldpZHRoICsgMSkgLSBpQ2hhcldpZHRoOw0KKyAgICAgIGlmIChpQ2hhcldpZHRoIDwgRlhfVFhUQlJFQUtfTWluaW11bVRhYldpZHRoKSB7DQorICAgICAgICBpQ2hhcldpZHRoICs9IG1faVRhYldpZHRoOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpQ2hhcldpZHRoID0gbV9pVGFiV2lkdGg7DQorICAgIH0NCisgIH0NCisgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgaWYgKCFtX2JTaW5nbGVMaW5lICYmIGlMaW5lV2lkdGggPj0gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKSB7DQorICAgIHJldHVybiBFbmRCcmVhayhGWF9UWFRCUkVBS19MaW5lQnJlYWspOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX1RYVEJSRUFLX05vbmU7DQorfQ0KK0ZYX0RXT1JEIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9Db250cm9sKENGWF9DaGFyKiBwQ3VyQ2hhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGlvbikgew0KKyAgbV9kd0NoYXJUeXBlID0gRlhfQ0hBUlRZUEVfQ29udHJvbDsNCisgIEZYX0RXT1JEIGR3UmV0ID0gRlhfVFhUQlJFQUtfTm9uZTsNCisgIGlmICghbV9iU2luZ2xlTGluZSkgew0KKyAgICBGWF9XQ0hBUiB3Y2ggPSBwQ3VyQ2hhci0+bV93Q2hhckNvZGU7DQorICAgIHN3aXRjaCAod2NoKSB7DQorICAgICAgY2FzZSBMJ1x2JzoNCisgICAgICBjYXNlIDB4MjAyODoNCisgICAgICAgIGR3UmV0ID0gRlhfVFhUQlJFQUtfTGluZUJyZWFrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBMJ1xmJzoNCisgICAgICAgIGR3UmV0ID0gRlhfVFhUQlJFQUtfUGFnZUJyZWFrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAweDIwMjk6DQorICAgICAgICBkd1JldCA9IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGlmICh3Y2ggPT0gbV93UGFyYWdCcmVha0NoYXIpIHsNCisgICAgICAgICAgZHdSZXQgPSBGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChkd1JldCAhPSBGWF9UWFRCUkVBS19Ob25lKSB7DQorICAgICAgZHdSZXQgPSBFbmRCcmVhayhkd1JldCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBkd1JldDsNCit9DQorRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYyhDRlhfQ2hhciogcEN1ckNoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGlvbikgew0KKyAgRlhfRFdPUkQgZHdUeXBlID0gKHBDdXJDaGFyLT5tX2R3Q2hhclByb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7DQorICBpbnQzMl90JiBpTGluZVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQorICBGWF9XQ0hBUiB3Rm9ybTsNCisgIGludDMyX3QgaUNoYXJXaWR0aCA9IDA7DQorICBDRlhfQ2hhciogcExhc3RDaGFyID0gTlVMTDsNCisgIEZYX0JPT0wgYkFsZWYgPSBGQUxTRTsNCisgIGlmICghbV9iQ29tYlRleHQgJiYgbV9kd0NoYXJUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgJiYNCisgICAgICBtX2R3Q2hhclR5cGUgPD0gRlhfQ0hBUlRZUEVfQXJhYmljRGlzdG9ydGlvbikgew0KKyAgICBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigxKTsNCisgICAgaWYgKHBMYXN0Q2hhciAhPSBOVUxMKSB7DQorICAgICAgaUNoYXJXaWR0aCA9IHBMYXN0Q2hhci0+bV9pQ2hhcldpZHRoOw0KKyAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgaUxpbmVXaWR0aCAtPSBpQ2hhcldpZHRoOw0KKyAgICAgIH0NCisgICAgICBDRlhfQ2hhciogcFByZXZDaGFyID0gR2V0TGFzdENoYXIoMik7DQorICAgICAgd0Zvcm0gPSBtX3BBcmFiaWNDaGFyLT5HZXRGb3JtQ2hhcihwTGFzdENoYXIsIHBQcmV2Q2hhciwgcEN1ckNoYXIpOw0KKyAgICAgIGJBbGVmID0gKHdGb3JtID09IDB4RkVGRiAmJg0KKyAgICAgICAgICAgICAgIHBMYXN0Q2hhci0+R2V0Q2hhclR5cGUoKSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKTsNCisgICAgICBpbnQzMl90IGlMYXN0Um90YXRpb24gPSBwTGFzdENoYXItPm1fblJvdGF0aW9uICsgbV9pTGluZVJvdGF0aW9uOw0KKyAgICAgIGlmIChtX2JWZXJ0aWNhbCAmJiAocExhc3RDaGFyLT5tX2R3Q2hhclByb3BzICYgMHg4MDAwKSAhPSAwKSB7DQorICAgICAgICBpTGFzdFJvdGF0aW9uKys7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpTGFzdFJvdGF0aW9uKSkgew0KKyAgICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgICBpZiAod0Zvcm0gPT0gMHhGRUZGKSB7DQorICAgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsNCisgICAgICB9DQorICAgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsNCisgICAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvclNjYWxlIC8gMTAwOw0KKyAgICAgIHBMYXN0Q2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICBpTGluZVdpZHRoICs9IGlDaGFyV2lkdGg7DQorICAgICAgaUNoYXJXaWR0aCA9IDA7DQorICAgIH0NCisgIH0NCisgIG1fZHdDaGFyVHlwZSA9IGR3VHlwZTsNCisgIHdGb3JtID0gbV9wQXJhYmljQ2hhci0+R2V0Rm9ybUNoYXIocEN1ckNoYXIsIGJBbGVmID8gTlVMTCA6IHBMYXN0Q2hhciwgTlVMTCk7DQorICBpZiAobV9iQ29tYlRleHQpIHsNCisgICAgaUNoYXJXaWR0aCA9IG1faUNvbWJXaWR0aDsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7DQorICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBGQUxTRSk7DQorICAgIH0NCisgICAgaWYgKHdGb3JtID09IDB4RkVGRikgew0KKyAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICB9DQorICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7DQorICB9DQorICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgIG1fcEN1ckxpbmUtPm1faUFyYWJpY0NoYXJzKys7DQorICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgaUxpbmVXaWR0aCA+IG1faUxpbmVXaWR0aCArIG1faVRvbGVyYW5jZSkgew0KKyAgICByZXR1cm4gRW5kQnJlYWsoRlhfVFhUQlJFQUtfTGluZUJyZWFrKTsNCisgIH0NCisgIHJldHVybiBGWF9UWFRCUkVBS19Ob25lOw0KK30NCitGWF9EV09SRCBDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzKENGWF9DaGFyKiBwQ3VyQ2hhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0aW9uKSB7DQorICBGWF9EV09SRCBkd1Byb3BzID0gcEN1ckNoYXItPm1fZHdDaGFyUHJvcHM7DQorICBGWF9EV09SRCBkd1R5cGUgPSAoZHdQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spOw0KKyAgaW50MzJfdCYgaUxpbmVXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsNCisgIG1fZHdDaGFyVHlwZSA9IGR3VHlwZTsNCisgIEZYX1dDSEFSIHdjaCA9IHBDdXJDaGFyLT5tX3dDaGFyQ29kZTsNCisgIEZYX1dDSEFSIHdGb3JtID0gd2NoOw0KKyAgaWYgKGR3VHlwZSA9PSBGWF9DSEFSVFlQRV9OdW1lcmljKSB7DQorICAgIGlmIChtX2JBcmFiaWNOdW1iZXIpIHsNCisgICAgICB3Rm9ybSA9IHdjaCArIDB4MDYzMDsNCisgICAgICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0luZGljOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKHdjaCA9PSBMJywnKSB7DQorICAgIGlmIChtX2JBcmFiaWNTaGFwZXMgJiYgbV9pQ3VyQXJhYmljQ29udGV4dCA+IDApIHsNCisgICAgICB3Rm9ybSA9IDB4MDYwQzsNCisgICAgICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0NvbW1hOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKG1fYkN1clJUTCB8fCBtX2JWZXJ0aWNhbCkgew0KKyAgICB3Rm9ybSA9IEZYX0dldE1pcnJvckNoYXIod2NoLCBkd1Byb3BzLCBtX2JDdXJSVEwsIG1fYlZlcnRpY2FsKTsNCisgIH0NCisgIGlmIChtX2JDb21iVGV4dCkgew0KKyAgICBpQ2hhcldpZHRoID0gbV9pQ29tYldpZHRoOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlSb3RhdGlvbikpIHsNCisgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgfSBlbHNlIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBGQUxTRSkpIHsNCisgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsNCisgICAgfQ0KKyAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOw0KKyAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvclNjYWxlIC8gMTAwOw0KKyAgfQ0KKyAgaUNoYXJXaWR0aCArPSBtX2lDaGFyU3BhY2U7DQorICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgIEZYX0JPT0wgYkJyZWFrID0gKGR3VHlwZSAhPSBGWF9DSEFSVFlQRV9TcGFjZSB8fA0KKyAgICAgICAgICAgICAgICAgICAgKG1fZHdQb2xpY2llcyAmIEZYX1RYVEJSRUFLUE9MSUNZX1NwYWNlQnJlYWspICE9IDApOw0KKyAgaWYgKCFtX2JTaW5nbGVMaW5lICYmIGJCcmVhayAmJiBpTGluZVdpZHRoID4gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKSB7DQorICAgIHJldHVybiBFbmRCcmVhayhGWF9UWFRCUkVBS19MaW5lQnJlYWspOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX1RYVEJSRUFLX05vbmU7DQorfQ0KK3R5cGVkZWYgRlhfRFdPUkQgKENGWF9UeHRCcmVhazo6KkZYX1R4dEJyZWFrX0xQRkFwcGVuZENoYXIpKENGWF9DaGFyKiBwQ3VyQ2hhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGlvbik7DQorc3RhdGljIGNvbnN0IEZYX1R4dEJyZWFrX0xQRkFwcGVuZENoYXIgZ19GWF9UeHRCcmVha19scGZBcHBlbmRDaGFyWzE2XSA9IHsNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsICAgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9UYWIsDQorICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLCAgICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQ29udHJvbCwNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9Db21iaW5hdGlvbiwgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQorICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLCAgICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KKyAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywgICAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsICAgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQorICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLCAgICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLA0KKyAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywgICAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCit9Ow0KK0ZYX0RXT1JEIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpIHsNCisgIEZYX0RXT1JEIGR3UHJvcHMgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07DQorICBGWF9EV09SRCBkd1R5cGUgPSAoZHdQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spOw0KKyAgQ0ZYX1R4dENoYXIqIHBDdXJDaGFyID0gbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzLT5BZGRTcGFjZSgpOw0KKyAgcEN1ckNoYXItPm1fd0NoYXJDb2RlID0gKEZYX1dPUkQpd2NoOw0KKyAgcEN1ckNoYXItPm1fblJvdGF0aW9uID0gbV9pQ2hhclJvdGF0aW9uOw0KKyAgcEN1ckNoYXItPm1fZHdDaGFyUHJvcHMgPSBkd1Byb3BzOw0KKyAgcEN1ckNoYXItPm1fZHdDaGFyU3R5bGVzID0gMDsNCisgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSAwOw0KKyAgcEN1ckNoYXItPm1faUhvcml6b250YWxTY2FsZSA9IG1faUhvclNjYWxlOw0KKyAgcEN1ckNoYXItPm1faVZlcnRpYWxTY2FsZSA9IG1faVZlclNjYWxlOw0KKyAgcEN1ckNoYXItPm1fZHdTdGF0dXMgPSAwOw0KKyAgcEN1ckNoYXItPm1faUJpZGlDbGFzcyA9IDA7DQorICBwQ3VyQ2hhci0+bV9pQmlkaUxldmVsID0gMDsNCisgIHBDdXJDaGFyLT5tX2lCaWRpUG9zID0gMDsNCisgIHBDdXJDaGFyLT5tX2lCaWRpT3JkZXIgPSAwOw0KKyAgcEN1ckNoYXItPm1fcFVzZXJEYXRhID0gTlVMTDsNCisgIEFwcGVuZENoYXJfUGFnZUxvYWQocEN1ckNoYXIsIGR3UHJvcHMpOw0KKyAgRlhfRFdPUkQgZHdSZXQxID0gRlhfVFhUQlJFQUtfTm9uZTsNCisgIGlmIChkd1R5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24gJiYNCisgICAgICBHZXRVbmlmaWVkQ2hhclR5cGUobV9kd0NoYXJUeXBlKSAhPSBHZXRVbmlmaWVkQ2hhclR5cGUoZHdUeXBlKSkgew0KKyAgICBpZiAobV9kd0NoYXJUeXBlID4gMCAmJg0KKyAgICAgICAgbV9wQ3VyTGluZS0+bV9pV2lkdGggPiBtX2lMaW5lV2lkdGggKyBtX2lUb2xlcmFuY2UgJiYgIW1fYlNpbmdsZUxpbmUpIHsNCisgICAgICBpZiAobV9kd0NoYXJUeXBlICE9IEZYX0NIQVJUWVBFX1NwYWNlIHx8IGR3VHlwZSAhPSBGWF9DSEFSVFlQRV9Db250cm9sKSB7DQorICAgICAgICBkd1JldDEgPSBFbmRCcmVhayhGWF9UWFRCUkVBS19MaW5lQnJlYWspOw0KKyAgICAgICAgaW50MzJfdCBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQorICAgICAgICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICAgICAgICBwQ3VyQ2hhciA9IG1fcEN1ckxpbmUtPm1fcExpbmVDaGFycy0+R2V0RGF0YVB0cihpQ291bnQgLSAxKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaVJvdGF0aW9uID0gbV9pUm90YXRpb247DQorICBpZiAobV9iVmVydGljYWwgJiYgKGR3UHJvcHMgJiAweDgwMDApICE9IDApIHsNCisgICAgaVJvdGF0aW9uID0gKGlSb3RhdGlvbiArIDEpICUgNDsNCisgIH0NCisgIEZYX0RXT1JEIGR3UmV0MiA9DQorICAgICAgKHRoaXMtPipnX0ZYX1R4dEJyZWFrX2xwZkFwcGVuZENoYXJbZHdUeXBlID4+IEZYX0NIQVJUWVBFQklUU10pKA0KKyAgICAgICAgICBwQ3VyQ2hhciwgaVJvdGF0aW9uKTsNCisgIHJldHVybiBGWF9NQVgoZHdSZXQxLCBkd1JldDIpOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6RW5kQnJlYWtfVXBkYXRlQXJhYmljU2hhcGVzKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fYkFyYWJpY1NoYXBlcyk7DQorICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgIGlmIChpQ291bnQgPCAyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QmIGlMaW5lV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsNCisgIENGWF9DaGFyICpwQ3VyLCAqcE5leHQ7DQorICBwQ3VyID0gbV9wQ3VyTGluZS0+R2V0Q2hhclB0cigwKTsNCisgIEZYX0JPT0wgYlByZXZOdW0gPSAocEN1ci0+bV9kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljSW5kaWMpICE9IDA7DQorICBwQ3VyID0gbV9wQ3VyTGluZS0+R2V0Q2hhclB0cigxKTsNCisgIEZYX1dDSEFSIHdjaCwgd0Zvcm07DQorICBGWF9CT09MIGJOZXh0TnVtOw0KKyAgaW50MzJfdCBpID0gMSwgaUNoYXJXaWR0aCwgaVJvdGF0aW9uOw0KKyAgZG8gew0KKyAgICBpKys7DQorICAgIGlmIChpIDwgaUNvdW50KSB7DQorICAgICAgcE5leHQgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKGkpOw0KKyAgICAgIGJOZXh0TnVtID0gKHBOZXh0LT5tX2R3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNJbmRpYykgIT0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICBwTmV4dCA9IE5VTEw7DQorICAgICAgYk5leHROdW0gPSBGQUxTRTsNCisgICAgfQ0KKyAgICB3Y2ggPSBwQ3VyLT5tX3dDaGFyQ29kZTsNCisgICAgaWYgKHdjaCA9PSBMJy4nKSB7DQorICAgICAgaWYgKGJQcmV2TnVtICYmIGJOZXh0TnVtKSB7DQorICAgICAgICBpUm90YXRpb24gPSBtX2lSb3RhdGlvbjsNCisgICAgICAgIGlmIChtX2JWZXJ0aWNhbCAmJiAocEN1ci0+bV9kd0NoYXJQcm9wcyAmIDB4ODAwMCkgIT0gMCkgew0KKyAgICAgICAgICBpUm90YXRpb24gPSAoKGlSb3RhdGlvbiArIDEpICYgMHgwMyk7DQorICAgICAgICB9DQorICAgICAgICB3Rm9ybSA9IHdjaCA9PSBMJy4nID8gMHgwNjZCIDogMHgwNjZDOw0KKyAgICAgICAgaUxpbmVXaWR0aCAtPSBwQ3VyLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICBpZiAobV9iQ29tYlRleHQpIHsNCisgICAgICAgICAgaUNoYXJXaWR0aCA9IG1faUNvbWJXaWR0aDsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZHdTdGF0dXMgPSBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzOw0KKyAgICAgICAgICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQoaVJvdGF0aW9uKSkgew0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIEZBTFNFKSkgew0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICAgICAgICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7DQogICAgICAgICB9DQotICAgICAgICByZXR1cm4gZHdTdGF0dXM7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfVHh0TGluZSAqcExhc3RMaW5lID0gR2V0VHh0TGluZShUUlVFKTsNCi0gICAgICAgIGlmIChwTGFzdExpbmUgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIHBDdXJQaWVjZXMgPSBwTGFzdExpbmUtPm1fcExpbmVQaWVjZXM7DQotICAgICAgICAgICAgaUNvdW50ID0gcEN1clBpZWNlcy0+R2V0U2l6ZSgpOw0KLSAgICAgICAgICAgIGlmIChpQ291bnQgLS0gPiAwKSB7DQotICAgICAgICAgICAgICAgIENGWF9UeHRQaWVjZSAqcExhc3RQaWVjZSA9IHBDdXJQaWVjZXMtPkdldFB0ckF0KGlDb3VudCk7DQotICAgICAgICAgICAgICAgIGlmIChkd1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCi0gICAgICAgICAgICAgICAgICAgIHBMYXN0UGllY2UtPm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gcExhc3RQaWVjZS0+bV9kd1N0YXR1czsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gZHdTdGF0dXM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBGWF9UWFRCUkVBS19Ob25lOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KLSAgICAgICAgaWYgKGlDb3VudCA8IDEpIHsNCi0gICAgICAgICAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghbV9iUGFnaW5hdGlvbikgew0KLSAgICAgICAgICAgIENGWF9UeHRDaGFyICpwVEMgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKGlDb3VudCAtIDEpOw0KLSAgICAgICAgICAgIHBUQy0+bV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGR3U3RhdHVzIDw9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCi0gICAgICAgICAgICByZXR1cm4gZHdTdGF0dXM7DQotICAgICAgICB9DQorICAgICAgICBwQ3VyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBtX2lSZWFkeSA9IChtX3BDdXJMaW5lID09IG1fcFR4dExpbmUxKSA/IDEgOiAyOw0KLSAgICBDRlhfVHh0TGluZSAqcE5leHRMaW5lID0gKG1fcEN1ckxpbmUgPT0gbV9wVHh0TGluZTEpID8gbV9wVHh0TGluZTIgOiBtX3BUeHRMaW5lMTsNCi0gICAgRlhfQk9PTCBiQWxsQ2hhcnMgPSAobV9pQ3VyQWxpZ25tZW50ID4gRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodCk7DQotICAgIENGWF9UUE9BcnJheSB0cG9zOw0KLSAgICBDRlhfQ2hhciAqcFRDOw0KLSAgICBpZiAobV9iQXJhYmljU2hhcGVzKSB7DQotICAgICAgICBFbmRCcmVha19VcGRhdGVBcmFiaWNTaGFwZXMoKTsNCisgICAgYlByZXZOdW0gPSAocEN1ci0+bV9kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljSW5kaWMpICE9IDA7DQorICAgIHBDdXIgPSBwTmV4dDsNCisgIH0gd2hpbGUgKGkgPCBpQ291bnQpOw0KK30NCitGWF9CT09MIENGWF9UeHRCcmVhazo6RW5kQnJlYWtfU3BsaXRMaW5lKENGWF9UeHRMaW5lKiBwTmV4dExpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzKSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgIEZYX0JPT0wgYkRvbmUgPSBGQUxTRTsNCisgIENGWF9DaGFyKiBwVEM7DQorICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgbV9wQ3VyTGluZS0+bV9pV2lkdGggPiBtX2lMaW5lV2lkdGggKyBtX2lUb2xlcmFuY2UpIHsNCisgICAgcFRDID0gbV9wQ3VyTGluZS0+R2V0Q2hhclB0cihpQ291bnQgLSAxKTsNCisgICAgc3dpdGNoIChwVEMtPkdldENoYXJUeXBlKCkpIHsNCisgICAgICBjYXNlIEZYX0NIQVJUWVBFX1RhYjoNCisgICAgICBjYXNlIEZYX0NIQVJUWVBFX0NvbnRyb2w6DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZYX0NIQVJUWVBFX1NwYWNlOg0KKyAgICAgICAgaWYgKChtX2R3UG9saWNpZXMgJiBGWF9UWFRCUkVBS1BPTElDWV9TcGFjZUJyZWFrKSAhPSAwKSB7DQorICAgICAgICAgIFNwbGl0VGV4dExpbmUobV9wQ3VyTGluZSwgcE5leHRMaW5lLCAhbV9iUGFnaW5hdGlvbiAmJiBiQWxsQ2hhcnMpOw0KKyAgICAgICAgICBiRG9uZSA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgU3BsaXRUZXh0TGluZShtX3BDdXJMaW5lLCBwTmV4dExpbmUsICFtX2JQYWdpbmF0aW9uICYmIGJBbGxDaGFycyk7DQorICAgICAgICBiRG9uZSA9IFRSVUU7DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpZiAoRW5kQnJlYWtfU3BsaXRMaW5lKHBOZXh0TGluZSwgYkFsbENoYXJzLCBkd1N0YXR1cykpIHsNCi0gICAgICAgIGdvdG8gRW5kQnJlYWtfUmV0Ow0KLSAgICB9DQotICAgIEVuZEJyZWFrX0JpZGlMaW5lKHRwb3MsIGR3U3RhdHVzKTsNCi0gICAgaWYgKCFtX2JQYWdpbmF0aW9uICYmIG1faUN1ckFsaWdubWVudCA+IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdCkgew0KLSAgICAgICAgRW5kQnJlYWtfQWxpZ25tZW50KHRwb3MsIGJBbGxDaGFycywgZHdTdGF0dXMpOw0KLSAgICB9DQotRW5kQnJlYWtfUmV0Og0KKyAgfQ0KKyAgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgQ0ZYX1R4dFBpZWNlQXJyYXkqIHBDdXJQaWVjZXMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lUGllY2VzOw0KKyAgQ0ZYX1R4dFBpZWNlIHRwOw0KKyAgaWYgKG1fYlBhZ2luYXRpb24pIHsNCisgICAgdHAubV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KKyAgICB0cC5tX2lTdGFydFBvcyA9IG1fcEN1ckxpbmUtPm1faVN0YXJ0Ow0KKyAgICB0cC5tX2lXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KKyAgICB0cC5tX2lTdGFydENoYXIgPSAwOw0KKyAgICB0cC5tX2lDaGFycyA9IGlDb3VudDsNCisgICAgdHAubV9wQ2hhcnMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQorICAgIHRwLm1fcFVzZXJEYXRhID0gbV9wVXNlckRhdGE7DQorICAgIHBUQyA9IG1fcEN1ckxpbmUtPkdldENoYXJQdHIoMCk7DQorICAgIHRwLm1fZHdDaGFyU3R5bGVzID0gcFRDLT5tX2R3Q2hhclN0eWxlczsNCisgICAgdHAubV9pSG9yaXpvbnRhbFNjYWxlID0gcFRDLT5tX2lIb3Jpem9udGFsU2NhbGU7DQorICAgIHRwLm1faVZlcnRpY2FsU2NhbGUgPSBwVEMtPm1faVZlcnRpYWxTY2FsZTsNCisgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCiAgICAgbV9wQ3VyTGluZSA9IHBOZXh0TGluZTsNCi0gICAgcFRDID0gR2V0TGFzdENoYXIoMCwgRkFMU0UpOw0KLSAgICBtX2R3Q2hhclR5cGUgPSBwVEMgPT0gTlVMTCA/IDAgOiBwVEMtPkdldENoYXJUeXBlKCk7DQotICAgIGlmIChkd1N0YXR1cyA9PSBGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhaykgew0KLSAgICAgICAgbV9pQXJhYmljQ29udGV4dCA9IG1faUN1ckFyYWJpY0NvbnRleHQgPSAxOw0KLSAgICAgICAgUmVzZXRBcmFiaWNDb250ZXh0KCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGR3U3RhdHVzOw0KKyAgICBtX2R3Q2hhclR5cGUgPSAwOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChiQWxsQ2hhcnMgJiYgIWJEb25lKSB7DQorICAgIGludDMyX3QgaUVuZFBvcyA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KKyAgICBHZXRCcmVha1BvcygqbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzLCBpRW5kUG9zLCBiQWxsQ2hhcnMsIFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1pbnQzMl90IENGWF9UeHRCcmVhazo6R2V0QnJlYWtQb3MoQ0ZYX1R4dENoYXJBcnJheSAmY2EsIGludDMyX3QgJmlFbmRQb3MsIEZYX0JPT0wgYkFsbENoYXJzLCBGWF9CT09MIGJPbmx5QnJrKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gY2EuR2V0U2l6ZSgpIC0gMTsNCi0gICAgaWYgKGlMZW5ndGggPCAxKSB7DQotICAgICAgICByZXR1cm4gaUxlbmd0aDsNCit2b2lkIENGWF9UeHRCcmVhazo6RW5kQnJlYWtfQmlkaUxpbmUoQ0ZYX1RQT0FycmF5JiB0cG9zLCBGWF9EV09SRCBkd1N0YXR1cykgew0KKyAgQ0ZYX1R4dFBpZWNlIHRwOw0KKyAgRlhfVFBPIHRwbzsNCisgIENGWF9UeHRDaGFyKiBwVEM7DQorICBpbnQzMl90IGksIGo7DQorICBDRlhfVHh0Q2hhckFycmF5JiBjaGFycyA9ICptX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQorICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgIEZYX0JPT0wgYkRvbmUgPSAobV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMgPiAwIHx8IG1fYkN1clJUTCk7DQorICBpZiAoIW1fYlBhZ2luYXRpb24gJiYgYkRvbmUpIHsNCisgICAgaW50MzJfdCBpQmlkaU51bSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7DQorICAgICAgcFRDLT5tX2lCaWRpUG9zID0gaTsNCisgICAgICBpZiAocFRDLT5HZXRDaGFyVHlwZSgpICE9IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsNCisgICAgICAgIGlCaWRpTnVtID0gaTsNCisgICAgICB9DQorICAgICAgaWYgKGkgPT0gMCkgew0KKyAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAxOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpbnQzMl90IGlCcmVhayA9IC0xLCBpQnJlYWtQb3MgPSAtMSwgaUluZGlyZWN0ID0gLTEsIGlJbmRpcmVjdFBvcyA9IC0xLCBpTGFzdCA9IC0xLCBpTGFzdFBvcyA9IC0xOw0KLSAgICBpZiAobV9iU2luZ2xlTGluZSB8fCBpRW5kUG9zIDw9IG1faUxpbmVXaWR0aCkgew0KLSAgICAgICAgaWYgKCFiQWxsQ2hhcnMpIHsNCi0gICAgICAgICAgICByZXR1cm4gaUxlbmd0aDsNCisgICAgRlhfQmlkaUxpbmUoY2hhcnMsIGlCaWRpTnVtICsgMSwgbV9iQ3VyUlRMID8gMSA6IDApOw0KKyAgfQ0KKyAgQ0ZYX1R4dFBpZWNlQXJyYXkqIHBDdXJQaWVjZXMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lUGllY2VzOw0KKyAgaWYgKCFtX2JQYWdpbmF0aW9uICYmDQorICAgICAgKGJEb25lIHx8IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfTXV0aXBsZUZvcm1hdCkgIT0gMCkpIHsNCisgICAgdHAubV9kd1N0YXR1cyA9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWs7DQorICAgIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQorICAgIHRwLm1fcENoYXJzID0gbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzOw0KKyAgICBpbnQzMl90IGlCaWRpTGV2ZWwgPSAtMSwgaUNoYXJXaWR0aDsNCisgICAgaSA9IDAsIGogPSAtMTsNCisgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsNCisgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOw0KKyAgICAgIGlmIChpQmlkaUxldmVsIDwgMCkgew0KKyAgICAgICAgaUJpZGlMZXZlbCA9IHBUQy0+bV9pQmlkaUxldmVsOw0KKyAgICAgICAgdHAubV9pV2lkdGggPSAwOw0KKyAgICAgICAgdHAubV9pQmlkaUxldmVsID0gaUJpZGlMZXZlbDsNCisgICAgICAgIHRwLm1faUJpZGlQb3MgPSBwVEMtPm1faUJpZGlPcmRlcjsNCisgICAgICAgIHRwLm1fZHdDaGFyU3R5bGVzID0gcFRDLT5tX2R3Q2hhclN0eWxlczsNCisgICAgICAgIHRwLm1fcFVzZXJEYXRhID0gcFRDLT5tX3BVc2VyRGF0YTsNCisgICAgICAgIHRwLm1faUhvcml6b250YWxTY2FsZSA9IHBUQy0+bV9pSG9yaXpvbnRhbFNjYWxlOw0KKyAgICAgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KKyAgICAgICAgdHAubV9kd1N0YXR1cyA9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChpQmlkaUxldmVsICE9IHBUQy0+bV9pQmlkaUxldmVsIHx8IHBUQy0+bV9kd1N0YXR1cyAhPSAwKSB7DQorICAgICAgICBpZiAoaUJpZGlMZXZlbCA9PSBwVEMtPm1faUJpZGlMZXZlbCkgew0KKyAgICAgICAgICB0cC5tX2R3U3RhdHVzID0gcFRDLT5tX2R3U3RhdHVzOw0KKyAgICAgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgICAgIHRwLm1faVdpZHRoICs9IGlDaGFyV2lkdGg7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaSsrOw0KICAgICAgICAgfQ0KLSAgICAgICAgaUJyZWFrID0gaUxlbmd0aDsNCi0gICAgICAgIGlCcmVha1BvcyA9IGlFbmRQb3M7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiU3BhY2VCcmVhayA9IChtX2R3UG9saWNpZXMgJiBGWF9UWFRCUkVBS1BPTElDWV9TcGFjZUJyZWFrKSAhPSAwOw0KLSAgICBGWF9CT09MIGJOdW1iZXJCcmVhayA9IChtX2R3UG9saWNpZXMgJiBGWF9UWFRCUkVBS1BPTElDWV9OdW1iZXJCcmVhaykgIT0gMDsNCi0gICAgRlhfTElORUJSRUFLVFlQRSBlVHlwZTsNCi0gICAgRlhfRFdPUkQgbkNvZGVQcm9wLCBuQ3VyLCBuTmV4dDsNCi0gICAgQ0ZYX0NoYXIgKnBDdXIgPSBjYS5HZXREYXRhUHRyKGlMZW5ndGggLS0pOw0KLSAgICBpZiAoYkFsbENoYXJzKSB7DQotICAgICAgICBwQ3VyLT5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsNCi0gICAgfQ0KLSAgICBuQ29kZVByb3AgPSBwQ3VyLT5tX2R3Q2hhclByb3BzOw0KLSAgICBuTmV4dCA9IG5Db2RlUHJvcCAmIDB4MDAzRjsNCi0gICAgaW50MzJfdCBpQ2hhcldpZHRoID0gcEN1ci0+bV9pQ2hhcldpZHRoOw0KLSAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCi0gICAgICAgIGlFbmRQb3MgLT0gaUNoYXJXaWR0aDsNCi0gICAgfQ0KLSAgICB3aGlsZSAoaUxlbmd0aCA+PSAwKSB7DQotICAgICAgICBwQ3VyID0gY2EuR2V0RGF0YVB0cihpTGVuZ3RoKTsNCi0gICAgICAgIG5Db2RlUHJvcCA9IHBDdXItPm1fZHdDaGFyUHJvcHM7DQotICAgICAgICBuQ3VyID0gbkNvZGVQcm9wICYgMHgwMDNGOw0KLSAgICAgICAgaWYgKG5DdXIgPT0gRlhfQ0JQX1NQKSB7DQotICAgICAgICAgICAgaWYgKG5OZXh0ID09IEZYX0NCUF9TUCkgew0KLSAgICAgICAgICAgICAgICBlVHlwZSA9IGJTcGFjZUJyZWFrID8gRlhfTEJUX0RJUkVDVF9CUksgOiBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZVR5cGUgPSAqKChjb25zdCBGWF9MSU5FQlJFQUtUWVBFICopZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZSArIChuQ3VyIDw8IDUpICsgbk5leHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoYk51bWJlckJyZWFrICYmIG5DdXIgPT0gRlhfQ0JQX05VICYmIG5OZXh0ID09IEZYX0NCUF9OVSkgew0KLSAgICAgICAgICAgIGVUeXBlID0gRlhfTEJUX0RJUkVDVF9CUks7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChuTmV4dCA9PSBGWF9DQlBfU1ApIHsNCi0gICAgICAgICAgICAgICAgZVR5cGUgPSBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZVR5cGUgPSAqKChjb25zdCBGWF9MSU5FQlJFQUtUWVBFICopZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZSArIChuQ3VyIDw8IDUpICsgbk5leHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiQWxsQ2hhcnMpIHsNCi0gICAgICAgICAgICBwQ3VyLT5tX25CcmVha1R5cGUgPSAodWludDhfdCllVHlwZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYk9ubHlCcmspIHsNCi0gICAgICAgICAgICBpZiAobV9iU2luZ2xlTGluZSB8fCBpRW5kUG9zIDw9IG1faUxpbmVXaWR0aCB8fCAobkN1ciA9PSBGWF9DQlBfU1AgJiYgIWJTcGFjZUJyZWFrKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gRlhfTEJUX0RJUkVDVF9CUksgJiYgaUJyZWFrIDwgMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaUJyZWFrID0gaUxlbmd0aDsNCi0gICAgICAgICAgICAgICAgICAgIGlCcmVha1BvcyA9IGlFbmRQb3M7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIWJBbGxDaGFycykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZYX0xCVF9JTkRJUkVDVF9CUksgJiYgaUluZGlyZWN0IDwgMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaUluZGlyZWN0ID0gaUxlbmd0aDsNCi0gICAgICAgICAgICAgICAgICAgIGlJbmRpcmVjdFBvcyA9IGlFbmRQb3M7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGlMYXN0IDwgMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaUxhc3QgPSBpTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICAgICAgaUxhc3RQb3MgPSBpRW5kUG9zOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlDaGFyV2lkdGggPSBwQ3VyLT5tX2lDaGFyV2lkdGg7DQotICAgICAgICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQotICAgICAgICAgICAgICAgIGlFbmRQb3MgLT0gaUNoYXJXaWR0aDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBuTmV4dCA9IG5Db2RlUHJvcCAmIDB4MDAzRjsNCi0gICAgICAgIGlMZW5ndGggLS07DQotICAgIH0NCi0gICAgaWYgKGJPbmx5QnJrKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpZiAoaUJyZWFrID4gLTEpIHsNCi0gICAgICAgIGlFbmRQb3MgPSBpQnJlYWtQb3M7DQotICAgICAgICByZXR1cm4gaUJyZWFrOw0KLSAgICB9DQotICAgIGlmIChpSW5kaXJlY3QgPiAtMSkgew0KLSAgICAgICAgaUVuZFBvcyA9IGlJbmRpcmVjdFBvczsNCi0gICAgICAgIHJldHVybiBpSW5kaXJlY3Q7DQotICAgIH0NCi0gICAgaWYgKGlMYXN0ID4gLTEpIHsNCi0gICAgICAgIGlFbmRQb3MgPSBpTGFzdFBvczsNCi0gICAgICAgIHJldHVybiBpTGFzdDsNCi0gICAgfQ0KLSAgICByZXR1cm4gMDsNCi19DQotdm9pZCBDRlhfVHh0QnJlYWs6OlNwbGl0VGV4dExpbmUoQ0ZYX1R4dExpbmUgKnBDdXJMaW5lLCBDRlhfVHh0TGluZSAqcE5leHRMaW5lLCBGWF9CT09MIGJBbGxDaGFycykNCi17DQotICAgIEZYU1lTX2Fzc2VydChwQ3VyTGluZSAhPSBOVUxMICYmIHBOZXh0TGluZSAhPSBOVUxMKTsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBwQ3VyTGluZS0+Q291bnRDaGFycygpOw0KLSAgICBpZiAoaUNvdW50IDwgMikgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUVuZFBvcyA9IHBDdXJMaW5lLT5tX2lXaWR0aDsNCi0gICAgQ0ZYX1R4dENoYXJBcnJheSAmY3VyQ2hhcnMgPSAqcEN1ckxpbmUtPm1fcExpbmVDaGFyczsNCi0gICAgaW50MzJfdCBpQ2hhclBvcyA9IEdldEJyZWFrUG9zKGN1ckNoYXJzLCBpRW5kUG9zLCBiQWxsQ2hhcnMsIEZBTFNFKTsNCi0gICAgaWYgKGlDaGFyUG9zIDwgMCkgew0KLSAgICAgICAgaUNoYXJQb3MgPSAwOw0KLSAgICB9DQotICAgIGlDaGFyUG9zICsrOw0KLSAgICBpZiAoaUNoYXJQb3MgPj0gaUNvdW50KSB7DQotICAgICAgICBwTmV4dExpbmUtPlJlbW92ZUFsbChUUlVFKTsNCi0gICAgICAgIENGWF9DaGFyICpwVEMgPSBjdXJDaGFycy5HZXREYXRhUHRyKGlDaGFyUG9zIC0gMSk7DQotICAgICAgICBwVEMtPm1fbkJyZWFrVHlwZSA9IEZYX0xCVF9VTktOT1dOOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9UeHRDaGFyQXJyYXkgJm5leHRDaGFycyA9ICpwTmV4dExpbmUtPm1fcExpbmVDaGFyczsNCi0gICAgaW50IGN1cl9zaXplID0gY3VyQ2hhcnMuR2V0U2l6ZSgpOw0KLSAgICBuZXh0Q2hhcnMuU2V0U2l6ZShjdXJfc2l6ZSAtIGlDaGFyUG9zKTsNCi0gICAgRlhTWVNfbWVtY3B5KG5leHRDaGFycy5HZXREYXRhKCksIGN1ckNoYXJzLkdldERhdGFQdHIoaUNoYXJQb3MpLCAoY3VyX3NpemUgLSBpQ2hhclBvcykgKiBzaXplb2YoQ0ZYX1R4dENoYXIpKTsNCi0gICAgaUNvdW50IC09IGlDaGFyUG9zOw0KLSAgICBjdXJfc2l6ZSA9IGN1ckNoYXJzLkdldFNpemUoKTsNCi0gICAgY3VyQ2hhcnMuUmVtb3ZlQXQoY3VyX3NpemUgLSBpQ291bnQsIGlDb3VudCk7DQotICAgIHBDdXJMaW5lLT5tX2lXaWR0aCA9IGlFbmRQb3M7DQotICAgIENGWF9UeHRDaGFyICpwVEMgPSBjdXJDaGFycy5HZXREYXRhUHRyKGlDaGFyUG9zIC0gMSk7DQotICAgIHBUQy0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047DQotICAgIGlDb3VudCA9IG5leHRDaGFycy5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaUNoYXJXaWR0aCwgaVdpZHRoID0gMDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICBwVEMgPSBuZXh0Q2hhcnMuR2V0RGF0YVB0cihpKTsNCi0gICAgICAgIGlmIChwVEMtPkdldENoYXJUeXBlKCkgPj0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgew0KLSAgICAgICAgICAgIHBDdXJMaW5lLT5tX2lBcmFiaWNDaGFycyAtLTsNCi0gICAgICAgICAgICBwTmV4dExpbmUtPm1faUFyYWJpY0NoYXJzICsrOw0KLSAgICAgICAgfQ0KKyAgICAgICAgdHAubV9pQ2hhcnMgPSBpIC0gdHAubV9pU3RhcnRDaGFyOw0KKyAgICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCisgICAgICAgIHRwLm1faVN0YXJ0UG9zICs9IHRwLm1faVdpZHRoOw0KKyAgICAgICAgdHAubV9pU3RhcnRDaGFyID0gaTsNCisgICAgICAgIHRwby5pbmRleCA9ICsrajsNCisgICAgICAgIHRwby5wb3MgPSB0cC5tX2lCaWRpUG9zOw0KKyAgICAgICAgdHBvcy5BZGQodHBvKTsNCisgICAgICAgIGlCaWRpTGV2ZWwgPSAtMTsNCisgICAgICB9IGVsc2Ugew0KICAgICAgICAgaUNoYXJXaWR0aCA9IHBUQy0+bV9pQ2hhcldpZHRoOw0KICAgICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQotICAgICAgICAgICAgaVdpZHRoICs9IGlDaGFyV2lkdGg7DQorICAgICAgICAgIHRwLm1faVdpZHRoICs9IGlDaGFyV2lkdGg7DQogICAgICAgICB9DQotICAgICAgICBpZiAobV9iUGFnaW5hdGlvbikgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgaSsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaSA+IHRwLm1faVN0YXJ0Q2hhcikgew0KKyAgICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgICB0cC5tX2lDaGFycyA9IGkgLSB0cC5tX2lTdGFydENoYXI7DQorICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCisgICAgICB0cG8uaW5kZXggPSArK2o7DQorICAgICAgdHBvLnBvcyA9IHRwLm1faUJpZGlQb3M7DQorICAgICAgdHBvcy5BZGQodHBvKTsNCisgICAgfQ0KKyAgICBpZiAoaiA+IC0xKSB7DQorICAgICAgaWYgKGogPiAwKSB7DQorICAgICAgICBGWF9URVhUTEFZT1VUX1BpZWNlU29ydCh0cG9zLCAwLCBqKTsNCisgICAgICAgIGludDMyX3QgaVN0YXJ0UG9zID0gMDsNCisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gajsgaSsrKSB7DQorICAgICAgICAgIHRwbyA9IHRwb3MuR2V0QXQoaSk7DQorICAgICAgICAgIENGWF9UeHRQaWVjZSYgdHRwID0gcEN1clBpZWNlcy0+R2V0QXQodHBvLmluZGV4KTsNCisgICAgICAgICAgdHRwLm1faVN0YXJ0UG9zID0gaVN0YXJ0UG9zOw0KKyAgICAgICAgICBpU3RhcnRQb3MgKz0gdHRwLm1faVdpZHRoOw0KICAgICAgICAgfQ0KLSAgICAgICAgcFRDLT5tX2R3U3RhdHVzID0gMDsNCisgICAgICB9DQorICAgICAgQ0ZYX1R4dFBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdChqKTsNCisgICAgICB0dHAubV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KICAgICB9DQotICAgIHBOZXh0TGluZS0+bV9pV2lkdGggPSBpV2lkdGg7DQorICB9IGVsc2Ugew0KKyAgICB0cC5tX2R3U3RhdHVzID0gZHdTdGF0dXM7DQorICAgIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQorICAgIHRwLm1faVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQorICAgIHRwLm1faVN0YXJ0Q2hhciA9IDA7DQorICAgIHRwLm1faUNoYXJzID0gaUNvdW50Ow0KKyAgICB0cC5tX3BDaGFycyA9IG1fcEN1ckxpbmUtPm1fcExpbmVDaGFyczsNCisgICAgdHAubV9wVXNlckRhdGEgPSBtX3BVc2VyRGF0YTsNCisgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cigwKTsNCisgICAgdHAubV9kd0NoYXJTdHlsZXMgPSBwVEMtPm1fZHdDaGFyU3R5bGVzOw0KKyAgICB0cC5tX2lIb3Jpem9udGFsU2NhbGUgPSBwVEMtPm1faUhvcml6b250YWxTY2FsZTsNCisgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KKyAgICBwQ3VyUGllY2VzLT5BZGQodHApOw0KKyAgICB0cG8uaW5kZXggPSAwOw0KKyAgICB0cG8ucG9zID0gMDsNCisgICAgdHBvcy5BZGQodHBvKTsNCisgIH0NCiB9DQotaW50MzJfdCBDRlhfVHh0QnJlYWs6OkNvdW50QnJlYWtDaGFycygpIGNvbnN0DQotew0KLSAgICBDRlhfVHh0TGluZSAqcFR4dExpbmUgPSBHZXRUeHRMaW5lKFRSVUUpOw0KLSAgICByZXR1cm4gcFR4dExpbmUgPT0gTlVMTCA/IDAgOiBwVHh0TGluZS0+Q291bnRDaGFycygpOw0KLX0NCi1pbnQzMl90IENGWF9UeHRCcmVhazo6Q291bnRCcmVha1BpZWNlcygpIGNvbnN0DQotew0KLSAgICBDRlhfVHh0UGllY2VBcnJheSAqcFR4dFBpZWNlcyA9IEdldFR4dFBpZWNlcyhUUlVFKTsNCi0gICAgaWYgKHBUeHRQaWVjZXMgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQordm9pZCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX0FsaWdubWVudChDRlhfVFBPQXJyYXkmIHRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzKSB7DQorICBpbnQzMl90IGlOZXRXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoLCBpR2FwQ2hhcnMgPSAwLCBpQ2hhcldpZHRoOw0KKyAgQ0ZYX1R4dFBpZWNlQXJyYXkqIHBDdXJQaWVjZXMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lUGllY2VzOw0KKyAgaW50MzJfdCBpLCBqLCBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7DQorICBGWF9CT09MIGJGaW5kID0gRkFMU0U7DQorICBGWF9UUE8gdHBvOw0KKyAgQ0ZYX1R4dENoYXIqIHBUQzsNCisgIEZYX0RXT1JEIGR3Q2hhclR5cGU7DQorICBmb3IgKGkgPSBpQ291bnQgLSAxOyBpID4gLTE7IGktLSkgew0KKyAgICB0cG8gPSB0cG9zLkdldEF0KGkpOw0KKyAgICBDRlhfVHh0UGllY2UmIHR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgIGlmICghYkZpbmQpIHsNCisgICAgICBpTmV0V2lkdGggPSB0dHAuR2V0RW5kUG9zKCk7DQogICAgIH0NCi0gICAgcmV0dXJuIHBUeHRQaWVjZXMtPkdldFNpemUoKTsNCi19DQotY29uc3QgQ0ZYX1R4dFBpZWNlKiBDRlhfVHh0QnJlYWs6OkdldEJyZWFrUGllY2UoaW50MzJfdCBpbmRleCkgY29uc3QNCi17DQotICAgIENGWF9UeHRQaWVjZUFycmF5ICpwVHh0UGllY2VzID0gR2V0VHh0UGllY2VzKFRSVUUpOw0KLSAgICBpZiAocFR4dFBpZWNlcyA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgRlhfQk9PTCBiQXJhYmljID0gRlhfSXNPZGQodHRwLm1faUJpZGlMZXZlbCk7DQorICAgIGogPSBiQXJhYmljID8gMCA6IHR0cC5tX2lDaGFycyAtIDE7DQorICAgIHdoaWxlIChqID4gLTEgJiYgaiA8IHR0cC5tX2lDaGFycykgew0KKyAgICAgIHBUQyA9IHR0cC5HZXRDaGFyUHRyKGopOw0KKyAgICAgIGlmIChwVEMtPm1fbkJyZWFrVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSykgew0KKyAgICAgICAgaUdhcENoYXJzKys7DQorICAgICAgfQ0KKyAgICAgIGlmICghYkZpbmQgfHwgIWJBbGxDaGFycykgew0KKyAgICAgICAgZHdDaGFyVHlwZSA9IHBUQy0+R2V0Q2hhclR5cGUoKTsNCisgICAgICAgIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX1NwYWNlIHx8DQorICAgICAgICAgICAgZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9Db250cm9sKSB7DQorICAgICAgICAgIGlmICghYkZpbmQpIHsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICAgICAgaWYgKGJBbGxDaGFycyAmJiBpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgICAgICAgaU5ldFdpZHRoIC09IGlDaGFyV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiRmluZCA9IFRSVUU7DQorICAgICAgICAgIGlmICghYkFsbENoYXJzKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaiArPSBiQXJhYmljID8gMSA6IC0xOw0KICAgICB9DQotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcFR4dFBpZWNlcy0+R2V0U2l6ZSgpKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgaWYgKCFiQWxsQ2hhcnMgJiYgYkZpbmQpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gcFR4dFBpZWNlcy0+R2V0UHRyQXQoaW5kZXgpOw0KLX0NCi12b2lkIENGWF9UeHRCcmVhazo6Q2xlYXJCcmVha1BpZWNlcygpDQotew0KLSAgICBDRlhfVHh0TGluZSAqcFR4dExpbmUgPSBHZXRUeHRMaW5lKFRSVUUpOw0KLSAgICBpZiAocFR4dExpbmUgIT0gTlVMTCkgew0KLSAgICAgICAgcFR4dExpbmUtPlJlbW92ZUFsbChUUlVFKTsNCisgIH0NCisgIGludDMyX3QgaU9mZnNldCA9IG1faUxpbmVXaWR0aCAtIGlOZXRXaWR0aDsNCisgIGludDMyX3QgaUxvd2VyQWxpZ25tZW50ID0gKG1faUN1ckFsaWdubWVudCAmIEZYX1RYVExJTkVBTElHTk1FTlRfTG93ZXJNYXNrKTsNCisgIGludDMyX3QgaUhpZ2hlckFsaWdubWVudCA9IChtX2lDdXJBbGlnbm1lbnQgJiBGWF9UWFRMSU5FQUxJR05NRU5UX0hpZ2hlck1hc2spOw0KKyAgaWYgKGlHYXBDaGFycyA+IDAgJiYgKGlIaWdoZXJBbGlnbm1lbnQgPT0gRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpSGlnaGVyQWxpZ25tZW50ID09IEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzICE9IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKSkpIHsNCisgICAgaW50MzJfdCBpU3RhcnQgPSAtMTsNCisgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgdHBvID0gdHBvcy5HZXRBdChpKTsNCisgICAgICBDRlhfVHh0UGllY2UmIHR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgICAgaWYgKGlTdGFydCA8IC0xKSB7DQorICAgICAgICBpU3RhcnQgPSB0dHAubV9pU3RhcnRQb3M7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHR0cC5tX2lTdGFydFBvcyA9IGlTdGFydDsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBrOw0KKyAgICAgIGZvciAoaiA9IDA7IGogPCB0dHAubV9pQ2hhcnM7IGorKykgew0KKyAgICAgICAgcFRDID0gdHRwLkdldENoYXJQdHIoaik7DQorICAgICAgICBpZiAocFRDLT5tX25CcmVha1R5cGUgIT0gRlhfTEJUX0RJUkVDVF9CUksgfHwgcFRDLT5tX2lDaGFyV2lkdGggPCAwKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgayA9IGlPZmZzZXQgLyBpR2FwQ2hhcnM7DQorICAgICAgICBwVEMtPm1faUNoYXJXaWR0aCArPSBrOw0KKyAgICAgICAgdHRwLm1faVdpZHRoICs9IGs7DQorICAgICAgICBpT2Zmc2V0IC09IGs7DQorICAgICAgICBpR2FwQ2hhcnMtLTsNCisgICAgICAgIGlmIChpR2FwQ2hhcnMgPCAxKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpU3RhcnQgKz0gdHRwLm1faVdpZHRoOw0KICAgICB9DQotICAgIG1faVJlYWR5ID0gMDsNCisgIH0gZWxzZSBpZiAoaUxvd2VyQWxpZ25tZW50ID4gRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0KSB7DQorICAgIGlmIChpTG93ZXJBbGlnbm1lbnQgPT0gRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXIpIHsNCisgICAgICBpT2Zmc2V0IC89IDI7DQorICAgIH0NCisgICAgaWYgKGlPZmZzZXQgPiAwKSB7DQorICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICBDRlhfVHh0UGllY2UmIHR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KGkpOw0KKyAgICAgICAgdHRwLm1faVN0YXJ0UG9zICs9IGlPZmZzZXQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQogfQ0KLXZvaWQgQ0ZYX1R4dEJyZWFrOjpSZXNldCgpDQotew0KLSAgICBtX2R3Q2hhclR5cGUgPSAwOw0KK0ZYX0RXT1JEIENGWF9UeHRCcmVhazo6RW5kQnJlYWsoRlhfRFdPUkQgZHdTdGF0dXMpIHsNCisgIEZYU1lTX2Fzc2VydChkd1N0YXR1cyA+PSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrICYmDQorICAgICAgICAgICAgICAgZHdTdGF0dXMgPD0gRlhfVFhUQlJFQUtfUGFnZUJyZWFrKTsNCisgIENGWF9UeHRQaWVjZUFycmF5KiBwQ3VyUGllY2VzID0gbV9wQ3VyTGluZS0+bV9wTGluZVBpZWNlczsNCisgIGludDMyX3QgaUNvdW50ID0gcEN1clBpZWNlcy0+R2V0U2l6ZSgpOw0KKyAgaWYgKGlDb3VudCA+IDApIHsNCisgICAgQ0ZYX1R4dFBpZWNlKiBwTGFzdFBpZWNlID0gcEN1clBpZWNlcy0+R2V0UHRyQXQoLS1pQ291bnQpOw0KKyAgICBpZiAoZHdTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgcExhc3RQaWVjZS0+bV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGR3U3RhdHVzID0gcExhc3RQaWVjZS0+bV9kd1N0YXR1czsNCisgICAgfQ0KKyAgICByZXR1cm4gZHdTdGF0dXM7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfVHh0TGluZSogcExhc3RMaW5lID0gR2V0VHh0TGluZShUUlVFKTsNCisgICAgaWYgKHBMYXN0TGluZSAhPSBOVUxMKSB7DQorICAgICAgcEN1clBpZWNlcyA9IHBMYXN0TGluZS0+bV9wTGluZVBpZWNlczsNCisgICAgICBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7DQorICAgICAgaWYgKGlDb3VudC0tID4gMCkgew0KKyAgICAgICAgQ0ZYX1R4dFBpZWNlKiBwTGFzdFBpZWNlID0gcEN1clBpZWNlcy0+R2V0UHRyQXQoaUNvdW50KTsNCisgICAgICAgIGlmIChkd1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICAgICAgcExhc3RQaWVjZS0+bV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZHdTdGF0dXMgPSBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGR3U3RhdHVzOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCisgICAgfQ0KKyAgICBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQorICAgIGlmIChpQ291bnQgPCAxKSB7DQorICAgICAgcmV0dXJuIEZYX1RYVEJSRUFLX05vbmU7DQorICAgIH0NCisgICAgaWYgKCFtX2JQYWdpbmF0aW9uKSB7DQorICAgICAgQ0ZYX1R4dENoYXIqIHBUQyA9IG1fcEN1ckxpbmUtPkdldENoYXJQdHIoaUNvdW50IC0gMSk7DQorICAgICAgcFRDLT5tX2R3U3RhdHVzID0gZHdTdGF0dXM7DQorICAgIH0NCisgICAgaWYgKGR3U3RhdHVzIDw9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICByZXR1cm4gZHdTdGF0dXM7DQorICAgIH0NCisgIH0NCisgIG1faVJlYWR5ID0gKG1fcEN1ckxpbmUgPT0gbV9wVHh0TGluZTEpID8gMSA6IDI7DQorICBDRlhfVHh0TGluZSogcE5leHRMaW5lID0NCisgICAgICAobV9wQ3VyTGluZSA9PSBtX3BUeHRMaW5lMSkgPyBtX3BUeHRMaW5lMiA6IG1fcFR4dExpbmUxOw0KKyAgRlhfQk9PTCBiQWxsQ2hhcnMgPSAobV9pQ3VyQWxpZ25tZW50ID4gRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodCk7DQorICBDRlhfVFBPQXJyYXkgdHBvczsNCisgIENGWF9DaGFyKiBwVEM7DQorICBpZiAobV9iQXJhYmljU2hhcGVzKSB7DQorICAgIEVuZEJyZWFrX1VwZGF0ZUFyYWJpY1NoYXBlcygpOw0KKyAgfQ0KKyAgaWYgKEVuZEJyZWFrX1NwbGl0TGluZShwTmV4dExpbmUsIGJBbGxDaGFycywgZHdTdGF0dXMpKSB7DQorICAgIGdvdG8gRW5kQnJlYWtfUmV0Ow0KKyAgfQ0KKyAgRW5kQnJlYWtfQmlkaUxpbmUodHBvcywgZHdTdGF0dXMpOw0KKyAgaWYgKCFtX2JQYWdpbmF0aW9uICYmIG1faUN1ckFsaWdubWVudCA+IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdCkgew0KKyAgICBFbmRCcmVha19BbGlnbm1lbnQodHBvcywgYkFsbENoYXJzLCBkd1N0YXR1cyk7DQorICB9DQorRW5kQnJlYWtfUmV0Og0KKyAgbV9wQ3VyTGluZSA9IHBOZXh0TGluZTsNCisgIHBUQyA9IEdldExhc3RDaGFyKDAsIEZBTFNFKTsNCisgIG1fZHdDaGFyVHlwZSA9IHBUQyA9PSBOVUxMID8gMCA6IHBUQy0+R2V0Q2hhclR5cGUoKTsNCisgIGlmIChkd1N0YXR1cyA9PSBGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhaykgew0KICAgICBtX2lBcmFiaWNDb250ZXh0ID0gbV9pQ3VyQXJhYmljQ29udGV4dCA9IDE7DQogICAgIFJlc2V0QXJhYmljQ29udGV4dCgpOw0KLSAgICBtX3BUeHRMaW5lMS0+UmVtb3ZlQWxsKFRSVUUpOw0KLSAgICBtX3BUeHRMaW5lMi0+UmVtb3ZlQWxsKFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIGR3U3RhdHVzOw0KK30NCitpbnQzMl90IENGWF9UeHRCcmVhazo6R2V0QnJlYWtQb3MoQ0ZYX1R4dENoYXJBcnJheSYgY2EsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlFbmRQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPbmx5QnJrKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBjYS5HZXRTaXplKCkgLSAxOw0KKyAgaWYgKGlMZW5ndGggPCAxKSB7DQorICAgIHJldHVybiBpTGVuZ3RoOw0KKyAgfQ0KKyAgaW50MzJfdCBpQnJlYWsgPSAtMSwgaUJyZWFrUG9zID0gLTEsIGlJbmRpcmVjdCA9IC0xLCBpSW5kaXJlY3RQb3MgPSAtMSwNCisgICAgICAgICAgaUxhc3QgPSAtMSwgaUxhc3RQb3MgPSAtMTsNCisgIGlmIChtX2JTaW5nbGVMaW5lIHx8IGlFbmRQb3MgPD0gbV9pTGluZVdpZHRoKSB7DQorICAgIGlmICghYkFsbENoYXJzKSB7DQorICAgICAgcmV0dXJuIGlMZW5ndGg7DQorICAgIH0NCisgICAgaUJyZWFrID0gaUxlbmd0aDsNCisgICAgaUJyZWFrUG9zID0gaUVuZFBvczsNCisgIH0NCisgIEZYX0JPT0wgYlNwYWNlQnJlYWsgPSAobV9kd1BvbGljaWVzICYgRlhfVFhUQlJFQUtQT0xJQ1lfU3BhY2VCcmVhaykgIT0gMDsNCisgIEZYX0JPT0wgYk51bWJlckJyZWFrID0gKG1fZHdQb2xpY2llcyAmIEZYX1RYVEJSRUFLUE9MSUNZX051bWJlckJyZWFrKSAhPSAwOw0KKyAgRlhfTElORUJSRUFLVFlQRSBlVHlwZTsNCisgIEZYX0RXT1JEIG5Db2RlUHJvcCwgbkN1ciwgbk5leHQ7DQorICBDRlhfQ2hhciogcEN1ciA9IGNhLkdldERhdGFQdHIoaUxlbmd0aC0tKTsNCisgIGlmIChiQWxsQ2hhcnMpIHsNCisgICAgcEN1ci0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047DQorICB9DQorICBuQ29kZVByb3AgPSBwQ3VyLT5tX2R3Q2hhclByb3BzOw0KKyAgbk5leHQgPSBuQ29kZVByb3AgJiAweDAwM0Y7DQorICBpbnQzMl90IGlDaGFyV2lkdGggPSBwQ3VyLT5tX2lDaGFyV2lkdGg7DQorICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgaUVuZFBvcyAtPSBpQ2hhcldpZHRoOw0KKyAgfQ0KKyAgd2hpbGUgKGlMZW5ndGggPj0gMCkgew0KKyAgICBwQ3VyID0gY2EuR2V0RGF0YVB0cihpTGVuZ3RoKTsNCisgICAgbkNvZGVQcm9wID0gcEN1ci0+bV9kd0NoYXJQcm9wczsNCisgICAgbkN1ciA9IG5Db2RlUHJvcCAmIDB4MDAzRjsNCisgICAgaWYgKG5DdXIgPT0gRlhfQ0JQX1NQKSB7DQorICAgICAgaWYgKG5OZXh0ID09IEZYX0NCUF9TUCkgew0KKyAgICAgICAgZVR5cGUgPSBiU3BhY2VCcmVhayA/IEZYX0xCVF9ESVJFQ1RfQlJLIDogRlhfTEJUX1BST0hJQklURURfQlJLOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBlVHlwZSA9ICooKGNvbnN0IEZYX0xJTkVCUkVBS1RZUEUqKWdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGUgKw0KKyAgICAgICAgICAgICAgICAgIChuQ3VyIDw8IDUpICsgbk5leHQpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChiTnVtYmVyQnJlYWsgJiYgbkN1ciA9PSBGWF9DQlBfTlUgJiYgbk5leHQgPT0gRlhfQ0JQX05VKSB7DQorICAgICAgZVR5cGUgPSBGWF9MQlRfRElSRUNUX0JSSzsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAobk5leHQgPT0gRlhfQ0JQX1NQKSB7DQorICAgICAgICBlVHlwZSA9IEZYX0xCVF9QUk9ISUJJVEVEX0JSSzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZVR5cGUgPSAqKChjb25zdCBGWF9MSU5FQlJFQUtUWVBFKilnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlICsNCisgICAgICAgICAgICAgICAgICAobkN1ciA8PCA1KSArIG5OZXh0KTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGJBbGxDaGFycykgew0KKyAgICAgIHBDdXItPm1fbkJyZWFrVHlwZSA9ICh1aW50OF90KWVUeXBlOw0KKyAgICB9DQorICAgIGlmICghYk9ubHlCcmspIHsNCisgICAgICBpZiAobV9iU2luZ2xlTGluZSB8fCBpRW5kUG9zIDw9IG1faUxpbmVXaWR0aCB8fA0KKyAgICAgICAgICAobkN1ciA9PSBGWF9DQlBfU1AgJiYgIWJTcGFjZUJyZWFrKSkgew0KKyAgICAgICAgaWYgKGVUeXBlID09IEZYX0xCVF9ESVJFQ1RfQlJLICYmIGlCcmVhayA8IDApIHsNCisgICAgICAgICAgaUJyZWFrID0gaUxlbmd0aDsNCisgICAgICAgICAgaUJyZWFrUG9zID0gaUVuZFBvczsNCisgICAgICAgICAgaWYgKCFiQWxsQ2hhcnMpIHsNCisgICAgICAgICAgICByZXR1cm4gaUxlbmd0aDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGWF9MQlRfSU5ESVJFQ1RfQlJLICYmIGlJbmRpcmVjdCA8IDApIHsNCisgICAgICAgICAgaUluZGlyZWN0ID0gaUxlbmd0aDsNCisgICAgICAgICAgaUluZGlyZWN0UG9zID0gaUVuZFBvczsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpTGFzdCA8IDApIHsNCisgICAgICAgICAgaUxhc3QgPSBpTGVuZ3RoOw0KKyAgICAgICAgICBpTGFzdFBvcyA9IGlFbmRQb3M7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlDaGFyV2lkdGggPSBwQ3VyLT5tX2lDaGFyV2lkdGg7DQorICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICBpRW5kUG9zIC09IGlDaGFyV2lkdGg7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG5OZXh0ID0gbkNvZGVQcm9wICYgMHgwMDNGOw0KKyAgICBpTGVuZ3RoLS07DQorICB9DQorICBpZiAoYk9ubHlCcmspIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAoaUJyZWFrID4gLTEpIHsNCisgICAgaUVuZFBvcyA9IGlCcmVha1BvczsNCisgICAgcmV0dXJuIGlCcmVhazsNCisgIH0NCisgIGlmIChpSW5kaXJlY3QgPiAtMSkgew0KKyAgICBpRW5kUG9zID0gaUluZGlyZWN0UG9zOw0KKyAgICByZXR1cm4gaUluZGlyZWN0Ow0KKyAgfQ0KKyAgaWYgKGlMYXN0ID4gLTEpIHsNCisgICAgaUVuZFBvcyA9IGlMYXN0UG9zOw0KKyAgICByZXR1cm4gaUxhc3Q7DQorICB9DQorICByZXR1cm4gMDsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNwbGl0VGV4dExpbmUoQ0ZYX1R4dExpbmUqIHBDdXJMaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9UeHRMaW5lKiBwTmV4dExpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWxsQ2hhcnMpIHsNCisgIEZYU1lTX2Fzc2VydChwQ3VyTGluZSAhPSBOVUxMICYmIHBOZXh0TGluZSAhPSBOVUxMKTsNCisgIGludDMyX3QgaUNvdW50ID0gcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgIGlmIChpQ291bnQgPCAyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUVuZFBvcyA9IHBDdXJMaW5lLT5tX2lXaWR0aDsNCisgIENGWF9UeHRDaGFyQXJyYXkmIGN1ckNoYXJzID0gKnBDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQorICBpbnQzMl90IGlDaGFyUG9zID0gR2V0QnJlYWtQb3MoY3VyQ2hhcnMsIGlFbmRQb3MsIGJBbGxDaGFycywgRkFMU0UpOw0KKyAgaWYgKGlDaGFyUG9zIDwgMCkgew0KKyAgICBpQ2hhclBvcyA9IDA7DQorICB9DQorICBpQ2hhclBvcysrOw0KKyAgaWYgKGlDaGFyUG9zID49IGlDb3VudCkgew0KKyAgICBwTmV4dExpbmUtPlJlbW92ZUFsbChUUlVFKTsNCisgICAgQ0ZYX0NoYXIqIHBUQyA9IGN1ckNoYXJzLkdldERhdGFQdHIoaUNoYXJQb3MgLSAxKTsNCisgICAgcFRDLT5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1R4dENoYXJBcnJheSYgbmV4dENoYXJzID0gKnBOZXh0TGluZS0+bV9wTGluZUNoYXJzOw0KKyAgaW50IGN1cl9zaXplID0gY3VyQ2hhcnMuR2V0U2l6ZSgpOw0KKyAgbmV4dENoYXJzLlNldFNpemUoY3VyX3NpemUgLSBpQ2hhclBvcyk7DQorICBGWFNZU19tZW1jcHkobmV4dENoYXJzLkdldERhdGEoKSwgY3VyQ2hhcnMuR2V0RGF0YVB0cihpQ2hhclBvcyksDQorICAgICAgICAgICAgICAgKGN1cl9zaXplIC0gaUNoYXJQb3MpICogc2l6ZW9mKENGWF9UeHRDaGFyKSk7DQorICBpQ291bnQgLT0gaUNoYXJQb3M7DQorICBjdXJfc2l6ZSA9IGN1ckNoYXJzLkdldFNpemUoKTsNCisgIGN1ckNoYXJzLlJlbW92ZUF0KGN1cl9zaXplIC0gaUNvdW50LCBpQ291bnQpOw0KKyAgcEN1ckxpbmUtPm1faVdpZHRoID0gaUVuZFBvczsNCisgIENGWF9UeHRDaGFyKiBwVEMgPSBjdXJDaGFycy5HZXREYXRhUHRyKGlDaGFyUG9zIC0gMSk7DQorICBwVEMtPm1fbkJyZWFrVHlwZSA9IEZYX0xCVF9VTktOT1dOOw0KKyAgaUNvdW50ID0gbmV4dENoYXJzLkdldFNpemUoKTsNCisgIGludDMyX3QgaUNoYXJXaWR0aCwgaVdpZHRoID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIHBUQyA9IG5leHRDaGFycy5HZXREYXRhUHRyKGkpOw0KKyAgICBpZiAocFRDLT5HZXRDaGFyVHlwZSgpID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsNCisgICAgICBwQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMtLTsNCisgICAgICBwTmV4dExpbmUtPm1faUFyYWJpY0NoYXJzKys7DQorICAgIH0NCisgICAgaUNoYXJXaWR0aCA9IHBUQy0+bV9pQ2hhcldpZHRoOw0KKyAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgICBpV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgfQ0KKyAgICBpZiAobV9iUGFnaW5hdGlvbikgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHBUQy0+bV9kd1N0YXR1cyA9IDA7DQorICB9DQorICBwTmV4dExpbmUtPm1faVdpZHRoID0gaVdpZHRoOw0KK30NCitpbnQzMl90IENGWF9UeHRCcmVhazo6Q291bnRCcmVha0NoYXJzKCkgY29uc3Qgew0KKyAgQ0ZYX1R4dExpbmUqIHBUeHRMaW5lID0gR2V0VHh0TGluZShUUlVFKTsNCisgIHJldHVybiBwVHh0TGluZSA9PSBOVUxMID8gMCA6IHBUeHRMaW5lLT5Db3VudENoYXJzKCk7DQorfQ0KK2ludDMyX3QgQ0ZYX1R4dEJyZWFrOjpDb3VudEJyZWFrUGllY2VzKCkgY29uc3Qgew0KKyAgQ0ZYX1R4dFBpZWNlQXJyYXkqIHBUeHRQaWVjZXMgPSBHZXRUeHRQaWVjZXMoVFJVRSk7DQorICBpZiAocFR4dFBpZWNlcyA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcmV0dXJuIHBUeHRQaWVjZXMtPkdldFNpemUoKTsNCit9DQorY29uc3QgQ0ZYX1R4dFBpZWNlKiBDRlhfVHh0QnJlYWs6OkdldEJyZWFrUGllY2UoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgQ0ZYX1R4dFBpZWNlQXJyYXkqIHBUeHRQaWVjZXMgPSBHZXRUeHRQaWVjZXMoVFJVRSk7DQorICBpZiAocFR4dFBpZWNlcyA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBwVHh0UGllY2VzLT5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcFR4dFBpZWNlcy0+R2V0UHRyQXQoaW5kZXgpOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6Q2xlYXJCcmVha1BpZWNlcygpIHsNCisgIENGWF9UeHRMaW5lKiBwVHh0TGluZSA9IEdldFR4dExpbmUoVFJVRSk7DQorICBpZiAocFR4dExpbmUgIT0gTlVMTCkgew0KKyAgICBwVHh0TGluZS0+UmVtb3ZlQWxsKFRSVUUpOw0KKyAgfQ0KKyAgbV9pUmVhZHkgPSAwOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6UmVzZXQoKSB7DQorICBtX2R3Q2hhclR5cGUgPSAwOw0KKyAgbV9pQXJhYmljQ29udGV4dCA9IG1faUN1ckFyYWJpY0NvbnRleHQgPSAxOw0KKyAgUmVzZXRBcmFiaWNDb250ZXh0KCk7DQorICBtX3BUeHRMaW5lMS0+UmVtb3ZlQWxsKFRSVUUpOw0KKyAgbV9wVHh0TGluZTItPlJlbW92ZUFsbChUUlVFKTsNCiB9DQogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0ZPUk1DSEFSIHsNCi0gICAgRlhfV09SRAkJd2NoOw0KLSAgICBGWF9XT1JECQl3Rm9ybTsNCi0gICAgaW50MzJfdAlpV2lkdGg7DQotfSBGWF9GT1JNQ0hBUiwgKiBGWF9MUEZPUk1DSEFSOw0KLXR5cGVkZWYgRlhfRk9STUNIQVIgY29uc3QgKiBGWF9MUENGT1JNQ0hBUjsNCi1pbnQzMl90IENGWF9UeHRCcmVhazo6R2V0RGlzcGxheVBvcyhGWF9MUENUWFRSVU4gcFR4dFJ1biwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9CT09MIGJDaGFyQ29kZSAsIENGWF9XaWRlU3RyaW5nICpwV1NGb3JtcyAsIEZYX0FkanVzdENoYXJEaXNwbGF5UG9zIHBBZGp1c3RQb3MgKSBjb25zdA0KLXsNCi0gICAgaWYgKHBUeHRSdW4gPT0gTlVMTCB8fCBwVHh0UnVuLT5pTGVuZ3RoIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQorICBGWF9XT1JEIHdjaDsNCisgIEZYX1dPUkQgd0Zvcm07DQorICBpbnQzMl90IGlXaWR0aDsNCit9IEZYX0ZPUk1DSEFSLCAqRlhfTFBGT1JNQ0hBUjsNCit0eXBlZGVmIEZYX0ZPUk1DSEFSIGNvbnN0KiBGWF9MUENGT1JNQ0hBUjsNCitpbnQzMl90IENGWF9UeHRCcmVhazo6R2V0RGlzcGxheVBvcyhGWF9MUENUWFRSVU4gcFR4dFJ1biwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBXU0Zvcm1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FkanVzdENoYXJEaXNwbGF5UG9zIHBBZGp1c3RQb3MpIGNvbnN0IHsNCisgIGlmIChwVHh0UnVuID09IE5VTEwgfHwgcFR4dFJ1bi0+aUxlbmd0aCA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBJRlhfVHh0QWNjZXNzKiBwQWNjZXNzID0gcFR4dFJ1bi0+cEFjY2VzczsNCisgIHZvaWQqIHBJZGVudGl0eSA9IHBUeHRSdW4tPnBJZGVudGl0eTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gcFR4dFJ1bi0+cFN0cjsNCisgIGludDMyX3QqIHBXaWR0aHMgPSBwVHh0UnVuLT5wV2lkdGhzOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcFR4dFJ1bi0+aUxlbmd0aCAtIDE7DQorICBJRlhfRm9udCogcEZvbnQgPSBwVHh0UnVuLT5wRm9udDsNCisgIEZYX0RXT1JEIGR3U3R5bGVzID0gcFR4dFJ1bi0+ZHdTdHlsZXM7DQorICBDRlhfUmVjdEYgcnRUZXh0KCpwVHh0UnVuLT5wUmVjdCk7DQorICBGWF9CT09MIGJSVExQaWVjZSA9DQorICAgICAgKHBUeHRSdW4tPmR3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9PZGRCaWRpTGV2ZWwpICE9IDA7DQorICBGWF9CT09MIGJBcmFiaWNOdW1iZXIgPQ0KKyAgICAgIChwVHh0UnVuLT5kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljTnVtYmVyKSAhPSAwOw0KKyAgRlhfQk9PTCBiQXJhYmljQ29tbWEgPQ0KKyAgICAgIChwVHh0UnVuLT5kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29tbWEpICE9IDA7DQorICBGWF9GTE9BVCBmRm9udFNpemUgPSBwVHh0UnVuLT5mRm9udFNpemU7DQorICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsNCisgIGludDMyX3QgaUFzY2VudCA9IHBGb250LT5HZXRBc2NlbnQoKTsNCisgIGludDMyX3QgaURlc2NlbnQgPSBwRm9udC0+R2V0RGVzY2VudCgpOw0KKyAgaW50MzJfdCBpTWF4SGVpZ2h0ID0gaUFzY2VudCAtIGlEZXNjZW50Ow0KKyAgRlhfRkxPQVQgZkZvbnRIZWlnaHQgPSBmRm9udFNpemU7DQorICBGWF9GTE9BVCBmQXNjZW50ID0gZkZvbnRIZWlnaHQgKiAoRlhfRkxPQVQpaUFzY2VudCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0Ow0KKyAgRlhfRkxPQVQgZkRlc2NlbnQgPSBmRm9udEhlaWdodCAqIChGWF9GTE9BVClpRGVzY2VudCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0Ow0KKyAgRlhfQk9PTCBiVmVydGljYWxEb2MgPSAoZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dCkgIT0gMDsNCisgIEZYX0JPT0wgYlZlcnRpY2FsQ2hhciA9IChkd1N0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMpICE9IDA7DQorICBpbnQzMl90IGlSb3RhdGlvbiA9IEdldExpbmVSb3RhdGlvbihkd1N0eWxlcykgKyBwVHh0UnVuLT5pQ2hhclJvdGF0aW9uOw0KKyAgaW50MzJfdCBpQ2hhclJvdGF0aW9uOw0KKyAgRlhfV0NIQVIgd2NoLCB3UHJldiA9IDB4RkVGRiwgd05leHQsIHdGb3JtLCB3TGFzdCA9IDB4RkVGRjsNCisgIGludDMyX3QgaVdpZHRoLCBpQ2hhcldpZHRoLCBpQ2hhckhlaWdodDsNCisgIEZYX0ZMT0FUIGZYLCBmWSwgZkNoYXJXaWR0aCwgZkNoYXJIZWlnaHQ7DQorICBpbnQzMl90IGlIb3JTY2FsZSA9IHBUeHRSdW4tPmlIb3Jpem9udGFsU2NhbGU7DQorICBpbnQzMl90IGlWZXJTY2FsZSA9IHBUeHRSdW4tPmlWZXJ0aWNhbFNjYWxlOw0KKyAgRlhfQk9PTCBiU2tpcFNwYWNlID0gcFR4dFJ1bi0+YlNraXBTcGFjZTsNCisgIEZYX0JPT0wgYkVtcHR5Q2hhciwgYlNoYWRkYSA9IEZBTFNFLCBiTGFtID0gRkFMU0U7DQorICBGWF9EV09SRCBkd1Byb3BzLCBkd0NoYXJUeXBlOw0KKyAgRlhfRk9STUNIQVIgZm9ybUNoYXJzWzNdOw0KKyAgRlhfRkxPQVQgZllCYXNlOw0KKyAgZlggPSBydFRleHQubGVmdDsNCisgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgZlggKz0gKHJ0VGV4dC53aWR0aCAtIGZGb250U2l6ZSkgLyAyLjBmOw0KKyAgICBmWUJhc2UgPSBiUlRMUGllY2UgPyBydFRleHQuYm90dG9tKCkgOiBydFRleHQudG9wOw0KKyAgICBmWSA9IGZZQmFzZTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChiUlRMUGllY2UpIHsNCisgICAgICBmWCA9IHJ0VGV4dC5yaWdodCgpOw0KICAgICB9DQotICAgIElGWF9UeHRBY2Nlc3MgKnBBY2Nlc3MgPSBwVHh0UnVuLT5wQWNjZXNzOw0KLSAgICB2b2lkKiBwSWRlbnRpdHkgPSBwVHh0UnVuLT5wSWRlbnRpdHk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gcFR4dFJ1bi0+cFN0cjsNCi0gICAgaW50MzJfdCAqcFdpZHRocyA9IHBUeHRSdW4tPnBXaWR0aHM7DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBUeHRSdW4tPmlMZW5ndGggLSAxOw0KLSAgICBJRlhfRm9udCAqcEZvbnQgPSBwVHh0UnVuLT5wRm9udDsNCi0gICAgRlhfRFdPUkQgZHdTdHlsZXMgPSBwVHh0UnVuLT5kd1N0eWxlczsNCi0gICAgQ0ZYX1JlY3RGIHJ0VGV4dCgqcFR4dFJ1bi0+cFJlY3QpOw0KLSAgICBGWF9CT09MIGJSVExQaWVjZSA9IChwVHh0UnVuLT5kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsKSAhPSAwOw0KLSAgICBGWF9CT09MIGJBcmFiaWNOdW1iZXIgPSAocFR4dFJ1bi0+ZHdDaGFyU3R5bGVzICYgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY051bWJlcikgIT0gMDsNCi0gICAgRlhfQk9PTCBiQXJhYmljQ29tbWEgPSAocFR4dFJ1bi0+ZHdDaGFyU3R5bGVzICYgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0NvbW1hKSAhPSAwOw0KLSAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBwVHh0UnVuLT5mRm9udFNpemU7DQotICAgIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KLSAgICBpbnQzMl90IGlBc2NlbnQgPSBwRm9udC0+R2V0QXNjZW50KCk7DQotICAgIGludDMyX3QgaURlc2NlbnQgPSBwRm9udC0+R2V0RGVzY2VudCgpOw0KLSAgICBpbnQzMl90IGlNYXhIZWlnaHQgPSBpQXNjZW50IC0gaURlc2NlbnQ7DQotICAgIEZYX0ZMT0FUIGZGb250SGVpZ2h0ID0gZkZvbnRTaXplOw0KLSAgICBGWF9GTE9BVCBmQXNjZW50ID0gZkZvbnRIZWlnaHQgKiAoRlhfRkxPQVQpaUFzY2VudCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0Ow0KLSAgICBGWF9GTE9BVCBmRGVzY2VudCA9IGZGb250SGVpZ2h0ICogKEZYX0ZMT0FUKWlEZXNjZW50IC8gKEZYX0ZMT0FUKWlNYXhIZWlnaHQ7DQotICAgIEZYX0JPT0wgYlZlcnRpY2FsRG9jID0gKGR3U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQpICE9IDA7DQotICAgIEZYX0JPT0wgYlZlcnRpY2FsQ2hhciA9IChkd1N0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMpICE9IDA7DQotICAgIGludDMyX3QgaVJvdGF0aW9uID0gR2V0TGluZVJvdGF0aW9uKGR3U3R5bGVzKSArIHBUeHRSdW4tPmlDaGFyUm90YXRpb247DQotICAgIGludDMyX3QgaUNoYXJSb3RhdGlvbjsNCi0gICAgRlhfV0NIQVIgd2NoLCB3UHJldiA9IDB4RkVGRiwgd05leHQsIHdGb3JtLCB3TGFzdCA9IDB4RkVGRjsNCi0gICAgaW50MzJfdCBpV2lkdGgsIGlDaGFyV2lkdGgsIGlDaGFySGVpZ2h0Ow0KLSAgICBGWF9GTE9BVCBmWCwgZlksIGZDaGFyV2lkdGgsIGZDaGFySGVpZ2h0Ow0KLSAgICBpbnQzMl90IGlIb3JTY2FsZSA9IHBUeHRSdW4tPmlIb3Jpem9udGFsU2NhbGU7DQotICAgIGludDMyX3QgaVZlclNjYWxlID0gcFR4dFJ1bi0+aVZlcnRpY2FsU2NhbGU7DQotICAgIEZYX0JPT0wgYlNraXBTcGFjZSA9IHBUeHRSdW4tPmJTa2lwU3BhY2U7DQotICAgIEZYX0JPT0wgYkVtcHR5Q2hhciwgYlNoYWRkYSA9IEZBTFNFLCBiTGFtID0gRkFMU0U7DQotICAgIEZYX0RXT1JEIGR3UHJvcHMsIGR3Q2hhclR5cGU7DQotICAgIEZYX0ZPUk1DSEFSIGZvcm1DaGFyc1szXTsNCi0gICAgRlhfRkxPQVQgZllCYXNlOw0KLSAgICBmWCA9IHJ0VGV4dC5sZWZ0Ow0KLSAgICBpZiAoYlZlcnRpY2FsRG9jKSB7DQotICAgICAgICBmWCArPSAocnRUZXh0LndpZHRoIC0gZkZvbnRTaXplKSAvIDIuMGY7DQotICAgICAgICBmWUJhc2UgPSBiUlRMUGllY2UgPyBydFRleHQuYm90dG9tKCkgOiBydFRleHQudG9wOw0KLSAgICAgICAgZlkgPSBmWUJhc2U7DQorICAgIGZZQmFzZSA9IHJ0VGV4dC50b3AgKyAocnRUZXh0LmhlaWdodCAtIGZGb250U2l6ZSkgLyAyLjBmOw0KKyAgICBmWSA9IGZZQmFzZSArIGZBc2NlbnQ7DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IDAsIGlOZXh0LCBpRm9ybXM7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPD0gaUxlbmd0aDsgaSsrKSB7DQorICAgIGlmIChwQWNjZXNzICE9IE5VTEwpIHsNCisgICAgICB3Y2ggPSBwQWNjZXNzLT5HZXRDaGFyKHBJZGVudGl0eSwgaSk7DQorICAgICAgaVdpZHRoID0gcEFjY2Vzcy0+R2V0V2lkdGgocElkZW50aXR5LCBpKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChiUlRMUGllY2UpIHsNCi0gICAgICAgICAgICBmWCA9IHJ0VGV4dC5yaWdodCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZllCYXNlID0gcnRUZXh0LnRvcCArIChydFRleHQuaGVpZ2h0IC0gZkZvbnRTaXplKSAvIDIuMGY7DQotICAgICAgICBmWSA9IGZZQmFzZSArIGZBc2NlbnQ7DQorICAgICAgd2NoID0gKnBTdHIrKzsNCisgICAgICBpV2lkdGggPSAqcFdpZHRocysrOw0KICAgICB9DQotICAgIGludDMyX3QgaUNvdW50ID0gMCwgaU5leHQsIGlGb3JtczsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IGlMZW5ndGg7IGkgKyspIHsNCisgICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdjaCk7DQorICAgIGR3Q2hhclR5cGUgPSAoZHdQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spOw0KKyAgICBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmIGlXaWR0aCA9PSAwKSB7DQorICAgICAgd1ByZXYgPSAweEZFRkY7DQorICAgICAgd0xhc3QgPSB3Y2g7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGR3Q2hhclR5cGUgPj0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgew0KKyAgICAgIGlmIChpIDwgaUxlbmd0aCkgew0KICAgICAgICAgaWYgKHBBY2Nlc3MgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIHdjaCA9IHBBY2Nlc3MtPkdldENoYXIocElkZW50aXR5LCBpKTsNCi0gICAgICAgICAgICBpV2lkdGggPSBwQWNjZXNzLT5HZXRXaWR0aChwSWRlbnRpdHksIGkpOw0KKyAgICAgICAgICBpTmV4dCA9IGkgKyAxOw0KKyAgICAgICAgICB3aGlsZSAoaU5leHQgPD0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgIHdOZXh0ID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGlOZXh0KTsNCisgICAgICAgICAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod05leHQpOw0KKyAgICAgICAgICAgIGlmICgoZHdQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaU5leHQrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaU5leHQgPiBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgd05leHQgPSAweEZFRkY7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgd2NoID0gKnBTdHIgKys7DQotICAgICAgICAgICAgaVdpZHRoID0gKnBXaWR0aHMgKys7DQorICAgICAgICAgIGludDMyX3QgaiA9IC0xOw0KKyAgICAgICAgICBkbyB7DQorICAgICAgICAgICAgaisrOw0KKyAgICAgICAgICAgIGlmIChpICsgaiA+PSBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd05leHQgPSBwU3RyW2pdOw0KKyAgICAgICAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3TmV4dCk7DQorICAgICAgICAgIH0gd2hpbGUgKChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSykgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pOw0KKyAgICAgICAgICBpZiAoaSArIGogPj0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgIHdOZXh0ID0gMHhGRUZGOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod2NoKTsNCi0gICAgICAgIGR3Q2hhclR5cGUgPSAoZHdQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spOw0KLSAgICAgICAgaWYgKGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZiAmJiBpV2lkdGggPT0gMCkgew0KLSAgICAgICAgICAgIHdQcmV2ID0gMHhGRUZGOw0KLSAgICAgICAgICAgIHdMYXN0ID0gd2NoOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGR3Q2hhclR5cGUgPj0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgew0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB3TmV4dCA9IDB4RkVGRjsNCisgICAgICB9DQorICAgICAgd0Zvcm0gPSBtX3BBcmFiaWNDaGFyLT5HZXRGb3JtQ2hhcih3Y2gsIHdQcmV2LCB3TmV4dCk7DQorICAgICAgYkxhbSA9ICh3UHJldiA9PSAweDA2NDQgJiYgd2NoID09IDB4MDY0NCAmJiB3TmV4dCA9PSAweDA2NDcpOw0KKyAgICB9IGVsc2UgaWYgKGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICB3Rm9ybSA9IHdjaDsNCisgICAgICBpZiAod2NoID49IDB4MDY0QyAmJiB3Y2ggPD0gMHgwNjUxKSB7DQorICAgICAgICBpZiAoYlNoYWRkYSkgew0KKyAgICAgICAgICB3Rm9ybSA9IDB4RkVGRjsNCisgICAgICAgICAgYlNoYWRkYSA9IEZBTFNFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd05leHQgPSAweEZFRkY7DQorICAgICAgICAgIGlmIChwQWNjZXNzICE9IE5VTEwpIHsNCisgICAgICAgICAgICBpTmV4dCA9IGkgKyAxOw0KKyAgICAgICAgICAgIGlmIChpTmV4dCA8PSBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICB3TmV4dCA9IHBBY2Nlc3MtPkdldENoYXIocElkZW50aXR5LCBpTmV4dCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgIGlmIChpIDwgaUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICBpZiAocEFjY2VzcyAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBpTmV4dCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlOZXh0IDw9IGlMZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3TmV4dCA9IHBBY2Nlc3MtPkdldENoYXIocElkZW50aXR5LCBpTmV4dCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdOZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGR3UHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaU5leHQgKys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAoaU5leHQgPiBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd05leHQgPSAweEZFRkY7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGogPSAtMTsNCi0gICAgICAgICAgICAgICAgICAgIGRvIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBqICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgaiA+PSBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB3TmV4dCA9IHBTdHJbal07DQotICAgICAgICAgICAgICAgICAgICAgICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdOZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSykgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyBqID49IGlMZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3TmV4dCA9IDB4RkVGRjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHdOZXh0ID0gMHhGRUZGOw0KKyAgICAgICAgICAgICAgd05leHQgPSAqcFN0cjsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgd0Zvcm0gPSBtX3BBcmFiaWNDaGFyLT5HZXRGb3JtQ2hhcih3Y2gsIHdQcmV2LCB3TmV4dCk7DQotICAgICAgICAgICAgYkxhbSA9ICh3UHJldiA9PSAweDA2NDQgJiYgd2NoID09IDB4MDY0NCAmJiB3TmV4dCA9PSAweDA2NDcpOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQotICAgICAgICAgICAgd0Zvcm0gPSB3Y2g7DQotICAgICAgICAgICAgaWYgKHdjaCA+PSAweDA2NEMgJiYgd2NoIDw9IDB4MDY1MSkgew0KLSAgICAgICAgICAgICAgICBpZiAoYlNoYWRkYSkgew0KLSAgICAgICAgICAgICAgICAgICAgd0Zvcm0gPSAweEZFRkY7DQotICAgICAgICAgICAgICAgICAgICBiU2hhZGRhID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB3TmV4dCA9IDB4RkVGRjsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQWNjZXNzICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpTmV4dCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpTmV4dCA8PSBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGlOZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgaUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3TmV4dCA9ICpwU3RyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmICh3Y2ggPT0gMHgwNjUxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdOZXh0ID49IDB4MDY0QyAmJiB3TmV4dCA8PSAweDA2NTApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd0Zvcm0gPSBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUod05leHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2hhZGRhID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3TmV4dCA9PSAweDA2NTEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd0Zvcm0gPSBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUod2NoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNoYWRkYSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgYlNoYWRkYSA9IEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICh3Y2ggPT0gMHgwNjUxKSB7DQorICAgICAgICAgICAgaWYgKHdOZXh0ID49IDB4MDY0QyAmJiB3TmV4dCA8PSAweDA2NTApIHsNCisgICAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdOZXh0KTsNCisgICAgICAgICAgICAgIGJTaGFkZGEgPSBUUlVFOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9OdW1lcmljKSB7DQotICAgICAgICAgICAgd0Zvcm0gPSB3Y2g7DQotICAgICAgICAgICAgaWYgKGJBcmFiaWNOdW1iZXIpIHsNCi0gICAgICAgICAgICAgICAgd0Zvcm0gKz0gMHgwNjMwOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmICh3TmV4dCA9PSAweDA2NTEpIHsNCisgICAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdjaCk7DQorICAgICAgICAgICAgICBiU2hhZGRhID0gVFJVRTsNCiAgICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKHdjaCA9PSBMJy4nKSB7DQotICAgICAgICAgICAgd0Zvcm0gPSB3Y2g7DQotICAgICAgICAgICAgaWYgKGJBcmFiaWNOdW1iZXIpIHsNCi0gICAgICAgICAgICAgICAgd05leHQgPSAweEZFRkY7DQotICAgICAgICAgICAgICAgIGlmIChwQWNjZXNzICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlOZXh0ID0gaSArIDE7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaU5leHQgPD0gaUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGlOZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgaUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdOZXh0ID0gKnBTdHI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHdOZXh0ID49IEwnMCcgJiYgd05leHQgPD0gTCc5Jykgew0KLSAgICAgICAgICAgICAgICAgICAgd0Zvcm0gPSAweDA2NkI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKHdjaCA9PSBMJywnKSB7DQotICAgICAgICAgICAgd0Zvcm0gPSB3Y2g7DQotICAgICAgICAgICAgaWYgKGJBcmFiaWNDb21tYSkgew0KLSAgICAgICAgICAgICAgICB3Rm9ybSA9IDB4MDYwQzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGJSVExQaWVjZSB8fCBiVmVydGljYWxDaGFyKSB7DQotICAgICAgICAgICAgd0Zvcm0gPSBGWF9HZXRNaXJyb3JDaGFyKHdjaCwgZHdQcm9wcywgYlJUTFBpZWNlLCBiVmVydGljYWxDaGFyKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgd0Zvcm0gPSB3Y2g7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCi0gICAgICAgIGlmIChkd0NoYXJUeXBlICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQotICAgICAgICAgICAgYlNoYWRkYSA9IEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGR3Q2hhclR5cGUgPCBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSB7DQotICAgICAgICAgICAgYkxhbSA9IEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdGb3JtKTsNCi0gICAgICAgIGlDaGFyUm90YXRpb24gPSBpUm90YXRpb247DQotICAgICAgICBpZiAoYlZlcnRpY2FsQ2hhciAmJiAoZHdQcm9wcyAmIDB4ODAwMCkgIT0gMCkgew0KLSAgICAgICAgICAgIGlDaGFyUm90YXRpb24gKys7DQotICAgICAgICB9DQotICAgICAgICBpQ2hhclJvdGF0aW9uICU9IDQ7DQotICAgICAgICBiRW1wdHlDaGFyID0gKGR3Q2hhclR5cGUgPj0gRlhfQ0hBUlRZUEVfVGFiICYmIGR3Q2hhclR5cGUgPD0gRlhfQ0hBUlRZUEVfQ29udHJvbCk7DQotICAgICAgICBpZiAod0Zvcm0gPT0gMHhGRUZGKSB7DQotICAgICAgICAgICAgYkVtcHR5Q2hhciA9IFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBpRm9ybXMgPSBiTGFtID8gMyA6IDE7DQotICAgICAgICBpQ291bnQgKz0gKGJFbXB0eUNoYXIgJiYgYlNraXBTcGFjZSkgPyAwIDogaUZvcm1zOw0KLSAgICAgICAgaWYgKHBDaGFyUG9zID09IE5VTEwpIHsNCi0gICAgICAgICAgICBpZiAoaVdpZHRoID4gMCkgew0KLSAgICAgICAgICAgICAgICB3UHJldiA9IHdjaDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd0xhc3QgPSB3Y2g7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpQ2hhcldpZHRoID0gaVdpZHRoOw0KLSAgICAgICAgaWYgKGlDaGFyV2lkdGggPCAwKSB7DQotICAgICAgICAgICAgaUNoYXJXaWR0aCA9IC1pQ2hhcldpZHRoOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaUNoYXJXaWR0aCAvPSBpRm9udFNpemU7DQotICAgICAgICBmb3JtQ2hhcnNbMF0ud2NoID0gd2NoOw0KLSAgICAgICAgZm9ybUNoYXJzWzBdLndGb3JtID0gd0Zvcm07DQotICAgICAgICBmb3JtQ2hhcnNbMF0uaVdpZHRoID0gaUNoYXJXaWR0aDsNCi0gICAgICAgIGlmIChiTGFtKSB7DQotICAgICAgICAgICAgZm9ybUNoYXJzWzFdLndGb3JtID0gMHgwNjUxOw0KLSAgICAgICAgICAgIGlDaGFyV2lkdGggPSAwOw0KLSAgICAgICAgICAgIHBGb250LT5HZXRDaGFyV2lkdGgoMHgwNjUxLCBpQ2hhcldpZHRoLCBGQUxTRSk7DQotICAgICAgICAgICAgZm9ybUNoYXJzWzFdLmlXaWR0aCA9IGlDaGFyV2lkdGg7DQotICAgICAgICAgICAgZm9ybUNoYXJzWzJdLndGb3JtID0gMHgwNjcwOw0KLSAgICAgICAgICAgIGlDaGFyV2lkdGggPSAwOw0KLSAgICAgICAgICAgIHBGb250LT5HZXRDaGFyV2lkdGgoMHgwNjcwLCBpQ2hhcldpZHRoLCBGQUxTRSk7DQotICAgICAgICAgICAgZm9ybUNoYXJzWzJdLmlXaWR0aCA9IGlDaGFyV2lkdGg7DQotICAgICAgICB9DQotICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpRm9ybXM7IGogKyspIHsNCi0gICAgICAgICAgICB3Rm9ybSA9IChGWF9XQ0hBUilmb3JtQ2hhcnNbal0ud0Zvcm07DQotICAgICAgICAgICAgaUNoYXJXaWR0aCA9IGZvcm1DaGFyc1tqXS5pV2lkdGg7DQotICAgICAgICAgICAgaWYgKGogPiAwKSB7DQotICAgICAgICAgICAgICAgIGR3Q2hhclR5cGUgPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbjsNCi0gICAgICAgICAgICAgICAgd2NoID0gd0Zvcm07DQotICAgICAgICAgICAgICAgIHdMYXN0ID0gKEZYX1dDSEFSKWZvcm1DaGFyc1tqIC0gMV0ud0Zvcm07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhciB8fCAoYkVtcHR5Q2hhciAmJiAhYlNraXBTcGFjZSkpIHsNCi0gICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fR2x5cGhJbmRleCA9IGJDaGFyQ29kZSA/IHdjaCA6IHBGb250LT5HZXRHbHlwaEluZGV4KHdGb3JtLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0V4dEdJRCA9IHBDaGFyUG9zLT5tX0dseXBoSW5kZXg7DQotICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0ZvbnRDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICBpZiAocFdTRm9ybXMpIHsNCi0gICAgICAgICAgICAgICAgICAgICpwV1NGb3JtcyArPSB3Rm9ybTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoYlZlcnRpY2FsRG9jKSB7DQotICAgICAgICAgICAgICAgIGlDaGFySGVpZ2h0ID0gaUNoYXJXaWR0aDsNCi0gICAgICAgICAgICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaUNoYXJIZWlnaHQgPSAxMDAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmQ2hhcldpZHRoID0gZkZvbnRTaXplICogaUNoYXJXaWR0aCAvIDEwMDAuMGY7DQotICAgICAgICAgICAgZkNoYXJIZWlnaHQgPSBmRm9udFNpemUgKiBpQ2hhckhlaWdodCAvIDEwMDAuMGY7DQotICAgICAgICAgICAgaWYgKGJSVExQaWVjZSAmJiBkd0NoYXJUeXBlICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQotICAgICAgICAgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZZIC09IGZDaGFySGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZlggLT0gZkNoYXJXaWR0aDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIWJFbXB0eUNoYXIgfHwgKGJFbXB0eUNoYXIgJiYgIWJTa2lwU3BhY2UpKSB7DQotICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggPSBmWDsNCi0gICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSA9IGZZOw0KLSAgICAgICAgICAgICAgICBpZiAoKGR3U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQpICE9IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZvcm1XaWR0aCA9IGlDaGFyV2lkdGg7DQotICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpRm9ybVdpZHRoLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmT2Zmc2V0ID0gZkZvbnRTaXplICogKGlDaGFyV2lkdGggLSBpRm9ybVdpZHRoKSAvIDIwMDAuMGY7DQotICAgICAgICAgICAgICAgICAgICBpZiAoYlZlcnRpY2FsRG9jKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmT2Zmc2V0Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZPZmZzZXQ7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9SZWN0IHJ0QkJveDsNCi0gICAgICAgICAgICAgICAgICAgIHJ0QkJveC5SZXNldCgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGb250LT5HZXRDaGFyQkJveCh3Rm9ybSwgcnRCQm94LCBGQUxTRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZID0gZllCYXNlICsgZkZvbnRTaXplIC0gZkZvbnRTaXplICogKEZYX0ZMT0FUKXJ0QkJveC5oZWlnaHQgLyAoRlhfRkxPQVQpaU1heEhlaWdodDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmICh3Rm9ybSA9PSB3Y2ggJiYgd0xhc3QgIT0gMHhGRUZGKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdMYXN0UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3TGFzdCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkd0xhc3RQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spID09IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0IHJ0QkJveDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRCQm94LlJlc2V0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRm9udC0+R2V0Q2hhckJCb3god0xhc3QsIHJ0QkJveCwgRkFMU0UpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZIC09IGZGb250U2l6ZSAqIHJ0QkJveC5oZWlnaHQgLyBpTWF4SGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENGWF9Qb2ludEYgcHRPZmZzZXQ7DQotICAgICAgICAgICAgICAgIHB0T2Zmc2V0LlJlc2V0KCk7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkanVzdGVkID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIGlmIChwQWRqdXN0UG9zKSB7DQotICAgICAgICAgICAgICAgICAgICBiQWRqdXN0ZWQgPSBwQWRqdXN0UG9zKHdGb3JtLCBiQ2hhckNvZGUsIHBGb250LCBmRm9udFNpemUsIGJWZXJ0aWNhbENoYXIsIHB0T2Zmc2V0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoIWJBZGp1c3RlZCAmJiBiVmVydGljYWxDaGFyICYmIChkd1Byb3BzICYgMHgwMDAxMDAwMCkgIT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3QgcnRCQm94Ow0KLSAgICAgICAgICAgICAgICAgICAgcnRCQm94LlJlc2V0KCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAocEZvbnQtPkdldENoYXJCQm94KHdGb3JtLCBydEJCb3gsIEZBTFNFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0T2Zmc2V0LnggPSBmRm9udFNpemUgKiAoODUwIC0gcnRCQm94LnJpZ2h0KCkpIC8gaU1heEhlaWdodDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwdE9mZnNldC55ID0gZkZvbnRTaXplICogKGlBc2NlbnQgLSBydEJCb3gudG9wIC0gMTUwKSAvIGlNYXhIZWlnaHQ7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBwdE9mZnNldC54Ow0KLSAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZIC09IHB0T2Zmc2V0Lnk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghYlJUTFBpZWNlICYmIGR3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KLSAgICAgICAgICAgICAgICAgICAgZlkgKz0gZkNoYXJIZWlnaHQ7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBmWCArPSBmQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghYkVtcHR5Q2hhciB8fCAoYkVtcHR5Q2hhciAmJiAhYlNraXBTcGFjZSkpIHsNCi0gICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fYkdseXBoQWRqdXN0ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlDaGFyUm90YXRpb24gPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgKz0gZkFzY2VudDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA9PSAxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAtMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAtMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggLT0gZkRlc2NlbnQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IC0xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkNoYXJXaWR0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZBc2NlbnQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBmQXNjZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlDaGFyUm90YXRpb24gPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IC0xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IC0xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCAtPSBmRGVzY2VudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZIC09IGZBc2NlbnQgKyBmRGVzY2VudDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA9PSAyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gLTE7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBmQ2hhcldpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgLT0gZkFzY2VudDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZBc2NlbnQ7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGlIb3JTY2FsZSAhPSAxMDAgfHwgaVZlclNjYWxlICE9IDEwMCkgew0KLSAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdICogaUhvclNjYWxlIC8gMTAwLjBmOw0KLSAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdICogaUhvclNjYWxlIC8gMTAwLjBmOw0KLSAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdICogaVZlclNjYWxlIC8gMTAwLjBmOw0KLSAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdICogaVZlclNjYWxlIC8gMTAwLjBmOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBDaGFyUG9zICsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpV2lkdGggPiAwKSB7DQotICAgICAgICAgICAgd1ByZXYgPSAoRlhfV0NIQVIpZm9ybUNoYXJzWzBdLndjaDsNCi0gICAgICAgIH0NCi0gICAgICAgIHdMYXN0ID0gd2NoOw0KLSAgICB9DQotICAgIHJldHVybiBpQ291bnQ7DQotfQ0KLWludDMyX3QgQ0ZYX1R4dEJyZWFrOjpHZXRDaGFyUmVjdHMoRlhfTFBDVFhUUlVOIHBUeHRSdW4sIENGWF9SZWN0RkFycmF5ICZydEFycmF5LCBGWF9CT09MIGJDaGFyQkJveCApIGNvbnN0DQotew0KLSAgICBpZiAocFR4dFJ1biA9PSBOVUxMIHx8IHBUeHRSdW4tPmlMZW5ndGggPCAxKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBJRlhfVHh0QWNjZXNzICpwQWNjZXNzID0gcFR4dFJ1bi0+cEFjY2VzczsNCi0gICAgdm9pZCogcElkZW50aXR5ID0gcFR4dFJ1bi0+cElkZW50aXR5Ow0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHBUeHRSdW4tPnBTdHI7DQotICAgIGludDMyX3QgKnBXaWR0aHMgPSBwVHh0UnVuLT5wV2lkdGhzOw0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwVHh0UnVuLT5pTGVuZ3RoOw0KLSAgICBDRlhfUmVjdEYgcmVjdCgqcFR4dFJ1bi0+cFJlY3QpOw0KLSAgICBGWF9CT09MIGJSVExQaWVjZSA9IChwVHh0UnVuLT5kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsKSAhPSAwOw0KLSAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBwVHh0UnVuLT5mRm9udFNpemU7DQotICAgIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KLSAgICBGWF9GTE9BVCBmU2NhbGUgPSBmRm9udFNpemUgLyAxMDAwLjBmOw0KLSAgICBJRlhfRm9udCAqcEZvbnQgPSBwVHh0UnVuLT5wRm9udDsNCi0gICAgaWYgKHBGb250ID09IE5VTEwpIHsNCi0gICAgICAgIGJDaGFyQkJveCA9IEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9SZWN0IGJib3g7DQotICAgIGJib3guU2V0KDAsIDAsIDAsIDApOw0KLSAgICBpZiAoYkNoYXJCQm94KSB7DQotICAgICAgICBiQ2hhckJCb3ggPSBwRm9udC0+R2V0QkJveChiYm94KTsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmTGVmdCA9IEZYX01BWCgwLCBiYm94LmxlZnQgKiBmU2NhbGUpOw0KLSAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gRlhTWVNfZmFicyhiYm94LmhlaWdodCAqIGZTY2FsZSk7DQotICAgIHJ0QXJyYXkuUmVtb3ZlQWxsKCk7DQotICAgIHJ0QXJyYXkuU2V0U2l6ZShpTGVuZ3RoKTsNCi0gICAgRlhfQk9PTCBiVmVydGljYWwgPSAocFR4dFJ1bi0+ZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dCkgIT0gMDsNCi0gICAgRlhfQk9PTCBiU2luZ2xlTGluZSA9IChwVHh0UnVuLT5kd1N0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1NpbmdsZUxpbmUpICE9IDA7DQotICAgIEZYX0JPT0wgYkNvbWJUZXh0ID0gKHBUeHRSdW4tPmR3U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQpICE9IDA7DQotICAgIEZYX1dDSEFSIHdjaCwgd0xpbmVCcmVha0NoYXIgPSBwVHh0UnVuLT53TGluZUJyZWFrQ2hhcjsNCi0gICAgaW50MzJfdCBpQ2hhclNpemU7DQotICAgIEZYX0ZMT0FUIGZDaGFyU2l6ZSwgZlN0YXJ0Ow0KLSAgICBpZiAoYlZlcnRpY2FsKSB7DQotICAgICAgICBmU3RhcnQgPSBiUlRMUGllY2UgPyByZWN0LmJvdHRvbSgpIDogcmVjdC50b3A7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBmU3RhcnQgPSBiUlRMUGllY2UgPyByZWN0LnJpZ2h0KCkgOiByZWN0LmxlZnQ7DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbmd0aDsgaSArKykgew0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBiU2hhZGRhID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfTnVtZXJpYykgew0KKyAgICAgIHdGb3JtID0gd2NoOw0KKyAgICAgIGlmIChiQXJhYmljTnVtYmVyKSB7DQorICAgICAgICB3Rm9ybSArPSAweDA2MzA7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHdjaCA9PSBMJy4nKSB7DQorICAgICAgd0Zvcm0gPSB3Y2g7DQorICAgICAgaWYgKGJBcmFiaWNOdW1iZXIpIHsNCisgICAgICAgIHdOZXh0ID0gMHhGRUZGOw0KICAgICAgICAgaWYgKHBBY2Nlc3MgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIHdjaCA9IHBBY2Nlc3MtPkdldENoYXIocElkZW50aXR5LCBpKTsNCi0gICAgICAgICAgICBpQ2hhclNpemUgPSBwQWNjZXNzLT5HZXRXaWR0aChwSWRlbnRpdHksIGkpOw0KKyAgICAgICAgICBpTmV4dCA9IGkgKyAxOw0KKyAgICAgICAgICBpZiAoaU5leHQgPD0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgIHdOZXh0ID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGlOZXh0KTsNCisgICAgICAgICAgfQ0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB3Y2ggPSAqcFN0ciArKzsNCi0gICAgICAgICAgICBpQ2hhclNpemUgPSAqcFdpZHRocyArKzsNCisgICAgICAgICAgaWYgKGkgPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgd05leHQgPSAqcFN0cjsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgZkNoYXJTaXplID0gKEZYX0ZMT0FUKWlDaGFyU2l6ZSAvIDIwMDAwLjBmOw0KLSAgICAgICAgRlhfQk9PTCBiUmV0ID0gKCFiU2luZ2xlTGluZSAmJiBGWF9Jc0N0cmxDb2RlKHdjaCkpOw0KLSAgICAgICAgaWYgKCEod2NoID09IEwnXHYnIHx8IHdjaCA9PSBMJ1xmJyB8fCB3Y2ggPT0gMHgyMDI4IHx8IHdjaCA9PSAweDIwMjkgfHwgKHdMaW5lQnJlYWtDaGFyICE9IDB4RkVGRiAmJiB3Y2ggPT0gd0xpbmVCcmVha0NoYXIpKSkgew0KLSAgICAgICAgICAgIGJSZXQgPSBGQUxTRTsNCisgICAgICAgIGlmICh3TmV4dCA+PSBMJzAnICYmIHdOZXh0IDw9IEwnOScpIHsNCisgICAgICAgICAgd0Zvcm0gPSAweDA2NkI7DQogICAgICAgICB9DQotICAgICAgICBpZiAoYlJldCkgew0KLSAgICAgICAgICAgIGlDaGFyU2l6ZSA9IGlGb250U2l6ZSAqIDUwMDsNCi0gICAgICAgICAgICBmQ2hhclNpemUgPSBmRm9udFNpemUgLyAyLjBmOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KLSAgICAgICAgICAgIHJlY3QudG9wID0gZlN0YXJ0Ow0KLSAgICAgICAgICAgIGlmIChiUlRMUGllY2UpIHsNCi0gICAgICAgICAgICAgICAgcmVjdC50b3AgLT0gZkNoYXJTaXplOw0KLSAgICAgICAgICAgICAgICBmU3RhcnQgLT0gZkNoYXJTaXplOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGZTdGFydCArPSBmQ2hhclNpemU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlY3QuaGVpZ2h0ID0gZkNoYXJTaXplOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZWN0LmxlZnQgPSBmU3RhcnQ7DQotICAgICAgICAgICAgaWYgKGJSVExQaWVjZSkgew0KLSAgICAgICAgICAgICAgICByZWN0LmxlZnQgLT0gZkNoYXJTaXplOw0KLSAgICAgICAgICAgICAgICBmU3RhcnQgLT0gZkNoYXJTaXplOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGZTdGFydCArPSBmQ2hhclNpemU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlY3Qud2lkdGggPSBmQ2hhclNpemU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYkNoYXJCQm94ICYmICFiUmV0KSB7DQotICAgICAgICAgICAgaW50MzJfdCBpQ2hhcldpZHRoID0gMTAwMDsNCi0gICAgICAgICAgICBwRm9udC0+R2V0Q2hhcldpZHRoKHdjaCwgaUNoYXJXaWR0aCk7DQotICAgICAgICAgICAgRlhfRkxPQVQgZlJUTGVmdCA9IDAsIGZDaGFyV2lkdGggPSAwOw0KLSAgICAgICAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KLSAgICAgICAgICAgICAgICBmQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIGZTY2FsZTsNCi0gICAgICAgICAgICAgICAgZlJUTGVmdCA9IGZMZWZ0Ow0KLSAgICAgICAgICAgICAgICBpZiAoYkNvbWJUZXh0KSB7DQotICAgICAgICAgICAgICAgICAgICBmUlRMZWZ0ID0gKHJlY3Qud2lkdGggLSBmQ2hhcldpZHRoKSAvIDIuMGY7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0QkJveEY7DQotICAgICAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KLSAgICAgICAgICAgICAgICBydEJCb3hGLnRvcCA9IHJlY3QubGVmdCArIGZSVExlZnQ7DQotICAgICAgICAgICAgICAgIHJ0QkJveEYubGVmdCA9IHJlY3QudG9wICsgKHJlY3QuaGVpZ2h0IC0gZkhlaWdodCkgLyAyLjBmOw0KLSAgICAgICAgICAgICAgICBydEJCb3hGLmhlaWdodCA9IGZDaGFyV2lkdGg7DQotICAgICAgICAgICAgICAgIHJ0QkJveEYud2lkdGggPSBmSGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICBydEJCb3hGLmxlZnQgPSBGWF9NQVgocnRCQm94Ri5sZWZ0LCAwKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBydEJCb3hGLmxlZnQgPSByZWN0LmxlZnQgKyBmUlRMZWZ0Ow0KLSAgICAgICAgICAgICAgICBydEJCb3hGLnRvcCA9IHJlY3QudG9wICsgKHJlY3QuaGVpZ2h0IC0gZkhlaWdodCkgLyAyLjBmOw0KLSAgICAgICAgICAgICAgICBydEJCb3hGLndpZHRoID0gZkNoYXJXaWR0aDsNCi0gICAgICAgICAgICAgICAgcnRCQm94Ri5oZWlnaHQgPSBmSGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICBydEJCb3hGLnRvcCA9IEZYX01BWChydEJCb3hGLnRvcCwgMCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJ0QXJyYXkuU2V0QXQoaSwgcnRCQm94Rik7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBydEFycmF5LlNldEF0KGksIHJlY3QpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICh3Y2ggPT0gTCcsJykgew0KKyAgICAgIHdGb3JtID0gd2NoOw0KKyAgICAgIGlmIChiQXJhYmljQ29tbWEpIHsNCisgICAgICAgIHdGb3JtID0gMHgwNjBDOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChiUlRMUGllY2UgfHwgYlZlcnRpY2FsQ2hhcikgew0KKyAgICAgIHdGb3JtID0gRlhfR2V0TWlycm9yQ2hhcih3Y2gsIGR3UHJvcHMsIGJSVExQaWVjZSwgYlZlcnRpY2FsQ2hhcik7DQorICAgIH0gZWxzZSB7DQorICAgICAgd0Zvcm0gPSB3Y2g7DQogICAgIH0NCi0gICAgcmV0dXJuIGlMZW5ndGg7DQorICAgIGlmIChkd0NoYXJUeXBlICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQorICAgICAgYlNoYWRkYSA9IEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChkd0NoYXJUeXBlIDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgew0KKyAgICAgIGJMYW0gPSBGQUxTRTsNCisgICAgfQ0KKyAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod0Zvcm0pOw0KKyAgICBpQ2hhclJvdGF0aW9uID0gaVJvdGF0aW9uOw0KKyAgICBpZiAoYlZlcnRpY2FsQ2hhciAmJiAoZHdQcm9wcyAmIDB4ODAwMCkgIT0gMCkgew0KKyAgICAgIGlDaGFyUm90YXRpb24rKzsNCisgICAgfQ0KKyAgICBpQ2hhclJvdGF0aW9uICU9IDQ7DQorICAgIGJFbXB0eUNoYXIgPQ0KKyAgICAgICAgKGR3Q2hhclR5cGUgPj0gRlhfQ0hBUlRZUEVfVGFiICYmIGR3Q2hhclR5cGUgPD0gRlhfQ0hBUlRZUEVfQ29udHJvbCk7DQorICAgIGlmICh3Rm9ybSA9PSAweEZFRkYpIHsNCisgICAgICBiRW1wdHlDaGFyID0gVFJVRTsNCisgICAgfQ0KKyAgICBpRm9ybXMgPSBiTGFtID8gMyA6IDE7DQorICAgIGlDb3VudCArPSAoYkVtcHR5Q2hhciAmJiBiU2tpcFNwYWNlKSA/IDAgOiBpRm9ybXM7DQorICAgIGlmIChwQ2hhclBvcyA9PSBOVUxMKSB7DQorICAgICAgaWYgKGlXaWR0aCA+IDApIHsNCisgICAgICAgIHdQcmV2ID0gd2NoOw0KKyAgICAgIH0NCisgICAgICB3TGFzdCA9IHdjaDsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpQ2hhcldpZHRoID0gaVdpZHRoOw0KKyAgICBpZiAoaUNoYXJXaWR0aCA8IDApIHsNCisgICAgICBpQ2hhcldpZHRoID0gLWlDaGFyV2lkdGg7DQorICAgIH0NCisgICAgaUNoYXJXaWR0aCAvPSBpRm9udFNpemU7DQorICAgIGZvcm1DaGFyc1swXS53Y2ggPSB3Y2g7DQorICAgIGZvcm1DaGFyc1swXS53Rm9ybSA9IHdGb3JtOw0KKyAgICBmb3JtQ2hhcnNbMF0uaVdpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgaWYgKGJMYW0pIHsNCisgICAgICBmb3JtQ2hhcnNbMV0ud0Zvcm0gPSAweDA2NTE7DQorICAgICAgaUNoYXJXaWR0aCA9IDA7DQorICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCgweDA2NTEsIGlDaGFyV2lkdGgsIEZBTFNFKTsNCisgICAgICBmb3JtQ2hhcnNbMV0uaVdpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICBmb3JtQ2hhcnNbMl0ud0Zvcm0gPSAweDA2NzA7DQorICAgICAgaUNoYXJXaWR0aCA9IDA7DQorICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCgweDA2NzAsIGlDaGFyV2lkdGgsIEZBTFNFKTsNCisgICAgICBmb3JtQ2hhcnNbMl0uaVdpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgfQ0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpRm9ybXM7IGorKykgew0KKyAgICAgIHdGb3JtID0gKEZYX1dDSEFSKWZvcm1DaGFyc1tqXS53Rm9ybTsNCisgICAgICBpQ2hhcldpZHRoID0gZm9ybUNoYXJzW2pdLmlXaWR0aDsNCisgICAgICBpZiAoaiA+IDApIHsNCisgICAgICAgIGR3Q2hhclR5cGUgPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbjsNCisgICAgICAgIHdjaCA9IHdGb3JtOw0KKyAgICAgICAgd0xhc3QgPSAoRlhfV0NIQVIpZm9ybUNoYXJzW2ogLSAxXS53Rm9ybTsNCisgICAgICB9DQorICAgICAgaWYgKCFiRW1wdHlDaGFyIHx8IChiRW1wdHlDaGFyICYmICFiU2tpcFNwYWNlKSkgew0KKyAgICAgICAgcENoYXJQb3MtPm1fR2x5cGhJbmRleCA9DQorICAgICAgICAgICAgYkNoYXJDb2RlID8gd2NoIDogcEZvbnQtPkdldEdseXBoSW5kZXgod0Zvcm0sIEZBTFNFKTsNCisgICAgICAgIHBDaGFyUG9zLT5tX0V4dEdJRCA9IHBDaGFyUG9zLT5tX0dseXBoSW5kZXg7DQorICAgICAgICBwQ2hhclBvcy0+bV9Gb250Q2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICAgIGlmIChwV1NGb3Jtcykgew0KKyAgICAgICAgICAqcFdTRm9ybXMgKz0gd0Zvcm07DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgIGlDaGFySGVpZ2h0ID0gaUNoYXJXaWR0aDsNCisgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpQ2hhckhlaWdodCA9IDEwMDA7DQorICAgICAgfQ0KKyAgICAgIGZDaGFyV2lkdGggPSBmRm9udFNpemUgKiBpQ2hhcldpZHRoIC8gMTAwMC4wZjsNCisgICAgICBmQ2hhckhlaWdodCA9IGZGb250U2l6ZSAqIGlDaGFySGVpZ2h0IC8gMTAwMC4wZjsNCisgICAgICBpZiAoYlJUTFBpZWNlICYmIGR3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgICAgZlkgLT0gZkNoYXJIZWlnaHQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBmWCAtPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoIWJFbXB0eUNoYXIgfHwgKGJFbXB0eUNoYXIgJiYgIWJTa2lwU3BhY2UpKSB7DQorICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YID0gZlg7DQorICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZID0gZlk7DQorICAgICAgICBpZiAoKGR3U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQpICE9IDApIHsNCisgICAgICAgICAgaW50MzJfdCBpRm9ybVdpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUZvcm1XaWR0aCwgRkFMU0UpOw0KKyAgICAgICAgICBGWF9GTE9BVCBmT2Zmc2V0ID0gZkZvbnRTaXplICogKGlDaGFyV2lkdGggLSBpRm9ybVdpZHRoKSAvIDIwMDAuMGY7DQorICAgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZPZmZzZXQ7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBmT2Zmc2V0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KKyAgICAgICAgICBDRlhfUmVjdCBydEJCb3g7DQorICAgICAgICAgIHJ0QkJveC5SZXNldCgpOw0KKyAgICAgICAgICBpZiAocEZvbnQtPkdldENoYXJCQm94KHdGb3JtLCBydEJCb3gsIEZBTFNFKSkgew0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgPQ0KKyAgICAgICAgICAgICAgICBmWUJhc2UgKyBmRm9udFNpemUgLQ0KKyAgICAgICAgICAgICAgICBmRm9udFNpemUgKiAoRlhfRkxPQVQpcnRCQm94LmhlaWdodCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICh3Rm9ybSA9PSB3Y2ggJiYgd0xhc3QgIT0gMHhGRUZGKSB7DQorICAgICAgICAgICAgRlhfRFdPUkQgZHdMYXN0UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3TGFzdCk7DQorICAgICAgICAgICAgaWYgKChkd0xhc3RQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spID09DQorICAgICAgICAgICAgICAgIEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQorICAgICAgICAgICAgICBDRlhfUmVjdCBydEJCb3g7DQorICAgICAgICAgICAgICBydEJCb3guUmVzZXQoKTsNCisgICAgICAgICAgICAgIGlmIChwRm9udC0+R2V0Q2hhckJCb3god0xhc3QsIHJ0QkJveCwgRkFMU0UpKSB7DQorICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgLT0gZkZvbnRTaXplICogcnRCQm94LmhlaWdodCAvIGlNYXhIZWlnaHQ7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBDRlhfUG9pbnRGIHB0T2Zmc2V0Ow0KKyAgICAgICAgcHRPZmZzZXQuUmVzZXQoKTsNCisgICAgICAgIEZYX0JPT0wgYkFkanVzdGVkID0gRkFMU0U7DQorICAgICAgICBpZiAocEFkanVzdFBvcykgew0KKyAgICAgICAgICBiQWRqdXN0ZWQgPSBwQWRqdXN0UG9zKHdGb3JtLCBiQ2hhckNvZGUsIHBGb250LCBmRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZlcnRpY2FsQ2hhciwgcHRPZmZzZXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFiQWRqdXN0ZWQgJiYgYlZlcnRpY2FsQ2hhciAmJiAoZHdQcm9wcyAmIDB4MDAwMTAwMDApICE9IDApIHsNCisgICAgICAgICAgQ0ZYX1JlY3QgcnRCQm94Ow0KKyAgICAgICAgICBydEJCb3guUmVzZXQoKTsNCisgICAgICAgICAgaWYgKHBGb250LT5HZXRDaGFyQkJveCh3Rm9ybSwgcnRCQm94LCBGQUxTRSkpIHsNCisgICAgICAgICAgICBwdE9mZnNldC54ID0gZkZvbnRTaXplICogKDg1MCAtIHJ0QkJveC5yaWdodCgpKSAvIGlNYXhIZWlnaHQ7DQorICAgICAgICAgICAgcHRPZmZzZXQueSA9IGZGb250U2l6ZSAqIChpQXNjZW50IC0gcnRCQm94LnRvcCAtIDE1MCkgLyBpTWF4SGVpZ2h0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IHB0T2Zmc2V0Lng7DQorICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZIC09IHB0T2Zmc2V0Lnk7DQorICAgICAgfQ0KKyAgICAgIGlmICghYlJUTFBpZWNlICYmIGR3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgICAgZlkgKz0gZkNoYXJIZWlnaHQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBmWCArPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoIWJFbXB0eUNoYXIgfHwgKGJFbXB0eUNoYXIgJiYgIWJTa2lwU3BhY2UpKSB7DQorICAgICAgICBwQ2hhclBvcy0+bV9iR2x5cGhBZGp1c3QgPSBUUlVFOw0KKyAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICAgICAgICBpZiAoaUNoYXJSb3RhdGlvbiA9PSAwKSB7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gLTE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmQXNjZW50Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMSkgew0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gLTE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gLTE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YIC09IGZEZXNjZW50Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMikgew0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IC0xOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkNoYXJXaWR0aDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZBc2NlbnQ7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAxOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZBc2NlbnQ7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChpQ2hhclJvdGF0aW9uID09IDApIHsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAtMTsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAwOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMTsNCisgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDEpIHsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAwOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IC0xOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IC0xOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCAtPSBmRGVzY2VudDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZIC09IGZBc2NlbnQgKyBmRGVzY2VudDsNCisgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDIpIHsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAxOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAtMTsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZDaGFyV2lkdGg7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSAtPSBmQXNjZW50Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMTsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAxOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBmQXNjZW50Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUhvclNjYWxlICE9IDEwMCB8fCBpVmVyU2NhbGUgIT0gMTAwKSB7DQorICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gKiBpSG9yU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gKiBpSG9yU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gKiBpVmVyU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gKiBpVmVyU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICB9DQorICAgICAgICBwQ2hhclBvcysrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaVdpZHRoID4gMCkgew0KKyAgICAgIHdQcmV2ID0gKEZYX1dDSEFSKWZvcm1DaGFyc1swXS53Y2g7DQorICAgIH0NCisgICAgd0xhc3QgPSB3Y2g7DQorICB9DQorICByZXR1cm4gaUNvdW50Ow0KK30NCitpbnQzMl90IENGWF9UeHRCcmVhazo6R2V0Q2hhclJlY3RzKEZYX0xQQ1RYVFJVTiBwVHh0UnVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIHJ0QXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQkJveCkgY29uc3Qgew0KKyAgaWYgKHBUeHRSdW4gPT0gTlVMTCB8fCBwVHh0UnVuLT5pTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIElGWF9UeHRBY2Nlc3MqIHBBY2Nlc3MgPSBwVHh0UnVuLT5wQWNjZXNzOw0KKyAgdm9pZCogcElkZW50aXR5ID0gcFR4dFJ1bi0+cElkZW50aXR5Ow0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSBwVHh0UnVuLT5wU3RyOw0KKyAgaW50MzJfdCogcFdpZHRocyA9IHBUeHRSdW4tPnBXaWR0aHM7DQorICBpbnQzMl90IGlMZW5ndGggPSBwVHh0UnVuLT5pTGVuZ3RoOw0KKyAgQ0ZYX1JlY3RGIHJlY3QoKnBUeHRSdW4tPnBSZWN0KTsNCisgIEZYX0JPT0wgYlJUTFBpZWNlID0NCisgICAgICAocFR4dFJ1bi0+ZHdDaGFyU3R5bGVzICYgRlhfVFhUQ0hBUlNUWUxFX09kZEJpZGlMZXZlbCkgIT0gMDsNCisgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IHBUeHRSdW4tPmZGb250U2l6ZTsNCisgIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KKyAgRlhfRkxPQVQgZlNjYWxlID0gZkZvbnRTaXplIC8gMTAwMC4wZjsNCisgIElGWF9Gb250KiBwRm9udCA9IHBUeHRSdW4tPnBGb250Ow0KKyAgaWYgKHBGb250ID09IE5VTEwpIHsNCisgICAgYkNoYXJCQm94ID0gRkFMU0U7DQorICB9DQorICBDRlhfUmVjdCBiYm94Ow0KKyAgYmJveC5TZXQoMCwgMCwgMCwgMCk7DQorICBpZiAoYkNoYXJCQm94KSB7DQorICAgIGJDaGFyQkJveCA9IHBGb250LT5HZXRCQm94KGJib3gpOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkxlZnQgPSBGWF9NQVgoMCwgYmJveC5sZWZ0ICogZlNjYWxlKTsNCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBGWFNZU19mYWJzKGJib3guaGVpZ2h0ICogZlNjYWxlKTsNCisgIHJ0QXJyYXkuUmVtb3ZlQWxsKCk7DQorICBydEFycmF5LlNldFNpemUoaUxlbmd0aCk7DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9DQorICAgICAgKHBUeHRSdW4tPmR3U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQpICE9IDA7DQorICBGWF9CT09MIGJTaW5nbGVMaW5lID0gKHBUeHRSdW4tPmR3U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfU2luZ2xlTGluZSkgIT0gMDsNCisgIEZYX0JPT0wgYkNvbWJUZXh0ID0gKHBUeHRSdW4tPmR3U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQpICE9IDA7DQorICBGWF9XQ0hBUiB3Y2gsIHdMaW5lQnJlYWtDaGFyID0gcFR4dFJ1bi0+d0xpbmVCcmVha0NoYXI7DQorICBpbnQzMl90IGlDaGFyU2l6ZTsNCisgIEZYX0ZMT0FUIGZDaGFyU2l6ZSwgZlN0YXJ0Ow0KKyAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICBmU3RhcnQgPSBiUlRMUGllY2UgPyByZWN0LmJvdHRvbSgpIDogcmVjdC50b3A7DQorICB9IGVsc2Ugew0KKyAgICBmU3RhcnQgPSBiUlRMUGllY2UgPyByZWN0LnJpZ2h0KCkgOiByZWN0LmxlZnQ7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgaWYgKHBBY2Nlc3MgIT0gTlVMTCkgew0KKyAgICAgIHdjaCA9IHBBY2Nlc3MtPkdldENoYXIocElkZW50aXR5LCBpKTsNCisgICAgICBpQ2hhclNpemUgPSBwQWNjZXNzLT5HZXRXaWR0aChwSWRlbnRpdHksIGkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdjaCA9ICpwU3RyKys7DQorICAgICAgaUNoYXJTaXplID0gKnBXaWR0aHMrKzsNCisgICAgfQ0KKyAgICBmQ2hhclNpemUgPSAoRlhfRkxPQVQpaUNoYXJTaXplIC8gMjAwMDAuMGY7DQorICAgIEZYX0JPT0wgYlJldCA9ICghYlNpbmdsZUxpbmUgJiYgRlhfSXNDdHJsQ29kZSh3Y2gpKTsNCisgICAgaWYgKCEod2NoID09IEwnXHYnIHx8IHdjaCA9PSBMJ1xmJyB8fCB3Y2ggPT0gMHgyMDI4IHx8IHdjaCA9PSAweDIwMjkgfHwNCisgICAgICAgICAgKHdMaW5lQnJlYWtDaGFyICE9IDB4RkVGRiAmJiB3Y2ggPT0gd0xpbmVCcmVha0NoYXIpKSkgew0KKyAgICAgIGJSZXQgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoYlJldCkgew0KKyAgICAgIGlDaGFyU2l6ZSA9IGlGb250U2l6ZSAqIDUwMDsNCisgICAgICBmQ2hhclNpemUgPSBmRm9udFNpemUgLyAyLjBmOw0KKyAgICB9DQorICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICByZWN0LnRvcCA9IGZTdGFydDsNCisgICAgICBpZiAoYlJUTFBpZWNlKSB7DQorICAgICAgICByZWN0LnRvcCAtPSBmQ2hhclNpemU7DQorICAgICAgICBmU3RhcnQgLT0gZkNoYXJTaXplOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBmU3RhcnQgKz0gZkNoYXJTaXplOw0KKyAgICAgIH0NCisgICAgICByZWN0LmhlaWdodCA9IGZDaGFyU2l6ZTsNCisgICAgfSBlbHNlIHsNCisgICAgICByZWN0LmxlZnQgPSBmU3RhcnQ7DQorICAgICAgaWYgKGJSVExQaWVjZSkgew0KKyAgICAgICAgcmVjdC5sZWZ0IC09IGZDaGFyU2l6ZTsNCisgICAgICAgIGZTdGFydCAtPSBmQ2hhclNpemU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGZTdGFydCArPSBmQ2hhclNpemU7DQorICAgICAgfQ0KKyAgICAgIHJlY3Qud2lkdGggPSBmQ2hhclNpemU7DQorICAgIH0NCisgICAgaWYgKGJDaGFyQkJveCAmJiAhYlJldCkgew0KKyAgICAgIGludDMyX3QgaUNoYXJXaWR0aCA9IDEwMDA7DQorICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCh3Y2gsIGlDaGFyV2lkdGgpOw0KKyAgICAgIEZYX0ZMT0FUIGZSVExlZnQgPSAwLCBmQ2hhcldpZHRoID0gMDsNCisgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgICAgIGZDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogZlNjYWxlOw0KKyAgICAgICAgZlJUTGVmdCA9IGZMZWZ0Ow0KKyAgICAgICAgaWYgKGJDb21iVGV4dCkgew0KKyAgICAgICAgICBmUlRMZWZ0ID0gKHJlY3Qud2lkdGggLSBmQ2hhcldpZHRoKSAvIDIuMGY7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIENGWF9SZWN0RiBydEJCb3hGOw0KKyAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgIHJ0QkJveEYudG9wID0gcmVjdC5sZWZ0ICsgZlJUTGVmdDsNCisgICAgICAgIHJ0QkJveEYubGVmdCA9IHJlY3QudG9wICsgKHJlY3QuaGVpZ2h0IC0gZkhlaWdodCkgLyAyLjBmOw0KKyAgICAgICAgcnRCQm94Ri5oZWlnaHQgPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgcnRCQm94Ri53aWR0aCA9IGZIZWlnaHQ7DQorICAgICAgICBydEJCb3hGLmxlZnQgPSBGWF9NQVgocnRCQm94Ri5sZWZ0LCAwKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcnRCQm94Ri5sZWZ0ID0gcmVjdC5sZWZ0ICsgZlJUTGVmdDsNCisgICAgICAgIHJ0QkJveEYudG9wID0gcmVjdC50b3AgKyAocmVjdC5oZWlnaHQgLSBmSGVpZ2h0KSAvIDIuMGY7DQorICAgICAgICBydEJCb3hGLndpZHRoID0gZkNoYXJXaWR0aDsNCisgICAgICAgIHJ0QkJveEYuaGVpZ2h0ID0gZkhlaWdodDsNCisgICAgICAgIHJ0QkJveEYudG9wID0gRlhfTUFYKHJ0QkJveEYudG9wLCAwKTsNCisgICAgICB9DQorICAgICAgcnRBcnJheS5TZXRBdChpLCBydEJCb3hGKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBydEFycmF5LlNldEF0KGksIHJlY3QpOw0KKyAgfQ0KKyAgcmV0dXJuIGlMZW5ndGg7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3RleHRicmVhay5oIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdGV4dGJyZWFrLmgKaW5kZXggNTAyMGYwYS4uMWQyYTUwYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdGV4dGJyZWFrLmgKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdGV4dGJyZWFrLmgKQEAgLTEyLDE2NCArMTIsMTYwIEBACiBjbGFzcyBJRlhfQXJhYmljQ2hhcjsNCiBjbGFzcyBDRlhfVHh0YnJlYWs7DQogDQotY2xhc3MgQ0ZYX1R4dExpbmUNCi17DQotcHVibGljOg0KLSAgICBDRlhfVHh0TGluZShpbnQzMl90IGlCbG9ja1NpemUpIDogbV9pU3RhcnQoMCkNCi0gICAgICAgICwgbV9pV2lkdGgoMCkNCi0gICAgICAgICwgbV9pQXJhYmljQ2hhcnMoMCkNCi0gICAgew0KLSAgICAgICAgbV9wTGluZUNoYXJzID0gRlhfTkVXIENGWF9UeHRDaGFyQXJyYXk7DQotICAgICAgICBtX3BMaW5lUGllY2VzID0gbmV3IENGWF9UeHRQaWVjZUFycmF5KDE2KTsNCitjbGFzcyBDRlhfVHh0TGluZSB7DQorIHB1YmxpYzoNCisgIENGWF9UeHRMaW5lKGludDMyX3QgaUJsb2NrU2l6ZSkNCisgICAgICA6IG1faVN0YXJ0KDApLCBtX2lXaWR0aCgwKSwgbV9pQXJhYmljQ2hhcnMoMCkgew0KKyAgICBtX3BMaW5lQ2hhcnMgPSBGWF9ORVcgQ0ZYX1R4dENoYXJBcnJheTsNCisgICAgbV9wTGluZVBpZWNlcyA9IG5ldyBDRlhfVHh0UGllY2VBcnJheSgxNik7DQorICB9DQorICB+Q0ZYX1R4dExpbmUoKSB7DQorICAgIFJlbW92ZUFsbCgpOw0KKyAgICBkZWxldGUgbV9wTGluZUNoYXJzOw0KKyAgICBkZWxldGUgbV9wTGluZVBpZWNlczsNCisgIH0NCisgIGludDMyX3QgQ291bnRDaGFycygpIGNvbnN0IHsgcmV0dXJuIG1fcExpbmVDaGFycy0+R2V0U2l6ZSgpOyB9DQorICBDRlhfVHh0Q2hhciogR2V0Q2hhclB0cihpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9wTGluZUNoYXJzLT5HZXRTaXplKCkpOw0KKyAgICByZXR1cm4gbV9wTGluZUNoYXJzLT5HZXREYXRhUHRyKGluZGV4KTsNCisgIH0NCisgIGludDMyX3QgQ291bnRQaWVjZXMoKSBjb25zdCB7IHJldHVybiBtX3BMaW5lUGllY2VzLT5HZXRTaXplKCk7IH0NCisgIENGWF9UeHRQaWVjZSogR2V0UGllY2VQdHIoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1fcExpbmVQaWVjZXMtPkdldFNpemUoKSk7DQorICAgIHJldHVybiBtX3BMaW5lUGllY2VzLT5HZXRQdHJBdChpbmRleCk7DQorICB9DQorICB2b2lkIEdldFN0cmluZyhDRlhfV2lkZVN0cmluZyYgd3NTdHIpIGNvbnN0IHsNCisgICAgaW50MzJfdCBpQ291bnQgPSBtX3BMaW5lQ2hhcnMtPkdldFNpemUoKTsNCisgICAgRlhfV0NIQVIqIHBCdWYgPSB3c1N0ci5HZXRCdWZmZXIoaUNvdW50KTsNCisgICAgQ0ZYX0NoYXIqIHBDaGFyOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIHBDaGFyID0gbV9wTGluZUNoYXJzLT5HZXREYXRhUHRyKGkpOw0KKyAgICAgICpwQnVmKysgPSAoRlhfV0NIQVIpcENoYXItPm1fd0NoYXJDb2RlOw0KICAgICB9DQotICAgIH5DRlhfVHh0TGluZSgpDQotICAgIHsNCi0gICAgICAgIFJlbW92ZUFsbCgpOw0KLSAgICAgICAgZGVsZXRlIG1fcExpbmVDaGFyczsNCi0gICAgICAgIGRlbGV0ZSBtX3BMaW5lUGllY2VzOw0KLSAgICB9DQotICAgIGludDMyX3QgQ291bnRDaGFycygpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BMaW5lQ2hhcnMtPkdldFNpemUoKTsNCi0gICAgfQ0KLSAgICBDRlhfVHh0Q2hhciogR2V0Q2hhclB0cihpbnQzMl90IGluZGV4KSBjb25zdA0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1fcExpbmVDaGFycy0+R2V0U2l6ZSgpKTsNCi0gICAgICAgIHJldHVybiBtX3BMaW5lQ2hhcnMtPkdldERhdGFQdHIoaW5kZXgpOw0KLSAgICB9DQotICAgIGludDMyX3QgQ291bnRQaWVjZXMoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wTGluZVBpZWNlcy0+R2V0U2l6ZSgpOw0KLSAgICB9DQotICAgIENGWF9UeHRQaWVjZSogR2V0UGllY2VQdHIoaW50MzJfdCBpbmRleCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX3BMaW5lUGllY2VzLT5HZXRTaXplKCkpOw0KLSAgICAgICAgcmV0dXJuIG1fcExpbmVQaWVjZXMtPkdldFB0ckF0KGluZGV4KTsNCi0gICAgfQ0KLSAgICB2b2lkIEdldFN0cmluZyhDRlhfV2lkZVN0cmluZyAmd3NTdHIpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIGludDMyX3QgaUNvdW50ID0gbV9wTGluZUNoYXJzLT5HZXRTaXplKCk7DQotICAgICAgICBGWF9XQ0hBUiogcEJ1ZiA9IHdzU3RyLkdldEJ1ZmZlcihpQ291bnQpOw0KLSAgICAgICAgQ0ZYX0NoYXIgKnBDaGFyOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICAgICAgcENoYXIgPSBtX3BMaW5lQ2hhcnMtPkdldERhdGFQdHIoaSk7DQotICAgICAgICAgICAgKnBCdWYgKysgPSAoRlhfV0NIQVIpcENoYXItPm1fd0NoYXJDb2RlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd3NTdHIuUmVsZWFzZUJ1ZmZlcihpQ291bnQpOw0KLSAgICB9DQotICAgIHZvaWQgUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpDQotICAgIHsNCi0gICAgICAgIG1fcExpbmVDaGFycy0+UmVtb3ZlQWxsKCk7DQotICAgICAgICBtX3BMaW5lUGllY2VzLT5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCi0gICAgICAgIG1faVdpZHRoID0gMDsNCi0gICAgICAgIG1faUFyYWJpY0NoYXJzID0gMDsNCi0gICAgfQ0KLSAgICBDRlhfVHh0Q2hhckFycmF5CSptX3BMaW5lQ2hhcnM7DQotICAgIENGWF9UeHRQaWVjZUFycmF5CSptX3BMaW5lUGllY2VzOw0KLSAgICBpbnQzMl90CQkJbV9pU3RhcnQ7DQotICAgIGludDMyX3QJCQltX2lXaWR0aDsNCi0gICAgaW50MzJfdAkJCW1faUFyYWJpY0NoYXJzOw0KKyAgICB3c1N0ci5SZWxlYXNlQnVmZmVyKGlDb3VudCk7DQorICB9DQorICB2b2lkIFJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKSB7DQorICAgIG1fcExpbmVDaGFycy0+UmVtb3ZlQWxsKCk7DQorICAgIG1fcExpbmVQaWVjZXMtPlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOw0KKyAgICBtX2lXaWR0aCA9IDA7DQorICAgIG1faUFyYWJpY0NoYXJzID0gMDsNCisgIH0NCisgIENGWF9UeHRDaGFyQXJyYXkqIG1fcExpbmVDaGFyczsNCisgIENGWF9UeHRQaWVjZUFycmF5KiBtX3BMaW5lUGllY2VzOw0KKyAgaW50MzJfdCBtX2lTdGFydDsNCisgIGludDMyX3QgbV9pV2lkdGg7DQorICBpbnQzMl90IG1faUFyYWJpY0NoYXJzOw0KIH07DQotY2xhc3MgQ0ZYX1R4dEJyZWFrIDogcHVibGljIElGWF9UeHRCcmVhaw0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9UeHRCcmVhayhGWF9EV09SRCBkd1BvbGljaWVzKTsNCi0gICAgfkNGWF9UeHRCcmVhaygpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0TGluZVdpZHRoKEZYX0ZMT0FUIGZMaW5lV2lkdGgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRMaW5lUG9zKEZYX0ZMT0FUIGZMaW5lUG9zKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2V0TGF5b3V0U3R5bGVzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZHdMYXlvdXRTdHlsZXM7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0TGF5b3V0U3R5bGVzKEZYX0RXT1JEIGR3TGF5b3V0U3R5bGVzKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0Rm9udChJRlhfRm9udCAqcEZvbnQpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0RGVmYXVsdENoYXIoRlhfV0NIQVIgd2NoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0UGFyYWdyYXBoQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0SG9yaXpvbnRhbFNjYWxlKGludDMyX3QgaVNjYWxlKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0VmVydGljYWxTY2FsZShpbnQzMl90IGlTY2FsZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldENoYXJSb3RhdGlvbihpbnQzMl90IGlDaGFyUm90YXRpb24pOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldEFsaWdubWVudChpbnQzMl90IGlBbGlnbm1lbnQpOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRDb250ZXh0Q2hhclN0eWxlcygpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDb250ZXh0Q2hhclN0eWxlcyhGWF9EV09SRCBkd0NoYXJTdHlsZXMpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRDb21iV2lkdGgoRlhfRkxPQVQgZkNvbWJXaWR0aCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVNldFVzZXJEYXRhKHZvaWQqIHBVc2VyRGF0YSk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJCQkJQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQkJCUVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhayk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlDb3VudEJyZWFrQ2hhcnMoKSBjb25zdDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCUNvdW50QnJlYWtQaWVjZXMoKSBjb25zdDsNCi0gICAgdmlydHVhbCBjb25zdCBDRlhfVHh0UGllY2UqCQlHZXRCcmVha1BpZWNlKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJCUNsZWFyQnJlYWtQaWVjZXMoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVzZXQoKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXREaXNwbGF5UG9zKEZYX0xQQ1RYVFJVTiBwVHh0UnVuLCBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UsIENGWF9XaWRlU3RyaW5nICpwV1NGb3JtcyA9IE5VTEwsIEZYX0FkanVzdENoYXJEaXNwbGF5UG9zIHBBZGp1c3RQb3MgPSBOVUxMKSBjb25zdDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRDaGFyUmVjdHMoRlhfTFBDVFhUUlVOIHBUeHRSdW4sIENGWF9SZWN0RkFycmF5ICZydEFycmF5LCBGWF9CT09MIGJDaGFyQkJveCA9IEZBTFNFKSBjb25zdDsNCi0gICAgdm9pZAkJCQlBcHBlbmRDaGFyX1BhZ2VMb2FkKENGWF9DaGFyICpwQ3VyQ2hhciwgRlhfRFdPUkQgZHdQcm9wcyk7DQotICAgIEZYX0RXT1JECQkJQXBwZW5kQ2hhcl9Db21iaW5hdGlvbihDRlhfQ2hhciAqcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsNCi0gICAgRlhfRFdPUkQJCQlBcHBlbmRDaGFyX1RhYihDRlhfQ2hhciAqcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsNCi0gICAgRlhfRFdPUkQJCQlBcHBlbmRDaGFyX0NvbnRyb2woQ0ZYX0NoYXIgKnBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQotICAgIEZYX0RXT1JECQkJQXBwZW5kQ2hhcl9BcmFiaWMoQ0ZYX0NoYXIgKnBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQotICAgIEZYX0RXT1JECQkJQXBwZW5kQ2hhcl9PdGhlcnMoQ0ZYX0NoYXIgKnBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9EV09SRAkJCW1fZHdQb2xpY2llczsNCi0gICAgRlhfQk9PTAkJCQltX2JQYWdpbmF0aW9uOw0KLSAgICBJRlhfQXJhYmljQ2hhcgkJKm1fcEFyYWJpY0NoYXI7DQotICAgIGludDMyX3QJCQltX2lMaW5lV2lkdGg7DQotICAgIEZYX0RXT1JECQkJbV9kd0xheW91dFN0eWxlczsNCi0gICAgRlhfQk9PTAkJCQltX2JWZXJ0aWNhbDsNCi0gICAgRlhfQk9PTAkJCQltX2JBcmFiaWNDb250ZXh0Ow0KLSAgICBGWF9CT09MCQkJCW1fYkFyYWJpY1NoYXBlczsNCi0gICAgRlhfQk9PTAkJCQltX2JSVEw7DQotICAgIEZYX0JPT0wJCQkJbV9iU2luZ2xlTGluZTsNCi0gICAgRlhfQk9PTAkJCQltX2JDb21iVGV4dDsNCi0gICAgaW50MzJfdAkJCW1faUFyYWJpY0NvbnRleHQ7DQotICAgIGludDMyX3QJCQltX2lDdXJBcmFiaWNDb250ZXh0Ow0KLSAgICBJRlhfRm9udAkJCSptX3BGb250Ow0KLSAgICBpbnQzMl90CQkJbV9pRm9udFNpemU7DQotICAgIEZYX0JPT0wJCQkJbV9iRXF1aWRpc3RhbnQ7DQotICAgIGludDMyX3QJCQltX2lUYWJXaWR0aDsNCi0gICAgRlhfV0NIQVIJCQltX3dEZWZDaGFyOw0KLSAgICBGWF9XQ0hBUgkJCW1fd1BhcmFnQnJlYWtDaGFyOw0KLSAgICBpbnQzMl90CQkJbV9pRGVmQ2hhcjsNCi0gICAgaW50MzJfdAkJCW1faUxpbmVSb3RhdGlvbjsNCi0gICAgaW50MzJfdAkJCW1faUNoYXJSb3RhdGlvbjsNCi0gICAgaW50MzJfdAkJCW1faVJvdGF0aW9uOw0KLSAgICBpbnQzMl90CQkJbV9pQWxpZ25tZW50Ow0KLSAgICBGWF9EV09SRAkJCW1fZHdDb250ZXh0Q2hhclN0eWxlczsNCi0gICAgaW50MzJfdAkJCW1faUNvbWJXaWR0aDsNCi0gICAgdm9pZCoJCQltX3BVc2VyRGF0YTsNCi0gICAgRlhfRFdPUkQJCQltX2R3Q2hhclR5cGU7DQotICAgIEZYX0JPT0wJCQkJbV9iQ3VyUlRMOw0KLSAgICBpbnQzMl90CQkJbV9pQ3VyQWxpZ25tZW50Ow0KLSAgICBGWF9CT09MCQkJCW1fYkFyYWJpY051bWJlcjsNCi0gICAgRlhfQk9PTAkJCQltX2JBcmFiaWNDb21tYTsNCi0gICAgQ0ZYX1R4dExpbmUJCQkqbV9wVHh0TGluZTE7DQotICAgIENGWF9UeHRMaW5lCQkJKm1fcFR4dExpbmUyOw0KLSAgICBDRlhfVHh0TGluZQkJCSptX3BDdXJMaW5lOw0KLSAgICBpbnQzMl90CQkJbV9pUmVhZHk7DQotICAgIGludDMyX3QJCQltX2lUb2xlcmFuY2U7DQotICAgIGludDMyX3QJCQltX2lIb3JTY2FsZTsNCi0gICAgaW50MzJfdAkJCW1faVZlclNjYWxlOw0KLSAgICBpbnQzMl90CQkJbV9pQ2hhclNwYWNlOw0KLSAgICB2b2lkCQkJCVNldEJyZWFrU3RhdHVzKCk7DQotICAgIGludDMyX3QJCQlHZXRMaW5lUm90YXRpb24oRlhfRFdPUkQgZHdTdHlsZXMpIGNvbnN0Ow0KLSAgICBDRlhfVHh0Q2hhcioJCUdldExhc3RDaGFyKGludDMyX3QgaW5kZXgsIEZYX0JPT0wgYk9taXRDaGFyID0gVFJVRSkgY29uc3Q7DQotICAgIENGWF9UeHRMaW5lKgkJR2V0VHh0TGluZShGWF9CT09MIGJSZWFkeSkgY29uc3Q7DQotICAgIENGWF9UeHRQaWVjZUFycmF5KglHZXRUeHRQaWVjZXMoRlhfQk9PTCBiUmVhZHkpIGNvbnN0Ow0KLSAgICBGWF9EV09SRAkJCUdldFVuaWZpZWRDaGFyVHlwZShGWF9EV09SRCBkd1R5cGUpIGNvbnN0Ow0KLSAgICB2b2lkCQkJCVJlc2V0QXJhYmljQ29udGV4dCgpOw0KLSAgICB2b2lkCQkJCVJlc2V0Q29udGV4dENoYXJTdHlsZXMoKTsNCi0gICAgdm9pZAkJCQlFbmRCcmVha19VcGRhdGVBcmFiaWNTaGFwZXMoKTsNCi0gICAgRlhfQk9PTAkJCQlFbmRCcmVha19TcGxpdExpbmUoQ0ZYX1R4dExpbmUgKnBOZXh0TGluZSwgRlhfQk9PTCBiQWxsQ2hhcnMsIEZYX0RXT1JEIGR3U3RhdHVzKTsNCi0gICAgdm9pZAkJCQlFbmRCcmVha19CaWRpTGluZShDRlhfVFBPQXJyYXkgJnRwb3MsIEZYX0RXT1JEIGR3U3RhdHVzKTsNCi0gICAgdm9pZAkJCQlFbmRCcmVha19BbGlnbm1lbnQoQ0ZYX1RQT0FycmF5ICZ0cG9zLCBGWF9CT09MIGJBbGxDaGFycywgRlhfRFdPUkQgZHdTdGF0dXMpOw0KLSAgICBpbnQzMl90CQkJR2V0QnJlYWtQb3MoQ0ZYX1R4dENoYXJBcnJheSAmY2EsIGludDMyX3QgJmlFbmRQb3MsIEZYX0JPT0wgYkFsbENoYXJzID0gRkFMU0UsIEZYX0JPT0wgYk9ubHlCcmsgPSBGQUxTRSk7DQotICAgIHZvaWQJCQkJU3BsaXRUZXh0TGluZShDRlhfVHh0TGluZSAqcEN1ckxpbmUsIENGWF9UeHRMaW5lICpwTmV4dExpbmUsIEZYX0JPT0wgYkFsbENoYXJzID0gRkFMU0UpOw0KK2NsYXNzIENGWF9UeHRCcmVhayA6IHB1YmxpYyBJRlhfVHh0QnJlYWsgew0KKyBwdWJsaWM6DQorICBDRlhfVHh0QnJlYWsoRlhfRFdPUkQgZHdQb2xpY2llcyk7DQorICB+Q0ZYX1R4dEJyZWFrKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lV2lkdGgoRlhfRkxPQVQgZkxpbmVXaWR0aCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZVBvcyhGWF9GTE9BVCBmTGluZVBvcyk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldExheW91dFN0eWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZHdMYXlvdXRTdHlsZXM7IH0NCisgIHZpcnR1YWwgdm9pZCBTZXRMYXlvdXRTdHlsZXMoRlhfRFdPUkQgZHdMYXlvdXRTdHlsZXMpOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnQoSUZYX0ZvbnQqIHBGb250KTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOw0KKyAgdmlydHVhbCB2b2lkIFNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgRlhfQk9PTCBiRXF1aWRpc3RhbnQpOw0KKyAgdmlydHVhbCB2b2lkIFNldERlZmF1bHRDaGFyKEZYX1dDSEFSIHdjaCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0UGFyYWdyYXBoQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpOw0KKyAgdmlydHVhbCB2b2lkIFNldEhvcml6b250YWxTY2FsZShpbnQzMl90IGlTY2FsZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0VmVydGljYWxTY2FsZShpbnQzMl90IGlTY2FsZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhclJvdGF0aW9uKGludDMyX3QgaUNoYXJSb3RhdGlvbik7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpOw0KKyAgdmlydHVhbCB2b2lkIFNldEFsaWdubWVudChpbnQzMl90IGlBbGlnbm1lbnQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDb250ZXh0Q2hhclN0eWxlcygpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIFNldENvbnRleHRDaGFyU3R5bGVzKEZYX0RXT1JEIGR3Q2hhclN0eWxlcyk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29tYldpZHRoKEZYX0ZMT0FUIGZDb21iV2lkdGgpOw0KKyAgdmlydHVhbCB2b2lkIFNldFVzZXJEYXRhKHZvaWQqIHBVc2VyRGF0YSk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgRW5kQnJlYWsoRlhfRFdPUkQgZHdTdGF0dXMgPSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKTsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEJyZWFrQ2hhcnMoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEJyZWFrUGllY2VzKCkgY29uc3Q7DQorICB2aXJ0dWFsIGNvbnN0IENGWF9UeHRQaWVjZSogR2V0QnJlYWtQaWVjZShpbnQzMl90IGluZGV4KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBDbGVhckJyZWFrUGllY2VzKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXREaXNwbGF5UG9zKA0KKyAgICAgIEZYX0xQQ1RYVFJVTiBwVHh0UnVuLA0KKyAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFLA0KKyAgICAgIENGWF9XaWRlU3RyaW5nKiBwV1NGb3JtcyA9IE5VTEwsDQorICAgICAgRlhfQWRqdXN0Q2hhckRpc3BsYXlQb3MgcEFkanVzdFBvcyA9IE5VTEwpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldENoYXJSZWN0cyhGWF9MUENUWFRSVU4gcFR4dFJ1biwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIHJ0QXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJCQm94ID0gRkFMU0UpIGNvbnN0Ow0KKyAgdm9pZCBBcHBlbmRDaGFyX1BhZ2VMb2FkKENGWF9DaGFyKiBwQ3VyQ2hhciwgRlhfRFdPUkQgZHdQcm9wcyk7DQorICBGWF9EV09SRCBBcHBlbmRDaGFyX0NvbWJpbmF0aW9uKENGWF9DaGFyKiBwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pOw0KKyAgRlhfRFdPUkQgQXBwZW5kQ2hhcl9UYWIoQ0ZYX0NoYXIqIHBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQorICBGWF9EV09SRCBBcHBlbmRDaGFyX0NvbnRyb2woQ0ZYX0NoYXIqIHBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQorICBGWF9EV09SRCBBcHBlbmRDaGFyX0FyYWJpYyhDRlhfQ2hhciogcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsNCisgIEZYX0RXT1JEIEFwcGVuZENoYXJfT3RoZXJzKENGWF9DaGFyKiBwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9EV09SRCBtX2R3UG9saWNpZXM7DQorICBGWF9CT09MIG1fYlBhZ2luYXRpb247DQorICBJRlhfQXJhYmljQ2hhciogbV9wQXJhYmljQ2hhcjsNCisgIGludDMyX3QgbV9pTGluZVdpZHRoOw0KKyAgRlhfRFdPUkQgbV9kd0xheW91dFN0eWxlczsNCisgIEZYX0JPT0wgbV9iVmVydGljYWw7DQorICBGWF9CT09MIG1fYkFyYWJpY0NvbnRleHQ7DQorICBGWF9CT09MIG1fYkFyYWJpY1NoYXBlczsNCisgIEZYX0JPT0wgbV9iUlRMOw0KKyAgRlhfQk9PTCBtX2JTaW5nbGVMaW5lOw0KKyAgRlhfQk9PTCBtX2JDb21iVGV4dDsNCisgIGludDMyX3QgbV9pQXJhYmljQ29udGV4dDsNCisgIGludDMyX3QgbV9pQ3VyQXJhYmljQ29udGV4dDsNCisgIElGWF9Gb250KiBtX3BGb250Ow0KKyAgaW50MzJfdCBtX2lGb250U2l6ZTsNCisgIEZYX0JPT0wgbV9iRXF1aWRpc3RhbnQ7DQorICBpbnQzMl90IG1faVRhYldpZHRoOw0KKyAgRlhfV0NIQVIgbV93RGVmQ2hhcjsNCisgIEZYX1dDSEFSIG1fd1BhcmFnQnJlYWtDaGFyOw0KKyAgaW50MzJfdCBtX2lEZWZDaGFyOw0KKyAgaW50MzJfdCBtX2lMaW5lUm90YXRpb247DQorICBpbnQzMl90IG1faUNoYXJSb3RhdGlvbjsNCisgIGludDMyX3QgbV9pUm90YXRpb247DQorICBpbnQzMl90IG1faUFsaWdubWVudDsNCisgIEZYX0RXT1JEIG1fZHdDb250ZXh0Q2hhclN0eWxlczsNCisgIGludDMyX3QgbV9pQ29tYldpZHRoOw0KKyAgdm9pZCogbV9wVXNlckRhdGE7DQorICBGWF9EV09SRCBtX2R3Q2hhclR5cGU7DQorICBGWF9CT09MIG1fYkN1clJUTDsNCisgIGludDMyX3QgbV9pQ3VyQWxpZ25tZW50Ow0KKyAgRlhfQk9PTCBtX2JBcmFiaWNOdW1iZXI7DQorICBGWF9CT09MIG1fYkFyYWJpY0NvbW1hOw0KKyAgQ0ZYX1R4dExpbmUqIG1fcFR4dExpbmUxOw0KKyAgQ0ZYX1R4dExpbmUqIG1fcFR4dExpbmUyOw0KKyAgQ0ZYX1R4dExpbmUqIG1fcEN1ckxpbmU7DQorICBpbnQzMl90IG1faVJlYWR5Ow0KKyAgaW50MzJfdCBtX2lUb2xlcmFuY2U7DQorICBpbnQzMl90IG1faUhvclNjYWxlOw0KKyAgaW50MzJfdCBtX2lWZXJTY2FsZTsNCisgIGludDMyX3QgbV9pQ2hhclNwYWNlOw0KKyAgdm9pZCBTZXRCcmVha1N0YXR1cygpOw0KKyAgaW50MzJfdCBHZXRMaW5lUm90YXRpb24oRlhfRFdPUkQgZHdTdHlsZXMpIGNvbnN0Ow0KKyAgQ0ZYX1R4dENoYXIqIEdldExhc3RDaGFyKGludDMyX3QgaW5kZXgsIEZYX0JPT0wgYk9taXRDaGFyID0gVFJVRSkgY29uc3Q7DQorICBDRlhfVHh0TGluZSogR2V0VHh0TGluZShGWF9CT09MIGJSZWFkeSkgY29uc3Q7DQorICBDRlhfVHh0UGllY2VBcnJheSogR2V0VHh0UGllY2VzKEZYX0JPT0wgYlJlYWR5KSBjb25zdDsNCisgIEZYX0RXT1JEIEdldFVuaWZpZWRDaGFyVHlwZShGWF9EV09SRCBkd1R5cGUpIGNvbnN0Ow0KKyAgdm9pZCBSZXNldEFyYWJpY0NvbnRleHQoKTsNCisgIHZvaWQgUmVzZXRDb250ZXh0Q2hhclN0eWxlcygpOw0KKyAgdm9pZCBFbmRCcmVha19VcGRhdGVBcmFiaWNTaGFwZXMoKTsNCisgIEZYX0JPT0wgRW5kQnJlYWtfU3BsaXRMaW5lKENGWF9UeHRMaW5lKiBwTmV4dExpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzKTsNCisgIHZvaWQgRW5kQnJlYWtfQmlkaUxpbmUoQ0ZYX1RQT0FycmF5JiB0cG9zLCBGWF9EV09SRCBkd1N0YXR1cyk7DQorICB2b2lkIEVuZEJyZWFrX0FsaWdubWVudChDRlhfVFBPQXJyYXkmIHRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzKTsNCisgIGludDMyX3QgR2V0QnJlYWtQb3MoQ0ZYX1R4dENoYXJBcnJheSYgY2EsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlFbmRQb3MsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk9ubHlCcmsgPSBGQUxTRSk7DQorICB2b2lkIFNwbGl0VGV4dExpbmUoQ0ZYX1R4dExpbmUqIHBDdXJMaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9UeHRMaW5lKiBwTmV4dExpbmUsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWxsQ2hhcnMgPSBGQUxTRSk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF91bmljb2RlLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuY3BwCmluZGV4IGI5Mzk5MDUuLjA5YmViNDQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuY3BwCkBAIC02LDE0MSArNiwxMTIgQEAKIA0KICNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCiAjaW5jbHVkZSAiZnhfdW5pY29kZS5oIg0KLXZvaWQgRlhfVEVYVExBWU9VVF9QaWVjZVNvcnQoQ0ZYX1RQT0FycmF5ICZ0cG9zLCBpbnQzMl90IGlTdGFydCwgaW50MzJfdCBpRW5kKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IHRwb3MuR2V0U2l6ZSgpKTsNCi0gICAgRlhTWVNfYXNzZXJ0KGlFbmQgPiAtMSAmJiBpRW5kIDwgdHBvcy5HZXRTaXplKCkpOw0KLSAgICBpZiAoaVN0YXJ0ID49IGlFbmQpIHsNCi0gICAgICAgIHJldHVybjsNCit2b2lkIEZYX1RFWFRMQVlPVVRfUGllY2VTb3J0KENGWF9UUE9BcnJheSYgdHBvcywgaW50MzJfdCBpU3RhcnQsIGludDMyX3QgaUVuZCkgew0KKyAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IHRwb3MuR2V0U2l6ZSgpKTsNCisgIEZYU1lTX2Fzc2VydChpRW5kID4gLTEgJiYgaUVuZCA8IHRwb3MuR2V0U2l6ZSgpKTsNCisgIGlmIChpU3RhcnQgPj0gaUVuZCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGkgPSBpU3RhcnQsIGogPSBpRW5kOw0KKyAgRlhfVFBPICpwQ3VyID0gdHBvcy5HZXRQdHJBdChpU3RhcnQpLCAqcFNvcnQ7DQorICBpbnQzMl90IHYgPSBwQ3VyLT5wb3M7DQorICB3aGlsZSAoaSA8IGopIHsNCisgICAgd2hpbGUgKGogPiBpKSB7DQorICAgICAgcFNvcnQgPSB0cG9zLkdldFB0ckF0KGopOw0KKyAgICAgIGlmIChwU29ydC0+cG9zIDwgdikgew0KKyAgICAgICAgRlhfVFBPIHQgPSAqcFNvcnQ7DQorICAgICAgICAqcFNvcnQgPSAqcEN1cjsNCisgICAgICAgICpwQ3VyID0gdDsNCisgICAgICAgIHBDdXIgPSBwU29ydDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBqLS07DQogICAgIH0NCi0gICAgaW50MzJfdCBpID0gaVN0YXJ0LCBqID0gaUVuZDsNCi0gICAgRlhfVFBPICpwQ3VyID0gdHBvcy5HZXRQdHJBdChpU3RhcnQpLCAqcFNvcnQ7DQotICAgIGludDMyX3QgdiA9IHBDdXItPnBvczsNCiAgICAgd2hpbGUgKGkgPCBqKSB7DQotICAgICAgICB3aGlsZSAoaiA+IGkpIHsNCi0gICAgICAgICAgICBwU29ydCA9IHRwb3MuR2V0UHRyQXQoaik7DQotICAgICAgICAgICAgaWYgKHBTb3J0LT5wb3MgPCB2KSB7DQotICAgICAgICAgICAgICAgIEZYX1RQTyB0ID0gKnBTb3J0Ow0KLSAgICAgICAgICAgICAgICAqcFNvcnQgPSAqcEN1cjsNCi0gICAgICAgICAgICAgICAgKnBDdXIgPSB0Ow0KLSAgICAgICAgICAgICAgICBwQ3VyID0gcFNvcnQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBqIC0tOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2hpbGUgKGkgPCBqKSB7DQotICAgICAgICAgICAgcFNvcnQgPSB0cG9zLkdldFB0ckF0KGkpOw0KLSAgICAgICAgICAgIGlmIChwU29ydC0+cG9zID4gdikgew0KLSAgICAgICAgICAgICAgICBGWF9UUE8gdCA9ICpwU29ydDsNCi0gICAgICAgICAgICAgICAgKnBTb3J0ID0gKnBDdXI7DQotICAgICAgICAgICAgICAgICpwQ3VyID0gdDsNCi0gICAgICAgICAgICAgICAgcEN1ciA9IHBTb3J0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaSArKzsNCi0gICAgICAgIH0NCisgICAgICBwU29ydCA9IHRwb3MuR2V0UHRyQXQoaSk7DQorICAgICAgaWYgKHBTb3J0LT5wb3MgPiB2KSB7DQorICAgICAgICBGWF9UUE8gdCA9ICpwU29ydDsNCisgICAgICAgICpwU29ydCA9ICpwQ3VyOw0KKyAgICAgICAgKnBDdXIgPSB0Ow0KKyAgICAgICAgcEN1ciA9IHBTb3J0Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGkrKzsNCiAgICAgfQ0KLSAgICBpIC0tLCBqICsrOw0KLSAgICBpZiAoaVN0YXJ0IDwgaSkgew0KLSAgICAgICAgRlhfVEVYVExBWU9VVF9QaWVjZVNvcnQodHBvcywgaVN0YXJ0LCBpKTsNCi0gICAgfQ0KLSAgICBpZiAoaiA8IGlFbmQpIHsNCi0gICAgICAgIEZYX1RFWFRMQVlPVVRfUGllY2VTb3J0KHRwb3MsIGosIGlFbmQpOw0KLSAgICB9DQorICB9DQorICBpLS0sIGorKzsNCisgIGlmIChpU3RhcnQgPCBpKSB7DQorICAgIEZYX1RFWFRMQVlPVVRfUGllY2VTb3J0KHRwb3MsIGlTdGFydCwgaSk7DQorICB9DQorICBpZiAoaiA8IGlFbmQpIHsNCisgICAgRlhfVEVYVExBWU9VVF9QaWVjZVNvcnQodHBvcywgaiwgaUVuZCk7DQorICB9DQogfQ0KIHN0YXRpYyBjb25zdCBGWF9KQVBDSEFSUFJPUEVSVFlFWCBnc19GWF9KYXBDaGFyUHJvcGVydHlzRXhbXSA9IHsNCi0gICAgezB4MzAwMSwgMHgxM30sDQotICAgIHsweDMwMDIsIDB4MTN9LA0KLSAgICB7MHgzMDQxLCAweDIzfSwNCi0gICAgezB4MzA0MywgMHgyM30sDQotICAgIHsweDMwNDUsIDB4MjN9LA0KLSAgICB7MHgzMDQ3LCAweDIzfSwNCi0gICAgezB4MzA0OSwgMHgyM30sDQotICAgIHsweDMwNjMsIDB4MjN9LA0KLSAgICB7MHgzMDgzLCAweDIzfSwNCi0gICAgezB4MzA4NSwgMHgyM30sDQotICAgIHsweDMwODcsIDB4MjN9LA0KLSAgICB7MHgzMDhFLCAweDIzfSwNCi0gICAgezB4MzA5NSwgMHgyM30sDQotICAgIHsweDMwOTYsIDB4MjN9LA0KLSAgICB7MHgzMEExLCAweDIzfSwNCi0gICAgezB4MzBBMywgMHgyM30sDQotICAgIHsweDMwQTUsIDB4MjN9LA0KLSAgICB7MHgzMEE3LCAweDIzfSwNCi0gICAgezB4MzBBOSwgMHgyM30sDQotICAgIHsweDMwQzMsIDB4MjN9LA0KLSAgICB7MHgzMEUzLCAweDIzfSwNCi0gICAgezB4MzBFNSwgMHgyM30sDQotICAgIHsweDMwRTcsIDB4MjN9LA0KLSAgICB7MHgzMEVFLCAweDIzfSwNCi0gICAgezB4MzBGNSwgMHgyM30sDQotICAgIHsweDMwRjYsIDB4MjN9LA0KLSAgICB7MHgzMEZCLCAweDIyfSwNCi0gICAgezB4MzFGMCwgMHgyM30sDQotICAgIHsweDMxRjEsIDB4MjN9LA0KLSAgICB7MHgzMUYyLCAweDIzfSwNCi0gICAgezB4MzFGMywgMHgyM30sDQotICAgIHsweDMxRjQsIDB4MjN9LA0KLSAgICB7MHgzMUY1LCAweDIzfSwNCi0gICAgezB4MzFGNiwgMHgyM30sDQotICAgIHsweDMxRjcsIDB4MjN9LA0KLSAgICB7MHgzMUY4LCAweDIzfSwNCi0gICAgezB4MzFGOSwgMHgyM30sDQotICAgIHsweDMxRkEsIDB4MjN9LA0KLSAgICB7MHgzMUZCLCAweDIzfSwNCi0gICAgezB4MzFGQywgMHgyM30sDQotICAgIHsweDMxRkQsIDB4MjN9LA0KLSAgICB7MHgzMUZFLCAweDIzfSwNCi0gICAgezB4MzFGRiwgMHgyM30sDQorICAgIHsweDMwMDEsIDB4MTN9LCB7MHgzMDAyLCAweDEzfSwgezB4MzA0MSwgMHgyM30sIHsweDMwNDMsIDB4MjN9LA0KKyAgICB7MHgzMDQ1LCAweDIzfSwgezB4MzA0NywgMHgyM30sIHsweDMwNDksIDB4MjN9LCB7MHgzMDYzLCAweDIzfSwNCisgICAgezB4MzA4MywgMHgyM30sIHsweDMwODUsIDB4MjN9LCB7MHgzMDg3LCAweDIzfSwgezB4MzA4RSwgMHgyM30sDQorICAgIHsweDMwOTUsIDB4MjN9LCB7MHgzMDk2LCAweDIzfSwgezB4MzBBMSwgMHgyM30sIHsweDMwQTMsIDB4MjN9LA0KKyAgICB7MHgzMEE1LCAweDIzfSwgezB4MzBBNywgMHgyM30sIHsweDMwQTksIDB4MjN9LCB7MHgzMEMzLCAweDIzfSwNCisgICAgezB4MzBFMywgMHgyM30sIHsweDMwRTUsIDB4MjN9LCB7MHgzMEU3LCAweDIzfSwgezB4MzBFRSwgMHgyM30sDQorICAgIHsweDMwRjUsIDB4MjN9LCB7MHgzMEY2LCAweDIzfSwgezB4MzBGQiwgMHgyMn0sIHsweDMxRjAsIDB4MjN9LA0KKyAgICB7MHgzMUYxLCAweDIzfSwgezB4MzFGMiwgMHgyM30sIHsweDMxRjMsIDB4MjN9LCB7MHgzMUY0LCAweDIzfSwNCisgICAgezB4MzFGNSwgMHgyM30sIHsweDMxRjYsIDB4MjN9LCB7MHgzMUY3LCAweDIzfSwgezB4MzFGOCwgMHgyM30sDQorICAgIHsweDMxRjksIDB4MjN9LCB7MHgzMUZBLCAweDIzfSwgezB4MzFGQiwgMHgyM30sIHsweDMxRkMsIDB4MjN9LA0KKyAgICB7MHgzMUZELCAweDIzfSwgezB4MzFGRSwgMHgyM30sIHsweDMxRkYsIDB4MjN9LA0KIH07DQotRlhfTFBDSkFQQ0hBUlBST1BFUlRZRVggRlhfR2V0SmFwQ2hhclByb3BlcnR5RXgoRlhfV0NIQVIgd2NoKQ0KLXsNCi0gICAgaW50MzJfdCBpU3RhcnQgPSAwOw0KLSAgICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ3NfRlhfSmFwQ2hhclByb3BlcnR5c0V4KSAvIHNpemVvZihGWF9KQVBDSEFSUFJPUEVSVFlFWCk7DQotICAgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgew0KLSAgICAgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCi0gICAgICAgIEZYX1dDSEFSIHdKYXBDaGFyID0gZ3NfRlhfSmFwQ2hhclByb3BlcnR5c0V4W2lNaWRdLndDaGFyOw0KLSAgICAgICAgaWYgKHdjaCA9PSB3SmFwQ2hhcikgew0KLSAgICAgICAgICAgIHJldHVybiBnc19GWF9KYXBDaGFyUHJvcGVydHlzRXggKyBpTWlkOw0KLSAgICAgICAgfSBlbHNlIGlmICh3Y2ggPCB3SmFwQ2hhcikgew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9DQorRlhfTFBDSkFQQ0hBUlBST1BFUlRZRVggRlhfR2V0SmFwQ2hhclByb3BlcnR5RXgoRlhfV0NIQVIgd2NoKSB7DQorICBpbnQzMl90IGlTdGFydCA9IDA7DQorICBpbnQzMl90IGlFbmQgPQ0KKyAgICAgIHNpemVvZihnc19GWF9KYXBDaGFyUHJvcGVydHlzRXgpIC8gc2l6ZW9mKEZYX0pBUENIQVJQUk9QRVJUWUVYKTsNCisgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgew0KKyAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBGWF9XQ0hBUiB3SmFwQ2hhciA9IGdzX0ZYX0phcENoYXJQcm9wZXJ0eXNFeFtpTWlkXS53Q2hhcjsNCisgICAgaWYgKHdjaCA9PSB3SmFwQ2hhcikgew0KKyAgICAgIHJldHVybiBnc19GWF9KYXBDaGFyUHJvcGVydHlzRXggKyBpTWlkOw0KKyAgICB9IGVsc2UgaWYgKHdjaCA8IHdKYXBDaGFyKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KICAgICB9DQotICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLUZYX0JPT0wgRlhfQWRqdXN0SmFwQ2hhckRpc3BsYXlQb3MoRlhfV0NIQVIgd2NoLCBGWF9CT09MIGJNQkNTQ29kZSwgSUZYX0ZvbnQgKnBGb250LCBGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYlZlcnRpY2FsLCBDRlhfUG9pbnRGICZwdE9mZnNldCkNCi17DQotICAgIGlmIChwRm9udCA9PSBOVUxMIHx8ICFiVmVydGljYWwpCXsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIEZYX0FkanVzdEphcENoYXJEaXNwbGF5UG9zKEZYX1dDSEFSIHdjaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1CQ1NDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqIHBGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydGljYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGJiBwdE9mZnNldCkgew0KKyAgaWYgKHBGb250ID09IE5VTEwgfHwgIWJWZXJ0aWNhbCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAod2NoIDwgMHgzMDAxIHx8IHdjaCA+IDB4MzFGRikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9MUENKQVBDSEFSUFJPUEVSVFlFWCBwSmFwQ2hhciA9IEZYX0dldEphcENoYXJQcm9wZXJ0eUV4KHdjaCk7DQorICBpZiAocEphcENoYXIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfUmVjdCBydEJCb3g7DQorICBydEJCb3guUmVzZXQoKTsNCisgIGlmIChwRm9udC0+R2V0Q2hhckJCb3god2NoLCBydEJCb3gsIGJNQkNTQ29kZSkpIHsNCisgICAgc3dpdGNoIChwSmFwQ2hhci0+dUFsaWduICYgMHhGMCkgew0KKyAgICAgIGNhc2UgRlhfSkFQQ0hBUlBST1BFUlRZRVhfVG9wOg0KKyAgICAgICAgcHRPZmZzZXQueSA9IGZGb250U2l6ZSAqICgxMDAwIC0gcnRCQm94LmhlaWdodCkgLyAxMjAwLjBmOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9NaWRkbGU6DQorICAgICAgICBwdE9mZnNldC55ID0gZkZvbnRTaXplICogKDEwMDAgLSBydEJCb3guaGVpZ2h0KSAvIDYwMDAuMGY7DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpZiAod2NoIDwgMHgzMDAxIHx8IHdjaCA+IDB4MzFGRikJew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICBzd2l0Y2ggKHBKYXBDaGFyLT51QWxpZ24gJiAweDBGKSB7DQorICAgICAgY2FzZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9DZW50ZXI6DQorICAgICAgICBwdE9mZnNldC54ID0gZkZvbnRTaXplICogKDYwMCAtIHJ0QkJveC5yaWdodCgpKSAvIDEwMDAuMGY7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZYX0pBUENIQVJQUk9QRVJUWUVYX1JpZ2h0Og0KKyAgICAgICAgcHRPZmZzZXQueCA9IGZGb250U2l6ZSAqICg5NTAgLSBydEJCb3gucmlnaHQoKSkgLyAxMDAwLjBmOw0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgRlhfTFBDSkFQQ0hBUlBST1BFUlRZRVggcEphcENoYXIgPSBGWF9HZXRKYXBDaGFyUHJvcGVydHlFeCh3Y2gpOw0KLSAgICBpZiAocEphcENoYXIgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9SZWN0IHJ0QkJveDsNCi0gICAgcnRCQm94LlJlc2V0KCk7DQotICAgIGlmIChwRm9udC0+R2V0Q2hhckJCb3god2NoLCBydEJCb3gsIGJNQkNTQ29kZSkpIHsNCi0gICAgICAgIHN3aXRjaCAocEphcENoYXItPnVBbGlnbiAmIDB4RjApIHsNCi0gICAgICAgICAgICBjYXNlIEZYX0pBUENIQVJQUk9QRVJUWUVYX1RvcDoNCi0gICAgICAgICAgICAgICAgcHRPZmZzZXQueSA9IGZGb250U2l6ZSAqICgxMDAwIC0gcnRCQm94LmhlaWdodCkgLyAxMjAwLjBmOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZYX0pBUENIQVJQUk9QRVJUWUVYX01pZGRsZToNCi0gICAgICAgICAgICAgICAgcHRPZmZzZXQueSA9IGZGb250U2l6ZSAqICgxMDAwIC0gcnRCQm94LmhlaWdodCkgLyA2MDAwLjBmOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIHN3aXRjaCAocEphcENoYXItPnVBbGlnbiAmIDB4MEYpIHsNCi0gICAgICAgICAgICBjYXNlIEZYX0pBUENIQVJQUk9QRVJUWUVYX0NlbnRlcjoNCi0gICAgICAgICAgICAgICAgcHRPZmZzZXQueCA9IGZGb250U2l6ZSAqICg2MDAgLSBydEJCb3gucmlnaHQoKSkgLyAxMDAwLjBmOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZYX0pBUENIQVJQUk9QRVJUWUVYX1JpZ2h0Og0KLSAgICAgICAgICAgICAgICBwdE9mZnNldC54ID0gZkZvbnRTaXplICogKDk1MCAtIHJ0QkJveC5yaWdodCgpKSAvIDEwMDAuMGY7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuaCBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuaAppbmRleCAwOGY5NTI4Li42MWQxODEwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF91bmljb2RlLmgKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdW5pY29kZS5oCkBAIC03LDkgKzcsOSBAQAogI2lmbmRlZiBfRkdBU19VTklDT0RFX0lNUA0KICNkZWZpbmUgX0ZHQVNfVU5JQ09ERV9JTVANCiB0eXBlZGVmIHN0cnVjdCBfRlhfVFBPIHsNCi0gICAgaW50MzJfdCBpbmRleDsNCi0gICAgaW50MzJfdCBwb3M7DQorICBpbnQzMl90IGluZGV4Ow0KKyAgaW50MzJfdCBwb3M7DQogfSBGWF9UUE87DQotdHlwZWRlZiBDRlhfTWFzc0FycmF5VGVtcGxhdGU8RlhfVFBPPglDRlhfVFBPQXJyYXk7DQotdm9pZCBGWF9URVhUTEFZT1VUX1BpZWNlU29ydChDRlhfVFBPQXJyYXkgJnRwb3MsIGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlFbmQpOw0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPEZYX1RQTz4gQ0ZYX1RQT0FycmF5Ow0KK3ZvaWQgRlhfVEVYVExBWU9VVF9QaWVjZVNvcnQoQ0ZYX1RQT0FycmF5JiB0cG9zLCBpbnQzMl90IGlTdGFydCwgaW50MzJfdCBpRW5kKTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9kYXRldGltZS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9kYXRldGltZS5jcHAKaW5kZXggOWExZGE0NS4uNjQ2YmRkNiAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfZGF0ZXRpbWUuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2RhdGV0aW1lLmNwcApAQCAtNSw1NDQgKzUsNTQ5IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCi1jb25zdCB1aW50OF90CWdfRlhEYXlzUGVyTW9udGhbMTJdID0gezMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9Ow0KLWNvbnN0IHVpbnQ4X3QJZ19GWERheXNQZXJMZWFwTW9udGhbMTJdID0gezMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9Ow0KLWNvbnN0IGludDMyX3QJZ19GWERheXNCZWZvcmVNb250aFsxMl0gPSB7MCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzR9Ow0KLWNvbnN0IGludDMyX3QJZ19GWERheXNCZWZvcmVMZWFwTW9udGhbMTJdID0gezAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1fTsNCi1jb25zdCBpbnQzMl90CWdfRlhEYXlzUGVyWWVhciA9IDM2NTsNCi1jb25zdCBpbnQzMl90CWdfRlhEYXlzUGVyTGVhcFllYXIgPSAzNjY7DQotY29uc3QgaW50MzJfdAlnX0ZYRGF5c1BlcjRZZWFycyA9IDE0NjE7DQotY29uc3QgaW50MzJfdAlnX0ZYRGF5c1BlcjEwMFllYXJzID0gMzY1MjQ7DQotY29uc3QgaW50MzJfdAlnX0ZYRGF5c1BlcjQwMFllYXJzID0gMTQ2MDk3Ow0KLWNvbnN0IGludDY0X3QJZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCA9IDEwMDA7DQotY29uc3QgaW50NjRfdAlnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlID0gNjAwMDA7DQotY29uc3QgaW50NjRfdAlnX0ZYTWlsbGlzZWNvbmRzUGVySG91ciA9IDM2MDAwMDA7DQotY29uc3QgaW50NjRfdAlnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5ID0gODY0MDAwMDA7DQotI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQotY29uc3QgaW50NjRfdAlnX0ZYTWlsbGlzZWNvbmRzUGVyWWVhciA9IDB4MDc1N0IxMkMwMDsNCi1jb25zdCBpbnQ2NF90CWdfRlhNaWxsaXNlY29uZHNQZXJMZWFwWWVhciA9IDB4MDc1Q0Q3ODgwMDsNCi1jb25zdCBpbnQ2NF90CWdfRlhNaWxsaXNlY29uZHNQZXI0WWVhcnMgPSAweDFENjNFQjBDMDA7DQotY29uc3QgaW50NjRfdAlnX0ZYTWlsbGlzZWNvbmRzUGVyMTAwWWVhcnMgPSAweDAyREVCQ0NERDAwMDsNCi1jb25zdCBpbnQ2NF90CWdfRlhNaWxsaXNlY29uZHNQZXI0MDBZZWFycyA9IDB4MEI3QUY4NUQ5QzAwOw0KK2NvbnN0IHVpbnQ4X3QgZ19GWERheXNQZXJNb250aFsxMl0gPSB7MzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9Ow0KK2NvbnN0IHVpbnQ4X3QgZ19GWERheXNQZXJMZWFwTW9udGhbMTJdID0gezMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX07DQorY29uc3QgaW50MzJfdCBnX0ZYRGF5c0JlZm9yZU1vbnRoWzEyXSA9IHswLCAgIDMxLCAgNTksICA5MCwgIDEyMCwgMTUxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNH07DQorY29uc3QgaW50MzJfdCBnX0ZYRGF5c0JlZm9yZUxlYXBNb250aFsxMl0gPSB7MCwgICAzMSwgIDYwLCAgOTEsICAxMjEsIDE1MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1fTsNCitjb25zdCBpbnQzMl90IGdfRlhEYXlzUGVyWWVhciA9IDM2NTsNCitjb25zdCBpbnQzMl90IGdfRlhEYXlzUGVyTGVhcFllYXIgPSAzNjY7DQorY29uc3QgaW50MzJfdCBnX0ZYRGF5c1BlcjRZZWFycyA9IDE0NjE7DQorY29uc3QgaW50MzJfdCBnX0ZYRGF5c1BlcjEwMFllYXJzID0gMzY1MjQ7DQorY29uc3QgaW50MzJfdCBnX0ZYRGF5c1BlcjQwMFllYXJzID0gMTQ2MDk3Ow0KK2NvbnN0IGludDY0X3QgZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCA9IDEwMDA7DQorY29uc3QgaW50NjRfdCBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlID0gNjAwMDA7DQorY29uc3QgaW50NjRfdCBnX0ZYTWlsbGlzZWNvbmRzUGVySG91ciA9IDM2MDAwMDA7DQorY29uc3QgaW50NjRfdCBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5ID0gODY0MDAwMDA7DQorI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgXA0KKyAgICBfRlhfT1NfID09IF9GWF9XSU42NF8NCitjb25zdCBpbnQ2NF90IGdfRlhNaWxsaXNlY29uZHNQZXJZZWFyID0gMHgwNzU3QjEyQzAwOw0KK2NvbnN0IGludDY0X3QgZ19GWE1pbGxpc2Vjb25kc1BlckxlYXBZZWFyID0gMHgwNzVDRDc4ODAwOw0KK2NvbnN0IGludDY0X3QgZ19GWE1pbGxpc2Vjb25kc1BlcjRZZWFycyA9IDB4MUQ2M0VCMEMwMDsNCitjb25zdCBpbnQ2NF90IGdfRlhNaWxsaXNlY29uZHNQZXIxMDBZZWFycyA9IDB4MDJERUJDQ0REMDAwOw0KK2NvbnN0IGludDY0X3QgZ19GWE1pbGxpc2Vjb25kc1BlcjQwMFllYXJzID0gMHgwQjdBRjg1RDlDMDA7DQogI2VuZGlmDQotRlhfQk9PTCBGWF9Jc0xlYXBZZWFyKGludDMyX3QgaVllYXIpDQotew0KLSAgICBGWFNZU19hc3NlcnQoaVllYXIgIT0gMCk7DQotICAgIHJldHVybiAoKGlZZWFyICUgNCkgPT0gMCAmJiAoaVllYXIgJSAxMDApICE9IDApIHx8IChpWWVhciAlIDQwMCkgPT0gMDsNCitGWF9CT09MIEZYX0lzTGVhcFllYXIoaW50MzJfdCBpWWVhcikgew0KKyAgRlhTWVNfYXNzZXJ0KGlZZWFyICE9IDApOw0KKyAgcmV0dXJuICgoaVllYXIgJSA0KSA9PSAwICYmIChpWWVhciAlIDEwMCkgIT0gMCkgfHwgKGlZZWFyICUgNDAwKSA9PSAwOw0KIH0NCi1pbnQzMl90IEZYX0RheXNJblllYXIoaW50MzJfdCBpWWVhcikNCi17DQotICAgIEZYU1lTX2Fzc2VydChpWWVhciAhPSAwKTsNCi0gICAgcmV0dXJuIEZYX0lzTGVhcFllYXIoaVllYXIpID8gZ19GWERheXNQZXJMZWFwWWVhciA6IGdfRlhEYXlzUGVyWWVhcjsNCitpbnQzMl90IEZYX0RheXNJblllYXIoaW50MzJfdCBpWWVhcikgew0KKyAgRlhTWVNfYXNzZXJ0KGlZZWFyICE9IDApOw0KKyAgcmV0dXJuIEZYX0lzTGVhcFllYXIoaVllYXIpID8gZ19GWERheXNQZXJMZWFwWWVhciA6IGdfRlhEYXlzUGVyWWVhcjsNCiB9DQotdWludDhfdCBGWF9EYXlzSW5Nb250aChpbnQzMl90IGlZZWFyLCB1aW50OF90IGlNb250aCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChpWWVhciAhPSAwKTsNCi0gICAgRlhTWVNfYXNzZXJ0KGlNb250aCA+PSAxICYmIGlNb250aCA8PSAxMik7DQotICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBGWF9Jc0xlYXBZZWFyKGlZZWFyKSA/IGdfRlhEYXlzUGVyTGVhcE1vbnRoIDogZ19GWERheXNQZXJNb250aDsNCi0gICAgcmV0dXJuIHBbaU1vbnRoIC0gMV07DQordWludDhfdCBGWF9EYXlzSW5Nb250aChpbnQzMl90IGlZZWFyLCB1aW50OF90IGlNb250aCkgew0KKyAgRlhTWVNfYXNzZXJ0KGlZZWFyICE9IDApOw0KKyAgRlhTWVNfYXNzZXJ0KGlNb250aCA+PSAxICYmIGlNb250aCA8PSAxMik7DQorICBjb25zdCB1aW50OF90KiBwID0NCisgICAgICBGWF9Jc0xlYXBZZWFyKGlZZWFyKSA/IGdfRlhEYXlzUGVyTGVhcE1vbnRoIDogZ19GWERheXNQZXJNb250aDsNCisgIHJldHVybiBwW2lNb250aCAtIDFdOw0KIH0NCi1zdGF0aWMgaW50MzJfdCBGWF9EYXlzQmVmb3JlTW9udGhJblllYXIoaW50MzJfdCBpWWVhciwgdWludDhfdCBpTW9udGgpDQotew0KLSAgICBGWFNZU19hc3NlcnQoaVllYXIgIT0gMCk7DQotICAgIEZYU1lTX2Fzc2VydChpTW9udGggPj0gMSAmJiBpTW9udGggPD0gMTIpOw0KLSAgICBjb25zdCBpbnQzMl90ICpwID0gRlhfSXNMZWFwWWVhcihpWWVhcikgPyBnX0ZYRGF5c0JlZm9yZUxlYXBNb250aCA6IGdfRlhEYXlzQmVmb3JlTW9udGg7DQotICAgIHJldHVybiBwW2lNb250aCAtIDFdOw0KK3N0YXRpYyBpbnQzMl90IEZYX0RheXNCZWZvcmVNb250aEluWWVhcihpbnQzMl90IGlZZWFyLCB1aW50OF90IGlNb250aCkgew0KKyAgRlhTWVNfYXNzZXJ0KGlZZWFyICE9IDApOw0KKyAgRlhTWVNfYXNzZXJ0KGlNb250aCA+PSAxICYmIGlNb250aCA8PSAxMik7DQorICBjb25zdCBpbnQzMl90KiBwID0NCisgICAgICBGWF9Jc0xlYXBZZWFyKGlZZWFyKSA/IGdfRlhEYXlzQmVmb3JlTGVhcE1vbnRoIDogZ19GWERheXNCZWZvcmVNb250aDsNCisgIHJldHVybiBwW2lNb250aCAtIDFdOw0KIH0NCi1zdGF0aWMgaW50NjRfdCBGWF9EYXRlVG9EYXlzKGludDMyX3QgaVllYXIsIHVpbnQ4X3QgaU1vbnRoLCB1aW50OF90IGlEYXksIEZYX0JPT0wgYkluY2x1ZGVUaGlzRGF5ID0gRkFMU0UpDQotew0KLSAgICBGWFNZU19hc3NlcnQoaVllYXIgIT0gMCk7DQotICAgIEZYU1lTX2Fzc2VydChpTW9udGggPj0gMSAmJiBpTW9udGggPD0gMTIpOw0KLSAgICBGWFNZU19hc3NlcnQoaURheSA+PSAxICYmIGlEYXkgPD0gRlhfRGF5c0luTW9udGgoaVllYXIsIGlNb250aCkpOw0KLSAgICBpbnQ2NF90IGlEYXlzID0gRlhfRGF5c0JlZm9yZU1vbnRoSW5ZZWFyKGlZZWFyLCBpTW9udGgpOw0KLSAgICBpRGF5cyArPSBpRGF5Ow0KLSAgICBpZiAoIWJJbmNsdWRlVGhpc0RheSkgew0KLSAgICAgICAgaURheXMgLS07DQotICAgIH0NCi0gICAgaWYgKGlZZWFyID4gMCkgew0KLSAgICAgICAgaVllYXIgLS07DQorc3RhdGljIGludDY0X3QgRlhfRGF0ZVRvRGF5cyhpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGlEYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmNsdWRlVGhpc0RheSA9IEZBTFNFKSB7DQorICBGWFNZU19hc3NlcnQoaVllYXIgIT0gMCk7DQorICBGWFNZU19hc3NlcnQoaU1vbnRoID49IDEgJiYgaU1vbnRoIDw9IDEyKTsNCisgIEZYU1lTX2Fzc2VydChpRGF5ID49IDEgJiYgaURheSA8PSBGWF9EYXlzSW5Nb250aChpWWVhciwgaU1vbnRoKSk7DQorICBpbnQ2NF90IGlEYXlzID0gRlhfRGF5c0JlZm9yZU1vbnRoSW5ZZWFyKGlZZWFyLCBpTW9udGgpOw0KKyAgaURheXMgKz0gaURheTsNCisgIGlmICghYkluY2x1ZGVUaGlzRGF5KSB7DQorICAgIGlEYXlzLS07DQorICB9DQorICBpZiAoaVllYXIgPiAwKSB7DQorICAgIGlZZWFyLS07DQorICB9IGVsc2Ugew0KKyAgICBpRGF5cyAtPSBGWF9EYXlzSW5ZZWFyKGlZZWFyKTsNCisgICAgaVllYXIrKzsNCisgIH0NCisgIHJldHVybiBpRGF5cyArIChpbnQ2NF90KWlZZWFyICogMzY1ICsgaVllYXIgLyA0IC0gaVllYXIgLyAxMDAgKyBpWWVhciAvIDQwMDsNCit9DQorc3RhdGljIHZvaWQgRlhfRGF5c1RvRGF0ZShpbnQ2NF90IGlEYXlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBpRGF5KSB7DQorICBGWF9CT09MIGJCQyA9IGlEYXlzIDwgMDsNCisgIGlmIChiQkMpIHsNCisgICAgaURheXMgPSAtaURheXM7DQorICB9DQorICBpWWVhciA9IDE7DQorICBpTW9udGggPSAxOw0KKyAgaURheSA9IDE7DQorICBpZiAoaURheXMgPj0gZ19GWERheXNQZXI0MDBZZWFycykgew0KKyAgICBpWWVhciArPSAoaW50MzJfdCkoaURheXMgLyBnX0ZYRGF5c1BlcjQwMFllYXJzICogNDAwKTsNCisgICAgaURheXMgJT0gZ19GWERheXNQZXI0MDBZZWFyczsNCisgIH0NCisgIGlmIChpRGF5cyA+PSBnX0ZYRGF5c1BlcjEwMFllYXJzKSB7DQorICAgIGlmIChpRGF5cyA9PSBnX0ZYRGF5c1BlcjEwMFllYXJzICogNCkgew0KKyAgICAgIGlZZWFyICs9IDMwMDsNCisgICAgICBpRGF5cyAtPSBnX0ZYRGF5c1BlcjEwMFllYXJzICogMzsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIGlEYXlzIC09IEZYX0RheXNJblllYXIoaVllYXIpOw0KLSAgICAgICAgaVllYXIgKys7DQorICAgICAgaVllYXIgKz0gKGludDMyX3QpKGlEYXlzIC8gZ19GWERheXNQZXIxMDBZZWFycyAqIDEwMCk7DQorICAgICAgaURheXMgJT0gZ19GWERheXNQZXIxMDBZZWFyczsNCiAgICAgfQ0KLSAgICByZXR1cm4gaURheXMgKyAoaW50NjRfdClpWWVhciAqIDM2NSArIGlZZWFyIC8gNCAtIGlZZWFyIC8gMTAwICsgaVllYXIgLyA0MDA7DQorICB9DQorICBpZiAoaURheXMgPj0gZ19GWERheXNQZXI0WWVhcnMpIHsNCisgICAgaVllYXIgKz0gKGludDMyX3QpKGlEYXlzIC8gZ19GWERheXNQZXI0WWVhcnMgKiA0KTsNCisgICAgaURheXMgJT0gZ19GWERheXNQZXI0WWVhcnM7DQorICB9DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBpbnQzMl90IGlZZWFyRGF5cyA9IEZYX0RheXNJblllYXIoaVllYXIpOw0KKyAgICBpZiAoaURheXMgPCBpWWVhckRheXMpIHsNCisgICAgICBpZiAoYkJDKSB7DQorICAgICAgICBpWWVhciA9IC1pWWVhcjsNCisgICAgICAgIGlEYXlzID0gaVllYXJEYXlzIC0gaURheXM7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlZZWFyKys7DQorICAgIGlEYXlzIC09IGlZZWFyRGF5czsNCisgIH0NCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGludDMyX3QgaU1vbnRoRGF5cyA9IEZYX0RheXNJbk1vbnRoKGlZZWFyLCBpTW9udGgpOw0KKyAgICBpZiAoaURheXMgPCBpTW9udGhEYXlzKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaU1vbnRoKys7DQorICAgIGlEYXlzIC09IGlNb250aERheXM7DQorICB9DQorICBpRGF5ICs9ICh1aW50OF90KWlEYXlzOw0KIH0NCi1zdGF0aWMgdm9pZCBGWF9EYXlzVG9EYXRlKGludDY0X3QgaURheXMsIGludDMyX3QgJmlZZWFyLCB1aW50OF90ICZpTW9udGgsIHVpbnQ4X3QgJmlEYXkpDQotew0KLSAgICBGWF9CT09MIGJCQyA9IGlEYXlzIDwgMDsNCi0gICAgaWYgKGJCQykgew0KLSAgICAgICAgaURheXMgPSAtaURheXM7DQotICAgIH0NCi0gICAgaVllYXIgPSAxOw0KLSAgICBpTW9udGggPSAxOw0KLSAgICBpRGF5ID0gMTsNCi0gICAgaWYgKGlEYXlzID49IGdfRlhEYXlzUGVyNDAwWWVhcnMpIHsNCi0gICAgICAgIGlZZWFyICs9IChpbnQzMl90KShpRGF5cyAvIGdfRlhEYXlzUGVyNDAwWWVhcnMgKiA0MDApOw0KLSAgICAgICAgaURheXMgJT0gZ19GWERheXNQZXI0MDBZZWFyczsNCi0gICAgfQ0KLSAgICBpZiAoaURheXMgPj0gZ19GWERheXNQZXIxMDBZZWFycykgew0KLSAgICAgICAgaWYgKGlEYXlzID09IGdfRlhEYXlzUGVyMTAwWWVhcnMgKiA0KSB7DQotICAgICAgICAgICAgaVllYXIgKz0gMzAwOw0KLSAgICAgICAgICAgIGlEYXlzIC09IGdfRlhEYXlzUGVyMTAwWWVhcnMgKiAzOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpWWVhciArPSAoaW50MzJfdCkoaURheXMgLyBnX0ZYRGF5c1BlcjEwMFllYXJzICogMTAwKTsNCi0gICAgICAgICAgICBpRGF5cyAlPSBnX0ZYRGF5c1BlcjEwMFllYXJzOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChpRGF5cyA+PSBnX0ZYRGF5c1BlcjRZZWFycykgew0KLSAgICAgICAgaVllYXIgKz0gKGludDMyX3QpKGlEYXlzIC8gZ19GWERheXNQZXI0WWVhcnMgKiA0KTsNCi0gICAgICAgIGlEYXlzICU9IGdfRlhEYXlzUGVyNFllYXJzOw0KLSAgICB9DQotICAgIHdoaWxlIChUUlVFKSB7DQotICAgICAgICBpbnQzMl90IGlZZWFyRGF5cyA9IEZYX0RheXNJblllYXIoaVllYXIpOw0KLSAgICAgICAgaWYgKGlEYXlzIDwgaVllYXJEYXlzKSB7DQotICAgICAgICAgICAgaWYgKGJCQykgew0KLSAgICAgICAgICAgICAgICBpWWVhciA9IC1pWWVhcjsNCi0gICAgICAgICAgICAgICAgaURheXMgPSBpWWVhckRheXMgLSBpRGF5czsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpWWVhciArKzsNCi0gICAgICAgIGlEYXlzIC09IGlZZWFyRGF5czsNCi0gICAgfQ0KLSAgICB3aGlsZSAoVFJVRSkgew0KLSAgICAgICAgaW50MzJfdCBpTW9udGhEYXlzID0gRlhfRGF5c0luTW9udGgoaVllYXIsIGlNb250aCk7DQotICAgICAgICBpZiAoaURheXMgPCBpTW9udGhEYXlzKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpTW9udGggKys7DQotICAgICAgICBpRGF5cyAtPSBpTW9udGhEYXlzOw0KLSAgICB9DQotICAgIGlEYXkgKz0gKHVpbnQ4X3QpaURheXM7DQotfQ0KLSNpZiBfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9BTkRST0lEXyB8fCBfRlhfT1NfID09IF9GWF9NQUNPU1hfIHx8IF9GWF9PU18gPT0gX0ZYX0lPU18NCisjaWYgX0ZYX09TXyA9PSBfRlhfTElOVVhfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8gfHwgXA0KKyAgICBfRlhfT1NfID09IF9GWF9NQUNPU1hfIHx8IF9GWF9PU18gPT0gX0ZYX0lPU18NCiAjaW5jbHVkZSA8dGltZS5oPg0KICNpbmNsdWRlIDxzeXMvdGltZS5oPg0KICNlbmRpZg0KIHR5cGVkZWYgc3RydWN0IF9GWFVUX1NZU1RFTVRJTUUgew0KLSAgICBGWF9XT1JEIHdZZWFyOw0KLSAgICBGWF9XT1JEIHdNb250aDsNCi0gICAgRlhfV09SRCB3RGF5T2ZXZWVrOw0KLSAgICBGWF9XT1JEIHdEYXk7DQotICAgIEZYX1dPUkQgd0hvdXI7DQotICAgIEZYX1dPUkQgd01pbnV0ZTsNCi0gICAgRlhfV09SRCB3U2Vjb25kOw0KLSAgICBGWF9XT1JEIHdNaWxsaXNlY29uZHM7DQorICBGWF9XT1JEIHdZZWFyOw0KKyAgRlhfV09SRCB3TW9udGg7DQorICBGWF9XT1JEIHdEYXlPZldlZWs7DQorICBGWF9XT1JEIHdEYXk7DQorICBGWF9XT1JEIHdIb3VyOw0KKyAgRlhfV09SRCB3TWludXRlOw0KKyAgRlhfV09SRCB3U2Vjb25kOw0KKyAgRlhfV09SRCB3TWlsbGlzZWNvbmRzOw0KIH0gRlhVVF9TWVNURU1USU1FOw0KLXZvaWQgQ0ZYX1VuaXRpbWU6Ok5vdygpDQotew0KLSAgICBGWFVUX1NZU1RFTVRJTUUgdXRMb2NhbDsNCi0jaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8NCi0gICAgOjpHZXRMb2NhbFRpbWUoKExQU1lTVEVNVElNRSkmdXRMb2NhbCk7DQordm9pZCBDRlhfVW5pdGltZTo6Tm93KCkgew0KKyAgRlhVVF9TWVNURU1USU1FIHV0TG9jYWw7DQorI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgXA0KKyAgICBfRlhfT1NfID09IF9GWF9XSU42NF8NCisgIDo6R2V0TG9jYWxUaW1lKChMUFNZU1RFTVRJTUUpJnV0TG9jYWwpOw0KICNlbGlmIF9GWF9PU18gIT0gX0ZYX0VNQkVEREVEXw0KICNpZiAxDQotICAgIHRpbWV2YWwgY3VyVGltZTsNCi0gICAgZ2V0dGltZW9mZGF5KCZjdXJUaW1lLCBOVUxMKTsNCisgIHRpbWV2YWwgY3VyVGltZTsNCisgIGdldHRpbWVvZmRheSgmY3VyVGltZSwgTlVMTCk7DQogI2Vsc2UNCi0gICAgc3RydWN0IHRpbWVzcGVjIGN1clRpbWU7DQotICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCAmY3VyVGltZSk7DQorICBzdHJ1Y3QgdGltZXNwZWMgY3VyVGltZTsNCisgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCAmY3VyVGltZSk7DQogI2VuZGlmDQotICAgIHN0cnVjdCB0bSBzdDsNCi0gICAgbG9jYWx0aW1lX3IoJmN1clRpbWUudHZfc2VjLCAmc3QpOw0KLSAgICB1dExvY2FsLndZZWFyID0gc3QudG1feWVhciArIDE5MDA7DQotICAgIHV0TG9jYWwud01vbnRoID0gc3QudG1fbW9uICsgMTsNCi0gICAgdXRMb2NhbC53RGF5T2ZXZWVrID0gc3QudG1fd2RheTsNCi0gICAgdXRMb2NhbC53RGF5ID0gc3QudG1fbWRheTsNCi0gICAgdXRMb2NhbC53SG91ciA9IHN0LnRtX2hvdXI7DQotICAgIHV0TG9jYWwud01pbnV0ZSA9IHN0LnRtX21pbjsNCi0gICAgdXRMb2NhbC53U2Vjb25kID0gc3QudG1fc2VjOw0KLSAgICB1dExvY2FsLndNaWxsaXNlY29uZHMgPSBjdXJUaW1lLnR2X3VzZWMgLyAxMDAwOw0KKyAgc3RydWN0IHRtIHN0Ow0KKyAgbG9jYWx0aW1lX3IoJmN1clRpbWUudHZfc2VjLCAmc3QpOw0KKyAgdXRMb2NhbC53WWVhciA9IHN0LnRtX3llYXIgKyAxOTAwOw0KKyAgdXRMb2NhbC53TW9udGggPSBzdC50bV9tb24gKyAxOw0KKyAgdXRMb2NhbC53RGF5T2ZXZWVrID0gc3QudG1fd2RheTsNCisgIHV0TG9jYWwud0RheSA9IHN0LnRtX21kYXk7DQorICB1dExvY2FsLndIb3VyID0gc3QudG1faG91cjsNCisgIHV0TG9jYWwud01pbnV0ZSA9IHN0LnRtX21pbjsNCisgIHV0TG9jYWwud1NlY29uZCA9IHN0LnRtX3NlYzsNCisgIHV0TG9jYWwud01pbGxpc2Vjb25kcyA9IGN1clRpbWUudHZfdXNlYyAvIDEwMDA7DQogI2VuZGlmDQotICAgIFNldCh1dExvY2FsLndZZWFyLCAodWludDhfdCl1dExvY2FsLndNb250aCwgKHVpbnQ4X3QpdXRMb2NhbC53RGF5LA0KLSAgICAgICAgKHVpbnQ4X3QpdXRMb2NhbC53SG91ciwgKHVpbnQ4X3QpdXRMb2NhbC53TWludXRlLCAodWludDhfdCl1dExvY2FsLndTZWNvbmQsIChGWF9XT1JEKXV0TG9jYWwud01pbGxpc2Vjb25kcyk7DQorICBTZXQodXRMb2NhbC53WWVhciwgKHVpbnQ4X3QpdXRMb2NhbC53TW9udGgsICh1aW50OF90KXV0TG9jYWwud0RheSwNCisgICAgICAodWludDhfdCl1dExvY2FsLndIb3VyLCAodWludDhfdCl1dExvY2FsLndNaW51dGUsDQorICAgICAgKHVpbnQ4X3QpdXRMb2NhbC53U2Vjb25kLCAoRlhfV09SRCl1dExvY2FsLndNaWxsaXNlY29uZHMpOw0KIH0NCi12b2lkIENGWF9Vbml0aW1lOjpTZXRHTVRpbWUoKQ0KLXsNCi0gICAgRlhVVF9TWVNURU1USU1FIHV0TG9jYWw7DQotI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQotICAgIDo6R2V0U3lzdGVtVGltZSgoTFBTWVNURU1USU1FKSZ1dExvY2FsKTsNCit2b2lkIENGWF9Vbml0aW1lOjpTZXRHTVRpbWUoKSB7DQorICBGWFVUX1NZU1RFTVRJTUUgdXRMb2NhbDsNCisjaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBcDQorICAgIF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KKyAgOjpHZXRTeXN0ZW1UaW1lKChMUFNZU1RFTVRJTUUpJnV0TG9jYWwpOw0KICNlbGlmIF9GWF9PU18gIT0gX0ZYX0VNQkVEREVEXw0KICNpZiAxDQotICAgIHRpbWV2YWwgY3VyVGltZTsNCi0gICAgZ2V0dGltZW9mZGF5KCZjdXJUaW1lLCBOVUxMKTsNCisgIHRpbWV2YWwgY3VyVGltZTsNCisgIGdldHRpbWVvZmRheSgmY3VyVGltZSwgTlVMTCk7DQogI2Vsc2UNCi0gICAgc3RydWN0IHRpbWVzcGVjIGN1clRpbWU7DQotICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCAmY3VyVGltZSk7DQorICBzdHJ1Y3QgdGltZXNwZWMgY3VyVGltZTsNCisgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCAmY3VyVGltZSk7DQogI2VuZGlmDQotICAgIHN0cnVjdCB0bSBzdDsNCi0gICAgZ210aW1lX3IoJmN1clRpbWUudHZfc2VjLCAmc3QpOw0KLSAgICB1dExvY2FsLndZZWFyID0gc3QudG1feWVhciArIDE5MDA7DQotICAgIHV0TG9jYWwud01vbnRoID0gc3QudG1fbW9uICsgMTsNCi0gICAgdXRMb2NhbC53RGF5T2ZXZWVrID0gc3QudG1fd2RheTsNCi0gICAgdXRMb2NhbC53RGF5ID0gc3QudG1fbWRheTsNCi0gICAgdXRMb2NhbC53SG91ciA9IHN0LnRtX2hvdXI7DQotICAgIHV0TG9jYWwud01pbnV0ZSA9IHN0LnRtX21pbjsNCi0gICAgdXRMb2NhbC53U2Vjb25kID0gc3QudG1fc2VjOw0KLSAgICB1dExvY2FsLndNaWxsaXNlY29uZHMgPSBjdXJUaW1lLnR2X3VzZWMgLyAxMDAwOw0KKyAgc3RydWN0IHRtIHN0Ow0KKyAgZ210aW1lX3IoJmN1clRpbWUudHZfc2VjLCAmc3QpOw0KKyAgdXRMb2NhbC53WWVhciA9IHN0LnRtX3llYXIgKyAxOTAwOw0KKyAgdXRMb2NhbC53TW9udGggPSBzdC50bV9tb24gKyAxOw0KKyAgdXRMb2NhbC53RGF5T2ZXZWVrID0gc3QudG1fd2RheTsNCisgIHV0TG9jYWwud0RheSA9IHN0LnRtX21kYXk7DQorICB1dExvY2FsLndIb3VyID0gc3QudG1faG91cjsNCisgIHV0TG9jYWwud01pbnV0ZSA9IHN0LnRtX21pbjsNCisgIHV0TG9jYWwud1NlY29uZCA9IHN0LnRtX3NlYzsNCisgIHV0TG9jYWwud01pbGxpc2Vjb25kcyA9IGN1clRpbWUudHZfdXNlYyAvIDEwMDA7DQogI2VuZGlmDQotICAgIFNldCh1dExvY2FsLndZZWFyLCAodWludDhfdCl1dExvY2FsLndNb250aCwgKHVpbnQ4X3QpdXRMb2NhbC53RGF5LA0KLSAgICAgICAgKHVpbnQ4X3QpdXRMb2NhbC53SG91ciwgKHVpbnQ4X3QpdXRMb2NhbC53TWludXRlLCAodWludDhfdCl1dExvY2FsLndTZWNvbmQsIChGWF9XT1JEKXV0TG9jYWwud01pbGxpc2Vjb25kcyk7DQorICBTZXQodXRMb2NhbC53WWVhciwgKHVpbnQ4X3QpdXRMb2NhbC53TW9udGgsICh1aW50OF90KXV0TG9jYWwud0RheSwNCisgICAgICAodWludDhfdCl1dExvY2FsLndIb3VyLCAodWludDhfdCl1dExvY2FsLndNaW51dGUsDQorICAgICAgKHVpbnQ4X3QpdXRMb2NhbC53U2Vjb25kLCAoRlhfV09SRCl1dExvY2FsLndNaWxsaXNlY29uZHMpOw0KIH0NCi12b2lkIENGWF9Vbml0aW1lOjpTZXQoaW50MzJfdCB5ZWFyLCB1aW50OF90IG1vbnRoLCB1aW50OF90IGRheSwgdWludDhfdCBob3VyLCB1aW50OF90IG1pbnV0ZSwgdWludDhfdCBzZWNvbmQsIEZYX1dPUkQgbWlsbGlzZWNvbmQpDQotew0KLSAgICBGWFNZU19hc3NlcnQoaG91ciA8PSAyMyk7DQotICAgIEZYU1lTX2Fzc2VydChtaW51dGUgPD0gNTkpOw0KLSAgICBGWFNZU19hc3NlcnQoc2Vjb25kIDw9IDU5KTsNCi0gICAgRlhTWVNfYXNzZXJ0KG1pbGxpc2Vjb25kIDw9IDk5OSk7DQotICAgIG1faVVuaXRpbWUgPSAoaW50NjRfdClob3VyICogZ19GWE1pbGxpc2Vjb25kc1BlckhvdXIgKyAoaW50NjRfdCltaW51dGUgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlICsgKGludDY0X3Qpc2Vjb25kICogZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCArIG1pbGxpc2Vjb25kOw0KLSAgICBpZiAoeWVhciA+IDApIHsNCi0gICAgICAgIG1faVVuaXRpbWUgPSBtX2lVbml0aW1lICsgRlhfRGF0ZVRvRGF5cyh5ZWFyLCBtb250aCwgZGF5LCBGQUxTRSkgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KLSAgICB9DQordm9pZCBDRlhfVW5pdGltZTo6U2V0KGludDMyX3QgeWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXksDQorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaG91ciwNCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtaW51dGUsDQorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Vjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIG1pbGxpc2Vjb25kKSB7DQorICBGWFNZU19hc3NlcnQoaG91ciA8PSAyMyk7DQorICBGWFNZU19hc3NlcnQobWludXRlIDw9IDU5KTsNCisgIEZYU1lTX2Fzc2VydChzZWNvbmQgPD0gNTkpOw0KKyAgRlhTWVNfYXNzZXJ0KG1pbGxpc2Vjb25kIDw9IDk5OSk7DQorICBtX2lVbml0aW1lID0gKGludDY0X3QpaG91ciAqIGdfRlhNaWxsaXNlY29uZHNQZXJIb3VyICsNCisgICAgICAgICAgICAgICAoaW50NjRfdCltaW51dGUgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlICsNCisgICAgICAgICAgICAgICAoaW50NjRfdClzZWNvbmQgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kICsgbWlsbGlzZWNvbmQ7DQorICBpZiAoeWVhciA+IDApIHsNCisgICAgbV9pVW5pdGltZSA9DQorICAgICAgICBtX2lVbml0aW1lICsNCisgICAgICAgIEZYX0RhdGVUb0RheXMoeWVhciwgbW9udGgsIGRheSwgRkFMU0UpICogZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCisgIH0NCiB9DQotdm9pZCBDRlhfVW5pdGltZTo6U2V0KEZYX1VOSVRJTUUgdCkNCi17DQotICAgIG1faVVuaXRpbWUgPSB0Ow0KK3ZvaWQgQ0ZYX1VuaXRpbWU6OlNldChGWF9VTklUSU1FIHQpIHsNCisgIG1faVVuaXRpbWUgPSB0Ow0KIH0NCi1pbnQzMl90IENGWF9Vbml0aW1lOjpHZXRZZWFyKCkgY29uc3QNCi17DQotICAgIGludDMyX3QgaVllYXI7DQotICAgIHVpbnQ4X3QgaU1vbnRoLCBpRGF5Ow0KLSAgICBGWF9EYXlzVG9EYXRlKEdldERheU9mQUQoKSwgaVllYXIsIGlNb250aCwgaURheSk7DQotICAgIHJldHVybiBpWWVhcjsNCitpbnQzMl90IENGWF9Vbml0aW1lOjpHZXRZZWFyKCkgY29uc3Qgew0KKyAgaW50MzJfdCBpWWVhcjsNCisgIHVpbnQ4X3QgaU1vbnRoLCBpRGF5Ow0KKyAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgcmV0dXJuIGlZZWFyOw0KIH0NCi11aW50OF90IENGWF9Vbml0aW1lOjpHZXRNb250aCgpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGlZZWFyOw0KLSAgICB1aW50OF90IGlNb250aCwgaURheTsNCi0gICAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KLSAgICByZXR1cm4gaU1vbnRoOw0KK3VpbnQ4X3QgQ0ZYX1VuaXRpbWU6OkdldE1vbnRoKCkgY29uc3Qgew0KKyAgaW50MzJfdCBpWWVhcjsNCisgIHVpbnQ4X3QgaU1vbnRoLCBpRGF5Ow0KKyAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgcmV0dXJuIGlNb250aDsNCiB9DQotdWludDhfdCBDRlhfVW5pdGltZTo6R2V0RGF5KCkgY29uc3QNCi17DQotICAgIGludDMyX3QgaVllYXI7DQotICAgIHVpbnQ4X3QgaU1vbnRoLCBpRGF5Ow0KLSAgICBGWF9EYXlzVG9EYXRlKEdldERheU9mQUQoKSwgaVllYXIsIGlNb250aCwgaURheSk7DQotICAgIHJldHVybiBpRGF5Ow0KK3VpbnQ4X3QgQ0ZYX1VuaXRpbWU6OkdldERheSgpIGNvbnN0IHsNCisgIGludDMyX3QgaVllYXI7DQorICB1aW50OF90IGlNb250aCwgaURheTsNCisgIEZYX0RheXNUb0RhdGUoR2V0RGF5T2ZBRCgpLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgIHJldHVybiBpRGF5Ow0KIH0NCi1GWF9XRUVLREFZIENGWF9Vbml0aW1lOjpHZXREYXlPZldlZWsoKSBjb25zdA0KLXsNCi0gICAgaW50MzJfdCB2ID0gKGludDMyX3QpKChtX2lVbml0aW1lIC8gZ19GWE1pbGxpc2Vjb25kc1BlckRheSArIDEpICUgNyk7DQotICAgIGlmICh2IDwgMCkgew0KLSAgICAgICAgdiArPSA3Ow0KLSAgICB9DQotICAgIHJldHVybiAoRlhfV0VFS0RBWSl2Ow0KK0ZYX1dFRUtEQVkgQ0ZYX1VuaXRpbWU6OkdldERheU9mV2VlaygpIGNvbnN0IHsNCisgIGludDMyX3QgdiA9IChpbnQzMl90KSgobV9pVW5pdGltZSAvIGdfRlhNaWxsaXNlY29uZHNQZXJEYXkgKyAxKSAlIDcpOw0KKyAgaWYgKHYgPCAwKSB7DQorICAgIHYgKz0gNzsNCisgIH0NCisgIHJldHVybiAoRlhfV0VFS0RBWSl2Ow0KIH0NCi1GWF9XT1JEIENGWF9Vbml0aW1lOjpHZXREYXlPZlllYXIoKSBjb25zdA0KLXsNCi0gICAgaW50MzJfdCBpWWVhcjsNCi0gICAgdWludDhfdCBpTW9udGgsIGlEYXk7DQotICAgIEZYX0RheXNUb0RhdGUoR2V0RGF5T2ZBRCgpLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCi0gICAgcmV0dXJuIEZYX0RheXNCZWZvcmVNb250aEluWWVhcihpWWVhciwgaU1vbnRoKSArIGlEYXk7DQorRlhfV09SRCBDRlhfVW5pdGltZTo6R2V0RGF5T2ZZZWFyKCkgY29uc3Qgew0KKyAgaW50MzJfdCBpWWVhcjsNCisgIHVpbnQ4X3QgaU1vbnRoLCBpRGF5Ow0KKyAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgcmV0dXJuIEZYX0RheXNCZWZvcmVNb250aEluWWVhcihpWWVhciwgaU1vbnRoKSArIGlEYXk7DQogfQ0KLWludDY0X3QgQ0ZYX1VuaXRpbWU6OkdldERheU9mQUQoKSBjb25zdA0KLXsNCi0gICAgRlhfQk9PTCBiQkMgPSBtX2lVbml0aW1lIDwgMDsNCi0gICAgaW50NjRfdCBpRGF5cyA9IG1faVVuaXRpbWUgLyBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KLSAgICBpRGF5cyArPSBiQkMgPyAtMSA6IDA7DQotICAgIGlmIChiQkMgJiYgKG1faVVuaXRpbWUgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5KSA9PSAwKSB7DQotICAgICAgICBpRGF5cyArKzsNCi0gICAgfQ0KLSAgICByZXR1cm4gaURheXM7DQoraW50NjRfdCBDRlhfVW5pdGltZTo6R2V0RGF5T2ZBRCgpIGNvbnN0IHsNCisgIEZYX0JPT0wgYkJDID0gbV9pVW5pdGltZSA8IDA7DQorICBpbnQ2NF90IGlEYXlzID0gbV9pVW5pdGltZSAvIGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7DQorICBpRGF5cyArPSBiQkMgPyAtMSA6IDA7DQorICBpZiAoYkJDICYmIChtX2lVbml0aW1lICUgZ19GWE1pbGxpc2Vjb25kc1BlckRheSkgPT0gMCkgew0KKyAgICBpRGF5cysrOw0KKyAgfQ0KKyAgcmV0dXJuIGlEYXlzOw0KIH0NCi11aW50OF90IENGWF9Vbml0aW1lOjpHZXRIb3VyKCkgY29uc3QNCi17DQotICAgIGludDMyX3QgdiA9IChpbnQzMl90KShtX2lVbml0aW1lICUgZ19GWE1pbGxpc2Vjb25kc1BlckRheSk7DQotICAgIGlmICh2IDwgMCkgew0KLSAgICAgICAgdiArPSBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KLSAgICB9DQotICAgIHJldHVybiAodWludDhfdCkodiAvIGdfRlhNaWxsaXNlY29uZHNQZXJIb3VyKTsNCit1aW50OF90IENGWF9Vbml0aW1lOjpHZXRIb3VyKCkgY29uc3Qgew0KKyAgaW50MzJfdCB2ID0gKGludDMyX3QpKG1faVVuaXRpbWUgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5KTsNCisgIGlmICh2IDwgMCkgew0KKyAgICB2ICs9IGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7DQorICB9DQorICByZXR1cm4gKHVpbnQ4X3QpKHYgLyBnX0ZYTWlsbGlzZWNvbmRzUGVySG91cik7DQogfQ0KLXVpbnQ4X3QgQ0ZYX1VuaXRpbWU6OkdldE1pbnV0ZSgpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IHYgPSAoaW50MzJfdCkobV9pVW5pdGltZSAlIGdfRlhNaWxsaXNlY29uZHNQZXJIb3VyKTsNCi0gICAgaWYgKHYgPCAwKSB7DQotICAgICAgICB2ICs9IGdfRlhNaWxsaXNlY29uZHNQZXJIb3VyOw0KLSAgICB9DQotICAgIHJldHVybiAodWludDhfdCkodiAvIGdfRlhNaWxsaXNlY29uZHNQZXJNaW51dGUpOw0KK3VpbnQ4X3QgQ0ZYX1VuaXRpbWU6OkdldE1pbnV0ZSgpIGNvbnN0IHsNCisgIGludDMyX3QgdiA9IChpbnQzMl90KShtX2lVbml0aW1lICUgZ19GWE1pbGxpc2Vjb25kc1BlckhvdXIpOw0KKyAgaWYgKHYgPCAwKSB7DQorICAgIHYgKz0gZ19GWE1pbGxpc2Vjb25kc1BlckhvdXI7DQorICB9DQorICByZXR1cm4gKHVpbnQ4X3QpKHYgLyBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlKTsNCiB9DQotdWludDhfdCBDRlhfVW5pdGltZTo6R2V0U2Vjb25kKCkgY29uc3QNCi17DQotICAgIGludDMyX3QgdiA9IChpbnQzMl90KShtX2lVbml0aW1lICUgZ19GWE1pbGxpc2Vjb25kc1Blck1pbnV0ZSk7DQotICAgIGlmICh2IDwgMCkgew0KLSAgICAgICAgdiArPSBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlOw0KLSAgICB9DQotICAgIHJldHVybiAodWludDhfdCkodiAvIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQpOw0KK3VpbnQ4X3QgQ0ZYX1VuaXRpbWU6OkdldFNlY29uZCgpIGNvbnN0IHsNCisgIGludDMyX3QgdiA9IChpbnQzMl90KShtX2lVbml0aW1lICUgZ19GWE1pbGxpc2Vjb25kc1Blck1pbnV0ZSk7DQorICBpZiAodiA8IDApIHsNCisgICAgdiArPSBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlOw0KKyAgfQ0KKyAgcmV0dXJuICh1aW50OF90KSh2IC8gZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCk7DQogfQ0KLUZYX1dPUkQgQ0ZYX1VuaXRpbWU6OkdldE1pbGxpc2Vjb25kKCkgY29uc3QNCi17DQotICAgIGludDMyX3QgdiA9IChpbnQzMl90KShtX2lVbml0aW1lICUgZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCk7DQotICAgIGlmICh2IDwgMCkgew0KLSAgICAgICAgdiArPSBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kOw0KLSAgICB9DQotICAgIHJldHVybiAoRlhfV09SRCl2Ow0KK0ZYX1dPUkQgQ0ZYX1VuaXRpbWU6OkdldE1pbGxpc2Vjb25kKCkgY29uc3Qgew0KKyAgaW50MzJfdCB2ID0gKGludDMyX3QpKG1faVVuaXRpbWUgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kKTsNCisgIGlmICh2IDwgMCkgew0KKyAgICB2ICs9IGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQ7DQorICB9DQorICByZXR1cm4gKEZYX1dPUkQpdjsNCiB9DQotRlhfQk9PTCBDRlhfVW5pdGltZTo6QWRkWWVhcnMoaW50MzJfdCBpWWVhcnMpDQotew0KLSAgICBGWF9VTklUSU1FIHV0ID0gbV9pVW5pdGltZTsNCi0gICAgaWYgKHV0IDwgMCkgew0KLSAgICAgICAgdXQgPSAtdXQ7DQotICAgIH0NCi0gICAgRlhfVU5JVElNRSByID0gdXQgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KLSAgICBpbnQzMl90IGlZZWFyOw0KLSAgICB1aW50OF90IGlNb250aCwgaURheTsNCi0gICAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KLSAgICBpWWVhciArPSBpWWVhcnM7DQotICAgIGlmIChpWWVhciA9PSAwKSB7DQotICAgICAgICBpWWVhciA9IGlZZWFycyA+IDAgPyAxIDogLTE7DQotICAgIH0NCi0gICAgbV9pVW5pdGltZSA9IEZYX0RhdGVUb0RheXMoaVllYXIsIGlNb250aCwgaURheSwgRkFMU0UpICogZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCi0gICAgbV9pVW5pdGltZSArPSAoaVllYXIgPCAwKSA/IC1yIDogcjsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDRlhfVW5pdGltZTo6QWRkWWVhcnMoaW50MzJfdCBpWWVhcnMpIHsNCisgIEZYX1VOSVRJTUUgdXQgPSBtX2lVbml0aW1lOw0KKyAgaWYgKHV0IDwgMCkgew0KKyAgICB1dCA9IC11dDsNCisgIH0NCisgIEZYX1VOSVRJTUUgciA9IHV0ICUgZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCisgIGludDMyX3QgaVllYXI7DQorICB1aW50OF90IGlNb250aCwgaURheTsNCisgIEZYX0RheXNUb0RhdGUoR2V0RGF5T2ZBRCgpLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgIGlZZWFyICs9IGlZZWFyczsNCisgIGlmIChpWWVhciA9PSAwKSB7DQorICAgIGlZZWFyID0gaVllYXJzID4gMCA/IDEgOiAtMTsNCisgIH0NCisgIG1faVVuaXRpbWUgPQ0KKyAgICAgIEZYX0RhdGVUb0RheXMoaVllYXIsIGlNb250aCwgaURheSwgRkFMU0UpICogZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCisgIG1faVVuaXRpbWUgKz0gKGlZZWFyIDwgMCkgPyAtciA6IHI7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfVW5pdGltZTo6QWRkTW9udGhzKGludDMyX3QgaU1vbnRocykNCi17DQotICAgIEZYX0JPT0wgYiA9IGlNb250aHMgPiAwOw0KLSAgICBGWF9VTklUSU1FIHV0ID0gbV9pVW5pdGltZTsNCi0gICAgaWYgKHV0IDwgMCkgew0KLSAgICAgICAgdXQgPSAtdXQ7DQotICAgIH0NCi0gICAgRlhfVU5JVElNRSByID0gdXQgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KLSAgICBpbnQzMl90IGlZZWFyOw0KLSAgICB1aW50OF90IGlNb250aCwgaURheTsNCi0gICAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KLSAgICBpTW9udGhzICs9IGlNb250aDsNCi0gICAgd2hpbGUgKGlNb250aHMgPCAxKSB7DQotICAgICAgICBpWWVhciAtLSwgaU1vbnRocyArPSAxMjsNCi0gICAgfQ0KLSAgICB3aGlsZSAoaU1vbnRocyA+IDEyKSB7DQotICAgICAgICBpWWVhciArKywgaU1vbnRocyAtPSAxMjsNCi0gICAgfQ0KLSAgICBpZiAoaVllYXIgPT0gMCkgew0KLSAgICAgICAgaVllYXIgPSBiID8gMSA6IC0xOw0KLSAgICB9DQotICAgIG1faVVuaXRpbWUgPSBGWF9EYXRlVG9EYXlzKGlZZWFyLCAodWludDhfdClpTW9udGhzLCBpRGF5LCBGQUxTRSkgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KLSAgICBtX2lVbml0aW1lICs9IChpWWVhciA8IDApID8gLXIgOiByOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9Vbml0aW1lOjpBZGRNb250aHMoaW50MzJfdCBpTW9udGhzKSB7DQorICBGWF9CT09MIGIgPSBpTW9udGhzID4gMDsNCisgIEZYX1VOSVRJTUUgdXQgPSBtX2lVbml0aW1lOw0KKyAgaWYgKHV0IDwgMCkgew0KKyAgICB1dCA9IC11dDsNCisgIH0NCisgIEZYX1VOSVRJTUUgciA9IHV0ICUgZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCisgIGludDMyX3QgaVllYXI7DQorICB1aW50OF90IGlNb250aCwgaURheTsNCisgIEZYX0RheXNUb0RhdGUoR2V0RGF5T2ZBRCgpLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgIGlNb250aHMgKz0gaU1vbnRoOw0KKyAgd2hpbGUgKGlNb250aHMgPCAxKSB7DQorICAgIGlZZWFyLS0sIGlNb250aHMgKz0gMTI7DQorICB9DQorICB3aGlsZSAoaU1vbnRocyA+IDEyKSB7DQorICAgIGlZZWFyKyssIGlNb250aHMgLT0gMTI7DQorICB9DQorICBpZiAoaVllYXIgPT0gMCkgew0KKyAgICBpWWVhciA9IGIgPyAxIDogLTE7DQorICB9DQorICBtX2lVbml0aW1lID0gRlhfRGF0ZVRvRGF5cyhpWWVhciwgKHVpbnQ4X3QpaU1vbnRocywgaURheSwgRkFMU0UpICoNCisgICAgICAgICAgICAgICBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KKyAgbV9pVW5pdGltZSArPSAoaVllYXIgPCAwKSA/IC1yIDogcjsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9Vbml0aW1lOjpBZGREYXlzKGludDMyX3QgaURheXMpDQotew0KLSAgICBtX2lVbml0aW1lICs9IChpbnQ2NF90KWlEYXlzICogZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDRlhfVW5pdGltZTo6QWRkRGF5cyhpbnQzMl90IGlEYXlzKSB7DQorICBtX2lVbml0aW1lICs9IChpbnQ2NF90KWlEYXlzICogZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9Vbml0aW1lOjpBZGRIb3VycyhpbnQzMl90IGlIb3VycykNCi17DQotICAgIG1faVVuaXRpbWUgKz0gKGludDY0X3QpaUhvdXJzICogZ19GWE1pbGxpc2Vjb25kc1BlckhvdXI7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX1VuaXRpbWU6OkFkZEhvdXJzKGludDMyX3QgaUhvdXJzKSB7DQorICBtX2lVbml0aW1lICs9IChpbnQ2NF90KWlIb3VycyAqIGdfRlhNaWxsaXNlY29uZHNQZXJIb3VyOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX1VuaXRpbWU6OkFkZE1pbnV0ZXMoaW50MzJfdCBpTWludXRlcykNCi17DQotICAgIG1faVVuaXRpbWUgKz0gKGludDY0X3QpaU1pbnV0ZXMgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9Vbml0aW1lOjpBZGRNaW51dGVzKGludDMyX3QgaU1pbnV0ZXMpIHsNCisgIG1faVVuaXRpbWUgKz0gKGludDY0X3QpaU1pbnV0ZXMgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX1VuaXRpbWU6OkFkZFNlY29uZHMoaW50MzJfdCBpU2Vjb25kcykNCi17DQotICAgIG1faVVuaXRpbWUgKz0gKChpbnQ2NF90KWlTZWNvbmRzKSAqIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQ7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX1VuaXRpbWU6OkFkZFNlY29uZHMoaW50MzJfdCBpU2Vjb25kcykgew0KKyAgbV9pVW5pdGltZSArPSAoKGludDY0X3QpaVNlY29uZHMpICogZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZDsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9Vbml0aW1lOjpBZGRNaWxsaXNlY29uZHMoaW50MzJfdCBpTWlsbGlzZWNvbmRzKQ0KLXsNCi0gICAgbV9pVW5pdGltZSArPSBpTWlsbGlzZWNvbmRzOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9Vbml0aW1lOjpBZGRNaWxsaXNlY29uZHMoaW50MzJfdCBpTWlsbGlzZWNvbmRzKSB7DQorICBtX2lVbml0aW1lICs9IGlNaWxsaXNlY29uZHM7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfRGF0ZVRpbWU6OlNldChpbnQzMl90IHllYXIsIHVpbnQ4X3QgbW9udGgsIHVpbnQ4X3QgZGF5LCB1aW50OF90IGhvdXIsIHVpbnQ4X3QgbWludXRlLCB1aW50OF90IHNlY29uZCwgRlhfV09SRCBtaWxsaXNlY29uZCkNCi17DQotICAgIEFTU0VSVCh5ZWFyICE9IDApOw0KLSAgICBBU1NFUlQobW9udGggPj0gMSAmJiBtb250aCA8PSAxMik7DQotICAgIEFTU0VSVChkYXkgPj0gMSAmJiBkYXkgPD0gRlhfRGF5c0luTW9udGgoeWVhciwgbW9udGgpKTsNCi0gICAgQVNTRVJUKGhvdXIgPD0gMjMpOw0KLSAgICBBU1NFUlQobWludXRlIDw9IDU5KTsNCi0gICAgQVNTRVJUKHNlY29uZCA8PSA1OSk7DQotICAgIEFTU0VSVChtaWxsaXNlY29uZCA8PSA5OTkpOw0KLSAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA9IHllYXI7DQotICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCA9IG1vbnRoOw0KLSAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5ID0gZGF5Ow0KLSAgICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUuaG91ciA9IGhvdXI7DQotICAgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taW51dGUgPSBtaW51dGU7DQotICAgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5zZWNvbmQgPSBzZWNvbmQ7DQotICAgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9EYXRlVGltZTo6U2V0KGludDMyX3QgeWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaG91ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWludXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZWNvbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIG1pbGxpc2Vjb25kKSB7DQorICBBU1NFUlQoeWVhciAhPSAwKTsNCisgIEFTU0VSVChtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyKTsNCisgIEFTU0VSVChkYXkgPj0gMSAmJiBkYXkgPD0gRlhfRGF5c0luTW9udGgoeWVhciwgbW9udGgpKTsNCisgIEFTU0VSVChob3VyIDw9IDIzKTsNCisgIEFTU0VSVChtaW51dGUgPD0gNTkpOw0KKyAgQVNTRVJUKHNlY29uZCA8PSA1OSk7DQorICBBU1NFUlQobWlsbGlzZWNvbmQgPD0gOTk5KTsNCisgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0geWVhcjsNCisgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCA9IG1vbnRoOw0KKyAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSA9IGRheTsNCisgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5ob3VyID0gaG91cjsNCisgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taW51dGUgPSBtaW51dGU7DQorICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kID0gc2Vjb25kOw0KKyAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQ7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfRGF0ZVRpbWU6OkZyb21Vbml0aW1lKEZYX1VOSVRJTUUgdCkNCi17DQotICAgIENGWF9Vbml0aW1lIHV0KHQpOw0KLSAgICBGWF9EYXlzVG9EYXRlKHV0LkdldERheU9mQUQoKSwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSk7DQotICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXkgPSB1dC5HZXRIb3VyKCk7DQotICAgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taW51dGUgPSB1dC5HZXRNaW51dGUoKTsNCi0gICAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLnNlY29uZCA9IHV0LkdldFNlY29uZCgpOw0KLSAgICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWlsbGlzZWNvbmQgPSB1dC5HZXRNaWxsaXNlY29uZCgpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9EYXRlVGltZTo6RnJvbVVuaXRpbWUoRlhfVU5JVElNRSB0KSB7DQorICBDRlhfVW5pdGltZSB1dCh0KTsNCisgIEZYX0RheXNUb0RhdGUodXQuR2V0RGF5T2ZBRCgpLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciwNCisgICAgICAgICAgICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5KTsNCisgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXkgPSB1dC5HZXRIb3VyKCk7DQorICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWludXRlID0gdXQuR2V0TWludXRlKCk7DQorICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kID0gdXQuR2V0U2Vjb25kKCk7DQorICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWlsbGlzZWNvbmQgPSB1dC5HZXRNaWxsaXNlY29uZCgpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX1VOSVRJTUUgQ0ZYX0RhdGVUaW1lOjpUb1VuaXRpbWUoKSBjb25zdA0KLXsNCi0gICAgRlhfVU5JVElNRSB2ID0gKGludDY0X3QpbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSAqIGdfRlhNaWxsaXNlY29uZHNQZXJIb3VyICsgKGludDY0X3QpbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZSAqIGdfRlhNaWxsaXNlY29uZHNQZXJNaW51dGUgKyAoaW50NjRfdCltX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kICogZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCArIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taWxsaXNlY29uZDsNCi0gICAgdiArPSBGWF9EYXRlVG9EYXlzKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXksIEZBTFNFKSAqIGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7DQotICAgIHJldHVybiB2Ow0KK0ZYX1VOSVRJTUUgQ0ZYX0RhdGVUaW1lOjpUb1VuaXRpbWUoKSBjb25zdCB7DQorICBGWF9VTklUSU1FIHYgPQ0KKyAgICAgIChpbnQ2NF90KW1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXkgKiBnX0ZYTWlsbGlzZWNvbmRzUGVySG91ciArDQorICAgICAgKGludDY0X3QpbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZSAqIGdfRlhNaWxsaXNlY29uZHNQZXJNaW51dGUgKw0KKyAgICAgIChpbnQ2NF90KW1fRGF0ZVRpbWUuVGltZS5zVGltZS5zZWNvbmQgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kICsNCisgICAgICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWlsbGlzZWNvbmQ7DQorICB2ICs9IEZYX0RhdGVUb0RheXMobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCwNCisgICAgICAgICAgICAgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5LCBGQUxTRSkgKg0KKyAgICAgICBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KKyAgcmV0dXJuIHY7DQogfQ0KLWludDMyX3QgQ0ZYX0RhdGVUaW1lOjpHZXRZZWFyKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhcjsNCitpbnQzMl90IENGWF9EYXRlVGltZTo6R2V0WWVhcigpIGNvbnN0IHsNCisgIHJldHVybiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhcjsNCiB9DQotdWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldE1vbnRoKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGg7DQordWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldE1vbnRoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aDsNCiB9DQotdWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldERheSgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheTsNCit1aW50OF90IENGWF9EYXRlVGltZTo6R2V0RGF5KCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXk7DQogfQ0KLUZYX1dFRUtEQVkgQ0ZYX0RhdGVUaW1lOjpHZXREYXlPZldlZWsoKSBjb25zdA0KLXsNCi0gICAgaW50MzJfdCB2ID0gKGludDMyX3QpKEZYX0RhdGVUb0RheXMobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSwgVFJVRSkgJSA3KTsNCi0gICAgaWYgKHYgPCAwKSB7DQotICAgICAgICB2ICs9IDc7DQotICAgIH0NCi0gICAgcmV0dXJuIChGWF9XRUVLREFZKXY7DQorRlhfV0VFS0RBWSBDRlhfRGF0ZVRpbWU6OkdldERheU9mV2VlaygpIGNvbnN0IHsNCisgIGludDMyX3QgdiA9IChpbnQzMl90KShGWF9EYXRlVG9EYXlzKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSwgVFJVRSkgJQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIDcpOw0KKyAgaWYgKHYgPCAwKSB7DQorICAgIHYgKz0gNzsNCisgIH0NCisgIHJldHVybiAoRlhfV0VFS0RBWSl2Ow0KIH0NCi1GWF9XT1JEIENGWF9EYXRlVGltZTo6R2V0RGF5T2ZZZWFyKCkgY29uc3QNCi17DQotICAgIHJldHVybiBGWF9EYXlzQmVmb3JlTW9udGhJblllYXIobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCkgKyBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5Ow0KK0ZYX1dPUkQgQ0ZYX0RhdGVUaW1lOjpHZXREYXlPZlllYXIoKSBjb25zdCB7DQorICByZXR1cm4gRlhfRGF5c0JlZm9yZU1vbnRoSW5ZZWFyKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgpICsNCisgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5Ow0KIH0NCi1pbnQ2NF90IENGWF9EYXRlVGltZTo6R2V0RGF5T2ZBRCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gRlhfRGF0ZVRvRGF5cyhtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5LCBUUlVFKTsNCitpbnQ2NF90IENGWF9EYXRlVGltZTo6R2V0RGF5T2ZBRCgpIGNvbnN0IHsNCisgIHJldHVybiBGWF9EYXRlVG9EYXlzKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5LCBUUlVFKTsNCiB9DQotdWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldEhvdXIoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXk7DQordWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldEhvdXIoKSBjb25zdCB7DQorICByZXR1cm4gbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheTsNCiB9DQotdWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldE1pbnV0ZSgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZTsNCit1aW50OF90IENGWF9EYXRlVGltZTo6R2V0TWludXRlKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taW51dGU7DQogfQ0KLXVpbnQ4X3QgQ0ZYX0RhdGVUaW1lOjpHZXRTZWNvbmQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5zZWNvbmQ7DQordWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldFNlY29uZCgpIGNvbnN0IHsNCisgIHJldHVybiBtX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kOw0KIH0NCi1GWF9XT1JEIENGWF9EYXRlVGltZTo6R2V0TWlsbGlzZWNvbmQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taWxsaXNlY29uZDsNCitGWF9XT1JEIENGWF9EYXRlVGltZTo6R2V0TWlsbGlzZWNvbmQoKSBjb25zdCB7DQorICByZXR1cm4gbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbGxpc2Vjb25kOw0KIH0NCi1GWF9CT09MIENGWF9EYXRlVGltZTo6QWRkWWVhcnMoaW50MzJfdCBpWWVhcnMpDQotew0KLSAgICBpZiAoaVllYXJzID09IDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHYgPSBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciArIGlZZWFyczsNCi0gICAgaWYgKHYgPj0gMCAmJiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA8IDApIHsNCi0gICAgICAgIHYgKys7DQotICAgIH0gZWxzZSBpZiAodiA8PSAwICYmIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID4gMCkgew0KLSAgICAgICAgdiAtLTsNCi0gICAgfQ0KLSAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA9IHY7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGRZZWFycyhpbnQzMl90IGlZZWFycykgew0KKyAgaWYgKGlZZWFycyA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgdiA9IG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyICsgaVllYXJzOw0KKyAgaWYgKHYgPj0gMCAmJiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA8IDApIHsNCisgICAgdisrOw0KKyAgfSBlbHNlIGlmICh2IDw9IDAgJiYgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPiAwKSB7DQorICAgIHYtLTsNCisgIH0NCisgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0gdjsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9EYXRlVGltZTo6QWRkTW9udGhzKGludDMyX3QgaU1vbnRocykNCi17DQotICAgIGlmIChpTW9udGhzID09IDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGIgPSBpTW9udGhzID4gMDsNCi0gICAgaU1vbnRocyArPSBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGg7DQotICAgIHdoaWxlIChpTW9udGhzIDwgMSkgew0KLSAgICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgLS07DQotICAgICAgICBpZiAobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPT0gMCkgew0KLSAgICAgICAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0gLTE7DQotICAgICAgICB9DQotICAgICAgICBpTW9udGhzICs9IDEyOw0KLSAgICB9DQotICAgIHdoaWxlIChpTW9udGhzID4gMTIpIHsNCi0gICAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyICsrOw0KLSAgICAgICAgaWYgKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID09IDApIHsNCi0gICAgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA9IDE7DQotICAgICAgICB9DQotICAgICAgICBpTW9udGhzIC09IDEyOw0KLSAgICB9DQorRlhfQk9PTCBDRlhfRGF0ZVRpbWU6OkFkZE1vbnRocyhpbnQzMl90IGlNb250aHMpIHsNCisgIGlmIChpTW9udGhzID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiID0gaU1vbnRocyA+IDA7DQorICBpTW9udGhzICs9IG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aDsNCisgIHdoaWxlIChpTW9udGhzIDwgMSkgew0KKyAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhci0tOw0KICAgICBpZiAobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPT0gMCkgew0KLSAgICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPSBiID8gMSA6IC0xOw0KKyAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0gLTE7DQogICAgIH0NCi0gICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoID0gKHVpbnQ4X3QpaU1vbnRoczsNCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIGlNb250aHMgKz0gMTI7DQorICB9DQorICB3aGlsZSAoaU1vbnRocyA+IDEyKSB7DQorICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyKys7DQorICAgIGlmIChtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA9PSAwKSB7DQorICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPSAxOw0KKyAgICB9DQorICAgIGlNb250aHMgLT0gMTI7DQorICB9DQorICBpZiAobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPT0gMCkgew0KKyAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA9IGIgPyAxIDogLTE7DQorICB9DQorICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGggPSAodWludDhfdClpTW9udGhzOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGREYXlzKGludDMyX3QgaURheXMpDQotew0KLSAgICBpZiAoaURheXMgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGludDY0X3QgdjEgPSBGWF9EYXRlVG9EYXlzKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXksIFRSVUUpOw0KLSAgICBpbnQ2NF90IHYyID0gdjEgKyBpRGF5czsNCi0gICAgaWYgKHYyIDw9IDAgJiYgdjEgPiAwKSB7DQotICAgICAgICB2MiAtLTsNCi0gICAgfSBlbHNlIGlmICh2MiA+PSAwICYmIHYxIDwgMCkgew0KLSAgICAgICAgdjIgKys7DQotICAgIH0NCi0gICAgRlhfRGF5c1RvRGF0ZSh2MiwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSk7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGREYXlzKGludDMyX3QgaURheXMpIHsNCisgIGlmIChpRGF5cyA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDY0X3QgdjEgPQ0KKyAgICAgIEZYX0RhdGVUb0RheXMobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCwNCisgICAgICAgICAgICAgICAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXksIFRSVUUpOw0KKyAgaW50NjRfdCB2MiA9IHYxICsgaURheXM7DQorICBpZiAodjIgPD0gMCAmJiB2MSA+IDApIHsNCisgICAgdjItLTsNCisgIH0gZWxzZSBpZiAodjIgPj0gMCAmJiB2MSA8IDApIHsNCisgICAgdjIrKzsNCisgIH0NCisgIEZYX0RheXNUb0RhdGUodjIsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgsDQorICAgICAgICAgICAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXkpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGRIb3VycyhpbnQzMl90IGlIb3VycykNCi17DQotICAgIGlmIChpSG91cnMgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlIb3VycyArPSBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5Ow0KLSAgICBpbnQzMl90IGlEYXlzID0gaUhvdXJzIC8gMjQ7DQotICAgIGlIb3VycyAlPSAyNDsNCi0gICAgaWYgKGlIb3VycyA8IDApIHsNCi0gICAgICAgIGlEYXlzIC0tLCBpSG91cnMgKz0gMjQ7DQotICAgIH0NCi0gICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSA9ICh1aW50OF90KWlIb3VyczsNCi0gICAgaWYgKGlEYXlzICE9IDApIHsNCi0gICAgICAgIEFkZERheXMoaURheXMpOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGRIb3VycyhpbnQzMl90IGlIb3Vycykgew0KKyAgaWYgKGlIb3VycyA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlIb3VycyArPSBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5Ow0KKyAgaW50MzJfdCBpRGF5cyA9IGlIb3VycyAvIDI0Ow0KKyAgaUhvdXJzICU9IDI0Ow0KKyAgaWYgKGlIb3VycyA8IDApIHsNCisgICAgaURheXMtLSwgaUhvdXJzICs9IDI0Ow0KKyAgfQ0KKyAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSA9ICh1aW50OF90KWlIb3VyczsNCisgIGlmIChpRGF5cyAhPSAwKSB7DQorICAgIEFkZERheXMoaURheXMpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGRNaW51dGVzKGludDMyX3QgaU1pbnV0ZXMpDQotew0KLSAgICBpZiAoaU1pbnV0ZXMgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlNaW51dGVzICs9IG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taW51dGU7DQotICAgIGludDMyX3QgaUhvdXJzID0gaU1pbnV0ZXMgLyA2MDsNCi0gICAgaU1pbnV0ZXMgJT0gNjA7DQotICAgIGlmIChpTWludXRlcyA8IDApIHsNCi0gICAgICAgIGlIb3VycyAtLSwgaU1pbnV0ZXMgKz0gNjA7DQotICAgIH0NCi0gICAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZSA9ICh1aW50OF90KWlNaW51dGVzOw0KLSAgICBpZiAoaUhvdXJzICE9IDApIHsNCi0gICAgICAgIEFkZEhvdXJzKGlIb3Vycyk7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDRlhfRGF0ZVRpbWU6OkFkZE1pbnV0ZXMoaW50MzJfdCBpTWludXRlcykgew0KKyAgaWYgKGlNaW51dGVzID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaU1pbnV0ZXMgKz0gbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZTsNCisgIGludDMyX3QgaUhvdXJzID0gaU1pbnV0ZXMgLyA2MDsNCisgIGlNaW51dGVzICU9IDYwOw0KKyAgaWYgKGlNaW51dGVzIDwgMCkgew0KKyAgICBpSG91cnMtLSwgaU1pbnV0ZXMgKz0gNjA7DQorICB9DQorICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWludXRlID0gKHVpbnQ4X3QpaU1pbnV0ZXM7DQorICBpZiAoaUhvdXJzICE9IDApIHsNCisgICAgQWRkSG91cnMoaUhvdXJzKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9EYXRlVGltZTo6QWRkU2Vjb25kcyhpbnQzMl90IGlTZWNvbmRzKQ0KLXsNCi0gICAgaWYgKGlTZWNvbmRzID09IDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpU2Vjb25kcyArPSBtX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kOw0KLSAgICBpbnQzMl90IGlNaW51dGVzID0gaVNlY29uZHMgLyA2MDsNCi0gICAgaVNlY29uZHMgJT0gNjA7DQotICAgIGlmIChpU2Vjb25kcyA8IDApIHsNCi0gICAgICAgIGlNaW51dGVzIC0tLCBpU2Vjb25kcyArPSA2MDsNCi0gICAgfQ0KLSAgICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kID0gKHVpbnQ4X3QpaVNlY29uZHM7DQotICAgIGlmIChpTWludXRlcyAhPSAwKSB7DQotICAgICAgICBBZGRNaW51dGVzKGlNaW51dGVzKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9EYXRlVGltZTo6QWRkU2Vjb25kcyhpbnQzMl90IGlTZWNvbmRzKSB7DQorICBpZiAoaVNlY29uZHMgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpU2Vjb25kcyArPSBtX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kOw0KKyAgaW50MzJfdCBpTWludXRlcyA9IGlTZWNvbmRzIC8gNjA7DQorICBpU2Vjb25kcyAlPSA2MDsNCisgIGlmIChpU2Vjb25kcyA8IDApIHsNCisgICAgaU1pbnV0ZXMtLSwgaVNlY29uZHMgKz0gNjA7DQorICB9DQorICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kID0gKHVpbnQ4X3QpaVNlY29uZHM7DQorICBpZiAoaU1pbnV0ZXMgIT0gMCkgew0KKyAgICBBZGRNaW51dGVzKGlNaW51dGVzKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9EYXRlVGltZTo6QWRkTWlsbGlzZWNvbmRzKGludDMyX3QgaU1pbGxpc2Vjb25kcykNCi17DQotICAgIGlmIChpTWlsbGlzZWNvbmRzID09IDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpTWlsbGlzZWNvbmRzICs9IG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taWxsaXNlY29uZDsNCi0gICAgaW50MzJfdCBpU2Vjb25kcyA9IChpbnQzMl90KShpTWlsbGlzZWNvbmRzIC8gZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCk7DQotICAgIGlNaWxsaXNlY29uZHMgJT0gZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZDsNCi0gICAgaWYgKGlNaWxsaXNlY29uZHMgPCAwKSB7DQotICAgICAgICBpU2Vjb25kcyAtLSwgaU1pbGxpc2Vjb25kcyArPSBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kOw0KLSAgICB9DQotICAgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taWxsaXNlY29uZCA9IChGWF9XT1JEKWlNaWxsaXNlY29uZHM7DQotICAgIGlmIChpU2Vjb25kcyAhPSAwKSB7DQotICAgICAgICBBZGRTZWNvbmRzKGlTZWNvbmRzKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9EYXRlVGltZTo6QWRkTWlsbGlzZWNvbmRzKGludDMyX3QgaU1pbGxpc2Vjb25kcykgew0KKyAgaWYgKGlNaWxsaXNlY29uZHMgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpTWlsbGlzZWNvbmRzICs9IG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taWxsaXNlY29uZDsNCisgIGludDMyX3QgaVNlY29uZHMgPSAoaW50MzJfdCkoaU1pbGxpc2Vjb25kcyAvIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQpOw0KKyAgaU1pbGxpc2Vjb25kcyAlPSBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kOw0KKyAgaWYgKGlNaWxsaXNlY29uZHMgPCAwKSB7DQorICAgIGlTZWNvbmRzLS0sIGlNaWxsaXNlY29uZHMgKz0gZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZDsNCisgIH0NCisgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taWxsaXNlY29uZCA9IChGWF9XT1JEKWlNaWxsaXNlY29uZHM7DQorICBpZiAoaVNlY29uZHMgIT0gMCkgew0KKyAgICBBZGRTZWNvbmRzKGlTZWNvbmRzKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGUuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlLmNwcAppbmRleCBhNzYyNWVhLi4xNWQyZDRjIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGUuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZS5jcHAKQEAgLTgsMTkgKzgsMTkgQEAKICNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCiAjaW5jbHVkZSAiZnhfbG9jYWxlaW1wLmgiDQogDQotI2RlZmluZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlSGFzaAkJCTB4YmRlOWFiZGUNCi0jZGVmaW5lIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWVIYXNoCQkJMHgyZDcxYjAwZg0KLSNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWVIYXNoCQkweDE1OGM3MmVkDQotI2RlZmluZSBGWF9MT0NBTEVDQVRFR09SWV9OdW1IYXNoCQkJMHgwYjRmZjg3MA0KLSNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfVGV4dEhhc2gJCQkweDJkMDhhZjg1DQotI2RlZmluZSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvSGFzaAkJCTB4NTY4Y2I1MDANCi0jZGVmaW5lCUZYX0xPQ0FMRUNBVEVHT1JZX051bGxIYXNoCQkJMHgwNTI5MzFiYg0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZUhhc2ggMHhiZGU5YWJkZQ0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfVGltZUhhc2ggMHgyZDcxYjAwZg0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWVIYXNoIDB4MTU4YzcyZWQNCisjZGVmaW5lIEZYX0xPQ0FMRUNBVEVHT1JZX051bUhhc2ggMHgwYjRmZjg3MA0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfVGV4dEhhc2ggMHgyZDA4YWY4NQ0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfWmVyb0hhc2ggMHg1NjhjYjUwMA0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfTnVsbEhhc2ggMHgwNTI5MzFiYg0KIHR5cGVkZWYgc3RydWN0IF9GWF9MT0NBTEVTVUJDQVRFR09SWUlORk8gew0KLSAgICB1aW50MzJfdAkJCQkJdUhhc2g7DQotICAgIGNvbnN0IEZYX1dDSEFSKgkJCQkJcE5hbWU7DQotICAgIGludDMyX3QJCQkJCWVTdWJDYXRlZ29yeTsNCi19IEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTywgKiBGWF9MUExPQ0FMRVNVQkNBVEVHT1JZSU5GTzsNCi10eXBlZGVmIEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTyBjb25zdCAqIEZYX0xQQ0xPQ0FMRVNVQkNBVEVHT1JZSU5GTzsNCisgIHVpbnQzMl90IHVIYXNoOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBOYW1lOw0KKyAgaW50MzJfdCBlU3ViQ2F0ZWdvcnk7DQorfSBGWF9MT0NBTEVTVUJDQVRFR09SWUlORk8sICpGWF9MUExPQ0FMRVNVQkNBVEVHT1JZSU5GTzsNCit0eXBlZGVmIEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTyBjb25zdCogRlhfTFBDTE9DQUxFU1VCQ0FURUdPUllJTkZPOw0KIGNvbnN0IHN0YXRpYyBGWF9MT0NBTEVTVUJDQVRFR09SWUlORk8gZ19GWExvY2FsZURhdGVUaW1lU3ViQ2F0RGF0YVtdID0gew0KICAgICB7MHgxNGRhMjEyNSwgTCJkZWZhdWx0IiwgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0fSwNCiAgICAgezB4OTA0MWQ0YjAsIEwic2hvcnQiLCBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0fSwNCkBAIC0yOCw0OTMyICsyOCw1MTA3IEBACiAgICAgezB4Y2RjZTU2YjMsIEwiZnVsbCIsIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbH0sDQogICAgIHsweGY2YjRhZmIwLCBMImxvbmciLCBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmd9LA0KIH07DQotY29uc3Qgc3RhdGljIGludDMyX3QgZ19pRlhMb2NhbGVEYXRlVGltZVN1YkNhdENvdW50ID0gc2l6ZW9mKGdfRlhMb2NhbGVEYXRlVGltZVN1YkNhdERhdGEpIC8gc2l6ZW9mKEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTyk7DQorY29uc3Qgc3RhdGljIGludDMyX3QgZ19pRlhMb2NhbGVEYXRlVGltZVN1YkNhdENvdW50ID0NCisgICAgc2l6ZW9mKGdfRlhMb2NhbGVEYXRlVGltZVN1YkNhdERhdGEpIC8gc2l6ZW9mKEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTyk7DQogY29uc3Qgc3RhdGljIEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTyBnX0ZYTG9jYWxlTnVtU3ViQ2F0RGF0YVtdID0gew0KICAgICB7MHg0NmY5NTUzMSwgTCJwZXJjZW50IiwgRlhfTE9DQUxFTlVNUEFUVEVSTl9QZXJjZW50fSwNCiAgICAgezB4NGM0ZThhY2IsIEwiY3VycmVuY3kiLCBGWF9MT0NBTEVOVU1QQVRURVJOX0N1cnJlbmN5fSwNCiAgICAgezB4NTQwMzRjMmYsIEwiZGVjaW1hbCIsIEZYX0xPQ0FMRU5VTVBBVFRFUk5fRGVjaW1hbH0sDQogICAgIHsweDc1NjhlNmFlLCBMImludGVnZXIiLCBGWF9MT0NBTEVOVU1QQVRURVJOX0ludGVnZXJ9LA0KIH07DQotY29uc3Qgc3RhdGljIGludDMyX3QgZ19pRlhMb2NhbGVOdW1TdWJDYXRDb3VudCA9IHNpemVvZihnX0ZYTG9jYWxlTnVtU3ViQ2F0RGF0YSkgLyBzaXplb2YoRlhfTE9DQUxFU1VCQ0FURUdPUllJTkZPKTsNCitjb25zdCBzdGF0aWMgaW50MzJfdCBnX2lGWExvY2FsZU51bVN1YkNhdENvdW50ID0NCisgICAgc2l6ZW9mKGdfRlhMb2NhbGVOdW1TdWJDYXREYXRhKSAvIHNpemVvZihGWF9MT0NBTEVTVUJDQVRFR09SWUlORk8pOw0KIHR5cGVkZWYgc3RydWN0IF9GWF9MT0NBTEVUSU1FWk9ORUlORk8gew0KLSAgICBGWF9EV09SRAkJCQkJdUhhc2g7DQotICAgIGludDE2X3QJCQkJCWlIb3VyOw0KLSAgICBpbnQxNl90CQkJCQlpTWludXRlOw0KLX0gRlhfTE9DQUxFVElNRVpPTkVJTkZPLCAqIEZYX0xQTE9DQUxFVElNRVpPTkVJTkZPOw0KLXR5cGVkZWYgRlhfTE9DQUxFVElNRVpPTkVJTkZPIGNvbnN0ICogRlhfTFBDTE9DQUxFVElNRVpPTkVJTkZPOw0KKyAgRlhfRFdPUkQgdUhhc2g7DQorICBpbnQxNl90IGlIb3VyOw0KKyAgaW50MTZfdCBpTWludXRlOw0KK30gRlhfTE9DQUxFVElNRVpPTkVJTkZPLCAqRlhfTFBMT0NBTEVUSU1FWk9ORUlORk87DQordHlwZWRlZiBGWF9MT0NBTEVUSU1FWk9ORUlORk8gY29uc3QqIEZYX0xQQ0xPQ0FMRVRJTUVaT05FSU5GTzsNCiBjb25zdCBzdGF0aWMgRlhfTE9DQUxFVElNRVpPTkVJTkZPIGdfRlhMb2NhbGVUaW1lWm9uZURhdGFbXSA9IHsNCiAgICAge0ZYQlNUUl9JRCgwLCAnQycsICdEJywgJ1QnKSwgLTUsIDB9LCB7RlhCU1RSX0lEKDAsICdDJywgJ1MnLCAnVCcpLCAtNiwgMH0sDQogICAgIHtGWEJTVFJfSUQoMCwgJ0UnLCAnRCcsICdUJyksIC00LCAwfSwge0ZYQlNUUl9JRCgwLCAnRScsICdTJywgJ1QnKSwgLTUsIDB9LA0KICAgICB7RlhCU1RSX0lEKDAsICdNJywgJ0QnLCAnVCcpLCAtNiwgMH0sIHtGWEJTVFJfSUQoMCwgJ00nLCAnUycsICdUJyksIC03LCAwfSwNCiAgICAge0ZYQlNUUl9JRCgwLCAnUCcsICdEJywgJ1QnKSwgLTcsIDB9LCB7RlhCU1RSX0lEKDAsICdQJywgJ1MnLCAnVCcpLCAtOCwgMH0sDQogfTsNCi1jb25zdCBzdGF0aWMgaW50MzJfdCBnX2lGWExvY2FsZVRpbWVab25lQ291bnQgPSBzaXplb2YoZ19GWExvY2FsZVRpbWVab25lRGF0YSkgLyBzaXplb2YoRlhfTE9DQUxFVElNRVpPTkVJTkZPKTsNCitjb25zdCBzdGF0aWMgaW50MzJfdCBnX2lGWExvY2FsZVRpbWVab25lQ291bnQgPQ0KKyAgICBzaXplb2YoZ19GWExvY2FsZVRpbWVab25lRGF0YSkgLyBzaXplb2YoRlhfTE9DQUxFVElNRVpPTkVJTkZPKTsNCiBjb25zdCBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmdDIGdzX3dzVGV4dFN5bWJvbHMgPSBGWF9XU1RSQyhMIkFYTzA5Iik7DQogY29uc3Qgc3RhdGljIENGWF9XaWRlU3RyaW5nQyBnc193c1RpbWVTeW1ib2xzID0gRlhfV1NUUkMoTCJoSGtLTVNGQXpaIik7DQogY29uc3Qgc3RhdGljIENGWF9XaWRlU3RyaW5nQyBnc193c0RhdGVTeW1ib2xzID0gRlhfV1NUUkMoTCJESk1FZUdnWXdXIik7DQogY29uc3Qgc3RhdGljIENGWF9XaWRlU3RyaW5nQyBnc193c0NvbnN0Q2hhcnMgPSBGWF9XU1RSQyhMIiwtOi8uICIpOw0KLXN0YXRpYyBGWF9TVFJTSVpFIEZYX0xvY2FsX0ZpbmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1N5bWJvbHMsIEZYX1dDSEFSIGNoLCBGWF9TVFJTSVpFIG5TdGFydCA9IDApDQotew0KLSAgICBGWF9TVFJTSVpFIG5MZW5ndGggPSB3c1N5bWJvbHMuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChuTGVuZ3RoIDwgMSB8fCBuU3RhcnQgPiBuTGVuZ3RoKSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgY29uc3QgRlhfV0NIQVIqIGxwc3ogPSAoY29uc3QgRlhfV0NIQVIqKUZYU1lTX3djc2Nocih3c1N5bWJvbHMuR2V0UHRyKCkgKyBuU3RhcnQsIGNoKTsNCi0gICAgcmV0dXJuIChscHN6ID09IE5VTEwpID8gLTEgOiAoRlhfU1RSU0laRSkobHBzeiAtIHdzU3ltYm9scy5HZXRQdHIoKSk7DQorc3RhdGljIEZYX1NUUlNJWkUgRlhfTG9jYWxfRmluZChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU3ltYm9scywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIGNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuU3RhcnQgPSAwKSB7DQorICBGWF9TVFJTSVpFIG5MZW5ndGggPSB3c1N5bWJvbHMuR2V0TGVuZ3RoKCk7DQorICBpZiAobkxlbmd0aCA8IDEgfHwgblN0YXJ0ID4gbkxlbmd0aCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBjb25zdCBGWF9XQ0hBUiogbHBzeiA9DQorICAgICAgKGNvbnN0IEZYX1dDSEFSKilGWFNZU193Y3NjaHIod3NTeW1ib2xzLkdldFB0cigpICsgblN0YXJ0LCBjaCk7DQorICByZXR1cm4gKGxwc3ogPT0gTlVMTCkgPyAtMSA6IChGWF9TVFJTSVpFKShscHN6IC0gd3NTeW1ib2xzLkdldFB0cigpKTsNCiB9DQogc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBjb25zdCBnc19Mb2NhbE51bWJlclN5bWJvbHNbXSA9IHsNCi0gICAgTCJkZWNpbWFsIiwgTCJncm91cGluZyIsIEwicGVyY2VudCIsIEwibWludXMiLCBMInplcm8iLA0KLSAgICBMImN1cnJlbmN5U3ltYm9sIiwgTCJjdXJyZW5jeU5hbWUiLA0KKyAgICBMImRlY2ltYWwiLCBMImdyb3VwaW5nIiwgICAgICAgTCJwZXJjZW50IiwgICAgICBMIm1pbnVzIiwNCisgICAgTCJ6ZXJvIiwgICAgTCJjdXJyZW5jeVN5bWJvbCIsIEwiY3VycmVuY3lOYW1lIiwNCiB9Ow0KLUlGWF9Mb2NhbGUqIElGWF9Mb2NhbGU6OkNyZWF0ZShDWE1MX0VsZW1lbnQqIHBMb2NhbGVEYXRhKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDRlhfTG9jYWxlKHBMb2NhbGVEYXRhKTsNCitJRlhfTG9jYWxlKiBJRlhfTG9jYWxlOjpDcmVhdGUoQ1hNTF9FbGVtZW50KiBwTG9jYWxlRGF0YSkgew0KKyAgcmV0dXJuIEZYX05FVyBDRlhfTG9jYWxlKHBMb2NhbGVEYXRhKTsNCiB9DQotQ0ZYX0xvY2FsZTo6Q0ZYX0xvY2FsZShDWE1MX0VsZW1lbnQqIHBMb2NhbGVEYXRhKQ0KLXsNCi0gICAgbV9wRWxlbWVudCA9IHBMb2NhbGVEYXRhOw0KK0NGWF9Mb2NhbGU6OkNGWF9Mb2NhbGUoQ1hNTF9FbGVtZW50KiBwTG9jYWxlRGF0YSkgew0KKyAgbV9wRWxlbWVudCA9IHBMb2NhbGVEYXRhOw0KIH0NCi1DRlhfTG9jYWxlOjp+Q0ZYX0xvY2FsZSgpDQotew0KK0NGWF9Mb2NhbGU6On5DRlhfTG9jYWxlKCkge30NCitDRlhfV2lkZVN0cmluZyBDRlhfTG9jYWxlOjpHZXROYW1lKCkgew0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENGWF9Mb2NhbGU6OkdldE5hbWUoKQ0KLXsNCi0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQorc3RhdGljIENGWF9XaWRlU3RyaW5nIEZYX0dldFhNTENvbnRlbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1NwYWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYTUxfRWxlbWVudCogcHhtbEVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgew0KKyAgQ1hNTF9FbGVtZW50KiBwRGF0ZVBhdHRlcm4gPSBOVUxMOw0KKyAgaW50MzJfdCBuQ291bnQgPSBweG1sRWxlbWVudC0+Q291bnRFbGVtZW50cyhic1NwYWNlLCBic1RhZyk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yICg7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBwRGF0ZVBhdHRlcm4gPSBweG1sRWxlbWVudC0+R2V0RWxlbWVudChic1NwYWNlLCBic1RhZywgaSk7DQorICAgIGlmIChwRGF0ZVBhdHRlcm4tPkdldEF0dHJWYWx1ZShGWF9CU1RSQygibmFtZSIpKSA9PSB3c05hbWUpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGkgPCBuQ291bnQgJiYgcERhdGVQYXR0ZXJuKSB7DQorICAgIHJldHVybiBwRGF0ZVBhdHRlcm4tPkdldENvbnRlbnQoMCk7DQorICB9DQorICByZXR1cm4gTCIiOw0KIH0NCi1zdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgRlhfR2V0WE1MQ29udGVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzU3BhY2UsIENYTUxfRWxlbWVudCogcHhtbEVsZW1lbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUYWcsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKQ0KLXsNCi0gICAgQ1hNTF9FbGVtZW50KiBwRGF0ZVBhdHRlcm4gPSBOVUxMOw0KLSAgICBpbnQzMl90IG5Db3VudCA9IHB4bWxFbGVtZW50LT5Db3VudEVsZW1lbnRzKGJzU3BhY2UsIGJzVGFnKTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yICg7IGkgPCBuQ291bnQ7IGkrKykgew0KLSAgICAgICAgcERhdGVQYXR0ZXJuID0gcHhtbEVsZW1lbnQtPkdldEVsZW1lbnQoYnNTcGFjZSwgYnNUYWcsIGkpOw0KLSAgICAgICAgaWYgKHBEYXRlUGF0dGVybi0+R2V0QXR0clZhbHVlKEZYX0JTVFJDKCJuYW1lIikpID09IHdzTmFtZSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChpIDwgbkNvdW50ICYmIHBEYXRlUGF0dGVybikgew0KLSAgICAgICAgcmV0dXJuIHBEYXRlUGF0dGVybi0+R2V0Q29udGVudCgwKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gTCIiOw0KK3ZvaWQgQ0ZYX0xvY2FsZTo6R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdCB7DQorICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNTcGFjZTsNCisgIENGWF9XaWRlU3RyaW5nIHdzTmFtZSA9IGdzX0xvY2FsTnVtYmVyU3ltYm9sc1tlVHlwZV07DQorICBDWE1MX0VsZW1lbnQqIHBOdW1iZXJTeW1ib2xzID0NCisgICAgICBtX3BFbGVtZW50LT5HZXRFbGVtZW50KGJzU3BhY2UsIEZYX0JTVFJDKCJudW1iZXJTeW1ib2xzIikpOw0KKyAgaWYgKCFwTnVtYmVyU3ltYm9scykgew0KKyAgICByZXR1cm47DQorICB9DQorICB3c051bVN5bWJvbCA9IEZYX0dldFhNTENvbnRlbnQoYnNTcGFjZSwgcE51bWJlclN5bWJvbHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQlNUUkMoIm51bWJlclN5bWJvbCIpLCB3c05hbWUpOw0KIH0NCi12b2lkIENGWF9Mb2NhbGU6OkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTCBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdA0KLXsNCi0gICAgaWYgKCFtX3BFbGVtZW50KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNTcGFjZTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lID0gZ3NfTG9jYWxOdW1iZXJTeW1ib2xzW2VUeXBlXTsNCi0gICAgQ1hNTF9FbGVtZW50KiBwTnVtYmVyU3ltYm9scyA9IG1fcEVsZW1lbnQtPkdldEVsZW1lbnQoYnNTcGFjZSwgRlhfQlNUUkMoIm51bWJlclN5bWJvbHMiKSk7DQotICAgIGlmICghcE51bWJlclN5bWJvbHMpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICB3c051bVN5bWJvbCA9IEZYX0dldFhNTENvbnRlbnQoYnNTcGFjZSwgcE51bWJlclN5bWJvbHMsIEZYX0JTVFJDKCJudW1iZXJTeW1ib2wiKSwgd3NOYW1lKTsNCit2b2lkIENGWF9Mb2NhbGU6OkdldERhdGVUaW1lU3ltYm9scyhDRlhfV2lkZVN0cmluZyYgd3NEdFN5bWJvbCkgY29uc3Qgew0KKyAgaWYgKCFtX3BFbGVtZW50KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIGJzU3BhY2U7DQorICBDWE1MX0VsZW1lbnQqIHBOdW1iZXJTeW1ib2xzID0NCisgICAgICBtX3BFbGVtZW50LT5HZXRFbGVtZW50KGJzU3BhY2UsIEZYX0JTVFJDKCJkYXRlVGltZVN5bWJvbHMiKSk7DQorICBpZiAoIXBOdW1iZXJTeW1ib2xzKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHdzRHRTeW1ib2wgPSBwTnVtYmVyU3ltYm9scy0+R2V0Q29udGVudCgwKTsNCiB9DQotdm9pZCBDRlhfTG9jYWxlOjpHZXREYXRlVGltZVN5bWJvbHMoQ0ZYX1dpZGVTdHJpbmcmIHdzRHRTeW1ib2wpIGNvbnN0DQotew0KLSAgICBpZiAoIW1fcEVsZW1lbnQpIHsNCi0gICAgICAgIHJldHVybjsNCitzdGF0aWMgdm9pZCBGWF9HZXRDYWxlbmRhclN5bWJvbChDWE1MX0VsZW1lbnQqIHBYbWxFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzeW1ib2xfdHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNTcGFjZTsNCisgIENGWF9CeXRlU3RyaW5nIHBzdHJTeW1ib2xOYW1lcyA9IHN5bWJvbF90eXBlICsgRlhfQlNUUkMoIk5hbWVzIik7DQorICBDWE1MX0VsZW1lbnQqIHBDaGlsZCA9DQorICAgICAgcFhtbEVsZW1lbnQtPkdldEVsZW1lbnQoYnNTcGFjZSwgRlhfQlNUUkMoImNhbGVuZGFyU3ltYm9scyIpKTsNCisgIGlmICghcENoaWxkKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYTUxfRWxlbWVudCogcFN5bWJvbE5hbWVzID0gcENoaWxkLT5HZXRFbGVtZW50KGJzU3BhY2UsIHBzdHJTeW1ib2xOYW1lcyk7DQorICBpZiAoIXBTeW1ib2xOYW1lcykgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocFN5bWJvbE5hbWVzLT5HZXRBdHRySW50ZWdlcihGWF9CU1RSQygiYWJiciIpKSAhPSBiQWJicikgew0KKyAgICBwU3ltYm9sTmFtZXMgPSBwQ2hpbGQtPkdldEVsZW1lbnQoYnNTcGFjZSwgcHN0clN5bWJvbE5hbWVzLCAxKTsNCisgIH0NCisgIGlmIChwU3ltYm9sTmFtZXMgJiYgcFN5bWJvbE5hbWVzLT5HZXRBdHRySW50ZWdlcihGWF9CU1RSQygiYWJiciIpKSA9PSBiQWJicikgew0KKyAgICBDWE1MX0VsZW1lbnQqIHBTeW1ib2xOYW1lID0NCisgICAgICAgIHBTeW1ib2xOYW1lcy0+R2V0RWxlbWVudChic1NwYWNlLCBzeW1ib2xfdHlwZSwgaW5kZXgpOw0KKyAgICBpZiAocFN5bWJvbE5hbWUpIHsNCisgICAgICB3c05hbWUgPSBwU3ltYm9sTmFtZS0+R2V0Q29udGVudCgwKTsNCiAgICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZyBic1NwYWNlOw0KLSAgICBDWE1MX0VsZW1lbnQqIHBOdW1iZXJTeW1ib2xzID0gbV9wRWxlbWVudC0+R2V0RWxlbWVudChic1NwYWNlLCBGWF9CU1RSQygiZGF0ZVRpbWVTeW1ib2xzIikpOw0KLSAgICBpZiAoIXBOdW1iZXJTeW1ib2xzKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgd3NEdFN5bWJvbCA9IHBOdW1iZXJTeW1ib2xzLT5HZXRDb250ZW50KDApOw0KKyAgfQ0KIH0NCi1zdGF0aWMgdm9pZCBGWF9HZXRDYWxlbmRhclN5bWJvbChDWE1MX0VsZW1lbnQqIHBYbWxFbGVtZW50LCBjb25zdCBDRlhfQnl0ZVN0cmluZyAmc3ltYm9sX3R5cGUsIGludDMyX3QgaW5kZXgsIEZYX0JPT0wgYkFiYnIsIENGWF9XaWRlU3RyaW5nICZ3c05hbWUpDQotew0KLSAgICBDRlhfQnl0ZVN0cmluZyBic1NwYWNlOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBwc3RyU3ltYm9sTmFtZXMgPSBzeW1ib2xfdHlwZSArIEZYX0JTVFJDKCJOYW1lcyIpOw0KLSAgICBDWE1MX0VsZW1lbnQqIHBDaGlsZCA9IHBYbWxFbGVtZW50LT5HZXRFbGVtZW50KGJzU3BhY2UsIEZYX0JTVFJDKCJjYWxlbmRhclN5bWJvbHMiKSk7DQotICAgIGlmICghcENoaWxkKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hNTF9FbGVtZW50KiBwU3ltYm9sTmFtZXMgPSBwQ2hpbGQtPkdldEVsZW1lbnQoYnNTcGFjZSwgcHN0clN5bWJvbE5hbWVzKTsNCi0gICAgaWYgKCFwU3ltYm9sTmFtZXMpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAocFN5bWJvbE5hbWVzLT5HZXRBdHRySW50ZWdlcihGWF9CU1RSQygiYWJiciIpKSAhPSBiQWJicikgew0KLSAgICAgICAgcFN5bWJvbE5hbWVzID0gcENoaWxkLT5HZXRFbGVtZW50KGJzU3BhY2UsIHBzdHJTeW1ib2xOYW1lcywgMSk7DQotICAgIH0NCi0gICAgaWYgKHBTeW1ib2xOYW1lcyAmJiBwU3ltYm9sTmFtZXMtPkdldEF0dHJJbnRlZ2VyKEZYX0JTVFJDKCJhYmJyIikpID09IGJBYmJyKSB7DQotICAgICAgICBDWE1MX0VsZW1lbnQqIHBTeW1ib2xOYW1lID0gcFN5bWJvbE5hbWVzLT5HZXRFbGVtZW50KGJzU3BhY2UsIHN5bWJvbF90eXBlLCBpbmRleCk7DQotICAgICAgICBpZiAocFN5bWJvbE5hbWUpIHsNCi0gICAgICAgICAgICB3c05hbWUgPSBwU3ltYm9sTmFtZS0+R2V0Q29udGVudCgwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KK3ZvaWQgQ0ZYX0xvY2FsZTo6R2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyKSBjb25zdCB7DQorICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfR2V0Q2FsZW5kYXJTeW1ib2wobV9wRWxlbWVudCwgIm1vbnRoIiwgbk1vbnRoLCBiQWJiciwgd3NNb250aE5hbWUpOw0KIH0NCi12b2lkIENGWF9Mb2NhbGU6OkdldE1vbnRoTmFtZShpbnQzMl90IG5Nb250aCwgQ0ZYX1dpZGVTdHJpbmcmIHdzTW9udGhOYW1lLCBGWF9CT09MIGJBYmJyICkgY29uc3QNCi17DQotICAgIGlmICghbV9wRWxlbWVudCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0dldENhbGVuZGFyU3ltYm9sKG1fcEVsZW1lbnQsICJtb250aCIsIG5Nb250aCwgYkFiYnIsIHdzTW9udGhOYW1lKTsNCit2b2lkIENGWF9Mb2NhbGU6OkdldERheU5hbWUoaW50MzJfdCBuV2VlaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWJicikgY29uc3Qgew0KKyAgaWYgKCFtX3BFbGVtZW50KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0dldENhbGVuZGFyU3ltYm9sKG1fcEVsZW1lbnQsICJkYXkiLCBuV2VlaywgYkFiYnIsIHdzRGF5TmFtZSk7DQogfQ0KLXZvaWQgQ0ZYX0xvY2FsZTo6R2V0RGF5TmFtZShpbnQzMl90IG5XZWVrLCBDRlhfV2lkZVN0cmluZyYgd3NEYXlOYW1lLCBGWF9CT09MIGJBYmJyICkgY29uc3QNCi17DQotICAgIGlmICghbV9wRWxlbWVudCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0dldENhbGVuZGFyU3ltYm9sKG1fcEVsZW1lbnQsICJkYXkiLCBuV2VlaywgYkFiYnIsIHdzRGF5TmFtZSk7DQordm9pZCBDRlhfTG9jYWxlOjpHZXRNZXJpZGllbU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVyaWRpZW1OYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFNKSBjb25zdCB7DQorICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfR2V0Q2FsZW5kYXJTeW1ib2wobV9wRWxlbWVudCwgIm1lcmlkaWVtIiwgYkFNID8gMCA6IDEsIEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgd3NNZXJpZGllbU5hbWUpOw0KIH0NCi12b2lkIENGWF9Mb2NhbGU6OkdldE1lcmlkaWVtTmFtZShDRlhfV2lkZVN0cmluZyYgd3NNZXJpZGllbU5hbWUsIEZYX0JPT0wgYkFNICkgY29uc3QNCi17DQotICAgIGlmICghbV9wRWxlbWVudCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0dldENhbGVuZGFyU3ltYm9sKG1fcEVsZW1lbnQsICJtZXJpZGllbSIsIGJBTSA/IDAgOiAxLCBGQUxTRSwgd3NNZXJpZGllbU5hbWUpOw0KK3N0YXRpYyBpbnQzMl90IEZYX1BhcnNlVGltZVpvbmUoY29uc3QgRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9USU1FWk9ORSYgdHopIHsNCisgIHR6LnR6SG91ciA9IDA7DQorICB0ei50ek1pbnV0ZSA9IDA7DQorICBpZiAoaUxlbiA8IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGlTdGFydCA9IDE7DQorICBpbnQzMl90IGlFbmQgPSBpU3RhcnQgKyAyOw0KKyAgd2hpbGUgKGlTdGFydCA8IGlMZW4gJiYgaVN0YXJ0IDwgaUVuZCkgew0KKyAgICB0ei50ekhvdXIgPSB0ei50ekhvdXIgKiAxMCArIHBTdHJbaVN0YXJ0KytdIC0gJzAnOw0KKyAgfQ0KKyAgaWYgKGlTdGFydCA8IGlMZW4gJiYgcFN0cltpU3RhcnRdID09ICc6Jykgew0KKyAgICBpU3RhcnQrKzsNCisgIH0NCisgIGlFbmQgPSBpU3RhcnQgKyAyOw0KKyAgd2hpbGUgKGlTdGFydCA8IGlMZW4gJiYgaVN0YXJ0IDwgaUVuZCkgew0KKyAgICB0ei50ek1pbnV0ZSA9IHR6LnR6TWludXRlICogMTAgKyBwU3RyW2lTdGFydCsrXSAtICcwJzsNCisgIH0NCisgIGlmIChwU3RyWzBdID09ICctJykgew0KKyAgICB0ei50ekhvdXIgPSAtdHoudHpIb3VyOw0KKyAgfQ0KKyAgcmV0dXJuIGlTdGFydDsNCiB9DQotc3RhdGljIGludDMyX3QgRlhfUGFyc2VUaW1lWm9uZShjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuLCBGWF9USU1FWk9ORSYgdHopDQotew0KLSAgICB0ei50ekhvdXIgPSAwOw0KLSAgICB0ei50ek1pbnV0ZSA9IDA7DQotICAgIGlmIChpTGVuIDwgMCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaW50MzJfdCBpU3RhcnQgPSAxOw0KLSAgICBpbnQzMl90IGlFbmQgPSBpU3RhcnQgKyAyOw0KLSAgICB3aGlsZSAoaVN0YXJ0IDwgaUxlbiAmJiBpU3RhcnQgPCBpRW5kKSB7DQotICAgICAgICB0ei50ekhvdXIgPSB0ei50ekhvdXIgKiAxMCArIHBTdHJbaVN0YXJ0KytdIC0gJzAnOw0KLSAgICB9DQotICAgIGlmIChpU3RhcnQgPCBpTGVuICYmIHBTdHJbaVN0YXJ0XSA9PSAnOicpIHsNCi0gICAgICAgIGlTdGFydCsrOw0KLSAgICB9DQotICAgIGlFbmQgPSBpU3RhcnQgKyAyOw0KLSAgICB3aGlsZSAoaVN0YXJ0IDwgaUxlbiAmJiBpU3RhcnQgPCBpRW5kKSB7DQotICAgICAgICB0ei50ek1pbnV0ZSA9IHR6LnR6TWludXRlICogMTAgKyBwU3RyW2lTdGFydCsrXSAtICcwJzsNCi0gICAgfQ0KLSAgICBpZiAocFN0clswXSA9PSAnLScpIHsNCi0gICAgICAgIHR6LnR6SG91ciA9IC10ei50ekhvdXI7DQotICAgIH0NCi0gICAgcmV0dXJuIGlTdGFydDsNCit2b2lkIENGWF9Mb2NhbGU6OkdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikgY29uc3Qgew0KKyAgdHoudHpIb3VyID0gMDsNCisgIHR6LnR6TWludXRlID0gMDsNCisgIGlmICghbV9wRWxlbWVudCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWE1MX0VsZW1lbnQqIHB4bWxUaW1lWm9uZSA9IG1fcEVsZW1lbnQtPkdldEVsZW1lbnQoIiIsIEZYX0JTVFJDKCJ0aW1lWm9uZSIpKTsNCisgIGlmIChweG1sVGltZVpvbmUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaW1lWm9uZSA9IHB4bWxUaW1lWm9uZS0+R2V0Q29udGVudCgwKTsNCisgICAgRlhfUGFyc2VUaW1lWm9uZSh3c1RpbWVab25lLCB3c1RpbWVab25lLkdldExlbmd0aCgpLCB0eik7DQorICB9DQogfQ0KLXZvaWQgQ0ZYX0xvY2FsZTo6R2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSBjb25zdA0KLXsNCi0gICAgdHoudHpIb3VyID0gMDsNCi0gICAgdHoudHpNaW51dGUgPSAwOw0KLSAgICBpZiAoIW1fcEVsZW1lbnQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWE1MX0VsZW1lbnQqIHB4bWxUaW1lWm9uZSA9IG1fcEVsZW1lbnQtPkdldEVsZW1lbnQoIiIsIEZYX0JTVFJDKCJ0aW1lWm9uZSIpKTsNCi0gICAgaWYgKHB4bWxUaW1lWm9uZSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaW1lWm9uZSA9IHB4bWxUaW1lWm9uZS0+R2V0Q29udGVudCgwKTsNCi0gICAgICAgIEZYX1BhcnNlVGltZVpvbmUod3NUaW1lWm9uZSwgd3NUaW1lWm9uZS5HZXRMZW5ndGgoKSwgdHopOw0KLSAgICB9DQordm9pZCBDRlhfTG9jYWxlOjpHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEKSBjb25zdCB7DQorICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfR2V0Q2FsZW5kYXJTeW1ib2wobV9wRWxlbWVudCwgImVyYSIsIGJBRCA/IDAgOiAxLCBGQUxTRSwgd3NFcmFOYW1lKTsNCiB9DQotdm9pZCBDRlhfTG9jYWxlOjpHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEICkgY29uc3QNCi17DQotICAgIGlmICghbV9wRWxlbWVudCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0dldENhbGVuZGFyU3ltYm9sKG1fcEVsZW1lbnQsICJlcmEiLCBiQUQgPyAwIDogMSwgRkFMU0UsIHdzRXJhTmFtZSk7DQorc3RhdGljIHZvaWQgRlhfR2V0UGF0dGVybihDWE1MX0VsZW1lbnQqIHBYbWxFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzQ2F0ZWdvcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTdWJDYXRlZ29yeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIHsNCisgIENGWF9CeXRlU3RyaW5nIGJzU3BhY2U7DQorICBDWE1MX0VsZW1lbnQqIHBEYXRlUGF0dGVybnMgPQ0KKyAgICAgIHBYbWxFbGVtZW50LT5HZXRFbGVtZW50KGJzU3BhY2UsIGJzQ2F0ZWdvcnkgKyAicyIpOw0KKyAgaWYgKCFwRGF0ZVBhdHRlcm5zKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHdzUGF0dGVybiA9DQorICAgICAgRlhfR2V0WE1MQ29udGVudChic1NwYWNlLCBwRGF0ZVBhdHRlcm5zLCBic0NhdGVnb3J5LCB3c1N1YkNhdGVnb3J5KTsNCiB9DQotc3RhdGljIHZvaWQgRlhfR2V0UGF0dGVybihDWE1MX0VsZW1lbnQqIHBYbWxFbGVtZW50LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNDYXRlZ29yeSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3ViQ2F0ZWdvcnksIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pDQotew0KLSAgICBDRlhfQnl0ZVN0cmluZyBic1NwYWNlOw0KLSAgICBDWE1MX0VsZW1lbnQqIHBEYXRlUGF0dGVybnMgPSBwWG1sRWxlbWVudC0+R2V0RWxlbWVudChic1NwYWNlLCBic0NhdGVnb3J5ICsgInMiKTsNCi0gICAgaWYgKCFwRGF0ZVBhdHRlcm5zKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgd3NQYXR0ZXJuID0gRlhfR2V0WE1MQ29udGVudChic1NwYWNlLCBwRGF0ZVBhdHRlcm5zLCBic0NhdGVnb3J5LCB3c1N1YkNhdGVnb3J5KTsNCitzdGF0aWMgdm9pZCBGWF9HZXREYXRlVGltZVBhdHRlcm4oQ1hNTF9FbGVtZW50KiBwWG1sRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzQ2F0ZWdvcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVHlwZSA9IGdfRlhMb2NhbGVEYXRlVGltZVN1YkNhdERhdGFbZVR5cGVdLnBOYW1lOw0KKyAgRlhfR2V0UGF0dGVybihwWG1sRWxlbWVudCwgYnNDYXRlZ29yeSwgd3NUeXBlLCB3c1BhdHRlcm4pOw0KIH0NCi1zdGF0aWMgdm9pZCBGWF9HZXREYXRlVGltZVBhdHRlcm4oQ1hNTF9FbGVtZW50KiBwWG1sRWxlbWVudCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzQ2F0ZWdvcnksIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1R5cGUgPSBnX0ZYTG9jYWxlRGF0ZVRpbWVTdWJDYXREYXRhW2VUeXBlXS5wTmFtZTsNCi0gICAgRlhfR2V0UGF0dGVybihwWG1sRWxlbWVudCwgYnNDYXRlZ29yeSwgd3NUeXBlLCB3c1BhdHRlcm4pOw0KK3ZvaWQgQ0ZYX0xvY2FsZTo6R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0IHsNCisgIGlmICghbV9wRWxlbWVudCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9HZXREYXRlVGltZVBhdHRlcm4obV9wRWxlbWVudCwgImRhdGVQYXR0ZXJuIiwgZVR5cGUsIHdzUGF0dGVybik7DQogfQ0KLXZvaWQgQ0ZYX0xvY2FsZTo6R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3QNCi17DQotICAgIGlmICghbV9wRWxlbWVudCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0dldERhdGVUaW1lUGF0dGVybihtX3BFbGVtZW50LCAiZGF0ZVBhdHRlcm4iLCBlVHlwZSwgd3NQYXR0ZXJuKTsNCit2b2lkIENGWF9Mb2NhbGU6OkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCB7DQorICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfR2V0RGF0ZVRpbWVQYXR0ZXJuKG1fcEVsZW1lbnQsICJ0aW1lUGF0dGVybiIsIGVUeXBlLCB3c1BhdHRlcm4pOw0KIH0NCi12b2lkIENGWF9Mb2NhbGU6OkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0DQotew0KLSAgICBpZiAoIW1fcEVsZW1lbnQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9HZXREYXRlVGltZVBhdHRlcm4obV9wRWxlbWVudCwgInRpbWVQYXR0ZXJuIiwgZVR5cGUsIHdzUGF0dGVybik7DQordm9pZCBDRlhfTG9jYWxlOjpHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCB7DQorICBDRlhfV2lkZVN0cmluZyB3c1R5cGUgPSBnX0ZYTG9jYWxlTnVtU3ViQ2F0RGF0YVtlVHlwZV0ucE5hbWU7DQorICBGWF9HZXRQYXR0ZXJuKG1fcEVsZW1lbnQsICJudW1iZXJQYXR0ZXJuIiwgd3NUeXBlLCB3c1BhdHRlcm4pOw0KIH0NCi12b2lkIENGWF9Mb2NhbGU6OkdldE51bVBhdHRlcm4oRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0DQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1R5cGUgPSBnX0ZYTG9jYWxlTnVtU3ViQ2F0RGF0YVtlVHlwZV0ucE5hbWU7DQotICAgIEZYX0dldFBhdHRlcm4obV9wRWxlbWVudCwgIm51bWJlclBhdHRlcm4iLCB3c1R5cGUsIHdzUGF0dGVybik7DQorc3RhdGljIEZYX0JPT0wgRlhfSXNEaWdpdChGWF9XQ0hBUiBjKSB7DQorICByZXR1cm4gYyA+PSAnMCcgJiYgYyA8PSAnOSc7DQogfQ0KLXN0YXRpYyBGWF9CT09MIEZYX0lzRGlnaXQoRlhfV0NIQVIgYykNCi17DQotICAgIHJldHVybiBjID49ICcwJyAmJiBjIDw9ICc5JzsNCitzdGF0aWMgRlhfQk9PTCBGWF9Jc0FscGhhKEZYX1dDSEFSIGMpIHsNCisgIHJldHVybiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJyk7DQogfQ0KLXN0YXRpYyBGWF9CT09MIEZYX0lzQWxwaGEoRlhfV0NIQVIgYykNCi17DQotICAgIHJldHVybiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJyk7DQorc3RhdGljIEZYX0JPT0wgRlhfSXNTcGFjZShGWF9XQ0hBUiBjKSB7DQorICByZXR1cm4gKGMgPT0gMHgyMCkgfHwgKGMgPT0gMHgwZCkgfHwgKGMgPT0gMHgwYSkgfHwgKGMgPT0gMHgwOSk7DQogfQ0KLXN0YXRpYyBGWF9CT09MIEZYX0lzU3BhY2UoRlhfV0NIQVIgYykNCi17DQotICAgIHJldHVybiAoYyA9PSAweDIwKSB8fCAoYyA9PSAweDBkKSB8fCAoYyA9PSAweDBhKSB8fCAoYyA9PSAweDA5KTsNCi19DQotc3RhdGljIGNvbnN0IEZYX0ZMT0FUIGdzX2ZyYWN0aW9uX3NjYWxlc1tdID0gezAuMWYsIDAuMDFmLCAwLjAwMWYsIDAuMDAwMWYsIDAuMDAwMDFmLCAwLjAwMDAwMWYsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMWYsIDAuMDAwMDAwMDFmLCAwLjAwMDAwMDAwMWYsIDAuMDAwMDAwMDAwMWYsIDAuMDAwMDAwMDAwMDFmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCi1zdGF0aWMgY29uc3QgaW50MzJfdCBnc19mcmFjdGlvbl9jb3VudCA9IHNpemVvZihnc19mcmFjdGlvbl9zY2FsZXMpIC8gc2l6ZW9mKEZYX0ZMT0FUKTsNCi1jbGFzcyBDRlhfTENOdW1lcmljDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX0xDTnVtZXJpYygpOw0KLSAgICBDRlhfTENOdW1lcmljKGludDY0X3QgaW50ZWdyYWwsIEZYX0RXT1JEIGZyYWN0aW9uYWwgPSAwLCBpbnQzMl90IGV4cG9uZW50ID0gMCk7DQotICAgIENGWF9MQ051bWVyaWMoRlhfRkxPQVQgZGJSZXRWYWx1ZSk7DQotICAgIENGWF9MQ051bWVyaWMoZG91YmxlIGRidmFsdWUpOw0KLSAgICBDRlhfTENOdW1lcmljKENGWF9XaWRlU3RyaW5nJiB3c051bWVyaWMpOw0KK3N0YXRpYyBjb25zdCBGWF9GTE9BVCBnc19mcmFjdGlvbl9zY2FsZXNbXSA9IHsNCisgICAgMC4xZiwgICAgICAgICAwLjAxZiwgICAgICAgICAwLjAwMWYsICAgICAgICAwLjAwMDFmLA0KKyAgICAwLjAwMDAxZiwgICAgIDAuMDAwMDAxZiwgICAgIDAuMDAwMDAwMWYsICAgIDAuMDAwMDAwMDFmLA0KKyAgICAwLjAwMDAwMDAwMWYsIDAuMDAwMDAwMDAwMWYsIDAuMDAwMDAwMDAwMDFmfTsNCitzdGF0aWMgY29uc3QgaW50MzJfdCBnc19mcmFjdGlvbl9jb3VudCA9DQorICAgIHNpemVvZihnc19mcmFjdGlvbl9zY2FsZXMpIC8gc2l6ZW9mKEZYX0ZMT0FUKTsNCitjbGFzcyBDRlhfTENOdW1lcmljIHsNCisgcHVibGljOg0KKyAgQ0ZYX0xDTnVtZXJpYygpOw0KKyAgQ0ZYX0xDTnVtZXJpYyhpbnQ2NF90IGludGVncmFsLA0KKyAgICAgICAgICAgICAgICBGWF9EV09SRCBmcmFjdGlvbmFsID0gMCwNCisgICAgICAgICAgICAgICAgaW50MzJfdCBleHBvbmVudCA9IDApOw0KKyAgQ0ZYX0xDTnVtZXJpYyhGWF9GTE9BVCBkYlJldFZhbHVlKTsNCisgIENGWF9MQ051bWVyaWMoZG91YmxlIGRidmFsdWUpOw0KKyAgQ0ZYX0xDTnVtZXJpYyhDRlhfV2lkZVN0cmluZyYgd3NOdW1lcmljKTsNCiANCi0gICAgRlhfRkxPQVQJCQkJR2V0RmxvYXQoKSBjb25zdDsNCi0gICAgZG91YmxlCQkJCQlHZXREb3VibGUoKSBjb25zdDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlUb1N0cmluZygpIGNvbnN0Ow0KLSAgICBDRlhfV2lkZVN0cmluZwkJCVRvU3RyaW5nKGludDMyX3QgblRyZWFkaW5nLCBGWF9CT09MIGJUcmltVGFpbFplcm9zKSBjb25zdDsNCi0gICAgaW50NjRfdAkJCQltX0ludGVncmFsOw0KLSAgICBGWF9EV09SRAkJCQltX0ZyYWN0aW9uYWw7DQorICBGWF9GTE9BVCBHZXRGbG9hdCgpIGNvbnN0Ow0KKyAgZG91YmxlIEdldERvdWJsZSgpIGNvbnN0Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgVG9TdHJpbmcoKSBjb25zdDsNCisgIENGWF9XaWRlU3RyaW5nIFRvU3RyaW5nKGludDMyX3QgblRyZWFkaW5nLCBGWF9CT09MIGJUcmltVGFpbFplcm9zKSBjb25zdDsNCisgIGludDY0X3QgbV9JbnRlZ3JhbDsNCisgIEZYX0RXT1JEIG1fRnJhY3Rpb25hbDsNCiAjaWZkZWYgRlhfTlVNX0RPVUJMRQ0KLSAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3NWYWx1ZTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NWYWx1ZTsNCiAjZW5kaWYNCi0gICAgaW50MzJfdAkJCQltX0V4cG9uZW50Ow0KKyAgaW50MzJfdCBtX0V4cG9uZW50Ow0KIH07DQotc3RhdGljIEZYX0JPT0wgRlhfV1N0cmluZ1RvTnVtZXJpYyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgQ0ZYX0xDTnVtZXJpYyYgbGNudW0pDQotew0KLSAgICBpbnQ2NF90ICpwSW50ZWdyYWwgPSAmbGNudW0ubV9JbnRlZ3JhbDsNCi0gICAgRlhfRFdPUkQgKnBGcmFjdGlvbmFsID0gJmxjbnVtLm1fRnJhY3Rpb25hbDsNCi0gICAgaW50MzJfdCAqcEV4cG9uZW50ID0gJmxjbnVtLm1fRXhwb25lbnQ7DQotICAgICpwSW50ZWdyYWwgPSAwOw0KLSAgICAqcEZyYWN0aW9uYWwgPSAwOw0KLSAgICAqcEV4cG9uZW50ID0gMDsNCitzdGF0aWMgRlhfQk9PTCBGWF9XU3RyaW5nVG9OdW1lcmljKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0xDTnVtZXJpYyYgbGNudW0pIHsNCisgIGludDY0X3QqIHBJbnRlZ3JhbCA9ICZsY251bS5tX0ludGVncmFsOw0KKyAgRlhfRFdPUkQqIHBGcmFjdGlvbmFsID0gJmxjbnVtLm1fRnJhY3Rpb25hbDsNCisgIGludDMyX3QqIHBFeHBvbmVudCA9ICZsY251bS5tX0V4cG9uZW50Ow0KKyAgKnBJbnRlZ3JhbCA9IDA7DQorICAqcEZyYWN0aW9uYWwgPSAwOw0KKyAgKnBFeHBvbmVudCA9IDA7DQogI2lmZGVmIEZYX05VTV9ET1VCTEUNCi0gICAgbGNudW0ubV93c1ZhbHVlLkVtcHR5KCk7DQorICBsY251bS5tX3dzVmFsdWUuRW1wdHkoKTsNCiAjZW5kaWYNCi0gICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgY29uc3QgaW50MzJfdCBuSW50ZWdyYWxNYXhMZW4gPSAxNzsNCisgIGludDMyX3QgY2MgPSAwOw0KKyAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRSwgYkV4cFNpZ24gPSBGQUxTRTsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWU7DQorICBpbnQzMl90IGxlbiA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNTcGFjZShzdHJbY2NdKSkgew0KKyAgICBjYysrOw0KKyAgfQ0KKyAgaWYgKGNjID49IGxlbikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgY2MrKzsNCisgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgYk5lZ2F0aXZlID0gVFJVRTsNCisgICAgY2MrKzsNCisgIH0NCisgIGludDMyX3QgbkludGVncmFsTGVuID0gMDsNCisgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICBpZiAoc3RyW2NjXSA9PSAnLicpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KKyAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICBpZiAoKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKG5JbnRlZ3JhbExlbiA8IG5JbnRlZ3JhbE1heExlbikgew0KKyAgICAgICpwSW50ZWdyYWwgPSAqcEludGVncmFsICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgIG5JbnRlZ3JhbExlbisrOw0KKyAgICB9DQorICAgIGNjKys7DQorICB9DQorICAqcEludGVncmFsID0gYk5lZ2F0aXZlID8gLSpwSW50ZWdyYWwgOiAqcEludGVncmFsOw0KKyAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7DQorICAgIGludCBzY2FsZSA9IDA7DQorICAgIGRvdWJsZSBmcmFjdGlvbiA9IDAuMDsNCisgICAgY2MrKzsNCisgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgaWYgKHNjYWxlID49IGdzX2ZyYWN0aW9uX2NvdW50KSB7DQorICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICBpZiAoKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZnJhY3Rpb24gKz0gZ3NfZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsNCisgICAgICBzY2FsZSsrOw0KKyAgICAgIGNjKys7DQorICAgIH0NCisgICAgKnBGcmFjdGlvbmFsID0gKEZYX0RXT1JEKShmcmFjdGlvbiAqIDQyOTQ5NjcyOTYuMCk7DQorICB9DQorICBpZiAoY2MgPCBsZW4gJiYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgew0KKyAgICBjYysrOw0KKyAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgIGNjKys7DQorICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgew0KKyAgICAgICAgYkV4cFNpZ24gPSBUUlVFOw0KKyAgICAgICAgY2MrKzsNCisgICAgICB9DQorICAgIH0NCisgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgKnBFeHBvbmVudCA9ICpwRXhwb25lbnQgKiAxMCArIHN0cltjY10gLSAnMCc7DQorICAgICAgY2MrKzsNCisgICAgfQ0KKyAgICAqcEV4cG9uZW50ID0gYkV4cFNpZ24gPyAtKnBFeHBvbmVudCA6ICpwRXhwb25lbnQ7DQorICB9DQorI2lmZGVmIEZYX05VTV9ET1VCTEUNCisgIGVsc2Ugew0KKyAgICBsY251bS5tX3dzVmFsdWUgPSB3c1ZhbHVlOw0KKyAgfQ0KKyNlbmRpZg0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9MQ051bWVyaWM6OkNGWF9MQ051bWVyaWMoKSB7DQorICBtX0ludGVncmFsID0gMDsNCisgIG1fRnJhY3Rpb25hbCA9IDA7DQorICBtX0V4cG9uZW50ID0gMDsNCit9DQorQ0ZYX0xDTnVtZXJpYzo6Q0ZYX0xDTnVtZXJpYyhpbnQ2NF90IGludGVncmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZnJhY3Rpb25hbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXhwb25lbnQpIHsNCisgIG1fSW50ZWdyYWwgPSBpbnRlZ3JhbDsNCisgIG1fRnJhY3Rpb25hbCA9IGZyYWN0aW9uYWw7DQorICBtX0V4cG9uZW50ID0gZXhwb25lbnQ7DQorfQ0KK0NGWF9MQ051bWVyaWM6OkNGWF9MQ051bWVyaWMoRlhfRkxPQVQgZGJSZXRWYWx1ZSkgew0KKyAgbV9JbnRlZ3JhbCA9IChpbnQ2NF90KWRiUmV0VmFsdWU7DQorICBtX0ZyYWN0aW9uYWwgPSAoRlhfRFdPUkQpKCgoZGJSZXRWYWx1ZSA+IDApID8gKGRiUmV0VmFsdWUgLSBtX0ludGVncmFsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChtX0ludGVncmFsIC0gZGJSZXRWYWx1ZSkpICoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI5NDk2NzI5Nik7DQorICBtX0V4cG9uZW50ID0gMDsNCit9DQorQ0ZYX0xDTnVtZXJpYzo6Q0ZYX0xDTnVtZXJpYyhkb3VibGUgZGJ2YWx1ZSkgew0KKyAgbV9JbnRlZ3JhbCA9IChpbnQ2NF90KWRidmFsdWU7DQorICBtX0ZyYWN0aW9uYWwgPSAoRlhfRFdPUkQpKA0KKyAgICAgICgoZGJ2YWx1ZSA+IDApID8gKGRidmFsdWUgLSBtX0ludGVncmFsKSA6IChtX0ludGVncmFsIC0gZGJ2YWx1ZSkpICoNCisgICAgICA0Mjk0OTY3Mjk2KTsNCisgIG1fRXhwb25lbnQgPSAwOw0KK30NCitDRlhfTENOdW1lcmljOjpDRlhfTENOdW1lcmljKENGWF9XaWRlU3RyaW5nJiB3c051bWVyaWMpIHsNCisgIEZYX1dTdHJpbmdUb051bWVyaWMod3NOdW1lcmljLCAqdGhpcyk7DQorfQ0KK0ZYX0ZMT0FUIENGWF9MQ051bWVyaWM6OkdldEZsb2F0KCkgY29uc3Qgew0KKyAgRlhfRkxPQVQgZGJSZXRWYWx1ZSA9IG1fRnJhY3Rpb25hbCAvIDQyOTQ5NjcyOTYuMGY7DQorICBkYlJldFZhbHVlID0gbV9JbnRlZ3JhbCArIChtX0ludGVncmFsID49IDAgPyBkYlJldFZhbHVlIDogLWRiUmV0VmFsdWUpOw0KKyAgaWYgKG1fRXhwb25lbnQgIT0gMCkgew0KKyAgICBkYlJldFZhbHVlICo9IEZYU1lTX3BvdygxMCwgKEZYX0ZMT0FUKW1fRXhwb25lbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIGRiUmV0VmFsdWU7DQorfQ0KK2RvdWJsZSBDRlhfTENOdW1lcmljOjpHZXREb3VibGUoKSBjb25zdCB7DQorICBkb3VibGUgdmFsdWUgPSBtX0ZyYWN0aW9uYWwgLyA0Mjk0OTY3Mjk2LjA7DQorICB2YWx1ZSA9IG1fSW50ZWdyYWwgKyAobV9JbnRlZ3JhbCA+PSAwID8gdmFsdWUgOiAtdmFsdWUpOw0KKyAgaWYgKG1fRXhwb25lbnQgIT0gMCkgew0KKyAgICB2YWx1ZSAqPSBGWFNZU19wb3coMTAsIChGWF9GTE9BVCltX0V4cG9uZW50KTsNCisgIH0NCisgIHJldHVybiB2YWx1ZTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0xDTnVtZXJpYzo6VG9TdHJpbmcoKSBjb25zdCB7DQorICByZXR1cm4gVG9TdHJpbmcoOCwgVFJVRSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENGWF9MQ051bWVyaWM6OlRvU3RyaW5nKGludDMyX3QgblRyZWFkaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyaW1UYWlsWmVyb3MpIGNvbnN0IHsNCisjaWZkZWYgRlhfTlVNX0RPVUJMRQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXN1bHQ7DQorICBpZiAoIW1fd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCiAgICAgY29uc3QgaW50MzJfdCBuSW50ZWdyYWxNYXhMZW4gPSAxNzsNCiAgICAgaW50MzJfdCBjYyA9IDA7DQogICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0UsIGJFeHBTaWduID0gRkFMU0U7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWU7DQotICAgIGludDMyX3QgbGVuID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCisgICAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IChjb25zdCBGWF9XQ0hBUiopbV93c1ZhbHVlOw0KKyAgICBpbnQzMl90IGxlbiA9IG1fd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCiAgICAgd2hpbGUgKGNjIDwgbGVuICYmIEZYX0lzU3BhY2Uoc3RyW2NjXSkpIHsNCi0gICAgICAgIGNjKys7DQorICAgICAgY2MrKzsNCiAgICAgfQ0KICAgICBpZiAoY2MgPj0gbGVuKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgcmV0dXJuIHdzUmVzdWx0Ow0KICAgICB9DQogICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KLSAgICAgICAgY2MrKzsNCisgICAgICBjYysrOw0KICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJy0nKSB7DQotICAgICAgICBiTmVnYXRpdmUgPSBUUlVFOw0KLSAgICAgICAgY2MrKzsNCisgICAgICBiTmVnYXRpdmUgPSBUUlVFOw0KKyAgICAgIGNjKys7DQogICAgIH0NCiAgICAgaW50MzJfdCBuSW50ZWdyYWxMZW4gPSAwOw0KICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCi0gICAgICAgIGlmIChzdHJbY2NdID09ICcuJykgew0KLSAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgIGlmIChzdHJbY2NdID09ICcuJykgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgaWYgKChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXR1cm4gd3NSZXN1bHQ7DQogICAgICAgICB9DQotICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICBpZiAoKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG5JbnRlZ3JhbExlbiA8IG5JbnRlZ3JhbE1heExlbikgew0KLSAgICAgICAgICAgICpwSW50ZWdyYWwgPSAqcEludGVncmFsICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KLSAgICAgICAgICAgIG5JbnRlZ3JhbExlbisrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2MgKys7DQorICAgICAgfQ0KKyAgICAgIGlmIChuSW50ZWdyYWxMZW4gPCBuSW50ZWdyYWxNYXhMZW4pIHsNCisgICAgICAgICpwSW50ZWdyYWwgPSAqcEludGVncmFsICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgbkludGVncmFsTGVuKys7DQorICAgICAgfQ0KKyAgICAgIGNjKys7DQogICAgIH0NCiAgICAgKnBJbnRlZ3JhbCA9IGJOZWdhdGl2ZSA/IC0qcEludGVncmFsIDogKnBJbnRlZ3JhbDsNCiAgICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7DQotICAgICAgICBpbnQgc2NhbGUgPSAwOw0KLSAgICAgICAgZG91YmxlIGZyYWN0aW9uID0gMC4wOw0KLSAgICAgICAgY2MgKys7DQotICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCi0gICAgICAgICAgICBpZiAoc2NhbGUgPj0gZ3NfZnJhY3Rpb25fY291bnQpIHsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQorICAgICAgaW50IHNjYWxlID0gMDsNCisgICAgICBkb3VibGUgZnJhY3Rpb24gPSAwLjA7DQorICAgICAgY2MrKzsNCisgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgIGlmIChzY2FsZSA+PSBnc19mcmFjdGlvbl9jb3VudCkgew0KKyAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCiAgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgZnJhY3Rpb24gKz0gZ3NfZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsNCi0gICAgICAgICAgICBzY2FsZSArKzsNCi0gICAgICAgICAgICBjYyArKzsNCi0gICAgICAgIH0NCi0gICAgICAgICpwRnJhY3Rpb25hbCA9IChGWF9EV09SRCkoZnJhY3Rpb24gKiA0Mjk0OTY3Mjk2LjApOw0KLSAgICB9DQotICAgIGlmIChjYyA8IGxlbiAmJiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQotICAgICAgICBjYyArKzsNCi0gICAgICAgIGlmIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KLSAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCi0gICAgICAgICAgICAgICAgYkV4cFNpZ24gPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgKnBFeHBvbmVudCA9ICpwRXhwb25lbnQgKiAxMCArIHN0cltjY10gLSAnMCc7DQotICAgICAgICAgICAgY2MgKys7DQotICAgICAgICB9DQotICAgICAgICAqcEV4cG9uZW50ID0gYkV4cFNpZ24gPyAtKnBFeHBvbmVudCA6ICpwRXhwb25lbnQ7DQotICAgIH0NCi0jaWZkZWYgRlhfTlVNX0RPVUJMRQ0KLSAgICBlbHNlIHsNCi0gICAgICAgIGxjbnVtLm1fd3NWYWx1ZSA9IHdzVmFsdWU7DQotICAgIH0NCi0jZW5kaWYNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUNGWF9MQ051bWVyaWM6OkNGWF9MQ051bWVyaWMoKQ0KLXsNCi0gICAgbV9JbnRlZ3JhbCA9IDA7DQotICAgIG1fRnJhY3Rpb25hbCA9IDA7DQotICAgIG1fRXhwb25lbnQgPSAwOw0KLX0NCi1DRlhfTENOdW1lcmljOjpDRlhfTENOdW1lcmljKGludDY0X3QgaW50ZWdyYWwsIEZYX0RXT1JEIGZyYWN0aW9uYWwgLCBpbnQzMl90IGV4cG9uZW50ICkNCi17DQotICAgIG1fSW50ZWdyYWwgPSBpbnRlZ3JhbDsNCi0gICAgbV9GcmFjdGlvbmFsID0gZnJhY3Rpb25hbDsNCi0gICAgbV9FeHBvbmVudCA9IGV4cG9uZW50Ow0KLX0NCi1DRlhfTENOdW1lcmljOjpDRlhfTENOdW1lcmljKEZYX0ZMT0FUIGRiUmV0VmFsdWUpDQotew0KLSAgICBtX0ludGVncmFsID0gKGludDY0X3QpZGJSZXRWYWx1ZTsNCi0gICAgbV9GcmFjdGlvbmFsID0gKEZYX0RXT1JEKSgoKGRiUmV0VmFsdWUgPiAwKSA/IChkYlJldFZhbHVlIC0gbV9JbnRlZ3JhbCkgOiAobV9JbnRlZ3JhbCAtIGRiUmV0VmFsdWUpKSAqIDQyOTQ5NjcyOTYpOw0KLSAgICBtX0V4cG9uZW50ID0gMDsNCi19DQotQ0ZYX0xDTnVtZXJpYzo6Q0ZYX0xDTnVtZXJpYyhkb3VibGUgZGJ2YWx1ZSkNCi17DQotICAgIG1fSW50ZWdyYWwgPSAoaW50NjRfdClkYnZhbHVlOw0KLSAgICBtX0ZyYWN0aW9uYWwgPSAoRlhfRFdPUkQpKCgoZGJ2YWx1ZSA+IDApID8gKGRidmFsdWUgLSBtX0ludGVncmFsKSA6IChtX0ludGVncmFsIC0gZGJ2YWx1ZSkpICogNDI5NDk2NzI5Nik7DQotICAgIG1fRXhwb25lbnQgPSAwOw0KLX0NCi1DRlhfTENOdW1lcmljOjpDRlhfTENOdW1lcmljKENGWF9XaWRlU3RyaW5nJiB3c051bWVyaWMpDQotew0KLSAgICBGWF9XU3RyaW5nVG9OdW1lcmljKHdzTnVtZXJpYywgKnRoaXMpOw0KLX0NCi1GWF9GTE9BVCBDRlhfTENOdW1lcmljOjpHZXRGbG9hdCgpIGNvbnN0DQotew0KLSAgICBGWF9GTE9BVCBkYlJldFZhbHVlID0gbV9GcmFjdGlvbmFsIC8gNDI5NDk2NzI5Ni4wZjsNCi0gICAgZGJSZXRWYWx1ZSA9IG1fSW50ZWdyYWwgKyAobV9JbnRlZ3JhbCA+PSAwID8gZGJSZXRWYWx1ZSA6IC1kYlJldFZhbHVlKTsNCi0gICAgaWYgKG1fRXhwb25lbnQgIT0gMCkgew0KLSAgICAgICAgZGJSZXRWYWx1ZSAqPSBGWFNZU19wb3coMTAsIChGWF9GTE9BVCltX0V4cG9uZW50KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gZGJSZXRWYWx1ZTsNCi19DQotZG91YmxlIENGWF9MQ051bWVyaWM6OkdldERvdWJsZSgpIGNvbnN0DQotew0KLSAgICBkb3VibGUgdmFsdWUgPSBtX0ZyYWN0aW9uYWwgLyA0Mjk0OTY3Mjk2LjA7DQotICAgIHZhbHVlID0gbV9JbnRlZ3JhbCArIChtX0ludGVncmFsID49IDAgPyB2YWx1ZSA6IC12YWx1ZSk7DQotICAgIGlmIChtX0V4cG9uZW50ICE9IDApIHsNCi0gICAgICAgIHZhbHVlICo9IEZYU1lTX3BvdygxMCwgKEZYX0ZMT0FUKW1fRXhwb25lbnQpOw0KLSAgICB9DQotICAgIHJldHVybiB2YWx1ZTsNCi19DQotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0xDTnVtZXJpYzo6VG9TdHJpbmcoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIFRvU3RyaW5nKDgsIFRSVUUpOw0KLX0NCi1DRlhfV2lkZVN0cmluZyBDRlhfTENOdW1lcmljOjpUb1N0cmluZyhpbnQzMl90IG5UcmVhZGluZywgRlhfQk9PTCBiVHJpbVRhaWxaZXJvcykgY29uc3QNCi17DQotI2lmZGVmIEZYX05VTV9ET1VCTEUNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXN1bHQ7DQotICAgIGlmICghbV93c1ZhbHVlLklzRW1wdHkoKSkgew0KLSAgICAgICAgY29uc3QgaW50MzJfdCBuSW50ZWdyYWxNYXhMZW4gPSAxNzsNCi0gICAgICAgIGludDMyX3QgY2MgPSAwOw0KLSAgICAgICAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRSwgYkV4cFNpZ24gPSBGQUxTRTsNCi0gICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKW1fd3NWYWx1ZTsNCi0gICAgICAgIGludDMyX3QgbGVuID0gbV93c1ZhbHVlLkdldExlbmd0aCgpOw0KLSAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIEZYX0lzU3BhY2Uoc3RyW2NjXSkpIHsNCiAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBpZiAoY2MgPj0gbGVuKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzUmVzdWx0Ow0KKyAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgIGlmICgoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCi0gICAgICAgICAgICBjYysrOw0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgew0KLSAgICAgICAgICAgIGJOZWdhdGl2ZSA9IFRSVUU7DQotICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgbkludGVncmFsTGVuID0gMDsNCi0gICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcuJykgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgIGlmICgoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB3c1Jlc3VsdDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAobkludGVncmFsTGVuIDwgbkludGVncmFsTWF4TGVuKSB7DQotICAgICAgICAgICAgICAgICpwSW50ZWdyYWwgPSAqcEludGVncmFsICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KLSAgICAgICAgICAgICAgICBuSW50ZWdyYWxMZW4rKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2MgKys7DQotICAgICAgICB9DQotICAgICAgICAqcEludGVncmFsID0gYk5lZ2F0aXZlID8gLSpwSW50ZWdyYWwgOiAqcEludGVncmFsOw0KLSAgICAgICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7DQotICAgICAgICAgICAgaW50IHNjYWxlID0gMDsNCi0gICAgICAgICAgICBkb3VibGUgZnJhY3Rpb24gPSAwLjA7DQotICAgICAgICAgICAgY2MgKys7DQotICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQotICAgICAgICAgICAgICAgIGlmIChzY2FsZSA+PSBnc19mcmFjdGlvbl9jb3VudCkgew0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZyYWN0aW9uICs9IGdzX2ZyYWN0aW9uX3NjYWxlc1tzY2FsZV0gKiAoc3RyW2NjXSAtICcwJyk7DQotICAgICAgICAgICAgICAgIHNjYWxlICsrOw0KLSAgICAgICAgICAgICAgICBjYyArKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgKnBGcmFjdGlvbmFsID0gKEZYX0RXT1JEKShmcmFjdGlvbiAqIDQyOTQ5NjcyOTYuMCk7DQotICAgICAgICB9DQorICAgICAgICBmcmFjdGlvbiArPSBnc19mcmFjdGlvbl9zY2FsZXNbc2NhbGVdICogKHN0cltjY10gLSAnMCcpOw0KKyAgICAgICAgc2NhbGUrKzsNCisgICAgICAgIGNjKys7DQorICAgICAgfQ0KKyAgICAgICpwRnJhY3Rpb25hbCA9IChGWF9EV09SRCkoZnJhY3Rpb24gKiA0Mjk0OTY3Mjk2LjApOw0KICAgICB9DQotICAgIGRvdWJsZSBkYlZhbGV1ID0gR2V0RG91YmxlKCk7DQotICAgIGludDY0X3QgaUludGUgPSAoaW50NjRfdClkYlZhbGV1Ow0KLSAgICB3c1Jlc3VsdC5Gb3JtYXQoTCIlbCIsIChpbnQ2NF90KWlJbnRlKTsNCi0gICAgaWYgKG1fRnJhY3Rpb25hbCkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQotICAgICAgICB3c0Zvcm1hdC5Gb3JtYXQoTCIlJS4lZEciLCBuVHJlYWRpbmcpOw0KLSAgICAgICAgZG91YmxlIGRibE1hbnRpc3NhID0gKGRiVmFsZXUgPiAwKSA/IChkYlZhbGV1IC0gaUludGUpIDogKGlJbnRlIC0gZGJWYWxldSk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZyYWM7DQotICAgICAgICB3c0ZyYWMuRm9ybWF0KChjb25zdCBGWF9XQ0hBUiopd3NGb3JtYXQsIGRibE1hbnRpc3NhKTsNCi0gICAgICAgIHdzUmVzdWx0ICs9IENGWF9XaWRlU3RyaW5nQygoY29uc3QgRlhfV0NIQVIqKXdzRnJhYyArIDEsIHdzRnJhYy5HZXRMZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgaWYgKGJUcmltVGFpbFplcm9zICYmIG5UcmVhZGluZyA+IDApIHsNCi0gICAgICAgICAgICB3c1Jlc3VsdC5UcmltUmlnaHQoTCIwIik7DQotICAgICAgICAgICAgd3NSZXN1bHQuVHJpbVJpZ2h0KEwiLiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotI2VuZGlmDQorICB9DQorICBkb3VibGUgZGJWYWxldSA9IEdldERvdWJsZSgpOw0KKyAgaW50NjRfdCBpSW50ZSA9IChpbnQ2NF90KWRiVmFsZXU7DQorICB3c1Jlc3VsdC5Gb3JtYXQoTCIlbCIsIChpbnQ2NF90KWlJbnRlKTsNCisgIGlmIChtX0ZyYWN0aW9uYWwpIHsNCiAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQotICAgIHdzRm9ybWF0LkZvcm1hdChMIiUlLiVkZiIsIG5UcmVhZGluZyk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzUmVzdWx0Ow0KLSAgICB3c1Jlc3VsdC5Gb3JtYXQod3NGb3JtYXQuY19zdHIoKSwgR2V0RG91YmxlKCkpOw0KKyAgICB3c0Zvcm1hdC5Gb3JtYXQoTCIlJS4lZEciLCBuVHJlYWRpbmcpOw0KKyAgICBkb3VibGUgZGJsTWFudGlzc2EgPSAoZGJWYWxldSA+IDApID8gKGRiVmFsZXUgLSBpSW50ZSkgOiAoaUludGUgLSBkYlZhbGV1KTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGcmFjOw0KKyAgICB3c0ZyYWMuRm9ybWF0KChjb25zdCBGWF9XQ0hBUiopd3NGb3JtYXQsIGRibE1hbnRpc3NhKTsNCisgICAgd3NSZXN1bHQgKz0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nQygoY29uc3QgRlhfV0NIQVIqKXdzRnJhYyArIDEsIHdzRnJhYy5HZXRMZW5ndGgoKSAtIDEpOw0KICAgICBpZiAoYlRyaW1UYWlsWmVyb3MgJiYgblRyZWFkaW5nID4gMCkgew0KLSAgICAgICAgd3NSZXN1bHQuVHJpbVJpZ2h0KEwiMCIpOw0KLSAgICAgICAgd3NSZXN1bHQuVHJpbVJpZ2h0KEwiLiIpOw0KKyAgICAgIHdzUmVzdWx0LlRyaW1SaWdodChMIjAiKTsNCisgICAgICB3c1Jlc3VsdC5UcmltUmlnaHQoTCIuIik7DQogICAgIH0NCi0gICAgcmV0dXJuIHdzUmVzdWx0Ow0KKyAgfQ0KKyNlbmRpZg0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQorICB3c0Zvcm1hdC5Gb3JtYXQoTCIlJS4lZGYiLCBuVHJlYWRpbmcpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXN1bHQ7DQorICB3c1Jlc3VsdC5Gb3JtYXQod3NGb3JtYXQuY19zdHIoKSwgR2V0RG91YmxlKCkpOw0KKyAgaWYgKGJUcmltVGFpbFplcm9zICYmIG5UcmVhZGluZyA+IDApIHsNCisgICAgd3NSZXN1bHQuVHJpbVJpZ2h0KEwiMCIpOw0KKyAgICB3c1Jlc3VsdC5UcmltUmlnaHQoTCIuIik7DQorICB9DQorICByZXR1cm4gd3NSZXN1bHQ7DQogfQ0KLUlGWF9Gb3JtYXRTdHJpbmcqIElGWF9Gb3JtYXRTdHJpbmc6OkNyZWF0ZShJRlhfTG9jYWxlTWdyKiBwTG9jYWxlTWdyLCBGWF9CT09MIGJVc2VMQ0lEKQ0KLXsNCi0gICAgaWYgKCFwTG9jYWxlTWdyKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhfTkVXIENGWF9Gb3JtYXRTdHJpbmcocExvY2FsZU1nciwgYlVzZUxDSUQpOw0KK0lGWF9Gb3JtYXRTdHJpbmcqIElGWF9Gb3JtYXRTdHJpbmc6OkNyZWF0ZShJRlhfTG9jYWxlTWdyKiBwTG9jYWxlTWdyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VMQ0lEKSB7DQorICBpZiAoIXBMb2NhbGVNZ3IpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gRlhfTkVXIENGWF9Gb3JtYXRTdHJpbmcocExvY2FsZU1nciwgYlVzZUxDSUQpOw0KIH0NCiBDRlhfRm9ybWF0U3RyaW5nOjpDRlhfRm9ybWF0U3RyaW5nKElGWF9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IsIEZYX0JPT0wgYlVzZUxDSUQpDQotICAgIDogbV9wTG9jYWxlTWdyKHBMb2NhbGVNZ3IpDQotICAgICwgbV9iVXNlTENJRChiVXNlTENJRCkNCi17DQotfQ0KLUNGWF9Gb3JtYXRTdHJpbmc6On5DRlhfRm9ybWF0U3RyaW5nKCkNCi17DQotfQ0KLXZvaWQgQ0ZYX0Zvcm1hdFN0cmluZzo6U3BsaXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0U3RyaW5nLCBDRlhfV2lkZVN0cmluZ0FycmF5JiB3c1BhdHRlcm5zKQ0KLXsNCi0gICAgaW50MzJfdCBpU3RyTGVuID0gd3NGb3JtYXRTdHJpbmcuR2V0TGVuZ3RoKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c0Zvcm1hdFN0cmluZzsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBUb2tlbiA9IHBTdHI7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwRW5kID0gcFN0ciArIGlTdHJMZW47DQotICAgIEZYX0JPT0wgaVF1b3RlID0gRkFMU0U7DQotICAgIHdoaWxlIChUUlVFKSB7DQotICAgICAgICBpZiAocFN0ciA+PSBwRW5kKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3ViKHBUb2tlbiwgcFN0ciAtIHBUb2tlbik7DQotICAgICAgICAgICAgd3NQYXR0ZXJucy5BZGQoc3ViKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9IGVsc2UgaWYgKCpwU3RyID09ICdcJycpIHsNCi0gICAgICAgICAgICBpUXVvdGUgPSAhaVF1b3RlOw0KLSAgICAgICAgfSBlbHNlIGlmICgqcFN0ciA9PSBMJ3wnICYmICFpUXVvdGUpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzdWIocFRva2VuLCBwU3RyIC0gcFRva2VuKTsNCi0gICAgICAgICAgICB3c1BhdHRlcm5zLkFkZChzdWIpOw0KLSAgICAgICAgICAgIHBUb2tlbiA9IHBTdHIgKyAxOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFN0ciArKzsNCisgICAgOiBtX3BMb2NhbGVNZ3IocExvY2FsZU1nciksIG1fYlVzZUxDSUQoYlVzZUxDSUQpIHt9DQorQ0ZYX0Zvcm1hdFN0cmluZzo6fkNGWF9Gb3JtYXRTdHJpbmcoKSB7fQ0KK3ZvaWQgQ0ZYX0Zvcm1hdFN0cmluZzo6U3BsaXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0U3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgd3NQYXR0ZXJucykgew0KKyAgaW50MzJfdCBpU3RyTGVuID0gd3NGb3JtYXRTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NGb3JtYXRTdHJpbmc7DQorICBjb25zdCBGWF9XQ0hBUiogcFRva2VuID0gcFN0cjsNCisgIGNvbnN0IEZYX1dDSEFSKiBwRW5kID0gcFN0ciArIGlTdHJMZW47DQorICBGWF9CT09MIGlRdW90ZSA9IEZBTFNFOw0KKyAgd2hpbGUgKFRSVUUpIHsNCisgICAgaWYgKHBTdHIgPj0gcEVuZCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHN1YihwVG9rZW4sIHBTdHIgLSBwVG9rZW4pOw0KKyAgICAgIHdzUGF0dGVybnMuQWRkKHN1Yik7DQorICAgICAgcmV0dXJuOw0KKyAgICB9IGVsc2UgaWYgKCpwU3RyID09ICdcJycpIHsNCisgICAgICBpUXVvdGUgPSAhaVF1b3RlOw0KKyAgICB9IGVsc2UgaWYgKCpwU3RyID09IEwnfCcgJiYgIWlRdW90ZSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHN1YihwVG9rZW4sIHBTdHIgLSBwVG9rZW4pOw0KKyAgICAgIHdzUGF0dGVybnMuQWRkKHN1Yik7DQorICAgICAgcFRva2VuID0gcFN0ciArIDE7DQogICAgIH0NCisgICAgcFN0cisrOw0KKyAgfQ0KIH0NCi1zdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgRlhfR2V0TGl0ZXJhbFRleHQoY29uc3QgRlhfV0NIQVIqIHBTdHJQYXR0ZXJuLCBpbnQzMl90ICZpUGF0dGVybiwgaW50MzJfdCBpTGVuUGF0dGVybikNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzT3V0cHV0Ow0KLSAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9ICdcJycpIHsNCi0gICAgICAgIHJldHVybiB3c091dHB1dDsNCi0gICAgfQ0KLSAgICBpUGF0dGVybisrOw0KLSAgICBpbnQzMl90IGlRdW90ZSA9IDE7DQotICAgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuKSB7DQotICAgICAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcJycpIHsNCi0gICAgICAgICAgICBpUXVvdGUrKzsNCi0gICAgICAgICAgICBpZiAoKGlQYXR0ZXJuICsgMSA+PSBpTGVuUGF0dGVybikgfHwgKChwU3RyUGF0dGVybltpUGF0dGVybiArIDFdICE9ICdcJycpICYmIChpUXVvdGUgJSAyID09IDApKSkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpUXVvdGUrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaVBhdHRlcm4rKzsNCi0gICAgICAgIH0gZWxzZSBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcXCcgJiYgKGlQYXR0ZXJuICsgMSA8IGlMZW5QYXR0ZXJuKSAmJiBwU3RyUGF0dGVybltpUGF0dGVybiArIDFdID09ICd1Jykgew0KLSAgICAgICAgICAgIGludDMyX3QgaUtleVZhbHVlID0gMDsNCi0gICAgICAgICAgICBpUGF0dGVybiArPSAyOw0KLSAgICAgICAgICAgIGludDMyX3QgaSA9IDA7DQotICAgICAgICAgICAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4gJiYgaSsrIDwgNCkgew0KLSAgICAgICAgICAgICAgICBGWF9XQ0hBUiBjaCA9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuKytdOw0KLSAgICAgICAgICAgICAgICBpZiAoKGNoID49ICcwJyAmJiBjaCA8PSAnOScpKSB7DQotICAgICAgICAgICAgICAgICAgICBpS2V5VmFsdWUgPSBpS2V5VmFsdWUgKiAxNiArIGNoIC0gJzAnOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaUtleVZhbHVlID0gaUtleVZhbHVlICogMTYgKyBjaCAtICdhJyArIDEwOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaUtleVZhbHVlID0gaUtleVZhbHVlICogMTYgKyBjaCAtICdBJyArIDEwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChpS2V5VmFsdWUgIT0gMCkgew0KLSAgICAgICAgICAgICAgICB3c091dHB1dCArPSAoRlhfV0NIQVIpKGlLZXlWYWx1ZSAmIDB4MDAwMEZGRkYpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHdzT3V0cHV0ICs9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuKytdOw0KLSAgICB9DQorc3RhdGljIENGWF9XaWRlU3RyaW5nIEZYX0dldExpdGVyYWxUZXh0KGNvbnN0IEZYX1dDSEFSKiBwU3RyUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlblBhdHRlcm4pIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzT3V0cHV0Ow0KKyAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSAhPSAnXCcnKSB7DQogICAgIHJldHVybiB3c091dHB1dDsNCi19DQotc3RhdGljIENGWF9XaWRlU3RyaW5nIEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4sIGludDMyX3QgJmlQYXR0ZXJuKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7DQotICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gIT0gJ1wnJykgew0KLSAgICAgICAgcmV0dXJuIHdzT3V0cHV0Ow0KLSAgICB9DQotICAgIGlQYXR0ZXJuLS07DQotICAgIGludDMyX3QgaVF1b3RlID0gMTsNCi0gICAgd2hpbGUgKGlQYXR0ZXJuID49IDApIHsNCi0gICAgICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgew0KLSAgICAgICAgICAgIGlRdW90ZSsrOw0KLSAgICAgICAgICAgIGlmIChpUGF0dGVybiAtIDEgPj0gMCB8fCAoKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuIC0gMV0gIT0gJ1wnJykgJiYgKGlRdW90ZSAlIDIgPT0gMCkpKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlRdW90ZSsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpUGF0dGVybi0tOw0KLSAgICAgICAgfSBlbHNlIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1xcJyAmJiBwU3RyUGF0dGVybltpUGF0dGVybiArIDFdID09ICd1Jykgew0KLSAgICAgICAgICAgIGlQYXR0ZXJuLS07DQotICAgICAgICAgICAgaW50MzJfdCBpS2V5VmFsdWUgPSAwOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxlbiA9IHdzT3V0cHV0LkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgIGludDMyX3QgaSA9IDE7DQotICAgICAgICAgICAgZm9yICg7IGkgPCBpTGVuICYmIGkgPCA1OyBpKyspIHsNCi0gICAgICAgICAgICAgICAgRlhfV0NIQVIgY2ggPSB3c091dHB1dFtpXTsNCi0gICAgICAgICAgICAgICAgaWYgKChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaUtleVZhbHVlID0gaUtleVZhbHVlICogMTYgKyBjaCAtICcwJzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnYScgKyAxMDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnQScgKyAxMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoaUtleVZhbHVlICE9IDApIHsNCi0gICAgICAgICAgICAgICAgd3NPdXRwdXQuRGVsZXRlKDAsIGkpOw0KLSAgICAgICAgICAgICAgICB3c091dHB1dCA9IChGWF9XQ0hBUikoaUtleVZhbHVlICYgMHgwMDAwRkZGRikgKyB3c091dHB1dDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY29udGludWU7DQorICB9DQorICBpUGF0dGVybisrOw0KKyAgaW50MzJfdCBpUXVvdGUgPSAxOw0KKyAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4pIHsNCisgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7DQorICAgICAgaVF1b3RlKys7DQorICAgICAgaWYgKChpUGF0dGVybiArIDEgPj0gaUxlblBhdHRlcm4pIHx8DQorICAgICAgICAgICgocFN0clBhdHRlcm5baVBhdHRlcm4gKyAxXSAhPSAnXCcnKSAmJiAoaVF1b3RlICUgMiA9PSAwKSkpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpUXVvdGUrKzsNCisgICAgICB9DQorICAgICAgaVBhdHRlcm4rKzsNCisgICAgfSBlbHNlIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1xcJyAmJiAoaVBhdHRlcm4gKyAxIDwgaUxlblBhdHRlcm4pICYmDQorICAgICAgICAgICAgICAgcFN0clBhdHRlcm5baVBhdHRlcm4gKyAxXSA9PSAndScpIHsNCisgICAgICBpbnQzMl90IGlLZXlWYWx1ZSA9IDA7DQorICAgICAgaVBhdHRlcm4gKz0gMjsNCisgICAgICBpbnQzMl90IGkgPSAwOw0KKyAgICAgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuICYmIGkrKyA8IDQpIHsNCisgICAgICAgIEZYX1dDSEFSIGNoID0gcFN0clBhdHRlcm5baVBhdHRlcm4rK107DQorICAgICAgICBpZiAoKGNoID49ICcwJyAmJiBjaCA8PSAnOScpKSB7DQorICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnMCc7DQorICAgICAgICB9IGVsc2UgaWYgKChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSkgew0KKyAgICAgICAgICBpS2V5VmFsdWUgPSBpS2V5VmFsdWUgKiAxNiArIGNoIC0gJ2EnICsgMTA7DQorICAgICAgICB9IGVsc2UgaWYgKChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSkgew0KKyAgICAgICAgICBpS2V5VmFsdWUgPSBpS2V5VmFsdWUgKiAxNiArIGNoIC0gJ0EnICsgMTA7DQogICAgICAgICB9DQotICAgICAgICB3c091dHB1dCA9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuLS1dICsgd3NPdXRwdXQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChpS2V5VmFsdWUgIT0gMCkgew0KKyAgICAgICAgd3NPdXRwdXQgKz0gKEZYX1dDSEFSKShpS2V5VmFsdWUgJiAweDAwMDBGRkZGKTsNCisgICAgICB9DQorICAgICAgY29udGludWU7DQogICAgIH0NCisgICAgd3NPdXRwdXQgKz0gcFN0clBhdHRlcm5baVBhdHRlcm4rK107DQorICB9DQorICByZXR1cm4gd3NPdXRwdXQ7DQorfQ0KK3N0YXRpYyBDRlhfV2lkZVN0cmluZyBGWF9HZXRMaXRlcmFsVGV4dFJldmVyc2UoY29uc3QgRlhfV0NIQVIqIHBTdHJQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVBhdHRlcm4pIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzT3V0cHV0Ow0KKyAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSAhPSAnXCcnKSB7DQogICAgIHJldHVybiB3c091dHB1dDsNCisgIH0NCisgIGlQYXR0ZXJuLS07DQorICBpbnQzMl90IGlRdW90ZSA9IDE7DQorICB3aGlsZSAoaVBhdHRlcm4gPj0gMCkgew0KKyAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcJycpIHsNCisgICAgICBpUXVvdGUrKzsNCisgICAgICBpZiAoaVBhdHRlcm4gLSAxID49IDAgfHwNCisgICAgICAgICAgKChwU3RyUGF0dGVybltpUGF0dGVybiAtIDFdICE9ICdcJycpICYmIChpUXVvdGUgJSAyID09IDApKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlRdW90ZSsrOw0KKyAgICAgIH0NCisgICAgICBpUGF0dGVybi0tOw0KKyAgICB9IGVsc2UgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXFwnICYmDQorICAgICAgICAgICAgICAgcFN0clBhdHRlcm5baVBhdHRlcm4gKyAxXSA9PSAndScpIHsNCisgICAgICBpUGF0dGVybi0tOw0KKyAgICAgIGludDMyX3QgaUtleVZhbHVlID0gMDsNCisgICAgICBpbnQzMl90IGlMZW4gPSB3c091dHB1dC5HZXRMZW5ndGgoKTsNCisgICAgICBpbnQzMl90IGkgPSAxOw0KKyAgICAgIGZvciAoOyBpIDwgaUxlbiAmJiBpIDwgNTsgaSsrKSB7DQorICAgICAgICBGWF9XQ0hBUiBjaCA9IHdzT3V0cHV0W2ldOw0KKyAgICAgICAgaWYgKChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSkgew0KKyAgICAgICAgICBpS2V5VmFsdWUgPSBpS2V5VmFsdWUgKiAxNiArIGNoIC0gJzAnOw0KKyAgICAgICAgfSBlbHNlIGlmICgoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykpIHsNCisgICAgICAgICAgaUtleVZhbHVlID0gaUtleVZhbHVlICogMTYgKyBjaCAtICdhJyArIDEwOw0KKyAgICAgICAgfSBlbHNlIGlmICgoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykpIHsNCisgICAgICAgICAgaUtleVZhbHVlID0gaUtleVZhbHVlICogMTYgKyBjaCAtICdBJyArIDEwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoaUtleVZhbHVlICE9IDApIHsNCisgICAgICAgIHdzT3V0cHV0LkRlbGV0ZSgwLCBpKTsNCisgICAgICAgIHdzT3V0cHV0ID0gKEZYX1dDSEFSKShpS2V5VmFsdWUgJiAweDAwMDBGRkZGKSArIHdzT3V0cHV0Ow0KKyAgICAgIH0NCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICB3c091dHB1dCA9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuLS1dICsgd3NPdXRwdXQ7DQorICB9DQorICByZXR1cm4gd3NPdXRwdXQ7DQogfQ0KLUZYX0xPQ0FMRUNBVEVHT1JZIENGWF9Gb3JtYXRTdHJpbmc6OkdldENhdGVnb3J5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pDQotew0KLSAgICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duOw0KLSAgICBpbnQzMl90IGNjZiA9IDA7DQotICAgIGludDMyX3QgaUxlbmYgPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1BhdHRlcm47DQotICAgIEZYX0JPT0wgYkJyYWNlT3BlbiA9IEZBTFNFOw0KLSAgICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsNCi0gICAgICAgIGlmIChwU3RyW2NjZl0gPT0gJ1wnJykgew0KLSAgICAgICAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHIsIGNjZiwgaUxlbmYpOw0KLSAgICAgICAgfSBlbHNlIGlmICghYkJyYWNlT3BlbiAmJiBGWF9Mb2NhbF9GaW5kKGdzX3dzQ29uc3RDaGFycywgcFN0cltjY2ZdKSA8IDApIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NhdGVnb3J5KHBTdHJbY2NmXSk7DQotICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgd2hpbGUgKFRSVUUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGNjZiA9PSBpTGVuZikgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDYXRlZ29yeTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoIHBTdHJbY2NmXSA9PSAnLicgfHwgcFN0cltjY2ZdID09ICcoJykgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAneycpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJCcmFjZU9wZW4gPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgd3NDYXRlZ29yeSArPSBwU3RyW2NjZl07DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0NhdGVnb3J5LCB3c0NhdGVnb3J5LkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVIYXNoKSB7DQotICAgICAgICAgICAgICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFQ0FURUdPUllfVGltZSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfVGltZUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfVGltZTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX1RleHRIYXNoKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9UZXh0Ow0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX051bUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX051bTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvSGFzaCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfWmVybzsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9OdWxsSGFzaCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfTnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnfScpIHsNCi0gICAgICAgICAgICBiQnJhY2VPcGVuID0gRkFMU0U7DQorRlhfTE9DQUxFQ0FURUdPUlkgQ0ZYX0Zvcm1hdFN0cmluZzo6R2V0Q2F0ZWdvcnkoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIHsNCisgIEZYX0xPQ0FMRUNBVEVHT1JZIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX1Vua25vd247DQorICBpbnQzMl90IGNjZiA9IDA7DQorICBpbnQzMl90IGlMZW5mID0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzUGF0dGVybjsNCisgIEZYX0JPT0wgYkJyYWNlT3BlbiA9IEZBTFNFOw0KKyAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQorICAgIGlmIChwU3RyW2NjZl0gPT0gJ1wnJykgew0KKyAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHIsIGNjZiwgaUxlbmYpOw0KKyAgICB9IGVsc2UgaWYgKCFiQnJhY2VPcGVuICYmIEZYX0xvY2FsX0ZpbmQoZ3Nfd3NDb25zdENoYXJzLCBwU3RyW2NjZl0pIDwgMCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2F0ZWdvcnkocFN0cltjY2ZdKTsNCisgICAgICBjY2YrKzsNCisgICAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgaWYgKGNjZiA9PSBpTGVuZikgew0KKyAgICAgICAgICByZXR1cm4gZUNhdGVnb3J5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnLicgfHwgcFN0cltjY2ZdID09ICcoJykgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwU3RyW2NjZl0gPT0gJ3snKSB7DQorICAgICAgICAgIGJCcmFjZU9wZW4gPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHdzQ2F0ZWdvcnkgKz0gcFN0cltjY2ZdOw0KKyAgICAgICAgY2NmKys7DQorICAgICAgfQ0KKyAgICAgIEZYX0RXT1JEIGR3SGFzaCA9DQorICAgICAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzQ2F0ZWdvcnksIHdzQ2F0ZWdvcnkuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZUhhc2gpIHsNCisgICAgICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFQ0FURUdPUllfVGltZSkgew0KKyAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7DQorICAgICAgICB9DQorICAgICAgICBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOw0KKyAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWVIYXNoKSB7DQorICAgICAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpIHsNCisgICAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfVGltZTsNCisgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZUhhc2gpIHsNCisgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTsNCisgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0SGFzaCkgew0KKyAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ7DQorICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfTnVtSGFzaCkgew0KKyAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX051bTsNCisgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvSGFzaCkgew0KKyAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm87DQorICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfTnVsbEhhc2gpIHsNCisgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9OdWxsOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ30nKSB7DQorICAgICAgYkJyYWNlT3BlbiA9IEZBTFNFOw0KKyAgICB9DQorICAgIGNjZisrOw0KKyAgfQ0KKyAgcmV0dXJuIGVDYXRlZ29yeTsNCit9DQorc3RhdGljIEZYX1dPUkQgRlhfV1N0cmluZ1RvTENJRChjb25zdCBGWF9XQ0hBUiogcHN0ckxDSUQpIHsNCisgIGlmICghcHN0ckxDSUQpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB3Y2hhcl90KiBwRW5kOw0KKyAgcmV0dXJuIChGWF9XT1JEKXdjc3RvbCgod2NoYXJfdCopcHN0ckxDSUQsICZwRW5kLCAxNik7DQorfQ0KK0ZYX1dPUkQgQ0ZYX0Zvcm1hdFN0cmluZzo6R2V0TENJRChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSB7DQorICByZXR1cm4gRlhfV1N0cmluZ1RvTENJRChHZXRMb2NhbGVOYW1lKHdzUGF0dGVybikpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDRlhfRm9ybWF0U3RyaW5nOjpHZXRMb2NhbGVOYW1lKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSB7DQorICBpbnQzMl90IGNjZiA9IDA7DQorICBpbnQzMl90IGlMZW5mID0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzUGF0dGVybjsNCisgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KKyAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsNCisgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsNCisgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJygnKSB7DQorICAgICAgY2NmKys7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMQ0lEOw0KKyAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJyknKSB7DQorICAgICAgICB3c0xDSUQgKz0gcFN0cltjY2YrK107DQorICAgICAgfQ0KKyAgICAgIHJldHVybiB3c0xDSUQ7DQorICAgIH0NCisgICAgY2NmKys7DQorICB9DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCit9DQorSUZYX0xvY2FsZSogQ0ZYX0Zvcm1hdFN0cmluZzo6R2V0VGV4dEZvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhdGVnb3J5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUHVyZ2VQYXR0ZXJuKSB7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgIGludDMyX3QgY2NmID0gMDsNCisgIGludDMyX3QgaUxlbmYgPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NQYXR0ZXJuOw0KKyAgRlhfQk9PTCBiQnJhY2tPcGVuID0gRkFMU0U7DQorICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsNCisgICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgaW50MzJfdCBpQ3VyQ2hhciA9IGNjZjsNCisgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsNCisgICAgICB3c1B1cmdlUGF0dGVybiArPSBDRlhfV2lkZVN0cmluZ0MocFN0ciArIGlDdXJDaGFyLCBjY2YgLSBpQ3VyQ2hhciArIDEpOw0KKyAgICB9IGVsc2UgaWYgKCFiQnJhY2tPcGVuICYmIEZYX0xvY2FsX0ZpbmQoZ3Nfd3NDb25zdENoYXJzLCBwU3RyW2NjZl0pIDwgMCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzU2VhcmNoQ2F0ZWdvcnkocFN0cltjY2ZdKTsNCisgICAgICBjY2YrKzsNCisgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICd7JyAmJiBwU3RyW2NjZl0gIT0gJy4nICYmDQorICAgICAgICAgICAgIHBTdHJbY2NmXSAhPSAnKCcpIHsNCisgICAgICAgIHdzU2VhcmNoQ2F0ZWdvcnkgKz0gcFN0cltjY2ZdOw0KKyAgICAgICAgY2NmKys7DQorICAgICAgfQ0KKyAgICAgIGlmICh3c1NlYXJjaENhdGVnb3J5ICE9IHdzQ2F0ZWdvcnkpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsNCisgICAgICAgIGlmIChwU3RyW2NjZl0gPT0gJygnKSB7DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xDSUQ7DQorICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJyknKSB7DQorICAgICAgICAgICAgd3NMQ0lEICs9IHBTdHJbY2NmKytdOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBMb2NhbGUgPSBHZXRQYXR0ZXJuTG9jYWxlKHdzTENJRCk7DQorICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAneycpIHsNCisgICAgICAgICAgYkJyYWNrT3BlbiA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KICAgICAgICAgY2NmKys7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSAhPSAnfScpIHsNCisgICAgICB3c1B1cmdlUGF0dGVybiArPSBwU3RyW2NjZl07DQogICAgIH0NCi0gICAgcmV0dXJuIGVDYXRlZ29yeTsNCisgICAgY2NmKys7DQorICB9DQorICBpZiAoIWJCcmFja09wZW4pIHsNCisgICAgd3NQdXJnZVBhdHRlcm4gPSB3c1BhdHRlcm47DQorICB9DQorICBpZiAoIXBMb2NhbGUpIHsNCisgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICB9DQorICByZXR1cm4gcExvY2FsZTsNCiB9DQotc3RhdGljIEZYX1dPUkQgRlhfV1N0cmluZ1RvTENJRChjb25zdCBGWF9XQ0hBUiogcHN0ckxDSUQpDQotew0KLSAgICBpZiAoIXBzdHJMQ0lEKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB3Y2hhcl90KiBwRW5kOw0KLSAgICByZXR1cm4gKEZYX1dPUkQpd2NzdG9sKCh3Y2hhcl90Kilwc3RyTENJRCwgJnBFbmQsIDE2KTsNCi19DQotRlhfV09SRAlDRlhfRm9ybWF0U3RyaW5nOjpHZXRMQ0lEKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pDQotew0KLSAgICByZXR1cm4gRlhfV1N0cmluZ1RvTENJRChHZXRMb2NhbGVOYW1lKHdzUGF0dGVybikpOw0KLX0NCi1DRlhfV2lkZVN0cmluZyBDRlhfRm9ybWF0U3RyaW5nOjpHZXRMb2NhbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pDQotew0KLSAgICBpbnQzMl90IGNjZiA9IDA7DQotICAgIGludDMyX3QgaUxlbmYgPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1BhdHRlcm47DQotICAgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KLSAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7DQotICAgICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQocFN0ciwgY2NmLCBpTGVuZik7DQotICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnKCcpIHsNCi0gICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xDSUQ7DQotICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAnKScpIHsNCi0gICAgICAgICAgICAgICAgd3NMQ0lEICs9IHBTdHJbY2NmKytdOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gd3NMQ0lEOw0KLSAgICAgICAgfQ0KKyNkZWZpbmUgRlhfTlVNU1RZTEVfUGVyY2VudCAweDAxDQorI2RlZmluZSBGWF9OVU1TVFlMRV9FeHBvbmVudCAweDAyDQorI2RlZmluZSBGWF9OVU1TVFlMRV9Eb3RWb3J2IDB4MDQNCitJRlhfTG9jYWxlKiBDRlhfRm9ybWF0U3RyaW5nOjpHZXROdW1lcmljRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRG90SW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHdTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1B1cmdlUGF0dGVybikgew0KKyAgZHdTdHlsZSA9IDA7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgIGludDMyX3QgY2NmID0gMDsNCisgIGludDMyX3QgaUxlbmYgPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NQYXR0ZXJuOw0KKyAgRlhfQk9PTCBiRmluZERvdCA9IEZBTFNFOw0KKyAgRlhfQk9PTCBiQnJhY2tPcGVuID0gRkFMU0U7DQorICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsNCisgICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgaW50MzJfdCBpQ3VyQ2hhciA9IGNjZjsNCisgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsNCisgICAgICB3c1B1cmdlUGF0dGVybiArPSBDRlhfV2lkZVN0cmluZ0MocFN0ciArIGlDdXJDaGFyLCBjY2YgLSBpQ3VyQ2hhciArIDEpOw0KKyAgICB9IGVsc2UgaWYgKCFiQnJhY2tPcGVuICYmIEZYX0xvY2FsX0ZpbmQoZ3Nfd3NDb25zdENoYXJzLCBwU3RyW2NjZl0pIDwgMCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2F0ZWdvcnkocFN0cltjY2ZdKTsNCisgICAgICBjY2YrKzsNCisgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICd7JyAmJiBwU3RyW2NjZl0gIT0gJy4nICYmDQorICAgICAgICAgICAgIHBTdHJbY2NmXSAhPSAnKCcpIHsNCisgICAgICAgIHdzQ2F0ZWdvcnkgKz0gcFN0cltjY2ZdOw0KICAgICAgICAgY2NmKys7DQotICAgIH0NCi0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQotfQ0KLUlGWF9Mb2NhbGUqIENGWF9Gb3JtYXRTdHJpbmc6OkdldFRleHRGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGF0dGVybiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhdGVnb3J5LCBDRlhfV2lkZVN0cmluZyYgd3NQdXJnZVBhdHRlcm4pDQotew0KLSAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCi0gICAgaW50MzJfdCBjY2YgPSAwOw0KLSAgICBpbnQzMl90IGlMZW5mID0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NQYXR0ZXJuOw0KLSAgICBGWF9CT09MIGJCcmFja09wZW4gPSBGQUxTRTsNCi0gICAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQotICAgICAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlDdXJDaGFyID0gY2NmOw0KLSAgICAgICAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHIsIGNjZiwgaUxlbmYpOw0KLSAgICAgICAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IENGWF9XaWRlU3RyaW5nQyhwU3RyICsgaUN1ckNoYXIsIGNjZiAtIGlDdXJDaGFyICsgMSk7DQotICAgICAgICB9IGVsc2UgaWYgKCFiQnJhY2tPcGVuICYmIEZYX0xvY2FsX0ZpbmQoZ3Nfd3NDb25zdENoYXJzLCBwU3RyW2NjZl0pIDwgMCkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU2VhcmNoQ2F0ZWdvcnkocFN0cltjY2ZdKTsNCi0gICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICd7JyAmJiBwU3RyW2NjZl0gIT0gJy4nICYmIHBTdHJbY2NmXSAhPSAnKCcpIHsNCi0gICAgICAgICAgICAgICAgd3NTZWFyY2hDYXRlZ29yeSArPSBwU3RyW2NjZl07DQotICAgICAgICAgICAgICAgIGNjZisrOw0KKyAgICAgIH0NCisgICAgICBpZiAod3NDYXRlZ29yeSAhPSBGWF9XU1RSQyhMIm51bSIpKSB7DQorICAgICAgICBiQnJhY2tPcGVuID0gVFJVRTsNCisgICAgICAgIGNjZiA9IDA7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQorICAgICAgICBpZiAocFN0cltjY2ZdID09ICcoJykgew0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMQ0lEOw0KKyAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICcpJykgew0KKyAgICAgICAgICAgIHdzTENJRCArPSBwU3RyW2NjZisrXTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwTG9jYWxlID0gR2V0UGF0dGVybkxvY2FsZSh3c0xDSUQpOw0KKyAgICAgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ3snKSB7DQorICAgICAgICAgIGJCcmFja09wZW4gPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICcuJykgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N1YkNhdGVnb3J5Ow0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAnKCcgJiYgcFN0cltjY2ZdICE9ICd7Jykgew0KKyAgICAgICAgICAgIHdzU3ViQ2F0ZWdvcnkgKz0gcFN0cltjY2YrK107DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhfRFdPUkQgZHdTdWJIYXNoID0NCisgICAgICAgICAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzU3ViQ2F0ZWdvcnksIHdzU3ViQ2F0ZWdvcnkuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICBGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlU3ViQ2F0ZWdvcnkgPSBGWF9MT0NBTEVOVU1QQVRURVJOX0RlY2ltYWw7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGdfaUZYTG9jYWxlTnVtU3ViQ2F0Q291bnQ7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChnX0ZYTG9jYWxlTnVtU3ViQ2F0RGF0YVtpXS51SGFzaCA9PSBkd1N1Ykhhc2gpIHsNCisgICAgICAgICAgICAgIGVTdWJDYXRlZ29yeSA9IChGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSlnX0ZYTG9jYWxlTnVtU3ViQ2F0RGF0YVtpXQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lU3ViQ2F0ZWdvcnk7DQorICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHdzU2VhcmNoQ2F0ZWdvcnkgIT0gd3NDYXRlZ29yeSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQotICAgICAgICAgICAgICAgIGlmIChwU3RyW2NjZl0gPT0gJygnKSB7DQotICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTENJRDsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJyknKQl7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NMQ0lEICs9IHBTdHJbY2NmKytdOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcExvY2FsZSA9IEdldFBhdHRlcm5Mb2NhbGUod3NMQ0lEKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ3snKSB7DQotICAgICAgICAgICAgICAgICAgICBiQnJhY2tPcGVuID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdICE9ICd9Jykgew0KLSAgICAgICAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IHBTdHJbY2NmXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNjZisrOw0KLSAgICB9DQotICAgIGlmICghYkJyYWNrT3Blbikgew0KLSAgICAgICAgd3NQdXJnZVBhdHRlcm4gPSB3c1BhdHRlcm47DQotICAgIH0NCi0gICAgaWYgKCFwTG9jYWxlKSB7DQotICAgICAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcExvY2FsZTsNCi19DQotI2RlZmluZSBGWF9OVU1TVFlMRV9QZXJjZW50CQkweDAxDQotI2RlZmluZSBGWF9OVU1TVFlMRV9FeHBvbmVudAkweDAyDQotI2RlZmluZSBGWF9OVU1TVFlMRV9Eb3RWb3J2CQkweDA0DQotSUZYX0xvY2FsZSogQ0ZYX0Zvcm1hdFN0cmluZzo6R2V0TnVtZXJpY0Zvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBpbnQzMl90JiBpRG90SW5kZXgsIEZYX0RXT1JEJiBkd1N0eWxlLCBDRlhfV2lkZVN0cmluZyYgd3NQdXJnZVBhdHRlcm4pDQotew0KLSAgICBkd1N0eWxlID0gMDsNCi0gICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQotICAgIGludDMyX3QgY2NmID0gMDsNCi0gICAgaW50MzJfdCBpTGVuZiA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzUGF0dGVybjsNCi0gICAgRlhfQk9PTCBiRmluZERvdCA9IEZBTFNFOw0KLSAgICBGWF9CT09MIGJCcmFja09wZW4gPSBGQUxTRTsNCi0gICAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQotICAgICAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlDdXJDaGFyID0gY2NmOw0KLSAgICAgICAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHIsIGNjZiwgaUxlbmYpOw0KLSAgICAgICAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IENGWF9XaWRlU3RyaW5nQyhwU3RyICsgaUN1ckNoYXIsIGNjZiAtIGlDdXJDaGFyICsgMSk7DQotICAgICAgICB9IGVsc2UgaWYgKCFiQnJhY2tPcGVuICYmIEZYX0xvY2FsX0ZpbmQoZ3Nfd3NDb25zdENoYXJzLCBwU3RyW2NjZl0pIDwgMCkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2F0ZWdvcnkocFN0cltjY2ZdKTsNCi0gICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICd7JyAmJiBwU3RyW2NjZl0gIT0gJy4nICYmIHBTdHJbY2NmXSAhPSAnKCcpIHsNCi0gICAgICAgICAgICAgICAgd3NDYXRlZ29yeSArPSBwU3RyW2NjZl07DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAod3NDYXRlZ29yeSAhPSBGWF9XU1RSQyhMIm51bSIpKSB7DQotICAgICAgICAgICAgICAgIGJCcmFja09wZW4gPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBjY2YgPSAwOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQotICAgICAgICAgICAgICAgIGlmIChwU3RyW2NjZl0gPT0gJygnKSB7DQotICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTENJRDsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJyknKQl7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NMQ0lEICs9IHBTdHJbY2NmKytdOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcExvY2FsZSA9IEdldFBhdHRlcm5Mb2NhbGUod3NMQ0lEKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ3snKSB7DQotICAgICAgICAgICAgICAgICAgICBiQnJhY2tPcGVuID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnLicpIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ViQ2F0ZWdvcnk7DQotICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJygnICYmIHBTdHJbY2NmXSAhPSAneycpCXsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1N1YkNhdGVnb3J5ICs9IHBTdHJbY2NmKytdOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdWJIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NTdWJDYXRlZ29yeSwgd3NTdWJDYXRlZ29yeS5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgICAgICBGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlU3ViQ2F0ZWdvcnkgPSBGWF9MT0NBTEVOVU1QQVRURVJOX0RlY2ltYWw7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBnX2lGWExvY2FsZU51bVN1YkNhdENvdW50OyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ19GWExvY2FsZU51bVN1YkNhdERhdGFbaV0udUhhc2ggPT0gZHdTdWJIYXNoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTdWJDYXRlZ29yeSA9IChGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSlnX0ZYTG9jYWxlTnVtU3ViQ2F0RGF0YVtpXS5lU3ViQ2F0ZWdvcnk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHdzU3ViQ2F0ZWdvcnkuRW1wdHkoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghcExvY2FsZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUgPSBtX3BMb2NhbGVNZ3ItPkdldERlZkxvY2FsZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBMb2NhbGUgIT0gTlVMTCk7DQotICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1QYXR0ZXJuKGVTdWJDYXRlZ29yeSwgd3NTdWJDYXRlZ29yeSk7DQotICAgICAgICAgICAgICAgICAgICBpRG90SW5kZXggPSB3c1N1YkNhdGVnb3J5LkZpbmQoJy4nKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpRG90SW5kZXggPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaURvdEluZGV4ICs9IHdzUHVyZ2VQYXR0ZXJuLkdldExlbmd0aCgpIDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiRmluZERvdCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgZHdTdHlsZSB8PSBGWF9OVU1TVFlMRV9Eb3RWb3J2Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgd3NQdXJnZVBhdHRlcm4gKz0gd3NTdWJDYXRlZ29yeTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChlU3ViQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFTlVNUEFUVEVSTl9QZXJjZW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZHdTdHlsZSB8PSBGWF9OVU1TVFlMRV9QZXJjZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ0UnKSB7DQotICAgICAgICAgICAgZHdTdHlsZSB8PSBGWF9OVU1TVFlMRV9FeHBvbmVudDsNCi0gICAgICAgICAgICB3c1B1cmdlUGF0dGVybiArPSBwU3RyW2NjZl07DQotICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnJScpIHsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3c1N1YkNhdGVnb3J5LkVtcHR5KCk7DQorICAgICAgICAgIGlmICghcExvY2FsZSkgew0KKyAgICAgICAgICAgIHBMb2NhbGUgPSBtX3BMb2NhbGVNZ3ItPkdldERlZkxvY2FsZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYU1lTX2Fzc2VydChwTG9jYWxlICE9IE5VTEwpOw0KKyAgICAgICAgICBwTG9jYWxlLT5HZXROdW1QYXR0ZXJuKGVTdWJDYXRlZ29yeSwgd3NTdWJDYXRlZ29yeSk7DQorICAgICAgICAgIGlEb3RJbmRleCA9IHdzU3ViQ2F0ZWdvcnkuRmluZCgnLicpOw0KKyAgICAgICAgICBpZiAoaURvdEluZGV4ID4gMCkgew0KKyAgICAgICAgICAgIGlEb3RJbmRleCArPSB3c1B1cmdlUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICBiRmluZERvdCA9IFRSVUU7DQorICAgICAgICAgICAgZHdTdHlsZSB8PSBGWF9OVU1TVFlMRV9Eb3RWb3J2Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IHdzU3ViQ2F0ZWdvcnk7DQorICAgICAgICAgIGlmIChlU3ViQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFTlVNUEFUVEVSTl9QZXJjZW50KSB7DQogICAgICAgICAgICAgZHdTdHlsZSB8PSBGWF9OVU1TVFlMRV9QZXJjZW50Ow0KLSAgICAgICAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IHBTdHJbY2NmXTsNCi0gICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdICE9ICd9Jykgew0KLSAgICAgICAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IHBTdHJbY2NmXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYkZpbmREb3QpIHsNCi0gICAgICAgICAgICBpZiAocFN0cltjY2ZdID09ICcuJyB8fCBwU3RyW2NjZl0gPT0gJ1YnIHx8IHBTdHJbY2NmXSA9PSAndicpIHsNCi0gICAgICAgICAgICAgICAgYkZpbmREb3QgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBpRG90SW5kZXggPSB3c1B1cmdlUGF0dGVybi5HZXRMZW5ndGgoKSAtIDE7DQotICAgICAgICAgICAgICAgIGR3U3R5bGUgfD0gRlhfTlVNU1RZTEVfRG90Vm9ydjsNCi0gICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgY29udGludWU7DQogICAgICAgICB9DQogICAgICAgICBjY2YrKzsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICdFJykgew0KKyAgICAgIGR3U3R5bGUgfD0gRlhfTlVNU1RZTEVfRXhwb25lbnQ7DQorICAgICAgd3NQdXJnZVBhdHRlcm4gKz0gcFN0cltjY2ZdOw0KKyAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnJScpIHsNCisgICAgICBkd1N0eWxlIHw9IEZYX05VTVNUWUxFX1BlcmNlbnQ7DQorICAgICAgd3NQdXJnZVBhdHRlcm4gKz0gcFN0cltjY2ZdOw0KKyAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSAhPSAnfScpIHsNCisgICAgICB3c1B1cmdlUGF0dGVybiArPSBwU3RyW2NjZl07DQogICAgIH0NCiAgICAgaWYgKCFiRmluZERvdCkgew0KLSAgICAgICAgaURvdEluZGV4ID0gd3NQdXJnZVBhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnLicgfHwgcFN0cltjY2ZdID09ICdWJyB8fCBwU3RyW2NjZl0gPT0gJ3YnKSB7DQorICAgICAgICBiRmluZERvdCA9IFRSVUU7DQorICAgICAgICBpRG90SW5kZXggPSB3c1B1cmdlUGF0dGVybi5HZXRMZW5ndGgoKSAtIDE7DQorICAgICAgICBkd1N0eWxlIHw9IEZYX05VTVNUWUxFX0RvdFZvcnY7DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmICghcExvY2FsZSkgew0KLSAgICAgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBMb2NhbGU7DQorICAgIGNjZisrOw0KKyAgfQ0KKyAgaWYgKCFiRmluZERvdCkgew0KKyAgICBpRG90SW5kZXggPSB3c1B1cmdlUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgIH0NCisgIGlmICghcExvY2FsZSkgew0KKyAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsNCisgIH0NCisgIHJldHVybiBwTG9jYWxlOw0KIH0NCi1zdGF0aWMgRlhfQk9PTCBGWF9HZXROdW1lcmljRG90SW5kZXgoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEb3RTeW1ib2wsIGludDMyX3QgJmlEb3RJbmRleCkNCi17DQotICAgIGludDMyX3QgY2NmID0gMDsNCi0gICAgaW50MzJfdCBpTGVuZiA9IHdzTnVtLkdldExlbmd0aCgpOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NOdW07DQotICAgIGludDMyX3QgaUxlbkRvdCA9IHdzRG90U3ltYm9sLkdldExlbmd0aCgpOw0KLSAgICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsNCi0gICAgICAgIGlmIChwU3RyW2NjZl0gPT0gJ1wnJykgew0KLSAgICAgICAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHIsIGNjZiwgaUxlbmYpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjY2YgKyBpTGVuRG90IDw9IGlMZW5mICYmICFGWFNZU193Y3NuY21wKHBTdHIgKyBjY2YsIChjb25zdCBGWF9XQ0hBUiopd3NEb3RTeW1ib2wsIGlMZW5Eb3QpKSB7DQotICAgICAgICAgICAgaURvdEluZGV4ID0gY2NmOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KK3N0YXRpYyBGWF9CT09MIEZYX0dldE51bWVyaWNEb3RJbmRleChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RvdFN5bWJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURvdEluZGV4KSB7DQorICBpbnQzMl90IGNjZiA9IDA7DQorICBpbnQzMl90IGlMZW5mID0gd3NOdW0uR2V0TGVuZ3RoKCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NOdW07DQorICBpbnQzMl90IGlMZW5Eb3QgPSB3c0RvdFN5bWJvbC5HZXRMZW5ndGgoKTsNCisgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KKyAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsNCisgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsNCisgICAgfSBlbHNlIGlmIChjY2YgKyBpTGVuRG90IDw9IGlMZW5mICYmDQorICAgICAgICAgICAgICAgIUZYU1lTX3djc25jbXAocFN0ciArIGNjZiwgKGNvbnN0IEZYX1dDSEFSKil3c0RvdFN5bWJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTGVuRG90KSkgew0KKyAgICAgIGlEb3RJbmRleCA9IGNjZjsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBjY2YrKzsNCisgIH0NCisgIGlEb3RJbmRleCA9IHdzTnVtLkZpbmQoJy4nKTsNCisgIGlmIChpRG90SW5kZXggPCAwKSB7DQorICAgIGlEb3RJbmRleCA9IGlMZW5mOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpQYXJzZVRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSB7DQorICB3c1ZhbHVlLkVtcHR5KCk7DQorICBpZiAod3NTcmNUZXh0LklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dEZvcm1hdDsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPQ0KKyAgICAgIEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBGWF9XU1RSQyhMInRleHQiKSwgd3NUZXh0Rm9ybWF0KTsNCisgIGlmICh3c1RleHRGb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgaVRleHQgPSAwLCBpUGF0dGVybiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0clRleHQgPSAoY29uc3QgRlhfV0NIQVIqKXdzU3JjVGV4dDsNCisgIGludDMyX3QgaUxlblRleHQgPSB3c1NyY1RleHQuR2V0TGVuZ3RoKCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4gPSAoY29uc3QgRlhfV0NIQVIqKXdzVGV4dEZvcm1hdDsNCisgIGludDMyX3QgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7DQorICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybiAmJiBpVGV4dCA8IGlMZW5UZXh0KSB7DQorICAgIHN3aXRjaCAocFN0clBhdHRlcm5baVBhdHRlcm5dKSB7DQorICAgICAgY2FzZSAnXCcnOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPQ0KKyAgICAgICAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCBpUGF0dGVybiwgaUxlblBhdHRlcm4pOw0KKyAgICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsNCisgICAgICAgIGlmIChpVGV4dCArIGlMaXRlcmFsTGVuID4gaUxlblRleHQgfHwNCisgICAgICAgICAgICBGWFNZU193Y3NuY21wKHBTdHJUZXh0ICsgaVRleHQsIChjb25zdCBGWF9XQ0hBUiopd3NMaXRlcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICAgIHdzVmFsdWUgPSB3c1NyY1RleHQ7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgICAgIH0NCi0gICAgICAgIGNjZisrOw0KLSAgICB9DQotICAgIGlEb3RJbmRleCA9IHdzTnVtLkZpbmQoJy4nKTsNCi0gICAgaWYgKGlEb3RJbmRleCA8IDApIHsNCi0gICAgICAgIGlEb3RJbmRleCA9IGlMZW5mOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNUZXh0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkNCi17DQotICAgIHdzVmFsdWUuRW1wdHkoKTsNCi0gICAgaWYgKHdzU3JjVGV4dC5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dEZvcm1hdDsNCi0gICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBGWF9XU1RSQyhMInRleHQiKSwgd3NUZXh0Rm9ybWF0KTsNCi0gICAgaWYgKHdzVGV4dEZvcm1hdC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlUZXh0ID0gMCwgaVBhdHRlcm4gPSAwOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0clRleHQgPSAoY29uc3QgRlhfV0NIQVIqKXdzU3JjVGV4dDsNCi0gICAgaW50MzJfdCBpTGVuVGV4dCA9IHdzU3JjVGV4dC5HZXRMZW5ndGgoKTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBTdHJQYXR0ZXJuID0gKGNvbnN0IEZYX1dDSEFSKil3c1RleHRGb3JtYXQ7DQotICAgIGludDMyX3QgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7DQotICAgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuICYmIGlUZXh0IDwgaUxlblRleHQpIHsNCi0gICAgICAgIHN3aXRjaCAocFN0clBhdHRlcm5baVBhdHRlcm5dKSB7DQotICAgICAgICAgICAgY2FzZSAnXCcnOiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBGWF9HZXRMaXRlcmFsVGV4dChwU3RyUGF0dGVybiwgaVBhdHRlcm4sIGlMZW5QYXR0ZXJuKTsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaVRleHQgKyBpTGl0ZXJhbExlbiA+IGlMZW5UZXh0IHx8IEZYU1lTX3djc25jbXAocFN0clRleHQgKyBpVGV4dCwgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsIGlMaXRlcmFsTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgPSB3c1NyY1RleHQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaVRleHQgKz0gaUxpdGVyYWxMZW47DQotICAgICAgICAgICAgICAgICAgICBpUGF0dGVybisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlICdBJzoNCi0gICAgICAgICAgICAgICAgaWYgKEZYX0lzQWxwaGEocFN0clRleHRbaVRleHRdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZSArPSBwU3RyVGV4dFtpVGV4dF07DQotICAgICAgICAgICAgICAgICAgICBpVGV4dCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlQYXR0ZXJuKys7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ1gnOg0KLSAgICAgICAgICAgICAgICB3c1ZhbHVlICs9IHBTdHJUZXh0W2lUZXh0XTsNCi0gICAgICAgICAgICAgICAgaVRleHQrKzsNCi0gICAgICAgICAgICAgICAgaVBhdHRlcm4rKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnTyc6DQotICAgICAgICAgICAgY2FzZSAnMCc6DQotICAgICAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHBTdHJUZXh0W2lUZXh0XSkgfHwgRlhfSXNBbHBoYShwU3RyVGV4dFtpVGV4dF0pKSB7DQotICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlICs9IHBTdHJUZXh0W2lUZXh0XTsNCi0gICAgICAgICAgICAgICAgICAgIGlUZXh0Kys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaVBhdHRlcm4rKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnOSc6DQotICAgICAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHBTdHJUZXh0W2lUZXh0XSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgKz0gcFN0clRleHRbaVRleHRdOw0KLSAgICAgICAgICAgICAgICAgICAgaVRleHQrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpUGF0dGVybisrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9IHBTdHJUZXh0W2lUZXh0XSkgew0KLSAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZSA9IHdzU3JjVGV4dDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpUGF0dGVybisrOw0KLSAgICAgICAgICAgICAgICBpVGV4dCsrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGlUZXh0ICs9IGlMaXRlcmFsTGVuOw0KKyAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlICdBJzoNCisgICAgICAgIGlmIChGWF9Jc0FscGhhKHBTdHJUZXh0W2lUZXh0XSkpIHsNCisgICAgICAgICAgd3NWYWx1ZSArPSBwU3RyVGV4dFtpVGV4dF07DQorICAgICAgICAgIGlUZXh0Kys7DQogICAgICAgICB9DQorICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnWCc6DQorICAgICAgICB3c1ZhbHVlICs9IHBTdHJUZXh0W2lUZXh0XTsNCisgICAgICAgIGlUZXh0Kys7DQorICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnTyc6DQorICAgICAgY2FzZSAnMCc6DQorICAgICAgICBpZiAoRlhfSXNEaWdpdChwU3RyVGV4dFtpVGV4dF0pIHx8IEZYX0lzQWxwaGEocFN0clRleHRbaVRleHRdKSkgew0KKyAgICAgICAgICB3c1ZhbHVlICs9IHBTdHJUZXh0W2lUZXh0XTsNCisgICAgICAgICAgaVRleHQrKzsNCisgICAgICAgIH0NCisgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICc5JzoNCisgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHBTdHJUZXh0W2lUZXh0XSkpIHsNCisgICAgICAgICAgd3NWYWx1ZSArPSBwU3RyVGV4dFtpVGV4dF07DQorICAgICAgICAgIGlUZXh0Kys7DQorICAgICAgICB9DQorICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gIT0gcFN0clRleHRbaVRleHRdKSB7DQorICAgICAgICAgIHdzVmFsdWUgPSB3c1NyY1RleHQ7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICBpVGV4dCsrOw0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIGlQYXR0ZXJuID09IGlMZW5QYXR0ZXJuICYmIGlUZXh0ID09IGlMZW5UZXh0Ow0KKyAgfQ0KKyAgcmV0dXJuIGlQYXR0ZXJuID09IGlMZW5QYXR0ZXJuICYmIGlUZXh0ID09IGlMZW5UZXh0Ow0KIH0NCi1GWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgRlhfRkxPQVQgJmZWYWx1ZSkNCi17DQotICAgIGZWYWx1ZSA9IDAuMGY7DQotICAgIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGludDMyX3QgZG90X2luZGV4X2YgPSAtMTsNCi0gICAgRlhfRFdPUkQgZHdGb3JtYXRTdHlsZSA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTnVtRm9ybWF0Ow0KLSAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TnVtZXJpY0Zvcm1hdCh3c1BhdHRlcm4sIGRvdF9pbmRleF9mLCBkd0Zvcm1hdFN0eWxlLCB3c051bUZvcm1hdCk7DQotICAgIGlmICghcExvY2FsZSB8fCB3c051bUZvcm1hdC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlFeHBvbmVudCA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRG90U3ltYm9sOw0KLSAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NEb3RTeW1ib2wpOw0KLSAgICBpbnQzMl90IGlEb3RMZW4gPSB3c0RvdFN5bWJvbC5HZXRMZW5ndGgoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCi0gICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCi0gICAgaW50MzJfdCBpR3JvdXBMZW4gPSB3c0dyb3VwU3ltYm9sLkdldExlbmd0aCgpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzOw0KLSAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXMpOw0KLSAgICBpbnQzMl90IGlNaW51c0xlbiA9IHdzTWludXMuR2V0TGVuZ3RoKCk7DQotICAgIGludCBjYyA9IDAsIGNjZiA9IDA7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzU3JjTnVtOw0KLSAgICBpbnQgbGVuID0gd3NTcmNOdW0uR2V0TGVuZ3RoKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c051bUZvcm1hdDsNCi0gICAgaW50IGxlbmYgPSB3c051bUZvcm1hdC5HZXRMZW5ndGgoKTsNCi0gICAgZG91YmxlIGRiUmV0VmFsdWUgPSAwOw0KLSAgICBkb3VibGUgY29lZmYgPSAxOw0KLSAgICBGWF9CT09MIGJIYXZlUGVyY2VudFN5bWJvbCA9IEZBTFNFOw0KLSAgICBGWF9CT09MIGJOZWcgPSBGQUxTRTsNCi0gICAgRlhfQk9PTCBiUmV2ZXJzZVBhcnNlID0gRkFMU0U7DQotICAgIGludDMyX3QgZG90X2luZGV4ID0gMDsNCi0gICAgaWYgKCFGWF9HZXROdW1lcmljRG90SW5kZXgod3NTcmNOdW0sIHdzRG90U3ltYm9sLCBkb3RfaW5kZXgpICYmIChkd0Zvcm1hdFN0eWxlICYgRlhfTlVNU1RZTEVfRG90Vm9ydikpIHsNCi0gICAgICAgIGJSZXZlcnNlUGFyc2UgPSBUUlVFOw0KLSAgICB9DQotICAgIGJSZXZlcnNlUGFyc2UgPSBGQUxTRTsNCi0gICAgaWYgKGJSZXZlcnNlUGFyc2UpIHsNCi0gICAgICAgIGNjZiA9IGxlbmYgLSAxOw0KLSAgICAgICAgY2MgPSBsZW4gLSAxOw0KLSAgICAgICAgd2hpbGUgKGNjZiA+IGRvdF9pbmRleF9mICYmIGNjID49IDApIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KLSAgICAgICAgICAgICAgICBjYXNlICdcJyc6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBGWF9HZXRMaXRlcmFsVGV4dFJldmVyc2Uoc3RyZiwgY2NmKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IGlMaXRlcmFsTGVuIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCAwIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NMaXRlcmFsLCBpTGl0ZXJhbExlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXNlICc5JzoNCi0gICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICogY29lZmYgKyAoc3RyW2NjXSAtICcwJykgKiAwLjE7DQotICAgICAgICAgICAgICAgICAgICBjb2VmZiAqPSAwLjE7DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAneic6DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICogY29lZmYgKyAoc3RyW2NjXSAtICcwJykgKiAwLjE7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICdaJzoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdICE9ICcgJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICogY29lZmYgKyAoc3RyW2NjXSAtICcwJykgKiAwLjE7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2MtLTsNCi0gICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ1MnOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnIHx8IHN0cltjY10gPT0gJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCAwIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICdzJzoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IGlNaW51c0xlbiAtIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTWludXMsIGlNaW51c0xlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnRSc6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPj0gZG90X2luZGV4KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRXhwU2lnbiA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjYyA+PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCArIChzdHJbY2NdIC0gJzAnKSAqIDEwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJysnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2MgLSBpTWludXNMZW4gKyAxID4gMCAmJiAhRlhTWVNfd2NzbmNtcChzdHIgKyAoY2MgLSBpTWludXNMZW4gKyAxKSwgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXhwU2lnbiA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW47DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MgLS07DQotICAgICAgICAgICAgICAgICAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJyQnOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQotICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3ltYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaVN5bWJvbExlbiAtIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLCBpU3ltYm9sTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAncic6DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2MnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ1InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdDJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZiAtLTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICdSJzoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnQycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ1InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdDJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ2InOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdkJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZiAtPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjY2YgLS07DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnQic6DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0QnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZiAtPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICcuJzoNCi0gICAgICAgICAgICAgICAgY2FzZSAnVic6DQotICAgICAgICAgICAgICAgIGNhc2UgJ3YnOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICBjYXNlICclJzogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3lzbWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IGlTeXNtYm9sTGVuIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCAwICB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLCBpU3lzbWJvbExlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJIYXZlUGVyY2VudFN5bWJvbCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnOCc6DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gJzgnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSAoc3RyW2NjXSAtICcwJykgKiBjb2VmZiArIGRiUmV0VmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnLCc6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSBpR3JvdXBMZW4gLSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCAmJiBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzR3JvdXBTeW1ib2wsIGlHcm91cExlbikgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlHcm91cExlbiAtIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnKCc6DQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSBMJygnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICcpJzoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2MtLTsNCi0gICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZltjY2ZdICE9IHN0cltjY10pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgY2NmLS07DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpQYXJzZU51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZWYWx1ZSkgew0KKyAgZlZhbHVlID0gMC4wZjsNCisgIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGRvdF9pbmRleF9mID0gLTE7DQorICBGWF9EV09SRCBkd0Zvcm1hdFN0eWxlID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIHdzTnVtRm9ybWF0Ow0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9DQorICAgICAgR2V0TnVtZXJpY0Zvcm1hdCh3c1BhdHRlcm4sIGRvdF9pbmRleF9mLCBkd0Zvcm1hdFN0eWxlLCB3c051bUZvcm1hdCk7DQorICBpZiAoIXBMb2NhbGUgfHwgd3NOdW1Gb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgaUV4cG9uZW50ID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIHdzRG90U3ltYm9sOw0KKyAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzRG90U3ltYm9sKTsNCisgIGludDMyX3QgaURvdExlbiA9IHdzRG90U3ltYm9sLkdldExlbmd0aCgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCisgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZywgd3NHcm91cFN5bWJvbCk7DQorICBpbnQzMl90IGlHcm91cExlbiA9IHdzR3JvdXBTeW1ib2wuR2V0TGVuZ3RoKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c01pbnVzOw0KKyAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzKTsNCisgIGludDMyX3QgaU1pbnVzTGVuID0gd3NNaW51cy5HZXRMZW5ndGgoKTsNCisgIGludCBjYyA9IDAsIGNjZiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1NyY051bTsNCisgIGludCBsZW4gPSB3c1NyY051bS5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c051bUZvcm1hdDsNCisgIGludCBsZW5mID0gd3NOdW1Gb3JtYXQuR2V0TGVuZ3RoKCk7DQorICBkb3VibGUgZGJSZXRWYWx1ZSA9IDA7DQorICBkb3VibGUgY29lZmYgPSAxOw0KKyAgRlhfQk9PTCBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBGQUxTRTsNCisgIEZYX0JPT0wgYk5lZyA9IEZBTFNFOw0KKyAgRlhfQk9PTCBiUmV2ZXJzZVBhcnNlID0gRkFMU0U7DQorICBpbnQzMl90IGRvdF9pbmRleCA9IDA7DQorICBpZiAoIUZYX0dldE51bWVyaWNEb3RJbmRleCh3c1NyY051bSwgd3NEb3RTeW1ib2wsIGRvdF9pbmRleCkgJiYNCisgICAgICAoZHdGb3JtYXRTdHlsZSAmIEZYX05VTVNUWUxFX0RvdFZvcnYpKSB7DQorICAgIGJSZXZlcnNlUGFyc2UgPSBUUlVFOw0KKyAgfQ0KKyAgYlJldmVyc2VQYXJzZSA9IEZBTFNFOw0KKyAgaWYgKGJSZXZlcnNlUGFyc2UpIHsNCisgICAgY2NmID0gbGVuZiAtIDE7DQorICAgIGNjID0gbGVuIC0gMTsNCisgICAgd2hpbGUgKGNjZiA+IGRvdF9pbmRleF9mICYmIGNjID49IDApIHsNCisgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgICAgY2FzZSAnXCcnOiB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShzdHJmLCBjY2YpOw0KKyAgICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgICBjYyAtPSBpTGl0ZXJhbExlbiAtIDE7DQorICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTGl0ZXJhbExlbikpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSAnOSc6DQorICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSAqIGNvZWZmICsgKHN0cltjY10gLSAnMCcpICogMC4xOw0KKyAgICAgICAgICBjb2VmZiAqPSAwLjE7DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJ3onOg0KKyAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICogY29lZmYgKyAoc3RyW2NjXSAtICcwJykgKiAwLjE7DQorICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KKyAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnWic6DQorICAgICAgICAgIGlmIChzdHJbY2NdICE9ICcgJykgew0KKyAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICogY29lZmYgKyAoc3RyW2NjXSAtICcwJykgKiAwLjE7DQorICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJ1MnOg0KKyAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycgfHwgc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNjIC09IGlNaW51c0xlbiAtIDE7DQorICAgICAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTWludXMsIGlNaW51c0xlbikpIHsNCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBkb3RfaW5kZXggPSBjYyArIDE7DQorICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdzJzoNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBjYyAtPSBpTWludXNMZW4gLSAxOw0KKyAgICAgICAgICAgIGlmIChjYyA8IDAgfHwNCisgICAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnRSc6IHsNCisgICAgICAgICAgaWYgKGNjID49IGRvdF9pbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWF9CT09MIGJFeHBTaWduID0gRkFMU0U7DQorICAgICAgICAgIHdoaWxlIChjYyA+PSAwKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCArIChzdHJbY2NdIC0gJzAnKSAqIDEwOw0KKyAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNjIC0gaU1pbnVzTGVuICsgMSA+IDAgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICFGWFNZU193Y3NuY21wKHN0ciArIChjYyAtIGlNaW51c0xlbiArIDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgICBiRXhwU2lnbiA9IFRSVUU7DQorICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW47DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50Ow0KKyAgICAgICAgICBjY2YtLTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICckJzogew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1N5bWJvbCk7DQorICAgICAgICAgIGludDMyX3QgaVN5bWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgICBjYyAtPSBpU3ltYm9sTGVuIC0gMTsNCisgICAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwgaVN5bWJvbExlbikpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAncic6DQorICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnYycpIHsNCisgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgIGNjIC09IDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnUic6DQorICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnQycpIHsNCisgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdSJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnQycpIHsNCisgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdiJzoNCisgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdkJykgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdCJzoNCisgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdEJykgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdEJykgew0KKyAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJy4nOg0KKyAgICAgICAgY2FzZSAnVic6DQorICAgICAgICBjYXNlICd2JzoNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgY2FzZSAnJSc6IHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQorICAgICAgICAgIGludDMyX3QgaVN5c21ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgY2MgLT0gaVN5c21ib2xMZW4gLSAxOw0KKyAgICAgICAgICBpZiAoY2MgPCAwIHx8DQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLCBpU3lzbWJvbExlbikpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJIYXZlUGVyY2VudFN5bWJvbCA9IFRSVUU7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnOCc6DQorICAgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpIHsNCisgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIGRiUmV0VmFsdWUgPSAoc3RyW2NjXSAtICcwJykgKiBjb2VmZiArIGRiUmV0VmFsdWU7DQorICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICcsJzogew0KKyAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICAgIGNjIC09IGlHcm91cExlbiAtIDE7DQorICAgICAgICAgICAgaWYgKGNjID49IDAgJiYNCisgICAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0dyb3VwU3ltYm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlHcm91cExlbikgPT0gMCkgew0KKyAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuIC0gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmLS07DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnKCc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnKSc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKScpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7DQotICAgIGNjID0gZG90X2luZGV4IC0gMTsNCi0gICAgY29lZmYgPSAxOw0KLSAgICB3aGlsZSAoY2NmID49IDAgJiYgY2MgPj0gMCkgew0KLSAgICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCi0gICAgICAgICAgICBjYXNlICdcJyc6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShzdHJmLCBjY2YpOw0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICAgICAgICAgIGNjIC09IGlMaXRlcmFsTGVuIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsIGlMaXRlcmFsTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSAnOSc6DQotICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICsgKHN0cltjY10gLSAnMCcpICogY29lZmY7DQotICAgICAgICAgICAgICAgIGNvZWZmICo9IDEwOw0KLSAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAneic6DQotICAgICAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSArIChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmOw0KLSAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMTA7DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdaJzoNCi0gICAgICAgICAgICAgICAgaWYgKHN0cltjY10gIT0gJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICsgKHN0cltjY10gLSAnMCcpICogY29lZmY7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMTA7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ1MnOg0KLSAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycgfHwgc3RyW2NjXSA9PSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW4gLSAxOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTWludXMsIGlNaW51c0xlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ3MnOg0KLSAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW4gLSAxOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTWludXMsIGlNaW51c0xlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ0UnOiB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPj0gZG90X2luZGV4KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRXhwU2lnbiA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjID49IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCArIChzdHJbY2NdIC0gJzAnKSAqIDEwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJysnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2MgLSBpTWludXNMZW4gKyAxID4gMCAmJiAhRlhTWVNfd2NzbmNtcChzdHIgKyAoY2MgLSBpTWludXNMZW4gKyAxKSwgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYyAtLTsNCi0gICAgICAgICAgICAgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsNCi0gICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJyQnOiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCi0gICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOw0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3ltYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICBjYyAtPSBpU3ltYm9sTGVuIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwgaVN5bWJvbExlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAncic6DQotICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnYycpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdSJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnQycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBjY2YgLS07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnUic6DQotICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnQycpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ1InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdDJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IDI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjY2YgLT0gMjsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ2InOg0KLSAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2QnKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnQicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0QnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZiAtPSAyOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgY2NmIC0tOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ0InOg0KLSAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0QnKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICcuJzoNCi0gICAgICAgICAgICBjYXNlICdWJzoNCi0gICAgICAgICAgICBjYXNlICd2JzoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIGNhc2UgJyUnOiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCi0gICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTeXNtYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICBjYyAtPSBpU3lzbWJvbExlbiAtIDE7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCAwICB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLCBpU3lzbWJvbExlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJzgnOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgY2FzZSAnLCc6IHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjYyA+PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaUdyb3VwTGVuIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCAmJiBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzR3JvdXBTeW1ib2wsIGlHcm91cExlbikgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlHcm91cExlbiAtIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnKCc6DQotICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICcpJzoNCi0gICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcpJykgew0KLSAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2MtLTsNCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KKyAgICBkb3RfaW5kZXggPSBjYyArIDE7DQorICB9DQorICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7DQorICBjYyA9IGRvdF9pbmRleCAtIDE7DQorICBjb2VmZiA9IDE7DQorICB3aGlsZSAoY2NmID49IDAgJiYgY2MgPj0gMCkgew0KKyAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgIGNhc2UgJ1wnJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHRSZXZlcnNlKHN0cmYsIGNjZik7DQorICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgY2MgLT0gaUxpdGVyYWxMZW4gLSAxOw0KKyAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NMaXRlcmFsLCBpTGl0ZXJhbExlbikpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICAgICAgfQ0KKyAgICAgICAgY2MtLTsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICsgKHN0cltjY10gLSAnMCcpICogY29lZmY7DQorICAgICAgICBjb2VmZiAqPSAxMDsNCisgICAgICAgIGNjLS07DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ3onOg0KKyAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgZGJSZXRWYWx1ZSA9IGRiUmV0VmFsdWUgKyAoc3RyW2NjXSAtICcwJykgKiBjb2VmZjsNCisgICAgICAgICAgY29lZmYgKj0gMTA7DQorICAgICAgICAgIGNjLS07DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgaWYgKHN0cltjY10gIT0gJyAnKSB7DQorICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgZGJSZXRWYWx1ZSA9IGRiUmV0VmFsdWUgKyAoc3RyW2NjXSAtICcwJykgKiBjb2VmZjsNCisgICAgICAgICAgICBjb2VmZiAqPSAxMDsNCisgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdTJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09ICcrJyB8fCBzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsNCisgICAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdzJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsNCisgICAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdFJzogew0KKyAgICAgICAgaWYgKGNjID49IGRvdF9pbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBGWF9CT09MIGJFeHBTaWduID0gRkFMU0U7DQorICAgICAgICB3aGlsZSAoY2MgPj0gMCkgew0KKyAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCArIChzdHJbY2NdIC0gJzAnKSAqIDEwOw0KKyAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNjIC0gaU1pbnVzTGVuICsgMSA+IDAgJiYNCisgICAgICAgICAgICAgICAgICAgICAhRlhTWVNfd2NzbmNtcChzdHIgKyAoY2MgLSBpTWludXNMZW4gKyAxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgRlhfV0NIQVIqKXdzTWludXMsIGlNaW51c0xlbikpIHsNCisgICAgICAgICAgICBiRXhwU2lnbiA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2MtLTsNCisgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAnJCc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQorICAgICAgICBpbnQzMl90IGlTeW1ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgIGNjIC09IGlTeW1ib2xMZW4gLSAxOw0KKyAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NTeW1ib2wsIGlTeW1ib2xMZW4pKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGNjLS07DQorICAgICAgICBjY2YtLTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgJ3InOg0KKyAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdjJykgew0KKyAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnUic6DQorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnYic6DQorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2QnKSB7DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdCJzoNCisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcuJzoNCisgICAgICBjYXNlICdWJzoNCisgICAgICBjYXNlICd2JzoNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICBjYXNlICclJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwgd3NTeW1ib2wpOw0KKyAgICAgICAgaW50MzJfdCBpU3lzbWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgY2MgLT0gaVN5c21ib2xMZW4gLSAxOw0KKyAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NTeW1ib2wsIGlTeXNtYm9sTGVuKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBjYy0tOw0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAnOCc6DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgY2FzZSAnLCc6IHsNCisgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgIGNjIC09IGlHcm91cExlbiAtIDE7DQorICAgICAgICAgIGlmIChjYyA+PSAwICYmDQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzR3JvdXBTeW1ib2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlHcm91cExlbikgPT0gMCkgew0KKyAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuIC0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlICcoJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCisgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBjYy0tOw0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcpJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09IEwnKScpIHsNCisgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBjYy0tOw0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGNjLS07DQorICAgICAgICBjY2YtLTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGNjID49IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFiUmV2ZXJzZVBhcnNlKSB7DQorICAgIGNjZiA9IGRvdF9pbmRleF9mICsgMTsNCisgICAgY2MgPSAoZG90X2luZGV4ID09IGxlbikgPyBsZW4gOiBkb3RfaW5kZXggKyAxOw0KKyAgICBjb2VmZiA9IDAuMTsNCisgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjZiA8IGxlbmYpIHsNCisgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgICAgY2FzZSAnXCcnOiB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgbGVuZik7DQorICAgICAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgIGlmIChjYyArIGlMaXRlcmFsTGVuID4gbGVuIHx8DQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTGl0ZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjICs9IGlMaXRlcmFsTGVuOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlICc5JzoNCisgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHsNCisgICAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSArIChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmOw0KKyAgICAgICAgICAgIGNvZWZmICo9IDAuMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICd6JzoNCisgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSArIChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmOw0KKyAgICAgICAgICAgIGNvZWZmICo9IDAuMTsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgICBpZiAoc3RyW2NjXSAhPSAnICcpIHsNCisgICAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgZGJSZXRWYWx1ZSA9IGRiUmV0VmFsdWUgKyAoc3RyW2NjXSAtICcwJykgKiBjb2VmZjsNCisgICAgICAgICAgICAgIGNvZWZmICo9IDAuMTsNCisgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnUyc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJyB8fCBzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8DQorICAgICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyArPSBpTWludXNMZW47DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAncyc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8DQorICAgICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyArPSBpTWludXNMZW47DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnRSc6IHsNCisgICAgICAgICAgaWYgKGNjID49IGxlbiB8fCAoc3RyW2NjXSAhPSAnRScgJiYgc3RyW2NjXSAhPSAnZScpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX0JPT0wgYkV4cFNpZ24gPSBGQUxTRTsNCisgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCisgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnJCc6IHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NTeW1ib2wpOw0KKyAgICAgICAgICBpbnQzMl90IGlTeW1ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgaWYgKGNjICsgaVN5bWJvbExlbiA+IGxlbiB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwgaVN5bWJvbExlbikpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MgKz0gaVN5bWJvbExlbjsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnYyc6DQorICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdyJykgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdDJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ1InKSB7DQorICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgIGNjICs9IDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnQyc6DQorICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdSJykgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0MnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnUicpIHsNCisgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MgKz0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdkJzoNCisgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ2InKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0QnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnQicpIHsNCisgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MgKz0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdEJzoNCisgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ0InKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnRCcgJiYgY2MgKyAxIDwgbGVuICYmIHN0cltjYyArIDFdID09ICdCJykgew0KKyAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICBjYyArPSAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJy4nOg0KKyAgICAgICAgY2FzZSAnVic6DQorICAgICAgICBjYXNlICd2JzoNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgY2FzZSAnJSc6IHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQorICAgICAgICAgIGludDMyX3QgaVN5c21ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgaWYgKGNjICsgaVN5c21ib2xMZW4gPD0gbGVuICYmDQorICAgICAgICAgICAgICAhRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTeXNtYm9sTGVuKSkgew0KKyAgICAgICAgICAgIGNjICs9IGlTeXNtYm9sTGVuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgJzgnOiB7DQorICAgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpIHsNCisgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIGRiUmV0VmFsdWUgPSAoc3RyW2NjXSAtICcwJykgKiBjb2VmZiArIGRiUmV0VmFsdWU7DQorICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICcsJzogew0KKyAgICAgICAgICBpZiAoY2MgKyBpR3JvdXBMZW4gPD0gbGVuICYmDQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzR3JvdXBTeW1ib2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlHcm91cExlbikgPT0gMCkgew0KKyAgICAgICAgICAgIGNjICs9IGlHcm91cExlbjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcoJykgew0KKyAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICcpJzoNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcpJykgew0KKyAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBpZiAoc3RyZltjY2ZdICE9IHN0cltjY10pIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChjYyAhPSBsZW4pIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIGlmIChpRXhwb25lbnQpIHsNCisgICAgZGJSZXRWYWx1ZSAqPSBGWFNZU19wb3coMTAsIChGWF9GTE9BVClpRXhwb25lbnQpOw0KKyAgfQ0KKyAgaWYgKGJIYXZlUGVyY2VudFN5bWJvbCkgew0KKyAgICBkYlJldFZhbHVlIC89IDEwMC4wOw0KKyAgfQ0KKyAgaWYgKGJOZWcpIHsNCisgICAgZGJSZXRWYWx1ZSA9IC1kYlJldFZhbHVlOw0KKyAgfQ0KKyAgZlZhbHVlID0gKEZYX0ZMT0FUKWRiUmV0VmFsdWU7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBGWF9QYXJzZU51bVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOdW0sIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSB3c051bS5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c051bTsNCisgIEZYX1dDSEFSKiBwRHN0ID0gd3NSZXN1bHQuR2V0QnVmZmVyKGlDb3VudCk7DQorICBpbnQzMl90IG5JbmRleCA9IDA7DQorICBGWF9CT09MIGJNaW51cyA9IEZBTFNFOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBGWF9XQ0hBUiB3YyA9IHBTdHJbaV07DQorICAgIGlmICh3YyA9PSAnLicpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoKHdjID09IEwnMCcgfHwgd2MgPT0gTCcgJyB8fCB3YyA9PSAnKycpICYmIG5JbmRleCA9PSAwKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKHdjID09ICctJykgew0KKyAgICAgIHBEc3RbbkluZGV4KytdID0gd2M7DQorICAgICAgYk1pbnVzID0gVFJVRTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAod2MgPT0gTCcwJyAmJiBuSW5kZXggPT0gMSAmJiBiTWludXMpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwRHN0W25JbmRleCsrXSA9IHdjOw0KKyAgfQ0KKyAgaWYgKGJNaW51cyAmJiBuSW5kZXggPT0gMSkgew0KKyAgICBwRHN0W25JbmRleCsrXSA9ICcwJzsNCisgIH0NCisgIGlmIChuSW5kZXggPT0gMCkgew0KKyAgICB3c1Jlc3VsdC5SZWxlYXNlQnVmZmVyKDApOw0KKyAgICBwRHN0ID0gd3NSZXN1bHQuR2V0QnVmZmVyKGlDb3VudCArIDEpOw0KKyAgICBwRHN0W25JbmRleCsrXSA9ICcwJzsNCisgIH0NCisgIGludDMyX3QgaiA9IDA7DQorICBmb3IgKGogPSBpQ291bnQgLSAxOyBqID4gaTsgai0tKSB7DQorICAgIEZYX1dDSEFSIHdjID0gcFN0cltqXTsNCisgICAgaWYgKHdjICE9IEwnMCcgJiYgd2MgIT0gTCcgJykgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoaiA+IGkpIHsNCisgICAgcERzdFtuSW5kZXgrK10gPSAnLic7DQorICAgIEZYU1lTX3djc25jcHkocERzdCArIG5JbmRleCwgcFN0ciArIGkgKyAxLCBqIC0gaSk7DQorICAgIG5JbmRleCArPSBqIC0gaTsNCisgIH0NCisgIHdzUmVzdWx0LlJlbGVhc2VCdWZmZXIobkluZGV4KTsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpQYXJzZU51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIHsNCisgIHdzVmFsdWUuRW1wdHkoKTsNCisgIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGRvdF9pbmRleF9mID0gLTE7DQorICBGWF9EV09SRCBkd0Zvcm1hdFN0eWxlID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIHdzTnVtRm9ybWF0Ow0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9DQorICAgICAgR2V0TnVtZXJpY0Zvcm1hdCh3c1BhdHRlcm4sIGRvdF9pbmRleF9mLCBkd0Zvcm1hdFN0eWxlLCB3c051bUZvcm1hdCk7DQorICBpZiAoIXBMb2NhbGUgfHwgd3NOdW1Gb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgaUV4cG9uZW50ID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIHdzRG90U3ltYm9sOw0KKyAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzRG90U3ltYm9sKTsNCisgIGludDMyX3QgaURvdExlbiA9IHdzRG90U3ltYm9sLkdldExlbmd0aCgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCisgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZywgd3NHcm91cFN5bWJvbCk7DQorICBpbnQzMl90IGlHcm91cExlbiA9IHdzR3JvdXBTeW1ib2wuR2V0TGVuZ3RoKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c01pbnVzOw0KKyAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzKTsNCisgIGludDMyX3QgaU1pbnVzTGVuID0gd3NNaW51cy5HZXRMZW5ndGgoKTsNCisgIGludCBjYyA9IDAsIGNjZiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1NyY051bTsNCisgIGludCBsZW4gPSB3c1NyY051bS5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c051bUZvcm1hdDsNCisgIGludCBsZW5mID0gd3NOdW1Gb3JtYXQuR2V0TGVuZ3RoKCk7DQorICBGWF9CT09MIGJIYXZlUGVyY2VudFN5bWJvbCA9IEZBTFNFOw0KKyAgRlhfQk9PTCBiTmVnID0gRkFMU0U7DQorICBGWF9CT09MIGJSZXZlcnNlUGFyc2UgPSBGQUxTRTsNCisgIGludDMyX3QgZG90X2luZGV4ID0gMDsNCisgIGlmICghRlhfR2V0TnVtZXJpY0RvdEluZGV4KHdzU3JjTnVtLCB3c0RvdFN5bWJvbCwgZG90X2luZGV4KSAmJg0KKyAgICAgIChkd0Zvcm1hdFN0eWxlICYgRlhfTlVNU1RZTEVfRG90Vm9ydikpIHsNCisgICAgYlJldmVyc2VQYXJzZSA9IFRSVUU7DQorICB9DQorICBiUmV2ZXJzZVBhcnNlID0gRkFMU0U7DQorICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7DQorICBjYyA9IGRvdF9pbmRleCAtIDE7DQorICB3aGlsZSAoY2NmID49IDAgJiYgY2MgPj0gMCkgew0KKyAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgIGNhc2UgJ1wnJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHRSZXZlcnNlKHN0cmYsIGNjZik7DQorICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgY2MgLT0gaUxpdGVyYWxMZW4gLSAxOw0KKyAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NMaXRlcmFsLCBpTGl0ZXJhbExlbikpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2MtLTsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZ0Moc3RyW2NjXSkgKyB3c1ZhbHVlOw0KKyAgICAgICAgY2MtLTsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAneic6DQorICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NWYWx1ZTsNCisgICAgICAgICAgY2MtLTsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnWic6DQorICAgICAgICBpZiAoc3RyW2NjXSAhPSAnICcpIHsNCisgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NWYWx1ZTsNCisgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdTJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09ICcrJyB8fCBzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsNCisgICAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdzJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsNCisgICAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdFJzogew0KKyAgICAgICAgaWYgKGNjID49IGRvdF9pbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBGWF9CT09MIGJFeHBTaWduID0gRkFMU0U7DQorICAgICAgICB3aGlsZSAoY2MgPj0gMCkgew0KKyAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCArIChzdHJbY2NdIC0gJzAnKSAqIDEwOw0KKyAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNjIC0gaU1pbnVzTGVuICsgMSA+IDAgJiYNCisgICAgICAgICAgICAgICAgICAgICAhRlhTWVNfd2NzbmNtcChzdHIgKyAoY2MgLSBpTWludXNMZW4gKyAxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgRlhfV0NIQVIqKXdzTWludXMsIGlNaW51c0xlbikpIHsNCisgICAgICAgICAgICBiRXhwU2lnbiA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2MtLTsNCisgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAnJCc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQorICAgICAgICBpbnQzMl90IGlTeW1ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgIGNjIC09IGlTeW1ib2xMZW4gLSAxOw0KKyAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NTeW1ib2wsIGlTeW1ib2xMZW4pKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGNjLS07DQorICAgICAgICBjY2YtLTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgJ3InOg0KKyAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdjJykgew0KKyAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnUic6DQorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnYic6DQorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2QnKSB7DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdCJzoNCisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcuJzoNCisgICAgICBjYXNlICdWJzoNCisgICAgICBjYXNlICd2JzoNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICBjYXNlICclJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwgd3NTeW1ib2wpOw0KKyAgICAgICAgaW50MzJfdCBpU3lzbWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgY2MgLT0gaVN5c21ib2xMZW4gLSAxOw0KKyAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NTeW1ib2wsIGlTeXNtYm9sTGVuKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBjYy0tOw0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAnOCc6DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgY2FzZSAnLCc6IHsNCisgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgIGNjIC09IGlHcm91cExlbiAtIDE7DQorICAgICAgICAgIGlmIChjYyA+PSAwICYmDQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzR3JvdXBTeW1ib2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlHcm91cExlbikgPT0gMCkgew0KKyAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuIC0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlICcoJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCisgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBjYy0tOw0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcpJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09IEwnKScpIHsNCisgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBjYy0tOw0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGNjLS07DQorICAgICAgICBjY2YtLTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGNjID49IDApIHsNCisgICAgaWYgKHN0cltjY10gPT0gJy0nKSB7DQorICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgY2MtLTsNCiAgICAgfQ0KICAgICBpZiAoY2MgPj0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBpZiAoIWJSZXZlcnNlUGFyc2UpIHsNCi0gICAgICAgIGNjZiA9IGRvdF9pbmRleF9mICsgMTsNCi0gICAgICAgIGNjID0gKGRvdF9pbmRleCA9PSBsZW4pID8gbGVuIDogZG90X2luZGV4ICsgMTsNCi0gICAgICAgIGNvZWZmID0gMC4xOw0KLSAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjZiA8IGxlbmYpIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KLSAgICAgICAgICAgICAgICBjYXNlICdcJyc6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjICsgaUxpdGVyYWxMZW4gPiBsZW4gfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsIGlMaXRlcmFsTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlMaXRlcmFsTGVuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXNlICc5JzoNCi0gICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSArIChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmICo9IDAuMTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICd6JzoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGJSZXRWYWx1ZSA9IGRiUmV0VmFsdWUgKyAoc3RyW2NjXSAtICcwJykgKiBjb2VmZjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2VmZiAqPSAwLjE7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ1onOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gIT0gJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJSZXRWYWx1ZSA9IGRiUmV0VmFsdWUgKyAoc3RyW2NjXSAtICcwJykgKiBjb2VmZjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ1MnOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnIHx8IHN0cltjY10gPT0gJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlNaW51c0xlbjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ3MnOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlNaW51c0xlbjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ0UnOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjID49IGxlbiB8fCAoc3RyW2NjXSAhPSAnRScgJiYgc3RyW2NjXSAhPSAnZScpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRXhwU2lnbiA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaUV4cG9uZW50ID0gaUV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJyQnOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQotICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3ltYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjICsgaVN5bWJvbExlbiA+IGxlbiB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLCBpU3ltYm9sTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlTeW1ib2xMZW47DQotICAgICAgICAgICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnYyc6DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAncicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnQycgJiYgY2MgKyAxIDwgbGVuICYmIHN0cltjYyArIDFdID09ICdSJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2NmICs9IDI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnQyc6DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnUicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0MnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnUicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ2QnOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ2InKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0QnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnQicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ0QnOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ0InKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdEJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ0InKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyArPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjY2YgKz0gMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICcuJzoNCi0gICAgICAgICAgICAgICAgY2FzZSAnVic6DQotICAgICAgICAgICAgICAgIGNhc2UgJ3YnOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICBjYXNlICclJzogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3lzbWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyArIGlTeXNtYm9sTGVuIDw9IGxlbiAmJiAhRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwgaVN5c21ib2xMZW4pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlTeXNtYm9sTGVuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJzgnOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09ICc4Jykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJSZXRWYWx1ZSA9IChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmICsgZGJSZXRWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICcsJzogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyArIGlHcm91cExlbiA8PSBsZW4gJiYgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0dyb3VwU3ltYm9sLCBpR3JvdXBMZW4pID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICcoJzoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJyknOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcpJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoY2MgIT0gbGVuKSB7DQorICB9DQorICBpZiAoZG90X2luZGV4IDwgbGVuICYmIChkd0Zvcm1hdFN0eWxlICYgRlhfTlVNU1RZTEVfRG90Vm9ydikpIHsNCisgICAgd3NWYWx1ZSArPSAnLic7DQorICB9DQorICBpZiAoIWJSZXZlcnNlUGFyc2UpIHsNCisgICAgY2NmID0gZG90X2luZGV4X2YgKyAxOw0KKyAgICBjYyA9IChkb3RfaW5kZXggPT0gbGVuKSA/IGxlbiA6IGRvdF9pbmRleCArIDE7DQorICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjY2YgPCBsZW5mKSB7DQorICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCisgICAgICAgIGNhc2UgJ1wnJzogew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KKyAgICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgICBpZiAoY2MgKyBpTGl0ZXJhbExlbiA+IGxlbiB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlMaXRlcmFsTGVuKSkgew0KICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYyArPSBpTGl0ZXJhbExlbjsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KKyAgICAgICAgY2FzZSAnOSc6DQorICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB7IHdzVmFsdWUgKz0gc3RyW2NjXTsgfQ0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICd6JzoNCisgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICB3c1ZhbHVlICs9IHN0cltjY107DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdaJzoNCisgICAgICAgICAgaWYgKHN0cltjY10gIT0gJyAnKSB7DQorICAgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgIHdzVmFsdWUgKz0gc3RyW2NjXTsNCisgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnUyc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJyB8fCBzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8DQorICAgICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyArPSBpTWludXNMZW47DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAncyc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8DQorICAgICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyArPSBpTWludXNMZW47DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnRSc6IHsNCisgICAgICAgICAgaWYgKGNjID49IGxlbiB8fCAoc3RyW2NjXSAhPSAnRScgJiYgc3RyW2NjXSAhPSAnZScpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX0JPT0wgYkV4cFNpZ24gPSBGQUxTRTsNCisgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCisgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnJCc6IHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NTeW1ib2wpOw0KKyAgICAgICAgICBpbnQzMl90IGlTeW1ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgaWYgKGNjICsgaVN5bWJvbExlbiA+IGxlbiB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwgaVN5bWJvbExlbikpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MgKz0gaVN5bWJvbExlbjsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnYyc6DQorICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdyJykgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdDJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ1InKSB7DQorICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgIGNjICs9IDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnQyc6DQorICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdSJykgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0MnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnUicpIHsNCisgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MgKz0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdkJzoNCisgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ2InKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0QnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnQicpIHsNCisgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MgKz0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdEJzoNCisgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ0InKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnRCcgJiYgY2MgKyAxIDwgbGVuICYmIHN0cltjYyArIDFdID09ICdCJykgew0KKyAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICBjYyArPSAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJy4nOg0KKyAgICAgICAgY2FzZSAnVic6DQorICAgICAgICBjYXNlICd2JzoNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgY2FzZSAnJSc6IHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQorICAgICAgICAgIGludDMyX3QgaVN5c21ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgaWYgKGNjICsgaVN5c21ib2xMZW4gPD0gbGVuICYmDQorICAgICAgICAgICAgICAhRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTeXNtYm9sTGVuKSkgew0KKyAgICAgICAgICAgIGNjICs9IGlTeXNtYm9sTGVuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgJzgnOiB7DQorICAgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpIHsNCisgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIHdzVmFsdWUgKz0gc3RyW2NjXTsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnLCc6IHsNCisgICAgICAgICAgaWYgKGNjICsgaUdyb3VwTGVuIDw9IGxlbiAmJg0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0dyb3VwU3ltYm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpR3JvdXBMZW4pID09IDApIHsNCisgICAgICAgICAgICBjYyArPSBpR3JvdXBMZW47DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmKys7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnKCc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnKSc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKScpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjKys7DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgICBpZiAoY2MgIT0gbGVuKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICBpZiAoaUV4cG9uZW50IHx8IGJIYXZlUGVyY2VudFN5bWJvbCkgew0KKyAgICBDRlhfRGVjaW1hbCBkZWNpbWFsID0gQ0ZYX0RlY2ltYWwod3NWYWx1ZSk7DQogICAgIGlmIChpRXhwb25lbnQpIHsNCi0gICAgICAgIGRiUmV0VmFsdWUgKj0gRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpaUV4cG9uZW50KTsNCisgICAgICBkZWNpbWFsID0gZGVjaW1hbCAqIENGWF9EZWNpbWFsKEZYU1lTX3BvdygxMCwgKEZYX0ZMT0FUKWlFeHBvbmVudCkpOw0KICAgICB9DQogICAgIGlmIChiSGF2ZVBlcmNlbnRTeW1ib2wpIHsNCi0gICAgICAgIGRiUmV0VmFsdWUgLz0gMTAwLjA7DQorICAgICAgZGVjaW1hbCA9IGRlY2ltYWwgLyBDRlhfRGVjaW1hbCgxMDApOw0KICAgICB9DQotICAgIGlmIChiTmVnKSB7DQotICAgICAgICBkYlJldFZhbHVlID0gLWRiUmV0VmFsdWU7DQotICAgIH0NCi0gICAgZlZhbHVlID0gKEZYX0ZMT0FUKWRiUmV0VmFsdWU7DQotICAgIHJldHVybiBUUlVFOw0KKyAgICB3c1ZhbHVlID0gZGVjaW1hbDsNCisgIH0NCisgIGlmIChiTmVnKSB7DQorICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZ0MoJy0nKSArIHdzVmFsdWU7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCAgRlhfUGFyc2VOdW1TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtLCBDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IHdzTnVtLkdldExlbmd0aCgpOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NOdW07DQotICAgIEZYX1dDSEFSKiBwRHN0ID0gd3NSZXN1bHQuR2V0QnVmZmVyKGlDb3VudCk7DQotICAgIGludDMyX3QgbkluZGV4ID0gMDsNCi0gICAgRlhfQk9PTCBiTWludXMgPSBGQUxTRTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICBGWF9XQ0hBUiB3YyA9IHBTdHJbaV07DQotICAgICAgICBpZiAod2MgPT0gJy4nKSB7DQotICAgICAgICAgICAgYnJlYWs7DQorRlhfREFURVRJTUVUWVBFIENGWF9Gb3JtYXRTdHJpbmc6OkdldERhdGVUaW1lRm9ybWF0KA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICBJRlhfTG9jYWxlKiYgcExvY2FsZSwNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVBhdHRlcm4sDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c1RpbWVQYXR0ZXJuKSB7DQorICBwTG9jYWxlID0gTlVMTDsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGVtcFBhdHRlcm47DQorICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duOw0KKyAgaW50MzJfdCBjY2YgPSAwOw0KKyAgaW50MzJfdCBpTGVuZiA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1BhdHRlcm47DQorICBpbnQzMl90IGlGaW5kQ2F0ZWdvcnkgPSAwOw0KKyAgRlhfQk9PTCBiQnJhY2VPcGVuID0gRkFMU0U7DQorICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsNCisgICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgaW50MzJfdCBpQ3VyQ2hhciA9IGNjZjsNCisgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsNCisgICAgICB3c1RlbXBQYXR0ZXJuICs9IENGWF9XaWRlU3RyaW5nQyhwU3RyICsgaUN1ckNoYXIsIGNjZiAtIGlDdXJDaGFyICsgMSk7DQorICAgIH0gZWxzZSBpZiAoIWJCcmFjZU9wZW4gJiYgaUZpbmRDYXRlZ29yeSAhPSAzICYmDQorICAgICAgICAgICAgICAgRlhfTG9jYWxfRmluZChnc193c0NvbnN0Q2hhcnMsIHBTdHJbY2NmXSkgPCAwKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXRlZ29yeShwU3RyW2NjZl0pOw0KKyAgICAgIGNjZisrOw0KKyAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJ3snICYmIHBTdHJbY2NmXSAhPSAnLicgJiYNCisgICAgICAgICAgICAgcFN0cltjY2ZdICE9ICcoJykgew0KKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnVCcpIHsNCisgICAgICAgICAgd3NEYXRlUGF0dGVybiA9IHdzUGF0dGVybi5MZWZ0KGNjZik7DQorICAgICAgICAgIHdzVGltZVBhdHRlcm4gPSB3c1BhdHRlcm4uUmlnaHQod3NQYXR0ZXJuLkdldExlbmd0aCgpIC0gY2NmKTsNCisgICAgICAgICAgd3NUaW1lUGF0dGVybi5TZXRBdCgwLCAnICcpOw0KKyAgICAgICAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgICAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICByZXR1cm4gRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYgKCh3YyA9PSBMJzAnIHx8IHdjID09IEwnICcgfHwgd2MgPT0gJysnKSAmJiBuSW5kZXggPT0gMCkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgd3NDYXRlZ29yeSArPSBwU3RyW2NjZl07DQorICAgICAgICBjY2YrKzsNCisgICAgICB9DQorICAgICAgaWYgKCEoaUZpbmRDYXRlZ29yeSAmIDEpICYmIHdzQ2F0ZWdvcnkgPT0gRlhfV1NUUkMoTCJkYXRlIikpIHsNCisgICAgICAgIGlGaW5kQ2F0ZWdvcnkgfD0gMTsNCisgICAgICAgIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU7DQorICAgICAgICBpZiAoaUZpbmRDYXRlZ29yeSAmIDIpIHsNCisgICAgICAgICAgaUZpbmRDYXRlZ29yeSA9IDQ7DQogICAgICAgICB9DQotICAgICAgICBpZiAod2MgPT0gJy0nKSB7DQotICAgICAgICAgICAgcERzdFtuSW5kZXgrK10gPSB3YzsNCi0gICAgICAgICAgICBiTWludXMgPSBUUlVFOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdjID09IEwnMCcgJiYgbkluZGV4ID09IDEgJiYgYk1pbnVzKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBwRHN0W25JbmRleCsrXSA9IHdjOw0KLSAgICB9DQotICAgIGlmIChiTWludXMgJiYgbkluZGV4ID09IDEpIHsNCi0gICAgICAgIHBEc3RbbkluZGV4KytdID0gJzAnOw0KLSAgICB9DQotICAgIGlmIChuSW5kZXggPT0gMCkgew0KLSAgICAgICAgd3NSZXN1bHQuUmVsZWFzZUJ1ZmZlcigwKTsNCi0gICAgICAgIHBEc3QgPSB3c1Jlc3VsdC5HZXRCdWZmZXIoaUNvdW50ICsgMSk7DQotICAgICAgICBwRHN0W25JbmRleCsrXSA9ICcwJzsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGogPSAwOw0KLSAgICBmb3IgKGogPSBpQ291bnQgLSAxOyBqID4gaTsgai0tKSB7DQotICAgICAgICBGWF9XQ0hBUiB3YyA9IHBTdHJbal07DQotICAgICAgICBpZiAod2MgIT0gTCcwJyAmJiB3YyAhPSBMJyAnKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGogPiBpKSB7DQotICAgICAgICBwRHN0W25JbmRleCsrXSA9ICcuJzsNCi0gICAgICAgIEZYU1lTX3djc25jcHkocERzdCArIG5JbmRleCwgcFN0ciArIGkgKyAxLCBqIC0gaSk7DQotICAgICAgICBuSW5kZXggKz0gaiAtIGk7DQotICAgIH0NCi0gICAgd3NSZXN1bHQuUmVsZWFzZUJ1ZmZlcihuSW5kZXgpOw0KLX0NCi1GWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpDQotew0KLSAgICB3c1ZhbHVlLkVtcHR5KCk7DQotICAgIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGludDMyX3QgZG90X2luZGV4X2YgPSAtMTsNCi0gICAgRlhfRFdPUkQgZHdGb3JtYXRTdHlsZSA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTnVtRm9ybWF0Ow0KLSAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TnVtZXJpY0Zvcm1hdCh3c1BhdHRlcm4sIGRvdF9pbmRleF9mLCBkd0Zvcm1hdFN0eWxlLCB3c051bUZvcm1hdCk7DQotICAgIGlmICghcExvY2FsZSB8fCB3c051bUZvcm1hdC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlFeHBvbmVudCA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRG90U3ltYm9sOw0KLSAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NEb3RTeW1ib2wpOw0KLSAgICBpbnQzMl90IGlEb3RMZW4gPSB3c0RvdFN5bWJvbC5HZXRMZW5ndGgoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCi0gICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCi0gICAgaW50MzJfdCBpR3JvdXBMZW4gPSB3c0dyb3VwU3ltYm9sLkdldExlbmd0aCgpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzOw0KLSAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXMpOw0KLSAgICBpbnQzMl90IGlNaW51c0xlbiA9IHdzTWludXMuR2V0TGVuZ3RoKCk7DQotICAgIGludCBjYyA9IDAsIGNjZiA9IDA7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzU3JjTnVtOw0KLSAgICBpbnQgbGVuID0gd3NTcmNOdW0uR2V0TGVuZ3RoKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c051bUZvcm1hdDsNCi0gICAgaW50IGxlbmYgPSB3c051bUZvcm1hdC5HZXRMZW5ndGgoKTsNCi0gICAgRlhfQk9PTCBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBGQUxTRTsNCi0gICAgRlhfQk9PTCBiTmVnID0gRkFMU0U7DQotICAgIEZYX0JPT0wgYlJldmVyc2VQYXJzZSA9IEZBTFNFOw0KLSAgICBpbnQzMl90IGRvdF9pbmRleCA9IDA7DQotICAgIGlmICghRlhfR2V0TnVtZXJpY0RvdEluZGV4KHdzU3JjTnVtLCB3c0RvdFN5bWJvbCwgZG90X2luZGV4KSAmJiAoZHdGb3JtYXRTdHlsZSAmIEZYX05VTVNUWUxFX0RvdFZvcnYpKSB7DQotICAgICAgICBiUmV2ZXJzZVBhcnNlID0gVFJVRTsNCi0gICAgfQ0KLSAgICBiUmV2ZXJzZVBhcnNlID0gRkFMU0U7DQotICAgIGNjZiA9IGRvdF9pbmRleF9mIC0gMTsNCi0gICAgY2MgPSBkb3RfaW5kZXggLSAxOw0KLSAgICB3aGlsZSAoY2NmID49IDAgJiYgY2MgPj0gMCkgew0KLSAgICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCi0gICAgICAgICAgICBjYXNlICdcJyc6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShzdHJmLCBjY2YpOw0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICAgICAgICAgIGNjIC09IGlMaXRlcmFsTGVuIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsIGlMaXRlcmFsTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSAnOSc6DQotICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZ0Moc3RyW2NjXSkgKyB3c1ZhbHVlOw0KLSAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAneic6DQotICAgICAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ1onOg0KLSAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSAhPSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MtLTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ1MnOg0KLSAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycgfHwgc3RyW2NjXSA9PSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW4gLSAxOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTWludXMsIGlNaW51c0xlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ3MnOg0KLSAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW4gLSAxOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTWludXMsIGlNaW51c0xlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ0UnOiB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPj0gZG90X2luZGV4KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRXhwU2lnbiA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjID49IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCArIChzdHJbY2NdIC0gJzAnKSAqIDEwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJysnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2MgLSBpTWludXNMZW4gKyAxID4gMCAmJiAhRlhTWVNfd2NzbmNtcChzdHIgKyAoY2MgLSBpTWludXNMZW4gKyAxKSwgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYyAtLTsNCi0gICAgICAgICAgICAgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsNCi0gICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJyQnOiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCi0gICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOw0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3ltYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICBjYyAtPSBpU3ltYm9sTGVuIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwgaVN5bWJvbExlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAncic6DQotICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnYycpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdSJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnQycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBjY2YgLS07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnUic6DQotICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnQycpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ1InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdDJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IDI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjY2YgLT0gMjsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ2InOg0KLSAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2QnKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnQicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0QnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZiAtPSAyOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgY2NmIC0tOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ0InOg0KLSAgICAgICAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0QnKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYyAtPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICcuJzoNCi0gICAgICAgICAgICBjYXNlICdWJzoNCi0gICAgICAgICAgICBjYXNlICd2JzoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIGNhc2UgJyUnOiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCi0gICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTeXNtYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICBjYyAtPSBpU3lzbWJvbExlbiAtIDE7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPCAwICB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLCBpU3lzbWJvbExlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJzgnOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgY2FzZSAnLCc6IHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjYyA+PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaUdyb3VwTGVuIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCAmJiBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzR3JvdXBTeW1ib2wsIGlHcm91cExlbikgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlHcm91cExlbiAtIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnKCc6DQotICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICcpJzoNCi0gICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcpJykgew0KLSAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2MtLTsNCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0gZWxzZSBpZiAoIShpRmluZENhdGVnb3J5ICYgMikgJiYgd3NDYXRlZ29yeSA9PSBGWF9XU1RSQyhMInRpbWUiKSkgew0KKyAgICAgICAgaUZpbmRDYXRlZ29yeSB8PSAyOw0KKyAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfVGltZTsNCisgICAgICB9IGVsc2UgaWYgKHdzQ2F0ZWdvcnkgPT0gRlhfV1NUUkMoTCJkYXRldGltZSIpKSB7DQorICAgICAgICBpRmluZENhdGVnb3J5ID0gMzsNCisgICAgICAgIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQorICAgICAgICBpZiAocFN0cltjY2ZdID09ICcoJykgew0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMQ0lEOw0KKyAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICcpJykgew0KKyAgICAgICAgICAgIHdzTENJRCArPSBwU3RyW2NjZisrXTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwTG9jYWxlID0gR2V0UGF0dGVybkxvY2FsZSh3c0xDSUQpOw0KKyAgICAgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ3snKSB7DQorICAgICAgICAgIGJCcmFjZU9wZW4gPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICcuJykgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N1YkNhdGVnb3J5Ow0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAnKCcgJiYgcFN0cltjY2ZdICE9ICd7Jykgew0KKyAgICAgICAgICAgIHdzU3ViQ2F0ZWdvcnkgKz0gcFN0cltjY2YrK107DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhfRFdPUkQgZHdTdWJIYXNoID0NCisgICAgICAgICAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzU3ViQ2F0ZWdvcnksIHdzU3ViQ2F0ZWdvcnkuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVTdWJDYXRlZ29yeSA9DQorICAgICAgICAgICAgICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZ19pRlhMb2NhbGVEYXRlVGltZVN1YkNhdENvdW50OyBpKyspIHsNCisgICAgICAgICAgICBpZiAoZ19GWExvY2FsZURhdGVUaW1lU3ViQ2F0RGF0YVtpXS51SGFzaCA9PSBkd1N1Ykhhc2gpIHsNCisgICAgICAgICAgICAgIGVTdWJDYXRlZ29yeSA9DQorICAgICAgICAgICAgICAgICAgKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkpZ19GWExvY2FsZURhdGVUaW1lU3ViQ2F0RGF0YVtpXQ0KKyAgICAgICAgICAgICAgICAgICAgICAuZVN1YkNhdGVnb3J5Ow0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICghcExvY2FsZSkgew0KKyAgICAgICAgICAgIHBMb2NhbGUgPSBtX3BMb2NhbGVNZ3ItPkdldERlZkxvY2FsZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYU1lTX2Fzc2VydChwTG9jYWxlICE9IE5VTEwpOw0KKyAgICAgICAgICBzd2l0Y2ggKGVDYXRlZ29yeSkgew0KKyAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZToNCisgICAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKGVTdWJDYXRlZ29yeSwgd3NEYXRlUGF0dGVybik7DQorICAgICAgICAgICAgICB3c0RhdGVQYXR0ZXJuID0gd3NUZW1wUGF0dGVybiArIHdzRGF0ZVBhdHRlcm47DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU6DQorICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihlU3ViQ2F0ZWdvcnksIHdzVGltZVBhdHRlcm4pOw0KKyAgICAgICAgICAgICAgd3NUaW1lUGF0dGVybiA9IHdzVGVtcFBhdHRlcm4gKyB3c1RpbWVQYXR0ZXJuOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZToNCisgICAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKGVTdWJDYXRlZ29yeSwgd3NEYXRlUGF0dGVybik7DQorICAgICAgICAgICAgICB3c0RhdGVQYXR0ZXJuID0gd3NUZW1wUGF0dGVybiArIHdzRGF0ZVBhdHRlcm47DQorICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihlU3ViQ2F0ZWdvcnksIHdzVGltZVBhdHRlcm4pOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2MtLTsNCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGNjID49IDApIHsNCi0gICAgICAgIGlmIChzdHJbY2NdID09ICctJykgew0KLSAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgIGNjIC0tOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGNjID49IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGRvdF9pbmRleCA8IGxlbiAmJiAoZHdGb3JtYXRTdHlsZSAmIEZYX05VTVNUWUxFX0RvdFZvcnYpKSB7DQotICAgICAgICB3c1ZhbHVlICs9ICcuJzsNCi0gICAgfQ0KLSAgICBpZiAoIWJSZXZlcnNlUGFyc2UpIHsNCi0gICAgICAgIGNjZiA9IGRvdF9pbmRleF9mICsgMTsNCi0gICAgICAgIGNjID0gKGRvdF9pbmRleCA9PSBsZW4pID8gbGVuIDogZG90X2luZGV4ICsgMTsNCi0gICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjY2YgPCBsZW5mKSB7DQotICAgICAgICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAnXCcnOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyArIGlMaXRlcmFsTGVuID4gbGVuIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NMaXRlcmFsLCBpTGl0ZXJhbExlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYyArPSBpTGl0ZXJhbExlbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2FzZSAnOSc6DQotICAgICAgICAgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZSArPSBzdHJbY2NdOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ3onOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlICs9IHN0cltjY107DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ1onOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gIT0gJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZSArPSBzdHJbY2NdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ1MnOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnIHx8IHN0cltjY10gPT0gJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlNaW51c0xlbjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ3MnOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlNaW51c0xlbjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ0UnOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjID49IGxlbiB8fCAoc3RyW2NjXSAhPSAnRScgJiYgc3RyW2NjXSAhPSAnZScpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRXhwU2lnbiA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaUV4cG9uZW50ID0gaUV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyArKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJyQnOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQotICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3ltYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjICsgaVN5bWJvbExlbiA+IGxlbiB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLCBpU3ltYm9sTGVuKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlTeW1ib2xMZW47DQotICAgICAgICAgICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnYyc6DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAncicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnQycgJiYgY2MgKyAxIDwgbGVuICYmIHN0cltjYyArIDFdID09ICdSJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2NmICs9IDI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnQyc6DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnUicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0MnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnUicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ2QnOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ2InKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0QnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnQicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJ0QnOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ0InKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdEJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ0InKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyArPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjY2YgKz0gMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICcuJzoNCi0gICAgICAgICAgICAgICAgY2FzZSAnVic6DQotICAgICAgICAgICAgICAgIGNhc2UgJ3YnOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICBjYXNlICclJzogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3lzbWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyArIGlTeXNtYm9sTGVuIDw9IGxlbiAmJiAhRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwgaVN5c21ib2xMZW4pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IGlTeXNtYm9sTGVuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJzgnOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09ICc4Jykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZSArPSBzdHJbY2NdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICcsJzogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyArIGlHcm91cExlbiA8PSBsZW4gJiYgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0dyb3VwU3ltYm9sLCBpR3JvdXBMZW4pID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICcoJzoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJyknOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcpJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoY2MgIT0gbGVuKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChpRXhwb25lbnQgfHwgYkhhdmVQZXJjZW50U3ltYm9sKSB7DQotICAgICAgICBDRlhfRGVjaW1hbCBkZWNpbWFsID0gQ0ZYX0RlY2ltYWwod3NWYWx1ZSk7DQotICAgICAgICBpZiAoaUV4cG9uZW50KSB7DQotICAgICAgICAgICAgZGVjaW1hbCA9IGRlY2ltYWwgKiBDRlhfRGVjaW1hbChGWFNZU19wb3coMTAsIChGWF9GTE9BVClpRXhwb25lbnQpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiSGF2ZVBlcmNlbnRTeW1ib2wpIHsNCi0gICAgICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCAvIENGWF9EZWNpbWFsKDEwMCk7DQotICAgICAgICB9DQotICAgICAgICB3c1ZhbHVlID0gZGVjaW1hbDsNCi0gICAgfQ0KLSAgICBpZiAoYk5lZykgew0KLSAgICAgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nQygnLScpICsgd3NWYWx1ZTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfREFURVRJTUVUWVBFIENGWF9Gb3JtYXRTdHJpbmc6OkdldERhdGVUaW1lRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIElGWF9Mb2NhbGUqJiBwTG9jYWxlLCBDRlhfV2lkZVN0cmluZyAmd3NEYXRlUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcgJndzVGltZVBhdHRlcm4pDQotew0KLSAgICBwTG9jYWxlID0gTlVMTDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wUGF0dGVybjsNCi0gICAgRlhfTE9DQUxFQ0FURUdPUlkgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfVW5rbm93bjsNCi0gICAgaW50MzJfdCBjY2YgPSAwOw0KLSAgICBpbnQzMl90IGlMZW5mID0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NQYXR0ZXJuOw0KLSAgICBpbnQzMl90IGlGaW5kQ2F0ZWdvcnkgPSAwOw0KLSAgICBGWF9CT09MIGJCcmFjZU9wZW4gPSBGQUxTRTsNCi0gICAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQotICAgICAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlDdXJDaGFyID0gY2NmOw0KLSAgICAgICAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHIsIGNjZiwgaUxlbmYpOw0KLSAgICAgICAgICAgIHdzVGVtcFBhdHRlcm4gKz0gQ0ZYX1dpZGVTdHJpbmdDKHBTdHIgKyBpQ3VyQ2hhciwgY2NmIC0gaUN1ckNoYXIgKyAxKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoIWJCcmFjZU9wZW4gJiYgaUZpbmRDYXRlZ29yeSAhPSAzICYmIEZYX0xvY2FsX0ZpbmQoZ3Nfd3NDb25zdENoYXJzLCBwU3RyW2NjZl0pIDwgMCkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2F0ZWdvcnkocFN0cltjY2ZdKTsNCi0gICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICd7JyAmJiBwU3RyW2NjZl0gIT0gJy4nICYmIHBTdHJbY2NmXSAhPSAnKCcpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnVCcpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gPSB3c1BhdHRlcm4uTGVmdChjY2YpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NUaW1lUGF0dGVybiA9IHdzUGF0dGVybi5SaWdodCh3c1BhdHRlcm4uR2V0TGVuZ3RoKCkgLSBjY2YpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NUaW1lUGF0dGVybi5TZXRBdCgwLCAnICcpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwTG9jYWxlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdzQ2F0ZWdvcnkgKz0gcFN0cltjY2ZdOw0KLSAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCEoaUZpbmRDYXRlZ29yeSAmIDEpICYmIHdzQ2F0ZWdvcnkgPT0gRlhfV1NUUkMoTCJkYXRlIikpIHsNCi0gICAgICAgICAgICAgICAgaUZpbmRDYXRlZ29yeSB8PSAxOw0KLSAgICAgICAgICAgICAgICBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOw0KLSAgICAgICAgICAgICAgICBpZiAoaUZpbmRDYXRlZ29yeSAmIDIpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlGaW5kQ2F0ZWdvcnkgPSA0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmICghKGlGaW5kQ2F0ZWdvcnkgJiAyKSAmJiB3c0NhdGVnb3J5ID09IEZYX1dTVFJDKEwidGltZSIpKSB7DQotICAgICAgICAgICAgICAgIGlGaW5kQ2F0ZWdvcnkgfD0gMjsNCi0gICAgICAgICAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfVGltZTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHdzQ2F0ZWdvcnkgPT0gRlhfV1NUUkMoTCJkYXRldGltZSIpKSB7DQotICAgICAgICAgICAgICAgIGlGaW5kQ2F0ZWdvcnkgPSAzOw0KLSAgICAgICAgICAgICAgICBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQotICAgICAgICAgICAgICAgIGlmIChwU3RyW2NjZl0gPT0gJygnKSB7DQotICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTENJRDsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJyknKQl7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NMQ0lEICs9IHBTdHJbY2NmKytdOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcExvY2FsZSA9IEdldFBhdHRlcm5Mb2NhbGUod3NMQ0lEKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ3snKSB7DQotICAgICAgICAgICAgICAgICAgICBiQnJhY2VPcGVuID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnLicpIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ViQ2F0ZWdvcnk7DQotICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJygnICYmIHBTdHJbY2NmXSAhPSAneycpCXsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1N1YkNhdGVnb3J5ICs9IHBTdHJbY2NmKytdOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdWJIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NTdWJDYXRlZ29yeSwgd3NTdWJDYXRlZ29yeS5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgICAgICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVTdWJDYXRlZ29yeSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZ19pRlhMb2NhbGVEYXRlVGltZVN1YkNhdENvdW50OyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ19GWExvY2FsZURhdGVUaW1lU3ViQ2F0RGF0YVtpXS51SGFzaCA9PSBkd1N1Ykhhc2gpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZVN1YkNhdGVnb3J5ID0gKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkpZ19GWExvY2FsZURhdGVUaW1lU3ViQ2F0RGF0YVtpXS5lU3ViQ2F0ZWdvcnk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmICghcExvY2FsZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUgPSBtX3BMb2NhbGVNZ3ItPkdldERlZkxvY2FsZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBMb2NhbGUgIT0gTlVMTCk7DQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGVDYXRlZ29yeSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oZVN1YkNhdGVnb3J5LCB3c0RhdGVQYXR0ZXJuKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NEYXRlUGF0dGVybiA9IHdzVGVtcFBhdHRlcm4gKyB3c0RhdGVQYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKGVTdWJDYXRlZ29yeSwgd3NUaW1lUGF0dGVybik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVGltZVBhdHRlcm4gPSB3c1RlbXBQYXR0ZXJuICsgd3NUaW1lUGF0dGVybjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oZVN1YkNhdGVnb3J5LCB3c0RhdGVQYXR0ZXJuKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NEYXRlUGF0dGVybiA9IHdzVGVtcFBhdHRlcm4gKyB3c0RhdGVQYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihlU3ViQ2F0ZWdvcnksIHdzVGltZVBhdHRlcm4pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHdzVGVtcFBhdHRlcm4uRW1wdHkoKTsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICd9Jykgew0KLSAgICAgICAgICAgIGJCcmFjZU9wZW4gPSBGQUxTRTsNCi0gICAgICAgICAgICBpZiAoIXdzVGVtcFBhdHRlcm4uSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFQ0FURUdPUllfVGltZSkgew0KLSAgICAgICAgICAgICAgICAgICAgd3NUaW1lUGF0dGVybiA9IHdzVGVtcFBhdHRlcm47DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gPSB3c1RlbXBQYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdzVGVtcFBhdHRlcm4uRW1wdHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdzVGVtcFBhdHRlcm4gKz0gcFN0cltjY2ZdOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgd3NUZW1wUGF0dGVybi5FbXB0eSgpOw0KKyAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCiAgICAgICAgIGNjZisrOw0KLSAgICB9DQotICAgIGlmICghd3NUZW1wUGF0dGVybi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZSkgew0KLSAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gKz0gd3NUZW1wUGF0dGVybjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgd3NUaW1lUGF0dGVybiArPSB3c1RlbXBQYXR0ZXJuOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ30nKSB7DQorICAgICAgYkJyYWNlT3BlbiA9IEZBTFNFOw0KKyAgICAgIGlmICghd3NUZW1wUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFQ0FURUdPUllfVGltZSkgew0KKyAgICAgICAgICB3c1RpbWVQYXR0ZXJuID0gd3NUZW1wUGF0dGVybjsNCisgICAgICAgIH0gZWxzZSBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpIHsNCisgICAgICAgICAgd3NEYXRlUGF0dGVybiA9IHdzVGVtcFBhdHRlcm47DQogICAgICAgICB9DQorICAgICAgICB3c1RlbXBQYXR0ZXJuLkVtcHR5KCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdzVGVtcFBhdHRlcm4gKz0gcFN0cltjY2ZdOw0KICAgICB9DQotICAgIGlmICghcExvY2FsZSkgew0KLSAgICAgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICAgIGNjZisrOw0KKyAgfQ0KKyAgaWYgKCF3c1RlbXBQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpIHsNCisgICAgICB3c0RhdGVQYXR0ZXJuICs9IHdzVGVtcFBhdHRlcm47DQorICAgIH0gZWxzZSB7DQorICAgICAgd3NUaW1lUGF0dGVybiArPSB3c1RlbXBQYXR0ZXJuOw0KICAgICB9DQotICAgIGlmICghaUZpbmRDYXRlZ29yeSkgew0KLSAgICAgICAgd3NUaW1lUGF0dGVybi5FbXB0eSgpOw0KLSAgICAgICAgd3NEYXRlUGF0dGVybiA9IHdzUGF0dGVybjsNCi0gICAgfQ0KLSAgICByZXR1cm4gKEZYX0RBVEVUSU1FVFlQRSlpRmluZENhdGVnb3J5Ow0KKyAgfQ0KKyAgaWYgKCFwTG9jYWxlKSB7DQorICAgIHBMb2NhbGUgPSBtX3BMb2NhbGVNZ3ItPkdldERlZkxvY2FsZSgpOw0KKyAgfQ0KKyAgaWYgKCFpRmluZENhdGVnb3J5KSB7DQorICAgIHdzVGltZVBhdHRlcm4uRW1wdHkoKTsNCisgICAgd3NEYXRlUGF0dGVybiA9IHdzUGF0dGVybjsNCisgIH0NCisgIHJldHVybiAoRlhfREFURVRJTUVUWVBFKWlGaW5kQ2F0ZWdvcnk7DQogfQ0KLXN0YXRpYyBGWF9CT09MIEZYX1BhcnNlTG9jYWxlRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlUGF0dGVybiwgSUZYX0xvY2FsZSogcExvY2FsZSwgQ0ZYX1VuaXRpbWUgJmRhdGV0aW1lLCBpbnQzMl90ICZjYykNCi17DQotICAgIGludDMyX3QgeWVhciA9IDE5MDA7DQotICAgIGludDMyX3QgbW9udGggPSAxOw0KLSAgICBpbnQzMl90IGRheSA9IDE7DQotICAgIGludDMyX3QgY2NmID0gMDsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NEYXRlOw0KLSAgICBpbnQzMl90IGxlbiA9IHdzRGF0ZS5HZXRMZW5ndGgoKTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHN0cmYgPSAoY29uc3QgRlhfV0NIQVIqKXdzRGF0ZVBhdHRlcm47DQotICAgIGludDMyX3QgbGVuZiA9IHdzRGF0ZVBhdHRlcm4uR2V0TGVuZ3RoKCk7DQotICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjY2YgPCBsZW5mKSB7DQotICAgICAgICBpZiAoc3RyZltjY2ZdID09ICdcJycpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgaWYgKGNjICsgaUxpdGVyYWxMZW4gPiBsZW4gfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsIGlMaXRlcmFsTGVuKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNjICs9IGlMaXRlcmFsTGVuOw0KLSAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfSBlbHNlIGlmIChGWF9Mb2NhbF9GaW5kKGdzX3dzRGF0ZVN5bWJvbHMsIHN0cmZbY2NmXSkgPCAwKSB7DQotICAgICAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICBjb250aW51ZTsNCitzdGF0aWMgRlhfQk9PTCBGWF9QYXJzZUxvY2FsZURhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiBkYXRldGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgY2MpIHsNCisgIGludDMyX3QgeWVhciA9IDE5MDA7DQorICBpbnQzMl90IG1vbnRoID0gMTsNCisgIGludDMyX3QgZGF5ID0gMTsNCisgIGludDMyX3QgY2NmID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzRGF0ZTsNCisgIGludDMyX3QgbGVuID0gd3NEYXRlLkdldExlbmd0aCgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHN0cmYgPSAoY29uc3QgRlhfV0NIQVIqKXdzRGF0ZVBhdHRlcm47DQorICBpbnQzMl90IGxlbmYgPSB3c0RhdGVQYXR0ZXJuLkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKGNjIDwgbGVuICYmIGNjZiA8IGxlbmYpIHsNCisgICAgaWYgKHN0cmZbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsNCisgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgIGlmIChjYyArIGlMaXRlcmFsTGVuID4gbGVuIHx8DQorICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NMaXRlcmFsLCBpTGl0ZXJhbExlbikpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgY2MgKz0gaUxpdGVyYWxMZW47DQorICAgICAgY2NmKys7DQorICAgICAgY29udGludWU7DQorICAgIH0gZWxzZSBpZiAoRlhfTG9jYWxfRmluZChnc193c0RhdGVTeW1ib2xzLCBzdHJmW2NjZl0pIDwgMCkgew0KKyAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBjYysrOw0KKyAgICAgIGNjZisrOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3U3ltYm9sTnVtID0gMTsNCisgICAgRlhfRFdPUkQgZHdTeW1ib2wgPSBzdHJmW2NjZisrXTsNCisgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09IGR3U3ltYm9sKSB7DQorICAgICAgY2NmKys7DQorICAgICAgZHdTeW1ib2xOdW0rKzsNCisgICAgfQ0KKyAgICBkd1N5bWJvbCA9IChkd1N5bWJvbCA8PCA4KSB8IChkd1N5bWJvbE51bSArICcwJyk7DQorICAgIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0QnLCAnMScpKSB7DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGRheSA9IHN0cltjYysrXSAtICcwJzsNCisgICAgICBpZiAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgZGF5ID0gZGF5ICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRCcsICcyJykpIHsNCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgZGF5ID0gc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgZGF5ID0gZGF5ICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSicsICcxJykpIHsNCisgICAgICBpbnQgaSA9IDA7DQorICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGkgPCAzICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIGNjKys7DQorICAgICAgICBpKys7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSicsICczJykpIHsNCisgICAgICBjYyArPSAzOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsNCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgbW9udGggPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgaWYgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIG1vbnRoID0gbW9udGggKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzInKSkgew0KKyAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBtb250aCA9IHN0cltjYysrXSAtICcwJzsNCisgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgIG1vbnRoID0gbW9udGggKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzMnKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTW9udGhOYW1lQWJicjsNCisgICAgICBGWF9XT1JEIGkgPSAwOw0KKyAgICAgIGZvciAoOyBpIDwgMTI7IGkrKykgew0KKyAgICAgICAgcExvY2FsZS0+R2V0TW9udGhOYW1lKGksIHdzTW9udGhOYW1lQWJiciwgVFJVRSk7DQorICAgICAgICBpZiAod3NNb250aE5hbWVBYmJyLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCi0gICAgICAgIEZYX0RXT1JEIGR3U3ltYm9sTnVtID0gMTsNCi0gICAgICAgIEZYX0RXT1JEIGR3U3ltYm9sID0gc3RyZltjY2YrK107DQotICAgICAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gZHdTeW1ib2wpIHsNCi0gICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICBkd1N5bWJvbE51bSsrOw0KKyAgICAgICAgaWYgKCFGWFNZU193Y3NuY21wKChjb25zdCBGWF9XQ0hBUiopd3NNb250aE5hbWVBYmJyLCBzdHIgKyBjYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3c01vbnRoTmFtZUFiYnIuR2V0TGVuZ3RoKCkpKSB7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KLSAgICAgICAgZHdTeW1ib2wgPSAoZHdTeW1ib2wgPDwgOCkgfCAoZHdTeW1ib2xOdW0gKyAnMCcpOw0KLSAgICAgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRCcsICcxJykpIHsNCi0gICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkYXkgPSBzdHJbY2MrK10gLSAnMCc7DQotICAgICAgICAgICAgaWYgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgZGF5ID0gZGF5ICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0QnLCAnMicpKSB7DQotICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZGF5ID0gc3RyW2NjKytdIC0gJzAnOw0KLSAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgICAgICBkYXkgPSBkYXkgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSicsICcxJykpIHsNCi0gICAgICAgICAgICBpbnQgaSA9IDA7DQotICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGkgPCAzICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdKJywgJzMnKSkgew0KLSAgICAgICAgICAgIGNjICs9IDM7DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsNCi0gICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtb250aCA9IHN0cltjYysrXSAtICcwJzsNCi0gICAgICAgICAgICBpZiAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICBtb250aCA9IG1vbnRoICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMicpKSB7DQotICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbW9udGggPSBzdHJbY2MrK10gLSAnMCc7DQotICAgICAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQotICAgICAgICAgICAgICAgIG1vbnRoID0gbW9udGggKiAxMCArIHN0cltjYysrXSAtICcwJzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICczJykpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01vbnRoTmFtZUFiYnI7DQotICAgICAgICAgICAgRlhfV09SRCBpID0gMDsNCi0gICAgICAgICAgICBmb3IgKDsgaSA8IDEyOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TW9udGhOYW1lKGksIHdzTW9udGhOYW1lQWJiciwgVFJVRSk7DQotICAgICAgICAgICAgICAgIGlmICh3c01vbnRoTmFtZUFiYnIuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoIUZYU1lTX3djc25jbXAoKGNvbnN0IEZYX1dDSEFSKil3c01vbnRoTmFtZUFiYnIsIHN0ciArIGNjLCB3c01vbnRoTmFtZUFiYnIuR2V0TGVuZ3RoKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoaSA8IDEyKSB7DQotICAgICAgICAgICAgICAgIGNjICs9IHdzTW9udGhOYW1lQWJici5HZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICAgICAgbW9udGggPSBpICsgMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICc0JykpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01vbnRoTmFtZTsNCi0gICAgICAgICAgICBGWF9XT1JEIGkgPSAwOw0KLSAgICAgICAgICAgIGZvciAoOyBpIDwgMTI7IGkrKykgew0KLSAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRNb250aE5hbWUoaSwgd3NNb250aE5hbWUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgaWYgKHdzTW9udGhOYW1lLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKCFGWFNZU193Y3NuY21wKChjb25zdCBGWF9XQ0hBUiopd3NNb250aE5hbWUsIHN0ciArIGNjLCB3c01vbnRoTmFtZS5HZXRMZW5ndGgoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChpIDwgMTIpIHsNCi0gICAgICAgICAgICAgICAgY2MgKz0gd3NNb250aE5hbWUuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIG1vbnRoID0gaSArIDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0UnLCAnMScpKSB7DQotICAgICAgICAgICAgY2MgKz0gMTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdFJywgJzMnKSkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5TmFtZUFiYnI7DQotICAgICAgICAgICAgRlhfV09SRCBpID0gMDsNCi0gICAgICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykgew0KLSAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXREYXlOYW1lKGksIHdzRGF5TmFtZUFiYnIsIFRSVUUpOw0KLSAgICAgICAgICAgICAgICBpZiAod3NEYXlOYW1lQWJici5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmICghRlhTWVNfd2NzbmNtcCgoY29uc3QgRlhfV0NIQVIqKXdzRGF5TmFtZUFiYnIsIHN0ciArIGNjLCB3c0RheU5hbWVBYmJyLkdldExlbmd0aCgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGkgPCAxMikgew0KLSAgICAgICAgICAgICAgICBjYyArPSB3c0RheU5hbWVBYmJyLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdFJywgJzQnKSkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5TmFtZTsNCi0gICAgICAgICAgICBpbnQzMl90IGkgPSAwOw0KLSAgICAgICAgICAgIGZvciAoOyBpIDwgNzsgaSsrKSB7DQotICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldERheU5hbWUoaSwgd3NEYXlOYW1lLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIGlmICh3c0RheU5hbWUgPT0gTCIiKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoIUZYU1lTX3djc25jbXAoKGNvbnN0IEZYX1dDSEFSKil3c0RheU5hbWUsIHN0ciArIGNjLCB3c0RheU5hbWUuR2V0TGVuZ3RoKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoaSA8IDEyKSB7DQotICAgICAgICAgICAgICAgIGNjICs9IHdzRGF5TmFtZS5HZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnZScsICcxJykpIHsNCi0gICAgICAgICAgICBjYyArPSAxOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0cnLCAnMScpKSB7DQotICAgICAgICAgICAgY2MgKz0gMjsNCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdZJywgJzInKSkgew0KLSAgICAgICAgICAgIGlmIChjYyArIDIgPiBsZW4pIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB5ZWFyID0gc3RyW2NjKytdIC0gJzAnOw0KLSAgICAgICAgICAgIGlmIChjYyA+PSBsZW4gfHwgIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB5ZWFyID0geWVhciAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KLSAgICAgICAgICAgIGlmICh5ZWFyIDw9IDI5KSB7DQotICAgICAgICAgICAgICAgIHllYXIgKz0gMjAwMDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB5ZWFyICs9IDE5MDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1knLCAnNCcpKSB7DQotICAgICAgICAgICAgaW50IGkgPSAwOw0KLSAgICAgICAgICAgIHllYXIgPSAwOw0KLSAgICAgICAgICAgIGlmIChjYyArIDQgPiBsZW4pIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3aGlsZSAoaSA8IDQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgeWVhciA9IHllYXIgKiAxMCArIHN0cltjY10gLSAnMCc7DQotICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgIGkrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAndycsICcxJykpIHsNCi0gICAgICAgICAgICBjYyArPSAxOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1cnLCAnMicpKSB7DQotICAgICAgICAgICAgY2MgKz0gMjsNCisgICAgICB9DQorICAgICAgaWYgKGkgPCAxMikgew0KKyAgICAgICAgY2MgKz0gd3NNb250aE5hbWVBYmJyLkdldExlbmd0aCgpOw0KKyAgICAgICAgbW9udGggPSBpICsgMTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzQnKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTW9udGhOYW1lOw0KKyAgICAgIEZYX1dPUkQgaSA9IDA7DQorICAgICAgZm9yICg7IGkgPCAxMjsgaSsrKSB7DQorICAgICAgICBwTG9jYWxlLT5HZXRNb250aE5hbWUoaSwgd3NNb250aE5hbWUsIEZBTFNFKTsNCisgICAgICAgIGlmICh3c01vbnRoTmFtZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgY29udGludWU7DQogICAgICAgICB9DQorICAgICAgICBpZiAoIUZYU1lTX3djc25jbXAoKGNvbnN0IEZYX1dDSEFSKil3c01vbnRoTmFtZSwgc3RyICsgY2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NNb250aE5hbWUuR2V0TGVuZ3RoKCkpKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoaSA8IDEyKSB7DQorICAgICAgICBjYyArPSB3c01vbnRoTmFtZS5HZXRMZW5ndGgoKTsNCisgICAgICAgIG1vbnRoID0gaSArIDE7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRScsICcxJykpIHsNCisgICAgICBjYyArPSAxOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRScsICczJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0RheU5hbWVBYmJyOw0KKyAgICAgIEZYX1dPUkQgaSA9IDA7DQorICAgICAgZm9yICg7IGkgPCA3OyBpKyspIHsNCisgICAgICAgIHBMb2NhbGUtPkdldERheU5hbWUoaSwgd3NEYXlOYW1lQWJiciwgVFJVRSk7DQorICAgICAgICBpZiAod3NEYXlOYW1lQWJici5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIUZYU1lTX3djc25jbXAoKGNvbnN0IEZYX1dDSEFSKil3c0RheU5hbWVBYmJyLCBzdHIgKyBjYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RheU5hbWVBYmJyLkdldExlbmd0aCgpKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKGkgPCAxMikgew0KKyAgICAgICAgY2MgKz0gd3NEYXlOYW1lQWJici5HZXRMZW5ndGgoKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdFJywgJzQnKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5TmFtZTsNCisgICAgICBpbnQzMl90IGkgPSAwOw0KKyAgICAgIGZvciAoOyBpIDwgNzsgaSsrKSB7DQorICAgICAgICBwTG9jYWxlLT5HZXREYXlOYW1lKGksIHdzRGF5TmFtZSwgRkFMU0UpOw0KKyAgICAgICAgaWYgKHdzRGF5TmFtZSA9PSBMIiIpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIUZYU1lTX3djc25jbXAoKGNvbnN0IEZYX1dDSEFSKil3c0RheU5hbWUsIHN0ciArIGNjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRGF5TmFtZS5HZXRMZW5ndGgoKSkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChpIDwgMTIpIHsNCisgICAgICAgIGNjICs9IHdzRGF5TmFtZS5HZXRMZW5ndGgoKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdlJywgJzEnKSkgew0KKyAgICAgIGNjICs9IDE7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdHJywgJzEnKSkgew0KKyAgICAgIGNjICs9IDI7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdZJywgJzInKSkgew0KKyAgICAgIGlmIChjYyArIDIgPiBsZW4pIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHllYXIgPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgaWYgKGNjID49IGxlbiB8fCAhRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICB5ZWFyID0geWVhciAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIGlmICh5ZWFyIDw9IDI5KSB7DQorICAgICAgICB5ZWFyICs9IDIwMDA7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHllYXIgKz0gMTkwMDsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdZJywgJzQnKSkgew0KKyAgICAgIGludCBpID0gMDsNCisgICAgICB5ZWFyID0gMDsNCisgICAgICBpZiAoY2MgKyA0ID4gbGVuKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHdoaWxlIChpIDwgNCkgew0KKyAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHllYXIgPSB5ZWFyICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgY2MrKzsNCisgICAgICAgIGkrKzsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICd3JywgJzEnKSkgew0KKyAgICAgIGNjICs9IDE7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdXJywgJzInKSkgew0KKyAgICAgIGNjICs9IDI7DQorICAgIH0NCisgIH0NCisgIGlmIChjYyA8IGxlbikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfVW5pdGltZSB1dDsNCisgIHV0LlNldCh5ZWFyLCBtb250aCwgZGF5KTsNCisgIGRhdGV0aW1lID0gZGF0ZXRpbWUgKyB1dDsNCisgIHJldHVybiBjYzsNCit9DQorc3RhdGljIHZvaWQgRlhfUmVzb2x2ZVpvbmUodWludDhfdCYgd0hvdXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgd01pbnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9USU1FWk9ORSB0ekRpZmYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgaW50MzJfdCBpTWludXRlRGlmZiA9IHdIb3VyICogNjAgKyB3TWludXRlOw0KKyAgRlhfVElNRVpPTkUgdHpMb2NhbGU7DQorICBwTG9jYWxlLT5HZXRUaW1lWm9uZSh0ekxvY2FsZSk7DQorICBpTWludXRlRGlmZiArPSB0ekxvY2FsZS50ekhvdXIgKiA2MCArDQorICAgICAgICAgICAgICAgICAodHpMb2NhbGUudHpIb3VyIDwgMCA/IC10ekxvY2FsZS50ek1pbnV0ZSA6IHR6TG9jYWxlLnR6TWludXRlKTsNCisgIGlNaW51dGVEaWZmIC09IHR6RGlmZi50ekhvdXIgKiA2MCArDQorICAgICAgICAgICAgICAgICAodHpEaWZmLnR6SG91ciA8IDAgPyAtdHpEaWZmLnR6TWludXRlIDogdHpEaWZmLnR6TWludXRlKTsNCisgIHdoaWxlIChpTWludXRlRGlmZiA+IDE0NDApIHsNCisgICAgaU1pbnV0ZURpZmYgLT0gMTQ0MDsNCisgIH0NCisgIHdoaWxlIChpTWludXRlRGlmZiA8IDApIHsNCisgICAgaU1pbnV0ZURpZmYgKz0gMTQ0MDsNCisgIH0NCisgIHdIb3VyID0gaU1pbnV0ZURpZmYgLyA2MDsNCisgIHdNaW51dGUgPSBpTWludXRlRGlmZiAlIDYwOw0KK30NCitzdGF0aWMgRlhfQk9PTCBGWF9QYXJzZUxvY2FsZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZVBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiBkYXRldGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgY2MpIHsNCisgIHVpbnQ4X3QgaG91ciA9IDA7DQorICB1aW50OF90IG1pbnV0ZSA9IDA7DQorICB1aW50OF90IHNlY29uZCA9IDA7DQorICBGWF9XT1JEIG1pbGxpc2Vjb25kID0gMDsNCisgIGludDMyX3QgY2NmID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzVGltZTsNCisgIGludCBsZW4gPSB3c1RpbWUuR2V0TGVuZ3RoKCk7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyZiA9IChjb25zdCBGWF9XQ0hBUiopd3NUaW1lUGF0dGVybjsNCisgIGludCBsZW5mID0gd3NUaW1lUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgIEZYX0JPT0wgYkhhc0EgPSBGQUxTRTsNCisgIEZYX0JPT0wgYlBNID0gRkFMU0U7DQorICB3aGlsZSAoY2MgPCBsZW4gJiYgY2NmIDwgbGVuZikgew0KKyAgICBpZiAoc3RyZltjY2ZdID09ICdcJycpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KKyAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQorICAgICAgaWYgKGNjICsgaUxpdGVyYWxMZW4gPiBsZW4gfHwNCisgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsIGlMaXRlcmFsTGVuKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBjYyArPSBpTGl0ZXJhbExlbjsNCisgICAgICBjY2YrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIGlmIChGWF9Mb2NhbF9GaW5kKGdzX3dzVGltZVN5bWJvbHMsIHN0cmZbY2NmXSkgPT0gLTEpIHsNCisgICAgICBpZiAoc3RyZltjY2ZdICE9IHN0cltjY10pIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgY2MrKzsNCisgICAgICBjY2YrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd1N5bWJvbE51bSA9IDE7DQorICAgIEZYX0RXT1JEIGR3U3ltYm9sID0gc3RyZltjY2YrK107DQorICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSBkd1N5bWJvbCkgew0KKyAgICAgIGNjZisrOw0KKyAgICAgIGR3U3ltYm9sTnVtKys7DQorICAgIH0NCisgICAgZHdTeW1ib2wgPSAoZHdTeW1ib2wgPDwgOCkgfCAoZHdTeW1ib2xOdW0gKyAnMCcpOw0KKyAgICBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdrJywgJzEnKSB8fA0KKyAgICAgICAgZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdIJywgJzEnKSB8fA0KKyAgICAgICAgZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdoJywgJzEnKSB8fA0KKyAgICAgICAgZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdLJywgJzEnKSkgew0KKyAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBob3VyID0gc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIGlmIChjYyA8IGxlbiAmJiBGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICBob3VyID0gaG91ciAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIH0NCisgICAgICBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdLJywgJzEnKSAmJiBob3VyID09IDI0KSB7DQorICAgICAgICBob3VyID0gMDsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdrJywgJzInKSB8fA0KKyAgICAgICAgICAgICAgIGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcyJykgfHwNCisgICAgICAgICAgICAgICBkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2gnLCAnMicpIHx8DQorICAgICAgICAgICAgICAgZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdLJywgJzInKSkgew0KKyAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBob3VyID0gc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIGlmIChjYyA+PSBsZW4pIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGhvdXIgPSBob3VyICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcyJykgJiYgaG91ciA9PSAyNCkgew0KKyAgICAgICAgaG91ciA9IDA7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsNCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgbWludXRlID0gc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIGlmIChjYyA8IGxlbiAmJiBGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICBtaW51dGUgPSBtaW51dGUgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzInKSkgew0KKyAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBtaW51dGUgPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgaWYgKGNjID49IGxlbikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgbWludXRlID0gbWludXRlICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdTJywgJzEnKSkgew0KKyAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBzZWNvbmQgPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgaWYgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHNlY29uZCA9IHNlY29uZCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1MnLCAnMicpKSB7DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHNlY29uZCA9IHN0cltjYysrXSAtICcwJzsNCisgICAgICBpZiAoY2MgPj0gbGVuKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBzZWNvbmQgPSBzZWNvbmQgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0YnLCAnMycpKSB7DQorICAgICAgaWYgKGNjICsgMyA+PSBsZW4pIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaW50IGkgPSAwOw0KKyAgICAgIHdoaWxlIChpIDwgMykgew0KKyAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIG1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICAgIGkrKzsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdBJywgJzEnKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQU07DQorICAgICAgcExvY2FsZS0+R2V0TWVyaWRpZW1OYW1lKHdzQU0sIFRSVUUpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzUE07DQorICAgICAgcExvY2FsZS0+R2V0TWVyaWRpZW1OYW1lKHdzUE0sIEZBTFNFKTsNCisgICAgICBpZiAoKGNjICsgd3NBTS5HZXRMZW5ndGgoKSA8PSBsZW4pICYmDQorICAgICAgICAgIChDRlhfV2lkZVN0cmluZ0Moc3RyICsgY2MsIHdzQU0uR2V0TGVuZ3RoKCkpID09IHdzQU0pKSB7DQorICAgICAgICBjYyArPSB3c0FNLkdldExlbmd0aCgpOw0KKyAgICAgICAgYkhhc0EgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSBpZiAoKGNjICsgd3NQTS5HZXRMZW5ndGgoKSA8PSBsZW4pICYmDQorICAgICAgICAgICAgICAgICAoQ0ZYX1dpZGVTdHJpbmdDKHN0ciArIGNjLCB3c1BNLkdldExlbmd0aCgpKSA9PSB3c1BNKSkgew0KKyAgICAgICAgY2MgKz0gd3NQTS5HZXRMZW5ndGgoKTsNCisgICAgICAgIGJIYXNBID0gVFJVRTsNCisgICAgICAgIGJQTSA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnWicsICcxJykpIHsNCisgICAgICBpZiAoY2MgKyAzID4gbGVuKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgRlhfRFdPUkQgZHdIYXNoID0gc3RyW2NjKytdOw0KKyAgICAgIGR3SGFzaCA9IChkd0hhc2ggPDwgOCkgfCBzdHJbY2MrK107DQorICAgICAgZHdIYXNoID0gKGR3SGFzaCA8PCA4KSB8IHN0cltjYysrXTsNCisgICAgICBpZiAoZHdIYXNoID09IEZYQlNUUl9JRCgwLCAnRycsICdNJywgJ1QnKSkgew0KKyAgICAgICAgRlhfVElNRVpPTkUgdHpEaWZmOw0KKyAgICAgICAgdHpEaWZmLnR6SG91ciA9IDA7DQorICAgICAgICB0ekRpZmYudHpNaW51dGUgPSAwOw0KKyAgICAgICAgaWYgKGNjIDwgbGVuICYmIChzdHJbY2NdID09ICctJyB8fCBzdHJbY2NdID09ICcrJykpIHsNCisgICAgICAgICAgY2MgKz0gRlhfUGFyc2VUaW1lWm9uZShzdHIgKyBjYywgbGVuIC0gY2MsIHR6RGlmZik7DQorICAgICAgICB9DQorICAgICAgICBGWF9SZXNvbHZlWm9uZShob3VyLCBtaW51dGUsIHR6RGlmZiwgcExvY2FsZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0xQQ0xPQ0FMRVRJTUVaT05FSU5GTyBwVGltZVpvbmVJbmZvID0gTlVMTDsNCisgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaUZYTG9jYWxlVGltZVpvbmVDb3VudCAtIDE7DQorICAgICAgICBkbyB7DQorICAgICAgICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgICAgIEZYX0xQQ0xPQ0FMRVRJTUVaT05FSU5GTyBwSW5mbyA9IGdfRlhMb2NhbGVUaW1lWm9uZURhdGEgKyBpTWlkOw0KKyAgICAgICAgICBpZiAoZHdIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgICAgICAgIHBUaW1lWm9uZUluZm8gPSBwSW5mbzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPCBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgICAgIGlmIChwVGltZVpvbmVJbmZvKSB7DQorICAgICAgICAgIGhvdXIgKz0gcFRpbWVab25lSW5mby0+aUhvdXI7DQorICAgICAgICAgIG1pbnV0ZSArPSBwVGltZVpvbmVJbmZvLT5pSG91ciA+IDAgPyBwVGltZVpvbmVJbmZvLT5pTWludXRlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAtcFRpbWVab25lSW5mby0+aU1pbnV0ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICd6JywgJzEnKSkgew0KKyAgICAgIGlmIChzdHJbY2NdICE9ICdaJykgew0KKyAgICAgICAgRlhfVElNRVpPTkUgdHpEaWZmOw0KKyAgICAgICAgY2MgKz0gRlhfUGFyc2VUaW1lWm9uZShzdHIgKyBjYywgbGVuIC0gY2MsIHR6RGlmZik7DQorICAgICAgICBGWF9SZXNvbHZlWm9uZShob3VyLCBtaW51dGUsIHR6RGlmZiwgcExvY2FsZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNjKys7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoYkhhc0EpIHsNCisgICAgaWYgKGJQTSkgew0KKyAgICAgIGhvdXIgKz0gMTI7DQorICAgICAgaWYgKGhvdXIgPT0gMjQpIHsNCisgICAgICAgIGhvdXIgPSAxMjsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGhvdXIgPT0gMTIpIHsNCisgICAgICAgIGhvdXIgPSAwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUgdXQ7DQorICB1dC5TZXQoMCwgMCwgMCwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKTsNCisgIGRhdGV0aW1lID0gZGF0ZXRpbWUgKyB1dDsNCisgIHJldHVybiBjYzsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpQYXJzZURhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUmIGR0VmFsdWUpIHsNCisgIGR0VmFsdWUuU2V0KDApOw0KKyAgaWYgKHdzU3JjRGF0ZVRpbWUuSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybjsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgRlhfREFURVRJTUVUWVBFIGVDYXRlZ29yeSA9DQorICAgICAgR2V0RGF0ZVRpbWVGb3JtYXQod3NQYXR0ZXJuLCBwTG9jYWxlLCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuKTsNCisgIGlmICghcExvY2FsZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duKSB7DQorICAgIGVDYXRlZ29yeSA9IGVEYXRlVGltZVR5cGU7DQorICB9DQorICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1RpbWVEYXRlKSB7DQorICAgIGludDMyX3QgaVN0YXJ0ID0gMDsNCisgICAgaWYgKCFGWF9QYXJzZUxvY2FsZVRpbWUod3NTcmNEYXRlVGltZSwgd3NUaW1lUGF0dGVybiwgcExvY2FsZSwgZHRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0KSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoIUZYX1BhcnNlTG9jYWxlRGF0ZSh3c1NyY0RhdGVUaW1lLCB3c0RhdGVQYXR0ZXJuLCBwTG9jYWxlLCBkdFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnQpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpbnQzMl90IGlTdGFydCA9IDA7DQorICAgIGlmICgoZUNhdGVnb3J5ICYgRlhfREFURVRJTUVUWVBFX0RhdGUpICYmDQorICAgICAgICAhRlhfUGFyc2VMb2NhbGVEYXRlKHdzU3JjRGF0ZVRpbWUsIHdzRGF0ZVBhdHRlcm4sIHBMb2NhbGUsIGR0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKChlQ2F0ZWdvcnkgJiBGWF9EQVRFVElNRVRZUEVfVGltZSkgJiYNCisgICAgICAgICFGWF9QYXJzZUxvY2FsZVRpbWUod3NTcmNEYXRlVGltZSwgd3NUaW1lUGF0dGVybiwgcExvY2FsZSwgZHRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0KSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0Zvcm1hdFN0cmluZzo6UGFyc2VaZXJvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0Ow0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9DQorICAgICAgR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEZYX1dTVFJDKEwiemVybyIpLCB3c1RleHRGb3JtYXQpOw0KKyAgaW50MzJfdCBpVGV4dCA9IDAsIGlQYXR0ZXJuID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyVGV4dCA9IChjb25zdCBGWF9XQ0hBUiopd3NTcmNUZXh0Ow0KKyAgaW50MzJfdCBpTGVuVGV4dCA9IHdzU3JjVGV4dC5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyUGF0dGVybiA9IChjb25zdCBGWF9XQ0hBUiopd3NUZXh0Rm9ybWF0Ow0KKyAgaW50MzJfdCBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsNCisgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuICYmIGlUZXh0IDwgaUxlblRleHQpIHsNCisgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0NCisgICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7DQorICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsNCisgICAgICBpZiAoaVRleHQgKyBpTGl0ZXJhbExlbiA+IGlMZW5UZXh0IHx8DQorICAgICAgICAgIEZYU1lTX3djc25jbXAocFN0clRleHQgKyBpVGV4dCwgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlUZXh0ICs9IGlMaXRlcmFsTGVuOw0KKyAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgY29udGludWU7DQorICAgIH0gZWxzZSBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9IHBTdHJUZXh0W2lUZXh0XSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpVGV4dCsrOw0KKyAgICAgIGlQYXR0ZXJuKys7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpUGF0dGVybiA9PSBpTGVuUGF0dGVybiAmJiBpVGV4dCA9PSBpTGVuVGV4dDsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpQYXJzZU51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHRGb3JtYXQ7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0NCisgICAgICBHZXRUZXh0Rm9ybWF0KHdzUGF0dGVybiwgRlhfV1NUUkMoTCJudWxsIiksIHdzVGV4dEZvcm1hdCk7DQorICBpbnQzMl90IGlUZXh0ID0gMCwgaVBhdHRlcm4gPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHJUZXh0ID0gKGNvbnN0IEZYX1dDSEFSKil3c1NyY1RleHQ7DQorICBpbnQzMl90IGlMZW5UZXh0ID0gd3NTcmNUZXh0LkdldExlbmd0aCgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHJQYXR0ZXJuID0gKGNvbnN0IEZYX1dDSEFSKil3c1RleHRGb3JtYXQ7DQorICBpbnQzMl90IGlMZW5QYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4gJiYgaVRleHQgPCBpTGVuVGV4dCkgew0KKyAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcJycpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpdGVyYWwgPQ0KKyAgICAgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyUGF0dGVybiwgaVBhdHRlcm4sIGlMZW5QYXR0ZXJuKTsNCisgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgIGlmIChpVGV4dCArIGlMaXRlcmFsTGVuID4gaUxlblRleHQgfHwNCisgICAgICAgICAgRlhTWVNfd2NzbmNtcChwU3RyVGV4dCArIGlUZXh0LCAoY29uc3QgRlhfV0NIQVIqKXdzTGl0ZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpTGl0ZXJhbExlbikpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaVRleHQgKz0gaUxpdGVyYWxMZW47DQorICAgICAgaVBhdHRlcm4rKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gIT0gcFN0clRleHRbaVRleHRdKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlUZXh0Kys7DQorICAgICAgaVBhdHRlcm4rKzsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlQYXR0ZXJuID09IGlMZW5QYXR0ZXJuICYmIGlUZXh0ID09IGlMZW5UZXh0Ow0KK30NCitGWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSB7DQorICBpZiAod3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGlMZW5UZXh0ID0gd3NTcmNUZXh0LkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5UZXh0ID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0Ow0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9DQorICAgICAgR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEZYX1dTVFJDKEwidGV4dCIpLCB3c1RleHRGb3JtYXQpOw0KKyAgaW50MzJfdCBpVGV4dCA9IDAsIGlQYXR0ZXJuID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyVGV4dCA9IChjb25zdCBGWF9XQ0hBUiopd3NTcmNUZXh0Ow0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHJQYXR0ZXJuID0gKGNvbnN0IEZYX1dDSEFSKil3c1RleHRGb3JtYXQ7DQorICBpbnQzMl90IGlMZW5QYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4pIHsNCisgICAgc3dpdGNoIChwU3RyUGF0dGVybltpUGF0dGVybl0pIHsNCisgICAgICBjYXNlICdcJyc6IHsNCisgICAgICAgIHdzT3V0cHV0ICs9IEZYX0dldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCBpUGF0dGVybiwgaUxlblBhdHRlcm4pOw0KKyAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlICdBJzoNCisgICAgICAgIGlmIChpVGV4dCA+PSBpTGVuVGV4dCB8fCAhRlhfSXNBbHBoYShwU3RyVGV4dFtpVGV4dF0pKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHdzT3V0cHV0ICs9IHBTdHJUZXh0W2lUZXh0KytdOw0KKyAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1gnOg0KKyAgICAgICAgaWYgKGlUZXh0ID49IGlMZW5UZXh0KSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHdzT3V0cHV0ICs9IHBTdHJUZXh0W2lUZXh0KytdOw0KKyAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ08nOg0KKyAgICAgIGNhc2UgJzAnOg0KKyAgICAgICAgaWYgKGlUZXh0ID49IGlMZW5UZXh0IHx8DQorICAgICAgICAgICAgKCFGWF9Jc0RpZ2l0KHBTdHJUZXh0W2lUZXh0XSkgJiYgIUZYX0lzQWxwaGEocFN0clRleHRbaVRleHRdKSkpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3NPdXRwdXQgKz0gcFN0clRleHRbaVRleHQrK107DQorICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnOSc6DQorICAgICAgICBpZiAoaVRleHQgPj0gaUxlblRleHQgfHwgIUZYX0lzRGlnaXQocFN0clRleHRbaVRleHRdKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICB3c091dHB1dCArPSBwU3RyVGV4dFtpVGV4dCsrXTsNCisgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgd3NPdXRwdXQgKz0gcFN0clBhdHRlcm5baVBhdHRlcm4rK107DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlUZXh0ID09IGlMZW5UZXh0Ow0KK30NCitzdGF0aWMgaW50MzJfdCBGWF9HZXROdW1UcmFpbGluZ0xpbWl0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpRG90UG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlRyaW1UYWlsWmVyb3MpIHsNCisgIGlmIChpRG90UG9zIDwgMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gd3NGb3JtYXQuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IGlUcmVhZGluZyA9IDA7DQorICBmb3IgKGlEb3RQb3MrKzsgaURvdFBvcyA8IGlDb3VudDsgaURvdFBvcysrKSB7DQorICAgIEZYX1dDSEFSIHdjID0gd3NGb3JtYXRbaURvdFBvc107DQorICAgIGlmICh3YyA9PSBMJ3onIHx8IHdjID09IEwnOScgfHwgd2MgPT0gJ1onKSB7DQorICAgICAgaVRyZWFkaW5nKys7DQorICAgICAgYlRyaW1UYWlsWmVyb3MgPSAod2MgPT0gTCc5JyA/IEZBTFNFIDogVFJVRSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpVHJlYWRpbmc7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0U3RyTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NJbnB1dE51bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgaWYgKHdzSW5wdXROdW0uSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBkb3RfaW5kZXhfZiA9IC0xOw0KKyAgRlhfRFdPUkQgZHdOdW1TdHlsZSA9IDA7DQorICBDRlhfV2lkZVN0cmluZyB3c051bUZvcm1hdDsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPQ0KKyAgICAgIEdldE51bWVyaWNGb3JtYXQod3NQYXR0ZXJuLCBkb3RfaW5kZXhfZiwgZHdOdW1TdHlsZSwgd3NOdW1Gb3JtYXQpOw0KKyAgaWYgKCFwTG9jYWxlIHx8IHdzTnVtRm9ybWF0LklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGNjID0gMCwgY2NmID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c051bUZvcm1hdDsNCisgIGludCBsZW5mID0gd3NOdW1Gb3JtYXQuR2V0TGVuZ3RoKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1NyY051bSA9IHdzSW5wdXROdW07DQorICB3c1NyY051bS5UcmltTGVmdCgnMCcpOw0KKyAgaWYgKHdzU3JjTnVtLklzRW1wdHkoKSB8fCB3c1NyY051bVswXSA9PSAnLicpIHsNCisgICAgd3NTcmNOdW0uSW5zZXJ0KDAsICcwJyk7DQorICB9DQorICBDRlhfRGVjaW1hbCBkZWNpbWFsID0gQ0ZYX0RlY2ltYWwod3NTcmNOdW0pOw0KKyAgaWYgKGR3TnVtU3R5bGUgJiBGWF9OVU1TVFlMRV9QZXJjZW50KSB7DQorICAgIGRlY2ltYWwgPSBkZWNpbWFsICogQ0ZYX0RlY2ltYWwoMTAwKTsNCisgICAgd3NTcmNOdW0gPSBkZWNpbWFsOw0KKyAgfQ0KKyAgaW50MzJfdCBleHBvbmVudCA9IDA7DQorICBpZiAoZHdOdW1TdHlsZSAmIEZYX05VTVNUWUxFX0V4cG9uZW50KSB7DQorICAgIGludCBmaXhlZF9jb3VudCA9IDA7DQorICAgIHdoaWxlIChjY2YgPCBkb3RfaW5kZXhfZikgew0KKyAgICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7DQorICAgICAgICBjYXNlICdcJyc6DQorICAgICAgICAgIEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgZG90X2luZGV4X2YpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgY2FzZSAneic6DQorICAgICAgICBjYXNlICdaJzoNCisgICAgICAgICAgZml4ZWRfY291bnQrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNjZisrOw0KKyAgICB9DQorICAgIGludCB0aHJlc2hvbGQgPSAxOw0KKyAgICB3aGlsZSAoZml4ZWRfY291bnQgPiAxKSB7DQorICAgICAgdGhyZXNob2xkICo9IDEwOw0KKyAgICAgIGZpeGVkX2NvdW50LS07DQorICAgIH0NCisgICAgaWYgKGRlY2ltYWwgIT0gQ0ZYX0RlY2ltYWwoMCkpIHsNCisgICAgICBpZiAoZGVjaW1hbCA8IENGWF9EZWNpbWFsKHRocmVzaG9sZCkpIHsNCisgICAgICAgIGRlY2ltYWwgPSBkZWNpbWFsICogQ0ZYX0RlY2ltYWwoMTApOw0KKyAgICAgICAgZXhwb25lbnQgPSAtMTsNCisgICAgICAgIHdoaWxlIChkZWNpbWFsIDwgQ0ZYX0RlY2ltYWwodGhyZXNob2xkKSkgew0KKyAgICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCAqIENGWF9EZWNpbWFsKDEwKTsNCisgICAgICAgICAgZXhwb25lbnQgLT0gMTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2UgaWYgKGRlY2ltYWwgPiBDRlhfRGVjaW1hbCh0aHJlc2hvbGQpKSB7DQorICAgICAgICB0aHJlc2hvbGQgKj0gMTA7DQorICAgICAgICB3aGlsZSAoZGVjaW1hbCA+IENGWF9EZWNpbWFsKHRocmVzaG9sZCkpIHsNCisgICAgICAgICAgZGVjaW1hbCA9IGRlY2ltYWwgLyBDRlhfRGVjaW1hbCgxMCk7DQorICAgICAgICAgIGV4cG9uZW50ICs9IDE7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBGWF9CT09MIGJUcmltVGFpbFplcm9zID0gRkFMU0U7DQorICBpbnQzMl90IGlUcmVhZGluZyA9DQorICAgICAgRlhfR2V0TnVtVHJhaWxpbmdMaW1pdCh3c051bUZvcm1hdCwgZG90X2luZGV4X2YsIGJUcmltVGFpbFplcm9zKTsNCisgIGludDMyX3Qgc2NhbGUgPSBkZWNpbWFsLkdldFNjYWxlKCk7DQorICBpZiAoaVRyZWFkaW5nIDwgc2NhbGUpIHsNCisgICAgZGVjaW1hbC5TZXRTY2FsZShpVHJlYWRpbmcpOw0KKyAgICB3c1NyY051bSA9IGRlY2ltYWw7DQorICB9DQorICBpZiAoYlRyaW1UYWlsWmVyb3MgJiYgc2NhbGUgPiAwICYmIGlUcmVhZGluZyA+IDApIHsNCisgICAgd3NTcmNOdW0uVHJpbVJpZ2h0KEwiMCIpOw0KKyAgICB3c1NyY051bS5UcmltUmlnaHQoTCIuIik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0dyb3VwU3ltYm9sOw0KKyAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCisgIEZYX0JPT0wgYk5lZyA9IEZBTFNFOw0KKyAgaWYgKHdzU3JjTnVtWzBdID09ICctJykgew0KKyAgICBiTmVnID0gVFJVRTsNCisgICAgd3NTcmNOdW0uRGVsZXRlKDAsIDEpOw0KKyAgfQ0KKyAgRlhfQk9PTCBiQWRkTmVnID0gRkFMU0U7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1NyY051bTsNCisgIGludCBsZW4gPSB3c1NyY051bS5HZXRMZW5ndGgoKTsNCisgIGludCBkb3RfaW5kZXggPSB3c1NyY051bS5GaW5kKCcuJyk7DQorICBpZiAoZG90X2luZGV4ID09IC0xKSB7DQorICAgIGRvdF9pbmRleCA9IGxlbjsNCisgIH0NCisgIGNjZiA9IGRvdF9pbmRleF9mIC0gMTsNCisgIGNjID0gZG90X2luZGV4IC0gMTsNCisgIHdoaWxlIChjY2YgPj0gMCkgew0KKyAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgaWYgKGNjID49IDApIHsNCisgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NPdXRwdXQ7DQorICAgICAgICAgIGNjLS07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJzAnKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICd6JzoNCisgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoc3RyWzBdICE9ICcwJykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnWic6DQorICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKHN0clswXSA9PSAnMCcpIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJyAnKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKEwnICcpICsgd3NPdXRwdXQ7DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1MnOg0KKyAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c1N5bWJvbDsNCisgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzU3ltYm9sKTsNCisgICAgICAgICAgd3NPdXRwdXQgPSB3c01pbnVzU3ltYm9sICsgd3NPdXRwdXQ7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0MoTCcgJykgKyB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAncyc6DQorICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzU3ltYm9sOw0KKyAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXNTeW1ib2wpOw0KKyAgICAgICAgICB3c091dHB1dCA9IHdzTWludXNTeW1ib2wgKyB3c091dHB1dDsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ0UnOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cDsNCisgICAgICAgIHdzRXhwLkZvcm1hdChMIkUlK2QiLCBleHBvbmVudCk7DQorICAgICAgICB3c091dHB1dCA9IHdzRXhwICsgd3NPdXRwdXQ7DQorICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICckJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wsIHdzU3ltYm9sKTsNCisgICAgICAgIHdzT3V0cHV0ID0gd3NTeW1ib2wgKyB3c091dHB1dDsNCisgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ3InOg0KKyAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdjJykgew0KKyAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJDUiIgKyB3c091dHB1dDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdSJzoNCisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnQycpIHsNCisgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IEwiQ1IiICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAgIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ2InOg0KKyAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdkJykgew0KKyAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJkYiIgKyB3c091dHB1dDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdCJzoNCisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IEwiREIiICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAgIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJyUnOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQorICAgICAgICB3c091dHB1dCA9IHdzU3ltYm9sICsgd3NPdXRwdXQ7DQorICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcsJzoNCisgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gd3NHcm91cFN5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcoJzoNCisgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gTCIoIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSBMIiAiICsgd3NPdXRwdXQ7DQorICAgICAgICB9DQorICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnKSc6DQorICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICB3c091dHB1dCA9IEwiKSIgKyB3c091dHB1dDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gTCIgIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdcJyc6DQorICAgICAgICB3c091dHB1dCA9IEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShzdHJmLCBjY2YpICsgd3NPdXRwdXQ7DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhzdHJmW2NjZl0pICsgd3NPdXRwdXQ7DQorICAgICAgICBjY2YtLTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGNjID49IDApIHsNCisgICAgaW50IG5Qb3MgPSBkb3RfaW5kZXggJSAzOw0KKyAgICB3c091dHB1dC5FbXB0eSgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkb3RfaW5kZXg7IGkrKykgew0KKyAgICAgIGlmIChpICUgMyA9PSBuUG9zICYmIGkgIT0gMCkgew0KKyAgICAgICAgd3NPdXRwdXQgKz0gd3NHcm91cFN5bWJvbDsNCisgICAgICB9DQorICAgICAgd3NPdXRwdXQgKz0gd3NTcmNOdW1baV07DQorICAgIH0NCisgICAgaWYgKGRvdF9pbmRleCA8IGxlbikgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c1N5bWJvbCk7DQorICAgICAgd3NPdXRwdXQgKz0gd3NTeW1ib2w7DQorICAgICAgd3NPdXRwdXQgKz0gd3NTcmNOdW0uUmlnaHQobGVuIC0gZG90X2luZGV4IC0gMSk7DQorICAgIH0NCisgICAgaWYgKGJOZWcpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzeW1ib2w7DQorICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzeW1ib2wpOw0KKyAgICAgIHdzT3V0cHV0ID0gd3NNaW51c3ltYm9sICsgd3NPdXRwdXQ7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGRvdF9pbmRleF9mID09IHdzTnVtRm9ybWF0LkdldExlbmd0aCgpKSB7DQorICAgIGlmICghYkFkZE5lZyAmJiBiTmVnKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOw0KKyAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsNCisgICAgICB3c091dHB1dCA9IHdzTWludXN5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEb3RTeW1ib2w7DQorICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NEb3RTeW1ib2wpOw0KKyAgaWYgKHN0cmZbZG90X2luZGV4X2ZdID09ICdWJykgew0KKyAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsNCisgIH0gZWxzZSBpZiAoc3RyZltkb3RfaW5kZXhfZl0gPT0gJy4nKSB7DQorICAgIGlmIChkb3RfaW5kZXggPCBsZW4pIHsNCisgICAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoc3RyZltkb3RfaW5kZXhfZiArIDFdID09ICc5JyB8fCBzdHJmW2RvdF9pbmRleF9mICsgMV0gPT0gJ1onKSB7DQorICAgICAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGNjZiA9IGRvdF9pbmRleF9mICsgMTsNCisgIGNjID0gZG90X2luZGV4ICsgMTsNCisgIHdoaWxlIChjY2YgPCBsZW5mKSB7DQorICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7DQorICAgICAgY2FzZSAnXCcnOg0KKyAgICAgICAgd3NPdXRwdXQgKz0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsNCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnOSc6DQorICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107DQorICAgICAgICAgIGNjKys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCArPSBMJzAnOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICd6JzoNCisgICAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCisgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnWic6DQorICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107DQorICAgICAgICAgIGNjKys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCArPSBMJzAnOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdFJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHA7DQorICAgICAgICB3c0V4cC5Gb3JtYXQoTCJFJStkIiwgZXhwb25lbnQpOw0KKyAgICAgICAgd3NPdXRwdXQgKz0gd3NFeHA7DQorICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICckJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wsIHdzU3ltYm9sKTsNCisgICAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KKyAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnYyc6DQorICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAncicpIHsNCisgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICB3c091dHB1dCArPSBMIkNSIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdDJzoNCisgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdSJykgew0KKyAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiQ1IiOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiICAiOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ2QnOg0KKyAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ2InKSB7DQorICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJkYiI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnRCc6DQorICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnQicpIHsNCisgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICB3c091dHB1dCArPSBMIkRCIjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c091dHB1dCArPSBMIiAgIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICclJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwgd3NTeW1ib2wpOw0KKyAgICAgICAgd3NPdXRwdXQgKz0gd3NTeW1ib2w7DQorICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICc4Jzogew0KKyAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09ICc4Jykgew0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgIH0NCisgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107DQorICAgICAgICAgIGNjKys7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlICcsJzoNCisgICAgICAgIHdzT3V0cHV0ICs9IHdzR3JvdXBTeW1ib2w7DQorICAgICAgICBjY2YrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJygnOg0KKyAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgd3NPdXRwdXQgKz0gJygnOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgKz0gJyAnOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICBjY2YrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJyknOg0KKyAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgd3NPdXRwdXQgKz0gJyknOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgKz0gJyAnOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgY2NmKys7DQorICAgIH0NCisgIH0NCisgIGlmICghYkFkZE5lZyAmJiBiTmVnKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsNCisgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzeW1ib2wpOw0KKyAgICB3c091dHB1dCA9DQorICAgICAgICB3c01pbnVzeW1ib2wgKyB3c091dHB1dFswXSArIHdzT3V0cHV0Lk1pZCgxLCB3c091dHB1dC5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0TENOdW1lcmljKENGWF9MQ051bWVyaWMmIGxjTnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSB7DQorICBpbnQzMl90IGRvdF9pbmRleF9mID0gLTE7DQorICBGWF9EV09SRCBkd051bVN0eWxlID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIHdzTnVtRm9ybWF0Ow0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9DQorICAgICAgR2V0TnVtZXJpY0Zvcm1hdCh3c1BhdHRlcm4sIGRvdF9pbmRleF9mLCBkd051bVN0eWxlLCB3c051bUZvcm1hdCk7DQorICBpZiAoIXBMb2NhbGUgfHwgd3NOdW1Gb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgY2MgPSAwLCBjY2YgPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHN0cmYgPSAoY29uc3QgRlhfV0NIQVIqKXdzTnVtRm9ybWF0Ow0KKyAgaW50IGxlbmYgPSB3c051bUZvcm1hdC5HZXRMZW5ndGgoKTsNCisgIGRvdWJsZSBkYk9yZ1JhdyA9IGxjTnVtLkdldERvdWJsZSgpOw0KKyAgZG91YmxlIGRiUmV0VmFsdWUgPSBkYk9yZ1JhdzsNCisgIGlmIChkd051bVN0eWxlICYgRlhfTlVNU1RZTEVfUGVyY2VudCkgew0KKyAgICBkYlJldFZhbHVlICo9IDEwMDsNCisgIH0NCisgIGludDMyX3QgZXhwb25lbnQgPSAwOw0KKyAgaWYgKGR3TnVtU3R5bGUgJiBGWF9OVU1TVFlMRV9FeHBvbmVudCkgew0KKyAgICBpbnQgZml4ZWRfY291bnQgPSAwOw0KKyAgICB3aGlsZSAoY2NmIDwgZG90X2luZGV4X2YpIHsNCisgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgICAgY2FzZSAnXCcnOg0KKyAgICAgICAgICBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGRvdF9pbmRleF9mKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICc5JzoNCisgICAgICAgIGNhc2UgJ3onOg0KKyAgICAgICAgY2FzZSAnWic6DQorICAgICAgICAgIGZpeGVkX2NvdW50Kys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjY2YrKzsNCisgICAgfQ0KKyAgICBpbnQgdGhyZXNob2xkID0gMTsNCisgICAgd2hpbGUgKGZpeGVkX2NvdW50ID4gMSkgew0KKyAgICAgIHRocmVzaG9sZCAqPSAxMDsNCisgICAgICBmaXhlZF9jb3VudC0tOw0KKyAgICB9DQorICAgIGlmIChkYlJldFZhbHVlICE9IDApIHsNCisgICAgICBpZiAoZGJSZXRWYWx1ZSA8IHRocmVzaG9sZCkgew0KKyAgICAgICAgZGJSZXRWYWx1ZSAqPSAxMDsNCisgICAgICAgIGV4cG9uZW50ID0gLTE7DQorICAgICAgICB3aGlsZSAoZGJSZXRWYWx1ZSA8IHRocmVzaG9sZCkgew0KKyAgICAgICAgICBkYlJldFZhbHVlICo9IDEwOw0KKyAgICAgICAgICBleHBvbmVudCAtPSAxOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoZGJSZXRWYWx1ZSA+IHRocmVzaG9sZCkgew0KKyAgICAgICAgdGhyZXNob2xkICo9IDEwOw0KKyAgICAgICAgd2hpbGUgKGRiUmV0VmFsdWUgPiB0aHJlc2hvbGQpIHsNCisgICAgICAgICAgZGJSZXRWYWx1ZSAvPSAxMDsNCisgICAgICAgICAgZXhwb25lbnQgKz0gMTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChkd051bVN0eWxlICYgKEZYX05VTVNUWUxFX1BlcmNlbnQgfCBGWF9OVU1TVFlMRV9FeHBvbmVudCkpIHsNCisgICAgbGNOdW0gPSBDRlhfTENOdW1lcmljKGRiUmV0VmFsdWUpOw0KKyAgfQ0KKyAgRlhfQk9PTCBiVHJpbVRhaWxaZXJvcyA9IEZBTFNFOw0KKyAgaW50MzJfdCBpVHJlYWRpbmcgPQ0KKyAgICAgIEZYX0dldE51bVRyYWlsaW5nTGltaXQod3NOdW1Gb3JtYXQsIGRvdF9pbmRleF9mLCBiVHJpbVRhaWxaZXJvcyk7DQorICBDRlhfV2lkZVN0cmluZyB3c051bWVyaWMgPSBsY051bS5Ub1N0cmluZyhpVHJlYWRpbmcsIGJUcmltVGFpbFplcm9zKTsNCisgIGlmICh3c051bWVyaWMuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzR3JvdXBTeW1ib2w7DQorICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfR3JvdXBpbmcsIHdzR3JvdXBTeW1ib2wpOw0KKyAgRlhfQk9PTCBiTmVnID0gRkFMU0U7DQorICBpZiAod3NOdW1lcmljWzBdID09ICctJykgew0KKyAgICBiTmVnID0gVFJVRTsNCisgICAgd3NOdW1lcmljLkRlbGV0ZSgwLCAxKTsNCisgIH0NCisgIEZYX0JPT0wgYkFkZE5lZyA9IEZBTFNFOw0KKyAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NOdW1lcmljOw0KKyAgaW50IGxlbiA9IHdzTnVtZXJpYy5HZXRMZW5ndGgoKTsNCisgIGludCBkb3RfaW5kZXggPSB3c051bWVyaWMuRmluZCgnLicpOw0KKyAgaWYgKGRvdF9pbmRleCA9PSAtMSkgew0KKyAgICBkb3RfaW5kZXggPSBsZW47DQorICB9DQorICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7DQorICBjYyA9IGRvdF9pbmRleCAtIDE7DQorICB3aGlsZSAoY2NmID49IDApIHsNCisgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCisgICAgICBjYXNlICc5JzoNCisgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NPdXRwdXQ7DQorICAgICAgICAgIGNjLS07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJzAnKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICd6JzoNCisgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgIGlmIChsY051bS5tX0ludGVncmFsICE9IDApIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgaWYgKGNjID49IDApIHsNCisgICAgICAgICAgaWYgKGxjTnVtLm1fSW50ZWdyYWwgPT0gMCkgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKEwnICcpICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0Moc3RyW2NjXSkgKyB3c091dHB1dDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0MoTCcgJykgKyB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnUyc6DQorICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzU3ltYm9sOw0KKyAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXNTeW1ib2wpOw0KKyAgICAgICAgICB3c091dHB1dCA9IHdzTWludXNTeW1ib2wgKyB3c091dHB1dDsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJyAnKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdzJzoNCisgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXNTeW1ib2w7DQorICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c1N5bWJvbCk7DQorICAgICAgICAgIHdzT3V0cHV0ID0gd3NNaW51c1N5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnRSc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwOw0KKyAgICAgICAgd3NFeHAuRm9ybWF0KEwiRSUrZCIsIGV4cG9uZW50KTsNCisgICAgICAgIHdzT3V0cHV0ID0gd3NFeHAgKyB3c091dHB1dDsNCisgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJyQnOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOw0KKyAgICAgICAgd3NPdXRwdXQgPSB3c1N5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAncic6DQorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2MnKSB7DQorICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSBMIkNSIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1InOg0KKyAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdDJykgew0KKyAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJDUiIgKyB3c091dHB1dDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IEwiICAiICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnYic6DQorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2QnKSB7DQorICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSBMImRiIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ0InOg0KKyAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdEJykgew0KKyAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJEQiIgKyB3c091dHB1dDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IEwiICAiICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnJSc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCisgICAgICAgIHdzT3V0cHV0ID0gd3NTeW1ib2wgKyB3c091dHB1dDsNCisgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJywnOg0KKyAgICAgICAgaWYgKGNjID49IDApIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSB3c0dyb3VwU3ltYm9sICsgd3NPdXRwdXQ7DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJygnOg0KKyAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSBMIigiICsgd3NPdXRwdXQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCA9IEwiICIgKyB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcpJzoNCisgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gTCIpIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSBMIiAiICsgd3NPdXRwdXQ7DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgIHdzT3V0cHV0ID0gRlhfR2V0TGl0ZXJhbFRleHRSZXZlcnNlKHN0cmYsIGNjZikgKyB3c091dHB1dDsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cmZbY2NmXSkgKyB3c091dHB1dDsNCisgICAgICAgIGNjZi0tOw0KKyAgICB9DQorICB9DQorICBpZiAoY2MgPj0gMCkgew0KKyAgICBpbnQgblBvcyA9IGRvdF9pbmRleCAlIDM7DQorICAgIHdzT3V0cHV0LkVtcHR5KCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRvdF9pbmRleDsgaSsrKSB7DQorICAgICAgaWYgKGkgJSAzID09IG5Qb3MgJiYgaSAhPSAwKSB7DQorICAgICAgICB3c091dHB1dCArPSB3c0dyb3VwU3ltYm9sOw0KKyAgICAgIH0NCisgICAgICB3c091dHB1dCArPSB3c051bWVyaWNbaV07DQorICAgIH0NCisgICAgaWYgKGRvdF9pbmRleCA8IGxlbikgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c1N5bWJvbCk7DQorICAgICAgd3NPdXRwdXQgKz0gd3NTeW1ib2w7DQorICAgICAgd3NPdXRwdXQgKz0gd3NOdW1lcmljLlJpZ2h0KGxlbiAtIGRvdF9pbmRleCAtIDEpOw0KKyAgICB9DQorICAgIGlmIChiTmVnKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOw0KKyAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsNCisgICAgICB3c091dHB1dCA9IHdzTWludXN5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChkb3RfaW5kZXhfZiA9PSB3c051bUZvcm1hdC5HZXRMZW5ndGgoKSkgew0KKyAgICBpZiAoIWJBZGROZWcgJiYgYk5lZykgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsNCisgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXN5bWJvbCk7DQorICAgICAgd3NPdXRwdXQgPSB3c01pbnVzeW1ib2wgKyB3c091dHB1dDsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRG90U3ltYm9sOw0KKyAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzRG90U3ltYm9sKTsNCisgIGlmIChzdHJmW2RvdF9pbmRleF9mXSA9PSAnVicpIHsNCisgICAgd3NPdXRwdXQgKz0gd3NEb3RTeW1ib2w7DQorICB9IGVsc2UgaWYgKHN0cmZbZG90X2luZGV4X2ZdID09ICcuJykgew0KKyAgICBpZiAoZG90X2luZGV4IDwgbGVuKSB7DQorICAgICAgd3NPdXRwdXQgKz0gd3NEb3RTeW1ib2w7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKHN0cmZbZG90X2luZGV4X2YgKyAxXSA9PSAnOScgfHwgc3RyZltkb3RfaW5kZXhfZiArIDFdID09ICdaJykgew0KKyAgICAgICAgd3NPdXRwdXQgKz0gd3NEb3RTeW1ib2w7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBjY2YgPSBkb3RfaW5kZXhfZiArIDE7DQorICBjYyA9IGRvdF9pbmRleCArIDE7DQorICB3aGlsZSAoY2NmIDwgbGVuZikgew0KKyAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgIHdzT3V0cHV0ICs9IEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgbGVuZik7DQorICAgICAgICBjY2YrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107DQorICAgICAgICAgIGNjKys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCArPSBMJzAnOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICd6JzoNCisgICAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOw0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdaJzoNCisgICAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOw0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgKz0gTCcwJzsNCisgICAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnRSc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwOw0KKyAgICAgICAgd3NFeHAuRm9ybWF0KEwiRSUrZCIsIGV4cG9uZW50KTsNCisgICAgICAgIHdzT3V0cHV0ICs9IHdzRXhwOw0KKyAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnJCc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQorICAgICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsNCisgICAgICB9DQorICAgICAgICBjY2YrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ2MnOg0KKyAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ3InKSB7DQorICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJDUiI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnQyc6DQorICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnUicpIHsNCisgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICB3c091dHB1dCArPSBMIkNSIjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c091dHB1dCArPSBMIiAgIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdkJzoNCisgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdiJykgew0KKyAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiZGIiOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ0QnOg0KKyAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ0InKSB7DQorICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJEQiI7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCIgICI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnJSc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCisgICAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KKyAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnOCc6IHsNCisgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpIHsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICB9DQorICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOw0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAnLCc6DQorICAgICAgICB3c091dHB1dCArPSB3c0dyb3VwU3ltYm9sOw0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcoJzoNCisgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgIHdzT3V0cHV0ICs9ICcoJzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ICs9ICcgJzsNCisgICAgICAgIH0NCisgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcpJzoNCisgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgIHdzT3V0cHV0ICs9ICcpJzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ICs9ICcgJzsNCisgICAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGNjZisrOw0KKyAgICB9DQorICB9DQorICBpZiAoIWJBZGROZWcgJiYgYk5lZykgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzeW1ib2w7DQorICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsNCisgICAgd3NPdXRwdXQgPQ0KKyAgICAgICAgd3NPdXRwdXRbMF0gKyB3c01pbnVzeW1ib2wgKyB3c091dHB1dC5NaWQoMSwgd3NPdXRwdXQuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdE51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsNCisgIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gRm9ybWF0U3RyTnVtKHdzU3JjTnVtLCB3c1BhdHRlcm4sIHdzT3V0cHV0KTsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXROdW0oRlhfRkxPQVQgZk51bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX0xDTnVtZXJpYyBsY051bShmTnVtKTsNCisgIHJldHVybiBGb3JtYXRMQ051bWVyaWMobGNOdW0sIHdzUGF0dGVybiwgd3NPdXRwdXQpOw0KK30NCitGWF9CT09MIEZYX0RhdGVGcm9tQ2Fub25pY2FsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfVW5pdGltZSYgZGF0ZXRpbWUpIHsNCisgIGludDMyX3QgeWVhciA9IDE5MDA7DQorICBpbnQzMl90IG1vbnRoID0gMTsNCisgIGludDMyX3QgZGF5ID0gMTsNCisgIEZYX1dPUkQgd1llYXIgPSAwOw0KKyAgaW50IGNjX3N0YXJ0ID0gMCwgY2MgPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NEYXRlOw0KKyAgaW50IGxlbiA9IHdzRGF0ZS5HZXRMZW5ndGgoKTsNCisgIGlmIChsZW4gPiAxMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCA0KSB7DQorICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3WWVhciA9IHdZZWFyICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICB9DQorICB5ZWFyID0gd1llYXI7DQorICBpZiAoY2MgPCA0IHx8IHdZZWFyIDwgMTkwMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoY2MgPCBsZW4pIHsNCisgICAgaWYgKHN0cltjY10gPT0gJy0nKSB7DQorICAgICAgY2MrKzsNCisgICAgfQ0KKyAgICBjY19zdGFydCA9IGNjOw0KKyAgICB1aW50OF90IHRtcE0gPSAwOw0KKyAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCBjY19zdGFydCArIDIpIHsNCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgdG1wTSA9IHRtcE0gKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgfQ0KKyAgICBtb250aCA9IHRtcE07DQorICAgIGlmIChjYyA9PSBjY19zdGFydCArIDEgfHwgdG1wTSA+IDEyIHx8IHRtcE0gPCAxKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQogICAgIGlmIChjYyA8IGxlbikgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9Vbml0aW1lIHV0Ow0KLSAgICB1dC5TZXQoeWVhciwgbW9udGgsIGRheSk7DQotICAgIGRhdGV0aW1lID0gZGF0ZXRpbWUgKyB1dDsNCi0gICAgcmV0dXJuIGNjOw0KLX0NCi1zdGF0aWMgdm9pZCBGWF9SZXNvbHZlWm9uZSh1aW50OF90JiB3SG91ciwgdWludDhfdCYgd01pbnV0ZSwgRlhfVElNRVpPTkUgdHpEaWZmLCBJRlhfTG9jYWxlKiBwTG9jYWxlKQ0KLXsNCi0gICAgaW50MzJfdCBpTWludXRlRGlmZiA9IHdIb3VyICogNjAgKyB3TWludXRlOw0KLSAgICBGWF9USU1FWk9ORSB0ekxvY2FsZTsNCi0gICAgcExvY2FsZS0+R2V0VGltZVpvbmUodHpMb2NhbGUpOw0KLSAgICBpTWludXRlRGlmZiArPSB0ekxvY2FsZS50ekhvdXIgKiA2MCArICh0ekxvY2FsZS50ekhvdXIgPCAwID8gLXR6TG9jYWxlLnR6TWludXRlIDogdHpMb2NhbGUudHpNaW51dGUpOw0KLSAgICBpTWludXRlRGlmZiAtPSB0ekRpZmYudHpIb3VyICogNjAgKyAodHpEaWZmLnR6SG91ciA8IDAgPyAtdHpEaWZmLnR6TWludXRlIDogdHpEaWZmLnR6TWludXRlKTsNCi0gICAgd2hpbGUgKGlNaW51dGVEaWZmID4gMTQ0MCkgew0KLSAgICAgICAgaU1pbnV0ZURpZmYgLT0gMTQ0MDsNCi0gICAgfQ0KLSAgICB3aGlsZSAoaU1pbnV0ZURpZmYgPCAwKSB7DQotICAgICAgICBpTWludXRlRGlmZiArPSAxNDQwOw0KLSAgICB9DQotICAgIHdIb3VyID0gaU1pbnV0ZURpZmYgLyA2MDsNCi0gICAgd01pbnV0ZSA9IGlNaW51dGVEaWZmICUgNjA7DQotfQ0KLXN0YXRpYyBGWF9CT09MIEZYX1BhcnNlTG9jYWxlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lUGF0dGVybiwgSUZYX0xvY2FsZSogcExvY2FsZSwgQ0ZYX1VuaXRpbWUgJmRhdGV0aW1lLCBpbnQzMl90ICZjYykNCi17DQotICAgIHVpbnQ4X3QgaG91ciA9IDA7DQotICAgIHVpbnQ4X3QgbWludXRlID0gMDsNCi0gICAgdWludDhfdCBzZWNvbmQgPSAwOw0KLSAgICBGWF9XT1JEIG1pbGxpc2Vjb25kID0gMDsNCi0gICAgaW50MzJfdCBjY2YgPSAwOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1RpbWU7DQotICAgIGludCBsZW4gPSB3c1RpbWUuR2V0TGVuZ3RoKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c1RpbWVQYXR0ZXJuOw0KLSAgICBpbnQgbGVuZiA9IHdzVGltZVBhdHRlcm4uR2V0TGVuZ3RoKCk7DQotICAgIEZYX0JPT0wgYkhhc0EgPSBGQUxTRTsNCi0gICAgRlhfQk9PTCBiUE0gPSBGQUxTRTsNCi0gICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjZiA8IGxlbmYpIHsNCi0gICAgICAgIGlmIChzdHJmW2NjZl0gPT0gJ1wnJykgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgbGVuZik7DQotICAgICAgICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICBpZiAoY2MgKyBpTGl0ZXJhbExlbiA+IGxlbiB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTGl0ZXJhbCwgaUxpdGVyYWxMZW4pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2MgKz0gaUxpdGVyYWxMZW47DQotICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9IGVsc2UgaWYgKEZYX0xvY2FsX0ZpbmQoZ3Nfd3NUaW1lU3ltYm9scywgc3RyZltjY2ZdKSA9PSAtMSkgew0KLSAgICAgICAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBGWF9EV09SRCBkd1N5bWJvbE51bSA9IDE7DQotICAgICAgICBGWF9EV09SRCBkd1N5bWJvbCA9IHN0cmZbY2NmKytdOw0KLSAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09IGR3U3ltYm9sKSB7DQotICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgZHdTeW1ib2xOdW0rKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGR3U3ltYm9sID0gKGR3U3ltYm9sIDw8IDgpIHwgKGR3U3ltYm9sTnVtICsgJzAnKTsNCi0gICAgICAgIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2snLCAnMScpIHx8IGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcxJykgfHwgZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdoJywgJzEnKSB8fCBkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0snLCAnMScpKSB7DQotICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaG91ciA9IHN0cltjYysrXSAtICcwJzsNCi0gICAgICAgICAgICBpZiAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICBob3VyID0gaG91ciAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdLJywgJzEnKSAmJiBob3VyID09IDI0KSB7DQotICAgICAgICAgICAgICAgIGhvdXIgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdrJywgJzInKSB8fCBkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0gnLCAnMicpIHx8IGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICcyJykgfHwgZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdLJywgJzInKSkgew0KLSAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGhvdXIgPSBzdHJbY2MrK10gLSAnMCc7DQotICAgICAgICAgICAgaWYgKGNjID49IGxlbikgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGhvdXIgPSBob3VyICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQotICAgICAgICAgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcyJykgJiYgaG91ciA9PSAyNCkgew0KLSAgICAgICAgICAgICAgICBob3VyID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsNCi0gICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtaW51dGUgPSBzdHJbY2MrK10gLSAnMCc7DQotICAgICAgICAgICAgaWYgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgbWludXRlID0gbWludXRlICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMicpKSB7DQotICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbWludXRlID0gc3RyW2NjKytdIC0gJzAnOw0KLSAgICAgICAgICAgIGlmIChjYyA+PSBsZW4pIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtaW51dGUgPSBtaW51dGUgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdTJywgJzEnKSkgew0KLSAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHNlY29uZCA9IHN0cltjYysrXSAtICcwJzsNCi0gICAgICAgICAgICBpZiAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICBzZWNvbmQgPSBzZWNvbmQgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnUycsICcyJykpIHsNCi0gICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzZWNvbmQgPSBzdHJbY2MrK10gLSAnMCc7DQotICAgICAgICAgICAgaWYgKGNjID49IGxlbikgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHNlY29uZCA9IHNlY29uZCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0YnLCAnMycpKSB7DQotICAgICAgICAgICAgaWYgKGNjICsgMyA+PSBsZW4pIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpbnQgaSA9IDA7DQotICAgICAgICAgICAgd2hpbGUgKGkgPCAzKSB7DQotICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCi0gICAgICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdBJywgJzEnKSkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQU07DQotICAgICAgICAgICAgcExvY2FsZS0+R2V0TWVyaWRpZW1OYW1lKHdzQU0sIFRSVUUpOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUE07DQotICAgICAgICAgICAgcExvY2FsZS0+R2V0TWVyaWRpZW1OYW1lKHdzUE0sIEZBTFNFKTsNCi0gICAgICAgICAgICBpZiAoKGNjICsgd3NBTS5HZXRMZW5ndGgoKSA8PSBsZW4pICYmIChDRlhfV2lkZVN0cmluZ0Moc3RyICsgY2MsIHdzQU0uR2V0TGVuZ3RoKCkpID09IHdzQU0pKSB7DQotICAgICAgICAgICAgICAgIGNjICs9IHdzQU0uR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIGJIYXNBID0gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKChjYyArIHdzUE0uR2V0TGVuZ3RoKCkgPD0gbGVuKSAmJiAoQ0ZYX1dpZGVTdHJpbmdDKHN0ciArIGNjLCB3c1BNLkdldExlbmd0aCgpKSA9PSB3c1BNKSkgew0KLSAgICAgICAgICAgICAgICBjYyArPSB3c1BNLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICBiSGFzQSA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGJQTSA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1onLCAnMScpKSB7DQotICAgICAgICAgICAgaWYgKGNjICsgMyA+IGxlbikgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhfRFdPUkQgZHdIYXNoID0gc3RyW2NjKytdOw0KLSAgICAgICAgICAgIGR3SGFzaCA9IChkd0hhc2ggPDwgOCkgfCBzdHJbY2MrK107DQotICAgICAgICAgICAgZHdIYXNoID0gKGR3SGFzaCA8PCA4KSB8IHN0cltjYysrXTsNCi0gICAgICAgICAgICBpZiAoZHdIYXNoID09IEZYQlNUUl9JRCgwLCAnRycsICdNJywgJ1QnKSkgew0KLSAgICAgICAgICAgICAgICBGWF9USU1FWk9ORSB0ekRpZmY7DQotICAgICAgICAgICAgICAgIHR6RGlmZi50ekhvdXIgPSAwOw0KLSAgICAgICAgICAgICAgICB0ekRpZmYudHpNaW51dGUgPSAwOw0KLSAgICAgICAgICAgICAgICBpZiAoY2MgPCBsZW4gJiYgKHN0cltjY10gPT0gJy0nIHx8IHN0cltjY10gPT0gJysnKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2MgKz0gRlhfUGFyc2VUaW1lWm9uZShzdHIgKyBjYywgbGVuIC0gY2MsIHR6RGlmZik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhfUmVzb2x2ZVpvbmUoaG91ciwgbWludXRlLCB0ekRpZmYsIHBMb2NhbGUpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIEZYX0xQQ0xPQ0FMRVRJTUVaT05FSU5GTyBwVGltZVpvbmVJbmZvID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gZ19pRlhMb2NhbGVUaW1lWm9uZUNvdW50IC0gMTsNCi0gICAgICAgICAgICAgICAgZG8gew0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0xQQ0xPQ0FMRVRJTUVaT05FSU5GTyBwSW5mbyA9IGdfRlhMb2NhbGVUaW1lWm9uZURhdGEgKyBpTWlkOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGR3SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGltZVpvbmVJbmZvID0gcEluZm87DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA8IHBJbmZvLT51SGFzaCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBUaW1lWm9uZUluZm8pIHsNCi0gICAgICAgICAgICAgICAgICAgIGhvdXIgKz0gcFRpbWVab25lSW5mby0+aUhvdXI7DQotICAgICAgICAgICAgICAgICAgICBtaW51dGUgKz0gcFRpbWVab25lSW5mby0+aUhvdXIgPiAwID8gcFRpbWVab25lSW5mby0+aU1pbnV0ZSA6IC1wVGltZVpvbmVJbmZvLT5pTWludXRlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ3onLCAnMScpKSB7DQotICAgICAgICAgICAgaWYgKHN0cltjY10gIT0gJ1onKSB7DQotICAgICAgICAgICAgICAgIEZYX1RJTUVaT05FIHR6RGlmZjsNCi0gICAgICAgICAgICAgICAgY2MgKz0gRlhfUGFyc2VUaW1lWm9uZShzdHIgKyBjYywgbGVuIC0gY2MsIHR6RGlmZik7DQotICAgICAgICAgICAgICAgIEZYX1Jlc29sdmVab25lKGhvdXIsIG1pbnV0ZSwgdHpEaWZmLCBwTG9jYWxlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoYkhhc0EpIHsNCi0gICAgICAgIGlmIChiUE0pIHsNCi0gICAgICAgICAgICBob3VyICs9IDEyOw0KLSAgICAgICAgICAgIGlmIChob3VyID09IDI0KSB7DQotICAgICAgICAgICAgICAgIGhvdXIgPSAxMjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChob3VyID09IDEyKSB7DQotICAgICAgICAgICAgICAgIGhvdXIgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBDRlhfVW5pdGltZSB1dDsNCi0gICAgdXQuU2V0KDAsIDAsIDAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCk7DQotICAgIGRhdGV0aW1lID0gZGF0ZXRpbWUgKyB1dDsNCi0gICAgcmV0dXJuIGNjOw0KLX0NCi1GWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlRGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlLCBDRlhfVW5pdGltZSYgZHRWYWx1ZSkNCi17DQotICAgIGR0VmFsdWUuU2V0KDApOw0KLSAgICBpZiAod3NTcmNEYXRlVGltZS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm47DQotICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KLSAgICBGWF9EQVRFVElNRVRZUEUgZUNhdGVnb3J5ID0gR2V0RGF0ZVRpbWVGb3JtYXQod3NQYXR0ZXJuLCBwTG9jYWxlLCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuKTsNCi0gICAgaWYgKCFwTG9jYWxlKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVW5rbm93bikgew0KLSAgICAgICAgZUNhdGVnb3J5ID0gZURhdGVUaW1lVHlwZTsNCi0gICAgfQ0KLSAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVGltZURhdGUpIHsNCi0gICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMDsNCi0gICAgICAgIGlmICghRlhfUGFyc2VMb2NhbGVUaW1lKHdzU3JjRGF0ZVRpbWUsIHdzVGltZVBhdHRlcm4sIHBMb2NhbGUsIGR0VmFsdWUsIGlTdGFydCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIUZYX1BhcnNlTG9jYWxlRGF0ZSh3c1NyY0RhdGVUaW1lLCB3c0RhdGVQYXR0ZXJuLCBwTG9jYWxlLCBkdFZhbHVlLCBpU3RhcnQpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwOw0KLSAgICAgICAgaWYgKChlQ2F0ZWdvcnkgJiBGWF9EQVRFVElNRVRZUEVfRGF0ZSkgJiYgIUZYX1BhcnNlTG9jYWxlRGF0ZSh3c1NyY0RhdGVUaW1lLCB3c0RhdGVQYXR0ZXJuLCBwTG9jYWxlLCBkdFZhbHVlLCBpU3RhcnQpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKChlQ2F0ZWdvcnkgJiBGWF9EQVRFVElNRVRZUEVfVGltZSkgJiYgIUZYX1BhcnNlTG9jYWxlVGltZSh3c1NyY0RhdGVUaW1lLCB3c1RpbWVQYXR0ZXJuLCBwTG9jYWxlLCBkdFZhbHVlLCBpU3RhcnQpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlWmVybyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNUZXh0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0Ow0KLSAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEZYX1dTVFJDKEwiemVybyIpLCB3c1RleHRGb3JtYXQpOw0KLSAgICBpbnQzMl90IGlUZXh0ID0gMCwgaVBhdHRlcm4gPSAwOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0clRleHQgPSAoY29uc3QgRlhfV0NIQVIqKXdzU3JjVGV4dDsNCi0gICAgaW50MzJfdCBpTGVuVGV4dCA9IHdzU3JjVGV4dC5HZXRMZW5ndGgoKTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBTdHJQYXR0ZXJuID0gKGNvbnN0IEZYX1dDSEFSKil3c1RleHRGb3JtYXQ7DQotICAgIGludDMyX3QgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7DQotICAgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuICYmIGlUZXh0IDwgaUxlblRleHQpIHsNCi0gICAgICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCBpUGF0dGVybiwgaUxlblBhdHRlcm4pOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgaWYgKGlUZXh0ICsgaUxpdGVyYWxMZW4gPiBpTGVuVGV4dCB8fCBGWFNZU193Y3NuY21wKHBTdHJUZXh0ICsgaVRleHQsIChjb25zdCBGWF9XQ0hBUiopd3NMaXRlcmFsLCBpTGl0ZXJhbExlbikpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpVGV4dCArPSBpTGl0ZXJhbExlbjsNCi0gICAgICAgICAgICBpUGF0dGVybisrOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfSBlbHNlIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gIT0gcFN0clRleHRbaVRleHRdKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpVGV4dCsrOw0KLSAgICAgICAgICAgIGlQYXR0ZXJuKys7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGlQYXR0ZXJuID09IGlMZW5QYXR0ZXJuICYmIGlUZXh0ID09IGlMZW5UZXh0Ow0KLX0NCi1GWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlTnVsbChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNUZXh0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0Ow0KLSAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEZYX1dTVFJDKEwibnVsbCIpLCB3c1RleHRGb3JtYXQpOw0KLSAgICBpbnQzMl90IGlUZXh0ID0gMCwgaVBhdHRlcm4gPSAwOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0clRleHQgPSAoY29uc3QgRlhfV0NIQVIqKXdzU3JjVGV4dDsNCi0gICAgaW50MzJfdCBpTGVuVGV4dCA9IHdzU3JjVGV4dC5HZXRMZW5ndGgoKTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBTdHJQYXR0ZXJuID0gKGNvbnN0IEZYX1dDSEFSKil3c1RleHRGb3JtYXQ7DQotICAgIGludDMyX3QgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7DQotICAgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuICYmIGlUZXh0IDwgaUxlblRleHQpIHsNCi0gICAgICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCBpUGF0dGVybiwgaUxlblBhdHRlcm4pOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgaWYgKGlUZXh0ICsgaUxpdGVyYWxMZW4gPiBpTGVuVGV4dCB8fCBGWFNZU193Y3NuY21wKHBTdHJUZXh0ICsgaVRleHQsIChjb25zdCBGWF9XQ0hBUiopd3NMaXRlcmFsLCBpTGl0ZXJhbExlbikpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpVGV4dCArPSBpTGl0ZXJhbExlbjsNCi0gICAgICAgICAgICBpUGF0dGVybisrOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfSBlbHNlIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gIT0gcFN0clRleHRbaVRleHRdKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpVGV4dCsrOw0KLSAgICAgICAgICAgIGlQYXR0ZXJuKys7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGlQYXR0ZXJuID09IGlMZW5QYXR0ZXJuICYmIGlUZXh0ID09IGlMZW5UZXh0Ow0KLX0NCi1GWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KQ0KLXsNCi0gICAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlMZW5UZXh0ID0gd3NTcmNUZXh0LkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlblRleHQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dEZvcm1hdDsNCi0gICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBGWF9XU1RSQyhMInRleHQiKSwgd3NUZXh0Rm9ybWF0KTsNCi0gICAgaW50MzJfdCBpVGV4dCA9IDAsIGlQYXR0ZXJuID0gMDsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBTdHJUZXh0ID0gKGNvbnN0IEZYX1dDSEFSKil3c1NyY1RleHQ7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RyUGF0dGVybiA9IChjb25zdCBGWF9XQ0hBUiopd3NUZXh0Rm9ybWF0Ow0KLSAgICBpbnQzMl90IGlMZW5QYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LkdldExlbmd0aCgpOw0KLSAgICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybikgew0KLSAgICAgICAgc3dpdGNoIChwU3RyUGF0dGVybltpUGF0dGVybl0pIHsNCi0gICAgICAgICAgICBjYXNlICdcJyc6IHsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IEZYX0dldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCBpUGF0dGVybiwgaUxlblBhdHRlcm4pOw0KLSAgICAgICAgICAgICAgICAgICAgaVBhdHRlcm4rKzsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSAnQSc6DQotICAgICAgICAgICAgICAgIGlmIChpVGV4dCA+PSBpTGVuVGV4dCB8fCAhRlhfSXNBbHBoYShwU3RyVGV4dFtpVGV4dF0pKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gcFN0clRleHRbaVRleHQrK107DQotICAgICAgICAgICAgICAgIGlQYXR0ZXJuKys7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ1gnOg0KLSAgICAgICAgICAgICAgICBpZiAoaVRleHQgPj0gaUxlblRleHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB3c091dHB1dCArPSBwU3RyVGV4dFtpVGV4dCsrXTsNCi0gICAgICAgICAgICAgICAgaVBhdHRlcm4rKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnTyc6DQotICAgICAgICAgICAgY2FzZSAnMCc6DQotICAgICAgICAgICAgICAgIGlmIChpVGV4dCA+PSBpTGVuVGV4dCB8fCAoIUZYX0lzRGlnaXQocFN0clRleHRbaVRleHRdKSAmJiAhRlhfSXNBbHBoYShwU3RyVGV4dFtpVGV4dF0pKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHBTdHJUZXh0W2lUZXh0KytdOw0KLSAgICAgICAgICAgICAgICBpUGF0dGVybisrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICc5JzoNCi0gICAgICAgICAgICAgICAgaWYgKGlUZXh0ID49IGlMZW5UZXh0IHx8ICFGWF9Jc0RpZ2l0KHBTdHJUZXh0W2lUZXh0XSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB3c091dHB1dCArPSBwU3RyVGV4dFtpVGV4dCsrXTsNCi0gICAgICAgICAgICAgICAgaVBhdHRlcm4rKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gcFN0clBhdHRlcm5baVBhdHRlcm4rK107DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBpVGV4dCA9PSBpTGVuVGV4dDsNCi19DQotc3RhdGljIGludDMyX3QgRlhfR2V0TnVtVHJhaWxpbmdMaW1pdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsIGludCBpRG90UG9zLCBGWF9CT09MICZiVHJpbVRhaWxaZXJvcykNCi17DQotICAgIGlmIChpRG90UG9zIDwgMCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaW50MzJfdCBpQ291bnQgPSB3c0Zvcm1hdC5HZXRMZW5ndGgoKTsNCi0gICAgaW50MzJfdCBpVHJlYWRpbmcgPSAwOw0KLSAgICBmb3IgKGlEb3RQb3MgKys7IGlEb3RQb3MgPCBpQ291bnQ7IGlEb3RQb3MgKyspIHsNCi0gICAgICAgIEZYX1dDSEFSIHdjID0gd3NGb3JtYXRbaURvdFBvc107DQotICAgICAgICBpZiAod2MgPT0gTCd6JyB8fCB3YyA9PSBMJzknIHx8IHdjID09ICdaJykgew0KLSAgICAgICAgICAgIGlUcmVhZGluZyArKzsNCi0gICAgICAgICAgICBiVHJpbVRhaWxaZXJvcyA9ICh3YyA9PSBMJzknID8gRkFMU0UgOiBUUlVFKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaVRyZWFkaW5nOw0KLX0NCi1GWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdFN0ck51bShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSW5wdXROdW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCi17DQotICAgIGlmICh3c0lucHV0TnVtLklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaW50MzJfdCBkb3RfaW5kZXhfZiA9IC0xOw0KLSAgICBGWF9EV09SRCBkd051bVN0eWxlID0gMDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1Gb3JtYXQ7DQotICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXROdW1lcmljRm9ybWF0KHdzUGF0dGVybiwgZG90X2luZGV4X2YsIGR3TnVtU3R5bGUsIHdzTnVtRm9ybWF0KTsNCi0gICAgaWYgKCFwTG9jYWxlIHx8IHdzTnVtRm9ybWF0LklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGludDMyX3QgY2MgPSAwLCBjY2YgPSAwOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogc3RyZiA9IChjb25zdCBGWF9XQ0hBUiopd3NOdW1Gb3JtYXQ7DQotICAgIGludCBsZW5mID0gd3NOdW1Gb3JtYXQuR2V0TGVuZ3RoKCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzU3JjTnVtID0gd3NJbnB1dE51bTsNCi0gICAgd3NTcmNOdW0uVHJpbUxlZnQoJzAnKTsNCi0gICAgaWYgKHdzU3JjTnVtLklzRW1wdHkoKSB8fCB3c1NyY051bVswXSA9PSAnLicpIHsNCi0gICAgICAgIHdzU3JjTnVtLkluc2VydCgwLCAnMCcpOw0KLSAgICB9DQotICAgIENGWF9EZWNpbWFsIGRlY2ltYWwgPSBDRlhfRGVjaW1hbCh3c1NyY051bSk7DQotICAgIGlmIChkd051bVN0eWxlICYgRlhfTlVNU1RZTEVfUGVyY2VudCkgew0KLSAgICAgICAgZGVjaW1hbCA9IGRlY2ltYWwgKiBDRlhfRGVjaW1hbCgxMDApOw0KLSAgICAgICAgd3NTcmNOdW0gPSBkZWNpbWFsOw0KLSAgICB9DQotICAgIGludDMyX3QgZXhwb25lbnQgPSAwOw0KLSAgICBpZiAoZHdOdW1TdHlsZSAmIEZYX05VTVNUWUxFX0V4cG9uZW50KSB7DQotICAgICAgICBpbnQgZml4ZWRfY291bnQgPSAwOw0KLSAgICAgICAgd2hpbGUgKGNjZiA8IGRvdF9pbmRleF9mKSB7DQotICAgICAgICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAnXCcnOg0KLSAgICAgICAgICAgICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBkb3RfaW5kZXhfZik7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnOSc6DQotICAgICAgICAgICAgICAgIGNhc2UgJ3onOg0KLSAgICAgICAgICAgICAgICBjYXNlICdaJzoNCi0gICAgICAgICAgICAgICAgICAgIGZpeGVkX2NvdW50Kys7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2NmKys7DQotICAgICAgICB9DQotICAgICAgICBpbnQgdGhyZXNob2xkID0gMTsNCi0gICAgICAgIHdoaWxlIChmaXhlZF9jb3VudCA+IDEpIHsNCi0gICAgICAgICAgICB0aHJlc2hvbGQgKj0gMTA7DQotICAgICAgICAgICAgZml4ZWRfY291bnQtLTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChkZWNpbWFsICE9IENGWF9EZWNpbWFsKDApKSB7DQotICAgICAgICAgICAgaWYgKGRlY2ltYWwgPCBDRlhfRGVjaW1hbCh0aHJlc2hvbGQpKSB7DQotICAgICAgICAgICAgICAgIGRlY2ltYWwgPSBkZWNpbWFsICogQ0ZYX0RlY2ltYWwoMTApOw0KLSAgICAgICAgICAgICAgICBleHBvbmVudCA9IC0xOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAoZGVjaW1hbCA8IENGWF9EZWNpbWFsKHRocmVzaG9sZCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgPSBkZWNpbWFsICogQ0ZYX0RlY2ltYWwoMTApOw0KLSAgICAgICAgICAgICAgICAgICAgZXhwb25lbnQgLT0gMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVjaW1hbCA+IENGWF9EZWNpbWFsKHRocmVzaG9sZCkpIHsNCi0gICAgICAgICAgICAgICAgdGhyZXNob2xkICo9IDEwOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAoZGVjaW1hbCA+IENGWF9EZWNpbWFsKHRocmVzaG9sZCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgPSBkZWNpbWFsIC8gQ0ZYX0RlY2ltYWwoMTApOw0KLSAgICAgICAgICAgICAgICAgICAgZXhwb25lbnQgKz0gMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWF9CT09MIGJUcmltVGFpbFplcm9zID0gRkFMU0U7DQotICAgIGludDMyX3QgaVRyZWFkaW5nID0gRlhfR2V0TnVtVHJhaWxpbmdMaW1pdCh3c051bUZvcm1hdCwgZG90X2luZGV4X2YsIGJUcmltVGFpbFplcm9zKTsNCi0gICAgaW50MzJfdCBzY2FsZSA9IGRlY2ltYWwuR2V0U2NhbGUoKTsNCi0gICAgaWYgKGlUcmVhZGluZyA8IHNjYWxlKSB7DQotICAgICAgICBkZWNpbWFsLlNldFNjYWxlKGlUcmVhZGluZyk7DQotICAgICAgICB3c1NyY051bSA9IGRlY2ltYWw7DQotICAgIH0NCi0gICAgaWYgKGJUcmltVGFpbFplcm9zICYmIHNjYWxlID4gMCAmJiBpVHJlYWRpbmcgPiAwKSB7DQotICAgICAgICB3c1NyY051bS5UcmltUmlnaHQoTCIwIik7DQotICAgICAgICB3c1NyY051bS5UcmltUmlnaHQoTCIuIik7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCi0gICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCi0gICAgRlhfQk9PTCBiTmVnID0gRkFMU0U7DQotICAgIGlmICh3c1NyY051bVswXSA9PSAnLScpIHsNCi0gICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgd3NTcmNOdW0uRGVsZXRlKDAsIDEpOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYkFkZE5lZyA9IEZBTFNFOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1NyY051bTsNCi0gICAgaW50IGxlbiA9IHdzU3JjTnVtLkdldExlbmd0aCgpOw0KLSAgICBpbnQgZG90X2luZGV4ID0gd3NTcmNOdW0uRmluZCgnLicpOw0KLSAgICBpZiAoZG90X2luZGV4ID09IC0xKSB7DQotICAgICAgICBkb3RfaW5kZXggPSBsZW47DQotICAgIH0NCi0gICAgY2NmID0gZG90X2luZGV4X2YgLSAxOw0KLSAgICBjYyA9IGRvdF9pbmRleCAtIDE7DQotICAgIHdoaWxlIChjY2YgPj0gMCkgew0KLSAgICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCi0gICAgICAgICAgICBjYXNlICc5JzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjID49IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0MoTCcwJykgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAneic6DQotICAgICAgICAgICAgICAgIGlmIChjYyA+PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyWzBdICE9ICcwJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYy0tOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdaJzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjID49IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbMF0gPT0gJzAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0MoTCcgJykgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0Moc3RyW2NjXSkgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJyAnKSArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdTJzoNCi0gICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXNTeW1ib2w7DQotICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXNTeW1ib2wpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSB3c01pbnVzU3ltYm9sICsgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKEwnICcpICsgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ3MnOg0KLSAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c1N5bWJvbDsNCi0gICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c1N5bWJvbCk7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IHdzTWludXNTeW1ib2wgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdFJzogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHA7DQotICAgICAgICAgICAgICAgICAgICB3c0V4cC5Gb3JtYXQoTCJFJStkIiwgZXhwb25lbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSB3c0V4cCArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICckJzogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQotICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wsIHdzU3ltYm9sKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NTeW1ib2wgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAncic6DQotICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnYycpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMIkNSIiArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQotICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdSJzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdDJykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiQ1IiICsgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIgICIgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZiAtPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnYic6DQotICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnZCcpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMImRiIiArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQotICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdCJzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdEJykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiREIiICsgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIgICIgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZiAtPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnJSc6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KLSAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NTeW1ib2wgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnLCc6DQotICAgICAgICAgICAgICAgIGlmIChjYyA+PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IHdzR3JvdXBTeW1ib2wgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnKCc6DQotICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiKCIgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIgIiArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnKSc6DQotICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiKSIgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIgIiArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdcJyc6DQotICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gRlhfR2V0TGl0ZXJhbFRleHRSZXZlcnNlKHN0cmYsIGNjZikgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cmZbY2NmXSkgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGNjID49IDApIHsNCi0gICAgICAgIGludCBuUG9zID0gZG90X2luZGV4ICUgMzsNCi0gICAgICAgIHdzT3V0cHV0LkVtcHR5KCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkb3RfaW5kZXg7IGkrKykgew0KLSAgICAgICAgICAgIGlmIChpICUgMyA9PSBuUG9zICYmIGkgIT0gMCkgew0KLSAgICAgICAgICAgICAgICB3c091dHB1dCArPSB3c0dyb3VwU3ltYm9sOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c091dHB1dCArPSB3c1NyY051bVtpXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChkb3RfaW5kZXggPCBsZW4pIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCi0gICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NTeW1ib2wpOw0KLSAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KLSAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzU3JjTnVtLlJpZ2h0KGxlbiAtIGRvdF9pbmRleCAtIDEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJOZWcpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzeW1ib2w7DQotICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzeW1ib2wpOw0KLSAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NNaW51c3ltYm9sICsgd3NPdXRwdXQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKGRvdF9pbmRleF9mID09IHdzTnVtRm9ybWF0LkdldExlbmd0aCgpKSB7DQotICAgICAgICBpZiAoIWJBZGROZWcgJiYgYk5lZykgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsNCi0gICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXN5bWJvbCk7DQotICAgICAgICAgICAgd3NPdXRwdXQgPSB3c01pbnVzeW1ib2wgKyB3c091dHB1dDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRG90U3ltYm9sOw0KLSAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NEb3RTeW1ib2wpOw0KLSAgICBpZiAoc3RyZltkb3RfaW5kZXhfZl0gPT0gJ1YnKSB7DQotICAgICAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsNCi0gICAgfSBlbHNlIGlmIChzdHJmW2RvdF9pbmRleF9mXSA9PSAnLicpIHsNCi0gICAgICAgIGlmIChkb3RfaW5kZXggPCBsZW4pIHsNCi0gICAgICAgICAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKHN0cmZbZG90X2luZGV4X2YgKyAxXSA9PSAnOScgfHwgc3RyZltkb3RfaW5kZXhfZiArIDFdID09ICdaJykgew0KLSAgICAgICAgICAgICAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgY2NmID0gZG90X2luZGV4X2YgKyAxOw0KLSAgICBjYyA9IGRvdF9pbmRleCArIDE7DQotICAgIHdoaWxlIChjY2YgPCBsZW5mKSB7DQotICAgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KLSAgICAgICAgICAgIGNhc2UgJ1wnJzoNCi0gICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsNCi0gICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJzknOg0KLSAgICAgICAgICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107DQotICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCcwJzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAneic6DQotICAgICAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCi0gICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ1onOg0KLSAgICAgICAgICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107DQotICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCcwJzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnRSc6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwOw0KLSAgICAgICAgICAgICAgICAgICAgd3NFeHAuRm9ybWF0KEwiRSUrZCIsIGV4cG9uZW50KTsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzRXhwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICckJzogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQotICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wsIHdzU3ltYm9sKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdjJzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ3InKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiQ1IiOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmICs9IDI7DQotICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdDJzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ1InKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiQ1IiOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMIiAgIjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnZCc6DQotICAgICAgICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdiJykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMImRiIjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnRCc6DQotICAgICAgICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdCJykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMIkRCIjsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCIgICI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjY2YgKz0gMjsNCi0gICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJyUnOiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCi0gICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnOCc6IHsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJywnOg0KLSAgICAgICAgICAgICAgICB3c091dHB1dCArPSB3c0dyb3VwU3ltYm9sOw0KLSAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnKCc6DQotICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSAnKCc7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSAnICc7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICcpJzoNCi0gICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9ICcpJzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9ICcgJzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKCFiQWRkTmVnICYmIGJOZWcpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsNCi0gICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsNCi0gICAgICAgIHdzT3V0cHV0ID0gd3NNaW51c3ltYm9sICsgd3NPdXRwdXRbMF0gKyB3c091dHB1dC5NaWQoMSwgd3NPdXRwdXQuR2V0TGVuZ3RoKCkgLSAxKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXRMQ051bWVyaWMoQ0ZYX0xDTnVtZXJpYyYgbGNOdW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCi17DQotICAgIGludDMyX3QgZG90X2luZGV4X2YgPSAtMTsNCi0gICAgRlhfRFdPUkQgZHdOdW1TdHlsZSA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTnVtRm9ybWF0Ow0KLSAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TnVtZXJpY0Zvcm1hdCh3c1BhdHRlcm4sIGRvdF9pbmRleF9mLCBkd051bVN0eWxlLCB3c051bUZvcm1hdCk7DQotICAgIGlmICghcExvY2FsZSB8fCB3c051bUZvcm1hdC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGNjID0gMCwgY2NmID0gMDsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHN0cmYgPSAoY29uc3QgRlhfV0NIQVIqKXdzTnVtRm9ybWF0Ow0KLSAgICBpbnQgbGVuZiA9IHdzTnVtRm9ybWF0LkdldExlbmd0aCgpOw0KLSAgICBkb3VibGUgZGJPcmdSYXcgPSBsY051bS5HZXREb3VibGUoKTsNCi0gICAgZG91YmxlIGRiUmV0VmFsdWUgPSBkYk9yZ1JhdzsNCi0gICAgaWYgKGR3TnVtU3R5bGUgJiBGWF9OVU1TVFlMRV9QZXJjZW50KSB7DQotICAgICAgICBkYlJldFZhbHVlICo9IDEwMDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGV4cG9uZW50ID0gMDsNCi0gICAgaWYgKGR3TnVtU3R5bGUgJiBGWF9OVU1TVFlMRV9FeHBvbmVudCkgew0KLSAgICAgICAgaW50IGZpeGVkX2NvdW50ID0gMDsNCi0gICAgICAgIHdoaWxlIChjY2YgPCBkb3RfaW5kZXhfZikgew0KLSAgICAgICAgICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoNCi0gICAgICAgICAgICAgICAgICAgIEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgZG90X2luZGV4X2YpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJzknOg0KLSAgICAgICAgICAgICAgICBjYXNlICd6JzoNCi0gICAgICAgICAgICAgICAgY2FzZSAnWic6DQotICAgICAgICAgICAgICAgICAgICBmaXhlZF9jb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50IHRocmVzaG9sZCA9IDE7DQotICAgICAgICB3aGlsZSAoZml4ZWRfY291bnQgPiAxKSB7DQotICAgICAgICAgICAgdGhyZXNob2xkICo9IDEwOw0KLSAgICAgICAgICAgIGZpeGVkX2NvdW50LS07DQotICAgICAgICB9DQotICAgICAgICBpZiAoZGJSZXRWYWx1ZSAhPSAwKSB7DQotICAgICAgICAgICAgaWYgKGRiUmV0VmFsdWUgPCB0aHJlc2hvbGQpIHsNCi0gICAgICAgICAgICAgICAgZGJSZXRWYWx1ZSAqPSAxMDsNCi0gICAgICAgICAgICAgICAgZXhwb25lbnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGRiUmV0VmFsdWUgPCB0aHJlc2hvbGQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgKj0gMTA7DQotICAgICAgICAgICAgICAgICAgICBleHBvbmVudCAtPSAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChkYlJldFZhbHVlID4gdGhyZXNob2xkKSB7DQotICAgICAgICAgICAgICAgIHRocmVzaG9sZCAqPSAxMDsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGRiUmV0VmFsdWUgPiB0aHJlc2hvbGQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRiUmV0VmFsdWUgLz0gMTA7DQotICAgICAgICAgICAgICAgICAgICBleHBvbmVudCArPSAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChkd051bVN0eWxlICYgKEZYX05VTVNUWUxFX1BlcmNlbnQgfCBGWF9OVU1TVFlMRV9FeHBvbmVudCkpIHsNCi0gICAgICAgIGxjTnVtID0gQ0ZYX0xDTnVtZXJpYyhkYlJldFZhbHVlKTsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJUcmltVGFpbFplcm9zID0gRkFMU0U7DQotICAgIGludDMyX3QgaVRyZWFkaW5nID0gRlhfR2V0TnVtVHJhaWxpbmdMaW1pdCh3c051bUZvcm1hdCwgZG90X2luZGV4X2YsIGJUcmltVGFpbFplcm9zKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1lcmljID0gbGNOdW0uVG9TdHJpbmcoaVRyZWFkaW5nLCBiVHJpbVRhaWxaZXJvcyk7DQotICAgIGlmICh3c051bWVyaWMuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCi0gICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCi0gICAgRlhfQk9PTCBiTmVnID0gRkFMU0U7DQotICAgIGlmICh3c051bWVyaWNbMF0gPT0gJy0nKSB7DQotICAgICAgICBiTmVnID0gVFJVRTsNCi0gICAgICAgIHdzTnVtZXJpYy5EZWxldGUoMCwgMSk7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiQWRkTmVnID0gRkFMU0U7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzTnVtZXJpYzsNCi0gICAgaW50IGxlbiA9IHdzTnVtZXJpYy5HZXRMZW5ndGgoKTsNCi0gICAgaW50IGRvdF9pbmRleCA9IHdzTnVtZXJpYy5GaW5kKCcuJyk7DQotICAgIGlmIChkb3RfaW5kZXggPT0gLTEpIHsNCi0gICAgICAgIGRvdF9pbmRleCA9IGxlbjsNCi0gICAgfQ0KLSAgICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7DQotICAgIGNjID0gZG90X2luZGV4IC0gMTsNCi0gICAgd2hpbGUgKGNjZiA+PSAwKSB7DQotICAgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KLSAgICAgICAgICAgIGNhc2UgJzknOg0KLSAgICAgICAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0Moc3RyW2NjXSkgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJzAnKSArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICd6JzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjID49IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChsY051bS5tX0ludGVncmFsICE9IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2MtLTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnWic6DQotICAgICAgICAgICAgICAgIGlmIChjYyA+PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobGNOdW0ubV9JbnRlZ3JhbCA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0MoTCcgJykgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0Moc3RyW2NjXSkgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjLS07DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJyAnKSArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdTJzoNCi0gICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXNTeW1ib2w7DQotICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXNTeW1ib2wpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSB3c01pbnVzU3ltYm9sICsgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKEwnICcpICsgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ3MnOg0KLSAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c1N5bWJvbDsNCi0gICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c1N5bWJvbCk7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IHdzTWludXNTeW1ib2wgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdFJzogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHA7DQotICAgICAgICAgICAgICAgICAgICB3c0V4cC5Gb3JtYXQoTCJFJStkIiwgZXhwb25lbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSB3c0V4cCArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICckJzogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQotICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wsIHdzU3ltYm9sKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NTeW1ib2wgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAncic6DQotICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnYycpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMIkNSIiArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQotICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdSJzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdDJykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiQ1IiICsgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIgICIgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZiAtPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnYic6DQotICAgICAgICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnZCcpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgPSBMImRiIiArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmIC09IDI7DQotICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdCJzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdEJykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiREIiICsgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIgICIgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZiAtPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnJSc6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KLSAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NTeW1ib2wgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnLCc6DQotICAgICAgICAgICAgICAgIGlmIChjYyA+PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IHdzR3JvdXBTeW1ib2wgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnKCc6DQotICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiKCIgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIgIiArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBjY2YtLTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnKSc6DQotICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCA9IEwiKSIgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIgIiArIHdzT3V0cHV0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZi0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdcJyc6DQotICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gRlhfR2V0TGl0ZXJhbFRleHRSZXZlcnNlKHN0cmYsIGNjZikgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cmZbY2NmXSkgKyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgY2NmLS07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGNjID49IDApIHsNCi0gICAgICAgIGludCBuUG9zID0gZG90X2luZGV4ICUgMzsNCi0gICAgICAgIHdzT3V0cHV0LkVtcHR5KCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkb3RfaW5kZXg7IGkrKykgew0KLSAgICAgICAgICAgIGlmIChpICUgMyA9PSBuUG9zICYmIGkgIT0gMCkgew0KLSAgICAgICAgICAgICAgICB3c091dHB1dCArPSB3c0dyb3VwU3ltYm9sOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c091dHB1dCArPSB3c051bWVyaWNbaV07DQotICAgICAgICB9DQotICAgICAgICBpZiAoZG90X2luZGV4IDwgbGVuKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQotICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzU3ltYm9sKTsNCi0gICAgICAgICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsNCi0gICAgICAgICAgICB3c091dHB1dCArPSB3c051bWVyaWMuUmlnaHQobGVuIC0gZG90X2luZGV4IC0gMSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYk5lZykgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsNCi0gICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXN5bWJvbCk7DQotICAgICAgICAgICAgd3NPdXRwdXQgPSB3c01pbnVzeW1ib2wgKyB3c091dHB1dDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoZG90X2luZGV4X2YgPT0gd3NOdW1Gb3JtYXQuR2V0TGVuZ3RoKCkpIHsNCi0gICAgICAgIGlmICghYkFkZE5lZyAmJiBiTmVnKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOw0KLSAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsNCi0gICAgICAgICAgICB3c091dHB1dCA9IHdzTWludXN5bWJvbCArIHdzT3V0cHV0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NEb3RTeW1ib2w7DQotICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c0RvdFN5bWJvbCk7DQotICAgIGlmIChzdHJmW2RvdF9pbmRleF9mXSA9PSAnVicpIHsNCi0gICAgICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOw0KLSAgICB9IGVsc2UgaWYgKHN0cmZbZG90X2luZGV4X2ZdID09ICcuJykgew0KLSAgICAgICAgaWYgKGRvdF9pbmRleCA8IGxlbikgew0KLSAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoc3RyZltkb3RfaW5kZXhfZiArIDFdID09ICc5JyB8fCBzdHJmW2RvdF9pbmRleF9mICsgMV0gPT0gJ1onKSB7DQotICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBjY2YgPSBkb3RfaW5kZXhfZiArIDE7DQotICAgIGNjID0gZG90X2luZGV4ICsgMTsNCi0gICAgd2hpbGUgKGNjZiA8IGxlbmYpIHsNCi0gICAgICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7DQotICAgICAgICAgICAgY2FzZSAnXCcnOg0KLSAgICAgICAgICAgICAgICB3c091dHB1dCArPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KLSAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnOSc6DQotICAgICAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCi0gICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMJzAnOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICd6JzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOw0KLSAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnWic6DQotICAgICAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCi0gICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMJzAnOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdFJzogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHA7DQotICAgICAgICAgICAgICAgICAgICB3c0V4cC5Gb3JtYXQoTCJFJStkIiwgZXhwb25lbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gd3NFeHA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJyQnOiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCi0gICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gd3NTeW1ib2w7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ2MnOg0KLSAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAncicpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJDUiI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjY2YgKz0gMjsNCi0gICAgICAgICAgICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ0MnOg0KLSAgICAgICAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnUicpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJDUiI7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiICAiOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmICs9IDI7DQotICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdkJzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ2InKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiZGIiOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2NmICs9IDI7DQotICAgICAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdEJzoNCi0gICAgICAgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ0InKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiREIiOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBMIiAgIjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNjZiArPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnJSc6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KLSAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICc4Jzogew0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09ICc4Jykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnLCc6DQotICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9IHdzR3JvdXBTeW1ib2w7DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICcoJzoNCi0gICAgICAgICAgICAgICAgaWYgKGJOZWcpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9ICcoJzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ICs9ICcgJzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJyknOg0KLSAgICAgICAgICAgICAgICBpZiAoYk5lZykgew0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gJyknOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gJyAnOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoIWJBZGROZWcgJiYgYk5lZykgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOw0KLSAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzeW1ib2wpOw0KLSAgICAgICAgd3NPdXRwdXQgPSB3c091dHB1dFswXSArIHdzTWludXN5bWJvbCArIHdzT3V0cHV0Lk1pZCgxLCB3c091dHB1dC5HZXRMZW5ndGgoKSAtIDEpOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdE51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCi17DQotICAgIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBGb3JtYXRTdHJOdW0od3NTcmNOdW0sIHdzUGF0dGVybiwgd3NPdXRwdXQpOw0KLX0NCi1GWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdE51bShGWF9GTE9BVCBmTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpDQotew0KLSAgICBpZiAod3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9MQ051bWVyaWMgbGNOdW0oZk51bSk7DQotICAgIHJldHVybiBGb3JtYXRMQ051bWVyaWMobGNOdW0sIHdzUGF0dGVybiwgd3NPdXRwdXQpOw0KLX0NCi1GWF9CT09MIEZYX0RhdGVGcm9tQ2Fub25pY2FsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsIENGWF9Vbml0aW1lJiBkYXRldGltZSkNCi17DQotICAgIGludDMyX3QgeWVhciA9IDE5MDA7DQotICAgIGludDMyX3QgbW9udGggPSAxOw0KLSAgICBpbnQzMl90IGRheSA9IDE7DQotICAgIEZYX1dPUkQgd1llYXIgPSAwOw0KLSAgICBpbnQgY2Nfc3RhcnQgPSAwLCBjYyA9IDA7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzRGF0ZTsNCi0gICAgaW50IGxlbiA9IHdzRGF0ZS5HZXRMZW5ndGgoKTsNCi0gICAgaWYobGVuID4gMTApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCA0KSB7DQorICAgICAgaWYgKHN0cltjY10gPT0gJy0nKSB7DQorICAgICAgICBjYysrOw0KKyAgICAgIH0NCisgICAgICB1aW50OF90IHRtcEQgPSAwOw0KKyAgICAgIGNjX3N0YXJ0ID0gY2M7DQorICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjIDwgY2Nfc3RhcnQgKyAyKSB7DQogICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgICAgIH0NCi0gICAgICAgIHdZZWFyID0gd1llYXIgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCi0gICAgfQ0KLSAgICB5ZWFyICA9IHdZZWFyOw0KLSAgICBpZiAoY2MgPCA0IHx8IHdZZWFyIDwgMTkwMCkgew0KKyAgICAgICAgdG1wRCA9IHRtcEQgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICB9DQorICAgICAgZGF5ID0gdG1wRDsNCisgICAgICBpZiAodG1wRCA8IDEpIHsNCiAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaWYgKCh0bXBNID09IDEgfHwgdG1wTSA9PSAzIHx8IHRtcE0gPT0gNSB8fCB0bXBNID09IDcgfHwgdG1wTSA9PSA4IHx8DQorICAgICAgICAgICB0bXBNID09IDEwIHx8IHRtcE0gPT0gMTIpICYmDQorICAgICAgICAgIHRtcEQgPiAzMSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAoKHRtcE0gPT0gNCB8fCB0bXBNID09IDYgfHwgdG1wTSA9PSA5IHx8IHRtcE0gPT0gMTEpICYmIHRtcEQgPiAzMCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBGWF9CT09MIGlMZWFwWWVhcjsNCisgICAgICBpZiAoKHdZZWFyICUgNCA9PSAwICYmIHdZZWFyICUgMTAwICE9IDApIHx8IHdZZWFyICUgNDAwID09IDApIHsNCisgICAgICAgIGlMZWFwWWVhciA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlMZWFwWWVhciA9IEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAoKGlMZWFwWWVhciAmJiB0bXBNID09IDIgJiYgdG1wRCA+IDI5KSB8fA0KKyAgICAgICAgICAoIWlMZWFwWWVhciAmJiB0bXBNID09IDIgJiYgdG1wRCA+IDI4KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZihjYyA8IGxlbikgew0KLSAgICAgICAgaWYgKHN0cltjY10gPT0gJy0nKSB7DQotICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGNjX3N0YXJ0ID0gY2M7DQotICAgICAgICB1aW50OF90IHRtcE0gPSAwOw0KLSAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjIDwgY2Nfc3RhcnQgKyAyKSB7DQotICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdG1wTSA9IHRtcE0gKiAxMCArIHN0cltjYysrXSAtICcwJzsNCi0gICAgICAgIH0NCi0gICAgICAgIG1vbnRoID0gdG1wTTsNCi0gICAgICAgIGlmIChjYyA9PSBjY19zdGFydCArIDEgfHwgdG1wTSA+IDEyIHx8IHRtcE0gPCAxKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoY2MgPCBsZW4pIHsNCi0gICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCi0gICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdWludDhfdCB0bXBEID0gMDsNCi0gICAgICAgICAgICBjY19zdGFydCA9IGNjOw0KLSAgICAgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjYyA8IGNjX3N0YXJ0ICsgMikgew0KLSAgICAgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB0bXBEID0gdG1wRCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkYXkgPSB0bXBEOw0KLSAgICAgICAgICAgIGlmICh0bXBEIDwgMSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICgodG1wTSA9PSAxIHx8IHRtcE0gPT0gMyB8fCB0bXBNID09IDUgfHwgdG1wTSA9PSA3IHx8IHRtcE0gPT0gOCB8fCB0bXBNID09IDEwIHx8IHRtcE0gPT0gMTIpICYmIHRtcEQgPiAzMSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKCh0bXBNID09IDQgfHwgdG1wTSA9PSA2IHx8IHRtcE0gPT0gOSB8fCB0bXBNID09IDExKSAmJiB0bXBEID4gMzApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWF9CT09MIGlMZWFwWWVhcjsNCi0gICAgICAgICAgICBpZigod1llYXIgJSA0ID09IDAgJiYgd1llYXIgJSAxMDAgIT0gMCApIHx8IHdZZWFyICUgNDAwID09IDApIHsNCi0gICAgICAgICAgICAgICAgaUxlYXBZZWFyID0gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpTGVhcFllYXIgPSBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKChpTGVhcFllYXIgJiYgdG1wTSA9PSAyICYmIHRtcEQgPiAyOSkgfHwgKCFpTGVhcFllYXIgJiYgdG1wTSA9PSAyICYmIHRtcEQgPiAyOCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBDRlhfVW5pdGltZSB1dDsNCi0gICAgdXQuU2V0KHllYXIsIG1vbnRoLCBkYXkpOw0KLSAgICBkYXRldGltZSA9IGRhdGV0aW1lICsgdXQ7DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUgdXQ7DQorICB1dC5TZXQoeWVhciwgbW9udGgsIGRheSk7DQorICBkYXRldGltZSA9IGRhdGV0aW1lICsgdXQ7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBGWF9UaW1lRnJvbUNhbm9uaWNhbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGltZSwgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lLCBJRlhfTG9jYWxlKiBwTG9jYWxlKQ0KLXsNCi0gICAgaWYgKHdzVGltZS5HZXRMZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBGWF9UaW1lRnJvbUNhbm9uaWNhbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiBkYXRldGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpIHsNCisgIGlmICh3c1RpbWUuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB1aW50OF90IGhvdXIgPSAwOw0KKyAgdWludDhfdCBtaW51dGUgPSAwOw0KKyAgdWludDhfdCBzZWNvbmQgPSAwOw0KKyAgRlhfV09SRCBtaWxsaXNlY29uZCA9IDA7DQorICBpbnQgY2Nfc3RhcnQgPSAwLCBjYyA9IGNjX3N0YXJ0Ow0KKyAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NUaW1lLkdldFB0cigpOw0KKyAgaW50IGxlbiA9IHdzVGltZS5HZXRMZW5ndGgoKTsNCisgIHdoaWxlIChjYyA8IGxlbiAmJiBjYyA8IDIpIHsNCisgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIHVpbnQ4X3QgaG91ciA9IDA7DQotICAgIHVpbnQ4X3QgbWludXRlID0gMDsNCi0gICAgdWludDhfdCBzZWNvbmQgPSAwOw0KLSAgICBGWF9XT1JEIG1pbGxpc2Vjb25kID0gMDsNCi0gICAgaW50IGNjX3N0YXJ0ID0gMCwgY2MgPSBjY19zdGFydDsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NUaW1lLkdldFB0cigpOw0KLSAgICBpbnQgbGVuID0gd3NUaW1lLkdldExlbmd0aCgpOw0KLSAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCAyKSB7DQorICAgIGhvdXIgPSBob3VyICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICB9DQorICBpZiAoY2MgPCAyIHx8IGhvdXIgPj0gMjQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGNjIDwgbGVuKSB7DQorICAgIGlmIChzdHJbY2NdID09ICc6Jykgew0KKyAgICAgIGNjKys7DQorICAgIH0NCisgICAgY2Nfc3RhcnQgPSBjYzsNCisgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjIDwgY2Nfc3RhcnQgKyAyKSB7DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIG1pbnV0ZSA9IG1pbnV0ZSAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICB9DQorICAgIGlmIChjYyA9PSBjY19zdGFydCArIDEgfHwgbWludXRlID49IDYwKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgIGlmIChzdHJbY2NdID09ICc6Jykgew0KKyAgICAgICAgY2MrKzsNCisgICAgICB9DQorICAgICAgY2Nfc3RhcnQgPSBjYzsNCisgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCBjY19zdGFydCArIDIpIHsNCiAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICAgICAgfQ0KLSAgICAgICAgaG91ciA9IGhvdXIgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCi0gICAgfQ0KLSAgICBpZiAoY2MgPCAyIHx8IGhvdXIgPj0gMjQpIHsNCisgICAgICAgIHNlY29uZCA9IHNlY29uZCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIH0NCisgICAgICBpZiAoY2MgPT0gY2Nfc3RhcnQgKyAxIHx8IHNlY29uZCA+PSA2MCkgew0KICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmKGNjIDwgbGVuKSB7DQotICAgICAgICBpZiAoc3RyW2NjXSA9PSAnOicpIHsNCi0gICAgICAgICAgICBjYysrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2Nfc3RhcnQgPSBjYzsNCi0gICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjYyA8IGNjX3N0YXJ0ICsgMikgew0KKyAgICAgIH0NCisgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgIGlmIChzdHJbY2NdID09ICcuJykgew0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBjY19zdGFydCA9IGNjOw0KKyAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCBjY19zdGFydCArIDMpIHsNCiAgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtaW51dGUgPSBtaW51dGUgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChjYyA9PSBjY19zdGFydCArIDEgfHwgbWludXRlID49IDYwKSB7DQorICAgICAgICAgICAgbWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChjYyA8IGNjX3N0YXJ0ICsgMyB8fCBtaWxsaXNlY29uZCA+PSAxMDAwKSB7DQogICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBpZihjYyA8IGxlbikgew0KLSAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICc6Jykgew0KLSAgICAgICAgICAgICAgICBjYysrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjY19zdGFydCA9IGNjOw0KLSAgICAgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjYyA8IGNjX3N0YXJ0ICsgMikgew0KLSAgICAgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBzZWNvbmQgPSBzZWNvbmQgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGNjID09IGNjX3N0YXJ0ICsgMSB8fCBzZWNvbmQgPj0gNjApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihjYyA8IGxlbikgew0KLSAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLicpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgICAgICBjY19zdGFydCA9IGNjOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjIDwgY2Nfc3RhcnQgKyAzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjIDwgY2Nfc3RhcnQgKyAzIHx8IG1pbGxpc2Vjb25kID49IDEwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYoY2MgPCBsZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX1RJTUVaT05FIHR6RGlmZjsNCi0gICAgICAgICAgICAgICAgICAgIHR6RGlmZi50ekhvdXIgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgdHpEaWZmLnR6TWludXRlID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdICE9ICdaJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IEZYX1BhcnNlVGltZVpvbmUoc3RyICsgY2MsIGxlbiAtIGNjLCB0ekRpZmYpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhfUmVzb2x2ZVpvbmUoaG91ciwgbWludXRlLCB0ekRpZmYsIHBMb2NhbGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KKyAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICAgIEZYX1RJTUVaT05FIHR6RGlmZjsNCisgICAgICAgICAgdHpEaWZmLnR6SG91ciA9IDA7DQorICAgICAgICAgIHR6RGlmZi50ek1pbnV0ZSA9IDA7DQorICAgICAgICAgIGlmIChzdHJbY2NdICE9ICdaJykgew0KKyAgICAgICAgICAgIGNjICs9IEZYX1BhcnNlVGltZVpvbmUoc3RyICsgY2MsIGxlbiAtIGNjLCB0ekRpZmYpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX1Jlc29sdmVab25lKGhvdXIsIG1pbnV0ZSwgdHpEaWZmLCBwTG9jYWxlKTsNCiAgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi0gICAgQ0ZYX1VuaXRpbWUgdXQ7DQotICAgIHV0LlNldCgwLCAwLCAwLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpOw0KLSAgICBkYXRldGltZSA9IGRhdGV0aW1lICsgdXQ7DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUgdXQ7DQorICB1dC5TZXQoMCwgMCwgMCwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKTsNCisgIGRhdGV0aW1lID0gZGF0ZXRpbWUgKyB1dDsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1zdGF0aWMgRlhfV09SRCBGWF9HZXRTb2xhck1vbnRoRGF5cyhGWF9XT1JEIHllYXIsIEZYX1dPUkQgbW9udGgpDQotew0KLSAgICBpZiAobW9udGggJSAyKSB7DQotICAgICAgICByZXR1cm4gMzE7DQotICAgIH0gZWxzZSBpZiAobW9udGggPT0gMikgew0KLSAgICAgICAgcmV0dXJuIEZYX0lzTGVhcFllYXIoeWVhcikgPyAyOSA6IDI4Ow0KK3N0YXRpYyBGWF9XT1JEIEZYX0dldFNvbGFyTW9udGhEYXlzKEZYX1dPUkQgeWVhciwgRlhfV09SRCBtb250aCkgew0KKyAgaWYgKG1vbnRoICUgMikgew0KKyAgICByZXR1cm4gMzE7DQorICB9IGVsc2UgaWYgKG1vbnRoID09IDIpIHsNCisgICAgcmV0dXJuIEZYX0lzTGVhcFllYXIoeWVhcikgPyAyOSA6IDI4Ow0KKyAgfQ0KKyAgcmV0dXJuIDMwOw0KK30NCitzdGF0aWMgRlhfV09SRCBGWF9HZXRXZWVrRGF5KEZYX1dPUkQgeWVhciwgRlhfV09SRCBtb250aCwgRlhfV09SRCBkYXkpIHsNCisgIEZYX1dPUkQgZ19tb250aF9kYXlbXSA9IHswLCAzLCAzLCA2LCAxLCA0LCA2LCAyLCA1LCAwLCAzLCA1fTsNCisgIEZYX1dPUkQgbkRheXMgPQ0KKyAgICAgICh5ZWFyIC0gMSkgJSA3ICsgKHllYXIgLSAxKSAvIDQgLSAoeWVhciAtIDEpIC8gMTAwICsgKHllYXIgLSAxKSAvIDQwMDsNCisgIG5EYXlzICs9IGdfbW9udGhfZGF5W21vbnRoIC0gMV0gKyBkYXk7DQorICBpZiAoRlhfSXNMZWFwWWVhcih5ZWFyKSAmJiBtb250aCA+IDIpIHsNCisgICAgbkRheXMrKzsNCisgIH0NCisgIHJldHVybiBuRGF5cyAlIDc7DQorfQ0KK3N0YXRpYyBGWF9XT1JEIEZYX0dldFdlZWtPZk1vbnRoKEZYX1dPUkQgeWVhciwgRlhfV09SRCBtb250aCwgRlhfV09SRCBkYXkpIHsNCisgIEZYX1dPUkQgd2Vla19kYXkgPSBGWF9HZXRXZWVrRGF5KHllYXIsIG1vbnRoLCAxKTsNCisgIEZYX1dPUkQgd2Vla19pbmRleCA9IDA7DQorICB3ZWVrX2luZGV4ICs9IGRheSAvIDc7DQorICBkYXkgPSBkYXkgJSA3Ow0KKyAgaWYgKHdlZWtfZGF5ICsgZGF5ID4gNykgew0KKyAgICB3ZWVrX2luZGV4Kys7DQorICB9DQorICByZXR1cm4gd2Vla19pbmRleDsNCit9DQorc3RhdGljIEZYX1dPUkQgRlhfR2V0V2Vla09mWWVhcihGWF9XT1JEIHllYXIsIEZYX1dPUkQgbW9udGgsIEZYX1dPUkQgZGF5KSB7DQorICBGWF9XT1JEIG5EYXlzID0gMDsNCisgIGZvciAoRlhfV09SRCBpID0gMTsgaSA8IG1vbnRoOyBpKyspIHsNCisgICAgbkRheXMgKz0gRlhfR2V0U29sYXJNb250aERheXMoeWVhciwgaSk7DQorICB9DQorICBuRGF5cyArPSBkYXk7DQorICBGWF9XT1JEIHdlZWtfZGF5ID0gRlhfR2V0V2Vla0RheSh5ZWFyLCAxLCAxKTsNCisgIEZYX1dPUkQgd2Vla19pbmRleCA9IDE7DQorICB3ZWVrX2luZGV4ICs9IG5EYXlzIC8gNzsNCisgIG5EYXlzID0gbkRheXMgJSA3Ow0KKyAgaWYgKHdlZWtfZGF5ICsgbkRheXMgPiA3KSB7DQorICAgIHdlZWtfaW5kZXgrKzsNCisgIH0NCisgIHJldHVybiB3ZWVrX2luZGV4Ow0KK30NCitzdGF0aWMgRlhfQk9PTCBGWF9EYXRlRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Vbml0aW1lJiBkYXRldGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCkgew0KKyAgRlhfQk9PTCBiUmV0ID0gVFJVRTsNCisgIGludDMyX3QgeWVhciA9IGRhdGV0aW1lLkdldFllYXIoKTsNCisgIHVpbnQ4X3QgbW9udGggPSBkYXRldGltZS5HZXRNb250aCgpOw0KKyAgdWludDhfdCBkYXkgPSBkYXRldGltZS5HZXREYXkoKTsNCisgIGludDMyX3QgY2NmID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c0RhdGVQYXR0ZXJuOw0KKyAgaW50MzJfdCBsZW5mID0gd3NEYXRlUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgIHdoaWxlIChjY2YgPCBsZW5mKSB7DQorICAgIGlmIChzdHJmW2NjZl0gPT0gJ1wnJykgew0KKyAgICAgIHdzUmVzdWx0ICs9IEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgbGVuZik7DQorICAgICAgY2NmKys7DQorICAgICAgY29udGludWU7DQorICAgIH0gZWxzZSBpZiAoRlhfTG9jYWxfRmluZChnc193c0RhdGVTeW1ib2xzLCBzdHJmW2NjZl0pIDwgMCkgew0KKyAgICAgIHdzUmVzdWx0ICs9IHN0cmZbY2NmKytdOw0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIHJldHVybiAzMDsNCi19DQotc3RhdGljIEZYX1dPUkQgRlhfR2V0V2Vla0RheShGWF9XT1JEIHllYXIsIEZYX1dPUkQgbW9udGgsIEZYX1dPUkQgZGF5KQ0KLXsNCi0gICAgRlhfV09SRCBnX21vbnRoX2RheVtdID0geyAwLCAzLCAzLCA2LCAxLCA0LCA2LCAyLCA1LCAwLCAzLCA1IH07DQotICAgIEZYX1dPUkQgbkRheXMgPSAoeWVhciAtIDEpICUgNyArICh5ZWFyIC0gMSkgLyA0IC0gKHllYXIgLSAxKSAvIDEwMCArICh5ZWFyIC0gMSkgLyA0MDA7DQotICAgIG5EYXlzICs9IGdfbW9udGhfZGF5W21vbnRoIC0gMV0gKyBkYXk7DQotICAgIGlmIChGWF9Jc0xlYXBZZWFyKHllYXIpICYmIG1vbnRoID4gMikgew0KLSAgICAgICAgbkRheXMrKzsNCisgICAgRlhfRFdPUkQgZHdTeW1ib2xOdW0gPSAxOw0KKyAgICBGWF9EV09SRCBkd1N5bWJvbCA9IHN0cmZbY2NmKytdOw0KKyAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gZHdTeW1ib2wpIHsNCisgICAgICBjY2YrKzsNCisgICAgICBkd1N5bWJvbE51bSsrOw0KICAgICB9DQotICAgIHJldHVybiBuRGF5cyAlIDc7DQotfQ0KLXN0YXRpYyBGWF9XT1JEIEZYX0dldFdlZWtPZk1vbnRoKEZYX1dPUkQgeWVhciwgRlhfV09SRCBtb250aCwgRlhfV09SRCBkYXkpDQotew0KLSAgICBGWF9XT1JEIHdlZWtfZGF5ID0gRlhfR2V0V2Vla0RheSh5ZWFyLCBtb250aCwgMSk7DQotICAgIEZYX1dPUkQgd2Vla19pbmRleCA9IDA7DQotICAgIHdlZWtfaW5kZXggKz0gZGF5IC8gNzsNCi0gICAgZGF5ID0gZGF5ICUgNzsNCi0gICAgaWYgKHdlZWtfZGF5ICsgZGF5ID4gNykgew0KLSAgICAgICAgd2Vla19pbmRleCsrOw0KLSAgICB9DQotICAgIHJldHVybiB3ZWVrX2luZGV4Ow0KLX0NCi1zdGF0aWMgRlhfV09SRCBGWF9HZXRXZWVrT2ZZZWFyKEZYX1dPUkQgeWVhciwgRlhfV09SRCBtb250aCwgRlhfV09SRCBkYXkpDQotew0KLSAgICBGWF9XT1JEIG5EYXlzID0gMDsNCi0gICAgZm9yIChGWF9XT1JEIGkgPSAxOyBpIDwgbW9udGg7IGkrKykgew0KKyAgICBkd1N5bWJvbCA9IChkd1N5bWJvbCA8PCA4KSB8IChkd1N5bWJvbE51bSArICcwJyk7DQorICAgIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0QnLCAnMScpKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXk7DQorICAgICAgd3NEYXkuRm9ybWF0KEwiJWQiLCBkYXkpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzRGF5Ow0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRCcsICcyJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0RheTsNCisgICAgICB3c0RheS5Gb3JtYXQoTCIlMDJkIiwgZGF5KTsNCisgICAgICB3c1Jlc3VsdCArPSB3c0RheTsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0onLCAnMScpKSB7DQorICAgICAgRlhfV09SRCBuRGF5cyA9IDA7DQorICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtb250aDsgaSsrKSB7DQogICAgICAgICBuRGF5cyArPSBGWF9HZXRTb2xhck1vbnRoRGF5cyh5ZWFyLCBpKTsNCisgICAgICB9DQorICAgICAgbkRheXMgKz0gZGF5Ow0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5czsNCisgICAgICB3c0RheXMuRm9ybWF0KEwiJWQiLCBuRGF5cyk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NEYXlzOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSicsICczJykpIHsNCisgICAgICBGWF9XT1JEIG5EYXlzID0gMDsNCisgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1vbnRoOyBpKyspIHsNCisgICAgICAgIG5EYXlzICs9IEZYX0dldFNvbGFyTW9udGhEYXlzKHllYXIsIGkpOw0KKyAgICAgIH0NCisgICAgICBuRGF5cyArPSBkYXk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXlzOw0KKyAgICAgIHdzRGF5cy5Gb3JtYXQoTCIlMDNkIiwgbkRheXMpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzRGF5czsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMScpKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNb250aDsNCisgICAgICB3c01vbnRoLkZvcm1hdChMIiVkIiwgbW9udGgpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzTW9udGg7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzInKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTW9udGg7DQorICAgICAgd3NNb250aC5Gb3JtYXQoTCIlMDJkIiwgbW9udGgpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzTW9udGg7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzMnKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgICBwTG9jYWxlLT5HZXRNb250aE5hbWUobW9udGggLSAxLCB3c1RlbXAsIFRSVUUpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzVGVtcDsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnNCcpKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgIHBMb2NhbGUtPkdldE1vbnRoTmFtZShtb250aCAtIDEsIHdzVGVtcCwgRkFMU0UpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzVGVtcDsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0UnLCAnMScpKSB7DQorICAgICAgRlhfV09SRCB3V2Vla0RheSA9IEZYX0dldFdlZWtEYXkoeWVhciwgbW9udGgsIGRheSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXZWVrRGF5Ow0KKyAgICAgIHdzV2Vla0RheS5Gb3JtYXQoTCIlZCIsIHdXZWVrRGF5ICsgMSk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NXZWVrRGF5Ow0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRScsICczJykpIHsNCisgICAgICBGWF9XT1JEIHdXZWVrRGF5ID0gRlhfR2V0V2Vla0RheSh5ZWFyLCBtb250aCwgZGF5KTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgcExvY2FsZS0+R2V0RGF5TmFtZSh3V2Vla0RheSwgd3NUZW1wLCBUUlVFKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c1RlbXA7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdFJywgJzQnKSkgew0KKyAgICAgIEZYX1dPUkQgd1dlZWtEYXkgPSBGWF9HZXRXZWVrRGF5KHllYXIsIG1vbnRoLCBkYXkpOw0KKyAgICAgIGlmIChwTG9jYWxlKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgICBwTG9jYWxlLT5HZXREYXlOYW1lKHdXZWVrRGF5LCB3c1RlbXAsIEZBTFNFKTsNCisgICAgICAgIHdzUmVzdWx0ICs9IHdzVGVtcDsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdlJywgJzEnKSkgew0KKyAgICAgIEZYX1dPUkQgd1dlZWtEYXkgPSBGWF9HZXRXZWVrRGF5KHllYXIsIG1vbnRoLCBkYXkpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2Vla0RheTsNCisgICAgICB3c1dlZWtEYXkuRm9ybWF0KEwiJWQiLCB3V2Vla0RheSA/IHdXZWVrRGF5IDogNyk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NXZWVrRGF5Ow0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRycsICcxJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgcExvY2FsZS0+R2V0RXJhTmFtZSh3c1RlbXAsIHllYXIgPCAwKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c1RlbXA7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdZJywgJzInKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzWWVhcjsNCisgICAgICB3c1llYXIuRm9ybWF0KEwiJTAyZCIsIHllYXIgJSAxMDApOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzWWVhcjsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1knLCAnNCcpKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NZZWFyOw0KKyAgICAgIHdzWWVhci5Gb3JtYXQoTCIlZCIsIHllYXIpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzWWVhcjsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ3cnLCAnMScpKSB7DQorICAgICAgRlhfV09SRCB3ZWVrX2luZGV4ID0gRlhfR2V0V2Vla09mTW9udGgoeWVhciwgbW9udGgsIGRheSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXZWVrSW5Nb250aDsNCisgICAgICB3c1dlZWtJbk1vbnRoLkZvcm1hdChMIiVkIiwgd2Vla19pbmRleCk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NXZWVrSW5Nb250aDsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1cnLCAnMicpKSB7DQorICAgICAgRlhfV09SRCB3ZWVrX2luZGV4ID0gRlhfR2V0V2Vla09mWWVhcih5ZWFyLCBtb250aCwgZGF5KTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1dlZWtJblllYXI7DQorICAgICAgd3NXZWVrSW5ZZWFyLkZvcm1hdChMIiUwMmQiLCB3ZWVrX2luZGV4KTsNCisgICAgICB3c1Jlc3VsdCArPSB3c1dlZWtJblllYXI7DQogICAgIH0NCi0gICAgbkRheXMgKz0gZGF5Ow0KLSAgICBGWF9XT1JEIHdlZWtfZGF5ID0gRlhfR2V0V2Vla0RheSh5ZWFyLCAxLCAxKTsNCi0gICAgRlhfV09SRCB3ZWVrX2luZGV4ID0gMTsNCi0gICAgd2Vla19pbmRleCArPSBuRGF5cyAvIDc7DQotICAgIG5EYXlzID0gbkRheXMgJSA3Ow0KLSAgICBpZiAod2Vla19kYXkgKyBuRGF5cyA+IDcpIHsNCi0gICAgICAgIHdlZWtfaW5kZXgrKzsNCi0gICAgfQ0KLSAgICByZXR1cm4gd2Vla19pbmRleDsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KIH0NCi1zdGF0aWMgRlhfQk9PTCBGWF9EYXRlRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVQYXR0ZXJuLCBJRlhfTG9jYWxlICpwTG9jYWxlLCBjb25zdCBDRlhfVW5pdGltZSAmZGF0ZXRpbWUsIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCkNCi17DQotICAgIEZYX0JPT0wgYlJldCA9IFRSVUU7DQotICAgIGludDMyX3QgeWVhciA9IGRhdGV0aW1lLkdldFllYXIoKTsNCi0gICAgdWludDhfdCBtb250aCA9IGRhdGV0aW1lLkdldE1vbnRoKCk7DQotICAgIHVpbnQ4X3QgZGF5ID0gZGF0ZXRpbWUuR2V0RGF5KCk7DQotICAgIGludDMyX3QgY2NmID0gMDsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHN0cmYgPSAoY29uc3QgRlhfV0NIQVIqKXdzRGF0ZVBhdHRlcm47DQotICAgIGludDMyX3QgbGVuZiA9IHdzRGF0ZVBhdHRlcm4uR2V0TGVuZ3RoKCk7DQotICAgIHdoaWxlIChjY2YgPCBsZW5mKSB7DQotICAgICAgICBpZiAoc3RyZltjY2ZdID09ICdcJycpIHsNCi0gICAgICAgICAgICB3c1Jlc3VsdCArPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KLSAgICAgICAgICAgIGNjZisrOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfSBlbHNlIGlmIChGWF9Mb2NhbF9GaW5kKGdzX3dzRGF0ZVN5bWJvbHMsIHN0cmZbY2NmXSkgPCAwKSB7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gc3RyZltjY2YrK107DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBGWF9EV09SRCBkd1N5bWJvbE51bSA9IDE7DQotICAgICAgICBGWF9EV09SRCBkd1N5bWJvbCA9IHN0cmZbY2NmKytdOw0KLSAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09IGR3U3ltYm9sKSB7DQotICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgZHdTeW1ib2xOdW0rKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGR3U3ltYm9sID0gKGR3U3ltYm9sIDw8IDgpIHwgKGR3U3ltYm9sTnVtICsgJzAnKTsNCi0gICAgICAgIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0QnLCAnMScpKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXk7DQotICAgICAgICAgICAgd3NEYXkuRm9ybWF0KEwiJWQiLCBkYXkpOw0KLSAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzRGF5Ow0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0QnLCAnMicpKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXk7DQotICAgICAgICAgICAgd3NEYXkuRm9ybWF0KEwiJTAyZCIsIGRheSk7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NEYXk7DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSicsICcxJykpIHsNCi0gICAgICAgICAgICBGWF9XT1JEIG5EYXlzID0gMDsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1vbnRoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgbkRheXMgKz0gRlhfR2V0U29sYXJNb250aERheXMoeWVhciwgaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG5EYXlzICs9IGRheTsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RheXM7DQotICAgICAgICAgICAgd3NEYXlzLkZvcm1hdChMIiVkIiwgbkRheXMpOw0KLSAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzRGF5czsNCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdKJywgJzMnKSkgew0KLSAgICAgICAgICAgIEZYX1dPUkQgbkRheXMgPSAwOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbW9udGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICBuRGF5cyArPSBGWF9HZXRTb2xhck1vbnRoRGF5cyh5ZWFyLCBpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbkRheXMgKz0gZGF5Ow0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5czsNCi0gICAgICAgICAgICB3c0RheXMuRm9ybWF0KEwiJTAzZCIsIG5EYXlzKTsNCi0gICAgICAgICAgICB3c1Jlc3VsdCArPSB3c0RheXM7DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01vbnRoOw0KLSAgICAgICAgICAgIHdzTW9udGguRm9ybWF0KEwiJWQiLCBtb250aCk7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NNb250aDsNCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzInKSkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTW9udGg7DQotICAgICAgICAgICAgd3NNb250aC5Gb3JtYXQoTCIlMDJkIiwgbW9udGgpOw0KLSAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzTW9udGg7DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICczJykpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQotICAgICAgICAgICAgcExvY2FsZS0+R2V0TW9udGhOYW1lKG1vbnRoIC0gMSwgd3NUZW1wLCBUUlVFKTsNCi0gICAgICAgICAgICB3c1Jlc3VsdCArPSB3c1RlbXA7DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICc0JykpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQotICAgICAgICAgICAgcExvY2FsZS0+R2V0TW9udGhOYW1lKG1vbnRoIC0gMSwgd3NUZW1wLCBGQUxTRSk7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NUZW1wOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0UnLCAnMScpKSB7DQotICAgICAgICAgICAgRlhfV09SRCB3V2Vla0RheSA9IEZYX0dldFdlZWtEYXkoeWVhciwgbW9udGgsIGRheSk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXZWVrRGF5Ow0KLSAgICAgICAgICAgIHdzV2Vla0RheS5Gb3JtYXQoTCIlZCIsIHdXZWVrRGF5ICsgMSk7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NXZWVrRGF5Ow0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0UnLCAnMycpKSB7DQotICAgICAgICAgICAgRlhfV09SRCB3V2Vla0RheSA9IEZYX0dldFdlZWtEYXkoeWVhciwgbW9udGgsIGRheSk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KLSAgICAgICAgICAgIHBMb2NhbGUtPkdldERheU5hbWUod1dlZWtEYXksIHdzVGVtcCwgVFJVRSk7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NUZW1wOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0UnLCAnNCcpKSB7DQotICAgICAgICAgICAgRlhfV09SRCB3V2Vla0RheSA9IEZYX0dldFdlZWtEYXkoeWVhciwgbW9udGgsIGRheSk7DQotICAgICAgICAgICAgaWYgKHBMb2NhbGUpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KLSAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXREYXlOYW1lKHdXZWVrRGF5LCB3c1RlbXAsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NUZW1wOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdlJywgJzEnKSkgew0KLSAgICAgICAgICAgIEZYX1dPUkQgd1dlZWtEYXkgPSBGWF9HZXRXZWVrRGF5KHllYXIsIG1vbnRoLCBkYXkpOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2Vla0RheTsNCi0gICAgICAgICAgICB3c1dlZWtEYXkuRm9ybWF0KEwiJWQiLCB3V2Vla0RheSA/IHdXZWVrRGF5IDogNyk7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NXZWVrRGF5Ow0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0cnLCAnMScpKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KLSAgICAgICAgICAgIHBMb2NhbGUtPkdldEVyYU5hbWUod3NUZW1wLCB5ZWFyIDwgMCk7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NUZW1wOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1knLCAnMicpKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NZZWFyOw0KLSAgICAgICAgICAgIHdzWWVhci5Gb3JtYXQoTCIlMDJkIiwgeWVhciAlIDEwMCk7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NZZWFyOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1knLCAnNCcpKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NZZWFyOw0KLSAgICAgICAgICAgIHdzWWVhci5Gb3JtYXQoTCIlZCIsIHllYXIpOw0KLSAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzWWVhcjsNCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICd3JywgJzEnKSkgew0KLSAgICAgICAgICAgIEZYX1dPUkQgd2Vla19pbmRleCA9IEZYX0dldFdlZWtPZk1vbnRoKHllYXIsIG1vbnRoLCBkYXkpOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2Vla0luTW9udGg7DQotICAgICAgICAgICAgd3NXZWVrSW5Nb250aC5Gb3JtYXQoTCIlZCIsIHdlZWtfaW5kZXgpOw0KLSAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzV2Vla0luTW9udGg7DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnVycsICcyJykpIHsNCi0gICAgICAgICAgICBGWF9XT1JEIHdlZWtfaW5kZXggPSBGWF9HZXRXZWVrT2ZZZWFyKHllYXIsIG1vbnRoLCBkYXkpOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2Vla0luWWVhcjsNCi0gICAgICAgICAgICB3c1dlZWtJblllYXIuRm9ybWF0KEwiJTAyZCIsIHdlZWtfaW5kZXgpOw0KLSAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzV2Vla0luWWVhcjsNCi0gICAgICAgIH0NCitzdGF0aWMgRlhfQk9PTCBGWF9UaW1lRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWVQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Vbml0aW1lJiBkYXRldGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCkgew0KKyAgRlhfQk9PTCBiR01UID0gRkFMU0U7DQorICBGWF9CT09MIGJSZXQgPSBUUlVFOw0KKyAgdWludDhfdCBob3VyID0gZGF0ZXRpbWUuR2V0SG91cigpOw0KKyAgdWludDhfdCBtaW51dGUgPSBkYXRldGltZS5HZXRNaW51dGUoKTsNCisgIHVpbnQ4X3Qgc2Vjb25kID0gZGF0ZXRpbWUuR2V0U2Vjb25kKCk7DQorICBGWF9XT1JEIG1pbGxpc2Vjb25kID0gZGF0ZXRpbWUuR2V0TWlsbGlzZWNvbmQoKTsNCisgIGludDMyX3QgY2NmID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c1RpbWVQYXR0ZXJuOw0KKyAgaW50MzJfdCBsZW5mID0gd3NUaW1lUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgIEZYX1dPUkQgd0hvdXIgPSBob3VyOw0KKyAgRlhfQk9PTCBiUE0gPSBGQUxTRTsNCisgIGlmICh3c1RpbWVQYXR0ZXJuLkZpbmQoJ0EnKSAhPSAtMSkgew0KKyAgICBpZiAod0hvdXIgPj0gMTIpIHsNCisgICAgICBiUE0gPSBUUlVFOw0KICAgICB9DQotICAgIHJldHVybiBiUmV0Ow0KLX0NCi1zdGF0aWMgRlhfQk9PTCBGWF9UaW1lRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWVQYXR0ZXJuLCBJRlhfTG9jYWxlICpwTG9jYWxlLCBjb25zdCBDRlhfVW5pdGltZSAmZGF0ZXRpbWUsIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCkNCi17DQotICAgIEZYX0JPT0wgYkdNVCA9IEZBTFNFOw0KLSAgICBGWF9CT09MIGJSZXQgPSBUUlVFOw0KLSAgICB1aW50OF90IGhvdXIgPSBkYXRldGltZS5HZXRIb3VyKCk7DQotICAgIHVpbnQ4X3QgbWludXRlID0gZGF0ZXRpbWUuR2V0TWludXRlKCk7DQotICAgIHVpbnQ4X3Qgc2Vjb25kID0gZGF0ZXRpbWUuR2V0U2Vjb25kKCk7DQotICAgIEZYX1dPUkQgbWlsbGlzZWNvbmQgPSBkYXRldGltZS5HZXRNaWxsaXNlY29uZCgpOw0KLSAgICBpbnQzMl90IGNjZiA9IDA7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c1RpbWVQYXR0ZXJuOw0KLSAgICBpbnQzMl90IGxlbmYgPSB3c1RpbWVQYXR0ZXJuLkdldExlbmd0aCgpOw0KLSAgICBGWF9XT1JEIHdIb3VyID0gaG91cjsNCi0gICAgRlhfQk9PTCBiUE0gPSBGQUxTRTsNCi0gICAgaWYgKHdzVGltZVBhdHRlcm4uRmluZCgnQScpICE9IC0xKSB7DQotICAgICAgICBpZiAod0hvdXIgPj0gMTIpIHsNCi0gICAgICAgICAgICBiUE0gPSBUUlVFOw0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgd2hpbGUgKGNjZiA8IGxlbmYpIHsNCisgICAgaWYgKHN0cmZbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgd3NSZXN1bHQgKz0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsNCisgICAgICBjY2YrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIGlmIChGWF9Mb2NhbF9GaW5kKGdzX3dzVGltZVN5bWJvbHMsIHN0cmZbY2NmXSkgPCAwKSB7DQorICAgICAgd3NSZXN1bHQgKz0gc3RyZltjY2YrK107DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgd2hpbGUgKGNjZiA8IGxlbmYpIHsNCi0gICAgICAgIGlmIChzdHJmW2NjZl0gPT0gJ1wnJykgew0KLSAgICAgICAgICAgIHdzUmVzdWx0ICs9IEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgbGVuZik7DQotICAgICAgICAgICAgY2NmKys7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9IGVsc2UgaWYgKEZYX0xvY2FsX0ZpbmQoZ3Nfd3NUaW1lU3ltYm9scywgc3RyZltjY2ZdKSA8IDApIHsNCi0gICAgICAgICAgICB3c1Jlc3VsdCArPSBzdHJmW2NjZisrXTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0RXT1JEIGR3U3ltYm9sTnVtID0gMTsNCi0gICAgICAgIEZYX0RXT1JEIGR3U3ltYm9sID0gc3RyZltjY2YrK107DQotICAgICAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gZHdTeW1ib2wpIHsNCi0gICAgICAgICAgICBjY2YrKzsNCi0gICAgICAgICAgICBkd1N5bWJvbE51bSsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZHdTeW1ib2wgPSAoZHdTeW1ib2wgPDwgOCkgfCAoZHdTeW1ib2xOdW0gKyAnMCcpOw0KLSAgICAgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICcxJykpIHsNCi0gICAgICAgICAgICBpZiAod0hvdXIgPiAxMikgew0KLSAgICAgICAgICAgICAgICB3SG91ciAtPSAxMjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIb3VyOw0KLSAgICAgICAgICAgIHdzSG91ci5Gb3JtYXQoTCIlZCIsIHdIb3VyID09IDAgPyAxMiA6IHdIb3VyKTsNCi0gICAgICAgICAgICB3c1Jlc3VsdCArPSB3c0hvdXI7DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICcyJykpIHsNCi0gICAgICAgICAgICBpZiAod0hvdXIgPiAxMikgew0KLSAgICAgICAgICAgICAgICB3SG91ciAtPSAxMjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIb3VyOw0KLSAgICAgICAgICAgIHdzSG91ci5Gb3JtYXQoTCIlMDJkIiwgd0hvdXIgPT0gMCA/IDEyIDogd0hvdXIpOw0KLSAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzSG91cjsNCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdLJywgJzEnKSkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCi0gICAgICAgICAgICB3c0hvdXIuRm9ybWF0KEwiJWQiLCB3SG91ciA9PSAwID8gMjQgOiB3SG91cik7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0snLCAnMicpKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIb3VyOw0KLSAgICAgICAgICAgIHdzSG91ci5Gb3JtYXQoTCIlMDJkIiwgd0hvdXIgPT0gMCA/IDI0IDogd0hvdXIpOw0KLSAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzSG91cjsNCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdrJywgJzEnKSkgew0KLSAgICAgICAgICAgIGlmICh3SG91ciA+IDEyKSB7DQotICAgICAgICAgICAgICAgIHdIb3VyIC09IDEyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQotICAgICAgICAgICAgd3NIb3VyLkZvcm1hdChMIiVkIiwgd0hvdXIpOw0KLSAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzSG91cjsNCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdIJywgJzEnKSkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCi0gICAgICAgICAgICB3c0hvdXIuRm9ybWF0KEwiJWQiLCB3SG91cik7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2snLCAnMicpKSB7DQotICAgICAgICAgICAgaWYgKHdIb3VyID4gMTIpIHsNCi0gICAgICAgICAgICAgICAgd0hvdXIgLT0gMTI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCi0gICAgICAgICAgICB3c0hvdXIuRm9ybWF0KEwiJTAyZCIsIHdIb3VyKTsNCi0gICAgICAgICAgICB3c1Jlc3VsdCArPSB3c0hvdXI7DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcyJykpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQotICAgICAgICAgICAgd3NIb3VyLkZvcm1hdChMIiUwMmQiLCB3SG91cik7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMScpKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51dGU7DQotICAgICAgICAgICAgd3NNaW51dGUuRm9ybWF0KEwiJWQiLCBtaW51dGUpOw0KLSAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzTWludXRlOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMicpKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51dGU7DQotICAgICAgICAgICAgd3NNaW51dGUuRm9ybWF0KEwiJTAyZCIsIG1pbnV0ZSk7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NNaW51dGU7DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnUycsICcxJykpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NlY29uZDsNCi0gICAgICAgICAgICB3c1NlY29uZC5Gb3JtYXQoTCIlZCIsIHNlY29uZCk7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NTZWNvbmQ7DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnUycsICcyJykpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NlY29uZDsNCi0gICAgICAgICAgICB3c1NlY29uZC5Gb3JtYXQoTCIlMDJkIiwgc2Vjb25kKTsNCi0gICAgICAgICAgICB3c1Jlc3VsdCArPSB3c1NlY29uZDsNCi0gICAgICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdGJywgJzMnKSkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWlsbGlzZWNvbmRzOw0KLSAgICAgICAgICAgIHdzTWlsbGlzZWNvbmRzLkZvcm1hdChMIiUwM2QiLCBtaWxsaXNlY29uZCk7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NNaWxsaXNlY29uZHM7DQotICAgICAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnQScsICcxJykpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01lcmlkaWVtOw0KLSAgICAgICAgICAgIHBMb2NhbGUtPkdldE1lcmlkaWVtTmFtZSh3c01lcmlkaWVtLCAhYlBNKTsNCi0gICAgICAgICAgICB3c1Jlc3VsdCArPSB3c01lcmlkaWVtOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1onLCAnMScpKSB7DQotICAgICAgICAgICAgd3NSZXN1bHQgKz0gRlhfV1NUUkMoTCJHTVQiKTsNCi0gICAgICAgICAgICBGWF9USU1FWk9ORSB0ejsNCi0gICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lWm9uZSh0eik7DQotICAgICAgICAgICAgaWYgKCFiR01UICYmICh0ei50ekhvdXIgIT0gMCB8fCB0ei50ek1pbnV0ZSAhPSAwKSkgew0KLSAgICAgICAgICAgICAgICBpZiAodHoudHpIb3VyIDwgMCkgew0KLSAgICAgICAgICAgICAgICAgICAgd3NSZXN1bHQgKz0gRlhfV1NUUkMoTCItIik7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB3c1Jlc3VsdCArPSBGWF9XU1RSQyhMIisiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWV6b25lOw0KLSAgICAgICAgICAgICAgICB3c1RpbWV6b25lLkZvcm1hdChMIiUwMmQ6JTAyZCIsIEZYU1lTX2Ficyh0ei50ekhvdXIpLCB0ei50ek1pbnV0ZSk7DQotICAgICAgICAgICAgICAgIHdzUmVzdWx0ICs9IHdzVGltZXpvbmU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ3onLCAnMScpKSB7DQotICAgICAgICAgICAgRlhfVElNRVpPTkUgdHo7DQotICAgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVpvbmUodHopOw0KLSAgICAgICAgICAgIGlmICghYkdNVCAmJiB0ei50ekhvdXIgIT0gMCAmJiB0ei50ek1pbnV0ZSAhPSAwKSB7DQotICAgICAgICAgICAgICAgIGlmICh0ei50ekhvdXIgPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICB3c1Jlc3VsdCArPSBGWF9XU1RSQyhMIi0iKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzUmVzdWx0ICs9IEZYX1dTVFJDKEwiKyIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGltZXpvbmU7DQotICAgICAgICAgICAgICAgIHdzVGltZXpvbmUuRm9ybWF0KEwiJTAyZDolMDJkIiwgRlhTWVNfYWJzKHR6LnR6SG91ciksIHR6LnR6TWludXRlKTsNCi0gICAgICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NUaW1lem9uZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICAgIEZYX0RXT1JEIGR3U3ltYm9sTnVtID0gMTsNCisgICAgRlhfRFdPUkQgZHdTeW1ib2wgPSBzdHJmW2NjZisrXTsNCisgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09IGR3U3ltYm9sKSB7DQorICAgICAgY2NmKys7DQorICAgICAgZHdTeW1ib2xOdW0rKzsNCiAgICAgfQ0KLSAgICByZXR1cm4gYlJldDsNCi19DQotc3RhdGljIEZYX0JPT0wgRlhfRm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIGR0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlUGF0dGVybiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZVBhdHRlcm4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGF0ZUZpcnN0LCBJRlhfTG9jYWxlKiBwTG9jYWxlLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpDQotew0KLSAgICBGWF9CT09MIGJSZXQgPSBUUlVFOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGVPdXQsIHdzVGltZU91dDsNCi0gICAgaWYgKCF3c0RhdGVQYXR0ZXJuLklzRW1wdHkoKSkgew0KLSAgICAgICAgYlJldCAmPSBGWF9EYXRlRm9ybWF0KHdzRGF0ZVBhdHRlcm4sIHBMb2NhbGUsIGR0LCB3c0RhdGVPdXQpOw0KLSAgICB9DQotICAgIGlmICghd3NUaW1lUGF0dGVybi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIGJSZXQgJj0gRlhfVGltZUZvcm1hdCh3c1RpbWVQYXR0ZXJuLCBwTG9jYWxlLCBkdCwgd3NUaW1lT3V0KTsNCi0gICAgfQ0KLSAgICB3c091dHB1dCA9IGJEYXRlRmlyc3QgPyB3c0RhdGVPdXQgKyB3c1RpbWVPdXQgOiB3c1RpbWVPdXQgKyB3c0RhdGVPdXQ7DQotICAgIHJldHVybiBiUmV0Ow0KLX0NCi1GWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpDQotew0KLSAgICBpZiAod3NTcmNEYXRlVGltZS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm47DQotICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KLSAgICBGWF9EQVRFVElNRVRZUEUgZUNhdGVnb3J5ID0gR2V0RGF0ZVRpbWVGb3JtYXQod3NQYXR0ZXJuLCBwTG9jYWxlLCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuKTsNCi0gICAgaWYgKHBMb2NhbGUgPT0gTlVMTCB8fCBlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1Vua25vd24pIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfVW5pdGltZSBkdCgwKTsNCi0gICAgaW50MzJfdCBpVCA9IHdzU3JjRGF0ZVRpbWUuRmluZChMIlQiKTsNCi0gICAgaWYgKGlUIDwgMCkgew0KLSAgICAgICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfRGF0ZSkgew0KLSAgICAgICAgICAgIEZYX0RhdGVGcm9tQ2Fub25pY2FsKHdzU3JjRGF0ZVRpbWUsIGR0KTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9UaW1lKSB7DQotICAgICAgICAgICAgRlhfVGltZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZSwgZHQsIHBMb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhfRGF0ZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZS5MZWZ0KGlUKSwgZHQpOw0KLSAgICAgICAgRlhfVGltZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZS5SaWdodCh3c1NyY0RhdGVUaW1lLkdldExlbmd0aCgpIC0gaVQgLSAxKSwgZHQsIHBMb2NhbGUpOw0KLSAgICB9DQotICAgIHJldHVybiBGWF9Gb3JtYXREYXRlVGltZShkdCwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybiwgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwgcExvY2FsZSwgd3NPdXRwdXQpOw0KLX0NCi1GWF9CT09MCUNGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQsIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlKQ0KLXsNCi0gICAgaWYgKHdzU3JjRGF0ZVRpbWUuSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuOw0KLSAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCi0gICAgRlhfREFURVRJTUVUWVBFIGVDYXRlZ29yeSA9IEdldERhdGVUaW1lRm9ybWF0KHdzUGF0dGVybiwgcExvY2FsZSwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybik7DQotICAgIGlmICghcExvY2FsZSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1Vua25vd24pIHsNCi0gICAgICAgIGlmIChlRGF0ZVRpbWVUeXBlID09IEZYX0RBVEVUSU1FVFlQRV9UaW1lKSB7DQotICAgICAgICAgICAgd3NUaW1lUGF0dGVybiA9IHdzRGF0ZVBhdHRlcm47DQotICAgICAgICAgICAgd3NEYXRlUGF0dGVybi5FbXB0eSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZUNhdGVnb3J5ID0gZURhdGVUaW1lVHlwZTsNCi0gICAgfQ0KLSAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZYX1VuaXRpbWUgZHQoMCk7DQotICAgIGludDMyX3QgaVQgPSB3c1NyY0RhdGVUaW1lLkZpbmQoTCJUIik7DQotICAgIGlmIChpVCA8IDApIHsNCi0gICAgICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX0RhdGUgJiYgRlhfRGF0ZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZSwgZHQpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZYX0Zvcm1hdERhdGVUaW1lKGR0LCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuLCBUUlVFLCBwTG9jYWxlLCB3c091dHB1dCk7DQotICAgICAgICB9IGVsc2UgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVGltZSAmJiBGWF9UaW1lRnJvbUNhbm9uaWNhbCh3c1NyY0RhdGVUaW1lLCBkdCwgcExvY2FsZSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRlhfRm9ybWF0RGF0ZVRpbWUoZHQsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4sIFRSVUUsIHBMb2NhbGUsIHdzT3V0cHV0KTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1NyY0RhdGUoKGNvbnN0IEZYX1dDSEFSKil3c1NyY0RhdGVUaW1lLCBpVCk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NTcmNUaW1lKChjb25zdCBGWF9XQ0hBUiopd3NTcmNEYXRlVGltZSArIGlUICsgMSwgd3NTcmNEYXRlVGltZS5HZXRMZW5ndGgoKSAtIGlUIC0gMSk7DQotICAgICAgICBpZih3c1NyY0RhdGUuSXNFbXB0eSgpIHx8IHdzU3JjVGltZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBpZihGWF9EYXRlRnJvbUNhbm9uaWNhbCh3c1NyY0RhdGUsIGR0KSAmJiBGWF9UaW1lRnJvbUNhbm9uaWNhbCh3c1NyY1RpbWUsIGR0LCBwTG9jYWxlKSkgew0KLSAgICAgICAgICAgIHJldHVybiBGWF9Gb3JtYXREYXRlVGltZShkdCwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybiwgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwgcExvY2FsZSwgd3NPdXRwdXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTAlDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXREYXRlVGltZShjb25zdCBDRlhfVW5pdGltZSYgZHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCi17DQotICAgIGlmICh3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybjsNCi0gICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQotICAgIEZYX0RBVEVUSU1FVFlQRSBlQ2F0ZWdvcnkgPSBHZXREYXRlVGltZUZvcm1hdCh3c1BhdHRlcm4sIHBMb2NhbGUsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4pOw0KLSAgICBpZiAoIXBMb2NhbGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhfRm9ybWF0RGF0ZVRpbWUoZHQsIHdzUGF0dGVybiwgd3NUaW1lUGF0dGVybiwgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwgcExvY2FsZSwgd3NPdXRwdXQpOw0KLX0NCi1GWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdFplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KQ0KLXsNCi0gICAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHRGb3JtYXQ7DQotICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRUZXh0Rm9ybWF0KHdzUGF0dGVybiwgRlhfV1NUUkMoTCJ6ZXJvIiksIHdzVGV4dEZvcm1hdCk7DQotICAgIGludDMyX3QgaVBhdHRlcm4gPSAwOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4gPSAoY29uc3QgRlhfV0NIQVIqKXdzVGV4dEZvcm1hdDsNCi0gICAgaW50MzJfdCBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsNCi0gICAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4pIHsNCi0gICAgICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgew0KLSAgICAgICAgICAgIHdzT3V0cHV0ICs9IEZYX0dldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCBpUGF0dGVybiwgaUxlblBhdHRlcm4pOw0KLSAgICAgICAgICAgIGlQYXR0ZXJuKys7DQotICAgICAgICAgICAgY29udGludWU7DQorICAgIGR3U3ltYm9sID0gKGR3U3ltYm9sIDw8IDgpIHwgKGR3U3ltYm9sTnVtICsgJzAnKTsNCisgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICcxJykpIHsNCisgICAgICBpZiAod0hvdXIgPiAxMikgew0KKyAgICAgICAgd0hvdXIgLT0gMTI7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCisgICAgICB3c0hvdXIuRm9ybWF0KEwiJWQiLCB3SG91ciA9PSAwID8gMTIgOiB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICcyJykpIHsNCisgICAgICBpZiAod0hvdXIgPiAxMikgew0KKyAgICAgICAgd0hvdXIgLT0gMTI7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCisgICAgICB3c0hvdXIuRm9ybWF0KEwiJTAyZCIsIHdIb3VyID09IDAgPyAxMiA6IHdIb3VyKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c0hvdXI7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdLJywgJzEnKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCisgICAgICB3c0hvdXIuRm9ybWF0KEwiJWQiLCB3SG91ciA9PSAwID8gMjQgOiB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcyJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQorICAgICAgd3NIb3VyLkZvcm1hdChMIiUwMmQiLCB3SG91ciA9PSAwID8gMjQgOiB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaycsICcxJykpIHsNCisgICAgICBpZiAod0hvdXIgPiAxMikgew0KKyAgICAgICAgd0hvdXIgLT0gMTI7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCisgICAgICB3c0hvdXIuRm9ybWF0KEwiJWQiLCB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcxJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQorICAgICAgd3NIb3VyLkZvcm1hdChMIiVkIiwgd0hvdXIpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzSG91cjsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2snLCAnMicpKSB7DQorICAgICAgaWYgKHdIb3VyID4gMTIpIHsNCisgICAgICAgIHdIb3VyIC09IDEyOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQorICAgICAgd3NIb3VyLkZvcm1hdChMIiUwMmQiLCB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcyJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQorICAgICAgd3NIb3VyLkZvcm1hdChMIiUwMmQiLCB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnV0ZTsNCisgICAgICB3c01pbnV0ZS5Gb3JtYXQoTCIlZCIsIG1pbnV0ZSk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NNaW51dGU7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzInKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXRlOw0KKyAgICAgIHdzTWludXRlLkZvcm1hdChMIiUwMmQiLCBtaW51dGUpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzTWludXRlOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnUycsICcxJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1NlY29uZDsNCisgICAgICB3c1NlY29uZC5Gb3JtYXQoTCIlZCIsIHNlY29uZCk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NTZWNvbmQ7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdTJywgJzInKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzU2Vjb25kOw0KKyAgICAgIHdzU2Vjb25kLkZvcm1hdChMIiUwMmQiLCBzZWNvbmQpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzU2Vjb25kOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRicsICczJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbGxpc2Vjb25kczsNCisgICAgICB3c01pbGxpc2Vjb25kcy5Gb3JtYXQoTCIlMDNkIiwgbWlsbGlzZWNvbmQpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzTWlsbGlzZWNvbmRzOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnQScsICcxJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01lcmlkaWVtOw0KKyAgICAgIHBMb2NhbGUtPkdldE1lcmlkaWVtTmFtZSh3c01lcmlkaWVtLCAhYlBNKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c01lcmlkaWVtOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnWicsICcxJykpIHsNCisgICAgICB3c1Jlc3VsdCArPSBGWF9XU1RSQyhMIkdNVCIpOw0KKyAgICAgIEZYX1RJTUVaT05FIHR6Ow0KKyAgICAgIHBMb2NhbGUtPkdldFRpbWVab25lKHR6KTsNCisgICAgICBpZiAoIWJHTVQgJiYgKHR6LnR6SG91ciAhPSAwIHx8IHR6LnR6TWludXRlICE9IDApKSB7DQorICAgICAgICBpZiAodHoudHpIb3VyIDwgMCkgew0KKyAgICAgICAgICB3c1Jlc3VsdCArPSBGWF9XU1RSQyhMIi0iKTsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgd3NPdXRwdXQgKz0gcFN0clBhdHRlcm5baVBhdHRlcm4rK107DQotICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIHdzUmVzdWx0ICs9IEZYX1dTVFJDKEwiKyIpOw0KICAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdE51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KQ0KLXsNCi0gICAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHRGb3JtYXQ7DQotICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRUZXh0Rm9ybWF0KHdzUGF0dGVybiwgRlhfV1NUUkMoTCJudWxsIiksIHdzVGV4dEZvcm1hdCk7DQotICAgIGludDMyX3QgaVBhdHRlcm4gPSAwOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4gPSAoY29uc3QgRlhfV0NIQVIqKXdzVGV4dEZvcm1hdDsNCi0gICAgaW50MzJfdCBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsNCi0gICAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4pIHsNCi0gICAgICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgew0KLSAgICAgICAgICAgIHdzT3V0cHV0ICs9IEZYX0dldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCBpUGF0dGVybiwgaUxlblBhdHRlcm4pOw0KLSAgICAgICAgICAgIGlQYXR0ZXJuKys7DQotICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWV6b25lOw0KKyAgICAgICAgd3NUaW1lem9uZS5Gb3JtYXQoTCIlMDJkOiUwMmQiLCBGWFNZU19hYnModHoudHpIb3VyKSwgdHoudHpNaW51dGUpOw0KKyAgICAgICAgd3NSZXN1bHQgKz0gd3NUaW1lem9uZTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICd6JywgJzEnKSkgew0KKyAgICAgIEZYX1RJTUVaT05FIHR6Ow0KKyAgICAgIHBMb2NhbGUtPkdldFRpbWVab25lKHR6KTsNCisgICAgICBpZiAoIWJHTVQgJiYgdHoudHpIb3VyICE9IDAgJiYgdHoudHpNaW51dGUgIT0gMCkgew0KKyAgICAgICAgaWYgKHR6LnR6SG91ciA8IDApIHsNCisgICAgICAgICAgd3NSZXN1bHQgKz0gRlhfV1NUUkMoTCItIik7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdzT3V0cHV0ICs9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuKytdOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB3c1Jlc3VsdCArPSBGWF9XU1RSQyhMIisiKTsNCiAgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGltZXpvbmU7DQorICAgICAgICB3c1RpbWV6b25lLkZvcm1hdChMIiUwMmQ6JTAyZCIsIEZYU1lTX2Ficyh0ei50ekhvdXIpLCB0ei50ek1pbnV0ZSk7DQorICAgICAgICB3c1Jlc3VsdCArPSB3c1RpbWV6b25lOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KIH0NCi1JRlhfTG9jYWxlKiBDRlhfRm9ybWF0U3RyaW5nOjpHZXRQYXR0ZXJuTG9jYWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbGUpDQotew0KLSAgICBpZiAobV9iVXNlTENJRCkgew0KLSAgICB9DQotICAgIHJldHVybiBtX3BMb2NhbGVNZ3ItPkdldExvY2FsZUJ5TmFtZSh3c0xvY2FsZSk7DQorc3RhdGljIEZYX0JPT0wgRlhfRm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIGR0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWVQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRhdGVGaXJzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgRlhfQk9PTCBiUmV0ID0gVFJVRTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZU91dCwgd3NUaW1lT3V0Ow0KKyAgaWYgKCF3c0RhdGVQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICBiUmV0ICY9IEZYX0RhdGVGb3JtYXQod3NEYXRlUGF0dGVybiwgcExvY2FsZSwgZHQsIHdzRGF0ZU91dCk7DQorICB9DQorICBpZiAoIXdzVGltZVBhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgIGJSZXQgJj0gRlhfVGltZUZvcm1hdCh3c1RpbWVQYXR0ZXJuLCBwTG9jYWxlLCBkdCwgd3NUaW1lT3V0KTsNCisgIH0NCisgIHdzT3V0cHV0ID0gYkRhdGVGaXJzdCA/IHdzRGF0ZU91dCArIHdzVGltZU91dCA6IHdzVGltZU91dCArIHdzRGF0ZU91dDsNCisgIHJldHVybiBiUmV0Ow0KIH0NCi0jZGVmaW5lIEZYTUFUSF9ERUNJTUFMX1NDQUxFTElNSVQJCQkJMHgxYw0KLSNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfTkVHTUFTSwkJCQkJKDB4ODAwMDAwMDBMKQ0KLSNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfRk9SQ0VCT09MKHgpCQkJCSghKCEoeCkpKQ0KLSNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKE5FRywgU0NBTEUpCSgoKFNDQUxFKSA8PCAweDEwKSB8ICgoTkVHKSA/IEZYTUFUSF9ERUNJTUFMX05FR01BU0sgOiAwKSkNCi0jZGVmaW5lIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhGTEFHUykJCQlGWE1BVEhfREVDSU1BTF9GT1JDRUJPT0woKEZMQUdTKSAmIEZYTUFUSF9ERUNJTUFMX05FR01BU0spDQotI2RlZmluZSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShGTEFHUykJCSgodWludDhfdCkoKChGTEFHUykgJiB+RlhNQVRIX0RFQ0lNQUxfTkVHTUFTSykgPj4gMHgxMCkpDQotI2RlZmluZSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVCh4KQkJCSgoeCk+PjB4MTA+PjB4MTApDQotI2RlZmluZSBGWE1BVEhfREVDSU1BTF9MU0hJRlQzMkJJVCh4KQkJCSgoeCk8PDB4MTA8PDB4MTApDQotc3RhdGljIGlubGluZSB1aW50OF90IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMCh1aW50NjRfdCYgcGhpLCB1aW50NjRfdCYgcG1pZCwgdWludDY0X3QmIHBsbykNCi17DQotICAgIHVpbnQ4X3QgcmV0VmFsOw0KLSAgICBwbWlkICs9IEZYTUFUSF9ERUNJTUFMX0xTSElGVDMyQklUKHBoaSAlIDB4QSk7DQotICAgIHBoaSAgLz0gMHhBOw0KLSAgICBwbG8gKz0gRlhNQVRIX0RFQ0lNQUxfTFNISUZUMzJCSVQocG1pZCAlIDB4QSk7DQotICAgIHBtaWQgLz0gMHhBOw0KLSAgICByZXRWYWwgPSBwbG8gJSAweEE7DQotICAgIHBsbyAvPSAweEE7DQotICAgIHJldHVybiByZXRWYWw7DQotfQ0KLXN0YXRpYyBpbmxpbmUgdWludDhfdCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTBfYW55KHVpbnQ2NF90IG51bXNbXSwgdWludDhfdCBudW1jb3VudCkNCi17DQotICAgIHVpbnQ4X3QgcmV0VmFsID0gMDsNCi0gICAgZm9yKGludCBpID0gbnVtY291bnQgLSAxOyBpID4gMDsgaSAtLSkgew0KLSAgICAgICAgbnVtc1tpIC0gMV0gKz0gRlhNQVRIX0RFQ0lNQUxfTFNISUZUMzJCSVQobnVtc1tpXSAlIDB4QSk7DQotICAgICAgICBudW1zW2ldICAgLz0gMHhBOw0KLSAgICB9DQotICAgIGlmKG51bWNvdW50KSB7DQotICAgICAgICByZXRWYWwgID0gIG51bXNbMF0gJSAweEE7DQotICAgICAgICBudW1zWzBdIC89IDB4QTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcmV0VmFsOw0KLX0NCi1zdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwKHVpbnQ2NF90JiBwaGksIHVpbnQ2NF90JiBwbWlkLCB1aW50NjRfdCYgcGxvKQ0KLXsNCi0gICAgcGxvICAqPSAweEE7DQotICAgIHBtaWQgPSBwbWlkICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocGxvKTsNCi0gICAgcGxvICA9ICh1aW50MzJfdClwbG87DQotICAgIHBoaSAgPSBwaGkgKiAweEEgKyBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChwbWlkKTsNCi0gICAgcG1pZCA9ICh1aW50MzJfdClwbWlkOw0KLX0NCi1zdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwX2FueSh1aW50NjRfdCBudW1zW10sIHVpbnQ4X3QgbnVtY291bnQpDQotew0KLSAgICBudW1zWzBdICo9IDB4QTsNCi0gICAgZm9yKGludCBpID0gMTsgaSA8IG51bWNvdW50OyBpKyspIHsNCi0gICAgICAgIG51bXNbaV0gPSBudW1zW2ldICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQgKG51bXNbaSAtIDFdKTsNCi0gICAgICAgIG51bXNbaSAtIDFdID0gKHVpbnQzMl90KW51bXNbaSAtIDFdOw0KLSAgICB9DQotfQ0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplKHVpbnQ2NF90JiBwaGksIHVpbnQ2NF90JiBwbWlkLCB1aW50NjRfdCYgcGxvKQ0KLXsNCi0gICAgcGhpICArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChwbWlkKTsNCi0gICAgcG1pZCA9ICh1aW50MzJfdClwbWlkOw0KLSAgICBwbWlkICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBsbyk7DQotICAgIHBsbyAgPSAodWludDMyX3QpcGxvOw0KLSAgICBwaGkgICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBtaWQpOw0KLSAgICBwbWlkID0gKHVpbnQzMl90KXBtaWQ7DQotfQ0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplX2FueSh1aW50NjRfdCBudW1zW10sIHVpbnQ4X3QgbGVuKQ0KLXsNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gbGVuIC0gMjsgaSA+IDA7IGkgLS0pIHsNCi0gICAgICAgICAgICBudW1zW2kgKyAxXSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChudW1zW2ldKTsNCi0gICAgICAgICAgICBudW1zW2ldID0gKHVpbnQzMl90KW51bXNbaV07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGxlbiAtIDE7IGkgKyspIHsNCi0gICAgICAgICAgICBudW1zW2kgKyAxXSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChudW1zW2ldKTsNCi0gICAgICAgICAgICBudW1zW2ldID0gKHVpbnQzMl90KW51bXNbaV07DQotICAgICAgICB9DQotICAgIH0NCi19DQotc3RhdGljIGlubGluZSBpbnQ4X3QgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlKHVpbnQzMl90IGhpMSwgdWludDMyX3QgbWlkMSwgdWludDMyX3QgbG8xLCB1aW50MzJfdCBoaTIsIHVpbnQzMl90IG1pZDIsIHVpbnQzMl90IGxvMikNCi17DQotICAgIGludDhfdCByZXRWYWwgPSAwOw0KLSAgICBpZiAoIXJldFZhbCkgew0KLSAgICAgICAgcmV0VmFsICs9IChoaTEgPiBoaTIgPyAxIDogKGhpMSA8IGhpMiA/IC0xIDogMCkpOw0KLSAgICB9DQotICAgIGlmICghcmV0VmFsKSB7DQotICAgICAgICByZXRWYWwgKz0gKG1pZDEgPiBtaWQyID8gMSA6IChtaWQxIDwgbWlkMiA/IC0xIDogMCkpOw0KLSAgICB9DQotICAgIGlmICghcmV0VmFsKSB7DQotICAgICAgICByZXRWYWwgKz0gKGxvMSA+IGxvMiA/IDEgOiAobG8xIDwgbG8yID8gLTEgOiAwKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJldFZhbDsNCi19DQotc3RhdGljIGlubGluZSBpbnQ4X3QgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlX2FueSh1aW50NjRfdCBhW10sIHVpbnQ4X3QgYWwsIHVpbnQ2NF90IGJbXSwgdWludDhfdCBibCkNCi17DQotICAgIGludDhfdCByZXRWYWwgPSAwOw0KLSAgICBmb3IoaW50IGkgPSBGWF9NQVgoYWwgLSAxLCBibCAtIDEpOyBpID49IDA7IGkgLS0pIHsNCi0gICAgICAgIHVpbnQ2NF90IGwgPSAoaSA+PSBhbCA/IDAgOiBhW2ldKSwgciA9IChpID49IGJsID8gMCA6IGJbaV0pOw0KLSAgICAgICAgcmV0VmFsICs9IChsID4gciA/IDEgOiAobCA8IHIgPyAtMSA6IDApKTsNCi0gICAgICAgIGlmKHJldFZhbCkgew0KLSAgICAgICAgICAgIHJldHVybiByZXRWYWw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIHJldFZhbDsNCi19DQotc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kZWNfYW55KHVpbnQ2NF90IGFbXSwgdWludDhfdCBhbCkNCi17DQotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhbDsgaSArKykgew0KLSAgICAgICAgaWYoYVtpXS0tKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfaW5jX2FueSh1aW50NjRfdCBhW10sIHVpbnQ4X3QgYWwpDQotew0KLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgYWw7IGkgKyspIHsNCi0gICAgICAgIGFbaV0rKzsNCi0gICAgICAgIGlmKCh1aW50MzJfdClhW2ldID09IGFbaV0pIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBhW2ldID0gMDsNCi0gICAgfQ0KLX0NCi1zdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19tdWwodWludDY0X3QgYVtdLCB1aW50OF90IGFsLCB1aW50NjRfdCBiW10sIHVpbnQ4X3QgYmwsIHVpbnQ2NF90IGNbXSwgdWludDhfdCBjbCkNCi17DQotICAgIGFzc2VydChhbCArIGJsIDw9IGNsKTsNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNsOyBpKyspIHsNCi0gICAgICAgICAgICBjW2ldID0gMDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB7DQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgYWw7IGkrKykgew0KLSAgICAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBibDsgaisrKSB7DQotICAgICAgICAgICAgICAgIHVpbnQ2NF90IG0gPSAodWludDY0X3QpYVtpXSAqIGJbal07DQotICAgICAgICAgICAgICAgIGNbaSArIGpdICs9ICh1aW50MzJfdCltOw0KLSAgICAgICAgICAgICAgICBjW2kgKyBqICsgMV0gKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQobSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHsNCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjbCAtIDE7IGkrKykgew0KLSAgICAgICAgICAgIGNbaSArIDFdICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKGNbaV0pOw0KLSAgICAgICAgICAgIGNbaV0gPSAodWludDMyX3QpY1tpXTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB7DQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgY2w7IGkrKykgew0KLSAgICAgICAgICAgIGNbaV0gPSAodWludDMyX3QpY1tpXTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi1zdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19kaXYodWludDY0X3QgYVtdLCB1aW50OF90IGFsLCB1aW50NjRfdCBiW10sIHVpbnQ4X3QgYmwsIHVpbnQ2NF90IGNbXSwgdWludDhfdCBjbCkNCi17DQotICAgIGludCBpOw0KLSAgICBmb3IoaSA9IDA7IGkgPCBjbDsgaSsrKSB7DQotICAgICAgICBjW2ldID0gMDsNCi0gICAgfQ0KLSAgICB1aW50NjRfdCBsZWZ0WzE2XSA9IHswfSwgcmlnaHRbMTZdID0gezB9Ow0KLSAgICBsZWZ0WzBdID0gMDsNCi0gICAgZm9yKGkgPSAwOyBpIDwgYWw7IGkrKykgew0KLSAgICAgICAgcmlnaHRbaV0gPSBhW2ldOw0KLSAgICB9DQotICAgIHVpbnQ2NF90IHRtcFsxNl07DQotICAgIHdoaWxlKGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZV9hbnkobGVmdCwgYWwsIHJpZ2h0LCBhbCkgPD0gMCkgew0KLSAgICAgICAgdWludDY0X3QgY3VyWzE2XTsNCi0gICAgICAgIGZvcihpID0gMDsgaSA8IGFsOyBpKyspIHsNCi0gICAgICAgICAgICBjdXJbaV0gPSBsZWZ0W2ldICsgcmlnaHRbaV07DQotICAgICAgICB9DQotICAgICAgICBmb3IoaSA9IGFsIC0gMTsgaSA+PSAwOyBpLS0pIHsNCi0gICAgICAgICAgICBpZihpKSB7DQotICAgICAgICAgICAgICAgIGN1cltpIC0gMV0gKz0gRlhNQVRIX0RFQ0lNQUxfTFNISUZUMzJCSVQoY3VyW2ldICUgMik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGN1cltpXSAvPSAyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19tdWwoY3VyLCBhbCwgYiwgYmwsIHRtcCwgMTYpOw0KLSAgICAgICAgc3dpdGNoKGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZV9hbnkodG1wLCAxNiwgYSwgYWwpKSB7DQotICAgICAgICAgICAgY2FzZSAtMToNCi0gICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgbGVmdFtpXSA9IGN1cltpXTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBsZWZ0WzBdKys7DQotICAgICAgICAgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9ub3JtYWxpemVfYW55KGxlZnQsIGFsKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICByaWdodFtpXSA9IGN1cltpXTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGVjX2FueShyaWdodCwgYWwpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IEZYX01JTihhbCwgY2wpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGNbaV0gPSBjdXJbaV07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGZvcihpID0gMDsgaSA8IEZYX01JTihhbCwgY2wpOyBpKyspIHsNCi0gICAgICAgIGNbaV0gPSBsZWZ0W2ldOw0KLSAgICB9DQotfQ0KLXN0YXRpYyBpbmxpbmUgRlhfQk9PTCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfb3V0b2ZyYW5nZSh1aW50NjRfdCBhW10sIHVpbnQ4X3QgYWwsIHVpbnQ4X3QgZ29hbCkNCi17DQotICAgIGZvcihpbnQgaSA9IGdvYWw7IGkgPCBhbDsgaSsrKSB7DQotICAgICAgICBpZihhW2ldKSB7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCitGWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgaWYgKHdzU3JjRGF0ZVRpbWUuSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1zdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Nocmlua2ludG9yYW5nZSh1aW50NjRfdCBhW10sIHVpbnQ4X3QgYWwsIHVpbnQ4X3QgZ29hbCwgdWludDhfdCYgc2NhbGUpDQotew0KLSAgICBGWF9CT09MIGJSb3VuZFVwID0gRkFMU0U7DQotICAgIHdoaWxlKHNjYWxlICE9IDAgJiYgKHNjYWxlID4gRlhNQVRIX0RFQ0lNQUxfU0NBTEVMSU1JVCB8fCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfb3V0b2ZyYW5nZShhLCBhbCwgZ29hbCkpKSB7DQotICAgICAgICBiUm91bmRVcCA9IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMF9hbnkoYSwgYWwpID49IDU7DQotICAgICAgICBzY2FsZSAtLTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm47DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgIEZYX0RBVEVUSU1FVFlQRSBlQ2F0ZWdvcnkgPQ0KKyAgICAgIEdldERhdGVUaW1lRm9ybWF0KHdzUGF0dGVybiwgcExvY2FsZSwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybik7DQorICBpZiAocExvY2FsZSA9PSBOVUxMIHx8IGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVW5rbm93bikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfVW5pdGltZSBkdCgwKTsNCisgIGludDMyX3QgaVQgPSB3c1NyY0RhdGVUaW1lLkZpbmQoTCJUIik7DQorICBpZiAoaVQgPCAwKSB7DQorICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX0RhdGUpIHsNCisgICAgICBGWF9EYXRlRnJvbUNhbm9uaWNhbCh3c1NyY0RhdGVUaW1lLCBkdCk7DQorICAgIH0gZWxzZSBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9UaW1lKSB7DQorICAgICAgRlhfVGltZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZSwgZHQsIHBMb2NhbGUpOw0KICAgICB9DQotICAgIGlmKGJSb3VuZFVwKSB7DQotICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplX2FueShhLCBnb2FsKTsNCi0gICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9pbmNfYW55KGEsIGdvYWwpOw0KLSAgICB9DQorICB9IGVsc2Ugew0KKyAgICBGWF9EYXRlRnJvbUNhbm9uaWNhbCh3c1NyY0RhdGVUaW1lLkxlZnQoaVQpLCBkdCk7DQorICAgIEZYX1RpbWVGcm9tQ2Fub25pY2FsKA0KKyAgICAgICAgd3NTcmNEYXRlVGltZS5SaWdodCh3c1NyY0RhdGVUaW1lLkdldExlbmd0aCgpIC0gaVQgLSAxKSwgZHQsIHBMb2NhbGUpOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX0Zvcm1hdERhdGVUaW1lKGR0LCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDYXRlZ29yeSAhPSBGWF9EQVRFVElNRVRZUEVfVGltZURhdGUsIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQpOw0KIH0NCi1zdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3RydW5jYXRlKHVpbnQ2NF90JiBwaGksIHVpbnQ2NF90JiBwbWlkLCB1aW50NjRfdCYgcGxvLCB1aW50OF90JiBzY2FsZSwgdWludDhfdCBtaW5zY2FsZSA9IDApDQotew0KLSAgICB3aGlsZShzY2FsZSA+IG1pbnNjYWxlKSB7DQotICAgICAgICB1aW50NjRfdCB0aGkgPSBwaGksIHRtaWQgPSBwbWlkLCB0bG8gPSBwbG87DQotICAgICAgICBpZihmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTAodGhpLCB0bWlkLCB0bG8pICE9IDApIHsNCi0gICAgICAgICAgICBicmVhazsNCitGWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlKSB7DQorICBpZiAod3NTcmNEYXRlVGltZS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuOw0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQorICBGWF9EQVRFVElNRVRZUEUgZUNhdGVnb3J5ID0NCisgICAgICBHZXREYXRlVGltZUZvcm1hdCh3c1BhdHRlcm4sIHBMb2NhbGUsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4pOw0KKyAgaWYgKCFwTG9jYWxlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1Vua25vd24pIHsNCisgICAgaWYgKGVEYXRlVGltZVR5cGUgPT0gRlhfREFURVRJTUVUWVBFX1RpbWUpIHsNCisgICAgICB3c1RpbWVQYXR0ZXJuID0gd3NEYXRlUGF0dGVybjsNCisgICAgICB3c0RhdGVQYXR0ZXJuLkVtcHR5KCk7DQorICAgIH0NCisgICAgZUNhdGVnb3J5ID0gZURhdGVUaW1lVHlwZTsNCisgIH0NCisgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1Vua25vd24pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUgZHQoMCk7DQorICBpbnQzMl90IGlUID0gd3NTcmNEYXRlVGltZS5GaW5kKEwiVCIpOw0KKyAgaWYgKGlUIDwgMCkgew0KKyAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9EYXRlICYmDQorICAgICAgICBGWF9EYXRlRnJvbUNhbm9uaWNhbCh3c1NyY0RhdGVUaW1lLCBkdCkpIHsNCisgICAgICByZXR1cm4gRlhfRm9ybWF0RGF0ZVRpbWUoZHQsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4sIFRSVUUsIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0KTsNCisgICAgfSBlbHNlIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1RpbWUgJiYNCisgICAgICAgICAgICAgICBGWF9UaW1lRnJvbUNhbm9uaWNhbCh3c1NyY0RhdGVUaW1lLCBkdCwgcExvY2FsZSkpIHsNCisgICAgICByZXR1cm4gRlhfRm9ybWF0RGF0ZVRpbWUoZHQsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4sIFRSVUUsIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0KTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzU3JjRGF0ZSgoY29uc3QgRlhfV0NIQVIqKXdzU3JjRGF0ZVRpbWUsIGlUKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzU3JjVGltZSgoY29uc3QgRlhfV0NIQVIqKXdzU3JjRGF0ZVRpbWUgKyBpVCArIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NTcmNEYXRlVGltZS5HZXRMZW5ndGgoKSAtIGlUIC0gMSk7DQorICAgIGlmICh3c1NyY0RhdGUuSXNFbXB0eSgpIHx8IHdzU3JjVGltZS5Jc0VtcHR5KCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKEZYX0RhdGVGcm9tQ2Fub25pY2FsKHdzU3JjRGF0ZSwgZHQpICYmDQorICAgICAgICBGWF9UaW1lRnJvbUNhbm9uaWNhbCh3c1NyY1RpbWUsIGR0LCBwTG9jYWxlKSkgew0KKyAgICAgIHJldHVybiBGWF9Gb3JtYXREYXRlVGltZShkdCwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIGR0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybjsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgRlhfREFURVRJTUVUWVBFIGVDYXRlZ29yeSA9DQorICAgICAgR2V0RGF0ZVRpbWVGb3JtYXQod3NQYXR0ZXJuLCBwTG9jYWxlLCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuKTsNCisgIGlmICghcExvY2FsZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gRlhfRm9ybWF0RGF0ZVRpbWUoZHQsIHdzUGF0dGVybiwgd3NUaW1lUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ2F0ZWdvcnkgIT0gRlhfREFURVRJTUVUWVBFX1RpbWVEYXRlLCBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0KTsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXRaZXJvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0Ow0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9DQorICAgICAgR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEZYX1dTVFJDKEwiemVybyIpLCB3c1RleHRGb3JtYXQpOw0KKyAgaW50MzJfdCBpUGF0dGVybiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4gPSAoY29uc3QgRlhfV0NIQVIqKXdzVGV4dEZvcm1hdDsNCisgIGludDMyX3QgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7DQorICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybikgew0KKyAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcJycpIHsNCisgICAgICB3c091dHB1dCArPSBGWF9HZXRMaXRlcmFsVGV4dChwU3RyUGF0dGVybiwgaVBhdHRlcm4sIGlMZW5QYXR0ZXJuKTsNCisgICAgICBpUGF0dGVybisrOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdzT3V0cHV0ICs9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuKytdOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXROdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0Ow0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9DQorICAgICAgR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEZYX1dTVFJDKEwibnVsbCIpLCB3c1RleHRGb3JtYXQpOw0KKyAgaW50MzJfdCBpUGF0dGVybiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4gPSAoY29uc3QgRlhfV0NIQVIqKXdzVGV4dEZvcm1hdDsNCisgIGludDMyX3QgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7DQorICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybikgew0KKyAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcJycpIHsNCisgICAgICB3c091dHB1dCArPSBGWF9HZXRMaXRlcmFsVGV4dChwU3RyUGF0dGVybiwgaVBhdHRlcm4sIGlMZW5QYXR0ZXJuKTsNCisgICAgICBpUGF0dGVybisrOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdzT3V0cHV0ICs9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuKytdOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorSUZYX0xvY2FsZSogQ0ZYX0Zvcm1hdFN0cmluZzo6R2V0UGF0dGVybkxvY2FsZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xvY2FsZSkgew0KKyAgaWYgKG1fYlVzZUxDSUQpIHsNCisgIH0NCisgIHJldHVybiBtX3BMb2NhbGVNZ3ItPkdldExvY2FsZUJ5TmFtZSh3c0xvY2FsZSk7DQorfQ0KKyNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfU0NBTEVMSU1JVCAweDFjDQorI2RlZmluZSBGWE1BVEhfREVDSU1BTF9ORUdNQVNLICgweDgwMDAwMDAwTCkNCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX0ZPUkNFQk9PTCh4KSAoISghKHgpKSkNCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUyhORUcsIFNDQUxFKSBcDQorICAoKChTQ0FMRSkgPDwgMHgxMCkgfCAoKE5FRykgPyBGWE1BVEhfREVDSU1BTF9ORUdNQVNLIDogMCkpDQorI2RlZmluZSBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcoRkxBR1MpIFwNCisgIEZYTUFUSF9ERUNJTUFMX0ZPUkNFQk9PTCgoRkxBR1MpJkZYTUFUSF9ERUNJTUFMX05FR01BU0spDQorI2RlZmluZSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShGTEFHUykgXA0KKyAgKCh1aW50OF90KSgoKEZMQUdTKSAmIH5GWE1BVEhfREVDSU1BTF9ORUdNQVNLKSA+PiAweDEwKSkNCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHgpICgoeCkgPj4gMHgxMCA+PiAweDEwKQ0KKyNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfTFNISUZUMzJCSVQoeCkgKCh4KSA8PCAweDEwIDw8IDB4MTApDQorc3RhdGljIGlubGluZSB1aW50OF90IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMCh1aW50NjRfdCYgcGhpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBtaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCYgcGxvKSB7DQorICB1aW50OF90IHJldFZhbDsNCisgIHBtaWQgKz0gRlhNQVRIX0RFQ0lNQUxfTFNISUZUMzJCSVQocGhpICUgMHhBKTsNCisgIHBoaSAvPSAweEE7DQorICBwbG8gKz0gRlhNQVRIX0RFQ0lNQUxfTFNISUZUMzJCSVQocG1pZCAlIDB4QSk7DQorICBwbWlkIC89IDB4QTsNCisgIHJldFZhbCA9IHBsbyAlIDB4QTsNCisgIHBsbyAvPSAweEE7DQorICByZXR1cm4gcmV0VmFsOw0KK30NCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwX2FueSh1aW50NjRfdCBudW1zW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1jb3VudCkgew0KKyAgdWludDhfdCByZXRWYWwgPSAwOw0KKyAgZm9yIChpbnQgaSA9IG51bWNvdW50IC0gMTsgaSA+IDA7IGktLSkgew0KKyAgICBudW1zW2kgLSAxXSArPSBGWE1BVEhfREVDSU1BTF9MU0hJRlQzMkJJVChudW1zW2ldICUgMHhBKTsNCisgICAgbnVtc1tpXSAvPSAweEE7DQorICB9DQorICBpZiAobnVtY291bnQpIHsNCisgICAgcmV0VmFsID0gbnVtc1swXSAlIDB4QTsNCisgICAgbnVtc1swXSAvPSAweEE7DQorICB9DQorICByZXR1cm4gcmV0VmFsOw0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwKHVpbnQ2NF90JiBwaGksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCYgcG1pZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiBwbG8pIHsNCisgIHBsbyAqPSAweEE7DQorICBwbWlkID0gcG1pZCAqIDB4QSArIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBsbyk7DQorICBwbG8gPSAodWludDMyX3QpcGxvOw0KKyAgcGhpID0gcGhpICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocG1pZCk7DQorICBwbWlkID0gKHVpbnQzMl90KXBtaWQ7DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbXVsMTBfYW55KHVpbnQ2NF90IG51bXNbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bWNvdW50KSB7DQorICBudW1zWzBdICo9IDB4QTsNCisgIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtY291bnQ7IGkrKykgew0KKyAgICBudW1zW2ldID0gbnVtc1tpXSAqIDB4QSArIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKG51bXNbaSAtIDFdKTsNCisgICAgbnVtc1tpIC0gMV0gPSAodWludDMyX3QpbnVtc1tpIC0gMV07DQorICB9DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplKHVpbnQ2NF90JiBwaGksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBtaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBsbykgew0KKyAgcGhpICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBtaWQpOw0KKyAgcG1pZCA9ICh1aW50MzJfdClwbWlkOw0KKyAgcG1pZCArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChwbG8pOw0KKyAgcGxvID0gKHVpbnQzMl90KXBsbzsNCisgIHBoaSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChwbWlkKTsNCisgIHBtaWQgPSAodWludDMyX3QpcG1pZDsNCit9DQorc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9ub3JtYWxpemVfYW55KHVpbnQ2NF90IG51bXNbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsZW4pIHsNCisgIHsNCisgICAgZm9yIChpbnQgaSA9IGxlbiAtIDI7IGkgPiAwOyBpLS0pIHsNCisgICAgICBudW1zW2kgKyAxXSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChudW1zW2ldKTsNCisgICAgICBudW1zW2ldID0gKHVpbnQzMl90KW51bXNbaV07DQorICAgIH0NCisgIH0NCisgIHsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspIHsNCisgICAgICBudW1zW2kgKyAxXSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChudW1zW2ldKTsNCisgICAgICBudW1zW2ldID0gKHVpbnQzMl90KW51bXNbaV07DQorICAgIH0NCisgIH0NCit9DQorc3RhdGljIGlubGluZSBpbnQ4X3QgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlKHVpbnQzMl90IGhpMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWlkMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbG8xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoaTIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1pZDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxvMikgew0KKyAgaW50OF90IHJldFZhbCA9IDA7DQorICBpZiAoIXJldFZhbCkgew0KKyAgICByZXRWYWwgKz0gKGhpMSA+IGhpMiA/IDEgOiAoaGkxIDwgaGkyID8gLTEgOiAwKSk7DQorICB9DQorICBpZiAoIXJldFZhbCkgew0KKyAgICByZXRWYWwgKz0gKG1pZDEgPiBtaWQyID8gMSA6IChtaWQxIDwgbWlkMiA/IC0xIDogMCkpOw0KKyAgfQ0KKyAgaWYgKCFyZXRWYWwpIHsNCisgICAgcmV0VmFsICs9IChsbzEgPiBsbzIgPyAxIDogKGxvMSA8IGxvMiA/IC0xIDogMCkpOw0KKyAgfQ0KKyAgcmV0dXJuIHJldFZhbDsNCit9DQorc3RhdGljIGlubGluZSBpbnQ4X3QgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlX2FueSh1aW50NjRfdCBhW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYltdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBibCkgew0KKyAgaW50OF90IHJldFZhbCA9IDA7DQorICBmb3IgKGludCBpID0gRlhfTUFYKGFsIC0gMSwgYmwgLSAxKTsgaSA+PSAwOyBpLS0pIHsNCisgICAgdWludDY0X3QgbCA9IChpID49IGFsID8gMCA6IGFbaV0pLCByID0gKGkgPj0gYmwgPyAwIDogYltpXSk7DQorICAgIHJldFZhbCArPSAobCA+IHIgPyAxIDogKGwgPCByID8gLTEgOiAwKSk7DQorICAgIGlmIChyZXRWYWwpIHsNCisgICAgICByZXR1cm4gcmV0VmFsOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcmV0VmFsOw0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RlY19hbnkodWludDY0X3QgYVtdLCB1aW50OF90IGFsKSB7DQorICBmb3IgKGludCBpID0gMDsgaSA8IGFsOyBpKyspIHsNCisgICAgaWYgKGFbaV0tLSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2luY19hbnkodWludDY0X3QgYVtdLCB1aW50OF90IGFsKSB7DQorICBmb3IgKGludCBpID0gMDsgaSA8IGFsOyBpKyspIHsNCisgICAgYVtpXSsrOw0KKyAgICBpZiAoKHVpbnQzMl90KWFbaV0gPT0gYVtpXSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBhW2ldID0gMDsNCisgIH0NCit9DQorc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfbXVsKHVpbnQ2NF90IGFbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYltdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2wpIHsNCisgIGFzc2VydChhbCArIGJsIDw9IGNsKTsNCisgIHsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbDsgaSsrKSB7DQorICAgICAgY1tpXSA9IDA7DQorICAgIH0NCisgIH0NCisgIHsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbDsgaSsrKSB7DQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBibDsgaisrKSB7DQorICAgICAgICB1aW50NjRfdCBtID0gKHVpbnQ2NF90KWFbaV0gKiBiW2pdOw0KKyAgICAgICAgY1tpICsgal0gKz0gKHVpbnQzMl90KW07DQorICAgICAgICBjW2kgKyBqICsgMV0gKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQobSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICB7DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2wgLSAxOyBpKyspIHsNCisgICAgICBjW2kgKyAxXSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChjW2ldKTsNCisgICAgICBjW2ldID0gKHVpbnQzMl90KWNbaV07DQorICAgIH0NCisgIH0NCisgIHsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbDsgaSsrKSB7DQorICAgICAgY1tpXSA9ICh1aW50MzJfdCljW2ldOw0KKyAgICB9DQorICB9DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2Rpdih1aW50NjRfdCBhW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBibCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY1tdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNsKSB7DQorICBpbnQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBjbDsgaSsrKSB7DQorICAgIGNbaV0gPSAwOw0KKyAgfQ0KKyAgdWludDY0X3QgbGVmdFsxNl0gPSB7MH0sIHJpZ2h0WzE2XSA9IHswfTsNCisgIGxlZnRbMF0gPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IGFsOyBpKyspIHsNCisgICAgcmlnaHRbaV0gPSBhW2ldOw0KKyAgfQ0KKyAgdWludDY0X3QgdG1wWzE2XTsNCisgIHdoaWxlIChmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2NvbXBhcmVfYW55KGxlZnQsIGFsLCByaWdodCwgYWwpIDw9IDApIHsNCisgICAgdWludDY0X3QgY3VyWzE2XTsNCisgICAgZm9yIChpID0gMDsgaSA8IGFsOyBpKyspIHsNCisgICAgICBjdXJbaV0gPSBsZWZ0W2ldICsgcmlnaHRbaV07DQorICAgIH0NCisgICAgZm9yIChpID0gYWwgLSAxOyBpID49IDA7IGktLSkgew0KKyAgICAgIGlmIChpKSB7DQorICAgICAgICBjdXJbaSAtIDFdICs9IEZYTUFUSF9ERUNJTUFMX0xTSElGVDMyQklUKGN1cltpXSAlIDIpOw0KKyAgICAgIH0NCisgICAgICBjdXJbaV0gLz0gMjsNCisgICAgfQ0KKyAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X211bChjdXIsIGFsLCBiLCBibCwgdG1wLCAxNik7DQorICAgIHN3aXRjaCAoZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlX2FueSh0bXAsIDE2LCBhLCBhbCkpIHsNCisgICAgICBjYXNlIC0xOg0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsNCisgICAgICAgICAgbGVmdFtpXSA9IGN1cltpXTsNCiAgICAgICAgIH0NCi0gICAgICAgIHBoaSA9IHRoaSwgcG1pZCA9IHRtaWQsIHBsbyA9IHRsbzsNCi0gICAgICAgIHNjYWxlLS07DQorICAgICAgICBsZWZ0WzBdKys7DQorICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplX2FueShsZWZ0LCBhbCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDE6DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgew0KKyAgICAgICAgICByaWdodFtpXSA9IGN1cltpXTsNCisgICAgICAgIH0NCisgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kZWNfYW55KHJpZ2h0LCBhbCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDA6DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRlhfTUlOKGFsLCBjbCk7IGkrKykgew0KKyAgICAgICAgICBjW2ldID0gY3VyW2ldOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuOw0KICAgICB9DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgRlhfTUlOKGFsLCBjbCk7IGkrKykgew0KKyAgICBjW2ldID0gbGVmdFtpXTsNCisgIH0NCiB9DQotQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKCkNCi17DQotICAgIG1fdUxvID0gbV91TWlkID0gbV91SGkgPSBtX3VGbGFncyA9IDA7DQotfQ0KLUNGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbCh1aW50NjRfdCB2YWwpDQotew0KLSAgICBtX3VMbyAgPSAodWludDMyX3QpdmFsOw0KLSAgICBtX3VNaWQgPSAodWludDMyX3QpRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQodmFsKTsNCi0gICAgbV91SGkgID0gMDsNCi0gICAgbV91RmxhZ3MgPSAwOw0KLX0NCi1DRlhfRGVjaW1hbDo6Q0ZYX0RlY2ltYWwodWludDMyX3QgdmFsKQ0KLXsNCi0gICAgbV91TG8gPSAgKHVpbnQzMl90KXZhbDsNCi0gICAgbV91TWlkID0gbV91SGkgPSAwOw0KLSAgICBtX3VGbGFncyA9IDA7DQotfQ0KLUNGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbCh1aW50MzJfdCBsbywgdWludDMyX3QgbWlkLCB1aW50MzJfdCBoaSwgRlhfQk9PTCBuZWcsIHVpbnQ4X3Qgc2NhbGUpDQotew0KLSAgICBzY2FsZSA9IChzY2FsZSA+IEZYTUFUSF9ERUNJTUFMX1NDQUxFTElNSVQgPyAwIDogc2NhbGUpOw0KLSAgICBtX3VMbyA9IGxvOw0KLSAgICBtX3VNaWQgPSBtaWQ7DQotICAgIG1fdUhpID0gaGk7DQotICAgIG1fdUZsYWdzID0gRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKG5lZyAmJiBJc05vdFplcm8oKSwgc2NhbGUpOw0KLX0NCi1DRlhfRGVjaW1hbDo6Q0ZYX0RlY2ltYWwoaW50MzJfdCB2YWwpDQotew0KLSAgICBpZih2YWwgPj0gMCkgew0KLSAgICAgICAgKnRoaXMgPSBDRlhfRGVjaW1hbCgodWludDMyX3QpdmFsKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgICp0aGlzID0gQ0ZYX0RlY2ltYWwoKHVpbnQzMl90KSAtIHZhbCk7DQotICAgICAgICBTZXROZWdhdGUoKTsNCitzdGF0aWMgaW5saW5lIEZYX0JPT0wgZnhtYXRoX2RlY2ltYWxfaGVscGVyX291dG9mcmFuZ2UodWludDY0X3QgYVtdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGdvYWwpIHsNCisgIGZvciAoaW50IGkgPSBnb2FsOyBpIDwgYWw7IGkrKykgew0KKyAgICBpZiAoYVtpXSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KICAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUNGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChpbnQ2NF90IHZhbCkNCi17DQotICAgIGlmKHZhbCA+PSAwKSB7DQotICAgICAgICAqdGhpcyA9IENGWF9EZWNpbWFsKCh1aW50NjRfdCl2YWwpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgKnRoaXMgPSBDRlhfRGVjaW1hbCgodWludDY0X3QpIC0gdmFsKTsNCi0gICAgICAgIFNldE5lZ2F0ZSgpOw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfc2hyaW5raW50b3JhbmdlKHVpbnQ2NF90IGFbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ29hbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBzY2FsZSkgew0KKyAgRlhfQk9PTCBiUm91bmRVcCA9IEZBTFNFOw0KKyAgd2hpbGUgKHNjYWxlICE9IDAgJiYgKHNjYWxlID4gRlhNQVRIX0RFQ0lNQUxfU0NBTEVMSU1JVCB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9vdXRvZnJhbmdlKGEsIGFsLCBnb2FsKSkpIHsNCisgICAgYlJvdW5kVXAgPSBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTBfYW55KGEsIGFsKSA+PSA1Ow0KKyAgICBzY2FsZS0tOw0KKyAgfQ0KKyAgaWYgKGJSb3VuZFVwKSB7DQorICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9ub3JtYWxpemVfYW55KGEsIGdvYWwpOw0KKyAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfaW5jX2FueShhLCBnb2FsKTsNCisgIH0NCit9DQorc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl90cnVuY2F0ZSh1aW50NjRfdCYgcGhpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBtaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCYgcGxvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgc2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1pbnNjYWxlID0gMCkgew0KKyAgd2hpbGUgKHNjYWxlID4gbWluc2NhbGUpIHsNCisgICAgdWludDY0X3QgdGhpID0gcGhpLCB0bWlkID0gcG1pZCwgdGxvID0gcGxvOw0KKyAgICBpZiAoZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwKHRoaSwgdG1pZCwgdGxvKSAhPSAwKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCisgICAgcGhpID0gdGhpLCBwbWlkID0gdG1pZCwgcGxvID0gdGxvOw0KKyAgICBzY2FsZS0tOw0KKyAgfQ0KIH0NCi1DRlhfRGVjaW1hbDo6Q0ZYX0RlY2ltYWwoRlhfRkxPQVQgdmFsLCB1aW50OF90IHNjYWxlICkNCi17DQotICAgIEZYX0ZMT0FUIG5ld3ZhbCA9IGZhYnModmFsKTsNCi0gICAgdWludDY0X3QgcGhpLCBwbWlkLCBwbG87DQotICAgIHBsbyA9ICAodWludDY0X3QpbmV3dmFsOw0KLSAgICBwbWlkID0gKHVpbnQ2NF90KShuZXd2YWwgLyAxZTMyKTsNCi0gICAgcGhpID0gICh1aW50NjRfdCkobmV3dmFsIC8gMWU2NCk7DQorQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKCkgew0KKyAgbV91TG8gPSBtX3VNaWQgPSBtX3VIaSA9IG1fdUZsYWdzID0gMDsNCit9DQorQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKHVpbnQ2NF90IHZhbCkgew0KKyAgbV91TG8gPSAodWludDMyX3QpdmFsOw0KKyAgbV91TWlkID0gKHVpbnQzMl90KUZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHZhbCk7DQorICBtX3VIaSA9IDA7DQorICBtX3VGbGFncyA9IDA7DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbCh1aW50MzJfdCB2YWwpIHsNCisgIG1fdUxvID0gKHVpbnQzMl90KXZhbDsNCisgIG1fdU1pZCA9IG1fdUhpID0gMDsNCisgIG1fdUZsYWdzID0gMDsNCit9DQorQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKHVpbnQzMl90IGxvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIG5lZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FsZSkgew0KKyAgc2NhbGUgPSAoc2NhbGUgPiBGWE1BVEhfREVDSU1BTF9TQ0FMRUxJTUlUID8gMCA6IHNjYWxlKTsNCisgIG1fdUxvID0gbG87DQorICBtX3VNaWQgPSBtaWQ7DQorICBtX3VIaSA9IGhpOw0KKyAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MobmVnICYmIElzTm90WmVybygpLCBzY2FsZSk7DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChpbnQzMl90IHZhbCkgew0KKyAgaWYgKHZhbCA+PSAwKSB7DQorICAgICp0aGlzID0gQ0ZYX0RlY2ltYWwoKHVpbnQzMl90KXZhbCk7DQorICB9IGVsc2Ugew0KKyAgICAqdGhpcyA9IENGWF9EZWNpbWFsKCh1aW50MzJfdCktdmFsKTsNCisgICAgU2V0TmVnYXRlKCk7DQorICB9DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChpbnQ2NF90IHZhbCkgew0KKyAgaWYgKHZhbCA+PSAwKSB7DQorICAgICp0aGlzID0gQ0ZYX0RlY2ltYWwoKHVpbnQ2NF90KXZhbCk7DQorICB9IGVsc2Ugew0KKyAgICAqdGhpcyA9IENGWF9EZWNpbWFsKCh1aW50NjRfdCktdmFsKTsNCisgICAgU2V0TmVnYXRlKCk7DQorICB9DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChGWF9GTE9BVCB2YWwsIHVpbnQ4X3Qgc2NhbGUpIHsNCisgIEZYX0ZMT0FUIG5ld3ZhbCA9IGZhYnModmFsKTsNCisgIHVpbnQ2NF90IHBoaSwgcG1pZCwgcGxvOw0KKyAgcGxvID0gKHVpbnQ2NF90KW5ld3ZhbDsNCisgIHBtaWQgPSAodWludDY0X3QpKG5ld3ZhbCAvIDFlMzIpOw0KKyAgcGhpID0gKHVpbnQ2NF90KShuZXd2YWwgLyAxZTY0KTsNCisgIG5ld3ZhbCA9IEZYU1lTX2Ztb2QobmV3dmFsLCAxLjBmKTsNCisgIGZvciAodWludDhfdCBpdGVyID0gMDsgaXRlciA8IHNjYWxlOyBpdGVyKyspIHsNCisgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgbmV3dmFsICo9IDEwOw0KKyAgICBwbG8gKz0gKHVpbnQ2NF90KW5ld3ZhbDsNCiAgICAgbmV3dmFsID0gRlhTWVNfZm1vZChuZXd2YWwsIDEuMGYpOw0KLSAgICBmb3IodWludDhfdCBpdGVyID0gMDsgaXRlciA8IHNjYWxlOyBpdGVyKyspIHsNCi0gICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9tdWwxMChwaGksIHBtaWQsIHBsbyk7DQotICAgICAgICBuZXd2YWwgKj0gMTA7DQotICAgICAgICBwbG8gKz0gKHVpbnQ2NF90KW5ld3ZhbDsNCi0gICAgICAgIG5ld3ZhbCA9IEZYU1lTX2Ztb2QobmV3dmFsLCAxLjBmKTsNCisgIH0NCisgIHBsbyArPSBGWFNZU19yb3VuZChuZXd2YWwpOw0KKyAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX25vcm1hbGl6ZShwaGksIHBtaWQsIHBsbyk7DQorICBtX3VIaSA9ICh1aW50MzJfdClwaGk7DQorICBtX3VNaWQgPSAodWludDMyX3QpcG1pZDsNCisgIG1fdUxvID0gKHVpbnQzMl90KXBsbzsNCisgIG1fdUZsYWdzID0gRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKHZhbCA8IDAgJiYgSXNOb3RaZXJvKCksIHNjYWxlKTsNCit9DQorQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyT2JqKSB7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyID0gc3RyT2JqLkdldFB0cigpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHN0ckJvdW5kID0gc3RyICsgc3RyT2JqLkdldExlbmd0aCgpOw0KKyAgRlhfQk9PTCBwb2ludG1ldCA9IDA7DQorICBGWF9CT09MIG5lZ21ldCA9IDA7DQorICB1aW50OF90IHNjYWxlID0gMDsNCisgIG1fdUhpID0gbV91TWlkID0gbV91TG8gPSAwOw0KKyAgd2hpbGUgKHN0ciAhPSBzdHJCb3VuZCAmJiAqc3RyID09ICcgJykgew0KKyAgICBzdHIrKzsNCisgIH0NCisgIGlmIChzdHIgIT0gc3RyQm91bmQgJiYgKnN0ciA9PSAnLScpIHsNCisgICAgbmVnbWV0ID0gMTsNCisgICAgc3RyKys7DQorICB9IGVsc2UgaWYgKHN0ciAhPSBzdHJCb3VuZCAmJiAqc3RyID09ICcrJykgew0KKyAgICBzdHIrKzsNCisgIH0NCisgIHdoaWxlIChzdHIgIT0gc3RyQm91bmQgJiYgKCgqc3RyID49ICcwJyAmJiAqc3RyIDw9ICc5JykgfHwgKnN0ciA9PSAnLicpICYmDQorICAgICAgICAgc2NhbGUgPCBGWE1BVEhfREVDSU1BTF9TQ0FMRUxJTUlUKSB7DQorICAgIGlmICgqc3RyID09ICcuJykgew0KKyAgICAgIGlmIChwb2ludG1ldCkgew0KKyAgICAgICAgZ290byBjb250Ow0KKyAgICAgIH0NCisgICAgICBwb2ludG1ldCA9IDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV91SGkgPSBtX3VIaSAqIDB4QSArIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKCh1aW50NjRfdCltX3VNaWQgKiAweEEpOw0KKyAgICAgIG1fdU1pZCA9IG1fdU1pZCAqIDB4QSArIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKCh1aW50NjRfdCltX3VMbyAqIDB4QSk7DQorICAgICAgbV91TG8gPSBtX3VMbyAqIDB4QSArICgqc3RyIC0gJzAnKTsNCisgICAgICBpZiAocG9pbnRtZXQpIHsNCisgICAgICAgIHNjYWxlKys7DQorICAgICAgfQ0KICAgICB9DQotICAgIHBsbyArPSBGWFNZU19yb3VuZChuZXd2YWwpOw0KLSAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplKHBoaSwgcG1pZCwgcGxvKTsNCisgIGNvbnQ6DQorICAgIHN0cisrOw0KKyAgfQ0KKyAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MobmVnbWV0ICYmIElzTm90WmVybygpLCBzY2FsZSk7DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0ck9iaikgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3N0ck9iajsNCisgIHdzdHJPYmouQ29udmVydEZyb20oc3RyT2JqKTsNCisgICp0aGlzID0gQ0ZYX0RlY2ltYWwod3N0ck9iaik7DQorfQ0KK0NGWF9EZWNpbWFsOjpvcGVyYXRvciBDRlhfV2lkZVN0cmluZygpIGNvbnN0IHsNCisgIENGWF9XaWRlU3RyaW5nIHJldFN0cmluZzsNCisgIENGWF9XaWRlU3RyaW5nIHRtcGJ1ZjsNCisgIHVpbnQ2NF90IHBoaSA9IG1fdUhpLCBwbWlkID0gbV91TWlkLCBwbG8gPSBtX3VMbzsNCisgIHdoaWxlIChwaGkgfHwgcG1pZCB8fCBwbG8pIHsNCisgICAgdG1wYnVmICs9IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMChwaGksIHBtaWQsIHBsbykgKyAnMCc7DQorICB9DQorICB1aW50OF90IG91dHB1dGxlbiA9ICh1aW50OF90KXRtcGJ1Zi5HZXRMZW5ndGgoKTsNCisgIHVpbnQ4X3Qgc2NhbGUgPSAodWludDhfdClGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7DQorICB3aGlsZSAoc2NhbGUgPj0gb3V0cHV0bGVuKSB7DQorICAgIHRtcGJ1ZiArPSAnMCc7DQorICAgIG91dHB1dGxlbisrOw0KKyAgfQ0KKyAgaWYgKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgJiYgSXNOb3RaZXJvKCkpIHsNCisgICAgcmV0U3RyaW5nICs9ICctJzsNCisgIH0NCisgIGZvciAodWludDhfdCBpZHggPSAwOyBpZHggPCBvdXRwdXRsZW47IGlkeCsrKSB7DQorICAgIGlmIChpZHggPT0gKG91dHB1dGxlbiAtIHNjYWxlKSAmJiBzY2FsZSAhPSAwKSB7DQorICAgICAgcmV0U3RyaW5nICs9ICcuJzsNCisgICAgfQ0KKyAgICByZXRTdHJpbmcgKz0gdG1wYnVmW291dHB1dGxlbiAtIDEgLSBpZHhdOw0KKyAgfQ0KKyAgcmV0dXJuIHJldFN0cmluZzsNCit9DQorQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0IHsNCisgIGRvdWJsZSBwb3cgPSAoZG91YmxlKSgxIDw8IDE2KSAqICgxIDw8IDE2KTsNCisgIGRvdWJsZSBiYXNlID0NCisgICAgICAoKGRvdWJsZSltX3VIaSkgKiBwb3cgKiBwb3cgKyAoKGRvdWJsZSltX3VNaWQpICogcG93ICsgKChkb3VibGUpbV91TG8pOw0KKyAgaW50OF90IHNjYWxlID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpOw0KKyAgRlhfQk9PTCBiTmVnID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKTsNCisgIHJldHVybiAoYk5lZyA/IC0xIDogMSkgKiBiYXNlICogOjpwb3coMTAuMCwgLXNjYWxlKTsNCit9DQordm9pZCBDRlhfRGVjaW1hbDo6U2V0U2NhbGUodWludDhfdCBuZXdzY2FsZSkgew0KKyAgdWludDhfdCBvbGRzY2FsZSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsNCisgIGlmIChuZXdzY2FsZSA+IG9sZHNjYWxlKSB7DQorICAgIHVpbnQ2NF90IHBoaSA9IG1fdUhpLCBwbWlkID0gbV91TWlkLCBwbG8gPSBtX3VMbzsNCisgICAgZm9yICh1aW50OF90IGl0ZXIgPSAwOyBpdGVyIDwgbmV3c2NhbGUgLSBvbGRzY2FsZTsgaXRlcisrKSB7DQorICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgfQ0KICAgICBtX3VIaSA9ICh1aW50MzJfdClwaGk7DQogICAgIG1fdU1pZCA9ICh1aW50MzJfdClwbWlkOw0KICAgICBtX3VMbyA9ICh1aW50MzJfdClwbG87DQotICAgIG1fdUZsYWdzID0gRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKHZhbCA8IDAgJiYgSXNOb3RaZXJvKCksIHNjYWxlKTsNCisgICAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MoDQorICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpICYmIElzTm90WmVybygpLCBuZXdzY2FsZSk7DQorICB9IGVsc2UgaWYgKG5ld3NjYWxlIDwgb2xkc2NhbGUpIHsNCisgICAgdWludDY0X3QgcGhpLCBwbWlkLCBwbG87DQorICAgIHBoaSA9IDAsIHBtaWQgPSAwLCBwbG8gPSA1Ow0KKyAgICB7DQorICAgICAgZm9yICh1aW50OF90IGl0ZXIgPSAwOyBpdGVyIDwgb2xkc2NhbGUgLSBuZXdzY2FsZSAtIDE7IGl0ZXIrKykgew0KKyAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgICB9DQorICAgIH0NCisgICAgcGhpICs9IG1fdUhpOw0KKyAgICBwbWlkICs9IG1fdU1pZDsNCisgICAgcGxvICs9IG1fdUxvOw0KKyAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgew0KKyAgICAgIGZvciAodWludDhfdCBpdGVyID0gMDsgaXRlciA8IG9sZHNjYWxlIC0gbmV3c2NhbGU7IGl0ZXIrKykgew0KKyAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgICB9DQorICAgIH0NCisgICAgbV91SGkgPSAodWludDMyX3QpcGhpOw0KKyAgICBtX3VNaWQgPSAodWludDMyX3QpcG1pZDsNCisgICAgbV91TG8gPSAodWludDMyX3QpcGxvOw0KKyAgICBtX3VGbGFncyA9IEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUygNCisgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgJiYgSXNOb3RaZXJvKCksIG5ld3NjYWxlKTsNCisgIH0NCiB9DQotQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyT2JqKQ0KLXsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IHN0ck9iai5HZXRQdHIoKTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHN0ckJvdW5kID0gc3RyICsgc3RyT2JqLkdldExlbmd0aCgpOw0KLSAgICBGWF9CT09MIHBvaW50bWV0ID0gMDsNCi0gICAgRlhfQk9PTCBuZWdtZXQgPSAwOw0KLSAgICB1aW50OF90IHNjYWxlID0gMDsNCi0gICAgbV91SGkgPSBtX3VNaWQgPSBtX3VMbyA9IDA7DQotICAgIHdoaWxlIChzdHIgIT0gc3RyQm91bmQgJiYgKnN0ciA9PSAnICcpIHsNCi0gICAgICAgIHN0cisrOw0KLSAgICB9DQotICAgIGlmIChzdHIgIT0gc3RyQm91bmQgJiYgKnN0ciA9PSAnLScpIHsNCi0gICAgICAgIG5lZ21ldCA9IDE7DQotICAgICAgICBzdHIrKzsNCi0gICAgfSBlbHNlIGlmIChzdHIgIT0gc3RyQm91bmQgJiYgKnN0ciA9PSAnKycpIHsNCi0gICAgICAgIHN0cisrOw0KLSAgICB9DQotICAgIHdoaWxlIChzdHIgIT0gc3RyQm91bmQgJiYgKCgqc3RyID49ICcwJyAmJiAqc3RyIDw9ICc5JykgfHwgKnN0ciA9PSAnLicpICYmIHNjYWxlIDwgRlhNQVRIX0RFQ0lNQUxfU0NBTEVMSU1JVCkgew0KLSAgICAgICAgaWYgKCpzdHIgPT0gJy4nKSB7DQotICAgICAgICAgICAgaWYocG9pbnRtZXQpIHsNCi0gICAgICAgICAgICAgICAgZ290byBjb250Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwb2ludG1ldCA9IDE7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1fdUhpID0gbV91SGkgKiAweEEgKyBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVCgodWludDY0X3QpbV91TWlkICogMHhBKTsNCi0gICAgICAgICAgICBtX3VNaWQgPSBtX3VNaWQgKiAweEEgKyBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVCgodWludDY0X3QpbV91TG8gICogMHhBKTsNCi0gICAgICAgICAgICBtX3VMbyA9IG1fdUxvICogMHhBICsgKCpzdHIgLSAnMCcpOw0KLSAgICAgICAgICAgIGlmKHBvaW50bWV0KSB7DQotICAgICAgICAgICAgICAgIHNjYWxlKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLWNvbnQ6DQotICAgICAgICBzdHIrKzsNCi0gICAgfQ0KLSAgICBtX3VGbGFncyA9IEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUyhuZWdtZXQgJiYgSXNOb3RaZXJvKCksIHNjYWxlKTsNCit1aW50OF90IENGWF9EZWNpbWFsOjpHZXRTY2FsZSgpIHsNCisgIHVpbnQ4X3Qgb2xkc2NhbGUgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7DQorICByZXR1cm4gb2xkc2NhbGU7DQogfQ0KLUNGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0ck9iaikNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzdHJPYmo7DQotICAgIHdzdHJPYmouQ29udmVydEZyb20oc3RyT2JqKTsNCi0gICAgKnRoaXMgPSBDRlhfRGVjaW1hbCh3c3RyT2JqKTsNCit2b2lkIENGWF9EZWNpbWFsOjpTZXRBYnMoKSB7DQorICBtX3VGbGFncyAmPSB+RlhNQVRIX0RFQ0lNQUxfTkVHTUFTSzsNCiB9DQotQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCkgY29uc3QNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHJldFN0cmluZzsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgdG1wYnVmOw0KLSAgICB1aW50NjRfdCBwaGkgPSBtX3VIaSwgcG1pZCA9IG1fdU1pZCwgcGxvID0gbV91TG87DQotICAgIHdoaWxlKHBoaSB8fCBwbWlkIHx8IHBsbykgew0KLSAgICAgICAgdG1wYnVmICs9IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMChwaGksIHBtaWQsIHBsbykgKyAnMCc7DQotICAgIH0NCi0gICAgdWludDhfdCBvdXRwdXRsZW4gPSAodWludDhfdCl0bXBidWYuR2V0TGVuZ3RoKCk7DQotICAgIHVpbnQ4X3Qgc2NhbGUgPSAodWludDhfdClGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7DQotICAgIHdoaWxlIChzY2FsZSA+PSBvdXRwdXRsZW4pIHsNCi0gICAgICAgIHRtcGJ1ZiArPSAnMCc7DQotICAgICAgICBvdXRwdXRsZW4rKzsNCi0gICAgfQ0KLSAgICBpZiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKSAmJiBJc05vdFplcm8oKSkgew0KLSAgICAgICAgcmV0U3RyaW5nICs9ICctJzsNCi0gICAgfQ0KLSAgICBmb3IgKHVpbnQ4X3QgaWR4ID0gMDsgaWR4IDwgb3V0cHV0bGVuOyBpZHgrKykgew0KLSAgICAgICAgaWYgKGlkeCA9PSAob3V0cHV0bGVuIC0gc2NhbGUpICYmIHNjYWxlICE9IDApIHsNCi0gICAgICAgICAgICByZXRTdHJpbmcgKz0gJy4nOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0U3RyaW5nICs9IHRtcGJ1ZltvdXRwdXRsZW4gLSAxIC0gaWR4XTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcmV0U3RyaW5nOw0KK3ZvaWQgQ0ZYX0RlY2ltYWw6OlNldE5lZ2F0ZSgpIHsNCisgIGlmIChJc05vdFplcm8oKSkgew0KKyAgICBtX3VGbGFncyBePSBGWE1BVEhfREVDSU1BTF9ORUdNQVNLOw0KKyAgfQ0KIH0NCi1DRlhfRGVjaW1hbDo6b3BlcmF0b3IgZG91YmxlKCkgY29uc3QNCi17DQotICAgIGRvdWJsZSBwb3cgPSAoZG91YmxlKSgxIDw8IDE2KSAqICgxIDw8IDE2KTsNCi0gICAgZG91YmxlIGJhc2UgPSAoKGRvdWJsZSltX3VIaSkgKiBwb3cgKiBwb3cgKyAoKGRvdWJsZSltX3VNaWQpICogcG93ICsgKChkb3VibGUpbV91TG8pOw0KLSAgICBpbnQ4X3Qgc2NhbGUgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7DQotICAgIEZYX0JPT0wgYk5lZyA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncyk7DQotICAgIHJldHVybiAoYk5lZyA/IC0xIDogMSkgKiBiYXNlICogOjpwb3coMTAuMCwgLXNjYWxlKTsNCit2b2lkIENGWF9EZWNpbWFsOjpGbG9vck9yQ2VpbChGWF9CT09MIGJGbG9vcikgew0KKyAgdWludDY0X3QgbnVtc1szXSA9IHttX3VMbywgbV91TWlkLCBtX3VIaX07DQorICBGWF9CT09MIGJEYXRhTG9zcyA9IEZBTFNFOw0KKyAgZm9yIChpbnQgaSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsgaSA+IDA7IGktLSkgew0KKyAgICBiRGF0YUxvc3MgPSBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTBfYW55KG51bXMsIDMpIHx8IGJEYXRhTG9zczsNCisgIH0NCisgIGlmIChiRGF0YUxvc3MgJiYgKGJGbG9vciA/IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICFGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpKSkgew0KKyAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfaW5jX2FueShudW1zLCAzKTsNCisgIH0NCisgIG1fdUhpID0gKHVpbnQzMl90KW51bXNbMl07DQorICBtX3VNaWQgPSAodWludDMyX3QpbnVtc1sxXTsNCisgIG1fdUxvID0gKHVpbnQzMl90KW51bXNbMF07DQorICBtX3VGbGFncyA9IEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUygNCisgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpICYmIElzTm90WmVybygpLCAwKTsNCiB9DQotdm9pZCBDRlhfRGVjaW1hbDo6U2V0U2NhbGUodWludDhfdCBuZXdzY2FsZSkNCi17DQotICAgIHVpbnQ4X3Qgb2xkc2NhbGUgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7DQotICAgIGlmIChuZXdzY2FsZSA+IG9sZHNjYWxlKSB7DQotICAgICAgICB1aW50NjRfdCBwaGkgPSBtX3VIaSwgcG1pZCA9IG1fdU1pZCwgcGxvID0gbV91TG87DQotICAgICAgICBmb3IgKHVpbnQ4X3QgaXRlciA9IDA7IGl0ZXIgPCBuZXdzY2FsZSAtIG9sZHNjYWxlOyBpdGVyKyspIHsNCi0gICAgICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbXVsMTAocGhpLCBwbWlkLCBwbG8pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV91SGkgPSAodWludDMyX3QpcGhpOw0KLSAgICAgICAgbV91TWlkID0gKHVpbnQzMl90KXBtaWQ7DQotICAgICAgICBtX3VMbyA9ICh1aW50MzJfdClwbG87DQotICAgICAgICBtX3VGbGFncyA9IEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUyhGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpICYmIElzTm90WmVybygpLCBuZXdzY2FsZSk7DQotICAgIH0gZWxzZSBpZiAobmV3c2NhbGUgPCBvbGRzY2FsZSkgew0KLSAgICAgICAgdWludDY0X3QgcGhpLCBwbWlkLCBwbG87DQotICAgICAgICBwaGkgPSAwLCBwbWlkID0gMCwgcGxvID0gNTsNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IodWludDhfdCBpdGVyID0gMDsgaXRlciA8IG9sZHNjYWxlIC0gbmV3c2NhbGUgLSAxOyBpdGVyKyspIHsNCi0gICAgICAgICAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwKHBoaSwgcG1pZCwgcGxvKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBwaGkgKz0gbV91SGk7DQotICAgICAgICBwbWlkICs9IG1fdU1pZDsNCi0gICAgICAgIHBsbyArPSBtX3VMbzsNCi0gICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9ub3JtYWxpemUocGhpLCBwbWlkLCBwbG8pOw0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcih1aW50OF90IGl0ZXIgPSAwOyBpdGVyIDwgb2xkc2NhbGUgLSBuZXdzY2FsZTsgaXRlcisrKSB7DQotICAgICAgICAgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMChwaGksIHBtaWQsIHBsbyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgbV91SGkgPSAodWludDMyX3QpcGhpOw0KLSAgICAgICAgbV91TWlkID0gKHVpbnQzMl90KXBtaWQ7DQotICAgICAgICBtX3VMbyA9ICh1aW50MzJfdClwbG87DQotICAgICAgICBtX3VGbGFncyA9IEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUyhGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpICYmIElzTm90WmVybygpLCBuZXdzY2FsZSk7DQotICAgIH0NCit2b2lkIENGWF9EZWNpbWFsOjpTZXRGbG9vcigpIHsNCisgIEZsb29yT3JDZWlsKFRSVUUpOw0KIH0NCi11aW50OF90IENGWF9EZWNpbWFsOjpHZXRTY2FsZSgpDQotew0KLSAgICB1aW50OF90IG9sZHNjYWxlID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpOw0KLSAgICByZXR1cm4gb2xkc2NhbGU7DQordm9pZCBDRlhfRGVjaW1hbDo6U2V0Q2VpbGluZygpIHsNCisgIEZsb29yT3JDZWlsKEZBTFNFKTsNCiB9DQotdm9pZCBDRlhfRGVjaW1hbDo6U2V0QWJzKCkNCi17DQotICAgIG1fdUZsYWdzICY9IH5GWE1BVEhfREVDSU1BTF9ORUdNQVNLOw0KK3ZvaWQgQ0ZYX0RlY2ltYWw6OlNldFRydW5jYXRlKCkgew0KKyAgRmxvb3JPckNlaWwoIUZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykpOw0KIH0NCi12b2lkIENGWF9EZWNpbWFsOjpTZXROZWdhdGUoKQ0KLXsNCi0gICAgaWYoSXNOb3RaZXJvKCkpIHsNCi0gICAgICAgIG1fdUZsYWdzIF49IEZYTUFUSF9ERUNJTUFMX05FR01BU0s7DQotICAgIH0NCit2b2lkIENGWF9EZWNpbWFsOjpTd2FwKENGWF9EZWNpbWFsJiB2YWwpIHsNCisgIHVpbnQzMl90IHRtcDsNCisgIHRtcCA9IG1fdUhpOw0KKyAgbV91SGkgPSB2YWwubV91SGk7DQorICB2YWwubV91SGkgPSB0bXA7DQorICB0bXAgPSBtX3VNaWQ7DQorICBtX3VNaWQgPSB2YWwubV91TWlkOw0KKyAgdmFsLm1fdU1pZCA9IHRtcDsNCisgIHRtcCA9IG1fdUxvOw0KKyAgbV91TG8gPSB2YWwubV91TG87DQorICB2YWwubV91TG8gPSB0bXA7DQorICB0bXAgPSBtX3VGbGFnczsNCisgIG1fdUZsYWdzID0gdmFsLm1fdUZsYWdzOw0KKyAgdmFsLm1fdUZsYWdzID0gdG1wOw0KIH0NCi12b2lkIENGWF9EZWNpbWFsOjpGbG9vck9yQ2VpbChGWF9CT09MIGJGbG9vcikNCi17DQotICAgIHVpbnQ2NF90IG51bXNbM10gPSB7bV91TG8sIG1fdU1pZCwgbV91SGl9Ow0KLSAgICBGWF9CT09MIGJEYXRhTG9zcyA9IEZBTFNFOw0KLSAgICBmb3IoaW50IGkgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7IGkgPiAwOyBpIC0tKSB7DQotICAgICAgICBiRGF0YUxvc3MgPSBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTBfYW55KG51bXMsIDMpIHx8IGJEYXRhTG9zczsNCi0gICAgfQ0KLSAgICBpZihiRGF0YUxvc3MgJiYgKGJGbG9vciA/IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgOiAhRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKSkpIHsNCi0gICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9pbmNfYW55KG51bXMsIDMpOw0KLSAgICB9DQotICAgIG1fdUhpID0gKHVpbnQzMl90KW51bXNbMl07DQotICAgIG1fdU1pZCA9ICh1aW50MzJfdCludW1zWzFdOw0KLSAgICBtX3VMbyA9ICh1aW50MzJfdCludW1zWzBdOw0KLSAgICBtX3VGbGFncyA9IEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUyhGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpICYmIElzTm90WmVybygpLCAwKTsNCitpbnQ4X3QgQ0ZYX0RlY2ltYWw6OkNvbXBhcmUoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgQ0ZYX0RlY2ltYWwgbGhzID0gKnRoaXMsIHJocyA9IHZhbDsNCisgIGludDhfdCByZXRWYWwgPSAwOw0KKyAgaWYgKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKGxocy5tX3VGbGFncykgIT0NCisgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKSB7DQorICAgIHVpbnQ4X3Qgc2NhbGUgPSBGWF9NSU4oRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKTsNCisgICAgbGhzLlNldFNjYWxlKHNjYWxlKTsNCisgICAgcmhzLlNldFNjYWxlKHNjYWxlKTsNCisgIH0NCisgIHJldFZhbCA9IC0oRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKGxocy5tX3VGbGFncykgLQ0KKyAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcocmhzLm1fdUZsYWdzKSk7DQorICBpZiAocmV0VmFsKSB7DQorICAgIHJldHVybiByZXRWYWw7DQorICB9DQorICByZXRWYWwgPSBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2NvbXBhcmUobGhzLm1fdUhpLCBsaHMubV91TWlkLCBsaHMubV91TG8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmhzLm1fdUhpLCByaHMubV91TWlkLCByaHMubV91TG8pOw0KKyAgcmV0dXJuIChGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobGhzLm1fdUZsYWdzKSA/IC1yZXRWYWwgOiByZXRWYWwpOw0KIH0NCi12b2lkIENGWF9EZWNpbWFsOjpTZXRGbG9vcigpDQotew0KLSAgICBGbG9vck9yQ2VpbChUUlVFKTsNCi19DQotdm9pZCBDRlhfRGVjaW1hbDo6U2V0Q2VpbGluZygpDQotew0KLSAgICBGbG9vck9yQ2VpbChGQUxTRSk7DQotfQ0KLXZvaWQgQ0ZYX0RlY2ltYWw6OlNldFRydW5jYXRlKCkNCi17DQotICAgIEZsb29yT3JDZWlsKCFGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpKTsNCi19DQotdm9pZCBDRlhfRGVjaW1hbDo6U3dhcChDRlhfRGVjaW1hbCYgdmFsKQ0KLXsNCi0gICAgdWludDMyX3QgdG1wOw0KLSAgICB0bXAgPSBtX3VIaTsNCi0gICAgbV91SGkgPSB2YWwubV91SGk7DQotICAgIHZhbC5tX3VIaSA9IHRtcDsNCi0gICAgdG1wID0gbV91TWlkOw0KLSAgICBtX3VNaWQgPSB2YWwubV91TWlkOw0KLSAgICB2YWwubV91TWlkID0gdG1wOw0KLSAgICB0bXAgPSBtX3VMbzsNCi0gICAgbV91TG8gPSB2YWwubV91TG87DQotICAgIHZhbC5tX3VMbyA9IHRtcDsNCi0gICAgdG1wID0gbV91RmxhZ3M7DQotICAgIG1fdUZsYWdzID0gdmFsLm1fdUZsYWdzOw0KLSAgICB2YWwubV91RmxhZ3MgPSB0bXA7DQotfQ0KLWludDhfdCBDRlhfRGVjaW1hbDo6Q29tcGFyZSAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCi17DQotICAgIENGWF9EZWNpbWFsIGxocyA9ICp0aGlzLCByaHMgPSB2YWw7DQotICAgIGludDhfdCByZXRWYWwgPSAwOw0KLSAgICBpZiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSAhPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKSB7DQotICAgICAgICB1aW50OF90IHNjYWxlID0gRlhfTUlOKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKGxocy5tX3VGbGFncyksIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHJocy5tX3VGbGFncykpOw0KLSAgICAgICAgbGhzLlNldFNjYWxlKHNjYWxlKTsNCi0gICAgICAgIHJocy5TZXRTY2FsZShzY2FsZSk7DQorQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6OkFkZE9yTWludXMoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzQWRkaW5nKSBjb25zdCB7DQorICBDRlhfRGVjaW1hbCBsaHMgPSAqdGhpcywgcmhzID0gdmFsOw0KKyAgaWYgKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKGxocy5tX3VGbGFncykgIT0NCisgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKSB7DQorICAgIHVpbnQ4X3Qgc2NhbGUgPSBGWF9NQVgoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKTsNCisgICAgbGhzLlNldFNjYWxlKHNjYWxlKTsNCisgICAgcmhzLlNldFNjYWxlKHNjYWxlKTsNCisgIH0NCisgIGlmICghaXNBZGRpbmcpIHsNCisgICAgcmhzLlNldE5lZ2F0ZSgpOw0KKyAgfQ0KKyAgRlhfQk9PTCBkb1Jhd0FkZCA9IChGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobGhzLm1fdUZsYWdzKSA9PQ0KKyAgICAgICAgICAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcocmhzLm1fdUZsYWdzKSk7DQorICBpZiAoZG9SYXdBZGQpIHsNCisgICAgdWludDY0X3QgcGhpID0gbGhzLm1fdUhpLCBwbWlkID0gbGhzLm1fdU1pZCwgcGxvID0gbGhzLm1fdUxvOw0KKyAgICBwaGkgKz0gcmhzLm1fdUhpOw0KKyAgICBwbWlkICs9IHJocy5tX3VNaWQ7DQorICAgIHBsbyArPSByaHMubV91TG87DQorICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9ub3JtYWxpemUocGhpLCBwbWlkLCBwbG8pOw0KKyAgICBpZiAoRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocGhpKSAmJg0KKyAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSAhPSAwKSB7DQorICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgICBsaHMubV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MoDQorICAgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhsaHMubV91RmxhZ3MpLA0KKyAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShsaHMubV91RmxhZ3MpIC0gMSk7DQogICAgIH0NCi0gICAgcmV0VmFsID0gLSAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKGxocy5tX3VGbGFncykgLSBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcocmhzLm1fdUZsYWdzKSk7DQotICAgIGlmIChyZXRWYWwpIHsNCi0gICAgICAgIHJldHVybiByZXRWYWw7DQotICAgIH0NCi0gICAgcmV0VmFsID0gZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlKGxocy5tX3VIaSwgbGhzLm1fdU1pZCwgbGhzLm1fdUxvLCByaHMubV91SGksIHJocy5tX3VNaWQsIHJocy5tX3VMbyk7DQotICAgIHJldHVybiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKGxocy5tX3VGbGFncykgPyAtIHJldFZhbCA6IHJldFZhbCk7DQotfQ0KLUNGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpBZGRPck1pbnVzKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwsIEZYX0JPT0wgaXNBZGRpbmcpIGNvbnN0DQotew0KLSAgICBDRlhfRGVjaW1hbCBsaHMgPSAqdGhpcywgcmhzID0gdmFsOw0KLSAgICBpZiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSAhPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKSB7DQotICAgICAgICB1aW50OF90IHNjYWxlID0gRlhfTUFYKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKGxocy5tX3VGbGFncyksIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHJocy5tX3VGbGFncykpOw0KLSAgICAgICAgbGhzLlNldFNjYWxlKHNjYWxlKTsNCi0gICAgICAgIHJocy5TZXRTY2FsZShzY2FsZSk7DQotICAgIH0NCi0gICAgaWYoIWlzQWRkaW5nKSB7DQotICAgICAgICByaHMuU2V0TmVnYXRlKCk7DQotICAgIH0NCi0gICAgRlhfQk9PTCBkb1Jhd0FkZCA9IChGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobGhzLm1fdUZsYWdzKSA9PSBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcocmhzLm1fdUZsYWdzKSk7DQotICAgIGlmIChkb1Jhd0FkZCkgew0KLSAgICAgICAgdWludDY0X3QgcGhpID0gbGhzLm1fdUhpLCBwbWlkID0gbGhzLm1fdU1pZCwgcGxvID0gbGhzLm1fdUxvOw0KLSAgICAgICAgcGhpICs9IHJocy5tX3VIaTsNCi0gICAgICAgIHBtaWQgKz0gcmhzLm1fdU1pZDsNCi0gICAgICAgIHBsbyArPSByaHMubV91TG87DQotICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplKHBoaSwgcG1pZCwgcGxvKTsNCi0gICAgICAgIGlmKEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBoaSkgJiYgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSAhPSAwKSB7DQotICAgICAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwKHBoaSwgcG1pZCwgcGxvKTsNCi0gICAgICAgICAgICBsaHMubV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKGxocy5tX3VGbGFncyksIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKGxocy5tX3VGbGFncykgLSAxKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGxocy5tX3VIaSA9ICh1aW50MzJfdClwaGk7DQotICAgICAgICBsaHMubV91TWlkID0gKHVpbnQzMl90KXBtaWQ7DQotICAgICAgICBsaHMubV91TG8gPSAodWludDMyX3QpcGxvOw0KLSAgICAgICAgcmV0dXJuIGxoczsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmKGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZShsaHMubV91SGksIGxocy5tX3VNaWQsIGxocy5tX3VMbywgcmhzLm1fdUhpLCByaHMubV91TWlkLCByaHMubV91TG8pIDwgMCkgew0KLSAgICAgICAgICAgIGxocy5Td2FwKHJocyk7DQotICAgICAgICB9DQotICAgICAgICBsaHMubV91SGkgLT0gcmhzLm1fdUhpOw0KLSAgICAgICAgaWYobGhzLm1fdU1pZCA8IHJocy5tX3VNaWQpIHsNCi0gICAgICAgICAgICBsaHMubV91SGktLTsNCi0gICAgICAgIH0NCi0gICAgICAgIGxocy5tX3VNaWQgLT0gcmhzLm1fdU1pZDsNCi0gICAgICAgIGlmKGxocy5tX3VMbyA8IHJocy5tX3VMbykgew0KLSAgICAgICAgICAgIGlmKCFsaHMubV91TWlkKSB7DQotICAgICAgICAgICAgICAgIGxocy5tX3VIaS0tOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBsaHMubV91TWlkLS07DQotICAgICAgICB9DQotICAgICAgICBsaHMubV91TG8gLT0gcmhzLm1fdUxvOw0KLSAgICAgICAgcmV0dXJuIGxoczsNCi0gICAgfQ0KLX0NCi1DRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6TXVsdGlwbHkoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCi17DQotICAgIHVpbnQ2NF90IGFbM10gPSB7bV91TG8sIG1fdU1pZCwgbV91SGl9LCBiWzNdID0ge3ZhbC5tX3VMbywgdmFsLm1fdU1pZCwgdmFsLm1fdUhpfTsNCi0gICAgdWludDY0X3QgY1s2XTsNCi0gICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19tdWwoYSwgMywgYiwgMywgYywgNik7DQotICAgIEZYX0JPT0wgbmVnID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKSBeIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyh2YWwubV91RmxhZ3MpOw0KLSAgICB1aW50OF90IHNjYWxlID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpICsgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUodmFsLm1fdUZsYWdzKTsNCi0gICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Nocmlua2ludG9yYW5nZShjLCA2LCAzLCBzY2FsZSk7DQotICAgIHJldHVybiBDRlhfRGVjaW1hbCgodWludDMyX3QpY1swXSwgKHVpbnQzMl90KWNbMV0sICh1aW50MzJfdCljWzJdLCBuZWcsIHNjYWxlKTsNCi19DQotQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6OkRpdmlkZShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdA0KLXsNCi0gICAgaWYoIXZhbC5Jc05vdFplcm8oKSkgew0KLSAgICAgICAgcmV0dXJuIENGWF9EZWNpbWFsKCk7DQotICAgIH0NCi0gICAgRlhfQk9PTCBuZWcgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpIF4gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKHZhbC5tX3VGbGFncyk7DQotICAgIHVpbnQ2NF90IGFbN10gPSB7bV91TG8sIG1fdU1pZCwgbV91SGl9LCBiWzNdID0ge3ZhbC5tX3VMbywgdmFsLm1fdU1pZCwgdmFsLm1fdUhpfSwgY1s3XSA9IHswfTsNCi0gICAgdWludDhfdCBzY2FsZSA9IDA7DQotICAgIGlmKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKSA8IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHZhbC5tX3VGbGFncykpIHsNCi0gICAgICAgIGZvcihpbnQgaSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHZhbC5tX3VGbGFncykgLSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7IGkgPiAwOyBpLS0pIHsNCi0gICAgICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbXVsMTBfYW55KGEsIDcpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgc2NhbGUgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncykgLSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRSh2YWwubV91RmxhZ3MpOw0KLSAgICB9DQotICAgIHVpbnQ4X3QgbWluc2NhbGUgPSBzY2FsZTsNCi0gICAgaWYoIUlzTm90WmVybygpKSB7DQotICAgICAgICByZXR1cm4gQ0ZYX0RlY2ltYWwoMCwgMCwgMCwgMCwgbWluc2NhbGUpOw0KLSAgICB9DQotICAgIHdoaWxlKCFhWzZdKSB7DQotICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbXVsMTBfYW55KGEsIDcpOw0KLSAgICAgICAgc2NhbGUrKzsNCi0gICAgfQ0KLSAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTBfYW55KGEsIDcpOw0KLSAgICBzY2FsZS0tOw0KLSAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2RpdihhLCA2LCBiLCAzLCBjLCA3KTsNCi0gICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Nocmlua2ludG9yYW5nZShjLCA2LCAzLCBzY2FsZSk7DQotICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl90cnVuY2F0ZShjWzJdLCBjWzFdLCBjWzBdLCBzY2FsZSwgbWluc2NhbGUpOw0KLSAgICByZXR1cm4gQ0ZYX0RlY2ltYWwoKHVpbnQzMl90KWNbMF0sICh1aW50MzJfdCljWzFdLCAodWludDMyX3QpY1syXSwgbmVnLCBzY2FsZSk7DQotfQ0KLUNGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpNb2R1bHVzKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0DQotew0KLSAgICBDRlhfRGVjaW1hbCBsaHMgPSAqdGhpcywgcmhzX2FicyA9IHZhbDsNCi0gICAgcmhzX2Ficy5TZXRBYnMoKTsNCi0gICAgaWYoIXJoc19hYnMuSXNOb3RaZXJvKCkpIHsNCi0gICAgICAgIHJldHVybiAqdGhpczsNCi0gICAgfQ0KLSAgICB3aGlsZShUUlVFKSB7DQotICAgICAgICBDRlhfRGVjaW1hbCBsaHNfYWJzID0gbGhzOw0KLSAgICAgICAgbGhzX2Ficy5TZXRBYnMoKTsNCi0gICAgICAgIGlmKGxoc19hYnMgPCByaHNfYWJzKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBDRlhfRGVjaW1hbCBxdW90ID0gbGhzIC8gcmhzX2FiczsNCi0gICAgICAgIHF1b3QuU2V0VHJ1bmNhdGUoKTsNCi0gICAgICAgIGxocyA9IGxocyAtIHF1b3QgKiByaHNfYWJzOw0KLSAgICB9DQorICAgIGxocy5tX3VIaSA9ICh1aW50MzJfdClwaGk7DQorICAgIGxocy5tX3VNaWQgPSAodWludDMyX3QpcG1pZDsNCisgICAgbGhzLm1fdUxvID0gKHVpbnQzMl90KXBsbzsNCiAgICAgcmV0dXJuIGxoczsNCisgIH0gZWxzZSB7DQorICAgIGlmIChmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2NvbXBhcmUobGhzLm1fdUhpLCBsaHMubV91TWlkLCBsaHMubV91TG8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmhzLm1fdUhpLCByaHMubV91TWlkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJocy5tX3VMbykgPCAwKSB7DQorICAgICAgbGhzLlN3YXAocmhzKTsNCisgICAgfQ0KKyAgICBsaHMubV91SGkgLT0gcmhzLm1fdUhpOw0KKyAgICBpZiAobGhzLm1fdU1pZCA8IHJocy5tX3VNaWQpIHsNCisgICAgICBsaHMubV91SGktLTsNCisgICAgfQ0KKyAgICBsaHMubV91TWlkIC09IHJocy5tX3VNaWQ7DQorICAgIGlmIChsaHMubV91TG8gPCByaHMubV91TG8pIHsNCisgICAgICBpZiAoIWxocy5tX3VNaWQpIHsNCisgICAgICAgIGxocy5tX3VIaS0tOw0KKyAgICAgIH0NCisgICAgICBsaHMubV91TWlkLS07DQorICAgIH0NCisgICAgbGhzLm1fdUxvIC09IHJocy5tX3VMbzsNCisgICAgcmV0dXJuIGxoczsNCisgIH0NCiB9DQotRlhfQk9PTCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IgPT0gKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0DQotew0KLSAgICByZXR1cm4gQ29tcGFyZSh2YWwpID09IDA7DQorQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6Ok11bHRpcGx5KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsNCisgIHVpbnQ2NF90IGFbM10gPSB7bV91TG8sIG1fdU1pZCwgbV91SGl9LA0KKyAgICAgICAgICAgYlszXSA9IHt2YWwubV91TG8sIHZhbC5tX3VNaWQsIHZhbC5tX3VIaX07DQorICB1aW50NjRfdCBjWzZdOw0KKyAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19tdWwoYSwgMywgYiwgMywgYywgNik7DQorICBGWF9CT09MIG5lZyA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgXg0KKyAgICAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcodmFsLm1fdUZsYWdzKTsNCisgIHVpbnQ4X3Qgc2NhbGUgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncykgKw0KKyAgICAgICAgICAgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHZhbC5tX3VGbGFncyk7DQorICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfc2hyaW5raW50b3JhbmdlKGMsIDYsIDMsIHNjYWxlKTsNCisgIHJldHVybiBDRlhfRGVjaW1hbCgodWludDMyX3QpY1swXSwgKHVpbnQzMl90KWNbMV0sICh1aW50MzJfdCljWzJdLCBuZWcsDQorICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOw0KIH0NCi1GWF9CT09MIENGWF9EZWNpbWFsOjpvcGVyYXRvciA8PSAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCi17DQotICAgIHJldHVybiBDb21wYXJlKHZhbCkgPD0gMDsNCitDRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6RGl2aWRlKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsNCisgIGlmICghdmFsLklzTm90WmVybygpKSB7DQorICAgIHJldHVybiBDRlhfRGVjaW1hbCgpOw0KKyAgfQ0KKyAgRlhfQk9PTCBuZWcgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpIF4NCisgICAgICAgICAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKHZhbC5tX3VGbGFncyk7DQorICB1aW50NjRfdCBhWzddID0ge21fdUxvLCBtX3VNaWQsIG1fdUhpfSwNCisgICAgICAgICAgIGJbM10gPSB7dmFsLm1fdUxvLCB2YWwubV91TWlkLCB2YWwubV91SGl9LCBjWzddID0gezB9Ow0KKyAgdWludDhfdCBzY2FsZSA9IDA7DQorICBpZiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpIDwNCisgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRSh2YWwubV91RmxhZ3MpKSB7DQorICAgIGZvciAoaW50IGkgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRSh2YWwubV91RmxhZ3MpIC0NCisgICAgICAgICAgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsNCisgICAgICAgICBpID4gMDsgaS0tKSB7DQorICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwX2FueShhLCA3KTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgc2NhbGUgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncykgLQ0KKyAgICAgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHZhbC5tX3VGbGFncyk7DQorICB9DQorICB1aW50OF90IG1pbnNjYWxlID0gc2NhbGU7DQorICBpZiAoIUlzTm90WmVybygpKSB7DQorICAgIHJldHVybiBDRlhfRGVjaW1hbCgwLCAwLCAwLCAwLCBtaW5zY2FsZSk7DQorICB9DQorICB3aGlsZSAoIWFbNl0pIHsNCisgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwX2FueShhLCA3KTsNCisgICAgc2NhbGUrKzsNCisgIH0NCisgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMF9hbnkoYSwgNyk7DQorICBzY2FsZS0tOw0KKyAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19kaXYoYSwgNiwgYiwgMywgYywgNyk7DQorICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfc2hyaW5raW50b3JhbmdlKGMsIDYsIDMsIHNjYWxlKTsNCisgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl90cnVuY2F0ZShjWzJdLCBjWzFdLCBjWzBdLCBzY2FsZSwgbWluc2NhbGUpOw0KKyAgcmV0dXJuIENGWF9EZWNpbWFsKCh1aW50MzJfdCljWzBdLCAodWludDMyX3QpY1sxXSwgKHVpbnQzMl90KWNbMl0sIG5lZywNCisgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7DQogfQ0KLUZYX0JPT0wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yID49IChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIENvbXBhcmUodmFsKSA+PSAwOw0KK0NGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpNb2R1bHVzKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsNCisgIENGWF9EZWNpbWFsIGxocyA9ICp0aGlzLCByaHNfYWJzID0gdmFsOw0KKyAgcmhzX2Ficy5TZXRBYnMoKTsNCisgIGlmICghcmhzX2Ficy5Jc05vdFplcm8oKSkgew0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBDRlhfRGVjaW1hbCBsaHNfYWJzID0gbGhzOw0KKyAgICBsaHNfYWJzLlNldEFicygpOw0KKyAgICBpZiAobGhzX2FicyA8IHJoc19hYnMpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBDRlhfRGVjaW1hbCBxdW90ID0gbGhzIC8gcmhzX2FiczsNCisgICAgcXVvdC5TZXRUcnVuY2F0ZSgpOw0KKyAgICBsaHMgPSBsaHMgLSBxdW90ICogcmhzX2FiczsNCisgIH0NCisgIHJldHVybiBsaHM7DQogfQ0KLUZYX0JPT0wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yICE9IChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIENvbXBhcmUodmFsKSAhPSAwOw0KK0ZYX0JPT0wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yPT0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgcmV0dXJuIENvbXBhcmUodmFsKSA9PSAwOw0KIH0NCi1GWF9CT09MIENGWF9EZWNpbWFsOjpvcGVyYXRvciA8ICAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCi17DQotICAgIHJldHVybiBDb21wYXJlKHZhbCkgPCAwOw0KK0ZYX0JPT0wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yPD0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgcmV0dXJuIENvbXBhcmUodmFsKSA8PSAwOw0KIH0NCi1GWF9CT09MIENGWF9EZWNpbWFsOjpvcGVyYXRvciA+ICAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCi17DQotICAgIHJldHVybiBDb21wYXJlKHZhbCkgPiAwOw0KK0ZYX0JPT0wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yPj0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgcmV0dXJuIENvbXBhcmUodmFsKSA+PSAwOw0KIH0NCi1DRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IgKyAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCi17DQotICAgIHJldHVybiBBZGRPck1pbnVzKHZhbCwgVFJVRSk7DQorRlhfQk9PTCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IhPShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7DQorICByZXR1cm4gQ29tcGFyZSh2YWwpICE9IDA7DQogfQ0KLUNGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvciAtIChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIEFkZE9yTWludXModmFsLCBGQUxTRSk7DQorRlhfQk9PTCBDRlhfRGVjaW1hbDo6b3BlcmF0b3I8KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsNCisgIHJldHVybiBDb21wYXJlKHZhbCkgPCAwOw0KIH0NCi1DRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IgKiAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCi17DQotICAgIHJldHVybiBNdWx0aXBseSh2YWwpOw0KK0ZYX0JPT0wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yPihjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7DQorICByZXR1cm4gQ29tcGFyZSh2YWwpID4gMDsNCiB9DQotQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yIC8gKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0DQotew0KLSAgICByZXR1cm4gRGl2aWRlKHZhbCk7DQorQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yKyhjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7DQorICByZXR1cm4gQWRkT3JNaW51cyh2YWwsIFRSVUUpOw0KIH0NCi1DRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IgJSAoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QNCi17DQotICAgIHJldHVybiBNb2R1bHVzKHZhbCk7DQorQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yLShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7DQorICByZXR1cm4gQWRkT3JNaW51cyh2YWwsIEZBTFNFKTsNCit9DQorQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yKihjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7DQorICByZXR1cm4gTXVsdGlwbHkodmFsKTsNCit9DQorQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yLyhjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7DQorICByZXR1cm4gRGl2aWRlKHZhbCk7DQorfQ0KK0NGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvciUoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgcmV0dXJuIE1vZHVsdXModmFsKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlaW1wLmggYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVpbXAuaAppbmRleCA0M2Q4NTkyLi4yZWJiYWE4IDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVpbXAuaAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVpbXAuaApAQCAtNyw2OCArNywxMTAgQEAKICNpZm5kZWYgX0ZYX0xPQ0FMRV9JTVBfSF8NCiAjZGVmaW5lIF9GWF9MT0NBTEVfSU1QX0hfDQogY2xhc3MgQ0ZYX0xDTnVtZXJpYzsNCi1jbGFzcyBDRlhfTG9jYWxlIDogcHVibGljIElGWF9Mb2NhbGUNCi17DQotcHVibGljOg0KLSAgICBDRlhfTG9jYWxlKENYTUxfRWxlbWVudCogcExvY2FsZURhdGEpOw0KLSAgICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQorY2xhc3MgQ0ZYX0xvY2FsZSA6IHB1YmxpYyBJRlhfTG9jYWxlIHsNCisgcHVibGljOg0KKyAgQ0ZYX0xvY2FsZShDWE1MX0VsZW1lbnQqIHBMb2NhbGVEYXRhKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KIA0KLSAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldE5hbWUoKTsNCi0gICAgdmlydHVhbCB2b2lkIEdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTCBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdDsNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0TmFtZSgpOw0KKyAgdmlydHVhbCB2b2lkIEdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NOdW1TeW1ib2wpIGNvbnN0Ow0KIA0KLSAgICB2aXJ0dWFsIHZvaWQgR2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkIEdldE1vbnRoTmFtZShpbnQzMl90IG5Nb250aCwgQ0ZYX1dpZGVTdHJpbmcmIHdzTW9udGhOYW1lLCBGWF9CT09MIGJBYmJyID0gVFJVRSkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZCBHZXREYXlOYW1lKGludDMyX3QgbldlZWssIENGWF9XaWRlU3RyaW5nJiB3c0RheU5hbWUsIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkIEdldE1lcmlkaWVtTmFtZShDRlhfV2lkZVN0cmluZyYgd3NNZXJpZGllbU5hbWUsIEZYX0JPT0wgYkFNID0gVFJVRSkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZCBHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQgR2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLCBGWF9CT09MIGJBRCA9IFRSVUUpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldERhdGVUaW1lU3ltYm9scyhDRlhfV2lkZVN0cmluZyYgd3NEdFN5bWJvbCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NNb250aE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXREYXlOYW1lKGludDMyX3QgbldlZWssDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NEYXlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWJiciA9IFRSVUUpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldE1lcmlkaWVtTmFtZShDRlhfV2lkZVN0cmluZyYgd3NNZXJpZGllbU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFNID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEID0gVFJVRSkgY29uc3Q7DQogDQotICAgIHZpcnR1YWwgdm9pZCBHZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkIEdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQgR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQotcHJvdGVjdGVkOg0KLSAgICB2aXJ0dWFsIH5DRlhfTG9jYWxlKCk7DQotICAgIENYTUxfRWxlbWVudCogbV9wRWxlbWVudDsNCisgIHZpcnR1YWwgdm9pZCBHZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2aXJ0dWFsIH5DRlhfTG9jYWxlKCk7DQorICBDWE1MX0VsZW1lbnQqIG1fcEVsZW1lbnQ7DQogfTsNCi1jbGFzcyBDRlhfRm9ybWF0U3RyaW5nIDogcHVibGljIElGWF9Gb3JtYXRTdHJpbmcNCi17DQotcHVibGljOg0KLSAgICBDRlhfRm9ybWF0U3RyaW5nKElGWF9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IsIEZYX0JPT0wgYlVzZUxDSUQpOw0KLSAgICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQorY2xhc3MgQ0ZYX0Zvcm1hdFN0cmluZyA6IHB1YmxpYyBJRlhfRm9ybWF0U3RyaW5nIHsNCisgcHVibGljOg0KKyAgQ0ZYX0Zvcm1hdFN0cmluZyhJRlhfTG9jYWxlTWdyKiBwTG9jYWxlTWdyLCBGWF9CT09MIGJVc2VMQ0lEKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KIA0KLSAgICB2aXJ0dWFsIHZvaWQgU3BsaXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0U3RyaW5nLCBDRlhfV2lkZVN0cmluZ0FycmF5JiB3c1BhdHRlcm5zKTsNCi0gICAgdmlydHVhbCBGWF9MT0NBTEVDQVRFR09SWSBHZXRDYXRlZ29yeShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKTsNCi0gICAgdmlydHVhbCBGWF9XT1JECUdldExDSUQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7DQotICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJR2V0TG9jYWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCVBhcnNlVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNUZXh0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlQYXJzZU51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIEZYX0ZMT0FUICZmVmFsdWUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJUGFyc2VOdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlQYXJzZURhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSwgQ0ZYX1VuaXRpbWUmIGR0VmFsdWUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VaZXJvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VOdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJRm9ybWF0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNUZXh0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJRm9ybWF0TnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCUZvcm1hdE51bShGWF9GTE9BVCBmTnVtLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJRm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlGb3JtYXREYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0LCBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlGb3JtYXREYXRlVGltZShjb25zdCBDRlhfVW5pdGltZSYgZHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTCBGb3JtYXRaZXJvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTCBGb3JtYXROdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQotcHJvdGVjdGVkOg0KLSAgICB2aXJ0dWFsIH5DRlhfRm9ybWF0U3RyaW5nKCk7DQotICAgIElGWF9Mb2NhbGUqIEdldFRleHRGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGF0dGVybiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhdGVnb3J5LCBDRlhfV2lkZVN0cmluZyYgd3NQdXJnZVBhdHRlcm4pOw0KLSAgICBJRlhfTG9jYWxlKiBHZXROdW1lcmljRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIGludDMyX3QmIGlEb3RJbmRleCwgRlhfRFdPUkQmIGR3U3R5bGUsIENGWF9XaWRlU3RyaW5nJiB3c1B1cmdlUGF0dGVybik7DQotICAgIEZYX0JPT0wgCUZvcm1hdFN0ck51bShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSW5wdXROdW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQotICAgIEZYX0JPT0wJCUZvcm1hdExDTnVtZXJpYyhDRlhfTENOdW1lcmljJiBsY051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCi0gICAgRlhfREFURVRJTUVUWVBFIEdldERhdGVUaW1lRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIElGWF9Mb2NhbGUqJiBwTG9jYWxlLCBDRlhfV2lkZVN0cmluZyAmd3NEYXRlUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcgJndzVGltZVBhdHRlcm4pOw0KLSAgICBJRlhfTG9jYWxlKgkJR2V0UGF0dGVybkxvY2FsZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTG9jYWxlKTsNCi0gICAgSUZYX0xvY2FsZU1ncioJbV9wTG9jYWxlTWdyOw0KLSAgICBGWF9CT09MCQkJbV9iVXNlTENJRDsNCisgIHZpcnR1YWwgdm9pZCBTcGxpdEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXRTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgd3NQYXR0ZXJucyk7DQorICB2aXJ0dWFsIEZYX0xPQ0FMRUNBVEVHT1JZIEdldENhdGVnb3J5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pOw0KKyAgdmlydHVhbCBGWF9XT1JEIEdldExDSUQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldExvY2FsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZU51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlZhbHVlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZU51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VEYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiBkdFZhbHVlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZVplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VOdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdE51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRm9ybWF0TnVtKEZYX0ZMT0FUIGZOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBGb3JtYXREYXRlVGltZShjb25zdCBDRlhfVW5pdGltZSYgZHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdFplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRm9ybWF0TnVsbChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdmlydHVhbCB+Q0ZYX0Zvcm1hdFN0cmluZygpOw0KKyAgSUZYX0xvY2FsZSogR2V0VGV4dEZvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2F0ZWdvcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1B1cmdlUGF0dGVybik7DQorICBJRlhfTG9jYWxlKiBHZXROdW1lcmljRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEb3RJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGR3U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1B1cmdlUGF0dGVybik7DQorICBGWF9CT09MIEZvcm1hdFN0ck51bShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSW5wdXROdW0sDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCisgIEZYX0JPT0wgRm9ybWF0TENOdW1lcmljKENGWF9MQ051bWVyaWMmIGxjTnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICBGWF9EQVRFVElNRVRZUEUgR2V0RGF0ZVRpbWVGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiYgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NEYXRlUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUaW1lUGF0dGVybik7DQorICBJRlhfTG9jYWxlKiBHZXRQYXR0ZXJuTG9jYWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbGUpOw0KKyAgSUZYX0xvY2FsZU1nciogbV9wTG9jYWxlTWdyOw0KKyAgRlhfQk9PTCBtX2JVc2VMQ0lEOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlbWdyLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZW1nci5jcHAKaW5kZXggOTUzZjAwMC4uYzBhNjhiZiAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlbWdyLmNwcAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVtZ3IuY3BwCkBAIC04LDk1ICs4LDkwIEBACiAjaW5jbHVkZSAiLi4vZmdhc19iYXNlLmgiDQogI2luY2x1ZGUgImZ4X2xvY2FsZW1nci5oIg0KIA0KLUlGWF9Mb2NhbGVNZ3IqCUZYX0xvY2FsZU1ncl9DcmVhdGUoY29uc3QgRlhfV0NIQVIqIHBzekxvY2FsUGF0aCwgRlhfV09SRCB3RGVmYXVsdExDSUQpDQotew0KLSAgICB2b2lkKiBwUGF0aEhhbmRsZSA9IEZYX09wZW5Gb2xkZXIocHN6TG9jYWxQYXRoKTsNCi0gICAgaWYgKCFwUGF0aEhhbmRsZSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0ZYX0xvY2FsZU1nciogcExvY2FsZU1nciA9IEZYX05FVyBDRlhfTG9jYWxlTWdyKHdEZWZhdWx0TENJRCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRmlsZU5hbWU7DQotICAgIEZYX0JPT0wgYkZvbGRlciA9IEZBTFNFOw0KLSAgICB3aGlsZSAoRlhfR2V0TmV4dEZpbGUocFBhdGhIYW5kbGUsIHdzRmlsZU5hbWUsIGJGb2xkZXIpKSB7DQotICAgICAgICBpZiAoIWJGb2xkZXIpIHsNCi0gICAgICAgICAgICBpZiAod3NGaWxlTmFtZS5HZXRMZW5ndGgoKSA8IDQpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXh0ID0gd3NGaWxlTmFtZS5SaWdodCg0KTsNCi0gICAgICAgICAgICB3c0V4dC5NYWtlTG93ZXIoKTsNCi0gICAgICAgICAgICBpZiAod3NFeHQgIT0gTCIueG1sIikgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGdWxsUGF0aChwc3pMb2NhbFBhdGgpOw0KLSAgICAgICAgICAgIHdzRnVsbFBhdGggKz0gTCJcXCIgKyB3c0ZpbGVOYW1lOw0KLSAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcFJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZCh3c0Z1bGxQYXRoKTsNCi0gICAgICAgICAgICBpZiAoIXBSZWFkKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDWE1MX0VsZW1lbnQqIHBYbWxMb2NhbGUgPSBDWE1MX0VsZW1lbnQ6OlBhcnNlKHBSZWFkKTsNCi0gICAgICAgICAgICBwUmVhZC0+UmVsZWFzZSgpOw0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzc3AgPSBwWG1sTG9jYWxlLT5HZXROYW1lc3BhY2UoKTsNCi0gICAgICAgICAgICBpZiAoYnNzcCA9PSAiaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbS9sb2NhbGl6YXRpb24iKSB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTENJRCA9IHBYbWxMb2NhbGUtPkdldEF0dHJWYWx1ZSgiIiwgImxjaWQiKTsNCi0gICAgICAgICAgICAgICAgd2NoYXJfdCogcEVuZCA9IE5VTEw7DQotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TENJRCA9IHdjc3RvbCh3c0xDSUQsICZwRW5kLCAxNik7DQotICAgICAgICAgICAgICAgIGlmIChwTG9jYWxlTWdyLT5tX2xjaWQyeG1sLkdldFZhbHVlQXQoKHZvaWQqKSh1aW50cHRyX3QpZHdMQ0lEKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBYbWxMb2NhbGU7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBwTG9jYWxlTWdyLT5tX2xjaWQyeG1sLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3TENJRCwgcFhtbExvY2FsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBkZWxldGUgcFhtbExvY2FsZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgRlhfQ2xvc2VGb2xkZXIocFBhdGhIYW5kbGUpOw0KLSAgICByZXR1cm4gcExvY2FsZU1ncjsNCi19DQotQ0ZYX0xvY2FsZU1ncjo6Q0ZYX0xvY2FsZU1ncihGWF9XT1JEIHdEZWZMQ0lEKQ0KLSAgICA6IG1fd0RlZkxDSUQod0RlZkxDSUQpDQotew0KLX0NCi1DRlhfTG9jYWxlTWdyOjp+Q0ZYX0xvY2FsZU1ncigpDQotew0KLSAgICBGWF9QT1NJVElPTiBwcyA9IG1fbGNpZDJsb2NhbGUuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHMpIHsNCi0gICAgICAgIHZvaWQqIHBsY2lkOw0KLSAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQotICAgICAgICBtX2xjaWQybG9jYWxlLkdldE5leHRBc3NvYyhwcywgcGxjaWQsICh2b2lkKiYpcExvY2FsZSk7DQotICAgICAgICBwTG9jYWxlLT5SZWxlYXNlKCk7DQotICAgIH0NCi0gICAgbV9sY2lkMmxvY2FsZS5SZW1vdmVBbGwoKTsNCi0gICAgcHMgPSBtX2xjaWQyeG1sLkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBzKSB7DQotICAgICAgICB2b2lkKiBwbGNpZDsNCi0gICAgICAgIENYTUxfRWxlbWVudCogcHhtbCA9IE5VTEw7DQotICAgICAgICBtX2xjaWQyeG1sLkdldE5leHRBc3NvYyhwcywgcGxjaWQsICh2b2lkKiYpcHhtbCk7DQotICAgICAgICBkZWxldGUgcHhtbDsNCi0gICAgfQ0KLSAgICBtX2xjaWQyeG1sLlJlbW92ZUFsbCgpOw0KLX0NCi1GWF9XT1JECUNGWF9Mb2NhbGVNZ3I6OkdldERlZkxvY2FsZUlEKCkNCi17DQotICAgIHJldHVybiBtX3dEZWZMQ0lEOw0KLX0NCi1JRlhfTG9jYWxlKiBDRlhfTG9jYWxlTWdyOjpHZXREZWZMb2NhbGUoKQ0KLXsNCi0gICAgcmV0dXJuIEdldExvY2FsZShtX3dEZWZMQ0lEKTsNCi19DQotSUZYX0xvY2FsZSogQ0ZYX0xvY2FsZU1ncjo6R2V0TG9jYWxlKEZYX1dPUkQgbGNpZCkNCi17DQotICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSAoSUZYX0xvY2FsZSopbV9sY2lkMmxvY2FsZS5HZXRWYWx1ZUF0KCh2b2lkKikodWludHB0cl90KWxjaWQpOw0KLSAgICBpZiAoIXBMb2NhbGUpIHsNCi0gICAgICAgIENYTUxfRWxlbWVudCogcHhtbCA9IChDWE1MX0VsZW1lbnQqKW1fbGNpZDJ4bWwuR2V0VmFsdWVBdCgodm9pZCopKHVpbnRwdHJfdClsY2lkKTsNCi0gICAgICAgIGlmIChweG1sKSB7DQotICAgICAgICAgICAgcExvY2FsZSA9IElGWF9Mb2NhbGU6OkNyZWF0ZShweG1sKTsNCi0gICAgICAgICAgICBtX2xjaWQybG9jYWxlLlNldEF0KCh2b2lkKikodWludHB0cl90KWxjaWQsIHBMb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBwTG9jYWxlOw0KLX0NCi1JRlhfTG9jYWxlKiBDRlhfTG9jYWxlTWdyOjpHZXRMb2NhbGVCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xvY2FsZU5hbWUpDQotew0KK0lGWF9Mb2NhbGVNZ3IqIEZYX0xvY2FsZU1ncl9DcmVhdGUoY29uc3QgRlhfV0NIQVIqIHBzekxvY2FsUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0RlZmF1bHRMQ0lEKSB7DQorICB2b2lkKiBwUGF0aEhhbmRsZSA9IEZYX09wZW5Gb2xkZXIocHN6TG9jYWxQYXRoKTsNCisgIGlmICghcFBhdGhIYW5kbGUpIHsNCiAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfTG9jYWxlTWdyKiBwTG9jYWxlTWdyID0gRlhfTkVXIENGWF9Mb2NhbGVNZ3Iod0RlZmF1bHRMQ0lEKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRmlsZU5hbWU7DQorICBGWF9CT09MIGJGb2xkZXIgPSBGQUxTRTsNCisgIHdoaWxlIChGWF9HZXROZXh0RmlsZShwUGF0aEhhbmRsZSwgd3NGaWxlTmFtZSwgYkZvbGRlcikpIHsNCisgICAgaWYgKCFiRm9sZGVyKSB7DQorICAgICAgaWYgKHdzRmlsZU5hbWUuR2V0TGVuZ3RoKCkgPCA0KSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHQgPSB3c0ZpbGVOYW1lLlJpZ2h0KDQpOw0KKyAgICAgIHdzRXh0Lk1ha2VMb3dlcigpOw0KKyAgICAgIGlmICh3c0V4dCAhPSBMIi54bWwiKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGdWxsUGF0aChwc3pMb2NhbFBhdGgpOw0KKyAgICAgIHdzRnVsbFBhdGggKz0gTCJcXCIgKyB3c0ZpbGVOYW1lOw0KKyAgICAgIElGWF9GaWxlUmVhZCogcFJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZCh3c0Z1bGxQYXRoKTsNCisgICAgICBpZiAoIXBSZWFkKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgQ1hNTF9FbGVtZW50KiBwWG1sTG9jYWxlID0gQ1hNTF9FbGVtZW50OjpQYXJzZShwUmVhZCk7DQorICAgICAgcFJlYWQtPlJlbGVhc2UoKTsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBic3NwID0gcFhtbExvY2FsZS0+R2V0TmFtZXNwYWNlKCk7DQorICAgICAgaWYgKGJzc3AgPT0gImh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20vbG9jYWxpemF0aW9uIikgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMQ0lEID0gcFhtbExvY2FsZS0+R2V0QXR0clZhbHVlKCIiLCAibGNpZCIpOw0KKyAgICAgICAgd2NoYXJfdCogcEVuZCA9IE5VTEw7DQorICAgICAgICBGWF9EV09SRCBkd0xDSUQgPSB3Y3N0b2wod3NMQ0lELCAmcEVuZCwgMTYpOw0KKyAgICAgICAgaWYgKHBMb2NhbGVNZ3ItPm1fbGNpZDJ4bWwuR2V0VmFsdWVBdCgodm9pZCopKHVpbnRwdHJfdClkd0xDSUQpKSB7DQorICAgICAgICAgIGRlbGV0ZSBwWG1sTG9jYWxlOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcExvY2FsZU1nci0+bV9sY2lkMnhtbC5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0xDSUQsIHBYbWxMb2NhbGUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBkZWxldGUgcFhtbExvY2FsZTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIEZYX0Nsb3NlRm9sZGVyKHBQYXRoSGFuZGxlKTsNCisgIHJldHVybiBwTG9jYWxlTWdyOw0KK30NCitDRlhfTG9jYWxlTWdyOjpDRlhfTG9jYWxlTWdyKEZYX1dPUkQgd0RlZkxDSUQpIDogbV93RGVmTENJRCh3RGVmTENJRCkge30NCitDRlhfTG9jYWxlTWdyOjp+Q0ZYX0xvY2FsZU1ncigpIHsNCisgIEZYX1BPU0lUSU9OIHBzID0gbV9sY2lkMmxvY2FsZS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgdm9pZCogcGxjaWQ7DQorICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgICBtX2xjaWQybG9jYWxlLkdldE5leHRBc3NvYyhwcywgcGxjaWQsICh2b2lkKiYpcExvY2FsZSk7DQorICAgIHBMb2NhbGUtPlJlbGVhc2UoKTsNCisgIH0NCisgIG1fbGNpZDJsb2NhbGUuUmVtb3ZlQWxsKCk7DQorICBwcyA9IG1fbGNpZDJ4bWwuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIHZvaWQqIHBsY2lkOw0KKyAgICBDWE1MX0VsZW1lbnQqIHB4bWwgPSBOVUxMOw0KKyAgICBtX2xjaWQyeG1sLkdldE5leHRBc3NvYyhwcywgcGxjaWQsICh2b2lkKiYpcHhtbCk7DQorICAgIGRlbGV0ZSBweG1sOw0KKyAgfQ0KKyAgbV9sY2lkMnhtbC5SZW1vdmVBbGwoKTsNCit9DQorRlhfV09SRCBDRlhfTG9jYWxlTWdyOjpHZXREZWZMb2NhbGVJRCgpIHsNCisgIHJldHVybiBtX3dEZWZMQ0lEOw0KK30NCitJRlhfTG9jYWxlKiBDRlhfTG9jYWxlTWdyOjpHZXREZWZMb2NhbGUoKSB7DQorICByZXR1cm4gR2V0TG9jYWxlKG1fd0RlZkxDSUQpOw0KK30NCitJRlhfTG9jYWxlKiBDRlhfTG9jYWxlTWdyOjpHZXRMb2NhbGUoRlhfV09SRCBsY2lkKSB7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0NCisgICAgICAoSUZYX0xvY2FsZSopbV9sY2lkMmxvY2FsZS5HZXRWYWx1ZUF0KCh2b2lkKikodWludHB0cl90KWxjaWQpOw0KKyAgaWYgKCFwTG9jYWxlKSB7DQorICAgIENYTUxfRWxlbWVudCogcHhtbCA9DQorICAgICAgICAoQ1hNTF9FbGVtZW50KiltX2xjaWQyeG1sLkdldFZhbHVlQXQoKHZvaWQqKSh1aW50cHRyX3QpbGNpZCk7DQorICAgIGlmIChweG1sKSB7DQorICAgICAgcExvY2FsZSA9IElGWF9Mb2NhbGU6OkNyZWF0ZShweG1sKTsNCisgICAgICBtX2xjaWQybG9jYWxlLlNldEF0KCh2b2lkKikodWludHB0cl90KWxjaWQsIHBMb2NhbGUpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcExvY2FsZTsNCit9DQorSUZYX0xvY2FsZSogQ0ZYX0xvY2FsZU1ncjo6R2V0TG9jYWxlQnlOYW1lKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTG9jYWxlTmFtZSkgew0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZW1nci5oIGIveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlbWdyLmgKaW5kZXggZmJmZGYxMi4uY2EzZTkwZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlbWdyLmgKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlbWdyLmgKQEAgLTYsMjIgKzYsMTkgQEAKIA0KICNpZm5kZWYgX0ZYX0xPQ0FMRU1HUl9JTVBfSF8NCiAjZGVmaW5lIF9GWF9MT0NBTEVNR1JfSU1QX0hfDQotY2xhc3MgQ0ZYX0xvY2FsZU1nciA6IHB1YmxpYyBJRlhfTG9jYWxlTWdyDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX0xvY2FsZU1ncihGWF9XT1JEIHdEZWZMQ0lEKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfV09SRAkJCUdldERlZkxvY2FsZUlEKCk7DQotICAgIHZpcnR1YWwgSUZYX0xvY2FsZSogCUdldERlZkxvY2FsZSgpOw0KLSAgICB2aXJ0dWFsIElGWF9Mb2NhbGUqIAlHZXRMb2NhbGUoRlhfV09SRCBsY2lkKTsNCi0gICAgdmlydHVhbCBJRlhfTG9jYWxlKiAJR2V0TG9jYWxlQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbGVOYW1lKTsNCi0gICAgQ0ZYX01hcFB0clRvUHRyIG1fbGNpZDJ4bWw7DQotcHJvdGVjdGVkOg0KLSAgICB+Q0ZYX0xvY2FsZU1ncigpOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIgbV9sY2lkMmxvY2FsZTsNCi0gICAgRlhfV09SRAkJCW1fd0RlZkxDSUQ7DQorY2xhc3MgQ0ZYX0xvY2FsZU1nciA6IHB1YmxpYyBJRlhfTG9jYWxlTWdyIHsNCisgcHVibGljOg0KKyAgQ0ZYX0xvY2FsZU1ncihGWF9XT1JEIHdEZWZMQ0lEKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9XT1JEIEdldERlZkxvY2FsZUlEKCk7DQorICB2aXJ0dWFsIElGWF9Mb2NhbGUqIEdldERlZkxvY2FsZSgpOw0KKyAgdmlydHVhbCBJRlhfTG9jYWxlKiBHZXRMb2NhbGUoRlhfV09SRCBsY2lkKTsNCisgIHZpcnR1YWwgSUZYX0xvY2FsZSogR2V0TG9jYWxlQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbGVOYW1lKTsNCisgIENGWF9NYXBQdHJUb1B0ciBtX2xjaWQyeG1sOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB+Q0ZYX0xvY2FsZU1ncigpOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fbGNpZDJsb2NhbGU7DQorICBGWF9XT1JEIG1fd0RlZkxDSUQ7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL3htbC9meF9zYXhfaW1wLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuY3BwCmluZGV4IDBlNDdjZTUuLmE1ZGRjZTQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuY3BwCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuY3BwCkBAIC02LDIxMyArNiwxOTYgQEAKIA0KICNpbmNsdWRlICIuLi9mZ2FzX2Jhc2UuaCINCiAjaW5jbHVkZSAiZnhfc2F4X2ltcC5oIg0KLUlGWF9TQVhSZWFkZXIqIEZYX1NBWFJlYWRlcl9DcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDRlhfU0FYUmVhZGVyOw0KK0lGWF9TQVhSZWFkZXIqIEZYX1NBWFJlYWRlcl9DcmVhdGUoKSB7DQorICByZXR1cm4gRlhfTkVXIENGWF9TQVhSZWFkZXI7DQogfQ0KIENGWF9TQVhGaWxlOjpDRlhfU0FYRmlsZSgpDQotICAgIDogbV9wRmlsZShOVUxMKQ0KLSAgICAsIG1fZHdTdGFydCgwKQ0KLSAgICAsIG1fZHdFbmQoMCkNCi0gICAgLCBtX2R3Q3VyKDApDQotICAgICwgbV9wQnVmKE5VTEwpDQotICAgICwgbV9kd0J1ZlNpemUoMCkNCi0gICAgLCBtX2R3QnVmSW5kZXgoMCkNCi17DQorICAgIDogbV9wRmlsZShOVUxMKSwNCisgICAgICBtX2R3U3RhcnQoMCksDQorICAgICAgbV9kd0VuZCgwKSwNCisgICAgICBtX2R3Q3VyKDApLA0KKyAgICAgIG1fcEJ1ZihOVUxMKSwNCisgICAgICBtX2R3QnVmU2l6ZSgwKSwNCisgICAgICBtX2R3QnVmSW5kZXgoMCkge30NCitGWF9CT09MIENGWF9TQVhGaWxlOjpTdGFydEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdMZW4pIHsNCisgIEZYU1lTX2Fzc2VydChtX3BGaWxlID09IE5VTEwgJiYgcEZpbGUgIT0gTlVMTCk7DQorICBGWF9EV09SRCBkd1NpemUgPSBwRmlsZS0+R2V0U2l6ZSgpOw0KKyAgaWYgKGR3U3RhcnQgPj0gZHdTaXplKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChkd0xlbiA9PSAtMSB8fCBkd1N0YXJ0ICsgZHdMZW4gPiBkd1NpemUpIHsNCisgICAgZHdMZW4gPSBkd1NpemUgLSBkd1N0YXJ0Ow0KKyAgfQ0KKyAgaWYgKGR3TGVuID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9kd0J1ZlNpemUgPSBGWF9NSU4oZHdMZW4sIEZYX1NBWEZJTEVfQlVGU0laRSk7DQorICBtX3BCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBtX2R3QnVmU2l6ZSk7DQorICBpZiAoIW1fcEJ1Zikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoIXBGaWxlLT5SZWFkQmxvY2sobV9wQnVmLCBkd1N0YXJ0LCBtX2R3QnVmU2l6ZSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9kd1N0YXJ0ID0gZHdTdGFydDsNCisgIG1fZHdFbmQgPSBkd1N0YXJ0ICsgZHdMZW47DQorICBtX2R3Q3VyID0gZHdTdGFydDsNCisgIG1fcEZpbGUgPSBwRmlsZTsNCisgIG1fZHdCdWZJbmRleCA9IDA7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfU0FYRmlsZTo6U3RhcnRGaWxlKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0RXT1JEIGR3U3RhcnQsIEZYX0RXT1JEIGR3TGVuKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEZpbGUgPT0gTlVMTCAmJiBwRmlsZSAhPSBOVUxMKTsNCi0gICAgRlhfRFdPUkQgZHdTaXplID0gcEZpbGUtPkdldFNpemUoKTsNCi0gICAgaWYgKGR3U3RhcnQgPj0gZHdTaXplKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKGR3TGVuID09IC0xIHx8IGR3U3RhcnQgKyBkd0xlbiA+IGR3U2l6ZSkgew0KLSAgICAgICAgZHdMZW4gPSBkd1NpemUgLSBkd1N0YXJ0Ow0KLSAgICB9DQotICAgIGlmIChkd0xlbiA9PSAwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgbV9kd0J1ZlNpemUgPSBGWF9NSU4oZHdMZW4sIEZYX1NBWEZJTEVfQlVGU0laRSk7DQotICAgIG1fcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fZHdCdWZTaXplKTsNCi0gICAgaWYgKCFtX3BCdWYpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoIXBGaWxlLT5SZWFkQmxvY2sobV9wQnVmLCBkd1N0YXJ0LCBtX2R3QnVmU2l6ZSkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX2R3U3RhcnQgPSBkd1N0YXJ0Ow0KLSAgICBtX2R3RW5kID0gZHdTdGFydCArIGR3TGVuOw0KLSAgICBtX2R3Q3VyID0gZHdTdGFydDsNCi0gICAgbV9wRmlsZSA9IHBGaWxlOw0KLSAgICBtX2R3QnVmSW5kZXggPSAwOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9TQVhGaWxlOjpSZWFkTmV4dEJsb2NrKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZpbGUgIT0gTlVMTCk7DQorICBGWF9EV09SRCBkd1NpemUgPSBtX2R3RW5kIC0gbV9kd0N1cjsNCisgIGlmIChkd1NpemUgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2R3QnVmU2l6ZSA9IEZYX01JTihkd1NpemUsIEZYX1NBWEZJTEVfQlVGU0laRSk7DQorICBpZiAoIW1fcEZpbGUtPlJlYWRCbG9jayhtX3BCdWYsIG1fZHdDdXIsIG1fZHdCdWZTaXplKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2R3QnVmSW5kZXggPSAwOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX1NBWEZpbGU6OlJlYWROZXh0QmxvY2soKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEZpbGUgIT0gTlVMTCk7DQotICAgIEZYX0RXT1JEIGR3U2l6ZSA9IG1fZHdFbmQgLSBtX2R3Q3VyOw0KLSAgICBpZiAoZHdTaXplID09IDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX2R3QnVmU2l6ZSA9IEZYX01JTihkd1NpemUsIEZYX1NBWEZJTEVfQlVGU0laRSk7DQotICAgIGlmICghbV9wRmlsZS0+UmVhZEJsb2NrKG1fcEJ1ZiwgbV9kd0N1ciwgbV9kd0J1ZlNpemUpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgbV9kd0J1ZkluZGV4ID0gMDsNCi0gICAgcmV0dXJuIFRSVUU7DQordm9pZCBDRlhfU0FYRmlsZTo6UmVzZXQoKSB7DQorICBpZiAobV9wQnVmKSB7DQorICAgIEZYX0ZyZWUobV9wQnVmKTsNCisgICAgbV9wQnVmID0gTlVMTDsNCisgIH0NCisgIG1fcEZpbGUgPSBOVUxMOw0KIH0NCi12b2lkIENGWF9TQVhGaWxlOjpSZXNldCgpDQotew0KLSAgICBpZiAobV9wQnVmKSB7DQotICAgICAgICBGWF9GcmVlKG1fcEJ1Zik7DQotICAgICAgICBtX3BCdWYgPSBOVUxMOw0KLSAgICB9DQotICAgIG1fcEZpbGUgPSBOVUxMOw0KLX0NCi0jZGVmaW5lIEZYX1NBWENIQVJUWVBFX05vcm1hbAkJMA0KLSNkZWZpbmUgRlhfU0FYQ0hBUlRZUEVfU3BhY2UJCTENCisjZGVmaW5lIEZYX1NBWENIQVJUWVBFX05vcm1hbCAwDQorI2RlZmluZSBGWF9TQVhDSEFSVFlQRV9TcGFjZSAxDQogc3RhdGljIHVpbnQ4X3QgZ19TQVhfQ2hhclR5cGVbMjU2XSA9IHsNCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwNCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwNCi0gICAgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwNCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCiAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCiB9Ow0KIENGWF9TQVhSZWFkZXI6OkNGWF9TQVhSZWFkZXIoKQ0KLSAgICA6IG1fRmlsZSgpDQotICAgICwgbV9wSGFuZGxlcihOVUxMKQ0KLSAgICAsIG1faVN0YXRlKC0xKQ0KLSAgICAsIG1fcFJvb3QoTlVMTCkNCi0gICAgLCBtX3BDdXJJdGVtKE5VTEwpDQotICAgICwgbV9kd0l0ZW1JRCgwKQ0KLSAgICAsIG1faURhdGFTaXplKDI1NikNCi0gICAgLCBtX2lOYW1lU2l6ZSgyNTYpDQotICAgICwgbV9wQ29tbWVudENvbnRleHQoTlVMTCkNCi0gICAgLCBtX2R3UGFyc2VNb2RlKDApDQotew0KLSAgICBtX3BzekRhdGEgPSAodWludDhfdCopRlhfQWxsb2ModWludDhfdCwgbV9pRGF0YVNpemUpOw0KLSAgICBtX3Bzek5hbWUgPSAodWludDhfdCopRlhfQWxsb2ModWludDhfdCwgbV9pTmFtZVNpemUpOw0KKyAgICA6IG1fRmlsZSgpLA0KKyAgICAgIG1fcEhhbmRsZXIoTlVMTCksDQorICAgICAgbV9pU3RhdGUoLTEpLA0KKyAgICAgIG1fcFJvb3QoTlVMTCksDQorICAgICAgbV9wQ3VySXRlbShOVUxMKSwNCisgICAgICBtX2R3SXRlbUlEKDApLA0KKyAgICAgIG1faURhdGFTaXplKDI1NiksDQorICAgICAgbV9pTmFtZVNpemUoMjU2KSwNCisgICAgICBtX3BDb21tZW50Q29udGV4dChOVUxMKSwNCisgICAgICBtX2R3UGFyc2VNb2RlKDApIHsNCisgIG1fcHN6RGF0YSA9ICh1aW50OF90KilGWF9BbGxvYyh1aW50OF90LCBtX2lEYXRhU2l6ZSk7DQorICBtX3Bzek5hbWUgPSAodWludDhfdCopRlhfQWxsb2ModWludDhfdCwgbV9pTmFtZVNpemUpOw0KIH0NCi1DRlhfU0FYUmVhZGVyOjp+Q0ZYX1NBWFJlYWRlcigpDQotew0KLSAgICBSZXNldCgpOw0KLSAgICBpZiAobV9wc3pEYXRhKSB7DQotICAgICAgICBGWF9GcmVlKG1fcHN6RGF0YSk7DQotICAgICAgICBtX3BzekRhdGEgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3Bzek5hbWUpIHsNCi0gICAgICAgIEZYX0ZyZWUobV9wc3pOYW1lKTsNCi0gICAgICAgIG1fcHN6TmFtZSA9IE5VTEw7DQotICAgIH0NCitDRlhfU0FYUmVhZGVyOjp+Q0ZYX1NBWFJlYWRlcigpIHsNCisgIFJlc2V0KCk7DQorICBpZiAobV9wc3pEYXRhKSB7DQorICAgIEZYX0ZyZWUobV9wc3pEYXRhKTsNCisgICAgbV9wc3pEYXRhID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3Bzek5hbWUpIHsNCisgICAgRlhfRnJlZShtX3Bzek5hbWUpOw0KKyAgICBtX3Bzek5hbWUgPSBOVUxMOw0KKyAgfQ0KIH0NCi12b2lkIENGWF9TQVhSZWFkZXI6OlJlc2V0KCkNCi17DQotICAgIG1fRmlsZS5SZXNldCgpOw0KLSAgICBDRlhfU0FYSXRlbSAqcEl0ZW0gPSBtX3BSb290Ow0KLSAgICB3aGlsZSAocEl0ZW0pIHsNCi0gICAgICAgIENGWF9TQVhJdGVtICpwTmV4dCA9IHBJdGVtLT5tX3BOZXh0Ow0KLSAgICAgICAgZGVsZXRlIHBJdGVtOw0KLSAgICAgICAgcEl0ZW0gPSBwTmV4dDsNCi0gICAgfQ0KLSAgICBtX3BSb290ID0gTlVMTDsNCi0gICAgbV9wQ3VySXRlbSA9IE5VTEw7DQotICAgIG1fZHdJdGVtSUQgPSAwOw0KLSAgICBtX1NraXBTdGFjay5SZW1vdmVBbGwoKTsNCi0gICAgbV9Ta2lwQ2hhciA9IDA7DQotICAgIG1faURhdGFMZW5ndGggPSAwOw0KLSAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KLSAgICBtX2lOYW1lTGVuZ3RoID0gMDsNCi0gICAgbV9pRGF0YVBvcyA9IDA7DQotICAgIGlmIChtX3BDb21tZW50Q29udGV4dCkgew0KLSAgICAgICAgZGVsZXRlIG1fcENvbW1lbnRDb250ZXh0Ow0KLSAgICAgICAgbV9wQ29tbWVudENvbnRleHQgPSBOVUxMOw0KLSAgICB9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpSZXNldCgpIHsNCisgIG1fRmlsZS5SZXNldCgpOw0KKyAgQ0ZYX1NBWEl0ZW0qIHBJdGVtID0gbV9wUm9vdDsNCisgIHdoaWxlIChwSXRlbSkgew0KKyAgICBDRlhfU0FYSXRlbSogcE5leHQgPSBwSXRlbS0+bV9wTmV4dDsNCisgICAgZGVsZXRlIHBJdGVtOw0KKyAgICBwSXRlbSA9IHBOZXh0Ow0KKyAgfQ0KKyAgbV9wUm9vdCA9IE5VTEw7DQorICBtX3BDdXJJdGVtID0gTlVMTDsNCisgIG1fZHdJdGVtSUQgPSAwOw0KKyAgbV9Ta2lwU3RhY2suUmVtb3ZlQWxsKCk7DQorICBtX1NraXBDaGFyID0gMDsNCisgIG1faURhdGFMZW5ndGggPSAwOw0KKyAgbV9pRW50aXR5U3RhcnQgPSAtMTsNCisgIG1faU5hbWVMZW5ndGggPSAwOw0KKyAgbV9pRGF0YVBvcyA9IDA7DQorICBpZiAobV9wQ29tbWVudENvbnRleHQpIHsNCisgICAgZGVsZXRlIG1fcENvbW1lbnRDb250ZXh0Ow0KKyAgICBtX3BDb21tZW50Q29udGV4dCA9IE5VTEw7DQorICB9DQogfQ0KLWlubGluZSB2b2lkIENGWF9TQVhSZWFkZXI6OlB1c2goKQ0KLXsNCi0gICAgQ0ZYX1NBWEl0ZW0gKnBOZXcgPSBGWF9ORVcgQ0ZYX1NBWEl0ZW07DQotICAgIHBOZXctPm1fZHdJRCA9ICsrbV9kd0l0ZW1JRDsNCi0gICAgcE5ldy0+bV9iU2tpcCA9IG1fcEN1ckl0ZW0tPm1fYlNraXA7DQotICAgIHBOZXctPm1fcFByZXYgPSBtX3BDdXJJdGVtOw0KLSAgICBtX3BDdXJJdGVtLT5tX3BOZXh0ID0gcE5ldzsNCi0gICAgbV9wQ3VySXRlbSA9IHBOZXc7DQoraW5saW5lIHZvaWQgQ0ZYX1NBWFJlYWRlcjo6UHVzaCgpIHsNCisgIENGWF9TQVhJdGVtKiBwTmV3ID0gRlhfTkVXIENGWF9TQVhJdGVtOw0KKyAgcE5ldy0+bV9kd0lEID0gKyttX2R3SXRlbUlEOw0KKyAgcE5ldy0+bV9iU2tpcCA9IG1fcEN1ckl0ZW0tPm1fYlNraXA7DQorICBwTmV3LT5tX3BQcmV2ID0gbV9wQ3VySXRlbTsNCisgIG1fcEN1ckl0ZW0tPm1fcE5leHQgPSBwTmV3Ow0KKyAgbV9wQ3VySXRlbSA9IHBOZXc7DQogfQ0KLWlubGluZSB2b2lkIENGWF9TQVhSZWFkZXI6OlBvcCgpDQotew0KLSAgICBpZiAoIW1fcEN1ckl0ZW0pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfU0FYSXRlbSAqcFByZXYgPSBtX3BDdXJJdGVtLT5tX3BQcmV2Ow0KLSAgICBwUHJldi0+bV9wTmV4dCA9IE5VTEw7DQotICAgIGRlbGV0ZSBtX3BDdXJJdGVtOw0KLSAgICBtX3BDdXJJdGVtID0gcFByZXY7DQoraW5saW5lIHZvaWQgQ0ZYX1NBWFJlYWRlcjo6UG9wKCkgew0KKyAgaWYgKCFtX3BDdXJJdGVtKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9TQVhJdGVtKiBwUHJldiA9IG1fcEN1ckl0ZW0tPm1fcFByZXY7DQorICBwUHJldi0+bV9wTmV4dCA9IE5VTEw7DQorICBkZWxldGUgbV9wQ3VySXRlbTsNCisgIG1fcEN1ckl0ZW0gPSBwUHJldjsNCiB9DQotaW5saW5lIHZvaWQgQ0ZYX1NBWFJlYWRlcjo6QXBwZW5kRGF0YSh1aW50OF90IGNoKQ0KLXsNCi0gICAgUmVhbGxvY0RhdGFCdWZmZXIoKTsNCi0gICAgbV9wc3pEYXRhW21faURhdGFQb3MrK10gPSBjaDsNCitpbmxpbmUgdm9pZCBDRlhfU0FYUmVhZGVyOjpBcHBlbmREYXRhKHVpbnQ4X3QgY2gpIHsNCisgIFJlYWxsb2NEYXRhQnVmZmVyKCk7DQorICBtX3BzekRhdGFbbV9pRGF0YVBvcysrXSA9IGNoOw0KIH0NCi1pbmxpbmUgdm9pZCBDRlhfU0FYUmVhZGVyOjpBcHBlbmROYW1lKHVpbnQ4X3QgY2gpDQotew0KLSAgICBSZWFsbG9jTmFtZUJ1ZmZlcigpOw0KLSAgICBtX3Bzek5hbWVbbV9pRGF0YVBvcysrXSA9IGNoOw0KK2lubGluZSB2b2lkIENGWF9TQVhSZWFkZXI6OkFwcGVuZE5hbWUodWludDhfdCBjaCkgew0KKyAgUmVhbGxvY05hbWVCdWZmZXIoKTsNCisgIG1fcHN6TmFtZVttX2lEYXRhUG9zKytdID0gY2g7DQogfQ0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UmVhbGxvY0RhdGFCdWZmZXIoKQ0KLXsNCi0gICAgaWYgKG1faURhdGFQb3MgPCBtX2lEYXRhU2l6ZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChtX2lEYXRhU2l6ZSA8PSAxMDI0ICogMTAyNCkgew0KLSAgICAgICAgbV9pRGF0YVNpemUgKj0gMjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1faURhdGFTaXplICs9IDEwMjQgKiAxMDI0Ow0KLSAgICB9DQotICAgIG1fcHN6RGF0YSA9ICh1aW50OF90KilGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcHN6RGF0YSwgbV9pRGF0YVNpemUpOw0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UmVhbGxvY0RhdGFCdWZmZXIoKSB7DQorICBpZiAobV9pRGF0YVBvcyA8IG1faURhdGFTaXplKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX2lEYXRhU2l6ZSA8PSAxMDI0ICogMTAyNCkgew0KKyAgICBtX2lEYXRhU2l6ZSAqPSAyOw0KKyAgfSBlbHNlIHsNCisgICAgbV9pRGF0YVNpemUgKz0gMTAyNCAqIDEwMjQ7DQorICB9DQorICBtX3BzekRhdGEgPSAodWludDhfdCopRlhfUmVhbGxvYyh1aW50OF90LCBtX3BzekRhdGEsIG1faURhdGFTaXplKTsNCiB9DQotdm9pZCBDRlhfU0FYUmVhZGVyOjpSZWFsbG9jTmFtZUJ1ZmZlcigpDQotew0KLSAgICBpZiAobV9pRGF0YVBvcyA8IG1faU5hbWVTaXplKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1faU5hbWVTaXplIDw9IDEwMjQgKiAxMDI0KSB7DQotICAgICAgICBtX2lOYW1lU2l6ZSAqPSAyOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9pTmFtZVNpemUgKz0gMTAyNCAqIDEwMjQ7DQotICAgIH0NCi0gICAgbV9wc3pOYW1lID0gKHVpbnQ4X3QqKUZYX1JlYWxsb2ModWludDhfdCwgbV9wc3pOYW1lLCBtX2lOYW1lU2l6ZSk7DQordm9pZCBDRlhfU0FYUmVhZGVyOjpSZWFsbG9jTmFtZUJ1ZmZlcigpIHsNCisgIGlmIChtX2lEYXRhUG9zIDwgbV9pTmFtZVNpemUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1faU5hbWVTaXplIDw9IDEwMjQgKiAxMDI0KSB7DQorICAgIG1faU5hbWVTaXplICo9IDI7DQorICB9IGVsc2Ugew0KKyAgICBtX2lOYW1lU2l6ZSArPSAxMDI0ICogMTAyNDsNCisgIH0NCisgIG1fcHN6TmFtZSA9ICh1aW50OF90KilGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcHN6TmFtZSwgbV9pTmFtZVNpemUpOw0KIH0NCi1pbmxpbmUgRlhfQk9PTCBDRlhfU0FYUmVhZGVyOjpTa2lwU3BhY2UodWludDhfdCBjaCkNCi17DQotICAgIHJldHVybiAobV9kd1BhcnNlTW9kZSAmIEZYX1NBWFBBUlNFTU9ERV9Ob3RTa2lwU3BhY2UpID09IDAgJiYgY2ggPCAweDIxOw0KK2lubGluZSBGWF9CT09MIENGWF9TQVhSZWFkZXI6OlNraXBTcGFjZSh1aW50OF90IGNoKSB7DQorICByZXR1cm4gKG1fZHdQYXJzZU1vZGUgJiBGWF9TQVhQQVJTRU1PREVfTm90U2tpcFNwYWNlKSA9PSAwICYmIGNoIDwgMHgyMTsNCiB9DQotaW50MzJfdCBDRlhfU0FYUmVhZGVyOjpTdGFydFBhcnNlKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0RXT1JEIGR3U3RhcnQgLCBGWF9EV09SRCBkd0xlbiAsIEZYX0RXT1JEIGR3UGFyc2VNb2RlICkNCi17DQotICAgIG1faVN0YXRlID0gLTE7DQotICAgIFJlc2V0KCk7DQotICAgIGlmICghbV9GaWxlLlN0YXJ0RmlsZShwRmlsZSwgZHdTdGFydCwgZHdMZW4pKSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgbV9pU3RhdGUgPSAwOw0KLSAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KLSAgICBtX2VQcmV2TW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCi0gICAgbV9iQ2hhckRhdGEgPSBGQUxTRTsNCi0gICAgbV9kd0RhdGFPZmZzZXQgPSAwOw0KLSAgICBtX3BSb290ID0gbV9wQ3VySXRlbSA9IEZYX05FVyBDRlhfU0FYSXRlbTsNCi0gICAgbV9wQ3VySXRlbS0+bV9kd0lEID0gKyttX2R3SXRlbUlEOw0KLSAgICBtX2R3UGFyc2VNb2RlID0gZHdQYXJzZU1vZGU7DQotICAgIHJldHVybiAwOw0KK2ludDMyX3QgQ0ZYX1NBWFJlYWRlcjo6U3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYXJzZU1vZGUpIHsNCisgIG1faVN0YXRlID0gLTE7DQorICBSZXNldCgpOw0KKyAgaWYgKCFtX0ZpbGUuU3RhcnRGaWxlKHBGaWxlLCBkd1N0YXJ0LCBkd0xlbikpIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgbV9pU3RhdGUgPSAwOw0KKyAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgIG1fZVByZXZNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgbV9iQ2hhckRhdGEgPSBGQUxTRTsNCisgIG1fZHdEYXRhT2Zmc2V0ID0gMDsNCisgIG1fcFJvb3QgPSBtX3BDdXJJdGVtID0gRlhfTkVXIENGWF9TQVhJdGVtOw0KKyAgbV9wQ3VySXRlbS0+bV9kd0lEID0gKyttX2R3SXRlbUlEOw0KKyAgbV9kd1BhcnNlTW9kZSA9IGR3UGFyc2VNb2RlOw0KKyAgcmV0dXJuIDA7DQogfQ0KIHR5cGVkZWYgdm9pZCAoQ0ZYX1NBWFJlYWRlcjo6KkZYX1NBWFJlYWRlcl9MUEZQYXJzZSkoKTsNCiBzdGF0aWMgY29uc3QgRlhfU0FYUmVhZGVyX0xQRlBhcnNlIGdfRlhfU0FYUmVhZGVyX0xQRlBhcnNlW0ZYX1NBWE1PREVfTUFYXSA9IHsNCkBAIC0yMzEsNDkwICsyMTQsNDg1IEBACiAgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlVGFnRW5kLA0KICAgICAmQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYXJnZXREYXRhLA0KIH07DQotaW50MzJfdCBDRlhfU0FYUmVhZGVyOjpDb250aW51ZVBhcnNlKElGWF9QYXVzZSAqcFBhdXNlICkNCi17DQotICAgIGlmIChtX2lTdGF0ZSA8IDAgfHwgbV9pU3RhdGUgPiA5OSkgew0KLSAgICAgICAgcmV0dXJuIG1faVN0YXRlOw0KLSAgICB9DQotICAgIHdoaWxlKG1fRmlsZS5tX2R3Q3VyIDwgbV9GaWxlLm1fZHdFbmQpIHsNCi0gICAgICAgIEZYX0RXT1JEICZpbmRleCA9IG1fRmlsZS5tX2R3QnVmSW5kZXg7DQotICAgICAgICBGWF9EV09SRCBzaXplID0gbV9GaWxlLm1fZHdCdWZTaXplOw0KLSAgICAgICAgY29uc3QgdWludDhfdCogcEJ1ZiA9IG1fRmlsZS5tX3BCdWY7DQotICAgICAgICB3aGlsZSAoaW5kZXggPCBzaXplKSB7DQotICAgICAgICAgICAgbV9DdXJCeXRlID0gcEJ1ZltpbmRleF07DQotICAgICAgICAgICAgKHRoaXMtPipnX0ZYX1NBWFJlYWRlcl9MUEZQYXJzZVttX2VNb2RlXSkoKTsNCi0gICAgICAgICAgICBpbmRleCArKzsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fRmlsZS5tX2R3Q3VyICs9IGluZGV4Ow0KLSAgICAgICAgbV9pU3RhdGUgPSAobV9GaWxlLm1fZHdDdXIgLSBtX0ZpbGUubV9kd1N0YXJ0KSAqIDEwMCAvIChtX0ZpbGUubV9kd0VuZCAtIG1fRmlsZS5tX2R3U3RhcnQpOw0KLSAgICAgICAgaWYgKG1fRmlsZS5tX2R3Q3VyID49IG1fRmlsZS5tX2R3RW5kKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIW1fRmlsZS5SZWFkTmV4dEJsb2NrKCkpIHsNCi0gICAgICAgICAgICBtX2lTdGF0ZSA9IC0yOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9kd0RhdGFPZmZzZXQgPSAwOw0KLSAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KK2ludDMyX3QgQ0ZYX1NBWFJlYWRlcjo6Q29udGludWVQYXJzZShJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgaWYgKG1faVN0YXRlIDwgMCB8fCBtX2lTdGF0ZSA+IDk5KSB7DQogICAgIHJldHVybiBtX2lTdGF0ZTsNCisgIH0NCisgIHdoaWxlIChtX0ZpbGUubV9kd0N1ciA8IG1fRmlsZS5tX2R3RW5kKSB7DQorICAgIEZYX0RXT1JEJiBpbmRleCA9IG1fRmlsZS5tX2R3QnVmSW5kZXg7DQorICAgIEZYX0RXT1JEIHNpemUgPSBtX0ZpbGUubV9kd0J1ZlNpemU7DQorICAgIGNvbnN0IHVpbnQ4X3QqIHBCdWYgPSBtX0ZpbGUubV9wQnVmOw0KKyAgICB3aGlsZSAoaW5kZXggPCBzaXplKSB7DQorICAgICAgbV9DdXJCeXRlID0gcEJ1ZltpbmRleF07DQorICAgICAgKHRoaXMtPipnX0ZYX1NBWFJlYWRlcl9MUEZQYXJzZVttX2VNb2RlXSkoKTsNCisgICAgICBpbmRleCsrOw0KKyAgICB9DQorICAgIG1fRmlsZS5tX2R3Q3VyICs9IGluZGV4Ow0KKyAgICBtX2lTdGF0ZSA9IChtX0ZpbGUubV9kd0N1ciAtIG1fRmlsZS5tX2R3U3RhcnQpICogMTAwIC8NCisgICAgICAgICAgICAgICAobV9GaWxlLm1fZHdFbmQgLSBtX0ZpbGUubV9kd1N0YXJ0KTsNCisgICAgaWYgKG1fRmlsZS5tX2R3Q3VyID49IG1fRmlsZS5tX2R3RW5kKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKCFtX0ZpbGUuUmVhZE5leHRCbG9jaygpKSB7DQorICAgICAgbV9pU3RhdGUgPSAtMjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBtX2R3RGF0YU9mZnNldCA9IDA7DQorICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBtX2lTdGF0ZTsNCiB9DQotdm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZUNoYXIodWludDhfdCBjaCkNCi17DQotICAgIFJlYWxsb2NEYXRhQnVmZmVyKCk7DQotICAgIG1fcHN6RGF0YVttX2lEYXRhUG9zXSA9IGNoOw0KLSAgICBpZiAobV9pRW50aXR5U3RhcnQgPiAtMSAmJiBjaCA9PSAnOycpIHsNCi0gICAgICAgIGludDMyX3QgaVNhdmVFbnRpdHlTdGFydCA9IG1faUVudGl0eVN0YXJ0Ow0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRpdHkobV9wc3pEYXRhICsgbV9pRW50aXR5U3RhcnQgKyAxLCBtX2lEYXRhUG9zIC0gbV9pRW50aXR5U3RhcnQgLSAxKTsNCi0gICAgICAgIGludDMyX3QgaUxlbiA9IGNzRW50aXR5LkdldExlbmd0aCgpOw0KLSAgICAgICAgaWYgKGlMZW4gPiAwKSB7DQotICAgICAgICAgICAgaWYgKGNzRW50aXR5WzBdID09ICcjJykgew0KLSAgICAgICAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9zaGFycCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgY2ggPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCB3Ow0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlMZW4gPiAxICYmIGNzRW50aXR5WzFdID09ICd4Jykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZW47IGkgKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IGNzRW50aXR5W2ldOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodyA+PSAnMCcgJiYgdyA8PSAnOScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgdyAtICcwJzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3ID49ICdBJyAmJiB3IDw9ICdGJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gNTU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodyA+PSAnYScgJiYgdyA8PSAnZicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgdyAtIDg3Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlMZW47IGkgKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IGNzRW50aXR5W2ldOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodyA8ICcwJyB8fCB3ID4gJzknKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IGNoICogMTAgKyB3IC0gJzAnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wc3pEYXRhW21faUVudGl0eVN0YXJ0ICsrXSA9IGNoOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKGNzRW50aXR5LkNvbXBhcmUoImFtcCIpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2FtcCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSAnJic7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZSgibHQiKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9sdCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSAnPCc7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZSgiZ3QiKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9ndCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSAnPic7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZSgiYXBvcyIpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2Fwb3MpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BzekRhdGFbbV9pRW50aXR5U3RhcnQgKytdID0gJ1wnJzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKCJxdW90IikgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChtX2R3UGFyc2VNb2RlICYgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfcXVvdCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCArK10gPSAnXCInOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZUNoYXIodWludDhfdCBjaCkgew0KKyAgUmVhbGxvY0RhdGFCdWZmZXIoKTsNCisgIG1fcHN6RGF0YVttX2lEYXRhUG9zXSA9IGNoOw0KKyAgaWYgKG1faUVudGl0eVN0YXJ0ID4gLTEgJiYgY2ggPT0gJzsnKSB7DQorICAgIGludDMyX3QgaVNhdmVFbnRpdHlTdGFydCA9IG1faUVudGl0eVN0YXJ0Ow0KKyAgICBDRlhfQnl0ZVN0cmluZyBjc0VudGl0eShtX3BzekRhdGEgKyBtX2lFbnRpdHlTdGFydCArIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgLSBtX2lFbnRpdHlTdGFydCAtIDEpOw0KKyAgICBpbnQzMl90IGlMZW4gPSBjc0VudGl0eS5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW4gPiAwKSB7DQorICAgICAgaWYgKGNzRW50aXR5WzBdID09ICcjJykgew0KKyAgICAgICAgaWYgKChtX2R3UGFyc2VNb2RlICYgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfc2hhcnApID09IDApIHsNCisgICAgICAgICAgY2ggPSAwOw0KKyAgICAgICAgICB1aW50OF90IHc7DQorICAgICAgICAgIGlmIChpTGVuID4gMSAmJiBjc0VudGl0eVsxXSA9PSAneCcpIHsNCisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsNCisgICAgICAgICAgICAgIGlmICh3ID49ICcwJyAmJiB3IDw9ICc5Jykgew0KKyAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSAnMCc7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gJ0EnICYmIHcgPD0gJ0YnKSB7DQorICAgICAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgdyAtIDU1Ow0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmICh3ID49ICdhJyAmJiB3IDw9ICdmJykgew0KKyAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA4NzsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpU2F2ZUVudGl0eVN0YXJ0ICE9IG1faUVudGl0eVN0YXJ0KSB7DQotICAgICAgICAgICAgbV9pRGF0YVBvcyA9IG1faUVudGl0eVN0YXJ0Ow0KLSAgICAgICAgICAgIG1faUVudGl0eVN0YXJ0ID0gLTE7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1faURhdGFQb3MgKys7DQotICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgPSAtMTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChtX2lFbnRpdHlTdGFydCA8IDAgJiYgY2ggPT0gJyYnKSB7DQotICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgPSBtX2lEYXRhUG9zOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9pRGF0YVBvcyArKzsNCi0gICAgfQ0KLX0NCi12b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGV4dCgpDQotew0KLSAgICBpZiAobV9DdXJCeXRlID09ICc8Jykgew0KLSAgICAgICAgaWYgKG1faURhdGFQb3MgPiAwKSB7DQotICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQotICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQotICAgICAgICAgICAgaWYgKG1fcEhhbmRsZXIpIHsNCi0gICAgICAgICAgICAgICAgTm90aWZ5RGF0YSgpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlMZW47IGkrKykgew0KKyAgICAgICAgICAgICAgdyA9IGNzRW50aXR5W2ldOw0KKyAgICAgICAgICAgICAgaWYgKHcgPCAnMCcgfHwgdyA+ICc5Jykgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGNoID0gY2ggKiAxMCArIHcgLSAnMCc7DQogICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChjaCAhPSAwKSB7DQorICAgICAgICAgICAgbV9wc3pEYXRhW21faUVudGl0eVN0YXJ0KytdID0gY2g7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCi0gICAgICAgIFB1c2goKTsNCi0gICAgICAgIG1fZHdOb2RlUG9zID0gbV9GaWxlLm1fZHdDdXIgKyBtX0ZpbGUubV9kd0J1ZkluZGV4Ow0KLSAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfTm9kZVN0YXJ0Ow0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChtX2lEYXRhUG9zIDwgMSAmJiBTa2lwU3BhY2UobV9DdXJCeXRlKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIFBhcnNlQ2hhcihtX0N1ckJ5dGUpOw0KLX0NCi12b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlTm9kZVN0YXJ0KCkNCi17DQotICAgIGlmIChtX0N1ckJ5dGUgPT0gJz8nKSB7DQotICAgICAgICBtX3BDdXJJdGVtLT5tX2VOb2RlID0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbjsNCi0gICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ05hbWU7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1fQ3VyQnl0ZSA9PSAnIScpIHsNCi0gICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX0RlY2xPckNvbW1lbnQ7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1fQ3VyQnl0ZSA9PSAnLycpIHsNCi0gICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ0VuZDsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAobV9DdXJCeXRlID09ICc+Jykgew0KLSAgICAgICAgUG9wKCk7DQotICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChtX0N1ckJ5dGUgPiAweDIwKSB7DQotICAgICAgICBtX2R3RGF0YU9mZnNldCA9IG1fRmlsZS5tX2R3QnVmSW5kZXg7DQotICAgICAgICBtX3BDdXJJdGVtLT5tX2VOb2RlID0gRlhfU0FYTk9ERV9UYWc7DQotICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdOYW1lOw0KLSAgICAgICAgQXBwZW5kRGF0YShtX0N1ckJ5dGUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VEZWNsT3JDb21tZW50KCkNCi17DQotICAgIGlmIChtX0N1ckJ5dGUgPT0gJy0nKSB7DQotICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9Db21tZW50Ow0KLSAgICAgICAgbV9wQ3VySXRlbS0+bV9lTm9kZSA9IEZYX1NBWE5PREVfQ29tbWVudDsNCi0gICAgICAgIGlmIChtX3BDb21tZW50Q29udGV4dCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgbV9wQ29tbWVudENvbnRleHQgPSBGWF9ORVcgQ0ZYX1NBWENvbW1lbnRDb250ZXh0Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoY3NFbnRpdHkuQ29tcGFyZSgiYW1wIikgPT0gMCkgew0KKyAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9hbXApID09IDApIHsNCisgICAgICAgICAgICBtX3BzekRhdGFbbV9pRW50aXR5U3RhcnQrK10gPSAnJic7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZSgibHQiKSA9PSAwKSB7DQorICAgICAgICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2x0KSA9PSAwKSB7DQorICAgICAgICAgICAgbV9wc3pEYXRhW21faUVudGl0eVN0YXJ0KytdID0gJzwnOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoImd0IikgPT0gMCkgew0KKyAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9ndCkgPT0gMCkgew0KKyAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9ICc+JzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKCJhcG9zIikgPT0gMCkgew0KKyAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9hcG9zKSA9PSAwKSB7DQorICAgICAgICAgICAgbV9wc3pEYXRhW21faUVudGl0eVN0YXJ0KytdID0gJ1wnJzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKCJxdW90IikgPT0gMCkgew0KKyAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9xdW90KSA9PSAwKSB7DQorICAgICAgICAgICAgbV9wc3pEYXRhW21faUVudGl0eVN0YXJ0KytdID0gJ1wiJzsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgbV9wQ29tbWVudENvbnRleHQtPm1faUhlYWRlckNvdW50ID0gMTsNCi0gICAgICAgIG1fcENvbW1lbnRDb250ZXh0LT5tX2lUYWlsQ291bnQgPSAwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaVNhdmVFbnRpdHlTdGFydCAhPSBtX2lFbnRpdHlTdGFydCkgew0KKyAgICAgIG1faURhdGFQb3MgPSBtX2lFbnRpdHlTdGFydDsNCisgICAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfRGVjbE5vZGU7DQotICAgICAgICBtX2R3RGF0YU9mZnNldCA9IG1fRmlsZS5tX2R3QnVmSW5kZXg7DQotICAgICAgICBtX1NraXBDaGFyID0gJz4nOw0KLSAgICAgICAgbV9Ta2lwU3RhY2suQWRkKCc+Jyk7DQotICAgICAgICBTa2lwTm9kZSgpOw0KKyAgICAgIG1faURhdGFQb3MrKzsNCisgICAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAobV9pRW50aXR5U3RhcnQgPCAwICYmIGNoID09ICcmJykgew0KKyAgICAgIG1faUVudGl0eVN0YXJ0ID0gbV9pRGF0YVBvczsNCisgICAgfQ0KKyAgICBtX2lEYXRhUG9zKys7DQorICB9DQogfQ0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VDb21tZW50KCkNCi17DQotICAgIG1fcENvbW1lbnRDb250ZXh0LT5tX2lIZWFkZXJDb3VudCA9IDI7DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRleHQoKSB7DQorICBpZiAobV9DdXJCeXRlID09ICc8Jykgew0KKyAgICBpZiAobV9pRGF0YVBvcyA+IDApIHsNCisgICAgICBtX2lEYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgICAgTm90aWZ5RGF0YSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBQdXNoKCk7DQogICAgIG1fZHdOb2RlUG9zID0gbV9GaWxlLm1fZHdDdXIgKyBtX0ZpbGUubV9kd0J1ZkluZGV4Ow0KLSAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9Db21tZW50Q29udGVudDsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfTm9kZVN0YXJ0Ow0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9pRGF0YVBvcyA8IDEgJiYgU2tpcFNwYWNlKG1fQ3VyQnl0ZSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgUGFyc2VDaGFyKG1fQ3VyQnl0ZSk7DQogfQ0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VDb21tZW50Q29udGVudCgpDQotew0KLSAgICBpZiAobV9DdXJCeXRlID09ICctJykgew0KLSAgICAgICAgbV9wQ29tbWVudENvbnRleHQtPm1faVRhaWxDb3VudCsrOw0KLSAgICB9IGVsc2UgaWYgKG1fQ3VyQnl0ZSA9PSAnPicgJiYgbV9wQ29tbWVudENvbnRleHQtPm1faVRhaWxDb3VudCA9PSAyKSB7DQotICAgICAgICBtX2lEYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCi0gICAgICAgIG1faURhdGFQb3MgPSAwOw0KLSAgICAgICAgaWYgKG1fcEhhbmRsZXIpIHsNCi0gICAgICAgICAgICBOb3RpZnlUYXJnZXREYXRhKCk7DQotICAgICAgICB9DQotICAgICAgICBQb3AoKTsNCi0gICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgICB3aGlsZSAobV9wQ29tbWVudENvbnRleHQtPm1faVRhaWxDb3VudCA+IDApIHsNCi0gICAgICAgICAgICBBcHBlbmREYXRhKCctJyk7DQotICAgICAgICAgICAgbV9wQ29tbWVudENvbnRleHQtPm1faVRhaWxDb3VudC0tOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQXBwZW5kRGF0YShtX0N1ckJ5dGUpOw0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VOb2RlU3RhcnQoKSB7DQorICBpZiAobV9DdXJCeXRlID09ICc/Jykgew0KKyAgICBtX3BDdXJJdGVtLT5tX2VOb2RlID0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbjsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnTmFtZTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fQ3VyQnl0ZSA9PSAnIScpIHsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfRGVjbE9yQ29tbWVudDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fQ3VyQnl0ZSA9PSAnLycpIHsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnRW5kOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9DdXJCeXRlID09ICc+Jykgew0KKyAgICBQb3AoKTsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fQ3VyQnl0ZSA+IDB4MjApIHsNCisgICAgbV9kd0RhdGFPZmZzZXQgPSBtX0ZpbGUubV9kd0J1ZkluZGV4Ow0KKyAgICBtX3BDdXJJdGVtLT5tX2VOb2RlID0gRlhfU0FYTk9ERV9UYWc7DQorICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ05hbWU7DQorICAgIEFwcGVuZERhdGEobV9DdXJCeXRlKTsNCisgIH0NCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZURlY2xPckNvbW1lbnQoKSB7DQorICBpZiAobV9DdXJCeXRlID09ICctJykgew0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9Db21tZW50Ow0KKyAgICBtX3BDdXJJdGVtLT5tX2VOb2RlID0gRlhfU0FYTk9ERV9Db21tZW50Ow0KKyAgICBpZiAobV9wQ29tbWVudENvbnRleHQgPT0gTlVMTCkgew0KKyAgICAgIG1fcENvbW1lbnRDb250ZXh0ID0gRlhfTkVXIENGWF9TQVhDb21tZW50Q29udGV4dDsNCiAgICAgfQ0KLX0NCi12b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlRGVjbE5vZGUoKQ0KLXsNCisgICAgbV9wQ29tbWVudENvbnRleHQtPm1faUhlYWRlckNvdW50ID0gMTsNCisgICAgbV9wQ29tbWVudENvbnRleHQtPm1faVRhaWxDb3VudCA9IDA7DQorICB9IGVsc2Ugew0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9EZWNsTm9kZTsNCisgICAgbV9kd0RhdGFPZmZzZXQgPSBtX0ZpbGUubV9kd0J1ZkluZGV4Ow0KKyAgICBtX1NraXBDaGFyID0gJz4nOw0KKyAgICBtX1NraXBTdGFjay5BZGQoJz4nKTsNCiAgICAgU2tpcE5vZGUoKTsNCisgIH0NCiB9DQotdm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ05hbWUoKQ0KLXsNCi0gICAgaWYgKG1fQ3VyQnl0ZSA8IDB4MjEgfHwgbV9DdXJCeXRlID09ICcvJyB8fCBtX0N1ckJ5dGUgPT0gJz4nIHx8IG1fQ3VyQnl0ZSA9PSAnPycpIHsNCi0gICAgICAgIG1faURhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KLSAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQotICAgICAgICBpZiAobV9wSGFuZGxlcikgew0KLSAgICAgICAgICAgIE5vdGlmeUVudGVyKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9DdXJCeXRlIDwgMHgyMSkgew0KLSAgICAgICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZU5hbWU7DQotICAgICAgICB9IGVsc2UgaWYgKG1fQ3VyQnl0ZSA9PSAnLycgfHwgbV9DdXJCeXRlID09ICc/Jykgew0KLSAgICAgICAgICAgIG1fZVByZXZNb2RlID0gbV9lTW9kZTsNCi0gICAgICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdNYXliZUNsb3NlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAobV9wSGFuZGxlcikgew0KLSAgICAgICAgICAgICAgICBOb3RpZnlCcmVhaygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQXBwZW5kRGF0YShtX0N1ckJ5dGUpOw0KLSAgICB9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZUNvbW1lbnQoKSB7DQorICBtX3BDb21tZW50Q29udGV4dC0+bV9pSGVhZGVyQ291bnQgPSAyOw0KKyAgbV9kd05vZGVQb3MgPSBtX0ZpbGUubV9kd0N1ciArIG1fRmlsZS5tX2R3QnVmSW5kZXg7DQorICBtX2VNb2RlID0gRlhfU0FYTU9ERV9Db21tZW50Q29udGVudDsNCiB9DQotdm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUoKQ0KLXsNCi0gICAgaWYgKG1fQ3VyQnl0ZSA8IDB4MjEgfHwgbV9DdXJCeXRlID09ICc9Jykgew0KLSAgICAgICAgaWYgKG1faURhdGFQb3MgPCAxICYmIG1fQ3VyQnl0ZSA8IDB4MjEpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBtX2lOYW1lTGVuZ3RoID0gbV9pRGF0YVBvczsNCi0gICAgICAgIG1faURhdGFQb3MgPSAwOw0KLSAgICAgICAgbV9Ta2lwQ2hhciA9IDA7DQotICAgICAgICBtX2VNb2RlID0gbV9DdXJCeXRlID09ICc9JyA/IEZYX1NBWE1PREVfVGFnQXR0cmlidXRlVmFsdWUgOiBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZUVxdWFsOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChtX0N1ckJ5dGUgPT0gJy8nIHx8IG1fQ3VyQnl0ZSA9PSAnPicgfHwgbV9DdXJCeXRlID09ICc/Jykgew0KLSAgICAgICAgaWYgKG1fQ3VyQnl0ZSA9PSAnLycgfHwgbV9DdXJCeXRlID09ICc/Jykgew0KLSAgICAgICAgICAgIG1fZVByZXZNb2RlID0gbV9lTW9kZTsNCi0gICAgICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdNYXliZUNsb3NlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAobV9wSGFuZGxlcikgew0KLSAgICAgICAgICAgICAgICBOb3RpZnlCcmVhaygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChtX2lEYXRhUG9zIDwgMSkgew0KLSAgICAgICAgbV9kd0RhdGFPZmZzZXQgPSBtX0ZpbGUubV9kd0J1ZkluZGV4Ow0KLSAgICB9DQotICAgIEFwcGVuZE5hbWUobV9DdXJCeXRlKTsNCi19DQotdm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZUVxdWFsKCkNCi17DQotICAgIGlmIChtX0N1ckJ5dGUgPT0gJz0nKSB7DQotICAgICAgICBtX1NraXBDaGFyID0gMDsNCi0gICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZVZhbHVlOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9IGVsc2UgaWYgKG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KLSAgICAgICAgbV9pRGF0YVBvcyA9IG1faU5hbWVMZW5ndGg7DQotICAgICAgICBBcHBlbmROYW1lKDB4MjApOw0KLSAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFyZ2V0RGF0YTsNCi0gICAgICAgIFBhcnNlVGFyZ2V0RGF0YSgpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdBdHRyaWJ1dGVWYWx1ZSgpDQotew0KLSAgICBpZiAobV9Ta2lwQ2hhcikgew0KLSAgICAgICAgaWYgKG1fU2tpcENoYXIgPT0gbV9DdXJCeXRlKSB7DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCi0gICAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQotICAgICAgICAgICAgICAgIGlmIChtX3BIYW5kbGVyKSB7DQotICAgICAgICAgICAgICAgICAgICBOb3RpZnlBdHRyaWJ1dGUoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX1NraXBDaGFyID0gMDsNCi0gICAgICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVOYW1lOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIFBhcnNlQ2hhcihtX0N1ckJ5dGUpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChtX0N1ckJ5dGUgPCAweDIxKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1faURhdGFQb3MgPCAxKSB7DQotICAgICAgICBpZiAobV9DdXJCeXRlID09ICdcJycgfHwgbV9DdXJCeXRlID09ICdcIicpIHsNCi0gICAgICAgICAgICBtX1NraXBDaGFyID0gbV9DdXJCeXRlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VNYXliZUNsb3NlKCkNCi17DQotICAgIGlmIChtX0N1ckJ5dGUgPT0gJz4nKSB7DQotICAgICAgICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX0luc3RydWN0aW9uKSB7DQotICAgICAgICAgICAgbV9pTmFtZUxlbmd0aCA9IG1faURhdGFQb3M7DQotICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQotICAgICAgICAgICAgaWYgKG1fcEhhbmRsZXIpIHsNCi0gICAgICAgICAgICAgICAgTm90aWZ5VGFyZ2V0RGF0YSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIFBhcnNlVGFnQ2xvc2UoKTsNCi0gICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQotICAgIH0gZWxzZSBpZiAobV9lUHJldk1vZGUgPT0gRlhfU0FYTU9ERV9UYWdOYW1lKSB7DQotICAgICAgICBBcHBlbmREYXRhKCcvJyk7DQotICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdOYW1lOw0KLSAgICAgICAgbV9lUHJldk1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQotICAgICAgICBQYXJzZVRhZ05hbWUoKTsNCi0gICAgfSBlbHNlIGlmIChtX2VQcmV2TW9kZSA9PSBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZU5hbWUpIHsNCi0gICAgICAgIEFwcGVuZE5hbWUoJy8nKTsNCi0gICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZU5hbWU7DQotICAgICAgICBtX2VQcmV2TW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCi0gICAgICAgIFBhcnNlVGFnQXR0cmlidXRlTmFtZSgpOw0KLSAgICB9IGVsc2UgaWYgKG1fZVByZXZNb2RlID09IEZYX1NBWE1PREVfVGFyZ2V0RGF0YSkgew0KLSAgICAgICAgQXBwZW5kTmFtZSgnPycpOw0KLSAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFyZ2V0RGF0YTsNCi0gICAgICAgIG1fZVByZXZNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KLSAgICAgICAgUGFyc2VUYXJnZXREYXRhKCk7DQotICAgIH0NCi19DQotdm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0Nsb3NlKCkNCi17DQotICAgIG1fZHdOb2RlUG9zID0gbV9GaWxlLm1fZHdDdXIgKyBtX0ZpbGUubV9kd0J1ZkluZGV4Ow0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VDb21tZW50Q29udGVudCgpIHsNCisgIGlmIChtX0N1ckJ5dGUgPT0gJy0nKSB7DQorICAgIG1fcENvbW1lbnRDb250ZXh0LT5tX2lUYWlsQ291bnQrKzsNCisgIH0gZWxzZSBpZiAobV9DdXJCeXRlID09ICc+JyAmJiBtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50ID09IDIpIHsNCisgICAgbV9pRGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgIG1faURhdGFQb3MgPSAwOw0KICAgICBpZiAobV9wSGFuZGxlcikgew0KLSAgICAgICAgTm90aWZ5Q2xvc2UoKTsNCisgICAgICBOb3RpZnlUYXJnZXREYXRhKCk7DQogICAgIH0NCiAgICAgUG9wKCk7DQotfQ0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdFbmQoKQ0KLXsNCi0gICAgaWYgKG1fQ3VyQnl0ZSA8IDB4MjEpIHsNCi0gICAgICAgIHJldHVybjsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgIH0gZWxzZSB7DQorICAgIHdoaWxlIChtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50ID4gMCkgew0KKyAgICAgIEFwcGVuZERhdGEoJy0nKTsNCisgICAgICBtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50LS07DQogICAgIH0NCi0gICAgaWYgKG1fQ3VyQnl0ZSA9PSAnPicpIHsNCi0gICAgICAgIFBvcCgpOw0KLSAgICAgICAgbV9kd05vZGVQb3MgPSBtX0ZpbGUubV9kd0N1ciArIG1fRmlsZS5tX2R3QnVmSW5kZXg7DQorICAgIEFwcGVuZERhdGEobV9DdXJCeXRlKTsNCisgIH0NCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZURlY2xOb2RlKCkgew0KKyAgU2tpcE5vZGUoKTsNCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ05hbWUoKSB7DQorICBpZiAobV9DdXJCeXRlIDwgMHgyMSB8fCBtX0N1ckJ5dGUgPT0gJy8nIHx8IG1fQ3VyQnl0ZSA9PSAnPicgfHwNCisgICAgICBtX0N1ckJ5dGUgPT0gJz8nKSB7DQorICAgIG1faURhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgaWYgKG1fcEhhbmRsZXIpIHsNCisgICAgICBOb3RpZnlFbnRlcigpOw0KKyAgICB9DQorICAgIGlmIChtX0N1ckJ5dGUgPCAweDIxKSB7DQorICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnQXR0cmlidXRlTmFtZTsNCisgICAgfSBlbHNlIGlmIChtX0N1ckJ5dGUgPT0gJy8nIHx8IG1fQ3VyQnl0ZSA9PSAnPycpIHsNCisgICAgICBtX2VQcmV2TW9kZSA9IG1fZU1vZGU7DQorICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnTWF5YmVDbG9zZTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgICAgTm90aWZ5QnJlYWsoKTsNCisgICAgICB9DQorICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQXBwZW5kRGF0YShtX0N1ckJ5dGUpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQXR0cmlidXRlTmFtZSgpIHsNCisgIGlmIChtX0N1ckJ5dGUgPCAweDIxIHx8IG1fQ3VyQnl0ZSA9PSAnPScpIHsNCisgICAgaWYgKG1faURhdGFQb3MgPCAxICYmIG1fQ3VyQnl0ZSA8IDB4MjEpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9pTmFtZUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICBtX1NraXBDaGFyID0gMDsNCisgICAgbV9lTW9kZSA9IG1fQ3VyQnl0ZSA9PSAnPScgPyBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZVZhbHVlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVFcXVhbDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fQ3VyQnl0ZSA9PSAnLycgfHwgbV9DdXJCeXRlID09ICc+JyB8fCBtX0N1ckJ5dGUgPT0gJz8nKSB7DQorICAgIGlmIChtX0N1ckJ5dGUgPT0gJy8nIHx8IG1fQ3VyQnl0ZSA9PSAnPycpIHsNCisgICAgICBtX2VQcmV2TW9kZSA9IG1fZU1vZGU7DQorICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnTWF5YmVDbG9zZTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgICAgTm90aWZ5QnJlYWsoKTsNCisgICAgICB9DQorICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgICAgfQ0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9pRGF0YVBvcyA8IDEpIHsNCisgICAgbV9kd0RhdGFPZmZzZXQgPSBtX0ZpbGUubV9kd0J1ZkluZGV4Ow0KKyAgfQ0KKyAgQXBwZW5kTmFtZShtX0N1ckJ5dGUpOw0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQXR0cmlidXRlRXF1YWwoKSB7DQorICBpZiAobV9DdXJCeXRlID09ICc9Jykgew0KKyAgICBtX1NraXBDaGFyID0gMDsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnQXR0cmlidXRlVmFsdWU7DQorICAgIHJldHVybjsNCisgIH0gZWxzZSBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX0luc3RydWN0aW9uKSB7DQorICAgIG1faURhdGFQb3MgPSBtX2lOYW1lTGVuZ3RoOw0KKyAgICBBcHBlbmROYW1lKDB4MjApOw0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYXJnZXREYXRhOw0KKyAgICBQYXJzZVRhcmdldERhdGEoKTsNCisgIH0NCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZVZhbHVlKCkgew0KKyAgaWYgKG1fU2tpcENoYXIpIHsNCisgICAgaWYgKG1fU2tpcENoYXIgPT0gbV9DdXJCeXRlKSB7DQorICAgICAgew0KICAgICAgICAgbV9pRGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQogICAgICAgICBtX2lEYXRhUG9zID0gMDsNCiAgICAgICAgIGlmIChtX3BIYW5kbGVyKSB7DQotICAgICAgICAgICAgTm90aWZ5RW5kKCk7DQorICAgICAgICAgIE5vdGlmeUF0dHJpYnV0ZSgpOw0KICAgICAgICAgfQ0KLSAgICAgICAgUG9wKCk7DQotICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgUGFyc2VDaGFyKG1fQ3VyQnl0ZSk7DQorICAgICAgfQ0KKyAgICAgIG1fU2tpcENoYXIgPSAwOw0KKyAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZU5hbWU7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQotfQ0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYXJnZXREYXRhKCkNCi17DQotICAgIGlmIChtX0N1ckJ5dGUgPT0gJz8nKSB7DQotICAgICAgICBtX2VQcmV2TW9kZSA9IG1fZU1vZGU7DQotICAgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdNYXliZUNsb3NlOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQXBwZW5kTmFtZShtX0N1ckJ5dGUpOw0KKyAgICBQYXJzZUNoYXIobV9DdXJCeXRlKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fQ3VyQnl0ZSA8IDB4MjEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1faURhdGFQb3MgPCAxKSB7DQorICAgIGlmIChtX0N1ckJ5dGUgPT0gJ1wnJyB8fCBtX0N1ckJ5dGUgPT0gJ1wiJykgew0KKyAgICAgIG1fU2tpcENoYXIgPSBtX0N1ckJ5dGU7DQogICAgIH0NCisgIH0NCiB9DQotdm9pZCBDRlhfU0FYUmVhZGVyOjpTa2lwTm9kZSgpDQotew0KLSAgICBpbnQzMl90IGlMZW4gPSBtX1NraXBTdGFjay5HZXRTaXplKCk7DQotICAgIGlmIChtX1NraXBDaGFyID09ICdcJycgfHwgbV9Ta2lwQ2hhciA9PSAnXCInKSB7DQotICAgICAgICBpZiAobV9DdXJCeXRlICE9IG1fU2tpcENoYXIpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBpTGVuIC0tOw0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KGlMZW4gPiAtMSk7DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZU1heWJlQ2xvc2UoKSB7DQorICBpZiAobV9DdXJCeXRlID09ICc+Jykgew0KKyAgICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgbV9pTmFtZUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgaWYgKG1fcEhhbmRsZXIpIHsNCisgICAgICAgIE5vdGlmeVRhcmdldERhdGEoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgUGFyc2VUYWdDbG9zZSgpOw0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgfSBlbHNlIGlmIChtX2VQcmV2TW9kZSA9PSBGWF9TQVhNT0RFX1RhZ05hbWUpIHsNCisgICAgQXBwZW5kRGF0YSgnLycpOw0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdOYW1lOw0KKyAgICBtX2VQcmV2TW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgICAgUGFyc2VUYWdOYW1lKCk7DQorICB9IGVsc2UgaWYgKG1fZVByZXZNb2RlID09IEZYX1NBWE1PREVfVGFnQXR0cmlidXRlTmFtZSkgew0KKyAgICBBcHBlbmROYW1lKCcvJyk7DQorICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZU5hbWU7DQorICAgIG1fZVByZXZNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgICBQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUoKTsNCisgIH0gZWxzZSBpZiAobV9lUHJldk1vZGUgPT0gRlhfU0FYTU9ERV9UYXJnZXREYXRhKSB7DQorICAgIEFwcGVuZE5hbWUoJz8nKTsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFyZ2V0RGF0YTsNCisgICAgbV9lUHJldk1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQorICAgIFBhcnNlVGFyZ2V0RGF0YSgpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQ2xvc2UoKSB7DQorICBtX2R3Tm9kZVBvcyA9IG1fRmlsZS5tX2R3Q3VyICsgbV9GaWxlLm1fZHdCdWZJbmRleDsNCisgIGlmIChtX3BIYW5kbGVyKSB7DQorICAgIE5vdGlmeUNsb3NlKCk7DQorICB9DQorICBQb3AoKTsNCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0VuZCgpIHsNCisgIGlmIChtX0N1ckJ5dGUgPCAweDIxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX0N1ckJ5dGUgPT0gJz4nKSB7DQorICAgIFBvcCgpOw0KKyAgICBtX2R3Tm9kZVBvcyA9IG1fRmlsZS5tX2R3Q3VyICsgbV9GaWxlLm1fZHdCdWZJbmRleDsNCisgICAgbV9pRGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgIE5vdGlmeUVuZCgpOw0KKyAgICB9DQorICAgIFBvcCgpOw0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgfSBlbHNlIHsNCisgICAgUGFyc2VDaGFyKG1fQ3VyQnl0ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYXJnZXREYXRhKCkgew0KKyAgaWYgKG1fQ3VyQnl0ZSA9PSAnPycpIHsNCisgICAgbV9lUHJldk1vZGUgPSBtX2VNb2RlOw0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdNYXliZUNsb3NlOw0KKyAgfSBlbHNlIHsNCisgICAgQXBwZW5kTmFtZShtX0N1ckJ5dGUpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlNraXBOb2RlKCkgew0KKyAgaW50MzJfdCBpTGVuID0gbV9Ta2lwU3RhY2suR2V0U2l6ZSgpOw0KKyAgaWYgKG1fU2tpcENoYXIgPT0gJ1wnJyB8fCBtX1NraXBDaGFyID09ICdcIicpIHsNCisgICAgaWYgKG1fQ3VyQnl0ZSAhPSBtX1NraXBDaGFyKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlMZW4tLTsNCisgICAgRlhTWVNfYXNzZXJ0KGlMZW4gPiAtMSk7DQorICAgIG1fU2tpcFN0YWNrLlJlbW92ZUF0KGlMZW4sIDEpOw0KKyAgICBtX1NraXBDaGFyID0gaUxlbiA/IG1fU2tpcFN0YWNrW2lMZW4gLSAxXSA6IDA7DQorICAgIHJldHVybjsNCisgIH0NCisgIHN3aXRjaCAobV9DdXJCeXRlKSB7DQorICAgIGNhc2UgJzwnOg0KKyAgICAgIG1fU2tpcENoYXIgPSAnPic7DQorICAgICAgbV9Ta2lwU3RhY2suQWRkKCc+Jyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ1snOg0KKyAgICAgIG1fU2tpcENoYXIgPSAnXSc7DQorICAgICAgbV9Ta2lwU3RhY2suQWRkKCddJyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgJygnOg0KKyAgICAgIG1fU2tpcENoYXIgPSAnKSc7DQorICAgICAgbV9Ta2lwU3RhY2suQWRkKCcpJyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ1wnJzoNCisgICAgICBtX1NraXBDaGFyID0gJ1wnJzsNCisgICAgICBtX1NraXBTdGFjay5BZGQoJ1wnJyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ1wiJzoNCisgICAgICBtX1NraXBDaGFyID0gJ1wiJzsNCisgICAgICBtX1NraXBTdGFjay5BZGQoJ1wiJyk7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgaWYgKG1fQ3VyQnl0ZSA9PSBtX1NraXBDaGFyKSB7DQorICAgICAgICBpTGVuLS07DQogICAgICAgICBtX1NraXBTdGFjay5SZW1vdmVBdChpTGVuLCAxKTsNCiAgICAgICAgIG1fU2tpcENoYXIgPSBpTGVuID8gbV9Ta2lwU3RhY2tbaUxlbiAtIDFdIDogMDsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKG1fQ3VyQnl0ZSkgew0KLSAgICAgICAgY2FzZSAnPCc6DQotICAgICAgICAgICAgbV9Ta2lwQ2hhciA9ICc+JzsNCi0gICAgICAgICAgICBtX1NraXBTdGFjay5BZGQoJz4nKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgJ1snOg0KLSAgICAgICAgICAgIG1fU2tpcENoYXIgPSAnXSc7DQotICAgICAgICAgICAgbV9Ta2lwU3RhY2suQWRkKCddJyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlICcoJzoNCi0gICAgICAgICAgICBtX1NraXBDaGFyID0gJyknOw0KLSAgICAgICAgICAgIG1fU2tpcFN0YWNrLkFkZCgnKScpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAnXCcnOg0KLSAgICAgICAgICAgIG1fU2tpcENoYXIgPSAnXCcnOw0KLSAgICAgICAgICAgIG1fU2tpcFN0YWNrLkFkZCgnXCcnKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgJ1wiJzoNCi0gICAgICAgICAgICBtX1NraXBDaGFyID0gJ1wiJzsNCi0gICAgICAgICAgICBtX1NraXBTdGFjay5BZGQoJ1wiJyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGlmIChtX0N1ckJ5dGUgPT0gbV9Ta2lwQ2hhcikgew0KLSAgICAgICAgICAgICAgICBpTGVuIC0tOw0KLSAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5SZW1vdmVBdChpTGVuLCAxKTsNCi0gICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IGlMZW4gPyBtX1NraXBTdGFja1tpTGVuIC0gMV0gOiAwOw0KLSAgICAgICAgICAgICAgICBpZiAoaUxlbiA9PSAwICYmIG1fQ3VyQnl0ZSA9PSAnPicpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1faURhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KLSAgICAgICAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQotICAgICAgICAgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA+PSA5DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEZYU1lTX21lbWNtcChtX3BzekRhdGEsICJbQ0RBVEFbIiwgNyAqIHNpemVvZih1aW50OF90KSkgPT0gMA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBGWFNZU19tZW1jbXAobV9wc3pEYXRhICsgbV9pRGF0YUxlbmd0aCAtIDIsICJdXSIsIDIgKiBzaXplb2YodWludDhfdCkpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBQb3AoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoIC09IDk7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0RhdGFPZmZzZXQgKz0gNzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1tb3ZlKG1fcHN6RGF0YSAsIG1fcHN6RGF0YSArIDcsIG1faURhdGFMZW5ndGggKiBzaXplb2YodWludDhfdCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYkNoYXJEYXRhID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wSGFuZGxlcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZnlEYXRhKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYkNoYXJEYXRhID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBvcCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCi0gICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlMZW4gPT0gMCAmJiBtX0N1ckJ5dGUgPT0gJz4nKSB7DQorICAgICAgICAgIG1faURhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgaWYgKG1faURhdGFMZW5ndGggPj0gOSAmJg0KKyAgICAgICAgICAgICAgRlhTWVNfbWVtY21wKG1fcHN6RGF0YSwgIltDREFUQVsiLCA3ICogc2l6ZW9mKHVpbnQ4X3QpKSA9PSAwICYmDQorICAgICAgICAgICAgICBGWFNZU19tZW1jbXAobV9wc3pEYXRhICsgbV9pRGF0YUxlbmd0aCAtIDIsICJdXSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHNpemVvZih1aW50OF90KSkgPT0gMCkgew0KKyAgICAgICAgICAgIFBvcCgpOw0KKyAgICAgICAgICAgIG1faURhdGFMZW5ndGggLT0gOTsNCisgICAgICAgICAgICBtX2R3RGF0YU9mZnNldCArPSA3Ow0KKyAgICAgICAgICAgIEZYU1lTX21lbW1vdmUobV9wc3pEYXRhLCBtX3BzekRhdGEgKyA3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCAqIHNpemVvZih1aW50OF90KSk7DQorICAgICAgICAgICAgbV9iQ2hhckRhdGEgPSBUUlVFOw0KKyAgICAgICAgICAgIGlmIChtX3BIYW5kbGVyKSB7DQorICAgICAgICAgICAgICBOb3RpZnlEYXRhKCk7DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGlmIChpTGVuID4gMCkgew0KLSAgICAgICAgUGFyc2VDaGFyKG1fQ3VyQnl0ZSk7DQotICAgIH0NCisgICAgICAgICAgICBtX2JDaGFyRGF0YSA9IEZBTFNFOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIFBvcCgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKGlMZW4gPiAwKSB7DQorICAgIFBhcnNlQ2hhcihtX0N1ckJ5dGUpOw0KKyAgfQ0KIH0NCi12b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeURhdGEoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQotICAgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnKQ0KLSAgICAgICAgbV9wSGFuZGxlci0+T25UYWdEYXRhKG1fcEN1ckl0ZW0tPm1fcE5vZGUsIG1fYkNoYXJEYXRhID8gRlhfU0FYTk9ERV9DaGFyRGF0YSA6IEZYX1NBWE5PREVfVGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MobV9wc3pEYXRhLCBtX2lEYXRhTGVuZ3RoKSwgbV9GaWxlLm1fZHdDdXIgKyBtX2R3RGF0YU9mZnNldCk7DQordm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlEYXRhKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZykNCisgICAgbV9wSGFuZGxlci0+T25UYWdEYXRhKG1fcEN1ckl0ZW0tPm1fcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JDaGFyRGF0YSA/IEZYX1NBWE5PREVfQ2hhckRhdGEgOiBGWF9TQVhOT0RFX1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MobV9wc3pEYXRhLCBtX2lEYXRhTGVuZ3RoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRmlsZS5tX2R3Q3VyICsgbV9kd0RhdGFPZmZzZXQpOw0KIH0NCi12b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeUVudGVyKCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BIYW5kbGVyICE9IE5VTEwpOw0KLSAgICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZyB8fCBtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24pIHsNCi0gICAgICAgIG1fcEN1ckl0ZW0tPm1fcE5vZGUgPSBtX3BIYW5kbGVyLT5PblRhZ0VudGVyKENGWF9CeXRlU3RyaW5nQyhtX3BzekRhdGEsIG1faURhdGFMZW5ndGgpLCBtX3BDdXJJdGVtLT5tX2VOb2RlLCBtX2R3Tm9kZVBvcyk7DQotICAgIH0NCit2b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeUVudGVyKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZyB8fA0KKyAgICAgIG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICBtX3BDdXJJdGVtLT5tX3BOb2RlID0NCisgICAgICAgIG1fcEhhbmRsZXItPk9uVGFnRW50ZXIoQ0ZYX0J5dGVTdHJpbmdDKG1fcHN6RGF0YSwgbV9pRGF0YUxlbmd0aCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1ckl0ZW0tPm1fZU5vZGUsIG1fZHdOb2RlUG9zKTsNCisgIH0NCiB9DQotdm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlBdHRyaWJ1dGUoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQotICAgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnIHx8IG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KLSAgICAgICAgbV9wSGFuZGxlci0+T25UYWdBdHRyaWJ1dGUobV9wQ3VySXRlbS0+bV9wTm9kZSwgQ0ZYX0J5dGVTdHJpbmdDKG1fcHN6TmFtZSwgbV9pTmFtZUxlbmd0aCksIENGWF9CeXRlU3RyaW5nQyhtX3BzekRhdGEsIG1faURhdGFMZW5ndGgpKTsNCi0gICAgfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5QXR0cmlidXRlKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZyB8fA0KKyAgICAgIG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICBtX3BIYW5kbGVyLT5PblRhZ0F0dHJpYnV0ZShtX3BDdXJJdGVtLT5tX3BOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MobV9wc3pOYW1lLCBtX2lOYW1lTGVuZ3RoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDKG1fcHN6RGF0YSwgbV9pRGF0YUxlbmd0aCkpOw0KKyAgfQ0KIH0NCi12b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeUJyZWFrKCkNCi17DQotICAgIEZYU1lTX2Fzc2VydChtX3BIYW5kbGVyICE9IE5VTEwpOw0KLSAgICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZykgew0KLSAgICAgICAgbV9wSGFuZGxlci0+T25UYWdCcmVhayhtX3BDdXJJdGVtLT5tX3BOb2RlKTsNCi0gICAgfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5QnJlYWsoKSB7DQorICBGWFNZU19hc3NlcnQobV9wSGFuZGxlciAhPSBOVUxMKTsNCisgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnKSB7DQorICAgIG1fcEhhbmRsZXItPk9uVGFnQnJlYWsobV9wQ3VySXRlbS0+bV9wTm9kZSk7DQorICB9DQogfQ0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5Q2xvc2UoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQotICAgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnIHx8IG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KLSAgICAgICAgbV9wSGFuZGxlci0+T25UYWdDbG9zZShtX3BDdXJJdGVtLT5tX3BOb2RlLCBtX2R3Tm9kZVBvcyk7DQotICAgIH0NCit2b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeUNsb3NlKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZyB8fA0KKyAgICAgIG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICBtX3BIYW5kbGVyLT5PblRhZ0Nsb3NlKG1fcEN1ckl0ZW0tPm1fcE5vZGUsIG1fZHdOb2RlUG9zKTsNCisgIH0NCiB9DQotdm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlFbmQoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQotICAgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnKSB7DQotICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0VuZChtX3BDdXJJdGVtLT5tX3BOb2RlLCBDRlhfQnl0ZVN0cmluZ0MobV9wc3pEYXRhLCBtX2lEYXRhTGVuZ3RoKSwgbV9kd05vZGVQb3MpOw0KLSAgICB9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlFbmQoKSB7DQorICBGWFNZU19hc3NlcnQobV9wSGFuZGxlciAhPSBOVUxMKTsNCisgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnKSB7DQorICAgIG1fcEhhbmRsZXItPk9uVGFnRW5kKG1fcEN1ckl0ZW0tPm1fcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyhtX3BzekRhdGEsIG1faURhdGFMZW5ndGgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3Tm9kZVBvcyk7DQorICB9DQogfQ0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5VGFyZ2V0RGF0YSgpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wSGFuZGxlciAhPSBOVUxMKTsNCi0gICAgaWYgKG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KLSAgICAgICAgbV9wSGFuZGxlci0+T25UYXJnZXREYXRhKG1fcEN1ckl0ZW0tPm1fcE5vZGUsIG1fcEN1ckl0ZW0tPm1fZU5vZGUsIENGWF9CeXRlU3RyaW5nQyhtX3Bzek5hbWUsIG1faU5hbWVMZW5ndGgpLCBtX2R3Tm9kZVBvcyk7DQotICAgIH0gZWxzZSBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX0NvbW1lbnQpIHsNCi0gICAgICAgIG1fcEhhbmRsZXItPk9uVGFyZ2V0RGF0YShtX3BDdXJJdGVtLT5tX3BOb2RlLCBtX3BDdXJJdGVtLT5tX2VOb2RlLCBDRlhfQnl0ZVN0cmluZ0MobV9wc3pEYXRhLCBtX2lEYXRhTGVuZ3RoKSwgbV9kd05vZGVQb3MpOw0KLSAgICB9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlUYXJnZXREYXRhKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX0luc3RydWN0aW9uKSB7DQorICAgIG1fcEhhbmRsZXItPk9uVGFyZ2V0RGF0YShtX3BDdXJJdGVtLT5tX3BOb2RlLCBtX3BDdXJJdGVtLT5tX2VOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDKG1fcHN6TmFtZSwgbV9pTmFtZUxlbmd0aCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3Tm9kZVBvcyk7DQorICB9IGVsc2UgaWYgKG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9Db21tZW50KSB7DQorICAgIG1fcEhhbmRsZXItPk9uVGFyZ2V0RGF0YShtX3BDdXJJdGVtLT5tX3BOb2RlLCBtX3BDdXJJdGVtLT5tX2VOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDKG1fcHN6RGF0YSwgbV9pRGF0YUxlbmd0aCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3Tm9kZVBvcyk7DQorICB9DQogfQ0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6U2tpcEN1cnJlbnROb2RlKCkNCi17DQotICAgIGlmICghbV9wQ3VySXRlbSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIG1fcEN1ckl0ZW0tPm1fYlNraXAgPSBUUlVFOw0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6U2tpcEN1cnJlbnROb2RlKCkgew0KKyAgaWYgKCFtX3BDdXJJdGVtKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcEN1ckl0ZW0tPm1fYlNraXAgPSBUUlVFOw0KIH0NCi12b2lkIENGWF9TQVhSZWFkZXI6OlNldEhhbmRsZXIoSUZYX1NBWFJlYWRlckhhbmRsZXIgKnBIYW5kbGVyKQ0KLXsNCi0gICAgbV9wSGFuZGxlciA9IHBIYW5kbGVyOw0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6U2V0SGFuZGxlcihJRlhfU0FYUmVhZGVySGFuZGxlciogcEhhbmRsZXIpIHsNCisgIG1fcEhhbmRsZXIgPSBwSGFuZGxlcjsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy94bWwvZnhfc2F4X2ltcC5oIGIveGZhL3NyYy9mZ2FzL3NyYy94bWwvZnhfc2F4X2ltcC5oCmluZGV4IDZlOTVjODEuLjdkMDRmMTQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuaAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL3htbC9meF9zYXhfaW1wLmgKQEAgLTYsMTM1ICs2LDEyOSBAQAogDQogI2lmbmRlZiBfRlhfU0FYX0lNUF8NCiAjZGVmaW5lIF9GWF9TQVhfSU1QXw0KLSNkZWZpbmUgRlhfU0FYRklMRV9CVUZTSVpFCTMyNzY4DQotY2xhc3MgQ0ZYX1NBWEZpbGUNCi17DQotcHVibGljOg0KLSAgICBDRlhfU0FYRmlsZSgpOw0KLSAgICBGWF9CT09MCQlTdGFydEZpbGUoSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfRFdPUkQgZHdTdGFydCwgRlhfRFdPUkQgZHdMZW4pOw0KLSAgICBGWF9CT09MCQlSZWFkTmV4dEJsb2NrKCk7DQotICAgIHZvaWQJCVJlc2V0KCk7DQotICAgIElGWF9GaWxlUmVhZCoJbV9wRmlsZTsNCi0gICAgRlhfRFdPUkQJCW1fZHdTdGFydDsNCi0gICAgRlhfRFdPUkQJCW1fZHdFbmQ7DQotICAgIEZYX0RXT1JECQltX2R3Q3VyOw0KLSAgICB1aW50OF90KgkJbV9wQnVmOw0KLSAgICBGWF9EV09SRAkJbV9kd0J1ZlNpemU7DQotICAgIEZYX0RXT1JECQltX2R3QnVmSW5kZXg7DQorI2RlZmluZSBGWF9TQVhGSUxFX0JVRlNJWkUgMzI3NjgNCitjbGFzcyBDRlhfU0FYRmlsZSB7DQorIHB1YmxpYzoNCisgIENGWF9TQVhGaWxlKCk7DQorICBGWF9CT09MIFN0YXJ0RmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWF9EV09SRCBkd1N0YXJ0LCBGWF9EV09SRCBkd0xlbik7DQorICBGWF9CT09MIFJlYWROZXh0QmxvY2soKTsNCisgIHZvaWQgUmVzZXQoKTsNCisgIElGWF9GaWxlUmVhZCogbV9wRmlsZTsNCisgIEZYX0RXT1JEIG1fZHdTdGFydDsNCisgIEZYX0RXT1JEIG1fZHdFbmQ7DQorICBGWF9EV09SRCBtX2R3Q3VyOw0KKyAgdWludDhfdCogbV9wQnVmOw0KKyAgRlhfRFdPUkQgbV9kd0J1ZlNpemU7DQorICBGWF9EV09SRCBtX2R3QnVmSW5kZXg7DQogfTsNCiBlbnVtIEZYX1NBWE1PREUgew0KLSAgICBGWF9TQVhNT0RFX1RleHQgPSAwLA0KLSAgICBGWF9TQVhNT0RFX05vZGVTdGFydCwNCi0gICAgRlhfU0FYTU9ERV9EZWNsT3JDb21tZW50LA0KLSAgICBGWF9TQVhNT0RFX0RlY2xOb2RlLA0KLSAgICBGWF9TQVhNT0RFX0NvbW1lbnQsDQotICAgIEZYX1NBWE1PREVfQ29tbWVudENvbnRlbnQsDQotICAgIEZYX1NBWE1PREVfVGFnTmFtZSwNCi0gICAgRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVOYW1lLA0KLSAgICBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZUVxdWFsLA0KLSAgICBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZVZhbHVlLA0KLSAgICBGWF9TQVhNT0RFX1RhZ01heWJlQ2xvc2UsDQotICAgIEZYX1NBWE1PREVfVGFnQ2xvc2UsDQotICAgIEZYX1NBWE1PREVfVGFnRW5kLA0KLSAgICBGWF9TQVhNT0RFX1RhcmdldERhdGEsDQotICAgIEZYX1NBWE1PREVfTUFYLA0KKyAgRlhfU0FYTU9ERV9UZXh0ID0gMCwNCisgIEZYX1NBWE1PREVfTm9kZVN0YXJ0LA0KKyAgRlhfU0FYTU9ERV9EZWNsT3JDb21tZW50LA0KKyAgRlhfU0FYTU9ERV9EZWNsTm9kZSwNCisgIEZYX1NBWE1PREVfQ29tbWVudCwNCisgIEZYX1NBWE1PREVfQ29tbWVudENvbnRlbnQsDQorICBGWF9TQVhNT0RFX1RhZ05hbWUsDQorICBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZU5hbWUsDQorICBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZUVxdWFsLA0KKyAgRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVWYWx1ZSwNCisgIEZYX1NBWE1PREVfVGFnTWF5YmVDbG9zZSwNCisgIEZYX1NBWE1PREVfVGFnQ2xvc2UsDQorICBGWF9TQVhNT0RFX1RhZ0VuZCwNCisgIEZYX1NBWE1PREVfVGFyZ2V0RGF0YSwNCisgIEZYX1NBWE1PREVfTUFYLA0KIH07DQotY2xhc3MgQ0ZYX1NBWEl0ZW0NCi17DQotcHVibGljOg0KLSAgICBDRlhfU0FYSXRlbSgpIDogbV9wTm9kZShOVUxMKQ0KLSAgICAgICAgLCBtX2VOb2RlKEZYX1NBWE5PREVfVW5rbm93bikNCi0gICAgICAgICwgbV9kd0lEKDApDQotICAgICAgICAsIG1fYlNraXAoRkFMU0UpDQotICAgICAgICAsIG1fcFByZXYoTlVMTCkNCi0gICAgICAgICwgbV9wTmV4dChOVUxMKQ0KLSAgICB7fQ0KLSAgICB2b2lkKgkJbV9wTm9kZTsNCi0gICAgRlhfU0FYTk9ERQkJbV9lTm9kZTsNCi0gICAgRlhfRFdPUkQJCW1fZHdJRDsNCi0gICAgRlhfQk9PTAkJCW1fYlNraXA7DQotICAgIENGWF9TQVhJdGVtKgltX3BQcmV2Ow0KLSAgICBDRlhfU0FYSXRlbSoJbV9wTmV4dDsNCitjbGFzcyBDRlhfU0FYSXRlbSB7DQorIHB1YmxpYzoNCisgIENGWF9TQVhJdGVtKCkNCisgICAgICA6IG1fcE5vZGUoTlVMTCksDQorICAgICAgICBtX2VOb2RlKEZYX1NBWE5PREVfVW5rbm93biksDQorICAgICAgICBtX2R3SUQoMCksDQorICAgICAgICBtX2JTa2lwKEZBTFNFKSwNCisgICAgICAgIG1fcFByZXYoTlVMTCksDQorICAgICAgICBtX3BOZXh0KE5VTEwpIHt9DQorICB2b2lkKiBtX3BOb2RlOw0KKyAgRlhfU0FYTk9ERSBtX2VOb2RlOw0KKyAgRlhfRFdPUkQgbV9kd0lEOw0KKyAgRlhfQk9PTCBtX2JTa2lwOw0KKyAgQ0ZYX1NBWEl0ZW0qIG1fcFByZXY7DQorICBDRlhfU0FYSXRlbSogbV9wTmV4dDsNCiB9Ow0KLWNsYXNzIENGWF9TQVhDb21tZW50Q29udGV4dA0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9TQVhDb21tZW50Q29udGV4dCgpIDogbV9pSGVhZGVyQ291bnQoMCkNCi0gICAgICAgICwgbV9pVGFpbENvdW50KDApDQotICAgIHsNCi0gICAgfQ0KLSAgICBpbnQzMl90CQltX2lIZWFkZXJDb3VudDsNCi0gICAgaW50MzJfdAkJbV9pVGFpbENvdW50Ow0KK2NsYXNzIENGWF9TQVhDb21tZW50Q29udGV4dCB7DQorIHB1YmxpYzoNCisgIENGWF9TQVhDb21tZW50Q29udGV4dCgpIDogbV9pSGVhZGVyQ291bnQoMCksIG1faVRhaWxDb3VudCgwKSB7fQ0KKyAgaW50MzJfdCBtX2lIZWFkZXJDb3VudDsNCisgIGludDMyX3QgbV9pVGFpbENvdW50Ow0KIH07DQotY2xhc3MgQ0ZYX1NBWFJlYWRlciA6IHB1YmxpYyBJRlhfU0FYUmVhZGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZYX1NBWFJlYWRlcigpOw0KLSAgICB+Q0ZYX1NBWFJlYWRlcigpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9EV09SRCBkd1N0YXJ0ID0gMCwgRlhfRFdPUkQgZHdMZW4gPSAtMSwgRlhfRFdPUkQgZHdQYXJzZU1vZGUgPSAwKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CUNvbnRpbnVlUGFyc2UoSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKTsNCi0gICAgdmlydHVhbCB2b2lkCQlTa2lwQ3VycmVudE5vZGUoKTsNCi0gICAgdmlydHVhbCB2b2lkCQlTZXRIYW5kbGVyKElGWF9TQVhSZWFkZXJIYW5kbGVyICpwSGFuZGxlcik7DQotICAgIHZvaWQJCUFwcGVuZERhdGEodWludDhfdCBjaCk7DQotICAgIHZvaWQJCUFwcGVuZE5hbWUodWludDhfdCBjaCk7DQotICAgIHZvaWQJCVBhcnNlVGV4dCgpOw0KLSAgICB2b2lkCQlQYXJzZU5vZGVTdGFydCgpOw0KLSAgICB2b2lkCQlQYXJzZUluc3RydWN0aW9uKCk7DQotICAgIHZvaWQJCVBhcnNlRGVjbE9yQ29tbWVudCgpOw0KLSAgICB2b2lkCQlQYXJzZURlY2xOb2RlKCk7DQotICAgIHZvaWQJCVBhcnNlQ29tbWVudCgpOw0KLSAgICB2b2lkCQlQYXJzZUNvbW1lbnRDb250ZW50KCk7DQotICAgIHZvaWQJCVBhcnNlVGFnTmFtZSgpOw0KLSAgICB2b2lkCQlQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUoKTsNCi0gICAgdm9pZAkJUGFyc2VUYWdBdHRyaWJ1dGVFcXVhbCgpOw0KLSAgICB2b2lkCQlQYXJzZVRhZ0F0dHJpYnV0ZVZhbHVlKCk7DQotICAgIHZvaWQJCVBhcnNlTWF5YmVDbG9zZSgpOw0KLSAgICB2b2lkCQlQYXJzZVRhZ0Nsb3NlKCk7DQotICAgIHZvaWQJCVBhcnNlVGFnRW5kKCk7DQotICAgIHZvaWQJCVBhcnNlVGFyZ2V0RGF0YSgpOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX1NBWEZpbGUJCQkJbV9GaWxlOw0KLSAgICBJRlhfU0FYUmVhZGVySGFuZGxlcioJbV9wSGFuZGxlcjsNCi0gICAgaW50MzJfdAkJCQltX2lTdGF0ZTsNCi0gICAgQ0ZYX1NBWEl0ZW0qCQkJbV9wUm9vdDsNCi0gICAgQ0ZYX1NBWEl0ZW0qCQkJbV9wQ3VySXRlbTsNCi0gICAgRlhfRFdPUkQJCQkJbV9kd0l0ZW1JRDsNCi0gICAgRlhfU0FYTU9ERQkJCQltX2VNb2RlOw0KLSAgICBGWF9TQVhNT0RFCQkJCW1fZVByZXZNb2RlOw0KLSAgICBGWF9CT09MCQkJCQltX2JDaGFyRGF0YTsNCi0gICAgdWludDhfdAkJCQkJbV9DdXJCeXRlOw0KLSAgICBGWF9EV09SRAkJCQltX2R3RGF0YU9mZnNldDsNCi0gICAgQ0ZYX0J5dGVBcnJheQkJCW1fU2tpcFN0YWNrOw0KLSAgICB1aW50OF90CQkJCQltX1NraXBDaGFyOw0KLSAgICBGWF9EV09SRAkJCQltX2R3Tm9kZVBvczsNCi0gICAgdWludDhfdCoJCQkJbV9wc3pEYXRhOw0KLSAgICBpbnQzMl90CQkJCW1faURhdGFTaXplOw0KLSAgICBpbnQzMl90CQkJCW1faURhdGFMZW5ndGg7DQotICAgIGludDMyX3QJCQkJbV9pRW50aXR5U3RhcnQ7DQotICAgIGludDMyX3QJCQkJbV9pRGF0YVBvczsNCi0gICAgdWludDhfdCoJCQkJbV9wc3pOYW1lOw0KLSAgICBpbnQzMl90CQkJCW1faU5hbWVTaXplOw0KLSAgICBpbnQzMl90CQkJCW1faU5hbWVMZW5ndGg7DQotICAgIEZYX0RXT1JECQkJCW1fZHdQYXJzZU1vZGU7DQotICAgIENGWF9TQVhDb21tZW50Q29udGV4dAkqbV9wQ29tbWVudENvbnRleHQ7DQotICAgIHZvaWQJCVJlc2V0KCk7DQotICAgIHZvaWQJCVB1c2goKTsNCi0gICAgdm9pZAkJUG9wKCk7DQotICAgIEZYX0JPT0wJCVNraXBTcGFjZSh1aW50OF90IGNoKTsNCi0gICAgdm9pZAkJU2tpcE5vZGUoKTsNCi0gICAgdm9pZAkJTm90aWZ5RGF0YSgpOw0KLSAgICB2b2lkCQlOb3RpZnlFbnRlcigpOw0KLSAgICB2b2lkCQlOb3RpZnlBdHRyaWJ1dGUoKTsNCi0gICAgdm9pZAkJTm90aWZ5QnJlYWsoKTsNCi0gICAgdm9pZAkJTm90aWZ5Q2xvc2UoKTsNCi0gICAgdm9pZAkJTm90aWZ5RW5kKCk7DQotICAgIHZvaWQJCU5vdGlmeVRhcmdldERhdGEoKTsNCi0gICAgdm9pZAkJUmVhbGxvY0RhdGFCdWZmZXIoKTsNCi0gICAgdm9pZAkJUmVhbGxvY05hbWVCdWZmZXIoKTsNCi0gICAgdm9pZAkJUGFyc2VDaGFyKHVpbnQ4X3QgY2gpOw0KK2NsYXNzIENGWF9TQVhSZWFkZXIgOiBwdWJsaWMgSUZYX1NBWFJlYWRlciB7DQorIHB1YmxpYzoNCisgIENGWF9TQVhSZWFkZXIoKTsNCisgIH5DRlhfU0FYUmVhZGVyKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TGVuID0gLTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1BhcnNlTW9kZSA9IDApOw0KKyAgdmlydHVhbCBpbnQzMl90IENvbnRpbnVlUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisgIHZpcnR1YWwgdm9pZCBTa2lwQ3VycmVudE5vZGUoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRIYW5kbGVyKElGWF9TQVhSZWFkZXJIYW5kbGVyKiBwSGFuZGxlcik7DQorICB2b2lkIEFwcGVuZERhdGEodWludDhfdCBjaCk7DQorICB2b2lkIEFwcGVuZE5hbWUodWludDhfdCBjaCk7DQorICB2b2lkIFBhcnNlVGV4dCgpOw0KKyAgdm9pZCBQYXJzZU5vZGVTdGFydCgpOw0KKyAgdm9pZCBQYXJzZUluc3RydWN0aW9uKCk7DQorICB2b2lkIFBhcnNlRGVjbE9yQ29tbWVudCgpOw0KKyAgdm9pZCBQYXJzZURlY2xOb2RlKCk7DQorICB2b2lkIFBhcnNlQ29tbWVudCgpOw0KKyAgdm9pZCBQYXJzZUNvbW1lbnRDb250ZW50KCk7DQorICB2b2lkIFBhcnNlVGFnTmFtZSgpOw0KKyAgdm9pZCBQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUoKTsNCisgIHZvaWQgUGFyc2VUYWdBdHRyaWJ1dGVFcXVhbCgpOw0KKyAgdm9pZCBQYXJzZVRhZ0F0dHJpYnV0ZVZhbHVlKCk7DQorICB2b2lkIFBhcnNlTWF5YmVDbG9zZSgpOw0KKyAgdm9pZCBQYXJzZVRhZ0Nsb3NlKCk7DQorICB2b2lkIFBhcnNlVGFnRW5kKCk7DQorICB2b2lkIFBhcnNlVGFyZ2V0RGF0YSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfU0FYRmlsZSBtX0ZpbGU7DQorICBJRlhfU0FYUmVhZGVySGFuZGxlciogbV9wSGFuZGxlcjsNCisgIGludDMyX3QgbV9pU3RhdGU7DQorICBDRlhfU0FYSXRlbSogbV9wUm9vdDsNCisgIENGWF9TQVhJdGVtKiBtX3BDdXJJdGVtOw0KKyAgRlhfRFdPUkQgbV9kd0l0ZW1JRDsNCisgIEZYX1NBWE1PREUgbV9lTW9kZTsNCisgIEZYX1NBWE1PREUgbV9lUHJldk1vZGU7DQorICBGWF9CT09MIG1fYkNoYXJEYXRhOw0KKyAgdWludDhfdCBtX0N1ckJ5dGU7DQorICBGWF9EV09SRCBtX2R3RGF0YU9mZnNldDsNCisgIENGWF9CeXRlQXJyYXkgbV9Ta2lwU3RhY2s7DQorICB1aW50OF90IG1fU2tpcENoYXI7DQorICBGWF9EV09SRCBtX2R3Tm9kZVBvczsNCisgIHVpbnQ4X3QqIG1fcHN6RGF0YTsNCisgIGludDMyX3QgbV9pRGF0YVNpemU7DQorICBpbnQzMl90IG1faURhdGFMZW5ndGg7DQorICBpbnQzMl90IG1faUVudGl0eVN0YXJ0Ow0KKyAgaW50MzJfdCBtX2lEYXRhUG9zOw0KKyAgdWludDhfdCogbV9wc3pOYW1lOw0KKyAgaW50MzJfdCBtX2lOYW1lU2l6ZTsNCisgIGludDMyX3QgbV9pTmFtZUxlbmd0aDsNCisgIEZYX0RXT1JEIG1fZHdQYXJzZU1vZGU7DQorICBDRlhfU0FYQ29tbWVudENvbnRleHQqIG1fcENvbW1lbnRDb250ZXh0Ow0KKyAgdm9pZCBSZXNldCgpOw0KKyAgdm9pZCBQdXNoKCk7DQorICB2b2lkIFBvcCgpOw0KKyAgRlhfQk9PTCBTa2lwU3BhY2UodWludDhfdCBjaCk7DQorICB2b2lkIFNraXBOb2RlKCk7DQorICB2b2lkIE5vdGlmeURhdGEoKTsNCisgIHZvaWQgTm90aWZ5RW50ZXIoKTsNCisgIHZvaWQgTm90aWZ5QXR0cmlidXRlKCk7DQorICB2b2lkIE5vdGlmeUJyZWFrKCk7DQorICB2b2lkIE5vdGlmeUNsb3NlKCk7DQorICB2b2lkIE5vdGlmeUVuZCgpOw0KKyAgdm9pZCBOb3RpZnlUYXJnZXREYXRhKCk7DQorICB2b2lkIFJlYWxsb2NEYXRhQnVmZmVyKCk7DQorICB2b2lkIFJlYWxsb2NOYW1lQnVmZmVyKCk7DQorICB2b2lkIFBhcnNlQ2hhcih1aW50OF90IGNoKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZm94aXRsaWIuaCBiL3hmYS9zcmMvZm94aXRsaWIuaAppbmRleCBmNzBjMDc3Li5lYWE2MmFiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2ZveGl0bGliLmgKKysrIGIveGZhL3NyYy9mb3hpdGxpYi5oCkBAIC00LDcgKzQsNyBAQAogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCi0jaWZuZGVmCV9GT1hJVF9MSUJfSF8NCisjaWZuZGVmIF9GT1hJVF9MSUJfSF8NCiAjZGVmaW5lIF9GT1hJVF9MSUJfSF8NCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mb3hpdHhmYS5oIg0KICNpbmNsdWRlICIuL2ZnYXMvaW5jbHVkZS9mZ2FzLmgiDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2JhcmNvZGVpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2JhcmNvZGVpbXAuY3BwCmluZGV4IGNjN2ZmZDkuLjAyNmFjYWQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9iYXJjb2RlaW1wLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfYmFyY29kZWltcC5jcHAKQEAgLTEwLDIzOCArMTAsMjI1IEBACiAjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfZWRpdGltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9iYXJjb2RlaW1wLmgiDQotSUZXTF9CYXJjb2RlKiBJRldMX0JhcmNvZGU6OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gbmV3IElGV0xfQmFyY29kZTsNCitJRldMX0JhcmNvZGUqIElGV0xfQmFyY29kZTo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBJRldMX0JhcmNvZGU7DQogfQ0KLUlGV0xfQmFyY29kZTo6SUZXTF9CYXJjb2RlKCkNCi17DQorSUZXTF9CYXJjb2RlOjpJRldMX0JhcmNvZGUoKSB7DQorICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9CYXJjb2RlOjp+SUZXTF9CYXJjb2RlKCkgew0KKyAgaWYgKG1fcERhdGEpIHsNCisgICAgZGVsZXRlIChDRldMX0JhcmNvZGVJbXAqKW1fcERhdGE7DQogICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgfQ0KIH0NCi1JRldMX0JhcmNvZGU6On5JRldMX0JhcmNvZGUoKQ0KLXsNCi0gICAgaWYgKG1fcERhdGEpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9CYXJjb2RlSW1wKiltX3BEYXRhOw0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQotICAgIH0NCitGV0xfRVJSIElGV0xfQmFyY29kZTo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQmFyY29kZUltcChwT3V0ZXIpOw0KKyAgKChDRldMX0JhcmNvZGVJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0JhcmNvZGVJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9CYXJjb2RlOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQmFyY29kZUltcChwT3V0ZXIpOw0KLSAgICAoKENGV0xfQmFyY29kZUltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9CYXJjb2RlSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9CYXJjb2RlOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQmFyY29kZUltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgKChDRldMX0JhcmNvZGVJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0JhcmNvZGVJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9CYXJjb2RlOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9CYXJjb2RlSW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9CYXJjb2RlSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KLSAgICByZXR1cm4gKChDRldMX0JhcmNvZGVJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQordm9pZCBJRldMX0JhcmNvZGU6OlNldFR5cGUoQkNfVFlQRSB0eXBlKSB7DQorICAoKENGV0xfQmFyY29kZUltcCopbV9wRGF0YSktPlNldFR5cGUodHlwZSk7DQogfQ0KLXZvaWQJSUZXTF9CYXJjb2RlOjpTZXRUeXBlKEJDX1RZUEUgdHlwZSkNCi17DQotICAgICgoQ0ZXTF9CYXJjb2RlSW1wKiltX3BEYXRhKS0+U2V0VHlwZSh0eXBlKTsNCitGWF9CT09MIElGV0xfQmFyY29kZTo6SXNQcm90ZWN0ZWRUeXBlKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9CYXJjb2RlSW1wKiltX3BEYXRhKS0+SXNQcm90ZWN0ZWRUeXBlKCk7DQogfQ0KLUZYX0JPT0wJSUZXTF9CYXJjb2RlOjpJc1Byb3RlY3RlZFR5cGUoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9CYXJjb2RlSW1wKiltX3BEYXRhKS0+SXNQcm90ZWN0ZWRUeXBlKCk7DQorQ0ZXTF9CYXJjb2RlSW1wOjpDRldMX0JhcmNvZGVJbXAoSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX0VkaXRJbXAocE91dGVyKSwNCisgICAgICBtX3BCYXJjb2RlRW5naW5lKE5VTEwpLA0KKyAgICAgIG1fZHdTdGF0dXMoMCksDQorICAgICAgbV90eXBlKEJDX1VOS05PV04pIHt9DQorQ0ZXTF9CYXJjb2RlSW1wOjpDRldMX0JhcmNvZGVJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9FZGl0SW1wKHByb3BlcnRpZXMsIHBPdXRlciksDQorICAgICAgbV9wQmFyY29kZUVuZ2luZShOVUxMKSwNCisgICAgICBtX2R3U3RhdHVzKDApLA0KKyAgICAgIG1fdHlwZShCQ19VTktOT1dOKSB7fQ0KK0NGV0xfQmFyY29kZUltcDo6fkNGV0xfQmFyY29kZUltcCgpIHsNCisgIFJlbGVhc2VCYXJjb2RlRW5naW5lKCk7DQogfQ0KLUNGV0xfQmFyY29kZUltcDo6Q0ZXTF9CYXJjb2RlSW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLSAgICA6IENGV0xfRWRpdEltcChwT3V0ZXIpDQotICAgICwgbV9wQmFyY29kZUVuZ2luZShOVUxMKQ0KLSAgICAsIG1fZHdTdGF0dXMoMCkNCi0gICAgLCBtX3R5cGUoQkNfVU5LTk9XTikNCi17DQorRldMX0VSUiBDRldMX0JhcmNvZGVJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19CYXJjb2RlOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRldMX0JhcmNvZGVJbXA6OkNGV0xfQmFyY29kZUltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLSAgICA6IENGV0xfRWRpdEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQotICAgICwgbV9wQmFyY29kZUVuZ2luZShOVUxMKQ0KLSAgICAsIG1fZHdTdGF0dXMoMCkNCi0gICAgLCBtX3R5cGUoQkNfVU5LTk9XTikNCi17DQorRlhfRFdPUkQgQ0ZXTF9CYXJjb2RlSW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfQmFyY29kZTsNCiB9DQotQ0ZXTF9CYXJjb2RlSW1wOjp+Q0ZXTF9CYXJjb2RlSW1wKCkNCi17DQotICAgIFJlbGVhc2VCYXJjb2RlRW5naW5lKCk7DQorRldMX0VSUiBDRldMX0JhcmNvZGVJbXA6OkluaXRpYWxpemUoKSB7DQorICBpZiAoIW1fcERlbGVnYXRlKSB7DQorICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKUZYX05FVyBDRldMX0JhcmNvZGVJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIH0NCisgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfRWRpdEltcDo6SW5pdGlhbGl6ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX0JhcmNvZGVJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCi17DQotICAgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfQmFyY29kZTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9CYXJjb2RlSW1wOjpGaW5hbGl6ZSgpIHsNCisgIGlmIChtX3BEZWxlZ2F0ZSkgew0KKyAgICBkZWxldGUgKENGV0xfQmFyY29kZUltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgfQ0KKyAgUmVsZWFzZUJhcmNvZGVFbmdpbmUoKTsNCisgIHJldHVybiBDRldMX0VkaXRJbXA6OkZpbmFsaXplKCk7DQogfQ0KLUZYX0RXT1JEIENGV0xfQmFyY29kZUltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gRldMX0NMQVNTSEFTSF9CYXJjb2RlOw0KK0ZXTF9FUlIgQ0ZXTF9CYXJjb2RlSW1wOjpVcGRhdGUoKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgRldMX0VSUiByZXQgPSBDRldMX0VkaXRJbXA6OlVwZGF0ZSgpOw0KKyAgR2VuZXJhdGVCYXJjb2RlSW1hZ2VDYWNoZSgpOw0KKyAgcmV0dXJuIHJldDsNCiB9DQotRldMX0VSUglDRldMX0JhcmNvZGVJbXA6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgaWYgKCFtX3BEZWxlZ2F0ZSkgew0KLSAgICAgICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopIEZYX05FVyBDRldMX0JhcmNvZGVJbXBEZWxlZ2F0ZSh0aGlzKTsNCi0gICAgfQ0KLSAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX0VkaXRJbXA6OkluaXRpYWxpemUoKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfQmFyY29kZUltcDo6RmluYWxpemUoKQ0KLXsNCi0gICAgaWYgKG1fcERlbGVnYXRlKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfQmFyY29kZUltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCi0gICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCi0gICAgfQ0KLSAgICBSZWxlYXNlQmFyY29kZUVuZ2luZSgpOw0KLSAgICByZXR1cm4gQ0ZXTF9FZGl0SW1wOjpGaW5hbGl6ZSgpOw0KLX0NCi1GV0xfRVJSIENGV0xfQmFyY29kZUltcDo6VXBkYXRlKCkNCi17DQotICAgIGlmIChJc0xvY2tlZCgpKSB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLSAgICB9DQotICAgIEZXTF9FUlIgcmV0ID0gQ0ZXTF9FZGl0SW1wOjpVcGRhdGUoKTsNCitGV0xfRVJSIENGV0xfQmFyY29kZUltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PSAwKSB7DQogICAgIEdlbmVyYXRlQmFyY29kZUltYWdlQ2FjaGUoKTsNCi0gICAgcmV0dXJuIHJldDsNCi19DQotRldMX0VSUiBDRldMX0JhcmNvZGVJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCi0gICAgICAgIEdlbmVyYXRlQmFyY29kZUltYWdlQ2FjaGUoKTsNCi0gICAgICAgIGlmICghbV9wQmFyY29kZUVuZ2luZSB8fCAobV9kd1N0YXR1cyAmIFhGQV9CQ1NfRW5jb2RlU3VjY2VzcykgPT0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9NYXRyaXggbXQ7DQotICAgICAgICBtdC5lID0gbV9ydENsaWVudC5sZWZ0Ow0KLSAgICAgICAgbXQuZiA9IG1fcnRDbGllbnQudG9wOw0KLSAgICAgICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgICAgICBtdC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBlcnJvckNvZGUgPSAwOw0KLSAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BCYXJjb2RlRW5naW5lLT5SZW5kZXJEZXZpY2UocEdyYXBoaWNzLT5HZXRSZW5kZXJEZXZpY2UoKSwgcE1hdHJpeCwgZXJyb3JDb2RlKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgICAgaWYgKCFtX3BCYXJjb2RlRW5naW5lIHx8IChtX2R3U3RhdHVzICYgWEZBX0JDU19FbmNvZGVTdWNjZXNzKSA9PSAwKSB7DQorICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQotICAgIHJldHVybiBDRldMX0VkaXRJbXA6OkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCi19DQotdm9pZCBDRldMX0JhcmNvZGVJbXA6OkdlbmVyYXRlQmFyY29kZUltYWdlQ2FjaGUoKQ0KLXsNCi0gICAgaWYgKChtX2R3U3RhdHVzICYgWEZBX0JDU19OZWVkVXBkYXRlKSA9PSAwKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgbV9kd1N0YXR1cyA9IDA7Ow0KLSAgICBDcmVhdGVCYXJjb2RlRW5naW5lKCk7DQotICAgIElGV0xfQmFyY29kZURQICpwRGF0YSA9IChJRldMX0JhcmNvZGVEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBEYXRhKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BCYXJjb2RlRW5naW5lKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKEdldFRleHQod3NUZXh0KSA9PSBGV0xfRVJSX1N1Y2NlZWRlZCk7DQotICAgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7DQotICAgIHBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgIElGWF9Gb250KiBwRm9udCA9IChJRlhfRm9udCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0ZvbnQpOw0KLSAgICBDRlhfRm9udCogcENYRm9udCA9IChDRlhfRm9udCopKHBGb250ID8gcEZvbnQtPkdldERldkZvbnQoKSA6IE5VTEwpOw0KLSAgICBpZihwQ1hGb250KSB7DQotICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRGb250KHBDWEZvbnQpOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUKiBwRm9udFNpemUgPSAoRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9Gb250U2l6ZSk7DQotICAgIGlmKHBGb250U2l6ZSkgew0KLSAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0Rm9udFNpemUoKnBGb250U2l6ZSk7DQotICAgIH0NCi0gICAgRlhfQVJHQiogcEZvbnRDb2xvciA9IChGWF9BUkdCKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfVGV4dENvbG9yKTsNCi0gICAgaWYocEZvbnRDb2xvcikgew0KLSAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0Rm9udENvbG9yKCpwRm9udENvbG9yKTsNCi0gICAgfQ0KLSAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRIZWlnaHQoaW50MzJfdChtX3J0Q2xpZW50LmhlaWdodCkpOw0KLSAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRXaWR0aChpbnQzMl90KG1fcnRDbGllbnQud2lkdGgpKTsNCi0gICAgRlhfRFdPUkQgZHdBdHRyaWJ1dGVNYXNrID0gcERhdGEtPkdldEJhcmNvZGVBdHRyaWJ1dGVNYXNrKCk7DQotICAgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX0NIQVJFTkNPRElORykJew0KLSAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0Q2hhckVuY29kaW5nCQkJKHBEYXRhLT5HZXRDaGFyRW5jb2RpbmcoKSk7DQotICAgIH0NCi0gICAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfTU9EVUxFSEVJR0hUKQl7DQotICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRNb2R1bGVIZWlnaHQJCQkocERhdGEtPkdldE1vZHVsZUhlaWdodCgpKTsNCi0gICAgfQ0KLSAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9NT0RVTEVXSURUSCkgew0KLSAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0TW9kdWxlV2lkdGgJCQkocERhdGEtPkdldE1vZHVsZVdpZHRoKCkpOw0KLSAgICB9DQotICAgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX0RBVEFMRU5HVEgpIHsNCi0gICAgICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldERhdGFMZW5ndGgJCQkJKHBEYXRhLT5HZXREYXRhTGVuZ3RoKCkpOw0KLSAgICB9DQotICAgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX0NBTENIRUNLU1VNKSB7DQotICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRDYWxDaGVja3N1bQkJCShwRGF0YS0+R2V0Q2FsQ2hlY2tzdW0oKSk7DQotICAgIH0NCi0gICAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfUFJJTlRDSEVDS1NVTSkJew0KLSAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0UHJpbnRDaGVja3N1bQkJCShwRGF0YS0+R2V0UHJpbnRDaGVja3N1bSgpKTsNCi0gICAgfQ0KLSAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9URVhUTE9DQVRJT04pCXsNCi0gICAgICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldFRleHRMb2NhdGlvbgkJCShwRGF0YS0+R2V0VGV4dExvY2F0aW9uKCkpOw0KLSAgICB9DQotICAgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX1dJREVOQVJST1dSQVRJTykJew0KLSAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0V2lkZU5hcnJvd1JhdGlvCQkocERhdGEtPkdldFdpZGVOYXJyb3dSYXRpbygpKTsNCi0gICAgfQ0KLSAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9TVEFSVENIQVIpIHsNCi0gICAgICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldFN0YXJ0Q2hhcgkJCQkocERhdGEtPkdldFN0YXJ0Q2hhcigpKTsNCi0gICAgfQ0KLSAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9FTkRDSEFSKSB7DQotICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRFbmRDaGFyCQkJCShwRGF0YS0+R2V0RW5kQ2hhcigpKTsNCi0gICAgfQ0KLSAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9WRVJTSU9OKSB7DQotICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRWZXJzaW9uCQkJCShwRGF0YS0+R2V0VmVyc2lvbigpKTsNCi0gICAgfQ0KLSAgICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9FQ0xFVkVMKSB7DQotICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRFcnJvckNvcnJlY3Rpb25MZXZlbAkocERhdGEtPkdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkpOw0KLSAgICB9DQotICAgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX1RSVU5DQVRFRCkgew0KLSAgICAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0VHJ1bmNhdGVkCQkJCShwRGF0YS0+R2V0VHJ1bmNhdGVkKCkpOw0KKyAgICBDRlhfTWF0cml4IG10Ow0KKyAgICBtdC5lID0gbV9ydENsaWVudC5sZWZ0Ow0KKyAgICBtdC5mID0gbV9ydENsaWVudC50b3A7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgbXQuQ29uY2F0KCpwTWF0cml4KTsNCiAgICAgfQ0KICAgICBpbnQzMl90IGVycm9yQ29kZSA9IDA7DQotICAgIG1fZHdTdGF0dXMgPSBtX3BCYXJjb2RlRW5naW5lLT5FbmNvZGUod3NUZXh0LCBUUlVFLCBlcnJvckNvZGUpID8gWEZBX0JDU19FbmNvZGVTdWNjZXNzIDogMDsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTCgNCisgICAgICAgIG1fcEJhcmNvZGVFbmdpbmUtPlJlbmRlckRldmljZShwR3JhcGhpY3MtPkdldFJlbmRlckRldmljZSgpLCBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSksDQorICAgICAgICBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gQ0ZXTF9FZGl0SW1wOjpEcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQogfQ0KLXZvaWQgQ0ZXTF9CYXJjb2RlSW1wOjpDcmVhdGVCYXJjb2RlRW5naW5lKCkNCi17DQotICAgIGlmICgobV9wQmFyY29kZUVuZ2luZSA9PSBOVUxMKSAmJiAobV90eXBlICE9IEJDX1VOS05PV04pKSB7DQotICAgICAgICBtX3BCYXJjb2RlRW5naW5lID0gRlhfQmFyY29kZV9DcmVhdGUobV90eXBlKTsNCi0gICAgfQ0KK3ZvaWQgQ0ZXTF9CYXJjb2RlSW1wOjpHZW5lcmF0ZUJhcmNvZGVJbWFnZUNhY2hlKCkgew0KKyAgaWYgKChtX2R3U3RhdHVzICYgWEZBX0JDU19OZWVkVXBkYXRlKSA9PSAwKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fZHdTdGF0dXMgPSAwOw0KKyAgOw0KKyAgQ3JlYXRlQmFyY29kZUVuZ2luZSgpOw0KKyAgSUZXTF9CYXJjb2RlRFAqIHBEYXRhID0gKElGV0xfQmFyY29kZURQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBEYXRhKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wQmFyY29kZUVuZ2luZSk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKEdldFRleHQod3NUZXh0KSA9PSBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KKyAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICBJRlhfRm9udCogcEZvbnQgPSAoSUZYX0ZvbnQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9Gb250KTsNCisgIENGWF9Gb250KiBwQ1hGb250ID0gKENGWF9Gb250KikocEZvbnQgPyBwRm9udC0+R2V0RGV2Rm9udCgpIDogTlVMTCk7DQorICBpZiAocENYRm9udCkgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRGb250KHBDWEZvbnQpOw0KKyAgfQ0KKyAgRlhfRkxPQVQqIHBGb250U2l6ZSA9DQorICAgICAgKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfRm9udFNpemUpOw0KKyAgaWYgKHBGb250U2l6ZSkgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRGb250U2l6ZSgqcEZvbnRTaXplKTsNCisgIH0NCisgIEZYX0FSR0IqIHBGb250Q29sb3IgPQ0KKyAgICAgIChGWF9BUkdCKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfVGV4dENvbG9yKTsNCisgIGlmIChwRm9udENvbG9yKSB7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldEZvbnRDb2xvcigqcEZvbnRDb2xvcik7DQorICB9DQorICBtX3BCYXJjb2RlRW5naW5lLT5TZXRIZWlnaHQoaW50MzJfdChtX3J0Q2xpZW50LmhlaWdodCkpOw0KKyAgbV9wQmFyY29kZUVuZ2luZS0+U2V0V2lkdGgoaW50MzJfdChtX3J0Q2xpZW50LndpZHRoKSk7DQorICBGWF9EV09SRCBkd0F0dHJpYnV0ZU1hc2sgPSBwRGF0YS0+R2V0QmFyY29kZUF0dHJpYnV0ZU1hc2soKTsNCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX0NIQVJFTkNPRElORykgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRDaGFyRW5jb2RpbmcocERhdGEtPkdldENoYXJFbmNvZGluZygpKTsNCisgIH0NCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX01PRFVMRUhFSUdIVCkgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRNb2R1bGVIZWlnaHQocERhdGEtPkdldE1vZHVsZUhlaWdodCgpKTsNCisgIH0NCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX01PRFVMRVdJRFRIKSB7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldE1vZHVsZVdpZHRoKHBEYXRhLT5HZXRNb2R1bGVXaWR0aCgpKTsNCisgIH0NCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX0RBVEFMRU5HVEgpIHsNCisgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0RGF0YUxlbmd0aChwRGF0YS0+R2V0RGF0YUxlbmd0aCgpKTsNCisgIH0NCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX0NBTENIRUNLU1VNKSB7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldENhbENoZWNrc3VtKHBEYXRhLT5HZXRDYWxDaGVja3N1bSgpKTsNCisgIH0NCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX1BSSU5UQ0hFQ0tTVU0pIHsNCisgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0UHJpbnRDaGVja3N1bShwRGF0YS0+R2V0UHJpbnRDaGVja3N1bSgpKTsNCisgIH0NCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX1RFWFRMT0NBVElPTikgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRUZXh0TG9jYXRpb24ocERhdGEtPkdldFRleHRMb2NhdGlvbigpKTsNCisgIH0NCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX1dJREVOQVJST1dSQVRJTykgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRXaWRlTmFycm93UmF0aW8ocERhdGEtPkdldFdpZGVOYXJyb3dSYXRpbygpKTsNCisgIH0NCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX1NUQVJUQ0hBUikgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRTdGFydENoYXIocERhdGEtPkdldFN0YXJ0Q2hhcigpKTsNCisgIH0NCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX0VORENIQVIpIHsNCisgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0RW5kQ2hhcihwRGF0YS0+R2V0RW5kQ2hhcigpKTsNCisgIH0NCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX1ZFUlNJT04pIHsNCisgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0VmVyc2lvbihwRGF0YS0+R2V0VmVyc2lvbigpKTsNCisgIH0NCisgIGlmIChkd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX0VDTEVWRUwpIHsNCisgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwocERhdGEtPkdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfVFJVTkNBVEVEKSB7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldFRydW5jYXRlZChwRGF0YS0+R2V0VHJ1bmNhdGVkKCkpOw0KKyAgfQ0KKyAgaW50MzJfdCBlcnJvckNvZGUgPSAwOw0KKyAgbV9kd1N0YXR1cyA9IG1fcEJhcmNvZGVFbmdpbmUtPkVuY29kZSh3c1RleHQsIFRSVUUsIGVycm9yQ29kZSkNCisgICAgICAgICAgICAgICAgICAgPyBYRkFfQkNTX0VuY29kZVN1Y2Nlc3MNCisgICAgICAgICAgICAgICAgICAgOiAwOw0KIH0NCi12b2lkIENGV0xfQmFyY29kZUltcDo6UmVsZWFzZUJhcmNvZGVFbmdpbmUoKQ0KLXsNCi0gICAgaWYgKG1fcEJhcmNvZGVFbmdpbmUpIHsNCi0gICAgICAgIG1fcEJhcmNvZGVFbmdpbmUtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcEJhcmNvZGVFbmdpbmUgPSBOVUxMOw0KLSAgICB9DQordm9pZCBDRldMX0JhcmNvZGVJbXA6OkNyZWF0ZUJhcmNvZGVFbmdpbmUoKSB7DQorICBpZiAoKG1fcEJhcmNvZGVFbmdpbmUgPT0gTlVMTCkgJiYgKG1fdHlwZSAhPSBCQ19VTktOT1dOKSkgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lID0gRlhfQmFyY29kZV9DcmVhdGUobV90eXBlKTsNCisgIH0NCiB9DQotdm9pZCBDRldMX0JhcmNvZGVJbXA6OlNldFR5cGUoQkNfVFlQRSB0eXBlKQ0KLXsNCi0gICAgaWYgKG1fdHlwZSA9PSB0eXBlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgUmVsZWFzZUJhcmNvZGVFbmdpbmUoKTsNCi0gICAgbV90eXBlID0gdHlwZTsNCi0gICAgbV9kd1N0YXR1cyA9IFhGQV9CQ1NfTmVlZFVwZGF0ZTsNCit2b2lkIENGV0xfQmFyY29kZUltcDo6UmVsZWFzZUJhcmNvZGVFbmdpbmUoKSB7DQorICBpZiAobV9wQmFyY29kZUVuZ2luZSkgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5SZWxlYXNlKCk7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUgPSBOVUxMOw0KKyAgfQ0KIH0NCi1GV0xfRVJSIENGV0xfQmFyY29kZUltcDo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgUmVsZWFzZUJhcmNvZGVFbmdpbmUoKTsNCi0gICAgbV9kd1N0YXR1cyA9IFhGQV9CQ1NfTmVlZFVwZGF0ZTsNCi0gICAgcmV0dXJuIENGV0xfRWRpdEltcDo6U2V0VGV4dCh3c1RleHQpOw0KK3ZvaWQgQ0ZXTF9CYXJjb2RlSW1wOjpTZXRUeXBlKEJDX1RZUEUgdHlwZSkgew0KKyAgaWYgKG1fdHlwZSA9PSB0eXBlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFJlbGVhc2VCYXJjb2RlRW5naW5lKCk7DQorICBtX3R5cGUgPSB0eXBlOw0KKyAgbV9kd1N0YXR1cyA9IFhGQV9CQ1NfTmVlZFVwZGF0ZTsNCiB9DQotRlhfQk9PTCBDRldMX0JhcmNvZGVJbXA6OklzUHJvdGVjdGVkVHlwZSgpDQotew0KLSAgICBpZiAoIW1fcEJhcmNvZGVFbmdpbmUpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIEJDX1RZUEUgdEVuZ2luZVR5cGUgPSBtX3BCYXJjb2RlRW5naW5lLT5HZXRUeXBlKCk7DQotICAgIGlmICh0RW5naW5lVHlwZSA9PSBCQ19RUl9DT0RFIHx8IHRFbmdpbmVUeXBlID09IEJDX1BERjQxNyB8fCB0RW5naW5lVHlwZSA9PSBCQ19EQVRBTUFUUklYKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQorRldMX0VSUiBDRldMX0JhcmNvZGVJbXA6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgUmVsZWFzZUJhcmNvZGVFbmdpbmUoKTsNCisgIG1fZHdTdGF0dXMgPSBYRkFfQkNTX05lZWRVcGRhdGU7DQorICByZXR1cm4gQ0ZXTF9FZGl0SW1wOjpTZXRUZXh0KHdzVGV4dCk7DQogfQ0KLUNGV0xfQmFyY29kZUltcERlbGVnYXRlOjpDRldMX0JhcmNvZGVJbXBEZWxlZ2F0ZShDRldMX0JhcmNvZGVJbXAgKnBPd25lcikNCi0gICAgOiBDRldMX0VkaXRJbXBEZWxlZ2F0ZShwT3duZXIpDQotew0KK0ZYX0JPT0wgQ0ZXTF9CYXJjb2RlSW1wOjpJc1Byb3RlY3RlZFR5cGUoKSB7DQorICBpZiAoIW1fcEJhcmNvZGVFbmdpbmUpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBCQ19UWVBFIHRFbmdpbmVUeXBlID0gbV9wQmFyY29kZUVuZ2luZS0+R2V0VHlwZSgpOw0KKyAgaWYgKHRFbmdpbmVUeXBlID09IEJDX1FSX0NPREUgfHwgdEVuZ2luZVR5cGUgPT0gQkNfUERGNDE3IHx8DQorICAgICAgdEVuZ2luZVR5cGUgPT0gQkNfREFUQU1BVFJJWCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRldMX0VSUglDRldMX0JhcmNvZGVJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdGbGFnID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQotICAgIGlmIChkd0ZsYWcgPT0gRldMX0VWVEhBU0hfRURUX1RleHRDaGFuZ2VkKSB7DQotICAgICAgICBDRldMX0JhcmNvZGVJbXAqIHBPd25lciA9IChDRldMX0JhcmNvZGVJbXAqKW1fcE93bmVyOw0KLSAgICAgICAgcE93bmVyLT5SZWxlYXNlQmFyY29kZUVuZ2luZSgpOw0KLSAgICAgICAgcE93bmVyLT5tX2R3U3RhdHVzID0gWEZBX0JDU19OZWVkVXBkYXRlOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCitDRldMX0JhcmNvZGVJbXBEZWxlZ2F0ZTo6Q0ZXTF9CYXJjb2RlSW1wRGVsZWdhdGUoQ0ZXTF9CYXJjb2RlSW1wKiBwT3duZXIpDQorICAgIDogQ0ZXTF9FZGl0SW1wRGVsZWdhdGUocE93bmVyKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9CYXJjb2RlSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgew0KKyAgRlhfRFdPUkQgZHdGbGFnID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQorICBpZiAoZHdGbGFnID09IEZXTF9FVlRIQVNIX0VEVF9UZXh0Q2hhbmdlZCkgew0KKyAgICBDRldMX0JhcmNvZGVJbXAqIHBPd25lciA9IChDRldMX0JhcmNvZGVJbXAqKW1fcE93bmVyOw0KKyAgICBwT3duZXItPlJlbGVhc2VCYXJjb2RlRW5naW5lKCk7DQorICAgIHBPd25lci0+bV9kd1N0YXR1cyA9IFhGQV9CQ1NfTmVlZFVwZGF0ZTsNCisgIH0NCisgIHJldHVybiBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NhcmV0aW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9jYXJldGltcC5jcHAKaW5kZXggYjAzMDdlOC4uMWNjYWI3YSAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NhcmV0aW1wLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY2FyZXRpbXAuY3BwCkBAIC05LDE4NCArOSwxNjQgQEAKICNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCiAjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfY2FyZXRpbXAuaCINCi1JRldMX0NhcmV0KiBJRldMX0NhcmV0OjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBJRldMX0NhcmV0Ow0KK0lGV0xfQ2FyZXQqIElGV0xfQ2FyZXQ6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgSUZXTF9DYXJldDsNCiB9DQotSUZXTF9DYXJldDo6SUZXTF9DYXJldCgpDQotew0KK0lGV0xfQ2FyZXQ6OklGV0xfQ2FyZXQoKSB7DQorICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9DYXJldDo6fklGV0xfQ2FyZXQoKSB7DQorICBpZiAobV9wRGF0YSkgew0KKyAgICBkZWxldGUgKENGV0xfQ2FyZXRJbXAqKW1fcERhdGE7DQogICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgfQ0KIH0NCi1JRldMX0NhcmV0Ojp+SUZXTF9DYXJldCgpDQotew0KLSAgICBpZiAobV9wRGF0YSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0NhcmV0SW1wKiltX3BEYXRhOw0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQotICAgIH0NCitGV0xfRVJSIElGV0xfQ2FyZXQ6OkluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NhcmV0SW1wKHBPdXRlcik7DQorICAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0NhcmV0SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSIElGV0xfQ2FyZXQ6OkluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlcikNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9DYXJldEltcChwT3V0ZXIpOw0KLSAgICAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorRldMX0VSUiBJRldMX0NhcmV0OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NhcmV0SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0NhcmV0SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSCUlGV0xfQ2FyZXQ6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NhcmV0SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9DYXJldEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9DYXJldEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitGV0xfRVJSIElGV0xfQ2FyZXQ6OlNob3dDYXJldChGWF9CT09MIGJGbGFnKSB7DQorICByZXR1cm4gKChDRldMX0NhcmV0SW1wKiltX3BEYXRhKS0+U2hvd0NhcmV0KGJGbGFnKTsNCiB9DQotRldMX0VSUglJRldMX0NhcmV0OjpTaG93Q2FyZXQoRlhfQk9PTCBiRmxhZykNCi17DQotICAgIHJldHVybiAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5TaG93Q2FyZXQoYkZsYWcpOw0KK0ZXTF9FUlIgSUZXTF9DYXJldDo6R2V0RnJlcXVlbmN5KEZYX0RXT1JEJiBlbGFwc2UpIHsNCisgIHJldHVybiAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5HZXRGcmVxdWVuY3koZWxhcHNlKTsNCiB9DQotRldMX0VSUiBJRldMX0NhcmV0OjpHZXRGcmVxdWVuY3koRlhfRFdPUkQgJmVsYXBzZSkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5HZXRGcmVxdWVuY3koZWxhcHNlKTsNCitGV0xfRVJSIElGV0xfQ2FyZXQ6OlNldEZyZXF1ZW5jeShGWF9EV09SRCBlbGFwc2UpIHsNCisgIHJldHVybiAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5TZXRGcmVxdWVuY3koZWxhcHNlKTsNCiB9DQotRldMX0VSUiBJRldMX0NhcmV0OjpTZXRGcmVxdWVuY3koRlhfRFdPUkQgZWxhcHNlKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9DYXJldEltcCopbV9wRGF0YSktPlNldEZyZXF1ZW5jeShlbGFwc2UpOw0KK0ZXTF9FUlIgSUZXTF9DYXJldDo6U2V0Q29sb3IoQ0ZYX0NvbG9yIGNyRmlsbCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9DYXJldEltcCopbV9wRGF0YSktPlNldENvbG9yKGNyRmlsbCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9DYXJldDo6U2V0Q29sb3IoQ0ZYX0NvbG9yIGNyRmlsbCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ2FyZXRJbXAqKW1fcERhdGEpLT5TZXRDb2xvcihjckZpbGwpOw0KK0NGV0xfQ2FyZXRJbXA6OkNGV0xfQ2FyZXRJbXAoSUZXTF9XaWRnZXQqIHBPdXRlcikgOiBtX2hUaW1lcihOVUxMKSB7DQorICBtX2R3RWxhcHNlID0gNDAwOw0KKyAgbV9wVGltZXIgPSBGWF9ORVcgQ0ZXTF9DYXJldFRpbWVyKHRoaXMpOw0KKyAgbV9iU2V0Q29sb3IgPSBGQUxTRTsNCisgIFNldFN0YXRlcyhGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpOw0KIH0NCi1DRldMX0NhcmV0SW1wOjpDRldMX0NhcmV0SW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotICAgIDogbV9oVGltZXIoTlVMTCkNCi17DQotICAgIG1fZHdFbGFwc2UgPSA0MDA7DQotICAgIG1fcFRpbWVyID0gRlhfTkVXIENGV0xfQ2FyZXRUaW1lcih0aGlzKTsNCi0gICAgbV9iU2V0Q29sb3IgPSBGQUxTRTsNCi0gICAgU2V0U3RhdGVzKEZXTF9TVEFURV9DQVRfSGlnaHRMaWdodCk7DQorQ0ZXTF9DYXJldEltcDo6Q0ZXTF9DYXJldEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IG1faFRpbWVyKE5VTEwpIHsNCisgIG1fZHdFbGFwc2UgPSA0MDA7DQorICBtX3BUaW1lciA9IEZYX05FVyBDRldMX0NhcmV0VGltZXIodGhpcyk7DQorICBtX2JTZXRDb2xvciA9IEZBTFNFOw0KKyAgU2V0U3RhdGVzKEZXTF9TVEFURV9DQVRfSGlnaHRMaWdodCk7DQogfQ0KLUNGV0xfQ2FyZXRJbXA6OkNGV0xfQ2FyZXRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKTogbV9oVGltZXIoTlVMTCkNCi17DQotICAgIG1fZHdFbGFwc2UgPSA0MDA7DQotICAgIG1fcFRpbWVyID0gRlhfTkVXIENGV0xfQ2FyZXRUaW1lcih0aGlzKTsNCi0gICAgbV9iU2V0Q29sb3IgPSBGQUxTRTsNCi0gICAgU2V0U3RhdGVzKEZXTF9TVEFURV9DQVRfSGlnaHRMaWdodCk7DQorQ0ZXTF9DYXJldEltcDo6fkNGV0xfQ2FyZXRJbXAoKSB7DQorICBpZiAobV9wVGltZXIpIHsNCisgICAgZGVsZXRlIG1fcFRpbWVyOw0KKyAgICBtX3BUaW1lciA9IE5VTEw7DQorICB9DQogfQ0KLUNGV0xfQ2FyZXRJbXA6On5DRldMX0NhcmV0SW1wKCkNCi17DQotICAgIGlmIChtX3BUaW1lcikgew0KLSAgICAgICAgZGVsZXRlIG1fcFRpbWVyOw0KLSAgICAgICAgbV9wVGltZXIgPSBOVUxMOw0KLSAgICB9DQorRldMX0VSUiBDRldMX0NhcmV0SW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfQ2FyZXQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9DYXJldEltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgd3NDbGFzcyA9IEZXTF9DTEFTU19DYXJldDsNCitGWF9EV09SRCBDRldMX0NhcmV0SW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfQ2FyZXQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DYXJldEltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfQ2FyZXRJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NhcmV0SW1wOjpGaW5hbGl6ZSgpIHsNCisgIGlmIChtX2hUaW1lcikgew0KKyAgICBGV0xfU3RvcFRpbWVyKG1faFRpbWVyKTsNCisgICAgbV9oVGltZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcERlbGVnYXRlKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9DYXJldEltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXRJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgfQ0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgRHJhd0NhcmV0QksocEdyYXBoaWNzLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBwTWF0cml4KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NhcmV0SW1wOjpTaG93Q2FyZXQoRlhfQk9PTCBiRmxhZykgew0KKyAgaWYgKG1faFRpbWVyKSB7DQorICAgIEZXTF9TdG9wVGltZXIobV9oVGltZXIpOw0KKyAgICBtX2hUaW1lciA9IE5VTEw7DQorICB9DQorICBpZiAoYkZsYWcpIHsNCisgICAgbV9oVGltZXIgPSBGV0xfU3RhcnRUaW1lcigoSUZXTF9UaW1lciopbV9wVGltZXIsIG1fZHdFbGFwc2UpOw0KKyAgfQ0KKyAgcmV0dXJuIFNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCAhYkZsYWcpOw0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXRJbXA6OkdldEZyZXF1ZW5jeShGWF9EV09SRCYgZWxhcHNlKSB7DQorICBlbGFwc2UgPSBtX2R3RWxhcHNlOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXRJbXA6OlNldEZyZXF1ZW5jeShGWF9EV09SRCBlbGFwc2UpIHsNCisgIG1fZHdFbGFwc2UgPSBlbGFwc2U7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DYXJldEltcDo6U2V0Q29sb3IoQ0ZYX0NvbG9yIGNyRmlsbCkgew0KKyAgbV9iU2V0Q29sb3IgPSBUUlVFOw0KKyAgbV9jckZpbGwgPSBjckZpbGw7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9DYXJldEltcDo6RHJhd0NhcmV0QksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgR2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgIHJlY3QuU2V0KDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbS5tX3J0UGFydCA9IHJlY3Q7DQorICBpZiAobV9iU2V0Q29sb3IpIHsNCisgICAgcGFyYW0ubV9wRGF0YSA9ICZtX2NyRmlsbDsNCisgIH0NCisgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpKSB7DQogICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DQVRfQmFja2dyb3VuZDsNCisgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0NBVF9IaWdodExpZ2h0Ow0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRFdPUkQgQ0ZXTF9DYXJldEltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gRldMX0NMQVNTSEFTSF9DYXJldDsNCitDRldMX0NhcmV0SW1wOjpDRldMX0NhcmV0VGltZXI6OkNGV0xfQ2FyZXRUaW1lcihDRldMX0NhcmV0SW1wKiBtX3BDYXJldCkgew0KKyAgdGhpcy0+bV9wQ2FyZXQgPSBtX3BDYXJldDsNCiB9DQotRldMX0VSUglDRldMX0NhcmV0SW1wOjpJbml0aWFsaXplKCkNCi17DQotICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKSBGWF9ORVcgQ0ZXTF9DYXJldEltcERlbGVnYXRlKHRoaXMpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQoraW50MzJfdCBDRldMX0NhcmV0SW1wOjpDRldMX0NhcmV0VGltZXI6OlJ1bihGV0xfSFRJTUVSIGhUaW1lcikgew0KKyAgaWYgKG1fcENhcmV0LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9DQVRfSGlnaHRMaWdodCkgew0KKyAgICBtX3BDYXJldC0+U2V0U3RhdGVzKEZXTF9TVEFURV9DQVRfSGlnaHRMaWdodCwgRkFMU0UpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wQ2FyZXQtPlNldFN0YXRlcyhGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0Ow0KKyAgbV9wQ2FyZXQtPkdldFdpZGdldFJlY3QocnQpOw0KKyAgcnQuU2V0KDAsIDAsIHJ0LndpZHRoICsgMSwgcnQuaGVpZ2h0KTsNCisgIG1fcENhcmV0LT5SZXBhaW50KCZydCk7DQorICByZXR1cm4gMTsNCiB9DQotRldMX0VSUglDRldMX0NhcmV0SW1wOjpGaW5hbGl6ZSgpDQotew0KLSAgICBpZiAobV9oVGltZXIpIHsNCi0gICAgICAgIEZXTF9TdG9wVGltZXIobV9oVGltZXIpOw0KLSAgICAgICAgbV9oVGltZXIgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3BEZWxlZ2F0ZSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0NhcmV0SW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KLSAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCitDRldMX0NhcmV0SW1wRGVsZWdhdGU6OkNGV0xfQ2FyZXRJbXBEZWxlZ2F0ZShDRldMX0NhcmV0SW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9DYXJldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIHJldHVybiAxOw0KIH0NCi1GV0xfRVJSCUNGV0xfQ2FyZXRJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQotICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCi0gICAgfQ0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIERyYXdDYXJldEJLKHBHcmFwaGljcywgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgcE1hdHJpeCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUglDRldMX0NhcmV0SW1wOjpTaG93Q2FyZXQoRlhfQk9PTCBiRmxhZykNCi17DQotICAgIGlmIChtX2hUaW1lcikgew0KLSAgICAgICAgRldMX1N0b3BUaW1lcihtX2hUaW1lcik7DQotICAgICAgICBtX2hUaW1lciA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKGJGbGFnKSB7DQotICAgICAgICBtX2hUaW1lciA9IEZXTF9TdGFydFRpbWVyKChJRldMX1RpbWVyICopbV9wVGltZXIsIG1fZHdFbGFwc2UpOw0KLSAgICB9DQotICAgIHJldHVybiBTZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgIWJGbGFnKTsNCi19DQotRldMX0VSUiBDRldMX0NhcmV0SW1wOjpHZXRGcmVxdWVuY3koRlhfRFdPUkQgJmVsYXBzZSkNCi17DQotICAgIGVsYXBzZSA9IG1fZHdFbGFwc2U7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0NhcmV0SW1wOjpTZXRGcmVxdWVuY3koRlhfRFdPUkQgZWxhcHNlKQ0KLXsNCi0gICAgbV9kd0VsYXBzZSA9IGVsYXBzZTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfQ2FyZXRJbXA6OlNldENvbG9yKENGWF9Db2xvciBjckZpbGwpDQotew0KLSAgICBtX2JTZXRDb2xvciA9IFRSVUU7DQotICAgIG1fY3JGaWxsID0gY3JGaWxsOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9DYXJldEltcDo6RHJhd0NhcmV0QksoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJlY3Q7DQotICAgIEdldFdpZGdldFJlY3QocmVjdCk7DQotICAgIHJlY3QuU2V0KDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCi0gICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQotICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIHBhcmFtLm1fcnRQYXJ0ID0gcmVjdDsNCi0gICAgaWYgKG1fYlNldENvbG9yKSB7DQotICAgICAgICBwYXJhbS5tX3BEYXRhID0gICZtX2NyRmlsbDsNCi0gICAgfQ0KLSAgICBpZiAoIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NBVF9IaWdodExpZ2h0KSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLSAgICB9DQotICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DQVRfQmFja2dyb3VuZDsNCi0gICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfQ0FUX0hpZ2h0TGlnaHQ7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1DRldMX0NhcmV0SW1wOjpDRldMX0NhcmV0VGltZXI6OkNGV0xfQ2FyZXRUaW1lcihDRldMX0NhcmV0SW1wICptX3BDYXJldCkNCi17DQotICAgIHRoaXMtPm1fcENhcmV0ID0gbV9wQ2FyZXQ7DQotfQ0KLWludDMyX3QgQ0ZXTF9DYXJldEltcDo6Q0ZXTF9DYXJldFRpbWVyOjpSdW4oRldMX0hUSU1FUiBoVGltZXIpDQotew0KLSAgICBpZiAobV9wQ2FyZXQtPkdldFN0YXRlcygpICYgRldMX1NUQVRFX0NBVF9IaWdodExpZ2h0KSB7DQotICAgICAgICBtX3BDYXJldC0+U2V0U3RhdGVzKEZXTF9TVEFURV9DQVRfSGlnaHRMaWdodCwgRkFMU0UpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wQ2FyZXQtPlNldFN0YXRlcyhGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpOw0KLSAgICB9DQotICAgIENGWF9SZWN0RiBydDsNCi0gICAgbV9wQ2FyZXQtPkdldFdpZGdldFJlY3QocnQpOw0KLSAgICBydC5TZXQoMCwgMCwgcnQud2lkdGggKyAxLCBydC5oZWlnaHQpOw0KLSAgICBtX3BDYXJldC0+UmVwYWludCgmcnQpOw0KLSAgICByZXR1cm4gMTsNCi19DQotQ0ZXTF9DYXJldEltcERlbGVnYXRlOjpDRldMX0NhcmV0SW1wRGVsZWdhdGUoQ0ZXTF9DYXJldEltcCAqcE93bmVyKQ0KLSAgICA6IG1fcE93bmVyKHBPd25lcikNCi17DQotfQ0KLWludDMyX3QgQ0ZXTF9DYXJldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICByZXR1cm4gMTsNCi19DQotRldMX0VSUglDRldMX0NhcmV0SW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK0ZXTF9FUlIgQ0ZXTF9DYXJldEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NoZWNrYm94aW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9jaGVja2JveGltcC5jcHAKaW5kZXggMWJhMDg1MS4uOGZiMTdjZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NoZWNrYm94aW1wLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY2hlY2tib3hpbXAuY3BwCkBAIC0xMCw1OTcgKzEwLDU4NCBAQAogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX2NoZWNrYm94aW1wLmgiDQotI2RlZmluZSBGV0xfQ0tCX0NhcHRpb25NYXJnaW4JNQ0KLUlGV0xfQ2hlY2tCb3gqIElGV0xfQ2hlY2tCb3g6OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gbmV3IElGV0xfQ2hlY2tCb3g7DQorI2RlZmluZSBGV0xfQ0tCX0NhcHRpb25NYXJnaW4gNQ0KK0lGV0xfQ2hlY2tCb3gqIElGV0xfQ2hlY2tCb3g6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgSUZXTF9DaGVja0JveDsNCiB9DQotSUZXTF9DaGVja0JveDo6SUZXTF9DaGVja0JveCgpDQotew0KK0lGV0xfQ2hlY2tCb3g6OklGV0xfQ2hlY2tCb3goKSB7DQorICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9DaGVja0JveDo6fklGV0xfQ2hlY2tCb3goKSB7DQorICBpZiAobV9wRGF0YSkgew0KKyAgICBkZWxldGUgKENGV0xfQ2hlY2tCb3hJbXAqKW1fcERhdGE7DQogICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgfQ0KIH0NCi1JRldMX0NoZWNrQm94Ojp+SUZXTF9DaGVja0JveCgpDQotew0KLSAgICBpZiAobV9wRGF0YSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhOw0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQotICAgIH0NCitGV0xfRVJSIElGV0xfQ2hlY2tCb3g6OkluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NoZWNrQm94SW1wKHBPdXRlcik7DQorICAoKENGV0xfQ2hlY2tCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSIElGV0xfQ2hlY2tCb3g6OkluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlcikNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9DaGVja0JveEltcChwT3V0ZXIpOw0KLSAgICAoKENGV0xfQ2hlY2tCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfQ2hlY2tCb3hJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorRldMX0VSUiBJRldMX0NoZWNrQm94OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NoZWNrQm94SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAoKENGV0xfQ2hlY2tCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSCUlGV0xfQ2hlY2tCb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NoZWNrQm94SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitpbnQzMl90IElGV0xfQ2hlY2tCb3g6OkdldENoZWNrU3RhdGUoKSB7DQorICByZXR1cm4gKChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhKS0+R2V0Q2hlY2tTdGF0ZSgpOw0KIH0NCi1pbnQzMl90IElGV0xfQ2hlY2tCb3g6OkdldENoZWNrU3RhdGUoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YSktPkdldENoZWNrU3RhdGUoKTsNCitGV0xfRVJSIElGV0xfQ2hlY2tCb3g6OlNldENoZWNrU3RhdGUoaW50MzJfdCBpQ2hlY2spIHsNCisgIHJldHVybiAoKENGV0xfQ2hlY2tCb3hJbXAqKW1fcERhdGEpLT5TZXRDaGVja1N0YXRlKGlDaGVjayk7DQogfQ0KLUZXTF9FUlIgSUZXTF9DaGVja0JveDo6U2V0Q2hlY2tTdGF0ZShpbnQzMl90IGlDaGVjaykNCi17DQotICAgIHJldHVybiAoKENGV0xfQ2hlY2tCb3hJbXAqKW1fcERhdGEpLT5TZXRDaGVja1N0YXRlKGlDaGVjayk7DQorSUZXTF9SYWRpb0J1dHRvbiogSUZXTF9SYWRpb0J1dHRvbjo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBJRldMX1JhZGlvQnV0dG9uOw0KIH0NCi1JRldMX1JhZGlvQnV0dG9uKiBJRldMX1JhZGlvQnV0dG9uOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBJRldMX1JhZGlvQnV0dG9uOw0KK0lGV0xfUmFkaW9CdXR0b246OklGV0xfUmFkaW9CdXR0b24oKSB7DQorICBtX3BEYXRhID0gTlVMTDsNCiB9DQotSUZXTF9SYWRpb0J1dHRvbjo6SUZXTF9SYWRpb0J1dHRvbigpDQotew0KK0lGV0xfUmFkaW9CdXR0b246On5JRldMX1JhZGlvQnV0dG9uKCkgew0KKyAgaWYgKG1fcERhdGEpIHsNCisgICAgZGVsZXRlIChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhOw0KICAgICBtX3BEYXRhID0gTlVMTDsNCisgIH0NCiB9DQotSUZXTF9SYWRpb0J1dHRvbjo6fklGV0xfUmFkaW9CdXR0b24oKQ0KLXsNCi0gICAgaWYgKG1fcERhdGEpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YTsNCi0gICAgICAgIG1fcERhdGEgPSBOVUxMOw0KLSAgICB9DQorRldMX0VSUiBJRldMX1JhZGlvQnV0dG9uOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9DaGVja0JveEltcChwT3V0ZXIpOw0KKyAgKChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCiB9DQotRldMX0VSUiBJRldMX1JhZGlvQnV0dG9uOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQ2hlY2tCb3hJbXAocE91dGVyKTsNCi0gICAgKChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KLSAgICByZXR1cm4gKChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9SYWRpb0J1dHRvbjo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9DaGVja0JveEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgKChDRldMX0NoZWNrQm94SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9DaGVja0JveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCiB9DQotRldMX0VSUglJRldMX1JhZGlvQnV0dG9uOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9DaGVja0JveEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KLSAgICAoKENGV0xfQ2hlY2tCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfQ2hlY2tCb3hJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorQ0ZXTF9DaGVja0JveEltcDo6Q0ZXTF9DaGVja0JveEltcChJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlciksDQorICAgICAgbV9kd1RUT1N0eWxlcyhGREVfVFRPU1RZTEVfU2luZ2xlTGluZSksDQorICAgICAgbV9pVFRPQWxpZ24oRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXIpLA0KKyAgICAgIG1fYkJ0bkRvd24oRkFMU0UpIHsNCisgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgIG1fcnRCb3guUmVzZXQoKTsNCisgIG1fcnRDYXB0aW9uLlJlc2V0KCk7DQorICBtX3J0Rm9jdXMuUmVzZXQoKTsNCiB9DQotQ0ZXTF9DaGVja0JveEltcDo6Q0ZXTF9DaGVja0JveEltcChJRldMX1dpZGdldCAqcE91dGVyICkNCi0gICAgOiBDRldMX1dpZGdldEltcChwT3V0ZXIpDQotICAgICwgbV9kd1RUT1N0eWxlcyhGREVfVFRPU1RZTEVfU2luZ2xlTGluZSkNCi0gICAgLCBtX2lUVE9BbGlnbihGREVfVFRPQUxJR05NRU5UX0NlbnRlcikNCi0gICAgLCBtX2JCdG5Eb3duKEZBTFNFKQ0KLXsNCi0gICAgbV9ydENsaWVudC5SZXNldCgpOw0KLSAgICBtX3J0Qm94LlJlc2V0KCk7DQotICAgIG1fcnRDYXB0aW9uLlJlc2V0KCk7DQotICAgIG1fcnRGb2N1cy5SZXNldCgpOw0KK0NGV0xfQ2hlY2tCb3hJbXA6OkNGV0xfQ2hlY2tCb3hJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpLA0KKyAgICAgIG1fZHdUVE9TdHlsZXMoRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUpLA0KKyAgICAgIG1faVRUT0FsaWduKEZERV9UVE9BTElHTk1FTlRfQ2VudGVyKSwNCisgICAgICBtX2JCdG5Eb3duKEZBTFNFKSB7DQorICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICBtX3J0Qm94LlJlc2V0KCk7DQorICBtX3J0Q2FwdGlvbi5SZXNldCgpOw0KKyAgbV9ydEZvY3VzLlJlc2V0KCk7DQogfQ0KLUNGV0xfQ2hlY2tCb3hJbXA6OkNGV0xfQ2hlY2tCb3hJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCi0gICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQotICAgICwgbV9kd1RUT1N0eWxlcyhGREVfVFRPU1RZTEVfU2luZ2xlTGluZSkNCi0gICAgLCBtX2lUVE9BbGlnbihGREVfVFRPQUxJR05NRU5UX0NlbnRlcikNCi0gICAgLCBtX2JCdG5Eb3duKEZBTFNFKQ0KLXsNCi0gICAgbV9ydENsaWVudC5SZXNldCgpOw0KLSAgICBtX3J0Qm94LlJlc2V0KCk7DQotICAgIG1fcnRDYXB0aW9uLlJlc2V0KCk7DQotICAgIG1fcnRGb2N1cy5SZXNldCgpOw0KK0NGV0xfQ2hlY2tCb3hJbXA6On5DRldMX0NoZWNrQm94SW1wKCkge30NCitGV0xfRVJSIENGV0xfQ2hlY2tCb3hJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbikNCisgICAgICAgICAgICAgICAgPyBGV0xfQ0xBU1NfUmFkaW9CdXR0b24NCisgICAgICAgICAgICAgICAgOiBGV0xfQ0xBU1NfQ2hlY2tCb3g7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUNGV0xfQ2hlY2tCb3hJbXA6On5DRldMX0NoZWNrQm94SW1wKCkNCi17DQorRlhfRFdPUkQgQ0ZXTF9DaGVja0JveEltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbg0KKyAgICAgICAgICAgICA/IEZXTF9DTEFTU0hBU0hfUmFkaW9CdXR0b24NCisgICAgICAgICAgICAgOiBGV0xfQ0xBU1NIQVNIX0NoZWNrQm94Ow0KIH0NCi1GV0xfRVJSIENGV0xfQ2hlY2tCb3hJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCi17DQotICAgIHdzQ2xhc3MgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfUmFkaW9CdXR0b24pID8gRldMX0NMQVNTX1JhZGlvQnV0dG9uIDogRldMX0NMQVNTX0NoZWNrQm94Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0NoZWNrQm94SW1wOjpJbml0aWFsaXplKCkgew0KKyAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlKHRoaXMpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GWF9EV09SRCBDRldMX0NoZWNrQm94SW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbiA/IEZXTF9DTEFTU0hBU0hfUmFkaW9CdXR0b24gOiBGV0xfQ0xBU1NIQVNIX0NoZWNrQm94Ow0KK0ZXTF9FUlIgQ0ZXTF9DaGVja0JveEltcDo6RmluYWxpemUoKSB7DQorICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgZGVsZXRlIChDRldMX0NoZWNrQm94SW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9DaGVja0JveEltcDo6SW5pdGlhbGl6ZSgpDQotew0KLSAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKikgRlhfTkVXIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZSh0aGlzKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfQ2hlY2tCb3hJbXA6OkZpbmFsaXplKCkNCi17DQotICAgIGlmICggbV9wRGVsZWdhdGUpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCi0gICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9DaGVja0JveEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCi17DQotICAgIGlmIChiQXV0b1NpemUpIHsNCi0gICAgICAgIHJlY3QuU2V0KDAsIDAsIDAsIDApOw0KLSAgICAgICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQotICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgICAgICB9DQotICAgICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCi0gICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzQ2FwdGlvbik7DQotICAgICAgICBpZiAod3NDYXB0aW9uLkdldExlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSh3c0NhcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX011bHRpTGluZSk7DQotICAgICAgICAgICAgcmVjdC5TZXQoMCwgMCwgc3oueCwgc3oueSk7DQotICAgICAgICB9DQotICAgICAgICByZWN0LkluZmxhdGUoRldMX0NLQl9DYXB0aW9uTWFyZ2luLCBGV0xfQ0tCX0NhcHRpb25NYXJnaW4pOw0KLSAgICAgICAgSUZXTF9DaGVja0JveERQICpwRGF0YSA9IChJRldMX0NoZWNrQm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgICAgIEZYX0ZMT0FUIGZDaGVja0JveCA9IHBEYXRhLT5HZXRCb3hTaXplKG1fcEludGVyZmFjZSk7DQotICAgICAgICByZWN0LndpZHRoICs9IGZDaGVja0JveDsNCi0gICAgICAgIGlmIChyZWN0LmhlaWdodCA8IGZDaGVja0JveCkgew0KLSAgICAgICAgICAgIHJlY3QuaGVpZ2h0ID0gZkNoZWNrQm94Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9DaGVja0JveEltcDo6VXBkYXRlKCkNCi17DQotICAgIGlmIChJc0xvY2tlZCgpKSB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLSAgICB9DQorRldMX0VSUiBDRldMX0NoZWNrQm94SW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmIChiQXV0b1NpemUpIHsNCisgICAgcmVjdC5TZXQoMCwgMCwgMCwgMCk7DQogICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KLSAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQogICAgIH0NCi0gICAgVXBkYXRlVGV4dE91dFN0eWxlcygpOw0KLSAgICBMYXlvdXQoKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfQ2hlY2tCb3hJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KLSAgICBpZiAoSGFzQm9yZGVyKCkpIHsNCi0gICAgICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9DS0JfQm9yZGVyLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBpZiAoSGFzRWRnZSgpKSB7DQotICAgICAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX0NLQl9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIGludDMyX3QgZHdTdGF0ZXMgPSBHZXRQYXJ0U3RhdGVzKCk7DQotICAgIHsNCi0gICAgICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KLSAgICAgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0NLQl9CYWNrZ3JvdW5kOw0KLSAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IGR3U3RhdGVzOw0KLSAgICAgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgICAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgICAgICB9DQotICAgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7DQotICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQotICAgICAgICAgICAgcGFyYW0ubV9wRGF0YSA9ICZtX3J0Rm9jdXM7DQotICAgICAgICB9DQotICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfQ0tCX0NoZWNrQm94Ow0KLSAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0Qm94Ow0KLSAgICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KLSAgICB9DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQotICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXItPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c0NhcHRpb24pOw0KLSAgICAgICAgaW50MzJfdCBpTGVuID0gd3NDYXB0aW9uLkdldExlbmd0aCgpOw0KLSAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChpTGVuID4gMCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgICAgIENGV0xfVGhlbWVUZXh0IHRleHRQYXJhbTsNCi0gICAgICAgIHRleHRQYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICB0ZXh0UGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0NLQl9DYXB0aW9uOw0KLSAgICAgICAgdGV4dFBhcmFtLm1fZHdTdGF0ZXMgPSBkd1N0YXRlczsNCi0gICAgICAgIHRleHRQYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgICAgIGlmKHBNYXRyaXgpIHsNCi0gICAgICAgICAgICB0ZXh0UGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRleHRQYXJhbS5tX3J0UGFydCA9IG1fcnRDYXB0aW9uOw0KLSAgICAgICAgdGV4dFBhcmFtLm1fd3NUZXh0ID0gd3NDYXB0aW9uOw0KLSAgICAgICAgdGV4dFBhcmFtLm1fZHdUVE9TdHlsZXMgPSBtX2R3VFRPU3R5bGVzOw0KLSAgICAgICAgdGV4dFBhcmFtLm1faVRUT0FsaWduID0gbV9pVFRPQWxpZ247DQotICAgICAgICBwVGhlbWUtPkRyYXdUZXh0KCZ0ZXh0UGFyYW0pOw0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotaW50MzJfdCBDRldMX0NoZWNrQm94SW1wOjpHZXRDaGVja1N0YXRlKCkNCi17DQotICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlKQ0KLSAgICAgICAgICAgICYmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfQ2hlY2tNYXNrKSA9PSBGV0xfU1RBVEVfQ0tCX05ldXRyYWwpKSB7DQotICAgICAgICByZXR1cm4gMjsNCi0gICAgfQ0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0gRldMX1NUQVRFX0NLQl9DaGVja2VkKSB7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfQ0KLSAgICByZXR1cm4gMDsNCi19DQotRldMX0VSUiBDRldMX0NoZWNrQm94SW1wOjpTZXRDaGVja1N0YXRlKGludDMyX3QgaUNoZWNrKQ0KLXsNCi0gICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX0NLQl9DaGVja01hc2s7DQotICAgIHN3aXRjaChpQ2hlY2spIHsNCi0gICAgICAgIGNhc2UgMDogew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIDE6IHsNCi0gICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgMjogew0KLSAgICAgICAgICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfTmV1dHJhbDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLXZvaWQgQ0ZXTF9DaGVja0JveEltcDo6TGF5b3V0KCkNCi17DQotICAgIGludDMyX3Qgd2lkdGggPSBpbnQzMl90KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGggKyAwLjVmKTsNCi0gICAgaW50MzJfdCBoZWlnaHQgPSBpbnQzMl90KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0ICsgMC41Zik7DQotICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGggPSAoRlhfRkxPQVQpd2lkdGg7DQotICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0ID0gKEZYX0ZMT0FUKWhlaWdodDsNCi0gICAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCi0gICAgRlhfRkxPQVQgZkJveFRvcCA9IG1fcnRDbGllbnQudG9wOw0KLSAgICBGWF9GTE9BVCBmQm94TGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCi0gICAgRlhfRkxPQVQgZlRleHRMZWZ0ID0gMC4wLCBmVGV4dFJpZ2h0ID0gMC4wOw0KLSAgICBGWF9GTE9BVCBmQ2xpZW50UmlnaHQgPSBtX3J0Q2xpZW50LnJpZ2h0KCk7DQotICAgIEZYX0ZMT0FUIGZDbGllbnRCb3R0b20gPSBtX3J0Q2xpZW50LmJvdHRvbSgpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQotICAgIElGV0xfQ2hlY2tCb3hEUCAqcERhdGEgPSAoSUZXTF9DaGVja0JveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgIEZYX0ZMT0FUIGZDaGVja0JveCA9IHBEYXRhLT5HZXRCb3hTaXplKG1fcEludGVyZmFjZSk7DQotICAgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfVkxheW91dE1hc2spIHsNCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9Ub3A6IHsNCi0gICAgICAgICAgICAgICAgZkJveFRvcCA9IG1fcnRDbGllbnQudG9wOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfQm90dG9tOiB7DQotICAgICAgICAgICAgICAgIGZCb3hUb3AgPSBmQ2xpZW50Qm90dG9tIC0gZkNoZWNrQm94Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfVkNlbnRlcjoNCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgZkJveFRvcCA9IG1fcnRDbGllbnQudG9wICsgKG1fcnRDbGllbnQuaGVpZ2h0IC0gZkNoZWNrQm94KSAvIDI7DQotICAgICAgICAgICAgICAgIGZCb3hUb3AgPSBGWFNZU19mbG9vcihmQm94VG9wKTsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX0xlZnRUZXh0KSB7DQotICAgICAgICBmQm94TGVmdCA9IGZDbGllbnRSaWdodCAtIGZDaGVja0JveDsNCi0gICAgICAgIGZUZXh0TGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCi0gICAgICAgIGZUZXh0UmlnaHQgPSBmQm94TGVmdDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGZUZXh0TGVmdCA9IGZCb3hMZWZ0ICsgZkNoZWNrQm94Ow0KLSAgICAgICAgZlRleHRSaWdodCA9IGZDbGllbnRSaWdodDsNCi0gICAgfQ0KLSAgICBtX3J0Qm94LlNldChmQm94TGVmdCwgZkJveFRvcCwgZkNoZWNrQm94LCBmQ2hlY2tCb3gpOw0KLSAgICBtX3J0Q2FwdGlvbi5TZXQoZlRleHRMZWZ0LCBtX3J0Q2xpZW50LnRvcCwgZlRleHRSaWdodCAtIGZUZXh0TGVmdCwgbV9ydENsaWVudC5oZWlnaHQpOw0KLSAgICBtX3J0Q2FwdGlvbi5JbmZsYXRlKC1GV0xfQ0tCX0NhcHRpb25NYXJnaW4sIC1GV0xfQ0tCX0NhcHRpb25NYXJnaW4pOw0KLSAgICBDRlhfUmVjdEYgcnRGb2N1czsNCi0gICAgcnRGb2N1cy5TZXQobV9ydENhcHRpb24ubGVmdCwgbV9ydENhcHRpb24udG9wLCBtX3J0Q2FwdGlvbi53aWR0aCwgbV9ydENhcHRpb24uaGVpZ2h0KTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQogICAgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCiAgICAgbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NDYXB0aW9uKTsNCi0gICAgaWYgKHdzQ2FwdGlvbi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIG1fcnRGb2N1cy5TZXQoMCwgMCwgMCwgMCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDYWxjVGV4dFJlY3Qod3NDYXB0aW9uLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBtX2R3VFRPU3R5bGVzLCBtX2lUVE9BbGlnbiwgcnRGb2N1cyk7DQotICAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX011bHRpTGluZSkgPT0gMCkgew0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IEZYX01BWChtX3J0Q2FwdGlvbi53aWR0aCwgcnRGb2N1cy53aWR0aCk7DQotICAgICAgICAgICAgRlhfRkxPQVQgZkhlaWdodCA9IEZYX01JTihtX3J0Q2FwdGlvbi5oZWlnaHQsIHJ0Rm9jdXMuaGVpZ2h0KTsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmTGVmdCA9IG1fcnRDYXB0aW9uLmxlZnQ7DQotICAgICAgICAgICAgRlhfRkxPQVQgZlRvcCA9IG1fcnRDYXB0aW9uLnRvcDsNCi0gICAgICAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX0hMYXlvdXRNYXNrKSA9PSBGV0xfU1RZTEVFWFRfQ0tCX0NlbnRlcikgew0KLSAgICAgICAgICAgICAgICBmTGVmdCA9IG1fcnRDYXB0aW9uLmxlZnQgKyAobV9ydENhcHRpb24ud2lkdGggLSBmV2lkdGgpIC8gMjsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9ITGF5b3V0TWFzaykgPT0gRldMX1NUWUxFRVhUX0NLQl9SaWdodCkgew0KLSAgICAgICAgICAgICAgICBmTGVmdCA9IG1fcnRDYXB0aW9uLnJpZ2h0KCkgLSBmV2lkdGg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfVkxheW91dE1hc2spID09IEZXTF9TVFlMRUVYVF9DS0JfVkNlbnRlcikgew0KLSAgICAgICAgICAgICAgICBmVG9wID0gbV9ydENhcHRpb24udG9wICsgKG1fcnRDYXB0aW9uLmhlaWdodCAtIGZIZWlnaHQpIC8gMjsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9WTGF5b3V0TWFzaykgPT0gRldMX1NUWUxFRVhUX0NLQl9Cb3R0b20pIHsNCi0gICAgICAgICAgICAgICAgZlRvcCA9IG1fcnRDYXB0aW9uLmJvdHRvbSgpIC0gZkhlaWdodDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9ydEZvY3VzLlNldChmTGVmdCwgZlRvcCwgZldpZHRoLCBmSGVpZ2h0KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9ydEZvY3VzLlNldChydEZvY3VzLmxlZnQsIHJ0Rm9jdXMudG9wLCBydEZvY3VzLndpZHRoLCBydEZvY3VzLmhlaWdodCk7DQotICAgICAgICB9DQotICAgICAgICBtX3J0Rm9jdXMuSW5mbGF0ZSgxLCAxKTsNCisgICAgaWYgKHdzQ2FwdGlvbi5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUoDQorICAgICAgICAgIHdzQ2FwdGlvbiwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfTXVsdGlMaW5lKTsNCisgICAgICByZWN0LlNldCgwLCAwLCBzei54LCBzei55KTsNCiAgICAgfQ0KKyAgICByZWN0LkluZmxhdGUoRldMX0NLQl9DYXB0aW9uTWFyZ2luLCBGV0xfQ0tCX0NhcHRpb25NYXJnaW4pOw0KKyAgICBJRldMX0NoZWNrQm94RFAqIHBEYXRhID0gKElGV0xfQ2hlY2tCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBGWF9GTE9BVCBmQ2hlY2tCb3ggPSBwRGF0YS0+R2V0Qm94U2l6ZShtX3BJbnRlcmZhY2UpOw0KKyAgICByZWN0LndpZHRoICs9IGZDaGVja0JveDsNCisgICAgaWYgKHJlY3QuaGVpZ2h0IDwgZkNoZWNrQm94KSB7DQorICAgICAgcmVjdC5oZWlnaHQgPSBmQ2hlY2tCb3g7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRFdPUkQgQ0ZXTF9DaGVja0JveEltcDo6R2V0UGFydFN0YXRlcygpDQotew0KLSAgICBpbnQzMl90IGR3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DS0JfVW5DaGVja2VkOw0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0gRldMX1NUQVRFX0NLQl9OZXV0cmFsKSB7DQotICAgICAgICBkd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWw7DQotICAgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0gRldMX1NUQVRFX0NLQl9DaGVja2VkKSB7DQotICAgICAgICBkd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfQ0tCX0NoZWNrZWQ7DQorRldMX0VSUiBDRldMX0NoZWNrQm94SW1wOjpVcGRhdGUoKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgfQ0KKyAgVXBkYXRlVGV4dE91dFN0eWxlcygpOw0KKyAgTGF5b3V0KCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DaGVja0JveEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX0NLQl9Cb3JkZXIsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgcE1hdHJpeCk7DQorICB9DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfQ0tCX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBpbnQzMl90IGR3U3RhdGVzID0gR2V0UGFydFN0YXRlcygpOw0KKyAgew0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfQ0tCX0JhY2tncm91bmQ7DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBkd1N0YXRlczsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCiAgICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KLSAgICAgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQ7DQotICAgIH0gZWxzZSBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfSG92ZXJlZCApIHsNCi0gICAgICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfQ0tCX0hvdmVyZWQ7DQotICAgIH0gZWxzZSBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfUHJlc3NlZCApIHsNCi0gICAgICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfQ0tCX1ByZXNzZWQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBkd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX0NLQl9Ob3JtYWw7DQotICAgIH0NCisgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0Q2xpZW50Ow0KICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQotICAgICAgICBkd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX0NLQl9Gb2N1c2VkOw0KKyAgICAgIHBhcmFtLm1fcERhdGEgPSAmbV9ydEZvY3VzOw0KICAgICB9DQotICAgIHJldHVybiBkd1N0YXRlczsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfQ0tCX0NoZWNrQm94Ow0KKyAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRCb3g7DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgIH0NCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzQ2FwdGlvbik7DQorICAgIGludDMyX3QgaUxlbiA9IHdzQ2FwdGlvbi5HZXRMZW5ndGgoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChpTGVuID4gMCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgQ0ZXTF9UaGVtZVRleHQgdGV4dFBhcmFtOw0KKyAgICB0ZXh0UGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICB0ZXh0UGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0NLQl9DYXB0aW9uOw0KKyAgICB0ZXh0UGFyYW0ubV9kd1N0YXRlcyA9IGR3U3RhdGVzOw0KKyAgICB0ZXh0UGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgdGV4dFBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgdGV4dFBhcmFtLm1fcnRQYXJ0ID0gbV9ydENhcHRpb247DQorICAgIHRleHRQYXJhbS5tX3dzVGV4dCA9IHdzQ2FwdGlvbjsNCisgICAgdGV4dFBhcmFtLm1fZHdUVE9TdHlsZXMgPSBtX2R3VFRPU3R5bGVzOw0KKyAgICB0ZXh0UGFyYW0ubV9pVFRPQWxpZ24gPSBtX2lUVE9BbGlnbjsNCisgICAgcFRoZW1lLT5EcmF3VGV4dCgmdGV4dFBhcmFtKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotdm9pZCBDRldMX0NoZWNrQm94SW1wOjpVcGRhdGVUZXh0T3V0U3R5bGVzKCkNCi17DQotICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQotICAgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIChGV0xfU1RZTEVFWFRfQ0tCX0hMYXlvdXRNYXNrIHwgRldMX1NUWUxFRVhUX0NLQl9WTGF5b3V0TWFzaykpIHsNCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9MZWZ0IHwgRldMX1NUWUxFRVhUX0NLQl9Ub3A6IHsNCi0gICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcExlZnQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9DZW50ZXIgfCBGV0xfU1RZTEVFWFRfQ0tCX1RvcDogew0KLSAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfVG9wQ2VudGVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfUmlnaHQgfCBGV0xfU1RZTEVFWFRfQ0tCX1RvcDogew0KLSAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfVG9wUmlnaHQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9MZWZ0IHwgRldMX1NUWUxFRVhUX0NLQl9WQ2VudGVyOiB7DQotICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfQ2VudGVyIHwgRldMX1NUWUxFRVhUX0NLQl9WQ2VudGVyOiB7DQotICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9SaWdodCB8IEZXTF9TVFlMRUVYVF9DS0JfVkNlbnRlcjogew0KLSAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyUmlnaHQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9MZWZ0IHwgRldMX1NUWUxFRVhUX0NLQl9Cb3R0b206IHsNCi0gICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUxlZnQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9DZW50ZXIgfCBGV0xfU1RZTEVFWFRfQ0tCX0JvdHRvbTogew0KLSAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQm90dG9tQ2VudGVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfUmlnaHQgfCBGV0xfU1RZTEVFWFRfQ0tCX0JvdHRvbTogew0KLSAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQm90dG9tUmlnaHQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICB9DQoraW50MzJfdCBDRldMX0NoZWNrQm94SW1wOjpHZXRDaGVja1N0YXRlKCkgew0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl8zU3RhdGUpICYmDQorICAgICAgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9DaGVja01hc2spID09DQorICAgICAgIEZXTF9TVEFURV9DS0JfTmV1dHJhbCkpIHsNCisgICAgcmV0dXJuIDI7DQorICB9DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0NCisgICAgICBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQpIHsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorRldMX0VSUiBDRldMX0NoZWNrQm94SW1wOjpTZXRDaGVja1N0YXRlKGludDMyX3QgaUNoZWNrKSB7DQorICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfQ0tCX0NoZWNrTWFzazsNCisgIHN3aXRjaCAoaUNoZWNrKSB7DQorICAgIGNhc2UgMDogew0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIG1fZHdUVE9TdHlsZXMgPSAwOw0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9XR1RTVFlMRV9SVExSZWFkaW5nKSB7DQotICAgICAgICBtX2R3VFRPU3R5bGVzIHw9IEZERV9UVE9TVFlMRV9SVEw7DQorICAgIGNhc2UgMTogew0KKyAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9DaGVja2VkOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9NdWx0aUxpbmUpIHsNCi0gICAgICAgIG1fZHdUVE9TdHlsZXMgfD0gRkRFX1RUT1NUWUxFX0xpbmVXcmFwOw0KKyAgICBjYXNlIDI6IHsNCisgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfTmV1dHJhbDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDoge30NCisgIH0NCisgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXA6OkxheW91dCgpIHsNCisgIGludDMyX3Qgd2lkdGggPSBpbnQzMl90KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGggKyAwLjVmKTsNCisgIGludDMyX3QgaGVpZ2h0ID0gaW50MzJfdChtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCArIDAuNWYpOw0KKyAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCA9IChGWF9GTE9BVCl3aWR0aDsNCisgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0ID0gKEZYX0ZMT0FUKWhlaWdodDsNCisgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQorICBGWF9GTE9BVCBmQm94VG9wID0gbV9ydENsaWVudC50b3A7DQorICBGWF9GTE9BVCBmQm94TGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCisgIEZYX0ZMT0FUIGZUZXh0TGVmdCA9IDAuMCwgZlRleHRSaWdodCA9IDAuMDsNCisgIEZYX0ZMT0FUIGZDbGllbnRSaWdodCA9IG1fcnRDbGllbnQucmlnaHQoKTsNCisgIEZYX0ZMT0FUIGZDbGllbnRCb3R0b20gPSBtX3J0Q2xpZW50LmJvdHRvbSgpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgSUZXTF9DaGVja0JveERQKiBwRGF0YSA9IChJRldMX0NoZWNrQm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIEZYX0ZMT0FUIGZDaGVja0JveCA9IHBEYXRhLT5HZXRCb3hTaXplKG1fcEludGVyZmFjZSk7DQorICBzd2l0Y2ggKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX1ZMYXlvdXRNYXNrKSB7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9Ub3A6IHsNCisgICAgICBmQm94VG9wID0gbV9ydENsaWVudC50b3A7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0JvdHRvbTogew0KKyAgICAgIGZCb3hUb3AgPSBmQ2xpZW50Qm90dG9tIC0gZkNoZWNrQm94Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9WQ2VudGVyOg0KKyAgICBkZWZhdWx0OiB7DQorICAgICAgZkJveFRvcCA9IG1fcnRDbGllbnQudG9wICsgKG1fcnRDbGllbnQuaGVpZ2h0IC0gZkNoZWNrQm94KSAvIDI7DQorICAgICAgZkJveFRvcCA9IEZYU1lTX2Zsb29yKGZCb3hUb3ApOw0KKyAgICB9DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfTGVmdFRleHQpIHsNCisgICAgZkJveExlZnQgPSBmQ2xpZW50UmlnaHQgLSBmQ2hlY2tCb3g7DQorICAgIGZUZXh0TGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgZlRleHRSaWdodCA9IGZCb3hMZWZ0Ow0KKyAgfSBlbHNlIHsNCisgICAgZlRleHRMZWZ0ID0gZkJveExlZnQgKyBmQ2hlY2tCb3g7DQorICAgIGZUZXh0UmlnaHQgPSBmQ2xpZW50UmlnaHQ7DQorICB9DQorICBtX3J0Qm94LlNldChmQm94TGVmdCwgZkJveFRvcCwgZkNoZWNrQm94LCBmQ2hlY2tCb3gpOw0KKyAgbV9ydENhcHRpb24uU2V0KGZUZXh0TGVmdCwgbV9ydENsaWVudC50b3AsIGZUZXh0UmlnaHQgLSBmVGV4dExlZnQsDQorICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgbV9ydENhcHRpb24uSW5mbGF0ZSgtRldMX0NLQl9DYXB0aW9uTWFyZ2luLCAtRldMX0NLQl9DYXB0aW9uTWFyZ2luKTsNCisgIENGWF9SZWN0RiBydEZvY3VzOw0KKyAgcnRGb2N1cy5TZXQobV9ydENhcHRpb24ubGVmdCwgbV9ydENhcHRpb24udG9wLCBtX3J0Q2FwdGlvbi53aWR0aCwNCisgICAgICAgICAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCk7DQorICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQorICBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXItPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c0NhcHRpb24pOw0KKyAgaWYgKHdzQ2FwdGlvbi5Jc0VtcHR5KCkpIHsNCisgICAgbV9ydEZvY3VzLlNldCgwLCAwLCAwLCAwKTsNCisgIH0gZWxzZSB7DQorICAgIENhbGNUZXh0UmVjdCh3c0NhcHRpb24sIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIG1fZHdUVE9TdHlsZXMsDQorICAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiwgcnRGb2N1cyk7DQorICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfTXVsdGlMaW5lKSA9PSAwKSB7DQorICAgICAgRlhfRkxPQVQgZldpZHRoID0gRlhfTUFYKG1fcnRDYXB0aW9uLndpZHRoLCBydEZvY3VzLndpZHRoKTsNCisgICAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gRlhfTUlOKG1fcnRDYXB0aW9uLmhlaWdodCwgcnRGb2N1cy5oZWlnaHQpOw0KKyAgICAgIEZYX0ZMT0FUIGZMZWZ0ID0gbV9ydENhcHRpb24ubGVmdDsNCisgICAgICBGWF9GTE9BVCBmVG9wID0gbV9ydENhcHRpb24udG9wOw0KKyAgICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfSExheW91dE1hc2spID09DQorICAgICAgICAgIEZXTF9TVFlMRUVYVF9DS0JfQ2VudGVyKSB7DQorICAgICAgICBmTGVmdCA9IG1fcnRDYXB0aW9uLmxlZnQgKyAobV9ydENhcHRpb24ud2lkdGggLSBmV2lkdGgpIC8gMjsNCisgICAgICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYNCisgICAgICAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfQ0tCX0hMYXlvdXRNYXNrKSA9PSBGV0xfU1RZTEVFWFRfQ0tCX1JpZ2h0KSB7DQorICAgICAgICBmTGVmdCA9IG1fcnRDYXB0aW9uLnJpZ2h0KCkgLSBmV2lkdGg7DQorICAgICAgfQ0KKyAgICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfVkxheW91dE1hc2spID09DQorICAgICAgICAgIEZXTF9TVFlMRUVYVF9DS0JfVkNlbnRlcikgew0KKyAgICAgICAgZlRvcCA9IG1fcnRDYXB0aW9uLnRvcCArIChtX3J0Q2FwdGlvbi5oZWlnaHQgLSBmSGVpZ2h0KSAvIDI7DQorICAgICAgfSBlbHNlIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmDQorICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0NLQl9WTGF5b3V0TWFzaykgPT0gRldMX1NUWUxFRVhUX0NLQl9Cb3R0b20pIHsNCisgICAgICAgIGZUb3AgPSBtX3J0Q2FwdGlvbi5ib3R0b20oKSAtIGZIZWlnaHQ7DQorICAgICAgfQ0KKyAgICAgIG1fcnRGb2N1cy5TZXQoZkxlZnQsIGZUb3AsIGZXaWR0aCwgZkhlaWdodCk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBtX2R3VFRPU3R5bGVzIHw9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KKyAgICAgIG1fcnRGb2N1cy5TZXQocnRGb2N1cy5sZWZ0LCBydEZvY3VzLnRvcCwgcnRGb2N1cy53aWR0aCwgcnRGb2N1cy5oZWlnaHQpOw0KICAgICB9DQorICAgIG1fcnRGb2N1cy5JbmZsYXRlKDEsIDEpOw0KKyAgfQ0KIH0NCi12b2lkIENGV0xfQ2hlY2tCb3hJbXA6Ok5leHRTdGF0ZXMoKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdGaXJzdHN0YXRlID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX1JhZGlvQnV0dG9uKSB7DQotICAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0gRldMX1NUQVRFX0NLQl9VbmNoZWNrZWQpIHsNCi0gICAgICAgICAgICBJRldMX1dpZGdldE1nciAqcFdNZ3IgPSBGV0xfR2V0V2lkZ2V0TWdyKCk7DQotICAgICAgICAgICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqIClwV01ncjsNCi0gICAgICAgICAgICBpZiAoIXBXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5IHJhZGlvYXJyOw0KLSAgICAgICAgICAgICAgICBwV2lkZ2V0TWdyLT5HZXRTYW1lR3JvdXBSYWRpb0J1dHRvbihtX3BJbnRlcmZhY2UsIHJhZGlvYXJyKTsNCi0gICAgICAgICAgICAgICAgSUZXTF9DaGVja0JveCAqcENoZWNrQm94ID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSByYWRpb2Fyci5HZXRTaXplKCk7DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBwQ2hlY2tCb3ggPSAoSUZXTF9DaGVja0JveCAqKXJhZGlvYXJyW2ldOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDaGVja0JveCAhPSBtX3BJbnRlcmZhY2UgJiYgcENoZWNrQm94LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9DS0JfQ2hlY2tlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDaGVja0JveC0+U2V0Q2hlY2tTdGF0ZSgwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrQm94LT5HZXRXaWRnZXRSZWN0KHJ0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBydC5sZWZ0ID0gcnQudG9wID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BXaWRnZXRNZ3ItPlJlcGFpbnRXaWRnZXQocENoZWNrQm94LCAmcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9DaGVja2VkOw0KK0ZYX0RXT1JEIENGV0xfQ2hlY2tCb3hJbXA6OkdldFBhcnRTdGF0ZXMoKSB7DQorICBpbnQzMl90IGR3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DS0JfVW5DaGVja2VkOw0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9DaGVja01hc2spID09DQorICAgICAgRldMX1NUQVRFX0NLQl9OZXV0cmFsKSB7DQorICAgIGR3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DS0JfTmV1dHJhbDsNCisgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0NCisgICAgICAgICAgICAgRldMX1NUQVRFX0NLQl9DaGVja2VkKSB7DQorICAgIGR3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DS0JfQ2hlY2tlZDsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSB7DQorICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfQ0tCX0Rpc2FibGVkOw0KKyAgfSBlbHNlIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9Ib3ZlcmVkKSB7DQorICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfQ0tCX0hvdmVyZWQ7DQorICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX1ByZXNzZWQpIHsNCisgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9DS0JfUHJlc3NlZDsNCisgIH0gZWxzZSB7DQorICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfQ0tCX05vcm1hbDsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCisgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9DS0JfRm9jdXNlZDsNCisgIH0NCisgIHJldHVybiBkd1N0YXRlczsNCit9DQordm9pZCBDRldMX0NoZWNrQm94SW1wOjpVcGRhdGVUZXh0T3V0U3R5bGVzKCkgew0KKyAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmDQorICAgICAgICAgIChGV0xfU1RZTEVFWFRfQ0tCX0hMYXlvdXRNYXNrIHwgRldMX1NUWUxFRVhUX0NLQl9WTGF5b3V0TWFzaykpIHsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0xlZnQgfCBGV0xfU1RZTEVFWFRfQ0tCX1RvcDogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BMZWZ0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9DZW50ZXIgfCBGV0xfU1RZTEVFWFRfQ0tCX1RvcDogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BDZW50ZXI7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1JpZ2h0IHwgRldMX1NUWUxFRVhUX0NLQl9Ub3A6IHsNCisgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfVG9wUmlnaHQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0xlZnQgfCBGV0xfU1RZTEVFWFRfQ0tCX1ZDZW50ZXI6IHsNCisgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfQ2VudGVyIHwgRldMX1NUWUxFRVhUX0NLQl9WQ2VudGVyOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfUmlnaHQgfCBGV0xfU1RZTEVFWFRfQ0tCX1ZDZW50ZXI6IHsNCisgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyUmlnaHQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0xlZnQgfCBGV0xfU1RZTEVFWFRfQ0tCX0JvdHRvbTogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21MZWZ0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9DZW50ZXIgfCBGV0xfU1RZTEVFWFRfQ0tCX0JvdHRvbTogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21DZW50ZXI7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1JpZ2h0IHwgRldMX1NUWUxFRVhUX0NLQl9Cb3R0b206IHsNCisgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQm90dG9tUmlnaHQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDoge30NCisgIH0NCisgIG1fZHdUVE9TdHlsZXMgPSAwOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfV0dUU1RZTEVfUlRMUmVhZGluZykgew0KKyAgICBtX2R3VFRPU3R5bGVzIHw9IEZERV9UVE9TVFlMRV9SVEw7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfTXVsdGlMaW5lKSB7DQorICAgIG1fZHdUVE9TdHlsZXMgfD0gRkRFX1RUT1NUWUxFX0xpbmVXcmFwOw0KKyAgfSBlbHNlIHsNCisgICAgbV9kd1RUT1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgIH0NCit9DQordm9pZCBDRldMX0NoZWNrQm94SW1wOjpOZXh0U3RhdGVzKCkgew0KKyAgRlhfRFdPUkQgZHdGaXJzdHN0YXRlID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbikgew0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0NCisgICAgICAgIEZXTF9TVEFURV9DS0JfVW5jaGVja2VkKSB7DQorICAgICAgSUZXTF9XaWRnZXRNZ3IqIHBXTWdyID0gRldMX0dldFdpZGdldE1ncigpOw0KKyAgICAgIENGV0xfV2lkZ2V0TWdyKiBwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilwV01ncjsNCisgICAgICBpZiAoIXBXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgIENGWF9QdHJBcnJheSByYWRpb2FycjsNCisgICAgICAgIHBXaWRnZXRNZ3ItPkdldFNhbWVHcm91cFJhZGlvQnV0dG9uKG1fcEludGVyZmFjZSwgcmFkaW9hcnIpOw0KKyAgICAgICAgSUZXTF9DaGVja0JveCogcENoZWNrQm94ID0gTlVMTDsNCisgICAgICAgIGludDMyX3QgaUNvdW50ID0gcmFkaW9hcnIuR2V0U2l6ZSgpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgICAgcENoZWNrQm94ID0gKElGV0xfQ2hlY2tCb3gqKXJhZGlvYXJyW2ldOw0KKyAgICAgICAgICBpZiAocENoZWNrQm94ICE9IG1fcEludGVyZmFjZSAmJg0KKyAgICAgICAgICAgICAgcENoZWNrQm94LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9DS0JfQ2hlY2tlZCkgew0KKyAgICAgICAgICAgIHBDaGVja0JveC0+U2V0Q2hlY2tTdGF0ZSgwKTsNCisgICAgICAgICAgICBDRlhfUmVjdEYgcnQ7DQorICAgICAgICAgICAgcENoZWNrQm94LT5HZXRXaWRnZXRSZWN0KHJ0KTsNCisgICAgICAgICAgICBydC5sZWZ0ID0gcnQudG9wID0gMDsNCisgICAgICAgICAgICBtX3BXaWRnZXRNZ3ItPlJlcGFpbnRXaWRnZXQocENoZWNrQm94LCAmcnQpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9DaGVja2VkOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0NCisgICAgICAgIEZXTF9TVEFURV9DS0JfTmV1dHJhbCkgew0KKyAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfQ2hlY2tNYXNrOw0KKyAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl8zU3RhdGUpIHsNCisgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9DaGVja2VkOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfQ2hlY2tNYXNrKSA9PQ0KKyAgICAgICAgICAgICAgIEZXTF9TVEFURV9DS0JfQ2hlY2tlZCkgew0KKyAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfQ2hlY2tNYXNrOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9DaGVja01hc2spID09IEZXTF9TVEFURV9DS0JfTmV1dHJhbCkgew0KLSAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfQ2hlY2tNYXNrOw0KLSAgICAgICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl8zU3RhdGUpIHsNCi0gICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfQ2hlY2tNYXNrKSA9PSBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQpIHsNCi0gICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfQ0tCX0NoZWNrTWFzazsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCXzNTdGF0ZSkgew0KLSAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfTmV1dHJhbDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfQ2hlY2tlZDsNCi0gICAgICAgICAgICB9DQorICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCXzNTdGF0ZSkgew0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfQ0tCX05ldXRyYWw7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9DaGVja2VkOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgUmVwYWludCgmbV9ydENsaWVudCk7DQorICBGWF9EV09SRCBkd0xhc3RzdGF0ZSA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorICBpZiAoZHdGaXJzdHN0YXRlICE9IGR3TGFzdHN0YXRlKSB7DQorICAgIENGV0xfRXZ0Q2tiQ2hlY2tTdGF0ZUNoYW5nZWQgd21DaGVja0JveFN0YXRlOw0KKyAgICB3bUNoZWNrQm94U3RhdGUubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBEaXNwYXRjaEV2ZW50KCZ3bUNoZWNrQm94U3RhdGUpOw0KKyAgfQ0KK30NCitDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6OkNGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZShDRldMX0NoZWNrQm94SW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KKyAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgIGludDMyX3QgaVJldCA9IDE7DQorICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0FjdGl2YXRlOiB7DQorICAgICAgT25BY3RpdmF0ZShwTWVzc2FnZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCisgICAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQorICAgICAgc3dpdGNoIChkd0NtZCkgew0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCisgICAgICAgICAgT25MQnV0dG9uRG93bihwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQotICAgIH0NCi0gICAgUmVwYWludCgmbV9ydENsaWVudCk7DQotICAgIEZYX0RXT1JEIGR3TGFzdHN0YXRlID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCi0gICAgaWYgKGR3Rmlyc3RzdGF0ZSAhPSBkd0xhc3RzdGF0ZSkgew0KLSAgICAgICAgQ0ZXTF9FdnRDa2JDaGVja1N0YXRlQ2hhbmdlZCB3bUNoZWNrQm94U3RhdGU7DQotICAgICAgICB3bUNoZWNrQm94U3RhdGUubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICAgICAgRGlzcGF0Y2hFdmVudCgmd21DaGVja0JveFN0YXRlKTsNCi0gICAgfQ0KLX0NCi1DRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6OkNGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZShDRldMX0NoZWNrQm94SW1wICpwT3duZXIpDQotICAgIDogbV9wT3duZXIocE93bmVyKQ0KLXsNCi19DQotaW50MzJfdCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KLSAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpbnQzMl90IGlSZXQgPSAxOw0KLSAgICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9BY3RpdmF0ZTogew0KLSAgICAgICAgICAgICAgICBPbkFjdGl2YXRlKHBNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQotICAgICAgICAgICAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQotICAgICAgICAgICAgICAgIENGV0xfTXNnTW91c2UgKnBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCi0gICAgICAgICAgICAgICAgc3dpdGNoIChkd0NtZCkgew0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uRG93bihwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Nb3VzZU1vdmUocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmU6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Nb3VzZUxlYXZlKHBNc2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQotICAgICAgICAgICAgICAgIENGV0xfTXNnS2V5ICpwS2V5ID0gKENGV0xfTXNnS2V5KilwTWVzc2FnZTsNCi0gICAgICAgICAgICAgICAgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duKSB7DQotICAgICAgICAgICAgICAgICAgICBPbktleURvd24oKENGV0xfTXNnS2V5KilwS2V5KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIGlSZXQgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCi0gICAgcmV0dXJuIGlSZXQ7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCi19DQotdm9pZCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uQWN0aXZhdGUoQ0ZXTF9NZXNzYWdlICpwTXNnKQ0KLXsNCi0gICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZDsNCi0gICAgbV9wT3duZXItPlJlcGFpbnQoJihtX3BPd25lci0+bV9ydENsaWVudCkpOw0KLX0NCi12b2lkIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgKQ0KLXsNCi0gICAgaWYgKGJTZXQpIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KLSAgICB9DQotICAgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRDbGllbnQpKTsNCi19DQotdm9pZCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KLSAgICAgICAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KLSAgICB9DQotICAgIG1fcE93bmVyLT5tX2JCdG5Eb3duID0gVFJVRTsNCi0gICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfiBGV0xfU1RBVEVfQ0tCX0hvdmVyZWQ7DQotICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCi0gICAgbV9wT3duZXItPlJlcGFpbnQoJihtX3BPd25lci0+bV9ydENsaWVudCkpOw0KLX0NCi12b2lkIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIGlmICghbV9wT3duZXItPm1fYkJ0bkRvd24pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBtX3BPd25lci0+bV9iQnRuRG93biA9IEZBTFNFOw0KLSAgICBpZiAoIW1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KLSAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX0NLQl9QcmVzc2VkOw0KLSAgICBtX3BPd25lci0+TmV4dFN0YXRlcygpOw0KLX0NCi12b2lkIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6T25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYlJlcGFpbnQgPSBGQUxTRTsNCi0gICAgaWYgKG1fcE93bmVyLT5tX2JCdG5Eb3duKSB7DQotICAgICAgICBpZiAobV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgICAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9QcmVzc2VkKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9QcmVzc2VkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9Ib3ZlcmVkKSkgew0KLSAgICAgICAgICAgICAgICBiUmVwYWludCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfQ0tCX0hvdmVyZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX1ByZXNzZWQpIHsNCi0gICAgICAgICAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX0NLQl9QcmVzc2VkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9Ib3ZlcmVkKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KLSAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAobV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgICAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9Ib3ZlcmVkKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KLSAgICAgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICAgIE9uTW91c2VMZWF2ZShwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7fQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpZiAoYlJlcGFpbnQpIHsNCi0gICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRCb3gpKTsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCisgICAgICBDRldMX01zZ0tleSogcEtleSA9IChDRldMX01zZ0tleSopcE1lc3NhZ2U7DQorICAgICAgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duKSB7DQorICAgICAgICBPbktleURvd24oKENGV0xfTXNnS2V5KilwS2V5KTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyBpUmV0ID0gMDsgfQ0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICByZXR1cm4gaVJldDsNCiB9DQotdm9pZCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgaWYgKG1fcE93bmVyLT5tX2JCdG5Eb3duKSB7DQotICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfQ0tCX0hvdmVyZWQ7DQotICAgIH0gZWxzZSB7DQorRldMX0VSUiBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6T25BY3RpdmF0ZShDRldMX01lc3NhZ2UqIHBNc2cpIHsNCisgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQorICBtX3BPd25lci0+UmVwYWludCgmKG1fcE93bmVyLT5tX3J0Q2xpZW50KSk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldCkgew0KKyAgaWYgKGJTZXQpIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICB9DQorICBtX3BPd25lci0+UmVwYWludCgmKG1fcE93bmVyLT5tX3J0Q2xpZW50KSk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KKyAgfQ0KKyAgbV9wT3duZXItPm1fYkJ0bkRvd24gPSBUUlVFOw0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfSG92ZXJlZDsNCisgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCisgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRDbGllbnQpKTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmICghbV9wT3duZXItPm1fYkJ0bkRvd24pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wT3duZXItPm1fYkJ0bkRvd24gPSBGQUxTRTsNCisgIGlmICghbV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCisgIG1fcE93bmVyLT5OZXh0U3RhdGVzKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmVwYWludCA9IEZBTFNFOw0KKyAgaWYgKG1fcE93bmVyLT5tX2JCdG5Eb3duKSB7DQorICAgIGlmIChtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX1ByZXNzZWQpID09IDApIHsNCisgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCisgICAgICB9DQorICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfSG92ZXJlZCkpIHsNCisgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCiAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfQ0tCX0hvdmVyZWQ7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfUHJlc3NlZCkgew0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCisgICAgICB9DQorICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfSG92ZXJlZCkgPT0gMCkgew0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfSG92ZXJlZCkgPT0gMCkgew0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJSZXBhaW50KSB7DQogICAgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRCb3gpKTsNCisgIH0NCiB9DQotdm9pZCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uS2V5RG93bihDRldMX01zZ0tleSAqcE1zZykNCi17DQotICAgIGlmIChwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9UYWIpIHsNCi0gICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEtleUV2ZW50KHBNc2cpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9SZXR1cm4gfHwgcE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfU3BhY2UpIHsNCi0gICAgICAgIG1fcE93bmVyLT5OZXh0U3RhdGVzKCk7DQotICAgIH0NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9iQnRuRG93bikgew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfQ0tCX0hvdmVyZWQ7DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgfQ0KKyAgbV9wT3duZXItPlJlcGFpbnQoJihtX3BPd25lci0+bV9ydEJveCkpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6T25LZXlEb3duKENGV0xfTXNnS2V5KiBwTXNnKSB7DQorICBpZiAocE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfVGFiKSB7DQorICAgIG1fcE93bmVyLT5EaXNwYXRjaEtleUV2ZW50KHBNc2cpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfUmV0dXJuIHx8DQorICAgICAgcE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfU3BhY2UpIHsNCisgICAgbV9wT3duZXItPk5leHRTdGF0ZXMoKTsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NvbWJvYm94aW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9jb21ib2JveGltcC5jcHAKaW5kZXggNmNhODZlNy4uNDVjM2NhZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NvbWJvYm94aW1wLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY29tYm9ib3hpbXAuY3BwCkBAIC0xOCwxOTc0ICsxOCwxODc1IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfbGlzdGJveGltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9mb3JtcHJveHlpbXAuaCINCiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfY29tYm9ib3hpbXAuaCINCi1JRldMX0NvbWJvQm94KiBJRldMX0NvbWJvQm94OjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBJRldMX0NvbWJvQm94Ow0KK0lGV0xfQ29tYm9Cb3gqIElGV0xfQ29tYm9Cb3g6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgSUZXTF9Db21ib0JveDsNCiB9DQotSUZXTF9Db21ib0JveDo6SUZXTF9Db21ib0JveCgpDQotew0KK0lGV0xfQ29tYm9Cb3g6OklGV0xfQ29tYm9Cb3goKSB7DQorICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9Db21ib0JveDo6fklGV0xfQ29tYm9Cb3goKSB7DQorICBpZiAobV9wRGF0YSkgew0KKyAgICBkZWxldGUgKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGE7DQogICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgfQ0KIH0NCi1JRldMX0NvbWJvQm94Ojp+SUZXTF9Db21ib0JveCgpDQotew0KLSAgICBpZiAobV9wRGF0YSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhOw0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQotICAgIH0NCitGV0xfRVJSIElGV0xfQ29tYm9Cb3g6OkluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NvbWJvQm94SW1wKHBPdXRlcik7DQorICAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSIElGV0xfQ29tYm9Cb3g6OkluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlcikNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9Db21ib0JveEltcChwT3V0ZXIpOw0KLSAgICAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorRldMX0VSUiBJRldMX0NvbWJvQm94OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NvbWJvQm94SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSCUlGV0xfQ29tYm9Cb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NvbWJvQm94SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitpbnQzMl90IElGV0xfQ29tYm9Cb3g6OkdldEN1clNlbCgpIHsNCisgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5HZXRDdXJTZWwoKTsNCiB9DQotaW50MzJfdCBJRldMX0NvbWJvQm94OjpHZXRDdXJTZWwoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkdldEN1clNlbCgpOw0KK0ZXTF9FUlIgSUZXTF9Db21ib0JveDo6U2V0Q3VyU2VsKGludDMyX3QgaVNlbCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPlNldEN1clNlbChpU2VsKTsNCiB9DQotRldMX0VSUglJRldMX0NvbWJvQm94OjpTZXRDdXJTZWwoaW50MzJfdCBpU2VsKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPlNldEN1clNlbChpU2VsKTsNCitGV0xfRVJSIElGV0xfQ29tYm9Cb3g6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5TZXRFZGl0VGV4dCh3c1RleHQpOw0KIH0NCi1GV0xfRVJSCUlGV0xfQ29tYm9Cb3g6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+U2V0RWRpdFRleHQod3NUZXh0KTsNCitpbnQzMl90IElGV0xfQ29tYm9Cb3g6OkdldEVkaXRUZXh0TGVuZ3RoKCkgY29uc3Qgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkdldEVkaXRUZXh0TGVuZ3RoKCk7DQogfQ0KLWludDMyX3QgSUZXTF9Db21ib0JveDo6R2V0RWRpdFRleHRMZW5ndGgoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkdldEVkaXRUZXh0TGVuZ3RoKCk7DQorRldMX0VSUiBJRldMX0NvbWJvQm94OjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCkgY29uc3Qgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkdldEVkaXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KIH0NCi1GV0xfRVJSCUlGV0xfQ29tYm9Cb3g6OkdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgY29uc3QNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5HZXRFZGl0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCitGV0xfRVJSIElGV0xfQ29tYm9Cb3g6OlNldEVkaXRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIHsNCisgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5TZXRFZGl0U2VsUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KIH0NCi1GV0xfRVJSCUlGV0xfQ29tYm9Cb3g6OlNldEVkaXRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+U2V0RWRpdFNlbFJhbmdlKG5TdGFydCwgbkNvdW50KTsNCitpbnQzMl90IElGV0xfQ29tYm9Cb3g6OkdldEVkaXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+R2V0RWRpdFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCiB9DQotaW50MzJfdCBJRldMX0NvbWJvQm94OjpHZXRFZGl0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QgJm5TdGFydCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5HZXRFZGl0U2VsUmFuZ2UobkluZGV4LCBuU3RhcnQpOw0KK2ludDMyX3QgSUZXTF9Db21ib0JveDo6R2V0RWRpdExpbWl0KCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkdldEVkaXRMaW1pdCgpOw0KIH0NCi1pbnQzMl90IElGV0xfQ29tYm9Cb3g6OkdldEVkaXRMaW1pdCgpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+R2V0RWRpdExpbWl0KCk7DQorRldMX0VSUiBJRldMX0NvbWJvQm94OjpTZXRFZGl0TGltaXQoaW50MzJfdCBuTGltaXQpIHsNCisgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5TZXRFZGl0TGltaXQobkxpbWl0KTsNCiB9DQotRldMX0VSUiBJRldMX0NvbWJvQm94OjpTZXRFZGl0TGltaXQoaW50MzJfdCBuTGltaXQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+U2V0RWRpdExpbWl0KG5MaW1pdCk7DQorRldMX0VSUiBJRldMX0NvbWJvQm94OjpFZGl0RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdERvQ2xpcGJvYXJkKGlDbWQpOw0KIH0NCi1GV0xfRVJSIElGV0xfQ29tYm9Cb3g6OkVkaXREb0NsaXBib2FyZChpbnQzMl90IGlDbWQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdERvQ2xpcGJvYXJkKGlDbWQpOw0KK0ZYX0JPT0wgSUZXTF9Db21ib0JveDo6RWRpdFJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRSZWRvKGJzUmVjb3JkKTsNCiB9DQotRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRSZWRvKGJzUmVjb3JkKTsNCitGWF9CT09MIElGV0xfQ29tYm9Cb3g6OkVkaXRVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpIHsNCisgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5FZGl0VW5kbyhic1JlY29yZCk7DQogfQ0KLUZYX0JPT0wgSUZXTF9Db21ib0JveDo6RWRpdFVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5FZGl0VW5kbyhic1JlY29yZCk7DQorSUZXTF9MaXN0Qm94KiBJRldMX0NvbWJvQm94OjpHZXRMaXN0Qm94dCgpIHsNCisgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5HZXRMaXN0Qm94dCgpOw0KIH0NCi1JRldMX0xpc3RCb3gqICBJRldMX0NvbWJvQm94OjpHZXRMaXN0Qm94dCgpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+R2V0TGlzdEJveHQoKTsNCitGWF9CT09MIElGV0xfQ29tYm9Cb3g6OkFmdGVyRm9jdXNTaG93RHJvcExpc3QoKSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+QWZ0ZXJGb2N1c1Nob3dEcm9wTGlzdCgpOw0KIH0NCi1GWF9CT09MIElGV0xfQ29tYm9Cb3g6OkFmdGVyRm9jdXNTaG93RHJvcExpc3QoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkFmdGVyRm9jdXNTaG93RHJvcExpc3QoKTsNCitGWF9FUlIgSUZXTF9Db21ib0JveDo6T3BlbkRyb3BEb3duTGlzdChGWF9CT09MIGJBY3RpdmF0ZSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPk9wZW5Ecm9wRG93bkxpc3QoYkFjdGl2YXRlKTsNCiB9DQotRlhfRVJSIElGV0xfQ29tYm9Cb3g6Ok9wZW5Ecm9wRG93bkxpc3QoRlhfQk9PTCBiQWN0aXZhdGUpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+T3BlbkRyb3BEb3duTGlzdChiQWN0aXZhdGUpOw0KK0ZYX0JPT0wgSUZXTF9Db21ib0JveDo6RWRpdENhblVuZG8oKSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdENhblVuZG8oKTsNCiB9DQotRlhfQk9PTAlJRldMX0NvbWJvQm94OjpFZGl0Q2FuVW5kbygpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdENhblVuZG8oKTsNCitGWF9CT09MIElGV0xfQ29tYm9Cb3g6OkVkaXRDYW5SZWRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDYW5SZWRvKCk7DQogfQ0KLUZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdENhblJlZG8oKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDYW5SZWRvKCk7DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0VW5kbygpIHsNCisgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5FZGl0VW5kbygpOw0KIH0NCi1GWF9CT09MCUlGV0xfQ29tYm9Cb3g6OkVkaXRVbmRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5FZGl0VW5kbygpOw0KK0ZYX0JPT0wgSUZXTF9Db21ib0JveDo6RWRpdFJlZG8oKSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdFJlZG8oKTsNCiB9DQotRlhfQk9PTAlJRldMX0NvbWJvQm94OjpFZGl0UmVkbygpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdFJlZG8oKTsNCitGWF9CT09MIElGV0xfQ29tYm9Cb3g6OkVkaXRDYW5Db3B5KCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDYW5Db3B5KCk7DQogfQ0KLUZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdENhbkNvcHkoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDYW5Db3B5KCk7DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0Q2FuQ3V0KCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDYW5DdXQoKTsNCiB9DQotRlhfQk9PTAlJRldMX0NvbWJvQm94OjpFZGl0Q2FuQ3V0KCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5FZGl0Q2FuQ3V0KCk7DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0Q2FuU2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDYW5TZWxlY3RBbGwoKTsNCiB9DQotRlhfQk9PTAlJRldMX0NvbWJvQm94OjpFZGl0Q2FuU2VsZWN0QWxsKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5FZGl0Q2FuU2VsZWN0QWxsKCk7DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0Q29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdENvcHkod3NDb3B5KTsNCiB9DQotRlhfQk9PTAlJRldMX0NvbWJvQm94OjpFZGl0Q29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDb3B5KHdzQ29weSk7DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDdXQod3NDdXQpOw0KIH0NCi1GWF9CT09MCUlGV0xfQ29tYm9Cb3g6OkVkaXRDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRDdXQod3NDdXQpOw0KK0ZYX0JPT0wgSUZXTF9Db21ib0JveDo6RWRpdFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdFBhc3RlKHdzUGFzdGUpOw0KIH0NCi1GWF9CT09MCUlGV0xfQ29tYm9Cb3g6OkVkaXRQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5FZGl0UGFzdGUod3NQYXN0ZSk7DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0U2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXRTZWxlY3RBbGwoKTsNCiB9DQotRlhfQk9PTAlJRldMX0NvbWJvQm94OjpFZGl0U2VsZWN0QWxsKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5FZGl0U2VsZWN0QWxsKCk7DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0RGVsZXRlKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSktPkVkaXREZWxldGUoKTsNCiB9DQotRlhfQk9PTAlJRldMX0NvbWJvQm94OjpFZGl0RGVsZXRlKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5FZGl0RGVsZXRlKCk7DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0RGVTZWxlY3QoKSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdERlU2VsZWN0KCk7DQogfQ0KLUZYX0JPT0wJSUZXTF9Db21ib0JveDo6RWRpdERlU2VsZWN0KCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5FZGl0RGVTZWxlY3QoKTsNCitGV0xfRVJSIElGV0xfQ29tYm9Cb3g6OkdldEJCb3goQ0ZYX1JlY3RGJiByZWN0KSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+R2V0QkJveChyZWN0KTsNCiB9DQotRldMX0VSUglJRldMX0NvbWJvQm94OjpHZXRCQm94KENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3hJbXAqKW1fcERhdGEpLT5HZXRCQm94KHJlY3QpOw0KK0ZXTF9FUlIgSUZXTF9Db21ib0JveDo6RWRpdE1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEltcCopbV9wRGF0YSkNCisgICAgICAtPkVkaXRNb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCiB9DQotRldMX0VSUglJRldMX0NvbWJvQm94OjpFZGl0TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KLSAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SW1wKiltX3BEYXRhKS0+RWRpdE1vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwNCi0gICAgICAgICAgICBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorQ0ZXTF9Db21ib0VkaXQ6OkNGV0xfQ29tYm9FZGl0KElGV0xfV2lkZ2V0KiBwT3V0ZXIpIDogQ0ZXTF9FZGl0SW1wKHBPdXRlcikgew0KKyAgRlhTWVNfYXNzZXJ0KHBPdXRlciAhPSBOVUxMKTsNCisgIG1fcE91dGVyID0gKENGV0xfQ29tYm9Cb3hJbXAqKSgoKElGV0xfVGFyZ2V0RGF0YSopcE91dGVyKS0+R2V0RGF0YSgpKTsNCiB9DQotQ0ZXTF9Db21ib0VkaXQ6OkNGV0xfQ29tYm9FZGl0KElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotICAgIDogQ0ZXTF9FZGl0SW1wKHBPdXRlcikNCi17DQotICAgIEZYU1lTX2Fzc2VydChwT3V0ZXIgIT0gTlVMTCk7DQotICAgIG1fcE91dGVyID0gKENGV0xfQ29tYm9Cb3hJbXAqKSgoKElGV0xfVGFyZ2V0RGF0YSopcE91dGVyKS0+R2V0RGF0YSgpKTsNCi19DQotQ0ZXTF9Db21ib0VkaXQ6OkNGV0xfQ29tYm9FZGl0KGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCi0gICAgOiBDRldMX0VkaXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBPdXRlciAhPSBOVUxMKTsNCi0gICAgbV9wT3V0ZXIgPSAoQ0ZXTF9Db21ib0JveEltcCopKCgoSUZXTF9UYXJnZXREYXRhKilwT3V0ZXIpLT5HZXREYXRhKCkpOw0KK0NGV0xfQ29tYm9FZGl0OjpDRldMX0NvbWJvRWRpdChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9FZGl0SW1wKHByb3BlcnRpZXMsIHBPdXRlcikgew0KKyAgRlhTWVNfYXNzZXJ0KHBPdXRlciAhPSBOVUxMKTsNCisgIG1fcE91dGVyID0gKENGV0xfQ29tYm9Cb3hJbXAqKSgoKElGV0xfVGFyZ2V0RGF0YSopcE91dGVyKS0+R2V0RGF0YSgpKTsNCiB9DQogDQotQ0ZXTF9Db21ib0VkaXREZWxlZ2F0ZTo6Q0ZXTF9Db21ib0VkaXREZWxlZ2F0ZShDRldMX0NvbWJvRWRpdCAqcE93bmVyKQ0KLSAgICA6IENGV0xfRWRpdEltcERlbGVnYXRlKHBPd25lcikNCi0gICAgLCBtX3BPd25lcihwT3duZXIpDQotew0KLX0NCi1pbnQzMl90IENGV0xfQ29tYm9FZGl0RGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KLSAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBGWF9CT09MIGJhY2tEZWZhdWx0ID0gVFJVRTsNCi0gICAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KLSAgICAgICAgICAgICAgICBpZiAoZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRm9jdXNlZDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRm9jdXNlZDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBiYWNrRGVmYXVsdCA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQotICAgICAgICAgICAgICAgIENGV0xfTXNnTW91c2UgKnBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQotICAgICAgICAgICAgICAgIGlmICgocE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd24pICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PSAwKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGVkKCk7DQotICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+U2V0Q29tYm9Cb3hGb2N1cyhUUlVFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgfQ0KK0NGV0xfQ29tYm9FZGl0RGVsZWdhdGU6OkNGV0xfQ29tYm9FZGl0RGVsZWdhdGUoQ0ZXTF9Db21ib0VkaXQqIHBPd25lcikNCisgICAgOiBDRldMX0VkaXRJbXBEZWxlZ2F0ZShwT3duZXIpLCBtX3BPd25lcihwT3duZXIpIHt9DQoraW50MzJfdCBDRldMX0NvbWJvRWRpdERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KKyAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgIEZYX0JPT0wgYmFja0RlZmF1bHQgPSBUUlVFOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBpZiAoZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKSB7DQorICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRm9jdXNlZDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICAgIH0NCisgICAgICBiYWNrRGVmYXVsdCA9IEZBTFNFOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGlmICghYmFja0RlZmF1bHQpIHsNCi0gICAgICAgIHJldHVybiAxOw0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCisgICAgICBpZiAoKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duKSAmJg0KKyAgICAgICAgICAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApKSB7DQorICAgICAgICBtX3BPd25lci0+U2V0U2VsZWN0ZWQoKTsNCisgICAgICAgIG1fcE93bmVyLT5TZXRDb21ib0JveEZvY3VzKFRSVUUpOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgaWYgKCFiYWNrRGVmYXVsdCkgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIHJldHVybiBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQogfQ0KLXZvaWQgQ0ZXTF9Db21ib0VkaXQ6OkNsZWFyU2VsZWN0ZWQoKQ0KLXsNCi0gICAgQ2xlYXJTZWxlY3Rpb25zKCk7DQotICAgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KK3ZvaWQgQ0ZXTF9Db21ib0VkaXQ6OkNsZWFyU2VsZWN0ZWQoKSB7DQorICBDbGVhclNlbGVjdGlvbnMoKTsNCisgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KIH0NCi12b2lkIENGV0xfQ29tYm9FZGl0OjpTZXRTZWxlY3RlZCgpDQotew0KLSAgICBGbGFnRm9jdXMoVFJVRSk7DQotICAgIEVuZENhcmV0KCk7DQotICAgIEFkZFNlbFJhbmdlKDApOw0KK3ZvaWQgQ0ZXTF9Db21ib0VkaXQ6OlNldFNlbGVjdGVkKCkgew0KKyAgRmxhZ0ZvY3VzKFRSVUUpOw0KKyAgRW5kQ2FyZXQoKTsNCisgIEFkZFNlbFJhbmdlKDApOw0KIH0NCi12b2lkIENGV0xfQ29tYm9FZGl0OjpFbmRDYXJldCgpDQotew0KLSAgICBtX3BFZHRFbmdpbmUtPk1vdmVDYXJldFBvcyhNQ19FbmQpOw0KK3ZvaWQgQ0ZXTF9Db21ib0VkaXQ6OkVuZENhcmV0KCkgew0KKyAgbV9wRWR0RW5naW5lLT5Nb3ZlQ2FyZXRQb3MoTUNfRW5kKTsNCiB9DQotdm9pZCBDRldMX0NvbWJvRWRpdDo6RmxhZ0ZvY3VzKEZYX0JPT0wgYlNldCkNCi17DQotICAgIGlmIChiU2V0KSB7DQotICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQotICAgICAgICBTaG93Q2FyZXQoRkFMU0UpOw0KLSAgICB9DQordm9pZCBDRldMX0NvbWJvRWRpdDo6RmxhZ0ZvY3VzKEZYX0JPT0wgYlNldCkgew0KKyAgaWYgKGJTZXQpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRm9jdXNlZDsNCisgIH0gZWxzZSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICBTaG93Q2FyZXQoRkFMU0UpOw0KKyAgfQ0KIH07DQotdm9pZCBDRldMX0NvbWJvRWRpdDo6U2V0Q29tYm9Cb3hGb2N1cyhGWF9CT09MIGJTZXQpDQotew0KLSAgICBtX3BPdXRlci0+U2V0Rm9jdXMoYlNldCk7DQordm9pZCBDRldMX0NvbWJvRWRpdDo6U2V0Q29tYm9Cb3hGb2N1cyhGWF9CT09MIGJTZXQpIHsNCisgIG1fcE91dGVyLT5TZXRGb2N1cyhiU2V0KTsNCiB9DQotQ0ZXTF9Db21ib0xpc3Q6OkNGV0xfQ29tYm9MaXN0KElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotICAgIDogQ0ZXTF9MaXN0Qm94SW1wKHBPdXRlcikNCi0gICAgLCBtX2JOb3RpZnlPd25lcihUUlVFKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBPdXRlciAhPSBOVUxMKTsNCitDRldMX0NvbWJvTGlzdDo6Q0ZXTF9Db21ib0xpc3QoSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX0xpc3RCb3hJbXAocE91dGVyKSwgbV9iTm90aWZ5T3duZXIoVFJVRSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBPdXRlciAhPSBOVUxMKTsNCiB9DQotQ0ZXTF9Db21ib0xpc3Q6OkNGV0xfQ29tYm9MaXN0KGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCi0gICAgOiBDRldMX0xpc3RCb3hJbXAocHJvcGVydGllcywgcE91dGVyKQ0KLSAgICAsIG1fYk5vdGlmeU93bmVyKFRSVUUpDQotew0KLSAgICBGWFNZU19hc3NlcnQocE91dGVyICE9IE5VTEwpOw0KK0NGV0xfQ29tYm9MaXN0OjpDRldMX0NvbWJvTGlzdChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9MaXN0Qm94SW1wKHByb3BlcnRpZXMsIHBPdXRlciksIG1fYk5vdGlmeU93bmVyKFRSVUUpIHsNCisgIEZYU1lTX2Fzc2VydChwT3V0ZXIgIT0gTlVMTCk7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0xpc3Q6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9MaXN0Qm94SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGlmIChtX3BEZWxlZ2F0ZSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0NvbWJvTGlzdERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCi0gICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCi0gICAgfQ0KLSAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZSh0aGlzKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0xpc3Q6OkluaXRpYWxpemUoKSB7DQorICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX0xpc3RCb3hJbXA6OkluaXRpYWxpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgZGVsZXRlIChDRldMX0NvbWJvTGlzdERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgfQ0KKyAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfQ29tYm9MaXN0RGVsZWdhdGUodGhpcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0xpc3Q6OkZpbmFsaXplKCkNCi17DQotICAgIGlmICggbV9wRGVsZWdhdGUpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQotICAgICAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfTGlzdEJveEltcDo6RmluYWxpemUoKTsNCitGV0xfRVJSIENGV0xfQ29tYm9MaXN0OjpGaW5hbGl6ZSgpIHsNCisgIGlmIChtX3BEZWxlZ2F0ZSkgew0KKyAgICBkZWxldGUgKENGV0xfQ29tYm9MaXN0RGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQorICB9DQorICByZXR1cm4gQ0ZXTF9MaXN0Qm94SW1wOjpGaW5hbGl6ZSgpOw0KIH0NCi1pbnQzMl90IENGV0xfQ29tYm9MaXN0OjpNYXRjaEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzTWF0Y2gpDQotew0KLSAgICBpZiAod3NNYXRjaC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgLTEpOw0KLSAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgcERhdGEtPkdldEl0ZW1UZXh0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHdzVGV4dCk7DQotICAgICAgICBGWF9TVFJTSVpFIHBvcyA9IHdzVGV4dC5GaW5kKChjb25zdCBGWF9XQ0hBUiopd3NNYXRjaCk7DQotICAgICAgICBpZiAoIXBvcykgew0KLSAgICAgICAgICAgIHJldHVybiBpOw0KLSAgICAgICAgfQ0KLSAgICB9DQoraW50MzJfdCBDRldMX0NvbWJvTGlzdDo6TWF0Y2hJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c01hdGNoKSB7DQorICBpZiAod3NNYXRjaC5Jc0VtcHR5KCkpIHsNCiAgICAgcmV0dXJuIC0xOw0KLX0NCi12b2lkIENGV0xfQ29tYm9MaXN0OjpDaGFuZ2VTZWxlY3RlZChpbnQzMl90IGlTZWwpDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpU2VsKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCi0gICAgcnRJbnZhbGlkYXRlLlJlc2V0KCk7DQotICAgIEZXTF9ITElTVElURU0gaE9sZCA9IEdldFNlbEl0ZW0oMCk7DQotICAgIGludDMyX3QgaU9sZCA9IHBEYXRhLT5HZXRJdGVtSW5kZXgobV9wSW50ZXJmYWNlLCBoT2xkKTsNCi0gICAgaWYgKGlPbGQgPT0gaVNlbCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9IGVsc2UgaWYgKGlPbGQgPiAtMSkgew0KLSAgICAgICAgR2V0SXRlbVJlY3QoaU9sZCwgcnRJbnZhbGlkYXRlKTsNCi0gICAgICAgIFNldFNlbEl0ZW0oaE9sZCwgRkFMU0UpOw0KKyAgfQ0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIsIC0xKTsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgcERhdGEtPkdldEl0ZW1UZXh0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHdzVGV4dCk7DQorICAgIEZYX1NUUlNJWkUgcG9zID0gd3NUZXh0LkZpbmQoKGNvbnN0IEZYX1dDSEFSKil3c01hdGNoKTsNCisgICAgaWYgKCFwb3MpIHsNCisgICAgICByZXR1cm4gaTsNCiAgICAgfQ0KLSAgICBpZiAoaEl0ZW0pIHsNCi0gICAgICAgIENGWF9SZWN0RiByZWN0Ow0KLSAgICAgICAgR2V0SXRlbVJlY3QoaVNlbCwgcmVjdCk7DQotICAgICAgICBydEludmFsaWRhdGUuVW5pb24ocmVjdCk7DQotICAgICAgICBGV0xfSExJU1RJVEVNIGhTZWwgPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGlTZWwpOw0KLSAgICAgICAgU2V0U2VsSXRlbShoU2VsLCBUUlVFKTsNCisgIH0NCisgIHJldHVybiAtMTsNCit9DQordm9pZCBDRldMX0NvbWJvTGlzdDo6Q2hhbmdlU2VsZWN0ZWQoaW50MzJfdCBpU2VsKSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGlTZWwpOw0KKyAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgIHJ0SW52YWxpZGF0ZS5SZXNldCgpOw0KKyAgRldMX0hMSVNUSVRFTSBoT2xkID0gR2V0U2VsSXRlbSgwKTsNCisgIGludDMyX3QgaU9sZCA9IHBEYXRhLT5HZXRJdGVtSW5kZXgobV9wSW50ZXJmYWNlLCBoT2xkKTsNCisgIGlmIChpT2xkID09IGlTZWwpIHsNCisgICAgcmV0dXJuOw0KKyAgfSBlbHNlIGlmIChpT2xkID4gLTEpIHsNCisgICAgR2V0SXRlbVJlY3QoaU9sZCwgcnRJbnZhbGlkYXRlKTsNCisgICAgU2V0U2VsSXRlbShoT2xkLCBGQUxTRSk7DQorICB9DQorICBpZiAoaEl0ZW0pIHsNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIEdldEl0ZW1SZWN0KGlTZWwsIHJlY3QpOw0KKyAgICBydEludmFsaWRhdGUuVW5pb24ocmVjdCk7DQorICAgIEZXTF9ITElTVElURU0gaFNlbCA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaVNlbCk7DQorICAgIFNldFNlbEl0ZW0oaFNlbCwgVFJVRSk7DQorICB9DQorICBpZiAoIXJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgUmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgIH0NCit9DQoraW50MzJfdCBDRldMX0NvbWJvTGlzdDo6Q291bnRJdGVtcygpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCAwKTsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgcmV0dXJuIHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0xpc3Q6OkdldEl0ZW1SZWN0KGludDMyX3QgbkluZGV4LCBDRlhfUmVjdEYmIHJ0SXRlbSkgew0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBuSW5kZXgpOw0KKyAgcERhdGEtPkdldEl0ZW1SZWN0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHJ0SXRlbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0xpc3Q6OkNsaWVudFRvT3V0ZXIoRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpIHsNCisgIGZ4ICs9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCwgZnkgKz0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3A7DQorICBJRldMX1dpZGdldCogcE93bmVyID0gR2V0T3duZXIoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE93bmVyKTsNCisgIHBPd25lci0+VHJhbnNmb3JtVG8obV9wT3V0ZXIsIGZ4LCBmeSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0xpc3Q6OlNldEZvY3VzKEZYX0JPT0wgYlNldCkgew0KKyAgQ0ZXTF9XaWRnZXRJbXA6OlNldEZvY3VzKGJTZXQpOw0KK30NCitDRldMX0NvbWJvTGlzdERlbGVnYXRlOjpDRldMX0NvbWJvTGlzdERlbGVnYXRlKENGV0xfQ29tYm9MaXN0KiBwT3duZXIpDQorICAgIDogQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGUocE93bmVyKSwgbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgRlhfQk9PTCBiYWNrRGVmYXVsdCA9IFRSVUU7DQorICBpZiAoZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyB8fA0KKyAgICAgIGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfS2lsbEZvY3VzKSB7DQorICAgIE9uRHJvcExpc3RGb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KKyAgfSBlbHNlIGlmIChkd0hhc2hDb2RlID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgIENGV0xfTXNnTW91c2UqIHBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgIGlmIChtX3BPd25lci0+SXNTaG93U2Nyb2xsQmFyKFRSVUUpICYmIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgICAgaWYgKHJlY3QuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIHBNc2ctPm1fZnggLT0gcmVjdC5sZWZ0Ow0KKyAgICAgICAgcE1zZy0+bV9meSAtPSByZWN0LnRvcDsNCisgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9DQorICAgICAgICAgICAgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXItPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgICAgcmV0dXJuIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKCFydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQotICAgICAgICBSZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQorICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCisgICAgICAgIGJhY2tEZWZhdWx0ID0gRkFMU0U7DQorICAgICAgICBPbkRyb3BMaXN0TW91c2VNb3ZlKHBNc2cpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICBiYWNrRGVmYXVsdCA9IEZBTFNFOw0KKyAgICAgICAgT25Ecm9wTGlzdExCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgYmFja0RlZmF1bHQgPSBGQUxTRTsNCisgICAgICAgIE9uRHJvcExpc3RMQnV0dG9uVXAocE1zZyk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZGVmYXVsdDoge30NCiAgICAgfQ0KLX0NCi1pbnQzMl90IENGV0xfQ29tYm9MaXN0OjpDb3VudEl0ZW1zKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCAwKTsNCi0gICAgSUZXTF9MaXN0Qm94RFAgKnBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgIHJldHVybiBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KLX0NCi12b2lkIENGV0xfQ29tYm9MaXN0OjpHZXRJdGVtUmVjdChpbnQzMl90IG5JbmRleCwgQ0ZYX1JlY3RGICZydEl0ZW0pDQotew0KLSAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgbkluZGV4KTsNCi0gICAgcERhdGEtPkdldEl0ZW1SZWN0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHJ0SXRlbSk7DQotfQ0KLXZvaWQgQ0ZXTF9Db21ib0xpc3Q6OkNsaWVudFRvT3V0ZXIoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQotew0KLSAgICBmeCArPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmxlZnQsIGZ5ICs9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wOw0KLSAgICBJRldMX1dpZGdldCAqcE93bmVyID0gR2V0T3duZXIoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwT3duZXIpOw0KLSAgICBwT3duZXItPlRyYW5zZm9ybVRvKG1fcE91dGVyLCBmeCwgZnkpOw0KLX0NCi12b2lkIENGV0xfQ29tYm9MaXN0OjpTZXRGb2N1cyhGWF9CT09MIGJTZXQpDQotew0KLSAgICBDRldMX1dpZGdldEltcDo6U2V0Rm9jdXMoYlNldCk7DQotfQ0KLUNGV0xfQ29tYm9MaXN0RGVsZWdhdGU6OkNGV0xfQ29tYm9MaXN0RGVsZWdhdGUoQ0ZXTF9Db21ib0xpc3QgKnBPd25lcikNCi0gICAgOiBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZShwT3duZXIpDQotICAgICwgbV9wT3duZXIocE93bmVyKQ0KLXsNCi19DQotaW50MzJfdCBDRldMX0NvbWJvTGlzdERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCi0gICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQotICAgIEZYX0JPT0wgYmFja0RlZmF1bHQgPSBUUlVFOw0KLSAgICBpZiAoZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyB8fCBkd0hhc2hDb2RlID09IEZXTF9NU0dIQVNIX0tpbGxGb2N1cykgew0KLSAgICAgICAgT25Ecm9wTGlzdEZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQotICAgIH0gZWxzZSBpZiAoZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9Nb3VzZSkgew0KLSAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCi0gICAgICAgIGlmIChtX3BPd25lci0+SXNTaG93U2Nyb2xsQmFyKFRSVUUpICYmIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyKSB7DQotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQotICAgICAgICAgICAgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocmVjdCk7DQotICAgICAgICAgICAgaWYgKHJlY3QuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgICAgICAgICAgcE1zZy0+bV9meCAtPSByZWN0LmxlZnQ7DQotICAgICAgICAgICAgICAgIHBNc2ctPm1fZnkgLT0gcmVjdC50b3A7DQotICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQotICAgICAgICBzd2l0Y2ggKGR3Q21kKSB7DQotICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQotICAgICAgICAgICAgICAgICAgICBiYWNrRGVmYXVsdCA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgT25Ecm9wTGlzdE1vdXNlTW92ZShwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCi0gICAgICAgICAgICAgICAgICAgIGJhY2tEZWZhdWx0ID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICBPbkRyb3BMaXN0TEJ1dHRvbkRvd24ocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KLSAgICAgICAgICAgICAgICAgICAgYmFja0RlZmF1bHQgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIE9uRHJvcExpc3RMQnV0dG9uVXAocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfS2V5KSB7DQotICAgICAgICBDRldMX01zZ0tleSAqcE1zZyA9IChDRldMX01zZ0tleSopcE1lc3NhZ2U7DQotICAgICAgICBiYWNrRGVmYXVsdCA9ICFPbkRyb3BMaXN0S2V5KHBNc2cpOw0KLSAgICB9DQotICAgIGlmICghYmFja0RlZmF1bHQpIHsNCi0gICAgICAgIHJldHVybiAxOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQotfQ0KLXZvaWQgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTo6T25Ecm9wTGlzdEZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCApDQotew0KLSAgICBpZiAoIWJTZXQpIHsNCi0gICAgICAgIENGV0xfTXNnS2lsbEZvY3VzICpwS2lsbCA9IChDRldMX01zZ0tpbGxGb2N1cyopcE1zZzsNCi0gICAgICAgIENGV0xfQ29tYm9Cb3hJbXAgKnBPdXRlciA9IChDRldMX0NvbWJvQm94SW1wKikoKChJRldMX1RhcmdldERhdGEqKW1fcE93bmVyLT5tX3BPdXRlciktPkdldERhdGEoKSk7DQotICAgICAgICBpZiAocEtpbGwtPm1fcFNldEZvY3VzID09IChJRldMX1dpZGdldCopbV9wT3duZXItPm1fcE91dGVyIHx8CShJRldMX1dpZGdldCopcEtpbGwtPm1fcFNldEZvY3VzID09IChJRldMX1dpZGdldCopcE91dGVyLT5tX3BFZGl0KSB7DQotICAgICAgICAgICAgcE91dGVyLT5TaG93RHJvcExpc3QoRkFMU0UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLWludDMyX3QgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTo6T25Ecm9wTGlzdE1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBpZiAobV9wT3duZXItPm1fYk5vdGlmeU93bmVyKSB7DQotICAgICAgICAgICAgbV9wT3duZXItPm1fYk5vdGlmeU93bmVyID0gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wT3duZXItPklzU2hvd1Njcm9sbEJhcihUUlVFKSAmJiBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhcikgew0KLSAgICAgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KLSAgICAgICAgICAgIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KLSAgICAgICAgICAgIGlmIChyZWN0LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBtX3BPd25lci0+R2V0SXRlbUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgICAgICBpZiAoaEl0ZW0pIHsNCi0gICAgICAgICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIsIDApOw0KLSAgICAgICAgICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgICAgICAgICBpbnQzMl90IGlTZWwgPSBwRGF0YS0+R2V0SXRlbUluZGV4KG1fcE93bmVyLT5tX3BJbnRlcmZhY2UsIGhJdGVtKTsNCi0gICAgICAgICAgICBDRldMX0V2dENtYkhvdmVyQ2hhbmdlZCBldmVudDsNCi0gICAgICAgICAgICBldmVudC5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wT3V0ZXI7DQotICAgICAgICAgICAgZXZlbnQubV9pQ3VySG92ZXIgPSBpU2VsOw0KLSAgICAgICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZldmVudCk7DQotICAgICAgICAgICAgbV9wT3duZXItPkNoYW5nZVNlbGVjdGVkKGlTZWwpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2JOb3RpZnlPd25lcikgew0KLSAgICAgICAgbV9wT3duZXItPkNsaWVudFRvT3V0ZXIocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgICAgICBDRldMX0NvbWJvQm94SW1wICpwT3V0ZXIgPSAoQ0ZXTF9Db21ib0JveEltcCopKCgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wT3V0ZXIpLT5HZXREYXRhKCkpOw0KLSAgICAgICAgcE91dGVyLT5tX3BEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCi0gICAgfQ0KKyAgfSBlbHNlIGlmIChkd0hhc2hDb2RlID09IEZXTF9NU0dIQVNIX0tleSkgew0KKyAgICBDRldMX01zZ0tleSogcE1zZyA9IChDRldMX01zZ0tleSopcE1lc3NhZ2U7DQorICAgIGJhY2tEZWZhdWx0ID0gIU9uRHJvcExpc3RLZXkocE1zZyk7DQorICB9DQorICBpZiAoIWJhY2tEZWZhdWx0KSB7DQogICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCiB9DQotaW50MzJfdCBDRldMX0NvbWJvTGlzdERlbGVnYXRlOjpPbkRyb3BMaXN0TEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIGlmIChtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQordm9pZCBDRldMX0NvbWJvTGlzdERlbGVnYXRlOjpPbkRyb3BMaXN0Rm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAoIWJTZXQpIHsNCisgICAgQ0ZXTF9Nc2dLaWxsRm9jdXMqIHBLaWxsID0gKENGV0xfTXNnS2lsbEZvY3VzKilwTXNnOw0KKyAgICBDRldMX0NvbWJvQm94SW1wKiBwT3V0ZXIgPQ0KKyAgICAgICAgKENGV0xfQ29tYm9Cb3hJbXAqKSgoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKS0+R2V0RGF0YSgpKTsNCisgICAgaWYgKHBLaWxsLT5tX3BTZXRGb2N1cyA9PSAoSUZXTF9XaWRnZXQqKW1fcE93bmVyLT5tX3BPdXRlciB8fA0KKyAgICAgICAgKElGV0xfV2lkZ2V0KilwS2lsbC0+bV9wU2V0Rm9jdXMgPT0gKElGV0xfV2lkZ2V0KilwT3V0ZXItPm1fcEVkaXQpIHsNCisgICAgICBwT3V0ZXItPlNob3dEcm9wTGlzdChGQUxTRSk7DQogICAgIH0NCi0gICAgQ0ZXTF9Db21ib0JveEltcCAqcE91dGVyID0gKENGV0xfQ29tYm9Cb3hJbXAqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wT3V0ZXIpLT5HZXREYXRhKCk7DQotICAgIHBPdXRlci0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCi0gICAgcmV0dXJuIDE7DQorICB9DQogfQ0KLWludDMyX3QgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTo6T25Ecm9wTGlzdExCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgQ0ZXTF9Db21ib0JveEltcCAqcE91dGVyID0gKENGV0xfQ29tYm9Cb3hJbXAqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wT3V0ZXIpLT5HZXREYXRhKCk7DQoraW50MzJfdCBDRldMX0NvbWJvTGlzdERlbGVnYXRlOjpPbkRyb3BMaXN0TW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KICAgICBpZiAobV9wT3duZXItPm1fYk5vdGlmeU93bmVyKSB7DQotICAgICAgICBtX3BPd25lci0+Q2xpZW50VG9PdXRlcihwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgICAgIHBPdXRlci0+bV9wRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1zZyk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAobV9wT3duZXItPklzU2hvd1Njcm9sbEJhcihUUlVFKSAmJiBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhcikgew0KLSAgICAgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KLSAgICAgICAgICAgIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KLSAgICAgICAgICAgIGlmIChyZWN0LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHBPdXRlci0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCi0gICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBtX3BPd25lci0+R2V0SXRlbUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgICAgICBpZiAoaEl0ZW0pIHsNCi0gICAgICAgICAgICBwT3V0ZXItPlByb2Nlc3NTZWxDaGFuZ2VkKFRSVUUpOw0KLSAgICAgICAgfQ0KKyAgICAgIG1fcE93bmVyLT5tX2JOb3RpZnlPd25lciA9IEZBTFNFOw0KICAgICB9DQotICAgIHJldHVybiAxOw0KLX0NCi1pbnQzMl90IENGV0xfQ29tYm9MaXN0RGVsZWdhdGU6Ok9uRHJvcExpc3RLZXkoQ0ZXTF9Nc2dLZXkgKnBLZXkpDQotew0KLSAgICBDRldMX0NvbWJvQm94SW1wICpwT3V0ZXIgPSAoQ0ZXTF9Db21ib0JveEltcCopKChJRldMX1RhcmdldERhdGEqKW1fcE93bmVyLT5tX3BPdXRlciktPkdldERhdGEoKTsNCi0gICAgRlhfQk9PTCBiUHJvcGFnYXRlID0gRkFMU0U7DQotICAgIGlmIChwS2V5LT5tX2R3Q21kID09IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KLSAgICAgICAgRlhfRFdPUkQgZHdLZXlDb2RlID0gcEtleS0+bV9kd0tleUNvZGU7DQotICAgICAgICBzd2l0Y2ggKGR3S2V5Q29kZSkgew0KLSAgICAgICAgICAgIGNhc2UgRldMX1ZLRVlfUmV0dXJuOg0KLSAgICAgICAgICAgIGNhc2UgRldMX1ZLRVlfRXNjYXBlOiB7DQotICAgICAgICAgICAgICAgICAgICBwT3V0ZXItPlNob3dEcm9wTGlzdChGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRldMX1ZLRVlfVXA6DQotICAgICAgICAgICAgY2FzZSBGV0xfVktFWV9Eb3duOiB7DQotICAgICAgICAgICAgICAgICAgICBPbkRyb3BMaXN0S2V5RG93bihwS2V5KTsNCi0gICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IHBPdXRlci0+U2V0RGVsZWdhdGUoTlVMTCk7DQotICAgICAgICAgICAgICAgICAgICBwT3V0ZXItPlByb2Nlc3NTZWxDaGFuZ2VkKEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICAgICAgYlByb3BhZ2F0ZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChwS2V5LT5tX2R3Q21kID09IEZXTF9NU0dLRVlDTURfQ2hhcikgew0KLSAgICAgICAgYlByb3BhZ2F0ZSA9IFRSVUU7DQotICAgIH0NCi0gICAgaWYgKGJQcm9wYWdhdGUpIHsNCi0gICAgICAgIHBLZXktPm1fcERzdFRhcmdldCA9IChJRldMX1dpZGdldCopbV9wT3duZXItPm1fcE91dGVyOw0KLSAgICAgICAgcE91dGVyLT5tX3BEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwS2V5KTsNCisgICAgaWYgKG1fcE93bmVyLT5Jc1Nob3dTY3JvbGxCYXIoVFJVRSkgJiYgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgICBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICBpZiAocmVjdC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfQ0KICAgICB9DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBtX3BPd25lci0+R2V0SXRlbUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgIGlmIChoSXRlbSkgew0KKyAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgMCk7DQorICAgICAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0NCisgICAgICAgICAgKElGV0xfTGlzdEJveERQKiltX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgIGludDMyX3QgaVNlbCA9IHBEYXRhLT5HZXRJdGVtSW5kZXgobV9wT3duZXItPm1fcEludGVyZmFjZSwgaEl0ZW0pOw0KKyAgICAgIENGV0xfRXZ0Q21iSG92ZXJDaGFuZ2VkIGV2ZW50Ow0KKyAgICAgIGV2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BPdXRlcjsNCisgICAgICBldmVudC5tX2lDdXJIb3ZlciA9IGlTZWw7DQorICAgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJmV2ZW50KTsNCisgICAgICBtX3BPd25lci0+Q2hhbmdlU2VsZWN0ZWQoaVNlbCk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fYk5vdGlmeU93bmVyKSB7DQorICAgIG1fcE93bmVyLT5DbGllbnRUb091dGVyKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBDRldMX0NvbWJvQm94SW1wKiBwT3V0ZXIgPQ0KKyAgICAgICAgKENGV0xfQ29tYm9Cb3hJbXAqKSgoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKS0+R2V0RGF0YSgpKTsNCisgICAgcE91dGVyLT5tX3BEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCisgIH0NCisgIHJldHVybiAxOw0KK30NCitpbnQzMl90IENGV0xfQ29tYm9MaXN0RGVsZWdhdGU6Ok9uRHJvcExpc3RMQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCiAgICAgcmV0dXJuIDA7DQorICB9DQorICBDRldMX0NvbWJvQm94SW1wKiBwT3V0ZXIgPQ0KKyAgICAgIChDRldMX0NvbWJvQm94SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKS0+R2V0RGF0YSgpOw0KKyAgcE91dGVyLT5TaG93RHJvcExpc3QoRkFMU0UpOw0KKyAgcmV0dXJuIDE7DQogfQ0KLXZvaWQgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTo6T25Ecm9wTGlzdEtleURvd24oQ0ZXTF9Nc2dLZXkgKnBLZXkpDQotew0KK2ludDMyX3QgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTo6T25Ecm9wTGlzdExCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBDRldMX0NvbWJvQm94SW1wKiBwT3V0ZXIgPQ0KKyAgICAgIChDRldMX0NvbWJvQm94SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKS0+R2V0RGF0YSgpOw0KKyAgaWYgKG1fcE93bmVyLT5tX2JOb3RpZnlPd25lcikgew0KKyAgICBtX3BPd25lci0+Q2xpZW50VG9PdXRlcihwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgcE91dGVyLT5tX3BEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX3BPd25lci0+SXNTaG93U2Nyb2xsQmFyKFRSVUUpICYmIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgICAgaWYgKHJlY3QuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBwT3V0ZXItPlNob3dEcm9wTGlzdChGQUxTRSk7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBtX3BPd25lci0+R2V0SXRlbUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgIGlmIChoSXRlbSkgew0KKyAgICAgIHBPdXRlci0+UHJvY2Vzc1NlbENoYW5nZWQoVFJVRSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAxOw0KK30NCitpbnQzMl90IENGV0xfQ29tYm9MaXN0RGVsZWdhdGU6Ok9uRHJvcExpc3RLZXkoQ0ZXTF9Nc2dLZXkqIHBLZXkpIHsNCisgIENGV0xfQ29tYm9Cb3hJbXAqIHBPdXRlciA9DQorICAgICAgKENGV0xfQ29tYm9Cb3hJbXAqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wT3V0ZXIpLT5HZXREYXRhKCk7DQorICBGWF9CT09MIGJQcm9wYWdhdGUgPSBGQUxTRTsNCisgIGlmIChwS2V5LT5tX2R3Q21kID09IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KICAgICBGWF9EV09SRCBkd0tleUNvZGUgPSBwS2V5LT5tX2R3S2V5Q29kZTsNCi0gICAgc3dpdGNoKGR3S2V5Q29kZSkgew0KLSAgICAgICAgY2FzZSBGV0xfVktFWV9VcDoNCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfRG93bjoNCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfSG9tZToNCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfRW5kOiB7DQotICAgICAgICAgICAgICAgIENGV0xfQ29tYm9Cb3hJbXAgKnBPdXRlciA9IChDRldMX0NvbWJvQm94SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKS0+R2V0RGF0YSgpOw0KLSAgICAgICAgICAgICAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BPd25lci0+bV9wSW50ZXJmYWNlLCBwT3V0ZXItPm1faUN1clNlbCk7DQotICAgICAgICAgICAgICAgIGhJdGVtID0gbV9wT3duZXItPkdldEl0ZW0oaEl0ZW0sIGR3S2V5Q29kZSk7DQotICAgICAgICAgICAgICAgIGlmICghaEl0ZW0pIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb24oaEl0ZW0sIGhJdGVtLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPlNjcm9sbFRvVmlzaWJsZShoSXRlbSk7DQotICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQotICAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgfQ0KKyAgICBzd2l0Y2ggKGR3S2V5Q29kZSkgew0KKyAgICAgIGNhc2UgRldMX1ZLRVlfUmV0dXJuOg0KKyAgICAgIGNhc2UgRldMX1ZLRVlfRXNjYXBlOiB7DQorICAgICAgICBwT3V0ZXItPlNob3dEcm9wTGlzdChGQUxTRSk7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfVktFWV9VcDoNCisgICAgICBjYXNlIEZXTF9WS0VZX0Rvd246IHsNCisgICAgICAgIE9uRHJvcExpc3RLZXlEb3duKHBLZXkpOw0KKyAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gcE91dGVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICAgIHBPdXRlci0+UHJvY2Vzc1NlbENoYW5nZWQoRkFMU0UpOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfQ0KKyAgICAgIGRlZmF1bHQ6IHsgYlByb3BhZ2F0ZSA9IFRSVUU7IH0NCiAgICAgfQ0KKyAgfSBlbHNlIGlmIChwS2V5LT5tX2R3Q21kID09IEZXTF9NU0dLRVlDTURfQ2hhcikgew0KKyAgICBiUHJvcGFnYXRlID0gVFJVRTsNCisgIH0NCisgIGlmIChiUHJvcGFnYXRlKSB7DQorICAgIHBLZXktPm1fcERzdFRhcmdldCA9IChJRldMX1dpZGdldCopbV9wT3duZXItPm1fcE91dGVyOw0KKyAgICBwT3V0ZXItPm1fcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBLZXkpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIHJldHVybiAwOw0KIH0NCi1DRldMX0NvbWJvQm94SW1wOjpDRldMX0NvbWJvQm94SW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLSAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlcikNCi0gICAgLCBtX3BFZGl0KE5VTEwpDQotICAgICwgbV9wTGlzdEJveChOVUxMKQ0KLSAgICAsIG1fcEZvcm0oTlVMTCkNCi0gICAgLCBtX2JMQnV0dG9uRG93bihGQUxTRSkNCi0gICAgLCBtX2lDdXJTZWwoLTEpDQotICAgICwgbV9pQnRuU3RhdGUoRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsKQ0KLSAgICAsIG1fZkNvbWJvRm9ybUhhbmRsZXIoMCkNCi0gICAgLCBtX2JOZWVkU2hvd0xpc3QoRkFMU0UpDQotew0KLSAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQotICAgIG1fcnRCdG4uUmVzZXQoKTsNCi0gICAgbV9ydEhhbmRsZXIuUmVzZXQoKTsNCi19DQotQ0ZXTF9Db21ib0JveEltcDo6Q0ZXTF9Db21ib0JveEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLSAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCi0gICAgLCBtX3BFZGl0KE5VTEwpDQotICAgICwgbV9wTGlzdEJveChOVUxMKQ0KLSAgICAsIG1fcEZvcm0oTlVMTCkNCi0gICAgLCBtX2JMQnV0dG9uRG93bihGQUxTRSkNCi0gICAgLCBtX2lDdXJTZWwoLTEpDQotICAgICwgbV9pQnRuU3RhdGUoRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsKQ0KLSAgICAsIG1fZkNvbWJvRm9ybUhhbmRsZXIoMCkNCi0gICAgLCBtX2JOZWVkU2hvd0xpc3QoRkFMU0UpDQotew0KLSAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQotICAgIG1fcnRCdG4uUmVzZXQoKTsNCi0gICAgbV9ydEhhbmRsZXIuUmVzZXQoKTsNCi19DQotQ0ZXTF9Db21ib0JveEltcDo6fkNGV0xfQ29tYm9Cb3hJbXAoKQ0KLXsNCi0gICAgaWYgKG1fcEVkaXQpIHsNCi0gICAgICAgIG1fcEVkaXQtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcEVkaXQgPSBOVUxMOw0KK3ZvaWQgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTo6T25Ecm9wTGlzdEtleURvd24oQ0ZXTF9Nc2dLZXkqIHBLZXkpIHsNCisgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBLZXktPm1fZHdLZXlDb2RlOw0KKyAgc3dpdGNoIChkd0tleUNvZGUpIHsNCisgICAgY2FzZSBGV0xfVktFWV9VcDoNCisgICAgY2FzZSBGV0xfVktFWV9Eb3duOg0KKyAgICBjYXNlIEZXTF9WS0VZX0hvbWU6DQorICAgIGNhc2UgRldMX1ZLRVlfRW5kOiB7DQorICAgICAgQ0ZXTF9Db21ib0JveEltcCogcE91dGVyID0NCisgICAgICAgICAgKENGV0xfQ29tYm9Cb3hJbXAqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wT3V0ZXIpLT5HZXREYXRhKCk7DQorICAgICAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0NCisgICAgICAgICAgKElGV0xfTGlzdEJveERQKiltX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPQ0KKyAgICAgICAgICBwRGF0YS0+R2V0SXRlbShtX3BPd25lci0+bV9wSW50ZXJmYWNlLCBwT3V0ZXItPm1faUN1clNlbCk7DQorICAgICAgaEl0ZW0gPSBtX3BPd25lci0+R2V0SXRlbShoSXRlbSwgZHdLZXlDb2RlKTsNCisgICAgICBpZiAoIWhJdGVtKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbihoSXRlbSwgaEl0ZW0sIFRSVUUpOw0KKyAgICAgIG1fcE93bmVyLT5TY3JvbGxUb1Zpc2libGUoaEl0ZW0pOw0KKyAgICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICAgICAgcnRJbnZhbGlkYXRlLlNldCgwLCAwLCBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQorICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKG1fcExpc3RCb3gpIHsNCi0gICAgICAgIG1fcExpc3RCb3gtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcExpc3RCb3ggPSBOVUxMOw0KLSAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQogfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgd3NDbGFzcyA9IEZXTF9DTEFTU19Db21ib0JveDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0NGV0xfQ29tYm9Cb3hJbXA6OkNGV0xfQ29tYm9Cb3hJbXAoSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwT3V0ZXIpLA0KKyAgICAgIG1fcEVkaXQoTlVMTCksDQorICAgICAgbV9wTGlzdEJveChOVUxMKSwNCisgICAgICBtX3BGb3JtKE5VTEwpLA0KKyAgICAgIG1fYkxCdXR0b25Eb3duKEZBTFNFKSwNCisgICAgICBtX2lDdXJTZWwoLTEpLA0KKyAgICAgIG1faUJ0blN0YXRlKEZXTF9QQVJUU1RBVEVfQ01CX05vcm1hbCksDQorICAgICAgbV9mQ29tYm9Gb3JtSGFuZGxlcigwKSwNCisgICAgICBtX2JOZWVkU2hvd0xpc3QoRkFMU0UpIHsNCisgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgIG1fcnRCdG4uUmVzZXQoKTsNCisgIG1fcnRIYW5kbGVyLlJlc2V0KCk7DQogfQ0KLUZYX0RXT1JEIENGV0xfQ29tYm9Cb3hJbXA6OkdldENsYXNzSUQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfQ29tYm9Cb3g7DQorQ0ZXTF9Db21ib0JveEltcDo6Q0ZXTF9Db21ib0JveEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlciksDQorICAgICAgbV9wRWRpdChOVUxMKSwNCisgICAgICBtX3BMaXN0Qm94KE5VTEwpLA0KKyAgICAgIG1fcEZvcm0oTlVMTCksDQorICAgICAgbV9iTEJ1dHRvbkRvd24oRkFMU0UpLA0KKyAgICAgIG1faUN1clNlbCgtMSksDQorICAgICAgbV9pQnRuU3RhdGUoRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsKSwNCisgICAgICBtX2ZDb21ib0Zvcm1IYW5kbGVyKDApLA0KKyAgICAgIG1fYk5lZWRTaG93TGlzdChGQUxTRSkgew0KKyAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgbV9ydEJ0bi5SZXNldCgpOw0KKyAgbV9ydEhhbmRsZXIuUmVzZXQoKTsNCiB9DQotRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpJbml0aWFsaXplKCkNCi17DQotICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIHJldHVybiBEaXNGb3JtX0luaXRpYWxpemUoKTsNCi0gICAgfQ0KLSAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKTsNCi0gICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZSh0aGlzKTsNCi0gICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQotICAgIHByb3AubV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgIHByb3AubV9kd1N0eWxlcyB8PSBGV0xfV0dUU1RZTEVfQm9yZGVyIHwgRldMX1dHVFNUWUxFX1ZTY3JvbGw7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUljb25UZXh0KSB7DQotICAgICAgICBwcm9wLm1fZHdTdHlsZUV4ZXMgfD0gRldMX1NUWUxFRVhUX0xUQl9JY29uOw0KLSAgICB9DQotICAgIHByb3AubV9wRGF0YVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBDRldMX0NvbWJvTGlzdCAqcExpc3QgPSBGWF9ORVcgQ0ZXTF9Db21ib0xpc3QocHJvcCwgbV9wSW50ZXJmYWNlKTsNCi0gICAgbV9wTGlzdEJveCA9IElGV0xfTGlzdEJveDo6Q3JlYXRlKCk7DQotICAgIHBMaXN0LT5TZXRJbnRlcmZhY2UobV9wTGlzdEJveCk7DQotICAgICgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+U2V0RGF0YShwTGlzdCk7DQotICAgIHBMaXN0LT5Jbml0aWFsaXplKCk7DQotICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd24pICYmICFtX3BFZGl0KSB7DQotICAgICAgICBDRldMX0NvbWJvRWRpdCAqcEVkaXQgPSBGWF9ORVcgQ0ZXTF9Db21ib0VkaXQobV9wSW50ZXJmYWNlKTsNCi0gICAgICAgIG1fcEVkaXQgPSBJRldMX0VkaXQ6OkNyZWF0ZSgpOw0KLSAgICAgICAgcEVkaXQtPlNldEludGVyZmFjZShtX3BFZGl0KTsNCi0gICAgICAgICgoSUZXTF9UYXJnZXREYXRhKiltX3BFZGl0KS0+U2V0RGF0YShwRWRpdCk7DQotICAgICAgICBwRWRpdC0+SW5pdGlhbGl6ZSgpOw0KLSAgICAgICAgcEVkaXQtPlNldE91dGVyKG1fcEludGVyZmFjZSk7DQotICAgIH0NCi0gICAgaWYgKG1fcEVkaXQpIHsNCi0gICAgICAgIG1fcEVkaXQtPlNldFBhcmVudChtX3BJbnRlcmZhY2UpOw0KLSAgICB9DQotICAgIFNldFN0YXRlcyhtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0NGV0xfQ29tYm9Cb3hJbXA6On5DRldMX0NvbWJvQm94SW1wKCkgew0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgbV9wRWRpdC0+UmVsZWFzZSgpOw0KKyAgICBtX3BFZGl0ID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BMaXN0Qm94KSB7DQorICAgIG1fcExpc3RCb3gtPlJlbGVhc2UoKTsNCisgICAgbV9wTGlzdEJveCA9IE5VTEw7DQorICB9DQogfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6RmluYWxpemUoKQ0KLXsNCi0gICAgaWYgKG1fcEVkaXQpIHsNCi0gICAgICAgIG1fcEVkaXQtPkZpbmFsaXplKCk7DQotICAgIH0NCi0gICAgbV9wTGlzdEJveC0+RmluYWxpemUoKTsNCi0gICAgaWYgKCBtX3BEZWxlZ2F0ZSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0NvbWJvQm94SW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KLSAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19Db21ib0JveDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgKQ0KLXsNCi0gICAgaWYgKGJBdXRvU2l6ZSkgew0KLSAgICAgICAgcmVjdC5SZXNldCgpOw0KLSAgICAgICAgRlhfQk9PTCBiSXNEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOw0KLSAgICAgICAgaWYgKGJJc0Ryb3BEb3duICYmIG1fcEVkaXQpIHsNCi0gICAgICAgICAgICBtX3BFZGl0LT5HZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZWN0LndpZHRoID0gMTAwOw0KLSAgICAgICAgICAgIHJlY3QuaGVpZ2h0ID0gMTY7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCi0gICAgICAgICAgICBSZVNldFRoZW1lKCk7DQotICAgICAgICB9DQotICAgICAgICBGWF9GTE9BVCAqcEZXaWR0aCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KLSAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRldpZHRoLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICAgICAgcmVjdC5JbmZsYXRlKDAsIDAsICpwRldpZHRoLCAwKTsNCi0gICAgICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZYX0RXT1JEIENGV0xfQ29tYm9Cb3hJbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0NMQVNTSEFTSF9Db21ib0JveDsNCiB9DQotRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKQ0KLXsNCi0gICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIERpc0Zvcm1fTW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiQWRkRHJvcERvd24gPSBkd1N0eWxlc0V4QWRkZWQgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KLSAgICBGWF9CT09MIGJSZW1vdmVEcm9wRG93biA9IGR3U3R5bGVzRXhSZW1vdmVkICYgRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsNCi0gICAgaWYgKGJBZGREcm9wRG93biAmJiAhbV9wRWRpdCkgew0KLSAgICAgICAgQ0ZXTF9Db21ib0VkaXQgKnBFZGl0ID0gRlhfTkVXIENGV0xfQ29tYm9FZGl0KG1fcEludGVyZmFjZSk7DQotICAgICAgICBtX3BFZGl0ID0gSUZXTF9FZGl0OjpDcmVhdGUoKTsNCi0gICAgICAgIHBFZGl0LT5TZXRJbnRlcmZhY2UobV9wRWRpdCk7DQotICAgICAgICAoKElGV0xfVGFyZ2V0RGF0YSopbV9wRWRpdCktPlNldERhdGEocEVkaXQpOw0KLSAgICAgICAgcEVkaXQtPkluaXRpYWxpemUoKTsNCi0gICAgICAgIHBFZGl0LT5TZXRPdXRlcihtX3BJbnRlcmZhY2UpOw0KLSAgICAgICAgbV9wRWRpdC0+U2V0UGFyZW50KG1fcEludGVyZmFjZSk7DQotICAgIH0gZWxzZSBpZiAoYlJlbW92ZURyb3BEb3duICYmIG1fcEVkaXQpIHsNCi0gICAgICAgIG1fcEVkaXQtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6Ok1vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlVwZGF0ZSgpDQotew0KLSAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQotICAgICAgICByZXR1cm4gRGlzRm9ybV9VcGRhdGUoKTsNCi0gICAgfQ0KLSAgICBpZiAoSXNMb2NrZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCi0gICAgfQ0KLSAgICBSZVNldFRoZW1lKCk7DQotICAgIEZYX0JPT0wgYkRyb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQotICAgIGlmIChiRHJvcERvd24gJiYgbV9wRWRpdCkgew0KLSAgICAgICAgUmVTZXRFZGl0QWxpZ25tZW50KCk7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPT0gTlVMTCkgew0KLSAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgIH0NCi0gICAgTGF5b3V0KCk7DQotICAgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7DQotICAgIHBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBtX2ZDb21ib0Zvcm1IYW5kbGVyID0gKihGWF9GTE9BVCAqKSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0NNQl9Db21ib0Zvcm1IYW5kbGVyKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9EV09SRCBDRldMX0NvbWJvQm94SW1wOjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIHJldHVybiBEaXNGb3JtX0hpdFRlc3QoZngsIGZ5KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkhpdFRlc3QoZngsIGZ5KTsNCi19DQotRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIHJldHVybiBEaXNGb3JtX0RyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgIEZYX0JPT0wgYklzRHJvcERvd24gPSBJc0Ryb3BEb3duU3R5bGUoKTsNCi0gICAgaWYgKEhhc0JvcmRlcigpKSB7DQotICAgICAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgRldMX1BBUlRfQ01CX0JvcmRlciwgcFRoZW1lLCBwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBpZiAoSGFzRWRnZSgpKSB7DQotICAgICAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX0NNQl9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIGlmICghYklzRHJvcERvd24pIHsNCi0gICAgICAgIENGWF9SZWN0RiBydFRleHRCayhtX3J0Q2xpZW50KTsNCi0gICAgICAgIHJ0VGV4dEJrLndpZHRoIC09IG1fcnRCdG4ud2lkdGg7DQotICAgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCi0gICAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DTUJfQmFja2dyb3VuZDsNCi0gICAgICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICAgICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBydFRleHRCazsNCi0gICAgICAgIGlmIChtX2lDdXJTZWwgPj0gMCkgew0KLSAgICAgICAgICAgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgICAgICAgICAgdm9pZCogcCA9IHBEYXRhLT5HZXRJdGVtRGF0YShtX3BMaXN0Qm94LCBwRGF0YS0+R2V0SXRlbShtX3BMaXN0Qm94LCBtX2lDdXJTZWwpKTsNCi0gICAgICAgICAgICBpZiAocCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIHBhcmFtLm1fcERhdGEgPSBwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSB7DQotICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfQ01CX0Rpc2FibGVkOw0KLSAgICAgICAgfSBlbHNlIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSAmJiAobV9pQ3VyU2VsID49IDApKSB7DQotICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfQ01CX1NlbGVjdGVkOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KLSAgICAgICAgaWYgKG1faUN1clNlbCA+PSAwKSB7DQotICAgICAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BMaXN0Qm94LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgICAgICAgICBJRldMX0NvbWJvQm94RFAgKnBEYXRhID0gKElGV0xfQ29tYm9Cb3hEUCAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBtX2lDdXJTZWwpOw0KLSAgICAgICAgICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKS0+R2V0SXRlbVRleHQoaEl0ZW0sIHdzVGV4dCk7DQotICAgICAgICAgICAgQ0ZXTF9UaGVtZVRleHQgcGFyYW07DQotICAgICAgICAgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICAgICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DTUJfQ2FwdGlvbjsNCi0gICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gbV9pQnRuU3RhdGU7DQotICAgICAgICAgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgICAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgICAgICAgICBwYXJhbS5tX3J0UGFydCA9IHJ0VGV4dEJrOw0KLSAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA/IEZXTF9QQVJUU1RBVEVfQ01CX1NlbGVjdGVkIDogRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KLSAgICAgICAgICAgIHBhcmFtLm1fd3NUZXh0ID0gd3NUZXh0Ow0KLSAgICAgICAgICAgIHBhcmFtLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCi0gICAgICAgICAgICBwYXJhbS5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCi0gICAgICAgICAgICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgew0KLSAgICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQotICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfQ01CX0Ryb3BEb3duQnV0dG9uOw0KLSAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA/IEZXTF9QQVJUU1RBVEVfQ01CX0Rpc2FibGVkIDogbV9pQnRuU3RhdGU7DQotICAgICAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRCdG47DQotICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWVQcm92aWRlcikNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBwVGhlbWVQcm92aWRlcjsNCi0gICAgaWYgKG1fcExpc3RCb3ggJiYgcFRoZW1lUHJvdmlkZXItPklzVmFsaWRXaWRnZXQobV9wTGlzdEJveCkpIHsNCi0gICAgICAgIG1fcExpc3RCb3gtPlNldFRoZW1lUHJvdmlkZXIocFRoZW1lUHJvdmlkZXIpOw0KLSAgICB9DQotICAgIGlmIChtX3BFZGl0ICYmIHBUaGVtZVByb3ZpZGVyLT5Jc1ZhbGlkV2lkZ2V0KG1fcEVkaXQpKSB7DQotICAgICAgICBtX3BFZGl0LT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLWludDMyX3QgQ0ZXTF9Db21ib0JveEltcDo6R2V0Q3VyU2VsKCkNCi17DQotICAgIHJldHVybiBtX2lDdXJTZWw7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6U2V0Q3VyU2VsKGludDMyX3QgaVNlbCkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5Db3VudEl0ZW1zKCk7DQotICAgIEZYX0JPT0wgYkNsZWFyU2VsID0gaVNlbCA8IDAgfHwgaVNlbCA+PSBpQ291bnQ7DQotICAgIEZYX0JPT0wgYkRyb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQotICAgIGlmIChiRHJvcERvd24gJiYgbV9wRWRpdCkgew0KLSAgICAgICAgaWYgKGJDbGVhclNlbCkgew0KLSAgICAgICAgICAgIG1fcEVkaXQtPlNldFRleHQoQ0ZYX1dpZGVTdHJpbmcoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgICAgICAgICBJRldMX0NvbWJvQm94RFAgKnBEYXRhID0gKElGV0xfQ29tYm9Cb3hEUCAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpU2VsKTsNCi0gICAgICAgICAgICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSktPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KLSAgICAgICAgICAgIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KLSAgICB9DQotICAgIG1faUN1clNlbCA9IGJDbGVhclNlbCA/IC0xIDogaVNlbDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ICkNCi17DQotICAgIEZYX0JPT0wgYklzRHJvcERvd24gPSBJc0Ryb3BEb3duU3R5bGUoKTsNCi0gICAgaWYgKGJJc0Ryb3BEb3duICYmIG1fcEVkaXQpIHsNCi0gICAgICAgIG1fcEVkaXQtPlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQotICAgIH0NCi0gICAgaWYgKG1fcExpc3RCb3gpIHsNCi0gICAgICAgIG1fcExpc3RCb3gtPlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpTZXRTdGF0ZXMoZHdTdGF0ZXMsIGJTZXQpOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkaXQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPlVwZGF0ZSgpOw0KLX0NCi1pbnQzMl90IENGV0xfQ29tYm9Cb3hJbXA6OkdldEVkaXRUZXh0TGVuZ3RoKCkgY29uc3QNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgLTEpOw0KLSAgICByZXR1cm4gbV9wRWRpdC0+R2V0VGV4dExlbmd0aCgpOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgblN0YXJ0ICwgaW50MzJfdCBuQ291bnQgKSBjb25zdA0KLXsNCi0gICAgaWYgKG1fcEVkaXQpIHsNCi0gICAgICAgIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KLSAgICB9IGVsc2UgaWYgKG1fcExpc3RCb3gpIHsNCi0gICAgICAgIElGV0xfQ29tYm9Cb3hEUCAqcERhdGEgPSAoSUZXTF9Db21ib0JveERQICopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgbV9pQ3VyU2VsKTsNCi0gICAgICAgIHJldHVybiBtX3BMaXN0Qm94LT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEVkaXRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZGl0LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICAoKENGV0xfQ29tYm9FZGl0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wRWRpdCktPkdldERhdGEoKSktPkNsZWFyU2VsZWN0ZWQoKTsNCi0gICAgbV9wRWRpdC0+QWRkU2VsUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLWludDMyX3QgQ0ZXTF9Db21ib0JveEltcDo6R2V0RWRpdFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkaXQsIC0xKTsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPkdldFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCi19DQotaW50MzJfdCBDRldMX0NvbWJvQm94SW1wOjpHZXRFZGl0TGltaXQoKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZGl0LCAtMSk7DQotICAgIHJldHVybiBtX3BFZGl0LT5HZXRMaW1pdCgpOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPlNldExpbWl0KG5MaW1pdCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6RWRpdERvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPkRvQ2xpcGJvYXJkKGlDbWQpOw0KLX0NCi1GWF9CT09MCUNGV0xfQ29tYm9Cb3hJbXA6OkVkaXRSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkaXQsIEZBTFNFKTsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPlJlZG8oYnNSZWNvcmQpOw0KLX0NCi1GWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXRVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkaXQsIEZBTFNFKTsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPlVuZG8oYnNSZWNvcmQpOw0KLX0NCi1JRldMX0xpc3RCb3gqIENGV0xfQ29tYm9Cb3hJbXA6OkdldExpc3RCb3h0KCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wTGlzdEJveCwgRkFMU0UpOw0KLSAgICByZXR1cm4gbV9wTGlzdEJveDsNCi19DQotRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpBZnRlckZvY3VzU2hvd0Ryb3BMaXN0KCkNCi17DQotICAgIGlmICghbV9iTmVlZFNob3dMaXN0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG1fcEVkaXQpIHsNCi0gICAgICAgIE1hdGNoRWRpdFRleHQoKTsNCi0gICAgfQ0KLSAgICBTaG93RHJvcExpc3QoVFJVRSk7DQotICAgIG1fYk5lZWRTaG93TGlzdCA9IEZBTFNFOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfRVJSIENGV0xfQ29tYm9Cb3hJbXA6Ok9wZW5Ecm9wRG93bkxpc3QoRlhfQk9PTCBiQWN0aXZhdGUpDQotew0KLSAgICBTaG93RHJvcExpc3QoYkFjdGl2YXRlKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9CT09MCUNGV0xfQ29tYm9Cb3hJbXA6OkVkaXRDYW5VbmRvKCkNCi17DQotICAgIHJldHVybiBtX3BFZGl0LT5DYW5VbmRvKCk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Db21ib0JveEltcDo6RWRpdENhblJlZG8oKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPkNhblJlZG8oKTsNCi19DQotRlhfQk9PTAlDRldMX0NvbWJvQm94SW1wOjpFZGl0VW5kbygpDQotew0KLSAgICByZXR1cm4gbV9wRWRpdC0+VW5kbygpOw0KLX0NCi1GWF9CT09MCUNGV0xfQ29tYm9Cb3hJbXA6OkVkaXRSZWRvKCkNCi17DQotICAgIHJldHVybiBtX3BFZGl0LT5SZWRvKCk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Db21ib0JveEltcDo6RWRpdENhbkNvcHkoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPkNvdW50U2VsUmFuZ2VzKCkgPiAwOw0KLX0NCi1GWF9CT09MCUNGV0xfQ29tYm9Cb3hJbXA6OkVkaXRDYW5DdXQoKQ0KLXsNCi0gICAgaWYgKG1fcEVkaXQtPkdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcEVkaXQtPkNvdW50U2VsUmFuZ2VzKCkgPiAwOw0KLX0NCi1GWF9CT09MCUNGV0xfQ29tYm9Cb3hJbXA6OkVkaXRDYW5TZWxlY3RBbGwoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHRMZW5ndGgoKSA+IDA7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Db21ib0JveEltcDo6RWRpdENvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSkNCi17DQotICAgIHJldHVybiBtX3BFZGl0LT5Db3B5KHdzQ29weSk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Db21ib0JveEltcDo6RWRpdEN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpDQotew0KLSAgICByZXR1cm4gbV9wRWRpdC0+Q3V0KHdzQ3V0KTsNCi19DQotRlhfQk9PTAlDRldMX0NvbWJvQm94SW1wOjpFZGl0UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpDQotew0KLSAgICByZXR1cm4gbV9wRWRpdC0+UGFzdGUod3NQYXN0ZSk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Db21ib0JveEltcDo6RWRpdFNlbGVjdEFsbCgpDQotew0KLSAgICByZXR1cm4gKG1fcEVkaXQtPkFkZFNlbFJhbmdlKDApID09IEZXTF9FUlJfU3VjY2VlZGVkKSA/IFRSVUUgOiBGQUxTRTsNCi19DQotRlhfQk9PTAlDRldMX0NvbWJvQm94SW1wOjpFZGl0RGVsZXRlKCkNCi17DQotICAgIHJldHVybiAobV9wRWRpdC0+Q2xlYXJUZXh0KCkgPT0gRldMX0VSUl9TdWNjZWVkZWQpID8gVFJVRSA6IEZBTFNFOw0KLX0NCi1GWF9CT09MCUNGV0xfQ29tYm9Cb3hJbXA6OkVkaXREZVNlbGVjdCgpDQotew0KLSAgICByZXR1cm4gKG1fcEVkaXQtPkNsZWFyU2VsZWN0aW9ucygpID09IEZXTF9FUlJfU3VjY2VlZGVkKSA/IFRSVUUgOiBGQUxTRTsNCi19DQotRldMX0VSUglDRldMX0NvbWJvQm94SW1wOjpHZXRCQm94KENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIHJldHVybiBEaXNGb3JtX0dldEJCb3gocmVjdCk7DQotICAgIH0NCi0gICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQotICAgIGlmIChtX3BMaXN0Qm94ICYmIElzRHJvcExpc3RTaG93ZWQoKSkgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0TGlzdDsNCi0gICAgICAgIG1fcExpc3RCb3gtPkdldFdpZGdldFJlY3QocnRMaXN0KTsNCi0gICAgICAgIHJ0TGlzdC5PZmZzZXQocmVjdC5sZWZ0LCByZWN0LnRvcCk7DQotICAgICAgICByZWN0LlVuaW9uKHJ0TGlzdCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfQ29tYm9Cb3hJbXA6OkVkaXRNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQotICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCkNCi17DQotICAgIGlmIChtX3BFZGl0ICE9IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBtX3BFZGl0LT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1BhcmFtZXRlcl9JbnZhbGlkOw0KLSAgICB9DQotfQ0KLUZYX0ZMT0FUIENGV0xfQ29tYm9Cb3hJbXA6OkdldExpc3RIZWlnaHQoKQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpLT5HZXRMaXN0SGVpZ2h0KG1fcEludGVyZmFjZSk7DQotfQ0KLXZvaWQgQ0ZXTF9Db21ib0JveEltcDo6RHJhd1N0cmV0Y2hIYW5kbGVyKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQotICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICBwYXJhbS5tX2lQYXJ0ID0JRldMX1BBUlRfQ01CX1N0cmV0Y2dIYW5kbGVyOw0KLSAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KLSAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydEhhbmRsZXI7DQotICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXItPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotfQ0KLXZvaWQgQ0ZXTF9Db21ib0JveEltcDo6U2hvd0Ryb3BMaXN0KEZYX0JPT0wgYkFjdGl2YXRlKQ0KLXsNCi0gICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIERpc0Zvcm1fU2hvd0Ryb3BMaXN0KGJBY3RpdmF0ZSk7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiRHJvcExpc3QgPSBJc0Ryb3BMaXN0U2hvd2VkKCk7DQotICAgIGlmKGJEcm9wTGlzdCA9PSBiQWN0aXZhdGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoIW1fcEZvcm0pIHsNCi0gICAgICAgIEluaXRQcm94eUZvcm0oKTsNCi0gICAgfQ0KLSAgICBtX3BMaXN0UHJveHlEZWxlZ2F0ZS0+UmVzZXQoKTsNCi0gICAgaWYgKGJBY3RpdmF0ZSkgew0KLSAgICAgICAgKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5DaGFuZ2VTZWxlY3RlZChtX2lDdXJTZWwpOw0KLSAgICAgICAgUmVTZXRMaXN0SXRlbUFsaWdubWVudCgpOw0KLSAgICAgICAgRlhfRFdPUkQgZHdTdHlsZUFkZCA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiAoRldMX1NUWUxFRVhUX0NNQl9Tb3J0IHwgRldMX1NUWUxFRVhUX0NNQl9Pd25lckRyYXcpOw0KLSAgICAgICAgbV9wTGlzdEJveC0+TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZUFkZCwgMCk7DQotICAgICAgICBtX3BMaXN0Qm94LT5HZXRXaWRnZXRSZWN0KG1fcnRMaXN0LCBUUlVFKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBHZXRMaXN0SGVpZ2h0KCk7DQotICAgICAgICBpZiAoZkhlaWdodCA+IDApIHsNCi0gICAgICAgICAgICBpZiAobV9ydExpc3QuaGVpZ2h0ID4gR2V0TGlzdEhlaWdodCgpKSB7DQotICAgICAgICAgICAgICAgIG1fcnRMaXN0LmhlaWdodCA9IEdldExpc3RIZWlnaHQoKTsNCi0gICAgICAgICAgICAgICAgbV9wTGlzdEJveC0+TW9kaWZ5U3R5bGVzKEZXTF9XR1RTVFlMRV9WU2Nyb2xsLCAwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBDRlhfUmVjdEYgcnRBbmNob3I7DQotICAgICAgICBydEFuY2hvci5TZXQoMCwNCi0gICAgICAgICAgICAgICAgICAgICAwLA0KLSAgICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KLSAgICAgICAgRlhfRkxPQVQgZk1pbkhlaWdodCA9IDA7DQotICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0ID0gbV9ydExpc3QuaGVpZ2h0Ow0KLSAgICAgICAgaWYgKG1fcnRMaXN0LndpZHRoIDwgbV9ydENsaWVudC53aWR0aCkgew0KLSAgICAgICAgICAgIG1fcnRMaXN0LndpZHRoID0gbV9ydENsaWVudC53aWR0aDsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcnRQcm94eSA9IG1fcnRMaXN0Ow0KLSAgICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0xpc3REcmFnKSB7DQotICAgICAgICAgICAgbV9ydFByb3h5LmhlaWdodCArPSBtX2ZDb21ib0Zvcm1IYW5kbGVyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgR2V0UG9wdXBQb3MoZk1pbkhlaWdodCwgbV9ydFByb3h5LmhlaWdodCwgcnRBbmNob3IsIG1fcnRQcm94eSk7DQotICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfTGlzdERyYWcpIHsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmeCA9IDA7DQotICAgICAgICAgICAgRlhfRkxPQVQgZnkgPSBtX3J0Q2xpZW50LnRvcCArIG1fcnRDbGllbnQuaGVpZ2h0IC8gMjsNCi0gICAgICAgICAgICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KLSAgICAgICAgICAgIG1fYlVwRm9ybUhhbmRsZXIgPSBmeSA+IG1fcnRQcm94eS50b3A7DQotICAgICAgICAgICAgaWYgKG1fYlVwRm9ybUhhbmRsZXIpIHsNCi0gICAgICAgICAgICAgICAgbV9ydEhhbmRsZXIuU2V0KDAsIDAsIG1fcnRMaXN0LndpZHRoLCBtX2ZDb21ib0Zvcm1IYW5kbGVyKTsNCi0gICAgICAgICAgICAgICAgbV9ydExpc3QudG9wID0gbV9mQ29tYm9Gb3JtSGFuZGxlcjsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX3J0SGFuZGxlci5TZXQoMCwgbV9ydExpc3QuaGVpZ2h0LCBtX3J0TGlzdC53aWR0aCwgbV9mQ29tYm9Gb3JtSGFuZGxlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wRm9ybS0+U2V0V2lkZ2V0UmVjdChtX3J0UHJveHkpOw0KLSAgICAgICAgbV9wRm9ybS0+VXBkYXRlKCk7DQotICAgICAgICBtX3BMaXN0Qm94LT5TZXRXaWRnZXRSZWN0KG1fcnRMaXN0KTsNCi0gICAgICAgIG1fcExpc3RCb3gtPlVwZGF0ZSgpOw0KLSAgICAgICAgQ0ZXTF9FdnRDbWJQcmVEcm9wRG93biBldjsNCi0gICAgICAgIGV2Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgIERpc3BhdGNoRXZlbnQoJmV2KTsNCi0gICAgICAgIG1fZkl0ZW1IZWlnaHQgPSAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSktPm1fZkl0ZW1IZWlnaHQ7DQotICAgICAgICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSktPlNldEZvY3VzKFRSVUUpOw0KLSAgICAgICAgbV9wRm9ybS0+RG9Nb2RhbCgpOw0KLSAgICAgICAgKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5TZXRGb2N1cyhGQUxTRSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BGb3JtLT5FbmREb01vZGFsKCk7DQotICAgICAgICBDRldMX0V2dENtYkNsb3NlVXAgZXY7DQotICAgICAgICBldi5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICBEaXNwYXRjaEV2ZW50KCZldik7DQotICAgICAgICBtX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KLSAgICAgICAgKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5tX2JOb3RpZnlPd25lciA9IFRSVUU7DQotICAgICAgICBTZXRGb2N1cyhUUlVFKTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OklzRHJvcExpc3RTaG93ZWQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEZvcm0gJiYgIShtX3BGb3JtLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpOw0KLX0NCi1GWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OklzRHJvcERvd25TdHlsZSgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd247DQotfQ0KLXZvaWQgQ0ZXTF9Db21ib0JveEltcDo6TWF0Y2hFZGl0VGV4dCgpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgIG1fcEVkaXQtPkdldFRleHQod3NUZXh0KTsNCi0gICAgaW50MzJfdCBpTWF0Y2ggPSAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSktPk1hdGNoSXRlbSh3c1RleHQpOw0KLSAgICBpZiAoaU1hdGNoICE9IG1faUN1clNlbCkgew0KLSAgICAgICAgKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5DaGFuZ2VTZWxlY3RlZChpTWF0Y2gpOw0KLSAgICAgICAgaWYgKGlNYXRjaCA+PSAwKSB7DQotICAgICAgICAgICAgU3luY2hyRWRpdFRleHQoaU1hdGNoKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChpTWF0Y2ggPj0gMCkgew0KLSAgICAgICAgKChDRldMX0NvbWJvRWRpdCopKChJRldMX1RhcmdldERhdGEqKW1fcEVkaXQpLT5HZXREYXRhKCkpLT5TZXRTZWxlY3RlZCgpOw0KLSAgICB9DQotICAgIG1faUN1clNlbCA9IGlNYXRjaDsNCi19DQotdm9pZCBDRldMX0NvbWJvQm94SW1wOjpTeW5jaHJFZGl0VGV4dChpbnQzMl90IGlMaXN0SXRlbSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgSUZXTF9Db21ib0JveERQICpwRGF0YSA9IChJRldMX0NvbWJvQm94RFAgKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGlMaXN0SXRlbSk7DQotICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKS0+R2V0SXRlbVRleHQoaEl0ZW0sIHdzVGV4dCk7DQotICAgIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCi0gICAgbV9wRWRpdC0+VXBkYXRlKCk7DQotICAgICgoQ0ZXTF9Db21ib0VkaXQqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BFZGl0KS0+R2V0RGF0YSgpKS0+U2V0U2VsZWN0ZWQoKTsNCi19DQotdm9pZCBDRldMX0NvbWJvQm94SW1wOjpMYXlvdXQoKQ0KLXsNCi0gICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIERpc0Zvcm1fTGF5b3V0KCk7DQotICAgIH0NCi0gICAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCi0gICAgRlhfRkxPQVQgKnBGV2lkdGggPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRldpZHRoKTsNCi0gICAgRlhfRkxPQVQgZkJ0biA9ICpwRldpZHRoOw0KLSAgICBtX3J0QnRuLlNldChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBmQnRuLCBtX3J0Q2xpZW50LnRvcCwgZkJ0biwgbV9ydENsaWVudC5oZWlnaHQpOw0KLSAgICBGWF9CT09MIGJJc0Ryb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQotICAgIGlmIChiSXNEcm9wRG93biAmJiBtX3BFZGl0KSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRFZGl0Ow0KLSAgICAgICAgcnRFZGl0LlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQudG9wLCBtX3J0Q2xpZW50LndpZHRoIC0gZkJ0biwgbV9ydENsaWVudC5oZWlnaHQpOw0KLSAgICAgICAgbV9wRWRpdC0+U2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KLSAgICAgICAgaWYgKG1faUN1clNlbCA+PSAwKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgICAgIElGV0xfQ29tYm9Cb3hEUCAqcERhdGEgPSAoSUZXTF9Db21ib0JveERQICopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIG1faUN1clNlbCk7DQotICAgICAgICAgICAgKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCi0gICAgICAgICAgICBtX3BFZGl0LT5Mb2NrVXBkYXRlKCk7DQotICAgICAgICAgICAgbV9wRWRpdC0+U2V0VGV4dCh3c1RleHQpOw0KLSAgICAgICAgICAgIG1fcEVkaXQtPlVubG9ja1VwZGF0ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wRWRpdC0+VXBkYXRlKCk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0NvbWJvQm94SW1wOjpSZVNldFRoZW1lKCkNCi17DQotICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCi0gICAgaWYgKCFwVGhlbWUpIHsNCi0gICAgICAgIHBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gcFRoZW1lOw0KLSAgICB9DQotICAgIGlmIChtX3BMaXN0Qm94KSB7DQotICAgICAgICBpZiAoIW1fcExpc3RCb3gtPkdldFRoZW1lUHJvdmlkZXIoKSAmJiBwVGhlbWUtPklzVmFsaWRXaWRnZXQobV9wTGlzdEJveCkpIHsNCi0gICAgICAgICAgICBtX3BMaXN0Qm94LT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKG1fcEVkaXQpIHsNCi0gICAgICAgIGlmICghbV9wRWRpdC0+R2V0VGhlbWVQcm92aWRlcigpICYmIHBUaGVtZS0+SXNWYWxpZFdpZGdldChtX3BFZGl0KSkgew0KLSAgICAgICAgICAgIG1fcEVkaXQtPlNldFRoZW1lUHJvdmlkZXIocFRoZW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfQ29tYm9Cb3hJbXA6OlJlU2V0RWRpdEFsaWdubWVudCgpDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcEVkaXQpOw0KLSAgICBGWF9EV09SRCBkd1N0eWxFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCi0gICAgRlhfRFdPUkQgZHdBZGQgPSAwOw0KLSAgICBzd2l0Y2ggKGR3U3R5bEV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIQWxpZ25NYXNrKSB7DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhDZW50ZXI6IHsNCi0gICAgICAgICAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9IQ2VudGVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhGYXI6IHsNCi0gICAgICAgICAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9IRmFyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfSE5lYXI7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIHN3aXRjaCAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZBbGlnbk1hc2spIHsNCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NNQl9FZGl0VkNlbnRlcjogew0KLSAgICAgICAgICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX1ZDZW50ZXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NNQl9FZGl0VkZhcjogew0KLSAgICAgICAgICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX1ZGYXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9WTmVhcjsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGR3U3R5bEV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0VkaXRKdXN0aWZpZWQpIHsNCi0gICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfSnVzdGlmaWVkOw0KLSAgICB9DQotICAgIGlmIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9FZGl0RGlzdHJpYnV0ZWQpIHsNCi0gICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfRGlzdHJpYnV0ZWQ7DQotICAgIH0NCi0gICAgbV9wRWRpdC0+TW9kaWZ5U3R5bGVzRXgoZHdBZGQsIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTWFzayB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTW9kZU1hc2sgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfRURUX1ZBbGlnbk1hc2spOw0KLX0NCi12b2lkIENGV0xfQ29tYm9Cb3hJbXA6OlJlU2V0TGlzdEl0ZW1BbGlnbm1lbnQoKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BMaXN0Qm94KTsNCi0gICAgRlhfRFdPUkQgZHdTdHlsRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQotICAgIEZYX0RXT1JEIGR3QWRkID0gMDsNCi0gICAgc3dpdGNoIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUFsaWduTWFzaykgew0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtQ2VudGVyQWxpZ246IHsNCi0gICAgICAgICAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0xUQl9DZW50ZXJBbGlnbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1SaWdodEFsaWduOiB7DQotICAgICAgICAgICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9MVEJfUmlnaHRBbGlnbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9MVEJfTGVmdEFsaWduOw0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX3BMaXN0Qm94LT5Nb2RpZnlTdHlsZXNFeChkd0FkZCwgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUFsaWduTWFzayk7DQotfQ0KLXZvaWQgQ0ZXTF9Db21ib0JveEltcDo6UHJvY2Vzc1NlbENoYW5nZWQoRlhfQk9PTCBiTEJ1dHRvblVwKQ0KLXsNCi0gICAgSUZXTF9Db21ib0JveERQICpwRGF0YXMgPSAoSUZXTF9Db21ib0JveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgIG1faUN1clNlbCA9IHBEYXRhcy0+R2V0SXRlbUluZGV4KG1fcEludGVyZmFjZSwgbV9wTGlzdEJveC0+R2V0U2VsSXRlbSgwKSk7DQotICAgIEZYX0JPT0wgYkRyb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQotICAgIGlmIChiRHJvcERvd24pIHsNCi0gICAgICAgIElGV0xfQ29tYm9Cb3hEUCAqcERhdGEgPSAoSUZXTF9Db21ib0JveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBtX2lDdXJTZWwpOw0KLSAgICAgICAgaWYgKGhJdGVtKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgICAgIHBEYXRhLT5HZXRJdGVtVGV4dChtX3BJbnRlcmZhY2UsIGhJdGVtLCB3c1RleHQpOw0KLSAgICAgICAgICAgIGlmIChtX3BFZGl0KSB7DQotICAgICAgICAgICAgICAgIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCi0gICAgICAgICAgICAgICAgbV9wRWRpdC0+VXBkYXRlKCk7DQotICAgICAgICAgICAgICAgICgoQ0ZXTF9Db21ib0VkaXQqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BFZGl0KS0+R2V0RGF0YSgpKS0+U2V0U2VsZWN0ZWQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZXTF9FdnRDbWJTZWxDaGFuZ2VkIGV2Ow0KLSAgICAgICAgICAgIGV2LmJMQnV0dG9uVXAgPSBiTEJ1dHRvblVwOw0KLSAgICAgICAgICAgIGV2Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICBldi5pQXJyYXlTZWxzLkFkZChtX2lDdXJTZWwpOw0KLSAgICAgICAgICAgIERpc3BhdGNoRXZlbnQoJmV2KTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9Db21ib0JveEltcDo6SW5pdFByb3h5Rm9ybSgpDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKCFtX3BGb3JtKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BMaXN0Qm94KTsNCi0gICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3BGb3JtOw0KLSAgICBwcm9wRm9ybS5tX3BPd25lciA9IG1fcEludGVyZmFjZTsNCi0gICAgcHJvcEZvcm0ubV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9Qb3B1cDsNCi0gICAgcHJvcEZvcm0ubV9kd1N0YXRlcyA9IEZXTF9XR1RTVEFURV9JbnZpc2libGU7DQotICAgIG1fcFByb3h5ID0gRlhfTkVXIENGV0xfRm9ybVByb3h5SW1wKHByb3BGb3JtLCBtX3BMaXN0Qm94KTsNCi0gICAgbV9wRm9ybSA9IElGV0xfRm9ybTo6Q3JlYXRlKCk7DQotICAgIG1fcFByb3h5LT5TZXRJbnRlcmZhY2UobV9wRm9ybSk7DQotICAgICgoSUZXTF9UYXJnZXREYXRhKiltX3BGb3JtKS0+U2V0RGF0YShtX3BQcm94eSk7DQotICAgIG1fcFByb3h5LT5Jbml0aWFsaXplKCk7DQotICAgIG1fcExpc3RCb3gtPlNldFBhcmVudCgoSUZXTF9XaWRnZXQqKW1fcEZvcm0pOw0KLSAgICBtX3BMaXN0UHJveHlEZWxlZ2F0ZSA9IEZYX05FVyBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZShtX3BGb3JtLCB0aGlzKTsNCi0gICAgbV9wUHJveHktPlNldERlbGVnYXRlKChJRldMX1dpZGdldERlbGVnYXRlKiltX3BMaXN0UHJveHlEZWxlZ2F0ZSk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9Jbml0aWFsaXplKCkNCi17DQotICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9XR1RTVEFURV9JbnZpc2libGUpOw0KLSAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlKHRoaXMpOw0KLSAgICBEaXNGb3JtX0luaXRDb21ib0xpc3QoKTsNCi0gICAgRGlzRm9ybV9Jbml0Q29tYm9FZGl0KCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotdm9pZCBDRldMX0NvbWJvQm94SW1wOjpEaXNGb3JtX0luaXRDb21ib0xpc3QoKQ0KLXsNCi0gICAgaWYgKG1fcExpc3RCb3gpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCi0gICAgcHJvcC5tX3BQYXJlbnQgPSAoSUZXTF9XaWRnZXQqKXRoaXMtPm1fcEludGVyZmFjZTsNCi0gICAgcHJvcC5tX2R3U3R5bGVzID0gRldMX1dHVFNUWUxFX0JvcmRlciB8IEZXTF9XR1RTVFlMRV9WU2Nyb2xsOw0KLSAgICBwcm9wLm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfSW52aXNpYmxlOw0KLSAgICBwcm9wLm1fcERhdGFQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgcHJvcC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCi0gICAgQ0ZXTF9Db21ib0xpc3QgKnBMaXN0ID0gRlhfTkVXIENGV0xfQ29tYm9MaXN0KHByb3AsIG1fcEludGVyZmFjZSk7DQotICAgIG1fcExpc3RCb3ggPSBJRldMX0xpc3RCb3g6OkNyZWF0ZSgpOw0KLSAgICBwTGlzdC0+U2V0SW50ZXJmYWNlKG1fcExpc3RCb3gpOw0KLSAgICAoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPlNldERhdGEocExpc3QpOw0KLSAgICBwTGlzdC0+SW5pdGlhbGl6ZSgpOw0KLX0NCi12b2lkIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fSW5pdENvbWJvRWRpdCgpDQotew0KLSAgICBpZiAobV9wRWRpdCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KLSAgICBwcm9wLm1fcFBhcmVudCA9IChJRldMX1dpZGdldCopdGhpcy0+bV9wSW50ZXJmYWNlOw0KLSAgICBwcm9wLm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duKSA9PSAwKSB7DQotICAgIH0NCi0gICAgQ0ZXTF9Db21ib0VkaXQgKnBFZGl0ID0gRlhfTkVXIENGV0xfQ29tYm9FZGl0KHByb3AsIG1fcEludGVyZmFjZSk7DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpJbml0aWFsaXplKCkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9Jbml0aWFsaXplKCk7DQorICB9DQorICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7DQorICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlKHRoaXMpOw0KKyAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICBwcm9wLm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgcHJvcC5tX2R3U3R5bGVzIHw9IEZXTF9XR1RTVFlMRV9Cb3JkZXIgfCBGV0xfV0dUU1RZTEVfVlNjcm9sbDsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUljb25UZXh0KSB7DQorICAgIHByb3AubV9kd1N0eWxlRXhlcyB8PSBGV0xfU1RZTEVFWFRfTFRCX0ljb247DQorICB9DQorICBwcm9wLm1fcERhdGFQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIENGV0xfQ29tYm9MaXN0KiBwTGlzdCA9IEZYX05FVyBDRldMX0NvbWJvTGlzdChwcm9wLCBtX3BJbnRlcmZhY2UpOw0KKyAgbV9wTGlzdEJveCA9IElGV0xfTGlzdEJveDo6Q3JlYXRlKCk7DQorICBwTGlzdC0+U2V0SW50ZXJmYWNlKG1fcExpc3RCb3gpOw0KKyAgKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5TZXREYXRhKHBMaXN0KTsNCisgIHBMaXN0LT5Jbml0aWFsaXplKCk7DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duKSAmJiAhbV9wRWRpdCkgew0KKyAgICBDRldMX0NvbWJvRWRpdCogcEVkaXQgPSBGWF9ORVcgQ0ZXTF9Db21ib0VkaXQobV9wSW50ZXJmYWNlKTsNCiAgICAgbV9wRWRpdCA9IElGV0xfRWRpdDo6Q3JlYXRlKCk7DQogICAgIHBFZGl0LT5TZXRJbnRlcmZhY2UobV9wRWRpdCk7DQogICAgICgoSUZXTF9UYXJnZXREYXRhKiltX3BFZGl0KS0+U2V0RGF0YShwRWRpdCk7DQogICAgIHBFZGl0LT5Jbml0aWFsaXplKCk7DQogICAgIHBFZGl0LT5TZXRPdXRlcihtX3BJbnRlcmZhY2UpOw0KKyAgfQ0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgbV9wRWRpdC0+U2V0UGFyZW50KG1fcEludGVyZmFjZSk7DQorICB9DQorICBTZXRTdGF0ZXMobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLXZvaWQgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9TaG93RHJvcExpc3QoRlhfQk9PTCBiQWN0aXZhdGUpDQotew0KLSAgICBGWF9CT09MIGJEcm9wTGlzdCA9IERpc0Zvcm1fSXNEcm9wTGlzdFNob3dlZCgpOw0KLSAgICBpZihiRHJvcExpc3QgPT0gYkFjdGl2YXRlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKGJBY3RpdmF0ZSkgew0KLSAgICAgICAgQ0ZXTF9FdnRDbWJQcmVEcm9wRG93biBwcmVFdmVudDsNCi0gICAgICAgIHByZUV2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgIERpc3BhdGNoRXZlbnQoJnByZUV2ZW50KTsNCi0gICAgICAgIENGV0xfQ29tYm9MaXN0KiBwQ29tYm9MaXN0ID0gKENGV0xfQ29tYm9MaXN0KikoKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpOw0KLSAgICAgICAgaW50MzJfdCBpSXRlbXMgPSBwQ29tYm9MaXN0LT5Db3VudEl0ZW1zKCk7DQotICAgICAgICBpZiAoaUl0ZW1zIDwgMSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIFJlU2V0TGlzdEl0ZW1BbGlnbm1lbnQoKTsNCi0gICAgICAgIHBDb21ib0xpc3QtPkNoYW5nZVNlbGVjdGVkKG1faUN1clNlbCk7DQotICAgICAgICBGWF9GTE9BVCBmSXRlbUhlaWdodCA9IHBDb21ib0xpc3QtPkdldEl0ZW1IZWlndCgpOw0KLSAgICAgICAgRlhfRkxPQVQgZkJvcmRlciA9IEdldEJvcmRlclNpemUoKTsNCi0gICAgICAgIEZYX0RXT1JEIG5XaGVyZSA9IDA7DQotICAgICAgICBGWF9GTE9BVCBmUG9wdXBSZXQgPSAwLjBmOw0KLSAgICAgICAgRlhfRkxPQVQgZlBvcHVwTWluID0gMC4wZjsNCi0gICAgICAgIGlmIChpSXRlbXMgPiAzKSB7DQotICAgICAgICAgICAgZlBvcHVwTWluID0gZkl0ZW1IZWlnaHQgKiAzICsgZkJvcmRlciAqIDI7DQotICAgICAgICB9DQotICAgICAgICBGWF9GTE9BVCBmUG9wdXBNYXggPSBmSXRlbUhlaWdodCAqIGlJdGVtcyArIGZCb3JkZXIgKiAyOw0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0TGlzdDsNCi0gICAgICAgIHJ0TGlzdC5sZWZ0ID0gbV9ydENsaWVudC5sZWZ0Ow0KLSAgICAgICAgcnRMaXN0LndpZHRoID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aDsNCi0gICAgICAgIHJ0TGlzdC50b3AgPSAwOw0KLSAgICAgICAgcnRMaXN0LmhlaWdodCA9IDA7DQotICAgICAgICBHZXRQb3B1cFBvcyhmUG9wdXBNaW4sIGZQb3B1cE1heCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldCwgcnRMaXN0KTsNCi0gICAgICAgIG1fcExpc3RCb3gtPlNldFdpZGdldFJlY3QocnRMaXN0KTsNCi0gICAgICAgIG1fcExpc3RCb3gtPlVwZGF0ZSgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgU2V0Rm9jdXMoVFJVRSk7DQotICAgIH0NCi0gICAgbV9wTGlzdEJveC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsICFiQWN0aXZhdGUpOw0KLSAgICBpZiAoYkFjdGl2YXRlKSB7DQotICAgICAgICBDRldMX0V2dENtYlBvc3REcm9wRG93biBwb3N0RXZlbnQ7DQotICAgICAgICBwb3N0RXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICAgICAgRGlzcGF0Y2hFdmVudCgmcG9zdEV2ZW50KTsNCi0gICAgfQ0KLSAgICBDRlhfUmVjdEYgcmVjdDsNCi0gICAgbV9wTGlzdEJveC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCi0gICAgcmVjdC5JbmZsYXRlKDIsIDIpOw0KLSAgICBSZXBhaW50KCZyZWN0KTsNCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkZpbmFsaXplKCkgew0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgbV9wRWRpdC0+RmluYWxpemUoKTsNCisgIH0NCisgIG1fcExpc3RCb3gtPkZpbmFsaXplKCk7DQorICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgZGVsZXRlIChDRldMX0NvbWJvQm94SW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCkNCi17DQotICAgIHJldHVybiAhKG1fcExpc3RCb3gtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9Nb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKQ0KLXsNCi0gICAgaWYgKCFtX3BFZGl0KSB7DQotICAgICAgICBEaXNGb3JtX0luaXRDb21ib0VkaXQoKTsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJBZGREcm9wRG93biA9IGR3U3R5bGVzRXhBZGRlZCAmIEZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd247DQotICAgIEZYX0JPT0wgYkRlbERyb3BEb3duID0gZHdTdHlsZXNFeFJlbW92ZWQgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KLSAgICBkd1N0eWxlc0V4UmVtb3ZlZCAmPSB+RldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsNCi0gICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyB8PSBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KLSAgICBpZiAoYkFkZERyb3BEb3duKSB7DQotICAgICAgICBtX3BFZGl0LT5Nb2RpZnlTdHlsZXNFeCgwLCBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KTsNCi0gICAgfSBlbHNlIGlmIChiRGVsRHJvcERvd24pIHsNCi0gICAgICAgIG1fcEVkaXQtPk1vZGlmeVN0eWxlc0V4KEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHksIDApOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9VcGRhdGUoKQ0KLXsNCi0gICAgaWYgKG1faUxvY2spIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQotICAgIH0NCi0gICAgaWYgKG1fcEVkaXQpIHsNCi0gICAgICAgIFJlU2V0RWRpdEFsaWdubWVudCgpOw0KLSAgICB9DQotICAgIFJlU2V0VGhlbWUoKTsNCi0gICAgTGF5b3V0KCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfRFdPUkQgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIENGWF9SZWN0RiByZWN0Ow0KLSAgICByZWN0LlNldCgwLA0KLSAgICAgICAgICAgICAwLA0KLSAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoIC0gbV9ydEJ0bi53aWR0aCwNCi0gICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KLSAgICBpZiAocmVjdC5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfRWRpdDsNCi0gICAgfQ0KLSAgICBpZiAobV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KLSAgICB9DQotICAgIGlmIChEaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKSkgew0KLSAgICAgICAgbV9wTGlzdEJveC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCi0gICAgICAgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCi0gICAgQ0ZYX01hdHJpeCBtdE9yZzsNCi0gICAgbXRPcmcuU2V0KDEsIDAsIDAsIDEsIDAsIDApOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgbXRPcmcgPSAqcE1hdHJpeDsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJMaXN0U2hvd2VkID0gbV9wTGlzdEJveCAmJiBEaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKTsNCi0gICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBwR3JhcGhpY3MtPkNvbmNhdE1hdHJpeCgmbXRPcmcpOw0KLSAgICBpZiAoIW1fcnRCdG4uSXNFbXB0eSgwLjFmKSkgew0KLSAgICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQotICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSAoSUZXTF9XaWRnZXQqKXRoaXMtPm1fcEludGVyZmFjZTsNCi0gICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DTUJfRHJvcERvd25CdXR0b247DQotICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gbV9pQnRuU3RhdGU7DQotICAgICAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydEJ0bjsNCi0gICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCi0gICAgfQ0KLSAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQotICAgIGlmIChtX3BFZGl0KSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRFZGl0Ow0KLSAgICAgICAgbV9wRWRpdC0+R2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KLSAgICAgICAgQ0ZYX01hdHJpeCBtdDsNCi0gICAgICAgIG10LlNldCgxLCAwLCAwLCAxLCBydEVkaXQubGVmdCwgcnRFZGl0LnRvcCk7DQotICAgICAgICBtdC5Db25jYXQobXRPcmcpOw0KLSAgICAgICAgbV9wRWRpdC0+RHJhd1dpZGdldChwR3JhcGhpY3MsICZtdCk7DQotICAgIH0NCi0gICAgaWYgKGJMaXN0U2hvd2VkKSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRMaXN0Ow0KLSAgICAgICAgbV9wTGlzdEJveC0+R2V0V2lkZ2V0UmVjdChydExpc3QpOw0KLSAgICAgICAgQ0ZYX01hdHJpeCBtdDsNCi0gICAgICAgIG10LlNldCgxLCAwLCAwLCAxLCBydExpc3QubGVmdCwgcnRMaXN0LnRvcCk7DQotICAgICAgICBtdC5Db25jYXQobXRPcmcpOw0KLSAgICAgICAgbV9wTGlzdEJveC0+RHJhd1dpZGdldChwR3JhcGhpY3MsICZtdCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fR2V0QkJveChDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgaWYgKG1fcExpc3RCb3ggJiYgRGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCkpIHsNCi0gICAgICAgIENGWF9SZWN0RiBydExpc3Q7DQotICAgICAgICBtX3BMaXN0Qm94LT5HZXRXaWRnZXRSZWN0KHJ0TGlzdCk7DQotICAgICAgICBydExpc3QuT2Zmc2V0KHJlY3QubGVmdCwgcmVjdC50b3ApOw0KLSAgICAgICAgcmVjdC5VbmlvbihydExpc3QpOw0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotdm9pZCBDRldMX0NvbWJvQm94SW1wOjpEaXNGb3JtX0xheW91dCgpDQotew0KLSAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KLSAgICBtX3J0Q29udGVudCA9IG1fcnRDbGllbnQ7DQotICAgIEZYX0ZMT0FUICpwRldpZHRoID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEZXaWR0aCk7DQotICAgIEZYX0ZMT0FUIGJvcmRlcldpZHRoID0gMDsNCi0gICAgew0KLSAgICAgICAgYm9yZGVyV2lkdGggPSBGV0xfUEFSVF9DTUJfQm9yZGVyOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZCdG4gPSAqcEZXaWR0aDsNCi0gICAgaWYgKCEodGhpcy0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9DTUJfUmVhZE9ubHkpKSB7DQotICAgICAgICBtX3J0QnRuLlNldChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBmQnRuLCBtX3J0Q2xpZW50LnRvcCArIGJvcmRlcldpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgZkJ0biAtIGJvcmRlcldpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCAtIDIgKiBib3JkZXJXaWR0aCk7DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGKiBwVUlNYXJnaW4gPSAoQ0ZYX1JlY3RGKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9VSU1hcmdpbik7DQotICAgIGlmIChwVUlNYXJnaW4pIHsNCi0gICAgICAgIG1fcnRDb250ZW50LkRlZmxhdGUocFVJTWFyZ2luLT5sZWZ0LCBwVUlNYXJnaW4tPnRvcCwgcFVJTWFyZ2luLT53aWR0aCwgcFVJTWFyZ2luLT5oZWlnaHQpOw0KLSAgICB9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmIChiQXV0b1NpemUpIHsNCisgICAgcmVjdC5SZXNldCgpOw0KICAgICBGWF9CT09MIGJJc0Ryb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQogICAgIGlmIChiSXNEcm9wRG93biAmJiBtX3BFZGl0KSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRFZGl0Ow0KLSAgICAgICAgcnRFZGl0LlNldChtX3J0Q29udGVudC5sZWZ0LA0KLSAgICAgICAgICAgICAgICAgICBtX3J0Q29udGVudC50b3AsIG1fcnRDb250ZW50LndpZHRoIC0gZkJ0biwgbV9ydENvbnRlbnQuaGVpZ2h0KTsNCi0gICAgICAgIG1fcEVkaXQtPlNldFdpZGdldFJlY3QocnRFZGl0KTsNCi0gICAgICAgIGlmIChtX2lDdXJTZWwgPj0gMCkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgICAgICAgICBJRldMX0NvbWJvQm94RFAgKnBEYXRhID0gKElGV0xfQ29tYm9Cb3hEUCAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBtX2lDdXJTZWwpOw0KLSAgICAgICAgICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKS0+R2V0SXRlbVRleHQoaEl0ZW0sIHdzVGV4dCk7DQotICAgICAgICAgICAgbV9wRWRpdC0+TG9ja1VwZGF0ZSgpOw0KLSAgICAgICAgICAgIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCi0gICAgICAgICAgICBtX3BFZGl0LT5VbmxvY2tVcGRhdGUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KLSAgICB9DQotfQ0KLUNGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6Q0ZXTF9Db21ib0JveEltcERlbGVnYXRlKENGV0xfQ29tYm9Cb3hJbXAgKnBPd25lcikNCi0gICAgOiBtX3BPd25lcihwT3duZXIpDQotew0KLX0NCi1pbnQzMl90IENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KLXsNCi0gICAgaWYgKG1fcE93bmVyLT5tX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIHJldHVybiBEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLSAgICB9DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KLSAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBGWF9CT09MIGlSZXQgPSAxOw0KLSAgICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQotICAgICAgICAgICAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQotICAgICAgICAgICAgICAgIENGV0xfTXNnTW91c2UgKnBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCi0gICAgICAgICAgICAgICAgc3dpdGNoKGR3Q21kKSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTGVhdmUocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCi0gICAgICAgICAgICAgICAgT25LZXkoKENGV0xfTXNnS2V5KilwTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgaVJldCA9IDA7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLSAgICByZXR1cm4gaVJldDsNCi19DQotRldMX0VSUglDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCi17DQotICAgIEZYX0RXT1JEIGR3RmxhZyA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAoZHdGbGFnID09IEZXTF9FVlRIQVNIX0xUQl9EcmF3SXRlbSkgew0KLSAgICAgICAgQ0ZXTF9FdnRDbWJEcmF3SXRlbSBwVGVtcDsNCi0gICAgICAgIHBUZW1wLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQotICAgICAgICBwVGVtcC5tX3BHcmFwaGljcyA9ICgoQ0ZXTF9FdnRMdGJEcmF3SXRlbSAqKXBFdmVudCktPm1fcEdyYXBoaWNzOw0KLSAgICAgICAgcFRlbXAubV9pbmRleCA9ICgoQ0ZXTF9FdnRMdGJEcmF3SXRlbSAqKXBFdmVudCktPm1faW5kZXg7DQotICAgICAgICBwVGVtcC5tX3J0SXRlbSA9ICgoQ0ZXTF9FdnRMdGJEcmF3SXRlbSAqKXBFdmVudCktPm1fcmVjdDsNCi0gICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZwVGVtcCk7DQotICAgIH0gZWxzZSBpZiAoZHdGbGFnID09IEZXTF9FVlRIQVNIX1Njcm9sbCkgew0KLSAgICAgICAgRlhfRFdPUkQgZHdTY3JvbGxDb2RlID0gKChDRldMX0V2dFNjcm9sbCopcEV2ZW50KS0+bV9pU2Nyb2xsQ29kZTsNCi0gICAgICAgIEZYX0ZMT0FUIGZQb3MgPSAoKENGV0xfRXZ0U2Nyb2xsKilwRXZlbnQpLT5tX2ZQb3M7DQotICAgICAgICBDRldMX0V2dFNjcm9sbCBwU2Nyb2xsRXY7DQotICAgICAgICBwU2Nyb2xsRXYubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCi0gICAgICAgIHBTY3JvbGxFdi5tX2lTY3JvbGxDb2RlID0gZHdTY3JvbGxDb2RlOw0KLSAgICAgICAgcFNjcm9sbEV2Lm1fZlBvcyA9IGZQb3M7DQotICAgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmcFNjcm9sbEV2KTsNCi0gICAgfSBlbHNlIGlmIChkd0ZsYWcgPT0gRldMX0VWVEhBU0hfRURUX1RleHRDaGFuZ2VkKSB7DQotICAgICAgICBDRldMX0V2dENtYkVkaXRDaGFuZ2VkIHBUZW1wOw0KLSAgICAgICAgcFRlbXAubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCi0gICAgICAgIHBUZW1wLndzSW5zZXJ0ID0gKChDRldMX0V2dEVkdFRleHRDaGFuZ2VkICopcEV2ZW50KS0+d3NJbnNlcnQ7DQotICAgICAgICBwVGVtcC53c0RlbGV0ZSA9ICgoQ0ZXTF9FdnRFZHRUZXh0Q2hhbmdlZCAqKXBFdmVudCktPndzRGVsZXRlOw0KLSAgICAgICAgcFRlbXAubkNoYW5nZVR5cGUgPSAoKENGV0xfRXZ0RWR0VGV4dENoYW5nZWQgKilwRXZlbnQpLT5uQ2hhbmdlVHlwZTsNCi0gICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZwVGVtcCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQotfQ0KLXZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCApDQotew0KLSAgICBJRldMX1RhcmdldCAqcERzdFRhcmdldCA9IHBNc2ctPm1fcERzdFRhcmdldDsNCi0gICAgSUZXTF9UYXJnZXQgKnBTcmNUYXJnZXQgPSBwTXNnLT5tX3BTcmNUYXJnZXQ7DQotICAgIEZYX0JPT0wgYkRyb3BEb3duID0gbV9wT3duZXItPklzRHJvcERvd25TdHlsZSgpOw0KLSAgICBpZiAoYlNldCkgew0KLSAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQotICAgICAgICBpZiAoYkRyb3BEb3duICYmIHBTcmNUYXJnZXQgIT0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wTGlzdEJveCkgew0KLSAgICAgICAgICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wT3duZXItPm1fcEVkaXQpOw0KLSAgICAgICAgICAgICgoQ0ZXTF9Db21ib0VkaXQqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wRWRpdCktPkdldERhdGEoKSktPlNldFNlbGVjdGVkKCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQotICAgICAgICB9DQorICAgICAgbV9wRWRpdC0+R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRm9jdXNlZDsNCi0gICAgICAgIGlmIChiRHJvcERvd24gJiYgcERzdFRhcmdldCAhPSAoSUZXTF9XaWRnZXQqKW1fcE93bmVyLT5tX3BMaXN0Qm94KSB7DQotICAgICAgICAgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BPd25lci0+bV9wRWRpdCk7DQotICAgICAgICAgICAgKChDRldMX0NvbWJvRWRpdCopKChJRldMX1RhcmdldERhdGEqKW1fcE93bmVyLT5tX3BFZGl0KS0+R2V0RGF0YSgpKS0+RmxhZ0ZvY3VzKEZBTFNFKTsNCi0gICAgICAgICAgICAoKENGV0xfQ29tYm9FZGl0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcEVkaXQpLT5HZXREYXRhKCkpLT5DbGVhclNlbGVjdGVkKCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQotICAgICAgICB9DQorICAgICAgcmVjdC53aWR0aCA9IDEwMDsNCisgICAgICByZWN0LmhlaWdodCA9IDE2Ow0KICAgICB9DQorICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICAgIFJlU2V0VGhlbWUoKTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCogcEZXaWR0aCA9DQorICAgICAgICAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRldpZHRoLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICByZWN0LkluZmxhdGUoMCwgMCwgKnBGV2lkdGgsIDApOw0KKyAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi12b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfQk9PTCBiRHJvcERvd24gPSBtX3BPd25lci0+SXNEcm9wRG93blN0eWxlKCk7DQotICAgIENGWF9SZWN0RiYgcnRCdG4gPSBiRHJvcERvd24gPyBtX3BPd25lci0+bV9ydEJ0biA6IG1fcE93bmVyLT5tX3J0Q2xpZW50Ow0KLSAgICBGWF9CT09MIGJDbGlja0J0biA9IHJ0QnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KLSAgICBpZiAoYkNsaWNrQnRuKSB7DQotICAgICAgICBpZiAoYkRyb3BEb3duICYmIG1fcE93bmVyLT5tX3BFZGl0KSB7DQotICAgICAgICAgICAgbV9wT3duZXItPk1hdGNoRWRpdFRleHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcE93bmVyLT5tX2JMQnV0dG9uRG93biA9IFRSVUU7DQotICAgICAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0NNQl9QcmVzc2VkOw0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCi0gICAgICAgIG1fcE93bmVyLT5TaG93RHJvcExpc3QoVFJVRSk7DQotICAgICAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KLSAgICB9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9Nb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCisgIH0NCisgIEZYX0JPT0wgYkFkZERyb3BEb3duID0gZHdTdHlsZXNFeEFkZGVkICYgRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsNCisgIEZYX0JPT0wgYlJlbW92ZURyb3BEb3duID0gZHdTdHlsZXNFeFJlbW92ZWQgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KKyAgaWYgKGJBZGREcm9wRG93biAmJiAhbV9wRWRpdCkgew0KKyAgICBDRldMX0NvbWJvRWRpdCogcEVkaXQgPSBGWF9ORVcgQ0ZXTF9Db21ib0VkaXQobV9wSW50ZXJmYWNlKTsNCisgICAgbV9wRWRpdCA9IElGV0xfRWRpdDo6Q3JlYXRlKCk7DQorICAgIHBFZGl0LT5TZXRJbnRlcmZhY2UobV9wRWRpdCk7DQorICAgICgoSUZXTF9UYXJnZXREYXRhKiltX3BFZGl0KS0+U2V0RGF0YShwRWRpdCk7DQorICAgIHBFZGl0LT5Jbml0aWFsaXplKCk7DQorICAgIHBFZGl0LT5TZXRPdXRlcihtX3BJbnRlcmZhY2UpOw0KKyAgICBtX3BFZGl0LT5TZXRQYXJlbnQobV9wSW50ZXJmYWNlKTsNCisgIH0gZWxzZSBpZiAoYlJlbW92ZURyb3BEb3duICYmIG1fcEVkaXQpIHsNCisgICAgbV9wRWRpdC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpNb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCiB9DQotdm9pZCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBGQUxTRTsNCi0gICAgaWYgKG1fcE93bmVyLT5tX3J0QnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0NNQl9Ib3ZlcmVkOw0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6VXBkYXRlKCkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9VcGRhdGUoKTsNCisgIH0NCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBSZVNldFRoZW1lKCk7DQorICBGWF9CT09MIGJEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOw0KKyAgaWYgKGJEcm9wRG93biAmJiBtX3BFZGl0KSB7DQorICAgIFJlU2V0RWRpdEFsaWdubWVudCgpOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPT0gTlVMTCkgew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIH0NCisgIExheW91dCgpOw0KKyAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsNCisgIHBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgbV9mQ29tYm9Gb3JtSGFuZGxlciA9DQorICAgICAgKihGWF9GTE9BVCopbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlci0+R2V0Q2FwYWNpdHkoDQorICAgICAgICAgICZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfQ01CX0NvbWJvRm9ybUhhbmRsZXIpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0NvbWJvQm94SW1wOjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9IaXRUZXN0KGZ4LCBmeSk7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkhpdFRlc3QoZngsIGZ5KTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHJldHVybiBEaXNGb3JtX0RyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCisgIH0NCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgRlhfQk9PTCBiSXNEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOw0KKyAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9DTUJfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKEhhc0VkZ2UoKSkgew0KKyAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX0NNQl9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKCFiSXNEcm9wRG93bikgew0KKyAgICBDRlhfUmVjdEYgcnRUZXh0QmsobV9ydENsaWVudCk7DQorICAgIHJ0VGV4dEJrLndpZHRoIC09IG1fcnRCdG4ud2lkdGg7DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DTUJfQmFja2dyb3VuZDsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBwYXJhbS5tX3J0UGFydCA9IHJ0VGV4dEJrOw0KKyAgICBpZiAobV9pQ3VyU2VsID49IDApIHsNCisgICAgICBJRldMX0xpc3RCb3hEUCogcERhdGEgPQ0KKyAgICAgICAgICAoSUZXTF9MaXN0Qm94RFAqKSgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXREYXRhKCkpDQorICAgICAgICAgICAgICAtPm1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICB2b2lkKiBwID0NCisgICAgICAgICAgcERhdGEtPkdldEl0ZW1EYXRhKG1fcExpc3RCb3gsIHBEYXRhLT5HZXRJdGVtKG1fcExpc3RCb3gsIG1faUN1clNlbCkpOw0KKyAgICAgIGlmIChwICE9IE5VTEwpIHsNCisgICAgICAgIHBhcmFtLm1fcERhdGEgPSBwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KKyAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0NNQl9EaXNhYmxlZDsNCisgICAgfSBlbHNlIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSAmJg0KKyAgICAgICAgICAgICAgIChtX2lDdXJTZWwgPj0gMCkpIHsNCisgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DTUJfU2VsZWN0ZWQ7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw7DQorICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfQ01CX05vcm1hbDsNCiAgICAgfQ0KLSAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRCdG4pOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgIGlmIChtX2lDdXJTZWwgPj0gMCkgew0KKyAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wTGlzdEJveCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgSUZXTF9Db21ib0JveERQKiBwRGF0YSA9IChJRldMX0NvbWJvQm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBtX2lDdXJTZWwpOw0KKyAgICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKQ0KKyAgICAgICAgICAtPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KKyAgICAgIENGV0xfVGhlbWVUZXh0IHBhcmFtOw0KKyAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfQ01CX0NhcHRpb247DQorICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1faUJ0blN0YXRlOw0KKyAgICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgcGFyYW0ubV9ydFBhcnQgPSBydFRleHRCazsNCisgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMX1BBUlRTVEFURV9DTUJfU2VsZWN0ZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KKyAgICAgIHBhcmFtLm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgICAgIHBhcmFtLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgICAgICBwYXJhbS5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCisgICAgICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbSk7DQorICAgIH0NCisgIH0NCisgIHsNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0NNQl9Ecm9wRG93bkJ1dHRvbjsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMX1BBUlRTVEFURV9DTUJfRGlzYWJsZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1faUJ0blN0YXRlOw0KKyAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0QnRuOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLXZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgaW50MzJfdCBpT2xkU3RhdGUgPSBtX3BPd25lci0+bV9pQnRuU3RhdGU7DQotICAgIGlmIChtX3BPd25lci0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KLSAgICAgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gbV9wT3duZXItPm1fYkxCdXR0b25Eb3duID8gRldMX1BBUlRTVEFURV9DTUJfUHJlc3NlZCA6IEZXTF9QQVJUU1RBVEVfQ01CX0hvdmVyZWQ7DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lUHJvdmlkZXIpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gcFRoZW1lUHJvdmlkZXI7DQorICBpZiAobV9wTGlzdEJveCAmJiBwVGhlbWVQcm92aWRlci0+SXNWYWxpZFdpZGdldChtX3BMaXN0Qm94KSkgew0KKyAgICBtX3BMaXN0Qm94LT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCisgIH0NCisgIGlmIChtX3BFZGl0ICYmIHBUaGVtZVByb3ZpZGVyLT5Jc1ZhbGlkV2lkZ2V0KG1fcEVkaXQpKSB7DQorICAgIG1fcEVkaXQtPlNldFRoZW1lUHJvdmlkZXIocFRoZW1lUHJvdmlkZXIpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfQ29tYm9Cb3hJbXA6OkdldEN1clNlbCgpIHsNCisgIHJldHVybiBtX2lDdXJTZWw7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6U2V0Q3VyU2VsKGludDMyX3QgaVNlbCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSkNCisgICAgICAgICAgICAgICAgICAgICAgIC0+Q291bnRJdGVtcygpOw0KKyAgRlhfQk9PTCBiQ2xlYXJTZWwgPSBpU2VsIDwgMCB8fCBpU2VsID49IGlDb3VudDsNCisgIEZYX0JPT0wgYkRyb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQorICBpZiAoYkRyb3BEb3duICYmIG1fcEVkaXQpIHsNCisgICAgaWYgKGJDbGVhclNlbCkgew0KKyAgICAgIG1fcEVkaXQtPlNldFRleHQoQ0ZYX1dpZGVTdHJpbmcoKSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgIElGV0xfQ29tYm9Cb3hEUCogcERhdGEgPSAoSUZXTF9Db21ib0JveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaVNlbCk7DQorICAgICAgKChDRldMX0NvbWJvTGlzdCopKChJRldMX1RhcmdldERhdGEqKW1fcExpc3RCb3gpLT5HZXREYXRhKCkpDQorICAgICAgICAgIC0+R2V0SXRlbVRleHQoaEl0ZW0sIHdzVGV4dCk7DQorICAgICAgbV9wRWRpdC0+U2V0VGV4dCh3c1RleHQpOw0KICAgICB9DQotICAgIGlmICggIChpT2xkU3RhdGUgIT0gbV9wT3duZXItPm1faUJ0blN0YXRlKSAmJg0KLSAgICAgICAgICAgICEoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA9PSBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpKSB7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRCdG4pOw0KLSAgICB9DQorICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KKyAgfQ0KKyAgbV9pQ3VyU2VsID0gYkNsZWFyU2VsID8gLTEgOiBpU2VsOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi12b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBpZiAoIW1fcE93bmVyLT5Jc0Ryb3BMaXN0U2hvd2VkKCkgJiYNCi0gICAgICAgICAgICAhKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgPT0gRldMX1dHVFNUQVRFX0Rpc2FibGVkKSkgew0KLSAgICAgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0QnRuKTsNCi0gICAgfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQpIHsNCisgIEZYX0JPT0wgYklzRHJvcERvd24gPSBJc0Ryb3BEb3duU3R5bGUoKTsNCisgIGlmIChiSXNEcm9wRG93biAmJiBtX3BFZGl0KSB7DQorICAgIG1fcEVkaXQtPlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorICB9DQorICBpZiAobV9wTGlzdEJveCkgew0KKyAgICBtX3BMaXN0Qm94LT5TZXRTdGF0ZXMoZHdTdGF0ZXMsIGJTZXQpOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpTZXRTdGF0ZXMoZHdTdGF0ZXMsIGJTZXQpOw0KIH0NCi12b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25LZXkoQ0ZXTF9Nc2dLZXkgKnBNc2cpDQotew0KLSAgICBGWF9EV09SRCBkd0tleUNvZGUgPSBwTXNnLT5tX2R3S2V5Q29kZTsNCi0gICAgaWYgKGR3S2V5Q29kZSA9PSBGV0xfVktFWV9UYWIpIHsNCi0gICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEtleUV2ZW50KHBNc2cpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYlN1YkN0cmxLZXkgPSBwTXNnLT5tX3BEc3RUYXJnZXQgPT0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCi0gICAgaWYgKGJTdWJDdHJsS2V5KSB7DQotICAgICAgICBEb1N1YkN0cmxLZXkocE1zZyk7DQotICAgIH0NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCisgIHJldHVybiBtX3BFZGl0LT5VcGRhdGUoKTsNCiB9DQotdm9pZCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6OkRvU3ViQ3RybEtleShDRldMX01zZ0tleSAqcE1zZykNCi17DQotICAgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBNc2ctPm1fZHdLZXlDb2RlOw0KLSAgICBGWF9CT09MIGJVcCA9IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9VcDsNCi0gICAgRlhfQk9PTCBiRG93biA9IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9Eb3duOw0KLSAgICBpZiAoYlVwIHx8IGJEb3duKSB7DQotICAgICAgICBpbnQzMl90IGlDb3VudCA9ICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wTGlzdEJveCktPkdldERhdGEoKSktPkNvdW50SXRlbXMoKTsNCi0gICAgICAgIGlmIChpQ291bnQgPCAxKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfQk9PTCBiTWF0Y2hFcXVhbCA9IEZBTFNFOw0KLSAgICAgICAgaW50MzJfdCBpQ3VyU2VsID0gbV9wT3duZXItPm1faUN1clNlbDsNCi0gICAgICAgIEZYX0JPT0wgYkRyb3BEb3duID0gbV9wT3duZXItPklzRHJvcERvd25TdHlsZSgpOw0KLSAgICAgICAgaWYgKGJEcm9wRG93biAmJiBtX3BPd25lci0+bV9wRWRpdCkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgICAgICAgICBtX3BPd25lci0+bV9wRWRpdC0+R2V0VGV4dCh3c1RleHQpOw0KLSAgICAgICAgICAgIGlDdXJTZWwgPSAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcExpc3RCb3gpLT5HZXREYXRhKCkpLT5NYXRjaEl0ZW0od3NUZXh0KTsNCi0gICAgICAgICAgICBpZiAoaUN1clNlbCA+PSAwKSB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCi0gICAgICAgICAgICAgICAgSUZXTF9Db21ib0JveERQICpwRGF0YSA9IChJRldMX0NvbWJvQm94RFAgKiltX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wT3duZXItPm1fcEludGVyZmFjZSwgaUN1clNlbCk7DQotICAgICAgICAgICAgICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wTGlzdEJveCktPkdldERhdGEoKSktPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RlbXApOw0KLSAgICAgICAgICAgICAgICBiTWF0Y2hFcXVhbCA9IHdzVGV4dC5FcXVhbCh3c1RlbXApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpQ3VyU2VsIDwgMCkgew0KLSAgICAgICAgICAgIGlDdXJTZWwgPSAwOw0KLSAgICAgICAgfSBlbHNlIGlmICghYkRyb3BEb3duIHx8IGJNYXRjaEVxdWFsKSB7DQotICAgICAgICAgICAgaWYgKChiVXAgJiYgaUN1clNlbCA9PSAwKSB8fCAoYkRvd24gJiYgaUN1clNlbCA9PSBpQ291bnQgLSAxKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChiVXApIHsNCi0gICAgICAgICAgICAgICAgaUN1clNlbCAtLTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpQ3VyU2VsICsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIG1fcE93bmVyLT5tX2lDdXJTZWwgPSBpQ3VyU2VsOw0KLSAgICAgICAgaWYgKGJEcm9wRG93biAmJiBtX3BPd25lci0+bV9wRWRpdCkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5TeW5jaHJFZGl0VGV4dChtX3BPd25lci0+bV9pQ3VyU2VsKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJEcm9wRG93biA9IG1fcE93bmVyLT5Jc0Ryb3BEb3duU3R5bGUoKTsNCi0gICAgaWYgKGJEcm9wRG93bikgew0KLSAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gbV9wT3duZXItPm1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KLSAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNc2cpOw0KLSAgICB9DQoraW50MzJfdCBDRldMX0NvbWJvQm94SW1wOjpHZXRFZGl0VGV4dExlbmd0aCgpIGNvbnN0IHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgLTEpOw0KKyAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHRMZW5ndGgoKTsNCiB9DQotaW50MzJfdCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6OkRpc0Zvcm1fT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQotICAgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQotICAgIEZYX0JPT0wgYmFja0RlZmF1bHQgPSBUUlVFOw0KLSAgICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQotICAgICAgICAgICAgICAgIGJhY2tEZWZhdWx0ID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIERpc0Zvcm1fT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCi0gICAgICAgICAgICAgICAgYmFja0RlZmF1bHQgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCi0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KLSAgICAgICAgICAgICAgICBzd2l0Y2goZHdDbWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc0Zvcm1fT25MQnV0dG9uRG93bihwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQotICAgICAgICAgICAgICAgIGJhY2tEZWZhdWx0ID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIENGV0xfTXNnS2V5ICpwS2V5ID0gKENGV0xfTXNnS2V5KilwTWVzc2FnZTsNCi0gICAgICAgICAgICAgICAgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlVcCkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5EaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKSAmJiBwS2V5LT5tX2R3Q21kID09IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdLZXlDb2RlID0gcEtleS0+bV9kd0tleUNvZGU7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMaXN0S2V5ID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX1VwIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdLZXlDb2RlID09IEZXTF9WS0VZX0Rvd24gfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0tleUNvZGUgPT0gRldMX1ZLRVlfUmV0dXJuIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdLZXlDb2RlID09IEZXTF9WS0VZX0VzY2FwZTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiTGlzdEtleSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BMaXN0Qm94LT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIERpc0Zvcm1fT25LZXkoKENGV0xfTXNnS2V5KilwTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKCFiYWNrRGVmYXVsdCkgew0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6R2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQpIGNvbnN0IHsNCisgIGlmIChtX3BFZGl0KSB7DQorICAgIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KKyAgfSBlbHNlIGlmIChtX3BMaXN0Qm94KSB7DQorICAgIElGV0xfQ29tYm9Cb3hEUCogcERhdGEgPSAoSUZXTF9Db21ib0JveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIG1faUN1clNlbCk7DQorICAgIHJldHVybiBtX3BMaXN0Qm94LT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQogfQ0KLXZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpEaXNGb3JtX09uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIEZYX0JPT0wgYkRyb3BEb3duID0gbV9wT3duZXItPkRpc0Zvcm1fSXNEcm9wTGlzdFNob3dlZCgpOw0KLSAgICBDRlhfUmVjdEYmIHJ0QnRuID0gYkRyb3BEb3duID8gbV9wT3duZXItPm1fcnRCdG4gOiBtX3BPd25lci0+bV9ydENsaWVudDsNCi0gICAgRlhfQk9PTCBiQ2xpY2tCdG4gPSBydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgaWYgKGJDbGlja0J0bikgew0KLSAgICAgICAgaWYgKG1fcE93bmVyLT5EaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKSkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5EaXNGb3JtX1Nob3dEcm9wTGlzdChGQUxTRSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChtX3BPd25lci0+bV9wRWRpdCkgew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+TWF0Y2hFZGl0VGV4dCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX3BPd25lci0+RGlzRm9ybV9TaG93RHJvcExpc3QoVFJVRSk7DQotICAgICAgICB9DQotICAgIH0NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEVkaXRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICgoQ0ZXTF9Db21ib0VkaXQqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BFZGl0KS0+R2V0RGF0YSgpKS0+Q2xlYXJTZWxlY3RlZCgpOw0KKyAgbV9wRWRpdC0+QWRkU2VsUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi12b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6RGlzRm9ybV9PbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCkNCi17DQotICAgIElGV0xfVGFyZ2V0ICpwRHN0VGFyZ2V0ID0gcE1zZy0+bV9wRHN0VGFyZ2V0Ow0KLSAgICBJRldMX1RhcmdldCAqcFNyY1RhcmdldCA9IHBNc2ctPm1fcFNyY1RhcmdldDsNCi0gICAgRlhfQk9PTCBiRHJvcERvd24gPSBtX3BPd25lci0+SXNEcm9wRG93blN0eWxlKCk7DQotICAgIGlmIChiU2V0KSB7DQotICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRm9jdXNlZDsNCi0gICAgICAgIGlmICgobV9wT3duZXItPm1fcEVkaXQtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCi0gICAgICAgICAgICBDRldMX01zZ1NldEZvY3VzIG1zZzsNCi0gICAgICAgICAgICBtc2cubV9wRHN0VGFyZ2V0ID0gbV9wT3duZXItPm1fcEVkaXQ7DQotICAgICAgICAgICAgbXNnLm1fcFNyY1RhcmdldCA9IE5VTEw7DQotICAgICAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gbV9wT3duZXItPm1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KLSAgICAgICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZSgmbXNnKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRm9jdXNlZDsNCi0gICAgICAgIG1fcE93bmVyLT5EaXNGb3JtX1Nob3dEcm9wTGlzdChGQUxTRSk7DQotICAgICAgICBDRldMX01zZ0tpbGxGb2N1cyBtc2c7DQotICAgICAgICBtc2cubV9wRHN0VGFyZ2V0ID0gTlVMTDsNCi0gICAgICAgIG1zZy5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wRWRpdDsNCi0gICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BFZGl0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZSgmbXNnKTsNCi0gICAgfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveEltcDo6R2V0RWRpdFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90JiBuU3RhcnQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgLTEpOw0KKyAgcmV0dXJuIG1fcEVkaXQtPkdldFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCiB9DQotdm9pZCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6OkRpc0Zvcm1fT25LZXkoQ0ZXTF9Nc2dLZXkgKnBNc2cpDQotew0KLSAgICBGWF9EV09SRCBkd0tleUNvZGUgPSBwTXNnLT5tX2R3S2V5Q29kZTsNCi0gICAgRlhfQk9PTCBiVXAgPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfVXA7DQotICAgIEZYX0JPT0wgYkRvd24gPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfRG93bjsNCi0gICAgaWYgKGJVcCB8fCBiRG93bikgew0KLSAgICAgICAgQ0ZXTF9Db21ib0xpc3QqIHBDb21ib0xpc3QgPSAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopKG1fcE93bmVyLT5tX3BMaXN0Qm94KSktPkdldERhdGEoKSk7DQotICAgICAgICBpbnQzMl90IGlDb3VudCA9IHBDb21ib0xpc3QtPkNvdW50SXRlbXMoKTsNCi0gICAgICAgIGlmIChpQ291bnQgPCAxKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfQk9PTCBiTWF0Y2hFcXVhbCA9IEZBTFNFOw0KLSAgICAgICAgaW50MzJfdCBpQ3VyU2VsID0gbV9wT3duZXItPm1faUN1clNlbDsNCi0gICAgICAgIGlmIChtX3BPd25lci0+bV9wRWRpdCkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgICAgICAgICBtX3BPd25lci0+bV9wRWRpdC0+R2V0VGV4dCh3c1RleHQpOw0KLSAgICAgICAgICAgIGlDdXJTZWwgPSBwQ29tYm9MaXN0LT5NYXRjaEl0ZW0od3NUZXh0KTsNCi0gICAgICAgICAgICBpZiAoaUN1clNlbCA+PSAwKSB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCi0gICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBpdGVtID0gbV9wT3duZXItPm1fcExpc3RCb3gtPkdldFNlbEl0ZW0oaUN1clNlbCk7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BMaXN0Qm94LT5HZXRJdGVtVGV4dChpdGVtLCB3c1RlbXApOw0KLSAgICAgICAgICAgICAgICBiTWF0Y2hFcXVhbCA9IHdzVGV4dC5FcXVhbCh3c1RlbXApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpQ3VyU2VsIDwgMCkgew0KLSAgICAgICAgICAgIGlDdXJTZWwgPSAwOw0KLSAgICAgICAgfSBlbHNlIGlmIChiTWF0Y2hFcXVhbCkgew0KLSAgICAgICAgICAgIGlmICgoYlVwICYmIGlDdXJTZWwgPT0gMCkgfHwgKGJEb3duICYmIGlDdXJTZWwgPT0gaUNvdW50IC0gMSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoYlVwKSB7DQotICAgICAgICAgICAgICAgIGlDdXJTZWwgLS07DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaUN1clNlbCArKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBtX3BPd25lci0+bV9pQ3VyU2VsID0gaUN1clNlbDsNCi0gICAgICAgIG1fcE93bmVyLT5TeW5jaHJFZGl0VGV4dChtX3BPd25lci0+bV9pQ3VyU2VsKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAobV9wT3duZXItPm1fcEVkaXQpIHsNCi0gICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BFZGl0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCi0gICAgfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveEltcDo6R2V0RWRpdExpbWl0KCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZGl0LCAtMSk7DQorICByZXR1cm4gbV9wRWRpdC0+R2V0TGltaXQoKTsNCiB9DQotQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU6OkNGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlKElGV0xfRm9ybSAqcEZvcm0sIENGV0xfQ29tYm9Cb3hJbXAgKnBDb21ib0JveCkNCi0gICAgOiBtX3BGb3JtKHBGb3JtKQ0KLSAgICAsIG1fcENvbWJvQm94KHBDb21ib0JveCkNCi0gICAgLCBtX2JMQnV0dG9uRG93bihGQUxTRSkNCi0gICAgLCBtX2JMQnV0dG9uVXBTZWxmKEZBTFNFKQ0KLSAgICAsIG1fZlN0YXJ0UG9zKDApDQotew0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6U2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkaXQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gbV9wRWRpdC0+U2V0TGltaXQobkxpbWl0KTsNCiB9DQotaW50MzJfdCBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQotICAgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQotICAgIGlmIChkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfTW91c2UpIHsNCi0gICAgICAgIENGV0xfTXNnTW91c2UgKnBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQotICAgICAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQotICAgICAgICBzd2l0Y2goZHdDbWQpIHsNCi0gICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KLSAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uRG93bihwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQotICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQotICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9EZWFjdGl2YXRlKSB7DQotICAgICAgICBPbkRlYWN0aXZlKChDRldMX01zZ0RlYWN0aXZhdGUqKXBNZXNzYWdlKTsNCi0gICAgfQ0KLSAgICBpZiAoZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX0tpbGxGb2N1cyB8fCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpIHsNCi0gICAgICAgIE9uRm9jdXNDaGFuZ2VkKChDRldMX01zZ0tpbGxGb2N1cyopcE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6RWRpdERvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZGl0LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuIG1fcEVkaXQtPkRvQ2xpcGJvYXJkKGlDbWQpOw0KIH0NCi1GV0xfRVJSIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBtX3BDb21ib0JveC0+RHJhd1N0cmV0Y2hIYW5kbGVyKHBHcmFwaGljcywgcE1hdHJpeCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXRSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgRkFMU0UpOw0KKyAgcmV0dXJuIG1fcEVkaXQtPlJlZG8oYnNSZWNvcmQpOw0KIH0NCi12b2lkIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBtX3BGb3JtLT5HZXRPd25lclRocmVhZCgpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KLSAgICBDRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQotICAgIENGWF9SZWN0RiBydFdpZGdldDsNCi0gICAgbV9wRm9ybS0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQotICAgIHJ0V2lkZ2V0LmxlZnQgPSBydFdpZGdldC50b3AgPSAwOw0KLSAgICBpZiAocnRXaWRnZXQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgIG1fYkxCdXR0b25Eb3duID0gVFJVRTsNCi0gICAgICAgIHBEcml2ZXItPlNldEdyYWIobV9wRm9ybSwgVFJVRSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KLSAgICAgICAgcERyaXZlci0+U2V0R3JhYihtX3BGb3JtLCBGQUxTRSk7DQotICAgICAgICBtX3BDb21ib0JveC0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCi0gICAgICAgIHJldHVybjsNCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXRVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgRkFMU0UpOw0KKyAgcmV0dXJuIG1fcEVkaXQtPlVuZG8oYnNSZWNvcmQpOw0KK30NCitJRldMX0xpc3RCb3gqIENGV0xfQ29tYm9Cb3hJbXA6OkdldExpc3RCb3h0KCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BMaXN0Qm94LCBGQUxTRSk7DQorICByZXR1cm4gbV9wTGlzdEJveDsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpBZnRlckZvY3VzU2hvd0Ryb3BMaXN0KCkgew0KKyAgaWYgKCFtX2JOZWVkU2hvd0xpc3QpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgTWF0Y2hFZGl0VGV4dCgpOw0KKyAgfQ0KKyAgU2hvd0Ryb3BMaXN0KFRSVUUpOw0KKyAgbV9iTmVlZFNob3dMaXN0ID0gRkFMU0U7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfRVJSIENGV0xfQ29tYm9Cb3hJbXA6Ok9wZW5Ecm9wRG93bkxpc3QoRlhfQk9PTCBiQWN0aXZhdGUpIHsNCisgIFNob3dEcm9wTGlzdChiQWN0aXZhdGUpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXRDYW5VbmRvKCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkNhblVuZG8oKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0Q2FuUmVkbygpIHsNCisgIHJldHVybiBtX3BFZGl0LT5DYW5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6RWRpdFVuZG8oKSB7DQorICByZXR1cm4gbV9wRWRpdC0+VW5kbygpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXRSZWRvKCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPlJlZG8oKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0Q2FuQ29weSgpIHsNCisgIHJldHVybiBtX3BFZGl0LT5Db3VudFNlbFJhbmdlcygpID4gMDsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0Q2FuQ3V0KCkgew0KKyAgaWYgKG1fcEVkaXQtPkdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBtX3BFZGl0LT5Db3VudFNlbFJhbmdlcygpID4gMDsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0Q2FuU2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHRMZW5ndGgoKSA+IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6RWRpdENvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkNvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkN1dCh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6RWRpdFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKSB7DQorICByZXR1cm4gbV9wRWRpdC0+UGFzdGUod3NQYXN0ZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6RWRpdFNlbGVjdEFsbCgpIHsNCisgIHJldHVybiAobV9wRWRpdC0+QWRkU2VsUmFuZ2UoMCkgPT0gRldMX0VSUl9TdWNjZWVkZWQpID8gVFJVRSA6IEZBTFNFOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXREZWxldGUoKSB7DQorICByZXR1cm4gKG1fcEVkaXQtPkNsZWFyVGV4dCgpID09IEZXTF9FUlJfU3VjY2VlZGVkKSA/IFRSVUUgOiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0RGVTZWxlY3QoKSB7DQorICByZXR1cm4gKG1fcEVkaXQtPkNsZWFyU2VsZWN0aW9ucygpID09IEZXTF9FUlJfU3VjY2VlZGVkKSA/IFRSVUUgOiBGQUxTRTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpHZXRCQm94KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9HZXRCQm94KHJlY3QpOw0KKyAgfQ0KKyAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICBpZiAobV9wTGlzdEJveCAmJiBJc0Ryb3BMaXN0U2hvd2VkKCkpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0TGlzdDsNCisgICAgbV9wTGlzdEJveC0+R2V0V2lkZ2V0UmVjdChydExpc3QpOw0KKyAgICBydExpc3QuT2Zmc2V0KHJlY3QubGVmdCwgcmVjdC50b3ApOw0KKyAgICByZWN0LlVuaW9uKHJ0TGlzdCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6RWRpdE1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCkgew0KKyAgaWYgKG1fcEVkaXQgIT0gTlVMTCkgew0KKyAgICByZXR1cm4gbV9wRWRpdC0+TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorICB9IGVsc2Ugew0KKyAgICByZXR1cm4gRldMX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCisgIH0NCit9DQorRlhfRkxPQVQgQ0ZXTF9Db21ib0JveEltcDo6R2V0TGlzdEhlaWdodCgpIHsNCisgIHJldHVybiAoKElGV0xfQ29tYm9Cb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKQ0KKyAgICAgIC0+R2V0TGlzdEhlaWdodChtX3BJbnRlcmZhY2UpOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OkRyYXdTdHJldGNoSGFuZGxlcihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0NNQl9TdHJldGNnSGFuZGxlcjsNCisgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw7DQorICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0SGFuZGxlcjsNCisgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXItPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6U2hvd0Ryb3BMaXN0KEZYX0JPT0wgYkFjdGl2YXRlKSB7DQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHJldHVybiBEaXNGb3JtX1Nob3dEcm9wTGlzdChiQWN0aXZhdGUpOw0KKyAgfQ0KKyAgRlhfQk9PTCBiRHJvcExpc3QgPSBJc0Ryb3BMaXN0U2hvd2VkKCk7DQorICBpZiAoYkRyb3BMaXN0ID09IGJBY3RpdmF0ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoIW1fcEZvcm0pIHsNCisgICAgSW5pdFByb3h5Rm9ybSgpOw0KKyAgfQ0KKyAgbV9wTGlzdFByb3h5RGVsZWdhdGUtPlJlc2V0KCk7DQorICBpZiAoYkFjdGl2YXRlKSB7DQorICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKQ0KKyAgICAgICAgLT5DaGFuZ2VTZWxlY3RlZChtX2lDdXJTZWwpOw0KKyAgICBSZVNldExpc3RJdGVtQWxpZ25tZW50KCk7DQorICAgIEZYX0RXT1JEIGR3U3R5bGVBZGQgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGV0xfU1RZTEVFWFRfQ01CX1NvcnQgfCBGV0xfU1RZTEVFWFRfQ01CX093bmVyRHJhdyk7DQorICAgIG1fcExpc3RCb3gtPk1vZGlmeVN0eWxlc0V4KGR3U3R5bGVBZGQsIDApOw0KKyAgICBtX3BMaXN0Qm94LT5HZXRXaWRnZXRSZWN0KG1fcnRMaXN0LCBUUlVFKTsNCisgICAgRlhfRkxPQVQgZkhlaWdodCA9IEdldExpc3RIZWlnaHQoKTsNCisgICAgaWYgKGZIZWlnaHQgPiAwKSB7DQorICAgICAgaWYgKG1fcnRMaXN0LmhlaWdodCA+IEdldExpc3RIZWlnaHQoKSkgew0KKyAgICAgICAgbV9ydExpc3QuaGVpZ2h0ID0gR2V0TGlzdEhlaWdodCgpOw0KKyAgICAgICAgbV9wTGlzdEJveC0+TW9kaWZ5U3R5bGVzKEZXTF9XR1RTVFlMRV9WU2Nyb2xsLCAwKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgSUZXTF9BZGFwdGVyTmF0aXZlICpwTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCi0gICAgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyICpwQ3Vyc29yTWdyID0gcE5hdGl2ZS0+R2V0Q3Vyc29yTWdyKCk7DQotICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZU5TKTsNCi0gICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KLSAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KLSAgICBtX3BGb3JtLT5UcmFuc2Zvcm1UbyhOVUxMLCBwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgbV9mU3RhcnRQb3MgPSBwTXNnLT5tX2Z5Ow0KLX0NCi12b2lkIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpPbkxCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCisgICAgQ0ZYX1JlY3RGIHJ0QW5jaG9yOw0KKyAgICBydEFuY2hvci5TZXQoMCwgMCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgICAgRlhfRkxPQVQgZk1pbkhlaWdodCA9IDA7DQorICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQgPSBtX3J0TGlzdC5oZWlnaHQ7DQorICAgIGlmIChtX3J0TGlzdC53aWR0aCA8IG1fcnRDbGllbnQud2lkdGgpIHsNCisgICAgICBtX3J0TGlzdC53aWR0aCA9IG1fcnRDbGllbnQud2lkdGg7DQorICAgIH0NCisgICAgbV9ydFByb3h5ID0gbV9ydExpc3Q7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9MaXN0RHJhZykgew0KKyAgICAgIG1fcnRQcm94eS5oZWlnaHQgKz0gbV9mQ29tYm9Gb3JtSGFuZGxlcjsNCisgICAgfQ0KKyAgICBHZXRQb3B1cFBvcyhmTWluSGVpZ2h0LCBtX3J0UHJveHkuaGVpZ2h0LCBydEFuY2hvciwgbV9ydFByb3h5KTsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0xpc3REcmFnKSB7DQorICAgICAgRlhfRkxPQVQgZnggPSAwOw0KKyAgICAgIEZYX0ZMT0FUIGZ5ID0gbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDI7DQorICAgICAgVHJhbnNmb3JtVG8oTlVMTCwgZngsIGZ5KTsNCisgICAgICBtX2JVcEZvcm1IYW5kbGVyID0gZnkgPiBtX3J0UHJveHkudG9wOw0KKyAgICAgIGlmIChtX2JVcEZvcm1IYW5kbGVyKSB7DQorICAgICAgICBtX3J0SGFuZGxlci5TZXQoMCwgMCwgbV9ydExpc3Qud2lkdGgsIG1fZkNvbWJvRm9ybUhhbmRsZXIpOw0KKyAgICAgICAgbV9ydExpc3QudG9wID0gbV9mQ29tYm9Gb3JtSGFuZGxlcjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9ydEhhbmRsZXIuU2V0KDAsIG1fcnRMaXN0LmhlaWdodCwgbV9ydExpc3Qud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgbV9mQ29tYm9Gb3JtSGFuZGxlcik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG1fcEZvcm0tPlNldFdpZGdldFJlY3QobV9ydFByb3h5KTsNCisgICAgbV9wRm9ybS0+VXBkYXRlKCk7DQorICAgIG1fcExpc3RCb3gtPlNldFdpZGdldFJlY3QobV9ydExpc3QpOw0KKyAgICBtX3BMaXN0Qm94LT5VcGRhdGUoKTsNCisgICAgQ0ZXTF9FdnRDbWJQcmVEcm9wRG93biBldjsNCisgICAgZXYubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBEaXNwYXRjaEV2ZW50KCZldik7DQorICAgIG1fZkl0ZW1IZWlnaHQgPSAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAtPm1fZkl0ZW1IZWlnaHQ7DQorICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKQ0KKyAgICAgICAgLT5TZXRGb2N1cyhUUlVFKTsNCisgICAgbV9wRm9ybS0+RG9Nb2RhbCgpOw0KKyAgICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSkNCisgICAgICAgIC0+U2V0Rm9jdXMoRkFMU0UpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wRm9ybS0+RW5kRG9Nb2RhbCgpOw0KKyAgICBDRldMX0V2dENtYkNsb3NlVXAgZXY7DQorICAgIGV2Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgRGlzcGF0Y2hFdmVudCgmZXYpOw0KICAgICBtX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KLSAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBtX3BGb3JtLT5HZXRPd25lclRocmVhZCgpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KLSAgICBDRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKQ0KKyAgICAgICAgLT5tX2JOb3RpZnlPd25lciA9IFRSVUU7DQorICAgIFNldEZvY3VzKFRSVUUpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OklzRHJvcExpc3RTaG93ZWQoKSB7DQorICByZXR1cm4gbV9wRm9ybSAmJiAhKG1fcEZvcm0tPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6SXNEcm9wRG93blN0eWxlKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6Ok1hdGNoRWRpdFRleHQoKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBtX3BFZGl0LT5HZXRUZXh0KHdzVGV4dCk7DQorICBpbnQzMl90IGlNYXRjaCA9ICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgLT5NYXRjaEl0ZW0od3NUZXh0KTsNCisgIGlmIChpTWF0Y2ggIT0gbV9pQ3VyU2VsKSB7DQorICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKQ0KKyAgICAgICAgLT5DaGFuZ2VTZWxlY3RlZChpTWF0Y2gpOw0KKyAgICBpZiAoaU1hdGNoID49IDApIHsNCisgICAgICBTeW5jaHJFZGl0VGV4dChpTWF0Y2gpOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKGlNYXRjaCA+PSAwKSB7DQorICAgICgoQ0ZXTF9Db21ib0VkaXQqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BFZGl0KS0+R2V0RGF0YSgpKS0+U2V0U2VsZWN0ZWQoKTsNCisgIH0NCisgIG1faUN1clNlbCA9IGlNYXRjaDsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpTeW5jaHJFZGl0VGV4dChpbnQzMl90IGlMaXN0SXRlbSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgSUZXTF9Db21ib0JveERQKiBwRGF0YSA9IChJRldMX0NvbWJvQm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGlMaXN0SXRlbSk7DQorICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSkNCisgICAgICAtPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KKyAgbV9wRWRpdC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgbV9wRWRpdC0+VXBkYXRlKCk7DQorICAoKENGV0xfQ29tYm9FZGl0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wRWRpdCktPkdldERhdGEoKSktPlNldFNlbGVjdGVkKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6TGF5b3V0KCkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9MYXlvdXQoKTsNCisgIH0NCisgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQorICBGWF9GTE9BVCogcEZXaWR0aCA9DQorICAgICAgKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBGV2lkdGgpOw0KKyAgRlhfRkxPQVQgZkJ0biA9ICpwRldpZHRoOw0KKyAgbV9ydEJ0bi5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gZkJ0biwgbV9ydENsaWVudC50b3AsIGZCdG4sDQorICAgICAgICAgICAgICBtX3J0Q2xpZW50LmhlaWdodCk7DQorICBGWF9CT09MIGJJc0Ryb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQorICBpZiAoYklzRHJvcERvd24gJiYgbV9wRWRpdCkgew0KKyAgICBDRlhfUmVjdEYgcnRFZGl0Ow0KKyAgICBydEVkaXQuU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC50b3AsIG1fcnRDbGllbnQud2lkdGggLSBmQnRuLA0KKyAgICAgICAgICAgICAgIG1fcnRDbGllbnQuaGVpZ2h0KTsNCisgICAgbV9wRWRpdC0+U2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KKyAgICBpZiAobV9pQ3VyU2VsID49IDApIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgSUZXTF9Db21ib0JveERQKiBwRGF0YSA9IChJRldMX0NvbWJvQm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBtX2lDdXJTZWwpOw0KKyAgICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKQ0KKyAgICAgICAgICAtPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KKyAgICAgIG1fcEVkaXQtPkxvY2tVcGRhdGUoKTsNCisgICAgICBtX3BFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQorICAgICAgbV9wRWRpdC0+VW5sb2NrVXBkYXRlKCk7DQorICAgIH0NCisgICAgbV9wRWRpdC0+VXBkYXRlKCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6UmVTZXRUaGVtZSgpIHsNCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIGlmICghcFRoZW1lKSB7DQorICAgIHBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBwVGhlbWU7DQorICB9DQorICBpZiAobV9wTGlzdEJveCkgew0KKyAgICBpZiAoIW1fcExpc3RCb3gtPkdldFRoZW1lUHJvdmlkZXIoKSAmJiBwVGhlbWUtPklzVmFsaWRXaWRnZXQobV9wTGlzdEJveCkpIHsNCisgICAgICBtX3BMaXN0Qm94LT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZSk7DQorICAgIH0NCisgIH0NCisgIGlmIChtX3BFZGl0KSB7DQorICAgIGlmICghbV9wRWRpdC0+R2V0VGhlbWVQcm92aWRlcigpICYmIHBUaGVtZS0+SXNWYWxpZFdpZGdldChtX3BFZGl0KSkgew0KKyAgICAgIG1fcEVkaXQtPlNldFRoZW1lUHJvdmlkZXIocFRoZW1lKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OlJlU2V0RWRpdEFsaWdubWVudCgpIHsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wRWRpdCk7DQorICBGWF9EV09SRCBkd1N0eWxFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCisgIEZYX0RXT1JEIGR3QWRkID0gMDsNCisgIHN3aXRjaCAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhBbGlnbk1hc2spIHsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIQ2VudGVyOiB7DQorICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9IQ2VudGVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NNQl9FZGl0SEZhcjogew0KKyAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfSEZhcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfSE5lYXI7IH0NCisgIH0NCisgIHN3aXRjaCAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZBbGlnbk1hc2spIHsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWQ2VudGVyOiB7DQorICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9WQ2VudGVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NNQl9FZGl0VkZhcjogew0KKyAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfVkZhcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfVk5lYXI7IH0NCisgIH0NCisgIGlmIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9FZGl0SnVzdGlmaWVkKSB7DQorICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfSnVzdGlmaWVkOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bEV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0VkaXREaXN0cmlidXRlZCkgew0KKyAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX0Rpc3RyaWJ1dGVkOw0KKyAgfQ0KKyAgbV9wRWRpdC0+TW9kaWZ5U3R5bGVzRXgoZHdBZGQsIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTWFzayB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTW9kZU1hc2sgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfRURUX1ZBbGlnbk1hc2spOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OlJlU2V0TGlzdEl0ZW1BbGlnbm1lbnQoKSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcExpc3RCb3gpOw0KKyAgRlhfRFdPUkQgZHdTdHlsRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorICBGWF9EV09SRCBkd0FkZCA9IDA7DQorICBzd2l0Y2ggKGR3U3R5bEV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtQWxpZ25NYXNrKSB7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUNlbnRlckFsaWduOiB7DQorICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0xUQl9DZW50ZXJBbGlnbjsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1SaWdodEFsaWduOiB7DQorICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0xUQl9SaWdodEFsaWduOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0xUQl9MZWZ0QWxpZ247IH0NCisgIH0NCisgIG1fcExpc3RCb3gtPk1vZGlmeVN0eWxlc0V4KGR3QWRkLCBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtQWxpZ25NYXNrKTsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpQcm9jZXNzU2VsQ2hhbmdlZChGWF9CT09MIGJMQnV0dG9uVXApIHsNCisgIElGV0xfQ29tYm9Cb3hEUCogcERhdGFzID0gKElGV0xfQ29tYm9Cb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgbV9pQ3VyU2VsID0gcERhdGFzLT5HZXRJdGVtSW5kZXgobV9wSW50ZXJmYWNlLCBtX3BMaXN0Qm94LT5HZXRTZWxJdGVtKDApKTsNCisgIEZYX0JPT0wgYkRyb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQorICBpZiAoYkRyb3BEb3duKSB7DQorICAgIElGV0xfQ29tYm9Cb3hEUCogcERhdGEgPSAoSUZXTF9Db21ib0JveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIG1faUN1clNlbCk7DQorICAgIGlmIChoSXRlbSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICBwRGF0YS0+R2V0SXRlbVRleHQobV9wSW50ZXJmYWNlLCBoSXRlbSwgd3NUZXh0KTsNCisgICAgICBpZiAobV9wRWRpdCkgew0KKyAgICAgICAgbV9wRWRpdC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgICAgICAgbV9wRWRpdC0+VXBkYXRlKCk7DQorICAgICAgICAoKENGV0xfQ29tYm9FZGl0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wRWRpdCktPkdldERhdGEoKSkNCisgICAgICAgICAgICAtPlNldFNlbGVjdGVkKCk7DQorICAgICAgfQ0KKyAgICAgIENGV0xfRXZ0Q21iU2VsQ2hhbmdlZCBldjsNCisgICAgICBldi5iTEJ1dHRvblVwID0gYkxCdXR0b25VcDsNCisgICAgICBldi5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgZXYuaUFycmF5U2Vscy5BZGQobV9pQ3VyU2VsKTsNCisgICAgICBEaXNwYXRjaEV2ZW50KCZldik7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OkluaXRQcm94eUZvcm0oKSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKCFtX3BGb3JtKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wTGlzdEJveCk7DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcEZvcm07DQorICBwcm9wRm9ybS5tX3BPd25lciA9IG1fcEludGVyZmFjZTsNCisgIHByb3BGb3JtLm1fZHdTdHlsZXMgPSBGV0xfV0dUU1RZTEVfUG9wdXA7DQorICBwcm9wRm9ybS5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCisgIG1fcFByb3h5ID0gRlhfTkVXIENGV0xfRm9ybVByb3h5SW1wKHByb3BGb3JtLCBtX3BMaXN0Qm94KTsNCisgIG1fcEZvcm0gPSBJRldMX0Zvcm06OkNyZWF0ZSgpOw0KKyAgbV9wUHJveHktPlNldEludGVyZmFjZShtX3BGb3JtKTsNCisgICgoSUZXTF9UYXJnZXREYXRhKiltX3BGb3JtKS0+U2V0RGF0YShtX3BQcm94eSk7DQorICBtX3BQcm94eS0+SW5pdGlhbGl6ZSgpOw0KKyAgbV9wTGlzdEJveC0+U2V0UGFyZW50KChJRldMX1dpZGdldCopbV9wRm9ybSk7DQorICBtX3BMaXN0UHJveHlEZWxlZ2F0ZSA9IEZYX05FVyBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZShtX3BGb3JtLCB0aGlzKTsNCisgIG1fcFByb3h5LT5TZXREZWxlZ2F0ZSgoSUZXTF9XaWRnZXREZWxlZ2F0ZSopbV9wTGlzdFByb3h5RGVsZWdhdGUpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fSW5pdGlhbGl6ZSgpIHsNCisgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKTsNCisgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKUZYX05FVyBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGUodGhpcyk7DQorICBEaXNGb3JtX0luaXRDb21ib0xpc3QoKTsNCisgIERpc0Zvcm1fSW5pdENvbWJvRWRpdCgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fSW5pdENvbWJvTGlzdCgpIHsNCisgIGlmIChtX3BMaXN0Qm94KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgcHJvcC5tX3BQYXJlbnQgPSAoSUZXTF9XaWRnZXQqKXRoaXMtPm1fcEludGVyZmFjZTsNCisgIHByb3AubV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9Cb3JkZXIgfCBGV0xfV0dUU1RZTEVfVlNjcm9sbDsNCisgIHByb3AubV9kd1N0YXRlcyA9IEZXTF9XR1RTVEFURV9JbnZpc2libGU7DQorICBwcm9wLm1fcERhdGFQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIHByb3AubV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBDRldMX0NvbWJvTGlzdCogcExpc3QgPSBGWF9ORVcgQ0ZXTF9Db21ib0xpc3QocHJvcCwgbV9wSW50ZXJmYWNlKTsNCisgIG1fcExpc3RCb3ggPSBJRldMX0xpc3RCb3g6OkNyZWF0ZSgpOw0KKyAgcExpc3QtPlNldEludGVyZmFjZShtX3BMaXN0Qm94KTsNCisgICgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+U2V0RGF0YShwTGlzdCk7DQorICBwTGlzdC0+SW5pdGlhbGl6ZSgpOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fSW5pdENvbWJvRWRpdCgpIHsNCisgIGlmIChtX3BFZGl0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgcHJvcC5tX3BQYXJlbnQgPSAoSUZXTF9XaWRnZXQqKXRoaXMtPm1fcEludGVyZmFjZTsNCisgIHByb3AubV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duKSA9PSAwKSB7DQorICB9DQorICBDRldMX0NvbWJvRWRpdCogcEVkaXQgPSBGWF9ORVcgQ0ZXTF9Db21ib0VkaXQocHJvcCwgbV9wSW50ZXJmYWNlKTsNCisgIG1fcEVkaXQgPSBJRldMX0VkaXQ6OkNyZWF0ZSgpOw0KKyAgcEVkaXQtPlNldEludGVyZmFjZShtX3BFZGl0KTsNCisgICgoSUZXTF9UYXJnZXREYXRhKiltX3BFZGl0KS0+U2V0RGF0YShwRWRpdCk7DQorICBwRWRpdC0+SW5pdGlhbGl6ZSgpOw0KKyAgcEVkaXQtPlNldE91dGVyKG1fcEludGVyZmFjZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9TaG93RHJvcExpc3QoRlhfQk9PTCBiQWN0aXZhdGUpIHsNCisgIEZYX0JPT0wgYkRyb3BMaXN0ID0gRGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCk7DQorICBpZiAoYkRyb3BMaXN0ID09IGJBY3RpdmF0ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYkFjdGl2YXRlKSB7DQorICAgIENGV0xfRXZ0Q21iUHJlRHJvcERvd24gcHJlRXZlbnQ7DQorICAgIHByZUV2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgRGlzcGF0Y2hFdmVudCgmcHJlRXZlbnQpOw0KKyAgICBDRldMX0NvbWJvTGlzdCogcENvbWJvTGlzdCA9DQorICAgICAgICAoQ0ZXTF9Db21ib0xpc3QqKSgoKElGV0xfVGFyZ2V0RGF0YSopbV9wTGlzdEJveCktPkdldERhdGEoKSk7DQorICAgIGludDMyX3QgaUl0ZW1zID0gcENvbWJvTGlzdC0+Q291bnRJdGVtcygpOw0KKyAgICBpZiAoaUl0ZW1zIDwgMSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBSZVNldExpc3RJdGVtQWxpZ25tZW50KCk7DQorICAgIHBDb21ib0xpc3QtPkNoYW5nZVNlbGVjdGVkKG1faUN1clNlbCk7DQorICAgIEZYX0ZMT0FUIGZJdGVtSGVpZ2h0ID0gcENvbWJvTGlzdC0+R2V0SXRlbUhlaWd0KCk7DQorICAgIEZYX0ZMT0FUIGZCb3JkZXIgPSBHZXRCb3JkZXJTaXplKCk7DQorICAgIEZYX0RXT1JEIG5XaGVyZSA9IDA7DQorICAgIEZYX0ZMT0FUIGZQb3B1cFJldCA9IDAuMGY7DQorICAgIEZYX0ZMT0FUIGZQb3B1cE1pbiA9IDAuMGY7DQorICAgIGlmIChpSXRlbXMgPiAzKSB7DQorICAgICAgZlBvcHVwTWluID0gZkl0ZW1IZWlnaHQgKiAzICsgZkJvcmRlciAqIDI7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlBvcHVwTWF4ID0gZkl0ZW1IZWlnaHQgKiBpSXRlbXMgKyBmQm9yZGVyICogMjsNCisgICAgQ0ZYX1JlY3RGIHJ0TGlzdDsNCisgICAgcnRMaXN0LmxlZnQgPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgIHJ0TGlzdC53aWR0aCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGg7DQorICAgIHJ0TGlzdC50b3AgPSAwOw0KKyAgICBydExpc3QuaGVpZ2h0ID0gMDsNCisgICAgR2V0UG9wdXBQb3MoZlBvcHVwTWluLCBmUG9wdXBNYXgsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQsIHJ0TGlzdCk7DQorICAgIG1fcExpc3RCb3gtPlNldFdpZGdldFJlY3QocnRMaXN0KTsNCisgICAgbV9wTGlzdEJveC0+VXBkYXRlKCk7DQorICB9IGVsc2Ugew0KKyAgICBTZXRGb2N1cyhUUlVFKTsNCisgIH0NCisgIG1fcExpc3RCb3gtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCAhYkFjdGl2YXRlKTsNCisgIGlmIChiQWN0aXZhdGUpIHsNCisgICAgQ0ZXTF9FdnRDbWJQb3N0RHJvcERvd24gcG9zdEV2ZW50Ow0KKyAgICBwb3N0RXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBEaXNwYXRjaEV2ZW50KCZwb3N0RXZlbnQpOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICBtX3BMaXN0Qm94LT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgcmVjdC5JbmZsYXRlKDIsIDIpOw0KKyAgUmVwYWludCgmcmVjdCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCkgew0KKyAgcmV0dXJuICEobV9wTGlzdEJveC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpEaXNGb3JtX01vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpIHsNCisgIGlmICghbV9wRWRpdCkgew0KKyAgICBEaXNGb3JtX0luaXRDb21ib0VkaXQoKTsNCisgIH0NCisgIEZYX0JPT0wgYkFkZERyb3BEb3duID0gZHdTdHlsZXNFeEFkZGVkICYgRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsNCisgIEZYX0JPT0wgYkRlbERyb3BEb3duID0gZHdTdHlsZXNFeFJlbW92ZWQgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KKyAgZHdTdHlsZXNFeFJlbW92ZWQgJj0gfkZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd247DQorICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzIHw9IEZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd247DQorICBpZiAoYkFkZERyb3BEb3duKSB7DQorICAgIG1fcEVkaXQtPk1vZGlmeVN0eWxlc0V4KDAsIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpOw0KKyAgfSBlbHNlIGlmIChiRGVsRHJvcERvd24pIHsNCisgICAgbV9wRWRpdC0+TW9kaWZ5U3R5bGVzRXgoRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSwgMCk7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6Ok1vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fVXBkYXRlKCkgew0KKyAgaWYgKG1faUxvY2spIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIGlmIChtX3BFZGl0KSB7DQorICAgIFJlU2V0RWRpdEFsaWdubWVudCgpOw0KKyAgfQ0KKyAgUmVTZXRUaGVtZSgpOw0KKyAgTGF5b3V0KCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgcmVjdC5TZXQoMCwgMCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCAtIG1fcnRCdG4ud2lkdGgsDQorICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQorICBpZiAocmVjdC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9FZGl0Ow0KKyAgfQ0KKyAgaWYgKG1fcnRCdG4uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgfQ0KKyAgaWYgKERpc0Zvcm1fSXNEcm9wTGlzdFNob3dlZCgpKSB7DQorICAgIG1fcExpc3RCb3gtPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpEaXNGb3JtX0RyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgQ0ZYX01hdHJpeCBtdE9yZzsNCisgIG10T3JnLlNldCgxLCAwLCAwLCAxLCAwLCAwKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIG10T3JnID0gKnBNYXRyaXg7DQorICB9DQorICBGWF9CT09MIGJMaXN0U2hvd2VkID0gbV9wTGlzdEJveCAmJiBEaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKTsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIHBHcmFwaGljcy0+Q29uY2F0TWF0cml4KCZtdE9yZyk7DQorICBpZiAoIW1fcnRCdG4uSXNFbXB0eSgwLjFmKSkgew0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgcGFyYW0ubV9wV2lkZ2V0ID0gKElGV0xfV2lkZ2V0Kil0aGlzLT5tX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DTUJfRHJvcERvd25CdXR0b247DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX2lCdG5TdGF0ZTsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydEJ0bjsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgfQ0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0RWRpdDsNCisgICAgbV9wRWRpdC0+R2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KKyAgICBDRlhfTWF0cml4IG10Ow0KKyAgICBtdC5TZXQoMSwgMCwgMCwgMSwgcnRFZGl0LmxlZnQsIHJ0RWRpdC50b3ApOw0KKyAgICBtdC5Db25jYXQobXRPcmcpOw0KKyAgICBtX3BFZGl0LT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgJm10KTsNCisgIH0NCisgIGlmIChiTGlzdFNob3dlZCkgew0KKyAgICBDRlhfUmVjdEYgcnRMaXN0Ow0KKyAgICBtX3BMaXN0Qm94LT5HZXRXaWRnZXRSZWN0KHJ0TGlzdCk7DQorICAgIENGWF9NYXRyaXggbXQ7DQorICAgIG10LlNldCgxLCAwLCAwLCAxLCBydExpc3QubGVmdCwgcnRMaXN0LnRvcCk7DQorICAgIG10LkNvbmNhdChtdE9yZyk7DQorICAgIG1fcExpc3RCb3gtPkRyYXdXaWRnZXQocEdyYXBoaWNzLCAmbXQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fR2V0QkJveChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgaWYgKG1fcExpc3RCb3ggJiYgRGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCkpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0TGlzdDsNCisgICAgbV9wTGlzdEJveC0+R2V0V2lkZ2V0UmVjdChydExpc3QpOw0KKyAgICBydExpc3QuT2Zmc2V0KHJlY3QubGVmdCwgcmVjdC50b3ApOw0KKyAgICByZWN0LlVuaW9uKHJ0TGlzdCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9MYXlvdXQoKSB7DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgbV9ydENvbnRlbnQgPSBtX3J0Q2xpZW50Ow0KKyAgRlhfRkxPQVQqIHBGV2lkdGggPQ0KKyAgICAgIChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRldpZHRoKTsNCisgIEZYX0ZMT0FUIGJvcmRlcldpZHRoID0gMDsNCisgIHsgYm9yZGVyV2lkdGggPSBGV0xfUEFSVF9DTUJfQm9yZGVyOyB9DQorICBGWF9GTE9BVCBmQnRuID0gKnBGV2lkdGg7DQorICBpZiAoISh0aGlzLT5HZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0NNQl9SZWFkT25seSkpIHsNCisgICAgbV9ydEJ0bi5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gZkJ0biwgbV9ydENsaWVudC50b3AgKyBib3JkZXJXaWR0aCwNCisgICAgICAgICAgICAgICAgZkJ0biAtIGJvcmRlcldpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCAtIDIgKiBib3JkZXJXaWR0aCk7DQorICB9DQorICBDRlhfUmVjdEYqIHBVSU1hcmdpbiA9IChDRlhfUmVjdEYqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1VJTWFyZ2luKTsNCisgIGlmIChwVUlNYXJnaW4pIHsNCisgICAgbV9ydENvbnRlbnQuRGVmbGF0ZShwVUlNYXJnaW4tPmxlZnQsIHBVSU1hcmdpbi0+dG9wLCBwVUlNYXJnaW4tPndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBVSU1hcmdpbi0+aGVpZ2h0KTsNCisgIH0NCisgIEZYX0JPT0wgYklzRHJvcERvd24gPSBJc0Ryb3BEb3duU3R5bGUoKTsNCisgIGlmIChiSXNEcm9wRG93biAmJiBtX3BFZGl0KSB7DQorICAgIENGWF9SZWN0RiBydEVkaXQ7DQorICAgIHJ0RWRpdC5TZXQobV9ydENvbnRlbnQubGVmdCwgbV9ydENvbnRlbnQudG9wLCBtX3J0Q29udGVudC53aWR0aCAtIGZCdG4sDQorICAgICAgICAgICAgICAgbV9ydENvbnRlbnQuaGVpZ2h0KTsNCisgICAgbV9wRWRpdC0+U2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KKyAgICBpZiAobV9pQ3VyU2VsID49IDApIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgSUZXTF9Db21ib0JveERQKiBwRGF0YSA9IChJRldMX0NvbWJvQm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBtX2lDdXJTZWwpOw0KKyAgICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BMaXN0Qm94KS0+R2V0RGF0YSgpKQ0KKyAgICAgICAgICAtPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KKyAgICAgIG1fcEVkaXQtPkxvY2tVcGRhdGUoKTsNCisgICAgICBtX3BFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQorICAgICAgbV9wRWRpdC0+VW5sb2NrVXBkYXRlKCk7DQorICAgIH0NCisgICAgbV9wRWRpdC0+VXBkYXRlKCk7DQorICB9DQorfQ0KK0NGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6Q0ZXTF9Db21ib0JveEltcERlbGVnYXRlKENGV0xfQ29tYm9Cb3hJbXAqIHBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpIHt9DQoraW50MzJfdCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKG1fcE93bmVyLT5tX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgcmV0dXJuIERpc0Zvcm1fT25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICB9DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBGWF9CT09MIGlSZXQgPSAxOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCisgICAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQorICAgICAgc3dpdGNoIChkd0NtZCkgew0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCisgICAgICAgICAgT25MQnV0dG9uRG93bihwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQorICAgICAgICAgIE9uTW91c2VNb3ZlKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmU6IHsNCisgICAgICAgICAgT25Nb3VzZUxlYXZlKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHt9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQorICAgICAgT25LZXkoKENGV0xfTXNnS2V5KilwTWVzc2FnZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyBpUmV0ID0gMDsgfQ0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgew0KKyAgRlhfRFdPUkQgZHdGbGFnID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQorICBpZiAoZHdGbGFnID09IEZXTF9FVlRIQVNIX0xUQl9EcmF3SXRlbSkgew0KKyAgICBDRldMX0V2dENtYkRyYXdJdGVtIHBUZW1wOw0KKyAgICBwVGVtcC5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICBwVGVtcC5tX3BHcmFwaGljcyA9ICgoQ0ZXTF9FdnRMdGJEcmF3SXRlbSopcEV2ZW50KS0+bV9wR3JhcGhpY3M7DQorICAgIHBUZW1wLm1faW5kZXggPSAoKENGV0xfRXZ0THRiRHJhd0l0ZW0qKXBFdmVudCktPm1faW5kZXg7DQorICAgIHBUZW1wLm1fcnRJdGVtID0gKChDRldMX0V2dEx0YkRyYXdJdGVtKilwRXZlbnQpLT5tX3JlY3Q7DQorICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZwVGVtcCk7DQorICB9IGVsc2UgaWYgKGR3RmxhZyA9PSBGV0xfRVZUSEFTSF9TY3JvbGwpIHsNCisgICAgRlhfRFdPUkQgZHdTY3JvbGxDb2RlID0gKChDRldMX0V2dFNjcm9sbCopcEV2ZW50KS0+bV9pU2Nyb2xsQ29kZTsNCisgICAgRlhfRkxPQVQgZlBvcyA9ICgoQ0ZXTF9FdnRTY3JvbGwqKXBFdmVudCktPm1fZlBvczsNCisgICAgQ0ZXTF9FdnRTY3JvbGwgcFNjcm9sbEV2Ow0KKyAgICBwU2Nyb2xsRXYubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCisgICAgcFNjcm9sbEV2Lm1faVNjcm9sbENvZGUgPSBkd1Njcm9sbENvZGU7DQorICAgIHBTY3JvbGxFdi5tX2ZQb3MgPSBmUG9zOw0KKyAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmcFNjcm9sbEV2KTsNCisgIH0gZWxzZSBpZiAoZHdGbGFnID09IEZXTF9FVlRIQVNIX0VEVF9UZXh0Q2hhbmdlZCkgew0KKyAgICBDRldMX0V2dENtYkVkaXRDaGFuZ2VkIHBUZW1wOw0KKyAgICBwVGVtcC5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICBwVGVtcC53c0luc2VydCA9ICgoQ0ZXTF9FdnRFZHRUZXh0Q2hhbmdlZCopcEV2ZW50KS0+d3NJbnNlcnQ7DQorICAgIHBUZW1wLndzRGVsZXRlID0gKChDRldMX0V2dEVkdFRleHRDaGFuZ2VkKilwRXZlbnQpLT53c0RlbGV0ZTsNCisgICAgcFRlbXAubkNoYW5nZVR5cGUgPSAoKENGV0xfRXZ0RWR0VGV4dENoYW5nZWQqKXBFdmVudCktPm5DaGFuZ2VUeXBlOw0KKyAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmcFRlbXApOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldCkgew0KKyAgSUZXTF9UYXJnZXQqIHBEc3RUYXJnZXQgPSBwTXNnLT5tX3BEc3RUYXJnZXQ7DQorICBJRldMX1RhcmdldCogcFNyY1RhcmdldCA9IHBNc2ctPm1fcFNyY1RhcmdldDsNCisgIEZYX0JPT0wgYkRyb3BEb3duID0gbV9wT3duZXItPklzRHJvcERvd25TdHlsZSgpOw0KKyAgaWYgKGJTZXQpIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIGlmIChiRHJvcERvd24gJiYgcFNyY1RhcmdldCAhPSAoSUZXTF9XaWRnZXQqKW1fcE93bmVyLT5tX3BMaXN0Qm94KSB7DQorICAgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BPd25lci0+bV9wRWRpdCk7DQorICAgICAgKChDRldMX0NvbWJvRWRpdCopKChJRldMX1RhcmdldERhdGEqKW1fcE93bmVyLT5tX3BFZGl0KS0+R2V0RGF0YSgpKQ0KKyAgICAgICAgICAtPlNldFNlbGVjdGVkKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICBpZiAoYkRyb3BEb3duICYmIHBEc3RUYXJnZXQgIT0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wTGlzdEJveCkgew0KKyAgICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wT3duZXItPm1fcEVkaXQpOw0KKyAgICAgICgoQ0ZXTF9Db21ib0VkaXQqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wRWRpdCktPkdldERhdGEoKSkNCisgICAgICAgICAgLT5GbGFnRm9jdXMoRkFMU0UpOw0KKyAgICAgICgoQ0ZXTF9Db21ib0VkaXQqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wRWRpdCktPkdldERhdGEoKSkNCisgICAgICAgICAgLT5DbGVhclNlbGVjdGVkKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiRHJvcERvd24gPSBtX3BPd25lci0+SXNEcm9wRG93blN0eWxlKCk7DQorICBDRlhfUmVjdEYmIHJ0QnRuID0gYkRyb3BEb3duID8gbV9wT3duZXItPm1fcnRCdG4gOiBtX3BPd25lci0+bV9ydENsaWVudDsNCisgIEZYX0JPT0wgYkNsaWNrQnRuID0gcnRCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICBpZiAoYkNsaWNrQnRuKSB7DQorICAgIGlmIChiRHJvcERvd24gJiYgbV9wT3duZXItPm1fcEVkaXQpIHsNCisgICAgICBtX3BPd25lci0+TWF0Y2hFZGl0VGV4dCgpOw0KKyAgICB9DQorICAgIG1fcE93bmVyLT5tX2JMQnV0dG9uRG93biA9IFRSVUU7DQorICAgIG1fcE93bmVyLT5tX2lCdG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfQ01CX1ByZXNzZWQ7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgIG1fcE93bmVyLT5TaG93RHJvcExpc3QoVFJVRSk7DQorICAgIG1fcE93bmVyLT5tX2lCdG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfQ01CX05vcm1hbDsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgIH0NCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIG1fcE93bmVyLT5tX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KKyAgaWYgKG1fcE93bmVyLT5tX3J0QnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIG1fcE93bmVyLT5tX2lCdG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfQ01CX0hvdmVyZWQ7DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw7DQorICB9DQorICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRCdG4pOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgaW50MzJfdCBpT2xkU3RhdGUgPSBtX3BPd25lci0+bV9pQnRuU3RhdGU7DQorICBpZiAobV9wT3duZXItPm1fcnRCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gbV9wT3duZXItPm1fYkxCdXR0b25Eb3duDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZXTF9QQVJUU1RBVEVfQ01CX1ByZXNzZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMX1BBUlRTVEFURV9DTUJfSG92ZXJlZDsNCisgIH0gZWxzZSB7DQorICAgIG1fcE93bmVyLT5tX2lCdG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfQ01CX05vcm1hbDsNCisgIH0NCisgIGlmICgoaU9sZFN0YXRlICE9IG1fcE93bmVyLT5tX2lCdG5TdGF0ZSkgJiYNCisgICAgICAhKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgPT0NCisgICAgICAgIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0QnRuKTsNCisgIH0NCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6Ok9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAoIW1fcE93bmVyLT5Jc0Ryb3BMaXN0U2hvd2VkKCkgJiYNCisgICAgICAhKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgPT0NCisgICAgICAgIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCisgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRCdG4pOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25LZXkoQ0ZXTF9Nc2dLZXkqIHBNc2cpIHsNCisgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBNc2ctPm1fZHdLZXlDb2RlOw0KKyAgaWYgKGR3S2V5Q29kZSA9PSBGV0xfVktFWV9UYWIpIHsNCisgICAgbV9wT3duZXItPkRpc3BhdGNoS2V5RXZlbnQocE1zZyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYlN1YkN0cmxLZXkgPSBwTXNnLT5tX3BEc3RUYXJnZXQgPT0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCisgIGlmIChiU3ViQ3RybEtleSkgew0KKyAgICBEb1N1YkN0cmxLZXkocE1zZyk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpEb1N1YkN0cmxLZXkoQ0ZXTF9Nc2dLZXkqIHBNc2cpIHsNCisgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBNc2ctPm1fZHdLZXlDb2RlOw0KKyAgRlhfQk9PTCBiVXAgPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfVXA7DQorICBGWF9CT09MIGJEb3duID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX0Rvd247DQorICBpZiAoYlVwIHx8IGJEb3duKSB7DQorICAgIGludDMyX3QgaUNvdW50ID0NCisgICAgICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wTGlzdEJveCktPkdldERhdGEoKSkNCisgICAgICAgICAgICAtPkNvdW50SXRlbXMoKTsNCisgICAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhfQk9PTCBiTWF0Y2hFcXVhbCA9IEZBTFNFOw0KKyAgICBpbnQzMl90IGlDdXJTZWwgPSBtX3BPd25lci0+bV9pQ3VyU2VsOw0KKyAgICBGWF9CT09MIGJEcm9wRG93biA9IG1fcE93bmVyLT5Jc0Ryb3BEb3duU3R5bGUoKTsNCisgICAgaWYgKGJEcm9wRG93biAmJiBtX3BPd25lci0+bV9wRWRpdCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICBtX3BPd25lci0+bV9wRWRpdC0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICAgIGlDdXJTZWwgPQ0KKyAgICAgICAgICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcExpc3RCb3gpLT5HZXREYXRhKCkpDQorICAgICAgICAgICAgICAtPk1hdGNoSXRlbSh3c1RleHQpOw0KKyAgICAgIGlmIChpQ3VyU2VsID49IDApIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgICAgIElGV0xfQ29tYm9Cb3hEUCogcERhdGEgPQ0KKyAgICAgICAgICAgIChJRldMX0NvbWJvQm94RFAqKW1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wT3duZXItPm1fcEludGVyZmFjZSwgaUN1clNlbCk7DQorICAgICAgICAoKENGV0xfQ29tYm9MaXN0KikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcExpc3RCb3gpLT5HZXREYXRhKCkpDQorICAgICAgICAgICAgLT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZW1wKTsNCisgICAgICAgIGJNYXRjaEVxdWFsID0gd3NUZXh0LkVxdWFsKHdzVGVtcCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpQ3VyU2VsIDwgMCkgew0KKyAgICAgIGlDdXJTZWwgPSAwOw0KKyAgICB9IGVsc2UgaWYgKCFiRHJvcERvd24gfHwgYk1hdGNoRXF1YWwpIHsNCisgICAgICBpZiAoKGJVcCAmJiBpQ3VyU2VsID09IDApIHx8IChiRG93biAmJiBpQ3VyU2VsID09IGlDb3VudCAtIDEpKSB7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIGlmIChiVXApIHsNCisgICAgICAgIGlDdXJTZWwtLTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaUN1clNlbCsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX3BPd25lci0+bV9pQ3VyU2VsID0gaUN1clNlbDsNCisgICAgaWYgKGJEcm9wRG93biAmJiBtX3BPd25lci0+bV9wRWRpdCkgew0KKyAgICAgIG1fcE93bmVyLT5TeW5jaHJFZGl0VGV4dChtX3BPd25lci0+bV9pQ3VyU2VsKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgICB9DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYkRyb3BEb3duID0gbV9wT3duZXItPklzRHJvcERvd25TdHlsZSgpOw0KKyAgaWYgKGJEcm9wRG93bikgew0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUgPSBtX3BPd25lci0+bV9wRWRpdC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCisgIH0NCit9DQoraW50MzJfdCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6OkRpc0Zvcm1fT25Qcm9jZXNzTWVzc2FnZSgNCisgICAgQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQorICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgRlhfQk9PTCBiYWNrRGVmYXVsdCA9IFRSVUU7DQorICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KKyAgICAgIGJhY2tEZWZhdWx0ID0gRkFMU0U7DQorICAgICAgRGlzRm9ybV9PbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgYmFja0RlZmF1bHQgPSBGQUxTRTsNCisgICAgICBDRldMX01zZ01vdXNlKiBwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgICBzd2l0Y2ggKGR3Q21kKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICBEaXNGb3JtX09uTEJ1dHRvbkRvd24ocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQorICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHt9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQorICAgICAgYmFja0RlZmF1bHQgPSBGQUxTRTsNCisgICAgICBDRldMX01zZ0tleSogcEtleSA9IChDRldMX01zZ0tleSopcE1lc3NhZ2U7DQorICAgICAgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlVcCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX3BPd25lci0+RGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCkgJiYNCisgICAgICAgICAgcEtleS0+bV9kd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24pIHsNCisgICAgICAgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBLZXktPm1fZHdLZXlDb2RlOw0KKyAgICAgICAgRlhfQk9PTCBiTGlzdEtleSA9DQorICAgICAgICAgICAgZHdLZXlDb2RlID09IEZXTF9WS0VZX1VwIHx8IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9Eb3duIHx8DQorICAgICAgICAgICAgZHdLZXlDb2RlID09IEZXTF9WS0VZX1JldHVybiB8fCBkd0tleUNvZGUgPT0gRldMX1ZLRVlfRXNjYXBlOw0KKyAgICAgICAgaWYgKGJMaXN0S2V5KSB7DQorICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9DQorICAgICAgICAgICAgICBtX3BPd25lci0+bV9wTGlzdEJveC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBEaXNGb3JtX09uS2V5KChDRldMX01zZ0tleSopcE1lc3NhZ2UpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICBpZiAoIWJhY2tEZWZhdWx0KSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6RGlzRm9ybV9PbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIEZYX0JPT0wgYkRyb3BEb3duID0gbV9wT3duZXItPkRpc0Zvcm1fSXNEcm9wTGlzdFNob3dlZCgpOw0KKyAgQ0ZYX1JlY3RGJiBydEJ0biA9IGJEcm9wRG93biA/IG1fcE93bmVyLT5tX3J0QnRuIDogbV9wT3duZXItPm1fcnRDbGllbnQ7DQorICBGWF9CT09MIGJDbGlja0J0biA9IHJ0QnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgaWYgKGJDbGlja0J0bikgew0KKyAgICBpZiAobV9wT3duZXItPkRpc0Zvcm1fSXNEcm9wTGlzdFNob3dlZCgpKSB7DQorICAgICAgbV9wT3duZXItPkRpc0Zvcm1fU2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9wRWRpdCkgew0KKyAgICAgICAgbV9wT3duZXItPk1hdGNoRWRpdFRleHQoKTsNCisgICAgICB9DQorICAgICAgbV9wT3duZXItPkRpc0Zvcm1fU2hvd0Ryb3BMaXN0KFRSVUUpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpEaXNGb3JtX09uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXQpIHsNCisgIElGV0xfVGFyZ2V0KiBwRHN0VGFyZ2V0ID0gcE1zZy0+bV9wRHN0VGFyZ2V0Ow0KKyAgSUZXTF9UYXJnZXQqIHBTcmNUYXJnZXQgPSBwTXNnLT5tX3BTcmNUYXJnZXQ7DQorICBGWF9CT09MIGJEcm9wRG93biA9IG1fcE93bmVyLT5Jc0Ryb3BEb3duU3R5bGUoKTsNCisgIGlmIChiU2V0KSB7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICBpZiAoKG1fcE93bmVyLT5tX3BFZGl0LT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PSAwKSB7DQorICAgICAgQ0ZXTF9Nc2dTZXRGb2N1cyBtc2c7DQorICAgICAgbXNnLm1fcERzdFRhcmdldCA9IG1fcE93bmVyLT5tX3BFZGl0Ow0KKyAgICAgIG1zZy5tX3BTcmNUYXJnZXQgPSBOVUxMOw0KKyAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BFZGl0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UoJm1zZyk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRm9jdXNlZDsNCisgICAgbV9wT3duZXItPkRpc0Zvcm1fU2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgQ0ZXTF9Nc2dLaWxsRm9jdXMgbXNnOw0KKyAgICBtc2cubV9wRHN0VGFyZ2V0ID0gTlVMTDsNCisgICAgbXNnLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BFZGl0Ow0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUgPSBtX3BPd25lci0+bV9wRWRpdC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZSgmbXNnKTsNCisgIH0NCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6OkRpc0Zvcm1fT25LZXkoQ0ZXTF9Nc2dLZXkqIHBNc2cpIHsNCisgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBNc2ctPm1fZHdLZXlDb2RlOw0KKyAgRlhfQk9PTCBiVXAgPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfVXA7DQorICBGWF9CT09MIGJEb3duID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX0Rvd247DQorICBpZiAoYlVwIHx8IGJEb3duKSB7DQorICAgIENGV0xfQ29tYm9MaXN0KiBwQ29tYm9MaXN0ID0NCisgICAgICAgICgoQ0ZXTF9Db21ib0xpc3QqKSgoSUZXTF9UYXJnZXREYXRhKikobV9wT3duZXItPm1fcExpc3RCb3gpKQ0KKyAgICAgICAgICAgICAtPkdldERhdGEoKSk7DQorICAgIGludDMyX3QgaUNvdW50ID0gcENvbWJvTGlzdC0+Q291bnRJdGVtcygpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJNYXRjaEVxdWFsID0gRkFMU0U7DQorICAgIGludDMyX3QgaUN1clNlbCA9IG1fcE93bmVyLT5tX2lDdXJTZWw7DQorICAgIGlmIChtX3BPd25lci0+bV9wRWRpdCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICBtX3BPd25lci0+bV9wRWRpdC0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICAgIGlDdXJTZWwgPSBwQ29tYm9MaXN0LT5NYXRjaEl0ZW0od3NUZXh0KTsNCisgICAgICBpZiAoaUN1clNlbCA+PSAwKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgICBGV0xfSExJU1RJVEVNIGl0ZW0gPSBtX3BPd25lci0+bV9wTGlzdEJveC0+R2V0U2VsSXRlbShpQ3VyU2VsKTsNCisgICAgICAgIG1fcE93bmVyLT5tX3BMaXN0Qm94LT5HZXRJdGVtVGV4dChpdGVtLCB3c1RlbXApOw0KKyAgICAgICAgYk1hdGNoRXF1YWwgPSB3c1RleHQuRXF1YWwod3NUZW1wKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlDdXJTZWwgPCAwKSB7DQorICAgICAgaUN1clNlbCA9IDA7DQorICAgIH0gZWxzZSBpZiAoYk1hdGNoRXF1YWwpIHsNCisgICAgICBpZiAoKGJVcCAmJiBpQ3VyU2VsID09IDApIHx8IChiRG93biAmJiBpQ3VyU2VsID09IGlDb3VudCAtIDEpKSB7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIGlmIChiVXApIHsNCisgICAgICAgIGlDdXJTZWwtLTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaUN1clNlbCsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX3BPd25lci0+bV9pQ3VyU2VsID0gaUN1clNlbDsNCisgICAgbV9wT3duZXItPlN5bmNockVkaXRUZXh0KG1fcE93bmVyLT5tX2lDdXJTZWwpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9wT3duZXItPm1fcEVkaXQpIHsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gbV9wT3duZXItPm1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1zZyk7DQorICB9DQorfQ0KK0NGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZSgNCisgICAgSUZXTF9Gb3JtKiBwRm9ybSwNCisgICAgQ0ZXTF9Db21ib0JveEltcCogcENvbWJvQm94KQ0KKyAgICA6IG1fcEZvcm0ocEZvcm0pLA0KKyAgICAgIG1fcENvbWJvQm94KHBDb21ib0JveCksDQorICAgICAgbV9iTEJ1dHRvbkRvd24oRkFMU0UpLA0KKyAgICAgIG1fYkxCdXR0b25VcFNlbGYoRkFMU0UpLA0KKyAgICAgIG1fZlN0YXJ0UG9zKDApIHt9DQoraW50MzJfdCBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgIENGV0xfTXNnTW91c2UqIHBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgc3dpdGNoIChkd0NtZCkgew0KKyAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQorICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBkZWZhdWx0OiB7fQ0KKyAgICB9DQorICB9DQorICBpZiAoZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX0RlYWN0aXZhdGUpIHsNCisgICAgT25EZWFjdGl2ZSgoQ0ZXTF9Nc2dEZWFjdGl2YXRlKilwTWVzc2FnZSk7DQorICB9DQorICBpZiAoZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX0tpbGxGb2N1cyB8fCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpIHsNCisgICAgT25Gb2N1c0NoYW5nZWQoKENGV0xfTXNnS2lsbEZvY3VzKilwTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBtX3BDb21ib0JveC0+RHJhd1N0cmV0Y2hIYW5kbGVyKHBHcmFwaGljcywgcE1hdHJpeCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gbV9wRm9ybS0+R2V0T3duZXJUaHJlYWQoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQorICBDRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICBtX3BGb3JtLT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgIHJ0V2lkZ2V0LmxlZnQgPSBydFdpZGdldC50b3AgPSAwOw0KKyAgaWYgKHJ0V2lkZ2V0LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIG1fYkxCdXR0b25Eb3duID0gVFJVRTsNCisgICAgcERyaXZlci0+U2V0R3JhYihtX3BGb3JtLCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIG1fYkxCdXR0b25Eb3duID0gRkFMU0U7DQogICAgIHBEcml2ZXItPlNldEdyYWIobV9wRm9ybSwgRkFMU0UpOw0KLSAgICBpZiAobV9iTEJ1dHRvblVwU2VsZikgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQotICAgICAgICBtX3BGb3JtLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KLSAgICAgICAgcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOw0KLSAgICAgICAgaWYgKCFyZWN0LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpICYmIG1fcENvbWJvQm94LT5Jc0Ryb3BMaXN0U2hvd2VkKCkpIHsNCi0gICAgICAgICAgICBtX3BDb21ib0JveC0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1fYkxCdXR0b25VcFNlbGYgPSBUUlVFOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKnBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KLSAgICBJRldMX0FkYXB0ZXJDdXJzb3JNZ3IgKnBDdXJzb3JNZ3IgPSBwTmF0aXZlLT5HZXRDdXJzb3JNZ3IoKTsNCi0gICAgRldMX0NVUlNPUlRZUEUgY3Vyc29yVHlwZSA9IEZXTF9DVVJTT1JUWVBFX0Fycm93Ow0KLSAgICBpZiAobV9wQ29tYm9Cb3gtPm1fcnRIYW5kbGVyLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBjdXJzb3JUeXBlID0gRldMX0NVUlNPUlRZUEVfU2l6ZU5TOw0KLSAgICB9DQotICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoY3Vyc29yVHlwZSk7DQotICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCi0gICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCi0gICAgaWYgKCFtX2JMQnV0dG9uRG93bikgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIG1fcEZvcm0tPlRyYW5zZm9ybVRvKE5VTEwsIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KLSAgICBGWF9GTE9BVCBmQ2hhbmdlZCA9IHBNc2ctPm1fZnkgLSBtX2ZTdGFydFBvczsNCi0gICAgaWYgKG1fcENvbWJvQm94LT5tX2JVcEZvcm1IYW5kbGVyKSB7DQotICAgICAgICBmQ2hhbmdlZCA9IG1fZlN0YXJ0UG9zIC0gcE1zZy0+bV9meTsNCi0gICAgfQ0KLSAgICBpZiAobV9wQ29tYm9Cb3gtPm1fcnRMaXN0LmhlaWdodCArIGZDaGFuZ2VkIDwgbV9wQ29tYm9Cb3gtPm1fZkl0ZW1IZWlnaHQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBtX3BDb21ib0JveC0+bV9ydExpc3QuaGVpZ2h0ICs9IGZDaGFuZ2VkOw0KLSAgICBtX3BDb21ib0JveC0+bV9ydFByb3h5LmhlaWdodCArPSBmQ2hhbmdlZDsNCi0gICAgaWYgKG1fcENvbWJvQm94LT5tX2JVcEZvcm1IYW5kbGVyKSB7DQotICAgICAgICBtX3BDb21ib0JveC0+bV9ydFByb3h5LnRvcCAtPSBmQ2hhbmdlZDsNCi0gICAgICAgIG1fcENvbWJvQm94LT5tX3J0SGFuZGxlci5TZXQoMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29tYm9Cb3gtPm1fcnRMaXN0LndpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21ib0JveC0+bV9mQ29tYm9Gb3JtSGFuZGxlcik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BDb21ib0JveC0+bV9ydEhhbmRsZXIuU2V0KDAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbWJvQm94LT5tX3J0TGlzdC5oZWlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbWJvQm94LT5tX3J0TGlzdC53aWR0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29tYm9Cb3gtPm1fZkNvbWJvRm9ybUhhbmRsZXIpOw0KLSAgICB9DQotICAgIG1fcEZvcm0tPlNldFdpZGdldFJlY3QobV9wQ29tYm9Cb3gtPm1fcnRQcm94eSk7DQotICAgIG1fcENvbWJvQm94LT5tX3BMaXN0Qm94LT5TZXRXaWRnZXRSZWN0KG1fcENvbWJvQm94LT5tX3J0TGlzdCk7DQotICAgIG1fcENvbWJvQm94LT5tX3BMaXN0Qm94LT5VcGRhdGUoKTsNCi0gICAgbV9mU3RhcnRQb3MgPSBwTXNnLT5tX2Z5Ow0KLX0NCi12b2lkIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpPbkRlYWN0aXZlKENGV0xfTXNnRGVhY3RpdmF0ZSAqcE1zZykNCi17DQogICAgIG1fcENvbWJvQm94LT5TaG93RHJvcExpc3QoRkFMU0UpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJRldMX0FkYXB0ZXJOYXRpdmUqIHBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyKiBwQ3Vyc29yTWdyID0gcE5hdGl2ZS0+R2V0Q3Vyc29yTWdyKCk7DQorICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOUyk7DQorICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgbV9wRm9ybS0+VHJhbnNmb3JtVG8oTlVMTCwgcE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICBtX2ZTdGFydFBvcyA9IHBNc2ctPm1fZnk7DQogfQ0KLXZvaWQgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTXNnS2lsbEZvY3VzICpwTXNnLCBGWF9CT09MIGJTZXQgKQ0KLXsNCi0gICAgaWYgKCFiU2V0KSB7DQotICAgICAgICBpZiAocE1zZy0+bV9wU2V0Rm9jdXMgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIG1fcENvbWJvQm94LT5TaG93RHJvcExpc3QoRkFMU0UpOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIG1fYkxCdXR0b25Eb3duID0gRkFMU0U7DQorICBJRldMX05vdGVUaHJlYWQqIHBUaHJlYWQgPSBtX3BGb3JtLT5HZXRPd25lclRocmVhZCgpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhyZWFkKTsNCisgIENGV0xfTm90ZURyaXZlciogcERyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgIHBEcml2ZXItPlNldEdyYWIobV9wRm9ybSwgRkFMU0UpOw0KKyAgaWYgKG1fYkxCdXR0b25VcFNlbGYpIHsNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIG1fcEZvcm0tPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgIHJlY3QubGVmdCA9IHJlY3QudG9wID0gMDsNCisgICAgaWYgKCFyZWN0LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpICYmDQorICAgICAgICBtX3BDb21ib0JveC0+SXNEcm9wTGlzdFNob3dlZCgpKSB7DQorICAgICAgbV9wQ29tYm9Cb3gtPlNob3dEcm9wTGlzdChGQUxTRSk7DQogICAgIH0NCisgIH0gZWxzZSB7DQorICAgIG1fYkxCdXR0b25VcFNlbGYgPSBUUlVFOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBJRldMX0FkYXB0ZXJOYXRpdmUqIHBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyKiBwQ3Vyc29yTWdyID0gcE5hdGl2ZS0+R2V0Q3Vyc29yTWdyKCk7DQorICBGV0xfQ1VSU09SVFlQRSBjdXJzb3JUeXBlID0gRldMX0NVUlNPUlRZUEVfQXJyb3c7DQorICBpZiAobV9wQ29tYm9Cb3gtPm1fcnRIYW5kbGVyLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIGN1cnNvclR5cGUgPSBGV0xfQ1VSU09SVFlQRV9TaXplTlM7DQorICB9DQorICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKGN1cnNvclR5cGUpOw0KKyAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgIGlmICghbV9iTEJ1dHRvbkRvd24pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wRm9ybS0+VHJhbnNmb3JtVG8oTlVMTCwgcE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICBGWF9GTE9BVCBmQ2hhbmdlZCA9IHBNc2ctPm1fZnkgLSBtX2ZTdGFydFBvczsNCisgIGlmIChtX3BDb21ib0JveC0+bV9iVXBGb3JtSGFuZGxlcikgew0KKyAgICBmQ2hhbmdlZCA9IG1fZlN0YXJ0UG9zIC0gcE1zZy0+bV9meTsNCisgIH0NCisgIGlmIChtX3BDb21ib0JveC0+bV9ydExpc3QuaGVpZ2h0ICsgZkNoYW5nZWQgPCBtX3BDb21ib0JveC0+bV9mSXRlbUhlaWdodCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BDb21ib0JveC0+bV9ydExpc3QuaGVpZ2h0ICs9IGZDaGFuZ2VkOw0KKyAgbV9wQ29tYm9Cb3gtPm1fcnRQcm94eS5oZWlnaHQgKz0gZkNoYW5nZWQ7DQorICBpZiAobV9wQ29tYm9Cb3gtPm1fYlVwRm9ybUhhbmRsZXIpIHsNCisgICAgbV9wQ29tYm9Cb3gtPm1fcnRQcm94eS50b3AgLT0gZkNoYW5nZWQ7DQorICAgIG1fcENvbWJvQm94LT5tX3J0SGFuZGxlci5TZXQoMCwgMCwgbV9wQ29tYm9Cb3gtPm1fcnRMaXN0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbWJvQm94LT5tX2ZDb21ib0Zvcm1IYW5kbGVyKTsNCisgIH0gZWxzZSB7DQorICAgIG1fcENvbWJvQm94LT5tX3J0SGFuZGxlci5TZXQoMCwgbV9wQ29tYm9Cb3gtPm1fcnRMaXN0LmhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21ib0JveC0+bV9ydExpc3Qud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29tYm9Cb3gtPm1fZkNvbWJvRm9ybUhhbmRsZXIpOw0KKyAgfQ0KKyAgbV9wRm9ybS0+U2V0V2lkZ2V0UmVjdChtX3BDb21ib0JveC0+bV9ydFByb3h5KTsNCisgIG1fcENvbWJvQm94LT5tX3BMaXN0Qm94LT5TZXRXaWRnZXRSZWN0KG1fcENvbWJvQm94LT5tX3J0TGlzdCk7DQorICBtX3BDb21ib0JveC0+bV9wTGlzdEJveC0+VXBkYXRlKCk7DQorICBtX2ZTdGFydFBvcyA9IHBNc2ctPm1fZnk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU6Ok9uRGVhY3RpdmUoQ0ZXTF9Nc2dEZWFjdGl2YXRlKiBwTXNnKSB7DQorICBtX3BDb21ib0JveC0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCit9DQordm9pZCBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZTo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9Nc2dLaWxsRm9jdXMqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAoIWJTZXQpIHsNCisgICAgaWYgKHBNc2ctPm1fcFNldEZvY3VzID09IE5VTEwpIHsNCisgICAgICBtX3BDb21ib0JveC0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgfQ0KKyAgfQ0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2RhdGV0aW1lcGlja2VyaW1wLmNwcAppbmRleCA0YzMwMjQ0Li43YmY0ZjBkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlcmltcC5jcHAKQEAgLTE1LDExODggKzE1LDExNTQgQEAKICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9lZGl0aW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX21vbnRoY2FsZW5kYXJpbXAuaCINCiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuaCINCi0jZGVmaW5lIEZXTF9EVFBfV0lEVEgJCTEwMA0KLSNkZWZpbmUgRldMX0RUUF9IRUlHSFQJCTIwDQotSUZXTF9EYXRlVGltZVBpY2tlciogSUZXTF9EYXRlVGltZVBpY2tlcjo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBuZXcgSUZXTF9EYXRlVGltZVBpY2tlcjsNCisjZGVmaW5lIEZXTF9EVFBfV0lEVEggMTAwDQorI2RlZmluZSBGV0xfRFRQX0hFSUdIVCAyMA0KK0lGV0xfRGF0ZVRpbWVQaWNrZXIqIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgSUZXTF9EYXRlVGltZVBpY2tlcjsNCiB9DQotRldMX0VSUglJRldMX0RhdGVUaW1lRm9ybTo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfRm9ybVByb3h5SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9Gb3JtUHJveHlJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfRm9ybVByb3h5SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9EYXRlVGltZUZvcm06OkluaXRpYWxpemUoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0Zvcm1Qcm94eUltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgKChDRldMX0Zvcm1Qcm94eUltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgIHJldHVybiAoKENGV0xfRm9ybVByb3h5SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSCUlGV0xfRGF0ZVRpbWVDYWxlbmRlcjo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfRGF0ZVRpbWVDYWxlbmRhcihwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KLSAgICAoKENGV0xfRGF0ZVRpbWVDYWxlbmRhciopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZUNhbGVuZGFyKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9EYXRlVGltZUNhbGVuZGVyOjpJbml0aWFsaXplKA0KKyAgICBjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAoKENGV0xfRGF0ZVRpbWVDYWxlbmRhciopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVDYWxlbmRhciopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCiB9DQotRldMX0VSUglJRldMX0RhdGVUaW1lRWRpdDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfRGF0ZVRpbWVFZGl0KHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9EYXRlVGltZUVkaXQqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVFZGl0KiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9EYXRlVGltZUVkaXQ6OkluaXRpYWxpemUoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0RhdGVUaW1lRWRpdChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgKChDRldMX0RhdGVUaW1lRWRpdCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVFZGl0KiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1JRldMX0RhdGVUaW1lUGlja2VyOjpJRldMX0RhdGVUaW1lUGlja2VyKCkNCi17DQorSUZXTF9EYXRlVGltZVBpY2tlcjo6SUZXTF9EYXRlVGltZVBpY2tlcigpIHsNCisgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX0RhdGVUaW1lUGlja2VyOjp+SUZXTF9EYXRlVGltZVBpY2tlcigpIHsNCisgIGlmIChtX3BEYXRhKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YTsNCiAgICAgbV9wRGF0YSA9IE5VTEw7DQorICB9DQogfQ0KLUlGV0xfRGF0ZVRpbWVQaWNrZXI6On5JRldMX0RhdGVUaW1lUGlja2VyKCkNCi17DQotICAgIGlmIChtX3BEYXRhKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGE7DQotICAgICAgICBtX3BEYXRhID0gTlVMTDsNCi0gICAgfQ0KK0ZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAocE91dGVyKTsNCisgICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0RhdGVUaW1lUGlja2VySW1wKHBPdXRlcik7DQotICAgICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitGV0xfRVJSIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkluaXRpYWxpemUoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0RhdGVUaW1lUGlja2VySW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSCUlGV0xfRGF0ZVRpbWVQaWNrZXI6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0RhdGVUaW1lUGlja2VySW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitpbnQzMl90IElGV0xfRGF0ZVRpbWVQaWNrZXI6OkNvdW50U2VsUmFuZ2VzKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSkNCisgICAgICAtPkdldERhdGFUaW1lRWRpdCgpDQorICAgICAgLT5Db3VudFNlbFJhbmdlcygpOw0KIH0NCi1pbnQzMl90CUlGV0xfRGF0ZVRpbWVQaWNrZXI6OkNvdW50U2VsUmFuZ2VzKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5HZXREYXRhVGltZUVkaXQoKS0+Q291bnRTZWxSYW5nZXMoKTsNCitpbnQzMl90IElGV0xfRGF0ZVRpbWVQaWNrZXI6OkdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90JiBuU3RhcnQpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpDQorICAgICAgLT5HZXREYXRhVGltZUVkaXQoKQ0KKyAgICAgIC0+R2V0U2VsUmFuZ2UobkluZGV4LCBuU3RhcnQpOw0KIH0NCi1pbnQzMl90CUlGV0xfRGF0ZVRpbWVQaWNrZXI6OkdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+R2V0RGF0YVRpbWVFZGl0KCktPkdldFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCitGV0xfRVJSIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkdldEN1clNlbChpbnQzMl90JiBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkdldEN1clNlbChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCiB9DQotRldMX0VSUiBJRldMX0RhdGVUaW1lUGlja2VyOjpHZXRDdXJTZWwoaW50MzJfdCAmaVllYXIsIGludDMyX3QgJmlNb250aCwgaW50MzJfdCAmaURheSkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5HZXRDdXJTZWwoaVllYXIsIGlNb250aCwgaURheSk7DQorRldMX0VSUiBJRldMX0RhdGVUaW1lUGlja2VyOjpTZXRDdXJTZWwoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXkpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5TZXRDdXJTZWwoaVllYXIsIGlNb250aCwgaURheSk7DQogfQ0KLUZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6U2V0Q3VyU2VsKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpDQotew0KLSAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+U2V0Q3VyU2VsKGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KK0ZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6U2V0RWRpdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlNldEVkaXRUZXh0KHdzVGV4dCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6U2V0RWRpdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5TZXRFZGl0VGV4dCh3c1RleHQpOw0KK0ZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6R2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQpIGNvbnN0IHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpDQorICAgICAgLT5HZXRFZGl0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCiB9DQotRldMX0VSUiBJRldMX0RhdGVUaW1lUGlja2VyOjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIGNvbnN0DQotew0KLSAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+R2V0RWRpdFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpDYW5VbmRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkNhblVuZG8oKTsNCiB9DQotRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpDYW5VbmRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5DYW5VbmRvKCk7DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpDYW5SZWRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkNhblJlZG8oKTsNCiB9DQotRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpDYW5SZWRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5DYW5SZWRvKCk7DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpVbmRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlVuZG8oKTsNCiB9DQotRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpVbmRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5VbmRvKCk7DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpSZWRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlJlZG8oKTsNCiB9DQotRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpSZWRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5SZWRvKCk7DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpDYW5Db3B5KCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkNhbkNvcHkoKTsNCiB9DQotRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpDYW5Db3B5KCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5DYW5Db3B5KCk7DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpDYW5DdXQoKSB7DQorICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+Q2FuQ3V0KCk7DQogfQ0KLUZYX0JPT0wJSUZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuQ3V0KCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5DYW5DdXQoKTsNCitGWF9CT09MIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkNhblNlbGVjdEFsbCgpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5DYW5TZWxlY3RBbGwoKTsNCiB9DQotRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpDYW5TZWxlY3RBbGwoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkNhblNlbGVjdEFsbCgpOw0KK0ZYX0JPT0wgSUZXTF9EYXRlVGltZVBpY2tlcjo6Q29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KSB7DQorICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+Q29weSh3c0NvcHkpOw0KIH0NCi1GWF9CT09MCUlGV0xfRGF0ZVRpbWVQaWNrZXI6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5Db3B5KHdzQ29weSk7DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KSB7DQorICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+Q3V0KHdzQ3V0KTsNCiB9DQotRlhfQk9PTAlJRldMX0RhdGVUaW1lUGlja2VyOjpDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkN1dCh3c0N1dCk7DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlBhc3RlKHdzUGFzdGUpOw0KIH0NCi1GWF9CT09MCUlGV0xfRGF0ZVRpbWVQaWNrZXI6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlBhc3RlKHdzUGFzdGUpOw0KK0ZYX0JPT0wgSUZXTF9EYXRlVGltZVBpY2tlcjo6U2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlNlbGVjdEFsbCgpOw0KIH0NCi1GWF9CT09MCUlGV0xfRGF0ZVRpbWVQaWNrZXI6OlNlbGVjdEFsbCgpDQotew0KLSAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+U2VsZWN0QWxsKCk7DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpEZWxldGUoKSB7DQorICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+RGVsZXRlKCk7DQogfQ0KLUZYX0JPT0wJSUZXTF9EYXRlVGltZVBpY2tlcjo6RGVsZXRlKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5EZWxldGUoKTsNCitGWF9CT09MIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkRlU2VsZWN0KCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkRlU2VsZWN0KCk7DQogfQ0KLUZYX0JPT0wJSUZXTF9EYXRlVGltZVBpY2tlcjo6RGVTZWxlY3QoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkRlU2VsZWN0KCk7DQorRldMX0VSUiBJRldMX0RhdGVUaW1lUGlja2VyOjpHZXRCQm94KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPkdldEJCb3gocmVjdCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6R2V0QkJveChDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+R2V0QkJveChyZWN0KTsNCitGV0xfRVJSIElGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopbV9wRGF0YSktPlNldEVkaXRMaW1pdChuTGltaXQpOw0KIH0NCi1GV0xfRVJSIElGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpLT5TZXRFZGl0TGltaXQobkxpbWl0KTsNCitGV0xfRVJSIElGV0xfRGF0ZVRpbWVQaWNrZXI6Ok1vZGlmeUVkaXRTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKW1fcERhdGEpDQorICAgICAgLT5Nb2RpZnlFZGl0U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6TW9kaWZ5RWRpdFN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VySW1wKiltX3BEYXRhKS0+TW9kaWZ5RWRpdFN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KK0NGV0xfRGF0ZVRpbWVFZGl0OjpDRldMX0RhdGVUaW1lRWRpdChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9FZGl0SW1wKHByb3BlcnRpZXMsIHBPdXRlcikge30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVFZGl0OjpJbml0aWFsaXplKCkgew0KKyAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfRGF0ZVRpbWVFZGl0RGVsZWdhdGUodGhpcyk7DQorICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX0VkaXRJbXA6OkluaXRpYWxpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUNGV0xfRGF0ZVRpbWVFZGl0OjpDRldMX0RhdGVUaW1lRWRpdChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotICAgIDogQ0ZXTF9FZGl0SW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCi17DQorRldMX0VSUiBDRldMX0RhdGVUaW1lRWRpdDo6RmluYWxpemUoKSB7DQorICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgZGVsZXRlIChDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfRWRpdEltcDo6RmluYWxpemUoKTsNCiB9DQotRldMX0VSUiBDRldMX0RhdGVUaW1lRWRpdDo6SW5pdGlhbGl6ZSgpDQotew0KLSAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9EYXRlVGltZUVkaXREZWxlZ2F0ZSh0aGlzKTsNCi0gICAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9FZGl0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlOjpDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlKENGV0xfRGF0ZVRpbWVFZGl0KiBwT3duZXIpDQorICAgIDogQ0ZXTF9FZGl0SW1wRGVsZWdhdGUocE93bmVyKSwgbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9EYXRlVGltZUVkaXREZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBpZiAobV9wT3duZXItPm1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgIH0NCisgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMgfHwNCisgICAgICBkd0hhc2hDb2RlID09IEZXTF9NU0dIQVNIX0tpbGxGb2N1cykgew0KKyAgICBJRldMX1dpZGdldCogcE91dGVyID0gbV9wT3duZXItPkdldE91dGVyKCk7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBPdXRlci0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICB9DQorICByZXR1cm4gMTsNCiB9DQotRldMX0VSUiBDRldMX0RhdGVUaW1lRWRpdDo6RmluYWxpemUoKQ0KLXsNCi0gICAgaWYgKCBtX3BEZWxlZ2F0ZSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCi0gICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9FZGl0SW1wOjpGaW5hbGl6ZSgpOw0KLX0NCi1DRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlOjpDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlKENGV0xfRGF0ZVRpbWVFZGl0ICpwT3duZXIpDQotICAgIDogQ0ZXTF9FZGl0SW1wRGVsZWdhdGUocE93bmVyKQ0KLSAgICAsIG1fcE93bmVyKHBPd25lcikNCi17DQotfQ0KLWludDMyX3QgQ0ZXTF9EYXRlVGltZUVkaXREZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KLXsNCi0gICAgaWYgKG1fcE93bmVyLT5tX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIHJldHVybiBEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAoZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyB8fCBkd0hhc2hDb2RlID09IEZXTF9NU0dIQVNIX0tpbGxGb2N1cykgew0KLSAgICAgICAgSUZXTF9XaWRnZXQgKnBPdXRlciA9IG1fcE93bmVyLT5HZXRPdXRlcigpOw0KLSAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gcE91dGVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIDE7DQotfQ0KLWludDMyX3QgQ0ZXTF9EYXRlVGltZUVkaXREZWxlZ2F0ZTo6RGlzRm9ybV9PblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICBGWF9EV09SRCBkd0hhc2hDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCi0gICAgaWYgKG1fcE93bmVyLT5tX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIGlmIChkd0hhc2hDb2RlID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQotICAgICAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1vdXNlID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KLSAgICAgICAgICAgIGlmIChwTW91c2UtPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duIHx8IHBNb3VzZS0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfUkJ1dHRvbkRvd24pIHsNCi0gICAgICAgICAgICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRm9jdXNlZDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDRldMX0RhdGVUaW1lUGlja2VySW1wICpwRGF0ZVRpbWUgPSAoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopKChJRldMX1RhcmdldERhdGEqKW1fcE93bmVyLT5tX3BPdXRlciktPkdldERhdGEoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBEYXRlVGltZS0+SXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQotICAgICAgICAgICAgICAgICAgICBwRGF0ZVRpbWUtPkdldFdpZGdldFJlY3QocnRJbnZhbGlkYXRlKTsNCi0gICAgICAgICAgICAgICAgICAgIHBEYXRlVGltZS0+U2hvd01vbnRoQ2FsZW5kYXIoRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgcnRJbnZhbGlkYXRlLk9mZnNldCgtcnRJbnZhbGlkYXRlLmxlZnQsIC1ydEludmFsaWRhdGUudG9wKTsNCi0gICAgICAgICAgICAgICAgICAgIHBEYXRlVGltZS0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9LZXkpIHsNCi0gICAgICAgICAgICByZXR1cm4gQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK2ludDMyX3QgQ0ZXTF9EYXRlVGltZUVkaXREZWxlZ2F0ZTo6RGlzRm9ybV9PblByb2Nlc3NNZXNzYWdlKA0KKyAgICBDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBGWF9EV09SRCBkd0hhc2hDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgIGlmIChtX3BPd25lci0+bV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIGlmIChkd0hhc2hDb2RlID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1vdXNlID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgIGlmIChwTW91c2UtPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duIHx8DQorICAgICAgICAgIHBNb3VzZS0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfUkJ1dHRvbkRvd24pIHsNCisgICAgICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KKyAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRm9jdXNlZDsNCiAgICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLX0NCi1DRldMX0RhdGVUaW1lQ2FsZW5kYXI6OkNGV0xfRGF0ZVRpbWVDYWxlbmRhcihjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotICAgIDogQ0ZXTF9Nb250aENhbGVuZGFySW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCi17DQotfQ0KLUZXTF9FUlIgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyOjpJbml0aWFsaXplKCkNCi17DQotICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfTW9udGhDYWxlbmRhckltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBpZiAobV9wRGVsZWdhdGUpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KLSAgICB9DQotICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKUZYX05FVyBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZSh0aGlzKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfRGF0ZVRpbWVDYWxlbmRhcjo6RmluYWxpemUoKQ0KLXsNCi0gICAgaWYgKCBtX3BEZWxlZ2F0ZSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQotICAgICAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfTW9udGhDYWxlbmRhckltcDo6RmluYWxpemUoKTsNCi19DQotQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGU6OkNGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlKENGV0xfRGF0ZVRpbWVDYWxlbmRhciAqcE93bmVyKQ0KLSAgICA6IENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlKHBPd25lcikNCi0gICAgLCBtX3BPd25lcihwT3duZXIpDQotew0KLSAgICBtX2JGbGFnID0gRkFMU0U7DQotfQ0KLWludDMyX3QgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotICAgIEZYX0RXT1JEIGR3Q29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQotICAgIGlmIChkd0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMgfHwgZHdDb2RlID09IEZXTF9NU0dIQVNIX0tpbGxGb2N1cykgew0KLSAgICAgICAgSUZXTF9XaWRnZXQgKnBPdXRlciA9IG1fcE93bmVyLT5HZXRPdXRlcigpOw0KLSAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gcE91dGVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgIHJldHVybiBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLSAgICB9IGVsc2UgaWYgKGR3Q29kZSA9PSBGV0xfTVNHSEFTSF9Nb3VzZSkgew0KLSAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCi0gICAgICAgIGlmIChwTXNnLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bikgew0KLSAgICAgICAgICAgIE9uTEJ1dHRvbkRvd25FeChwTXNnKTsNCi0gICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgIH0gZWxzZSBpZiAocE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwKSB7DQotICAgICAgICAgICAgT25MQnV0dG9uVXBFeChwTXNnKTsNCi0gICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqIHBEYXRlVGltZSA9DQorICAgICAgICAgICAgKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKSgoSUZXTF9UYXJnZXREYXRhKiltX3BPd25lci0+bV9wT3V0ZXIpDQorICAgICAgICAgICAgICAgIC0+R2V0RGF0YSgpOw0KKyAgICAgICAgaWYgKHBEYXRlVGltZS0+SXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCisgICAgICAgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgICAgICAgICAgcERhdGVUaW1lLT5HZXRXaWRnZXRSZWN0KHJ0SW52YWxpZGF0ZSk7DQorICAgICAgICAgIHBEYXRlVGltZS0+U2hvd01vbnRoQ2FsZW5kYXIoRkFMU0UpOw0KKyAgICAgICAgICBydEludmFsaWRhdGUuT2Zmc2V0KC1ydEludmFsaWRhdGUubGVmdCwgLXJ0SW52YWxpZGF0ZS50b3ApOw0KKyAgICAgICAgICBwRGF0ZVRpbWUtPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQogICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfS2V5KSB7DQorICAgICAgcmV0dXJuIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCiB9DQotdm9pZCBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bkV4KENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBpZiAobV9wT3duZXItPm1fcnRMQnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBtX3BPd25lci0+bV9pTEJ0blBhcnRTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkOw0KLSAgICAgICAgbV9wT3duZXItPlByZXZNb250aCgpOw0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCi0gICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9ydFJCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX2lSQnRuUGFydFN0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkOw0KLSAgICAgICAgbV9wT3duZXItPk5leHRNb250aCgpOw0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCi0gICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9ydFRvZGF5LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5ICkgPT0gMCkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5KdW1wVG9Ub2RheSgpOw0KLSAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBJRldMX0RhdGVUaW1lUGlja2VyICpwSVBpY2tlciA9IChJRldMX0RhdGVUaW1lUGlja2VyICopbV9wT3duZXItPm1fcE91dGVyOw0KLSAgICAgICAgQ0ZXTF9EYXRlVGltZVBpY2tlckltcCAqcFBpY2tlciA9IChDRldMX0RhdGVUaW1lUGlja2VySW1wICopKChJRldMX1RhcmdldERhdGEgKilwSVBpY2tlciktPkdldERhdGEoKTsNCi0gICAgICAgIGlmIChwUGlja2VyLT5Jc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KLSAgICAgICAgICAgIG1fYkZsYWcgPSAxOw0KLSAgICAgICAgfQ0KLSAgICB9DQorQ0ZXTF9EYXRlVGltZUNhbGVuZGFyOjpDRldMX0RhdGVUaW1lQ2FsZW5kYXIoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX01vbnRoQ2FsZW5kYXJJbXAocHJvcGVydGllcywgcE91dGVyKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyOjpJbml0aWFsaXplKCkgew0KKyAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpJbml0aWFsaXplKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKG1fcERlbGVnYXRlKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgfQ0KKyAgbV9wRGVsZWdhdGUgPQ0KKyAgICAgIChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGUodGhpcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLXZvaWQgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGU6Ok9uTEJ1dHRvblVwRXgoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIGlmIChtX3BPd25lci0+bV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQotICAgICAgICByZXR1cm4gRGlzRm9ybV9PbkxCdXR0b25VcEV4KHBNc2cpOw0KLSAgICB9DQotICAgIGlmIChtX3BPd25lci0+bV9ydExCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX2lMQnRuUGFydFN0YXRlcyA9IDA7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRMQnRuKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAobV9wT3duZXItPm1fcnRSQnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBtX3BPd25lci0+bV9pUkJ0blBhcnRTdGF0ZXMgPSAwOw0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0UkJ0bik7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1fcE93bmVyLT5tX3J0VG9kYXkuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlPbGRTZWwgPSAwOw0KLSAgICBpZiAobV9wT3duZXItPm1fYXJyU2VsRGF5cy5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICBpT2xkU2VsID0gbV9wT3duZXItPm1fYXJyU2VsRGF5c1swXTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDdXJTZWwgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgQ0ZYX1JlY3RGIHJ0Ow0KLSAgICBJRldMX0RhdGVUaW1lUGlja2VyICpwSVBpY2tlciA9IChJRldMX0RhdGVUaW1lUGlja2VyICopbV9wT3duZXItPm1fcE91dGVyOw0KLSAgICBDRldMX0RhdGVUaW1lUGlja2VySW1wICpwUGlja2VyID0gKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgKikoKElGV0xfVGFyZ2V0RGF0YSAqKXBJUGlja2VyKS0+R2V0RGF0YSgpOw0KLSAgICBwUGlja2VyLT5tX3BGb3JtLT5HZXRXaWRnZXRSZWN0KHJ0KTsNCi0gICAgcnQuU2V0KDAsIDAsIHJ0LndpZHRoLCBydC5oZWlnaHQpOw0KLSAgICBpZiAoaUN1clNlbCA+IDApIHsNCi0gICAgICAgIExQREFURUlORk8gbHBEYXRlc0luZm8gPSAoTFBEQVRFSU5GTyltX3BPd25lci0+bV9hcnJEYXRlcy5HZXRBdChpQ3VyU2VsIC0gMSk7DQotICAgICAgICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlKGxwRGF0ZXNJbmZvLT5yZWN0KTsNCi0gICAgICAgIGlmIChpT2xkU2VsID4gMCAmJiBpT2xkU2VsIDw9IG1fcE93bmVyLT5tX2FyckRhdGVzLkdldFNpemUoKSkgew0KLSAgICAgICAgICAgIGxwRGF0ZXNJbmZvID0gKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaU9sZFNlbCAtIDEpOw0KLSAgICAgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihscERhdGVzSW5mby0+cmVjdCk7DQotICAgICAgICB9DQotICAgICAgICBtX3BPd25lci0+QWRkU2VsRGF5KGlDdXJTZWwpOw0KLSAgICAgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BPd25lci0+bV9wT3V0ZXIpOw0KLSAgICAgICAgcFBpY2tlci0+UHJvY2Vzc1NlbENoYW5nZWQobV9wT3duZXItPm1faUN1clllYXIsIG1fcE93bmVyLT5tX2lDdXJNb250aCwgaUN1clNlbCk7DQotICAgICAgICBwUGlja2VyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQotICAgIH0gZWxzZSBpZiAobV9iRmxhZyAmJiAoIXJ0LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSkgew0KLSAgICAgICAgSUZXTF9EYXRlVGltZVBpY2tlciAqcElQaWNrZXIgPSAoSUZXTF9EYXRlVGltZVBpY2tlciAqKW1fcE93bmVyLT5tX3BPdXRlcjsNCi0gICAgICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgKnBQaWNrZXIgPSAoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCAqKSgoSUZXTF9UYXJnZXREYXRhICopcElQaWNrZXIpLT5HZXREYXRhKCk7DQotICAgICAgICBwUGlja2VyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQotICAgIH0NCi0gICAgbV9iRmxhZyA9IDA7DQorRldMX0VSUiBDRldMX0RhdGVUaW1lQ2FsZW5kYXI6OkZpbmFsaXplKCkgew0KKyAgaWYgKG1fcERlbGVnYXRlKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQorICB9DQorICByZXR1cm4gQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpGaW5hbGl6ZSgpOw0KIH0NCi12b2lkIENGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlOjpPbk1vdXNlTW92ZUV4KENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX011bHRpU2VsZWN0KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfQk9PTCBiUmVwYWludCA9IEZBTFNFOw0KLSAgICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlOw0KLSAgICBydEludmFsaWRhdGUuU2V0KDAsIDAsIDAsIDApOw0KLSAgICBpZiAobV9wT3duZXItPm1fcnREYXRlcy5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KLSAgICAgICAgaW50MzJfdCBpSG92ZXIgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgICAgIGJSZXBhaW50ID0gbV9wT3duZXItPm1faUhvdmVyZWQgIT0gaUhvdmVyOw0KLSAgICAgICAgaWYgKGJSZXBhaW50KSB7DQotICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX2lIb3ZlcmVkID4gMCkgew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+R2V0RGF5UmVjdChtX3BPd25lci0+bV9pSG92ZXJlZCwgcnRJbnZhbGlkYXRlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGlIb3ZlciA+IDApIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0RGF5Ow0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+R2V0RGF5UmVjdChpSG92ZXIsIHJ0RGF5KTsNCi0gICAgICAgICAgICAgICAgaWYgKHJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZSA9IHJ0RGF5Ow0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcnRJbnZhbGlkYXRlLlVuaW9uKHJ0RGF5KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIG1fcE93bmVyLT5tX2lIb3ZlcmVkID0gaUhvdmVyOw0KLSAgICAgICAgQ0ZXTF9FdmVudF9EdHBIb3ZlckNoYW5nZWQgZXY7DQotICAgICAgICBldi5ob3ZlcmRheSA9IGlIb3ZlcjsNCi0gICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZldik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBiUmVwYWludCA9IG1fcE93bmVyLT5tX2lIb3ZlcmVkID4gMDsNCi0gICAgICAgIGlmIChiUmVwYWludCkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5HZXREYXlSZWN0KG1fcE93bmVyLT5tX2lIb3ZlcmVkLCBydEludmFsaWRhdGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wT3duZXItPm1faUhvdmVyZWQgPSAtMTsNCi0gICAgfQ0KLSAgICBpZiAoYlJlcGFpbnQgJiYgIXJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KLSAgICB9DQorQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGU6OkNGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlKA0KKyAgICBDRldMX0RhdGVUaW1lQ2FsZW5kYXIqIHBPd25lcikNCisgICAgOiBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZShwT3duZXIpLCBtX3BPd25lcihwT3duZXIpIHsNCisgIG1fYkZsYWcgPSBGQUxTRTsNCiB9DQotaW50MzJfdAlDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZTo6RGlzRm9ybV9PblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICBpZiAocE1lc3NhZ2UtPkdldENsYXNzSUQoKSA9PSBGV0xfTVNHSEFTSF9Nb3VzZSkgew0KLSAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCi0gICAgICAgIGlmIChwTXNnLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXApIHsNCi0gICAgICAgICAgICBEaXNGb3JtX09uTEJ1dHRvblVwRXgocE1zZyk7DQotICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICB9DQoraW50MzJfdCBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZSgNCisgICAgQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgRlhfRFdPUkQgZHdDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgIGlmIChkd0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMgfHwgZHdDb2RlID09IEZXTF9NU0dIQVNIX0tpbGxGb2N1cykgew0KKyAgICBJRldMX1dpZGdldCogcE91dGVyID0gbV9wT3duZXItPkdldE91dGVyKCk7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBPdXRlci0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIHJldHVybiBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgfSBlbHNlIGlmIChkd0NvZGUgPT0gRldMX01TR0hBU0hfTW91c2UpIHsNCisgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCisgICAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duKSB7DQorICAgICAgT25MQnV0dG9uRG93bkV4KHBNc2cpOw0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9IGVsc2UgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25VcCkgew0KKyAgICAgIE9uTEJ1dHRvblVwRXgocE1zZyk7DQorICAgICAgcmV0dXJuIDE7DQogICAgIH0NCi0gICAgcmV0dXJuIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgIH0NCisgIHJldHVybiBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQogfQ0KLXZvaWQgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGU6OkRpc0Zvcm1fT25MQnV0dG9uVXBFeChDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgaWYgKG1fcE93bmVyLT5tX3J0TEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KLSAgICAgICAgbV9wT3duZXItPm1faUxCdG5QYXJ0U3RhdGVzID0gMDsNCi0gICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRMQnRuKSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1fcE93bmVyLT5tX3J0UkJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KLSAgICAgICAgbV9wT3duZXItPm1faVJCdG5QYXJ0U3RhdGVzID0gMDsNCi0gICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRSQnRuKSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1fcE93bmVyLT5tX3J0VG9kYXkuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlPbGRTZWwgPSAwOw0KLSAgICBpZiAobV9wT3duZXItPm1fYXJyU2VsRGF5cy5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICBpT2xkU2VsID0gbV9wT3duZXItPm1fYXJyU2VsRGF5c1swXTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDdXJTZWwgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgaWYgKGlDdXJTZWwgPiAwKSB7DQotICAgICAgICBMUERBVEVJTkZPIGxwRGF0ZXNJbmZvID0gKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaUN1clNlbCAtIDEpOw0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZShscERhdGVzSW5mby0+cmVjdCk7DQotICAgICAgICBpZiAoaU9sZFNlbCA+IDAgJiYgaU9sZFNlbCA8PSBtX3BPd25lci0+bV9hcnJEYXRlcy5HZXRTaXplKCkpIHsNCi0gICAgICAgICAgICBscERhdGVzSW5mbyA9IChMUERBVEVJTkZPKW1fcE93bmVyLT5tX2FyckRhdGVzLkdldEF0KGlPbGRTZWwgLSAxKTsNCi0gICAgICAgICAgICBydEludmFsaWRhdGUuVW5pb24obHBEYXRlc0luZm8tPnJlY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wT3duZXItPkFkZFNlbERheShpQ3VyU2VsKTsNCi0gICAgICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgKnBEYXRlVGltZSA9IChDRldMX0RhdGVUaW1lUGlja2VySW1wKikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKS0+R2V0RGF0YSgpOw0KLSAgICAgICAgcERhdGVUaW1lLT5Qcm9jZXNzU2VsQ2hhbmdlZChtX3BPd25lci0+bV9pQ3VyWWVhciwgbV9wT3duZXItPm1faUN1ck1vbnRoLCBpQ3VyU2VsKTsNCi0gICAgICAgIHBEYXRlVGltZS0+U2hvd01vbnRoQ2FsZW5kYXIoRkFMU0UpOw0KLSAgICB9DQotfQ0KLUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNGV0xfRGF0ZVRpbWVQaWNrZXJJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQotICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KLSAgICAsIG1fYkxCdG5Eb3duKEZBTFNFKQ0KLSAgICAsIG1faUJ0blN0YXRlKDEpDQotICAgICwgbV9pWWVhcigtMSkNCi0gICAgLCBtX2lNb250aCgtMSkNCi0gICAgLCBtX2lEYXkoLTEpDQotICAgICwgbV9wRWRpdChOVUxMKQ0KLSAgICAsIG1fcE1vbnRoQ2FsKE5VTEwpDQotICAgICwgbV9wRm9ybShGQUxTRSkNCi17DQotICAgIG1fcnRCdG4uU2V0KDAsIDAsIDAsIDApOw0KLX0NCi1DRldMX0RhdGVUaW1lUGlja2VySW1wOjpDRldMX0RhdGVUaW1lUGlja2VySW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCi0gICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQotICAgICwgbV9iTEJ0bkRvd24oRkFMU0UpDQotICAgICwgbV9pQnRuU3RhdGUoMSkNCi0gICAgLCBtX2lZZWFyKC0xKQ0KLSAgICAsIG1faU1vbnRoKC0xKQ0KLSAgICAsIG1faURheSgtMSkNCi0gICAgLCBtX3BFZGl0KE5VTEwpDQotICAgICwgbV9wTW9udGhDYWwoTlVMTCkNCi0gICAgLCBtX3BGb3JtKEZBTFNFKQ0KLXsNCi0gICAgbV9ydEJ0bi5TZXQoMCwgMCwgMCwgMCk7DQotfQ0KLUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6On5DRldMX0RhdGVUaW1lUGlja2VySW1wKCkNCi17DQotICAgIGlmIChtX3BFZGl0KSB7DQotICAgICAgICBtX3BFZGl0LT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BFZGl0ID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wTW9udGhDYWwpIHsNCi0gICAgICAgIG1fcE1vbnRoQ2FsLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BNb250aENhbCA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKG1fcEZvcm0pIHsNCi0gICAgICAgIG1fcEZvcm0tPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcEZvcm0gPSBOVUxMOw0KLSAgICB9DQotfQ0KLUZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgd3NDbGFzcyA9IEZXTF9DTEFTU19EYXRlVGltZVBpY2tlcjsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9EV09SRCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCi17DQotICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyOw0KLX0NCi1GV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZSh0aGlzKTsNCi0gICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyA9IEZXTF9TVFlMRUVYVF9EVFBfU2hvcnREYXRlRm9ybWF0Ow0KLSAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcE1vbnRoOw0KLSAgICBwcm9wTW9udGgubV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9Qb3B1cCB8IEZXTF9XR1RTVFlMRV9Cb3JkZXI7DQotICAgIHByb3BNb250aC5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCi0gICAgcHJvcE1vbnRoLm1fcERhdGFQcm92aWRlciA9ICZtX01vbnRoQ2FsZW5kYXJEUDsNCi0gICAgcHJvcE1vbnRoLm1fcFBhcmVudCA9IG1fcEludGVyZmFjZTsNCi0gICAgcHJvcE1vbnRoLm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KLSAgICBtX3BNb250aENhbCA9IG5ldyBJRldMX0RhdGVUaW1lQ2FsZW5kZXIoKTsNCi0gICAgbV9wTW9udGhDYWwtPkluaXRpYWxpemUocHJvcE1vbnRoLCBtX3BJbnRlcmZhY2UpOw0KLSAgICBDRlhfUmVjdEYgcnRNb250aENhbDsNCi0gICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aENhbCwgVFJVRSk7DQotICAgIHJ0TW9udGhDYWwuU2V0KDAsIDAsIHJ0TW9udGhDYWwud2lkdGgsIHJ0TW9udGhDYWwuaGVpZ2h0KTsNCi0gICAgbV9wTW9udGhDYWwtPlNldFdpZGdldFJlY3QocnRNb250aENhbCk7DQotICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wRWRpdDsNCi0gICAgcHJvcEVkaXQubV9wUGFyZW50ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwcm9wRWRpdC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCi0gICAgbV9wRWRpdCA9IG5ldyBJRldMX0RhdGVUaW1lRWRpdCgpOw0KLSAgICBtX3BFZGl0LT5Jbml0aWFsaXplKHByb3BFZGl0LCBtX3BJbnRlcmZhY2UpOw0KLSAgICBSZWdpc3RlckV2ZW50VGFyZ2V0KG1fcE1vbnRoQ2FsKTsNCi0gICAgUmVnaXN0ZXJFdmVudFRhcmdldChtX3BFZGl0KTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkZpbmFsaXplKCkNCi17DQotICAgIGlmIChtX3BFZGl0KSB7DQotICAgICAgICBtX3BFZGl0LT5GaW5hbGl6ZSgpOw0KLSAgICB9DQotICAgIGlmIChtX3BNb250aENhbCkgew0KLSAgICAgICAgbV9wTW9udGhDYWwtPkZpbmFsaXplKCk7DQotICAgIH0NCi0gICAgaWYgKG1fcEZvcm0pIHsNCi0gICAgICAgIG1fcEZvcm0tPkZpbmFsaXplKCk7DQotICAgIH0NCi0gICAgVW5yZWdpc3RlckV2ZW50VGFyZ2V0KCk7DQotICAgIGlmICggbV9wRGVsZWdhdGUpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCi0gICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCi17DQotICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIHJldHVybiBEaXNGb3JtX0dldFdpZGdldFJlY3QocmVjdCwgYkF1dG9TaXplKTsNCi0gICAgfQ0KLSAgICBpZiAoYkF1dG9TaXplKSB7DQotICAgICAgICByZWN0LlNldCgwLCAwLCBGV0xfRFRQX1dJRFRILCBGV0xfRFRQX0hFSUdIVCk7DQotICAgICAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpVcGRhdGUoKQ0KLXsNCi0gICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIERpc0Zvcm1fVXBkYXRlKCk7DQotICAgIH0NCi0gICAgaWYgKG1faUxvY2spIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQotICAgIH0NCi0gICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQotICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCi0gICAgfQ0KLSAgICBtX3BFZGl0LT5TZXRUaGVtZVByb3ZpZGVyKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KLSAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KLSAgICBGWF9GTE9BVCAqcEZXaWR0aCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBGV2lkdGgsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIEZYX0ZMT0FUIGZCdG4gPSAqcEZXaWR0aDsNCi0gICAgbV9ydEJ0bi5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gZkJ0biwgbV9ydENsaWVudC50b3AsIGZCdG4gLSAxLCBtX3J0Q2xpZW50LmhlaWdodCAtIDEpOw0KLSAgICBDRlhfUmVjdEYgcnRFZGl0Ow0KLSAgICBydEVkaXQuU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC50b3AsIG1fcnRDbGllbnQud2lkdGggLSBmQnRuLCBtX3J0Q2xpZW50LmhlaWdodCk7DQotICAgIG1fcEVkaXQtPlNldFdpZGdldFJlY3QocnRFZGl0KTsNCi0gICAgUmVTZXRFZGl0QWxpZ25tZW50KCk7DQotICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KLSAgICBpZiAoIShtX3BNb250aENhbC0+R2V0VGhlbWVQcm92aWRlcigpKSkgew0KLSAgICAgICAgbV9wTW9udGhDYWwtPlNldFRoZW1lUHJvdmlkZXIobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcikgew0KLSAgICAgICAgSUZXTF9EYXRlVGltZVBpY2tlckRQICpwRGF0YSA9IChJRldMX0RhdGVUaW1lUGlja2VyRFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgICAgIHBEYXRhLT5HZXRUb2RheShtX3BJbnRlcmZhY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgbV9Nb250aENhbGVuZGFyRFAubV9pQ3VyWWVhciwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX01vbnRoQ2FsZW5kYXJEUC5tX2lDdXJNb250aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX01vbnRoQ2FsZW5kYXJEUC5tX2lDdXJEYXkpOw0KLSAgICB9DQotICAgIENGWF9SZWN0RiBydE1vbnRoQ2FsOw0KLSAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoQ2FsLCBUUlVFKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0UG9wVXA7DQotICAgIHJ0UG9wVXAuU2V0KHJ0TW9udGhDYWwubGVmdCwgcnRNb250aENhbC50b3AgKyBGV0xfRFRQX0hFSUdIVCwgcnRNb250aENhbC53aWR0aCwgcnRNb250aENhbC5oZWlnaHQpOw0KLSAgICBtX3BNb250aENhbC0+U2V0V2lkZ2V0UmVjdChydFBvcFVwKTsNCi0gICAgbV9wTW9udGhDYWwtPlVwZGF0ZSgpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0RXT1JEIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIERpc0Zvcm1fSGl0VGVzdChmeCwgZnkpOw0KLSAgICB9DQotICAgIGlmIChtX3J0Q2xpZW50LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQotICAgIH0NCi0gICAgaWYgKElzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQotICAgICAgICBDRlhfUmVjdEYgcmVjdDsNCi0gICAgICAgIG1fcE1vbnRoQ2FsLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KLSAgICAgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQotfQ0KLUZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgIGlmIChIYXNCb3JkZXIoKSkgew0KLSAgICAgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX0RUUF9Cb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIH0NCi0gICAgaWYgKEhhc0VkZ2UoKSkgew0KLSAgICAgICAgRHJhd0VkZ2UocEdyYXBoaWNzLCBGV0xfUEFSVF9EVFBfRWRnZSwgcFRoZW1lLCBwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBpZiAoIW1fcnRCdG4uSXNFbXB0eSgpKSB7DQotICAgICAgICBEcmF3RHJvcERvd25CdXR0b24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIHJldHVybiBEaXNGb3JtX0RyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIgKnBUUCkNCi17DQotICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBwVFA7DQotICAgIG1fcE1vbnRoQ2FsLT5TZXRUaGVtZVByb3ZpZGVyKHBUUCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXRDdXJTZWwoaW50MzJfdCAmaVllYXIsIGludDMyX3QgJmlNb250aCwgaW50MzJfdCAmaURheSkNCi17DQotICAgIGlZZWFyID0gbV9pWWVhcjsNCi0gICAgaU1vbnRoID0gbV9pTW9udGg7DQotICAgIGlEYXkgPSBtX2lEYXk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpTZXRDdXJTZWwoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaVllYXIgPiAwICYmIGlZZWFyIDwgMzAwMCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChpTW9udGggPiAwICYmIGlNb250aCA8IDEzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGlEYXkgPiAwICYmIGlEYXkgPCAzMiwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgbV9pWWVhciA9IGlZZWFyOw0KLSAgICBtX2lNb250aCA9IGlNb250aDsNCi0gICAgbV9pRGF5ID0gaURheTsNCi0gICAgbV9wTW9udGhDYWwtPlNldFNlbGVjdChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkaXQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGludDMyX3QgaVJldCA9IG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCi0gICAgUmVwYWludCgmbV9ydENsaWVudCk7DQotICAgIENGV0xfRXZlbnRfRHRwRWRpdENoYW5nZWQgZXY7DQotICAgIGV2Lm1fd3NUZXh0ID0gd3NUZXh0Ow0KLSAgICBEaXNwYXRjaEV2ZW50KCZldik7DQotICAgIHJldHVybiBpUmV0Ow0KLX0NCi1GV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgY29uc3QNCi17DQotICAgIGlmIChtX3BFZGl0KSB7DQotICAgICAgICByZXR1cm4gbV9wRWRpdC0+R2V0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLX0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNhblVuZG8oKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPkNhblVuZG8oKTsNCi19DQotRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDYW5SZWRvKCkNCi17DQotICAgIHJldHVybiBtX3BFZGl0LT5DYW5SZWRvKCk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6VW5kbygpDQotew0KLSAgICByZXR1cm4gbV9wRWRpdC0+VW5kbygpOw0KLX0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlJlZG8oKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPlJlZG8oKTsNCi19DQotRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDYW5Db3B5KCkNCi17DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9wRWRpdC0+Q291bnRTZWxSYW5nZXMoKTsNCi0gICAgcmV0dXJuIG5Db3VudCA+IDA7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6Q2FuQ3V0KCkNCi17DQotICAgIGlmIChtX3BFZGl0LT5HZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9wRWRpdC0+Q291bnRTZWxSYW5nZXMoKTsNCi0gICAgcmV0dXJuIG5Db3VudCA+IDA7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6Q2FuU2VsZWN0QWxsKCkNCi17DQotICAgIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0TGVuZ3RoKCkgPiAwOw0KLX0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSkNCi17DQotICAgIHJldHVybiBtX3BFZGl0LT5Db3B5KHdzQ29weSk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6Q3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCkNCi17DQotICAgIHJldHVybiBtX3BFZGl0LT5DdXQod3NDdXQpOw0KLX0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPlBhc3RlKHdzUGFzdGUpOw0KLX0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlNlbGVjdEFsbCgpDQotew0KLSAgICByZXR1cm4gKG1fcEVkaXQtPkFkZFNlbFJhbmdlKDApID09IEZXTF9FUlJfU3VjY2VlZGVkKSA/IFRSVUUgOiBGQUxTRTsNCi19DQotRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEZWxldGUoKQ0KLXsNCi0gICAgcmV0dXJuIChtX3BFZGl0LT5DbGVhclRleHQoKSA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgPyBUUlVFIDogRkFMU0U7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGVTZWxlY3QoKQ0KLXsNCi0gICAgcmV0dXJuIChtX3BFZGl0LT5DbGVhclNlbGVjdGlvbnMoKSA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgPyBUUlVFIDogRkFMU0U7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6R2V0QkJveChDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQotICAgICAgICByZXR1cm4gRGlzRm9ybV9HZXRCQm94KHJlY3QpOw0KLSAgICB9DQotICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICBpZiAoSXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCi0gICAgICAgIENGWF9SZWN0RiBydE1vbnRoOw0KLSAgICAgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aCk7DQotICAgICAgICBydE1vbnRoLk9mZnNldChtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmxlZnQsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wKTsNCi0gICAgICAgIHJlY3QuVW5pb24ocnRNb250aCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCkNCi17DQotICAgIHJldHVybiBtX3BFZGl0LT5TZXRMaW1pdChuTGltaXQpOw0KLX0NCi1GV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6Ok1vZGlmeUVkaXRTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEVkaXQtPk1vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KLX0NCi12b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRyYXdEcm9wRG93bkJ1dHRvbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX1NwaW4pID09IEZXTF9TVFlMRUVYVF9EVFBfU3Bpbikgew0KLSAgICAgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQotICAgICAgICBwcm9wLm1fZHdTdHlsZUV4ZXMgfD0gRldMX1NUWUxFRVhFX1NQQl9WZXJ0Ow0KLSAgICAgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICBwcm9wLm1fcnRXaWRnZXQgPSBtX3J0QnRuOw0KLSAgICAgICAgSUZXTF9TcGluQnV0dG9uICpwU3BpbiA9IElGV0xfU3BpbkJ1dHRvbjo6Q3JlYXRlKCk7DQotICAgICAgICBwU3Bpbi0+SW5pdGlhbGl6ZShwcm9wLCBtX3BJbnRlcmZhY2UpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQotICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRFRQX0Ryb3BEb3duQnV0dG9uOw0KLSAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1faUJ0blN0YXRlOw0KLSAgICAgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRCdG47DQotICAgICAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgICAgICB9DQotICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpGb3JtYXREYXRlU3RyaW5nKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXksIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX1Nob3J0RGF0ZUZvcm1hdCkgPT0gRldMX1NUWUxFRVhUX0RUUF9TaG9ydERhdGVGb3JtYXQpIHsNCi0gICAgICAgIHdzVGV4dC5Gb3JtYXQoTCIlZC0lZC0lZCIsIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KLSAgICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9Mb25nRGF0ZUZvcm1hdCkgPT0gRldMX1NUWUxFRVhUX0RUUF9Mb25nRGF0ZUZvcm1hdCkgew0KLSAgICAgICAgd3NUZXh0LkZvcm1hdChMIiVkIFllYXIgJWQgTW9udGggJWQgRGF5IiwgaVllYXIsIGlNb250aCwgaURheSk7DQotICAgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX1RpbWVGb3JtYXQpID09IEZXTF9TVFlMRUVYVF9EVFBfVGltZUZvcm1hdCkgew0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6U2hvd01vbnRoQ2FsZW5kYXIoRlhfQk9PTCBiQWN0aXZhdGUpDQotew0KLSAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQotICAgICAgICByZXR1cm4gRGlzRm9ybV9TaG93TW9udGhDYWxlbmRhcihiQWN0aXZhdGUpOw0KLSAgICB9DQotICAgIGlmKElzTW9udGhDYWxlbmRhclNob3dlZCgpID09IGJBY3RpdmF0ZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmICghbV9wRm9ybSkgew0KLSAgICAgICAgSW5pdFByb3h5Rm9ybSgpOw0KLSAgICB9DQotICAgIGlmIChiQWN0aXZhdGUpIHsNCi0gICAgICAgIENGWF9SZWN0RiBydE1vbnRoOw0KLSAgICAgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aCk7DQotICAgICAgICBDRlhfUmVjdEYgcnRBbmNob3I7DQotICAgICAgICBydEFuY2hvci5TZXQoMCwNCi0gICAgICAgICAgICAgICAgICAgICAwLA0KLSAgICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KLSAgICAgICAgR2V0UG9wdXBQb3MoMCwgcnRNb250aC5oZWlnaHQsIHJ0QW5jaG9yLCBydE1vbnRoKTsNCi0gICAgICAgIG1fcEZvcm0tPlNldFdpZGdldFJlY3QocnRNb250aCk7DQotICAgICAgICBydE1vbnRoLmxlZnQgPSBydE1vbnRoLnRvcCA9IDA7DQotICAgICAgICBtX3BNb250aENhbC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsICFiQWN0aXZhdGUpOw0KLSAgICAgICAgbV9wTW9udGhDYWwtPlNldFdpZGdldFJlY3QocnRNb250aCk7DQotICAgICAgICBtX3BNb250aENhbC0+VXBkYXRlKCk7DQotICAgICAgICBtX3BGb3JtLT5Eb01vZGFsKCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BGb3JtLT5FbmREb01vZGFsKCk7DQotICAgIH0NCi19DQotRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKQ0KLXsNCi0gICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIERpc0Zvcm1fSXNNb250aENhbGVuZGFyU2hvd2VkKCk7DQotICAgIH0NCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BGb3JtLCBGQUxTRSk7DQotICAgIHJldHVybiAhKG1fcEZvcm0tPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7DQotfQ0KLXZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6UmVTZXRFZGl0QWxpZ25tZW50KCkNCi17DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wRWRpdCk7DQotICAgIEZYX0RXT1JEIGR3U3R5bEV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KLSAgICBGWF9EV09SRCBkd0FkZCA9IDA7DQotICAgIHN3aXRjaCAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhBbGlnbk1hc2spIHsNCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0RUUF9FZGl0SENlbnRlcjogew0KLSAgICAgICAgICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX0hDZW50ZXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0RUUF9FZGl0SEZhcjogew0KLSAgICAgICAgICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX0hGYXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9ITmVhcjsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgc3dpdGNoIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9FZGl0VkFsaWduTWFzaykgew0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWQ2VudGVyOiB7DQotICAgICAgICAgICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfVkNlbnRlcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWRmFyOiB7DQotICAgICAgICAgICAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfVkZhcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX1ZOZWFyOw0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEp1c3RpZmllZCkgew0KLSAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9KdXN0aWZpZWQ7DQotICAgIH0NCi0gICAgaWYgKGR3U3R5bEV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX0VkaXREaXN0cmlidXRlZCkgew0KLSAgICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9EaXN0cmlidXRlZDsNCi0gICAgfQ0KLSAgICBtX3BFZGl0LT5Nb2RpZnlTdHlsZXNFeChkd0FkZCwgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25NYXNrIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25Nb2RlTWFzayB8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9FRFRfVkFsaWduTWFzayk7DQotfQ0KLXZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6UHJvY2Vzc1NlbENoYW5nZWQoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSkNCi17DQotICAgIG1faVllYXIgPSBpWWVhcjsNCi0gICAgbV9pTW9udGggPSBpTW9udGg7DQotICAgIG1faURheSA9IGlEYXk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgRm9ybWF0RGF0ZVN0cmluZyhtX2lZZWFyLCBtX2lNb250aCwgbV9pRGF5LCB3c1RleHQpOw0KLSAgICBtX3BFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQotICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KLSAgICBSZXBhaW50KCZtX3J0Q2xpZW50KTsNCi0gICAgQ0ZXTF9FdmVudF9EdHBTZWxlY3RDaGFuZ2VkIGV2Ow0KLSAgICBldi5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIGV2LmlZZWFyID0gbV9pWWVhcjsNCi0gICAgZXYuaU1vbnRoID0gbV9pTW9udGg7DQotICAgIGV2LmlEYXkgPSBtX2lEYXk7DQotICAgIERpc3BhdGNoRXZlbnQoJmV2KTsNCi19DQotdm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpJbml0UHJveHlGb3JtKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwoIW1fcEZvcm0pOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcE1vbnRoQ2FsKTsNCi0gICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3BGb3JtOw0KLSAgICBwcm9wRm9ybS5tX2R3U3R5bGVzID0gRldMX1dHVFNUWUxFX1BvcHVwOw0KLSAgICBwcm9wRm9ybS5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCi0gICAgcHJvcEZvcm0ubV9wT3duZXIgPSBtX3BJbnRlcmZhY2U7DQotICAgIG1fcEZvcm0gPSBuZXcgSUZXTF9EYXRlVGltZUZvcm0oKTsNCi0gICAgbV9wRm9ybS0+SW5pdGlhbGl6ZShwcm9wRm9ybSwgbV9wTW9udGhDYWwpOw0KLSAgICBtX3BNb250aENhbC0+U2V0UGFyZW50KChJRldMX1dpZGdldCopbV9wRm9ybSk7DQotfQ0KLUlGV0xfRGF0ZVRpbWVFZGl0KglDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXREYXRhVGltZUVkaXQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEVkaXQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9Jbml0aWFsaXplKCkNCi17DQotICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgPSBGV0xfU1RZTEVFWFRfRFRQX1Nob3J0RGF0ZUZvcm1hdDsNCi0gICAgRGlzRm9ybV9Jbml0RGF0ZVRpbWVDYWxlbmRhcigpOw0KLSAgICBEaXNGb3JtX0luaXREYXRlVGltZUVkaXQoKTsNCi0gICAgUmVnaXN0ZXJFdmVudFRhcmdldChtX3BNb250aENhbCk7DQotICAgIFJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wRWRpdCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotdm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0luaXREYXRlVGltZUNhbGVuZGFyKCkNCi17DQotICAgIGlmIChtX3BNb250aENhbCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wTW9udGg7DQotICAgIHByb3BNb250aC5tX2R3U3R5bGVzID0gRldMX1dHVFNUWUxFX1BvcHVwIHwgRldMX1dHVFNUWUxFX0JvcmRlciB8IEZXTF9XR1RTVFlMRV9FZGdlU3Vua2VuOw0KLSAgICBwcm9wTW9udGgubV9kd1N0YXRlcyA9IEZXTF9XR1RTVEFURV9JbnZpc2libGU7DQotICAgIHByb3BNb250aC5tX3BQYXJlbnQgPSAoSUZXTF9XaWRnZXQqKXRoaXM7DQotICAgIHByb3BNb250aC5tX3BEYXRhUHJvdmlkZXIgPSAmbV9Nb250aENhbGVuZGFyRFA7DQotICAgIHByb3BNb250aC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCi0gICAgbV9wTW9udGhDYWwgPSBuZXcgSUZXTF9EYXRlVGltZUNhbGVuZGVyKCk7DQotICAgIG1fcE1vbnRoQ2FsLT5Jbml0aWFsaXplKHByb3BNb250aCwgbV9wSW50ZXJmYWNlKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0TW9udGhDYWw7DQotICAgIG1fcE1vbnRoQ2FsLT5HZXRXaWRnZXRSZWN0KHJ0TW9udGhDYWwsIFRSVUUpOw0KLSAgICBydE1vbnRoQ2FsLlNldCgwLCAwLCBydE1vbnRoQ2FsLndpZHRoLCBydE1vbnRoQ2FsLmhlaWdodCk7DQotICAgIG1fcE1vbnRoQ2FsLT5TZXRXaWRnZXRSZWN0KHJ0TW9udGhDYWwpOw0KLX0NCi12b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fSW5pdERhdGVUaW1lRWRpdCgpDQotew0KLSAgICBpZiAobV9wRWRpdCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wRWRpdDsNCi0gICAgcHJvcEVkaXQubV9wUGFyZW50ID0gKElGV0xfV2lkZ2V0Kil0aGlzOw0KLSAgICBwcm9wRWRpdC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCi0gICAgbV9wRWRpdCA9IG5ldyBJRldMX0RhdGVUaW1lRWRpdCgpOw0KLSAgICBtX3BFZGl0LT5Jbml0aWFsaXplKHByb3BFZGl0LCBtX3BJbnRlcmZhY2UpOw0KLX0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fSXNNb250aENhbGVuZGFyU2hvd2VkKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wTW9udGhDYWwsIEZBTFNFKTsNCi0gICAgcmV0dXJuICEobV9wTW9udGhDYWwtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7DQotfQ0KLXZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9TaG93TW9udGhDYWxlbmRhcihGWF9CT09MIGJBY3RpdmF0ZSkNCi17DQotICAgIEZYX0JPT0wgYlNob3dlZCA9IElzTW9udGhDYWxlbmRhclNob3dlZCgpOw0KLSAgICBpZihiU2hvd2VkID09IGJBY3RpdmF0ZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChiQWN0aXZhdGUpIHsNCi0gICAgICAgIENGWF9SZWN0RiBydE1vbnRoQ2FsOw0KLSAgICAgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aENhbCwgVFJVRSk7DQotICAgICAgICBGWF9EV09SRCBkd1BvcyA9IDA7DQotICAgICAgICBGWF9GTE9BVCBmUG9wdXBIZWlnaHQgPSAwLjBmOw0KLSAgICAgICAgRlhfRkxPQVQgZlBvcHVwTWluID0gcnRNb250aENhbC5oZWlnaHQ7DQotICAgICAgICBGWF9GTE9BVCBmUG9wdXBNYXggPSBydE1vbnRoQ2FsLmhlaWdodDsNCi0gICAgICAgIENGWF9SZWN0RiBydEFuY2hvcihtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0KTsNCi0gICAgICAgIHJ0QW5jaG9yLndpZHRoID0gcnRNb250aENhbC53aWR0aDsNCi0gICAgICAgIHJ0TW9udGhDYWwubGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCi0gICAgICAgIHJ0TW9udGhDYWwudG9wID0gcnRBbmNob3IuSGVpZ2h0KCk7DQotICAgICAgICBHZXRQb3B1cFBvcyhmUG9wdXBNaW4sIGZQb3B1cE1heCwgcnRBbmNob3IsIHJ0TW9udGhDYWwpOw0KLSAgICAgICAgbV9wTW9udGhDYWwtPlNldFdpZGdldFJlY3QocnRNb250aENhbCk7DQotICAgICAgICBpZiAobV9pWWVhciA+IDAgJiYgIG1faU1vbnRoID4gMCAmJiBtX2lEYXkgPiAwKSB7DQotICAgICAgICAgICAgbV9wTW9udGhDYWwtPlNldFNlbGVjdChtX2lZZWFyLCBtX2lNb250aCwgbV9pRGF5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcE1vbnRoQ2FsLT5VcGRhdGUoKTsNCi0gICAgfQ0KLSAgICBtX3BNb250aENhbC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsICFiQWN0aXZhdGUpOw0KLSAgICBpZiAoYkFjdGl2YXRlKSB7DQotICAgICAgICBDRldMX01zZ1NldEZvY3VzIG1zZzsNCi0gICAgICAgIG1zZy5tX3BEc3RUYXJnZXQgPSBtX3BNb250aENhbDsNCi0gICAgICAgIG1zZy5tX3BTcmNUYXJnZXQgPSBtX3BFZGl0Ow0KLSAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gbV9wRWRpdC0+U2V0RGVsZWdhdGUoTlVMTCk7DQotICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UoJm1zZyk7DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZSwgcnRDYWw7DQotICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwNCi0gICAgICAgICAgICAgICAgICAgICAwLA0KLSAgICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KLSAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydENhbCk7DQotICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihydENhbCk7DQotICAgIHJ0SW52YWxpZGF0ZS5JbmZsYXRlKDIsIDIpOw0KLSAgICBSZXBhaW50KCZydEludmFsaWRhdGUpOw0KLX0NCi1GWF9EV09SRCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0hpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJlY3Q7DQotICAgIHJlY3QuU2V0KDAsIDAsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCi0gICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0VkaXQ7DQotICAgIH0NCi0gICAgaWYgKERpc0Zvcm1fSXNOZWVkU2hvd0J1dHRvbigpKSB7DQotICAgICAgICByZWN0LndpZHRoICs9IG1fZkJ0bjsNCi0gICAgfQ0KLSAgICBpZiAocmVjdC5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KLSAgICB9DQotICAgIGlmIChJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KLSAgICAgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocmVjdCk7DQotICAgICAgICBpZiAocmVjdC5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCi19DQotRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0lzTmVlZFNob3dCdXR0b24oKQ0KLXsNCi0gICAgRlhfQk9PTCBiRm9jdXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQgfHwNCi0gICAgICAgICAgICAgICAgICAgICBtX3BNb250aENhbC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCB8fA0KLSAgICAgICAgICAgICAgICAgICAgIG1fcEVkaXQtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQotICAgIHJldHVybiBiRm9jdXMgOw0KLX0NCi1GV0xfRVJSCUNGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fVXBkYXRlKCkNCi17DQotICAgIGlmIChtX2lMb2NrKSB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLSAgICB9DQotICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KLSAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgIH0NCi0gICAgbV9wRWRpdC0+U2V0VGhlbWVQcm92aWRlcihtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCi0gICAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCi0gICAgbV9wRWRpdC0+U2V0V2lkZ2V0UmVjdChtX3J0Q2xpZW50KTsNCi0gICAgUmVTZXRFZGl0QWxpZ25tZW50KCk7DQotICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KLSAgICBpZiAobV9wTW9udGhDYWwtPkdldFRoZW1lUHJvdmlkZXIoKSA9PSBOVUxMKSB7DQotICAgICAgICBtX3BNb250aENhbC0+U2V0VGhlbWVQcm92aWRlcihtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKSB7DQotICAgICAgICBJRldMX0RhdGVUaW1lUGlja2VyRFAgKnBEYXRhID0gKElGV0xfRGF0ZVRpbWVQaWNrZXJEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICAgICAgcERhdGEtPkdldFRvZGF5KChJRldMX1dpZGdldCopdGhpcywNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX01vbnRoQ2FsZW5kYXJEUC5tX2lDdXJZZWFyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fTW9udGhDYWxlbmRhckRQLm1faUN1ck1vbnRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fTW9udGhDYWxlbmRhckRQLm1faUN1ckRheSk7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgKnBXaWR0aCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWR0aCwgMCk7DQotICAgIG1fZkJ0biA9ICpwV2lkdGg7DQotICAgIENGWF9SZWN0RiBydE1vbnRoQ2FsOw0KLSAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoQ2FsLCBUUlVFKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0UG9wVXA7DQotICAgIHJ0UG9wVXAuU2V0KHJ0TW9udGhDYWwubGVmdCwgcnRNb250aENhbC50b3AgKyBGV0xfRFRQX0hFSUdIVCwgcnRNb250aENhbC53aWR0aCwgcnRNb250aENhbC5oZWlnaHQpOw0KLSAgICBtX3BNb250aENhbC0+U2V0V2lkZ2V0UmVjdChydFBvcFVwKTsNCi0gICAgbV9wTW9udGhDYWwtPlVwZGF0ZSgpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9HZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpDQotew0KLSAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgaWYgKERpc0Zvcm1fSXNOZWVkU2hvd0J1dHRvbigpKSB7DQotICAgICAgICByZWN0LndpZHRoICs9IG1fZkJ0bjsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9HZXRCQm94KENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICBpZiAoRGlzRm9ybV9Jc05lZWRTaG93QnV0dG9uKCkpIHsNCi0gICAgICAgIHJlY3Qud2lkdGggKz0gbV9mQnRuOw0KLSAgICB9DQotICAgIGlmIChJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0TW9udGg7DQotICAgICAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoKTsNCi0gICAgICAgIHJ0TW9udGguT2Zmc2V0KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3ApOw0KLSAgICAgICAgcmVjdC5VbmlvbihydE1vbnRoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGlmIChtX3BFZGl0KSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRFZGl0Ow0KLSAgICAgICAgbV9wRWRpdC0+R2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KLSAgICAgICAgQ0ZYX01hdHJpeCBtdDsNCi0gICAgICAgIG10LlNldCgxLCAwLCAwLCAxLCBydEVkaXQubGVmdCwgcnRFZGl0LnRvcCk7DQotICAgICAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgICAgICB9DQotICAgICAgICBtX3BFZGl0LT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgJm10KTsNCi0gICAgfQ0KLSAgICBpZiAoSXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCi0gICAgICAgIENGWF9SZWN0RiBydE1vbnRoOw0KLSAgICAgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aCk7DQotICAgICAgICBDRlhfTWF0cml4IG10Ow0KLSAgICAgICAgbXQuU2V0KDEsIDAsIDAsIDEsIHJ0TW9udGgubGVmdCwgcnRNb250aC50b3ApOw0KLSAgICAgICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgICAgICBtdC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wTW9udGhDYWwtPkRyYXdXaWRnZXQocEdyYXBoaWNzLCAmbXQpOw0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGUoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCAqcE93bmVyKQ0KLSAgICA6IG1fcE93bmVyKHBPd25lcikNCi17DQotfQ0KLWludDMyX3QgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCi0gICAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCi0gICAgaW50MzJfdCBpUmV0ID0gMTsNCi0gICAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KLSAgICAgICAgICAgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KLSAgICAgICAgICAgICAgICBDRldMX01zZ01vdXNlICpwTW91c2UgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1vdXNlLT5tX2R3Q21kOw0KLSAgICAgICAgICAgICAgICBzd2l0Y2goZHdDbWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1vdXNlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvblVwKHBNb3VzZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShwTW91c2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VMZWF2ZShwTW91c2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgaVJldCA9IDA7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmKGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9LZXkgJiYgbV9wT3duZXItPm1fcEVkaXQtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCi0gICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BFZGl0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgIHJldHVybglwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCi19DQotRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KLX0NCi12b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQpDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBNc2cpOw0KLSAgICBpZiAobV9wT3duZXItPm1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIERpc0Zvcm1fT25Gb2N1c0NoYW5nZWQocE1zZywgYlNldCk7DQotICAgIH0NCi0gICAgaWYgKGJTZXQpIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IChGV0xfV0dUU1RBVEVfRm9jdXNlZCk7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfihGV0xfV0dUU1RBVEVfRm9jdXNlZCk7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KLSAgICB9DQotICAgIGlmKHBNc2ctPm1fcFNyY1RhcmdldCA9PSAoSUZXTF9XaWRnZXQqKW1fcE93bmVyLT5tX3BNb250aENhbCAmJiBtX3BPd25lci0+SXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCi0gICAgICAgIG1fcE93bmVyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQotICAgIH0NCit2b2lkIENGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlOjpPbkxCdXR0b25Eb3duRXgoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgaWYgKG1fcE93bmVyLT5tX3J0TEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pTEJ0blBhcnRTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkOw0KKyAgICBtX3BPd25lci0+UHJldk1vbnRoKCk7DQogICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQotfQ0KLXZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBNc2cpOw0KLSAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCi0gICAgICAgIG1fcE93bmVyLT5TZXRGb2N1cyhUUlVFKTsNCisgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcnRSQnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIG1fcE93bmVyLT5tX2lSQnRuUGFydFN0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkOw0KKyAgICBtX3BPd25lci0+TmV4dE1vbnRoKCk7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX3J0VG9kYXkuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTm9Ub2RheSkgPT0NCisgICAgICAgIDApIHsNCisgICAgICBtX3BPd25lci0+SnVtcFRvVG9kYXkoKTsNCisgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KICAgICB9DQotICAgIGlmIChtX3BPd25lci0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KLSAgICAgICAgaWYgKG1fcE93bmVyLT5Jc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQotICAgICAgICAgICAgQ0ZXTF9FdmVudF9EdHBDbG9zZVVwIGV2Ow0KLSAgICAgICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZldik7DQorICB9IGVsc2Ugew0KKyAgICBJRldMX0RhdGVUaW1lUGlja2VyKiBwSVBpY2tlciA9IChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BPd25lci0+bV9wT3V0ZXI7DQorICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqIHBQaWNrZXIgPQ0KKyAgICAgICAgKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqKSgoSUZXTF9UYXJnZXREYXRhKilwSVBpY2tlciktPkdldERhdGEoKTsNCisgICAgaWYgKHBQaWNrZXItPklzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQorICAgICAgbV9iRmxhZyA9IDE7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZTo6T25MQnV0dG9uVXBFeChDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9PbkxCdXR0b25VcEV4KHBNc2cpOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3J0TEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pTEJ0blBhcnRTdGF0ZXMgPSAwOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRMQnRuKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3J0UkJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pUkJ0blBhcnRTdGF0ZXMgPSAwOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSQnRuKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3J0VG9kYXkuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpT2xkU2VsID0gMDsNCisgIGlmIChtX3BPd25lci0+bV9hcnJTZWxEYXlzLkdldFNpemUoKSA+IDApIHsNCisgICAgaU9sZFNlbCA9IG1fcE93bmVyLT5tX2FyclNlbERheXNbMF07DQorICB9DQorICBpbnQzMl90IGlDdXJTZWwgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIENGWF9SZWN0RiBydDsNCisgIElGV0xfRGF0ZVRpbWVQaWNrZXIqIHBJUGlja2VyID0gKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE93bmVyLT5tX3BPdXRlcjsNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqIHBQaWNrZXIgPQ0KKyAgICAgIChDRldMX0RhdGVUaW1lUGlja2VySW1wKikoKElGV0xfVGFyZ2V0RGF0YSopcElQaWNrZXIpLT5HZXREYXRhKCk7DQorICBwUGlja2VyLT5tX3BGb3JtLT5HZXRXaWRnZXRSZWN0KHJ0KTsNCisgIHJ0LlNldCgwLCAwLCBydC53aWR0aCwgcnQuaGVpZ2h0KTsNCisgIGlmIChpQ3VyU2VsID4gMCkgew0KKyAgICBMUERBVEVJTkZPIGxwRGF0ZXNJbmZvID0NCisgICAgICAgIChMUERBVEVJTkZPKW1fcE93bmVyLT5tX2FyckRhdGVzLkdldEF0KGlDdXJTZWwgLSAxKTsNCisgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZShscERhdGVzSW5mby0+cmVjdCk7DQorICAgIGlmIChpT2xkU2VsID4gMCAmJiBpT2xkU2VsIDw9IG1fcE93bmVyLT5tX2FyckRhdGVzLkdldFNpemUoKSkgew0KKyAgICAgIGxwRGF0ZXNJbmZvID0gKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaU9sZFNlbCAtIDEpOw0KKyAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihscERhdGVzSW5mby0+cmVjdCk7DQorICAgIH0NCisgICAgbV9wT3duZXItPkFkZFNlbERheShpQ3VyU2VsKTsNCisgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BPd25lci0+bV9wT3V0ZXIpOw0KKyAgICBwUGlja2VyLT5Qcm9jZXNzU2VsQ2hhbmdlZChtX3BPd25lci0+bV9pQ3VyWWVhciwgbV9wT3duZXItPm1faUN1ck1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3VyU2VsKTsNCisgICAgcFBpY2tlci0+U2hvd01vbnRoQ2FsZW5kYXIoRkFMU0UpOw0KKyAgfSBlbHNlIGlmIChtX2JGbGFnICYmICghcnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpKSB7DQorICAgIElGV0xfRGF0ZVRpbWVQaWNrZXIqIHBJUGlja2VyID0gKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE93bmVyLT5tX3BPdXRlcjsNCisgICAgQ0ZXTF9EYXRlVGltZVBpY2tlckltcCogcFBpY2tlciA9DQorICAgICAgICAoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCopKChJRldMX1RhcmdldERhdGEqKXBJUGlja2VyKS0+R2V0RGF0YSgpOw0KKyAgICBwUGlja2VyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQorICB9DQorICBtX2JGbGFnID0gMDsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZTo6T25Nb3VzZU1vdmVFeChDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX011bHRpU2VsZWN0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYlJlcGFpbnQgPSBGQUxTRTsNCisgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICBydEludmFsaWRhdGUuU2V0KDAsIDAsIDAsIDApOw0KKyAgaWYgKG1fcE93bmVyLT5tX3J0RGF0ZXMuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgaW50MzJfdCBpSG92ZXIgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgYlJlcGFpbnQgPSBtX3BPd25lci0+bV9pSG92ZXJlZCAhPSBpSG92ZXI7DQorICAgIGlmIChiUmVwYWludCkgew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9pSG92ZXJlZCA+IDApIHsNCisgICAgICAgIG1fcE93bmVyLT5HZXREYXlSZWN0KG1fcE93bmVyLT5tX2lIb3ZlcmVkLCBydEludmFsaWRhdGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaUhvdmVyID4gMCkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0RGF5Ow0KKyAgICAgICAgbV9wT3duZXItPkdldERheVJlY3QoaUhvdmVyLCBydERheSk7DQorICAgICAgICBpZiAocnRJbnZhbGlkYXRlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBydEludmFsaWRhdGUgPSBydERheTsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKCEobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX1RpbWVGb3JtYXQpKSB7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5TaG93TW9udGhDYWxlbmRhcihUUlVFKTsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9FdmVudF9EdHBEcm9wRG93biBldjsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJmV2KTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX3BPd25lci0+bV9iTEJ0bkRvd24gPSBUUlVFOw0KLSAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihydERheSk7DQogICAgICAgICB9DQorICAgICAgfQ0KICAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpPbkxCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTXNnKTsNCi0gICAgbV9wT3duZXItPm1fYkxCdG5Eb3duID0gRkFMU0U7DQotICAgIGlmIChtX3BPd25lci0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KLSAgICAgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9EVFBfSG92ZXJlZDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX2lCdG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfRFRQX05vcm1hbDsNCisgICAgbV9wT3duZXItPm1faUhvdmVyZWQgPSBpSG92ZXI7DQorICAgIENGV0xfRXZlbnRfRHRwSG92ZXJDaGFuZ2VkIGV2Ow0KKyAgICBldi5ob3ZlcmRheSA9IGlIb3ZlcjsNCisgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJmV2KTsNCisgIH0gZWxzZSB7DQorICAgIGJSZXBhaW50ID0gbV9wT3duZXItPm1faUhvdmVyZWQgPiAwOw0KKyAgICBpZiAoYlJlcGFpbnQpIHsNCisgICAgICBtX3BPd25lci0+R2V0RGF5UmVjdChtX3BPd25lci0+bV9pSG92ZXJlZCwgcnRJbnZhbGlkYXRlKTsNCiAgICAgfQ0KLSAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRCdG4pOw0KLX0NCi12b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIGlmIChtX3BPd25lci0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsOw0KLSAgICB9DQotICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydEJ0bik7DQotfQ0KLXZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE1zZyk7DQotICAgIG1fcE93bmVyLT5tX2lCdG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfRFRQX05vcm1hbDsNCi0gICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0QnRuKTsNCi19DQotdm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6OkRpc0Zvcm1fT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQpDQotew0KLSAgICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlKG1fcE93bmVyLT5tX3J0QnRuKTsNCi0gICAgaWYgKGJTZXQpIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KLSAgICAgICAgaWYgKCBtX3BPd25lci0+bV9wRWRpdCAmJiAhKG1fcE93bmVyLT5tX3BFZGl0LT5HZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkpIHsNCi0gICAgICAgICAgICBtX3BPd25lci0+bV9ydEJ0bi5TZXQobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX2ZCdG4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCAtIDEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcnRJbnZhbGlkYXRlID0gbV9wT3duZXItPm1fcnRCdG47DQotICAgICAgICBwTXNnLT5tX3BEc3RUYXJnZXQgPSBtX3BPd25lci0+bV9wRWRpdDsNCi0gICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BFZGl0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRm9jdXNlZDsNCi0gICAgICAgIG1fcE93bmVyLT5tX3J0QnRuLlNldCgwLCAwLCAwLCAwKTsNCi0gICAgICAgIGlmIChtX3BPd25lci0+RGlzRm9ybV9Jc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wT3duZXItPm1fcEVkaXQtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCi0gICAgICAgICAgICBwTXNnLT5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wRWRpdDsNCi0gICAgICAgICAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBtX3BPd25lci0+bV9wRWRpdC0+U2V0RGVsZWdhdGUoTlVMTCk7DQotICAgICAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNc2cpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJ0SW52YWxpZGF0ZS5JbmZsYXRlKDIsIDIpOw0KKyAgICBtX3BPd25lci0+bV9pSG92ZXJlZCA9IC0xOw0KKyAgfQ0KKyAgaWYgKGJSZXBhaW50ICYmICFydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQogICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgfQ0KK30NCitpbnQzMl90IENGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlOjpEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UoDQorICAgIENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIGlmIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgIENGV0xfTXNnTW91c2UqIHBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgIGlmIChwTXNnLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXApIHsNCisgICAgICBEaXNGb3JtX09uTEJ1dHRvblVwRXgocE1zZyk7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGU6OkRpc0Zvcm1fT25MQnV0dG9uVXBFeChDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fcnRMQnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIG1fcE93bmVyLT5tX2lMQnRuUGFydFN0YXRlcyA9IDA7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRMQnRuKSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX3BPd25lci0+bV9ydFJCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgbV9wT3duZXItPm1faVJCdG5QYXJ0U3RhdGVzID0gMDsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJihtX3BPd25lci0+bV9ydFJCdG4pKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3J0VG9kYXkuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpT2xkU2VsID0gMDsNCisgIGlmIChtX3BPd25lci0+bV9hcnJTZWxEYXlzLkdldFNpemUoKSA+IDApIHsNCisgICAgaU9sZFNlbCA9IG1fcE93bmVyLT5tX2FyclNlbERheXNbMF07DQorICB9DQorICBpbnQzMl90IGlDdXJTZWwgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIGlmIChpQ3VyU2VsID4gMCkgew0KKyAgICBMUERBVEVJTkZPIGxwRGF0ZXNJbmZvID0NCisgICAgICAgIChMUERBVEVJTkZPKW1fcE93bmVyLT5tX2FyckRhdGVzLkdldEF0KGlDdXJTZWwgLSAxKTsNCisgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZShscERhdGVzSW5mby0+cmVjdCk7DQorICAgIGlmIChpT2xkU2VsID4gMCAmJiBpT2xkU2VsIDw9IG1fcE93bmVyLT5tX2FyckRhdGVzLkdldFNpemUoKSkgew0KKyAgICAgIGxwRGF0ZXNJbmZvID0gKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaU9sZFNlbCAtIDEpOw0KKyAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihscERhdGVzSW5mby0+cmVjdCk7DQorICAgIH0NCisgICAgbV9wT3duZXItPkFkZFNlbERheShpQ3VyU2VsKTsNCisgICAgQ0ZXTF9EYXRlVGltZVBpY2tlckltcCogcERhdGVUaW1lID0NCisgICAgICAgIChDRldMX0RhdGVUaW1lUGlja2VySW1wKikoKElGV0xfVGFyZ2V0RGF0YSopbV9wT3duZXItPm1fcE91dGVyKQ0KKyAgICAgICAgICAgIC0+R2V0RGF0YSgpOw0KKyAgICBwRGF0ZVRpbWUtPlByb2Nlc3NTZWxDaGFuZ2VkKG1fcE93bmVyLT5tX2lDdXJZZWFyLCBtX3BPd25lci0+bV9pQ3VyTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUN1clNlbCk7DQorICAgIHBEYXRlVGltZS0+U2hvd01vbnRoQ2FsZW5kYXIoRkFMU0UpOw0KKyAgfQ0KK30NCitDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDRldMX0RhdGVUaW1lUGlja2VySW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKSwNCisgICAgICBtX2JMQnRuRG93bihGQUxTRSksDQorICAgICAgbV9pQnRuU3RhdGUoMSksDQorICAgICAgbV9pWWVhcigtMSksDQorICAgICAgbV9pTW9udGgoLTEpLA0KKyAgICAgIG1faURheSgtMSksDQorICAgICAgbV9wRWRpdChOVUxMKSwNCisgICAgICBtX3BNb250aENhbChOVUxMKSwNCisgICAgICBtX3BGb3JtKEZBTFNFKSB7DQorICBtX3J0QnRuLlNldCgwLCAwLCAwLCAwKTsNCit9DQorQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6Q0ZXTF9EYXRlVGltZVBpY2tlckltcCgNCisgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlciksDQorICAgICAgbV9iTEJ0bkRvd24oRkFMU0UpLA0KKyAgICAgIG1faUJ0blN0YXRlKDEpLA0KKyAgICAgIG1faVllYXIoLTEpLA0KKyAgICAgIG1faU1vbnRoKC0xKSwNCisgICAgICBtX2lEYXkoLTEpLA0KKyAgICAgIG1fcEVkaXQoTlVMTCksDQorICAgICAgbV9wTW9udGhDYWwoTlVMTCksDQorICAgICAgbV9wRm9ybShGQUxTRSkgew0KKyAgbV9ydEJ0bi5TZXQoMCwgMCwgMCwgMCk7DQorfQ0KK0NGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6On5DRldMX0RhdGVUaW1lUGlja2VySW1wKCkgew0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgbV9wRWRpdC0+UmVsZWFzZSgpOw0KKyAgICBtX3BFZGl0ID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BNb250aENhbCkgew0KKyAgICBtX3BNb250aENhbC0+UmVsZWFzZSgpOw0KKyAgICBtX3BNb250aENhbCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wRm9ybSkgew0KKyAgICBtX3BGb3JtLT5SZWxlYXNlKCk7DQorICAgIG1fcEZvcm0gPSBOVUxMOw0KKyAgfQ0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19EYXRlVGltZVBpY2tlcjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkluaXRpYWxpemUoKSB7DQorICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIG1fcERlbGVnYXRlID0NCisgICAgICAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgPSBGV0xfU1RZTEVFWFRfRFRQX1Nob3J0RGF0ZUZvcm1hdDsNCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wTW9udGg7DQorICBwcm9wTW9udGgubV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9Qb3B1cCB8IEZXTF9XR1RTVFlMRV9Cb3JkZXI7DQorICBwcm9wTW9udGgubV9kd1N0YXRlcyA9IEZXTF9XR1RTVEFURV9JbnZpc2libGU7DQorICBwcm9wTW9udGgubV9wRGF0YVByb3ZpZGVyID0gJm1fTW9udGhDYWxlbmRhckRQOw0KKyAgcHJvcE1vbnRoLm1fcFBhcmVudCA9IG1fcEludGVyZmFjZTsNCisgIHByb3BNb250aC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIG1fcE1vbnRoQ2FsID0gbmV3IElGV0xfRGF0ZVRpbWVDYWxlbmRlcigpOw0KKyAgbV9wTW9udGhDYWwtPkluaXRpYWxpemUocHJvcE1vbnRoLCBtX3BJbnRlcmZhY2UpOw0KKyAgQ0ZYX1JlY3RGIHJ0TW9udGhDYWw7DQorICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoQ2FsLCBUUlVFKTsNCisgIHJ0TW9udGhDYWwuU2V0KDAsIDAsIHJ0TW9udGhDYWwud2lkdGgsIHJ0TW9udGhDYWwuaGVpZ2h0KTsNCisgIG1fcE1vbnRoQ2FsLT5TZXRXaWRnZXRSZWN0KHJ0TW9udGhDYWwpOw0KKyAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3BFZGl0Ow0KKyAgcHJvcEVkaXQubV9wUGFyZW50ID0gbV9wSW50ZXJmYWNlOw0KKyAgcHJvcEVkaXQubV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBtX3BFZGl0ID0gbmV3IElGV0xfRGF0ZVRpbWVFZGl0KCk7DQorICBtX3BFZGl0LT5Jbml0aWFsaXplKHByb3BFZGl0LCBtX3BJbnRlcmZhY2UpOw0KKyAgUmVnaXN0ZXJFdmVudFRhcmdldChtX3BNb250aENhbCk7DQorICBSZWdpc3RlckV2ZW50VGFyZ2V0KG1fcEVkaXQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkZpbmFsaXplKCkgew0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgbV9wRWRpdC0+RmluYWxpemUoKTsNCisgIH0NCisgIGlmIChtX3BNb250aENhbCkgew0KKyAgICBtX3BNb250aENhbC0+RmluYWxpemUoKTsNCisgIH0NCisgIGlmIChtX3BGb3JtKSB7DQorICAgIG1fcEZvcm0tPkZpbmFsaXplKCk7DQorICB9DQorICBVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoKTsNCisgIGlmIChtX3BEZWxlZ2F0ZSkgew0KKyAgICBkZWxldGUgKENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQorICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgcmV0dXJuIERpc0Zvcm1fR2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpOw0KKyAgfQ0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LlNldCgwLCAwLCBGV0xfRFRQX1dJRFRILCBGV0xfRFRQX0hFSUdIVCk7DQorICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6VXBkYXRlKCkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9VcGRhdGUoKTsNCisgIH0NCisgIGlmIChtX2lMb2NrKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBtX3BFZGl0LT5TZXRUaGVtZVByb3ZpZGVyKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgIEZYX0ZMT0FUKiBwRldpZHRoID0NCisgICAgICAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEZXaWR0aCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIEZYX0ZMT0FUIGZCdG4gPSAqcEZXaWR0aDsNCisgIG1fcnRCdG4uU2V0KG1fcnRDbGllbnQucmlnaHQoKSAtIGZCdG4sIG1fcnRDbGllbnQudG9wLCBmQnRuIC0gMSwNCisgICAgICAgICAgICAgIG1fcnRDbGllbnQuaGVpZ2h0IC0gMSk7DQorICBDRlhfUmVjdEYgcnRFZGl0Ow0KKyAgcnRFZGl0LlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQudG9wLCBtX3J0Q2xpZW50LndpZHRoIC0gZkJ0biwNCisgICAgICAgICAgICAgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgbV9wRWRpdC0+U2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KKyAgUmVTZXRFZGl0QWxpZ25tZW50KCk7DQorICBtX3BFZGl0LT5VcGRhdGUoKTsNCisgIGlmICghKG1fcE1vbnRoQ2FsLT5HZXRUaGVtZVByb3ZpZGVyKCkpKSB7DQorICAgIG1fcE1vbnRoQ2FsLT5TZXRUaGVtZVByb3ZpZGVyKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcikgew0KKyAgICBJRldMX0RhdGVUaW1lUGlja2VyRFAqIHBEYXRhID0NCisgICAgICAgIChJRldMX0RhdGVUaW1lUGlja2VyRFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgcERhdGEtPkdldFRvZGF5KG1fcEludGVyZmFjZSwgbV9Nb250aENhbGVuZGFyRFAubV9pQ3VyWWVhciwNCisgICAgICAgICAgICAgICAgICAgIG1fTW9udGhDYWxlbmRhckRQLm1faUN1ck1vbnRoLCBtX01vbnRoQ2FsZW5kYXJEUC5tX2lDdXJEYXkpOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0TW9udGhDYWw7DQorICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoQ2FsLCBUUlVFKTsNCisgIENGWF9SZWN0RiBydFBvcFVwOw0KKyAgcnRQb3BVcC5TZXQocnRNb250aENhbC5sZWZ0LCBydE1vbnRoQ2FsLnRvcCArIEZXTF9EVFBfSEVJR0hULA0KKyAgICAgICAgICAgICAgcnRNb250aENhbC53aWR0aCwgcnRNb250aENhbC5oZWlnaHQpOw0KKyAgbV9wTW9udGhDYWwtPlNldFdpZGdldFJlY3QocnRQb3BVcCk7DQorICBtX3BNb250aENhbC0+VXBkYXRlKCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHJldHVybiBEaXNGb3JtX0hpdFRlc3QoZngsIGZ5KTsNCisgIH0NCisgIGlmIChtX3J0Q2xpZW50LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCisgIH0NCisgIGlmIChJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KKyAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgRldMX1BBUlRfRFRQX0JvcmRlciwgcFRoZW1lLCBwTWF0cml4KTsNCisgIH0NCisgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgRHJhd0VkZ2UocEdyYXBoaWNzLCBGV0xfUEFSVF9EVFBfRWRnZSwgcFRoZW1lLCBwTWF0cml4KTsNCisgIH0NCisgIGlmICghbV9ydEJ0bi5Jc0VtcHR5KCkpIHsNCisgICAgRHJhd0Ryb3BEb3duQnV0dG9uKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIH0NCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgcmV0dXJuIERpc0Zvcm1fRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVFApIHsNCisgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBwVFA7DQorICBtX3BNb250aENhbC0+U2V0VGhlbWVQcm92aWRlcihwVFApOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkdldEN1clNlbChpbnQzMl90JiBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSkgew0KKyAgaVllYXIgPSBtX2lZZWFyOw0KKyAgaU1vbnRoID0gbV9pTW9udGg7DQorICBpRGF5ID0gbV9pRGF5Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlNldEN1clNlbChpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChpWWVhciA+IDAgJiYgaVllYXIgPCAzMDAwLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChpTW9udGggPiAwICYmIGlNb250aCA8IDEzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChpRGF5ID4gMCAmJiBpRGF5IDwgMzIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBtX2lZZWFyID0gaVllYXI7DQorICBtX2lNb250aCA9IGlNb250aDsNCisgIG1faURheSA9IGlEYXk7DQorICBtX3BNb250aENhbC0+U2V0U2VsZWN0KGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWRpdCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIGludDMyX3QgaVJldCA9IG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCisgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KKyAgQ0ZXTF9FdmVudF9EdHBFZGl0Q2hhbmdlZCBldjsNCisgIGV2Lm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgRGlzcGF0Y2hFdmVudCgmZXYpOw0KKyAgcmV0dXJuIGlSZXQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6R2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQpIGNvbnN0IHsNCisgIGlmIChtX3BFZGl0KSB7DQorICAgIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDYW5VbmRvKCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkNhblVuZG8oKTsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDYW5SZWRvKCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkNhblJlZG8oKTsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpVbmRvKCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPlVuZG8oKTsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpSZWRvKCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPlJlZG8oKTsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDYW5Db3B5KCkgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX3BFZGl0LT5Db3VudFNlbFJhbmdlcygpOw0KKyAgcmV0dXJuIG5Db3VudCA+IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6Q2FuQ3V0KCkgew0KKyAgaWYgKG1fcEVkaXQtPkdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgbkNvdW50ID0gbV9wRWRpdC0+Q291bnRTZWxSYW5nZXMoKTsNCisgIHJldHVybiBuQ291bnQgPiAwOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNhblNlbGVjdEFsbCgpIHsNCisgIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0TGVuZ3RoKCkgPiAwOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkNvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KSB7DQorICByZXR1cm4gbV9wRWRpdC0+Q3V0KHdzQ3V0KTsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPlBhc3RlKHdzUGFzdGUpOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlNlbGVjdEFsbCgpIHsNCisgIHJldHVybiAobV9wRWRpdC0+QWRkU2VsUmFuZ2UoMCkgPT0gRldMX0VSUl9TdWNjZWVkZWQpID8gVFJVRSA6IEZBTFNFOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRlbGV0ZSgpIHsNCisgIHJldHVybiAobV9wRWRpdC0+Q2xlYXJUZXh0KCkgPT0gRldMX0VSUl9TdWNjZWVkZWQpID8gVFJVRSA6IEZBTFNFOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRlU2VsZWN0KCkgew0KKyAgcmV0dXJuIChtX3BFZGl0LT5DbGVhclNlbGVjdGlvbnMoKSA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgPyBUUlVFIDogRkFMU0U7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6R2V0QkJveChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgcmV0dXJuIERpc0Zvcm1fR2V0QkJveChyZWN0KTsNCisgIH0NCisgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgaWYgKElzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQorICAgIENGWF9SZWN0RiBydE1vbnRoOw0KKyAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoKTsNCisgICAgcnRNb250aC5PZmZzZXQobV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LnRvcCk7DQorICAgIHJlY3QuVW5pb24ocnRNb250aCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6U2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KSB7DQorICByZXR1cm4gbV9wRWRpdC0+U2V0TGltaXQobkxpbWl0KTsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpNb2RpZnlFZGl0U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKSB7DQorICByZXR1cm4gbV9wRWRpdC0+TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RHJhd0Ryb3BEb3duQnV0dG9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9EVFBfU3BpbikgPT0NCisgICAgICBGV0xfU1RZTEVFWFRfRFRQX1NwaW4pIHsNCisgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICAgIHByb3AubV9kd1N0eWxlRXhlcyB8PSBGV0xfU1RZTEVFWEVfU1BCX1ZlcnQ7DQorICAgIHByb3AubV9wUGFyZW50ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwcm9wLm1fcnRXaWRnZXQgPSBtX3J0QnRuOw0KKyAgICBJRldMX1NwaW5CdXR0b24qIHBTcGluID0gSUZXTF9TcGluQnV0dG9uOjpDcmVhdGUoKTsNCisgICAgcFNwaW4tPkluaXRpYWxpemUocHJvcCwgbV9wSW50ZXJmYWNlKTsNCisgIH0gZWxzZSB7DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9EVFBfRHJvcERvd25CdXR0b247DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX2lCdG5TdGF0ZTsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydEJ0bjsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB9DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgIH0NCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpGb3JtYXREYXRlU3RyaW5nKGludDMyX3QgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9EVFBfU2hvcnREYXRlRm9ybWF0KSA9PQ0KKyAgICAgIEZXTF9TVFlMRUVYVF9EVFBfU2hvcnREYXRlRm9ybWF0KSB7DQorICAgIHdzVGV4dC5Gb3JtYXQoTCIlZC0lZC0lZCIsIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgfSBlbHNlIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9EVFBfTG9uZ0RhdGVGb3JtYXQpID09DQorICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9EVFBfTG9uZ0RhdGVGb3JtYXQpIHsNCisgICAgd3NUZXh0LkZvcm1hdChMIiVkIFllYXIgJWQgTW9udGggJWQgRGF5IiwgaVllYXIsIGlNb250aCwgaURheSk7DQorICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9UaW1lRm9ybWF0KSA9PQ0KKyAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfRFRQX1RpbWVGb3JtYXQpIHsNCisgIH0NCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpTaG93TW9udGhDYWxlbmRhcihGWF9CT09MIGJBY3RpdmF0ZSkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9TaG93TW9udGhDYWxlbmRhcihiQWN0aXZhdGUpOw0KKyAgfQ0KKyAgaWYgKElzTW9udGhDYWxlbmRhclNob3dlZCgpID09IGJBY3RpdmF0ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoIW1fcEZvcm0pIHsNCisgICAgSW5pdFByb3h5Rm9ybSgpOw0KKyAgfQ0KKyAgaWYgKGJBY3RpdmF0ZSkgew0KKyAgICBDRlhfUmVjdEYgcnRNb250aDsNCisgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aCk7DQorICAgIENGWF9SZWN0RiBydEFuY2hvcjsNCisgICAgcnRBbmNob3IuU2V0KDAsIDAsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQorICAgIEdldFBvcHVwUG9zKDAsIHJ0TW9udGguaGVpZ2h0LCBydEFuY2hvciwgcnRNb250aCk7DQorICAgIG1fcEZvcm0tPlNldFdpZGdldFJlY3QocnRNb250aCk7DQorICAgIHJ0TW9udGgubGVmdCA9IHJ0TW9udGgudG9wID0gMDsNCisgICAgbV9wTW9udGhDYWwtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCAhYkFjdGl2YXRlKTsNCisgICAgbV9wTW9udGhDYWwtPlNldFdpZGdldFJlY3QocnRNb250aCk7DQorICAgIG1fcE1vbnRoQ2FsLT5VcGRhdGUoKTsNCisgICAgbV9wRm9ybS0+RG9Nb2RhbCgpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wRm9ybS0+RW5kRG9Nb2RhbCgpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OklzTW9udGhDYWxlbmRhclNob3dlZCgpIHsNCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgcmV0dXJuIERpc0Zvcm1fSXNNb250aENhbGVuZGFyU2hvd2VkKCk7DQorICB9DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEZvcm0sIEZBTFNFKTsNCisgIHJldHVybiAhKG1fcEZvcm0tPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6UmVTZXRFZGl0QWxpZ25tZW50KCkgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BFZGl0KTsNCisgIEZYX0RXT1JEIGR3U3R5bEV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgRlhfRFdPUkQgZHdBZGQgPSAwOw0KKyAgc3dpdGNoIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9FZGl0SEFsaWduTWFzaykgew0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhDZW50ZXI6IHsNCisgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX0hDZW50ZXI7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRIRmFyOiB7DQorICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9IRmFyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9ITmVhcjsgfQ0KKyAgfQ0KKyAgc3dpdGNoIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9FZGl0VkFsaWduTWFzaykgew0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZDZW50ZXI6IHsNCisgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX1ZDZW50ZXI7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWRmFyOiB7DQorICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9WRmFyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9WTmVhcjsgfQ0KKyAgfQ0KKyAgaWYgKGR3U3R5bEV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX0VkaXRKdXN0aWZpZWQpIHsNCisgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9KdXN0aWZpZWQ7DQorICB9DQorICBpZiAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9EVFBfRWRpdERpc3RyaWJ1dGVkKSB7DQorICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfRGlzdHJpYnV0ZWQ7DQorICB9DQorICBtX3BFZGl0LT5Nb2RpZnlTdHlsZXNFeChkd0FkZCwgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25NYXNrIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25Nb2RlTWFzayB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9FRFRfVkFsaWduTWFzayk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6UHJvY2Vzc1NlbENoYW5nZWQoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5KSB7DQorICBtX2lZZWFyID0gaVllYXI7DQorICBtX2lNb250aCA9IGlNb250aDsNCisgIG1faURheSA9IGlEYXk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBGb3JtYXREYXRlU3RyaW5nKG1faVllYXIsIG1faU1vbnRoLCBtX2lEYXksIHdzVGV4dCk7DQorICBtX3BFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQorICBtX3BFZGl0LT5VcGRhdGUoKTsNCisgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KKyAgQ0ZXTF9FdmVudF9EdHBTZWxlY3RDaGFuZ2VkIGV2Ow0KKyAgZXYubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgZXYuaVllYXIgPSBtX2lZZWFyOw0KKyAgZXYuaU1vbnRoID0gbV9pTW9udGg7DQorICBldi5pRGF5ID0gbV9pRGF5Ow0KKyAgRGlzcGF0Y2hFdmVudCgmZXYpOw0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkluaXRQcm94eUZvcm0oKSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKCFtX3BGb3JtKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wTW9udGhDYWwpOw0KKyAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3BGb3JtOw0KKyAgcHJvcEZvcm0ubV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9Qb3B1cDsNCisgIHByb3BGb3JtLm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfSW52aXNpYmxlOw0KKyAgcHJvcEZvcm0ubV9wT3duZXIgPSBtX3BJbnRlcmZhY2U7DQorICBtX3BGb3JtID0gbmV3IElGV0xfRGF0ZVRpbWVGb3JtKCk7DQorICBtX3BGb3JtLT5Jbml0aWFsaXplKHByb3BGb3JtLCBtX3BNb250aENhbCk7DQorICBtX3BNb250aENhbC0+U2V0UGFyZW50KChJRldMX1dpZGdldCopbV9wRm9ybSk7DQorfQ0KK0lGV0xfRGF0ZVRpbWVFZGl0KiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXREYXRhVGltZUVkaXQoKSB7DQorICByZXR1cm4gbV9wRWRpdDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0luaXRpYWxpemUoKSB7DQorICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzID0gRldMX1NUWUxFRVhUX0RUUF9TaG9ydERhdGVGb3JtYXQ7DQorICBEaXNGb3JtX0luaXREYXRlVGltZUNhbGVuZGFyKCk7DQorICBEaXNGb3JtX0luaXREYXRlVGltZUVkaXQoKTsNCisgIFJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wTW9udGhDYWwpOw0KKyAgUmVnaXN0ZXJFdmVudFRhcmdldChtX3BFZGl0KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0luaXREYXRlVGltZUNhbGVuZGFyKCkgew0KKyAgaWYgKG1fcE1vbnRoQ2FsKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wTW9udGg7DQorICBwcm9wTW9udGgubV9kd1N0eWxlcyA9DQorICAgICAgRldMX1dHVFNUWUxFX1BvcHVwIHwgRldMX1dHVFNUWUxFX0JvcmRlciB8IEZXTF9XR1RTVFlMRV9FZGdlU3Vua2VuOw0KKyAgcHJvcE1vbnRoLm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfSW52aXNpYmxlOw0KKyAgcHJvcE1vbnRoLm1fcFBhcmVudCA9IChJRldMX1dpZGdldCopdGhpczsNCisgIHByb3BNb250aC5tX3BEYXRhUHJvdmlkZXIgPSAmbV9Nb250aENhbGVuZGFyRFA7DQorICBwcm9wTW9udGgubV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBtX3BNb250aENhbCA9IG5ldyBJRldMX0RhdGVUaW1lQ2FsZW5kZXIoKTsNCisgIG1fcE1vbnRoQ2FsLT5Jbml0aWFsaXplKHByb3BNb250aCwgbV9wSW50ZXJmYWNlKTsNCisgIENGWF9SZWN0RiBydE1vbnRoQ2FsOw0KKyAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aENhbCwgVFJVRSk7DQorICBydE1vbnRoQ2FsLlNldCgwLCAwLCBydE1vbnRoQ2FsLndpZHRoLCBydE1vbnRoQ2FsLmhlaWdodCk7DQorICBtX3BNb250aENhbC0+U2V0V2lkZ2V0UmVjdChydE1vbnRoQ2FsKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0luaXREYXRlVGltZUVkaXQoKSB7DQorICBpZiAobV9wRWRpdCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcEVkaXQ7DQorICBwcm9wRWRpdC5tX3BQYXJlbnQgPSAoSUZXTF9XaWRnZXQqKXRoaXM7DQorICBwcm9wRWRpdC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIG1fcEVkaXQgPSBuZXcgSUZXTF9EYXRlVGltZUVkaXQoKTsNCisgIG1fcEVkaXQtPkluaXRpYWxpemUocHJvcEVkaXQsIG1fcEludGVyZmFjZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9Jc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcE1vbnRoQ2FsLCBGQUxTRSk7DQorICByZXR1cm4gIShtX3BNb250aENhbC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX1Nob3dNb250aENhbGVuZGFyKEZYX0JPT0wgYkFjdGl2YXRlKSB7DQorICBGWF9CT09MIGJTaG93ZWQgPSBJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKTsNCisgIGlmIChiU2hvd2VkID09IGJBY3RpdmF0ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYkFjdGl2YXRlKSB7DQorICAgIENGWF9SZWN0RiBydE1vbnRoQ2FsOw0KKyAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoQ2FsLCBUUlVFKTsNCisgICAgRlhfRFdPUkQgZHdQb3MgPSAwOw0KKyAgICBGWF9GTE9BVCBmUG9wdXBIZWlnaHQgPSAwLjBmOw0KKyAgICBGWF9GTE9BVCBmUG9wdXBNaW4gPSBydE1vbnRoQ2FsLmhlaWdodDsNCisgICAgRlhfRkxPQVQgZlBvcHVwTWF4ID0gcnRNb250aENhbC5oZWlnaHQ7DQorICAgIENGWF9SZWN0RiBydEFuY2hvcihtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0KTsNCisgICAgcnRBbmNob3Iud2lkdGggPSBydE1vbnRoQ2FsLndpZHRoOw0KKyAgICBydE1vbnRoQ2FsLmxlZnQgPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgIHJ0TW9udGhDYWwudG9wID0gcnRBbmNob3IuSGVpZ2h0KCk7DQorICAgIEdldFBvcHVwUG9zKGZQb3B1cE1pbiwgZlBvcHVwTWF4LCBydEFuY2hvciwgcnRNb250aENhbCk7DQorICAgIG1fcE1vbnRoQ2FsLT5TZXRXaWRnZXRSZWN0KHJ0TW9udGhDYWwpOw0KKyAgICBpZiAobV9pWWVhciA+IDAgJiYgbV9pTW9udGggPiAwICYmIG1faURheSA+IDApIHsNCisgICAgICBtX3BNb250aENhbC0+U2V0U2VsZWN0KG1faVllYXIsIG1faU1vbnRoLCBtX2lEYXkpOw0KKyAgICB9DQorICAgIG1fcE1vbnRoQ2FsLT5VcGRhdGUoKTsNCisgIH0NCisgIG1fcE1vbnRoQ2FsLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgIWJBY3RpdmF0ZSk7DQorICBpZiAoYkFjdGl2YXRlKSB7DQorICAgIENGV0xfTXNnU2V0Rm9jdXMgbXNnOw0KKyAgICBtc2cubV9wRHN0VGFyZ2V0ID0gbV9wTW9udGhDYWw7DQorICAgIG1zZy5tX3BTcmNUYXJnZXQgPSBtX3BFZGl0Ow0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUgPSBtX3BFZGl0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKCZtc2cpOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZSwgcnRDYWw7DQorICBydEludmFsaWRhdGUuU2V0KDAsIDAsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgIG1fcE1vbnRoQ2FsLT5HZXRXaWRnZXRSZWN0KHJ0Q2FsKTsNCisgIHJ0SW52YWxpZGF0ZS5VbmlvbihydENhbCk7DQorICBydEludmFsaWRhdGUuSW5mbGF0ZSgyLCAyKTsNCisgIFJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorfQ0KK0ZYX0RXT1JEIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgcmVjdC5TZXQoMCwgMCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0VkaXQ7DQorICB9DQorICBpZiAoRGlzRm9ybV9Jc05lZWRTaG93QnV0dG9uKCkpIHsNCisgICAgcmVjdC53aWR0aCArPSBtX2ZCdG47DQorICB9DQorICBpZiAocmVjdC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQorICB9DQorICBpZiAoSXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCisgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0lzTmVlZFNob3dCdXR0b24oKSB7DQorICBGWF9CT09MIGJGb2N1cyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCB8fA0KKyAgICAgICAgICAgICAgICAgICBtX3BNb250aENhbC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCB8fA0KKyAgICAgICAgICAgICAgICAgICBtX3BFZGl0LT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgcmV0dXJuIGJGb2N1czsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX1VwZGF0ZSgpIHsNCisgIGlmIChtX2lMb2NrKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBtX3BFZGl0LT5TZXRUaGVtZVByb3ZpZGVyKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgIG1fcEVkaXQtPlNldFdpZGdldFJlY3QobV9ydENsaWVudCk7DQorICBSZVNldEVkaXRBbGlnbm1lbnQoKTsNCisgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KKyAgaWYgKG1fcE1vbnRoQ2FsLT5HZXRUaGVtZVByb3ZpZGVyKCkgPT0gTlVMTCkgew0KKyAgICBtX3BNb250aENhbC0+U2V0VGhlbWVQcm92aWRlcihtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpIHsNCisgICAgSUZXTF9EYXRlVGltZVBpY2tlckRQKiBwRGF0YSA9DQorICAgICAgICAoSUZXTF9EYXRlVGltZVBpY2tlckRQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIHBEYXRhLT5HZXRUb2RheSgoSUZXTF9XaWRnZXQqKXRoaXMsIG1fTW9udGhDYWxlbmRhckRQLm1faUN1clllYXIsDQorICAgICAgICAgICAgICAgICAgICBtX01vbnRoQ2FsZW5kYXJEUC5tX2lDdXJNb250aCwgbV9Nb250aENhbGVuZGFyRFAubV9pQ3VyRGF5KTsNCisgIH0NCisgIEZYX0ZMT0FUKiBwV2lkdGggPQ0KKyAgICAgIChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkdGgsIDApOw0KKyAgbV9mQnRuID0gKnBXaWR0aDsNCisgIENGWF9SZWN0RiBydE1vbnRoQ2FsOw0KKyAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aENhbCwgVFJVRSk7DQorICBDRlhfUmVjdEYgcnRQb3BVcDsNCisgIHJ0UG9wVXAuU2V0KHJ0TW9udGhDYWwubGVmdCwgcnRNb250aENhbC50b3AgKyBGV0xfRFRQX0hFSUdIVCwNCisgICAgICAgICAgICAgIHJ0TW9udGhDYWwud2lkdGgsIHJ0TW9udGhDYWwuaGVpZ2h0KTsNCisgIG1fcE1vbnRoQ2FsLT5TZXRXaWRnZXRSZWN0KHJ0UG9wVXApOw0KKyAgbV9wTW9udGhDYWwtPlVwZGF0ZSgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgaWYgKERpc0Zvcm1fSXNOZWVkU2hvd0J1dHRvbigpKSB7DQorICAgIHJlY3Qud2lkdGggKz0gbV9mQnRuOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fR2V0QkJveChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgaWYgKERpc0Zvcm1fSXNOZWVkU2hvd0J1dHRvbigpKSB7DQorICAgIHJlY3Qud2lkdGggKz0gbV9mQnRuOw0KKyAgfQ0KKyAgaWYgKElzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQorICAgIENGWF9SZWN0RiBydE1vbnRoOw0KKyAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoKTsNCisgICAgcnRNb250aC5PZmZzZXQobV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LnRvcCk7DQorICAgIHJlY3QuVW5pb24ocnRNb250aCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0RWRpdDsNCisgICAgbV9wRWRpdC0+R2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KKyAgICBDRlhfTWF0cml4IG10Ow0KKyAgICBtdC5TZXQoMSwgMCwgMCwgMSwgcnRFZGl0LmxlZnQsIHJ0RWRpdC50b3ApOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgbV9wRWRpdC0+RHJhd1dpZGdldChwR3JhcGhpY3MsICZtdCk7DQorICB9DQorICBpZiAoSXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0TW9udGg7DQorICAgIG1fcE1vbnRoQ2FsLT5HZXRXaWRnZXRSZWN0KHJ0TW9udGgpOw0KKyAgICBDRlhfTWF0cml4IG10Ow0KKyAgICBtdC5TZXQoMSwgMCwgMCwgMSwgcnRNb250aC5sZWZ0LCBydE1vbnRoLnRvcCk7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgbXQuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBtX3BNb250aENhbC0+RHJhd1dpZGdldChwR3JhcGhpY3MsICZtdCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6Q0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlKA0KKyAgICBDRldMX0RhdGVUaW1lUGlja2VySW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKA0KKyAgICBDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBpbnQzMl90IGlSZXQgPSAxOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1vdXNlID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1vdXNlLT5tX2R3Q21kOw0KKyAgICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1vdXNlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgICAgT25MQnV0dG9uVXAocE1vdXNlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCisgICAgICAgICAgT25Nb3VzZU1vdmUocE1vdXNlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICAgIE9uTW91c2VMZWF2ZShwTW91c2UpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHt9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgaVJldCA9IDA7IH0NCisgIH0NCisgIGlmIChkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfS2V5ICYmDQorICAgICAgbV9wT3duZXItPm1fcEVkaXQtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gbV9wT3duZXItPm1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICByZXR1cm4gcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldCgNCisgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXQpIHsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE1zZyk7DQorICBpZiAobV9wT3duZXItPm1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9PbkZvY3VzQ2hhbmdlZChwTXNnLCBiU2V0KTsNCisgIH0NCisgIGlmIChiU2V0KSB7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IChGV0xfV0dUU1RBVEVfRm9jdXNlZCk7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+KEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgIH0NCisgIGlmIChwTXNnLT5tX3BTcmNUYXJnZXQgPT0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wTW9udGhDYWwgJiYNCisgICAgICBtX3BPd25lci0+SXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCisgICAgbV9wT3duZXItPlNob3dNb250aENhbGVuZGFyKEZBTFNFKTsNCisgIH0NCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE1zZyk7DQorICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3J0QnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIGlmIChtX3BPd25lci0+SXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCisgICAgICBtX3BPd25lci0+U2hvd01vbnRoQ2FsZW5kYXIoRkFMU0UpOw0KKyAgICAgIENGV0xfRXZlbnRfRHRwQ2xvc2VVcCBldjsNCisgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmZXYpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmICghKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYNCisgICAgICAgICAgICBGV0xfU1RZTEVFWFRfRFRQX1RpbWVGb3JtYXQpKSB7DQorICAgICAgICBtX3BPd25lci0+U2hvd01vbnRoQ2FsZW5kYXIoVFJVRSk7DQorICAgICAgICBDRldMX0V2ZW50X0R0cERyb3BEb3duIGV2Ow0KKyAgICAgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJmV2KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgIH0NCisgICAgICBtX3BPd25lci0+bV9iTEJ0bkRvd24gPSBUUlVFOw0KKyAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE1zZyk7DQorICBtX3BPd25lci0+bV9iTEJ0bkRvd24gPSBGQUxTRTsNCisgIGlmIChtX3BPd25lci0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0RUUF9Ib3ZlcmVkOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsOw0KKyAgfQ0KKyAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0QnRuKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsOw0KKyAgfQ0KKyAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0QnRuKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6Ok9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBNc2cpOw0KKyAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsOw0KKyAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0QnRuKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6OkRpc0Zvcm1fT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldCkgew0KKyAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZShtX3BPd25lci0+bV9ydEJ0bik7DQorICBpZiAoYlNldCkgew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRm9jdXNlZDsNCisgICAgaWYgKG1fcE93bmVyLT5tX3BFZGl0ICYmDQorICAgICAgICAhKG1fcE93bmVyLT5tX3BFZGl0LT5HZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkpIHsNCisgICAgICBtX3BPd25lci0+bV9ydEJ0bi5TZXQobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX2ZCdG4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCAtIDEpOw0KKyAgICB9DQorICAgIHJ0SW52YWxpZGF0ZSA9IG1fcE93bmVyLT5tX3J0QnRuOw0KKyAgICBwTXNnLT5tX3BEc3RUYXJnZXQgPSBtX3BPd25lci0+bV9wRWRpdDsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gbV9wT3duZXItPm1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1zZyk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIG1fcE93bmVyLT5tX3J0QnRuLlNldCgwLCAwLCAwLCAwKTsNCisgICAgaWYgKG1fcE93bmVyLT5EaXNGb3JtX0lzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQorICAgICAgbV9wT3duZXItPlNob3dNb250aENhbGVuZGFyKEZBTFNFKTsNCisgICAgfQ0KKyAgICBpZiAobV9wT3duZXItPm1fcEVkaXQtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCisgICAgICBwTXNnLT5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wRWRpdDsNCisgICAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUgPSBtX3BPd25lci0+bV9wRWRpdC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNc2cpOw0KKyAgICB9DQorICB9DQorICBydEludmFsaWRhdGUuSW5mbGF0ZSgyLCAyKTsNCisgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZWRpdGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZWRpdGltcC5jcHAKaW5kZXggYjE2MWY4Mi4uZTczY2M1ZiAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2VkaXRpbXAuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9lZGl0aW1wLmNwcApAQCAtMTQsMjIzMSArMTQsMjE5MyBAQAogI2luY2x1ZGUgImluY2x1ZGUvZndsX3Njcm9sbGJhcmltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9lZGl0aW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX2NhcmV0aW1wLmgiDQotSUZXTF9FZGl0KiBJRldMX0VkaXQ6OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gbmV3IElGV0xfRWRpdDsNCitJRldMX0VkaXQqIElGV0xfRWRpdDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBJRldMX0VkaXQ7DQogfQ0KLUlGV0xfRWRpdDo6SUZXTF9FZGl0KCkNCi17DQorSUZXTF9FZGl0OjpJRldMX0VkaXQoKSB7DQorICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9FZGl0Ojp+SUZXTF9FZGl0KCkgew0KKyAgaWYgKG1fcERhdGEpIHsNCisgICAgZGVsZXRlIChDRldMX0VkaXRJbXAqKW1fcERhdGE7DQogICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgfQ0KIH0NCi1JRldMX0VkaXQ6On5JRldMX0VkaXQoKQ0KLXsNCi0gICAgaWYgKG1fcERhdGEpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhOw0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQotICAgIH0NCitGV0xfRVJSIElGV0xfRWRpdDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfRWRpdEltcChwT3V0ZXIpOw0KKyAgKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9FZGl0OjpJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfRWRpdEltcChwT3V0ZXIpOw0KLSAgICAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfRWRpdEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9FZGl0OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9FZGl0SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorRldMX0VSUiBJRldMX0VkaXQ6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0VGV4dCh3c1RleHQpOw0KIH0NCi1GV0xfRVJSCUlGV0xfRWRpdDo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0VGV4dCh3c1RleHQpOw0KK2ludDMyX3QgSUZXTF9FZGl0OjpHZXRUZXh0TGVuZ3RoKCkgY29uc3Qgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+R2V0VGV4dExlbmd0aCgpOw0KIH0NCi1pbnQzMl90IElGV0xfRWRpdDo6R2V0VGV4dExlbmd0aCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5HZXRUZXh0TGVuZ3RoKCk7DQorRldMX0VSUiBJRldMX0VkaXQ6OkdldFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCkgY29uc3Qgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+R2V0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCiB9DQotRldMX0VSUglJRldMX0VkaXQ6OkdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSBjb25zdA0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+R2V0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCitGV0xfRVJSIElGV0xfRWRpdDo6Q2xlYXJUZXh0KCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+Q2xlYXJUZXh0KCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9FZGl0OjpDbGVhclRleHQoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+Q2xlYXJUZXh0KCk7DQoraW50MzJfdCBJRldMX0VkaXQ6OkdldENhcmV0UG9zKCkgY29uc3Qgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+R2V0Q2FyZXRQb3MoKTsNCiB9DQotaW50MzJfdCBJRldMX0VkaXQ6OkdldENhcmV0UG9zKCkgY29uc3QNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkdldENhcmV0UG9zKCk7DQoraW50MzJfdCBJRldMX0VkaXQ6OlNldENhcmV0UG9zKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJCZWZvcmUpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlNldENhcmV0UG9zKG5JbmRleCwgYkJlZm9yZSk7DQogfQ0KLWludDMyX3QgSUZXTF9FZGl0OjpTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0Q2FyZXRQb3MobkluZGV4LCBiQmVmb3JlKTsNCitGV0xfRVJSIElGV0xfRWRpdDo6QWRkU2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSB7DQorICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5BZGRTZWxSYW5nZShuU3RhcnQsIG5Db3VudCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9FZGl0OjpBZGRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5BZGRTZWxSYW5nZShuU3RhcnQsIG5Db3VudCk7DQoraW50MzJfdCBJRldMX0VkaXQ6OkNvdW50U2VsUmFuZ2VzKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+Q291bnRTZWxSYW5nZXMoKTsNCiB9DQotaW50MzJfdCBJRldMX0VkaXQ6OkNvdW50U2VsUmFuZ2VzKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkNvdW50U2VsUmFuZ2VzKCk7DQoraW50MzJfdCBJRldMX0VkaXQ6OkdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90JiBuU3RhcnQpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkdldFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCiB9DQotaW50MzJfdCBJRldMX0VkaXQ6OkdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5HZXRTZWxSYW5nZShuSW5kZXgsIG5TdGFydCk7DQorRldMX0VSUiBJRldMX0VkaXQ6OkNsZWFyU2VsZWN0aW9ucygpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkNsZWFyU2VsZWN0aW9ucygpOw0KIH0NCi1GV0xfRVJSCUlGV0xfRWRpdDo6Q2xlYXJTZWxlY3Rpb25zKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkNsZWFyU2VsZWN0aW9ucygpOw0KK2ludDMyX3QgSUZXTF9FZGl0OjpHZXRMaW1pdCgpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkdldExpbWl0KCk7DQogfQ0KLWludDMyX3QgSUZXTF9FZGl0OjpHZXRMaW1pdCgpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5HZXRMaW1pdCgpOw0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpTZXRMaW1pdChpbnQzMl90IG5MaW1pdCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0TGltaXQobkxpbWl0KTsNCiB9DQotRldMX0VSUglJRldMX0VkaXQ6OlNldExpbWl0KGludDMyX3QgbkxpbWl0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0TGltaXQobkxpbWl0KTsNCitGV0xfRVJSIElGV0xfRWRpdDo6U2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdBbGlhcykgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0QWxpYXNDaGFyKHdBbGlhcyk7DQogfQ0KLUZXTF9FUlIJSUZXTF9FZGl0OjpTZXRBbGlhc0NoYXIoRlhfV0NIQVIgd0FsaWFzKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0QWxpYXNDaGFyKHdBbGlhcyk7DQorRldMX0VSUiBJRldMX0VkaXQ6OlNldEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlNldEZvcm1hdFN0cmluZyh3c0Zvcm1hdCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9FZGl0OjpTZXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzRm9ybWF0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0Rm9ybWF0U3RyaW5nKHdzRm9ybWF0KTsNCitGV0xfRVJSIElGV0xfRWRpdDo6SW5zZXJ0KGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbikgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+SW5zZXJ0KG5TdGFydCwgbHBUZXh0LCBuTGVuKTsNCiB9DQotRldMX0VSUiBJRldMX0VkaXQ6Okluc2VydChpbnQzMl90IG5TdGFydCwgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwgaW50MzJfdCBuTGVuKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+SW5zZXJ0KG5TdGFydCwgbHBUZXh0LCBuTGVuKTsNCitGV0xfRVJSIElGV0xfRWRpdDo6RGVsZXRlU2VsZWN0aW9ucygpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkRlbGV0ZVNlbGVjdGlvbnMoKTsNCiB9DQotRldMX0VSUiBJRldMX0VkaXQ6OkRlbGV0ZVNlbGVjdGlvbnMoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+RGVsZXRlU2VsZWN0aW9ucygpOw0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpEZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkRlbGV0ZVJhbmdlKG5TdGFydCwgbkNvdW50KTsNCiB9DQotRldMX0VSUiBJRldMX0VkaXQ6OkRlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkRlbGV0ZVJhbmdlKG5TdGFydCwgbkNvdW50KTsNCitGV0xfRVJSIElGV0xfRWRpdDo6UmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlcGxhY2UpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlJlcGxhY2VTZWxlY3Rpb25zKHdzUmVwbGFjZSk7DQogfQ0KLUZXTF9FUlIgSUZXTF9FZGl0OjpSZXBsYWNlU2VsZWN0aW9ucyhjb25zdCBDRlhfV2lkZVN0cmluZ0MgJndzUmVwbGFjZSkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlJlcGxhY2VTZWxlY3Rpb25zKHdzUmVwbGFjZSk7DQorRldMX0VSUiBJRldMX0VkaXQ6OlJlcGxhY2UoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NSZXBsYWNlKSB7DQorICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5SZXBsYWNlKG5TdGFydCwgbkxlbiwgd3NSZXBsYWNlKTsNCiB9DQotRldMX0VSUiBJRldMX0VkaXQ6OlJlcGxhY2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkxlbiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlcGxhY2UpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5SZXBsYWNlKG5TdGFydCwgbkxlbiwgd3NSZXBsYWNlKTsNCitGV0xfRVJSIElGV0xfRWRpdDo6RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKSB7DQorICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5Eb0NsaXBib2FyZChpQ21kKTsNCiB9DQotRldMX0VSUglJRldMX0VkaXQ6OkRvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkRvQ2xpcGJvYXJkKGlDbWQpOw0KK0ZYX0JPT0wgSUZXTF9FZGl0OjpDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkNvcHkod3NDb3B5KTsNCiB9DQotRlhfQk9PTAlJRldMX0VkaXQ6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkNvcHkod3NDb3B5KTsNCitGWF9CT09MIElGV0xfRWRpdDo6Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+Q3V0KHdzQ3V0KTsNCiB9DQotRlhfQk9PTAlJRldMX0VkaXQ6OkN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5DdXQod3NDdXQpOw0KK0ZYX0JPT0wgSUZXTF9FZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+UGFzdGUod3NQYXN0ZSk7DQogfQ0KLUZYX0JPT0wJSUZXTF9FZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlBhc3RlKHdzUGFzdGUpOw0KK0ZYX0JPT0wgSUZXTF9FZGl0OjpEZWxldGUoKSB7DQorICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5EZWxldGUoKTsNCiB9DQotRlhfQk9PTAlJRldMX0VkaXQ6OkRlbGV0ZSgpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5EZWxldGUoKTsNCitGWF9CT09MIElGV0xfRWRpdDo6UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKSB7DQorICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5SZWRvKGJzUmVjb3JkKTsNCiB9DQotRlhfQk9PTAlJRldMX0VkaXQ6OlJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlJlZG8oYnNSZWNvcmQpOw0KK0ZYX0JPT0wgSUZXTF9FZGl0OjpVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlVuZG8oYnNSZWNvcmQpOw0KIH0NCi1GWF9CT09MCUlGV0xfRWRpdDo6VW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+VW5kbyhic1JlY29yZCk7DQorRlhfQk9PTCBJRldMX0VkaXQ6OlVuZG8oKSB7DQorICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5VbmRvKCk7DQogfQ0KLUZYX0JPT0wJSUZXTF9FZGl0OjpVbmRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlVuZG8oKTsNCitGWF9CT09MIElGV0xfRWRpdDo6UmVkbygpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlJlZG8oKTsNCiB9DQotRlhfQk9PTAlJRldMX0VkaXQ6OlJlZG8oKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+UmVkbygpOw0KK0ZYX0JPT0wgSUZXTF9FZGl0OjpDYW5VbmRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+Q2FuVW5kbygpOw0KIH0NCi1GWF9CT09MCUlGV0xfRWRpdDo6Q2FuVW5kbygpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5DYW5VbmRvKCk7DQorRlhfQk9PTCBJRldMX0VkaXQ6OkNhblJlZG8oKSB7DQorICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5DYW5SZWRvKCk7DQogfQ0KLUZYX0JPT0wJSUZXTF9FZGl0OjpDYW5SZWRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkNhblJlZG8oKTsNCitGV0xfRVJSIElGV0xfRWRpdDo6U2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoLCBGWF9CT09MIGJFcXVpZGlzdGFudCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0VGFiV2lkdGgoZlRhYldpZHRoLCBiRXF1aWRpc3RhbnQpOw0KIH0NCi1GV0xfRVJSIElGV0xfRWRpdDo6U2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoLCBGWF9CT09MIGJFcXVpZGlzdGFudCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlNldFRhYldpZHRoKGZUYWJXaWR0aCwgYkVxdWlkaXN0YW50KTsNCitGV0xfRVJSIElGV0xfRWRpdDo6U2V0T3V0ZXIoSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0T3V0ZXIocE91dGVyKTsNCiB9DQotRldMX0VSUglJRldMX0VkaXQ6OlNldE91dGVyKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5TZXRPdXRlcihwT3V0ZXIpOw0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpTZXROdW1iZXJSYW5nZShpbnQzMl90IGlNaW4sIGludDMyX3QgaU1heCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0TnVtYmVyUmFuZ2UoaU1pbiwgaU1heCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9FZGl0OjpTZXROdW1iZXJSYW5nZShpbnQzMl90IGlNaW4sIGludDMyX3QgaU1heCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlNldE51bWJlclJhbmdlKGlNaW4sIGlNYXgpOw0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpTZXRCYWNrQ29sb3IoRlhfRFdPUkQgZHdDb2xvcikgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0QmFja2dyb3VuZENvbG9yKGR3Q29sb3IpOw0KIH0NCi1GV0xfRVJSCUlGV0xfRWRpdDo6U2V0QmFja0NvbG9yKEZYX0RXT1JEIGR3Q29sb3IpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5TZXRCYWNrZ3JvdW5kQ29sb3IoZHdDb2xvcik7DQorRldMX0VSUiBJRldMX0VkaXQ6OlNldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9udCwgRlhfRkxPQVQgZlNpemUpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlNldEZvbnQod3NGb250LCBmU2l6ZSk7DQogfQ0KLUZXTF9FUlIgSUZXTF9FZGl0OjpTZXRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZvbnQsIEZYX0ZMT0FUIGZTaXplKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0Rm9udCh3c0ZvbnQsIGZTaXplKTsNCit2b2lkIElGV0xfRWRpdDo6U2V0U2Nyb2xsT2Zmc2V0KEZYX0ZMT0FUIGZTY3JvbGxPZmZzZXQpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPlNldFNjcm9sbE9mZnNldChmU2Nyb2xsT2Zmc2V0KTsNCiB9DQotdm9pZCBJRldMX0VkaXQ6OlNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+U2V0U2Nyb2xsT2Zmc2V0KGZTY3JvbGxPZmZzZXQpOw0KK0ZYX0JPT0wgSUZXTF9FZGl0OjpHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+R2V0U3VnZ2VzdFdvcmRzKHBvaW50Ziwgc1N1Z2dlc3QpOw0KIH0NCi1GWF9CT09MIElGV0xfRWRpdDo6R2V0U3VnZ2VzdFdvcmRzKENGWF9Qb2ludEYgcG9pbnRmLCBDRlhfQnl0ZVN0cmluZ0FycmF5ICZzU3VnZ2VzdCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdEltcCopbV9wRGF0YSktPkdldFN1Z2dlc3RXb3Jkcyhwb2ludGYsIHNTdWdnZXN0KTsNCi19DQotRlhfQk9PTCBJRldMX0VkaXQ6OlJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlcGxhY2UpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXRJbXAqKW1fcERhdGEpLT5SZXBsYWNlU3BlbGxDaGVja1dvcmQocG9pbnRmLCBic1JlcGxhY2UpOw0KK0ZYX0JPT0wgSUZXTF9FZGl0OjpSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0SW1wKiltX3BEYXRhKS0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKHBvaW50ZiwgYnNSZXBsYWNlKTsNCiB9DQogI2RlZmluZSBGV0xfRURJVF9NYXJnaW4gMw0KLUNGV0xfRWRpdEltcDo6Q0ZXTF9FZGl0SW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLSAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlcikNCi0gICAgLCBtX2ZWQWxpZ25PZmZzZXQoMC4wZikNCi0gICAgLCBtX2ZTY3JvbGxPZmZzZXRYKDAuMGYpDQotICAgICwgbV9mU2Nyb2xsT2Zmc2V0WSgwLjBmKQ0KLSAgICAsIG1fcEVkdEVuZ2luZShOVUxMKQ0KLSAgICAsIG1fYkxCdXR0b25Eb3duKEZBTFNFKQ0KLSAgICAsIG1fblNlbFN0YXJ0KDApDQotICAgICwgbV9uTGltaXQoLTEpDQotICAgICwgbV9mRm9udFNpemUoMCkNCi0gICAgLCBtX3BWZXJ0U2Nyb2xsQmFyKE5VTEwpDQotICAgICwgbV9wSG9yelNjcm9sbEJhcihOVUxMKQ0KLSAgICAsIG1fcENhcmV0KE5VTEwpDQotICAgICwgbV9pTWluKC0xKQ0KLSAgICAsIG1faU1heCgweEZGRkZGRkYpDQotICAgICwgbV9iU2V0UmFuZ2UoRkFMU0UpDQotICAgICwgbV9wVGV4dEZpZWxkKE5VTEwpDQotICAgICwgbV9iYWNrQ29sb3IoMCkNCi0gICAgLCBtX3VwZGF0ZUJhY2tDb2xvcihGQUxTRSkNCi0gICAgLCBtX2lDdXJSZWNvcmQoLTEpDQotICAgICwgbV9pTWF4UmVjb3JkKDEyOCkNCi0gICAgLCBtX2ZTcGFjZUFib3ZlKDApDQotICAgICwgbV9mU3BhY2VCZWxvdygwKQ0KLXsNCi0gICAgbV9ydENsaWVudC5SZXNldCgpOw0KLSAgICBtX3J0RW5naW5lLlJlc2V0KCk7DQotICAgIG1fcnRTdGF0aWMuUmVzZXQoKTsNCitDRldMX0VkaXRJbXA6OkNGV0xfRWRpdEltcChJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlciksDQorICAgICAgbV9mVkFsaWduT2Zmc2V0KDAuMGYpLA0KKyAgICAgIG1fZlNjcm9sbE9mZnNldFgoMC4wZiksDQorICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSgwLjBmKSwNCisgICAgICBtX3BFZHRFbmdpbmUoTlVMTCksDQorICAgICAgbV9iTEJ1dHRvbkRvd24oRkFMU0UpLA0KKyAgICAgIG1fblNlbFN0YXJ0KDApLA0KKyAgICAgIG1fbkxpbWl0KC0xKSwNCisgICAgICBtX2ZGb250U2l6ZSgwKSwNCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyKE5VTEwpLA0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXIoTlVMTCksDQorICAgICAgbV9wQ2FyZXQoTlVMTCksDQorICAgICAgbV9pTWluKC0xKSwNCisgICAgICBtX2lNYXgoMHhGRkZGRkZGKSwNCisgICAgICBtX2JTZXRSYW5nZShGQUxTRSksDQorICAgICAgbV9wVGV4dEZpZWxkKE5VTEwpLA0KKyAgICAgIG1fYmFja0NvbG9yKDApLA0KKyAgICAgIG1fdXBkYXRlQmFja0NvbG9yKEZBTFNFKSwNCisgICAgICBtX2lDdXJSZWNvcmQoLTEpLA0KKyAgICAgIG1faU1heFJlY29yZCgxMjgpLA0KKyAgICAgIG1fZlNwYWNlQWJvdmUoMCksDQorICAgICAgbV9mU3BhY2VCZWxvdygwKSB7DQorICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICBtX3J0RW5naW5lLlJlc2V0KCk7DQorICBtX3J0U3RhdGljLlJlc2V0KCk7DQogfQ0KLUNGV0xfRWRpdEltcDo6Q0ZXTF9FZGl0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQotICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KLSAgICAsIG1fZlZBbGlnbk9mZnNldCgwLjBmKQ0KLSAgICAsIG1fZlNjcm9sbE9mZnNldFgoMC4wZikNCi0gICAgLCBtX2ZTY3JvbGxPZmZzZXRZKDAuMGYpDQotICAgICwgbV9wRWR0RW5naW5lKE5VTEwpDQotICAgICwgbV9iTEJ1dHRvbkRvd24oRkFMU0UpDQotICAgICwgbV9uU2VsU3RhcnQoMCkNCi0gICAgLCBtX25MaW1pdCgtMSkNCi0gICAgLCBtX2ZGb250U2l6ZSgwKQ0KLSAgICAsIG1fcFZlcnRTY3JvbGxCYXIoTlVMTCkNCi0gICAgLCBtX3BIb3J6U2Nyb2xsQmFyKE5VTEwpDQotICAgICwgbV9wQ2FyZXQoTlVMTCkNCi0gICAgLCBtX2lNaW4oLTEpDQotICAgICwgbV9pTWF4KDB4RkZGRkZGRikNCi0gICAgLCBtX2JTZXRSYW5nZShGQUxTRSkNCi0gICAgLCBtX3BUZXh0RmllbGQoTlVMTCkNCi0gICAgLCBtX2JhY2tDb2xvcigwKQ0KLSAgICAsIG1fdXBkYXRlQmFja0NvbG9yKEZBTFNFKQ0KLSAgICAsIG1faUN1clJlY29yZCgtMSkNCi0gICAgLCBtX2lNYXhSZWNvcmQoMTI4KQ0KLSAgICAsIG1fZlNwYWNlQWJvdmUoMCkNCi0gICAgLCBtX2ZTcGFjZUJlbG93KDApDQotew0KLSAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQotICAgIG1fcnRFbmdpbmUuUmVzZXQoKTsNCi0gICAgbV9ydFN0YXRpYy5SZXNldCgpOw0KK0NGV0xfRWRpdEltcDo6Q0ZXTF9FZGl0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlciksDQorICAgICAgbV9mVkFsaWduT2Zmc2V0KDAuMGYpLA0KKyAgICAgIG1fZlNjcm9sbE9mZnNldFgoMC4wZiksDQorICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSgwLjBmKSwNCisgICAgICBtX3BFZHRFbmdpbmUoTlVMTCksDQorICAgICAgbV9iTEJ1dHRvbkRvd24oRkFMU0UpLA0KKyAgICAgIG1fblNlbFN0YXJ0KDApLA0KKyAgICAgIG1fbkxpbWl0KC0xKSwNCisgICAgICBtX2ZGb250U2l6ZSgwKSwNCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyKE5VTEwpLA0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXIoTlVMTCksDQorICAgICAgbV9wQ2FyZXQoTlVMTCksDQorICAgICAgbV9pTWluKC0xKSwNCisgICAgICBtX2lNYXgoMHhGRkZGRkZGKSwNCisgICAgICBtX2JTZXRSYW5nZShGQUxTRSksDQorICAgICAgbV9wVGV4dEZpZWxkKE5VTEwpLA0KKyAgICAgIG1fYmFja0NvbG9yKDApLA0KKyAgICAgIG1fdXBkYXRlQmFja0NvbG9yKEZBTFNFKSwNCisgICAgICBtX2lDdXJSZWNvcmQoLTEpLA0KKyAgICAgIG1faU1heFJlY29yZCgxMjgpLA0KKyAgICAgIG1fZlNwYWNlQWJvdmUoMCksDQorICAgICAgbV9mU3BhY2VCZWxvdygwKSB7DQorICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICBtX3J0RW5naW5lLlJlc2V0KCk7DQorICBtX3J0U3RhdGljLlJlc2V0KCk7DQogfQ0KLUNGV0xfRWRpdEltcDo6fkNGV0xfRWRpdEltcCgpDQotew0KK0NGV0xfRWRpdEltcDo6fkNGV0xfRWRpdEltcCgpIHsNCisgIGlmIChtX3BFZHRFbmdpbmUpIHsNCisgICAgbV9wRWR0RW5naW5lLT5SZWxlYXNlKCk7DQorICAgIG1fcEVkdEVuZ2luZSA9IE5VTEw7DQorICB9DQorICBpZiAobV9wSG9yelNjcm9sbEJhcikgew0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5SZWxlYXNlKCk7DQorICAgIG1fcEhvcnpTY3JvbGxCYXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+UmVsZWFzZSgpOw0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BDYXJldCkgew0KKyAgICBtX3BDYXJldC0+UmVsZWFzZSgpOw0KKyAgICBtX3BDYXJldCA9IE5VTEw7DQorICB9DQorICBDbGVhclJlY29yZCgpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICB3c0NsYXNzID0gRldMX0NMQVNTX0VkaXQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfRWRpdEltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0VkaXQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpJbml0aWFsaXplKCkgew0KKyAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpZiAoIW1fcERlbGVnYXRlKSB7DQorICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKUZYX05FVyBDRldMX0VkaXRJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIH0NCisgIEluaXRDYXJldCgpOw0KKyAgaWYgKCFtX3BFZHRFbmdpbmUpIHsNCisgICAgSW5pdEVuZ2luZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6RmluYWxpemUoKSB7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQorICAgIFNob3dDYXJldChGQUxTRSk7DQorICB9DQorICBpZiAobV9wSG9yelNjcm9sbEJhcikgew0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5GaW5hbGl6ZSgpOw0KKyAgfQ0KKyAgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+RmluYWxpemUoKTsNCisgIH0NCisgIGlmIChtX3BEZWxlZ2F0ZSkgew0KKyAgICBkZWxldGUgKENGV0xfRWRpdEltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBpZiAoYkF1dG9TaXplKSB7DQorICAgIHJlY3QuU2V0KDAsIDAsIDAsIDApOw0KICAgICBpZiAobV9wRWR0RW5naW5lKSB7DQotICAgICAgICBtX3BFZHRFbmdpbmUtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcEVkdEVuZ2luZSA9IE5VTEw7DQorICAgICAgaW50MzJfdCBpVGV4dExlbiA9IG1fcEVkdEVuZ2luZS0+R2V0VGV4dExlbmd0aCgpOw0KKyAgICAgIGlmIChpVGV4dExlbiA+IDApIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgIG1fcEVkdEVuZ2luZS0+R2V0VGV4dCh3c1RleHQsIDApOw0KKyAgICAgICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKA0KKyAgICAgICAgICAgIHdzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUpOw0KKyAgICAgICAgcmVjdC5TZXQoMCwgMCwgc3oueCwgc3oueSk7DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQotICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhciA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKG1fcENhcmV0KSB7DQotICAgICAgICBtX3BDYXJldC0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wQ2FyZXQgPSBOVUxMOw0KLSAgICB9DQotICAgIENsZWFyUmVjb3JkKCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0DQotew0KLSAgICB3c0NsYXNzID0gRldMX0NMQVNTX0VkaXQ7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfRFdPUkQgQ0ZXTF9FZGl0SW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCi17DQotICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0VkaXQ7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9FZGl0SW1wOjpJbml0aWFsaXplKCkNCi17DQotICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGlmICghbV9wRGVsZWdhdGUpIHsNCi0gICAgICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKUZYX05FVyBDRldMX0VkaXRJbXBEZWxlZ2F0ZSh0aGlzKTsNCi0gICAgfQ0KLSAgICBJbml0Q2FyZXQoKTsNCi0gICAgaWYgKCFtX3BFZHRFbmdpbmUpIHsNCi0gICAgICAgIEluaXRFbmdpbmUoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpGaW5hbGl6ZSgpDQotew0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQotICAgICAgICBTaG93Q2FyZXQoRkFMU0UpOw0KLSAgICB9DQotICAgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQotICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5GaW5hbGl6ZSgpOw0KLSAgICB9DQotICAgIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQotICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5GaW5hbGl6ZSgpOw0KLSAgICB9DQotICAgIGlmICggbV9wRGVsZWdhdGUpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9FZGl0SW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KLSAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCi19DQotRldMX0VSUiBDRldMX0VkaXRJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQotew0KLSAgICBpZiAoYkF1dG9TaXplKSB7DQotICAgICAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCi0gICAgICAgIGlmIChtX3BFZHRFbmdpbmUpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlUZXh0TGVuID0gbV9wRWR0RW5naW5lLT5HZXRUZXh0TGVuZ3RoKCk7DQotICAgICAgICAgICAgaWYgKGlUZXh0TGVuID4gMCkgew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgICAgICAgICAgICAgIG1fcEVkdEVuZ2luZS0+R2V0VGV4dCh3c1RleHQsIDApOw0KLSAgICAgICAgICAgICAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUod3NUZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSk7DQotICAgICAgICAgICAgICAgIHJlY3QuU2V0KDAsIDAsIHN6LngsIHN6LnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQotICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXIpIHsNCi0gICAgICAgICAgICBpZiAoSXNTaG93U2Nyb2xsQmFyKFRSVUUpKSB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUICpwZldpZHRoID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCk7DQotICAgICAgICAgICAgICAgIHJlY3Qud2lkdGggKz0gKnBmV2lkdGg7DQotICAgICAgICAgICAgICAgIHJlY3Qud2lkdGggKz0gRldMX0VESVRfTWFyZ2luOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoSXNTaG93U2Nyb2xsQmFyKEZBTFNFKSkgew0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCAqcGZXaWR0aCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KLSAgICAgICAgICAgICAgICByZWN0LmhlaWdodCArPSAqcGZXaWR0aDsNCi0gICAgICAgICAgICAgICAgcmVjdC5oZWlnaHQgKz0gRldMX0VESVRfTWFyZ2luOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCApDQotew0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSB8fCAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCi0gICAgICAgIFNob3dDYXJldChGQUxTRSk7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpTZXRTdGF0ZXMoZHdTdGF0ZXMsIGJTZXQpOw0KLX0NCi1GV0xfRVJSCUNGV0xfRWRpdEltcDo6U2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICByZXR1cm4JQ0ZXTF9XaWRnZXRJbXA6OlNldFdpZGdldFJlY3QocmVjdCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpVcGRhdGUoKQ0KLXsNCi0gICAgaWYgKElzTG9ja2VkKCkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQotICAgIH0NCi0gICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQotICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCi0gICAgfQ0KLSAgICBMYXlvdXQoKTsNCi0gICAgaWYgKG1fcnRDbGllbnQuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLSAgICB9DQotICAgIFVwZGF0ZUVkaXRFbmdpbmUoKTsNCi0gICAgVXBkYXRlVkFsaWdubWVudCgpOw0KLSAgICBVcGRhdGVTY3JvbGwoKTsNCi0gICAgSW5pdENhcmV0KCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfRFdPUkQgQ0ZXTF9FZGl0SW1wOjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQorICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQogICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KLSAgICAgICAgaWYgKElzU2hvd1Njcm9sbEJhcihUUlVFKSkgew0KLSAgICAgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KLSAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocmVjdCk7DQotICAgICAgICAgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVlNjcm9sbEJhcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoSXNTaG93U2Nyb2xsQmFyKEZBTFNFKSkgew0KLSAgICAgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KLSAgICAgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocmVjdCk7DQotICAgICAgICAgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfSFNjcm9sbEJhcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICAgICAgaWYgKElzU2hvd1Njcm9sbEJhcihUUlVFKSkgew0KKyAgICAgICAgRlhfRkxPQVQqIHBmV2lkdGggPQ0KKyAgICAgICAgICAgIChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KKyAgICAgICAgcmVjdC53aWR0aCArPSAqcGZXaWR0aDsNCisgICAgICAgIHJlY3Qud2lkdGggKz0gRldMX0VESVRfTWFyZ2luOw0KKyAgICAgIH0NCisgICAgICBpZiAoSXNTaG93U2Nyb2xsQmFyKEZBTFNFKSkgew0KKyAgICAgICAgRlhfRkxPQVQqIHBmV2lkdGggPQ0KKyAgICAgICAgICAgIChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KKyAgICAgICAgcmVjdC5oZWlnaHQgKz0gKnBmV2lkdGg7DQorICAgICAgICByZWN0LmhlaWdodCArPSBGV0xfRURJVF9NYXJnaW47DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmIChtX3J0Q2xpZW50LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9FZGl0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQpIHsNCisgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpIHx8DQorICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpKSB7DQorICAgIFNob3dDYXJldChGQUxTRSk7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRXaWRnZXRSZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpTZXRXaWRnZXRSZWN0KHJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6VXBkYXRlKCkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIH0NCisgIExheW91dCgpOw0KKyAgaWYgKG1fcnRDbGllbnQuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBVcGRhdGVFZGl0RW5naW5lKCk7DQorICBVcGRhdGVWQWxpZ25tZW50KCk7DQorICBVcGRhdGVTY3JvbGwoKTsNCisgIEluaXRDYXJldCgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0VkaXRJbXA6OkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXIpIHsNCisgICAgaWYgKElzU2hvd1Njcm9sbEJhcihUUlVFKSkgew0KKyAgICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1ZTY3JvbGxCYXI7DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KLX0NCi0jZGVmaW5lIEZYX0VESVRfSVNMQVRJTldPUkQodSkJKHUgPT0gMHgyRCB8fCAodSA8PSAweDAwNUEgJiYgdSA+PSAweDAwNDEpIHx8ICh1IDw9IDB4MDA3QSAmJiB1ID49IDB4MDA2MSkgfHwgKHUgPD0gMHgwMkFGICYmIHUgPj0gMHgwMEMwKSB8fCB1ID09IDB4MDAyNykNCi1zdGF0aWMgdm9pZCBBZGRTcXVpZ2dseVBhdGgoQ0ZYX1BhdGgmIFBhdGhEYXRhLCBGWF9GTE9BVCBmU3RhcnRYLCBGWF9GTE9BVCBmRW5kWCwgRlhfRkxPQVQgZlksIEZYX0ZMT0FUIGZTdGVwKQ0KLXsNCi0gICAgUGF0aERhdGEuTW92ZVRvKGZTdGFydFgsIGZZKTsNCi0gICAgRlhfRkxPQVQgZng7DQotICAgIGludDMyX3QgaTsNCi0gICAgZm9yIChpID0gMSwgZnggPSBmU3RhcnRYICsgZlN0ZXA7IGZ4IDwgZkVuZFg7IGZ4ICs9IGZTdGVwLCBpKyspIHsNCi0gICAgICAgIFBhdGhEYXRhLkxpbmVUbyhmeCwgZlkgKyAoaSAmIDEpKmZTdGVwKTsNCisgICAgaWYgKElzU2hvd1Njcm9sbEJhcihGQUxTRSkpIHsNCisgICAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICAgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9IU2Nyb2xsQmFyOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fcnRDbGllbnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfRWRpdDsNCisgIH0NCisgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KIH0NCi12b2lkIENGV0xfRWRpdEltcDo6QWRkU3BlbGxDaGVja09iaihDRlhfUGF0aCYgUGF0aERhdGEsIGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCwgRlhfRkxPQVQgZk9mZlNldFgsIEZYX0ZMT0FUIGZPZmZTZXRZKQ0KLXsNCi0gICAgRlhfRkxPQVQgZlN0YXJ0WCA9IDAuMGY7DQotICAgIEZYX0ZMT0FUIGZFbmRYID0gMC4wZjsNCi0gICAgRlhfRkxPQVQgZlkgPSAwLjBmOw0KLSAgICBGWF9GTE9BVCBmU3RlcCA9IDAuMGY7DQotICAgIElGREVfVHh0RWR0UGFnZSAqcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQotICAgIENGWF9SZWN0RkFycmF5IHJlY3RBcnJheTsNCi0gICAgQ0ZYX1JlY3RGIHJlY3RUZXh0Ow0KLSAgICBjb25zdCBGREVfVFhURURUUEFSQU1TKiB0eHRFZHRQYXJhbXMgPSBtX3BFZHRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsNCi0gICAgRlhfRkxPQVQgZkFzZW50ID0gKEZYX0ZMT0FUKXR4dEVkdFBhcmFtcy0+cEZvbnQtPkdldEFzY2VudCgpICogdHh0RWR0UGFyYW1zLT5mRm9udFNpemUgLyAxMDAwOw0KLSAgICBwUGFnZS0+Q2FsY1JhbmdlUmVjdEFycmF5KG5TdGFydCwgbkNvdW50LCByZWN0QXJyYXkpOw0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY3RBcnJheS5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgcmVjdFRleHQgPSByZWN0QXJyYXkuR2V0QXQoaSk7DQotICAgICAgICBmWSA9IHJlY3RUZXh0LnRvcCArIGZBc2VudCArIGZPZmZTZXRZOw0KLSAgICAgICAgZlN0ZXAgPSB0eHRFZHRQYXJhbXMtPmZGb250U2l6ZSAvIDE2LjBmOw0KLSAgICAgICAgZlN0YXJ0WCA9IHJlY3RUZXh0LmxlZnQgKyBmT2ZmU2V0WDsNCi0gICAgICAgIGZFbmRYID0gZlN0YXJ0WCArIHJlY3RUZXh0LldpZHRoKCk7DQotICAgICAgICBBZGRTcXVpZ2dseVBhdGgoUGF0aERhdGEsIGZTdGFydFgsIGZFbmRYLCBmWSwgZlN0ZXApOw0KLSAgICB9DQorI2RlZmluZSBGWF9FRElUX0lTTEFUSU5XT1JEKHUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICh1ID09IDB4MkQgfHwgKHUgPD0gMHgwMDVBICYmIHUgPj0gMHgwMDQxKSB8fCAgICAgICAgICAgICAgICAgICAgXA0KKyAgICh1IDw9IDB4MDA3QSAmJiB1ID49IDB4MDA2MSkgfHwgKHUgPD0gMHgwMkFGICYmIHUgPj0gMHgwMEMwKSB8fCBcDQorICAgdSA9PSAweDAwMjcpDQorc3RhdGljIHZvaWQgQWRkU3F1aWdnbHlQYXRoKENGWF9QYXRoJiBQYXRoRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlN0YXJ0WCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkVuZFgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU3RlcCkgew0KKyAgUGF0aERhdGEuTW92ZVRvKGZTdGFydFgsIGZZKTsNCisgIEZYX0ZMT0FUIGZ4Ow0KKyAgaW50MzJfdCBpOw0KKyAgZm9yIChpID0gMSwgZnggPSBmU3RhcnRYICsgZlN0ZXA7IGZ4IDwgZkVuZFg7IGZ4ICs9IGZTdGVwLCBpKyspIHsNCisgICAgUGF0aERhdGEuTGluZVRvKGZ4LCBmWSArIChpICYgMSkgKiBmU3RlcCk7DQorICB9DQogfQ0KLWludDMyX3QgQ0ZXTF9FZGl0SW1wOjpHZXRXb3JkQXRQb2ludChDRlhfUG9pbnRGIHBvaW50ZiwgaW50MzJfdCYgbkNvdW50KQ0KLXsNCi0gICAgcmV0dXJuIDA7DQordm9pZCBDRldMX0VkaXRJbXA6OkFkZFNwZWxsQ2hlY2tPYmooQ0ZYX1BhdGgmIFBhdGhEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZPZmZTZXRYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZPZmZTZXRZKSB7DQorICBGWF9GTE9BVCBmU3RhcnRYID0gMC4wZjsNCisgIEZYX0ZMT0FUIGZFbmRYID0gMC4wZjsNCisgIEZYX0ZMT0FUIGZZID0gMC4wZjsNCisgIEZYX0ZMT0FUIGZTdGVwID0gMC4wZjsNCisgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICBDRlhfUmVjdEZBcnJheSByZWN0QXJyYXk7DQorICBDRlhfUmVjdEYgcmVjdFRleHQ7DQorICBjb25zdCBGREVfVFhURURUUEFSQU1TKiB0eHRFZHRQYXJhbXMgPSBtX3BFZHRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsNCisgIEZYX0ZMT0FUIGZBc2VudCA9IChGWF9GTE9BVCl0eHRFZHRQYXJhbXMtPnBGb250LT5HZXRBc2NlbnQoKSAqDQorICAgICAgICAgICAgICAgICAgICB0eHRFZHRQYXJhbXMtPmZGb250U2l6ZSAvIDEwMDA7DQorICBwUGFnZS0+Q2FsY1JhbmdlUmVjdEFycmF5KG5TdGFydCwgbkNvdW50LCByZWN0QXJyYXkpOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWN0QXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgcmVjdFRleHQgPSByZWN0QXJyYXkuR2V0QXQoaSk7DQorICAgIGZZID0gcmVjdFRleHQudG9wICsgZkFzZW50ICsgZk9mZlNldFk7DQorICAgIGZTdGVwID0gdHh0RWR0UGFyYW1zLT5mRm9udFNpemUgLyAxNi4wZjsNCisgICAgZlN0YXJ0WCA9IHJlY3RUZXh0LmxlZnQgKyBmT2ZmU2V0WDsNCisgICAgZkVuZFggPSBmU3RhcnRYICsgcmVjdFRleHQuV2lkdGgoKTsNCisgICAgQWRkU3F1aWdnbHlQYXRoKFBhdGhEYXRhLCBmU3RhcnRYLCBmRW5kWCwgZlksIGZTdGVwKTsNCisgIH0NCiB9DQotRlhfQk9PTCBDRldMX0VkaXRJbXA6OkdldFN1Z2dlc3RXb3JkcyhDRlhfUG9pbnRGIHBvaW50ZiwgQ0ZYX0J5dGVTdHJpbmdBcnJheSAmc1N1Z2dlc3QpDQotew0KLSAgICBpbnQzMl90IG5Xb3JkQ291bnQgPSAwOw0KLSAgICBpbnQzMl90IG5Xb3JkU3RhcnQgPSBHZXRXb3JkQXRQb2ludChwb2ludGYsIG5Xb3JkQ291bnQpOw0KLSAgICBpZiAobldvcmRDb3VudCA8IDEpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1NwZWxsOw0KLSAgICBHZXRUZXh0KHdzU3BlbGwsIG5Xb3JkU3RhcnQsIG5Xb3JkQ291bnQpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBzTGF0aW5Xb3JkOw0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Xb3JkQ291bnQ7IGkrKykgew0KLSAgICAgICAgaWYgKCFGWF9FRElUX0lTTEFUSU5XT1JEKHdzU3BlbGxbaV0pKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBzTGF0aW5Xb3JkICs9IChGWF9DSEFSKXdzU3BlbGxbaV07DQotICAgIH0NCi0gICAgaWYgKHNMYXRpbldvcmQuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZXTF9FdnRFZHRDaGVja1dvcmQgY2hlY2tXb3JkRXZlbnQ7DQotICAgIGNoZWNrV29yZEV2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgY2hlY2tXb3JkRXZlbnQuYnNXb3JkID0gc0xhdGluV29yZDsNCi0gICAgY2hlY2tXb3JkRXZlbnQuYkNoZWNrV29yZCA9IFRSVUU7DQotICAgIERpc3BhdGNoRXZlbnQoJmNoZWNrV29yZEV2ZW50KTsNCi0gICAgaWYgKGNoZWNrV29yZEV2ZW50LmJDaGVja1dvcmQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRldMX0V2dEVkdEdldFN1Z2dlc3RXb3JkcyBzdWdnZXN0V29yZHNFdmVudDsNCi0gICAgc3VnZ2VzdFdvcmRzRXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBzdWdnZXN0V29yZHNFdmVudC5ic1dvcmQgPSBzTGF0aW5Xb3JkOw0KLSAgICBzdWdnZXN0V29yZHNFdmVudC5ic0FycmF5U3VnZ2VzdFdvcmRzID0gc1N1Z2dlc3Q7DQotICAgIHN1Z2dlc3RXb3Jkc0V2ZW50LmJTdWdnZXN0V29yZHMgPSBGQUxTRTsNCi0gICAgRGlzcGF0Y2hFdmVudCgmY2hlY2tXb3JkRXZlbnQpOw0KLSAgICByZXR1cm4gc3VnZ2VzdFdvcmRzRXZlbnQuYlN1Z2dlc3RXb3JkczsNCitpbnQzMl90IENGV0xfRWRpdEltcDo6R2V0V29yZEF0UG9pbnQoQ0ZYX1BvaW50RiBwb2ludGYsIGludDMyX3QmIG5Db3VudCkgew0KKyAgcmV0dXJuIDA7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKQ0KLXsNCi0gICAgaW50MzJfdCBuV29yZENvdW50ID0gMDsNCi0gICAgaW50MzJfdCBuV29yZFN0YXJ0ID0gR2V0V29yZEF0UG9pbnQocG9pbnRmLCBuV29yZENvdW50KTsNCi0gICAgaWYgKG5Xb3JkQ291bnQgPCAxKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NTcGVsbDsNCi0gICAgR2V0VGV4dCh3c1NwZWxsLCBuV29yZFN0YXJ0LCBuV29yZENvdW50KTsNCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuV29yZENvdW50OyBpKyspIHsNCi0gICAgICAgIGlmICghRlhfRURJVF9JU0xBVElOV09SRCh3c1NwZWxsW2ldKSkgew0KLSAgICAgICAgICAgIG5Xb3JkQ291bnQgPSBpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGludDMyX3QgbkRlc3RMZW4gPSBic1JlcGxhY2UuR2V0TGVuZ3RoKCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRGVzdDsNCi0gICAgRlhfV0NIQVIqIHBCdWZmZXIgPSB3c0Rlc3QuR2V0QnVmZmVyKG5EZXN0TGVuKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkRlc3RMZW47IGkrKykgew0KLSAgICAgICAgcEJ1ZmZlcltpXSA9IGJzUmVwbGFjZVtpXTsNCi0gICAgfQ0KLSAgICB3c0Rlc3QuUmVsZWFzZUJ1ZmZlcihuRGVzdExlbik7DQotICAgIFJlcGxhY2UobldvcmRTdGFydCwgbldvcmRDb3VudCwgd3NEZXN0KTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wOjpEcmF3U3BlbGxDaGVjayhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwR3JhcGhpY3MtPkNvbmNhdE1hdHJpeCgoQ0ZYX01hdHJpeCopcE1hdHJpeCk7DQotICAgIH0NCi0gICAgRlhfQVJHQiBjciA9IDB4RkZGRjAwMDA7DQotICAgIENGWF9Db2xvciBjckxpbmUoY3IpOw0KLSAgICBGWF9GTE9BVCBmV2lkdGggPSAxLjBmOw0KLSAgICBDRldMX0V2dEVkdENoZWNrV29yZCBjaGVja1dvcmRFdmVudDsNCi0gICAgY2hlY2tXb3JkRXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBzTGF0aW5Xb3JkOw0KLSAgICBDRlhfUGF0aCBwYXRoU3BlbGw7DQotICAgIHBhdGhTcGVsbC5DcmVhdGUoKTsNCi0gICAgaW50MzJfdCBuU3RhcnQgPSAwOw0KLSAgICBGWF9GTE9BVCBmT2ZmU2V0WCA9IG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFg7DQotICAgIEZYX0ZMT0FUIGZPZmZTZXRZID0gbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0Ow0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1NwZWxsOw0KLSAgICB0aGlzLT5HZXRUZXh0KHdzU3BlbGwpOw0KLSAgICBpbnQzMl90IG5Db250ZW50TGVuID0gd3NTcGVsbC5HZXRMZW5ndGgoKTsNCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ29udGVudExlbjsgaSsrKSB7DQotICAgICAgICBpZiAoRlhfRURJVF9JU0xBVElOV09SRCh3c1NwZWxsW2ldKSkgew0KLSAgICAgICAgICAgIGlmIChzTGF0aW5Xb3JkLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBuU3RhcnQgPSBpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzTGF0aW5Xb3JkICs9IChGWF9DSEFSKXdzU3BlbGxbaV07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGNoZWNrV29yZEV2ZW50LmJzV29yZCA9IHNMYXRpbldvcmQ7DQotICAgICAgICAgICAgY2hlY2tXb3JkRXZlbnQuYkNoZWNrV29yZCA9IFRSVUU7DQotICAgICAgICAgICAgRGlzcGF0Y2hFdmVudCgmY2hlY2tXb3JkRXZlbnQpOw0KLSAgICAgICAgICAgIGlmICghc0xhdGluV29yZC5Jc0VtcHR5KCkgJiYgIWNoZWNrV29yZEV2ZW50LmJDaGVja1dvcmQpIHsNCi0gICAgICAgICAgICAgICAgQWRkU3BlbGxDaGVja09iaihwYXRoU3BlbGwsIG5TdGFydCwgc0xhdGluV29yZC5HZXRMZW5ndGgoKSwgZk9mZlNldFgsIGZPZmZTZXRZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc0xhdGluV29yZC5FbXB0eSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGNoZWNrV29yZEV2ZW50LmJzV29yZCA9IHNMYXRpbldvcmQ7DQotICAgIGNoZWNrV29yZEV2ZW50LmJDaGVja1dvcmQgPSBUUlVFOw0KLSAgICBEaXNwYXRjaEV2ZW50KCZjaGVja1dvcmRFdmVudCk7DQotICAgIGlmICghc0xhdGluV29yZC5Jc0VtcHR5KCkgJiYgIWNoZWNrV29yZEV2ZW50LmJDaGVja1dvcmQpIHsNCi0gICAgICAgIEFkZFNwZWxsQ2hlY2tPYmoocGF0aFNwZWxsLCBuU3RhcnQsIHNMYXRpbldvcmQuR2V0TGVuZ3RoKCksIGZPZmZTZXRYLCBmT2ZmU2V0WSk7DQotICAgIH0NCi0gICAgaWYgKCFwYXRoU3BlbGwuSXNFbXB0eSgpKSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRDbGlwID0gbV9ydEVuZ2luZTsNCi0gICAgICAgIENGWF9NYXRyaXggbXQ7DQotICAgICAgICBtdC5TZXQoMSwgMCwgMCwgMSwgZk9mZlNldFgsIGZPZmZTZXRZKTsNCi0gICAgICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOw0KLSAgICAgICAgICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgICAgICB9DQotICAgICAgICBwR3JhcGhpY3MtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQotICAgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckxpbmUpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMCk7DQotICAgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGhTcGVsbCwgTlVMTCk7DQotICAgIH0NCi0gICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLX0NCi1GV0xfRVJSIENGV0xfRWRpdEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBpZiAobV9ydENsaWVudC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQotICAgIH0NCi0gICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KLSAgICBpZiAoIW1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgRHJhd1RleHRCayhwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIH0NCi0gICAgaWYgKG1fcEVkdEVuZ2luZSkgew0KLSAgICAgICAgRHJhd0NvbnRlbnQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSAmJiAhKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSkgew0KLSAgICAgICAgRHJhd1NwZWxsQ2hlY2socEdyYXBoaWNzLCBwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBpZiAoSGFzQm9yZGVyKCkpIHsNCi0gICAgICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9FRFRfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIGlmIChIYXNFZGdlKCkpIHsNCi0gICAgICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfRURUX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZVByb3ZpZGVyKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCi0gICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFRoZW1lUHJvdmlkZXIocFRoZW1lUHJvdmlkZXIpOw0KLSAgICB9DQotICAgIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQotICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wQ2FyZXQpIHsNCi0gICAgICAgIG1fcENhcmV0LT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCi0gICAgfQ0KLSAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gcFRoZW1lUHJvdmlkZXI7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCi17DQotICAgIG1fcEVkdEVuZ2luZS0+U2V0VGV4dCh3c1RleHQpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLWludDMyX3QgQ0ZXTF9FZGl0SW1wOjpHZXRUZXh0TGVuZ3RoKCkgY29uc3QNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCAtMSk7DQotICAgIHJldHVybiBtX3BFZHRFbmdpbmUtPkdldFRleHRMZW5ndGgoKTsNCi19DQotRldMX0VSUiBDRldMX0VkaXRJbXA6OkdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBuU3RhcnQgLCBpbnQzMl90IG5Db3VudCApIGNvbnN0DQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9TdWNjZWVkZWQpOw0KLSAgICBtX3BFZHRFbmdpbmUtPkdldFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0VkaXRJbXA6OkNsZWFyVGV4dCgpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9TdWNjZWVkZWQpOw0KLSAgICBtX3BFZHRFbmdpbmUtPkNsZWFyVGV4dCgpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLWludDMyX3QgQ0ZXTF9FZGl0SW1wOjpHZXRDYXJldFBvcygpIGNvbnN0DQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgLTEpOw0KLSAgICByZXR1cm4gbV9wRWR0RW5naW5lLT5HZXRDYXJldFBvcygpOw0KLX0NCi1pbnQzMl90IENGV0xfRWRpdEltcDo6U2V0Q2FyZXRQb3MoaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSApDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgLTEpOw0KLSAgICByZXR1cm4gbV9wRWR0RW5naW5lLT5TZXRDYXJldFBvcyhuSW5kZXgsIGJCZWZvcmUpOw0KLX0NCi1GV0xfRVJSIENGV0xfRWRpdEltcDo6QWRkU2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQotICAgIG1fcEVkdEVuZ2luZS0+QWRkU2VsUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLWludDMyX3QgQ0ZXTF9FZGl0SW1wOjpDb3VudFNlbFJhbmdlcygpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgMCk7DQotICAgIHJldHVybiBtX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotaW50MzJfdCBDRldMX0VkaXRJbXA6OkdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgLTEpOw0KLSAgICByZXR1cm4gbV9wRWR0RW5naW5lLT5HZXRTZWxSYW5nZShuSW5kZXgsIG5TdGFydCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpDbGVhclNlbGVjdGlvbnMoKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCi0gICAgbV9wRWR0RW5naW5lLT5DbGVhclNlbGVjdGlvbigpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLWludDMyX3QgQ0ZXTF9FZGl0SW1wOjpHZXRMaW1pdCgpDQotew0KLSAgICByZXR1cm4gbV9uTGltaXQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRMaW1pdChpbnQzMl90IG5MaW1pdCkNCi17DQotICAgIG1fbkxpbWl0ID0gbkxpbWl0Ow0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9TdWNjZWVkZWQpOw0KLSAgICBtX3BFZHRFbmdpbmUtPlNldExpbWl0KG5MaW1pdCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgbV9wRWR0RW5naW5lLT5TZXRBbGlhc0NoYXIod0FsaWFzKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0Zvcm1hdCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQotICAgIG1fcEVkdEVuZ2luZS0+U2V0Rm9ybWF0QmxvY2soMCwgd3NGb3JtYXQpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpJbnNlcnQoaW50MzJfdCBuU3RhcnQsIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsIGludDMyX3QgbkxlbikNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQotICAgIGlmICgJKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KQ0KLSAgICAgICAgICAgIHx8IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCi0gICAgfQ0KLSAgICBtX3BFZHRFbmdpbmUtPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbik7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0VkaXRJbXA6OkRlbGV0ZVNlbGVjdGlvbnMoKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQotICAgIGlmIChpQ291bnQgPiAwKSB7DQotICAgICAgICBtX3BFZHRFbmdpbmUtPkRlbGV0ZSgtMSk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfRWRpdEltcDo6RGVsZXRlUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQotICAgIG1fcEVkdEVuZ2luZS0+RGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpSZXBsYWNlU2VsZWN0aW9ucyhjb25zdCBDRlhfV2lkZVN0cmluZ0MgJndzUmVwbGFjZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9wRWR0RW5naW5lLT5Db3VudFNlbFJhbmdlcygpOw0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgaW50MzJfdCBuU3RhcnQ7DQotICAgICAgICBpbnQzMl90IG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoaSwgblN0YXJ0KTsNCi0gICAgICAgIG1fcEVkdEVuZ2luZS0+UmVwbGFjZShuU3RhcnQsIG5Db3VudCwgd3NSZXBsYWNlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpSZXBsYWNlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5MZW4sIGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NSZXBsYWNlKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCi0gICAgbV9wRWR0RW5naW5lLT5SZXBsYWNlKG5TdGFydCwgbkxlbiwgd3NSZXBsYWNlKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfRWRpdEltcDo6RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCi0gICAgaWYgKAkobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpDQotICAgICAgICAgICAgfHwJKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpKSB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotICAgIH0NCi0gICAgSUZXTF9BZGFwdGVyTmF0aXZlICpwTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTmF0aXZlLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBJRldMX0FkYXB0ZXJDbGlwYm9hcmRNZ3IgKnBDbGlwQm9yZGVyID0gcE5hdGl2ZS0+R2V0Q2xpcGJvYXJkTWdyKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocENsaXBCb3JkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgc3dpdGNoKGlDbWQpIHsNCi0gICAgICAgIGNhc2UgMTogew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydDsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSBtX3BFZHRFbmdpbmUtPkdldFNlbFJhbmdlKDAsIG5TdGFydCk7DQotICAgICAgICAgICAgICAgIGlmIChuQ291bnQgPCAxKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BFZHRFbmdpbmUtPkdldFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQotICAgICAgICAgICAgICAgIHBDbGlwQm9yZGVyLT5TZXRTdHJpbmdEYXRhKHdzVGV4dCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgMjogew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydDsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSBtX3BFZHRFbmdpbmUtPkdldFNlbFJhbmdlKDAsIG5TdGFydCk7DQotICAgICAgICAgICAgICAgIGlmIChuQ291bnQgPCAxKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BFZHRFbmdpbmUtPkdldFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQotICAgICAgICAgICAgICAgIG1fcEVkdEVuZ2luZS0+RGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KLSAgICAgICAgICAgICAgICBtX3BFZHRFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQotICAgICAgICAgICAgICAgIHBDbGlwQm9yZGVyLT5TZXRTdHJpbmdEYXRhKHdzVGV4dCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgMzogew0KLSAgICAgICAgICAgICAgICBwQ2xpcEJvcmRlci0+R2V0U3RyaW5nRGF0YSh3c1RleHQpOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4gPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIGlmIChpTGVuIDwgMCkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHdzVGV4dFtpTGVuXSA9PSBMJ1wwJykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlMZW4gPT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaUxlbiAtLTsNCi0gICAgICAgICAgICAgICAgICAgIHdzVGV4dCA9IHdzVGV4dC5MZWZ0KGlMZW4pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGludDMyX3QgblBvcyA9IG1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRQb3MoKTsNCi0gICAgICAgICAgICAgICAgbV9wRWR0RW5naW5lLT5JbnNlcnQoblBvcywgd3NUZXh0LCBpTGVuKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRkFMU0UpOw0KLSAgICBpbnQzMl90IG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+Q291bnRTZWxSYW5nZXMoKTsNCi0gICAgaWYgKG5Db3VudCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgd3NDb3B5LkVtcHR5KCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCi0gICAgaW50MzJfdCBuU3RhcnQsIG5MZW5ndGg7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgbkxlbmd0aCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoaSwgblN0YXJ0KTsNCi0gICAgICAgIG1fcEVkdEVuZ2luZS0+R2V0VGV4dCh3c1RlbXAsIG5TdGFydCwgbkxlbmd0aCk7DQotICAgICAgICB3c0NvcHkgKz0gd3NUZW1wOw0KLSAgICAgICAgd3NUZW1wLkVtcHR5KCk7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZBTFNFKTsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBtX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQotICAgIGlmIChuQ291bnQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHdzQ3V0LkVtcHR5KCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCi0gICAgaW50MzJfdCBuU3RhcnQsIG5MZW5ndGg7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgbkxlbmd0aCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoaSwgblN0YXJ0KTsNCi0gICAgICAgIG1fcEVkdEVuZ2luZS0+R2V0VGV4dCh3c1RlbXAsIG5TdGFydCwgbkxlbmd0aCk7DQotICAgICAgICB3c0N1dCArPSB3c1RlbXA7DQotICAgICAgICB3c1RlbXAuRW1wdHkoKTsNCi0gICAgfQ0KLSAgICBtX3BFZHRFbmdpbmUtPkRlbGV0ZSgwKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGQUxTRSk7DQotICAgIGludDMyX3QgbkNhcmV0ID0gbV9wRWR0RW5naW5lLT5HZXRDYXJldFBvcygpOw0KLSAgICBpbnQzMl90IGlFcnJvciA9IG1fcEVkdEVuZ2luZS0+SW5zZXJ0KG5DYXJldCwgd3NQYXN0ZS5jX3N0cigpLCB3c1Bhc3RlLkdldExlbmd0aCgpKTsNCi0gICAgaWYgKGlFcnJvciA8IDApIHsNCi0gICAgICAgIFByb2Nlc3NJbnNlcnRFcnJvcihpRXJyb3IpOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGV0xfRWRpdEltcDo6RGVsZXRlKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGQUxTRSk7DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9wRWR0RW5naW5lLT5Db3VudFNlbFJhbmdlcygpOw0KLSAgICBpZiAobkNvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG1fcEVkdEVuZ2luZS0+RGVsZXRlKDApOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRldMX0VkaXRJbXA6OlJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGQUxTRSk7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9Ob1JlZG9VbmRvKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wRWR0RW5naW5lLT5SZWRvKGJzUmVjb3JkKTsNCi19DQotRlhfQk9PTCBDRldMX0VkaXRJbXA6OlVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGQUxTRSk7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9Ob1JlZG9VbmRvKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wRWR0RW5naW5lLT5VbmRvKGJzUmVjb3JkKTsNCi19DQotRlhfQk9PTAlDRldMX0VkaXRJbXA6OlVuZG8oKQ0KLXsNCi0gICAgaWYgKCFDYW5VbmRvKCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZyBic1JlY29yZCA9IG1fUmVjb3JkQXJyW21faUN1clJlY29yZC0tXTsNCi0gICAgcmV0dXJuIFVuZG8oYnNSZWNvcmQpOw0KLX0NCi1GWF9CT09MCUNGV0xfRWRpdEltcDo6UmVkbygpDQotew0KLSAgICBpZiAoIUNhblJlZG8oKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9CeXRlU3RyaW5nIGJzUmVjb3JkID0gbV9SZWNvcmRBcnJbKyttX2lDdXJSZWNvcmRdOw0KLSAgICByZXR1cm4gUmVkbyhic1JlY29yZCk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpDYW5VbmRvKCkNCi17DQotICAgIHJldHVybiBtX2lDdXJSZWNvcmQgPj0gMDsNCi19DQotRlhfQk9PTAlDRldMX0VkaXRJbXA6OkNhblJlZG8oKQ0KLXsNCi0gICAgcmV0dXJuIG1faUN1clJlY29yZCA8IG1fUmVjb3JkQXJyLkdldFNpemUoKSAtIDE7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCi0gICAgRkRFX0xQVFhURURUUEFSQU1TIHBQYXJhbXMgPSAoRkRFX0xQVFhURURUUEFSQU1TKW1fcEVkdEVuZ2luZS0+R2V0RWRpdFBhcmFtcygpOw0KLSAgICBwUGFyYW1zLT5mVGFiV2lkdGggPSBmVGFiV2lkdGg7DQotICAgIHBQYXJhbXMtPmJUYWJFcXVpZGlzdGFudCA9IGJFcXVpZGlzdGFudDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfRWRpdEltcDo6U2V0T3V0ZXIoSUZXTF9XaWRnZXQgKnBPdXRlcikNCi17DQotICAgIG1fcE91dGVyID0gcE91dGVyOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9FZGl0SW1wOjpTZXROdW1iZXJSYW5nZShpbnQzMl90IGlNaW4sIGludDMyX3QgaU1heCkNCi17DQotICAgIG1faU1pbiA9IGlNaW47DQotICAgIG1faU1heCA9IGlNYXg7DQotICAgIG1fYlNldFJhbmdlID0gVFJVRTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi12b2lkIENGV0xfRWRpdEltcDo6T25fQ2FyZXRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCwgaW50MzJfdCBuUGFnZSwgRlhfQk9PTCBiVmlzaWJsZSApDQotew0KLSAgICBpZiAobV9ydEVuZ2luZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYlJlcGFpbnRDb250ZW50ID0gVXBkYXRlT2Zmc2V0KCk7DQotICAgIFVwZGF0ZUNhcmV0KCk7DQotICAgIENGWF9SZWN0RiBydEludmFsaWQ7DQotICAgIHJ0SW52YWxpZC5TZXQoMCwgMCwgMCwgMCk7DQotICAgIEZYX0JPT0wgYlJlcGFpbnRTY3JvbGwgPSBGQUxTRTsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSkgew0KLSAgICAgICAgSUZXTF9TY3JvbGxCYXIgKnBTY3JvbGwgPSBVcGRhdGVTY3JvbGwoKTsNCi0gICAgICAgIGlmIChwU2Nyb2xsKSB7DQotICAgICAgICAgICAgcFNjcm9sbC0+R2V0V2lkZ2V0UmVjdChydEludmFsaWQpOw0KLSAgICAgICAgICAgIGJSZXBhaW50U2Nyb2xsID0gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoYlJlcGFpbnRDb250ZW50IHx8IGJSZXBhaW50U2Nyb2xsKSB7DQotICAgICAgICBpZiAoYlJlcGFpbnRDb250ZW50KSB7DQotICAgICAgICAgICAgcnRJbnZhbGlkLlVuaW9uKG1fcnRFbmdpbmUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgUmVwYWludCgmcnRJbnZhbGlkKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfRWRpdEltcDo6T25fVGV4dENoYW5nZWQoSUZERV9UeHRFZHRFbmdpbmUgKnBFZGl0LCBGREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTyAmQ2hhbmdlSW5mbykNCi17DQotICAgIEZYX0RXT1JEIGR3U3R5bGVFeCA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQotICAgIGlmIChkd1N0eWxlRXggJiBGV0xfU1RZTEVFWFRfRURUX1ZBbGlnbk1hc2spIHsNCi0gICAgICAgIFVwZGF0ZVZBbGlnbm1lbnQoKTsNCi0gICAgfQ0KLSAgICBJRkRFX1R4dEVkdFBhZ2UgKnBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQotICAgIEZYX0ZMT0FUIGZDb250ZW50V2lkdGggPSBwYWdlLT5HZXRDb250ZW50c0JveCgpLndpZHRoOw0KLSAgICBGWF9GTE9BVCBmQ29udGVudEhlaWdodCA9IHBhZ2UtPkdldENvbnRlbnRzQm94KCkuaGVpZ2h0Ow0KLSAgICBDRlhfUmVjdEYgcnRUZW1wOw0KLSAgICBHZXRDbGllbnRSZWN0KHJ0VGVtcCk7DQotICAgIEZYX0JPT0wgYkhTZWxmQWRhcHRpb24gPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uOw0KLSAgICBGWF9CT09MIGJWU2VsZkFkYXB0aW9uID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbjsNCi0gICAgRlhfQk9PTCBiTmVlZFVwZGF0ZSA9IEZBTFNFOw0KLSAgICBpZiAoYkhTZWxmQWRhcHRpb24gfHwgYlZTZWxmQWRhcHRpb24pIHsNCi0gICAgICAgIENGV0xfRXZ0RWR0UHJlU2VsZkFkYXB0aW9uIGV2dDsNCi0gICAgICAgIGV2dC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICBldnQuYkhTZWxmQWRhcHRpb24gPSBUUlVFOw0KLSAgICAgICAgZXZ0LmJWU2VsZkFkYXB0aW9uID0gVFJVRTsNCi0gICAgICAgIEZYX0ZMT0FUIGZXaWR0aDsNCi0gICAgICAgIEZYX0ZMT0FUIGZIaWdodDsNCi0gICAgICAgIGZXaWR0aCA9IGJIU2VsZkFkYXB0aW9uID8gZkNvbnRlbnRXaWR0aCA6IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGg7DQotICAgICAgICBmSGlnaHQgPSBiVlNlbGZBZGFwdGlvbiA/IGZDb250ZW50SGVpZ2h0IDogbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQ7DQotICAgICAgICBldnQucnRBZnRlckNoYW5nZS5TZXQoMCwgMCwgZldpZHRoLCBmSGlnaHQpOw0KLSAgICAgICAgRGlzcGF0Y2hFdmVudCgmZXZ0KTsNCi0gICAgICAgIGlmICghZXZ0LmJIU2VsZkFkYXB0aW9uKSB7DQotICAgICAgICAgICAgTW9kaWZ5U3R5bGVzRXgoMCwgRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uIHwgRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWV2dC5iVlNlbGZBZGFwdGlvbikgew0KLSAgICAgICAgICAgIE1vZGlmeVN0eWxlc0V4KDAsIEZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbiB8IEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYk5lZWRVcGRhdGUgPSAoYkhTZWxmQWRhcHRpb24gJiYgIWV2dC5iSFNlbGZBZGFwdGlvbikgfHwgKGJWU2VsZkFkYXB0aW9uICYmICFldnQuYlZTZWxmQWRhcHRpb24pOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZDb250ZW50V2lkdGgxID0gZkNvbnRlbnRXaWR0aDsNCi0gICAgRlhfRkxPQVQgZkNvbnRlbnRIZWlnaHQxID0gZkNvbnRlbnRIZWlnaHQ7DQotICAgIGlmIChiTmVlZFVwZGF0ZSkgew0KLSAgICAgICAgVXBkYXRlRWRpdFBhcmFtcygpOw0KLSAgICAgICAgVXBkYXRlRWRpdExheW91dCgpOw0KLSAgICAgICAgSUZERV9UeHRFZHRQYWdlICpwYWdlMSA9IG1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCi0gICAgICAgIGZDb250ZW50V2lkdGgxID0gcGFnZTEtPkdldENvbnRlbnRzQm94KCkud2lkdGg7DQotICAgICAgICBmQ29udGVudEhlaWdodDEgPSBwYWdlMS0+R2V0Q29udGVudHNCb3goKS5oZWlnaHQ7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0hTZWxmQWRhcHRpb24pIHsNCi0gICAgICAgIHJ0VGVtcC53aWR0aCA9IEZYX01BWChtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoLCBmQ29udGVudFdpZHRoMSk7DQotICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoID0gZkNvbnRlbnRXaWR0aDE7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZTZWxmQWRhcHRpb24pIHsNCi0gICAgICAgIHJ0VGVtcC5oZWlnaHQgPSBGWF9NQVgobV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQsIGZDb250ZW50SGVpZ2h0MSk7DQotICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCA9IGZDb250ZW50SGVpZ2h0MTsNCi0gICAgfQ0KLSAgICBDRldMX0V2dEVkdFRleHRDaGFuZ2VkIGV2ZW50Ow0KLSAgICBldmVudC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIGV2ZW50Lm5DaGFuZ2VUeXBlID0gQ2hhbmdlSW5mby5uQ2hhbmdlVHlwZTsNCi0gICAgZXZlbnQud3NJbnNlcnQgPSBDaGFuZ2VJbmZvLndzSW5zZXJ0Ow0KLSAgICBldmVudC53c0RlbGV0ZSA9IENoYW5nZUluZm8ud3NEZWxldGU7DQotICAgIGV2ZW50LndzUHJldlRleHQgPSBDaGFuZ2VJbmZvLndzUHJldlRleHQ7DQotICAgIERpc3BhdGNoRXZlbnQoJmV2ZW50KTsNCi0gICAgTGF5b3V0U2Nyb2xsQmFyKCk7DQotICAgIFJlcGFpbnQoJnJ0VGVtcCk7DQotfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wOjpPbl9TZWxDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCkNCi17DQotICAgIENGWF9SZWN0RiBydFRlbXA7DQotICAgIEdldENsaWVudFJlY3QocnRUZW1wKTsNCi0gICAgUmVwYWludCgmcnRUZW1wKTsNCi19DQotRlhfQk9PTAlDRldMX0VkaXRJbXA6Ok9uX1BhZ2VMb2FkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCwgaW50MzJfdCBuUGFnZUluZGV4LCBpbnQzMl90IG5QdXJwb3NlKQ0KLXsNCi0gICAgSUZERV9UeHRFZHRFbmdpbmUgKnBFZHRFbmdpbmUgPSBtX3BFZHRFbmdpbmU7DQotICAgIElGREVfVHh0RWR0UGFnZSAqcFBhZ2UgPSBwRWR0RW5naW5lLT5HZXRQYWdlKG5QYWdlSW5kZXgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYWdlLCBGQUxTRSk7DQotICAgIHBQYWdlLT5Mb2FkUGFnZSgpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRldMX0VkaXRJbXA6Ok9uX1BhZ2VVbmxvYWQoSUZERV9UeHRFZHRFbmdpbmUgKnBFZGl0LCBpbnQzMl90IG5QYWdlSW5kZXgsIGludDMyX3QgblB1cnBvc2UpDQotew0KLSAgICBJRkRFX1R4dEVkdEVuZ2luZSAqcEVkdEVuZ2luZSA9IG1fcEVkdEVuZ2luZTsNCi0gICAgSUZERV9UeHRFZHRQYWdlICpwUGFnZSA9IHBFZHRFbmdpbmUtPkdldFBhZ2UoblBhZ2VJbmRleCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhZ2UsIEZBTFNFKTsNCi0gICAgcFBhZ2UtPlVubG9hZFBhZ2UoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wOjpPbl9BZGREb1JlY29yZChJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkNCi17DQotICAgIEFkZERvUmVjb3JkKGJzRG9SZWNvcmQpOw0KLSAgICBDRldMX1dpZGdldEltcCAqcFNyY1RhcmdldCA9IEdldFJvb3RPdXRlcigpOw0KLSAgICBpZiAoIXBTcmNUYXJnZXQpIHsNCi0gICAgICAgIHBTcmNUYXJnZXQgPSB0aGlzOw0KLSAgICB9DQotICAgIENGV0xfRXZ0RWR0QWRkRG9SZWNvcmQgZXZ0Ow0KLSAgICBldnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBldnQubV93c0RvUmVjb3JkID0gYnNEb1JlY29yZDsNCi0gICAgbV9wRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KCZldnQpOw0KLX0NCi1GWF9CT09MIENGV0xfRWRpdEltcDo6T25fVmFsaWRhdGVGaWVsZChJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIGludDMyX3QgbkJsb2NrSW5kZXgsIGludDMyX3QgbkZpZWxkSW5kZXgsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGaWVsZFRleHQsIGludDMyX3QgbkNoYXJJbmRleCkNCi17DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGV0xfRWRpdEltcDo6T25fVmFsaWRhdGVCbG9jayhJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIGludDMyX3QgbkJsb2NrSW5kZXgpDQotew0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRldMX0VkaXRJbXA6Ok9uX0dldEJsb2NrRm9ybWF0VGV4dChJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIGludDMyX3QgbkJsb2NrSW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0Jsb2NrVGV4dCkNCi17DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OkdldFN1Z2dlc3RXb3JkcyhDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQXJyYXkmIHNTdWdnZXN0KSB7DQorICBpbnQzMl90IG5Xb3JkQ291bnQgPSAwOw0KKyAgaW50MzJfdCBuV29yZFN0YXJ0ID0gR2V0V29yZEF0UG9pbnQocG9pbnRmLCBuV29yZENvdW50KTsNCisgIGlmIChuV29yZENvdW50IDwgMSkgew0KICAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpPbl9WYWxpZGF0ZShJRkRFX1R4dEVkdEVuZ2luZSAqIHBFZGl0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgSUZXTF9XaWRnZXQgKnBEc3QgPSBHZXRPdXRlcigpOw0KLSAgICBpZiAoIXBEc3QpIHsNCi0gICAgICAgIHBEc3QgPSAoSUZXTF9XaWRnZXQqKXRoaXM7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1NwZWxsOw0KKyAgR2V0VGV4dCh3c1NwZWxsLCBuV29yZFN0YXJ0LCBuV29yZENvdW50KTsNCisgIENGWF9CeXRlU3RyaW5nIHNMYXRpbldvcmQ7DQorICBmb3IgKGludCBpID0gMDsgaSA8IG5Xb3JkQ291bnQ7IGkrKykgew0KKyAgICBpZiAoIUZYX0VESVRfSVNMQVRJTldPUkQod3NTcGVsbFtpXSkpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBDRldMX0V2dEVkdFZhbGlkYXRlIGV2ZW50Ow0KLSAgICBldmVudC5wRHN0V2lkZ2V0ID0gcERzdDsNCi0gICAgZXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBldmVudC53c0luc2VydCA9IHdzVGV4dDsNCi0gICAgZXZlbnQuYlZhbGlkYXRlID0gVFJVRTsNCi0gICAgRGlzcGF0Y2hFdmVudCgmZXZlbnQpOw0KLSAgICByZXR1cm4gZXZlbnQuYlZhbGlkYXRlOw0KKyAgICBzTGF0aW5Xb3JkICs9IChGWF9DSEFSKXdzU3BlbGxbaV07DQorICB9DQorICBpZiAoc0xhdGluV29yZC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9FdnRFZHRDaGVja1dvcmQgY2hlY2tXb3JkRXZlbnQ7DQorICBjaGVja1dvcmRFdmVudC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBjaGVja1dvcmRFdmVudC5ic1dvcmQgPSBzTGF0aW5Xb3JkOw0KKyAgY2hlY2tXb3JkRXZlbnQuYkNoZWNrV29yZCA9IFRSVUU7DQorICBEaXNwYXRjaEV2ZW50KCZjaGVja1dvcmRFdmVudCk7DQorICBpZiAoY2hlY2tXb3JkRXZlbnQuYkNoZWNrV29yZCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX0V2dEVkdEdldFN1Z2dlc3RXb3JkcyBzdWdnZXN0V29yZHNFdmVudDsNCisgIHN1Z2dlc3RXb3Jkc0V2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgIHN1Z2dlc3RXb3Jkc0V2ZW50LmJzV29yZCA9IHNMYXRpbldvcmQ7DQorICBzdWdnZXN0V29yZHNFdmVudC5ic0FycmF5U3VnZ2VzdFdvcmRzID0gc1N1Z2dlc3Q7DQorICBzdWdnZXN0V29yZHNFdmVudC5iU3VnZ2VzdFdvcmRzID0gRkFMU0U7DQorICBEaXNwYXRjaEV2ZW50KCZjaGVja1dvcmRFdmVudCk7DQorICByZXR1cm4gc3VnZ2VzdFdvcmRzRXZlbnQuYlN1Z2dlc3RXb3JkczsNCiB9DQotRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldEJhY2tncm91bmRDb2xvcihGWF9EV09SRCBjb2xvcikNCi17DQotICAgIG1fYmFja0NvbG9yID0gY29sb3I7DQotICAgIG1fdXBkYXRlQmFja0NvbG9yID0gVFJVRTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0Rm9udChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGb250LCBGWF9GTE9BVCBmU2l6ZSkNCi17DQotICAgIG1fd3NGb250ID0gd3NGb250Ow0KLSAgICBtX2ZGb250U2l6ZSA9IGZTaXplOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wOjpTZXRTY3JvbGxPZmZzZXQoRlhfRkxPQVQgZlNjcm9sbE9mZnNldCkNCi17DQotICAgIG1fZlNjcm9sbE9mZnNldFkgPSBmU2Nyb2xsT2Zmc2V0Ow0KLX0NCi12b2lkIENGV0xfRWRpdEltcDo6RHJhd1RleHRCayhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQotICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0VEVF9CYWNrZ3JvdW5kOw0KLSAgICBwYXJhbS5tX2R3RGF0YSA9IEZXTF9QQVJUREFUQV9FRFRfQmFja2dyb3VuZDsNCi0gICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5ID8NCi0gICAgICAgICAgICAgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfRURUX1JlYWRPbmx5IDogRldMX1BBUlRTVEFURV9FRFRfTm9ybWFsOw0KLSAgICBGWF9EV09SRCBkd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKTsNCi0gICAgaWYgKCBkd1N0YXRlcykgew0KLSAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRURUX0Rpc2FibGU7DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OlJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKSB7DQorICBpbnQzMl90IG5Xb3JkQ291bnQgPSAwOw0KKyAgaW50MzJfdCBuV29yZFN0YXJ0ID0gR2V0V29yZEF0UG9pbnQocG9pbnRmLCBuV29yZENvdW50KTsNCisgIGlmIChuV29yZENvdW50IDwgMSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1NwZWxsOw0KKyAgR2V0VGV4dCh3c1NwZWxsLCBuV29yZFN0YXJ0LCBuV29yZENvdW50KTsNCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbldvcmRDb3VudDsgaSsrKSB7DQorICAgIGlmICghRlhfRURJVF9JU0xBVElOV09SRCh3c1NwZWxsW2ldKSkgew0KKyAgICAgIG5Xb3JkQ291bnQgPSBpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICBwYXJhbS5tX21hdHJpeCA9ICpwTWF0cml4Ow0KLSAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7DQotICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCi0gICAgaWYgKCFJc1Nob3dTY3JvbGxCYXIoVFJVRSkgfHwgIUlzU2hvd1Njcm9sbEJhcihGQUxTRSkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfUmVjdEYgcnRTY29ybGw7DQotICAgIG1fcEhvcnpTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocnRTY29ybGwpOw0KLSAgICBGWF9GTE9BVCBmU3RhdGljV2lkdGggPSBydFNjb3JsbC5oZWlnaHQ7DQotICAgIENGWF9SZWN0RiBydFN0YXRpYzsNCi0gICAgcnRTdGF0aWMuU2V0KG1fcnRDbGllbnQucmlnaHQoKSAtIHJ0U2NvcmxsLmhlaWdodCwNCi0gICAgICAgICAgICAgICAgIG1fcnRDbGllbnQuYm90dG9tKCkgLSBydFNjb3JsbC5oZWlnaHQsDQotICAgICAgICAgICAgICAgICBydFNjb3JsbC5oZWlnaHQsDQotICAgICAgICAgICAgICAgICBydFNjb3JsbC5oZWlnaHQpOw0KLSAgICBwYXJhbS5tX2R3RGF0YSA9IEZXTF9QQVJUREFUQV9FRFRfU3RhdGljQmFja2dyb3VuZDsNCi0gICAgcGFyYW0ubV9ydFBhcnQgPSBydFN0YXRpYzsNCi0gICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgfQ0KKyAgaW50MzJfdCBuRGVzdExlbiA9IGJzUmVwbGFjZS5HZXRMZW5ndGgoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRGVzdDsNCisgIEZYX1dDSEFSKiBwQnVmZmVyID0gd3NEZXN0LkdldEJ1ZmZlcihuRGVzdExlbik7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuRGVzdExlbjsgaSsrKSB7DQorICAgIHBCdWZmZXJbaV0gPSBic1JlcGxhY2VbaV07DQorICB9DQorICB3c0Rlc3QuUmVsZWFzZUJ1ZmZlcihuRGVzdExlbik7DQorICBSZXBsYWNlKG5Xb3JkU3RhcnQsIG5Xb3JkQ291bnQsIHdzRGVzdCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDRldMX0VkaXRJbXA6OkRyYXdDb250ZW50KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcEVkdEVuZ2luZSk7DQotICAgIElGREVfVHh0RWR0UGFnZSAqcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFBhZ2UpOw0KLSAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dCkgew0KLSAgICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpEcmF3U3BlbGxDaGVjayhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcEdyYXBoaWNzLT5Db25jYXRNYXRyaXgoKENGWF9NYXRyaXgqKXBNYXRyaXgpOw0KKyAgfQ0KKyAgRlhfQVJHQiBjciA9IDB4RkZGRjAwMDA7DQorICBDRlhfQ29sb3IgY3JMaW5lKGNyKTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IDEuMGY7DQorICBDRldMX0V2dEVkdENoZWNrV29yZCBjaGVja1dvcmRFdmVudDsNCisgIGNoZWNrV29yZEV2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgIENGWF9CeXRlU3RyaW5nIHNMYXRpbldvcmQ7DQorICBDRlhfUGF0aCBwYXRoU3BlbGw7DQorICBwYXRoU3BlbGwuQ3JlYXRlKCk7DQorICBpbnQzMl90IG5TdGFydCA9IDA7DQorICBGWF9GTE9BVCBmT2ZmU2V0WCA9IG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFg7DQorICBGWF9GTE9BVCBmT2ZmU2V0WSA9IG1fcnRFbmdpbmUudG9wIC0gbV9mU2Nyb2xsT2Zmc2V0WSArIG1fZlZBbGlnbk9mZnNldDsNCisgIENGWF9XaWRlU3RyaW5nIHdzU3BlbGw7DQorICB0aGlzLT5HZXRUZXh0KHdzU3BlbGwpOw0KKyAgaW50MzJfdCBuQ29udGVudExlbiA9IHdzU3BlbGwuR2V0TGVuZ3RoKCk7DQorICBmb3IgKGludCBpID0gMDsgaSA8IG5Db250ZW50TGVuOyBpKyspIHsNCisgICAgaWYgKEZYX0VESVRfSVNMQVRJTldPUkQod3NTcGVsbFtpXSkpIHsNCisgICAgICBpZiAoc0xhdGluV29yZC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIG5TdGFydCA9IGk7DQorICAgICAgfQ0KKyAgICAgIHNMYXRpbldvcmQgKz0gKEZYX0NIQVIpd3NTcGVsbFtpXTsNCisgICAgfSBlbHNlIHsNCisgICAgICBjaGVja1dvcmRFdmVudC5ic1dvcmQgPSBzTGF0aW5Xb3JkOw0KKyAgICAgIGNoZWNrV29yZEV2ZW50LmJDaGVja1dvcmQgPSBUUlVFOw0KKyAgICAgIERpc3BhdGNoRXZlbnQoJmNoZWNrV29yZEV2ZW50KTsNCisgICAgICBpZiAoIXNMYXRpbldvcmQuSXNFbXB0eSgpICYmICFjaGVja1dvcmRFdmVudC5iQ2hlY2tXb3JkKSB7DQorICAgICAgICBBZGRTcGVsbENoZWNrT2JqKHBhdGhTcGVsbCwgblN0YXJ0LCBzTGF0aW5Xb3JkLkdldExlbmd0aCgpLCBmT2ZmU2V0WCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgZk9mZlNldFkpOw0KKyAgICAgIH0NCisgICAgICBzTGF0aW5Xb3JkLkVtcHR5KCk7DQogICAgIH0NCisgIH0NCisgIGNoZWNrV29yZEV2ZW50LmJzV29yZCA9IHNMYXRpbldvcmQ7DQorICBjaGVja1dvcmRFdmVudC5iQ2hlY2tXb3JkID0gVFJVRTsNCisgIERpc3BhdGNoRXZlbnQoJmNoZWNrV29yZEV2ZW50KTsNCisgIGlmICghc0xhdGluV29yZC5Jc0VtcHR5KCkgJiYgIWNoZWNrV29yZEV2ZW50LmJDaGVja1dvcmQpIHsNCisgICAgQWRkU3BlbGxDaGVja09iaihwYXRoU3BlbGwsIG5TdGFydCwgc0xhdGluV29yZC5HZXRMZW5ndGgoKSwgZk9mZlNldFgsDQorICAgICAgICAgICAgICAgICAgICAgZk9mZlNldFkpOw0KKyAgfQ0KKyAgaWYgKCFwYXRoU3BlbGwuSXNFbXB0eSgpKSB7DQogICAgIENGWF9SZWN0RiBydENsaXAgPSBtX3J0RW5naW5lOw0KLSAgICBGWF9GTE9BVCBmT2ZmU2V0WCA9IG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFg7DQotICAgIEZYX0ZMT0FUIGZPZmZTZXRZID0gbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0Ow0KICAgICBDRlhfTWF0cml4IG10Ow0KICAgICBtdC5TZXQoMSwgMCwgMCwgMSwgZk9mZlNldFgsIGZPZmZTZXRZKTsNCiAgICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRDbGlwKTsNCi0gICAgICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOw0KKyAgICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQogICAgIH0NCi0gICAgRlhfQk9PTCBiU2hvd1NlbCA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9Ob0hpZGVTZWwpIHx8IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpOw0KLSAgICBpZiAoYlNob3dTZWwpIHsNCi0gICAgICAgIElGV0xfV2lkZ2V0ICpwRm9ybSA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KG1fcEludGVyZmFjZSwgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0pOw0KLSAgICAgICAgaWYgKHBGb3JtKSB7DQotICAgICAgICAgICAgYlNob3dTZWwgPSAocEZvcm0tPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkKSAhPSBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBuU2VsQ291bnQgPSBtX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQotICAgIGlmIChiU2hvd1NlbCAmJiBuU2VsQ291bnQgPiAwKSB7DQotICAgICAgICBpbnQzMl90IG5QYWdlQ2hhclN0YXJ0ID0gcFBhZ2UtPkdldENoYXJTdGFydCgpOw0KLSAgICAgICAgaW50MzJfdCBuUGFnZUNoYXJDb3VudCA9IHBQYWdlLT5HZXRDaGFyQ291bnQoKTsNCi0gICAgICAgIGludDMyX3QgblBhZ2VDaGFyRW5kCT0gblBhZ2VDaGFyU3RhcnQgKyBuUGFnZUNoYXJDb3VudCAtIDE7DQotICAgICAgICBpbnQzMl90IG5DaGFyQ291bnQ7DQotICAgICAgICBpbnQzMl90IG5DaGFyU3RhcnQ7DQotICAgICAgICBDRlhfUmVjdEZBcnJheSByZWN0QXJyOw0KLSAgICAgICAgaW50MzJfdCBpID0gMDsNCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuU2VsQ291bnQ7IGkgKyspIHsNCi0gICAgICAgICAgICBuQ2hhckNvdW50ID0gbV9wRWR0RW5naW5lLT5HZXRTZWxSYW5nZShpLCBuQ2hhclN0YXJ0KTsNCi0gICAgICAgICAgICBpbnQzMl90IG5DaGFyRW5kID0gbkNoYXJTdGFydCArIG5DaGFyQ291bnQgLSAxOw0KLSAgICAgICAgICAgIGlmIChuQ2hhckVuZCA8IG5QYWdlQ2hhclN0YXJ0IHx8IG5DaGFyU3RhcnQgPiBuUGFnZUNoYXJFbmQpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludDMyX3QgbkJnbiA9IEZYX01BWChuQ2hhclN0YXJ0LCBuUGFnZUNoYXJTdGFydCk7DQotICAgICAgICAgICAgaW50MzJfdCBuRW5kID0gRlhfTUlOKG5DaGFyRW5kLCBuUGFnZUNoYXJFbmQpOw0KLSAgICAgICAgICAgIHBQYWdlLT5DYWxjUmFuZ2VSZWN0QXJyYXkobkJnbiAtIG5QYWdlQ2hhclN0YXJ0LCBuRW5kIC0gbkJnbiArIDEsIHJlY3RBcnIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBuQ291bnQgPSByZWN0QXJyLkdldFNpemUoKTsNCi0gICAgICAgIENGWF9QYXRoIHBhdGg7DQotICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgICAgIHJlY3RBcnJbaV0ubGVmdCArPSBmT2ZmU2V0WDsNCi0gICAgICAgICAgICByZWN0QXJyW2ldLnRvcCArPSBmT2ZmU2V0WTsNCi0gICAgICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0QXJyW2ldLmxlZnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdEFycltpXS50b3AsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdEFycltpXS53aWR0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0QXJyW2ldLmhlaWdodCk7DQotICAgICAgICB9DQotICAgICAgICBwR3JhcGhpY3MtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQotICAgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCi0gICAgICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICAgICAgcGFyYW0ubV9tYXRyaXggPSAqcE1hdHJpeDsNCi0gICAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9FRFRfQmFja2dyb3VuZDsNCi0gICAgICAgIHBhcmFtLm1fcFBhdGggPSAmcGF0aDsNCi0gICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCi0gICAgfQ0KLSAgICBDRlhfUmVuZGVyRGV2aWNlICpwUmVuZGVyRGV2ID0gcEdyYXBoaWNzLT5HZXRSZW5kZXJEZXZpY2UoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVuZGVyRGV2KTsNCi0gICAgSUZERV9SZW5kZXJEZXZpY2UgKnBSZW5kZXJEZXZpY2UgPSBJRkRFX1JlbmRlckRldmljZTo6Q3JlYXRlKHBSZW5kZXJEZXYpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBSZW5kZXJEZXZpY2UpOw0KLSAgICBJRkRFX1JlbmRlckNvbnRleHQgKnBSZW5kZXJDb250ZXh0ID0gSUZERV9SZW5kZXJDb250ZXh0OjpDcmVhdGUoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVuZGVyQ29udGV4dCk7DQotICAgIHBSZW5kZXJEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQotICAgIHBSZW5kZXJDb250ZXh0LT5TdGFydFJlbmRlcihwUmVuZGVyRGV2aWNlLCAoSUZERV9DYW52YXNTZXQqKXBQYWdlLCBtdCk7DQotICAgIHBSZW5kZXJDb250ZXh0LT5Eb1JlbmRlcihOVUxMKTsNCi0gICAgcFJlbmRlckNvbnRleHQtPlJlbGVhc2UoKTsNCi0gICAgcFJlbmRlckRldmljZS0+UmVsZWFzZSgpOw0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQpIHsNCi0gICAgICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi0gICAgICAgIENGWF9QYXRoIHBhdGg7DQotICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICAgICAgaW50MzJfdCBpTGltaXQgPSBtX25MaW1pdCA+IDAgPyBtX25MaW1pdCA6IDE7DQotICAgICAgICBGWF9GTE9BVCBmU3RlcCA9IG1fcnRFbmdpbmUud2lkdGggLyBpTGltaXQ7DQotICAgICAgICBGWF9GTE9BVCBmTGVmdCA9IG1fcnRFbmdpbmUubGVmdCArIDE7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpTGltaXQ7IGkrKykgew0KLSAgICAgICAgICAgIGZMZWZ0ICs9IGZTdGVwOw0KLSAgICAgICAgICAgIHBhdGguQWRkTGluZShmTGVmdCwgbV9ydENsaWVudC50b3AsIGZMZWZ0LCBtX3J0Q2xpZW50LmJvdHRvbSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KLSAgICAgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgICAgICBwYXJhbS5tX21hdHJpeCA9ICpwTWF0cml4Ow0KLSAgICAgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0VEVF9Db21iVGV4dExpbmU7DQotICAgICAgICBwYXJhbS5tX3BQYXRoID0gJnBhdGg7DQotICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgIH0NCi0gICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICBwR3JhcGhpY3MtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyTGluZSk7DQorICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDApOw0KKyAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGhTcGVsbCwgTlVMTCk7DQorICB9DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQogfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVFZGl0RW5naW5lKCkNCi17DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpZiAobV9ydENsaWVudC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIGlmICghbV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIERyYXdUZXh0QmsocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKG1fcEVkdEVuZ2luZSkgew0KKyAgICBEcmF3Q29udGVudChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgJiYNCisgICAgICAhKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSkgew0KKyAgICBEcmF3U3BlbGxDaGVjayhwR3JhcGhpY3MsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9FRFRfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKEhhc0VkZ2UoKSkgew0KKyAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX0VEVF9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBUaGVtZVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0VGhlbWVQcm92aWRlcihwVGhlbWVQcm92aWRlcik7DQorICB9DQorICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCisgIH0NCisgIGlmIChtX3BDYXJldCkgew0KKyAgICBtX3BDYXJldC0+U2V0VGhlbWVQcm92aWRlcihwVGhlbWVQcm92aWRlcik7DQorICB9DQorICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gcFRoZW1lUHJvdmlkZXI7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIG1fcEVkdEVuZ2luZS0+U2V0VGV4dCh3c1RleHQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfRWRpdEltcDo6R2V0VGV4dExlbmd0aCgpIGNvbnN0IHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCAtMSk7DQorICByZXR1cm4gbV9wRWR0RW5naW5lLT5HZXRUZXh0TGVuZ3RoKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQpIGNvbnN0IHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICBtX3BFZHRFbmdpbmUtPkdldFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpDbGVhclRleHQoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9TdWNjZWVkZWQpOw0KKyAgbV9wRWR0RW5naW5lLT5DbGVhclRleHQoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQoraW50MzJfdCBDRldMX0VkaXRJbXA6OkdldENhcmV0UG9zKCkgY29uc3Qgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIC0xKTsNCisgIHJldHVybiBtX3BFZHRFbmdpbmUtPkdldENhcmV0UG9zKCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9FZGl0SW1wOjpTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgLTEpOw0KKyAgcmV0dXJuIG1fcEVkdEVuZ2luZS0+U2V0Q2FyZXRQb3MobkluZGV4LCBiQmVmb3JlKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkFkZFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCisgIG1fcEVkdEVuZ2luZS0+QWRkU2VsUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfRWRpdEltcDo6Q291bnRTZWxSYW5nZXMoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgMCk7DQorICByZXR1cm4gbV9wRWR0RW5naW5lLT5Db3VudFNlbFJhbmdlcygpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfRWRpdEltcDo6R2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIC0xKTsNCisgIHJldHVybiBtX3BFZHRFbmdpbmUtPkdldFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkNsZWFyU2VsZWN0aW9ucygpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICBtX3BFZHRFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9FZGl0SW1wOjpHZXRMaW1pdCgpIHsNCisgIHJldHVybiBtX25MaW1pdDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldExpbWl0KGludDMyX3QgbkxpbWl0KSB7DQorICBtX25MaW1pdCA9IG5MaW1pdDsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICBtX3BFZHRFbmdpbmUtPlNldExpbWl0KG5MaW1pdCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRBbGlhc0NoYXIoRlhfV0NIQVIgd0FsaWFzKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIG1fcEVkdEVuZ2luZS0+U2V0QWxpYXNDaGFyKHdBbGlhcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9TdWNjZWVkZWQpOw0KKyAgbV9wRWR0RW5naW5lLT5TZXRGb3JtYXRCbG9jaygwLCB3c0Zvcm1hdCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpJbnNlcnQoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9TdWNjZWVkZWQpOw0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkgfHwNCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIG1fcEVkdEVuZ2luZS0+SW5zZXJ0KG5TdGFydCwgbHBUZXh0LCBuTGVuKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkRlbGV0ZVNlbGVjdGlvbnMoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9TdWNjZWVkZWQpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQorICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICBtX3BFZHRFbmdpbmUtPkRlbGV0ZSgtMSk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpEZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICBtX3BFZHRFbmdpbmUtPkRlbGV0ZVJhbmdlKG5TdGFydCwgbkNvdW50KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlJlcGxhY2VTZWxlY3Rpb25zKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NSZXBsYWNlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9TdWNjZWVkZWQpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQorICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIGludDMyX3QgblN0YXJ0Ow0KKyAgICBpbnQzMl90IG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoaSwgblN0YXJ0KTsNCisgICAgbV9wRWR0RW5naW5lLT5SZXBsYWNlKG5TdGFydCwgbkNvdW50LCB3c1JlcGxhY2UpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6UmVwbGFjZShpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlcGxhY2UpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICBtX3BFZHRFbmdpbmUtPlJlcGxhY2UoblN0YXJ0LCBuTGVuLCB3c1JlcGxhY2UpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRldMX0VSUl9TdWNjZWVkZWQpOw0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkgfHwNCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgSUZXTF9BZGFwdGVyTmF0aXZlKiBwTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE5hdGl2ZSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIElGV0xfQWRhcHRlckNsaXBib2FyZE1nciogcENsaXBCb3JkZXIgPSBwTmF0aXZlLT5HZXRDbGlwYm9hcmRNZ3IoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocENsaXBCb3JkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBzd2l0Y2ggKGlDbWQpIHsNCisgICAgY2FzZSAxOiB7DQorICAgICAgaW50MzJfdCBuU3RhcnQ7DQorICAgICAgaW50MzJfdCBuQ291bnQgPSBtX3BFZHRFbmdpbmUtPkdldFNlbFJhbmdlKDAsIG5TdGFydCk7DQorICAgICAgaWYgKG5Db3VudCA8IDEpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBtX3BFZHRFbmdpbmUtPkdldFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQorICAgICAgcENsaXBCb3JkZXItPlNldFN0cmluZ0RhdGEod3NUZXh0KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIDI6IHsNCisgICAgICBpbnQzMl90IG5TdGFydDsNCisgICAgICBpbnQzMl90IG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoMCwgblN0YXJ0KTsNCisgICAgICBpZiAobkNvdW50IDwgMSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIG1fcEVkdEVuZ2luZS0+R2V0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCisgICAgICBtX3BFZHRFbmdpbmUtPkRlbGV0ZVJhbmdlKG5TdGFydCwgbkNvdW50KTsNCisgICAgICBtX3BFZHRFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQorICAgICAgcENsaXBCb3JkZXItPlNldFN0cmluZ0RhdGEod3NUZXh0KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIDM6IHsNCisgICAgICBwQ2xpcEJvcmRlci0+R2V0U3RyaW5nRGF0YSh3c1RleHQpOw0KKyAgICAgIGludDMyX3QgaUxlbiA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgICBpZiAoaUxlbiA8IDApIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAod3NUZXh0W2lMZW5dID09IEwnXDAnKSB7DQorICAgICAgICBpZiAoaUxlbiA9PSAxKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUxlbi0tOw0KKyAgICAgICAgd3NUZXh0ID0gd3NUZXh0LkxlZnQoaUxlbik7DQorICAgICAgfQ0KKyAgICAgIGludDMyX3QgblBvcyA9IG1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRQb3MoKTsNCisgICAgICBtX3BFZHRFbmdpbmUtPkluc2VydChuUG9zLCB3c1RleHQsIGlMZW4pOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGQUxTRSk7DQorICBpbnQzMl90IG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+Q291bnRTZWxSYW5nZXMoKTsNCisgIGlmIChuQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3c0NvcHkuRW1wdHkoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgIGludDMyX3QgblN0YXJ0LCBuTGVuZ3RoOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgbkxlbmd0aCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoaSwgblN0YXJ0KTsNCisgICAgbV9wRWR0RW5naW5lLT5HZXRUZXh0KHdzVGVtcCwgblN0YXJ0LCBuTGVuZ3RoKTsNCisgICAgd3NDb3B5ICs9IHdzVGVtcDsNCisgICAgd3NUZW1wLkVtcHR5KCk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OkN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGQUxTRSk7DQorICBpbnQzMl90IG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+Q291bnRTZWxSYW5nZXMoKTsNCisgIGlmIChuQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3c0N1dC5FbXB0eSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgaW50MzJfdCBuU3RhcnQsIG5MZW5ndGg7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBuTGVuZ3RoID0gbV9wRWR0RW5naW5lLT5HZXRTZWxSYW5nZShpLCBuU3RhcnQpOw0KKyAgICBtX3BFZHRFbmdpbmUtPkdldFRleHQod3NUZW1wLCBuU3RhcnQsIG5MZW5ndGgpOw0KKyAgICB3c0N1dCArPSB3c1RlbXA7DQorICAgIHdzVGVtcC5FbXB0eSgpOw0KKyAgfQ0KKyAgbV9wRWR0RW5naW5lLT5EZWxldGUoMCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRkFMU0UpOw0KKyAgaW50MzJfdCBuQ2FyZXQgPSBtX3BFZHRFbmdpbmUtPkdldENhcmV0UG9zKCk7DQorICBpbnQzMl90IGlFcnJvciA9DQorICAgICAgbV9wRWR0RW5naW5lLT5JbnNlcnQobkNhcmV0LCB3c1Bhc3RlLmNfc3RyKCksIHdzUGFzdGUuR2V0TGVuZ3RoKCkpOw0KKyAgaWYgKGlFcnJvciA8IDApIHsNCisgICAgUHJvY2Vzc0luc2VydEVycm9yKGlFcnJvcik7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6RGVsZXRlKCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZBTFNFKTsNCisgIGludDMyX3QgbkNvdW50ID0gbV9wRWR0RW5naW5lLT5Db3VudFNlbFJhbmdlcygpOw0KKyAgaWYgKG5Db3VudCA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9wRWR0RW5naW5lLT5EZWxldGUoMCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OlJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BFZHRFbmdpbmUsIEZBTFNFKTsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9Ob1JlZG9VbmRvKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEVkdEVuZ2luZS0+UmVkbyhic1JlY29yZCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGQUxTRSk7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTm9SZWRvVW5kbykgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBtX3BFZHRFbmdpbmUtPlVuZG8oYnNSZWNvcmQpOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6VW5kbygpIHsNCisgIGlmICghQ2FuVW5kbygpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIGJzUmVjb3JkID0gbV9SZWNvcmRBcnJbbV9pQ3VyUmVjb3JkLS1dOw0KKyAgcmV0dXJuIFVuZG8oYnNSZWNvcmQpOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6UmVkbygpIHsNCisgIGlmICghQ2FuUmVkbygpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIGJzUmVjb3JkID0gbV9SZWNvcmRBcnJbKyttX2lDdXJSZWNvcmRdOw0KKyAgcmV0dXJuIFJlZG8oYnNSZWNvcmQpOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6Q2FuVW5kbygpIHsNCisgIHJldHVybiBtX2lDdXJSZWNvcmQgPj0gMDsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OkNhblJlZG8oKSB7DQorICByZXR1cm4gbV9pQ3VyUmVjb3JkIDwgbV9SZWNvcmRBcnIuR2V0U2l6ZSgpIC0gMTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgRlhfQk9PTCBiRXF1aWRpc3RhbnQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICBGREVfTFBUWFRFRFRQQVJBTVMgcFBhcmFtcyA9DQorICAgICAgKEZERV9MUFRYVEVEVFBBUkFNUyltX3BFZHRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsNCisgIHBQYXJhbXMtPmZUYWJXaWR0aCA9IGZUYWJXaWR0aDsNCisgIHBQYXJhbXMtPmJUYWJFcXVpZGlzdGFudCA9IGJFcXVpZGlzdGFudDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldE91dGVyKElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcE91dGVyID0gcE91dGVyOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0TnVtYmVyUmFuZ2UoaW50MzJfdCBpTWluLCBpbnQzMl90IGlNYXgpIHsNCisgIG1faU1pbiA9IGlNaW47DQorICBtX2lNYXggPSBpTWF4Ow0KKyAgbV9iU2V0UmFuZ2UgPSBUUlVFOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6T25fQ2FyZXRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWaXNpYmxlKSB7DQorICBpZiAobV9ydEVuZ2luZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmVwYWludENvbnRlbnQgPSBVcGRhdGVPZmZzZXQoKTsNCisgIFVwZGF0ZUNhcmV0KCk7DQorICBDRlhfUmVjdEYgcnRJbnZhbGlkOw0KKyAgcnRJbnZhbGlkLlNldCgwLCAwLCAwLCAwKTsNCisgIEZYX0JPT0wgYlJlcGFpbnRTY3JvbGwgPSBGQUxTRTsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUpIHsNCisgICAgSUZXTF9TY3JvbGxCYXIqIHBTY3JvbGwgPSBVcGRhdGVTY3JvbGwoKTsNCisgICAgaWYgKHBTY3JvbGwpIHsNCisgICAgICBwU2Nyb2xsLT5HZXRXaWRnZXRSZWN0KHJ0SW52YWxpZCk7DQorICAgICAgYlJlcGFpbnRTY3JvbGwgPSBUUlVFOw0KKyAgICB9DQorICB9DQorICBpZiAoYlJlcGFpbnRDb250ZW50IHx8IGJSZXBhaW50U2Nyb2xsKSB7DQorICAgIGlmIChiUmVwYWludENvbnRlbnQpIHsNCisgICAgICBydEludmFsaWQuVW5pb24obV9ydEVuZ2luZSk7DQorICAgIH0NCisgICAgUmVwYWludCgmcnRJbnZhbGlkKTsNCisgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXA6Ok9uX1RleHRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX0lORk8mIENoYW5nZUluZm8pIHsNCisgIEZYX0RXT1JEIGR3U3R5bGVFeCA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorICBpZiAoZHdTdHlsZUV4ICYgRldMX1NUWUxFRVhUX0VEVF9WQWxpZ25NYXNrKSB7DQorICAgIFVwZGF0ZVZBbGlnbm1lbnQoKTsNCisgIH0NCisgIElGREVfVHh0RWR0UGFnZSogcGFnZSA9IG1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCisgIEZYX0ZMT0FUIGZDb250ZW50V2lkdGggPSBwYWdlLT5HZXRDb250ZW50c0JveCgpLndpZHRoOw0KKyAgRlhfRkxPQVQgZkNvbnRlbnRIZWlnaHQgPSBwYWdlLT5HZXRDb250ZW50c0JveCgpLmhlaWdodDsNCisgIENGWF9SZWN0RiBydFRlbXA7DQorICBHZXRDbGllbnRSZWN0KHJ0VGVtcCk7DQorICBGWF9CT09MIGJIU2VsZkFkYXB0aW9uID0NCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uOw0KKyAgRlhfQk9PTCBiVlNlbGZBZGFwdGlvbiA9DQorICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbjsNCisgIEZYX0JPT0wgYk5lZWRVcGRhdGUgPSBGQUxTRTsNCisgIGlmIChiSFNlbGZBZGFwdGlvbiB8fCBiVlNlbGZBZGFwdGlvbikgew0KKyAgICBDRldMX0V2dEVkdFByZVNlbGZBZGFwdGlvbiBldnQ7DQorICAgIGV2dC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIGV2dC5iSFNlbGZBZGFwdGlvbiA9IFRSVUU7DQorICAgIGV2dC5iVlNlbGZBZGFwdGlvbiA9IFRSVUU7DQorICAgIEZYX0ZMT0FUIGZXaWR0aDsNCisgICAgRlhfRkxPQVQgZkhpZ2h0Ow0KKyAgICBmV2lkdGggPSBiSFNlbGZBZGFwdGlvbiA/IGZDb250ZW50V2lkdGggOiBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoOw0KKyAgICBmSGlnaHQgPSBiVlNlbGZBZGFwdGlvbiA/IGZDb250ZW50SGVpZ2h0IDogbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQ7DQorICAgIGV2dC5ydEFmdGVyQ2hhbmdlLlNldCgwLCAwLCBmV2lkdGgsIGZIaWdodCk7DQorICAgIERpc3BhdGNoRXZlbnQoJmV2dCk7DQorICAgIGlmICghZXZ0LmJIU2VsZkFkYXB0aW9uKSB7DQorICAgICAgTW9kaWZ5U3R5bGVzRXgoDQorICAgICAgICAgIDAsIEZXTF9TVFlMRUVYVF9FRFRfSFNlbGZBZGFwdGlvbiB8IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGwpOw0KKyAgICB9DQorICAgIGlmICghZXZ0LmJWU2VsZkFkYXB0aW9uKSB7DQorICAgICAgTW9kaWZ5U3R5bGVzRXgoDQorICAgICAgICAgIDAsIEZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbiB8IEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGwpOw0KKyAgICB9DQorICAgIGJOZWVkVXBkYXRlID0gKGJIU2VsZkFkYXB0aW9uICYmICFldnQuYkhTZWxmQWRhcHRpb24pIHx8DQorICAgICAgICAgICAgICAgICAgKGJWU2VsZkFkYXB0aW9uICYmICFldnQuYlZTZWxmQWRhcHRpb24pOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aDEgPSBmQ29udGVudFdpZHRoOw0KKyAgRlhfRkxPQVQgZkNvbnRlbnRIZWlnaHQxID0gZkNvbnRlbnRIZWlnaHQ7DQorICBpZiAoYk5lZWRVcGRhdGUpIHsNCiAgICAgVXBkYXRlRWRpdFBhcmFtcygpOw0KICAgICBVcGRhdGVFZGl0TGF5b3V0KCk7DQotICAgIGlmIChtX25MaW1pdCA+IC0xKSB7DQotICAgICAgICBtX3BFZHRFbmdpbmUtPlNldExpbWl0KG1fbkxpbWl0KTsNCi0gICAgfQ0KKyAgICBJRkRFX1R4dEVkdFBhZ2UqIHBhZ2UxID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgICBmQ29udGVudFdpZHRoMSA9IHBhZ2UxLT5HZXRDb250ZW50c0JveCgpLndpZHRoOw0KKyAgICBmQ29udGVudEhlaWdodDEgPSBwYWdlMS0+R2V0Q29udGVudHNCb3goKS5oZWlnaHQ7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfSFNlbGZBZGFwdGlvbikgew0KKyAgICBydFRlbXAud2lkdGggPSBGWF9NQVgobV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwgZkNvbnRlbnRXaWR0aDEpOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoID0gZkNvbnRlbnRXaWR0aDE7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbikgew0KKyAgICBydFRlbXAuaGVpZ2h0ID0gRlhfTUFYKG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0LCBmQ29udGVudEhlaWdodDEpOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCA9IGZDb250ZW50SGVpZ2h0MTsNCisgIH0NCisgIENGV0xfRXZ0RWR0VGV4dENoYW5nZWQgZXZlbnQ7DQorICBldmVudC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBldmVudC5uQ2hhbmdlVHlwZSA9IENoYW5nZUluZm8ubkNoYW5nZVR5cGU7DQorICBldmVudC53c0luc2VydCA9IENoYW5nZUluZm8ud3NJbnNlcnQ7DQorICBldmVudC53c0RlbGV0ZSA9IENoYW5nZUluZm8ud3NEZWxldGU7DQorICBldmVudC53c1ByZXZUZXh0ID0gQ2hhbmdlSW5mby53c1ByZXZUZXh0Ow0KKyAgRGlzcGF0Y2hFdmVudCgmZXZlbnQpOw0KKyAgTGF5b3V0U2Nyb2xsQmFyKCk7DQorICBSZXBhaW50KCZydFRlbXApOw0KIH0NCi12b2lkIENGV0xfRWRpdEltcDo6VXBkYXRlRWRpdFBhcmFtcygpDQotew0KLSAgICBGREVfVFhURURUUEFSQU1TIHBhcmFtczsNCi0gICAgcGFyYW1zLm5Ib3J6U2NhbGUgPSAxMDA7DQotICAgIHBhcmFtcy5mUGxhdGVXaWR0aCA9IG1fcnRFbmdpbmUud2lkdGg7DQotICAgIHBhcmFtcy5mUGxhdGVIZWlnaHQgPSBtX3J0RW5naW5lLmhlaWdodDsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfUlRMTGF5b3V0KSB7DQotICAgICAgICBwYXJhbXMuZHdMYXlvdXRTdHlsZXMgfD0gRkRFX1RFWFRFRElUTEFZT1VUX1JUTDsNCit2b2lkIENGV0xfRWRpdEltcDo6T25fU2VsQ2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQpIHsNCisgIENGWF9SZWN0RiBydFRlbXA7DQorICBHZXRDbGllbnRSZWN0KHJ0VGVtcCk7DQorICBSZXBhaW50KCZydFRlbXApOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6T25fUGFnZUxvYWQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5QYWdlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblB1cnBvc2UpIHsNCisgIElGREVfVHh0RWR0RW5naW5lKiBwRWR0RW5naW5lID0gbV9wRWR0RW5naW5lOw0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IHBFZHRFbmdpbmUtPkdldFBhZ2UoblBhZ2VJbmRleCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYWdlLCBGQUxTRSk7DQorICBwUGFnZS0+TG9hZFBhZ2UoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6T25fUGFnZVVubG9hZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUGFnZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblB1cnBvc2UpIHsNCisgIElGREVfVHh0RWR0RW5naW5lKiBwRWR0RW5naW5lID0gbV9wRWR0RW5naW5lOw0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IHBFZHRFbmdpbmUtPkdldFBhZ2UoblBhZ2VJbmRleCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYWdlLCBGQUxTRSk7DQorICBwUGFnZS0+VW5sb2FkUGFnZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpPbl9BZGREb1JlY29yZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgew0KKyAgQWRkRG9SZWNvcmQoYnNEb1JlY29yZCk7DQorICBDRldMX1dpZGdldEltcCogcFNyY1RhcmdldCA9IEdldFJvb3RPdXRlcigpOw0KKyAgaWYgKCFwU3JjVGFyZ2V0KSB7DQorICAgIHBTcmNUYXJnZXQgPSB0aGlzOw0KKyAgfQ0KKyAgQ0ZXTF9FdnRFZHRBZGREb1JlY29yZCBldnQ7DQorICBldnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgZXZ0Lm1fd3NEb1JlY29yZCA9IGJzRG9SZWNvcmQ7DQorICBtX3BEZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQoJmV2dCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpPbl9WYWxpZGF0ZUZpZWxkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGRUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJJbmRleCkgew0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpPbl9WYWxpZGF0ZUJsb2NrKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja0luZGV4KSB7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6Ok9uX0dldEJsb2NrRm9ybWF0VGV4dChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQmxvY2tUZXh0KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpPbl9WYWxpZGF0ZShJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIElGV0xfV2lkZ2V0KiBwRHN0ID0gR2V0T3V0ZXIoKTsNCisgIGlmICghcERzdCkgew0KKyAgICBwRHN0ID0gKElGV0xfV2lkZ2V0Kil0aGlzOw0KKyAgfQ0KKyAgQ0ZXTF9FdnRFZHRWYWxpZGF0ZSBldmVudDsNCisgIGV2ZW50LnBEc3RXaWRnZXQgPSBwRHN0Ow0KKyAgZXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgZXZlbnQud3NJbnNlcnQgPSB3c1RleHQ7DQorICBldmVudC5iVmFsaWRhdGUgPSBUUlVFOw0KKyAgRGlzcGF0Y2hFdmVudCgmZXZlbnQpOw0KKyAgcmV0dXJuIGV2ZW50LmJWYWxpZGF0ZTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldEJhY2tncm91bmRDb2xvcihGWF9EV09SRCBjb2xvcikgew0KKyAgbV9iYWNrQ29sb3IgPSBjb2xvcjsNCisgIG1fdXBkYXRlQmFja0NvbG9yID0gVFJVRTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9udCwgRlhfRkxPQVQgZlNpemUpIHsNCisgIG1fd3NGb250ID0gd3NGb250Ow0KKyAgbV9mRm9udFNpemUgPSBmU2l6ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX0VkaXRJbXA6OlNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KSB7DQorICBtX2ZTY3JvbGxPZmZzZXRZID0gZlNjcm9sbE9mZnNldDsNCit9DQordm9pZCBDRldMX0VkaXRJbXA6OkRyYXdUZXh0QmsoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRURUX0JhY2tncm91bmQ7DQorICBwYXJhbS5tX2R3RGF0YSA9IEZXTF9QQVJUREFUQV9FRFRfQmFja2dyb3VuZDsNCisgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEZXTF9QQVJUU1RBVEVfRURUX1JlYWRPbmx5DQorICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMX1BBUlRTVEFURV9FRFRfTm9ybWFsOw0KKyAgRlhfRFdPUkQgZHdTdGF0ZXMgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCk7DQorICBpZiAoZHdTdGF0ZXMpIHsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRURUX0Rpc2FibGU7DQorICB9DQorICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtLm1fbWF0cml4ID0gKnBNYXRyaXg7DQorICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICBpZiAoIUlzU2hvd1Njcm9sbEJhcihUUlVFKSB8fCAhSXNTaG93U2Nyb2xsQmFyKEZBTFNFKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfUmVjdEYgcnRTY29ybGw7DQorICBtX3BIb3J6U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJ0U2NvcmxsKTsNCisgIEZYX0ZMT0FUIGZTdGF0aWNXaWR0aCA9IHJ0U2NvcmxsLmhlaWdodDsNCisgIENGWF9SZWN0RiBydFN0YXRpYzsNCisgIHJ0U3RhdGljLlNldChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBydFNjb3JsbC5oZWlnaHQsDQorICAgICAgICAgICAgICAgbV9ydENsaWVudC5ib3R0b20oKSAtIHJ0U2NvcmxsLmhlaWdodCwgcnRTY29ybGwuaGVpZ2h0LA0KKyAgICAgICAgICAgICAgIHJ0U2NvcmxsLmhlaWdodCk7DQorICBwYXJhbS5tX2R3RGF0YSA9IEZXTF9QQVJUREFUQV9FRFRfU3RhdGljQmFja2dyb3VuZDsNCisgIHBhcmFtLm1fcnRQYXJ0ID0gcnRTdGF0aWM7DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpEcmF3Q29udGVudChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wRWR0RW5naW5lKTsNCisgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBQYWdlKTsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dCkgew0KKyAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICB9DQorICBDRlhfUmVjdEYgcnRDbGlwID0gbV9ydEVuZ2luZTsNCisgIEZYX0ZMT0FUIGZPZmZTZXRYID0gbV9ydEVuZ2luZS5sZWZ0IC0gbV9mU2Nyb2xsT2Zmc2V0WDsNCisgIEZYX0ZMT0FUIGZPZmZTZXRZID0gbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0Ow0KKyAgQ0ZYX01hdHJpeCBtdDsNCisgIG10LlNldCgxLCAwLCAwLCAxLCBmT2ZmU2V0WCwgZk9mZlNldFkpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOw0KKyAgICBtdC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgRlhfQk9PTCBiU2hvd1NlbCA9DQorICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX05vSGlkZVNlbCkgfHwNCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCisgIGlmIChiU2hvd1NlbCkgew0KKyAgICBJRldMX1dpZGdldCogcEZvcm0gPQ0KKyAgICAgICAgbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQobV9wSW50ZXJmYWNlLCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQorICAgIGlmIChwRm9ybSkgew0KKyAgICAgIGJTaG93U2VsID0gKHBGb3JtLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZCkgIT0NCisgICAgICAgICAgICAgICAgIEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZDsNCiAgICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVmVydGljYWxMYXlvdXQpIHsNCi0gICAgICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWw7DQorICB9DQorICBpbnQzMl90IG5TZWxDb3VudCA9IG1fcEVkdEVuZ2luZS0+Q291bnRTZWxSYW5nZXMoKTsNCisgIGlmIChiU2hvd1NlbCAmJiBuU2VsQ291bnQgPiAwKSB7DQorICAgIGludDMyX3QgblBhZ2VDaGFyU3RhcnQgPSBwUGFnZS0+R2V0Q2hhclN0YXJ0KCk7DQorICAgIGludDMyX3QgblBhZ2VDaGFyQ291bnQgPSBwUGFnZS0+R2V0Q2hhckNvdW50KCk7DQorICAgIGludDMyX3QgblBhZ2VDaGFyRW5kID0gblBhZ2VDaGFyU3RhcnQgKyBuUGFnZUNoYXJDb3VudCAtIDE7DQorICAgIGludDMyX3QgbkNoYXJDb3VudDsNCisgICAgaW50MzJfdCBuQ2hhclN0YXJ0Ow0KKyAgICBDRlhfUmVjdEZBcnJheSByZWN0QXJyOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgblNlbENvdW50OyBpKyspIHsNCisgICAgICBuQ2hhckNvdW50ID0gbV9wRWR0RW5naW5lLT5HZXRTZWxSYW5nZShpLCBuQ2hhclN0YXJ0KTsNCisgICAgICBpbnQzMl90IG5DaGFyRW5kID0gbkNoYXJTdGFydCArIG5DaGFyQ291bnQgLSAxOw0KKyAgICAgIGlmIChuQ2hhckVuZCA8IG5QYWdlQ2hhclN0YXJ0IHx8IG5DaGFyU3RhcnQgPiBuUGFnZUNoYXJFbmQpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpbnQzMl90IG5CZ24gPSBGWF9NQVgobkNoYXJTdGFydCwgblBhZ2VDaGFyU3RhcnQpOw0KKyAgICAgIGludDMyX3QgbkVuZCA9IEZYX01JTihuQ2hhckVuZCwgblBhZ2VDaGFyRW5kKTsNCisgICAgICBwUGFnZS0+Q2FsY1JhbmdlUmVjdEFycmF5KG5CZ24gLSBuUGFnZUNoYXJTdGFydCwgbkVuZCAtIG5CZ24gKyAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdEFycik7DQogICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZlcnRpY2FsQ2hhcnMpIHsNCi0gICAgICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfQ2hhclZlcnRpYWw7DQorICAgIGludDMyX3QgbkNvdW50ID0gcmVjdEFyci5HZXRTaXplKCk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICAgIHJlY3RBcnJbaV0ubGVmdCArPSBmT2ZmU2V0WDsNCisgICAgICByZWN0QXJyW2ldLnRvcCArPSBmT2ZmU2V0WTsNCisgICAgICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0QXJyW2ldLmxlZnQsIHJlY3RBcnJbaV0udG9wLCByZWN0QXJyW2ldLndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RBcnJbaV0uaGVpZ2h0KTsNCiAgICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfUmV2ZXJzZUxpbmUpIHsNCi0gICAgICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfTGluZVJlc2VydmU7DQorICAgIHBHcmFwaGljcy0+U2V0Q2xpcFJlY3QocnRDbGlwKTsNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBwYXJhbS5tX21hdHJpeCA9ICpwTWF0cml4Ow0KKyAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9FRFRfQmFja2dyb3VuZDsNCisgICAgcGFyYW0ubV9wUGF0aCA9ICZwYXRoOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICB9DQorICBDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2ID0gcEdyYXBoaWNzLT5HZXRSZW5kZXJEZXZpY2UoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFJlbmRlckRldik7DQorICBJRkRFX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IElGREVfUmVuZGVyRGV2aWNlOjpDcmVhdGUocFJlbmRlckRldik7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBSZW5kZXJEZXZpY2UpOw0KKyAgSUZERV9SZW5kZXJDb250ZXh0KiBwUmVuZGVyQ29udGV4dCA9IElGREVfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBSZW5kZXJDb250ZXh0KTsNCisgIHBSZW5kZXJEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorICBwUmVuZGVyQ29udGV4dC0+U3RhcnRSZW5kZXIocFJlbmRlckRldmljZSwgKElGREVfQ2FudmFzU2V0KilwUGFnZSwgbXQpOw0KKyAgcFJlbmRlckNvbnRleHQtPkRvUmVuZGVyKE5VTEwpOw0KKyAgcFJlbmRlckNvbnRleHQtPlJlbGVhc2UoKTsNCisgIHBSZW5kZXJEZXZpY2UtPlJlbGVhc2UoKTsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dCkgew0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIGludDMyX3QgaUxpbWl0ID0gbV9uTGltaXQgPiAwID8gbV9uTGltaXQgOiAxOw0KKyAgICBGWF9GTE9BVCBmU3RlcCA9IG1fcnRFbmdpbmUud2lkdGggLyBpTGltaXQ7DQorICAgIEZYX0ZMT0FUIGZMZWZ0ID0gbV9ydEVuZ2luZS5sZWZ0ICsgMTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgaUxpbWl0OyBpKyspIHsNCisgICAgICBmTGVmdCArPSBmU3RlcDsNCisgICAgICBwYXRoLkFkZExpbmUoZkxlZnQsIG1fcnRDbGllbnQudG9wLCBmTGVmdCwgbV9ydENsaWVudC5ib3R0b20oKSk7DQogICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0FyYWJpY1NoYXBlcykgew0KLSAgICAgICAgcGFyYW1zLmR3TGF5b3V0U3R5bGVzIHw9IEZERV9URVhURURJVExBWU9VVF9BcmFiaWNTaGFwZXM7DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgcGFyYW0ubV9tYXRyaXggPSAqcE1hdHJpeDsNCisgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRURUX0NvbWJUZXh0TGluZTsNCisgICAgcGFyYW0ubV9wUGF0aCA9ICZwYXRoOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICB9DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVFZGl0RW5naW5lKCkgew0KKyAgVXBkYXRlRWRpdFBhcmFtcygpOw0KKyAgVXBkYXRlRWRpdExheW91dCgpOw0KKyAgaWYgKG1fbkxpbWl0ID4gLTEpIHsNCisgICAgbV9wRWR0RW5naW5lLT5TZXRMaW1pdChtX25MaW1pdCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVFZGl0UGFyYW1zKCkgew0KKyAgRkRFX1RYVEVEVFBBUkFNUyBwYXJhbXM7DQorICBwYXJhbXMubkhvcnpTY2FsZSA9IDEwMDsNCisgIHBhcmFtcy5mUGxhdGVXaWR0aCA9IG1fcnRFbmdpbmUud2lkdGg7DQorICBwYXJhbXMuZlBsYXRlSGVpZ2h0ID0gbV9ydEVuZ2luZS5oZWlnaHQ7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9SVExMYXlvdXQpIHsNCisgICAgcGFyYW1zLmR3TGF5b3V0U3R5bGVzIHw9IEZERV9URVhURURJVExBWU9VVF9SVEw7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVmVydGljYWxMYXlvdXQpIHsNCisgICAgcGFyYW1zLmR3TGF5b3V0U3R5bGVzIHw9IEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbDsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WZXJ0aWNhbENoYXJzKSB7DQorICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfQ2hhclZlcnRpYWw7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfUmV2ZXJzZUxpbmUpIHsNCisgICAgcGFyYW1zLmR3TGF5b3V0U3R5bGVzIHw9IEZERV9URVhURURJVExBWU9VVF9MaW5lUmVzZXJ2ZTsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9BcmFiaWNTaGFwZXMpIHsNCisgICAgcGFyYW1zLmR3TGF5b3V0U3R5bGVzIHw9IEZERV9URVhURURJVExBWU9VVF9BcmFiaWNTaGFwZXM7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfRXhwYW5kVGFiKSB7DQorICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfRXhwYW5kVGFiOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0KSB7DQorICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQ7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTGFzdExpbmVIZWlnaHQpIHsNCisgICAgcGFyYW1zLmR3TGF5b3V0U3R5bGVzIHw9IEZERV9URVhURURJVExBWU9VVF9MYXN0TGluZUhlaWdodDsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WYWxpZGF0ZSkgew0KKyAgICBwYXJhbXMuZHdNb2RlIHw9IEZERV9URVhURURJVE1PREVfVmFsaWRhdGU7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfUGFzc3dvcmQpIHsNCisgICAgcGFyYW1zLmR3TW9kZSB8PSBGREVfVEVYVEVESVRNT0RFX1Bhc3N3b3JkOw0KKyAgfQ0KKyAgc3dpdGNoIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25NYXNrKSB7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0VEVF9ITmVhcjogew0KKyAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9MZWZ0Ow0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9FeHBhbmRUYWIpIHsNCi0gICAgICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfRXhwYW5kVGFiOw0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfSENlbnRlcjogew0KKyAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9DZW50ZXI7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0KSB7DQotICAgICAgICBwYXJhbXMuZHdMYXlvdXRTdHlsZXMgfD0gRkRFX1RFWFRFRElUTEFZT1VUX0NvbWJUZXh0Ow0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfSEZhcjogew0KKyAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9SaWdodDsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTGFzdExpbmVIZWlnaHQpIHsNCi0gICAgICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfTGFzdExpbmVIZWlnaHQ7DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICBzd2l0Y2ggKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0hBbGlnbk1vZGVNYXNrKSB7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0VEVF9KdXN0aWZpZWQ6IHsNCisgICAgICBwYXJhbXMuZHdBbGlnbm1lbnQgfD0gRkRFX1RFWFRFRElUQUxJR05fSnVzdGlmaWVkOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WYWxpZGF0ZSkgew0KLSAgICAgICAgcGFyYW1zLmR3TW9kZSB8PSBGREVfVEVYVEVESVRNT0RFX1ZhbGlkYXRlOw0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfRGlzdHJpYnV0ZWQ6IHsNCisgICAgICBwYXJhbXMuZHdBbGlnbm1lbnQgfD0gRkRFX1RFWFRFRElUQUxJR05fRGlzdHJpYnV0ZWQ7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1Bhc3N3b3JkKSB7DQotICAgICAgICBwYXJhbXMuZHdNb2RlIHw9IEZERV9URVhURURJVE1PREVfUGFzc3dvcmQ7DQorICAgIGRlZmF1bHQ6IHsgcGFyYW1zLmR3QWxpZ25tZW50IHw9IEZERV9URVhURURJVEFMSUdOX05vcm1hbDsgfQ0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSkgew0KKyAgICBwYXJhbXMuZHdNb2RlIHw9IEZERV9URVhURURJVE1PREVfTXVsdGlMaW5lczsNCisgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0hTY3JvbGwpID09IDAgJiYNCisgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbCkgPT0gMCkgew0KKyAgICAgIHBhcmFtcy5kd01vZGUgfD0NCisgICAgICAgICAgRkRFX1RFWFRFRElUTU9ERV9BdXRvTGluZVdyYXAgfCBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6Ow0KICAgICB9DQotICAgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTWFzaykgew0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfRURUX0hOZWFyOiB7DQotICAgICAgICAgICAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9MZWZ0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfSENlbnRlcjogew0KLSAgICAgICAgICAgICAgICBwYXJhbXMuZHdBbGlnbm1lbnQgfD0gRkRFX1RFWFRFRElUQUxJR05fQ2VudGVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfSEZhcjogew0KLSAgICAgICAgICAgICAgICBwYXJhbXMuZHdBbGlnbm1lbnQgfD0gRkRFX1RFWFRFRElUQUxJR05fUmlnaHQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgc3dpdGNoIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25Nb2RlTWFzaykgew0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfRURUX0p1c3RpZmllZDogew0KLSAgICAgICAgICAgICAgICBwYXJhbXMuZHdBbGlnbm1lbnQgfD0gRkRFX1RFWFRFRElUQUxJR05fSnVzdGlmaWVkOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfRGlzdHJpYnV0ZWQ6IHsNCi0gICAgICAgICAgICAgICAgcGFyYW1zLmR3QWxpZ25tZW50IHw9IEZERV9URVhURURJVEFMSUdOX0Rpc3RyaWJ1dGVkOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9Ob3JtYWw7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUpIHsNCi0gICAgICAgIHBhcmFtcy5kd01vZGUgfD0gRkRFX1RFWFRFRElUTU9ERV9NdWx0aUxpbmVzOw0KLSAgICAgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0hTY3JvbGwpID09IDAgJiYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsKSA9PSAwKSB7DQotICAgICAgICAgICAgcGFyYW1zLmR3TW9kZSB8PSBGREVfVEVYVEVESVRNT0RFX0F1dG9MaW5lV3JhcCB8IEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX0hvcno7DQotICAgICAgICB9DQotICAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfVlNjcm9sbCkgPT0gMCAmJiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGwpID09IDApIHsNCi0gICAgICAgICAgICBwYXJhbXMuZHdNb2RlIHw9IEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX1ZlcnQ7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBhcmFtcy5mUGxhdGVIZWlnaHQgPSAweDAwRkZGRkZGOw0KLSAgICAgICAgfQ0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfVlNjcm9sbCkgPT0gMCAmJg0KKyAgICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0F1dG9WU2Nyb2xsKSA9PSAwKSB7DQorICAgICAgcGFyYW1zLmR3TW9kZSB8PSBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9WZXJ0Ow0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbCkgPT0gMCkgew0KLSAgICAgICAgICAgIHBhcmFtcy5kd01vZGUgfD0gRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfSG9yejsNCi0gICAgICAgIH0NCisgICAgICBwYXJhbXMuZlBsYXRlSGVpZ2h0ID0gMHgwMEZGRkZGRjsNCiAgICAgfQ0KLSAgICBpZiAoCShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkNCi0gICAgICAgICAgICB8fAkobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCi0gICAgICAgIHBhcmFtcy5kd01vZGUgfD0gRkRFX1RFWFRFRElUTU9ERV9SZWFkT25seTsNCisgIH0gZWxzZSB7DQorICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGwpID09IDApIHsNCisgICAgICBwYXJhbXMuZHdNb2RlIHw9IEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX0hvcno7DQogICAgIH0NCi0gICAgRlhfRkxPQVQgKnBGb250U2l6ZSA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfRm9udFNpemUpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBGb250U2l6ZSk7DQotICAgIG1fZkZvbnRTaXplID0gKnBGb250U2l6ZTsNCi0gICAgRlhfRFdPUkQgKnBGb250Q29sb3IgPSAoRlhfRFdPUkQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1RleHRDb2xvcik7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEZvbnRDb2xvcik7DQotICAgIHBhcmFtcy5kd0ZvbnRDb2xvciA9ICpwRm9udENvbG9yOw0KLSAgICBGWF9GTE9BVCAqcExpbmVIZWlnaHQgPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX0xpbmVIZWlnaHQpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBMaW5lSGVpZ2h0KTsNCi0gICAgcGFyYW1zLmZMaW5lU3BhY2UgPSAqcExpbmVIZWlnaHQ7DQotICAgIElGWF9Gb250ICpwRm9udCA9IChJRlhfRm9udCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfRm9udCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEZvbnQpOw0KLSAgICBwYXJhbXMucEZvbnQJCQk9IHBGb250Ow0KLSAgICBwYXJhbXMuZkZvbnRTaXplCQk9IG1fZkZvbnRTaXplOw0KLSAgICBwYXJhbXMubkxpbmVDb3VudAkJPSAoaW50MzJfdCkocGFyYW1zLmZQbGF0ZUhlaWdodCAvIHBhcmFtcy5mTGluZVNwYWNlKTsNCi0gICAgaWYgKHBhcmFtcy5uTGluZUNvdW50IDw9IDApIHsNCi0gICAgICAgIHBhcmFtcy5uTGluZUNvdW50ID0gMTsNCi0gICAgfQ0KLSAgICBwYXJhbXMuZlRhYldpZHRoCQk9IHBhcmFtcy5mRm9udFNpemUgKiAxOw0KLSAgICBwYXJhbXMuYlRhYkVxdWlkaXN0YW50CT0gVFJVRTsNCi0gICAgcGFyYW1zLndMaW5lQnJlYWtDaGFyCT0gTCdcbic7DQotICAgIHBhcmFtcy5uQ2hhclJvdGF0aW9uCT0gMDsNCi0gICAgcGFyYW1zLnBFdmVudFNpbmsJCT0gdGhpczsNCi0gICAgbV9wRWR0RW5naW5lLT5TZXRFZGl0UGFyYW1zKHBhcmFtcyk7DQorICB9DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSB8fA0KKyAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSkgew0KKyAgICBwYXJhbXMuZHdNb2RlIHw9IEZERV9URVhURURJVE1PREVfUmVhZE9ubHk7DQorICB9DQorICBGWF9GTE9BVCogcEZvbnRTaXplID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9Gb250U2l6ZSk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBGb250U2l6ZSk7DQorICBtX2ZGb250U2l6ZSA9ICpwRm9udFNpemU7DQorICBGWF9EV09SRCogcEZvbnRDb2xvciA9IChGWF9EV09SRCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfVGV4dENvbG9yKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEZvbnRDb2xvcik7DQorICBwYXJhbXMuZHdGb250Q29sb3IgPSAqcEZvbnRDb2xvcjsNCisgIEZYX0ZMT0FUKiBwTGluZUhlaWdodCA9DQorICAgICAgKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9MaW5lSGVpZ2h0KTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocExpbmVIZWlnaHQpOw0KKyAgcGFyYW1zLmZMaW5lU3BhY2UgPSAqcExpbmVIZWlnaHQ7DQorICBJRlhfRm9udCogcEZvbnQgPSAoSUZYX0ZvbnQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX0ZvbnQpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRm9udCk7DQorICBwYXJhbXMucEZvbnQgPSBwRm9udDsNCisgIHBhcmFtcy5mRm9udFNpemUgPSBtX2ZGb250U2l6ZTsNCisgIHBhcmFtcy5uTGluZUNvdW50ID0gKGludDMyX3QpKHBhcmFtcy5mUGxhdGVIZWlnaHQgLyBwYXJhbXMuZkxpbmVTcGFjZSk7DQorICBpZiAocGFyYW1zLm5MaW5lQ291bnQgPD0gMCkgew0KKyAgICBwYXJhbXMubkxpbmVDb3VudCA9IDE7DQorICB9DQorICBwYXJhbXMuZlRhYldpZHRoID0gcGFyYW1zLmZGb250U2l6ZSAqIDE7DQorICBwYXJhbXMuYlRhYkVxdWlkaXN0YW50ID0gVFJVRTsNCisgIHBhcmFtcy53TGluZUJyZWFrQ2hhciA9IEwnXG4nOw0KKyAgcGFyYW1zLm5DaGFyUm90YXRpb24gPSAwOw0KKyAgcGFyYW1zLnBFdmVudFNpbmsgPSB0aGlzOw0KKyAgbV9wRWR0RW5naW5lLT5TZXRFZGl0UGFyYW1zKHBhcmFtcyk7DQogfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVFZGl0TGF5b3V0KCkNCi17DQotICAgIGlmIChtX3BFZHRFbmdpbmUtPkdldFRleHRMZW5ndGgoKSA8PSAwKSB7DQotICAgICAgICBtX3BFZHRFbmdpbmUtPlNldFRleHRCeVN0cmVhbShOVUxMKTsNCi0gICAgfQ0KLSAgICBJRkRFX1R4dEVkdFBhZ2UgKnBQYWdlID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KLSAgICBpZiAocFBhZ2UpIHsNCi0gICAgICAgIHBQYWdlLT5VbmxvYWRQYWdlKCk7DQotICAgICAgICBwUGFnZSA9IE5VTEw7DQotICAgIH0NCi0gICAgbV9wRWR0RW5naW5lLT5TdGFydExheW91dCgpOw0KLSAgICBtX3BFZHRFbmdpbmUtPkRvTGF5b3V0KE5VTEwpOw0KLSAgICBtX3BFZHRFbmdpbmUtPkVuZExheW91dCgpOw0KLSAgICBwUGFnZSA9IG1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCi0gICAgaWYgKHBQYWdlKSB7DQotICAgICAgICBwUGFnZS0+TG9hZFBhZ2UoKTsNCi0gICAgfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVFZGl0TGF5b3V0KCkgew0KKyAgaWYgKG1fcEVkdEVuZ2luZS0+R2V0VGV4dExlbmd0aCgpIDw9IDApIHsNCisgICAgbV9wRWR0RW5naW5lLT5TZXRUZXh0QnlTdHJlYW0oTlVMTCk7DQorICB9DQorICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgaWYgKHBQYWdlKSB7DQorICAgIHBQYWdlLT5VbmxvYWRQYWdlKCk7DQorICAgIHBQYWdlID0gTlVMTDsNCisgIH0NCisgIG1fcEVkdEVuZ2luZS0+U3RhcnRMYXlvdXQoKTsNCisgIG1fcEVkdEVuZ2luZS0+RG9MYXlvdXQoTlVMTCk7DQorICBtX3BFZHRFbmdpbmUtPkVuZExheW91dCgpOw0KKyAgcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICBpZiAocFBhZ2UpIHsNCisgICAgcFBhZ2UtPkxvYWRQYWdlKCk7DQorICB9DQogfQ0KLUZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVPZmZzZXQoKQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0Q2FyZXQ7DQotICAgIG1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRSZWN0KHJ0Q2FyZXQpOw0KLSAgICBGWF9GTE9BVCBmT2ZmU2V0WCA9IG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFg7DQotICAgIEZYX0ZMT0FUIGZPZmZTZXRZID0gbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0Ow0KLSAgICBydENhcmV0Lk9mZnNldChmT2ZmU2V0WCwgZk9mZlNldFkpOw0KLSAgICBjb25zdCBDRlhfUmVjdEYmIHJ0RWlkdCA9IG1fcnRFbmdpbmU7DQotICAgIGlmIChydEVpZHQuQ29udGFpbnMocnRDYXJldCkpIHsNCi0gICAgICAgIElGREVfVHh0RWR0UGFnZSAqcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQotICAgICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYWdlLCBGQUxTRSk7DQotICAgICAgICBDRlhfUmVjdEYgcnRGREUgPSBwUGFnZS0+R2V0Q29udGVudHNCb3goKTsNCi0gICAgICAgIHJ0RkRFLk9mZnNldChmT2ZmU2V0WCwgZk9mZlNldFkpOw0KLSAgICAgICAgaWYgKHJ0RkRFLnJpZ2h0KCkgPCBydEVpZHQucmlnaHQoKSAmJiBtX2ZTY3JvbGxPZmZzZXRYID4gMCkgew0KLSAgICAgICAgICAgIG1fZlNjcm9sbE9mZnNldFggKz0gcnRGREUucmlnaHQoKSAtIHJ0RWlkdC5yaWdodCgpOw0KLSAgICAgICAgICAgIGlmIChtX2ZTY3JvbGxPZmZzZXRYIDwgMCkgew0KLSAgICAgICAgICAgICAgICBtX2ZTY3JvbGxPZmZzZXRYID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAocnRGREUuYm90dG9tKCkgPCBydEVpZHQuYm90dG9tKCkgJiYgbV9mU2Nyb2xsT2Zmc2V0WSA+IDApIHsNCi0gICAgICAgICAgICBtX2ZTY3JvbGxPZmZzZXRZICs9IHJ0RkRFLmJvdHRvbSgpIC0gcnRFaWR0LmJvdHRvbSgpOw0KLSAgICAgICAgICAgIGlmIChtX2ZTY3JvbGxPZmZzZXRZIDwgMCkgew0KLSAgICAgICAgICAgICAgICBtX2ZTY3JvbGxPZmZzZXRZID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWF9GTE9BVCBvZmZzZXRYID0gMC4wOw0KLSAgICAgICAgRlhfRkxPQVQgb2Zmc2V0WSA9IDAuMDsNCi0gICAgICAgIGlmIChydENhcmV0LmxlZnQgPCBydEVpZHQubGVmdCkgew0KLSAgICAgICAgICAgIG9mZnNldFggPSBydENhcmV0LmxlZnQgLSBydEVpZHQubGVmdDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChydENhcmV0LnJpZ2h0KCkgPiBydEVpZHQucmlnaHQoKSkgew0KLSAgICAgICAgICAgIG9mZnNldFggPSBydENhcmV0LnJpZ2h0KCkgLSBydEVpZHQucmlnaHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChydENhcmV0LnRvcCA8IHJ0RWlkdC50b3ApIHsNCi0gICAgICAgICAgICBvZmZzZXRZID0gIHJ0Q2FyZXQudG9wIC0gcnRFaWR0LnRvcDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChydENhcmV0LmJvdHRvbSgpID4gcnRFaWR0LmJvdHRvbSgpKSB7DQotICAgICAgICAgICAgb2Zmc2V0WSA9IHJ0Q2FyZXQuYm90dG9tKCkgLSBydEVpZHQuYm90dG9tKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uKSkgew0KLSAgICAgICAgICAgIG1fZlNjcm9sbE9mZnNldFggKz0gb2Zmc2V0WDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZTZWxmQWRhcHRpb24pKSB7DQotICAgICAgICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSArPSBvZmZzZXRZOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG1fZkZvbnRTaXplID4gbV9ydEVuZ2luZS5oZWlnaHQpIHsNCi0gICAgICAgICAgICBtX2ZTY3JvbGxPZmZzZXRZID0gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wJQ0ZXTF9FZGl0SW1wOjpVcGRhdGVPZmZzZXQoSUZXTF9TY3JvbGxCYXIgKnBTY3JvbGxCYXIsIEZYX0ZMT0FUIGZQb3NDaGFuZ2VkKQ0KLXsNCi0gICAgaWYgKHBTY3JvbGxCYXIgPT0gKElGV0xfU2Nyb2xsQmFyKiltX3BIb3J6U2Nyb2xsQmFyKSB7DQotICAgICAgICBtX2ZTY3JvbGxPZmZzZXRYICs9IGZQb3NDaGFuZ2VkOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSArPSBmUG9zQ2hhbmdlZDsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDRldMX0VkaXRJbXA6OlVwZGF0ZVZBbGlnbm1lbnQoKQ0KLXsNCi0gICAgSUZERV9UeHRFZHRQYWdlICpwUGFnZSA9IG1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUGFnZSk7DQotICAgIGNvbnN0IENGWF9SZWN0RiYgcnRGREUgPSBwUGFnZS0+R2V0Q29udGVudHNCb3goKTsNCi0gICAgRlhfRkxPQVQgZk9mZnNldFkgPSAwLjBmOw0KLSAgICBGWF9GTE9BVCBmU3BhY2VBYm92ZSA9IDAuMGY7DQotICAgIEZYX0ZMT0FUIGZTcGFjZUJlbG93ID0gMC4wZjsNCi0gICAgQ0ZYX1NpemVGKiBwU3BhY2UgPSAoQ0ZYX1NpemVGKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TcGFjZUFib3ZlQmVsb3cpOw0KLSAgICBpZiAocFNwYWNlKSB7DQotICAgICAgICBmU3BhY2VBYm92ZSA9IHBTcGFjZS0+eDsNCi0gICAgICAgIGZTcGFjZUJlbG93ID0gcFNwYWNlLT55Ow0KLSAgICB9DQotICAgIGlmIChmU3BhY2VBYm92ZSA8IDAuMWYpIHsNCi0gICAgICAgIGZTcGFjZUFib3ZlID0gMDsNCi0gICAgfQ0KLSAgICBpZiAoZlNwYWNlQmVsb3cgPCAwLjFmKSB7DQotICAgICAgICBmU3BhY2VCZWxvdyA9IDA7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZDZW50ZXIpIHsNCi0gICAgICAgIGZPZmZzZXRZID0gKG1fcnRFbmdpbmUuaGVpZ2h0IC0gcnRGREUuaGVpZ2h0KSAvIDI7DQotICAgICAgICBpZiAoZk9mZnNldFkgPCAoZlNwYWNlQWJvdmUgKyBmU3BhY2VCZWxvdykgLyAyICYmIGZTcGFjZUFib3ZlIDwgZlNwYWNlQmVsb3cpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBmT2Zmc2V0WSArPSAoZlNwYWNlQWJvdmUgLSBmU3BhY2VCZWxvdykgLyAyOw0KLSAgICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZGYXIpIHsNCi0gICAgICAgIGZPZmZzZXRZID0gKG1fcnRFbmdpbmUuaGVpZ2h0IC0gcnRGREUuaGVpZ2h0KTsNCi0gICAgICAgIGZPZmZzZXRZIC09IGZTcGFjZUJlbG93Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZk9mZnNldFkgKz0gZlNwYWNlQWJvdmU7DQotICAgIH0NCi0gICAgbV9mVkFsaWduT2Zmc2V0ID0gZk9mZnNldFk7DQotICAgIGlmIChtX2ZWQWxpZ25PZmZzZXQgPCAwKSB7DQotICAgICAgICBtX2ZWQWxpZ25PZmZzZXQgPSAwOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVDYXJldCgpDQotew0KLSAgICBDRlhfUmVjdEYgcnRGREU7DQotICAgIG1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRSZWN0KHJ0RkRFKTsNCi0gICAgcnRGREUuT2Zmc2V0KG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFgsIG1fcnRFbmdpbmUudG9wIC0gbV9mU2Nyb2xsT2Zmc2V0WSArIG1fZlZBbGlnbk9mZnNldCk7DQotICAgIENGWF9SZWN0RiBydENhcmV0Ow0KLSAgICBydENhcmV0LlNldChydEZERS5sZWZ0LCBydEZERS50b3AsIHJ0RkRFLndpZHRoLCBydEZERS5oZWlnaHQpOw0KLSAgICBDRlhfUmVjdEYgdGVtcCA9IHJ0Q2FyZXQ7DQotICAgIENGWF9SZWN0RiBydENsaWVudDsNCi0gICAgR2V0Q2xpZW50UmVjdChydENsaWVudCk7DQotICAgIHJ0Q2FyZXQuSW50ZXJzZWN0KHJ0Q2xpZW50KTsNCi0gICAgaWYgKHJ0Q2FyZXQubGVmdCA+IHJ0Q2xpZW50LnJpZ2h0KCkpIHsNCi0gICAgICAgIEZYX0ZMT0FUIHJpZ2h0ID0gcnRDYXJldC5yaWdodCgpOw0KLSAgICAgICAgcnRDYXJldC5sZWZ0ID0gcnRDbGllbnQucmlnaHQoKSAtIDE7DQotICAgICAgICBydENhcmV0LndpZHRoID0gcmlnaHQgLSBydENhcmV0LmxlZnQ7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiSW50ZXJzZWN0ID0gIXJ0Q2FyZXQuSXNFbXB0eSgpOw0KLSAgICBGWF9CT09MIGJTaG93ID0gVFJVRTsNCi0gICAgRlhfQk9PTCBiU2hvd1dob2xlID0gRkFMU0U7DQotICAgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgfHwgIWJJbnRlcnNlY3QpIHsNCi0gICAgICAgIGJTaG93ID0gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0hTZWxmQWRhcHRpb24gJiYgdGVtcC5yaWdodCgpID4gbV9ydEVuZ2luZS5yaWdodCgpKSB7DQotICAgICAgICBiU2hvd1dob2xlID0gVFJVRTsNCi0gICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbiAmJiB0ZW1wLmJvdHRvbSgpID4gbV9ydEVuZ2luZS5ib3R0b20oKSkgew0KLSAgICAgICAgYlNob3dXaG9sZSA9IFRSVUU7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBiU2hvdyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQgJiYgYkludGVyc2VjdCk7DQotICAgIH0NCi0gICAgaWYgKGJTaG93V2hvbGUpIHsNCi0gICAgICAgIHJ0Q2FyZXQgPSB0ZW1wOw0KLSAgICB9DQotICAgIFNob3dDYXJldChiU2hvdywgJnJ0Q2FyZXQpOw0KLX0NCi1JRldMX1Njcm9sbEJhciogQ0ZXTF9FZGl0SW1wOjpVcGRhdGVTY3JvbGwoKQ0KLXsNCi0gICAgRlhfQk9PTCBiU2hvd0hvcnogPSBtX3BIb3J6U2Nyb2xsQmFyICYmICgobV9wSG9yelNjcm9sbEJhci0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSA9PSAwKTsNCi0gICAgRlhfQk9PTCBiU2hvd1ZlcnQgPSBtX3BWZXJ0U2Nyb2xsQmFyICYmICgobV9wVmVydFNjcm9sbEJhci0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSA9PSAwKTsNCi0gICAgaWYgKCFiU2hvd0hvcnogJiYgIWJTaG93VmVydCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgSUZERV9UeHRFZHRQYWdlICpwUGFnZSA9IG1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFnZSwgTlVMTCk7DQotICAgIGNvbnN0IENGWF9SZWN0RiAmcnRGREUgPSBwUGFnZS0+R2V0Q29udGVudHNCb3goKTsNCi0gICAgSUZXTF9TY3JvbGxCYXIgKnBSZXBhaW50ID0gTlVMTDsNCi0gICAgaWYgKGJTaG93SG9yeikgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0U2Nyb2xsOw0KLSAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdChydFNjcm9sbCk7DQotICAgICAgICBpZiAocnRTY3JvbGwud2lkdGggPCBydEZERS53aWR0aCkgew0KLSAgICAgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPkxvY2tVcGRhdGUoKTsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmUmFuZ2UgPSBydEZERS53aWR0aCAtIHJ0U2Nyb2xsLndpZHRoOw0KLSAgICAgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFJhbmdlKDAuMGYsIGZSYW5nZSk7DQotICAgICAgICAgICAgRlhfRkxPQVQgZlBvcyA9IG1fZlNjcm9sbE9mZnNldFg7DQotICAgICAgICAgICAgaWYgKGZQb3MgPCAwLjBmKSB7DQotICAgICAgICAgICAgICAgIGZQb3MgPSAwLjBmOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZlBvcyA+IGZSYW5nZSkgew0KLSAgICAgICAgICAgICAgICBmUG9zID0gZlJhbmdlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRQb3MoZlBvcyk7DQotICAgICAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0VHJhY2tQb3MoZlBvcyk7DQotICAgICAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UGFnZVNpemUocnRTY3JvbGwud2lkdGgpOw0KLSAgICAgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0ZXBTaXplKHJ0U2Nyb2xsLndpZHRoIC8gMTApOw0KLSAgICAgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfRGlzYWJsZWQsIEZBTFNFKTsNCi0gICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5VbmxvY2tVcGRhdGUoKTsNCi0gICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCi0gICAgICAgICAgICBwUmVwYWludCA9IChJRldMX1Njcm9sbEJhciopbV9wSG9yelNjcm9sbEJhcjsNCi0gICAgICAgIH0gZWxzZSBpZiAoKG1fcEhvcnpTY3JvbGxCYXItPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA9PSAwKSB7DQotICAgICAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+TG9ja1VwZGF0ZSgpOw0KLSAgICAgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFJhbmdlKDAsIC0xKTsNCi0gICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0Rpc2FibGVkLCBUUlVFKTsNCi0gICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5VbmxvY2tVcGRhdGUoKTsNCi0gICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCi0gICAgICAgICAgICBwUmVwYWludCA9IChJRldMX1Njcm9sbEJhciopbV9wSG9yelNjcm9sbEJhcjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoYlNob3dWZXJ0KSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRTY3JvbGw7DQotICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJ0U2Nyb2xsKTsNCi0gICAgICAgIGlmIChydFNjcm9sbC5oZWlnaHQgPCBydEZERS5oZWlnaHQpIHsNCi0gICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5Mb2NrVXBkYXRlKCk7DQotICAgICAgICAgICAgRlhfRkxPQVQgZlN0ZXAgPSBtX3BFZHRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKS0+ZkxpbmVTcGFjZTsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmUmFuZ2UgPSBydEZERS5oZWlnaHQgLSBtX3J0RW5naW5lLmhlaWdodDsNCi0gICAgICAgICAgICBpZiAoZlJhbmdlIDwgZlN0ZXApIHsNCi0gICAgICAgICAgICAgICAgZlJhbmdlID0gZlN0ZXA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFJhbmdlKDAuMGYsIGZSYW5nZSk7DQotICAgICAgICAgICAgRlhfRkxPQVQgZlBvcyA9IG1fZlNjcm9sbE9mZnNldFk7DQotICAgICAgICAgICAgaWYgKGZQb3MgPCAwLjBmKSB7DQotICAgICAgICAgICAgICAgIGZQb3MgPSAwLjBmOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZlBvcyA+IGZSYW5nZSkgew0KLSAgICAgICAgICAgICAgICBmUG9zID0gZlJhbmdlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRQb3MoZlBvcyk7DQotICAgICAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0VHJhY2tQb3MoZlBvcyk7DQotICAgICAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UGFnZVNpemUocnRTY3JvbGwuaGVpZ2h0KTsNCi0gICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGVwU2l6ZShmU3RlcCk7DQotICAgICAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9EaXNhYmxlZCwgRkFMU0UpOw0KLSAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlVubG9ja1VwZGF0ZSgpOw0KLSAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlVwZGF0ZSgpOw0KLSAgICAgICAgICAgIHBSZXBhaW50ID0gKElGV0xfU2Nyb2xsQmFyKiltX3BWZXJ0U2Nyb2xsQmFyOw0KLSAgICAgICAgfSBlbHNlIGlmICgobV9wVmVydFNjcm9sbEJhci0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpID09IDApIHsNCi0gICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5Mb2NrVXBkYXRlKCk7DQotICAgICAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UmFuZ2UoMCwgLTEpOw0KLSAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfRGlzYWJsZWQsIFRSVUUpOw0KLSAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlVubG9ja1VwZGF0ZSgpOw0KLSAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlVwZGF0ZSgpOw0KLSAgICAgICAgICAgIHBSZXBhaW50ID0gKElGV0xfU2Nyb2xsQmFyKiltX3BWZXJ0U2Nyb2xsQmFyOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBwUmVwYWludDsNCi19DQotRlhfQk9PTAlDRldMX0VkaXRJbXA6OklzU2hvd1Njcm9sbEJhcihGWF9CT09MIGJWZXJ0KQ0KLXsNCi0gICAgRlhfQk9PTCBiU2hvdyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMpID8gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gRldMX1dHVFNUQVRFX0ZvY3VzZWQgOiBUUlVFOw0KLSAgICBpZiAoYlZlcnQpIHsNCi0gICAgICAgIHJldHVybiBiU2hvdyAmJiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9WU2Nyb2xsKSAmJg0KLSAgICAgICAgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUpICYmIElzQ29udGVudEhlaWdodE92ZXJmbG93KCk7DQotICAgIH0NCi0gICAgcmV0dXJuICBiU2hvdyAmJiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9IU2Nyb2xsKSAmJiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTXVsdGlMaW5lKTsNCi19DQotRlhfQk9PTAlDRldMX0VkaXRJbXA6OklzQ29udGVudEhlaWdodE92ZXJmbG93KCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wRWR0RW5naW5lLCBGQUxTRSk7DQotICAgIElGREVfVHh0RWR0UGFnZSAqcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OlVwZGF0ZU9mZnNldCgpIHsNCisgIENGWF9SZWN0RiBydENhcmV0Ow0KKyAgbV9wRWR0RW5naW5lLT5HZXRDYXJldFJlY3QocnRDYXJldCk7DQorICBGWF9GTE9BVCBmT2ZmU2V0WCA9IG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFg7DQorICBGWF9GTE9BVCBmT2ZmU2V0WSA9IG1fcnRFbmdpbmUudG9wIC0gbV9mU2Nyb2xsT2Zmc2V0WSArIG1fZlZBbGlnbk9mZnNldDsNCisgIHJ0Q2FyZXQuT2Zmc2V0KGZPZmZTZXRYLCBmT2ZmU2V0WSk7DQorICBjb25zdCBDRlhfUmVjdEYmIHJ0RWlkdCA9IG1fcnRFbmdpbmU7DQorICBpZiAocnRFaWR0LkNvbnRhaW5zKHJ0Q2FyZXQpKSB7DQorICAgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQogICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhZ2UsIEZBTFNFKTsNCi0gICAgcmV0dXJuIHBQYWdlLT5HZXRDb250ZW50c0JveCgpLmhlaWdodCA+IG1fcnRFbmdpbmUuaGVpZ2h0ICsgMS4wZjsNCi19DQotaW50MzJfdCBDRldMX0VkaXRJbXA6OkFkZERvUmVjb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkNCi17DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9SZWNvcmRBcnIuR2V0U2l6ZSgpOw0KLSAgICBpZiAobV9pQ3VyUmVjb3JkID09IG5Db3VudCAtIDEpIHsNCi0gICAgICAgIGlmIChuQ291bnQgPT0gbV9pTWF4UmVjb3JkKSB7DQotICAgICAgICAgICAgbV9SZWNvcmRBcnIuUmVtb3ZlQXQoMCk7DQotICAgICAgICAgICAgbV9pQ3VyUmVjb3JkIC0tOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSBuQ291bnQgLSAxOyBpID4gbV9pQ3VyUmVjb3JkOyBpIC0tKSB7DQotICAgICAgICAgICAgbV9SZWNvcmRBcnIuUmVtb3ZlQXQoaSk7DQotICAgICAgICB9DQorICAgIENGWF9SZWN0RiBydEZERSA9IHBQYWdlLT5HZXRDb250ZW50c0JveCgpOw0KKyAgICBydEZERS5PZmZzZXQoZk9mZlNldFgsIGZPZmZTZXRZKTsNCisgICAgaWYgKHJ0RkRFLnJpZ2h0KCkgPCBydEVpZHQucmlnaHQoKSAmJiBtX2ZTY3JvbGxPZmZzZXRYID4gMCkgew0KKyAgICAgIG1fZlNjcm9sbE9mZnNldFggKz0gcnRGREUucmlnaHQoKSAtIHJ0RWlkdC5yaWdodCgpOw0KKyAgICAgIGlmIChtX2ZTY3JvbGxPZmZzZXRYIDwgMCkgew0KKyAgICAgICAgbV9mU2Nyb2xsT2Zmc2V0WCA9IDA7DQorICAgICAgfQ0KICAgICB9DQotICAgIG1fUmVjb3JkQXJyLkFkZChic0RvUmVjb3JkKTsNCi0gICAgcmV0dXJuIG1faUN1clJlY29yZCA9IG1fUmVjb3JkQXJyLkdldFNpemUoKSAtIDE7DQotfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wOjpMYXlvdXQoKQ0KLXsNCi0gICAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCi0gICAgbV9ydEVuZ2luZSA9IG1fcnRDbGllbnQ7DQotICAgIEZYX0ZMT0FUICpwZldpZHRoID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocGZXaWR0aCk7DQotICAgIEZYX0ZMT0FUIGZXaWR0aCA9ICpwZldpZHRoOw0KLSAgICBpZiAoIW1fcE91dGVyKSB7DQotICAgICAgICBDRlhfUmVjdEYqIHBVSU1hcmdpbiA9IChDRlhfUmVjdEYqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1VJTWFyZ2luKTsNCi0gICAgICAgIGlmIChwVUlNYXJnaW4pIHsNCi0gICAgICAgICAgICBtX3J0RW5naW5lLkRlZmxhdGUocFVJTWFyZ2luLT5sZWZ0LCBwVUlNYXJnaW4tPnRvcCwgcFVJTWFyZ2luLT53aWR0aCwgcFVJTWFyZ2luLT5oZWlnaHQpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKG1fcE91dGVyLT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9EYXRlVGltZVBpY2tlcikgew0KLSAgICAgICAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsNCi0gICAgICAgIHBhcnQubV9wV2lkZ2V0ID0gbV9wT3V0ZXI7DQotICAgICAgICBDRlhfUmVjdEYqIHBVSU1hcmdpbiA9IChDRlhfUmVjdEYqKW1fcE91dGVyLT5HZXRUaGVtZVByb3ZpZGVyKCktPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW4pOw0KLSAgICAgICAgaWYgKHBVSU1hcmdpbikgew0KLSAgICAgICAgICAgIG1fcnRFbmdpbmUuRGVmbGF0ZShwVUlNYXJnaW4tPmxlZnQsIHBVSU1hcmdpbi0+dG9wLCBwVUlNYXJnaW4tPndpZHRoLCBwVUlNYXJnaW4tPmhlaWdodCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgRlhfQk9PTCBiU2hvd1ZlcnRTY3JvbGxiYXIgPSBJc1Nob3dTY3JvbGxCYXIoVFJVRSk7DQotICAgIEZYX0JPT0wgYlNob3dIb3J6U2Nyb2xsYmFyID0gSXNTaG93U2Nyb2xsQmFyKEZBTFNFKTsNCi0gICAgaWYgKGJTaG93VmVydFNjcm9sbGJhcikgew0KLSAgICAgICAgSW5pdFNjcm9sbEJhcigpOw0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0VmVydFNjcjsNCi0gICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KLSAgICAgICAgICAgIHJ0VmVydFNjci5TZXQobV9ydENsaWVudC5yaWdodCgpICsgRldMX0VESVRfTWFyZ2luLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC50b3AsIGZXaWR0aCwgbV9ydENsaWVudC5oZWlnaHQpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBydFZlcnRTY3IuU2V0KG1fcnRDbGllbnQucmlnaHQoKSAtIGZXaWR0aCwgbV9ydENsaWVudC50b3AsIGZXaWR0aCwgbV9ydENsaWVudC5oZWlnaHQpOw0KLSAgICAgICAgICAgIGlmIChiU2hvd0hvcnpTY3JvbGxiYXIpIHsNCi0gICAgICAgICAgICAgICAgcnRWZXJ0U2NyLmhlaWdodCAtPSBmV2lkdGg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fcnRFbmdpbmUud2lkdGggLT0gZldpZHRoOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0V2lkZ2V0UmVjdChydFZlcnRTY3IpOw0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIEZBTFNFKTsNCi0gICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlVwZGF0ZSgpOw0KLSAgICB9IGVsc2UgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCi0gICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCi0gICAgfQ0KLSAgICBpZiAoYlNob3dIb3J6U2Nyb2xsYmFyKSB7DQotICAgICAgICBJbml0U2Nyb2xsQmFyKEZBTFNFKTsNCi0gICAgICAgIENGWF9SZWN0RiBydEhvcmlTY3I7DQotICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXIpIHsNCi0gICAgICAgICAgICBydEhvcmlTY3IuU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC5ib3R0b20oKSArIEZXTF9FRElUX01hcmdpbiwgbV9ydENsaWVudC53aWR0aCwgZldpZHRoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcnRIb3JpU2NyLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQuYm90dG9tKCkgLSBmV2lkdGgsIG1fcnRDbGllbnQud2lkdGgsIGZXaWR0aCk7DQotICAgICAgICAgICAgaWYgKGJTaG93VmVydFNjcm9sbGJhcikgew0KLSAgICAgICAgICAgICAgICBydEhvcmlTY3Iud2lkdGggLT0gZldpZHRoOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX3J0RW5naW5lLmhlaWdodCAtPSBmV2lkdGg7DQotICAgICAgICB9DQotICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRXaWRnZXRSZWN0KHJ0SG9yaVNjcik7DQotICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgRkFMU0UpOw0KLSAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+VXBkYXRlKCk7DQotICAgIH0gZWxzZSBpZiAobV9wSG9yelNjcm9sbEJhcikgew0KLSAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wOjpMYXlvdXRTY3JvbGxCYXIoKQ0KLXsNCi0gICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMpID09IDApIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCogcGZXaWR0aCA9IE5VTEw7DQotICAgIEZYX0JPT0wgYlNob3dWZXJ0U2Nyb2xsYmFyID0gSXNTaG93U2Nyb2xsQmFyKFRSVUUpOw0KLSAgICBGWF9CT09MIGJTaG93SG9yelNjcm9sbGJhciA9IElzU2hvd1Njcm9sbEJhcihGQUxTRSk7DQotICAgIGlmIChiU2hvd1ZlcnRTY3JvbGxiYXIpIHsNCi0gICAgICAgIGlmICghbV9wVmVydFNjcm9sbEJhcikgew0KLSAgICAgICAgICAgIHBmV2lkdGggPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKTsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGggPSBwZldpZHRoID8gKnBmV2lkdGggOiAwOw0KLSAgICAgICAgICAgIEluaXRTY3JvbGxCYXIoKTsNCi0gICAgICAgICAgICBDRlhfUmVjdEYgcnRWZXJ0U2NyOw0KLSAgICAgICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KLSAgICAgICAgICAgICAgICBydFZlcnRTY3IuU2V0KG1fcnRDbGllbnQucmlnaHQoKSArIEZXTF9FRElUX01hcmdpbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LnRvcCwgZldpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcnRWZXJ0U2NyLlNldChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBmV2lkdGgsIG1fcnRDbGllbnQudG9wLCBmV2lkdGgsIG1fcnRDbGllbnQuaGVpZ2h0KTsNCi0gICAgICAgICAgICAgICAgaWYgKGJTaG93SG9yelNjcm9sbGJhcikgew0KLSAgICAgICAgICAgICAgICAgICAgcnRWZXJ0U2NyLmhlaWdodCAtPSBmV2lkdGg7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0V2lkZ2V0UmVjdChydFZlcnRTY3IpOw0KLSAgICAgICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlVwZGF0ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIEZBTFNFKTsNCi0gICAgfSBlbHNlIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQotICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQotICAgIH0NCi0gICAgaWYgKGJTaG93SG9yelNjcm9sbGJhcikgew0KLSAgICAgICAgaWYgKCFtX3BIb3J6U2Nyb2xsQmFyKSB7DQotICAgICAgICAgICAgcGZXaWR0aCA9ICFwZldpZHRoID8gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCkgOiBwZldpZHRoOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBmV2lkdGggPyAqcGZXaWR0aCA6IDA7DQotICAgICAgICAgICAgSW5pdFNjcm9sbEJhcihGQUxTRSk7DQotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0SG9yaVNjcjsNCi0gICAgICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXIpIHsNCi0gICAgICAgICAgICAgICAgcnRIb3JpU2NyLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQuYm90dG9tKCkgKyBGV0xfRURJVF9NYXJnaW4sIG1fcnRDbGllbnQud2lkdGgsIGZXaWR0aCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcnRIb3JpU2NyLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQuYm90dG9tKCkgLSBmV2lkdGgsIG1fcnRDbGllbnQud2lkdGgsIGZXaWR0aCk7DQotICAgICAgICAgICAgICAgIGlmIChiU2hvd1ZlcnRTY3JvbGxiYXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJ0SG9yaVNjci53aWR0aCAtPSAoZldpZHRoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRXaWRnZXRSZWN0KHJ0SG9yaVNjcik7DQotICAgICAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+VXBkYXRlKCk7DQotICAgICAgICB9DQotICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgRkFMU0UpOw0KLSAgICB9IGVsc2UgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCi0gICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCi0gICAgfQ0KLSAgICBpZiAoYlNob3dWZXJ0U2Nyb2xsYmFyIHx8IGJTaG93SG9yelNjcm9sbGJhcikgew0KLSAgICAgICAgVXBkYXRlU2Nyb2xsKCk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0VkaXRJbXA6OkRldmljZVRvRW5naW5lKENGWF9Qb2ludEYgJnB0KQ0KLXsNCi0gICAgcHQueCArPSAtbV9ydEVuZ2luZS5sZWZ0ICsgbV9mU2Nyb2xsT2Zmc2V0WDsNCi0gICAgcHQueSArPSAtbV9ydEVuZ2luZS50b3AgLSBtX2ZWQWxpZ25PZmZzZXQgKyBtX2ZTY3JvbGxPZmZzZXRZOw0KLX0NCi12b2lkIENGV0xfRWRpdEltcDo6SW5pdFNjcm9sbEJhcihGWF9CT09MIGJWZXJ0ICkNCi17DQotICAgIGlmICgoYlZlcnQgJiYgbV9wVmVydFNjcm9sbEJhcikgfHwgKCFiVmVydCAmJiBtX3BIb3J6U2Nyb2xsQmFyKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KLSAgICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBiVmVydCA/IEZXTF9TVFlMRUVYVF9TQ0JfVmVydCA6IEZXTF9TVFlMRUVYVF9TQ0JfSG9yejsNCi0gICAgcHJvcC5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0Rpc2FibGVkIHwgRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCi0gICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHByb3AubV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgIElGV0xfU2Nyb2xsQmFyICpwU2Nyb2xsQmFyID0gSUZXTF9TY3JvbGxCYXI6OkNyZWF0ZSgpOw0KLSAgICBwU2Nyb2xsQmFyLT5Jbml0aWFsaXplKHByb3AsIG1fcEludGVyZmFjZSk7DQotICAgIGJWZXJ0ID8gKG1fcFZlcnRTY3JvbGxCYXIgPSBwU2Nyb2xsQmFyKSA6IChtX3BIb3J6U2Nyb2xsQmFyID0gcFNjcm9sbEJhcik7DQotfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wOjpJbml0RW5naW5lKCkNCi17DQotICAgIGlmIChtX3BFZHRFbmdpbmUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBtX3BFZHRFbmdpbmUgPSBJRkRFX1R4dEVkdEVuZ2luZTo6Q3JlYXRlKCk7DQotfQ0KLWV4dGVybiAJRlhfQk9PTAlGV0xfU2hvd0NhcmV0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDRlhfUmVjdEYgKnBSdEFuY2hvcik7DQotdm9pZCBDRldMX0VkaXRJbXA6OlNob3dDYXJldChGWF9CT09MIGJWaXNpYmxlLCBDRlhfUmVjdEYgKnBSZWN0ICkNCi17DQotICAgIGlmIChtX3BDYXJldCkgew0KLSAgICAgICAgbV9wQ2FyZXQtPlNob3dDYXJldChiVmlzaWJsZSk7DQotICAgICAgICBpZiAoYlZpc2libGUgJiYgIXBSZWN0LT5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBtX3BDYXJldC0+U2V0V2lkZ2V0UmVjdCgqcFJlY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgUmVwYWludCgmbV9ydEVuZ2luZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBJRldMX1dpZGdldCAqcE91dGVyID0gKElGV0xfV2lkZ2V0KiltX3BJbnRlcmZhY2U7DQotICAgICAgICBpZiAoYlZpc2libGUpIHsNCi0gICAgICAgICAgICBwUmVjdC0+T2Zmc2V0KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3ApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2hpbGUgKHBPdXRlci0+R2V0T3V0ZXIoKSkgew0KLSAgICAgICAgICAgIHBPdXRlciA9IHBPdXRlci0+R2V0T3V0ZXIoKTsNCi0gICAgICAgICAgICBpZiAoYlZpc2libGUpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0T3V0ZXI7DQotICAgICAgICAgICAgICAgIHBPdXRlci0+R2V0V2lkZ2V0UmVjdChydE91dGVyKTsNCi0gICAgICAgICAgICAgICAgcFJlY3QtPk9mZnNldChydE91dGVyLmxlZnQsIHJ0T3V0ZXIudG9wKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBGV0xfU2hvd0NhcmV0KHBPdXRlciwgYlZpc2libGUsIHBSZWN0KTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MCUNGV0xfRWRpdEltcDo6VmFsaWRhdGVOdW1iZXJDaGFyKEZYX1dDSEFSIGNOdW0pDQotew0KLSAgICBpZiAoIW1fcEVkdEVuZ2luZSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmICghbV9iU2V0UmFuZ2UpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzT2xkLCB3c1RleHQ7DQotICAgIG1fcEVkdEVuZ2luZS0+R2V0VGV4dCh3c1RleHQsIDApOw0KLSAgICBpZiAod3NUZXh0LklzRW1wdHkoKSkgew0KLSAgICAgICAgaWYgKGNOdW0gPT0gTCcwJykgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIGludDMyX3QgY2FyZXRQb3MgPSBtX3BFZHRFbmdpbmUtPkdldENhcmV0UG9zKCk7DQotICAgIGludDMyX3QgaVNlbCA9CUNvdW50U2VsUmFuZ2VzKCk7DQotICAgIGlmIChpU2VsID09IDApIHsNCi0gICAgICAgIGlmIChjTnVtID09IEwnMCcgJiYgY2FyZXRQb3MgPT0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgbkxlbiA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIGwgPSB3c1RleHQuTWlkKDAsIGNhcmV0UG9zKTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHIgPSB3c1RleHQuTWlkKGNhcmV0UG9zLCBuTGVuIC0gY2FyZXRQb3MpOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXcgPSBsICsgY051bSArIHI7DQotICAgICAgICBpZiAod3NOZXcuR2V0SW50ZWdlcigpIDw9IG1faU1heCkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKHdzVGV4dC5HZXRJbnRlZ2VyKCkgPD0gbV9pTWF4KSB7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQorICAgIGlmIChydEZERS5ib3R0b20oKSA8IHJ0RWlkdC5ib3R0b20oKSAmJiBtX2ZTY3JvbGxPZmZzZXRZID4gMCkgew0KKyAgICAgIG1fZlNjcm9sbE9mZnNldFkgKz0gcnRGREUuYm90dG9tKCkgLSBydEVpZHQuYm90dG9tKCk7DQorICAgICAgaWYgKG1fZlNjcm9sbE9mZnNldFkgPCAwKSB7DQorICAgICAgICBtX2ZTY3JvbGxPZmZzZXRZID0gMDsNCisgICAgICB9DQogICAgIH0NCiAgICAgcmV0dXJuIEZBTFNFOw0KLX0NCi12b2lkIENGV0xfRWRpdEltcDo6SW5pdENhcmV0KCkNCi17DQotICAgIGlmICghbV9wQ2FyZXQpIHsNCi0gICAgICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfSW5uZXJDYXJldCkpIHsNCi0gICAgICAgICAgICBtX3BDYXJldCA9IElGV0xfQ2FyZXQ6OkNyZWF0ZSgpOw0KLSAgICAgICAgICAgIG1fcENhcmV0LT5Jbml0aWFsaXplKG1fcEludGVyZmFjZSk7DQotICAgICAgICAgICAgbV9wQ2FyZXQtPlNldFBhcmVudChtX3BJbnRlcmZhY2UpOw0KLSAgICAgICAgICAgIG1fcENhcmV0LT5TZXRTdGF0ZXMobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0lubmVyQ2FyZXQpID09IDApIHsNCi0gICAgICAgIG1fcENhcmV0LT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BDYXJldCA9IE5VTEw7DQorICB9IGVsc2Ugew0KKyAgICBGWF9GTE9BVCBvZmZzZXRYID0gMC4wOw0KKyAgICBGWF9GTE9BVCBvZmZzZXRZID0gMC4wOw0KKyAgICBpZiAocnRDYXJldC5sZWZ0IDwgcnRFaWR0LmxlZnQpIHsNCisgICAgICBvZmZzZXRYID0gcnRDYXJldC5sZWZ0IC0gcnRFaWR0LmxlZnQ7DQogICAgIH0NCi19DQotdm9pZCBDRldMX0VkaXRJbXA6OkNsZWFyUmVjb3JkKCkNCi17DQotICAgIG1faUN1clJlY29yZCA9IC0xOw0KLSAgICBtX1JlY29yZEFyci5SZW1vdmVBbGwoKTsNCi19DQotdm9pZCBDRldMX0VkaXRJbXA6OlByb2Nlc3NJbnNlcnRFcnJvcihpbnQzMl90IGlFcnJvcikNCi17DQotICAgIHN3aXRjaCAoaUVycm9yKSB7DQotICAgICAgICBjYXNlIC0yOiB7DQotICAgICAgICAgICAgICAgIENGV0xfRXZ0RWR0VGV4dEZ1bGwgdGV4dEZ1bGxFdmVudDsNCi0gICAgICAgICAgICAgICAgdGV4dEZ1bGxFdmVudC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICAgICAgICAgIERpc3BhdGNoRXZlbnQoJnRleHRGdWxsRXZlbnQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgfQ0KKyAgICBpZiAocnRDYXJldC5yaWdodCgpID4gcnRFaWR0LnJpZ2h0KCkpIHsNCisgICAgICBvZmZzZXRYID0gcnRDYXJldC5yaWdodCgpIC0gcnRFaWR0LnJpZ2h0KCk7DQogICAgIH0NCi19DQotQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6OkNGV0xfRWRpdEltcERlbGVnYXRlKENGV0xfRWRpdEltcCAqcE93bmVyKQ0KLSAgICA6IG1fcE93bmVyKHBPd25lcikNCi17DQotfQ0KLWludDMyX3QgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KLSAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpbnQzMl90IGlSZXQgPSAxOw0KLSAgICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9BY3RpdmF0ZTogew0KLSAgICAgICAgICAgICAgICBEb0FjdGl2YXRlKChDRldMX01zZ0FjdGl2YXRlKilwTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfRGVhY3RpdmF0ZTogew0KLSAgICAgICAgICAgICAgICBEb0RlYWN0aXZhdGUoKENGV0xfTXNnRGVhY3RpdmF0ZSopcE1lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCi0gICAgICAgICAgICAgICAgT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCi0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KLSAgICAgICAgICAgICAgICBzd2l0Y2goZHdDbWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRibENsazogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkJ1dHRvbkRibENsayhwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VNb3ZlKHBNc2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRG93bjogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb0J1dHRvbkRvd24ocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9Nc2dLZXkgKnBLZXkgPSAoQ0ZXTF9Nc2dLZXkqKXBNZXNzYWdlOw0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NtZCA9IHBLZXktPm1fZHdDbWQ7DQotICAgICAgICAgICAgICAgIGlmIChkd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24pIHsNCi0gICAgICAgICAgICAgICAgICAgIE9uS2V5RG93bihwS2V5KTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0NoYXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIE9uQ2hhcihwS2V5KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIGlSZXQgPSAwOw0KLSAgICAgICAgICAgIH0NCisgICAgaWYgKHJ0Q2FyZXQudG9wIDwgcnRFaWR0LnRvcCkgew0KKyAgICAgIG9mZnNldFkgPSBydENhcmV0LnRvcCAtIHJ0RWlkdC50b3A7DQogICAgIH0NCi0gICAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQotICAgIHJldHVybiBpUmV0Ow0KLX0NCi1GV0xfRVJSIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBFdmVudCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAoZHdIYXNoQ29kZSAhPSBGV0xfRVZUSEFTSF9TY3JvbGwpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgICAgaWYgKHJ0Q2FyZXQuYm90dG9tKCkgPiBydEVpZHQuYm90dG9tKCkpIHsNCisgICAgICBvZmZzZXRZID0gcnRDYXJldC5ib3R0b20oKSAtIHJ0RWlkdC5ib3R0b20oKTsNCiAgICAgfQ0KLSAgICBJRldMX1dpZGdldCAqcFNyY1RhcmdldCA9IHBFdmVudC0+bV9wU3JjVGFyZ2V0Ow0KLSAgICBpZiAoKHBTcmNUYXJnZXQgPT0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wVmVydFNjcm9sbEJhciAmJiBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhcikgfHwgKHBTcmNUYXJnZXQgPT0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wSG9yelNjcm9sbEJhciAmJiBtX3BPd25lci0+bV9wSG9yelNjcm9sbEJhcikpIHsNCi0gICAgICAgIEZYX0RXT1JEIGR3U2Nyb2xsQ29kZSA9ICgoQ0ZXTF9FdnRTY3JvbGwqKXBFdmVudCktPm1faVNjcm9sbENvZGU7DQotICAgICAgICBGWF9GTE9BVCBmUG9zID0gKChDRldMX0V2dFNjcm9sbCopcEV2ZW50KS0+bV9mUG9zOw0KLSAgICAgICAgT25TY3JvbGwoKElGV0xfU2Nyb2xsQmFyKilwU3JjVGFyZ2V0LCBkd1Njcm9sbENvZGUsIGZQb3MpOw0KKyAgICBpZiAoIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uKSkgew0KKyAgICAgIG1fZlNjcm9sbE9mZnNldFggKz0gb2Zmc2V0WDsNCiAgICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KLX0NCi12b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpEb0FjdGl2YXRlKENGV0xfTXNnQWN0aXZhdGUgKnBNc2cpDQotew0KLSAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSB+RldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KLSAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KLX0NCi12b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpEb0RlYWN0aXZhdGUoQ0ZXTF9Nc2dEZWFjdGl2YXRlICpwTXNnKQ0KLXsNCi0gICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KLSAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KLX0NCi12b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpEb0J1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KLSAgICAgICAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KKyAgICBpZiAoIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WU2VsZkFkYXB0aW9uKSkgew0KKyAgICAgIG1fZlNjcm9sbE9mZnNldFkgKz0gb2Zmc2V0WTsNCiAgICAgfQ0KLSAgICBpZiAoIW1fcE93bmVyLT5tX3BFZHRFbmdpbmUpIHsNCi0gICAgICAgIG1fcE93bmVyLT5VcGRhdGVFZGl0RW5naW5lKCk7DQotICAgIH0NCi0gICAgSUZERV9UeHRFZHRQYWdlICpwUGFnZSA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFBhZ2UpOw0KLSAgICBDRlhfUG9pbnRGIHB0Ow0KLSAgICBwdC5TZXQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgIG1fcE93bmVyLT5EZXZpY2VUb0VuZ2luZShwdCk7DQotICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQotICAgIGludDMyX3QgbkluZGV4ID0gcFBhZ2UtPkdldENoYXJJbmRleChwdCwgYkJlZm9yZSk7DQotICAgIGlmIChuSW5kZXggPCAwKSB7DQotICAgICAgICBuSW5kZXggPSAwOw0KLSAgICB9DQotICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPlNldENhcmV0UG9zKG5JbmRleCwgYkJlZm9yZSk7DQotfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0KQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdTdHlsZUV4ID0gbV9wT3duZXItPkdldFN0eWxlc0V4KCk7DQotICAgIEZYX0JPT0wgYlJlcGFpbnQgPSBkd1N0eWxlRXggJiBGV0xfU1RZTEVFWFRfRURUX0lubmVyQ2FyZXQ7DQotICAgIGlmIChiU2V0KSB7DQotICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRm9jdXNlZDsNCi0gICAgICAgIGlmICghbV9wT3duZXItPm1fcEVkdEVuZ2luZSkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5VcGRhdGVFZGl0RW5naW5lKCk7DQotICAgICAgICB9DQotICAgICAgICBtX3BPd25lci0+VXBkYXRlVkFsaWdubWVudCgpOw0KLSAgICAgICAgbV9wT3duZXItPlVwZGF0ZU9mZnNldCgpOw0KLSAgICAgICAgbV9wT3duZXItPlVwZGF0ZUNhcmV0KCk7DQotICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KLSAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KLSAgICAgICAgbV9wT3duZXItPlNob3dDYXJldChGQUxTRSk7DQotICAgICAgICBpZiAobV9wT3duZXItPm1fcEVkdEVuZ2luZSAmJiAoZHdTdHlsZUV4ICYgRldMX1NUWUxFRVhUX0VEVF9Ob0hpZGVTZWwpID09IDApIHsNCi0gICAgICAgICAgICBpbnQzMl90IG5TZWwgPSBtX3BPd25lci0+Q291bnRTZWxSYW5nZXMoKTsNCi0gICAgICAgICAgICBpZiAoblNlbCA+IDApIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPkNsZWFyU2VsZWN0aW9ucygpOw0KLSAgICAgICAgICAgICAgICBiUmVwYWludCA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fcE93bmVyLT5TZXRDYXJldFBvcygwKTsNCi0gICAgICAgICAgICBtX3BPd25lci0+VXBkYXRlT2Zmc2V0KCk7DQotICAgICAgICB9DQotICAgICAgICBtX3BPd25lci0+Q2xlYXJSZWNvcmQoKTsNCi0gICAgfQ0KLSAgICBtX3BPd25lci0+TGF5b3V0U2Nyb2xsQmFyKCk7DQotICAgIGlmIChiUmVwYWludCkgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCi0gICAgICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBEb0N1cnNvcihwTXNnKTsNCi0gICAgaWYobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBUUlVFOw0KLSAgICBtX3BPd25lci0+U2V0R3JhYihUUlVFKTsNCi0gICAgRG9CdXR0b25Eb3duKHBNc2cpOw0KLSAgICBpbnQzMl90IG5JbmRleCA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkdldENhcmV0UG9zKCk7DQotICAgIEZYX0JPT0wgYlJlcGFpbnQgPSBGQUxTRTsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5Db3VudFNlbFJhbmdlcygpOw0KLSAgICBpZiAoaUNvdW50ID4gMCkgew0KLSAgICAgICAgbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+Q2xlYXJTZWxlY3Rpb24oKTsNCi0gICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJTaGlmdCA9IHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX1NoaWZ0Ow0KLSAgICBpZiAoYlNoaWZ0ICYmIG1fcE93bmVyLT5tX25TZWxTdGFydCAhPSBuSW5kZXgpIHsNCi0gICAgICAgIGludDMyX3QgaVN0YXJ0ID0gRlhfTUlOKG1fcE93bmVyLT5tX25TZWxTdGFydCwgbkluZGV4KTsNCi0gICAgICAgIGludDMyX3QgaUVuZCA9IEZYX01BWChtX3BPd25lci0+bV9uU2VsU3RhcnQsIG5JbmRleCk7DQotICAgICAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5BZGRTZWxSYW5nZShpU3RhcnQsIGlFbmQgLSBpU3RhcnQpOw0KLSAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wT3duZXItPm1fblNlbFN0YXJ0ID0gbkluZGV4Ow0KLSAgICB9DQotICAgIGlmIChiUmVwYWludCkgew0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0RW5naW5lKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbkxCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgRG9DdXJzb3IocE1zZyk7DQotICAgIG1fcE93bmVyLT5tX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KLSAgICBtX3BPd25lci0+U2V0R3JhYihGQUxTRSk7DQotfQ0KLXZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uQnV0dG9uRGJsQ2xrKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcE93bmVyLT5tX3BFZHRFbmdpbmUpOw0KLSAgICBEb0N1cnNvcihwTXNnKTsNCi0gICAgSUZERV9UeHRFZHRQYWdlICpwUGFnZSA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFBhZ2UpOw0KLSAgICBDRlhfUG9pbnRGIHB0Ow0KLSAgICBwdC5TZXQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgIG1fcE93bmVyLT5EZXZpY2VUb0VuZ2luZShwdCk7DQotICAgIGludDMyX3QgbkNvdW50ID0gMDsNCi0gICAgaW50MzJfdCBuSW5kZXggPSBwUGFnZS0+U2VsZWN0V29yZChwdCwgbkNvdW50KTsNCi0gICAgaWYgKG5JbmRleCA8IDApIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5BZGRTZWxSYW5nZShuSW5kZXgsIG5Db3VudCk7DQotICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPlNldENhcmV0UG9zKG5JbmRleCArIG5Db3VudCAtIDEsIEZBTFNFKTsNCi0gICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0RW5naW5lKTsNCi19DQotdm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wT3duZXItPm1fcEVkdEVuZ2luZSk7DQotICAgIERvQ3Vyc29yKHBNc2cpOw0KLSAgICBpZiAobV9wT3duZXItPm1fblNlbFN0YXJ0ID09IC0xIHx8ICFtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJRkRFX1R4dEVkdFBhZ2UgKnBQYWdlID0gbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUGFnZSk7DQotICAgIENGWF9Qb2ludEYgcHQ7DQotICAgIHB0LlNldChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgbV9wT3duZXItPkRldmljZVRvRW5naW5lKHB0KTsNCi0gICAgRlhfQk9PTCBiQmVmb3JlID0gVFJVRTsNCi0gICAgaW50MzJfdCBuSW5kZXggPSBwUGFnZS0+R2V0Q2hhckluZGV4KHB0LCBiQmVmb3JlKTsNCi0gICAgbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+U2V0Q2FyZXRQb3MobkluZGV4LCBiQmVmb3JlKTsNCi0gICAgbkluZGV4ID0gbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRQb3MoKTsNCi0gICAgbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+Q2xlYXJTZWxlY3Rpb24oKTsNCi0gICAgaWYgKG5JbmRleCAhPSBtX3BPd25lci0+bV9uU2VsU3RhcnQpIHsNCi0gICAgICAgIGludDMyX3QgbkxlbiA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkdldFRleHRMZW5ndGgoKTsNCi0gICAgICAgIGlmIChtX3BPd25lci0+bV9uU2VsU3RhcnQgPj0gbkxlbikgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5tX25TZWxTdGFydCA9IG5MZW47DQotICAgICAgICB9DQotICAgICAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5BZGRTZWxSYW5nZShGWF9NSU4obV9wT3duZXItPm1fblNlbFN0YXJ0LCBuSW5kZXgpLCBGWFNZU19hYnMobkluZGV4IC0gbV9wT3duZXItPm1fblNlbFN0YXJ0KSk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25LZXlEb3duKENGV0xfTXNnS2V5ICpwTXNnKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BPd25lci0+bV9wRWR0RW5naW5lKTsNCi0gICAgRkRFX1RYVEVEVE1PVkVDQVJFVCBNb3ZlQ2FyZXQgPSBNQ19Nb3ZlTm9uZTsNCi0gICAgRlhfQk9PTCBiU2hpZnQgPSBwTXNnLT5tX2R3RmxhZ3MgJiBGV0xfS0VZRkxBR19TaGlmdDsNCi0gICAgRlhfQk9PTCBiQ3RybCA9IHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmw7DQotICAgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBNc2ctPm1fZHdLZXlDb2RlOw0KLSAgICBzd2l0Y2ggKGR3S2V5Q29kZSkgew0KLSAgICAgICAgY2FzZSBGV0xfVktFWV9MZWZ0OiB7DQotICAgICAgICAgICAgICAgIE1vdmVDYXJldCA9IE1DX0xlZnQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6IHsNCi0gICAgICAgICAgICAgICAgTW92ZUNhcmV0ID0gTUNfUmlnaHQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfVXA6IHsNCi0gICAgICAgICAgICAgICAgTW92ZUNhcmV0ID0gTUNfVXA7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfRG93bjogew0KLSAgICAgICAgICAgICAgICBNb3ZlQ2FyZXQgPSBNQ19Eb3duOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9WS0VZX0hvbWU6IHsNCi0gICAgICAgICAgICAgICAgaWYgKGJDdHJsKSB7DQotICAgICAgICAgICAgICAgICAgICBNb3ZlQ2FyZXQgPSBNQ19Ib21lOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgTW92ZUNhcmV0ID0gTUNfTGluZVN0YXJ0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfRW5kOiB7DQotICAgICAgICAgICAgICAgIGlmIChiQ3RybCkgew0KLSAgICAgICAgICAgICAgICAgICAgTW92ZUNhcmV0ID0gTUNfRW5kOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgTW92ZUNhcmV0ID0gTUNfTGluZUVuZDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9WS0VZX0luc2VydDogew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9WS0VZX0RlbGV0ZTogew0KLSAgICAgICAgICAgICAgICBpZiAoCShtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpDQotICAgICAgICAgICAgICAgICAgICAgICAgfHwJKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRDYXJldFBvcygpOw0KLSNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkRlbGV0ZShuQ2FyZXQsIFRSVUUpOw0KLSNlbHNlDQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkRlbGV0ZShuQ2FyZXQpOw0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9WS0VZX0YyOiB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfVGFiOiB7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEtleUV2ZW50KHBNc2cpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotI2lmIChfRlhfT1NfPT1fRlhfTUFDT1NYXykNCi0gICAgICAgICAgICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0NvbW1hbmQpDQotI2Vsc2UNCi0gICAgICAgICAgICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmwpDQotI2VuZGlmDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChkd0tleUNvZGUgPT0gMHg0MyB8fCBkd0tleUNvZGUgPT0gMHg2Mykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5Eb0NsaXBib2FyZCgxKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAoZHdLZXlDb2RlID09IDB4NTggfHwgZHdLZXlDb2RlID09IDB4NzgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+RG9DbGlwYm9hcmQoMik7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGR3S2V5Q29kZSA9PSAweDU2IHx8IGR3S2V5Q29kZSA9PSAweDc2KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPkRvQ2xpcGJvYXJkKDMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoTW92ZUNhcmV0ICE9IE1DX01vdmVOb25lKSB7DQotICAgICAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5Nb3ZlQ2FyZXRQb3MoTW92ZUNhcmV0LCBiU2hpZnQsIGJDdHJsKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbkNoYXIoQ0ZXTF9Nc2dLZXkgKnBNc2cpDQotew0KLSAgICBpZiAoCShtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpDQotICAgICAgICAgICAgfHwJKCBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcE93bmVyLT5tX3BFZHRFbmdpbmUpOw0KLSAgICBpbnQzMl90IGlFcnJvciA9IDA7DQotICAgIEZYX1dDSEFSIGMgPSAoRlhfV0NIQVIpcE1zZy0+bV9kd0tleUNvZGU7DQotICAgIGludDMyX3QgbkNhcmV0ID0gbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRQb3MoKTsNCi0gICAgc3dpdGNoIChjKSB7DQotICAgICAgICBjYXNlIEZXTF9WS0VZX0JhY2s6IHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+RGVsZXRlKG5DYXJldCwgVFJVRSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgMHgwQTogew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9WS0VZX0VzY2FwZTogew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9WS0VZX1RhYjogew0KLSAgICAgICAgICAgICAgICBpRXJyb3IgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5JbnNlcnQobkNhcmV0LCBMIlx0IiwgMSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfUmV0dXJuOiB7DQotICAgICAgICAgICAgICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfV2FudFJldHVybikgew0KLSAgICAgICAgICAgICAgICAgICAgaUVycm9yID0gbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+SW5zZXJ0KG5DYXJldCwgTCJcbiIsIDEpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgaWYgKCFtX3BPd25lci0+bV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX051bWJlcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHBNc2ctPm1fZHdLZXlDb2RlIDwgRldMX1ZLRVlfMCkgJiYgKHBNc2ctPm1fZHdLZXlDb2RlICE9IDB4MkUgJiYgcE1zZy0+bV9kd0tleUNvZGUgIT0gMHgyRCkpIHx8IHBNc2ctPm1fZHdLZXlDb2RlID4gRldMX1ZLRVlfOSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3BPd25lci0+VmFsaWRhdGVOdW1iZXJDaGFyKGMpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQotICAgICAgICAgICAgICAgIGlmIChwTXNnLT5tX2R3RmxhZ3MgJiBGV0xfS0VZRkxBR19Db21tYW5kKQ0KLSNlbHNlDQotICAgICAgICAgICAgICAgIGlmIChwTXNnLT5tX2R3RmxhZ3MgJiBGV0xfS0VZRkxBR19DdHJsKQ0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpRXJyb3IgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5JbnNlcnQobkNhcmV0LCAmYywgMSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoaUVycm9yIDwgMCkgew0KLSAgICAgICAgbV9wT3duZXItPlByb2Nlc3NJbnNlcnRFcnJvcihpRXJyb3IpOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uU2Nyb2xsKElGV0xfU2Nyb2xsQmFyICpwU2Nyb2xsQmFyLCBGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MpDQotew0KLSAgICBDRlhfU2l6ZUYgZnM7DQotICAgIHBTY3JvbGxCYXItPkdldFJhbmdlKGZzLngsIGZzLnkpOw0KLSAgICBGWF9GTE9BVCBpQ3VyUG9zID0gcFNjcm9sbEJhci0+R2V0UG9zKCk7DQotICAgIEZYX0ZMT0FUIGZTdGVwID0gcFNjcm9sbEJhci0+R2V0U3RlcFNpemUoKTsNCi0gICAgc3dpdGNoIChkd0NvZGUpIHsNCi0gICAgICAgIGNhc2UgRldMX1NDQkNPREVfTWluOiB7DQotICAgICAgICAgICAgICAgIGZQb3MgPSBmcy54Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX01heDogew0KLSAgICAgICAgICAgICAgICBmUG9zID0gZnMueTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9TdGVwQmFja3dhcmQ6IHsNCi0gICAgICAgICAgICAgICAgZlBvcyAtPSBmU3RlcDsNCi0gICAgICAgICAgICAgICAgaWYgKGZQb3MgPCBmcy54ICsgZlN0ZXAgLyAyKSB7DQotICAgICAgICAgICAgICAgICAgICBmUG9zID0gZnMueDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1N0ZXBGb3J3YXJkOiB7DQotICAgICAgICAgICAgICAgIGZQb3MgKz0gZlN0ZXA7DQotICAgICAgICAgICAgICAgIGlmIChmUG9zID4gZnMueSAtIGZTdGVwIC8gMikgew0KLSAgICAgICAgICAgICAgICAgICAgZlBvcyA9IGZzLnk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9QYWdlQmFja3dhcmQ6IHsNCi0gICAgICAgICAgICAgICAgZlBvcyAtPSBwU2Nyb2xsQmFyLT5HZXRQYWdlU2l6ZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoZlBvcyA8IGZzLngpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZQb3MgPSBmcy54Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NDQkNPREVfUGFnZUZvcndhcmQ6IHsNCi0gICAgICAgICAgICAgICAgZlBvcyArPSBwU2Nyb2xsQmFyLT5HZXRQYWdlU2l6ZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoZlBvcyA+IGZzLnkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZQb3MgPSBmcy55Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NDQkNPREVfUG9zOg0KLSAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9UcmFja1Bvczogew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX0VuZFNjcm9sbDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoaUN1clBvcyAhPSBmUG9zKSB7DQotICAgICAgICBwU2Nyb2xsQmFyLT5TZXRQb3MoZlBvcyk7DQotICAgICAgICBwU2Nyb2xsQmFyLT5TZXRUcmFja1BvcyhmUG9zKTsNCi0gICAgICAgIG1fcE93bmVyLT5VcGRhdGVPZmZzZXQocFNjcm9sbEJhciwgZlBvcyAtIGlDdXJQb3MpOw0KLSAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BFZHRFbmdpbmUpIHsNCi0gICAgICAgICAgICBtX3BPd25lci0+VXBkYXRlQ2FyZXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9SZWN0RiByZWN0Ow0KLSAgICAgICAgbV9wT3duZXItPkdldFdpZGdldFJlY3QocmVjdCk7DQotICAgICAgICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlOw0KLSAgICAgICAgcnRJbnZhbGlkYXRlLlNldCgwLCAwLCByZWN0LndpZHRoICsgMiwgcmVjdC5oZWlnaHQgKyAyKTsNCi0gICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgICBpZiAobV9mRm9udFNpemUgPiBtX3J0RW5naW5lLmhlaWdodCkgew0KKyAgICAgIG1fZlNjcm9sbE9mZnNldFkgPSAwOw0KICAgICB9DQogICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KIH0NCi12b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpEb0N1cnNvcihDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKnBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KLSAgICAgICAgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyICpwQ3Vyc29yTWdyID0gcE5hdGl2ZS0+R2V0Q3Vyc29yTWdyKCk7DQotICAgICAgICBpZiAoTlVMTCAhPSBwQ3Vyc29yTWdyKSB7DQotICAgICAgICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9JbnB1dEJlYW0pOw0KLSAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCi0gICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KLSAgICAgICAgfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVPZmZzZXQoSUZXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9zQ2hhbmdlZCkgew0KKyAgaWYgKHBTY3JvbGxCYXIgPT0gKElGV0xfU2Nyb2xsQmFyKiltX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgIG1fZlNjcm9sbE9mZnNldFggKz0gZlBvc0NoYW5nZWQ7DQorICB9IGVsc2Ugew0KKyAgICBtX2ZTY3JvbGxPZmZzZXRZICs9IGZQb3NDaGFuZ2VkOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVWQWxpZ25tZW50KCkgew0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFBhZ2UpOw0KKyAgY29uc3QgQ0ZYX1JlY3RGJiBydEZERSA9IHBQYWdlLT5HZXRDb250ZW50c0JveCgpOw0KKyAgRlhfRkxPQVQgZk9mZnNldFkgPSAwLjBmOw0KKyAgRlhfRkxPQVQgZlNwYWNlQWJvdmUgPSAwLjBmOw0KKyAgRlhfRkxPQVQgZlNwYWNlQmVsb3cgPSAwLjBmOw0KKyAgQ0ZYX1NpemVGKiBwU3BhY2UgPQ0KKyAgICAgIChDRlhfU2l6ZUYqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1NwYWNlQWJvdmVCZWxvdyk7DQorICBpZiAocFNwYWNlKSB7DQorICAgIGZTcGFjZUFib3ZlID0gcFNwYWNlLT54Ow0KKyAgICBmU3BhY2VCZWxvdyA9IHBTcGFjZS0+eTsNCisgIH0NCisgIGlmIChmU3BhY2VBYm92ZSA8IDAuMWYpIHsNCisgICAgZlNwYWNlQWJvdmUgPSAwOw0KKyAgfQ0KKyAgaWYgKGZTcGFjZUJlbG93IDwgMC4xZikgew0KKyAgICBmU3BhY2VCZWxvdyA9IDA7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVkNlbnRlcikgew0KKyAgICBmT2Zmc2V0WSA9IChtX3J0RW5naW5lLmhlaWdodCAtIHJ0RkRFLmhlaWdodCkgLyAyOw0KKyAgICBpZiAoZk9mZnNldFkgPCAoZlNwYWNlQWJvdmUgKyBmU3BhY2VCZWxvdykgLyAyICYmDQorICAgICAgICBmU3BhY2VBYm92ZSA8IGZTcGFjZUJlbG93KSB7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQorICAgIGZPZmZzZXRZICs9IChmU3BhY2VBYm92ZSAtIGZTcGFjZUJlbG93KSAvIDI7DQorICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZGYXIpIHsNCisgICAgZk9mZnNldFkgPSAobV9ydEVuZ2luZS5oZWlnaHQgLSBydEZERS5oZWlnaHQpOw0KKyAgICBmT2Zmc2V0WSAtPSBmU3BhY2VCZWxvdzsNCisgIH0gZWxzZSB7DQorICAgIGZPZmZzZXRZICs9IGZTcGFjZUFib3ZlOw0KKyAgfQ0KKyAgbV9mVkFsaWduT2Zmc2V0ID0gZk9mZnNldFk7DQorICBpZiAobV9mVkFsaWduT2Zmc2V0IDwgMCkgew0KKyAgICBtX2ZWQWxpZ25PZmZzZXQgPSAwOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6VXBkYXRlQ2FyZXQoKSB7DQorICBDRlhfUmVjdEYgcnRGREU7DQorICBtX3BFZHRFbmdpbmUtPkdldENhcmV0UmVjdChydEZERSk7DQorICBydEZERS5PZmZzZXQobV9ydEVuZ2luZS5sZWZ0IC0gbV9mU2Nyb2xsT2Zmc2V0WCwNCisgICAgICAgICAgICAgICBtX3J0RW5naW5lLnRvcCAtIG1fZlNjcm9sbE9mZnNldFkgKyBtX2ZWQWxpZ25PZmZzZXQpOw0KKyAgQ0ZYX1JlY3RGIHJ0Q2FyZXQ7DQorICBydENhcmV0LlNldChydEZERS5sZWZ0LCBydEZERS50b3AsIHJ0RkRFLndpZHRoLCBydEZERS5oZWlnaHQpOw0KKyAgQ0ZYX1JlY3RGIHRlbXAgPSBydENhcmV0Ow0KKyAgQ0ZYX1JlY3RGIHJ0Q2xpZW50Ow0KKyAgR2V0Q2xpZW50UmVjdChydENsaWVudCk7DQorICBydENhcmV0LkludGVyc2VjdChydENsaWVudCk7DQorICBpZiAocnRDYXJldC5sZWZ0ID4gcnRDbGllbnQucmlnaHQoKSkgew0KKyAgICBGWF9GTE9BVCByaWdodCA9IHJ0Q2FyZXQucmlnaHQoKTsNCisgICAgcnRDYXJldC5sZWZ0ID0gcnRDbGllbnQucmlnaHQoKSAtIDE7DQorICAgIHJ0Q2FyZXQud2lkdGggPSByaWdodCAtIHJ0Q2FyZXQubGVmdDsNCisgIH0NCisgIEZYX0JPT0wgYkludGVyc2VjdCA9ICFydENhcmV0LklzRW1wdHkoKTsNCisgIEZYX0JPT0wgYlNob3cgPSBUUlVFOw0KKyAgRlhfQk9PTCBiU2hvd1dob2xlID0gRkFMU0U7DQorICBpZiAoIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHx8ICFiSW50ZXJzZWN0KSB7DQorICAgIGJTaG93ID0gRkFMU0U7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfSFNlbGZBZGFwdGlvbiAmJg0KKyAgICAgIHRlbXAucmlnaHQoKSA+IG1fcnRFbmdpbmUucmlnaHQoKSkgew0KKyAgICBiU2hvd1dob2xlID0gVFJVRTsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WU2VsZkFkYXB0aW9uICYmDQorICAgICAgdGVtcC5ib3R0b20oKSA+IG1fcnRFbmdpbmUuYm90dG9tKCkpIHsNCisgICAgYlNob3dXaG9sZSA9IFRSVUU7DQorICB9IGVsc2Ugew0KKyAgICBiU2hvdyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQgJiYgYkludGVyc2VjdCk7DQorICB9DQorICBpZiAoYlNob3dXaG9sZSkgew0KKyAgICBydENhcmV0ID0gdGVtcDsNCisgIH0NCisgIFNob3dDYXJldChiU2hvdywgJnJ0Q2FyZXQpOw0KK30NCitJRldMX1Njcm9sbEJhciogQ0ZXTF9FZGl0SW1wOjpVcGRhdGVTY3JvbGwoKSB7DQorICBGWF9CT09MIGJTaG93SG9yeiA9DQorICAgICAgbV9wSG9yelNjcm9sbEJhciAmJg0KKyAgICAgICgobV9wSG9yelNjcm9sbEJhci0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSA9PSAwKTsNCisgIEZYX0JPT0wgYlNob3dWZXJ0ID0NCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyICYmDQorICAgICAgKChtX3BWZXJ0U2Nyb2xsQmFyLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpID09IDApOw0KKyAgaWYgKCFiU2hvd0hvcnogJiYgIWJTaG93VmVydCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYWdlLCBOVUxMKTsNCisgIGNvbnN0IENGWF9SZWN0RiYgcnRGREUgPSBwUGFnZS0+R2V0Q29udGVudHNCb3goKTsNCisgIElGV0xfU2Nyb2xsQmFyKiBwUmVwYWludCA9IE5VTEw7DQorICBpZiAoYlNob3dIb3J6KSB7DQorICAgIENGWF9SZWN0RiBydFNjcm9sbDsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdChydFNjcm9sbCk7DQorICAgIGlmIChydFNjcm9sbC53aWR0aCA8IHJ0RkRFLndpZHRoKSB7DQorICAgICAgbV9wSG9yelNjcm9sbEJhci0+TG9ja1VwZGF0ZSgpOw0KKyAgICAgIEZYX0ZMT0FUIGZSYW5nZSA9IHJ0RkRFLndpZHRoIC0gcnRTY3JvbGwud2lkdGg7DQorICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UmFuZ2UoMC4wZiwgZlJhbmdlKTsNCisgICAgICBGWF9GTE9BVCBmUG9zID0gbV9mU2Nyb2xsT2Zmc2V0WDsNCisgICAgICBpZiAoZlBvcyA8IDAuMGYpIHsNCisgICAgICAgIGZQb3MgPSAwLjBmOw0KKyAgICAgIH0NCisgICAgICBpZiAoZlBvcyA+IGZSYW5nZSkgew0KKyAgICAgICAgZlBvcyA9IGZSYW5nZTsNCisgICAgICB9DQorICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UG9zKGZQb3MpOw0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFBhZ2VTaXplKHJ0U2Nyb2xsLndpZHRoKTsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGVwU2l6ZShydFNjcm9sbC53aWR0aCAvIDEwKTsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0Rpc2FibGVkLCBGQUxTRSk7DQorICAgICAgbV9wSG9yelNjcm9sbEJhci0+VW5sb2NrVXBkYXRlKCk7DQorICAgICAgbV9wSG9yelNjcm9sbEJhci0+VXBkYXRlKCk7DQorICAgICAgcFJlcGFpbnQgPSAoSUZXTF9TY3JvbGxCYXIqKW1fcEhvcnpTY3JvbGxCYXI7DQorICAgIH0gZWxzZSBpZiAoKG1fcEhvcnpTY3JvbGxCYXItPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA9PSAwKSB7DQorICAgICAgbV9wSG9yelNjcm9sbEJhci0+TG9ja1VwZGF0ZSgpOw0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFJhbmdlKDAsIC0xKTsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0Rpc2FibGVkLCBUUlVFKTsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5VbmxvY2tVcGRhdGUoKTsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCisgICAgICBwUmVwYWludCA9IChJRldMX1Njcm9sbEJhciopbV9wSG9yelNjcm9sbEJhcjsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJTaG93VmVydCkgew0KKyAgICBDRlhfUmVjdEYgcnRTY3JvbGw7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocnRTY3JvbGwpOw0KKyAgICBpZiAocnRTY3JvbGwuaGVpZ2h0IDwgcnRGREUuaGVpZ2h0KSB7DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+TG9ja1VwZGF0ZSgpOw0KKyAgICAgIEZYX0ZMT0FUIGZTdGVwID0gbV9wRWR0RW5naW5lLT5HZXRFZGl0UGFyYW1zKCktPmZMaW5lU3BhY2U7DQorICAgICAgRlhfRkxPQVQgZlJhbmdlID0gcnRGREUuaGVpZ2h0IC0gbV9ydEVuZ2luZS5oZWlnaHQ7DQorICAgICAgaWYgKGZSYW5nZSA8IGZTdGVwKSB7DQorICAgICAgICBmUmFuZ2UgPSBmU3RlcDsNCisgICAgICB9DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UmFuZ2UoMC4wZiwgZlJhbmdlKTsNCisgICAgICBGWF9GTE9BVCBmUG9zID0gbV9mU2Nyb2xsT2Zmc2V0WTsNCisgICAgICBpZiAoZlBvcyA8IDAuMGYpIHsNCisgICAgICAgIGZQb3MgPSAwLjBmOw0KKyAgICAgIH0NCisgICAgICBpZiAoZlBvcyA+IGZSYW5nZSkgew0KKyAgICAgICAgZlBvcyA9IGZSYW5nZTsNCisgICAgICB9DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UG9zKGZQb3MpOw0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFBhZ2VTaXplKHJ0U2Nyb2xsLmhlaWdodCk7DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RlcFNpemUoZlN0ZXApOw0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfRGlzYWJsZWQsIEZBTFNFKTsNCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5VbmxvY2tVcGRhdGUoKTsNCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCisgICAgICBwUmVwYWludCA9IChJRldMX1Njcm9sbEJhciopbV9wVmVydFNjcm9sbEJhcjsNCisgICAgfSBlbHNlIGlmICgobV9wVmVydFNjcm9sbEJhci0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpID09IDApIHsNCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5Mb2NrVXBkYXRlKCk7DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UmFuZ2UoMCwgLTEpOw0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfRGlzYWJsZWQsIFRSVUUpOw0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlVubG9ja1VwZGF0ZSgpOw0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlVwZGF0ZSgpOw0KKyAgICAgIHBSZXBhaW50ID0gKElGV0xfU2Nyb2xsQmFyKiltX3BWZXJ0U2Nyb2xsQmFyOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcFJlcGFpbnQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpJc1Nob3dTY3JvbGxCYXIoRlhfQk9PTCBiVmVydCkgew0KKyAgRlhfQk9PTCBiU2hvdyA9DQorICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1Nob3dTY3JvbGxiYXJGb2N1cykNCisgICAgICAgICAgPyAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PQ0KKyAgICAgICAgICAgICAgICBGV0xfV0dUU1RBVEVfRm9jdXNlZA0KKyAgICAgICAgICA6IFRSVUU7DQorICBpZiAoYlZlcnQpIHsNCisgICAgcmV0dXJuIGJTaG93ICYmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX1ZTY3JvbGwpICYmDQorICAgICAgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTXVsdGlMaW5lKSAmJg0KKyAgICAgICAgICAgSXNDb250ZW50SGVpZ2h0T3ZlcmZsb3coKTsNCisgIH0NCisgIHJldHVybiBiU2hvdyAmJiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9IU2Nyb2xsKSAmJg0KKyAgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUpOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6SXNDb250ZW50SGVpZ2h0T3ZlcmZsb3coKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEVkdEVuZ2luZSwgRkFMU0UpOw0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhZ2UsIEZBTFNFKTsNCisgIHJldHVybiBwUGFnZS0+R2V0Q29udGVudHNCb3goKS5oZWlnaHQgPiBtX3J0RW5naW5lLmhlaWdodCArIDEuMGY7DQorfQ0KK2ludDMyX3QgQ0ZXTF9FZGl0SW1wOjpBZGREb1JlY29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIHsNCisgIGludDMyX3QgbkNvdW50ID0gbV9SZWNvcmRBcnIuR2V0U2l6ZSgpOw0KKyAgaWYgKG1faUN1clJlY29yZCA9PSBuQ291bnQgLSAxKSB7DQorICAgIGlmIChuQ291bnQgPT0gbV9pTWF4UmVjb3JkKSB7DQorICAgICAgbV9SZWNvcmRBcnIuUmVtb3ZlQXQoMCk7DQorICAgICAgbV9pQ3VyUmVjb3JkLS07DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gbkNvdW50IC0gMTsgaSA+IG1faUN1clJlY29yZDsgaS0tKSB7DQorICAgICAgbV9SZWNvcmRBcnIuUmVtb3ZlQXQoaSk7DQorICAgIH0NCisgIH0NCisgIG1fUmVjb3JkQXJyLkFkZChic0RvUmVjb3JkKTsNCisgIHJldHVybiBtX2lDdXJSZWNvcmQgPSBtX1JlY29yZEFyci5HZXRTaXplKCkgLSAxOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6TGF5b3V0KCkgew0KKyAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgIG1fcnRFbmdpbmUgPSBtX3J0Q2xpZW50Ow0KKyAgRlhfRkxPQVQqIHBmV2lkdGggPQ0KKyAgICAgIChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwZldpZHRoKTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9ICpwZldpZHRoOw0KKyAgaWYgKCFtX3BPdXRlcikgew0KKyAgICBDRlhfUmVjdEYqIHBVSU1hcmdpbiA9DQorICAgICAgICAoQ0ZYX1JlY3RGKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9VSU1hcmdpbik7DQorICAgIGlmIChwVUlNYXJnaW4pIHsNCisgICAgICBtX3J0RW5naW5lLkRlZmxhdGUocFVJTWFyZ2luLT5sZWZ0LCBwVUlNYXJnaW4tPnRvcCwgcFVJTWFyZ2luLT53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcFVJTWFyZ2luLT5oZWlnaHQpOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKG1fcE91dGVyLT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9EYXRlVGltZVBpY2tlcikgew0KKyAgICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KKyAgICBwYXJ0Lm1fcFdpZGdldCA9IG1fcE91dGVyOw0KKyAgICBDRlhfUmVjdEYqIHBVSU1hcmdpbiA9DQorICAgICAgICAoQ0ZYX1JlY3RGKiltX3BPdXRlci0+R2V0VGhlbWVQcm92aWRlcigpLT5HZXRDYXBhY2l0eSgNCisgICAgICAgICAgICAmcGFydCwgRldMX1dHVENBUEFDSVRZX1VJTWFyZ2luKTsNCisgICAgaWYgKHBVSU1hcmdpbikgew0KKyAgICAgIG1fcnRFbmdpbmUuRGVmbGF0ZShwVUlNYXJnaW4tPmxlZnQsIHBVSU1hcmdpbi0+dG9wLCBwVUlNYXJnaW4tPndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwVUlNYXJnaW4tPmhlaWdodCk7DQorICAgIH0NCisgIH0NCisgIEZYX0JPT0wgYlNob3dWZXJ0U2Nyb2xsYmFyID0gSXNTaG93U2Nyb2xsQmFyKFRSVUUpOw0KKyAgRlhfQk9PTCBiU2hvd0hvcnpTY3JvbGxiYXIgPSBJc1Nob3dTY3JvbGxCYXIoRkFMU0UpOw0KKyAgaWYgKGJTaG93VmVydFNjcm9sbGJhcikgew0KKyAgICBJbml0U2Nyb2xsQmFyKCk7DQorICAgIENGWF9SZWN0RiBydFZlcnRTY3I7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KKyAgICAgIHJ0VmVydFNjci5TZXQobV9ydENsaWVudC5yaWdodCgpICsgRldMX0VESVRfTWFyZ2luLCBtX3J0Q2xpZW50LnRvcCwNCisgICAgICAgICAgICAgICAgICAgIGZXaWR0aCwgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJ0VmVydFNjci5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gZldpZHRoLCBtX3J0Q2xpZW50LnRvcCwgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICAgIGlmIChiU2hvd0hvcnpTY3JvbGxiYXIpIHsNCisgICAgICAgIHJ0VmVydFNjci5oZWlnaHQgLT0gZldpZHRoOw0KKyAgICAgIH0NCisgICAgICBtX3J0RW5naW5lLndpZHRoIC09IGZXaWR0aDsNCisgICAgfQ0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRXaWRnZXRSZWN0KHJ0VmVydFNjcik7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBGQUxTRSk7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlVwZGF0ZSgpOw0KKyAgfSBlbHNlIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgIH0NCisgIGlmIChiU2hvd0hvcnpTY3JvbGxiYXIpIHsNCisgICAgSW5pdFNjcm9sbEJhcihGQUxTRSk7DQorICAgIENGWF9SZWN0RiBydEhvcmlTY3I7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KKyAgICAgIHJ0SG9yaVNjci5TZXQobV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LmJvdHRvbSgpICsgRldMX0VESVRfTWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC53aWR0aCwgZldpZHRoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBydEhvcmlTY3IuU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC5ib3R0b20oKSAtIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGgsIGZXaWR0aCk7DQorICAgICAgaWYgKGJTaG93VmVydFNjcm9sbGJhcikgew0KKyAgICAgICAgcnRIb3JpU2NyLndpZHRoIC09IGZXaWR0aDsNCisgICAgICB9DQorICAgICAgbV9ydEVuZ2luZS5oZWlnaHQgLT0gZldpZHRoOw0KKyAgICB9DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFdpZGdldFJlY3QocnRIb3JpU2NyKTsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIEZBTFNFKTsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+VXBkYXRlKCk7DQorICB9IGVsc2UgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6TGF5b3V0U2Nyb2xsQmFyKCkgew0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMpID09DQorICAgICAgMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCogcGZXaWR0aCA9IE5VTEw7DQorICBGWF9CT09MIGJTaG93VmVydFNjcm9sbGJhciA9IElzU2hvd1Njcm9sbEJhcihUUlVFKTsNCisgIEZYX0JPT0wgYlNob3dIb3J6U2Nyb2xsYmFyID0gSXNTaG93U2Nyb2xsQmFyKEZBTFNFKTsNCisgIGlmIChiU2hvd1ZlcnRTY3JvbGxiYXIpIHsNCisgICAgaWYgKCFtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgcGZXaWR0aCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KKyAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBmV2lkdGggPyAqcGZXaWR0aCA6IDA7DQorICAgICAgSW5pdFNjcm9sbEJhcigpOw0KKyAgICAgIENGWF9SZWN0RiBydFZlcnRTY3I7DQorICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX091dGVyU2Nyb2xsYmFyKSB7DQorICAgICAgICBydFZlcnRTY3IuU2V0KG1fcnRDbGllbnQucmlnaHQoKSArIEZXTF9FRElUX01hcmdpbiwgbV9ydENsaWVudC50b3AsDQorICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCwgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBydFZlcnRTY3IuU2V0KG1fcnRDbGllbnQucmlnaHQoKSAtIGZXaWR0aCwgbV9ydENsaWVudC50b3AsIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICAgICAgaWYgKGJTaG93SG9yelNjcm9sbGJhcikgew0KKyAgICAgICAgICBydFZlcnRTY3IuaGVpZ2h0IC09IGZXaWR0aDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0V2lkZ2V0UmVjdChydFZlcnRTY3IpOw0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlVwZGF0ZSgpOw0KKyAgICB9DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBGQUxTRSk7DQorICB9IGVsc2UgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgfQ0KKyAgaWYgKGJTaG93SG9yelNjcm9sbGJhcikgew0KKyAgICBpZiAoIW1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgICBwZldpZHRoID0NCisgICAgICAgICAgIXBmV2lkdGggPyAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKQ0KKyAgICAgICAgICAgICAgICAgICA6IHBmV2lkdGg7DQorICAgICAgRlhfRkxPQVQgZldpZHRoID0gcGZXaWR0aCA/ICpwZldpZHRoIDogMDsNCisgICAgICBJbml0U2Nyb2xsQmFyKEZBTFNFKTsNCisgICAgICBDRlhfUmVjdEYgcnRIb3JpU2NyOw0KKyAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KKyAgICAgICAgcnRIb3JpU2NyLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQuYm90dG9tKCkgKyBGV0xfRURJVF9NYXJnaW4sDQorICAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGgsIGZXaWR0aCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0SG9yaVNjci5TZXQobV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LmJvdHRvbSgpIC0gZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LndpZHRoLCBmV2lkdGgpOw0KKyAgICAgICAgaWYgKGJTaG93VmVydFNjcm9sbGJhcikgew0KKyAgICAgICAgICBydEhvcmlTY3Iud2lkdGggLT0gKGZXaWR0aCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFdpZGdldFJlY3QocnRIb3JpU2NyKTsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCisgICAgfQ0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgRkFMU0UpOw0KKyAgfSBlbHNlIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgIH0NCisgIGlmIChiU2hvd1ZlcnRTY3JvbGxiYXIgfHwgYlNob3dIb3J6U2Nyb2xsYmFyKSB7DQorICAgIFVwZGF0ZVNjcm9sbCgpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6RGV2aWNlVG9FbmdpbmUoQ0ZYX1BvaW50RiYgcHQpIHsNCisgIHB0LnggKz0gLW1fcnRFbmdpbmUubGVmdCArIG1fZlNjcm9sbE9mZnNldFg7DQorICBwdC55ICs9IC1tX3J0RW5naW5lLnRvcCAtIG1fZlZBbGlnbk9mZnNldCArIG1fZlNjcm9sbE9mZnNldFk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpJbml0U2Nyb2xsQmFyKEZYX0JPT0wgYlZlcnQpIHsNCisgIGlmICgoYlZlcnQgJiYgbV9wVmVydFNjcm9sbEJhcikgfHwgKCFiVmVydCAmJiBtX3BIb3J6U2Nyb2xsQmFyKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgIHByb3AubV9kd1N0eWxlRXhlcyA9IGJWZXJ0ID8gRldMX1NUWUxFRVhUX1NDQl9WZXJ0IDogRldMX1NUWUxFRVhUX1NDQl9Ib3J6Ow0KKyAgcHJvcC5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0Rpc2FibGVkIHwgRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCisgIHByb3AubV9wUGFyZW50ID0gbV9wSW50ZXJmYWNlOw0KKyAgcHJvcC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIElGV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0gSUZXTF9TY3JvbGxCYXI6OkNyZWF0ZSgpOw0KKyAgcFNjcm9sbEJhci0+SW5pdGlhbGl6ZShwcm9wLCBtX3BJbnRlcmZhY2UpOw0KKyAgYlZlcnQgPyAobV9wVmVydFNjcm9sbEJhciA9IHBTY3JvbGxCYXIpIDogKG1fcEhvcnpTY3JvbGxCYXIgPSBwU2Nyb2xsQmFyKTsNCit9DQordm9pZCBDRldMX0VkaXRJbXA6OkluaXRFbmdpbmUoKSB7DQorICBpZiAobV9wRWR0RW5naW5lKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcEVkdEVuZ2luZSA9IElGREVfVHh0RWR0RW5naW5lOjpDcmVhdGUoKTsNCit9DQorZXh0ZXJuIEZYX0JPT0wgRldMX1Nob3dDYXJldChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZpc2libGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdEFuY2hvcik7DQordm9pZCBDRldMX0VkaXRJbXA6OlNob3dDYXJldChGWF9CT09MIGJWaXNpYmxlLCBDRlhfUmVjdEYqIHBSZWN0KSB7DQorICBpZiAobV9wQ2FyZXQpIHsNCisgICAgbV9wQ2FyZXQtPlNob3dDYXJldChiVmlzaWJsZSk7DQorICAgIGlmIChiVmlzaWJsZSAmJiAhcFJlY3QtPklzRW1wdHkoKSkgew0KKyAgICAgIG1fcENhcmV0LT5TZXRXaWRnZXRSZWN0KCpwUmVjdCk7DQorICAgIH0NCisgICAgUmVwYWludCgmbV9ydEVuZ2luZSk7DQorICB9IGVsc2Ugew0KKyAgICBJRldMX1dpZGdldCogcE91dGVyID0gKElGV0xfV2lkZ2V0KiltX3BJbnRlcmZhY2U7DQorICAgIGlmIChiVmlzaWJsZSkgew0KKyAgICAgIHBSZWN0LT5PZmZzZXQobV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3ApOw0KKyAgICB9DQorICAgIHdoaWxlIChwT3V0ZXItPkdldE91dGVyKCkpIHsNCisgICAgICBwT3V0ZXIgPSBwT3V0ZXItPkdldE91dGVyKCk7DQorICAgICAgaWYgKGJWaXNpYmxlKSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRPdXRlcjsNCisgICAgICAgIHBPdXRlci0+R2V0V2lkZ2V0UmVjdChydE91dGVyKTsNCisgICAgICAgIHBSZWN0LT5PZmZzZXQocnRPdXRlci5sZWZ0LCBydE91dGVyLnRvcCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZXTF9TaG93Q2FyZXQocE91dGVyLCBiVmlzaWJsZSwgcFJlY3QpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6VmFsaWRhdGVOdW1iZXJDaGFyKEZYX1dDSEFSIGNOdW0pIHsNCisgIGlmICghbV9wRWR0RW5naW5lKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghbV9iU2V0UmFuZ2UpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c09sZCwgd3NUZXh0Ow0KKyAgbV9wRWR0RW5naW5lLT5HZXRUZXh0KHdzVGV4dCwgMCk7DQorICBpZiAod3NUZXh0LklzRW1wdHkoKSkgew0KKyAgICBpZiAoY051bSA9PSBMJzAnKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaW50MzJfdCBjYXJldFBvcyA9IG1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRQb3MoKTsNCisgIGludDMyX3QgaVNlbCA9IENvdW50U2VsUmFuZ2VzKCk7DQorICBpZiAoaVNlbCA9PSAwKSB7DQorICAgIGlmIChjTnVtID09IEwnMCcgJiYgY2FyZXRQb3MgPT0gMCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpbnQzMl90IG5MZW4gPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIGwgPSB3c1RleHQuTWlkKDAsIGNhcmV0UG9zKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgciA9IHdzVGV4dC5NaWQoY2FyZXRQb3MsIG5MZW4gLSBjYXJldFBvcyk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3ID0gbCArIGNOdW0gKyByOw0KKyAgICBpZiAod3NOZXcuR2V0SW50ZWdlcigpIDw9IG1faU1heCkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAod3NUZXh0LkdldEludGVnZXIoKSA8PSBtX2lNYXgpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6SW5pdENhcmV0KCkgew0KKyAgaWYgKCFtX3BDYXJldCkgew0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0lubmVyQ2FyZXQpKSB7DQorICAgICAgbV9wQ2FyZXQgPSBJRldMX0NhcmV0OjpDcmVhdGUoKTsNCisgICAgICBtX3BDYXJldC0+SW5pdGlhbGl6ZShtX3BJbnRlcmZhY2UpOw0KKyAgICAgIG1fcENhcmV0LT5TZXRQYXJlbnQobV9wSW50ZXJmYWNlKTsNCisgICAgICBtX3BDYXJldC0+U2V0U3RhdGVzKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMpOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9Jbm5lckNhcmV0KSA9PQ0KKyAgICAgICAgICAgICAwKSB7DQorICAgIG1fcENhcmV0LT5SZWxlYXNlKCk7DQorICAgIG1fcENhcmV0ID0gTlVMTDsNCisgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXA6OkNsZWFyUmVjb3JkKCkgew0KKyAgbV9pQ3VyUmVjb3JkID0gLTE7DQorICBtX1JlY29yZEFyci5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDRldMX0VkaXRJbXA6OlByb2Nlc3NJbnNlcnRFcnJvcihpbnQzMl90IGlFcnJvcikgew0KKyAgc3dpdGNoIChpRXJyb3IpIHsNCisgICAgY2FzZSAtMjogew0KKyAgICAgIENGV0xfRXZ0RWR0VGV4dEZ1bGwgdGV4dEZ1bGxFdmVudDsNCisgICAgICB0ZXh0RnVsbEV2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICBEaXNwYXRjaEV2ZW50KCZ0ZXh0RnVsbEV2ZW50KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KK30NCitDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6Q0ZXTF9FZGl0SW1wRGVsZWdhdGUoQ0ZXTF9FZGl0SW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQorICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaW50MzJfdCBpUmV0ID0gMTsNCisgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgIGNhc2UgRldMX01TR0hBU0hfQWN0aXZhdGU6IHsNCisgICAgICBEb0FjdGl2YXRlKChDRldMX01zZ0FjdGl2YXRlKilwTWVzc2FnZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9EZWFjdGl2YXRlOiB7DQorICAgICAgRG9EZWFjdGl2YXRlKChDRldMX01zZ0RlYWN0aXZhdGUqKXBNZXNzYWdlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KKyAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCisgICAgICBDRldMX01zZ01vdXNlKiBwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgICBzd2l0Y2ggKGR3Q21kKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRGJsQ2xrOiB7DQorICAgICAgICAgIE9uQnV0dG9uRGJsQ2xrKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRG93bjogew0KKyAgICAgICAgICBEb0J1dHRvbkRvd24ocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDoge30NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCisgICAgICBDRldMX01zZ0tleSogcEtleSA9IChDRldMX01zZ0tleSopcE1lc3NhZ2U7DQorICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwS2V5LT5tX2R3Q21kOw0KKyAgICAgIGlmIChkd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24pIHsNCisgICAgICAgIE9uS2V5RG93bihwS2V5KTsNCisgICAgICB9IGVsc2UgaWYgKGR3Q21kID09IEZXTF9NU0dLRVlDTURfQ2hhcikgew0KKyAgICAgICAgT25DaGFyKHBLZXkpOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IGlSZXQgPSAwOyB9DQorICB9DQorICBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgIHJldHVybiBpUmV0Ow0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEV2ZW50LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGR3SGFzaENvZGUgIT0gRldMX0VWVEhBU0hfU2Nyb2xsKSB7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIElGV0xfV2lkZ2V0KiBwU3JjVGFyZ2V0ID0gcEV2ZW50LT5tX3BTcmNUYXJnZXQ7DQorICBpZiAoKHBTcmNUYXJnZXQgPT0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wVmVydFNjcm9sbEJhciAmJg0KKyAgICAgICBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhcikgfHwNCisgICAgICAocFNyY1RhcmdldCA9PSAoSUZXTF9XaWRnZXQqKW1fcE93bmVyLT5tX3BIb3J6U2Nyb2xsQmFyICYmDQorICAgICAgIG1fcE93bmVyLT5tX3BIb3J6U2Nyb2xsQmFyKSkgew0KKyAgICBGWF9EV09SRCBkd1Njcm9sbENvZGUgPSAoKENGV0xfRXZ0U2Nyb2xsKilwRXZlbnQpLT5tX2lTY3JvbGxDb2RlOw0KKyAgICBGWF9GTE9BVCBmUG9zID0gKChDRldMX0V2dFNjcm9sbCopcEV2ZW50KS0+bV9mUG9zOw0KKyAgICBPblNjcm9sbCgoSUZXTF9TY3JvbGxCYXIqKXBTcmNUYXJnZXQsIGR3U2Nyb2xsQ29kZSwgZlBvcyk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6OkRvQWN0aXZhdGUoQ0ZXTF9Nc2dBY3RpdmF0ZSogcE1zZykgew0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gfkZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZDsNCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6OkRvRGVhY3RpdmF0ZShDRldMX01zZ0RlYWN0aXZhdGUqIHBNc2cpIHsNCisgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZDsNCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6OkRvQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KKyAgfQ0KKyAgaWYgKCFtX3BPd25lci0+bV9wRWR0RW5naW5lKSB7DQorICAgIG1fcE93bmVyLT5VcGRhdGVFZGl0RW5naW5lKCk7DQorICB9DQorICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFBhZ2UpOw0KKyAgQ0ZYX1BvaW50RiBwdDsNCisgIHB0LlNldChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIG1fcE93bmVyLT5EZXZpY2VUb0VuZ2luZShwdCk7DQorICBGWF9CT09MIGJCZWZvcmUgPSBUUlVFOw0KKyAgaW50MzJfdCBuSW5kZXggPSBwUGFnZS0+R2V0Q2hhckluZGV4KHB0LCBiQmVmb3JlKTsNCisgIGlmIChuSW5kZXggPCAwKSB7DQorICAgIG5JbmRleCA9IDA7DQorICB9DQorICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5TZXRDYXJldFBvcyhuSW5kZXgsIGJCZWZvcmUpOw0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCkgew0KKyAgRlhfRFdPUkQgZHdTdHlsZUV4ID0gbV9wT3duZXItPkdldFN0eWxlc0V4KCk7DQorICBGWF9CT09MIGJSZXBhaW50ID0gZHdTdHlsZUV4ICYgRldMX1NUWUxFRVhUX0VEVF9Jbm5lckNhcmV0Ow0KKyAgaWYgKGJTZXQpIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIGlmICghbV9wT3duZXItPm1fcEVkdEVuZ2luZSkgew0KKyAgICAgIG1fcE93bmVyLT5VcGRhdGVFZGl0RW5naW5lKCk7DQorICAgIH0NCisgICAgbV9wT3duZXItPlVwZGF0ZVZBbGlnbm1lbnQoKTsNCisgICAgbV9wT3duZXItPlVwZGF0ZU9mZnNldCgpOw0KKyAgICBtX3BPd25lci0+VXBkYXRlQ2FyZXQoKTsNCisgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIG1fcE93bmVyLT5TaG93Q2FyZXQoRkFMU0UpOw0KKyAgICBpZiAobV9wT3duZXItPm1fcEVkdEVuZ2luZSAmJg0KKyAgICAgICAgKGR3U3R5bGVFeCAmIEZXTF9TVFlMRUVYVF9FRFRfTm9IaWRlU2VsKSA9PSAwKSB7DQorICAgICAgaW50MzJfdCBuU2VsID0gbV9wT3duZXItPkNvdW50U2VsUmFuZ2VzKCk7DQorICAgICAgaWYgKG5TZWwgPiAwKSB7DQorICAgICAgICBtX3BPd25lci0+Q2xlYXJTZWxlY3Rpb25zKCk7DQorICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIG1fcE93bmVyLT5TZXRDYXJldFBvcygwKTsNCisgICAgICBtX3BPd25lci0+VXBkYXRlT2Zmc2V0KCk7DQorICAgIH0NCisgICAgbV9wT3duZXItPkNsZWFyUmVjb3JkKCk7DQorICB9DQorICBtX3BPd25lci0+TGF5b3V0U2Nyb2xsQmFyKCk7DQorICBpZiAoYlJlcGFpbnQpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgICAgcnRJbnZhbGlkYXRlLlNldCgwLCAwLCBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBEb0N1cnNvcihwTXNnKTsNCisgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBUUlVFOw0KKyAgbV9wT3duZXItPlNldEdyYWIoVFJVRSk7DQorICBEb0J1dHRvbkRvd24ocE1zZyk7DQorICBpbnQzMl90IG5JbmRleCA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkdldENhcmV0UG9zKCk7DQorICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQorICBpbnQzMl90IGlDb3VudCA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQorICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5DbGVhclNlbGVjdGlvbigpOw0KKyAgICBiUmVwYWludCA9IFRSVUU7DQorICB9DQorICBGWF9CT09MIGJTaGlmdCA9IHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX1NoaWZ0Ow0KKyAgaWYgKGJTaGlmdCAmJiBtX3BPd25lci0+bV9uU2VsU3RhcnQgIT0gbkluZGV4KSB7DQorICAgIGludDMyX3QgaVN0YXJ0ID0gRlhfTUlOKG1fcE93bmVyLT5tX25TZWxTdGFydCwgbkluZGV4KTsNCisgICAgaW50MzJfdCBpRW5kID0gRlhfTUFYKG1fcE93bmVyLT5tX25TZWxTdGFydCwgbkluZGV4KTsNCisgICAgbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+QWRkU2VsUmFuZ2UoaVN0YXJ0LCBpRW5kIC0gaVN0YXJ0KTsNCisgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1fblNlbFN0YXJ0ID0gbkluZGV4Ow0KKyAgfQ0KKyAgaWYgKGJSZXBhaW50KSB7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydEVuZ2luZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIERvQ3Vyc29yKHBNc2cpOw0KKyAgbV9wT3duZXItPm1fYkxCdXR0b25Eb3duID0gRkFMU0U7DQorICBtX3BPd25lci0+U2V0R3JhYihGQUxTRSk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uQnV0dG9uRGJsQ2xrKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wT3duZXItPm1fcEVkdEVuZ2luZSk7DQorICBEb0N1cnNvcihwTXNnKTsNCisgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUGFnZSk7DQorICBDRlhfUG9pbnRGIHB0Ow0KKyAgcHQuU2V0KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgbV9wT3duZXItPkRldmljZVRvRW5naW5lKHB0KTsNCisgIGludDMyX3QgbkNvdW50ID0gMDsNCisgIGludDMyX3QgbkluZGV4ID0gcFBhZ2UtPlNlbGVjdFdvcmQocHQsIG5Db3VudCk7DQorICBpZiAobkluZGV4IDwgMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5BZGRTZWxSYW5nZShuSW5kZXgsIG5Db3VudCk7DQorICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5TZXRDYXJldFBvcyhuSW5kZXggKyBuQ291bnQgLSAxLCBGQUxTRSk7DQorICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRFbmdpbmUpOw0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcE93bmVyLT5tX3BFZHRFbmdpbmUpOw0KKyAgRG9DdXJzb3IocE1zZyk7DQorICBpZiAobV9wT3duZXItPm1fblNlbFN0YXJ0ID09IC0xIHx8ICFtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBQYWdlKTsNCisgIENGWF9Qb2ludEYgcHQ7DQorICBwdC5TZXQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICBtX3BPd25lci0+RGV2aWNlVG9FbmdpbmUocHQpOw0KKyAgRlhfQk9PTCBiQmVmb3JlID0gVFJVRTsNCisgIGludDMyX3QgbkluZGV4ID0gcFBhZ2UtPkdldENoYXJJbmRleChwdCwgYkJlZm9yZSk7DQorICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5TZXRDYXJldFBvcyhuSW5kZXgsIGJCZWZvcmUpOw0KKyAgbkluZGV4ID0gbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRQb3MoKTsNCisgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQorICBpZiAobkluZGV4ICE9IG1fcE93bmVyLT5tX25TZWxTdGFydCkgew0KKyAgICBpbnQzMl90IG5MZW4gPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRUZXh0TGVuZ3RoKCk7DQorICAgIGlmIChtX3BPd25lci0+bV9uU2VsU3RhcnQgPj0gbkxlbikgew0KKyAgICAgIG1fcE93bmVyLT5tX25TZWxTdGFydCA9IG5MZW47DQorICAgIH0NCisgICAgbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+QWRkU2VsUmFuZ2UoDQorICAgICAgICBGWF9NSU4obV9wT3duZXItPm1fblNlbFN0YXJ0LCBuSW5kZXgpLA0KKyAgICAgICAgRlhTWVNfYWJzKG5JbmRleCAtIG1fcE93bmVyLT5tX25TZWxTdGFydCkpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbktleURvd24oQ0ZXTF9Nc2dLZXkqIHBNc2cpIHsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wT3duZXItPm1fcEVkdEVuZ2luZSk7DQorICBGREVfVFhURURUTU9WRUNBUkVUIE1vdmVDYXJldCA9IE1DX01vdmVOb25lOw0KKyAgRlhfQk9PTCBiU2hpZnQgPSBwTXNnLT5tX2R3RmxhZ3MgJiBGV0xfS0VZRkxBR19TaGlmdDsNCisgIEZYX0JPT0wgYkN0cmwgPSBwTXNnLT5tX2R3RmxhZ3MgJiBGV0xfS0VZRkxBR19DdHJsOw0KKyAgRlhfRFdPUkQgZHdLZXlDb2RlID0gcE1zZy0+bV9kd0tleUNvZGU7DQorICBzd2l0Y2ggKGR3S2V5Q29kZSkgew0KKyAgICBjYXNlIEZXTF9WS0VZX0xlZnQ6IHsNCisgICAgICBNb3ZlQ2FyZXQgPSBNQ19MZWZ0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6IHsNCisgICAgICBNb3ZlQ2FyZXQgPSBNQ19SaWdodDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9WS0VZX1VwOiB7DQorICAgICAgTW92ZUNhcmV0ID0gTUNfVXA7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfVktFWV9Eb3duOiB7DQorICAgICAgTW92ZUNhcmV0ID0gTUNfRG93bjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9WS0VZX0hvbWU6IHsNCisgICAgICBpZiAoYkN0cmwpIHsNCisgICAgICAgIE1vdmVDYXJldCA9IE1DX0hvbWU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIE1vdmVDYXJldCA9IE1DX0xpbmVTdGFydDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfVktFWV9FbmQ6IHsNCisgICAgICBpZiAoYkN0cmwpIHsNCisgICAgICAgIE1vdmVDYXJldCA9IE1DX0VuZDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgTW92ZUNhcmV0ID0gTUNfTGluZUVuZDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfVktFWV9JbnNlcnQ6IHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9WS0VZX0RlbGV0ZTogew0KKyAgICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJg0KKyAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkgfHwNCisgICAgICAgICAgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGludDMyX3QgbkNhcmV0ID0gbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRQb3MoKTsNCisjaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pDQorICAgICAgbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+RGVsZXRlKG5DYXJldCwgVFJVRSk7DQorI2Vsc2UNCisgICAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5EZWxldGUobkNhcmV0KTsNCisjZW5kaWYNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9WS0VZX0YyOiB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfVktFWV9UYWI6IHsNCisgICAgICBtX3BPd25lci0+RGlzcGF0Y2hLZXlFdmVudChwTXNnKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyAgICAgIGlmIChwTXNnLT5tX2R3RmxhZ3MgJiBGV0xfS0VZRkxBR19Db21tYW5kKQ0KKyNlbHNlDQorICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmwpDQorI2VuZGlmDQorICAgICAgew0KKyAgICAgICAgaWYgKGR3S2V5Q29kZSA9PSAweDQzIHx8IGR3S2V5Q29kZSA9PSAweDYzKSB7DQorICAgICAgICAgIG1fcE93bmVyLT5Eb0NsaXBib2FyZCgxKTsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3S2V5Q29kZSA9PSAweDU4IHx8IGR3S2V5Q29kZSA9PSAweDc4KSB7DQorICAgICAgICAgIG1fcE93bmVyLT5Eb0NsaXBib2FyZCgyKTsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3S2V5Q29kZSA9PSAweDU2IHx8IGR3S2V5Q29kZSA9PSAweDc2KSB7DQorICAgICAgICAgIG1fcE93bmVyLT5Eb0NsaXBib2FyZCgzKTsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKE1vdmVDYXJldCAhPSBNQ19Nb3ZlTm9uZSkgew0KKyAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5Nb3ZlQ2FyZXRQb3MoTW92ZUNhcmV0LCBiU2hpZnQsIGJDdHJsKTsNCisgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25DaGFyKENGV0xfTXNnS2V5KiBwTXNnKSB7DQorICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkgfHwNCisgICAgICAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wT3duZXItPm1fcEVkdEVuZ2luZSk7DQorICBpbnQzMl90IGlFcnJvciA9IDA7DQorICBGWF9XQ0hBUiBjID0gKEZYX1dDSEFSKXBNc2ctPm1fZHdLZXlDb2RlOw0KKyAgaW50MzJfdCBuQ2FyZXQgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRDYXJldFBvcygpOw0KKyAgc3dpdGNoIChjKSB7DQorICAgIGNhc2UgRldMX1ZLRVlfQmFjazogew0KKyAgICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkRlbGV0ZShuQ2FyZXQsIFRSVUUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgMHgwQTogew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1ZLRVlfRXNjYXBlOiB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfVktFWV9UYWI6IHsNCisgICAgICBpRXJyb3IgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5JbnNlcnQobkNhcmV0LCBMIlx0IiwgMSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46IHsNCisgICAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJg0KKyAgICAgICAgICBGV0xfU1RZTEVFWFRfRURUX1dhbnRSZXR1cm4pIHsNCisgICAgICAgIGlFcnJvciA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkluc2VydChuQ2FyZXQsIEwiXG4iLCAxKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogew0KKyAgICAgIGlmICghbV9wT3duZXItPm1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9OdW1iZXIpIHsNCisgICAgICAgICAgaWYgKCgocE1zZy0+bV9kd0tleUNvZGUgPCBGV0xfVktFWV8wKSAmJg0KKyAgICAgICAgICAgICAgIChwTXNnLT5tX2R3S2V5Q29kZSAhPSAweDJFICYmIHBNc2ctPm1fZHdLZXlDb2RlICE9IDB4MkQpKSB8fA0KKyAgICAgICAgICAgICAgcE1zZy0+bV9kd0tleUNvZGUgPiBGV0xfVktFWV85KSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCFtX3BPd25lci0+VmFsaWRhdGVOdW1iZXJDaGFyKGMpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyAgICAgIGlmIChwTXNnLT5tX2R3RmxhZ3MgJiBGV0xfS0VZRkxBR19Db21tYW5kKQ0KKyNlbHNlDQorICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmwpDQorI2VuZGlmDQorICAgICAgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlFcnJvciA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkluc2VydChuQ2FyZXQsICZjLCAxKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGlFcnJvciA8IDApIHsNCisgICAgbV9wT3duZXItPlByb2Nlc3NJbnNlcnRFcnJvcihpRXJyb3IpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblNjcm9sbChJRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBvcykgew0KKyAgQ0ZYX1NpemVGIGZzOw0KKyAgcFNjcm9sbEJhci0+R2V0UmFuZ2UoZnMueCwgZnMueSk7DQorICBGWF9GTE9BVCBpQ3VyUG9zID0gcFNjcm9sbEJhci0+R2V0UG9zKCk7DQorICBGWF9GTE9BVCBmU3RlcCA9IHBTY3JvbGxCYXItPkdldFN0ZXBTaXplKCk7DQorICBzd2l0Y2ggKGR3Q29kZSkgew0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX01pbjogew0KKyAgICAgIGZQb3MgPSBmcy54Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NDQkNPREVfTWF4OiB7DQorICAgICAgZlBvcyA9IGZzLnk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9TdGVwQmFja3dhcmQ6IHsNCisgICAgICBmUG9zIC09IGZTdGVwOw0KKyAgICAgIGlmIChmUG9zIDwgZnMueCArIGZTdGVwIC8gMikgew0KKyAgICAgICAgZlBvcyA9IGZzLng7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NDQkNPREVfU3RlcEZvcndhcmQ6IHsNCisgICAgICBmUG9zICs9IGZTdGVwOw0KKyAgICAgIGlmIChmUG9zID4gZnMueSAtIGZTdGVwIC8gMikgew0KKyAgICAgICAgZlBvcyA9IGZzLnk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NDQkNPREVfUGFnZUJhY2t3YXJkOiB7DQorICAgICAgZlBvcyAtPSBwU2Nyb2xsQmFyLT5HZXRQYWdlU2l6ZSgpOw0KKyAgICAgIGlmIChmUG9zIDwgZnMueCkgew0KKyAgICAgICAgZlBvcyA9IGZzLng7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NDQkNPREVfUGFnZUZvcndhcmQ6IHsNCisgICAgICBmUG9zICs9IHBTY3JvbGxCYXItPkdldFBhZ2VTaXplKCk7DQorICAgICAgaWYgKGZQb3MgPiBmcy55KSB7DQorICAgICAgICBmUG9zID0gZnMueTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9Qb3M6DQorICAgIGNhc2UgRldMX1NDQkNPREVfVHJhY2tQb3M6IHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX0VuZFNjcm9sbDogew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgaWYgKGlDdXJQb3MgIT0gZlBvcykgew0KKyAgICBwU2Nyb2xsQmFyLT5TZXRQb3MoZlBvcyk7DQorICAgIHBTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICBtX3BPd25lci0+VXBkYXRlT2Zmc2V0KHBTY3JvbGxCYXIsIGZQb3MgLSBpQ3VyUG9zKTsNCisgICAgaWYgKG1fcE93bmVyLT5tX3BFZHRFbmdpbmUpIHsNCisgICAgICBtX3BPd25lci0+VXBkYXRlQ2FyZXQoKTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgbV9wT3duZXItPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwgMCwgcmVjdC53aWR0aCArIDIsIHJlY3QuaGVpZ2h0ICsgMik7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6OkRvQ3Vyc29yKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBJRldMX0FkYXB0ZXJOYXRpdmUqIHBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgICBJRldMX0FkYXB0ZXJDdXJzb3JNZ3IqIHBDdXJzb3JNZ3IgPSBwTmF0aXZlLT5HZXRDdXJzb3JNZ3IoKTsNCisgICAgaWYgKE5VTEwgIT0gcEN1cnNvck1ncikgew0KKyAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPQ0KKyAgICAgICAgICBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfSW5wdXRCZWFtKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgfQ0KKyAgfQ0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZm9ybXByb3h5aW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9mb3JtcHJveHlpbXAuY3BwCmluZGV4IDZlY2ZlZWUuLjVkY2JiOGEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9mb3JtcHJveHlpbXAuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9mb3JtcHJveHlpbXAuY3BwCkBAIC0xMSw2MSArMTEsNDggQEAKICNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmgiDQogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfZm9ybWltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9mb3JtcHJveHlpbXAuaCINCi1DRldMX0Zvcm1Qcm94eUltcDo6Q0ZXTF9Gb3JtUHJveHlJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQotICAgIDogQ0ZXTF9Gb3JtSW1wKHBPdXRlcikNCi17DQorQ0ZXTF9Gb3JtUHJveHlJbXA6OkNGV0xfRm9ybVByb3h5SW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9Gb3JtSW1wKHBPdXRlcikge30NCitDRldMX0Zvcm1Qcm94eUltcDo6Q0ZXTF9Gb3JtUHJveHlJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfRm9ybUltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpIHt9DQorQ0ZXTF9Gb3JtUHJveHlJbXA6On5DRldMX0Zvcm1Qcm94eUltcCgpIHt9DQorRldMX0VSUiBDRldMX0Zvcm1Qcm94eUltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICB3c0NsYXNzID0gRldMX0NMQVNTX0Zvcm1Qcm94eTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotQ0ZXTF9Gb3JtUHJveHlJbXA6OkNGV0xfRm9ybVByb3h5SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQotICAgIDogQ0ZXTF9Gb3JtSW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCi17DQorRlhfRFdPUkQgQ0ZXTF9Gb3JtUHJveHlJbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0NMQVNTSEFTSF9Gb3JtUHJveHk7DQogfQ0KLUNGV0xfRm9ybVByb3h5SW1wOjp+Q0ZXTF9Gb3JtUHJveHlJbXAoKQ0KLXsNCitGWF9CT09MIENGV0xfRm9ybVByb3h5SW1wOjpJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Qgew0KKyAgaWYgKHdzQ2xhc3MgPT0gQ0ZYX1dpZGVTdHJpbmdDKEZXTF9DTEFTU19Gb3JtUHJveHkpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfRm9ybUltcDo6SXNJbnN0YW5jZSh3c0NsYXNzKTsNCiB9DQotRldMX0VSUiBDRldMX0Zvcm1Qcm94eUltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgd3NDbGFzcyA9IEZXTF9DTEFTU19Gb3JtUHJveHk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfRm9ybVByb3h5SW1wOjpJbml0aWFsaXplKCkgew0KKyAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRFdPUkQgQ0ZXTF9Gb3JtUHJveHlJbXA6OkdldENsYXNzSUQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfRm9ybVByb3h5Ow0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtUHJveHlJbXA6OkZpbmFsaXplKCkgew0KKyAgaWYgKG1fcERlbGVnYXRlKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQorICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCiB9DQotRlhfQk9PTCBDRldMX0Zvcm1Qcm94eUltcDo6SXNJbnN0YW5jZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2xhc3MpIGNvbnN0DQotew0KLSAgICBpZiAod3NDbGFzcyA9PSBDRlhfV2lkZVN0cmluZ0MoRldMX0NMQVNTX0Zvcm1Qcm94eSkpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX0Zvcm1JbXA6OklzSW5zdGFuY2Uod3NDbGFzcyk7DQorRldMX0VSUiBDRldMX0Zvcm1Qcm94eUltcDo6VXBkYXRlKCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfRm9ybVByb3h5SW1wOjpJbml0aWFsaXplKCkNCi17DQotICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUgKilGWF9ORVcgQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZSh0aGlzKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtUHJveHlJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9Gb3JtUHJveHlJbXA6OkZpbmFsaXplKCkNCi17DQotICAgIGlmICggbV9wRGVsZWdhdGUpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQotICAgICAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpGaW5hbGl6ZSgpOw0KLX0NCi1GV0xfRVJSIENGV0xfRm9ybVByb3h5SW1wOjpVcGRhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfRm9ybVByb3h5SW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZTo6Q0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZShDRldMX0Zvcm1Qcm94eUltcCAqcE93bmVyKQ0KLSAgICA6IG1fcE93bmVyKHBPd25lcikNCi17DQotfQ0KLWludDMyX3QgQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KLXsNCi0gICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gbV9wT3duZXItPm1fcE91dGVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgcmV0dXJuIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZTo6Q0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZShDRldMX0Zvcm1Qcm94eUltcCogcE93bmVyKQ0KKyAgICA6IG1fcE93bmVyKHBPd25lcikge30NCitpbnQzMl90IENGV0xfRm9ybVByb3h5SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gbV9wT3duZXItPm1fcE91dGVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgIHJldHVybiBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfbGlzdGJveGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfbGlzdGJveGltcC5jcHAKaW5kZXggODQ1M2Y0My4uZTIwYWZhMyAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2xpc3Rib3hpbXAuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9saXN0Ym94aW1wLmNwcApAQCAtMTEsMTI0NSArMTEsMTIxNSBAQAogI2luY2x1ZGUgImluY2x1ZGUvZndsX3Njcm9sbGJhcmltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9saXN0Ym94aW1wLmgiDQogI2RlZmluZSBGV0xfTElTVEJPWF9JdGVtVGV4dE1hcmdpbiAyDQotSUZXTF9MaXN0Qm94KiBJRldMX0xpc3RCb3g6OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gbmV3IElGV0xfTGlzdEJveDsNCitJRldMX0xpc3RCb3gqIElGV0xfTGlzdEJveDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBJRldMX0xpc3RCb3g7DQogfQ0KLUlGV0xfTGlzdEJveDo6SUZXTF9MaXN0Qm94KCkNCi17DQorSUZXTF9MaXN0Qm94OjpJRldMX0xpc3RCb3goKSB7DQorICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9MaXN0Qm94Ojp+SUZXTF9MaXN0Qm94KCkgew0KKyAgaWYgKG1fcERhdGEpIHsNCisgICAgZGVsZXRlIChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGE7DQogICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgfQ0KIH0NCi1JRldMX0xpc3RCb3g6On5JRldMX0xpc3RCb3goKQ0KLXsNCi0gICAgaWYgKG1fcERhdGEpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9MaXN0Qm94SW1wKiltX3BEYXRhOw0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQotICAgIH0NCitGV0xfRVJSIElGV0xfTGlzdEJveDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfTGlzdEJveEltcChwT3V0ZXIpOw0KKyAgKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9MaXN0Qm94OjpJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfTGlzdEJveEltcChwT3V0ZXIpOw0KLSAgICAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9MaXN0Qm94SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9MaXN0Qm94OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfTGlzdEJveEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9MaXN0Qm94OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9MaXN0Qm94SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9MaXN0Qm94SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KLSAgICByZXR1cm4gKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQoraW50MzJfdCBJRldMX0xpc3RCb3g6OkNvdW50U2VsSXRlbXMoKSB7DQorICByZXR1cm4gKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5Db3VudFNlbEl0ZW1zKCk7DQogfQ0KLWludDMyX3QgSUZXTF9MaXN0Qm94OjpDb3VudFNlbEl0ZW1zKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkNvdW50U2VsSXRlbXMoKTsNCitGV0xfSExJU1RJVEVNIElGV0xfTGlzdEJveDo6R2V0U2VsSXRlbShpbnQzMl90IG5JbmRleFNlbCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9MaXN0Qm94SW1wKiltX3BEYXRhKS0+R2V0U2VsSXRlbShuSW5kZXhTZWwpOw0KIH0NCi1GV0xfSExJU1RJVEVNIElGV0xfTGlzdEJveDo6R2V0U2VsSXRlbShpbnQzMl90IG5JbmRleFNlbCkNCi17DQotICAgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkdldFNlbEl0ZW0obkluZGV4U2VsKTsNCitpbnQzMl90IElGV0xfTGlzdEJveDo6R2V0U2VsSW5kZXgoaW50MzJfdCBuSW5kZXgpIHsNCisgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkdldFNlbEluZGV4KG5JbmRleCk7DQogfQ0KLWludDMyX3QgSUZXTF9MaXN0Qm94OjpHZXRTZWxJbmRleChpbnQzMl90IG5JbmRleCkNCi17DQotICAgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkdldFNlbEluZGV4KG5JbmRleCk7DQorRldMX0VSUiBJRldMX0xpc3RCb3g6OlNldFNlbEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2VsZWN0KSB7DQorICByZXR1cm4gKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5TZXRTZWxJdGVtKGhJdGVtLCBiU2VsZWN0KTsNCiB9DQotRldMX0VSUglJRldMX0xpc3RCb3g6OlNldFNlbEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2VsZWN0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9MaXN0Qm94SW1wKiltX3BEYXRhKS0+U2V0U2VsSXRlbShoSXRlbSwgYlNlbGVjdCk7DQorRldMX0VSUiBJRldMX0xpc3RCb3g6OkdldEl0ZW1UZXh0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KIH0NCi1GV0xfRVJSCUlGV0xfTGlzdEJveDo6R2V0SXRlbVRleHQoRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCi17DQotICAgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KK0ZXTF9FUlIgSUZXTF9MaXN0Qm94OjpHZXRTY3JvbGxQb3MoRlhfRkxPQVQmIGZQb3MsIEZYX0JPT0wgYlZlcnQpIHsNCisgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPkdldFNjcm9sbFBvcyhmUG9zLCBiVmVydCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9MaXN0Qm94OjpHZXRTY3JvbGxQb3MoRlhfRkxPQVQgJmZQb3MsIEZYX0JPT0wgYlZlcnQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5HZXRTY3JvbGxQb3MoZlBvcywgYlZlcnQpOw0KK0ZXTF9FUlIqIElGV0xfTGlzdEJveDo6U29ydChJRldMX0xpc3RCb3hDb21wYXJlKiBwQ29tKSB7DQorICByZXR1cm4gKChDRldMX0xpc3RCb3hJbXAqKW1fcERhdGEpLT5Tb3J0KHBDb20pOw0KIH0NCi1GV0xfRVJSKiBJRldMX0xpc3RCb3g6OlNvcnQoSUZXTF9MaXN0Qm94Q29tcGFyZSAqcENvbSkNCi17DQotICAgIHJldHVybiAoKENGV0xfTGlzdEJveEltcCopbV9wRGF0YSktPlNvcnQocENvbSk7DQorQ0ZXTF9MaXN0Qm94SW1wOjpDRldMX0xpc3RCb3hJbXAoSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwT3V0ZXIpLA0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXIoTlVMTCksDQorICAgICAgbV9wVmVydFNjcm9sbEJhcihOVUxMKSwNCisgICAgICBtX2R3VFRPU3R5bGVzKDApLA0KKyAgICAgIG1faVRUT0FsaWducygwKSwNCisgICAgICBtX2hBbmNob3IoTlVMTCksDQorICAgICAgbV9mU2NvcmxsQmFyV2lkdGgoMCksDQorICAgICAgbV9iTEJ1dHRvbkRvd24oRkFMU0UpLA0KKyAgICAgIG1fcFNjcm9sbEJhclRQKE5VTEwpIHsNCisgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgIG1fcnRDb25lbnQuUmVzZXQoKTsNCisgIG1fcnRTdGF0aWMuUmVzZXQoKTsNCiB9DQotQ0ZXTF9MaXN0Qm94SW1wOjpDRldMX0xpc3RCb3hJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQotICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KLSAgICAsIG1fcEhvcnpTY3JvbGxCYXIoTlVMTCkNCi0gICAgLCBtX3BWZXJ0U2Nyb2xsQmFyKE5VTEwpDQotICAgICwgbV9kd1RUT1N0eWxlcygwKQ0KLSAgICAsIG1faVRUT0FsaWducygwKQ0KLSAgICAsIG1faEFuY2hvcihOVUxMKQ0KLSAgICAsIG1fZlNjb3JsbEJhcldpZHRoKDApDQotICAgICwgbV9iTEJ1dHRvbkRvd24oRkFMU0UpDQotICAgICwgbV9wU2Nyb2xsQmFyVFAoTlVMTCkNCi17DQotICAgIG1fcnRDbGllbnQuUmVzZXQoKTsNCi0gICAgbV9ydENvbmVudC5SZXNldCgpOw0KLSAgICBtX3J0U3RhdGljLlJlc2V0KCk7DQorQ0ZXTF9MaXN0Qm94SW1wOjpDRldMX0xpc3RCb3hJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyKE5VTEwpLA0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXIoTlVMTCksDQorICAgICAgbV9kd1RUT1N0eWxlcygwKSwNCisgICAgICBtX2lUVE9BbGlnbnMoMCksDQorICAgICAgbV9oQW5jaG9yKE5VTEwpLA0KKyAgICAgIG1fZlNjb3JsbEJhcldpZHRoKDApLA0KKyAgICAgIG1fYkxCdXR0b25Eb3duKEZBTFNFKSwNCisgICAgICBtX3BTY3JvbGxCYXJUUChOVUxMKSB7DQorICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICBtX3J0Q29uZW50LlJlc2V0KCk7DQorICBtX3J0U3RhdGljLlJlc2V0KCk7DQogfQ0KLUNGV0xfTGlzdEJveEltcDo6Q0ZXTF9MaXN0Qm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQotICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KLSAgICAsIG1fcEhvcnpTY3JvbGxCYXIoTlVMTCkNCi0gICAgLCBtX3BWZXJ0U2Nyb2xsQmFyKE5VTEwpDQotICAgICwgbV9kd1RUT1N0eWxlcygwKQ0KLSAgICAsIG1faVRUT0FsaWducygwKQ0KLSAgICAsIG1faEFuY2hvcihOVUxMKQ0KLSAgICAsIG1fZlNjb3JsbEJhcldpZHRoKDApDQotICAgICwgbV9iTEJ1dHRvbkRvd24oRkFMU0UpDQotICAgICwgbV9wU2Nyb2xsQmFyVFAoTlVMTCkNCi17DQotICAgIG1fcnRDbGllbnQuUmVzZXQoKTsNCi0gICAgbV9ydENvbmVudC5SZXNldCgpOw0KLSAgICBtX3J0U3RhdGljLlJlc2V0KCk7DQorQ0ZXTF9MaXN0Qm94SW1wOjp+Q0ZXTF9MaXN0Qm94SW1wKCkgew0KKyAgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+UmVsZWFzZSgpOw0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPlJlbGVhc2UoKTsNCisgICAgbV9wSG9yelNjcm9sbEJhciA9IE5VTEw7DQorICB9DQogfQ0KLUNGV0xfTGlzdEJveEltcDo6fkNGV0xfTGlzdEJveEltcCgpDQotew0KLSAgICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhciA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCi0gICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcEhvcnpTY3JvbGxCYXIgPSBOVUxMOw0KLSAgICB9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19MaXN0Qm94Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfTGlzdEJveEltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgd3NDbGFzcyA9IEZXTF9DTEFTU19MaXN0Qm94Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRlhfRFdPUkQgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfTGlzdEJveDsNCiB9DQotRlhfRFdPUkQgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCi17DQotICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0xpc3RCb3g7DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OkluaXRpYWxpemUoKSB7DQorICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKUZYX05FVyBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUglDRldMX0xpc3RCb3hJbXA6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfTGlzdEJveEltcERlbGVnYXRlKHRoaXMpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OkZpbmFsaXplKCkgew0KKyAgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+RmluYWxpemUoKTsNCisgIH0NCisgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPkZpbmFsaXplKCk7DQorICB9DQorICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgZGVsZXRlIChDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQorICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCiB9DQotRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OkZpbmFsaXplKCkNCi17DQotICAgIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQotICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5GaW5hbGl6ZSgpOw0KLSAgICB9DQotICAgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQotICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5GaW5hbGl6ZSgpOw0KLSAgICB9DQotICAgIGlmIChtX3BEZWxlZ2F0ZSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQotICAgICAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpGaW5hbGl6ZSgpOw0KLX0NCi1GV0xfRVJSIENGV0xfTGlzdEJveEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCi17DQotICAgIGlmIChiQXV0b1NpemUpIHsNCi0gICAgICAgIHJlY3QuU2V0KDAsIDAsIDAsIDApOw0KLSAgICAgICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQotICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgICAgICB9DQotICAgICAgICBDRlhfU2l6ZUYgZnMgPSBDYWxjU2l6ZShUUlVFKTsNCi0gICAgICAgIHJlY3QuU2V0KDAsIDAsIGZzLngsIGZzLnkpOw0KLSAgICAgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9MaXN0Qm94SW1wOjpVcGRhdGUoKQ0KLXsNCi0gICAgaWYgKElzTG9ja2VkKCkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQotICAgIH0NCitGV0xfRVJSIENGV0xfTGlzdEJveEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBpZiAoYkF1dG9TaXplKSB7DQorICAgIHJlY3QuU2V0KDAsIDAsIDAsIDApOw0KICAgICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCi0gICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KICAgICB9DQotICAgIG1faVRUT0FsaWducyA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KLSAgICBzd2l0Y2gobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfQWxpZ25NYXNrKSB7DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9MVEJfTGVmdEFsaWduOiB7DQotICAgICAgICAgICAgICAgIG1faVRUT0FsaWducyA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfTFRCX1JpZ2h0QWxpZ246IHsNCi0gICAgICAgICAgICAgICAgbV9pVFRPQWxpZ25zID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJSaWdodDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfTFRCX0NlbnRlckFsaWduOg0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbnMgPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCi0gICAgICAgICAgICB9DQorICAgIENGWF9TaXplRiBmcyA9IENhbGNTaXplKFRSVUUpOw0KKyAgICByZWN0LlNldCgwLCAwLCBmcy54LCBmcy55KTsNCisgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OlVwZGF0ZSgpIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBtX2lUVE9BbGlnbnMgPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfQWxpZ25NYXNrKSB7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0xUQl9MZWZ0QWxpZ246IHsNCisgICAgICBtX2lUVE9BbGlnbnMgPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQ7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfV0dUU1RZTEVfUlRMUmVhZGluZykgew0KLSAgICAgICAgbV9kd1RUT1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfUlRMOw0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9MVEJfUmlnaHRBbGlnbjogew0KKyAgICAgIG1faVRUT0FsaWducyA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyUmlnaHQ7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgbV9kd1RUT1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCi0gICAgbV9mU2NvcmxsQmFyV2lkdGggPSBHZXRTY3JvbGxXaWR0aCgpOw0KLSAgICBTb3J0SXRlbSgpOw0KLSAgICBDYWxjU2l6ZSgpOw0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9MVEJfQ2VudGVyQWxpZ246DQorICAgIGRlZmF1bHQ6IHsgbV9pVFRPQWxpZ25zID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7IH0NCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1dHVFNUWUxFX1JUTFJlYWRpbmcpIHsNCisgICAgbV9kd1RUT1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfUlRMOw0KKyAgfQ0KKyAgbV9kd1RUT1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgIG1fZlNjb3JsbEJhcldpZHRoID0gR2V0U2Nyb2xsV2lkdGgoKTsNCisgIFNvcnRJdGVtKCk7DQorICBDYWxjU2l6ZSgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0xpc3RCb3hJbXA6OkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAoSXNTaG93U2Nyb2xsQmFyKEZBTFNFKSkgew0KKyAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9IU2Nyb2xsQmFyOw0KKyAgICB9DQorICB9DQorICBpZiAoSXNTaG93U2Nyb2xsQmFyKFRSVUUpKSB7DQorICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICBpZiAocmVjdC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1ZTY3JvbGxCYXI7DQorICAgIH0NCisgIH0NCisgIGlmIChtX3J0Q2xpZW50LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCisgIH0NCisgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgRldMX1BBUlRfTFRCX0JvcmRlciwgcFRoZW1lLCBwTWF0cml4KTsNCisgIH0NCisgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgRHJhd0VkZ2UocEdyYXBoaWNzLCBGV0xfUEFSVF9MVEJfRWRnZSwgcFRoZW1lLCBwTWF0cml4KTsNCisgIH0NCisgIENGWF9SZWN0RiBydENsaXAobV9ydENvbmVudCk7DQorICBpZiAoSXNTaG93U2Nyb2xsQmFyKEZBTFNFKSkgew0KKyAgICBydENsaXAuaGVpZ2h0IC09IG1fZlNjb3JsbEJhcldpZHRoOw0KKyAgfQ0KKyAgaWYgKElzU2hvd1Njcm9sbEJhcihUUlVFKSkgew0KKyAgICBydENsaXAud2lkdGggLT0gbV9mU2NvcmxsQmFyV2lkdGg7DQorICB9DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQorICB9DQorICBwR3JhcGhpY3MtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTm9CYWNrZ3JvdW5kKSA9PSAwKSB7DQorICAgIERyYXdCa2dyb3VuZChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBEcmF3SXRlbXMocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveEltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBUaGVtZVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKCFwVGhlbWVQcm92aWRlci0+SXNWYWxpZFdpZGdldChtX3BJbnRlcmZhY2UpKSB7DQorICAgIG1fcFNjcm9sbEJhclRQID0gcFRoZW1lUHJvdmlkZXI7DQogICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBwVGhlbWVQcm92aWRlcjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRFdPUkQgQ0ZXTF9MaXN0Qm94SW1wOjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIGlmIChJc1Nob3dTY3JvbGxCYXIoRkFMU0UpKSB7DQotICAgICAgICBDRlhfUmVjdEYgcmVjdDsNCi0gICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocmVjdCk7DQotICAgICAgICBpZiAocmVjdC5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0hTY3JvbGxCYXI7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKElzU2hvd1Njcm9sbEJhcihUUlVFKSkgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQotICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KLSAgICAgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9WU2Nyb2xsQmFyOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChtX3J0Q2xpZW50LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQotfQ0KLUZXTF9FUlIgQ0ZXTF9MaXN0Qm94SW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCi0gICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBpZiAoSGFzQm9yZGVyKCkpIHsNCi0gICAgICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9MVEJfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIGlmIChIYXNFZGdlKCkpIHsNCi0gICAgICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfTFRCX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGIHJ0Q2xpcChtX3J0Q29uZW50KTsNCi0gICAgaWYgKElzU2hvd1Njcm9sbEJhcihGQUxTRSkpIHsNCi0gICAgICAgIHJ0Q2xpcC5oZWlnaHQgLT0gbV9mU2NvcmxsQmFyV2lkdGg7DQotICAgIH0NCi0gICAgaWYgKElzU2hvd1Njcm9sbEJhcihUUlVFKSkgew0KLSAgICAgICAgcnRDbGlwLndpZHRoIC09IG1fZlNjb3JsbEJhcldpZHRoOw0KLSAgICB9DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQotICAgIH0NCi0gICAgcEdyYXBoaWNzLT5TZXRDbGlwUmVjdChydENsaXApOw0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTm9CYWNrZ3JvdW5kKSA9PSAwKSB7DQotICAgICAgICBEcmF3Qmtncm91bmQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIERyYXdJdGVtcyhwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfTGlzdEJveEltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZVByb3ZpZGVyKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKCFwVGhlbWVQcm92aWRlci0+SXNWYWxpZFdpZGdldChtX3BJbnRlcmZhY2UpKSB7DQotICAgICAgICBtX3BTY3JvbGxCYXJUUCA9IHBUaGVtZVByb3ZpZGVyOw0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLSAgICB9DQotICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBwVGhlbWVQcm92aWRlcjsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1pbnQzMl90IENGV0xfTGlzdEJveEltcDo6Q291bnRTZWxJdGVtcygpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgMCk7DQotICAgIGludDMyX3QgaVJldCA9IDA7DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQotICAgICAgICBpZiAoIWhJdGVtKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBGWF9EV09SRCBkd1N0eWxlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQotICAgICAgICBpZiAoZHdTdHlsZSAmIEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkKSB7DQotICAgICAgICAgICAgaVJldCArKzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaVJldDsNCi19DQotRldMX0hMSVNUSVRFTSBDRldMX0xpc3RCb3hJbXA6OkdldFNlbEl0ZW0oaW50MzJfdCBuSW5kZXhTZWwpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgTlVMTCk7DQotICAgIGludDMyX3QgaW5kZXggPSAwOw0KLSAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KLSAgICAgICAgaWYgKCFoSXRlbSkgew0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRFdPUkQgZHdTdHlsZSA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KLSAgICAgICAgaWYgKGR3U3R5bGUgJiBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZCkgew0KLSAgICAgICAgICAgIGlmIChpbmRleCA9PSBuSW5kZXhTZWwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhJdGVtOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGluZGV4ICsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotaW50MzJfdCBDRldMX0xpc3RCb3hJbXA6OkdldFNlbEluZGV4KGludDMyX3QgbkluZGV4KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIsIC0xKTsNCi0gICAgaW50MzJfdCBpbmRleCA9IDA7DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQotICAgICAgICBpZiAoIWhJdGVtKSB7DQotICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRFdPUkQgZHdTdHlsZSA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KLSAgICAgICAgaWYgKGR3U3R5bGUgJiBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZCkgew0KLSAgICAgICAgICAgIGlmIChpbmRleCA9PSBuSW5kZXgpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaW5kZXggKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiAtMTsNCi19DQotRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OlNldFNlbEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2VsZWN0ICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KK2ludDMyX3QgQ0ZXTF9MaXN0Qm94SW1wOjpDb3VudFNlbEl0ZW1zKCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIsIDApOw0KKyAgaW50MzJfdCBpUmV0ID0gMDsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQogICAgIGlmICghaEl0ZW0pIHsNCi0gICAgICAgIGlmIChiU2VsZWN0KSB7DQotICAgICAgICAgICAgU2VsZWN0QWxsKCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENsZWFyU2VsZWN0aW9uKCk7DQotICAgICAgICAgICAgU2V0Rm9jdXNJdGVtKE5VTEwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlTZWxlY3Rpb24pIHsNCi0gICAgICAgIFNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgYlNlbGVjdCk7DQorICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBwRGF0YS0+R2V0SXRlbVN0eWxlcyhtX3BJbnRlcmZhY2UsIGhJdGVtKTsNCisgICAgaWYgKGR3U3R5bGUgJiBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZCkgew0KKyAgICAgIGlSZXQrKzsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlSZXQ7DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94SW1wOjpHZXRTZWxJdGVtKGludDMyX3QgbkluZGV4U2VsKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgTlVMTCk7DQorICBpbnQzMl90IGluZGV4ID0gMDsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgIGlmICghaEl0ZW0pIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd1N0eWxlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgIGlmIChkd1N0eWxlICYgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQpIHsNCisgICAgICBpZiAoaW5kZXggPT0gbkluZGV4U2VsKSB7DQorICAgICAgICByZXR1cm4gaEl0ZW07DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGluZGV4Kys7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDRldMX0xpc3RCb3hJbXA6OkdldFNlbEluZGV4KGludDMyX3QgbkluZGV4KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgLTEpOw0KKyAgaW50MzJfdCBpbmRleCA9IDA7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICBpZiAoIWhJdGVtKSB7DQorICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBwRGF0YS0+R2V0SXRlbVN0eWxlcyhtX3BJbnRlcmZhY2UsIGhJdGVtKTsNCisgICAgaWYgKGR3U3R5bGUgJiBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZCkgew0KKyAgICAgIGlmIChpbmRleCA9PSBuSW5kZXgpIHsNCisgICAgICAgIHJldHVybiBpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpbmRleCsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIC0xOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveEltcDo6U2V0U2VsSXRlbShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTZWxlY3QpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKCFoSXRlbSkgew0KKyAgICBpZiAoYlNlbGVjdCkgew0KKyAgICAgIFNlbGVjdEFsbCgpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgU2V0U2VsZWN0aW9uKGhJdGVtLCBoSXRlbSwgYlNlbGVjdCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfTGlzdEJveEltcDo6R2V0SXRlbVRleHQoRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcERhdGEtPkdldEl0ZW1UZXh0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHdzVGV4dCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUglDRldMX0xpc3RCb3hJbXA6OkdldFNjcm9sbFBvcyhGWF9GTE9BVCAmZlBvcywgRlhfQk9PTCBiVmVydCApDQotew0KLSAgICBpZiAoKGJWZXJ0ICYmIElzU2hvd1Njcm9sbEJhcihUUlVFKSkgfHwgKCFiVmVydCAmJiBJc1Nob3dTY3JvbGxCYXIoRkFMU0UpKSkgew0KLSAgICAgICAgSUZXTF9TY3JvbGxCYXIgKnBTY3JvbGxCYXIgPSBiVmVydCA/IG1fcFZlcnRTY3JvbGxCYXIgOiBtX3BIb3J6U2Nyb2xsQmFyOw0KLSAgICAgICAgZlBvcyA9IHBTY3JvbGxCYXItPkdldFBvcygpOw0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgIENsZWFyU2VsZWN0aW9uKCk7DQorICAgICAgU2V0Rm9jdXNJdGVtKE5VTEwpOw0KICAgICB9DQogICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlTZWxlY3Rpb24pIHsNCisgICAgU2V0U2VsZWN0aW9uRGlyZWN0KGhJdGVtLCBiU2VsZWN0KTsNCisgIH0gZWxzZSB7DQorICAgIFNldFNlbGVjdGlvbihoSXRlbSwgaEl0ZW0sIGJTZWxlY3QpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSKiBDRldMX0xpc3RCb3hJbXA6OlNvcnQoSUZXTF9MaXN0Qm94Q29tcGFyZSAqcENvbSkNCi17DQotICAgIEZXTF9ITElTVElURU0gaFRlbXA7DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBpbnQzMl90IHN6ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc3ogLSAxOyBpKyspIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBqID0gaSArIDE7IGogPCBzejsgaisrKSB7DQotICAgICAgICAgICAgaWYgKHBDb20tPkNvbXBhcmUocERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKSwgcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBqKSkgPiAwKSB7DQotICAgICAgICAgICAgICAgIGhUZW1wID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCi0gICAgICAgICAgICAgICAgcERhdGEtPlNldEl0ZW1JbmRleChtX3BJbnRlcmZhY2UsIHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaiksIGkpOw0KLSAgICAgICAgICAgICAgICBwRGF0YS0+U2V0SXRlbUluZGV4KG1fcEludGVyZmFjZSwgaFRlbXAsIGopOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRJdGVtVGV4dChGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHBEYXRhLT5HZXRJdGVtVGV4dChtX3BJbnRlcmZhY2UsIGhJdGVtLCB3c1RleHQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveEltcDo6R2V0U2Nyb2xsUG9zKEZYX0ZMT0FUJiBmUG9zLCBGWF9CT09MIGJWZXJ0KSB7DQorICBpZiAoKGJWZXJ0ICYmIElzU2hvd1Njcm9sbEJhcihUUlVFKSkgfHwgKCFiVmVydCAmJiBJc1Nob3dTY3JvbGxCYXIoRkFMU0UpKSkgew0KKyAgICBJRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciA9IGJWZXJ0ID8gbV9wVmVydFNjcm9sbEJhciA6IG1fcEhvcnpTY3JvbGxCYXI7DQorICAgIGZQb3MgPSBwU2Nyb2xsQmFyLT5HZXRQb3MoKTsNCiAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCiB9DQotRldMX0hMSVNUSVRFTSBDRldMX0xpc3RCb3hJbXA6OkdldEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfRFdPUkQgZHdLZXlDb2RlKQ0KLXsNCi0gICAgRldMX0hMSVNUSVRFTSBoUmV0ID0gTlVMTDsNCi0gICAgc3dpdGNoKGR3S2V5Q29kZSkgew0KLSAgICAgICAgY2FzZSBGV0xfVktFWV9VcDoNCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfRG93bjoNCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfSG9tZToNCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfRW5kOiB7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVwID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX1VwOw0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJEb3duID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX0Rvd247DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhvbWUgPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfSG9tZTsNCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5kID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX0VuZDsNCi0gICAgICAgICAgICAgICAgSUZXTF9MaXN0Qm94RFAgKnBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaURzdEl0ZW0gPSAtMTsNCi0gICAgICAgICAgICAgICAgaWYgKGJVcCB8fCBiRG93bikgew0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleCA9IHBEYXRhLT5HZXRJdGVtSW5kZXgobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQotICAgICAgICAgICAgICAgICAgICBpRHN0SXRlbSA9IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9VcCA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiSG9tZSkgew0KLSAgICAgICAgICAgICAgICAgICAgaURzdEl0ZW0gPSAwOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KLSAgICAgICAgICAgICAgICAgICAgaURzdEl0ZW0gPSBpQ291bnQgLSAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGhSZXQgPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGlEc3RJdGVtKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCitGV0xfRVJSKiBDRldMX0xpc3RCb3hJbXA6OlNvcnQoSUZXTF9MaXN0Qm94Q29tcGFyZSogcENvbSkgew0KKyAgRldMX0hMSVNUSVRFTSBoVGVtcDsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgaW50MzJfdCBzeiA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzeiAtIDE7IGkrKykgew0KKyAgICBmb3IgKGludDMyX3QgaiA9IGkgKyAxOyBqIDwgc3o7IGorKykgew0KKyAgICAgIGlmIChwQ29tLT5Db21wYXJlKHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSksDQorICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBqKSkgPiAwKSB7DQorICAgICAgICBoVGVtcCA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgICAgICBwRGF0YS0+U2V0SXRlbUluZGV4KG1fcEludGVyZmFjZSwgcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBqKSwgaSk7DQorICAgICAgICBwRGF0YS0+U2V0SXRlbUluZGV4KG1fcEludGVyZmFjZSwgaFRlbXAsIGopOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gaFJldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotdm9pZCBDRldMX0xpc3RCb3hJbXA6OlNldFNlbGVjdGlvbihGV0xfSExJU1RJVEVNIGhTdGFydCwgRldMX0hMSVNUSVRFTSBoRW5kLCBGWF9CT09MIGJTZWxlY3RlZCkNCi17DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBpbnQzMl90IGlTdGFydCA9IHBEYXRhLT5HZXRJdGVtSW5kZXgobV9wSW50ZXJmYWNlLCBoU3RhcnQpOw0KLSAgICBpbnQzMl90IGlFbmQgPSBwRGF0YS0+R2V0SXRlbUluZGV4KG1fcEludGVyZmFjZSwgaEVuZCk7DQotICAgIGlmIChpU3RhcnQgPiBpRW5kKSB7DQotICAgICAgICBpbnQzMl90IGlUZW1wID0gaVN0YXJ0Ow0KLSAgICAgICAgaVN0YXJ0ID0gaUVuZDsNCi0gICAgICAgIGlFbmQgPSBpVGVtcDsNCi0gICAgfQ0KLSAgICBpZiAoYlNlbGVjdGVkKSB7DQorRldMX0hMSVNUSVRFTSBDRldMX0xpc3RCb3hJbXA6OkdldEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0tleUNvZGUpIHsNCisgIEZXTF9ITElTVElURU0gaFJldCA9IE5VTEw7DQorICBzd2l0Y2ggKGR3S2V5Q29kZSkgew0KKyAgICBjYXNlIEZXTF9WS0VZX1VwOg0KKyAgICBjYXNlIEZXTF9WS0VZX0Rvd246DQorICAgIGNhc2UgRldMX1ZLRVlfSG9tZToNCisgICAgY2FzZSBGV0xfVktFWV9FbmQ6IHsNCisgICAgICBGWF9CT09MIGJVcCA9IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9VcDsNCisgICAgICBGWF9CT09MIGJEb3duID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX0Rvd247DQorICAgICAgRlhfQk9PTCBiSG9tZSA9IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9Ib21lOw0KKyAgICAgIEZYX0JPT0wgYkVuZCA9IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9FbmQ7DQorICAgICAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgICAgaW50MzJfdCBpRHN0SXRlbSA9IC0xOw0KKyAgICAgIGlmIChiVXAgfHwgYkRvd24pIHsNCisgICAgICAgIGludDMyX3QgaW5kZXggPSBwRGF0YS0+R2V0SXRlbUluZGV4KG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KKyAgICAgICAgaURzdEl0ZW0gPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfVXAgPyBpbmRleCAtIDEgOiBpbmRleCArIDE7DQorICAgICAgfSBlbHNlIGlmIChiSG9tZSkgew0KKyAgICAgICAgaURzdEl0ZW0gPSAwOw0KKyAgICAgIH0gZWxzZSB7DQogICAgICAgICBpbnQzMl90IGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKyApIHsNCi0gICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCi0gICAgICAgICAgICBTZXRTZWxlY3Rpb25EaXJlY3QoaEl0ZW0sIEZBTFNFKTsNCi0gICAgICAgIH0NCisgICAgICAgIGlEc3RJdGVtID0gaUNvdW50IC0gMTsNCisgICAgICB9DQorICAgICAgaFJldCA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaURzdEl0ZW0pOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGZvciAoOyBpU3RhcnQgPD0gaUVuZDsgaVN0YXJ0KyspIHsNCi0gICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGlTdGFydCk7DQotICAgICAgICBTZXRTZWxlY3Rpb25EaXJlY3QoaEl0ZW0sIGJTZWxlY3RlZCk7DQotICAgIH0NCisgICAgZGVmYXVsdDoge30NCisgIH0NCisgIHJldHVybiBoUmV0Ow0KIH0NCi12b2lkIENGV0xfTGlzdEJveEltcDo6U2V0U2VsZWN0aW9uRGlyZWN0KEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCkNCi17DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBGWF9EV09SRCBkd09sZFN0eWxlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQotICAgIGJTZWxlY3QgPyBkd09sZFN0eWxlIHw9IEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZHdPbGRTdHlsZSAmPSB+RldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQ7DQotICAgIHBEYXRhLT5TZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0sIGR3T2xkU3R5bGUpOw0KLX0NCi1GWF9CT09MCUNGV0xfTGlzdEJveEltcDo6SXNJdGVtU2VsZWN0ZWQoRldMX0hMSVNUSVRFTSBoSXRlbSkNCi17DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBGWF9EV09SRCBkd1N0YXRlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQotICAgIHJldHVybiAoZHdTdGF0ZSAmIEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkKSAhPSAwOw0KLX0NCi12b2lkIENGV0xfTGlzdEJveEltcDo6Q2xlYXJTZWxlY3Rpb24oKQ0KLXsNCi0gICAgRlhfQk9PTCBiTXVsdGkgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbjsNCi0gICAgSUZXTF9MaXN0Qm94RFAgKnBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKysgKSB7DQotICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCi0gICAgICAgIEZYX0RXT1JEIGR3U3RhdGUgPSBwRGF0YS0+R2V0SXRlbVN0eWxlcyhtX3BJbnRlcmZhY2UsIGhJdGVtKTsNCi0gICAgICAgIEZYX0JPT0wgYkZpbmRTZWwgPSBkd1N0YXRlICYgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQ7DQotICAgICAgICBpZiAoIWJGaW5kU2VsKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBTZXRTZWxlY3Rpb25EaXJlY3QoaEl0ZW0sIEZBTFNFKTsNCi0gICAgICAgIGlmICghYk11bHRpKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpTZWxlY3RBbGwoKQ0KLXsNCi0gICAgRlhfQk9PTCBiTXVsdGkgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbjsNCi0gICAgaWYgKCFiTXVsdGkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KLSAgICBpZiAoaUNvdW50ID4gMCkgew0KLSAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbVN0YXJ0ID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCAwKTsNCi0gICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW1FbmQgPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGlDb3VudCAtIDEpOw0KLSAgICAgICAgU2V0U2VsZWN0aW9uKGhJdGVtU3RhcnQsIGhJdGVtRW5kLCBGQUxTRSk7DQotICAgIH0NCi19DQotRldMX0hMSVNUSVRFTSBDRldMX0xpc3RCb3hJbXA6OkdldEZvY3VzZWRJdGVtKCkNCi17DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpTZXRTZWxlY3Rpb24oRldMX0hMSVNUSVRFTSBoU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhFbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWxlY3RlZCkgew0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICBpbnQzMl90IGlTdGFydCA9IHBEYXRhLT5HZXRJdGVtSW5kZXgobV9wSW50ZXJmYWNlLCBoU3RhcnQpOw0KKyAgaW50MzJfdCBpRW5kID0gcERhdGEtPkdldEl0ZW1JbmRleChtX3BJbnRlcmZhY2UsIGhFbmQpOw0KKyAgaWYgKGlTdGFydCA+IGlFbmQpIHsNCisgICAgaW50MzJfdCBpVGVtcCA9IGlTdGFydDsNCisgICAgaVN0YXJ0ID0gaUVuZDsNCisgICAgaUVuZCA9IGlUZW1wOw0KKyAgfQ0KKyAgaWYgKGJTZWxlY3RlZCkgew0KICAgICBpbnQzMl90IGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCi0gICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIE5VTEwpOw0KLSAgICAgICAgaWYgKHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0pICYgRldMX0lURU1TVEFURV9MVEJfRm9jdXNlZCkgew0KLSAgICAgICAgICAgIHJldHVybiBoSXRlbTsNCi0gICAgICAgIH0NCisgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCisgICAgICBTZXRTZWxlY3Rpb25EaXJlY3QoaEl0ZW0sIEZBTFNFKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGZvciAoOyBpU3RhcnQgPD0gaUVuZDsgaVN0YXJ0KyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaVN0YXJ0KTsNCisgICAgU2V0U2VsZWN0aW9uRGlyZWN0KGhJdGVtLCBiU2VsZWN0ZWQpOw0KKyAgfQ0KIH0NCi12b2lkIENGV0xfTGlzdEJveEltcDo6U2V0Rm9jdXNJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgRldMX0hMSVNUSVRFTSBoRm9jdXMgPSBHZXRGb2N1c2VkSXRlbSgpOw0KLSAgICBpZiAoaEl0ZW0gIT0gaEZvY3VzKSB7DQotICAgICAgICBpZiAoaEZvY3VzKSB7DQotICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZSA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEZvY3VzKTsNCi0gICAgICAgICAgICBkd1N0eWxlICY9IH5GV0xfSVRFTVNUQVRFX0xUQl9Gb2N1c2VkOw0KLSAgICAgICAgICAgIHBEYXRhLT5TZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEZvY3VzLCBkd1N0eWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChoSXRlbSkgew0KLSAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBwRGF0YS0+R2V0SXRlbVN0eWxlcyhtX3BJbnRlcmZhY2UsIGhJdGVtKTsNCi0gICAgICAgICAgICBkd1N0eWxlIHw9IEZXTF9JVEVNU1RBVEVfTFRCX0ZvY3VzZWQ7DQotICAgICAgICAgICAgcERhdGEtPlNldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSwgZHdTdHlsZSk7DQotICAgICAgICB9DQotICAgIH0NCit2b2lkIENGV0xfTGlzdEJveEltcDo6U2V0U2VsZWN0aW9uRGlyZWN0KEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCkgew0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICBGWF9EV09SRCBkd09sZFN0eWxlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICBiU2VsZWN0ID8gZHdPbGRTdHlsZSB8PSBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZA0KKyAgICAgICAgICA6IGR3T2xkU3R5bGUgJj0gfkZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkOw0KKyAgcERhdGEtPlNldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSwgZHdPbGRTdHlsZSk7DQogfQ0KLUZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94SW1wOjpHZXRJdGVtQXRQb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBmeCAtPSBtX3J0Q29uZW50LmxlZnQsIGZ5IC09IG1fcnRDb25lbnQudG9wOw0KLSAgICBGWF9GTE9BVCBmUG9zWCA9IDAuMGY7DQotICAgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQotICAgICAgICBmUG9zWCA9IG1fcEhvcnpTY3JvbGxCYXItPkdldFBvcygpOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZQb3NZID0gMC4wOw0KLSAgICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KLSAgICAgICAgZlBvc1kgPSBtX3BWZXJ0U2Nyb2xsQmFyLT5HZXRQb3MoKTsNCi0gICAgfQ0KLSAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KLSAgICAgICAgaWYgKCFoSXRlbSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCi0gICAgICAgIHBEYXRhLT5HZXRJdGVtUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydEl0ZW0pOw0KLSAgICAgICAgcnRJdGVtLk9mZnNldCgtZlBvc1gsIC1mUG9zWSk7DQotICAgICAgICBpZiAocnRJdGVtLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gaEl0ZW07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorRlhfQk9PTCBDRldMX0xpc3RCb3hJbXA6OklzSXRlbVNlbGVjdGVkKEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgRlhfRFdPUkQgZHdTdGF0ZSA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KKyAgcmV0dXJuIChkd1N0YXRlICYgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQpICE9IDA7DQogfQ0KLUZYX0JPT0wJQ0ZXTF9MaXN0Qm94SW1wOjpHZXRJdGVtQ2hlY2tSZWN0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9SZWN0RiAmcnRDaGVjaykNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGQUxTRSk7DQotICAgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX0NoZWNrKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpDbGVhclNlbGVjdGlvbigpIHsNCisgIEZYX0JPT0wgYk11bHRpID0NCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbjsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgIEZYX0RXT1JEIGR3U3RhdGUgPSBwRGF0YS0+R2V0SXRlbVN0eWxlcyhtX3BJbnRlcmZhY2UsIGhJdGVtKTsNCisgICAgRlhfQk9PTCBiRmluZFNlbCA9IGR3U3RhdGUgJiBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZDsNCisgICAgaWYgKCFiRmluZFNlbCkgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBwRGF0YS0+R2V0SXRlbUNoZWNrUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydENoZWNrKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIFNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgRkFMU0UpOw0KKyAgICBpZiAoIWJNdWx0aSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KIH0NCi1GWF9CT09MCUNGV0xfTGlzdEJveEltcDo6R2V0SXRlbUNoZWNrZWQoRldMX0hMSVNUSVRFTSBoSXRlbSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGQUxTRSk7DQotICAgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX0NoZWNrKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICByZXR1cm4gKHBEYXRhLT5HZXRJdGVtQ2hlY2tTdGF0ZShtX3BJbnRlcmZhY2UsIGhJdGVtKSAmIEZXTF9JVEVNU1RBVEVfTFRCX0NoZWNrZWQpOw0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpTZWxlY3RBbGwoKSB7DQorICBGWF9CT09MIGJNdWx0aSA9DQorICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlTZWxlY3Rpb247DQorICBpZiAoIWJNdWx0aSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgIGlmIChpQ291bnQgPiAwKSB7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW1TdGFydCA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgMCk7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW1FbmQgPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGlDb3VudCAtIDEpOw0KKyAgICBTZXRTZWxlY3Rpb24oaEl0ZW1TdGFydCwgaEl0ZW1FbmQsIEZBTFNFKTsNCisgIH0NCiB9DQotRlhfQk9PTAlDRldMX0xpc3RCb3hJbXA6OlNldEl0ZW1DaGVja2VkKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYkNoZWNrZWQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgRkFMU0UpOw0KLSAgICBpZiAoIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9DaGVjaykpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCitGV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveEltcDo6R2V0Rm9jdXNlZEl0ZW0oKSB7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBOVUxMKTsNCisgICAgaWYgKHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0pICYgRldMX0lURU1TVEFURV9MVEJfRm9jdXNlZCkgew0KKyAgICAgIHJldHVybiBoSXRlbTsNCiAgICAgfQ0KLSAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgRlhfRFdPUkQgZHdDaGVja1N0YXRlID0gcERhdGEtPkdldEl0ZW1DaGVja1N0YXRlKG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KLSAgICBpZiAoYkNoZWNrZWQpIHsNCi0gICAgICAgIHBEYXRhLT5TZXRJdGVtQ2hlY2tTdGF0ZShtX3BJbnRlcmZhY2UsIGhJdGVtLCBGV0xfSVRFTVNUQVRFX0xUQl9DaGVja2VkKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBEYXRhLT5TZXRJdGVtQ2hlY2tTdGF0ZShtX3BJbnRlcmZhY2UsIGhJdGVtLCAwKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1GWF9CT09MCUNGV0xfTGlzdEJveEltcDo6U2Nyb2xsVG9WaXNpYmxlKEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFZlcnRTY3JvbGxCYXIsIEZBTFNFKTsNCit2b2lkIENGV0xfTGlzdEJveEltcDo6U2V0Rm9jdXNJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgRldMX0hMSVNUSVRFTSBoRm9jdXMgPSBHZXRGb2N1c2VkSXRlbSgpOw0KKyAgaWYgKGhJdGVtICE9IGhGb2N1cykgew0KKyAgICBpZiAoaEZvY3VzKSB7DQorICAgICAgRlhfRFdPUkQgZHdTdHlsZSA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEZvY3VzKTsNCisgICAgICBkd1N0eWxlICY9IH5GV0xfSVRFTVNUQVRFX0xUQl9Gb2N1c2VkOw0KKyAgICAgIHBEYXRhLT5TZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEZvY3VzLCBkd1N0eWxlKTsNCisgICAgfQ0KKyAgICBpZiAoaEl0ZW0pIHsNCisgICAgICBGWF9EV09SRCBkd1N0eWxlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgICAgZHdTdHlsZSB8PSBGV0xfSVRFTVNUQVRFX0xUQl9Gb2N1c2VkOw0KKyAgICAgIHBEYXRhLT5TZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0sIGR3U3R5bGUpOw0KKyAgICB9DQorICB9DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94SW1wOjpHZXRJdGVtQXRQb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGZ4IC09IG1fcnRDb25lbnQubGVmdCwgZnkgLT0gbV9ydENvbmVudC50b3A7DQorICBGWF9GTE9BVCBmUG9zWCA9IDAuMGY7DQorICBpZiAobV9wSG9yelNjcm9sbEJhcikgew0KKyAgICBmUG9zWCA9IG1fcEhvcnpTY3JvbGxCYXItPkdldFBvcygpOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlBvc1kgPSAwLjA7DQorICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICBmUG9zWSA9IG1fcFZlcnRTY3JvbGxCYXItPkdldFBvcygpOw0KKyAgfQ0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICBpbnQzMl90IG5Db3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCisgICAgaWYgKCFoSXRlbSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQogICAgIENGWF9SZWN0RiBydEl0ZW07DQotICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KICAgICBwRGF0YS0+R2V0SXRlbVJlY3QobV9wSW50ZXJmYWNlLCBoSXRlbSwgcnRJdGVtKTsNCi0gICAgRlhfQk9PTCBiU2Nyb2xsID0gRkFMU0U7DQotICAgIEZYX0ZMT0FUIGZQb3NZID0gbV9wVmVydFNjcm9sbEJhci0+R2V0UG9zKCk7DQotICAgIHJ0SXRlbS5PZmZzZXQoMCwgLSBmUG9zWSArIG1fcnRDb25lbnQudG9wKTsNCi0gICAgaWYgKHJ0SXRlbS50b3AgPCBtX3J0Q29uZW50LnRvcCkgew0KLSAgICAgICAgZlBvc1kgKz0gcnRJdGVtLnRvcCAtIG1fcnRDb25lbnQudG9wOw0KLSAgICAgICAgYlNjcm9sbCA9IFRSVUU7DQotICAgIH0gZWxzZSBpZiAocnRJdGVtLmJvdHRvbSgpID4gbV9ydENvbmVudC5ib3R0b20oKSkgew0KLSAgICAgICAgZlBvc1kgKz0gcnRJdGVtLmJvdHRvbSgpIC0gbV9ydENvbmVudC5ib3R0b20oKTsNCi0gICAgICAgIGJTY3JvbGwgPSBUUlVFOw0KKyAgICBydEl0ZW0uT2Zmc2V0KC1mUG9zWCwgLWZQb3NZKTsNCisgICAgaWYgKHJ0SXRlbS5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgcmV0dXJuIGhJdGVtOw0KICAgICB9DQotICAgIGlmICghYlNjcm9sbCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFBvcyhmUG9zWSk7DQotICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3NZKTsNCi0gICAgUmVwYWludCgmbV9ydENsaWVudCk7DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLXZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEdyYXBoaWNzKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhlbWUpOw0KK0ZYX0JPT0wgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRJdGVtQ2hlY2tSZWN0KEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydENoZWNrKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciwgRkFMU0UpOw0KKyAgaWYgKCEobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfQ2hlY2spKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgcERhdGEtPkdldEl0ZW1DaGVja1JlY3QobV9wSW50ZXJmYWNlLCBoSXRlbSwgcnRDaGVjayk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0xpc3RCb3hJbXA6OkdldEl0ZW1DaGVja2VkKEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLCBGQUxTRSk7DQorICBpZiAoIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9DaGVjaykpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICByZXR1cm4gKHBEYXRhLT5HZXRJdGVtQ2hlY2tTdGF0ZShtX3BJbnRlcmZhY2UsIGhJdGVtKSAmDQorICAgICAgICAgIEZXTF9JVEVNU1RBVEVfTFRCX0NoZWNrZWQpOw0KK30NCitGWF9CT09MIENGV0xfTGlzdEJveEltcDo6U2V0SXRlbUNoZWNrZWQoRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiQ2hlY2tlZCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIsIEZBTFNFKTsNCisgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX0NoZWNrKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIEZYX0RXT1JEIGR3Q2hlY2tTdGF0ZSA9IHBEYXRhLT5HZXRJdGVtQ2hlY2tTdGF0ZShtX3BJbnRlcmZhY2UsIGhJdGVtKTsNCisgIGlmIChiQ2hlY2tlZCkgew0KKyAgICBwRGF0YS0+U2V0SXRlbUNoZWNrU3RhdGUobV9wSW50ZXJmYWNlLCBoSXRlbSwgRldMX0lURU1TVEFURV9MVEJfQ2hlY2tlZCk7DQorICB9IGVsc2Ugew0KKyAgICBwRGF0YS0+U2V0SXRlbUNoZWNrU3RhdGUobV9wSW50ZXJmYWNlLCBoSXRlbSwgMCk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0xpc3RCb3hJbXA6OlNjcm9sbFRvVmlzaWJsZShGV0xfSExJU1RJVEVNIGhJdGVtKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFZlcnRTY3JvbGxCYXIsIEZBTFNFKTsNCisgIENGWF9SZWN0RiBydEl0ZW07DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIHBEYXRhLT5HZXRJdGVtUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydEl0ZW0pOw0KKyAgRlhfQk9PTCBiU2Nyb2xsID0gRkFMU0U7DQorICBGWF9GTE9BVCBmUG9zWSA9IG1fcFZlcnRTY3JvbGxCYXItPkdldFBvcygpOw0KKyAgcnRJdGVtLk9mZnNldCgwLCAtZlBvc1kgKyBtX3J0Q29uZW50LnRvcCk7DQorICBpZiAocnRJdGVtLnRvcCA8IG1fcnRDb25lbnQudG9wKSB7DQorICAgIGZQb3NZICs9IHJ0SXRlbS50b3AgLSBtX3J0Q29uZW50LnRvcDsNCisgICAgYlNjcm9sbCA9IFRSVUU7DQorICB9IGVsc2UgaWYgKHJ0SXRlbS5ib3R0b20oKSA+IG1fcnRDb25lbnQuYm90dG9tKCkpIHsNCisgICAgZlBvc1kgKz0gcnRJdGVtLmJvdHRvbSgpIC0gbV9ydENvbmVudC5ib3R0b20oKTsNCisgICAgYlNjcm9sbCA9IFRSVUU7DQorICB9DQorICBpZiAoIWJTY3JvbGwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9wVmVydFNjcm9sbEJhci0+U2V0UG9zKGZQb3NZKTsNCisgIG1fcFZlcnRTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3NZKTsNCisgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEdyYXBoaWNzKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRoZW1lKTsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0xUQl9CYWNrZ3JvdW5kOw0KKyAgcGFyYW0ubV9kd1N0YXRlcyA9IDA7DQorICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7DQorICBpZiAoSXNTaG93U2Nyb2xsQmFyKEZBTFNFKSAmJiBJc1Nob3dTY3JvbGxCYXIoVFJVRSkpIHsNCisgICAgcGFyYW0ubV9wRGF0YSA9ICZtX3J0U3RhdGljOw0KKyAgfQ0KKyAgaWYgKCFJc0VuYWJsZWQoKSkgew0KKyAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9MVEJfRGlzYWJsZWQ7DQorICB9DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpEcmF3SXRlbXMoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYX0ZMT0FUIGZQb3NYID0gMC4wZjsNCisgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgIGZQb3NYID0gbV9wSG9yelNjcm9sbEJhci0+R2V0UG9zKCk7DQorICB9DQorICBGWF9GTE9BVCBmUG9zWSA9IDAuMGY7DQorICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICBmUG9zWSA9IG1fcFZlcnRTY3JvbGxCYXItPkdldFBvcygpOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0VmlldyhtX3J0Q29uZW50KTsNCisgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgIHJ0Vmlldy5oZWlnaHQgLT0gbV9mU2NvcmxsQmFyV2lkdGg7DQorICB9DQorICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICBydFZpZXcud2lkdGggLT0gbV9mU2NvcmxsQmFyV2lkdGg7DQorICB9DQorICBGWF9CT09MIGJNdWx0aUNvbCA9DQorICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlDb2x1bW47DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICBpZiAoIWhJdGVtKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCisgICAgcERhdGEtPkdldEl0ZW1SZWN0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHJ0SXRlbSk7DQorICAgIHJ0SXRlbS5PZmZzZXQobV9ydENvbmVudC5sZWZ0IC0gZlBvc1gsIG1fcnRDb25lbnQudG9wIC0gZlBvc1kpOw0KKyAgICBpZiAocnRJdGVtLmJvdHRvbSgpIDwgbV9ydENvbmVudC50b3ApIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAocnRJdGVtLnRvcCA+PSBtX3J0Q29uZW50LmJvdHRvbSgpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKGJNdWx0aUNvbCAmJiBydEl0ZW0ubGVmdCA+IG1fcnRDb25lbnQucmlnaHQoKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChHZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0xUQl9Pd25lckRyYXcpIHsNCisgICAgICBDRldMX0V2dEx0YkRyYXdJdGVtIGV2Ow0KKyAgICAgIGV2Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICBldi5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgICBldi5tX21hdHJpeCA9ICpwTWF0cml4Ow0KKyAgICAgIGV2Lm1faW5kZXggPSBpOw0KKyAgICAgIGV2Lm1fcmVjdCA9IHJ0SXRlbTsNCisgICAgICBEaXNwYXRjaEV2ZW50KCZldik7DQorICAgIH0gZWxzZSB7DQorICAgICAgRHJhd0l0ZW0ocEdyYXBoaWNzLCBwVGhlbWUsIGhJdGVtLCBpLCBydEl0ZW0sIHBNYXRyaXgpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpEcmF3SXRlbShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIEZYX0RXT1JEIGR3SXRlbVN0eWxlcyA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KKyAgRlhfRFdPUkQgZHdQYXJ0U3RhdGVzID0gRldMX1BBUlRTVEFURV9MVEJfTm9ybWFsOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgZHdQYXJ0U3RhdGVzID0gRldMX1BBUlRTVEFURV9MVEJfRGlzYWJsZWQ7DQorICB9IGVsc2UgaWYgKGR3SXRlbVN0eWxlcyAmIEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkKSB7DQorICAgIGR3UGFydFN0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTFRCX1NlbGVjdGVkOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCAmJg0KKyAgICAgIGR3SXRlbVN0eWxlcyAmIEZXTF9JVEVNU1RBVEVfTFRCX0ZvY3VzZWQpIHsNCisgICAgZHdQYXJ0U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfTFRCX0ZvY3VzZWQ7DQorICB9DQorICBGV0xfTGlzdEJveEl0ZW1EYXRhIGl0ZW1EYXRhOw0KKyAgaXRlbURhdGEucERhdGFQcm92aWRlciA9IHBEYXRhOw0KKyAgaXRlbURhdGEuaUluZGV4ID0gSW5kZXg7DQorICB7DQogICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9MVEJfQmFja2dyb3VuZDsNCi0gICAgcGFyYW0ubV9kd1N0YXRlcyA9IDA7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9MVEJfTGlzdEl0ZW07DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBkd1BhcnRTdGF0ZXM7DQogICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7DQotICAgIGlmIChJc1Nob3dTY3JvbGxCYXIoRkFMU0UpICYmIElzU2hvd1Njcm9sbEJhcihUUlVFKSkgew0KLSAgICAgICAgcGFyYW0ubV9wRGF0YSA9ICZtX3J0U3RhdGljOw0KLSAgICB9DQotICAgIGlmICghSXNFbmFibGVkKCkpIHsNCi0gICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0xUQl9EaXNhYmxlZDsNCisgICAgcGFyYW0ubV9ydFBhcnQgPSBydEl0ZW07DQorICAgIHBhcmFtLm1fZHdEYXRhID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpKCZpdGVtRGF0YSk7DQorICAgIENGWF9SZWN0RiBydEZvY3VzKHJ0SXRlbSk7DQorICAgIHBhcmFtLm1fcERhdGEgPSAmcnRGb2N1czsNCisgICAgaWYgKG1fcFZlcnRTY3JvbGxCYXIgJiYgIW1fcEhvcnpTY3JvbGxCYXIgJiYNCisgICAgICAgIChkd1BhcnRTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0xUQl9Gb2N1c2VkKSkgew0KKyAgICAgIHBhcmFtLm1fcnRQYXJ0LmxlZnQgKz0gMTsNCisgICAgICBwYXJhbS5tX3J0UGFydC53aWR0aCAtPSAobV9mU2NvcmxsQmFyV2lkdGggKyAxKTsNCisgICAgICBydEZvY3VzLkRlZmxhdGUoMC41LCAwLjUsIDEgKyBtX2ZTY29ybGxCYXJXaWR0aCwgMSk7DQogICAgIH0NCiAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KLX0NCi12b2lkIENGV0xfTGlzdEJveEltcDo6RHJhd0l0ZW1zKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBGWF9GTE9BVCBmUG9zWCA9IDAuMGY7DQotICAgIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQotICAgICAgICBmUG9zWCA9IG1fcEhvcnpTY3JvbGxCYXItPkdldFBvcygpOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZQb3NZID0gMC4wZjsNCi0gICAgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCi0gICAgICAgIGZQb3NZID0gbV9wVmVydFNjcm9sbEJhci0+R2V0UG9zKCk7DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGIHJ0VmlldyhtX3J0Q29uZW50KTsNCi0gICAgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCi0gICAgICAgIHJ0Vmlldy5oZWlnaHQgLT0gbV9mU2NvcmxsQmFyV2lkdGg7DQotICAgIH0NCi0gICAgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCi0gICAgICAgIHJ0Vmlldy53aWR0aCAtPSBtX2ZTY29ybGxCYXJXaWR0aDsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJNdWx0aUNvbCA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX011bHRpQ29sdW1uOw0KLSAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KLSAgICAgICAgaWYgKCFoSXRlbSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCi0gICAgICAgIHBEYXRhLT5HZXRJdGVtUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydEl0ZW0pOw0KLSAgICAgICAgcnRJdGVtLk9mZnNldChtX3J0Q29uZW50LmxlZnQgLSBmUG9zWCwgbV9ydENvbmVudC50b3AgLSBmUG9zWSk7DQotICAgICAgICBpZiAocnRJdGVtLmJvdHRvbSgpIDwgbV9ydENvbmVudC50b3ApIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChydEl0ZW0udG9wID49IG1fcnRDb25lbnQuYm90dG9tKCkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiTXVsdGlDb2wgJiYgcnRJdGVtLmxlZnQgPiBtX3J0Q29uZW50LnJpZ2h0KCkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChHZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0xUQl9Pd25lckRyYXcpIHsNCi0gICAgICAgICAgICBDRldMX0V2dEx0YkRyYXdJdGVtIGV2Ow0KLSAgICAgICAgICAgIGV2Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICBldi5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgICAgICAgICBldi5tX21hdHJpeCA9ICpwTWF0cml4Ow0KLSAgICAgICAgICAgIGV2Lm1faW5kZXggPSBpOw0KLSAgICAgICAgICAgIGV2Lm1fcmVjdCA9IHJ0SXRlbTsNCi0gICAgICAgICAgICBEaXNwYXRjaEV2ZW50KCZldik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIERyYXdJdGVtKHBHcmFwaGljcywgcFRoZW1lLCBoSXRlbSwgaSwgcnRJdGVtLCBwTWF0cml4KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfTGlzdEJveEltcDo6RHJhd0l0ZW0oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBGV0xfSExJU1RJVEVNIGhJdGVtLCBpbnQzMl90IEluZGV4LCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgRlhfRFdPUkQgZHdJdGVtU3R5bGVzID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQotICAgIEZYX0RXT1JEIGR3UGFydFN0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTFRCX05vcm1hbDsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCi0gICAgICAgIGR3UGFydFN0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTFRCX0Rpc2FibGVkOw0KLSAgICB9IGVsc2UgaWYgKGR3SXRlbVN0eWxlcyAmIEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkKSB7DQotICAgICAgICBkd1BhcnRTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0xUQl9TZWxlY3RlZDsNCi0gICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkICYmIGR3SXRlbVN0eWxlcyAmIEZXTF9JVEVNU1RBVEVfTFRCX0ZvY3VzZWQpIHsNCi0gICAgICAgIGR3UGFydFN0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX0xUQl9Gb2N1c2VkOw0KLSAgICB9DQotICAgIEZXTF9MaXN0Qm94SXRlbURhdGEgaXRlbURhdGE7DQotICAgIGl0ZW1EYXRhLnBEYXRhUHJvdmlkZXIgPSBwRGF0YTsNCi0gICAgaXRlbURhdGEuaUluZGV4ID0gSW5kZXg7DQotICAgIHsNCisgIH0NCisgIHsNCisgICAgRlhfQk9PTCBiSGFzSWNvbiA9IEdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTFRCX0ljb247DQorICAgIGlmIChiSGFzSWNvbikgew0KKyAgICAgIENGWF9SZWN0RiBydERJQjsNCisgICAgICBDRlhfRElCaXRtYXAqIHBEaWIgPSBwRGF0YS0+R2V0SXRlbUljb24obV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgICAgcnRESUIuU2V0KHJ0SXRlbS5sZWZ0LCBydEl0ZW0udG9wLCBydEl0ZW0uaGVpZ2h0LCBydEl0ZW0uaGVpZ2h0KTsNCisgICAgICBpZiAocERpYikgew0KICAgICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQogICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfTFRCX0xpc3RJdGVtOw0KLSAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IGR3UGFydFN0YXRlczsNCisgICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9MVEJfSWNvbjsNCiAgICAgICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KICAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gcnRJdGVtOw0KKyAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBydERJQjsNCiAgICAgICAgIHBhcmFtLm1fZHdEYXRhID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpKCZpdGVtRGF0YSk7DQotICAgICAgICBDRlhfUmVjdEYgcnRGb2N1cyhydEl0ZW0pOw0KLSAgICAgICAgcGFyYW0ubV9wRGF0YSA9ICZydEZvY3VzOw0KLSAgICAgICAgaWYgKG1fcFZlcnRTY3JvbGxCYXIgJiYgIW1fcEhvcnpTY3JvbGxCYXIgJiYgKGR3UGFydFN0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTFRCX0ZvY3VzZWQpKSB7DQotICAgICAgICAgICAgcGFyYW0ubV9ydFBhcnQubGVmdCArPSAxOw0KLSAgICAgICAgICAgIHBhcmFtLm1fcnRQYXJ0LndpZHRoIC09IChtX2ZTY29ybGxCYXJXaWR0aCArIDEpOw0KLSAgICAgICAgICAgIHJ0Rm9jdXMuRGVmbGF0ZSgwLjUsIDAuNSwgMSArIG1fZlNjb3JsbEJhcldpZHRoLCAxKTsNCi0gICAgICAgIH0NCisgICAgICAgIHBhcmFtLm1fcEltYWdlID0gcERpYjsNCiAgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgew0KLSAgICAgICAgRlhfQk9PTCBiSGFzSWNvbiA9IEdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTFRCX0ljb247DQotICAgICAgICBpZiAoYkhhc0ljb24pIHsNCi0gICAgICAgICAgICBDRlhfUmVjdEYgcnRESUI7DQotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwICpwRGliID0gcERhdGEtPkdldEl0ZW1JY29uKG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KLSAgICAgICAgICAgIHJ0RElCLlNldChydEl0ZW0ubGVmdCwgcnRJdGVtLnRvcCwgcnRJdGVtLmhlaWdodCwgcnRJdGVtLmhlaWdodCk7DQotICAgICAgICAgICAgaWYgKHBEaWIpIHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQotICAgICAgICAgICAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0xUQl9JY29uOw0KLSAgICAgICAgICAgICAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgICAgICAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgICAgICAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBydERJQjsNCi0gICAgICAgICAgICAgICAgcGFyYW0ubV9kd0RhdGEgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdCkoJml0ZW1EYXRhKTsNCi0gICAgICAgICAgICAgICAgcGFyYW0ubV9wSW1hZ2UgPSBwRGliOw0KLSAgICAgICAgICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfQk9PTCBiSGFzQ2hlY2sgPSBHZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0xUQl9DaGVjazsNCi0gICAgICAgIGlmIChiSGFzQ2hlY2spIHsNCi0gICAgICAgICAgICBDRlhfUmVjdEYgcnRDaGVjazsNCi0gICAgICAgICAgICBydENoZWNrLlNldChydEl0ZW0ubGVmdCwgcnRJdGVtLnRvcCwgcnRJdGVtLmhlaWdodCwgcnRJdGVtLmhlaWdodCk7DQotICAgICAgICAgICAgcnRDaGVjay5EZWZsYXRlKDIsIDIsIDIsIDIpOw0KLSAgICAgICAgICAgIHBEYXRhLT5TZXRJdGVtQ2hlY2tSZWN0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHJ0Q2hlY2spOw0KLSAgICAgICAgICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KLSAgICAgICAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfTFRCX0NoZWNrOw0KLSAgICAgICAgICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICAgICAgICAgIGlmIChHZXRJdGVtQ2hlY2tlZChoSXRlbSkpIHsNCi0gICAgICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTFRCX0NoZWNrZWQ7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTFRCX1VuQ2hlY2tlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgICAgICAgICBwYXJhbS5tX3J0UGFydCA9IHJ0Q2hlY2s7DQotICAgICAgICAgICAgcGFyYW0ubV9kd0RhdGEgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdCkoJml0ZW1EYXRhKTsNCi0gICAgICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgICAgICBwRGF0YS0+R2V0SXRlbVRleHQobV9wSW50ZXJmYWNlLCBoSXRlbSwgd3NUZXh0KTsNCi0gICAgICAgIGlmICh3c1RleHQuR2V0TGVuZ3RoKCkgPD0gMCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9SZWN0RiBydFRleHQocnRJdGVtKTsNCi0gICAgICAgIHJ0VGV4dC5EZWZsYXRlKEZXTF9MSVNUQk9YX0l0ZW1UZXh0TWFyZ2luLCBGV0xfTElTVEJPWF9JdGVtVGV4dE1hcmdpbik7DQotICAgICAgICBpZiAoYkhhc0ljb24gfHwgYkhhc0NoZWNrKSB7DQotICAgICAgICAgICAgcnRUZXh0LkRlZmxhdGUocnRJdGVtLmhlaWdodCwgMCwgMCwgMCk7DQotICAgICAgICB9DQotICAgICAgICBDRldMX1RoZW1lVGV4dCB0ZXh0UGFyYW07DQotICAgICAgICB0ZXh0UGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICAgICAgdGV4dFBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9MVEJfTGlzdEl0ZW07DQotICAgICAgICB0ZXh0UGFyYW0ubV9kd1N0YXRlcyA9IGR3UGFydFN0YXRlczsNCi0gICAgICAgIHRleHRQYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgICAgIHRleHRQYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICAgICAgdGV4dFBhcmFtLm1fcnRQYXJ0ID0gcnRUZXh0Ow0KLSAgICAgICAgdGV4dFBhcmFtLm1fd3NUZXh0ID0gd3NUZXh0Ow0KLSAgICAgICAgdGV4dFBhcmFtLm1fZHdUVE9TdHlsZXMgPSBtX2R3VFRPU3R5bGVzOw0KLSAgICAgICAgdGV4dFBhcmFtLm1faVRUT0FsaWduID0gbV9pVFRPQWxpZ25zOw0KLSAgICAgICAgdGV4dFBhcmFtLm1fZHdEYXRhID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpKCZpdGVtRGF0YSk7DQotICAgICAgICBwVGhlbWUtPkRyYXdUZXh0KCZ0ZXh0UGFyYW0pOw0KKyAgICBGWF9CT09MIGJIYXNDaGVjayA9IEdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTFRCX0NoZWNrOw0KKyAgICBpZiAoYkhhc0NoZWNrKSB7DQorICAgICAgQ0ZYX1JlY3RGIHJ0Q2hlY2s7DQorICAgICAgcnRDaGVjay5TZXQocnRJdGVtLmxlZnQsIHJ0SXRlbS50b3AsIHJ0SXRlbS5oZWlnaHQsIHJ0SXRlbS5oZWlnaHQpOw0KKyAgICAgIHJ0Q2hlY2suRGVmbGF0ZSgyLCAyLCAyLCAyKTsNCisgICAgICBwRGF0YS0+U2V0SXRlbUNoZWNrUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydENoZWNrKTsNCisgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0xUQl9DaGVjazsNCisgICAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgICBpZiAoR2V0SXRlbUNoZWNrZWQoaEl0ZW0pKSB7DQorICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9MVEJfQ2hlY2tlZDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTFRCX1VuQ2hlY2tlZDsNCisgICAgICB9DQorICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgICBwYXJhbS5tX3J0UGFydCA9IHJ0Q2hlY2s7DQorICAgICAgcGFyYW0ubV9kd0RhdGEgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdCkoJml0ZW1EYXRhKTsNCisgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQogICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBwRGF0YS0+R2V0SXRlbVRleHQobV9wSW50ZXJmYWNlLCBoSXRlbSwgd3NUZXh0KTsNCisgICAgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA8PSAwKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydFRleHQocnRJdGVtKTsNCisgICAgcnRUZXh0LkRlZmxhdGUoRldMX0xJU1RCT1hfSXRlbVRleHRNYXJnaW4sIEZXTF9MSVNUQk9YX0l0ZW1UZXh0TWFyZ2luKTsNCisgICAgaWYgKGJIYXNJY29uIHx8IGJIYXNDaGVjaykgew0KKyAgICAgIHJ0VGV4dC5EZWZsYXRlKHJ0SXRlbS5oZWlnaHQsIDAsIDAsIDApOw0KKyAgICB9DQorICAgIENGV0xfVGhlbWVUZXh0IHRleHRQYXJhbTsNCisgICAgdGV4dFBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgdGV4dFBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9MVEJfTGlzdEl0ZW07DQorICAgIHRleHRQYXJhbS5tX2R3U3RhdGVzID0gZHdQYXJ0U3RhdGVzOw0KKyAgICB0ZXh0UGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHRleHRQYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB0ZXh0UGFyYW0ubV9ydFBhcnQgPSBydFRleHQ7DQorICAgIHRleHRQYXJhbS5tX3dzVGV4dCA9IHdzVGV4dDsNCisgICAgdGV4dFBhcmFtLm1fZHdUVE9TdHlsZXMgPSBtX2R3VFRPU3R5bGVzOw0KKyAgICB0ZXh0UGFyYW0ubV9pVFRPQWxpZ24gPSBtX2lUVE9BbGlnbnM7DQorICAgIHRleHRQYXJhbS5tX2R3RGF0YSA9IChGWF9EV09SRCkodWludHB0cl90KSgmaXRlbURhdGEpOw0KKyAgICBwVGhlbWUtPkRyYXdUZXh0KCZ0ZXh0UGFyYW0pOw0KKyAgfQ0KIH0NCi1DRlhfU2l6ZUYgQ0ZXTF9MaXN0Qm94SW1wOjpDYWxjU2l6ZShGWF9CT09MIGJBdXRvU2l6ZSApDQotew0KLSAgICBDRlhfU2l6ZUYgZnM7DQotICAgIGZzLlNldCgwLCAwKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBmcyk7DQotICAgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQotICAgIG1fcnRDb25lbnQgPSBtX3J0Q2xpZW50Ow0KLSAgICBDRlhfUmVjdEYgcnRVSU1hcmdpbjsNCi0gICAgcnRVSU1hcmdpbi5TZXQoMCwgMCwgMCwgMCk7DQotICAgIGlmICghbV9wT3V0ZXIpIHsNCi0gICAgICAgIENGWF9SZWN0RiogcFVJTWFyZ2luID0gKENGWF9SZWN0RiopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW4pOw0KLSAgICAgICAgaWYgKHBVSU1hcmdpbikgew0KLSAgICAgICAgICAgIG1fcnRDb25lbnQuRGVmbGF0ZShwVUlNYXJnaW4tPmxlZnQsIHBVSU1hcmdpbi0+dG9wLCBwVUlNYXJnaW4tPndpZHRoLCBwVUlNYXJnaW4tPmhlaWdodCk7DQotICAgICAgICB9DQorQ0ZYX1NpemVGIENGV0xfTGlzdEJveEltcDo6Q2FsY1NpemUoRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIENGWF9TaXplRiBmczsNCisgIGZzLlNldCgwLCAwKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgZnMpOw0KKyAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgIG1fcnRDb25lbnQgPSBtX3J0Q2xpZW50Ow0KKyAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW47DQorICBydFVJTWFyZ2luLlNldCgwLCAwLCAwLCAwKTsNCisgIGlmICghbV9wT3V0ZXIpIHsNCisgICAgQ0ZYX1JlY3RGKiBwVUlNYXJnaW4gPQ0KKyAgICAgICAgKENGWF9SZWN0RiopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW4pOw0KKyAgICBpZiAocFVJTWFyZ2luKSB7DQorICAgICAgbV9ydENvbmVudC5EZWZsYXRlKHBVSU1hcmdpbi0+bGVmdCwgcFVJTWFyZ2luLT50b3AsIHBVSU1hcmdpbi0+d2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHBVSU1hcmdpbi0+aGVpZ2h0KTsNCiAgICAgfQ0KLSAgICBGWF9GTE9BVCBmV2lkdGggPSAwOw0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlci0+SXNDdXN0b21pemVkTGF5b3V0KG1fcEludGVyZmFjZSkpIHsNCi0gICAgICAgIElGV0xfTGlzdEJveERQICpwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICAgICAgaWYgKCFiQXV0b1NpemUpIHsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KLSAgICAgICAgICAgIENGV0xfVGhlbWVQYXJ0IGl0ZW1QYXJ0Ow0KLSAgICAgICAgICAgIGl0ZW1QYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICBpdGVtUGFydC5tX2lQYXJ0ID0gRldMX1BBUlRfTFRCX0xpc3RJdGVtOw0KLSAgICAgICAgICAgIGl0ZW1QYXJ0Lm1fcERhdGEgPSBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgICAgICAgICAgaXRlbVBhcnQubV9kd0RhdGEgPSBpOw0KLSAgICAgICAgICAgIENGWF9SZWN0RiByOw0KLSAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXItPkdldFBhcnRSZWN0KCZpdGVtUGFydCwgcik7DQotICAgICAgICAgICAgaWYgKCFiQXV0b1NpemUpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCi0gICAgICAgICAgICAgICAgcnRJdGVtLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQudG9wICsgZnMueSwgci53aWR0aCwgci5oZWlnaHQpOw0KLSAgICAgICAgICAgICAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgICAgICAgICAgICAgcERhdGEtPlNldEl0ZW1SZWN0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHJ0SXRlbSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZzLnkgKz0gci5oZWlnaHQ7DQotICAgICAgICAgICAgaWYgKGZzLnggPCByLndpZHRoKSB7DQotICAgICAgICAgICAgICAgIGZzLnggPSByLndpZHRoOw0KLSAgICAgICAgICAgICAgICBmV2lkdGggPSByLndpZHRoOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGZXaWR0aCA9IEdldE1heFRleHRXaWR0aCgpOw0KLSAgICAgICAgZldpZHRoICs9IDIgKiBGV0xfTElTVEJPWF9JdGVtVGV4dE1hcmdpbjsNCi0gICAgICAgIGlmICghYkF1dG9TaXplKSB7DQotICAgICAgICAgICAgRlhfRkxPQVQgZkFjdHVhbFdpZHRoID0gbV9ydENsaWVudC53aWR0aCAtIHJ0VUlNYXJnaW4ubGVmdCAtIHJ0VUlNYXJnaW4ud2lkdGg7DQotICAgICAgICAgICAgaWYgKGZXaWR0aCA8IGZBY3R1YWxXaWR0aCkgew0KLSAgICAgICAgICAgICAgICBmV2lkdGggPSBmQWN0dWFsV2lkdGg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgSUZXTF9MaXN0Qm94RFAgKnBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgICAgICBtX2ZJdGVtSGVpZ2h0ID0gR2V0SXRlbUhlaWd0KCk7DQotICAgICAgICBGWF9CT09MIGJIYXNJY29uOw0KLSAgICAgICAgYkhhc0ljb24gPSBHZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0xUQl9JY29uOw0KLSAgICAgICAgaWYgKGJIYXNJY29uKSB7DQotICAgICAgICAgICAgZldpZHRoICs9IG1fZkl0ZW1IZWlnaHQ7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgICAgICBGV0xfSExJU1RJVEVNIGh0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KLSAgICAgICAgICAgIEdldEl0ZW1TaXplKGZzLCBodGVtLCBmV2lkdGgsIG1fZkl0ZW1IZWlnaHQsIGJBdXRvU2l6ZSk7DQotICAgICAgICB9DQorICB9DQorICBGWF9GTE9BVCBmV2lkdGggPSAwOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXItPklzQ3VzdG9taXplZExheW91dChtX3BJbnRlcmZhY2UpKSB7DQorICAgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9IChJRldMX0xpc3RCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBpZiAoIWJBdXRvU2l6ZSkgew0KICAgICB9DQotICAgIGlmIChiQXV0b1NpemUpIHsNCi0gICAgICAgIHJldHVybiBmczsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBpV2lkdGggPSBtX3J0Q2xpZW50LndpZHRoIC0gcnRVSU1hcmdpbi5sZWZ0IC0gcnRVSU1hcmdpbi53aWR0aDsNCi0gICAgRlhfRkxPQVQgaUhlaWdodCA9IG1fcnRDbGllbnQuaGVpZ2h0Ow0KLSAgICBGWF9CT09MIGJTaG93VmVydFNjciA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyQWxhd2F5cykgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9WU2Nyb2xsKTsNCi0gICAgRlhfQk9PTCBiU2hvd0hvcnpTY3IgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckFsYXdheXMpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSFNjcm9sbCk7DQotICAgIGlmICghYlNob3dWZXJ0U2NyICYmIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfVlNjcm9sbCAmJg0KLSAgICAgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9NdWx0aUNvbHVtbikgPT0gMCkgew0KLSAgICAgICAgYlNob3dWZXJ0U2NyID0gKGZzLnkgPiBpSGVpZ2h0KTsNCi0gICAgfQ0KLSAgICBpZiAoIWJTaG93SG9yelNjciAmJiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0hTY3JvbGwpIHsNCi0gICAgICAgIGJTaG93SG9yelNjciA9IChmcy54ID4gaVdpZHRoKTsNCi0gICAgfQ0KLSAgICBDRlhfU2l6ZUYgc3pSYW5nZTsNCi0gICAgaWYgKGJTaG93VmVydFNjcikgew0KLSAgICAgICAgaWYgKCFtX3BWZXJ0U2Nyb2xsQmFyKSB7DQotICAgICAgICAgICAgSW5pdFNjcm9sbEJhcigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0U2Nyb2xsQmFyOw0KLSAgICAgICAgcnRTY3JvbGxCYXIuU2V0KG1fcnRDbGllbnQucmlnaHQoKSAtIG1fZlNjb3JsbEJhcldpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZlNjb3JsbEJhcldpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQuaGVpZ2h0IC0gMSk7DQotICAgICAgICBpZiAoYlNob3dIb3J6U2NyKSB7DQotICAgICAgICAgICAgcnRTY3JvbGxCYXIuaGVpZ2h0IC09IG1fZlNjb3JsbEJhcldpZHRoOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0V2lkZ2V0UmVjdChydFNjcm9sbEJhcik7DQotICAgICAgICBzelJhbmdlLnggPSAwLCBzelJhbmdlLnkgPSBmcy55IC0gbV9ydENvbmVudC5oZWlnaHQ7DQotICAgICAgICBpZiAoc3pSYW5nZS55IDwgbV9mSXRlbUhlaWdodCkgew0KLSAgICAgICAgICAgIHN6UmFuZ2UueSA9IG1fZkl0ZW1IZWlnaHQ7DQotICAgICAgICB9DQotICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRSYW5nZShzelJhbmdlLngsIHN6UmFuZ2UueSk7DQotICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRQYWdlU2l6ZShydFNjcm9sbEJhci5oZWlnaHQgKiA5IC8gMTApOw0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RlcFNpemUobV9mSXRlbUhlaWdodCk7DQotICAgICAgICBGWF9GTE9BVCBmUG9zID0gbV9wVmVydFNjcm9sbEJhci0+R2V0UG9zKCk7DQotICAgICAgICBpZiAoZlBvcyA8IDApIHsNCi0gICAgICAgICAgICBmUG9zID0gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChmUG9zID4gc3pSYW5nZS55KSB7DQotICAgICAgICAgICAgZlBvcyA9IHN6UmFuZ2UueTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFBvcyhmUG9zKTsNCi0gICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KLSAgICAgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyRm9jdXMpID09IDAgfHwgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkpIHsNCi0gICAgICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgRkFMU0UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+VXBkYXRlKCk7DQotICAgIH0gZWxzZSBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UG9zKDApOw0KLSAgICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0VHJhY2tQb3MoMCk7DQotICAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQotICAgIH0NCi0gICAgaWYgKGJTaG93SG9yelNjcikgew0KLSAgICAgICAgaWYgKCFtX3BIb3J6U2Nyb2xsQmFyKSB7DQotICAgICAgICAgICAgSW5pdFNjcm9sbEJhcihGQUxTRSk7DQotICAgICAgICB9DQotICAgICAgICBDRlhfUmVjdEYgcnRTY3JvbGxCYXI7DQotICAgICAgICBydFNjcm9sbEJhci5TZXQobV9ydENsaWVudC5sZWZ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQuYm90dG9tKCkgLSBtX2ZTY29ybGxCYXJXaWR0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LndpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZlNjb3JsbEJhcldpZHRoKTsNCi0gICAgICAgIGlmIChiU2hvd1ZlcnRTY3IpIHsNCi0gICAgICAgICAgICBydFNjcm9sbEJhci53aWR0aCAtPSBtX2ZTY29ybGxCYXJXaWR0aDsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFdpZGdldFJlY3QocnRTY3JvbGxCYXIpOw0KLSAgICAgICAgc3pSYW5nZS54ID0gMCwgc3pSYW5nZS55ID0gZnMueCAtIHJ0U2Nyb2xsQmFyLndpZHRoOw0KLSAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UmFuZ2Uoc3pSYW5nZS54LCBzelJhbmdlLnkpOw0KLSAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UGFnZVNpemUoZldpZHRoICogOSAvIDEwKTsNCi0gICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0ZXBTaXplKGZXaWR0aCAvIDEwKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZQb3MgPSBtX3BIb3J6U2Nyb2xsQmFyLT5HZXRQb3MoKTsNCi0gICAgICAgIGlmIChmUG9zIDwgMCkgew0KLSAgICAgICAgICAgIGZQb3MgPSAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGZQb3MgPiBzelJhbmdlLnkpIHsNCi0gICAgICAgICAgICBmUG9zID0gc3pSYW5nZS55Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UG9zKGZQb3MpOw0KLSAgICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0VHJhY2tQb3MoZlBvcyk7DQotICAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJGb2N1cykgPT0gMCB8fCAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSkgew0KLSAgICAgICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBGQUxTRSk7DQotICAgICAgICB9DQotICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCi0gICAgfSBlbHNlIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQotICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRQb3MoMCk7DQotICAgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRUcmFja1BvcygwKTsNCi0gICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCi0gICAgfQ0KLSAgICBpZiAoYlNob3dWZXJ0U2NyICYmIGJTaG93SG9yelNjcikgew0KLSAgICAgICAgbV9ydFN0YXRpYy5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gbV9mU2NvcmxsQmFyV2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LmJvdHRvbSgpIC0gbV9mU2NvcmxsQmFyV2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICBtX2ZTY29ybGxCYXJXaWR0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgIG1fZlNjb3JsbEJhcldpZHRoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gZnM7DQotfQ0KLXZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRJdGVtU2l6ZShDRlhfU2l6ZUYgJnNpemUsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgbV9mSXRlbUhlaWdodCwgRlhfQk9PTCBiQXV0b1NpemUpDQotew0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlDb2x1bW4pIHsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmICghYkF1dG9TaXplKSB7DQotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCi0gICAgICAgICAgICBydEl0ZW0uU2V0KDAsIHNpemUueSwgZldpZHRoLCBtX2ZJdGVtSGVpZ2h0KTsNCi0gICAgICAgICAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgICAgICAgICBwRGF0YS0+U2V0SXRlbVJlY3QobV9wSW50ZXJmYWNlLCBoSXRlbSwgcnRJdGVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHNpemUueCA9IGZXaWR0aDsNCi0gICAgICAgIHNpemUueSArPSBtX2ZJdGVtSGVpZ2h0Ow0KLSAgICB9DQotfQ0KLUZYX0ZMT0FUIENGV0xfTGlzdEJveEltcDo6R2V0TWF4VGV4dFdpZHRoKCkNCi17DQotICAgIEZYX0ZMT0FUIGZSZXQgPSAwLjBmOw0KLSAgICBJRldMX0xpc3RCb3hEUCAqcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCiAgICAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KLSAgICAgICAgaWYgKCFoSXRlbSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICAgIENGV0xfVGhlbWVQYXJ0IGl0ZW1QYXJ0Ow0KKyAgICAgIGl0ZW1QYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICBpdGVtUGFydC5tX2lQYXJ0ID0gRldMX1BBUlRfTFRCX0xpc3RJdGVtOw0KKyAgICAgIGl0ZW1QYXJ0Lm1fcERhdGEgPSBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgICAgaXRlbVBhcnQubV9kd0RhdGEgPSBpOw0KKyAgICAgIENGWF9SZWN0RiByOw0KKyAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXItPkdldFBhcnRSZWN0KCZpdGVtUGFydCwgcik7DQorICAgICAgaWYgKCFiQXV0b1NpemUpIHsNCisgICAgICAgIENGWF9SZWN0RiBydEl0ZW07DQorICAgICAgICBydEl0ZW0uU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC50b3AgKyBmcy55LCByLndpZHRoLCByLmhlaWdodCk7DQorICAgICAgICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICAgIHBEYXRhLT5TZXRJdGVtUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydEl0ZW0pOw0KKyAgICAgIH0NCisgICAgICBmcy55ICs9IHIuaGVpZ2h0Ow0KKyAgICAgIGlmIChmcy54IDwgci53aWR0aCkgew0KKyAgICAgICAgZnMueCA9IHIud2lkdGg7DQorICAgICAgICBmV2lkdGggPSByLndpZHRoOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgZldpZHRoID0gR2V0TWF4VGV4dFdpZHRoKCk7DQorICAgIGZXaWR0aCArPSAyICogRldMX0xJU1RCT1hfSXRlbVRleHRNYXJnaW47DQorICAgIGlmICghYkF1dG9TaXplKSB7DQorICAgICAgRlhfRkxPQVQgZkFjdHVhbFdpZHRoID0NCisgICAgICAgICAgbV9ydENsaWVudC53aWR0aCAtIHJ0VUlNYXJnaW4ubGVmdCAtIHJ0VUlNYXJnaW4ud2lkdGg7DQorICAgICAgaWYgKGZXaWR0aCA8IGZBY3R1YWxXaWR0aCkgew0KKyAgICAgICAgZldpZHRoID0gZkFjdHVhbFdpZHRoOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgbV9mSXRlbUhlaWdodCA9IEdldEl0ZW1IZWlndCgpOw0KKyAgICBGWF9CT09MIGJIYXNJY29uOw0KKyAgICBiSGFzSWNvbiA9IEdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTFRCX0ljb247DQorICAgIGlmIChiSGFzSWNvbikgew0KKyAgICAgIGZXaWR0aCArPSBtX2ZJdGVtSGVpZ2h0Ow0KKyAgICB9DQorICAgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBGV0xfSExJU1RJVEVNIGh0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICAgIEdldEl0ZW1TaXplKGZzLCBodGVtLCBmV2lkdGgsIG1fZkl0ZW1IZWlnaHQsIGJBdXRvU2l6ZSk7DQorICAgIH0NCisgIH0NCisgIGlmIChiQXV0b1NpemUpIHsNCisgICAgcmV0dXJuIGZzOw0KKyAgfQ0KKyAgRlhfRkxPQVQgaVdpZHRoID0gbV9ydENsaWVudC53aWR0aCAtIHJ0VUlNYXJnaW4ubGVmdCAtIHJ0VUlNYXJnaW4ud2lkdGg7DQorICBGWF9GTE9BVCBpSGVpZ2h0ID0gbV9ydENsaWVudC5oZWlnaHQ7DQorICBGWF9CT09MIGJTaG93VmVydFNjciA9DQorICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJBbGF3YXlzKSAmJg0KKyAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX1ZTY3JvbGwpOw0KKyAgRlhfQk9PTCBiU2hvd0hvcnpTY3IgPQ0KKyAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyQWxhd2F5cykgJiYNCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9IU2Nyb2xsKTsNCisgIGlmICghYlNob3dWZXJ0U2NyICYmIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfVlNjcm9sbCAmJg0KKyAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9NdWx0aUNvbHVtbikgPT0gMCkgew0KKyAgICBiU2hvd1ZlcnRTY3IgPSAoZnMueSA+IGlIZWlnaHQpOw0KKyAgfQ0KKyAgaWYgKCFiU2hvd0hvcnpTY3IgJiYgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9IU2Nyb2xsKSB7DQorICAgIGJTaG93SG9yelNjciA9IChmcy54ID4gaVdpZHRoKTsNCisgIH0NCisgIENGWF9TaXplRiBzelJhbmdlOw0KKyAgaWYgKGJTaG93VmVydFNjcikgew0KKyAgICBpZiAoIW1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgICBJbml0U2Nyb2xsQmFyKCk7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0U2Nyb2xsQmFyOw0KKyAgICBydFNjcm9sbEJhci5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gbV9mU2NvcmxsQmFyV2lkdGgsIG1fcnRDbGllbnQudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgbV9mU2NvcmxsQmFyV2lkdGgsIG1fcnRDbGllbnQuaGVpZ2h0IC0gMSk7DQorICAgIGlmIChiU2hvd0hvcnpTY3IpIHsNCisgICAgICBydFNjcm9sbEJhci5oZWlnaHQgLT0gbV9mU2NvcmxsQmFyV2lkdGg7DQorICAgIH0NCisgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0V2lkZ2V0UmVjdChydFNjcm9sbEJhcik7DQorICAgIHN6UmFuZ2UueCA9IDAsIHN6UmFuZ2UueSA9IGZzLnkgLSBtX3J0Q29uZW50LmhlaWdodDsNCisgICAgaWYgKHN6UmFuZ2UueSA8IG1fZkl0ZW1IZWlnaHQpIHsNCisgICAgICBzelJhbmdlLnkgPSBtX2ZJdGVtSGVpZ2h0Ow0KKyAgICB9DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFJhbmdlKHN6UmFuZ2UueCwgc3pSYW5nZS55KTsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UGFnZVNpemUocnRTY3JvbGxCYXIuaGVpZ2h0ICogOSAvIDEwKTsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RlcFNpemUobV9mSXRlbUhlaWdodCk7DQorICAgIEZYX0ZMT0FUIGZQb3MgPSBtX3BWZXJ0U2Nyb2xsQmFyLT5HZXRQb3MoKTsNCisgICAgaWYgKGZQb3MgPCAwKSB7DQorICAgICAgZlBvcyA9IDA7DQorICAgIH0NCisgICAgaWYgKGZQb3MgPiBzelJhbmdlLnkpIHsNCisgICAgICBmUG9zID0gc3pSYW5nZS55Ow0KKyAgICB9DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFBvcyhmUG9zKTsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0VHJhY2tQb3MoZlBvcyk7DQorICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckZvY3VzKSA9PQ0KKyAgICAgICAgICAgIDAgfHwNCisgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpKSB7DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIEZBTFNFKTsNCisgICAgfQ0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCisgIH0gZWxzZSBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRQb3MoMCk7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFRyYWNrUG9zKDApOw0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQorICB9DQorICBpZiAoYlNob3dIb3J6U2NyKSB7DQorICAgIGlmICghbV9wSG9yelNjcm9sbEJhcikgew0KKyAgICAgIEluaXRTY3JvbGxCYXIoRkFMU0UpOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydFNjcm9sbEJhcjsNCisgICAgcnRTY3JvbGxCYXIuU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC5ib3R0b20oKSAtIG1fZlNjb3JsbEJhcldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC53aWR0aCwgbV9mU2NvcmxsQmFyV2lkdGgpOw0KKyAgICBpZiAoYlNob3dWZXJ0U2NyKSB7DQorICAgICAgcnRTY3JvbGxCYXIud2lkdGggLT0gbV9mU2NvcmxsQmFyV2lkdGg7DQorICAgIH0NCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0V2lkZ2V0UmVjdChydFNjcm9sbEJhcik7DQorICAgIHN6UmFuZ2UueCA9IDAsIHN6UmFuZ2UueSA9IGZzLnggLSBydFNjcm9sbEJhci53aWR0aDsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UmFuZ2Uoc3pSYW5nZS54LCBzelJhbmdlLnkpOw0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRQYWdlU2l6ZShmV2lkdGggKiA5IC8gMTApOw0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGVwU2l6ZShmV2lkdGggLyAxMCk7DQorICAgIEZYX0ZMT0FUIGZQb3MgPSBtX3BIb3J6U2Nyb2xsQmFyLT5HZXRQb3MoKTsNCisgICAgaWYgKGZQb3MgPCAwKSB7DQorICAgICAgZlBvcyA9IDA7DQorICAgIH0NCisgICAgaWYgKGZQb3MgPiBzelJhbmdlLnkpIHsNCisgICAgICBmUG9zID0gc3pSYW5nZS55Ow0KKyAgICB9DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFBvcyhmUG9zKTsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0VHJhY2tQb3MoZlBvcyk7DQorICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckZvY3VzKSA9PQ0KKyAgICAgICAgICAgIDAgfHwNCisgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpKSB7DQorICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIEZBTFNFKTsNCisgICAgfQ0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCisgIH0gZWxzZSBpZiAobV9wSG9yelNjcm9sbEJhcikgew0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRQb3MoMCk7DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFRyYWNrUG9zKDApOw0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQorICB9DQorICBpZiAoYlNob3dWZXJ0U2NyICYmIGJTaG93SG9yelNjcikgew0KKyAgICBtX3J0U3RhdGljLlNldChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBtX2ZTY29ybGxCYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC5ib3R0b20oKSAtIG1fZlNjb3JsbEJhcldpZHRoLCBtX2ZTY29ybGxCYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgbV9mU2NvcmxsQmFyV2lkdGgpOw0KKyAgfQ0KKyAgcmV0dXJuIGZzOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6R2V0SXRlbVNpemUoQ0ZYX1NpemVGJiBzaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1fZkl0ZW1IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlDb2x1bW4pIHsNCisgIH0gZWxzZSB7DQorICAgIGlmICghYkF1dG9TaXplKSB7DQorICAgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCisgICAgICBydEl0ZW0uU2V0KDAsIHNpemUueSwgZldpZHRoLCBtX2ZJdGVtSGVpZ2h0KTsNCisgICAgICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSAoSUZXTF9MaXN0Qm94RFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICBwRGF0YS0+U2V0SXRlbVJlY3QobV9wSW50ZXJmYWNlLCBoSXRlbSwgcnRJdGVtKTsNCisgICAgfQ0KKyAgICBzaXplLnggPSBmV2lkdGg7DQorICAgIHNpemUueSArPSBtX2ZJdGVtSGVpZ2h0Ow0KKyAgfQ0KK30NCitGWF9GTE9BVCBDRldMX0xpc3RCb3hJbXA6OkdldE1heFRleHRXaWR0aCgpIHsNCisgIEZYX0ZMT0FUIGZSZXQgPSAwLjBmOw0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0gKElGV0xfTGlzdEJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICBpbnQzMl90IGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCisgICAgaWYgKCFoSXRlbSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgcERhdGEtPkdldEl0ZW1UZXh0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHdzVGV4dCk7DQorICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSh3c1RleHQsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICBpZiAoc3oueCA+IGZSZXQpIHsNCisgICAgICBmUmV0ID0gc3oueDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZSZXQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfTGlzdEJveEltcDo6R2V0U2Nyb2xsV2lkdGgoKSB7DQorICBGWF9GTE9BVCogcGZXaWR0aCA9DQorICAgICAgKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBmV2lkdGgsIDApOw0KKyAgcmV0dXJuICpwZldpZHRoOw0KK30NCitGWF9GTE9BVCBDRldMX0xpc3RCb3hJbXA6OkdldEl0ZW1IZWlndCgpIHsNCisgIEZYX0ZMT0FUKiBwZkZvbnQgPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX0ZvbnRTaXplKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGZGb250LCAyMCk7DQorICByZXR1cm4gKnBmRm9udCArIDIgKiBGV0xfTElTVEJPWF9JdGVtVGV4dE1hcmdpbjsNCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXA6OkluaXRTY3JvbGxCYXIoRlhfQk9PTCBiVmVydCkgew0KKyAgaWYgKChiVmVydCAmJiBtX3BWZXJ0U2Nyb2xsQmFyKSB8fCAoIWJWZXJ0ICYmIG1fcEhvcnpTY3JvbGxCYXIpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgcHJvcC5tX2R3U3R5bGVFeGVzID0gYlZlcnQgPyBGV0xfU1RZTEVFWFRfU0NCX1ZlcnQgOiBGV0xfU1RZTEVFWFRfU0NCX0hvcno7DQorICBwcm9wLm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfSW52aXNpYmxlOw0KKyAgcHJvcC5tX3BQYXJlbnQgPSBtX3BJbnRlcmZhY2U7DQorICBwcm9wLm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BTY3JvbGxCYXJUUDsNCisgIElGV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0gSUZXTF9TY3JvbGxCYXI6OkNyZWF0ZSgpOw0KKyAgcFNjcm9sbEJhci0+SW5pdGlhbGl6ZShwcm9wLCBtX3BJbnRlcmZhY2UpOw0KKyAgYlZlcnQgPyAobV9wVmVydFNjcm9sbEJhciA9IHBTY3JvbGxCYXIpIDogKG1fcEhvcnpTY3JvbGxCYXIgPSBwU2Nyb2xsQmFyKTsNCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXA6OlNvcnRJdGVtKCkge30NCitGWF9CT09MIENGV0xfTGlzdEJveEltcDo6SXNTaG93U2Nyb2xsQmFyKEZYX0JPT0wgYlZlcnQpIHsNCisgIElGV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsYmFyID0gYlZlcnQgPyBtX3BWZXJ0U2Nyb2xsQmFyIDogbV9wSG9yelNjcm9sbEJhcjsNCisgIGlmICghcFNjcm9sbGJhciB8fCAocFNjcm9sbGJhci0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYNCisgICAgICAgICAgIEZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckZvY3VzKSB8fA0KKyAgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6UHJvY2Vzc1NlbENoYW5nZWQoKSB7DQorICBDRldMX0V2dEx0YlNlbENoYW5nZWQgc2VsRXZlbnQ7DQorICBzZWxFdmVudC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBDRlhfSW50MzJBcnJheSBhcnJTZWxzOw0KKyAgaW50MzJfdCBpQ291bnQgPSBDb3VudFNlbEl0ZW1zKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBGV0xfSExJU1RJVEVNIGl0ZW0gPSBHZXRTZWxJdGVtKGkpOw0KKyAgICBpZiAoaXRlbSA9PSBOVUxMKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgc2VsRXZlbnQuaWFycmF5U2Vscy5BZGQoaSk7DQorICB9DQorICBEaXNwYXRjaEV2ZW50KCZzZWxFdmVudCk7DQorfQ0KK0NGV0xfTGlzdEJveEltcERlbGVnYXRlOjpDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZShDRldMX0xpc3RCb3hJbXAqIHBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpIHt9DQoraW50MzJfdCBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgIGlmICghbV9wT3duZXItPklzRW5hYmxlZCgpKSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgIGludDMyX3QgaVJldCA9IDE7DQorICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KKyAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCisgICAgICBDRldMX01zZ01vdXNlKiBwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgICBzd2l0Y2ggKGR3Q21kKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgICAgIHBEYXRhLT5HZXRJdGVtVGV4dChtX3BJbnRlcmZhY2UsIGhJdGVtLCB3c1RleHQpOw0KLSAgICAgICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKHdzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQotICAgICAgICBpZiAoc3oueCA+IGZSZXQpIHsNCi0gICAgICAgICAgICBmUmV0ID0gc3oueDsNCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7fQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gZlJldDsNCi19DQotRlhfRkxPQVQgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRTY3JvbGxXaWR0aCgpDQotew0KLSAgICBGWF9GTE9BVCAqcGZXaWR0aCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBmV2lkdGgsIDApOw0KLSAgICByZXR1cm4gKnBmV2lkdGg7DQotfQ0KLUZYX0ZMT0FUIENGV0xfTGlzdEJveEltcDo6R2V0SXRlbUhlaWd0KCkNCi17DQotICAgIEZYX0ZMT0FUICpwZkZvbnQgPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX0ZvbnRTaXplKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwZkZvbnQsIDIwKTsNCi0gICAgcmV0dXJuICpwZkZvbnQgKyAyICogRldMX0xJU1RCT1hfSXRlbVRleHRNYXJnaW47DQotfQ0KLXZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpJbml0U2Nyb2xsQmFyKEZYX0JPT0wgYlZlcnQgKQ0KLXsNCi0gICAgaWYgKChiVmVydCAmJiBtX3BWZXJ0U2Nyb2xsQmFyKSB8fCAoIWJWZXJ0ICYmIG1fcEhvcnpTY3JvbGxCYXIpKSB7DQotICAgICAgICByZXR1cm47DQorICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2VXaGVlbDogew0KKyAgICAgIE9uTW91c2VXaGVlbCgoQ0ZXTF9Nc2dNb3VzZVdoZWVsKilwTWVzc2FnZSk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQotICAgIHByb3AubV9kd1N0eWxlRXhlcyA9IGJWZXJ0ID8gRldMX1NUWUxFRVhUX1NDQl9WZXJ0IDogRldMX1NUWUxFRVhUX1NDQl9Ib3J6Ow0KLSAgICBwcm9wLm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfSW52aXNpYmxlOw0KLSAgICBwcm9wLm1fcFBhcmVudCA9IG1fcEludGVyZmFjZTsNCi0gICAgcHJvcC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wU2Nyb2xsQmFyVFA7DQotICAgIElGV0xfU2Nyb2xsQmFyICpwU2Nyb2xsQmFyID0gSUZXTF9TY3JvbGxCYXI6OkNyZWF0ZSgpOw0KLSAgICBwU2Nyb2xsQmFyLT5Jbml0aWFsaXplKHByb3AsIG1fcEludGVyZmFjZSk7DQotICAgIGJWZXJ0ID8gKG1fcFZlcnRTY3JvbGxCYXIgPSBwU2Nyb2xsQmFyKSA6IChtX3BIb3J6U2Nyb2xsQmFyID0gcFNjcm9sbEJhcik7DQotfQ0KLXZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpTb3J0SXRlbSgpDQotew0KLX0NCi1GWF9CT09MIENGV0xfTGlzdEJveEltcDo6SXNTaG93U2Nyb2xsQmFyKEZYX0JPT0wgYlZlcnQpDQotew0KLSAgICBJRldMX1Njcm9sbEJhciogcFNjcm9sbGJhciA9IGJWZXJ0ID8gbV9wVmVydFNjcm9sbEJhciA6IG1fcEhvcnpTY3JvbGxCYXI7DQotICAgIGlmICghcFNjcm9sbGJhciB8fCAocFNjcm9sbGJhci0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgIENGV0xfTXNnS2V5KiBwTXNnID0gKENGV0xfTXNnS2V5KilwTWVzc2FnZTsNCisgICAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQorICAgICAgaWYgKGR3Q21kID09IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KKyAgICAgICAgT25LZXlEb3duKHBNc2cpOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyRm9jdXMpIHx8IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpOw0KKyAgICBkZWZhdWx0OiB7IGlSZXQgPSAwOyB9DQorICB9DQorICBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgIHJldHVybiBpUmV0Ow0KIH0NCi12b2lkIENGV0xfTGlzdEJveEltcDo6UHJvY2Vzc1NlbENoYW5nZWQoKQ0KLXsNCi0gICAgQ0ZXTF9FdnRMdGJTZWxDaGFuZ2VkIHNlbEV2ZW50Ow0KLSAgICBzZWxFdmVudC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIENGWF9JbnQzMkFycmF5IGFyclNlbHM7DQotICAgIGludDMyX3QgaUNvdW50ID0gQ291bnRTZWxJdGVtcygpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIEZXTF9ITElTVElURU0gaXRlbSA9IEdldFNlbEl0ZW0oaSk7DQotICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBzZWxFdmVudC5pYXJyYXlTZWxzLkFkZChpKTsNCi0gICAgfQ0KLSAgICBEaXNwYXRjaEV2ZW50KCZzZWxFdmVudCk7DQotfQ0KLUNGV0xfTGlzdEJveEltcERlbGVnYXRlOjpDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZShDRldMX0xpc3RCb3hJbXAgKnBPd25lcikNCi0gICAgOiBtX3BPd25lcihwT3duZXIpDQotew0KLX0NCi1pbnQzMl90IENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCi0gICAgaWYgKCFtX3BPd25lci0+SXNFbmFibGVkKCkpIHsNCi0gICAgICAgIHJldHVybiAxOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQotICAgIGludDMyX3QgaVJldCA9IDE7DQotICAgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCi0gICAgICAgICAgICAgICAgT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCi0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGR3Q21kKSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZVdoZWVsOiB7DQotICAgICAgICAgICAgICAgIE9uTW91c2VXaGVlbCgoQ0ZXTF9Nc2dNb3VzZVdoZWVsKilwTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQotICAgICAgICAgICAgICAgIENGV0xfTXNnS2V5ICpwTXNnID0gKENGV0xfTXNnS2V5KilwTWVzc2FnZTsNCi0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KLSAgICAgICAgICAgICAgICBpZiAoZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duKSB7DQotICAgICAgICAgICAgICAgICAgICBPbktleURvd24ocE1zZyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICBpUmV0ID0gMDsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQotICAgIHJldHVybiBpUmV0Ow0KLX0NCi1GV0xfRVJSIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBFdmVudCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAocEV2ZW50LT5HZXRDbGFzc0lEKCkgIT0gRldMX0VWVEhBU0hfU2Nyb2xsKSB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotICAgIH0NCi0gICAgSUZXTF9XaWRnZXQgKnBTcmNUYXJnZXQgPSBwRXZlbnQtPm1fcFNyY1RhcmdldDsNCi0gICAgaWYgKChwU3JjVGFyZ2V0ID09IChJRldMX1dpZGdldCopbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXIgJiYgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXIpIHx8IChwU3JjVGFyZ2V0ID09ICAoSUZXTF9XaWRnZXQqKW1fcE93bmVyLT5tX3BIb3J6U2Nyb2xsQmFyICYmIG1fcE93bmVyLT5tX3BIb3J6U2Nyb2xsQmFyKSkgew0KLSAgICAgICAgRlhfRFdPUkQgZHdTY3JvbGxDb2RlID0gKChDRldMX0V2dFNjcm9sbCopcEV2ZW50KS0+bV9pU2Nyb2xsQ29kZTsNCi0gICAgICAgIEZYX0ZMT0FUIGZQb3MgPSAoKENGV0xfRXZ0U2Nyb2xsKilwRXZlbnQpLT5tX2ZQb3M7DQotICAgICAgICBPblNjcm9sbCgoSUZXTF9TY3JvbGxCYXIqKXBTcmNUYXJnZXQsIGR3U2Nyb2xsQ29kZSwgZlBvcyk7DQotICAgIH0NCitGV0xfRVJSIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEV2ZW50LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKHBFdmVudC0+R2V0Q2xhc3NJRCgpICE9IEZXTF9FVlRIQVNIX1Njcm9sbCkgew0KICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBJRldMX1dpZGdldCogcFNyY1RhcmdldCA9IHBFdmVudC0+bV9wU3JjVGFyZ2V0Ow0KKyAgaWYgKChwU3JjVGFyZ2V0ID09IChJRldMX1dpZGdldCopbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXIgJiYNCisgICAgICAgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXIpIHx8DQorICAgICAgKHBTcmNUYXJnZXQgPT0gKElGV0xfV2lkZ2V0KiltX3BPd25lci0+bV9wSG9yelNjcm9sbEJhciAmJg0KKyAgICAgICBtX3BPd25lci0+bV9wSG9yelNjcm9sbEJhcikpIHsNCisgICAgRlhfRFdPUkQgZHdTY3JvbGxDb2RlID0gKChDRldMX0V2dFNjcm9sbCopcEV2ZW50KS0+bV9pU2Nyb2xsQ29kZTsNCisgICAgRlhfRkxPQVQgZlBvcyA9ICgoQ0ZXTF9FdnRTY3JvbGwqKXBFdmVudCktPm1fZlBvczsNCisgICAgT25TY3JvbGwoKElGV0xfU2Nyb2xsQmFyKilwU3JjVGFyZ2V0LCBkd1Njcm9sbENvZGUsIGZQb3MpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCitGV0xfRVJSIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KIH0NCi12b2lkIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCkNCi17DQotICAgIGlmIChtX3BPd25lci0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckZvY3VzKSB7DQotICAgICAgICBpZiAobV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXIpIHsNCi0gICAgICAgICAgICBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsICFiU2V0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX3BPd25lci0+bV9wSG9yelNjcm9sbEJhcikgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5tX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgIWJTZXQpOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAobV9wT3duZXItPkdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJGb2N1cykgew0KKyAgICBpZiAobV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgICBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsICFiU2V0KTsNCiAgICAgfQ0KLSAgICBpZiAoYlNldCkgew0KLSAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gKEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCisgICAgaWYgKG1fcE93bmVyLT5tX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgICAgbV9wT3duZXItPm1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCAhYlNldCk7DQorICAgIH0NCisgIH0NCisgIGlmIChiU2V0KSB7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IChGV0xfV0dUU1RBVEVfRm9jdXNlZCk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+KEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCisgIH0NCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgbV9wT3duZXItPm1fYkxCdXR0b25Eb3duID0gVFJVRTsNCisgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KKyAgICBtX3BPd25lci0+U2V0Rm9jdXMoVFJVRSk7DQorICB9DQorICBGV0xfSExJU1RJVEVNIGhJdGVtID0gbV9wT3duZXItPkdldEl0ZW1BdFBvaW50KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgaWYgKCFoSXRlbSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJg0KKyAgICAgIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlTZWxlY3Rpb24pIHsNCisgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmwpIHsNCisgICAgICBGWF9CT09MIGJTZWxlY3RlZCA9IG1fcE93bmVyLT5Jc0l0ZW1TZWxlY3RlZChoSXRlbSk7DQorICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgIWJTZWxlY3RlZCk7DQorICAgICAgbV9wT3duZXItPm1faEFuY2hvciA9IGhJdGVtOw0KKyAgICB9IGVsc2UgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX1NoaWZ0KSB7DQorICAgICAgaWYgKG1fcE93bmVyLT5tX2hBbmNob3IpIHsNCisgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb24obV9wT3duZXItPm1faEFuY2hvciwgaEl0ZW0sIFRSVUUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uRGlyZWN0KGhJdGVtLCBUUlVFKTsNCisgICAgICB9DQogICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+KEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCisgICAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uKGhJdGVtLCBoSXRlbSwgVFJVRSk7DQorICAgICAgbV9wT3duZXItPm1faEFuY2hvciA9IGhJdGVtOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uKGhJdGVtLCBoSXRlbSwgVFJVRSk7DQorICB9DQorICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX0NoZWNrKSB7DQorICAgIEZXTF9ITElTVElURU0gaFNlbGVjdGVkSXRlbSA9DQorICAgICAgICBtX3BPd25lci0+R2V0SXRlbUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgIENGWF9SZWN0RiBydENoZWNrOw0KKyAgICBtX3BPd25lci0+R2V0SXRlbUNoZWNrUmVjdChoU2VsZWN0ZWRJdGVtLCBydENoZWNrKTsNCisgICAgRlhfQk9PTCBiQ2hlY2tlZCA9IG1fcE93bmVyLT5HZXRJdGVtQ2hlY2tlZChoSXRlbSk7DQorICAgIGlmIChydENoZWNrLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgaWYgKGJDaGVja2VkKSB7DQorICAgICAgICBtX3BPd25lci0+U2V0SXRlbUNoZWNrZWQoaEl0ZW0sIEZBTFNFKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPlNldEl0ZW1DaGVja2VkKGhJdGVtLCBUUlVFKTsNCisgICAgICB9DQorICAgICAgbV9wT3duZXItPlVwZGF0ZSgpOw0KKyAgICB9DQorICB9DQorICBtX3BPd25lci0+U2V0Rm9jdXNJdGVtKGhJdGVtKTsNCisgIG1fcE93bmVyLT5TY3JvbGxUb1Zpc2libGUoaEl0ZW0pOw0KKyAgbV9wT3duZXItPlNldEdyYWIoVFJVRSk7DQorICBtX3BPd25lci0+UHJvY2Vzc1NlbENoYW5nZWQoKTsNCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24pIHsNCisgICAgbV9wT3duZXItPm1fYkxCdXR0b25Eb3duID0gRkFMU0U7DQorICAgIG1fcE93bmVyLT5TZXRHcmFiKEZBTFNFKTsNCisgICAgRGlzcGF0Y2hTZWxDaGFuZ2VkRXYoKTsNCisgIH0NCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25Nb3VzZVdoZWVsKENGV0xfTXNnTW91c2VXaGVlbCogcE1zZykgew0KKyAgaWYgKCFtX3BPd25lci0+SXNTaG93U2Nyb2xsQmFyKFRSVUUpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9DQorICAgICAgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXItPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNc2cpOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPbktleURvd24oQ0ZXTF9Nc2dLZXkqIHBNc2cpIHsNCisgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBNc2ctPm1fZHdLZXlDb2RlOw0KKyAgc3dpdGNoIChkd0tleUNvZGUpIHsNCisgICAgY2FzZSBGV0xfVktFWV9UYWI6DQorICAgIGNhc2UgRldMX1ZLRVlfVXA6DQorICAgIGNhc2UgRldMX1ZLRVlfRG93bjoNCisgICAgY2FzZSBGV0xfVktFWV9Ib21lOg0KKyAgICBjYXNlIEZXTF9WS0VZX0VuZDogew0KKyAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBtX3BPd25lci0+R2V0Rm9jdXNlZEl0ZW0oKTsNCisgICAgICBoSXRlbSA9IG1fcE93bmVyLT5HZXRJdGVtKGhJdGVtLCBkd0tleUNvZGUpOw0KKyAgICAgIEZYX0JPT0wgYlNoaWZ0ID0gcE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfU2hpZnQ7DQorICAgICAgRlhfQk9PTCBiQ3RybCA9IHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmw7DQorICAgICAgT25WSyhoSXRlbSwgYlNoaWZ0LCBiQ3RybCk7DQorICAgICAgRGlzcGF0Y2hTZWxDaGFuZ2VkRXYoKTsNCisgICAgICBtX3BPd25lci0+UHJvY2Vzc1NlbENoYW5nZWQoKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPblZLKEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkN0cmwpIHsNCisgIGlmICghaEl0ZW0pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYNCisgICAgICBGV0xfU1RZTEVFWFRfTFRCX011bHRpU2VsZWN0aW9uKSB7DQorICAgIGlmIChiQ3RybCkgew0KKyAgICB9IGVsc2UgaWYgKGJTaGlmdCkgew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9oQW5jaG9yKSB7DQorICAgICAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uKG1fcE93bmVyLT5tX2hBbmNob3IsIGhJdGVtLCBUUlVFKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgVFJVRSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb24oaEl0ZW0sIGhJdGVtLCBUUlVFKTsNCisgICAgICBtX3BPd25lci0+bV9oQW5jaG9yID0gaEl0ZW07DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb24oaEl0ZW0sIGhJdGVtLCBUUlVFKTsNCisgIH0NCisgIG1fcE93bmVyLT5TZXRGb2N1c0l0ZW0oaEl0ZW0pOw0KKyAgbV9wT3duZXItPlNjcm9sbFRvVmlzaWJsZShoSXRlbSk7DQorICB7DQorICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwgMCwgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uU2Nyb2xsKElGV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9zKSB7DQorICBDRlhfU2l6ZUYgZnM7DQorICBwU2Nyb2xsQmFyLT5HZXRSYW5nZShmcy54LCBmcy55KTsNCisgIEZYX0ZMT0FUIGlDdXJQb3MgPSBwU2Nyb2xsQmFyLT5HZXRQb3MoKTsNCisgIEZYX0ZMT0FUIGZTdGVwID0gcFNjcm9sbEJhci0+R2V0U3RlcFNpemUoKTsNCisgIHN3aXRjaCAoZHdDb2RlKSB7DQorICAgIGNhc2UgRldMX1NDQkNPREVfTWluOiB7DQorICAgICAgZlBvcyA9IGZzLng7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9NYXg6IHsNCisgICAgICBmUG9zID0gZnMueTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX1N0ZXBCYWNrd2FyZDogew0KKyAgICAgIGZQb3MgLT0gZlN0ZXA7DQorICAgICAgaWYgKGZQb3MgPCBmcy54ICsgZlN0ZXAgLyAyKSB7DQorICAgICAgICBmUG9zID0gZnMueDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9TdGVwRm9yd2FyZDogew0KKyAgICAgIGZQb3MgKz0gZlN0ZXA7DQorICAgICAgaWYgKGZQb3MgPiBmcy55IC0gZlN0ZXAgLyAyKSB7DQorICAgICAgICBmUG9zID0gZnMueTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9QYWdlQmFja3dhcmQ6IHsNCisgICAgICBmUG9zIC09IHBTY3JvbGxCYXItPkdldFBhZ2VTaXplKCk7DQorICAgICAgaWYgKGZQb3MgPCBmcy54KSB7DQorICAgICAgICBmUG9zID0gZnMueDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9QYWdlRm9yd2FyZDogew0KKyAgICAgIGZQb3MgKz0gcFNjcm9sbEJhci0+R2V0UGFnZVNpemUoKTsNCisgICAgICBpZiAoZlBvcyA+IGZzLnkpIHsNCisgICAgICAgIGZQb3MgPSBmcy55Ow0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX1BvczoNCisgICAgY2FzZSBGV0xfU0NCQ09ERV9UcmFja1BvczoNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGV0xfU0NCQ09ERV9FbmRTY3JvbGw6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGlDdXJQb3MgIT0gZlBvcykgew0KKyAgICBwU2Nyb2xsQmFyLT5TZXRQb3MoZlBvcyk7DQorICAgIHBTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIG1fcE93bmVyLT5tX2JMQnV0dG9uRG93biA9IFRSVUU7DQotICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KLSAgICAgICAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KLSAgICB9DQotICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBtX3BPd25lci0+R2V0SXRlbUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgIGlmICghaEl0ZW0pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX011bHRpU2VsZWN0aW9uKSB7DQotICAgICAgICBpZiAocE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfQ3RybCkgew0KLSAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkID0gbV9wT3duZXItPklzSXRlbVNlbGVjdGVkKGhJdGVtKTsNCi0gICAgICAgICAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uRGlyZWN0KGhJdGVtLCAhYlNlbGVjdGVkKTsNCi0gICAgICAgICAgICBtX3BPd25lci0+bV9oQW5jaG9yID0gaEl0ZW07DQotICAgICAgICB9IGVsc2UgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX1NoaWZ0KSB7DQotICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX2hBbmNob3IpIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbihtX3BPd25lci0+bV9oQW5jaG9yLCBoSXRlbSwgVFJVRSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgVFJVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uKGhJdGVtLCBoSXRlbSwgVFJVRSk7DQotICAgICAgICAgICAgbV9wT3duZXItPm1faEFuY2hvciA9IGhJdGVtOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbihoSXRlbSwgaEl0ZW0sIFRSVUUpOw0KLSAgICB9DQotICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfQ2hlY2spIHsNCi0gICAgICAgIEZXTF9ITElTVElURU0gaFNlbGVjdGVkSXRlbSA9IG1fcE93bmVyLT5HZXRJdGVtQXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgICAgIENGWF9SZWN0RiBydENoZWNrOw0KLSAgICAgICAgbV9wT3duZXItPkdldEl0ZW1DaGVja1JlY3QoaFNlbGVjdGVkSXRlbSwgcnRDaGVjayk7DQotICAgICAgICBGWF9CT09MIGJDaGVja2VkID0gbV9wT3duZXItPkdldEl0ZW1DaGVja2VkKGhJdGVtKTsNCi0gICAgICAgIGlmIChydENoZWNrLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICAgICAgaWYgKGJDaGVja2VkKSB7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5TZXRJdGVtQ2hlY2tlZChoSXRlbSwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5TZXRJdGVtQ2hlY2tlZChoSXRlbSwgVFJVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fcE93bmVyLT5VcGRhdGUoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX3BPd25lci0+U2V0Rm9jdXNJdGVtKGhJdGVtKTsNCi0gICAgbV9wT3duZXItPlNjcm9sbFRvVmlzaWJsZShoSXRlbSk7DQotICAgIG1fcE93bmVyLT5TZXRHcmFiKFRSVUUpOw0KLSAgICBtX3BPd25lci0+UHJvY2Vzc1NlbENoYW5nZWQoKTsNCi0gICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCi19DQotdm9pZCBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIGlmIChtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24pIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KLSAgICAgICAgbV9wT3duZXItPlNldEdyYWIoRkFMU0UpOw0KLSAgICAgICAgRGlzcGF0Y2hTZWxDaGFuZ2VkRXYoKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPbk1vdXNlV2hlZWwoQ0ZXTF9Nc2dNb3VzZVdoZWVsICpwTXNnKQ0KLXsNCi0gICAgaWYgKCFtX3BPd25lci0+SXNTaG93U2Nyb2xsQmFyKFRSVUUpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXItPlNldERlbGVnYXRlKE5VTEwpOw0KLSAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1zZyk7DQotfQ0KLXZvaWQgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uS2V5RG93bihDRldMX01zZ0tleSAqcE1zZykNCi17DQotICAgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBNc2ctPm1fZHdLZXlDb2RlOw0KLSAgICBzd2l0Y2goZHdLZXlDb2RlKSB7DQotICAgICAgICBjYXNlIEZXTF9WS0VZX1RhYjoNCi0gICAgICAgIGNhc2UgRldMX1ZLRVlfVXA6DQotICAgICAgICBjYXNlIEZXTF9WS0VZX0Rvd246DQotICAgICAgICBjYXNlIEZXTF9WS0VZX0hvbWU6DQotICAgICAgICBjYXNlIEZXTF9WS0VZX0VuZDogew0KLSAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gbV9wT3duZXItPkdldEZvY3VzZWRJdGVtKCk7DQotICAgICAgICAgICAgICAgIGhJdGVtID0gbV9wT3duZXItPkdldEl0ZW0oaEl0ZW0sIGR3S2V5Q29kZSk7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0ID0gcE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfU2hpZnQ7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkN0cmwgPSBwTXNnLT5tX2R3RmxhZ3MgJiBGV0xfS0VZRkxBR19DdHJsOw0KLSAgICAgICAgICAgICAgICBPblZLKGhJdGVtLCBiU2hpZnQsIGJDdHJsKTsNCi0gICAgICAgICAgICAgICAgRGlzcGF0Y2hTZWxDaGFuZ2VkRXYoKTsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPlByb2Nlc3NTZWxDaGFuZ2VkKCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25WSyhGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkNCi17DQotICAgIGlmICghaEl0ZW0pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX011bHRpU2VsZWN0aW9uKSB7DQotICAgICAgICBpZiAoYkN0cmwpIHsNCi0gICAgICAgIH0gZWxzZSBpZiAoYlNoaWZ0KSB7DQotICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX2hBbmNob3IpIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbihtX3BPd25lci0+bV9oQW5jaG9yLCBoSXRlbSwgVFJVRSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgVFJVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uKGhJdGVtLCBoSXRlbSwgVFJVRSk7DQotICAgICAgICAgICAgbV9wT3duZXItPm1faEFuY2hvciA9IGhJdGVtOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbihoSXRlbSwgaEl0ZW0sIFRSVUUpOw0KLSAgICB9DQotICAgIG1fcE93bmVyLT5TZXRGb2N1c0l0ZW0oaEl0ZW0pOw0KLSAgICBtX3BPd25lci0+U2Nyb2xsVG9WaXNpYmxlKGhJdGVtKTsNCi0gICAgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCi0gICAgICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPblNjcm9sbChJRldMX1Njcm9sbEJhciAqcFNjcm9sbEJhciwgRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zKQ0KLXsNCi0gICAgQ0ZYX1NpemVGIGZzOw0KLSAgICBwU2Nyb2xsQmFyLT5HZXRSYW5nZShmcy54LCBmcy55KTsNCi0gICAgRlhfRkxPQVQgaUN1clBvcyA9IHBTY3JvbGxCYXItPkdldFBvcygpOw0KLSAgICBGWF9GTE9BVCBmU3RlcCA9IHBTY3JvbGxCYXItPkdldFN0ZXBTaXplKCk7DQotICAgIHN3aXRjaCAoZHdDb2RlKSB7DQotICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX01pbjogew0KLSAgICAgICAgICAgICAgICBmUG9zID0gZnMueDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9NYXg6IHsNCi0gICAgICAgICAgICAgICAgZlBvcyA9IGZzLnk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NDQkNPREVfU3RlcEJhY2t3YXJkOiB7DQotICAgICAgICAgICAgICAgIGZQb3MgLT0gZlN0ZXA7DQotICAgICAgICAgICAgICAgIGlmIChmUG9zIDwgZnMueCArIGZTdGVwIC8gMikgew0KLSAgICAgICAgICAgICAgICAgICAgZlBvcyA9IGZzLng7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9TdGVwRm9yd2FyZDogew0KLSAgICAgICAgICAgICAgICBmUG9zICs9IGZTdGVwOw0KLSAgICAgICAgICAgICAgICBpZiAoZlBvcyA+IGZzLnkgLSBmU3RlcCAvIDIpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZQb3MgPSBmcy55Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NDQkNPREVfUGFnZUJhY2t3YXJkOiB7DQotICAgICAgICAgICAgICAgIGZQb3MgLT0gcFNjcm9sbEJhci0+R2V0UGFnZVNpemUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKGZQb3MgPCBmcy54KSB7DQotICAgICAgICAgICAgICAgICAgICBmUG9zID0gZnMueDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1BhZ2VGb3J3YXJkOiB7DQotICAgICAgICAgICAgICAgIGZQb3MgKz0gcFNjcm9sbEJhci0+R2V0UGFnZVNpemUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKGZQb3MgPiBmcy55KSB7DQotICAgICAgICAgICAgICAgICAgICBmUG9zID0gZnMueTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1BvczoNCi0gICAgICAgIGNhc2UgRldMX1NDQkNPREVfVHJhY2tQb3M6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX0VuZFNjcm9sbDoNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKGlDdXJQb3MgIT0gZlBvcykgew0KLSAgICAgICAgcFNjcm9sbEJhci0+U2V0UG9zKGZQb3MpOw0KLSAgICAgICAgcFNjcm9sbEJhci0+U2V0VHJhY2tQb3MoZlBvcyk7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpEaXNwYXRjaFNlbENoYW5nZWRFdigpDQotew0KLSAgICBDRldMX0V2dEx0YlNlbENoYW5nZWQgZXY7DQotICAgIGV2Lm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQotICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZldik7DQordm9pZCBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6RGlzcGF0Y2hTZWxDaGFuZ2VkRXYoKSB7DQorICBDRldMX0V2dEx0YlNlbENoYW5nZWQgZXY7DQorICBldi5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJmV2KTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX21vbnRoY2FsZW5kYXJpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX21vbnRoY2FsZW5kYXJpbXAuY3BwCmluZGV4IGM5OWI1YzYuLjgyMjE2MGYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyaW1wLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfbW9udGhjYWxlbmRhcmltcC5jcHAKQEAgLTksMTEwNSArOSwxMTMwIEBACiAjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX21vbnRoY2FsZW5kYXJpbXAuaCINCi0jZGVmaW5lIE1PTlRIQ0FMX0hTRVBfSEVJR0hUCQkJMQ0KLSNkZWZpbmUgTU9OVEhDQUxfVlNFUF9XSURUSAkJCQkxDQotI2RlZmluZSBNT05USENBTF9ITUFSR0lOCQkJCTMNCi0jZGVmaW5lIE1PTlRIQ0FMX1ZNQVJHSU4JCQkJMg0KLSNkZWZpbmUgTU9OVEhDQUxfUk9XUwkJCQkJOQ0KLSNkZWZpbmUgTU9OVEhDQUxfQ09MVU1OUwkJCQk3DQotI2RlZmluZSBNT05USENBTF9IRUFERVJfQlROX1ZNQVJHSU4JCTcNCi0jZGVmaW5lIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTgkJNQ0KLUlGV0xfTW9udGhDYWxlbmRhciogSUZXTF9Nb250aENhbGVuZGFyOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBJRldMX01vbnRoQ2FsZW5kYXI7DQorI2RlZmluZSBNT05USENBTF9IU0VQX0hFSUdIVCAxDQorI2RlZmluZSBNT05USENBTF9WU0VQX1dJRFRIIDENCisjZGVmaW5lIE1PTlRIQ0FMX0hNQVJHSU4gMw0KKyNkZWZpbmUgTU9OVEhDQUxfVk1BUkdJTiAyDQorI2RlZmluZSBNT05USENBTF9ST1dTIDkNCisjZGVmaW5lIE1PTlRIQ0FMX0NPTFVNTlMgNw0KKyNkZWZpbmUgTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOIDcNCisjZGVmaW5lIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiA1DQorSUZXTF9Nb250aENhbGVuZGFyKiBJRldMX01vbnRoQ2FsZW5kYXI6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgSUZXTF9Nb250aENhbGVuZGFyOw0KIH0NCi1JRldMX01vbnRoQ2FsZW5kYXI6OklGV0xfTW9udGhDYWxlbmRhcigpDQotew0KK0lGV0xfTW9udGhDYWxlbmRhcjo6SUZXTF9Nb250aENhbGVuZGFyKCkgew0KKyAgbV9wRGF0YSA9IE5VTEw7DQorfQ0KK0lGV0xfTW9udGhDYWxlbmRhcjo6fklGV0xfTW9udGhDYWxlbmRhcigpIHsNCisgIGlmIChtX3BEYXRhKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9Nb250aENhbGVuZGFySW1wKiltX3BEYXRhOw0KICAgICBtX3BEYXRhID0gTlVMTDsNCisgIH0NCiB9DQotSUZXTF9Nb250aENhbGVuZGFyOjp+SUZXTF9Nb250aENhbGVuZGFyKCkNCi17DQotICAgIGlmIChtX3BEYXRhKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YTsNCi0gICAgICAgIG1fcERhdGEgPSBOVUxMOw0KK0ZXTF9FUlIgSUZXTF9Nb250aENhbGVuZGFyOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9Nb250aENhbGVuZGFySW1wKHBPdXRlcik7DQorICAoKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgIHJldHVybiAoKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUiBJRldMX01vbnRoQ2FsZW5kYXI6OkluaXRpYWxpemUoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX01vbnRoQ2FsZW5kYXJJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgICgoQ0ZXTF9Nb250aENhbGVuZGFySW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9Nb250aENhbGVuZGFySW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitpbnQzMl90IElGV0xfTW9udGhDYWxlbmRhcjo6Q291bnRTZWxlY3QoKSB7DQorICByZXR1cm4gKChDRldMX01vbnRoQ2FsZW5kYXJJbXAqKW1fcERhdGEpLT5Db3VudFNlbGVjdCgpOw0KK30NCitGWF9CT09MIElGV0xfTW9udGhDYWxlbmRhcjo6R2V0U2VsZWN0KGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7DQorICByZXR1cm4gKChDRldMX01vbnRoQ2FsZW5kYXJJbXAqKW1fcERhdGEpDQorICAgICAgLT5HZXRTZWxlY3QoaVllYXIsIGlNb250aCwgaURheSwgbkluZGV4KTsNCit9DQorRlhfQk9PTCBJRldMX01vbnRoQ2FsZW5kYXI6OlNldFNlbGVjdChpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXkpIHsNCisgIHJldHVybiAoKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YSktPlNldFNlbGVjdChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCit9DQorQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDRldMX01vbnRoQ2FsZW5kYXJJbXAoSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwT3V0ZXIpLA0KKyAgICAgIG1faUxCdG5QYXJ0U3RhdGVzKEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbCksDQorICAgICAgbV9pUkJ0blBhcnRTdGF0ZXMoRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsKSwNCisgICAgICBtX2lDdXJNb250aCgxKSwNCisgICAgICBtX2lDdXJZZWFyKDIwMTEpLA0KKyAgICAgIG1faVllYXIoMjAxMSksDQorICAgICAgbV9pTW9udGgoMSksDQorICAgICAgbV9pRGF5KDEpLA0KKyAgICAgIG1faUhvdmVyZWQoLTEpIHsNCisgIG1fcnRIZWFkLlJlc2V0KCk7DQorICBtX3J0V2Vlay5SZXNldCgpOw0KKyAgbV9ydExCdG4uUmVzZXQoKTsNCisgIG1fcnRSQnRuLlJlc2V0KCk7DQorICBtX3J0RGF0ZXMuUmVzZXQoKTsNCisgIG1fcnRIU2VwLlJlc2V0KCk7DQorICBtX3J0SGVhZFRleHQuUmVzZXQoKTsNCisgIG1fcnRUb2RheS5SZXNldCgpOw0KKyAgbV9ydFRvZGF5RmxhZy5SZXNldCgpOw0KKyAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgbV9ydFdlZWtOdW0uUmVzZXQoKTsNCisgIG1fcnRXZWVrTnVtU2VwLlJlc2V0KCk7DQorICBtX3N6SGVhZC5SZXNldCgpOw0KKyAgbV9zekNlbGwuUmVzZXQoKTsNCisgIG1fc3pUb2RheS5SZXNldCgpOw0KKyAgbV9wRGF0ZVRpbWUgPSBuZXcgQ0ZYX0RhdGVUaW1lOw0KKyAgbV9iSW5pdCA9IEZBTFNFOw0KKyAgbV9pTWF4U2VsID0gMTsNCit9DQorQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDRldMX01vbnRoQ2FsZW5kYXJJbXAoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpLA0KKyAgICAgIG1faUxCdG5QYXJ0U3RhdGVzKEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbCksDQorICAgICAgbV9pUkJ0blBhcnRTdGF0ZXMoRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsKSwNCisgICAgICBtX2lDdXJNb250aCgxKSwNCisgICAgICBtX2lDdXJZZWFyKDIwMTEpLA0KKyAgICAgIG1faVllYXIoMjAxMSksDQorICAgICAgbV9pTW9udGgoMSksDQorICAgICAgbV9pRGF5KDEpLA0KKyAgICAgIG1faUhvdmVyZWQoLTEpIHsNCisgIG1fcnRIZWFkLlJlc2V0KCk7DQorICBtX3J0V2Vlay5SZXNldCgpOw0KKyAgbV9ydExCdG4uUmVzZXQoKTsNCisgIG1fcnRSQnRuLlJlc2V0KCk7DQorICBtX3J0RGF0ZXMuUmVzZXQoKTsNCisgIG1fcnRIU2VwLlJlc2V0KCk7DQorICBtX3J0SGVhZFRleHQuUmVzZXQoKTsNCisgIG1fcnRUb2RheS5SZXNldCgpOw0KKyAgbV9ydFRvZGF5RmxhZy5SZXNldCgpOw0KKyAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgbV9ydFdlZWtOdW0uUmVzZXQoKTsNCisgIG1fcnRXZWVrTnVtU2VwLlJlc2V0KCk7DQorICBtX3N6SGVhZC5SZXNldCgpOw0KKyAgbV9zekNlbGwuUmVzZXQoKTsNCisgIG1fc3pUb2RheS5SZXNldCgpOw0KKyAgbV9wRGF0ZVRpbWUgPSBuZXcgQ0ZYX0RhdGVUaW1lOw0KKyAgbV9iSW5pdCA9IEZBTFNFOw0KKyAgbV9pTWF4U2VsID0gMTsNCit9DQorQ0ZXTF9Nb250aENhbGVuZGFySW1wOjp+Q0ZXTF9Nb250aENhbGVuZGFySW1wKCkgew0KKyAgQ2xlYXJEYXRlSXRlbSgpOw0KKyAgZGVsZXRlIG1fcERhdGVUaW1lOw0KKyAgbV9hcnJTZWxEYXlzLlJlbW92ZUFsbCgpOw0KK30NCitGV0xfRVJSIENGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICB3c0NsYXNzID0gRldMX0NMQVNTX01vbnRoQ2FsZW5kYXI7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBGV0xfQ0xBU1NIQVNIX01vbnRoQ2FsZW5kYXI7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpJbml0aWFsaXplKCkgew0KKyAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBtX3BEZWxlZ2F0ZSA9DQorICAgICAgKElGV0xfV2lkZ2V0RGVsZWdhdGUqKUZYX05FVyBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkZpbmFsaXplKCkgew0KKyAgaWYgKG1fcERlbGVnYXRlKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICBDRlhfU2l6ZUYgZnMgPSBDYWxjU2l6ZShUUlVFKTsNCisgICAgcmVjdC5TZXQoMCwgMCwgZnMueCwgZnMueSk7DQorICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpVcGRhdGUoKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgfQ0KKyAgR2V0Q2FwVmFsdWUoKTsNCisgIGlmICghbV9iSW5pdCkgew0KKyAgICBtX2JJbml0ID0gSW5pdERhdGUoKTsNCisgIH0NCisgIENsZWFyRGF0ZUl0ZW0oKTsNCisgIFJlU2V0RGF0ZUl0ZW0oKTsNCisgIExheU91dCgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID09IE5VTEwpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX01DRF9Cb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfTUNEX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBEcmF3Qmtncm91bmQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd0hlYWRCSyhwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICBEcmF3TEJ1dHRvbihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICBEcmF3UkJ1dHRvbihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICBEcmF3U2VwZXJhdG9yKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIERyYXdEYXRlc0luQksocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd0RhdGVzSW5DaXJjbGUocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd0NhcHRpb24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd1dlZWsocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd0RhdGVzSW4ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd0RhdGVzT3V0KHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIERyYXdUb2RheShwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfV2Vla051bWJlcnMpIHsNCisgICAgRHJhd1dlZWtOdW1iZXJTZXAocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICBEcmF3V2Vla051bWJlcihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDb3VudFNlbGVjdCgpIHsNCisgIHJldHVybiBtX2FyclNlbERheXMuR2V0U2l6ZSgpOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0U2VsZWN0KGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4ID49IG1fYXJyU2VsRGF5cy5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaVllYXIgPSBtX2lDdXJZZWFyOw0KKyAgaU1vbnRoID0gbV9pQ3VyTW9udGg7DQorICBpRGF5ID0gbV9hcnJTZWxEYXlzW25JbmRleF07DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OlNldFNlbGVjdChpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXkpIHsNCisgIENoYW5nZVRvTW9udGgoaVllYXIsIGlNb250aCk7DQorICByZXR1cm4gQWRkU2VsRGF5KGlEYXkpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQorICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfQmFja2dyb3VuZDsNCisgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydENsaWVudDsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdIZWFkQksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX0hlYWRlcjsNCisgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydEhlYWQ7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3TEJ1dHRvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCisgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9MQnRuOw0KKyAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBtX2lMQnRuUGFydFN0YXRlczsNCisgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRMQnRuOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1JCdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQorICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfUkJ0bjsNCisgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtcy5tX2R3U3RhdGVzID0gbV9pUkJ0blBhcnRTdGF0ZXM7DQorICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0UkJ0bjsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdDYXB0aW9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZVRleHQgdGV4dFBhcmFtOw0KKyAgdGV4dFBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHRleHRQYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX0NhcHRpb247DQorICB0ZXh0UGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHRleHRQYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIGludDMyX3QgaVllYXI7DQorICBpbnQzMl90IGlNb250aDsNCisgIGlZZWFyID0gbV9pQ3VyWWVhcjsNCisgIGlNb250aCA9IG1faUN1ck1vbnRoOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXRpb247DQorICBHZXRIZWFkVGV4dChpWWVhciwgaU1vbnRoLCB3c0NhdGlvbik7DQorICB0ZXh0UGFyYW0ubV93c1RleHQgPSB3c0NhdGlvbjsNCisgIG1fc3pIZWFkID0gQ2FsY1RleHRTaXplKHRleHRQYXJhbS5tX3dzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICBDYWxjSGVhZFNpemUoKTsNCisgIHRleHRQYXJhbS5tX3J0UGFydCA9IG1fcnRIZWFkVGV4dDsNCisgIHRleHRQYXJhbS5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICB0ZXh0UGFyYW0ubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHRleHRQYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcFRoZW1lLT5EcmF3VGV4dCgmdGV4dFBhcmFtKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdTZXBlcmF0b3IoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX0hTZXBhcmF0b3I7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRIU2VwOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd0RhdGVzSW5CSyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQorICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfRGF0ZUluQks7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpQ291bnQ7IGorKykgew0KKyAgICBMUERBVEVJTkZPIHBEYXRhSW5mbyA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaik7DQorICAgIGlmIChwRGF0YUluZm8tPmR3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfU2VsZWN0ZWQpIHsNCisgICAgICBwYXJhbXMubV9kd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9TZWxlY3RlZDsNCisgICAgICBpZiAoKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5Q2lyY2xlKSA9PQ0KKyAgICAgICAgICAgMCkgJiYNCisgICAgICAgICAgcERhdGFJbmZvLT5kd1N0YXRlcyAmIEZXTF9JVEVNU1RBVEVfTUNEX0ZsYWcpIHsNCisgICAgICAgIHBhcmFtcy5tX2R3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfTUNEX0ZsYWdnZWQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChwRGF0YUluZm8tPmR3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfRm9jdXNlZCkgew0KKyAgICAgICAgcGFyYW1zLm1fZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9NQ0RfRm9jdXNlZDsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoaiA9PSBtX2lIb3ZlcmVkIC0gMSkgew0KKyAgICAgIHBhcmFtcy5tX2R3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfTUNEX0hvdmVyZWQ7DQorICAgIH0gZWxzZSBpZiAocERhdGFJbmZvLT5kd1N0YXRlcyAmIEZXTF9JVEVNU1RBVEVfTUNEX0ZsYWcpIHsNCisgICAgICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX0ZsYWdnZWQ7DQorICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCiAgICAgfQ0KLX0NCi1GV0xfRVJSIElGV0xfTW9udGhDYWxlbmRhcjo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX01vbnRoQ2FsZW5kYXJJbXAocE91dGVyKTsNCi0gICAgKChDRldMX01vbnRoQ2FsZW5kYXJJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCi19DQotRldMX0VSUglJRldMX01vbnRoQ2FsZW5kYXI6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX01vbnRoQ2FsZW5kYXJJbXAocHJvcGVydGllcywgcE91dGVyKTsNCi0gICAgKChDRldMX01vbnRoQ2FsZW5kYXJJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCi19DQotaW50MzJfdCBJRldMX01vbnRoQ2FsZW5kYXI6OkNvdW50U2VsZWN0KCkNCi17DQotICAgIHJldHVybiAoKENGV0xfTW9udGhDYWxlbmRhckltcCopbV9wRGF0YSktPkNvdW50U2VsZWN0KCk7DQotfQ0KLUZYX0JPT0wJSUZXTF9Nb250aENhbGVuZGFyOjpHZXRTZWxlY3QoaW50MzJfdCAmaVllYXIsIGludDMyX3QgJmlNb250aCwgaW50MzJfdCAmaURheSwgaW50MzJfdCBuSW5kZXgpDQotew0KLSAgICByZXR1cm4gKChDRldMX01vbnRoQ2FsZW5kYXJJbXAqKW1fcERhdGEpLT5HZXRTZWxlY3QoaVllYXIsIGlNb250aCwgaURheSwgbkluZGV4KTsNCi19DQotRlhfQk9PTAlJRldMX01vbnRoQ2FsZW5kYXI6OlNldFNlbGVjdChpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Nb250aENhbGVuZGFySW1wKiltX3BEYXRhKS0+U2V0U2VsZWN0KGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KLX0NCi1DRldMX01vbnRoQ2FsZW5kYXJJbXA6OkNGV0xfTW9udGhDYWxlbmRhckltcChJRldMX1dpZGdldCAqcE91dGVyICkNCi0gICAgOiBDRldMX1dpZGdldEltcChwT3V0ZXIpDQotICAgICwgbV9pTEJ0blBhcnRTdGF0ZXMoRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsKQ0KLSAgICAsIG1faVJCdG5QYXJ0U3RhdGVzKEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbCkNCi0gICAgLCBtX2lDdXJNb250aCgxKQ0KLSAgICAsIG1faUN1clllYXIoMjAxMSkNCi0gICAgLCBtX2lZZWFyKDIwMTEpDQotICAgICwgbV9pTW9udGgoMSkNCi0gICAgLCBtX2lEYXkoMSkNCi0gICAgLCBtX2lIb3ZlcmVkKC0xKQ0KLXsNCi0gICAgbV9ydEhlYWQuUmVzZXQoKTsNCi0gICAgbV9ydFdlZWsuUmVzZXQoKTsNCi0gICAgbV9ydExCdG4uUmVzZXQoKTsNCi0gICAgbV9ydFJCdG4uUmVzZXQoKTsNCi0gICAgbV9ydERhdGVzLlJlc2V0KCk7DQotICAgIG1fcnRIU2VwLlJlc2V0KCk7DQotICAgIG1fcnRIZWFkVGV4dC5SZXNldCgpOw0KLSAgICBtX3J0VG9kYXkuUmVzZXQoKTsNCi0gICAgbV9ydFRvZGF5RmxhZy5SZXNldCgpOw0KLSAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQotICAgIG1fcnRXZWVrTnVtLlJlc2V0KCk7DQotICAgIG1fcnRXZWVrTnVtU2VwLlJlc2V0KCk7DQotICAgIG1fc3pIZWFkLlJlc2V0KCk7DQotICAgIG1fc3pDZWxsLlJlc2V0KCk7DQotICAgIG1fc3pUb2RheS5SZXNldCgpOw0KLSAgICBtX3BEYXRlVGltZSA9IG5ldyBDRlhfRGF0ZVRpbWU7DQotICAgIG1fYkluaXQgPSBGQUxTRTsNCi0gICAgbV9pTWF4U2VsID0gMTsNCi19DQotQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDRldMX01vbnRoQ2FsZW5kYXJJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KLSAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCi0gICAgLCBtX2lMQnRuUGFydFN0YXRlcyhGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWwpDQotICAgICwgbV9pUkJ0blBhcnRTdGF0ZXMoRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsKQ0KLSAgICAsIG1faUN1ck1vbnRoKDEpDQotICAgICwgbV9pQ3VyWWVhcigyMDExKQ0KLSAgICAsIG1faVllYXIoMjAxMSkNCi0gICAgLCBtX2lNb250aCgxKQ0KLSAgICAsIG1faURheSgxKQ0KLSAgICAsIG1faUhvdmVyZWQoLTEpDQotew0KLSAgICBtX3J0SGVhZC5SZXNldCgpOw0KLSAgICBtX3J0V2Vlay5SZXNldCgpOw0KLSAgICBtX3J0TEJ0bi5SZXNldCgpOw0KLSAgICBtX3J0UkJ0bi5SZXNldCgpOw0KLSAgICBtX3J0RGF0ZXMuUmVzZXQoKTsNCi0gICAgbV9ydEhTZXAuUmVzZXQoKTsNCi0gICAgbV9ydEhlYWRUZXh0LlJlc2V0KCk7DQotICAgIG1fcnRUb2RheS5SZXNldCgpOw0KLSAgICBtX3J0VG9kYXlGbGFnLlJlc2V0KCk7DQotICAgIG1fcnRDbGllbnQuUmVzZXQoKTsNCi0gICAgbV9ydFdlZWtOdW0uUmVzZXQoKTsNCi0gICAgbV9ydFdlZWtOdW1TZXAuUmVzZXQoKTsNCi0gICAgbV9zekhlYWQuUmVzZXQoKTsNCi0gICAgbV9zekNlbGwuUmVzZXQoKTsNCi0gICAgbV9zelRvZGF5LlJlc2V0KCk7DQotICAgIG1fcERhdGVUaW1lID0gbmV3IENGWF9EYXRlVGltZTsNCi0gICAgbV9iSW5pdCA9IEZBTFNFOw0KLSAgICBtX2lNYXhTZWwgPSAxOw0KLX0NCi1DRldMX01vbnRoQ2FsZW5kYXJJbXA6On5DRldMX01vbnRoQ2FsZW5kYXJJbXAoKQ0KLXsNCi0gICAgQ2xlYXJEYXRlSXRlbSgpOw0KLSAgICBkZWxldGUgbV9wRGF0ZVRpbWU7DQotICAgIG1fYXJyU2VsRGF5cy5SZW1vdmVBbGwoKTsNCi19DQotRldMX0VSUiBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCi17DQotICAgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfTW9udGhDYWxlbmRhcjsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9EV09SRCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkdldENsYXNzSUQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfTW9udGhDYWxlbmRhcjsNCi19DQotRldMX0VSUiBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlKHRoaXMpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpGaW5hbGl6ZSgpDQotew0KLSAgICBpZiAoIG1fcERlbGVnYXRlKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCi0gICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgKQ0KLXsNCi0gICAgaWYgKGJBdXRvU2l6ZSkgew0KLSAgICAgICAgQ0ZYX1NpemVGIGZzID0gQ2FsY1NpemUoVFJVRSk7DQotICAgICAgICByZWN0LlNldCgwLCAwLCBmcy54LCBmcy55KTsNCi0gICAgICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfTW9udGhDYWxlbmRhckltcDo6VXBkYXRlKCkNCi17DQotICAgIGlmIChJc0xvY2tlZCgpKSB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLSAgICB9DQotICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KLSAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgIH0NCi0gICAgR2V0Q2FwVmFsdWUoKTsNCi0gICAgaWYgKCFtX2JJbml0KSB7DQotICAgICAgICBtX2JJbml0ID0gSW5pdERhdGUoKTsNCi0gICAgfQ0KLSAgICBDbGVhckRhdGVJdGVtKCk7DQotICAgIFJlU2V0RGF0ZUl0ZW0oKTsNCi0gICAgTGF5T3V0KCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID09IE5VTEwpIHsNCi0gICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KLSAgICB9DQotICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCi0gICAgaWYgKEhhc0JvcmRlcigpKSB7DQotICAgICAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgRldMX1BBUlRfTUNEX0JvcmRlciwgcFRoZW1lLCBwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBpZiAoSGFzRWRnZSgpKSB7DQotICAgICAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX01DRF9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIERyYXdCa2dyb3VuZChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIERyYXdIZWFkQksocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICBEcmF3TEJ1dHRvbihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIERyYXdSQnV0dG9uKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCi0gICAgRHJhd1NlcGVyYXRvcihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIERyYXdEYXRlc0luQksocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICBEcmF3RGF0ZXNJbkNpcmNsZShwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIERyYXdDYXB0aW9uKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCi0gICAgRHJhd1dlZWsocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICBEcmF3RGF0ZXNJbihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIERyYXdEYXRlc091dChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIERyYXdUb2RheShwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9XZWVrTnVtYmVycykgew0KLSAgICAgICAgRHJhd1dlZWtOdW1iZXJTZXAocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICAgICAgRHJhd1dlZWtOdW1iZXIocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotaW50MzJfdCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkNvdW50U2VsZWN0KCkNCi17DQotICAgIHJldHVybiBtX2FyclNlbERheXMuR2V0U2l6ZSgpOw0KLX0NCi1GWF9CT09MIENGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0U2VsZWN0KGludDMyX3QgJmlZZWFyLCBpbnQzMl90ICZpTW9udGgsIGludDMyX3QgJmlEYXksIGludDMyX3QgbkluZGV4ICkNCi17DQotICAgIGlmIChuSW5kZXggPj0gbV9hcnJTZWxEYXlzLkdldFNpemUoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlZZWFyID0gbV9pQ3VyWWVhcjsNCi0gICAgaU1vbnRoID0gbV9pQ3VyTW9udGg7DQotICAgIGlEYXkgPSBtX2FyclNlbERheXNbbkluZGV4XTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpTZXRTZWxlY3QoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSkNCi17DQotICAgIENoYW5nZVRvTW9udGgoaVllYXIsIGlNb250aCk7DQotICAgIHJldHVybiBBZGRTZWxEYXkoaURheSk7DQotfQ0KLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KLSAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9CYWNrZ3JvdW5kOw0KLSAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KLSAgICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0Q2xpZW50Ow0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgIH0NCisgICAgcGFyYW1zLm1fcnRQYXJ0ID0gcERhdGFJbmZvLT5yZWN0Ow0KICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KKyAgICBwYXJhbXMubV9kd1N0YXRlcyA9IDA7DQorICB9DQogfQ0KLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3SGVhZEJLKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCi0gICAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfSGVhZGVyOw0KLSAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KLSAgICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0SGVhZDsNCi0gICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQotfQ0KLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3TEJ1dHRvbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQotICAgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX0xCdG47DQotICAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBtX2lMQnRuUGFydFN0YXRlczsNCi0gICAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydExCdG47DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KLX0NCi12b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1JCdXR0b24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KLSAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9SQnRuOw0KLSAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gbV9pUkJ0blBhcnRTdGF0ZXM7DQotICAgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRSQnRuOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgIH0NCi0gICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCi19DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdDYXB0aW9uKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIENGV0xfVGhlbWVUZXh0IHRleHRQYXJhbTsNCi0gICAgdGV4dFBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgdGV4dFBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfQ2FwdGlvbjsNCi0gICAgdGV4dFBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWw7DQotICAgIHRleHRQYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgaW50MzJfdCBpWWVhcjsNCi0gICAgaW50MzJfdCBpTW9udGg7DQotICAgIGlZZWFyID0gbV9pQ3VyWWVhcjsNCi0gICAgaU1vbnRoID0gbV9pQ3VyTW9udGg7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQ2F0aW9uOw0KLSAgICBHZXRIZWFkVGV4dChpWWVhciwgaU1vbnRoLCB3c0NhdGlvbik7DQotICAgIHRleHRQYXJhbS5tX3dzVGV4dCA9IHdzQ2F0aW9uOw0KLSAgICBtX3N6SGVhZCA9IENhbGNUZXh0U2l6ZSh0ZXh0UGFyYW0ubV93c1RleHQsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KLSAgICBDYWxjSGVhZFNpemUoKTsNCi0gICAgdGV4dFBhcmFtLm1fcnRQYXJ0ID0gbV9ydEhlYWRUZXh0Ow0KLSAgICB0ZXh0UGFyYW0ubV9kd1RUT1N0eWxlcyA9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KLSAgICB0ZXh0UGFyYW0ubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCi0gICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgIHRleHRQYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIHBUaGVtZS0+RHJhd1RleHQoJnRleHRQYXJhbSk7DQotfQ0KLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3U2VwZXJhdG9yKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCi0gICAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfSFNlcGFyYXRvcjsNCi0gICAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCi0gICAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydEhTZXA7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KLX0NCi12b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd0RhdGVzSW5CSyhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQotICAgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX0RhdGVJbkJLOw0KLSAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpQ291bnQ7IGogKyspIHsNCi0gICAgICAgIExQREFURUlORk8gcERhdGFJbmZvID0gKExQREFURUlORk8pbV9hcnJEYXRlcy5HZXRBdChqKTsNCi0gICAgICAgIGlmIChwRGF0YUluZm8tPmR3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfU2VsZWN0ZWQpIHsNCi0gICAgICAgICAgICBwYXJhbXMubV9kd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9TZWxlY3RlZDsNCi0gICAgICAgICAgICBpZiAoKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5Q2lyY2xlKSA9PSAwKSAmJiBwRGF0YUluZm8tPmR3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfRmxhZykgew0KLSAgICAgICAgICAgICAgICBwYXJhbXMubV9kd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9GbGFnZ2VkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocERhdGFJbmZvLT5kd1N0YXRlcyAmIEZXTF9JVEVNU1RBVEVfTUNEX0ZvY3VzZWQpIHsNCi0gICAgICAgICAgICAgICAgcGFyYW1zLm1fZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9NQ0RfRm9jdXNlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGogPT0gbV9pSG92ZXJlZCAtIDEpIHsNCi0gICAgICAgICAgICBwYXJhbXMubV9kd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9Ib3ZlcmVkOw0KLSAgICAgICAgfSBlbHNlIGlmIChwRGF0YUluZm8tPmR3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfRmxhZykgew0KLSAgICAgICAgICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfRmxhZ2dlZDsNCi0gICAgICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcGFyYW1zLm1fcnRQYXJ0ID0gcERhdGFJbmZvLT5yZWN0Ow0KLSAgICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCi0gICAgICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gMDsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1dlZWsoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KLSAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9XZWVrOw0KLSAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KLSAgICBwYXJhbXMubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCi0gICAgaW50MzJfdCBpV2VlazsNCi0gICAgaVdlZWsgPSBtX3BEYXRlVGltZS0+R2V0RGF5T2ZXZWVrKCk7DQotICAgIENGWF9SZWN0RiBydERheU9mV2VlazsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBXZWVrRGF5W10gPSB7DQotICAgICAgICAoRlhfV0NIQVIgKilMIlN1biIsIChGWF9XQ0hBUiAqKUwiTW9uIiwgKEZYX1dDSEFSICopTCJUdWUiLA0KLSAgICAgICAgKEZYX1dDSEFSICopTCJXZWQiLCAoRlhfV0NIQVIgKilMIlRodSIsIChGWF9XQ0hBUiAqKUwiRnJpIiwgKEZYX1dDSEFSICopTCJTYXQiDQotICAgIH07DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA3OyBpKyspIHsNCi0gICAgICAgIHJ0RGF5T2ZXZWVrLlNldChtX3J0V2Vlay5sZWZ0ICsgaSAqIChtX3N6Q2VsbC54ICsgTU9OVEhDQUxfSE1BUkdJTiAqIDIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRXZWVrLnRvcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3N6Q2VsbC54LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fc3pDZWxsLnkpOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgKndzV2Vla0RheSA9IE5VTEw7DQotICAgICAgICB3c1dlZWtEYXkgPSAoQ0ZYX1dpZGVTdHJpbmcgKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJhbXMsIGkgKyBGV0xfTUNDQVBBQ0lUWV9TdW4pOw0KLSAgICAgICAgcGFyYW1zLm1fcnRQYXJ0ID0gcnREYXlPZldlZWs7DQotICAgICAgICBwYXJhbXMubV93c1RleHQgPSAqd3NXZWVrRGF5Ow0KLSAgICAgICAgcGFyYW1zLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCi0gICAgICAgIHBUaGVtZS0+RHJhd1RleHQoJnBhcmFtcyk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdXZWVrTnVtYmVyKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIENGV0xfVGhlbWVUZXh0IHBhcmFtczsNCi0gICAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfV2Vla051bTsNCi0gICAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCi0gICAgcGFyYW1zLm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0Ow0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1dlZWtOdW07DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdXZWVrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX1dlZWs7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHBhcmFtcy5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KKyAgaW50MzJfdCBpV2VlazsNCisgIGlXZWVrID0gbV9wRGF0ZVRpbWUtPkdldERheU9mV2VlaygpOw0KKyAgQ0ZYX1JlY3RGIHJ0RGF5T2ZXZWVrOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBXZWVrRGF5W10gPSB7KEZYX1dDSEFSKilMIlN1biIsIChGWF9XQ0hBUiopTCJNb24iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX1dDSEFSKilMIlR1ZSIsIChGWF9XQ0hBUiopTCJXZWQiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX1dDSEFSKilMIlRodSIsIChGWF9XQ0hBUiopTCJGcmkiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX1dDSEFSKilMIlNhdCJ9Ow0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA3OyBpKyspIHsNCisgICAgcnREYXlPZldlZWsuU2V0KG1fcnRXZWVrLmxlZnQgKyBpICogKG1fc3pDZWxsLnggKyBNT05USENBTF9ITUFSR0lOICogMiksDQorICAgICAgICAgICAgICAgICAgICBtX3J0V2Vlay50b3AsIG1fc3pDZWxsLngsIG1fc3pDZWxsLnkpOw0KKyAgICBDRlhfV2lkZVN0cmluZyogd3NXZWVrRGF5ID0gTlVMTDsNCisgICAgd3NXZWVrRGF5ID0NCisgICAgICAgIChDRlhfV2lkZVN0cmluZyopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFyYW1zLCBpICsgRldMX01DQ0FQQUNJVFlfU3VuKTsNCisgICAgcGFyYW1zLm1fcnRQYXJ0ID0gcnREYXlPZldlZWs7DQorICAgIHBhcmFtcy5tX3dzVGV4dCA9ICp3c1dlZWtEYXk7DQogICAgIHBhcmFtcy5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQotICAgIHBhcmFtcy5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgIH0NCi0gICAgaW50MzJfdCBpV2Vla051bSA9IDA7DQotICAgIGludDMyX3QgaU1vbnRoTnVtID0gbV9wRGF0ZVRpbWUtPkdldE1vbnRoKCk7DQotICAgIGludDMyX3QgaURheU51bSA9IEZYX0RheXNJbk1vbnRoKG1faUN1clllYXIsIGlNb250aE51bSk7DQotICAgIGludDMyX3QgaVRlbXAgPSAwOw0KLSAgICBGWF9GTE9BVCBmVlN0YXJ0UG9zID0gbV9ydENsaWVudC50b3AgKyBtX2ZIZWFkSGVpICsgbV9mSFNlcEhlaTsNCi0gICAgRlhfRkxPQVQgZkhTdGFydFBvcyA9IG1fcnRDbGllbnQubGVmdDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDw9IGlEYXlOdW07IGkgKz0gNykgew0KLSAgICAgICAgaVRlbXAgKys7DQotICAgICAgICBpV2Vla051bSA9IENhbFdlZWtOdW1iZXIobV9pQ3VyWWVhciwgaU1vbnRoTnVtLCBpKTsNCi0gICAgICAgIG1fcnRXZWVrTnVtLlNldChmSFN0YXJ0UG9zLCBmVlN0YXJ0UG9zICsgbV9mRGF0ZUNlbGxIZWkgKiBpVGVtcCwgbV9mV2Vla051bVdpZCwgbV9mRGF0ZUNlbGxIZWkpOw0KLSAgICAgICAgd3NXZWVrTnVtLkZvcm1hdChMIiVkIiwgaVdlZWtOdW0pOw0KLSAgICAgICAgcGFyYW1zLm1fd3NUZXh0ID0gd3NXZWVrTnVtOw0KLSAgICAgICAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydFdlZWtOdW07DQotICAgICAgICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbXMpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3V2Vla051bWJlclNlcChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQotICAgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX1dlZWtOdW1TZXA7DQotICAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWw7DQotICAgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRXZWVrTnVtU2VwOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgIH0NCi0gICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCi19DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdUb2RheShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTm9Ub2RheSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGV0xfVGhlbWVUZXh0IHBhcmFtczsNCi0gICAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfVG9kYXk7DQotICAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWw7DQotICAgIHBhcmFtcy5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgKndzRGF5ID0gTlVMTDsNCi0gICAgd3NEYXkgPSAoQ0ZYX1dpZGVTdHJpbmcgKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJhbXMsIEZXTF9NQ0NBUEFDSVRZX1RvZGF5KTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICBHZXRUb2RheVRleHQobV9pWWVhciwgbV9pTW9udGgsIG1faURheSwgd3NUZXh0KTsNCi0gICAgcGFyYW1zLm1fd3NUZXh0ID0gKndzRGF5ICsgd3NUZXh0Ow0KLSAgICBtX3N6VG9kYXkgPSBDYWxjVGV4dFNpemUocGFyYW1zLm1fd3NUZXh0LCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCi0gICAgQ2FsY1RvZGF5U2l6ZSgpOw0KLSAgICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0VG9kYXk7DQotICAgIHBhcmFtcy5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KICAgICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbXMpOw0KKyAgfQ0KIH0NCi12b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd0RhdGVzSW4oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KLSAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9EYXRlc0luOw0KLSAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KLSAgICBwYXJhbXMubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCi0gICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlDb3VudDsgaiArKykgew0KLSAgICAgICAgTFBEQVRFSU5GTyBwRGF0YUluZm8gPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzLkdldEF0KGopOw0KLSAgICAgICAgcGFyYW1zLm1fd3NUZXh0ID0gcERhdGFJbmZvLT53c0RheTsNCi0gICAgICAgIHBhcmFtcy5tX3J0UGFydCA9IHBEYXRhSW5mby0+cmVjdDsNCi0gICAgICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gcERhdGFJbmZvLT5kd1N0YXRlczsNCi0gICAgICAgIGlmIChqICsgMSA9PSBtX2lIb3ZlcmVkKSB7DQotICAgICAgICAgICAgcGFyYW1zLm1fZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9NQ0RfSG92ZXJlZDsNCi0gICAgICAgIH0NCi0gICAgICAgIHBhcmFtcy5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQotICAgICAgICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbXMpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3RGF0ZXNPdXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KLSAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9EYXRlc091dDsNCi0gICAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCi0gICAgcGFyYW1zLm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3V2Vla051bWJlcihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVUZXh0IHBhcmFtczsNCisgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9XZWVrTnVtOw0KKyAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWw7DQorICBwYXJhbXMubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQ7DQorICBDRlhfV2lkZVN0cmluZyB3c1dlZWtOdW07DQorICBwYXJhbXMubV9kd1RUT1N0eWxlcyA9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KKyAgcGFyYW1zLm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIGludDMyX3QgaVdlZWtOdW0gPSAwOw0KKyAgaW50MzJfdCBpTW9udGhOdW0gPSBtX3BEYXRlVGltZS0+R2V0TW9udGgoKTsNCisgIGludDMyX3QgaURheU51bSA9IEZYX0RheXNJbk1vbnRoKG1faUN1clllYXIsIGlNb250aE51bSk7DQorICBpbnQzMl90IGlUZW1wID0gMDsNCisgIEZYX0ZMT0FUIGZWU3RhcnRQb3MgPSBtX3J0Q2xpZW50LnRvcCArIG1fZkhlYWRIZWkgKyBtX2ZIU2VwSGVpOw0KKyAgRlhfRkxPQVQgZkhTdGFydFBvcyA9IG1fcnRDbGllbnQubGVmdDsNCisgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8PSBpRGF5TnVtOyBpICs9IDcpIHsNCisgICAgaVRlbXArKzsNCisgICAgaVdlZWtOdW0gPSBDYWxXZWVrTnVtYmVyKG1faUN1clllYXIsIGlNb250aE51bSwgaSk7DQorICAgIG1fcnRXZWVrTnVtLlNldChmSFN0YXJ0UG9zLCBmVlN0YXJ0UG9zICsgbV9mRGF0ZUNlbGxIZWkgKiBpVGVtcCwNCisgICAgICAgICAgICAgICAgICAgIG1fZldlZWtOdW1XaWQsIG1fZkRhdGVDZWxsSGVpKTsNCisgICAgd3NXZWVrTnVtLkZvcm1hdChMIiVkIiwgaVdlZWtOdW0pOw0KKyAgICBwYXJhbXMubV93c1RleHQgPSB3c1dlZWtOdW07DQorICAgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRXZWVrTnVtOw0KICAgICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbXMpOw0KKyAgfQ0KIH0NCi12b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd0RhdGVzSW5DaXJjbGUoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXlDaXJjbGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAobV9pTW9udGggIT0gbV9pQ3VyTW9udGggfHwgbV9pWWVhciAhPSBtX2lDdXJZZWFyKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1faURheSA8IDEgfHwgbV9pRGF5ID4gbV9hcnJEYXRlcy5HZXRTaXplKCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBMUERBVEVJTkZPIHBEYXRlID0gKExQREFURUlORk8pbV9hcnJEYXRlc1ttX2lEYXkgLSAxXTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRGF0ZSk7DQotICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCi0gICAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfRGF0ZUluQ2lyY2xlOw0KLSAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIHBhcmFtcy5tX3J0UGFydCA9IHBEYXRlLT5yZWN0Ow0KLSAgICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCi0gICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdXZWVrTnVtYmVyU2VwKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX1dlZWtOdW1TZXA7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRXZWVrTnVtU2VwOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KIH0NCi12b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1RvZGF5Q2lyY2xlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXlDaXJjbGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQotICAgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX1RvZGF5Q2lyY2xlOw0KLSAgICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KLSAgICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0VG9kYXlGbGFnOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgIH0NCi0gICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCi19DQotQ0ZYX1NpemVGIENGV0xfTW9udGhDYWxlbmRhckltcDo6Q2FsY1NpemUoRlhfQk9PTCBiQXV0b1NpemUpDQotew0KLSAgICBDRlhfU2l6ZUYgZnM7DQotICAgIGZzLlNldCgwLCAwKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBmcyk7DQotICAgIGlmIChiQXV0b1NpemUpIHsNCi0gICAgICAgIENGV0xfVGhlbWVQYXJ0IHBhcmFtczsNCi0gICAgICAgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyAqd3NUZXh0ID0gTlVMTDsNCi0gICAgICAgIEZYX0ZMT0FUIGZNYXhXZWVrVyA9IDAuMGY7DQotICAgICAgICBGWF9GTE9BVCBmTWF4V2Vla0ggPSAwLjBmOw0KLSAgICAgICAgZm9yIChGWF9EV09SRCB3ZWVrID0gRldMX01DQ0FQQUNJVFlfU3VuOyB3ZWVrIDw9IEZXTF9NQ0NBUEFDSVRZX1NhdDsgd2VlaysrKSB7DQotICAgICAgICAgICAgd3NUZXh0ID0gKENGWF9XaWRlU3RyaW5nICopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFyYW1zLCB3ZWVrKTsNCi0gICAgICAgICAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUoKndzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQotICAgICAgICAgICAgZk1heFdlZWtXID0gKGZNYXhXZWVrVyA+PSBzei54KSA/IGZNYXhXZWVrVyA6IHN6Lng7DQotICAgICAgICAgICAgZk1heFdlZWtIID0gKGZNYXhXZWVrSCA+PSBzei55KSA/IGZNYXhXZWVrSCA6IHN6Lnk7DQotICAgICAgICB9DQotICAgICAgICBGWF9GTE9BVCBmRGF5TWF4VyA9IDAuMGY7DQotICAgICAgICBGWF9GTE9BVCBmRGF5TWF4SCA9IDAuMGY7DQotICAgICAgICBmb3IgKGludCBkYXkgPSAxMDsgZGF5IDw9IDMxOyBkYXkrKykgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5Ow0KLSAgICAgICAgICAgIHdzRGF5LkZvcm1hdChMIiVkIiwgZGF5KTsNCi0gICAgICAgICAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUod3NEYXksIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KLSAgICAgICAgICAgIGZEYXlNYXhXID0gKGZEYXlNYXhXID49IHN6LngpID8gZkRheU1heFcgOiBzei54Ow0KLSAgICAgICAgICAgIGZEYXlNYXhIID0gKGZEYXlNYXhIID49IHN6LnkpID8gZkRheU1heEggOiBzei55Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9zekNlbGwueCA9IEZYX0ZMT0FUKChmTWF4V2Vla1cgPj0gZkRheU1heFcpID8gKGludCkoZk1heFdlZWtXICsgMC41KSA6IChpbnQpKGZEYXlNYXhXICsgMC41KSk7DQotICAgICAgICBtX3N6Q2VsbC55ID0gKGZNYXhXZWVrSCA+PSBmRGF5TWF4SCkgPyBmTWF4V2Vla0ggOiBmRGF5TWF4SDsNCi0gICAgICAgIGZzLnggPSBtX3N6Q2VsbC54ICogTU9OVEhDQUxfQ09MVU1OUyArIE1PTlRIQ0FMX0hNQVJHSU4gKiBNT05USENBTF9DT0xVTU5TICogMiArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiAqIDI7DQotICAgICAgICBGWF9GTE9BVCBmTW9udGhNYXhXID0gMC4wZjsNCi0gICAgICAgIEZYX0ZMT0FUIGZNb250aE1heEggPSAwLjBmOw0KLSAgICAgICAgZm9yIChGWF9EV09SRCBtb250aCA9IEZXTF9NQ0NBUEFDSVRZX0phbnVhcnk7IG1vbnRoIDw9IEZXTF9NQ0NBUEFDSVRZX0RlY2VtYmVyOyBtb250aCsrKSB7DQotICAgICAgICAgICAgd3NUZXh0ID0gKENGWF9XaWRlU3RyaW5nICopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFyYW1zLCBtb250aCk7DQotICAgICAgICAgICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKCp3c1RleHQsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KLSAgICAgICAgICAgIGZNb250aE1heFcgPSAoZk1vbnRoTWF4VyA+PSBzei54KSA/IGZNb250aE1heFcgOiBzei54Ow0KLSAgICAgICAgICAgIGZNb250aE1heEggPSAoZk1vbnRoTWF4SCA+PSBzei55KSA/IGZNb250aE1heEggOiBzei55Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NZZWFyOw0KLSAgICAgICAgR2V0SGVhZFRleHQobV9pWWVhciwgbV9pTW9udGgsIHdzWWVhcik7DQotICAgICAgICBDRlhfU2l6ZUYgc3pZZWFyID0gQ2FsY1RleHRTaXplKHdzWWVhciwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQotICAgICAgICBmTW9udGhNYXhIID0gKGZNb250aE1heEggPj0gc3pZZWFyLnkpID8gZk1vbnRoTWF4SCA6IHN6WWVhci55Ow0KLSAgICAgICAgbV9zekhlYWQuU2V0KGZNb250aE1heFcgKyBzelllYXIueCwgZk1vbnRoTWF4SCk7DQotICAgICAgICBmTW9udGhNYXhXID0gbV9zekhlYWQueCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiAqIDIgKyBtX3N6Q2VsbC54ICogMjsNCi0gICAgICAgIGZzLnggPSAoZnMueCA+PSBmTW9udGhNYXhXKSA/IGZzLnggOiBmTW9udGhNYXhXOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUb2RheTsNCi0gICAgICAgIEdldFRvZGF5VGV4dChtX2lZZWFyLCBtX2lNb250aCwgbV9pRGF5LCB3c1RvZGF5KTsNCi0gICAgICAgIHdzVGV4dCA9IChDRlhfV2lkZVN0cmluZyAqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcmFtcywgRldMX01DQ0FQQUNJVFlfVG9kYXkpOw0KLSAgICAgICAgbV93c1RvZGF5ID0gKndzVGV4dCArIHdzVG9kYXk7DQotICAgICAgICBtX3N6VG9kYXkgPSBDYWxjVGV4dFNpemUod3NUb2RheSwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQotICAgICAgICBtX3N6VG9kYXkueSA9IChtX3N6VG9kYXkueSA+PSBtX3N6Q2VsbC55KSA/IG1fc3pUb2RheS55IDogbV9zekNlbGwueTsNCi0gICAgICAgIGZzLnkgPSBtX3N6Q2VsbC54ICsgbV9zekNlbGwueSAqIChNT05USENBTF9ST1dTIC0gMikgKyBtX3N6VG9kYXkueSArIE1PTlRIQ0FMX1ZNQVJHSU4gKiBNT05USENBTF9ST1dTICogMiArIE1PTlRIQ0FMX0hFQURFUl9CVE5fVk1BUkdJTiAqIDQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KLSAgICAgICAgZnMuU2V0KG1fcnRDbGllbnQud2lkdGgsIG1fcnRDbGllbnQuaGVpZ2h0KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gZnM7DQotfQ0KLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDYWxjSGVhZFNpemUoKQ0KLXsNCi0gICAgRlhfRkxPQVQgZkhlYWRITWFyZ2luID0gKG1fcnRDbGllbnQud2lkdGggLSBtX3N6SGVhZC54KSAvIDI7DQotICAgIEZYX0ZMT0FUIGZIZWFkVk1hcmdpbiA9IChtX3N6Q2VsbC54IC0gbV9zekhlYWQueSkgLyAyOw0KLSAgICBtX3J0SGVhZFRleHQuU2V0KG1fcnRDbGllbnQubGVmdCArIGZIZWFkSE1hcmdpbiwNCi0gICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LnRvcCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fVk1BUkdJTiArIE1PTlRIQ0FMX1ZNQVJHSU4gKyBmSGVhZFZNYXJnaW4sDQotICAgICAgICAgICAgICAgICAgICAgbV9zekhlYWQueCwNCi0gICAgICAgICAgICAgICAgICAgICBtX3N6SGVhZC55KTsNCi19DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkNhbGNUb2RheVNpemUoKQ0KLXsNCi0gICAgbV9ydFRvZGF5RmxhZy5TZXQobV9ydENsaWVudC5sZWZ0ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICsgTU9OVEhDQUxfSE1BUkdJTiwNCi0gICAgICAgICAgICAgICAgICAgICAgbV9ydERhdGVzLmJvdHRvbSgpICsgTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOICsgTU9OVEhDQUxfVk1BUkdJTiwNCi0gICAgICAgICAgICAgICAgICAgICAgbV9zekNlbGwueCwNCi0gICAgICAgICAgICAgICAgICAgICAgbV9zelRvZGF5LnkpOw0KLSAgICBtX3J0VG9kYXkuU2V0KG1fcnRDbGllbnQubGVmdCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiArIG1fc3pDZWxsLnggKyBNT05USENBTF9ITUFSR0lOICogMiAsDQotICAgICAgICAgICAgICAgICAgbV9ydERhdGVzLmJvdHRvbSgpICsgTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOICsgTU9OVEhDQUxfVk1BUkdJTiwNCi0gICAgICAgICAgICAgICAgICBtX3N6VG9kYXkueCwNCi0gICAgICAgICAgICAgICAgICBtX3N6VG9kYXkueSk7DQotfQ0KLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpMYXlPdXQoKQ0KLXsNCi0gICAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCi0gICAgew0KLSAgICAgICAgbV9ydEhlYWQuU2V0KG1fcnRDbGllbnQubGVmdCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiwNCi0gICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LnRvcCwNCi0gICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LndpZHRoIC0gTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICogMiwNCi0gICAgICAgICAgICAgICAgICAgICBtX3N6Q2VsbC54ICsgKE1PTlRIQ0FMX0hFQURFUl9CVE5fVk1BUkdJTiArIE1PTlRIQ0FMX1ZNQVJHSU4pICogMik7DQotICAgICAgICBtX3J0V2Vlay5TZXQobV9ydENsaWVudC5sZWZ0ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOLA0KLSAgICAgICAgICAgICAgICAgICAgIG1fcnRIZWFkLmJvdHRvbSgpLA0KLSAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGggLSBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gKiAyLA0KLSAgICAgICAgICAgICAgICAgICAgIG1fc3pDZWxsLnkgKyBNT05USENBTF9WTUFSR0lOICogMik7DQotICAgICAgICBtX3J0TEJ0bi5TZXQobV9ydENsaWVudC5sZWZ0ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOLA0KLSAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wICsgTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOLA0KLSAgICAgICAgICAgICAgICAgICAgIG1fc3pDZWxsLngsDQotICAgICAgICAgICAgICAgICAgICAgbV9zekNlbGwueCk7DQotICAgICAgICBtX3J0UkJ0bi5TZXQobV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiAtIG1fc3pDZWxsLngsDQotICAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC50b3AgKyBNT05USENBTF9IRUFERVJfQlROX1ZNQVJHSU4sDQotICAgICAgICAgICAgICAgICAgICAgbV9zekNlbGwueCwNCi0gICAgICAgICAgICAgICAgICAgICBtX3N6Q2VsbC54KTsNCi0gICAgICAgIG1fcnRIU2VwLlNldChtX3J0Q2xpZW50LmxlZnQgKyBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gKyBNT05USENBTF9ITUFSR0lOLA0KLSAgICAgICAgICAgICAgICAgICAgIG1fcnRXZWVrLmJvdHRvbSgpIC0gTU9OVEhDQUxfVk1BUkdJTiwNCi0gICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LndpZHRoIC0gKE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiArIE1PTlRIQ0FMX0hNQVJHSU4pICogMiwNCi0gICAgICAgICAgICAgICAgICAgICBNT05USENBTF9IU0VQX0hFSUdIVCk7DQotICAgICAgICBtX3J0RGF0ZXMuU2V0KG1fcnRDbGllbnQubGVmdCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiwNCi0gICAgICAgICAgICAgICAgICAgICAgbV9ydFdlZWsuYm90dG9tKCksDQotICAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGggLSBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gKiAyLA0KLSAgICAgICAgICAgICAgICAgICAgICBtX3N6Q2VsbC55ICogKE1PTlRIQ0FMX1JPV1MgLSAzKSArIE1PTlRIQ0FMX1ZNQVJHSU4gKiAoTU9OVEhDQUxfUk9XUyAtIDMpICogMik7DQotICAgIH0NCi0gICAgQ2FsRGF0ZUl0ZW0oKTsNCi19DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkNhbERhdGVJdGVtKCkNCi17DQotICAgIEZYX0JPT0wgYk5ld1dlZWsgPSBGQUxTRTsNCi0gICAgaW50MzJfdCBpV2Vla09mTW9udGggPSAwOw0KLSAgICBGWF9GTE9BVCBmTGVmdCA9IG1fcnREYXRlcy5sZWZ0Ow0KLSAgICBGWF9GTE9BVCBmVG9wID0gbV9ydERhdGVzLnRvcDsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX2FyckRhdGVzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICBMUERBVEVJTkZPIHBEYXRlSW5mbyA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaSk7DQotICAgICAgICBpZiAoYk5ld1dlZWspIHsNCi0gICAgICAgICAgICBpV2Vla09mTW9udGggKys7DQotICAgICAgICAgICAgYk5ld1dlZWsgPSBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBEYXRlSW5mby0+cmVjdC5TZXQoZkxlZnQgKyBwRGF0ZUluZm8tPmlEYXlPZldlZWsgKiAobV9zekNlbGwueCArIChNT05USENBTF9ITUFSR0lOICogMikpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmVG9wICsgaVdlZWtPZk1vbnRoICogKG1fc3pDZWxsLnkgKyAoTU9OVEhDQUxfVk1BUkdJTiAqIDIpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zekNlbGwueCArIChNT05USENBTF9ITUFSR0lOICogMiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3pDZWxsLnkgKyAoTU9OVEhDQUxfVk1BUkdJTiAqIDIpKTsNCi0gICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9XZWVrTnVtYmVycykgew0KLSAgICAgICAgICAgIHBEYXRlSW5mby0+cmVjdC5PZmZzZXQobV9mV2Vla051bVdpZCwgMCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAocERhdGVJbmZvLT5pRGF5T2ZXZWVrID49IDYpIHsNCi0gICAgICAgICAgICBiTmV3V2VlayA9IFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkdldENhcFZhbHVlKCkNCi17DQotICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KLSAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgIH0NCi0gICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KLSAgICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KLSAgICBwYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgbV9mSGVhZFdpZCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEgpOw0KLSAgICBtX2ZIZWFkSGVpID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9IZWlnaHQpOw0KLSAgICBtX2ZIZWFkQnRuV2lkID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fV0lEVEgpOw0KLSAgICBtX2ZIZWFkQnRuSGVpID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fSEVJR0hUKTsNCi0gICAgbV9mSGVhZEJ0bkhNYXJnaW4gPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9ITUFSR0lOKTsNCi0gICAgbV9mSGVhZEJ0blZNYXJnaW4gPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9WTUFSR0lOKTsNCi0gICAgbV9mSGVhZFRleHRXaWQgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRXSURIVCk7DQotICAgIG1fZkhlYWRUZXh0SGVpID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUSEVJR0hUKTsNCi0gICAgbV9mSGVhZFRleHRITWFyZ2luID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUX0hNQVJHSU4pOw0KLSAgICBtX2ZIZWFkVGV4dFZNYXJnaW4gPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRfVk1BUkdJTik7DQotICAgIG1fZkhTZXBXaWQgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSFNFUF9XSURUSCk7DQotICAgIG1fZkhTZXBIZWkgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSFNFUF9IRUlHSFQpOw0KLSAgICBtX2ZXZWVrTnVtV2lkID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1dFRUtOVU1fV0lEVEgpOw0KLSAgICBtX2ZTZXBET2Zmc2V0ID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1NFUF9ET0ZGU0VUKTsNCi0gICAgbV9mU2VwWCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfWCk7DQotICAgIG1fZlNlcFkgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfU0VQX1kpOw0KLSAgICBtX2ZXZWVrTnVtSGVpZ2ggPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS05VTV9IRUlHSFQpOw0KLSAgICBtX2ZXZWVrV2lkID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1dFRUtfV0lEVEgpOw0KLSAgICBtX2ZXZWVrSGVpID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1dFRUtfSEVJR0hUKTsNCi0gICAgbV9mRGF0ZUNlbGxXaWQgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9XSURUSCk7DQotICAgIG1fZkRhdGVDZWxsSGVpID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0RBVEVTX0NFTExfSEVJR0hUKTsNCi0gICAgbV9mVG9kYXlXaWQgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfV0lESFQpOw0KLSAgICBtX2ZUb2RheUhlaSA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9IRUlHSFQpOw0KLSAgICBtX2ZUb2RheUZsYWdXaWQgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfRkxBR19XSURIVCk7DQotICAgIG1fZk1DV2lkID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1dJRFRIKTsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX1dlZWtOdW1iZXJzKSB7DQotICAgICAgICBtX2ZNQ1dpZCArPSBtX2ZXZWVrTnVtV2lkOw0KLSAgICB9DQotICAgIG1fZk1DSGVpID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFSUdIVCk7DQotfQ0KLWludDMyX3QgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDYWxXZWVrTnVtYmVyKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpDQotew0KLSAgICByZXR1cm4gMDsNCi19DQotRlhfQk9PTAlDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkdldE1pbkRhdGUoaW50MzJfdCAmaVllYXIsIGludDMyX3QgJmlNb250aCwgaW50MzJfdCAmaURheSkNCi17DQotICAgIGlZZWFyID0gbV9kdE1pbi5pWWVhcjsNCi0gICAgaU1vbnRoID0gbV9kdE1pbi5pTW9udGg7DQotICAgIGlEYXkgPSBtX2R0TWluLmlEYXk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNGV0xfTW9udGhDYWxlbmRhckltcDo6U2V0TWluRGF0ZShpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KQ0KLXsNCi0gICAgbV9kdE1pbiA9IERBVEUoaVllYXIsIGlNb250aCwgaURheSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0TWF4RGF0ZShpbnQzMl90ICZpWWVhciwgaW50MzJfdCAmaU1vbnRoLCBpbnQzMl90ICZpRGF5KQ0KLXsNCi0gICAgaVllYXIgPSBtX2R0TWF4LmlZZWFyOw0KLSAgICBpTW9udGggPSBtX2R0TWF4LmlNb250aDsNCi0gICAgaURheSA9IG1fZHRNYXguaURheTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpTZXRNYXhEYXRlKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpDQotew0KLSAgICBtX2R0TWF4ID0gREFURShpWWVhciwgaU1vbnRoLCBpRGF5KTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpJbml0RGF0ZSgpDQotew0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKSB7DQotICAgICAgICBJRldMX01vbnRoQ2FsZW5kYXJEUCAqcERhdGVQcm92ID0gKElGV0xfTW9udGhDYWxlbmRhckRQKikobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCi0gICAgICAgIG1faVllYXIgPSBwRGF0ZVByb3YtPkdldEN1clllYXIobV9wSW50ZXJmYWNlKTsNCi0gICAgICAgIG1faU1vbnRoID0gcERhdGVQcm92LT5HZXRDdXJNb250aChtX3BJbnRlcmZhY2UpOw0KLSAgICAgICAgbV9pRGF5ID0gcERhdGVQcm92LT5HZXRDdXJEYXkobV9wSW50ZXJmYWNlKTsNCi0gICAgICAgIG1faUN1clllYXIgPSBtX2lZZWFyOw0KLSAgICAgICAgbV9pQ3VyTW9udGggPSBtX2lNb250aDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1faURheSA9IDE7DQotICAgICAgICBtX2lNb250aCA9IDE7DQotICAgICAgICBtX2lZZWFyID0gMTsNCi0gICAgICAgIG1faUN1clllYXIgPSBtX2lZZWFyOw0KLSAgICAgICAgbV9pQ3VyTW9udGggPSBtX2lNb250aDsNCi0gICAgfQ0KLSAgICBHZXRUb2RheVRleHQobV9pWWVhciwgbV9pTW9udGgsIG1faURheSwgbV93c1RvZGF5KTsNCi0gICAgR2V0SGVhZFRleHQobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgsIG1fd3NIZWFkKTsNCi0gICAgew0KLSAgICAgICAgbV9kdE1pbiA9IERBVEUoMTUwMCwgMTIsIDEpOw0KLSAgICAgICAgbV9kdE1heCA9IERBVEUoMjIwMCwgMSwgMSk7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDbGVhckRhdGVJdGVtKCkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgTFBEQVRFSU5GTyBwRGF0YSA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaSk7DQotICAgICAgICBkZWxldGUgcERhdGE7DQotICAgIH0NCi0gICAgbV9hcnJEYXRlcy5SZW1vdmVBbGwoKTsNCi19DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OlJlU2V0RGF0ZUl0ZW0oKQ0KLXsNCi0gICAgbV9wRGF0ZVRpbWUtPlNldChtX2lDdXJZZWFyLCBtX2lDdXJNb250aCwgMSk7DQotICAgIGludDMyX3QgaURheXMgPSBGWF9EYXlzSW5Nb250aChtX2lDdXJZZWFyLCBtX2lDdXJNb250aCk7DQotICAgIGludDMyX3QgaURheU9mV2VlayA9IG1fcERhdGVUaW1lLT5HZXREYXlPZldlZWsoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaURheXM7IGkgKyspIHsNCi0gICAgICAgIGlmIChpRGF5T2ZXZWVrID49IDcpIHsNCi0gICAgICAgICAgICBpRGF5T2ZXZWVrID0gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5Ow0KLSAgICAgICAgd3NEYXkuRm9ybWF0KEwiJWQiLCBpICsgMSk7DQotICAgICAgICBGWF9EV09SRCBkd1N0YXRlcyA9IDA7DQotICAgICAgICBpZiAobV9pWWVhciA9PSBtX2lDdXJZZWFyICYmIG1faU1vbnRoID09IG1faUN1ck1vbnRoICYmIG1faURheSA9PSAoaSArIDEpKSB7DQotICAgICAgICAgICAgZHdTdGF0ZXMgfD0gRldMX0lURU1TVEFURV9NQ0RfRmxhZzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX2FyclNlbERheXMuRmluZChpICsgMSkgIT0gLTEpIHsNCi0gICAgICAgICAgICBkd1N0YXRlcyB8PSBGV0xfSVRFTVNUQVRFX01DRF9TZWxlY3RlZDsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9SZWN0RiBydERhdGU7DQotICAgICAgICBydERhdGUuU2V0KDAsIDAsIDAsIDApOw0KLSAgICAgICAgTFBEQVRFSU5GTyBwRGF0YSA9IG5ldyBEQVRFSU5GTyhpICsgMSwgaURheU9mV2VlaywgZHdTdGF0ZXMsIHJ0RGF0ZSwgd3NEYXkpOw0KLSAgICAgICAgbV9hcnJEYXRlcy5BZGQocERhdGEpOw0KLSAgICAgICAgaURheU9mV2VlaysrOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpOZXh0TW9udGgoKQ0KLXsNCi0gICAgaW50MzJfdCBpWWVhciA9IG1faUN1clllYXIsIGlNb250aCA9IG1faUN1ck1vbnRoOw0KLSAgICBpZiAoaU1vbnRoID49IDEyKSB7DQotICAgICAgICBpTW9udGggPSAxOw0KLSAgICAgICAgaVllYXIrKzsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlNb250aCArKzsNCi0gICAgfQ0KLSAgICBEQVRFIGR0KG1faUN1clllYXIsIG1faUN1ck1vbnRoLCAxKTsNCi0gICAgaWYgKCEoZHQgPCBtX2R0TWF4KSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG1faUN1clllYXIgPSBpWWVhciwgbV9pQ3VyTW9udGggPSBpTW9udGg7DQotICAgIENoYW5nZVRvTW9udGgobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OlByZXZNb250aCgpDQotew0KLSAgICBpbnQzMl90IGlZZWFyID0gbV9pQ3VyWWVhciwgaU1vbnRoID0gbV9pQ3VyTW9udGg7DQotICAgIGlmIChpTW9udGggPD0gMSkgew0KLSAgICAgICAgaU1vbnRoID0gMTI7DQotICAgICAgICBpWWVhciAtLTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlNb250aCAtLTsNCi0gICAgfQ0KLSAgICBEQVRFIGR0KG1faUN1clllYXIsIG1faUN1ck1vbnRoLCAxKTsNCi0gICAgaWYgKCEoZHQgPiBtX2R0TWluKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG1faUN1clllYXIgPSBpWWVhciwgbV9pQ3VyTW9udGggPSBpTW9udGg7DQotICAgIENoYW5nZVRvTW9udGgobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkNoYW5nZVRvTW9udGgoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgpDQotew0KLSAgICBtX2lDdXJZZWFyID0gaVllYXI7DQotICAgIG1faUN1ck1vbnRoID0gaU1vbnRoOw0KLSAgICBtX2lIb3ZlcmVkID0gLTE7DQotICAgIENsZWFyRGF0ZUl0ZW0oKTsNCi0gICAgUmVTZXREYXRlSXRlbSgpOw0KLSAgICBDYWxEYXRlSXRlbSgpOw0KLSAgICBHZXRIZWFkVGV4dChtX2lDdXJZZWFyLCBtX2lDdXJNb250aCwgbV93c0hlYWQpOw0KLX0NCi1GWF9CT09MCUNGV0xfTW9udGhDYWxlbmRhckltcDo6UmVtb3ZlU2VsRGF5KGludDMyX3QgaURheSwgRlhfQk9PTCBiQWxsKQ0KLXsNCi0gICAgaWYgKGlEYXkgPT0gLTEgJiYgIWJBbGwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoYkFsbCkgew0KLSAgICAgICAgaW50MzJfdCBpQ291bnQgPSBtX2FyclNlbERheXMuR2V0U2l6ZSgpOw0KLSAgICAgICAgaW50MzJfdCBpRGF0ZXNDb3VudCA9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICAgICAgaW50MzJfdCBpU2VsRGF5ID0gbV9hcnJTZWxEYXlzLkdldEF0KGkpOw0KLSAgICAgICAgICAgIGlmIChpU2VsRGF5IDw9IGlEYXRlc0NvdW50KSB7DQotICAgICAgICAgICAgICAgIExQREFURUlORk8gcERhdGVJbmZvID0gKExQREFURUlORk8pbV9hcnJEYXRlcy5HZXRBdChpU2VsRGF5IC0gMSk7DQotICAgICAgICAgICAgICAgIHBEYXRlSW5mby0+ZHdTdGF0ZXMgJj0gfkZXTF9JVEVNU1RBVEVfTUNEX1NlbGVjdGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIG1fYXJyU2VsRGF5cy5SZW1vdmVBbGwoKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGludDMyX3QgaW5kZXggPSBtX2FyclNlbERheXMuRmluZChpRGF5KTsNCi0gICAgICAgIGlmIChpbmRleCA9PSAtMSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaVNlbERheSA9IG1fYXJyU2VsRGF5cy5HZXRBdChpRGF5KTsNCi0gICAgICAgIGludDMyX3QgaURhdGVzQ291bnQgPSBtX2FyckRhdGVzLkdldFNpemUoKTsNCi0gICAgICAgIGlmIChpU2VsRGF5IDw9IGlEYXRlc0NvdW50KSB7DQotICAgICAgICAgICAgTFBEQVRFSU5GTyBwRGF0ZUluZm8gPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzLkdldEF0KGlTZWxEYXkgLSAxKTsNCi0gICAgICAgICAgICBwRGF0ZUluZm8tPmR3U3RhdGVzICY9IH5GV0xfSVRFTVNUQVRFX01DRF9TZWxlY3RlZDsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fYXJyU2VsRGF5cy5SZW1vdmVBdChpbmRleCk7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpBZGRTZWxEYXkoaW50MzJfdCBpRGF5KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KGlEYXkgPiAwKTsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX011bHRpU2VsZWN0KSB7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAobV9hcnJTZWxEYXlzLkZpbmQoaURheSkgPT0gLTEpIHsNCi0gICAgICAgICAgICBSZW1vdmVTZWxEYXkoLTEsIFRSVUUpOw0KLSAgICAgICAgICAgIGlmIChpRGF5IDw9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpKSB7DQotICAgICAgICAgICAgICAgIExQREFURUlORk8gcERhdGVJbmZvID0gKExQREFURUlORk8pbV9hcnJEYXRlcy5HZXRBdChpRGF5IC0gMSk7DQotICAgICAgICAgICAgICAgIHBEYXRlSW5mby0+ZHdTdGF0ZXMgfD0gRldMX0lURU1TVEFURV9NQ0RfU2VsZWN0ZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fYXJyU2VsRGF5cy5BZGQoaURheSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpKdW1wVG9Ub2RheSgpDQotew0KLSAgICBpZiAobV9pWWVhciAhPSBtX2lDdXJZZWFyIHx8IG1faU1vbnRoICE9IG1faUN1ck1vbnRoKSB7DQotICAgICAgICBtX2lDdXJZZWFyID0gbV9pWWVhcjsNCi0gICAgICAgIG1faUN1ck1vbnRoID0gbV9pTW9udGg7DQotICAgICAgICBDaGFuZ2VUb01vbnRoKG1faVllYXIsIG1faU1vbnRoKTsNCi0gICAgICAgIEFkZFNlbERheShtX2lEYXkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKG1fYXJyU2VsRGF5cy5GaW5kKG1faURheSkgPT0gLTEpIHsNCi0gICAgICAgICAgICBBZGRTZWxEYXkobV9pRGF5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkdldEhlYWRUZXh0KGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBDRlhfV2lkZVN0cmluZyAmd3NIZWFkKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KGlNb250aCA+IDAgJiYgaU1vbnRoIDwgMTMpOw0KLSAgICBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIGNvbnN0IHBNb250aFtdID0gew0KLSAgICAgICAgTCJKYW51YXJ5IiwNCi0gICAgICAgIEwiRmVicnVhcnkiLA0KLSAgICAgICAgTCJNYXJjaCIsDQotICAgICAgICBMIkFwcmlsIiwNCi0gICAgICAgIEwiTWF5IiwNCi0gICAgICAgIEwiSnVuZSIsDQotICAgICAgICBMIkp1bHkiLA0KLSAgICAgICAgTCJBdWd1c3QiLA0KLSAgICAgICAgTCJTZXB0ZW1iZXIiLA0KLSAgICAgICAgTCJPY3RvYmVyIiwNCi0gICAgICAgIEwiTm92ZW1iZXIiLA0KLSAgICAgICAgTCJEZWNlbWJlciINCi0gICAgfTsNCi0gICAgd3NIZWFkLkZvcm1hdChMIiVzLCAlZCIsIHBNb250aFtpTW9udGggLSAxXSwgaVllYXIpOw0KLX0NCi12b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0VG9kYXlUZXh0KGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXksIENGWF9XaWRlU3RyaW5nICZ3c1RvZGF5KQ0KLXsNCi0gICAgd3NUb2RheS5Gb3JtYXQoTCIsICVkLyVkLyVkIiwgaURheSwgaU1vbnRoLCBpWWVhcik7DQotfQ0KLWludDMyX3QgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXREYXlBdFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgTFBEQVRFSU5GTyBwRGF0ZUluZm8gPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzLkdldEF0KGkpOw0KLSAgICAgICAgaWYgKHBEYXRlSW5mby0+cmVjdC5Db250YWlucyh4LCB5KSkgew0KLSAgICAgICAgICAgIHJldHVybiArK2k7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIC0xOw0KLX0NCi1GWF9CT09MCUNGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0RGF5UmVjdChpbnQzMl90IGlEYXksIENGWF9SZWN0RiAmcnREYXkpDQotew0KLSAgICBpZiAoaURheSA8PSAwIHx8IGlEYXkgPiBtX2FyckRhdGVzLkdldFNpemUoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIExQREFURUlORk8gcERhdGVJbmZvID0gKExQREFURUlORk8pbV9hcnJEYXRlc1tpRGF5IC0gMV07DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocERhdGVJbmZvLCBGQUxTRSk7DQotICAgIHJ0RGF5ID0gcERhdGVJbmZvLT5yZWN0Ow0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6OkNGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlKENGV0xfTW9udGhDYWxlbmRhckltcCAqcE93bmVyKQ0KLSAgICA6IG1fcE93bmVyKHBPd25lcikNCi17DQotfQ0KLWludDMyX3QgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KLSAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpbnQzMl90IGlSZXQgPSAxOw0KLSAgICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQotICAgICAgICAgICAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQotICAgICAgICAgICAgICAgIENGV0xfTXNnTW91c2UqIHBNb3VzZSA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCi0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTW91c2UtPm1fZHdDbWQ7DQotICAgICAgICAgICAgICAgIHN3aXRjaChkd0NtZCkgew0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uRG93bihwTW91c2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAocE1vdXNlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VNb3ZlKChDRldMX01zZ01vdXNlKilwTW91c2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VMZWF2ZSgoQ0ZXTF9Nc2dNb3VzZSopcE1vdXNlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICBpUmV0ID0gMDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLSAgICByZXR1cm4gaVJldDsNCi19DQotRldMX0VSUiBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQotfQ0KLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uQWN0aXZhdGUoQ0ZXTF9NZXNzYWdlICpwTXNnKQ0KLXsNCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1RvZGF5KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTm9Ub2RheSkgew0KICAgICByZXR1cm47DQorICB9DQorICBDRldMX1RoZW1lVGV4dCBwYXJhbXM7DQorICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfVG9kYXk7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHBhcmFtcy5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCisgIENGWF9XaWRlU3RyaW5nKiB3c0RheSA9IE5VTEw7DQorICB3c0RheSA9IChDRlhfV2lkZVN0cmluZyopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFyYW1zLCBGV0xfTUNDQVBBQ0lUWV9Ub2RheSk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBHZXRUb2RheVRleHQobV9pWWVhciwgbV9pTW9udGgsIG1faURheSwgd3NUZXh0KTsNCisgIHBhcmFtcy5tX3dzVGV4dCA9ICp3c0RheSArIHdzVGV4dDsNCisgIG1fc3pUb2RheSA9IENhbGNUZXh0U2l6ZShwYXJhbXMubV93c1RleHQsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgQ2FsY1RvZGF5U2l6ZSgpOw0KKyAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydFRvZGF5Ow0KKyAgcGFyYW1zLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcFRoZW1lLT5EcmF3VGV4dCgmcGFyYW1zKTsNCiB9DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQpDQotew0KLSAgICBpZiAoYlNldCkgew0KLSAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdEYXRlc0luKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX0RhdGVzSW47DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHBhcmFtcy5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaUNvdW50OyBqKyspIHsNCisgICAgTFBEQVRFSU5GTyBwRGF0YUluZm8gPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzLkdldEF0KGopOw0KKyAgICBwYXJhbXMubV93c1RleHQgPSBwRGF0YUluZm8tPndzRGF5Ow0KKyAgICBwYXJhbXMubV9ydFBhcnQgPSBwRGF0YUluZm8tPnJlY3Q7DQorICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gcERhdGFJbmZvLT5kd1N0YXRlczsNCisgICAgaWYgKGogKyAxID09IG1faUhvdmVyZWQpIHsNCisgICAgICBwYXJhbXMubV9kd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9Ib3ZlcmVkOw0KICAgICB9DQorICAgIHBhcmFtcy5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICAgIHBUaGVtZS0+RHJhd1RleHQoJnBhcmFtcyk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3RGF0ZXNPdXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVUZXh0IHBhcmFtczsNCisgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9EYXRlc091dDsNCisgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgcGFyYW1zLm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBUaGVtZS0+RHJhd1RleHQoJnBhcmFtcyk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3RGF0ZXNJbkNpcmNsZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5Q2lyY2xlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX2lNb250aCAhPSBtX2lDdXJNb250aCB8fCBtX2lZZWFyICE9IG1faUN1clllYXIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1faURheSA8IDEgfHwgbV9pRGF5ID4gbV9hcnJEYXRlcy5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgTFBEQVRFSU5GTyBwRGF0ZSA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXNbbV9pRGF5IC0gMV07DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBEYXRlKTsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCisgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9EYXRlSW5DaXJjbGU7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9ydFBhcnQgPSBwRGF0ZS0+cmVjdDsNCisgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1RvZGF5Q2lyY2xlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTm9Ub2RheSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTm9Ub2RheUNpcmNsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQorICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfVG9kYXlDaXJjbGU7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRUb2RheUZsYWc7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorfQ0KK0NGWF9TaXplRiBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkNhbGNTaXplKEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBDRlhfU2l6ZUYgZnM7DQorICBmcy5TZXQoMCwgMCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIGZzKTsNCisgIGlmIChiQXV0b1NpemUpIHsNCisgICAgQ0ZXTF9UaGVtZVBhcnQgcGFyYW1zOw0KKyAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIENGWF9XaWRlU3RyaW5nKiB3c1RleHQgPSBOVUxMOw0KKyAgICBGWF9GTE9BVCBmTWF4V2Vla1cgPSAwLjBmOw0KKyAgICBGWF9GTE9BVCBmTWF4V2Vla0ggPSAwLjBmOw0KKyAgICBmb3IgKEZYX0RXT1JEIHdlZWsgPSBGV0xfTUNDQVBBQ0lUWV9TdW47IHdlZWsgPD0gRldMX01DQ0FQQUNJVFlfU2F0Ow0KKyAgICAgICAgIHdlZWsrKykgew0KKyAgICAgIHdzVGV4dCA9IChDRlhfV2lkZVN0cmluZyopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFyYW1zLCB3ZWVrKTsNCisgICAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUoKndzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICAgICAgZk1heFdlZWtXID0gKGZNYXhXZWVrVyA+PSBzei54KSA/IGZNYXhXZWVrVyA6IHN6Lng7DQorICAgICAgZk1heFdlZWtIID0gKGZNYXhXZWVrSCA+PSBzei55KSA/IGZNYXhXZWVrSCA6IHN6Lnk7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkRheU1heFcgPSAwLjBmOw0KKyAgICBGWF9GTE9BVCBmRGF5TWF4SCA9IDAuMGY7DQorICAgIGZvciAoaW50IGRheSA9IDEwOyBkYXkgPD0gMzE7IGRheSsrKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXk7DQorICAgICAgd3NEYXkuRm9ybWF0KEwiJWQiLCBkYXkpOw0KKyAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSh3c0RheSwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICAgICAgZkRheU1heFcgPSAoZkRheU1heFcgPj0gc3oueCkgPyBmRGF5TWF4VyA6IHN6Lng7DQorICAgICAgZkRheU1heEggPSAoZkRheU1heEggPj0gc3oueSkgPyBmRGF5TWF4SCA6IHN6Lnk7DQorICAgIH0NCisgICAgbV9zekNlbGwueCA9IEZYX0ZMT0FUKChmTWF4V2Vla1cgPj0gZkRheU1heFcpID8gKGludCkoZk1heFdlZWtXICsgMC41KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaW50KShmRGF5TWF4VyArIDAuNSkpOw0KKyAgICBtX3N6Q2VsbC55ID0gKGZNYXhXZWVrSCA+PSBmRGF5TWF4SCkgPyBmTWF4V2Vla0ggOiBmRGF5TWF4SDsNCisgICAgZnMueCA9IG1fc3pDZWxsLnggKiBNT05USENBTF9DT0xVTU5TICsNCisgICAgICAgICAgIE1PTlRIQ0FMX0hNQVJHSU4gKiBNT05USENBTF9DT0xVTU5TICogMiArDQorICAgICAgICAgICBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gKiAyOw0KKyAgICBGWF9GTE9BVCBmTW9udGhNYXhXID0gMC4wZjsNCisgICAgRlhfRkxPQVQgZk1vbnRoTWF4SCA9IDAuMGY7DQorICAgIGZvciAoRlhfRFdPUkQgbW9udGggPSBGV0xfTUNDQVBBQ0lUWV9KYW51YXJ5Ow0KKyAgICAgICAgIG1vbnRoIDw9IEZXTF9NQ0NBUEFDSVRZX0RlY2VtYmVyOyBtb250aCsrKSB7DQorICAgICAgd3NUZXh0ID0gKENGWF9XaWRlU3RyaW5nKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJhbXMsIG1vbnRoKTsNCisgICAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUoKndzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICAgICAgZk1vbnRoTWF4VyA9IChmTW9udGhNYXhXID49IHN6LngpID8gZk1vbnRoTWF4VyA6IHN6Lng7DQorICAgICAgZk1vbnRoTWF4SCA9IChmTW9udGhNYXhIID49IHN6LnkpID8gZk1vbnRoTWF4SCA6IHN6Lnk7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NZZWFyOw0KKyAgICBHZXRIZWFkVGV4dChtX2lZZWFyLCBtX2lNb250aCwgd3NZZWFyKTsNCisgICAgQ0ZYX1NpemVGIHN6WWVhciA9IENhbGNUZXh0U2l6ZSh3c1llYXIsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICBmTW9udGhNYXhIID0gKGZNb250aE1heEggPj0gc3pZZWFyLnkpID8gZk1vbnRoTWF4SCA6IHN6WWVhci55Ow0KKyAgICBtX3N6SGVhZC5TZXQoZk1vbnRoTWF4VyArIHN6WWVhci54LCBmTW9udGhNYXhIKTsNCisgICAgZk1vbnRoTWF4VyA9IG1fc3pIZWFkLnggKyBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gKiAyICsgbV9zekNlbGwueCAqIDI7DQorICAgIGZzLnggPSAoZnMueCA+PSBmTW9udGhNYXhXKSA/IGZzLnggOiBmTW9udGhNYXhXOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RvZGF5Ow0KKyAgICBHZXRUb2RheVRleHQobV9pWWVhciwgbV9pTW9udGgsIG1faURheSwgd3NUb2RheSk7DQorICAgIHdzVGV4dCA9DQorICAgICAgICAoQ0ZYX1dpZGVTdHJpbmcqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcmFtcywgRldMX01DQ0FQQUNJVFlfVG9kYXkpOw0KKyAgICBtX3dzVG9kYXkgPSAqd3NUZXh0ICsgd3NUb2RheTsNCisgICAgbV9zelRvZGF5ID0gQ2FsY1RleHRTaXplKHdzVG9kYXksIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICBtX3N6VG9kYXkueSA9IChtX3N6VG9kYXkueSA+PSBtX3N6Q2VsbC55KSA/IG1fc3pUb2RheS55IDogbV9zekNlbGwueTsNCisgICAgZnMueSA9IG1fc3pDZWxsLnggKyBtX3N6Q2VsbC55ICogKE1PTlRIQ0FMX1JPV1MgLSAyKSArIG1fc3pUb2RheS55ICsNCisgICAgICAgICAgIE1PTlRIQ0FMX1ZNQVJHSU4gKiBNT05USENBTF9ST1dTICogMiArDQorICAgICAgICAgICBNT05USENBTF9IRUFERVJfQlROX1ZNQVJHSU4gKiA0Ow0KKyAgfSBlbHNlIHsNCisgICAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgICAgZnMuU2V0KG1fcnRDbGllbnQud2lkdGgsIG1fcnRDbGllbnQuaGVpZ2h0KTsNCisgIH0NCisgIHJldHVybiBmczsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkNhbGNIZWFkU2l6ZSgpIHsNCisgIEZYX0ZMT0FUIGZIZWFkSE1hcmdpbiA9IChtX3J0Q2xpZW50LndpZHRoIC0gbV9zekhlYWQueCkgLyAyOw0KKyAgRlhfRkxPQVQgZkhlYWRWTWFyZ2luID0gKG1fc3pDZWxsLnggLSBtX3N6SGVhZC55KSAvIDI7DQorICBtX3J0SGVhZFRleHQuU2V0KG1fcnRDbGllbnQubGVmdCArIGZIZWFkSE1hcmdpbiwNCisgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC50b3AgKyBNT05USENBTF9IRUFERVJfQlROX1ZNQVJHSU4gKw0KKyAgICAgICAgICAgICAgICAgICAgICAgTU9OVEhDQUxfVk1BUkdJTiArIGZIZWFkVk1hcmdpbiwNCisgICAgICAgICAgICAgICAgICAgbV9zekhlYWQueCwgbV9zekhlYWQueSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDYWxjVG9kYXlTaXplKCkgew0KKyAgbV9ydFRvZGF5RmxhZy5TZXQoDQorICAgICAgbV9ydENsaWVudC5sZWZ0ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICsgTU9OVEhDQUxfSE1BUkdJTiwNCisgICAgICBtX3J0RGF0ZXMuYm90dG9tKCkgKyBNT05USENBTF9IRUFERVJfQlROX1ZNQVJHSU4gKyBNT05USENBTF9WTUFSR0lOLA0KKyAgICAgIG1fc3pDZWxsLngsIG1fc3pUb2RheS55KTsNCisgIG1fcnRUb2RheS5TZXQoDQorICAgICAgbV9ydENsaWVudC5sZWZ0ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICsgbV9zekNlbGwueCArDQorICAgICAgICAgIE1PTlRIQ0FMX0hNQVJHSU4gKiAyLA0KKyAgICAgIG1fcnREYXRlcy5ib3R0b20oKSArIE1PTlRIQ0FMX0hFQURFUl9CVE5fVk1BUkdJTiArIE1PTlRIQ0FMX1ZNQVJHSU4sDQorICAgICAgbV9zelRvZGF5LngsIG1fc3pUb2RheS55KTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkxheU91dCgpIHsNCisgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQorICB7DQorICAgIG1fcnRIZWFkLlNldCgNCisgICAgICAgIG1fcnRDbGllbnQubGVmdCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiwgbV9ydENsaWVudC50b3AsDQorICAgICAgICBtX3J0Q2xpZW50LndpZHRoIC0gTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICogMiwNCisgICAgICAgIG1fc3pDZWxsLnggKyAoTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOICsgTU9OVEhDQUxfVk1BUkdJTikgKiAyKTsNCisgICAgbV9ydFdlZWsuU2V0KG1fcnRDbGllbnQubGVmdCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiwNCisgICAgICAgICAgICAgICAgIG1fcnRIZWFkLmJvdHRvbSgpLA0KKyAgICAgICAgICAgICAgICAgbV9ydENsaWVudC53aWR0aCAtIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiAqIDIsDQorICAgICAgICAgICAgICAgICBtX3N6Q2VsbC55ICsgTU9OVEhDQUxfVk1BUkdJTiAqIDIpOw0KKyAgICBtX3J0TEJ0bi5TZXQobV9ydENsaWVudC5sZWZ0ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOLA0KKyAgICAgICAgICAgICAgICAgbV9ydENsaWVudC50b3AgKyBNT05USENBTF9IRUFERVJfQlROX1ZNQVJHSU4sIG1fc3pDZWxsLngsDQorICAgICAgICAgICAgICAgICBtX3N6Q2VsbC54KTsNCisgICAgbV9ydFJCdG4uU2V0KG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLQ0KKyAgICAgICAgICAgICAgICAgICAgIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiAtIG1fc3pDZWxsLngsDQorICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LnRvcCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fVk1BUkdJTiwgbV9zekNlbGwueCwNCisgICAgICAgICAgICAgICAgIG1fc3pDZWxsLngpOw0KKyAgICBtX3J0SFNlcC5TZXQoDQorICAgICAgICBtX3J0Q2xpZW50LmxlZnQgKyBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gKyBNT05USENBTF9ITUFSR0lOLA0KKyAgICAgICAgbV9ydFdlZWsuYm90dG9tKCkgLSBNT05USENBTF9WTUFSR0lOLA0KKyAgICAgICAgbV9ydENsaWVudC53aWR0aCAtIChNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gKyBNT05USENBTF9ITUFSR0lOKSAqIDIsDQorICAgICAgICBNT05USENBTF9IU0VQX0hFSUdIVCk7DQorICAgIG1fcnREYXRlcy5TZXQobV9ydENsaWVudC5sZWZ0ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOLA0KKyAgICAgICAgICAgICAgICAgIG1fcnRXZWVrLmJvdHRvbSgpLA0KKyAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGggLSBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gKiAyLA0KKyAgICAgICAgICAgICAgICAgIG1fc3pDZWxsLnkgKiAoTU9OVEhDQUxfUk9XUyAtIDMpICsNCisgICAgICAgICAgICAgICAgICAgICAgTU9OVEhDQUxfVk1BUkdJTiAqIChNT05USENBTF9ST1dTIC0gMykgKiAyKTsNCisgIH0NCisgIENhbERhdGVJdGVtKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDYWxEYXRlSXRlbSgpIHsNCisgIEZYX0JPT0wgYk5ld1dlZWsgPSBGQUxTRTsNCisgIGludDMyX3QgaVdlZWtPZk1vbnRoID0gMDsNCisgIEZYX0ZMT0FUIGZMZWZ0ID0gbV9ydERhdGVzLmxlZnQ7DQorICBGWF9GTE9BVCBmVG9wID0gbV9ydERhdGVzLnRvcDsNCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBMUERBVEVJTkZPIHBEYXRlSW5mbyA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaSk7DQorICAgIGlmIChiTmV3V2Vlaykgew0KKyAgICAgIGlXZWVrT2ZNb250aCsrOw0KKyAgICAgIGJOZXdXZWVrID0gRkFMU0U7DQorICAgIH0NCisgICAgcERhdGVJbmZvLT5yZWN0LlNldCgNCisgICAgICAgIGZMZWZ0ICsgcERhdGVJbmZvLT5pRGF5T2ZXZWVrICogKG1fc3pDZWxsLnggKyAoTU9OVEhDQUxfSE1BUkdJTiAqIDIpKSwNCisgICAgICAgIGZUb3AgKyBpV2Vla09mTW9udGggKiAobV9zekNlbGwueSArIChNT05USENBTF9WTUFSR0lOICogMikpLA0KKyAgICAgICAgbV9zekNlbGwueCArIChNT05USENBTF9ITUFSR0lOICogMiksDQorICAgICAgICBtX3N6Q2VsbC55ICsgKE1PTlRIQ0FMX1ZNQVJHSU4gKiAyKSk7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9XZWVrTnVtYmVycykgew0KKyAgICAgIHBEYXRlSW5mby0+cmVjdC5PZmZzZXQobV9mV2Vla051bVdpZCwgMCk7DQorICAgIH0NCisgICAgaWYgKHBEYXRlSW5mby0+aURheU9mV2VlayA+PSA2KSB7DQorICAgICAgYk5ld1dlZWsgPSBUUlVFOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRDYXBWYWx1ZSgpIHsNCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIH0NCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7DQorICBwYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIG1fZkhlYWRXaWQgPQ0KKyAgICAgICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEgpOw0KKyAgbV9mSGVhZEhlaSA9DQorICAgICAgKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9IZWlnaHQpOw0KKyAgbV9mSGVhZEJ0bldpZCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoDQorICAgICAgJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1dJRFRIKTsNCisgIG1fZkhlYWRCdG5IZWkgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KA0KKyAgICAgICZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9IRUlHSFQpOw0KKyAgbV9mSGVhZEJ0bkhNYXJnaW4gPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KA0KKyAgICAgICZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9ITUFSR0lOKTsNCisgIG1fZkhlYWRCdG5WTWFyZ2luID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgNCisgICAgICAmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fVk1BUkdJTik7DQorICBtX2ZIZWFkVGV4dFdpZCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoDQorICAgICAgJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVFdJREhUKTsNCisgIG1fZkhlYWRUZXh0SGVpID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgNCisgICAgICAmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUSEVJR0hUKTsNCisgIG1fZkhlYWRUZXh0SE1hcmdpbiA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoDQorICAgICAgJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9ITUFSR0lOKTsNCisgIG1fZkhlYWRUZXh0Vk1hcmdpbiA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoDQorICAgICAgJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9WTUFSR0lOKTsNCisgIG1fZkhTZXBXaWQgPQ0KKyAgICAgICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IU0VQX1dJRFRIKTsNCisgIG1fZkhTZXBIZWkgPQ0KKyAgICAgICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IU0VQX0hFSUdIVCk7DQorICBtX2ZXZWVrTnVtV2lkID0NCisgICAgICAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS05VTV9XSURUSCk7DQorICBtX2ZTZXBET2Zmc2V0ID0NCisgICAgICAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfU0VQX0RPRkZTRVQpOw0KKyAgbV9mU2VwWCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfWCk7DQorICBtX2ZTZXBZID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1NFUF9ZKTsNCisgIG1fZldlZWtOdW1IZWlnaCA9DQorICAgICAgKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1dFRUtOVU1fSEVJR0hUKTsNCisgIG1fZldlZWtXaWQgPQ0KKyAgICAgICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLX1dJRFRIKTsNCisgIG1fZldlZWtIZWkgPQ0KKyAgICAgICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLX0hFSUdIVCk7DQorICBtX2ZEYXRlQ2VsbFdpZCA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoDQorICAgICAgJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX1dJRFRIKTsNCisgIG1fZkRhdGVDZWxsSGVpID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgNCisgICAgICAmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0RBVEVTX0NFTExfSEVJR0hUKTsNCisgIG1fZlRvZGF5V2lkID0NCisgICAgICAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfV0lESFQpOw0KKyAgbV9mVG9kYXlIZWkgPQ0KKyAgICAgICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9IRUlHSFQpOw0KKyAgbV9mVG9kYXlGbGFnV2lkID0gKihGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgNCisgICAgICAmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1RPREFZX0ZMQUdfV0lESFQpOw0KKyAgbV9mTUNXaWQgPSAqKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfV0lEVEgpOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX1dlZWtOdW1iZXJzKSB7DQorICAgIG1fZk1DV2lkICs9IG1fZldlZWtOdW1XaWQ7DQorICB9DQorICBtX2ZNQ0hlaSA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUlHSFQpOw0KK30NCitpbnQzMl90IENGV0xfTW9udGhDYWxlbmRhckltcDo6Q2FsV2Vla051bWJlcihpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSkgew0KKyAgcmV0dXJuIDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRNaW5EYXRlKGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRGF5KSB7DQorICBpWWVhciA9IG1fZHRNaW4uaVllYXI7DQorICBpTW9udGggPSBtX2R0TWluLmlNb250aDsNCisgIGlEYXkgPSBtX2R0TWluLmlEYXk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OlNldE1pbkRhdGUoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXkpIHsNCisgIG1fZHRNaW4gPSBEQVRFKGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRNYXhEYXRlKGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRGF5KSB7DQorICBpWWVhciA9IG1fZHRNYXguaVllYXI7DQorICBpTW9udGggPSBtX2R0TWF4LmlNb250aDsNCisgIGlEYXkgPSBtX2R0TWF4LmlEYXk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OlNldE1heERhdGUoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXkpIHsNCisgIG1fZHRNYXggPSBEQVRFKGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpJbml0RGF0ZSgpIHsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpIHsNCisgICAgSUZXTF9Nb250aENhbGVuZGFyRFAqIHBEYXRlUHJvdiA9DQorICAgICAgICAoSUZXTF9Nb250aENhbGVuZGFyRFAqKShtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICBtX2lZZWFyID0gcERhdGVQcm92LT5HZXRDdXJZZWFyKG1fcEludGVyZmFjZSk7DQorICAgIG1faU1vbnRoID0gcERhdGVQcm92LT5HZXRDdXJNb250aChtX3BJbnRlcmZhY2UpOw0KKyAgICBtX2lEYXkgPSBwRGF0ZVByb3YtPkdldEN1ckRheShtX3BJbnRlcmZhY2UpOw0KKyAgICBtX2lDdXJZZWFyID0gbV9pWWVhcjsNCisgICAgbV9pQ3VyTW9udGggPSBtX2lNb250aDsNCisgIH0gZWxzZSB7DQorICAgIG1faURheSA9IDE7DQorICAgIG1faU1vbnRoID0gMTsNCisgICAgbV9pWWVhciA9IDE7DQorICAgIG1faUN1clllYXIgPSBtX2lZZWFyOw0KKyAgICBtX2lDdXJNb250aCA9IG1faU1vbnRoOw0KKyAgfQ0KKyAgR2V0VG9kYXlUZXh0KG1faVllYXIsIG1faU1vbnRoLCBtX2lEYXksIG1fd3NUb2RheSk7DQorICBHZXRIZWFkVGV4dChtX2lDdXJZZWFyLCBtX2lDdXJNb250aCwgbV93c0hlYWQpOw0KKyAgew0KKyAgICBtX2R0TWluID0gREFURSgxNTAwLCAxMiwgMSk7DQorICAgIG1fZHRNYXggPSBEQVRFKDIyMDAsIDEsIDEpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDbGVhckRhdGVJdGVtKCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX2FyckRhdGVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIExQREFURUlORk8gcERhdGEgPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzLkdldEF0KGkpOw0KKyAgICBkZWxldGUgcERhdGE7DQorICB9DQorICBtX2FyckRhdGVzLlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6UmVTZXREYXRlSXRlbSgpIHsNCisgIG1fcERhdGVUaW1lLT5TZXQobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgsIDEpOw0KKyAgaW50MzJfdCBpRGF5cyA9IEZYX0RheXNJbk1vbnRoKG1faUN1clllYXIsIG1faUN1ck1vbnRoKTsNCisgIGludDMyX3QgaURheU9mV2VlayA9IG1fcERhdGVUaW1lLT5HZXREYXlPZldlZWsoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlEYXlzOyBpKyspIHsNCisgICAgaWYgKGlEYXlPZldlZWsgPj0gNykgew0KKyAgICAgIGlEYXlPZldlZWsgPSAwOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5Ow0KKyAgICB3c0RheS5Gb3JtYXQoTCIlZCIsIGkgKyAxKTsNCisgICAgRlhfRFdPUkQgZHdTdGF0ZXMgPSAwOw0KKyAgICBpZiAobV9pWWVhciA9PSBtX2lDdXJZZWFyICYmIG1faU1vbnRoID09IG1faUN1ck1vbnRoICYmIG1faURheSA9PSAoaSArIDEpKSB7DQorICAgICAgZHdTdGF0ZXMgfD0gRldMX0lURU1TVEFURV9NQ0RfRmxhZzsNCisgICAgfQ0KKyAgICBpZiAobV9hcnJTZWxEYXlzLkZpbmQoaSArIDEpICE9IC0xKSB7DQorICAgICAgZHdTdGF0ZXMgfD0gRldMX0lURU1TVEFURV9NQ0RfU2VsZWN0ZWQ7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0RGF0ZTsNCisgICAgcnREYXRlLlNldCgwLCAwLCAwLCAwKTsNCisgICAgTFBEQVRFSU5GTyBwRGF0YSA9IG5ldyBEQVRFSU5GTyhpICsgMSwgaURheU9mV2VlaywgZHdTdGF0ZXMsIHJ0RGF0ZSwgd3NEYXkpOw0KKyAgICBtX2FyckRhdGVzLkFkZChwRGF0YSk7DQorICAgIGlEYXlPZldlZWsrKzsNCisgIH0NCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6Ok5leHRNb250aCgpIHsNCisgIGludDMyX3QgaVllYXIgPSBtX2lDdXJZZWFyLCBpTW9udGggPSBtX2lDdXJNb250aDsNCisgIGlmIChpTW9udGggPj0gMTIpIHsNCisgICAgaU1vbnRoID0gMTsNCisgICAgaVllYXIrKzsNCisgIH0gZWxzZSB7DQorICAgIGlNb250aCsrOw0KKyAgfQ0KKyAgREFURSBkdChtX2lDdXJZZWFyLCBtX2lDdXJNb250aCwgMSk7DQorICBpZiAoIShkdCA8IG1fZHRNYXgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1faUN1clllYXIgPSBpWWVhciwgbV9pQ3VyTW9udGggPSBpTW9udGg7DQorICBDaGFuZ2VUb01vbnRoKG1faUN1clllYXIsIG1faUN1ck1vbnRoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhckltcDo6UHJldk1vbnRoKCkgew0KKyAgaW50MzJfdCBpWWVhciA9IG1faUN1clllYXIsIGlNb250aCA9IG1faUN1ck1vbnRoOw0KKyAgaWYgKGlNb250aCA8PSAxKSB7DQorICAgIGlNb250aCA9IDEyOw0KKyAgICBpWWVhci0tOw0KKyAgfSBlbHNlIHsNCisgICAgaU1vbnRoLS07DQorICB9DQorICBEQVRFIGR0KG1faUN1clllYXIsIG1faUN1ck1vbnRoLCAxKTsNCisgIGlmICghKGR0ID4gbV9kdE1pbikpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9pQ3VyWWVhciA9IGlZZWFyLCBtX2lDdXJNb250aCA9IGlNb250aDsNCisgIENoYW5nZVRvTW9udGgobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDaGFuZ2VUb01vbnRoKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoKSB7DQorICBtX2lDdXJZZWFyID0gaVllYXI7DQorICBtX2lDdXJNb250aCA9IGlNb250aDsNCisgIG1faUhvdmVyZWQgPSAtMTsNCisgIENsZWFyRGF0ZUl0ZW0oKTsNCisgIFJlU2V0RGF0ZUl0ZW0oKTsNCisgIENhbERhdGVJdGVtKCk7DQorICBHZXRIZWFkVGV4dChtX2lDdXJZZWFyLCBtX2lDdXJNb250aCwgbV93c0hlYWQpOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhckltcDo6UmVtb3ZlU2VsRGF5KGludDMyX3QgaURheSwgRlhfQk9PTCBiQWxsKSB7DQorICBpZiAoaURheSA9PSAtMSAmJiAhYkFsbCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoYkFsbCkgew0KKyAgICBpbnQzMl90IGlDb3VudCA9IG1fYXJyU2VsRGF5cy5HZXRTaXplKCk7DQorICAgIGludDMyX3QgaURhdGVzQ291bnQgPSBtX2FyckRhdGVzLkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBpbnQzMl90IGlTZWxEYXkgPSBtX2FyclNlbERheXMuR2V0QXQoaSk7DQorICAgICAgaWYgKGlTZWxEYXkgPD0gaURhdGVzQ291bnQpIHsNCisgICAgICAgIExQREFURUlORk8gcERhdGVJbmZvID0gKExQREFURUlORk8pbV9hcnJEYXRlcy5HZXRBdChpU2VsRGF5IC0gMSk7DQorICAgICAgICBwRGF0ZUluZm8tPmR3U3RhdGVzICY9IH5GV0xfSVRFTVNUQVRFX01DRF9TZWxlY3RlZDsNCisgICAgICB9DQorICAgIH0NCisgICAgbV9hcnJTZWxEYXlzLlJlbW92ZUFsbCgpOw0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBpbmRleCA9IG1fYXJyU2VsRGF5cy5GaW5kKGlEYXkpOw0KKyAgICBpZiAoaW5kZXggPT0gLTEpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaW50MzJfdCBpU2VsRGF5ID0gbV9hcnJTZWxEYXlzLkdldEF0KGlEYXkpOw0KKyAgICBpbnQzMl90IGlEYXRlc0NvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQorICAgIGlmIChpU2VsRGF5IDw9IGlEYXRlc0NvdW50KSB7DQorICAgICAgTFBEQVRFSU5GTyBwRGF0ZUluZm8gPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzLkdldEF0KGlTZWxEYXkgLSAxKTsNCisgICAgICBwRGF0ZUluZm8tPmR3U3RhdGVzICY9IH5GV0xfSVRFTVNUQVRFX01DRF9TZWxlY3RlZDsNCisgICAgfQ0KKyAgICBtX2FyclNlbERheXMuUmVtb3ZlQXQoaW5kZXgpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpBZGRTZWxEYXkoaW50MzJfdCBpRGF5KSB7DQorICBGWFNZU19hc3NlcnQoaURheSA+IDApOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX011bHRpU2VsZWN0KSB7DQorICB9IGVsc2Ugew0KKyAgICBpZiAobV9hcnJTZWxEYXlzLkZpbmQoaURheSkgPT0gLTEpIHsNCisgICAgICBSZW1vdmVTZWxEYXkoLTEsIFRSVUUpOw0KKyAgICAgIGlmIChpRGF5IDw9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpKSB7DQorICAgICAgICBMUERBVEVJTkZPIHBEYXRlSW5mbyA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaURheSAtIDEpOw0KKyAgICAgICAgcERhdGVJbmZvLT5kd1N0YXRlcyB8PSBGV0xfSVRFTVNUQVRFX01DRF9TZWxlY3RlZDsNCisgICAgICB9DQorICAgICAgbV9hcnJTZWxEYXlzLkFkZChpRGF5KTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpKdW1wVG9Ub2RheSgpIHsNCisgIGlmIChtX2lZZWFyICE9IG1faUN1clllYXIgfHwgbV9pTW9udGggIT0gbV9pQ3VyTW9udGgpIHsNCisgICAgbV9pQ3VyWWVhciA9IG1faVllYXI7DQorICAgIG1faUN1ck1vbnRoID0gbV9pTW9udGg7DQorICAgIENoYW5nZVRvTW9udGgobV9pWWVhciwgbV9pTW9udGgpOw0KKyAgICBBZGRTZWxEYXkobV9pRGF5KTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX2FyclNlbERheXMuRmluZChtX2lEYXkpID09IC0xKSB7DQorICAgICAgQWRkU2VsRGF5KG1faURheSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0SGVhZFRleHQoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0hlYWQpIHsNCisgIEZYU1lTX2Fzc2VydChpTW9udGggPiAwICYmIGlNb250aCA8IDEzKTsNCisgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogY29uc3QgcE1vbnRoW10gPSB7DQorICAgICAgTCJKYW51YXJ5IiwgICBMIkZlYnJ1YXJ5IiwgTCJNYXJjaCIsICAgIEwiQXByaWwiLA0KKyAgICAgIEwiTWF5IiwgICAgICAgTCJKdW5lIiwgICAgIEwiSnVseSIsICAgICBMIkF1Z3VzdCIsDQorICAgICAgTCJTZXB0ZW1iZXIiLCBMIk9jdG9iZXIiLCAgTCJOb3ZlbWJlciIsIEwiRGVjZW1iZXIifTsNCisgIHdzSGVhZC5Gb3JtYXQoTCIlcywgJWQiLCBwTW9udGhbaU1vbnRoIC0gMV0sIGlZZWFyKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkdldFRvZGF5VGV4dChpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUb2RheSkgew0KKyAgd3NUb2RheS5Gb3JtYXQoTCIsICVkLyVkLyVkIiwgaURheSwgaU1vbnRoLCBpWWVhcik7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXREYXlBdFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBMUERBVEVJTkZPIHBEYXRlSW5mbyA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaSk7DQorICAgIGlmIChwRGF0ZUluZm8tPnJlY3QuQ29udGFpbnMoeCwgeSkpIHsNCisgICAgICByZXR1cm4gKytpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gLTE7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXREYXlSZWN0KGludDMyX3QgaURheSwgQ0ZYX1JlY3RGJiBydERheSkgew0KKyAgaWYgKGlEYXkgPD0gMCB8fCBpRGF5ID4gbV9hcnJEYXRlcy5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgTFBEQVRFSU5GTyBwRGF0ZUluZm8gPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzW2lEYXkgLSAxXTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocERhdGVJbmZvLCBGQUxTRSk7DQorICBydERheSA9IHBEYXRlSW5mby0+cmVjdDsNCisgIHJldHVybiBUUlVFOw0KK30NCitDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6Q0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGUoDQorICAgIENGV0xfTW9udGhDYWxlbmRhckltcCogcE93bmVyKQ0KKyAgICA6IG1fcE93bmVyKHBPd25lcikge30NCitpbnQzMl90IENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKA0KKyAgICBDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBpbnQzMl90IGlSZXQgPSAxOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCisgICAgICBDRldMX01zZ01vdXNlKiBwTW91c2UgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTW91c2UtPm1fZHdDbWQ7DQorICAgICAgc3dpdGNoIChkd0NtZCkgew0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCisgICAgICAgICAgT25MQnV0dG9uRG93bihwTW91c2UpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICBPbkxCdXR0b25VcChwTW91c2UpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICBPbk1vdXNlTW92ZSgoQ0ZXTF9Nc2dNb3VzZSopcE1vdXNlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICAgIE9uTW91c2VMZWF2ZSgoQ0ZXTF9Nc2dNb3VzZSopcE1vdXNlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7IGJyZWFrOyB9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBpUmV0ID0gMDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25BY3RpdmF0ZShDRldMX01lc3NhZ2UqIHBNc2cpIHsNCisgIHJldHVybjsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldCkgew0KKyAgaWYgKGJTZXQpIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICB9DQorICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9ydExCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgbV9wT3duZXItPm1faUxCdG5QYXJ0U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZDsNCisgICAgbV9wT3duZXItPlByZXZNb250aCgpOw0KICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KLX0NCi12b2lkIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBpZiAobV9wT3duZXItPm1fcnRMQnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBtX3BPd25lci0+bV9pTEJ0blBhcnRTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkOw0KLSAgICAgICAgbV9wT3duZXItPlByZXZNb250aCgpOw0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCi0gICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9ydFJCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX2lSQnRuUGFydFN0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkOw0KLSAgICAgICAgbV9wT3duZXItPk5leHRNb250aCgpOw0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCi0gICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9ydFRvZGF5LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5ICkgPT0gMCkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5KdW1wVG9Ub2RheSgpOw0KLSAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX011bHRpU2VsZWN0KSB7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGludDMyX3QgaU9sZFNlbCA9IDA7DQotICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX2FyclNlbERheXMuR2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgICAgICBpT2xkU2VsID0gbV9wT3duZXItPm1fYXJyU2VsRGF5c1swXTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludDMyX3QgaUN1clNlbCA9IG1fcE93bmVyLT5HZXREYXlBdFBvaW50KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KLSAgICAgICAgICAgIEZYX0JPT0wgYlNlbENoYW5nZWQgPSBpQ3VyU2VsID4gMCAmJiBpQ3VyU2VsICE9IGlPbGRTZWw7DQotICAgICAgICAgICAgaWYgKGJTZWxDaGFuZ2VkKSB7DQotICAgICAgICAgICAgICAgIExQREFURUlORk8gbHBEYXRlc0luZm8gPSAoTFBEQVRFSU5GTyltX3BPd25lci0+bV9hcnJEYXRlcy5HZXRBdChpQ3VyU2VsIC0gMSk7DQotICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydEludmFsaWRhdGUobHBEYXRlc0luZm8tPnJlY3QpOw0KLSAgICAgICAgICAgICAgICBpZiAoaU9sZFNlbCA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGxwRGF0ZXNJbmZvID0gKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaU9sZFNlbCAtIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgcnRJbnZhbGlkYXRlLlVuaW9uKGxwRGF0ZXNJbmZvLT5yZWN0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+QWRkU2VsRGF5KGlDdXJTZWwpOw0KLSAgICAgICAgICAgICAgICBDRldMX0V2dENsaWNrIHdtQ2xpY2s7DQotICAgICAgICAgICAgICAgIHdtQ2xpY2subV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJndtQ2xpY2spOw0KLSAgICAgICAgICAgICAgICBDRldMX0V2ZW50TWNkRGF0ZUNoYW5nZWQgd21EYXRlU2VsZWN0ZWQ7DQotICAgICAgICAgICAgICAgIHdtRGF0ZVNlbGVjdGVkLm1faVN0YXJ0RGF5ID0gaUN1clNlbDsNCi0gICAgICAgICAgICAgICAgd21EYXRlU2VsZWN0ZWQubV9pRW5kRGF5ID0gaUN1clNlbDsNCi0gICAgICAgICAgICAgICAgd21EYXRlU2VsZWN0ZWQubV9pT2xkTW9udGggPSBtX3BPd25lci0+bV9pQ3VyTW9udGg7DQotICAgICAgICAgICAgICAgIHdtRGF0ZVNlbGVjdGVkLm1faU9sZFllYXIgPSBtX3BPd25lci0+bV9pQ3VyWWVhcjsNCi0gICAgICAgICAgICAgICAgd21EYXRlU2VsZWN0ZWQubV9wU3JjVGFyZ2V0ID0gKElGV0xfTW9udGhDYWxlbmRhciAqKW1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZ3bURhdGVTZWxlY3RlZCk7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcnRSQnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIG1fcE93bmVyLT5tX2lSQnRuUGFydFN0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkOw0KKyAgICBtX3BPd25lci0+TmV4dE1vbnRoKCk7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX3J0VG9kYXkuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTm9Ub2RheSkgPT0NCisgICAgICAgIDApIHsNCisgICAgICBtX3BPd25lci0+SnVtcFRvVG9kYXkoKTsNCisgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KICAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBpZiAobV9wT3duZXItPm1fcnRMQnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBtX3BPd25lci0+bV9pTEJ0blBhcnRTdGF0ZXMgPSAwOw0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0TEJ0bik7DQotICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcnRSQnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBtX3BPd25lci0+bV9pUkJ0blBhcnRTdGF0ZXMgPSAwOw0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0UkJ0bik7DQotICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcnREYXRlcy5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KLSAgICAgICAgaW50MzJfdCBpRGF5ID0gbV9wT3duZXItPkdldERheUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgICAgICBpZiAoaURheSAhPQktMSkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5BZGRTZWxEYXkoaURheSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQorICB9IGVsc2Ugew0KICAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX011bHRpU2VsZWN0KSB7DQorICAgIH0gZWxzZSB7DQorICAgICAgaW50MzJfdCBpT2xkU2VsID0gMDsNCisgICAgICBpZiAobV9wT3duZXItPm1fYXJyU2VsRGF5cy5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICBpT2xkU2VsID0gbV9wT3duZXItPm1fYXJyU2VsRGF5c1swXTsNCisgICAgICB9IGVsc2Ugew0KICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBpbnQzMl90IGlDdXJTZWwgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgICBGWF9CT09MIGJTZWxDaGFuZ2VkID0gaUN1clNlbCA+IDAgJiYgaUN1clNlbCAhPSBpT2xkU2VsOw0KKyAgICAgIGlmIChiU2VsQ2hhbmdlZCkgew0KKyAgICAgICAgTFBEQVRFSU5GTyBscERhdGVzSW5mbyA9DQorICAgICAgICAgICAgKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaUN1clNlbCAtIDEpOw0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZShscERhdGVzSW5mby0+cmVjdCk7DQorICAgICAgICBpZiAoaU9sZFNlbCA+IDApIHsNCisgICAgICAgICAgbHBEYXRlc0luZm8gPSAoTFBEQVRFSU5GTyltX3BPd25lci0+bV9hcnJEYXRlcy5HZXRBdChpT2xkU2VsIC0gMSk7DQorICAgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihscERhdGVzSW5mby0+cmVjdCk7DQorICAgICAgICB9DQorICAgICAgICBtX3BPd25lci0+QWRkU2VsRGF5KGlDdXJTZWwpOw0KKyAgICAgICAgQ0ZXTF9FdnRDbGljayB3bUNsaWNrOw0KKyAgICAgICAgd21DbGljay5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICAgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJndtQ2xpY2spOw0KKyAgICAgICAgQ0ZXTF9FdmVudE1jZERhdGVDaGFuZ2VkIHdtRGF0ZVNlbGVjdGVkOw0KKyAgICAgICAgd21EYXRlU2VsZWN0ZWQubV9pU3RhcnREYXkgPSBpQ3VyU2VsOw0KKyAgICAgICAgd21EYXRlU2VsZWN0ZWQubV9pRW5kRGF5ID0gaUN1clNlbDsNCisgICAgICAgIHdtRGF0ZVNlbGVjdGVkLm1faU9sZE1vbnRoID0gbV9wT3duZXItPm1faUN1ck1vbnRoOw0KKyAgICAgICAgd21EYXRlU2VsZWN0ZWQubV9pT2xkWWVhciA9IG1fcE93bmVyLT5tX2lDdXJZZWFyOw0KKyAgICAgICAgd21EYXRlU2VsZWN0ZWQubV9wU3JjVGFyZ2V0ID0NCisgICAgICAgICAgICAoSUZXTF9Nb250aENhbGVuZGFyKiltX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICAgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJndtRGF0ZVNlbGVjdGVkKTsNCisgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9ydExCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgbV9wT3duZXItPm1faUxCdG5QYXJ0U3RhdGVzID0gMDsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0TEJ0bik7DQorICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX3J0UkJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pUkJ0blBhcnRTdGF0ZXMgPSAwOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSQnRuKTsNCisgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcnREYXRlcy5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBpbnQzMl90IGlEYXkgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgaWYgKGlEYXkgIT0gLTEpIHsNCisgICAgICBtX3BPd25lci0+QWRkU2VsRGF5KGlEYXkpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTXVsdGlTZWxlY3QpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmVwYWludCA9IEZBTFNFOw0KKyAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgIHJ0SW52YWxpZGF0ZS5TZXQoMCwgMCwgMCwgMCk7DQorICBpZiAobV9wT3duZXItPm1fcnREYXRlcy5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBpbnQzMl90IGlIb3ZlciA9IG1fcE93bmVyLT5HZXREYXlBdFBvaW50KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBiUmVwYWludCA9IG1fcE93bmVyLT5tX2lIb3ZlcmVkICE9IGlIb3ZlcjsNCisgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgaWYgKG1fcE93bmVyLT5tX2lIb3ZlcmVkID4gMCkgew0KKyAgICAgICAgbV9wT3duZXItPkdldERheVJlY3QobV9wT3duZXItPm1faUhvdmVyZWQsIHJ0SW52YWxpZGF0ZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChpSG92ZXIgPiAwKSB7DQorICAgICAgICBDRlhfUmVjdEYgcnREYXk7DQorICAgICAgICBtX3BPd25lci0+R2V0RGF5UmVjdChpSG92ZXIsIHJ0RGF5KTsNCisgICAgICAgIGlmIChydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIHJ0SW52YWxpZGF0ZSA9IHJ0RGF5Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcnRJbnZhbGlkYXRlLlVuaW9uKHJ0RGF5KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgbV9wT3duZXItPm1faUhvdmVyZWQgPSBpSG92ZXI7DQorICB9IGVsc2Ugew0KKyAgICBiUmVwYWludCA9IG1fcE93bmVyLT5tX2lIb3ZlcmVkID4gMDsNCisgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgbV9wT3duZXItPkdldERheVJlY3QobV9wT3duZXItPm1faUhvdmVyZWQsIHJ0SW52YWxpZGF0ZSk7DQorICAgIH0NCisgICAgbV9wT3duZXItPm1faUhvdmVyZWQgPSAtMTsNCisgIH0NCisgIGlmIChiUmVwYWludCAmJiAhcnRJbnZhbGlkYXRlLklzRW1wdHkoKSkgew0KKyAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgIH0NCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9pSG92ZXJlZCA+IDApIHsNCiAgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCiAgICAgcnRJbnZhbGlkYXRlLlNldCgwLCAwLCAwLCAwKTsNCi0gICAgaWYgKG1fcE93bmVyLT5tX3J0RGF0ZXMuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgIGludDMyX3QgaUhvdmVyID0gbV9wT3duZXItPkdldERheUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgICAgICBiUmVwYWludCA9IG1fcE93bmVyLT5tX2lIb3ZlcmVkICE9IGlIb3ZlcjsNCi0gICAgICAgIGlmIChiUmVwYWludCkgew0KLSAgICAgICAgICAgIGlmIChtX3BPd25lci0+bV9pSG92ZXJlZCA+IDApIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPkdldERheVJlY3QobV9wT3duZXItPm1faUhvdmVyZWQsIHJ0SW52YWxpZGF0ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChpSG92ZXIgPiAwKSB7DQotICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydERheTsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPkdldERheVJlY3QoaUhvdmVyLCBydERheSk7DQotICAgICAgICAgICAgICAgIGlmIChydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBydEludmFsaWRhdGUgPSBydERheTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihydERheSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBtX3BPd25lci0+bV9pSG92ZXJlZCA9IGlIb3ZlcjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGJSZXBhaW50ID0gbV9wT3duZXItPm1faUhvdmVyZWQgPiAwOw0KLSAgICAgICAgaWYgKGJSZXBhaW50KSB7DQotICAgICAgICAgICAgbV9wT3duZXItPkdldERheVJlY3QobV9wT3duZXItPm1faUhvdmVyZWQsIHJ0SW52YWxpZGF0ZSk7DQotICAgICAgICB9DQotICAgICAgICBtX3BPd25lci0+bV9pSG92ZXJlZCA9IC0xOw0KKyAgICBtX3BPd25lci0+R2V0RGF5UmVjdChtX3BPd25lci0+bV9pSG92ZXJlZCwgcnRJbnZhbGlkYXRlKTsNCisgICAgbV9wT3duZXItPm1faUhvdmVyZWQgPSAtMTsNCisgICAgaWYgKCFydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQorICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQogICAgIH0NCi0gICAgaWYgKGJSZXBhaW50ICYmICFydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIGlmIChtX3BPd25lci0+bV9pSG92ZXJlZCA+IDApIHsNCi0gICAgICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQotICAgICAgICBydEludmFsaWRhdGUuU2V0KDAsIDAsIDAsIDApOw0KLSAgICAgICAgbV9wT3duZXItPkdldERheVJlY3QobV9wT3duZXItPm1faUhvdmVyZWQsIHJ0SW52YWxpZGF0ZSk7DQotICAgICAgICBtX3BPd25lci0+bV9pSG92ZXJlZCA9IC0xOw0KLSAgICAgICAgaWYgKCFydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQotICAgICAgICB9DQotICAgIH0NCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3hpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3hpbXAuY3BwCmluZGV4IDAzZjgyMTUuLjQ4MTg5NDUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9waWN0dXJlYm94aW1wLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfcGljdHVyZWJveGltcC5jcHAKQEAgLTksMTY0ICs5LDE1OCBAQAogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KICNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9waWN0dXJlYm94aW1wLmgiDQotSUZXTF9QaWN0dXJlQm94KiBJRldMX1BpY3R1cmVCb3g6OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gbmV3IElGV0xfUGljdHVyZUJveDsNCitJRldMX1BpY3R1cmVCb3gqIElGV0xfUGljdHVyZUJveDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBJRldMX1BpY3R1cmVCb3g7DQogfQ0KLUlGV0xfUGljdHVyZUJveDo6SUZXTF9QaWN0dXJlQm94KCkNCi17DQorSUZXTF9QaWN0dXJlQm94OjpJRldMX1BpY3R1cmVCb3goKSB7DQorICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9QaWN0dXJlQm94Ojp+SUZXTF9QaWN0dXJlQm94KCkgew0KKyAgaWYgKG1fcERhdGEpIHsNCisgICAgZGVsZXRlIChDRldMX1BpY3R1cmVCb3hJbXAqKW1fcERhdGE7DQogICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgfQ0KIH0NCi1JRldMX1BpY3R1cmVCb3g6On5JRldMX1BpY3R1cmVCb3goKQ0KLXsNCi0gICAgaWYgKG1fcERhdGEpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9QaWN0dXJlQm94SW1wKiltX3BEYXRhOw0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQorRldMX0VSUiBJRldMX1BpY3R1cmVCb3g6OkluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1BpY3R1cmVCb3hJbXAocE91dGVyKTsNCisgICgoQ0ZXTF9QaWN0dXJlQm94SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9QaWN0dXJlQm94SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSIElGV0xfUGljdHVyZUJveDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1BpY3R1cmVCb3hJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgICgoQ0ZXTF9QaWN0dXJlQm94SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9QaWN0dXJlQm94SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitDRldMX1BpY3R1cmVCb3hJbXA6OkNGV0xfUGljdHVyZUJveEltcChJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlciksDQorICAgICAgbV9iVG9wKEZBTFNFKSwNCisgICAgICBtX2JWQ2VudGVyKEZBTFNFKSwNCisgICAgICBtX2JCdXR0b24oRkFMU0UpIHsNCisgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgIG1fcnRJbWFnZS5SZXNldCgpOw0KKyAgbV9tYXRyaXguUmVzZXQoKTsNCit9DQorQ0ZXTF9QaWN0dXJlQm94SW1wOjpDRldMX1BpY3R1cmVCb3hJbXAoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpLA0KKyAgICAgIG1fYlRvcChGQUxTRSksDQorICAgICAgbV9iVkNlbnRlcihGQUxTRSksDQorICAgICAgbV9iQnV0dG9uKEZBTFNFKSB7DQorICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICBtX3J0SW1hZ2UuUmVzZXQoKTsNCisgIG1fbWF0cml4LlJlc2V0KCk7DQorfQ0KK0NGV0xfUGljdHVyZUJveEltcDo6fkNGV0xfUGljdHVyZUJveEltcCgpIHt9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3hJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19QaWN0dXJlQm94Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX1BpY3R1cmVCb3hJbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0NMQVNTSEFTSF9QaWN0dXJlQm94Ow0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveEltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfUGljdHVyZUJveEltcERlbGVnYXRlKHRoaXMpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveEltcDo6RmluYWxpemUoKSB7DQorICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgZGVsZXRlIChDRldMX1BpY3R1cmVCb3hJbXBEZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQorICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3hJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gKChJRldMX1BpY3R1cmVCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRQaWN0dXJlKG1fcEludGVyZmFjZSk7DQorICAgIGlmIChwQml0bWFwKSB7DQorICAgICAgcmVjdC5TZXQoMCwgMCwgKEZYX0ZMT0FUKXBCaXRtYXAtPkdldFdpZHRoKCksDQorICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXBCaXRtYXAtPkdldEhlaWdodCgpKTsNCiAgICAgfQ0KKyAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIElGV0xfUGljdHVyZUJveDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1BpY3R1cmVCb3hJbXAocE91dGVyKTsNCi0gICAgKChDRldMX1BpY3R1cmVCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfUGljdHVyZUJveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCi19DQotRldMX0VSUglJRldMX1BpY3R1cmVCb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1BpY3R1cmVCb3hJbXAocHJvcGVydGllcywgcE91dGVyKTsNCi0gICAgKChDRldMX1BpY3R1cmVCb3hJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfUGljdHVyZUJveEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCi19DQotQ0ZXTF9QaWN0dXJlQm94SW1wOjpDRldMX1BpY3R1cmVCb3hJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQotICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KLSAgICAsIG1fYlRvcChGQUxTRSkNCi0gICAgLCBtX2JWQ2VudGVyKEZBTFNFKQ0KLSAgICAsIG1fYkJ1dHRvbihGQUxTRSkNCi17DQotICAgIG1fcnRDbGllbnQuUmVzZXQoKTsNCi0gICAgbV9ydEltYWdlLlJlc2V0KCk7DQotICAgIG1fbWF0cml4LlJlc2V0KCk7DQotfQ0KLUNGV0xfUGljdHVyZUJveEltcDo6Q0ZXTF9QaWN0dXJlQm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQotICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KLSAgICAsIG1fYlRvcChGQUxTRSkNCi0gICAgLCBtX2JWQ2VudGVyKEZBTFNFKQ0KLSAgICAsIG1fYkJ1dHRvbihGQUxTRSkNCi17DQotICAgIG1fcnRDbGllbnQuUmVzZXQoKTsNCi0gICAgbV9ydEltYWdlLlJlc2V0KCk7DQotICAgIG1fbWF0cml4LlJlc2V0KCk7DQotfQ0KLUNGV0xfUGljdHVyZUJveEltcDo6fkNGV0xfUGljdHVyZUJveEltcCgpDQotew0KLX0NCi1GV0xfRVJSIENGV0xfUGljdHVyZUJveEltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgd3NDbGFzcyA9IEZXTF9DTEFTU19QaWN0dXJlQm94Ow0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94SW1wOjpVcGRhdGUoKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GWF9EV09SRCBDRldMX1BpY3R1cmVCb3hJbXA6OkdldENsYXNzSUQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfUGljdHVyZUJveDsNCitGV0xfRVJSIENGV0xfUGljdHVyZUJveEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgRldMX1BBUlRfUFRCX0JvcmRlciwgcFRoZW1lLCBwTWF0cml4KTsNCisgIH0NCisgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgRHJhd0VkZ2UocEdyYXBoaWNzLCBGV0xfUEFSVF9QVEJfRWRnZSwgcFRoZW1lLCBwTWF0cml4KTsNCisgIH0NCisgIERyYXdCa2dyb3VuZChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9QaWN0dXJlQm94SW1wOjpJbml0aWFsaXplKCkNCi17DQotICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKSBGWF9ORVcgQ0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGUodGhpcyk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit2b2lkIENGV0xfUGljdHVyZUJveEltcDo6RHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBDRlhfRElCaXRtYXAqIHBQaWN0dXJlID0gKChJRldMX1BpY3R1cmVCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFBpY3R1cmUobV9wSW50ZXJmYWNlKTsNCisgIENGWF9NYXRyaXggbWF0cml4Ow0KKyAgKChJRldMX1BpY3R1cmVCb3hEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKQ0KKyAgICAgIC0+R2V0TWF0cml4KG1fcEludGVyZmFjZSwgbWF0cml4KTsNCisgIGlmICghcFBpY3R1cmUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICBGWF9GTE9BVCBmeCA9IChGWF9GTE9BVClwUGljdHVyZS0+R2V0V2lkdGgoKTsNCisgIEZYX0ZMT0FUIGZ5ID0gKEZYX0ZMT0FUKXBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCisgIGlmIChmeCA+IG1fcnRDbGllbnQud2lkdGgpIHsNCisgICAgZnggPSBtX3J0Q2xpZW50LndpZHRoOw0KKyAgfQ0KKyAgaWYgKGZ5ID4gbV9ydENsaWVudC5oZWlnaHQpIHsNCisgICAgZnkgPSBtX3J0Q2xpZW50LmhlaWdodDsNCisgIH0NCisgIENGWF9Qb2ludEYgcHQ7DQorICBwdC5TZXQoKG1fcnRDbGllbnQud2lkdGggLSBmeCkgLyAyLCAobV9ydENsaWVudC5oZWlnaHQgLSBmeSkgLyAyKTsNCisgIHBHcmFwaGljcy0+RHJhd0ltYWdlKHBQaWN0dXJlLCBwdCwgJm1hdHJpeCk7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9QaWN0dXJlQm94SW1wOjpGaW5hbGl6ZSgpDQotew0KLSAgICBpZiAoIG1fcERlbGVnYXRlKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfUGljdHVyZUJveEltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCi0gICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCitGWF9CT09MIENGV0xfUGljdHVyZUJveEltcDo6VlN0eWxlKEZYX0JPT0wgZHdTdHlsZSkgew0KKyAgc3dpdGNoIChkd1N0eWxlICYgRldMX1NUWUxFRVhUX1BUQl9WQWxpZ25NYXNrKSB7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BUQl9Ub3A6IHsNCisgICAgICByZXR1cm4gbV9iVG9wID0gVFJVRTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BUQl9WY2VudGVyOiB7DQorICAgICAgcmV0dXJuIG1fYlZDZW50ZXIgPSBUUlVFOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BUQl9Cb3R0b206IHsNCisgICAgICByZXR1cm4gbV9iQnV0dG9uID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GV0xfRVJSIENGV0xfUGljdHVyZUJveEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCi17DQotICAgIGlmIChiQXV0b1NpemUpIHsNCi0gICAgICAgIHJlY3QuU2V0KDAsIDAsIDAsIDApOw0KLSAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgICAgICBDRlhfRElCaXRtYXAgKnBCaXRtYXAgPSAoKElGV0xfUGljdHVyZUJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpLT5HZXRQaWN0dXJlKG1fcEludGVyZmFjZSk7DQotICAgICAgICBpZiAocEJpdG1hcCkgew0KLSAgICAgICAgICAgIHJlY3QuU2V0KDAsIDAsIChGWF9GTE9BVClwQml0bWFwLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94SW1wOjpVcGRhdGUoKQ0KLXsNCi0gICAgaWYgKElzTG9ja2VkKCkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCi0gICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KLSAgICB9DQotICAgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX1BpY3R1cmVCb3hJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KLSAgICBpZiAoSGFzQm9yZGVyKCkpIHsNCi0gICAgICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9QVEJfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXggKTsNCi0gICAgfQ0KLSAgICBpZiAoSGFzRWRnZSgpKSB7DQotICAgICAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX1BUQl9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIERyYXdCa2dyb3VuZChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotdm9pZCBDRldMX1BpY3R1cmVCb3hJbXA6OkRyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQotICAgIENGWF9ESUJpdG1hcCAqcFBpY3R1cmUgPSAoKElGV0xfUGljdHVyZUJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpLT5HZXRQaWN0dXJlKG1fcEludGVyZmFjZSk7DQotICAgIENGWF9NYXRyaXggbWF0cml4Ow0KLSAgICAoKElGV0xfUGljdHVyZUJveERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpLT5HZXRNYXRyaXgobV9wSW50ZXJmYWNlLCBtYXRyaXgpOw0KLSAgICBpZiAoIXBQaWN0dXJlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgIEZYX0ZMT0FUIGZ4ID0gKEZYX0ZMT0FUKXBQaWN0dXJlLT5HZXRXaWR0aCgpOw0KLSAgICBGWF9GTE9BVCBmeSA9IChGWF9GTE9BVClwUGljdHVyZS0+R2V0SGVpZ2h0KCk7DQotICAgIGlmIChmeCA+IG1fcnRDbGllbnQud2lkdGgpIHsNCi0gICAgICAgIGZ4ID0gbV9ydENsaWVudC53aWR0aDsNCi0gICAgfQ0KLSAgICBpZiAoZnkgPiBtX3J0Q2xpZW50LmhlaWdodCkgew0KLSAgICAgICAgZnkgPSBtX3J0Q2xpZW50LmhlaWdodDsNCi0gICAgfQ0KLSAgICBDRlhfUG9pbnRGIHB0Ow0KLSAgICBwdC5TZXQoKG1fcnRDbGllbnQud2lkdGggLSBmeCkgLyAyLCAobV9ydENsaWVudC5oZWlnaHQgLSBmeSkgLyAyKTsNCi0gICAgcEdyYXBoaWNzLT5EcmF3SW1hZ2UocFBpY3R1cmUsIHB0LCAmbWF0cml4KTsNCi19DQotRlhfQk9PTCBDRldMX1BpY3R1cmVCb3hJbXA6OlZTdHlsZShGWF9CT09MIGR3U3R5bGUpDQotew0KLSAgICBzd2l0Y2goZHdTdHlsZSAmIEZXTF9TVFlMRUVYVF9QVEJfVkFsaWduTWFzaykgew0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFRCX1RvcDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9iVG9wID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFRCX1ZjZW50ZXI6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1fYlZDZW50ZXIgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9QVEJfQm90dG9tOiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtX2JCdXR0b24gPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1DRldMX1BpY3R1cmVCb3hJbXBEZWxlZ2F0ZTo6Q0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGUoQ0ZXTF9QaWN0dXJlQm94SW1wICpwT3duZXIpDQotICAgIDogbV9wT3duZXIocE93bmVyKQ0KLXsNCi19DQotRldMX0VSUglDRldMX1BpY3R1cmVCb3hJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorQ0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGU6OkNGV0xfUGljdHVyZUJveEltcERlbGVnYXRlKA0KKyAgICBDRldMX1BpY3R1cmVCb3hJbXAqIHBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpIHt9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3hJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3B1c2hidXR0b25pbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3B1c2hidXR0b25pbXAuY3BwCmluZGV4IDM2NGU0OTcuLjMzMjlhNzYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9wdXNoYnV0dG9uaW1wLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbmltcC5jcHAKQEAgLTksNTM0ICs5LDU1NCBAQAogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KICNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9wdXNoYnV0dG9uaW1wLmgiDQotSUZXTF9QdXNoQnV0dG9uICpJRldMX1B1c2hCdXR0b246OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gbmV3IElGV0xfUHVzaEJ1dHRvbjsNCitJRldMX1B1c2hCdXR0b24qIElGV0xfUHVzaEJ1dHRvbjo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBJRldMX1B1c2hCdXR0b247DQogfQ0KLUZXTF9FUlIgSUZXTF9QdXNoQnV0dG9uOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfUHVzaEJ1dHRvbkltcChwT3V0ZXIpOw0KLSAgICAoKENGV0xfUHVzaEJ1dHRvbkltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9QdXNoQnV0dG9uSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9QdXNoQnV0dG9uOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9QdXNoQnV0dG9uSW1wKHBPdXRlcik7DQorICAoKENGV0xfUHVzaEJ1dHRvbkltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgIHJldHVybiAoKENGV0xfUHVzaEJ1dHRvbkltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCiB9DQotRldMX0VSUglJRldMX1B1c2hCdXR0b246OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1B1c2hCdXR0b25JbXAocHJvcGVydGllcywgcE91dGVyKTsNCi0gICAgKChDRldMX1B1c2hCdXR0b25JbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfUHVzaEJ1dHRvbkltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitGV0xfRVJSIElGV0xfUHVzaEJ1dHRvbjo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1B1c2hCdXR0b25JbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgICgoQ0ZXTF9QdXNoQnV0dG9uSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9QdXNoQnV0dG9uSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1JRldMX1B1c2hCdXR0b246OklGV0xfUHVzaEJ1dHRvbigpDQotew0KK0lGV0xfUHVzaEJ1dHRvbjo6SUZXTF9QdXNoQnV0dG9uKCkgew0KKyAgbV9wRGF0YSA9IE5VTEw7DQorfQ0KK0lGV0xfUHVzaEJ1dHRvbjo6fklGV0xfUHVzaEJ1dHRvbigpIHsNCisgIGlmIChtX3BEYXRhKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9QdXNoQnV0dG9uSW1wKiltX3BEYXRhOw0KICAgICBtX3BEYXRhID0gTlVMTDsNCisgIH0NCiB9DQotSUZXTF9QdXNoQnV0dG9uOjp+SUZXTF9QdXNoQnV0dG9uKCkNCi17DQotICAgIGlmIChtX3BEYXRhKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfUHVzaEJ1dHRvbkltcCopbV9wRGF0YTsNCi0gICAgICAgIG1fcERhdGEgPSBOVUxMOw0KK0NGV0xfUHVzaEJ1dHRvbkltcDo6Q0ZXTF9QdXNoQnV0dG9uSW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKSwNCisgICAgICBtX2JCdG5Eb3duKEZBTFNFKSwNCisgICAgICBtX2R3VFRPU3R5bGVzKEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKSwNCisgICAgICBtX2lUVE9BbGlnbihGREVfVFRPQUxJR05NRU5UX0NlbnRlcikgew0KKyAgbV9ydENsaWVudC5TZXQoMCwgMCwgMCwgMCk7DQorICBtX3J0Q2FwdGlvbi5TZXQoMCwgMCwgMCwgMCk7DQorfQ0KK0NGV0xfUHVzaEJ1dHRvbkltcDo6Q0ZXTF9QdXNoQnV0dG9uSW1wKA0KKyAgICBjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX2JCdG5Eb3duKEZBTFNFKSwNCisgICAgICBtX2R3VFRPU3R5bGVzKEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKSwNCisgICAgICBtX2lUVE9BbGlnbihGREVfVFRPQUxJR05NRU5UX0NlbnRlcikgew0KKyAgbV9ydENsaWVudC5TZXQoMCwgMCwgMCwgMCk7DQorICBtX3J0Q2FwdGlvbi5TZXQoMCwgMCwgMCwgMCk7DQorfQ0KK0NGV0xfUHVzaEJ1dHRvbkltcDo6fkNGV0xfUHVzaEJ1dHRvbkltcCgpIHt9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19QdXNoQnV0dG9uOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX1B1c2hCdXR0b25JbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0NMQVNTSEFTSF9QdXNoQnV0dG9uOw0KK30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbkltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlKHRoaXMpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbkltcDo6RmluYWxpemUoKSB7DQorICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgZGVsZXRlIChDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQorICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPT0gTlVMTCkgew0KKyAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KICAgICB9DQotfQ0KLUNGV0xfUHVzaEJ1dHRvbkltcDo6Q0ZXTF9QdXNoQnV0dG9uSW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLSAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlcikNCi0gICAgLCBtX2JCdG5Eb3duKEZBTFNFKQ0KLSAgICAsIG1fZHdUVE9TdHlsZXMoRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUpDQotICAgICwgbV9pVFRPQWxpZ24oRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXIpDQotew0KLSAgICBtX3J0Q2xpZW50LlNldCgwLCAwLCAwLCAwKTsNCi0gICAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KLX0NCi1DRldMX1B1c2hCdXR0b25JbXA6OkNGV0xfUHVzaEJ1dHRvbkltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLSAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCi0gICAgLCBtX2JCdG5Eb3duKEZBTFNFKQ0KLSAgICAsIG1fZHdUVE9TdHlsZXMoRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUpDQotICAgICwgbV9pVFRPQWxpZ24oRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXIpDQotew0KLSAgICBtX3J0Q2xpZW50LlNldCgwLCAwLCAwLCAwKTsNCi0gICAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KLX0NCi1DRldMX1B1c2hCdXR0b25JbXA6On5DRldMX1B1c2hCdXR0b25JbXAoKQ0KLXsNCi19DQotRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCi17DQotICAgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfUHVzaEJ1dHRvbjsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9EV09SRCBDRldMX1B1c2hCdXR0b25JbXA6OkdldENsYXNzSUQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfUHVzaEJ1dHRvbjsNCi19DQotRldMX0VSUglDRldMX1B1c2hCdXR0b25JbXA6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopIEZYX05FVyBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZSh0aGlzKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfUHVzaEJ1dHRvbkltcDo6RmluYWxpemUoKQ0KLXsNCi0gICAgaWYoIG1fcERlbGVnYXRlKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCi0gICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9QdXNoQnV0dG9uSW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgKQ0KLXsNCi0gICAgaWYgKGJBdXRvU2l6ZSkgew0KLSAgICAgICAgcmVjdC5TZXQoMCwgMCwgMCwgMCk7DQotICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9PSBOVUxMKSB7DQotICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQotICAgICAgICBJRldMX1B1c2hCdXR0b25EUCAqcERhdGEgPSAoSUZXTF9QdXNoQnV0dG9uRFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgICAgIGlmIChwRGF0YSkgew0KLSAgICAgICAgICAgIHBEYXRhLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NDYXB0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaUxlbiA9IHdzQ2FwdGlvbi5HZXRMZW5ndGgoKTsNCi0gICAgICAgIGlmIChpTGVuID4gMCkgew0KLSAgICAgICAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSh3c0NhcHRpb24sIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KLSAgICAgICAgICAgIHJlY3QuU2V0KDAsIDAsIHN6LngsIHN6LnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRkxPQVQgKmZjYXB0aW9uID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9QU0JfTWFyZ2luKTsNCi0gICAgICAgIHJlY3QuSW5mbGF0ZSgqZmNhcHRpb24sICpmY2FwdGlvbik7DQotICAgICAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OlNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ICkNCi17DQotICAgIGlmICgoZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpICYmIGJTZXQpIHsNCi0gICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfRGlzYWJsZWQ7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpTZXRTdGF0ZXMoZHdTdGF0ZXMsIGJTZXQpOw0KLX0NCi1GV0xfRVJSIENGV0xfUHVzaEJ1dHRvbkltcDo6VXBkYXRlKCkNCi17DQotICAgIGlmIChJc0xvY2tlZCgpKSB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLSAgICB9DQotICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KLSAgICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgIH0NCi0gICAgVXBkYXRlVGV4dE91dFN0eWxlcygpOw0KLSAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KLSAgICBtX3J0Q2FwdGlvbiA9IG1fcnRDbGllbnQ7DQotICAgIEZYX0ZMT0FUICpmY2FwdGlvbiA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfUFNCX01hcmdpbik7DQotICAgIG1fcnRDYXB0aW9uLkluZmxhdGUoLSpmY2FwdGlvbiwgLSpmY2FwdGlvbik7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgSUZXTF9QdXNoQnV0dG9uRFAgKnBEYXRhID0gKElGV0xfUHVzaEJ1dHRvbkRQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgIENGWF9ESUJpdG1hcCAqcFBpY3R1cmUgPSBOVUxMOw0KLSAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgIGlmIChIYXNCb3JkZXIoKSkgew0KLSAgICAgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX1BTQl9Cb3JkZXIsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIGlmIChIYXNFZGdlKCkpIHsNCi0gICAgICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfUFNCX0VkZ2UsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIERyYXdCa2dyb3VuZChwR3JhcGhpY3MsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIHBNYXRyaXgpOw0KLSAgICBDRlhfTWF0cml4IG1hdHJpeDsNCi0gICAgbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgIEZYX0ZMT0FUIGlQaWN3aWR0aCA9IDA7DQotICAgIEZYX0ZMT0FUIGlwaWNoZWlnaHQgPSAwOw0KICAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQorICAgIElGV0xfUHVzaEJ1dHRvbkRQKiBwRGF0YSA9DQorICAgICAgICAoSUZXTF9QdXNoQnV0dG9uRFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCiAgICAgaWYgKHBEYXRhKSB7DQotICAgICAgICBwRGF0YS0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzQ2FwdGlvbik7DQorICAgICAgcERhdGEtPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c0NhcHRpb24pOw0KICAgICB9DQotICAgIENGWF9SZWN0RiBydFRleHQ7DQotICAgIHJ0VGV4dC5TZXQoMCwgMCwgMCAsIDApOw0KLSAgICBpZiAoIXdzQ2FwdGlvbi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIENhbGNUZXh0UmVjdCh3c0NhcHRpb24sIHBUaGVtZSwgMCwgbV9pVFRPQWxpZ24sIHJ0VGV4dCk7DQorICAgIGludDMyX3QgaUxlbiA9IHdzQ2FwdGlvbi5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW4gPiAwKSB7DQorICAgICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKHdzQ2FwdGlvbiwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICAgICAgcmVjdC5TZXQoMCwgMCwgc3oueCwgc3oueSk7DQogICAgIH0NCi0gICAgc3dpdGNoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfUFNCX01vZGVNYXNrKSB7DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfVGV4dE9ubHk6DQotICAgICAgICAgICAgRHJhd1RleHQocEdyYXBoaWNzLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCAmbWF0cml4KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9JY29uT25seToNCi0gICAgICAgICAgICBpZiAocERhdGEpIHsNCi0gICAgICAgICAgICAgICAgcFBpY3R1cmUgPSBwRGF0YS0+R2V0UGljdHVyZShtX3BJbnRlcmZhY2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocFBpY3R1cmUpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwb2ludDsNCi0gICAgICAgICAgICAgICAgc3dpdGNoKG1faVRUT0FsaWduKSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSA9ICBtX3J0Q2xpZW50LnRvcDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQgKyAobV9ydENsaWVudC53aWR0aCAvIDIgLSBwUGljdHVyZS0+R2V0V2lkdGgoKSAvIDIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gIG1fcnRDbGllbnQudG9wOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwUGljdHVyZS0+R2V0V2lkdGgoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3A7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQgKyAobV9ydENsaWVudC53aWR0aCAvIDIgLSBwUGljdHVyZS0+R2V0V2lkdGgoKSAvIDIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSA2Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0gcFBpY3R1cmUtPkdldFdpZHRoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSA9IG1fcnRDbGllbnQudG9wICArIG1fcnRDbGllbnQuaGVpZ2h0IC8gMiAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKSAvIDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIDg6DQotICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gIG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIDk6DQotICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIChtX3J0Q2xpZW50LndpZHRoIC8gMiAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC8gMik7DQotICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSA9ICBtX3J0Q2xpZW50LnRvcCArIG1fcnRDbGllbnQuaGVpZ2h0IC0gcFBpY3R1cmUtPkdldEhlaWdodCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcCAgKyBtX3J0Q2xpZW50LmhlaWdodCAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPkRyYXdJbWFnZShwUGljdHVyZSwgcG9pbnQsICZtYXRyaXgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9UZXh0SWNvbjoNCi0gICAgICAgICAgICBpZiAocFBpY3R1cmUpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwb2ludDsNCi0gICAgICAgICAgICAgICAgc3dpdGNoKG1faVRUT0FsaWduKSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSA9ICBtX3J0Q2xpZW50LnRvcDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaVBpY3dpZHRoID0gKEZYX0ZMT0FUKShwUGljdHVyZS0+R2V0V2lkdGgoKSAtIDcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGljaGVpZ2h0ID0gcFBpY3R1cmUtPkdldEhlaWdodCgpIC8gMiAtIG1fcnRDYXB0aW9uLnRvcCAtIHJ0VGV4dC5oZWlnaHQgLyAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIChtX3J0Q2xpZW50LndpZHRoIC8gMiAtIChwUGljdHVyZS0+R2V0V2lkdGgoKSArIHJ0VGV4dC53aWR0aCkgLyAyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueSA9ICBtX3J0Q2xpZW50LnRvcDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaVBpY3dpZHRoID0gcFBpY3R1cmUtPkdldFdpZHRoKCkgLSAoKG1fcnRDbGllbnQud2lkdGgpIC8gMiAtIHJ0VGV4dC53aWR0aCAvIDIgLSBwb2ludC54KSArIHJ0VGV4dC53aWR0aCAvIDIgLSA3Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGljaGVpZ2h0ID0gcFBpY3R1cmUtPkdldEhlaWdodCgpIC8gMiAtIG1fcnRDYXB0aW9uLnRvcCAtIHJ0VGV4dC5oZWlnaHQgLyAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwUGljdHVyZS0+R2V0V2lkdGgoKSAtIHJ0VGV4dC53aWR0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3A7DQotICAgICAgICAgICAgICAgICAgICAgICAgaVBpY3dpZHRoID0gIG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwb2ludC54IC0gcFBpY3R1cmUtPkdldFdpZHRoKCkgLSBydFRleHQud2lkdGggKyA3Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlwaWNoZWlnaHQgPSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyIC0gbV9ydENhcHRpb24udG9wIC0gcnRUZXh0LmhlaWdodCAvIDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlQaWN3aWR0aCA9IG1fcnRDbGllbnQubGVmdCArIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gNzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNToNCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgKG1fcnRDbGllbnQud2lkdGggLyAyIC0gKHBQaWN0dXJlLT5HZXRXaWR0aCgpICsgcnRUZXh0LndpZHRoKSAvIDIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlQaWN3aWR0aCA9IHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gKChtX3J0Q2xpZW50LndpZHRoKSAvIDIgLSBydFRleHQud2lkdGggLyAyIC0gcG9pbnQueCkgKyBydFRleHQud2lkdGggLyAyIC0gNzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNjoNCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gcnRUZXh0LndpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcCAgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlQaWN3aWR0aCA9ICBtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0gcG9pbnQueCAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gcnRUZXh0LndpZHRoICsgNzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpUGljd2lkdGggPSAoRlhfRkxPQVQpKHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gNyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaXBpY2hlaWdodCAtPSBydFRleHQuaGVpZ2h0IC8gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgOToNCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgKG1fcnRDbGllbnQud2lkdGggLyAyIC0gKHBQaWN0dXJlLT5HZXRXaWR0aCgpICsgcnRUZXh0LndpZHRoKSAvIDIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgPSAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpUGljd2lkdGggPSBwUGljdHVyZS0+R2V0V2lkdGgoKSAtICgobV9ydENsaWVudC53aWR0aCkgLyAyIC0gcnRUZXh0LndpZHRoIC8gMiAtIHBvaW50LngpICsgcnRUZXh0LndpZHRoIC8gMiAtIDc7DQotICAgICAgICAgICAgICAgICAgICAgICAgaXBpY2hlaWdodCAtPSBydFRleHQuaGVpZ2h0IC8gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6DQotICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwUGljdHVyZS0+R2V0V2lkdGgoKSAtIHJ0VGV4dC53aWR0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3AgICsgbV9ydENsaWVudC5oZWlnaHQgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaVBpY3dpZHRoID0gIG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwb2ludC54IC0gcFBpY3R1cmUtPkdldFdpZHRoKCkgLSBydFRleHQud2lkdGggKyA3Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlwaWNoZWlnaHQgLT0gcnRUZXh0LmhlaWdodCAvIDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5EcmF3SW1hZ2UocFBpY3R1cmUsIHBvaW50LCAmbWF0cml4KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbWF0cml4LmUgKz0gbV9ydENsaWVudC5sZWZ0ICsgaVBpY3dpZHRoOw0KLSAgICAgICAgICAgIG1hdHJpeC5mICs9IG1fcnRDbGllbnQudG9wICsgaXBpY2hlaWdodDsNCi0gICAgICAgICAgICBEcmF3VGV4dChwR3JhcGhpY3MsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsICZtYXRyaXgpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQorICAgIEZYX0ZMT0FUKiBmY2FwdGlvbiA9DQorICAgICAgICAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1BTQl9NYXJnaW4pOw0KKyAgICByZWN0LkluZmxhdGUoKmZjYXB0aW9uLCAqZmNhcHRpb24pOw0KKyAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbkltcDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQpIHsNCisgIGlmICgoZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpICYmIGJTZXQpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyA9IEZXTF9XR1RTVEFURV9EaXNhYmxlZDsNCiAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpTZXRTdGF0ZXMoZHdTdGF0ZXMsIGJTZXQpOw0KIH0NCi12b2lkIENGV0xfUHVzaEJ1dHRvbkltcDo6RHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KLSAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9QU0JfQmFja2dyb3VuZDsNCi0gICAgcGFyYW0ubV9kd1N0YXRlcyA9IEdldFBhcnRTdGF0ZXMoKTsNCi0gICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydENsaWVudDsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KLSAgICAgICAgcGFyYW0ubV9wRGF0YSA9ICZtX3J0Q2FwdGlvbjsNCi0gICAgfQ0KLSAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OlVwZGF0ZSgpIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgbV9ydENhcHRpb24gPSBtX3J0Q2xpZW50Ow0KKyAgRlhfRkxPQVQqIGZjYXB0aW9uID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9QU0JfTWFyZ2luKTsNCisgIG1fcnRDYXB0aW9uLkluZmxhdGUoLSpmY2FwdGlvbiwgLSpmY2FwdGlvbik7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLXZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wOjpEcmF3VGV4dChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCi0gICAgbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NDYXB0aW9uKTsNCi0gICAgaWYgKHdzQ2FwdGlvbi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRldMX1RoZW1lVGV4dCBwYXJhbTsNCi0gICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfUFNCX0NhcHRpb247DQotICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBHZXRQYXJ0U3RhdGVzKCk7DQotICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDYXB0aW9uOw0KLSAgICBwYXJhbS5tX3dzVGV4dCA9IHdzQ2FwdGlvbjsNCi0gICAgcGFyYW0ubV9kd1RUT1N0eWxlcyA9IG1fZHdUVE9TdHlsZXM7DQotICAgIHBhcmFtLm1faVRUT0FsaWduID0gbV9pVFRPQWxpZ247DQotICAgIHBUaGVtZS0+RHJhd1RleHQoJnBhcmFtKTsNCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbkltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIElGV0xfUHVzaEJ1dHRvbkRQKiBwRGF0YSA9IChJRldMX1B1c2hCdXR0b25EUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgQ0ZYX0RJQml0bWFwKiBwUGljdHVyZSA9IE5VTEw7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX1BTQl9Cb3JkZXIsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgcE1hdHJpeCk7DQorICB9DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfUFNCX0VkZ2UsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsDQorICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgfQ0KKyAgRHJhd0JrZ3JvdW5kKHBHcmFwaGljcywgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgcE1hdHJpeCk7DQorICBDRlhfTWF0cml4IG1hdHJpeDsNCisgIG1hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgRlhfRkxPQVQgaVBpY3dpZHRoID0gMDsNCisgIEZYX0ZMT0FUIGlwaWNoZWlnaHQgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXB0aW9uOw0KKyAgaWYgKHBEYXRhKSB7DQorICAgIHBEYXRhLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NDYXB0aW9uKTsNCisgIH0NCisgIENGWF9SZWN0RiBydFRleHQ7DQorICBydFRleHQuU2V0KDAsIDAsIDAsIDApOw0KKyAgaWYgKCF3c0NhcHRpb24uSXNFbXB0eSgpKSB7DQorICAgIENhbGNUZXh0UmVjdCh3c0NhcHRpb24sIHBUaGVtZSwgMCwgbV9pVFRPQWxpZ24sIHJ0VGV4dCk7DQorICB9DQorICBzd2l0Y2ggKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfUFNCX01vZGVNYXNrKSB7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9UZXh0T25seToNCisgICAgICBEcmF3VGV4dChwR3JhcGhpY3MsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsICZtYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfSWNvbk9ubHk6DQorICAgICAgaWYgKHBEYXRhKSB7DQorICAgICAgICBwUGljdHVyZSA9IHBEYXRhLT5HZXRQaWN0dXJlKG1fcEludGVyZmFjZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwUGljdHVyZSkgew0KKyAgICAgICAgQ0ZYX1BvaW50RiBwb2ludDsNCisgICAgICAgIHN3aXRjaCAobV9pVFRPQWxpZ24pIHsNCisgICAgICAgICAgY2FzZSAwOiB7DQorICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3A7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2FzZSAxOiB7DQorICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArDQorICAgICAgICAgICAgICAgICAgICAgIChtX3J0Q2xpZW50LndpZHRoIC8gMiAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC8gMik7DQorICAgICAgICAgICAgcG9pbnQueSA9IG1fcnRDbGllbnQudG9wOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpOw0KKyAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgICAgICAgICAgcG9pbnQueSA9IG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLyAyIC0NCisgICAgICAgICAgICAgICAgICAgICAgcFBpY3R1cmUtPkdldEhlaWdodCgpIC8gMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSA1Og0KKyAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQgKw0KKyAgICAgICAgICAgICAgICAgICAgICAobV9ydENsaWVudC53aWR0aCAvIDIgLSBwUGljdHVyZS0+R2V0V2lkdGgoKSAvIDIpOw0KKyAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcCArIG1fcnRDbGllbnQuaGVpZ2h0IC8gMiAtDQorICAgICAgICAgICAgICAgICAgICAgIHBQaWN0dXJlLT5HZXRIZWlnaHQoKSAvIDI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgNjoNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpOw0KKyAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcCArIG1fcnRDbGllbnQuaGVpZ2h0IC8gMiAtDQorICAgICAgICAgICAgICAgICAgICAgIHBQaWN0dXJlLT5HZXRIZWlnaHQoKSAvIDI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgODoNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0Ow0KKyAgICAgICAgICAgIHBvaW50LnkgPQ0KKyAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LnRvcCArIG1fcnRDbGllbnQuaGVpZ2h0IC0gcFBpY3R1cmUtPkdldEhlaWdodCgpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIDk6DQorICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArDQorICAgICAgICAgICAgICAgICAgICAgIChtX3J0Q2xpZW50LndpZHRoIC8gMiAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC8gMik7DQorICAgICAgICAgICAgcG9pbnQueSA9DQorICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgMTA6DQorICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwUGljdHVyZS0+R2V0V2lkdGgoKTsNCisgICAgICAgICAgICBwb2ludC55ID0NCisgICAgICAgICAgICAgICAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHBHcmFwaGljcy0+RHJhd0ltYWdlKHBQaWN0dXJlLCBwb2ludCwgJm1hdHJpeCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfVGV4dEljb246DQorICAgICAgaWYgKHBQaWN0dXJlKSB7DQorICAgICAgICBDRlhfUG9pbnRGIHBvaW50Ow0KKyAgICAgICAgc3dpdGNoIChtX2lUVE9BbGlnbikgew0KKyAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0Ow0KKyAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcDsNCisgICAgICAgICAgICBpUGljd2lkdGggPSAoRlhfRkxPQVQpKHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gNyk7DQorICAgICAgICAgICAgaXBpY2hlaWdodCA9DQorICAgICAgICAgICAgICAgIHBQaWN0dXJlLT5HZXRIZWlnaHQoKSAvIDIgLSBtX3J0Q2FwdGlvbi50b3AgLSBydFRleHQuaGVpZ2h0IC8gMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYXNlIDE6IHsNCisgICAgICAgICAgICBwb2ludC54ID0NCisgICAgICAgICAgICAgICAgbV9ydENsaWVudC5sZWZ0ICsgKG1fcnRDbGllbnQud2lkdGggLyAyIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUGljdHVyZS0+R2V0V2lkdGgoKSArIHJ0VGV4dC53aWR0aCkgLyAyKTsNCisgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3A7DQorICAgICAgICAgICAgaVBpY3dpZHRoID0gcFBpY3R1cmUtPkdldFdpZHRoKCkgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICgobV9ydENsaWVudC53aWR0aCkgLyAyIC0gcnRUZXh0LndpZHRoIC8gMiAtIHBvaW50LngpICsNCisgICAgICAgICAgICAgICAgICAgICAgICBydFRleHQud2lkdGggLyAyIC0gNzsNCisgICAgICAgICAgICBpcGljaGVpZ2h0ID0NCisgICAgICAgICAgICAgICAgcFBpY3R1cmUtPkdldEhlaWdodCgpIC8gMiAtIG1fcnRDYXB0aW9uLnRvcCAtIHJ0VGV4dC5oZWlnaHQgLyAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtDQorICAgICAgICAgICAgICAgICAgICAgIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gcnRUZXh0LndpZHRoOw0KKyAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcDsNCisgICAgICAgICAgICBpUGljd2lkdGggPSBtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0gcG9pbnQueCAtDQorICAgICAgICAgICAgICAgICAgICAgICAgcFBpY3R1cmUtPkdldFdpZHRoKCkgLSBydFRleHQud2lkdGggKyA3Ow0KKyAgICAgICAgICAgIGlwaWNoZWlnaHQgPQ0KKyAgICAgICAgICAgICAgICBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyIC0gbV9ydENhcHRpb24udG9wIC0gcnRUZXh0LmhlaWdodCAvIDI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0Ow0KKyAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcCArIG1fcnRDbGllbnQuaGVpZ2h0IC8gMiAtDQorICAgICAgICAgICAgICAgICAgICAgIHBQaWN0dXJlLT5HZXRIZWlnaHQoKSAvIDI7DQorICAgICAgICAgICAgaVBpY3dpZHRoID0gbV9ydENsaWVudC5sZWZ0ICsgcFBpY3R1cmUtPkdldFdpZHRoKCkgLSA3Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIDU6DQorICAgICAgICAgICAgcG9pbnQueCA9DQorICAgICAgICAgICAgICAgIG1fcnRDbGllbnQubGVmdCArIChtX3J0Q2xpZW50LndpZHRoIC8gMiAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFBpY3R1cmUtPkdldFdpZHRoKCkgKyBydFRleHQud2lkdGgpIC8gMik7DQorICAgICAgICAgICAgcG9pbnQueSA9IG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLyAyIC0NCisgICAgICAgICAgICAgICAgICAgICAgcFBpY3R1cmUtPkdldEhlaWdodCgpIC8gMjsNCisgICAgICAgICAgICBpUGljd2lkdGggPSBwUGljdHVyZS0+R2V0V2lkdGgoKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgKChtX3J0Q2xpZW50LndpZHRoKSAvIDIgLSBydFRleHQud2lkdGggLyAyIC0gcG9pbnQueCkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJ0VGV4dC53aWR0aCAvIDIgLSA3Ow0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIDY6DQorICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLQ0KKyAgICAgICAgICAgICAgICAgICAgICBwUGljdHVyZS0+R2V0V2lkdGgoKSAtIHJ0VGV4dC53aWR0aDsNCisgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLQ0KKyAgICAgICAgICAgICAgICAgICAgICBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KKyAgICAgICAgICAgIGlQaWN3aWR0aCA9IG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwb2ludC54IC0NCisgICAgICAgICAgICAgICAgICAgICAgICBwUGljdHVyZS0+R2V0V2lkdGgoKSAtIHJ0VGV4dC53aWR0aCArIDc7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgODoNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0Ow0KKyAgICAgICAgICAgIHBvaW50LnkgPQ0KKyAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LnRvcCArIG1fcnRDbGllbnQuaGVpZ2h0IC0gcFBpY3R1cmUtPkdldEhlaWdodCgpOw0KKyAgICAgICAgICAgIGlQaWN3aWR0aCA9IChGWF9GTE9BVCkocFBpY3R1cmUtPkdldFdpZHRoKCkgLSA3KTsNCisgICAgICAgICAgICBpcGljaGVpZ2h0IC09IHJ0VGV4dC5oZWlnaHQgLyAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIDk6DQorICAgICAgICAgICAgcG9pbnQueCA9DQorICAgICAgICAgICAgICAgIG1fcnRDbGllbnQubGVmdCArIChtX3J0Q2xpZW50LndpZHRoIC8gMiAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFBpY3R1cmUtPkdldFdpZHRoKCkgKyBydFRleHQud2lkdGgpIC8gMik7DQorICAgICAgICAgICAgcG9pbnQueSA9DQorICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCk7DQorICAgICAgICAgICAgaVBpY3dpZHRoID0gcFBpY3R1cmUtPkdldFdpZHRoKCkgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICgobV9ydENsaWVudC53aWR0aCkgLyAyIC0gcnRUZXh0LndpZHRoIC8gMiAtIHBvaW50LngpICsNCisgICAgICAgICAgICAgICAgICAgICAgICBydFRleHQud2lkdGggLyAyIC0gNzsNCisgICAgICAgICAgICBpcGljaGVpZ2h0IC09IHJ0VGV4dC5oZWlnaHQgLyAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIDEwOg0KKyAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0NCisgICAgICAgICAgICAgICAgICAgICAgcFBpY3R1cmUtPkdldFdpZHRoKCkgLSBydFRleHQud2lkdGg7DQorICAgICAgICAgICAgcG9pbnQueSA9DQorICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCk7DQorICAgICAgICAgICAgaVBpY3dpZHRoID0gbV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtIHBvaW50LnggLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gcnRUZXh0LndpZHRoICsgNzsNCisgICAgICAgICAgICBpcGljaGVpZ2h0IC09IHJ0VGV4dC5oZWlnaHQgLyAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEdyYXBoaWNzLT5EcmF3SW1hZ2UocFBpY3R1cmUsIHBvaW50LCAmbWF0cml4KTsNCisgICAgICB9DQorICAgICAgbWF0cml4LmUgKz0gbV9ydENsaWVudC5sZWZ0ICsgaVBpY3dpZHRoOw0KKyAgICAgIG1hdHJpeC5mICs9IG1fcnRDbGllbnQudG9wICsgaXBpY2hlaWdodDsNCisgICAgICBEcmF3VGV4dChwR3JhcGhpY3MsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsICZtYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GWF9EV09SRCBDRldMX1B1c2hCdXR0b25JbXA6OkdldFBhcnRTdGF0ZXMoKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX1BTQl9Ob3JtYWw7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCi0gICAgICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfUFNCX0ZvY3VzZWQ7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCi0gICAgICAgIGR3U3RhdGVzID0gRldMX1BBUlRTVEFURV9QU0JfRGlzYWJsZWQ7DQotICAgIH0gZWxzZSBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgew0KLSAgICAgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9QU0JfUHJlc3NlZDsNCi0gICAgfSBlbHNlIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX1BTQl9Ib3ZlcmVkKSB7DQotICAgICAgICBkd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX1BTQl9Ib3ZlcmVkOw0KLSAgICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfUFNCX0RlZmF1bHQpIHsNCi0gICAgICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfUFNCX0RlZmF1bHQ7DQotICAgIH0NCi0gICAgcmV0dXJuIGR3U3RhdGVzOw0KK3ZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wOjpEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX1BTQl9CYWNrZ3JvdW5kOw0KKyAgcGFyYW0ubV9kd1N0YXRlcyA9IEdldFBhcnRTdGF0ZXMoKTsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydENsaWVudDsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCisgICAgcGFyYW0ubV9wRGF0YSA9ICZtX3J0Q2FwdGlvbjsNCisgIH0NCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCiB9DQotdm9pZCBDRldMX1B1c2hCdXR0b25JbXA6OlVwZGF0ZVRleHRPdXRTdHlsZXMoKQ0KLXsNCi0gICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCi0gICAgc3dpdGNoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiAoRldMX1NUWUxFRVhUX1BTQl9ITGF5b3V0TWFzayB8IEZXTF9TVFlMRUVYVF9QU0JfVkxheW91dE1hc2spKSB7DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfTGVmdCB8IEZXTF9TVFlMRUVYVF9QU0JfVG9wOiB7DQotICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BMZWZ0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfQ2VudGVyIHwgRldMX1NUWUxFRVhUX1BTQl9Ub3A6IHsNCi0gICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcENlbnRlcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX1JpZ2h0IHwgRldMX1NUWUxFRVhUX1BTQl9Ub3A6IHsNCi0gICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcFJpZ2h0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfTGVmdCB8IEZXTF9TVFlMRUVYVF9QU0JfVkNlbnRlcjogew0KLSAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX0NlbnRlciB8IEZXTF9TVFlMRUVYVF9QU0JfVkNlbnRlcjogew0KLSAgICAgICAgICAgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfUmlnaHQgfCBGV0xfU1RZTEVFWFRfUFNCX1ZDZW50ZXI6IHsNCi0gICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlclJpZ2h0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfTGVmdCB8IEZXTF9TVFlMRUVYVF9QU0JfQm90dG9tOiB7DQotICAgICAgICAgICAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21MZWZ0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfQ2VudGVyIHwgRldMX1NUWUxFRVhUX1BTQl9Cb3R0b206IHsNCi0gICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUNlbnRlcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX1JpZ2h0IHwgRldMX1NUWUxFRVhUX1BTQl9Cb3R0b206IHsNCi0gICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbVJpZ2h0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfV0dUU1RZTEVfUlRMUmVhZGluZykgew0KLSAgICAgICAgbV9kd1RUT1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfUlRMOw0KLSAgICB9DQordm9pZCBDRldMX1B1c2hCdXR0b25JbXA6OkRyYXdUZXh0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXB0aW9uOw0KKyAgbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NDYXB0aW9uKTsNCisgIGlmICh3c0NhcHRpb24uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGV0xfVGhlbWVUZXh0IHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX1BTQl9DYXB0aW9uOw0KKyAgcGFyYW0ubV9kd1N0YXRlcyA9IEdldFBhcnRTdGF0ZXMoKTsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydENhcHRpb247DQorICBwYXJhbS5tX3dzVGV4dCA9IHdzQ2FwdGlvbjsNCisgIHBhcmFtLm1fZHdUVE9TdHlsZXMgPSBtX2R3VFRPU3R5bGVzOw0KKyAgcGFyYW0ubV9pVFRPQWxpZ24gPSBtX2lUVE9BbGlnbjsNCisgIHBUaGVtZS0+RHJhd1RleHQoJnBhcmFtKTsNCiB9DQotQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6OkNGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlKENGV0xfUHVzaEJ1dHRvbkltcCAqcE93bmVyKQ0KLSAgICA6IG1fcE93bmVyKHBPd25lcikNCi17DQorRlhfRFdPUkQgQ0ZXTF9QdXNoQnV0dG9uSW1wOjpHZXRQYXJ0U3RhdGVzKCkgew0KKyAgRlhfRFdPUkQgZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX1BTQl9Ob3JtYWw7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQorICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfUFNCX0ZvY3VzZWQ7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KKyAgICBkd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfUFNCX0Rpc2FibGVkOw0KKyAgfSBlbHNlIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX1BTQl9QcmVzc2VkKSB7DQorICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfUFNCX1ByZXNzZWQ7DQorICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpIHsNCisgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9QU0JfSG92ZXJlZDsNCisgIH0gZWxzZSBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfRGVmYXVsdCkgew0KKyAgICBkd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX1BTQl9EZWZhdWx0Ow0KKyAgfQ0KKyAgcmV0dXJuIGR3U3RhdGVzOw0KIH0NCi1pbnQzMl90IENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCi0gICAgaWYgKCFtX3BPd25lci0+SXNFbmFibGVkKCkpIHsNCi0gICAgICAgIHJldHVybiAxOw0KK3ZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wOjpVcGRhdGVUZXh0T3V0U3R5bGVzKCkgew0KKyAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmDQorICAgICAgICAgIChGV0xfU1RZTEVFWFRfUFNCX0hMYXlvdXRNYXNrIHwgRldMX1NUWUxFRVhUX1BTQl9WTGF5b3V0TWFzaykpIHsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX0xlZnQgfCBGV0xfU1RZTEVFWFRfUFNCX1RvcDogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BMZWZ0Ow0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGludDMyX3QgaVJldCA9IDE7DQotICAgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQotICAgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCi0gICAgICAgICAgICAgICAgT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCi0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGR3Q21kKSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTGVhdmUocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9Nc2dLZXkgKnBLZXkgPSAoQ0ZXTF9Nc2dLZXkqKXBNZXNzYWdlOw0KLSAgICAgICAgICAgICAgICBpZiAocEtleS0+bV9kd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24pIHsNCi0gICAgICAgICAgICAgICAgICAgIE9uS2V5RG93bigoQ0ZXTF9Nc2dLZXkqKXBLZXkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgaVJldCA9IDA7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX0NlbnRlciB8IEZXTF9TVFlMRUVYVF9QU0JfVG9wOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcENlbnRlcjsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCi0gICAgcmV0dXJuIGlSZXQ7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUglDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KLX0NCi12b2lkIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCApDQotew0KLSAgICBpZiAoYlNldCkgew0KLSAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9SaWdodCB8IEZXTF9TVFlMRUVYVF9QU0JfVG9wOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcFJpZ2h0Ow0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQotfQ0KLXZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KLSAgICAgICAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfTGVmdCB8IEZXTF9TVFlMRUVYVF9QU0JfVkNlbnRlcjogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0Ow0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIG1fcE93bmVyLT5tX2JCdG5Eb3duID0gVFJVRTsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX0NlbnRlciB8IEZXTF9TVFlMRUVYVF9QU0JfVkNlbnRlcjogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX1JpZ2h0IHwgRldMX1NUWUxFRVhUX1BTQl9WQ2VudGVyOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlclJpZ2h0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9MZWZ0IHwgRldMX1NUWUxFRVhUX1BTQl9Cb3R0b206IHsNCisgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQm90dG9tTGVmdDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfQ2VudGVyIHwgRldMX1NUWUxFRVhUX1BTQl9Cb3R0b206IHsNCisgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQm90dG9tQ2VudGVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9SaWdodCB8IEZXTF9TVFlMRUVYVF9QU0JfQm90dG9tOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbVJpZ2h0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICBtX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9XR1RTVFlMRV9SVExSZWFkaW5nKSB7DQorICAgIG1fZHdUVE9TdHlsZXMgfD0gRkRFX1RUT1NUWUxFX1JUTDsNCisgIH0NCit9DQorQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6OkNGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlKA0KKyAgICBDRldMX1B1c2hCdXR0b25JbXAqIHBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpIHt9DQoraW50MzJfdCBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgIGlmICghbV9wT3duZXItPklzRW5hYmxlZCgpKSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgaW50MzJfdCBpUmV0ID0gMTsNCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KKyAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCisgICAgICBDRldMX01zZ01vdXNlKiBwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgICBzd2l0Y2ggKGR3Q21kKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCisgICAgICAgICAgT25Nb3VzZU1vdmUocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTogew0KKyAgICAgICAgICBPbk1vdXNlTGVhdmUocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDoge30NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCisgICAgICBDRldMX01zZ0tleSogcEtleSA9IChDRldMX01zZ0tleSopcE1lc3NhZ2U7DQorICAgICAgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duKSB7DQorICAgICAgICBPbktleURvd24oKENGV0xfTXNnS2V5KilwS2V5KTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogew0KKyAgICAgIGlSZXQgPSAwOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgIHJldHVybiBpUmV0Ow0KK30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldCkgew0KKyAgaWYgKGJTZXQpIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICB9DQorICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KK30NCit2b2lkIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KKyAgICBtX3BPd25lci0+U2V0Rm9jdXMoVFJVRSk7DQorICB9DQorICBtX3BPd25lci0+bV9iQnRuRG93biA9IFRSVUU7DQorICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfUFNCX0hvdmVyZWQ7DQorICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfUFNCX1ByZXNzZWQ7DQorICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KK30NCit2b2lkIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpPbkxCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBtX3BPd25lci0+bV9iQnRuRG93biA9IEZBTFNFOw0KKyAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX1ByZXNzZWQ7DQogICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9QU0JfSG92ZXJlZDsNCi0gICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX1BTQl9QcmVzc2VkOw0KLSAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KLX0NCi12b2lkIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpPbkxCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgbV9wT3duZXItPm1fYkJ0bkRvd24gPSBGQUxTRTsNCi0gICAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX1BTQl9QcmVzc2VkOw0KLSAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX1BTQl9Ib3ZlcmVkOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9QU0JfSG92ZXJlZDsNCi0gICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX1ByZXNzZWQ7DQotICAgIH0NCi0gICAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICBDRldMX0V2dENsaWNrIHdtQ2xpY2s7DQotICAgICAgICB3bUNsaWNrLm1fcFNyY1RhcmdldCA9IChJRldMX1B1c2hCdXR0b24qKW1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQotICAgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21DbGljayk7DQotICAgIH0NCi0gICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCi19DQotdm9pZCBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIEZYX0JPT0wgYlJlcGFpbnQgPSBGQUxTRTsNCi0gICAgaWYgKG1fcE93bmVyLT5tX2JCdG5Eb3duKSB7DQotICAgICAgICBpZiAobV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgICAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX1BTQl9QcmVzc2VkKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9QU0JfUHJlc3NlZDsNCi0gICAgICAgICAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9QU0JfSG92ZXJlZDsNCi0gICAgICAgICAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX1BTQl9QcmVzc2VkKSB7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX1ByZXNzZWQ7DQotICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfSG92ZXJlZCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfUFNCX0hvdmVyZWQ7DQotICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoIW1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfSG92ZXJlZCkgPT0gMCkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9QU0JfSG92ZXJlZDsNCi0gICAgICAgICAgICBiUmVwYWludCA9IFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGJSZXBhaW50KSB7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgbV9wT3duZXItPm1fYkJ0bkRvd24gPSBGQUxTRTsNCisgIH0gZWxzZSB7DQogICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX0hvdmVyZWQ7DQogICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX1ByZXNzZWQ7DQotICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICB9DQorICBpZiAobV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgQ0ZXTF9FdnRDbGljayB3bUNsaWNrOw0KKyAgICB3bUNsaWNrLm1fcFNyY1RhcmdldCA9IChJRldMX1B1c2hCdXR0b24qKW1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZ3bUNsaWNrKTsNCisgIH0NCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQogfQ0KLXZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uS2V5RG93bihDRldMX01zZ0tleSAqcE1zZykNCi17DQotICAgIGlmIChwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9SZXR1cm4pIHsNCi0gICAgICAgIENGV0xfRXZ0TW91c2Ugd21Nb3VzZTsNCi0gICAgICAgIHdtTW91c2UubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCi0gICAgICAgIHdtTW91c2UubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA7DQotICAgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21Nb3VzZSk7DQotICAgICAgICBDRldMX0V2dENsaWNrIHdtQ2xpY2s7DQotICAgICAgICB3bUNsaWNrLm1fcFNyY1RhcmdldCA9IChJRldMX1B1c2hCdXR0b24qKW1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQotICAgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21DbGljayk7DQotICAgICAgICByZXR1cm47DQordm9pZCBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgRlhfQk9PTCBiUmVwYWludCA9IEZBTFNFOw0KKyAgaWYgKG1fcE93bmVyLT5tX2JCdG5Eb3duKSB7DQorICAgIGlmIChtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfUFNCX1ByZXNzZWQpID09IDApIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9QU0JfUHJlc3NlZDsNCisgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICB9DQorICAgICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX1BTQl9Ib3ZlcmVkKSB7DQorICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX1BTQl9Ib3ZlcmVkOw0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfUFNCX1ByZXNzZWQpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX1ByZXNzZWQ7DQorICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpID09IDApIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9QU0JfSG92ZXJlZDsNCisgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKHBNc2ctPm1fZHdLZXlDb2RlICE9IEZXTF9WS0VZX1RhYikgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKCFtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KLSAgICBtX3BPd25lci0+RGlzcGF0Y2hLZXlFdmVudChwTXNnKTsNCisgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfSG92ZXJlZCkgPT0gMCkgew0KKyAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9QU0JfSG92ZXJlZDsNCisgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgIH0NCisgIH0NCisgIGlmIChiUmVwYWludCkgew0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgbV9wT3duZXItPm1fYkJ0bkRvd24gPSBGQUxTRTsNCisgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX0hvdmVyZWQ7DQorICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX1BTQl9QcmVzc2VkOw0KKyAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCit9DQordm9pZCBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25LZXlEb3duKENGV0xfTXNnS2V5KiBwTXNnKSB7DQorICBpZiAocE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfUmV0dXJuKSB7DQorICAgIENGV0xfRXZ0TW91c2Ugd21Nb3VzZTsNCisgICAgd21Nb3VzZS5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICB3bU1vdXNlLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOw0KKyAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21Nb3VzZSk7DQorICAgIENGV0xfRXZ0Q2xpY2sgd21DbGljazsNCisgICAgd21DbGljay5tX3BTcmNUYXJnZXQgPSAoSUZXTF9QdXNoQnV0dG9uKiltX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21DbGljayk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwTXNnLT5tX2R3S2V5Q29kZSAhPSBGV0xfVktFWV9UYWIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wT3duZXItPkRpc3BhdGNoS2V5RXZlbnQocE1zZyk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9zY3JvbGxiYXJpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3Njcm9sbGJhcmltcC5jcHAKaW5kZXggN2IzZTQzZi4uYTY5MmQ1MCAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3Njcm9sbGJhcmltcC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3Njcm9sbGJhcmltcC5jcHAKQEAgLTksODQ0ICs5LDgzNSBAQAogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KICNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9zY3JvbGxiYXJpbXAuaCINCi0jZGVmaW5lIEZXTF9TQ1JPTExCQVJfRWxhcHNlCTUwMA0KLSNkZWZpbmUgRldMX1NDUk9MTEJBUl9NaW5UaHVtYgk1DQotSUZXTF9TY3JvbGxCYXIqIElGV0xfU2Nyb2xsQmFyOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBJRldMX1Njcm9sbEJhcjsNCisjZGVmaW5lIEZXTF9TQ1JPTExCQVJfRWxhcHNlIDUwMA0KKyNkZWZpbmUgRldMX1NDUk9MTEJBUl9NaW5UaHVtYiA1DQorSUZXTF9TY3JvbGxCYXIqIElGV0xfU2Nyb2xsQmFyOjpDcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IElGV0xfU2Nyb2xsQmFyOw0KIH0NCi1JRldMX1Njcm9sbEJhcjo6SUZXTF9TY3JvbGxCYXIoKQ0KLXsNCitJRldMX1Njcm9sbEJhcjo6SUZXTF9TY3JvbGxCYXIoKSB7DQorICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9TY3JvbGxCYXI6On5JRldMX1Njcm9sbEJhcigpIHsNCisgIGlmIChtX3BEYXRhKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGE7DQogICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgfQ0KIH0NCi1JRldMX1Njcm9sbEJhcjo6fklGV0xfU2Nyb2xsQmFyKCkNCi17DQotICAgIGlmIChtX3BEYXRhKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhOw0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQotICAgIH0NCitGV0xfRVJSIElGV0xfU2Nyb2xsQmFyOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9TY3JvbGxCYXJJbXAocE91dGVyKTsNCisgICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCiB9DQotRldMX0VSUiBJRldMX1Njcm9sbEJhcjo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1Njcm9sbEJhckltcChwT3V0ZXIpOw0KLSAgICAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KLSAgICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitGV0xfRVJSIElGV0xfU2Nyb2xsQmFyOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9TY3JvbGxCYXJJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCiB9DQotRldMX0VSUiBJRldMX1Njcm9sbEJhcjo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfU2Nyb2xsQmFySW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZYX0JPT0wgSUZXTF9TY3JvbGxCYXI6OklzVmVydGljYWwoKSB7DQorICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPklzVmVydGljYWwoKTsNCiB9DQotRlhfQk9PTCBJRldMX1Njcm9sbEJhcjo6SXNWZXJ0aWNhbCgpDQotew0KLSAgICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPklzVmVydGljYWwoKTsNCitGV0xfRVJSIElGV0xfU2Nyb2xsQmFyOjpHZXRSYW5nZShGWF9GTE9BVCYgZk1pbiwgRlhfRkxPQVQmIGZNYXgpIHsNCisgIHJldHVybiAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+R2V0UmFuZ2UoZk1pbiwgZk1heCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9TY3JvbGxCYXI6OkdldFJhbmdlKEZYX0ZMT0FUICZmTWluLCBGWF9GTE9BVCAmZk1heCkNCi17DQotICAgIHJldHVybiAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+R2V0UmFuZ2UoZk1pbiwgZk1heCk7DQorRldMX0VSUiBJRldMX1Njcm9sbEJhcjo6U2V0UmFuZ2UoRlhfRkxPQVQgZk1pbiwgRlhfRkxPQVQgZk1heCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5TZXRSYW5nZShmTWluLCBmTWF4KTsNCiB9DQotRldMX0VSUiBJRldMX1Njcm9sbEJhcjo6U2V0UmFuZ2UoRlhfRkxPQVQgZk1pbiwgRlhfRkxPQVQgZk1heCkNCi17DQotICAgIHJldHVybiAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+U2V0UmFuZ2UoZk1pbiwgZk1heCk7DQorRlhfRkxPQVQgSUZXTF9TY3JvbGxCYXI6OkdldFBhZ2VTaXplKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5HZXRQYWdlU2l6ZSgpOw0KIH0NCi1GWF9GTE9BVCBJRldMX1Njcm9sbEJhcjo6R2V0UGFnZVNpemUoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5HZXRQYWdlU2l6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9TY3JvbGxCYXI6OlNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5TZXRQYWdlU2l6ZShmUGFnZVNpemUpOw0KIH0NCi1GV0xfRVJSIElGV0xfU2Nyb2xsQmFyOjpTZXRQYWdlU2l6ZShGWF9GTE9BVCBmUGFnZVNpemUpDQotew0KLSAgICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPlNldFBhZ2VTaXplKGZQYWdlU2l6ZSk7DQorRlhfRkxPQVQgSUZXTF9TY3JvbGxCYXI6OkdldFN0ZXBTaXplKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5HZXRTdGVwU2l6ZSgpOw0KIH0NCi1GWF9GTE9BVCBJRldMX1Njcm9sbEJhcjo6R2V0U3RlcFNpemUoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5HZXRTdGVwU2l6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9TY3JvbGxCYXI6OlNldFN0ZXBTaXplKEZYX0ZMT0FUIGZTdGVwU2l6ZSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5TZXRTdGVwU2l6ZShmU3RlcFNpemUpOw0KIH0NCi1GV0xfRVJSIElGV0xfU2Nyb2xsQmFyOjpTZXRTdGVwU2l6ZShGWF9GTE9BVCBmU3RlcFNpemUpDQotew0KLSAgICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPlNldFN0ZXBTaXplKGZTdGVwU2l6ZSk7DQorRlhfRkxPQVQgSUZXTF9TY3JvbGxCYXI6OkdldFBvcygpIHsNCisgIHJldHVybiAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+R2V0UG9zKCk7DQogfQ0KLUZYX0ZMT0FUIElGV0xfU2Nyb2xsQmFyOjpHZXRQb3MoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5HZXRQb3MoKTsNCitGV0xfRVJSIElGV0xfU2Nyb2xsQmFyOjpTZXRQb3MoRlhfRkxPQVQgZlBvcykgew0KKyAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5TZXRQb3MoZlBvcyk7DQogfQ0KLUZXTF9FUlIJSUZXTF9TY3JvbGxCYXI6OlNldFBvcyhGWF9GTE9BVCBmUG9zKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5TZXRQb3MoZlBvcyk7DQorRlhfRkxPQVQgSUZXTF9TY3JvbGxCYXI6OkdldFRyYWNrUG9zKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5HZXRUcmFja1BvcygpOw0KIH0NCi1GWF9GTE9BVCBJRldMX1Njcm9sbEJhcjo6R2V0VHJhY2tQb3MoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5HZXRUcmFja1BvcygpOw0KK0ZXTF9FUlIgSUZXTF9TY3JvbGxCYXI6OlNldFRyYWNrUG9zKEZYX0ZMT0FUIGZUcmFja1Bvcykgew0KKyAgcmV0dXJuICgoQ0ZXTF9TY3JvbGxCYXJJbXAqKW1fcERhdGEpLT5TZXRUcmFja1BvcyhmVHJhY2tQb3MpOw0KIH0NCi1GV0xfRVJSIElGV0xfU2Nyb2xsQmFyOjpTZXRUcmFja1BvcyhGWF9GTE9BVCBmVHJhY2tQb3MpDQotew0KLSAgICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPlNldFRyYWNrUG9zKGZUcmFja1Bvcyk7DQorRlhfQk9PTCBJRldMX1Njcm9sbEJhcjo6RG9TY3JvbGwoRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zKSB7DQorICByZXR1cm4gKChDRldMX1Njcm9sbEJhckltcCopbV9wRGF0YSktPkRvU2Nyb2xsKGR3Q29kZSwgZlBvcyk7DQogfQ0KLUZYX0JPT0wgSUZXTF9TY3JvbGxCYXI6OkRvU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcykNCi17DQotICAgIHJldHVybiAoKENGV0xfU2Nyb2xsQmFySW1wKiltX3BEYXRhKS0+RG9TY3JvbGwoZHdDb2RlLCBmUG9zKTsNCitDRldMX1Njcm9sbEJhckltcDo6Q0ZXTF9TY3JvbGxCYXJJbXAoSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwT3V0ZXIpLA0KKyAgICAgIG1faFRpbWVyKE5VTEwpLA0KKyAgICAgIG1fZlJhbmdlTWluKDApLA0KKyAgICAgIG1fZlJhbmdlTWF4KC0xKSwNCisgICAgICBtX2ZQYWdlU2l6ZSgwKSwNCisgICAgICBtX2ZTdGVwU2l6ZSgwKSwNCisgICAgICBtX2ZQb3MoMCksDQorICAgICAgbV9mVHJhY2tQb3MoMCksDQorICAgICAgbV9pTWluQnV0dG9uU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKSwNCisgICAgICBtX2lNYXhCdXR0b25TdGF0ZShGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWwpLA0KKyAgICAgIG1faVRodW1iQnV0dG9uU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKSwNCisgICAgICBtX2ZMYXN0VHJhY2tQb3MoMCksDQorICAgICAgbV9jcFRyYWNrUG9pbnRYKDApLA0KKyAgICAgIG1fY3BUcmFja1BvaW50WSgwKSwNCisgICAgICBtX2lNaW5UcmFja1N0YXRlKEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbCksDQorICAgICAgbV9pTWF4VHJhY2tTdGF0ZShGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWwpLA0KKyAgICAgIG1faU1vdXNlV2hlZWwoMCksDQorICAgICAgbV9iVHJhY2tNb3VzZUxlYXZlKEZBTFNFKSwNCisgICAgICBtX2JNb3VzZUhvdmVyKEZBTFNFKSwNCisgICAgICBtX2JSZXBhaW50VGh1bWIoRkFMU0UpLA0KKyAgICAgIG1fYk1vdXNlRG93bihGQUxTRSksDQorICAgICAgbV9mQnV0dG9uTGVuKDApLA0KKyAgICAgIG1fYk1pblNpemUoRkFMU0UpLA0KKyAgICAgIG1fYkN1c3RvbUxheW91dChGQUxTRSksDQorICAgICAgbV9mTWluVGh1bWIoRldMX1NDUk9MTEJBUl9NaW5UaHVtYikgew0KKyAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgbV9ydFRodW1iLlJlc2V0KCk7DQorICBtX3J0TWluQnRuLlJlc2V0KCk7DQorICBtX3J0TWF4QnRuLlJlc2V0KCk7DQorICBtX3J0TWluVHJhY2suUmVzZXQoKTsNCisgIG1fcnRNYXhUcmFjay5SZXNldCgpOw0KIH0NCi1DRldMX1Njcm9sbEJhckltcDo6Q0ZXTF9TY3JvbGxCYXJJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciApDQotICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKQ0KLSAgICAsIG1faFRpbWVyKE5VTEwpDQotICAgICwgbV9mUmFuZ2VNaW4oMCkNCi0gICAgLCBtX2ZSYW5nZU1heCgtMSkNCi0gICAgLCBtX2ZQYWdlU2l6ZSgwKQ0KLSAgICAsIG1fZlN0ZXBTaXplKDApDQotICAgICwgbV9mUG9zKDApDQotICAgICwgbV9mVHJhY2tQb3MoMCkNCi0gICAgLCBtX2lNaW5CdXR0b25TdGF0ZShGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWwpDQotICAgICwgbV9pTWF4QnV0dG9uU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KLSAgICAsIG1faVRodW1iQnV0dG9uU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KLSAgICAsIG1fZkxhc3RUcmFja1BvcygwKQ0KLSAgICAsIG1fY3BUcmFja1BvaW50WCgwKQ0KLSAgICAsIG1fY3BUcmFja1BvaW50WSgwKQ0KLSAgICAsIG1faU1pblRyYWNrU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KLSAgICAsIG1faU1heFRyYWNrU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KLSAgICAsIG1faU1vdXNlV2hlZWwoMCkNCi0gICAgLCBtX2JUcmFja01vdXNlTGVhdmUoRkFMU0UpDQotICAgICwgbV9iTW91c2VIb3ZlcihGQUxTRSkNCi0gICAgLCBtX2JSZXBhaW50VGh1bWIoRkFMU0UpDQotICAgICwgbV9iTW91c2VEb3duKEZBTFNFKQ0KLSAgICAsIG1fZkJ1dHRvbkxlbigwKQ0KLSAgICAsIG1fYk1pblNpemUoRkFMU0UpDQotICAgICwgbV9iQ3VzdG9tTGF5b3V0KEZBTFNFKQ0KLSAgICAsIG1fZk1pblRodW1iKEZXTF9TQ1JPTExCQVJfTWluVGh1bWIpDQotew0KLSAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQotICAgIG1fcnRUaHVtYi5SZXNldCgpOw0KLSAgICBtX3J0TWluQnRuLlJlc2V0KCk7DQotICAgIG1fcnRNYXhCdG4uUmVzZXQoKTsNCi0gICAgbV9ydE1pblRyYWNrLlJlc2V0KCk7DQotICAgIG1fcnRNYXhUcmFjay5SZXNldCgpOw0KK0NGV0xfU2Nyb2xsQmFySW1wOjpDRldMX1Njcm9sbEJhckltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX2hUaW1lcihOVUxMKSwNCisgICAgICBtX2ZSYW5nZU1pbigwKSwNCisgICAgICBtX2ZSYW5nZU1heCgtMSksDQorICAgICAgbV9mUGFnZVNpemUoMCksDQorICAgICAgbV9mU3RlcFNpemUoMCksDQorICAgICAgbV9mUG9zKDApLA0KKyAgICAgIG1fZlRyYWNrUG9zKDApLA0KKyAgICAgIG1faU1pbkJ1dHRvblN0YXRlKEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbCksDQorICAgICAgbV9pTWF4QnV0dG9uU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKSwNCisgICAgICBtX2lUaHVtYkJ1dHRvblN0YXRlKEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbCksDQorICAgICAgbV9mTGFzdFRyYWNrUG9zKDApLA0KKyAgICAgIG1fY3BUcmFja1BvaW50WCgwKSwNCisgICAgICBtX2NwVHJhY2tQb2ludFkoMCksDQorICAgICAgbV9pTWluVHJhY2tTdGF0ZShGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWwpLA0KKyAgICAgIG1faU1heFRyYWNrU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKSwNCisgICAgICBtX2lNb3VzZVdoZWVsKDApLA0KKyAgICAgIG1fYlRyYWNrTW91c2VMZWF2ZShGQUxTRSksDQorICAgICAgbV9iTW91c2VIb3ZlcihGQUxTRSksDQorICAgICAgbV9iUmVwYWludFRodW1iKEZBTFNFKSwNCisgICAgICBtX2JNb3VzZURvd24oRkFMU0UpLA0KKyAgICAgIG1fZkJ1dHRvbkxlbigwKSwNCisgICAgICBtX2JNaW5TaXplKEZBTFNFKSwNCisgICAgICBtX2JDdXN0b21MYXlvdXQoRkFMU0UpLA0KKyAgICAgIG1fZk1pblRodW1iKEZXTF9TQ1JPTExCQVJfTWluVGh1bWIpIHsNCisgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgIG1fcnRUaHVtYi5SZXNldCgpOw0KKyAgbV9ydE1pbkJ0bi5SZXNldCgpOw0KKyAgbV9ydE1heEJ0bi5SZXNldCgpOw0KKyAgbV9ydE1pblRyYWNrLlJlc2V0KCk7DQorICBtX3J0TWF4VHJhY2suUmVzZXQoKTsNCiB9DQotQ0ZXTF9TY3JvbGxCYXJJbXA6OkNGV0xfU2Nyb2xsQmFySW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQqIHBPdXRlciApDQotICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KLSAgICAsIG1faFRpbWVyKE5VTEwpDQotICAgICwgbV9mUmFuZ2VNaW4oMCkNCi0gICAgLCBtX2ZSYW5nZU1heCgtMSkNCi0gICAgLCBtX2ZQYWdlU2l6ZSgwKQ0KLSAgICAsIG1fZlN0ZXBTaXplKDApDQotICAgICwgbV9mUG9zKDApDQotICAgICwgbV9mVHJhY2tQb3MoMCkNCi0gICAgLCBtX2lNaW5CdXR0b25TdGF0ZShGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWwpDQotICAgICwgbV9pTWF4QnV0dG9uU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KLSAgICAsIG1faVRodW1iQnV0dG9uU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KLSAgICAsIG1fZkxhc3RUcmFja1BvcygwKQ0KLSAgICAsIG1fY3BUcmFja1BvaW50WCgwKQ0KLSAgICAsIG1fY3BUcmFja1BvaW50WSgwKQ0KLSAgICAsIG1faU1pblRyYWNrU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KLSAgICAsIG1faU1heFRyYWNrU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKQ0KLSAgICAsIG1faU1vdXNlV2hlZWwoMCkNCi0gICAgLCBtX2JUcmFja01vdXNlTGVhdmUoRkFMU0UpDQotICAgICwgbV9iTW91c2VIb3ZlcihGQUxTRSkNCi0gICAgLCBtX2JSZXBhaW50VGh1bWIoRkFMU0UpDQotICAgICwgbV9iTW91c2VEb3duKEZBTFNFKQ0KLSAgICAsIG1fZkJ1dHRvbkxlbigwKQ0KLSAgICAsIG1fYk1pblNpemUoRkFMU0UpDQotICAgICwgbV9iQ3VzdG9tTGF5b3V0KEZBTFNFKQ0KLSAgICAsIG1fZk1pblRodW1iKEZXTF9TQ1JPTExCQVJfTWluVGh1bWIpDQotew0KLSAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQotICAgIG1fcnRUaHVtYi5SZXNldCgpOw0KLSAgICBtX3J0TWluQnRuLlJlc2V0KCk7DQotICAgIG1fcnRNYXhCdG4uUmVzZXQoKTsNCi0gICAgbV9ydE1pblRyYWNrLlJlc2V0KCk7DQotICAgIG1fcnRNYXhUcmFjay5SZXNldCgpOw0KK0NGV0xfU2Nyb2xsQmFySW1wOjp+Q0ZXTF9TY3JvbGxCYXJJbXAoKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19TY3JvbGxCYXI7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUNGV0xfU2Nyb2xsQmFySW1wOjp+Q0ZXTF9TY3JvbGxCYXJJbXAoKQ0KLXsNCitGWF9EV09SRCBDRldMX1Njcm9sbEJhckltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBGV0xfQ0xBU1NIQVNIX1Njcm9sbEJhcjsNCiB9DQotRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgd3NDbGFzcyA9IEZXTF9DTEFTU19TY3JvbGxCYXI7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpJbml0aWFsaXplKCkgew0KKyAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRFdPUkQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldENsYXNzSUQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfU2Nyb2xsQmFyOw0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OkZpbmFsaXplKCkgew0KKyAgaWYgKG1fcERlbGVnYXRlKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQorICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCiB9DQotRldMX0VSUglDRldMX1Njcm9sbEJhckltcDo6SW5pdGlhbGl6ZSgpDQotew0KLSAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZSh0aGlzKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpGaW5hbGl6ZSgpDQotew0KLSAgICBpZiAoIG1fcERlbGVnYXRlKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KLSAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCi19DQotRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCi17DQotICAgIGlmIChiQXV0b1NpemUpIHsNCi0gICAgICAgIHJlY3QuU2V0KDAsIDAsIDAsIDApOw0KLSAgICAgICAgRlhfRkxPQVQgKnBmTWluV2lkdGggPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKTsNCi0gICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGZNaW5XaWR0aCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCi0gICAgICAgICAgICByZWN0LlNldCgwLCAwLCAoKnBmTWluV2lkdGgpLCAoKnBmTWluV2lkdGgpICogMyk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJlY3QuU2V0KDAsIDAsICgqcGZNaW5XaWR0aCkgKiAzLCAoKnBmTWluV2lkdGgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgRlhfRkxPQVQqIHBmTWluV2lkdGggPQ0KKyAgICAgICAgKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGZNaW5XaWR0aCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgICAgaWYgKElzVmVydGljYWwoKSkgew0KKyAgICAgIHJlY3QuU2V0KDAsIDAsICgqcGZNaW5XaWR0aCksICgqcGZNaW5XaWR0aCkgKiAzKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICAgIHJlY3QuU2V0KDAsIDAsICgqcGZNaW5XaWR0aCkgKiAzLCAoKnBmTWluV2lkdGgpKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlVwZGF0ZSgpDQotew0KLSAgICBpZiAoSXNMb2NrZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCi0gICAgfQ0KLSAgICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCi0gICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KLSAgICB9DQotICAgIExheW91dCgpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6VXBkYXRlKCkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIH0NCisgIExheW91dCgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCi0gICAgaWYgKEhhc0JvcmRlcigpKSB7DQotICAgICAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgRldMX1BBUlRfU0NCX0JvcmRlciwgcFRoZW1lLCBwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBpZiAoSGFzRWRnZSgpKSB7DQotICAgICAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX1NDQl9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIERyYXdUcmFjayhwR3JhcGhpY3MsIHBUaGVtZSwgVFJVRSwgcE1hdHJpeCk7DQotICAgIERyYXdUcmFjayhwR3JhcGhpY3MsIHBUaGVtZSwgRkFMU0UsIHBNYXRyaXgpOw0KLSAgICBEcmF3QXJyb3dCdG4ocEdyYXBoaWNzLCBwVGhlbWUsIFRSVUUsIHBNYXRyaXgpOw0KLSAgICBEcmF3QXJyb3dCdG4ocEdyYXBoaWNzLCBwVGhlbWUsIEZBTFNFLCBwTWF0cml4KTsNCi0gICAgRHJhd1RodW1iKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgRldMX1BBUlRfU0NCX0JvcmRlciwgcFRoZW1lLCBwTWF0cml4KTsNCisgIH0NCisgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgRHJhd0VkZ2UocEdyYXBoaWNzLCBGV0xfUEFSVF9TQ0JfRWRnZSwgcFRoZW1lLCBwTWF0cml4KTsNCisgIH0NCisgIERyYXdUcmFjayhwR3JhcGhpY3MsIHBUaGVtZSwgVFJVRSwgcE1hdHJpeCk7DQorICBEcmF3VHJhY2socEdyYXBoaWNzLCBwVGhlbWUsIEZBTFNFLCBwTWF0cml4KTsNCisgIERyYXdBcnJvd0J0bihwR3JhcGhpY3MsIHBUaGVtZSwgVFJVRSwgcE1hdHJpeCk7DQorICBEcmF3QXJyb3dCdG4ocEdyYXBoaWNzLCBwVGhlbWUsIEZBTFNFLCBwTWF0cml4KTsNCisgIERyYXdUaHVtYihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLWlubGluZSBGWF9CT09MIENGV0xfU2Nyb2xsQmFySW1wOjpJc1ZlcnRpY2FsKCkNCi17DQotICAgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX1NDQl9WZXJ0Ow0KK2lubGluZSBGWF9CT09MIENGV0xfU2Nyb2xsQmFySW1wOjpJc1ZlcnRpY2FsKCkgew0KKyAgcmV0dXJuIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfU0NCX1ZlcnQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldFJhbmdlKEZYX0ZMT0FUICZmTWluLCBGWF9GTE9BVCAmZk1heCkNCi17DQotICAgIGZNaW4gPSBtX2ZSYW5nZU1pbjsNCi0gICAgZk1heCA9IG1fZlJhbmdlTWF4Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6R2V0UmFuZ2UoRlhfRkxPQVQmIGZNaW4sIEZYX0ZMT0FUJiBmTWF4KSB7DQorICBmTWluID0gbV9mUmFuZ2VNaW47DQorICBmTWF4ID0gbV9mUmFuZ2VNYXg7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNldFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgpDQotew0KLSAgICBtX2ZSYW5nZU1pbiA9IGZNaW47DQotICAgIG1fZlJhbmdlTWF4ID0gZk1heDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNldFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgpIHsNCisgIG1fZlJhbmdlTWluID0gZk1pbjsNCisgIG1fZlJhbmdlTWF4ID0gZk1heDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldFBhZ2VTaXplKCkNCi17DQotICAgIHJldHVybiBtX2ZQYWdlU2l6ZTsNCitGWF9GTE9BVCBDRldMX1Njcm9sbEJhckltcDo6R2V0UGFnZVNpemUoKSB7DQorICByZXR1cm4gbV9mUGFnZVNpemU7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSkNCi17DQotICAgIG1fZlBhZ2VTaXplID0gZlBhZ2VTaXplOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6U2V0UGFnZVNpemUoRlhfRkxPQVQgZlBhZ2VTaXplKSB7DQorICBtX2ZQYWdlU2l6ZSA9IGZQYWdlU2l6ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldFN0ZXBTaXplKCkNCi17DQotICAgIHJldHVybiBtX2ZTdGVwU2l6ZTsNCitGWF9GTE9BVCBDRldMX1Njcm9sbEJhckltcDo6R2V0U3RlcFNpemUoKSB7DQorICByZXR1cm4gbV9mU3RlcFNpemU7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNldFN0ZXBTaXplKEZYX0ZMT0FUIGZTdGVwU2l6ZSkNCi17DQotICAgIG1fZlN0ZXBTaXplID0gZlN0ZXBTaXplOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6U2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKSB7DQorICBtX2ZTdGVwU2l6ZSA9IGZTdGVwU2l6ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldFBvcygpDQotew0KLSAgICByZXR1cm4gbV9mUG9zOw0KK0ZYX0ZMT0FUIENGV0xfU2Nyb2xsQmFySW1wOjpHZXRQb3MoKSB7DQorICByZXR1cm4gbV9mUG9zOw0KIH0NCi1GV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpTZXRQb3MoRlhfRkxPQVQgZlBvcykNCi17DQotICAgIG1fZlBvcyA9IGZQb3M7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpTZXRQb3MoRlhfRkxPQVQgZlBvcykgew0KKyAgbV9mUG9zID0gZlBvczsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldFRyYWNrUG9zKCkNCi17DQotICAgIHJldHVybiBtX2ZUcmFja1BvczsNCitGWF9GTE9BVCBDRldMX1Njcm9sbEJhckltcDo6R2V0VHJhY2tQb3MoKSB7DQorICByZXR1cm4gbV9mVHJhY2tQb3M7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNldFRyYWNrUG9zKEZYX0ZMT0FUIGZUcmFja1BvcykNCi17DQotICAgIG1fZlRyYWNrUG9zID0gZlRyYWNrUG9zOw0KLSAgICBDYWxjVGh1bWJCdXR0b25SZWN0KG1fcnRUaHVtYik7DQotICAgIENhbGNNaW5UcmFja1JlY3QobV9ydE1pblRyYWNrKTsNCi0gICAgQ2FsY01heFRyYWNrUmVjdChtX3J0TWF4VHJhY2spOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6U2V0VHJhY2tQb3MoRlhfRkxPQVQgZlRyYWNrUG9zKSB7DQorICBtX2ZUcmFja1BvcyA9IGZUcmFja1BvczsNCisgIENhbGNUaHVtYkJ1dHRvblJlY3QobV9ydFRodW1iKTsNCisgIENhbGNNaW5UcmFja1JlY3QobV9ydE1pblRyYWNrKTsNCisgIENhbGNNYXhUcmFja1JlY3QobV9ydE1heFRyYWNrKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfQk9PTCBDRldMX1Njcm9sbEJhckltcDo6RG9TY3JvbGwoRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zICkNCi17DQotICAgIHN3aXRjaCAoZHdDb2RlKSB7DQotICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX01pbjoNCi0gICAgICAgIGNhc2UgRldMX1NDQkNPREVfTWF4Og0KLSAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9QYWdlQmFja3dhcmQ6DQotICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1BhZ2VGb3J3YXJkOg0KLSAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9TdGVwQmFja3dhcmQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1N0ZXBGb3J3YXJkOg0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9Qb3M6DQotICAgICAgICBjYXNlIEZXTF9TQ0JDT0RFX1RyYWNrUG9zOg0KLSAgICAgICAgY2FzZSBGV0xfU0NCQ09ERV9FbmRTY3JvbGw6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIE9uU2Nyb2xsKGR3Q29kZSwgZlBvcyk7DQorRlhfQk9PTCBDRldMX1Njcm9sbEJhckltcDo6RG9TY3JvbGwoRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zKSB7DQorICBzd2l0Y2ggKGR3Q29kZSkgew0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX01pbjoNCisgICAgY2FzZSBGV0xfU0NCQ09ERV9NYXg6DQorICAgIGNhc2UgRldMX1NDQkNPREVfUGFnZUJhY2t3YXJkOg0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX1BhZ2VGb3J3YXJkOg0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX1N0ZXBCYWNrd2FyZDoNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGV0xfU0NCQ09ERV9TdGVwRm9yd2FyZDoNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGV0xfU0NCQ09ERV9Qb3M6DQorICAgIGNhc2UgRldMX1NDQkNPREVfVHJhY2tQb3M6DQorICAgIGNhc2UgRldMX1NDQkNPREVfRW5kU2Nyb2xsOg0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGQUxTRTsgfQ0KKyAgfQ0KKyAgcmV0dXJuIE9uU2Nyb2xsKGR3Q29kZSwgZlBvcyk7DQogfQ0KLWludDMyX3QgQ0ZXTF9TY3JvbGxCYXJJbXA6OlJ1bihGV0xfSFRJTUVSIGhUaW1lcikNCi17DQotICAgIGlmIChtX2hUaW1lcikgew0KLSAgICAgICAgRldMX1N0b3BUaW1lcihtX2hUaW1lcik7DQotICAgIH0NCi0gICAgaWYgKCFTZW5kRXZlbnQoKSkgew0KLSAgICAgICAgbV9oVGltZXIgPSBGV0xfU3RhcnRUaW1lcih0aGlzLCAwKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gMTsNCitpbnQzMl90IENGV0xfU2Nyb2xsQmFySW1wOjpSdW4oRldMX0hUSU1FUiBoVGltZXIpIHsNCisgIGlmIChtX2hUaW1lcikgew0KKyAgICBGV0xfU3RvcFRpbWVyKG1faFRpbWVyKTsNCisgIH0NCisgIGlmICghU2VuZEV2ZW50KCkpIHsNCisgICAgbV9oVGltZXIgPSBGV0xfU3RhcnRUaW1lcih0aGlzLCAwKTsNCisgIH0NCisgIHJldHVybiAxOw0KIH0NCi1GV0xfRVJSCUNGV0xfU2Nyb2xsQmFySW1wOjpTZXRPdXRlcihJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wT3V0ZXIgPSBwT3V0ZXI7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpTZXRPdXRlcihJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BPdXRlciA9IHBPdXRlcjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotdm9pZCBDRldMX1Njcm9sbEJhckltcDo6RHJhd1RyYWNrKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgRlhfQk9PTCBiTG93ZXIgLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KLSAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHBhcmFtLm1faVBhcnQgPSBiTG93ZXIgPyBGV0xfUEFSVF9TQ0JfTG93ZXJUcmFjayA6IEZXTF9QQVJUX1NDQl9VcHBlclRyYWNrOw0KLSAgICBwYXJhbS5tX2R3U3RhdGVzID0gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpID8NCi0gICAgICAgICAgICAgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfU0NCX0Rpc2FibGVkIDogKGJMb3dlciA/IG1faU1pblRyYWNrU3RhdGUgOiBtX2lNYXhUcmFja1N0YXRlKTsNCi0gICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgIHBhcmFtLm1fcnRQYXJ0ID0gYkxvd2VyID8gbV9ydE1pblRyYWNrIDogbV9ydE1heFRyYWNrOw0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkRyYXdUcmFjayhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvd2VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtLm1faVBhcnQgPSBiTG93ZXIgPyBGV0xfUEFSVF9TQ0JfTG93ZXJUcmFjayA6IEZXTF9QQVJUX1NDQl9VcHBlclRyYWNrOw0KKyAgcGFyYW0ubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEZXTF9QQVJUU1RBVEVfU0NCX0Rpc2FibGVkDQorICAgICAgICAgICAgICAgICAgICAgICAgIDogKGJMb3dlciA/IG1faU1pblRyYWNrU3RhdGUgOiBtX2lNYXhUcmFja1N0YXRlKTsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIHBhcmFtLm1fcnRQYXJ0ID0gYkxvd2VyID8gbV9ydE1pblRyYWNrIDogbV9ydE1heFRyYWNrOw0KKyAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpEcmF3QXJyb3dCdG4oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNaW5CdG4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IGJNaW5CdG4gPyBGV0xfUEFSVF9TQ0JfRm9yZUFycm93IDogRldMX1BBUlRfU0NCX0JhY2tBcnJvdzsNCisgIHBhcmFtLm1fZHdTdGF0ZXMgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBGV0xfUEFSVFNUQVRFX1NDQl9EaXNhYmxlZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICA6IChiTWluQnRuID8gbV9pTWluQnV0dG9uU3RhdGUgOiBtX2lNYXhCdXR0b25TdGF0ZSk7DQorICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICBwYXJhbS5tX3J0UGFydCA9IGJNaW5CdG4gPyBtX3J0TWluQnRuIDogbV9ydE1heEJ0bjsNCisgIGlmIChwYXJhbS5tX3J0UGFydC5oZWlnaHQgPiAwICYmIHBhcmFtLm1fcnRQYXJ0LndpZHRoID4gMCkgew0KICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICB9DQogfQ0KLXZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkRyYXdBcnJvd0J0bihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIEZYX0JPT0wgYk1pbkJ0biAsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQotICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgcGFyYW0ubV9pUGFydCA9IGJNaW5CdG4gPyBGV0xfUEFSVF9TQ0JfRm9yZUFycm93IDogRldMX1BBUlRfU0NCX0JhY2tBcnJvdzsNCi0gICAgcGFyYW0ubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA/DQotICAgICAgICAgICAgICAgICAgICAgICBGV0xfUEFSVFNUQVRFX1NDQl9EaXNhYmxlZCA6IChiTWluQnRuID8gbV9pTWluQnV0dG9uU3RhdGUgOiBtX2lNYXhCdXR0b25TdGF0ZSk7DQotICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICBwYXJhbS5tX3J0UGFydCA9IGJNaW5CdG4gPyBtX3J0TWluQnRuIDogbV9ydE1heEJ0bjsNCi0gICAgaWYgKHBhcmFtLm1fcnRQYXJ0LmhlaWdodCA+IDAgJiYgcGFyYW0ubV9ydFBhcnQud2lkdGggPiAwKSB7DQotICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgIH0NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpEcmF3VGh1bWIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoIUlzRW5hYmxlZCgpKSB7DQorICB9DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9TQ0JfVGh1bWI7DQorICBwYXJhbS5tX2R3U3RhdGVzID0gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMX1BBUlRTVEFURV9TQ0JfRGlzYWJsZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX2lUaHVtYkJ1dHRvblN0YXRlOw0KKyAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0VGh1bWI7DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQogfQ0KLXZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkRyYXdUaHVtYihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgaWYgKCFJc0VuYWJsZWQoKSkgew0KLSAgICB9DQotICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KLSAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9TQ0JfVGh1bWI7DQotICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgPw0KLSAgICAgICAgICAgICAgICAgICAgICAgRldMX1BBUlRTVEFURV9TQ0JfRGlzYWJsZWQgOiBtX2lUaHVtYkJ1dHRvblN0YXRlOw0KLSAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0VGh1bWI7DQotICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpMYXlvdXQoKSB7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KKyAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBtX2ZNaW5UaHVtYiA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9DQVBBQ0lUWV9TQ0JfU2l6ZSk7DQorICBtX2JDdXN0b21MYXlvdXQgPSBwVGhlbWUtPklzQ3VzdG9taXplZExheW91dChtX3BJbnRlcmZhY2UpOw0KKyAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgIENhbGNCdXR0b25MZW4oKTsNCisgIENhbGNNaW5CdXR0b25SZWN0KG1fcnRNaW5CdG4pOw0KKyAgQ2FsY01heEJ1dHRvblJlY3QobV9ydE1heEJ0bik7DQorICBDYWxjVGh1bWJCdXR0b25SZWN0KG1fcnRUaHVtYik7DQorICBDYWxjTWluVHJhY2tSZWN0KG1fcnRNaW5UcmFjayk7DQorICBDYWxjTWF4VHJhY2tSZWN0KG1fcnRNYXhUcmFjayk7DQogfQ0KLXZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkxheW91dCgpDQotew0KLSAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7DQotICAgIHBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBtX2ZNaW5UaHVtYiA9ICooRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9DQVBBQ0lUWV9TQ0JfU2l6ZSk7DQotICAgIG1fYkN1c3RvbUxheW91dCA9IHBUaGVtZS0+SXNDdXN0b21pemVkTGF5b3V0KG1fcEludGVyZmFjZSk7DQotICAgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQotICAgIENhbGNCdXR0b25MZW4oKTsNCi0gICAgQ2FsY01pbkJ1dHRvblJlY3QobV9ydE1pbkJ0bik7DQotICAgIENhbGNNYXhCdXR0b25SZWN0KG1fcnRNYXhCdG4pOw0KLSAgICBDYWxjVGh1bWJCdXR0b25SZWN0KG1fcnRUaHVtYik7DQotICAgIENhbGNNaW5UcmFja1JlY3QobV9ydE1pblRyYWNrKTsNCi0gICAgQ2FsY01heFRyYWNrUmVjdChtX3J0TWF4VHJhY2spOw0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkNhbGNCdXR0b25MZW4oKSB7DQorICBtX2ZCdXR0b25MZW4gPSBJc1ZlcnRpY2FsKCkgPyBtX3J0Q2xpZW50LndpZHRoIDogbV9ydENsaWVudC5oZWlnaHQ7DQorICBGWF9GTE9BVCBmTGVuZ3RoID0gSXNWZXJ0aWNhbCgpID8gbV9ydENsaWVudC5oZWlnaHQgOiBtX3J0Q2xpZW50LndpZHRoOw0KKyAgaWYgKGZMZW5ndGggPCBtX2ZCdXR0b25MZW4gKiAyKSB7DQorICAgIG1fZkJ1dHRvbkxlbiA9IGZMZW5ndGggLyAyOw0KKyAgICBtX2JNaW5TaXplID0gVFJVRTsNCisgIH0gZWxzZSB7DQorICAgIG1fYk1pblNpemUgPSBGQUxTRTsNCisgIH0NCiB9DQotdm9pZCBDRldMX1Njcm9sbEJhckltcDo6Q2FsY0J1dHRvbkxlbigpDQotew0KLSAgICBtX2ZCdXR0b25MZW4gPSBJc1ZlcnRpY2FsKCkgPyBtX3J0Q2xpZW50LndpZHRoIDogbV9ydENsaWVudC5oZWlnaHQ7DQotICAgIEZYX0ZMT0FUIGZMZW5ndGggPSBJc1ZlcnRpY2FsKCkgPyBtX3J0Q2xpZW50LmhlaWdodCA6IG1fcnRDbGllbnQud2lkdGg7DQotICAgIGlmIChmTGVuZ3RoIDwgbV9mQnV0dG9uTGVuICogMikgew0KLSAgICAgICAgbV9mQnV0dG9uTGVuID0gZkxlbmd0aCAvIDI7DQotICAgICAgICBtX2JNaW5TaXplID0gVFJVRTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1fYk1pblNpemUgPSBGQUxTRTsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpDYWxjTWluQnV0dG9uUmVjdChDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBpZiAobV9iQ3VzdG9tTGF5b3V0KSB7DQotICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgICAgICBDRldMX1RoZW1lUGFydCBwUGFydDsNCi0gICAgICAgIHBQYXJ0Lm1fcnRQYXJ0ID0gbV9ydE1pbkJ0bjsNCi0gICAgICAgIHBQYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgIHBQYXJ0Lm1faVBhcnQgPSBGV0xfUEFSVF9TQ0JfRm9yZUFycm93Ow0KLSAgICAgICAgcFBhcnQubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA/IEZXTF9QQVJUU1RBVEVfU0NCX0Rpc2FibGVkIDogbV9pTWluQnV0dG9uU3RhdGU7DQotICAgICAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwUGFydCwgcmVjdCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICByZWN0LmxlZnQgPSBtX3J0Q2xpZW50LmxlZnQ7DQotICAgICAgICByZWN0LnRvcCA9IG1fcnRDbGllbnQudG9wOw0KLSAgICAgICAgcmVjdC53aWR0aCA9IElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQud2lkdGggOiBtX2ZCdXR0b25MZW47DQotICAgICAgICByZWN0LmhlaWdodCA9IElzVmVydGljYWwoKSA/IG1fZkJ1dHRvbkxlbiA6IG1fcnRDbGllbnQuaGVpZ2h0Ow0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkNhbGNNYXhCdXR0b25SZWN0KENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIGlmIChtX2JDdXN0b21MYXlvdXQpIHsNCi0gICAgICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCi0gICAgICAgIENGV0xfVGhlbWVQYXJ0IHBQYXJ0Ow0KLSAgICAgICAgcFBhcnQubV9ydFBhcnQgPSBtX3J0TWF4QnRuOw0KLSAgICAgICAgcFBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICAgICAgcFBhcnQubV9pUGFydCA9IEZXTF9QQVJUX1NDQl9CYWNrQXJyb3c7DQotICAgICAgICBwUGFydC5tX2R3U3RhdGVzID0gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpID8gRldMX1BBUlRTVEFURV9TQ0JfRGlzYWJsZWQgOiBtX2lNYXhCdXR0b25TdGF0ZTsNCi0gICAgICAgIHBUaGVtZS0+R2V0UGFydFJlY3QoJnBQYXJ0LCByZWN0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJlY3QubGVmdCA9IElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQubGVmdCA6IG1fcnRDbGllbnQucmlnaHQoKSAtIG1fZkJ1dHRvbkxlbjsNCi0gICAgICAgIHJlY3QudG9wID0gSXNWZXJ0aWNhbCgpID8gbV9ydENsaWVudC5ib3R0b20oKSAtIG1fZkJ1dHRvbkxlbiA6IG1fcnRDbGllbnQudG9wOw0KLSAgICAgICAgcmVjdC53aWR0aCA9IElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQud2lkdGggOiBtX2ZCdXR0b25MZW47DQotICAgICAgICByZWN0LmhlaWdodCA9IElzVmVydGljYWwoKSA/IG1fZkJ1dHRvbkxlbiA6IG1fcnRDbGllbnQuaGVpZ2h0Ow0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkNhbGNUaHVtYkJ1dHRvblJlY3QoQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgaWYgKCFJc0VuYWJsZWQoKSkgew0KLSAgICAgICAgbV9ydFRodW1iLlJlc2V0KCk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1fYk1pblNpemUpIHsNCi0gICAgICAgIG1fcnRUaHVtYi5FbXB0eSgpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZSYW5nZSA9IG1fZlJhbmdlTWF4IC0gbV9mUmFuZ2VNaW47DQotICAgIG1lbXNldCgmcmVjdCwgMCwgc2l6ZW9mKENGWF9SZWN0KSk7DQotICAgIGlmIChmUmFuZ2UgPCAwKSB7DQotICAgICAgICBpZiAoSXNWZXJ0aWNhbCgpKSB7DQotICAgICAgICAgICAgcmVjdC5TZXQobV9ydENsaWVudC5sZWZ0LCBtX3J0TWF4QnRuLmJvdHRvbSgpLCBtX3J0Q2xpZW50LndpZHRoLCAwKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmVjdC5TZXQobV9ydE1heEJ0bi5yaWdodCgpLCBtX3J0Q2xpZW50LnRvcCwgMCwgbV9ydENsaWVudC5oZWlnaHQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9SZWN0RiBydENsaWVudCA9IG1fcnRDbGllbnQ7DQotICAgIEZYX0ZMT0FUIGZMZW5ndGggPSBJc1ZlcnRpY2FsKCkgPyBydENsaWVudC5oZWlnaHQgOiBydENsaWVudC53aWR0aDsNCi0gICAgRlhfRkxPQVQgZlNpemUgPSBtX2ZCdXR0b25MZW47DQotICAgIGlmIChtX2JDdXN0b21MYXlvdXQpIHsNCi0gICAgICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCi0gICAgICAgICAgICBmTGVuZ3RoID0gZkxlbmd0aCAtIG1fcnRNaW5CdG4uaGVpZ2h0IC0gbV9ydE1heEJ0bi5oZWlnaHQ7DQotICAgICAgICAgICAgaWYgKGZMZW5ndGggPCBtX3J0TWluQnRuLmhlaWdodCB8fCBmTGVuZ3RoIDwgbV9ydE1heEJ0bi5oZWlnaHQpIHsNCi0gICAgICAgICAgICAgICAgZkxlbmd0aCA9IDAuMGY7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmTGVuZ3RoID0gZkxlbmd0aCAtIG1fcnRNaW5CdG4ud2lkdGggLSBtX3J0TWF4QnRuLndpZHRoOw0KLSAgICAgICAgICAgIGlmIChmTGVuZ3RoIDwgbV9ydE1pbkJ0bi53aWR0aCB8fCBmTGVuZ3RoIDwgbV9ydE1heEJ0bi53aWR0aCkgew0KLSAgICAgICAgICAgICAgICBmTGVuZ3RoID0gMC4wZjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBmTGVuZ3RoIC09IGZTaXplICogMi4wZjsNCi0gICAgICAgIGlmIChmTGVuZ3RoIDwgZlNpemUpIHsNCi0gICAgICAgICAgICBmTGVuZ3RoID0gMC4wZjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmVGh1bWJTaXplID0gZkxlbmd0aCAqIGZMZW5ndGggLyAoZlJhbmdlICsgZkxlbmd0aCk7DQotICAgIGlmIChmVGh1bWJTaXplIDwgbV9mTWluVGh1bWIpIHsNCi0gICAgICAgIGZUaHVtYlNpemUgPSBtX2ZNaW5UaHVtYjsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmRGlmZiA9IGZMZW5ndGggLSBmVGh1bWJTaXplOw0KLSAgICBpZiAoZkRpZmYgPCAwLjBmKSB7DQotICAgICAgICBmRGlmZiA9IDAuMGY7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZlRyYWNrUG9zID0gbV9mVHJhY2tQb3M7DQotICAgIGlmIChmVHJhY2tQb3MgPiBtX2ZSYW5nZU1heCkgew0KLSAgICAgICAgZlRyYWNrUG9zID0gbV9mUmFuZ2VNYXg7DQotICAgIH0NCi0gICAgaWYgKGZUcmFja1BvcyA8IG1fZlJhbmdlTWluKSB7DQotICAgICAgICBmVHJhY2tQb3MgPSBtX2ZSYW5nZU1pbjsNCi0gICAgfQ0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKGZSYW5nZSk7DQotICAgIGlmIChtX2JDdXN0b21MYXlvdXQpIHsNCi0gICAgICAgIEZYX0ZMT0FUIGlQb3MgPSBmRGlmZiAqIChmVHJhY2tQb3MgLSBtX2ZSYW5nZU1pbikgLyBmUmFuZ2U7DQotICAgICAgICByZWN0LmxlZnQgPSBydENsaWVudC5sZWZ0Ow0KLSAgICAgICAgaWYgKCFJc1ZlcnRpY2FsKCkpIHsNCi0gICAgICAgICAgICBpZiAoKG1fcnRNaW5CdG4ucmlnaHQoKSA9PSBtX3J0TWF4QnRuLmxlZnQgJiYgbV9ydE1pbkJ0bi53aWR0aCA+IDAgJiYgbV9ydE1heEJ0bi53aWR0aCA+IDApIHx8ICgwID09IG1fcnRNaW5CdG4ud2lkdGggJiYgMCA9PSBtX3J0TWF4QnRuLndpZHRoKSkgew0KLSAgICAgICAgICAgICAgICByZWN0LmxlZnQgKz0gaVBvczsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICByZWN0LmxlZnQgKz0gbV9ydE1pbkJ0bi5yaWdodCgpICsgaVBvczsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZWN0LnRvcCA9IHJ0Q2xpZW50LnRvcDsNCi0gICAgICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCi0gICAgICAgICAgICBpZiAoKG1fcnRNaW5CdG4uYm90dG9tKCkgPT0gbV9ydE1heEJ0bi50b3AgJiYgbV9ydE1pbkJ0bi5oZWlnaHQgPiAwICYmIG1fcnRNYXhCdG4uaGVpZ2h0ID4gMCkgfHwgKDAgPT0gbV9ydE1pbkJ0bi5oZWlnaHQgJiYgMCA9PSBtX3J0TWF4QnRuLmhlaWdodCkpIHsNCi0gICAgICAgICAgICAgICAgcmVjdC50b3AgKz0gaVBvczsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICByZWN0LnRvcCArPSBtX3J0TWluQnRuLmJvdHRvbSgpICsgaVBvczsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZWN0LndpZHRoID0gSXNWZXJ0aWNhbCgpID8gcnRDbGllbnQud2lkdGggOiBmVGh1bWJTaXplOw0KLSAgICAgICAgcmVjdC5oZWlnaHQgPSBJc1ZlcnRpY2FsKCkgPyBmVGh1bWJTaXplIDogcnRDbGllbnQuaGVpZ2h0Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhfRkxPQVQgaVBvcyA9IGZTaXplICsgZkRpZmYgKiAoZlRyYWNrUG9zIC0gbV9mUmFuZ2VNaW4pIC8gZlJhbmdlOw0KLSAgICAgICAgcmVjdC5sZWZ0ID0gcnRDbGllbnQubGVmdDsNCi0gICAgICAgIGlmICghSXNWZXJ0aWNhbCgpKSB7DQotICAgICAgICAgICAgcmVjdC5sZWZ0ICs9IGlQb3M7DQotICAgICAgICB9DQotICAgICAgICByZWN0LnRvcCA9IHJ0Q2xpZW50LnRvcDsNCi0gICAgICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCi0gICAgICAgICAgICByZWN0LnRvcCArPSBpUG9zOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmVjdC53aWR0aCA9IElzVmVydGljYWwoKSA/IHJ0Q2xpZW50LndpZHRoIDogZlRodW1iU2l6ZTsNCi0gICAgICAgIHJlY3QuaGVpZ2h0ID0gSXNWZXJ0aWNhbCgpID8gZlRodW1iU2l6ZSA6IHJ0Q2xpZW50LmhlaWdodDsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpDYWxjTWluVHJhY2tSZWN0KENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIGlmIChtX2JNaW5TaXplKSB7DQotICAgICAgICByZWN0LkVtcHR5KCk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZkJvdHRvbSA9IG1fcnRUaHVtYi5ib3R0b20oKTsNCi0gICAgRlhfRkxPQVQgZlJpZ2h0ID0gbV9ydFRodW1iLnJpZ2h0KCk7DQotICAgIEZYX0ZMT0FUIGl4ID0gKG1fcnRUaHVtYi5sZWZ0ICsgZlJpZ2h0KSAvIDI7DQotICAgIEZYX0ZMT0FUIGl5ID0gKG1fcnRUaHVtYi50b3AgKyBmQm90dG9tKSAvIDI7DQordm9pZCBDRldMX1Njcm9sbEJhckltcDo6Q2FsY01pbkJ1dHRvblJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBpZiAobV9iQ3VzdG9tTGF5b3V0KSB7DQorICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgQ0ZXTF9UaGVtZVBhcnQgcFBhcnQ7DQorICAgIHBQYXJ0Lm1fcnRQYXJ0ID0gbV9ydE1pbkJ0bjsNCisgICAgcFBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwUGFydC5tX2lQYXJ0ID0gRldMX1BBUlRfU0NCX0ZvcmVBcnJvdzsNCisgICAgcFBhcnQubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMX1BBUlRTVEFURV9TQ0JfRGlzYWJsZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1faU1pbkJ1dHRvblN0YXRlOw0KKyAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwUGFydCwgcmVjdCk7DQorICB9IGVsc2Ugew0KICAgICByZWN0LmxlZnQgPSBtX3J0Q2xpZW50LmxlZnQ7DQogICAgIHJlY3QudG9wID0gbV9ydENsaWVudC50b3A7DQotICAgIEZYX0JPT0wgYlZlcnRpY2FsID0gSXNWZXJ0aWNhbCgpOw0KLSAgICByZWN0LndpZHRoID0gYlZlcnRpY2FsID8gbV9ydENsaWVudC53aWR0aCA6IGl4Ow0KLSAgICByZWN0LmhlaWdodCA9IGJWZXJ0aWNhbCA/IGl5IDogbV9ydENsaWVudC5oZWlnaHQ7DQotICAgIGlmIChtX2JDdXN0b21MYXlvdXQpIHsNCi0gICAgICAgIGlmIChiVmVydGljYWwpIHsNCi0gICAgICAgICAgICBpZiAoMCA9PSBtX3J0TWluQnRuLmhlaWdodCAmJiAwID09IG1fcnRNYXhCdG4uaGVpZ2h0KSB7DQotICAgICAgICAgICAgICAgIHJlY3QudG9wID0gbV9ydENsaWVudC50b3A7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChtX3J0TWluQnRuLnRvcCA8IG1fcnRUaHVtYi50b3ApIHsNCi0gICAgICAgICAgICAgICAgcmVjdC50b3AgPSBtX3J0TWluQnRuLmJvdHRvbSgpOw0KLSAgICAgICAgICAgICAgICByZWN0LmhlaWdodCAtPSAobV9ydE1pbkJ0bi5ib3R0b20oKSAtIG1fcnRDbGllbnQudG9wKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmICgwID09IG1fcnRNaW5CdG4ud2lkdGggJiYgMCA9PSBtX3J0TWF4QnRuLndpZHRoKSB7DQotICAgICAgICAgICAgICAgIHJlY3QubGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fcnRNaW5CdG4ubGVmdCA8IG1fcnRUaHVtYi5sZWZ0KSB7DQotICAgICAgICAgICAgICAgIHJlY3QubGVmdCA9IG1fcnRNaW5CdG4ucmlnaHQoKTsNCi0gICAgICAgICAgICAgICAgcmVjdC53aWR0aCAtPSAobV9ydE1pbkJ0bi5yaWdodCgpIC0gbV9ydENsaWVudC5sZWZ0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCisgICAgcmVjdC53aWR0aCA9IElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQud2lkdGggOiBtX2ZCdXR0b25MZW47DQorICAgIHJlY3QuaGVpZ2h0ID0gSXNWZXJ0aWNhbCgpID8gbV9mQnV0dG9uTGVuIDogbV9ydENsaWVudC5oZWlnaHQ7DQorICB9DQogfQ0KLXZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkNhbGNNYXhUcmFja1JlY3QoQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgaWYgKG1fYk1pblNpemUpIHsNCi0gICAgICAgIHJlY3QuRW1wdHkoKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBpeCA9IChtX3J0VGh1bWIubGVmdCArIG1fcnRUaHVtYi5yaWdodCgpKSAvIDI7DQotICAgIEZYX0ZMT0FUIGl5ID0gKG1fcnRUaHVtYi50b3AgKyBtX3J0VGh1bWIuYm90dG9tKCkpIC8gMjsNCi0gICAgRlhfQk9PTCBiVmVydGljYWwgPSBJc1ZlcnRpY2FsKCk7DQotICAgIHJlY3QubGVmdCA9IGJWZXJ0aWNhbCA/IG1fcnRDbGllbnQubGVmdCA6IGl4Ow0KLSAgICByZWN0LnRvcCA9IGJWZXJ0aWNhbCA/IGl5IDogbV9ydENsaWVudC50b3A7DQotICAgIHJlY3Qud2lkdGggPSBiVmVydGljYWwgPyBtX3J0Q2xpZW50LndpZHRoIDogbV9ydENsaWVudC5yaWdodCgpIC0gaXg7DQotICAgIHJlY3QuaGVpZ2h0ID0gYlZlcnRpY2FsID8gbV9ydENsaWVudC5ib3R0b20oKSAtIGl5IDogbV9ydENsaWVudC5oZWlnaHQ7DQotICAgIGlmIChtX2JDdXN0b21MYXlvdXQpIHsNCi0gICAgICAgIGlmIChiVmVydGljYWwpIHsNCi0gICAgICAgICAgICBpZiAobV9ydE1pbkJ0bi50b3AgPiBtX3J0VGh1bWIudG9wICYmIG1fcnRNaW5CdG4uaGVpZ2h0ID4gMCAmJiBtX3J0TWF4QnRuLmhlaWdodCA+IDApIHsNCi0gICAgICAgICAgICAgICAgcmVjdC5oZWlnaHQgLT0gKG1fcnRDbGllbnQuYm90dG9tKCkgLSBtX3J0TWluQnRuLnRvcCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChtX3J0TWluQnRuLmhlaWdodCA+IDAgJiYgbV9ydE1heEJ0bi5oZWlnaHQgPiAwKSB7DQotICAgICAgICAgICAgICAgIHJlY3QuaGVpZ2h0IC09IChtX3J0Q2xpZW50LmJvdHRvbSgpIC0gbV9ydE1heEJ0bi50b3ApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKG1fcnRNaW5CdG4ubGVmdCA+IG1fcnRUaHVtYi5sZWZ0ICYmIG1fcnRNaW5CdG4ud2lkdGggPiAwICYmIG1fcnRNYXhCdG4ud2lkdGggPiAwKSB7DQotICAgICAgICAgICAgICAgIHJlY3Qud2lkdGggLT0gKG1fcnRDbGllbnQucmlnaHQoKSAtIG1fcnRNaW5CdG4ubGVmdCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChtX3J0TWluQnRuLndpZHRoID4gMCAmJiBtX3J0TWF4QnRuLndpZHRoID4gMCkgew0KLSAgICAgICAgICAgICAgICByZWN0LndpZHRoIC09IChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBtX3J0TWF4QnRuLmxlZnQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkNhbGNNYXhCdXR0b25SZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKG1fYkN1c3RvbUxheW91dCkgew0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIENGV0xfVGhlbWVQYXJ0IHBQYXJ0Ow0KKyAgICBwUGFydC5tX3J0UGFydCA9IG1fcnRNYXhCdG47DQorICAgIHBQYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcFBhcnQubV9pUGFydCA9IEZXTF9QQVJUX1NDQl9CYWNrQXJyb3c7DQorICAgIHBQYXJ0Lm1fZHdTdGF0ZXMgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZXTF9QQVJUU1RBVEVfU0NCX0Rpc2FibGVkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX2lNYXhCdXR0b25TdGF0ZTsNCisgICAgcFRoZW1lLT5HZXRQYXJ0UmVjdCgmcFBhcnQsIHJlY3QpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdC5sZWZ0ID0NCisgICAgICAgIElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQubGVmdCA6IG1fcnRDbGllbnQucmlnaHQoKSAtIG1fZkJ1dHRvbkxlbjsNCisgICAgcmVjdC50b3AgPQ0KKyAgICAgICAgSXNWZXJ0aWNhbCgpID8gbV9ydENsaWVudC5ib3R0b20oKSAtIG1fZkJ1dHRvbkxlbiA6IG1fcnRDbGllbnQudG9wOw0KKyAgICByZWN0LndpZHRoID0gSXNWZXJ0aWNhbCgpID8gbV9ydENsaWVudC53aWR0aCA6IG1fZkJ1dHRvbkxlbjsNCisgICAgcmVjdC5oZWlnaHQgPSBJc1ZlcnRpY2FsKCkgPyBtX2ZCdXR0b25MZW4gOiBtX3J0Q2xpZW50LmhlaWdodDsNCisgIH0NCiB9DQotRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldFRyYWNrUG9pbnRQb3MoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgRlhfRkxPQVQgZkRpZmZYID0gZnggLSBtX2NwVHJhY2tQb2ludFg7DQotICAgIEZYX0ZMT0FUIGZEaWZmWSA9IGZ5IC0gbV9jcFRyYWNrUG9pbnRZOw0KLSAgICBGWF9GTE9BVCBmUmFuZ2UgPSBtX2ZSYW5nZU1heCAtIG1fZlJhbmdlTWluOw0KLSAgICBGWF9GTE9BVCBmUG9zOw0KLSAgICBpZiAobV9iQ3VzdG9tTGF5b3V0KSB7DQotICAgICAgICBpZiAoSXNWZXJ0aWNhbCgpKSB7DQotICAgICAgICAgICAgaWYgKDAgPT0gbV9ydE1pbkJ0bi5oZWlnaHQgJiYgMCA9PSBtX3J0TWF4QnRuLmhlaWdodCkgew0KLSAgICAgICAgICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZZIC8gKG1fcnRDbGllbnQuaGVpZ2h0IC0gbV9ydFRodW1iLmhlaWdodCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChtX3J0TWluQnRuLmJvdHRvbSgpID09IG1fcnRNYXhCdG4udG9wKSB7DQotICAgICAgICAgICAgICAgIGZQb3MgPSBmUmFuZ2UgKiBmRGlmZlkgLyAobV9ydE1pbkJ0bi50b3AgLSBtX3J0Q2xpZW50LnRvcCAtIG1fcnRUaHVtYi5oZWlnaHQpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGZQb3MgPSBmUmFuZ2UgKiBmRGlmZlkgLyAobV9ydE1heEJ0bi50b3AgLSBtX3J0TWluQnRuLmJvdHRvbSgpIC0gbV9ydFRodW1iLmhlaWdodCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoMCA9PSBtX3J0TWluQnRuLndpZHRoICYmIDAgPT0gbV9ydE1heEJ0bi53aWR0aCkgew0KLSAgICAgICAgICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZYIC8gKG1fcnRDbGllbnQud2lkdGggLSBtX3J0VGh1bWIud2lkdGgpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9ydE1pbkJ0bi5yaWdodCgpID09IG1fcnRNYXhCdG4ubGVmdCkgew0KLSAgICAgICAgICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZYIC8gKG1fcnRNaW5CdG4ubGVmdCAtIG1fcnRDbGllbnQubGVmdCAtIG1fcnRUaHVtYi53aWR0aCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZlBvcyA9IGZSYW5nZSAqIGZEaWZmWCAvIChtX3J0TWF4QnRuLmxlZnQgLSBtX3J0TWluQnRuLnJpZ2h0KCkgLSBtX3J0VGh1bWIud2lkdGgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpDYWxjVGh1bWJCdXR0b25SZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKCFJc0VuYWJsZWQoKSkgew0KKyAgICBtX3J0VGh1bWIuUmVzZXQoKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fYk1pblNpemUpIHsNCisgICAgbV9ydFRodW1iLkVtcHR5KCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0ZMT0FUIGZSYW5nZSA9IG1fZlJhbmdlTWF4IC0gbV9mUmFuZ2VNaW47DQorICBtZW1zZXQoJnJlY3QsIDAsIHNpemVvZihDRlhfUmVjdCkpOw0KKyAgaWYgKGZSYW5nZSA8IDApIHsNCisgICAgaWYgKElzVmVydGljYWwoKSkgew0KKyAgICAgIHJlY3QuU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydE1heEJ0bi5ib3R0b20oKSwgbV9ydENsaWVudC53aWR0aCwgMCk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoSXNWZXJ0aWNhbCgpKSB7DQotICAgICAgICAgICAgZlBvcyA9IGZSYW5nZSAqIGZEaWZmWSAvIChtX3J0TWF4QnRuLnRvcCAtIG1fcnRNaW5CdG4uYm90dG9tKCkgLSBtX3J0VGh1bWIuaGVpZ2h0KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZlBvcyA9IGZSYW5nZSAqIGZEaWZmWCAvIChtX3J0TWF4QnRuLmxlZnQgLSBtX3J0TWluQnRuLnJpZ2h0KCkgLSBtX3J0VGh1bWIud2lkdGgpOw0KLSAgICAgICAgfQ0KKyAgICAgIHJlY3QuU2V0KG1fcnRNYXhCdG4ucmlnaHQoKSwgbV9ydENsaWVudC50b3AsIDAsIG1fcnRDbGllbnQuaGVpZ2h0KTsNCiAgICAgfQ0KLSAgICBmUG9zICs9IG1fZkxhc3RUcmFja1BvczsNCi0gICAgaWYgKGZQb3MgPCBtX2ZSYW5nZU1pbikgew0KLSAgICAgICAgZlBvcyA9IG1fZlJhbmdlTWluOw0KLSAgICB9DQotICAgIGlmIChmUG9zID4gbV9mUmFuZ2VNYXgpIHsNCi0gICAgICAgIGZQb3MgPSBtX2ZSYW5nZU1heDsNCi0gICAgfQ0KLSAgICByZXR1cm4gZlBvczsNCi19DQotdm9pZCBDRldMX1Njcm9sbEJhckltcDo6R2V0VHJhY2tSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiTG93ZXIgKQ0KLXsNCi0gICAgRlhfQk9PTCBiRGlzYWJsZWQgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkOw0KLSAgICBpZiAoYkRpc2FibGVkIHx8IG1fYkN1c3RvbUxheW91dCkgew0KLSAgICAgICAgcmVjdCA9IGJMb3dlciA/IG1fcnRNaW5UcmFjayA6IG1fcnRNYXhUcmFjazsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0Q2xpZW50ID0gbV9ydENsaWVudDsNCisgIEZYX0ZMT0FUIGZMZW5ndGggPSBJc1ZlcnRpY2FsKCkgPyBydENsaWVudC5oZWlnaHQgOiBydENsaWVudC53aWR0aDsNCisgIEZYX0ZMT0FUIGZTaXplID0gbV9mQnV0dG9uTGVuOw0KKyAgaWYgKG1fYkN1c3RvbUxheW91dCkgew0KKyAgICBpZiAoSXNWZXJ0aWNhbCgpKSB7DQorICAgICAgZkxlbmd0aCA9IGZMZW5ndGggLSBtX3J0TWluQnRuLmhlaWdodCAtIG1fcnRNYXhCdG4uaGVpZ2h0Ow0KKyAgICAgIGlmIChmTGVuZ3RoIDwgbV9ydE1pbkJ0bi5oZWlnaHQgfHwgZkxlbmd0aCA8IG1fcnRNYXhCdG4uaGVpZ2h0KSB7DQorICAgICAgICBmTGVuZ3RoID0gMC4wZjsNCisgICAgICB9DQogICAgIH0gZWxzZSB7DQotICAgICAgICBGWF9GTE9BVCBmVyA9IG1fcnRUaHVtYi53aWR0aCAvIDI7DQotICAgICAgICBGWF9GTE9BVCBmSCA9IG1fcnRUaHVtYi5oZWlnaHQgLyAyOw0KLSAgICAgICAgRlhfQk9PTCBiVmVydCA9IElzVmVydGljYWwoKTsNCi0gICAgICAgIGlmIChiTG93ZXIpIHsNCi0gICAgICAgICAgICBpZiAoYlZlcnQpIHsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pblRyYWNrSGVpZ2h0ID0gbV9ydE1pblRyYWNrLmhlaWdodCAtIGZIIC0gbV9ydE1pbkJ0bi5oZWlnaHQ7DQotICAgICAgICAgICAgICAgIGZNaW5UcmFja0hlaWdodCA9IChmTWluVHJhY2tIZWlnaHQgPj0gMC4wZikgPyBmTWluVHJhY2tIZWlnaHQgOiAwLjBmOw0KLSAgICAgICAgICAgICAgICByZWN0LlNldChtX3J0TWluVHJhY2subGVmdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9ydE1pblRyYWNrLnRvcCArIG1fcnRNaW5CdG4uaGVpZ2h0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBtX3J0TWluVHJhY2sud2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgIGZNaW5UcmFja0hlaWdodCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pblRyYWNrV2lkdGggPSBtX3J0TWluVHJhY2sud2lkdGggLSBmVyAtIG1fcnRNaW5CdG4ud2lkdGggKyAyOw0KLSAgICAgICAgICAgICAgICBmTWluVHJhY2tXaWR0aCA9IChmTWluVHJhY2tXaWR0aCA+PSAwLjBmKSA/IGZNaW5UcmFja1dpZHRoIDogMC4wZjsNCi0gICAgICAgICAgICAgICAgcmVjdC5TZXQobV9ydE1pblRyYWNrLmxlZnQgKyBtX3J0TWluQnRuLndpZHRoIC0gMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9ydE1pblRyYWNrLnRvcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZk1pblRyYWNrV2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRNaW5UcmFjay5oZWlnaHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGJWZXJ0KSB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhUcmFja0hlaWdodCA9IG1fcnRNYXhUcmFjay5oZWlnaHQgLSBmSCAtIG1fcnRNYXhCdG4uaGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICBmTWF4VHJhY2tIZWlnaHQgPSAoZk1heFRyYWNrSGVpZ2h0ID49IDAuMGYpID8gZk1heFRyYWNrSGVpZ2h0IDogMC4wZjsNCi0gICAgICAgICAgICAgICAgcmVjdC5TZXQobV9ydE1heFRyYWNrLmxlZnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRNYXhUcmFjay50b3AgKyBmSCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9ydE1heFRyYWNrLndpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBmTWF4VHJhY2tIZWlnaHQpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhUcmFja1dpZHRoID0gbV9ydE1heFRyYWNrLndpZHRoIC0gZlcgLSBtX3J0TWF4QnRuLndpZHRoICsgMjsNCi0gICAgICAgICAgICAgICAgZk1heFRyYWNrV2lkdGggPSAoZk1heFRyYWNrV2lkdGggPj0gMC4wZikgPyBmTWF4VHJhY2tXaWR0aCA6IDAuMGY7DQotICAgICAgICAgICAgICAgIHJlY3QuU2V0KG1fcnRNYXhUcmFjay5sZWZ0ICsgZlcsDQotICAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRNYXhUcmFjay50b3AsDQotICAgICAgICAgICAgICAgICAgICAgICAgIGZNYXhUcmFja1dpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBtX3J0TWF4VHJhY2suaGVpZ2h0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICAgICAgZkxlbmd0aCA9IGZMZW5ndGggLSBtX3J0TWluQnRuLndpZHRoIC0gbV9ydE1heEJ0bi53aWR0aDsNCisgICAgICBpZiAoZkxlbmd0aCA8IG1fcnRNaW5CdG4ud2lkdGggfHwgZkxlbmd0aCA8IG1fcnRNYXhCdG4ud2lkdGgpIHsNCisgICAgICAgIGZMZW5ndGggPSAwLjBmOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgZkxlbmd0aCAtPSBmU2l6ZSAqIDIuMGY7DQorICAgIGlmIChmTGVuZ3RoIDwgZlNpemUpIHsNCisgICAgICBmTGVuZ3RoID0gMC4wZjsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfRkxPQVQgZlRodW1iU2l6ZSA9IGZMZW5ndGggKiBmTGVuZ3RoIC8gKGZSYW5nZSArIGZMZW5ndGgpOw0KKyAgaWYgKGZUaHVtYlNpemUgPCBtX2ZNaW5UaHVtYikgew0KKyAgICBmVGh1bWJTaXplID0gbV9mTWluVGh1bWI7DQorICB9DQorICBGWF9GTE9BVCBmRGlmZiA9IGZMZW5ndGggLSBmVGh1bWJTaXplOw0KKyAgaWYgKGZEaWZmIDwgMC4wZikgew0KKyAgICBmRGlmZiA9IDAuMGY7DQorICB9DQorICBGWF9GTE9BVCBmVHJhY2tQb3MgPSBtX2ZUcmFja1BvczsNCisgIGlmIChmVHJhY2tQb3MgPiBtX2ZSYW5nZU1heCkgew0KKyAgICBmVHJhY2tQb3MgPSBtX2ZSYW5nZU1heDsNCisgIH0NCisgIGlmIChmVHJhY2tQb3MgPCBtX2ZSYW5nZU1pbikgew0KKyAgICBmVHJhY2tQb3MgPSBtX2ZSYW5nZU1pbjsNCisgIH0NCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwoZlJhbmdlKTsNCisgIGlmIChtX2JDdXN0b21MYXlvdXQpIHsNCisgICAgRlhfRkxPQVQgaVBvcyA9IGZEaWZmICogKGZUcmFja1BvcyAtIG1fZlJhbmdlTWluKSAvIGZSYW5nZTsNCisgICAgcmVjdC5sZWZ0ID0gcnRDbGllbnQubGVmdDsNCisgICAgaWYgKCFJc1ZlcnRpY2FsKCkpIHsNCisgICAgICBpZiAoKG1fcnRNaW5CdG4ucmlnaHQoKSA9PSBtX3J0TWF4QnRuLmxlZnQgJiYgbV9ydE1pbkJ0bi53aWR0aCA+IDAgJiYNCisgICAgICAgICAgIG1fcnRNYXhCdG4ud2lkdGggPiAwKSB8fA0KKyAgICAgICAgICAoMCA9PSBtX3J0TWluQnRuLndpZHRoICYmIDAgPT0gbV9ydE1heEJ0bi53aWR0aCkpIHsNCisgICAgICAgIHJlY3QubGVmdCArPSBpUG9zOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICByZWN0LmxlZnQgKz0gbV9ydE1pbkJ0bi5yaWdodCgpICsgaVBvczsNCisgICAgICB9DQorICAgIH0NCisgICAgcmVjdC50b3AgPSBydENsaWVudC50b3A7DQorICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCisgICAgICBpZiAoKG1fcnRNaW5CdG4uYm90dG9tKCkgPT0gbV9ydE1heEJ0bi50b3AgJiYgbV9ydE1pbkJ0bi5oZWlnaHQgPiAwICYmDQorICAgICAgICAgICBtX3J0TWF4QnRuLmhlaWdodCA+IDApIHx8DQorICAgICAgICAgICgwID09IG1fcnRNaW5CdG4uaGVpZ2h0ICYmIDAgPT0gbV9ydE1heEJ0bi5oZWlnaHQpKSB7DQorICAgICAgICByZWN0LnRvcCArPSBpUG9zOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICByZWN0LnRvcCArPSBtX3J0TWluQnRuLmJvdHRvbSgpICsgaVBvczsNCisgICAgICB9DQorICAgIH0NCisgICAgcmVjdC53aWR0aCA9IElzVmVydGljYWwoKSA/IHJ0Q2xpZW50LndpZHRoIDogZlRodW1iU2l6ZTsNCisgICAgcmVjdC5oZWlnaHQgPSBJc1ZlcnRpY2FsKCkgPyBmVGh1bWJTaXplIDogcnRDbGllbnQuaGVpZ2h0Ow0KKyAgfSBlbHNlIHsNCisgICAgRlhfRkxPQVQgaVBvcyA9IGZTaXplICsgZkRpZmYgKiAoZlRyYWNrUG9zIC0gbV9mUmFuZ2VNaW4pIC8gZlJhbmdlOw0KKyAgICByZWN0LmxlZnQgPSBydENsaWVudC5sZWZ0Ow0KKyAgICBpZiAoIUlzVmVydGljYWwoKSkgew0KKyAgICAgIHJlY3QubGVmdCArPSBpUG9zOw0KKyAgICB9DQorICAgIHJlY3QudG9wID0gcnRDbGllbnQudG9wOw0KKyAgICBpZiAoSXNWZXJ0aWNhbCgpKSB7DQorICAgICAgcmVjdC50b3AgKz0gaVBvczsNCisgICAgfQ0KKyAgICByZWN0LndpZHRoID0gSXNWZXJ0aWNhbCgpID8gcnRDbGllbnQud2lkdGggOiBmVGh1bWJTaXplOw0KKyAgICByZWN0LmhlaWdodCA9IElzVmVydGljYWwoKSA/IGZUaHVtYlNpemUgOiBydENsaWVudC5oZWlnaHQ7DQorICB9DQogfQ0KLUZYX0JPT0wgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNlbmRFdmVudCgpDQotew0KLSAgICBpZiAobV9pTWluQnV0dG9uU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZCkgew0KLSAgICAgICAgRG9TY3JvbGwoRldMX1NDQkNPREVfU3RlcEJhY2t3YXJkLCBtX2ZUcmFja1Bvcyk7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG1faU1heEJ1dHRvblN0YXRlID09IEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQpIHsNCi0gICAgICAgIERvU2Nyb2xsKEZXTF9TQ0JDT0RFX1N0ZXBGb3J3YXJkLCBtX2ZUcmFja1Bvcyk7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG1faU1pblRyYWNrU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZCkgew0KLSAgICAgICAgRG9TY3JvbGwoRldMX1NDQkNPREVfUGFnZUJhY2t3YXJkLCBtX2ZUcmFja1Bvcyk7DQotICAgICAgICByZXR1cm4gbV9ydFRodW1iLkNvbnRhaW5zKG1fY3BUcmFja1BvaW50WCwgbV9jcFRyYWNrUG9pbnRZKTsNCi0gICAgfQ0KLSAgICBpZiAobV9pTWF4VHJhY2tTdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NDQl9QcmVzc2VkKSB7DQotICAgICAgICBEb1Njcm9sbChGV0xfU0NCQ09ERV9QYWdlRm9yd2FyZCwgbV9mVHJhY2tQb3MpOw0KLSAgICAgICAgcmV0dXJuIG1fcnRUaHVtYi5Db250YWlucyhtX2NwVHJhY2tQb2ludFgsIG1fY3BUcmFja1BvaW50WSk7DQotICAgIH0NCi0gICAgaWYgKG1faU1vdXNlV2hlZWwpIHsNCi0gICAgICAgIEZYX1dPUkQgZHdDb2RlID0gbV9pTW91c2VXaGVlbCA8IDAgPyBGV0xfU0NCQ09ERV9TdGVwRm9yd2FyZCA6IEZXTF9TQ0JDT0RFX1N0ZXBCYWNrd2FyZDsNCi0gICAgICAgIERvU2Nyb2xsKGR3Q29kZSwgbV9mVHJhY2tQb3MpOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNGV0xfU2Nyb2xsQmFySW1wOjpPblNjcm9sbChGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MpDQotew0KLSAgICBGWF9CT09MIGJSZXQgPSBUUlVFOw0KLSAgICBDRldMX0V2dFNjcm9sbCBldjsNCi0gICAgZXYubV9pU2Nyb2xsQ29kZSA9IGR3Q29kZTsNCi0gICAgZXYubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBldi5tX2ZQb3MgPSBmUG9zOw0KLSAgICBldi5tX3BSZXQgPSAmYlJldDsNCi0gICAgRGlzcGF0Y2hFdmVudCgmZXYpOw0KLSAgICByZXR1cm4gYlJldDsNCi19DQotQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6Q0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZShDRldMX1Njcm9sbEJhckltcCAqcE93bmVyKQ0KLSAgICA6IG1fcE93bmVyKHBPd25lcikNCi17DQotfQ0KLWludDMyX3QgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQotICAgIGludDMyX3QgaVJldCA9IDE7DQotICAgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQotICAgIGlmIChkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfTW91c2UpIHsNCi0gICAgICAgIENGV0xfTXNnTW91c2UgKnBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQotICAgICAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQotICAgICAgICBzd2l0Y2ggKGR3Q21kKSB7DQotICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCi0gICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1zZy0+bV9kd0ZsYWdzLCBwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQotICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25VcChwTXNnLT5tX2R3RmxhZ3MsIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCi0gICAgICAgICAgICAgICAgICAgIE9uTW91c2VNb3ZlKHBNc2ctPm1fZHdGbGFncywgcE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmU6IHsNCi0gICAgICAgICAgICAgICAgICAgIE9uTW91c2VMZWF2ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICBpUmV0ID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9Nb3VzZVdoZWVsKSB7DQotICAgICAgICBDRldMX01zZ01vdXNlV2hlZWwgKnBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZVdoZWVsKilwTWVzc2FnZTsNCi0gICAgICAgIE9uTW91c2VXaGVlbChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5LCBwTXNnLT5tX2R3RmxhZ3MsIHBNc2ctPm1fZkRlbHRhWCwgcE1zZy0+bV9mRGVsdGFZKTsNCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpDYWxjTWluVHJhY2tSZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKG1fYk1pblNpemUpIHsNCisgICAgcmVjdC5FbXB0eSgpOw0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCBmQm90dG9tID0gbV9ydFRodW1iLmJvdHRvbSgpOw0KKyAgRlhfRkxPQVQgZlJpZ2h0ID0gbV9ydFRodW1iLnJpZ2h0KCk7DQorICBGWF9GTE9BVCBpeCA9IChtX3J0VGh1bWIubGVmdCArIGZSaWdodCkgLyAyOw0KKyAgRlhfRkxPQVQgaXkgPSAobV9ydFRodW1iLnRvcCArIGZCb3R0b20pIC8gMjsNCisgIHJlY3QubGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCisgIHJlY3QudG9wID0gbV9ydENsaWVudC50b3A7DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9IElzVmVydGljYWwoKTsNCisgIHJlY3Qud2lkdGggPSBiVmVydGljYWwgPyBtX3J0Q2xpZW50LndpZHRoIDogaXg7DQorICByZWN0LmhlaWdodCA9IGJWZXJ0aWNhbCA/IGl5IDogbV9ydENsaWVudC5oZWlnaHQ7DQorICBpZiAobV9iQ3VzdG9tTGF5b3V0KSB7DQorICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICBpZiAoMCA9PSBtX3J0TWluQnRuLmhlaWdodCAmJiAwID09IG1fcnRNYXhCdG4uaGVpZ2h0KSB7DQorICAgICAgICByZWN0LnRvcCA9IG1fcnRDbGllbnQudG9wOw0KKyAgICAgIH0gZWxzZSBpZiAobV9ydE1pbkJ0bi50b3AgPCBtX3J0VGh1bWIudG9wKSB7DQorICAgICAgICByZWN0LnRvcCA9IG1fcnRNaW5CdG4uYm90dG9tKCk7DQorICAgICAgICByZWN0LmhlaWdodCAtPSAobV9ydE1pbkJ0bi5ib3R0b20oKSAtIG1fcnRDbGllbnQudG9wKTsNCisgICAgICB9DQogICAgIH0gZWxzZSB7DQotICAgICAgICBpUmV0ID0gMDsNCisgICAgICBpZiAoMCA9PSBtX3J0TWluQnRuLndpZHRoICYmIDAgPT0gbV9ydE1heEJ0bi53aWR0aCkgew0KKyAgICAgICAgcmVjdC5sZWZ0ID0gbV9ydENsaWVudC5sZWZ0Ow0KKyAgICAgIH0gZWxzZSBpZiAobV9ydE1pbkJ0bi5sZWZ0IDwgbV9ydFRodW1iLmxlZnQpIHsNCisgICAgICAgIHJlY3QubGVmdCA9IG1fcnRNaW5CdG4ucmlnaHQoKTsNCisgICAgICAgIHJlY3Qud2lkdGggLT0gKG1fcnRNaW5CdG4ucmlnaHQoKSAtIG1fcnRDbGllbnQubGVmdCk7DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiBpUmV0Ow0KKyAgfQ0KIH0NCi1GV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KLX0NCi12b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKCFtX3BPd25lci0+SXNFbmFibGVkKCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBtX3BPd25lci0+bV9iTW91c2VEb3duID0gVFJVRTsNCi0gICAgbV9wT3duZXItPlNldEdyYWIoVFJVRSk7DQotICAgIG1fcE93bmVyLT5tX2NwVHJhY2tQb2ludFggPSBmeDsNCi0gICAgbV9wT3duZXItPm1fY3BUcmFja1BvaW50WSA9IGZ5Ow0KLSAgICBtX3BPd25lci0+bV9mTGFzdFRyYWNrUG9zID0gbV9wT3duZXItPm1fZlRyYWNrUG9zOw0KLSAgICBpZiAobV9wT3duZXItPm1fcnRNaW5CdG4uQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgRG9Nb3VzZURvd24oMCwgbV9wT3duZXItPm1fcnRNaW5CdG4sIG1fcE93bmVyLT5tX2lNaW5CdXR0b25TdGF0ZSwgZngsIGZ5KTsNCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpDYWxjTWF4VHJhY2tSZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKG1fYk1pblNpemUpIHsNCisgICAgcmVjdC5FbXB0eSgpOw0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCBpeCA9IChtX3J0VGh1bWIubGVmdCArIG1fcnRUaHVtYi5yaWdodCgpKSAvIDI7DQorICBGWF9GTE9BVCBpeSA9IChtX3J0VGh1bWIudG9wICsgbV9ydFRodW1iLmJvdHRvbSgpKSAvIDI7DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9IElzVmVydGljYWwoKTsNCisgIHJlY3QubGVmdCA9IGJWZXJ0aWNhbCA/IG1fcnRDbGllbnQubGVmdCA6IGl4Ow0KKyAgcmVjdC50b3AgPSBiVmVydGljYWwgPyBpeSA6IG1fcnRDbGllbnQudG9wOw0KKyAgcmVjdC53aWR0aCA9IGJWZXJ0aWNhbCA/IG1fcnRDbGllbnQud2lkdGggOiBtX3J0Q2xpZW50LnJpZ2h0KCkgLSBpeDsNCisgIHJlY3QuaGVpZ2h0ID0gYlZlcnRpY2FsID8gbV9ydENsaWVudC5ib3R0b20oKSAtIGl5IDogbV9ydENsaWVudC5oZWlnaHQ7DQorICBpZiAobV9iQ3VzdG9tTGF5b3V0KSB7DQorICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICBpZiAobV9ydE1pbkJ0bi50b3AgPiBtX3J0VGh1bWIudG9wICYmIG1fcnRNaW5CdG4uaGVpZ2h0ID4gMCAmJg0KKyAgICAgICAgICBtX3J0TWF4QnRuLmhlaWdodCA+IDApIHsNCisgICAgICAgIHJlY3QuaGVpZ2h0IC09IChtX3J0Q2xpZW50LmJvdHRvbSgpIC0gbV9ydE1pbkJ0bi50b3ApOw0KKyAgICAgIH0gZWxzZSBpZiAobV9ydE1pbkJ0bi5oZWlnaHQgPiAwICYmIG1fcnRNYXhCdG4uaGVpZ2h0ID4gMCkgew0KKyAgICAgICAgcmVjdC5oZWlnaHQgLT0gKG1fcnRDbGllbnQuYm90dG9tKCkgLSBtX3J0TWF4QnRuLnRvcCk7DQorICAgICAgfQ0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKG1fcE93bmVyLT5tX3J0VGh1bWIuQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgICAgIERvTW91c2VEb3duKDEsIG1fcE93bmVyLT5tX3J0VGh1bWIsIG1fcE93bmVyLT5tX2lUaHVtYkJ1dHRvblN0YXRlLCBmeCwgZnkpOw0KKyAgICAgIGlmIChtX3J0TWluQnRuLmxlZnQgPiBtX3J0VGh1bWIubGVmdCAmJiBtX3J0TWluQnRuLndpZHRoID4gMCAmJg0KKyAgICAgICAgICBtX3J0TWF4QnRuLndpZHRoID4gMCkgew0KKyAgICAgICAgcmVjdC53aWR0aCAtPSAobV9ydENsaWVudC5yaWdodCgpIC0gbV9ydE1pbkJ0bi5sZWZ0KTsNCisgICAgICB9IGVsc2UgaWYgKG1fcnRNaW5CdG4ud2lkdGggPiAwICYmIG1fcnRNYXhCdG4ud2lkdGggPiAwKSB7DQorICAgICAgICByZWN0LndpZHRoIC09IChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBtX3J0TWF4QnRuLmxlZnQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCitGWF9GTE9BVCBDRldMX1Njcm9sbEJhckltcDo6R2V0VHJhY2tQb2ludFBvcyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIEZYX0ZMT0FUIGZEaWZmWCA9IGZ4IC0gbV9jcFRyYWNrUG9pbnRYOw0KKyAgRlhfRkxPQVQgZkRpZmZZID0gZnkgLSBtX2NwVHJhY2tQb2ludFk7DQorICBGWF9GTE9BVCBmUmFuZ2UgPSBtX2ZSYW5nZU1heCAtIG1fZlJhbmdlTWluOw0KKyAgRlhfRkxPQVQgZlBvczsNCisgIGlmIChtX2JDdXN0b21MYXlvdXQpIHsNCisgICAgaWYgKElzVmVydGljYWwoKSkgew0KKyAgICAgIGlmICgwID09IG1fcnRNaW5CdG4uaGVpZ2h0ICYmIDAgPT0gbV9ydE1heEJ0bi5oZWlnaHQpIHsNCisgICAgICAgIGZQb3MgPSBmUmFuZ2UgKiBmRGlmZlkgLyAobV9ydENsaWVudC5oZWlnaHQgLSBtX3J0VGh1bWIuaGVpZ2h0KTsNCisgICAgICB9IGVsc2UgaWYgKG1fcnRNaW5CdG4uYm90dG9tKCkgPT0gbV9ydE1heEJ0bi50b3ApIHsNCisgICAgICAgIGZQb3MgPSBmUmFuZ2UgKiBmRGlmZlkgLw0KKyAgICAgICAgICAgICAgIChtX3J0TWluQnRuLnRvcCAtIG1fcnRDbGllbnQudG9wIC0gbV9ydFRodW1iLmhlaWdodCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGZQb3MgPSBmUmFuZ2UgKiBmRGlmZlkgLw0KKyAgICAgICAgICAgICAgIChtX3J0TWF4QnRuLnRvcCAtIG1fcnRNaW5CdG4uYm90dG9tKCkgLSBtX3J0VGh1bWIuaGVpZ2h0KTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKDAgPT0gbV9ydE1pbkJ0bi53aWR0aCAmJiAwID09IG1fcnRNYXhCdG4ud2lkdGgpIHsNCisgICAgICAgIGZQb3MgPSBmUmFuZ2UgKiBmRGlmZlggLyAobV9ydENsaWVudC53aWR0aCAtIG1fcnRUaHVtYi53aWR0aCk7DQorICAgICAgfSBlbHNlIGlmIChtX3J0TWluQnRuLnJpZ2h0KCkgPT0gbV9ydE1heEJ0bi5sZWZ0KSB7DQorICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZYIC8NCisgICAgICAgICAgICAgICAobV9ydE1pbkJ0bi5sZWZ0IC0gbV9ydENsaWVudC5sZWZ0IC0gbV9ydFRodW1iLndpZHRoKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZlBvcyA9IGZSYW5nZSAqIGZEaWZmWCAvDQorICAgICAgICAgICAgICAgKG1fcnRNYXhCdG4ubGVmdCAtIG1fcnRNaW5CdG4ucmlnaHQoKSAtIG1fcnRUaHVtYi53aWR0aCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAoSXNWZXJ0aWNhbCgpKSB7DQorICAgICAgZlBvcyA9IGZSYW5nZSAqIGZEaWZmWSAvDQorICAgICAgICAgICAgIChtX3J0TWF4QnRuLnRvcCAtIG1fcnRNaW5CdG4uYm90dG9tKCkgLSBtX3J0VGh1bWIuaGVpZ2h0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZYIC8NCisgICAgICAgICAgICAgKG1fcnRNYXhCdG4ubGVmdCAtIG1fcnRNaW5CdG4ucmlnaHQoKSAtIG1fcnRUaHVtYi53aWR0aCk7DQorICAgIH0NCisgIH0NCisgIGZQb3MgKz0gbV9mTGFzdFRyYWNrUG9zOw0KKyAgaWYgKGZQb3MgPCBtX2ZSYW5nZU1pbikgew0KKyAgICBmUG9zID0gbV9mUmFuZ2VNaW47DQorICB9DQorICBpZiAoZlBvcyA+IG1fZlJhbmdlTWF4KSB7DQorICAgIGZQb3MgPSBtX2ZSYW5nZU1heDsNCisgIH0NCisgIHJldHVybiBmUG9zOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpHZXRUcmFja1JlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJMb3dlcikgew0KKyAgRlhfQk9PTCBiRGlzYWJsZWQgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkOw0KKyAgaWYgKGJEaXNhYmxlZCB8fCBtX2JDdXN0b21MYXlvdXQpIHsNCisgICAgcmVjdCA9IGJMb3dlciA/IG1fcnRNaW5UcmFjayA6IG1fcnRNYXhUcmFjazsNCisgIH0gZWxzZSB7DQorICAgIEZYX0ZMT0FUIGZXID0gbV9ydFRodW1iLndpZHRoIC8gMjsNCisgICAgRlhfRkxPQVQgZkggPSBtX3J0VGh1bWIuaGVpZ2h0IC8gMjsNCisgICAgRlhfQk9PTCBiVmVydCA9IElzVmVydGljYWwoKTsNCisgICAgaWYgKGJMb3dlcikgew0KKyAgICAgIGlmIChiVmVydCkgew0KKyAgICAgICAgRlhfRkxPQVQgZk1pblRyYWNrSGVpZ2h0ID0gbV9ydE1pblRyYWNrLmhlaWdodCAtIGZIIC0gbV9ydE1pbkJ0bi5oZWlnaHQ7DQorICAgICAgICBmTWluVHJhY2tIZWlnaHQgPSAoZk1pblRyYWNrSGVpZ2h0ID49IDAuMGYpID8gZk1pblRyYWNrSGVpZ2h0IDogMC4wZjsNCisgICAgICAgIHJlY3QuU2V0KG1fcnRNaW5UcmFjay5sZWZ0LCBtX3J0TWluVHJhY2sudG9wICsgbV9ydE1pbkJ0bi5oZWlnaHQsDQorICAgICAgICAgICAgICAgICBtX3J0TWluVHJhY2sud2lkdGgsIGZNaW5UcmFja0hlaWdodCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0ZMT0FUIGZNaW5UcmFja1dpZHRoID0NCisgICAgICAgICAgICBtX3J0TWluVHJhY2sud2lkdGggLSBmVyAtIG1fcnRNaW5CdG4ud2lkdGggKyAyOw0KKyAgICAgICAgZk1pblRyYWNrV2lkdGggPSAoZk1pblRyYWNrV2lkdGggPj0gMC4wZikgPyBmTWluVHJhY2tXaWR0aCA6IDAuMGY7DQorICAgICAgICByZWN0LlNldChtX3J0TWluVHJhY2subGVmdCArIG1fcnRNaW5CdG4ud2lkdGggLSAxLCBtX3J0TWluVHJhY2sudG9wLA0KKyAgICAgICAgICAgICAgICAgZk1pblRyYWNrV2lkdGgsIG1fcnRNaW5UcmFjay5oZWlnaHQpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoYlZlcnQpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZNYXhUcmFja0hlaWdodCA9IG1fcnRNYXhUcmFjay5oZWlnaHQgLSBmSCAtIG1fcnRNYXhCdG4uaGVpZ2h0Ow0KKyAgICAgICAgZk1heFRyYWNrSGVpZ2h0ID0gKGZNYXhUcmFja0hlaWdodCA+PSAwLjBmKSA/IGZNYXhUcmFja0hlaWdodCA6IDAuMGY7DQorICAgICAgICByZWN0LlNldChtX3J0TWF4VHJhY2subGVmdCwgbV9ydE1heFRyYWNrLnRvcCArIGZILCBtX3J0TWF4VHJhY2sud2lkdGgsDQorICAgICAgICAgICAgICAgICBmTWF4VHJhY2tIZWlnaHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9GTE9BVCBmTWF4VHJhY2tXaWR0aCA9DQorICAgICAgICAgICAgbV9ydE1heFRyYWNrLndpZHRoIC0gZlcgLSBtX3J0TWF4QnRuLndpZHRoICsgMjsNCisgICAgICAgIGZNYXhUcmFja1dpZHRoID0gKGZNYXhUcmFja1dpZHRoID49IDAuMGYpID8gZk1heFRyYWNrV2lkdGggOiAwLjBmOw0KKyAgICAgICAgcmVjdC5TZXQobV9ydE1heFRyYWNrLmxlZnQgKyBmVywgbV9ydE1heFRyYWNrLnRvcCwgZk1heFRyYWNrV2lkdGgsDQorICAgICAgICAgICAgICAgICBtX3J0TWF4VHJhY2suaGVpZ2h0KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQorRlhfQk9PTCBDRldMX1Njcm9sbEJhckltcDo6U2VuZEV2ZW50KCkgew0KKyAgaWYgKG1faU1pbkJ1dHRvblN0YXRlID09IEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQpIHsNCisgICAgRG9TY3JvbGwoRldMX1NDQkNPREVfU3RlcEJhY2t3YXJkLCBtX2ZUcmFja1Bvcyk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChtX2lNYXhCdXR0b25TdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NDQl9QcmVzc2VkKSB7DQorICAgIERvU2Nyb2xsKEZXTF9TQ0JDT0RFX1N0ZXBGb3J3YXJkLCBtX2ZUcmFja1Bvcyk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChtX2lNaW5UcmFja1N0YXRlID09IEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQpIHsNCisgICAgRG9TY3JvbGwoRldMX1NDQkNPREVfUGFnZUJhY2t3YXJkLCBtX2ZUcmFja1Bvcyk7DQorICAgIHJldHVybiBtX3J0VGh1bWIuQ29udGFpbnMobV9jcFRyYWNrUG9pbnRYLCBtX2NwVHJhY2tQb2ludFkpOw0KKyAgfQ0KKyAgaWYgKG1faU1heFRyYWNrU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZCkgew0KKyAgICBEb1Njcm9sbChGV0xfU0NCQ09ERV9QYWdlRm9yd2FyZCwgbV9mVHJhY2tQb3MpOw0KKyAgICByZXR1cm4gbV9ydFRodW1iLkNvbnRhaW5zKG1fY3BUcmFja1BvaW50WCwgbV9jcFRyYWNrUG9pbnRZKTsNCisgIH0NCisgIGlmIChtX2lNb3VzZVdoZWVsKSB7DQorICAgIEZYX1dPUkQgZHdDb2RlID0NCisgICAgICAgIG1faU1vdXNlV2hlZWwgPCAwID8gRldMX1NDQkNPREVfU3RlcEZvcndhcmQgOiBGV0xfU0NCQ09ERV9TdGVwQmFja3dhcmQ7DQorICAgIERvU2Nyb2xsKGR3Q29kZSwgbV9mVHJhY2tQb3MpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9TY3JvbGxCYXJJbXA6Ok9uU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcykgew0KKyAgRlhfQk9PTCBiUmV0ID0gVFJVRTsNCisgIENGV0xfRXZ0U2Nyb2xsIGV2Ow0KKyAgZXYubV9pU2Nyb2xsQ29kZSA9IGR3Q29kZTsNCisgIGV2Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgIGV2Lm1fZlBvcyA9IGZQb3M7DQorICBldi5tX3BSZXQgPSAmYlJldDsNCisgIERpc3BhdGNoRXZlbnQoJmV2KTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpDRldMX1Njcm9sbEJhckltcERlbGVnYXRlKENGV0xfU2Nyb2xsQmFySW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgIGludDMyX3QgaVJldCA9IDE7DQorICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9Nb3VzZSkgew0KKyAgICBDRldMX01zZ01vdXNlKiBwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KKyAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQorICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgT25MQnV0dG9uRG93bihwTXNnLT5tX2R3RmxhZ3MsIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgT25MQnV0dG9uVXAocE1zZy0+bV9kd0ZsYWdzLCBwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCisgICAgICAgIE9uTW91c2VNb3ZlKHBNc2ctPm1fZHdGbGFncywgcE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTogew0KKyAgICAgICAgT25Nb3VzZUxlYXZlKCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZGVmYXVsdDogeyBpUmV0ID0gMDsgfQ0KKyAgICB9DQorICB9IGVsc2UgaWYgKGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9Nb3VzZVdoZWVsKSB7DQorICAgIENGV0xfTXNnTW91c2VXaGVlbCogcE1zZyA9IChDRldMX01zZ01vdXNlV2hlZWwqKXBNZXNzYWdlOw0KKyAgICBPbk1vdXNlV2hlZWwocE1zZy0+bV9meCwgcE1zZy0+bV9meSwgcE1zZy0+bV9kd0ZsYWdzLCBwTXNnLT5tX2ZEZWx0YVgsDQorICAgICAgICAgICAgICAgICBwTXNnLT5tX2ZEZWx0YVkpOw0KKyAgfSBlbHNlIHsNCisgICAgaVJldCA9IDA7DQorICB9DQorICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wT3duZXItPklzRW5hYmxlZCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcE93bmVyLT5tX2JNb3VzZURvd24gPSBUUlVFOw0KKyAgbV9wT3duZXItPlNldEdyYWIoVFJVRSk7DQorICBtX3BPd25lci0+bV9jcFRyYWNrUG9pbnRYID0gZng7DQorICBtX3BPd25lci0+bV9jcFRyYWNrUG9pbnRZID0gZnk7DQorICBtX3BPd25lci0+bV9mTGFzdFRyYWNrUG9zID0gbV9wT3duZXItPm1fZlRyYWNrUG9zOw0KKyAgaWYgKG1fcE93bmVyLT5tX3J0TWluQnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgRG9Nb3VzZURvd24oMCwgbV9wT3duZXItPm1fcnRNaW5CdG4sIG1fcE93bmVyLT5tX2lNaW5CdXR0b25TdGF0ZSwgZngsIGZ5KTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX3BPd25lci0+bV9ydFRodW1iLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICBEb01vdXNlRG93bigxLCBtX3BPd25lci0+bV9ydFRodW1iLCBtX3BPd25lci0+bV9pVGh1bWJCdXR0b25TdGF0ZSwgZngsDQorICAgICAgICAgICAgICAgICAgZnkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9ydE1heEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICBEb01vdXNlRG93bigyLCBtX3BPd25lci0+bV9ydE1heEJ0biwgbV9wT3duZXItPm1faU1heEJ1dHRvblN0YXRlLCBmeCwNCisgICAgICAgICAgICAgICAgICAgIGZ5KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5tX3J0TWluVHJhY2suQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgICBEb01vdXNlRG93bigzLCBtX3BPd25lci0+bV9ydE1pblRyYWNrLCBtX3BPd25lci0+bV9pTWluVHJhY2tTdGF0ZSwgZngsDQorICAgICAgICAgICAgICAgICAgICAgIGZ5KTsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX3J0TWF4QnRuLkNvbnRhaW5zKGZ4LCAgZnkpKSB7DQotICAgICAgICAgICAgICAgIERvTW91c2VEb3duKDIsIG1fcE93bmVyLT5tX3J0TWF4QnRuLCBtX3BPd25lci0+bV9pTWF4QnV0dG9uU3RhdGUsIGZ4LCBmeSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcE93bmVyLT5tX3J0TWluVHJhY2suQ29udGFpbnMoZngsICBmeSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIERvTW91c2VEb3duKDMsIG1fcE93bmVyLT5tX3J0TWluVHJhY2ssIG1fcE93bmVyLT5tX2lNaW5UcmFja1N0YXRlLCBmeCwgZnkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgRG9Nb3VzZURvd24oNCwgbV9wT3duZXItPm1fcnRNYXhUcmFjaywgbV9wT3duZXItPm1faU1heFRyYWNrU3RhdGUsIGZ4LCBmeSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQorICAgICAgICAgIERvTW91c2VEb3duKDQsIG1fcE93bmVyLT5tX3J0TWF4VHJhY2ssIG1fcE93bmVyLT5tX2lNYXhUcmFja1N0YXRlLCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgZnkpOw0KICAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAoIW1fcE93bmVyLT5TZW5kRXZlbnQoKSkgew0KLSAgICAgICAgbV9wT3duZXItPm1faFRpbWVyID0gRldMX1N0YXJ0VGltZXIobV9wT3duZXIsIEZXTF9TQ1JPTExCQVJfRWxhcHNlKTsNCi0gICAgfQ0KKyAgfQ0KKyAgaWYgKCFtX3BPd25lci0+U2VuZEV2ZW50KCkpIHsNCisgICAgbV9wT3duZXItPm1faFRpbWVyID0gRldMX1N0YXJ0VGltZXIobV9wT3duZXIsIEZXTF9TQ1JPTExCQVJfRWxhcHNlKTsNCisgIH0NCiB9DQotdm9pZCBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBGV0xfU3RvcFRpbWVyKG1fcE93bmVyLT5tX2hUaW1lcik7DQotICAgIG1fcE93bmVyLT5tX2JNb3VzZURvd24gPSBGQUxTRTsNCi0gICAgRG9Nb3VzZVVwKDAsIG1fcE93bmVyLT5tX3J0TWluQnRuLCBtX3BPd25lci0+bV9pTWluQnV0dG9uU3RhdGUsIGZ4LCAgZnkpOw0KLSAgICBEb01vdXNlVXAoMSwgbV9wT3duZXItPm1fcnRUaHVtYiwgbV9wT3duZXItPm1faVRodW1iQnV0dG9uU3RhdGUsIGZ4LCAgZnkpOw0KLSAgICBEb01vdXNlVXAoMiwgbV9wT3duZXItPm1fcnRNYXhCdG4sIG1fcE93bmVyLT5tX2lNYXhCdXR0b25TdGF0ZSwgZngsICBmeSk7DQotICAgIERvTW91c2VVcCgzLCBtX3BPd25lci0+bV9ydE1pblRyYWNrLCBtX3BPd25lci0+bV9pTWluVHJhY2tTdGF0ZSwgZngsICBmeSk7DQotICAgIERvTW91c2VVcCg0LCBtX3BPd25lci0+bV9ydE1heFRyYWNrLCBtX3BPd25lci0+bV9pTWF4VHJhY2tTdGF0ZSwgZngsICBmeSk7DQotICAgIG1fcE93bmVyLT5TZXRHcmFiKEZBTFNFKTsNCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBGV0xfU3RvcFRpbWVyKG1fcE93bmVyLT5tX2hUaW1lcik7DQorICBtX3BPd25lci0+bV9iTW91c2VEb3duID0gRkFMU0U7DQorICBEb01vdXNlVXAoMCwgbV9wT3duZXItPm1fcnRNaW5CdG4sIG1fcE93bmVyLT5tX2lNaW5CdXR0b25TdGF0ZSwgZngsIGZ5KTsNCisgIERvTW91c2VVcCgxLCBtX3BPd25lci0+bV9ydFRodW1iLCBtX3BPd25lci0+bV9pVGh1bWJCdXR0b25TdGF0ZSwgZngsIGZ5KTsNCisgIERvTW91c2VVcCgyLCBtX3BPd25lci0+bV9ydE1heEJ0biwgbV9wT3duZXItPm1faU1heEJ1dHRvblN0YXRlLCBmeCwgZnkpOw0KKyAgRG9Nb3VzZVVwKDMsIG1fcE93bmVyLT5tX3J0TWluVHJhY2ssIG1fcE93bmVyLT5tX2lNaW5UcmFja1N0YXRlLCBmeCwgZnkpOw0KKyAgRG9Nb3VzZVVwKDQsIG1fcE93bmVyLT5tX3J0TWF4VHJhY2ssIG1fcE93bmVyLT5tX2lNYXhUcmFja1N0YXRlLCBmeCwgZnkpOw0KKyAgbV9wT3duZXItPlNldEdyYWIoRkFMU0UpOw0KIH0NCi12b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIERvTW91c2VNb3ZlKDAsIG1fcE93bmVyLT5tX3J0TWluQnRuLCBtX3BPd25lci0+bV9pTWluQnV0dG9uU3RhdGUsIGZ4LCBmeSk7DQotICAgIERvTW91c2VNb3ZlKDEsIG1fcE93bmVyLT5tX3J0VGh1bWIsIG1fcE93bmVyLT5tX2lUaHVtYkJ1dHRvblN0YXRlLCBmeCwgZnkpOw0KLSAgICBEb01vdXNlTW92ZSgyLCBtX3BPd25lci0+bV9ydE1heEJ0biwgbV9wT3duZXItPm1faU1heEJ1dHRvblN0YXRlLCBmeCwgZnkpOw0KLSAgICBEb01vdXNlTW92ZSgzLCBtX3BPd25lci0+bV9ydE1pblRyYWNrLCBtX3BPd25lci0+bV9pTWluVHJhY2tTdGF0ZSwgZngsIGZ5KTsNCi0gICAgRG9Nb3VzZU1vdmUoNCwgbV9wT3duZXItPm1fcnRNYXhUcmFjaywgbV9wT3duZXItPm1faU1heFRyYWNrU3RhdGUsIGZ4LCBmeSk7DQordm9pZCBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgRG9Nb3VzZU1vdmUoMCwgbV9wT3duZXItPm1fcnRNaW5CdG4sIG1fcE93bmVyLT5tX2lNaW5CdXR0b25TdGF0ZSwgZngsIGZ5KTsNCisgIERvTW91c2VNb3ZlKDEsIG1fcE93bmVyLT5tX3J0VGh1bWIsIG1fcE93bmVyLT5tX2lUaHVtYkJ1dHRvblN0YXRlLCBmeCwgZnkpOw0KKyAgRG9Nb3VzZU1vdmUoMiwgbV9wT3duZXItPm1fcnRNYXhCdG4sIG1fcE93bmVyLT5tX2lNYXhCdXR0b25TdGF0ZSwgZngsIGZ5KTsNCisgIERvTW91c2VNb3ZlKDMsIG1fcE93bmVyLT5tX3J0TWluVHJhY2ssIG1fcE93bmVyLT5tX2lNaW5UcmFja1N0YXRlLCBmeCwgZnkpOw0KKyAgRG9Nb3VzZU1vdmUoNCwgbV9wT3duZXItPm1fcnRNYXhUcmFjaywgbV9wT3duZXItPm1faU1heFRyYWNrU3RhdGUsIGZ4LCBmeSk7DQogfQ0KLXZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKCkNCi17DQotICAgIERvTW91c2VMZWF2ZSgwLCBtX3BPd25lci0+bV9ydE1pbkJ0biwgbV9wT3duZXItPm1faU1pbkJ1dHRvblN0YXRlKTsNCi0gICAgRG9Nb3VzZUxlYXZlKDEsIG1fcE93bmVyLT5tX3J0VGh1bWIsIG1fcE93bmVyLT5tX2lUaHVtYkJ1dHRvblN0YXRlKTsNCi0gICAgRG9Nb3VzZUxlYXZlKDIsIG1fcE93bmVyLT5tX3J0TWF4QnRuLCBtX3BPd25lci0+bV9pTWF4QnV0dG9uU3RhdGUpOw0KLSAgICBEb01vdXNlTGVhdmUoMywgbV9wT3duZXItPm1fcnRNaW5UcmFjaywgbV9wT3duZXItPm1faU1pblRyYWNrU3RhdGUpOw0KLSAgICBEb01vdXNlTGVhdmUoNCwgbV9wT3duZXItPm1fcnRNYXhUcmFjaywgbV9wT3duZXItPm1faU1heFRyYWNrU3RhdGUpOw0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKCkgew0KKyAgRG9Nb3VzZUxlYXZlKDAsIG1fcE93bmVyLT5tX3J0TWluQnRuLCBtX3BPd25lci0+bV9pTWluQnV0dG9uU3RhdGUpOw0KKyAgRG9Nb3VzZUxlYXZlKDEsIG1fcE93bmVyLT5tX3J0VGh1bWIsIG1fcE93bmVyLT5tX2lUaHVtYkJ1dHRvblN0YXRlKTsNCisgIERvTW91c2VMZWF2ZSgyLCBtX3BPd25lci0+bV9ydE1heEJ0biwgbV9wT3duZXItPm1faU1heEJ1dHRvblN0YXRlKTsNCisgIERvTW91c2VMZWF2ZSgzLCBtX3BPd25lci0+bV9ydE1pblRyYWNrLCBtX3BPd25lci0+bV9pTWluVHJhY2tTdGF0ZSk7DQorICBEb01vdXNlTGVhdmUoNCwgbV9wT3duZXItPm1fcnRNYXhUcmFjaywgbV9wT3duZXItPm1faU1heFRyYWNrU3RhdGUpOw0KIH0NCi12b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6Ok9uTW91c2VXaGVlbChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnksIEZYX0RXT1JECWR3RmxhZ3MsIEZYX0ZMT0FUIGZEZWx0YVgsIEZYX0ZMT0FUCWZEZWx0YVkpDQotew0KLSAgICBtX3BPd25lci0+bV9pTW91c2VXaGVlbCA9IChpbnQzMl90KWZEZWx0YVg7DQotICAgIG1fcE93bmVyLT5TZW5kRXZlbnQoKTsNCi0gICAgbV9wT3duZXItPm1faU1vdXNlV2hlZWwgPSAwOw0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZVdoZWVsKEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkRlbHRhWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRGVsdGFZKSB7DQorICBtX3BPd25lci0+bV9pTW91c2VXaGVlbCA9IChpbnQzMl90KWZEZWx0YVg7DQorICBtX3BPd25lci0+U2VuZEV2ZW50KCk7DQorICBtX3BPd25lci0+bV9pTW91c2VXaGVlbCA9IDA7DQogfQ0KLXZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6RG9Nb3VzZURvd24oaW50MzJfdCBpSXRlbSwgY29uc3QgQ0ZYX1JlY3RGICZydEl0ZW0sIGludDMyX3QgJmlTdGF0ZSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKCFydEl0ZW0uQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChpU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQ7DQotICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEl0ZW0pOw0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6RG9Nb3VzZURvd24oaW50MzJfdCBpSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFydEl0ZW0uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoaVN0YXRlID09IEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaVN0YXRlID0gRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZDsNCisgIG1fcE93bmVyLT5SZXBhaW50KCZydEl0ZW0pOw0KIH0NCi12b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6OkRvTW91c2VVcChpbnQzMl90IGlJdGVtLCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSwgaW50MzJfdCAmaVN0YXRlLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBpbnQzMl90IGlOZXdTdGF0ZSA9IHJ0SXRlbS5Db250YWlucyhmeCwgZnkpID8gRldMX1BBUlRTVEFURV9TQ0JfSG92ZXJlZCA6IEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbDsNCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6OkRvTW91c2VVcChpbnQzMl90IGlJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaW50MzJfdCBpTmV3U3RhdGUgPSBydEl0ZW0uQ29udGFpbnMoZngsIGZ5KSA/IEZXTF9QQVJUU1RBVEVfU0NCX0hvdmVyZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWw7DQorICBpZiAoaVN0YXRlID09IGlOZXdTdGF0ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpU3RhdGUgPSBpTmV3U3RhdGU7DQorICBtX3BPd25lci0+UmVwYWludCgmcnRJdGVtKTsNCisgIG1fcE93bmVyLT5PblNjcm9sbChGV0xfU0NCQ09ERV9FbmRTY3JvbGwsIG1fcE93bmVyLT5tX2ZUcmFja1Bvcyk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6RG9Nb3VzZU1vdmUoaW50MzJfdCBpSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX3BPd25lci0+bV9iTW91c2VEb3duKSB7DQorICAgIGludDMyX3QgaU5ld1N0YXRlID0gcnRJdGVtLkNvbnRhaW5zKGZ4LCBmeSkgPyBGV0xfUEFSVFNUQVRFX1NDQl9Ib3ZlcmVkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWw7DQogICAgIGlmIChpU3RhdGUgPT0gaU5ld1N0YXRlKSB7DQotICAgICAgICByZXR1cm47DQorICAgICAgcmV0dXJuOw0KICAgICB9DQogICAgIGlTdGF0ZSA9IGlOZXdTdGF0ZTsNCiAgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SXRlbSk7DQotICAgIG1fcE93bmVyLT5PblNjcm9sbChGV0xfU0NCQ09ERV9FbmRTY3JvbGwsIG1fcE93bmVyLT5tX2ZUcmFja1Bvcyk7DQorICB9IGVsc2UgaWYgKCgyID09IGlJdGVtKSAmJg0KKyAgICAgICAgICAgICAobV9wT3duZXItPm1faVRodW1iQnV0dG9uU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZCkpIHsNCisgICAgRlhfRkxPQVQgZlBvcyA9IG1fcE93bmVyLT5HZXRUcmFja1BvaW50UG9zKGZ4LCBmeSk7DQorICAgIG1fcE93bmVyLT5tX2ZUcmFja1BvcyA9IGZQb3M7DQorICAgIG1fcE93bmVyLT5PblNjcm9sbChGV0xfU0NCQ09ERV9UcmFja1BvcywgZlBvcyk7DQorICB9DQogfQ0KLXZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6RG9Nb3VzZU1vdmUoaW50MzJfdCBpSXRlbSwgY29uc3QgQ0ZYX1JlY3RGICZydEl0ZW0sIGludDMyX3QgJmlTdGF0ZSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKCFtX3BPd25lci0+bV9iTW91c2VEb3duKSB7DQotICAgICAgICBpbnQzMl90IGlOZXdTdGF0ZSA9IHJ0SXRlbS5Db250YWlucyhmeCwgZnkpID8gRldMX1BBUlRTVEFURV9TQ0JfSG92ZXJlZCA6IEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbDsNCi0gICAgICAgIGlmIChpU3RhdGUgPT0gaU5ld1N0YXRlKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaVN0YXRlID0gaU5ld1N0YXRlOw0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SXRlbSk7DQotICAgIH0gZWxzZSBpZiAoKDIgPT0gaUl0ZW0pICYmIChtX3BPd25lci0+bV9pVGh1bWJCdXR0b25TdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NDQl9QcmVzc2VkKSkgew0KLSAgICAgICAgRlhfRkxPQVQgZlBvcyA9IG1fcE93bmVyLT5HZXRUcmFja1BvaW50UG9zKGZ4LCBmeSk7DQotICAgICAgICBtX3BPd25lci0+bV9mVHJhY2tQb3MgPSBmUG9zOw0KLSAgICAgICAgbV9wT3duZXItPk9uU2Nyb2xsKEZXTF9TQ0JDT0RFX1RyYWNrUG9zLCBmUG9zKTsNCi0gICAgfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6RG9Nb3VzZUxlYXZlKGludDMyX3QgaUl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0YXRlKSB7DQorICBpZiAoaVN0YXRlID09IEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWw7DQorICBtX3BPd25lci0+UmVwYWludCgmcnRJdGVtKTsNCiB9DQotdm9pZCBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpEb01vdXNlTGVhdmUoaW50MzJfdCBpSXRlbSwgY29uc3QgQ0ZYX1JlY3RGICZydEl0ZW0sIGludDMyX3QgJmlTdGF0ZSkNCi17DQotICAgIGlmIChpU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaVN0YXRlID0gRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsOw0KLSAgICBtX3BPd25lci0+UmVwYWludCgmcnRJdGVtKTsNCi19DQotdm9pZCBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpEb01vdXNlSG92ZXIoaW50MzJfdCBpSXRlbSwgY29uc3QgQ0ZYX1JlY3RGICZydEl0ZW0sIGludDMyX3QgJmlTdGF0ZSkNCi17DQotICAgIGlmIChpU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TQ0JfSG92ZXJlZCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU0NCX0hvdmVyZWQ7DQotICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEl0ZW0pOw0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6RG9Nb3VzZUhvdmVyKGludDMyX3QgaUl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0YXRlKSB7DQorICBpZiAoaVN0YXRlID09IEZXTF9QQVJUU1RBVEVfU0NCX0hvdmVyZWQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaVN0YXRlID0gRldMX1BBUlRTVEFURV9TQ0JfSG92ZXJlZDsNCisgIG1fcE93bmVyLT5SZXBhaW50KCZydEl0ZW0pOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbmltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbmltcC5jcHAKaW5kZXggYzhiZTczMi4uMjhkM2JlNCAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3NwaW5idXR0b25pbXAuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9zcGluYnV0dG9uaW1wLmNwcApAQCAtOSw0NDIgKzksNDMzIEBACiAjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX3NwaW5idXR0b25pbXAuaCINCi0jZGVmaW5lICBGV0xfU1BOX01pbldpZHRoICAgMTgNCi0jZGVmaW5lICBGV0xfU1BOX01pbkhlaWdodCAgMzINCi0jZGVmaW5lICBGV0xfU1BJTl9FbGFwc2UJMjAwDQotSUZXTF9TcGluQnV0dG9uKiBJRldMX1NwaW5CdXR0b246OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gbmV3IElGV0xfU3BpbkJ1dHRvbjsNCisjZGVmaW5lIEZXTF9TUE5fTWluV2lkdGggMTgNCisjZGVmaW5lIEZXTF9TUE5fTWluSGVpZ2h0IDMyDQorI2RlZmluZSBGV0xfU1BJTl9FbGFwc2UgMjAwDQorSUZXTF9TcGluQnV0dG9uKiBJRldMX1NwaW5CdXR0b246OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgSUZXTF9TcGluQnV0dG9uOw0KIH0NCi1JRldMX1NwaW5CdXR0b246OklGV0xfU3BpbkJ1dHRvbigpDQotew0KK0lGV0xfU3BpbkJ1dHRvbjo6SUZXTF9TcGluQnV0dG9uKCkgew0KKyAgbV9wRGF0YSA9IE5VTEw7DQorfQ0KK0lGV0xfU3BpbkJ1dHRvbjo6fklGV0xfU3BpbkJ1dHRvbigpIHsNCisgIGlmIChtX3BEYXRhKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9TcGluQnV0dG9uSW1wKiltX3BEYXRhOw0KICAgICBtX3BEYXRhID0gTlVMTDsNCisgIH0NCiB9DQotSUZXTF9TcGluQnV0dG9uOjp+SUZXTF9TcGluQnV0dG9uKCkNCi17DQotICAgIGlmIChtX3BEYXRhKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfU3BpbkJ1dHRvbkltcCopbV9wRGF0YTsNCi0gICAgICAgIG1fcERhdGEgPSBOVUxMOw0KK0ZXTF9FUlIgSUZXTF9TcGluQnV0dG9uOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9TcGluQnV0dG9uSW1wOw0KKyAgKChDRldMX1NwaW5CdXR0b25JbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX1NwaW5CdXR0b25JbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9TcGluQnV0dG9uOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfU3BpbkJ1dHRvbkltcChwcm9wZXJ0aWVzKTsNCisgICgoQ0ZXTF9TcGluQnV0dG9uSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9TcGluQnV0dG9uSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSIElGV0xfU3BpbkJ1dHRvbjo6RW5hYmxlQnV0dG9uKEZYX0JPT0wgYkVuYWJsZSwgRlhfQk9PTCBiVXApIHsNCisgIHJldHVybiAoKENGV0xfU3BpbkJ1dHRvbkltcCopbV9wRGF0YSktPkVuYWJsZUJ1dHRvbihiRW5hYmxlLCBiVXApOw0KK30NCitGWF9CT09MIElGV0xfU3BpbkJ1dHRvbjo6SXNCdXR0b25FbmFibGUoRlhfQk9PTCBiVXApIHsNCisgIHJldHVybiAoKENGV0xfU3BpbkJ1dHRvbkltcCopbV9wRGF0YSktPklzQnV0dG9uRW5hYmxlKGJVcCk7DQorfQ0KK0NGV0xfU3BpbkJ1dHRvbkltcDo6Q0ZXTF9TcGluQnV0dG9uSW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKSwNCisgICAgICBtX2R3VXBTdGF0ZShGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwpLA0KKyAgICAgIG1fZHdEblN0YXRlKEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCksDQorICAgICAgbV9iTEJ1dHRvbkR3bihGQUxTRSksDQorICAgICAgbV9pQnV0dG9uSW5kZXgoMCksDQorICAgICAgbV9oVGltZXIoTlVMTCkgew0KKyAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgbV9ydFVwQnV0dG9uLlJlc2V0KCk7DQorICBtX3J0RG5CdXR0b24uUmVzZXQoKTsNCisgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgfD0gRldMX1NUWUxFRVhFX1NQQl9WZXJ0Ow0KK30NCitDRldMX1NwaW5CdXR0b25JbXA6OkNGV0xfU3BpbkJ1dHRvbkltcCgNCisgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlciksDQorICAgICAgbV9kd1VwU3RhdGUoRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsKSwNCisgICAgICBtX2R3RG5TdGF0ZShGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwpLA0KKyAgICAgIG1fYkxCdXR0b25Ed24oRkFMU0UpLA0KKyAgICAgIG1faUJ1dHRvbkluZGV4KDApLA0KKyAgICAgIG1faFRpbWVyKE5VTEwpIHsNCisgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgIG1fcnRVcEJ1dHRvbi5SZXNldCgpOw0KKyAgbV9ydERuQnV0dG9uLlJlc2V0KCk7DQorICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzIHw9IEZXTF9TVFlMRUVYRV9TUEJfVmVydDsNCit9DQorQ0ZXTF9TcGluQnV0dG9uSW1wOjp+Q0ZXTF9TcGluQnV0dG9uSW1wKCkge30NCitGV0xfRVJSIENGV0xfU3BpbkJ1dHRvbkltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICB3c0NsYXNzID0gRldMX0NMQVNTX1NwaW5CdXR0b247DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfU3BpbkJ1dHRvbkltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBGV0xfQ0xBU1NIQVNIX1NwaW5CdXR0b247DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TcGluQnV0dG9uSW1wOjpJbml0aWFsaXplKCkgew0KKyAgX0ZXTF9FUlJfQ0hFQ0tfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGUodGhpcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TcGluQnV0dG9uSW1wOjpGaW5hbGl6ZSgpIHsNCisgIGlmIChtX3BEZWxlZ2F0ZSkgew0KKyAgICBkZWxldGUgKENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCisgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfU3BpbkJ1dHRvbkltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBpZiAoYkF1dG9TaXplKSB7DQorICAgIHJlY3QuU2V0KDAsIDAsIEZXTF9TUE5fTWluV2lkdGgsIEZXTF9TUE5fTWluSGVpZ2h0KTsNCisgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NwaW5CdXR0b25JbXA6OlVwZGF0ZSgpIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWEVfU1BCX1ZlcnQpIHsNCisgICAgbV9ydFVwQnV0dG9uLlNldChtX3J0Q2xpZW50LnRvcCwgbV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQuaGVpZ2h0IC8gMik7DQorICAgIG1fcnREbkJ1dHRvbi5TZXQobV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LnRvcCArIG1fcnRDbGllbnQuaGVpZ2h0IC8gMiwNCisgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LndpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCAvIDIpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9ydFVwQnV0dG9uLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQudG9wLCBtX3J0Q2xpZW50LndpZHRoIC8gMiwNCisgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LmhlaWdodCk7DQorICAgIG1fcnREbkJ1dHRvbi5TZXQobV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAvIDIsIG1fcnRDbGllbnQudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGggLyAyLCBtX3J0Q2xpZW50LmhlaWdodCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfU3BpbkJ1dHRvbkltcDo6SGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGlmIChtX3J0Q2xpZW50LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCisgIH0NCisgIGlmIChIYXNCb3JkZXIoKSAmJiAobV9ydENsaWVudC5Db250YWlucyhmeCwgZnkpKSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQm9yZGVyOw0KKyAgfQ0KKyAgaWYgKEhhc0VkZ2UoKSkgew0KKyAgICBDRlhfUmVjdEYgcnRFZGdlOw0KKyAgICBHZXRFZGdlUmVjdChydEVkZ2UpOw0KKyAgICBpZiAocnRFZGdlLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gRldMX1BBUlRfU1BCX0VkZ2U7DQogICAgIH0NCisgIH0NCisgIGlmIChtX3J0VXBCdXR0b24uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfU1BCX1VwQnV0dG9uOw0KKyAgfQ0KKyAgaWYgKG1fcnREbkJ1dHRvbi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9TUEJfRG93bkJ1dHRvbjsNCisgIH0NCisgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KIH0NCi1GV0xfRVJSIElGV0xfU3BpbkJ1dHRvbjo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1NwaW5CdXR0b25JbXA7DQotICAgICgoQ0ZXTF9TcGluQnV0dG9uSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KLSAgICByZXR1cm4gKChDRldMX1NwaW5CdXR0b25JbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorRldMX0VSUiBDRldMX1NwaW5CdXR0b25JbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBDRlhfUmVjdEYgcnRDbGlwKG1fcnRDbGllbnQpOw0KKyAgaWYgKHBNYXRyaXggIT0gTlVMTCkgew0KKyAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQorICB9DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX1NQQl9Cb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfU1BCX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBEcmF3VXBCdXR0b24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd0Rvd25CdXR0b24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIElGV0xfU3BpbkJ1dHRvbjo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfU3BpbkJ1dHRvbkltcChwcm9wZXJ0aWVzKTsNCi0gICAgKChDRldMX1NwaW5CdXR0b25JbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfU3BpbkJ1dHRvbkltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCi19DQotRldMX0VSUiBJRldMX1NwaW5CdXR0b246OkVuYWJsZUJ1dHRvbihGWF9CT09MIGJFbmFibGUsIEZYX0JPT0wgYlVwKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9TcGluQnV0dG9uSW1wKiltX3BEYXRhKS0+RW5hYmxlQnV0dG9uKGJFbmFibGUsIGJVcCk7DQotfQ0KLUZYX0JPT0wgSUZXTF9TcGluQnV0dG9uOjpJc0J1dHRvbkVuYWJsZShGWF9CT09MIGJVcCkNCi17DQotICAgIHJldHVybiAoKENGV0xfU3BpbkJ1dHRvbkltcCopbV9wRGF0YSktPklzQnV0dG9uRW5hYmxlKGJVcCk7DQotfQ0KLUNGV0xfU3BpbkJ1dHRvbkltcDo6Q0ZXTF9TcGluQnV0dG9uSW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIgKQ0KLSAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlcikNCi0gICAgLCBtX2R3VXBTdGF0ZShGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwpDQotICAgICwgbV9kd0RuU3RhdGUoRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsKQ0KLSAgICAsIG1fYkxCdXR0b25Ed24oRkFMU0UpDQotICAgICwgbV9pQnV0dG9uSW5kZXgoMCkNCi0gICAgLCBtX2hUaW1lcihOVUxMKQ0KLXsNCi0gICAgbV9ydENsaWVudC5SZXNldCgpOw0KLSAgICBtX3J0VXBCdXR0b24uUmVzZXQoKTsNCi0gICAgbV9ydERuQnV0dG9uLlJlc2V0KCk7DQotICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgfD0gRldMX1NUWUxFRVhFX1NQQl9WZXJ0Ow0KLX0NCi1DRldMX1NwaW5CdXR0b25JbXA6OkNGV0xfU3BpbkJ1dHRvbkltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpDQotICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKQ0KLSAgICAsIG1fZHdVcFN0YXRlKEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCkNCi0gICAgLCBtX2R3RG5TdGF0ZShGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwpDQotICAgICwgbV9iTEJ1dHRvbkR3bihGQUxTRSkNCi0gICAgLCBtX2lCdXR0b25JbmRleCgwKQ0KLSAgICAsIG1faFRpbWVyKE5VTEwpDQotew0KLSAgICBtX3J0Q2xpZW50LlJlc2V0KCk7DQotICAgIG1fcnRVcEJ1dHRvbi5SZXNldCgpOw0KLSAgICBtX3J0RG5CdXR0b24uUmVzZXQoKTsNCi0gICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyB8PSBGV0xfU1RZTEVFWEVfU1BCX1ZlcnQ7DQotfQ0KLUNGV0xfU3BpbkJ1dHRvbkltcDo6fkNGV0xfU3BpbkJ1dHRvbkltcCgpDQotew0KLX0NCi1GV0xfRVJSCUNGV0xfU3BpbkJ1dHRvbkltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgd3NDbGFzcyA9IEZXTF9DTEFTU19TcGluQnV0dG9uOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0RXT1JEIENGV0xfU3BpbkJ1dHRvbkltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gRldMX0NMQVNTSEFTSF9TcGluQnV0dG9uOw0KLX0NCi1GV0xfRVJSCUNGV0xfU3BpbkJ1dHRvbkltcDo6SW5pdGlhbGl6ZSgpDQotew0KLSAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKikgRlhfTkVXIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlKHRoaXMpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9TcGluQnV0dG9uSW1wOjpGaW5hbGl6ZSgpDQotew0KLSAgICBpZiAoIG1fcERlbGVnYXRlKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlKiltX3BEZWxlZ2F0ZTsNCi0gICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9TcGluQnV0dG9uSW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpDQotew0KLSAgICBpZiAoYkF1dG9TaXplKSB7DQotICAgICAgICByZWN0LlNldCgwLCAwLCBGV0xfU1BOX01pbldpZHRoLCBGV0xfU1BOX01pbkhlaWdodCk7DQotICAgICAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUglDRldMX1NwaW5CdXR0b25JbXA6OlVwZGF0ZSgpDQotew0KLSAgICBpZiAoSXNMb2NrZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCi0gICAgfQ0KLSAgICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYRV9TUEJfVmVydCkgew0KLSAgICAgICAgbV9ydFVwQnV0dG9uLlNldChtX3J0Q2xpZW50LnRvcCwgbV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LndpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCAvIDIpOw0KLSAgICAgICAgbV9ydERuQnV0dG9uLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLyAyLCBtX3J0Q2xpZW50LndpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCAvIDIpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9ydFVwQnV0dG9uLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQudG9wLCBtX3J0Q2xpZW50LndpZHRoIC8gMiwgbV9ydENsaWVudC5oZWlnaHQpOw0KLSAgICAgICAgbV9ydERuQnV0dG9uLlNldChtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC8gMiwgbV9ydENsaWVudC50b3AsIG1fcnRDbGllbnQud2lkdGggLyAyLCBtX3J0Q2xpZW50LmhlaWdodCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9EV09SRCBDRldMX1NwaW5CdXR0b25JbXA6OkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKG1fcnRDbGllbnQuQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCi0gICAgfQ0KLSAgICBpZiAoSGFzQm9yZGVyKCkgJiYgKG1fcnRDbGllbnQuQ29udGFpbnMoZngsIGZ5KSkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Cb3JkZXI7DQotICAgIH0NCi0gICAgaWYgKEhhc0VkZ2UoKSkgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0RWRnZTsNCi0gICAgICAgIEdldEVkZ2VSZWN0KHJ0RWRnZSk7DQotICAgICAgICBpZiAocnRFZGdlLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRldMX1BBUlRfU1BCX0VkZ2U7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKG1fcnRVcEJ1dHRvbi5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfU1BCX1VwQnV0dG9uOw0KLSAgICB9DQotICAgIGlmIChtX3J0RG5CdXR0b24uQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1NQQl9Eb3duQnV0dG9uOw0KLSAgICB9DQotICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KLX0NCi1GV0xfRVJSCUNGV0xfU3BpbkJ1dHRvbkltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBDRlhfUmVjdEYgcnRDbGlwKG1fcnRDbGllbnQpOw0KLSAgICBpZiAocE1hdHJpeCAhPSBOVUxMKSB7DQotICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQotICAgIH0NCi0gICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KLSAgICBpZiAoSGFzQm9yZGVyKCkpIHsNCi0gICAgICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9TUEJfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIGlmIChIYXNFZGdlKCkpIHsNCi0gICAgICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfU1BCX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIH0NCi0gICAgRHJhd1VwQnV0dG9uKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCi0gICAgRHJhd0Rvd25CdXR0b24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLWludDMyX3QgQ0ZXTF9TcGluQnV0dG9uSW1wOjpSdW4oRldMX0hUSU1FUiBoVGltZXIpDQotew0KLSAgICBpZiAobV9oVGltZXIpIHsNCi0gICAgICAgIENGV0xfRXZ0U3BiQ2xpY2sgd21Qb3NDaGFuZ2VkOw0KLSAgICAgICAgd21Qb3NDaGFuZ2VkLm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgIHdtUG9zQ2hhbmdlZC5tX2JVcCA9IG1faUJ1dHRvbkluZGV4ID09IDA7DQotICAgICAgICBEaXNwYXRjaEV2ZW50KCZ3bVBvc0NoYW5nZWQpOw0KLSAgICB9DQotICAgIHJldHVybiAxOw0KLX0NCi1GV0xfRVJSIENGV0xfU3BpbkJ1dHRvbkltcDo6RW5hYmxlQnV0dG9uKEZYX0JPT0wgYkVuYWJsZSwgRlhfQk9PTCBiVXApDQotew0KLSAgICBpZiAoYlVwKSB7DQotICAgICAgICBpZiAoYkVuYWJsZSkgew0KLSAgICAgICAgICAgIG1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX2R3VXBTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX0Rpc2FibGVkOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKGJFbmFibGUpIHsNCi0gICAgICAgICAgICBtX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9kd0RuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9EaXNhYmxlZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9TcGluQnV0dG9uSW1wOjpJc0J1dHRvbkVuYWJsZShGWF9CT09MIGJVcCkNCi17DQotICAgIGlmIChiVXApIHsNCi0gICAgICAgIHJldHVybiAobV9kd1VwU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfRGlzYWJsZWQpOw0KLSAgICB9DQotICAgIHJldHVybiAobV9kd0RuU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfRGlzYWJsZWQpOw0KLX0NCi12b2lkIENGV0xfU3BpbkJ1dHRvbkltcDo6RHJhd1VwQnV0dG9uKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCi0gICAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9TUEJfVXBCdXR0b247DQotICAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBtX2R3VXBTdGF0ZSArIDE7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0VXBCdXR0b247DQotICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQotfQ0KLXZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wOjpEcmF3RG93bkJ1dHRvbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQotICAgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfU1BCX0Rvd25CdXR0b247DQotICAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBtX2R3RG5TdGF0ZSArIDE7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0RG5CdXR0b247DQotICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQotfQ0KLUNGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZShDRldMX1NwaW5CdXR0b25JbXAgKnBPd25lcikNCi0gICAgOiBtX3BPd25lcihwT3duZXIpDQotew0KLX0NCi1pbnQzMl90IENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCi0gICAgaW50MzJfdCBpUmV0ID0gMTsNCi0gICAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCi0gICAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KLSAgICAgICAgICAgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KLSAgICAgICAgICAgICAgICBDRldMX01zZ01vdXNlICpwTXNnID0gKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlOw0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQotICAgICAgICAgICAgICAgIHN3aXRjaCAoZHdDbWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VNb3ZlKHBNc2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTW91c2VMZWF2ZShwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KLSAgICAgICAgICAgICAgICBDRldMX01zZ0tleSAqcEtleSA9IChDRldMX01zZ0tleSopcE1lc3NhZ2U7DQotICAgICAgICAgICAgICAgIGlmIChwS2V5LT5tX2R3Q21kID09IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KLSAgICAgICAgICAgICAgICAgICAgT25LZXlEb3duKChDRldMX01zZ0tleSopcEtleSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICBpUmV0ID0gMDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLSAgICByZXR1cm4gaVJldDsNCi19DQotRldMX0VSUglDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQotfQ0KLXZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0ICkNCi17DQotICAgIGlmIChiU2V0KSB7DQotICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSAoRldMX1dHVFNUQVRFX0ZvY3VzZWQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfihGV0xfV0dUU1RBVEVfRm9jdXNlZCk7DQotICAgIH0NCi0gICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCi19DQotdm9pZCBDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgbV9wT3duZXItPm1fYkxCdXR0b25Ed24gPSBUUlVFOw0KLSAgICBtX3BPd25lci0+U2V0R3JhYihUUlVFKTsNCi0gICAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KLSAgICBGWF9CT09MIGJVcFByZXNzID0gKG1fcE93bmVyLT5tX3J0VXBCdXR0b24uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoVFJVRSkpOw0KLSAgICBGWF9CT09MIGJEblByZXNzID0gKG1fcE93bmVyLT5tX3J0RG5CdXR0b24uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpKTsNCi0gICAgaWYgKCFiVXBQcmVzcyAmJiAhYkRuUHJlc3MpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoYlVwUHJlc3MpIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX2lCdXR0b25JbmRleCA9IDA7DQotICAgICAgICBtX3BPd25lci0+bV9kd1VwU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9QcmVzc2VkOw0KLSAgICB9DQotICAgIGlmIChiRG5QcmVzcykgew0KLSAgICAgICAgbV9wT3duZXItPm1faUJ1dHRvbkluZGV4ID0gMTsNCi0gICAgICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX1ByZXNzZWQ7DQotICAgIH0NCitpbnQzMl90IENGV0xfU3BpbkJ1dHRvbkltcDo6UnVuKEZXTF9IVElNRVIgaFRpbWVyKSB7DQorICBpZiAobV9oVGltZXIpIHsNCiAgICAgQ0ZXTF9FdnRTcGJDbGljayB3bVBvc0NoYW5nZWQ7DQotICAgIHdtUG9zQ2hhbmdlZC5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KLSAgICB3bVBvc0NoYW5nZWQubV9iVXAgPSBiVXBQcmVzczsNCi0gICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJndtUG9zQ2hhbmdlZCk7DQotICAgIG1fcE93bmVyLT5SZXBhaW50KGJVcFByZXNzID8gJm1fcE93bmVyLT5tX3J0VXBCdXR0b24gOiAmbV9wT3duZXItPm1fcnREbkJ1dHRvbik7DQotICAgIG1fcE93bmVyLT5tX2hUaW1lciA9IEZXTF9TdGFydFRpbWVyKG1fcE93bmVyLCBGV0xfU1BJTl9FbGFwc2UpOw0KKyAgICB3bVBvc0NoYW5nZWQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICB3bVBvc0NoYW5nZWQubV9iVXAgPSBtX2lCdXR0b25JbmRleCA9PSAwOw0KKyAgICBEaXNwYXRjaEV2ZW50KCZ3bVBvc0NoYW5nZWQpOw0KKyAgfQ0KKyAgcmV0dXJuIDE7DQogfQ0KLXZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX1NQQl9EaXNhYmxlZCkgew0KLSAgICAgICAgcmV0dXJuOw0KK0ZXTF9FUlIgQ0ZXTF9TcGluQnV0dG9uSW1wOjpFbmFibGVCdXR0b24oRlhfQk9PTCBiRW5hYmxlLCBGWF9CT09MIGJVcCkgew0KKyAgaWYgKGJVcCkgew0KKyAgICBpZiAoYkVuYWJsZSkgew0KKyAgICAgIG1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfRGlzYWJsZWQ7DQogICAgIH0NCi0gICAgbV9wT3duZXItPm1fYkxCdXR0b25Ed24gPSBGQUxTRTsNCi0gICAgbV9wT3duZXItPlNldEdyYWIoRkFMU0UpOw0KLSAgICBtX3BPd25lci0+U2V0Rm9jdXMoRkFMU0UpOw0KLSAgICBpZiAobV9wT3duZXItPm1faFRpbWVyKSB7DQotICAgICAgICBGV0xfU3RvcFRpbWVyKG1fcE93bmVyLT5tX2hUaW1lcik7DQotICAgICAgICBtX3BPd25lci0+bV9oVGltZXIgPSBOVUxMOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKGJFbmFibGUpIHsNCisgICAgICBtX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX0Rpc2FibGVkOw0KICAgICB9DQotICAgIEZYX0JPT0wgYlJlcGFpbnQgPSBGQUxTRTsNCi0gICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCi0gICAgaWYgKG1fcE93bmVyLT5tX2R3VXBTdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NQQl9QcmVzc2VkICYmIG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShUUlVFKSkgew0KLSAgICAgICAgbV9wT3duZXItPm1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfU3BpbkJ1dHRvbkltcDo6SXNCdXR0b25FbmFibGUoRlhfQk9PTCBiVXApIHsNCisgIGlmIChiVXApIHsNCisgICAgcmV0dXJuIChtX2R3VXBTdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9EaXNhYmxlZCk7DQorICB9DQorICByZXR1cm4gKG1fZHdEblN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX0Rpc2FibGVkKTsNCit9DQordm9pZCBDRldMX1NwaW5CdXR0b25JbXA6OkRyYXdVcEJ1dHRvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfU1BCX1VwQnV0dG9uOw0KKyAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBtX2R3VXBTdGF0ZSArIDE7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRVcEJ1dHRvbjsNCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorfQ0KK3ZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wOjpEcmF3RG93bkJ1dHRvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCisgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX1NQQl9Eb3duQnV0dG9uOw0KKyAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBtX2R3RG5TdGF0ZSArIDE7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnREbkJ1dHRvbjsNCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorfQ0KK0NGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZSgNCisgICAgQ0ZXTF9TcGluQnV0dG9uSW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQorICBpbnQzMl90IGlSZXQgPSAxOw0KKyAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6DQorICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQorICAgICAgT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KKyAgICAgIENGV0xfTXNnTW91c2UqIHBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KKyAgICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQorICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICAgIE9uTW91c2VMZWF2ZShwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7fQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgIENGV0xfTXNnS2V5KiBwS2V5ID0gKENGV0xfTXNnS2V5KilwTWVzc2FnZTsNCisgICAgICBpZiAocEtleS0+bV9kd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24pIHsNCisgICAgICAgIE9uS2V5RG93bigoQ0ZXTF9Nc2dLZXkqKXBLZXkpOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7DQorICAgICAgaVJldCA9IDA7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgcmV0dXJuIGlSZXQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAoYlNldCkgew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSAoRldMX1dHVFNUQVRFX0ZvY3VzZWQpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfihGV0xfV0dUU1RBVEVfRm9jdXNlZCk7DQorICB9DQorICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KK30NCit2b2lkIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIG1fcE93bmVyLT5tX2JMQnV0dG9uRHduID0gVFJVRTsNCisgIG1fcE93bmVyLT5TZXRHcmFiKFRSVUUpOw0KKyAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIEZYX0JPT0wgYlVwUHJlc3MgPSAobV9wT3duZXItPm1fcnRVcEJ1dHRvbi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoVFJVRSkpOw0KKyAgRlhfQk9PTCBiRG5QcmVzcyA9IChtX3BPd25lci0+bV9ydERuQnV0dG9uLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpICYmDQorICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShGQUxTRSkpOw0KKyAgaWYgKCFiVXBQcmVzcyAmJiAhYkRuUHJlc3MpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGJVcFByZXNzKSB7DQorICAgIG1fcE93bmVyLT5tX2lCdXR0b25JbmRleCA9IDA7DQorICAgIG1fcE93bmVyLT5tX2R3VXBTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX1ByZXNzZWQ7DQorICB9DQorICBpZiAoYkRuUHJlc3MpIHsNCisgICAgbV9wT3duZXItPm1faUJ1dHRvbkluZGV4ID0gMTsNCisgICAgbV9wT3duZXItPm1fZHdEblN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfUHJlc3NlZDsNCisgIH0NCisgIENGV0xfRXZ0U3BiQ2xpY2sgd21Qb3NDaGFuZ2VkOw0KKyAgd21Qb3NDaGFuZ2VkLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICB3bVBvc0NoYW5nZWQubV9iVXAgPSBiVXBQcmVzczsNCisgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZ3bVBvc0NoYW5nZWQpOw0KKyAgbV9wT3duZXItPlJlcGFpbnQoYlVwUHJlc3MgPyAmbV9wT3duZXItPm1fcnRVcEJ1dHRvbg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmbV9wT3duZXItPm1fcnREbkJ1dHRvbik7DQorICBtX3BPd25lci0+bV9oVGltZXIgPSBGV0xfU3RhcnRUaW1lcihtX3BPd25lciwgRldMX1NQSU5fRWxhcHNlKTsNCit9DQordm9pZCBDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9TUEJfRGlzYWJsZWQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wT3duZXItPm1fYkxCdXR0b25Ed24gPSBGQUxTRTsNCisgIG1fcE93bmVyLT5TZXRHcmFiKEZBTFNFKTsNCisgIG1fcE93bmVyLT5TZXRGb2N1cyhGQUxTRSk7DQorICBpZiAobV9wT3duZXItPm1faFRpbWVyKSB7DQorICAgIEZXTF9TdG9wVGltZXIobV9wT3duZXItPm1faFRpbWVyKTsNCisgICAgbV9wT3duZXItPm1faFRpbWVyID0gTlVMTDsNCisgIH0NCisgIEZYX0JPT0wgYlJlcGFpbnQgPSBGQUxTRTsNCisgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICBpZiAobV9wT3duZXItPm1fZHdVcFN0YXRlID09IEZXTF9QQVJUU1RBVEVfU1BCX1ByZXNzZWQgJiYNCisgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoVFJVRSkpIHsNCisgICAgbV9wT3duZXItPm1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgICBiUmVwYWludCA9IFRSVUU7DQorICAgIHJ0SW52YWxpZGF0ZSA9IG1fcE93bmVyLT5tX3J0VXBCdXR0b247DQorICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NQQl9QcmVzc2VkICYmDQorICAgICAgICAgICAgIG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShGQUxTRSkpIHsNCisgICAgbV9wT3duZXItPm1fZHdEblN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgICBiUmVwYWludCA9IFRSVUU7DQorICAgIHJ0SW52YWxpZGF0ZSA9IG1fcE93bmVyLT5tX3J0RG5CdXR0b247DQorICB9DQorICBpZiAoYlJlcGFpbnQpIHsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBpZiAobV9wT3duZXItPm1fYkxCdXR0b25Ed24pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmVwYWludCA9IEZBTFNFOw0KKyAgQ0ZYX1JlY3RGIHJ0SW52bGlkYXRlOw0KKyAgcnRJbnZsaWRhdGUuUmVzZXQoKTsNCisgIGlmIChtX3BPd25lci0+bV9ydFVwQnV0dG9uLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIGlmIChtX3BPd25lci0+SXNCdXR0b25FbmFibGUoVFJVRSkpIHsNCisgICAgICBpZiAobV9wT3duZXItPm1fZHdVcFN0YXRlID09IEZXTF9QQVJUU1RBVEVfU1BCX0hvdmVyZWQpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX2R3VXBTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX0hvdmVyZWQ7DQogICAgICAgICBiUmVwYWludCA9IFRSVUU7DQotICAgICAgICBydEludmFsaWRhdGUgPSBtX3BPd25lci0+bV9ydFVwQnV0dG9uOw0KLSAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NQQl9QcmVzc2VkICYmIG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShGQUxTRSkpIHsNCisgICAgICAgIHJ0SW52bGlkYXRlID0gbV9wT3duZXItPm1fcnRVcEJ1dHRvbjsNCisgICAgICB9DQorICAgICAgaWYgKG1fcE93bmVyLT5tX2R3RG5TdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwgJiYNCisgICAgICAgICAgbV9wT3duZXItPklzQnV0dG9uRW5hYmxlKEZBTFNFKSkgew0KICAgICAgICAgbV9wT3duZXItPm1fZHdEblN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgICAgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgICAgIHJ0SW52bGlkYXRlLlVuaW9uKG1fcE93bmVyLT5tX3J0RG5CdXR0b24pOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3BPd25lci0+bV9ydERuQnV0dG9uOw0KKyAgICAgICAgfQ0KICAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KLSAgICAgICAgcnRJbnZhbGlkYXRlID0gbV9wT3duZXItPm1fcnREbkJ1dHRvbjsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKGJSZXBhaW50KSB7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgICAgaWYgKCFtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpKSB7DQorICAgICAgbV9wT3duZXItPkVuYWJsZUJ1dHRvbihGQUxTRSwgRkFMU0UpOw0KICAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KLSAgICBpZiAobV9wT3duZXItPm1fYkxCdXR0b25Ed24pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQotICAgIENGWF9SZWN0RiBydEludmxpZGF0ZTsNCi0gICAgcnRJbnZsaWRhdGUuUmVzZXQoKTsNCi0gICAgaWYgKG1fcE93bmVyLT5tX3J0VXBCdXR0b24uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgIGlmIChtX3BPd25lci0+SXNCdXR0b25FbmFibGUoVFJVRSkpIHsNCi0gICAgICAgICAgICBpZiAobV9wT3duZXItPm1fZHdVcFN0YXRlID09IEZXTF9QQVJUU1RBVEVfU1BCX0hvdmVyZWQpIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfSG92ZXJlZDsNCi0gICAgICAgICAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBydEludmxpZGF0ZSA9IG1fcE93bmVyLT5tX3J0VXBCdXR0b247DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChtX3BPd25lci0+bV9kd0RuU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsICYmIG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShGQUxTRSkpIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fZHdEblN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KLSAgICAgICAgICAgICAgICBpZiAoYlJlcGFpbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJ0SW52bGlkYXRlLlVuaW9uKG1fcE93bmVyLT5tX3J0RG5CdXR0b24pOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3BPd25lci0+bV9ydERuQnV0dG9uOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoIW1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShGQUxTRSkpIHsNCi0gICAgICAgICAgICBtX3BPd25lci0+RW5hYmxlQnV0dG9uKEZBTFNFLCBGQUxTRSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcnREbkJ1dHRvbi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KLSAgICAgICAgaWYgKG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShGQUxTRSkpIHsNCi0gICAgICAgICAgICBpZiAobV9wT3duZXItPm1fZHdEblN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX0hvdmVyZWQpIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fZHdEblN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfSG92ZXJlZDsNCi0gICAgICAgICAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBydEludmxpZGF0ZSA9IG1fcE93bmVyLT5tX3J0RG5CdXR0b247DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChtX3BPd25lci0+bV9kd1VwU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsICYmIG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShUUlVFKSkgew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9kd1VwU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWw7DQotICAgICAgICAgICAgICAgIGlmIChiUmVwYWludCkgew0KLSAgICAgICAgICAgICAgICAgICAgcnRJbnZsaWRhdGUuVW5pb24obV9wT3duZXItPm1fcnRVcEJ1dHRvbik7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBydEludmxpZGF0ZSA9IG1fcE93bmVyLT5tX3J0VXBCdXR0b247DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9kd1VwU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsIHx8IG1fcE93bmVyLT5tX2R3RG5TdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwpIHsNCi0gICAgICAgIGlmIChtX3BPd25lci0+bV9kd1VwU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsKSB7DQotICAgICAgICAgICAgbV9wT3duZXItPm1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KLSAgICAgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCi0gICAgICAgICAgICBydEludmxpZGF0ZSA9IG1fcE93bmVyLT5tX3J0VXBCdXR0b247DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wT3duZXItPm1fZHdEblN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCi0gICAgICAgICAgICBpZiAoYlJlcGFpbnQpIHsNCi0gICAgICAgICAgICAgICAgcnRJbnZsaWRhdGUuVW5pb24obV9wT3duZXItPm1fcnREbkJ1dHRvbik7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3BPd25lci0+bV9ydERuQnV0dG9uOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBiUmVwYWludCA9IFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGJSZXBhaW50KSB7DQotICAgICAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZsaWRhdGUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTXNnKTsNCi0gICAgaWYgKG1fcE93bmVyLT5tX2R3VXBTdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwgJiYgbV9wT3duZXItPklzQnV0dG9uRW5hYmxlKFRSVUUpKSB7DQorICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX3J0RG5CdXR0b24uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgaWYgKG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShGQUxTRSkpIHsNCisgICAgICBpZiAobV9wT3duZXItPm1fZHdEblN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX0hvdmVyZWQpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX0hvdmVyZWQ7DQorICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgICBydEludmxpZGF0ZSA9IG1fcE93bmVyLT5tX3J0RG5CdXR0b247DQorICAgICAgfQ0KKyAgICAgIGlmIChtX3BPd25lci0+bV9kd1VwU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsICYmDQorICAgICAgICAgIG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShUUlVFKSkgew0KICAgICAgICAgbV9wT3duZXItPm1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgICAgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgICAgIHJ0SW52bGlkYXRlLlVuaW9uKG1fcE93bmVyLT5tX3J0VXBCdXR0b24pOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3BPd25lci0+bV9ydFVwQnV0dG9uOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAobV9wT3duZXItPm1fZHdEblN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCAmJiBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpKSB7DQotICAgICAgICBtX3BPd25lci0+bV9kd0RuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWw7DQorICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2R3VXBTdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwgfHwNCisgICAgICAgICAgICAgbV9wT3duZXItPm1fZHdEblN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCkgew0KKyAgICBpZiAobV9wT3duZXItPm1fZHdVcFN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCkgew0KKyAgICAgIG1fcE93bmVyLT5tX2R3VXBTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgcnRJbnZsaWRhdGUgPSBtX3BPd25lci0+bV9ydFVwQnV0dG9uOw0KICAgICB9DQotICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgIGlmIChtX3BPd25lci0+bV9kd0RuU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsKSB7DQorICAgICAgbV9wT3duZXItPm1fZHdEblN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgICAgIGlmIChiUmVwYWludCkgew0KKyAgICAgICAgcnRJbnZsaWRhdGUuVW5pb24obV9wT3duZXItPm1fcnREbkJ1dHRvbik7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0SW52bGlkYXRlID0gbV9wT3duZXItPm1fcnREbkJ1dHRvbjsNCisgICAgICB9DQorICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICB9DQorICB9DQorICBpZiAoYlJlcGFpbnQpIHsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52bGlkYXRlKTsNCisgIH0NCiB9DQotdm9pZCBDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZTo6T25LZXlEb3duKENGV0xfTXNnS2V5ICpwTXNnKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCi0gICAgRlhfQk9PTCBiVXAgPSBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9VcCB8fCBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9MZWZ0Ow0KLSAgICBGWF9CT09MIGJEb3duID0gcE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfRG93biB8fCBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9SaWdodDsNCi0gICAgaWYgKCFiVXAgJiYgIWJEb3duKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfQk9PTCBiVXBFbmFibGUgPSBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoVFJVRSk7DQotICAgIEZYX0JPT0wgYkRvd25FbmFibGUgPSBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpOw0KLSAgICBpZiAoIWJVcEVuYWJsZSAmJiAhYkRvd25FbmFibGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRldMX0V2dFNwYkNsaWNrIHdtUG9zQ2hhbmdlZDsNCi0gICAgd21Qb3NDaGFuZ2VkLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQotICAgIHdtUG9zQ2hhbmdlZC5tX2JVcCA9IGJVcEVuYWJsZTsNCi0gICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJndtUG9zQ2hhbmdlZCk7DQotICAgIG1fcE93bmVyLT5SZXBhaW50KGJVcEVuYWJsZSA/ICZtX3BPd25lci0+bV9ydFVwQnV0dG9uIDogJm1fcE93bmVyLT5tX3J0RG5CdXR0b24pOw0KK3ZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBNc2cpOw0KKyAgaWYgKG1fcE93bmVyLT5tX2R3VXBTdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwgJiYNCisgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoVFJVRSkpIHsNCisgICAgbV9wT3duZXItPm1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX2R3RG5TdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwgJiYNCisgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpKSB7DQorICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgIH0NCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uS2V5RG93bihDRldMX01zZ0tleSogcE1zZykgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIEZYX0JPT0wgYlVwID0NCisgICAgICBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9VcCB8fCBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9MZWZ0Ow0KKyAgRlhfQk9PTCBiRG93biA9DQorICAgICAgcE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfRG93biB8fCBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9SaWdodDsNCisgIGlmICghYlVwICYmICFiRG93bikgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJVcEVuYWJsZSA9IG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShUUlVFKTsNCisgIEZYX0JPT0wgYkRvd25FbmFibGUgPSBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpOw0KKyAgaWYgKCFiVXBFbmFibGUgJiYgIWJEb3duRW5hYmxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGV0xfRXZ0U3BiQ2xpY2sgd21Qb3NDaGFuZ2VkOw0KKyAgd21Qb3NDaGFuZ2VkLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICB3bVBvc0NoYW5nZWQubV9iVXAgPSBiVXBFbmFibGU7DQorICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21Qb3NDaGFuZ2VkKTsNCisgIG1fcE93bmVyLT5SZXBhaW50KGJVcEVuYWJsZSA/ICZtX3BPd25lci0+bV9ydFVwQnV0dG9uDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmbV9wT3duZXItPm1fcnREbkJ1dHRvbik7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF90b29sdGlwY3RybGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfdG9vbHRpcGN0cmxpbXAuY3BwCmluZGV4IDkyMGJjYjcuLmEwYTlhODUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF90b29sdGlwY3RybGltcC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3Rvb2x0aXBjdHJsaW1wLmNwcApAQCAtMTEsMzI4ICsxMSwzMDQgQEAKICNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmgiDQogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfZm9ybWltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF90b29sdGlwY3RybGltcC5oIg0KLUlGV0xfVG9vbFRpcCAqSUZXTF9Ub29sVGlwOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBJRldMX1Rvb2xUaXA7DQorSUZXTF9Ub29sVGlwKiBJRldMX1Rvb2xUaXA6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgSUZXTF9Ub29sVGlwOw0KIH0NCi1GV0xfRVJSIElGV0xfVG9vbFRpcDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX1Rvb2xUaXBJbXAocE91dGVyKTsNCi0gICAgKChDRldMX1Rvb2xUaXBJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfVG9vbFRpcEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitGV0xfRVJSIElGV0xfVG9vbFRpcDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfVG9vbFRpcEltcChwT3V0ZXIpOw0KKyAgKChDRldMX1Rvb2xUaXBJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX1Rvb2xUaXBJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9Ub29sVGlwOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcikNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9Ub29sVGlwSW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9Ub29sVGlwSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KLSAgICByZXR1cm4gKChDRldMX1Rvb2xUaXBJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorRldMX0VSUiBJRldMX1Rvb2xUaXA6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9Ub29sVGlwSW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAoKENGV0xfVG9vbFRpcEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgIHJldHVybiAoKENGV0xfVG9vbFRpcEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCiB9DQotRldMX0VSUiBJRldMX1Rvb2xUaXA6OlNldEFuY2hvcihjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Ub29sVGlwSW1wKiltX3BEYXRhKS0+U2V0QW5jaG9yKCBydEFuY2hvcik7DQorRldMX0VSUiBJRldMX1Rvb2xUaXA6OlNldEFuY2hvcihjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yKSB7DQorICByZXR1cm4gKChDRldMX1Rvb2xUaXBJbXAqKW1fcERhdGEpLT5TZXRBbmNob3IocnRBbmNob3IpOw0KIH0NCi1GV0xfRVJSIElGV0xfVG9vbFRpcDo6U2hvdygpDQotew0KLSAgICByZXR1cm4gKChDRldMX1Rvb2xUaXBJbXAqKW1fcERhdGEpLT5TaG93KCk7DQorRldMX0VSUiBJRldMX1Rvb2xUaXA6OlNob3coKSB7DQorICByZXR1cm4gKChDRldMX1Rvb2xUaXBJbXAqKW1fcERhdGEpLT5TaG93KCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9Ub29sVGlwOjpIaWRlKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfVG9vbFRpcEltcCopbV9wRGF0YSktPkhpZGUoKTsNCitGV0xfRVJSIElGV0xfVG9vbFRpcDo6SGlkZSgpIHsNCisgIHJldHVybiAoKENGV0xfVG9vbFRpcEltcCopbV9wRGF0YSktPkhpZGUoKTsNCiB9DQotSUZXTF9Ub29sVGlwOjpJRldMX1Rvb2xUaXAoKQ0KLXsNCitJRldMX1Rvb2xUaXA6OklGV0xfVG9vbFRpcCgpIHsNCisgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX1Rvb2xUaXA6On5JRldMX1Rvb2xUaXAoKSB7DQorICBpZiAobV9wRGF0YSkgew0KKyAgICBkZWxldGUgKENGV0xfVG9vbFRpcEltcCopbV9wRGF0YTsNCiAgICAgbV9wRGF0YSA9IE5VTEw7DQorICB9DQogfQ0KLUlGV0xfVG9vbFRpcDo6fklGV0xfVG9vbFRpcCgpDQotew0KLSAgICBpZiAobV9wRGF0YSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX1Rvb2xUaXBJbXAqKW1fcERhdGE7DQotICAgICAgICBtX3BEYXRhID0gTlVMTDsNCi0gICAgfQ0KK0NGV0xfVG9vbFRpcEltcDo6Q0ZXTF9Ub29sVGlwSW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9Gb3JtSW1wKHBPdXRlciksDQorICAgICAgbV9iQnRuRG93bihGQUxTRSksDQorICAgICAgbV9kd1RUT1N0eWxlcyhGREVfVFRPU1RZTEVfU2luZ2xlTGluZSksDQorICAgICAgbV9pVFRPQWxpZ24oRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXIpLA0KKyAgICAgIG1faFRpbWVyU2hvdyhOVUxMKSwNCisgICAgICBtX2hUaW1lckhpZGUoTlVMTCksDQorICAgICAgbV9wVGltZXIoTlVMTCkgew0KKyAgbV9ydENsaWVudC5TZXQoMCwgMCwgMCwgMCk7DQorICBtX3J0Q2FwdGlvbi5TZXQoMCwgMCwgMCwgMCk7DQorICBtX3BUaW1lciA9IE5VTEw7DQorICBtX1RpbWVyU2hvdy5tX3BUb29sVGlwID0gdGhpczsNCisgIG1fVGltZXJIaWRlLm1fcFRvb2xUaXAgPSB0aGlzOw0KIH0NCi1DRldMX1Rvb2xUaXBJbXA6OkNGV0xfVG9vbFRpcEltcChJRldMX1dpZGdldCAqcE91dGVyICkNCi0gICAgOiBDRldMX0Zvcm1JbXAocE91dGVyKQ0KLSAgICAsIG1fYkJ0bkRvd24oRkFMU0UpDQotICAgICwgbV9kd1RUT1N0eWxlcyhGREVfVFRPU1RZTEVfU2luZ2xlTGluZSkNCi0gICAgLCBtX2lUVE9BbGlnbihGREVfVFRPQUxJR05NRU5UX0NlbnRlcikNCi0gICAgLCBtX2hUaW1lclNob3coTlVMTCkNCi0gICAgLCBtX2hUaW1lckhpZGUoTlVMTCkNCi0gICAgLCBtX3BUaW1lcihOVUxMKQ0KLXsNCi0gICAgbV9ydENsaWVudC5TZXQoMCwgMCwgMCwgMCk7DQotICAgIG1fcnRDYXB0aW9uLlNldCgwLCAwLCAwLCAwKTsNCitDRldMX1Rvb2xUaXBJbXA6OkNGV0xfVG9vbFRpcEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX0Zvcm1JbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX2JCdG5Eb3duKEZBTFNFKSwNCisgICAgICBtX2R3VFRPU3R5bGVzKEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKSwNCisgICAgICBtX2lUVE9BbGlnbihGREVfVFRPQUxJR05NRU5UX0NlbnRlciksDQorICAgICAgbV9oVGltZXJTaG93KE5VTEwpLA0KKyAgICAgIG1faFRpbWVySGlkZShOVUxMKSwNCisgICAgICBtX3BUaW1lcihOVUxMKSB7DQorICBtX3J0Q2xpZW50LlNldCgwLCAwLCAwLCAwKTsNCisgIG1fcnRDYXB0aW9uLlNldCgwLCAwLCAwLCAwKTsNCisgIG1fcnRBbmNob3IuU2V0KDAsIDAsIDAsIDApOw0KKyAgbV9UaW1lclNob3cubV9wVG9vbFRpcCA9IHRoaXM7DQorICBtX1RpbWVySGlkZS5tX3BUb29sVGlwID0gdGhpczsNCit9DQorQ0ZXTF9Ub29sVGlwSW1wOjp+Q0ZXTF9Ub29sVGlwSW1wKCkgew0KKyAgaWYgKG1fcFRpbWVyKSB7DQorICAgIGRlbGV0ZSBtX3BUaW1lcjsNCiAgICAgbV9wVGltZXIgPSBOVUxMOw0KLSAgICBtX1RpbWVyU2hvdy5tX3BUb29sVGlwID0gdGhpczsNCi0gICAgbV9UaW1lckhpZGUubV9wVG9vbFRpcCA9IHRoaXM7DQorICB9DQogfQ0KLUNGV0xfVG9vbFRpcEltcDo6Q0ZXTF9Ub29sVGlwSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQotICAgIDogQ0ZXTF9Gb3JtSW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCi0gICAgLCBtX2JCdG5Eb3duKEZBTFNFKQ0KLSAgICAsIG1fZHdUVE9TdHlsZXMoRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUpDQotICAgICwgbV9pVFRPQWxpZ24oRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXIpDQotICAgICwgbV9oVGltZXJTaG93KE5VTEwpDQotICAgICwgbV9oVGltZXJIaWRlKE5VTEwpDQotICAgICwgbV9wVGltZXIoTlVMTCkNCi17DQotICAgIG1fcnRDbGllbnQuU2V0KDAsIDAsIDAsIDApOw0KLSAgICBtX3J0Q2FwdGlvbi5TZXQoMCwgMCwgMCwgMCk7DQotICAgIG1fcnRBbmNob3IuU2V0KDAsIDAsIDAsIDApOw0KLSAgICBtX1RpbWVyU2hvdy5tX3BUb29sVGlwID0gdGhpczsNCi0gICAgbV9UaW1lckhpZGUubV9wVG9vbFRpcCA9IHRoaXM7DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19Ub29sVGlwOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRldMX1Rvb2xUaXBJbXA6On5DRldMX1Rvb2xUaXBJbXAoKQ0KLXsNCi0gICAgaWYgKG1fcFRpbWVyKSB7DQotICAgICAgICBkZWxldGUgbV9wVGltZXI7DQotICAgICAgICBtX3BUaW1lciA9IE5VTEw7DQorRlhfRFdPUkQgQ0ZXTF9Ub29sVGlwSW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfVG9vbFRpcDsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OkluaXRpYWxpemUoKSB7DQorICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzIHw9IEZXTF9XR1RTVFlMRV9Qb3B1cDsNCisgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJj0gfkZXTF9XR1RTVFlMRV9DaGlsZDsNCisgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfVG9vbFRpcEltcERlbGVnYXRlKHRoaXMpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcEltcDo6RmluYWxpemUoKSB7DQorICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgZGVsZXRlIChDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQorICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPT0gTlVMTCkgew0KKyAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KICAgICB9DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Ub29sVGlwSW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0DQotew0KLSAgICB3c0NsYXNzID0gRldMX0NMQVNTX1Rvb2xUaXA7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfRFdPUkQgQ0ZXTF9Ub29sVGlwSW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCi17DQotICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX1Rvb2xUaXA7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9Ub29sVGlwSW1wOjpJbml0aWFsaXplKCkNCi17DQotICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgfD0gRldMX1dHVFNUWUxFX1BvcHVwOw0KLSAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICY9IH5GV0xfV0dUU1RZTEVfQ2hpbGQ7DQotICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKSBGWF9ORVcgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGUodGhpcyk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUglDRldMX1Rvb2xUaXBJbXA6OkZpbmFsaXplKCkNCi17DQotICAgIGlmICggbV9wRGVsZWdhdGUpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KLSAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCi19DQotRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQotew0KLSAgICBpZiAoYkF1dG9TaXplKSB7DQotICAgICAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCi0gICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID09IE5VTEwpIHsNCi0gICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCi0gICAgICAgIElGV0xfVG9vbFRpcERQICpwRGF0YSA9IChJRldMX1Rvb2xUaXBEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICAgICAgaWYgKHBEYXRhKSB7DQotICAgICAgICAgICAgcERhdGEtPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c0NhcHRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpTGVuID0gd3NDYXB0aW9uLkdldExlbmd0aCgpOw0KLSAgICAgICAgaWYgKGlMZW4gPiAwKSB7DQotICAgICAgICAgICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKHdzQ2FwdGlvbiwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQotICAgICAgICAgICAgcmVjdC5TZXQoMCwgMCwgc3oueCwgc3oueSk7DQotICAgICAgICAgICAgcmVjdC53aWR0aCArPSBGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXIgKiAyNTsNCi0gICAgICAgICAgICByZWN0LmhlaWdodCArPSBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXIgKiA4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Ub29sVGlwSW1wOjpVcGRhdGUoKQ0KLXsNCi0gICAgaWYgKElzTG9ja2VkKCkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQotICAgIH0NCi0gICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQotICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCi0gICAgfQ0KLSAgICBVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQotICAgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQotICAgIG1fcnRDYXB0aW9uID0gbV9ydENsaWVudDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfVG9vbFRpcEltcDo6R2V0Q2xpZW50UmVjdChDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBGWF9GTE9BVCB4ID0gMDsNCi0gICAgRlhfRkxPQVQgeSA9IDA7DQotICAgIEZYX0ZMT0FUIHQgPSAwOw0KLSAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgIGlmIChwVGhlbWUpIHsNCi0gICAgICAgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7DQotICAgICAgICBwYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgIEZYX0ZMT0FUICogdmFsdWUgPSBOVUxMOw0KLSAgICAgICAgdmFsdWUgPSAoRlhfRkxPQVQgKikgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0NYQm9yZGVyKTsNCi0gICAgICAgIHggPSAqdmFsdWU7DQotICAgICAgICB2YWx1ZSA9IChGWF9GTE9BVCAqKSBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXIpOw0KLSAgICAgICAgeSA9ICp2YWx1ZTsNCi0gICAgfQ0KLSAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgcmVjdC5PZmZzZXQoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsNCi0gICAgcmVjdC5EZWZsYXRlKHgsIHQsIHgsIHkpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Ub29sVGlwSW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIElGV0xfVG9vbFRpcFRhcmdldCAqIHRvb2xUaXBUYXJnZXQgPSBDRldMX1Rvb2xUaXBDb250YWluZXI6OmdldEluc3RhbmNlKCktPkdldEN1cnJlbnRUb29sVGlwVGFyZ2V0KCk7DQotICAgIGlmICh0b29sVGlwVGFyZ2V0ICYmICF0b29sVGlwVGFyZ2V0LT5Vc2VEZWZhdWx0VGhlbWUoKSkgew0KLSAgICAgICAgcmV0dXJuIHRvb2xUaXBUYXJnZXQtPkRyYXdUb29sVGlwKHBHcmFwaGljcywgcE1hdHJpeCwgbV9wSW50ZXJmYWNlKTsNCi0gICAgfQ0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgIERyYXdCa2dyb3VuZChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQotICAgIERyYXdUZXh0KHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi12b2lkIENGV0xfVG9vbFRpcEltcDo6RHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KLSAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9UVFBfQmFja2dyb3VuZDsNCi0gICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQotICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCi0gICAgICAgIHBhcmFtLm1fcERhdGEgPSAmbV9ydENhcHRpb247DQotICAgIH0NCi0gICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KLX0NCi12b2lkIENGV0xfVG9vbFRpcEltcDo6RHJhd1RleHQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KICAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQotICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzQ2FwdGlvbik7DQotICAgIGlmICh3c0NhcHRpb24uSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm47DQorICAgIElGV0xfVG9vbFRpcERQKiBwRGF0YSA9IChJRldMX1Rvb2xUaXBEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgICBpZiAocERhdGEpIHsNCisgICAgICBwRGF0YS0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzQ2FwdGlvbik7DQogICAgIH0NCi0gICAgQ0ZXTF9UaGVtZVRleHQgcGFyYW07DQotICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX1RUUF9DYXB0aW9uOw0KLSAgICBwYXJhbS5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCi0gICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICBpbnQzMl90IGlMZW4gPSB3c0NhcHRpb24uR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuID4gMCkgew0KKyAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSh3c0NhcHRpb24sIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICAgIHJlY3QuU2V0KDAsIDAsIHN6LngsIHN6LnkpOw0KKyAgICAgIHJlY3Qud2lkdGggKz0gRldMX1dHVENBUEFDSVRZX0NYQm9yZGVyICogMjU7DQorICAgICAgcmVjdC5oZWlnaHQgKz0gRldMX1dHVENBUEFDSVRZX0NZQm9yZGVyICogODsNCiAgICAgfQ0KLSAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDYXB0aW9uOw0KLSAgICBwYXJhbS5tX3dzVGV4dCA9IHdzQ2FwdGlvbjsNCi0gICAgcGFyYW0ubV9kd1RUT1N0eWxlcyA9IG1fZHdUVE9TdHlsZXM7DQotICAgIHBhcmFtLm1faVRUT0FsaWduID0gbV9pVFRPQWxpZ247DQotICAgIHBUaGVtZS0+RHJhd1RleHQoJnBhcmFtKTsNCisgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotdm9pZCBDRldMX1Rvb2xUaXBJbXA6OlVwZGF0ZVRleHRPdXRTdHlsZXMoKQ0KLXsNCi0gICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCi0gICAgbV9kd1RUT1N0eWxlcyA9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9XR1RTVFlMRV9SVExSZWFkaW5nKSB7DQotICAgICAgICBtX2R3VFRPU3R5bGVzIHw9IEZERV9UVE9TVFlMRV9SVEw7DQotICAgIH0NCi0gICAgaWYgKCBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX1RUUF9NdWx0aWxpbmUpIHsNCi0gICAgICAgIG1fZHdUVE9TdHlsZXMgJj0gfkZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KLSAgICB9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OlVwZGF0ZSgpIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgbV9ydENhcHRpb24gPSBtX3J0Q2xpZW50Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfVG9vbFRpcEltcDo6U2V0QW5jaG9yKGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IpDQotew0KLSAgICBtX3J0QW5jaG9yID0gcnRBbmNob3I7DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OkdldENsaWVudFJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBGWF9GTE9BVCB4ID0gMDsNCisgIEZYX0ZMT0FUIHkgPSAwOw0KKyAgRlhfRkxPQVQgdCA9IDA7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBpZiAocFRoZW1lKSB7DQorICAgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7DQorICAgIHBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBGWF9GTE9BVCogdmFsdWUgPSBOVUxMOw0KKyAgICB2YWx1ZSA9IChGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0NYQm9yZGVyKTsNCisgICAgeCA9ICp2YWx1ZTsNCisgICAgdmFsdWUgPSAoRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9DWUJvcmRlcik7DQorICAgIHkgPSAqdmFsdWU7DQorICB9DQorICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIHJlY3QuT2Zmc2V0KC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7DQorICByZWN0LkRlZmxhdGUoeCwgdCwgeCwgeSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwSW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIElGV0xfVG9vbFRpcFRhcmdldCogdG9vbFRpcFRhcmdldCA9DQorICAgICAgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5HZXRDdXJyZW50VG9vbFRpcFRhcmdldCgpOw0KKyAgaWYgKHRvb2xUaXBUYXJnZXQgJiYgIXRvb2xUaXBUYXJnZXQtPlVzZURlZmF1bHRUaGVtZSgpKSB7DQorICAgIHJldHVybiB0b29sVGlwVGFyZ2V0LT5EcmF3VG9vbFRpcChwR3JhcGhpY3MsIHBNYXRyaXgsIG1fcEludGVyZmFjZSk7DQorICB9DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBHcmFwaGljcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIERyYXdCa2dyb3VuZChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICBEcmF3VGV4dChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Ub29sVGlwSW1wOjpEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX1RUUF9CYWNrZ3JvdW5kOw0KKyAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQorICAgIHBhcmFtLm1fcERhdGEgPSAmbV9ydENhcHRpb247DQorICB9DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Ub29sVGlwSW1wOjpEcmF3VGV4dChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCisgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzQ2FwdGlvbik7DQorICBpZiAod3NDYXB0aW9uLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRldMX1RoZW1lVGV4dCBwYXJhbTsNCisgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9UVFBfQ2FwdGlvbjsNCisgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KKyAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0Q2FwdGlvbjsNCisgIHBhcmFtLm1fd3NUZXh0ID0gd3NDYXB0aW9uOw0KKyAgcGFyYW0ubV9kd1RUT1N0eWxlcyA9IG1fZHdUVE9TdHlsZXM7DQorICBwYXJhbS5tX2lUVE9BbGlnbiA9IG1faVRUT0FsaWduOw0KKyAgcFRoZW1lLT5EcmF3VGV4dCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfVG9vbFRpcEltcDo6VXBkYXRlVGV4dE91dFN0eWxlcygpIHsNCisgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICBtX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9XR1RTVFlMRV9SVExSZWFkaW5nKSB7DQorICAgIG1fZHdUVE9TdHlsZXMgfD0gRkRFX1RUT1NUWUxFX1JUTDsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX1RUUF9NdWx0aWxpbmUpIHsNCisgICAgbV9kd1RUT1N0eWxlcyAmPSB+RkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICB9DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwSW1wOjpTZXRBbmNob3IoY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvcikgew0KKyAgbV9ydEFuY2hvciA9IHJ0QW5jaG9yOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwSW1wOjpTaG93KCkgew0KKyAgSUZXTF9Ub29sVGlwRFAqIHBEYXRhID0gKElGV0xfVG9vbFRpcERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICBpbnQzMl90IG5Jbml0RGVsYXkgPSBwRGF0YS0+R2V0SW5pdGlhbERlbGF5KG1fcEludGVyZmFjZSk7DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSkgew0KKyAgICBtX2hUaW1lclNob3cgPSBGV0xfU3RhcnRUaW1lcigmbV9UaW1lclNob3csIG5Jbml0RGVsYXksIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcEltcDo6SGlkZSgpIHsNCisgIFNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgIGlmIChtX2hUaW1lckhpZGUpIHsNCisgICAgRldMX1N0b3BUaW1lcihtX2hUaW1lckhpZGUpOw0KKyAgICBtX2hUaW1lckhpZGUgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1faFRpbWVyU2hvdykgew0KKyAgICBGV0xfU3RvcFRpbWVyKG1faFRpbWVyU2hvdyk7DQorICAgIG1faFRpbWVyU2hvdyA9IE5VTEw7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OlNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAoKGR3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgJiYgIWJTZXQpIHsNCisgICAgSUZXTF9Ub29sVGlwRFAqIHBEYXRhID0gKElGV0xfVG9vbFRpcERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICAgIGludDMyX3QgbkF1dG9Qb3BEZWxheSA9IHBEYXRhLT5HZXRBdXRvUG9wRGVsYXkobV9wSW50ZXJmYWNlKTsNCisgICAgbV9oVGltZXJIaWRlID0gRldMX1N0YXJ0VGltZXIoJm1fVGltZXJIaWRlLCBuQXV0b1BvcERlbGF5LCBGQUxTRSk7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Ub29sVGlwSW1wOjpSZWZyZXNoVG9vbFRpcFBvcygpIHsNCisgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9UVFBfTm9BbmNob3IpID09IDApIHsNCisgICAgQ0ZYX1JlY3RGIHJ0UG9wdXA7DQorICAgIENGWF9SZWN0RiBydFdpZGdldChtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0KTsNCisgICAgQ0ZYX1JlY3RGIHJ0QW5jaG9yKG1fcnRBbmNob3IpOw0KKyAgICBydFBvcHVwLlNldCgwLCAwLCAwLCAwKTsNCisgICAgRlhfRkxPQVQgZnggPSBydEFuY2hvci5DZW50ZXIoKS54ICsgMjA7DQorICAgIEZYX0ZMT0FUIGZ5ID0gcnRBbmNob3IuQ2VudGVyKCkueSArIDIwOw0KKyAgICBydFBvcHVwLlNldChmeCwgZnksIHJ0V2lkZ2V0LldpZHRoKCksIHJ0V2lkZ2V0LkhlaWdodCgpKTsNCisgICAgRlhfRkxPQVQgZlNjcmVlbldpZHRoID0gMDsNCisgICAgRlhfRkxPQVQgZlNjcmVlbkhlaWdodCA9IDA7DQorICAgIEdldFNjcmVlblNpemUoZlNjcmVlbldpZHRoLCBmU2NyZWVuSGVpZ2h0KTsNCisgICAgaWYgKHJ0UG9wdXAuYm90dG9tKCkgPiBmU2NyZWVuSGVpZ2h0KSB7DQorICAgICAgcnRQb3B1cC5PZmZzZXQoMCwgZlNjcmVlbkhlaWdodCAtIHJ0UG9wdXAuYm90dG9tKCkpOw0KKyAgICB9DQorICAgIGlmIChydFBvcHVwLnJpZ2h0KCkgPiBmU2NyZWVuV2lkdGgpIHsNCisgICAgICBydFBvcHVwLk9mZnNldChmU2NyZWVuV2lkdGggLSBydFBvcHVwLnJpZ2h0KCksIDApOw0KKyAgICB9DQorICAgIGlmIChydFBvcHVwLmxlZnQgPCAwKSB7DQorICAgICAgcnRQb3B1cC5PZmZzZXQoMCAtIHJ0UG9wdXAubGVmdCwgMCk7DQorICAgIH0NCisgICAgaWYgKHJ0UG9wdXAudG9wIDwgMCkgew0KKyAgICAgIHJ0UG9wdXAuT2Zmc2V0KDAsIDAgLSBydFBvcHVwLnRvcCk7DQorICAgIH0NCisgICAgU2V0V2lkZ2V0UmVjdChydFBvcHVwKTsNCisgICAgVXBkYXRlKCk7DQorICB9DQorfQ0KK0NGV0xfVG9vbFRpcEltcDo6Q0ZXTF9Ub29sVGlwVGltZXI6OkNGV0xfVG9vbFRpcFRpbWVyKENGV0xfVG9vbFRpcEltcCogcFRvb2xUaXApDQorICAgIDogbV9wVG9vbFRpcChwVG9vbFRpcCkge30NCitpbnQzMl90IENGV0xfVG9vbFRpcEltcDo6Q0ZXTF9Ub29sVGlwVGltZXI6OlJ1bihGV0xfSFRJTUVSIGhUaW1lcikgew0KKyAgaWYgKG1fcFRvb2xUaXAtPm1faFRpbWVyU2hvdyA9PSBoVGltZXIgJiYgbV9wVG9vbFRpcC0+bV9oVGltZXJTaG93KSB7DQorICAgIGlmIChtX3BUb29sVGlwLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpIHsNCisgICAgICBtX3BUb29sVGlwLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgRkFMU0UpOw0KKyAgICAgIG1fcFRvb2xUaXAtPlJlZnJlc2hUb29sVGlwUG9zKCk7DQorICAgICAgRldMX1N0b3BUaW1lcihtX3BUb29sVGlwLT5tX2hUaW1lclNob3cpOw0KKyAgICAgIG1fcFRvb2xUaXAtPm1faFRpbWVyU2hvdyA9IE5VTEw7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIGlmIChtX3BUb29sVGlwLT5tX2hUaW1lckhpZGUgPT0gaFRpbWVyICYmIG1fcFRvb2xUaXAtPm1faFRpbWVySGlkZSkgew0KKyAgICBtX3BUb29sVGlwLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQorICAgIEZXTF9TdG9wVGltZXIobV9wVG9vbFRpcC0+bV9oVGltZXJIaWRlKTsNCisgICAgbV9wVG9vbFRpcC0+bV9oVGltZXJIaWRlID0gTlVMTDsNCiAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OlNob3coKQ0KLXsNCi0gICAgSUZXTF9Ub29sVGlwRFAgKnBEYXRhID0gKElGV0xfVG9vbFRpcERQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgIGludDMyX3QgbkluaXREZWxheSA9IHBEYXRhLT5HZXRJbml0aWFsRGVsYXkobV9wSW50ZXJmYWNlKTsNCi0gICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkpIHsNCi0gICAgICAgIG1faFRpbWVyU2hvdyA9IEZXTF9TdGFydFRpbWVyKCAmbV9UaW1lclNob3csIG5Jbml0RGVsYXksIEZBTFNFKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCitDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZTo6Q0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGUoQ0ZXTF9Ub29sVGlwSW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KIH0NCi1GV0xfRVJSIENGV0xfVG9vbFRpcEltcDo6SGlkZSgpDQotew0KLSAgICBTZXRTdGF0ZXMoIEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KLSAgICBpZiAoIG1faFRpbWVySGlkZSkgew0KLSAgICAgICAgRldMX1N0b3BUaW1lcihtX2hUaW1lckhpZGUpOw0KLSAgICAgICAgbV9oVGltZXJIaWRlID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAoIG1faFRpbWVyU2hvdykgew0KLSAgICAgICAgRldMX1N0b3BUaW1lcihtX2hUaW1lclNob3cpOw0KLSAgICAgICAgbV9oVGltZXJTaG93ID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCitGV0xfRVJSIENGV0xfVG9vbFRpcEltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OlNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ICkNCi17DQotICAgIGlmICggKGR3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgJiYgIWJTZXQpIHsNCi0gICAgICAgIElGV0xfVG9vbFRpcERQICpwRGF0YSA9IChJRldMX1Rvb2xUaXBEUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICAgICAgaW50MzJfdCBuQXV0b1BvcERlbGF5ID0gcERhdGEtPkdldEF1dG9Qb3BEZWxheShtX3BJbnRlcmZhY2UpOw0KLSAgICAgICAgbV9oVGltZXJIaWRlID0gRldMX1N0YXJ0VGltZXIoICZtX1RpbWVySGlkZSwgbkF1dG9Qb3BEZWxheSwgRkFMU0UpOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6U2V0U3RhdGVzKGR3U3RhdGVzLCBiU2V0KTsNCi19DQotdm9pZCBDRldMX1Rvb2xUaXBJbXA6OlJlZnJlc2hUb29sVGlwUG9zKCkNCi17DQotICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9UVFBfTm9BbmNob3IpID09IDApIHsNCi0gICAgICAgIENGWF9SZWN0RiBydFBvcHVwOw0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQpOw0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0QW5jaG9yKG1fcnRBbmNob3IpOw0KLSAgICAgICAgcnRQb3B1cC5TZXQoIDAsIDAsIDAsIDApOw0KLSAgICAgICAgRlhfRkxPQVQgZnggPSBydEFuY2hvci5DZW50ZXIoKS54ICsgMjA7DQotICAgICAgICBGWF9GTE9BVCBmeSA9IHJ0QW5jaG9yLkNlbnRlcigpLnkgKyAyMDsNCi0gICAgICAgIHJ0UG9wdXAuU2V0KCBmeCwgZnksIHJ0V2lkZ2V0LldpZHRoKCksIHJ0V2lkZ2V0LkhlaWdodCgpKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZTY3JlZW5XaWR0aCA9IDA7DQotICAgICAgICBGWF9GTE9BVCBmU2NyZWVuSGVpZ2h0ID0gMDsNCi0gICAgICAgIEdldFNjcmVlblNpemUoZlNjcmVlbldpZHRoLCBmU2NyZWVuSGVpZ2h0KTsNCi0gICAgICAgIGlmIChydFBvcHVwLmJvdHRvbSgpID4gZlNjcmVlbkhlaWdodCkgew0KLSAgICAgICAgICAgIHJ0UG9wdXAuT2Zmc2V0KCAwLCBmU2NyZWVuSGVpZ2h0IC0gcnRQb3B1cC5ib3R0b20oKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIHJ0UG9wdXAucmlnaHQoKSA+IGZTY3JlZW5XaWR0aCkgew0KLSAgICAgICAgICAgIHJ0UG9wdXAuT2Zmc2V0KCBmU2NyZWVuV2lkdGggLSBydFBvcHVwLnJpZ2h0KCksIDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCBydFBvcHVwLmxlZnQgPCAwKSB7DQotICAgICAgICAgICAgcnRQb3B1cC5PZmZzZXQoMCAtIHJ0UG9wdXAubGVmdCwgMCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIHJ0UG9wdXAudG9wIDwgMCkgew0KLSAgICAgICAgICAgIHJ0UG9wdXAuT2Zmc2V0KCAwLCAwIC0gcnRQb3B1cC50b3ApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU2V0V2lkZ2V0UmVjdChydFBvcHVwKTsNCi0gICAgICAgIFVwZGF0ZSgpOw0KLSAgICB9DQotfQ0KLUNGV0xfVG9vbFRpcEltcDo6Q0ZXTF9Ub29sVGlwVGltZXI6OkNGV0xfVG9vbFRpcFRpbWVyKENGV0xfVG9vbFRpcEltcCAqIHBUb29sVGlwKQ0KLSAgICA6IG1fcFRvb2xUaXAocFRvb2xUaXApDQotew0KLX0NCi1pbnQzMl90IENGV0xfVG9vbFRpcEltcDo6Q0ZXTF9Ub29sVGlwVGltZXI6OlJ1bihGV0xfSFRJTUVSIGhUaW1lcikNCi17DQotICAgIGlmIChtX3BUb29sVGlwLT5tX2hUaW1lclNob3cgPT0gaFRpbWVyICYmIG1fcFRvb2xUaXAtPm1faFRpbWVyU2hvdykgew0KLSAgICAgICAgaWYgKG1fcFRvb2xUaXAtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgew0KLSAgICAgICAgICAgIG1fcFRvb2xUaXAtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBGQUxTRSk7DQotICAgICAgICAgICAgbV9wVG9vbFRpcC0+UmVmcmVzaFRvb2xUaXBQb3MoKTsNCi0gICAgICAgICAgICBGV0xfU3RvcFRpbWVyKG1fcFRvb2xUaXAtPm1faFRpbWVyU2hvdyk7DQotICAgICAgICAgICAgbV9wVG9vbFRpcC0+bV9oVGltZXJTaG93ID0gTlVMTDsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAobV9wVG9vbFRpcC0+bV9oVGltZXJIaWRlID09IGhUaW1lciAmJiBtX3BUb29sVGlwLT5tX2hUaW1lckhpZGUpIHsNCi0gICAgICAgIG1fcFRvb2xUaXAtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCi0gICAgICAgIEZXTF9TdG9wVGltZXIobV9wVG9vbFRpcC0+bV9oVGltZXJIaWRlKTsNCi0gICAgICAgIG1fcFRvb2xUaXAtPm1faFRpbWVySGlkZSA9IE5VTEw7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGU6OkNGV0xfVG9vbFRpcEltcERlbGVnYXRlKENGV0xfVG9vbFRpcEltcCAqcE93bmVyKQ0KLSAgICA6IG1fcE93bmVyKHBPd25lcikNCi17DQotfQ0KLWludDMyX3QgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotICAgIHJldHVybglDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCi19DQotRldMX0VSUglDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfVG9vbFRpcEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZnhtYXRoX2JhcmNvZGVpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZnhtYXRoX2JhcmNvZGVpbXAuY3BwCmluZGV4IGNhYTgxMWEuLmYyMGZlMGYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z4bWF0aF9iYXJjb2RlaW1wLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9meG1hdGhfYmFyY29kZWltcC5jcHAKQEAgLTYsMzk1ICs2LDM3MiBAQAogDQogI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZnhtYXRoX2JhcmNvZGVpbXAuaCINCi1zdGF0aWMgQ0JDX0NvZGVCYXNlKiBGWF9CYXJjb2RlX0NyZWF0ZUJhckNvZGVFbmdpbmVPYmplY3QoQkNfVFlQRSB0eXBlKQ0KLXsNCi0gICAgc3dpdGNoKHR5cGUpIHsNCi0gICAgICAgIGNhc2UgQkNfQ09ERTM5Og0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0JDX0NvZGUzOSgpOw0KLSAgICAgICAgY2FzZSBCQ19DT0RBQkFSOg0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0JDX0NvZGFiYXIoKTsNCi0gICAgICAgIGNhc2UgQkNfQ09ERTEyODoNCi0gICAgICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19Db2RlMTI4KEJDX0NPREUxMjhfQik7DQotICAgICAgICBjYXNlIEJDX0NPREUxMjhfQjoNCi0gICAgICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19Db2RlMTI4KEJDX0NPREUxMjhfQik7DQotICAgICAgICBjYXNlIEJDX0NPREUxMjhfQzoNCi0gICAgICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19Db2RlMTI4KEJDX0NPREUxMjhfQyk7DQotICAgICAgICBjYXNlIEJDX0VBTjg6DQotICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfRUFOOCgpOw0KLSAgICAgICAgY2FzZSBCQ19VUENBOg0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0JDX1VQQ0EoKTsNCi0gICAgICAgIGNhc2UgQkNfRUFOMTM6DQotICAgICAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfRUFOMTMoKTsNCi0gICAgICAgIGNhc2UgQkNfUVJfQ09ERToNCi0gICAgICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19RUkNvZGUoKTsNCi0gICAgICAgIGNhc2UgQkNfUERGNDE3Og0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0JDX1BERjQxN0koKTsNCi0gICAgICAgIGNhc2UgQkNfREFUQU1BVFJJWDoNCi0gICAgICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19EYXRhTWF0cml4KCk7DQotICAgICAgICBjYXNlIEJDX1VOS05PV046DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQorc3RhdGljIENCQ19Db2RlQmFzZSogRlhfQmFyY29kZV9DcmVhdGVCYXJDb2RlRW5naW5lT2JqZWN0KEJDX1RZUEUgdHlwZSkgew0KKyAgc3dpdGNoICh0eXBlKSB7DQorICAgIGNhc2UgQkNfQ09ERTM5Og0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0JDX0NvZGUzOSgpOw0KKyAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgICAgcmV0dXJuIEZYX05FVyBDQkNfQ29kYWJhcigpOw0KKyAgICBjYXNlIEJDX0NPREUxMjg6DQorICAgICAgcmV0dXJuIEZYX05FVyBDQkNfQ29kZTEyOChCQ19DT0RFMTI4X0IpOw0KKyAgICBjYXNlIEJDX0NPREUxMjhfQjoNCisgICAgICByZXR1cm4gRlhfTkVXIENCQ19Db2RlMTI4KEJDX0NPREUxMjhfQik7DQorICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0JDX0NvZGUxMjgoQkNfQ09ERTEyOF9DKTsNCisgICAgY2FzZSBCQ19FQU44Og0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0JDX0VBTjgoKTsNCisgICAgY2FzZSBCQ19VUENBOg0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0JDX1VQQ0EoKTsNCisgICAgY2FzZSBCQ19FQU4xMzoNCisgICAgICByZXR1cm4gRlhfTkVXIENCQ19FQU4xMygpOw0KKyAgICBjYXNlIEJDX1FSX0NPREU6DQorICAgICAgcmV0dXJuIEZYX05FVyBDQkNfUVJDb2RlKCk7DQorICAgIGNhc2UgQkNfUERGNDE3Og0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0JDX1BERjQxN0koKTsNCisgICAgY2FzZSBCQ19EQVRBTUFUUklYOg0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0JDX0RhdGFNYXRyaXgoKTsNCisgICAgY2FzZSBCQ19VTktOT1dOOg0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KIH0NCi1DRlhfQmFyY29kZTo6Q0ZYX0JhcmNvZGUoKQ0KLXsNCitDRlhfQmFyY29kZTo6Q0ZYX0JhcmNvZGUoKSB7fQ0KK0NGWF9CYXJjb2RlOjp+Q0ZYX0JhcmNvZGUoKSB7DQorICBpZiAobV9wQkNFbmdpbmUpIHsNCisgICAgZGVsZXRlIG1fcEJDRW5naW5lOw0KKyAgICBtX3BCQ0VuZ2luZSA9IE5VTEw7DQorICB9DQogfQ0KLUNGWF9CYXJjb2RlOjp+Q0ZYX0JhcmNvZGUoKQ0KLXsNCi0gICAgaWYobV9wQkNFbmdpbmUpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BCQ0VuZ2luZTsNCi0gICAgICAgIG1fcEJDRW5naW5lID0gTlVMTDsNCi0gICAgfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OkNycmVhdGUoQkNfVFlQRSB0eXBlKSB7DQorICBtX3BCQ0VuZ2luZSA9IEZYX0JhcmNvZGVfQ3JlYXRlQmFyQ29kZUVuZ2luZU9iamVjdCh0eXBlKTsNCisgIHJldHVybiBtX3BCQ0VuZ2luZSAhPSBOVUxMOw0KIH0NCi1GWF9CT09MIENGWF9CYXJjb2RlOjpDcnJlYXRlKEJDX1RZUEUgdHlwZSkNCi17DQotICAgIG1fcEJDRW5naW5lID0gRlhfQmFyY29kZV9DcmVhdGVCYXJDb2RlRW5naW5lT2JqZWN0KHR5cGUpOw0KLSAgICByZXR1cm4gbV9wQkNFbmdpbmUgIT0gTlVMTDsNCit2b2lkIENGWF9CYXJjb2RlOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQogfQ0KLXZvaWQgQ0ZYX0JhcmNvZGU6OlJlbGVhc2UoKQ0KLXsNCi0gICAgZGVsZXRlIHRoaXM7DQorQkNfVFlQRSBDRlhfQmFyY29kZTo6R2V0VHlwZSgpIHsNCisgIHJldHVybiBtX3BCQ0VuZ2luZSA/IG1fcEJDRW5naW5lLT5HZXRUeXBlKCkgOiBCQ19VTktOT1dOOw0KIH0NCi1CQ19UWVBFIENGWF9CYXJjb2RlOjpHZXRUeXBlKCkNCi17DQotICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/IG1fcEJDRW5naW5lLT5HZXRUeXBlKCkgOiBCQ19VTktOT1dOOw0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldENoYXJFbmNvZGluZyhCQ19DSEFSX0VOQ09ESU5HIGVuY29kaW5nKSB7DQorICByZXR1cm4gbV9wQkNFbmdpbmUgPyBtX3BCQ0VuZ2luZS0+U2V0Q2hhckVuY29kaW5nKGVuY29kaW5nKSA6IEZBTFNFOw0KIH0NCi1GWF9CT09MIENGWF9CYXJjb2RlOjpTZXRDaGFyRW5jb2RpbmcoQkNfQ0hBUl9FTkNPRElORyBlbmNvZGluZykNCi17DQotICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/IG1fcEJDRW5naW5lLT5TZXRDaGFyRW5jb2RpbmcoZW5jb2RpbmcpIDogRkFMU0U7DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgbW9kdWxlSGVpZ2h0KSB7DQorICByZXR1cm4gbV9wQkNFbmdpbmUgPyBtX3BCQ0VuZ2luZS0+U2V0TW9kdWxlSGVpZ2h0KG1vZHVsZUhlaWdodCkgOiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgbW9kdWxlSGVpZ2h0KQ0KLXsNCi0gICAgcmV0dXJuIG1fcEJDRW5naW5lID8gbV9wQkNFbmdpbmUtPlNldE1vZHVsZUhlaWdodChtb2R1bGVIZWlnaHQpIDogRkFMU0U7DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0TW9kdWxlV2lkdGgoaW50MzJfdCBtb2R1bGVXaWR0aCkgew0KKyAgcmV0dXJuIG1fcEJDRW5naW5lID8gbV9wQkNFbmdpbmUtPlNldE1vZHVsZVdpZHRoKG1vZHVsZVdpZHRoKSA6IEZBTFNFOw0KIH0NCi1GWF9CT09MIENGWF9CYXJjb2RlOjpTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEJDRW5naW5lID8gbV9wQkNFbmdpbmUtPlNldE1vZHVsZVdpZHRoKG1vZHVsZVdpZHRoKSA6IEZBTFNFOw0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldEhlaWdodChpbnQzMl90IGhlaWdodCkgew0KKyAgcmV0dXJuIG1fcEJDRW5naW5lID8gbV9wQkNFbmdpbmUtPlNldEhlaWdodChoZWlnaHQpIDogRkFMU0U7DQogfQ0KLUZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldEhlaWdodChpbnQzMl90IGhlaWdodCkNCi17DQotICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/IG1fcEJDRW5naW5lLT5TZXRIZWlnaHQoaGVpZ2h0KSA6IEZBTFNFOw0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldFdpZHRoKGludDMyX3Qgd2lkdGgpIHsNCisgIHJldHVybiBtX3BCQ0VuZ2luZSA/IG1fcEJDRW5naW5lLT5TZXRXaWR0aCh3aWR0aCkgOiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0V2lkdGgoaW50MzJfdCB3aWR0aCkNCi17DQotICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/IG1fcEJDRW5naW5lLT5TZXRXaWR0aCh3aWR0aCkgOiBGQUxTRTsNCitGWF9CT09MIENGWF9CYXJjb2RlOjpDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX0NPREUzOToNCisgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICBjYXNlIEJDX0NPREUxMjg6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KKyAgICBjYXNlIEJDX0NPREUxMjhfQzoNCisgICAgY2FzZSBCQ19FQU44Og0KKyAgICBjYXNlIEJDX0VBTjEzOg0KKyAgICBjYXNlIEJDX1VQQ0E6DQorICAgICAgcmV0dXJuIG1fcEJDRW5naW5lDQorICAgICAgICAgICAgICAgICA/ICgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+Q2hlY2tDb250ZW50VmFsaWRpdHkoY29udGVudHMpDQorICAgICAgICAgICAgICAgICA6IFRSVUU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIFRSVUU7DQorICB9DQogfQ0KLUZYX0JPT0wJQ0ZYX0JhcmNvZGU6OkNoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpDQotew0KLSAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQotICAgICAgICBjYXNlIEJDX0NPREUzOToNCi0gICAgICAgIGNhc2UgQkNfQ09EQUJBUjoNCi0gICAgICAgIGNhc2UgQkNfQ09ERTEyODoNCi0gICAgICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KLSAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQotICAgICAgICBjYXNlIEJDX0VBTjg6DQotICAgICAgICBjYXNlIEJDX0VBTjEzOg0KLSAgICAgICAgY2FzZSBCQ19VUENBOg0KLSAgICAgICAgICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/ICgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+Q2hlY2tDb250ZW50VmFsaWRpdHkoY29udGVudHMpDQotICAgICAgICAgICAgICAgICAgIDogVFJVRTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgY2hlY2tzdW0pIHsNCisgIHN3aXRjaCAoR2V0VHlwZSgpKSB7DQorICAgIGNhc2UgQkNfQ09ERTM5Og0KKyAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgIGNhc2UgQkNfQ09ERTEyODoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KKyAgICBjYXNlIEJDX0VBTjg6DQorICAgIGNhc2UgQkNfRUFOMTM6DQorICAgIGNhc2UgQkNfVVBDQToNCisgICAgICByZXR1cm4gbV9wQkNFbmdpbmUNCisgICAgICAgICAgICAgICAgID8gKCgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+U2V0UHJpbnRDaGVja3N1bShjaGVja3N1bSksDQorICAgICAgICAgICAgICAgICAgICBUUlVFKQ0KKyAgICAgICAgICAgICAgICAgOiBGQUxTRTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQogfQ0KLUZYX0JPT0wJQ0ZYX0JhcmNvZGU6OlNldFByaW50Q2hlY2tzdW0oRlhfQk9PTCBjaGVja3N1bSkNCi17DQotICAgIHN3aXRjaChHZXRUeXBlKCkpIHsNCi0gICAgICAgIGNhc2UgQkNfQ09ERTM5Og0KLSAgICAgICAgY2FzZSBCQ19DT0RBQkFSOg0KLSAgICAgICAgY2FzZSBCQ19DT0RFMTI4Og0KLSAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQotICAgICAgICBjYXNlIEJDX0NPREUxMjhfQzoNCi0gICAgICAgIGNhc2UgQkNfRUFOODoNCi0gICAgICAgIGNhc2UgQkNfRUFOMTM6DQotICAgICAgICBjYXNlIEJDX1VQQ0E6DQotICAgICAgICAgICAgcmV0dXJuIG1fcEJDRW5naW5lID8gKCgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+U2V0UHJpbnRDaGVja3N1bShjaGVja3N1bSksIFRSVUUpDQotICAgICAgICAgICAgICAgICAgIDogRkFMU0U7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpIHsNCisgIHN3aXRjaCAoR2V0VHlwZSgpKSB7DQorICAgIGNhc2UgQkNfQ09ERTM5Og0KKyAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgIGNhc2UgQkNfQ09ERTEyODoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KKyAgICBjYXNlIEJDX0VBTjg6DQorICAgIGNhc2UgQkNfRUFOMTM6DQorICAgIGNhc2UgQkNfVVBDQToNCisgICAgICByZXR1cm4gbV9wQkNFbmdpbmUNCisgICAgICAgICAgICAgICAgID8gKCgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+U2V0RGF0YUxlbmd0aChsZW5ndGgpLCBUUlVFKQ0KKyAgICAgICAgICAgICAgICAgOiBGQUxTRTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQogfQ0KLUZYX0JPT0wJQ0ZYX0JhcmNvZGU6OlNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpDQotew0KLSAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQotICAgICAgICBjYXNlIEJDX0NPREUzOToNCi0gICAgICAgIGNhc2UgQkNfQ09EQUJBUjoNCi0gICAgICAgIGNhc2UgQkNfQ09ERTEyODoNCi0gICAgICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KLSAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQotICAgICAgICBjYXNlIEJDX0VBTjg6DQotICAgICAgICBjYXNlIEJDX0VBTjEzOg0KLSAgICAgICAgY2FzZSBCQ19VUENBOg0KLSAgICAgICAgICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/ICgoKENCQ19PbmVDb2RlKiltX3BCQ0VuZ2luZSktPlNldERhdGFMZW5ndGgobGVuZ3RoKSwgVFJVRSkNCi0gICAgICAgICAgICAgICAgICAgOiBGQUxTRTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0Q2FsQ2hlY2tzdW0oaW50MzJfdCBzdGF0ZSkgew0KKyAgc3dpdGNoIChHZXRUeXBlKCkpIHsNCisgICAgY2FzZSBCQ19DT0RFMzk6DQorICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgY2FzZSBCQ19DT0RFMTI4Og0KKyAgICBjYXNlIEJDX0NPREUxMjhfQjoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQorICAgIGNhc2UgQkNfRUFOODoNCisgICAgY2FzZSBCQ19FQU4xMzoNCisgICAgY2FzZSBCQ19VUENBOg0KKyAgICAgIHJldHVybiBtX3BCQ0VuZ2luZQ0KKyAgICAgICAgICAgICAgICAgPyAoKChDQkNfT25lQ29kZSopbV9wQkNFbmdpbmUpLT5TZXRDYWxDaGVja3N1bShzdGF0ZSksIFRSVUUpDQorICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCiB9DQotRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0Q2FsQ2hlY2tzdW0oaW50MzJfdCBzdGF0ZSkNCi17DQotICAgIHN3aXRjaChHZXRUeXBlKCkpIHsNCi0gICAgICAgIGNhc2UgQkNfQ09ERTM5Og0KLSAgICAgICAgY2FzZSBCQ19DT0RBQkFSOg0KLSAgICAgICAgY2FzZSBCQ19DT0RFMTI4Og0KLSAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQotICAgICAgICBjYXNlIEJDX0NPREUxMjhfQzoNCi0gICAgICAgIGNhc2UgQkNfRUFOODoNCi0gICAgICAgIGNhc2UgQkNfRUFOMTM6DQotICAgICAgICBjYXNlIEJDX1VQQ0E6DQotICAgICAgICAgICAgcmV0dXJuIG1fcEJDRW5naW5lID8gKCgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+U2V0Q2FsQ2hlY2tzdW0oc3RhdGUpLCBUUlVFKQ0KLSAgICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRGb250KENGWF9Gb250KiBwRm9udCkgew0KKyAgc3dpdGNoIChHZXRUeXBlKCkpIHsNCisgICAgY2FzZSBCQ19DT0RFMzk6DQorICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgY2FzZSBCQ19DT0RFMTI4Og0KKyAgICBjYXNlIEJDX0NPREUxMjhfQjoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQorICAgIGNhc2UgQkNfRUFOODoNCisgICAgY2FzZSBCQ19FQU4xMzoNCisgICAgY2FzZSBCQ19VUENBOg0KKyAgICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/ICgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+U2V0Rm9udChwRm9udCkgOiBGQUxTRTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQogfQ0KLUZYX0JPT0wJQ0ZYX0JhcmNvZGU6OlNldEZvbnQoQ0ZYX0ZvbnQqIHBGb250KQ0KLXsNCi0gICAgc3dpdGNoKEdldFR5cGUoKSkgew0KLSAgICAgICAgY2FzZSBCQ19DT0RFMzk6DQotICAgICAgICBjYXNlIEJDX0NPREFCQVI6DQotICAgICAgICBjYXNlIEJDX0NPREUxMjg6DQotICAgICAgICBjYXNlIEJDX0NPREUxMjhfQjoNCi0gICAgICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KLSAgICAgICAgY2FzZSBCQ19FQU44Og0KLSAgICAgICAgY2FzZSBCQ19FQU4xMzoNCi0gICAgICAgIGNhc2UgQkNfVVBDQToNCi0gICAgICAgICAgICByZXR1cm4gbV9wQkNFbmdpbmUgPyAoKENCQ19PbmVDb2RlKiltX3BCQ0VuZ2luZSktPlNldEZvbnQocEZvbnQpDQotICAgICAgICAgICAgICAgICAgIDogRkFMU0U7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldEZvbnRTaXplKEZYX0ZMT0FUIHNpemUpIHsNCisgIHN3aXRjaCAoR2V0VHlwZSgpKSB7DQorICAgIGNhc2UgQkNfQ09ERTM5Og0KKyAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgIGNhc2UgQkNfQ09ERTEyODoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KKyAgICBjYXNlIEJDX0VBTjg6DQorICAgIGNhc2UgQkNfRUFOMTM6DQorICAgIGNhc2UgQkNfVVBDQToNCisgICAgICByZXR1cm4gbV9wQkNFbmdpbmUNCisgICAgICAgICAgICAgICAgID8gKCgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+U2V0Rm9udFNpemUoc2l6ZSksIFRSVUUpDQorICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCiB9DQotRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0Rm9udFNpemUoRlhfRkxPQVQgc2l6ZSkNCi17DQotICAgIHN3aXRjaChHZXRUeXBlKCkpIHsNCi0gICAgICAgIGNhc2UgQkNfQ09ERTM5Og0KLSAgICAgICAgY2FzZSBCQ19DT0RBQkFSOg0KLSAgICAgICAgY2FzZSBCQ19DT0RFMTI4Og0KLSAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQotICAgICAgICBjYXNlIEJDX0NPREUxMjhfQzoNCi0gICAgICAgIGNhc2UgQkNfRUFOODoNCi0gICAgICAgIGNhc2UgQkNfRUFOMTM6DQotICAgICAgICBjYXNlIEJDX1VQQ0E6DQotICAgICAgICAgICAgcmV0dXJuIG1fcEJDRW5naW5lID8gKCgoQ0JDX09uZUNvZGUqKW1fcEJDRW5naW5lKS0+U2V0Rm9udFNpemUoc2l6ZSksIFRSVUUpDQotICAgICAgICAgICAgICAgICAgIDogRkFMU0U7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldEZvbnRTdHlsZShpbnQzMl90IHN0eWxlKSB7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX0NPREUzOToNCisgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICBjYXNlIEJDX0NPREUxMjg6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KKyAgICBjYXNlIEJDX0NPREUxMjhfQzoNCisgICAgY2FzZSBCQ19FQU44Og0KKyAgICBjYXNlIEJDX0VBTjEzOg0KKyAgICBjYXNlIEJDX1VQQ0E6DQorICAgICAgcmV0dXJuIG1fcEJDRW5naW5lDQorICAgICAgICAgICAgICAgICA/ICgoKENCQ19PbmVDb2RlKiltX3BCQ0VuZ2luZSktPlNldEZvbnRTdHlsZShzdHlsZSksIFRSVUUpDQorICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCiB9DQotRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpDQotew0KLSAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQotICAgICAgICBjYXNlIEJDX0NPREUzOToNCi0gICAgICAgIGNhc2UgQkNfQ09EQUJBUjoNCi0gICAgICAgIGNhc2UgQkNfQ09ERTEyODoNCi0gICAgICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KLSAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQotICAgICAgICBjYXNlIEJDX0VBTjg6DQotICAgICAgICBjYXNlIEJDX0VBTjEzOg0KLSAgICAgICAgY2FzZSBCQ19VUENBOg0KLSAgICAgICAgICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/ICgoKENCQ19PbmVDb2RlKiltX3BCQ0VuZ2luZSktPlNldEZvbnRTdHlsZShzdHlsZSksIFRSVUUpDQotICAgICAgICAgICAgICAgICAgIDogRkFMU0U7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldEZvbnRDb2xvcihGWF9BUkdCIGNvbG9yKSB7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX0NPREUzOToNCisgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICBjYXNlIEJDX0NPREUxMjg6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KKyAgICBjYXNlIEJDX0NPREUxMjhfQzoNCisgICAgY2FzZSBCQ19FQU44Og0KKyAgICBjYXNlIEJDX0VBTjEzOg0KKyAgICBjYXNlIEJDX1VQQ0E6DQorICAgICAgcmV0dXJuIG1fcEJDRW5naW5lDQorICAgICAgICAgICAgICAgICA/ICgoKENCQ19PbmVDb2RlKiltX3BCQ0VuZ2luZSktPlNldEZvbnRDb2xvcihjb2xvciksIFRSVUUpDQorICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCiB9DQotRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpDQotew0KLSAgICBzd2l0Y2goR2V0VHlwZSgpKSB7DQotICAgICAgICBjYXNlIEJDX0NPREUzOToNCi0gICAgICAgIGNhc2UgQkNfQ09EQUJBUjoNCi0gICAgICAgIGNhc2UgQkNfQ09ERTEyODoNCi0gICAgICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KLSAgICAgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQotICAgICAgICBjYXNlIEJDX0VBTjg6DQotICAgICAgICBjYXNlIEJDX0VBTjEzOg0KLSAgICAgICAgY2FzZSBCQ19VUENBOg0KLSAgICAgICAgICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/ICgoKENCQ19PbmVDb2RlKiltX3BCQ0VuZ2luZSktPlNldEZvbnRDb2xvcihjb2xvciksIFRSVUUpDQotICAgICAgICAgICAgICAgICAgIDogRkFMU0U7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikgew0KKyAgdHlwZWRlZiBGWF9CT09MIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShCQ19URVhUX0xPQyk7DQorICBtZW1wdHJ0eXBlIG1lbXB0ciA9IE5VTEw7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX0NPREUzOToNCisgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX0NvZGUzOTo6U2V0VGV4dExvY2F0aW9uOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19Db2RhYmFyOjpTZXRUZXh0TG9jYXRpb247DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgQkNfQ09ERTEyODoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KKyAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfQ29kZTEyODo6U2V0VGV4dExvY2F0aW9uOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEJDRW5naW5lICYmIG1lbXB0ciA/IChtX3BCQ0VuZ2luZS0+Km1lbXB0cikobG9jYXRpb24pIDogRkFMU0U7DQogfQ0KLUZYX0JPT0wJQ0ZYX0JhcmNvZGU6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikNCi17DQotICAgIHR5cGVkZWYgRlhfQk9PTCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoQkNfVEVYVF9MT0MpOw0KLSAgICBtZW1wdHJ0eXBlIG1lbXB0ciA9IE5VTEw7DQotICAgIHN3aXRjaChHZXRUeXBlKCkpIHsNCi0gICAgICAgIGNhc2UgQkNfQ09ERTM5Og0KLSAgICAgICAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfQ29kZTM5OjpTZXRUZXh0TG9jYXRpb247DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEJDX0NPREFCQVI6DQotICAgICAgICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19Db2RhYmFyOjpTZXRUZXh0TG9jYXRpb247DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEJDX0NPREUxMjg6DQotICAgICAgICBjYXNlIEJDX0NPREUxMjhfQjoNCi0gICAgICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KLSAgICAgICAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfQ29kZTEyODo6U2V0VGV4dExvY2F0aW9uOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbWVtcHRyID8gKG1fcEJDRW5naW5lLT4qbWVtcHRyKShsb2NhdGlvbikNCi0gICAgICAgICAgIDogRkFMU0U7DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pIHsNCisgIHR5cGVkZWYgRlhfQk9PTCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoaW50MzJfdCk7DQorICBtZW1wdHJ0eXBlIG1lbXB0ciA9IE5VTEw7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX0NPREUzOToNCisgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX0NvZGUzOTo6U2V0V2lkZU5hcnJvd1JhdGlvOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19Db2RhYmFyOjpTZXRXaWRlTmFycm93UmF0aW87DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbWVtcHRyID8gKG1fcEJDRW5naW5lLT4qbWVtcHRyKShyYXRpbykgOiBGQUxTRTsNCiB9DQotRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pDQotew0KLSAgICB0eXBlZGVmIEZYX0JPT0wgKENCQ19Db2RlQmFzZTo6Km1lbXB0cnR5cGUpKGludDMyX3QpOw0KLSAgICBtZW1wdHJ0eXBlIG1lbXB0ciA9IE5VTEw7DQotICAgIHN3aXRjaChHZXRUeXBlKCkpIHsNCi0gICAgICAgIGNhc2UgQkNfQ09ERTM5Og0KLSAgICAgICAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfQ29kZTM5OjpTZXRXaWRlTmFycm93UmF0aW87DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEJDX0NPREFCQVI6DQotICAgICAgICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19Db2RhYmFyOjpTZXRXaWRlTmFycm93UmF0aW87DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAobV9wQkNFbmdpbmUtPiptZW1wdHIpKHJhdGlvKQ0KLSAgICAgICAgICAgOiBGQUxTRTsNCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydCkgew0KKyAgdHlwZWRlZiBGWF9CT09MIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShGWF9DSEFSKTsNCisgIG1lbXB0cnR5cGUgbWVtcHRyID0gTlVMTDsNCisgIHN3aXRjaCAoR2V0VHlwZSgpKSB7DQorICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX0NvZGFiYXI6OlNldFN0YXJ0Q2hhcjsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAobV9wQkNFbmdpbmUtPiptZW1wdHIpKHN0YXJ0KSA6IEZBTFNFOw0KIH0NCi1GWF9CT09MCUNGWF9CYXJjb2RlOjpTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydCkNCi17DQotICAgIHR5cGVkZWYgRlhfQk9PTCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoRlhfQ0hBUik7DQotICAgIG1lbXB0cnR5cGUgbWVtcHRyID0gTlVMTDsNCi0gICAgc3dpdGNoKEdldFR5cGUoKSkgew0KLSAgICAgICAgY2FzZSBCQ19DT0RBQkFSOg0KLSAgICAgICAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfQ29kYWJhcjo6U2V0U3RhcnRDaGFyOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbWVtcHRyID8gKG1fcEJDRW5naW5lLT4qbWVtcHRyKShzdGFydCkNCi0gICAgICAgICAgIDogRkFMU0U7DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0RW5kQ2hhcihGWF9DSEFSIGVuZCkgew0KKyAgdHlwZWRlZiBGWF9CT09MIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShGWF9DSEFSKTsNCisgIG1lbXB0cnR5cGUgbWVtcHRyID0gTlVMTDsNCisgIHN3aXRjaCAoR2V0VHlwZSgpKSB7DQorICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX0NvZGFiYXI6OlNldEVuZENoYXI7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbWVtcHRyID8gKG1fcEJDRW5naW5lLT4qbWVtcHRyKShlbmQpIDogRkFMU0U7DQogfQ0KLUZYX0JPT0wJQ0ZYX0JhcmNvZGU6OlNldEVuZENoYXIoRlhfQ0hBUiBlbmQpDQotew0KLSAgICB0eXBlZGVmIEZYX0JPT0wgKENCQ19Db2RlQmFzZTo6Km1lbXB0cnR5cGUpKEZYX0NIQVIpOw0KLSAgICBtZW1wdHJ0eXBlIG1lbXB0ciA9IE5VTEw7DQotICAgIHN3aXRjaChHZXRUeXBlKCkpIHsNCi0gICAgICAgIGNhc2UgQkNfQ09EQUJBUjoNCi0gICAgICAgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX0NvZGFiYXI6OlNldEVuZENoYXI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAobV9wQkNFbmdpbmUtPiptZW1wdHIpKGVuZCkNCi0gICAgICAgICAgIDogRkFMU0U7DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pIHsNCisgIHR5cGVkZWYgRlhfQk9PTCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoaW50MzJfdCk7DQorICBtZW1wdHJ0eXBlIG1lbXB0ciA9IE5VTEw7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX1FSX0NPREU6DQorICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19RUkNvZGU6OlNldFZlcnNpb247DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbWVtcHRyID8gKG1fcEJDRW5naW5lLT4qbWVtcHRyKSh2ZXJzaW9uKSA6IEZBTFNFOw0KIH0NCi1GWF9CT09MCUNGWF9CYXJjb2RlOjpTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbikNCi17DQotICAgIHR5cGVkZWYgRlhfQk9PTCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoaW50MzJfdCk7DQotICAgIG1lbXB0cnR5cGUgbWVtcHRyID0gTlVMTDsNCi0gICAgc3dpdGNoKEdldFR5cGUoKSkgew0KLSAgICAgICAgY2FzZSBCQ19RUl9DT0RFOg0KLSAgICAgICAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfUVJDb2RlOjpTZXRWZXJzaW9uOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbWVtcHRyID8gKG1fcEJDRW5naW5lLT4qbWVtcHRyKSh2ZXJzaW9uKQ0KLSAgICAgICAgICAgOiBGQUxTRTsNCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSB7DQorICB0eXBlZGVmIEZYX0JPT0wgKENCQ19Db2RlQmFzZTo6Km1lbXB0cnR5cGUpKGludDMyX3QpOw0KKyAgbWVtcHRydHlwZSBtZW1wdHIgPSBOVUxMOw0KKyAgc3dpdGNoIChHZXRUeXBlKCkpIHsNCisgICAgY2FzZSBCQ19RUl9DT0RFOg0KKyAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfUVJDb2RlOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBCQ19QREY0MTc6DQorICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19QREY0MTdJOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbDsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbWVtcHRyID8gKG1fcEJDRW5naW5lLT4qbWVtcHRyKShsZXZlbCkgOiBGQUxTRTsNCiB9DQotRlhfQk9PTAlDRlhfQmFyY29kZTo6U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCkNCi17DQotICAgIHR5cGVkZWYgRlhfQk9PTCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoaW50MzJfdCk7DQotICAgIG1lbXB0cnR5cGUgbWVtcHRyID0gTlVMTDsNCi0gICAgc3dpdGNoKEdldFR5cGUoKSkgew0KLSAgICAgICAgY2FzZSBCQ19RUl9DT0RFOg0KLSAgICAgICAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfUVJDb2RlOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgQkNfUERGNDE3Og0KLSAgICAgICAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfUERGNDE3STo6U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbWVtcHRyID8gKG1fcEJDRW5naW5lLT4qbWVtcHRyKShsZXZlbCkNCi0gICAgICAgICAgIDogRkFMU0U7DQotfQ0KLUZYX0JPT0wJQ0ZYX0JhcmNvZGU6OlNldFRydW5jYXRlZChGWF9CT09MIHRydW5jYXRlZCkNCi17DQotICAgIHR5cGVkZWYgdm9pZCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoRlhfQk9PTCk7DQotICAgIG1lbXB0cnR5cGUgbWVtcHRyID0gTlVMTDsNCi0gICAgc3dpdGNoKEdldFR5cGUoKSkgew0KLSAgICAgICAgY2FzZSBCQ19QREY0MTc6DQotICAgICAgICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19QREY0MTdJOjpTZXRUcnVuY2F0ZWQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAoKG1fcEJDRW5naW5lLT4qbWVtcHRyKSh0cnVuY2F0ZWQpLCBUUlVFKQ0KLSAgICAgICAgICAgOiBGQUxTRTsNCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRUcnVuY2F0ZWQoRlhfQk9PTCB0cnVuY2F0ZWQpIHsNCisgIHR5cGVkZWYgdm9pZCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoRlhfQk9PTCk7DQorICBtZW1wdHJ0eXBlIG1lbXB0ciA9IE5VTEw7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX1BERjQxNzoNCisgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX1BERjQxN0k6OlNldFRydW5jYXRlZDsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAoKG1fcEJDRW5naW5lLT4qbWVtcHRyKSh0cnVuY2F0ZWQpLCBUUlVFKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KIH0NCiAjaWZuZGVmIEJDRXhjZXB0aW9uTk8NCi0jZGVmaW5lCUJDRXhjZXB0aW9uTk8JCQkJCQkJCQkJCSAgICAgICAgICAgMA0KKyNkZWZpbmUgQkNFeGNlcHRpb25OTyAwDQogI2VuZGlmDQogI2lmbmRlZiBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbg0KLSNkZWZpbmUJQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb24JCQkJCQkJCSAgICAgICAgICAgOA0KKyNkZWZpbmUgQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb24gOA0KICNlbmRpZg0KICNpZm5kZWYgQkNFeGNlcHRpb25VblN1cHBvcnRlZEJhcmNvZGUNCi0jZGVmaW5lCUJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlCQkJCQkJCSAgICAgICAgICAxOA0KKyNkZWZpbmUgQkNFeGNlcHRpb25VblN1cHBvcnRlZEJhcmNvZGUgMTgNCiAjZW5kaWYNCi1GWF9CT09MIENGWF9CYXJjb2RlOjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKCFtX3BCQ0VuZ2luZSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BCQ0VuZ2luZS0+RW5jb2RlKGNvbnRlbnRzLCBpc0RldmljZSwgZSk7DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmICghbV9wQkNFbmdpbmUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEJDRW5naW5lLT5FbmNvZGUoY29udGVudHMsIGlzRGV2aWNlLCBlKTsNCiB9DQotRlhfQk9PTCBDRlhfQmFyY29kZTo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKCFtX3BCQ0VuZ2luZSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BCQ0VuZ2luZS0+UmVuZGVyRGV2aWNlKGRldmljZSwgbWF0aXJ4LCBlKTsNCitGWF9CT09MIENGWF9CYXJjb2RlOjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmICghbV9wQkNFbmdpbmUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEJDRW5naW5lLT5SZW5kZXJEZXZpY2UoZGV2aWNlLCBtYXRpcngsIGUpOw0KIH0NCi1GWF9CT09MIENGWF9CYXJjb2RlOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmICghbV9wQkNFbmdpbmUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wQkNFbmdpbmUtPlJlbmRlckJpdG1hcChwT3V0Qml0bWFwLCBlKTsNCitGWF9CT09MIENGWF9CYXJjb2RlOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgaWYgKCFtX3BCQ0VuZ2luZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gbV9wQkNFbmdpbmUtPlJlbmRlckJpdG1hcChwT3V0Qml0bWFwLCBlKTsNCiB9DQogI2RlZmluZSBCQ19UWVBFX01JTiBCQ19DT0RFMzkNCiAjZGVmaW5lIEJDX1RZUEVfTUFYIEJDX0RBVEFNQVRSSVgNCi1DRlhfV2lkZVN0cmluZwlDRlhfQmFyY29kZTo6RGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgJmVycm9yQ29kZSkNCi17DQotICAgIGZvcihCQ19UWVBFIHQgPSBCQ19UWVBFX01JTjsgdCA8PSBCQ19UWVBFX01BWDsgdCA9IChCQ19UWVBFKSgoaW50MzJfdCl0ICsgMSkpIHsNCi0gICAgICAgIENCQ19Db2RlQmFzZSogcFRtcEVuZ2luZSA9IEZYX0JhcmNvZGVfQ3JlYXRlQmFyQ29kZUVuZ2luZU9iamVjdCh0KTsNCi0gICAgICAgIGlmKCFwVG1wRW5naW5lKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVN0cmluZyByZXQgPSBwVG1wRW5naW5lLT5EZWNvZGUoYnVmLCB3aWR0aCwgaGVpZ2h0LCBlcnJvckNvZGUpOw0KLSAgICAgICAgaWYoZXJyb3JDb2RlID09IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICAgICAgfQ0KK0NGWF9XaWRlU3RyaW5nIENGWF9CYXJjb2RlOjpEZWNvZGUodWludDhfdCogYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZXJyb3JDb2RlKSB7DQorICBmb3IgKEJDX1RZUEUgdCA9IEJDX1RZUEVfTUlOOyB0IDw9IEJDX1RZUEVfTUFYOw0KKyAgICAgICB0ID0gKEJDX1RZUEUpKChpbnQzMl90KXQgKyAxKSkgew0KKyAgICBDQkNfQ29kZUJhc2UqIHBUbXBFbmdpbmUgPSBGWF9CYXJjb2RlX0NyZWF0ZUJhckNvZGVFbmdpbmVPYmplY3QodCk7DQorICAgIGlmICghcFRtcEVuZ2luZSkgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIGVycm9yQ29kZSA9IEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlOw0KLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgcmV0ID0gcFRtcEVuZ2luZS0+RGVjb2RlKGJ1Ziwgd2lkdGgsIGhlaWdodCwgZXJyb3JDb2RlKTsNCisgICAgaWYgKGVycm9yQ29kZSA9PSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgcmV0dXJuIHJldDsNCisgICAgfQ0KKyAgfQ0KKyAgZXJyb3JDb2RlID0gQkNFeGNlcHRpb25VblN1cHBvcnRlZEJhcmNvZGU7DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCiB9DQotQ0ZYX1dpZGVTdHJpbmcJQ0ZYX0JhcmNvZGU6OkRlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIGludDMyX3QgJmVycm9yQ29kZSkNCi17DQotICAgIGZvcihCQ19UWVBFIHQgPSBCQ19UWVBFX01JTjsgdCA8PSBCQ19UWVBFX01BWDsgdCA9IChCQ19UWVBFKSgoaW50MzJfdCl0ICsgMSkpIHsNCi0gICAgICAgIENCQ19Db2RlQmFzZSogcFRtcEVuZ2luZSA9IEZYX0JhcmNvZGVfQ3JlYXRlQmFyQ29kZUVuZ2luZU9iamVjdCh0KTsNCi0gICAgICAgIGlmKCFwVG1wRW5naW5lKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVN0cmluZyByZXQgPSBwVG1wRW5naW5lLT5EZWNvZGUocEJpdG1hcCwgZXJyb3JDb2RlKTsNCi0gICAgICAgIGlmKGVycm9yQ29kZSA9PSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgcmV0dXJuIHJldDsNCi0gICAgICAgIH0NCitDRlhfV2lkZVN0cmluZyBDRlhfQmFyY29kZTo6RGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZXJyb3JDb2RlKSB7DQorICBmb3IgKEJDX1RZUEUgdCA9IEJDX1RZUEVfTUlOOyB0IDw9IEJDX1RZUEVfTUFYOw0KKyAgICAgICB0ID0gKEJDX1RZUEUpKChpbnQzMl90KXQgKyAxKSkgew0KKyAgICBDQkNfQ29kZUJhc2UqIHBUbXBFbmdpbmUgPSBGWF9CYXJjb2RlX0NyZWF0ZUJhckNvZGVFbmdpbmVPYmplY3QodCk7DQorICAgIGlmICghcFRtcEVuZ2luZSkgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIGVycm9yQ29kZSA9IEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlOw0KLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgcmV0ID0gcFRtcEVuZ2luZS0+RGVjb2RlKHBCaXRtYXAsIGVycm9yQ29kZSk7DQorICAgIGlmIChlcnJvckNvZGUgPT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIHJldHVybiByZXQ7DQorICAgIH0NCisgIH0NCisgIGVycm9yQ29kZSA9IEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlOw0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQogfQ0KLUlGWF9CYXJjb2RlKiBGWF9CYXJjb2RlX0NyZWF0ZShCQ19UWVBFIHR5cGUpDQotew0KLSAgICBDRlhfQmFyY29kZSogcEJhcmNvZGUgPSBGWF9ORVcgQ0ZYX0JhcmNvZGU7DQotICAgIGlmIChwQmFyY29kZS0+Q3JyZWF0ZSh0eXBlKSkgew0KLSAgICAgICAgcmV0dXJuIHBCYXJjb2RlOw0KLSAgICB9DQotICAgIHBCYXJjb2RlLT5SZWxlYXNlKCk7DQotICAgIHJldHVybiBOVUxMOw0KK0lGWF9CYXJjb2RlKiBGWF9CYXJjb2RlX0NyZWF0ZShCQ19UWVBFIHR5cGUpIHsNCisgIENGWF9CYXJjb2RlKiBwQmFyY29kZSA9IEZYX05FVyBDRlhfQmFyY29kZTsNCisgIGlmIChwQmFyY29kZS0+Q3JyZWF0ZSh0eXBlKSkgew0KKyAgICByZXR1cm4gcEJhcmNvZGU7DQorICB9DQorICBwQmFyY29kZS0+UmVsZWFzZSgpOw0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2JhcmNvZGVpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2JhcmNvZGVpbXAuaAppbmRleCA3YTQ2ODFiLi5iOTM5ODg1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9iYXJjb2RlaW1wLmgKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfYmFyY29kZWltcC5oCkBAIC0xNiwzNiArMTYsMzcgQEAKIGNsYXNzIENGV0xfQmFyY29kZUVkaXREZWxlZ2F0ZTsNCiBjbGFzcyBDRldMX0JhcmNvZGVJbXA7DQogY2xhc3MgQ0ZXTF9CYXJjb2RlSW1wRGVsZWdhdGU7DQotI2RlZmluZSBYRkFfQkNTX05lZWRVcGRhdGUJCTB4MDAwMQ0KLSNkZWZpbmUgWEZBX0JDU19FbmNvZGVTdWNjZXNzCTB4MDAwMg0KLWNsYXNzIENGV0xfQmFyY29kZUltcCA6IHB1YmxpYyBDRldMX0VkaXRJbXANCi17DQotcHVibGljOg0KLSAgICBDRldMX0JhcmNvZGVJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBDRldMX0JhcmNvZGVJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIHZpcnR1YWwgfkNGV0xfQmFyY29kZUltcCgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldFR5cGUoQkNfVFlQRSB0eXBlKTsNCi0gICAgRlhfQk9PTAkJCQlJc1Byb3RlY3RlZFR5cGUoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJCQlHZW5lcmF0ZUJhcmNvZGVJbWFnZUNhY2hlKCk7DQotICAgIHZvaWQJCQlDcmVhdGVCYXJjb2RlRW5naW5lKCk7DQotICAgIHZvaWQJCQlSZWxlYXNlQmFyY29kZUVuZ2luZSgpOw0KLSAgICBJRlhfQmFyY29kZQkJKm1fcEJhcmNvZGVFbmdpbmU7DQotICAgIEZYX0RXT1JECQltX2R3U3RhdHVzOw0KLSAgICBCQ19UWVBFCQkJbV90eXBlOw0KLSAgICBmcmllbmQgY2xhc3MgQ0ZXTF9CYXJjb2RlSW1wRGVsZWdhdGU7DQorI2RlZmluZSBYRkFfQkNTX05lZWRVcGRhdGUgMHgwMDAxDQorI2RlZmluZSBYRkFfQkNTX0VuY29kZVN1Y2Nlc3MgMHgwMDAyDQorY2xhc3MgQ0ZXTF9CYXJjb2RlSW1wIDogcHVibGljIENGV0xfRWRpdEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfQmFyY29kZUltcChJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBDRldMX0JhcmNvZGVJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIHZpcnR1YWwgfkNGV0xfQmFyY29kZUltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0VHlwZShCQ19UWVBFIHR5cGUpOw0KKyAgRlhfQk9PTCBJc1Byb3RlY3RlZFR5cGUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBHZW5lcmF0ZUJhcmNvZGVJbWFnZUNhY2hlKCk7DQorICB2b2lkIENyZWF0ZUJhcmNvZGVFbmdpbmUoKTsNCisgIHZvaWQgUmVsZWFzZUJhcmNvZGVFbmdpbmUoKTsNCisgIElGWF9CYXJjb2RlKiBtX3BCYXJjb2RlRW5naW5lOw0KKyAgRlhfRFdPUkQgbV9kd1N0YXR1czsNCisgIEJDX1RZUEUgbV90eXBlOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfQmFyY29kZUltcERlbGVnYXRlOw0KIH07DQotY2xhc3MgQ0ZXTF9CYXJjb2RlSW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9FZGl0SW1wRGVsZWdhdGUNCi17DQotcHVibGljOg0KLSAgICBDRldMX0JhcmNvZGVJbXBEZWxlZ2F0ZShDRldMX0JhcmNvZGVJbXAgKnBPd25lcik7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCitjbGFzcyBDRldMX0JhcmNvZGVJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX0VkaXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfQmFyY29kZUltcERlbGVnYXRlKENGV0xfQmFyY29kZUltcCogcE93bmVyKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY2FyZXRpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NhcmV0aW1wLmgKaW5kZXggNmU5ZDE5Ny4uYTAxZDJlZiAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY2FyZXRpbXAuaAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jYXJldGltcC5oCkBAIC0xMiw1MyArMTIsNTQgQEAKIGNsYXNzIElGV0xfV2lkZ2V0Ow0KIGNsYXNzIENGV0xfQ2FyZXRJbXA7DQogY2xhc3MgQ0ZXTF9DYXJldEltcERlbGVnYXRlOw0KLWNsYXNzIENGV0xfQ2FyZXRJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXANCi17DQotcHVibGljOg0KLSAgICBDRldMX0NhcmV0SW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgQ0ZXTF9DYXJldEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9DYXJldEltcCgpOw0KK2NsYXNzIENGV0xfQ2FyZXRJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0NhcmV0SW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIENGV0xfQ2FyZXRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICB2aXJ0dWFsIH5DRldMX0NhcmV0SW1wKCk7DQogDQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KIA0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KIA0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KIA0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJU2hvd0NhcmV0KEZYX0JPT0wgYkZsYWcgPSBUUlVFKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSIEdldEZyZXF1ZW5jeShGWF9EV09SRCAmZWxhcHNlKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSIFNldEZyZXF1ZW5jeShGWF9EV09SRCBlbGFwc2UpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0Q29sb3IoQ0ZYX0NvbG9yIGNyRmlsbCk7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9CT09MCQkgIERyYXdDYXJldEJLKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIGNsYXNzIENGV0xfQ2FyZXRUaW1lcg0KLSAgICB7DQotICAgIHB1YmxpYzoNCi0gICAgICAgIENGV0xfQ2FyZXRUaW1lcihDRldMX0NhcmV0SW1wICptX3BDYXJldCk7DQotICAgICAgICB2aXJ0dWFsIH5DRldMX0NhcmV0VGltZXIoKSB7fQ0KLSAgICAgICAgdmlydHVhbCBpbnQzMl90IFJ1bihGV0xfSFRJTUVSIGhUaW1lcik7DQotICAgICAgICBDRldMX0NhcmV0SW1wICptX3BDYXJldDsNCisgIHZpcnR1YWwgRldMX0VSUiBTaG93Q2FyZXQoRlhfQk9PTCBiRmxhZyA9IFRSVUUpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldEZyZXF1ZW5jeShGWF9EV09SRCYgZWxhcHNlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRGcmVxdWVuY3koRlhfRFdPUkQgZWxhcHNlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRDb2xvcihDRlhfQ29sb3IgY3JGaWxsKTsNCiANCi0gICAgfTsNCi0gICAgQ0ZXTF9DYXJldFRpbWVyICptX3BUaW1lcjsNCi0gICAgRldMX0hUSU1FUgkJbV9oVGltZXI7DQotICAgIEZYX0RXT1JECQltX2R3RWxhcHNlOw0KLSAgICBDRlhfQ29sb3IJCW1fY3JGaWxsOw0KLSAgICBGWF9CT09MCQkJbV9iU2V0Q29sb3I7DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX0NhcmV0SW1wRGVsZWdhdGU7DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX0NhcmV0VGltZXI7DQotDQorIHByb3RlY3RlZDoNCisgIEZYX0JPT0wgRHJhd0NhcmV0QksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIGNsYXNzIENGV0xfQ2FyZXRUaW1lciB7DQorICAgcHVibGljOg0KKyAgICBDRldMX0NhcmV0VGltZXIoQ0ZXTF9DYXJldEltcCogbV9wQ2FyZXQpOw0KKyAgICB2aXJ0dWFsIH5DRldMX0NhcmV0VGltZXIoKSB7fQ0KKyAgICB2aXJ0dWFsIGludDMyX3QgUnVuKEZXTF9IVElNRVIgaFRpbWVyKTsNCisgICAgQ0ZXTF9DYXJldEltcCogbV9wQ2FyZXQ7DQorICB9Ow0KKyAgQ0ZXTF9DYXJldFRpbWVyKiBtX3BUaW1lcjsNCisgIEZXTF9IVElNRVIgbV9oVGltZXI7DQorICBGWF9EV09SRCBtX2R3RWxhcHNlOw0KKyAgQ0ZYX0NvbG9yIG1fY3JGaWxsOw0KKyAgRlhfQk9PTCBtX2JTZXRDb2xvcjsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0NhcmV0SW1wRGVsZWdhdGU7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9DYXJldFRpbWVyOw0KIH07DQotY2xhc3MgQ0ZXTF9DYXJldEltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUNCi17DQotcHVibGljOg0KLSAgICBDRldMX0NhcmV0SW1wRGVsZWdhdGUoQ0ZXTF9DYXJldEltcCAqcE93bmVyKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorY2xhc3MgQ0ZXTF9DYXJldEltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDRldMX0NhcmV0SW1wRGVsZWdhdGUoQ0ZXTF9DYXJldEltcCogcE93bmVyKTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KIA0KLXByb3RlY3RlZDoNCi0gICAgQ0ZXTF9DYXJldEltcCAqbV9wT3duZXI7DQorIHByb3RlY3RlZDoNCisgIENGV0xfQ2FyZXRJbXAqIG1fcE93bmVyOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY2hlY2tib3hpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NoZWNrYm94aW1wLmgKaW5kZXggNDkwMjAyZC4uMjRkMGIxOSAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY2hlY2tib3hpbXAuaAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jaGVja2JveGltcC5oCkBAIC0xMiw0OSArMTIsNTIgQEAKIGNsYXNzIElGV0xfV2lkZ2V0Ow0KIGNsYXNzIENGV0xfQ2hlY2tCb3hJbXA7DQogY2xhc3MgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOw0KLWNsYXNzIENGV0xfQ2hlY2tCb3hJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXANCi17DQotcHVibGljOg0KLSAgICBDRldMX0NoZWNrQm94SW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgQ0ZXTF9DaGVja0JveEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgfkNGV0xfQ2hlY2tCb3hJbXAoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldENsYXNzSUQoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJVXBkYXRlKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0Q2hlY2tTdGF0ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldENoZWNrU3RhdGUoaW50MzJfdCBpQ2hlY2spOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAkJTGF5b3V0KCk7DQotICAgIEZYX0RXT1JECUdldFBhcnRTdGF0ZXMoKTsNCi0gICAgdm9pZAkJVXBkYXRlVGV4dE91dFN0eWxlcygpOw0KLSAgICB2b2lkCQlOZXh0U3RhdGVzKCk7DQotICAgIENGWF9SZWN0RgltX3J0Q2xpZW50Ow0KLSAgICBDRlhfUmVjdEYJbV9ydEJveDsNCi0gICAgQ0ZYX1JlY3RGCW1fcnRDYXB0aW9uOw0KLSAgICBDRlhfUmVjdEYJbV9ydEZvY3VzOw0KLSAgICBGWF9EV09SRAltX2R3VFRPU3R5bGVzOw0KLSAgICBpbnQzMl90CW1faVRUT0FsaWduOw0KLSAgICBGWF9CT09MCQltX2JCdG5Eb3duOw0KLSAgICBmcmllbmQgY2xhc3MgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfQ2hlY2tCb3hJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0NoZWNrQm94SW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIENGV0xfQ2hlY2tCb3hJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICB+Q0ZXTF9DaGVja0JveEltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgVXBkYXRlKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGVja1N0YXRlKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0Q2hlY2tTdGF0ZShpbnQzMl90IGlDaGVjayk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgTGF5b3V0KCk7DQorICBGWF9EV09SRCBHZXRQYXJ0U3RhdGVzKCk7DQorICB2b2lkIFVwZGF0ZVRleHRPdXRTdHlsZXMoKTsNCisgIHZvaWQgTmV4dFN0YXRlcygpOw0KKyAgQ0ZYX1JlY3RGIG1fcnRDbGllbnQ7DQorICBDRlhfUmVjdEYgbV9ydEJveDsNCisgIENGWF9SZWN0RiBtX3J0Q2FwdGlvbjsNCisgIENGWF9SZWN0RiBtX3J0Rm9jdXM7DQorICBGWF9EV09SRCBtX2R3VFRPU3R5bGVzOw0KKyAgaW50MzJfdCBtX2lUVE9BbGlnbjsNCisgIEZYX0JPT0wgbV9iQnRuRG93bjsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU7DQogfTsNCi1jbGFzcyBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZShDRldMX0NoZWNrQm94SW1wICpwT3duZXIpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJT25BY3RpdmF0ZShDRldMX01lc3NhZ2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQotICAgIHZvaWQJT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAlPbkxCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAlPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAlPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25LZXlEb3duKENGV0xfTXNnS2V5ICpwTXNnKTsNCi0gICAgQ0ZXTF9DaGVja0JveEltcCAqbV9wT3duZXI7DQorY2xhc3MgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGUoQ0ZXTF9DaGVja0JveEltcCogcE93bmVyKTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIE9uQWN0aXZhdGUoQ0ZXTF9NZXNzYWdlKiBwTXNnKTsNCisgIHZvaWQgT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uS2V5RG93bihDRldMX01zZ0tleSogcE1zZyk7DQorICBDRldMX0NoZWNrQm94SW1wKiBtX3BPd25lcjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NvbWJvYm94aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jb21ib2JveGltcC5oCmluZGV4IDA1OWU2NTcuLjg2YjI2ZjIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NvbWJvYm94aW1wLmgKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY29tYm9ib3hpbXAuaApAQCAtMjIsMjA2ICsyMiwyMTcgQEAKIGNsYXNzIENGV0xfQ29tYm9Cb3hJbXA7DQogY2xhc3MgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOw0KIGNsYXNzIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOw0KLWNsYXNzIENGV0xfQ29tYm9FZGl0IDogcHVibGljIENGV0xfRWRpdEltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfQ29tYm9FZGl0KElGV0xfV2lkZ2V0ICpwT3V0ZXIpOw0KLSAgICBDRldMX0NvbWJvRWRpdChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCitjbGFzcyBDRldMX0NvbWJvRWRpdCA6IHB1YmxpYyBDRldMX0VkaXRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0NvbWJvRWRpdChJRldMX1dpZGdldCogcE91dGVyKTsNCisgIENGV0xfQ29tYm9FZGl0KGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCiANCi0gICAgdm9pZAlDbGVhclNlbGVjdGVkKCk7DQotICAgIHZvaWQJU2V0U2VsZWN0ZWQoKTsNCi0gICAgdm9pZAlFbmRDYXJldCgpOw0KLSAgICB2b2lkCUZsYWdGb2N1cyhGWF9CT09MIGJTZXQpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAlTZXRDb21ib0JveEZvY3VzKEZYX0JPT0wgYlNldCk7DQotICAgIENGV0xfQ29tYm9Cb3hJbXAJKm1fcE91dGVyOw0KLSAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0VkaXREZWxlZ2F0ZTsNCi19Ow0KLWNsYXNzIENGV0xfQ29tYm9FZGl0RGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9FZGl0SW1wRGVsZWdhdGUNCi17DQotcHVibGljOg0KLSAgICBDRldMX0NvbWJvRWRpdERlbGVnYXRlKENGV0xfQ29tYm9FZGl0ICpwT3duZXIpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGV0xfQ29tYm9FZGl0ICptX3BPd25lcjsNCi19Ow0KLWNsYXNzIENGV0xfQ29tYm9MaXN0IDogcHVibGljIENGV0xfTGlzdEJveEltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfQ29tYm9MaXN0KElGV0xfV2lkZ2V0ICpwT3V0ZXIpOw0KLSAgICBDRldMX0NvbWJvTGlzdChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCi0gICAgaW50MzJfdAlNYXRjaEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzTWF0Y2gpOw0KLSAgICB2b2lkCQlDaGFuZ2VTZWxlY3RlZChpbnQzMl90IGlTZWwpOw0KLSAgICBpbnQzMl90CUNvdW50SXRlbXMoKTsNCi0gICAgdm9pZAkJR2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgsIENGWF9SZWN0RiAmcnRJdGVtKTsNCi0gICAgdm9pZAkJQ2xpZW50VG9PdXRlcihGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSk7DQotICAgIHZvaWQJCVNldEZvY3VzKEZYX0JPT0wgYlNldCk7DQotICAgIEZYX0JPT0wJCW1fYk5vdGlmeU93bmVyOw0KLSAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTsNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9Cb3hJbXA7DQotfTsNCi1jbGFzcyBDRldMX0NvbWJvTGlzdERlbGVnYXRlIDogcHVibGljIENGV0xfTGlzdEJveEltcERlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZShDRldMX0NvbWJvTGlzdCAqcE93bmVyKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQlPbkRyb3BMaXN0Rm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQotICAgIGludDMyX3QJT25Ecm9wTGlzdE1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgaW50MzJfdAlPbkRyb3BMaXN0TEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIGludDMyX3QJT25Ecm9wTGlzdExCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgaW50MzJfdAlPbkRyb3BMaXN0S2V5KENGV0xfTXNnS2V5ICpwS2V5KTsNCi0gICAgdm9pZAkJT25Ecm9wTGlzdEtleURvd24oQ0ZXTF9Nc2dLZXkgKnBLZXkpOw0KLSAgICBDRldMX0NvbWJvTGlzdCAqbV9wT3duZXI7DQotfTsNCi1jbGFzcyBDRldMX0NvbWJvQm94SW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Db21ib0JveEltcChJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIENGV0xfQ29tYm9Cb3hJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIHZpcnR1YWwgfkNGV0xfQ29tYm9Cb3hJbXAoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldENsYXNzSUQoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJTW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLCBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQlVcGRhdGUoKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWVQcm92aWRlcik7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRDdXJTZWwoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRDdXJTZWwoaW50MzJfdCBpU2VsKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldEVkaXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBuU3RhcnQgPSAwLCBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRFZGl0U2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0RWRpdFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0RWRpdExpbWl0KCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlFZGl0RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlFZGl0UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlFZGl0VW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCi0gICAgdmlydHVhbCBJRldMX0xpc3RCb3gqICBHZXRMaXN0Qm94dCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgQWZ0ZXJGb2N1c1Nob3dEcm9wTGlzdCgpOw0KLSAgICB2aXJ0dWFsIEZYX0VSUglPcGVuRHJvcERvd25MaXN0KEZYX0JPT0wgYkFjdGl2YXRlKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlFZGl0Q2FuVW5kbygpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVkaXRDYW5SZWRvKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRWRpdFVuZG8oKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlFZGl0UmVkbygpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVkaXRDYW5Db3B5KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRWRpdENhbkN1dCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVkaXRDYW5TZWxlY3RBbGwoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlFZGl0Q29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlFZGl0Q3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRWRpdFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlFZGl0U2VsZWN0QWxsKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRWRpdERlbGV0ZSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVkaXREZVNlbGVjdCgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldEJCb3goQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlFZGl0TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLCBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQlEcmF3U3RyZXRjaEhhbmRsZXIoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICBGWF9GTE9BVAlHZXRMaXN0SGVpZ2h0KCk7DQotICAgIHZvaWQJCVNob3dEcm9wTGlzdChGWF9CT09MIGJBY3RpdmF0ZSk7DQotICAgIEZYX0JPT0wJCUlzRHJvcExpc3RTaG93ZWQoKTsNCi0gICAgRlhfQk9PTAkJSXNEcm9wRG93blN0eWxlKCkgY29uc3Q7DQotICAgIHZvaWQJCU1hdGNoRWRpdFRleHQoKTsNCi0gICAgdm9pZAkJU3luY2hyRWRpdFRleHQoaW50MzJfdCBpTGlzdEl0ZW0pOw0KLSAgICB2b2lkCQlMYXlvdXQoKTsNCi0gICAgdm9pZAkJUmVTZXRUaGVtZSgpOw0KLSAgICB2b2lkCQlSZVNldEVkaXRBbGlnbm1lbnQoKTsNCi0gICAgdm9pZAkJUmVTZXRMaXN0SXRlbUFsaWdubWVudCgpOw0KLSAgICB2b2lkCQlQcm9jZXNzU2VsQ2hhbmdlZChGWF9CT09MIGJMQnV0dG9uVXApOw0KLSAgICB2b2lkCQlJbml0UHJveHlGb3JtKCk7DQotcHJvdGVjdGVkOg0KLSAgICBGV0xfRVJSCQlEaXNGb3JtX0luaXRpYWxpemUoKTsNCi0gICAgdm9pZAkJRGlzRm9ybV9Jbml0Q29tYm9MaXN0KCk7DQotICAgIHZvaWQJCURpc0Zvcm1fSW5pdENvbWJvRWRpdCgpOw0KLSAgICB2b2lkCQlEaXNGb3JtX1Nob3dEcm9wTGlzdChGWF9CT09MIGJBY3RpdmF0ZSk7DQotICAgIEZYX0JPT0wJCURpc0Zvcm1fSXNEcm9wTGlzdFNob3dlZCgpOw0KLSAgICBGV0xfRVJSCQlEaXNGb3JtX01vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KLSAgICBGV0xfRVJSCQlEaXNGb3JtX1VwZGF0ZSgpOw0KLSAgICBGWF9EV09SRAlEaXNGb3JtX0hpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgRldMX0VSUgkJRGlzRm9ybV9EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIEZXTF9FUlIJCURpc0Zvcm1fR2V0QkJveChDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2b2lkCQlEaXNGb3JtX0xheW91dCgpOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX1JlY3RGCQltX3J0Q2xpZW50Ow0KLSAgICBDRlhfUmVjdEYJCW1fcnRDb250ZW50Ow0KLSAgICBDRlhfUmVjdEYJCW1fcnRCdG47DQotICAgIENGWF9SZWN0RgkJbV9ydExpc3Q7DQotICAgIENGWF9SZWN0RgkJbV9ydFByb3h5Ow0KLSAgICBDRlhfUmVjdEYJCW1fcnRIYW5kbGVyOw0KLSAgICBJRldMX0VkaXQJCSptX3BFZGl0Ow0KLSAgICBJRldMX0xpc3RCb3gJKm1fcExpc3RCb3g7DQotICAgIElGV0xfRm9ybQkJKm1fcEZvcm07DQotICAgIEZYX0JPT0wJCQltX2JMQnV0dG9uRG93bjsNCi0gICAgRlhfQk9PTAkJCW1fYlVwRm9ybUhhbmRsZXI7DQotICAgIGludDMyX3QJCW1faUN1clNlbDsNCi0gICAgaW50MzJfdAkJbV9pQnRuU3RhdGU7DQotICAgIEZYX0ZMT0FUICAgICAgICBtX2ZDb21ib0Zvcm1IYW5kbGVyOw0KLSAgICBGWF9GTE9BVCAgICAgICAgbV9mSXRlbUhlaWdodDsNCi0gICAgRlhfQk9PTAkJCW1fYk5lZWRTaG93TGlzdDsNCi0gICAgQ0ZXTF9Gb3JtUHJveHlJbXAgKm1fcFByb3h5Ow0KLSAgICBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZSAqbV9wTGlzdFByb3h5RGVsZWdhdGU7DQorICB2b2lkIENsZWFyU2VsZWN0ZWQoKTsNCisgIHZvaWQgU2V0U2VsZWN0ZWQoKTsNCisgIHZvaWQgRW5kQ2FyZXQoKTsNCisgIHZvaWQgRmxhZ0ZvY3VzKEZYX0JPT0wgYlNldCk7DQogDQotICAgIGZyaWVuZCBjbGFzcyBDRldMX0NvbWJvTGlzdDsNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9FZGl0Ow0KLSAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0VkaXREZWxlZ2F0ZTsNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9MaXN0RGVsZWdhdGU7DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU7DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZTsNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBTZXRDb21ib0JveEZvY3VzKEZYX0JPT0wgYlNldCk7DQorICBDRldMX0NvbWJvQm94SW1wKiBtX3BPdXRlcjsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0NvbWJvRWRpdERlbGVnYXRlOw0KIH07DQotY2xhc3MgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUNCi17DQotcHVibGljOg0KLSAgICBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGUoQ0ZXTF9Db21ib0JveEltcCAqcE93bmVyKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCitjbGFzcyBDRldMX0NvbWJvRWRpdERlbGVnYXRlIDogcHVibGljIENGV0xfRWRpdEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Db21ib0VkaXREZWxlZ2F0ZShDRldMX0NvbWJvRWRpdCogcE93bmVyKTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KIA0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAlPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KLSAgICB2b2lkCU9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uS2V5KENGV0xfTXNnS2V5ICpwTXNnKTsNCi0gICAgdm9pZAlEb1N1YkN0cmxLZXkoQ0ZXTF9Nc2dLZXkgKnBNc2cpOw0KLXByb3RlY3RlZDoNCi0gICAgaW50MzJfdAlEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZvaWQJCURpc0Zvcm1fT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAkJRGlzRm9ybV9PbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KLSAgICB2b2lkCQlEaXNGb3JtX09uS2V5KENGV0xfTXNnS2V5ICpwTXNnKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGV0xfQ29tYm9Cb3hJbXAgKm1fcE93bmVyOw0KLSAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0VkaXREZWxlZ2F0ZTsNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9MaXN0RGVsZWdhdGU7DQorIHByb3RlY3RlZDoNCisgIENGV0xfQ29tYm9FZGl0KiBtX3BPd25lcjsNCiB9Ow0KLWNsYXNzIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUNCi17DQotcHVibGljOg0KLSAgICBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZShJRldMX0Zvcm0gKnBGb3JtLCBDRldMX0NvbWJvQm94SW1wICpwQ29tYm9Cb3gpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdm9pZAlSZXNldCgpDQotICAgIHsNCi0gICAgICAgIG1fYkxCdXR0b25VcFNlbGYgPSBGQUxTRTsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAlPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkICAgIE9uRGVhY3RpdmUoQ0ZXTF9Nc2dEZWFjdGl2YXRlICpwTXNnKTsNCi0gICAgdm9pZAlPbkZvY3VzQ2hhbmdlZChDRldMX01zZ0tpbGxGb2N1cyAqcE1zZywgRlhfQk9PTCBiU2V0ICk7DQotICAgIEZYX0JPT0wJCQltX2JMQnV0dG9uRG93bjsNCi0gICAgRlhfQk9PTAkJCW1fYkxCdXR0b25VcFNlbGY7DQotICAgIEZYX0ZMT0FUCQltX2ZTdGFydFBvczsNCi0gICAgSUZXTF9Gb3JtCQkJKm1fcEZvcm07DQotICAgIENGV0xfQ29tYm9Cb3hJbXAgICAgKm1fcENvbWJvQm94Ow0KK2NsYXNzIENGV0xfQ29tYm9MaXN0IDogcHVibGljIENGV0xfTGlzdEJveEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfQ29tYm9MaXN0KElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgQ0ZXTF9Db21ib0xpc3QoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICBpbnQzMl90IE1hdGNoSXRlbShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NNYXRjaCk7DQorICB2b2lkIENoYW5nZVNlbGVjdGVkKGludDMyX3QgaVNlbCk7DQorICBpbnQzMl90IENvdW50SXRlbXMoKTsNCisgIHZvaWQgR2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgsIENGWF9SZWN0RiYgcnRJdGVtKTsNCisgIHZvaWQgQ2xpZW50VG9PdXRlcihGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSk7DQorICB2b2lkIFNldEZvY3VzKEZYX0JPT0wgYlNldCk7DQorICBGWF9CT09MIG1fYk5vdGlmeU93bmVyOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9MaXN0RGVsZWdhdGU7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0JveEltcDsNCit9Ow0KK2NsYXNzIENGV0xfQ29tYm9MaXN0RGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDRldMX0NvbWJvTGlzdERlbGVnYXRlKENGV0xfQ29tYm9MaXN0KiBwT3duZXIpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25Ecm9wTGlzdEZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgaW50MzJfdCBPbkRyb3BMaXN0TW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgaW50MzJfdCBPbkRyb3BMaXN0TEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICBpbnQzMl90IE9uRHJvcExpc3RMQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICBpbnQzMl90IE9uRHJvcExpc3RLZXkoQ0ZXTF9Nc2dLZXkqIHBLZXkpOw0KKyAgdm9pZCBPbkRyb3BMaXN0S2V5RG93bihDRldMX01zZ0tleSogcEtleSk7DQorICBDRldMX0NvbWJvTGlzdCogbV9wT3duZXI7DQorfTsNCitjbGFzcyBDRldMX0NvbWJvQm94SW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Db21ib0JveEltcChJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBDRldMX0NvbWJvQm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgdmlydHVhbCB+Q0ZXTF9Db21ib0JveEltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgTW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lUHJvdmlkZXIpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEN1clNlbCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEN1clNlbChpbnQzMl90IGlTZWwpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEVkaXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0RWRpdFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRFZGl0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RWRpdExpbWl0KCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBFZGl0RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFZGl0UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFZGl0VW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCisgIHZpcnR1YWwgSUZXTF9MaXN0Qm94KiBHZXRMaXN0Qm94dCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEFmdGVyRm9jdXNTaG93RHJvcExpc3QoKTsNCisgIHZpcnR1YWwgRlhfRVJSIE9wZW5Ecm9wRG93bkxpc3QoRlhfQk9PTCBiQWN0aXZhdGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIEVkaXRDYW5VbmRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRWRpdENhblJlZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFZGl0VW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIEVkaXRSZWRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRWRpdENhbkNvcHkoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFZGl0Q2FuQ3V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRWRpdENhblNlbGVjdEFsbCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEVkaXRDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpOw0KKyAgdmlydHVhbCBGWF9CT09MIEVkaXRDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFZGl0UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIEVkaXRTZWxlY3RBbGwoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFZGl0RGVsZXRlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRWRpdERlU2VsZWN0KCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0QkJveChDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEVkaXRNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3U3RyZXRjaEhhbmRsZXIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgRlhfRkxPQVQgR2V0TGlzdEhlaWdodCgpOw0KKyAgdm9pZCBTaG93RHJvcExpc3QoRlhfQk9PTCBiQWN0aXZhdGUpOw0KKyAgRlhfQk9PTCBJc0Ryb3BMaXN0U2hvd2VkKCk7DQorICBGWF9CT09MIElzRHJvcERvd25TdHlsZSgpIGNvbnN0Ow0KKyAgdm9pZCBNYXRjaEVkaXRUZXh0KCk7DQorICB2b2lkIFN5bmNockVkaXRUZXh0KGludDMyX3QgaUxpc3RJdGVtKTsNCisgIHZvaWQgTGF5b3V0KCk7DQorICB2b2lkIFJlU2V0VGhlbWUoKTsNCisgIHZvaWQgUmVTZXRFZGl0QWxpZ25tZW50KCk7DQorICB2b2lkIFJlU2V0TGlzdEl0ZW1BbGlnbm1lbnQoKTsNCisgIHZvaWQgUHJvY2Vzc1NlbENoYW5nZWQoRlhfQk9PTCBiTEJ1dHRvblVwKTsNCisgIHZvaWQgSW5pdFByb3h5Rm9ybSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGV0xfRVJSIERpc0Zvcm1fSW5pdGlhbGl6ZSgpOw0KKyAgdm9pZCBEaXNGb3JtX0luaXRDb21ib0xpc3QoKTsNCisgIHZvaWQgRGlzRm9ybV9Jbml0Q29tYm9FZGl0KCk7DQorICB2b2lkIERpc0Zvcm1fU2hvd0Ryb3BMaXN0KEZYX0JPT0wgYkFjdGl2YXRlKTsNCisgIEZYX0JPT0wgRGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCk7DQorICBGV0xfRVJSIERpc0Zvcm1fTW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCisgIEZXTF9FUlIgRGlzRm9ybV9VcGRhdGUoKTsNCisgIEZYX0RXT1JEIERpc0Zvcm1fSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgRldMX0VSUiBEaXNGb3JtX0RyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICBGV0xfRVJSIERpc0Zvcm1fR2V0QkJveChDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBEaXNGb3JtX0xheW91dCgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfUmVjdEYgbV9ydENsaWVudDsNCisgIENGWF9SZWN0RiBtX3J0Q29udGVudDsNCisgIENGWF9SZWN0RiBtX3J0QnRuOw0KKyAgQ0ZYX1JlY3RGIG1fcnRMaXN0Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRQcm94eTsNCisgIENGWF9SZWN0RiBtX3J0SGFuZGxlcjsNCisgIElGV0xfRWRpdCogbV9wRWRpdDsNCisgIElGV0xfTGlzdEJveCogbV9wTGlzdEJveDsNCisgIElGV0xfRm9ybSogbV9wRm9ybTsNCisgIEZYX0JPT0wgbV9iTEJ1dHRvbkRvd247DQorICBGWF9CT09MIG1fYlVwRm9ybUhhbmRsZXI7DQorICBpbnQzMl90IG1faUN1clNlbDsNCisgIGludDMyX3QgbV9pQnRuU3RhdGU7DQorICBGWF9GTE9BVCBtX2ZDb21ib0Zvcm1IYW5kbGVyOw0KKyAgRlhfRkxPQVQgbV9mSXRlbUhlaWdodDsNCisgIEZYX0JPT0wgbV9iTmVlZFNob3dMaXN0Ow0KKyAgQ0ZXTF9Gb3JtUHJveHlJbXAqIG1fcFByb3h5Ow0KKyAgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGUqIG1fcExpc3RQcm94eURlbGVnYXRlOw0KKw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9MaXN0Ow0KKyAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9FZGl0Ow0KKyAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9FZGl0RGVsZWdhdGU7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0xpc3REZWxlZ2F0ZTsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZShDRldMX0NvbWJvQm94SW1wKiBwT3duZXIpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgdm9pZCBPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkxCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25LZXkoQ0ZXTF9Nc2dLZXkqIHBNc2cpOw0KKyAgdm9pZCBEb1N1YkN0cmxLZXkoQ0ZXTF9Nc2dLZXkqIHBNc2cpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBpbnQzMl90IERpc0Zvcm1fT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZvaWQgRGlzRm9ybV9PbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBEaXNGb3JtX09uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQorICB2b2lkIERpc0Zvcm1fT25LZXkoQ0ZXTF9Nc2dLZXkqIHBNc2cpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX0NvbWJvQm94SW1wKiBtX3BPd25lcjsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0NvbWJvRWRpdERlbGVnYXRlOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9MaXN0RGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGUoSUZXTF9Gb3JtKiBwRm9ybSwgQ0ZXTF9Db21ib0JveEltcCogcENvbWJvQm94KTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBSZXNldCgpIHsgbV9iTEJ1dHRvblVwU2VsZiA9IEZBTFNFOyB9DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkRlYWN0aXZlKENGV0xfTXNnRGVhY3RpdmF0ZSogcE1zZyk7DQorICB2b2lkIE9uRm9jdXNDaGFuZ2VkKENGV0xfTXNnS2lsbEZvY3VzKiBwTXNnLCBGWF9CT09MIGJTZXQpOw0KKyAgRlhfQk9PTCBtX2JMQnV0dG9uRG93bjsNCisgIEZYX0JPT0wgbV9iTEJ1dHRvblVwU2VsZjsNCisgIEZYX0ZMT0FUIG1fZlN0YXJ0UG9zOw0KKyAgSUZXTF9Gb3JtKiBtX3BGb3JtOw0KKyAgQ0ZXTF9Db21ib0JveEltcCogbV9wQ29tYm9Cb3g7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9kYXRldGltZXBpY2tlcmltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuaAppbmRleCBmMDdkY2I1Li4xM2JlZWNkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9kYXRldGltZXBpY2tlcmltcC5oCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2RhdGV0aW1lcGlja2VyaW1wLmgKQEAgLTIwLDE4NyArMjAsMTk1IEBACiBjbGFzcyBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZTsNCiBjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VySW1wOw0KIGNsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTsNCi1jbGFzcyBJRldMX0RhdGVUaW1lRm9ybSA6IHB1YmxpYyBJRldMX0Zvcm0NCi17DQotcHVibGljOg0KLSAgICBGV0xfRVJSCUluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQorY2xhc3MgSUZXTF9EYXRlVGltZUZvcm0gOiBwdWJsaWMgSUZXTF9Gb3JtIHsNCisgcHVibGljOg0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQogfTsNCi1jbGFzcyBJRldMX0RhdGVUaW1lQ2FsZW5kZXIgOiBwdWJsaWMgSUZXTF9Nb250aENhbGVuZGFyDQotew0KLXB1YmxpYzoNCi0gICAgRldMX0VSUglJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KK2NsYXNzIElGV0xfRGF0ZVRpbWVDYWxlbmRlciA6IHB1YmxpYyBJRldMX01vbnRoQ2FsZW5kYXIgew0KKyBwdWJsaWM6DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCiB9Ow0KLWNsYXNzIElGV0xfRGF0ZVRpbWVFZGl0IDogcHVibGljIElGV0xfRWRpdA0KLXsNCi1wdWJsaWM6DQotICAgIEZXTF9FUlIJSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCitjbGFzcyBJRldMX0RhdGVUaW1lRWRpdCA6IHB1YmxpYyBJRldMX0VkaXQgew0KKyBwdWJsaWM6DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCiB9Ow0KLWNsYXNzIENGV0xfRGF0ZVRpbWVFZGl0IDogcHVibGljIENGV0xfRWRpdEltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfRGF0ZVRpbWVFZGl0KGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlcik7DQotICAgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KLXByb3RlY3RlZDoNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfRGF0ZVRpbWVFZGl0RGVsZWdhdGU7DQotfTsNCi1jbGFzcyBDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlIDogcHVibGljIENGV0xfRWRpdEltcERlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9EYXRlVGltZUVkaXREZWxlZ2F0ZShDRldMX0RhdGVUaW1lRWRpdCAqcE93bmVyKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotcHJpdmF0ZToNCi0gICAgaW50MzJfdAlEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQorY2xhc3MgQ0ZXTF9EYXRlVGltZUVkaXQgOiBwdWJsaWMgQ0ZXTF9FZGl0SW1wIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9EYXRlVGltZUVkaXQoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQogDQotcHJvdGVjdGVkOg0KLSAgICBDRldMX0RhdGVUaW1lRWRpdAkqbV9wT3duZXI7DQorIHByb3RlY3RlZDoNCisgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlOw0KIH07DQotY2xhc3MgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyIDogcHVibGljIENGV0xfTW9udGhDYWxlbmRhckltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfRGF0ZVRpbWVDYWxlbmRhcihjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZTsNCi19Ow0KLWNsYXNzIENGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlIDogcHVibGljIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGUoQ0ZXTF9EYXRlVGltZUNhbGVuZGFyICpwT3duZXIpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi0gICAgdm9pZCBPbkxCdXR0b25Eb3duRXgoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQgT25MQnV0dG9uVXBFeChDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZCBPbk1vdXNlTW92ZUV4KENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLXByaXZhdGU6DQotICAgIGludDMyX3QJRGlzRm9ybV9PblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KLSAgICB2b2lkCQlEaXNGb3JtX09uTEJ1dHRvblVwRXgoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotcHJvdGVjdGVkOg0KLSAgICBDRldMX0RhdGVUaW1lQ2FsZW5kYXIJKm1fcE93bmVyOw0KLSAgICBGWF9CT09MIG1fYkZsYWc7DQotfTsNCi1jbGFzcyBDRldMX0RhdGVUaW1lUGlja2VySW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9EYXRlVGltZVBpY2tlckltcChJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIHZpcnR1YWwgfkNGV0xfRGF0ZVRpbWVQaWNrZXJJbXAoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldENsYXNzSUQoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJVXBkYXRlKCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciAqcFRQKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDdXJTZWwoaW50MzJfdCAmaVllYXIsIGludDMyX3QgJmlNb250aCwgaW50MzJfdCAmaURheSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0Q3VyU2VsKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIGludDMyX3QgblN0YXJ0ID0gMCwgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3Q7DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblVuZG8oKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5SZWRvKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJVW5kbygpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlZG8oKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5Db3B5KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ3V0KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuU2VsZWN0QWxsKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2VsZWN0QWxsKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVsZXRlKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVTZWxlY3QoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRCQm94KENGWF9SZWN0RiAmcmVjdCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlNb2RpZnlFZGl0U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLCBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQotcHVibGljOg0KLSAgICBJRldMX0RhdGVUaW1lRWRpdCoJR2V0RGF0YVRpbWVFZGl0KCk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCURyYXdEcm9wRG93bkJ1dHRvbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICB2b2lkCUZvcm1hdERhdGVTdHJpbmcoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIHZvaWQJU2hvd01vbnRoQ2FsZW5kYXIoRlhfQk9PTCBiQWN0aXZhdGUpOw0KLSAgICBGWF9CT09MCUlzTW9udGhDYWxlbmRhclNob3dlZCgpOw0KLSAgICB2b2lkCVJlU2V0RWRpdEFsaWdubWVudCgpOw0KLSAgICB2b2lkCUluaXRQcm94eUZvcm0oKTsNCi0gICAgdm9pZAlQcm9jZXNzU2VsQ2hhbmdlZChpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KTsNCi1wcml2YXRlOg0KLSAgICBGV0xfRVJSCQlEaXNGb3JtX0luaXRpYWxpemUoKTsNCi0gICAgdm9pZAkJRGlzRm9ybV9Jbml0RGF0ZVRpbWVDYWxlbmRhcigpOw0KLSAgICB2b2lkCQlEaXNGb3JtX0luaXREYXRlVGltZUVkaXQoKTsNCi0gICAgRlhfQk9PTAkJRGlzRm9ybV9Jc01vbnRoQ2FsZW5kYXJTaG93ZWQoKTsNCi0gICAgdm9pZAkJRGlzRm9ybV9TaG93TW9udGhDYWxlbmRhcihGWF9CT09MIGJBY3RpdmF0ZSk7DQotICAgIEZYX0RXT1JECURpc0Zvcm1fSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICBGWF9CT09MCQlEaXNGb3JtX0lzTmVlZFNob3dCdXR0b24oKTsNCi0gICAgRldMX0VSUgkJRGlzRm9ybV9VcGRhdGUoKTsNCi0gICAgRldMX0VSUgkJRGlzRm9ybV9HZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQotICAgIEZXTF9FUlIJCURpc0Zvcm1fR2V0QkJveChDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICBGV0xfRVJSCQlEaXNGb3JtX0RyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQorY2xhc3MgQ0ZXTF9EYXRlVGltZUVkaXREZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX0VkaXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfRGF0ZVRpbWVFZGl0RGVsZWdhdGUoQ0ZXTF9EYXRlVGltZUVkaXQqIHBPd25lcik7DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCiANCi0gICAgQ0ZYX1JlY3RGCQkJCW1fcnRCdG47DQotICAgIENGWF9SZWN0RgkJCQltX3J0Q2xpZW50Ow0KLSAgICBpbnQzMl90CQkJCW1faUJ0blN0YXRlOw0KLSAgICBpbnQzMl90CQkJCW1faVllYXI7DQotICAgIGludDMyX3QJCQkJbV9pTW9udGg7DQotICAgIGludDMyX3QJCQkJbV9pRGF5Ow0KLSAgICBGWF9CT09MCQkJCQltX2JMQnRuRG93bjsNCi0gICAgSUZXTF9EYXRlVGltZUVkaXQgICAgIAkqbV9wRWRpdDsNCi0gICAgSUZXTF9EYXRlVGltZUNhbGVuZGVyCSptX3BNb250aENhbDsNCi0gICAgSUZXTF9EYXRlVGltZUZvcm0JCSptX3BGb3JtOw0KLSAgICBGWF9GTE9BVAkJCQltX2ZCdG47DQotICAgIGNsYXNzIENGV0xfTW9udGhDYWxlbmRhckltcERQIDogcHVibGljIElGV0xfTW9udGhDYWxlbmRhckRQDQotICAgIHsNCi0gICAgcHVibGljOg0KLSAgICAgICAgQ0ZXTF9Nb250aENhbGVuZGFySW1wRFAoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1faUN1clllYXIgPSAyMDEwOw0KLSAgICAgICAgICAgIG1faUN1ck1vbnRoID0gMzsNCi0gICAgICAgICAgICBtX2lDdXJEYXkgPSAyOTsNCi0gICAgICAgIH0NCi0gICAgICAgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgIH0NCi0gICAgICAgIHZpcnR1YWwgaW50MzJfdCAgICAJR2V0Q3VyRGF5KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtX2lDdXJEYXk7DQotICAgICAgICB9DQotICAgICAgICB2aXJ0dWFsIGludDMyX3QJCUdldEN1ck1vbnRoKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtX2lDdXJNb250aDsNCi0gICAgICAgIH0NCi0gICAgICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0Q3VyWWVhcihJRldMX1dpZGdldCAqcFdpZGdldCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbV9pQ3VyWWVhcjsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QJbV9pQ3VyRGF5Ow0KLSAgICAgICAgaW50MzJfdAltX2lDdXJZZWFyOw0KLSAgICAgICAgaW50MzJfdAltX2lDdXJNb250aDsNCi0gICAgfTsNCisgcHJpdmF0ZToNCisgIGludDMyX3QgRGlzRm9ybV9PblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KIA0KLSAgICBDRldMX01vbnRoQ2FsZW5kYXJJbXBEUCBtX01vbnRoQ2FsZW5kYXJEUDsNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfRGF0ZVRpbWVFZGl0RGVsZWdhdGU7DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lQ2FsZW5kYXI7DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZTsNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9EYXRlVGltZUVkaXQqIG1fcE93bmVyOw0KIH07DQotY2xhc3MgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUNCi17DQotcHVibGljOg0KLSAgICBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGUoQ0ZXTF9EYXRlVGltZVBpY2tlckltcCAqcE93bmVyKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCU9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQotICAgIHZvaWQJT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAlPbkxCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAlPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAlPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQorY2xhc3MgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyIDogcHVibGljIENGV0xfTW9udGhDYWxlbmRhckltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfRGF0ZVRpbWVDYWxlbmRhcihjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQogDQotICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgKm1fcE93bmVyOw0KLXByaXZhdGU6DQotICAgIHZvaWQJCURpc0Zvcm1fT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgcHJvdGVjdGVkOg0KKyAgZnJpZW5kIGNsYXNzIENGV0xfRGF0ZVRpbWVDYWxlbmRhckRlbGVnYXRlOw0KK307DQorY2xhc3MgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZShDRldMX0RhdGVUaW1lQ2FsZW5kYXIqIHBPd25lcik7DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZvaWQgT25MQnV0dG9uRG93bkV4KENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkxCdXR0b25VcEV4KENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTW92ZUV4KENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2b2lkIERpc0Zvcm1fT25MQnV0dG9uVXBFeChDRldMX01zZ01vdXNlKiBwTXNnKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyKiBtX3BPd25lcjsNCisgIEZYX0JPT0wgbV9iRmxhZzsNCit9Ow0KK2NsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0RhdGVUaW1lUGlja2VySW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICB2aXJ0dWFsIH5DRldMX0RhdGVUaW1lUGlja2VySW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUUCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q3VyU2VsKGludDMyX3QmIGlZZWFyLCBpbnQzMl90JiBpTW9udGgsIGludDMyX3QmIGlEYXkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEN1clNlbChpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdDsNCisNCisgcHVibGljOg0KKyAgdmlydHVhbCBGWF9CT09MIENhblVuZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5SZWRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5Db3B5KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQ3V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuU2VsZWN0QWxsKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2VsZWN0QWxsKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVTZWxlY3QoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRCQm94KENGWF9SZWN0RiYgcmVjdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBNb2RpZnlFZGl0U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorDQorIHB1YmxpYzoNCisgIElGV0xfRGF0ZVRpbWVFZGl0KiBHZXREYXRhVGltZUVkaXQoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3RHJvcERvd25CdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgdm9pZCBGb3JtYXREYXRlU3RyaW5nKGludDMyX3QgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdm9pZCBTaG93TW9udGhDYWxlbmRhcihGWF9CT09MIGJBY3RpdmF0ZSk7DQorICBGWF9CT09MIElzTW9udGhDYWxlbmRhclNob3dlZCgpOw0KKyAgdm9pZCBSZVNldEVkaXRBbGlnbm1lbnQoKTsNCisgIHZvaWQgSW5pdFByb3h5Rm9ybSgpOw0KKyAgdm9pZCBQcm9jZXNzU2VsQ2hhbmdlZChpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KTsNCisNCisgcHJpdmF0ZToNCisgIEZXTF9FUlIgRGlzRm9ybV9Jbml0aWFsaXplKCk7DQorICB2b2lkIERpc0Zvcm1fSW5pdERhdGVUaW1lQ2FsZW5kYXIoKTsNCisgIHZvaWQgRGlzRm9ybV9Jbml0RGF0ZVRpbWVFZGl0KCk7DQorICBGWF9CT09MIERpc0Zvcm1fSXNNb250aENhbGVuZGFyU2hvd2VkKCk7DQorICB2b2lkIERpc0Zvcm1fU2hvd01vbnRoQ2FsZW5kYXIoRlhfQk9PTCBiQWN0aXZhdGUpOw0KKyAgRlhfRFdPUkQgRGlzRm9ybV9IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICBGWF9CT09MIERpc0Zvcm1fSXNOZWVkU2hvd0J1dHRvbigpOw0KKyAgRldMX0VSUiBEaXNGb3JtX1VwZGF0ZSgpOw0KKyAgRldMX0VSUiBEaXNGb3JtX0dldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIEZXTF9FUlIgRGlzRm9ybV9HZXRCQm94KENGWF9SZWN0RiYgcmVjdCk7DQorICBGV0xfRVJSIERpc0Zvcm1fRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1JlY3RGIG1fcnRCdG47DQorICBDRlhfUmVjdEYgbV9ydENsaWVudDsNCisgIGludDMyX3QgbV9pQnRuU3RhdGU7DQorICBpbnQzMl90IG1faVllYXI7DQorICBpbnQzMl90IG1faU1vbnRoOw0KKyAgaW50MzJfdCBtX2lEYXk7DQorICBGWF9CT09MIG1fYkxCdG5Eb3duOw0KKyAgSUZXTF9EYXRlVGltZUVkaXQqIG1fcEVkaXQ7DQorICBJRldMX0RhdGVUaW1lQ2FsZW5kZXIqIG1fcE1vbnRoQ2FsOw0KKyAgSUZXTF9EYXRlVGltZUZvcm0qIG1fcEZvcm07DQorICBGWF9GTE9BVCBtX2ZCdG47DQorICBjbGFzcyBDRldMX01vbnRoQ2FsZW5kYXJJbXBEUCA6IHB1YmxpYyBJRldMX01vbnRoQ2FsZW5kYXJEUCB7DQorICAgcHVibGljOg0KKyAgICBDRldMX01vbnRoQ2FsZW5kYXJJbXBEUCgpIHsNCisgICAgICBtX2lDdXJZZWFyID0gMjAxMDsNCisgICAgICBtX2lDdXJNb250aCA9IDM7DQorICAgICAgbV9pQ3VyRGF5ID0gMjk7DQorICAgIH0NCisgICAgdmlydHVhbCBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pIHsNCisgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgdmlydHVhbCBpbnQzMl90IEdldEN1ckRheShJRldMX1dpZGdldCogcFdpZGdldCkgeyByZXR1cm4gbV9pQ3VyRGF5OyB9DQorICAgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJNb250aChJRldMX1dpZGdldCogcFdpZGdldCkgeyByZXR1cm4gbV9pQ3VyTW9udGg7IH0NCisgICAgdmlydHVhbCBpbnQzMl90IEdldEN1clllYXIoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsgcmV0dXJuIG1faUN1clllYXI7IH0NCisgICAgaW50MzJfdCBtX2lDdXJEYXk7DQorICAgIGludDMyX3QgbV9pQ3VyWWVhcjsNCisgICAgaW50MzJfdCBtX2lDdXJNb250aDsNCisgIH07DQorDQorICBDRldMX01vbnRoQ2FsZW5kYXJJbXBEUCBtX01vbnRoQ2FsZW5kYXJEUDsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lRWRpdERlbGVnYXRlOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfRGF0ZVRpbWVDYWxlbmRhcjsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lQ2FsZW5kYXJEZWxlZ2F0ZTsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZShDRldMX0RhdGVUaW1lUGlja2VySW1wKiBwT3duZXIpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorDQorICBDRldMX0RhdGVUaW1lUGlja2VySW1wKiBtX3BPd25lcjsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgRGlzRm9ybV9PbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZWRpdGltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZWRpdGltcC5oCmluZGV4IDUzMmUwNTUuLmFjOWNjNDEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2VkaXRpbXAuaAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9lZGl0aW1wLmgKQEAgLTE0LDE1NiArMTQsMTg3IEBACiBjbGFzcyBJRldMX0FkYXB0ZXJUZXh0RmllbGQ7DQogY2xhc3MgQ0ZXTF9FZGl0SW1wOw0KIGNsYXNzIENGV0xfRWRpdEltcERlbGVnYXRlOw0KLWNsYXNzIENGV0xfRWRpdEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCwgcHVibGljIElGREVfVHh0RWR0RXZlbnRTaW5rDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9FZGl0SW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgQ0ZXTF9FZGl0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICB+Q0ZXTF9FZGl0SW1wKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRDbGFzc0lEKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQlVcGRhdGUoKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZVByb3ZpZGVyKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0VGV4dExlbmd0aCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBuU3RhcnQgPSAwLCBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlDbGVhclRleHQoKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldENhcmV0UG9zKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAlTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlID0gVFJVRSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJQWRkU2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJQ291bnRTZWxSYW5nZXMoKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUNsZWFyU2VsZWN0aW9ucygpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0TGltaXQoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRMaW1pdChpbnQzMl90IG5MaW1pdCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdBbGlhcyk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0Zvcm1hdCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJSW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW4pOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCURlbGV0ZVNlbGVjdGlvbnMoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlEZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJUmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlcGxhY2UpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVJlcGxhY2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkxlbiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlcGxhY2UpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCURvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVsZXRlKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVVuZG8oKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlSZWRvKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuVW5kbygpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblJlZG8oKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRPdXRlcihJRldMX1dpZGdldCAqcE91dGVyKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXROdW1iZXJSYW5nZShpbnQzMl90IGlNaW4sIGludDMyX3QgaU1heCk7DQotICAgIHZvaWQgT25fQ2FyZXRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCwgaW50MzJfdCBuUGFnZSwgRlhfQk9PTCBiVmlzaWJsZSA9IHRydWUpIG92ZXJyaWRlOw0KLSAgICB2b2lkIE9uX1RleHRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICogcEVkaXQsIEZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPICZDaGFuZ2VJbmZvKSBvdmVycmlkZTsNCi0gICAgdm9pZCBPbl9QYWdlQ291bnRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCkgb3ZlcnJpZGUge30NCi0gICAgdm9pZCBPbl9TZWxDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lICpwRWRpdCkgb3ZlcnJpZGU7DQotICAgIEZYX0JPT0wgT25fUGFnZUxvYWQoSUZERV9UeHRFZHRFbmdpbmUgKnBFZGl0LCBpbnQzMl90IG5QYWdlSW5kZXgsIGludDMyX3QgblB1cnBvc2UpIG92ZXJyaWRlOw0KLSAgICBGWF9CT09MIE9uX1BhZ2VVbmxvYWQoSUZERV9UeHRFZHRFbmdpbmUgKnBFZGl0LCBpbnQzMl90IG5QYWdlSW5kZXgsIGludDMyX3QgblB1cnBvc2UpIG92ZXJyaWRlOw0KLSAgICBGWF9CT09MIE9uX1BhZ2VDaGFuZ2UoSUZERV9UeHRFZHRFbmdpbmUgKnBFZGl0LCBpbnQzMl90IG5QYWdlSW5kZXgpIG92ZXJyaWRlDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHZvaWQgT25fQWRkRG9SZWNvcmQoSUZERV9UeHRFZHRFbmdpbmUgKnBFZGl0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIG92ZXJyaWRlOw0KLSAgICBGWF9CT09MIE9uX1ZhbGlkYXRlRmllbGQoSUZERV9UeHRFZHRFbmdpbmUgKnBFZGl0LCBpbnQzMl90IG5CbG9ja0luZGV4LCBpbnQzMl90IG5GaWVsZEluZGV4LCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGaWVsZFRleHQsIGludDMyX3QgbkNoYXJJbmRleCkgb3ZlcnJpZGU7DQotICAgIEZYX0JPT0wgT25fVmFsaWRhdGVCbG9jayhJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIGludDMyX3QgbkJsb2NrSW5kZXgpIG92ZXJyaWRlOw0KLSAgICBGWF9CT09MIE9uX0dldEJsb2NrRm9ybWF0VGV4dChJRkRFX1R4dEVkdEVuZ2luZSAqcEVkaXQsIGludDMyX3QgbkJsb2NrSW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0Jsb2NrVGV4dCkgb3ZlcnJpZGU7DQotICAgIEZYX0JPT0wgT25fVmFsaWRhdGUoSUZERV9UeHRFZHRFbmdpbmUgKiBwRWRpdCwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkgb3ZlcnJpZGU7DQotICAgIHZpcnR1YWwgRldMX0VSUiAgICAgU2V0QmFja2dyb3VuZENvbG9yKEZYX0RXT1JEIGNvbG9yKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSICAgICBTZXRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0ZvbnQsIEZYX0ZMT0FUIGZTaXplKTsNCi0gICAgdm9pZAkJCQlTZXRTY3JvbGxPZmZzZXQoRlhfRkxPQVQgZlNjcm9sbE9mZnNldCk7DQotICAgIEZYX0JPT0wJCQkJR2V0U3VnZ2VzdFdvcmRzKENGWF9Qb2ludEYgcG9pbnRmLCBDRlhfQnl0ZVN0cmluZ0FycmF5ICZzU3VnZ2VzdCk7DQotICAgIEZYX0JPT0wJCQkJUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQkJCURyYXdUZXh0QmsoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJCQkJRHJhd0NvbnRlbnQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJCQkJVXBkYXRlRWRpdEVuZ2luZSgpOw0KLSAgICB2b2lkCQkJCVVwZGF0ZUVkaXRQYXJhbXMoKTsNCi0gICAgdm9pZAkJCQlVcGRhdGVFZGl0TGF5b3V0KCk7DQotICAgIEZYX0JPT0wJCQkJVXBkYXRlT2Zmc2V0KCk7DQotICAgIEZYX0JPT0wJCQkJVXBkYXRlT2Zmc2V0KElGV0xfU2Nyb2xsQmFyICpwU2Nyb2xsQmFyLCBGWF9GTE9BVCBmUG9zQ2hhbmdlZCk7DQotICAgIHZvaWQJCQkJVXBkYXRlVkFsaWdubWVudCgpOw0KLSAgICB2b2lkCQkJCVVwZGF0ZUNhcmV0KCk7DQotICAgIElGV0xfU2Nyb2xsQmFyKgkJVXBkYXRlU2Nyb2xsKCk7DQotICAgIHZvaWQJCQkJTGF5b3V0KCk7DQotICAgIHZvaWQJCQkJTGF5b3V0U2Nyb2xsQmFyKCk7DQotICAgIHZvaWQJCQkJRGV2aWNlVG9FbmdpbmUoQ0ZYX1BvaW50RiAmcHQpOw0KLSAgICB2b2lkCQkJCUluaXRTY3JvbGxCYXIoRlhfQk9PTCBiVmVydCA9IFRSVUUpOw0KLSAgICB2b2lkCQkJCUluaXRFbmdpbmUoKTsNCi0gICAgdmlydHVhbAl2b2lkCQlTaG93Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwgQ0ZYX1JlY3RGICpwUmVjdCA9IE5VTEwpOw0KLSAgICBGWF9CT09MCQkJCVZhbGlkYXRlTnVtYmVyQ2hhcihGWF9XQ0hBUiBjTnVtKTsNCi0gICAgdm9pZAkJCQlJbml0Q2FyZXQoKTsNCi0gICAgdm9pZAkJCQlDbGVhclJlY29yZCgpOw0KLSAgICBGWF9CT09MCQkJCUlzU2hvd1Njcm9sbEJhcihGWF9CT09MIGJWZXJ0KTsNCi0gICAgRlhfQk9PTAkJCQlJc0NvbnRlbnRIZWlnaHRPdmVyZmxvdygpOw0KLSAgICBpbnQzMl90CQkJQWRkRG9SZWNvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCi0gICAgdm9pZAkJCQlQcm9jZXNzSW5zZXJ0RXJyb3IoaW50MzJfdCBpRXJyb3IpOw0KK2NsYXNzIENGV0xfRWRpdEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCwgcHVibGljIElGREVfVHh0RWR0RXZlbnRTaW5rIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9FZGl0SW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIENGV0xfRWRpdEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgfkNGV0xfRWRpdEltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWVQcm92aWRlcik7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgQ2xlYXJUZXh0KCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2FyZXRQb3MoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlID0gVFJVRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgQWRkU2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50U2VsUmFuZ2VzKCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgQ2xlYXJTZWxlY3Rpb25zKCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGltaXQoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRMaW1pdChpbnQzMl90IG5MaW1pdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdBbGlhcyk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW4pOw0KKyAgdmlydHVhbCBGV0xfRVJSIERlbGV0ZVNlbGVjdGlvbnMoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgUmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlcGxhY2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlcGxhY2UoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUmVwbGFjZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpOw0KKyAgdmlydHVhbCBGWF9CT09MIEN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEZWxldGUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpOw0KKyAgdmlydHVhbCBGWF9CT09MIFVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5VbmRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuUmVkbygpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgRlhfQk9PTCBiRXF1aWRpc3RhbnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldE91dGVyKElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldE51bWJlclJhbmdlKGludDMyX3QgaU1pbiwgaW50MzJfdCBpTWF4KTsNCisgIHZvaWQgT25fQ2FyZXRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWaXNpYmxlID0gdHJ1ZSkgb3ZlcnJpZGU7DQorICB2b2lkIE9uX1RleHRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX0lORk8mIENoYW5nZUluZm8pIG92ZXJyaWRlOw0KKyAgdm9pZCBPbl9QYWdlQ291bnRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCkgb3ZlcnJpZGUge30NCisgIHZvaWQgT25fU2VsQ2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQpIG92ZXJyaWRlOw0KKyAgRlhfQk9PTCBPbl9QYWdlTG9hZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBhZ2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUHVycG9zZSkgb3ZlcnJpZGU7DQorICBGWF9CT09MIE9uX1BhZ2VVbmxvYWQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBhZ2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5QdXJwb3NlKSBvdmVycmlkZTsNCisgIEZYX0JPT0wgT25fUGFnZUNoYW5nZShJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsIGludDMyX3QgblBhZ2VJbmRleCkgb3ZlcnJpZGUgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHZvaWQgT25fQWRkRG9SZWNvcmQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIG92ZXJyaWRlOw0KKyAgRlhfQk9PTCBPbl9WYWxpZGF0ZUZpZWxkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGRUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJJbmRleCkgb3ZlcnJpZGU7DQorICBGWF9CT09MIE9uX1ZhbGlkYXRlQmxvY2soSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkJsb2NrSW5kZXgpIG92ZXJyaWRlOw0KKyAgRlhfQk9PTCBPbl9HZXRCbG9ja0Zvcm1hdFRleHQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQmxvY2tJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0Jsb2NrVGV4dCkgb3ZlcnJpZGU7DQorICBGWF9CT09MIE9uX1ZhbGlkYXRlKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgb3ZlcnJpZGU7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0QmFja2dyb3VuZENvbG9yKEZYX0RXT1JEIGNvbG9yKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZvbnQsIEZYX0ZMT0FUIGZTaXplKTsNCisgIHZvaWQgU2V0U2Nyb2xsT2Zmc2V0KEZYX0ZMT0FUIGZTY3JvbGxPZmZzZXQpOw0KKyAgRlhfQk9PTCBHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkmIHNTdWdnZXN0KTsNCisgIEZYX0JPT0wgUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlcGxhY2UpOw0KIA0KLSAgICB2b2lkCQkJCURyYXdTcGVsbENoZWNrKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJCQkJQWRkU3BlbGxDaGVja09iaihDRlhfUGF0aCYgUGF0aERhdGEsIGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCwgRlhfRkxPQVQgZk9mZlNldFgsIEZYX0ZMT0FUIGZPZmZTZXRZKTsNCi0gICAgaW50MzJfdAkJCUdldFdvcmRBdFBvaW50KENGWF9Qb2ludEYgcG9pbnRmLCBpbnQzMl90JiBuQ291bnQpOw0KLSAgICBDRlhfUmVjdEYJCQltX3J0Q2xpZW50Ow0KLSAgICBDRlhfUmVjdEYJCQltX3J0RW5naW5lOw0KLSAgICBDRlhfUmVjdEYJCQltX3J0U3RhdGljOw0KLSAgICBGWF9GTE9BVAkJCW1fZlZBbGlnbk9mZnNldDsNCi0gICAgRlhfRkxPQVQJCQltX2ZTY3JvbGxPZmZzZXRYOw0KLSAgICBGWF9GTE9BVAkJCW1fZlNjcm9sbE9mZnNldFk7DQotICAgIElGREVfVHh0RWR0RW5naW5lKgltX3BFZHRFbmdpbmU7DQotICAgIEZYX0JPT0wJCQkJbV9iTEJ1dHRvbkRvd247DQotICAgIGludDMyX3QJCQltX25TZWxTdGFydDsNCi0gICAgaW50MzJfdAkJCW1fbkxpbWl0Ow0KLSAgICBGWF9GTE9BVAkJCW1fZlNwYWNlQWJvdmU7DQotICAgIEZYX0ZMT0FUCQkJbV9mU3BhY2VCZWxvdzsNCi0gICAgRlhfRkxPQVQJCQltX2ZGb250U2l6ZTsNCi0gICAgRlhfQVJHQgkJCQltX2FyZ2JTZWw7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgbV9iU2V0UmFuZ2U7DQotICAgIGludDMyX3QJCQltX2lNaW47DQotICAgIGludDMyX3QJCQltX2lNYXg7DQotICAgIElGV0xfU2Nyb2xsQmFyKgkJbV9wVmVydFNjcm9sbEJhcjsNCi0gICAgSUZXTF9TY3JvbGxCYXIqCQltX3BIb3J6U2Nyb2xsQmFyOw0KLSAgICBJRldMX0NhcmV0KgkJCW1fcENhcmV0Ow0KLSAgICBJRldMX0FkYXB0ZXJUZXh0RmllbGQqCW1fcFRleHRGaWVsZDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQltX3dzQ2FjaGU7DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX1R4dEVkdEV2ZW50U2luazsNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfRWRpdEltcERlbGVnYXRlOw0KLSAgICBGWF9EV09SRCAgICAgICAgICAgIG1fYmFja0NvbG9yOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgIG1fdXBkYXRlQmFja0NvbG9yOw0KLSAgICBDRlhfV2lkZVN0cmluZyAgICAgIG1fd3NGb250Ow0KLSAgICBDRlhfQnl0ZVN0cmluZ0FycmF5IG1fUmVjb3JkQXJyOw0KLSAgICBpbnQzMl90CQkJbV9pQ3VyUmVjb3JkOw0KLSAgICBpbnQzMl90CQkJbV9pTWF4UmVjb3JkOw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERyYXdUZXh0QmsoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3Q29udGVudChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgVXBkYXRlRWRpdEVuZ2luZSgpOw0KKyAgdm9pZCBVcGRhdGVFZGl0UGFyYW1zKCk7DQorICB2b2lkIFVwZGF0ZUVkaXRMYXlvdXQoKTsNCisgIEZYX0JPT0wgVXBkYXRlT2Zmc2V0KCk7DQorICBGWF9CT09MIFVwZGF0ZU9mZnNldChJRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwgRlhfRkxPQVQgZlBvc0NoYW5nZWQpOw0KKyAgdm9pZCBVcGRhdGVWQWxpZ25tZW50KCk7DQorICB2b2lkIFVwZGF0ZUNhcmV0KCk7DQorICBJRldMX1Njcm9sbEJhciogVXBkYXRlU2Nyb2xsKCk7DQorICB2b2lkIExheW91dCgpOw0KKyAgdm9pZCBMYXlvdXRTY3JvbGxCYXIoKTsNCisgIHZvaWQgRGV2aWNlVG9FbmdpbmUoQ0ZYX1BvaW50RiYgcHQpOw0KKyAgdm9pZCBJbml0U2Nyb2xsQmFyKEZYX0JPT0wgYlZlcnQgPSBUUlVFKTsNCisgIHZvaWQgSW5pdEVuZ2luZSgpOw0KKyAgdmlydHVhbCB2b2lkIFNob3dDYXJldChGWF9CT09MIGJWaXNpYmxlLCBDRlhfUmVjdEYqIHBSZWN0ID0gTlVMTCk7DQorICBGWF9CT09MIFZhbGlkYXRlTnVtYmVyQ2hhcihGWF9XQ0hBUiBjTnVtKTsNCisgIHZvaWQgSW5pdENhcmV0KCk7DQorICB2b2lkIENsZWFyUmVjb3JkKCk7DQorICBGWF9CT09MIElzU2hvd1Njcm9sbEJhcihGWF9CT09MIGJWZXJ0KTsNCisgIEZYX0JPT0wgSXNDb250ZW50SGVpZ2h0T3ZlcmZsb3coKTsNCisgIGludDMyX3QgQWRkRG9SZWNvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCisgIHZvaWQgUHJvY2Vzc0luc2VydEVycm9yKGludDMyX3QgaUVycm9yKTsNCisNCisgIHZvaWQgRHJhd1NwZWxsQ2hlY2soQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgQWRkU3BlbGxDaGVja09iaihDRlhfUGF0aCYgUGF0aERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk9mZlNldFgsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk9mZlNldFkpOw0KKyAgaW50MzJfdCBHZXRXb3JkQXRQb2ludChDRlhfUG9pbnRGIHBvaW50ZiwgaW50MzJfdCYgbkNvdW50KTsNCisgIENGWF9SZWN0RiBtX3J0Q2xpZW50Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRFbmdpbmU7DQorICBDRlhfUmVjdEYgbV9ydFN0YXRpYzsNCisgIEZYX0ZMT0FUIG1fZlZBbGlnbk9mZnNldDsNCisgIEZYX0ZMT0FUIG1fZlNjcm9sbE9mZnNldFg7DQorICBGWF9GTE9BVCBtX2ZTY3JvbGxPZmZzZXRZOw0KKyAgSUZERV9UeHRFZHRFbmdpbmUqIG1fcEVkdEVuZ2luZTsNCisgIEZYX0JPT0wgbV9iTEJ1dHRvbkRvd247DQorICBpbnQzMl90IG1fblNlbFN0YXJ0Ow0KKyAgaW50MzJfdCBtX25MaW1pdDsNCisgIEZYX0ZMT0FUIG1fZlNwYWNlQWJvdmU7DQorICBGWF9GTE9BVCBtX2ZTcGFjZUJlbG93Ow0KKyAgRlhfRkxPQVQgbV9mRm9udFNpemU7DQorICBGWF9BUkdCIG1fYXJnYlNlbDsNCisgIEZYX0JPT0wgbV9iU2V0UmFuZ2U7DQorICBpbnQzMl90IG1faU1pbjsNCisgIGludDMyX3QgbV9pTWF4Ow0KKyAgSUZXTF9TY3JvbGxCYXIqIG1fcFZlcnRTY3JvbGxCYXI7DQorICBJRldMX1Njcm9sbEJhciogbV9wSG9yelNjcm9sbEJhcjsNCisgIElGV0xfQ2FyZXQqIG1fcENhcmV0Ow0KKyAgSUZXTF9BZGFwdGVyVGV4dEZpZWxkKiBtX3BUZXh0RmllbGQ7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzQ2FjaGU7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9UeHRFZHRFdmVudFNpbms7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU7DQorICBGWF9EV09SRCBtX2JhY2tDb2xvcjsNCisgIEZYX0JPT0wgbV91cGRhdGVCYWNrQ29sb3I7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzRm9udDsNCisgIENGWF9CeXRlU3RyaW5nQXJyYXkgbV9SZWNvcmRBcnI7DQorICBpbnQzMl90IG1faUN1clJlY29yZDsNCisgIGludDMyX3QgbV9pTWF4UmVjb3JkOw0KIH07DQotY2xhc3MgQ0ZXTF9FZGl0SW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfRWRpdEltcERlbGVnYXRlKENGV0xfRWRpdEltcCAqcE93bmVyKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQgICAgRG9BY3RpdmF0ZShDRldMX01zZ0FjdGl2YXRlICpwTXNnKTsNCi0gICAgdm9pZCAgICBEb0RlYWN0aXZhdGUoQ0ZXTF9Nc2dEZWFjdGl2YXRlICpwTXNnKTsNCi0gICAgdm9pZAlEb0J1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCi0gICAgdm9pZAlPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uQnV0dG9uRGJsQ2xrKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uS2V5RG93bihDRldMX01zZ0tleSAqcE1zZyk7DQotICAgIHZvaWQJT25DaGFyKENGV0xfTXNnS2V5ICpwTXNnKTsNCi0gICAgRlhfQk9PTAlPblNjcm9sbChJRldMX1Njcm9sbEJhciAqcFNjcm9sbEJhciwgRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zKTsNCi0gICAgdm9pZCAgICBEb0N1cnNvcihDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgQ0ZXTF9FZGl0SW1wICptX3BPd25lcjsNCitjbGFzcyBDRldMX0VkaXRJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9FZGl0SW1wRGVsZWdhdGUoQ0ZXTF9FZGl0SW1wKiBwT3duZXIpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEb0FjdGl2YXRlKENGV0xfTXNnQWN0aXZhdGUqIHBNc2cpOw0KKyAgdm9pZCBEb0RlYWN0aXZhdGUoQ0ZXTF9Nc2dEZWFjdGl2YXRlKiBwTXNnKTsNCisgIHZvaWQgRG9CdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgdm9pZCBPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkxCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25CdXR0b25EYmxDbGsoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbktleURvd24oQ0ZXTF9Nc2dLZXkqIHBNc2cpOw0KKyAgdm9pZCBPbkNoYXIoQ0ZXTF9Nc2dLZXkqIHBNc2cpOw0KKyAgRlhfQk9PTCBPblNjcm9sbChJRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwgRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zKTsNCisgIHZvaWQgRG9DdXJzb3IoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICBDRldMX0VkaXRJbXAqIG1fcE93bmVyOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZm9ybXByb3h5aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9mb3JtcHJveHlpbXAuaAppbmRleCAzMGQyYzFmLi4wZTViYWYwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9mb3JtcHJveHlpbXAuaAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9mb3JtcHJveHlpbXAuaApAQCAtMTIsMjggKzEyLDMwIEBACiBjbGFzcyBDRldMX0Zvcm1JbXA7DQogY2xhc3MgQ0ZXTF9Gb3JtUHJveHlJbXA7DQogY2xhc3MgQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZTsNCi1jbGFzcyBDRldMX0Zvcm1Qcm94eUltcCA6IHB1YmxpYyBDRldMX0Zvcm1JbXANCi17DQotcHVibGljOg0KLSAgICBDRldMX0Zvcm1Qcm94eUltcChJRldMX1dpZGdldCAqcE91dGVyKTsNCi0gICAgQ0ZXTF9Gb3JtUHJveHlJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyKTsNCi0gICAgfkNGV0xfRm9ybVByb3h5SW1wKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRDbGFzc0lEKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNJbnN0YW5jZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2xhc3MpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX0Zvcm1Qcm94eUltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfRm9ybVByb3h5SW1wIDogcHVibGljIENGV0xfRm9ybUltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfRm9ybVByb3h5SW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgQ0ZXTF9Gb3JtUHJveHlJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB+Q0ZXTF9Gb3JtUHJveHlJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNJbnN0YW5jZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorDQorIHByb3RlY3RlZDoNCisgIGZyaWVuZCBjbGFzcyBDRldMX0Zvcm1Qcm94eUltcERlbGVnYXRlOw0KIH07DQotY2xhc3MgQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZShDRldMX0Zvcm1Qcm94eUltcCAqcE93bmVyKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotcHJvdGVjdGVkOg0KLSAgICBDRldMX0Zvcm1Qcm94eUltcAkqbV9wT3duZXI7DQorY2xhc3MgQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZShDRldMX0Zvcm1Qcm94eUltcCogcE93bmVyKTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX0Zvcm1Qcm94eUltcCogbV9wT3duZXI7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9saXN0Ym94aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9saXN0Ym94aW1wLmgKaW5kZXggN2NiYjBiOC4uYTJkNmU2NSAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfbGlzdGJveGltcC5oCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2xpc3Rib3hpbXAuaApAQCAtMTMsODYgKzEzLDEwNSBAQAogY2xhc3MgSUZXTF9XaWRnZXQ7DQogY2xhc3MgQ0ZXTF9MaXN0Qm94SW1wOw0KIGNsYXNzIENGV0xfTGlzdEJveEltcERlbGVnYXRlOw0KLWNsYXNzIENGV0xfTGlzdEJveEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfTGlzdEJveEltcChJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIENGV0xfTGlzdEJveEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgfkNGV0xfTGlzdEJveEltcCgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQlVcGRhdGUoKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWVQcm92aWRlcik7DQotICAgIHZpcnR1YWwgaW50MzJfdAlDb3VudFNlbEl0ZW1zKCk7DQotICAgIHZpcnR1YWwgRldMX0hMSVNUSVRFTQlHZXRTZWxJdGVtKGludDMyX3QgbkluZGV4U2VsKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldFNlbEluZGV4KGludDMyX3QgbkluZGV4KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRTZWxJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCA9IFRSVUUpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldEl0ZW1UZXh0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFNjcm9sbFBvcyhGWF9GTE9BVCAmZlBvcywgRlhfQk9PTCBiVmVydCA9IFRSVUUpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIqCVNvcnQoSUZXTF9MaXN0Qm94Q29tcGFyZSAqcENvbSk7DQotcHJvdGVjdGVkOg0KLSAgICBGV0xfSExJU1RJVEVNIEdldEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfRFdPUkQgZHdLZXlDb2RlKTsNCi0gICAgdm9pZAkJU2V0U2VsZWN0aW9uKEZXTF9ITElTVElURU0gaFN0YXJ0LCBGV0xfSExJU1RJVEVNIGhFbmQsIEZYX0JPT0wgYlNlbGVjdGVkKTsNCi0gICAgdm9pZAkJU2V0U2VsZWN0aW9uRGlyZWN0KEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCk7DQotICAgIEZYX0JPT0wJCUlzSXRlbVNlbGVjdGVkKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KLSAgICB2b2lkCQlDbGVhclNlbGVjdGlvbigpOw0KLSAgICB2b2lkCQlTZWxlY3RBbGwoKTsNCi0gICAgRldMX0hMSVNUSVRFTSBHZXRGb2N1c2VkSXRlbSgpOw0KLSAgICB2b2lkCQlTZXRGb2N1c0l0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSk7DQotICAgIEZXTF9ITElTVElURU0JR2V0SXRlbUF0UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgRlhfQk9PTAkJCUdldEl0ZW1DaGVja1JlY3QoRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1JlY3RGICZydENoZWNrKTsNCi0gICAgRlhfQk9PTAkJCVNldEl0ZW1DaGVja2VkKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYkNoZWNrZWQpOw0KLSAgICBGWF9CT09MCQkJR2V0SXRlbUNoZWNrZWQoRldMX0hMSVNUSVRFTSBoSXRlbSk7DQotICAgIEZYX0JPT0wJCVNjcm9sbFRvVmlzaWJsZShGV0xfSExJU1RJVEVNIGhJdGVtKTsNCi0gICAgdm9pZAkJRHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCQlEcmF3SXRlbXMoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJCURyYXdJdGVtKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgRldMX0hMSVNUSVRFTSBoSXRlbSwgaW50MzJfdCBJbmRleCwgY29uc3QgQ0ZYX1JlY3RGICZydEl0ZW0sIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdm9pZAkJRHJhd1N0YXRpYyhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUpOw0KLSAgICBDRlhfU2l6ZUYJQ2FsY1NpemUoRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQotICAgIHZvaWQJCUdldEl0ZW1TaXplKENGWF9TaXplRiAmc2l6ZSwgRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCi0gICAgRlhfRkxPQVQJR2V0TWF4VGV4dFdpZHRoKCk7DQotICAgIEZYX0ZMT0FUCUdldFNjcm9sbFdpZHRoKCk7DQotICAgIEZYX0ZMT0FUCUdldEl0ZW1IZWlndCgpOw0KLSAgICB2b2lkCQlJbml0U2Nyb2xsQmFyKEZYX0JPT0wgYlZlcnQgPSBUUlVFKTsNCi0gICAgdm9pZAkJU29ydEl0ZW0oKTsNCi0gICAgRlhfQk9PTAkJSXNTaG93U2Nyb2xsQmFyKEZYX0JPT0wgYlZlcnQpOw0KLSAgICB2b2lkCQlQcm9jZXNzU2VsQ2hhbmdlZCgpOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX1JlY3RGCQkJbV9ydENsaWVudDsNCi0gICAgQ0ZYX1JlY3RGCQkJbV9ydFN0YXRpYzsNCi0gICAgQ0ZYX1JlY3RGCQkJbV9ydENvbmVudDsNCi0gICAgSUZXTF9TY3JvbGxCYXIqCQltX3BIb3J6U2Nyb2xsQmFyOw0KLSAgICBJRldMX1Njcm9sbEJhcioJCW1fcFZlcnRTY3JvbGxCYXI7DQotICAgIEZYX0RXT1JECQkJbV9kd1RUT1N0eWxlczsNCi0gICAgaW50MzJfdAkJCW1faVRUT0FsaWduczsNCi0gICAgRldMX0hMSVNUSVRFTQkJbV9oQW5jaG9yOw0KLSAgICBGWF9GTE9BVAkJCW1fZkl0ZW1IZWlnaHQ7DQotICAgIEZYX0ZMT0FUCQkJbV9mU2NvcmxsQmFyV2lkdGg7DQotICAgIEZYX0JPT0wJCQkJbV9iTEJ1dHRvbkRvd247DQotICAgIElGV0xfVGhlbWVQcm92aWRlciAqbV9wU2Nyb2xsQmFyVFA7DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0xpc3RCb3hJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0xpc3RCb3hJbXAoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgQ0ZXTF9MaXN0Qm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICB+Q0ZXTF9MaXN0Qm94SW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKTsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFNlbEl0ZW1zKCk7DQorICB2aXJ0dWFsIEZXTF9ITElTVElURU0gR2V0U2VsSXRlbShpbnQzMl90IG5JbmRleFNlbCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0U2VsSW5kZXgoaW50MzJfdCBuSW5kZXgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFNlbEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2VsZWN0ID0gVFJVRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0SXRlbVRleHQoRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0U2Nyb2xsUG9zKEZYX0ZMT0FUJiBmUG9zLCBGWF9CT09MIGJWZXJ0ID0gVFJVRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIqIFNvcnQoSUZXTF9MaXN0Qm94Q29tcGFyZSogcENvbSk7DQorDQorIHByb3RlY3RlZDoNCisgIEZXTF9ITElTVElURU0gR2V0SXRlbShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9EV09SRCBkd0tleUNvZGUpOw0KKyAgdm9pZCBTZXRTZWxlY3Rpb24oRldMX0hMSVNUSVRFTSBoU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhFbmQsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWxlY3RlZCk7DQorICB2b2lkIFNldFNlbGVjdGlvbkRpcmVjdChGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTZWxlY3QpOw0KKyAgRlhfQk9PTCBJc0l0ZW1TZWxlY3RlZChGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgIHZvaWQgQ2xlYXJTZWxlY3Rpb24oKTsNCisgIHZvaWQgU2VsZWN0QWxsKCk7DQorICBGV0xfSExJU1RJVEVNIEdldEZvY3VzZWRJdGVtKCk7DQorICB2b2lkIFNldEZvY3VzSXRlbShGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgIEZXTF9ITElTVElURU0gR2V0SXRlbUF0UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIEZYX0JPT0wgR2V0SXRlbUNoZWNrUmVjdChGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfUmVjdEYmIHJ0Q2hlY2spOw0KKyAgRlhfQk9PTCBTZXRJdGVtQ2hlY2tlZChGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJDaGVja2VkKTsNCisgIEZYX0JPT0wgR2V0SXRlbUNoZWNrZWQoRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICBGWF9CT09MIFNjcm9sbFRvVmlzaWJsZShGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgIHZvaWQgRHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdJdGVtcyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3SXRlbShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgIGludDMyX3QgSW5kZXgsDQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJdGVtLA0KKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdTdGF0aWMoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lKTsNCisgIENGWF9TaXplRiBDYWxjU2l6ZShGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZvaWQgR2V0SXRlbVNpemUoQ0ZYX1NpemVGJiBzaXplLA0KKyAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgRlhfRkxPQVQgR2V0TWF4VGV4dFdpZHRoKCk7DQorICBGWF9GTE9BVCBHZXRTY3JvbGxXaWR0aCgpOw0KKyAgRlhfRkxPQVQgR2V0SXRlbUhlaWd0KCk7DQorICB2b2lkIEluaXRTY3JvbGxCYXIoRlhfQk9PTCBiVmVydCA9IFRSVUUpOw0KKyAgdm9pZCBTb3J0SXRlbSgpOw0KKyAgRlhfQk9PTCBJc1Nob3dTY3JvbGxCYXIoRlhfQk9PTCBiVmVydCk7DQorICB2b2lkIFByb2Nlc3NTZWxDaGFuZ2VkKCk7DQorDQorIHByb3RlY3RlZDoNCisgIENGWF9SZWN0RiBtX3J0Q2xpZW50Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRTdGF0aWM7DQorICBDRlhfUmVjdEYgbV9ydENvbmVudDsNCisgIElGV0xfU2Nyb2xsQmFyKiBtX3BIb3J6U2Nyb2xsQmFyOw0KKyAgSUZXTF9TY3JvbGxCYXIqIG1fcFZlcnRTY3JvbGxCYXI7DQorICBGWF9EV09SRCBtX2R3VFRPU3R5bGVzOw0KKyAgaW50MzJfdCBtX2lUVE9BbGlnbnM7DQorICBGV0xfSExJU1RJVEVNIG1faEFuY2hvcjsNCisgIEZYX0ZMT0FUIG1fZkl0ZW1IZWlnaHQ7DQorICBGWF9GTE9BVCBtX2ZTY29ybGxCYXJXaWR0aDsNCisgIEZYX0JPT0wgbV9iTEJ1dHRvbkRvd247DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIG1fcFNjcm9sbEJhclRQOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfTGlzdEJveEltcERlbGVnYXRlOw0KIH07DQotY2xhc3MgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfTGlzdEJveEltcERlbGVnYXRlKENGV0xfTGlzdEJveEltcCAqcE93bmVyKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCi0gICAgdm9pZAlPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uTW91c2VXaGVlbChDRldMX01zZ01vdXNlV2hlZWwgKnBNc2cpOw0KLSAgICB2b2lkCU9uS2V5RG93bihDRldMX01zZ0tleSAqcE1zZyk7DQotICAgIHZvaWQJT25WSyhGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCk7DQotICAgIEZYX0JPT0wJT25TY3JvbGwoSUZXTF9TY3JvbGxCYXIgKnBTY3JvbGxCYXIsIEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcyk7DQotICAgIHZvaWQJRGlzcGF0Y2hTZWxDaGFuZ2VkRXYoKTsNCi0gICAgQ0ZXTF9MaXN0Qm94SW1wCSptX3BPd25lcjsNCitjbGFzcyBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGUoQ0ZXTF9MaXN0Qm94SW1wKiBwT3duZXIpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgdm9pZCBPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkxCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25Nb3VzZVdoZWVsKENGV0xfTXNnTW91c2VXaGVlbCogcE1zZyk7DQorICB2b2lkIE9uS2V5RG93bihDRldMX01zZ0tleSogcE1zZyk7DQorICB2b2lkIE9uVksoRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpOw0KKyAgRlhfQk9PTCBPblNjcm9sbChJRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwgRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zKTsNCisgIHZvaWQgRGlzcGF0Y2hTZWxDaGFuZ2VkRXYoKTsNCisgIENGV0xfTGlzdEJveEltcCogbV9wT3duZXI7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9tb250aGNhbGVuZGFyaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9tb250aGNhbGVuZGFyaW1wLmgKaW5kZXggMGNmMmVkNC4uN2NjMWExOSAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfbW9udGhjYWxlbmRhcmltcC5oCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX21vbnRoY2FsZW5kYXJpbXAuaApAQCAtMTUsMTg5ICsxNSwyMzUgQEAKIGV4dGVybiB1aW50OF90IEZYX0RheXNJbk1vbnRoKGludDMyX3QgaVllYXIsIHVpbnQ4X3QgaU1vbnRoKTsNCiBjbGFzcyBDRldMX01vbnRoQ2FsZW5kYXJJbXA7DQogY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU7DQotY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFySW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Nb250aENhbGVuZGFySW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgQ0ZXTF9Nb250aENhbGVuZGFySW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICB+Q0ZXTF9Nb250aENhbGVuZGFySW1wKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRDbGFzc0lEKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CUNvdW50U2VsZWN0KCk7DQotICAgIHZpcnR1YWwJRlhfQk9PTAkJR2V0U2VsZWN0KGludDMyX3QgJmlZZWFyLCBpbnQzMl90ICZpTW9udGgsIGludDMyX3QgJmlEYXksIGludDMyX3QgbkluZGV4ID0gMCk7DQotICAgIHZpcnR1YWwJRlhfQk9PTAkJU2V0U2VsZWN0KGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAkJRHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIHZvaWQJCURyYXdIZWFkQksoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgdm9pZAkJRHJhd0xCdXR0b24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgdm9pZAkJRHJhd1JCdXR0b24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgdm9pZAkJRHJhd0NhcHRpb24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgdm9pZAkJRHJhd1NlcGVyYXRvcihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICB2b2lkCQlEcmF3RGF0ZXNJbkJLKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIHZvaWQJCURyYXdXZWVrKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIHZvaWQJCURyYXdXZWVrTnVtYmVyKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIHZvaWQJCURyYXdXZWVrTnVtYmVyU2VwKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIHZvaWQJCURyYXdUb2RheShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICB2b2lkCQlEcmF3RGF0ZXNJbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICB2b2lkCQlEcmF3RGF0ZXNPdXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgdm9pZAkJRHJhd0RhdGVzSW5DaXJjbGUoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgdm9pZAkJRHJhd1RvZGF5Q2lyY2xlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIENGWF9TaXplRglDYWxjU2l6ZShGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCi0gICAgdm9pZAkJTGF5T3V0KCk7DQotICAgIHZvaWQJCUNhbGNIZWFkU2l6ZSgpOw0KLSAgICB2b2lkCQlDYWxjVG9kYXlTaXplKCk7DQotICAgIHZvaWQJCUNhbERhdGVJdGVtKCk7DQotICAgIHZvaWQJCUdldENhcFZhbHVlKCk7DQotICAgIGludDMyX3QJQ2FsV2Vla051bWJlcihpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KTsNCitjbGFzcyBDRldMX01vbnRoQ2FsZW5kYXJJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX01vbnRoQ2FsZW5kYXJJbXAoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgQ0ZXTF9Nb250aENhbGVuZGFySW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICB+Q0ZXTF9Nb250aENhbGVuZGFySW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50U2VsZWN0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0U2VsZWN0KGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4ID0gMCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0U2VsZWN0KGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KIA0KLSAgICBGWF9CT09MCQlHZXRNaW5EYXRlKGludDMyX3QgJmlZZWFyLCBpbnQzMl90ICZpTW9udGgsIGludDMyX3QgJmlEYXkpOw0KLSAgICBGWF9CT09MCQlTZXRNaW5EYXRlKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KLSAgICBGWF9CT09MCQlHZXRNYXhEYXRlKGludDMyX3QgJmlZZWFyLCBpbnQzMl90ICZpTW9udGgsIGludDMyX3QgJmlEYXkpOw0KLSAgICBGWF9CT09MCQlTZXRNYXhEYXRlKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KLSAgICBGWF9CT09MICAgICBJbml0RGF0ZSgpOw0KLSAgICB2b2lkCQlDbGVhckRhdGVJdGVtKCk7DQotICAgIHZvaWQJCVJlU2V0RGF0ZUl0ZW0oKTsNCi0gICAgRlhfQk9PTAkJTmV4dE1vbnRoKCk7DQotICAgIEZYX0JPT0wJCVByZXZNb250aCgpOw0KLSAgICB2b2lkCQlDaGFuZ2VUb01vbnRoKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoKTsNCi0gICAgRlhfQk9PTAkJUmVtb3ZlU2VsRGF5KGludDMyX3QgaURheSwgRlhfQk9PTCBiQWxsID0gRkFMU0UpOw0KLSAgICBGWF9CT09MCQlBZGRTZWxEYXkoaW50MzJfdCBpRGF5KTsNCi0gICAgRlhfQk9PTAkJSnVtcFRvVG9kYXkoKTsNCi0gICAgdm9pZAkJR2V0SGVhZFRleHQoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIENGWF9XaWRlU3RyaW5nICZ3c0hlYWQpOw0KLSAgICB2b2lkCQlHZXRUb2RheVRleHQoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSwgQ0ZYX1dpZGVTdHJpbmcgJndzVG9kYXkpOw0KLSAgICBpbnQzMl90CUdldERheUF0UG9pbnQoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7DQotICAgIEZYX0JPT0wJCUdldERheVJlY3QoaW50MzJfdCBpRGF5LCBDRlhfUmVjdEYgJnJ0RGF5KTsNCi0gICAgdHlwZWRlZiBzdHJ1Y3QgX0RBVEUgew0KLSAgICAgICAgX0RBVEUoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlZZWFyID0gMDsNCi0gICAgICAgICAgICBpTW9udGggPSAwOw0KLSAgICAgICAgICAgIGlEYXkgPSAwOw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdIZWFkQksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdMQnV0dG9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdSQnV0dG9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdDYXB0aW9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdTZXBlcmF0b3IoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdEYXRlc0luQksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdXZWVrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdXZWVrTnVtYmVyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdXZWVrTnVtYmVyU2VwKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdUb2RheShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdEYXRlc0luKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdEYXRlc091dChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdEYXRlc0luQ2lyY2xlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdUb2RheUNpcmNsZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBDRlhfU2l6ZUYgQ2FsY1NpemUoRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICB2b2lkIExheU91dCgpOw0KKyAgdm9pZCBDYWxjSGVhZFNpemUoKTsNCisgIHZvaWQgQ2FsY1RvZGF5U2l6ZSgpOw0KKyAgdm9pZCBDYWxEYXRlSXRlbSgpOw0KKyAgdm9pZCBHZXRDYXBWYWx1ZSgpOw0KKyAgaW50MzJfdCBDYWxXZWVrTnVtYmVyKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KKw0KKyAgRlhfQk9PTCBHZXRNaW5EYXRlKGludDMyX3QmIGlZZWFyLCBpbnQzMl90JiBpTW9udGgsIGludDMyX3QmIGlEYXkpOw0KKyAgRlhfQk9PTCBTZXRNaW5EYXRlKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KKyAgRlhfQk9PTCBHZXRNYXhEYXRlKGludDMyX3QmIGlZZWFyLCBpbnQzMl90JiBpTW9udGgsIGludDMyX3QmIGlEYXkpOw0KKyAgRlhfQk9PTCBTZXRNYXhEYXRlKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KKyAgRlhfQk9PTCBJbml0RGF0ZSgpOw0KKyAgdm9pZCBDbGVhckRhdGVJdGVtKCk7DQorICB2b2lkIFJlU2V0RGF0ZUl0ZW0oKTsNCisgIEZYX0JPT0wgTmV4dE1vbnRoKCk7DQorICBGWF9CT09MIFByZXZNb250aCgpOw0KKyAgdm9pZCBDaGFuZ2VUb01vbnRoKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoKTsNCisgIEZYX0JPT0wgUmVtb3ZlU2VsRGF5KGludDMyX3QgaURheSwgRlhfQk9PTCBiQWxsID0gRkFMU0UpOw0KKyAgRlhfQk9PTCBBZGRTZWxEYXkoaW50MzJfdCBpRGF5KTsNCisgIEZYX0JPT0wgSnVtcFRvVG9kYXkoKTsNCisgIHZvaWQgR2V0SGVhZFRleHQoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIENGWF9XaWRlU3RyaW5nJiB3c0hlYWQpOw0KKyAgdm9pZCBHZXRUb2RheVRleHQoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5LA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVG9kYXkpOw0KKyAgaW50MzJfdCBHZXREYXlBdFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOw0KKyAgRlhfQk9PTCBHZXREYXlSZWN0KGludDMyX3QgaURheSwgQ0ZYX1JlY3RGJiBydERheSk7DQorICB0eXBlZGVmIHN0cnVjdCBfREFURSB7DQorICAgIF9EQVRFKCkgew0KKyAgICAgIGlZZWFyID0gMDsNCisgICAgICBpTW9udGggPSAwOw0KKyAgICAgIGlEYXkgPSAwOw0KKyAgICB9DQorICAgIF9EQVRFKGludDMyX3QgeWVhciwgaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXkpDQorICAgICAgICA6IGlZZWFyKHllYXIpLCBpTW9udGgobW9udGgpLCBpRGF5KGRheSkge30NCisgICAgRlhfQk9PTCBvcGVyYXRvcjwoY29uc3QgX0RBVEUmIHJpZ2h0KSB7DQorICAgICAgaWYgKGlZZWFyIDwgcmlnaHQuaVllYXIpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0gZWxzZSBpZiAoaVllYXIgPT0gcmlnaHQuaVllYXIpIHsNCisgICAgICAgIGlmIChpTW9udGggPCByaWdodC5pTW9udGgpIHsNCisgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKGlNb250aCA9PSByaWdodC5pTW9udGgpIHsNCisgICAgICAgICAgcmV0dXJuIGlEYXkgPCByaWdodC5pRGF5Ow0KICAgICAgICAgfQ0KLSAgICAgICAgX0RBVEUoaW50MzJfdCB5ZWFyLCBpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheSkgOiBpWWVhcih5ZWFyKSwgaU1vbnRoKG1vbnRoKSwgaURheShkYXkpIHt9DQotICAgICAgICBGWF9CT09MIG9wZXJhdG9yIDwgKGNvbnN0IF9EQVRFICZyaWdodCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoaVllYXIgPCByaWdodC5pWWVhcikgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGlZZWFyID09IHJpZ2h0LmlZZWFyKSB7DQotICAgICAgICAgICAgICAgIGlmIChpTW9udGggPCByaWdodC5pTW9udGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlNb250aCA9PSByaWdodC5pTW9udGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpRGF5IDwgcmlnaHQuaURheTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9CT09MIG9wZXJhdG9yPihjb25zdCBfREFURSYgcmlnaHQpIHsNCisgICAgICBpZiAoaVllYXIgPiByaWdodC5pWWVhcikgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfSBlbHNlIGlmIChpWWVhciA9PSByaWdodC5pWWVhcikgew0KKyAgICAgICAgaWYgKGlNb250aCA+IHJpZ2h0LmlNb250aCkgew0KKyAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0gZWxzZSBpZiAoaU1vbnRoID09IHJpZ2h0LmlNb250aCkgew0KKyAgICAgICAgICByZXR1cm4gaURheSA+IHJpZ2h0LmlEYXk7DQogICAgICAgICB9DQotICAgICAgICBGWF9CT09MIG9wZXJhdG9yID4gKGNvbnN0IF9EQVRFICZyaWdodCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoaVllYXIgPiByaWdodC5pWWVhcikgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGlZZWFyID09IHJpZ2h0LmlZZWFyKSB7DQotICAgICAgICAgICAgICAgIGlmIChpTW9udGggPiByaWdodC5pTW9udGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlNb250aCA9PSByaWdodC5pTW9udGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpRGF5ID4gcmlnaHQuaURheTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlZZWFyOw0KLSAgICAgICAgaW50MzJfdCBpTW9udGg7DQotICAgICAgICBpbnQzMl90IGlEYXk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlZZWFyOw0KKyAgICBpbnQzMl90IGlNb250aDsNCisgICAgaW50MzJfdCBpRGF5Ow0KIA0KLSAgICB9IERBVEUsICpMUERBVEU7DQotICAgIEZYX0JPT0wJCQkJbV9iSW5pdDsNCi0gICAgQ0ZYX1JlY3RGCQkJbV9ydEhlYWQ7DQotICAgIENGWF9SZWN0RgkJCW1fcnRXZWVrOw0KLSAgICBDRlhfUmVjdEYJCQltX3J0TEJ0bjsNCi0gICAgQ0ZYX1JlY3RGCQkJbV9ydFJCdG47DQotICAgIENGWF9SZWN0RgkJCW1fcnREYXRlczsNCi0gICAgQ0ZYX1JlY3RGCQkJbV9ydEhTZXA7DQotICAgIENGWF9SZWN0RgkJCW1fcnRIZWFkVGV4dDsNCi0gICAgQ0ZYX1JlY3RGCQkJbV9ydFRvZGF5Ow0KLSAgICBDRlhfUmVjdEYJCQltX3J0VG9kYXlGbGFnOw0KLSAgICBDRlhfUmVjdEYJCQltX3J0V2Vla051bTsNCi0gICAgQ0ZYX1JlY3RGCQkJbV9ydFdlZWtOdW1TZXA7DQotICAgIENGWF9SZWN0RgkJCW1fcnRUZW1wOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJbV93c0hlYWQ7DQotICAgIENGWF9XaWRlU3RyaW5nCQltX3dzVG9kYXk7DQotICAgIENGWF9EYXRlVGltZQkJKm1fcERhdGVUaW1lOw0KLSAgICBDRlhfUHRyQXJyYXkJCW1fYXJyRGF0ZXM7DQotICAgIGludDMyX3QJCQltX2lDdXJZZWFyOw0KLSAgICBpbnQzMl90CQkJbV9pQ3VyTW9udGg7DQotICAgIGludDMyX3QJCQltX2lZZWFyOw0KLSAgICBpbnQzMl90CQkJbV9pTW9udGg7DQotICAgIGludDMyX3QJCQltX2lEYXk7DQotICAgIGludDMyX3QJCQltX2lIb3ZlcmVkOw0KLSAgICBpbnQzMl90CQkJbV9pTEJ0blBhcnRTdGF0ZXM7DQotICAgIGludDMyX3QJCQltX2lSQnRuUGFydFN0YXRlczsNCi0gICAgREFURQkJCQltX2R0TWluOw0KLSAgICBEQVRFCQkJCW1fZHRNYXg7DQotICAgIENGWF9TaXplRgkJCW1fc3pIZWFkOw0KLSAgICBDRlhfU2l6ZUYJCQltX3N6Q2VsbDsNCi0gICAgQ0ZYX1NpemVGCQkJbV9zelRvZGF5Ow0KLSAgICB0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+CUNGV0xfSW50MzJBcnJheTsNCi0gICAgQ0ZXTF9JbnQzMkFycmF5CQltX2FyclNlbERheXM7DQotICAgIGludDMyX3QJCQltX2lNYXhTZWw7DQotICAgIENGWF9SZWN0RgkJCW1fcnRDbGllbnQ7DQotICAgIEZYX0ZMT0FUIG1fZkhlYWRXaWQ7DQotICAgIEZYX0ZMT0FUIG1fZkhlYWRIZWk7DQotICAgIEZYX0ZMT0FUIG1fZkhlYWRCdG5XaWQ7DQotICAgIEZYX0ZMT0FUIG1fZkhlYWRCdG5IZWk7DQotICAgIEZYX0ZMT0FUIG1fZkhlYWRCdG5ITWFyZ2luOw0KLSAgICBGWF9GTE9BVCBtX2ZIZWFkQnRuVk1hcmdpbjsNCi0gICAgRlhfRkxPQVQgbV9mSGVhZFRleHRXaWQ7DQotICAgIEZYX0ZMT0FUIG1fZkhlYWRUZXh0SGVpOw0KLSAgICBGWF9GTE9BVCBtX2ZIZWFkVGV4dEhNYXJnaW47DQotICAgIEZYX0ZMT0FUIG1fZkhlYWRUZXh0Vk1hcmdpbjsNCi0gICAgRlhfRkxPQVQgbV9mSFNlcFdpZDsNCi0gICAgRlhfRkxPQVQgbV9mSFNlcEhlaTsNCisgIH0gREFURSwgKkxQREFURTsNCisgIEZYX0JPT0wgbV9iSW5pdDsNCisgIENGWF9SZWN0RiBtX3J0SGVhZDsNCisgIENGWF9SZWN0RiBtX3J0V2VlazsNCisgIENGWF9SZWN0RiBtX3J0TEJ0bjsNCisgIENGWF9SZWN0RiBtX3J0UkJ0bjsNCisgIENGWF9SZWN0RiBtX3J0RGF0ZXM7DQorICBDRlhfUmVjdEYgbV9ydEhTZXA7DQorICBDRlhfUmVjdEYgbV9ydEhlYWRUZXh0Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRUb2RheTsNCisgIENGWF9SZWN0RiBtX3J0VG9kYXlGbGFnOw0KKyAgQ0ZYX1JlY3RGIG1fcnRXZWVrTnVtOw0KKyAgQ0ZYX1JlY3RGIG1fcnRXZWVrTnVtU2VwOw0KKyAgQ0ZYX1JlY3RGIG1fcnRUZW1wOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0hlYWQ7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzVG9kYXk7DQorICBDRlhfRGF0ZVRpbWUqIG1fcERhdGVUaW1lOw0KKyAgQ0ZYX1B0ckFycmF5IG1fYXJyRGF0ZXM7DQorICBpbnQzMl90IG1faUN1clllYXI7DQorICBpbnQzMl90IG1faUN1ck1vbnRoOw0KKyAgaW50MzJfdCBtX2lZZWFyOw0KKyAgaW50MzJfdCBtX2lNb250aDsNCisgIGludDMyX3QgbV9pRGF5Ow0KKyAgaW50MzJfdCBtX2lIb3ZlcmVkOw0KKyAgaW50MzJfdCBtX2lMQnRuUGFydFN0YXRlczsNCisgIGludDMyX3QgbV9pUkJ0blBhcnRTdGF0ZXM7DQorICBEQVRFIG1fZHRNaW47DQorICBEQVRFIG1fZHRNYXg7DQorICBDRlhfU2l6ZUYgbV9zekhlYWQ7DQorICBDRlhfU2l6ZUYgbV9zekNlbGw7DQorICBDRlhfU2l6ZUYgbV9zelRvZGF5Ow0KKyAgdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBDRldMX0ludDMyQXJyYXk7DQorICBDRldMX0ludDMyQXJyYXkgbV9hcnJTZWxEYXlzOw0KKyAgaW50MzJfdCBtX2lNYXhTZWw7DQorICBDRlhfUmVjdEYgbV9ydENsaWVudDsNCisgIEZYX0ZMT0FUIG1fZkhlYWRXaWQ7DQorICBGWF9GTE9BVCBtX2ZIZWFkSGVpOw0KKyAgRlhfRkxPQVQgbV9mSGVhZEJ0bldpZDsNCisgIEZYX0ZMT0FUIG1fZkhlYWRCdG5IZWk7DQorICBGWF9GTE9BVCBtX2ZIZWFkQnRuSE1hcmdpbjsNCisgIEZYX0ZMT0FUIG1fZkhlYWRCdG5WTWFyZ2luOw0KKyAgRlhfRkxPQVQgbV9mSGVhZFRleHRXaWQ7DQorICBGWF9GTE9BVCBtX2ZIZWFkVGV4dEhlaTsNCisgIEZYX0ZMT0FUIG1fZkhlYWRUZXh0SE1hcmdpbjsNCisgIEZYX0ZMT0FUIG1fZkhlYWRUZXh0Vk1hcmdpbjsNCisgIEZYX0ZMT0FUIG1fZkhTZXBXaWQ7DQorICBGWF9GTE9BVCBtX2ZIU2VwSGVpOw0KIA0KLSAgICBGWF9GTE9BVCBtX2ZXZWVrTnVtV2lkOw0KLSAgICBGWF9GTE9BVCBtX2ZTZXBET2Zmc2V0Ow0KLSAgICBGWF9GTE9BVCBtX2ZTZXBYOw0KLSAgICBGWF9GTE9BVCBtX2ZTZXBZOw0KKyAgRlhfRkxPQVQgbV9mV2Vla051bVdpZDsNCisgIEZYX0ZMT0FUIG1fZlNlcERPZmZzZXQ7DQorICBGWF9GTE9BVCBtX2ZTZXBYOw0KKyAgRlhfRkxPQVQgbV9mU2VwWTsNCiANCi0gICAgRlhfRkxPQVQgbV9mV2Vla051bUhlaWdoOw0KLSAgICBGWF9GTE9BVCBtX2ZXZWVrV2lkOw0KLSAgICBGWF9GTE9BVCBtX2ZXZWVrSGVpOw0KLSAgICBGWF9GTE9BVCBtX2ZEYXRlQ2VsbFdpZDsNCi0gICAgRlhfRkxPQVQgbV9mRGF0ZUNlbGxIZWk7DQorICBGWF9GTE9BVCBtX2ZXZWVrTnVtSGVpZ2g7DQorICBGWF9GTE9BVCBtX2ZXZWVrV2lkOw0KKyAgRlhfRkxPQVQgbV9mV2Vla0hlaTsNCisgIEZYX0ZMT0FUIG1fZkRhdGVDZWxsV2lkOw0KKyAgRlhfRkxPQVQgbV9mRGF0ZUNlbGxIZWk7DQogDQotICAgIEZYX0ZMT0FUIG1fZlRvZGF5V2lkOw0KLSAgICBGWF9GTE9BVCBtX2ZUb2RheUhlaTsNCi0gICAgRlhfRkxPQVQgbV9mVG9kYXlGbGFnV2lkOw0KKyAgRlhfRkxPQVQgbV9mVG9kYXlXaWQ7DQorICBGWF9GTE9BVCBtX2ZUb2RheUhlaTsNCisgIEZYX0ZMT0FUIG1fZlRvZGF5RmxhZ1dpZDsNCiANCi0gICAgRlhfRkxPQVQgbV9mTUNXaWQ7DQotICAgIEZYX0ZMT0FUIG1fZk1DSGVpOw0KLSAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU7DQorICBGWF9GTE9BVCBtX2ZNQ1dpZDsNCisgIEZYX0ZMT0FUIG1fZk1DSGVpOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOw0KIH07DQogdHlwZWRlZiBzdHJ1Y3QgX0RBVEVJTkZPIHsNCi0gICAgX0RBVEVJTkZPKGludDMyX3QgZGF5LCBpbnQzMl90IGRheW9md2VlaywgRlhfRFdPUkQgZHdTdCwgQ0ZYX1JlY3RGIHJjLCBDRlhfV2lkZVN0cmluZyAmd3NkYXkpIDogaURheShkYXkpLCBpRGF5T2ZXZWVrKGRheW9md2VlayksIGR3U3RhdGVzKGR3U3QpLCByZWN0KHJjKSwgd3NEYXkod3NkYXkpIHt9DQotICAgIGludDMyX3QgaURheTsNCi0gICAgaW50MzJfdCBpRGF5T2ZXZWVrOw0KLSAgICBGWF9EV09SRCBkd1N0YXRlczsNCi0gICAgQ0ZYX1JlY3RGIHJlY3Q7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5Ow0KKyAgX0RBVEVJTkZPKGludDMyX3QgZGF5LA0KKyAgICAgICAgICAgIGludDMyX3QgZGF5b2Z3ZWVrLA0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3U3QsDQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJjLA0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c2RheSkNCisgICAgICA6IGlEYXkoZGF5KSwNCisgICAgICAgIGlEYXlPZldlZWsoZGF5b2Z3ZWVrKSwNCisgICAgICAgIGR3U3RhdGVzKGR3U3QpLA0KKyAgICAgICAgcmVjdChyYyksDQorICAgICAgICB3c0RheSh3c2RheSkge30NCisgIGludDMyX3QgaURheTsNCisgIGludDMyX3QgaURheU9mV2VlazsNCisgIEZYX0RXT1JEIGR3U3RhdGVzOw0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICBDRlhfV2lkZVN0cmluZyB3c0RheTsNCiB9IERBVEVJTkZPLCAqTFBEQVRFSU5GTzsNCi1jbGFzcyBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGUoQ0ZXTF9Nb250aENhbGVuZGFySW1wICpwT3duZXIpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJCU9uQWN0aXZhdGUoQ0ZXTF9NZXNzYWdlICpwTXNnKTsNCi0gICAgdm9pZAkJT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlICpwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCi0gICAgdm9pZAkJT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAkJT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJCU9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCQlPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIENGV0xfTW9udGhDYWxlbmRhckltcAkqbV9wT3duZXI7DQorY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlKENGV0xfTW9udGhDYWxlbmRhckltcCogcE93bmVyKTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIE9uQWN0aXZhdGUoQ0ZXTF9NZXNzYWdlKiBwTXNnKTsNCisgIHZvaWQgT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICBDRldMX01vbnRoQ2FsZW5kYXJJbXAqIG1fcE93bmVyOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfcGljdHVyZWJveGltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfcGljdHVyZWJveGltcC5oCmluZGV4IDAzOGViZWIuLjJiZDFkOGMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3BpY3R1cmVib3hpbXAuaAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9waWN0dXJlYm94aW1wLmgKQEAgLTEyLDM2ICsxMiw0MSBAQAogY2xhc3MgSUZXTF9XaWRnZXQ7DQogY2xhc3MgQ0ZXTF9QaWN0dXJlQm94SW1wOw0KIGNsYXNzIENGV0xfUGljdHVyZUJveEltcERlbGVnYXRlOw0KLWNsYXNzIENGV0xfUGljdHVyZUJveEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfUGljdHVyZUJveEltcChJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIENGV0xfUGljdHVyZUJveEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgfkNGV0xfUGljdHVyZUJveEltcCgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQlVcGRhdGUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQlEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIEZYX0JPT0wgICAgIFZTdHlsZShGWF9CT09MIGR3U3R5bGUpOw0KLSAgICBDRlhfUmVjdEYJCW1fcnRDbGllbnQ7DQotICAgIENGWF9SZWN0RgkJbV9ydEltYWdlOw0KLSAgICBDRlhfTWF0cml4CQltX21hdHJpeDsNCi0gICAgRlhfQk9PTCAgICAgICAgIG1fYlRvcDsNCi0gICAgRlhfQk9PTCAgICAgICAgIG1fYlZDZW50ZXI7DQotICAgIEZYX0JPT0wgICAgICAgICBtX2JCdXR0b247DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX1BpY3R1cmVCb3hJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX1BpY3R1cmVCb3hJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX1BpY3R1cmVCb3hJbXAoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgQ0ZXTF9QaWN0dXJlQm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICB+Q0ZXTF9QaWN0dXJlQm94SW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgRlhfQk9PTCBWU3R5bGUoRlhfQk9PTCBkd1N0eWxlKTsNCisgIENGWF9SZWN0RiBtX3J0Q2xpZW50Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRJbWFnZTsNCisgIENGWF9NYXRyaXggbV9tYXRyaXg7DQorICBGWF9CT09MIG1fYlRvcDsNCisgIEZYX0JPT0wgbV9iVkNlbnRlcjsNCisgIEZYX0JPT0wgbV9iQnV0dG9uOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfUGljdHVyZUJveEltcERlbGVnYXRlOw0KIH07DQotY2xhc3MgQ0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfUGljdHVyZUJveEltcERlbGVnYXRlKENGV0xfUGljdHVyZUJveEltcCAqcE93bmVyKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGV0xfUGljdHVyZUJveEltcCAqbV9wT3duZXI7DQorY2xhc3MgQ0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfUGljdHVyZUJveEltcERlbGVnYXRlKENGV0xfUGljdHVyZUJveEltcCogcE93bmVyKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9QaWN0dXJlQm94SW1wKiBtX3BPd25lcjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3B1c2hidXR0b25pbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3B1c2hidXR0b25pbXAuaAppbmRleCA1MjM4ODg0Li5iMzQ2ZTUyIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9wdXNoYnV0dG9uaW1wLmgKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfcHVzaGJ1dHRvbmltcC5oCkBAIC0xMiw0NiArMTIsNTMgQEAKIGNsYXNzIElGV0xfV2lkZ2V0Ow0KIGNsYXNzIENGV0xfUHVzaEJ1dHRvbkltcDsNCiBjbGFzcyBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTsNCi1jbGFzcyBDRldMX1B1c2hCdXR0b25JbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXANCi17DQotcHVibGljOg0KLSAgICBDRldMX1B1c2hCdXR0b25JbXAoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBDRldMX1B1c2hCdXR0b25JbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIHZpcnR1YWwgfkNGV0xfUHVzaEJ1dHRvbkltcCgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlGaW5hbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJCURyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICB2b2lkCQlEcmF3VGV4dChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICBGWF9EV09SRAlHZXRQYXJ0U3RhdGVzKCk7DQotICAgIHZvaWQJCVVwZGF0ZVRleHRPdXRTdHlsZXMoKTsNCi0gICAgQ0ZYX1JlY3RGCW1fcnRDbGllbnQ7DQotICAgIENGWF9SZWN0RgltX3J0Q2FwdGlvbjsNCi0gICAgRlhfQk9PTAkJbV9iQnRuRG93bjsNCi0gICAgRlhfRFdPUkQJbV9kd1RUT1N0eWxlczsNCi0gICAgaW50MzJfdAltX2lUVE9BbGlnbjsNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfUHVzaEJ1dHRvbkltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfUHVzaEJ1dHRvbkltcChJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBDRldMX1B1c2hCdXR0b25JbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIHZpcnR1YWwgfkNGV0xfUHVzaEJ1dHRvbkltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdUZXh0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9EV09SRCBHZXRQYXJ0U3RhdGVzKCk7DQorICB2b2lkIFVwZGF0ZVRleHRPdXRTdHlsZXMoKTsNCisgIENGWF9SZWN0RiBtX3J0Q2xpZW50Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRDYXB0aW9uOw0KKyAgRlhfQk9PTCBtX2JCdG5Eb3duOw0KKyAgRlhfRFdPUkQgbV9kd1RUT1N0eWxlczsNCisgIGludDMyX3QgbV9pVFRPQWxpZ247DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU7DQogfTsNCi1jbGFzcyBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGUoQ0ZXTF9QdXNoQnV0dG9uSW1wICpwT3duZXIpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAlPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KLSAgICB2b2lkCU9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uS2V5RG93bihDRldMX01zZ0tleSAqcE1zZyk7DQotICAgIENGV0xfUHVzaEJ1dHRvbkltcCAqbV9wT3duZXI7DQorY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlKENGV0xfUHVzaEJ1dHRvbkltcCogcE93bmVyKTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uS2V5RG93bihDRldMX01zZ0tleSogcE1zZyk7DQorICBDRldMX1B1c2hCdXR0b25JbXAqIG1fcE93bmVyOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc2Nyb2xsYmFyaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9zY3JvbGxiYXJpbXAuaAppbmRleCA5YjhkYzE5Li4xYWVmNzU4IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9zY3JvbGxiYXJpbXAuaAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9zY3JvbGxiYXJpbXAuaApAQCAtMTQsMTAwICsxNCwxMjcgQEAKIGNsYXNzIElGV0xfVGltZXJEZWxlZ2F0ZTsNCiBjbGFzcyBDRldMX1Njcm9sbEJhckltcDsNCiBjbGFzcyBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOw0KLWNsYXNzIENGV0xfU2Nyb2xsQmFySW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wLCBwdWJsaWMgSUZXTF9UaW1lcg0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfU2Nyb2xsQmFySW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgQ0ZXTF9TY3JvbGxCYXJJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIH5DRldMX1Njcm9sbEJhckltcCgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3Q7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUluaXRpYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSICAgICBGaW5hbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQlVcGRhdGUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNWZXJ0aWNhbCgpIDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRSYW5nZShGWF9GTE9BVCAmZk1pbiwgRlhfRkxPQVQgJmZNYXgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgpOw0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCUdldFBhZ2VTaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0UGFnZVNpemUoRlhfRkxPQVQgZlBhZ2VTaXplKTsNCi0gICAgdmlydHVhbCBGWF9GTE9BVAlHZXRTdGVwU2l6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFN0ZXBTaXplKEZYX0ZMT0FUIGZTdGVwU2l6ZSk7DQotICAgIHZpcnR1YWwgRlhfRkxPQVQJR2V0UG9zKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0UG9zKEZYX0ZMT0FUIGZQb3MpOw0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCUdldFRyYWNrUG9zKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0VHJhY2tQb3MoRlhfRkxPQVQgZlRyYWNrUG9zKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEb1Njcm9sbChGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MgPSAwLjBmKTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQlTZXRPdXRlcihJRldMX1dpZGdldCAqcE91dGVyKTsNCi0gICAgdmlydHVhbAlpbnQzMl90CVJ1bihGV0xfSFRJTUVSIGhUaW1lcik7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQlEcmF3VHJhY2soQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBGWF9CT09MIGJMb3dlciA9IFRSVUUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdm9pZAkJRHJhd0Fycm93QnRuKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgRlhfQk9PTCBiTWluQnRuID0gVFJVRSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCQlEcmF3VGh1bWIoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJCUxheW91dCgpOw0KLSAgICB2b2lkCQlDYWxjQnV0dG9uTGVuKCk7DQotICAgIHZvaWQJCUNhbGNNaW5CdXR0b25SZWN0KENGWF9SZWN0RiAmcmVjdCk7DQotICAgIHZvaWQJCUNhbGNNYXhCdXR0b25SZWN0KENGWF9SZWN0RiAmcmVjdCk7DQotICAgIHZvaWQJCUNhbGNUaHVtYkJ1dHRvblJlY3QoQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdm9pZAkJQ2FsY01pblRyYWNrUmVjdChDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2b2lkCQlDYWxjTWF4VHJhY2tSZWN0KENGWF9SZWN0RiAmcmVjdCk7DQorY2xhc3MgQ0ZXTF9TY3JvbGxCYXJJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXAsIHB1YmxpYyBJRldMX1RpbWVyIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9TY3JvbGxCYXJJbXAoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgQ0ZXTF9TY3JvbGxCYXJJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgfkNGV0xfU2Nyb2xsQmFySW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmVydGljYWwoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRSYW5nZShGWF9GTE9BVCYgZk1pbiwgRlhfRkxPQVQmIGZNYXgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgpOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRQYWdlU2l6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSk7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldFN0ZXBTaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKTsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0UG9zKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0UG9zKEZYX0ZMT0FUIGZQb3MpOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRUcmFja1BvcygpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFRyYWNrUG9zKEZYX0ZMT0FUIGZUcmFja1Bvcyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRG9TY3JvbGwoRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zID0gMC4wZik7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0T3V0ZXIoSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB2aXJ0dWFsIGludDMyX3QgUnVuKEZXTF9IVElNRVIgaFRpbWVyKTsNCiANCi0gICAgRlhfRkxPQVQJR2V0VHJhY2tQb2ludFBvcyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2b2lkCQlHZXRUcmFja1JlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJMb3dlciA9IFRSVUUpOw0KLSAgICBGWF9CT09MCQlTZW5kRXZlbnQoKTsNCi0gICAgRlhfQk9PTAkJT25TY3JvbGwoRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zKTsNCi0gICAgRldMX0hUSU1FUgkJCQltX2hUaW1lcjsNCi0gICAgRlhfRkxPQVQJCQkJbV9mUmFuZ2VNaW47DQotICAgIEZYX0ZMT0FUCQkJCW1fZlJhbmdlTWF4Ow0KLSAgICBGWF9GTE9BVAkJCQltX2ZQYWdlU2l6ZTsNCi0gICAgRlhfRkxPQVQJCQkJbV9mU3RlcFNpemU7DQotICAgIEZYX0ZMT0FUCQkJCW1fZlBvczsNCi0gICAgRlhfRkxPQVQJCQkJbV9mVHJhY2tQb3M7DQotICAgIGludDMyX3QJCQkJbV9pTWluQnV0dG9uU3RhdGU7DQotICAgIGludDMyX3QJCQkJbV9pTWF4QnV0dG9uU3RhdGU7DQotICAgIGludDMyX3QJCQkJbV9pVGh1bWJCdXR0b25TdGF0ZTsNCi0gICAgaW50MzJfdAkJCQltX2lNaW5UcmFja1N0YXRlOw0KLSAgICBpbnQzMl90CQkJCW1faU1heFRyYWNrU3RhdGU7DQotICAgIEZYX0ZMT0FUCQkJCW1fZkxhc3RUcmFja1BvczsNCi0gICAgRlhfRkxPQVQJCQkJbV9jcFRyYWNrUG9pbnRYOw0KLSAgICBGWF9GTE9BVAkJCQltX2NwVHJhY2tQb2ludFk7DQotICAgIGludDMyX3QJCQkJbV9pTW91c2VXaGVlbDsNCi0gICAgRlhfQk9PTAkJCQkJbV9iVHJhY2tNb3VzZUxlYXZlOw0KLSAgICBGWF9CT09MCQkJCQltX2JNb3VzZUhvdmVyOw0KLSAgICBGWF9CT09MCQkJCQltX2JNb3VzZURvd247DQotICAgIEZYX0JPT0wJCQkJCW1fYlJlcGFpbnRUaHVtYjsNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3VHJhY2soQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvd2VyID0gVFJVRSwNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0Fycm93QnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNaW5CdG4gPSBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3VGh1bWIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgTGF5b3V0KCk7DQorICB2b2lkIENhbGNCdXR0b25MZW4oKTsNCisgIHZvaWQgQ2FsY01pbkJ1dHRvblJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQgQ2FsY01heEJ1dHRvblJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQgQ2FsY1RodW1iQnV0dG9uUmVjdChDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBDYWxjTWluVHJhY2tSZWN0KENGWF9SZWN0RiYgcmVjdCk7DQorICB2b2lkIENhbGNNYXhUcmFja1JlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCiANCi0gICAgRlhfRkxPQVQJCQkJbV9mQnV0dG9uTGVuOw0KLSAgICBGWF9CT09MCQkJCQltX2JNaW5TaXplOw0KLSAgICBDRlhfUmVjdEYJCQkJbV9ydENsaWVudDsNCi0gICAgQ0ZYX1JlY3RGCQkJCW1fcnRUaHVtYjsNCi0gICAgQ0ZYX1JlY3RGCQkJCW1fcnRNaW5CdG47DQotICAgIENGWF9SZWN0RgkJCQltX3J0TWF4QnRuOw0KLSAgICBDRlhfUmVjdEYJCQkJbV9ydE1pblRyYWNrOw0KLSAgICBDRlhfUmVjdEYJCQkJbV9ydE1heFRyYWNrOw0KLSAgICBGWF9CT09MCQkJCQltX2JDdXN0b21MYXlvdXQ7DQotICAgIEZYX0ZMT0FUCQkJCW1fZk1pblRodW1iOw0KLSAgICBmcmllbmQgY2xhc3MgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTsNCisgIEZYX0ZMT0FUIEdldFRyYWNrUG9pbnRQb3MoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgR2V0VHJhY2tSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiTG93ZXIgPSBUUlVFKTsNCisgIEZYX0JPT0wgU2VuZEV2ZW50KCk7DQorICBGWF9CT09MIE9uU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcyk7DQorICBGV0xfSFRJTUVSIG1faFRpbWVyOw0KKyAgRlhfRkxPQVQgbV9mUmFuZ2VNaW47DQorICBGWF9GTE9BVCBtX2ZSYW5nZU1heDsNCisgIEZYX0ZMT0FUIG1fZlBhZ2VTaXplOw0KKyAgRlhfRkxPQVQgbV9mU3RlcFNpemU7DQorICBGWF9GTE9BVCBtX2ZQb3M7DQorICBGWF9GTE9BVCBtX2ZUcmFja1BvczsNCisgIGludDMyX3QgbV9pTWluQnV0dG9uU3RhdGU7DQorICBpbnQzMl90IG1faU1heEJ1dHRvblN0YXRlOw0KKyAgaW50MzJfdCBtX2lUaHVtYkJ1dHRvblN0YXRlOw0KKyAgaW50MzJfdCBtX2lNaW5UcmFja1N0YXRlOw0KKyAgaW50MzJfdCBtX2lNYXhUcmFja1N0YXRlOw0KKyAgRlhfRkxPQVQgbV9mTGFzdFRyYWNrUG9zOw0KKyAgRlhfRkxPQVQgbV9jcFRyYWNrUG9pbnRYOw0KKyAgRlhfRkxPQVQgbV9jcFRyYWNrUG9pbnRZOw0KKyAgaW50MzJfdCBtX2lNb3VzZVdoZWVsOw0KKyAgRlhfQk9PTCBtX2JUcmFja01vdXNlTGVhdmU7DQorICBGWF9CT09MIG1fYk1vdXNlSG92ZXI7DQorICBGWF9CT09MIG1fYk1vdXNlRG93bjsNCisgIEZYX0JPT0wgbV9iUmVwYWludFRodW1iOw0KKw0KKyAgRlhfRkxPQVQgbV9mQnV0dG9uTGVuOw0KKyAgRlhfQk9PTCBtX2JNaW5TaXplOw0KKyAgQ0ZYX1JlY3RGIG1fcnRDbGllbnQ7DQorICBDRlhfUmVjdEYgbV9ydFRodW1iOw0KKyAgQ0ZYX1JlY3RGIG1fcnRNaW5CdG47DQorICBDRlhfUmVjdEYgbV9ydE1heEJ0bjsNCisgIENGWF9SZWN0RiBtX3J0TWluVHJhY2s7DQorICBDRlhfUmVjdEYgbV9ydE1heFRyYWNrOw0KKyAgRlhfQk9PTCBtX2JDdXN0b21MYXlvdXQ7DQorICBGWF9GTE9BVCBtX2ZNaW5UaHVtYjsNCisgIGZyaWVuZCBjbGFzcyBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOw0KIH07DQotY2xhc3MgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZShDRldMX1Njcm9sbEJhckltcCAqcE93bmVyKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQlPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZvaWQJCU9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZvaWQJCU9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZvaWQJCU9uTW91c2VMZWF2ZSgpOw0KLSAgICB2b2lkCQlPbk1vdXNlV2hlZWwoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5LCBGWF9EV09SRAlkd0ZsYWdzLCBGWF9GTE9BVCBmRGVsdGFYLCBGWF9GTE9BVAlmRGVsdGFZKTsNCi0gICAgdm9pZAkJRG9Nb3VzZURvd24oaW50MzJfdCBpSXRlbSwgY29uc3QgQ0ZYX1JlY3RGICZydEl0ZW0sIGludDMyX3QgJmlTdGF0ZSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdm9pZAkJRG9Nb3VzZVVwKGludDMyX3QgaUl0ZW0sIGNvbnN0IENGWF9SZWN0RiAmcnRJdGVtLCBpbnQzMl90ICZpU3RhdGUsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZvaWQJCURvTW91c2VNb3ZlKGludDMyX3QgaUl0ZW0sIGNvbnN0IENGWF9SZWN0RiAmcnRJdGVtLCBpbnQzMl90ICZpU3RhdGUsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZvaWQJCURvTW91c2VMZWF2ZShpbnQzMl90IGlJdGVtLCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSwgaW50MzJfdCAmaVN0YXRlKTsNCi0gICAgdm9pZAkJRG9Nb3VzZUhvdmVyKGludDMyX3QgaUl0ZW0sIGNvbnN0IENGWF9SZWN0RiAmcnRJdGVtLCBpbnQzMl90ICZpU3RhdGUpOw0KK2NsYXNzIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGUoQ0ZXTF9TY3JvbGxCYXJJbXAqIHBPd25lcik7DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCiANCi0gICAgQ0ZXTF9TY3JvbGxCYXJJbXAgKm1fcE93bmVyOw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIE9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgT25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgT25Nb3VzZU1vdmUoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgT25Nb3VzZUxlYXZlKCk7DQorICB2b2lkIE9uTW91c2VXaGVlbChGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZEZWx0YVgsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRGVsdGFZKTsNCisgIHZvaWQgRG9Nb3VzZURvd24oaW50MzJfdCBpSXRlbSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0sDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgRG9Nb3VzZVVwKGludDMyX3QgaUl0ZW0sDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSwNCisgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGF0ZSwNCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdm9pZCBEb01vdXNlTW92ZShpbnQzMl90IGlJdGVtLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdm9pZCBEb01vdXNlTGVhdmUoaW50MzJfdCBpSXRlbSwgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0sIGludDMyX3QmIGlTdGF0ZSk7DQorICB2b2lkIERvTW91c2VIb3ZlcihpbnQzMl90IGlJdGVtLCBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSwgaW50MzJfdCYgaVN0YXRlKTsNCisNCisgIENGV0xfU2Nyb2xsQmFySW1wKiBtX3BPd25lcjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3NwaW5idXR0b25pbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3NwaW5idXR0b25pbXAuaAppbmRleCA4MDg5MDNjLi5mMTk2YjM3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9zcGluYnV0dG9uaW1wLmgKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc3BpbmJ1dHRvbmltcC5oCkBAIC0xMyw1MCArMTMsNTcgQEAKIGNsYXNzIElGV0xfVGltZXI7DQogY2xhc3MgQ0ZXTF9TcGluQnV0dG9uSW1wOw0KIGNsYXNzIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOw0KLWNsYXNzIENGV0xfU3BpbkJ1dHRvbkltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCwgcHVibGljIElGV0xfVGltZXINCi17DQotcHVibGljOg0KLSAgICBDRldMX1NwaW5CdXR0b25JbXAoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBDRldMX1NwaW5CdXR0b25JbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIH5DRldMX1NwaW5CdXR0b25JbXAoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0RXT1JEICAgIEdldENsYXNzSUQoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlJbml0aWFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJRmluYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkgICAgVXBkYXRlKCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CVJ1bihGV0xfSFRJTUVSIGhUaW1lcik7DQotICAgIEZXTF9FUlIJCUVuYWJsZUJ1dHRvbihGWF9CT09MIGJFbmFibGUsIEZYX0JPT0wgYlVwID0gVFJVRSk7DQotICAgIEZYX0JPT0wJCUlzQnV0dG9uRW5hYmxlKEZYX0JPT0wgYlVwID0gVFJVRSk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkICAgICAgICBEcmF3VXBCdXR0b24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgdm9pZCAgICAgICAgRHJhd0Rvd25CdXR0b24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgQ0ZYX1JlY3RGCW1fcnRDbGllbnQ7DQotICAgIENGWF9SZWN0RgltX3J0VXBCdXR0b247DQotICAgIENGWF9SZWN0RgltX3J0RG5CdXR0b247DQotICAgIEZYX0RXT1JEICAgIG1fZHdVcFN0YXRlOw0KLSAgICBGWF9EV09SRCAgICBtX2R3RG5TdGF0ZTsNCi0gICAgaW50MzJfdAltX2lCdXR0b25JbmRleDsNCi0gICAgRlhfQk9PTCAgICAgbV9iTEJ1dHRvbkR3bjsNCi0gICAgRldMX0hUSU1FUgltX2hUaW1lcjsNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfU3BpbkJ1dHRvbkltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCwgcHVibGljIElGV0xfVGltZXIgew0KKyBwdWJsaWM6DQorICBDRldMX1NwaW5CdXR0b25JbXAoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgQ0ZXTF9TcGluQnV0dG9uSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICB+Q0ZXTF9TcGluQnV0dG9uSW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgUnVuKEZXTF9IVElNRVIgaFRpbWVyKTsNCisgIEZXTF9FUlIgRW5hYmxlQnV0dG9uKEZYX0JPT0wgYkVuYWJsZSwgRlhfQk9PTCBiVXAgPSBUUlVFKTsNCisgIEZYX0JPT0wgSXNCdXR0b25FbmFibGUoRlhfQk9PTCBiVXAgPSBUUlVFKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3VXBCdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgdm9pZCBEcmF3RG93bkJ1dHRvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgQ0ZYX1JlY3RGIG1fcnRDbGllbnQ7DQorICBDRlhfUmVjdEYgbV9ydFVwQnV0dG9uOw0KKyAgQ0ZYX1JlY3RGIG1fcnREbkJ1dHRvbjsNCisgIEZYX0RXT1JEIG1fZHdVcFN0YXRlOw0KKyAgRlhfRFdPUkQgbV9kd0RuU3RhdGU7DQorICBpbnQzMl90IG1faUJ1dHRvbkluZGV4Ow0KKyAgRlhfQk9PTCBtX2JMQnV0dG9uRHduOw0KKyAgRldMX0hUSU1FUiBtX2hUaW1lcjsNCisgIGZyaWVuZCBjbGFzcyBDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZTsNCiB9Ow0KLWNsYXNzIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUNCi17DQotcHVibGljOg0KLSAgICBDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZShDRldMX1NwaW5CdXR0b25JbXAgKnBPd25lcik7DQotICAgIHZpcnR1YWwgaW50MzJfdAlPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCU9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSAqcE1zZywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQotICAgIHZvaWQJT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAlPbkxCdXR0b25VcChDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAlPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAlPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25LZXlEb3duKENGV0xfTXNnS2V5ICpwTXNnKTsNCi0gICAgQ0ZXTF9TcGluQnV0dG9uSW1wICptX3BPd25lcjsNCitjbGFzcyBDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGUoQ0ZXTF9TcGluQnV0dG9uSW1wKiBwT3duZXIpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgdm9pZCBPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkxCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25LZXlEb3duKENGV0xfTXNnS2V5KiBwTXNnKTsNCisgIENGV0xfU3BpbkJ1dHRvbkltcCogbV9wT3duZXI7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF90b29sdGlwY3RybGltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfdG9vbHRpcGN0cmxpbXAuaAppbmRleCA2NTMyZWJhLi5jNjUyMzQ2IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF90b29sdGlwY3RybGltcC5oCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3Rvb2x0aXBjdHJsaW1wLmgKQEAgLTEzLDY2ICsxMyw3MiBAQAogY2xhc3MgSUZXTF9UaW1lcjsNCiBjbGFzcyBDRldMX1Rvb2xUaXBJbXA7DQogY2xhc3MgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGU7DQotY2xhc3MgQ0ZXTF9Ub29sVGlwSW1wIDogcHVibGljIENGV0xfRm9ybUltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfVG9vbFRpcEltcChJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIENGV0xfVG9vbFRpcEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9Ub29sVGlwSW1wKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRDbGFzc0lEKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCApOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldENsaWVudFJlY3QoQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgRldMX0VSUgkJU2V0QW5jaG9yKGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IpOw0KLSAgICBGV0xfRVJSCQlTaG93KCk7DQotICAgIEZXTF9FUlIJCUhpZGUoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJCURyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICB2b2lkCQlEcmF3VGV4dChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpOw0KLSAgICB2b2lkCQlVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQotICAgIHZvaWQJCVJlZnJlc2hUb29sVGlwUG9zKCk7DQotICAgIGNsYXNzIENGV0xfVG9vbFRpcFRpbWVyIDogcHVibGljIElGV0xfVGltZXINCi0gICAgew0KLSAgICBwdWJsaWM6DQotICAgICAgICBDRldMX1Rvb2xUaXBUaW1lcigpIHt9Ow0KLSAgICAgICAgfkNGV0xfVG9vbFRpcFRpbWVyKCkge307DQotICAgICAgICBDRldMX1Rvb2xUaXBUaW1lcihDRldMX1Rvb2xUaXBJbXAgKiBwVG9vbFRpcCk7DQotICAgICAgICB2aXJ0dWFsIGludDMyX3QgUnVuKEZXTF9IVElNRVIgaFRpbWVyKTsNCi0gICAgICAgIENGV0xfVG9vbFRpcEltcCAqbV9wVG9vbFRpcDsNCi0gICAgfTsNCi0gICAgQ0ZYX1JlY3RGCW1fcnRDbGllbnQ7DQotICAgIENGWF9SZWN0RgltX3J0Q2FwdGlvbjsNCi0gICAgRlhfQk9PTAkJbV9iQnRuRG93bjsNCi0gICAgRlhfRFdPUkQJbV9kd1RUT1N0eWxlczsNCi0gICAgaW50MzJfdAltX2lUVE9BbGlnbjsNCi0gICAgQ0ZYX1JlY3RGCW1fcnRBbmNob3I7DQotICAgIEZXTF9IVElNRVIJbV9oVGltZXJTaG93Ow0KLSAgICBGV0xfSFRJTUVSCW1faFRpbWVySGlkZTsNCi0gICAgQ0ZXTF9Ub29sVGlwVGltZXIqCW1fcFRpbWVyOw0KLSAgICBDRldMX1Rvb2xUaXBUaW1lcgltX1RpbWVyU2hvdzsNCi0gICAgQ0ZXTF9Ub29sVGlwVGltZXIJbV9UaW1lckhpZGU7DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZTsNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfVG9vbFRpcFRpbWVyOw0KK2NsYXNzIENGV0xfVG9vbFRpcEltcCA6IHB1YmxpYyBDRldMX0Zvcm1JbXAgew0KKyBwdWJsaWM6DQorICBDRldMX1Rvb2xUaXBJbXAoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgQ0ZXTF9Ub29sVGlwSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICB2aXJ0dWFsIH5DRldMX1Rvb2xUaXBJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsaWVudFJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIEZXTF9FUlIgU2V0QW5jaG9yKGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IpOw0KKyAgRldMX0VSUiBTaG93KCk7DQorICBGV0xfRVJSIEhpZGUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgdm9pZCBEcmF3VGV4dChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgdm9pZCBVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQorICB2b2lkIFJlZnJlc2hUb29sVGlwUG9zKCk7DQorICBjbGFzcyBDRldMX1Rvb2xUaXBUaW1lciA6IHB1YmxpYyBJRldMX1RpbWVyIHsNCisgICBwdWJsaWM6DQorICAgIENGV0xfVG9vbFRpcFRpbWVyKCl7fTsNCisgICAgfkNGV0xfVG9vbFRpcFRpbWVyKCl7fTsNCisgICAgQ0ZXTF9Ub29sVGlwVGltZXIoQ0ZXTF9Ub29sVGlwSW1wKiBwVG9vbFRpcCk7DQorICAgIHZpcnR1YWwgaW50MzJfdCBSdW4oRldMX0hUSU1FUiBoVGltZXIpOw0KKyAgICBDRldMX1Rvb2xUaXBJbXAqIG1fcFRvb2xUaXA7DQorICB9Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRDbGllbnQ7DQorICBDRlhfUmVjdEYgbV9ydENhcHRpb247DQorICBGWF9CT09MIG1fYkJ0bkRvd247DQorICBGWF9EV09SRCBtX2R3VFRPU3R5bGVzOw0KKyAgaW50MzJfdCBtX2lUVE9BbGlnbjsNCisgIENGWF9SZWN0RiBtX3J0QW5jaG9yOw0KKyAgRldMX0hUSU1FUiBtX2hUaW1lclNob3c7DQorICBGV0xfSFRJTUVSIG1faFRpbWVySGlkZTsNCisgIENGV0xfVG9vbFRpcFRpbWVyKiBtX3BUaW1lcjsNCisgIENGV0xfVG9vbFRpcFRpbWVyIG1fVGltZXJTaG93Ow0KKyAgQ0ZXTF9Ub29sVGlwVGltZXIgbV9UaW1lckhpZGU7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGU7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Ub29sVGlwVGltZXI7DQogfTsNCi1jbGFzcyBDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGUoQ0ZXTF9Ub29sVGlwSW1wICpwT3duZXIpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAlPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UgKnBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KLSAgICB2b2lkCU9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uS2V5RG93bihDRldMX01zZ0tleSAqcE1zZyk7DQotICAgIENGV0xfVG9vbFRpcEltcCAqbV9wT3duZXI7DQorY2xhc3MgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfVG9vbFRpcEltcERlbGVnYXRlKENGV0xfVG9vbFRpcEltcCogcE93bmVyKTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uS2V5RG93bihDRldMX01zZ0tleSogcE1zZyk7DQorICBDRldMX1Rvb2xUaXBJbXAqIG1fcE93bmVyOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9meG1hdGhfYmFyY29kZWltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9meG1hdGhfYmFyY29kZWltcC5oCmluZGV4IGVhOGJlNzUuLjIyYjc1YjggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZnhtYXRoX2JhcmNvZGVpbXAuaAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z4bWF0aF9iYXJjb2RlaW1wLmgKQEAgLTYsNDAgKzYsNDcgQEAKIA0KICNpZm5kZWYgX0ZYTUFUSF9CQVJDT0RFSU1QX0hfDQogI2RlZmluZSBfRlhNQVRIX0JBUkNPREVJTVBfSF8NCi1jbGFzcyBDRlhfQmFyY29kZSA6IHB1YmxpYyBJRlhfQmFyY29kZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9CYXJjb2RlKCk7DQotICAgIH5DRlhfQmFyY29kZSgpOw0KLSAgICBGWF9CT09MCQkJCQlDcnJlYXRlKEJDX1RZUEUgdHlwZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKTsNCi0gICAgdmlydHVhbCBCQ19UWVBFCQkJR2V0VHlwZSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgaW50MzJfdCAmZSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBpbnQzMl90ICZlKTsNCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCAmZXJyb3JDb2RlKTsNCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBpbnQzMl90ICZlcnJvckNvZGUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRDaGFyRW5jb2RpbmcoQkNfQ0hBUl9FTkNPRElORyBlbmNvZGluZyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldE1vZHVsZVdpZHRoKGludDMyX3QgbW9kdWxlV2lkdGgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRXaWR0aChpbnQzMl90IHdpZHRoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFByaW50Q2hlY2tzdW0oRlhfQk9PTCBjaGVja3N1bSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRDYWxDaGVja3N1bShpbnQzMl90IHN0YXRlKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Rm9udChDRlhfRm9udCogcEZvbnQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRGb250Q29sb3IoRlhfQVJHQiBjb2xvcik7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbik7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0U3RhcnRDaGFyKEZYX0NIQVIgc3RhcnQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRFbmRDaGFyKEZYX0NIQVIgZW5kKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENCQ19Db2RlQmFzZSoJbV9wQkNFbmdpbmU7DQorY2xhc3MgQ0ZYX0JhcmNvZGUgOiBwdWJsaWMgSUZYX0JhcmNvZGUgew0KKyBwdWJsaWM6DQorICBDRlhfQmFyY29kZSgpOw0KKyAgfkNGWF9CYXJjb2RlKCk7DQorICBGWF9CT09MIENycmVhdGUoQkNfVFlQRSB0eXBlKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIEJDX1RZUEUgR2V0VHlwZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGVycm9yQ29kZSk7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGVycm9yQ29kZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2hhckVuY29kaW5nKEJDX0NIQVJfRU5DT0RJTkcgZW5jb2RpbmcpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TW9kdWxlV2lkdGgoaW50MzJfdCBtb2R1bGVXaWR0aCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0SGVpZ2h0KGludDMyX3QgaGVpZ2h0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRXaWR0aChpbnQzMl90IHdpZHRoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgY2hlY2tzdW0pOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldENhbENoZWNrc3VtKGludDMyX3Qgc3RhdGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvbnQoQ0ZYX0ZvbnQqIHBGb250KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbik7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRFbmRDaGFyKEZYX0NIQVIgZW5kKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbik7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0JDX0NvZGVCYXNlKiBtX3BCQ0VuZ2luZTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9hcHBpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2FwcGltcC5jcHAKaW5kZXggMzNkMmZmZi4uZjU5MDMyYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2FwcGltcC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2FwcGltcC5jcHAKQEAgLTEwLDEwMSArMTAsODUgQEAKICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9hcHBpbXAuaCINCi1JRldMX0FwcCogSUZXTF9BcHA6OkNyZWF0ZShJRldMX0FkYXB0ZXJOYXRpdmUgKnBBZGFwdGVyKQ0KLXsNCi0gICAgcmV0dXJuIChJRldMX0FwcCopIEZYX05FVyBDRldMX0FwcEltcChwQWRhcHRlcik7DQorSUZXTF9BcHAqIElGV0xfQXBwOjpDcmVhdGUoSUZXTF9BZGFwdGVyTmF0aXZlKiBwQWRhcHRlcikgew0KKyAgcmV0dXJuIChJRldMX0FwcCopRlhfTkVXIENGV0xfQXBwSW1wKHBBZGFwdGVyKTsNCiB9DQotQ0ZXTF9BcHBJbXA6OkNGV0xfQXBwSW1wKElGV0xfQWRhcHRlck5hdGl2ZSAqcEFkYXB0ZXIpDQotICAgIDogbV9wV2lkZ2V0TWdyKE5VTEwpDQotICAgICwgbV9wVGhlbWVQcm92aWRlcihOVUxMKQ0KLXsNCi0gICAgaWYgKCFwQWRhcHRlcikgew0KLSAgICAgICAgcEFkYXB0ZXIgPSBGV0xfQ3JlYXRlRnVlbEFkYXB0ZXJOYXRpdmUoKTsNCi0gICAgICAgIG1fYkZ1ZWxBZGFwdGVyID0gVFJVRTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1fYkZ1ZWxBZGFwdGVyID0gRkFMU0U7DQotICAgIH0NCi0gICAgbV9wQWRhcHRlck5hdGl2ZSA9IHBBZGFwdGVyOw0KK0NGV0xfQXBwSW1wOjpDRldMX0FwcEltcChJRldMX0FkYXB0ZXJOYXRpdmUqIHBBZGFwdGVyKQ0KKyAgICA6IG1fcFdpZGdldE1ncihOVUxMKSwgbV9wVGhlbWVQcm92aWRlcihOVUxMKSB7DQorICBpZiAoIXBBZGFwdGVyKSB7DQorICAgIHBBZGFwdGVyID0gRldMX0NyZWF0ZUZ1ZWxBZGFwdGVyTmF0aXZlKCk7DQorICAgIG1fYkZ1ZWxBZGFwdGVyID0gVFJVRTsNCisgIH0gZWxzZSB7DQorICAgIG1fYkZ1ZWxBZGFwdGVyID0gRkFMU0U7DQorICB9DQorICBtX3BBZGFwdGVyTmF0aXZlID0gcEFkYXB0ZXI7DQogfQ0KLUNGV0xfQXBwSW1wOjp+Q0ZXTF9BcHBJbXAoKQ0KLXsNCi0gICAgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpEZWxldGVJbnN0YW5jZSgpOw0KLSAgICBpZiAobV9iRnVlbEFkYXB0ZXIpIHsNCi0gICAgICAgIEZXTF9SZWxlYXNlRnVlbEFkYXB0ZXJOYXRpdmUobV9wQWRhcHRlck5hdGl2ZSk7DQotICAgICAgICBtX3BBZGFwdGVyTmF0aXZlID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wV2lkZ2V0TWdyKSB7DQotICAgICAgICBkZWxldGUgbV9wV2lkZ2V0TWdyOw0KLSAgICAgICAgbV9wV2lkZ2V0TWdyID0gTlVMTDsNCi0gICAgfQ0KK0NGV0xfQXBwSW1wOjp+Q0ZXTF9BcHBJbXAoKSB7DQorICBDRldMX1Rvb2xUaXBDb250YWluZXI6OkRlbGV0ZUluc3RhbmNlKCk7DQorICBpZiAobV9iRnVlbEFkYXB0ZXIpIHsNCisgICAgRldMX1JlbGVhc2VGdWVsQWRhcHRlck5hdGl2ZShtX3BBZGFwdGVyTmF0aXZlKTsNCisgICAgbV9wQWRhcHRlck5hdGl2ZSA9IE5VTEw7DQorICB9DQorICBpZiAobV9wV2lkZ2V0TWdyKSB7DQorICAgIGRlbGV0ZSBtX3BXaWRnZXRNZ3I7DQorICAgIG1fcFdpZGdldE1nciA9IE5VTEw7DQorICB9DQogfQ0KLUZXTF9FUlIgQ0ZXTF9BcHBJbXA6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgaWYgKCFtX3BXaWRnZXRNZ3IpIHsNCi0gICAgICAgIG1fcFdpZGdldE1nciA9IEZYX05FVyBDRldMX1dpZGdldE1ncihtX3BBZGFwdGVyTmF0aXZlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0FwcEltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIGlmICghbV9wV2lkZ2V0TWdyKSB7DQorICAgIG1fcFdpZGdldE1nciA9IEZYX05FVyBDRldMX1dpZGdldE1ncihtX3BBZGFwdGVyTmF0aXZlKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX0FwcEltcDo6RmluYWxpemUoKQ0KLXsNCi0gICAgaWYgKG1fcFdpZGdldE1ncikgew0KLSAgICAgICAgZGVsZXRlIG1fcFdpZGdldE1ncjsNCi0gICAgICAgIG1fcFdpZGdldE1nciA9IE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9BcHBJbXA6OkZpbmFsaXplKCkgew0KKyAgaWYgKG1fcFdpZGdldE1ncikgew0KKyAgICBkZWxldGUgbV9wV2lkZ2V0TWdyOw0KKyAgICBtX3BXaWRnZXRNZ3IgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1JRldMX0FkYXB0ZXJOYXRpdmUqIENGV0xfQXBwSW1wOjpHZXRBZGFwdGVyTmF0aXZlKCkNCi17DQotICAgIHJldHVybiBtX3BBZGFwdGVyTmF0aXZlOw0KK0lGV0xfQWRhcHRlck5hdGl2ZSogQ0ZXTF9BcHBJbXA6OkdldEFkYXB0ZXJOYXRpdmUoKSB7DQorICByZXR1cm4gbV9wQWRhcHRlck5hdGl2ZTsNCiB9DQotSUZXTF9BZGFwdGVyV2lkZ2V0TWdyKiBGV0xfR2V0QWRhcHRlcldpZGdldE1ncigpDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpKS0+R2V0QWRhcHRlcldpZGdldE1ncigpOw0KK0lGV0xfQWRhcHRlcldpZGdldE1nciogRldMX0dldEFkYXB0ZXJXaWRnZXRNZ3IoKSB7DQorICByZXR1cm4gKChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpKS0+R2V0QWRhcHRlcldpZGdldE1ncigpOw0KIH0NCi1JRldMX1dpZGdldE1ncioJQ0ZXTF9BcHBJbXA6OkdldFdpZGdldE1ncigpDQotew0KLSAgICByZXR1cm4gKElGV0xfV2lkZ2V0TWdyKiltX3BXaWRnZXRNZ3I7DQorSUZXTF9XaWRnZXRNZ3IqIENGV0xfQXBwSW1wOjpHZXRXaWRnZXRNZ3IoKSB7DQorICByZXR1cm4gKElGV0xfV2lkZ2V0TWdyKiltX3BXaWRnZXRNZ3I7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9BcHBJbXA6OlNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWVQcm92aWRlcikNCi17DQotICAgIG1fcFRoZW1lUHJvdmlkZXIgPSBwVGhlbWVQcm92aWRlcjsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9BcHBJbXA6OlNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWVQcm92aWRlcikgew0KKyAgbV9wVGhlbWVQcm92aWRlciA9IHBUaGVtZVByb3ZpZGVyOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfQXBwSW1wOjpFeGl0KGludDMyX3QgaUV4aXRDb2RlICkNCi17DQotICAgIHdoaWxlIChtX3BOb3RlRHJpdmVyLT5Qb3BOb3RlTG9vcCgpKTsNCi0gICAgcmV0dXJuIG1fcFdpZGdldE1nci0+R2V0QWRhcHRlcldpZGdldE1ncigpLT5FeGl0KDApOw0KK0ZXTF9FUlIgQ0ZXTF9BcHBJbXA6OkV4aXQoaW50MzJfdCBpRXhpdENvZGUpIHsNCisgIHdoaWxlIChtX3BOb3RlRHJpdmVyLT5Qb3BOb3RlTG9vcCgpKQ0KKyAgICA7DQorICByZXR1cm4gbV9wV2lkZ2V0TWdyLT5HZXRBZGFwdGVyV2lkZ2V0TWdyKCktPkV4aXQoMCk7DQogfQ0KLUlGV0xfVGhlbWVQcm92aWRlcioJQ0ZXTF9BcHBJbXA6OkdldFRoZW1lUHJvdmlkZXIoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcFRoZW1lUHJvdmlkZXI7DQorSUZXTF9UaGVtZVByb3ZpZGVyKiBDRldMX0FwcEltcDo6R2V0VGhlbWVQcm92aWRlcigpIHsNCisgIHJldHVybiBtX3BUaGVtZVByb3ZpZGVyOw0KIH0NCi1JRldMX0FkYXB0ZXJOYXRpdmUqCUZXTF9HZXRBZGFwdGVyTmF0aXZlKCkNCi17DQotICAgIElGV0xfQXBwKiBwQXBwID0gRldMX0dldEFwcCgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBBcHAsIE5VTEwpOw0KLSAgICByZXR1cm4gcEFwcC0+R2V0QWRhcHRlck5hdGl2ZSgpOw0KK0lGV0xfQWRhcHRlck5hdGl2ZSogRldMX0dldEFkYXB0ZXJOYXRpdmUoKSB7DQorICBJRldMX0FwcCogcEFwcCA9IEZXTF9HZXRBcHAoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEFwcCwgTlVMTCk7DQorICByZXR1cm4gcEFwcC0+R2V0QWRhcHRlck5hdGl2ZSgpOw0KIH0NCi1JRldMX1RoZW1lUHJvdmlkZXIqCUZXTF9HZXRUaGVtZVByb3ZpZGVyKCkNCi17DQotICAgIHJldHVybiBOVUxMOw0KK0lGV0xfVGhlbWVQcm92aWRlciogRldMX0dldFRoZW1lUHJvdmlkZXIoKSB7DQorICByZXR1cm4gTlVMTDsNCiB9DQotc3RhdGljIElGV0xfQXBwICpfdGhlQXBwID0gTlVMTDsNCi1JRldMX0FwcCogRldMX0dldEFwcCgpDQotew0KLSAgICByZXR1cm4gX3RoZUFwcDsNCitzdGF0aWMgSUZXTF9BcHAqIF90aGVBcHAgPSBOVUxMOw0KK0lGV0xfQXBwKiBGV0xfR2V0QXBwKCkgew0KKyAgcmV0dXJuIF90aGVBcHA7DQogfQ0KLXZvaWQgRldMX1NldEFwcChJRldMX0FwcCAqcEFwcCkNCi17DQotICAgIF90aGVBcHAgPSBwQXBwOw0KK3ZvaWQgRldMX1NldEFwcChJRldMX0FwcCogcEFwcCkgew0KKyAgX3RoZUFwcCA9IHBBcHA7DQogfQ0KLUZXTF9FUlIgRldMX1NldEZ1bGxTY3JlZW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0JPT0wgYkZ1bGxTY3JlZW4pDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZXTF9FUlJfU3VjY2VlZGVkKTsNCi0gICAgSUZXTF9Ob3RlVGhyZWFkICpwTm90ZVRyZWFkID0gcFdpZGdldC0+R2V0T3duZXJUaHJlYWQoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTm90ZVRyZWFkLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQotICAgIENGV0xfTm90ZURyaXZlciAqcE5vdGVEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwTm90ZVRyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE5vdGVUcmVhZCwgRldMX0VSUl9TdWNjZWVkZWQpOw0KLSAgICBwTm90ZURyaXZlci0+Tm90aWZ5RnVsbFNjcmVlbk1vZGUocFdpZGdldCwgYkZ1bGxTY3JlZW4pOw0KLSAgICByZXR1cm4gRldMX0dldEFkYXB0ZXJXaWRnZXRNZ3IoKS0+U2V0RnVsbFNjcmVlbihwV2lkZ2V0LCBiRnVsbFNjcmVlbik7DQorRldMX0VSUiBGV0xfU2V0RnVsbFNjcmVlbihJRldMX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbikgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICBJRldMX05vdGVUaHJlYWQqIHBOb3RlVHJlYWQgPSBwV2lkZ2V0LT5HZXRPd25lclRocmVhZCgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTm90ZVRyZWFkLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICBDRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcE5vdGVUcmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTm90ZVRyZWFkLCBGV0xfRVJSX1N1Y2NlZWRlZCk7DQorICBwTm90ZURyaXZlci0+Tm90aWZ5RnVsbFNjcmVlbk1vZGUocFdpZGdldCwgYkZ1bGxTY3JlZW4pOw0KKyAgcmV0dXJuIEZXTF9HZXRBZGFwdGVyV2lkZ2V0TWdyKCktPlNldEZ1bGxTY3JlZW4ocFdpZGdldCwgYkZ1bGxTY3JlZW4pOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfY29udGVudGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfY29udGVudGltcC5jcHAKaW5kZXggOTNjOGMzYi4uOWE5ZjhiYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2NvbnRlbnRpbXAuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9jb250ZW50aW1wLmNwcApAQCAtMTEsMTIxICsxMSwxMDAgQEAKICNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfY29udGVudGltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCi1JRldMX0NvbnRlbnQqIElGV0xfQ29udGVudDo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBuZXcgSUZXTF9Db250ZW50Ow0KK0lGV0xfQ29udGVudCogSUZXTF9Db250ZW50OjpDcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IElGV0xfQ29udGVudDsNCiB9DQotRldMX0VSUiBJRldMX0NvbnRlbnQ6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0NvbnRlbnRJbXA7DQotICAgICgoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KLSAgICByZXR1cm4gKChDRldMX0NvbnRlbnRJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6OkluaXRpYWxpemUoKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQ29udGVudEltcDsNCisgICgoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSIElGV0xfQ29udGVudDo6SW5zZXJ0V2lkZ2V0KElGV0xfV2lkZ2V0ICpwQ2hpbGQsIGludDMyX3QgbkluZGV4ICkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29udGVudEltcCopbV9wRGF0YSktPkluc2VydFdpZGdldChwQ2hpbGQsIG5JbmRleCk7DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6Okluc2VydFdpZGdldChJRldMX1dpZGdldCogcENoaWxkLCBpbnQzMl90IG5JbmRleCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhKS0+SW5zZXJ0V2lkZ2V0KHBDaGlsZCwgbkluZGV4KTsNCiB9DQotRldMX0VSUiBJRldMX0NvbnRlbnQ6OlJlbW92ZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29udGVudEltcCopbV9wRGF0YSktPlJlbW92ZVdpZGdldChwV2lkZ2V0KTsNCitGV0xfRVJSIElGV0xfQ29udGVudDo6UmVtb3ZlV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gKChDRldMX0NvbnRlbnRJbXAqKW1fcERhdGEpLT5SZW1vdmVXaWRnZXQocFdpZGdldCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9Db250ZW50OjpSZW1vdmVBbGxXaWRnZXRzKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29udGVudEltcCopbV9wRGF0YSktPlJlbW92ZUFsbFdpZGdldHMoKTsNCitGV0xfRVJSIElGV0xfQ29udGVudDo6UmVtb3ZlQWxsV2lkZ2V0cygpIHsNCisgIHJldHVybiAoKENGV0xfQ29udGVudEltcCopbV9wRGF0YSktPlJlbW92ZUFsbFdpZGdldHMoKTsNCiB9DQotRldMX0VSUglJRldMX0NvbnRlbnQ6OkdldE1pblNpemUoRlhfRkxPQVQgJmZXaWR0aCwgRlhfRkxPQVQgJmZIZWlnaHQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbnRlbnRJbXAqKW1fcERhdGEpLT5HZXRNaW5TaXplKGZXaWR0aCwgZkhlaWdodCk7DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6OkdldE1pblNpemUoRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZIZWlnaHQpIHsNCisgIHJldHVybiAoKENGV0xfQ29udGVudEltcCopbV9wRGF0YSktPkdldE1pblNpemUoZldpZHRoLCBmSGVpZ2h0KTsNCiB9DQotRldMX0VSUglJRldMX0NvbnRlbnQ6OlNldE1pblNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhKS0+U2V0TWluU2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KK0ZXTF9FUlIgSUZXTF9Db250ZW50OjpTZXRNaW5TaXplKEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgZkhlaWdodCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhKS0+U2V0TWluU2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KIH0NCi1GV0xfRVJSCUlGV0xfQ29udGVudDo6R2V0TWF4U2l6ZShGWF9GTE9BVCAmZldpZHRoLCBGWF9GTE9BVCAmZkhlaWdodCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29udGVudEltcCopbV9wRGF0YSktPkdldE1heFNpemUoZldpZHRoLCBmSGVpZ2h0KTsNCitGV0xfRVJSIElGV0xfQ29udGVudDo6R2V0TWF4U2l6ZShGWF9GTE9BVCYgZldpZHRoLCBGWF9GTE9BVCYgZkhlaWdodCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhKS0+R2V0TWF4U2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KIH0NCi1GV0xfRVJSIElGV0xfQ29udGVudDo6U2V0TWF4U2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbnRlbnRJbXAqKW1fcERhdGEpLT5TZXRNYXhTaXplKGZXaWR0aCwgZkhlaWdodCk7DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6OlNldE1heFNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KSB7DQorICByZXR1cm4gKChDRldMX0NvbnRlbnRJbXAqKW1fcERhdGEpLT5TZXRNYXhTaXplKGZXaWR0aCwgZkhlaWdodCk7DQogfQ0KLUlGV0xfQ29udGVudDo6SUZXTF9Db250ZW50KCkNCi17DQorSUZXTF9Db250ZW50OjpJRldMX0NvbnRlbnQoKSB7DQorICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9Db250ZW50Ojp+SUZXTF9Db250ZW50KCkgew0KKyAgaWYgKG1fcERhdGEpIHsNCisgICAgZGVsZXRlIChDRldMX0NvbnRlbnRJbXAqKW1fcERhdGE7DQogICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgfQ0KIH0NCi1JRldMX0NvbnRlbnQ6On5JRldMX0NvbnRlbnQoKQ0KLXsNCi0gICAgaWYgKG1fcERhdGEpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9Db250ZW50SW1wKiltX3BEYXRhOw0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQotICAgIH0NCitDRldMX0NvbnRlbnRJbXA6OkNGV0xfQ29udGVudEltcCgpIHsNCisgIG1fZldpZHRoTWluID0gMDsNCisgIG1fZldpZHRoTWF4ID0gMTAwMDA7DQorICBtX2ZIZWlnaHRNaW4gPSAwOw0KKyAgbV9mSGVpZ2h0TWF4ID0gMTAwMDA7DQogfQ0KLUNGV0xfQ29udGVudEltcDo6Q0ZXTF9Db250ZW50SW1wKCkNCi17DQotICAgIG1fZldpZHRoTWluID0gMDsNCi0gICAgbV9mV2lkdGhNYXggPSAxMDAwMDsNCi0gICAgbV9mSGVpZ2h0TWluID0gMDsNCi0gICAgbV9mSGVpZ2h0TWF4ID0gMTAwMDA7DQorQ0ZXTF9Db250ZW50SW1wOjpDRldMX0NvbnRlbnRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMpIHsNCisgIG1fZldpZHRoTWluID0gMDsNCisgIG1fZldpZHRoTWF4ID0gMTAwMDA7DQorICBtX2ZIZWlnaHRNaW4gPSAwOw0KKyAgbV9mSGVpZ2h0TWF4ID0gMTAwMDA7DQogfQ0KLUNGV0xfQ29udGVudEltcDo6Q0ZXTF9Db250ZW50SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcykNCi0gICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzKQ0KLXsNCi0gICAgbV9mV2lkdGhNaW4gPSAwOw0KLSAgICBtX2ZXaWR0aE1heCA9IDEwMDAwOw0KLSAgICBtX2ZIZWlnaHRNaW4gPSAwOw0KLSAgICBtX2ZIZWlnaHRNYXggPSAxMDAwMDsNCi19DQotQ0ZXTF9Db250ZW50SW1wOjp+Q0ZXTF9Db250ZW50SW1wKCkNCi17DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Db250ZW50SW1wOjpJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBDaGlsZCwgaW50MzJfdCBuSW5kZXggKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQ2hpbGQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHBDaGlsZC0+U2V0UGFyZW50KG1fcEludGVyZmFjZSk7DQotICAgIGlmIChuSW5kZXggPT0gLTEpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICBDRldMX1dpZGdldE1nciAqcE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZ3IsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHBNZ3ItPlNldFdpZGdldEluZGV4KHBDaGlsZCwgbkluZGV4KTsNCitDRldMX0NvbnRlbnRJbXA6On5DRldMX0NvbnRlbnRJbXAoKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9Db250ZW50SW1wOjpJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBDaGlsZCwgaW50MzJfdCBuSW5kZXgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocENoaWxkLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcENoaWxkLT5TZXRQYXJlbnQobV9wSW50ZXJmYWNlKTsNCisgIGlmIChuSW5kZXggPT0gLTEpIHsNCiAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIHBNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHBNZ3ItPlNldFdpZGdldEluZGV4KHBDaGlsZCwgbkluZGV4KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX0NvbnRlbnRJbXA6OlJlbW92ZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcFdpZGdldC0+U2V0UGFyZW50KE5VTEwpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0NvbnRlbnRJbXA6OlJlbW92ZVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcFdpZGdldC0+U2V0UGFyZW50KE5VTEwpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfQ29udGVudEltcDo6UmVtb3ZlQWxsV2lkZ2V0cygpDQotew0KLSAgICBDRldMX1dpZGdldE1nciAqcE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZ3IsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHdoaWxlIChJRldMX1dpZGdldCAqIHdpZGdldCA9IHBNZ3ItPkdldFdpZGdldChtX3BJbnRlcmZhY2UsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKSkgew0KLSAgICAgICAgcE1nci0+U2V0UGFyZW50KE5VTEwsIHdpZGdldCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9Db250ZW50SW1wOjpSZW1vdmVBbGxXaWRnZXRzKCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIHBNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHdoaWxlIChJRldMX1dpZGdldCogd2lkZ2V0ID0NCisgICAgICAgICAgICAgcE1nci0+R2V0V2lkZ2V0KG1fcEludGVyZmFjZSwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQpKSB7DQorICAgIHBNZ3ItPlNldFBhcmVudChOVUxMLCB3aWRnZXQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSCUNGV0xfQ29udGVudEltcDo6R2V0TWluU2l6ZShGWF9GTE9BVCAmZldpZHRoLCBGWF9GTE9BVCAmZkhlaWdodCkNCi17DQotICAgIGZXaWR0aCA9IG1fZldpZHRoTWluOw0KLSAgICBmSGVpZ2h0ID0gbV9mSGVpZ2h0TWluOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0NvbnRlbnRJbXA6OkdldE1pblNpemUoRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZIZWlnaHQpIHsNCisgIGZXaWR0aCA9IG1fZldpZHRoTWluOw0KKyAgZkhlaWdodCA9IG1fZkhlaWdodE1pbjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUglDRldMX0NvbnRlbnRJbXA6OlNldE1pblNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KQ0KLXsNCi0gICAgbV9mV2lkdGhNaW4gPSBmV2lkdGg7DQotICAgIG1fZkhlaWdodE1pbiA9IGZIZWlnaHQ7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfQ29udGVudEltcDo6U2V0TWluU2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpIHsNCisgIG1fZldpZHRoTWluID0gZldpZHRoOw0KKyAgbV9mSGVpZ2h0TWluID0gZkhlaWdodDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUglDRldMX0NvbnRlbnRJbXA6OkdldE1heFNpemUoRlhfRkxPQVQgJmZXaWR0aCwgRlhfRkxPQVQgJmZIZWlnaHQpDQotew0KLSAgICBmV2lkdGggPSBtX2ZXaWR0aE1heDsNCi0gICAgZkhlaWdodCA9IG1fZkhlaWdodE1heDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9Db250ZW50SW1wOjpHZXRNYXhTaXplKEZYX0ZMT0FUJiBmV2lkdGgsIEZYX0ZMT0FUJiBmSGVpZ2h0KSB7DQorICBmV2lkdGggPSBtX2ZXaWR0aE1heDsNCisgIGZIZWlnaHQgPSBtX2ZIZWlnaHRNYXg7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9Db250ZW50SW1wOjpTZXRNYXhTaXplKEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgZkhlaWdodCkNCi17DQotICAgIG1fZldpZHRoTWF4ID0gZldpZHRoOw0KLSAgICBtX2ZIZWlnaHRNYXggPSBmSGVpZ2h0Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0NvbnRlbnRJbXA6OlNldE1heFNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KSB7DQorICBtX2ZXaWR0aE1heCA9IGZXaWR0aDsNCisgIG1fZkhlaWdodE1heCA9IGZIZWlnaHQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9mb3JtaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9mb3JtaW1wLmNwcAppbmRleCAzNjgzODU0Li5iMThjZGIxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfZm9ybWltcC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2Zvcm1pbXAuY3BwCkBAIC0xMywxNDIyICsxMywxNDMxIEBACiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfZm9ybWltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfYXBwaW1wLmgiDQotI2RlZmluZSBGV0xfU1lTQlROU0laRQkJMjENCi0jZGVmaW5lIEZXTF9TWVNCVE5NQVJHSU4JNQ0KLSNkZWZpbmUgRldMX1NZU0JUTlNQQU4JCTINCi0jZGVmaW5lIEZXTF9Db3JuZXJFbmxhcmdlCTEwDQotSUZXTF9Gb3JtKiBJRldMX0Zvcm06OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gbmV3IElGV0xfRm9ybTsNCisjZGVmaW5lIEZXTF9TWVNCVE5TSVpFIDIxDQorI2RlZmluZSBGV0xfU1lTQlROTUFSR0lOIDUNCisjZGVmaW5lIEZXTF9TWVNCVE5TUEFOIDINCisjZGVmaW5lIEZXTF9Db3JuZXJFbmxhcmdlIDEwDQorSUZXTF9Gb3JtKiBJRldMX0Zvcm06OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgSUZXTF9Gb3JtOw0KIH0NCi1GV0xfRVJSCUlGV0xfRm9ybTo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyICkNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9Gb3JtSW1wKHBPdXRlcik7DQotICAgICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KLSAgICByZXR1cm4gKChDRldMX0Zvcm1JbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorRldMX0VSUiBJRldMX0Zvcm06OkluaXRpYWxpemUoSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0Zvcm1JbXAocE91dGVyKTsNCisgICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSCUlGV0xfRm9ybTo6SW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0Zvcm1JbXAocHJvcGVydGllcywgcE91dGVyKTsNCi0gICAgKChDRldMX0Zvcm1JbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitGV0xfRVJSIElGV0xfRm9ybTo6SW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0Zvcm1JbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSCUlGV0xfRm9ybTo6SW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIENGWF9XaWRlU3RyaW5nICpjbGFzc25hbWUsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0Zvcm1JbXAocHJvcGVydGllcywgcE91dGVyKTsNCi0gICAgKChDRldMX0Zvcm1JbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+U2V0UHJpdmF0ZURhdGEodGhpcywgY2xhc3NuYW1lLCBOVUxMKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9Gb3JtOjpJbml0aWFsaXplKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogY2xhc3NuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9Gb3JtSW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+U2V0UHJpdmF0ZURhdGEodGhpcywgY2xhc3NuYW1lLCBOVUxMKTsNCisgIHJldHVybiAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCiB9DQotRldMX0ZPUk1TSVpFIElGV0xfRm9ybTo6R2V0Rm9ybVNpemUoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+R2V0Rm9ybVNpemUoKTsNCitGV0xfRk9STVNJWkUgSUZXTF9Gb3JtOjpHZXRGb3JtU2l6ZSgpIHsNCisgIHJldHVybiAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPkdldEZvcm1TaXplKCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9Gb3JtOjpTZXRGb3JtU2l6ZShGV0xfRk9STVNJWkUgZUZvcm1TaXplKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+U2V0Rm9ybVNpemUoZUZvcm1TaXplKTsNCitGV0xfRVJSIElGV0xfRm9ybTo6U2V0Rm9ybVNpemUoRldMX0ZPUk1TSVpFIGVGb3JtU2l6ZSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+U2V0Rm9ybVNpemUoZUZvcm1TaXplKTsNCiB9DQotSUZXTF9XaWRnZXQqIElGV0xfRm9ybTo6RG9Nb2RhbCgpDQotew0KLSAgICByZXR1cm4gKChDRldMX0Zvcm1JbXAqKW1fcERhdGEpLT5Eb01vZGFsKCk7DQorSUZXTF9XaWRnZXQqIElGV0xfRm9ybTo6RG9Nb2RhbCgpIHsNCisgIHJldHVybiAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPkRvTW9kYWwoKTsNCiB9DQotSUZXTF9XaWRnZXQqIElGV0xfRm9ybTo6RG9Nb2RhbChGWF9EV09SRCAmZHdDb21tYW5kSUQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0Zvcm1JbXAqKW1fcERhdGEpLT5Eb01vZGFsKGR3Q29tbWFuZElEKTsNCitJRldMX1dpZGdldCogSUZXTF9Gb3JtOjpEb01vZGFsKEZYX0RXT1JEJiBkd0NvbW1hbmRJRCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhKS0+RG9Nb2RhbChkd0NvbW1hbmRJRCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9Gb3JtOjpFbmREb01vZGFsKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPkVuZERvTW9kYWwoKTsNCitGV0xfRVJSIElGV0xfRm9ybTo6RW5kRG9Nb2RhbCgpIHsNCisgIHJldHVybiAoKENGV0xfRm9ybUltcCopbV9wRGF0YSktPkVuZERvTW9kYWwoKTsNCiB9DQotRldMX0VSUglJRldMX0Zvcm06OlNldEJvcmRlclJlZ2lvbihDRlhfUGF0aCAqcFBhdGgpDQotew0KLSAgICByZXR1cm4gKChDRldMX0Zvcm1JbXAqKW1fcERhdGEpLT5TZXRCb3JkZXJSZWdpb24ocFBhdGgpOw0KK0ZXTF9FUlIgSUZXTF9Gb3JtOjpTZXRCb3JkZXJSZWdpb24oQ0ZYX1BhdGgqIHBQYXRoKSB7DQorICByZXR1cm4gKChDRldMX0Zvcm1JbXAqKW1fcERhdGEpLT5TZXRCb3JkZXJSZWdpb24ocFBhdGgpOw0KIH0NCi1JRldMX0Zvcm06OklGV0xfRm9ybSgpDQotew0KK0lGV0xfRm9ybTo6SUZXTF9Gb3JtKCkgew0KKyAgbV9wRGF0YSA9IE5VTEw7DQorfQ0KK0lGV0xfRm9ybTo6fklGV0xfRm9ybSgpIHsNCisgIGlmIChtX3BEYXRhKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9Gb3JtSW1wKiltX3BEYXRhOw0KICAgICBtX3BEYXRhID0gTlVMTDsNCisgIH0NCiB9DQotSUZXTF9Gb3JtOjp+SUZXTF9Gb3JtKCkNCi17DQotICAgIGlmIChtX3BEYXRhKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfRm9ybUltcCopbV9wRGF0YTsNCi0gICAgICAgIG1fcERhdGEgPSBOVUxMOw0KLSAgICB9DQorQ0ZXTF9Gb3JtSW1wOjpDRldMX0Zvcm1JbXAoSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1BhbmVsSW1wKHBPdXRlciksDQorICAgICAgbV9wQ2xvc2VCb3goTlVMTCksDQorICAgICAgbV9wTWluQm94KE5VTEwpLA0KKyAgICAgIG1fcE1heEJveChOVUxMKSwNCisgICAgICBtX3BDYXB0aW9uQm94KE5VTEwpLA0KKyAgICAgIG1fcE5vdGVMb29wKE5VTEwpLA0KKyAgICAgIG1fcFN1YkZvY3VzKE5VTEwpLA0KKyAgICAgIG1fZkNYQm9yZGVyKDApLA0KKyAgICAgIG1fZkNZQm9yZGVyKDApLA0KKyAgICAgIG1faUNhcHR1cmVCdG4oLTEpLA0KKyAgICAgIG1faVN5c0JveCgwKSwNCisgICAgICBtX2VSZXNpemVUeXBlKEZPUk1fUkVTSVpFVFlQRV9Ob25lKSwNCisgICAgICBtX2JMQnV0dG9uRG93bihGQUxTRSksDQorICAgICAgbV9iTWF4aW1pemVkKEZBTFNFKSwNCisgICAgICBtX2JTZXRNYXhpbWl6ZShGQUxTRSksDQorICAgICAgbV9iQ3VzdG9taXplTGF5b3V0KEZBTFNFKSwNCisgICAgICBtX2VGb3JtU2l6ZShGV0xfRk9STVNJWkVfTWFudWFsKSwNCisgICAgICBtX2JEb01vZGFsRmxhZyhGQUxTRSksDQorICAgICAgbV9wQmlnSWNvbihOVUxMKSwNCisgICAgICBtX3BTbWFsbEljb24oTlVMTCksDQorICAgICAgbV9iTW91c2VJbihGQUxTRSkgew0KKyAgbV9ydFJlbGF0aXZlLlJlc2V0KCk7DQorICBtX3J0Q2FwdGlvbi5SZXNldCgpOw0KKyAgbV9ydFJlc3RvcmUuUmVzZXQoKTsNCisgIG1fcnRDYXB0aW9uVGV4dC5SZXNldCgpOw0KKyAgbV9ydEljb24uUmVzZXQoKTsNCisgIG1fSW5mb1N0YXJ0Lm1fcHRTdGFydC5SZXNldCgpOw0KKyAgbV9JbmZvU3RhcnQubV9zelN0YXJ0LlJlc2V0KCk7DQogfQ0KLUNGV0xfRm9ybUltcDo6Q0ZXTF9Gb3JtSW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLSAgICA6IENGV0xfUGFuZWxJbXAocE91dGVyKQ0KLSAgICAsIG1fcENsb3NlQm94KE5VTEwpDQotICAgICwgbV9wTWluQm94KE5VTEwpDQotICAgICwgbV9wTWF4Qm94KE5VTEwpDQotICAgICwgbV9wQ2FwdGlvbkJveChOVUxMKQ0KLSAgICAsIG1fcE5vdGVMb29wKE5VTEwpDQotICAgICwgbV9wU3ViRm9jdXMoTlVMTCkNCi0gICAgLCBtX2ZDWEJvcmRlcigwKQ0KLSAgICAsIG1fZkNZQm9yZGVyKDApDQotICAgICwgbV9pQ2FwdHVyZUJ0bigtMSkNCi0gICAgLCBtX2lTeXNCb3goMCkNCi0gICAgLCBtX2VSZXNpemVUeXBlKEZPUk1fUkVTSVpFVFlQRV9Ob25lKQ0KLSAgICAsIG1fYkxCdXR0b25Eb3duKEZBTFNFKQ0KLSAgICAsIG1fYk1heGltaXplZChGQUxTRSkNCi0gICAgLCBtX2JTZXRNYXhpbWl6ZShGQUxTRSkNCi0gICAgLCBtX2JDdXN0b21pemVMYXlvdXQoRkFMU0UpDQotICAgICwgbV9lRm9ybVNpemUoRldMX0ZPUk1TSVpFX01hbnVhbCkNCi0gICAgLCBtX2JEb01vZGFsRmxhZyhGQUxTRSkNCi0gICAgLCBtX3BCaWdJY29uKE5VTEwpDQotICAgICwgbV9wU21hbGxJY29uKE5VTEwpDQotICAgICwgbV9iTW91c2VJbihGQUxTRSkNCi17DQotICAgIG1fcnRSZWxhdGl2ZS5SZXNldCgpOw0KLSAgICBtX3J0Q2FwdGlvbi5SZXNldCgpOw0KLSAgICBtX3J0UmVzdG9yZS5SZXNldCgpOw0KLSAgICBtX3J0Q2FwdGlvblRleHQuUmVzZXQoKTsNCi0gICAgbV9ydEljb24uUmVzZXQoKTsNCi0gICAgbV9JbmZvU3RhcnQubV9wdFN0YXJ0LlJlc2V0KCk7DQotICAgIG1fSW5mb1N0YXJ0Lm1fc3pTdGFydC5SZXNldCgpOw0KK0NGV0xfRm9ybUltcDo6Q0ZXTF9Gb3JtSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfUGFuZWxJbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX3BDbG9zZUJveChOVUxMKSwNCisgICAgICBtX3BNaW5Cb3goTlVMTCksDQorICAgICAgbV9wTWF4Qm94KE5VTEwpLA0KKyAgICAgIG1fcENhcHRpb25Cb3goTlVMTCksDQorICAgICAgbV9wTm90ZUxvb3AoTlVMTCksDQorICAgICAgbV9wU3ViRm9jdXMoTlVMTCksDQorICAgICAgbV9mQ1hCb3JkZXIoMCksDQorICAgICAgbV9mQ1lCb3JkZXIoMCksDQorICAgICAgbV9pQ2FwdHVyZUJ0bigtMSksDQorICAgICAgbV9pU3lzQm94KDApLA0KKyAgICAgIG1fZVJlc2l6ZVR5cGUoRk9STV9SRVNJWkVUWVBFX05vbmUpLA0KKyAgICAgIG1fYkxCdXR0b25Eb3duKEZBTFNFKSwNCisgICAgICBtX2JNYXhpbWl6ZWQoRkFMU0UpLA0KKyAgICAgIG1fYlNldE1heGltaXplKEZBTFNFKSwNCisgICAgICBtX2JDdXN0b21pemVMYXlvdXQoRkFMU0UpLA0KKyAgICAgIG1fZUZvcm1TaXplKEZXTF9GT1JNU0laRV9NYW51YWwpLA0KKyAgICAgIG1fYkRvTW9kYWxGbGFnKEZBTFNFKSwNCisgICAgICBtX3BCaWdJY29uKE5VTEwpLA0KKyAgICAgIG1fcFNtYWxsSWNvbihOVUxMKSwNCisgICAgICBtX2JNb3VzZUluKEZBTFNFKSB7DQorICBtX3J0UmVsYXRpdmUuUmVzZXQoKTsNCisgIG1fcnRDYXB0aW9uLlJlc2V0KCk7DQorICBtX3J0UmVzdG9yZS5SZXNldCgpOw0KKyAgbV9ydENhcHRpb25UZXh0LlJlc2V0KCk7DQorICBtX3J0SWNvbi5SZXNldCgpOw0KKyAgbV9JbmZvU3RhcnQubV9wdFN0YXJ0LlJlc2V0KCk7DQorICBtX0luZm9TdGFydC5tX3N6U3RhcnQuUmVzZXQoKTsNCiB9DQotQ0ZXTF9Gb3JtSW1wOjpDRldMX0Zvcm1JbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCi0gICAgOiBDRldMX1BhbmVsSW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCi0gICAgLCBtX3BDbG9zZUJveChOVUxMKQ0KLSAgICAsIG1fcE1pbkJveChOVUxMKQ0KLSAgICAsIG1fcE1heEJveChOVUxMKQ0KLSAgICAsIG1fcENhcHRpb25Cb3goTlVMTCkNCi0gICAgLCBtX3BOb3RlTG9vcChOVUxMKQ0KLSAgICAsIG1fcFN1YkZvY3VzKE5VTEwpDQotICAgICwgbV9mQ1hCb3JkZXIoMCkNCi0gICAgLCBtX2ZDWUJvcmRlcigwKQ0KLSAgICAsIG1faUNhcHR1cmVCdG4oLTEpDQotICAgICwgbV9pU3lzQm94KDApDQotICAgICwgbV9lUmVzaXplVHlwZShGT1JNX1JFU0laRVRZUEVfTm9uZSkNCi0gICAgLCBtX2JMQnV0dG9uRG93bihGQUxTRSkNCi0gICAgLCBtX2JNYXhpbWl6ZWQoRkFMU0UpDQotICAgICwgbV9iU2V0TWF4aW1pemUoRkFMU0UpDQotICAgICwgbV9iQ3VzdG9taXplTGF5b3V0KEZBTFNFKQ0KLSAgICAsIG1fZUZvcm1TaXplKEZXTF9GT1JNU0laRV9NYW51YWwpDQotICAgICwgbV9iRG9Nb2RhbEZsYWcoRkFMU0UpDQotICAgICwgbV9wQmlnSWNvbihOVUxMKQ0KLSAgICAsIG1fcFNtYWxsSWNvbihOVUxMKQ0KLSAgICAsIG1fYk1vdXNlSW4oRkFMU0UpDQotew0KLSAgICBtX3J0UmVsYXRpdmUuUmVzZXQoKTsNCi0gICAgbV9ydENhcHRpb24uUmVzZXQoKTsNCi0gICAgbV9ydFJlc3RvcmUuUmVzZXQoKTsNCi0gICAgbV9ydENhcHRpb25UZXh0LlJlc2V0KCk7DQotICAgIG1fcnRJY29uLlJlc2V0KCk7DQotICAgIG1fSW5mb1N0YXJ0Lm1fcHRTdGFydC5SZXNldCgpOw0KLSAgICBtX0luZm9TdGFydC5tX3N6U3RhcnQuUmVzZXQoKTsNCi19DQotQ0ZXTF9Gb3JtSW1wOjp+Q0ZXTF9Gb3JtSW1wKCkNCi17DQotICAgIFJlbW92ZVN5c0J1dHRvbnMoKTsNCi0gICAgaWYgKG1fcE5vdGVMb29wKSB7DQotICAgICAgICBkZWxldGUgbV9wTm90ZUxvb3A7DQotICAgICAgICBtX3BOb3RlTG9vcCA9IE5VTEw7DQotICAgIH0NCi19DQotRldMX0VSUiBDRldMX0Zvcm1JbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCi17DQotICAgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfRm9ybTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9EV09SRCBDRldMX0Zvcm1JbXA6OkdldENsYXNzSUQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfRm9ybTsNCi19DQotRlhfQk9PTAlDRldMX0Zvcm1JbXA6OklzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgaWYgKHdzQ2xhc3MgPT0gQ0ZYX1dpZGVTdHJpbmdDKEZXTF9DTEFTU19Gb3JtKSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfUGFuZWxJbXA6OklzSW5zdGFuY2Uod3NDbGFzcyk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpJbml0aWFsaXplKCkNCi17DQotICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIFJlZ2lzdGVyRm9ybSgpOw0KLSAgICBSZWdpc3RlckV2ZW50VGFyZ2V0KCk7DQotICAgIG1fcERlbGVnYXRlID0gKElGV0xfV2lkZ2V0RGVsZWdhdGUqKSBGWF9ORVcgQ0ZXTF9Gb3JtRGVsZWdhdGUodGhpcyk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0Zvcm1JbXA6OkZpbmFsaXplKCkNCi17DQotICAgIGlmICggbV9wRGVsZWdhdGUpIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9Gb3JtRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KLSAgICAgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KLSAgICB9DQotICAgIFVucmVnaXN0ZXJFdmVudFRhcmdldCgpOw0KLSAgICBVblJlZ2lzdGVyRm9ybSgpOw0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgKQ0KLXsNCi0gICAgaWYgKGJBdXRvU2l6ZSkgew0KLSAgICAgICAgcmVjdC5SZXNldCgpOw0KLSAgICAgICAgRlhfRkxPQVQgZkNhcEhlaWdodCA9IEdldENhcHRpb25IZWlnaHQoKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZDWEJvcmRlciA9IEdldEJvcmRlclNpemUoVFJVRSk7DQotICAgICAgICBGWF9GTE9BVCBmQ1lCb3JkZXIgPSBHZXRCb3JkZXJTaXplKEZBTFNFKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZFZGdlID0gR2V0RWRnZVdpZHRoKCk7DQotICAgICAgICBpZiAobV9wQ29udGVudCkgew0KLSAgICAgICAgICAgIG1fcENvbnRlbnQtPkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQotICAgICAgICB9DQotICAgICAgICByZWN0LmhlaWdodCArPSBmQ2FwSGVpZ2h0ICsgZkNZQm9yZGVyICsgZkVkZ2UgKyBmRWRnZTsNCi0gICAgICAgIHJlY3Qud2lkdGggKz0gZkNYQm9yZGVyICsgZkNYQm9yZGVyICsgZkVkZ2UgKyBmRWRnZTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUglDRldMX0Zvcm1JbXA6OkdldENsaWVudFJlY3QoQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0NhcHRpb24pID09IDApIHsNCi0gICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICAgICAgcmVjdC5PZmZzZXQoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQotICAgIHJlY3QgPSBtX3J0UmVsYXRpdmU7DQotICAgIENGV0xfV2lkZ2V0TWdyICpwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldE1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyICogYWRhcHRlcldpZGdldE1nciA9IHBXaWRnZXRNZ3ItPkdldEFkYXB0ZXJXaWRnZXRNZ3IoKTsNCi0gICAgRlhfRkxPQVQgbCwgdCwgciwgYjsNCi0gICAgbCA9IHQgPSByID0gYiA9IDA7DQotICAgIGFkYXB0ZXJXaWRnZXRNZ3ItPkdldFN5c3RlbUJvcmRlcihsLCB0LCByLCBiKTsNCi0gICAgcmVjdC5EZWZsYXRlKGwsIHQsIHIsIGIpOw0KLSAgICByZWN0LmxlZnQgPSByZWN0LnRvcCA9IDA7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0jZWxzZQ0KLSAgICBGWF9GTE9BVCB4ID0gMDsNCi0gICAgRlhfRkxPQVQgeSA9IDA7DQotICAgIEZYX0ZMT0FUIHQgPSAwOw0KLSAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgIGlmIChwVGhlbWUpIHsNCi0gICAgICAgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7DQotICAgICAgICBwYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgIEZYX0ZMT0FUICogdmFsdWUgPSBOVUxMOw0KLSAgICAgICAgdmFsdWUgPSAoRlhfRkxPQVQgKikgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0NYQm9yZGVyKTsNCi0gICAgICAgIHggPSAqdmFsdWU7DQotICAgICAgICB2YWx1ZSA9IChGWF9GTE9BVCAqKSBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXIpOw0KLSAgICAgICAgeSA9ICp2YWx1ZTsNCi0gICAgICAgIHZhbHVlID0gKEZYX0ZMT0FUKilwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZQ2FwdGlvbik7DQotICAgICAgICB0ID0gKnZhbHVlOw0KLSAgICB9DQotICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICByZWN0Lk9mZnNldCgtcmVjdC5sZWZ0LCAtcmVjdC50b3ApOw0KLSAgICByZWN0LkRlZmxhdGUoeCwgdCwgeCwgeSk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0jZW5kaWYNCi19DQotRldMX0VSUiBDRldMX0Zvcm1JbXA6OlVwZGF0ZSgpDQotew0KLSAgICBpZiAobV9pTG9jayA+IDApIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCi0gICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KLSAgICB9DQotI2lmZGVmIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXINCi0jZWxzZQ0KLSAgICBTZXRUaGVtZURhdGEoKTsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSWNvbikgew0KLSAgICAgICAgVXBkYXRlSWNvbigpOw0KLSAgICB9DQotI2VuZGlmDQotICAgIFVwZGF0ZUNhcHRpb24oKTsNCi0gICAgTGF5b3V0KCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfRFdPUkQgQ0ZXTF9Gb3JtSW1wOjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCi0gICAgaWYgKG1fcENsb3NlQm94ICYmIG1fcENsb3NlQm94LT5tX3J0QnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbG9zZUJveDsNCi0gICAgfQ0KLSAgICBpZiAobV9wTWF4Qm94ICYmIG1fcE1heEJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfTWF4Qm94Ow0KLSAgICB9DQotICAgIGlmIChtX3BNaW5Cb3ggJiYgbV9wTWluQm94LT5tX3J0QnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9NaW5Cb3g7DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGIHJ0Q2FwOw0KLSAgICBydENhcC5TZXQobV9ydENhcHRpb24ubGVmdCArIG1fZkNZQm9yZGVyLA0KLSAgICAgICAgICAgICAgbV9ydENhcHRpb24udG9wICsgbV9mQ1hCb3JkZXIsDQotICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi53aWR0aCAtIEZXTF9TWVNCVE5TSVpFICogbV9pU3lzQm94IC0gMiAqIG1fZkNZQm9yZGVyLA0KLSAgICAgICAgICAgICAgbV9ydENhcHRpb24uaGVpZ2h0IC0gbV9mQ1hCb3JkZXIpOw0KLSAgICBpZiAocnRDYXAuQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1RpdGxlYmFyOw0KLSAgICB9DQotICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Cb3JkZXIpICYmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0ZSTV9SZXNpemUpKSB7DQotICAgICAgICBGWF9GTE9BVCBmV2lkdGggPSBtX3J0UmVsYXRpdmUud2lkdGggLSAyICogKG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UpOw0KLSAgICAgICAgRlhfRkxPQVQgZkhlaWdodCA9IG1fcnRSZWxhdGl2ZS5oZWlnaHQgLSAyICogKG1fZkNYQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UpOw0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0Ow0KLSAgICAgICAgcnQuU2V0KDAsIG1fZkNYQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIG1fZkNZQm9yZGVyLCBmSGVpZ2h0KTsNCi0gICAgICAgIGlmIChydC5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0xlZnQ7DQotICAgICAgICB9DQotICAgICAgICBydC5TZXQobV9ydFJlbGF0aXZlLndpZHRoIC0gbV9mQ1lCb3JkZXIsIG1fZkNYQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIG1fZkNZQm9yZGVyLCBmSGVpZ2h0KTsNCi0gICAgICAgIGlmIChydC5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1JpZ2h0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcnQuU2V0KG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIDAsIGZXaWR0aCwgbV9mQ1hCb3JkZXIpOw0KLSAgICAgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVG9wOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcnQuU2V0KG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIG1fcnRSZWxhdGl2ZS5oZWlnaHQgLSBtX2ZDWEJvcmRlciwgZldpZHRoLCBtX2ZDWEJvcmRlcik7DQotICAgICAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Cb3R0b207DQotICAgICAgICB9DQotICAgICAgICBydC5TZXQoMCwgMCwgbV9mQ1lCb3JkZXIgKyBGV0xfQ29ybmVyRW5sYXJnZSwgbV9mQ1hCb3JkZXIgKyBGV0xfQ29ybmVyRW5sYXJnZSk7DQotICAgICAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9MZWZ0VG9wOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcnQuU2V0KDAsIG1fcnRSZWxhdGl2ZS5oZWlnaHQgLSBtX2ZDWEJvcmRlciAtIEZXTF9Db3JuZXJFbmxhcmdlLA0KLSAgICAgICAgICAgICAgIG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIG1fZkNYQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UpOw0KLSAgICAgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfTGVmdEJvdHRvbTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJ0LlNldChtX3J0UmVsYXRpdmUud2lkdGggLSBtX2ZDWUJvcmRlciAtIEZXTF9Db3JuZXJFbmxhcmdlLCAwLA0KLSAgICAgICAgICAgICAgIG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIG1fZkNYQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UpOw0KLSAgICAgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfUmlnaHRUb3A7DQotICAgICAgICB9DQotICAgICAgICBydC5TZXQobV9ydFJlbGF0aXZlLndpZHRoIC0gbV9mQ1lCb3JkZXIgLSBGV0xfQ29ybmVyRW5sYXJnZSwNCi0gICAgICAgICAgICAgICBtX3J0UmVsYXRpdmUuaGVpZ2h0IC0gbV9mQ1hCb3JkZXIgLSBGV0xfQ29ybmVyRW5sYXJnZSwNCi0gICAgICAgICAgICAgICBtX2ZDWUJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlLA0KLSAgICAgICAgICAgICAgIG1fZkNYQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UpOw0KLSAgICAgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfUmlnaHRCb3R0b207DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCi19DQotRldMX0VSUiBDRldMX0Zvcm1JbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KLSAgICBGWF9CT09MIGJJbmFjdGl2ZSA9ICFJc0FjdGl2ZSgpOw0KLSAgICBpbnQzMl90IGlTdGF0ZSA9IGJJbmFjdGl2ZSA/IEZXTF9QQVJUU1RBVEVfRlJNX0luYWN0aXZlIDogRldMX1BBUlRTVEFURV9GUk1fTm9ybWFsOw0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRlJNX05vRHJhd0NsaWVudCkgPT0gMCkgew0KLSAgICAgICAgRHJhd0JhY2tncm91bmQocEdyYXBoaWNzLCBwVGhlbWUpOw0KLSAgICB9DQotI2lmZGVmIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXINCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLSNlbmRpZg0KLSAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCi0gICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwYXJhbS5tX2R3U3RhdGVzID0gaVN0YXRlOw0KLSAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0UmVsYXRpdmU7DQotICAgIGlmKHBNYXRyaXgpIHsNCi0gICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQm9yZGVyKSB7DQotICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0JvcmRlcjsNCi0gICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCi0gICAgfQ0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfV0dUU1RZTEVfRWRnZU1hc2spICE9IEZXTF9XR1RTVFlMRV9FZGdlTm9uZSkgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0RWRnZTsNCi0gICAgICAgIEdldEVkZ2VSZWN0KHJ0RWRnZSk7DQotICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0VkZ2U7DQotICAgICAgICBwYXJhbS5tX3J0UGFydCA9IHJ0RWRnZTsNCi0gICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBpU3RhdGU7DQotICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQ2FwdGlvbikgew0KLSAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9DYXB0aW9uOw0KLSAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IGlTdGF0ZTsNCi0gICAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydENhcHRpb247DQotICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgICAgICBEcmF3Q2FwdGlvblRleHQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTmFycm93Q2FwdGlvbikgew0KLSAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9OYXJyb3dDYXB0aW9uOw0KLSAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IGlTdGF0ZTsNCi0gICAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydENhcHRpb247DQotICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgICAgICBEcmF3Q2FwdGlvblRleHQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0ljb24pIHsNCi0gICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fSWNvbjsNCi0gICAgICAgIGlmIChIYXNJY29uKCkpIHsNCi0gICAgICAgICAgICBEcmF3SWNvbkltYWdlKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQotICAgIHsNCi0gICAgICAgIGlmIChtX3BDbG9zZUJveCkgew0KLSAgICAgICAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fQ2xvc2VCb3g7DQotICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcENsb3NlQm94LT5HZXRQYXJ0U3RhdGUoKTsNCi0gICAgICAgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZCkgew0KLSAgICAgICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9GUk1fRGlzYWJsZWQ7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChGV0xfUEFSVFNUQVRFX0ZSTV9Ob3JtYWwgPT0gcGFyYW0ubV9kd1N0YXRlcyAmJiBtX2JNb3VzZUluKSB7DQotICAgICAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0ZSTV9Ib3ZlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3BDbG9zZUJveC0+bV9ydEJ0bjsNCi0gICAgICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wTWF4Qm94KSB7DQotICAgICAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveDsNCi0gICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gIG1fcE1heEJveC0+R2V0UGFydFN0YXRlKCk7DQotICAgICAgICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQpIHsNCi0gICAgICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRlJNX0Rpc2FibGVkOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRldMX1BBUlRTVEFURV9GUk1fTm9ybWFsID09IHBhcmFtLm1fZHdTdGF0ZXMgJiYgbV9iTW91c2VJbikgew0KLSAgICAgICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9GUk1fSG92ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9wTWF4Qm94LT5tX3J0QnRuOw0KLSAgICAgICAgICAgIHBhcmFtLm1fZHdEYXRhID0gbV9iTWF4aW1pemVkOw0KLSAgICAgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX3BNaW5Cb3gpIHsNCi0gICAgICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX01pbmltaXplQm94Ow0KLSAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BNaW5Cb3gtPkdldFBhcnRTdGF0ZSgpOw0KLSAgICAgICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkKSB7DQotICAgICAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0ZSTV9EaXNhYmxlZDsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKEZXTF9QQVJUU1RBVEVfRlJNX05vcm1hbCA9PSBwYXJhbS5tX2R3U3RhdGVzICYmIG1fYk1vdXNlSW4pIHsNCi0gICAgICAgICAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRlJNX0hvdmVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcE1pbkJveC0+bV9ydEJ0bjsNCi0gICAgICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgICAgICB9DQotICAgICAgICBtX2JNb3VzZUluID0gRkFMU0U7DQotICAgIH0NCi0jZWxzZQ0KLSAgICB7DQotICAgICAgICBpZiAobV9wQ2xvc2VCb3gpIHsNCi0gICAgICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0Nsb3NlQm94Ow0KLSAgICAgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BDbG9zZUJveC0+R2V0UGFydFN0YXRlKCk7DQotICAgICAgICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3BDbG9zZUJveC0+bV9ydEJ0bjsNCi0gICAgICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wTWF4Qm94KSB7DQotICAgICAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveDsNCi0gICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gbV9wTWF4Qm94LT5HZXRQYXJ0U3RhdGUoKTsNCi0gICAgICAgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcE1heEJveC0+bV9ydEJ0bjsNCi0gICAgICAgICAgICBwYXJhbS5tX2R3RGF0YSA9IG1fYk1heGltaXplZDsNCi0gICAgICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wTWluQm94KSB7DQotICAgICAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9NaW5pbWl6ZUJveDsNCi0gICAgICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gbV9wTWluQm94LT5HZXRQYXJ0U3RhdGUoKTsNCi0gICAgICAgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcE1pbkJveC0+bV9ydEJ0bjsNCi0gICAgICAgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQotICAgICAgICB9DQotICAgIH0NCi0jZW5kaWYNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRk9STVNJWkUgQ0ZXTF9Gb3JtSW1wOjpHZXRGb3JtU2l6ZSgpDQotew0KLSAgICByZXR1cm4gbV9lRm9ybVNpemU7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpTZXRGb3JtU2l6ZShGV0xfRk9STVNJWkUgZUZvcm1TaXplKQ0KLXsNCi0gICAgbV9lRm9ybVNpemUgPSBlRm9ybVNpemU7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotSUZXTF9XaWRnZXQqIENGV0xfRm9ybUltcDo6RG9Nb2RhbCgpDQotew0KLSAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBUaHJlYWQsIE5VTEwpOw0KLSAgICBJRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocERyaXZlciwgTlVMTCk7DQotICAgIG1fcE5vdGVMb29wID0gRlhfTkVXIENGV0xfTm90ZUxvb3AodGhpcyk7DQotICAgIHBEcml2ZXItPlB1c2hOb3RlTG9vcCgoSUZXTF9Ob3RlTG9vcCopbV9wTm90ZUxvb3ApOw0KLSAgICBtX2JEb01vZGFsRmxhZyA9IFRSVUU7DQotICAgIFNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBGQUxTRSk7DQotICAgIHBEcml2ZXItPlJ1bigpOw0KLSNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQotI2Vsc2UNCi0gICAgcERyaXZlci0+UG9wTm90ZUxvb3AoKTsNCi0jZW5kaWYNCitDRldMX0Zvcm1JbXA6On5DRldMX0Zvcm1JbXAoKSB7DQorICBSZW1vdmVTeXNCdXR0b25zKCk7DQorICBpZiAobV9wTm90ZUxvb3ApIHsNCiAgICAgZGVsZXRlIG1fcE5vdGVMb29wOw0KICAgICBtX3BOb3RlTG9vcCA9IE5VTEw7DQotICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KIH0NCi1JRldMX1dpZGdldCogQ0ZXTF9Gb3JtSW1wOjpEb01vZGFsKEZYX0RXT1JEICZkd0NvbW1hbmRJRCkNCi17DQotICAgIHJldHVybiBEb01vZGFsKCk7DQorRldMX0VSUiBDRldMX0Zvcm1JbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19Gb3JtOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSCUNGV0xfRm9ybUltcDo6RW5kRG9Nb2RhbCgpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcE5vdGVMb29wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBtX2JEb01vZGFsRmxhZyA9IEZBTFNFOw0KLSNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQotICAgIG1fcE5vdGVMb29wLT5FbmRNb2RhbExvb3AoKTsNCi0gICAgSUZXTF9Ob3RlVGhyZWFkICpwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwVGhyZWFkLCBOVUxMKTsNCi0gICAgQ0ZXTF9Ob3RlRHJpdmVyICpwRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBEcml2ZXIsIE5VTEwpOw0KLSAgICBwRHJpdmVyLT5Qb3BOb3RlTG9vcCgpOw0KLSAgICBTZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0jZWxzZQ0KLSAgICBTZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQotICAgIHJldHVybiBtX3BOb3RlTG9vcC0+RW5kTW9kYWxMb29wKCk7DQotI2VuZGlmDQorRlhfRFdPUkQgQ0ZXTF9Gb3JtSW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfRm9ybTsNCiB9DQotRldMX0VSUglDRldMX0Zvcm1JbXA6OlNldEJvcmRlclJlZ2lvbihDRlhfUGF0aCAqcFBhdGgpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRlhfQk9PTCBDRldMX0Zvcm1JbXA6OklzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdCB7DQorICBpZiAod3NDbGFzcyA9PSBDRlhfV2lkZVN0cmluZ0MoRldMX0NMQVNTX0Zvcm0pKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfUGFuZWxJbXA6OklzSW5zdGFuY2Uod3NDbGFzcyk7DQogfQ0KLXZvaWQgQ0ZXTF9Gb3JtSW1wOjpEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUpDQotew0KLSAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCi0gICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0JhY2tncm91bmQ7DQotICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRSZWxhdGl2ZTsNCi0gICAgcGFyYW0ubV9ydFBhcnQuRGVmbGF0ZShtX2ZDWUJvcmRlciwgbV9ydENhcHRpb24uaGVpZ2h0LCBtX2ZDWUJvcmRlciwgbV9mQ1hCb3JkZXIpOw0KLSAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorRldMX0VSUiBDRldMX0Zvcm1JbXA6OkluaXRpYWxpemUoKSB7DQorICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIFJlZ2lzdGVyRm9ybSgpOw0KKyAgUmVnaXN0ZXJFdmVudFRhcmdldCgpOw0KKyAgbV9wRGVsZWdhdGUgPSAoSUZXTF9XaWRnZXREZWxlZ2F0ZSopRlhfTkVXIENGV0xfRm9ybURlbGVnYXRlKHRoaXMpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRldMX1dpZGdldEltcCogQ0ZXTF9Gb3JtSW1wOjpHZXRTdWJGb2N1cygpDQotew0KLSAgICByZXR1cm4gbV9wU3ViRm9jdXM7DQorRldMX0VSUiBDRldMX0Zvcm1JbXA6OkZpbmFsaXplKCkgew0KKyAgaWYgKG1fcERlbGVnYXRlKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9Gb3JtRGVsZWdhdGUqKW1fcERlbGVnYXRlOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQorICB9DQorICBVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoKTsNCisgIFVuUmVnaXN0ZXJGb3JtKCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQogfQ0KLXZvaWQgQ0ZXTF9Gb3JtSW1wOjpTZXRTdWJGb2N1cyhDRldMX1dpZGdldEltcCAqcFdpZGdldCkNCi17DQotICAgIG1fcFN1YkZvY3VzID0gcFdpZGdldDsNCi19DQotQ0ZYX01hcEFjY2VsZXJhdG9ycyYgQ0ZXTF9Gb3JtSW1wOjpHZXRBY2NlbGVyYXRvcigpDQotew0KLSAgICByZXR1cm4gbV9tYXBBY2NlbGVyYXRvcnM7DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtSW1wOjpTZXRBY2NlbGVyYXRvcihDRlhfTWFwQWNjZWxlcmF0b3JzICpwQWNjZWxlcmF0b3JzKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwQWNjZWxlcmF0b3JzKTsNCi0gICAgbV9tYXBBY2NlbGVyYXRvcnMuUmVtb3ZlQWxsKCk7DQotICAgIEZYX0RXT1JEIHZyS2V5LCByVmFsdWU7DQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBBY2NlbGVyYXRvcnMtPkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBvcykgew0KLSAgICAgICAgcEFjY2VsZXJhdG9ycy0+R2V0TmV4dEFzc29jKHBvcywgdnJLZXksIHJWYWx1ZSk7DQotICAgICAgICBtX21hcEFjY2VsZXJhdG9ycy5TZXRBdCh2cktleSwgclZhbHVlKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfRm9ybUltcDo6U2hvd0NoaWxkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwUGFyZW50KQ0KLXsNCi0gICAgSUZXTF9BcHAgKnBBcHAgPSBGV0xfR2V0QXBwKCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEFwcCk7DQotICAgIENGV0xfV2lkZ2V0TWdyICpwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilwQXBwLT5HZXRXaWRnZXRNZ3IoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwV2lkZ2V0TWdyKTsNCi0gICAgSUZXTF9XaWRnZXQgKnBDaGlsZCA9IHBXaWRnZXRNZ3ItPkdldFdpZGdldChwUGFyZW50LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQotICAgIHdoaWxlIChwQ2hpbGQpIHsNCi0gICAgICAgIHBXaWRnZXRNZ3ItPlNob3dXaWRnZXRfTmF0aXZlKHBDaGlsZCk7DQotICAgICAgICBTaG93Q2hpbGRXaWRnZXQocENoaWxkKTsNCi0gICAgICAgIHBDaGlsZCA9IHBXaWRnZXRNZ3ItPkdldFdpZGdldChwQ2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0Zvcm1JbXA6OlJlbW92ZVN5c0J1dHRvbnMoKQ0KLXsNCi0gICAgbV9ydENhcHRpb24uUmVzZXQoKTsNCi0gICAgaWYgKG1fcENsb3NlQm94KSB7DQotICAgICAgICBkZWxldGUgbV9wQ2xvc2VCb3g7DQotICAgICAgICBtX3BDbG9zZUJveCA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKG1fcE1pbkJveCkgew0KLSAgICAgICAgZGVsZXRlIG1fcE1pbkJveDsNCi0gICAgICAgIG1fcE1pbkJveCA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKG1fcE1heEJveCkgew0KLSAgICAgICAgZGVsZXRlIG1fcE1heEJveDsNCi0gICAgICAgIG1fcE1heEJveCA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKG1fcENhcHRpb25Cb3gpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BDYXB0aW9uQm94Ow0KLSAgICAgICAgbV9wQ2FwdGlvbkJveCA9IE5VTEw7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0Zvcm1JbXA6OkNhbGNDb250ZW50UmVjdChDRlhfUmVjdEYgJnJ0Q29udGVudCkNCi17DQotI2lmZGVmIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXINCi0gICAgcnRDb250ZW50ID0gbV9ydFJlbGF0aXZlOw0KLSNlbHNlDQotICAgIEdldEVkZ2VSZWN0KHJ0Q29udGVudCk7DQotICAgIGlmIChIYXNFZGdlKCkpIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZFZGdlID0gR2V0RWRnZVdpZHRoKCk7DQotICAgICAgICBydENvbnRlbnQuRGVmbGF0ZShmRWRnZSwgZkVkZ2UpOw0KLSAgICB9DQotI2VuZGlmDQotfQ0KLUNGV0xfU3lzQnRuKiBDRldMX0Zvcm1JbXA6OkdldFN5c0J0bkF0UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKG1fcENsb3NlQm94ICYmIG1fcENsb3NlQm94LT5tX3J0QnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgIHJldHVybiBtX3BDbG9zZUJveDsNCi0gICAgfQ0KLSAgICBpZiAobV9wTWF4Qm94ICYmIG1fcE1heEJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gbV9wTWF4Qm94Ow0KLSAgICB9DQotICAgIGlmIChtX3BNaW5Cb3ggJiYgbV9wTWluQm94LT5tX3J0QnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgIHJldHVybiBtX3BNaW5Cb3g7DQotICAgIH0NCi0gICAgaWYgKG1fcENhcHRpb25Cb3ggJiYgbV9wQ2FwdGlvbkJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gbV9wQ2FwdGlvbkJveDsNCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotQ0ZXTF9TeXNCdG4qIENGV0xfRm9ybUltcDo6R2V0U3lzQnRuQnlTdGF0ZShGWF9EV09SRCBkd1N0YXRlKQ0KLXsNCi0gICAgaWYgKG1fcENsb3NlQm94ICYmIChtX3BDbG9zZUJveC0+bV9kd1N0YXRlICYgZHdTdGF0ZSkpIHsNCi0gICAgICAgIHJldHVybiBtX3BDbG9zZUJveDsNCi0gICAgfQ0KLSAgICBpZiAobV9wTWF4Qm94ICYmIChtX3BNYXhCb3gtPm1fZHdTdGF0ZSAmIGR3U3RhdGUpKSB7DQotICAgICAgICByZXR1cm4gbV9wTWF4Qm94Ow0KLSAgICB9DQotICAgIGlmIChtX3BNaW5Cb3ggJiYgKG1fcE1pbkJveC0+bV9kd1N0YXRlICYgZHdTdGF0ZSkpIHsNCi0gICAgICAgIHJldHVybiBtX3BNaW5Cb3g7DQotICAgIH0NCi0gICAgaWYgKG1fcENhcHRpb25Cb3ggJiYgKG1fcENhcHRpb25Cb3gtPm1fZHdTdGF0ZSAmIGR3U3RhdGUpKSB7DQotICAgICAgICByZXR1cm4gbV9wQ2FwdGlvbkJveDsNCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotQ0ZXTF9TeXNCdG4qIENGV0xfRm9ybUltcDo6R2V0U3lzQnRuQnlJbmRleChpbnQzMl90IG5JbmRleCkNCi17DQotICAgIGlmIChuSW5kZXggPCAwKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfUHRyQXJyYXkgYXJyQnRuOw0KLSAgICBpZiAobV9wTWluQm94KSB7DQotICAgICAgICBhcnJCdG4uQWRkKG1fcE1pbkJveCk7DQotICAgIH0NCi0gICAgaWYgKG1fcE1heEJveCkgew0KLSAgICAgICAgYXJyQnRuLkFkZChtX3BNYXhCb3gpOw0KLSAgICB9DQotICAgIGlmIChtX3BDbG9zZUJveCkgew0KLSAgICAgICAgYXJyQnRuLkFkZChtX3BDbG9zZUJveCk7DQotICAgIH0NCi0gICAgcmV0dXJuIChDRldMX1N5c0J0biopIGFyckJ0bltuSW5kZXhdOw0KLX0NCi1pbnQzMl90IENGV0xfRm9ybUltcDo6R2V0U3lzQnRuSW5kZXgoQ0ZXTF9TeXNCdG4gKnBCdG4pDQotew0KLSAgICBDRlhfUHRyQXJyYXkgYXJyQnRuOw0KLSAgICBpZiAobV9wTWluQm94KSB7DQotICAgICAgICBhcnJCdG4uQWRkKG1fcE1pbkJveCk7DQotICAgIH0NCi0gICAgaWYgKG1fcE1heEJveCkgew0KLSAgICAgICAgYXJyQnRuLkFkZChtX3BNYXhCb3gpOw0KLSAgICB9DQotICAgIGlmIChtX3BDbG9zZUJveCkgew0KLSAgICAgICAgYXJyQnRuLkFkZChtX3BDbG9zZUJveCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGFyckJ0bi5GaW5kKHBCdG4pOw0KLX0NCi1GWF9GTE9BVCBDRldMX0Zvcm1JbXA6OkdldENhcHRpb25IZWlnaHQoKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdDYXBhY2l0eSA9IDA7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0NhcHRpb24pIHsNCi0gICAgICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZQ2FwdGlvbjsNCi0gICAgfSBlbHNlIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX05hcnJvd0NhcHRpb24pIHsNCi0gICAgICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZTmFycm93Q2FwdGlvbjsNCi0gICAgfQ0KLSAgICBpZiAoZHdDYXBhY2l0eSA+IDApIHsNCi0gICAgICAgIEZYX0ZMT0FUICpwZkNhcEhlaWdodCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShkd0NhcGFjaXR5KTsNCi0gICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGZDYXBIZWlnaHQsIDApOw0KLSAgICAgICAgcmV0dXJuICpwZkNhcEhlaWdodDsNCi0gICAgfQ0KLSAgICByZXR1cm4gMDsNCi19DQotdm9pZCBDRldMX0Zvcm1JbXA6OkRyYXdDYXB0aW9uVGV4dChDRlhfR3JhcGhpY3MgKnBHcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICBJRldMX0RhdGFQcm92aWRlciAqcERhdGEgPSBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgIHBEYXRhLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NUZXh0KTsNCi0gICAgaWYgKHdzVGV4dC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRldMX1RoZW1lVGV4dCB0ZXh0UGFyYW07DQotICAgIHRleHRQYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHRleHRQYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0NhcHRpb247DQotICAgIHRleHRQYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9GUk1fTm9ybWFsOw0KLSAgICB0ZXh0UGFyYW0ubV9wR3JhcGhpY3MgPSBwR3M7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICB0ZXh0UGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBDRlhfUmVjdEYgcnRUZXh0Ow0KLSAgICBpZiAobV9iQ3VzdG9taXplTGF5b3V0KSB7DQotICAgICAgICBydFRleHQgPSBtX3J0Q2FwdGlvblRleHQ7DQotICAgICAgICBydFRleHQudG9wIC09IDU7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBydFRleHQgPSBtX3J0Q2FwdGlvbjsNCi0gICAgICAgIEZYX0ZMT0FUIGZwb3M7DQotICAgICAgICBmcG9zID0gSGFzSWNvbigpID8gMjkuMGYgOiAxMy4wZjsNCi0gICAgICAgIHJ0VGV4dC5sZWZ0ICs9IGZwb3M7DQotICAgIH0NCi0gICAgdGV4dFBhcmFtLm1fcnRQYXJ0ID0gcnRUZXh0Ow0KLSAgICB0ZXh0UGFyYW0ubV93c1RleHQgPSB3c1RleHQ7DQotICAgIHRleHRQYXJhbS5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUgfCBGREVfVFRPU1RZTEVfRWxsaXBzaXM7DQotICAgIHRleHRQYXJhbS5tX2lUVE9BbGlnbiA9IG1fYkN1c3RvbWl6ZUxheW91dCA/IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyIDogRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0Ow0KLSAgICBwVGhlbWUtPkRyYXdUZXh0KCZ0ZXh0UGFyYW0pOw0KLX0NCi12b2lkIENGV0xfRm9ybUltcDo6RHJhd0ljb25JbWFnZShDRlhfR3JhcGhpY3MgKnBHcywgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggKQ0KLXsNCi0gICAgSUZXTF9Gb3JtRFAgKnBEYXRhID0gKElGV0xfRm9ybURQICopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCi0gICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0ljb247DQotICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdzOw0KLSAgICBwYXJhbS5tX3BJbWFnZSA9IHBEYXRhLT5HZXRJY29uKG1fcEludGVyZmFjZSwgRkFMU0UpOw0KLSAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRJY29uOw0KLSAgICBpZihwTWF0cml4KSB7DQotICAgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCi19DQotdm9pZCBDRldMX0Zvcm1JbXA6OkdldEVkZ2VSZWN0KENGWF9SZWN0RiAmcnRFZGdlKQ0KLXsNCi0gICAgcnRFZGdlID0gbV9ydFJlbGF0aXZlOw0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Cb3JkZXIpIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZDWCA9IEdldEJvcmRlclNpemUoKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZDWSA9IEdldEJvcmRlclNpemUoRkFMU0UpOw0KLSAgICAgICAgcnRFZGdlLkRlZmxhdGUoZkNYLCBtX3J0Q2FwdGlvbi5IZWlnaHQoKSwgZkNYLCBmQ1kpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtSW1wOjpTZXRXb3JrQXJlYVJlY3QoKQ0KLXsNCi0gICAgbV9ydFJlc3RvcmUgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBXaWRnZXRNZ3IpOw0KLSAgICBtX2JTZXRNYXhpbWl6ZSA9IFRSVUU7DQotICAgIHBXaWRnZXRNZ3ItPlNldE1heGltaXplX05hdGl2ZShtX3BJbnRlcmZhY2UpOw0KLSAgICBSZXBhaW50KCZtX3J0UmVsYXRpdmUpOw0KLX0NCi12b2lkIENGV0xfRm9ybUltcDo6U2V0Q3Vyc29yKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIElGV0xfQWRhcHRlck5hdGl2ZSAqcE5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQotICAgIElGV0xfQWRhcHRlckN1cnNvck1nciAqcEN1cnNvck1nciA9IHBOYXRpdmUtPkdldEN1cnNvck1ncigpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBDdXJzb3JNZ3IpOw0KLSAgICBGWF9EV09SRCBkd0hpdFRlc3QgPSBIaXRUZXN0KGZ4LCBmeSk7DQotICAgIHN3aXRjaCAoZHdIaXRUZXN0KSB7DQotICAgICAgICBjYXNlIEZXTF9XR1RISVRURVNUX1JpZ2h0OiB7DQotICAgICAgICAgICAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZVdFKTsNCi0gICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KLSAgICAgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KLSAgICAgICAgICAgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RISVRURVNUX0JvdHRvbTogew0KLSAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOUyk7DQotICAgICAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCi0gICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCi0gICAgICAgICAgICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9Cb3R0b207DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfTGVmdDogew0KLSAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVXRSk7DQotICAgICAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCi0gICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCi0gICAgICAgICAgICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9MZWZ0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RISVRURVNUX1RvcDogew0KLSAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOUyk7DQotICAgICAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCi0gICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCi0gICAgICAgICAgICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9Ub3A7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfTGVmdFRvcDogew0KLSAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOV1NFKTsNCi0gICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KLSAgICAgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KLSAgICAgICAgICAgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX0xlZnRUb3A7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfTGVmdEJvdHRvbTogew0KLSAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVORVNXKTsNCi0gICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KLSAgICAgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KLSAgICAgICAgICAgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX0xlZnRCb3R0b207DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfUmlnaHRUb3A6IHsNCi0gICAgICAgICAgICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTkVTVyk7DQotICAgICAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCi0gICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCi0gICAgICAgICAgICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9SaWdodFRvcDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUSElUVEVTVF9SaWdodEJvdHRvbTogew0KLSAgICAgICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOV1NFKTsNCi0gICAgICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KLSAgICAgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KLSAgICAgICAgICAgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0Qm90dG9tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfQXJyb3cpOw0KLSAgICAgICAgICAgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQotICAgICAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtSW1wOjpMYXlvdXQoKQ0KLXsNCi0gICAgR2V0UmVsYXRpdmVSZWN0KG1fcnRSZWxhdGl2ZSk7DQotI2lmbmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQotICAgIFJlU2V0U3lzQnRuKCk7DQotI2VuZGlmDQotICAgIGlmIChtX3BDb250ZW50KSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRDbGllbnQ7DQotICAgICAgICBHZXRDbGllbnRSZWN0KHJ0Q2xpZW50KTsNCi0gICAgICAgIG1fcENvbnRlbnQtPlNldFdpZGdldFJlY3QocnRDbGllbnQpOw0KLSAgICAgICAgbV9wQ29udGVudC0+VXBkYXRlKCk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0Zvcm1JbXA6OlJlU2V0U3lzQnRuKCkNCi17DQotICAgIG1fZkNYQm9yZGVyID0gKihGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXIpOw0KLSAgICBtX2ZDWUJvcmRlciA9ICooRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX0NZQm9yZGVyKTsNCi0gICAgUmVtb3ZlU3lzQnV0dG9ucygpOw0KLSAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQotICAgIG1fYkN1c3RvbWl6ZUxheW91dCA9IHBUaGVtZS0+SXNDdXN0b21pemVkTGF5b3V0KG1fcEludGVyZmFjZSk7DQorRldMX0VSUiBDRldMX0Zvcm1JbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LlJlc2V0KCk7DQogICAgIEZYX0ZMT0FUIGZDYXBIZWlnaHQgPSBHZXRDYXB0aW9uSGVpZ2h0KCk7DQotICAgIGlmIChmQ2FwSGVpZ2h0ID4gMCkgew0KLSAgICAgICAgbV9ydENhcHRpb24gPSBtX3J0UmVsYXRpdmU7DQotICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwSGVpZ2h0Ow0KKyAgICBGWF9GTE9BVCBmQ1hCb3JkZXIgPSBHZXRCb3JkZXJTaXplKFRSVUUpOw0KKyAgICBGWF9GTE9BVCBmQ1lCb3JkZXIgPSBHZXRCb3JkZXJTaXplKEZBTFNFKTsNCisgICAgRlhfRkxPQVQgZkVkZ2UgPSBHZXRFZGdlV2lkdGgoKTsNCisgICAgaWYgKG1fcENvbnRlbnQpIHsNCisgICAgICBtX3BDb250ZW50LT5HZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KICAgICB9DQotICAgIG1faVN5c0JveCA9IDA7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0Nsb3NlQm94KSB7DQotICAgICAgICBtX3BDbG9zZUJveCA9IEZYX05FVyBDRldMX1N5c0J0bjsNCi0gICAgICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCi0gICAgICAgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCi0gICAgICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9DbG9zZUJveDsNCi0gICAgICAgICAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwYXJhbSwgbV9wQ2xvc2VCb3gtPm1fcnRCdG4pOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX3BDbG9zZUJveC0+bV9ydEJ0bi5TZXQobV9ydFJlbGF0aXZlLnJpZ2h0KCkgLSBGV0xfU1lTQlROTUFSR0lOIC0gRldMX1NZU0JUTlNJWkUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TWVNCVE5NQVJHSU4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TWVNCVE5TSVpFLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1lTQlROU0laRSk7DQotICAgICAgICB9DQotICAgICAgICBtX2lTeXNCb3ggKys7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTWF4aW1pemVCb3gpIHsNCi0gICAgICAgIG1fcE1heEJveCA9IEZYX05FVyBDRldMX1N5c0J0bjsNCi0gICAgICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCi0gICAgICAgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCi0gICAgICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveDsNCi0gICAgICAgICAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwYXJhbSwgbV9wTWF4Qm94LT5tX3J0QnRuKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKG1fcENsb3NlQm94KSB7DQotICAgICAgICAgICAgICAgIG1fcE1heEJveC0+bV9ydEJ0bi5TZXQobV9wQ2xvc2VCb3gtPm1fcnRCdG4ubGVmdCAtIEZXTF9TWVNCVE5TUEFOIC0gRldMX1NZU0JUTlNJWkUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2xvc2VCb3gtPm1fcnRCdG4udG9wLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TWVNCVE5TSVpFLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TWVNCVE5TSVpFKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX3BNYXhCb3gtPm1fcnRCdG4uU2V0KG1fcnRSZWxhdGl2ZS5yaWdodCgpIC0gRldMX1NZU0JUTk1BUkdJTiAtIEZXTF9TWVNCVE5TSVpFLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TWVNCVE5NQVJHSU4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIG1faVN5c0JveCArKzsNCi0gICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9NaW5pbWl6ZUJveCkgew0KLSAgICAgICAgbV9wTWluQm94ID0gRlhfTkVXIENGV0xfU3lzQnRuOw0KLSAgICAgICAgaWYgKG1fYkN1c3RvbWl6ZUxheW91dCkgew0KLSAgICAgICAgICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KLSAgICAgICAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX01pbmltaXplQm94Ow0KLSAgICAgICAgICAgIHBUaGVtZS0+R2V0UGFydFJlY3QoJnBhcmFtLCBtX3BNaW5Cb3gtPm1fcnRCdG4pOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAobV9wTWF4Qm94KSB7DQotICAgICAgICAgICAgICAgIG1fcE1pbkJveC0+bV9ydEJ0bi5TZXQobV9wTWF4Qm94LT5tX3J0QnRuLmxlZnQgLSBGV0xfU1lTQlROU1BBTiAtIEZXTF9TWVNCVE5TSVpFLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE1heEJveC0+bV9ydEJ0bi50b3AsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9wQ2xvc2VCb3gpIHsNCi0gICAgICAgICAgICAgICAgbV9wTWluQm94LT5tX3J0QnRuLlNldChtX3BDbG9zZUJveC0+bV9ydEJ0bi5sZWZ0IC0gRldMX1NZU0JUTlNQQU4gLSBGV0xfU1lTQlROU0laRSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDbG9zZUJveC0+bV9ydEJ0bi50b3AsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTlNJWkUpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIG1fcE1pbkJveC0+bV9ydEJ0bi5TZXQobV9ydFJlbGF0aXZlLnJpZ2h0KCkgLSBGV0xfU1lTQlROTUFSR0lOIC0gRldMX1NZU0JUTlNJWkUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NZU0JUTk1BUkdJTiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1lTQlROU0laRSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1lTQlROU0laRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9pU3lzQm94ICsrOw0KLSAgICB9DQotICAgIElGV0xfRm9ybURQICpwRGF0YSA9IChJRldMX0Zvcm1EUCAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSWNvbiAmJiBwRGF0YS0+R2V0SWNvbihtX3BJbnRlcmZhY2UsIEZBTFNFKSkgew0KLSAgICAgICAgaWYgKG1fYkN1c3RvbWl6ZUxheW91dCkgew0KLSAgICAgICAgICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KLSAgICAgICAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0ljb247DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzVGV4dCk7DQotICAgICAgICAgICAgcGFyYW0ubV9wRGF0YSA9ICZ3c1RleHQ7DQotICAgICAgICAgICAgcFRoZW1lLT5HZXRQYXJ0UmVjdCgmcGFyYW0sIG1fcnRJY29uKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9ydEljb24uU2V0KDUsIChtX3J0Q2FwdGlvbi5oZWlnaHQgLSBtX2ZTbWFsbEljb25TeikgLyAyLCBtX2ZTbWFsbEljb25TeiwgbV9mU21hbGxJY29uU3opOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCi0gICAgICAgIENGV0xfVGhlbWVUZXh0IHBhcm1hOw0KLSAgICAgICAgcGFybWEubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICAgICAgcGFybWEubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9IZWFkVGV4dDsNCi0gICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHBhcm1hLm1fd3NUZXh0KTsNCi0gICAgICAgIHBUaGVtZS0+R2V0UGFydFJlY3QoJnBhcm1hLCBtX3J0Q2FwdGlvblRleHQpOw0KLSAgICB9DQorICAgIHJlY3QuaGVpZ2h0ICs9IGZDYXBIZWlnaHQgKyBmQ1lCb3JkZXIgKyBmRWRnZSArIGZFZGdlOw0KKyAgICByZWN0LndpZHRoICs9IGZDWEJvcmRlciArIGZDWEJvcmRlciArIGZFZGdlICsgZkVkZ2U7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotdm9pZCBDRldMX0Zvcm1JbXA6OlJlZ2lzdGVyRm9ybSgpDQotew0KLSAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KLSAgICBDRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocERyaXZlcik7DQotICAgIHBEcml2ZXItPlJlZ2lzdGVyRm9ybSh0aGlzKTsNCi19DQotdm9pZCBDRldMX0Zvcm1JbXA6OlVuUmVnaXN0ZXJGb3JtKCkNCi17DQotICAgIElGV0xfTm90ZVRocmVhZCAqcFRocmVhZCA9IEdldE93bmVyVGhyZWFkKCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQotICAgIENGV0xfTm90ZURyaXZlciAqcERyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRHJpdmVyKTsNCi0gICAgcERyaXZlci0+VW5SZWdpc3RlckZvcm0odGhpcyk7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9Gb3JtSW1wOjpJc0RvTW9kYWwoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYkRvTW9kYWxGbGFnOw0KLX0NCi12b2lkIENGV0xfRm9ybUltcDo6U2V0VGhlbWVEYXRhKCkNCi17DQotICAgIG1fZlNtYWxsSWNvblN6ID0gKihGWF9GTE9BVCAqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX0ZSTV9TbWFsbEljb24pOw0KLSAgICBtX2ZCaWdJY29uU3ogPSAqKEZYX0ZMT0FUICopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfRlJNX0JpZ0ljb24pOw0KLX0NCi1GWF9CT09MCUNGV0xfRm9ybUltcDo6SGFzSWNvbigpDQotew0KLSAgICBJRldMX0Zvcm1EUCAqcERhdGEgPSAoSUZXTF9Gb3JtRFAgKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQotICAgIHJldHVybiBwRGF0YS0+R2V0SWNvbihtX3BJbnRlcmZhY2UsIEZBTFNFKSA/IFRSVUUgOiBGQUxTRTsNCi19DQotdm9pZCBDRldMX0Zvcm1JbXA6OlVwZGF0ZUljb24oKQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwV2lkZ2V0TWdyKTsNCi0gICAgSUZXTF9Gb3JtRFAgKnBEYXRhID0gKElGV0xfRm9ybURQICopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBDRlhfRElCaXRtYXAgKnBCaWdJY29uID0gcERhdGEtPkdldEljb24obV9wSW50ZXJmYWNlLCBUUlVFKTsNCi0gICAgQ0ZYX0RJQml0bWFwICpwU21hbGxJY29uID0gcERhdGEtPkdldEljb24obV9wSW50ZXJmYWNlLCBGQUxTRSk7DQotICAgIGlmIChwQmlnSWNvbiAmJiBwQmlnSWNvbiAhPSBtX3BCaWdJY29uKSB7DQotICAgICAgICBtX3BCaWdJY29uID0gcEJpZ0ljb247DQotICAgICAgICBwV2lkZ2V0TWdyLT5TZXRXaWRnZXRJY29uX05hdGl2ZShtX3BJbnRlcmZhY2UsIG1fcEJpZ0ljb24sIFRSVUUpOw0KLSAgICB9DQotICAgIGlmIChwU21hbGxJY29uICYmIHBTbWFsbEljb24gIT0gbV9wU21hbGxJY29uKSB7DQotICAgICAgICBtX3BTbWFsbEljb24gPSBwU21hbGxJY29uOw0KLSAgICAgICAgcFdpZGdldE1nci0+U2V0V2lkZ2V0SWNvbl9OYXRpdmUobV9wSW50ZXJmYWNlLCBtX3BCaWdJY29uLCBGQUxTRSk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0Zvcm1JbXA6OlVwZGF0ZUNhcHRpb24oKQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwV2lkZ2V0TWdyKTsNCi0gICAgSUZXTF9Gb3JtRFAgKnBEYXRhID0gKElGV0xfRm9ybURQICopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBEYXRhKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgdGV4dDsNCi0gICAgcERhdGEtPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB0ZXh0KTsNCi0gICAgcFdpZGdldE1nci0+U2V0V2lkZ2V0Q2FwdGlvbl9OYXRpdmUobV9wSW50ZXJmYWNlLCB0ZXh0KTsNCi19DQotdm9pZCAgQ0ZXTF9Gb3JtSW1wOjpEb1dpZHRoTGltaXQoRlhfRkxPQVQgJmZMZWZ0LCBGWF9GTE9BVCAmZldpZHRoLCBGWF9GTE9BVCBmQ3VyWCwgRlhfRkxPQVQgZlNwYWNlLCBGWF9GTE9BVCBmTGltaXRNaW4sIEZYX0ZMT0FUIGZMaW1pdE1heCwgRlhfQk9PTCBiTGVmdCkNCi17DQotICAgIEZYX0ZMT0FUIGZ4ID0gZkN1clg7DQotICAgIEZYX0ZMT0FUIGZ5ID0gMCA7DQotICAgIFRyYW5zZm9ybVRvKE5VTEwsIGZ4LCBmeSk7DQotICAgIEZYX0ZMT0FUIGZUZW1wID0gYkxlZnQgPyAoZldpZHRoIC0gZnggKyBmTGVmdCArIGZTcGFjZSApIDogKGZ4IC0gZkxlZnQgKyBmU3BhY2UpOw0KLSAgICBpZiAoZlRlbXAgPj0gZkxpbWl0TWluICYmIGZUZW1wIDw9IGZMaW1pdE1heCkgew0KLSAgICAgICAgZldpZHRoID0gZlRlbXA7DQotICAgICAgICBmTGVmdCArPSBiTGVmdCA/IChmeCAtIGZMZWZ0IC0gZlNwYWNlICkgOiAwOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKGZUZW1wIDwgZkxpbWl0TWluICYmIGZXaWR0aCA+IGZMaW1pdE1pbikgew0KLSAgICAgICAgICAgIGZMZWZ0ICs9IGJMZWZ0ID8gKGZXaWR0aCAtIGZMaW1pdE1pbikgOiAwOw0KLSAgICAgICAgICAgIGZXaWR0aCA9IGZMaW1pdE1pbjsNCi0gICAgICAgIH0gZWxzZSBpZiAoZlRlbXAgPiBmTGltaXRNYXggJiYgZldpZHRoIDwgZkxpbWl0TWF4KSB7DQotICAgICAgICAgICAgZkxlZnQgLT0gYkxlZnQgPyAoZkxpbWl0TWF4IC0gZldpZHRoKSA6IDA7DQotICAgICAgICAgICAgZldpZHRoID0gZkxpbWl0TWF4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgIENGV0xfRm9ybUltcDo6RG9IZWlnaHRMaW1pdChGWF9GTE9BVCAmZlRvcCwgRlhfRkxPQVQgJmZIZWlnaHQsIEZYX0ZMT0FUIGZDdXJZLCBGWF9GTE9BVCBmU3BhY2UsIEZYX0ZMT0FUIGZMaW1pdE1pbiwgRlhfRkxPQVQgZkxpbWl0TWF4LCBGWF9CT09MIGJUb3ApDQotew0KLSAgICBGWF9GTE9BVCBmeCA9IDA7DQotICAgIEZYX0ZMT0FUIGZ5ID0gZkN1clkgOw0KLSAgICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KLSAgICBGWF9GTE9BVCBmVGVtcCA9IGJUb3AgPyAoZkhlaWdodCAtIGZ5ICsgZlRvcCArIGZTcGFjZSApIDogKGZ5IC0gZlRvcCArIGZTcGFjZSk7DQotICAgIGlmIChmVGVtcCA+PSBmTGltaXRNaW4gJiYgZlRlbXAgPD0gZkxpbWl0TWF4KSB7DQotICAgICAgICBmSGVpZ2h0ID0gZlRlbXA7DQotICAgICAgICBmVG9wICs9IGJUb3AgPyAoZnkgLSBmVG9wIC0gZlNwYWNlICkgOiAwOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKGZUZW1wIDwgZkxpbWl0TWluICYmIGZIZWlnaHQgPiBmTGltaXRNaW4pIHsNCi0gICAgICAgICAgICBmVG9wICs9IGJUb3AgPyAoZkhlaWdodCAtIGZMaW1pdE1pbikgOiAwOw0KLSAgICAgICAgICAgIGZIZWlnaHQgPSBmTGltaXRNaW47DQotICAgICAgICB9IGVsc2UgaWYgKGZUZW1wID4gZkxpbWl0TWF4ICYmIGZIZWlnaHQgPCBmTGltaXRNYXgpIHsNCi0gICAgICAgICAgICBmVG9wIC09IGJUb3AgPyAoZkxpbWl0TWF4IC0gZkhlaWdodCkgOiAwOw0KLSAgICAgICAgICAgIGZIZWlnaHQgPSBmTGltaXRNYXg7DQotICAgICAgICB9DQotICAgIH0NCi19DQotQ0ZXTF9Gb3JtRGVsZWdhdGU6OkNGV0xfRm9ybURlbGVnYXRlKENGV0xfRm9ybUltcCAqcE93bmVyKQ0KLSAgICA6IG1fcE93bmVyKHBPd25lcikNCi17DQotfQ0KLWludDMyX3QgQ0ZXTF9Gb3JtRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQorRldMX0VSUiBDRldMX0Zvcm1JbXA6OkdldENsaWVudFJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQ2FwdGlvbikgPT0gMCkgew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgICAgcmVjdC5PZmZzZXQoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KICNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KLSAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpbnQzMl90IGlSZXQgPSAxOw0KLSAgICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9BY3RpdmF0ZTogew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSZWxhdGl2ZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfRGVhY3RpdmF0ZTogew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydFJlbGF0aXZlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIHJlY3QgPSBtX3J0UmVsYXRpdmU7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0TWdyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyKiBhZGFwdGVyV2lkZ2V0TWdyID0gcFdpZGdldE1nci0+R2V0QWRhcHRlcldpZGdldE1ncigpOw0KKyAgRlhfRkxPQVQgbCwgdCwgciwgYjsNCisgIGwgPSB0ID0gciA9IGIgPSAwOw0KKyAgYWRhcHRlcldpZGdldE1nci0+R2V0U3lzdGVtQm9yZGVyKGwsIHQsIHIsIGIpOw0KKyAgcmVjdC5EZWZsYXRlKGwsIHQsIHIsIGIpOw0KKyAgcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KICNlbHNlDQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KLSAgICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpbnQzMl90IGlSZXQgPSAxOw0KLSAgICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9BY3RpdmF0ZTogew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KLSAgICAgICAgICAgICAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBtX3BPd25lci0+R2V0T3duZXJUaHJlYWQoKTsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9Ob3RlRHJpdmVyICpwRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICAgICAgICAgICAgICBDRldMX1dpZGdldEltcCAqcFN1YkZvY3VzSW1wID0gbV9wT3duZXItPkdldFN1YkZvY3VzKCk7DQotICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0ICpwU3ViRm9jdXMgPSBwU3ViRm9jdXNJbXAgPyBwU3ViRm9jdXNJbXAtPkdldEludGVyZmFjZSgpIDogTlVMTDsNCi0gICAgICAgICAgICAgICAgaWYgKHBTdWJGb2N1cyAmJiBwU3ViRm9jdXMgIT0gcERyaXZlci0+R2V0Rm9jdXMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcERyaXZlci0+U2V0Rm9jdXMocFN1YkZvY3VzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSZWxhdGl2ZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfRGVhY3RpdmF0ZTogew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQotICAgICAgICAgICAgICAgIElGV0xfTm90ZVRocmVhZCAqcFRocmVhZCA9IG1fcE93bmVyLT5HZXRPd25lclRocmVhZCgpOw0KLSAgICAgICAgICAgICAgICBDRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQotICAgICAgICAgICAgICAgIENGV0xfV2lkZ2V0SW1wICpwU3ViRm9jdXNJbXAgPSBtX3BPd25lci0+R2V0U3ViRm9jdXMoKTsNCi0gICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQgKnBTdWJGb2N1cyA9IHBTdWJGb2N1c0ltcCA/IHBTdWJGb2N1c0ltcC0+R2V0SW50ZXJmYWNlKCkgOiBOVUxMOw0KLSAgICAgICAgICAgICAgICBpZiAocFN1YkZvY3VzKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFN1YkZvY3VzID09IHBEcml2ZXItPkdldEZvY3VzKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwRHJpdmVyLT5TZXRGb2N1cyhOVUxMKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFN1YkZvY3VzLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZXTF9Nc2dLaWxsRm9jdXMgbXM7DQotICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gcFN1YkZvY3VzLT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocERlbGVnYXRlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZSgmbXMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSZWxhdGl2ZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCi0gICAgICAgICAgICAgICAgc3dpdGNoIChwTXNnLT5tX2R3Q21kKSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VIb3Zlcjogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbk1vdXNlSG92ZXIocE1zZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmU6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Nb3VzZUxlYXZlKHBNc2cpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRGJsQ2xrOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTEJ1dHRvbkRibENsayhwTXNnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfU2l6ZTogew0KLSAgICAgICAgICAgICAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICAgICAgICAgICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXRNZ3IsIDApOw0KLSAgICAgICAgICAgICAgICBwV2lkZ2V0TWdyLT5BZGRSZWRyYXdDb3VudHMobV9wT3duZXItPm1fcEludGVyZmFjZSk7DQotICAgICAgICAgICAgICAgIGlmICghbV9wT3duZXItPm1fYlNldE1heGltaXplKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9iU2V0TWF4aW1pemUgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9Nc2dTaXplICpwTXNnID0gKENGV0xfTXNnU2l6ZSopcE1lc3NhZ2U7DQotICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydDsNCi0gICAgICAgICAgICAgICAgcFdpZGdldE1nci0+R2V0V2lkZ2V0UmVjdF9OYXRpdmUobV9wT3duZXItPm1fcEludGVyZmFjZSwgcnQpOw0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0ID0gcnQubGVmdDsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wID0gcnQudG9wOw0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCA9IChGWF9GTE9BVClwTXNnLT5tX2lXaWR0aDsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0ID0gKEZYX0ZMT0FUKXBNc2ctPm1faUhlaWdodDsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPlVwZGF0ZSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1dpbmRvd01vdmU6IHsNCi0gICAgICAgICAgICAgICAgT25XaW5kb3dNb3ZlKChDRldMX01zZ1dpbmRvd01vdmUqIClwTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfQ2xvc2U6IHsNCi0gICAgICAgICAgICAgICAgT25DbG9zZSgoQ0ZXTF9Nc2dDbG9zZSogKXBNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICBpUmV0ID0gMDsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGlSZXQ7DQorICBGWF9GTE9BVCB4ID0gMDsNCisgIEZYX0ZMT0FUIHkgPSAwOw0KKyAgRlhfRkxPQVQgdCA9IDA7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBpZiAocFRoZW1lKSB7DQorICAgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7DQorICAgIHBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBGWF9GTE9BVCogdmFsdWUgPSBOVUxMOw0KKyAgICB2YWx1ZSA9IChGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0NYQm9yZGVyKTsNCisgICAgeCA9ICp2YWx1ZTsNCisgICAgdmFsdWUgPSAoRlhfRkxPQVQqKXBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9DWUJvcmRlcik7DQorICAgIHkgPSAqdmFsdWU7DQorICAgIHZhbHVlID0NCisgICAgICAgIChGWF9GTE9BVCopcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0ZSTV9DWUNhcHRpb24pOw0KKyAgICB0ID0gKnZhbHVlOw0KKyAgfQ0KKyAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICByZWN0Lk9mZnNldCgtcmVjdC5sZWZ0LCAtcmVjdC50b3ApOw0KKyAgcmVjdC5EZWZsYXRlKHgsIHQsIHgsIHkpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KICNlbmRpZg0KIH0NCi1GV0xfRVJSCUNGV0xfRm9ybURlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBFdmVudCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKHBFdmVudC0+R2V0Q2xhc3NJRCgpID09IEZXTF9FVlRIQVNIX0Nsb3NlICYmIHBFdmVudC0+bV9wU3JjVGFyZ2V0ID09IG1fcE93bmVyLT5tX3BJbnRlcmZhY2UpIHsNCi0gICAgfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpVcGRhdGUoKSB7DQorICBpZiAobV9pTG9jayA+IDApIHsNCiAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgfQ0KKyNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorI2Vsc2UNCisgIFNldFRoZW1lRGF0YSgpOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSWNvbikgew0KKyAgICBVcGRhdGVJY29uKCk7DQorICB9DQorI2VuZGlmDQorICBVcGRhdGVDYXB0aW9uKCk7DQorICBMYXlvdXQoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUglDRldMX0Zvcm1EZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK0ZYX0RXT1JEIENGV0xfRm9ybUltcDo6SGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIGlmIChtX3BDbG9zZUJveCAmJiBtX3BDbG9zZUJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbG9zZUJveDsNCisgIH0NCisgIGlmIChtX3BNYXhCb3ggJiYgbV9wTWF4Qm94LT5tX3J0QnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX01heEJveDsNCisgIH0NCisgIGlmIChtX3BNaW5Cb3ggJiYgbV9wTWluQm94LT5tX3J0QnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX01pbkJveDsNCisgIH0NCisgIENGWF9SZWN0RiBydENhcDsNCisgIHJ0Q2FwLlNldChtX3J0Q2FwdGlvbi5sZWZ0ICsgbV9mQ1lCb3JkZXIsIG1fcnRDYXB0aW9uLnRvcCArIG1fZkNYQm9yZGVyLA0KKyAgICAgICAgICAgIG1fcnRDYXB0aW9uLndpZHRoIC0gRldMX1NZU0JUTlNJWkUgKiBtX2lTeXNCb3ggLSAyICogbV9mQ1lCb3JkZXIsDQorICAgICAgICAgICAgbV9ydENhcHRpb24uaGVpZ2h0IC0gbV9mQ1hCb3JkZXIpOw0KKyAgaWYgKHJ0Q2FwLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1RpdGxlYmFyOw0KKyAgfQ0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0JvcmRlcikgJiYNCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9GUk1fUmVzaXplKSkgew0KKyAgICBGWF9GTE9BVCBmV2lkdGggPQ0KKyAgICAgICAgbV9ydFJlbGF0aXZlLndpZHRoIC0gMiAqIChtX2ZDWUJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgRlhfRkxPQVQgZkhlaWdodCA9DQorICAgICAgICBtX3J0UmVsYXRpdmUuaGVpZ2h0IC0gMiAqIChtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgQ0ZYX1JlY3RGIHJ0Ow0KKyAgICBydC5TZXQoMCwgbV9mQ1hCb3JkZXIgKyBGV0xfQ29ybmVyRW5sYXJnZSwgbV9mQ1lCb3JkZXIsIGZIZWlnaHQpOw0KKyAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9MZWZ0Ow0KKyAgICB9DQorICAgIHJ0LlNldChtX3J0UmVsYXRpdmUud2lkdGggLSBtX2ZDWUJvcmRlciwgbV9mQ1hCb3JkZXIgKyBGV0xfQ29ybmVyRW5sYXJnZSwNCisgICAgICAgICAgIG1fZkNZQm9yZGVyLCBmSGVpZ2h0KTsNCisgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfUmlnaHQ7DQorICAgIH0NCisgICAgcnQuU2V0KG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIDAsIGZXaWR0aCwgbV9mQ1hCb3JkZXIpOw0KKyAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Ub3A7DQorICAgIH0NCisgICAgcnQuU2V0KG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIG1fcnRSZWxhdGl2ZS5oZWlnaHQgLSBtX2ZDWEJvcmRlciwNCisgICAgICAgICAgIGZXaWR0aCwgbV9mQ1hCb3JkZXIpOw0KKyAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Cb3R0b207DQorICAgIH0NCisgICAgcnQuU2V0KDAsIDAsIG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsDQorICAgICAgICAgICBtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfTGVmdFRvcDsNCisgICAgfQ0KKyAgICBydC5TZXQoMCwgbV9ydFJlbGF0aXZlLmhlaWdodCAtIG1fZkNYQm9yZGVyIC0gRldMX0Nvcm5lckVubGFyZ2UsDQorICAgICAgICAgICBtX2ZDWUJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlLCBtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfTGVmdEJvdHRvbTsNCisgICAgfQ0KKyAgICBydC5TZXQobV9ydFJlbGF0aXZlLndpZHRoIC0gbV9mQ1lCb3JkZXIgLSBGV0xfQ29ybmVyRW5sYXJnZSwgMCwNCisgICAgICAgICAgIG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIG1fZkNYQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UpOw0KKyAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9SaWdodFRvcDsNCisgICAgfQ0KKyAgICBydC5TZXQobV9ydFJlbGF0aXZlLndpZHRoIC0gbV9mQ1lCb3JkZXIgLSBGV0xfQ29ybmVyRW5sYXJnZSwNCisgICAgICAgICAgIG1fcnRSZWxhdGl2ZS5oZWlnaHQgLSBtX2ZDWEJvcmRlciAtIEZXTF9Db3JuZXJFbmxhcmdlLA0KKyAgICAgICAgICAgbV9mQ1lCb3JkZXIgKyBGV0xfQ29ybmVyRW5sYXJnZSwgbV9mQ1hCb3JkZXIgKyBGV0xfQ29ybmVyRW5sYXJnZSk7DQorICAgIGlmIChydC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1JpZ2h0Qm90dG9tOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KIH0NCi12b2lkIENGV0xfRm9ybURlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBtX3BPd25lci0+U2V0R3JhYihUUlVFKTsNCi0gICAgbV9wT3duZXItPm1fYkxCdXR0b25Eb3duID0gVFJVRTsNCi0gICAgbV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPSBGT1JNX1JFU0laRVRZUEVfTm9uZTsNCi0gICAgQ0ZXTF9TeXNCdG4gKnBQcmVzc0J0biA9IG1fcE93bmVyLT5HZXRTeXNCdG5BdFBvaW50KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KLSAgICBtX3BPd25lci0+bV9pQ2FwdHVyZUJ0biA9IG1fcE93bmVyLT5HZXRTeXNCdG5JbmRleChwUHJlc3NCdG4pOw0KLSAgICBDRlhfUmVjdEYgcnRDYXA7DQotICAgIHJ0Q2FwLlNldChtX3BPd25lci0+bV9ydENhcHRpb24ubGVmdCArIG1fcE93bmVyLT5tX2ZDWUJvcmRlciwNCi0gICAgICAgICAgICAgIG1fcE93bmVyLT5tX3J0Q2FwdGlvbi50b3AgKyBtX3BPd25lci0+bV9mQ1hCb3JkZXIsDQotICAgICAgICAgICAgICBtX3BPd25lci0+bV9ydENhcHRpb24ud2lkdGggLSBGV0xfU1lTQlROU0laRSAqIG1fcE93bmVyLT5tX2lTeXNCb3ggLSAyICogbV9wT3duZXItPm1fZkNZQm9yZGVyLA0KLSAgICAgICAgICAgICAgbV9wT3duZXItPm1fcnRDYXB0aW9uLmhlaWdodCAtIG1fcE93bmVyLT5tX2ZDWEJvcmRlcik7DQotICAgIGlmIChwUHJlc3NCdG4pIHsNCi0gICAgICAgIHBQcmVzc0J0bi0+U2V0UHJlc3NlZCgpOw0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnBQcmVzc0J0bi0+bV9ydEJ0bik7DQotICAgIH0gZWxzZSBpZiAocnRDYXAuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgIG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX0NhcDsNCi0gICAgfSBlbHNlIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQm9yZGVyKSAmJg0KLSAgICAgICAgICAgICAgIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9GUk1fUmVzaXplKSAmJg0KLSAgICAgICAgICAgICAgICFtX3BPd25lci0+bV9iTWF4aW1pemVkKSB7DQotICAgICAgICBtX3BPd25lci0+U2V0Q3Vyc29yKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgRlhfQk9PTCBiSW5hY3RpdmUgPSAhSXNBY3RpdmUoKTsNCisgIGludDMyX3QgaVN0YXRlID0NCisgICAgICBiSW5hY3RpdmUgPyBGV0xfUEFSVFNUQVRFX0ZSTV9JbmFjdGl2ZSA6IEZXTF9QQVJUU1RBVEVfRlJNX05vcm1hbDsNCisgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9GUk1fTm9EcmF3Q2xpZW50KSA9PSAwKSB7DQorICAgIERyYXdCYWNrZ3JvdW5kKHBHcmFwaGljcywgcFRoZW1lKTsNCisgIH0NCisjaWZkZWYgRldMX1VzZU1hY1N5c3RlbUJvcmRlcg0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyNlbmRpZg0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbS5tX2R3U3RhdGVzID0gaVN0YXRlOw0KKyAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbS5tX3J0UGFydCA9IG1fcnRSZWxhdGl2ZTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Cb3JkZXIpIHsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9Cb3JkZXI7DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgIH0NCisgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9XR1RTVFlMRV9FZGdlTWFzaykgIT0NCisgICAgICBGV0xfV0dUU1RZTEVfRWRnZU5vbmUpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0RWRnZTsNCisgICAgR2V0RWRnZVJlY3QocnRFZGdlKTsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9FZGdlOw0KKyAgICBwYXJhbS5tX3J0UGFydCA9IHJ0RWRnZTsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IGlTdGF0ZTsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQ2FwdGlvbikgew0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0NhcHRpb247DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBpU3RhdGU7DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydENhcHRpb247DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgRHJhd0NhcHRpb25UZXh0KHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIH0gZWxzZSBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9OYXJyb3dDYXB0aW9uKSB7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fTmFycm93Q2FwdGlvbjsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IGlTdGF0ZTsNCisgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0Q2FwdGlvbjsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICBEcmF3Q2FwdGlvblRleHQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSWNvbikgew0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0ljb247DQorICAgIGlmIChIYXNJY29uKCkpIHsNCisgICAgICBEcmF3SWNvbkltYWdlKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCiAgICAgfQ0KLSAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LlNldChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fc3pTdGFydC5TZXQobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQorICB9DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyAgew0KKyAgICBpZiAobV9wQ2xvc2VCb3gpIHsNCisgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0Nsb3NlQm94Ow0KKyAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BDbG9zZUJveC0+R2V0UGFydFN0YXRlKCk7DQorICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQpIHsNCisgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0ZSTV9EaXNhYmxlZDsNCisgICAgICB9IGVsc2UgaWYgKEZXTF9QQVJUU1RBVEVfRlJNX05vcm1hbCA9PSBwYXJhbS5tX2R3U3RhdGVzICYmIG1fYk1vdXNlSW4pIHsNCisgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0ZSTV9Ib3ZlcjsNCisgICAgICB9DQorICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3BDbG9zZUJveC0+bV9ydEJ0bjsNCisgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgIH0NCisgICAgaWYgKG1fcE1heEJveCkgew0KKyAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fTWF4aW1pemVCb3g7DQorICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcE1heEJveC0+R2V0UGFydFN0YXRlKCk7DQorICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQpIHsNCisgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0ZSTV9EaXNhYmxlZDsNCisgICAgICB9IGVsc2UgaWYgKEZXTF9QQVJUU1RBVEVfRlJNX05vcm1hbCA9PSBwYXJhbS5tX2R3U3RhdGVzICYmIG1fYk1vdXNlSW4pIHsNCisgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0ZSTV9Ib3ZlcjsNCisgICAgICB9DQorICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3BNYXhCb3gtPm1fcnRCdG47DQorICAgICAgcGFyYW0ubV9kd0RhdGEgPSBtX2JNYXhpbWl6ZWQ7DQorICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICB9DQorICAgIGlmIChtX3BNaW5Cb3gpIHsNCisgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX01pbmltaXplQm94Ow0KKyAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BNaW5Cb3gtPkdldFBhcnRTdGF0ZSgpOw0KKyAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkKSB7DQorICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9GUk1fRGlzYWJsZWQ7DQorICAgICAgfSBlbHNlIGlmIChGV0xfUEFSVFNUQVRFX0ZSTV9Ob3JtYWwgPT0gcGFyYW0ubV9kd1N0YXRlcyAmJiBtX2JNb3VzZUluKSB7DQorICAgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9GUk1fSG92ZXI7DQorICAgICAgfQ0KKyAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9wTWluQm94LT5tX3J0QnRuOw0KKyAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgfQ0KKyAgICBtX2JNb3VzZUluID0gRkFMU0U7DQorICB9DQorI2Vsc2UNCisgIHsNCisgICAgaWYgKG1fcENsb3NlQm94KSB7DQorICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9DbG9zZUJveDsNCisgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gbV9wQ2xvc2VCb3gtPkdldFBhcnRTdGF0ZSgpOw0KKyAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9wQ2xvc2VCb3gtPm1fcnRCdG47DQorICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICB9DQorICAgIGlmIChtX3BNYXhCb3gpIHsNCisgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX01heGltaXplQm94Ow0KKyAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BNYXhCb3gtPkdldFBhcnRTdGF0ZSgpOw0KKyAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9wTWF4Qm94LT5tX3J0QnRuOw0KKyAgICAgIHBhcmFtLm1fZHdEYXRhID0gbV9iTWF4aW1pemVkOw0KKyAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgfQ0KKyAgICBpZiAobV9wTWluQm94KSB7DQorICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9NaW5pbWl6ZUJveDsNCisgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gbV9wTWluQm94LT5HZXRQYXJ0U3RhdGUoKTsNCisgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcE1pbkJveC0+bV9ydEJ0bjsNCisgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgIH0NCisgIH0NCisjZW5kaWYNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotdm9pZCBDRldMX0Zvcm1EZWxlZ2F0ZTo6T25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQotICAgIG1fcE93bmVyLT5TZXRHcmFiKEZBTFNFKTsNCi0gICAgbV9wT3duZXItPm1fYkxCdXR0b25Eb3duID0gRkFMU0U7DQotICAgIENGV0xfU3lzQnRuICpwUG9pbnRCdG4gPSBtX3BPd25lci0+R2V0U3lzQnRuQXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgQ0ZXTF9TeXNCdG4gKnBQcmVzc2VkQnRuID0gbV9wT3duZXItPkdldFN5c0J0bkJ5SW5kZXgobV9wT3duZXItPm1faUNhcHR1cmVCdG4pOw0KLSAgICBpZiAoIXBQcmVzc2VkQnRuIHx8IHBQb2ludEJ0biAhPSBwUHJlc3NlZEJ0bikgew0KLSAgICAgICAgcmV0dXJuOw0KK0ZXTF9GT1JNU0laRSBDRldMX0Zvcm1JbXA6OkdldEZvcm1TaXplKCkgew0KKyAgcmV0dXJuIG1fZUZvcm1TaXplOw0KK30NCitGV0xfRVJSIENGV0xfRm9ybUltcDo6U2V0Rm9ybVNpemUoRldMX0ZPUk1TSVpFIGVGb3JtU2l6ZSkgew0KKyAgbV9lRm9ybVNpemUgPSBlRm9ybVNpemU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX0Zvcm1JbXA6OkRvTW9kYWwoKSB7DQorICBJRldMX05vdGVUaHJlYWQqIHBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwVGhyZWFkLCBOVUxMKTsNCisgIElGV0xfTm90ZURyaXZlciogcERyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocERyaXZlciwgTlVMTCk7DQorICBtX3BOb3RlTG9vcCA9IEZYX05FVyBDRldMX05vdGVMb29wKHRoaXMpOw0KKyAgcERyaXZlci0+UHVzaE5vdGVMb29wKChJRldMX05vdGVMb29wKiltX3BOb3RlTG9vcCk7DQorICBtX2JEb01vZGFsRmxhZyA9IFRSVUU7DQorICBTZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgRkFMU0UpOw0KKyAgcERyaXZlci0+UnVuKCk7DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyNlbHNlDQorICBwRHJpdmVyLT5Qb3BOb3RlTG9vcCgpOw0KKyNlbmRpZg0KKyAgZGVsZXRlIG1fcE5vdGVMb29wOw0KKyAgbV9wTm90ZUxvb3AgPSBOVUxMOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX0Zvcm1JbXA6OkRvTW9kYWwoRlhfRFdPUkQmIGR3Q29tbWFuZElEKSB7DQorICByZXR1cm4gRG9Nb2RhbCgpOw0KK30NCitGV0xfRVJSIENGV0xfRm9ybUltcDo6RW5kRG9Nb2RhbCgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wTm90ZUxvb3AsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBtX2JEb01vZGFsRmxhZyA9IEZBTFNFOw0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXykNCisgIG1fcE5vdGVMb29wLT5FbmRNb2RhbExvb3AoKTsNCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IEdldE93bmVyVGhyZWFkKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBUaHJlYWQsIE5VTEwpOw0KKyAgQ0ZXTF9Ob3RlRHJpdmVyKiBwRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRHJpdmVyLCBOVUxMKTsNCisgIHBEcml2ZXItPlBvcE5vdGVMb29wKCk7DQorICBTZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorI2Vsc2UNCisgIFNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgIHJldHVybiBtX3BOb3RlTG9vcC0+RW5kTW9kYWxMb29wKCk7DQorI2VuZGlmDQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpTZXRCb3JkZXJSZWdpb24oQ0ZYX1BhdGgqIHBQYXRoKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9CYWNrZ3JvdW5kOw0KKyAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbS5tX3J0UGFydCA9IG1fcnRSZWxhdGl2ZTsNCisgIHBhcmFtLm1fcnRQYXJ0LkRlZmxhdGUobV9mQ1lCb3JkZXIsIG1fcnRDYXB0aW9uLmhlaWdodCwgbV9mQ1lCb3JkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fZkNYQm9yZGVyKTsNCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQorQ0ZXTF9XaWRnZXRJbXAqIENGV0xfRm9ybUltcDo6R2V0U3ViRm9jdXMoKSB7DQorICByZXR1cm4gbV9wU3ViRm9jdXM7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpTZXRTdWJGb2N1cyhDRldMX1dpZGdldEltcCogcFdpZGdldCkgew0KKyAgbV9wU3ViRm9jdXMgPSBwV2lkZ2V0Ow0KK30NCitDRlhfTWFwQWNjZWxlcmF0b3JzJiBDRldMX0Zvcm1JbXA6OkdldEFjY2VsZXJhdG9yKCkgew0KKyAgcmV0dXJuIG1fbWFwQWNjZWxlcmF0b3JzOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6U2V0QWNjZWxlcmF0b3IoQ0ZYX01hcEFjY2VsZXJhdG9ycyogcEFjY2VsZXJhdG9ycykgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwQWNjZWxlcmF0b3JzKTsNCisgIG1fbWFwQWNjZWxlcmF0b3JzLlJlbW92ZUFsbCgpOw0KKyAgRlhfRFdPUkQgdnJLZXksIHJWYWx1ZTsNCisgIEZYX1BPU0lUSU9OIHBvcyA9IHBBY2NlbGVyYXRvcnMtPkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwb3MpIHsNCisgICAgcEFjY2VsZXJhdG9ycy0+R2V0TmV4dEFzc29jKHBvcywgdnJLZXksIHJWYWx1ZSk7DQorICAgIG1fbWFwQWNjZWxlcmF0b3JzLlNldEF0KHZyS2V5LCByVmFsdWUpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6U2hvd0NoaWxkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwUGFyZW50KSB7DQorICBJRldMX0FwcCogcEFwcCA9IEZXTF9HZXRBcHAoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEFwcCk7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopcEFwcC0+R2V0V2lkZ2V0TWdyKCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBXaWRnZXRNZ3IpOw0KKyAgSUZXTF9XaWRnZXQqIHBDaGlsZCA9DQorICAgICAgcFdpZGdldE1nci0+R2V0V2lkZ2V0KHBQYXJlbnQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgcFdpZGdldE1nci0+U2hvd1dpZGdldF9OYXRpdmUocENoaWxkKTsNCisgICAgU2hvd0NoaWxkV2lkZ2V0KHBDaGlsZCk7DQorICAgIHBDaGlsZCA9IHBXaWRnZXRNZ3ItPkdldFdpZGdldChwQ2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpSZW1vdmVTeXNCdXR0b25zKCkgew0KKyAgbV9ydENhcHRpb24uUmVzZXQoKTsNCisgIGlmIChtX3BDbG9zZUJveCkgew0KKyAgICBkZWxldGUgbV9wQ2xvc2VCb3g7DQorICAgIG1fcENsb3NlQm94ID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BNaW5Cb3gpIHsNCisgICAgZGVsZXRlIG1fcE1pbkJveDsNCisgICAgbV9wTWluQm94ID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BNYXhCb3gpIHsNCisgICAgZGVsZXRlIG1fcE1heEJveDsNCisgICAgbV9wTWF4Qm94ID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BDYXB0aW9uQm94KSB7DQorICAgIGRlbGV0ZSBtX3BDYXB0aW9uQm94Ow0KKyAgICBtX3BDYXB0aW9uQm94ID0gTlVMTDsNCisgIH0NCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OkNhbGNDb250ZW50UmVjdChDRlhfUmVjdEYmIHJ0Q29udGVudCkgew0KKyNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorICBydENvbnRlbnQgPSBtX3J0UmVsYXRpdmU7DQorI2Vsc2UNCisgIEdldEVkZ2VSZWN0KHJ0Q29udGVudCk7DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIEZYX0ZMT0FUIGZFZGdlID0gR2V0RWRnZVdpZHRoKCk7DQorICAgIHJ0Q29udGVudC5EZWZsYXRlKGZFZGdlLCBmRWRnZSk7DQorICB9DQorI2VuZGlmDQorfQ0KK0NGV0xfU3lzQnRuKiBDRldMX0Zvcm1JbXA6OkdldFN5c0J0bkF0UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAobV9wQ2xvc2VCb3ggJiYgbV9wQ2xvc2VCb3gtPm1fcnRCdG4uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gbV9wQ2xvc2VCb3g7DQorICB9DQorICBpZiAobV9wTWF4Qm94ICYmIG1fcE1heEJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBtX3BNYXhCb3g7DQorICB9DQorICBpZiAobV9wTWluQm94ICYmIG1fcE1pbkJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBtX3BNaW5Cb3g7DQorICB9DQorICBpZiAobV9wQ2FwdGlvbkJveCAmJiBtX3BDYXB0aW9uQm94LT5tX3J0QnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIG1fcENhcHRpb25Cb3g7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0ZXTF9TeXNCdG4qIENGV0xfRm9ybUltcDo6R2V0U3lzQnRuQnlTdGF0ZShGWF9EV09SRCBkd1N0YXRlKSB7DQorICBpZiAobV9wQ2xvc2VCb3ggJiYgKG1fcENsb3NlQm94LT5tX2R3U3RhdGUgJiBkd1N0YXRlKSkgew0KKyAgICByZXR1cm4gbV9wQ2xvc2VCb3g7DQorICB9DQorICBpZiAobV9wTWF4Qm94ICYmIChtX3BNYXhCb3gtPm1fZHdTdGF0ZSAmIGR3U3RhdGUpKSB7DQorICAgIHJldHVybiBtX3BNYXhCb3g7DQorICB9DQorICBpZiAobV9wTWluQm94ICYmIChtX3BNaW5Cb3gtPm1fZHdTdGF0ZSAmIGR3U3RhdGUpKSB7DQorICAgIHJldHVybiBtX3BNaW5Cb3g7DQorICB9DQorICBpZiAobV9wQ2FwdGlvbkJveCAmJiAobV9wQ2FwdGlvbkJveC0+bV9kd1N0YXRlICYgZHdTdGF0ZSkpIHsNCisgICAgcmV0dXJuIG1fcENhcHRpb25Cb3g7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0ZXTF9TeXNCdG4qIENGV0xfRm9ybUltcDo6R2V0U3lzQnRuQnlJbmRleChpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfUHRyQXJyYXkgYXJyQnRuOw0KKyAgaWYgKG1fcE1pbkJveCkgew0KKyAgICBhcnJCdG4uQWRkKG1fcE1pbkJveCk7DQorICB9DQorICBpZiAobV9wTWF4Qm94KSB7DQorICAgIGFyckJ0bi5BZGQobV9wTWF4Qm94KTsNCisgIH0NCisgIGlmIChtX3BDbG9zZUJveCkgew0KKyAgICBhcnJCdG4uQWRkKG1fcENsb3NlQm94KTsNCisgIH0NCisgIHJldHVybiAoQ0ZXTF9TeXNCdG4qKWFyckJ0bltuSW5kZXhdOw0KK30NCitpbnQzMl90IENGV0xfRm9ybUltcDo6R2V0U3lzQnRuSW5kZXgoQ0ZXTF9TeXNCdG4qIHBCdG4pIHsNCisgIENGWF9QdHJBcnJheSBhcnJCdG47DQorICBpZiAobV9wTWluQm94KSB7DQorICAgIGFyckJ0bi5BZGQobV9wTWluQm94KTsNCisgIH0NCisgIGlmIChtX3BNYXhCb3gpIHsNCisgICAgYXJyQnRuLkFkZChtX3BNYXhCb3gpOw0KKyAgfQ0KKyAgaWYgKG1fcENsb3NlQm94KSB7DQorICAgIGFyckJ0bi5BZGQobV9wQ2xvc2VCb3gpOw0KKyAgfQ0KKyAgcmV0dXJuIGFyckJ0bi5GaW5kKHBCdG4pOw0KK30NCitGWF9GTE9BVCBDRldMX0Zvcm1JbXA6OkdldENhcHRpb25IZWlnaHQoKSB7DQorICBGWF9EV09SRCBkd0NhcGFjaXR5ID0gMDsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0NhcHRpb24pIHsNCisgICAgZHdDYXBhY2l0eSA9IEZXTF9XR1RDQVBBQ0lUWV9GUk1fQ1lDYXB0aW9uOw0KKyAgfSBlbHNlIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX05hcnJvd0NhcHRpb24pIHsNCisgICAgZHdDYXBhY2l0eSA9IEZXTF9XR1RDQVBBQ0lUWV9GUk1fQ1lOYXJyb3dDYXB0aW9uOw0KKyAgfQ0KKyAgaWYgKGR3Q2FwYWNpdHkgPiAwKSB7DQorICAgIEZYX0ZMT0FUKiBwZkNhcEhlaWdodCA9IChGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShkd0NhcGFjaXR5KTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwZkNhcEhlaWdodCwgMCk7DQorICAgIHJldHVybiAqcGZDYXBIZWlnaHQ7DQorICB9DQorICByZXR1cm4gMDsNCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OkRyYXdDYXB0aW9uVGV4dChDRlhfR3JhcGhpY3MqIHBHcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgSUZXTF9EYXRhUHJvdmlkZXIqIHBEYXRhID0gbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgcERhdGEtPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c1RleHQpOw0KKyAgaWYgKHdzVGV4dC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZXTF9UaGVtZVRleHQgdGV4dFBhcmFtOw0KKyAgdGV4dFBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHRleHRQYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0NhcHRpb247DQorICB0ZXh0UGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRlJNX05vcm1hbDsNCisgIHRleHRQYXJhbS5tX3BHcmFwaGljcyA9IHBHczsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHRleHRQYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCisgICAgcnRUZXh0ID0gbV9ydENhcHRpb25UZXh0Ow0KKyAgICBydFRleHQudG9wIC09IDU7DQorICB9IGVsc2Ugew0KKyAgICBydFRleHQgPSBtX3J0Q2FwdGlvbjsNCisgICAgRlhfRkxPQVQgZnBvczsNCisgICAgZnBvcyA9IEhhc0ljb24oKSA/IDI5LjBmIDogMTMuMGY7DQorICAgIHJ0VGV4dC5sZWZ0ICs9IGZwb3M7DQorICB9DQorICB0ZXh0UGFyYW0ubV9ydFBhcnQgPSBydFRleHQ7DQorICB0ZXh0UGFyYW0ubV93c1RleHQgPSB3c1RleHQ7DQorICB0ZXh0UGFyYW0ubV9kd1RUT1N0eWxlcyA9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lIHwgRkRFX1RUT1NUWUxFX0VsbGlwc2lzOw0KKyAgdGV4dFBhcmFtLm1faVRUT0FsaWduID0gbV9iQ3VzdG9taXplTGF5b3V0ID8gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCisgIHBUaGVtZS0+RHJhd1RleHQoJnRleHRQYXJhbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpEcmF3SWNvbkltYWdlKENGWF9HcmFwaGljcyogcEdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIElGV0xfRm9ybURQKiBwRGF0YSA9IChJRldMX0Zvcm1EUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0ljb247DQorICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHczsNCisgIHBhcmFtLm1fcEltYWdlID0gcERhdGEtPkdldEljb24obV9wSW50ZXJmYWNlLCBGQUxTRSk7DQorICBwYXJhbS5tX3J0UGFydCA9IG1fcnRJY29uOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OkdldEVkZ2VSZWN0KENGWF9SZWN0RiYgcnRFZGdlKSB7DQorICBydEVkZ2UgPSBtX3J0UmVsYXRpdmU7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Cb3JkZXIpIHsNCisgICAgRlhfRkxPQVQgZkNYID0gR2V0Qm9yZGVyU2l6ZSgpOw0KKyAgICBGWF9GTE9BVCBmQ1kgPSBHZXRCb3JkZXJTaXplKEZBTFNFKTsNCisgICAgcnRFZGdlLkRlZmxhdGUoZkNYLCBtX3J0Q2FwdGlvbi5IZWlnaHQoKSwgZkNYLCBmQ1kpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6U2V0V29ya0FyZWFSZWN0KCkgew0KKyAgbV9ydFJlc3RvcmUgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIHBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFdpZGdldE1ncik7DQorICBtX2JTZXRNYXhpbWl6ZSA9IFRSVUU7DQorICBwV2lkZ2V0TWdyLT5TZXRNYXhpbWl6ZV9OYXRpdmUobV9wSW50ZXJmYWNlKTsNCisgIFJlcGFpbnQoJm1fcnRSZWxhdGl2ZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpTZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBJRldMX0FkYXB0ZXJOYXRpdmUqIHBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyKiBwQ3Vyc29yTWdyID0gcE5hdGl2ZS0+R2V0Q3Vyc29yTWdyKCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBDdXJzb3JNZ3IpOw0KKyAgRlhfRFdPUkQgZHdIaXRUZXN0ID0gSGl0VGVzdChmeCwgZnkpOw0KKyAgc3dpdGNoIChkd0hpdFRlc3QpIHsNCisgICAgY2FzZSBGV0xfV0dUSElUVEVTVF9SaWdodDogew0KKyAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZVdFKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0Ow0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGlmIChwUHJlc3NlZEJ0biA9PSBtX3BPd25lci0+R2V0U3lzQnRuQnlTdGF0ZShGV0xfU1lTQlVUVE9OU1RBVEVfUHJlc3NlZCkpIHsNCi0gICAgICAgIHBQcmVzc2VkQnRuLT5TZXROb3JtYWwoKTsNCisgICAgY2FzZSBGV0xfV0dUSElUVEVTVF9Cb3R0b206IHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOUyk7DQorICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9Cb3R0b207DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKHBQcmVzc2VkQnRuID09IG1fcE93bmVyLT5tX3BNYXhCb3gpIHsNCi0gICAgICAgIGlmIChtX3BPd25lci0+bV9iTWF4aW1pemVkKSB7DQotICAgICAgICAgICAgbV9wT3duZXItPlNldFdpZGdldFJlY3QobV9wT3duZXItPm1fcnRSZXN0b3JlKTsNCi0gICAgICAgICAgICBtX3BPd25lci0+VXBkYXRlKCk7DQotICAgICAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9wT3duZXItPlNldFdvcmtBcmVhUmVjdCgpOw0KLSAgICAgICAgICAgIG1fcE93bmVyLT5VcGRhdGUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcE93bmVyLT5tX2JNYXhpbWl6ZWQgPSAhbV9wT3duZXItPm1fYk1heGltaXplZDsNCi0gICAgfSBlbHNlIGlmIChwUHJlc3NlZEJ0biA9PSBtX3BPd25lci0+bV9wTWluQm94KSB7DQotICAgICAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICAgICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwV2lkZ2V0TWdyKTsNCi0gICAgICAgIHBXaWRnZXRNZ3ItPlNldE1pbmltaXplX05hdGl2ZShtX3BPd25lci0+bV9wSW50ZXJmYWNlKTsNCisgICAgY2FzZSBGV0xfV0dUSElUVEVTVF9MZWZ0OiB7DQorICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplV0UpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgICAgIG1fZVJlc2l6ZVR5cGUgPSBGT1JNX1JFU0laRVRZUEVfTGVmdDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RISVRURVNUX1RvcDogew0KKyAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZU5TKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX1RvcDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RISVRURVNUX0xlZnRUb3A6IHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0NCisgICAgICAgICAgcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOV1NFKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX0xlZnRUb3A7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUSElUVEVTVF9MZWZ0Qm90dG9tOiB7DQorICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9DQorICAgICAgICAgIHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTkVTVyk7DQorICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9MZWZ0Qm90dG9tOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfUmlnaHRUb3A6IHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0NCisgICAgICAgICAgcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVORVNXKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0VG9wOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfUmlnaHRCb3R0b206IHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0NCisgICAgICAgICAgcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOV1NFKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0Qm90dG9tOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX0Fycm93KTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6TGF5b3V0KCkgew0KKyAgR2V0UmVsYXRpdmVSZWN0KG1fcnRSZWxhdGl2ZSk7DQorI2lmbmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorICBSZVNldFN5c0J0bigpOw0KKyNlbmRpZg0KKyAgaWYgKG1fcENvbnRlbnQpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0Q2xpZW50Ow0KKyAgICBHZXRDbGllbnRSZWN0KHJ0Q2xpZW50KTsNCisgICAgbV9wQ29udGVudC0+U2V0V2lkZ2V0UmVjdChydENsaWVudCk7DQorICAgIG1fcENvbnRlbnQtPlVwZGF0ZSgpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6UmVTZXRTeXNCdG4oKSB7DQorICBtX2ZDWEJvcmRlciA9ICooRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX0NYQm9yZGVyKTsNCisgIG1fZkNZQm9yZGVyID0gKihGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXIpOw0KKyAgUmVtb3ZlU3lzQnV0dG9ucygpOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgbV9iQ3VzdG9taXplTGF5b3V0ID0gcFRoZW1lLT5Jc0N1c3RvbWl6ZWRMYXlvdXQobV9wSW50ZXJmYWNlKTsNCisgIEZYX0ZMT0FUIGZDYXBIZWlnaHQgPSBHZXRDYXB0aW9uSGVpZ2h0KCk7DQorICBpZiAoZkNhcEhlaWdodCA+IDApIHsNCisgICAgbV9ydENhcHRpb24gPSBtX3J0UmVsYXRpdmU7DQorICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZDYXBIZWlnaHQ7DQorICB9DQorICBtX2lTeXNCb3ggPSAwOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQ2xvc2VCb3gpIHsNCisgICAgbV9wQ2xvc2VCb3ggPSBGWF9ORVcgQ0ZXTF9TeXNCdG47DQorICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCisgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9DbG9zZUJveDsNCisgICAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwYXJhbSwgbV9wQ2xvc2VCb3gtPm1fcnRCdG4pOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZXTF9FdnRDbG9zZSBlQ2xvc2U7DQotICAgICAgICBlQ2xvc2UubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCi0gICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZlQ2xvc2UpOw0KKyAgICAgIG1fcENsb3NlQm94LT5tX3J0QnRuLlNldCgNCisgICAgICAgICAgbV9ydFJlbGF0aXZlLnJpZ2h0KCkgLSBGV0xfU1lTQlROTUFSR0lOIC0gRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgIEZXTF9TWVNCVE5NQVJHSU4sIEZXTF9TWVNCVE5TSVpFLCBGV0xfU1lTQlROU0laRSk7DQogICAgIH0NCisgICAgbV9pU3lzQm94Kys7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9NYXhpbWl6ZUJveCkgew0KKyAgICBtX3BNYXhCb3ggPSBGWF9ORVcgQ0ZXTF9TeXNCdG47DQorICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCisgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveDsNCisgICAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwYXJhbSwgbV9wTWF4Qm94LT5tX3J0QnRuKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAobV9wQ2xvc2VCb3gpIHsNCisgICAgICAgIG1fcE1heEJveC0+bV9ydEJ0bi5TZXQoDQorICAgICAgICAgICAgbV9wQ2xvc2VCb3gtPm1fcnRCdG4ubGVmdCAtIEZXTF9TWVNCVE5TUEFOIC0gRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgICAgbV9wQ2xvc2VCb3gtPm1fcnRCdG4udG9wLCBGV0xfU1lTQlROU0laRSwgRldMX1NZU0JUTlNJWkUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BNYXhCb3gtPm1fcnRCdG4uU2V0KA0KKyAgICAgICAgICAgIG1fcnRSZWxhdGl2ZS5yaWdodCgpIC0gRldMX1NZU0JUTk1BUkdJTiAtIEZXTF9TWVNCVE5TSVpFLA0KKyAgICAgICAgICAgIEZXTF9TWVNCVE5NQVJHSU4sIEZXTF9TWVNCVE5TSVpFLCBGV0xfU1lTQlROU0laRSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG1faVN5c0JveCsrOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTWluaW1pemVCb3gpIHsNCisgICAgbV9wTWluQm94ID0gRlhfTkVXIENGV0xfU3lzQnRuOw0KKyAgICBpZiAobV9iQ3VzdG9taXplTGF5b3V0KSB7DQorICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fTWluaW1pemVCb3g7DQorICAgICAgcFRoZW1lLT5HZXRQYXJ0UmVjdCgmcGFyYW0sIG1fcE1pbkJveC0+bV9ydEJ0bik7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKG1fcE1heEJveCkgew0KKyAgICAgICAgbV9wTWluQm94LT5tX3J0QnRuLlNldCgNCisgICAgICAgICAgICBtX3BNYXhCb3gtPm1fcnRCdG4ubGVmdCAtIEZXTF9TWVNCVE5TUEFOIC0gRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgICAgbV9wTWF4Qm94LT5tX3J0QnRuLnRvcCwgRldMX1NZU0JUTlNJWkUsIEZXTF9TWVNCVE5TSVpFKTsNCisgICAgICB9IGVsc2UgaWYgKG1fcENsb3NlQm94KSB7DQorICAgICAgICBtX3BNaW5Cb3gtPm1fcnRCdG4uU2V0KA0KKyAgICAgICAgICAgIG1fcENsb3NlQm94LT5tX3J0QnRuLmxlZnQgLSBGV0xfU1lTQlROU1BBTiAtIEZXTF9TWVNCVE5TSVpFLA0KKyAgICAgICAgICAgIG1fcENsb3NlQm94LT5tX3J0QnRuLnRvcCwgRldMX1NZU0JUTlNJWkUsIEZXTF9TWVNCVE5TSVpFKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wTWluQm94LT5tX3J0QnRuLlNldCgNCisgICAgICAgICAgICBtX3J0UmVsYXRpdmUucmlnaHQoKSAtIEZXTF9TWVNCVE5NQVJHSU4gLSBGV0xfU1lTQlROU0laRSwNCisgICAgICAgICAgICBGV0xfU1lTQlROTUFSR0lOLCBGV0xfU1lTQlROU0laRSwgRldMX1NZU0JUTlNJWkUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX2lTeXNCb3grKzsNCisgIH0NCisgIElGV0xfRm9ybURQKiBwRGF0YSA9IChJRldMX0Zvcm1EUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSWNvbiAmJg0KKyAgICAgIHBEYXRhLT5HZXRJY29uKG1fcEludGVyZmFjZSwgRkFMU0UpKSB7DQorICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCisgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9JY29uOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXItPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c1RleHQpOw0KKyAgICAgIHBhcmFtLm1fcERhdGEgPSAmd3NUZXh0Ow0KKyAgICAgIHBUaGVtZS0+R2V0UGFydFJlY3QoJnBhcmFtLCBtX3J0SWNvbik7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9ydEljb24uU2V0KDUsIChtX3J0Q2FwdGlvbi5oZWlnaHQgLSBtX2ZTbWFsbEljb25TeikgLyAyLCBtX2ZTbWFsbEljb25TeiwNCisgICAgICAgICAgICAgICAgICAgbV9mU21hbGxJY29uU3opOw0KKyAgICB9DQorICB9DQorICBpZiAobV9iQ3VzdG9taXplTGF5b3V0KSB7DQorICAgIENGV0xfVGhlbWVUZXh0IHBhcm1hOw0KKyAgICBwYXJtYS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcm1hLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fSGVhZFRleHQ7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHBhcm1hLm1fd3NUZXh0KTsNCisgICAgcFRoZW1lLT5HZXRQYXJ0UmVjdCgmcGFybWEsIG1fcnRDYXB0aW9uVGV4dCk7DQorICB9DQogfQ0KLXZvaWQgQ0ZXTF9Gb3JtRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBpZiAobV9wT3duZXItPm1fYkxCdXR0b25Eb3duKSB7DQotICAgICAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKnBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KLSAgICAgICAgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyICpwQ3Vyc29yTWdyID0gcE5hdGl2ZS0+R2V0Q3Vyc29yTWdyKCk7DQotICAgICAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBDdXJzb3JNZ3IpOw0KLSAgICAgICAgQ0ZXTF9TeXNCdG4gKnBQcmVzc2VkQnRuID0gbV9wT3duZXItPkdldFN5c0J0bkJ5SW5kZXgobV9wT3duZXItPm1faUNhcHR1cmVCdG4pOw0KLSAgICAgICAgRlhfRkxPQVQgZlRvcCwgZkxlZnQsIGZXaWR0aCwgZkhlaWdodDsNCi0gICAgICAgIGZUb3AgPSBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3A7DQotICAgICAgICBmTGVmdCA9IG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmxlZnQ7DQotICAgICAgICBmV2lkdGggPSBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aDsNCi0gICAgICAgIGZIZWlnaHQgPSBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQ7DQotICAgICAgICBGWF9GTE9BVCBmV2lkdGhNYXgsIGZXaWR0aE1pbiwgZkhlaWdodE1heCwgZkhlaWdodE1pbjsNCi0gICAgICAgIGlmIChtX3BPd25lci0+bV9wQ29udGVudCkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5HZXRDb250ZW50KCktPkdldE1heFNpemUoZldpZHRoTWF4LCBmSGVpZ2h0TWF4KTsNCi0gICAgICAgICAgICBtX3BPd25lci0+R2V0Q29udGVudCgpLT5HZXRNaW5TaXplKGZXaWR0aE1pbiwgZkhlaWdodE1pbik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZXaWR0aE1heCA9IGZIZWlnaHRNYXggPSAxMDI0ICogNDsNCi0gICAgICAgICAgICBmV2lkdGhNaW4gPSBmSGVpZ2h0TWluID0gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0JPT0wgYldpZHRobGltaXQgPSAoZldpZHRoTWluICE9IDAgfHwgZldpZHRoTWF4ICE9IDApOw0KLSAgICAgICAgRlhfQk9PTCBiSGVpZ2h0bGltaXQgPSAoZkhlaWdodE1pbiAhPSAwIHx8IGZIZWlnaHRNYXggIT0gMCk7DQotICAgICAgICBGWF9CT09MIGJTaXplbGltaXQgPSBiV2lkdGhsaW1pdCB8fCBiSGVpZ2h0bGltaXQ7DQotICAgICAgICBpZiAoZldpZHRoTWF4ICE9IDAgfHwgZkhlaWdodE1heCAhPSAwIHx8IGZXaWR0aE1pbiAhPSAwIHx8IGZIZWlnaHRNaW4gIT0gMCkgew0KLSAgICAgICAgICAgIGJTaXplbGltaXQgPSBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBQcmVzc2VkQnRuKSB7DQotICAgICAgICAgICAgaWYgKCFwUHJlc3NlZEJ0bi0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KLSAgICAgICAgICAgICAgICBwUHJlc3NlZEJ0bi0+U2V0Tm9ybWFsKCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcFByZXNzZWRCdG4tPlNldFByZXNzZWQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnBQcmVzc2VkQnRuLT5tX3J0QnRuKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2JNYXhpbWl6ZWQpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9DYXApIHsNCi0gICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5PZmZzZXQocE1zZy0+bV9meCAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCwgcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSk7DQotICAgICAgICAgICAgcFdpZGdldE1nci0+U2V0V2lkZ2V0UG9zaXRpb25fTmF0aXZlKG1fcE93bmVyLT5tX3BJbnRlcmZhY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmxlZnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LnRvcCk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9PSBGT1JNX1JFU0laRVRZUEVfUmlnaHQpIHsNCi0gICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVXRSk7DQotICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KLSAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQotICAgICAgICAgICAgaWYgKCFiV2lkdGhsaW1pdCkgew0KLSAgICAgICAgICAgICAgICBmV2lkdGggKz0gcE1zZy0+bV9meCAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueDsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54ID0gcE1zZy0+bV9meDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+RG9XaWR0aExpbWl0KGZMZWZ0LCBmV2lkdGgsIHBNc2ctPm1fZngsIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3N6U3RhcnQueCAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCwgZldpZHRoTWluLCBmV2lkdGhNYXgsIEZBTFNFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9MZWZ0KSB7DQotICAgICAgICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplV0UpOw0KLSAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCi0gICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KLSAgICAgICAgICAgIGlmICghYldpZHRobGltaXQpIHsNCi0gICAgICAgICAgICAgICAgZkxlZnQgLT0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54IC0gcE1zZy0+bV9meDsNCi0gICAgICAgICAgICAgICAgZldpZHRoICs9IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPkRvV2lkdGhMaW1pdChmTGVmdCwgZldpZHRoLCBwTXNnLT5tX2Z4LCBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsIGZXaWR0aE1pbiwgZldpZHRoTWF4LCBUUlVFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9Cb3R0b20pIHsNCi0gICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOUyk7DQotICAgICAgICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KLSAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQotICAgICAgICAgICAgaWYgKCFiSGVpZ2h0bGltaXQpIHsNCi0gICAgICAgICAgICAgICAgZkhlaWdodCArPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnkgPSBwTXNnLT5tX2Z5Ow0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5Eb0hlaWdodExpbWl0KGZUb3AsIGZIZWlnaHQsIHBNc2ctPm1fZnksIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3N6U3RhcnQueSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSwgZkhlaWdodE1pbiwgZkhlaWdodE1heCwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX1RvcCkgew0KLSAgICAgICAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZU5TKTsNCi0gICAgICAgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQotICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCi0gICAgICAgICAgICBpZiAoIWJIZWlnaHRsaW1pdCkgew0KLSAgICAgICAgICAgICAgICBmVG9wICs9IHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0Lnk7DQotICAgICAgICAgICAgICAgIGZIZWlnaHQgLT0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+RG9IZWlnaHRMaW1pdChmVG9wLCBmSGVpZ2h0LCBwTXNnLT5tX2Z5LCBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnksIGZIZWlnaHRNaW4sIGZIZWlnaHRNYXgsIFRSVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX0xlZnRUb3ApIHsNCi0gICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOV1NFKTsNCi0gICAgICAgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQotICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCi0gICAgICAgICAgICBpZiAoIWJTaXplbGltaXQpIHsNCi0gICAgICAgICAgICAgICAgZkxlZnQgLT0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54IC0gcE1zZy0+bV9meDsNCi0gICAgICAgICAgICAgICAgZlRvcCArPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPiBtX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCi0gICAgICAgICAgICAgICAgZldpZHRoICs9IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQotICAgICAgICAgICAgICAgIGZIZWlnaHQgLT0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54ID0gcE1zZy0+bV9meDsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55ID0gcE1zZy0+bV9meTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+RG9XaWR0aExpbWl0KGZMZWZ0LCBmV2lkdGgsIHBNc2ctPm1fZngsIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCwgZldpZHRoTWluLCBmV2lkdGhNYXgsIFRSVUUpOw0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+RG9IZWlnaHRMaW1pdChmVG9wLCBmSGVpZ2h0LCBwTXNnLT5tX2Z5LCBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnksIGZIZWlnaHRNaW4sIGZIZWlnaHRNYXgsIFRSVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX0xlZnRCb3R0b20pIHsNCi0gICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVORVNXKTsNCi0gICAgICAgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQotICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCi0gICAgICAgICAgICBpZiAoIWJTaXplbGltaXQpIHsNCi0gICAgICAgICAgICAgICAgZkxlZnQgLT0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54IC0gcE1zZy0+bV9meDsNCi0gICAgICAgICAgICAgICAgZldpZHRoICs9IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQotICAgICAgICAgICAgICAgIGZIZWlnaHQgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54ID0gcE1zZy0+bV9meDsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55ID0gcE1zZy0+bV9meTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+RG9XaWR0aExpbWl0KGZMZWZ0LCBmV2lkdGgsIHBNc2ctPm1fZngsIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCwgZldpZHRoTWluLCBmV2lkdGhNYXgsIFRSVUUpOw0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+RG9IZWlnaHRMaW1pdChmVG9wLCBmSGVpZ2h0LCBwTXNnLT5tX2Z5LCBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9zelN0YXJ0LnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnksIGZIZWlnaHRNaW4sIGZIZWlnaHRNYXgsIEZBTFNFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9SaWdodFRvcCkgew0KLSAgICAgICAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZU5FU1cpOw0KLSAgICAgICAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCi0gICAgICAgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KLSAgICAgICAgICAgIGlmICghYlNpemVsaW1pdCkgew0KLSAgICAgICAgICAgICAgICBmVG9wICs9IHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0Lnk7DQotICAgICAgICAgICAgICAgIGZXaWR0aCArPSBwTXNnLT5tX2Z4IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54Ow0KLSAgICAgICAgICAgICAgICBmSGVpZ2h0IC09IHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0Lnk7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCA9IHBNc2ctPm1fZng7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSA9IHBNc2ctPm1fZnk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPkRvV2lkdGhMaW1pdChmTGVmdCwgZldpZHRoLCBwTXNnLT5tX2Z4LCBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9zelN0YXJ0LnggLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsIGZXaWR0aE1pbiwgZldpZHRoTWF4LCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIG1fcE93bmVyLT5Eb0hlaWdodExpbWl0KGZUb3AsIGZIZWlnaHQsIHBNc2ctPm1fZnksIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSwgZkhlaWdodE1pbiwgZkhlaWdodE1heCwgVFJVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9PSBGT1JNX1JFU0laRVRZUEVfUmlnaHRCb3R0b20pIHsNCi0gICAgICAgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOV1NFKTsNCi0gICAgICAgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQotICAgICAgICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCi0gICAgICAgICAgICBpZiAoIWJTaXplbGltaXQpIHsNCi0gICAgICAgICAgICAgICAgZldpZHRoICs9IHBNc2ctPm1fZnggLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0Lng7DQotICAgICAgICAgICAgICAgIGZIZWlnaHQgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54ID0gcE1zZy0+bV9meDsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55ID0gcE1zZy0+bV9meTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX3BPd25lci0+RG9XaWR0aExpbWl0KGZMZWZ0LCBmV2lkdGgsIHBNc2ctPm1fZngsIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3N6U3RhcnQueCAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCwgZldpZHRoTWluLCBmV2lkdGhNYXgsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgbV9wT3duZXItPkRvSGVpZ2h0TGltaXQoZlRvcCwgZkhlaWdodCwgcE1zZy0+bV9meSwgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fc3pTdGFydC55IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55LCBmSGVpZ2h0TWluLCBmSGVpZ2h0TWF4LCBGQUxTRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BDb250ZW50KSB7DQotICAgICAgICB9DQotICAgICAgICBDRlhfUmVjdEYgcnRGb3JtOw0KLSAgICAgICAgcnRGb3JtLlNldChmTGVmdCwgZlRvcCwgZldpZHRoLCBmSGVpZ2h0KTsNCi0jaWYgKF9GWF9PU189PV9GWF9NQUNPU1hfKQ0KLSAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQgPSBydEZvcm07DQotICAgICAgICBtX3BPd25lci0+VXBkYXRlKCk7DQotICAgICAgICBtX3BPd25lci0+U2V0V2lkZ2V0UmVjdChydEZvcm0pOw0KLSNlbHNlDQotICAgICAgICBtX3BPd25lci0+U2V0V2lkZ2V0UmVjdChydEZvcm0pOw0KLSAgICAgICAgbV9wT3duZXItPlVwZGF0ZSgpOw0KLSNlbmRpZg0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQm9yZGVyKSAmJg0KLSAgICAgICAgICAgIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9GUk1fUmVzaXplKSAmJg0KLSAgICAgICAgICAgICFtX3BPd25lci0+bV9iTWF4aW1pemVkKSB7DQotICAgICAgICBtX3BPd25lci0+U2V0Q3Vyc29yKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KLSAgICB9DQotICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQotICAgIHJ0SW52YWxpZGF0ZS5SZXNldCgpOw0KLSAgICBDRldMX1N5c0J0biAqcFBvaW50QnRuID0gbV9wT3duZXItPkdldFN5c0J0bkF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgIENGV0xfU3lzQnRuICpwT2xkSG92ZXIgPSBtX3BPd25lci0+R2V0U3lzQnRuQnlTdGF0ZShGV0xfU1lTQlVUVE9OU1RBVEVfSG92ZXIpOw0KLSNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQotICAgIHsNCi0gICAgICAgIGlmIChwT2xkSG92ZXIgJiYgcFBvaW50QnRuICE9IHBPbGRIb3Zlcikgew0KLSAgICAgICAgICAgIHBPbGRIb3Zlci0+U2V0Tm9ybWFsKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAocFBvaW50QnRuICYmIHBQb2ludEJ0biAhPSBwT2xkSG92ZXIpIHsNCi0gICAgICAgICAgICBwUG9pbnRCdG4tPlNldEhvdmVyKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wT3duZXItPm1fcENsb3NlQm94KSB7DQotICAgICAgICAgICAgcnRJbnZhbGlkYXRlID0gbV9wT3duZXItPm1fcENsb3NlQm94LT5tX3J0QnRuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BNYXhCb3gpIHsNCi0gICAgICAgICAgICBpZiAocnRJbnZhbGlkYXRlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBydEludmFsaWRhdGUgPSBtX3BPd25lci0+bV9wTWF4Qm94LT5tX3J0QnRuOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihtX3BPd25lci0+bV9wTWF4Qm94LT5tX3J0QnRuKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wT3duZXItPm1fcE1pbkJveCkgew0KLSAgICAgICAgICAgIGlmIChydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZSA9IG1fcE93bmVyLT5tX3BNaW5Cb3gtPm1fcnRCdG47DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcnRJbnZhbGlkYXRlLlVuaW9uKG1fcE93bmVyLT5tX3BNaW5Cb3gtPm1fcnRCdG4pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghcnRJbnZhbGlkYXRlLklzRW1wdHkoKSAmJiBydEludmFsaWRhdGUuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCi0gICAgICAgICAgICBtX3BPd25lci0+bV9iTW91c2VJbiA9IFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0jZWxzZQ0KLSAgICB7DQotICAgICAgICBpZiAocE9sZEhvdmVyICYmIHBQb2ludEJ0biAhPSBwT2xkSG92ZXIpIHsNCi0gICAgICAgICAgICBwT2xkSG92ZXItPlNldE5vcm1hbCgpOw0KLSAgICAgICAgICAgIHJ0SW52YWxpZGF0ZSA9IHBPbGRIb3Zlci0+bV9ydEJ0bjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwUG9pbnRCdG4gJiYgcFBvaW50QnRuICE9IHBPbGRIb3Zlcikgew0KLSAgICAgICAgICAgIHBQb2ludEJ0bi0+U2V0SG92ZXIoKTsNCi0gICAgICAgICAgICBpZiAocnRJbnZhbGlkYXRlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBydEludmFsaWRhdGUgPSBwUG9pbnRCdG4tPm1fcnRCdG47DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcnRJbnZhbGlkYXRlLlVuaW9uKHBQb2ludEJ0bi0+bV9ydEJ0bik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotI2VuZGlmDQotICAgIGlmICghcnRJbnZhbGlkYXRlLklzRW1wdHkoKSkgew0KLSAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQotICAgIH0NCit2b2lkIENGV0xfRm9ybUltcDo6UmVnaXN0ZXJGb3JtKCkgew0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQorICBDRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBEcml2ZXIpOw0KKyAgcERyaXZlci0+UmVnaXN0ZXJGb3JtKHRoaXMpOw0KIH0NCi12b2lkIENGV0xfRm9ybURlbGVnYXRlOjpPbk1vdXNlSG92ZXIoQ0ZXTF9Nc2dNb3VzZSAqcE1zZykNCi17DQordm9pZCBDRldMX0Zvcm1JbXA6OlVuUmVnaXN0ZXJGb3JtKCkgew0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQorICBDRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBEcml2ZXIpOw0KKyAgcERyaXZlci0+VW5SZWdpc3RlckZvcm0odGhpcyk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Gb3JtSW1wOjpJc0RvTW9kYWwoKSB7DQorICByZXR1cm4gbV9iRG9Nb2RhbEZsYWc7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpTZXRUaGVtZURhdGEoKSB7DQorICBtX2ZTbWFsbEljb25TeiA9ICooRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX0ZSTV9TbWFsbEljb24pOw0KKyAgbV9mQmlnSWNvblN6ID0gKihGWF9GTE9BVCopR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfRlJNX0JpZ0ljb24pOw0KK30NCitGWF9CT09MIENGV0xfRm9ybUltcDo6SGFzSWNvbigpIHsNCisgIElGV0xfRm9ybURQKiBwRGF0YSA9IChJRldMX0Zvcm1EUCopbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyOw0KKyAgcmV0dXJuIHBEYXRhLT5HZXRJY29uKG1fcEludGVyZmFjZSwgRkFMU0UpID8gVFJVRSA6IEZBTFNFOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6VXBkYXRlSWNvbigpIHsNCisgIENGV0xfV2lkZ2V0TWdyKiBwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBXaWRnZXRNZ3IpOw0KKyAgSUZXTF9Gb3JtRFAqIHBEYXRhID0gKElGV0xfRm9ybURQKiltX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICBDRlhfRElCaXRtYXAqIHBCaWdJY29uID0gcERhdGEtPkdldEljb24obV9wSW50ZXJmYWNlLCBUUlVFKTsNCisgIENGWF9ESUJpdG1hcCogcFNtYWxsSWNvbiA9IHBEYXRhLT5HZXRJY29uKG1fcEludGVyZmFjZSwgRkFMU0UpOw0KKyAgaWYgKHBCaWdJY29uICYmIHBCaWdJY29uICE9IG1fcEJpZ0ljb24pIHsNCisgICAgbV9wQmlnSWNvbiA9IHBCaWdJY29uOw0KKyAgICBwV2lkZ2V0TWdyLT5TZXRXaWRnZXRJY29uX05hdGl2ZShtX3BJbnRlcmZhY2UsIG1fcEJpZ0ljb24sIFRSVUUpOw0KKyAgfQ0KKyAgaWYgKHBTbWFsbEljb24gJiYgcFNtYWxsSWNvbiAhPSBtX3BTbWFsbEljb24pIHsNCisgICAgbV9wU21hbGxJY29uID0gcFNtYWxsSWNvbjsNCisgICAgcFdpZGdldE1nci0+U2V0V2lkZ2V0SWNvbl9OYXRpdmUobV9wSW50ZXJmYWNlLCBtX3BCaWdJY29uLCBGQUxTRSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpVcGRhdGVDYXB0aW9uKCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIHBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFdpZGdldE1ncik7DQorICBJRldMX0Zvcm1EUCogcERhdGEgPSAoSUZXTF9Gb3JtRFAqKW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocERhdGEpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgdGV4dDsNCisgIHBEYXRhLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgdGV4dCk7DQorICBwV2lkZ2V0TWdyLT5TZXRXaWRnZXRDYXB0aW9uX05hdGl2ZShtX3BJbnRlcmZhY2UsIHRleHQpOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6RG9XaWR0aExpbWl0KEZYX0ZMT0FUJiBmTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ3VyWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGFjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW1pdE1pbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW1pdE1heCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxlZnQpIHsNCisgIEZYX0ZMT0FUIGZ4ID0gZkN1clg7DQorICBGWF9GTE9BVCBmeSA9IDA7DQorICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KKyAgRlhfRkxPQVQgZlRlbXAgPQ0KKyAgICAgIGJMZWZ0ID8gKGZXaWR0aCAtIGZ4ICsgZkxlZnQgKyBmU3BhY2UpIDogKGZ4IC0gZkxlZnQgKyBmU3BhY2UpOw0KKyAgaWYgKGZUZW1wID49IGZMaW1pdE1pbiAmJiBmVGVtcCA8PSBmTGltaXRNYXgpIHsNCisgICAgZldpZHRoID0gZlRlbXA7DQorICAgIGZMZWZ0ICs9IGJMZWZ0ID8gKGZ4IC0gZkxlZnQgLSBmU3BhY2UpIDogMDsNCisgIH0gZWxzZSB7DQorICAgIGlmIChmVGVtcCA8IGZMaW1pdE1pbiAmJiBmV2lkdGggPiBmTGltaXRNaW4pIHsNCisgICAgICBmTGVmdCArPSBiTGVmdCA/IChmV2lkdGggLSBmTGltaXRNaW4pIDogMDsNCisgICAgICBmV2lkdGggPSBmTGltaXRNaW47DQorICAgIH0gZWxzZSBpZiAoZlRlbXAgPiBmTGltaXRNYXggJiYgZldpZHRoIDwgZkxpbWl0TWF4KSB7DQorICAgICAgZkxlZnQgLT0gYkxlZnQgPyAoZkxpbWl0TWF4IC0gZldpZHRoKSA6IDA7DQorICAgICAgZldpZHRoID0gZkxpbWl0TWF4Ow0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpEb0hlaWdodExpbWl0KEZYX0ZMT0FUJiBmVG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDdXJZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGFjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGltaXRNaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbWl0TWF4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRvcCkgew0KKyAgRlhfRkxPQVQgZnggPSAwOw0KKyAgRlhfRkxPQVQgZnkgPSBmQ3VyWTsNCisgIFRyYW5zZm9ybVRvKE5VTEwsIGZ4LCBmeSk7DQorICBGWF9GTE9BVCBmVGVtcCA9IGJUb3AgPyAoZkhlaWdodCAtIGZ5ICsgZlRvcCArIGZTcGFjZSkgOiAoZnkgLSBmVG9wICsgZlNwYWNlKTsNCisgIGlmIChmVGVtcCA+PSBmTGltaXRNaW4gJiYgZlRlbXAgPD0gZkxpbWl0TWF4KSB7DQorICAgIGZIZWlnaHQgPSBmVGVtcDsNCisgICAgZlRvcCArPSBiVG9wID8gKGZ5IC0gZlRvcCAtIGZTcGFjZSkgOiAwOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKGZUZW1wIDwgZkxpbWl0TWluICYmIGZIZWlnaHQgPiBmTGltaXRNaW4pIHsNCisgICAgICBmVG9wICs9IGJUb3AgPyAoZkhlaWdodCAtIGZMaW1pdE1pbikgOiAwOw0KKyAgICAgIGZIZWlnaHQgPSBmTGltaXRNaW47DQorICAgIH0gZWxzZSBpZiAoZlRlbXAgPiBmTGltaXRNYXggJiYgZkhlaWdodCA8IGZMaW1pdE1heCkgew0KKyAgICAgIGZUb3AgLT0gYlRvcCA/IChmTGltaXRNYXggLSBmSGVpZ2h0KSA6IDA7DQorICAgICAgZkhlaWdodCA9IGZMaW1pdE1heDsNCisgICAgfQ0KKyAgfQ0KK30NCitDRldMX0Zvcm1EZWxlZ2F0ZTo6Q0ZXTF9Gb3JtRGVsZWdhdGUoQ0ZXTF9Gb3JtSW1wKiBwT3duZXIpIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9Gb3JtRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLCAwKTsNCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBpbnQzMl90IGlSZXQgPSAxOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9BY3RpdmF0ZTogew0KKyAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQorICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0UmVsYXRpdmUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfRGVhY3RpdmF0ZTogew0KKyAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZDsNCisgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSZWxhdGl2ZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisjZWxzZQ0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQorICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaW50MzJfdCBpUmV0ID0gMTsNCisgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgIGNhc2UgRldMX01TR0hBU0hfQWN0aXZhdGU6IHsNCisgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KKyAgICAgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IG1fcE93bmVyLT5HZXRPd25lclRocmVhZCgpOw0KKyAgICAgIENGV0xfTm90ZURyaXZlciogcERyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgICAgICBDRldMX1dpZGdldEltcCogcFN1YkZvY3VzSW1wID0gbV9wT3duZXItPkdldFN1YkZvY3VzKCk7DQorICAgICAgSUZXTF9XaWRnZXQqIHBTdWJGb2N1cyA9DQorICAgICAgICAgIHBTdWJGb2N1c0ltcCA/IHBTdWJGb2N1c0ltcC0+R2V0SW50ZXJmYWNlKCkgOiBOVUxMOw0KKyAgICAgIGlmIChwU3ViRm9jdXMgJiYgcFN1YkZvY3VzICE9IHBEcml2ZXItPkdldEZvY3VzKCkpIHsNCisgICAgICAgIHBEcml2ZXItPlNldEZvY3VzKHBTdWJGb2N1cyk7DQorICAgICAgfQ0KKyAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydFJlbGF0aXZlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0RlYWN0aXZhdGU6IHsNCisgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQorICAgICAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gbV9wT3duZXItPkdldE93bmVyVGhyZWFkKCk7DQorICAgICAgQ0ZXTF9Ob3RlRHJpdmVyKiBwRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICAgIENGV0xfV2lkZ2V0SW1wKiBwU3ViRm9jdXNJbXAgPSBtX3BPd25lci0+R2V0U3ViRm9jdXMoKTsNCisgICAgICBJRldMX1dpZGdldCogcFN1YkZvY3VzID0NCisgICAgICAgICAgcFN1YkZvY3VzSW1wID8gcFN1YkZvY3VzSW1wLT5HZXRJbnRlcmZhY2UoKSA6IE5VTEw7DQorICAgICAgaWYgKHBTdWJGb2N1cykgew0KKyAgICAgICAgaWYgKHBTdWJGb2N1cyA9PSBwRHJpdmVyLT5HZXRGb2N1cygpKSB7DQorICAgICAgICAgIHBEcml2ZXItPlNldEZvY3VzKE5VTEwpOw0KKyAgICAgICAgfSBlbHNlIGlmIChwU3ViRm9jdXMtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCisgICAgICAgICAgQ0ZXTF9Nc2dLaWxsRm9jdXMgbXM7DQorICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBTdWJGb2N1cy0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICAgIGlmIChwRGVsZWdhdGUpIHsNCisgICAgICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UoJm1zKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSZWxhdGl2ZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KKyAgICAgIENGV0xfTXNnTW91c2UqIHBNc2cgPSAoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2U7DQorICAgICAgc3dpdGNoIChwTXNnLT5tX2R3Q21kKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCisgICAgICAgICAgT25Nb3VzZU1vdmUocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VIb3Zlcjogew0KKyAgICAgICAgICBPbk1vdXNlSG92ZXIocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTogew0KKyAgICAgICAgICBPbk1vdXNlTGVhdmUocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRibENsazogew0KKyAgICAgICAgICBPbkxCdXR0b25EYmxDbGsocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX1NpemU6IHsNCisgICAgICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldE1nciwgMCk7DQorICAgICAgcFdpZGdldE1nci0+QWRkUmVkcmF3Q291bnRzKG1fcE93bmVyLT5tX3BJbnRlcmZhY2UpOw0KKyAgICAgIGlmICghbV9wT3duZXItPm1fYlNldE1heGltaXplKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgbV9wT3duZXItPm1fYlNldE1heGltaXplID0gRkFMU0U7DQorICAgICAgQ0ZXTF9Nc2dTaXplKiBwTXNnID0gKENGV0xfTXNnU2l6ZSopcE1lc3NhZ2U7DQorICAgICAgQ0ZYX1JlY3RGIHJ0Ow0KKyAgICAgIHBXaWRnZXRNZ3ItPkdldFdpZGdldFJlY3RfTmF0aXZlKG1fcE93bmVyLT5tX3BJbnRlcmZhY2UsIHJ0KTsNCisgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0ID0gcnQubGVmdDsNCisgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3AgPSBydC50b3A7DQorICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGggPSAoRlhfRkxPQVQpcE1zZy0+bV9pV2lkdGg7DQorICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0ID0gKEZYX0ZMT0FUKXBNc2ctPm1faUhlaWdodDsNCisgICAgICBtX3BPd25lci0+VXBkYXRlKCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9XaW5kb3dNb3ZlOiB7DQorICAgICAgT25XaW5kb3dNb3ZlKChDRldMX01zZ1dpbmRvd01vdmUqKXBNZXNzYWdlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0Nsb3NlOiB7DQorICAgICAgT25DbG9zZSgoQ0ZXTF9Nc2dDbG9zZSopcE1lc3NhZ2UpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgaVJldCA9IDA7IH0NCisgIH0NCisgIHJldHVybiBpUmV0Ow0KKyNlbmRpZg0KK30NCitGV0xfRVJSIENGV0xfRm9ybURlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEV2ZW50LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKHBFdmVudC0+R2V0Q2xhc3NJRCgpID09IEZXTF9FVlRIQVNIX0Nsb3NlICYmDQorICAgICAgcEV2ZW50LT5tX3BTcmNUYXJnZXQgPT0gbV9wT3duZXItPm1fcEludGVyZmFjZSkgew0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRm9ybURlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfRm9ybURlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIG1fcE93bmVyLT5TZXRHcmFiKFRSVUUpOw0KKyAgbV9wT3duZXItPm1fYkxCdXR0b25Eb3duID0gVFJVRTsNCisgIG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX05vbmU7DQorICBDRldMX1N5c0J0biogcFByZXNzQnRuID0gbV9wT3duZXItPkdldFN5c0J0bkF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICBtX3BPd25lci0+bV9pQ2FwdHVyZUJ0biA9IG1fcE93bmVyLT5HZXRTeXNCdG5JbmRleChwUHJlc3NCdG4pOw0KKyAgQ0ZYX1JlY3RGIHJ0Q2FwOw0KKyAgcnRDYXAuU2V0KG1fcE93bmVyLT5tX3J0Q2FwdGlvbi5sZWZ0ICsgbV9wT3duZXItPm1fZkNZQm9yZGVyLA0KKyAgICAgICAgICAgIG1fcE93bmVyLT5tX3J0Q2FwdGlvbi50b3AgKyBtX3BPd25lci0+bV9mQ1hCb3JkZXIsDQorICAgICAgICAgICAgbV9wT3duZXItPm1fcnRDYXB0aW9uLndpZHRoIC0gRldMX1NZU0JUTlNJWkUgKiBtX3BPd25lci0+bV9pU3lzQm94IC0NCisgICAgICAgICAgICAgICAgMiAqIG1fcE93bmVyLT5tX2ZDWUJvcmRlciwNCisgICAgICAgICAgICBtX3BPd25lci0+bV9ydENhcHRpb24uaGVpZ2h0IC0gbV9wT3duZXItPm1fZkNYQm9yZGVyKTsNCisgIGlmIChwUHJlc3NCdG4pIHsNCisgICAgcFByZXNzQnRuLT5TZXRQcmVzc2VkKCk7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZwUHJlc3NCdG4tPm1fcnRCdG4pOw0KKyAgfSBlbHNlIGlmIChydENhcC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9DYXA7DQorICB9IGVsc2UgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Cb3JkZXIpICYmDQorICAgICAgICAgICAgIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmDQorICAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfRlJNX1Jlc2l6ZSkgJiYNCisgICAgICAgICAgICAgIW1fcE93bmVyLT5tX2JNYXhpbWl6ZWQpIHsNCiAgICAgbV9wT3duZXItPlNldEN1cnNvcihwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIH0NCisgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQuU2V0KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fc3pTdGFydC5TZXQoDQorICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQorICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCiB9DQotdm9pZCBDRldMX0Zvcm1EZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBDRldMX1N5c0J0biAqcEhvdmVyID0gbV9wT3duZXItPkdldFN5c0J0bkJ5U3RhdGUoRldMX1NZU0JVVFRPTlNUQVRFX0hvdmVyKTsNCi0gICAgaWYgKHBIb3Zlcikgew0KLSAgICAgICAgcEhvdmVyLT5TZXROb3JtYWwoKTsNCi0gICAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZwSG92ZXItPm1fcnRCdG4pOw0KK3ZvaWQgQ0ZXTF9Gb3JtRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIG1fcE93bmVyLT5TZXRHcmFiKEZBTFNFKTsNCisgIG1fcE93bmVyLT5tX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KKyAgQ0ZXTF9TeXNCdG4qIHBQb2ludEJ0biA9IG1fcE93bmVyLT5HZXRTeXNCdG5BdFBvaW50KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgQ0ZXTF9TeXNCdG4qIHBQcmVzc2VkQnRuID0NCisgICAgICBtX3BPd25lci0+R2V0U3lzQnRuQnlJbmRleChtX3BPd25lci0+bV9pQ2FwdHVyZUJ0bik7DQorICBpZiAoIXBQcmVzc2VkQnRuIHx8IHBQb2ludEJ0biAhPSBwUHJlc3NlZEJ0bikgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocFByZXNzZWRCdG4gPT0gbV9wT3duZXItPkdldFN5c0J0bkJ5U3RhdGUoRldMX1NZU0JVVFRPTlNUQVRFX1ByZXNzZWQpKSB7DQorICAgIHBQcmVzc2VkQnRuLT5TZXROb3JtYWwoKTsNCisgIH0NCisgIGlmIChwUHJlc3NlZEJ0biA9PSBtX3BPd25lci0+bV9wTWF4Qm94KSB7DQorICAgIGlmIChtX3BPd25lci0+bV9iTWF4aW1pemVkKSB7DQorICAgICAgbV9wT3duZXItPlNldFdpZGdldFJlY3QobV9wT3duZXItPm1fcnRSZXN0b3JlKTsNCisgICAgICBtX3BPd25lci0+VXBkYXRlKCk7DQorICAgICAgbV9wT3duZXItPlJlcGFpbnQoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3BPd25lci0+U2V0V29ya0FyZWFSZWN0KCk7DQorICAgICAgbV9wT3duZXItPlVwZGF0ZSgpOw0KICAgICB9DQotICAgIGlmIChwTXNnLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlICYmICFtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24pIHsNCi0gICAgICAgIG1fcE93bmVyLT5TZXRDdXJzb3IocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0Zvcm1EZWxlZ2F0ZTo6T25MQnV0dG9uRGJsQ2xrKENGV0xfTXNnTW91c2UgKnBNc2cpDQotew0KLSAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0ZSTV9SZXNpemUpICYmIG1fcE93bmVyLT5IaXRUZXN0KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpID09IEZXTF9XR1RISVRURVNUX1RpdGxlYmFyKSB7DQotICAgICAgICBpZiAobV9wT3duZXItPm1fYk1heGltaXplZCkgew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5TZXRXaWRnZXRSZWN0KG1fcE93bmVyLT5tX3J0UmVzdG9yZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1fcE93bmVyLT5TZXRXb3JrQXJlYVJlY3QoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcE93bmVyLT5VcGRhdGUoKTsNCi0gICAgICAgIG1fcE93bmVyLT5tX2JNYXhpbWl6ZWQgPSAhbV9wT3duZXItPm1fYk1heGltaXplZDsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfRm9ybURlbGVnYXRlOjpPbldpbmRvd01vdmUoQ0ZXTF9Nc2dXaW5kb3dNb3ZlICpwTXNnKQ0KLXsNCi0gICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCA9IHBNc2ctPm1fZng7DQotICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LnRvcCA9IHBNc2ctPm1fZnk7DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtRGVsZWdhdGU6Ok9uQ2xvc2UoQ0ZXTF9Nc2dDbG9zZSAqcE1zZykNCi17DQorICAgIG1fcE93bmVyLT5tX2JNYXhpbWl6ZWQgPSAhbV9wT3duZXItPm1fYk1heGltaXplZDsNCisgIH0gZWxzZSBpZiAocFByZXNzZWRCdG4gPT0gbV9wT3duZXItPm1fcE1pbkJveCkgew0KKyAgICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBXaWRnZXRNZ3IpOw0KKyAgICBwV2lkZ2V0TWdyLT5TZXRNaW5pbWl6ZV9OYXRpdmUobV9wT3duZXItPm1fcEludGVyZmFjZSk7DQorICB9IGVsc2Ugew0KICAgICBDRldMX0V2dENsb3NlIGVDbG9zZTsNCiAgICAgZUNsb3NlLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQogICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZlQ2xvc2UpOw0KKyAgfQ0KIH0NCi1GV0xfRVJSIEZXTF9BY2NlbGVyYXRvcl9TZXRGb3JtKElGV0xfRm9ybSAqcEZyb20sIENGWF9NYXBBY2NlbGVyYXRvcnMgKnBNYXBBY2NlbCkNCi17DQotICAgIENGV0xfRm9ybUltcCAqcEltcCA9IChDRldMX0Zvcm1JbXAqKSgoSUZXTF9UYXJnZXREYXRhKilwRnJvbSktPkdldERhdGEoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQordm9pZCBDRldMX0Zvcm1EZWxlZ2F0ZTo6T25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIHBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgIGlmIChtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24pIHsNCisgICAgSUZXTF9BZGFwdGVyTmF0aXZlKiBwTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCisgICAgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyKiBwQ3Vyc29yTWdyID0gcE5hdGl2ZS0+R2V0Q3Vyc29yTWdyKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEN1cnNvck1ncik7DQorICAgIENGV0xfU3lzQnRuKiBwUHJlc3NlZEJ0biA9DQorICAgICAgICBtX3BPd25lci0+R2V0U3lzQnRuQnlJbmRleChtX3BPd25lci0+bV9pQ2FwdHVyZUJ0bik7DQorICAgIEZYX0ZMT0FUIGZUb3AsIGZMZWZ0LCBmV2lkdGgsIGZIZWlnaHQ7DQorICAgIGZUb3AgPSBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3A7DQorICAgIGZMZWZ0ID0gbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdDsNCisgICAgZldpZHRoID0gbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGg7DQorICAgIGZIZWlnaHQgPSBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQ7DQorICAgIEZYX0ZMT0FUIGZXaWR0aE1heCwgZldpZHRoTWluLCBmSGVpZ2h0TWF4LCBmSGVpZ2h0TWluOw0KKyAgICBpZiAobV9wT3duZXItPm1fcENvbnRlbnQpIHsNCisgICAgICBtX3BPd25lci0+R2V0Q29udGVudCgpLT5HZXRNYXhTaXplKGZXaWR0aE1heCwgZkhlaWdodE1heCk7DQorICAgICAgbV9wT3duZXItPkdldENvbnRlbnQoKS0+R2V0TWluU2l6ZShmV2lkdGhNaW4sIGZIZWlnaHRNaW4pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGZXaWR0aE1heCA9IGZIZWlnaHRNYXggPSAxMDI0ICogNDsNCisgICAgICBmV2lkdGhNaW4gPSBmSGVpZ2h0TWluID0gMDsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJXaWR0aGxpbWl0ID0gKGZXaWR0aE1pbiAhPSAwIHx8IGZXaWR0aE1heCAhPSAwKTsNCisgICAgRlhfQk9PTCBiSGVpZ2h0bGltaXQgPSAoZkhlaWdodE1pbiAhPSAwIHx8IGZIZWlnaHRNYXggIT0gMCk7DQorICAgIEZYX0JPT0wgYlNpemVsaW1pdCA9IGJXaWR0aGxpbWl0IHx8IGJIZWlnaHRsaW1pdDsNCisgICAgaWYgKGZXaWR0aE1heCAhPSAwIHx8IGZIZWlnaHRNYXggIT0gMCB8fCBmV2lkdGhNaW4gIT0gMCB8fA0KKyAgICAgICAgZkhlaWdodE1pbiAhPSAwKSB7DQorICAgICAgYlNpemVsaW1pdCA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKHBQcmVzc2VkQnRuKSB7DQorICAgICAgaWYgKCFwUHJlc3NlZEJ0bi0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgcFByZXNzZWRCdG4tPlNldE5vcm1hbCgpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwUHJlc3NlZEJ0bi0+U2V0UHJlc3NlZCgpOw0KKyAgICAgIH0NCisgICAgICBtX3BPd25lci0+UmVwYWludCgmcFByZXNzZWRCdG4tPm1fcnRCdG4pOw0KKyAgICAgIHJldHVybjsNCisgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9iTWF4aW1pemVkKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9DYXApIHsNCisgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5PZmZzZXQoDQorICAgICAgICAgIHBNc2ctPm1fZnggLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsDQorICAgICAgICAgIHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnkpOw0KKyAgICAgIHBXaWRnZXRNZ3ItPlNldFdpZGdldFBvc2l0aW9uX05hdGl2ZSgNCisgICAgICAgICAgbV9wT3duZXItPm1fcEludGVyZmFjZSwgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCwNCisgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wKTsNCisgICAgICByZXR1cm47DQorICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0KSB7DQorICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplV0UpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgICAgIGlmICghYldpZHRobGltaXQpIHsNCisgICAgICAgIGZXaWR0aCArPSBwTXNnLT5tX2Z4IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54Ow0KKyAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54ID0gcE1zZy0+bV9meDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPkRvV2lkdGhMaW1pdChmTGVmdCwgZldpZHRoLCBwTXNnLT5tX2Z4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9zelN0YXJ0LnggLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGhNaW4sIGZXaWR0aE1heCwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9PSBGT1JNX1JFU0laRVRZUEVfTGVmdCkgew0KKyAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZVdFKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBpZiAoIWJXaWR0aGxpbWl0KSB7DQorICAgICAgICBmTGVmdCAtPSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnggLSBwTXNnLT5tX2Z4Ow0KKyAgICAgICAgZldpZHRoICs9IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5Eb1dpZHRoTGltaXQoZkxlZnQsIGZXaWR0aCwgcE1zZy0+bV9meCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54LCBmV2lkdGhNaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aE1heCwgVFJVRSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9Cb3R0b20pIHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOUyk7DQorICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgaWYgKCFiSGVpZ2h0bGltaXQpIHsNCisgICAgICAgIGZIZWlnaHQgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCisgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSA9IHBNc2ctPm1fZnk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5Eb0hlaWdodExpbWl0KGZUb3AsIGZIZWlnaHQsIHBNc2ctPm1fZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9zelN0YXJ0LnkgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZIZWlnaHRNaW4sIGZIZWlnaHRNYXgsIEZBTFNFKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX1RvcCkgew0KKyAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZU5TKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBpZiAoIWJIZWlnaHRsaW1pdCkgew0KKyAgICAgICAgZlRvcCArPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KKyAgICAgICAgZkhlaWdodCAtPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+RG9IZWlnaHRMaW1pdChmVG9wLCBmSGVpZ2h0LCBwTXNnLT5tX2Z5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55LCBmSGVpZ2h0TWluLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkhlaWdodE1heCwgVFJVRSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9MZWZ0VG9wKSB7DQorICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9DQorICAgICAgICAgIHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTldTRSk7DQorICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgaWYgKCFiU2l6ZWxpbWl0KSB7DQorICAgICAgICBmTGVmdCAtPSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnggLSBwTXNnLT5tX2Z4Ow0KKyAgICAgICAgZlRvcCArPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KKyAgICAgICAgZldpZHRoICs9IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQorICAgICAgICBmSGVpZ2h0IC09IHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0Lnk7DQorICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnggPSBwTXNnLT5tX2Z4Ow0KKyAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55ID0gcE1zZy0+bV9meTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPkRvV2lkdGhMaW1pdChmTGVmdCwgZldpZHRoLCBwTXNnLT5tX2Z4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsIGZXaWR0aE1pbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoTWF4LCBUUlVFKTsNCisgICAgICAgIG1fcE93bmVyLT5Eb0hlaWdodExpbWl0KGZUb3AsIGZIZWlnaHQsIHBNc2ctPm1fZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnksIGZIZWlnaHRNaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmSGVpZ2h0TWF4LCBUUlVFKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX0xlZnRCb3R0b20pIHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0NCisgICAgICAgICAgcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVORVNXKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBpZiAoIWJTaXplbGltaXQpIHsNCisgICAgICAgIGZMZWZ0IC09IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQorICAgICAgICBmV2lkdGggKz0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54IC0gcE1zZy0+bV9meDsNCisgICAgICAgIGZIZWlnaHQgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCisgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCA9IHBNc2ctPm1fZng7DQorICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnkgPSBwTXNnLT5tX2Z5Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+RG9XaWR0aExpbWl0KGZMZWZ0LCBmV2lkdGgsIHBNc2ctPm1fZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCwgZldpZHRoTWluLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGhNYXgsIFRSVUUpOw0KKyAgICAgICAgbV9wT3duZXItPkRvSGVpZ2h0TGltaXQoZlRvcCwgZkhlaWdodCwgcE1zZy0+bV9meSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3N6U3RhcnQueSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkhlaWdodE1pbiwgZkhlaWdodE1heCwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9PSBGT1JNX1JFU0laRVRZUEVfUmlnaHRUb3ApIHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0NCisgICAgICAgICAgcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVORVNXKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBpZiAoIWJTaXplbGltaXQpIHsNCisgICAgICAgIGZUb3AgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCisgICAgICAgIGZXaWR0aCArPSBwTXNnLT5tX2Z4IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54Ow0KKyAgICAgICAgZkhlaWdodCAtPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KKyAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54ID0gcE1zZy0+bV9meDsNCisgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSA9IHBNc2ctPm1fZnk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5Eb1dpZHRoTGltaXQoZkxlZnQsIGZXaWR0aCwgcE1zZy0+bV9meCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fc3pTdGFydC54IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoTWluLCBmV2lkdGhNYXgsIEZBTFNFKTsNCisgICAgICAgIG1fcE93bmVyLT5Eb0hlaWdodExpbWl0KGZUb3AsIGZIZWlnaHQsIHBNc2ctPm1fZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnksIGZIZWlnaHRNaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmSGVpZ2h0TWF4LCBUUlVFKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0Qm90dG9tKSB7DQorICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9DQorICAgICAgICAgIHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTldTRSk7DQorICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgaWYgKCFiU2l6ZWxpbWl0KSB7DQorICAgICAgICBmV2lkdGggKz0gcE1zZy0+bV9meCAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueDsNCisgICAgICAgIGZIZWlnaHQgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCisgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCA9IHBNc2ctPm1fZng7DQorICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnkgPSBwTXNnLT5tX2Z5Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+RG9XaWR0aExpbWl0KGZMZWZ0LCBmV2lkdGgsIHBNc2ctPm1fZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3N6U3RhcnQueCAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aE1pbiwgZldpZHRoTWF4LCBGQUxTRSk7DQorICAgICAgICBtX3BPd25lci0+RG9IZWlnaHRMaW1pdChmVG9wLCBmSGVpZ2h0LCBwTXNnLT5tX2Z5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fc3pTdGFydC55IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmSGVpZ2h0TWluLCBmSGVpZ2h0TWF4LCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX3BPd25lci0+bV9wQ29udGVudCkgew0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydEZvcm07DQorICAgIHJ0Rm9ybS5TZXQoZkxlZnQsIGZUb3AsIGZXaWR0aCwgZkhlaWdodCk7DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldCA9IHJ0Rm9ybTsNCisgICAgbV9wT3duZXItPlVwZGF0ZSgpOw0KKyAgICBtX3BPd25lci0+U2V0V2lkZ2V0UmVjdChydEZvcm0pOw0KKyNlbHNlDQorICAgIG1fcE93bmVyLT5TZXRXaWRnZXRSZWN0KHJ0Rm9ybSk7DQorICAgIG1fcE93bmVyLT5VcGRhdGUoKTsNCisjZW5kaWYNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Cb3JkZXIpICYmDQorICAgICAgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0ZSTV9SZXNpemUpICYmDQorICAgICAgIW1fcE93bmVyLT5tX2JNYXhpbWl6ZWQpIHsNCisgICAgbV9wT3duZXItPlNldEN1cnNvcihwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIH0NCisgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICBydEludmFsaWRhdGUuUmVzZXQoKTsNCisgIENGV0xfU3lzQnRuKiBwUG9pbnRCdG4gPSBtX3BPd25lci0+R2V0U3lzQnRuQXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIENGV0xfU3lzQnRuKiBwT2xkSG92ZXIgPSBtX3BPd25lci0+R2V0U3lzQnRuQnlTdGF0ZShGV0xfU1lTQlVUVE9OU1RBVEVfSG92ZXIpOw0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXykNCisgIHsNCisgICAgaWYgKHBPbGRIb3ZlciAmJiBwUG9pbnRCdG4gIT0gcE9sZEhvdmVyKSB7DQorICAgICAgcE9sZEhvdmVyLT5TZXROb3JtYWwoKTsNCisgICAgfQ0KKyAgICBpZiAocFBvaW50QnRuICYmIHBQb2ludEJ0biAhPSBwT2xkSG92ZXIpIHsNCisgICAgICBwUG9pbnRCdG4tPlNldEhvdmVyKCk7DQorICAgIH0NCisgICAgaWYgKG1fcE93bmVyLT5tX3BDbG9zZUJveCkgew0KKyAgICAgIHJ0SW52YWxpZGF0ZSA9IG1fcE93bmVyLT5tX3BDbG9zZUJveC0+bV9ydEJ0bjsNCisgICAgfQ0KKyAgICBpZiAobV9wT3duZXItPm1fcE1heEJveCkgew0KKyAgICAgIGlmIChydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQorICAgICAgICBydEludmFsaWRhdGUgPSBtX3BPd25lci0+bV9wTWF4Qm94LT5tX3J0QnRuOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBydEludmFsaWRhdGUuVW5pb24obV9wT3duZXItPm1fcE1heEJveC0+bV9ydEJ0bik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX3BPd25lci0+bV9wTWluQm94KSB7DQorICAgICAgaWYgKHJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJ0SW52YWxpZGF0ZSA9IG1fcE93bmVyLT5tX3BNaW5Cb3gtPm1fcnRCdG47DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihtX3BPd25lci0+bV9wTWluQm94LT5tX3J0QnRuKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFydEludmFsaWRhdGUuSXNFbXB0eSgpICYmDQorICAgICAgICBydEludmFsaWRhdGUuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICBtX3BPd25lci0+bV9iTW91c2VJbiA9IFRSVUU7DQorICAgIH0NCisgIH0NCisjZWxzZQ0KKyAgew0KKyAgICBpZiAocE9sZEhvdmVyICYmIHBQb2ludEJ0biAhPSBwT2xkSG92ZXIpIHsNCisgICAgICBwT2xkSG92ZXItPlNldE5vcm1hbCgpOw0KKyAgICAgIHJ0SW52YWxpZGF0ZSA9IHBPbGRIb3Zlci0+bV9ydEJ0bjsNCisgICAgfQ0KKyAgICBpZiAocFBvaW50QnRuICYmIHBQb2ludEJ0biAhPSBwT2xkSG92ZXIpIHsNCisgICAgICBwUG9pbnRCdG4tPlNldEhvdmVyKCk7DQorICAgICAgaWYgKHJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJ0SW52YWxpZGF0ZSA9IHBQb2ludEJ0bi0+bV9ydEJ0bjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcnRJbnZhbGlkYXRlLlVuaW9uKHBQb2ludEJ0bi0+bV9ydEJ0bik7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorI2VuZGlmDQorICBpZiAoIXJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtRGVsZWdhdGU6Ok9uTW91c2VIb3ZlcihDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBtX3BPd25lci0+U2V0Q3Vyc29yKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KK30NCit2b2lkIENGV0xfRm9ybURlbGVnYXRlOjpPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgQ0ZXTF9TeXNCdG4qIHBIb3ZlciA9IG1fcE93bmVyLT5HZXRTeXNCdG5CeVN0YXRlKEZXTF9TWVNCVVRUT05TVEFURV9Ib3Zlcik7DQorICBpZiAocEhvdmVyKSB7DQorICAgIHBIb3Zlci0+U2V0Tm9ybWFsKCk7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZwSG92ZXItPm1fcnRCdG4pOw0KKyAgfQ0KKyAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmUgJiYNCisgICAgICAhbV9wT3duZXItPm1fYkxCdXR0b25Eb3duKSB7DQorICAgIG1fcE93bmVyLT5TZXRDdXJzb3IocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtRGVsZWdhdGU6Ok9uTEJ1dHRvbkRibENsayhDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0ZSTV9SZXNpemUpICYmDQorICAgICAgbV9wT3duZXItPkhpdFRlc3QocE1zZy0+bV9meCwgcE1zZy0+bV9meSkgPT0gRldMX1dHVEhJVFRFU1RfVGl0bGViYXIpIHsNCisgICAgaWYgKG1fcE93bmVyLT5tX2JNYXhpbWl6ZWQpIHsNCisgICAgICBtX3BPd25lci0+U2V0V2lkZ2V0UmVjdChtX3BPd25lci0+bV9ydFJlc3RvcmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fcE93bmVyLT5TZXRXb3JrQXJlYVJlY3QoKTsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+VXBkYXRlKCk7DQorICAgIG1fcE93bmVyLT5tX2JNYXhpbWl6ZWQgPSAhbV9wT3duZXItPm1fYk1heGltaXplZDsNCisgIH0NCit9DQordm9pZCBDRldMX0Zvcm1EZWxlZ2F0ZTo6T25XaW5kb3dNb3ZlKENGV0xfTXNnV2luZG93TW92ZSogcE1zZykgew0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCA9IHBNc2ctPm1fZng7DQorICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3AgPSBwTXNnLT5tX2Z5Ow0KK30NCit2b2lkIENGV0xfRm9ybURlbGVnYXRlOjpPbkNsb3NlKENGV0xfTXNnQ2xvc2UqIHBNc2cpIHsNCisgIENGV0xfRXZ0Q2xvc2UgZUNsb3NlOw0KKyAgZUNsb3NlLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmZUNsb3NlKTsNCit9DQorRldMX0VSUiBGV0xfQWNjZWxlcmF0b3JfU2V0Rm9ybShJRldMX0Zvcm0qIHBGcm9tLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hcEFjY2VsZXJhdG9ycyogcE1hcEFjY2VsKSB7DQorICBDRldMX0Zvcm1JbXAqIHBJbXAgPSAoQ0ZXTF9Gb3JtSW1wKikoKElGV0xfVGFyZ2V0RGF0YSopcEZyb20pLT5HZXREYXRhKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9ncmlkaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9ncmlkaW1wLmNwcAppbmRleCA1NmViNjU1Li5kNmUwMTFhIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfZ3JpZGltcC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2dyaWRpbXAuY3BwCkBAIC0xMSwxMzQ5ICsxMSwxMzY2IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX2NvbnRlbnRpbXAuaCINCiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfZ3JpZGltcC5oIg0KLUlGV0xfR3JpZCogSUZXTF9HcmlkOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBJRldMX0dyaWQ7DQorSUZXTF9HcmlkKiBJRldMX0dyaWQ6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgSUZXTF9HcmlkOw0KIH0NCi1GV0xfRVJSCUlGV0xfR3JpZDo6SW5pdGlhbGl6ZSgpDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfR3JpZEltcDsNCi0gICAgKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitGV0xfRVJSIElGV0xfR3JpZDo6SW5pdGlhbGl6ZSgpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9HcmlkSW1wOw0KKyAgKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQorICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9HcmlkOjpJbml0aWFsaXplKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcykNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9HcmlkSW1wKHByb3BlcnRpZXMpOw0KLSAgICAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9HcmlkOjpJbml0aWFsaXplKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcykgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0dyaWRJbXAocHJvcGVydGllcyk7DQorICAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCiB9DQotRldMX0hHUklEQ09MUk9XCUlGV0xfR3JpZDo6SW5zZXJ0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgaW50MzJfdCBuSW5kZXggKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+SW5zZXJ0Q29sUm93KGJDb2x1bW4sIG5JbmRleCk7DQorRldMX0hHUklEQ09MUk9XIElGV0xfR3JpZDo6SW5zZXJ0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgaW50MzJfdCBuSW5kZXgpIHsNCisgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkluc2VydENvbFJvdyhiQ29sdW1uLCBuSW5kZXgpOw0KIH0NCi1pbnQzMl90IElGV0xfR3JpZDo6Q291bnRDb2xSb3dzKEZYX0JPT0wgYkNvbHVtbikNCi17DQotICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkNvdW50Q29sUm93cyhiQ29sdW1uKTsNCitpbnQzMl90IElGV0xfR3JpZDo6Q291bnRDb2xSb3dzKEZYX0JPT0wgYkNvbHVtbikgew0KKyAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+Q291bnRDb2xSb3dzKGJDb2x1bW4pOw0KIH0NCi1GV0xfSEdSSURDT0xST1cJSUZXTF9HcmlkOjpHZXRDb2xSb3coRlhfQk9PTCBiQ29sdW1uLCBpbnQzMl90IG5JbmRleCkNCi17DQotICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkdldENvbFJvdyhiQ29sdW1uLCBuSW5kZXgpOw0KK0ZXTF9IR1JJRENPTFJPVyBJRldMX0dyaWQ6OkdldENvbFJvdyhGWF9CT09MIGJDb2x1bW4sIGludDMyX3QgbkluZGV4KSB7DQorICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5HZXRDb2xSb3coYkNvbHVtbiwgbkluZGV4KTsNCiB9DQotaW50MzJfdCBJRldMX0dyaWQ6OkdldEluZGV4KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+R2V0SW5kZXgoaENvbFJvdyk7DQoraW50MzJfdCBJRldMX0dyaWQ6OkdldEluZGV4KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KSB7DQorICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5HZXRJbmRleChoQ29sUm93KTsNCiB9DQotRlhfRkxPQVQgSUZXTF9HcmlkOjpHZXRTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQgJmVVbml0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+R2V0U2l6ZShoQ29sUm93LCBlVW5pdCk7DQorRlhfRkxPQVQgSUZXTF9HcmlkOjpHZXRTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQmIGVVbml0KSB7DQorICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5HZXRTaXplKGhDb2xSb3csIGVVbml0KTsNCiB9DQotRldMX0VSUglJRldMX0dyaWQ6OlNldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRTaXplKGhDb2xSb3csIGZTaXplLCBlVW5pdCk7DQorRldMX0VSUiBJRldMX0dyaWQ6OlNldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVbml0KSB7DQorICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRTaXplKGhDb2xSb3csIGZTaXplLCBlVW5pdCk7DQogfQ0KLUZYX0ZMT0FUIElGV0xfR3JpZDo6R2V0TWluU2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUICZlVW5pdCkNCi17DQotICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkdldE1pblNpemUoaENvbFJvdywgZVVuaXQpOw0KK0ZYX0ZMT0FUIElGV0xfR3JpZDo6R2V0TWluU2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUJiBlVW5pdCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+R2V0TWluU2l6ZShoQ29sUm93LCBlVW5pdCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9HcmlkOjpTZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVbml0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+U2V0TWluU2l6ZShoQ29sUm93LCBmU2l6ZSwgZVVuaXQpOw0KK0ZXTF9FUlIgSUZXTF9HcmlkOjpTZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVW5pdCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+U2V0TWluU2l6ZShoQ29sUm93LCBmU2l6ZSwgZVVuaXQpOw0KIH0NCi1GWF9GTE9BVCBJRldMX0dyaWQ6OkdldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5HZXRNYXhTaXplKGhDb2xSb3csIGVVbml0KTsNCitGWF9GTE9BVCBJRldMX0dyaWQ6OkdldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCYgZVVuaXQpIHsNCisgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkdldE1heFNpemUoaENvbFJvdywgZVVuaXQpOw0KIH0NCi1GV0xfRVJSIElGV0xfR3JpZDo6U2V0TWF4U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVW5pdCkNCi17DQotICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPlNldE1heFNpemUoaENvbFJvdywgZlNpemUsIGVVbml0KTsNCitGV0xfRVJSIElGV0xfR3JpZDo6U2V0TWF4U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVuaXQpIHsNCisgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPlNldE1heFNpemUoaENvbFJvdywgZlNpemUsIGVVbml0KTsNCiB9DQotRlhfQk9PTCBJRldMX0dyaWQ6OkRlbGV0ZUNvbFJvdyhGV0xfSEdSSURDT0xST1cgaENvbFJvdykNCi17DQotICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkRlbGV0ZUNvbFJvdyhoQ29sUm93KTsNCitGWF9CT09MIElGV0xfR3JpZDo6RGVsZXRlQ29sUm93KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KSB7DQorICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5EZWxldGVDb2xSb3coaENvbFJvdyk7DQogfQ0KLUZYX0JPT0wgSUZXTF9HcmlkOjpJc0NvbHVtbihGV0xfSEdSSURDT0xST1cgaENvbFJvdykNCi17DQotICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPklzQ29sdW1uKGhDb2xSb3cpOw0KK0ZYX0JPT0wgSUZXTF9HcmlkOjpJc0NvbHVtbihGV0xfSEdSSURDT0xST1cgaENvbFJvdykgew0KKyAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+SXNDb2x1bW4oaENvbFJvdyk7DQogfQ0KLWludDMyX3QgSUZXTF9HcmlkOjpHZXRXaWRnZXRQb3MoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0JPT0wgYkNvbHVtbikNCi17DQotICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkdldFdpZGdldFBvcyhwV2lkZ2V0LCBiQ29sdW1uKTsNCitpbnQzMl90IElGV0xfR3JpZDo6R2V0V2lkZ2V0UG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJDb2x1bW4pIHsNCisgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkdldFdpZGdldFBvcyhwV2lkZ2V0LCBiQ29sdW1uKTsNCiB9DQotRldMX0VSUiBJRldMX0dyaWQ6OlNldFdpZGdldFBvcyhJRldMX1dpZGdldCAqcFdpZGdldCwgaW50MzJfdCBpUG9zLCBGWF9CT09MIGJDb2x1bW4pDQotew0KLSAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRXaWRnZXRQb3MocFdpZGdldCwgaVBvcywgYkNvbHVtbik7DQorRldMX0VSUiBJRldMX0dyaWQ6OlNldFdpZGdldFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbHVtbikgew0KKyAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+U2V0V2lkZ2V0UG9zKHBXaWRnZXQsIGlQb3MsIGJDb2x1bW4pOw0KIH0NCi1pbnQzMl90IElGV0xfR3JpZDo6R2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+R2V0V2lkZ2V0U3BhbihwV2lkZ2V0LCBiQ29sdW1uKTsNCitpbnQzMl90IElGV0xfR3JpZDo6R2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKSB7DQorICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5HZXRXaWRnZXRTcGFuKHBXaWRnZXQsIGJDb2x1bW4pOw0KIH0NCi1GV0xfRVJSIElGV0xfR3JpZDo6U2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCAqcFdpZGdldCwgaW50MzJfdCBpU3BhbiwgRlhfQk9PTCBiQ29sdW1uKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+U2V0V2lkZ2V0U3BhbihwV2lkZ2V0LCBpU3BhbiAsIGJDb2x1bW4pOw0KK0ZXTF9FUlIgSUZXTF9HcmlkOjpTZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVNwYW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29sdW1uKSB7DQorICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRXaWRnZXRTcGFuKHBXaWRnZXQsIGlTcGFuLCBiQ29sdW1uKTsNCiB9DQotRlhfRkxPQVQgSUZXTF9HcmlkOjpHZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRFNJWkUgZVNpemUsIEZXTF9HUklEVU5JVCAmZVVuaXQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5HZXRXaWRnZXRTaXplKHBXaWRnZXQsIGVTaXplLCBlVW5pdCk7DQorRlhfRkxPQVQgSUZXTF9HcmlkOjpHZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFNJWkUgZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCYgZVVuaXQpIHsNCisgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkdldFdpZGdldFNpemUocFdpZGdldCwgZVNpemUsIGVVbml0KTsNCiB9DQotRldMX0VSUiBJRldMX0dyaWQ6OlNldFdpZGdldFNpemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklEU0laRSBlU2l6ZSwgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVWl0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+U2V0V2lkZ2V0U2l6ZShwV2lkZ2V0LCBlU2l6ZSwgZlNpemUsIGVVaXQpOw0KK0ZXTF9FUlIgSUZXTF9HcmlkOjpTZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEU0laRSBlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVpdCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+U2V0V2lkZ2V0U2l6ZShwV2lkZ2V0LCBlU2l6ZSwgZlNpemUsIGVVaXQpOw0KIH0NCi1GWF9CT09MIElGV0xfR3JpZDo6R2V0V2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luLCBGWF9GTE9BVCAmZk1hcmdpbikNCi17DQotICAgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPkdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBlTWFyZ2luLCBmTWFyZ2luKTsNCitGWF9CT09MIElGV0xfR3JpZDo6R2V0V2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURNQVJHSU4gZU1hcmdpbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTWFyZ2luKSB7DQorICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5HZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgZU1hcmdpbiwgZk1hcmdpbik7DQogfQ0KLUZXTF9FUlIgSUZXTF9HcmlkOjpTZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sIEZYX0ZMT0FUIGZNYXJnaW4pDQotew0KLSAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgZU1hcmdpbiwgZk1hcmdpbik7DQorRldMX0VSUiBJRldMX0dyaWQ6OlNldFdpZGdldE1hcmdpbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWFyZ2luKSB7DQorICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgZU1hcmdpbiwgZk1hcmdpbik7DQogfQ0KLUZXTF9FUlIgSUZXTF9HcmlkOjpSZW1vdmVXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklETUFSR0lOIGVNYXJnaW4pDQotew0KLSAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5SZW1vdmVXaWRnZXRNYXJnaW4ocFdpZGdldCwgZU1hcmdpbik7DQorRldMX0VSUiBJRldMX0dyaWQ6OlJlbW92ZVdpZGdldE1hcmdpbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklETUFSR0lOIGVNYXJnaW4pIHsNCisgIHJldHVybiAoKENGV0xfR3JpZEltcCopbV9wRGF0YSktPlJlbW92ZVdpZGdldE1hcmdpbihwV2lkZ2V0LCBlTWFyZ2luKTsNCiB9DQotRlhfRkxPQVQgSUZXTF9HcmlkOjpHZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsIEZXTF9HUklEVU5JVCAmZVVuaXQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5HZXRHcmlkU2l6ZShlU2l6ZSwgZVVuaXQpOw0KK0ZYX0ZMT0FUIElGV0xfR3JpZDo6R2V0R3JpZFNpemUoRldMX0dSSURTSVpFIGVTaXplLCBGV0xfR1JJRFVOSVQmIGVVbml0KSB7DQorICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5HZXRHcmlkU2l6ZShlU2l6ZSwgZVVuaXQpOw0KIH0NCi1GV0xfRVJSIElGV0xfR3JpZDo6U2V0R3JpZFNpemUoRldMX0dSSURTSVpFIGVTaXplLCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVaXQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0dyaWRJbXAqKW1fcERhdGEpLT5TZXRHcmlkU2l6ZShlU2l6ZSwgZlNpemUsIGVVaXQpOw0KK0ZXTF9FUlIgSUZXTF9HcmlkOjpTZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVpdCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9HcmlkSW1wKiltX3BEYXRhKS0+U2V0R3JpZFNpemUoZVNpemUsIGZTaXplLCBlVWl0KTsNCiB9DQotSUZXTF9HcmlkOjpJRldMX0dyaWQoKQ0KLXsNCitJRldMX0dyaWQ6OklGV0xfR3JpZCgpIHsNCisgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX0dyaWQ6On5JRldMX0dyaWQoKSB7DQorICBpZiAobV9wRGF0YSkgew0KKyAgICBkZWxldGUgKENGV0xfR3JpZEltcCopbV9wRGF0YTsNCiAgICAgbV9wRGF0YSA9IE5VTEw7DQorICB9DQogfQ0KLUlGV0xfR3JpZDo6fklGV0xfR3JpZCgpDQotew0KLSAgICBpZiAobV9wRGF0YSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0dyaWRJbXAqKW1fcERhdGE7DQotICAgICAgICBtX3BEYXRhID0gTlVMTDsNCi0gICAgfQ0KK0NGV0xfR3JpZEltcDo6Q0ZXTF9HcmlkSW1wKCkgew0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfQXV0bzsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmZMZW5ndGggPSAwOw0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0F1dG87DQorICBtX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZkxlbmd0aCA9IDA7DQorICBtX1NpemVbRldMX0dSSURTSVpFX01pbldpZHRoXS5lVW5pdCA9IEZXTF9HUklEVU5JVF9GaXhlZDsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluV2lkdGhdLmZMZW5ndGggPSAwOw0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfSW5maW5pdHk7DQorICBtX1NpemVbRldMX0dSSURTSVpFX01heFdpZHRoXS5mTGVuZ3RoID0gMDsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5lVW5pdCA9IEZXTF9HUklEVU5JVF9GaXhlZDsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5mTGVuZ3RoID0gMDsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5lVW5pdCA9IEZXTF9HUklEVU5JVF9JbmZpbml0eTsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5mTGVuZ3RoID0gMDsNCiB9DQotQ0ZXTF9HcmlkSW1wOjpDRldMX0dyaWRJbXAoKQ0KLXsNCi0gICAgbV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfQXV0bzsNCi0gICAgbV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZkxlbmd0aCA9IDA7DQotICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KLSAgICBtX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZkxlbmd0aCA9IDA7DQotICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluV2lkdGhdLmVVbml0ID0gRldMX0dSSURVTklUX0ZpeGVkOw0KLSAgICBtX1NpemVbRldMX0dSSURTSVpFX01pbldpZHRoXS5mTGVuZ3RoID0gMDsNCi0gICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfSW5maW5pdHk7DQotICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmZMZW5ndGggPSAwOw0KLSAgICBtX1NpemVbRldMX0dSSURTSVpFX01pbkhlaWdodF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfRml4ZWQ7DQotICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5mTGVuZ3RoID0gMDsNCi0gICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0luZmluaXR5Ow0KLSAgICBtX1NpemVbRldMX0dSSURTSVpFX01heEhlaWdodF0uZkxlbmd0aCA9IDA7DQorQ0ZXTF9HcmlkSW1wOjpDRldMX0dyaWRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKQ0KKyAgICA6IENGV0xfQ29udGVudEltcChwcm9wZXJ0aWVzKSB7DQorICBtX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZkxlbmd0aCA9IDA7DQorICBtX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfQXV0bzsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5mTGVuZ3RoID0gMDsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluV2lkdGhdLmVVbml0ID0gRldMX0dSSURVTklUX0ZpeGVkOw0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZkxlbmd0aCA9IDA7DQorICBtX1NpemVbRldMX0dSSURTSVpFX01heFdpZHRoXS5lVW5pdCA9IEZXTF9HUklEVU5JVF9JbmZpbml0eTsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmZMZW5ndGggPSAwOw0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5IZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0ZpeGVkOw0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5IZWlnaHRdLmZMZW5ndGggPSAwOw0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0luZmluaXR5Ow0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmZMZW5ndGggPSAwOw0KIH0NCi1DRldMX0dyaWRJbXA6OkNGV0xfR3JpZEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMpDQotICAgIDogQ0ZXTF9Db250ZW50SW1wKHByb3BlcnRpZXMpDQotew0KLSAgICBtX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KLSAgICBtX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5mTGVuZ3RoID0gMDsNCi0gICAgbV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0F1dG87DQotICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5mTGVuZ3RoID0gMDsNCi0gICAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfRml4ZWQ7DQotICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluV2lkdGhdLmZMZW5ndGggPSAwOw0KLSAgICBtX1NpemVbRldMX0dSSURTSVpFX01heFdpZHRoXS5lVW5pdCA9IEZXTF9HUklEVU5JVF9JbmZpbml0eTsNCi0gICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZkxlbmd0aCA9IDA7DQotICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5lVW5pdCA9IEZXTF9HUklEVU5JVF9GaXhlZDsNCi0gICAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5IZWlnaHRdLmZMZW5ndGggPSAwOw0KLSAgICBtX1NpemVbRldMX0dSSURTSVpFX01heEhlaWdodF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfSW5maW5pdHk7DQotICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5mTGVuZ3RoID0gMDsNCitDRldMX0dyaWRJbXA6On5DRldMX0dyaWRJbXAoKSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQ29sdW1ucy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBkZWxldGUgKENGV0xfR3JpZENvbFJvdyopbV9Db2x1bW5zW2ldOw0KKyAgfQ0KKyAgbV9Db2x1bW5zLlJlbW92ZUFsbCgpOw0KKyAgaUNvdW50ID0gbV9Sb3dzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlDb3VudDsgaisrKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9HcmlkQ29sUm93KiltX1Jvd3Nbal07DQorICB9DQorICBtX1Jvd3MuUmVtb3ZlQWxsKCk7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQ7DQorICAgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvOw0KKyAgICBtX21hcFdpZGdldEluZm8uR2V0TmV4dEFzc29jKHBzLCAodm9pZComKXBXaWRnZXQsICh2b2lkKiYpcEluZm8pOw0KKyAgICBkZWxldGUgcEluZm87DQorICB9DQorICBtX21hcFdpZGdldEluZm8uUmVtb3ZlQWxsKCk7DQorICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgZGVsZXRlIChDRldMX0dyaWREZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQorICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgIH0NCiB9DQotQ0ZXTF9HcmlkSW1wOjp+Q0ZXTF9HcmlkSW1wKCkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9Db2x1bW5zLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9HcmlkQ29sUm93ICopIG1fQ29sdW1uc1tpXTsNCi0gICAgfQ0KLSAgICBtX0NvbHVtbnMuUmVtb3ZlQWxsKCk7DQotICAgIGlDb3VudCA9IG1fUm93cy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlDb3VudDsgaisrKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfR3JpZENvbFJvdyopIG1fUm93c1tqXTsNCi0gICAgfQ0KLSAgICBtX1Jvd3MuUmVtb3ZlQWxsKCk7DQotICAgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBXaWRnZXRJbmZvLkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBzKSB7DQotICAgICAgICBJRldMX1dpZGdldCAqcFdpZGdldDsNCi0gICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvOw0KLSAgICAgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCi0gICAgICAgIGRlbGV0ZSBwSW5mbzsNCi0gICAgfQ0KLSAgICBtX21hcFdpZGdldEluZm8uUmVtb3ZlQWxsKCk7DQotICAgIGlmIChtX3BEZWxlZ2F0ZSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0dyaWREZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQotICAgICAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQotICAgIH0NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICB3c0NsYXNzID0gRldMX0NMQVNTX0dyaWQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0DQotew0KLSAgICB3c0NsYXNzID0gRldMX0NMQVNTX0dyaWQ7DQorRlhfRFdPUkQgQ0ZXTF9HcmlkSW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfR3JpZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OkluaXRpYWxpemUoKSB7DQorICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX0NvbnRlbnRJbXA6OkluaXRpYWxpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKilGWF9ORVcgQ0ZXTF9HcmlkRGVsZWdhdGUodGhpcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpGaW5hbGl6ZSgpIHsNCisgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfQ29udGVudEltcDo6RmluYWxpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgZGVsZXRlIChDRldMX0dyaWREZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQorICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LmxlZnQgPSAwOw0KKyAgICByZWN0LnRvcCA9IDA7DQorICAgIHJlY3Qud2lkdGggPSBQcm9jZXNzVW5DZXJ0YWluQ29sdW1ucygpOw0KKyAgICByZWN0LmhlaWdodCA9IFByb2Nlc3NVbkNlcnRhaW5Sb3dzKCk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBDRldMX1dpZGdldEltcDo6U2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlVwZGF0ZSgpIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBQcm9jZXNzQ29sdW1ucyhtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoKTsNCisgIFByb2Nlc3NSb3dzKG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgIFNldEFsbFdpZGdldHNSZWN0KCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX0dSSURTVFlMRUVYVF9TaG93R3JpZExpbmVzKSA9PSAwKSB7DQogICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfRFdPUkQgQ0ZXTF9HcmlkSW1wOjpHZXRDbGFzc0lEKCkgY29uc3QNCi17DQotICAgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0dyaWQ7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9HcmlkSW1wOjpJbml0aWFsaXplKCkNCi17DQotICAgIF9GV0xfRVJSX0NIRUNLX1JFVFVSTl9WQUxVRV9JRl9GQUlMKENGV0xfQ29udGVudEltcDo6SW5pdGlhbGl6ZSgpLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBtX3BEZWxlZ2F0ZSA9IChJRldMX1dpZGdldERlbGVnYXRlKikgRlhfTkVXIENGV0xfR3JpZERlbGVnYXRlKHRoaXMpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9HcmlkSW1wOjpGaW5hbGl6ZSgpDQotew0KLSAgICBfRldMX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChDRldMX0NvbnRlbnRJbXA6OkZpbmFsaXplKCksIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGlmIChtX3BEZWxlZ2F0ZSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0dyaWREZWxlZ2F0ZSopbV9wRGVsZWdhdGU7DQotICAgICAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfR3JpZEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCi17DQotICAgIGlmIChiQXV0b1NpemUpIHsNCi0gICAgICAgIHJlY3QubGVmdCA9IDA7DQotICAgICAgICByZWN0LnRvcCA9IDA7DQotICAgICAgICByZWN0LndpZHRoID0gUHJvY2Vzc1VuQ2VydGFpbkNvbHVtbnMoKTsNCi0gICAgICAgIHJlY3QuaGVpZ2h0ID0gUHJvY2Vzc1VuQ2VydGFpblJvd3MoKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRJbXA6OlNldFdpZGdldFJlY3QocmVjdCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0dyaWRJbXA6OlVwZGF0ZSgpDQotew0KLSAgICBpZiAoSXNMb2NrZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCi0gICAgfQ0KLSAgICBQcm9jZXNzQ29sdW1ucyhtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoKTsNCi0gICAgUHJvY2Vzc1Jvd3MobV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KLSAgICBTZXRBbGxXaWRnZXRzUmVjdCgpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfR1JJRFNUWUxFRVhUX1Nob3dHcmlkTGluZXMpID09IDApIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwR3JhcGhpY3MtPkNvbmNhdE1hdHJpeCgoQ0ZYX01hdHJpeCopcE1hdHJpeCk7DQotICAgIH0NCi0gICAgew0KLSAgICAgICAgRlhfQk9PTCBiRHJhd0xpbmUgPSBGQUxTRTsNCi0gICAgICAgIENGWF9QYXRoIHBhdGg7DQotICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICAgICAgaW50MzJfdCBpQ29sdW1ucyA9IG1fQ29sdW1ucy5HZXRTaXplKCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpQ29sdW1uczsgaSsrKSB7DQotICAgICAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopbV9Db2x1bW5zW2ldOw0KLSAgICAgICAgICAgIGlmICghcENvbFJvdykgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCFiRHJhd0xpbmUpIHsNCi0gICAgICAgICAgICAgICAgYkRyYXdMaW5lID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcGF0aC5BZGRMaW5lKHBDb2xSb3ctPm1fZkFjdHVhbFBvcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcENvbFJvdy0+bV9mQWN0dWFsUG9zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlSb3dzID0gbV9Sb3dzLkdldFNpemUoKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMTsgaiA8IGlSb3dzOyBqKyspIHsNCi0gICAgICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiltX1Jvd3Nbal07DQotICAgICAgICAgICAgaWYgKCFwQ29sUm93KSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIWJEcmF3TGluZSkgew0KLSAgICAgICAgICAgICAgICBiRHJhd0xpbmUgPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwYXRoLkFkZExpbmUoMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcENvbFJvdy0+bV9mQWN0dWFsUG9zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwQ29sUm93LT5tX2ZBY3R1YWxQb3MpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJEcmF3TGluZSkgew0KLSAgICAgICAgICAgIENGWF9Db2xvciBjcigweEZGRkYwMDAwKTsNCi0gICAgICAgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQotICAgICAgICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0dyaWRJbXA6Okluc2VydFdpZGdldChJRldMX1dpZGdldCAqcENoaWxkLCBpbnQzMl90IG5JbmRleCApDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBDaGlsZCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgQ0ZXTF9Db250ZW50SW1wOjpJbnNlcnRXaWRnZXQocENoaWxkLCBuSW5kZXgpOw0KLSAgICBpZiAoIW1fbWFwV2lkZ2V0SW5mby5HZXRWYWx1ZUF0KHBDaGlsZCkpIHsNCi0gICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gRlhfTkVXIENGV0xfR3JpZFdpZGdldEluZm87DQotICAgICAgICBtX21hcFdpZGdldEluZm8uU2V0QXQocENoaWxkLCBwSW5mbyk7DQotICAgICAgICBtX1dpZGdldHMuQWRkKHBDaGlsZCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfR3JpZEltcDo6UmVtb3ZlV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBDRldMX0NvbnRlbnRJbXA6OlJlbW92ZVdpZGdldChwV2lkZ2V0KTsNCi0gICAgaWYgKENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gKENGV0xfR3JpZFdpZGdldEluZm8qKW1fbWFwV2lkZ2V0SW5mby5HZXRWYWx1ZUF0KHBXaWRnZXQpKSB7DQotICAgICAgICBtX21hcFdpZGdldEluZm8uUmVtb3ZlS2V5KHBXaWRnZXQpOw0KLSAgICAgICAgZGVsZXRlIHBJbmZvOw0KLSAgICAgICAgaW50MzJfdCBuSW5kZXggPSBtX1dpZGdldHMuRmluZChwV2lkZ2V0KTsNCi0gICAgICAgIG1fV2lkZ2V0cy5SZW1vdmVBdChuSW5kZXgsIDEpOw0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0hHUklEQ09MUk9XIENGV0xfR3JpZEltcDo6SW5zZXJ0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgaW50MzJfdCBuSW5kZXggKQ0KLXsNCi0gICAgaWYgKGJDb2x1bW4pIHsNCi0gICAgICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+IG1fQ29sdW1ucy5HZXRTaXplKCkpIHsNCi0gICAgICAgICAgICBuSW5kZXggPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sdW1uID0gRlhfTkVXIENGV0xfR3JpZENvbFJvdzsNCi0gICAgICAgIG1fQ29sdW1ucy5JbnNlcnRBdChuSW5kZXgsIHBDb2x1bW4sIDEpOw0KLSAgICAgICAgcmV0dXJuIChGV0xfSEdSSURDT0xST1cpcENvbHVtbjsNCi0gICAgfQ0KLSAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPiBtX1Jvd3MuR2V0U2l6ZSgpKSB7DQotICAgICAgICBuSW5kZXggPSBtX1Jvd3MuR2V0U2l6ZSgpOw0KLSAgICB9DQotICAgIENGV0xfR3JpZENvbFJvdyAqcFJvdyA9IEZYX05FVyBDRldMX0dyaWRDb2xSb3c7DQotICAgIG1fUm93cy5JbnNlcnRBdChuSW5kZXgsIHBSb3csIDEpOw0KLSAgICByZXR1cm4gKEZXTF9IR1JJRENPTFJPVylwUm93Ow0KLX0NCi1pbnQzMl90IENGV0xfR3JpZEltcDo6Q291bnRDb2xSb3dzKEZYX0JPT0wgYkNvbHVtbikNCi17DQotICAgIGlmIChiQ29sdW1uKSB7DQotICAgICAgICByZXR1cm4gbV9Db2x1bW5zLkdldFNpemUoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9Sb3dzLkdldFNpemUoKTsNCi19DQotRldMX0hHUklEQ09MUk9XIENGV0xfR3JpZEltcDo6R2V0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgaW50MzJfdCBuSW5kZXgpDQotew0KLSAgICBpZiAoYkNvbHVtbikgew0KLSAgICAgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fQ29sdW1ucy5HZXRTaXplKCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAoRldMX0hHUklEQ09MUk9XKW1fQ29sdW1uc1tuSW5kZXhdOw0KLSAgICB9DQotICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX1Jvd3MuR2V0U2l6ZSgpKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gKEZXTF9IR1JJRENPTFJPVyltX1Jvd3NbbkluZGV4XTsNCi19DQotaW50MzJfdCBDRldMX0dyaWRJbXA6OkdldEluZGV4KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KQ0KLXsNCi0gICAgaWYgKElzQ29sdW1uKGhDb2xSb3cpKSB7DQotICAgICAgICByZXR1cm4gbV9Db2x1bW5zLkZpbmQoaENvbFJvdyk7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fUm93cy5GaW5kKGhDb2xSb3cpOw0KLX0NCi1GWF9GTE9BVCBDRldMX0dyaWRJbXA6OkdldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhDb2xSb3csIC0xKTsNCi0gICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopaENvbFJvdzsNCi0gICAgZVVuaXQgPSBwQ29sUm93LT5tX1NpemUuZVVuaXQ7DQotICAgIHJldHVybiBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCi19DQotRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhDb2xSb3csIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKWhDb2xSb3c7DQotICAgIHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCA9IGVVbml0Ow0KLSAgICBwQ29sUm93LT5tX1NpemUuZkxlbmd0aCA9IGZTaXplOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0ZMT0FUIENGV0xfR3JpZEltcDo6R2V0TWluU2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUICZlVW5pdCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaENvbFJvdywgLTEpOw0KLSAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiloQ29sUm93Ow0KLSAgICBlVW5pdCA9IHBDb2xSb3ctPm1fTWluU2l6ZS5lVW5pdDsNCi0gICAgcmV0dXJuIHBDb2xSb3ctPm1fTWluU2l6ZS5mTGVuZ3RoOw0KLX0NCi1GV0xfRVJSIENGV0xfR3JpZEltcDo6U2V0TWluU2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVW5pdCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaENvbFJvdywgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopaENvbFJvdzsNCi0gICAgcENvbFJvdy0+bV9NaW5TaXplLmVVbml0ID0gZVVuaXQ7DQotICAgIHBDb2xSb3ctPm1fTWluU2l6ZS5mTGVuZ3RoID0gZlNpemU7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpHZXRNYXhTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQgJmVVbml0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoQ29sUm93LCAtMSk7DQotICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKWhDb2xSb3c7DQotICAgIGVVbml0ID0gcENvbFJvdy0+bV9NYXhTaXplLmVVbml0Ow0KLSAgICByZXR1cm4gcENvbFJvdy0+bV9NYXhTaXplLmZMZW5ndGg7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRNYXhTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVbml0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoQ29sUm93LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiloQ29sUm93Ow0KLSAgICBwQ29sUm93LT5tX01heFNpemUuZVVuaXQgPSBlVW5pdDsNCi0gICAgcENvbFJvdy0+bV9NYXhTaXplLmZMZW5ndGggPSBmU2l6ZTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9CT09MIENGV0xfR3JpZEltcDo6RGVsZXRlQ29sUm93KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KQ0KLXsNCi0gICAgaW50MzJfdCBuSW5kZXggPSBtX0NvbHVtbnMuRmluZChoQ29sUm93KTsNCi0gICAgaWYgKG5JbmRleCA+PSAwKSB7DQotICAgICAgICBtX0NvbHVtbnMuUmVtb3ZlQXQobkluZGV4KTsNCi0gICAgICAgIGRlbGV0ZSAoQ0ZXTF9HcmlkQ29sUm93KiloQ29sUm93Ow0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgbkluZGV4ID0gbV9Sb3dzLkZpbmQoaENvbFJvdyk7DQotICAgIGlmIChuSW5kZXggPj0gMCkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0dyaWRDb2xSb3cqKWhDb2xSb3c7DQotICAgICAgICBtX1Jvd3MuUmVtb3ZlQXQobkluZGV4KTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDRldMX0dyaWRJbXA6OklzQ29sdW1uKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KQ0KLXsNCi0gICAgcmV0dXJuIG1fQ29sdW1ucy5GaW5kKGhDb2xSb3cpICE9IC0xOw0KLX0NCi1pbnQzMl90IENGV0xfR3JpZEltcDo6R2V0V2lkZ2V0UG9zKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJDb2x1bW4pDQotew0KLSAgICBDRldMX0dyaWRXaWRnZXRJbmZvICpwSW5mbyA9IChDRldMX0dyaWRXaWRnZXRJbmZvKilHZXRXaWRnZXRJbmZvKHBXaWRnZXQpOw0KLSAgICBpZiAocEluZm8pIHsNCi0gICAgICAgIHJldHVybiBiQ29sdW1uID8gcEluZm8tPm1faUNvbHVtbiA6IHBJbmZvLT5tX2lSb3c7DQotICAgIH0NCi0gICAgcmV0dXJuIC0xOw0KLX0NCi1GV0xfRVJSIENGV0xfR3JpZEltcDo6U2V0V2lkZ2V0UG9zKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBpbnQzMl90IGlQb3MsIEZYX0JPT0wgYkNvbHVtbikNCi17DQotICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gKENGV0xfR3JpZFdpZGdldEluZm8qKUdldFdpZGdldEluZm8ocFdpZGdldCk7DQotICAgIGlmIChwSW5mbykgew0KLSAgICAgICAgYkNvbHVtbiA/IHBJbmZvLT5tX2lDb2x1bW4gPSBpUG9zIDogcEluZm8tPm1faVJvdyA9IGlQb3M7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1pbnQzMl90IENGV0xfR3JpZEltcDo6R2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKQ0KLXsNCi0gICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KTsNCi0gICAgaWYgKHBJbmZvKSB7DQotICAgICAgICByZXR1cm4gYkNvbHVtbiA/IHBJbmZvLT5tX2lDb2x1bW5TcGFuIDogcEluZm8tPm1faVJvd1NwYW47DQotICAgIH0NCi0gICAgcmV0dXJuIDA7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBpbnQzMl90IGlTcGFuLCBGWF9CT09MIGJDb2x1bW4pDQotew0KLSAgICBDRldMX0dyaWRXaWRnZXRJbmZvICpwSW5mbyA9IChDRldMX0dyaWRXaWRnZXRJbmZvKilHZXRXaWRnZXRJbmZvKHBXaWRnZXQpOw0KLSAgICBpZiAocEluZm8pIHsNCi0gICAgICAgIGJDb2x1bW4gPyBwSW5mby0+bV9pQ29sdW1uU3BhbiA9IGlTcGFuIDogcEluZm8tPm1faVJvd1NwYW4gPSBpU3BhbjsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0ZMT0FUIENGV0xfR3JpZEltcDo6R2V0V2lkZ2V0U2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURTSVpFIGVTaXplLCBGV0xfR1JJRFVOSVQgJmVVbml0KQ0KLXsNCi0gICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KTsNCi0gICAgaWYgKHBJbmZvKSB7DQotICAgICAgICBlVW5pdCA9IHBJbmZvLT5tX1NpemVbZVNpemVdLmVVbml0Ow0KLSAgICAgICAgcmV0dXJuIHBJbmZvLT5tX1NpemVbZVNpemVdLmZMZW5ndGg7DQotICAgIH0NCi0gICAgcmV0dXJuIDA7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRFNJWkUgZVNpemUsIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVpdCkNCi17DQotICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gKENGV0xfR3JpZFdpZGdldEluZm8qKUdldFdpZGdldEluZm8ocFdpZGdldCk7DQotICAgIGlmIChwSW5mbykgew0KLSAgICAgICAgcEluZm8tPm1fU2l6ZVtlU2l6ZV0uZkxlbmd0aCA9IGZTaXplOw0KLSAgICAgICAgcEluZm8tPm1fU2l6ZVtlU2l6ZV0uZVVuaXQgPSBlVWl0Ow0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfQk9PTCBDRldMX0dyaWRJbXA6OkdldFdpZGdldE1hcmdpbihJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURNQVJHSU4gZU1hcmdpbiwgRlhfRkxPQVQgJmZNYXJnaW4pDQotew0KLSAgICBDRldMX0dyaWRXaWRnZXRJbmZvICpwSW5mbyA9IChDRldMX0dyaWRXaWRnZXRJbmZvKilHZXRXaWRnZXRJbmZvKHBXaWRnZXQpOw0KLSAgICBpZiAocEluZm8pIHsNCi0gICAgICAgIGZNYXJnaW4gPSBwSW5mby0+bV9NYXJnaW5bZU1hcmdpbl07DQotICAgICAgICByZXR1cm4gKHBJbmZvLT5tX2R3TWFyZ2luRmxhZyAmICgxIDw8IGVNYXJnaW4pKSAhPSAwOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldFdpZGdldE1hcmdpbihJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURNQVJHSU4gZU1hcmdpbiwgRlhfRkxPQVQgZk1hcmdpbikNCi17DQotICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gKENGV0xfR3JpZFdpZGdldEluZm8qKUdldFdpZGdldEluZm8ocFdpZGdldCk7DQotICAgIGlmIChwSW5mbykgew0KLSAgICAgICAgcEluZm8tPm1fTWFyZ2luW2VNYXJnaW5dID0gZk1hcmdpbjsNCi0gICAgICAgIHBJbmZvLT5tX2R3TWFyZ2luRmxhZyB8PSAoMSA8PCBlTWFyZ2luKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpSZW1vdmVXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklETUFSR0lOIGVNYXJnaW4pDQotew0KLSAgICBDRldMX0dyaWRXaWRnZXRJbmZvICpwSW5mbyA9IChDRldMX0dyaWRXaWRnZXRJbmZvKilHZXRXaWRnZXRJbmZvKHBXaWRnZXQpOw0KLSAgICBpZiAocEluZm8pIHsNCi0gICAgICAgIHBJbmZvLT5tX2R3TWFyZ2luRmxhZyAmPSB+KDEgPDwgZU1hcmdpbik7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9GTE9BVCBDRldMX0dyaWRJbXA6OkdldEdyaWRTaXplKEZXTF9HUklEU0laRSBlU2l6ZSwgRldMX0dSSURVTklUICZlVW5pdCkNCi17DQotICAgIGVVbml0ID0gbV9TaXplW2VTaXplXS5lVW5pdDsNCi0gICAgcmV0dXJuIG1fU2l6ZVtlU2l6ZV0uZkxlbmd0aDsNCi19DQotRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldEdyaWRTaXplKEZXTF9HUklEU0laRSBlU2l6ZSwgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVWl0KQ0KLXsNCi0gICAgbV9TaXplW2VTaXplXS5mTGVuZ3RoID0gZlNpemU7DQotICAgIG1fU2l6ZVtlU2l6ZV0uZVVuaXQgPSBlVWl0Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUNGV0xfR3JpZFdpZGdldEluZm8qIENGV0xfR3JpZEltcDo6R2V0V2lkZ2V0SW5mbyhJRldMX1dpZGdldCogcFdpZGdldCkNCi17DQotICAgIHJldHVybiAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopbV9tYXBXaWRnZXRJbmZvLkdldFZhbHVlQXQocFdpZGdldCk7DQotfQ0KLXZvaWQgQ0ZXTF9HcmlkSW1wOjpQcm9jRml4ZWRDb2xSb3coQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93LCBpbnQzMl90IG5JbmRleCwgRlhfRkxPQVQgZkNvbFJvd1NpemUsIEZYX0JPT0wgYkNvbHVtbikNCi17DQotICAgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgPSBmQ29sUm93U2l6ZTsNCi0gICAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFdpZGdldEluZm8uR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHMpIHsNCi0gICAgICAgIElGV0xfV2lkZ2V0ICpwV2lkZ2V0ID0gTlVMTDsNCi0gICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gTlVMTDsNCi0gICAgICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFdpZGdldCwgKHZvaWQqJilwSW5mbyk7DQotICAgICAgICBpZiAoYkNvbHVtbikgew0KLSAgICAgICAgICAgIGlmIChwSW5mby0+bV9pQ29sdW1uID09IG5JbmRleCAmJiBwSW5mby0+bV9pQ29sdW1uU3BhbiA9PSAxKSB7DQotICAgICAgICAgICAgICAgIENhbGNXaWRnZXRXaWR0aChwV2lkZ2V0LCBwSW5mbywgcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAocEluZm8tPm1faVJvdyA9PSBuSW5kZXggJiYgcEluZm8tPm1faVJvd1NwYW4gPT0gMSkgew0KLSAgICAgICAgICAgICAgICBDYWxjV2lkZ2V0SGVpZ3QocFdpZGdldCwgcEluZm8sIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfR3JpZEltcDo6UHJvY0F1dG9Db2xSb3coQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93LCBpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQ29sdW1uKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwQ29sUm93KTsNCi0gICAgRlhfRkxPQVQgZk1heFNpemUgPSAwLCBmV2lkZ2V0U2l6ZSA9IDA7DQotICAgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBXaWRnZXRJbmZvLkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBzKSB7DQotICAgICAgICBJRldMX1dpZGdldCpwV2lkZ2V0ID0gTlVMTDsNCi0gICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gTlVMTDsNCi0gICAgICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFdpZGdldCwgKHZvaWQqJilwSW5mbyk7DQotICAgICAgICBpZiAoIXBXaWRnZXQgfHwgIXBJbmZvKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYkNvbHVtbikgew0KLSAgICAgICAgICAgIGlmIChwSW5mby0+bV9pQ29sdW1uICE9IG5JbmRleCB8fCBwSW5mby0+bV9pQ29sdW1uU3BhbiAhPSAxKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmV2lkZ2V0U2l6ZSA9IENhbGNBdXRvQ29sdW1uV2lkZ2V0V2lkdGgocFdpZGdldCwgcEluZm8pOw0KLSAgICAgICAgICAgIGlmIChmTWF4U2l6ZSA8IGZXaWRnZXRTaXplKSB7DQotICAgICAgICAgICAgICAgIGZNYXhTaXplID0gZldpZGdldFNpemU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAocEluZm8tPm1faVJvdyAhPSBuSW5kZXggfHwgcEluZm8tPm1faVJvd1NwYW4gIT0gMSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZldpZGdldFNpemUgPSBDYWxjQXV0b0NvbHVtbldpZGdldEhlaWdodChwV2lkZ2V0LCBwSW5mbyk7DQotICAgICAgICAgICAgaWYgKGZNYXhTaXplIDwgZldpZGdldFNpemUpIHsNCi0gICAgICAgICAgICAgICAgZk1heFNpemUgPSBmV2lkZ2V0U2l6ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBmTWF4U2l6ZSk7DQotfQ0KLXZvaWQgQ0ZXTF9HcmlkSW1wOjpQcm9jU2NhbGVkQ29sUm93KENGV0xfR3JpZENvbFJvdyAqcENvbFJvdywgaW50MzJfdCBuSW5kZXgsIEZYX0ZMT0FUIGZDb2xSb3dTaXplLCBGWF9CT09MIGJDb2x1bW4pDQotew0KLSAgICBpZiAoZkNvbFJvd1NpemUgPiAwKSB7DQotICAgICAgICBQcm9jRml4ZWRDb2xSb3cocENvbFJvdywgbkluZGV4LCBmQ29sUm93U2l6ZSwgYkNvbHVtbik7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0dyaWRJbXA6OkNhbGNXaWRnZXRXaWR0aChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8sIEZYX0ZMT0FUIGZDb2x1bm1XaWR0aCkNCi17DQotICAgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQotICAgICAgICBTZXRXaWRnZXRBY3R1YWxXaWR0aChwSW5mbywgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmZMZW5ndGgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhfRkxPQVQgZldpZHRoID0gMDsNCi0gICAgICAgIEZYX0ZMT0FUIGZMZWZ0TWFyZ2luID0gMCwgZlJpZ2h0TWFyZ2luID0gMDsNCi0gICAgICAgIEZYX0JPT0wgYkxlZnRNYXJnaW4gPSBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fTGVmdCwgZkxlZnRNYXJnaW4pOw0KLSAgICAgICAgRlhfQk9PTCBiUmlnaHRNYXJnaW4gPSBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fUmlnaHQsIGZSaWdodE1hcmdpbik7DQotICAgICAgICBpZiAoYkxlZnRNYXJnaW4gJiYgYlJpZ2h0TWFyZ2luKSB7DQotICAgICAgICAgICAgZldpZHRoID0gZkNvbHVubVdpZHRoIC0gZkxlZnRNYXJnaW4gLSBmUmlnaHRNYXJnaW47DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENGWF9SZWN0RiBydEF1dG87DQotICAgICAgICAgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEF1dG8sIFRSVUUpOw0KLSAgICAgICAgICAgIGZXaWR0aCA9IHJ0QXV0by5XaWR0aCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU2V0V2lkZ2V0QWN0dWFsV2lkdGgocEluZm8sIGZXaWR0aCk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0dyaWRJbXA6OkNhbGNXaWRnZXRIZWlndChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8sIEZYX0ZMT0FUIGZSb3dIZWlndCkNCi17DQotICAgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCkgew0KLSAgICAgICAgU2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KHBJbmZvLCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmZMZW5ndGgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhfRkxPQVQgZkhlaWdodCA9IDA7DQotICAgICAgICBGWF9GTE9BVCBmVG9wTWFyZ2luID0gMCwgZkJvdHRvbU1hcmdpbiA9IDA7DQotICAgICAgICBGWF9CT09MIGJUb3BNYXJnaW4gPSBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fVG9wLCBmVG9wTWFyZ2luKTsNCi0gICAgICAgIEZYX0JPT0wgYkJvdHRvbU1hcmdpbiA9IEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9Cb3R0b20sIGZCb3R0b21NYXJnaW4pOw0KLSAgICAgICAgaWYgKGJUb3BNYXJnaW4gJiYgYkJvdHRvbU1hcmdpbikgew0KLSAgICAgICAgICAgIGZIZWlnaHQgPSBmUm93SGVpZ3QgLSBmVG9wTWFyZ2luIC0gZkJvdHRvbU1hcmdpbjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0QXV0bzsNCi0gICAgICAgICAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0QXV0bywgVFJVRSk7DQotICAgICAgICAgICAgZkhlaWdodCA9IHJ0QXV0by5IZWlnaHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFNldFdpZGdldEFjdHVhbEhlaWdodChwSW5mbywgZkhlaWdodCk7DQotICAgIH0NCi19DQotRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpDYWxjQXV0b0NvbHVtbldpZGdldFdpZHRoKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbykNCi17DQotICAgIEZYX0ZMT0FUIGZMZWZ0TWFyZ2luID0gMCwgZlJpZ2h0TWFyZ2luID0gMDsNCi0gICAgRlhfQk9PTCBiTGVmdE1hcmdpbiA9IEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9MZWZ0LCBmTGVmdE1hcmdpbik7DQotICAgIEZYX0JPT0wgYlJpZ2h0TWFyZ2luID0gR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX1JpZ2h0LCBmUmlnaHRNYXJnaW4pOw0KLSAgICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCkgew0KLSAgICAgICAgU2V0V2lkZ2V0QWN0dWFsV2lkdGgocEluZm8sIHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5mTGVuZ3RoKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9SZWN0RiBydEF1dG87DQotICAgICAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0QXV0bywgVFJVRSk7DQotICAgICAgICBGWF9GTE9BVCBmV2lkdGggPSBydEF1dG8ud2lkdGg7DQotICAgICAgICBTZXRXaWRnZXRBY3R1YWxXaWR0aChwSW5mbywgZldpZHRoKTsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmVG90YWwgPSBwSW5mby0+bV9mQWN0dWFsV2lkdGg7DQotICAgIGlmIChiTGVmdE1hcmdpbikgew0KLSAgICAgICAgZlRvdGFsICs9IGZMZWZ0TWFyZ2luOw0KLSAgICB9DQotICAgIGlmIChiUmlnaHRNYXJnaW4pIHsNCi0gICAgICAgIGZUb3RhbCArPSBmUmlnaHRNYXJnaW47DQotICAgIH0NCi0gICAgcmV0dXJuIGZUb3RhbDsNCi19DQotRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpDYWxjQXV0b0NvbHVtbldpZGdldEhlaWdodChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8pDQotew0KLSAgICBGWF9GTE9BVCBmVG9wTWFyZ2luID0gMCwgZkJvdHRvbU1hcmdpbiA9IDA7DQotICAgIEZYX0JPT0wgYlRvcE1hcmdpbiA9IEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9Ub3AsIGZUb3BNYXJnaW4pOw0KLSAgICBGWF9CT09MIGJCb3R0b21NYXJnaW4gPSBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fQm90dG9tLCBmQm90dG9tTWFyZ2luKTsNCi0gICAgaWYgKHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQotICAgICAgICBTZXRXaWRnZXRBY3R1YWxIZWlnaHQocEluZm8sIHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZkxlbmd0aCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRBdXRvOw0KLSAgICAgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEF1dG8sIFRSVUUpOw0KLSAgICAgICAgRlhfRkxPQVQgZkhlaWdodCA9IHJ0QXV0by5oZWlnaHQ7DQotICAgICAgICBTZXRXaWRnZXRBY3R1YWxIZWlnaHQocEluZm8sIGZIZWlnaHQpOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZUb3RhbCA9IHBJbmZvLT5tX2ZBY3R1YWxIZWlnaHQ7DQotICAgIGlmIChiVG9wTWFyZ2luKSB7DQotICAgICAgICBmVG90YWwgKz0gZlRvcE1hcmdpbjsNCi0gICAgfQ0KLSAgICBpZiAoYkJvdHRvbU1hcmdpbikgew0KLSAgICAgICAgZlRvdGFsICs9IGZCb3R0b21NYXJnaW47DQotICAgIH0NCi0gICAgcmV0dXJuIGZUb3RhbDsNCi19DQotRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpQcm9jZXNzQ29sdW1ucyhGWF9GTE9BVCBmV2lkdGgpDQotew0KLSAgICBpZiAoZldpZHRoIDw9IDApIHsNCi0gICAgICAgIHJldHVybiBQcm9jZXNzVW5DZXJ0YWluQ29sdW1ucygpOw0KLSAgICB9DQorICB9DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwR3JhcGhpY3MtPkNvbmNhdE1hdHJpeCgoQ0ZYX01hdHJpeCopcE1hdHJpeCk7DQorICB9DQorICB7DQorICAgIEZYX0JPT0wgYkRyYXdMaW5lID0gRkFMU0U7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQogICAgIGludDMyX3QgaUNvbHVtbnMgPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaUNvbHVtbnMgPCAxKSB7DQotICAgICAgICByZXR1cm4gZldpZHRoOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZGaXhlZFdpZHRoID0gMDsNCi0gICAgRlhfRkxPQVQgZkF1dG9XaWR0aCA9IDA7DQotICAgIENGWF9QdHJBcnJheSBhdXRvQ29sdW1uczsNCi0gICAgQ0ZYX1B0ckFycmF5IHNjYWxlZENvbHVtbnM7DQotICAgIEZYX0ZMT0FUIGZTY2FsZWRDb2x1bW5OdW0gPSAwOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ29sdW1uczsgaSsrKSB7DQotICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiltX0NvbHVtbnNbaV07DQotICAgICAgICBpZiAoIXBDb2xSb3cpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHN3aXRjaChwQ29sUm93LT5tX1NpemUuZVVuaXQpIHsNCi0gICAgICAgICAgICBjYXNlIEZXTF9HUklEVU5JVF9GaXhlZDogew0KLSAgICAgICAgICAgICAgICAgICAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBwQ29sUm93LT5tX1NpemUuZkxlbmd0aCk7DQotICAgICAgICAgICAgICAgICAgICBmRml4ZWRXaWR0aCArPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIEZXTF9HUklEVU5JVF9BdXRvOiB7DQotICAgICAgICAgICAgICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCBpLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgIGF1dG9Db2x1bW5zLkFkZChwQ29sUm93KTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfU2NhbGVkOg0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgICAgIGZTY2FsZWRDb2x1bW5OdW0gKz0gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQotICAgICAgICAgICAgICAgICAgICBzY2FsZWRDb2x1bW5zLkFkZChwQ29sUm93KTsNCi0gICAgICAgICAgICAgICAgICAgIFNldENvbFJvd0FjdHVhbFNpemUocENvbFJvdywgMCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIHdoaWxlIChwcykgew0KLSAgICAgICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBOVUxMOw0KLSAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSBOVUxMOw0KLSAgICAgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCi0gICAgICAgIGlmICghcEluZm8gfHwgcEluZm8tPm1faUNvbHVtblNwYW4gPCAyKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDRlhfUHRyQXJyYXkgc3BhbkF1dG9Db2x1bW5zOw0KLSAgICAgICAgRlhfRkxPQVQgZlNwYW5TaXplID0gMDsNCi0gICAgICAgIGludDMyX3QgaUF1dG9Db2xSb3dzID0gMDsNCi0gICAgICAgIGludDMyX3QgaVNjYWxlZENvbFJvd3MgPSAwOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcEluZm8tPm1faUNvbHVtblNwYW47IGkrKykgew0KLSAgICAgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbHVtbiA9IChDRldMX0dyaWRDb2xSb3cqKUdldENvbFJvdyhUUlVFLCBwSW5mby0+bV9pQ29sdW1uICsgaSk7DQotICAgICAgICAgICAgaWYgKCFwQ29sdW1uKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmU3BhblNpemUgKz0gcENvbHVtbi0+bV9mQWN0dWFsU2l6ZTsNCi0gICAgICAgICAgICBpZiAocENvbHVtbi0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9BdXRvKSB7DQotICAgICAgICAgICAgICAgIGlBdXRvQ29sUm93cysrOw0KLSAgICAgICAgICAgICAgICBzcGFuQXV0b0NvbHVtbnMuQWRkKHBDb2x1bW4pOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocENvbHVtbi0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9TY2FsZWQpIHsNCi0gICAgICAgICAgICAgICAgaVNjYWxlZENvbFJvd3MrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoaUF1dG9Db2xSb3dzIDwgMSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRkxPQVQgZldpZGdldFdpZHRoID0gQ2FsY0F1dG9Db2x1bW5XaWRnZXRXaWR0aChwV2lkZ2V0LCBwSW5mbyk7DQotICAgICAgICBpZiAoZldpZGdldFdpZHRoID4gZlNwYW5TaXplKSB7DQotICAgICAgICAgICAgaWYgKGlTY2FsZWRDb2xSb3dzID4gMCkgew0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIFNldFNwYW5BdXRvQ29sUm93U2l6ZShzcGFuQXV0b0NvbHVtbnMsIGZXaWRnZXRXaWR0aCAtIGZTcGFuU2l6ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGludDMyX3QgaUF1dG9Db2xzID0gYXV0b0NvbHVtbnMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBpQXV0b0NvbHM7IGsrKykgew0KLSAgICAgICAgZkF1dG9XaWR0aCArPSAoKENGV0xfR3JpZENvbFJvdyopYXV0b0NvbHVtbnNba10pLT5tX2ZBY3R1YWxTaXplOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZTY2FsZWRXaWR0aCA9IGZXaWR0aCAtIGZGaXhlZFdpZHRoIC0gZkF1dG9XaWR0aDsNCi0gICAgaWYgKGZTY2FsZWRXaWR0aCA+IDAgJiYgZlNjYWxlZENvbHVtbk51bSA+IDApIHsNCi0gICAgICAgIFNldFNjYWxlZENvbFJvd3NTaXplKHNjYWxlZENvbHVtbnMsIGZTY2FsZWRXaWR0aCwgZlNjYWxlZENvbHVtbk51bSk7DQotICAgIH0NCi0gICAgcmV0dXJuIGZXaWR0aDsNCi19DQotRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpQcm9jZXNzUm93cyhGWF9GTE9BVCBmSGVpZ2h0KQ0KLXsNCi0gICAgaWYgKGZIZWlnaHQgPD0gMCkgew0KLSAgICAgICAgcmV0dXJuIFByb2Nlc3NVbkNlcnRhaW5Sb3dzKCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlDb2x1bW5zOyBpKyspIHsNCisgICAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiltX0NvbHVtbnNbaV07DQorICAgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKCFiRHJhd0xpbmUpIHsNCisgICAgICAgIGJEcmF3TGluZSA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIHBhdGguQWRkTGluZShwQ29sUm93LT5tX2ZBY3R1YWxQb3MsIDAsIHBDb2xSb3ctPm1fZkFjdHVhbFBvcywNCisgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KICAgICB9DQogICAgIGludDMyX3QgaVJvd3MgPSBtX1Jvd3MuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaVJvd3MgPCAxKSB7DQotICAgICAgICByZXR1cm4gZkhlaWdodDsNCisgICAgZm9yIChpbnQzMl90IGogPSAxOyBqIDwgaVJvd3M7IGorKykgew0KKyAgICAgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKW1fUm93c1tqXTsNCisgICAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoIWJEcmF3TGluZSkgew0KKyAgICAgICAgYkRyYXdMaW5lID0gVFJVRTsNCisgICAgICB9DQorICAgICAgcGF0aC5BZGRMaW5lKDAsIHBDb2xSb3ctPm1fZkFjdHVhbFBvcywgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgcENvbFJvdy0+bV9mQWN0dWFsUG9zKTsNCiAgICAgfQ0KLSAgICBGWF9GTE9BVCBmRml4ZWRIZWlnaHQgPSAwOw0KLSAgICBGWF9GTE9BVCBmQXV0b0hlaWd0ID0gMDsNCi0gICAgQ0ZYX1B0ckFycmF5IGF1dG9Sb3dzOw0KLSAgICBDRlhfUHRyQXJyYXkgc2NhbGVkUm93czsNCi0gICAgRlhfRkxPQVQgZlNjYWxlZFJvd051bSA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlSb3dzOyBpKyspIHsNCi0gICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKW1fUm93c1tpXTsNCi0gICAgICAgIGlmICghcENvbFJvdykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3dpdGNoKHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCkgew0KLSAgICAgICAgICAgIGNhc2UgRldMX0dSSURVTklUX0ZpeGVkOiB7DQotICAgICAgICAgICAgICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZGaXhlZEhlaWdodCArPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIEZXTF9HUklEVU5JVF9BdXRvOiB7DQotICAgICAgICAgICAgICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCBpLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICBhdXRvUm93cy5BZGQocENvbFJvdyk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRldMX0dSSURVTklUX1NjYWxlZDoNCi0gICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICBmU2NhbGVkUm93TnVtICs9IHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICAgICAgc2NhbGVkUm93cy5BZGQocENvbFJvdyk7DQotICAgICAgICAgICAgICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIDApOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgICAgaWYgKGJEcmF3TGluZSkgew0KKyAgICAgIENGWF9Db2xvciBjcigweEZGRkYwMDAwKTsNCisgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQorICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoKTsNCiAgICAgfQ0KLSAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIHdoaWxlIChwcykgew0KLSAgICAgICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBOVUxMOw0KLSAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSBOVUxMOw0KLSAgICAgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCi0gICAgICAgIGlmICghcEluZm8gfHwgcEluZm8tPm1faVJvd1NwYW4gPCAyKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDRlhfUHRyQXJyYXkgc3BhbkF1dG9Sb3dzOw0KLSAgICAgICAgRlhfRkxPQVQgZlNwYW5TaXplID0gMDsNCi0gICAgICAgIGludDMyX3QgaUF1dG9Db2xSb3dzID0gMDsNCi0gICAgICAgIGludDMyX3QgaVNjYWxlZENvbFJvd3MgPSAwOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcEluZm8tPm1faVJvd1NwYW47IGkrKykgew0KLSAgICAgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKUdldENvbFJvdyhGQUxTRSwgcEluZm8tPm1faVJvdyArIGkpOw0KLSAgICAgICAgICAgIGlmICghcFJvdykgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZlNwYW5TaXplICs9IHBSb3ctPm1fZkFjdHVhbFNpemU7DQotICAgICAgICAgICAgaWYgKHBSb3ctPm1fU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfQXV0bykgew0KLSAgICAgICAgICAgICAgICBpQXV0b0NvbFJvd3MrKzsNCi0gICAgICAgICAgICAgICAgc3BhbkF1dG9Sb3dzLkFkZChwUm93KTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHBSb3ctPm1fU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfU2NhbGVkKSB7DQotICAgICAgICAgICAgICAgIGlTY2FsZWRDb2xSb3dzKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlBdXRvQ29sUm93cyA8IDEpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZMT0FUIGZXaWRnZXRIZWlnaHQgPSBDYWxjQXV0b0NvbHVtbldpZGdldEhlaWdodChwV2lkZ2V0LCBwSW5mbyk7DQotICAgICAgICBpZiAoZldpZGdldEhlaWdodCA+IGZTcGFuU2l6ZSkgew0KLSAgICAgICAgICAgIGlmIChpU2NhbGVkQ29sUm93cyA+IDApIHsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBTZXRTcGFuQXV0b0NvbFJvd1NpemUoc3BhbkF1dG9Sb3dzLCBmV2lkZ2V0SGVpZ2h0IC0gZlNwYW5TaXplKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBpQXV0b1Jvd3MgPSBhdXRvUm93cy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IGlBdXRvUm93czsgaysrKSB7DQotICAgICAgICBmQXV0b0hlaWd0ICs9ICgoQ0ZXTF9HcmlkQ29sUm93KilhdXRvUm93c1trXSktPm1fZkFjdHVhbFNpemU7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZlNjYWxlZEhlaWdodCA9IGZIZWlnaHQgLSBmRml4ZWRIZWlnaHQgLSBmQXV0b0hlaWd0Ow0KLSAgICBpZiAoZlNjYWxlZEhlaWdodCA+IDAgJiYgZlNjYWxlZFJvd051bSA+IDApIHsNCi0gICAgICAgIFNldFNjYWxlZENvbFJvd3NTaXplKHNjYWxlZFJvd3MsIGZTY2FsZWRIZWlnaHQsIGZTY2FsZWRSb3dOdW0pOw0KLSAgICB9DQotICAgIHJldHVybiBmSGVpZ2h0Ow0KKyAgfQ0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GWF9GTE9BVCBDRldMX0dyaWRJbXA6OlByb2Nlc3NVbkNlcnRhaW5Db2x1bW5zKCkNCi17DQotICAgIGludDMyX3QgaUNvbHVtbnMgPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaUNvbHVtbnMgPCAxKSB7DQotICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSBuZXcgQ0ZXTF9HcmlkQ29sUm93Ow0KLSAgICAgICAgcENvbFJvdy0+bV9TaXplLmVVbml0ID0gRldMX0dSSURVTklUX0F1dG87DQotICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCAwLCBUUlVFKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQotICAgICAgICBkZWxldGUgcENvbFJvdzsNCi0gICAgICAgIHJldHVybiBmV2lkdGg7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZkZpeGVkV2lkdGggPSAwOw0KLSAgICBDRlhfUHRyQXJyYXkgYXV0b0NvbHVtbnM7DQotICAgIENGWF9QdHJBcnJheSBzY2FsZWRDb2x1bW5zOw0KLSAgICBGWF9GTE9BVCBmU2NhbGVkQ29sdW1uTnVtID0gMDsNCi0gICAgRlhfRkxPQVQgZlNjYWxlZE1heFBlcldpZHRoID0gMDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvbHVtbnM7IGkrKykgew0KLSAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopbV9Db2x1bW5zW2ldOw0KLSAgICAgICAgaWYgKCFwQ29sUm93KSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBzd2l0Y2gocENvbFJvdy0+bV9TaXplLmVVbml0KSB7DQotICAgICAgICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfRml4ZWQ6IHsNCi0gICAgICAgICAgICAgICAgICAgIFNldENvbFJvd0FjdHVhbFNpemUocENvbFJvdywgcENvbFJvdy0+bV9TaXplLmZMZW5ndGgpOw0KLSAgICAgICAgICAgICAgICAgICAgZkZpeGVkV2lkdGggKz0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfQXV0bzogew0KLSAgICAgICAgICAgICAgICAgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgaSwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICBhdXRvQ29sdW1ucy5BZGQocENvbFJvdyk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRldMX0dSSURVTklUX1NjYWxlZDoNCi0gICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCBpLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgIGZTY2FsZWRDb2x1bW5OdW0gKz0gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQotICAgICAgICAgICAgICAgICAgICBzY2FsZWRDb2x1bW5zLkFkZChwQ29sUm93KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQ29sUm93LT5tX1NpemUuZkxlbmd0aCA8PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVyV2lkdGggPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplIC8gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZlBlcldpZHRoID4gZlNjYWxlZE1heFBlcldpZHRoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZlNjYWxlZE1heFBlcldpZHRoID0gZlBlcldpZHRoOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaUNvbHVtbnMgPSBzY2FsZWRDb2x1bW5zLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaUNvbHVtbnM7IGorKykgew0KLSAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopc2NhbGVkQ29sdW1uc1tqXTsNCi0gICAgICAgIGlmICghcENvbFJvdykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBmU2NhbGVkTWF4UGVyV2lkdGggKiBwQ29sUm93LT5tX1NpemUuZkxlbmd0aCk7DQotICAgIH0NCi0gICAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFdpZGdldEluZm8uR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHMpIHsNCi0gICAgICAgIElGV0xfV2lkZ2V0ICpwV2lkZ2V0ID0gTlVMTDsNCi0gICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gTlVMTDsNCi0gICAgICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFdpZGdldCwgKHZvaWQqJilwSW5mbyk7DQotICAgICAgICBpZiAoIXBJbmZvIHx8IHBJbmZvLT5tX2lDb2x1bW5TcGFuIDwgMikgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1B0ckFycmF5IHNwYW5BdXRvQ29sdW1uczsNCi0gICAgICAgIENGWF9QdHJBcnJheSBzcGFuU2NhbGVkQ29sdW1uczsNCi0gICAgICAgIEZYX0ZMT0FUIGZTcGFuU2l6ZSA9IDA7DQotICAgICAgICBGWF9GTE9BVCBmU2NhbGVkU3VtID0gMDsNCi0gICAgICAgIGludDMyX3QgaUF1dG9Db2xSb3dzID0gMDsNCi0gICAgICAgIGludDMyX3QgaVNjYWxlZENvbFJvd3MgPSAwOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcEluZm8tPm1faUNvbHVtblNwYW47IGkrKykgew0KLSAgICAgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbHVtbiA9IChDRldMX0dyaWRDb2xSb3cqKUdldENvbFJvdyhUUlVFLCBwSW5mby0+bV9pQ29sdW1uICsgaSk7DQotICAgICAgICAgICAgaWYgKCFwQ29sdW1uKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmU3BhblNpemUgKz0gcENvbHVtbi0+bV9mQWN0dWFsU2l6ZTsNCi0gICAgICAgICAgICBpZiAocENvbHVtbi0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9BdXRvKSB7DQotICAgICAgICAgICAgICAgIGlBdXRvQ29sUm93cysrOw0KLSAgICAgICAgICAgICAgICBzcGFuQXV0b0NvbHVtbnMuQWRkKHBDb2x1bW4pOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocENvbHVtbi0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9TY2FsZWQpIHsNCi0gICAgICAgICAgICAgICAgaVNjYWxlZENvbFJvd3MrKzsNCi0gICAgICAgICAgICAgICAgZlNjYWxlZFN1bSArPSBwQ29sdW1uLT5tX1NpemUuZkxlbmd0aDsNCi0gICAgICAgICAgICAgICAgc3BhblNjYWxlZENvbHVtbnMuQWRkKHBDb2x1bW4pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpQXV0b0NvbFJvd3MgPCAxICYmIGlTY2FsZWRDb2xSb3dzIDwgMSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRkxPQVQgZldpZGdldFdpZHRoID0gQ2FsY0F1dG9Db2x1bW5XaWRnZXRXaWR0aChwV2lkZ2V0LCBwSW5mbyk7DQotICAgICAgICBpZiAoZldpZGdldFdpZHRoID4gZlNwYW5TaXplKSB7DQotICAgICAgICAgICAgaWYgKGlTY2FsZWRDb2xSb3dzID4gMCApIHsNCi0gICAgICAgICAgICAgICAgaWYgKGZTY2FsZWRTdW0gPD0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgU2V0U3BhblNjYWxlZENvbFJvd1NpemUoc3BhblNjYWxlZENvbHVtbnMsIGZXaWRnZXRXaWR0aCAtIGZTcGFuU2l6ZSwgZlNjYWxlZFN1bSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgU2V0U3BhbkF1dG9Db2xSb3dTaXplKHNwYW5BdXRvQ29sdW1ucywgZldpZGdldFdpZHRoIC0gZlNwYW5TaXplKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZkF1dG9XaWR0aCA9IDA7DQotICAgIGludDMyX3QgaUF1dG9Db2xzID0gYXV0b0NvbHVtbnMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgbSA9IDA7IG0gPCBpQXV0b0NvbHM7IG0rKykgew0KLSAgICAgICAgZkF1dG9XaWR0aCArPSAoKENGV0xfR3JpZENvbFJvdyopYXV0b0NvbHVtbnNbbV0pLT5tX2ZBY3R1YWxTaXplOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZTY2FsZWRXaWR0aCA9IDA7DQotICAgIGlDb2x1bW5zID0gc2NhbGVkQ29sdW1ucy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBuID0gMDsgbiA8IGlDb2x1bW5zOyBuKyspIHsNCi0gICAgICAgIGZTY2FsZWRXaWR0aCArPSAoKENGV0xfR3JpZENvbFJvdyopc2NhbGVkQ29sdW1uc1tuXSktPm1fZkFjdHVhbFNpemU7DQotICAgIH0NCi0gICAgcmV0dXJuIGZGaXhlZFdpZHRoICsgZkF1dG9XaWR0aCArIGZTY2FsZWRXaWR0aDsNCitGV0xfRVJSIENGV0xfR3JpZEltcDo6SW5zZXJ0V2lkZ2V0KElGV0xfV2lkZ2V0KiBwQ2hpbGQsIGludDMyX3QgbkluZGV4KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBDaGlsZCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIENGV0xfQ29udGVudEltcDo6SW5zZXJ0V2lkZ2V0KHBDaGlsZCwgbkluZGV4KTsNCisgIGlmICghbV9tYXBXaWRnZXRJbmZvLkdldFZhbHVlQXQocENoaWxkKSkgew0KKyAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9IEZYX05FVyBDRldMX0dyaWRXaWRnZXRJbmZvOw0KKyAgICBtX21hcFdpZGdldEluZm8uU2V0QXQocENoaWxkLCBwSW5mbyk7DQorICAgIG1fV2lkZ2V0cy5BZGQocENoaWxkKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpQcm9jZXNzVW5DZXJ0YWluUm93cygpDQotew0KLSAgICBpbnQzMl90IGlSb3dzID0gbV9Sb3dzLkdldFNpemUoKTsNCi0gICAgaWYgKGlSb3dzIDwgMSkgew0KLSAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gbmV3IENGV0xfR3JpZENvbFJvdzsNCi0gICAgICAgIHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KLSAgICAgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgMCwgRkFMU0UpOw0KLSAgICAgICAgRlhfRkxPQVQgZldpZHRoID0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCi0gICAgICAgIGRlbGV0ZSBwQ29sUm93Ow0KLSAgICAgICAgcmV0dXJuIGZXaWR0aDsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmRml4ZWRIZWlnaHQgPSAwOw0KLSAgICBDRlhfUHRyQXJyYXkgYXV0b1Jvd3M7DQotICAgIENGWF9QdHJBcnJheSBzY2FsZWRSb3dzOw0KLSAgICBGWF9GTE9BVCBmU2NhbGVkUm93TnVtID0gMDsNCi0gICAgRlhfRkxPQVQgZlNjYWxlZE1heFBlckhlaWdodCA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlSb3dzOyBpKyspIHsNCi0gICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKW1fUm93c1tpXTsNCi0gICAgICAgIGlmICghcENvbFJvdykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3dpdGNoKHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCkgew0KLSAgICAgICAgICAgIGNhc2UgRldMX0dSSURVTklUX0ZpeGVkOiB7DQotICAgICAgICAgICAgICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZGaXhlZEhlaWdodCArPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIEZXTF9HUklEVU5JVF9BdXRvOiB7DQotICAgICAgICAgICAgICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCBpLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICBhdXRvUm93cy5BZGQocENvbFJvdyk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRldMX0dSSURVTklUX1NjYWxlZDoNCi0gICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCBpLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICBmU2NhbGVkUm93TnVtICs9IHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICAgICAgc2NhbGVkUm93cy5BZGQocENvbFJvdyk7DQotICAgICAgICAgICAgICAgICAgICBpZiAocENvbFJvdy0+bV9TaXplLmZMZW5ndGggPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlckhlaWdodCA9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgLyBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZlBlckhlaWdodCA+IGZTY2FsZWRNYXhQZXJIZWlnaHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZlNjYWxlZE1heFBlckhlaWdodCA9IGZQZXJIZWlnaHQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpUm93cyA9IHNjYWxlZFJvd3MuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUm93czsgaisrKSB7DQotICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KilzY2FsZWRSb3dzW2pdOw0KLSAgICAgICAgaWYgKCFwQ29sUm93KSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIGZTY2FsZWRNYXhQZXJIZWlnaHQgKiBwQ29sUm93LT5tX1NpemUuZkxlbmd0aCk7DQotICAgIH0NCi0gICAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFdpZGdldEluZm8uR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHMpIHsNCi0gICAgICAgIElGV0xfV2lkZ2V0ICpwV2lkZ2V0ID0gTlVMTDsNCi0gICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvID0gTlVMTDsNCi0gICAgICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFdpZGdldCwgKHZvaWQqJilwSW5mbyk7DQotICAgICAgICBpZiAocEluZm8tPm1faVJvd1NwYW4gPCAyKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDRlhfUHRyQXJyYXkgc3BhbkF1dG9Sb3dzOw0KLSAgICAgICAgQ0ZYX1B0ckFycmF5IHNwYW5TY2FsZWRSb3dzOw0KLSAgICAgICAgRlhfRkxPQVQgZlNwYW5TaXplID0gMDsNCi0gICAgICAgIEZYX0ZMT0FUIGZTY2FsZWRTdW0gPSAwOw0KLSAgICAgICAgaW50MzJfdCBpQXV0b0NvbFJvd3MgPSAwOw0KLSAgICAgICAgaW50MzJfdCBpU2NhbGVkQ29sUm93cyA9IDA7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwSW5mby0+bV9pUm93U3BhbjsgaSsrKSB7DQotICAgICAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwUm93ID0gKENGV0xfR3JpZENvbFJvdyopR2V0Q29sUm93KEZBTFNFLCBwSW5mby0+bV9pUm93ICsgaSk7DQotICAgICAgICAgICAgaWYgKCFwUm93KSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmU3BhblNpemUgKz0gcFJvdy0+bV9mQWN0dWFsU2l6ZTsNCi0gICAgICAgICAgICBpZiAocFJvdy0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9BdXRvKSB7DQotICAgICAgICAgICAgICAgIGlBdXRvQ29sUm93cysrOw0KLSAgICAgICAgICAgICAgICBzcGFuQXV0b1Jvd3MuQWRkKHBSb3cpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocFJvdy0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9TY2FsZWQpIHsNCi0gICAgICAgICAgICAgICAgaVNjYWxlZENvbFJvd3MrKzsNCi0gICAgICAgICAgICAgICAgZlNjYWxlZFN1bSArPSBwUm93LT5tX1NpemUuZkxlbmd0aDsNCi0gICAgICAgICAgICAgICAgc3BhblNjYWxlZFJvd3MuQWRkKHBSb3cpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpQXV0b0NvbFJvd3MgPCAxICYmIGlTY2FsZWRDb2xSb3dzIDwgMSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRkxPQVQgZldpZGdldEhlaWdodCA9IENhbGNBdXRvQ29sdW1uV2lkZ2V0SGVpZ2h0KHBXaWRnZXQsIHBJbmZvKTsNCi0gICAgICAgIGlmIChmV2lkZ2V0SGVpZ2h0ID4gZlNwYW5TaXplKSB7DQotICAgICAgICAgICAgaWYgKGlTY2FsZWRDb2xSb3dzID4gMCkgew0KLSAgICAgICAgICAgICAgICBpZiAoZlNjYWxlZFN1bSA8PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBTZXRTcGFuU2NhbGVkQ29sUm93U2l6ZShzcGFuU2NhbGVkUm93cywgZldpZGdldEhlaWdodCAtIGZTcGFuU2l6ZSwgZlNjYWxlZFN1bSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgU2V0U3BhbkF1dG9Db2xSb3dTaXplKHNwYW5BdXRvUm93cywgZldpZGdldEhlaWdodCAtIGZTcGFuU2l6ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZBdXRvSGVpZ3QgPSAwOw0KLSAgICBpbnQzMl90IGlBdXRvUm93cyA9IGF1dG9Sb3dzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IG0gPSAwOyBtIDwgaUF1dG9Sb3dzOyBtKyspIHsNCi0gICAgICAgIGZBdXRvSGVpZ3QgKz0gKChDRldMX0dyaWRDb2xSb3cqKWF1dG9Sb3dzW21dKS0+bV9mQWN0dWFsU2l6ZTsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmU2NhbGVkSGVpZ2h0ID0gMDsNCi0gICAgaVJvd3MgPSBzY2FsZWRSb3dzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IG4gPSAwOyBuIDwgaVJvd3M7IG4rKykgew0KLSAgICAgICAgZlNjYWxlZEhlaWdodCArPSAoKENGV0xfR3JpZENvbFJvdyopc2NhbGVkUm93c1tuXSktPm1fZkFjdHVhbFNpemU7DQotICAgIH0NCi0gICAgcmV0dXJuIGZGaXhlZEhlaWdodCArIGZBdXRvSGVpZ3QgKyBmU2NhbGVkSGVpZ2h0Ow0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpSZW1vdmVXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIENGV0xfQ29udGVudEltcDo6UmVtb3ZlV2lkZ2V0KHBXaWRnZXQpOw0KKyAgaWYgKENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0NCisgICAgICAgICAgKENGV0xfR3JpZFdpZGdldEluZm8qKW1fbWFwV2lkZ2V0SW5mby5HZXRWYWx1ZUF0KHBXaWRnZXQpKSB7DQorICAgIG1fbWFwV2lkZ2V0SW5mby5SZW1vdmVLZXkocFdpZGdldCk7DQorICAgIGRlbGV0ZSBwSW5mbzsNCisgICAgaW50MzJfdCBuSW5kZXggPSBtX1dpZGdldHMuRmluZChwV2lkZ2V0KTsNCisgICAgbV9XaWRnZXRzLlJlbW92ZUF0KG5JbmRleCwgMSk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9HcmlkSW1wOjpTZXRDb2xSb3dBY3R1YWxTaXplKENGV0xfR3JpZENvbFJvdyogcENvbFJvdywgRlhfRkxPQVQgZlNpemUsIEZYX0JPT0wgYlNldEJleW9uZCApDQotew0KLSAgICBpZiAocENvbFJvdy0+bV9NaW5TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCAmJiBmU2l6ZSA8IHBDb2xSb3ctPm1fTWluU2l6ZS5mTGVuZ3RoKSB7DQotICAgICAgICBwQ29sUm93LT5tX2ZBY3R1YWxTaXplID0gcENvbFJvdy0+bV9NaW5TaXplLmZMZW5ndGg7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorRldMX0hHUklEQ09MUk9XIENGV0xfR3JpZEltcDo6SW5zZXJ0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChiQ29sdW1uKSB7DQorICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+IG1fQ29sdW1ucy5HZXRTaXplKCkpIHsNCisgICAgICBuSW5kZXggPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KICAgICB9DQotICAgIGlmIChwQ29sUm93LT5tX01heFNpemUuZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkICYmIGZTaXplID4gcENvbFJvdy0+bV9NYXhTaXplLmZMZW5ndGgpIHsNCi0gICAgICAgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgPSBwQ29sUm93LT5tX01heFNpemUuZkxlbmd0aDsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sdW1uID0gRlhfTkVXIENGV0xfR3JpZENvbFJvdzsNCisgICAgbV9Db2x1bW5zLkluc2VydEF0KG5JbmRleCwgcENvbHVtbiwgMSk7DQorICAgIHJldHVybiAoRldMX0hHUklEQ09MUk9XKXBDb2x1bW47DQorICB9DQorICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPiBtX1Jvd3MuR2V0U2l6ZSgpKSB7DQorICAgIG5JbmRleCA9IG1fUm93cy5HZXRTaXplKCk7DQorICB9DQorICBDRldMX0dyaWRDb2xSb3cqIHBSb3cgPSBGWF9ORVcgQ0ZXTF9HcmlkQ29sUm93Ow0KKyAgbV9Sb3dzLkluc2VydEF0KG5JbmRleCwgcFJvdywgMSk7DQorICByZXR1cm4gKEZXTF9IR1JJRENPTFJPVylwUm93Ow0KK30NCitpbnQzMl90IENGV0xfR3JpZEltcDo6Q291bnRDb2xSb3dzKEZYX0JPT0wgYkNvbHVtbikgew0KKyAgaWYgKGJDb2x1bW4pIHsNCisgICAgcmV0dXJuIG1fQ29sdW1ucy5HZXRTaXplKCk7DQorICB9DQorICByZXR1cm4gbV9Sb3dzLkdldFNpemUoKTsNCit9DQorRldMX0hHUklEQ09MUk9XIENGV0xfR3JpZEltcDo6R2V0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChiQ29sdW1uKSB7DQorICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX0NvbHVtbnMuR2V0U2l6ZSgpKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQogICAgIH0NCi0gICAgaWYgKGJTZXRCZXlvbmQpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgPSBmU2l6ZTsNCisgICAgcmV0dXJuIChGV0xfSEdSSURDT0xST1cpbV9Db2x1bW5zW25JbmRleF07DQorICB9DQorICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9Sb3dzLkdldFNpemUoKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiAoRldMX0hHUklEQ09MUk9XKW1fUm93c1tuSW5kZXhdOw0KK30NCitpbnQzMl90IENGV0xfR3JpZEltcDo6R2V0SW5kZXgoRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpIHsNCisgIGlmIChJc0NvbHVtbihoQ29sUm93KSkgew0KKyAgICByZXR1cm4gbV9Db2x1bW5zLkZpbmQoaENvbFJvdyk7DQorICB9DQorICByZXR1cm4gbV9Sb3dzLkZpbmQoaENvbFJvdyk7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6R2V0U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUJiBlVW5pdCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoQ29sUm93LCAtMSk7DQorICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiloQ29sUm93Ow0KKyAgZVVuaXQgPSBwQ29sUm93LT5tX1NpemUuZVVuaXQ7DQorICByZXR1cm4gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVW5pdCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoQ29sUm93LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopaENvbFJvdzsNCisgIHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCA9IGVVbml0Ow0KKyAgcENvbFJvdy0+bV9TaXplLmZMZW5ndGggPSBmU2l6ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpHZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQmIGVVbml0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhDb2xSb3csIC0xKTsNCisgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKWhDb2xSb3c7DQorICBlVW5pdCA9IHBDb2xSb3ctPm1fTWluU2l6ZS5lVW5pdDsNCisgIHJldHVybiBwQ29sUm93LT5tX01pblNpemUuZkxlbmd0aDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldE1pblNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVbml0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhDb2xSb3csIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiloQ29sUm93Ow0KKyAgcENvbFJvdy0+bV9NaW5TaXplLmVVbml0ID0gZVVuaXQ7DQorICBwQ29sUm93LT5tX01pblNpemUuZkxlbmd0aCA9IGZTaXplOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OkdldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCYgZVVuaXQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaENvbFJvdywgLTEpOw0KKyAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopaENvbFJvdzsNCisgIGVVbml0ID0gcENvbFJvdy0+bV9NYXhTaXplLmVVbml0Ow0KKyAgcmV0dXJuIHBDb2xSb3ctPm1fTWF4U2l6ZS5mTGVuZ3RoOw0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6U2V0TWF4U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVuaXQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaENvbFJvdywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKWhDb2xSb3c7DQorICBwQ29sUm93LT5tX01heFNpemUuZVVuaXQgPSBlVW5pdDsNCisgIHBDb2xSb3ctPm1fTWF4U2l6ZS5mTGVuZ3RoID0gZlNpemU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9HcmlkSW1wOjpEZWxldGVDb2xSb3coRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpIHsNCisgIGludDMyX3QgbkluZGV4ID0gbV9Db2x1bW5zLkZpbmQoaENvbFJvdyk7DQorICBpZiAobkluZGV4ID49IDApIHsNCisgICAgbV9Db2x1bW5zLlJlbW92ZUF0KG5JbmRleCk7DQorICAgIGRlbGV0ZSAoQ0ZXTF9HcmlkQ29sUm93KiloQ29sUm93Ow0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIG5JbmRleCA9IG1fUm93cy5GaW5kKGhDb2xSb3cpOw0KKyAgaWYgKG5JbmRleCA+PSAwKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9HcmlkQ29sUm93KiloQ29sUm93Ow0KKyAgICBtX1Jvd3MuUmVtb3ZlQXQobkluZGV4KTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0ZMT0FUIENGV0xfR3JpZEltcDo6U2V0V2lkZ2V0QWN0dWFsV2lkdGgoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8sIEZYX0ZMT0FUIGZXaWR0aCkNCi17DQotICAgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkICYmDQotICAgICAgICAgICAgZldpZHRoIDwgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluV2lkdGhdLmZMZW5ndGgpIHsNCi0gICAgICAgIGZXaWR0aCA9IHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX01pbldpZHRoXS5mTGVuZ3RoOw0KK0ZYX0JPT0wgQ0ZXTF9HcmlkSW1wOjpJc0NvbHVtbihGV0xfSEdSSURDT0xST1cgaENvbFJvdykgew0KKyAgcmV0dXJuIG1fQ29sdW1ucy5GaW5kKGhDb2xSb3cpICE9IC0xOw0KK30NCitpbnQzMl90IENGV0xfR3JpZEltcDo6R2V0V2lkZ2V0UG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJDb2x1bW4pIHsNCisgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0gKENGV0xfR3JpZFdpZGdldEluZm8qKUdldFdpZGdldEluZm8ocFdpZGdldCk7DQorICBpZiAocEluZm8pIHsNCisgICAgcmV0dXJuIGJDb2x1bW4gPyBwSW5mby0+bV9pQ29sdW1uIDogcEluZm8tPm1faVJvdzsNCisgIH0NCisgIHJldHVybiAtMTsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldFdpZGdldFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbHVtbikgew0KKyAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8gPSAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KTsNCisgIGlmIChwSW5mbykgew0KKyAgICBiQ29sdW1uID8gcEluZm8tPm1faUNvbHVtbiA9IGlQb3MgOiBwSW5mby0+bV9pUm93ID0gaVBvczsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQoraW50MzJfdCBDRldMX0dyaWRJbXA6OkdldFdpZGdldFNwYW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYkNvbHVtbikgew0KKyAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8gPSAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KTsNCisgIGlmIChwSW5mbykgew0KKyAgICByZXR1cm4gYkNvbHVtbiA/IHBJbmZvLT5tX2lDb2x1bW5TcGFuIDogcEluZm8tPm1faVJvd1NwYW47DQorICB9DQorICByZXR1cm4gMDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldFdpZGdldFNwYW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3BhbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb2x1bW4pIHsNCisgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0gKENGV0xfR3JpZFdpZGdldEluZm8qKUdldFdpZGdldEluZm8ocFdpZGdldCk7DQorICBpZiAocEluZm8pIHsNCisgICAgYkNvbHVtbiA/IHBJbmZvLT5tX2lDb2x1bW5TcGFuID0gaVNwYW4gOiBwSW5mby0+bV9pUm93U3BhbiA9IGlTcGFuOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OkdldFdpZGdldFNpemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEU0laRSBlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUJiBlVW5pdCkgew0KKyAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8gPSAoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyopR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KTsNCisgIGlmIChwSW5mbykgew0KKyAgICBlVW5pdCA9IHBJbmZvLT5tX1NpemVbZVNpemVdLmVVbml0Ow0KKyAgICByZXR1cm4gcEluZm8tPm1fU2l6ZVtlU2l6ZV0uZkxlbmd0aDsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6U2V0V2lkZ2V0U2l6ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFNJWkUgZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVaXQpIHsNCisgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0gKENGV0xfR3JpZFdpZGdldEluZm8qKUdldFdpZGdldEluZm8ocFdpZGdldCk7DQorICBpZiAocEluZm8pIHsNCisgICAgcEluZm8tPm1fU2l6ZVtlU2l6ZV0uZkxlbmd0aCA9IGZTaXplOw0KKyAgICBwSW5mby0+bV9TaXplW2VTaXplXS5lVW5pdCA9IGVVaXQ7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9HcmlkSW1wOjpHZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZNYXJnaW4pIHsNCisgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0gKENGV0xfR3JpZFdpZGdldEluZm8qKUdldFdpZGdldEluZm8ocFdpZGdldCk7DQorICBpZiAocEluZm8pIHsNCisgICAgZk1hcmdpbiA9IHBJbmZvLT5tX01hcmdpbltlTWFyZ2luXTsNCisgICAgcmV0dXJuIChwSW5mby0+bV9kd01hcmdpbkZsYWcgJiAoMSA8PCBlTWFyZ2luKSkgIT0gMDsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldFdpZGdldE1hcmdpbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWFyZ2luKSB7DQorICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9IChDRldMX0dyaWRXaWRnZXRJbmZvKilHZXRXaWRnZXRJbmZvKHBXaWRnZXQpOw0KKyAgaWYgKHBJbmZvKSB7DQorICAgIHBJbmZvLT5tX01hcmdpbltlTWFyZ2luXSA9IGZNYXJnaW47DQorICAgIHBJbmZvLT5tX2R3TWFyZ2luRmxhZyB8PSAoMSA8PCBlTWFyZ2luKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlJlbW92ZVdpZGdldE1hcmdpbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklETUFSR0lOIGVNYXJnaW4pIHsNCisgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0gKENGV0xfR3JpZFdpZGdldEluZm8qKUdldFdpZGdldEluZm8ocFdpZGdldCk7DQorICBpZiAocEluZm8pIHsNCisgICAgcEluZm8tPm1fZHdNYXJnaW5GbGFnICY9IH4oMSA8PCBlTWFyZ2luKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpHZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsIEZXTF9HUklEVU5JVCYgZVVuaXQpIHsNCisgIGVVbml0ID0gbV9TaXplW2VTaXplXS5lVW5pdDsNCisgIHJldHVybiBtX1NpemVbZVNpemVdLmZMZW5ndGg7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVpdCkgew0KKyAgbV9TaXplW2VTaXplXS5mTGVuZ3RoID0gZlNpemU7DQorICBtX1NpemVbZVNpemVdLmVVbml0ID0gZVVpdDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogQ0ZXTF9HcmlkSW1wOjpHZXRXaWRnZXRJbmZvKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gKENGV0xfR3JpZFdpZGdldEluZm8qKW1fbWFwV2lkZ2V0SW5mby5HZXRWYWx1ZUF0KHBXaWRnZXQpOw0KK30NCit2b2lkIENGV0xfR3JpZEltcDo6UHJvY0ZpeGVkQ29sUm93KENGV0xfR3JpZENvbFJvdyogcENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbFJvd1NpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb2x1bW4pIHsNCisgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgPSBmQ29sUm93U2l6ZTsNCisgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBXaWRnZXRJbmZvLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCA9IE5VTEw7DQorICAgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0gTlVMTDsNCisgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCisgICAgaWYgKGJDb2x1bW4pIHsNCisgICAgICBpZiAocEluZm8tPm1faUNvbHVtbiA9PSBuSW5kZXggJiYgcEluZm8tPm1faUNvbHVtblNwYW4gPT0gMSkgew0KKyAgICAgICAgQ2FsY1dpZGdldFdpZHRoKHBXaWRnZXQsIHBJbmZvLCBwQ29sUm93LT5tX2ZBY3R1YWxTaXplKTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKHBJbmZvLT5tX2lSb3cgPT0gbkluZGV4ICYmIHBJbmZvLT5tX2lSb3dTcGFuID09IDEpIHsNCisgICAgICAgIENhbGNXaWRnZXRIZWlndChwV2lkZ2V0LCBwSW5mbywgcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSk7DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkICYmDQotICAgICAgICAgICAgZldpZHRoID4gcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmZMZW5ndGgpIHsNCi0gICAgICAgIGZXaWR0aCA9IHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX01heFdpZHRoXS5mTGVuZ3RoOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfR3JpZEltcDo6UHJvY0F1dG9Db2xSb3coQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29sdW1uKSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBDb2xSb3cpOw0KKyAgRlhfRkxPQVQgZk1heFNpemUgPSAwLCBmV2lkZ2V0U2l6ZSA9IDA7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBOVUxMOw0KKyAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9IE5VTEw7DQorICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFdpZGdldCwgKHZvaWQqJilwSW5mbyk7DQorICAgIGlmICghcFdpZGdldCB8fCAhcEluZm8pIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBwSW5mby0+bV9mQWN0dWFsV2lkdGggPSBmV2lkdGg7DQorICAgIGlmIChiQ29sdW1uKSB7DQorICAgICAgaWYgKHBJbmZvLT5tX2lDb2x1bW4gIT0gbkluZGV4IHx8IHBJbmZvLT5tX2lDb2x1bW5TcGFuICE9IDEpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBmV2lkZ2V0U2l6ZSA9IENhbGNBdXRvQ29sdW1uV2lkZ2V0V2lkdGgocFdpZGdldCwgcEluZm8pOw0KKyAgICAgIGlmIChmTWF4U2l6ZSA8IGZXaWRnZXRTaXplKSB7DQorICAgICAgICBmTWF4U2l6ZSA9IGZXaWRnZXRTaXplOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAocEluZm8tPm1faVJvdyAhPSBuSW5kZXggfHwgcEluZm8tPm1faVJvd1NwYW4gIT0gMSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGZXaWRnZXRTaXplID0gQ2FsY0F1dG9Db2x1bW5XaWRnZXRIZWlnaHQocFdpZGdldCwgcEluZm8pOw0KKyAgICAgIGlmIChmTWF4U2l6ZSA8IGZXaWRnZXRTaXplKSB7DQorICAgICAgICBmTWF4U2l6ZSA9IGZXaWRnZXRTaXplOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBmTWF4U2l6ZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9HcmlkSW1wOjpQcm9jU2NhbGVkQ29sUm93KENGV0xfR3JpZENvbFJvdyogcENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29sUm93U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb2x1bW4pIHsNCisgIGlmIChmQ29sUm93U2l6ZSA+IDApIHsNCisgICAgUHJvY0ZpeGVkQ29sUm93KHBDb2xSb3csIG5JbmRleCwgZkNvbFJvd1NpemUsIGJDb2x1bW4pOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfR3JpZEltcDo6Q2FsY1dpZGdldFdpZHRoKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29sdW5tV2lkdGgpIHsNCisgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQorICAgIFNldFdpZGdldEFjdHVhbFdpZHRoKHBJbmZvLCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZkxlbmd0aCk7DQorICB9IGVsc2Ugew0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSAwOw0KKyAgICBGWF9GTE9BVCBmTGVmdE1hcmdpbiA9IDAsIGZSaWdodE1hcmdpbiA9IDA7DQorICAgIEZYX0JPT0wgYkxlZnRNYXJnaW4gPQ0KKyAgICAgICAgR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX0xlZnQsIGZMZWZ0TWFyZ2luKTsNCisgICAgRlhfQk9PTCBiUmlnaHRNYXJnaW4gPQ0KKyAgICAgICAgR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX1JpZ2h0LCBmUmlnaHRNYXJnaW4pOw0KKyAgICBpZiAoYkxlZnRNYXJnaW4gJiYgYlJpZ2h0TWFyZ2luKSB7DQorICAgICAgZldpZHRoID0gZkNvbHVubVdpZHRoIC0gZkxlZnRNYXJnaW4gLSBmUmlnaHRNYXJnaW47DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX1JlY3RGIHJ0QXV0bzsNCisgICAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0QXV0bywgVFJVRSk7DQorICAgICAgZldpZHRoID0gcnRBdXRvLldpZHRoKCk7DQorICAgIH0NCisgICAgU2V0V2lkZ2V0QWN0dWFsV2lkdGgocEluZm8sIGZXaWR0aCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9HcmlkSW1wOjpDYWxjV2lkZ2V0SGVpZ3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZSb3dIZWlndCkgew0KKyAgaWYgKHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQorICAgIFNldFdpZGdldEFjdHVhbEhlaWdodChwSW5mbywgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5mTGVuZ3RoKTsNCisgIH0gZWxzZSB7DQorICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSAwOw0KKyAgICBGWF9GTE9BVCBmVG9wTWFyZ2luID0gMCwgZkJvdHRvbU1hcmdpbiA9IDA7DQorICAgIEZYX0JPT0wgYlRvcE1hcmdpbiA9DQorICAgICAgICBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fVG9wLCBmVG9wTWFyZ2luKTsNCisgICAgRlhfQk9PTCBiQm90dG9tTWFyZ2luID0NCisgICAgICAgIEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9Cb3R0b20sIGZCb3R0b21NYXJnaW4pOw0KKyAgICBpZiAoYlRvcE1hcmdpbiAmJiBiQm90dG9tTWFyZ2luKSB7DQorICAgICAgZkhlaWdodCA9IGZSb3dIZWlndCAtIGZUb3BNYXJnaW4gLSBmQm90dG9tTWFyZ2luOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9SZWN0RiBydEF1dG87DQorICAgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEF1dG8sIFRSVUUpOw0KKyAgICAgIGZIZWlnaHQgPSBydEF1dG8uSGVpZ2h0KCk7DQorICAgIH0NCisgICAgU2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KHBJbmZvLCBmSGVpZ2h0KTsNCisgIH0NCit9DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpDYWxjQXV0b0NvbHVtbldpZGdldFdpZHRoKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbykgew0KKyAgRlhfRkxPQVQgZkxlZnRNYXJnaW4gPSAwLCBmUmlnaHRNYXJnaW4gPSAwOw0KKyAgRlhfQk9PTCBiTGVmdE1hcmdpbiA9DQorICAgICAgR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX0xlZnQsIGZMZWZ0TWFyZ2luKTsNCisgIEZYX0JPT0wgYlJpZ2h0TWFyZ2luID0NCisgICAgICBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fUmlnaHQsIGZSaWdodE1hcmdpbik7DQorICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCkgew0KKyAgICBTZXRXaWRnZXRBY3R1YWxXaWR0aChwSW5mbywgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmZMZW5ndGgpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1JlY3RGIHJ0QXV0bzsNCisgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEF1dG8sIFRSVUUpOw0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSBydEF1dG8ud2lkdGg7DQorICAgIFNldFdpZGdldEFjdHVhbFdpZHRoKHBJbmZvLCBmV2lkdGgpOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlRvdGFsID0gcEluZm8tPm1fZkFjdHVhbFdpZHRoOw0KKyAgaWYgKGJMZWZ0TWFyZ2luKSB7DQorICAgIGZUb3RhbCArPSBmTGVmdE1hcmdpbjsNCisgIH0NCisgIGlmIChiUmlnaHRNYXJnaW4pIHsNCisgICAgZlRvdGFsICs9IGZSaWdodE1hcmdpbjsNCisgIH0NCisgIHJldHVybiBmVG90YWw7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6Q2FsY0F1dG9Db2x1bW5XaWRnZXRIZWlnaHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbykgew0KKyAgRlhfRkxPQVQgZlRvcE1hcmdpbiA9IDAsIGZCb3R0b21NYXJnaW4gPSAwOw0KKyAgRlhfQk9PTCBiVG9wTWFyZ2luID0gR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX1RvcCwgZlRvcE1hcmdpbik7DQorICBGWF9CT09MIGJCb3R0b21NYXJnaW4gPQ0KKyAgICAgIEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9Cb3R0b20sIGZCb3R0b21NYXJnaW4pOw0KKyAgaWYgKHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQorICAgIFNldFdpZGdldEFjdHVhbEhlaWdodChwSW5mbywgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5mTGVuZ3RoKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9SZWN0RiBydEF1dG87DQorICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRBdXRvLCBUUlVFKTsNCisgICAgRlhfRkxPQVQgZkhlaWdodCA9IHJ0QXV0by5oZWlnaHQ7DQorICAgIFNldFdpZGdldEFjdHVhbEhlaWdodChwSW5mbywgZkhlaWdodCk7DQorICB9DQorICBGWF9GTE9BVCBmVG90YWwgPSBwSW5mby0+bV9mQWN0dWFsSGVpZ2h0Ow0KKyAgaWYgKGJUb3BNYXJnaW4pIHsNCisgICAgZlRvdGFsICs9IGZUb3BNYXJnaW47DQorICB9DQorICBpZiAoYkJvdHRvbU1hcmdpbikgew0KKyAgICBmVG90YWwgKz0gZkJvdHRvbU1hcmdpbjsNCisgIH0NCisgIHJldHVybiBmVG90YWw7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6UHJvY2Vzc0NvbHVtbnMoRlhfRkxPQVQgZldpZHRoKSB7DQorICBpZiAoZldpZHRoIDw9IDApIHsNCisgICAgcmV0dXJuIFByb2Nlc3NVbkNlcnRhaW5Db2x1bW5zKCk7DQorICB9DQorICBpbnQzMl90IGlDb2x1bW5zID0gbV9Db2x1bW5zLkdldFNpemUoKTsNCisgIGlmIChpQ29sdW1ucyA8IDEpIHsNCiAgICAgcmV0dXJuIGZXaWR0aDsNCi19DQotRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpTZXRXaWRnZXRBY3R1YWxIZWlnaHQoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8sIEZYX0ZMT0FUIGZIZWlnaHQpDQotew0KLSAgICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCi0gICAgICAgICAgICBmSGVpZ2h0IDwgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5mTGVuZ3RoKSB7DQotICAgICAgICBmSGVpZ2h0ID0gcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5mTGVuZ3RoOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkZpeGVkV2lkdGggPSAwOw0KKyAgRlhfRkxPQVQgZkF1dG9XaWR0aCA9IDA7DQorICBDRlhfUHRyQXJyYXkgYXV0b0NvbHVtbnM7DQorICBDRlhfUHRyQXJyYXkgc2NhbGVkQ29sdW1uczsNCisgIEZYX0ZMT0FUIGZTY2FsZWRDb2x1bW5OdW0gPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvbHVtbnM7IGkrKykgew0KKyAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiltX0NvbHVtbnNbaV07DQorICAgIGlmICghcENvbFJvdykgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCAmJg0KLSAgICAgICAgICAgIGZIZWlnaHQgPiBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmZMZW5ndGgpIHsNCi0gICAgICAgIGZIZWlnaHQgPSBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmZMZW5ndGg7DQorICAgIHN3aXRjaCAocENvbFJvdy0+bV9TaXplLmVVbml0KSB7DQorICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfRml4ZWQ6IHsNCisgICAgICAgIFNldENvbFJvd0FjdHVhbFNpemUocENvbFJvdywgcENvbFJvdy0+bV9TaXplLmZMZW5ndGgpOw0KKyAgICAgICAgZkZpeGVkV2lkdGggKz0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9HUklEVU5JVF9BdXRvOiB7DQorICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCBpLCBUUlVFKTsNCisgICAgICAgIGF1dG9Db2x1bW5zLkFkZChwQ29sUm93KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9HUklEVU5JVF9TY2FsZWQ6DQorICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgZlNjYWxlZENvbHVtbk51bSArPSBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgIHNjYWxlZENvbHVtbnMuQWRkKHBDb2xSb3cpOw0KKyAgICAgICAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCAwKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgcEluZm8tPm1fZkFjdHVhbEhlaWdodCA9IGZIZWlnaHQ7DQotICAgIHJldHVybiBmSGVpZ2h0Ow0KLX0NCi12b2lkIENGV0xfR3JpZEltcDo6U2V0QWxsV2lkZ2V0c1JlY3QoKQ0KLXsNCi0gICAgRlhfRkxPQVQgZlN0YXJ0TGVmdCA9IDA7DQotICAgIGludDMyX3QgaUNvbHVtbnMgPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ29sdW1uczsgaSsrKSB7DQotICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiltX0NvbHVtbnNbaV07DQotICAgICAgICBpZiAoIXBDb2xSb3cpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBDb2xSb3ctPm1fZkFjdHVhbFBvcyA9IGZTdGFydExlZnQ7DQotICAgICAgICBmU3RhcnRMZWZ0ICs9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICB9DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBOVUxMOw0KKyAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9IE5VTEw7DQorICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFdpZGdldCwgKHZvaWQqJilwSW5mbyk7DQorICAgIGlmICghcEluZm8gfHwgcEluZm8tPm1faUNvbHVtblNwYW4gPCAyKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgRlhfRkxPQVQgZlN0YXJ0VG9wID0gMDsNCi0gICAgaW50MzJfdCBpUm93cyA9IG1fUm93cy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlSb3dzOyBqKyspIHsNCi0gICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKW1fUm93c1tqXTsNCi0gICAgICAgIGlmICghcENvbFJvdykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcENvbFJvdy0+bV9mQWN0dWFsUG9zID0gZlN0YXJ0VG9wOw0KLSAgICAgICAgZlN0YXJ0VG9wICs9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgIENGWF9QdHJBcnJheSBzcGFuQXV0b0NvbHVtbnM7DQorICAgIEZYX0ZMT0FUIGZTcGFuU2l6ZSA9IDA7DQorICAgIGludDMyX3QgaUF1dG9Db2xSb3dzID0gMDsNCisgICAgaW50MzJfdCBpU2NhbGVkQ29sUm93cyA9IDA7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBJbmZvLT5tX2lDb2x1bW5TcGFuOyBpKyspIHsNCisgICAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2x1bW4gPQ0KKyAgICAgICAgICAoQ0ZXTF9HcmlkQ29sUm93KilHZXRDb2xSb3coVFJVRSwgcEluZm8tPm1faUNvbHVtbiArIGkpOw0KKyAgICAgIGlmICghcENvbHVtbikgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGZTcGFuU2l6ZSArPSBwQ29sdW1uLT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgIGlmIChwQ29sdW1uLT5tX1NpemUuZVVuaXQgPT0gRldMX0dSSURVTklUX0F1dG8pIHsNCisgICAgICAgIGlBdXRvQ29sUm93cysrOw0KKyAgICAgICAgc3BhbkF1dG9Db2x1bW5zLkFkZChwQ29sdW1uKTsNCisgICAgICB9IGVsc2UgaWYgKHBDb2x1bW4tPm1fU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfU2NhbGVkKSB7DQorICAgICAgICBpU2NhbGVkQ29sUm93cysrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIHdoaWxlIChwcykgew0KLSAgICAgICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBOVUxMOw0KLSAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8gPSBOVUxMOw0KLSAgICAgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCi0gICAgICAgIGlmICghcFdpZGdldCB8fCAhcEluZm8pIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZMT0FUIGZDb2x1bW5TdGFydCA9IDA7DQotICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2x1bW4gPSAoQ0ZXTF9HcmlkQ29sUm93KilHZXRDb2xSb3coVFJVRSwgcEluZm8tPm1faUNvbHVtbik7DQotICAgICAgICBpZiAocENvbHVtbikgew0KLSAgICAgICAgICAgIGZDb2x1bW5TdGFydCA9IHBDb2x1bW4tPm1fZkFjdHVhbFBvczsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZMT0FUIGZSb3dTdGFydCA9IDA7DQotICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KilHZXRDb2xSb3coRkFMU0UsIHBJbmZvLT5tX2lSb3cpOw0KLSAgICAgICAgaWYgKHBSb3cpIHsNCi0gICAgICAgICAgICBmUm93U3RhcnQgPSBwUm93LT5tX2ZBY3R1YWxQb3M7DQotICAgICAgICB9DQotICAgICAgICBGWF9GTE9BVCBmQ29sdW1uV2lkdGggPSAwOw0KLSAgICAgICAgaWYgKGlDb2x1bW5zID4gMCkgew0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHBJbmZvLT5tX2lDb2x1bW5TcGFuOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sID0gKENGV0xfR3JpZENvbFJvdyopR2V0Q29sUm93KFRSVUUsIHBJbmZvLT5tX2lDb2x1bW4gKyBqKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFwQ29sKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmQ29sdW1uV2lkdGggKz0gcENvbC0+bV9mQWN0dWFsU2l6ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZDb2x1bW5XaWR0aCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGg7DQotICAgICAgICB9DQotICAgICAgICBGWF9GTE9BVCBmUm93SGVpZ2h0ID0gMDsNCi0gICAgICAgIGlmIChpUm93cyA+IDApIHsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBwSW5mby0+bV9pUm93U3BhbjsgaysrKSB7DQotICAgICAgICAgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcFIgPSAoQ0ZXTF9HcmlkQ29sUm93KilHZXRDb2xSb3coRkFMU0UsIHBJbmZvLT5tX2lSb3cgKyBrKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFwUikgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZlJvd0hlaWdodCArPSBwUi0+bV9mQWN0dWFsU2l6ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZSb3dIZWlnaHQgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodDsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZMT0FUIGZMZWZ0TWFyZ2luID0gMCwgZlJpZ2h0TWFyZ2luID0gMDsNCi0gICAgICAgIEZYX0JPT0wgYkxlZnRNYXJnaW4gPSBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fTGVmdCwgZkxlZnRNYXJnaW4pOw0KLSAgICAgICAgRlhfQk9PTCBiUmlnaHRNYXJnaW4gPSBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fUmlnaHQsIGZSaWdodE1hcmdpbik7DQotICAgICAgICBGWF9GTE9BVCBmVG9wTWFyZ2luID0gMCwgZkJvdHRvbU1hcmdpbiA9IDA7DQotICAgICAgICBGWF9CT09MIGJUb3BNYXJnaW4gPSBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fVG9wLCBmVG9wTWFyZ2luKTsNCi0gICAgICAgIEZYX0JPT0wgYkJvdHRvbU1hcmdpbiA9IEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9Cb3R0b20sIGZCb3R0b21NYXJnaW4pOw0KLSAgICAgICAgRldMX0xBWU9VVERBVEEgbHRkOw0KLSAgICAgICAgbHRkLmZXaWR0aCA9IDA7DQotICAgICAgICBsdGQuZkhlaWdodCA9IDA7DQotICAgICAgICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCkgew0KLSAgICAgICAgICAgIFNldFdpZGdldEFjdHVhbFdpZHRoKHBJbmZvLCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZkxlbmd0aCk7DQotICAgICAgICAgICAgbHRkLmZXaWR0aCA9IHBJbmZvLT5tX2ZBY3R1YWxXaWR0aDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGJMZWZ0TWFyZ2luICYmIGJSaWdodE1hcmdpbikgew0KLSAgICAgICAgICAgICAgICBTZXRXaWRnZXRBY3R1YWxXaWR0aChwSW5mbywgZkNvbHVtbldpZHRoIC0gZkxlZnRNYXJnaW4gLSBmUmlnaHRNYXJnaW4pOw0KLSAgICAgICAgICAgICAgICBsdGQuZldpZHRoID0gcEluZm8tPm1fZkFjdHVhbFdpZHRoOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydEF1dG87DQotICAgICAgICAgICAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRBdXRvLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgU2V0V2lkZ2V0QWN0dWFsV2lkdGgocEluZm8sICBydEF1dG8ud2lkdGgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCkgew0KLSAgICAgICAgICAgIFNldFdpZGdldEFjdHVhbEhlaWdodChwSW5mbywgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5mTGVuZ3RoKTsNCi0gICAgICAgICAgICBsdGQuZkhlaWdodCA9IHBJbmZvLT5tX2ZBY3R1YWxIZWlnaHQ7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChiVG9wTWFyZ2luICYmIGJCb3R0b21NYXJnaW4pIHsNCi0gICAgICAgICAgICAgICAgU2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KHBJbmZvLCBmUm93SGVpZ2h0IC0gZlRvcE1hcmdpbiAtIGZCb3R0b21NYXJnaW4pOw0KLSAgICAgICAgICAgICAgICBsdGQuZkhlaWdodCA9IHBJbmZvLT5tX2ZBY3R1YWxIZWlnaHQ7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0QXV0bzsNCi0gICAgICAgICAgICAgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEF1dG8sIFRSVUUpOw0KLSAgICAgICAgICAgICAgICBTZXRXaWRnZXRBY3R1YWxIZWlnaHQocEluZm8sIHJ0QXV0by5oZWlnaHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiTGVmdE1hcmdpbiAmJiBiUmlnaHRNYXJnaW4gJiYgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCkgew0KLSAgICAgICAgICAgIGZMZWZ0TWFyZ2luID0gZkNvbHVtblN0YXJ0ICsgZkxlZnRNYXJnaW4gKyAoZkNvbHVtbldpZHRoIC0gZkxlZnRNYXJnaW4gLSBmUmlnaHRNYXJnaW4gLSBwSW5mby0+bV9mQWN0dWFsV2lkdGgpIC8gMjsNCi0gICAgICAgIH0gZWxzZSBpZiAoYkxlZnRNYXJnaW4pIHsNCi0gICAgICAgICAgICBmTGVmdE1hcmdpbiA9IGZDb2x1bW5TdGFydCArIGZMZWZ0TWFyZ2luOw0KLSAgICAgICAgfSBlbHNlIGlmIChiUmlnaHRNYXJnaW4pIHsNCi0gICAgICAgICAgICBmTGVmdE1hcmdpbiA9IGZDb2x1bW5TdGFydCArIGZDb2x1bW5XaWR0aCAgLSBmUmlnaHRNYXJnaW4gLSBwSW5mby0+bV9mQWN0dWFsV2lkdGg7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZMZWZ0TWFyZ2luID0gZkNvbHVtblN0YXJ0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJUb3BNYXJnaW4gJiYgYkJvdHRvbU1hcmdpbiAmJiBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCkgew0KLSAgICAgICAgICAgIGZUb3BNYXJnaW4gPSBmUm93U3RhcnQgKyBmVG9wTWFyZ2luICsgKGZSb3dIZWlnaHQgLSBmVG9wTWFyZ2luIC0gZkJvdHRvbU1hcmdpbiAtIHBJbmZvLT5tX2ZBY3R1YWxIZWlnaHQpIC8gMjsNCi0gICAgICAgIH0gZWxzZSBpZiAoYlRvcE1hcmdpbikgew0KLSAgICAgICAgICAgIGZUb3BNYXJnaW4gPSBmUm93U3RhcnQgKyBmVG9wTWFyZ2luOw0KLSAgICAgICAgfSBlbHNlIGlmIChiQm90dG9tTWFyZ2luKSB7DQotICAgICAgICAgICAgZlRvcE1hcmdpbiA9IGZSb3dTdGFydCArIGZSb3dIZWlnaHQgLSBmQm90dG9tTWFyZ2luIC0gcEluZm8tPm1fZkFjdHVhbEhlaWdodDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZlRvcE1hcmdpbiA9IGZSb3dTdGFydDsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9SZWN0RiBydFdpZGdldCwgcnRPbGQ7DQotICAgICAgICBydFdpZGdldC5TZXQoZkxlZnRNYXJnaW4sIGZUb3BNYXJnaW4sIHBJbmZvLT5tX2ZBY3R1YWxXaWR0aCwgcEluZm8tPm1fZkFjdHVhbEhlaWdodCk7DQotICAgICAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0T2xkKTsNCi0gICAgICAgIGlmIChydFdpZGdldCA9PSBydE9sZCkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFdpZGdldC0+U2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQotICAgICAgICBpZiAocnRXaWRnZXQud2lkdGggPT0gcnRPbGQud2lkdGggJiYgcnRXaWRnZXQuaGVpZ2h0ID09IHJ0T2xkLmhlaWdodCkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFdpZGdldC0+VXBkYXRlKCk7DQotICAgIH0NCi19DQotRlhfQk9PTCBDRldMX0dyaWRJbXA6OklzR3JpZChJRldMX1dpZGdldCogcFdpZGdldCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRkFMU0UpOw0KLSAgICByZXR1cm4gcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfR3JpZDsNCi19DQotdm9pZCBDRldMX0dyaWRJbXA6OlNldFNwYW5BdXRvQ29sUm93U2l6ZShjb25zdCBDRlhfUHRyQXJyYXkgJnNwYW5BdXRvcywgRlhfRkxPQVQgZlRvdGFsU2l6ZSkNCi17DQotICAgIGludDMyX3QgaUF1dG9Db2xSb3dzID0gc3BhbkF1dG9zLkdldFNpemUoKTsNCiAgICAgaWYgKGlBdXRvQ29sUm93cyA8IDEpIHsNCi0gICAgICAgIHJldHVybjsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBDRlhfUHRyQXJyYXkgYXV0b05vTWluTWF4czsNCi0gICAgRlhfRkxPQVQgZkF1dG9QZXIgPSBmVG90YWxTaXplIC8gaUF1dG9Db2xSb3dzOw0KLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpQXV0b0NvbFJvd3M7IGorKykgew0KLSAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sdW1uID0gKENGV0xfR3JpZENvbFJvdyopc3BhbkF1dG9zW2pdOw0KLSAgICAgICAgRlhfRkxPQVQgZk9yZ1NpemUgPSBwQ29sdW1uLT5tX2ZBY3R1YWxTaXplOw0KLSAgICAgICAgaWYgKFNldENvbFJvd0FjdHVhbFNpemUocENvbHVtbiwgcENvbHVtbi0+bV9mQWN0dWFsU2l6ZSArIGZBdXRvUGVyLCBUUlVFKSkgew0KLSAgICAgICAgICAgIGF1dG9Ob01pbk1heHMuQWRkKHBDb2x1bW4pOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmVG90YWxTaXplIC09IHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgLSBmT3JnU2l6ZTsNCi0gICAgICAgICAgICBpbnQzMl90IGlOb01pbk1heCA9IGlBdXRvQ29sUm93cyAtIChqICsgMSAtIGF1dG9Ob01pbk1heHMuR2V0U2l6ZSgpKTsNCi0gICAgICAgICAgICBpZiAoaU5vTWluTWF4ID4gMCAmJiBmVG90YWxTaXplID4gMCkgew0KLSAgICAgICAgICAgICAgICBmQXV0b1BlciA9IGZUb3RhbFNpemUgLyBpTm9NaW5NYXg7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgICBGWF9GTE9BVCBmV2lkZ2V0V2lkdGggPSBDYWxjQXV0b0NvbHVtbldpZGdldFdpZHRoKHBXaWRnZXQsIHBJbmZvKTsNCisgICAgaWYgKGZXaWRnZXRXaWR0aCA+IGZTcGFuU2l6ZSkgew0KKyAgICAgIGlmIChpU2NhbGVkQ29sUm93cyA+IDApIHsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgU2V0U3BhbkF1dG9Db2xSb3dTaXplKHNwYW5BdXRvQ29sdW1ucywgZldpZGdldFdpZHRoIC0gZlNwYW5TaXplKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaW50MzJfdCBpTm9ybWFscyA9IGF1dG9Ob01pbk1heHMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoZlRvdGFsU2l6ZSA+IDApIHsNCi0gICAgICAgIGlmIChpTm9ybWFscyA9PSBpQXV0b0NvbFJvd3MpIHsNCi0gICAgICAgICAgICBmQXV0b1BlciA9IGZUb3RhbFNpemUgLyBpTm9ybWFsczsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBpTm9ybWFsczsgaysrKSB7DQotICAgICAgICAgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbHVtbiA9IChDRldMX0dyaWRDb2xSb3cqKWF1dG9Ob01pbk1heHNba107DQotICAgICAgICAgICAgICAgIHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgKz0gZkF1dG9QZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBTZXRTcGFuQXV0b0NvbFJvd1NpemUoYXV0b05vTWluTWF4cywgZlRvdGFsU2l6ZSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgIH0NCisgIH0NCisgIGludDMyX3QgaUF1dG9Db2xzID0gYXV0b0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgaUF1dG9Db2xzOyBrKyspIHsNCisgICAgZkF1dG9XaWR0aCArPSAoKENGV0xfR3JpZENvbFJvdyopYXV0b0NvbHVtbnNba10pLT5tX2ZBY3R1YWxTaXplOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlNjYWxlZFdpZHRoID0gZldpZHRoIC0gZkZpeGVkV2lkdGggLSBmQXV0b1dpZHRoOw0KKyAgaWYgKGZTY2FsZWRXaWR0aCA+IDAgJiYgZlNjYWxlZENvbHVtbk51bSA+IDApIHsNCisgICAgU2V0U2NhbGVkQ29sUm93c1NpemUoc2NhbGVkQ29sdW1ucywgZlNjYWxlZFdpZHRoLCBmU2NhbGVkQ29sdW1uTnVtKTsNCisgIH0NCisgIHJldHVybiBmV2lkdGg7DQogfQ0KLXZvaWQgQ0ZXTF9HcmlkSW1wOjpTZXRTcGFuU2NhbGVkQ29sUm93U2l6ZShjb25zdCBDRlhfUHRyQXJyYXkgJnNwYW5TY2FsZWRzLCBGWF9GTE9BVCBmVG90YWxTaXplLCBGWF9GTE9BVCBmVG90YWxTY2FsZWROdW0pDQotew0KLSAgICBpbnQzMl90IGlTY2FsZWRDb2xSb3dzID0gc3BhblNjYWxlZHMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaVNjYWxlZENvbFJvd3MgPCAxKSB7DQotICAgICAgICByZXR1cm47DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpQcm9jZXNzUm93cyhGWF9GTE9BVCBmSGVpZ2h0KSB7DQorICBpZiAoZkhlaWdodCA8PSAwKSB7DQorICAgIHJldHVybiBQcm9jZXNzVW5DZXJ0YWluUm93cygpOw0KKyAgfQ0KKyAgaW50MzJfdCBpUm93cyA9IG1fUm93cy5HZXRTaXplKCk7DQorICBpZiAoaVJvd3MgPCAxKSB7DQorICAgIHJldHVybiBmSGVpZ2h0Ow0KKyAgfQ0KKyAgRlhfRkxPQVQgZkZpeGVkSGVpZ2h0ID0gMDsNCisgIEZYX0ZMT0FUIGZBdXRvSGVpZ3QgPSAwOw0KKyAgQ0ZYX1B0ckFycmF5IGF1dG9Sb3dzOw0KKyAgQ0ZYX1B0ckFycmF5IHNjYWxlZFJvd3M7DQorICBGWF9GTE9BVCBmU2NhbGVkUm93TnVtID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlSb3dzOyBpKyspIHsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopbV9Sb3dzW2ldOw0KKyAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBDRlhfUHRyQXJyYXkgYXV0b05vTWluTWF4czsNCi0gICAgRlhfRkxPQVQgZlBlclNpemUgPSBmVG90YWxTaXplIC8gZlRvdGFsU2NhbGVkTnVtOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2NhbGVkQ29sUm93czsgaSsrKSB7DQotICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KilzcGFuU2NhbGVkc1tpXTsNCi0gICAgICAgIGlmIChTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgKyBmUGVyU2l6ZSAqIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoLCBUUlVFKSkgew0KLSAgICAgICAgICAgIGF1dG9Ob01pbk1heHMuQWRkKHBDb2xSb3cpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmVG90YWxTaXplIC09IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQotICAgICAgICAgICAgZlRvdGFsU2NhbGVkTnVtIC09IHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KLSAgICAgICAgICAgIGludDMyX3QgaU5vTWluTWF4ID0gaVNjYWxlZENvbFJvd3MgLSAoaSArIDEgLSBhdXRvTm9NaW5NYXhzLkdldFNpemUoKSk7DQotICAgICAgICAgICAgaWYgKGlOb01pbk1heCA+IDAgJiYgZlRvdGFsU2l6ZSA+IDApIHsNCi0gICAgICAgICAgICAgICAgZlBlclNpemUgPSBmVG90YWxTaXplIC8gZlRvdGFsU2NhbGVkTnVtOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgICAgc3dpdGNoIChwQ29sUm93LT5tX1NpemUuZVVuaXQpIHsNCisgICAgICBjYXNlIEZXTF9HUklEVU5JVF9GaXhlZDogew0KKyAgICAgICAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBwQ29sUm93LT5tX1NpemUuZkxlbmd0aCk7DQorICAgICAgICBmRml4ZWRIZWlnaHQgKz0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9HUklEVU5JVF9BdXRvOiB7DQorICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCBpLCBGQUxTRSk7DQorICAgICAgICBhdXRvUm93cy5BZGQocENvbFJvdyk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfU2NhbGVkOg0KKyAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgIGZTY2FsZWRSb3dOdW0gKz0gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQorICAgICAgICBzY2FsZWRSb3dzLkFkZChwQ29sUm93KTsNCisgICAgICAgIFNldENvbFJvd0FjdHVhbFNpemUocENvbFJvdywgMCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQogICAgIH0NCi0gICAgaW50MzJfdCBpTm9ybWFscyA9IGF1dG9Ob01pbk1heHMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoZlRvdGFsU2l6ZSA+IDApIHsNCi0gICAgICAgIGlmIChpTm9ybWFscyA9PSBpU2NhbGVkQ29sUm93cykgew0KLSAgICAgICAgICAgIGZQZXJTaXplID0gZlRvdGFsU2l6ZSAvIGZUb3RhbFNjYWxlZE51bTsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpTm9ybWFsczsgaisrKSB7DQotICAgICAgICAgICAgICAgIENGV0xfR3JpZENvbFJvdyAqcENvbHVtbiA9IChDRldMX0dyaWRDb2xSb3cqKWF1dG9Ob01pbk1heHNbal07DQotICAgICAgICAgICAgICAgIHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgKz0gZlBlclNpemUgKiBwQ29sdW1uLT5tX1NpemUuZkxlbmd0aDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFNldFNwYW5TY2FsZWRDb2xSb3dTaXplKGF1dG9Ob01pbk1heHMsIGZUb3RhbFNpemUsIGZUb3RhbFNjYWxlZE51bSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQorICB9DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBOVUxMOw0KKyAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9IE5VTEw7DQorICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFdpZGdldCwgKHZvaWQqJilwSW5mbyk7DQorICAgIGlmICghcEluZm8gfHwgcEluZm8tPm1faVJvd1NwYW4gPCAyKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCisgICAgQ0ZYX1B0ckFycmF5IHNwYW5BdXRvUm93czsNCisgICAgRlhfRkxPQVQgZlNwYW5TaXplID0gMDsNCisgICAgaW50MzJfdCBpQXV0b0NvbFJvd3MgPSAwOw0KKyAgICBpbnQzMl90IGlTY2FsZWRDb2xSb3dzID0gMDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcEluZm8tPm1faVJvd1NwYW47IGkrKykgew0KKyAgICAgIENGV0xfR3JpZENvbFJvdyogcFJvdyA9DQorICAgICAgICAgIChDRldMX0dyaWRDb2xSb3cqKUdldENvbFJvdyhGQUxTRSwgcEluZm8tPm1faVJvdyArIGkpOw0KKyAgICAgIGlmICghcFJvdykgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGZTcGFuU2l6ZSArPSBwUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgIGlmIChwUm93LT5tX1NpemUuZVVuaXQgPT0gRldMX0dSSURVTklUX0F1dG8pIHsNCisgICAgICAgIGlBdXRvQ29sUm93cysrOw0KKyAgICAgICAgc3BhbkF1dG9Sb3dzLkFkZChwUm93KTsNCisgICAgICB9IGVsc2UgaWYgKHBSb3ctPm1fU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfU2NhbGVkKSB7DQorICAgICAgICBpU2NhbGVkQ29sUm93cysrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaUF1dG9Db2xSb3dzIDwgMSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZXaWRnZXRIZWlnaHQgPSBDYWxjQXV0b0NvbHVtbldpZGdldEhlaWdodChwV2lkZ2V0LCBwSW5mbyk7DQorICAgIGlmIChmV2lkZ2V0SGVpZ2h0ID4gZlNwYW5TaXplKSB7DQorICAgICAgaWYgKGlTY2FsZWRDb2xSb3dzID4gMCkgew0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBTZXRTcGFuQXV0b0NvbFJvd1NpemUoc3BhbkF1dG9Sb3dzLCBmV2lkZ2V0SGVpZ2h0IC0gZlNwYW5TaXplKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaUF1dG9Sb3dzID0gYXV0b1Jvd3MuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgaUF1dG9Sb3dzOyBrKyspIHsNCisgICAgZkF1dG9IZWlndCArPSAoKENGV0xfR3JpZENvbFJvdyopYXV0b1Jvd3Nba10pLT5tX2ZBY3R1YWxTaXplOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlNjYWxlZEhlaWdodCA9IGZIZWlnaHQgLSBmRml4ZWRIZWlnaHQgLSBmQXV0b0hlaWd0Ow0KKyAgaWYgKGZTY2FsZWRIZWlnaHQgPiAwICYmIGZTY2FsZWRSb3dOdW0gPiAwKSB7DQorICAgIFNldFNjYWxlZENvbFJvd3NTaXplKHNjYWxlZFJvd3MsIGZTY2FsZWRIZWlnaHQsIGZTY2FsZWRSb3dOdW0pOw0KKyAgfQ0KKyAgcmV0dXJuIGZIZWlnaHQ7DQogfQ0KLXZvaWQgQ0ZXTF9HcmlkSW1wOjpTZXRTY2FsZWRDb2xSb3dzU2l6ZShjb25zdCBDRlhfUHRyQXJyYXkgJnNwYW5TY2FsZWRzLCBGWF9GTE9BVCBmVG90YWxTaXplLCBGWF9GTE9BVCBmVG90YWxTY2FsZWROdW0pDQotew0KLSAgICBpbnQzMl90IGlTY2FsZWRDb2xSb3dzID0gc3BhblNjYWxlZHMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaVNjYWxlZENvbFJvd3MgPCAxKSB7DQotICAgICAgICByZXR1cm47DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpQcm9jZXNzVW5DZXJ0YWluQ29sdW1ucygpIHsNCisgIGludDMyX3QgaUNvbHVtbnMgPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlDb2x1bW5zIDwgMSkgew0KKyAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSBuZXcgQ0ZXTF9HcmlkQ29sUm93Ow0KKyAgICBwQ29sUm93LT5tX1NpemUuZVVuaXQgPSBGV0xfR1JJRFVOSVRfQXV0bzsNCisgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgMCwgVFJVRSk7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgIGRlbGV0ZSBwQ29sUm93Ow0KKyAgICByZXR1cm4gZldpZHRoOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkZpeGVkV2lkdGggPSAwOw0KKyAgQ0ZYX1B0ckFycmF5IGF1dG9Db2x1bW5zOw0KKyAgQ0ZYX1B0ckFycmF5IHNjYWxlZENvbHVtbnM7DQorICBGWF9GTE9BVCBmU2NhbGVkQ29sdW1uTnVtID0gMDsNCisgIEZYX0ZMT0FUIGZTY2FsZWRNYXhQZXJXaWR0aCA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ29sdW1uczsgaSsrKSB7DQorICAgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKW1fQ29sdW1uc1tpXTsNCisgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgQ0ZYX1B0ckFycmF5IGF1dG9Ob01pbk1heHM7DQotICAgIEZYX0ZMT0FUIGZQZXJTaXplID0gZlRvdGFsU2l6ZSAvIGZUb3RhbFNjYWxlZE51bTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNjYWxlZENvbFJvd3M7IGkrKykgew0KLSAgICAgICAgQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopc3BhblNjYWxlZHNbaV07DQorICAgIHN3aXRjaCAocENvbFJvdy0+bV9TaXplLmVVbml0KSB7DQorICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfRml4ZWQ6IHsNCisgICAgICAgIFNldENvbFJvd0FjdHVhbFNpemUocENvbFJvdywgcENvbFJvdy0+bV9TaXplLmZMZW5ndGgpOw0KKyAgICAgICAgZkZpeGVkV2lkdGggKz0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9HUklEVU5JVF9BdXRvOiB7DQorICAgICAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCBpLCBUUlVFKTsNCisgICAgICAgIGF1dG9Db2x1bW5zLkFkZChwQ29sUm93KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9HUklEVU5JVF9TY2FsZWQ6DQorICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgaSwgVFJVRSk7DQorICAgICAgICBmU2NhbGVkQ29sdW1uTnVtICs9IHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICAgICAgc2NhbGVkQ29sdW1ucy5BZGQocENvbFJvdyk7DQorICAgICAgICBpZiAocENvbFJvdy0+bV9TaXplLmZMZW5ndGggPD0gMCkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZQZXJXaWR0aCA9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgLyBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgIGlmIChmUGVyV2lkdGggPiBmU2NhbGVkTWF4UGVyV2lkdGgpIHsNCisgICAgICAgICAgZlNjYWxlZE1heFBlcldpZHRoID0gZlBlcldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaUNvbHVtbnMgPSBzY2FsZWRDb2x1bW5zLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlDb2x1bW5zOyBqKyspIHsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopc2NhbGVkQ29sdW1uc1tqXTsNCisgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBmU2NhbGVkTWF4UGVyV2lkdGggKiBwQ29sUm93LT5tX1NpemUuZkxlbmd0aCk7DQorICB9DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBOVUxMOw0KKyAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9IE5VTEw7DQorICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFdpZGdldCwgKHZvaWQqJilwSW5mbyk7DQorICAgIGlmICghcEluZm8gfHwgcEluZm8tPm1faUNvbHVtblNwYW4gPCAyKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1B0ckFycmF5IHNwYW5BdXRvQ29sdW1uczsNCisgICAgQ0ZYX1B0ckFycmF5IHNwYW5TY2FsZWRDb2x1bW5zOw0KKyAgICBGWF9GTE9BVCBmU3BhblNpemUgPSAwOw0KKyAgICBGWF9GTE9BVCBmU2NhbGVkU3VtID0gMDsNCisgICAgaW50MzJfdCBpQXV0b0NvbFJvd3MgPSAwOw0KKyAgICBpbnQzMl90IGlTY2FsZWRDb2xSb3dzID0gMDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcEluZm8tPm1faUNvbHVtblNwYW47IGkrKykgew0KKyAgICAgIENGV0xfR3JpZENvbFJvdyogcENvbHVtbiA9DQorICAgICAgICAgIChDRldMX0dyaWRDb2xSb3cqKUdldENvbFJvdyhUUlVFLCBwSW5mby0+bV9pQ29sdW1uICsgaSk7DQorICAgICAgaWYgKCFwQ29sdW1uKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZlNwYW5TaXplICs9IHBDb2x1bW4tPm1fZkFjdHVhbFNpemU7DQorICAgICAgaWYgKHBDb2x1bW4tPm1fU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfQXV0bykgew0KKyAgICAgICAgaUF1dG9Db2xSb3dzKys7DQorICAgICAgICBzcGFuQXV0b0NvbHVtbnMuQWRkKHBDb2x1bW4pOw0KKyAgICAgIH0gZWxzZSBpZiAocENvbHVtbi0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9TY2FsZWQpIHsNCisgICAgICAgIGlTY2FsZWRDb2xSb3dzKys7DQorICAgICAgICBmU2NhbGVkU3VtICs9IHBDb2x1bW4tPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICAgICAgc3BhblNjYWxlZENvbHVtbnMuQWRkKHBDb2x1bW4pOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaUF1dG9Db2xSb3dzIDwgMSAmJiBpU2NhbGVkQ29sUm93cyA8IDEpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmV2lkZ2V0V2lkdGggPSBDYWxjQXV0b0NvbHVtbldpZGdldFdpZHRoKHBXaWRnZXQsIHBJbmZvKTsNCisgICAgaWYgKGZXaWRnZXRXaWR0aCA+IGZTcGFuU2l6ZSkgew0KKyAgICAgIGlmIChpU2NhbGVkQ29sUm93cyA+IDApIHsNCisgICAgICAgIGlmIChmU2NhbGVkU3VtIDw9IDApIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBTZXRTcGFuU2NhbGVkQ29sUm93U2l6ZShzcGFuU2NhbGVkQ29sdW1ucywgZldpZGdldFdpZHRoIC0gZlNwYW5TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlNjYWxlZFN1bSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIFNldFNwYW5BdXRvQ29sUm93U2l6ZShzcGFuQXV0b0NvbHVtbnMsIGZXaWRnZXRXaWR0aCAtIGZTcGFuU2l6ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBGWF9GTE9BVCBmQXV0b1dpZHRoID0gMDsNCisgIGludDMyX3QgaUF1dG9Db2xzID0gYXV0b0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IG0gPSAwOyBtIDwgaUF1dG9Db2xzOyBtKyspIHsNCisgICAgZkF1dG9XaWR0aCArPSAoKENGV0xfR3JpZENvbFJvdyopYXV0b0NvbHVtbnNbbV0pLT5tX2ZBY3R1YWxTaXplOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlNjYWxlZFdpZHRoID0gMDsNCisgIGlDb2x1bW5zID0gc2NhbGVkQ29sdW1ucy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgbiA9IDA7IG4gPCBpQ29sdW1uczsgbisrKSB7DQorICAgIGZTY2FsZWRXaWR0aCArPSAoKENGV0xfR3JpZENvbFJvdyopc2NhbGVkQ29sdW1uc1tuXSktPm1fZkFjdHVhbFNpemU7DQorICB9DQorICByZXR1cm4gZkZpeGVkV2lkdGggKyBmQXV0b1dpZHRoICsgZlNjYWxlZFdpZHRoOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OlByb2Nlc3NVbkNlcnRhaW5Sb3dzKCkgew0KKyAgaW50MzJfdCBpUm93cyA9IG1fUm93cy5HZXRTaXplKCk7DQorICBpZiAoaVJvd3MgPCAxKSB7DQorICAgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IG5ldyBDRldMX0dyaWRDb2xSb3c7DQorICAgIHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KKyAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCAwLCBGQUxTRSk7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgIGRlbGV0ZSBwQ29sUm93Ow0KKyAgICByZXR1cm4gZldpZHRoOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkZpeGVkSGVpZ2h0ID0gMDsNCisgIENGWF9QdHJBcnJheSBhdXRvUm93czsNCisgIENGWF9QdHJBcnJheSBzY2FsZWRSb3dzOw0KKyAgRlhfRkxPQVQgZlNjYWxlZFJvd051bSA9IDA7DQorICBGWF9GTE9BVCBmU2NhbGVkTWF4UGVySGVpZ2h0ID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlSb3dzOyBpKyspIHsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopbV9Sb3dzW2ldOw0KKyAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCkgew0KKyAgICAgIGNhc2UgRldMX0dSSURVTklUX0ZpeGVkOiB7DQorICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCisgICAgICAgIGZGaXhlZEhlaWdodCArPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX0dSSURVTklUX0F1dG86IHsNCisgICAgICAgIFByb2NBdXRvQ29sUm93KHBDb2xSb3csIGksIEZBTFNFKTsNCisgICAgICAgIGF1dG9Sb3dzLkFkZChwQ29sUm93KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9HUklEVU5JVF9TY2FsZWQ6DQorICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgaSwgRkFMU0UpOw0KKyAgICAgICAgZlNjYWxlZFJvd051bSArPSBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgIHNjYWxlZFJvd3MuQWRkKHBDb2xSb3cpOw0KKyAgICAgICAgaWYgKHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoID4gMCkgew0KKyAgICAgICAgICBGWF9GTE9BVCBmUGVySGVpZ2h0ID0NCisgICAgICAgICAgICAgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgLyBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgICAgaWYgKGZQZXJIZWlnaHQgPiBmU2NhbGVkTWF4UGVySGVpZ2h0KSB7DQorICAgICAgICAgICAgZlNjYWxlZE1heFBlckhlaWdodCA9IGZQZXJIZWlnaHQ7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaVJvd3MgPSBzY2FsZWRSb3dzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlSb3dzOyBqKyspIHsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopc2NhbGVkUm93c1tqXTsNCisgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBmU2NhbGVkTWF4UGVySGVpZ2h0ICogcENvbFJvdy0+bV9TaXplLmZMZW5ndGgpOw0KKyAgfQ0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFdpZGdldEluZm8uR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8gPSBOVUxMOw0KKyAgICBtX21hcFdpZGdldEluZm8uR2V0TmV4dEFzc29jKHBzLCAodm9pZComKXBXaWRnZXQsICh2b2lkKiYpcEluZm8pOw0KKyAgICBpZiAocEluZm8tPm1faVJvd1NwYW4gPCAyKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1B0ckFycmF5IHNwYW5BdXRvUm93czsNCisgICAgQ0ZYX1B0ckFycmF5IHNwYW5TY2FsZWRSb3dzOw0KKyAgICBGWF9GTE9BVCBmU3BhblNpemUgPSAwOw0KKyAgICBGWF9GTE9BVCBmU2NhbGVkU3VtID0gMDsNCisgICAgaW50MzJfdCBpQXV0b0NvbFJvd3MgPSAwOw0KKyAgICBpbnQzMl90IGlTY2FsZWRDb2xSb3dzID0gMDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcEluZm8tPm1faVJvd1NwYW47IGkrKykgew0KKyAgICAgIENGV0xfR3JpZENvbFJvdyogcFJvdyA9DQorICAgICAgICAgIChDRldMX0dyaWRDb2xSb3cqKUdldENvbFJvdyhGQUxTRSwgcEluZm8tPm1faVJvdyArIGkpOw0KKyAgICAgIGlmICghcFJvdykgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGZTcGFuU2l6ZSArPSBwUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgIGlmIChwUm93LT5tX1NpemUuZVVuaXQgPT0gRldMX0dSSURVTklUX0F1dG8pIHsNCisgICAgICAgIGlBdXRvQ29sUm93cysrOw0KKyAgICAgICAgc3BhbkF1dG9Sb3dzLkFkZChwUm93KTsNCisgICAgICB9IGVsc2UgaWYgKHBSb3ctPm1fU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfU2NhbGVkKSB7DQorICAgICAgICBpU2NhbGVkQ29sUm93cysrOw0KKyAgICAgICAgZlNjYWxlZFN1bSArPSBwUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgIHNwYW5TY2FsZWRSb3dzLkFkZChwUm93KTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlBdXRvQ29sUm93cyA8IDEgJiYgaVNjYWxlZENvbFJvd3MgPCAxKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZldpZGdldEhlaWdodCA9IENhbGNBdXRvQ29sdW1uV2lkZ2V0SGVpZ2h0KHBXaWRnZXQsIHBJbmZvKTsNCisgICAgaWYgKGZXaWRnZXRIZWlnaHQgPiBmU3BhblNpemUpIHsNCisgICAgICBpZiAoaVNjYWxlZENvbFJvd3MgPiAwKSB7DQorICAgICAgICBpZiAoZlNjYWxlZFN1bSA8PSAwKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgU2V0U3BhblNjYWxlZENvbFJvd1NpemUoc3BhblNjYWxlZFJvd3MsIGZXaWRnZXRIZWlnaHQgLSBmU3BhblNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmU2NhbGVkU3VtKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgU2V0U3BhbkF1dG9Db2xSb3dTaXplKHNwYW5BdXRvUm93cywgZldpZGdldEhlaWdodCAtIGZTcGFuU2l6ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBGWF9GTE9BVCBmQXV0b0hlaWd0ID0gMDsNCisgIGludDMyX3QgaUF1dG9Sb3dzID0gYXV0b1Jvd3MuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IG0gPSAwOyBtIDwgaUF1dG9Sb3dzOyBtKyspIHsNCisgICAgZkF1dG9IZWlndCArPSAoKENGV0xfR3JpZENvbFJvdyopYXV0b1Jvd3NbbV0pLT5tX2ZBY3R1YWxTaXplOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlNjYWxlZEhlaWdodCA9IDA7DQorICBpUm93cyA9IHNjYWxlZFJvd3MuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IG4gPSAwOyBuIDwgaVJvd3M7IG4rKykgew0KKyAgICBmU2NhbGVkSGVpZ2h0ICs9ICgoQ0ZXTF9HcmlkQ29sUm93KilzY2FsZWRSb3dzW25dKS0+bV9mQWN0dWFsU2l6ZTsNCisgIH0NCisgIHJldHVybiBmRml4ZWRIZWlnaHQgKyBmQXV0b0hlaWd0ICsgZlNjYWxlZEhlaWdodDsNCit9DQorRlhfQk9PTCBDRldMX0dyaWRJbXA6OlNldENvbFJvd0FjdHVhbFNpemUoQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldEJleW9uZCkgew0KKyAgaWYgKHBDb2xSb3ctPm1fTWluU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCisgICAgICBmU2l6ZSA8IHBDb2xSb3ctPm1fTWluU2l6ZS5mTGVuZ3RoKSB7DQorICAgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgPSBwQ29sUm93LT5tX01pblNpemUuZkxlbmd0aDsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBDb2xSb3ctPm1fTWF4U2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCisgICAgICBmU2l6ZSA+IHBDb2xSb3ctPm1fTWF4U2l6ZS5mTGVuZ3RoKSB7DQorICAgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgPSBwQ29sUm93LT5tX01heFNpemUuZkxlbmd0aDsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJTZXRCZXlvbmQpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBwQ29sUm93LT5tX2ZBY3R1YWxTaXplID0gZlNpemU7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpTZXRXaWRnZXRBY3R1YWxXaWR0aChDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCkgew0KKyAgaWYgKHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX01pbldpZHRoXS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCisgICAgICBmV2lkdGggPCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZkxlbmd0aCkgew0KKyAgICBmV2lkdGggPSBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZkxlbmd0aDsNCisgIH0NCisgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkICYmDQorICAgICAgZldpZHRoID4gcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmZMZW5ndGgpIHsNCisgICAgZldpZHRoID0gcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmZMZW5ndGg7DQorICB9DQorICBwSW5mby0+bV9mQWN0dWFsV2lkdGggPSBmV2lkdGg7DQorICByZXR1cm4gZldpZHRoOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OlNldFdpZGdldEFjdHVhbEhlaWdodChDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmSGVpZ2h0KSB7DQorICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCisgICAgICBmSGVpZ2h0IDwgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5mTGVuZ3RoKSB7DQorICAgIGZIZWlnaHQgPSBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NaW5IZWlnaHRdLmZMZW5ndGg7DQorICB9DQorICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCisgICAgICBmSGVpZ2h0ID4gcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5mTGVuZ3RoKSB7DQorICAgIGZIZWlnaHQgPSBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmZMZW5ndGg7DQorICB9DQorICBwSW5mby0+bV9mQWN0dWFsSGVpZ2h0ID0gZkhlaWdodDsNCisgIHJldHVybiBmSGVpZ2h0Ow0KK30NCit2b2lkIENGV0xfR3JpZEltcDo6U2V0QWxsV2lkZ2V0c1JlY3QoKSB7DQorICBGWF9GTE9BVCBmU3RhcnRMZWZ0ID0gMDsNCisgIGludDMyX3QgaUNvbHVtbnMgPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvbHVtbnM7IGkrKykgew0KKyAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KiltX0NvbHVtbnNbaV07DQorICAgIGlmICghcENvbFJvdykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHBDb2xSb3ctPm1fZkFjdHVhbFBvcyA9IGZTdGFydExlZnQ7DQorICAgIGZTdGFydExlZnQgKz0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCisgIH0NCisgIEZYX0ZMT0FUIGZTdGFydFRvcCA9IDA7DQorICBpbnQzMl90IGlSb3dzID0gbV9Sb3dzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlSb3dzOyBqKyspIHsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopbV9Sb3dzW2pdOw0KKyAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwQ29sUm93LT5tX2ZBY3R1YWxQb3MgPSBmU3RhcnRUb3A7DQorICAgIGZTdGFydFRvcCArPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgfQ0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFdpZGdldEluZm8uR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8gPSBOVUxMOw0KKyAgICBtX21hcFdpZGdldEluZm8uR2V0TmV4dEFzc29jKHBzLCAodm9pZComKXBXaWRnZXQsICh2b2lkKiYpcEluZm8pOw0KKyAgICBpZiAoIXBXaWRnZXQgfHwgIXBJbmZvKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkNvbHVtblN0YXJ0ID0gMDsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sdW1uID0NCisgICAgICAgIChDRldMX0dyaWRDb2xSb3cqKUdldENvbFJvdyhUUlVFLCBwSW5mby0+bV9pQ29sdW1uKTsNCisgICAgaWYgKHBDb2x1bW4pIHsNCisgICAgICBmQ29sdW1uU3RhcnQgPSBwQ29sdW1uLT5tX2ZBY3R1YWxQb3M7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlJvd1N0YXJ0ID0gMDsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwUm93ID0gKENGV0xfR3JpZENvbFJvdyopR2V0Q29sUm93KEZBTFNFLCBwSW5mby0+bV9pUm93KTsNCisgICAgaWYgKHBSb3cpIHsNCisgICAgICBmUm93U3RhcnQgPSBwUm93LT5tX2ZBY3R1YWxQb3M7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkNvbHVtbldpZHRoID0gMDsNCisgICAgaWYgKGlDb2x1bW5zID4gMCkgew0KKyAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHBJbmZvLT5tX2lDb2x1bW5TcGFuOyBqKyspIHsNCisgICAgICAgIENGV0xfR3JpZENvbFJvdyogcENvbCA9DQorICAgICAgICAgICAgKENGV0xfR3JpZENvbFJvdyopR2V0Q29sUm93KFRSVUUsIHBJbmZvLT5tX2lDb2x1bW4gKyBqKTsNCisgICAgICAgIGlmICghcENvbCkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGZDb2x1bW5XaWR0aCArPSBwQ29sLT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBmQ29sdW1uV2lkdGggPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZSb3dIZWlnaHQgPSAwOw0KKyAgICBpZiAoaVJvd3MgPiAwKSB7DQorICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgcEluZm8tPm1faVJvd1NwYW47IGsrKykgew0KKyAgICAgICAgQ0ZXTF9HcmlkQ29sUm93KiBwUiA9DQorICAgICAgICAgICAgKENGV0xfR3JpZENvbFJvdyopR2V0Q29sUm93KEZBTFNFLCBwSW5mby0+bV9pUm93ICsgayk7DQorICAgICAgICBpZiAoIXBSKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZlJvd0hlaWdodCArPSBwUi0+bV9mQWN0dWFsU2l6ZTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgZlJvd0hlaWdodCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0Ow0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZMZWZ0TWFyZ2luID0gMCwgZlJpZ2h0TWFyZ2luID0gMDsNCisgICAgRlhfQk9PTCBiTGVmdE1hcmdpbiA9DQorICAgICAgICBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fTGVmdCwgZkxlZnRNYXJnaW4pOw0KKyAgICBGWF9CT09MIGJSaWdodE1hcmdpbiA9DQorICAgICAgICBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fUmlnaHQsIGZSaWdodE1hcmdpbik7DQorICAgIEZYX0ZMT0FUIGZUb3BNYXJnaW4gPSAwLCBmQm90dG9tTWFyZ2luID0gMDsNCisgICAgRlhfQk9PTCBiVG9wTWFyZ2luID0NCisgICAgICAgIEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9Ub3AsIGZUb3BNYXJnaW4pOw0KKyAgICBGWF9CT09MIGJCb3R0b21NYXJnaW4gPQ0KKyAgICAgICAgR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX0JvdHRvbSwgZkJvdHRvbU1hcmdpbik7DQorICAgIEZXTF9MQVlPVVREQVRBIGx0ZDsNCisgICAgbHRkLmZXaWR0aCA9IDA7DQorICAgIGx0ZC5mSGVpZ2h0ID0gMDsNCisgICAgaWYgKHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQpIHsNCisgICAgICBTZXRXaWRnZXRBY3R1YWxXaWR0aChwSW5mbywgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmZMZW5ndGgpOw0KKyAgICAgIGx0ZC5mV2lkdGggPSBwSW5mby0+bV9mQWN0dWFsV2lkdGg7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGJMZWZ0TWFyZ2luICYmIGJSaWdodE1hcmdpbikgew0KKyAgICAgICAgU2V0V2lkZ2V0QWN0dWFsV2lkdGgocEluZm8sIGZDb2x1bW5XaWR0aCAtIGZMZWZ0TWFyZ2luIC0gZlJpZ2h0TWFyZ2luKTsNCisgICAgICAgIGx0ZC5mV2lkdGggPSBwSW5mby0+bV9mQWN0dWFsV2lkdGg7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9SZWN0RiBydEF1dG87DQorICAgICAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0QXV0bywgVFJVRSk7DQorICAgICAgICBTZXRXaWRnZXRBY3R1YWxXaWR0aChwSW5mbywgcnRBdXRvLndpZHRoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQorICAgICAgU2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KHBJbmZvLCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmZMZW5ndGgpOw0KKyAgICAgIGx0ZC5mSGVpZ2h0ID0gcEluZm8tPm1fZkFjdHVhbEhlaWdodDsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoYlRvcE1hcmdpbiAmJiBiQm90dG9tTWFyZ2luKSB7DQorICAgICAgICBTZXRXaWRnZXRBY3R1YWxIZWlnaHQocEluZm8sIGZSb3dIZWlnaHQgLSBmVG9wTWFyZ2luIC0gZkJvdHRvbU1hcmdpbik7DQorICAgICAgICBsdGQuZkhlaWdodCA9IHBJbmZvLT5tX2ZBY3R1YWxIZWlnaHQ7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9SZWN0RiBydEF1dG87DQorICAgICAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0QXV0bywgVFJVRSk7DQorICAgICAgICBTZXRXaWRnZXRBY3R1YWxIZWlnaHQocEluZm8sIHJ0QXV0by5oZWlnaHQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYkxlZnRNYXJnaW4gJiYgYlJpZ2h0TWFyZ2luICYmDQorICAgICAgICBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQorICAgICAgZkxlZnRNYXJnaW4gPQ0KKyAgICAgICAgICBmQ29sdW1uU3RhcnQgKyBmTGVmdE1hcmdpbiArDQorICAgICAgICAgIChmQ29sdW1uV2lkdGggLSBmTGVmdE1hcmdpbiAtIGZSaWdodE1hcmdpbiAtIHBJbmZvLT5tX2ZBY3R1YWxXaWR0aCkgLw0KKyAgICAgICAgICAgICAgMjsNCisgICAgfSBlbHNlIGlmIChiTGVmdE1hcmdpbikgew0KKyAgICAgIGZMZWZ0TWFyZ2luID0gZkNvbHVtblN0YXJ0ICsgZkxlZnRNYXJnaW47DQorICAgIH0gZWxzZSBpZiAoYlJpZ2h0TWFyZ2luKSB7DQorICAgICAgZkxlZnRNYXJnaW4gPQ0KKyAgICAgICAgICBmQ29sdW1uU3RhcnQgKyBmQ29sdW1uV2lkdGggLSBmUmlnaHRNYXJnaW4gLSBwSW5mby0+bV9mQWN0dWFsV2lkdGg7DQorICAgIH0gZWxzZSB7DQorICAgICAgZkxlZnRNYXJnaW4gPSBmQ29sdW1uU3RhcnQ7DQorICAgIH0NCisgICAgaWYgKGJUb3BNYXJnaW4gJiYgYkJvdHRvbU1hcmdpbiAmJg0KKyAgICAgICAgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQpIHsNCisgICAgICBmVG9wTWFyZ2luID0NCisgICAgICAgICAgZlJvd1N0YXJ0ICsgZlRvcE1hcmdpbiArDQorICAgICAgICAgIChmUm93SGVpZ2h0IC0gZlRvcE1hcmdpbiAtIGZCb3R0b21NYXJnaW4gLSBwSW5mby0+bV9mQWN0dWFsSGVpZ2h0KSAvDQorICAgICAgICAgICAgICAyOw0KKyAgICB9IGVsc2UgaWYgKGJUb3BNYXJnaW4pIHsNCisgICAgICBmVG9wTWFyZ2luID0gZlJvd1N0YXJ0ICsgZlRvcE1hcmdpbjsNCisgICAgfSBlbHNlIGlmIChiQm90dG9tTWFyZ2luKSB7DQorICAgICAgZlRvcE1hcmdpbiA9DQorICAgICAgICAgIGZSb3dTdGFydCArIGZSb3dIZWlnaHQgLSBmQm90dG9tTWFyZ2luIC0gcEluZm8tPm1fZkFjdHVhbEhlaWdodDsNCisgICAgfSBlbHNlIHsNCisgICAgICBmVG9wTWFyZ2luID0gZlJvd1N0YXJ0Ow0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydFdpZGdldCwgcnRPbGQ7DQorICAgIHJ0V2lkZ2V0LlNldChmTGVmdE1hcmdpbiwgZlRvcE1hcmdpbiwgcEluZm8tPm1fZkFjdHVhbFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgcEluZm8tPm1fZkFjdHVhbEhlaWdodCk7DQorICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRPbGQpOw0KKyAgICBpZiAocnRXaWRnZXQgPT0gcnRPbGQpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwV2lkZ2V0LT5TZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgICAgaWYgKHJ0V2lkZ2V0LndpZHRoID09IHJ0T2xkLndpZHRoICYmIHJ0V2lkZ2V0LmhlaWdodCA9PSBydE9sZC5oZWlnaHQpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwV2lkZ2V0LT5VcGRhdGUoKTsNCisgIH0NCit9DQorRlhfQk9PTCBDRldMX0dyaWRJbXA6OklzR3JpZChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGQUxTRSk7DQorICByZXR1cm4gcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfR3JpZDsNCit9DQordm9pZCBDRldMX0dyaWRJbXA6OlNldFNwYW5BdXRvQ29sUm93U2l6ZShjb25zdCBDRlhfUHRyQXJyYXkmIHNwYW5BdXRvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUb3RhbFNpemUpIHsNCisgIGludDMyX3QgaUF1dG9Db2xSb3dzID0gc3BhbkF1dG9zLkdldFNpemUoKTsNCisgIGlmIChpQXV0b0NvbFJvd3MgPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9QdHJBcnJheSBhdXRvTm9NaW5NYXhzOw0KKyAgRlhfRkxPQVQgZkF1dG9QZXIgPSBmVG90YWxTaXplIC8gaUF1dG9Db2xSb3dzOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaUF1dG9Db2xSb3dzOyBqKyspIHsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sdW1uID0gKENGV0xfR3JpZENvbFJvdyopc3BhbkF1dG9zW2pdOw0KKyAgICBGWF9GTE9BVCBmT3JnU2l6ZSA9IHBDb2x1bW4tPm1fZkFjdHVhbFNpemU7DQorICAgIGlmIChTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2x1bW4sIHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgKyBmQXV0b1BlciwgVFJVRSkpIHsNCisgICAgICBhdXRvTm9NaW5NYXhzLkFkZChwQ29sdW1uKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBmVG90YWxTaXplIC09IHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgLSBmT3JnU2l6ZTsNCisgICAgICBpbnQzMl90IGlOb01pbk1heCA9IGlBdXRvQ29sUm93cyAtIChqICsgMSAtIGF1dG9Ob01pbk1heHMuR2V0U2l6ZSgpKTsNCisgICAgICBpZiAoaU5vTWluTWF4ID4gMCAmJiBmVG90YWxTaXplID4gMCkgew0KKyAgICAgICAgZkF1dG9QZXIgPSBmVG90YWxTaXplIC8gaU5vTWluTWF4Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaU5vcm1hbHMgPSBhdXRvTm9NaW5NYXhzLkdldFNpemUoKTsNCisgIGlmIChmVG90YWxTaXplID4gMCkgew0KKyAgICBpZiAoaU5vcm1hbHMgPT0gaUF1dG9Db2xSb3dzKSB7DQorICAgICAgZkF1dG9QZXIgPSBmVG90YWxTaXplIC8gaU5vcm1hbHM7DQorICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgaU5vcm1hbHM7IGsrKykgew0KKyAgICAgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sdW1uID0gKENGV0xfR3JpZENvbFJvdyopYXV0b05vTWluTWF4c1trXTsNCisgICAgICAgIHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgKz0gZkF1dG9QZXI7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIFNldFNwYW5BdXRvQ29sUm93U2l6ZShhdXRvTm9NaW5NYXhzLCBmVG90YWxTaXplKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgIH0NCit9DQordm9pZCBDRldMX0dyaWRJbXA6OlNldFNwYW5TY2FsZWRDb2xSb3dTaXplKGNvbnN0IENGWF9QdHJBcnJheSYgc3BhblNjYWxlZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUb3RhbFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUb3RhbFNjYWxlZE51bSkgew0KKyAgaW50MzJfdCBpU2NhbGVkQ29sUm93cyA9IHNwYW5TY2FsZWRzLkdldFNpemUoKTsNCisgIGlmIChpU2NhbGVkQ29sUm93cyA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5IGF1dG9Ob01pbk1heHM7DQorICBGWF9GTE9BVCBmUGVyU2l6ZSA9IGZUb3RhbFNpemUgLyBmVG90YWxTY2FsZWROdW07DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2NhbGVkQ29sUm93czsgaSsrKSB7DQorICAgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IChDRldMX0dyaWRDb2xSb3cqKXNwYW5TY2FsZWRzW2ldOw0KKyAgICBpZiAoU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBwQ29sUm93LT5tX2ZBY3R1YWxTaXplICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQZXJTaXplICogcENvbFJvdy0+bV9TaXplLmZMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpKSB7DQorICAgICAgYXV0b05vTWluTWF4cy5BZGQocENvbFJvdyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZlRvdGFsU2l6ZSAtPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgIGZUb3RhbFNjYWxlZE51bSAtPSBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICBpbnQzMl90IGlOb01pbk1heCA9IGlTY2FsZWRDb2xSb3dzIC0gKGkgKyAxIC0gYXV0b05vTWluTWF4cy5HZXRTaXplKCkpOw0KKyAgICAgIGlmIChpTm9NaW5NYXggPiAwICYmIGZUb3RhbFNpemUgPiAwKSB7DQorICAgICAgICBmUGVyU2l6ZSA9IGZUb3RhbFNpemUgLyBmVG90YWxTY2FsZWROdW07DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpTm9ybWFscyA9IGF1dG9Ob01pbk1heHMuR2V0U2l6ZSgpOw0KKyAgaWYgKGZUb3RhbFNpemUgPiAwKSB7DQorICAgIGlmIChpTm9ybWFscyA9PSBpU2NhbGVkQ29sUm93cykgew0KKyAgICAgIGZQZXJTaXplID0gZlRvdGFsU2l6ZSAvIGZUb3RhbFNjYWxlZE51bTsNCisgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpTm9ybWFsczsgaisrKSB7DQorICAgICAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2x1bW4gPSAoQ0ZXTF9HcmlkQ29sUm93KilhdXRvTm9NaW5NYXhzW2pdOw0KKyAgICAgICAgcENvbHVtbi0+bV9mQWN0dWFsU2l6ZSArPSBmUGVyU2l6ZSAqIHBDb2x1bW4tPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBTZXRTcGFuU2NhbGVkQ29sUm93U2l6ZShhdXRvTm9NaW5NYXhzLCBmVG90YWxTaXplLCBmVG90YWxTY2FsZWROdW0pOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgfQ0KK30NCit2b2lkIENGV0xfR3JpZEltcDo6U2V0U2NhbGVkQ29sUm93c1NpemUoY29uc3QgQ0ZYX1B0ckFycmF5JiBzcGFuU2NhbGVkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvdGFsU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvdGFsU2NhbGVkTnVtKSB7DQorICBpbnQzMl90IGlTY2FsZWRDb2xSb3dzID0gc3BhblNjYWxlZHMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlTY2FsZWRDb2xSb3dzIDwgMSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfUHRyQXJyYXkgYXV0b05vTWluTWF4czsNCisgIEZYX0ZMT0FUIGZQZXJTaXplID0gZlRvdGFsU2l6ZSAvIGZUb3RhbFNjYWxlZE51bTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTY2FsZWRDb2xSb3dzOyBpKyspIHsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopc3BhblNjYWxlZHNbaV07DQorICAgIGlmICghcENvbFJvdykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZTaXplID0gZlBlclNpemUgKiBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgRlhfRkxPQVQgZk9yZ1NpemUgPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgICBpZiAoU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCBmU2l6ZSwgVFJVRSkpIHsNCisgICAgICBhdXRvTm9NaW5NYXhzLkFkZChwQ29sUm93KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBmVG90YWxTaXplIC09IHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgLSBmT3JnU2l6ZTsNCisgICAgICBmVG90YWxTY2FsZWROdW0gLT0gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQorICAgICAgaW50MzJfdCBpTm9NaW5NYXggPSBpU2NhbGVkQ29sUm93cyAtIChpICsgMSAtIGF1dG9Ob01pbk1heHMuR2V0U2l6ZSgpKTsNCisgICAgICBpZiAoaU5vTWluTWF4ID4gMCAmJiBmVG90YWxTaXplID4gMCkgew0KKyAgICAgICAgZlBlclNpemUgPSBmVG90YWxTaXplIC8gZlRvdGFsU2NhbGVkTnVtOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaU5vcm1hbHMgPSBhdXRvTm9NaW5NYXhzLkdldFNpemUoKTsNCisgIGlmIChmVG90YWxTaXplID4gMCkgew0KKyAgICBpZiAoaU5vcm1hbHMgPT0gaVNjYWxlZENvbFJvd3MpIHsNCisgICAgICBmUGVyU2l6ZSA9IGZUb3RhbFNpemUgLyBmVG90YWxTY2FsZWROdW07DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaU5vcm1hbHM7IGkrKykgew0KKyAgICAgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gKENGV0xfR3JpZENvbFJvdyopYXV0b05vTWluTWF4c1tpXTsNCiAgICAgICAgIGlmICghcENvbFJvdykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCiAgICAgICAgIEZYX0ZMT0FUIGZTaXplID0gZlBlclNpemUgKiBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCi0gICAgICAgIEZYX0ZMT0FUIGZPcmdTaXplID0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCi0gICAgICAgIGlmIChTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIGZTaXplLCBUUlVFKSkgew0KLSAgICAgICAgICAgIGF1dG9Ob01pbk1heHMuQWRkKHBDb2xSb3cpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmVG90YWxTaXplIC09IHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgLSBmT3JnU2l6ZTsNCi0gICAgICAgICAgICBmVG90YWxTY2FsZWROdW0gLT0gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQotICAgICAgICAgICAgaW50MzJfdCBpTm9NaW5NYXggPSBpU2NhbGVkQ29sUm93cyAtIChpICsgMSAtIGF1dG9Ob01pbk1heHMuR2V0U2l6ZSgpKTsNCi0gICAgICAgICAgICBpZiAoaU5vTWluTWF4ID4gMCAmJiBmVG90YWxTaXplID4gMCkgew0KLSAgICAgICAgICAgICAgICBmUGVyU2l6ZSA9IGZUb3RhbFNpemUgLyBmVG90YWxTY2FsZWROdW07DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGludDMyX3QgaU5vcm1hbHMgPSBhdXRvTm9NaW5NYXhzLkdldFNpemUoKTsNCi0gICAgaWYgKGZUb3RhbFNpemUgPiAwKSB7DQotICAgICAgICBpZiAoaU5vcm1hbHMgPT0gaVNjYWxlZENvbFJvd3MpIHsNCi0gICAgICAgICAgICBmUGVyU2l6ZSA9IGZUb3RhbFNpemUgLyBmVG90YWxTY2FsZWROdW07DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaU5vcm1hbHM7IGkrKykgew0KLSAgICAgICAgICAgICAgICBDRldMX0dyaWRDb2xSb3cgKnBDb2xSb3cgPSAoQ0ZXTF9HcmlkQ29sUm93KilhdXRvTm9NaW5NYXhzW2ldOw0KLSAgICAgICAgICAgICAgICBpZiAoIXBDb2xSb3cpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplID0gZlBlclNpemUgKiBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCi0gICAgICAgICAgICAgICAgcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSA9IGZTaXplOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgU2V0U2NhbGVkQ29sUm93c1NpemUoYXV0b05vTWluTWF4cywgZlRvdGFsU2l6ZSwgZlRvdGFsU2NhbGVkTnVtKTsNCi0gICAgICAgIH0NCisgICAgICAgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgPSBmU2l6ZTsNCisgICAgICB9DQogICAgIH0gZWxzZSB7DQorICAgICAgU2V0U2NhbGVkQ29sUm93c1NpemUoYXV0b05vTWluTWF4cywgZlRvdGFsU2l6ZSwgZlRvdGFsU2NhbGVkTnVtKTsNCiAgICAgfQ0KKyAgfSBlbHNlIHsNCisgIH0NCiB9DQotQ0ZXTF9HcmlkRGVsZWdhdGU6OkNGV0xfR3JpZERlbGVnYXRlKENGV0xfR3JpZEltcCAqcE93bmVyKQ0KLSAgICA6IG1fcE93bmVyKHBPd25lcikNCi17DQorQ0ZXTF9HcmlkRGVsZWdhdGU6OkNGV0xfR3JpZERlbGVnYXRlKENGV0xfR3JpZEltcCogcE93bmVyKSA6IG1fcE93bmVyKHBPd25lcikge30NCitpbnQzMl90IENGV0xfR3JpZERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIGlmIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpICE9IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCisgIGlmIChwTXNnLT5tX2R3Q21kICE9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bikgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiAxOw0KIH0NCi1pbnQzMl90IENGV0xfR3JpZERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICBpZiAocE1lc3NhZ2UtPkdldENsYXNzSUQoKSAhPSBGV0xfTVNHSEFTSF9Nb3VzZSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgQ0ZXTF9Nc2dNb3VzZSAqcE1zZyA9IChDRldMX01zZ01vdXNlKilwTWVzc2FnZTsNCi0gICAgaWYgKHBNc2ctPm1fZHdDbWQgIT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICByZXR1cm4gMTsNCi19DQotRldMX0VSUglDRldMX0dyaWREZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK0ZXTF9FUlIgQ0ZXTF9HcmlkRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9ub3RlaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9ub3RlaW1wLmNwcAppbmRleCAwZWE4OTc1Li45MGFiYzFlIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfbm90ZWltcC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX25vdGVpbXAuY3BwCkBAIC0xNCwxMTE0ICsxNCwxMDY5IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX2FwcGltcC5oIg0KICNpbmNsdWRlICIuLi8uLi9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF90b29sdGlwY3RybGltcC5oIg0KLUNGV0xfTm90ZUxvb3A6OkNGV0xfTm90ZUxvb3AoQ0ZXTF9XaWRnZXRJbXAgKnBGb3JtICkNCi0gICAgOiBtX3BGb3JtKHBGb3JtKQ0KLSAgICAsIG1fYkNvbnRpbnVlTW9kYWwoVFJVRSkNCi17DQotfQ0KLUZYX0JPT0wgQ0ZXTF9Ob3RlTG9vcDo6UHJlUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotICAgIGlmICghbV9wRm9ybSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUcmFuc2xhdGVBY2NlbGVyYXRvcihwTWVzc2FnZSk7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9Ob3RlTG9vcDo6SWRsZShpbnQzMl90IGNvdW50KQ0KLXsNCi0jaWYgKF9GWF9PU189PV9GWF9XSU4zMl9ERVNLVE9QXykNCi0gICAgaWYgKGNvdW50IDw9IDApDQotI2VuZGlmDQotICAgIHsNCi0gICAgICAgIENGV0xfRXZ0SWRsZSBldjsNCi0gICAgICAgIElGV0xfQXBwICpwQXBwID0gRldMX0dldEFwcCgpOw0KLSAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQXBwLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICAgICAgSUZXTF9Ob3RlRHJpdmVyICpwRHJpdmVyID0gcEFwcC0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRHJpdmVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICAgICAgcERyaXZlci0+U2VuZE5vdGUoJmV2KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLX0NCi1DRldMX1dpZGdldEltcCogQ0ZXTF9Ob3RlTG9vcDo6R2V0Rm9ybSgpDQotew0KLSAgICByZXR1cm4gbV9wRm9ybTsNCi19DQotRlhfQk9PTCBDRldMX05vdGVMb29wOjpDb250aW51ZU1vZGFsKCkNCi17DQotICAgIHJldHVybiBtX2JDb250aW51ZU1vZGFsOw0KLX0NCi1GV0xfRVJSCUNGV0xfTm90ZUxvb3A6OkVuZE1vZGFsTG9vcCgpDQotew0KLSAgICBtX2JDb250aW51ZU1vZGFsID0gRkFMU0U7DQotI2lmIChfRlhfT1NfPT1fRlhfTUFDT1NYXykNCi0gICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCi0gICAgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyICogYWRhcHRlcldpZGdldE1nciA9IHBXaWRnZXRNZ3ItPkdldEFkYXB0ZXJXaWRnZXRNZ3IoKTsNCi0gICAgYWRhcHRlcldpZGdldE1nci0+RW5kTG9vcCgpOw0KLSNlbmRpZg0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9Ob3RlTG9vcDo6VHJhbnNsYXRlQWNjZWxlcmF0b3IoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotICAgIGlmIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpICE9IEZXTF9NU0dIQVNIX0tleSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmICgoKENGV0xfTXNnS2V5KilwTWVzc2FnZSktPm1fZHdDbWQgIT0gRldMX01TR0tFWUNNRF9LZXlEb3duKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZXTF9Nc2dLZXkgKnBNc2dLZXkgPSAoQ0ZXTF9Nc2dLZXkqKXBNZXNzYWdlOw0KLSAgICBDRlhfTWFwQWNjZWxlcmF0b3JzICZhY2NlbCA9ICgoQ0ZXTF9Gb3JtSW1wKiltX3BGb3JtKS0+R2V0QWNjZWxlcmF0b3IoKTsNCi0gICAgRlhfUE9TSVRJT04gcG9zID0gYWNjZWwuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICBpZiAoIXBvcykgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIHZyS2V5LCByVmFsdWU7DQotICAgIHdoaWxlIChwb3MpIHsNCi0gICAgICAgIGFjY2VsLkdldE5leHRBc3NvYyhwb3MsIHZyS2V5LCByVmFsdWUpOw0KLSAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9ICh2cktleSAmIDB4RkYwMCkgPj4gODsNCi0gICAgICAgIEZYX0RXT1JEIG1fZHdLZXlDb2RlID0gdnJLZXkgJiAweDAwRkY7DQotICAgICAgICBpZiAocE1zZ0tleS0+bV9kd0ZsYWdzID09IGR3RmxhZ3MgJiYgcE1zZ0tleS0+bV9kd0tleUNvZGUgPT0gbV9kd0tleUNvZGUpIHsNCi0gICAgICAgICAgICBHZW5lcmF0ZUNvbW1vbmRFdmVudChyVmFsdWUpOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQorQ0ZXTF9Ob3RlTG9vcDo6Q0ZXTF9Ob3RlTG9vcChDRldMX1dpZGdldEltcCogcEZvcm0pDQorICAgIDogbV9wRm9ybShwRm9ybSksIG1fYkNvbnRpbnVlTW9kYWwoVFJVRSkge30NCitGWF9CT09MIENGV0xfTm90ZUxvb3A6OlByZVByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIGlmICghbV9wRm9ybSkgew0KICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVHJhbnNsYXRlQWNjZWxlcmF0b3IocE1lc3NhZ2UpOw0KIH0NCi1GV0xfRVJSCUNGV0xfTm90ZUxvb3A6OlNldE1haW5Gb3JtKENGV0xfV2lkZ2V0SW1wICpwRm9ybSkNCi17DQotICAgIG1fcEZvcm0gPSBwRm9ybTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi12b2lkIENGV0xfTm90ZUxvb3A6OkdlbmVyYXRlQ29tbW9uZEV2ZW50KEZYX0RXT1JEIGR3Q29tbWFuZCkNCi17DQotICAgIENGV0xfRXZ0TWVudUNvbW1hbmQgZXY7DQotICAgIGV2Lm1faUNvbW1hbmQgPSBkd0NvbW1hbmQ7DQotICAgIElGV0xfTm90ZVRocmVhZCAqcFRocmVhZCA9IG1fcEZvcm0tPkdldE93bmVyVGhyZWFkKCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQotICAgIElGV0xfTm90ZURyaXZlciAqcERyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRHJpdmVyKTsNCitGV0xfRVJSIENGV0xfTm90ZUxvb3A6OklkbGUoaW50MzJfdCBjb3VudCkgew0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8pDQorICBpZiAoY291bnQgPD0gMCkNCisjZW5kaWYNCisgIHsNCisgICAgQ0ZXTF9FdnRJZGxlIGV2Ow0KKyAgICBJRldMX0FwcCogcEFwcCA9IEZXTF9HZXRBcHAoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQXBwLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPSBwQXBwLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocERyaXZlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCiAgICAgcERyaXZlci0+U2VuZE5vdGUoJmV2KTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorfQ0KK0NGV0xfV2lkZ2V0SW1wKiBDRldMX05vdGVMb29wOjpHZXRGb3JtKCkgew0KKyAgcmV0dXJuIG1fcEZvcm07DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlTG9vcDo6Q29udGludWVNb2RhbCgpIHsNCisgIHJldHVybiBtX2JDb250aW51ZU1vZGFsOw0KK30NCitGV0xfRVJSIENGV0xfTm90ZUxvb3A6OkVuZE1vZGFsTG9vcCgpIHsNCisgIG1fYkNvbnRpbnVlTW9kYWwgPSBGQUxTRTsNCisjaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pDQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyKiBhZGFwdGVyV2lkZ2V0TWdyID0gcFdpZGdldE1nci0+R2V0QWRhcHRlcldpZGdldE1ncigpOw0KKyAgYWRhcHRlcldpZGdldE1nci0+RW5kTG9vcCgpOw0KKyNlbmRpZg0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfTm90ZUxvb3A6OlRyYW5zbGF0ZUFjY2VsZXJhdG9yKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIGlmIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpICE9IEZXTF9NU0dIQVNIX0tleSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoKChDRldMX01zZ0tleSopcE1lc3NhZ2UpLT5tX2R3Q21kICE9IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX01zZ0tleSogcE1zZ0tleSA9IChDRldMX01zZ0tleSopcE1lc3NhZ2U7DQorICBDRlhfTWFwQWNjZWxlcmF0b3JzJiBhY2NlbCA9ICgoQ0ZXTF9Gb3JtSW1wKiltX3BGb3JtKS0+R2V0QWNjZWxlcmF0b3IoKTsNCisgIEZYX1BPU0lUSU9OIHBvcyA9IGFjY2VsLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIGlmICghcG9zKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0RXT1JEIHZyS2V5LCByVmFsdWU7DQorICB3aGlsZSAocG9zKSB7DQorICAgIGFjY2VsLkdldE5leHRBc3NvYyhwb3MsIHZyS2V5LCByVmFsdWUpOw0KKyAgICBGWF9EV09SRCBkd0ZsYWdzID0gKHZyS2V5ICYgMHhGRjAwKSA+PiA4Ow0KKyAgICBGWF9EV09SRCBtX2R3S2V5Q29kZSA9IHZyS2V5ICYgMHgwMEZGOw0KKyAgICBpZiAocE1zZ0tleS0+bV9kd0ZsYWdzID09IGR3RmxhZ3MgJiYgcE1zZ0tleS0+bV9kd0tleUNvZGUgPT0gbV9kd0tleUNvZGUpIHsNCisgICAgICBHZW5lcmF0ZUNvbW1vbmRFdmVudChyVmFsdWUpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlTG9vcDo6U2V0TWFpbkZvcm0oQ0ZXTF9XaWRnZXRJbXAqIHBGb3JtKSB7DQorICBtX3BGb3JtID0gcEZvcm07DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Ob3RlTG9vcDo6R2VuZXJhdGVDb21tb25kRXZlbnQoRlhfRFdPUkQgZHdDb21tYW5kKSB7DQorICBDRldMX0V2dE1lbnVDb21tYW5kIGV2Ow0KKyAgZXYubV9pQ29tbWFuZCA9IGR3Q29tbWFuZDsNCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IG1fcEZvcm0tPkdldE93bmVyVGhyZWFkKCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwRHJpdmVyID0gcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRHJpdmVyKTsNCisgIHBEcml2ZXItPlNlbmROb3RlKCZldik7DQogfQ0KIENGV0xfTm90ZURyaXZlcjo6Q0ZXTF9Ob3RlRHJpdmVyKCkNCi0gICAgOiBtX3NlbmRFdmVudENhbGxlZCgwKQ0KLSAgICAsIG1fbWF4U2l6ZSg1MDApDQotICAgICwgbV9iRnVsbFNjcmVlbihGQUxTRSkNCi0gICAgLCBtX3BGb2N1cyhOVUxMKQ0KLSAgICAsIG1fcEhvdmVyKE5VTEwpDQotICAgICwgbV9wR3JhYihOVUxMKQ0KLSAgICAsIG1faG9vayhOVUxMKQ0KLXsNCi0gICAgbV9wTm90ZUxvb3AgPSBGWF9ORVcgQ0ZXTF9Ob3RlTG9vcDsNCi0gICAgUHVzaE5vdGVMb29wKChJRldMX05vdGVMb29wKiltX3BOb3RlTG9vcCk7DQorICAgIDogbV9zZW5kRXZlbnRDYWxsZWQoMCksDQorICAgICAgbV9tYXhTaXplKDUwMCksDQorICAgICAgbV9iRnVsbFNjcmVlbihGQUxTRSksDQorICAgICAgbV9wRm9jdXMoTlVMTCksDQorICAgICAgbV9wSG92ZXIoTlVMTCksDQorICAgICAgbV9wR3JhYihOVUxMKSwNCisgICAgICBtX2hvb2soTlVMTCkgew0KKyAgbV9wTm90ZUxvb3AgPSBGWF9ORVcgQ0ZXTF9Ob3RlTG9vcDsNCisgIFB1c2hOb3RlTG9vcCgoSUZXTF9Ob3RlTG9vcCopbV9wTm90ZUxvb3ApOw0KIH0NCi1DRldMX05vdGVEcml2ZXI6On5DRldMX05vdGVEcml2ZXIoKQ0KLXsNCi0gICAgaWYgKG1fcE5vdGVMb29wKSB7DQotICAgICAgICBkZWxldGUgbV9wTm90ZUxvb3A7DQotICAgICAgICBtX3BOb3RlTG9vcCA9IE5VTEw7DQorQ0ZXTF9Ob3RlRHJpdmVyOjp+Q0ZXTF9Ob3RlRHJpdmVyKCkgew0KKyAgaWYgKG1fcE5vdGVMb29wKSB7DQorICAgIGRlbGV0ZSBtX3BOb3RlTG9vcDsNCisgICAgbV9wTm90ZUxvb3AgPSBOVUxMOw0KKyAgfQ0KKyAgQ2xlYXJJbnZhbGlkRXZlbnRUYXJnZXRzKFRSVUUpOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6U2VuZE5vdGUoQ0ZXTF9Ob3RlKiBwTm90ZSkgew0KKyAgaWYgKHBOb3RlLT5Jc0V2ZW50KCkpIHsNCisgICAgaW50MzJfdCBpQ291bnQgPSBtX2V2ZW50VGFyZ2V0cy5HZXRDb3VudCgpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KICAgICB9DQotICAgIENsZWFySW52YWxpZEV2ZW50VGFyZ2V0cyhUUlVFKTsNCi19DQotRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OlNlbmROb3RlKENGV0xfTm90ZSAqcE5vdGUpDQotew0KLSAgICBpZiAocE5vdGUtPklzRXZlbnQoKSkgew0KLSAgICAgICAgaW50MzJfdCBpQ291bnQgPSBtX2V2ZW50VGFyZ2V0cy5HZXRDb3VudCgpOw0KLSAgICAgICAgaWYgKGlDb3VudCA8IDEpIHsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgaWYgKEZXTF9FVlRIQVNIX01vdXNlID09ICgoQ0ZXTF9FdmVudCopcE5vdGUpLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICBDRldMX0V2dE1vdXNlKiBwTW91c2UgPSAoQ0ZXTF9FdnRNb3VzZSopcE5vdGU7DQorICAgICAgaWYgKEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUhvdmVyID09IHBNb3VzZS0+bV9kd0NtZCkgew0KKyAgICAgICAgaWYgKG1fcE5vdGVMb29wLT5HZXRGb3JtKCkgJiYNCisgICAgICAgICAgICBDRldMX1Rvb2xUaXBDb250YWluZXI6OmdldEluc3RhbmNlKCktPlByb2Nlc3NFbnRlcigNCisgICAgICAgICAgICAgICAgcE1vdXNlLCBtX3BOb3RlTG9vcC0+R2V0Rm9ybSgpLT5HZXRJbnRlcmZhY2UoKSkpIHsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmIChGV0xfRVZUSEFTSF9Nb3VzZSA9PSAoKENGV0xfRXZlbnQqKXBOb3RlKS0+R2V0Q2xhc3NJRCgpKSB7DQotICAgICAgICAgICAgQ0ZXTF9FdnRNb3VzZSAqIHBNb3VzZSA9IChDRldMX0V2dE1vdXNlKilwTm90ZTsNCi0gICAgICAgICAgICBpZiAoRldMX01TR01PVVNFQ01EX01vdXNlSG92ZXIgPT0gcE1vdXNlLT5tX2R3Q21kKSB7DQotICAgICAgICAgICAgICAgIGlmIChtX3BOb3RlTG9vcC0+R2V0Rm9ybSgpICYmIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKS0+UHJvY2Vzc0VudGVyKHBNb3VzZSwgbV9wTm90ZUxvb3AtPkdldEZvcm0oKS0+R2V0SW50ZXJmYWNlKCkpKSB7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlID09IHBNb3VzZS0+bV9kd0NtZCkgew0KLSAgICAgICAgICAgICAgICBpZiAoQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5Qcm9jZXNzTGVhdmUocE1vdXNlKSkgew0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmICgoRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duIDw9IHBNb3VzZS0+bV9kd0NtZCkgJiYgKEZXTF9NU0dNT1VTRUNNRF9NQnV0dG9uRGJsQ2xrID49IHBNb3VzZS0+bV9kd0NtZCkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKS0+UHJvY2Vzc0xlYXZlKHBNb3VzZSkpIHsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCisgICAgICB9IGVsc2UgaWYgKEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlID09IHBNb3VzZS0+bV9kd0NtZCkgew0KKyAgICAgICAgaWYgKENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKS0+UHJvY2Vzc0xlYXZlKHBNb3VzZSkpIHsNCiAgICAgICAgIH0NCi0gICAgICAgIG1fc2VuZEV2ZW50Q2FsbGVkICsrOw0KLSAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gbV9ldmVudFRhcmdldHMuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICAgICAgd2hpbGUgKHBvcykgew0KLSAgICAgICAgICAgIHZvaWQqIGtleSA9IE5VTEw7DQotICAgICAgICAgICAgQ0ZXTF9FdmVudFRhcmdldCAqcEV2ZW50VGFyZ2V0Ow0KLSAgICAgICAgICAgIG1fZXZlbnRUYXJnZXRzLkdldE5leHRBc3NvYyhwb3MsIGtleSwgKHZvaWQqJilwRXZlbnRUYXJnZXQpOw0KLSAgICAgICAgICAgIGlmIChwRXZlbnRUYXJnZXQgJiYgIXBFdmVudFRhcmdldC0+SXNJbnZhbGlkKCkpIHsNCi0gICAgICAgICAgICAgICAgcEV2ZW50VGFyZ2V0LT5Qcm9jZXNzRXZlbnQoKENGV0xfRXZlbnQqKXBOb3RlKTsNCi0gICAgICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmICgoRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duIDw9IHBNb3VzZS0+bV9kd0NtZCkgJiYNCisgICAgICAgICAgICAgICAgIChGV0xfTVNHTU9VU0VDTURfTUJ1dHRvbkRibENsayA+PSBwTW91c2UtPm1fZHdDbWQpKSB7DQorICAgICAgICBpZiAoQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5Qcm9jZXNzTGVhdmUocE1vdXNlKSkgew0KICAgICAgICAgfQ0KLSAgICAgICAgbV9zZW5kRXZlbnRDYWxsZWQgLS07DQotICAgIH0gZWxzZSB7DQotICAgICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBOb3RlLT5tX3BEc3RUYXJnZXQsIEZBTFNFKTsNCi0gICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IHBOb3RlLT5tX3BEc3RUYXJnZXQtPlNldERlbGVnYXRlKE5VTEwpOw0KLSAgICAgICAgaWYgKHBEZWxlZ2F0ZSkgew0KLSAgICAgICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZSgoQ0ZXTF9NZXNzYWdlKilwTm90ZSk7DQotICAgICAgICB9DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1leHRlcm4gdm9pZCBGV0xfUG9zdE1lc3NhZ2VUb01haW5Sb29wKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KLUZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpQb3N0TWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KLXsNCi0gICAgRldMX1Bvc3RNZXNzYWdlVG9NYWluUm9vcChwTWVzc2FnZSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi0jZGVmaW5lIEZXTF9Ob3RlRHJpdmVyX0V2ZW50S2V5IDExMDANCi1GV0xfRVJSIENGV0xfTm90ZURyaXZlcjo6UmVnaXN0ZXJFdmVudFRhcmdldChJRldMX1dpZGdldCAqcExpc3RlbmVyLCBJRldMX1dpZGdldCAqcEV2ZW50U291cmNlICwgRlhfRFdPUkQgZHdGaWx0ZXIgKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdrZXkgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdClwTGlzdGVuZXItPkdldFByaXZhdGVEYXRhKCh2b2lkKikodWludHB0cl90KUZXTF9Ob3RlRHJpdmVyX0V2ZW50S2V5KTsNCi0gICAgaWYgKGR3a2V5ID09IDApIHsNCi0gICAgICAgIHZvaWQqIHJhbmRvbSA9IEZYX1JhbmRvbV9NVF9TdGFydCgwKTsNCi0gICAgICAgIGR3a2V5ID0JcmFuZCgpOw0KLSAgICAgICAgRlhfUmFuZG9tX01UX0Nsb3NlKHJhbmRvbSk7DQotICAgICAgICBwTGlzdGVuZXItPlNldFByaXZhdGVEYXRhKCh2b2lkKikodWludHB0cl90KUZXTF9Ob3RlRHJpdmVyX0V2ZW50S2V5LCAodm9pZCopKHVpbnRwdHJfdClkd2tleSwgTlVMTCk7DQotICAgIH0NCi0gICAgQ0ZXTF9FdmVudFRhcmdldCAqdmFsdWUgPSBOVUxMOw0KLSAgICBpZiAoIW1fZXZlbnRUYXJnZXRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd2tleSwgKHZvaWQqJil2YWx1ZSkpIHsNCi0gICAgICAgIHZhbHVlID0gRlhfTkVXIENGV0xfRXZlbnRUYXJnZXQodGhpcywgcExpc3RlbmVyKTsNCi0gICAgICAgIG1fZXZlbnRUYXJnZXRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3a2V5LCB2YWx1ZSk7DQotICAgIH0NCi0gICAgdmFsdWUtPlNldEV2ZW50U291cmNlKHBFdmVudFNvdXJjZSwgZHdGaWx0ZXIpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Ob3RlRHJpdmVyOjpVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQgKnBMaXN0ZW5lcikNCi17DQotICAgIEZYX0RXT1JEIGR3a2V5ID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpcExpc3RlbmVyLT5HZXRQcml2YXRlRGF0YSgodm9pZCopKHVpbnRwdHJfdClGV0xfTm90ZURyaXZlcl9FdmVudEtleSk7DQotICAgIGlmIChkd2tleSA9PSAwKSB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLSAgICB9DQotICAgIENGV0xfRXZlbnRUYXJnZXQgKnZhbHVlID0gTlVMTDsNCi0gICAgaWYgKG1fZXZlbnRUYXJnZXRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd2tleSwgKHZvaWQqJil2YWx1ZSkpIHsNCi0gICAgICAgIHZhbHVlLT5GbGFnSW52YWxpZCgpOw0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotdm9pZCBDRldMX05vdGVEcml2ZXI6OkNsZWFyRXZlbnRUYXJnZXRzKEZYX0JPT0wgYlJlbW92ZUFsbCkNCi17DQotICAgIENsZWFySW52YWxpZEV2ZW50VGFyZ2V0cyhiUmVtb3ZlQWxsKTsNCi19DQotaW50MzJfdCBDRldMX05vdGVEcml2ZXI6OkdldFF1ZXVlTWF4U2l6ZSgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9tYXhTaXplOw0KLX0NCi1GV0xfRVJSIENGV0xfTm90ZURyaXZlcjo6U2V0UXVldWVNYXhTaXplKGNvbnN0IGludDMyX3Qgc2l6ZSkNCi17DQotICAgIG1fbWF4U2l6ZSA9IHNpemU7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotSUZXTF9Ob3RlVGhyZWFkKiBDRldMX05vdGVEcml2ZXI6OkdldE93bmVyVGhyZWFkKCkgY29uc3QNCi17DQotICAgIHJldHVybiAoSUZXTF9Ob3RlVGhyZWFkICopIEZXTF9HZXRBcHAoKTsNCi19DQotRldMX0VSUiBDRldMX05vdGVEcml2ZXI6OlB1c2hOb3RlTG9vcChJRldMX05vdGVMb29wICpwTm90ZUxvb3ApDQotew0KLSAgICBtX25vdGVMb29wUXVldWUuQWRkKHBOb3RlTG9vcCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotSUZXTF9Ob3RlTG9vcCogQ0ZXTF9Ob3RlRHJpdmVyOjpQb3BOb3RlTG9vcCgpDQotew0KLSAgICBpbnQzMl90IHBvcyA9IG1fbm90ZUxvb3BRdWV1ZS5HZXRTaXplKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocG9zID4gMCwgTlVMTCk7DQotICAgIElGV0xfTm90ZUxvb3AgKiBwID0gKElGV0xfTm90ZUxvb3AgKikgbV9ub3RlTG9vcFF1ZXVlLkdldEF0KHBvcyAtIDEpOw0KLSAgICBtX25vdGVMb29wUXVldWUuUmVtb3ZlQXQocG9zIC0gMSk7DQotICAgIHJldHVybiBwOw0KLX0NCi1GWF9CT09MCUNGV0xfTm90ZURyaXZlcjo6U2V0Rm9jdXMoSUZXTF9XaWRnZXQgKnBGb2N1cywgRlhfQk9PTCBiTm90aWZ5ICkNCi17DQotICAgIGlmIChtX3BGb2N1cyA9PSBwRm9jdXMpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIElGV0xfV2lkZ2V0KiBwUHJldiA9IG1fcEZvY3VzOw0KLSAgICBtX3BGb2N1cyA9IHBGb2N1czsNCi0gICAgaWYgKHBQcmV2KSB7DQotICAgICAgICBJRldMX1dpZGdldCAqcFdpZGdldCA9IEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KG1fcEZvY3VzLCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQotICAgICAgICBDRldMX0Zvcm1JbXAgKnBGb3JtID0gcFdpZGdldCA/IChDRldMX0Zvcm1JbXAqKSgoSUZXTF9UYXJnZXREYXRhKilwV2lkZ2V0KS0+R2V0RGF0YSgpIDogTlVMTDsNCi0gICAgICAgIENGV0xfTXNnS2lsbEZvY3VzIG1zOw0KLSAgICAgICAgbXMubV9wRHN0VGFyZ2V0ID0gcFByZXY7DQotICAgICAgICBtcy5tX3BTcmNUYXJnZXQgPSBwUHJldjsNCi0gICAgICAgIGlmIChiTm90aWZ5KSB7DQotICAgICAgICAgICAgbXMubV9kd0V4dGVuZCA9IDE7DQotICAgICAgICB9DQotICAgICAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBwUHJldi0+U2V0RGVsZWdhdGUoTlVMTCk7DQotICAgICAgICBpZiAocERlbGVnYXRlKSB7DQotICAgICAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKCZtcyk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBGb2N1cykgew0KLSAgICAgICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChwRm9jdXMsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKTsNCi0gICAgICAgIENGV0xfRm9ybUltcCAqcEZvcm0gPSBwV2lkZ2V0ID8gKENGV0xfRm9ybUltcCopKChJRldMX1RhcmdldERhdGEqKXBXaWRnZXQpLT5HZXREYXRhKCkgOiBOVUxMOw0KLSAgICAgICAgaWYgKHBGb3JtKSB7DQotICAgICAgICAgICAgQ0ZXTF9XaWRnZXRJbXAgKnBOZXdGb2N1cyA9IChDRldMX1dpZGdldEltcCopKChJRldMX1RhcmdldERhdGEqKXBGb2N1cyktPkdldERhdGEoKTsNCi0gICAgICAgICAgICBwRm9ybS0+U2V0U3ViRm9jdXMocE5ld0ZvY3VzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGV0xfTXNnU2V0Rm9jdXMgbXM7DQotICAgICAgICBtcy5tX3BEc3RUYXJnZXQgPSBwRm9jdXM7DQotICAgICAgICBpZiAoYk5vdGlmeSkgew0KLSAgICAgICAgICAgIG1zLm1fZHdFeHRlbmQgPSAxOw0KLSAgICAgICAgfQ0KLSAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gcEZvY3VzLT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgIGlmIChwRGVsZWdhdGUpIHsNCi0gICAgICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UoJm1zKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRldMX0VSUglDRldMX05vdGVEcml2ZXI6OlJ1bigpDQotew0KLSAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXRNZ3IsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotI2lmIChfRlhfT1NfPT1fRlhfTUFDT1NYXykNCi0gICAgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyICogYWRhcHRlcldpZGdldE1nciA9IHBXaWRnZXRNZ3ItPkdldEFkYXB0ZXJXaWRnZXRNZ3IoKTsNCi0gICAgQ0ZXTF9Ob3RlTG9vcCAqcFRvcExvb3AgPSBHZXRUb3BMb29wKCk7DQotICAgIGlmIChwVG9wTG9vcCkgew0KLSAgICAgICAgQ0ZXTF9XaWRnZXRJbXAgKmZvcm1JbXAgPSBwVG9wTG9vcC0+R2V0Rm9ybSgpOw0KLSAgICAgICAgaWYgKGZvcm1JbXApIHsNCi0gICAgICAgICAgICBJRldMX1dpZGdldCAqcEZvcm0gPSBmb3JtSW1wLT5HZXRJbnRlcmZhY2UoKTsNCi0gICAgICAgICAgICBhZGFwdGVyV2lkZ2V0TWdyLT5SdW5Mb29wKHBGb3JtKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSNlbGlmIChfRlhfT1NfPT1fRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfKQ0KLSAgICBGWF9CT09MCQliSWRsZSA9IFRSVUU7DQotICAgIGludDMyX3QJaUlkbGVDb3VudCA9IDA7DQotICAgIENGV0xfTm90ZUxvb3AgKnBUb3BMb29wID0gTlVMTDsNCi0gICAgZm9yICg7Oykgew0KLSAgICAgICAgcFRvcExvb3AgPSBHZXRUb3BMb29wKCk7DQotICAgICAgICBpZiAoIXBUb3BMb29wIHx8ICFwVG9wTG9vcC0+Q29udGludWVNb2RhbCgpKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZiAoVW5xdWV1ZU1lc3NhZ2UocFRvcExvb3ApKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICB3aGlsZSAoYklkbGUgJiYgIShwV2lkZ2V0TWdyLT5DaGVja01lc3NhZ2VfTmF0aXZlKCkpKSB7DQotICAgICAgICAgICAgaWYgKEZXTF9FUlJfSW5kZWZpbml0ZSA9PSBwVG9wTG9vcC0+SWRsZShpSWRsZUNvdW50KyspKSB7DQotICAgICAgICAgICAgICAgIGJJZGxlID0gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZG8gew0KLSAgICAgICAgICAgIGlmIChGV0xfRVJSX0luZGVmaW5pdGUgPT0gcFdpZGdldE1nci0+RGlzcGF0Y2hNZXNzYWdlX05hdGl2ZSgpKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocFdpZGdldE1nci0+SXNJZGxlTWVzc2FnZV9OYXRpdmUoKSkgew0KLSAgICAgICAgICAgICAgICBiSWRsZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGlJZGxlQ291bnQgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gd2hpbGUgKHBXaWRnZXRNZ3ItPkNoZWNrTWVzc2FnZV9OYXRpdmUoKSk7DQotICAgIH0NCi0jZWxpZiAoX0ZYX09TXz09X0ZYX0xJTlVYX0RFU0tUT1BfKQ0KLSAgICBDRldMX05vdGVMb29wICpwVG9wTG9vcCA9IE5VTEw7DQotICAgIGZvciAoOzspIHsNCi0gICAgICAgIHBUb3BMb29wID0gR2V0VG9wTG9vcCgpOw0KLSAgICAgICAgaWYgKCFwVG9wTG9vcCB8fCAhcFRvcExvb3AtPkNvbnRpbnVlTW9kYWwoKSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKFVucXVldWVNZXNzYWdlKHBUb3BMb29wKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYocFdpZGdldE1nci0+Q2hlY2tNZXNzYWdlX05hdGl2ZSgpKSB7DQotICAgICAgICAgICAgcFdpZGdldE1nci0+RGlzcGF0Y2hNZXNzYWdlX05hdGl2ZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotI2VuZGlmDQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotSUZXTF9XaWRnZXQqIENGV0xfTm90ZURyaXZlcjo6R2V0Rm9jdXMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEZvY3VzOw0KLX0NCi1JRldMX1dpZGdldCogQ0ZXTF9Ob3RlRHJpdmVyOjpHZXRIb3ZlcigpDQotew0KLSAgICByZXR1cm4gbV9wSG92ZXI7DQotfQ0KLXZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpTZXRIb3ZlcihJRldMX1dpZGdldCAqcEhvdmVyKQ0KLXsNCi0gICAgbV9wSG92ZXIgPSBwSG92ZXI7DQotfQ0KLXZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpTZXRHcmFiKElGV0xfV2lkZ2V0ICpwR3JhYiwgRlhfQk9PTCBiU2V0KQ0KLXsNCi0gICAgbV9wR3JhYiA9IGJTZXQgPyBwR3JhYiA6IE5VTEw7DQotfQ0KLXZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpOb3RpZnlUYXJnZXRIaWRlKElGV0xfV2lkZ2V0ICpwTm90ZVRhcmdldCkNCi17DQotICAgIGlmIChtX3BGb2N1cyA9PSBwTm90ZVRhcmdldCkgew0KLSAgICAgICAgbV9wRm9jdXMgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3BIb3ZlciA9PSBwTm90ZVRhcmdldCkgew0KLSAgICAgICAgbV9wSG92ZXIgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3BHcmFiID09IHBOb3RlVGFyZ2V0KSB7DQotICAgICAgICBtX3BHcmFiID0gTlVMTDsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfTm90ZURyaXZlcjo6Tm90aWZ5VGFyZ2V0RGVzdHJveShJRldMX1dpZGdldCAqcE5vdGVUYXJnZXQpDQotew0KLSAgICBpZiAobV9wRm9jdXMgPT0gcE5vdGVUYXJnZXQpIHsNCi0gICAgICAgIG1fcEZvY3VzID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wSG92ZXIgPT0gcE5vdGVUYXJnZXQpIHsNCi0gICAgICAgIG1fcEhvdmVyID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wR3JhYiA9PSBwTm90ZVRhcmdldCkgew0KLSAgICAgICAgbV9wR3JhYiA9IE5VTEw7DQotICAgIH0NCi0gICAgVW5yZWdpc3RlckV2ZW50VGFyZ2V0KHBOb3RlVGFyZ2V0KTsNCi0gICAgaW50MzJfdCBjb3VudCA9IG1fZm9ybXMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgbkluZGV4ID0gMDsgbkluZGV4IDwgY291bnQ7IG5JbmRleCArKykgew0KLSAgICAgICAgQ0ZXTF9Gb3JtSW1wICpwRm9ybSA9IChDRldMX0Zvcm1JbXAqKW1fZm9ybXNbbkluZGV4XTsNCi0gICAgICAgIGlmICghcEZvcm0pIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGV0xfV2lkZ2V0SW1wICpwU3ViRm9jdXMgPSBwRm9ybS0+R2V0U3ViRm9jdXMoKTsNCi0gICAgICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFN1YkZvY3VzKTsNCi0gICAgICAgIGlmIChwU3ViRm9jdXMgJiYgcFN1YkZvY3VzLT5HZXRJbnRlcmZhY2UoKSA9PSBwTm90ZVRhcmdldCkgew0KLSAgICAgICAgICAgIHBGb3JtLT5TZXRTdWJGb2N1cyhOVUxMKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfTm90ZURyaXZlcjo6Tm90aWZ5RnVsbFNjcmVlbk1vZGUoSUZXTF9XaWRnZXQgKnBOb3RlVGFyZ2V0LCBGWF9CT09MIGJGdWxsU2NyZWVuKQ0KLXsNCi0gICAgbV9iRnVsbFNjcmVlbiA9IGJGdWxsU2NyZWVuOw0KLX0NCi1GV0xfRVJSCUNGV0xfTm90ZURyaXZlcjo6UmVnaXN0ZXJGb3JtKENGV0xfV2lkZ2V0SW1wICpwRm9ybSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEZvcm0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGlmIChtX2Zvcm1zLkZpbmQocEZvcm0pID49IDApIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQotICAgIH0NCi0gICAgbV9mb3Jtcy5BZGQocEZvcm0pOw0KLSAgICBpZiAobV9mb3Jtcy5HZXRTaXplKCkgPT0gMSkgew0KLSAgICAgICAgQ0ZXTF9Ob3RlTG9vcCAqcExvb3AgPSAoQ0ZXTF9Ob3RlTG9vcCopbV9ub3RlTG9vcFF1ZXVlLkdldEF0KDApOw0KLSAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTG9vcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgICAgIHBMb29wLT5TZXRNYWluRm9ybShwRm9ybSk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfTm90ZURyaXZlcjo6VW5SZWdpc3RlckZvcm0oQ0ZXTF9XaWRnZXRJbXAgKnBGb3JtKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRm9ybSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaW50MzJfdCBuSW5kZXggPSBtX2Zvcm1zLkZpbmQocEZvcm0pOw0KLSAgICBpZiAobkluZGV4IDwgMCkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCi0gICAgfQ0KLSAgICBtX2Zvcm1zLlJlbW92ZUF0KG5JbmRleCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfQk9PTAlDRldMX05vdGVEcml2ZXI6OlF1ZXVlTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KLXsNCi0gICAgcE1lc3NhZ2UtPlJldGFpbigpOw0KLSAgICBtX25vdGVRdWV1ZS5BZGQocE1lc3NhZ2UpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OlVucXVldWVNZXNzYWdlKENGV0xfTm90ZUxvb3AgKnBOb3RlTG9vcCkNCi17DQotICAgIGlmIChtX25vdGVRdWV1ZS5HZXRTaXplKCkgPCAxKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSA9IChDRldMX01lc3NhZ2UqKW1fbm90ZVF1ZXVlWzBdOw0KLSAgICBtX25vdGVRdWV1ZS5SZW1vdmVBdCgwKTsNCi0gICAgaWYgKCFJc1ZhbGlkTWVzc2FnZShwTWVzc2FnZSkpIHsNCi0gICAgICAgIHBNZXNzYWdlLT5SZWxlYXNlKCk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJIb29rTWVzc2FnZSA9IEZBTFNFOw0KLSAgICBpZiAobV9ob29rKSB7DQotICAgICAgICBiSG9va01lc3NhZ2UgPSAoKm1faG9vaykocE1lc3NhZ2UsIG1faG9va0luZm8pOw0KLSAgICB9DQotICAgIGlmICghYkhvb2tNZXNzYWdlICYmICFwTm90ZUxvb3AtPlByZVByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKSkgew0KLSAgICAgICAgUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLSAgICB9DQotICAgIHBNZXNzYWdlLT5SZWxlYXNlKCk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1DRldMX05vdGVMb29wKiBDRldMX05vdGVEcml2ZXI6OkdldFRvcExvb3AoKQ0KLXsNCi0gICAgaW50MzJfdCBzaXplID0gbV9ub3RlTG9vcFF1ZXVlLkdldFNpemUoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChzaXplID4gMCwgTlVMTCk7DQotICAgIHJldHVybiAoQ0ZXTF9Ob3RlTG9vcCopbV9ub3RlTG9vcFF1ZXVlW3NpemUgLSAxXTsNCi19DQotaW50MzJfdCBDRldMX05vdGVEcml2ZXI6OkNvdW50TG9vcCgpDQotew0KLSAgICByZXR1cm4gbV9ub3RlTG9vcFF1ZXVlLkdldFNpemUoKTsNCi19DQotdm9pZCBDRldMX05vdGVEcml2ZXI6OlNldEhvb2soRldMTWVzc2FnZUhvb2tDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogaW5mbykNCi17DQotICAgIG1faG9vayA9IGNhbGxiYWNrOw0KLSAgICBtX2hvb2tJbmZvID0gaW5mbzsNCi19DQotRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OlByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtID0gcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSA/IHBNZXNzYWdlLT5tX3BEc3RUYXJnZXQgOiBHZXRNZXNzYWdlRm9ybShwTWVzc2FnZS0+bV9wRHN0VGFyZ2V0KTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZUZvcm0sIEZBTFNFKTsNCi0gICAgaWYgKERpc3BhdGNoTWVzc2FnZShwTWVzc2FnZSwgcE1lc3NhZ2VGb3JtKSkgew0KLSAgICAgICAgaWYgKHBNZXNzYWdlLT5HZXRDbGFzc0lEKCkgPT0gRldMX01TR0hBU0hfTW91c2UpIHsNCi0gICAgICAgICAgICBNb3VzZVNlY29uZGFyeSgoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RGlzcGF0Y2hNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UsIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pDQotew0KLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCi0gICAgc3dpdGNoIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpKSB7DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0FjdGl2YXRlOiB7DQotICAgICAgICAgICAgICAgIGJSZXQgPSBEb0FjdGl2YXRlKChDRldMX01zZ0FjdGl2YXRlKilwTWVzc2FnZSwgcE1lc3NhZ2VGb3JtKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9EZWFjdGl2YXRlOiB7DQotICAgICAgICAgICAgICAgIGJSZXQgPSBEb0RlYWN0aXZhdGUoKENGV0xfTXNnRGVhY3RpdmF0ZSopcE1lc3NhZ2UsIHBNZXNzYWdlRm9ybSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6IHsNCi0gICAgICAgICAgICAgICAgYlJldCA9IERvU2V0Rm9jdXMoKENGV0xfTXNnU2V0Rm9jdXMqKXBNZXNzYWdlLCBwTWVzc2FnZUZvcm0pOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KLSAgICAgICAgICAgICAgICBiUmV0ID0gRG9LaWxsRm9jdXMoKENGV0xfTXNnS2lsbEZvY3VzKilwTWVzc2FnZSwgcE1lc3NhZ2VGb3JtKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCi0gICAgICAgICAgICAgICAgYlJldCA9IERvS2V5KChDRldMX01zZ0tleSopcE1lc3NhZ2UsIHBNZXNzYWdlRm9ybSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCi0gICAgICAgICAgICAgICAgYlJldCA9IERvTW91c2UoKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlLCBwTWVzc2FnZUZvcm0pOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlV2hlZWw6IHsNCi0gICAgICAgICAgICAgICAgYlJldCA9IERvV2hlZWwoKENGV0xfTXNnTW91c2VXaGVlbCopcE1lc3NhZ2UsIHBNZXNzYWdlRm9ybSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfU2l6ZTogew0KLSAgICAgICAgICAgICAgICBiUmV0ID0gRG9TaXplKChDRldMX01zZ1NpemUqKXBNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9DdXJzb3I6IHsNCi0gICAgICAgICAgICAgICAgYlJldCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfV2luZG93TW92ZTogew0KLSAgICAgICAgICAgICAgICBiUmV0ID0gRG9XaW5kb3dNb3ZlKChDRldMX01zZ1dpbmRvd01vdmUqKXBNZXNzYWdlLCBwTWVzc2FnZUZvcm0pOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX0Ryb3BGaWxlczogew0KLSAgICAgICAgICAgICAgICBiUmV0ID0gRG9EcmFnRmlsZXMoKENGV0xfTXNnRHJvcEZpbGVzKilwTWVzc2FnZSwgcE1lc3NhZ2VGb3JtKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9UYXNrQ2xpY2tlZDogew0KLSAgICAgICAgICAgICAgICBiUmV0ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9DbG9zZTogew0KLSAgICAgICAgICAgICAgICBiUmV0ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICBiUmV0ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChiUmV0KSB7DQotICAgICAgICBJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUgPSBwTWVzc2FnZS0+bV9wRHN0VGFyZ2V0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgIGlmIChwRGVsZWdhdGUpIHsNCi0gICAgICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBiUmV0Ow0KLX0NCi1GWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RG9BY3RpdmF0ZShDRldMX01zZ0FjdGl2YXRlICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKQ0KLXsNCi0gICAgaWYgKG1fYkZ1bGxTY3JlZW4pIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBwTXNnLT5tX3BEc3RUYXJnZXQgPSBwTWVzc2FnZUZvcm07DQotICAgIHJldHVybiAocE1zZy0+bV9wRHN0VGFyZ2V0KS0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpEb0RlYWN0aXZhdGUoQ0ZXTF9Nc2dEZWFjdGl2YXRlICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKQ0KLXsNCi0gICAgaWYgKG1fYkZ1bGxTY3JlZW4pIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlUcmFja0xvb3AgPSBtX25vdGVMb29wUXVldWUuR2V0U2l6ZSgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGlUcmFja0xvb3AgPiAwLCBGQUxTRSk7DQotICAgIGlmIChpVHJhY2tMb29wID09IDEpIHsNCi0gICAgICAgIGlmIChwTWVzc2FnZUZvcm0tPklzSW5zdGFuY2UoRlhfV1NUUkMoTCJGV0xfRk9STVBST1hZIikpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBNc2ctPm1fcFNyY1RhcmdldCAmJiBwTXNnLT5tX3BTcmNUYXJnZXQtPklzSW5zdGFuY2UoRlhfV1NUUkMoTCJGV0xfRk9STVBST1hZIikpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBNc2ctPm1fcFNyY1RhcmdldCAmJiAgcE1zZy0+bV9wU3JjVGFyZ2V0LT5HZXRDbGFzc0lEKCkgPT0gMTExMTk4NDc1NSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIElGV0xfV2lkZ2V0ICpwRHN0ID0gcE1zZy0+bV9wRHN0VGFyZ2V0Ow0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBEc3QsIEZBTFNFKTsNCi0jaWYgKF9GWF9PU189PV9GWF9NQUNPU1hfKQ0KLSAgICBpZiAocERzdCA9PSBwTWVzc2FnZUZvcm0gJiYgcERzdC0+SXNJbnN0YW5jZShMIkZXTF9GT1JNUFJPWFkiKSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0jZW5kaWYNCi0gICAgcmV0dXJuIHBEc3QgIT0gcE1lc3NhZ2VGb3JtICYmDQotICAgICAgICAgICAhcERzdC0+SXNJbnN0YW5jZShGWF9XU1RSQyhMIkZXTF9GT1JNUFJPWFkiKSkgJiYNCi0gICAgICAgICAgICFwTWVzc2FnZUZvcm0tPklzSW5zdGFuY2UoRlhfV1NUUkMoTCJGV0xfRk9STVBST1hZIikpOw0KLX0NCi1GWF9CT09MCUNGV0xfTm90ZURyaXZlcjo6RG9TZXRGb2N1cyhDRldMX01zZ1NldEZvY3VzICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCi0gICAgaWYgKHBXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIG1fcEZvY3VzID0gKElGV0xfV2lkZ2V0KilwTXNnLT5tX3BEc3RUYXJnZXQ7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gcE1zZy0+bV9wRHN0VGFyZ2V0Ow0KLSAgICAgICAgQ0ZXTF9Gb3JtSW1wICpwRm9ybSA9IHBXaWRnZXQgPyAoQ0ZXTF9Gb3JtSW1wKikoKElGV0xfVGFyZ2V0RGF0YSopcFdpZGdldCktPkdldERhdGEoKSA6IE5VTEw7DQotICAgICAgICBpZihwRm9ybSkgew0KLSAgICAgICAgICAgIENGV0xfV2lkZ2V0SW1wICpwU3ViRm9jdXMgPSBwRm9ybS0+R2V0U3ViRm9jdXMoKTsNCi0gICAgICAgICAgICBpZiAocFN1YkZvY3VzICYmICgocFN1YkZvY3VzLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PSAwKSkgew0KLSAgICAgICAgICAgICAgICBwTXNnLT5tX3BEc3RUYXJnZXQgPSBwU3ViRm9jdXMtPkdldEludGVyZmFjZSgpOw0KLSAgICAgICAgICAgICAgICBpZihtX3BGb2N1cyAhPSBwTXNnLT5tX3BEc3RUYXJnZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcEZvY3VzID0gcE1zZy0+bV9wRHN0VGFyZ2V0Ow0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MCUNGV0xfTm90ZURyaXZlcjo6RG9LaWxsRm9jdXMoQ0ZXTF9Nc2dLaWxsRm9jdXMgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pDQotew0KLSAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBpZiAocFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgaWYgKG1fcEZvY3VzID09IHBNc2ctPm1fcERzdFRhcmdldCkgew0KLSAgICAgICAgICAgIG1fcEZvY3VzID0gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSAgcE1zZy0+bV9wRHN0VGFyZ2V0Ow0KLSAgICAgICAgQ0ZXTF9Gb3JtSW1wICpwRm9ybSA9IHBXaWRnZXQgPyAoQ0ZXTF9Gb3JtSW1wKikoKElGV0xfVGFyZ2V0RGF0YSopcFdpZGdldCktPkdldERhdGEoKSA6IE5VTEw7DQotICAgICAgICBpZihwRm9ybSkgew0KLSAgICAgICAgICAgIENGV0xfV2lkZ2V0SW1wICpwU3ViRm9jdXMgPSBwRm9ybS0+R2V0U3ViRm9jdXMoKTsNCi0gICAgICAgICAgICBpZiAocFN1YkZvY3VzICYmIChwU3ViRm9jdXMtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpKSB7DQotICAgICAgICAgICAgICAgIHBNc2ctPm1fcERzdFRhcmdldCA9IHBTdWJGb2N1cy0+R2V0SW50ZXJmYWNlKCk7DQotICAgICAgICAgICAgICAgIGlmIChtX3BGb2N1cyA9PSBwTXNnLT5tX3BEc3RUYXJnZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcEZvY3VzID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTAlDRldMX05vdGVEcml2ZXI6OkRvS2V5KENGV0xfTXNnS2V5ICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKQ0KLXsNCi0jaWYoX0ZYX09TXyAhPSBfRlhfTUFDT1NYXykNCi0gICAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duICYmIHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1RhYikgew0KLSAgICAgICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCi0gICAgICAgIElGV0xfV2lkZ2V0ICpwRm9ybSA9IEdldE1lc3NhZ2VGb3JtKHBNc2ctPm1fcERzdFRhcmdldCk7DQotICAgICAgICBJRldMX1dpZGdldCAqcEZvY3VzID0gbV9wRm9jdXM7DQotICAgICAgICBpZiAobV9wRm9jdXMpIHsNCi0gICAgICAgICAgICBpZiAocFdpZGdldE1nci0+R2V0V2lkZ2V0KG1fcEZvY3VzLCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSkgIT0gcEZvcm0pIHsNCi0gICAgICAgICAgICAgICAgcEZvY3VzID0gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7DQotICAgICAgICBJRldMX1dpZGdldCAqcE5leHRUYWJTdG9wID0gcFdpZGdldE1nci0+bmV4dFRhYihwRm9ybSwgcEZvY3VzLCBiRmluZCk7DQotICAgICAgICBpZiAoIXBOZXh0VGFiU3RvcCkgew0KLSAgICAgICAgICAgIGJGaW5kID0gRkFMU0U7DQotICAgICAgICAgICAgcE5leHRUYWJTdG9wID0gcFdpZGdldE1nci0+bmV4dFRhYihwRm9ybSwgTlVMTCwgYkZpbmQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBOZXh0VGFiU3RvcCA9PSBwRm9jdXMpIHsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwTmV4dFRhYlN0b3ApIHsNCi0gICAgICAgICAgICBTZXRGb2N1cyhwTmV4dFRhYlN0b3ApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0jZW5kaWYNCi0gICAgaWYgKCFtX3BGb2N1cykgew0KLSAgICAgICAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duICYmIHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1JldHVybikgew0KLSAgICAgICAgICAgIENGV0xfV2lkZ2V0TWdyICpwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQotICAgICAgICAgICAgSUZXTF9XaWRnZXQgKmRlZkJ1dHRvbiA9IHBXaWRnZXRNZ3ItPkdldERlZmF1bHRCdXR0b24ocE1lc3NhZ2VGb3JtKTsNCi0gICAgICAgICAgICBpZiAoZGVmQnV0dG9uKSB7DQotICAgICAgICAgICAgICAgIHBNc2ctPm1fcERzdFRhcmdldCA9IGRlZkJ1dHRvbjsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHBNc2ctPm1fcERzdFRhcmdldCA9IG1fcEZvY3VzOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvTW91c2UoQ0ZXTF9Nc2dNb3VzZSAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSkNCi17DQotICAgIGlmIChwTXNnLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlIHx8DQotICAgICAgICAgICAgcE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTW91c2VIb3ZlciB8fA0KLSAgICAgICAgICAgIHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX01vdXNlRW50ZXIpIHsNCi0gICAgICAgIHJldHVybiBwTXNnLT5tX3BEc3RUYXJnZXQgIT0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAocE1zZy0+bV9wRHN0VGFyZ2V0ICE9IHBNZXNzYWdlRm9ybSkgew0KLSAgICAgICAgcE1zZy0+bV9wRHN0VGFyZ2V0LT5UcmFuc2Zvcm1UbyhwTWVzc2FnZUZvcm0sIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KLSAgICB9DQotICAgIGlmICghRG9Nb3VzZUV4KHBNc2csIHBNZXNzYWdlRm9ybSkpIHsNCi0gICAgICAgIHBNc2ctPm1fcERzdFRhcmdldCA9IHBNZXNzYWdlRm9ybTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTAlDRldMX05vdGVEcml2ZXI6OkRvV2hlZWwoQ0ZXTF9Nc2dNb3VzZVdoZWVsICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0TWdyLCBGQUxTRSk7DQotICAgIElGV0xfV2lkZ2V0ICpwRHN0ID0gcFdpZGdldE1nci0+R2V0V2lkZ2V0QXRQb2ludChwTWVzc2FnZUZvcm0sIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KLSAgICBpZiAoIXBEc3QpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB3aGlsZSAocERzdCAmJiBwRHN0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9HcmlkKSB7DQotICAgICAgICBwRHN0ID0gcERzdC0+R2V0UGFyZW50KCk7DQotICAgIH0NCi0gICAgcE1lc3NhZ2VGb3JtLT5UcmFuc2Zvcm1UbyhwRHN0LCBwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gcERzdDsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Ob3RlRHJpdmVyOjpEb1NpemUoQ0ZXTF9Nc2dTaXplICpwTXNnKQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0TWdyLCBGQUxTRSk7DQotICAgIHBXaWRnZXRNZ3ItPk5vdGlmeVNpemVDaGFuZ2VkKHBNc2ctPm1fcERzdFRhcmdldCwgKEZYX0ZMT0FUKXBNc2ctPm1faVdpZHRoLCAoRlhfRkxPQVQpcE1zZy0+bV9pSGVpZ2h0KTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Ob3RlRHJpdmVyOjpEb1dpbmRvd01vdmUoQ0ZXTF9Nc2dXaW5kb3dNb3ZlICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKQ0KLXsNCi0gICAgcmV0dXJuIHBNc2ctPm1fcERzdFRhcmdldCA9PSBwTWVzc2FnZUZvcm07DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Ob3RlRHJpdmVyOjpEb0RyYWdGaWxlcyhDRldMX01zZ0Ryb3BGaWxlcyAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSkNCi17DQotICAgIHJldHVybiBwTXNnLT5tX3BEc3RUYXJnZXQgPT0gcE1lc3NhZ2VGb3JtOw0KLX0NCi1GWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RG9Nb3VzZUV4KENGV0xfTXNnTW91c2UgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pDQotew0KLSAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXRNZ3IsIEZBTFNFKTsNCi0gICAgSUZXTF9XaWRnZXQgKnBUYXJnZXQgPSBOVUxMOw0KLSAgICBpZiAobV9wR3JhYikgew0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHBUYXJnZXQgPSBtX3BHcmFiOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmICghcFRhcmdldCkgew0KLSAgICAgICAgcFRhcmdldCA9IHBXaWRnZXRNZ3ItPkdldFdpZGdldEF0UG9pbnQocE1lc3NhZ2VGb3JtLCBwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCi0gICAgICAgIHdoaWxlIChwVGFyZ2V0ICYmIHBUYXJnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0dyaWQpIHsNCi0gICAgICAgICAgICBwVGFyZ2V0ID0gcFRhcmdldC0+R2V0UGFyZW50KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBUYXJnZXQpIHsNCi0gICAgICAgIGlmIChwTWVzc2FnZUZvcm0gIT0gcFRhcmdldCkgew0KLSAgICAgICAgICAgIHBNZXNzYWdlRm9ybS0+VHJhbnNmb3JtVG8ocFRhcmdldCwgcE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKCFwVGFyZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gcFRhcmdldDsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpNb3VzZVNlY29uZGFyeShDRldMX01zZ01vdXNlICpwTXNnKQ0KLXsNCi0gICAgSUZXTF9XaWRnZXQgKnBUYXJnZXQgPSBwTXNnLT5tX3BEc3RUYXJnZXQ7DQotICAgIGlmIChwVGFyZ2V0ID09IG1fcEhvdmVyKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG1fcEhvdmVyKSB7DQotICAgICAgICBDRldMX01zZ01vdXNlIG1zTGVhdmU7DQotICAgICAgICBtc0xlYXZlLm1fcERzdFRhcmdldCA9IG1fcEhvdmVyOw0KLSAgICAgICAgbXNMZWF2ZS5tX2Z4ID0gcE1zZy0+bV9meDsNCi0gICAgICAgIG1zTGVhdmUubV9meSA9IHBNc2ctPm1fZnk7DQotICAgICAgICBwVGFyZ2V0LT5UcmFuc2Zvcm1UbyhtX3BIb3ZlciwgbXNMZWF2ZS5tX2Z4LCBtc0xlYXZlLm1fZnkpOw0KLSAgICAgICAgbXNMZWF2ZS5tX2R3RmxhZ3MgPSAwOw0KLSAgICAgICAgbXNMZWF2ZS5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmU7DQotICAgICAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zTGVhdmUsIE5VTEwpOw0KLSAgICB9DQotICAgIGlmIChwVGFyZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9Gb3JtKSB7DQotICAgICAgICBtX3BIb3ZlciA9IE5VTEw7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgbV9wSG92ZXIgPSBwVGFyZ2V0Ow0KLSAgICBDRldMX01zZ01vdXNlIG1zSG92ZXI7DQotICAgIG1zSG92ZXIubV9wRHN0VGFyZ2V0ID0gcFRhcmdldDsNCi0gICAgbXNIb3Zlci5tX2Z4ID0gcE1zZy0+bV9meDsNCi0gICAgbXNIb3Zlci5tX2Z5ID0gcE1zZy0+bV9meTsNCi0gICAgbXNIb3Zlci5tX2R3RmxhZ3MgPSAwOw0KLSAgICBtc0hvdmVyLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTW91c2VIb3ZlcjsNCi0gICAgRGlzcGF0Y2hNZXNzYWdlKCZtc0hvdmVyLCBOVUxMKTsNCi19DQotRlhfQk9PTAlDRldMX05vdGVEcml2ZXI6OklzVmFsaWRNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICBpZiAocE1lc3NhZ2UtPkdldENsYXNzSUQoKSA9PSBGV0xfTVNHSEFTSF9Qb3N0KSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fbm90ZUxvb3BRdWV1ZS5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZXTF9Ob3RlTG9vcCAqcE5vdGVMb29wID0gKENGV0xfTm90ZUxvb3AqKW1fbm90ZUxvb3BRdWV1ZVtpXTsNCi0gICAgICAgIENGV0xfV2lkZ2V0SW1wICpwRm9ybSA9IHBOb3RlTG9vcC0+R2V0Rm9ybSgpOw0KLSAgICAgICAgaWYgKHBGb3JtICYmIChwRm9ybS0+R2V0SW50ZXJmYWNlKCkgPT0gcE1lc3NhZ2UtPm1fcERzdFRhcmdldCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpQ291bnQgPSBtX2Zvcm1zLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaUNvdW50OyBqICsrKSB7DQotICAgICAgICBDRldMX0Zvcm1JbXAgKnBGb3JtID0gKENGV0xfRm9ybUltcCopbV9mb3Jtc1tqXTsNCi0gICAgICAgIGlmIChwRm9ybS0+R2V0SW50ZXJmYWNlKCkgPT0gcE1lc3NhZ2UtPm1fcERzdFRhcmdldCkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotSUZXTF9XaWRnZXQqIENGV0xfTm90ZURyaXZlcjo6R2V0TWVzc2FnZUZvcm0oSUZXTF9XaWRnZXQgKnBEc3RUYXJnZXQpDQotew0KLSAgICBpbnQzMl90IGlUcmFja0xvb3AgPSBtX25vdGVMb29wUXVldWUuR2V0U2l6ZSgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGlUcmFja0xvb3AgPiAwLCBOVUxMKTsNCi0gICAgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSA9IE5VTEw7DQotICAgIGlmIChpVHJhY2tMb29wID4gMSkgew0KLSAgICAgICAgQ0ZXTF9Ob3RlTG9vcCAqcE5vb3RMb29wID0gKENGV0xfTm90ZUxvb3AqKW1fbm90ZUxvb3BRdWV1ZVtpVHJhY2tMb29wIC0gMV07DQotICAgICAgICBwTWVzc2FnZUZvcm0gPSBwTm9vdExvb3AtPkdldEZvcm0oKS0+R2V0SW50ZXJmYWNlKCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwTWVzc2FnZUZvcm0gPSAobV9mb3Jtcy5GaW5kKHBEc3RUYXJnZXQpIDwgMCkgPyBOVUxMIDogcERzdFRhcmdldDsNCi0gICAgfQ0KLSAgICBpZiAoIXBNZXNzYWdlRm9ybSAmJiBwRHN0VGFyZ2V0KSB7DQotICAgICAgICBDRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0TWdyLCBOVUxMKTsNCi0gICAgICAgIHBNZXNzYWdlRm9ybSA9IHBXaWRnZXRNZ3ItPkdldFdpZGdldChwRHN0VGFyZ2V0LCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBNZXNzYWdlRm9ybTsNCi19DQotdm9pZCBDRldMX05vdGVEcml2ZXI6OkNsZWFySW52YWxpZEV2ZW50VGFyZ2V0cyhGWF9CT09MIGJSZW1vdmVBbGwpDQotew0KKyAgICBtX3NlbmRFdmVudENhbGxlZCsrOw0KICAgICBGWF9QT1NJVElPTiBwb3MgPSBtX2V2ZW50VGFyZ2V0cy5HZXRTdGFydFBvc2l0aW9uKCk7DQogICAgIHdoaWxlIChwb3MpIHsNCi0gICAgICAgIHZvaWQqIGtleSA9IE5VTEw7DQotICAgICAgICBDRldMX0V2ZW50VGFyZ2V0ICpwRXZlbnRUYXJnZXQgPSBOVUxMOw0KLSAgICAgICAgbV9ldmVudFRhcmdldHMuR2V0TmV4dEFzc29jKHBvcywga2V5LCAodm9pZComKXBFdmVudFRhcmdldCk7DQotICAgICAgICBpZiAocEV2ZW50VGFyZ2V0ICYmIChiUmVtb3ZlQWxsIHx8IHBFdmVudFRhcmdldC0+SXNJbnZhbGlkKCkpKSB7DQotICAgICAgICAgICAgbV9ldmVudFRhcmdldHMuUmVtb3ZlS2V5KGtleSk7DQotICAgICAgICAgICAgZGVsZXRlIHBFdmVudFRhcmdldDsNCisgICAgICB2b2lkKiBrZXkgPSBOVUxMOw0KKyAgICAgIENGV0xfRXZlbnRUYXJnZXQqIHBFdmVudFRhcmdldDsNCisgICAgICBtX2V2ZW50VGFyZ2V0cy5HZXROZXh0QXNzb2MocG9zLCBrZXksICh2b2lkKiYpcEV2ZW50VGFyZ2V0KTsNCisgICAgICBpZiAocEV2ZW50VGFyZ2V0ICYmICFwRXZlbnRUYXJnZXQtPklzSW52YWxpZCgpKSB7DQorICAgICAgICBwRXZlbnRUYXJnZXQtPlByb2Nlc3NFdmVudCgoQ0ZXTF9FdmVudCopcE5vdGUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX3NlbmRFdmVudENhbGxlZC0tOw0KKyAgfSBlbHNlIHsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTm90ZS0+bV9wRHN0VGFyZ2V0LCBGQUxTRSk7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBOb3RlLT5tX3BEc3RUYXJnZXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBpZiAocERlbGVnYXRlKSB7DQorICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKChDRldMX01lc3NhZ2UqKXBOb3RlKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK2V4dGVybiB2b2lkIEZXTF9Qb3N0TWVzc2FnZVRvTWFpblJvb3AoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OlBvc3RNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIEZXTF9Qb3N0TWVzc2FnZVRvTWFpblJvb3AocE1lc3NhZ2UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KKyNkZWZpbmUgRldMX05vdGVEcml2ZXJfRXZlbnRLZXkgMTEwMA0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlRHJpdmVyOjpSZWdpc3RlckV2ZW50VGFyZ2V0KElGV0xfV2lkZ2V0KiBwTGlzdGVuZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBFdmVudFNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZpbHRlcikgew0KKyAgRlhfRFdPUkQgZHdrZXkgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdClwTGlzdGVuZXItPkdldFByaXZhdGVEYXRhKA0KKyAgICAgICh2b2lkKikodWludHB0cl90KUZXTF9Ob3RlRHJpdmVyX0V2ZW50S2V5KTsNCisgIGlmIChkd2tleSA9PSAwKSB7DQorICAgIHZvaWQqIHJhbmRvbSA9IEZYX1JhbmRvbV9NVF9TdGFydCgwKTsNCisgICAgZHdrZXkgPSByYW5kKCk7DQorICAgIEZYX1JhbmRvbV9NVF9DbG9zZShyYW5kb20pOw0KKyAgICBwTGlzdGVuZXItPlNldFByaXZhdGVEYXRhKCh2b2lkKikodWludHB0cl90KUZXTF9Ob3RlRHJpdmVyX0V2ZW50S2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikodWludHB0cl90KWR3a2V5LCBOVUxMKTsNCisgIH0NCisgIENGV0xfRXZlbnRUYXJnZXQqIHZhbHVlID0gTlVMTDsNCisgIGlmICghbV9ldmVudFRhcmdldHMuTG9va3VwKCh2b2lkKikodWludHB0cl90KWR3a2V5LCAodm9pZComKXZhbHVlKSkgew0KKyAgICB2YWx1ZSA9IEZYX05FVyBDRldMX0V2ZW50VGFyZ2V0KHRoaXMsIHBMaXN0ZW5lcik7DQorICAgIG1fZXZlbnRUYXJnZXRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3a2V5LCB2YWx1ZSk7DQorICB9DQorICB2YWx1ZS0+U2V0RXZlbnRTb3VyY2UocEV2ZW50U291cmNlLCBkd0ZpbHRlcik7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlRHJpdmVyOjpVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQqIHBMaXN0ZW5lcikgew0KKyAgRlhfRFdPUkQgZHdrZXkgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdClwTGlzdGVuZXItPkdldFByaXZhdGVEYXRhKA0KKyAgICAgICh2b2lkKikodWludHB0cl90KUZXTF9Ob3RlRHJpdmVyX0V2ZW50S2V5KTsNCisgIGlmIChkd2tleSA9PSAwKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBDRldMX0V2ZW50VGFyZ2V0KiB2YWx1ZSA9IE5VTEw7DQorICBpZiAobV9ldmVudFRhcmdldHMuTG9va3VwKCh2b2lkKikodWludHB0cl90KWR3a2V5LCAodm9pZComKXZhbHVlKSkgew0KKyAgICB2YWx1ZS0+RmxhZ0ludmFsaWQoKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX05vdGVEcml2ZXI6OkNsZWFyRXZlbnRUYXJnZXRzKEZYX0JPT0wgYlJlbW92ZUFsbCkgew0KKyAgQ2xlYXJJbnZhbGlkRXZlbnRUYXJnZXRzKGJSZW1vdmVBbGwpOw0KK30NCitpbnQzMl90IENGV0xfTm90ZURyaXZlcjo6R2V0UXVldWVNYXhTaXplKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fbWF4U2l6ZTsNCit9DQorRldMX0VSUiBDRldMX05vdGVEcml2ZXI6OlNldFF1ZXVlTWF4U2l6ZShjb25zdCBpbnQzMl90IHNpemUpIHsNCisgIG1fbWF4U2l6ZSA9IHNpemU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfTm90ZVRocmVhZCogQ0ZXTF9Ob3RlRHJpdmVyOjpHZXRPd25lclRocmVhZCgpIGNvbnN0IHsNCisgIHJldHVybiAoSUZXTF9Ob3RlVGhyZWFkKilGV0xfR2V0QXBwKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlRHJpdmVyOjpQdXNoTm90ZUxvb3AoSUZXTF9Ob3RlTG9vcCogcE5vdGVMb29wKSB7DQorICBtX25vdGVMb29wUXVldWUuQWRkKHBOb3RlTG9vcCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfTm90ZUxvb3AqIENGV0xfTm90ZURyaXZlcjo6UG9wTm90ZUxvb3AoKSB7DQorICBpbnQzMl90IHBvcyA9IG1fbm90ZUxvb3BRdWV1ZS5HZXRTaXplKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBvcyA+IDAsIE5VTEwpOw0KKyAgSUZXTF9Ob3RlTG9vcCogcCA9IChJRldMX05vdGVMb29wKiltX25vdGVMb29wUXVldWUuR2V0QXQocG9zIC0gMSk7DQorICBtX25vdGVMb29wUXVldWUuUmVtb3ZlQXQocG9zIC0gMSk7DQorICByZXR1cm4gcDsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OlNldEZvY3VzKElGV0xfV2lkZ2V0KiBwRm9jdXMsIEZYX0JPT0wgYk5vdGlmeSkgew0KKyAgaWYgKG1fcEZvY3VzID09IHBGb2N1cykgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIElGV0xfV2lkZ2V0KiBwUHJldiA9IG1fcEZvY3VzOw0KKyAgbV9wRm9jdXMgPSBwRm9jdXM7DQorICBpZiAocFByZXYpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPQ0KKyAgICAgICAgRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQobV9wRm9jdXMsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKTsNCisgICAgQ0ZXTF9Gb3JtSW1wKiBwRm9ybSA9DQorICAgICAgICBwV2lkZ2V0ID8gKENGV0xfRm9ybUltcCopKChJRldMX1RhcmdldERhdGEqKXBXaWRnZXQpLT5HZXREYXRhKCkgOiBOVUxMOw0KKyAgICBDRldMX01zZ0tpbGxGb2N1cyBtczsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gcFByZXY7DQorICAgIG1zLm1fcFNyY1RhcmdldCA9IHBQcmV2Ow0KKyAgICBpZiAoYk5vdGlmeSkgew0KKyAgICAgIG1zLm1fZHdFeHRlbmQgPSAxOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBQcmV2LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgaWYgKHBEZWxlZ2F0ZSkgew0KKyAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZSgmbXMpOw0KKyAgICB9DQorICB9DQorICBpZiAocEZvY3VzKSB7DQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0NCisgICAgICAgIEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KHBGb2N1cywgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0pOw0KKyAgICBDRldMX0Zvcm1JbXAqIHBGb3JtID0NCisgICAgICAgIHBXaWRnZXQgPyAoQ0ZXTF9Gb3JtSW1wKikoKElGV0xfVGFyZ2V0RGF0YSopcFdpZGdldCktPkdldERhdGEoKSA6IE5VTEw7DQorICAgIGlmIChwRm9ybSkgew0KKyAgICAgIENGV0xfV2lkZ2V0SW1wKiBwTmV3Rm9jdXMgPQ0KKyAgICAgICAgICAoQ0ZXTF9XaWRnZXRJbXAqKSgoSUZXTF9UYXJnZXREYXRhKilwRm9jdXMpLT5HZXREYXRhKCk7DQorICAgICAgcEZvcm0tPlNldFN1YkZvY3VzKHBOZXdGb2N1cyk7DQorICAgIH0NCisgICAgQ0ZXTF9Nc2dTZXRGb2N1cyBtczsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gcEZvY3VzOw0KKyAgICBpZiAoYk5vdGlmeSkgew0KKyAgICAgIG1zLm1fZHdFeHRlbmQgPSAxOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBGb2N1cy0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIGlmIChwRGVsZWdhdGUpIHsNCisgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UoJm1zKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlRHJpdmVyOjpSdW4oKSB7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0TWdyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXykNCisgIElGV0xfQWRhcHRlcldpZGdldE1nciogYWRhcHRlcldpZGdldE1nciA9IHBXaWRnZXRNZ3ItPkdldEFkYXB0ZXJXaWRnZXRNZ3IoKTsNCisgIENGV0xfTm90ZUxvb3AqIHBUb3BMb29wID0gR2V0VG9wTG9vcCgpOw0KKyAgaWYgKHBUb3BMb29wKSB7DQorICAgIENGV0xfV2lkZ2V0SW1wKiBmb3JtSW1wID0gcFRvcExvb3AtPkdldEZvcm0oKTsNCisgICAgaWYgKGZvcm1JbXApIHsNCisgICAgICBJRldMX1dpZGdldCogcEZvcm0gPSBmb3JtSW1wLT5HZXRJbnRlcmZhY2UoKTsNCisgICAgICBhZGFwdGVyV2lkZ2V0TWdyLT5SdW5Mb29wKHBGb3JtKTsNCisgICAgfQ0KKyAgfQ0KKyNlbGlmKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0XykNCisgIEZYX0JPT0wgYklkbGUgPSBUUlVFOw0KKyAgaW50MzJfdCBpSWRsZUNvdW50ID0gMDsNCisgIENGV0xfTm90ZUxvb3AqIHBUb3BMb29wID0gTlVMTDsNCisgIGZvciAoOzspIHsNCisgICAgcFRvcExvb3AgPSBHZXRUb3BMb29wKCk7DQorICAgIGlmICghcFRvcExvb3AgfHwgIXBUb3BMb29wLT5Db250aW51ZU1vZGFsKCkpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoVW5xdWV1ZU1lc3NhZ2UocFRvcExvb3ApKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgd2hpbGUgKGJJZGxlICYmICEocFdpZGdldE1nci0+Q2hlY2tNZXNzYWdlX05hdGl2ZSgpKSkgew0KKyAgICAgIGlmIChGV0xfRVJSX0luZGVmaW5pdGUgPT0gcFRvcExvb3AtPklkbGUoaUlkbGVDb3VudCsrKSkgew0KKyAgICAgICAgYklkbGUgPSBGQUxTRTsNCisgICAgICB9DQorICAgIH0NCisgICAgZG8gew0KKyAgICAgIGlmIChGV0xfRVJSX0luZGVmaW5pdGUgPT0gcFdpZGdldE1nci0+RGlzcGF0Y2hNZXNzYWdlX05hdGl2ZSgpKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaWYgKHBXaWRnZXRNZ3ItPklzSWRsZU1lc3NhZ2VfTmF0aXZlKCkpIHsNCisgICAgICAgIGJJZGxlID0gVFJVRTsNCisgICAgICAgIGlJZGxlQ291bnQgPSAwOw0KKyAgICAgIH0NCisgICAgfSB3aGlsZSAocFdpZGdldE1nci0+Q2hlY2tNZXNzYWdlX05hdGl2ZSgpKTsNCisgIH0NCisjZWxpZihfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXykNCisgIENGV0xfTm90ZUxvb3AqIHBUb3BMb29wID0gTlVMTDsNCisgIGZvciAoOzspIHsNCisgICAgcFRvcExvb3AgPSBHZXRUb3BMb29wKCk7DQorICAgIGlmICghcFRvcExvb3AgfHwgIXBUb3BMb29wLT5Db250aW51ZU1vZGFsKCkpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoVW5xdWV1ZU1lc3NhZ2UocFRvcExvb3ApKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKHBXaWRnZXRNZ3ItPkNoZWNrTWVzc2FnZV9OYXRpdmUoKSkgew0KKyAgICAgIHBXaWRnZXRNZ3ItPkRpc3BhdGNoTWVzc2FnZV9OYXRpdmUoKTsNCisgICAgfQ0KKyAgfQ0KKyNlbmRpZg0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX1dpZGdldCogQ0ZXTF9Ob3RlRHJpdmVyOjpHZXRGb2N1cygpIHsNCisgIHJldHVybiBtX3BGb2N1czsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfTm90ZURyaXZlcjo6R2V0SG92ZXIoKSB7DQorICByZXR1cm4gbV9wSG92ZXI7DQorfQ0KK3ZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpTZXRIb3ZlcihJRldMX1dpZGdldCogcEhvdmVyKSB7DQorICBtX3BIb3ZlciA9IHBIb3ZlcjsNCit9DQordm9pZCBDRldMX05vdGVEcml2ZXI6OlNldEdyYWIoSUZXTF9XaWRnZXQqIHBHcmFiLCBGWF9CT09MIGJTZXQpIHsNCisgIG1fcEdyYWIgPSBiU2V0ID8gcEdyYWIgOiBOVUxMOw0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6Tm90aWZ5VGFyZ2V0SGlkZShJRldMX1dpZGdldCogcE5vdGVUYXJnZXQpIHsNCisgIGlmIChtX3BGb2N1cyA9PSBwTm90ZVRhcmdldCkgew0KKyAgICBtX3BGb2N1cyA9IE5VTEw7DQorICB9DQorICBpZiAobV9wSG92ZXIgPT0gcE5vdGVUYXJnZXQpIHsNCisgICAgbV9wSG92ZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEdyYWIgPT0gcE5vdGVUYXJnZXQpIHsNCisgICAgbV9wR3JhYiA9IE5VTEw7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpOb3RpZnlUYXJnZXREZXN0cm95KElGV0xfV2lkZ2V0KiBwTm90ZVRhcmdldCkgew0KKyAgaWYgKG1fcEZvY3VzID09IHBOb3RlVGFyZ2V0KSB7DQorICAgIG1fcEZvY3VzID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BIb3ZlciA9PSBwTm90ZVRhcmdldCkgew0KKyAgICBtX3BIb3ZlciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wR3JhYiA9PSBwTm90ZVRhcmdldCkgew0KKyAgICBtX3BHcmFiID0gTlVMTDsNCisgIH0NCisgIFVucmVnaXN0ZXJFdmVudFRhcmdldChwTm90ZVRhcmdldCk7DQorICBpbnQzMl90IGNvdW50ID0gbV9mb3Jtcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgbkluZGV4ID0gMDsgbkluZGV4IDwgY291bnQ7IG5JbmRleCsrKSB7DQorICAgIENGV0xfRm9ybUltcCogcEZvcm0gPSAoQ0ZXTF9Gb3JtSW1wKiltX2Zvcm1zW25JbmRleF07DQorICAgIGlmICghcEZvcm0pIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDRldMX1dpZGdldEltcCogcFN1YkZvY3VzID0gcEZvcm0tPkdldFN1YkZvY3VzKCk7DQorICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFN1YkZvY3VzKTsNCisgICAgaWYgKHBTdWJGb2N1cyAmJiBwU3ViRm9jdXMtPkdldEludGVyZmFjZSgpID09IHBOb3RlVGFyZ2V0KSB7DQorICAgICAgcEZvcm0tPlNldFN1YkZvY3VzKE5VTEwpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpOb3RpZnlGdWxsU2NyZWVuTW9kZShJRldMX1dpZGdldCogcE5vdGVUYXJnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZ1bGxTY3JlZW4pIHsNCisgIG1fYkZ1bGxTY3JlZW4gPSBiRnVsbFNjcmVlbjsNCit9DQorRldMX0VSUiBDRldMX05vdGVEcml2ZXI6OlJlZ2lzdGVyRm9ybShDRldMX1dpZGdldEltcCogcEZvcm0pIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEZvcm0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpZiAobV9mb3Jtcy5GaW5kKHBGb3JtKSA+PSAwKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBtX2Zvcm1zLkFkZChwRm9ybSk7DQorICBpZiAobV9mb3Jtcy5HZXRTaXplKCkgPT0gMSkgew0KKyAgICBDRldMX05vdGVMb29wKiBwTG9vcCA9IChDRldMX05vdGVMb29wKiltX25vdGVMb29wUXVldWUuR2V0QXQoMCk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocExvb3AsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAgIHBMb29wLT5TZXRNYWluRm9ybShwRm9ybSk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlRHJpdmVyOjpVblJlZ2lzdGVyRm9ybShDRldMX1dpZGdldEltcCogcEZvcm0pIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEZvcm0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpbnQzMl90IG5JbmRleCA9IG1fZm9ybXMuRmluZChwRm9ybSk7DQorICBpZiAobkluZGV4IDwgMCkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgbV9mb3Jtcy5SZW1vdmVBdChuSW5kZXgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6UXVldWVNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIHBNZXNzYWdlLT5SZXRhaW4oKTsNCisgIG1fbm90ZVF1ZXVlLkFkZChwTWVzc2FnZSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OlVucXVldWVNZXNzYWdlKENGV0xfTm90ZUxvb3AqIHBOb3RlTG9vcCkgew0KKyAgaWYgKG1fbm90ZVF1ZXVlLkdldFNpemUoKSA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSA9IChDRldMX01lc3NhZ2UqKW1fbm90ZVF1ZXVlWzBdOw0KKyAgbV9ub3RlUXVldWUuUmVtb3ZlQXQoMCk7DQorICBpZiAoIUlzVmFsaWRNZXNzYWdlKHBNZXNzYWdlKSkgew0KKyAgICBwTWVzc2FnZS0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIEZYX0JPT0wgYkhvb2tNZXNzYWdlID0gRkFMU0U7DQorICBpZiAobV9ob29rKSB7DQorICAgIGJIb29rTWVzc2FnZSA9ICgqbV9ob29rKShwTWVzc2FnZSwgbV9ob29rSW5mbyk7DQorICB9DQorICBpZiAoIWJIb29rTWVzc2FnZSAmJiAhcE5vdGVMb29wLT5QcmVQcm9jZXNzTWVzc2FnZShwTWVzc2FnZSkpIHsNCisgICAgUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgfQ0KKyAgcE1lc3NhZ2UtPlJlbGVhc2UoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitDRldMX05vdGVMb29wKiBDRldMX05vdGVEcml2ZXI6OkdldFRvcExvb3AoKSB7DQorICBpbnQzMl90IHNpemUgPSBtX25vdGVMb29wUXVldWUuR2V0U2l6ZSgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChzaXplID4gMCwgTlVMTCk7DQorICByZXR1cm4gKENGV0xfTm90ZUxvb3AqKW1fbm90ZUxvb3BRdWV1ZVtzaXplIC0gMV07DQorfQ0KK2ludDMyX3QgQ0ZXTF9Ob3RlRHJpdmVyOjpDb3VudExvb3AoKSB7DQorICByZXR1cm4gbV9ub3RlTG9vcFF1ZXVlLkdldFNpemUoKTsNCit9DQordm9pZCBDRldMX05vdGVEcml2ZXI6OlNldEhvb2soRldMTWVzc2FnZUhvb2tDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogaW5mbykgew0KKyAgbV9ob29rID0gY2FsbGJhY2s7DQorICBtX2hvb2tJbmZvID0gaW5mbzsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OlByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIENGV0xfV2lkZ2V0TWdyKiBwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtID0gcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBNZXNzYWdlLT5tX3BEc3RUYXJnZXQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRNZXNzYWdlRm9ybShwTWVzc2FnZS0+bV9wRHN0VGFyZ2V0KTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2VGb3JtLCBGQUxTRSk7DQorICBpZiAoRGlzcGF0Y2hNZXNzYWdlKHBNZXNzYWdlLCBwTWVzc2FnZUZvcm0pKSB7DQorICAgIGlmIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgICAgTW91c2VTZWNvbmRhcnkoKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRpc3BhdGNoTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSkgew0KKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICBzd2l0Y2ggKHBNZXNzYWdlLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9BY3RpdmF0ZTogew0KKyAgICAgIGJSZXQgPSBEb0FjdGl2YXRlKChDRldMX01zZ0FjdGl2YXRlKilwTWVzc2FnZSwgcE1lc3NhZ2VGb3JtKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0RlYWN0aXZhdGU6IHsNCisgICAgICBiUmV0ID0gRG9EZWFjdGl2YXRlKChDRldMX01zZ0RlYWN0aXZhdGUqKXBNZXNzYWdlLCBwTWVzc2FnZUZvcm0pOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6IHsNCisgICAgICBiUmV0ID0gRG9TZXRGb2N1cygoQ0ZXTF9Nc2dTZXRGb2N1cyopcE1lc3NhZ2UsIHBNZXNzYWdlRm9ybSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBiUmV0ID0gRG9LaWxsRm9jdXMoKENGV0xfTXNnS2lsbEZvY3VzKilwTWVzc2FnZSwgcE1lc3NhZ2VGb3JtKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgIGJSZXQgPSBEb0tleSgoQ0ZXTF9Nc2dLZXkqKXBNZXNzYWdlLCBwTWVzc2FnZUZvcm0pOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCisgICAgICBiUmV0ID0gRG9Nb3VzZSgoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2UsIHBNZXNzYWdlRm9ybSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZVdoZWVsOiB7DQorICAgICAgYlJldCA9IERvV2hlZWwoKENGV0xfTXNnTW91c2VXaGVlbCopcE1lc3NhZ2UsIHBNZXNzYWdlRm9ybSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TaXplOiB7DQorICAgICAgYlJldCA9IERvU2l6ZSgoQ0ZXTF9Nc2dTaXplKilwTWVzc2FnZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9DdXJzb3I6IHsNCisgICAgICBiUmV0ID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX1dpbmRvd01vdmU6IHsNCisgICAgICBiUmV0ID0gRG9XaW5kb3dNb3ZlKChDRldMX01zZ1dpbmRvd01vdmUqKXBNZXNzYWdlLCBwTWVzc2FnZUZvcm0pOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfRHJvcEZpbGVzOiB7DQorICAgICAgYlJldCA9IERvRHJhZ0ZpbGVzKChDRldMX01zZ0Ryb3BGaWxlcyopcE1lc3NhZ2UsIHBNZXNzYWdlRm9ybSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9UYXNrQ2xpY2tlZDogew0KKyAgICAgIGJSZXQgPSBUUlVFOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfQ2xvc2U6IHsNCisgICAgICBiUmV0ID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7DQorICAgICAgYlJldCA9IFRSVUU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChiUmV0KSB7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBNZXNzYWdlLT5tX3BEc3RUYXJnZXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBpZiAocERlbGVnYXRlKSB7DQorICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpEb0FjdGl2YXRlKENGV0xfTXNnQWN0aXZhdGUqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSkgew0KKyAgaWYgKG1fYkZ1bGxTY3JlZW4pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gcE1lc3NhZ2VGb3JtOw0KKyAgcmV0dXJuIChwTXNnLT5tX3BEc3RUYXJnZXQpLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZDsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvRGVhY3RpdmF0ZShDRldMX01zZ0RlYWN0aXZhdGUqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKSB7DQorICBpZiAobV9iRnVsbFNjcmVlbikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGlUcmFja0xvb3AgPSBtX25vdGVMb29wUXVldWUuR2V0U2l6ZSgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChpVHJhY2tMb29wID4gMCwgRkFMU0UpOw0KKyAgaWYgKGlUcmFja0xvb3AgPT0gMSkgew0KKyAgICBpZiAocE1lc3NhZ2VGb3JtLT5Jc0luc3RhbmNlKEZYX1dTVFJDKEwiRldMX0ZPUk1QUk9YWSIpKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAocE1zZy0+bV9wU3JjVGFyZ2V0ICYmDQorICAgICAgICBwTXNnLT5tX3BTcmNUYXJnZXQtPklzSW5zdGFuY2UoRlhfV1NUUkMoTCJGV0xfRk9STVBST1hZIikpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChwTXNnLT5tX3BTcmNUYXJnZXQgJiYgcE1zZy0+bV9wU3JjVGFyZ2V0LT5HZXRDbGFzc0lEKCkgPT0gMTExMTk4NDc1NSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIElGV0xfV2lkZ2V0KiBwRHN0ID0gcE1zZy0+bV9wRHN0VGFyZ2V0Ow0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRHN0LCBGQUxTRSk7DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyAgaWYgKHBEc3QgPT0gcE1lc3NhZ2VGb3JtICYmIHBEc3QtPklzSW5zdGFuY2UoTCJGV0xfRk9STVBST1hZIikpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorI2VuZGlmDQorICByZXR1cm4gcERzdCAhPSBwTWVzc2FnZUZvcm0gJiYNCisgICAgICAgICAhcERzdC0+SXNJbnN0YW5jZShGWF9XU1RSQyhMIkZXTF9GT1JNUFJPWFkiKSkgJiYNCisgICAgICAgICAhcE1lc3NhZ2VGb3JtLT5Jc0luc3RhbmNlKEZYX1dTVFJDKEwiRldMX0ZPUk1QUk9YWSIpKTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvU2V0Rm9jdXMoQ0ZXTF9Nc2dTZXRGb2N1cyogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKSB7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgaWYgKHBXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgbV9wRm9jdXMgPSAoSUZXTF9XaWRnZXQqKXBNc2ctPm1fcERzdFRhcmdldDsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9IGVsc2Ugew0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCA9IHBNc2ctPm1fcERzdFRhcmdldDsNCisgICAgQ0ZXTF9Gb3JtSW1wKiBwRm9ybSA9DQorICAgICAgICBwV2lkZ2V0ID8gKENGV0xfRm9ybUltcCopKChJRldMX1RhcmdldERhdGEqKXBXaWRnZXQpLT5HZXREYXRhKCkgOiBOVUxMOw0KKyAgICBpZiAocEZvcm0pIHsNCisgICAgICBDRldMX1dpZGdldEltcCogcFN1YkZvY3VzID0gcEZvcm0tPkdldFN1YkZvY3VzKCk7DQorICAgICAgaWYgKHBTdWJGb2N1cyAmJiAoKHBTdWJGb2N1cy0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkpIHsNCisgICAgICAgIHBNc2ctPm1fcERzdFRhcmdldCA9IHBTdWJGb2N1cy0+R2V0SW50ZXJmYWNlKCk7DQorICAgICAgICBpZiAobV9wRm9jdXMgIT0gcE1zZy0+bV9wRHN0VGFyZ2V0KSB7DQorICAgICAgICAgIG1fcEZvY3VzID0gcE1zZy0+bV9wRHN0VGFyZ2V0Ow0KKyAgICAgICAgICByZXR1cm4gVFJVRTsNCiAgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotY2xhc3MgQ0ZXTF9Db3JlVG9vcFRpcERQIDogcHVibGljIElGV0xfVG9vbFRpcERQDQotew0KLXB1YmxpYzoNCi0gICAgRldMX0VSUgkJCUdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pOw0KLSAgICBpbnQzMl90CSAJR2V0SW5pdGlhbERlbGF5KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgaW50MzJfdAkgCUdldEF1dG9Qb3BEZWxheShJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIENGWF9ESUJpdG1hcCoJR2V0VG9vbFRpcEljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICBDRlhfU2l6ZUYJCUdldFRvb2xUaXBJY29uU2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIENGWF9SZWN0RgkJR2V0QW5jaG9yKCk7DQotICAgIENGV0xfQ29yZVRvb3BUaXBEUCgpOw0KLQ0KLSAgICBDRlhfV2lkZVN0cmluZwltX3dzQ2FwdGlvbjsNCi0gICAgaW50MzJfdAkJbV9uSW5pdERlbGF5VGltZTsNCi0gICAgaW50MzJfdAkJbV9uQXV0b1BvcERlbGF5VGltZTsNCi0gICAgQ0ZYX1JlY3RGCQltX2ZBbmNob3I7DQotfTsNCi1DRldMX0NvcmVUb29wVGlwRFA6OkNGV0xfQ29yZVRvb3BUaXBEUCgpDQotew0KLSAgICBtX25Jbml0RGVsYXlUaW1lID0gNTAwOw0KLSAgICBtX25BdXRvUG9wRGVsYXlUaW1lID0gNTAwMDA7DQotICAgIG1fZkFuY2hvci5TZXQoIDAuMCwgMC4wLCAwLjAsIDAuMCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Db3JlVG9vcFRpcERQOjpHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKQ0KLXsNCi0gICAgd3NDYXB0aW9uID0gbV93c0NhcHRpb247DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotaW50MzJfdCBDRldMX0NvcmVUb29wVGlwRFA6OkdldEluaXRpYWxEZWxheShJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBtX25Jbml0RGVsYXlUaW1lOw0KLX0NCi1pbnQzMl90IENGV0xfQ29yZVRvb3BUaXBEUDo6R2V0QXV0b1BvcERlbGF5KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIG1fbkF1dG9Qb3BEZWxheVRpbWU7DQotfQ0KLUNGWF9ESUJpdG1hcCogQ0ZXTF9Db3JlVG9vcFRpcERQOjpHZXRUb29sVGlwSWNvbihJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1DRlhfU2l6ZUYgQ0ZXTF9Db3JlVG9vcFRpcERQOjpHZXRUb29sVGlwSWNvblNpemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBDRlhfU2l6ZUYgc3o7DQotICAgIHN6LlNldCgwLCAwKTsNCi0gICAgcmV0dXJuIHN6Ow0KLX0NCi1DRlhfUmVjdEYgQ0ZXTF9Db3JlVG9vcFRpcERQOjpHZXRBbmNob3IoKQ0KLXsNCi0gICAgcmV0dXJuIG1fZkFuY2hvcjsNCi19DQotQ0ZXTF9FdmVudFRhcmdldDo6fkNGV0xfRXZlbnRUYXJnZXQoKQ0KLXsNCi0gICAgbV9ldmVudFNvdXJjZXMuUmVtb3ZlQWxsKCk7DQotfQ0KLWludDMyX3QgQ0ZXTF9FdmVudFRhcmdldDo6U2V0RXZlbnRTb3VyY2UoSUZXTF9XaWRnZXQgKnBTb3VyY2UsIEZYX0RXT1JEIGR3RmlsdGVyKQ0KLXsNCi0gICAgaWYgKHBTb3VyY2UpIHsNCi0gICAgICAgIG1fZXZlbnRTb3VyY2VzLlNldEF0KHBTb3VyY2UsIGR3RmlsdGVyKTsNCi0gICAgICAgIHJldHVybiBtX2V2ZW50U291cmNlcy5HZXRDb3VudCgpOw0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpEb0tpbGxGb2N1cyhDRldMX01zZ0tpbGxGb2N1cyogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIHBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgIGlmIChwV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIGlmIChtX3BGb2N1cyA9PSBwTXNnLT5tX3BEc3RUYXJnZXQpIHsNCisgICAgICBtX3BGb2N1cyA9IE5VTEw7DQogICAgIH0NCi0gICAgcmV0dXJuIDE7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfSBlbHNlIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBwTXNnLT5tX3BEc3RUYXJnZXQ7DQorICAgIENGV0xfRm9ybUltcCogcEZvcm0gPQ0KKyAgICAgICAgcFdpZGdldCA/IChDRldMX0Zvcm1JbXAqKSgoSUZXTF9UYXJnZXREYXRhKilwV2lkZ2V0KS0+R2V0RGF0YSgpIDogTlVMTDsNCisgICAgaWYgKHBGb3JtKSB7DQorICAgICAgQ0ZXTF9XaWRnZXRJbXAqIHBTdWJGb2N1cyA9IHBGb3JtLT5HZXRTdWJGb2N1cygpOw0KKyAgICAgIGlmIChwU3ViRm9jdXMgJiYgKHBTdWJGb2N1cy0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkpIHsNCisgICAgICAgIHBNc2ctPm1fcERzdFRhcmdldCA9IHBTdWJGb2N1cy0+R2V0SW50ZXJmYWNlKCk7DQorICAgICAgICBpZiAobV9wRm9jdXMgPT0gcE1zZy0+bV9wRHN0VGFyZ2V0KSB7DQorICAgICAgICAgIG1fcEZvY3VzID0gTlVMTDsNCisgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9FdmVudFRhcmdldDo6UHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCi17DQotICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcExpc3RlbmVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRGVsZWdhdGUsIEZBTFNFKTsNCi0gICAgaWYgKG1fZXZlbnRTb3VyY2VzLkdldENvdW50KCkgPT0gMCkgew0KLSAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOw0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpEb0tleShDRldMX01zZ0tleSogcE1zZywgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSkgew0KKyNpZiAoX0ZYX09TXyAhPSBfRlhfTUFDT1NYXykNCisgIGlmIChwTXNnLT5tX2R3Q21kID09IEZXTF9NU0dLRVlDTURfS2V5RG93biAmJg0KKyAgICAgIHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1RhYikgew0KKyAgICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICBJRldMX1dpZGdldCogcEZvcm0gPSBHZXRNZXNzYWdlRm9ybShwTXNnLT5tX3BEc3RUYXJnZXQpOw0KKyAgICBJRldMX1dpZGdldCogcEZvY3VzID0gbV9wRm9jdXM7DQorICAgIGlmIChtX3BGb2N1cykgew0KKyAgICAgIGlmIChwV2lkZ2V0TWdyLT5HZXRXaWRnZXQobV9wRm9jdXMsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKSAhPQ0KKyAgICAgICAgICBwRm9ybSkgew0KKyAgICAgICAgcEZvY3VzID0gTlVMTDsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOw0KKyAgICBJRldMX1dpZGdldCogcE5leHRUYWJTdG9wID0gcFdpZGdldE1nci0+bmV4dFRhYihwRm9ybSwgcEZvY3VzLCBiRmluZCk7DQorICAgIGlmICghcE5leHRUYWJTdG9wKSB7DQorICAgICAgYkZpbmQgPSBGQUxTRTsNCisgICAgICBwTmV4dFRhYlN0b3AgPSBwV2lkZ2V0TWdyLT5uZXh0VGFiKHBGb3JtLCBOVUxMLCBiRmluZCk7DQorICAgIH0NCisgICAgaWYgKHBOZXh0VGFiU3RvcCA9PSBwRm9jdXMpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAocE5leHRUYWJTdG9wKSB7DQorICAgICAgU2V0Rm9jdXMocE5leHRUYWJTdG9wKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisjZW5kaWYNCisgIGlmICghbV9wRm9jdXMpIHsNCisgICAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duICYmDQorICAgICAgICBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9SZXR1cm4pIHsNCisgICAgICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgICAgIElGV0xfV2lkZ2V0KiBkZWZCdXR0b24gPSBwV2lkZ2V0TWdyLT5HZXREZWZhdWx0QnV0dG9uKHBNZXNzYWdlRm9ybSk7DQorICAgICAgaWYgKGRlZkJ1dHRvbikgew0KKyAgICAgICAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gZGVmQnV0dG9uOw0KICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9ldmVudFNvdXJjZXMuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocG9zKSB7DQotICAgICAgICBJRldMX1dpZGdldCAqcFNvdXJjZSA9IE5VTEw7DQotICAgICAgICBGWF9EV09SRCBkd0ZpbHRlciA9IDA7DQotICAgICAgICBtX2V2ZW50U291cmNlcy5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKXBTb3VyY2UsIGR3RmlsdGVyKTsNCi0gICAgICAgIGlmIChwU291cmNlID09IHBFdmVudC0+bV9wU3JjVGFyZ2V0IHx8IHBFdmVudC0+R2V0Q2xhc3NJRCgpID09IEZXTF9FVlRIQVNIX0lkbGUpIHsNCi0gICAgICAgICAgICBpZiAoSXNGaWx0ZXJFdmVudChwRXZlbnQsIGR3RmlsdGVyKSkgew0KLSAgICAgICAgICAgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gbV9wRm9jdXM7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRldMX0V2ZW50VGFyZ2V0OjpJc0ZpbHRlckV2ZW50KENGV0xfRXZlbnQgKnBFdmVudCwgRlhfRFdPUkQgZHdGaWx0ZXIpDQotew0KLSAgICBpZiAoZHdGaWx0ZXIgPT0gRldMX0VWRU5UX0FMTF9NQVNLKSB7DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvTW91c2UoQ0ZXTF9Nc2dNb3VzZSogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKSB7DQorICBpZiAocE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZSB8fA0KKyAgICAgIHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX01vdXNlSG92ZXIgfHwNCisgICAgICBwTXNnLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUVudGVyKSB7DQorICAgIHJldHVybiBwTXNnLT5tX3BEc3RUYXJnZXQgIT0gTlVMTDsNCisgIH0NCisgIGlmIChwTXNnLT5tX3BEc3RUYXJnZXQgIT0gcE1lc3NhZ2VGb3JtKSB7DQorICAgIHBNc2ctPm1fcERzdFRhcmdldC0+VHJhbnNmb3JtVG8ocE1lc3NhZ2VGb3JtLCBwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIH0NCisgIGlmICghRG9Nb3VzZUV4KHBNc2csIHBNZXNzYWdlRm9ybSkpIHsNCisgICAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gcE1lc3NhZ2VGb3JtOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpEb1doZWVsKENGV0xfTXNnTW91c2VXaGVlbCogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKSB7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0TWdyLCBGQUxTRSk7DQorICBJRldMX1dpZGdldCogcERzdCA9DQorICAgICAgcFdpZGdldE1nci0+R2V0V2lkZ2V0QXRQb2ludChwTWVzc2FnZUZvcm0sIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgaWYgKCFwRHN0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHdoaWxlIChwRHN0ICYmIHBEc3QtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0dyaWQpIHsNCisgICAgcERzdCA9IHBEc3QtPkdldFBhcmVudCgpOw0KKyAgfQ0KKyAgcE1lc3NhZ2VGb3JtLT5UcmFuc2Zvcm1UbyhwRHN0LCBwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIHBNc2ctPm1fcERzdFRhcmdldCA9IHBEc3Q7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvU2l6ZShDRldMX01zZ1NpemUqIHBNc2cpIHsNCisgIENGV0xfV2lkZ2V0TWdyKiBwV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXRNZ3IsIEZBTFNFKTsNCisgIHBXaWRnZXRNZ3ItPk5vdGlmeVNpemVDaGFuZ2VkKHBNc2ctPm1fcERzdFRhcmdldCwgKEZYX0ZMT0FUKXBNc2ctPm1faVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXBNc2ctPm1faUhlaWdodCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvV2luZG93TW92ZShDRldMX01zZ1dpbmRvd01vdmUqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKSB7DQorICByZXR1cm4gcE1zZy0+bV9wRHN0VGFyZ2V0ID09IHBNZXNzYWdlRm9ybTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvRHJhZ0ZpbGVzKENGV0xfTXNnRHJvcEZpbGVzKiBwTXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKSB7DQorICByZXR1cm4gcE1zZy0+bV9wRHN0VGFyZ2V0ID09IHBNZXNzYWdlRm9ybTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvTW91c2VFeChDRldMX01zZ01vdXNlKiBwTXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIHBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldE1nciwgRkFMU0UpOw0KKyAgSUZXTF9XaWRnZXQqIHBUYXJnZXQgPSBOVUxMOw0KKyAgaWYgKG1fcEdyYWIpIHsNCisgICAgeyBwVGFyZ2V0ID0gbV9wR3JhYjsgfQ0KKyAgfQ0KKyAgaWYgKCFwVGFyZ2V0KSB7DQorICAgIHBUYXJnZXQgPQ0KKyAgICAgICAgcFdpZGdldE1nci0+R2V0V2lkZ2V0QXRQb2ludChwTWVzc2FnZUZvcm0sIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICB3aGlsZSAocFRhcmdldCAmJiBwVGFyZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9HcmlkKSB7DQorICAgICAgcFRhcmdldCA9IHBUYXJnZXQtPkdldFBhcmVudCgpOw0KKyAgICB9DQorICB9DQorICBpZiAocFRhcmdldCkgew0KKyAgICBpZiAocE1lc3NhZ2VGb3JtICE9IHBUYXJnZXQpIHsNCisgICAgICBwTWVzc2FnZUZvcm0tPlRyYW5zZm9ybVRvKHBUYXJnZXQsIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICB9DQorICB9DQorICBpZiAoIXBUYXJnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gcFRhcmdldDsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6TW91c2VTZWNvbmRhcnkoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgSUZXTF9XaWRnZXQqIHBUYXJnZXQgPSBwTXNnLT5tX3BEc3RUYXJnZXQ7DQorICBpZiAocFRhcmdldCA9PSBtX3BIb3Zlcikgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9wSG92ZXIpIHsNCisgICAgQ0ZXTF9Nc2dNb3VzZSBtc0xlYXZlOw0KKyAgICBtc0xlYXZlLm1fcERzdFRhcmdldCA9IG1fcEhvdmVyOw0KKyAgICBtc0xlYXZlLm1fZnggPSBwTXNnLT5tX2Z4Ow0KKyAgICBtc0xlYXZlLm1fZnkgPSBwTXNnLT5tX2Z5Ow0KKyAgICBwVGFyZ2V0LT5UcmFuc2Zvcm1UbyhtX3BIb3ZlciwgbXNMZWF2ZS5tX2Z4LCBtc0xlYXZlLm1fZnkpOw0KKyAgICBtc0xlYXZlLm1fZHdGbGFncyA9IDA7DQorICAgIG1zTGVhdmUubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOw0KKyAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zTGVhdmUsIE5VTEwpOw0KKyAgfQ0KKyAgaWYgKHBUYXJnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0Zvcm0pIHsNCisgICAgbV9wSG92ZXIgPSBOVUxMOw0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BIb3ZlciA9IHBUYXJnZXQ7DQorICBDRldMX01zZ01vdXNlIG1zSG92ZXI7DQorICBtc0hvdmVyLm1fcERzdFRhcmdldCA9IHBUYXJnZXQ7DQorICBtc0hvdmVyLm1fZnggPSBwTXNnLT5tX2Z4Ow0KKyAgbXNIb3Zlci5tX2Z5ID0gcE1zZy0+bV9meTsNCisgIG1zSG92ZXIubV9kd0ZsYWdzID0gMDsNCisgIG1zSG92ZXIubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUhvdmVyOw0KKyAgRGlzcGF0Y2hNZXNzYWdlKCZtc0hvdmVyLCBOVUxMKTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OklzVmFsaWRNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIGlmIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpID09IEZXTF9NU0dIQVNIX1Bvc3QpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IG1fbm90ZUxvb3BRdWV1ZS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDRldMX05vdGVMb29wKiBwTm90ZUxvb3AgPSAoQ0ZXTF9Ob3RlTG9vcCopbV9ub3RlTG9vcFF1ZXVlW2ldOw0KKyAgICBDRldMX1dpZGdldEltcCogcEZvcm0gPSBwTm90ZUxvb3AtPkdldEZvcm0oKTsNCisgICAgaWYgKHBGb3JtICYmIChwRm9ybS0+R2V0SW50ZXJmYWNlKCkgPT0gcE1lc3NhZ2UtPm1fcERzdFRhcmdldCkpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgaUNvdW50ID0gbV9mb3Jtcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpQ291bnQ7IGorKykgew0KKyAgICBDRldMX0Zvcm1JbXAqIHBGb3JtID0gKENGV0xfRm9ybUltcCopbV9mb3Jtc1tqXTsNCisgICAgaWYgKHBGb3JtLT5HZXRJbnRlcmZhY2UoKSA9PSBwTWVzc2FnZS0+bV9wRHN0VGFyZ2V0KSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfTm90ZURyaXZlcjo6R2V0TWVzc2FnZUZvcm0oSUZXTF9XaWRnZXQqIHBEc3RUYXJnZXQpIHsNCisgIGludDMyX3QgaVRyYWNrTG9vcCA9IG1fbm90ZUxvb3BRdWV1ZS5HZXRTaXplKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGlUcmFja0xvb3AgPiAwLCBOVUxMKTsNCisgIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0gPSBOVUxMOw0KKyAgaWYgKGlUcmFja0xvb3AgPiAxKSB7DQorICAgIENGV0xfTm90ZUxvb3AqIHBOb290TG9vcCA9IChDRldMX05vdGVMb29wKiltX25vdGVMb29wUXVldWVbaVRyYWNrTG9vcCAtIDFdOw0KKyAgICBwTWVzc2FnZUZvcm0gPSBwTm9vdExvb3AtPkdldEZvcm0oKS0+R2V0SW50ZXJmYWNlKCk7DQorICB9IGVsc2Ugew0KKyAgICBwTWVzc2FnZUZvcm0gPSAobV9mb3Jtcy5GaW5kKHBEc3RUYXJnZXQpIDwgMCkgPyBOVUxMIDogcERzdFRhcmdldDsNCisgIH0NCisgIGlmICghcE1lc3NhZ2VGb3JtICYmIHBEc3RUYXJnZXQpIHsNCisgICAgQ0ZXTF9XaWRnZXRNZ3IqIHBXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0TWdyLCBOVUxMKTsNCisgICAgcE1lc3NhZ2VGb3JtID0NCisgICAgICAgIHBXaWRnZXRNZ3ItPkdldFdpZGdldChwRHN0VGFyZ2V0LCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQorICB9DQorICByZXR1cm4gcE1lc3NhZ2VGb3JtOw0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6Q2xlYXJJbnZhbGlkRXZlbnRUYXJnZXRzKEZYX0JPT0wgYlJlbW92ZUFsbCkgew0KKyAgRlhfUE9TSVRJT04gcG9zID0gbV9ldmVudFRhcmdldHMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICB2b2lkKiBrZXkgPSBOVUxMOw0KKyAgICBDRldMX0V2ZW50VGFyZ2V0KiBwRXZlbnRUYXJnZXQgPSBOVUxMOw0KKyAgICBtX2V2ZW50VGFyZ2V0cy5HZXROZXh0QXNzb2MocG9zLCBrZXksICh2b2lkKiYpcEV2ZW50VGFyZ2V0KTsNCisgICAgaWYgKHBFdmVudFRhcmdldCAmJiAoYlJlbW92ZUFsbCB8fCBwRXZlbnRUYXJnZXQtPklzSW52YWxpZCgpKSkgew0KKyAgICAgIG1fZXZlbnRUYXJnZXRzLlJlbW92ZUtleShrZXkpOw0KKyAgICAgIGRlbGV0ZSBwRXZlbnRUYXJnZXQ7DQorICAgIH0NCisgIH0NCit9DQorY2xhc3MgQ0ZXTF9Db3JlVG9vcFRpcERQIDogcHVibGljIElGV0xfVG9vbFRpcERQIHsNCisgcHVibGljOg0KKyAgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKTsNCisgIGludDMyX3QgR2V0SW5pdGlhbERlbGF5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIGludDMyX3QgR2V0QXV0b1BvcERlbGF5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIENGWF9ESUJpdG1hcCogR2V0VG9vbFRpcEljb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgQ0ZYX1NpemVGIEdldFRvb2xUaXBJY29uU2l6ZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICBDRlhfUmVjdEYgR2V0QW5jaG9yKCk7DQorICBDRldMX0NvcmVUb29wVGlwRFAoKTsNCisNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NDYXB0aW9uOw0KKyAgaW50MzJfdCBtX25Jbml0RGVsYXlUaW1lOw0KKyAgaW50MzJfdCBtX25BdXRvUG9wRGVsYXlUaW1lOw0KKyAgQ0ZYX1JlY3RGIG1fZkFuY2hvcjsNCit9Ow0KK0NGV0xfQ29yZVRvb3BUaXBEUDo6Q0ZXTF9Db3JlVG9vcFRpcERQKCkgew0KKyAgbV9uSW5pdERlbGF5VGltZSA9IDUwMDsNCisgIG1fbkF1dG9Qb3BEZWxheVRpbWUgPSA1MDAwMDsNCisgIG1fZkFuY2hvci5TZXQoMC4wLCAwLjAsIDAuMCwgMC4wKTsNCit9DQorRldMX0VSUiBDRldMX0NvcmVUb29wVGlwRFA6OkdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgew0KKyAgd3NDYXB0aW9uID0gbV93c0NhcHRpb247DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db3JlVG9vcFRpcERQOjpHZXRJbml0aWFsRGVsYXkoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX25Jbml0RGVsYXlUaW1lOw0KK30NCitpbnQzMl90IENGV0xfQ29yZVRvb3BUaXBEUDo6R2V0QXV0b1BvcERlbGF5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9uQXV0b1BvcERlbGF5VGltZTsNCit9DQorQ0ZYX0RJQml0bWFwKiBDRldMX0NvcmVUb29wVGlwRFA6OkdldFRvb2xUaXBJY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0ZYX1NpemVGIENGV0xfQ29yZVRvb3BUaXBEUDo6R2V0VG9vbFRpcEljb25TaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBDRlhfU2l6ZUYgc3o7DQorICBzei5TZXQoMCwgMCk7DQorICByZXR1cm4gc3o7DQorfQ0KK0NGWF9SZWN0RiBDRldMX0NvcmVUb29wVGlwRFA6OkdldEFuY2hvcigpIHsNCisgIHJldHVybiBtX2ZBbmNob3I7DQorfQ0KK0NGV0xfRXZlbnRUYXJnZXQ6On5DRldMX0V2ZW50VGFyZ2V0KCkgew0KKyAgbV9ldmVudFNvdXJjZXMuUmVtb3ZlQWxsKCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9FdmVudFRhcmdldDo6U2V0RXZlbnRTb3VyY2UoSUZXTF9XaWRnZXQqIHBTb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZpbHRlcikgew0KKyAgaWYgKHBTb3VyY2UpIHsNCisgICAgbV9ldmVudFNvdXJjZXMuU2V0QXQocFNvdXJjZSwgZHdGaWx0ZXIpOw0KKyAgICByZXR1cm4gbV9ldmVudFNvdXJjZXMuR2V0Q291bnQoKTsNCisgIH0NCisgIHJldHVybiAxOw0KK30NCitGWF9CT09MIENGV0xfRXZlbnRUYXJnZXQ6OlByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IG1fcExpc3RlbmVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocERlbGVnYXRlLCBGQUxTRSk7DQorICBpZiAobV9ldmVudFNvdXJjZXMuR2V0Q291bnQoKSA9PSAwKSB7DQorICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBGWF9QT1NJVElPTiBwb3MgPSBtX2V2ZW50U291cmNlcy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIElGV0xfV2lkZ2V0KiBwU291cmNlID0gTlVMTDsNCisgICAgRlhfRFdPUkQgZHdGaWx0ZXIgPSAwOw0KKyAgICBtX2V2ZW50U291cmNlcy5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKXBTb3VyY2UsIGR3RmlsdGVyKTsNCisgICAgaWYgKHBTb3VyY2UgPT0gcEV2ZW50LT5tX3BTcmNUYXJnZXQgfHwNCisgICAgICAgIHBFdmVudC0+R2V0Q2xhc3NJRCgpID09IEZXTF9FVlRIQVNIX0lkbGUpIHsNCisgICAgICBpZiAoSXNGaWx0ZXJFdmVudChwRXZlbnQsIGR3RmlsdGVyKSkgew0KKyAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOw0KICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KICAgICB9DQotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KLSAgICBzd2l0Y2ggKHBFdmVudC0+R2V0Q2xhc3NJRCgpKSB7DQotICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX01vdXNlOiB7DQotICAgICAgICAgICAgICAgIGJSZXQgPSBkd0ZpbHRlciAmIEZXTF9FVkVOVF9NT1VTRV9NQVNLOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX01vdXNlV2hlZWw6IHsNCi0gICAgICAgICAgICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX01PVVNFV0hFRUxfTUFTSzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9LZXk6IHsNCi0gICAgICAgICAgICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX0tFWV9NQVNLOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX1NldEZvY3VzOg0KLSAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9LaWxsRm9jdXM6IHsNCi0gICAgICAgICAgICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX0ZPQ1VTQ0hBTkdFRF9NQVNLOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0RyYXc6IHsNCi0gICAgICAgICAgICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX0RSQVdfTUFTSzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9DbG9zZTogew0KLSAgICAgICAgICAgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfQ0xPU0VfTUFTSzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9TaXplQ2hhbmdlZDogew0KLSAgICAgICAgICAgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfU0laRUNIQU5HRURfTUFTSzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9JZGxlOiB7DQotICAgICAgICAgICAgICAgIGJSZXQgPSBkd0ZpbHRlciAmIEZXTF9FVkVOVF9JRExFX01BU0s7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX0NPTlRST0xfTUFTSzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGV0xfRXZlbnRUYXJnZXQ6OklzRmlsdGVyRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50LCBGWF9EV09SRCBkd0ZpbHRlcikgew0KKyAgaWYgKGR3RmlsdGVyID09IEZXTF9FVkVOVF9BTExfTUFTSykgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgc3dpdGNoIChwRXZlbnQtPkdldENsYXNzSUQoKSkgew0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX01vdXNlOiB7DQorICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX01PVVNFX01BU0s7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIGJSZXQ7DQorICAgIGNhc2UgRldMX0VWVEhBU0hfTW91c2VXaGVlbDogew0KKyAgICAgIGJSZXQgPSBkd0ZpbHRlciAmIEZXTF9FVkVOVF9NT1VTRVdIRUVMX01BU0s7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfRVZUSEFTSF9LZXk6IHsNCisgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfS0VZX01BU0s7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfRVZUSEFTSF9TZXRGb2N1czoNCisgICAgY2FzZSBGV0xfRVZUSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfRk9DVVNDSEFOR0VEX01BU0s7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfRVZUSEFTSF9EcmF3OiB7DQorICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX0RSQVdfTUFTSzsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX0Nsb3NlOiB7DQorICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX0NMT1NFX01BU0s7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfRVZUSEFTSF9TaXplQ2hhbmdlZDogew0KKyAgICAgIGJSZXQgPSBkd0ZpbHRlciAmIEZXTF9FVkVOVF9TSVpFQ0hBTkdFRF9NQVNLOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX0VWVEhBU0hfSWRsZTogew0KKyAgICAgIGJSZXQgPSBkd0ZpbHRlciAmIEZXTF9FVkVOVF9JRExFX01BU0s7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogew0KKyAgICAgIGJSZXQgPSBkd0ZpbHRlciAmIEZXTF9FVkVOVF9DT05UUk9MX01BU0s7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBiUmV0Ow0KIH0NCiANCiBDRldMX1Rvb2xUaXBDb250YWluZXIqIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6c19wSW5zdGFuY2UgPSBOVUxMOw0KIA0KIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Q0ZXTF9Ub29sVGlwQ29udGFpbmVyKCkNCi0gICAgOiBwQ3VyVGFyZ2V0KE5VTEwpDQotICAgICwgbV9wVG9vbFRpcEltcChOVUxMKQ0KLXsNCi0gICAgbV9Ub29sVGlwRHAgPSBGWF9ORVcgQ0ZXTF9Db3JlVG9vcFRpcERQOw0KLSAgICBtX1Rvb2xUaXBEcC0+bV9uSW5pdERlbGF5VGltZSA9IDA7DQotICAgIG1fVG9vbFRpcERwLT5tX25BdXRvUG9wRGVsYXlUaW1lID0gMjAwMDsNCisgICAgOiBwQ3VyVGFyZ2V0KE5VTEwpLCBtX3BUb29sVGlwSW1wKE5VTEwpIHsNCisgIG1fVG9vbFRpcERwID0gRlhfTkVXIENGV0xfQ29yZVRvb3BUaXBEUDsNCisgIG1fVG9vbFRpcERwLT5tX25Jbml0RGVsYXlUaW1lID0gMDsNCisgIG1fVG9vbFRpcERwLT5tX25BdXRvUG9wRGVsYXlUaW1lID0gMjAwMDsNCiB9DQotQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjp+Q0ZXTF9Ub29sVGlwQ29udGFpbmVyKCkNCi17DQotICAgIGlmIChtX3BUb29sVGlwSW1wKSB7DQotICAgICAgICBJRldMX1Rvb2xUaXAgKnBUb29sVGlwID0gKElGV0xfVG9vbFRpcCopbV9wVG9vbFRpcEltcC0+R2V0SW50ZXJmYWNlKCk7DQotICAgICAgICBwVG9vbFRpcC0+RmluYWxpemUoKTsNCi0gICAgICAgIHBUb29sVGlwLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BUb29sVGlwSW1wID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9Ub29sVGlwRHApIHsNCi0gICAgICAgIGRlbGV0ZSBtX1Rvb2xUaXBEcDsNCi0gICAgICAgIG1fVG9vbFRpcERwID0gTlVMTDsNCi0gICAgfQ0KK0NGV0xfVG9vbFRpcENvbnRhaW5lcjo6fkNGV0xfVG9vbFRpcENvbnRhaW5lcigpIHsNCisgIGlmIChtX3BUb29sVGlwSW1wKSB7DQorICAgIElGV0xfVG9vbFRpcCogcFRvb2xUaXAgPSAoSUZXTF9Ub29sVGlwKiltX3BUb29sVGlwSW1wLT5HZXRJbnRlcmZhY2UoKTsNCisgICAgcFRvb2xUaXAtPkZpbmFsaXplKCk7DQorICAgIHBUb29sVGlwLT5SZWxlYXNlKCk7DQorICAgIG1fcFRvb2xUaXBJbXAgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fVG9vbFRpcERwKSB7DQorICAgIGRlbGV0ZSBtX1Rvb2xUaXBEcDsNCisgICAgbV9Ub29sVGlwRHAgPSBOVUxMOw0KKyAgfQ0KIH0NCiAvLyBzdGF0aWMNCi1DRldMX1Rvb2xUaXBDb250YWluZXIqIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKQ0KLXsNCi0gICAgaWYgKCFzX3BJbnN0YW5jZSkgew0KLSAgICAgICAgc19wSW5zdGFuY2UgPSBGWF9ORVcgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOw0KLSAgICB9DQotICAgIHJldHVybiBzX3BJbnN0YW5jZTsNCitDRldMX1Rvb2xUaXBDb250YWluZXIqIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKSB7DQorICBpZiAoIXNfcEluc3RhbmNlKSB7DQorICAgIHNfcEluc3RhbmNlID0gRlhfTkVXIENGV0xfVG9vbFRpcENvbnRhaW5lcjsNCisgIH0NCisgIHJldHVybiBzX3BJbnN0YW5jZTsNCiB9DQogLy8gc3RhdGljDQotdm9pZCBDRldMX1Rvb2xUaXBDb250YWluZXI6OkRlbGV0ZUluc3RhbmNlKCkNCi17DQotICAgIGlmIChzX3BJbnN0YW5jZSkgew0KLSAgICAgICAgZGVsZXRlIHNfcEluc3RhbmNlOw0KLSAgICAgICAgc19wSW5zdGFuY2UgPSBOVUxMOw0KLSAgICB9DQordm9pZCBDRldMX1Rvb2xUaXBDb250YWluZXI6OkRlbGV0ZUluc3RhbmNlKCkgew0KKyAgaWYgKHNfcEluc3RhbmNlKSB7DQorICAgIGRlbGV0ZSBzX3BJbnN0YW5jZTsNCisgICAgc19wSW5zdGFuY2UgPSBOVUxMOw0KKyAgfQ0KIH0NCi1GWF9FUlIgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpBZGRUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCAqcFRhcmdldCkNCi17DQotICAgIGlmIChtX2FycldpZGdldC5GaW5kKCh2b2lkICopcFRhcmdldCkgPCAwKSB7DQotICAgICAgICBtX2FycldpZGdldC5BZGQoKHZvaWQgKilwVGFyZ2V0KTsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLX0NCi1GWF9FUlIgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpSZW1vdmVUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCAqcFRhcmdldCkNCi17DQotICAgIGludCBpbmRleCA9IG1fYXJyV2lkZ2V0LkZpbmQoKHZvaWQgKilwVGFyZ2V0KTsNCi0gICAgaWYgKGluZGV4ID49IDApIHsNCi0gICAgICAgIG1fYXJyV2lkZ2V0LlJlbW92ZUF0KGluZGV4KTsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLX0NCi1GWF9CT09MIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6SGFzVG9vbFRpcChJRldMX1dpZGdldCAqcFdlZGdldCkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9hcnJXaWRnZXQuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgSUZXTF9Ub29sVGlwVGFyZ2V0ICpwID0gKElGV0xfVG9vbFRpcFRhcmdldCAqKW1fYXJyV2lkZ2V0W2ldOw0KLSAgICAgICAgaWYgKHAtPkdldFdpZGdldCgpID09IHBXZWRnZXQpIHsNCi0gICAgICAgICAgICBwQ3VyVGFyZ2V0ID0gcDsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpQcm9jZXNzRW50ZXIoQ0ZXTF9FdnRNb3VzZSAqcEV2dCwgSUZXTF9XaWRnZXQgKnBPd25lcikNCi17DQotICAgIGlmIChIYXNUb29sVGlwKHBFdnQtPm1fcERzdFRhcmdldCkpIHsNCi0gICAgICAgIGlmIChOVUxMID09IG1fcFRvb2xUaXBJbXApIHsNCi0gICAgICAgICAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCi0gICAgICAgICAgICBwcm9wLm1fcERhdGFQcm92aWRlciA9IG1fVG9vbFRpcERwOw0KLSAgICAgICAgICAgIHByb3AubV9wT3duZXIgPSBwT3duZXI7DQotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0VG9vbHRpcDsNCi0gICAgICAgICAgICBydFRvb2x0aXAuU2V0KDE1MCwgMTUwLCAxMDAsIDUwKTsNCi0gICAgICAgICAgICBwcm9wLm1fcnRXaWRnZXQgPSBydFRvb2x0aXA7DQotICAgICAgICAgICAgbV9wVG9vbFRpcEltcCA9IEZYX05FVyBDRldMX1Rvb2xUaXBJbXAocHJvcCk7DQotICAgICAgICAgICAgSUZXTF9Ub29sVGlwICpwVG9vbFRpcCA9IElGV0xfVG9vbFRpcDo6Q3JlYXRlKCk7DQotICAgICAgICAgICAgbV9wVG9vbFRpcEltcC0+U2V0SW50ZXJmYWNlKHBUb29sVGlwKTsNCi0gICAgICAgICAgICAoKElGV0xfVGFyZ2V0RGF0YSopcFRvb2xUaXApLT5TZXREYXRhKG1fcFRvb2xUaXBJbXApOw0KLSAgICAgICAgICAgIG1fcFRvb2xUaXBJbXAtPkluaXRpYWxpemUoKTsNCi0gICAgICAgICAgICBtX3BUb29sVGlwSW1wLT5Nb2RpZnlTdHlsZXNFeCggRldMX1NUWUxFRVhUX1RUUF9NdWx0aWxpbmUsIDApOw0KLSAgICAgICAgICAgIG1fcFRvb2xUaXBJbXAtPlNldFN0YXRlcyggRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAocEN1clRhcmdldC0+SXNTaG93ZWQoKSkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCi0gICAgICAgICAgICBwQ3VyVGFyZ2V0LT5HZXRDYXB0aW9uKHdzQ2FwdGlvbik7DQotICAgICAgICAgICAgaWYgKCF3c0NhcHRpb24uSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIG1fVG9vbFRpcERwLT5tX3dzQ2FwdGlvbiA9IHdzQ2FwdGlvbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0Ow0KLSAgICAgICAgICAgIHJ0LlJlc2V0KCk7DQotICAgICAgICAgICAgQ0ZYX1NpemVGIHN6Ow0KLSAgICAgICAgICAgIHN6LlJlc2V0KCk7DQotICAgICAgICAgICAgcEN1clRhcmdldC0+R2V0VG9vbFRpcFNpemUoc3opOw0KLSAgICAgICAgICAgIGlmIChzei54ID4gMCAmJiBzei55ID4gMCkgew0KLSAgICAgICAgICAgICAgICBydC53aWR0aCA9IHN6Lng7DQotICAgICAgICAgICAgICAgIHJ0LmhlaWdodCA9IHN6Lnk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHI7DQotICAgICAgICAgICAgICAgIG1fcFRvb2xUaXBJbXAtPkdldFdpZGdldFJlY3QociwgVFJVRSk7DQotICAgICAgICAgICAgICAgIHJ0LndpZHRoID0gci53aWR0aDsNCi0gICAgICAgICAgICAgICAgcnQuaGVpZ2h0ID0gci5oZWlnaHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9Qb2ludEYgcHQ7DQotICAgICAgICAgICAgcHQuU2V0KHBFdnQtPm1fZngsIHBFdnQtPm1fZnkpOw0KLSAgICAgICAgICAgIGlmIChwQ3VyVGFyZ2V0LT5HZXRUb29sVGlwUG9zKHB0KSA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KLSAgICAgICAgICAgICAgICBydC5sZWZ0ID0gcHQueDsNCi0gICAgICAgICAgICAgICAgcnQudG9wID0gcHQueTsNCi0gICAgICAgICAgICAgICAgbV9wVG9vbFRpcEltcC0+TW9kaWZ5U3R5bGVzRXgoRldMX1NUWUxFRVhUX1RUUF9Ob0FuY2hvciwgMCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0QW5jaG9yOw0KLSAgICAgICAgICAgICAgICBwQ3VyVGFyZ2V0LT5HZXRXaWRnZXQoKS0+R2V0Q2xpZW50UmVjdChydEFuY2hvcik7DQotICAgICAgICAgICAgICAgIHBDdXJUYXJnZXQtPkdldFdpZGdldCgpLT5UcmFuc2Zvcm1UbyhOVUxMLCBydEFuY2hvci5sZWZ0LCBydEFuY2hvci50b3ApOw0KLSAgICAgICAgICAgICAgICBtX3BUb29sVGlwSW1wLT5TZXRBbmNob3IocnRBbmNob3IpOw0KLSAgICAgICAgICAgICAgICBtX3BUb29sVGlwSW1wLT5Nb2RpZnlTdHlsZXNFeCgwLCBGV0xfU1RZTEVFWFRfVFRQX05vQW5jaG9yKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9wVG9vbFRpcEltcC0+U2V0V2lkZ2V0UmVjdChydCk7DQotICAgICAgICAgICAgbV9wVG9vbFRpcEltcC0+VXBkYXRlKCk7DQotICAgICAgICAgICAgbV9wVG9vbFRpcEltcC0+U2hvdygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6UHJvY2Vzc0xlYXZlKENGV0xfRXZ0TW91c2UgKnBFdnQpDQotew0KLSAgICBpZiAoSGFzVG9vbFRpcChwRXZ0LT5tX3BEc3RUYXJnZXQpICYmIE5VTEwgIT0gbV9wVG9vbFRpcEltcCkgew0KLSAgICAgICAgbV9wVG9vbFRpcEltcC0+SGlkZSgpOw0KLSAgICAgICAgcEN1clRhcmdldCA9IE5VTEw7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUlGV0xfVG9vbFRpcFRhcmdldCogQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpHZXRDdXJyZW50VG9vbFRpcFRhcmdldCgpDQotew0KLSAgICByZXR1cm4gcEN1clRhcmdldDsNCi19DQotRlhfRVJSIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6U2V0VG9vbFRpcEluaXRpYWxEZWxheShpbnQzMl90IG5EZWxheVRpbWUpDQotew0KLSAgICBtX1Rvb2xUaXBEcC0+bV9uSW5pdERlbGF5VGltZSA9IG5EZWxheVRpbWU7DQorRlhfRVJSIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6QWRkVG9vbFRpcFRhcmdldChJRldMX1Rvb2xUaXBUYXJnZXQqIHBUYXJnZXQpIHsNCisgIGlmIChtX2FycldpZGdldC5GaW5kKCh2b2lkKilwVGFyZ2V0KSA8IDApIHsNCisgICAgbV9hcnJXaWRnZXQuQWRkKCh2b2lkKilwVGFyZ2V0KTsNCiAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCiB9DQotRlhfRVJSIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6U2V0VG9vbFRpcEF1dG9Qb3BEZWxheShpbnQzMl90IG5EZWxheVRpbWUpDQotew0KLSAgICBtX1Rvb2xUaXBEcC0+bV9uQXV0b1BvcERlbGF5VGltZSA9IG5EZWxheVRpbWU7DQorRlhfRVJSIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6UmVtb3ZlVG9vbFRpcFRhcmdldChJRldMX1Rvb2xUaXBUYXJnZXQqIHBUYXJnZXQpIHsNCisgIGludCBpbmRleCA9IG1fYXJyV2lkZ2V0LkZpbmQoKHZvaWQqKXBUYXJnZXQpOw0KKyAgaWYgKGluZGV4ID49IDApIHsNCisgICAgbV9hcnJXaWRnZXQuUmVtb3ZlQXQoaW5kZXgpOw0KICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KIH0NCi1GV0xfRVJSIEZXTF9BZGRUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCAqcFRhcmdldCkNCi17DQotICAgIHJldHVybglDRldMX1Rvb2xUaXBDb250YWluZXI6OmdldEluc3RhbmNlKCktPkFkZFRvb2xUaXBUYXJnZXQocFRhcmdldCk7DQotfQ0KLUZXTF9FUlIgRldMX1JlbW92ZVRvb2xUaXBUYXJnZXQoSUZXTF9Ub29sVGlwVGFyZ2V0ICpwVGFyZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKS0+UmVtb3ZlVG9vbFRpcFRhcmdldChwVGFyZ2V0KTsNCi19DQotRldMX0VSUglGV0xfU2V0VG9vbFRpcEluaXRpYWxEZWxheShpbnQzMl90IG5EZWxheVRpbWUpDQotew0KLSAgICByZXR1cm4gQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5TZXRUb29sVGlwSW5pdGlhbERlbGF5KG5EZWxheVRpbWUpOw0KLX0NCi1GV0xfRVJSCUZXTF9TZXRUb29sVGlwQXV0b1BvcERlbGF5KGludDMyX3QgbkRlbGF5VGltZSkNCi17DQotICAgIHJldHVybiBDRldMX1Rvb2xUaXBDb250YWluZXI6OmdldEluc3RhbmNlKCktPlNldFRvb2xUaXBBdXRvUG9wRGVsYXkobkRlbGF5VGltZSk7DQotfQ0KLUlGV0xfV2lkZ2V0KiBGV0xfR2V0Q3VycmVudFRocmVhZE1vZGFsV2lkZ2V0KElGV0xfTm90ZVRocmVhZCAqcE5vdGVUaHJlYWQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBOb3RlVGhyZWFkLCBOVUxMKTsNCi0gICAgQ0ZXTF9Ob3RlRHJpdmVyICpub3RlRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcE5vdGVUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChub3RlRHJpdmVyLCBOVUxMKTsNCi0gICAgaWYgKG5vdGVEcml2ZXItPkNvdW50TG9vcCgpID09IDEpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KK0ZYX0JPT0wgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpIYXNUb29sVGlwKElGV0xfV2lkZ2V0KiBwV2VkZ2V0KSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fYXJyV2lkZ2V0LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIElGV0xfVG9vbFRpcFRhcmdldCogcCA9IChJRldMX1Rvb2xUaXBUYXJnZXQqKW1fYXJyV2lkZ2V0W2ldOw0KKyAgICBpZiAocC0+R2V0V2lkZ2V0KCkgPT0gcFdlZGdldCkgew0KKyAgICAgIHBDdXJUYXJnZXQgPSBwOw0KKyAgICAgIHJldHVybiBUUlVFOw0KICAgICB9DQotICAgIENGV0xfTm90ZUxvb3AgKnRvcExvb3AgPSBub3RlRHJpdmVyLT5HZXRUb3BMb29wKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwodG9wTG9vcCwgTlVMTCk7DQotICAgIENGV0xfV2lkZ2V0SW1wICp3aWRnZXQgPSB0b3BMb29wLT5HZXRGb3JtKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwod2lkZ2V0LCBOVUxMKTsNCi0gICAgcmV0dXJuIHdpZGdldC0+R2V0SW50ZXJmYWNlKCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZXTF9FUlIgRldMX1NldEhvb2soSUZXTF9Ob3RlRHJpdmVyICpkcml2ZXIsIEZXTE1lc3NhZ2VIb29rQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIGluZm8pDQotew0KLSAgICBDRldMX05vdGVEcml2ZXIgKm5vdGVEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilkcml2ZXI7DQotICAgIG5vdGVEcml2ZXItPlNldEhvb2soY2FsbGJhY2ssIGluZm8pOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRlhfQk9PTCBDRldMX1Rvb2xUaXBDb250YWluZXI6OlByb2Nlc3NFbnRlcihDRldMX0V2dE1vdXNlKiBwRXZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPd25lcikgew0KKyAgaWYgKEhhc1Rvb2xUaXAocEV2dC0+bV9wRHN0VGFyZ2V0KSkgew0KKyAgICBpZiAoTlVMTCA9PSBtX3BUb29sVGlwSW1wKSB7DQorICAgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICAgICAgcHJvcC5tX3BEYXRhUHJvdmlkZXIgPSBtX1Rvb2xUaXBEcDsNCisgICAgICBwcm9wLm1fcE93bmVyID0gcE93bmVyOw0KKyAgICAgIENGWF9SZWN0RiBydFRvb2x0aXA7DQorICAgICAgcnRUb29sdGlwLlNldCgxNTAsIDE1MCwgMTAwLCA1MCk7DQorICAgICAgcHJvcC5tX3J0V2lkZ2V0ID0gcnRUb29sdGlwOw0KKyAgICAgIG1fcFRvb2xUaXBJbXAgPSBGWF9ORVcgQ0ZXTF9Ub29sVGlwSW1wKHByb3ApOw0KKyAgICAgIElGV0xfVG9vbFRpcCogcFRvb2xUaXAgPSBJRldMX1Rvb2xUaXA6OkNyZWF0ZSgpOw0KKyAgICAgIG1fcFRvb2xUaXBJbXAtPlNldEludGVyZmFjZShwVG9vbFRpcCk7DQorICAgICAgKChJRldMX1RhcmdldERhdGEqKXBUb29sVGlwKS0+U2V0RGF0YShtX3BUb29sVGlwSW1wKTsNCisgICAgICBtX3BUb29sVGlwSW1wLT5Jbml0aWFsaXplKCk7DQorICAgICAgbV9wVG9vbFRpcEltcC0+TW9kaWZ5U3R5bGVzRXgoRldMX1NUWUxFRVhUX1RUUF9NdWx0aWxpbmUsIDApOw0KKyAgICAgIG1fcFRvb2xUaXBJbXAtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgICAgfQ0KKyAgICBpZiAocEN1clRhcmdldC0+SXNTaG93ZWQoKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCisgICAgICBwQ3VyVGFyZ2V0LT5HZXRDYXB0aW9uKHdzQ2FwdGlvbik7DQorICAgICAgaWYgKCF3c0NhcHRpb24uSXNFbXB0eSgpKSB7DQorICAgICAgICBtX1Rvb2xUaXBEcC0+bV93c0NhcHRpb24gPSB3c0NhcHRpb247DQorICAgICAgfQ0KKyAgICAgIENGWF9SZWN0RiBydDsNCisgICAgICBydC5SZXNldCgpOw0KKyAgICAgIENGWF9TaXplRiBzejsNCisgICAgICBzei5SZXNldCgpOw0KKyAgICAgIHBDdXJUYXJnZXQtPkdldFRvb2xUaXBTaXplKHN6KTsNCisgICAgICBpZiAoc3oueCA+IDAgJiYgc3oueSA+IDApIHsNCisgICAgICAgIHJ0LndpZHRoID0gc3oueDsNCisgICAgICAgIHJ0LmhlaWdodCA9IHN6Lnk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9SZWN0RiByOw0KKyAgICAgICAgbV9wVG9vbFRpcEltcC0+R2V0V2lkZ2V0UmVjdChyLCBUUlVFKTsNCisgICAgICAgIHJ0LndpZHRoID0gci53aWR0aDsNCisgICAgICAgIHJ0LmhlaWdodCA9IHIuaGVpZ2h0Ow0KKyAgICAgIH0NCisgICAgICBDRlhfUG9pbnRGIHB0Ow0KKyAgICAgIHB0LlNldChwRXZ0LT5tX2Z4LCBwRXZ0LT5tX2Z5KTsNCisgICAgICBpZiAocEN1clRhcmdldC0+R2V0VG9vbFRpcFBvcyhwdCkgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgICAgIHJ0LmxlZnQgPSBwdC54Ow0KKyAgICAgICAgcnQudG9wID0gcHQueTsNCisgICAgICAgIG1fcFRvb2xUaXBJbXAtPk1vZGlmeVN0eWxlc0V4KEZXTF9TVFlMRUVYVF9UVFBfTm9BbmNob3IsIDApOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRBbmNob3I7DQorICAgICAgICBwQ3VyVGFyZ2V0LT5HZXRXaWRnZXQoKS0+R2V0Q2xpZW50UmVjdChydEFuY2hvcik7DQorICAgICAgICBwQ3VyVGFyZ2V0LT5HZXRXaWRnZXQoKS0+VHJhbnNmb3JtVG8oTlVMTCwgcnRBbmNob3IubGVmdCwgcnRBbmNob3IudG9wKTsNCisgICAgICAgIG1fcFRvb2xUaXBJbXAtPlNldEFuY2hvcihydEFuY2hvcik7DQorICAgICAgICBtX3BUb29sVGlwSW1wLT5Nb2RpZnlTdHlsZXNFeCgwLCBGV0xfU1RZTEVFWFRfVFRQX05vQW5jaG9yKTsNCisgICAgICB9DQorICAgICAgbV9wVG9vbFRpcEltcC0+U2V0V2lkZ2V0UmVjdChydCk7DQorICAgICAgbV9wVG9vbFRpcEltcC0+VXBkYXRlKCk7DQorICAgICAgbV9wVG9vbFRpcEltcC0+U2hvdygpOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6UHJvY2Vzc0xlYXZlKENGV0xfRXZ0TW91c2UqIHBFdnQpIHsNCisgIGlmIChIYXNUb29sVGlwKHBFdnQtPm1fcERzdFRhcmdldCkgJiYgTlVMTCAhPSBtX3BUb29sVGlwSW1wKSB7DQorICAgIG1fcFRvb2xUaXBJbXAtPkhpZGUoKTsNCisgICAgcEN1clRhcmdldCA9IE5VTEw7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitJRldMX1Rvb2xUaXBUYXJnZXQqIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6R2V0Q3VycmVudFRvb2xUaXBUYXJnZXQoKSB7DQorICByZXR1cm4gcEN1clRhcmdldDsNCit9DQorRlhfRVJSIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6U2V0VG9vbFRpcEluaXRpYWxEZWxheShpbnQzMl90IG5EZWxheVRpbWUpIHsNCisgIG1fVG9vbFRpcERwLT5tX25Jbml0RGVsYXlUaW1lID0gbkRlbGF5VGltZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6U2V0VG9vbFRpcEF1dG9Qb3BEZWxheShpbnQzMl90IG5EZWxheVRpbWUpIHsNCisgIG1fVG9vbFRpcERwLT5tX25BdXRvUG9wRGVsYXlUaW1lID0gbkRlbGF5VGltZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBGV0xfQWRkVG9vbFRpcFRhcmdldChJRldMX1Rvb2xUaXBUYXJnZXQqIHBUYXJnZXQpIHsNCisgIHJldHVybiBDRldMX1Rvb2xUaXBDb250YWluZXI6OmdldEluc3RhbmNlKCktPkFkZFRvb2xUaXBUYXJnZXQocFRhcmdldCk7DQorfQ0KK0ZXTF9FUlIgRldMX1JlbW92ZVRvb2xUaXBUYXJnZXQoSUZXTF9Ub29sVGlwVGFyZ2V0KiBwVGFyZ2V0KSB7DQorICByZXR1cm4gQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5SZW1vdmVUb29sVGlwVGFyZ2V0KHBUYXJnZXQpOw0KK30NCitGV0xfRVJSIEZXTF9TZXRUb29sVGlwSW5pdGlhbERlbGF5KGludDMyX3QgbkRlbGF5VGltZSkgew0KKyAgcmV0dXJuIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKS0+U2V0VG9vbFRpcEluaXRpYWxEZWxheSgNCisgICAgICBuRGVsYXlUaW1lKTsNCit9DQorRldMX0VSUiBGV0xfU2V0VG9vbFRpcEF1dG9Qb3BEZWxheShpbnQzMl90IG5EZWxheVRpbWUpIHsNCisgIHJldHVybiBDRldMX1Rvb2xUaXBDb250YWluZXI6OmdldEluc3RhbmNlKCktPlNldFRvb2xUaXBBdXRvUG9wRGVsYXkoDQorICAgICAgbkRlbGF5VGltZSk7DQorfQ0KK0lGV0xfV2lkZ2V0KiBGV0xfR2V0Q3VycmVudFRocmVhZE1vZGFsV2lkZ2V0KElGV0xfTm90ZVRocmVhZCogcE5vdGVUaHJlYWQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE5vdGVUaHJlYWQsIE5VTEwpOw0KKyAgQ0ZXTF9Ob3RlRHJpdmVyKiBub3RlRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcE5vdGVUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobm90ZURyaXZlciwgTlVMTCk7DQorICBpZiAobm90ZURyaXZlci0+Q291bnRMb29wKCkgPT0gMSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGV0xfTm90ZUxvb3AqIHRvcExvb3AgPSBub3RlRHJpdmVyLT5HZXRUb3BMb29wKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHRvcExvb3AsIE5VTEwpOw0KKyAgQ0ZXTF9XaWRnZXRJbXAqIHdpZGdldCA9IHRvcExvb3AtPkdldEZvcm0oKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwod2lkZ2V0LCBOVUxMKTsNCisgIHJldHVybiB3aWRnZXQtPkdldEludGVyZmFjZSgpOw0KK30NCitGV0xfRVJSIEZXTF9TZXRIb29rKElGV0xfTm90ZURyaXZlciogZHJpdmVyLA0KKyAgICAgICAgICAgICAgICAgICAgRldMTWVzc2FnZUhvb2tDYWxsYmFjayBjYWxsYmFjaywNCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIGluZm8pIHsNCisgIENGV0xfTm90ZURyaXZlciogbm90ZURyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKWRyaXZlcjsNCisgIG5vdGVEcml2ZXItPlNldEhvb2soY2FsbGJhY2ssIGluZm8pOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfcGFuZWxpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3BhbmVsaW1wLmNwcAppbmRleCBkZTY2YTMzLi41NGRhMDhkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfcGFuZWxpbXAuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9wYW5lbGltcC5jcHAKQEAgLTksMjAwICs5LDE2NCBAQAogI2luY2x1ZGUgImluY2x1ZGUvZndsX25vdGVpbXAuaCINCiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX3BhbmVsaW1wLmgiDQotSUZXTF9QYW5lbCogSUZXTF9QYW5lbDo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBuZXcgSUZXTF9QYW5lbDsNCitJRldMX1BhbmVsKiBJRldMX1BhbmVsOjpDcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IElGV0xfUGFuZWw7DQogfQ0KLUZXTF9FUlIJSUZXTF9QYW5lbDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyICkNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9QYW5lbEltcChwT3V0ZXIpOw0KLSAgICAoKENGV0xfUGFuZWxJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfUGFuZWxJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorRldMX0VSUiBJRldMX1BhbmVsOjpJbml0aWFsaXplKElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9QYW5lbEltcChwT3V0ZXIpOw0KKyAgKChDRldMX1BhbmVsSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9QYW5lbEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCiB9DQotRldMX0VSUglJRldMX1BhbmVsOjpJbml0aWFsaXplKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfUGFuZWxJbXAocHJvcGVydGllcywgcE91dGVyKTsNCi0gICAgKChDRldMX1BhbmVsSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KLSAgICByZXR1cm4gKChDRldMX1BhbmVsSW1wKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9QYW5lbDo6SW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9QYW5lbEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgKChDRldMX1BhbmVsSW1wKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9QYW5lbEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCiB9DQotSUZXTF9Db250ZW50KiBJRldMX1BhbmVsOjpHZXRDb250ZW50KCkNCi17DQotICAgIHJldHVybiAoKENGV0xfUGFuZWxJbXAqKW1fcERhdGEpLT5HZXRDb250ZW50KCk7DQorSUZXTF9Db250ZW50KiBJRldMX1BhbmVsOjpHZXRDb250ZW50KCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9QYW5lbEltcCopbV9wRGF0YSktPkdldENvbnRlbnQoKTsNCiB9DQotRldMX0VSUglJRldMX1BhbmVsOjpTZXRDb250ZW50KElGV0xfQ29udGVudCAqcENvbnRlbnQpDQotew0KLSAgICByZXR1cm4gKChDRldMX1BhbmVsSW1wKiltX3BEYXRhKS0+U2V0Q29udGVudChwQ29udGVudCk7DQorRldMX0VSUiBJRldMX1BhbmVsOjpTZXRDb250ZW50KElGV0xfQ29udGVudCogcENvbnRlbnQpIHsNCisgIHJldHVybiAoKENGV0xfUGFuZWxJbXAqKW1fcERhdGEpLT5TZXRDb250ZW50KHBDb250ZW50KTsNCiB9DQotSUZXTF9QYW5lbDo6SUZXTF9QYW5lbCgpDQotew0KK0lGV0xfUGFuZWw6OklGV0xfUGFuZWwoKSB7DQorICBtX3BEYXRhID0gTlVMTDsNCit9DQorSUZXTF9QYW5lbDo6fklGV0xfUGFuZWwoKSB7DQorICBpZiAobV9wRGF0YSkgew0KKyAgICBkZWxldGUgKENGV0xfUGFuZWxJbXAqKW1fcERhdGE7DQogICAgIG1fcERhdGEgPSBOVUxMOw0KKyAgfQ0KIH0NCi1JRldMX1BhbmVsOjp+SUZXTF9QYW5lbCgpDQotew0KLSAgICBpZiAobV9wRGF0YSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX1BhbmVsSW1wKiltX3BEYXRhOw0KLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7DQotICAgIH0NCitDRldMX1BhbmVsSW1wOjpDRldMX1BhbmVsSW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKSwgbV9wQ29udGVudChOVUxMKSB7fQ0KK0NGV0xfUGFuZWxJbXA6OkNGV0xfUGFuZWxJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpLCBtX3BDb250ZW50KE5VTEwpIHt9DQorQ0ZXTF9QYW5lbEltcDo6fkNGV0xfUGFuZWxJbXAoKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9QYW5lbEltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICB3c0NsYXNzID0gRldMX0NMQVNTX1BhbmVsOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRldMX1BhbmVsSW1wOjpDRldMX1BhbmVsSW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIgKQ0KLSAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlcikNCi0gICAgLCBtX3BDb250ZW50KE5VTEwpDQotew0KK0ZYX0RXT1JEIENGV0xfUGFuZWxJbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0NMQVNTSEFTSF9QYW5lbDsNCiB9DQotQ0ZXTF9QYW5lbEltcDo6Q0ZXTF9QYW5lbEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLSAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCi0gICAgLCBtX3BDb250ZW50KE5VTEwpDQotew0KLX0NCi1DRldMX1BhbmVsSW1wOjp+Q0ZXTF9QYW5lbEltcCgpDQotew0KLX0NCi1GV0xfRVJSIENGV0xfUGFuZWxJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCi17DQotICAgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfUGFuZWw7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfRFdPUkQgQ0ZXTF9QYW5lbEltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gRldMX0NMQVNTSEFTSF9QYW5lbDsNCi19DQotRldMX0VSUiBDRldMX1BhbmVsSW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgKQ0KLXsNCi0gICAgaWYgKGJBdXRvU2l6ZSkgew0KLSAgICAgICAgaWYgKG1fcENvbnRlbnQpIHsNCi0gICAgICAgICAgICBtX3BDb250ZW50LT5HZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfUGFuZWxJbXA6OlVwZGF0ZSgpDQotew0KK0ZXTF9FUlIgQ0ZXTF9QYW5lbEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBpZiAoYkF1dG9TaXplKSB7DQogICAgIGlmIChtX3BDb250ZW50KSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRDbGllbnQ7DQotICAgICAgICBHZXRDbGllbnRSZWN0KHJ0Q2xpZW50KTsNCi0gICAgICAgIEZXTF9HUklEVU5JVCBlV2lkdGggPSBGV0xfR1JJRFVOSVRfRml4ZWQsIGVIZWlnaHQgPSBGV0xfR1JJRFVOSVRfRml4ZWQ7DQotICAgICAgICBJRldMX1dpZGdldE1nciAqcFdpZGdldE1nciA9IEZXTF9HZXRXaWRnZXRNZ3IoKTsNCi0gICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldE1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgICAgIElGV0xfV2lkZ2V0ICpwUGFyZW50ID0gcFdpZGdldE1nci0+R2V0V2lkZ2V0KChJRldMX1dpZGdldCopdGhpcywgRldMX1dHVFJFTEFUSU9OX1BhcmVudCk7DQotICAgICAgICBpZiAocFBhcmVudCAmJiBwUGFyZW50LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9HcmlkKSB7DQotICAgICAgICAgICAgSUZXTF9HcmlkKiBwR3JpZCA9IChJRldMX0dyaWQqKXBQYXJlbnQ7DQotICAgICAgICAgICAgcEdyaWQtPkdldFdpZGdldFNpemUoKElGV0xfV2lkZ2V0Kil0aGlzLCBGV0xfR1JJRFNJWkVfV2lkdGgsIGVXaWR0aCk7DQotICAgICAgICAgICAgcEdyaWQtPkdldFdpZGdldFNpemUoKElGV0xfV2lkZ2V0Kil0aGlzLCBGV0xfR1JJRFNJWkVfSGVpZ2h0LCBlSGVpZ2h0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChlV2lkdGggIT0gRldMX0dSSURVTklUX0F1dG8gfHwgZUhlaWdodCAhPSBGV0xfR1JJRFVOSVRfQXV0bykgew0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wQ29udGVudC0+U2V0V2lkZ2V0UmVjdChydENsaWVudCk7DQotICAgICAgICBtX3BDb250ZW50LT5VcGRhdGUoKTsNCisgICAgICBtX3BDb250ZW50LT5HZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KICAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1JRldMX0NvbnRlbnQqIENGV0xfUGFuZWxJbXA6OkdldENvbnRlbnQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcENvbnRlbnQ7DQorRldMX0VSUiBDRldMX1BhbmVsSW1wOjpVcGRhdGUoKSB7DQorICBpZiAobV9wQ29udGVudCkgew0KKyAgICBDRlhfUmVjdEYgcnRDbGllbnQ7DQorICAgIEdldENsaWVudFJlY3QocnRDbGllbnQpOw0KKyAgICBGV0xfR1JJRFVOSVQgZVdpZHRoID0gRldMX0dSSURVTklUX0ZpeGVkLCBlSGVpZ2h0ID0gRldMX0dSSURVTklUX0ZpeGVkOw0KKyAgICBJRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IEZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0TWdyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBJRldMX1dpZGdldCogcFBhcmVudCA9DQorICAgICAgICBwV2lkZ2V0TWdyLT5HZXRXaWRnZXQoKElGV0xfV2lkZ2V0Kil0aGlzLCBGV0xfV0dUUkVMQVRJT05fUGFyZW50KTsNCisgICAgaWYgKHBQYXJlbnQgJiYgcFBhcmVudC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfR3JpZCkgew0KKyAgICAgIElGV0xfR3JpZCogcEdyaWQgPSAoSUZXTF9HcmlkKilwUGFyZW50Ow0KKyAgICAgIHBHcmlkLT5HZXRXaWRnZXRTaXplKChJRldMX1dpZGdldCopdGhpcywgRldMX0dSSURTSVpFX1dpZHRoLCBlV2lkdGgpOw0KKyAgICAgIHBHcmlkLT5HZXRXaWRnZXRTaXplKChJRldMX1dpZGdldCopdGhpcywgRldMX0dSSURTSVpFX0hlaWdodCwgZUhlaWdodCk7DQorICAgIH0NCisgICAgaWYgKGVXaWR0aCAhPSBGV0xfR1JJRFVOSVRfQXV0byB8fCBlSGVpZ2h0ICE9IEZXTF9HUklEVU5JVF9BdXRvKSB7DQorICAgIH0NCisgICAgbV9wQ29udGVudC0+U2V0V2lkZ2V0UmVjdChydENsaWVudCk7DQorICAgIG1fcENvbnRlbnQtPlVwZGF0ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfUGFuZWxJbXA6OlNldENvbnRlbnQoSUZXTF9Db250ZW50ICpwQ29udGVudCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocENvbnRlbnQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIG1fcENvbnRlbnQgPSBwQ29udGVudDsNCi0gICAgcmV0dXJuIHBDb250ZW50LT5TZXRQYXJlbnQobV9wSW50ZXJmYWNlKTsNCitJRldMX0NvbnRlbnQqIENGV0xfUGFuZWxJbXA6OkdldENvbnRlbnQoKSB7DQorICByZXR1cm4gbV9wQ29udGVudDsNCiB9DQotY2xhc3MgQ0ZXTF9DdXN0b21QYW5lbEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfQ3VzdG9tUGFuZWxJbXAoSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBDRldMX0N1c3RvbVBhbmVsSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0N1c3RvbVBhbmVsSW1wKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQkJVXBkYXRlKCk7DQotICAgIHZpcnR1YWwgSUZXTF9Db250ZW50KglHZXRDb250ZW50KCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCVNldENvbnRlbnQoSUZXTF9Db250ZW50ICpwQ29udGVudCk7DQotICAgIEZXTF9FUlIJCQkJCVNldFByb3h5KElGV0xfUHJveHkgKnBQcm94eSk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX0NvbnRlbnQJCQkqbV9wQ29udGVudDsNCi0gICAgSUZXTF9Qcm94eQkJCQkqbV9wUHJveHk7DQorRldMX0VSUiBDRldMX1BhbmVsSW1wOjpTZXRDb250ZW50KElGV0xfQ29udGVudCogcENvbnRlbnQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocENvbnRlbnQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBtX3BDb250ZW50ID0gcENvbnRlbnQ7DQorICByZXR1cm4gcENvbnRlbnQtPlNldFBhcmVudChtX3BJbnRlcmZhY2UpOw0KK30NCitjbGFzcyBDRldMX0N1c3RvbVBhbmVsSW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9DdXN0b21QYW5lbEltcChJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBDRldMX0N1c3RvbVBhbmVsSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgdmlydHVhbCB+Q0ZXTF9DdXN0b21QYW5lbEltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgSUZXTF9Db250ZW50KiBHZXRDb250ZW50KCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0Q29udGVudChJRldMX0NvbnRlbnQqIHBDb250ZW50KTsNCisgIEZXTF9FUlIgU2V0UHJveHkoSUZXTF9Qcm94eSogcFByb3h5KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9Db250ZW50KiBtX3BDb250ZW50Ow0KKyAgSUZXTF9Qcm94eSogbV9wUHJveHk7DQogfTsNCi1DRldMX0N1c3RvbVBhbmVsSW1wOjpDRldMX0N1c3RvbVBhbmVsSW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIgKQ0KLSAgICA6IENGV0xfV2lkZ2V0SW1wKHBPdXRlcikNCi0gICAgLCBtX3BDb250ZW50KE5VTEwpDQotICAgICwgbV9wUHJveHkoTlVMTCkNCi17DQotfQ0KLUNGV0xfQ3VzdG9tUGFuZWxJbXA6OkNGV0xfQ3VzdG9tUGFuZWxJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCi0gICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpDQotICAgICwgbV9wQ29udGVudChOVUxMKQ0KLSAgICAsIG1fcFByb3h5KE5VTEwpDQotew0KLX0NCi1DRldMX0N1c3RvbVBhbmVsSW1wOjp+Q0ZXTF9DdXN0b21QYW5lbEltcCgpDQotew0KLX0NCi1GV0xfRVJSIENGV0xfQ3VzdG9tUGFuZWxJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQotew0KLSAgICBpZiAoYkF1dG9TaXplICYmIG1fcFByb3h5ICYmIChtX3BQcm94eS0+R2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpID09IEZXTF9FUlJfU3VjY2VlZGVkKSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpOw0KLX0NCi1GV0xfRVJSIENGV0xfQ3VzdG9tUGFuZWxJbXA6OlVwZGF0ZSgpDQotew0KLSAgICBpZiAobV9wUHJveHkpIHsNCi0gICAgICAgIHJldHVybiBtX3BQcm94eS0+VXBkYXRlKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpVcGRhdGUoKTsNCi19DQotSUZXTF9Db250ZW50KiBDRldMX0N1c3RvbVBhbmVsSW1wOjpHZXRDb250ZW50KCkNCi17DQotICAgIHJldHVybiBtX3BDb250ZW50Ow0KLX0NCi1GV0xfRVJSIENGV0xfQ3VzdG9tUGFuZWxJbXA6OlNldENvbnRlbnQoSUZXTF9Db250ZW50ICpwQ29udGVudCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocENvbnRlbnQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIG1fcENvbnRlbnQgPSBwQ29udGVudDsNCi0gICAgcmV0dXJuIHBDb250ZW50LT5TZXRQYXJlbnQobV9wSW50ZXJmYWNlKTsNCi19DQotRldMX0VSUiBDRldMX0N1c3RvbVBhbmVsSW1wOjpTZXRQcm94eShJRldMX1Byb3h5ICpwUHJveHkpDQotew0KLSAgICBtX3BQcm94eSA9IHBQcm94eTsNCitDRldMX0N1c3RvbVBhbmVsSW1wOjpDRldMX0N1c3RvbVBhbmVsSW1wKElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocE91dGVyKSwgbV9wQ29udGVudChOVUxMKSwgbV9wUHJveHkoTlVMTCkge30NCitDRldMX0N1c3RvbVBhbmVsSW1wOjpDRldMX0N1c3RvbVBhbmVsSW1wKA0KKyAgICBjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKSwgbV9wQ29udGVudChOVUxMKSwgbV9wUHJveHkoTlVMTCkge30NCitDRldMX0N1c3RvbVBhbmVsSW1wOjp+Q0ZXTF9DdXN0b21QYW5lbEltcCgpIHt9DQorRldMX0VSUiBDRldMX0N1c3RvbVBhbmVsSW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmIChiQXV0b1NpemUgJiYgbV9wUHJveHkgJiYNCisgICAgICAobV9wUHJveHktPkdldFdpZGdldFJlY3QocmVjdCwgYkF1dG9TaXplKSA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkpIHsNCiAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIGJBdXRvU2l6ZSk7DQogfQ0KLUlGV0xfQ3VzdG9tUGFuZWwqIElGV0xfQ3VzdG9tUGFuZWw6OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gbmV3IElGV0xfQ3VzdG9tUGFuZWw7DQorRldMX0VSUiBDRldMX0N1c3RvbVBhbmVsSW1wOjpVcGRhdGUoKSB7DQorICBpZiAobV9wUHJveHkpIHsNCisgICAgcmV0dXJuIG1fcFByb3h5LT5VcGRhdGUoKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6VXBkYXRlKCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9DdXN0b21QYW5lbDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCAqcE91dGVyICkNCi17DQotICAgIG1fcERhdGEgPSBGWF9ORVcgQ0ZXTF9DdXN0b21QYW5lbEltcChwT3V0ZXIpOw0KLSAgICAoKENGV0xfQ3VzdG9tUGFuZWxJbXAqKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfQ3VzdG9tUGFuZWxJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorSUZXTF9Db250ZW50KiBDRldMX0N1c3RvbVBhbmVsSW1wOjpHZXRDb250ZW50KCkgew0KKyAgcmV0dXJuIG1fcENvbnRlbnQ7DQogfQ0KLUZXTF9FUlIJSUZXTF9DdXN0b21QYW5lbDo6SW5pdGlhbGl6ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLXsNCi0gICAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0N1c3RvbVBhbmVsSW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9DdXN0b21QYW5lbEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9DdXN0b21QYW5lbEltcCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitGV0xfRVJSIENGV0xfQ3VzdG9tUGFuZWxJbXA6OlNldENvbnRlbnQoSUZXTF9Db250ZW50KiBwQ29udGVudCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQ29udGVudCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIG1fcENvbnRlbnQgPSBwQ29udGVudDsNCisgIHJldHVybiBwQ29udGVudC0+U2V0UGFyZW50KG1fcEludGVyZmFjZSk7DQogfQ0KLUlGV0xfQ29udGVudCogSUZXTF9DdXN0b21QYW5lbDo6R2V0Q29udGVudCgpDQotew0KLSAgICByZXR1cm4gKChDRldMX0N1c3RvbVBhbmVsSW1wKiltX3BEYXRhKS0+R2V0Q29udGVudCgpOw0KK0ZXTF9FUlIgQ0ZXTF9DdXN0b21QYW5lbEltcDo6U2V0UHJveHkoSUZXTF9Qcm94eSogcFByb3h5KSB7DQorICBtX3BQcm94eSA9IHBQcm94eTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUglJRldMX0N1c3RvbVBhbmVsOjpTZXRDb250ZW50KElGV0xfQ29udGVudCAqcENvbnRlbnQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0N1c3RvbVBhbmVsSW1wKiltX3BEYXRhKS0+U2V0Q29udGVudChwQ29udGVudCk7DQorSUZXTF9DdXN0b21QYW5lbCogSUZXTF9DdXN0b21QYW5lbDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBJRldMX0N1c3RvbVBhbmVsOw0KIH0NCi1GV0xfRVJSCUlGV0xfQ3VzdG9tUGFuZWw6OlNldFByb3h5KElGV0xfUHJveHkgKnBQcm94eSkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ3VzdG9tUGFuZWxJbXAqKW1fcERhdGEpLT5TZXRQcm94eShwUHJveHkpOw0KK0ZXTF9FUlIgSUZXTF9DdXN0b21QYW5lbDo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQ3VzdG9tUGFuZWxJbXAocE91dGVyKTsNCisgICgoQ0ZXTF9DdXN0b21QYW5lbEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgIHJldHVybiAoKENGV0xfQ3VzdG9tUGFuZWxJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUlGV0xfQ3VzdG9tUGFuZWw6OklGV0xfQ3VzdG9tUGFuZWwoKQ0KLXsNCitGV0xfRVJSIElGV0xfQ3VzdG9tUGFuZWw6OkluaXRpYWxpemUoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQ3VzdG9tUGFuZWxJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgICgoQ0ZXTF9DdXN0b21QYW5lbEltcCopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgIHJldHVybiAoKENGV0xfQ3VzdG9tUGFuZWxJbXAqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0lGV0xfQ29udGVudCogSUZXTF9DdXN0b21QYW5lbDo6R2V0Q29udGVudCgpIHsNCisgIHJldHVybiAoKENGV0xfQ3VzdG9tUGFuZWxJbXAqKW1fcERhdGEpLT5HZXRDb250ZW50KCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9DdXN0b21QYW5lbDo6U2V0Q29udGVudChJRldMX0NvbnRlbnQqIHBDb250ZW50KSB7DQorICByZXR1cm4gKChDRldMX0N1c3RvbVBhbmVsSW1wKiltX3BEYXRhKS0+U2V0Q29udGVudChwQ29udGVudCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9DdXN0b21QYW5lbDo6U2V0UHJveHkoSUZXTF9Qcm94eSogcFByb3h5KSB7DQorICByZXR1cm4gKChDRldMX0N1c3RvbVBhbmVsSW1wKiltX3BEYXRhKS0+U2V0UHJveHkocFByb3h5KTsNCit9DQorSUZXTF9DdXN0b21QYW5lbDo6SUZXTF9DdXN0b21QYW5lbCgpIHsNCisgIG1fcERhdGEgPSBOVUxMOw0KK30NCitJRldMX0N1c3RvbVBhbmVsOjp+SUZXTF9DdXN0b21QYW5lbCgpIHsNCisgIGlmIChtX3BEYXRhKSB7DQorICAgIGRlbGV0ZSAoQ0ZXTF9DdXN0b21QYW5lbEltcCopbV9wRGF0YTsNCiAgICAgbV9wRGF0YSA9IE5VTEw7DQotfQ0KLUlGV0xfQ3VzdG9tUGFuZWw6On5JRldMX0N1c3RvbVBhbmVsKCkNCi17DQotICAgIGlmIChtX3BEYXRhKSB7DQotICAgICAgICBkZWxldGUgKENGV0xfQ3VzdG9tUGFuZWxJbXAqKW1fcERhdGE7DQotICAgICAgICBtX3BEYXRhID0gTlVMTDsNCi0gICAgfQ0KKyAgfQ0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfc2RhZGFwdGVyaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9zZGFkYXB0ZXJpbXAuY3BwCmluZGV4IGJlYmFkM2MuLjk2Nzc2ZjIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9zZGFkYXB0ZXJpbXAuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9zZGFkYXB0ZXJpbXAuY3BwCkBAIC05LDE3OSArOSwxNjAgQEAKICNpbmNsdWRlICJpbmNsdWRlL2Z3bF90aHJlYWRpbXAuaCINCiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCi1DRldMX1NEQWRhcHRlcldpZGdldE1ncjo6Q0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3IoKQ0KLXsNCitDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6Q0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3IoKSB7fQ0KK0NGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjp+Q0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3IoKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkNyZWF0ZVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBQYXJlbnQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6On5DRldMX1NEQWRhcHRlcldpZGdldE1ncigpDQotew0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkRlc3Ryb3lXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6Q3JlYXRlV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBJRldMX1dpZGdldCAqcFBhcmVudCApDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0V2lkZ2V0UmVjdChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpEZXN0cm95V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldFdpZGdldFBvc2l0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRQYXJlbnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwUGFyZW50KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldFdpZGdldFBvc2l0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2hvd1dpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRQYXJlbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIElGV0xfV2lkZ2V0ICpwUGFyZW50KQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkhpZGVXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2hvd1dpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXROb3JtYWwoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6SGlkZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRNYXhpbWl6ZShJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXROb3JtYWwoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0TWluaW1pemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0TWF4aW1pemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6UnVuV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldE1pbmltaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlJ1bldpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpFeGl0KGludDMyX3QgaUV4aXRDb2RlKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6Q3JlYXRlV2lkZ2V0V2l0aE5hdGl2ZUlkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB2cCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpFeGl0KGludDMyX3QgaUV4aXRDb2RlKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkdldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6Q3JlYXRlV2lkZ2V0V2l0aE5hdGl2ZUlkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCB2b2lkICp2cCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRXaWRnZXRJY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwSWNvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJpZykgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSCQlDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6R2V0V2lkZ2V0UmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldFdpZGdldENhcHRpb24oDQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbikgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSCQlDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0V2lkZ2V0SWNvbihJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX0RJQml0bWFwICpwSWNvbiwgRlhfQk9PTCBiQmlnKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldEJvcmRlclJlZ2lvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGgqIHBQYXRoKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRXaWRnZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbikNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRUcmFuc3BhcmVudChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0FscGhhKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRCb3JkZXJSZWdpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9QYXRoICpwUGF0aCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRGdWxsU2NyZWVuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRnVsbFNjcmVlbikgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSCQlDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0VHJhbnNwYXJlbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3QWxwaGEpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRlhfQk9PTCBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6Q2hlY2tNZXNzYWdlKCkgew0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRGdWxsU2NyZWVuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJGdWxsU2NyZWVuKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZYX0JPT0wgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OklzSWRsZU1lc3NhZ2UoKSB7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAkJQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkNoZWNrTWVzc2FnZSgpDQotew0KLSAgICByZXR1cm4gVFJVRTsNCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpEaXNwYXRjaE1lc3NhZ2UoKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0JPT0wJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpJc0lkbGVNZXNzYWdlKCkNCi17DQotICAgIHJldHVybiBUUlVFOw0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkdldFdpZGdldERDKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCB2b2lkKiYgcERDKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpEaXNwYXRjaE1lc3NhZ2UoKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlJlbGVhc2VXaWRnZXREQyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERDLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYqIHBDbGlwKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpHZXRXaWRnZXREQyhJRldMX1dpZGdldCAqcFdpZGdldCwgdm9pZCogJnBEQykNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit2b2lkKiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6R2V0V2luZG93KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gTlVMTDsNCiB9DQotRldMX0VSUgkJQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlJlbGVhc2VXaWRnZXREQyhJRldMX1dpZGdldCAqcFdpZGdldCwgdm9pZCogcERDLCBDRlhfUmVjdEYgKnBDbGlwKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZYX0RXT1JEIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpHZXRLZXlTdGF0ZShGWF9EV09SRCBkd1ZpcnRLZXkpIHsNCisgIHJldHVybiAwOw0KIH0NCi12b2lkKglDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6R2V0V2luZG93KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6UnVuTG9vcChJRldMX1dpZGdldCogd2lkZ2V0KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0RXT1JECUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpHZXRLZXlTdGF0ZShGWF9EV09SRCBkd1ZpcnRLZXkpDQotew0KLSAgICByZXR1cm4gMDsNCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpFbmRMb29wKCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSCQlDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6UnVuTG9vcChJRldMX1dpZGdldCAqd2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkluaXRNZW51KElGV0xfTWVudSogcE1lbnUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9NZW51RFAqIHBNZW51RGF0YSkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSCQlDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6RW5kTG9vcCgpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6VXBkYXRlTWVudShJRldMX01lbnUqIHBNZW51LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUeXBlKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpJbml0TWVudShJRldMX01lbnUgKnBNZW51LCBJRldMX01lbnVEUCAqcE1lbnVEYXRhKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK2ludDMyX3QgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlRyYWNrUG9wdXBNZW51KElGV0xfTWVudSogcE1lbnUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9NZW51RFAqIHBNZW51RGF0YSkgew0KKyAgcmV0dXJuIDA7DQogfQ0KLUZXTF9FUlIJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpVcGRhdGVNZW51KElGV0xfTWVudSAqcE1lbnUsIGNvbnN0IHZvaWQqIGhJdGVtLCBpbnQzMl90IGlUeXBlKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldE1lc3NhZ2VIb29rKElGV0xfQWRhcHRlck1lc3NhZ2VIb29rKiBob29rKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLWludDMyX3QJQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlRyYWNrUG9wdXBNZW51KElGV0xfTWVudSAqcE1lbnUsIElGV0xfTWVudURQICpwTWVudURhdGEpDQotew0KLSAgICByZXR1cm4gMDsNCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpHZXRTeXN0ZW1Cb3JkZXIoRlhfRkxPQVQmIGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGIpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUgkJQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldE1lc3NhZ2VIb29rKElGV0xfQWRhcHRlck1lc3NhZ2VIb29rICpob29rKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZYX0JPT0wgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkdldFBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSCQlDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6R2V0U3lzdGVtQm9yZGVyKEZYX0ZMT0FUICZsLCBGWF9GTE9BVCAmdCwgRlhfRkxPQVQgJnIsIEZYX0ZMT0FUICZiKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0NGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjpDRldMX1NEQWRhcHRlclRocmVhZE1ncigpIHt9DQorQ0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3I6On5DRldMX1NEQWRhcHRlclRocmVhZE1ncigpIHt9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlclRocmVhZE1ncjo6U3RhcnQoSUZXTF9UaHJlYWQqIHBUaHJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hUSFJFQUQmIGhUaHJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3VzcGVuZGVkKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0JPT0wJCUNGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpHZXRQb3B1cFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwgRlhfRkxPQVQgZk1pbkhlaWdodCwgRlhfRkxPQVQgZk1heEhlaWdodCwgY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvciwgQ0ZYX1JlY3RGICZydFBvcHVwKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3I6OlJlc3VtZShGV0xfSFRIUkVBRCBoVGhyZWFkKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUNGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjpDRldMX1NEQWRhcHRlclRocmVhZE1ncigpDQotew0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3I6OlN1c3BlbmQoRldMX0hUSFJFQUQgaFRocmVhZCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRldMX1NEQWRhcHRlclRocmVhZE1ncjo6fkNGV0xfU0RBZGFwdGVyVGhyZWFkTWdyKCkNCi17DQorRldMX0VSUiBDRldMX1NEQWRhcHRlclRocmVhZE1ncjo6S2lsbChGV0xfSFRIUkVBRCBoVGhyZWFkLCBpbnQzMl90IGlFeGl0Q29kZSkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSCUNGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjpTdGFydChJRldMX1RocmVhZCAqcFRocmVhZCwgRldMX0hUSFJFQUQgJmhUaHJlYWQsIEZYX0JPT0wgYlN1c3BlbmRlZCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjpTdG9wKEZXTF9IVEhSRUFEIGhUaHJlYWQsIGludDMyX3QgaUV4aXRDb2RlKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3I6OlJlc3VtZShGV0xfSFRIUkVBRCBoVGhyZWFkKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjpTdXNwZW5kKEZXTF9IVEhSRUFEIGhUaHJlYWQpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3I6OktpbGwoRldMX0hUSFJFQUQgaFRocmVhZCwgaW50MzJfdCBpRXhpdENvZGUpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3I6OlN0b3AoRldMX0hUSFJFQUQgaFRocmVhZCwgaW50MzJfdCBpRXhpdENvZGUpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUlGV0xfVGhyZWFkKiBDRldMX1NEQWRhcHRlclRocmVhZE1ncjo6R2V0Q3VycmVudFRocmVhZCgpDQotew0KLSAgICByZXR1cm4gRldMX0dldEFwcCgpOw0KK0lGV0xfVGhyZWFkKiBDRldMX1NEQWRhcHRlclRocmVhZE1ncjo6R2V0Q3VycmVudFRocmVhZCgpIHsNCisgIHJldHVybiBGV0xfR2V0QXBwKCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90YXJnZXRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RhcmdldGltcC5jcHAKaW5kZXggYzZmZmQyNy4uY2Q5YmY4MSAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RhcmdldGltcC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RhcmdldGltcC5jcHAKQEAgLTYsOTYgKzYsNzEgQEAKIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCi1GWF9EV09SRCBJRldMX1RhcmdldDo6UmVsZWFzZSgpDQotew0KLSAgICBGWF9EV09SRCBkd1JlZiA9ICgoQ0ZXTF9UYXJnZXQqKW1fcERhdGEpLT5SZWxlYXNlKCk7DQotICAgIGlmICghZHdSZWYpIHsNCi0gICAgICAgIG1fcERhdGEgPSBOVUxMOw0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgcmV0dXJuIGR3UmVmOw0KK0ZYX0RXT1JEIElGV0xfVGFyZ2V0OjpSZWxlYXNlKCkgew0KKyAgRlhfRFdPUkQgZHdSZWYgPSAoKENGV0xfVGFyZ2V0KiltX3BEYXRhKS0+UmVsZWFzZSgpOw0KKyAgaWYgKCFkd1JlZikgew0KKyAgICBtX3BEYXRhID0gTlVMTDsNCisgICAgZGVsZXRlIHRoaXM7DQorICB9DQorICByZXR1cm4gZHdSZWY7DQogfQ0KLUlGV0xfVGFyZ2V0KiBJRldMX1RhcmdldDo6UmV0YWluKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfVGFyZ2V0KiltX3BEYXRhKS0+UmV0YWluKCk7DQorSUZXTF9UYXJnZXQqIElGV0xfVGFyZ2V0OjpSZXRhaW4oKSB7DQorICByZXR1cm4gKChDRldMX1RhcmdldCopbV9wRGF0YSktPlJldGFpbigpOw0KIH0NCi1GWF9EV09SRCBJRldMX1RhcmdldDo6R2V0UmVmQ291bnQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9UYXJnZXQqKW1fcERhdGEpLT5HZXRSZWZDb3VudCgpOw0KK0ZYX0RXT1JEIElGV0xfVGFyZ2V0OjpHZXRSZWZDb3VudCgpIGNvbnN0IHsNCisgIHJldHVybiAoKENGV0xfVGFyZ2V0KiltX3BEYXRhKS0+R2V0UmVmQ291bnQoKTsNCiB9DQotRldMX0VSUglJRldMX1RhcmdldDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9UYXJnZXQqKW1fcERhdGEpLT5HZXRDbGFzc05hbWUod3NDbGFzcyk7DQorRldMX0VSUiBJRldMX1RhcmdldDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICByZXR1cm4gKChDRldMX1RhcmdldCopbV9wRGF0YSktPkdldENsYXNzTmFtZSh3c0NsYXNzKTsNCiB9DQotRlhfRFdPUkQgSUZXTF9UYXJnZXQ6OkdldENsYXNzSUQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9UYXJnZXQqKW1fcERhdGEpLT5HZXRDbGFzc0lEKCk7DQorRlhfRFdPUkQgSUZXTF9UYXJnZXQ6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gKChDRldMX1RhcmdldCopbV9wRGF0YSktPkdldENsYXNzSUQoKTsNCiB9DQotRlhfQk9PTAlJRldMX1RhcmdldDo6SXNJbnN0YW5jZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2xhc3MpIGNvbnN0DQotew0KLSAgICByZXR1cm4gKChDRldMX1RhcmdldCopbV9wRGF0YSktPklzSW5zdGFuY2Uod3NDbGFzcyk7DQorRlhfQk9PTCBJRldMX1RhcmdldDo6SXNJbnN0YW5jZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHJldHVybiAoKENGV0xfVGFyZ2V0KiltX3BEYXRhKS0+SXNJbnN0YW5jZSh3c0NsYXNzKTsNCiB9DQotRldMX0VSUglJRldMX1RhcmdldDo6SW5pdGlhbGl6ZSgpDQotew0KLSAgICByZXR1cm4gKChDRldMX1RhcmdldCopbV9wRGF0YSktPkluaXRpYWxpemUoKTsNCitGV0xfRVJSIElGV0xfVGFyZ2V0OjpJbml0aWFsaXplKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9UYXJnZXQqKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9UYXJnZXQ6OkZpbmFsaXplKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfVGFyZ2V0KiltX3BEYXRhKS0+RmluYWxpemUoKTsNCitGV0xfRVJSIElGV0xfVGFyZ2V0OjpGaW5hbGl6ZSgpIHsNCisgIHJldHVybiAoKENGV0xfVGFyZ2V0KiltX3BEYXRhKS0+RmluYWxpemUoKTsNCiB9DQotSUZXTF9UYXJnZXQ6On5JRldMX1RhcmdldCgpDQotew0KK0lGV0xfVGFyZ2V0Ojp+SUZXTF9UYXJnZXQoKSB7fQ0KK0NGV0xfVGFyZ2V0OjpDRldMX1RhcmdldCgpIDogbV9kd1JlZkNvdW50KDEpIHt9DQorQ0ZXTF9UYXJnZXQ6On5DRldMX1RhcmdldCgpIHt9DQorRlhfRFdPUkQgQ0ZXTF9UYXJnZXQ6OlJlbGVhc2UoKSB7DQorICBtX2R3UmVmQ291bnQtLTsNCisgIEZYX0RXT1JEIGR3UmV0ID0gbV9kd1JlZkNvdW50Ow0KKyAgaWYgKCFtX2R3UmVmQ291bnQpIHsNCisgICAgZGVsZXRlIHRoaXM7DQorICB9DQorICByZXR1cm4gZHdSZXQ7DQogfQ0KLUNGV0xfVGFyZ2V0OjpDRldMX1RhcmdldCgpDQotICAgIDogbV9kd1JlZkNvdW50KDEpDQotew0KK0lGV0xfVGFyZ2V0KiBDRldMX1RhcmdldDo6UmV0YWluKCkgew0KKyAgbV9kd1JlZkNvdW50Kys7DQorICByZXR1cm4gKElGV0xfVGFyZ2V0Kil0aGlzOw0KIH0NCi1DRldMX1RhcmdldDo6fkNGV0xfVGFyZ2V0KCkNCi17DQorRlhfRFdPUkQgQ0ZXTF9UYXJnZXQ6OkdldFJlZkNvdW50KCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fZHdSZWZDb3VudDsNCiB9DQotRlhfRFdPUkQgQ0ZXTF9UYXJnZXQ6OlJlbGVhc2UoKQ0KLXsNCi0gICAgbV9kd1JlZkNvdW50LS07DQotICAgIEZYX0RXT1JEIGR3UmV0ID0gbV9kd1JlZkNvdW50Ow0KLSAgICBpZiAoIW1fZHdSZWZDb3VudCkgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgcmV0dXJuIGR3UmV0Ow0KK0ZXTF9FUlIgQ0ZXTF9UYXJnZXQ6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1JRldMX1RhcmdldCogQ0ZXTF9UYXJnZXQ6OlJldGFpbigpDQotew0KLSAgICBtX2R3UmVmQ291bnQrKzsNCi0gICAgcmV0dXJuIChJRldMX1RhcmdldCopdGhpczsNCitGWF9EV09SRCBDRldMX1RhcmdldDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiAwOw0KIH0NCi1GWF9EV09SRCBDRldMX1RhcmdldDo6R2V0UmVmQ291bnQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fZHdSZWZDb3VudDsNCitGWF9CT09MIENGV0xfVGFyZ2V0OjpJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Qgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GV0xfRVJSIENGV0xfVGFyZ2V0OjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzQ2xhc3MpIGNvbnN0DQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1RhcmdldDo6SW5pdGlhbGl6ZSgpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRFdPUkQgQ0ZXTF9UYXJnZXQ6OkdldENsYXNzSUQoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIDA7DQorRldMX0VSUiBDRldMX1RhcmdldDo6RmluYWxpemUoKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0JPT0wJQ0ZXTF9UYXJnZXQ6OklzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KK3ZvaWQqIElGV0xfVGFyZ2V0RGF0YTo6R2V0RGF0YSgpIHsNCisgIHJldHVybiBtX3BEYXRhOw0KIH0NCi1GV0xfRVJSIENGV0xfVGFyZ2V0OjpJbml0aWFsaXplKCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX1RhcmdldDo6RmluYWxpemUoKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi12b2lkKiBJRldMX1RhcmdldERhdGE6OkdldERhdGEoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcERhdGE7DQotfQ0KLXZvaWQgSUZXTF9UYXJnZXREYXRhOjpTZXREYXRhKHZvaWQqIHBEYXRhKQ0KLXsNCi0gICAgbV9wRGF0YSA9IHBEYXRhOw0KK3ZvaWQgSUZXTF9UYXJnZXREYXRhOjpTZXREYXRhKHZvaWQqIHBEYXRhKSB7DQorICBtX3BEYXRhID0gcERhdGE7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90aHJlYWRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RocmVhZGltcC5jcHAKaW5kZXggN2Q5NjA5YS4uY2E3MTMzNCAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RocmVhZGltcC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RocmVhZGltcC5jcHAKQEAgLTksMTUwICs5LDExOCBAQAogI2luY2x1ZGUgImluY2x1ZGUvZndsX25vdGVpbXAuaCINCiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX2FwcGltcC5oIg0KLUNGV0xfQ29udHJvbFRocmVhZDo6fkNGV0xfQ29udHJvbFRocmVhZCgpDQotew0KK0NGV0xfQ29udHJvbFRocmVhZDo6fkNGV0xfQ29udHJvbFRocmVhZCgpIHt9DQorRldMX0VSUiBDRldMX0NvbnRyb2xUaHJlYWQ6OlJ1bihGV0xfSFRIUkVBRCBoVGhyZWFkKSB7DQorICBzdGF0aWMgaW50IGNvdW50ID0gMDsNCisgIHdoaWxlIChUUlVFKSB7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9Db250cm9sVGhyZWFkOjpSdW4oRldMX0hUSFJFQUQgaFRocmVhZCkNCi17DQotICAgIHN0YXRpYyBpbnQgY291bnQgPSAwOw0KLSAgICB3aGlsZSAoVFJVRSkgew0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitJRldMX1RocmVhZCogSUZXTF9UaHJlYWQ6OkNyZWF0ZSgpIHsNCisgIHJldHVybiAoSUZXTF9UaHJlYWQqKUZYX05FVyBDRldMX1RocmVhZDsNCiB9DQotSUZXTF9UaHJlYWQgKiBJRldMX1RocmVhZDo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiAoSUZXTF9UaHJlYWQgKikgRlhfTkVXIENGV0xfVGhyZWFkOw0KK0NGV0xfVGhyZWFkOjpDRldMX1RocmVhZCgpIHt9DQorQ0ZXTF9UaHJlYWQ6On5DRldMX1RocmVhZCgpIHt9DQorRldMX0VSUiBDRldMX1RocmVhZDo6UnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotQ0ZXTF9UaHJlYWQ6OkNGV0xfVGhyZWFkKCkNCi17DQorQ0ZXTF9Db250cm9sVGhyZWFkKiBDRldMX05vdGVUaHJlYWQ6Ol9hc3Npc3RhbnRUaHJlYWRIYW5kbGVyID0gTlVMTDsNCitGV0xfSFRIUkVBRCBDRldMX05vdGVUaHJlYWQ6Ol9hc3Npc3RhbnRUaHJlYWQgPSBOVUxMOw0KK2ludDMyX3QgQ0ZXTF9Ob3RlVGhyZWFkOjpfcmVmQ291bnQgPSAwOw0KK0lGV0xfTm90ZVRocmVhZCogSUZXTF9Ob3RlVGhyZWFkOjpDcmVhdGUoKSB7DQorICByZXR1cm4gKElGV0xfTm90ZVRocmVhZCopRlhfTkVXIENGV0xfTm90ZVRocmVhZDsNCiB9DQotQ0ZXTF9UaHJlYWQ6On5DRldMX1RocmVhZCgpDQotew0KK0NGV0xfTm90ZVRocmVhZDo6Q0ZXTF9Ob3RlVGhyZWFkKCkgOiBtX2hUaHJlYWQoTlVMTCkgew0KKyAgbV9wTm90ZURyaXZlciA9IEZYX05FVyBDRldMX05vdGVEcml2ZXI7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9UaHJlYWQ6OlJ1bihGV0xfSFRIUkVBRCBoVGhyZWFkKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0NGV0xfTm90ZVRocmVhZDo6fkNGV0xfTm90ZVRocmVhZCgpIHsNCisgIGlmIChtX2hUaHJlYWQpIHsNCisgICAgRldMX1N0b3BUaHJlYWQobV9oVGhyZWFkLCAwKTsNCisgIH0NCisgIGlmIChtX3BOb3RlRHJpdmVyKSB7DQorICAgIGRlbGV0ZSBtX3BOb3RlRHJpdmVyOw0KKyAgICBtX3BOb3RlRHJpdmVyID0gTlVMTDsNCisgIH0NCiB9DQotQ0ZXTF9Db250cm9sVGhyZWFkICoJQ0ZXTF9Ob3RlVGhyZWFkOjpfYXNzaXN0YW50VGhyZWFkSGFuZGxlcgk9IE5VTEw7DQotRldMX0hUSFJFQUQJCQkJQ0ZXTF9Ob3RlVGhyZWFkOjpfYXNzaXN0YW50VGhyZWFkCQkJPSBOVUxMOw0KLWludDMyX3QJCQkJQ0ZXTF9Ob3RlVGhyZWFkOjpfcmVmQ291bnQJCQkJCT0gMDsNCi1JRldMX05vdGVUaHJlYWQqIElGV0xfTm90ZVRocmVhZDo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiAoSUZXTF9Ob3RlVGhyZWFkKikgRlhfTkVXIENGV0xfTm90ZVRocmVhZDsNCitGV0xfRVJSIENGV0xfTm90ZVRocmVhZDo6UnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wTm90ZURyaXZlciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIEZXTF9FUlIgcmVzdWx0ID0gbV9wTm90ZURyaXZlci0+UnVuKCk7DQorICByZXR1cm4gcmVzdWx0Ow0KIH0NCi1DRldMX05vdGVUaHJlYWQ6OkNGV0xfTm90ZVRocmVhZCgpDQotICAgIDogbV9oVGhyZWFkKE5VTEwpDQotew0KLSAgICBtX3BOb3RlRHJpdmVyID0gRlhfTkVXIENGV0xfTm90ZURyaXZlcjsNCi19DQotQ0ZXTF9Ob3RlVGhyZWFkOjp+Q0ZXTF9Ob3RlVGhyZWFkKCkNCi17DQotICAgIGlmIChtX2hUaHJlYWQpIHsNCi0gICAgICAgIEZXTF9TdG9wVGhyZWFkKG1faFRocmVhZCwgMCk7DQotICAgIH0NCi0gICAgaWYgKG1fcE5vdGVEcml2ZXIpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BOb3RlRHJpdmVyOw0KLSAgICAgICAgbV9wTm90ZURyaXZlciA9IE5VTEw7DQotICAgIH0NCi19DQotRldMX0VSUiBDRldMX05vdGVUaHJlYWQ6OlJ1bihGV0xfSFRIUkVBRCBoVGhyZWFkKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BOb3RlRHJpdmVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBGV0xfRVJSIHJlc3VsdCA9IG1fcE5vdGVEcml2ZXItPlJ1bigpOw0KLSAgICByZXR1cm4gcmVzdWx0Ow0KLX0NCi1JRldMX05vdGVEcml2ZXIqIENGV0xfTm90ZVRocmVhZDo6R2V0Tm90ZURyaXZlcigpDQotew0KLSAgICByZXR1cm4gKElGV0xfTm90ZURyaXZlciopbV9wTm90ZURyaXZlcjsNCitJRldMX05vdGVEcml2ZXIqIENGV0xfTm90ZVRocmVhZDo6R2V0Tm90ZURyaXZlcigpIHsNCisgIHJldHVybiAoSUZXTF9Ob3RlRHJpdmVyKiltX3BOb3RlRHJpdmVyOw0KIH0NCiBleHRlcm4gSUZXTF9BZGFwdGVyTmF0aXZlKiBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KLUZXTF9IVEhSRUFEIEZXTF9TdGFydFRocmVhZChJRldMX1RocmVhZCAqcFRocmVhZCwgRlhfQk9PTCBiU3VzcGVuZGVkICkNCi17DQotICAgIElGV0xfQWRhcHRlck5hdGl2ZSAqcE5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE5hdGl2ZSwgTlVMTCk7DQotICAgIElGV0xfQWRhcHRlclRocmVhZE1nciAqcFRocmVhZE1nciA9IHBOYXRpdmUtPkdldFRocmVhZE1ncigpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBUaHJlYWRNZ3IsIE5VTEwpOw0KLSAgICBGV0xfSFRIUkVBRCBoVGhyZWFkID0gTlVMTDsNCi0gICAgcFRocmVhZE1nci0+U3RhcnQocFRocmVhZCwgaFRocmVhZCwgYlN1c3BlbmRlZCk7DQotICAgIHJldHVybiBoVGhyZWFkOw0KK0ZXTF9IVEhSRUFEIEZXTF9TdGFydFRocmVhZChJRldMX1RocmVhZCogcFRocmVhZCwgRlhfQk9PTCBiU3VzcGVuZGVkKSB7DQorICBJRldMX0FkYXB0ZXJOYXRpdmUqIHBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTmF0aXZlLCBOVUxMKTsNCisgIElGV0xfQWRhcHRlclRocmVhZE1nciogcFRocmVhZE1nciA9IHBOYXRpdmUtPkdldFRocmVhZE1ncigpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwVGhyZWFkTWdyLCBOVUxMKTsNCisgIEZXTF9IVEhSRUFEIGhUaHJlYWQgPSBOVUxMOw0KKyAgcFRocmVhZE1nci0+U3RhcnQocFRocmVhZCwgaFRocmVhZCwgYlN1c3BlbmRlZCk7DQorICByZXR1cm4gaFRocmVhZDsNCiB9DQotRldMX0VSUiBGV0xfUmVzdW1lVGhyZWFkKEZXTF9IVEhSRUFEIGhUaHJlYWQpDQotew0KLSAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKiBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKE5hdGl2ZSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgSUZXTF9BZGFwdGVyVGhyZWFkTWdyICogVGhyZWFkTWdyID0gTmF0aXZlLT5HZXRUaHJlYWRNZ3IoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChUaHJlYWRNZ3IsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBUaHJlYWRNZ3ItPlJlc3VtZShoVGhyZWFkKTsNCitGV0xfRVJSIEZXTF9SZXN1bWVUaHJlYWQoRldMX0hUSFJFQUQgaFRocmVhZCkgew0KKyAgSUZXTF9BZGFwdGVyTmF0aXZlKiBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChOYXRpdmUsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IqIFRocmVhZE1nciA9IE5hdGl2ZS0+R2V0VGhyZWFkTWdyKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKFRocmVhZE1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBUaHJlYWRNZ3ItPlJlc3VtZShoVGhyZWFkKTsNCiB9DQotRldMX0VSUiBGV0xfU3VzcGVuZFRocmVhZChGV0xfSFRIUkVBRCBoVGhyZWFkKQ0KLXsNCi0gICAgSUZXTF9BZGFwdGVyTmF0aXZlICogTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChOYXRpdmUsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIElGV0xfQWRhcHRlclRocmVhZE1nciAqIFRocmVhZE1nciA9IE5hdGl2ZS0+R2V0VGhyZWFkTWdyKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoVGhyZWFkTWdyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gVGhyZWFkTWdyLT5TdXNwZW5kKGhUaHJlYWQpOw0KK0ZXTF9FUlIgRldMX1N1c3BlbmRUaHJlYWQoRldMX0hUSFJFQUQgaFRocmVhZCkgew0KKyAgSUZXTF9BZGFwdGVyTmF0aXZlKiBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChOYXRpdmUsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IqIFRocmVhZE1nciA9IE5hdGl2ZS0+R2V0VGhyZWFkTWdyKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKFRocmVhZE1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBUaHJlYWRNZ3ItPlN1c3BlbmQoaFRocmVhZCk7DQogfQ0KLUZXTF9FUlIgRldMX0tpbGxUaHJlYWQoRldMX0hUSFJFQUQgaFRocmVhZCwgaW50MzJfdCBpRXhpdENvZGUpDQotew0KLSAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKiBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKE5hdGl2ZSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgSUZXTF9BZGFwdGVyVGhyZWFkTWdyICogVGhyZWFkTWdyID0gTmF0aXZlLT5HZXRUaHJlYWRNZ3IoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChUaHJlYWRNZ3IsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBUaHJlYWRNZ3ItPktpbGwoaFRocmVhZCwgaUV4aXRDb2RlKTsNCitGV0xfRVJSIEZXTF9LaWxsVGhyZWFkKEZXTF9IVEhSRUFEIGhUaHJlYWQsIGludDMyX3QgaUV4aXRDb2RlKSB7DQorICBJRldMX0FkYXB0ZXJOYXRpdmUqIE5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKE5hdGl2ZSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIElGV0xfQWRhcHRlclRocmVhZE1nciogVGhyZWFkTWdyID0gTmF0aXZlLT5HZXRUaHJlYWRNZ3IoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoVGhyZWFkTWdyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuIFRocmVhZE1nci0+S2lsbChoVGhyZWFkLCBpRXhpdENvZGUpOw0KIH0NCi1GV0xfRVJSIEZXTF9TdG9wVGhyZWFkKEZXTF9IVEhSRUFEIGhUaHJlYWQsIGludDMyX3QgaUV4aXRDb2RlKQ0KLXsNCi0gICAgSUZXTF9BZGFwdGVyTmF0aXZlICogTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChOYXRpdmUsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIElGV0xfQWRhcHRlclRocmVhZE1nciAqIFRocmVhZE1nciA9IE5hdGl2ZS0+R2V0VGhyZWFkTWdyKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoVGhyZWFkTWdyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gVGhyZWFkTWdyLT5TdG9wKGhUaHJlYWQsIGlFeGl0Q29kZSk7DQorRldMX0VSUiBGV0xfU3RvcFRocmVhZChGV0xfSFRIUkVBRCBoVGhyZWFkLCBpbnQzMl90IGlFeGl0Q29kZSkgew0KKyAgSUZXTF9BZGFwdGVyTmF0aXZlKiBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChOYXRpdmUsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IqIFRocmVhZE1nciA9IE5hdGl2ZS0+R2V0VGhyZWFkTWdyKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKFRocmVhZE1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBUaHJlYWRNZ3ItPlN0b3AoaFRocmVhZCwgaUV4aXRDb2RlKTsNCiB9DQotRldMX0hNVVRFWCBGV0xfQ3JlYXRlTXV0ZXgoKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQorRldMX0hNVVRFWCBGV0xfQ3JlYXRlTXV0ZXgoKSB7DQorICByZXR1cm4gTlVMTDsNCiB9DQotRldMX0VSUglGV0xfRGVzdHJveU11dGV4KEZXTF9ITVVURVggaE11dGV4KQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgRldMX0Rlc3Ryb3lNdXRleChGV0xfSE1VVEVYIGhNdXRleCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSCUZXTF9Mb2NrTXV0ZXgoRldMX0hNVVRFWCBoTXV0ZXgpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBGV0xfTG9ja011dGV4KEZXTF9ITVVURVggaE11dGV4KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIJRldMX1RyeUxvY2tNdXRleChGV0xfSE1VVEVYIGhNdXRleCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIEZXTF9UcnlMb2NrTXV0ZXgoRldMX0hNVVRFWCBoTXV0ZXgpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUglGV0xfVW5sb2NrTXV0ZXgoRldMX0hNVVRFWCBoTXV0ZXgpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBGV0xfVW5sb2NrTXV0ZXgoRldMX0hNVVRFWCBoTXV0ZXgpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUglGV0xfSXNMb2NrZWRNdXRleChGV0xfSE1VVEVYIGhNdXRleCwgRlhfQk9PTCAmYkxvY2tlZCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIEZXTF9Jc0xvY2tlZE11dGV4KEZXTF9ITVVURVggaE11dGV4LCBGWF9CT09MJiBiTG9ja2VkKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9IU0VNQVBIT1JFIEZXTF9DcmVhdGVTZW1hcGhvcmUoKQ0KLXsNCi0gICAgcmV0dXJuIChGV0xfSFNFTUFQSE9SRSkgSUZXTF9BZGFwdGVyU2VtYXBob3JlOjpDcmVhdGUoKTsNCitGV0xfSFNFTUFQSE9SRSBGV0xfQ3JlYXRlU2VtYXBob3JlKCkgew0KKyAgcmV0dXJuIChGV0xfSFNFTUFQSE9SRSlJRldMX0FkYXB0ZXJTZW1hcGhvcmU6OkNyZWF0ZSgpOw0KIH0NCi1GV0xfRVJSCUZXTF9EZXN0cm95U2VtYXBob3JlKEZXTF9IU0VNQVBIT1JFIGhTZW1hcGhvcmUpDQotew0KLSAgICByZXR1cm4gKChJRldMX0FkYXB0ZXJTZW1hcGhvcmUqKWhTZW1hcGhvcmUpLT5EZXN0cm95KCk7DQorRldMX0VSUiBGV0xfRGVzdHJveVNlbWFwaG9yZShGV0xfSFNFTUFQSE9SRSBoU2VtYXBob3JlKSB7DQorICByZXR1cm4gKChJRldMX0FkYXB0ZXJTZW1hcGhvcmUqKWhTZW1hcGhvcmUpLT5EZXN0cm95KCk7DQogfQ0KLUZXTF9FUlIJRldMX1dhaXRTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSkNCi17DQotICAgIHJldHVybiAoKElGV0xfQWRhcHRlclNlbWFwaG9yZSopaFNlbWFwaG9yZSktPldhaXQoKTsNCitGV0xfRVJSIEZXTF9XYWl0U2VtYXBob3JlKEZXTF9IU0VNQVBIT1JFIGhTZW1hcGhvcmUpIHsNCisgIHJldHVybiAoKElGV0xfQWRhcHRlclNlbWFwaG9yZSopaFNlbWFwaG9yZSktPldhaXQoKTsNCiB9DQotRldMX0VSUglGV0xfUG9zdFNlbWFwaG9yZShGV0xfSFNFTUFQSE9SRSBoU2VtYXBob3JlLCBpbnQzMl90IGRvd24gKQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9BZGFwdGVyU2VtYXBob3JlKiloU2VtYXBob3JlKS0+UG9zdCgpOw0KK0ZXTF9FUlIgRldMX1Bvc3RTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSwgaW50MzJfdCBkb3duKSB7DQorICByZXR1cm4gKChJRldMX0FkYXB0ZXJTZW1hcGhvcmUqKWhTZW1hcGhvcmUpLT5Qb3N0KCk7DQogfQ0KLUZXTF9FUlIJRldMX0dldFNlbWFwaG9yZVZhbHVlKEZXTF9IU0VNQVBIT1JFIGhTZW1hcGhvcmUsIGludDMyX3QgJnZhbHVlKQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9BZGFwdGVyU2VtYXBob3JlKiloU2VtYXBob3JlKS0+VmFsdWUoKEZYX0RXT1JEICYpdmFsdWUpOw0KK0ZXTF9FUlIgRldMX0dldFNlbWFwaG9yZVZhbHVlKEZXTF9IU0VNQVBIT1JFIGhTZW1hcGhvcmUsIGludDMyX3QmIHZhbHVlKSB7DQorICByZXR1cm4gKChJRldMX0FkYXB0ZXJTZW1hcGhvcmUqKWhTZW1hcGhvcmUpLT5WYWx1ZSgoRlhfRFdPUkQmKXZhbHVlKTsNCiB9DQotRldMX0VSUglGV0xfUmVzZXRTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSwgaW50MzJfdCBpbml0KQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9BZGFwdGVyU2VtYXBob3JlKiloU2VtYXBob3JlKS0+UmVzZXQoaW5pdCk7DQorRldMX0VSUiBGV0xfUmVzZXRTZW1hcGhvcmUoRldMX0hTRU1BUEhPUkUgaFNlbWFwaG9yZSwgaW50MzJfdCBpbml0KSB7DQorICByZXR1cm4gKChJRldMX0FkYXB0ZXJTZW1hcGhvcmUqKWhTZW1hcGhvcmUpLT5SZXNldChpbml0KTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RpbWVyaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90aW1lcmltcC5jcHAKaW5kZXggMzAwYWI1Yy4uNjQzMDE3NiAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RpbWVyaW1wLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfdGltZXJpbXAuY3BwCkBAIC04LDIxICs4LDIxIEBACiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX3RocmVhZGltcC5oIg0KICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9hcHBpbXAuaCINCi1GV0xfSFRJTUVSIEZXTF9TdGFydFRpbWVyKElGV0xfVGltZXIgKnBUaW1lciwgRlhfRFdPUkQgZHdFbGFwc2UsIEZYX0JPT0wgYkltbWVkaWF0ZWx5ICkNCi17DQotICAgIElGV0xfQWRhcHRlck5hdGl2ZSAqcEFkYXB0ZXJOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBBZGFwdGVyTmF0aXZlLCBOVUxMKTsNCi0gICAgSUZXTF9BZGFwdGVyVGltZXJNZ3IgKnBBZGFwdGVyVGltZXJNZ3IgPSBwQWRhcHRlck5hdGl2ZS0+R2V0VGltZXJNZ3IoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQWRhcHRlclRpbWVyTWdyLCBOVUxMKTsNCi0gICAgRldMX0hUSU1FUiBoVGltZXIgPSBOVUxMOw0KLSAgICBwQWRhcHRlclRpbWVyTWdyLT5TdGFydChwVGltZXIsIGR3RWxhcHNlLCBoVGltZXIsIGJJbW1lZGlhdGVseSk7DQotICAgIHJldHVybiBoVGltZXI7DQorRldMX0hUSU1FUiBGV0xfU3RhcnRUaW1lcihJRldMX1RpbWVyKiBwVGltZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0VsYXBzZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltbWVkaWF0ZWx5KSB7DQorICBJRldMX0FkYXB0ZXJOYXRpdmUqIHBBZGFwdGVyTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEFkYXB0ZXJOYXRpdmUsIE5VTEwpOw0KKyAgSUZXTF9BZGFwdGVyVGltZXJNZ3IqIHBBZGFwdGVyVGltZXJNZ3IgPSBwQWRhcHRlck5hdGl2ZS0+R2V0VGltZXJNZ3IoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEFkYXB0ZXJUaW1lck1nciwgTlVMTCk7DQorICBGV0xfSFRJTUVSIGhUaW1lciA9IE5VTEw7DQorICBwQWRhcHRlclRpbWVyTWdyLT5TdGFydChwVGltZXIsIGR3RWxhcHNlLCBoVGltZXIsIGJJbW1lZGlhdGVseSk7DQorICByZXR1cm4gaFRpbWVyOw0KIH0NCi1pbnQzMl90IEZXTF9TdG9wVGltZXIoRldMX0hUSU1FUiBoVGltZXIpDQotew0KLSAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKnBBZGFwdGVyTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQWRhcHRlck5hdGl2ZSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgSUZXTF9BZGFwdGVyVGltZXJNZ3IgKnBBZGFwdGVyVGltZXJNZ3IgPSBwQWRhcHRlck5hdGl2ZS0+R2V0VGltZXJNZ3IoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQWRhcHRlclRpbWVyTWdyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gcEFkYXB0ZXJUaW1lck1nci0+U3RvcChoVGltZXIpOw0KK2ludDMyX3QgRldMX1N0b3BUaW1lcihGV0xfSFRJTUVSIGhUaW1lcikgew0KKyAgSUZXTF9BZGFwdGVyTmF0aXZlKiBwQWRhcHRlck5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBBZGFwdGVyTmF0aXZlLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgSUZXTF9BZGFwdGVyVGltZXJNZ3IqIHBBZGFwdGVyVGltZXJNZ3IgPSBwQWRhcHRlck5hdGl2ZS0+R2V0VGltZXJNZ3IoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEFkYXB0ZXJUaW1lck1nciwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBwQWRhcHRlclRpbWVyTWdyLT5TdG9wKGhUaW1lcik7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF93aWRnZXRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldGltcC5jcHAKaW5kZXggZDk2NjI5Ni4uZTkwMWRhZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldGltcC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldGltcC5jcHAKQEAgLTExLDEyMDcgKzExLDExNTEgQEAKICNpbmNsdWRlICJpbmNsdWRlL2Z3bF9hcHBpbXAuaCINCiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KLUZXTF9FUlIJSUZXTF9XaWRnZXQ6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSApDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldFdpZGdldFJlY3QocmVjdCwgYkF1dG9TaXplKTsNCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpOw0KIH0NCi1GV0xfRVJSCUlGV0xfV2lkZ2V0OjpHZXRHbG9iYWxSZWN0KENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0R2xvYmFsUmVjdChyZWN0KTsNCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpHZXRHbG9iYWxSZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRHbG9iYWxSZWN0KHJlY3QpOw0KIH0NCi1GV0xfRVJSCUlGV0xfV2lkZ2V0OjpTZXRXaWRnZXRSZWN0KGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+U2V0V2lkZ2V0UmVjdChyZWN0KTsNCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpTZXRXaWRnZXRSZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5TZXRXaWRnZXRSZWN0KHJlY3QpOw0KIH0NCi1GV0xfRVJSCUlGV0xfV2lkZ2V0OjpHZXRDbGllbnRSZWN0KENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0Q2xpZW50UmVjdChyZWN0KTsNCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpHZXRDbGllbnRSZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRDbGllbnRSZWN0KHJlY3QpOw0KIH0NCi1JRldMX1dpZGdldCogSUZXTF9XaWRnZXQ6OkdldFBhcmVudCgpDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldFBhcmVudCgpOw0KK0lGV0xfV2lkZ2V0KiBJRldMX1dpZGdldDo6R2V0UGFyZW50KCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRQYXJlbnQoKTsNCiB9DQotRldMX0VSUglJRldMX1dpZGdldDo6U2V0UGFyZW50KElGV0xfV2lkZ2V0ICpwUGFyZW50KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5TZXRQYXJlbnQocFBhcmVudCk7DQorRldMX0VSUiBJRldMX1dpZGdldDo6U2V0UGFyZW50KElGV0xfV2lkZ2V0KiBwUGFyZW50KSB7DQorICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldFBhcmVudChwUGFyZW50KTsNCiB9DQotSUZXTF9XaWRnZXQqIElGV0xfV2lkZ2V0OjpHZXRPd25lcigpDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldE93bmVyKCk7DQorSUZXTF9XaWRnZXQqIElGV0xfV2lkZ2V0OjpHZXRPd25lcigpIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0T3duZXIoKTsNCiB9DQotRldMX0VSUglJRldMX1dpZGdldDo6U2V0T3duZXIoSUZXTF9XaWRnZXQgKnBPd25lcikNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+U2V0T3duZXIocE93bmVyKTsNCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpTZXRPd25lcihJRldMX1dpZGdldCogcE93bmVyKSB7DQorICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldE93bmVyKHBPd25lcik7DQogfQ0KLUlGV0xfV2lkZ2V0KiBJRldMX1dpZGdldDo6R2V0T3V0ZXIoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRPdXRlcigpOw0KK0lGV0xfV2lkZ2V0KiBJRldMX1dpZGdldDo6R2V0T3V0ZXIoKSB7DQorICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldE91dGVyKCk7DQogfQ0KLUZYX0RXT1JEIElGV0xfV2lkZ2V0OjpHZXRTdHlsZXMoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRTdHlsZXMoKTsNCitGWF9EV09SRCBJRldMX1dpZGdldDo6R2V0U3R5bGVzKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRTdHlsZXMoKTsNCiB9DQotRldMX0VSUglJRldMX1dpZGdldDo6TW9kaWZ5U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzQWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzUmVtb3ZlZCkNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+TW9kaWZ5U3R5bGVzKGR3U3R5bGVzQWRkZWQsIGR3U3R5bGVzUmVtb3ZlZCk7DQorRldMX0VSUiBJRldMX1dpZGdldDo6TW9kaWZ5U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzQWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzUmVtb3ZlZCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpDQorICAgICAgLT5Nb2RpZnlTdHlsZXMoZHdTdHlsZXNBZGRlZCwgZHdTdHlsZXNSZW1vdmVkKTsNCiB9DQotRlhfRFdPUkQgSUZXTF9XaWRnZXQ6OkdldFN0eWxlc0V4KCkNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0U3R5bGVzRXgoKTsNCitGWF9EV09SRCBJRldMX1dpZGdldDo6R2V0U3R5bGVzRXgoKSB7DQorICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldFN0eWxlc0V4KCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9XaWRnZXQ6Ok1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPk1vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KK0ZXTF9FUlIgSUZXTF9XaWRnZXQ6Ok1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpDQorICAgICAgLT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCiB9DQotRlhfRFdPUkQgSUZXTF9XaWRnZXQ6OkdldFN0YXRlcygpDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldFN0YXRlcygpOw0KK0ZYX0RXT1JEIElGV0xfV2lkZ2V0OjpHZXRTdGF0ZXMoKSB7DQorICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldFN0YXRlcygpOw0KIH0NCi1GV0xfRVJSCUlGV0xfV2lkZ2V0OjpTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCApDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorRldMX0VSUiBJRldMX1dpZGdldDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQpIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+U2V0U3RhdGVzKGR3U3RhdGVzLCBiU2V0KTsNCiB9DQotRldMX0VSUglJRldMX1dpZGdldDo6U2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkLCB2b2lkKiBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldFByaXZhdGVEYXRhKG1vZHVsZV9pZCwgcERhdGEsIGNhbGxiYWNrKTsNCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpTZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+U2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkLCBwRGF0YSwgY2FsbGJhY2spOw0KIH0NCi12b2lkKiBJRldMX1dpZGdldDo6R2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRQcml2YXRlRGF0YShtb2R1bGVfaWQpOw0KK3ZvaWQqIElGV0xfV2lkZ2V0OjpHZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkKTsNCiB9DQotRldMX0VSUglJRldMX1dpZGdldDo6VXBkYXRlKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+VXBkYXRlKCk7DQorRldMX0VSUiBJRldMX1dpZGdldDo6VXBkYXRlKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5VcGRhdGUoKTsNCiB9DQotRldMX0VSUglJRldMX1dpZGdldDo6TG9ja1VwZGF0ZSgpDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkxvY2tVcGRhdGUoKTsNCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpMb2NrVXBkYXRlKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5Mb2NrVXBkYXRlKCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9XaWRnZXQ6OlVubG9ja1VwZGF0ZSgpDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlVubG9ja1VwZGF0ZSgpOw0KK0ZXTF9FUlIgSUZXTF9XaWRnZXQ6OlVubG9ja1VwZGF0ZSgpIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+VW5sb2NrVXBkYXRlKCk7DQogfQ0KLUZYX0RXT1JEIElGV0xfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+SGl0VGVzdChmeCwgZnkpOw0KK0ZYX0RXT1JEIElGV0xfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5IaXRUZXN0KGZ4LCBmeSk7DQogfQ0KLUZXTF9FUlIJSUZXTF9XaWRnZXQ6OlRyYW5zZm9ybVRvKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSkNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+VHJhbnNmb3JtVG8ocFdpZGdldCwgZngsIGZ5KTsNCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZ5KSB7DQorICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlRyYW5zZm9ybVRvKHBXaWRnZXQsIGZ4LCBmeSk7DQogfQ0KLUZXTF9FUlIJSUZXTF9XaWRnZXQ6OlRyYW5zZm9ybVRvKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0KQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5UcmFuc2Zvcm1UbyhwV2lkZ2V0LCBydCk7DQorRldMX0VSUiBJRldMX1dpZGdldDo6VHJhbnNmb3JtVG8oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcnQpIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+VHJhbnNmb3JtVG8ocFdpZGdldCwgcnQpOw0KIH0NCi1GV0xfRVJSCUlGV0xfV2lkZ2V0OjpHZXRNYXRyaXgoQ0ZYX01hdHJpeCAmbWF0cml4LCBGWF9CT09MIGJHbG9iYWwgKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5HZXRNYXRyaXgobWF0cml4LCBiR2xvYmFsKTsNCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpHZXRNYXRyaXgoQ0ZYX01hdHJpeCYgbWF0cml4LCBGWF9CT09MIGJHbG9iYWwpIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0TWF0cml4KG1hdHJpeCwgYkdsb2JhbCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9XaWRnZXQ6OlNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldE1hdHJpeChtYXRyaXgpOw0KK0ZXTF9FUlIgSUZXTF9XaWRnZXQ6OlNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+U2V0TWF0cml4KG1hdHJpeCk7DQogfQ0KLUZXTF9FUlIJSUZXTF9XaWRnZXQ6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorRldMX0VSUiBJRldMX1dpZGdldDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KIH0NCi1JRldMX1RoZW1lUHJvdmlkZXIqCUlGV0xfV2lkZ2V0OjpHZXRUaGVtZVByb3ZpZGVyKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0VGhlbWVQcm92aWRlcigpOw0KK0lGV0xfVGhlbWVQcm92aWRlciogSUZXTF9XaWRnZXQ6OkdldFRoZW1lUHJvdmlkZXIoKSB7DQorICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldFRoZW1lUHJvdmlkZXIoKTsNCiB9DQotRldMX0VSUglJRldMX1dpZGdldDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZVByb3ZpZGVyKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lUHJvdmlkZXIpIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+U2V0VGhlbWVQcm92aWRlcihwVGhlbWVQcm92aWRlcik7DQogfQ0KLUZXTF9FUlIJSUZXTF9XaWRnZXQ6OlNldERhdGFQcm92aWRlcihJRldMX0RhdGFQcm92aWRlciAqcERhdGFQcm92aWRlcikNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+U2V0RGF0YVByb3ZpZGVyKHBEYXRhUHJvdmlkZXIpOw0KK0ZXTF9FUlIgSUZXTF9XaWRnZXQ6OlNldERhdGFQcm92aWRlcihJRldMX0RhdGFQcm92aWRlciogcERhdGFQcm92aWRlcikgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5TZXREYXRhUHJvdmlkZXIocERhdGFQcm92aWRlcik7DQogfQ0KLUlGV0xfV2lkZ2V0RGVsZWdhdGUqIElGV0xfV2lkZ2V0OjpTZXREZWxlZ2F0ZShJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUpDQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPlNldERlbGVnYXRlKHBEZWxlZ2F0ZSk7DQorSUZXTF9XaWRnZXREZWxlZ2F0ZSogSUZXTF9XaWRnZXQ6OlNldERlbGVnYXRlKElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9XaWRnZXRJbXAqKW1fcERhdGEpLT5TZXREZWxlZ2F0ZShwRGVsZWdhdGUpOw0KIH0NCi1JRldMX05vdGVUaHJlYWQqIElGV0xfV2lkZ2V0OjpHZXRPd25lclRocmVhZCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldE93bmVyVGhyZWFkKCk7DQorSUZXTF9Ob3RlVGhyZWFkKiBJRldMX1dpZGdldDo6R2V0T3duZXJUaHJlYWQoKSBjb25zdCB7DQorICByZXR1cm4gKChDRldMX1dpZGdldEltcCopbV9wRGF0YSktPkdldE93bmVyVGhyZWFkKCk7DQogfQ0KLUNGWF9TaXplRiBJRldMX1dpZGdldDo6R2V0T2Zmc2V0RnJvbVBhcmVudChJRldMX1dpZGdldCAqcFBhcmVudCkNCi17DQotICAgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0T2Zmc2V0RnJvbVBhcmVudChwUGFyZW50KTsNCitDRlhfU2l6ZUYgSUZXTF9XaWRnZXQ6OkdldE9mZnNldEZyb21QYXJlbnQoSUZXTF9XaWRnZXQqIHBQYXJlbnQpIHsNCisgIHJldHVybiAoKENGV0xfV2lkZ2V0SW1wKiltX3BEYXRhKS0+R2V0T2Zmc2V0RnJvbVBhcmVudChwUGFyZW50KTsNCiB9DQotRldMX0VSUiBDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpDQotew0KLSAgICBJRldMX0FwcCAqcEFwcCA9IEZXTF9HZXRBcHAoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQXBwLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKnBBZGFwdGVyID0gcEFwcC0+R2V0QWRhcHRlck5hdGl2ZSgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBBZGFwdGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IgKnBBZGFwdGVyVGhyZWFkID0gcEFkYXB0ZXItPkdldFRocmVhZE1ncigpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBBZGFwdGVyVGhyZWFkLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBTZXRPd25lclRocmVhZCgoQ0ZXTF9Ob3RlVGhyZWFkKilwQWRhcHRlclRocmVhZC0+R2V0Q3VycmVudFRocmVhZCgpKTsNCi0gICAgSUZXTF9XaWRnZXQgKnBQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQ7DQotICAgIG1fcFdpZGdldE1nci0+SW5zZXJ0V2lkZ2V0KHBQYXJlbnQsIG1fcEludGVyZmFjZSk7DQotICAgIGlmICghSXNDaGlsZCgpKSB7DQotICAgICAgICB7DQotICAgICAgICAgICAgSUZXTF9XaWRnZXQgKnBPd25lciA9IG1fcFByb3BlcnRpZXMtPm1fcE93bmVyOw0KLSAgICAgICAgICAgIGlmIChwT3duZXIpIHsNCi0gICAgICAgICAgICAgICAgbV9wV2lkZ2V0TWdyLT5TZXRPd25lcihwT3duZXIsIG1fcEludGVyZmFjZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wV2lkZ2V0TWdyLT5DcmVhdGVXaWRnZXRfTmF0aXZlKG1fcEludGVyZmFjZSk7DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIElGV0xfQXBwKiBwQXBwID0gRldMX0dldEFwcCgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQXBwLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgSUZXTF9BZGFwdGVyTmF0aXZlKiBwQWRhcHRlciA9IHBBcHAtPkdldEFkYXB0ZXJOYXRpdmUoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEFkYXB0ZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IqIHBBZGFwdGVyVGhyZWFkID0gcEFkYXB0ZXItPkdldFRocmVhZE1ncigpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwQWRhcHRlclRocmVhZCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIFNldE93bmVyVGhyZWFkKChDRldMX05vdGVUaHJlYWQqKXBBZGFwdGVyVGhyZWFkLT5HZXRDdXJyZW50VGhyZWFkKCkpOw0KKyAgSUZXTF9XaWRnZXQqIHBQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQ7DQorICBtX3BXaWRnZXRNZ3ItPkluc2VydFdpZGdldChwUGFyZW50LCBtX3BJbnRlcmZhY2UpOw0KKyAgaWYgKCFJc0NoaWxkKCkpIHsNCisgICAgew0KKyAgICAgIElGV0xfV2lkZ2V0KiBwT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcjsNCisgICAgICBpZiAocE93bmVyKSB7DQorICAgICAgICBtX3BXaWRnZXRNZ3ItPlNldE93bmVyKHBPd25lciwgbV9wSW50ZXJmYWNlKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICBtX3BXaWRnZXRNZ3ItPkNyZWF0ZVdpZGdldF9OYXRpdmUobV9wSW50ZXJmYWNlKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKQ0KLXsNCi0gICAgTm90aWZ5RHJpdmVyKCk7DQotICAgIElGV0xfRm9ybSAqcEZvcm0gPSAoSUZXTF9Gb3JtICopRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQobV9wSW50ZXJmYWNlLCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQotICAgIGlmIChwRm9ybSAmJiBwRm9ybSAhPSBtX3BJbnRlcmZhY2UpIHsNCi0gICAgICAgIElGV0xfQ29udGVudCAqcENvbnRlbnQgPSBwRm9ybS0+R2V0Q29udGVudCgpOw0KLSAgICAgICAgaWYgKHBDb250ZW50KSB7DQotICAgICAgICAgICAgcENvbnRlbnQtPlJlbW92ZVdpZGdldChtX3BJbnRlcmZhY2UpOw0KLSAgICAgICAgfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCkgew0KKyAgTm90aWZ5RHJpdmVyKCk7DQorICBJRldMX0Zvcm0qIHBGb3JtID0gKElGV0xfRm9ybSopRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQoDQorICAgICAgbV9wSW50ZXJmYWNlLCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQorICBpZiAocEZvcm0gJiYgcEZvcm0gIT0gbV9wSW50ZXJmYWNlKSB7DQorICAgIElGV0xfQ29udGVudCogcENvbnRlbnQgPSBwRm9ybS0+R2V0Q29udGVudCgpOw0KKyAgICBpZiAocENvbnRlbnQpIHsNCisgICAgICBwQ29udGVudC0+UmVtb3ZlV2lkZ2V0KG1fcEludGVyZmFjZSk7DQogICAgIH0NCi0gICAgaWYgKCFJc0NoaWxkKCkpIHsNCi0gICAgICAgIG1fcFdpZGdldE1nci0+RGVzdHJveVdpZGdldF9OYXRpdmUobV9wSW50ZXJmYWNlKTsNCi0gICAgfQ0KLSAgICBtX3BXaWRnZXRNZ3ItPlJlbW92ZVdpZGdldChtX3BJbnRlcmZhY2UpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBpZiAoIUlzQ2hpbGQoKSkgew0KKyAgICBtX3BXaWRnZXRNZ3ItPkRlc3Ryb3lXaWRnZXRfTmF0aXZlKG1fcEludGVyZmFjZSk7DQorICB9DQorICBtX3BXaWRnZXRNZ3ItPlJlbW92ZVdpZGdldChtX3BJbnRlcmZhY2UpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgKQ0KLXsNCi0gICAgaWYgKGJBdXRvU2l6ZSkgew0KLSAgICAgICAgaWYgKEhhc0VkZ2UoKSkgew0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZFZGdlID0gR2V0RWRnZVdpZHRoKCk7DQotICAgICAgICAgICAgcmVjdC5JbmZsYXRlKGZFZGdlLCBmRWRnZSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoSGFzQm9yZGVyKCkpIHsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmQm9yZGVyID0gR2V0Qm9yZGVyU2l6ZSgpOw0KLSAgICAgICAgICAgIHJlY3QuSW5mbGF0ZShmQm9yZGVyLCBmQm9yZGVyKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUglDRldMX1dpZGdldEltcDo6R2V0R2xvYmFsUmVjdChDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBJRldMX1dpZGdldCAqcEZvcm0gPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChtX3BJbnRlcmZhY2UsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRm9ybSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmVjdC5TZXQoMCwgMCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KLSAgICBpZiAocEZvcm0gPT0gbV9wSW50ZXJmYWNlKSB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotICAgIH0NCi0gICAgcmV0dXJuIFRyYW5zZm9ybVRvKHBGb3JtLCByZWN0KTsNCi19DQotRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBDRlhfUmVjdEYgcnRPbGQgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0ID0gcmVjdDsNCi0gICAgaWYgKElzQ2hpbGQoKSkgew0KLSAgICAgICAgaWYgKEZYU1lTX2ZhYnMocnRPbGQud2lkdGggLSByZWN0LndpZHRoKSA+IDAuNWYgfHwgRlhTWVNfZmFicyhydE9sZC5oZWlnaHQgLSByZWN0LmhlaWdodCkgPiAwLjVmKSB7DQotICAgICAgICAgICAgQ0ZXTF9FdnRTaXplQ2hhbmdlZCBldjsNCi0gICAgICAgICAgICBldi5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgICAgICAgICAgZXYubV9ydE9sZCA9IHJ0T2xkOw0KLSAgICAgICAgICAgIGV2Lm1fcnROZXcgPSByZWN0Ow0KLSAgICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IFNldERlbGVnYXRlKE5VTEwpOw0KLSAgICAgICAgICAgIGlmIChwRGVsZWdhdGUpIHsNCi0gICAgICAgICAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NFdmVudCgmZXYpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICBtX3BXaWRnZXRNZ3ItPlNldFdpZGdldFJlY3RfTmF0aXZlKG1fcEludGVyZmFjZSwgcmVjdCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX1dpZGdldEltcDo6R2V0Q2xpZW50UmVjdChDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBHZXRFZGdlUmVjdChyZWN0KTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmIChiQXV0b1NpemUpIHsNCiAgICAgaWYgKEhhc0VkZ2UoKSkgew0KLSAgICAgICAgRlhfRkxPQVQgZkVkZ2UgPSBHZXRFZGdlV2lkdGgoKTsNCi0gICAgICAgIHJlY3QuRGVmbGF0ZShmRWRnZSwgZkVkZ2UpOw0KKyAgICAgIEZYX0ZMT0FUIGZFZGdlID0gR2V0RWRnZVdpZHRoKCk7DQorICAgICAgcmVjdC5JbmZsYXRlKGZFZGdlLCBmRWRnZSk7DQorICAgIH0NCisgICAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgICAgRlhfRkxPQVQgZkJvcmRlciA9IEdldEJvcmRlclNpemUoKTsNCisgICAgICByZWN0LkluZmxhdGUoZkJvcmRlciwgZkJvcmRlcik7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpHZXRHbG9iYWxSZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgSUZXTF9XaWRnZXQqIHBGb3JtID0NCisgICAgICBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChtX3BJbnRlcmZhY2UsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEZvcm0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZWN0LlNldCgwLCAwLCBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoLA0KKyAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KKyAgaWYgKHBGb3JtID09IG1fcEludGVyZmFjZSkgew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gVHJhbnNmb3JtVG8ocEZvcm0sIHJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRXaWRnZXRSZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgQ0ZYX1JlY3RGIHJ0T2xkID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQgPSByZWN0Ow0KKyAgaWYgKElzQ2hpbGQoKSkgew0KKyAgICBpZiAoRlhTWVNfZmFicyhydE9sZC53aWR0aCAtIHJlY3Qud2lkdGgpID4gMC41ZiB8fA0KKyAgICAgICAgRlhTWVNfZmFicyhydE9sZC5oZWlnaHQgLSByZWN0LmhlaWdodCkgPiAwLjVmKSB7DQorICAgICAgQ0ZXTF9FdnRTaXplQ2hhbmdlZCBldjsNCisgICAgICBldi5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgZXYubV9ydE9sZCA9IHJ0T2xkOw0KKyAgICAgIGV2Lm1fcnROZXcgPSByZWN0Ow0KKyAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IFNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgIGlmIChwRGVsZWdhdGUpIHsNCisgICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQoJmV2KTsNCisgICAgICB9DQogICAgIH0NCiAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgbV9wV2lkZ2V0TWdyLT5TZXRXaWRnZXRSZWN0X05hdGl2ZShtX3BJbnRlcmZhY2UsIHJlY3QpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1JRldMX1dpZGdldCogQ0ZXTF9XaWRnZXRJbXA6OkdldFBhcmVudCgpDQotew0KLSAgICByZXR1cm4gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQobV9wSW50ZXJmYWNlLCBGV0xfV0dUUkVMQVRJT05fUGFyZW50KTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpHZXRDbGllbnRSZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgR2V0RWRnZVJlY3QocmVjdCk7DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIEZYX0ZMT0FUIGZFZGdlID0gR2V0RWRnZVdpZHRoKCk7DQorICAgIHJlY3QuRGVmbGF0ZShmRWRnZSwgZkVkZ2UpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRQYXJlbnQoSUZXTF9XaWRnZXQqIHBQYXJlbnQpDQotew0KLSAgICBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQgPSBwUGFyZW50Ow0KLSAgICBtX3BXaWRnZXRNZ3ItPlNldFBhcmVudChwUGFyZW50LCBtX3BJbnRlcmZhY2UpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0SW1wOjpHZXRQYXJlbnQoKSB7DQorICByZXR1cm4gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQobV9wSW50ZXJmYWNlLCBGV0xfV0dUUkVMQVRJT05fUGFyZW50KTsNCiB9DQotSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0SW1wOjpHZXRPd25lcigpDQotew0KLSAgICByZXR1cm4gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQobV9wSW50ZXJmYWNlLCBGV0xfV0dUUkVMQVRJT05fT3duZXIpOw0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlNldFBhcmVudChJRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgbV9wUHJvcGVydGllcy0+bV9wUGFyZW50ID0gcFBhcmVudDsNCisgIG1fcFdpZGdldE1nci0+U2V0UGFyZW50KHBQYXJlbnQsIG1fcEludGVyZmFjZSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlNldE93bmVyKElGV0xfV2lkZ2V0KiBwT3duZXIpDQotew0KLSAgICBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lciA9IHBPd25lcjsNCi0gICAgbV9wV2lkZ2V0TWdyLT5TZXRPd25lcihwT3duZXIsIG1fcEludGVyZmFjZSk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitJRldMX1dpZGdldCogQ0ZXTF9XaWRnZXRJbXA6OkdldE93bmVyKCkgew0KKyAgcmV0dXJuIG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KG1fcEludGVyZmFjZSwgRldMX1dHVFJFTEFUSU9OX093bmVyKTsNCiB9DQotSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0SW1wOjpHZXRPdXRlcigpDQotew0KLSAgICByZXR1cm4gbV9wT3V0ZXI7DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0T3duZXIoSUZXTF9XaWRnZXQqIHBPd25lcikgew0KKyAgbV9wUHJvcGVydGllcy0+bV9wT3duZXIgPSBwT3duZXI7DQorICBtX3BXaWRnZXRNZ3ItPlNldE93bmVyKHBPd25lciwgbV9wSW50ZXJmYWNlKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRFdPUkQgQ0ZXTF9XaWRnZXRJbXA6OkdldFN0eWxlcygpDQotew0KLSAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCitJRldMX1dpZGdldCogQ0ZXTF9XaWRnZXRJbXA6OkdldE91dGVyKCkgew0KKyAgcmV0dXJuIG1fcE91dGVyOw0KIH0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpNb2RpZnlTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXNBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNSZW1vdmVkKQ0KLXsNCi0gICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgfmR3U3R5bGVzUmVtb3ZlZCkgfCBkd1N0eWxlc0FkZGVkOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXRJbXA6OkdldFN0eWxlcygpIHsNCisgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzOw0KIH0NCi1GWF9EV09SRCBDRldMX1dpZGdldEltcDo6R2V0U3R5bGVzRXgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6TW9kaWZ5U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzQWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzUmVtb3ZlZCkgew0KKyAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyA9DQorICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiB+ZHdTdHlsZXNSZW1vdmVkKSB8IGR3U3R5bGVzQWRkZWQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6Ok1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpDQotew0KLSAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzID0gKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiB+ZHdTdHlsZXNFeFJlbW92ZWQpIHwgZHdTdHlsZXNFeEFkZGVkOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXRJbXA6OkdldFN0eWxlc0V4KCkgew0KKyAgcmV0dXJuIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQogfQ0KLUZYX0RXT1JEIENGV0xfV2lkZ2V0SW1wOjpHZXRTdGF0ZXMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKSB7DQorICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzID0NCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIH5kd1N0eWxlc0V4UmVtb3ZlZCkgfCBkd1N0eWxlc0V4QWRkZWQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLXN0YXRpYyB2b2lkIE5vdGlmeUhpZGVDaGlsZFdpZGdldChJRldMX1dpZGdldE1nciAqd2lkZ2V0TWdyLCBJRldMX1dpZGdldCAqd2lkZ2V0LCBDRldMX05vdGVEcml2ZXIgKm5vdGVEcml2ZXIpDQotew0KLSAgICBJRldMX1dpZGdldCAqY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldCh3aWRnZXQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCi0gICAgd2hpbGUgKGNoaWxkKSB7DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXRJbXA6OkdldFN0YXRlcygpIHsNCisgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KK30NCitzdGF0aWMgdm9pZCBOb3RpZnlIaWRlQ2hpbGRXaWRnZXQoSUZXTF9XaWRnZXRNZ3IqIHdpZGdldE1nciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZXTF9Ob3RlRHJpdmVyKiBub3RlRHJpdmVyKSB7DQorICBJRldMX1dpZGdldCogY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldCh3aWRnZXQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChjaGlsZCkgew0KKyAgICBub3RlRHJpdmVyLT5Ob3RpZnlUYXJnZXRIaWRlKGNoaWxkKTsNCisgICAgTm90aWZ5SGlkZUNoaWxkV2lkZ2V0KHdpZGdldE1nciwgY2hpbGQsIG5vdGVEcml2ZXIpOw0KKyAgICBjaGlsZCA9IHdpZGdldE1nci0+R2V0V2lkZ2V0KGNoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCkgew0KKyAgYlNldCA/IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IGR3U3RhdGVzKQ0KKyAgICAgICA6IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5kd1N0YXRlcyk7DQorICBGV0xfRVJSIHJldCA9IEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgaWYgKGR3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgew0KKyAgICBpZiAoYlNldCkgew0KKyAgICAgIHJldCA9IG1fcFdpZGdldE1nci0+SGlkZVdpZGdldF9OYXRpdmUobV9wSW50ZXJmYWNlKTsNCisgICAgICBDRldMX05vdGVEcml2ZXIqIG5vdGVEcml2ZXIgPQ0KKyAgICAgICAgICAoQ0ZXTF9Ob3RlRHJpdmVyKilHZXRPd25lclRocmVhZCgpLT5HZXROb3RlRHJpdmVyKCk7DQorICAgICAgSUZXTF9XaWRnZXRNZ3IqIHdpZGdldE1nciA9IEZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgICBub3RlRHJpdmVyLT5Ob3RpZnlUYXJnZXRIaWRlKG1fcEludGVyZmFjZSk7DQorICAgICAgSUZXTF9XaWRnZXQqIGNoaWxkID0NCisgICAgICAgICAgd2lkZ2V0TWdyLT5HZXRXaWRnZXQobV9wSW50ZXJmYWNlLCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICAgICAgd2hpbGUgKGNoaWxkKSB7DQogICAgICAgICBub3RlRHJpdmVyLT5Ob3RpZnlUYXJnZXRIaWRlKGNoaWxkKTsNCiAgICAgICAgIE5vdGlmeUhpZGVDaGlsZFdpZGdldCh3aWRnZXRNZ3IsIGNoaWxkLCBub3RlRHJpdmVyKTsNCiAgICAgICAgIGNoaWxkID0gd2lkZ2V0TWdyLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQotICAgIH0NCi19DQotRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgKQ0KLXsNCi0gICAgYlNldCA/IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IGR3U3RhdGVzKSA6IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5kd1N0YXRlcyk7DQotICAgIEZXTF9FUlIgcmV0ID0gRldMX0VSUl9TdWNjZWVkZWQ7DQotICAgIGlmIChkd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpIHsNCi0gICAgICAgIGlmIChiU2V0KSB7DQotICAgICAgICAgICAgcmV0ID0gbV9wV2lkZ2V0TWdyLT5IaWRlV2lkZ2V0X05hdGl2ZShtX3BJbnRlcmZhY2UpOw0KLSAgICAgICAgICAgIENGV0xfTm90ZURyaXZlciAqbm90ZURyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKUdldE93bmVyVGhyZWFkKCktPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgICAgICAgICBJRldMX1dpZGdldE1nciAqd2lkZ2V0TWdyID0gRldMX0dldFdpZGdldE1ncigpOw0KLSAgICAgICAgICAgIG5vdGVEcml2ZXItPk5vdGlmeVRhcmdldEhpZGUobV9wSW50ZXJmYWNlKTsNCi0gICAgICAgICAgICBJRldMX1dpZGdldCAqY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldChtX3BJbnRlcmZhY2UsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCi0gICAgICAgICAgICB3aGlsZSAoY2hpbGQpIHsNCi0gICAgICAgICAgICAgICAgbm90ZURyaXZlci0+Tm90aWZ5VGFyZ2V0SGlkZShjaGlsZCk7DQotICAgICAgICAgICAgICAgIE5vdGlmeUhpZGVDaGlsZFdpZGdldCh3aWRnZXRNZ3IsIGNoaWxkLCBub3RlRHJpdmVyKTsNCi0gICAgICAgICAgICAgICAgY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldCA9IG1fcFdpZGdldE1nci0+U2hvd1dpZGdldF9OYXRpdmUobV9wSW50ZXJmYWNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcmV0Ow0KLX0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQsIHZvaWQqIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaykNCi17DQotICAgIGlmICghbV9wUHJpdmF0ZURhdGEpIHsNCi0gICAgICAgIG1fcFByaXZhdGVEYXRhID0gbmV3IENGWF9Qcml2YXRlRGF0YTsNCi0gICAgfQ0KLSAgICBtX3BQcml2YXRlRGF0YS0+U2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkLCBwRGF0YSwgY2FsbGJhY2spOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLXZvaWQqIENGV0xfV2lkZ2V0SW1wOjpHZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByaXZhdGVEYXRhLCBOVUxMKTsNCi0gICAgcmV0dXJuIG1fcFByaXZhdGVEYXRhLT5HZXRQcml2YXRlRGF0YShtb2R1bGVfaWQpOw0KLX0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpVcGRhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpMb2NrVXBkYXRlKCkNCi17DQotICAgIG1faUxvY2srKzsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpVbmxvY2tVcGRhdGUoKQ0KLXsNCi0gICAgaWYgKElzTG9ja2VkKCkpIHsNCi0gICAgICAgIG1faUxvY2stLTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0RXT1JEIENGV0xfV2lkZ2V0SW1wOjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIENGWF9SZWN0RiBydENsaWVudDsNCi0gICAgR2V0Q2xpZW50UmVjdChydENsaWVudCk7DQotICAgIGlmIChydENsaWVudC5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KLSAgICB9DQotICAgIGlmIChIYXNFZGdlKCkpIHsNCi0gICAgICAgIENGWF9SZWN0RiBydEVkZ2U7DQotICAgICAgICBHZXRFZGdlUmVjdChydEVkZ2UpOw0KLSAgICAgICAgaWYgKHJ0RWRnZS5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0VkZ2U7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKEhhc0JvcmRlcigpKSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRSZWxhdGl2ZTsNCi0gICAgICAgIEdldFJlbGF0aXZlUmVjdChydFJlbGF0aXZlKTsNCi0gICAgICAgIGlmIChydFJlbGF0aXZlLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQm9yZGVyOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KLX0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQotew0KLSAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQotICAgICAgICBDRlhfU2l6ZUYgc3pPZmZzZXQ7DQotICAgICAgICBpZiAoSXNQYXJlbnQocFdpZGdldCkpIHsNCi0gICAgICAgICAgICBzek9mZnNldCA9IEdldE9mZnNldEZyb21QYXJlbnQocFdpZGdldCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHN6T2Zmc2V0ID0gKChJRldMX1dpZGdldCopcFdpZGdldCktPkdldE9mZnNldEZyb21QYXJlbnQobV9wSW50ZXJmYWNlKTsNCi0gICAgICAgICAgICBzek9mZnNldC54ID0gLXN6T2Zmc2V0Lng7DQotICAgICAgICAgICAgc3pPZmZzZXQueSA9IC1zek9mZnNldC55Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZnggKz0gc3pPZmZzZXQueDsNCi0gICAgICAgIGZ5ICs9IHN6T2Zmc2V0Lnk7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGCXI7DQotICAgIENGWF9NYXRyaXgJbTsNCi0gICAgSUZXTF9XaWRnZXQgKiBwYXJlbnQgPSBHZXRQYXJlbnQoKTsNCi0gICAgaWYgKHBhcmVudCkgew0KLSAgICAgICAgR2V0V2lkZ2V0UmVjdChyKTsNCi0gICAgICAgIGZ4ICs9IHIubGVmdDsNCi0gICAgICAgIGZ5ICs9IHIudG9wOw0KLSAgICAgICAgR2V0TWF0cml4KG0sIFRSVUUpOw0KLSAgICAgICAgbS5UcmFuc2Zvcm1Qb2ludChmeCwgZnkpOw0KLSAgICB9DQotICAgIElGV0xfV2lkZ2V0ICogZm9ybTEgPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChtX3BJbnRlcmZhY2UsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChmb3JtMSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKCFwV2lkZ2V0KSB7DQotICAgICAgICBmb3JtMS0+R2V0V2lkZ2V0UmVjdChyKTsNCi0gICAgICAgIGZ4ICs9IHIubGVmdDsNCi0gICAgICAgIGZ5ICs9IHIudG9wOw0KLSNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQotICAgICAgICBpZiAoZm9ybTEtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0NhcHRpb24pIHsNCi0gICAgICAgICAgICBGWF9GTE9BVCBsLCB0LCByLCBiOw0KLSAgICAgICAgICAgIGwgPSB0ID0gciA9IGIgPSAwOw0KLSAgICAgICAgICAgIEZXTF9HZXRBZGFwdGVyV2lkZ2V0TWdyKCktPkdldFN5c3RlbUJvcmRlcihsLCB0LCByLCBiKTsNCi0gICAgICAgICAgICBmeSArPSB0Ow0KLSAgICAgICAgfQ0KLSNlbmRpZg0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLSAgICB9DQotICAgIElGV0xfV2lkZ2V0ICogZm9ybTIgPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChwV2lkZ2V0LCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZm9ybTIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGlmIChmb3JtMSAhPSBmb3JtMikgew0KLSAgICAgICAgZm9ybTEtPkdldFdpZGdldFJlY3Qocik7DQotICAgICAgICBmeCArPSByLmxlZnQ7DQotICAgICAgICBmeSArPSByLnRvcDsNCi0gICAgICAgIGZvcm0yLT5HZXRXaWRnZXRSZWN0KHIpOw0KLSAgICAgICAgZnggLT0gci5sZWZ0Ow0KLSAgICAgICAgZnkgLT0gci50b3A7DQotI2lmZGVmIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXINCi0gICAgICAgIGlmICgoZm9ybTEtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0NhcHRpb24pICE9IChmb3JtMi0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfQ2FwdGlvbikpIHsNCi0gICAgICAgICAgICBGWF9GTE9BVCBsLCB0LCByLCBiOw0KLSAgICAgICAgICAgIGwgPSB0ID0gciA9IGIgPSAwOw0KLSAgICAgICAgICAgIEZXTF9HZXRBZGFwdGVyV2lkZ2V0TWdyKCktPkdldFN5c3RlbUJvcmRlcihsLCB0LCByLCBiKTsNCi0gICAgICAgICAgICAoZm9ybTEtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0NhcHRpb24pID8gKGZ5ICs9IHQpIDogKGZ5IC09IHQpOw0KLSAgICAgICAgfQ0KLSNlbmRpZg0KLSAgICB9DQotICAgIHBhcmVudCA9IHBXaWRnZXQtPkdldFBhcmVudCgpOw0KLSAgICBpZiAocGFyZW50KSB7DQotICAgICAgICBwV2lkZ2V0LT5HZXRNYXRyaXgobSwgVFJVRSk7DQotICAgICAgICBDRlhfTWF0cml4IG0xOw0KLSAgICAgICAgbTEuUmVzZXQoKTsNCi0gICAgICAgIG0xLlNldFJldmVyc2UobSk7DQotICAgICAgICBtMS5UcmFuc2Zvcm1Qb2ludChmeCwgZnkpOw0KLSAgICAgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChyKTsNCi0gICAgICAgIGZ4IC09IHIubGVmdDsNCi0gICAgICAgIGZ5IC09IHIudG9wOw0KLSAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX1dpZGdldEltcDo6VHJhbnNmb3JtVG8oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcnQpDQotew0KLSAgICByZXR1cm4gVHJhbnNmb3JtVG8ocFdpZGdldCwgcnQubGVmdCwgcnQudG9wKTsNCi19DQotRldMX0VSUglDRldMX1dpZGdldEltcDo6R2V0TWF0cml4KENGWF9NYXRyaXggJm1hdHJpeCwgRlhfQk9PTCBiR2xvYmFsICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKGJHbG9iYWwpIHsNCi0gICAgICAgIElGV0xfV2lkZ2V0ICogcGFyZW50ID0gR2V0UGFyZW50KCk7DQotICAgICAgICBDRlhfUHRyQXJyYXkJcGFyZW50czsNCi0gICAgICAgIHdoaWxlIChwYXJlbnQpIHsNCi0gICAgICAgICAgICBwYXJlbnRzLkFkZChwYXJlbnQpOw0KLSAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC0+R2V0UGFyZW50KCk7DQotICAgICAgICB9DQotICAgICAgICBtYXRyaXguUmVzZXQoKTsNCi0gICAgICAgIENGWF9NYXRyaXggY3RtT25QYXJlbnQ7DQotICAgICAgICBDRlhfUmVjdEYgcmVjdDsNCi0gICAgICAgIGludDMyX3QgY291bnQgPSBwYXJlbnRzLkdldFNpemUoKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gY291bnQgLSAyOyBpID49IDA7IGktLSkgew0KLSAgICAgICAgICAgIHBhcmVudCA9IChJRldMX1dpZGdldCAqKSBwYXJlbnRzLkdldEF0KGkpOw0KLSAgICAgICAgICAgIHBhcmVudC0+R2V0TWF0cml4KGN0bU9uUGFyZW50LCBGQUxTRSk7DQotICAgICAgICAgICAgcGFyZW50LT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KLSAgICAgICAgICAgIG1hdHJpeC5Db25jYXQoY3RtT25QYXJlbnQsIFRSVUUpOw0KLSAgICAgICAgICAgIG1hdHJpeC5UcmFuc2xhdGUocmVjdC5sZWZ0LCByZWN0LnRvcCwgVFJVRSk7DQotICAgICAgICB9DQotICAgICAgICBtYXRyaXguQ29uY2F0KG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQsIFRSVUUpOw0KLSAgICAgICAgcGFyZW50cy5SZW1vdmVBbGwoKTsNCisgICAgICB9DQogICAgIH0gZWxzZSB7DQotICAgICAgICBtYXRyaXggPSBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50Ow0KKyAgICAgIHJldCA9IG1fcFdpZGdldE1nci0+U2hvd1dpZGdldF9OYXRpdmUobV9wSW50ZXJmYWNlKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gcmV0Ow0KIH0NCi1GV0xfRVJSCUNGV0xfV2lkZ2V0SW1wOjpTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BQcm9wZXJ0aWVzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBJRldMX1dpZGdldCAqIHBhcmVudCA9IEdldFBhcmVudCgpOw0KLSAgICBpZiAoIXBhcmVudCkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCi0gICAgfQ0KLSAgICBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50ID0gbWF0cml4Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKSB7DQorICBpZiAoIW1fcFByaXZhdGVEYXRhKSB7DQorICAgIG1fcFByaXZhdGVEYXRhID0gbmV3IENGWF9Qcml2YXRlRGF0YTsNCisgIH0NCisgIG1fcFByaXZhdGVEYXRhLT5TZXRQcml2YXRlRGF0YShtb2R1bGVfaWQsIHBEYXRhLCBjYWxsYmFjayk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCit2b2lkKiBDRldMX1dpZGdldEltcDo6R2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByaXZhdGVEYXRhLCBOVUxMKTsNCisgIHJldHVybiBtX3BQcml2YXRlRGF0YS0+R2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkKTsNCiB9DQotSUZXTF9UaGVtZVByb3ZpZGVyKiBDRldMX1dpZGdldEltcDo6R2V0VGhlbWVQcm92aWRlcigpDQotew0KLSAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpVcGRhdGUoKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWVQcm92aWRlcikNCi17DQotICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBwVGhlbWVQcm92aWRlcjsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OkxvY2tVcGRhdGUoKSB7DQorICBtX2lMb2NrKys7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlNldERhdGFQcm92aWRlcihJRldMX0RhdGFQcm92aWRlciAqcERhdGFQcm92aWRlcikNCi17DQotICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlciA9IHBEYXRhUHJvdmlkZXI7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpVbmxvY2tVcGRhdGUoKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICBtX2lMb2NrLS07DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUlGV0xfV2lkZ2V0RGVsZWdhdGUqIENGV0xfV2lkZ2V0SW1wOjpTZXREZWxlZ2F0ZShJRldMX1dpZGdldERlbGVnYXRlICpwRGVsZWdhdGUpDQotew0KLSAgICBpZiAoIW1fcEN1ckRlbGVnYXRlKSB7DQotICAgICAgICBtX3BDdXJEZWxlZ2F0ZSA9IG1fcERlbGVnYXRlOw0KLSAgICB9DQotICAgIGlmICghcERlbGVnYXRlKSB7DQotICAgICAgICByZXR1cm4gbV9wQ3VyRGVsZWdhdGU7DQotICAgIH0NCi0gICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcE9sZERlbGVnYXRlID0gbV9wQ3VyRGVsZWdhdGU7DQotICAgIG1fcEN1ckRlbGVnYXRlID0gcERlbGVnYXRlOw0KLSAgICByZXR1cm4gcE9sZERlbGVnYXRlOw0KLX0NCi1JRldMX05vdGVUaHJlYWQqIENGV0xfV2lkZ2V0SW1wOjpHZXRPd25lclRocmVhZCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gKElGV0xfTm90ZVRocmVhZCopbV9wT3duZXJUaHJlYWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlNldE93bmVyVGhyZWFkKENGV0xfTm90ZVRocmVhZCAqcE93bmVyVGhyZWFkKQ0KLXsNCi0gICAgbV9wT3duZXJUaHJlYWQgPSBwT3duZXJUaHJlYWQ7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUglDRldMX1dpZGdldEltcDo6R2V0UHJvcGVydGllcyhDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMpDQotew0KLSAgICBwcm9wZXJ0aWVzID0gKm1fcFByb3BlcnRpZXM7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUglDRldMX1dpZGdldEltcDo6U2V0UHJvcGVydGllcyhjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMpDQotew0KLSAgICAqbV9wUHJvcGVydGllcyA9IHByb3BlcnRpZXM7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0SW1wOjpHZXRJbnRlcmZhY2UoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEludGVyZmFjZTsNCi19DQotdm9pZCBDRldMX1dpZGdldEltcDo6U2V0SW50ZXJmYWNlKElGV0xfV2lkZ2V0ICpwSW50ZXJmYWNlKQ0KLXsNCi0gICAgbV9wSW50ZXJmYWNlID0gcEludGVyZmFjZTsNCi19DQotQ0ZXTF9XaWRnZXRJbXA6OkNGV0xfV2lkZ2V0SW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLSAgICA6IG1fcFByb3BlcnRpZXMoTlVMTCkNCi0gICAgLCBtX3BQcml2YXRlRGF0YShOVUxMKQ0KLSAgICAsIG1fcERlbGVnYXRlKE5VTEwpDQotICAgICwgbV9wQ3VyRGVsZWdhdGUoTlVMTCkNCi0gICAgLCBtX3BPdXRlcihwT3V0ZXIpDQotICAgICwgbV9wSW50ZXJmYWNlKE5VTEwpDQotICAgICwgbV9pTG9jaygwKQ0KLXsNCi0gICAgbV9wUHJvcGVydGllcyA9IEZYX05FVyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQotICAgIG1fcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBGWFNZU19hc3NlcnQobV9wV2lkZ2V0TWdyICE9IE5VTEwpOw0KLX0NCi1DRldMX1dpZGdldEltcDo6Q0ZXTF9XaWRnZXRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyICkNCi0gICAgOiBtX3BQcm9wZXJ0aWVzKE5VTEwpDQotICAgICwgbV9wUHJpdmF0ZURhdGEoTlVMTCkNCi0gICAgLCBtX3BEZWxlZ2F0ZShOVUxMKQ0KLSAgICAsIG1fcEN1ckRlbGVnYXRlKE5VTEwpDQotICAgICwgbV9wT3V0ZXIocE91dGVyKQ0KLSAgICAsIG1fcEludGVyZmFjZShOVUxMKQ0KLSAgICAsIG1faUxvY2soMCkNCi17DQotICAgIGlmICghbV9wUHJvcGVydGllcykgew0KLSAgICAgICAgbV9wUHJvcGVydGllcyA9IEZYX05FVyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQotICAgIH0NCi0gICAgKm1fcFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOw0KLSAgICBtX3BXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcFdpZGdldE1nciAhPSBOVUxMKTsNCi19DQotQ0ZXTF9XaWRnZXRJbXA6On5DRldMX1dpZGdldEltcCgpDQotew0KLSAgICBpZiAobV9wUHJpdmF0ZURhdGEpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BQcml2YXRlRGF0YTsNCi0gICAgICAgIG1fcFByaXZhdGVEYXRhID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcykgew0KLSAgICAgICAgZGVsZXRlIG1fcFByb3BlcnRpZXM7DQotICAgICAgICBtX3BQcm9wZXJ0aWVzID0gTlVMTDsNCi0gICAgfQ0KLX0NCi1GWF9CT09MCUNGV0xfV2lkZ2V0SW1wOjpJc0VuYWJsZWQoKQ0KLXsNCi0gICAgcmV0dXJuIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA9PSAwOw0KLX0NCi1GWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc1Zpc2libGUoKQ0KLXsNCi0gICAgcmV0dXJuIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgPT0gMDsNCi19DQotRlhfQk9PTCBDRldMX1dpZGdldEltcDo6SXNBY3RpdmUoKQ0KLXsNCi0gICAgcmV0dXJuIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkKSA9PSAwOw0KLX0NCi1GWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc092ZXJMYXBwZXIoKQ0KLXsNCi0gICAgcmV0dXJuIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX1dpbmRvd1R5cGVNYXNrKSA9PSBGV0xfV0dUU1RZTEVfT3ZlckxhcHBlcjsNCi19DQotRlhfQk9PTCBDRldMX1dpZGdldEltcDo6SXNQb3B1cCgpDQotew0KLSAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Qb3B1cDsNCi19DQotRlhfQk9PTCBDRldMX1dpZGdldEltcDo6SXNDaGlsZCgpDQotew0KLSAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9DaGlsZDsNCi19DQotRlhfQk9PTAlDRldMX1dpZGdldEltcDo6SXNMb2NrZWQoKQ0KLXsNCi0gICAgcmV0dXJuIG1faUxvY2sgPiAwOw0KLX0NCi1GWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc09mZnNjcmVlbigpDQotew0KLSAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9PZmZzY3JlZW47DQotfQ0KLUZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6Okhhc0JvcmRlcigpDQotew0KLSAgICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Cb3JkZXI7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6Okhhc0VkZ2UoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfRWRnZU1hc2s7DQotfQ0KLXZvaWQgQ0ZXTF9XaWRnZXRJbXA6OkdldEVkZ2VSZWN0KENGWF9SZWN0RiAmcnRFZGdlKQ0KLXsNCi0gICAgcnRFZGdlID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgcnRFZGdlLmxlZnQgPSBydEVkZ2UudG9wID0gMDsNCi0gICAgaWYgKEhhc0JvcmRlcigpKSB7DQotICAgICAgICBGWF9GTE9BVCBmQ1ggPSBHZXRCb3JkZXJTaXplKCk7DQotICAgICAgICBGWF9GTE9BVCBmQ1kgPSBHZXRCb3JkZXJTaXplKEZBTFNFKTsNCi0gICAgICAgIHJ0RWRnZS5EZWZsYXRlKGZDWCwgZkNZKTsNCi0gICAgfQ0KLX0NCi1GWF9GTE9BVCBDRldMX1dpZGdldEltcDo6R2V0Qm9yZGVyU2l6ZShGWF9CT09MIGJDWCApDQotew0KLSAgICBGWF9GTE9BVCAqcGZCb3JkZXIgPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoYkNYID8gRldMX1dHVENBUEFDSVRZX0NYQm9yZGVyIDogRldMX1dHVENBUEFDSVRZX0NZQm9yZGVyKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwZkJvcmRlciwgMCk7DQotICAgIHJldHVybiAqcGZCb3JkZXI7DQotfQ0KLUZYX0ZMT0FUIENGV0xfV2lkZ2V0SW1wOjpHZXRFZGdlV2lkdGgoKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdDYXBhY2l0eSA9IDA7DQotICAgIHN3aXRjaChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0VkZ2VNYXNrKSB7DQotICAgICAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlRmxhdDogew0KLSAgICAgICAgICAgICAgICBkd0NhcGFjaXR5ID0gRldMX1dHVENBUEFDSVRZX0VkZ2VGbGF0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlUmFpc2VkOiB7DQotICAgICAgICAgICAgICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVJhaXNlZDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUU1RZTEVfRWRnZVN1bmtlbjogew0KLSAgICAgICAgICAgICAgICBkd0NhcGFjaXR5ID0gRldMX1dHVENBUEFDSVRZX0VkZ2VTdW5rZW47DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoZHdDYXBhY2l0eSA+IDApIHsNCi0gICAgICAgIEZYX0ZMT0FUICpmUmV0ID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KGR3Q2FwYWNpdHkpOw0KLSAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChmUmV0LCAwKTsNCi0gICAgICAgIHJldHVybiAqZlJldDsNCi0gICAgfQ0KLSAgICByZXR1cm4gMDsNCi19DQotdm9pZCBDRldMX1dpZGdldEltcDo6R2V0UmVsYXRpdmVSZWN0KENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICByZWN0LmxlZnQgPSByZWN0LnRvcCA9IDA7DQotfQ0KLXZvaWQqIENGV0xfV2lkZ2V0SW1wOjpHZXRUaGVtZUNhcGFjaXR5KEZYX0RXT1JEIGR3Q2FwYWNpdHkpDQotew0KLSAgICBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRoZW1lLCBOVUxMKTsNCi0gICAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsNCi0gICAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHJldHVybiBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBkd0NhcGFjaXR5KTsNCi19DQotSUZXTF9UaGVtZVByb3ZpZGVyKiBDRldMX1dpZGdldEltcDo6R2V0QXZhaWxhYmxlVGhlbWUoKQ0KLXsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCi0gICAgICAgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KLSAgICB9DQotICAgIElGV0xfV2lkZ2V0ICpwVXAgPSBtX3BJbnRlcmZhY2U7DQotICAgIGRvIHsNCi0gICAgICAgIEZXTF9XR1RSRUxBVElPTiByZWxhdGlvbiA9IChwVXAtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX1BvcHVwKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGV0xfV0dUUkVMQVRJT05fT3duZXIgOiBGV0xfV0dUUkVMQVRJT05fUGFyZW50Ow0KLSAgICAgICAgcFVwID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQocFVwLCByZWxhdGlvbik7DQotICAgICAgICBpZiAocFVwKSB7DQotICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwUmV0ID0gcFVwLT5HZXRUaGVtZVByb3ZpZGVyKCk7DQotICAgICAgICAgICAgaWYgKHBSZXQgJiYgcFJldC0+SXNWYWxpZFdpZGdldChtX3BJbnRlcmZhY2UpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwUmV0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAocFVwKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9BcHBJbXAqKUZXTF9HZXRBcHAoKSktPkdldFRoZW1lUHJvdmlkZXIoKTsNCi19DQotQ0ZXTF9XaWRnZXRJbXAqIENGV0xfV2lkZ2V0SW1wOjpHZXRSb290T3V0ZXIoKQ0KLXsNCi0gICAgSUZXTF9XaWRnZXQgKnBSZXQgPSBtX3BPdXRlcjsNCi0gICAgSUZXTF9XaWRnZXQgKnBPdXRlciA9IHBSZXQ7DQotICAgIHdoaWxlIChwT3V0ZXIpIHsNCi0gICAgICAgIHBSZXQgPSBwT3V0ZXI7DQotICAgICAgICBwT3V0ZXIgPSBwT3V0ZXItPkdldE91dGVyKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIChDRldMX1dpZGdldEltcCopcFJldDsNCi19DQotQ0ZXTF9XaWRnZXRJbXAqIENGV0xfV2lkZ2V0SW1wOjpHZXRTYW1lQW5jZXN0b3IoQ0ZXTF9XaWRnZXRJbXAgKnBXaWRnZXQpDQotew0KLSAgICBDRlhfUHRyQXJyYXkgYXJyMSwgYXJyMjsNCi0gICAgQ0ZXTF9XaWRnZXRJbXAgKnBBbmNlc3RvciA9IHBXaWRnZXQ7DQotICAgIEZXTF9XR1RSRUxBVElPTiByZWxhdGlvbjsNCi0gICAgZG8gew0KLSAgICAgICAgYXJyMS5BZGQocEFuY2VzdG9yKTsNCi0gICAgICAgIHJlbGF0aW9uID0gIHBBbmNlc3Rvci0+SXNQb3B1cCgpID8gRldMX1dHVFJFTEFUSU9OX093bmVyIDogRldMX1dHVFJFTEFUSU9OX1BhcmVudDsNCi0gICAgfSB3aGlsZSAoKHBBbmNlc3RvciA9IChDRldMX1dpZGdldEltcCopbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQocEFuY2VzdG9yLT5tX3BJbnRlcmZhY2UsIHJlbGF0aW9uKSkgIT0gTlVMTCk7DQotICAgIHBBbmNlc3RvciA9IHRoaXM7DQotICAgIGRvIHsNCi0gICAgICAgIGFycjIuQWRkKHBBbmNlc3Rvcik7DQotICAgICAgICByZWxhdGlvbiA9ICBwQW5jZXN0b3ItPklzUG9wdXAoKSA/IEZXTF9XR1RSRUxBVElPTl9Pd25lciA6IEZXTF9XR1RSRUxBVElPTl9QYXJlbnQ7DQotICAgIH0gd2hpbGUgKChwQW5jZXN0b3IgPSAoQ0ZXTF9XaWRnZXRJbXAqKW1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KHBBbmNlc3Rvci0+bV9wSW50ZXJmYWNlLCByZWxhdGlvbikpICE9IE5VTEwpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcnIxLkdldFNpemUoKTsgaSArKykgew0KLSAgICAgICAgdm9pZCogcFZvaWQgPSBhcnIxW2ldOw0KLSAgICAgICAgaWYgKGFycjIuRmluZChwVm9pZCkgPCAwKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiAoQ0ZXTF9XaWRnZXRJbXAqKXBWb2lkOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1DRlhfU2l6ZUYgQ0ZXTF9XaWRnZXRJbXA6OkdldE9mZnNldEZyb21BbmNlc3RvcihDRldMX1dpZGdldEltcCAqcEFuY2VzdG9yKQ0KLXsNCi0gICAgQ0ZYX1NpemVGIHN6UmV0Ow0KLSAgICBzelJldC5TZXQoMCwgMCk7DQotICAgIGlmIChwQW5jZXN0b3IgPT0gdGhpcykgew0KLSAgICAgICAgcmV0dXJuIHN6UmV0Ow0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0SW1wICpwV2lkZ2V0ID0gdGhpczsNCi0gICAgZG8gew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQotICAgICAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KLSAgICAgICAgc3pSZXQueCArPSByZWN0LmxlZnQ7DQotICAgICAgICBzelJldC55ICs9IHJlY3QudG9wOw0KLSAgICAgICAgRldMX1dHVFJFTEFUSU9OIHJlbGF0aW9uID0gcFdpZGdldC0+SXNQb3B1cCgpID8gRldMX1dHVFJFTEFUSU9OX093bmVyIDogRldMX1dHVFJFTEFUSU9OX1BhcmVudDsNCi0gICAgICAgIHBXaWRnZXQgPSAoQ0ZXTF9XaWRnZXRJbXAqKW1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KChJRldMX1dpZGdldCopcFdpZGdldCwgcmVsYXRpb24pOw0KLSAgICB9IHdoaWxlKHBXaWRnZXQgJiYgcFdpZGdldCAhPSBwQW5jZXN0b3IpOw0KLSAgICByZXR1cm4gc3pSZXQ7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9XaWRnZXRJbXA6OlRyYW5zZm9ybVRvT3V0ZXIoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcE91dGVyLCBGQUxTRSk7DQotICAgIGZ4ICs9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdDsNCi0gICAgZnggKz0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3A7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNGV0xfV2lkZ2V0SW1wOjpUcmFuc2Zvcm1Gcm9tT3V0ZXIoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcE91dGVyLCBGQUxTRSk7DQotICAgIENGWF9SZWN0RiByZWN0Ow0KLSAgICBtX3BPdXRlci0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCi0gICAgZnggLT0gcmVjdC5sZWZ0Ow0KLSAgICBmeCAtPSByZWN0LnRvcDsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLSNkZWZpbmUgRldMX1dHVF9DYWxjSGVpZ2h0CQkJCTIwNDgNCi0jZGVmaW5lIEZXTF9XR1RfQ2FsY1dpZHRoCQkJCTIwNDgNCi0jZGVmaW5lIEZXTF9XR1RfQ2FsY011bHRpTGluZURlZldpZHRoCTEyMC4wZg0KLUNGWF9TaXplRiBDRldMX1dpZGdldEltcDo6Q2FsY1RleHRTaXplKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBGWF9CT09MIGJNdWx0aUxpbmUgLCBpbnQzMl90IGlMaW5lV2lkdGggKQ0KLXsNCi0gICAgQ0ZYX1NpemVGIHN6Ow0KLSAgICBzei5TZXQoMCwgMCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRoZW1lLCBzeik7DQotICAgIENGV0xfVGhlbWVUZXh0IGNhbFBhcnQ7DQotICAgIGNhbFBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBjYWxQYXJ0Lm1fd3NUZXh0ID0gd3NUZXh0Ow0KLSAgICBjYWxQYXJ0Lm1fZHdUVE9TdHlsZXMgPSBiTXVsdGlMaW5lID8gRkRFX1RUT1NUWUxFX0xpbmVXcmFwIDogRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQotICAgIGNhbFBhcnQubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcExlZnQ7DQotICAgIENGWF9SZWN0RiByZWN0Ow0KLSAgICBGWF9GTE9BVCBmV2lkdGggPSBiTXVsdGlMaW5lID8NCi0gICAgICAgICAgICAgICAgICAgICAgKGlMaW5lV2lkdGggPiAwID8gKEZYX0ZMT0FUKWlMaW5lV2lkdGggOiBGV0xfV0dUX0NhbGNNdWx0aUxpbmVEZWZXaWR0aCkgOg0KLSAgICAgICAgICAgICAgICAgICAgICBGV0xfV0dUX0NhbGNXaWR0aDsNCi0gICAgcmVjdC5TZXQoMCwgMCwgZldpZHRoLCBGV0xfV0dUX0NhbGNIZWlnaHQpOw0KLSAgICBwVGhlbWUtPkNhbGNUZXh0UmVjdCgmY2FsUGFydCwgcmVjdCk7DQotICAgIHN6LnggPSByZWN0LndpZHRoOw0KLSAgICBzei55ID0gcmVjdC5oZWlnaHQ7DQotICAgIHJldHVybiBzejsNCi19DQotdm9pZCBDRldMX1dpZGdldEltcDo6Q2FsY1RleHRSZWN0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBGWF9EV09SRCBkd1RUT1N0eWxlcywgaW50MzJfdCBpVFRPQWxpZ24sIENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIENGV0xfVGhlbWVUZXh0IGNhbFBhcnQ7DQotICAgIGNhbFBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBjYWxQYXJ0Lm1fd3NUZXh0ID0gd3NUZXh0Ow0KLSAgICBjYWxQYXJ0Lm1fZHdUVE9TdHlsZXMgPSBkd1RUT1N0eWxlczsNCi0gICAgY2FsUGFydC5tX2lUVE9BbGlnbiA9IGlUVE9BbGlnbjsNCi0gICAgcFRoZW1lLT5DYWxjVGV4dFJlY3QoJmNhbFBhcnQsIHJlY3QpOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0SW1wOjpTZXRGb2N1cyhGWF9CT09MIGJGb2N1cykNCi17DQotICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KLSAgICBJRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocERyaXZlcik7DQotICAgIElGV0xfV2lkZ2V0ICpjdXJGb2N1cyA9ICgoQ0ZXTF9Ob3RlRHJpdmVyKilwRHJpdmVyKS0+R2V0Rm9jdXMoKTsNCi0gICAgaWYgKGJGb2N1cyAmJiBjdXJGb2N1cyAhPSBtX3BJbnRlcmZhY2UpIHsNCi0gICAgICAgIHBEcml2ZXItPlNldEZvY3VzKG1fcEludGVyZmFjZSk7DQotICAgIH0gZWxzZSBpZiAoIWJGb2N1cyAmJiBjdXJGb2N1cyA9PSBtX3BJbnRlcmZhY2UpIHsNCi0gICAgICAgIHBEcml2ZXItPlNldEZvY3VzKE5VTEwpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9XaWRnZXRJbXA6OlNldEdyYWIoRlhfQk9PTCBiU2V0KQ0KLXsNCi0gICAgSUZXTF9Ob3RlVGhyZWFkICpwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhyZWFkKTsNCi0gICAgQ0ZXTF9Ob3RlRHJpdmVyICpwRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICBwRHJpdmVyLT5TZXRHcmFiKG1fcEludGVyZmFjZSwgYlNldCk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9XaWRnZXRJbXA6OkdldFBvcHVwUG9zKEZYX0ZMT0FUIGZNaW5IZWlnaHQsIEZYX0ZMT0FUIGZNYXhIZWlnaHQsIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCkNCi17DQotICAgIGlmIChHZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9NZW51KSB7DQotICAgICAgICByZXR1cm4gR2V0UG9wdXBQb3NNZW51KGZNaW5IZWlnaHQsIGZNYXhIZWlnaHQsIHJ0QW5jaG9yLCBydFBvcHVwKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChHZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9Db21ib0JveCkgew0KLSAgICAgICAgICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1fcFdpZGdldE1nci0+R2V0QWRhcHRlclBvcHVwUG9zKG1fcEludGVyZmFjZSwgZk1pbkhlaWdodCwgZk1heEhlaWdodCwgcnRBbmNob3IsIHJ0UG9wdXApOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBHZXRQb3B1cFBvc0NvbWJvQm94KGZNaW5IZWlnaHQsIGZNYXhIZWlnaHQsIHJ0QW5jaG9yLCBydFBvcHVwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKEdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyICYmIG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgICAgIHJldHVybiBtX3BXaWRnZXRNZ3ItPkdldEFkYXB0ZXJQb3B1cFBvcyhtX3BJbnRlcmZhY2UsIGZNaW5IZWlnaHQsIGZNYXhIZWlnaHQsIHJ0QW5jaG9yLCBydFBvcHVwKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIEdldFBvcHVwUG9zR2VuZXJhbChmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydEFuY2hvciwgcnRQb3B1cCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MCUNGV0xfV2lkZ2V0SW1wOjpHZXRQb3B1cFBvc01lbnUoRlhfRkxPQVQgZk1pbkhlaWdodCwgRlhfRkxPQVQgZk1heEhlaWdodCwgY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvciwgQ0ZYX1JlY3RGICZydFBvcHVwKQ0KLXsNCi0gICAgRlhfRkxPQVQgZnggPSAwOw0KLSAgICBGWF9GTE9BVCBmeSA9IDA7DQotICAgIEZYX0ZMT0FUIGZTY3JlZW5XaWR0aCA9IDA7DQotICAgIEZYX0ZMT0FUIGZTY3JlZW5IZWlnaHQgPSAwOw0KLSAgICBHZXRTY3JlZW5TaXplKGZTY3JlZW5XaWR0aCwgZlNjcmVlbkhlaWdodCk7DQotICAgIGlmIChHZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX01OVV9WZXJ0KSB7DQotICAgICAgICBGWF9CT09MIGJMZWZ0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0IDwgMDsNCi0gICAgICAgIEZYX0ZMT0FUIGZSaWdodCA9IHJ0QW5jaG9yLnJpZ2h0KCkgKyBydFBvcHVwLndpZHRoOw0KLSAgICAgICAgVHJhbnNmb3JtVG8oTlVMTCwgZngsIGZ5KTsNCi0gICAgICAgIGlmIChmUmlnaHQgKyBmeCA+IGZTY3JlZW5XaWR0aCB8fCBiTGVmdCkgew0KLSAgICAgICAgICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQgLSBydFBvcHVwLndpZHRoLCBydEFuY2hvci50b3AsIHJ0UG9wdXAud2lkdGgsCXJ0UG9wdXAuaGVpZ2h0KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcnRQb3B1cC5TZXQocnRBbmNob3IucmlnaHQoKSwgcnRBbmNob3IudG9wLCBydFBvcHVwLndpZHRoLCBydFBvcHVwLmhlaWdodCk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWF9GTE9BVCBmQm90dG9tID0gcnRBbmNob3IuYm90dG9tKCkgKyBydFBvcHVwLmhlaWdodDsNCi0gICAgICAgIFRyYW5zZm9ybVRvKE5VTEwsIGZ4LCBmeSk7DQotICAgICAgICBpZiAoZkJvdHRvbSArIGZ5ID4gZlNjcmVlbkhlaWdodCkgew0KLSAgICAgICAgICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQsIHJ0QW5jaG9yLnRvcCAtIHJ0UG9wdXAuaGVpZ2h0LCBydFBvcHVwLndpZHRoLCBydFBvcHVwLmhlaWdodCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQsIHJ0QW5jaG9yLmJvdHRvbSgpLCBydFBvcHVwLndpZHRoLCBydFBvcHVwLmhlaWdodCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcnRQb3B1cC5PZmZzZXQoZngsIGZ5KTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9XaWRnZXRJbXA6OkdldFBvcHVwUG9zQ29tYm9Cb3goRlhfRkxPQVQgZk1pbkhlaWdodCwgRlhfRkxPQVQgZk1heEhlaWdodCwgY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvciwgQ0ZYX1JlY3RGICZydFBvcHVwKQ0KLXsNCi0gICAgRlhfRkxPQVQgZnggPSAwOw0KLSAgICBGWF9GTE9BVCBmeSA9IDA7DQotICAgIEZYX0ZMT0FUIGZTY3JlZW5XaWR0aCA9IDA7DQotICAgIEZYX0ZMT0FUIGZTY3JlZW5IZWlnaHQgPSAwOw0KLSAgICBHZXRTY3JlZW5TaXplKGZTY3JlZW5XaWR0aCwgZlNjcmVlbkhlaWdodCk7DQotICAgIEZYX0ZMT0FUIGZQb3BIZWlnaHQgPSBydFBvcHVwLmhlaWdodDsNCi0gICAgaWYgKHJ0UG9wdXAuaGVpZ2h0ID4gZk1heEhlaWdodCkgew0KLSAgICAgICAgZlBvcEhlaWdodCA9IGZNYXhIZWlnaHQ7DQotICAgIH0gZWxzZSBpZiAocnRQb3B1cC5oZWlnaHQgPCBmTWluSGVpZ2h0KSB7DQotICAgICAgICBmUG9wSGVpZ2h0ID0gZk1pbkhlaWdodDsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmV2lkdGggPSBGWF9NQVgocnRBbmNob3Iud2lkdGgsIHJ0UG9wdXAud2lkdGgpOw0KLSAgICBGWF9GTE9BVCBmQm90dG9tID0gcnRBbmNob3IuYm90dG9tKCkgKyBmUG9wSGVpZ2h0Ow0KLSAgICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KLSAgICBpZiAoZkJvdHRvbSArIGZ5ID4gZlNjcmVlbkhlaWdodCkgew0KLSAgICAgICAgcnRQb3B1cC5TZXQocnRBbmNob3IubGVmdCwgcnRBbmNob3IudG9wIC0gZlBvcEhlaWdodCwgZldpZHRoLCBmUG9wSGVpZ2h0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQsIHJ0QW5jaG9yLmJvdHRvbSgpLCBmV2lkdGgsIGZQb3BIZWlnaHQpOw0KLSAgICB9DQotICAgIHJ0UG9wdXAuT2Zmc2V0KGZ4LCBmeSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNGV0xfV2lkZ2V0SW1wOjpHZXRQb3B1cFBvc0dlbmVyYWwoRlhfRkxPQVQgZk1pbkhlaWdodCwgRlhfRkxPQVQgZk1heEhlaWdodCwgY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvciwgQ0ZYX1JlY3RGICZydFBvcHVwKQ0KLXsNCi0gICAgRlhfRkxPQVQgZnggPSAwOw0KLSAgICBGWF9GTE9BVCBmeSA9IDA7DQotICAgIEZYX0ZMT0FUIGZTY3JlZW5XaWR0aCA9IDA7DQotICAgIEZYX0ZMT0FUIGZTY3JlZW5IZWlnaHQgPSAwOw0KLSAgICBHZXRTY3JlZW5TaXplKGZTY3JlZW5XaWR0aCwgZlNjcmVlbkhlaWdodCk7DQotICAgIFRyYW5zZm9ybVRvKE5VTEwsIGZ4LCBmeSk7DQotICAgIGlmIChydEFuY2hvci5ib3R0b20oKSArIGZ5ID4gZlNjcmVlbkhlaWdodCkgew0KLSAgICAgICAgcnRQb3B1cC5TZXQocnRBbmNob3IubGVmdCwgcnRBbmNob3IudG9wIC0gcnRQb3B1cC5oZWlnaHQsIHJ0UG9wdXAud2lkdGgsIHJ0UG9wdXAuaGVpZ2h0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQsIHJ0QW5jaG9yLmJvdHRvbSgpLCBydFBvcHVwLndpZHRoLCBydFBvcHVwLmhlaWdodCk7DQotICAgIH0NCi0gICAgcnRQb3B1cC5PZmZzZXQoZngsIGZ5KTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9XaWRnZXRJbXA6OkdldFNjcmVlblNpemUoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQotew0KLSAgICBJRldMX0FkYXB0ZXJOYXRpdmUgKnBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KLSAgICBJRldMX0FkYXB0ZXJNb25pdG9yTWdyICpwTW9uaXRvck1nciA9IHBOYXRpdmUtPkdldE1vbml0b3JNZ3IoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTW9uaXRvck1nciwgRkFMU0UpOw0KLSAgICBGV0xfSE1PTklUT1IgaE1vbml0b3IgPSBwTW9uaXRvck1nci0+R2V0TW9uaXRvckJ5UG9pbnQoZngsIGZ5KTsNCi0gICAgcE1vbml0b3JNZ3ItPkdldE1vbml0b3JTaXplKGhNb25pdG9yLCBmeCwgZnkpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDRldMX1dpZGdldEltcDo6UmVnaXN0ZXJFdmVudFRhcmdldChJRldMX1dpZGdldCAqcEV2ZW50U291cmNlICwgRlhfRFdPUkQgZHdGaWx0ZXIgKQ0KLXsNCi0gICAgSUZXTF9Ob3RlVGhyZWFkICpwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhyZWFkKTsNCi0gICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTm90ZURyaXZlcik7DQotICAgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KG1fcEludGVyZmFjZSwgcEV2ZW50U291cmNlLCBkd0ZpbHRlcik7DQotfQ0KLXZvaWQgQ0ZXTF9XaWRnZXRJbXA6OlVucmVnaXN0ZXJFdmVudFRhcmdldCgpDQotew0KLSAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KLSAgICBJRldMX05vdGVEcml2ZXIgKnBOb3RlRHJpdmVyID0gcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBOb3RlRHJpdmVyKTsNCi0gICAgcE5vdGVEcml2ZXItPlVucmVnaXN0ZXJFdmVudFRhcmdldChtX3BJbnRlcmZhY2UpOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0SW1wOjpEaXNwYXRjaEtleUV2ZW50KENGV0xfTXNnS2V5ICpwTm90ZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE5vdGUpOw0KLSAgICBDRldMX01zZ0tleSAqcEV2ZW50ID0gKENGV0xfTXNnS2V5KilwTm90ZS0+Q2xvbmVUb0V2ZW50KCk7DQotICAgIHBFdmVudC0+bV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwRXZlbnQtPm1fZHdDbWQgPSBwTm90ZS0+bV9kd0NtZDsNCi0gICAgcEV2ZW50LT5tX2R3S2V5Q29kZSA9IHBOb3RlLT5tX2R3S2V5Q29kZTsNCi0gICAgcEV2ZW50LT5tX2R3RmxhZ3MgPSBwTm90ZS0+bV9kd0ZsYWdzOw0KLSAgICBEaXNwYXRjaEV2ZW50KChDRldMX0V2ZW50KilwRXZlbnQpOw0KLSAgICBwRXZlbnQtPlJlbGVhc2UoKTsNCi19DQotdm9pZCBDRldMX1dpZGdldEltcDo6RGlzcGF0Y2hFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQotew0KLSAgICBpZiAobV9wT3V0ZXIpIHsNCi0gICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IG1fcE91dGVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCi0gICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KLSAgICBJRldMX05vdGVEcml2ZXIgKnBOb3RlRHJpdmVyID0gcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBOb3RlRHJpdmVyKTsNCi0gICAgcE5vdGVEcml2ZXItPlNlbmROb3RlKHBFdmVudCk7DQotfQ0KLXZvaWQgQ0ZXTF9XaWRnZXRJbXA6OlJlcGFpbnQoY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCApDQotew0KLSAgICBpZiAocFJlY3QpIHsNCi0gICAgICAgIG1fcFdpZGdldE1nci0+UmVwYWludFdpZGdldChtX3BJbnRlcmZhY2UsIHBSZWN0KTsNCi0gICAgICAgIHJldHVybiA7DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGIHJlY3Q7DQotICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICByZWN0LmxlZnQgPSByZWN0LnRvcCA9IDA7DQotICAgIG1fcFdpZGdldE1nci0+UmVwYWludFdpZGdldChtX3BJbnRlcmZhY2UsICZyZWN0KTsNCi19DQotdm9pZCBDRldMX1dpZGdldEltcDo6RHJhd0JhY2tncm91bmQoQ0ZYX0dyYXBoaWNzCQkgKnBHcmFwaGljcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90CQkJICBpUGFydEJrLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciAgICpwVGhlbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeAkgKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0UmVsYXRpdmU7DQotICAgIEdldFJlbGF0aXZlUmVjdChydFJlbGF0aXZlKTsNCi0gICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQotICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCi0gICAgcGFyYW0ubV9pUGFydCA9IGlQYXJ0Qms7DQotICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4LCBUUlVFKTsNCi0gICAgfQ0KLSAgICBwYXJhbS5tX3J0UGFydCA9IHJ0UmVsYXRpdmU7DQotICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCi19DQotdm9pZCBDRldMX1dpZGdldEltcDo6RHJhd0JvcmRlcihDRlhfR3JhcGhpY3MJCSpwR3JhcGhpY3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90CQkJIGlQYXJ0Qm9yZGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyCSpwVGhlbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4CSpwTWF0cml4ICkNCi17DQotICAgIENGWF9SZWN0RiBydFJlbGF0aXZlOw0KLSAgICBHZXRSZWxhdGl2ZVJlY3QocnRSZWxhdGl2ZSk7DQotICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KLSAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQotICAgIHBhcmFtLm1faVBhcnQgPSBpUGFydEJvcmRlcjsNCi0gICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgsIFRSVUUpOw0KLSAgICB9DQotICAgIHBhcmFtLm1fcnRQYXJ0ID0gcnRSZWxhdGl2ZTsNCi0gICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0SW1wOjpEcmF3RWRnZShDRlhfR3JhcGhpY3MJCQkqcEdyYXBoaWNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QJCQkJIGlQYXJ0RWRnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIgICAgKnBUaGVtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4CQkqcE1hdHJpeCApDQotew0KK0ZYX0RXT1JEIENGV0xfV2lkZ2V0SW1wOjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgQ0ZYX1JlY3RGIHJ0Q2xpZW50Ow0KKyAgR2V0Q2xpZW50UmVjdChydENsaWVudCk7DQorICBpZiAocnRDbGllbnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgfQ0KKyAgaWYgKEhhc0VkZ2UoKSkgew0KICAgICBDRlhfUmVjdEYgcnRFZGdlOw0KICAgICBHZXRFZGdlUmVjdChydEVkZ2UpOw0KLSAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCi0gICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KLSAgICBwYXJhbS5tX2lQYXJ0ID0gaVBhcnRFZGdlOw0KLSAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCwgVFJVRSk7DQorICAgIGlmIChydEVkZ2UuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9FZGdlOw0KICAgICB9DQotICAgIHBhcmFtLm1fcnRQYXJ0ID0gcnRFZGdlOw0KLSAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICB9DQorICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0UmVsYXRpdmU7DQorICAgIEdldFJlbGF0aXZlUmVjdChydFJlbGF0aXZlKTsNCisgICAgaWYgKHJ0UmVsYXRpdmUuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Cb3JkZXI7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KIH0NCi12b2lkIENGV0xfV2lkZ2V0SW1wOjpOb3RpZnlEcml2ZXIoKQ0KLXsNCi0gICAgSUZXTF9Ob3RlVGhyZWFkICpwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhyZWFkKTsNCi0gICAgQ0ZXTF9Ob3RlRHJpdmVyICpwRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBEcml2ZXIpOw0KLSAgICBwRHJpdmVyLT5Ob3RpZnlUYXJnZXREZXN0cm95KG1fcEludGVyZmFjZSk7DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6VHJhbnNmb3JtVG8oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmeSkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICBDRlhfU2l6ZUYgc3pPZmZzZXQ7DQorICAgIGlmIChJc1BhcmVudChwV2lkZ2V0KSkgew0KKyAgICAgIHN6T2Zmc2V0ID0gR2V0T2Zmc2V0RnJvbVBhcmVudChwV2lkZ2V0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBzek9mZnNldCA9ICgoSUZXTF9XaWRnZXQqKXBXaWRnZXQpLT5HZXRPZmZzZXRGcm9tUGFyZW50KG1fcEludGVyZmFjZSk7DQorICAgICAgc3pPZmZzZXQueCA9IC1zek9mZnNldC54Ow0KKyAgICAgIHN6T2Zmc2V0LnkgPSAtc3pPZmZzZXQueTsNCisgICAgfQ0KKyAgICBmeCArPSBzek9mZnNldC54Ow0KKyAgICBmeSArPSBzek9mZnNldC55Ow0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBDRlhfUmVjdEYgcjsNCisgIENGWF9NYXRyaXggbTsNCisgIElGV0xfV2lkZ2V0KiBwYXJlbnQgPSBHZXRQYXJlbnQoKTsNCisgIGlmIChwYXJlbnQpIHsNCisgICAgR2V0V2lkZ2V0UmVjdChyKTsNCisgICAgZnggKz0gci5sZWZ0Ow0KKyAgICBmeSArPSByLnRvcDsNCisgICAgR2V0TWF0cml4KG0sIFRSVUUpOw0KKyAgICBtLlRyYW5zZm9ybVBvaW50KGZ4LCBmeSk7DQorICB9DQorICBJRldMX1dpZGdldCogZm9ybTEgPQ0KKyAgICAgIG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KG1fcEludGVyZmFjZSwgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0pOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChmb3JtMSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIGlmICghcFdpZGdldCkgew0KKyAgICBmb3JtMS0+R2V0V2lkZ2V0UmVjdChyKTsNCisgICAgZnggKz0gci5sZWZ0Ow0KKyAgICBmeSArPSByLnRvcDsNCisjaWZkZWYgRldMX1VzZU1hY1N5c3RlbUJvcmRlcg0KKyAgICBpZiAoZm9ybTEtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0NhcHRpb24pIHsNCisgICAgICBGWF9GTE9BVCBsLCB0LCByLCBiOw0KKyAgICAgIGwgPSB0ID0gciA9IGIgPSAwOw0KKyAgICAgIEZXTF9HZXRBZGFwdGVyV2lkZ2V0TWdyKCktPkdldFN5c3RlbUJvcmRlcihsLCB0LCByLCBiKTsNCisgICAgICBmeSArPSB0Ow0KKyAgICB9DQorI2VuZGlmDQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIElGV0xfV2lkZ2V0KiBmb3JtMiA9DQorICAgICAgbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQocFdpZGdldCwgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0pOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChmb3JtMiwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIGlmIChmb3JtMSAhPSBmb3JtMikgew0KKyAgICBmb3JtMS0+R2V0V2lkZ2V0UmVjdChyKTsNCisgICAgZnggKz0gci5sZWZ0Ow0KKyAgICBmeSArPSByLnRvcDsNCisgICAgZm9ybTItPkdldFdpZGdldFJlY3Qocik7DQorICAgIGZ4IC09IHIubGVmdDsNCisgICAgZnkgLT0gci50b3A7DQorI2lmZGVmIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXINCisgICAgaWYgKChmb3JtMS0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfQ2FwdGlvbikgIT0NCisgICAgICAgIChmb3JtMi0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfQ2FwdGlvbikpIHsNCisgICAgICBGWF9GTE9BVCBsLCB0LCByLCBiOw0KKyAgICAgIGwgPSB0ID0gciA9IGIgPSAwOw0KKyAgICAgIEZXTF9HZXRBZGFwdGVyV2lkZ2V0TWdyKCktPkdldFN5c3RlbUJvcmRlcihsLCB0LCByLCBiKTsNCisgICAgICAoZm9ybTEtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0NhcHRpb24pID8gKGZ5ICs9IHQpIDogKGZ5IC09IHQpOw0KKyAgICB9DQorI2VuZGlmDQorICB9DQorICBwYXJlbnQgPSBwV2lkZ2V0LT5HZXRQYXJlbnQoKTsNCisgIGlmIChwYXJlbnQpIHsNCisgICAgcFdpZGdldC0+R2V0TWF0cml4KG0sIFRSVUUpOw0KKyAgICBDRlhfTWF0cml4IG0xOw0KKyAgICBtMS5SZXNldCgpOw0KKyAgICBtMS5TZXRSZXZlcnNlKG0pOw0KKyAgICBtMS5UcmFuc2Zvcm1Qb2ludChmeCwgZnkpOw0KKyAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHIpOw0KKyAgICBmeCAtPSByLmxlZnQ7DQorICAgIGZ5IC09IHIudG9wOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRlhfU2l6ZUYgQ0ZXTF9XaWRnZXRJbXA6OkdldE9mZnNldEZyb21QYXJlbnQoSUZXTF9XaWRnZXQgKnBQYXJlbnQpDQotew0KLSAgICBDRlhfU2l6ZUYgc3pSZXQ7DQotICAgIHN6UmV0LlNldCgwLCAwKTsNCi0gICAgaWYgKHBQYXJlbnQgPT0gKElGV0xfV2lkZ2V0Kil0aGlzKSB7DQotICAgICAgICByZXR1cm4gc3pSZXQ7DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6VHJhbnNmb3JtVG8oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcnQpIHsNCisgIHJldHVybiBUcmFuc2Zvcm1UbyhwV2lkZ2V0LCBydC5sZWZ0LCBydC50b3ApOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpHZXRNYXRyaXgoQ0ZYX01hdHJpeCYgbWF0cml4LCBGWF9CT09MIGJHbG9iYWwpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wUHJvcGVydGllcywgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIGlmIChiR2xvYmFsKSB7DQorICAgIElGV0xfV2lkZ2V0KiBwYXJlbnQgPSBHZXRQYXJlbnQoKTsNCisgICAgQ0ZYX1B0ckFycmF5IHBhcmVudHM7DQorICAgIHdoaWxlIChwYXJlbnQpIHsNCisgICAgICBwYXJlbnRzLkFkZChwYXJlbnQpOw0KKyAgICAgIHBhcmVudCA9IHBhcmVudC0+R2V0UGFyZW50KCk7DQogICAgIH0NCi0gICAgSUZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IgPSBGV0xfR2V0V2lkZ2V0TWdyKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldE1nciwgc3pSZXQpOw0KLSAgICBzelJldC54ICs9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdDsNCi0gICAgc3pSZXQueSArPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LnRvcDsNCi0gICAgSUZXTF9XaWRnZXQgKnBEc3RXaWRnZXQgPSBHZXRQYXJlbnQoKTsNCi0gICAgd2hpbGUgKHBEc3RXaWRnZXQgJiYgcERzdFdpZGdldCAhPSBwUGFyZW50KSB7DQotICAgICAgICBDRlhfUmVjdEYgcnREc3Q7DQotICAgICAgICBwRHN0V2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0RHN0KTsNCi0gICAgICAgIHN6UmV0LnggKz0gcnREc3QubGVmdDsNCi0gICAgICAgIHN6UmV0LnkgKz0gcnREc3QudG9wOw0KLSAgICAgICAgcERzdFdpZGdldCA9IHBXaWRnZXRNZ3ItPkdldFdpZGdldChwRHN0V2lkZ2V0LCBGV0xfV0dUUkVMQVRJT05fUGFyZW50KTsNCisgICAgbWF0cml4LlJlc2V0KCk7DQorICAgIENGWF9NYXRyaXggY3RtT25QYXJlbnQ7DQorICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICBpbnQzMl90IGNvdW50ID0gcGFyZW50cy5HZXRTaXplKCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gY291bnQgLSAyOyBpID49IDA7IGktLSkgew0KKyAgICAgIHBhcmVudCA9IChJRldMX1dpZGdldCopcGFyZW50cy5HZXRBdChpKTsNCisgICAgICBwYXJlbnQtPkdldE1hdHJpeChjdG1PblBhcmVudCwgRkFMU0UpOw0KKyAgICAgIHBhcmVudC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICBtYXRyaXguQ29uY2F0KGN0bU9uUGFyZW50LCBUUlVFKTsNCisgICAgICBtYXRyaXguVHJhbnNsYXRlKHJlY3QubGVmdCwgcmVjdC50b3AsIFRSVUUpOw0KICAgICB9DQorICAgIG1hdHJpeC5Db25jYXQobV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudCwgVFJVRSk7DQorICAgIHBhcmVudHMuUmVtb3ZlQWxsKCk7DQorICB9IGVsc2Ugew0KKyAgICBtYXRyaXggPSBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFByb3BlcnRpZXMsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBJRldMX1dpZGdldCogcGFyZW50ID0gR2V0UGFyZW50KCk7DQorICBpZiAoIXBhcmVudCkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudCA9IG1hdHJpeDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorfQ0KK0lGV0xfVGhlbWVQcm92aWRlciogQ0ZXTF9XaWRnZXRJbXA6OkdldFRoZW1lUHJvdmlkZXIoKSB7DQorICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSB7DQorICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gcFRoZW1lUHJvdmlkZXI7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlNldERhdGFQcm92aWRlcihJRldMX0RhdGFQcm92aWRlciogcERhdGFQcm92aWRlcikgew0KKyAgbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyID0gcERhdGFQcm92aWRlcjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorSUZXTF9XaWRnZXREZWxlZ2F0ZSogQ0ZXTF9XaWRnZXRJbXA6OlNldERlbGVnYXRlKA0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUpIHsNCisgIGlmICghbV9wQ3VyRGVsZWdhdGUpIHsNCisgICAgbV9wQ3VyRGVsZWdhdGUgPSBtX3BEZWxlZ2F0ZTsNCisgIH0NCisgIGlmICghcERlbGVnYXRlKSB7DQorICAgIHJldHVybiBtX3BDdXJEZWxlZ2F0ZTsNCisgIH0NCisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBPbGREZWxlZ2F0ZSA9IG1fcEN1ckRlbGVnYXRlOw0KKyAgbV9wQ3VyRGVsZWdhdGUgPSBwRGVsZWdhdGU7DQorICByZXR1cm4gcE9sZERlbGVnYXRlOw0KK30NCitJRldMX05vdGVUaHJlYWQqIENGV0xfV2lkZ2V0SW1wOjpHZXRPd25lclRocmVhZCgpIGNvbnN0IHsNCisgIHJldHVybiAoSUZXTF9Ob3RlVGhyZWFkKiltX3BPd25lclRocmVhZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0T3duZXJUaHJlYWQoQ0ZXTF9Ob3RlVGhyZWFkKiBwT3duZXJUaHJlYWQpIHsNCisgIG1fcE93bmVyVGhyZWFkID0gcE93bmVyVGhyZWFkOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpHZXRQcm9wZXJ0aWVzKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcykgew0KKyAgcHJvcGVydGllcyA9ICptX3BQcm9wZXJ0aWVzOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRQcm9wZXJ0aWVzKA0KKyAgICBjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMpIHsNCisgICptX3BQcm9wZXJ0aWVzID0gcHJvcGVydGllczsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0SW1wOjpHZXRJbnRlcmZhY2UoKSB7DQorICByZXR1cm4gbV9wSW50ZXJmYWNlOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpTZXRJbnRlcmZhY2UoSUZXTF9XaWRnZXQqIHBJbnRlcmZhY2UpIHsNCisgIG1fcEludGVyZmFjZSA9IHBJbnRlcmZhY2U7DQorfQ0KK0NGV0xfV2lkZ2V0SW1wOjpDRldMX1dpZGdldEltcChJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IG1fcFByb3BlcnRpZXMoTlVMTCksDQorICAgICAgbV9wUHJpdmF0ZURhdGEoTlVMTCksDQorICAgICAgbV9wRGVsZWdhdGUoTlVMTCksDQorICAgICAgbV9wQ3VyRGVsZWdhdGUoTlVMTCksDQorICAgICAgbV9wT3V0ZXIocE91dGVyKSwNCisgICAgICBtX3BJbnRlcmZhY2UoTlVMTCksDQorICAgICAgbV9pTG9jaygwKSB7DQorICBtX3BQcm9wZXJ0aWVzID0gRlhfTkVXIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCisgIG1fcFdpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcFdpZGdldE1nciAhPSBOVUxMKTsNCit9DQorQ0ZXTF9XaWRnZXRJbXA6OkNGV0xfV2lkZ2V0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBtX3BQcm9wZXJ0aWVzKE5VTEwpLA0KKyAgICAgIG1fcFByaXZhdGVEYXRhKE5VTEwpLA0KKyAgICAgIG1fcERlbGVnYXRlKE5VTEwpLA0KKyAgICAgIG1fcEN1ckRlbGVnYXRlKE5VTEwpLA0KKyAgICAgIG1fcE91dGVyKHBPdXRlciksDQorICAgICAgbV9wSW50ZXJmYWNlKE5VTEwpLA0KKyAgICAgIG1faUxvY2soMCkgew0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzKSB7DQorICAgIG1fcFByb3BlcnRpZXMgPSBGWF9ORVcgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KKyAgfQ0KKyAgKm1fcFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOw0KKyAgbV9wV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICBGWFNZU19hc3NlcnQobV9wV2lkZ2V0TWdyICE9IE5VTEwpOw0KK30NCitDRldMX1dpZGdldEltcDo6fkNGV0xfV2lkZ2V0SW1wKCkgew0KKyAgaWYgKG1fcFByaXZhdGVEYXRhKSB7DQorICAgIGRlbGV0ZSBtX3BQcml2YXRlRGF0YTsNCisgICAgbV9wUHJpdmF0ZURhdGEgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMpIHsNCisgICAgZGVsZXRlIG1fcFByb3BlcnRpZXM7DQorICAgIG1fcFByb3BlcnRpZXMgPSBOVUxMOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc0VuYWJsZWQoKSB7DQorICByZXR1cm4gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpID09IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OklzVmlzaWJsZSgpIHsNCisgIHJldHVybiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpID09IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OklzQWN0aXZlKCkgew0KKyAgcmV0dXJuIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkKSA9PSAwOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc092ZXJMYXBwZXIoKSB7DQorICByZXR1cm4gKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfV2luZG93VHlwZU1hc2spID09DQorICAgICAgICAgRldMX1dHVFNUWUxFX092ZXJMYXBwZXI7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OklzUG9wdXAoKSB7DQorICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Qb3B1cDsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldEltcDo6SXNDaGlsZCgpIHsNCisgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0NoaWxkOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc0xvY2tlZCgpIHsNCisgIHJldHVybiBtX2lMb2NrID4gMDsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldEltcDo6SXNPZmZzY3JlZW4oKSB7DQorICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9PZmZzY3JlZW47DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6Okhhc0JvcmRlcigpIHsNCisgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0JvcmRlcjsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldEltcDo6SGFzRWRnZSgpIHsNCisgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0VkZ2VNYXNrOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpHZXRFZGdlUmVjdChDRlhfUmVjdEYmIHJ0RWRnZSkgew0KKyAgcnRFZGdlID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIHJ0RWRnZS5sZWZ0ID0gcnRFZGdlLnRvcCA9IDA7DQorICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgRlhfRkxPQVQgZkNYID0gR2V0Qm9yZGVyU2l6ZSgpOw0KKyAgICBGWF9GTE9BVCBmQ1kgPSBHZXRCb3JkZXJTaXplKEZBTFNFKTsNCisgICAgcnRFZGdlLkRlZmxhdGUoZkNYLCBmQ1kpOw0KKyAgfQ0KK30NCitGWF9GTE9BVCBDRldMX1dpZGdldEltcDo6R2V0Qm9yZGVyU2l6ZShGWF9CT09MIGJDWCkgew0KKyAgRlhfRkxPQVQqIHBmQm9yZGVyID0gKEZYX0ZMT0FUKilHZXRUaGVtZUNhcGFjaXR5KA0KKyAgICAgIGJDWCA/IEZXTF9XR1RDQVBBQ0lUWV9DWEJvcmRlciA6IEZXTF9XR1RDQVBBQ0lUWV9DWUJvcmRlcik7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBmQm9yZGVyLCAwKTsNCisgIHJldHVybiAqcGZCb3JkZXI7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfV2lkZ2V0SW1wOjpHZXRFZGdlV2lkdGgoKSB7DQorICBGWF9EV09SRCBkd0NhcGFjaXR5ID0gMDsNCisgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9FZGdlTWFzaykgew0KKyAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlRmxhdDogew0KKyAgICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRWRnZUZsYXQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUU1RZTEVfRWRnZVJhaXNlZDogew0KKyAgICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVJhaXNlZDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlU3Vua2VuOiB7DQorICAgICAgZHdDYXBhY2l0eSA9IEZXTF9XR1RDQVBBQ0lUWV9FZGdlU3Vua2VuOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoZHdDYXBhY2l0eSA+IDApIHsNCisgICAgRlhfRkxPQVQqIGZSZXQgPSAoRlhfRkxPQVQqKUdldFRoZW1lQ2FwYWNpdHkoZHdDYXBhY2l0eSk7DQorICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZlJldCwgMCk7DQorICAgIHJldHVybiAqZlJldDsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpHZXRSZWxhdGl2ZVJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIHJlY3QubGVmdCA9IHJlY3QudG9wID0gMDsNCit9DQordm9pZCogQ0ZXTF9XaWRnZXRJbXA6OkdldFRoZW1lQ2FwYWNpdHkoRlhfRFdPUkQgZHdDYXBhY2l0eSkgew0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwVGhlbWUsIE5VTEwpOw0KKyAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsNCisgIHBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcmV0dXJuIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIGR3Q2FwYWNpdHkpOw0KK30NCitJRldMX1RoZW1lUHJvdmlkZXIqIENGV0xfV2lkZ2V0SW1wOjpHZXRBdmFpbGFibGVUaGVtZSgpIHsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgfQ0KKyAgSUZXTF9XaWRnZXQqIHBVcCA9IG1fcEludGVyZmFjZTsNCisgIGRvIHsNCisgICAgRldMX1dHVFJFTEFUSU9OIHJlbGF0aW9uID0gKHBVcC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfUG9wdXApDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZXTF9XR1RSRUxBVElPTl9Pd25lcg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xfV0dUUkVMQVRJT05fUGFyZW50Ow0KKyAgICBwVXAgPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChwVXAsIHJlbGF0aW9uKTsNCisgICAgaWYgKHBVcCkgew0KKyAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFJldCA9IHBVcC0+R2V0VGhlbWVQcm92aWRlcigpOw0KKyAgICAgIGlmIChwUmV0ICYmIHBSZXQtPklzVmFsaWRXaWRnZXQobV9wSW50ZXJmYWNlKSkgew0KKyAgICAgICAgcmV0dXJuIHBSZXQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9IHdoaWxlIChwVXApOw0KKyAgcmV0dXJuICgoQ0ZXTF9BcHBJbXAqKUZXTF9HZXRBcHAoKSktPkdldFRoZW1lUHJvdmlkZXIoKTsNCit9DQorQ0ZXTF9XaWRnZXRJbXAqIENGV0xfV2lkZ2V0SW1wOjpHZXRSb290T3V0ZXIoKSB7DQorICBJRldMX1dpZGdldCogcFJldCA9IG1fcE91dGVyOw0KKyAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IHBSZXQ7DQorICB3aGlsZSAocE91dGVyKSB7DQorICAgIHBSZXQgPSBwT3V0ZXI7DQorICAgIHBPdXRlciA9IHBPdXRlci0+R2V0T3V0ZXIoKTsNCisgIH0NCisgIHJldHVybiAoQ0ZXTF9XaWRnZXRJbXAqKXBSZXQ7DQorfQ0KK0NGV0xfV2lkZ2V0SW1wKiBDRldMX1dpZGdldEltcDo6R2V0U2FtZUFuY2VzdG9yKENGV0xfV2lkZ2V0SW1wKiBwV2lkZ2V0KSB7DQorICBDRlhfUHRyQXJyYXkgYXJyMSwgYXJyMjsNCisgIENGV0xfV2lkZ2V0SW1wKiBwQW5jZXN0b3IgPSBwV2lkZ2V0Ow0KKyAgRldMX1dHVFJFTEFUSU9OIHJlbGF0aW9uOw0KKyAgZG8gew0KKyAgICBhcnIxLkFkZChwQW5jZXN0b3IpOw0KKyAgICByZWxhdGlvbiA9DQorICAgICAgICBwQW5jZXN0b3ItPklzUG9wdXAoKSA/IEZXTF9XR1RSRUxBVElPTl9Pd25lciA6IEZXTF9XR1RSRUxBVElPTl9QYXJlbnQ7DQorICB9IHdoaWxlICgocEFuY2VzdG9yID0gKENGV0xfV2lkZ2V0SW1wKiltX3BXaWRnZXRNZ3ItPkdldFdpZGdldCgNCisgICAgICAgICAgICAgICAgcEFuY2VzdG9yLT5tX3BJbnRlcmZhY2UsIHJlbGF0aW9uKSkgIT0gTlVMTCk7DQorICBwQW5jZXN0b3IgPSB0aGlzOw0KKyAgZG8gew0KKyAgICBhcnIyLkFkZChwQW5jZXN0b3IpOw0KKyAgICByZWxhdGlvbiA9DQorICAgICAgICBwQW5jZXN0b3ItPklzUG9wdXAoKSA/IEZXTF9XR1RSRUxBVElPTl9Pd25lciA6IEZXTF9XR1RSRUxBVElPTl9QYXJlbnQ7DQorICB9IHdoaWxlICgocEFuY2VzdG9yID0gKENGV0xfV2lkZ2V0SW1wKiltX3BXaWRnZXRNZ3ItPkdldFdpZGdldCgNCisgICAgICAgICAgICAgICAgcEFuY2VzdG9yLT5tX3BJbnRlcmZhY2UsIHJlbGF0aW9uKSkgIT0gTlVMTCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcnIxLkdldFNpemUoKTsgaSsrKSB7DQorICAgIHZvaWQqIHBWb2lkID0gYXJyMVtpXTsNCisgICAgaWYgKGFycjIuRmluZChwVm9pZCkgPCAwKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0gZWxzZSB7DQorICAgICAgcmV0dXJuIChDRldMX1dpZGdldEltcCopcFZvaWQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDRlhfU2l6ZUYgQ0ZXTF9XaWRnZXRJbXA6OkdldE9mZnNldEZyb21BbmNlc3RvcihDRldMX1dpZGdldEltcCogcEFuY2VzdG9yKSB7DQorICBDRlhfU2l6ZUYgc3pSZXQ7DQorICBzelJldC5TZXQoMCwgMCk7DQorICBpZiAocEFuY2VzdG9yID09IHRoaXMpIHsNCiAgICAgcmV0dXJuIHN6UmV0Ow0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXAqIHBXaWRnZXQgPSB0aGlzOw0KKyAgZG8gew0KKyAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgc3pSZXQueCArPSByZWN0LmxlZnQ7DQorICAgIHN6UmV0LnkgKz0gcmVjdC50b3A7DQorICAgIEZXTF9XR1RSRUxBVElPTiByZWxhdGlvbiA9DQorICAgICAgICBwV2lkZ2V0LT5Jc1BvcHVwKCkgPyBGV0xfV0dUUkVMQVRJT05fT3duZXIgOiBGV0xfV0dUUkVMQVRJT05fUGFyZW50Ow0KKyAgICBwV2lkZ2V0ID0gKENGV0xfV2lkZ2V0SW1wKiltX3BXaWRnZXRNZ3ItPkdldFdpZGdldCgoSUZXTF9XaWRnZXQqKXBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uKTsNCisgIH0gd2hpbGUgKHBXaWRnZXQgJiYgcFdpZGdldCAhPSBwQW5jZXN0b3IpOw0KKyAgcmV0dXJuIHN6UmV0Ow0KIH0NCi1GWF9CT09MCUNGV0xfV2lkZ2V0SW1wOjpJc1BhcmVudChJRldMX1dpZGdldCAqcFBhcmVudCkNCi17DQotICAgIGlmIChwUGFyZW50ID09IChJRldMX1dpZGdldCopdGhpcykgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OlRyYW5zZm9ybVRvT3V0ZXIoRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wT3V0ZXIsIEZBTFNFKTsNCisgIGZ4ICs9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdDsNCisgIGZ4ICs9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OlRyYW5zZm9ybUZyb21PdXRlcihGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BPdXRlciwgRkFMU0UpOw0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICBtX3BPdXRlci0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgIGZ4IC09IHJlY3QubGVmdDsNCisgIGZ4IC09IHJlY3QudG9wOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KKyNkZWZpbmUgRldMX1dHVF9DYWxjSGVpZ2h0IDIwNDgNCisjZGVmaW5lIEZXTF9XR1RfQ2FsY1dpZHRoIDIwNDgNCisjZGVmaW5lIEZXTF9XR1RfQ2FsY011bHRpTGluZURlZldpZHRoIDEyMC4wZg0KK0NGWF9TaXplRiBDRldMX1dpZGdldEltcDo6Q2FsY1RleHRTaXplKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTXVsdGlMaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxpbmVXaWR0aCkgew0KKyAgQ0ZYX1NpemVGIHN6Ow0KKyAgc3ouU2V0KDAsIDApOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwVGhlbWUsIHN6KTsNCisgIENGV0xfVGhlbWVUZXh0IGNhbFBhcnQ7DQorICBjYWxQYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIGNhbFBhcnQubV93c1RleHQgPSB3c1RleHQ7DQorICBjYWxQYXJ0Lm1fZHdUVE9TdHlsZXMgPQ0KKyAgICAgIGJNdWx0aUxpbmUgPyBGREVfVFRPU1RZTEVfTGluZVdyYXAgOiBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgIGNhbFBhcnQubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcExlZnQ7DQorICBDRlhfUmVjdEYgcmVjdDsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IGJNdWx0aUxpbmUNCisgICAgICAgICAgICAgICAgICAgICAgICA/IChpTGluZVdpZHRoID4gMCA/IChGWF9GTE9BVClpTGluZVdpZHRoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xfV0dUX0NhbGNNdWx0aUxpbmVEZWZXaWR0aCkNCisgICAgICAgICAgICAgICAgICAgICAgICA6IEZXTF9XR1RfQ2FsY1dpZHRoOw0KKyAgcmVjdC5TZXQoMCwgMCwgZldpZHRoLCBGV0xfV0dUX0NhbGNIZWlnaHQpOw0KKyAgcFRoZW1lLT5DYWxjVGV4dFJlY3QoJmNhbFBhcnQsIHJlY3QpOw0KKyAgc3oueCA9IHJlY3Qud2lkdGg7DQorICBzei55ID0gcmVjdC5oZWlnaHQ7DQorICByZXR1cm4gc3o7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OkNhbGNUZXh0UmVjdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUVE9TdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRUT0FsaWduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIENGV0xfVGhlbWVUZXh0IGNhbFBhcnQ7DQorICBjYWxQYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIGNhbFBhcnQubV93c1RleHQgPSB3c1RleHQ7DQorICBjYWxQYXJ0Lm1fZHdUVE9TdHlsZXMgPSBkd1RUT1N0eWxlczsNCisgIGNhbFBhcnQubV9pVFRPQWxpZ24gPSBpVFRPQWxpZ247DQorICBwVGhlbWUtPkNhbGNUZXh0UmVjdCgmY2FsUGFydCwgcmVjdCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OlNldEZvY3VzKEZYX0JPT0wgYkZvY3VzKSB7DQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IEdldE93bmVyVGhyZWFkKCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwRHJpdmVyID0gcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwRHJpdmVyKTsNCisgIElGV0xfV2lkZ2V0KiBjdXJGb2N1cyA9ICgoQ0ZXTF9Ob3RlRHJpdmVyKilwRHJpdmVyKS0+R2V0Rm9jdXMoKTsNCisgIGlmIChiRm9jdXMgJiYgY3VyRm9jdXMgIT0gbV9wSW50ZXJmYWNlKSB7DQorICAgIHBEcml2ZXItPlNldEZvY3VzKG1fcEludGVyZmFjZSk7DQorICB9IGVsc2UgaWYgKCFiRm9jdXMgJiYgY3VyRm9jdXMgPT0gbV9wSW50ZXJmYWNlKSB7DQorICAgIHBEcml2ZXItPlNldEZvY3VzKE5VTEwpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpTZXRHcmFiKEZYX0JPT0wgYlNldCkgew0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQorICBDRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICBwRHJpdmVyLT5TZXRHcmFiKG1fcEludGVyZmFjZSwgYlNldCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OkdldFBvcHVwUG9zKEZYX0ZMT0FUIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCkgew0KKyAgaWYgKEdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX01lbnUpIHsNCisgICAgcmV0dXJuIEdldFBvcHVwUG9zTWVudShmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydEFuY2hvciwgcnRQb3B1cCk7DQorICB9IGVsc2Ugew0KKyAgICBpZiAoR2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfQ29tYm9Cb3gpIHsNCisgICAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICByZXR1cm4gbV9wV2lkZ2V0TWdyLT5HZXRBZGFwdGVyUG9wdXBQb3MobV9wSW50ZXJmYWNlLCBmTWluSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNYXhIZWlnaHQsIHJ0QW5jaG9yLCBydFBvcHVwKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIEdldFBvcHVwUG9zQ29tYm9Cb3goZk1pbkhlaWdodCwgZk1heEhlaWdodCwgcnRBbmNob3IsIHJ0UG9wdXApOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChHZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9EYXRlVGltZVBpY2tlciAmJg0KKyAgICAgICAgICAgICAgIG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgIHJldHVybiBtX3BXaWRnZXRNZ3ItPkdldEFkYXB0ZXJQb3B1cFBvcyhtX3BJbnRlcmZhY2UsIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNYXhIZWlnaHQsIHJ0QW5jaG9yLCBydFBvcHVwKTsNCisgICAgfSBlbHNlIHsNCisgICAgICByZXR1cm4gR2V0UG9wdXBQb3NHZW5lcmFsKGZNaW5IZWlnaHQsIGZNYXhIZWlnaHQsIHJ0QW5jaG9yLCBydFBvcHVwKTsNCiAgICAgfQ0KLSAgICBJRldMX1dpZGdldCAqcFVwV2lkZ2V0ID0gR2V0UGFyZW50KCk7DQotICAgIHdoaWxlIChwVXBXaWRnZXQpIHsNCi0gICAgICAgIGlmIChwVXBXaWRnZXQgPT0gcFBhcmVudCkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFVwV2lkZ2V0ID0gcFVwV2lkZ2V0LT5HZXRQYXJlbnQoKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldEltcDo6R2V0UG9wdXBQb3NNZW51KEZYX0ZMT0FUIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCkgew0KKyAgRlhfRkxPQVQgZnggPSAwOw0KKyAgRlhfRkxPQVQgZnkgPSAwOw0KKyAgRlhfRkxPQVQgZlNjcmVlbldpZHRoID0gMDsNCisgIEZYX0ZMT0FUIGZTY3JlZW5IZWlnaHQgPSAwOw0KKyAgR2V0U2NyZWVuU2l6ZShmU2NyZWVuV2lkdGgsIGZTY3JlZW5IZWlnaHQpOw0KKyAgaWYgKEdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTU5VX1ZlcnQpIHsNCisgICAgRlhfQk9PTCBiTGVmdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCA8IDA7DQorICAgIEZYX0ZMT0FUIGZSaWdodCA9IHJ0QW5jaG9yLnJpZ2h0KCkgKyBydFBvcHVwLndpZHRoOw0KKyAgICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KKyAgICBpZiAoZlJpZ2h0ICsgZnggPiBmU2NyZWVuV2lkdGggfHwgYkxlZnQpIHsNCisgICAgICBydFBvcHVwLlNldChydEFuY2hvci5sZWZ0IC0gcnRQb3B1cC53aWR0aCwgcnRBbmNob3IudG9wLCBydFBvcHVwLndpZHRoLA0KKyAgICAgICAgICAgICAgICAgIHJ0UG9wdXAuaGVpZ2h0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBydFBvcHVwLlNldChydEFuY2hvci5yaWdodCgpLCBydEFuY2hvci50b3AsIHJ0UG9wdXAud2lkdGgsDQorICAgICAgICAgICAgICAgICAgcnRQb3B1cC5oZWlnaHQpOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBGWF9GTE9BVCBmQm90dG9tID0gcnRBbmNob3IuYm90dG9tKCkgKyBydFBvcHVwLmhlaWdodDsNCisgICAgVHJhbnNmb3JtVG8oTlVMTCwgZngsIGZ5KTsNCisgICAgaWYgKGZCb3R0b20gKyBmeSA+IGZTY3JlZW5IZWlnaHQpIHsNCisgICAgICBydFBvcHVwLlNldChydEFuY2hvci5sZWZ0LCBydEFuY2hvci50b3AgLSBydFBvcHVwLmhlaWdodCwgcnRQb3B1cC53aWR0aCwNCisgICAgICAgICAgICAgICAgICBydFBvcHVwLmhlaWdodCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcnRQb3B1cC5TZXQocnRBbmNob3IubGVmdCwgcnRBbmNob3IuYm90dG9tKCksIHJ0UG9wdXAud2lkdGgsDQorICAgICAgICAgICAgICAgICAgcnRQb3B1cC5oZWlnaHQpOw0KKyAgICB9DQorICB9DQorICBydFBvcHVwLk9mZnNldChmeCwgZnkpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OkdldFBvcHVwUG9zQ29tYm9Cb3goRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKSB7DQorICBGWF9GTE9BVCBmeCA9IDA7DQorICBGWF9GTE9BVCBmeSA9IDA7DQorICBGWF9GTE9BVCBmU2NyZWVuV2lkdGggPSAwOw0KKyAgRlhfRkxPQVQgZlNjcmVlbkhlaWdodCA9IDA7DQorICBHZXRTY3JlZW5TaXplKGZTY3JlZW5XaWR0aCwgZlNjcmVlbkhlaWdodCk7DQorICBGWF9GTE9BVCBmUG9wSGVpZ2h0ID0gcnRQb3B1cC5oZWlnaHQ7DQorICBpZiAocnRQb3B1cC5oZWlnaHQgPiBmTWF4SGVpZ2h0KSB7DQorICAgIGZQb3BIZWlnaHQgPSBmTWF4SGVpZ2h0Ow0KKyAgfSBlbHNlIGlmIChydFBvcHVwLmhlaWdodCA8IGZNaW5IZWlnaHQpIHsNCisgICAgZlBvcEhlaWdodCA9IGZNaW5IZWlnaHQ7DQorICB9DQorICBGWF9GTE9BVCBmV2lkdGggPSBGWF9NQVgocnRBbmNob3Iud2lkdGgsIHJ0UG9wdXAud2lkdGgpOw0KKyAgRlhfRkxPQVQgZkJvdHRvbSA9IHJ0QW5jaG9yLmJvdHRvbSgpICsgZlBvcEhlaWdodDsNCisgIFRyYW5zZm9ybVRvKE5VTEwsIGZ4LCBmeSk7DQorICBpZiAoZkJvdHRvbSArIGZ5ID4gZlNjcmVlbkhlaWdodCkgew0KKyAgICBydFBvcHVwLlNldChydEFuY2hvci5sZWZ0LCBydEFuY2hvci50b3AgLSBmUG9wSGVpZ2h0LCBmV2lkdGgsIGZQb3BIZWlnaHQpOw0KKyAgfSBlbHNlIHsNCisgICAgcnRQb3B1cC5TZXQocnRBbmNob3IubGVmdCwgcnRBbmNob3IuYm90dG9tKCksIGZXaWR0aCwgZlBvcEhlaWdodCk7DQorICB9DQorICBydFBvcHVwLk9mZnNldChmeCwgZnkpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OkdldFBvcHVwUG9zR2VuZXJhbChGWF9GTE9BVCBmTWluSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApIHsNCisgIEZYX0ZMT0FUIGZ4ID0gMDsNCisgIEZYX0ZMT0FUIGZ5ID0gMDsNCisgIEZYX0ZMT0FUIGZTY3JlZW5XaWR0aCA9IDA7DQorICBGWF9GTE9BVCBmU2NyZWVuSGVpZ2h0ID0gMDsNCisgIEdldFNjcmVlblNpemUoZlNjcmVlbldpZHRoLCBmU2NyZWVuSGVpZ2h0KTsNCisgIFRyYW5zZm9ybVRvKE5VTEwsIGZ4LCBmeSk7DQorICBpZiAocnRBbmNob3IuYm90dG9tKCkgKyBmeSA+IGZTY3JlZW5IZWlnaHQpIHsNCisgICAgcnRQb3B1cC5TZXQocnRBbmNob3IubGVmdCwgcnRBbmNob3IudG9wIC0gcnRQb3B1cC5oZWlnaHQsIHJ0UG9wdXAud2lkdGgsDQorICAgICAgICAgICAgICAgIHJ0UG9wdXAuaGVpZ2h0KTsNCisgIH0gZWxzZSB7DQorICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQsIHJ0QW5jaG9yLmJvdHRvbSgpLCBydFBvcHVwLndpZHRoLA0KKyAgICAgICAgICAgICAgICBydFBvcHVwLmhlaWdodCk7DQorICB9DQorICBydFBvcHVwLk9mZnNldChmeCwgZnkpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OkdldFNjcmVlblNpemUoRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpIHsNCisgIElGV0xfQWRhcHRlck5hdGl2ZSogcE5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQorICBJRldMX0FkYXB0ZXJNb25pdG9yTWdyKiBwTW9uaXRvck1nciA9IHBOYXRpdmUtPkdldE1vbml0b3JNZ3IoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1vbml0b3JNZ3IsIEZBTFNFKTsNCisgIEZXTF9ITU9OSVRPUiBoTW9uaXRvciA9IHBNb25pdG9yTWdyLT5HZXRNb25pdG9yQnlQb2ludChmeCwgZnkpOw0KKyAgcE1vbml0b3JNZ3ItPkdldE1vbml0b3JTaXplKGhNb25pdG9yLCBmeCwgZnkpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OlJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQqIHBFdmVudFNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmlsdGVyKSB7DQorICBJRldMX05vdGVUaHJlYWQqIHBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhyZWFkKTsNCisgIElGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBOb3RlRHJpdmVyKTsNCisgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KG1fcEludGVyZmFjZSwgcEV2ZW50U291cmNlLCBkd0ZpbHRlcik7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OlVucmVnaXN0ZXJFdmVudFRhcmdldCgpIHsNCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IEdldE93bmVyVGhyZWFkKCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBUaHJlYWQpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE5vdGVEcml2ZXIpOw0KKyAgcE5vdGVEcml2ZXItPlVucmVnaXN0ZXJFdmVudFRhcmdldChtX3BJbnRlcmZhY2UpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpEaXNwYXRjaEtleUV2ZW50KENGV0xfTXNnS2V5KiBwTm90ZSkgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTm90ZSk7DQorICBDRldMX01zZ0tleSogcEV2ZW50ID0gKENGV0xfTXNnS2V5KilwTm90ZS0+Q2xvbmVUb0V2ZW50KCk7DQorICBwRXZlbnQtPm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgIHBFdmVudC0+bV9kd0NtZCA9IHBOb3RlLT5tX2R3Q21kOw0KKyAgcEV2ZW50LT5tX2R3S2V5Q29kZSA9IHBOb3RlLT5tX2R3S2V5Q29kZTsNCisgIHBFdmVudC0+bV9kd0ZsYWdzID0gcE5vdGUtPm1fZHdGbGFnczsNCisgIERpc3BhdGNoRXZlbnQoKENGV0xfRXZlbnQqKXBFdmVudCk7DQorICBwRXZlbnQtPlJlbGVhc2UoKTsNCit9DQordm9pZCBDRldMX1dpZGdldEltcDo6RGlzcGF0Y2hFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIGlmIChtX3BPdXRlcikgew0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUgPSBtX3BPdXRlci0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQorICBJRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTm90ZURyaXZlcik7DQorICBwTm90ZURyaXZlci0+U2VuZE5vdGUocEV2ZW50KTsNCit9DQordm9pZCBDRldMX1dpZGdldEltcDo6UmVwYWludChjb25zdCBDRlhfUmVjdEYqIHBSZWN0KSB7DQorICBpZiAocFJlY3QpIHsNCisgICAgbV9wV2lkZ2V0TWdyLT5SZXBhaW50V2lkZ2V0KG1fcEludGVyZmFjZSwgcFJlY3QpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfUmVjdEYgcmVjdDsNCisgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOw0KKyAgbV9wV2lkZ2V0TWdyLT5SZXBhaW50V2lkZ2V0KG1fcEludGVyZmFjZSwgJnJlY3QpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYXJ0QmssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1JlY3RGIHJ0UmVsYXRpdmU7DQorICBHZXRSZWxhdGl2ZVJlY3QocnRSZWxhdGl2ZSk7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtLm1faVBhcnQgPSBpUGFydEJrOw0KKyAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgsIFRSVUUpOw0KKyAgfQ0KKyAgcGFyYW0ubV9ydFBhcnQgPSBydFJlbGF0aXZlOw0KKyAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpEcmF3Qm9yZGVyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFydEJvcmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1JlY3RGIHJ0UmVsYXRpdmU7DQorICBHZXRSZWxhdGl2ZVJlY3QocnRSZWxhdGl2ZSk7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtLm1faVBhcnQgPSBpUGFydEJvcmRlcjsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4LCBUUlVFKTsNCisgIH0NCisgIHBhcmFtLm1fcnRQYXJ0ID0gcnRSZWxhdGl2ZTsNCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQordm9pZCBDRldMX1dpZGdldEltcDo6RHJhd0VkZ2UoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFydEVkZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1JlY3RGIHJ0RWRnZTsNCisgIEdldEVkZ2VSZWN0KHJ0RWRnZSk7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtLm1faVBhcnQgPSBpUGFydEVkZ2U7DQorICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCwgVFJVRSk7DQorICB9DQorICBwYXJhbS5tX3J0UGFydCA9IHJ0RWRnZTsNCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQordm9pZCBDRldMX1dpZGdldEltcDo6Tm90aWZ5RHJpdmVyKCkgew0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQorICBDRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPSAoQ0ZXTF9Ob3RlRHJpdmVyKilwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBEcml2ZXIpOw0KKyAgcERyaXZlci0+Tm90aWZ5VGFyZ2V0RGVzdHJveShtX3BJbnRlcmZhY2UpOw0KK30NCitDRlhfU2l6ZUYgQ0ZXTF9XaWRnZXRJbXA6OkdldE9mZnNldEZyb21QYXJlbnQoSUZXTF9XaWRnZXQqIHBQYXJlbnQpIHsNCisgIENGWF9TaXplRiBzelJldDsNCisgIHN6UmV0LlNldCgwLCAwKTsNCisgIGlmIChwUGFyZW50ID09IChJRldMX1dpZGdldCopdGhpcykgew0KKyAgICByZXR1cm4gc3pSZXQ7DQorICB9DQorICBJRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IEZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldE1nciwgc3pSZXQpOw0KKyAgc3pSZXQueCArPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmxlZnQ7DQorICBzelJldC55ICs9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wOw0KKyAgSUZXTF9XaWRnZXQqIHBEc3RXaWRnZXQgPSBHZXRQYXJlbnQoKTsNCisgIHdoaWxlIChwRHN0V2lkZ2V0ICYmIHBEc3RXaWRnZXQgIT0gcFBhcmVudCkgew0KKyAgICBDRlhfUmVjdEYgcnREc3Q7DQorICAgIHBEc3RXaWRnZXQtPkdldFdpZGdldFJlY3QocnREc3QpOw0KKyAgICBzelJldC54ICs9IHJ0RHN0LmxlZnQ7DQorICAgIHN6UmV0LnkgKz0gcnREc3QudG9wOw0KKyAgICBwRHN0V2lkZ2V0ID0gcFdpZGdldE1nci0+R2V0V2lkZ2V0KHBEc3RXaWRnZXQsIEZXTF9XR1RSRUxBVElPTl9QYXJlbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIHN6UmV0Ow0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc1BhcmVudChJRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgaWYgKHBQYXJlbnQgPT0gKElGV0xfV2lkZ2V0Kil0aGlzKSB7DQogICAgIHJldHVybiBGQUxTRTsNCi19DQotQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6Q0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSgpDQotew0KLX0NCi1pbnQzMl90IENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UtPm1fcERzdFRhcmdldCwgMCk7DQotICAgIENGV0xfV2lkZ2V0SW1wICpwV2lkZ2V0ID0gKENGV0xfV2lkZ2V0SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopcE1lc3NhZ2UtPm1fcERzdFRhcmdldCktPkdldERhdGEoKTsNCi0gICAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCi0gICAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9FdnRNb3VzZSBldnQ7DQotICAgICAgICAgICAgICAgIGV2dC5tX3BTcmNUYXJnZXQgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQotICAgICAgICAgICAgICAgIGV2dC5tX3BEc3RUYXJnZXQgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQotICAgICAgICAgICAgICAgIGV2dC5tX2R3Q21kID0gKChDRldMX01zZ01vdXNlKilwTWVzc2FnZSktPm1fZHdDbWQ7DQotICAgICAgICAgICAgICAgIGV2dC5tX2R3RmxhZ3MgPSAoKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlKS0+bV9kd0ZsYWdzOw0KLSAgICAgICAgICAgICAgICBldnQubV9meCA9ICgoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2UpLT5tX2Z4Ow0KLSAgICAgICAgICAgICAgICBldnQubV9meSA9ICgoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2UpLT5tX2Z5Ow0KLSAgICAgICAgICAgICAgICBwV2lkZ2V0LT5EaXNwYXRjaEV2ZW50KCZldnQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlV2hlZWw6IHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9FdnRNb3VzZVdoZWVsIGV2dDsNCi0gICAgICAgICAgICAgICAgZXZ0Lm1fcFNyY1RhcmdldCA9IHBXaWRnZXQtPm1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICAgICAgZXZ0Lm1fcERzdFRhcmdldCA9IHBXaWRnZXQtPm1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICAgICAgZXZ0Lm1fZHdGbGFncyA9ICgoQ0ZXTF9Nc2dNb3VzZVdoZWVsKilwTWVzc2FnZSktPm1fZHdGbGFnczsNCi0gICAgICAgICAgICAgICAgZXZ0Lm1fZkRlbHRhWCA9ICgoQ0ZXTF9Nc2dNb3VzZVdoZWVsKilwTWVzc2FnZSktPm1fZkRlbHRhWDsNCi0gICAgICAgICAgICAgICAgZXZ0Lm1fZkRlbHRhWSA9ICgoQ0ZXTF9Nc2dNb3VzZVdoZWVsKilwTWVzc2FnZSktPm1fZkRlbHRhWTsNCi0gICAgICAgICAgICAgICAgZXZ0Lm1fZnggPSAoKENGV0xfTXNnTW91c2VXaGVlbCopcE1lc3NhZ2UpLT5tX2Z4Ow0KLSAgICAgICAgICAgICAgICBldnQubV9meSA9ICgoQ0ZXTF9Nc2dNb3VzZVdoZWVsKilwTWVzc2FnZSktPm1fZnk7DQotICAgICAgICAgICAgICAgIHBXaWRnZXQtPkRpc3BhdGNoRXZlbnQoJmV2dCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQotICAgICAgICAgICAgICAgIENGV0xfRXZ0S2V5IGV2dDsNCi0gICAgICAgICAgICAgICAgZXZ0Lm1fcFNyY1RhcmdldCA9IHBXaWRnZXQtPm1fcEludGVyZmFjZTs7DQotICAgICAgICAgICAgICAgIGV2dC5tX3BEc3RUYXJnZXQgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7Ow0KLSAgICAgICAgICAgICAgICBldnQubV9kd0tleUNvZGUgPSAoKENGV0xfTXNnS2V5KilwTWVzc2FnZSktPm1fZHdLZXlDb2RlOw0KLSAgICAgICAgICAgICAgICBldnQubV9kd0ZsYWdzID0gKChDRldMX01zZ0tleSopcE1lc3NhZ2UpLT5tX2R3RmxhZ3M7DQotICAgICAgICAgICAgICAgIGV2dC5tX2R3Q21kID0gKChDRldMX01zZ0tleSopcE1lc3NhZ2UpLT5tX2R3Q21kOw0KLSAgICAgICAgICAgICAgICBwV2lkZ2V0LT5EaXNwYXRjaEV2ZW50KCZldnQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOiB7DQotICAgICAgICAgICAgICAgIENGV0xfRXZ0U2V0Rm9jdXMgZXZ0Ow0KLSAgICAgICAgICAgICAgICBldnQubV9wU3JjVGFyZ2V0ID0gKChDRldMX01zZ1NldEZvY3VzKilwTWVzc2FnZSktPm1fcERzdFRhcmdldDsNCi0gICAgICAgICAgICAgICAgZXZ0Lm1fcERzdFRhcmdldCA9ICgoQ0ZXTF9Nc2dTZXRGb2N1cyopcE1lc3NhZ2UpLT5tX3BEc3RUYXJnZXQ7DQotICAgICAgICAgICAgICAgIGV2dC5tX3BTZXRGb2N1cyA9IHBXaWRnZXQtPm1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICAgICAgcFdpZGdldC0+RGlzcGF0Y2hFdmVudCgmZXZ0KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9FdnRLaWxsRm9jdXMgZXZ0Ow0KLSAgICAgICAgICAgICAgICBldnQubV9wU3JjVGFyZ2V0ID0gKChDRldMX01zZ0tpbGxGb2N1cyopcE1lc3NhZ2UpLT5tX3BEc3RUYXJnZXQ7DQotICAgICAgICAgICAgICAgIGV2dC5tX3BEc3RUYXJnZXQgPSAoKENGV0xfTXNnS2lsbEZvY3VzKilwTWVzc2FnZSktPm1fcERzdFRhcmdldDsNCi0gICAgICAgICAgICAgICAgZXZ0Lm1fcEtpbGxGb2N1cyA9IHBXaWRnZXQtPm1fcEludGVyZmFjZTsNCi0gICAgICAgICAgICAgICAgcFdpZGdldC0+RGlzcGF0Y2hFdmVudCgmZXZ0KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCisgIH0NCisgIElGV0xfV2lkZ2V0KiBwVXBXaWRnZXQgPSBHZXRQYXJlbnQoKTsNCisgIHdoaWxlIChwVXBXaWRnZXQpIHsNCisgICAgaWYgKHBVcFdpZGdldCA9PSBwUGFyZW50KSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi0gICAgcmV0dXJuIDE7DQorICAgIHBVcFdpZGdldCA9IHBVcFdpZGdldC0+R2V0UGFyZW50KCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0NGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6OkNGV0xfV2lkZ2V0SW1wRGVsZWdhdGUoKSB7fQ0KK2ludDMyX3QgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLT5tX3BEc3RUYXJnZXQsIDApOw0KKyAgQ0ZXTF9XaWRnZXRJbXAqIHBXaWRnZXQgPQ0KKyAgICAgIChDRldMX1dpZGdldEltcCopKChJRldMX1RhcmdldERhdGEqKXBNZXNzYWdlLT5tX3BEc3RUYXJnZXQpLT5HZXREYXRhKCk7DQorICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KKyAgICAgIENGV0xfRXZ0TW91c2UgZXZ0Ow0KKyAgICAgIGV2dC5tX3BTcmNUYXJnZXQgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQorICAgICAgZXZ0Lm1fcERzdFRhcmdldCA9IHBXaWRnZXQtPm1fcEludGVyZmFjZTsNCisgICAgICBldnQubV9kd0NtZCA9ICgoQ0ZXTF9Nc2dNb3VzZSopcE1lc3NhZ2UpLT5tX2R3Q21kOw0KKyAgICAgIGV2dC5tX2R3RmxhZ3MgPSAoKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlKS0+bV9kd0ZsYWdzOw0KKyAgICAgIGV2dC5tX2Z4ID0gKChDRldMX01zZ01vdXNlKilwTWVzc2FnZSktPm1fZng7DQorICAgICAgZXZ0Lm1fZnkgPSAoKENGV0xfTXNnTW91c2UqKXBNZXNzYWdlKS0+bV9meTsNCisgICAgICBwV2lkZ2V0LT5EaXNwYXRjaEV2ZW50KCZldnQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2VXaGVlbDogew0KKyAgICAgIENGV0xfRXZ0TW91c2VXaGVlbCBldnQ7DQorICAgICAgZXZ0Lm1fcFNyY1RhcmdldCA9IHBXaWRnZXQtPm1fcEludGVyZmFjZTsNCisgICAgICBldnQubV9wRHN0VGFyZ2V0ID0gcFdpZGdldC0+bV9wSW50ZXJmYWNlOw0KKyAgICAgIGV2dC5tX2R3RmxhZ3MgPSAoKENGV0xfTXNnTW91c2VXaGVlbCopcE1lc3NhZ2UpLT5tX2R3RmxhZ3M7DQorICAgICAgZXZ0Lm1fZkRlbHRhWCA9ICgoQ0ZXTF9Nc2dNb3VzZVdoZWVsKilwTWVzc2FnZSktPm1fZkRlbHRhWDsNCisgICAgICBldnQubV9mRGVsdGFZID0gKChDRldMX01zZ01vdXNlV2hlZWwqKXBNZXNzYWdlKS0+bV9mRGVsdGFZOw0KKyAgICAgIGV2dC5tX2Z4ID0gKChDRldMX01zZ01vdXNlV2hlZWwqKXBNZXNzYWdlKS0+bV9meDsNCisgICAgICBldnQubV9meSA9ICgoQ0ZXTF9Nc2dNb3VzZVdoZWVsKilwTWVzc2FnZSktPm1fZnk7DQorICAgICAgcFdpZGdldC0+RGlzcGF0Y2hFdmVudCgmZXZ0KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgIENGV0xfRXZ0S2V5IGV2dDsNCisgICAgICBldnQubV9wU3JjVGFyZ2V0ID0gcFdpZGdldC0+bV9wSW50ZXJmYWNlOw0KKyAgICAgIDsNCisgICAgICBldnQubV9wRHN0VGFyZ2V0ID0gcFdpZGdldC0+bV9wSW50ZXJmYWNlOw0KKyAgICAgIDsNCisgICAgICBldnQubV9kd0tleUNvZGUgPSAoKENGV0xfTXNnS2V5KilwTWVzc2FnZSktPm1fZHdLZXlDb2RlOw0KKyAgICAgIGV2dC5tX2R3RmxhZ3MgPSAoKENGV0xfTXNnS2V5KilwTWVzc2FnZSktPm1fZHdGbGFnczsNCisgICAgICBldnQubV9kd0NtZCA9ICgoQ0ZXTF9Nc2dLZXkqKXBNZXNzYWdlKS0+bV9kd0NtZDsNCisgICAgICBwV2lkZ2V0LT5EaXNwYXRjaEV2ZW50KCZldnQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6IHsNCisgICAgICBDRldMX0V2dFNldEZvY3VzIGV2dDsNCisgICAgICBldnQubV9wU3JjVGFyZ2V0ID0gKChDRldMX01zZ1NldEZvY3VzKilwTWVzc2FnZSktPm1fcERzdFRhcmdldDsNCisgICAgICBldnQubV9wRHN0VGFyZ2V0ID0gKChDRldMX01zZ1NldEZvY3VzKilwTWVzc2FnZSktPm1fcERzdFRhcmdldDsNCisgICAgICBldnQubV9wU2V0Rm9jdXMgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQorICAgICAgcFdpZGdldC0+RGlzcGF0Y2hFdmVudCgmZXZ0KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KKyAgICAgIENGV0xfRXZ0S2lsbEZvY3VzIGV2dDsNCisgICAgICBldnQubV9wU3JjVGFyZ2V0ID0gKChDRldMX01zZ0tpbGxGb2N1cyopcE1lc3NhZ2UpLT5tX3BEc3RUYXJnZXQ7DQorICAgICAgZXZ0Lm1fcERzdFRhcmdldCA9ICgoQ0ZXTF9Nc2dLaWxsRm9jdXMqKXBNZXNzYWdlKS0+bV9wRHN0VGFyZ2V0Ow0KKyAgICAgIGV2dC5tX3BLaWxsRm9jdXMgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQorICAgICAgcFdpZGdldC0+RGlzcGF0Y2hFdmVudCgmZXZ0KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIDE7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIENGV0xfRXZ0RHJhdyBldnQ7DQotICAgIGV2dC5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLWNsYXNzIENGV0xfQ3VzdG9tIDogcHVibGljIENGV0xfV2lkZ2V0SW1wDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9DdXN0b20oSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICBDRldMX0N1c3RvbShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJVXBkYXRlKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0UHJveHkoSUZXTF9Qcm94eSAqcFByb3h5KTsNCi1wcm90ZWN0ZWQ6DQotICAgIElGV0xfUHJveHkJKm1fcFByb3h5Ow0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfRXZ0RHJhdyBldnQ7DQorICBldnQubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2NsYXNzIENGV0xfQ3VzdG9tIDogcHVibGljIENGV0xfV2lkZ2V0SW1wIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9DdXN0b20oSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgQ0ZXTF9DdXN0b20oY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRQcm94eShJRldMX1Byb3h5KiBwUHJveHkpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX1Byb3h5KiBtX3BQcm94eTsNCiB9Ow0KLUNGV0xfQ3VzdG9tOjpDRldMX0N1c3RvbShJRldMX1dpZGdldCAqcE91dGVyICkNCi0gICAgOiBDRldMX1dpZGdldEltcChwT3V0ZXIpDQotICAgICwgbV9wUHJveHkoTlVMTCkNCi17DQotfQ0KLUNGV0xfQ3VzdG9tOjpDRldMX0N1c3RvbShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgJnByb3BlcnRpZXMsIElGV0xfV2lkZ2V0ICpwT3V0ZXIgKQ0KLSAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlcikNCi0gICAgLCBtX3BQcm94eShOVUxMKQ0KLXsNCi19DQotRldMX0VSUiBDRldMX0N1c3RvbTo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplICkNCi17DQotICAgIGlmIChtX3BQcm94eSAmJiAobV9wUHJveHktPkdldFdpZGdldFJlY3QocmVjdCwgYkF1dG9TaXplKSA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgYkF1dG9TaXplKTsNCi19DQotRldMX0VSUglDRldMX0N1c3RvbTo6VXBkYXRlKCkNCi17DQotICAgIGlmIChtX3BQcm94eSkgew0KLSAgICAgICAgcmV0dXJuIG1fcFByb3h5LT5VcGRhdGUoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OlVwZGF0ZSgpOw0KLX0NCi1GV0xfRVJSCUNGV0xfQ3VzdG9tOjpTZXRQcm94eShJRldMX1Byb3h5ICpwUHJveHkpDQotew0KLSAgICBtX3BQcm94eSA9IHBQcm94eTsNCitDRldMX0N1c3RvbTo6Q0ZXTF9DdXN0b20oSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwT3V0ZXIpLCBtX3BQcm94eShOVUxMKSB7fQ0KK0NGV0xfQ3VzdG9tOjpDRldMX0N1c3RvbShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKSwgbV9wUHJveHkoTlVMTCkge30NCitGV0xfRVJSIENGV0xfQ3VzdG9tOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmIChtX3BQcm94eSAmJg0KKyAgICAgIChtX3BQcm94eS0+R2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpID09IEZXTF9FUlJfU3VjY2VlZGVkKSkgew0KICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgYkF1dG9TaXplKTsNCiB9DQotSUZXTF9DdXN0b20qIElGV0xfQ3VzdG9tOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG5ldyBJRldMX0N1c3RvbTsNCitGV0xfRVJSIENGV0xfQ3VzdG9tOjpVcGRhdGUoKSB7DQorICBpZiAobV9wUHJveHkpIHsNCisgICAgcmV0dXJuIG1fcFByb3h5LT5VcGRhdGUoKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6VXBkYXRlKCk7DQogfQ0KLUlGV0xfQ3VzdG9tOjpJRldMX0N1c3RvbSgpDQotew0KK0ZXTF9FUlIgQ0ZXTF9DdXN0b206OlNldFByb3h5KElGV0xfUHJveHkqIHBQcm94eSkgew0KKyAgbV9wUHJveHkgPSBwUHJveHk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfQ3VzdG9tKiBJRldMX0N1c3RvbTo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBJRldMX0N1c3RvbTsNCit9DQorSUZXTF9DdXN0b206OklGV0xfQ3VzdG9tKCkgew0KKyAgbV9wRGF0YSA9IE5VTEw7DQorfQ0KK0lGV0xfQ3VzdG9tOjp+SUZXTF9DdXN0b20oKSB7DQorICBpZiAobV9wRGF0YSkgew0KKyAgICBkZWxldGUgKENGV0xfQ3VzdG9tKiltX3BEYXRhOw0KICAgICBtX3BEYXRhID0gTlVMTDsNCisgIH0NCiB9DQotSUZXTF9DdXN0b206On5JRldMX0N1c3RvbSgpDQotew0KLSAgICBpZiAobV9wRGF0YSkgew0KLSAgICAgICAgZGVsZXRlIChDRldMX0N1c3RvbSopbV9wRGF0YTsNCi0gICAgICAgIG1fcERhdGEgPSBOVUxMOw0KLSAgICB9DQorRldMX0VSUiBJRldMX0N1c3RvbTo6SW5pdGlhbGl6ZShJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQ3VzdG9tKHBPdXRlcik7DQorICAoKENGV0xfQ3VzdG9tKiltX3BEYXRhKS0+U2V0SW50ZXJmYWNlKHRoaXMpOw0KKyAgcmV0dXJuICgoQ0ZXTF9DdXN0b20qKW1fcERhdGEpLT5Jbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIgSUZXTF9DdXN0b206OkluaXRpYWxpemUoSUZXTF9XaWRnZXQgKnBPdXRlciApDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQ3VzdG9tKHBPdXRlcik7DQotICAgICgoQ0ZXTF9DdXN0b20qKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfQ3VzdG9tKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9DdXN0b206OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgbV9wRGF0YSA9IEZYX05FVyBDRldMX0N1c3RvbShwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgKChDRldMX0N1c3RvbSopbV9wRGF0YSktPlNldEludGVyZmFjZSh0aGlzKTsNCisgIHJldHVybiAoKENGV0xfQ3VzdG9tKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSIElGV0xfQ3VzdG9tOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciApDQotew0KLSAgICBtX3BEYXRhID0gRlhfTkVXIENGV0xfQ3VzdG9tKHByb3BlcnRpZXMsIHBPdXRlcik7DQotICAgICgoQ0ZXTF9DdXN0b20qKW1fcERhdGEpLT5TZXRJbnRlcmZhY2UodGhpcyk7DQotICAgIHJldHVybiAoKENGV0xfQ3VzdG9tKiltX3BEYXRhKS0+SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgSUZXTF9DdXN0b206OlNldFByb3h5KElGV0xfUHJveHkqIHBQcm94eSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9DdXN0b20qKW1fcERhdGEpLT5TZXRQcm94eShwUHJveHkpOw0KIH0NCi1GV0xfRVJSIElGV0xfQ3VzdG9tOjpTZXRQcm94eShJRldMX1Byb3h5ICpwUHJveHkpDQotew0KLSAgICByZXR1cm4gKChDRldMX0N1c3RvbSopbV9wRGF0YSktPlNldFByb3h5KHBQcm94eSk7DQordm9pZCBGV0xfU2V0V2lkZ2V0UmVjdChJRldMX1dpZGdldCogd2lkZ2V0LCBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgICgoQ0ZXTF9XaWRnZXRJbXAqKSgoSUZXTF9UYXJnZXREYXRhKil3aWRnZXQpLT5HZXREYXRhKCkpDQorICAgICAgLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0ID0gcmVjdDsNCiB9DQotdm9pZCBGV0xfU2V0V2lkZ2V0UmVjdChJRldMX1dpZGdldCAqd2lkZ2V0LCBjb25zdCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICAoKENGV0xfV2lkZ2V0SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopd2lkZ2V0KS0+R2V0RGF0YSgpKS0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldCA9IHJlY3Q7DQordm9pZCBGV0xfU2V0V2lkZ2V0U3RhdGVzKElGV0xfV2lkZ2V0KiB3aWRnZXQsIEZYX0RXT1JEIGR3U3RhdGVzKSB7DQorICAoKENGV0xfV2lkZ2V0SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopd2lkZ2V0KS0+R2V0RGF0YSgpKQ0KKyAgICAgIC0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyA9IGR3U3RhdGVzOw0KIH0NCi12b2lkIEZXTF9TZXRXaWRnZXRTdGF0ZXMoSUZXTF9XaWRnZXQgKndpZGdldCwgRlhfRFdPUkQgZHdTdGF0ZXMpDQotew0KLSAgICAoKENGV0xfV2lkZ2V0SW1wKikoKElGV0xfVGFyZ2V0RGF0YSopd2lkZ2V0KS0+R2V0RGF0YSgpKS0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyA9IGR3U3RhdGVzOw0KK3ZvaWQgRldMX1NldFdpZGdldFN0eWxlcyhJRldMX1dpZGdldCogd2lkZ2V0LCBGWF9EV09SRCBkd1N0eWxlcykgew0KKyAgKChDRldMX1dpZGdldEltcCopKChJRldMX1RhcmdldERhdGEqKXdpZGdldCktPkdldERhdGEoKSkNCisgICAgICAtPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgPSBkd1N0eWxlczsNCiB9DQotdm9pZCBGV0xfU2V0V2lkZ2V0U3R5bGVzKElGV0xfV2lkZ2V0ICp3aWRnZXQsIEZYX0RXT1JEIGR3U3R5bGVzKQ0KLXsNCi0gICAgKChDRldMX1dpZGdldEltcCopKChJRldMX1RhcmdldERhdGEqKXdpZGdldCktPkdldERhdGEoKSktPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgPSBkd1N0eWxlczsNCi19DQotRldMX0VSUiBGV0xfRW5hYmVsV2lkZ2V0KElGV0xfV2lkZ2V0ICp3aWRnZXQsIEZYX0JPT0wgYkVuYWJsZSkNCi17DQotICAgIHdpZGdldC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9EaXNhYmxlZCwgIWJFbmFibGUpOw0KLSAgICBJRldMX1dpZGdldE1nciAqd2lkZ2V0TWdyID0gRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBJRldMX1dpZGdldCAqY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldCh3aWRnZXQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCi0gICAgd2hpbGUgKGNoaWxkKSB7DQotICAgICAgICBGV0xfRW5hYmVsV2lkZ2V0KGNoaWxkLCBiRW5hYmxlKTsNCi0gICAgICAgIGNoaWxkID0gd2lkZ2V0TWdyLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgRldMX0VuYWJlbFdpZGdldChJRldMX1dpZGdldCogd2lkZ2V0LCBGWF9CT09MIGJFbmFibGUpIHsNCisgIHdpZGdldC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9EaXNhYmxlZCwgIWJFbmFibGUpOw0KKyAgSUZXTF9XaWRnZXRNZ3IqIHdpZGdldE1nciA9IEZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgIElGV0xfV2lkZ2V0KiBjaGlsZCA9IHdpZGdldE1nci0+R2V0V2lkZ2V0KHdpZGdldCwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQpOw0KKyAgd2hpbGUgKGNoaWxkKSB7DQorICAgIEZXTF9FbmFiZWxXaWRnZXQoY2hpbGQsIGJFbmFibGUpOw0KKyAgICBjaGlsZCA9IHdpZGdldE1nci0+R2V0V2lkZ2V0KGNoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfd2lkZ2V0bWdyaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF93aWRnZXRtZ3JpbXAuY3BwCmluZGV4IDUxOTg4ZGQuLjI3MTlmZjkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF93aWRnZXRtZ3JpbXAuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF93aWRnZXRtZ3JpbXAuY3BwCkBAIC0xMSwxMDQ0ICsxMSwxMDUyIEBACiAjaW5jbHVkZSAiaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQogI2luY2x1ZGUgImluY2x1ZGUvZndsX2FwcGltcC5oIg0KICNkZWZpbmUgRldMX05PUk1BTE1BVFJJWA0KLUZYX0JPT0wgRldMX1VzZU9mZnNjcmVlbihJRldMX1dpZGdldCAqIHBXaWRnZXQpDQotew0KLSNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIEZXTF9Vc2VPZmZzY3JlZW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisjaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pDQorICByZXR1cm4gRkFMU0U7DQogI2Vsc2UNCi0gICAgcmV0dXJuIHBXaWRnZXQtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX09mZnNjcmVlbjsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRTdHlsZXMoKSAmIEZXTF9XR1RTVFlMRV9PZmZzY3JlZW47DQogI2VuZGlmDQogfQ0KLUlGV0xfV2lkZ2V0TWdyKglGV0xfR2V0V2lkZ2V0TWdyKCkNCi17DQotICAgIElGV0xfQXBwICpwQXBwID0gRldMX0dldEFwcCgpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBBcHAsIE5VTEwpOw0KLSAgICByZXR1cm4gcEFwcC0+R2V0V2lkZ2V0TWdyKCk7DQorSUZXTF9XaWRnZXRNZ3IqIEZXTF9HZXRXaWRnZXRNZ3IoKSB7DQorICBJRldMX0FwcCogcEFwcCA9IEZXTF9HZXRBcHAoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEFwcCwgTlVMTCk7DQorICByZXR1cm4gcEFwcC0+R2V0V2lkZ2V0TWdyKCk7DQogfQ0KLUNGV0xfV2lkZ2V0TWdyOjpDRldMX1dpZGdldE1ncihJRldMX0FkYXB0ZXJOYXRpdmUgKnBBZGFwdGVyTmF0aXZlKQ0KLSAgICA6IG1fZHdDYXBhYmlsaXR5KDApDQotew0KLSAgICBtX3BEZWxlZ2F0ZSA9IEZYX05FVyBDRldMX1dpZGdldE1nckRlbGVnYXRlKHRoaXMpOw0KLSAgICBtX3BBZGFwdGVyID0gcEFkYXB0ZXJOYXRpdmUtPkdldFdpZGdldE1ncigoSUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSopbV9wRGVsZWdhdGUpOw0KLSAgICBGWFNZU19hc3NlcnQobV9wQWRhcHRlcik7DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcFJvb3QgPSBGWF9ORVcgQ0ZXTF9XaWRnZXRNZ3JJdGVtOw0KLSAgICBtX21hcFdpZGdldEl0ZW0uU2V0QXQoTlVMTCwgcFJvb3QpOw0KLSNpZiAoX0ZYX09TXz09X0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXz09X0ZYX1dJTjY0XykNCi0gICAgbV9ydFNjcmVlbi5SZXNldCgpOw0KLSAgICBJRldMX0FkYXB0ZXJNb25pdG9yTWdyKiBwTW9uaXRvck1nciA9IHBBZGFwdGVyTmF0aXZlLT5HZXRNb25pdG9yTWdyKCk7DQotICAgIGlmIChwTW9uaXRvck1ncikgew0KLSAgICAgICAgRldMX0hNT05JVE9SIG1vbml0b3IgPSBwTW9uaXRvck1nci0+R2V0Q3VycmVudE1vbml0b3IoKTsNCi0gICAgICAgIGlmIChtb25pdG9yKSB7DQotICAgICAgICAgICAgcE1vbml0b3JNZ3ItPkdldE1vbml0b3JTaXplKG1vbml0b3IsIG1fcnRTY3JlZW4ud2lkdGgsIG1fcnRTY3JlZW4uaGVpZ2h0KTsNCi0gICAgICAgIH0NCitDRldMX1dpZGdldE1ncjo6Q0ZXTF9XaWRnZXRNZ3IoSUZXTF9BZGFwdGVyTmF0aXZlKiBwQWRhcHRlck5hdGl2ZSkNCisgICAgOiBtX2R3Q2FwYWJpbGl0eSgwKSB7DQorICBtX3BEZWxlZ2F0ZSA9IEZYX05FVyBDRldMX1dpZGdldE1nckRlbGVnYXRlKHRoaXMpOw0KKyAgbV9wQWRhcHRlciA9DQorICAgICAgcEFkYXB0ZXJOYXRpdmUtPkdldFdpZGdldE1ncigoSUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSopbV9wRGVsZWdhdGUpOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcEFkYXB0ZXIpOw0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUm9vdCA9IEZYX05FVyBDRldMX1dpZGdldE1nckl0ZW07DQorICBtX21hcFdpZGdldEl0ZW0uU2V0QXQoTlVMTCwgcFJvb3QpOw0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8pIHx8IChfRlhfT1NfID09IF9GWF9XSU42NF8pDQorICBtX3J0U2NyZWVuLlJlc2V0KCk7DQorICBJRldMX0FkYXB0ZXJNb25pdG9yTWdyKiBwTW9uaXRvck1nciA9IHBBZGFwdGVyTmF0aXZlLT5HZXRNb25pdG9yTWdyKCk7DQorICBpZiAocE1vbml0b3JNZ3IpIHsNCisgICAgRldMX0hNT05JVE9SIG1vbml0b3IgPSBwTW9uaXRvck1nci0+R2V0Q3VycmVudE1vbml0b3IoKTsNCisgICAgaWYgKG1vbml0b3IpIHsNCisgICAgICBwTW9uaXRvck1nci0+R2V0TW9uaXRvclNpemUobW9uaXRvciwgbV9ydFNjcmVlbi53aWR0aCwgbV9ydFNjcmVlbi5oZWlnaHQpOw0KICAgICB9DQorICB9DQogI2VuZGlmDQogfQ0KLUNGV0xfV2lkZ2V0TWdyOjp+Q0ZXTF9XaWRnZXRNZ3IoKQ0KLXsNCi0gICAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFdpZGdldEl0ZW0uR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHMpIHsNCi0gICAgICAgIHZvaWQqIHBXaWRnZXQ7DQotICAgICAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtOw0KLSAgICAgICAgbV9tYXBXaWRnZXRJdGVtLkdldE5leHRBc3NvYyhwcywgcFdpZGdldCwgKHZvaWQqJilwSXRlbSk7DQotICAgICAgICBkZWxldGUgcEl0ZW07DQorQ0ZXTF9XaWRnZXRNZ3I6On5DRldMX1dpZGdldE1ncigpIHsNCisgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBXaWRnZXRJdGVtLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICB2b2lkKiBwV2lkZ2V0Ow0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtOw0KKyAgICBtX21hcFdpZGdldEl0ZW0uR2V0TmV4dEFzc29jKHBzLCBwV2lkZ2V0LCAodm9pZComKXBJdGVtKTsNCisgICAgZGVsZXRlIHBJdGVtOw0KKyAgfQ0KKyAgbV9tYXBXaWRnZXRJdGVtLlJlbW92ZUFsbCgpOw0KKyAgaWYgKG1fcERlbGVnYXRlKSB7DQorICAgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgICAgbV9wRGVsZWdhdGUgPSBOVUxMOw0KKyAgfQ0KK30NCitpbnQzMl90IENGV0xfV2lkZ2V0TWdyOjpDb3VudFdpZGdldHMoSUZXTF9XaWRnZXQqIHBQYXJlbnQpIHsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcFBhcmVudEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBQYXJlbnQpOw0KKyAgcmV0dXJuIFRyYXZlbFdpZGdldE1ncihwUGFyZW50SXRlbSwgTlVMTCwgTlVMTCk7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6R2V0V2lkZ2V0KGludDMyX3QgbkluZGV4LCBJRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUGFyZW50SXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFBhcmVudCk7DQorICBJRldMX1dpZGdldCogcFdpZGdldCA9IE5VTEw7DQorICBUcmF2ZWxXaWRnZXRNZ3IocFBhcmVudEl0ZW0sICZuSW5kZXgsIE5VTEwsICZwV2lkZ2V0KTsNCisgIHJldHVybiBwV2lkZ2V0Ow0KK30NCitJRldMX1dpZGdldCogQ0ZXTF9XaWRnZXRNZ3I6OkdldFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfV0dUUkVMQVRJT04gZVJlbGF0aW9uKSB7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgIGlmICghcEl0ZW0pIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBJRldMX1dpZGdldCogcFJldCA9IE5VTEw7DQorICBzd2l0Y2ggKGVSZWxhdGlvbikgew0KKyAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9QYXJlbnQ6IHsNCisgICAgICBwUmV0ID0gcEl0ZW0tPnBQYXJlbnQgPyBwSXRlbS0+cFBhcmVudC0+cFdpZGdldCA6IE5VTEw7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgbV9tYXBXaWRnZXRJdGVtLlJlbW92ZUFsbCgpOw0KLSAgICBpZiAobV9wRGVsZWdhdGUpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCi0gICAgICAgIG1fcERlbGVnYXRlID0gTlVMTDsNCisgICAgY2FzZSBGV0xfV0dUUkVMQVRJT05fT3duZXI6IHsNCisgICAgICBwUmV0ID0gcEl0ZW0tPnBPd25lciA/IHBJdGVtLT5wT3duZXItPnBXaWRnZXQgOiBOVUxMOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotfQ0KLWludDMyX3QgQ0ZXTF9XaWRnZXRNZ3I6OkNvdW50V2lkZ2V0cyhJRldMX1dpZGdldCAqcFBhcmVudCApDQotew0KLSAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBQYXJlbnRJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwUGFyZW50KTsNCi0gICAgcmV0dXJuIFRyYXZlbFdpZGdldE1ncihwUGFyZW50SXRlbSwgTlVMTCwgTlVMTCk7DQotfQ0KLUlGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6R2V0V2lkZ2V0KGludDMyX3QgbkluZGV4LCBJRldMX1dpZGdldCAqcFBhcmVudCApDQotew0KLSAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBQYXJlbnRJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwUGFyZW50KTsNCi0gICAgSUZXTF9XaWRnZXQgKnBXaWRnZXQgPSBOVUxMOw0KLSAgICBUcmF2ZWxXaWRnZXRNZ3IocFBhcmVudEl0ZW0sICZuSW5kZXgsIE5VTEwsICZwV2lkZ2V0KTsNCi0gICAgcmV0dXJuIHBXaWRnZXQ7DQotfQ0KLUlGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6R2V0V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfV0dUUkVMQVRJT04gZVJlbGF0aW9uKQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQotICAgIGlmICghcEl0ZW0pIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KKyAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9GaXJzdFNpYmxpbmc6IHsNCisgICAgICBwSXRlbSA9IHBJdGVtLT5wUHJldmlvdXM7DQorICAgICAgd2hpbGUgKHBJdGVtICYmIHBJdGVtLT5wUHJldmlvdXMpIHsNCisgICAgICAgIHBJdGVtID0gcEl0ZW0tPnBQcmV2aW91czsNCisgICAgICB9DQorICAgICAgcFJldCA9IHBJdGVtID8gcEl0ZW0tPnBXaWRnZXQgOiBOVUxMOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIElGV0xfV2lkZ2V0ICpwUmV0ID0gTlVMTDsNCi0gICAgc3dpdGNoIChlUmVsYXRpb24pIHsNCi0gICAgICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX1BhcmVudDogew0KLSAgICAgICAgICAgICAgICBwUmV0ID0gcEl0ZW0tPnBQYXJlbnQgPyBwSXRlbS0+cFBhcmVudC0+cFdpZGdldCA6IE5VTEw7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX093bmVyOiB7DQotICAgICAgICAgICAgICAgIHBSZXQgPSBwSXRlbS0+cE93bmVyID8gcEl0ZW0tPnBPd25lci0+cFdpZGdldCA6IE5VTEw7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX0ZpcnN0U2libGluZzogew0KLSAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5wUHJldmlvdXM7DQotICAgICAgICAgICAgICAgIHdoaWxlIChwSXRlbSAmJiBwSXRlbS0+cFByZXZpb3VzKSB7DQotICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5wUHJldmlvdXM7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcFJldCA9IHBJdGVtID8gcEl0ZW0tPnBXaWRnZXQgOiBOVUxMOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9QcmlvclNpYmxpbmc6IHsNCi0gICAgICAgICAgICAgICAgcFJldCA9IHBJdGVtLT5wUHJldmlvdXMgPyBwSXRlbS0+cFByZXZpb3VzLT5wV2lkZ2V0IDogTlVMTDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmc6IHsNCi0gICAgICAgICAgICAgICAgcFJldCA9IHBJdGVtLT5wTmV4dCA/IHBJdGVtLT5wTmV4dC0+cFdpZGdldCA6IE5VTEw7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX0xhc3RTaWJsaW5nOiB7DQotICAgICAgICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPnBOZXh0Ow0KLSAgICAgICAgICAgICAgICB3aGlsZSAocEl0ZW0gJiYgcEl0ZW0tPnBOZXh0KSB7DQotICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5wTmV4dDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwUmV0ID0gcEl0ZW0gPyBwSXRlbS0+cFdpZGdldCA6IE5VTEw7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQ6IHsNCi0gICAgICAgICAgICAgICAgcFJldCA9IHBJdGVtLT5wQ2hpbGQgPyBwSXRlbS0+cENoaWxkLT5wV2lkZ2V0IDogTlVMTDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUUkVMQVRJT05fTGFzdENoaWxkOiB7DQotICAgICAgICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPnBDaGlsZDsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKHBJdGVtICYmIHBJdGVtLT5wTmV4dCkgew0KLSAgICAgICAgICAgICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+cE5leHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcFJldCA9IHBJdGVtID8gcEl0ZW0tPnBXaWRnZXQgOiBOVUxMOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtOiB7DQotICAgICAgICAgICAgICAgIHdoaWxlIChwSXRlbSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKElzQWJsZU5hdGl2ZShwSXRlbS0+cFdpZGdldCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmV0ID0gcEl0ZW0tPnBXaWRnZXQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5wUGFyZW50Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICB9DQorICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX1ByaW9yU2libGluZzogew0KKyAgICAgIHBSZXQgPSBwSXRlbS0+cFByZXZpb3VzID8gcEl0ZW0tPnBQcmV2aW91cy0+cFdpZGdldCA6IE5VTEw7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIHBSZXQ7DQotfQ0KLWludDMyX3QgQ0ZXTF9XaWRnZXRNZ3I6OkdldFdpZGdldEluZGV4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEl0ZW0sIC0xKTsNCi0gICAgcmV0dXJuIFRyYXZlbFdpZGdldE1ncihwSXRlbS0+cFBhcmVudCwgTlVMTCwgcEl0ZW0pOw0KLX0NCi1GWF9CT09MIENGV0xfV2lkZ2V0TWdyOjpTZXRXaWRnZXRJbmRleChJRldMX1dpZGdldCAqcFdpZGdldCwgaW50MzJfdCBuSW5kZXgpDQotew0KLSAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwSXRlbSwgRkFMU0UpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBJdGVtLT5wUGFyZW50LCBGQUxTRSk7DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcENoaWxkID0gcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZDsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgd2hpbGUgKHBDaGlsZCkgew0KLSAgICAgICAgaWYgKHBDaGlsZCA9PSBwSXRlbSkgew0KLSAgICAgICAgICAgIGlmIChpID09IG5JbmRleCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHBDaGlsZC0+cFByZXZpb3VzKSB7DQotICAgICAgICAgICAgICAgIHBDaGlsZC0+cFByZXZpb3VzLT5wTmV4dCA9IHBDaGlsZC0+cE5leHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwQ2hpbGQtPnBOZXh0KSB7DQotICAgICAgICAgICAgICAgIHBDaGlsZC0+cE5leHQtPnBQcmV2aW91cyA9IHBDaGlsZC0+cFByZXZpb3VzOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwSXRlbSkgew0KLSAgICAgICAgICAgICAgICBwSXRlbS0+cFBhcmVudC0+cENoaWxkID0gcEl0ZW0tPnBOZXh0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwSXRlbS0+cE5leHQgPSBOVUxMOw0KLSAgICAgICAgICAgIHBJdGVtLT5wUHJldmlvdXMgPSBOVUxMOw0KLSAgICAgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZzogew0KKyAgICAgIHBSZXQgPSBwSXRlbS0+cE5leHQgPyBwSXRlbS0+cE5leHQtPnBXaWRnZXQgOiBOVUxMOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX0xhc3RTaWJsaW5nOiB7DQorICAgICAgcEl0ZW0gPSBwSXRlbS0+cE5leHQ7DQorICAgICAgd2hpbGUgKHBJdGVtICYmIHBJdGVtLT5wTmV4dCkgew0KKyAgICAgICAgcEl0ZW0gPSBwSXRlbS0+cE5leHQ7DQorICAgICAgfQ0KKyAgICAgIHBSZXQgPSBwSXRlbSA/IHBJdGVtLT5wV2lkZ2V0IDogTlVMTDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkOiB7DQorICAgICAgcFJldCA9IHBJdGVtLT5wQ2hpbGQgPyBwSXRlbS0+cENoaWxkLT5wV2lkZ2V0IDogTlVMTDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9MYXN0Q2hpbGQ6IHsNCisgICAgICBwSXRlbSA9IHBJdGVtLT5wQ2hpbGQ7DQorICAgICAgd2hpbGUgKHBJdGVtICYmIHBJdGVtLT5wTmV4dCkgew0KKyAgICAgICAgcEl0ZW0gPSBwSXRlbS0+cE5leHQ7DQorICAgICAgfQ0KKyAgICAgIHBSZXQgPSBwSXRlbSA/IHBJdGVtLT5wV2lkZ2V0IDogTlVMTDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtOiB7DQorICAgICAgd2hpbGUgKHBJdGVtKSB7DQorICAgICAgICBpZiAoSXNBYmxlTmF0aXZlKHBJdGVtLT5wV2lkZ2V0KSkgew0KKyAgICAgICAgICBwUmV0ID0gcEl0ZW0tPnBXaWRnZXQ7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYoIXBDaGlsZC0+cE5leHQpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCisgICAgICAgIHBJdGVtID0gcEl0ZW0tPnBQYXJlbnQ7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gcFJldDsNCit9DQoraW50MzJfdCBDRldMX1dpZGdldE1ncjo6R2V0V2lkZ2V0SW5kZXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwSXRlbSwgLTEpOw0KKyAgcmV0dXJuIFRyYXZlbFdpZGdldE1ncihwSXRlbS0+cFBhcmVudCwgTlVMTCwgcEl0ZW0pOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0TWdyOjpTZXRXaWRnZXRJbmRleChJRldMX1dpZGdldCogcFdpZGdldCwgaW50MzJfdCBuSW5kZXgpIHsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwSXRlbSwgRkFMU0UpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwSXRlbS0+cFBhcmVudCwgRkFMU0UpOw0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwQ2hpbGQgPSBwSXRlbS0+cFBhcmVudC0+cENoaWxkOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgaWYgKHBDaGlsZCA9PSBwSXRlbSkgew0KKyAgICAgIGlmIChpID09IG5JbmRleCkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGlmIChwQ2hpbGQtPnBQcmV2aW91cykgew0KKyAgICAgICAgcENoaWxkLT5wUHJldmlvdXMtPnBOZXh0ID0gcENoaWxkLT5wTmV4dDsNCisgICAgICB9DQorICAgICAgaWYgKHBDaGlsZC0+cE5leHQpIHsNCisgICAgICAgIHBDaGlsZC0+cE5leHQtPnBQcmV2aW91cyA9IHBDaGlsZC0+cFByZXZpb3VzOw0KKyAgICAgIH0NCisgICAgICBpZiAocEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwSXRlbSkgew0KKyAgICAgICAgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9IHBJdGVtLT5wTmV4dDsNCisgICAgICB9DQorICAgICAgcEl0ZW0tPnBOZXh0ID0gTlVMTDsNCisgICAgICBwSXRlbS0+cFByZXZpb3VzID0gTlVMTDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoIXBDaGlsZC0+cE5leHQpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBwQ2hpbGQgPSBwQ2hpbGQtPnBOZXh0Ow0KKyAgICArK2k7DQorICB9DQorICBwQ2hpbGQgPSBwSXRlbS0+cFBhcmVudC0+cENoaWxkOw0KKyAgaWYgKHBDaGlsZCkgew0KKyAgICBpZiAobkluZGV4IDwgMCkgew0KKyAgICAgIHdoaWxlIChwQ2hpbGQtPnBOZXh0KSB7DQogICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPnBOZXh0Ow0KLSAgICAgICAgKytpOw0KKyAgICAgIH0NCisgICAgICBwQ2hpbGQtPnBOZXh0ID0gcEl0ZW07DQorICAgICAgcEl0ZW0tPnBQcmV2aW91cyA9IHBDaGlsZDsNCisgICAgICBwSXRlbS0+cE5leHQgPSBOVUxMOw0KKyAgICAgIHJldHVybiBUUlVFOw0KICAgICB9DQotICAgIHBDaGlsZCA9IHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQ7DQotICAgIGlmIChwQ2hpbGQpIHsNCi0gICAgICAgIGlmIChuSW5kZXggPCAwKSB7DQotICAgICAgICAgICAgd2hpbGUocENoaWxkLT5wTmV4dCkgew0KLSAgICAgICAgICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPnBOZXh0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwQ2hpbGQtPnBOZXh0ID0gcEl0ZW07DQotICAgICAgICAgICAgcEl0ZW0tPnBQcmV2aW91cyA9IHBDaGlsZDsNCi0gICAgICAgICAgICBwSXRlbS0+cE5leHQgPSBOVUxMOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaSA9IDA7DQotICAgICAgICB3aGlsZShpIDwgbkluZGV4ICYmIHBDaGlsZC0+cE5leHQgKSB7DQotICAgICAgICAgICAgcENoaWxkID0gcENoaWxkLT5wTmV4dDsNCi0gICAgICAgICAgICArK2k7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIXBDaGlsZC0+cE5leHQpIHsNCi0gICAgICAgICAgICBwQ2hpbGQtPnBOZXh0ID0gcEl0ZW07DQotICAgICAgICAgICAgcEl0ZW0tPnBQcmV2aW91cyA9IHBDaGlsZDsNCi0gICAgICAgICAgICBwSXRlbS0+cE5leHQgPSBOVUxMOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBDaGlsZC0+cFByZXZpb3VzKSB7DQotICAgICAgICAgICAgcEl0ZW0tPnBQcmV2aW91cyA9IHBDaGlsZC0+cFByZXZpb3VzOw0KLSAgICAgICAgICAgIHBDaGlsZC0+cFByZXZpb3VzLT5wTmV4dCA9IHBJdGVtOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcENoaWxkLT5wUHJldmlvdXMgPSBwSXRlbTsNCi0gICAgICAgIHBJdGVtLT5wTmV4dCA9IHBDaGlsZDsNCi0gICAgICAgIGlmIChwSXRlbS0+cFBhcmVudC0+cENoaWxkID09IHBDaGlsZCkgew0KLSAgICAgICAgICAgIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPSBwSXRlbTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPSBwSXRlbTsNCi0gICAgICAgIHBJdGVtLT5wUHJldmlvdXMgPSBOVUxMOw0KLSAgICAgICAgcEl0ZW0tPnBOZXh0ID0gTlVMTDsNCisgICAgaSA9IDA7DQorICAgIHdoaWxlIChpIDwgbkluZGV4ICYmIHBDaGlsZC0+cE5leHQpIHsNCisgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPnBOZXh0Ow0KKyAgICAgICsraTsNCiAgICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCisgICAgaWYgKCFwQ2hpbGQtPnBOZXh0KSB7DQorICAgICAgcENoaWxkLT5wTmV4dCA9IHBJdGVtOw0KKyAgICAgIHBJdGVtLT5wUHJldmlvdXMgPSBwQ2hpbGQ7DQorICAgICAgcEl0ZW0tPnBOZXh0ID0gTlVMTDsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAocENoaWxkLT5wUHJldmlvdXMpIHsNCisgICAgICBwSXRlbS0+cFByZXZpb3VzID0gcENoaWxkLT5wUHJldmlvdXM7DQorICAgICAgcENoaWxkLT5wUHJldmlvdXMtPnBOZXh0ID0gcEl0ZW07DQorICAgIH0NCisgICAgcENoaWxkLT5wUHJldmlvdXMgPSBwSXRlbTsNCisgICAgcEl0ZW0tPnBOZXh0ID0gcENoaWxkOw0KKyAgICBpZiAocEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwQ2hpbGQpIHsNCisgICAgICBwSXRlbS0+cFBhcmVudC0+cENoaWxkID0gcEl0ZW07DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPSBwSXRlbTsNCisgICAgcEl0ZW0tPnBQcmV2aW91cyA9IE5VTEw7DQorICAgIHBJdGVtLT5wTmV4dCA9IE5VTEw7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6SXNXaWRnZXQodm9pZCogcE9iaikNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE9iaiwgRkFMU0UpOw0KLSAgICByZXR1cm4gR2V0V2lkZ2V0TWdySXRlbSgoSUZXTF9XaWRnZXQqKXBPYmopICE9IE5VTEw7DQorRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6SXNXaWRnZXQodm9pZCogcE9iaikgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwT2JqLCBGQUxTRSk7DQorICByZXR1cm4gR2V0V2lkZ2V0TWdySXRlbSgoSUZXTF9XaWRnZXQqKXBPYmopICE9IE5VTEw7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OlJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QgKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BBZGFwdGVyLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBJRldMX1dpZGdldCAqcE5hdGl2ZSA9IHBXaWRnZXQ7DQotICAgIENGWF9SZWN0RiByZWN0KCpwUmVjdCk7DQotICAgIGlmIChJc0Zvcm1EaXNhYmxlZCgpKSB7DQotICAgICAgICBJRldMX1dpZGdldCAqcE91dGVyID0gcFdpZGdldC0+R2V0T3V0ZXIoKTsNCi0gICAgICAgIHdoaWxlIChwT3V0ZXIpIHsNCi0gICAgICAgICAgICBDRlhfUmVjdEYgcnRUZW1wOw0KLSAgICAgICAgICAgIHBOYXRpdmUtPkdldFdpZGdldFJlY3QocnRUZW1wKTsNCi0gICAgICAgICAgICByZWN0LmxlZnQgKz0gcnRUZW1wLmxlZnQ7DQotICAgICAgICAgICAgcmVjdC50b3AgKz0gcnRUZW1wLnRvcDsNCi0gICAgICAgICAgICBwTmF0aXZlID0gcE91dGVyOw0KLSAgICAgICAgICAgIHBPdXRlciA9IHBPdXRlci0+R2V0T3V0ZXIoKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmICghSXNBYmxlTmF0aXZlKHBXaWRnZXQpKSB7DQotICAgICAgICBwTmF0aXZlID0gR2V0V2lkZ2V0KHBXaWRnZXQsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKTsNCi0gICAgICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE5hdGl2ZSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgICAgIHBXaWRnZXQtPlRyYW5zZm9ybVRvKHBOYXRpdmUsIHJlY3QubGVmdCwgcmVjdC50b3ApOw0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRNZ3I6OlJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEFkYXB0ZXIsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBJRldMX1dpZGdldCogcE5hdGl2ZSA9IHBXaWRnZXQ7DQorICBDRlhfUmVjdEYgcmVjdCgqcFJlY3QpOw0KKyAgaWYgKElzRm9ybURpc2FibGVkKCkpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IHBXaWRnZXQtPkdldE91dGVyKCk7DQorICAgIHdoaWxlIChwT3V0ZXIpIHsNCisgICAgICBDRlhfUmVjdEYgcnRUZW1wOw0KKyAgICAgIHBOYXRpdmUtPkdldFdpZGdldFJlY3QocnRUZW1wKTsNCisgICAgICByZWN0LmxlZnQgKz0gcnRUZW1wLmxlZnQ7DQorICAgICAgcmVjdC50b3AgKz0gcnRUZW1wLnRvcDsNCisgICAgICBwTmF0aXZlID0gcE91dGVyOw0KKyAgICAgIHBPdXRlciA9IHBPdXRlci0+R2V0T3V0ZXIoKTsNCiAgICAgfQ0KLSAgICBBZGRSZWRyYXdDb3VudHMocE5hdGl2ZSk7DQotICAgIHJldHVybiBtX3BBZGFwdGVyLT5SZXBhaW50V2lkZ2V0KHBOYXRpdmUsICZyZWN0KTsNCisgIH0gZWxzZSBpZiAoIUlzQWJsZU5hdGl2ZShwV2lkZ2V0KSkgew0KKyAgICBwTmF0aXZlID0gR2V0V2lkZ2V0KHBXaWRnZXQsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKTsNCisgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTmF0aXZlLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgICBwV2lkZ2V0LT5UcmFuc2Zvcm1UbyhwTmF0aXZlLCByZWN0LmxlZnQsIHJlY3QudG9wKTsNCisgIH0NCisgIEFkZFJlZHJhd0NvdW50cyhwTmF0aXZlKTsNCisgIHJldHVybiBtX3BBZGFwdGVyLT5SZXBhaW50V2lkZ2V0KHBOYXRpdmUsICZyZWN0KTsNCiB9DQotdm9pZCBDRldMX1dpZGdldE1ncjo6QWRkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwUGFyZW50SXRlbSA9IEdldFdpZGdldE1nckl0ZW0oTlVMTCk7DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KLSAgICBpZiAoIXBJdGVtKSB7DQotICAgICAgICBwSXRlbSA9IEZYX05FVyBDRldMX1dpZGdldE1nckl0ZW07DQotICAgICAgICBwSXRlbS0+cFdpZGdldCA9IHBXaWRnZXQ7DQotICAgICAgICBtX21hcFdpZGdldEl0ZW0uU2V0QXQocFdpZGdldCwgcEl0ZW0pOw0KLSAgICB9DQotICAgIGlmIChwSXRlbS0+cFBhcmVudCAmJiBwSXRlbS0+cFBhcmVudCAhPSBwUGFyZW50SXRlbSkgew0KLSAgICAgICAgaWYgKHBJdGVtLT5wUHJldmlvdXMpIHsNCi0gICAgICAgICAgICBwSXRlbS0+cFByZXZpb3VzLT5wTmV4dCA9IHBJdGVtLT5wTmV4dDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwSXRlbS0+cE5leHQpIHsNCi0gICAgICAgICAgICBwSXRlbS0+cE5leHQtPnBQcmV2aW91cyA9IHBJdGVtLT5wUHJldmlvdXM7DQotICAgICAgICB9DQotICAgICAgICBpZiAocEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwSXRlbSkgew0KLSAgICAgICAgICAgIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPSBwSXRlbS0+cE5leHQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcEl0ZW0tPnBQYXJlbnQgPSBwUGFyZW50SXRlbTsNCi0gICAgU2V0V2lkZ2V0SW5kZXgocFdpZGdldCwgLTEpOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0TWdyOjpJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBQYXJlbnQsIElGV0xfV2lkZ2V0ICpwQ2hpbGQsIGludDMyX3QgbkluZGV4ICkNCi17DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcFBhcmVudEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBQYXJlbnQpOw0KLSAgICBpZiAoIXBQYXJlbnRJdGVtKSB7DQotICAgICAgICBwUGFyZW50SXRlbSA9IEZYX05FVyBDRldMX1dpZGdldE1nckl0ZW07DQotICAgICAgICBwUGFyZW50SXRlbS0+cFdpZGdldCA9IHBQYXJlbnQ7DQotICAgICAgICBtX21hcFdpZGdldEl0ZW0uU2V0QXQocFBhcmVudCwgcFBhcmVudEl0ZW0pOw0KLSAgICAgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwUm9vdCA9IEdldFdpZGdldE1nckl0ZW0oTlVMTCk7DQotICAgICAgICBwUGFyZW50SXRlbS0+cFBhcmVudCA9IHBSb290Ow0KLSAgICAgICAgU2V0V2lkZ2V0SW5kZXgocFBhcmVudCwgLTEpOw0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBDaGlsZCk7DQotICAgIGlmICghcEl0ZW0pIHsNCi0gICAgICAgIHBJdGVtID0gRlhfTkVXIENGV0xfV2lkZ2V0TWdySXRlbTsNCi0gICAgICAgIHBJdGVtLT5wV2lkZ2V0ID0gcENoaWxkOw0KLSAgICAgICAgbV9tYXBXaWRnZXRJdGVtLlNldEF0KHBDaGlsZCwgcEl0ZW0pOw0KLSAgICB9DQotICAgIGlmIChwSXRlbS0+cFBhcmVudCAmJiBwSXRlbS0+cFBhcmVudCAhPSBwUGFyZW50SXRlbSkgew0KLSAgICAgICAgaWYgKHBJdGVtLT5wUHJldmlvdXMpIHsNCi0gICAgICAgICAgICBwSXRlbS0+cFByZXZpb3VzLT5wTmV4dCA9IHBJdGVtLT5wTmV4dDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwSXRlbS0+cE5leHQpIHsNCi0gICAgICAgICAgICBwSXRlbS0+cE5leHQtPnBQcmV2aW91cyA9IHBJdGVtLT5wUHJldmlvdXM7DQotICAgICAgICB9DQotICAgICAgICBpZiAocEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwSXRlbSkgew0KLSAgICAgICAgICAgIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPSBwSXRlbS0+cE5leHQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcEl0ZW0tPnBQYXJlbnQgPSBwUGFyZW50SXRlbTsNCi0gICAgU2V0V2lkZ2V0SW5kZXgocENoaWxkLCBuSW5kZXgpOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0TWdyOjpSZW1vdmVXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCi0gICAgaWYgKCFwSXRlbSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQordm9pZCBDRldMX1dpZGdldE1ncjo6QWRkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBQYXJlbnRJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShOVUxMKTsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgaWYgKCFwSXRlbSkgew0KKyAgICBwSXRlbSA9IEZYX05FVyBDRldMX1dpZGdldE1nckl0ZW07DQorICAgIHBJdGVtLT5wV2lkZ2V0ID0gcFdpZGdldDsNCisgICAgbV9tYXBXaWRnZXRJdGVtLlNldEF0KHBXaWRnZXQsIHBJdGVtKTsNCisgIH0NCisgIGlmIChwSXRlbS0+cFBhcmVudCAmJiBwSXRlbS0+cFBhcmVudCAhPSBwUGFyZW50SXRlbSkgew0KICAgICBpZiAocEl0ZW0tPnBQcmV2aW91cykgew0KLSAgICAgICAgcEl0ZW0tPnBQcmV2aW91cy0+cE5leHQgPSBwSXRlbS0+cE5leHQ7DQorICAgICAgcEl0ZW0tPnBQcmV2aW91cy0+cE5leHQgPSBwSXRlbS0+cE5leHQ7DQogICAgIH0NCiAgICAgaWYgKHBJdGVtLT5wTmV4dCkgew0KLSAgICAgICAgcEl0ZW0tPnBOZXh0LT5wUHJldmlvdXMgPSBwSXRlbS0+cFByZXZpb3VzOw0KKyAgICAgIHBJdGVtLT5wTmV4dC0+cFByZXZpb3VzID0gcEl0ZW0tPnBQcmV2aW91czsNCiAgICAgfQ0KLSAgICBpZiAocEl0ZW0tPnBQYXJlbnQgJiYgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwSXRlbSkgew0KLSAgICAgICAgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9IHBJdGVtLT5wTmV4dDsNCisgICAgaWYgKHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPT0gcEl0ZW0pIHsNCisgICAgICBwSXRlbS0+cFBhcmVudC0+cENoaWxkID0gcEl0ZW0tPnBOZXh0Ow0KICAgICB9DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcENoaWxkID0gcEl0ZW0tPnBDaGlsZDsNCi0gICAgd2hpbGUgKHBDaGlsZCkgew0KLSAgICAgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwTmV4dCA9IHBDaGlsZC0+cE5leHQ7DQotICAgICAgICBSZW1vdmVXaWRnZXQocENoaWxkLT5wV2lkZ2V0KTsNCi0gICAgICAgIHBDaGlsZCA9IHBOZXh0Ow0KKyAgfQ0KKyAgcEl0ZW0tPnBQYXJlbnQgPSBwUGFyZW50SXRlbTsNCisgIFNldFdpZGdldEluZGV4KHBXaWRnZXQsIC0xKTsNCit9DQordm9pZCBDRldMX1dpZGdldE1ncjo6SW5zZXJ0V2lkZ2V0KElGV0xfV2lkZ2V0KiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcENoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUGFyZW50SXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFBhcmVudCk7DQorICBpZiAoIXBQYXJlbnRJdGVtKSB7DQorICAgIHBQYXJlbnRJdGVtID0gRlhfTkVXIENGV0xfV2lkZ2V0TWdySXRlbTsNCisgICAgcFBhcmVudEl0ZW0tPnBXaWRnZXQgPSBwUGFyZW50Ow0KKyAgICBtX21hcFdpZGdldEl0ZW0uU2V0QXQocFBhcmVudCwgcFBhcmVudEl0ZW0pOw0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0qIHBSb290ID0gR2V0V2lkZ2V0TWdySXRlbShOVUxMKTsNCisgICAgcFBhcmVudEl0ZW0tPnBQYXJlbnQgPSBwUm9vdDsNCisgICAgU2V0V2lkZ2V0SW5kZXgocFBhcmVudCwgLTEpOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocENoaWxkKTsNCisgIGlmICghcEl0ZW0pIHsNCisgICAgcEl0ZW0gPSBGWF9ORVcgQ0ZXTF9XaWRnZXRNZ3JJdGVtOw0KKyAgICBwSXRlbS0+cFdpZGdldCA9IHBDaGlsZDsNCisgICAgbV9tYXBXaWRnZXRJdGVtLlNldEF0KHBDaGlsZCwgcEl0ZW0pOw0KKyAgfQ0KKyAgaWYgKHBJdGVtLT5wUGFyZW50ICYmIHBJdGVtLT5wUGFyZW50ICE9IHBQYXJlbnRJdGVtKSB7DQorICAgIGlmIChwSXRlbS0+cFByZXZpb3VzKSB7DQorICAgICAgcEl0ZW0tPnBQcmV2aW91cy0+cE5leHQgPSBwSXRlbS0+cE5leHQ7DQogICAgIH0NCi0gICAgbV9tYXBXaWRnZXRJdGVtLlJlbW92ZUtleShwV2lkZ2V0KTsNCi0gICAgZGVsZXRlIHBJdGVtOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0TWdyOjpTZXRPd25lcihJRldMX1dpZGdldCAqcE93bmVyLCBJRldMX1dpZGdldCAqcE93bmVkKQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwUGFyZW50SXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocE93bmVyKTsNCi0gICAgaWYgKCFwUGFyZW50SXRlbSkgew0KLSAgICAgICAgcFBhcmVudEl0ZW0gPSBGWF9ORVcgQ0ZXTF9XaWRnZXRNZ3JJdGVtOw0KLSAgICAgICAgcFBhcmVudEl0ZW0tPnBXaWRnZXQgPSBwT3duZXI7DQotICAgICAgICBtX21hcFdpZGdldEl0ZW0uU2V0QXQocE93bmVyLCBwUGFyZW50SXRlbSk7DQotICAgICAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBSb290ID0gR2V0V2lkZ2V0TWdySXRlbShOVUxMKTsNCi0gICAgICAgIHBQYXJlbnRJdGVtLT5wUGFyZW50ID0gcFJvb3Q7DQotICAgICAgICBTZXRXaWRnZXRJbmRleChwT3duZXIsIC0xKTsNCisgICAgaWYgKHBJdGVtLT5wTmV4dCkgew0KKyAgICAgIHBJdGVtLT5wTmV4dC0+cFByZXZpb3VzID0gcEl0ZW0tPnBQcmV2aW91czsNCiAgICAgfQ0KLSAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwT3duZWQpOw0KLSAgICBpZiAoIXBJdGVtKSB7DQotICAgICAgICBwSXRlbSA9IEZYX05FVyBDRldMX1dpZGdldE1nckl0ZW07DQotICAgICAgICBwSXRlbS0+cFdpZGdldCA9IHBPd25lZDsNCi0gICAgICAgIG1fbWFwV2lkZ2V0SXRlbS5TZXRBdChwT3duZWQsIHBJdGVtKTsNCisgICAgaWYgKHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPT0gcEl0ZW0pIHsNCisgICAgICBwSXRlbS0+cFBhcmVudC0+cENoaWxkID0gcEl0ZW0tPnBOZXh0Ow0KICAgICB9DQotICAgIHBJdGVtLT5wT3duZXIgPSBwUGFyZW50SXRlbTsNCisgIH0NCisgIHBJdGVtLT5wUGFyZW50ID0gcFBhcmVudEl0ZW07DQorICBTZXRXaWRnZXRJbmRleChwQ2hpbGQsIG5JbmRleCk7DQogfQ0KLXZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OlNldFBhcmVudChJRldMX1dpZGdldCAqcFBhcmVudCwgSUZXTF9XaWRnZXQgKnBDaGlsZCkNCi17DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcFBhcmVudEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBQYXJlbnQpOw0KLSAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwQ2hpbGQpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBJdGVtKTsNCi0gICAgaWYgKHBJdGVtLT5wUGFyZW50ICYmIHBJdGVtLT5wUGFyZW50ICE9IHBQYXJlbnRJdGVtKSB7DQotICAgICAgICBpZiAocEl0ZW0tPnBQcmV2aW91cykgew0KLSAgICAgICAgICAgIHBJdGVtLT5wUHJldmlvdXMtPnBOZXh0ID0gcEl0ZW0tPnBOZXh0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBJdGVtLT5wTmV4dCkgew0KLSAgICAgICAgICAgIHBJdGVtLT5wTmV4dC0+cFByZXZpb3VzID0gcEl0ZW0tPnBQcmV2aW91czsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwSXRlbS0+cFBhcmVudC0+cENoaWxkID09IHBJdGVtKSB7DQotICAgICAgICAgICAgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9IHBJdGVtLT5wTmV4dDsNCi0gICAgICAgIH0NCi0gICAgICAgIHBJdGVtLT5wTmV4dCA9IE5VTEw7DQotICAgICAgICBwSXRlbS0+cFByZXZpb3VzID0gTlVMTDsNCit2b2lkIENGV0xfV2lkZ2V0TWdyOjpSZW1vdmVXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgaWYgKCFwSXRlbSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocEl0ZW0tPnBQcmV2aW91cykgew0KKyAgICBwSXRlbS0+cFByZXZpb3VzLT5wTmV4dCA9IHBJdGVtLT5wTmV4dDsNCisgIH0NCisgIGlmIChwSXRlbS0+cE5leHQpIHsNCisgICAgcEl0ZW0tPnBOZXh0LT5wUHJldmlvdXMgPSBwSXRlbS0+cFByZXZpb3VzOw0KKyAgfQ0KKyAgaWYgKHBJdGVtLT5wUGFyZW50ICYmIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPT0gcEl0ZW0pIHsNCisgICAgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9IHBJdGVtLT5wTmV4dDsNCisgIH0NCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcENoaWxkID0gcEl0ZW0tPnBDaGlsZDsNCisgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwTmV4dCA9IHBDaGlsZC0+cE5leHQ7DQorICAgIFJlbW92ZVdpZGdldChwQ2hpbGQtPnBXaWRnZXQpOw0KKyAgICBwQ2hpbGQgPSBwTmV4dDsNCisgIH0NCisgIG1fbWFwV2lkZ2V0SXRlbS5SZW1vdmVLZXkocFdpZGdldCk7DQorICBkZWxldGUgcEl0ZW07DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OlNldE93bmVyKElGV0xfV2lkZ2V0KiBwT3duZXIsIElGV0xfV2lkZ2V0KiBwT3duZWQpIHsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcFBhcmVudEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBPd25lcik7DQorICBpZiAoIXBQYXJlbnRJdGVtKSB7DQorICAgIHBQYXJlbnRJdGVtID0gRlhfTkVXIENGV0xfV2lkZ2V0TWdySXRlbTsNCisgICAgcFBhcmVudEl0ZW0tPnBXaWRnZXQgPSBwT3duZXI7DQorICAgIG1fbWFwV2lkZ2V0SXRlbS5TZXRBdChwT3duZXIsIHBQYXJlbnRJdGVtKTsNCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUm9vdCA9IEdldFdpZGdldE1nckl0ZW0oTlVMTCk7DQorICAgIHBQYXJlbnRJdGVtLT5wUGFyZW50ID0gcFJvb3Q7DQorICAgIFNldFdpZGdldEluZGV4KHBPd25lciwgLTEpOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocE93bmVkKTsNCisgIGlmICghcEl0ZW0pIHsNCisgICAgcEl0ZW0gPSBGWF9ORVcgQ0ZXTF9XaWRnZXRNZ3JJdGVtOw0KKyAgICBwSXRlbS0+cFdpZGdldCA9IHBPd25lZDsNCisgICAgbV9tYXBXaWRnZXRJdGVtLlNldEF0KHBPd25lZCwgcEl0ZW0pOw0KKyAgfQ0KKyAgcEl0ZW0tPnBPd25lciA9IHBQYXJlbnRJdGVtOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0TWdyOjpTZXRQYXJlbnQoSUZXTF9XaWRnZXQqIHBQYXJlbnQsIElGV0xfV2lkZ2V0KiBwQ2hpbGQpIHsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcFBhcmVudEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBQYXJlbnQpOw0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocENoaWxkKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEl0ZW0pOw0KKyAgaWYgKHBJdGVtLT5wUGFyZW50ICYmIHBJdGVtLT5wUGFyZW50ICE9IHBQYXJlbnRJdGVtKSB7DQorICAgIGlmIChwSXRlbS0+cFByZXZpb3VzKSB7DQorICAgICAgcEl0ZW0tPnBQcmV2aW91cy0+cE5leHQgPSBwSXRlbS0+cE5leHQ7DQogICAgIH0NCi0gICAgcEl0ZW0tPnBQYXJlbnQgPSBwUGFyZW50SXRlbTsNCi0gICAgU2V0V2lkZ2V0SW5kZXgocENoaWxkLCAtMSk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wQWRhcHRlcik7DQotICAgIG1fcEFkYXB0ZXItPlNldFBhcmVudFdpZGdldChwQ2hpbGQsIHBQYXJlbnQpOw0KLX0NCi1GWF9CT09MCUNGV0xfV2lkZ2V0TWdyOjpJc0NoaWxkKElGV0xfV2lkZ2V0ICpwQ2hpbGQsIElGV0xfV2lkZ2V0ICpwUGFyZW50KQ0KLXsNCi0gICAgSUZXTF9XaWRnZXQgKnBUZW1wID0gcENoaWxkOw0KLSAgICBkbyB7DQotICAgICAgICBpZiAocFRlbXAgPT0gcFBhcmVudCkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFRlbXAgPSBHZXRXaWRnZXQocFRlbXAsIEZXTF9XR1RSRUxBVElPTl9QYXJlbnQpOw0KLSAgICB9IHdoaWxlIChwVGVtcCk7DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRldMX0VSUiBDRldMX1dpZGdldE1ncjo6Q3JlYXRlV2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIGlmICghSXNBYmxlTmF0aXZlKHBXaWRnZXQpKSB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIGlmIChwSXRlbS0+cE5leHQpIHsNCisgICAgICBwSXRlbS0+cE5leHQtPnBQcmV2aW91cyA9IHBJdGVtLT5wUHJldmlvdXM7DQogICAgIH0NCi0gICAgcmV0dXJuIG1fcEFkYXB0ZXItPkNyZWF0ZVdpZGdldChwV2lkZ2V0LCBwV2lkZ2V0LT5HZXRPd25lcigpKTsNCi19DQotRldMX0VSUiBDRldMX1dpZGdldE1ncjo6RGVzdHJveVdpZGdldF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBpZiAoIUlzQWJsZU5hdGl2ZShwV2lkZ2V0KSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICBpZiAocEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwSXRlbSkgew0KKyAgICAgIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPSBwSXRlbS0+cE5leHQ7DQogICAgIH0NCi0gICAgcmV0dXJuIG1fcEFkYXB0ZXItPkRlc3Ryb3lXaWRnZXQocFdpZGdldCk7DQorICAgIHBJdGVtLT5wTmV4dCA9IE5VTEw7DQorICAgIHBJdGVtLT5wUHJldmlvdXMgPSBOVUxMOw0KKyAgfQ0KKyAgcEl0ZW0tPnBQYXJlbnQgPSBwUGFyZW50SXRlbTsNCisgIFNldFdpZGdldEluZGV4KHBDaGlsZCwgLTEpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BBZGFwdGVyKTsNCisgIG1fcEFkYXB0ZXItPlNldFBhcmVudFdpZGdldChwQ2hpbGQsIHBQYXJlbnQpOw0KIH0NCi1GV0xfRVJSCUNGV0xfV2lkZ2V0TWdyOjpHZXRXaWRnZXRSZWN0X05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgaWYgKCFJc0FibGVOYXRpdmUocFdpZGdldCkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGWF9CT09MIENGV0xfV2lkZ2V0TWdyOjpJc0NoaWxkKElGV0xfV2lkZ2V0KiBwQ2hpbGQsIElGV0xfV2lkZ2V0KiBwUGFyZW50KSB7DQorICBJRldMX1dpZGdldCogcFRlbXAgPSBwQ2hpbGQ7DQorICBkbyB7DQorICAgIGlmIChwVGVtcCA9PSBwUGFyZW50KSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi0gICAgcmV0dXJuIG1fcEFkYXB0ZXItPkdldFdpZGdldFJlY3QocFdpZGdldCwgcmVjdCk7DQorICAgIHBUZW1wID0gR2V0V2lkZ2V0KHBUZW1wLCBGV0xfV0dUUkVMQVRJT05fUGFyZW50KTsNCisgIH0gd2hpbGUgKHBUZW1wKTsNCisgIHJldHVybiBGQUxTRTsNCiB9DQotRldMX0VSUiBDRldMX1dpZGdldE1ncjo6U2V0V2lkZ2V0UmVjdF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIGlmIChGV0xfVXNlT2Zmc2NyZWVuKHBXaWRnZXQpKSB7DQotICAgICAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCi0gICAgICAgIHBJdGVtLT5pUmVkcmF3Q291bnRlciArKzsNCi0gICAgICAgIGlmIChwSXRlbS0+cE9mZnNjcmVlbikgew0KLSAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UgKnBEZXZpY2UgPSBwSXRlbS0+cE9mZnNjcmVlbi0+R2V0UmVuZGVyRGV2aWNlKCk7DQotICAgICAgICAgICAgaWYgKHBEZXZpY2UgJiYgcERldmljZS0+R2V0Qml0bWFwKCkpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwICpwQml0bWFwID0gcERldmljZS0+R2V0Qml0bWFwKCk7DQotICAgICAgICAgICAgICAgIGlmIChwQml0bWFwLT5HZXRXaWR0aCgpIC0gcmVjdC53aWR0aCA+IDEgfHwgcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSByZWN0LmhlaWdodCA+IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwSXRlbS0+cE9mZnNjcmVlbjsNCi0gICAgICAgICAgICAgICAgICAgIHBJdGVtLT5wT2Zmc2NyZWVuID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0jaWYgKF9GWF9PU189PV9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU189PV9GWF9XSU42NF8pDQotICAgICAgICBwSXRlbS0+Yk91dHNpZGVDaGFuZ2VkID0gIW1fcnRTY3JlZW4uQ29udGFpbnMocmVjdCk7DQotI2VuZGlmDQotICAgIH0NCi0gICAgcmV0dXJuIG1fcEFkYXB0ZXItPlNldFdpZGdldFJlY3QocFdpZGdldCwgcmVjdCk7DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6Q3JlYXRlV2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgaWYgKCFJc0FibGVOYXRpdmUocFdpZGdldCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPkNyZWF0ZVdpZGdldChwV2lkZ2V0LCBwV2lkZ2V0LT5HZXRPd25lcigpKTsNCiB9DQotRldMX0VSUglDRldMX1dpZGdldE1ncjo6U2V0V2lkZ2V0UG9zaXRpb25fTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICByZXR1cm4gbV9wQWRhcHRlci0+U2V0V2lkZ2V0UG9zaXRpb24ocFdpZGdldCwgZngsIGZ5KTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpEZXN0cm95V2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgaWYgKCFJc0FibGVOYXRpdmUocFdpZGdldCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPkRlc3Ryb3lXaWRnZXQocFdpZGdldCk7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OlNldFdpZGdldEljb25fTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfRElCaXRtYXAgKnBJY29uLCBGWF9CT09MIGJCaWcpDQotew0KLSAgICByZXR1cm4gbV9wQWRhcHRlci0+U2V0V2lkZ2V0SWNvbihwV2lkZ2V0LCBwSWNvbiwgYkJpZyk7DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6R2V0V2lkZ2V0UmVjdF9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBpZiAoIUlzQWJsZU5hdGl2ZShwV2lkZ2V0KSkgew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gbV9wQWRhcHRlci0+R2V0V2lkZ2V0UmVjdChwV2lkZ2V0LCByZWN0KTsNCiB9DQotRldMX0VSUglDRldMX1dpZGdldE1ncjo6U2V0V2lkZ2V0Q2FwdGlvbl9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDYXB0aW9uKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEFkYXB0ZXItPlNldFdpZGdldENhcHRpb24ocFdpZGdldCwgd3NDYXB0aW9uKTsNCi19DQotRldMX0VSUglDRldMX1dpZGdldE1ncjo6U2V0Qm9yZGVyUmVnaW9uX05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1BhdGggKnBQYXRoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEFkYXB0ZXItPlNldEJvcmRlclJlZ2lvbihwV2lkZ2V0LCBwUGF0aCk7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OlNob3dXaWRnZXRfTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIG1fcEFkYXB0ZXItPlNob3dXaWRnZXQocFdpZGdldCk7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OkhpZGVXaWRnZXRfTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIG1fcEFkYXB0ZXItPkhpZGVXaWRnZXQocFdpZGdldCk7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OlNldE5vcm1hbF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gbV9wQWRhcHRlci0+U2V0Tm9ybWFsKHBXaWRnZXQpOw0KLX0NCi1GV0xfRVJSCUNGV0xfV2lkZ2V0TWdyOjpTZXRNYXhpbWl6ZV9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gbV9wQWRhcHRlci0+U2V0TWF4aW1pemUocFdpZGdldCk7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OlNldE1pbmltaXplX05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBtX3BBZGFwdGVyLT5TZXRNaW5pbWl6ZShwV2lkZ2V0KTsNCi19DQotRlhfQk9PTAlDRldMX1dpZGdldE1ncjo6Q2hlY2tNZXNzYWdlX05hdGl2ZSgpDQotew0KLSAgICByZXR1cm4gbV9wQWRhcHRlci0+Q2hlY2tNZXNzYWdlKCk7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OkRpc3BhdGNoTWVzc2FnZV9OYXRpdmUoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEFkYXB0ZXItPkRpc3BhdGNoTWVzc2FnZSgpOw0KLX0NCi1GWF9CT09MCUNGV0xfV2lkZ2V0TWdyOjpJc0lkbGVNZXNzYWdlX05hdGl2ZSgpDQotew0KLSAgICByZXR1cm4gbV9wQWRhcHRlci0+SXNJZGxlTWVzc2FnZSgpOw0KLX0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpFeGl0X05hdGl2ZShpbnQzMl90IGlFeGl0Q29kZSkNCi17DQotICAgIHJldHVybiBtX3BBZGFwdGVyLT5FeGl0KGlFeGl0Q29kZSk7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRNZ3I6OkNyZWF0ZVdpZGdldFdpdGhOYXRpdmVJZF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIHZvaWQgKnZwKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEFkYXB0ZXItPkNyZWF0ZVdpZGdldFdpdGhOYXRpdmVJZChwV2lkZ2V0LCB2cCk7DQotfQ0KLUlGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6R2V0V2lkZ2V0QXRQb2ludChJRldMX1dpZGdldCAqIHBhcmVudCwgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGFyZW50LCBOVUxMKTsNCi0gICAgRlhfRkxPQVQgeDE7DQotICAgIEZYX0ZMT0FUIHkxOw0KLSAgICBJRldMX1dpZGdldCAqIGNoaWxkID0gR2V0V2lkZ2V0KHBhcmVudCwgRldMX1dHVFJFTEFUSU9OX0xhc3RDaGlsZCk7DQotICAgIHdoaWxlIChjaGlsZCkgew0KLSAgICAgICAgaWYgKChjaGlsZC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSA9PSAwKSB7DQotICAgICAgICAgICAgeDEgPSB4Ow0KLSAgICAgICAgICAgIHkxID0geTsNCi0gICAgICAgICAgICBDRlhfTWF0cml4IG1hdHJpeE9uUGFyZW50Ow0KLSAgICAgICAgICAgIGNoaWxkLT5HZXRNYXRyaXgobWF0cml4T25QYXJlbnQpOw0KLSAgICAgICAgICAgIENGWF9NYXRyaXggbTsNCi0gICAgICAgICAgICBtLlJlc2V0KCk7DQotICAgICAgICAgICAgbS5TZXRSZXZlcnNlKG1hdHJpeE9uUGFyZW50KTsNCi0gICAgICAgICAgICBtLlRyYW5zZm9ybVBvaW50KHgxLCB5MSk7DQotICAgICAgICAgICAgQ0ZYX1JlY3RGIGJvdW5kczsNCi0gICAgICAgICAgICBjaGlsZC0+R2V0V2lkZ2V0UmVjdChib3VuZHMpOw0KLSAgICAgICAgICAgIGlmIChib3VuZHMuQ29udGFpbnMoeDEsIHkxKSkgew0KLSAgICAgICAgICAgICAgICB4MSAtPSBib3VuZHMubGVmdDsNCi0gICAgICAgICAgICAgICAgeTEgLT0gYm91bmRzLnRvcDsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFdpZGdldEF0UG9pbnQoY2hpbGQsIHgxLCB5MSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2hpbGQgPSBHZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9QcmlvclNpYmxpbmcpOw0KLSAgICB9DQotICAgIHJldHVybiBwYXJlbnQ7DQotfQ0KLXZvaWQgQ0ZXTF9XaWRnZXRNZ3I6Ok5vdGlmeVNpemVDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwRm9ybSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKCFGV0xfVXNlT2Zmc2NyZWVuKHBGb3JtKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBGb3JtKTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpTZXRXaWRnZXRSZWN0X05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIGlmIChGV0xfVXNlT2Zmc2NyZWVuKHBXaWRnZXQpKSB7DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSogcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgICBwSXRlbS0+aVJlZHJhd0NvdW50ZXIrKzsNCiAgICAgaWYgKHBJdGVtLT5wT2Zmc2NyZWVuKSB7DQotICAgICAgICBkZWxldGUgcEl0ZW0tPnBPZmZzY3JlZW47DQotICAgICAgICBwSXRlbS0+cE9mZnNjcmVlbiA9IE5VTEw7DQotICAgIH0NCi19DQotSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0TWdyOjpuZXh0VGFiKElGV0xfV2lkZ2V0ICpwYXJlbnQsIElGV0xfV2lkZ2V0ICpmb2N1cywgRlhfQk9PTCAmYkZpbmQpDQotew0KLSAgICBJRldMX1dpZGdldCAqY2hpbGQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChwYXJlbnQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCi0gICAgd2hpbGUgKGNoaWxkKSB7DQotICAgICAgICBpZiAoZm9jdXMgPT0gY2hpbGQpIHsNCi0gICAgICAgICAgICBiRmluZCA9IFRSVUU7DQorICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSA9IHBJdGVtLT5wT2Zmc2NyZWVuLT5HZXRSZW5kZXJEZXZpY2UoKTsNCisgICAgICBpZiAocERldmljZSAmJiBwRGV2aWNlLT5HZXRCaXRtYXAoKSkgew0KKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gcERldmljZS0+R2V0Qml0bWFwKCk7DQorICAgICAgICBpZiAocEJpdG1hcC0+R2V0V2lkdGgoKSAtIHJlY3Qud2lkdGggPiAxIHx8DQorICAgICAgICAgICAgcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSByZWN0LmhlaWdodCA+IDEpIHsNCisgICAgICAgICAgZGVsZXRlIHBJdGVtLT5wT2Zmc2NyZWVuOw0KKyAgICAgICAgICBwSXRlbS0+cE9mZnNjcmVlbiA9IE5VTEw7DQogICAgICAgICB9DQotICAgICAgICBpZiAoKGNoaWxkLT5HZXRTdHlsZXMoKSAmIEZXTF9XR1RTVFlMRV9UYWJTdG9wKSAmJiAoIWZvY3VzIHx8IChmb2N1cyAhPSBjaGlsZCAmJiBiRmluZCkpKSB7DQotICAgICAgICAgICAgcmV0dXJuIGNoaWxkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgSUZXTF9XaWRnZXQgKmJSZXQgPSBuZXh0VGFiKGNoaWxkLCBmb2N1cywgYkZpbmQpOw0KLSAgICAgICAgaWYgKGJSZXQpIHsNCi0gICAgICAgICAgICByZXR1cm4gYlJldDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNoaWxkID0gRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1pbnQzMl90IENGV0xfV2lkZ2V0TWdyOjpDb3VudFJhZGlvQnV0dG9uR3JvdXAoSUZXTF9XaWRnZXQgKnBGaXJzdCkNCi17DQotICAgIGludDMyX3QgaVJldCA9IDA7DQotICAgIElGV0xfV2lkZ2V0ICpwQ2hpbGQgPSBwRmlyc3Q7DQotICAgIHdoaWxlIChwQ2hpbGQpIHsNCi0gICAgICAgIGlmICgocENoaWxkLT5HZXRTdHlsZXMoKSAmIEZXTF9XR1RTVFlMRV9Hcm91cCkgJiYgcENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KLSAgICAgICAgICAgIGlSZXQgKys7DQotICAgICAgICB9DQotICAgICAgICBwQ2hpbGQgPSBHZXRXaWRnZXQocENoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KLSAgICB9DQotICAgIHJldHVybiBpUmV0Ow0KLX0NCi1JRldMX1dpZGdldCogQ0ZXTF9XaWRnZXRNZ3I6OkdldFNpYmxpbmdSYWRpb0J1dHRvbihJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiTmV4dCkNCi17DQotICAgIHdoaWxlICgocFdpZGdldCA9IEdldFdpZGdldChwV2lkZ2V0LCBiTmV4dCA/IEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyA6IEZXTF9XR1RSRUxBVElPTl9QcmlvclNpYmxpbmcpKSAhPSBOVUxMKSB7DQotICAgICAgICBpZiAocFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IDM4MTEzMDQ2OTEpIHsNCi0gICAgICAgICAgICByZXR1cm4gcFdpZGdldDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0TWdyOjpHZXRSYWRpb0J1dHRvbkdyb3VwSGVhZGVyKElGV0xfV2lkZ2V0ICpwUmFkaW9CdXR0b24pDQotew0KLSAgICBpZiAocFJhZGlvQnV0dG9uLT5HZXRTdHlsZXMoKSAmIEZXTF9XR1RTVFlMRV9Hcm91cCkgew0KLSAgICAgICAgcmV0dXJuIHBSYWRpb0J1dHRvbjsNCi0gICAgfQ0KLSAgICBJRldMX1dpZGdldCAqcE5leHQgPSBwUmFkaW9CdXR0b247DQotICAgIHdoaWxlICgocE5leHQgPSBHZXRTaWJsaW5nUmFkaW9CdXR0b24ocE5leHQsIEZBTFNFKSkgIT0gTlVMTCkgew0KLSAgICAgICAgaWYgKHBOZXh0LT5HZXRTdHlsZXMoKSAmIEZXTF9XR1RTVFlMRV9Hcm91cCkgew0KLSAgICAgICAgICAgIHJldHVybiBwTmV4dDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwTmV4dCA9IEdldFdpZGdldChwUmFkaW9CdXR0b24sIEZXTF9XR1RSRUxBVElPTl9MYXN0U2libGluZyk7DQotICAgIGlmICgocE5leHQtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0dyb3VwKSAmJiBwTmV4dC0+R2V0Q2xhc3NJRCgpID09IDM4MTEzMDQ2OTEpIHsNCi0gICAgICAgIHJldHVybiBwTmV4dDsNCi0gICAgfQ0KLSAgICB3aGlsZSAoKHBOZXh0ID0gR2V0U2libGluZ1JhZGlvQnV0dG9uKHBOZXh0LCBGQUxTRSkpICYmIHBOZXh0ICYmIHBOZXh0ICE9IHBSYWRpb0J1dHRvbikgew0KLSAgICAgICAgaWYgKHBOZXh0LT5HZXRTdHlsZXMoKSAmIEZXTF9XR1RTVFlMRV9Hcm91cCkgew0KLSAgICAgICAgICAgIHJldHVybiBwTmV4dDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwTmV4dCA9IEdldFdpZGdldChwUmFkaW9CdXR0b24sIEZXTF9XR1RSRUxBVElPTl9GaXJzdFNpYmxpbmcpOw0KLSAgICBpZiAocE5leHQgJiYgKHBOZXh0LT5HZXRTdHlsZXMoKSA9PSBGV0xfV0dUU1RZTEVfR3JvdXApICYmIHBOZXh0LT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KLSAgICAgICAgcmV0dXJuIHBOZXh0Ow0KLSAgICB9DQotICAgIHJldHVybiBHZXRTaWJsaW5nUmFkaW9CdXR0b24ocE5leHQsIFRSVUUpOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0TWdyOjpHZXRTYW1lR3JvdXBSYWRpb0J1dHRvbihJRldMX1dpZGdldCAqcFJhZGlvQnV0dG9uLCBDRlhfUHRyQXJyYXkgJmdyb3VwKQ0KLXsNCi0gICAgSUZXTF9XaWRnZXQgKnBGaXJzdCA9IEdldFdpZGdldChwUmFkaW9CdXR0b24sIEZXTF9XR1RSRUxBVElPTl9GaXJzdFNpYmxpbmcpOw0KLSAgICBpZiAoIXBGaXJzdCkgew0KLSAgICAgICAgcEZpcnN0ID0gcFJhZGlvQnV0dG9uOw0KLSAgICB9DQotICAgIGludDMyX3QgaUdyb3VwID0gQ291bnRSYWRpb0J1dHRvbkdyb3VwKHBGaXJzdCk7DQotICAgIGlmIChpR3JvdXAgPCAyKSB7DQotICAgICAgICBpZiAocEZpcnN0LT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KLSAgICAgICAgICAgIGdyb3VwLkFkZChwRmlyc3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgSUZXTF9XaWRnZXQgKnBOZXh0ID0gcEZpcnN0Ow0KLSAgICAgICAgd2hpbGUgKChwTmV4dCA9IEdldFNpYmxpbmdSYWRpb0J1dHRvbihwTmV4dCwgVFJVRSkpICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBncm91cC5BZGQocE5leHQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElGV0xfV2lkZ2V0ICpwTmV4dCA9IEdldFJhZGlvQnV0dG9uR3JvdXBIZWFkZXIocFJhZGlvQnV0dG9uKTsNCi0gICAgZG8gew0KLSAgICAgICAgZ3JvdXAuQWRkKHBOZXh0KTsNCi0gICAgICAgIHBOZXh0ID0gR2V0U2libGluZ1JhZGlvQnV0dG9uKHBOZXh0LCBUUlVFKTsNCi0gICAgICAgIGlmICghcE5leHQpIHsNCi0gICAgICAgICAgICBpZiAocEZpcnN0LT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KLSAgICAgICAgICAgICAgICBwTmV4dCA9IHBGaXJzdDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBwTmV4dCA9IEdldFNpYmxpbmdSYWRpb0J1dHRvbihwRmlyc3QsIFRSVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAocE5leHQgJiYgKChwTmV4dC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfR3JvdXApID09IDApKTsNCi19DQotSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0TWdyOjpHZXREZWZhdWx0QnV0dG9uKElGV0xfV2lkZ2V0ICpwUGFyZW50KQ0KLXsNCi0gICAgaWYgKChwUGFyZW50LT5HZXRDbGFzc0lEKCkgPT0gMzUyMTYxNDI0NCkgJiYgKHBQYXJlbnQtPkdldFN0YXRlcygpICYgKDEgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAyKSkpKSB7DQotICAgICAgICByZXR1cm4gcFBhcmVudDsNCi0gICAgfQ0KLSAgICBJRldMX1dpZGdldCAqY2hpbGQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChwUGFyZW50LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQotICAgIHdoaWxlIChjaGlsZCkgew0KLSAgICAgICAgaWYgKChjaGlsZC0+R2V0Q2xhc3NJRCgpID09IDM1MjE2MTQyNDQpICYmIChjaGlsZC0+R2V0U3RhdGVzKCkgJiAoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDIpKSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gY2hpbGQ7DQotICAgICAgICB9DQotICAgICAgICBJRldMX1dpZGdldCAqZmluZCA9IEdldERlZmF1bHRCdXR0b24oY2hpbGQpOw0KLSAgICAgICAgaWYgKGZpbmQpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmluZDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNoaWxkID0gRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLXZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OkFkZFJlZHJhd0NvdW50cyhJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KLSAgICAocEl0ZW0tPmlSZWRyYXdDb3VudGVyKSsrOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0TWdyOjpSZXNldFJlZHJhd0NvdW50cyhJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KLSAgICBwSXRlbS0+aVJlZHJhd0NvdW50ZXIgPSAwOw0KLX0NCi1DRldMX1dpZGdldE1nckl0ZW0qIENGV0xfV2lkZ2V0TWdyOjpHZXRXaWRnZXRNZ3JJdGVtKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIChDRldMX1dpZGdldE1nckl0ZW0qKW1fbWFwV2lkZ2V0SXRlbS5HZXRWYWx1ZUF0KHBXaWRnZXQpOw0KLX0NCi1pbnQzMl90IENGV0xfV2lkZ2V0TWdyOjpUcmF2ZWxXaWRnZXRNZ3IoQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwUGFyZW50LCBpbnQzMl90ICpwSW5kZXgsIENGV0xfV2lkZ2V0TWdySXRlbSAqcEl0ZW0sIElGV0xfV2lkZ2V0ICoqcFdpZGdldCApDQotew0KLSAgICBpZiAoIXBQYXJlbnQpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwQ2hpbGQgPSBwUGFyZW50LT5wQ2hpbGQ7DQotICAgIHdoaWxlIChwQ2hpbGQpIHsNCi0gICAgICAgIGlDb3VudCArKzsNCi0gICAgICAgIGlmIChwSW5kZXgpIHsNCi0gICAgICAgICAgICBpZiAoKnBJbmRleCA9PSAwKSB7DQotICAgICAgICAgICAgICAgICpwV2lkZ2V0ID0gcENoaWxkLT5wV2lkZ2V0Ow0KLSAgICAgICAgICAgICAgICByZXR1cm4gaUNvdW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwSW5kZXggLS07DQotICAgICAgICB9DQotICAgICAgICBpZiAocEl0ZW0gJiYgcEl0ZW0gPT0gcENoaWxkKSB7DQotICAgICAgICAgICAgcmV0dXJuIGlDb3VudCAtIDE7DQotICAgICAgICB9DQotICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPnBOZXh0Ow0KLSAgICB9DQotICAgIGlmIChwSW5kZXgpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9IGVsc2UgaWYgKHBJdGVtKSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgcmV0dXJuIGlDb3VudCAtIDE7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9XaWRnZXRNZ3I6OklzQWJsZU5hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRkFMU0UpOw0KLSAgICBpZiAoIXBXaWRnZXQtPklzSW5zdGFuY2UoRlhfV1NUUkMoRldMX0NMQVNTX0Zvcm0pKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3U3R5bGVzID0gcFdpZGdldC0+R2V0U3R5bGVzKCk7DQotICAgIHJldHVybiAoKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX1dpbmRvd1R5cGVNYXNrKSA9PSBGV0xfV0dUU1RZTEVfT3ZlckxhcHBlcikgfHwgKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX1BvcHVwKTsNCi19DQotRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6SXNUaHJlYWRFbmFibGVkKCkNCi17DQotICAgIHJldHVybiAhKG1fZHdDYXBhYmlsaXR5ICYgRldMX1dHVE1HUl9EaXNhYmxlVGhyZWFkKTsNCi19DQotRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6SXNGb3JtRGlzYWJsZWQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fZHdDYXBhYmlsaXR5ICYgRldMX1dHVE1HUl9EaXNhYmxlRm9ybTsNCi19DQotRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6R2V0QWRhcHRlclBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApDQotew0KLSAgICBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIHBTREFwYXB0ZXIgPSBHZXRBZGFwdGVyV2lkZ2V0TWdyKCk7DQotICAgIHJldHVybiBwU0RBcGFwdGVyLT5HZXRQb3B1cFBvcyhwV2lkZ2V0LCBmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydEFuY2hvciwgcnRQb3B1cCk7DQotfQ0KLUNGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6OkNGV0xfV2lkZ2V0TWdyRGVsZWdhdGUoQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IpDQotICAgIDogbV9wV2lkZ2V0TWdyKHBXaWRnZXRNZ3IpDQotew0KLX0NCi1GV0xfRVJSCUNGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6Ok9uU2V0Q2FwYWJpbGl0eShGWF9EV09SRCBkd0NhcGFiaWxpdHkgKQ0KLXsNCi0gICAgbV9wV2lkZ2V0TWdyLT5tX2R3Q2FwYWJpbGl0eSA9IGR3Q2FwYWJpbGl0eTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1pbnQzMl90IENGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2VUb0Zvcm0oQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE1lc3NhZ2UsIDApOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLT5tX3BEc3RUYXJnZXQsIDApOw0KLSAgICBJRldMX1dpZGdldCAqcERzdFdpZGdldCA9IChJRldMX1dpZGdldCopcE1lc3NhZ2UtPm1fcERzdFRhcmdldDsNCi0gICAgSUZXTF9Ob3RlVGhyZWFkICpwTm90ZVRocmVhZCA9IHBEc3RXaWRnZXQtPkdldE93bmVyVGhyZWFkKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE5vdGVUaHJlYWQsIDApOw0KLSAgICBDRldMX05vdGVEcml2ZXIgKnBOb3RlRHJpdmVyID0gKENGV0xfTm90ZURyaXZlciopcE5vdGVUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTm90ZURyaXZlciwgMCk7DQotICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzVGhyZWFkRW5hYmxlZCgpKSB7DQotICAgICAgICBwTWVzc2FnZSA9IChDRldMX01lc3NhZ2UqKXBNZXNzYWdlLT5DbG9uZSgpOw0KLSAgICB9DQotICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCi0gICAgICAgIHBOb3RlRHJpdmVyLT5Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwTm90ZURyaXZlci0+UXVldWVNZXNzYWdlKHBNZXNzYWdlKTsNCi0gICAgfQ0KLSNpZiAoX0ZYX09TXz09X0ZYX01BQ09TWF8pDQotICAgIENGV0xfTm90ZUxvb3AgKnBUb3BMb29wID0gcE5vdGVEcml2ZXItPkdldFRvcExvb3AoKTsNCi0gICAgaWYgKHBUb3BMb29wKSB7DQotICAgICAgICBwTm90ZURyaXZlci0+VW5xdWV1ZU1lc3NhZ2UocFRvcExvb3ApOw0KLSAgICB9DQorI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU18gPT0gX0ZYX1dJTjY0XykNCisgICAgcEl0ZW0tPmJPdXRzaWRlQ2hhbmdlZCA9ICFtX3J0U2NyZWVuLkNvbnRhaW5zKHJlY3QpOw0KICNlbmRpZg0KLSAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc1RocmVhZEVuYWJsZWQoKSkgew0KLSAgICAgICAgcE1lc3NhZ2UtPlJlbGVhc2UoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gbV9wQWRhcHRlci0+U2V0V2lkZ2V0UmVjdChwV2lkZ2V0LCByZWN0KTsNCiB9DQotRldMX0VSUglDRldMX1dpZGdldE1nckRlbGVnYXRlOjpPbkRyYXdXaWRnZXQoSUZXTF9XaWRnZXQgKgkgIHBXaWRnZXQsDQotICAgICAgICBDRlhfR3JhcGhpY3MgKgkgIHBHcmFwaGljcywNCi0gICAgICAgIGNvbnN0IENGWF9NYXRyaXggKiBwTWF0cml4ICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwR3JhcGhpY3MsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIENGWF9HcmFwaGljcyAqcFRlbXAgPSBEcmF3V2lkZ2V0QmVmb3JlKHBXaWRnZXQsIHBHcmFwaGljcywgcE1hdHJpeCk7DQotICAgIENGWF9SZWN0RiBjbGlwQ29weTsNCi0gICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChjbGlwQ29weSk7DQotICAgIGNsaXBDb3B5LmxlZnQgPSBjbGlwQ29weS50b3AgPSAwOw0KLSAgICBpZiAoYlVzZU9mZnNjcmVlbkRpcmVjdChwV2lkZ2V0KSkgew0KLSAgICAgICAgRHJhd1dpZGdldEFmdGVyKHBXaWRnZXQsIHBHcmFwaGljcywgY2xpcENvcHksIHBNYXRyaXgpOw0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRNZ3I6OlNldFdpZGdldFBvc2l0aW9uX05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gbV9wQWRhcHRlci0+U2V0V2lkZ2V0UG9zaXRpb24ocFdpZGdldCwgZngsIGZ5KTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6U2V0V2lkZ2V0SWNvbl9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwSWNvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCaWcpIHsNCisgIHJldHVybiBtX3BBZGFwdGVyLT5TZXRXaWRnZXRJY29uKHBXaWRnZXQsIHBJY29uLCBiQmlnKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6U2V0V2lkZ2V0Q2FwdGlvbl9OYXRpdmUoDQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbikgew0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPlNldFdpZGdldENhcHRpb24ocFdpZGdldCwgd3NDYXB0aW9uKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6U2V0Qm9yZGVyUmVnaW9uX05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoKiBwUGF0aCkgew0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPlNldEJvcmRlclJlZ2lvbihwV2lkZ2V0LCBwUGF0aCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRNZ3I6OlNob3dXaWRnZXRfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9wQWRhcHRlci0+U2hvd1dpZGdldChwV2lkZ2V0KTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6SGlkZVdpZGdldF9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX3BBZGFwdGVyLT5IaWRlV2lkZ2V0KHBXaWRnZXQpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpTZXROb3JtYWxfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9wQWRhcHRlci0+U2V0Tm9ybWFsKHBXaWRnZXQpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpTZXRNYXhpbWl6ZV9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX3BBZGFwdGVyLT5TZXRNYXhpbWl6ZShwV2lkZ2V0KTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6U2V0TWluaW1pemVfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9wQWRhcHRlci0+U2V0TWluaW1pemUocFdpZGdldCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRNZ3I6OkNoZWNrTWVzc2FnZV9OYXRpdmUoKSB7DQorICByZXR1cm4gbV9wQWRhcHRlci0+Q2hlY2tNZXNzYWdlKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRNZ3I6OkRpc3BhdGNoTWVzc2FnZV9OYXRpdmUoKSB7DQorICByZXR1cm4gbV9wQWRhcHRlci0+RGlzcGF0Y2hNZXNzYWdlKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRNZ3I6OklzSWRsZU1lc3NhZ2VfTmF0aXZlKCkgew0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPklzSWRsZU1lc3NhZ2UoKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6RXhpdF9OYXRpdmUoaW50MzJfdCBpRXhpdENvZGUpIHsNCisgIHJldHVybiBtX3BBZGFwdGVyLT5FeGl0KGlFeGl0Q29kZSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRNZ3I6OkNyZWF0ZVdpZGdldFdpdGhOYXRpdmVJZF9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB2cCkgew0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPkNyZWF0ZVdpZGdldFdpdGhOYXRpdmVJZChwV2lkZ2V0LCB2cCk7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6R2V0V2lkZ2V0QXRQb2ludChJRldMX1dpZGdldCogcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBhcmVudCwgTlVMTCk7DQorICBGWF9GTE9BVCB4MTsNCisgIEZYX0ZMT0FUIHkxOw0KKyAgSUZXTF9XaWRnZXQqIGNoaWxkID0gR2V0V2lkZ2V0KHBhcmVudCwgRldMX1dHVFJFTEFUSU9OX0xhc3RDaGlsZCk7DQorICB3aGlsZSAoY2hpbGQpIHsNCisgICAgaWYgKChjaGlsZC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSA9PSAwKSB7DQorICAgICAgeDEgPSB4Ow0KKyAgICAgIHkxID0geTsNCisgICAgICBDRlhfTWF0cml4IG1hdHJpeE9uUGFyZW50Ow0KKyAgICAgIGNoaWxkLT5HZXRNYXRyaXgobWF0cml4T25QYXJlbnQpOw0KKyAgICAgIENGWF9NYXRyaXggbTsNCisgICAgICBtLlJlc2V0KCk7DQorICAgICAgbS5TZXRSZXZlcnNlKG1hdHJpeE9uUGFyZW50KTsNCisgICAgICBtLlRyYW5zZm9ybVBvaW50KHgxLCB5MSk7DQorICAgICAgQ0ZYX1JlY3RGIGJvdW5kczsNCisgICAgICBjaGlsZC0+R2V0V2lkZ2V0UmVjdChib3VuZHMpOw0KKyAgICAgIGlmIChib3VuZHMuQ29udGFpbnMoeDEsIHkxKSkgew0KKyAgICAgICAgeDEgLT0gYm91bmRzLmxlZnQ7DQorICAgICAgICB5MSAtPSBib3VuZHMudG9wOw0KKyAgICAgICAgcmV0dXJuIEdldFdpZGdldEF0UG9pbnQoY2hpbGQsIHgxLCB5MSk7DQorICAgICAgfQ0KICAgICB9DQotICAgIENGWF9SZWN0RiBjbGlwQm91bmRzOw0KLSNpZiAoX0ZYX09TXz09X0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXz09X0ZYX1dJTjY0XykgfHwgKF9GWF9PU18gPT0gX0ZYX0xJTlVYX0RFU0tUT1BfKSB8fCAoX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8pDQotICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IHBXaWRnZXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBjaGlsZCA9IEdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX1ByaW9yU2libGluZyk7DQorICB9DQorICByZXR1cm4gcGFyZW50Ow0KK30NCit2b2lkIENGV0xfV2lkZ2V0TWdyOjpOb3RpZnlTaXplQ2hhbmdlZChJRldMX1dpZGdldCogcEZvcm0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghRldMX1VzZU9mZnNjcmVlbihwRm9ybSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocEZvcm0pOw0KKyAgaWYgKHBJdGVtLT5wT2Zmc2NyZWVuKSB7DQorICAgIGRlbGV0ZSBwSXRlbS0+cE9mZnNjcmVlbjsNCisgICAgcEl0ZW0tPnBPZmZzY3JlZW4gPSBOVUxMOw0KKyAgfQ0KK30NCitJRldMX1dpZGdldCogQ0ZXTF9XaWRnZXRNZ3I6Om5leHRUYWIoSUZXTF9XaWRnZXQqIHBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIGZvY3VzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRmluZCkgew0KKyAgSUZXTF9XaWRnZXQqIGNoaWxkID0NCisgICAgICBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChwYXJlbnQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChjaGlsZCkgew0KKyAgICBpZiAoZm9jdXMgPT0gY2hpbGQpIHsNCisgICAgICBiRmluZCA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKChjaGlsZC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfVGFiU3RvcCkgJiYNCisgICAgICAgICghZm9jdXMgfHwgKGZvY3VzICE9IGNoaWxkICYmIGJGaW5kKSkpIHsNCisgICAgICByZXR1cm4gY2hpbGQ7DQorICAgIH0NCisgICAgSUZXTF9XaWRnZXQqIGJSZXQgPSBuZXh0VGFiKGNoaWxkLCBmb2N1cywgYkZpbmQpOw0KKyAgICBpZiAoYlJldCkgew0KKyAgICAgIHJldHVybiBiUmV0Ow0KKyAgICB9DQorICAgIGNoaWxkID0gRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDRldMX1dpZGdldE1ncjo6Q291bnRSYWRpb0J1dHRvbkdyb3VwKElGV0xfV2lkZ2V0KiBwRmlyc3QpIHsNCisgIGludDMyX3QgaVJldCA9IDA7DQorICBJRldMX1dpZGdldCogcENoaWxkID0gcEZpcnN0Ow0KKyAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICBpZiAoKHBDaGlsZC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfR3JvdXApICYmDQorICAgICAgICBwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSAzODExMzA0NjkxKSB7DQorICAgICAgaVJldCsrOw0KKyAgICB9DQorICAgIHBDaGlsZCA9IEdldFdpZGdldChwQ2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICB9DQorICByZXR1cm4gaVJldDsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0TWdyOjpHZXRTaWJsaW5nUmFkaW9CdXR0b24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTmV4dCkgew0KKyAgd2hpbGUgKChwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBXaWRnZXQsIGJOZXh0ID8gRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xfV0dUUkVMQVRJT05fUHJpb3JTaWJsaW5nKSkgIT0NCisgICAgICAgICBOVUxMKSB7DQorICAgIGlmIChwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KKyAgICAgIHJldHVybiBwV2lkZ2V0Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0TWdyOjpHZXRSYWRpb0J1dHRvbkdyb3VwSGVhZGVyKA0KKyAgICBJRldMX1dpZGdldCogcFJhZGlvQnV0dG9uKSB7DQorICBpZiAocFJhZGlvQnV0dG9uLT5HZXRTdHlsZXMoKSAmIEZXTF9XR1RTVFlMRV9Hcm91cCkgew0KKyAgICByZXR1cm4gcFJhZGlvQnV0dG9uOw0KKyAgfQ0KKyAgSUZXTF9XaWRnZXQqIHBOZXh0ID0gcFJhZGlvQnV0dG9uOw0KKyAgd2hpbGUgKChwTmV4dCA9IEdldFNpYmxpbmdSYWRpb0J1dHRvbihwTmV4dCwgRkFMU0UpKSAhPSBOVUxMKSB7DQorICAgIGlmIChwTmV4dC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfR3JvdXApIHsNCisgICAgICByZXR1cm4gcE5leHQ7DQorICAgIH0NCisgIH0NCisgIHBOZXh0ID0gR2V0V2lkZ2V0KHBSYWRpb0J1dHRvbiwgRldMX1dHVFJFTEFUSU9OX0xhc3RTaWJsaW5nKTsNCisgIGlmICgocE5leHQtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0dyb3VwKSAmJg0KKyAgICAgIHBOZXh0LT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KKyAgICByZXR1cm4gcE5leHQ7DQorICB9DQorICB3aGlsZSAoKHBOZXh0ID0gR2V0U2libGluZ1JhZGlvQnV0dG9uKHBOZXh0LCBGQUxTRSkpICYmIHBOZXh0ICYmDQorICAgICAgICAgcE5leHQgIT0gcFJhZGlvQnV0dG9uKSB7DQorICAgIGlmIChwTmV4dC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfR3JvdXApIHsNCisgICAgICByZXR1cm4gcE5leHQ7DQorICAgIH0NCisgIH0NCisgIHBOZXh0ID0gR2V0V2lkZ2V0KHBSYWRpb0J1dHRvbiwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0U2libGluZyk7DQorICBpZiAocE5leHQgJiYgKHBOZXh0LT5HZXRTdHlsZXMoKSA9PSBGV0xfV0dUU1RZTEVfR3JvdXApICYmDQorICAgICAgcE5leHQtPkdldENsYXNzSUQoKSA9PSAzODExMzA0NjkxKSB7DQorICAgIHJldHVybiBwTmV4dDsNCisgIH0NCisgIHJldHVybiBHZXRTaWJsaW5nUmFkaW9CdXR0b24ocE5leHQsIFRSVUUpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0TWdyOjpHZXRTYW1lR3JvdXBSYWRpb0J1dHRvbihJRldMX1dpZGdldCogcFJhZGlvQnV0dG9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSYgZ3JvdXApIHsNCisgIElGV0xfV2lkZ2V0KiBwRmlyc3QgPSBHZXRXaWRnZXQocFJhZGlvQnV0dG9uLCBGV0xfV0dUUkVMQVRJT05fRmlyc3RTaWJsaW5nKTsNCisgIGlmICghcEZpcnN0KSB7DQorICAgIHBGaXJzdCA9IHBSYWRpb0J1dHRvbjsNCisgIH0NCisgIGludDMyX3QgaUdyb3VwID0gQ291bnRSYWRpb0J1dHRvbkdyb3VwKHBGaXJzdCk7DQorICBpZiAoaUdyb3VwIDwgMikgew0KKyAgICBpZiAocEZpcnN0LT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KKyAgICAgIGdyb3VwLkFkZChwRmlyc3QpOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0KiBwTmV4dCA9IHBGaXJzdDsNCisgICAgd2hpbGUgKChwTmV4dCA9IEdldFNpYmxpbmdSYWRpb0J1dHRvbihwTmV4dCwgVFJVRSkpICE9IE5VTEwpIHsNCisgICAgICBncm91cC5BZGQocE5leHQpOw0KKyAgICB9DQorICAgIHJldHVybjsNCisgIH0NCisgIElGV0xfV2lkZ2V0KiBwTmV4dCA9IEdldFJhZGlvQnV0dG9uR3JvdXBIZWFkZXIocFJhZGlvQnV0dG9uKTsNCisgIGRvIHsNCisgICAgZ3JvdXAuQWRkKHBOZXh0KTsNCisgICAgcE5leHQgPSBHZXRTaWJsaW5nUmFkaW9CdXR0b24ocE5leHQsIFRSVUUpOw0KKyAgICBpZiAoIXBOZXh0KSB7DQorICAgICAgaWYgKHBGaXJzdC0+R2V0Q2xhc3NJRCgpID09IDM4MTEzMDQ2OTEpIHsNCisgICAgICAgIHBOZXh0ID0gcEZpcnN0Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwTmV4dCA9IEdldFNpYmxpbmdSYWRpb0J1dHRvbihwRmlyc3QsIFRSVUUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSB3aGlsZSAocE5leHQgJiYgKChwTmV4dC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfR3JvdXApID09IDApKTsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0TWdyOjpHZXREZWZhdWx0QnV0dG9uKElGV0xfV2lkZ2V0KiBwUGFyZW50KSB7DQorICBpZiAoKHBQYXJlbnQtPkdldENsYXNzSUQoKSA9PSAzNTIxNjE0MjQ0KSAmJg0KKyAgICAgIChwUGFyZW50LT5HZXRTdGF0ZXMoKSAmICgxIDw8IChGV0xfV0dUU1RBVEVfTUFYICsgMikpKSkgew0KKyAgICByZXR1cm4gcFBhcmVudDsNCisgIH0NCisgIElGV0xfV2lkZ2V0KiBjaGlsZCA9DQorICAgICAgRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQocFBhcmVudCwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQpOw0KKyAgd2hpbGUgKGNoaWxkKSB7DQorICAgIGlmICgoY2hpbGQtPkdldENsYXNzSUQoKSA9PSAzNTIxNjE0MjQ0KSAmJg0KKyAgICAgICAgKGNoaWxkLT5HZXRTdGF0ZXMoKSAmICgxIDw8IChGV0xfV0dUU1RBVEVfTUFYICsgMikpKSkgew0KKyAgICAgIHJldHVybiBjaGlsZDsNCisgICAgfQ0KKyAgICBJRldMX1dpZGdldCogZmluZCA9IEdldERlZmF1bHRCdXR0b24oY2hpbGQpOw0KKyAgICBpZiAoZmluZCkgew0KKyAgICAgIHJldHVybiBmaW5kOw0KKyAgICB9DQorICAgIGNoaWxkID0gRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDRldMX1dpZGdldE1ncjo6QWRkUmVkcmF3Q291bnRzKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgIChwSXRlbS0+aVJlZHJhd0NvdW50ZXIpKys7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OlJlc2V0UmVkcmF3Q291bnRzKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgIHBJdGVtLT5pUmVkcmF3Q291bnRlciA9IDA7DQorfQ0KK0NGV0xfV2lkZ2V0TWdySXRlbSogQ0ZXTF9XaWRnZXRNZ3I6OkdldFdpZGdldE1nckl0ZW0oSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiAoQ0ZXTF9XaWRnZXRNZ3JJdGVtKiltX21hcFdpZGdldEl0ZW0uR2V0VmFsdWVBdChwV2lkZ2V0KTsNCit9DQoraW50MzJfdCBDRldMX1dpZGdldE1ncjo6VHJhdmVsV2lkZ2V0TWdyKENGV0xfV2lkZ2V0TWdySXRlbSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcEluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCoqIHBXaWRnZXQpIHsNCisgIGlmICghcFBhcmVudCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcENoaWxkID0gcFBhcmVudC0+cENoaWxkOw0KKyAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICBpQ291bnQrKzsNCisgICAgaWYgKHBJbmRleCkgew0KKyAgICAgIGlmICgqcEluZGV4ID09IDApIHsNCisgICAgICAgICpwV2lkZ2V0ID0gcENoaWxkLT5wV2lkZ2V0Ow0KKyAgICAgICAgcmV0dXJuIGlDb3VudDsNCisgICAgICB9DQorICAgICAgcEluZGV4LS07DQorICAgIH0NCisgICAgaWYgKHBJdGVtICYmIHBJdGVtID09IHBDaGlsZCkgew0KKyAgICAgIHJldHVybiBpQ291bnQgLSAxOw0KKyAgICB9DQorICAgIHBDaGlsZCA9IHBDaGlsZC0+cE5leHQ7DQorICB9DQorICBpZiAocEluZGV4KSB7DQorICAgIHJldHVybiAwOw0KKyAgfSBlbHNlIGlmIChwSXRlbSkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICByZXR1cm4gaUNvdW50IC0gMTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6SXNBYmxlTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgIGlmICghcFdpZGdldC0+SXNJbnN0YW5jZShGWF9XU1RSQyhGV0xfQ0xBU1NfRm9ybSkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0RXT1JEIGR3U3R5bGVzID0gcFdpZGdldC0+R2V0U3R5bGVzKCk7DQorICByZXR1cm4gKChkd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9XaW5kb3dUeXBlTWFzaykgPT0NCisgICAgICAgICAgRldMX1dHVFNUWUxFX092ZXJMYXBwZXIpIHx8DQorICAgICAgICAgKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX1BvcHVwKTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6SXNUaHJlYWRFbmFibGVkKCkgew0KKyAgcmV0dXJuICEobV9kd0NhcGFiaWxpdHkgJiBGV0xfV0dUTUdSX0Rpc2FibGVUaHJlYWQpOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0TWdyOjpJc0Zvcm1EaXNhYmxlZCgpIHsNCisgIHJldHVybiBtX2R3Q2FwYWJpbGl0eSAmIEZXTF9XR1RNR1JfRGlzYWJsZUZvcm07DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRNZ3I6OkdldEFkYXB0ZXJQb3B1cFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKSB7DQorICBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIHBTREFwYXB0ZXIgPSBHZXRBZGFwdGVyV2lkZ2V0TWdyKCk7DQorICByZXR1cm4gcFNEQXBhcHRlci0+R2V0UG9wdXBQb3MocFdpZGdldCwgZk1pbkhlaWdodCwgZk1heEhlaWdodCwgcnRBbmNob3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRQb3B1cCk7DQorfQ0KK0NGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6OkNGV0xfV2lkZ2V0TWdyRGVsZWdhdGUoQ0ZXTF9XaWRnZXRNZ3IqIHBXaWRnZXRNZ3IpDQorICAgIDogbV9wV2lkZ2V0TWdyKHBXaWRnZXRNZ3IpIHt9DQorRldMX0VSUiBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpPblNldENhcGFiaWxpdHkoRlhfRFdPUkQgZHdDYXBhYmlsaXR5KSB7DQorICBtX3BXaWRnZXRNZ3ItPm1fZHdDYXBhYmlsaXR5ID0gZHdDYXBhYmlsaXR5Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2VUb0Zvcm0oQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwTWVzc2FnZSwgMCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBNZXNzYWdlLT5tX3BEc3RUYXJnZXQsIDApOw0KKyAgSUZXTF9XaWRnZXQqIHBEc3RXaWRnZXQgPSAoSUZXTF9XaWRnZXQqKXBNZXNzYWdlLT5tX3BEc3RUYXJnZXQ7DQorICBJRldMX05vdGVUaHJlYWQqIHBOb3RlVGhyZWFkID0gcERzdFdpZGdldC0+R2V0T3duZXJUaHJlYWQoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocE5vdGVUaHJlYWQsIDApOw0KKyAgQ0ZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBOb3RlVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBOb3RlRHJpdmVyLCAwKTsNCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzVGhyZWFkRW5hYmxlZCgpKSB7DQorICAgIHBNZXNzYWdlID0gKENGV0xfTWVzc2FnZSopcE1lc3NhZ2UtPkNsb25lKCk7DQorICB9DQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHBOb3RlRHJpdmVyLT5Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICB9IGVsc2Ugew0KKyAgICBwTm90ZURyaXZlci0+UXVldWVNZXNzYWdlKHBNZXNzYWdlKTsNCisgIH0NCisjaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pDQorICBDRldMX05vdGVMb29wKiBwVG9wTG9vcCA9IHBOb3RlRHJpdmVyLT5HZXRUb3BMb29wKCk7DQorICBpZiAocFRvcExvb3ApIHsNCisgICAgcE5vdGVEcml2ZXItPlVucXVldWVNZXNzYWdlKHBUb3BMb29wKTsNCisgIH0NCisjZW5kaWYNCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzVGhyZWFkRW5hYmxlZCgpKSB7DQorICAgIHBNZXNzYWdlLT5SZWxlYXNlKCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEdyYXBoaWNzLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgQ0ZYX0dyYXBoaWNzKiBwVGVtcCA9IERyYXdXaWRnZXRCZWZvcmUocFdpZGdldCwgcEdyYXBoaWNzLCBwTWF0cml4KTsNCisgIENGWF9SZWN0RiBjbGlwQ29weTsNCisgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QoY2xpcENvcHkpOw0KKyAgY2xpcENvcHkubGVmdCA9IGNsaXBDb3B5LnRvcCA9IDA7DQorICBpZiAoYlVzZU9mZnNjcmVlbkRpcmVjdChwV2lkZ2V0KSkgew0KKyAgICBEcmF3V2lkZ2V0QWZ0ZXIocFdpZGdldCwgcEdyYXBoaWNzLCBjbGlwQ29weSwgcE1hdHJpeCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIENGWF9SZWN0RiBjbGlwQm91bmRzOw0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8pIHx8IChfRlhfT1NfID09IF9GWF9XSU42NF8pIHx8IFwNCisgICAgKF9GWF9PU18gPT0gX0ZYX0xJTlVYX0RFU0tUT1BfKSB8fCAoX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8pDQorICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUgPSBwV2lkZ2V0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgIHBEZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBUZW1wLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+R2V0Q2xpcFJlY3QoY2xpcEJvdW5kcyk7DQorICBjbGlwQ29weSA9IGNsaXBCb3VuZHM7DQorI2VsaWYoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXykNCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gcFdpZGdldC0+U2V0RGVsZWdhdGUoTlVMTCk7DQogICAgIHBEZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBUZW1wLCBwTWF0cml4KTsNCiAgICAgcEdyYXBoaWNzLT5HZXRDbGlwUmVjdChjbGlwQm91bmRzKTsNCiAgICAgY2xpcENvcHkgPSBjbGlwQm91bmRzOw0KLSNlbGlmIChfRlhfT1NfPT1fRlhfTUFDT1NYXykNCi0gICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gcFdpZGdldC0+U2V0RGVsZWdhdGUoTlVMTCk7DQotICAgICAgICBwRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwVGVtcCwgcE1hdHJpeCk7DQotICAgICAgICBwR3JhcGhpY3MtPkdldENsaXBSZWN0KGNsaXBCb3VuZHMpOw0KLSAgICAgICAgY2xpcENvcHkgPSBjbGlwQm91bmRzOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgY2xpcEJvdW5kcy5TZXQocE1hdHJpeC0+YSwgcE1hdHJpeC0+YiwgcE1hdHJpeC0+YywgcE1hdHJpeC0+ZCk7DQotICAgICAgICAoKENGWF9NYXRyaXgqKXBNYXRyaXgpLT5SZXNldCgpOw0KKyAgfSBlbHNlIHsNCisgICAgY2xpcEJvdW5kcy5TZXQocE1hdHJpeC0+YSwgcE1hdHJpeC0+YiwgcE1hdHJpeC0+YywgcE1hdHJpeC0+ZCk7DQorICAgICgoQ0ZYX01hdHJpeCopcE1hdHJpeCktPlJlc2V0KCk7DQogI2lmZGVmIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXINCiAjZWxzZQ0KICNlbmRpZg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUgKnBEZWxlZ2F0ZSA9IHBXaWRnZXQtPlNldERlbGVnYXRlKE5VTEwpOw0KLSAgICAgICAgICAgIHBEZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBUZW1wLCBwTWF0cml4KTsNCi0gICAgICAgIH0NCisgICAgew0KKyAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBXaWRnZXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgIHBEZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBUZW1wLCBwTWF0cml4KTsNCiAgICAgfQ0KKyAgfQ0KICNlbmRpZg0KLSAgICBpZiAoIW1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0Q2xpZW50Ow0KLSAgICAgICAgcFdpZGdldC0+R2V0Q2xpZW50UmVjdChydENsaWVudCk7DQotICAgICAgICBjbGlwQm91bmRzLkludGVyc2VjdChydENsaWVudCk7DQotICAgIH0NCi0gICAgaWYgKCFjbGlwQm91bmRzLklzRW1wdHkoKSkgew0KLSAgICAgICAgRHJhd0NoaWxkKHBXaWRnZXQsIGNsaXBCb3VuZHMsIHBUZW1wLCBwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBEcmF3V2lkZ2V0QWZ0ZXIocFdpZGdldCwgcEdyYXBoaWNzLCBjbGlwQ29weSwgcE1hdHJpeCk7DQotICAgIG1fcFdpZGdldE1nci0+UmVzZXRSZWRyYXdDb3VudHMocFdpZGdldCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIGlmICghbV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIENGWF9SZWN0RiBydENsaWVudDsNCisgICAgcFdpZGdldC0+R2V0Q2xpZW50UmVjdChydENsaWVudCk7DQorICAgIGNsaXBCb3VuZHMuSW50ZXJzZWN0KHJ0Q2xpZW50KTsNCisgIH0NCisgIGlmICghY2xpcEJvdW5kcy5Jc0VtcHR5KCkpIHsNCisgICAgRHJhd0NoaWxkKHBXaWRnZXQsIGNsaXBCb3VuZHMsIHBUZW1wLCBwTWF0cml4KTsNCisgIH0NCisgIERyYXdXaWRnZXRBZnRlcihwV2lkZ2V0LCBwR3JhcGhpY3MsIGNsaXBDb3B5LCBwTWF0cml4KTsNCisgIG1fcFdpZGdldE1nci0+UmVzZXRSZWRyYXdDb3VudHMocFdpZGdldCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLXZvaWQgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTo6RHJhd0NoaWxkKElGV0xfV2lkZ2V0KgkgIHBhcmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmCXJ0Q2xpcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqCSBwR3JhcGhpY3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCApDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBhcmVudCk7DQotICAgIEZYX0JPT0wgYkZvcm1EaXNhYmxlID0gbV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpOw0KLSAgICBJRldMX1dpZGdldCogcE5leHRDaGlsZCA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KHBhcmVudCwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQpOw0KLSAgICB3aGlsZSAocE5leHRDaGlsZCkgew0KLSAgICAgICAgSUZXTF9XaWRnZXQqIGNoaWxkID0gcE5leHRDaGlsZDsNCi0gICAgICAgIHBOZXh0Q2hpbGQgPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCi0gICAgICAgIGlmIChjaGlsZC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDRlhfUmVjdEYJcnRXaWRnZXQ7DQotICAgICAgICBjaGlsZC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQotICAgICAgICBpZiAocnRXaWRnZXQuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDRlhfTWF0cml4CXdpZGdldE1hdHJpeDsNCi0gICAgICAgIENGWF9SZWN0RiBjbGlwQm91bmRzKHJ0V2lkZ2V0KTsNCi0gICAgICAgIGlmKCFiRm9ybURpc2FibGUpIHsNCi0gICAgICAgICAgICBjaGlsZC0+R2V0TWF0cml4KHdpZGdldE1hdHJpeCwgVFJVRSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgICAgIHdpZGdldE1hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiRm9ybURpc2FibGUpIHsNCi0gICAgICAgICAgICB3aWRnZXRNYXRyaXguVHJhbnNmb3JtUG9pbnQoY2xpcEJvdW5kcy5sZWZ0LCBjbGlwQm91bmRzLnRvcCk7DQotICAgICAgICAgICAgY2xpcEJvdW5kcy5JbnRlcnNlY3QocnRDbGlwKTsNCi0gICAgICAgICAgICBpZiAoY2xpcEJvdW5kcy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgICAgICAgICBwR3JhcGhpY3MtPlNldENsaXBSZWN0KGNsaXBCb3VuZHMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2lkZ2V0TWF0cml4LlRyYW5zbGF0ZShydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIFRSVUUpOw0KLSAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlID0gY2hpbGQtPlNldERlbGVnYXRlKE5VTEwpOw0KLSAgICAgICAgaWYgKHBEZWxlZ2F0ZSkgew0KLSAgICAgICAgICAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkgfHwgSXNOZWVkUmVwYWludChjaGlsZCwgJndpZGdldE1hdHJpeCwgcnRDbGlwKSkgew0KLSAgICAgICAgICAgICAgICBwRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsICZ3aWRnZXRNYXRyaXgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYkZvcm1EaXNhYmxlKSB7DQotICAgICAgICAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRHJhd0NoaWxkKGNoaWxkLCBjbGlwQm91bmRzLCBwR3JhcGhpY3MsIGJGb3JtRGlzYWJsZSA/ICZ3aWRnZXRNYXRyaXggOiBwTWF0cml4KTsNCi0gICAgICAgIGNoaWxkID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQotICAgIH0NCi19DQotQ0ZYX0dyYXBoaWNzKiBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpEcmF3V2lkZ2V0QmVmb3JlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIGlmICghRldMX1VzZU9mZnNjcmVlbihwV2lkZ2V0KSkgew0KLSAgICAgICAgcmV0dXJuIHBHcmFwaGljczsNCi0gICAgfQ0KLSAgICBDRldMX1dpZGdldE1nckl0ZW0gKnBJdGVtID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KLSAgICBpZiAoIXBJdGVtLT5wT2Zmc2NyZWVuKSB7DQotICAgICAgICBwSXRlbS0+cE9mZnNjcmVlbiA9IEZYX05FVyBDRlhfR3JhcGhpY3M7DQotICAgICAgICBDRlhfUmVjdEYgcmVjdDsNCi0gICAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocmVjdCk7DQotICAgICAgICBwSXRlbS0+cE9mZnNjcmVlbi0+Q3JlYXRlKChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0LCBGWERJQl9BcmdiKTsNCi0gICAgfQ0KLSAgICBDRlhfUmVjdEYgcmVjdDsNCi0gICAgcEdyYXBoaWNzLT5HZXRDbGlwUmVjdChyZWN0KTsNCi0gICAgcEl0ZW0tPnBPZmZzY3JlZW4tPlNldENsaXBSZWN0KHJlY3QpOw0KLSAgICByZXR1cm4gcEl0ZW0tPnBPZmZzY3JlZW47DQotfQ0KLXZvaWQgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTo6RHJhd1dpZGdldEFmdGVyKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgQ0ZYX1JlY3RGICZydENsaXAsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBpZiAoRldMX1VzZU9mZnNjcmVlbihwV2lkZ2V0KSkgew0KLSAgICAgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwSXRlbSA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCi0gICAgICAgIHBHcmFwaGljcy0+VHJhbnNmZXIocEl0ZW0tPnBPZmZzY3JlZW4sIHJ0Q2xpcC5sZWZ0LCBydENsaXAudG9wLCBydENsaXAsIChDRlhfTWF0cml4KilwTWF0cml4KTsNCi0jaWZkZWYgX1dJTjMyDQotICAgICAgICBwSXRlbS0+cE9mZnNjcmVlbi0+Q2xlYXJDbGlwKCk7DQotI2VuZGlmDQotICAgIH0NCi0gICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwSXRlbSA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCi0gICAgcEl0ZW0tPmlSZWRyYXdDb3VudGVyID0gMDsNCi19DQotI2RlZmluZSBGV0xfTkVFRFJFUEFJTlRISVRfUG9pbnQJMTINCi0jZGVmaW5lIEZXTF9ORUVEUkVQQUlOVEhJVF9QaWVjZQkzDQotdHlwZWRlZiBzdHJ1Y3QgX0ZXTF9OZWVkUmVwYWludEhpdERhdGEgew0KLSAgICBDRlhfUG9pbnRGIGhpdFBvaW50Ow0KLSAgICBGWF9CT09MIGJOb3ROZWVkUmVwYWludDsNCi0gICAgRlhfQk9PTCBiTm90Q29udGFpbkJ5RGlydHk7DQotfSBGV0xfTmVlZFJlcGFpbnRIaXREYXRhOw0KLUZYX0JPT0wgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTo6SXNOZWVkUmVwYWludChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgY29uc3QgQ0ZYX1JlY3RGICZydERpcnR5KQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICogcEl0ZW0gPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQotICAgIGlmIChwSXRlbSAmJiBwSXRlbS0+aVJlZHJhd0NvdW50ZXIgPiAwKSB7DQotICAgICAgICBwSXRlbS0+aVJlZHJhd0NvdW50ZXIgPSAwOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQordm9pZCBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpEcmF3Q2hpbGQoSUZXTF9XaWRnZXQqIHBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBhcmVudCk7DQorICBGWF9CT09MIGJGb3JtRGlzYWJsZSA9IG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKTsNCisgIElGV0xfV2lkZ2V0KiBwTmV4dENoaWxkID0NCisgICAgICBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChwYXJlbnQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChwTmV4dENoaWxkKSB7DQorICAgIElGV0xfV2lkZ2V0KiBjaGlsZCA9IHBOZXh0Q2hpbGQ7DQorICAgIHBOZXh0Q2hpbGQgPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCisgICAgaWYgKGNoaWxkLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KICAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQotICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KLSAgICBydFdpZGdldC5sZWZ0ID0gcnRXaWRnZXQudG9wID0gMDsNCi0gICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydFdpZGdldCk7DQotICAgIGlmICghcnRXaWRnZXQuSW50ZXJzZWN0V2l0aChydERpcnR5KSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICBjaGlsZC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICAgIGlmIChydFdpZGdldC5Jc0VtcHR5KCkpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBJRldMX1dpZGdldCAqIHBDaGlsZCA9IEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KHBXaWRnZXQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCi0gICAgaWYgKCFwQ2hpbGQpIHsNCisgICAgQ0ZYX01hdHJpeCB3aWRnZXRNYXRyaXg7DQorICAgIENGWF9SZWN0RiBjbGlwQm91bmRzKHJ0V2lkZ2V0KTsNCisgICAgaWYgKCFiRm9ybURpc2FibGUpIHsNCisgICAgICBjaGlsZC0+R2V0TWF0cml4KHdpZGdldE1hdHJpeCwgVFJVRSk7DQorICAgIH0NCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICB3aWRnZXRNYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBpZiAoIWJGb3JtRGlzYWJsZSkgew0KKyAgICAgIHdpZGdldE1hdHJpeC5UcmFuc2Zvcm1Qb2ludChjbGlwQm91bmRzLmxlZnQsIGNsaXBCb3VuZHMudG9wKTsNCisgICAgICBjbGlwQm91bmRzLkludGVyc2VjdChydENsaXApOw0KKyAgICAgIGlmIChjbGlwQm91bmRzLklzRW1wdHkoKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgICBwR3JhcGhpY3MtPlNldENsaXBSZWN0KGNsaXBCb3VuZHMpOw0KKyAgICB9DQorICAgIHdpZGdldE1hdHJpeC5UcmFuc2xhdGUocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBUUlVFKTsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gY2hpbGQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBpZiAocERlbGVnYXRlKSB7DQorICAgICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSB8fA0KKyAgICAgICAgICBJc05lZWRSZXBhaW50KGNoaWxkLCAmd2lkZ2V0TWF0cml4LCBydENsaXApKSB7DQorICAgICAgICBwRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsICZ3aWRnZXRNYXRyaXgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJGb3JtRGlzYWJsZSkgew0KKyAgICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgfQ0KKyAgICBEcmF3Q2hpbGQoY2hpbGQsIGNsaXBCb3VuZHMsIHBHcmFwaGljcywNCisgICAgICAgICAgICAgIGJGb3JtRGlzYWJsZSA/ICZ3aWRnZXRNYXRyaXggOiBwTWF0cml4KTsNCisgICAgY2hpbGQgPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCisgIH0NCit9DQorQ0ZYX0dyYXBoaWNzKiBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpEcmF3V2lkZ2V0QmVmb3JlKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghRldMX1VzZU9mZnNjcmVlbihwV2lkZ2V0KSkgew0KKyAgICByZXR1cm4gcEdyYXBoaWNzOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgIGlmICghcEl0ZW0tPnBPZmZzY3JlZW4pIHsNCisgICAgcEl0ZW0tPnBPZmZzY3JlZW4gPSBGWF9ORVcgQ0ZYX0dyYXBoaWNzOw0KKyAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgcEl0ZW0tPnBPZmZzY3JlZW4tPkNyZWF0ZSgoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9BcmdiKTsNCisgIH0NCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgcEdyYXBoaWNzLT5HZXRDbGlwUmVjdChyZWN0KTsNCisgIHBJdGVtLT5wT2Zmc2NyZWVuLT5TZXRDbGlwUmVjdChyZWN0KTsNCisgIHJldHVybiBwSXRlbS0+cE9mZnNjcmVlbjsNCit9DQordm9pZCBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpEcmF3V2lkZ2V0QWZ0ZXIoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydENsaXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKEZXTF9Vc2VPZmZzY3JlZW4ocFdpZGdldCkpIHsNCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgICAgcEdyYXBoaWNzLT5UcmFuc2ZlcihwSXRlbS0+cE9mZnNjcmVlbiwgcnRDbGlwLmxlZnQsIHJ0Q2xpcC50b3AsIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX01hdHJpeCopcE1hdHJpeCk7DQorI2lmZGVmIF9XSU4zMg0KKyAgICBwSXRlbS0+cE9mZnNjcmVlbi0+Q2xlYXJDbGlwKCk7DQorI2VuZGlmDQorICB9DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgcEl0ZW0tPmlSZWRyYXdDb3VudGVyID0gMDsNCit9DQorI2RlZmluZSBGV0xfTkVFRFJFUEFJTlRISVRfUG9pbnQgMTINCisjZGVmaW5lIEZXTF9ORUVEUkVQQUlOVEhJVF9QaWVjZSAzDQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9OZWVkUmVwYWludEhpdERhdGEgew0KKyAgQ0ZYX1BvaW50RiBoaXRQb2ludDsNCisgIEZYX0JPT0wgYk5vdE5lZWRSZXBhaW50Ow0KKyAgRlhfQk9PTCBiTm90Q29udGFpbkJ5RGlydHk7DQorfSBGV0xfTmVlZFJlcGFpbnRIaXREYXRhOw0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTo6SXNOZWVkUmVwYWludChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydERpcnR5KSB7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgaWYgKHBJdGVtICYmIHBJdGVtLT5pUmVkcmF3Q291bnRlciA+IDApIHsNCisgICAgcEl0ZW0tPmlSZWRyYXdDb3VudGVyID0gMDsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgIHJ0V2lkZ2V0LmxlZnQgPSBydFdpZGdldC50b3AgPSAwOw0KKyAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydFdpZGdldCk7DQorICBpZiAoIXJ0V2lkZ2V0LkludGVyc2VjdFdpdGgocnREaXJ0eSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSUZXTF9XaWRnZXQqIHBDaGlsZCA9DQorICAgICAgRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQocFdpZGdldCwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQpOw0KKyAgaWYgKCFwQ2hpbGQpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAocENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gMzE1MDI5ODY3MCkgew0KKyAgICBDRlhfUmVjdEYgcnRUZW1wOw0KKyAgICBwQ2hpbGQtPkdldFdpZGdldFJlY3QocnRUZW1wKTsNCisgICAgaWYgKHJ0VGVtcC53aWR0aCA+PSBydFdpZGdldC53aWR0aCAmJiBydFRlbXAuaGVpZ2h0ID49IHJ0V2lkZ2V0LmhlaWdodCkgew0KKyAgICAgIHBDaGlsZCA9DQorICAgICAgICAgIEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KHBDaGlsZCwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQpOw0KKyAgICAgIGlmICghcENoaWxkKSB7DQogICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKHBDaGlsZC0+R2V0Q2xhc3NJRCgpID09IDMxNTAyOTg2NzApIHsNCi0gICAgICAgIENGWF9SZWN0RiBydFRlbXA7DQotICAgICAgICBwQ2hpbGQtPkdldFdpZGdldFJlY3QocnRUZW1wKTsNCi0gICAgICAgIGlmIChydFRlbXAud2lkdGggPj0gcnRXaWRnZXQud2lkdGggJiYgcnRUZW1wLmhlaWdodCA+PSBydFdpZGdldC5oZWlnaHQpIHsNCi0gICAgICAgICAgICBwQ2hpbGQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChwQ2hpbGQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCi0gICAgICAgICAgICBpZiAoIXBDaGlsZCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICB9DQorICBDRlhfUmVjdEYgcnRDaGlsZHM7DQorICBydENoaWxkcy5FbXB0eSgpOw0KKyAgRlhfQk9PTCBiQ2hpbGRJbnRlcnNlY3RXaXRoRGlydHkgPSBGQUxTRTsNCisgIEZYX0JPT0wgYk9yZ2luUHRJbnRlcnNlY3RXaWR0aENoaWxkID0gRkFMU0U7DQorICBGWF9CT09MIGJPcmdpblB0SW50ZXJzZWN0V2lkdGhEaXJ0eSA9DQorICAgICAgcnREaXJ0eS5Db250YWlucyhydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3ApOw0KKyAgc3RhdGljIEZXTF9OZWVkUmVwYWludEhpdERhdGEgaGl0UG9pbnRbRldMX05FRURSRVBBSU5USElUX1BvaW50XTsNCisgIHN0YXRpYyBpbnQzMl90IGlTaXplID0gc2l6ZW9mKEZXTF9OZWVkUmVwYWludEhpdERhdGEpOw0KKyAgRlhTWVNfbWVtc2V0KGhpdFBvaW50LCAwLCBpU2l6ZSk7DQorICBGWF9GTE9BVCBmeFBpZWNlID0gcnRXaWRnZXQud2lkdGggLyBGV0xfTkVFRFJFUEFJTlRISVRfUGllY2U7DQorICBGWF9GTE9BVCBmeVBpZWNlID0gcnRXaWRnZXQuaGVpZ2h0IC8gRldMX05FRURSRVBBSU5USElUX1BpZWNlOw0KKyAgaGl0UG9pbnRbMl0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzZdLmhpdFBvaW50LnggPSBydFdpZGdldC5sZWZ0Ow0KKyAgaGl0UG9pbnRbMF0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzNdLmhpdFBvaW50LnggPSBoaXRQb2ludFs3XS5oaXRQb2ludC54ID0NCisgICAgICBoaXRQb2ludFsxMF0uaGl0UG9pbnQueCA9IGZ4UGllY2UgKyBydFdpZGdldC5sZWZ0Ow0KKyAgaGl0UG9pbnRbMV0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzRdLmhpdFBvaW50LnggPSBoaXRQb2ludFs4XS5oaXRQb2ludC54ID0NCisgICAgICBoaXRQb2ludFsxMV0uaGl0UG9pbnQueCA9IGZ4UGllY2UgKiAyICsgcnRXaWRnZXQubGVmdDsNCisgIGhpdFBvaW50WzVdLmhpdFBvaW50LnggPSBoaXRQb2ludFs5XS5oaXRQb2ludC54ID0NCisgICAgICBydFdpZGdldC53aWR0aCArIHJ0V2lkZ2V0LmxlZnQ7DQorICBoaXRQb2ludFswXS5oaXRQb2ludC55ID0gaGl0UG9pbnRbMV0uaGl0UG9pbnQueSA9IHJ0V2lkZ2V0LnRvcDsNCisgIGhpdFBvaW50WzJdLmhpdFBvaW50LnkgPSBoaXRQb2ludFszXS5oaXRQb2ludC55ID0gaGl0UG9pbnRbNF0uaGl0UG9pbnQueSA9DQorICAgICAgaGl0UG9pbnRbNV0uaGl0UG9pbnQueSA9IGZ5UGllY2UgKyBydFdpZGdldC50b3A7DQorICBoaXRQb2ludFs2XS5oaXRQb2ludC55ID0gaGl0UG9pbnRbN10uaGl0UG9pbnQueSA9IGhpdFBvaW50WzhdLmhpdFBvaW50LnkgPQ0KKyAgICAgIGhpdFBvaW50WzldLmhpdFBvaW50LnkgPSBmeVBpZWNlICogMiArIHJ0V2lkZ2V0LnRvcDsNCisgIGhpdFBvaW50WzEwXS5oaXRQb2ludC55ID0gaGl0UG9pbnRbMTFdLmhpdFBvaW50LnkgPQ0KKyAgICAgIHJ0V2lkZ2V0LmhlaWdodCArIHJ0V2lkZ2V0LnRvcDsNCisgIGRvIHsNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIHBDaGlsZC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgQ0ZYX1JlY3RGIHIgPSByZWN0Ow0KKyAgICByLmxlZnQgKz0gcnRXaWRnZXQubGVmdDsNCisgICAgci50b3AgKz0gcnRXaWRnZXQudG9wOw0KKyAgICBpZiAoci5Jc0VtcHR5KCkpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBDRlhfUmVjdEYgcnRDaGlsZHM7DQotICAgIHJ0Q2hpbGRzLkVtcHR5KCk7DQotICAgIEZYX0JPT0wgYkNoaWxkSW50ZXJzZWN0V2l0aERpcnR5ID0gRkFMU0U7DQotICAgIEZYX0JPT0wgYk9yZ2luUHRJbnRlcnNlY3RXaWR0aENoaWxkID0gRkFMU0U7DQotICAgIEZYX0JPT0wgYk9yZ2luUHRJbnRlcnNlY3RXaWR0aERpcnR5ID0gcnREaXJ0eS5Db250YWlucyhydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3ApOw0KLSAgICBzdGF0aWMgRldMX05lZWRSZXBhaW50SGl0RGF0YSBoaXRQb2ludFtGV0xfTkVFRFJFUEFJTlRISVRfUG9pbnRdOw0KLSAgICBzdGF0aWMgaW50MzJfdCBpU2l6ZSA9IHNpemVvZihGV0xfTmVlZFJlcGFpbnRIaXREYXRhKTsNCi0gICAgRlhTWVNfbWVtc2V0KGhpdFBvaW50LCAwLCBpU2l6ZSk7DQotICAgIEZYX0ZMT0FUIGZ4UGllY2UgPSBydFdpZGdldC53aWR0aCAvIEZXTF9ORUVEUkVQQUlOVEhJVF9QaWVjZTsNCi0gICAgRlhfRkxPQVQgZnlQaWVjZSA9IHJ0V2lkZ2V0LmhlaWdodCAvIEZXTF9ORUVEUkVQQUlOVEhJVF9QaWVjZTsNCi0gICAgaGl0UG9pbnRbMl0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzZdLmhpdFBvaW50LnggPSBydFdpZGdldC5sZWZ0Ow0KLSAgICBoaXRQb2ludFswXS5oaXRQb2ludC54ID0gaGl0UG9pbnRbM10uaGl0UG9pbnQueCA9IGhpdFBvaW50WzddLmhpdFBvaW50LnggPSBoaXRQb2ludFsxMF0uaGl0UG9pbnQueCA9IGZ4UGllY2UgKyBydFdpZGdldC5sZWZ0Ow0KLSAgICBoaXRQb2ludFsxXS5oaXRQb2ludC54ID0gaGl0UG9pbnRbNF0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzhdLmhpdFBvaW50LnggPSBoaXRQb2ludFsxMV0uaGl0UG9pbnQueCA9IGZ4UGllY2UgKiAyICsgcnRXaWRnZXQubGVmdDsNCi0gICAgaGl0UG9pbnRbNV0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzldLmhpdFBvaW50LnggPSBydFdpZGdldC53aWR0aCArIHJ0V2lkZ2V0LmxlZnQ7DQotICAgIGhpdFBvaW50WzBdLmhpdFBvaW50LnkgPSBoaXRQb2ludFsxXS5oaXRQb2ludC55ID0gcnRXaWRnZXQudG9wOw0KLSAgICBoaXRQb2ludFsyXS5oaXRQb2ludC55ID0gaGl0UG9pbnRbM10uaGl0UG9pbnQueSA9IGhpdFBvaW50WzRdLmhpdFBvaW50LnkgPSBoaXRQb2ludFs1XS5oaXRQb2ludC55ID0gZnlQaWVjZSArIHJ0V2lkZ2V0LnRvcDsNCi0gICAgaGl0UG9pbnRbNl0uaGl0UG9pbnQueSA9IGhpdFBvaW50WzddLmhpdFBvaW50LnkgPSBoaXRQb2ludFs4XS5oaXRQb2ludC55ID0gaGl0UG9pbnRbOV0uaGl0UG9pbnQueSA9IGZ5UGllY2UgKiAyICsgcnRXaWRnZXQudG9wOw0KLSAgICBoaXRQb2ludFsxMF0uaGl0UG9pbnQueSA9IGhpdFBvaW50WzExXS5oaXRQb2ludC55ID0gcnRXaWRnZXQuaGVpZ2h0ICsgcnRXaWRnZXQudG9wOw0KLSAgICBkbyB7DQotICAgICAgICBDRlhfUmVjdEYgcmVjdDsNCi0gICAgICAgIHBDaGlsZC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCi0gICAgICAgIENGWF9SZWN0RiByID0gcmVjdDsNCi0gICAgICAgIHIubGVmdCArPSBydFdpZGdldC5sZWZ0Ow0KLSAgICAgICAgci50b3AgKz0gcnRXaWRnZXQudG9wOw0KLSAgICAgICAgaWYgKHIuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoci5Db250YWlucyhydERpcnR5KSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYkNoaWxkSW50ZXJzZWN0V2l0aERpcnR5ICYmIHIuSW50ZXJzZWN0V2l0aChydERpcnR5KSkgew0KLSAgICAgICAgICAgIGJDaGlsZEludGVyc2VjdFdpdGhEaXJ0eSA9IFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYk9yZ2luUHRJbnRlcnNlY3RXaWR0aERpcnR5ICYmICFiT3JnaW5QdEludGVyc2VjdFdpZHRoQ2hpbGQpIHsNCi0gICAgICAgICAgICBiT3JnaW5QdEludGVyc2VjdFdpZHRoQ2hpbGQgPSByZWN0LkNvbnRhaW5zKDAsIDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHJ0Q2hpbGRzLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIHJ0Q2hpbGRzID0gcmVjdDsNCi0gICAgICAgIH0gZWxzZSBpZiAoIShwQ2hpbGQtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkpIHsNCi0gICAgICAgICAgICBydENoaWxkcy5VbmlvbihyZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IEZXTF9ORUVEUkVQQUlOVEhJVF9Qb2ludDsgaSArKykgew0KLSAgICAgICAgICAgIGlmIChoaXRQb2ludFtpXS5iTm90Q29udGFpbkJ5RGlydHkgfHwgaGl0UG9pbnRbaV0uYk5vdE5lZWRSZXBhaW50KSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIXJ0RGlydHkuQ29udGFpbnMoaGl0UG9pbnRbaV0uaGl0UG9pbnQpKSB7DQotICAgICAgICAgICAgICAgIGhpdFBvaW50W2ldLmJOb3RDb250YWluQnlEaXJ0eSA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoci5Db250YWlucyhoaXRQb2ludFtpXS5oaXRQb2ludCkpIHsNCi0gICAgICAgICAgICAgICAgaGl0UG9pbnRbaV0uYk5vdE5lZWRSZXBhaW50ID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKChwQ2hpbGQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChwQ2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZykpICE9IE5VTEwpOw0KLSAgICBpZiAoIWJDaGlsZEludGVyc2VjdFdpdGhEaXJ0eSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGlmIChyLkNvbnRhaW5zKHJ0RGlydHkpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICghYkNoaWxkSW50ZXJzZWN0V2l0aERpcnR5ICYmIHIuSW50ZXJzZWN0V2l0aChydERpcnR5KSkgew0KKyAgICAgIGJDaGlsZEludGVyc2VjdFdpdGhEaXJ0eSA9IFRSVUU7DQogICAgIH0NCiAgICAgaWYgKGJPcmdpblB0SW50ZXJzZWN0V2lkdGhEaXJ0eSAmJiAhYk9yZ2luUHRJbnRlcnNlY3RXaWR0aENoaWxkKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICBiT3JnaW5QdEludGVyc2VjdFdpZHRoQ2hpbGQgPSByZWN0LkNvbnRhaW5zKDAsIDApOw0KICAgICB9DQogICAgIGlmIChydENoaWxkcy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIHJ0Q2hpbGRzID0gcmVjdDsNCisgICAgfSBlbHNlIGlmICghKHBDaGlsZC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSkgew0KKyAgICAgIHJ0Q2hpbGRzLlVuaW9uKHJlY3QpOw0KICAgICB9DQotICAgIGludDMyX3QgcmVwYWludFBvaW50ID0gRldMX05FRURSRVBBSU5USElUX1BvaW50Ow0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBGV0xfTkVFRFJFUEFJTlRISVRfUG9pbnQ7IGkgKyspIHsNCi0gICAgICAgIGlmIChoaXRQb2ludFtpXS5iTm90TmVlZFJlcGFpbnQpIHsNCi0gICAgICAgICAgICByZXBhaW50UG9pbnQgLS07DQotICAgICAgICB9DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IEZXTF9ORUVEUkVQQUlOVEhJVF9Qb2ludDsgaSsrKSB7DQorICAgICAgaWYgKGhpdFBvaW50W2ldLmJOb3RDb250YWluQnlEaXJ0eSB8fCBoaXRQb2ludFtpXS5iTm90TmVlZFJlcGFpbnQpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoIXJ0RGlydHkuQ29udGFpbnMoaGl0UG9pbnRbaV0uaGl0UG9pbnQpKSB7DQorICAgICAgICBoaXRQb2ludFtpXS5iTm90Q29udGFpbkJ5RGlydHkgPSBUUlVFOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChyLkNvbnRhaW5zKGhpdFBvaW50W2ldLmhpdFBvaW50KSkgew0KKyAgICAgICAgaGl0UG9pbnRbaV0uYk5vdE5lZWRSZXBhaW50ID0gVFJVRTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKHJlcGFpbnRQb2ludCA+IDApIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRDaGlsZHMpOw0KLSAgICBpZiAocnRDaGlsZHMuQ29udGFpbnMocnREaXJ0eSkgfHwgcnRDaGlsZHMuQ29udGFpbnMocnRXaWRnZXQpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCisgIH0gd2hpbGUgKChwQ2hpbGQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldCgNCisgICAgICAgICAgICAgICAgcENoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpKSAhPSBOVUxMKTsNCisgIGlmICghYkNoaWxkSW50ZXJzZWN0V2l0aERpcnR5KSB7DQogICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJPcmdpblB0SW50ZXJzZWN0V2lkdGhEaXJ0eSAmJiAhYk9yZ2luUHRJbnRlcnNlY3RXaWR0aENoaWxkKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKHJ0Q2hpbGRzLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGludDMyX3QgcmVwYWludFBvaW50ID0gRldMX05FRURSRVBBSU5USElUX1BvaW50Ow0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgRldMX05FRURSRVBBSU5USElUX1BvaW50OyBpKyspIHsNCisgICAgaWYgKGhpdFBvaW50W2ldLmJOb3ROZWVkUmVwYWludCkgew0KKyAgICAgIHJlcGFpbnRQb2ludC0tOw0KKyAgICB9DQorICB9DQorICBpZiAocmVwYWludFBvaW50ID4gMCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRDaGlsZHMpOw0KKyAgaWYgKHJ0Q2hpbGRzLkNvbnRhaW5zKHJ0RGlydHkpIHx8IHJ0Q2hpbGRzLkNvbnRhaW5zKHJ0V2lkZ2V0KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpiVXNlT2Zmc2NyZWVuRGlyZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwSXRlbSA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCi0gICAgaWYgKCFGV0xfVXNlT2Zmc2NyZWVuKHBXaWRnZXQpIHx8ICEocEl0ZW0tPnBPZmZzY3JlZW4pKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0jaWYgKF9GWF9PU189PV9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU189PV9GWF9XSU42NF8pDQotICAgIGlmIChwSXRlbS0+Yk91dHNpZGVDaGFuZ2VkKSB7DQotICAgICAgICBDRlhfUmVjdEYgcjsNCi0gICAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3Qocik7DQotICAgICAgICBDRlhfUmVjdEYgdGVtcChtX3BXaWRnZXRNZ3ItPm1fcnRTY3JlZW4pOw0KLSAgICAgICAgdGVtcC5EZWZsYXRlKDUwLCA1MCk7DQotICAgICAgICBpZiAoIXRlbXAuQ29udGFpbnMocikpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBwSXRlbS0+Yk91dHNpZGVDaGFuZ2VkID0gRkFMU0U7DQotICAgIH0NCi0jZW5kaWYNCi0gICAgcmV0dXJuIHBJdGVtLT5pUmVkcmF3Q291bnRlciA9PSAwOw0KLX0NCi1zdGF0aWMgdm9pZCBGV0xfV3JpdGVCTVAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSkNCi17DQotICAgIEZJTEUqIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7DQotICAgIGlmIChmaWxlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQgc2l6ZSA9IDE0ICsgNDAgKyBwQml0bWFwLT5HZXRQaXRjaCgpICogcEJpdG1hcC0+R2V0SGVpZ2h0KCk7DQotICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzQwXTsNCi0gICAgYnVmZmVyWzBdID0gJ0InOw0KLSAgICBidWZmZXJbMV0gPSAnTSc7DQotICAgIGJ1ZmZlclsyXSA9ICh1bnNpZ25lZCBjaGFyKXNpemU7DQotICAgIGJ1ZmZlclszXSA9ICh1bnNpZ25lZCBjaGFyKShzaXplID4+IDgpOw0KLSAgICBidWZmZXJbNF0gPSAodW5zaWduZWQgY2hhcikoc2l6ZSA+PiAxNik7DQotICAgIGJ1ZmZlcls1XSA9ICh1bnNpZ25lZCBjaGFyKShzaXplID4+IDI0KTsNCi0gICAgYnVmZmVyWzZdID0gYnVmZmVyWzddID0gYnVmZmVyWzhdID0gYnVmZmVyWzldID0gMDsNCi0gICAgYnVmZmVyWzEwXSA9IDU0Ow0KLSAgICBidWZmZXJbMTFdID0gYnVmZmVyWzEyXSA9IGJ1ZmZlclsxM10gPSAwOw0KLSAgICBmd3JpdGUoYnVmZmVyLCAxNCwgMSwgZmlsZSk7DQotICAgIG1lbXNldChidWZmZXIsIDAsIDQwKTsNCi0gICAgYnVmZmVyWzBdID0gNDA7DQotICAgIGJ1ZmZlcls0XSA9ICh1bnNpZ25lZCBjaGFyKXBCaXRtYXAtPkdldFdpZHRoKCk7DQotICAgIGJ1ZmZlcls1XSA9ICh1bnNpZ25lZCBjaGFyKShwQml0bWFwLT5HZXRXaWR0aCgpID4+IDgpOw0KLSAgICBidWZmZXJbNl0gPSAodW5zaWduZWQgY2hhcikocEJpdG1hcC0+R2V0V2lkdGgoKSA+PiAxNik7DQotICAgIGJ1ZmZlcls3XSA9ICh1bnNpZ25lZCBjaGFyKShwQml0bWFwLT5HZXRXaWR0aCgpID4+IDI0KTsNCi0gICAgYnVmZmVyWzhdID0gKHVuc2lnbmVkIGNoYXIpKC1wQml0bWFwLT5HZXRIZWlnaHQoKSk7DQotICAgIGJ1ZmZlcls5XSA9ICh1bnNpZ25lZCBjaGFyKSgoLXBCaXRtYXAtPkdldEhlaWdodCgpKSA+PiA4KTsNCi0gICAgYnVmZmVyWzEwXSA9ICh1bnNpZ25lZCBjaGFyKSgoLXBCaXRtYXAtPkdldEhlaWdodCgpKSA+PiAxNik7DQotICAgIGJ1ZmZlclsxMV0gPSAodW5zaWduZWQgY2hhcikoKC1wQml0bWFwLT5HZXRIZWlnaHQoKSkgPj4gMjQpOw0KLSAgICBidWZmZXJbMTJdID0gMTsNCi0gICAgYnVmZmVyWzE0XSA9IHBCaXRtYXAtPkdldEJQUCgpOw0KLSAgICBmd3JpdGUoYnVmZmVyLCA0MCwgMSwgZmlsZSk7DQotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHBCaXRtYXAtPkdldEhlaWdodCgpOyByb3cgKyspIHsNCi0gICAgICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgcm93ICogcEJpdG1hcC0+R2V0UGl0Y2goKTsNCi0gICAgICAgIGZ3cml0ZShzY2FuX2xpbmUsIHBCaXRtYXAtPkdldFBpdGNoKCksIDEsIGZpbGUpOw0KLSAgICB9DQotICAgIGZjbG9zZShmaWxlKTsNCi19DQotRldMX0VSUiBGV0xfV2lkZ2V0TWdyU25hcHNob3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICpzYXZlRmlsZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQorRlhfQk9PTCBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpiVXNlT2Zmc2NyZWVuRGlyZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgaWYgKCFGV0xfVXNlT2Zmc2NyZWVuKHBXaWRnZXQpIHx8ICEocEl0ZW0tPnBPZmZzY3JlZW4pKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisjaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXyA9PSBfRlhfV0lONjRfKQ0KKyAgaWYgKHBJdGVtLT5iT3V0c2lkZUNoYW5nZWQpIHsNCiAgICAgQ0ZYX1JlY3RGIHI7DQogICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3Qocik7DQotICAgIENGWF9HcmFwaGljcyBnczsNCi0gICAgZ3MuQ3JlYXRlKChpbnQzMl90KXIud2lkdGgsIChpbnQzMl90KXIuaGVpZ2h0LCBGWERJQl9BcmdiKTsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3IgKndpZGdldE1nciA9IChDRldMX1dpZGdldE1nciopRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBDRldMX1dpZGdldE1nckRlbGVnYXRlICpkZWxlZ2F0ZSA9IHdpZGdldE1nci0+R2V0RGVsZWdhdGUoKTsNCi0gICAgZGVsZWdhdGUtPk9uRHJhd1dpZGdldChwV2lkZ2V0LCAmZ3MsIHBNYXRyaXgpOw0KLSAgICBDRlhfRElCaXRtYXAgKmRpYiA9IGdzLkdldFJlbmRlckRldmljZSgpLT5HZXRCaXRtYXAoKTsNCi0gICAgRldMX1dyaXRlQk1QKGRpYiwgc2F2ZUZpbGUtPlVURjhFbmNvZGUoKSk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgICAgQ0ZYX1JlY3RGIHRlbXAobV9wV2lkZ2V0TWdyLT5tX3J0U2NyZWVuKTsNCisgICAgdGVtcC5EZWZsYXRlKDUwLCA1MCk7DQorICAgIGlmICghdGVtcC5Db250YWlucyhyKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBwSXRlbS0+Yk91dHNpZGVDaGFuZ2VkID0gRkFMU0U7DQorICB9DQorI2VuZGlmDQorICByZXR1cm4gcEl0ZW0tPmlSZWRyYXdDb3VudGVyID09IDA7DQogfQ0KLUZYX0JPT0wgRldMX1dpZGdldElzQ2hpbGQoSUZXTF9XaWRnZXQgKnBhcmVudCwgSUZXTF9XaWRnZXQgKmZpbmQpDQotew0KLSAgICBpZiAoIWZpbmQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBJRldMX1dpZGdldCAqY2hpbGQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChwYXJlbnQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCi0gICAgd2hpbGUgKGNoaWxkKSB7DQotICAgICAgICBpZiAoY2hpbGQgPT0gZmluZCkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKEZXTF9XaWRnZXRJc0NoaWxkKGNoaWxkLCBmaW5kKSkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2hpbGQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCi0gICAgfQ0KK3N0YXRpYyB2b2lkIEZXTF9Xcml0ZUJNUChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lKSB7DQorICBGSUxFKiBmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOw0KKyAgaWYgKGZpbGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQgc2l6ZSA9IDE0ICsgNDAgKyBwQml0bWFwLT5HZXRQaXRjaCgpICogcEJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls0MF07DQorICBidWZmZXJbMF0gPSAnQic7DQorICBidWZmZXJbMV0gPSAnTSc7DQorICBidWZmZXJbMl0gPSAodW5zaWduZWQgY2hhcilzaXplOw0KKyAgYnVmZmVyWzNdID0gKHVuc2lnbmVkIGNoYXIpKHNpemUgPj4gOCk7DQorICBidWZmZXJbNF0gPSAodW5zaWduZWQgY2hhcikoc2l6ZSA+PiAxNik7DQorICBidWZmZXJbNV0gPSAodW5zaWduZWQgY2hhcikoc2l6ZSA+PiAyNCk7DQorICBidWZmZXJbNl0gPSBidWZmZXJbN10gPSBidWZmZXJbOF0gPSBidWZmZXJbOV0gPSAwOw0KKyAgYnVmZmVyWzEwXSA9IDU0Ow0KKyAgYnVmZmVyWzExXSA9IGJ1ZmZlclsxMl0gPSBidWZmZXJbMTNdID0gMDsNCisgIGZ3cml0ZShidWZmZXIsIDE0LCAxLCBmaWxlKTsNCisgIG1lbXNldChidWZmZXIsIDAsIDQwKTsNCisgIGJ1ZmZlclswXSA9IDQwOw0KKyAgYnVmZmVyWzRdID0gKHVuc2lnbmVkIGNoYXIpcEJpdG1hcC0+R2V0V2lkdGgoKTsNCisgIGJ1ZmZlcls1XSA9ICh1bnNpZ25lZCBjaGFyKShwQml0bWFwLT5HZXRXaWR0aCgpID4+IDgpOw0KKyAgYnVmZmVyWzZdID0gKHVuc2lnbmVkIGNoYXIpKHBCaXRtYXAtPkdldFdpZHRoKCkgPj4gMTYpOw0KKyAgYnVmZmVyWzddID0gKHVuc2lnbmVkIGNoYXIpKHBCaXRtYXAtPkdldFdpZHRoKCkgPj4gMjQpOw0KKyAgYnVmZmVyWzhdID0gKHVuc2lnbmVkIGNoYXIpKC1wQml0bWFwLT5HZXRIZWlnaHQoKSk7DQorICBidWZmZXJbOV0gPSAodW5zaWduZWQgY2hhcikoKC1wQml0bWFwLT5HZXRIZWlnaHQoKSkgPj4gOCk7DQorICBidWZmZXJbMTBdID0gKHVuc2lnbmVkIGNoYXIpKCgtcEJpdG1hcC0+R2V0SGVpZ2h0KCkpID4+IDE2KTsNCisgIGJ1ZmZlclsxMV0gPSAodW5zaWduZWQgY2hhcikoKC1wQml0bWFwLT5HZXRIZWlnaHQoKSkgPj4gMjQpOw0KKyAgYnVmZmVyWzEyXSA9IDE7DQorICBidWZmZXJbMTRdID0gcEJpdG1hcC0+R2V0QlBQKCk7DQorICBmd3JpdGUoYnVmZmVyLCA0MCwgMSwgZmlsZSk7DQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwQml0bWFwLT5HZXRIZWlnaHQoKTsgcm93KyspIHsNCisgICAgdWludDhfdCogc2Nhbl9saW5lID0gcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyByb3cgKiBwQml0bWFwLT5HZXRQaXRjaCgpOw0KKyAgICBmd3JpdGUoc2Nhbl9saW5lLCBwQml0bWFwLT5HZXRQaXRjaCgpLCAxLCBmaWxlKTsNCisgIH0NCisgIGZjbG9zZShmaWxlKTsNCit9DQorRldMX0VSUiBGV0xfV2lkZ2V0TWdyU25hcHNob3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHNhdmVGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9SZWN0RiByOw0KKyAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChyKTsNCisgIENGWF9HcmFwaGljcyBnczsNCisgIGdzLkNyZWF0ZSgoaW50MzJfdClyLndpZHRoLCAoaW50MzJfdClyLmhlaWdodCwgRlhESUJfQXJnYik7DQorICBDRldMX1dpZGdldE1nciogd2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICBDRldMX1dpZGdldE1nckRlbGVnYXRlKiBkZWxlZ2F0ZSA9IHdpZGdldE1nci0+R2V0RGVsZWdhdGUoKTsNCisgIGRlbGVnYXRlLT5PbkRyYXdXaWRnZXQocFdpZGdldCwgJmdzLCBwTWF0cml4KTsNCisgIENGWF9ESUJpdG1hcCogZGliID0gZ3MuR2V0UmVuZGVyRGV2aWNlKCktPkdldEJpdG1hcCgpOw0KKyAgRldMX1dyaXRlQk1QKGRpYiwgc2F2ZUZpbGUtPlVURjhFbmNvZGUoKSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgRldMX1dpZGdldElzQ2hpbGQoSUZXTF9XaWRnZXQqIHBhcmVudCwgSUZXTF9XaWRnZXQqIGZpbmQpIHsNCisgIGlmICghZmluZCkgew0KICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRldMX1dpZGdldCogY2hpbGQgPQ0KKyAgICAgIEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KHBhcmVudCwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQpOw0KKyAgd2hpbGUgKGNoaWxkKSB7DQorICAgIGlmIChjaGlsZCA9PSBmaW5kKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYgKEZXTF9XaWRnZXRJc0NoaWxkKGNoaWxkLCBmaW5kKSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGNoaWxkID0gRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2FwcGltcC5oIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfYXBwaW1wLmgKaW5kZXggZTBmMWY1OS4uZWMyM2ZlYiAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfYXBwaW1wLmgKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfYXBwaW1wLmgKQEAgLTEzLDIyICsxMywyMiBAQAogY2xhc3MgSUZXTF9UaGVtZVByb3ZpZGVyOw0KIGNsYXNzIElGV0xfQXBwOw0KIGNsYXNzIENGV0xfQXBwSW1wOw0KLWNsYXNzIENGV0xfQXBwSW1wIDogcHVibGljIENGV0xfTm90ZVRocmVhZA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfQXBwSW1wKElGV0xfQWRhcHRlck5hdGl2ZSAqcEFkYXB0ZXIpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0FwcEltcCgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJSW5pdGlhbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJRmluYWxpemUoKTsNCi0gICAgdmlydHVhbCBJRldMX0FkYXB0ZXJOYXRpdmUqCUdldEFkYXB0ZXJOYXRpdmUoKTsNCi0gICAgdmlydHVhbCBJRldMX1dpZGdldE1ncioJCUdldFdpZGdldE1ncigpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJCUV4aXQoaW50MzJfdCBpRXhpdENvZGUgPSAwKTsNCi0gICAgSUZXTF9UaGVtZVByb3ZpZGVyKgkJCUdldFRoZW1lUHJvdmlkZXIoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGV0xfV2lkZ2V0TWdyCQkqbV9wV2lkZ2V0TWdyOw0KLSAgICBJRldMX0FkYXB0ZXJOYXRpdmUJKm1fcEFkYXB0ZXJOYXRpdmU7DQotICAgIElGV0xfVGhlbWVQcm92aWRlcgkqbV9wVGhlbWVQcm92aWRlcjsNCi0gICAgRlhfQk9PTAkJCQltX2JGdWVsQWRhcHRlcjsNCitjbGFzcyBDRldMX0FwcEltcCA6IHB1YmxpYyBDRldMX05vdGVUaHJlYWQgew0KKyBwdWJsaWM6DQorICBDRldMX0FwcEltcChJRldMX0FkYXB0ZXJOYXRpdmUqIHBBZGFwdGVyKTsNCisgIHZpcnR1YWwgfkNGV0xfQXBwSW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIElGV0xfQWRhcHRlck5hdGl2ZSogR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldE1nciogR2V0V2lkZ2V0TWdyKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKTsNCisgIHZpcnR1YWwgRldMX0VSUiBFeGl0KGludDMyX3QgaUV4aXRDb2RlID0gMCk7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIEdldFRoZW1lUHJvdmlkZXIoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIG1fcFdpZGdldE1ncjsNCisgIElGV0xfQWRhcHRlck5hdGl2ZSogbV9wQWRhcHRlck5hdGl2ZTsNCisgIElGV0xfVGhlbWVQcm92aWRlciogbV9wVGhlbWVQcm92aWRlcjsNCisgIEZYX0JPT0wgbV9iRnVlbEFkYXB0ZXI7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9jb250ZW50aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9jb250ZW50aW1wLmgKaW5kZXggOTVhNDdhMy4uMGJmYzc3YyAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfY29udGVudGltcC5oCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2NvbnRlbnRpbXAuaApAQCAtOSwyMyArOSwyMyBAQAogY2xhc3MgQ0ZXTF9XaWRnZXRJbXA7DQogY2xhc3MgSUZXTF9XaWRnZXQ7DQogY2xhc3MgQ0ZXTF9Db250ZW50SW1wOw0KLWNsYXNzIENGV0xfQ29udGVudEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfQ29udGVudEltcCgpOw0KLSAgICBDRldMX0NvbnRlbnRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9Db250ZW50SW1wKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCQlJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBDaGlsZCwgaW50MzJfdCBuSW5kZXggPSAtMSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCQlSZW1vdmVXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCQkJUmVtb3ZlQWxsV2lkZ2V0cygpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldE1pblNpemUoRlhfRkxPQVQgJmZXaWR0aCwgRlhfRkxPQVQgJmZIZWlnaHQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldE1pblNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQlHZXRNYXhTaXplKEZYX0ZMT0FUICZmV2lkdGgsIEZYX0ZMT0FUICZmSGVpZ2h0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRNYXhTaXplKEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgZkhlaWdodCk7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9GTE9BVCBtX2ZXaWR0aE1pbjsNCi0gICAgRlhfRkxPQVQgbV9mV2lkdGhNYXg7DQotICAgIEZYX0ZMT0FUIG1fZkhlaWdodE1heDsNCi0gICAgRlhfRkxPQVQgbV9mSGVpZ2h0TWluOw0KK2NsYXNzIENGV0xfQ29udGVudEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfQ29udGVudEltcCgpOw0KKyAgQ0ZXTF9Db250ZW50SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcyk7DQorICB2aXJ0dWFsIH5DRldMX0NvbnRlbnRJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBDaGlsZCwgaW50MzJfdCBuSW5kZXggPSAtMSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgUmVtb3ZlV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBSZW1vdmVBbGxXaWRnZXRzKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0TWluU2l6ZShGWF9GTE9BVCYgZldpZHRoLCBGWF9GTE9BVCYgZkhlaWdodCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWluU2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldE1heFNpemUoRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZIZWlnaHQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldE1heFNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfRkxPQVQgbV9mV2lkdGhNaW47DQorICBGWF9GTE9BVCBtX2ZXaWR0aE1heDsNCisgIEZYX0ZMT0FUIG1fZkhlaWdodE1heDsNCisgIEZYX0ZMT0FUIG1fZkhlaWdodE1pbjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2Zvcm1pbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2Zvcm1pbXAuaAppbmRleCBmMGNlZTEzLi4xNmQ2MjY0IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9mb3JtaW1wLmgKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfZm9ybWltcC5oCkBAIC0xNiwxNzIgKzE2LDE3NSBAQAogY2xhc3MgQ0ZXTF9TeXNCdG47DQogY2xhc3MgQ0ZXTF9Gb3JtSW1wOw0KIGNsYXNzIENGV0xfRm9ybURlbGVnYXRlOw0KLSNkZWZpbmUgRldMX1NZU0JVVFRPTlNUQVRFX0hvdmVyCQkweDAwMDENCi0jZGVmaW5lIEZXTF9TWVNCVVRUT05TVEFURV9QcmVzc2VkCQkweDAwMDINCi0jZGVmaW5lIEZXTF9TWVNCVVRUT05TVEFURV9EaXNhYmxlZAkJMHgwMDEwDQotY2xhc3MgQ0ZXTF9TeXNCdG4NCi17DQotcHVibGljOg0KLSAgICBDRldMX1N5c0J0bigpDQotICAgIHsNCi0gICAgICAgIG1fcnRCdG4uU2V0KDAsIDAsIDAsIDApOw0KLSAgICAgICAgbV9kd1N0YXRlID0gMDsNCi0gICAgfQ0KKyNkZWZpbmUgRldMX1NZU0JVVFRPTlNUQVRFX0hvdmVyIDB4MDAwMQ0KKyNkZWZpbmUgRldMX1NZU0JVVFRPTlNUQVRFX1ByZXNzZWQgMHgwMDAyDQorI2RlZmluZSBGV0xfU1lTQlVUVE9OU1RBVEVfRGlzYWJsZWQgMHgwMDEwDQorY2xhc3MgQ0ZXTF9TeXNCdG4gew0KKyBwdWJsaWM6DQorICBDRldMX1N5c0J0bigpIHsNCisgICAgbV9ydEJ0bi5TZXQoMCwgMCwgMCwgMCk7DQorICAgIG1fZHdTdGF0ZSA9IDA7DQorICB9DQogDQotICAgIEZYX0JPT0wgSXNIb3ZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2R3U3RhdGUgJiBGV0xfU1lTQlVUVE9OU1RBVEVfSG92ZXI7DQotICAgIH0NCi0gICAgRlhfQk9PTCBJc1ByZXNzZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9kd1N0YXRlICYgRldMX1NZU0JVVFRPTlNUQVRFX1ByZXNzZWQ7DQotICAgIH0NCi0gICAgRlhfQk9PTCBJc0Rpc2FibGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZHdTdGF0ZSAmIEZXTF9TWVNCVVRUT05TVEFURV9EaXNhYmxlZDsNCi0gICAgfQ0KLSAgICB2b2lkIFNldE5vcm1hbCgpDQotICAgIHsNCi0gICAgICAgIG1fZHdTdGF0ZSAmPSAweEZGRjA7DQotICAgIH0NCi0gICAgdm9pZCBTZXRQcmVzc2VkKCkNCi0gICAgew0KLSAgICAgICAgU2V0Tm9ybWFsKCk7DQotICAgICAgICBtX2R3U3RhdGUgfD0gRldMX1NZU0JVVFRPTlNUQVRFX1ByZXNzZWQ7DQotICAgIH0NCi0gICAgdm9pZCBTZXRIb3ZlcigpDQotICAgIHsNCi0gICAgICAgIFNldE5vcm1hbCgpOw0KLSAgICAgICAgbV9kd1N0YXRlIHw9IEZXTF9TWVNCVVRUT05TVEFURV9Ib3ZlcjsNCi0gICAgfQ0KLSAgICB2b2lkIFNldERpc2FibGVkKEZYX0JPT0wgYkRpc2FibGVkKQ0KLSAgICB7DQotICAgICAgICBiRGlzYWJsZWQgPyBtX2R3U3RhdGUgfD0gRldMX1NZU0JVVFRPTlNUQVRFX0Rpc2FibGVkIDogbV9kd1N0YXRlICY9IH5GV0xfU1lTQlVUVE9OU1RBVEVfRGlzYWJsZWQ7DQotICAgIH0NCi0gICAgaW50MzJfdCBHZXRQYXJ0U3RhdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKElzRGlzYWJsZWQoKSA/IEZXTF9QQVJUU1RBVEVfRlJNX0Rpc2FibGVkIDogKG1fZHdTdGF0ZSArIDEpKTsNCi0gICAgfQ0KKyAgRlhfQk9PTCBJc0hvdmVyKCkgeyByZXR1cm4gbV9kd1N0YXRlICYgRldMX1NZU0JVVFRPTlNUQVRFX0hvdmVyOyB9DQorICBGWF9CT09MIElzUHJlc3NlZCgpIHsgcmV0dXJuIG1fZHdTdGF0ZSAmIEZXTF9TWVNCVVRUT05TVEFURV9QcmVzc2VkOyB9DQorICBGWF9CT09MIElzRGlzYWJsZWQoKSB7IHJldHVybiBtX2R3U3RhdGUgJiBGV0xfU1lTQlVUVE9OU1RBVEVfRGlzYWJsZWQ7IH0NCisgIHZvaWQgU2V0Tm9ybWFsKCkgeyBtX2R3U3RhdGUgJj0gMHhGRkYwOyB9DQorICB2b2lkIFNldFByZXNzZWQoKSB7DQorICAgIFNldE5vcm1hbCgpOw0KKyAgICBtX2R3U3RhdGUgfD0gRldMX1NZU0JVVFRPTlNUQVRFX1ByZXNzZWQ7DQorICB9DQorICB2b2lkIFNldEhvdmVyKCkgew0KKyAgICBTZXROb3JtYWwoKTsNCisgICAgbV9kd1N0YXRlIHw9IEZXTF9TWVNCVVRUT05TVEFURV9Ib3ZlcjsNCisgIH0NCisgIHZvaWQgU2V0RGlzYWJsZWQoRlhfQk9PTCBiRGlzYWJsZWQpIHsNCisgICAgYkRpc2FibGVkID8gbV9kd1N0YXRlIHw9IEZXTF9TWVNCVVRUT05TVEFURV9EaXNhYmxlZA0KKyAgICAgICAgICAgICAgOiBtX2R3U3RhdGUgJj0gfkZXTF9TWVNCVVRUT05TVEFURV9EaXNhYmxlZDsNCisgIH0NCisgIGludDMyX3QgR2V0UGFydFN0YXRlKCkgew0KKyAgICByZXR1cm4gKElzRGlzYWJsZWQoKSA/IEZXTF9QQVJUU1RBVEVfRlJNX0Rpc2FibGVkIDogKG1fZHdTdGF0ZSArIDEpKTsNCisgIH0NCiANCi0gICAgQ0ZYX1JlY3RGCW1fcnRCdG47DQotICAgIEZYX0RXT1JECW1fZHdTdGF0ZTsNCisgIENGWF9SZWN0RiBtX3J0QnRuOw0KKyAgRlhfRFdPUkQgbV9kd1N0YXRlOw0KIH07DQogZW51bSBGT1JNX1JFU0laRVRZUEUgew0KLSAgICBGT1JNX1JFU0laRVRZUEVfTm9uZSA9IDAsDQotICAgIEZPUk1fUkVTSVpFVFlQRV9DYXAsDQotICAgIEZPUk1fUkVTSVpFVFlQRV9MZWZ0LA0KLSAgICBGT1JNX1JFU0laRVRZUEVfVG9wLA0KLSAgICBGT1JNX1JFU0laRVRZUEVfUmlnaHQsDQotICAgIEZPUk1fUkVTSVpFVFlQRV9Cb3R0b20sDQotICAgIEZPUk1fUkVTSVpFVFlQRV9MZWZ0VG9wLA0KLSAgICBGT1JNX1JFU0laRVRZUEVfTGVmdEJvdHRvbSwNCi0gICAgRk9STV9SRVNJWkVUWVBFX1JpZ2h0VG9wLA0KLSAgICBGT1JNX1JFU0laRVRZUEVfUmlnaHRCb3R0b20NCisgIEZPUk1fUkVTSVpFVFlQRV9Ob25lID0gMCwNCisgIEZPUk1fUkVTSVpFVFlQRV9DYXAsDQorICBGT1JNX1JFU0laRVRZUEVfTGVmdCwNCisgIEZPUk1fUkVTSVpFVFlQRV9Ub3AsDQorICBGT1JNX1JFU0laRVRZUEVfUmlnaHQsDQorICBGT1JNX1JFU0laRVRZUEVfQm90dG9tLA0KKyAgRk9STV9SRVNJWkVUWVBFX0xlZnRUb3AsDQorICBGT1JNX1JFU0laRVRZUEVfTGVmdEJvdHRvbSwNCisgIEZPUk1fUkVTSVpFVFlQRV9SaWdodFRvcCwNCisgIEZPUk1fUkVTSVpFVFlQRV9SaWdodEJvdHRvbQ0KIH07DQogdHlwZWRlZiBzdHJ1Y3QgUmVzdG9yZVJlc2l6ZUluZm8gew0KLSAgICBDRlhfUG9pbnRGICBtX3B0U3RhcnQ7DQotICAgIENGWF9TaXplRiAgIG1fc3pTdGFydDsNCisgIENGWF9Qb2ludEYgbV9wdFN0YXJ0Ow0KKyAgQ0ZYX1NpemVGIG1fc3pTdGFydDsNCiB9IFJlc3RvcmVJbmZvOw0KLWNsYXNzIENGV0xfRm9ybUltcCA6IHB1YmxpYyBDRldMX1BhbmVsSW1wDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Gb3JtSW1wKElGV0xfV2lkZ2V0ICpwT3V0ZXIgPSBOVUxMKTsNCi0gICAgQ0ZXTF9Gb3JtSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIH5DRldMX0Zvcm1JbXAoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Q7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCUluaXRpYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJRmluYWxpemUoKTsNCitjbGFzcyBDRldMX0Zvcm1JbXAgOiBwdWJsaWMgQ0ZXTF9QYW5lbEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfRm9ybUltcChJRldMX1dpZGdldCogcE91dGVyID0gTlVMTCk7DQorICBDRldMX0Zvcm1JbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIHZpcnR1YWwgfkNGV0xfRm9ybUltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQogDQotICAgIHZpcnR1YWwgRldMX0VSUgkJCUdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGICZyZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQkJR2V0Q2xpZW50UmVjdChDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCQlVcGRhdGUoKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRldMX0ZPUk1TSVpFCUdldEZvcm1TaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCVNldEZvcm1TaXplKEZXTF9GT1JNU0laRSBlRm9ybVNpemUpOw0KLSAgICB2aXJ0dWFsIElGV0xfV2lkZ2V0KglEb01vZGFsKCk7DQotICAgIHZpcnR1YWwgSUZXTF9XaWRnZXQqCURvTW9kYWwoRlhfRFdPUkQgJmR3Q29tbWFuZElEKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJRW5kRG9Nb2RhbCgpOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCQlTZXRCb3JkZXJSZWdpb24oQ0ZYX1BhdGggKnBQYXRoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJRHJhd0JhY2tncm91bmQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lKTsNCi0gICAgQ0ZXTF9XaWRnZXRJbXAqIEdldFN1YkZvY3VzKCk7DQotICAgIHZvaWQJCQlTZXRTdWJGb2N1cyhDRldMX1dpZGdldEltcCAqcFdpZGdldCk7DQotICAgIENGWF9NYXBBY2NlbGVyYXRvcnMmCUdldEFjY2VsZXJhdG9yKCk7DQotICAgIHZvaWQJCQkJCVNldEFjY2VsZXJhdG9yKENGWF9NYXBBY2NlbGVyYXRvcnMgKnBBY2NlbGVyYXRvcnMpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAkJCVNob3dDaGlsZFdpZGdldChJRldMX1dpZGdldCAqcFBhcmVudCk7DQotICAgIHZvaWQJCQlSZW1vdmVTeXNCdXR0b25zKCk7DQotICAgIHZvaWQJCQlDYWxjQ29udGVudFJlY3QoQ0ZYX1JlY3RGICZydENvbnRlbnQpOw0KLSAgICBDRldMX1N5c0J0bioJR2V0U3lzQnRuQXRQb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICBDRldMX1N5c0J0bioJR2V0U3lzQnRuQnlTdGF0ZShGWF9EV09SRCBkd1N0YXRlKTsNCi0gICAgQ0ZXTF9TeXNCdG4qCUdldFN5c0J0bkJ5SW5kZXgoaW50MzJfdCBuSW5kZXgpOw0KLSAgICBpbnQzMl90CQlHZXRTeXNCdG5JbmRleChDRldMX1N5c0J0biAqcEJ0bik7DQotICAgIEZYX0ZMT0FUCQlHZXRDYXB0aW9uSGVpZ2h0KCk7DQotICAgIHZvaWQJCQlEcmF3Q2FwdGlvblRleHQoQ0ZYX0dyYXBoaWNzICpwR3MsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJCQlEcmF3SWNvbkltYWdlKENGWF9HcmFwaGljcyAqcEdzLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCQkJR2V0RWRnZVJlY3QoQ0ZYX1JlY3RGICZydEVkZ2UpOw0KLSAgICB2b2lkCQkJU2V0V29ya0FyZWFSZWN0KCk7DQotICAgIHZvaWQJCQlTZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdm9pZAkJCUxheW91dCgpOw0KLSAgICB2b2lkCQkJUmVTZXRTeXNCdG4oKTsNCi0gICAgdm9pZAkJCVJlZ2lzdGVyRm9ybSgpOw0KLSAgICB2b2lkCQkJVW5SZWdpc3RlckZvcm0oKTsNCi0gICAgRlhfQk9PTAkJCUlzRG9Nb2RhbCgpOw0KLSAgICB2b2lkCQkJU2V0VGhlbWVEYXRhKCk7DQotICAgIEZYX0JPT0wJCQlIYXNJY29uKCk7DQotICAgIHZvaWQJCQlVcGRhdGVJY29uKCk7DQotICAgIHZvaWQJCQlVcGRhdGVDYXB0aW9uKCk7DQotICAgIHZvaWQgICAgICAgICAgICBEb1dpZHRoTGltaXQoRlhfRkxPQVQgJmZMZWZ0LCBGWF9GTE9BVCAmZldpZHRoLCBGWF9GTE9BVCBmQ3VyWCwgRlhfRkxPQVQgZlNwYWNlLCBGWF9GTE9BVCBmTGltaXRNaW4sIEZYX0ZMT0FUIGZMaW1pdE1heCwgRlhfQk9PTCBiTGVmdCk7DQotICAgIHZvaWQgICAgICAgICAgICBEb0hlaWdodExpbWl0KEZYX0ZMT0FUICZmVG9wLCBGWF9GTE9BVCAmZkhlaWdodCwgRlhfRkxPQVQgZkN1clksIEZYX0ZMT0FUIGZTcGFjZSwgRlhfRkxPQVQgZkxpbWl0TWluLCBGWF9GTE9BVCBmTGltaXRNYXgsIEZYX0JPT0wgYlRvcCk7DQotICAgIENGWF9NYXBBY2NlbGVyYXRvcnMJCW1fbWFwQWNjZWxlcmF0b3JzOw0KLSAgICBDRlhfUmVjdEYJCQkJbV9ydFJlc3RvcmU7DQotICAgIENGWF9SZWN0RgkJCQltX3J0Q2FwdGlvblRleHQ7DQotICAgIENGWF9SZWN0RgkJCQltX3J0UmVsYXRpdmU7DQotICAgIENGWF9SZWN0RgkJCQltX3J0Q2FwdGlvbjsNCi0gICAgQ0ZYX1JlY3RGCQkJCW1fcnRJY29uOw0KLSAgICBDRldMX1N5c0J0bgkJCSAgICptX3BDbG9zZUJveDsNCi0gICAgQ0ZXTF9TeXNCdG4JCQkgICAqbV9wTWluQm94Ow0KLSAgICBDRldMX1N5c0J0bgkJCSAgICptX3BNYXhCb3g7DQotICAgIENGV0xfU3lzQnRuCQkJICAgKm1fcENhcHRpb25Cb3g7DQotICAgIENGV0xfTm90ZUxvb3AJCSAgICptX3BOb3RlTG9vcDsNCi0gICAgQ0ZXTF9XaWRnZXRJbXAJCSAgICptX3BTdWJGb2N1czsNCi0gICAgUmVzdG9yZUluZm8JCQkJbV9JbmZvU3RhcnQ7DQotICAgIEZYX0ZMT0FUCQkJCW1fZkNYQm9yZGVyOw0KLSAgICBGWF9GTE9BVAkJCQltX2ZDWUJvcmRlcjsNCi0gICAgaW50MzJfdAkJCQltX2lDYXB0dXJlQnRuOw0KLSAgICBpbnQzMl90CQkJCW1faVN5c0JveDsNCi0gICAgaW50MzJfdAkJCQltX2VSZXNpemVUeXBlOw0KLSAgICBGWF9CT09MCQkJCQltX2JMQnV0dG9uRG93bjsNCi0gICAgRlhfQk9PTAkJCQkJbV9iTWF4aW1pemVkOw0KLSAgICBGWF9CT09MCQkJCQltX2JTZXRNYXhpbWl6ZTsNCi0gICAgRlhfQk9PTAkJCQkJbV9iQ3VzdG9taXplTGF5b3V0Ow0KLSAgICBGV0xfRk9STVNJWkUJCQltX2VGb3JtU2l6ZTsNCi0gICAgRlhfQk9PTAkJCQkJbV9iRG9Nb2RhbEZsYWc7DQotICAgIEZYX0ZMT0FUCQkJCW1fZlNtYWxsSWNvblN6Ow0KLSAgICBGWF9GTE9BVAkJCQltX2ZCaWdJY29uU3o7DQotICAgIENGWF9ESUJpdG1hcAkJCSptX3BCaWdJY29uOw0KLSAgICBDRlhfRElCaXRtYXAJCQkqbV9wU21hbGxJY29uOw0KLSAgICBGWF9CT09MCQkJCQltX2JNb3VzZUluOw0KLSAgICBmcmllbmQgY2xhc3MgQ0ZXTF9Gb3JtRGVsZWdhdGU7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsaWVudFJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZXTF9GT1JNU0laRSBHZXRGb3JtU2l6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEZvcm1TaXplKEZXTF9GT1JNU0laRSBlRm9ybVNpemUpOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldCogRG9Nb2RhbCgpOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldCogRG9Nb2RhbChGWF9EV09SRCYgZHdDb21tYW5kSUQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEVuZERvTW9kYWwoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRCb3JkZXJSZWdpb24oQ0ZYX1BhdGgqIHBQYXRoKTsNCisgIHZpcnR1YWwgdm9pZCBEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSk7DQorICBDRldMX1dpZGdldEltcCogR2V0U3ViRm9jdXMoKTsNCisgIHZvaWQgU2V0U3ViRm9jdXMoQ0ZXTF9XaWRnZXRJbXAqIHBXaWRnZXQpOw0KKyAgQ0ZYX01hcEFjY2VsZXJhdG9ycyYgR2V0QWNjZWxlcmF0b3IoKTsNCisgIHZvaWQgU2V0QWNjZWxlcmF0b3IoQ0ZYX01hcEFjY2VsZXJhdG9ycyogcEFjY2VsZXJhdG9ycyk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgU2hvd0NoaWxkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwUGFyZW50KTsNCisgIHZvaWQgUmVtb3ZlU3lzQnV0dG9ucygpOw0KKyAgdm9pZCBDYWxjQ29udGVudFJlY3QoQ0ZYX1JlY3RGJiBydENvbnRlbnQpOw0KKyAgQ0ZXTF9TeXNCdG4qIEdldFN5c0J0bkF0UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIENGV0xfU3lzQnRuKiBHZXRTeXNCdG5CeVN0YXRlKEZYX0RXT1JEIGR3U3RhdGUpOw0KKyAgQ0ZXTF9TeXNCdG4qIEdldFN5c0J0bkJ5SW5kZXgoaW50MzJfdCBuSW5kZXgpOw0KKyAgaW50MzJfdCBHZXRTeXNCdG5JbmRleChDRldMX1N5c0J0biogcEJ0bik7DQorICBGWF9GTE9BVCBHZXRDYXB0aW9uSGVpZ2h0KCk7DQorICB2b2lkIERyYXdDYXB0aW9uVGV4dChDRlhfR3JhcGhpY3MqIHBHcywNCisgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3SWNvbkltYWdlKENGWF9HcmFwaGljcyogcEdzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgR2V0RWRnZVJlY3QoQ0ZYX1JlY3RGJiBydEVkZ2UpOw0KKyAgdm9pZCBTZXRXb3JrQXJlYVJlY3QoKTsNCisgIHZvaWQgU2V0Q3Vyc29yKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2b2lkIExheW91dCgpOw0KKyAgdm9pZCBSZVNldFN5c0J0bigpOw0KKyAgdm9pZCBSZWdpc3RlckZvcm0oKTsNCisgIHZvaWQgVW5SZWdpc3RlckZvcm0oKTsNCisgIEZYX0JPT0wgSXNEb01vZGFsKCk7DQorICB2b2lkIFNldFRoZW1lRGF0YSgpOw0KKyAgRlhfQk9PTCBIYXNJY29uKCk7DQorICB2b2lkIFVwZGF0ZUljb24oKTsNCisgIHZvaWQgVXBkYXRlQ2FwdGlvbigpOw0KKyAgdm9pZCBEb1dpZHRoTGltaXQoRlhfRkxPQVQmIGZMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDdXJYLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNwYWNlLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbWl0TWluLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbWl0TWF4LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTGVmdCk7DQorICB2b2lkIERvSGVpZ2h0TGltaXQoRlhfRkxPQVQmIGZUb3AsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkN1clksDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNwYWNlLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW1pdE1pbiwNCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGltaXRNYXgsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVG9wKTsNCisgIENGWF9NYXBBY2NlbGVyYXRvcnMgbV9tYXBBY2NlbGVyYXRvcnM7DQorICBDRlhfUmVjdEYgbV9ydFJlc3RvcmU7DQorICBDRlhfUmVjdEYgbV9ydENhcHRpb25UZXh0Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRSZWxhdGl2ZTsNCisgIENGWF9SZWN0RiBtX3J0Q2FwdGlvbjsNCisgIENGWF9SZWN0RiBtX3J0SWNvbjsNCisgIENGV0xfU3lzQnRuKiBtX3BDbG9zZUJveDsNCisgIENGV0xfU3lzQnRuKiBtX3BNaW5Cb3g7DQorICBDRldMX1N5c0J0biogbV9wTWF4Qm94Ow0KKyAgQ0ZXTF9TeXNCdG4qIG1fcENhcHRpb25Cb3g7DQorICBDRldMX05vdGVMb29wKiBtX3BOb3RlTG9vcDsNCisgIENGV0xfV2lkZ2V0SW1wKiBtX3BTdWJGb2N1czsNCisgIFJlc3RvcmVJbmZvIG1fSW5mb1N0YXJ0Ow0KKyAgRlhfRkxPQVQgbV9mQ1hCb3JkZXI7DQorICBGWF9GTE9BVCBtX2ZDWUJvcmRlcjsNCisgIGludDMyX3QgbV9pQ2FwdHVyZUJ0bjsNCisgIGludDMyX3QgbV9pU3lzQm94Ow0KKyAgaW50MzJfdCBtX2VSZXNpemVUeXBlOw0KKyAgRlhfQk9PTCBtX2JMQnV0dG9uRG93bjsNCisgIEZYX0JPT0wgbV9iTWF4aW1pemVkOw0KKyAgRlhfQk9PTCBtX2JTZXRNYXhpbWl6ZTsNCisgIEZYX0JPT0wgbV9iQ3VzdG9taXplTGF5b3V0Ow0KKyAgRldMX0ZPUk1TSVpFIG1fZUZvcm1TaXplOw0KKyAgRlhfQk9PTCBtX2JEb01vZGFsRmxhZzsNCisgIEZYX0ZMT0FUIG1fZlNtYWxsSWNvblN6Ow0KKyAgRlhfRkxPQVQgbV9mQmlnSWNvblN6Ow0KKyAgQ0ZYX0RJQml0bWFwKiBtX3BCaWdJY29uOw0KKyAgQ0ZYX0RJQml0bWFwKiBtX3BTbWFsbEljb247DQorICBGWF9CT09MIG1fYk1vdXNlSW47DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Gb3JtRGVsZWdhdGU7DQogfTsNCi1jbGFzcyBDRldMX0Zvcm1EZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Gb3JtRGVsZWdhdGUoQ0ZXTF9Gb3JtSW1wICpwT3duZXIpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAlPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uTW91c2VIb3ZlcihDRldMX01zZ01vdXNlICpwTXNnKTsNCi0gICAgdm9pZAlPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSAqcE1zZyk7DQotICAgIHZvaWQJT25MQnV0dG9uRGJsQ2xrKENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICB2b2lkCU9uV2luZG93TW92ZShDRldMX01zZ1dpbmRvd01vdmUgKnBNc2cpOw0KLSAgICB2b2lkCU9uQ2xvc2UoQ0ZXTF9Nc2dDbG9zZSAqcE1zZyk7DQotICAgIENGV0xfRm9ybUltcCAqbV9wT3duZXI7DQorY2xhc3MgQ0ZXTF9Gb3JtRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfRm9ybURlbGVnYXRlKENGV0xfRm9ybUltcCogcE93bmVyKTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlSG92ZXIoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uRGJsQ2xrKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbldpbmRvd01vdmUoQ0ZXTF9Nc2dXaW5kb3dNb3ZlKiBwTXNnKTsNCisgIHZvaWQgT25DbG9zZShDRldMX01zZ0Nsb3NlKiBwTXNnKTsNCisgIENGV0xfRm9ybUltcCogbV9wT3duZXI7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ncmlkaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ncmlkaW1wLmgKaW5kZXggODJhZWI3ZS4uNjkzYWFjMiAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfZ3JpZGltcC5oCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2dyaWRpbXAuaApAQCAtMTIsMTUwICsxMiwxODIgQEAKIGNsYXNzIENGV0xfR3JpZENvbFJvdzsNCiBjbGFzcyBDRldMX0dyaWRXaWRnZXRJbmZvOw0KIGNsYXNzIENGV0xfR3JpZEltcDsNCi1jbGFzcyBDRldMX0dyaWRMZW5ndGgNCi17DQotcHVibGljOg0KLSAgICBDRldMX0dyaWRMZW5ndGgoKQ0KLSAgICAgICAgOiBmTGVuZ3RoKDApDQotICAgICAgICAsIGVVbml0KEZXTF9HUklEVU5JVF9GaXhlZCkNCi0gICAgew0KLSAgICB9DQotICAgIENGV0xfR3JpZExlbmd0aChGWF9GTE9BVCBmVmFsdWUsIEZXTF9HUklEVU5JVCBlKQ0KLSAgICAgICAgOiBmTGVuZ3RoKGZWYWx1ZSkNCi0gICAgICAgICwgZVVuaXQoZSkNCi0gICAgew0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZMZW5ndGg7DQotICAgIEZXTF9HUklEVU5JVCBlVW5pdDsNCitjbGFzcyBDRldMX0dyaWRMZW5ndGggew0KKyBwdWJsaWM6DQorICBDRldMX0dyaWRMZW5ndGgoKSA6IGZMZW5ndGgoMCksIGVVbml0KEZXTF9HUklEVU5JVF9GaXhlZCkge30NCisgIENGV0xfR3JpZExlbmd0aChGWF9GTE9BVCBmVmFsdWUsIEZXTF9HUklEVU5JVCBlKQ0KKyAgICAgIDogZkxlbmd0aChmVmFsdWUpLCBlVW5pdChlKSB7fQ0KKyAgRlhfRkxPQVQgZkxlbmd0aDsNCisgIEZXTF9HUklEVU5JVCBlVW5pdDsNCiB9Ow0KLWNsYXNzIENGV0xfR3JpZENvbFJvdw0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfR3JpZENvbFJvdygpDQotICAgICAgICA6IG1fU2l6ZSAoMSwgRldMX0dSSURVTklUX1NjYWxlZCkNCi0gICAgICAgICwgbV9NaW5TaXplKDAsIEZXTF9HUklEVU5JVF9GaXhlZCkNCi0gICAgICAgICwgbV9NYXhTaXplKDAsIEZXTF9HUklEVU5JVF9JbmZpbml0eSkNCi0gICAgICAgICwgbV9mQWN0dWFsU2l6ZSgwKQ0KLSAgICAgICAgLCBtX2ZBY3R1YWxQb3MoMCkNCi0gICAgew0KLSAgICB9DQotICAgIENGV0xfR3JpZExlbmd0aAltX1NpemU7DQotICAgIENGV0xfR3JpZExlbmd0aAltX01pblNpemU7DQotICAgIENGV0xfR3JpZExlbmd0aAltX01heFNpemU7DQotICAgIEZYX0ZMT0FUCQltX2ZBY3R1YWxTaXplOw0KLSAgICBGWF9GTE9BVAkJbV9mQWN0dWFsUG9zOw0KK2NsYXNzIENGV0xfR3JpZENvbFJvdyB7DQorIHB1YmxpYzoNCisgIENGV0xfR3JpZENvbFJvdygpDQorICAgICAgOiBtX1NpemUoMSwgRldMX0dSSURVTklUX1NjYWxlZCksDQorICAgICAgICBtX01pblNpemUoMCwgRldMX0dSSURVTklUX0ZpeGVkKSwNCisgICAgICAgIG1fTWF4U2l6ZSgwLCBGV0xfR1JJRFVOSVRfSW5maW5pdHkpLA0KKyAgICAgICAgbV9mQWN0dWFsU2l6ZSgwKSwNCisgICAgICAgIG1fZkFjdHVhbFBvcygwKSB7fQ0KKyAgQ0ZXTF9HcmlkTGVuZ3RoIG1fU2l6ZTsNCisgIENGV0xfR3JpZExlbmd0aCBtX01pblNpemU7DQorICBDRldMX0dyaWRMZW5ndGggbV9NYXhTaXplOw0KKyAgRlhfRkxPQVQgbV9mQWN0dWFsU2l6ZTsNCisgIEZYX0ZMT0FUIG1fZkFjdHVhbFBvczsNCiB9Ow0KLWNsYXNzIENGV0xfR3JpZFdpZGdldEluZm8NCi17DQotcHVibGljOg0KLSAgICBDRldMX0dyaWRXaWRnZXRJbmZvKCkNCi0gICAgICAgIDogbV9pQ29sdW1uICgwKQ0KLSAgICAgICAgLCBtX2lDb2x1bW5TcGFuKDEpDQotICAgICAgICAsIG1faVJvdygwKQ0KLSAgICAgICAgLCBtX2lSb3dTcGFuKDEpDQotICAgICAgICAsIG1fZHdNYXJnaW5GbGFnKDApDQotICAgICAgICAsIG1fZkFjdHVhbFdpZHRoKDApDQotICAgICAgICAsIG1fZkFjdHVhbEhlaWdodCgwKQ0KLSAgICB7DQotICAgICAgICBtX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KLSAgICAgICAgbV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZkxlbmd0aCA9IDA7DQotICAgICAgICBtX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfQXV0bzsNCi0gICAgICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5mTGVuZ3RoID0gMDsNCi0gICAgICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluV2lkdGhdLmVVbml0ID0gRldMX0dSSURVTklUX0ZpeGVkOw0KLSAgICAgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZkxlbmd0aCA9IDA7DQotICAgICAgICBtX1NpemVbRldMX0dSSURTSVpFX01heFdpZHRoXS5lVW5pdCA9IEZXTF9HUklEVU5JVF9JbmZpbml0eTsNCi0gICAgICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmZMZW5ndGggPSAwOw0KLSAgICAgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5IZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0ZpeGVkOw0KLSAgICAgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5IZWlnaHRdLmZMZW5ndGggPSAwOw0KLSAgICAgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0luZmluaXR5Ow0KLSAgICAgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmZMZW5ndGggPSAwOw0KLSAgICAgICAgbV9NYXJnaW5bMF0gPSBtX01hcmdpblsxXSA9IG1fTWFyZ2luWzJdID0gbV9NYXJnaW5bM10gPSAwOw0KLSAgICB9DQotICAgIGludDMyX3QgbV9pQ29sdW1uOw0KLSAgICBpbnQzMl90IG1faUNvbHVtblNwYW47DQotICAgIGludDMyX3QgbV9pUm93Ow0KLSAgICBpbnQzMl90IG1faVJvd1NwYW47DQotICAgIENGV0xfR3JpZExlbmd0aAltX1NpemVbNl07DQotICAgIEZYX0RXT1JECQltX2R3TWFyZ2luRmxhZzsNCi0gICAgRlhfRkxPQVQJCW1fTWFyZ2luWzRdOw0KLSAgICBGWF9GTE9BVAkJbV9mQWN0dWFsV2lkdGg7DQotICAgIEZYX0ZMT0FUCQltX2ZBY3R1YWxIZWlnaHQ7DQorY2xhc3MgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyB7DQorIHB1YmxpYzoNCisgIENGV0xfR3JpZFdpZGdldEluZm8oKQ0KKyAgICAgIDogbV9pQ29sdW1uKDApLA0KKyAgICAgICAgbV9pQ29sdW1uU3BhbigxKSwNCisgICAgICAgIG1faVJvdygwKSwNCisgICAgICAgIG1faVJvd1NwYW4oMSksDQorICAgICAgICBtX2R3TWFyZ2luRmxhZygwKSwNCisgICAgICAgIG1fZkFjdHVhbFdpZHRoKDApLA0KKyAgICAgICAgbV9mQWN0dWFsSGVpZ2h0KDApIHsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfQXV0bzsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZkxlbmd0aCA9IDA7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZkxlbmd0aCA9IDA7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluV2lkdGhdLmVVbml0ID0gRldMX0dSSURVTklUX0ZpeGVkOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX01pbldpZHRoXS5mTGVuZ3RoID0gMDsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfSW5maW5pdHk7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmZMZW5ndGggPSAwOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX01pbkhlaWdodF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfRml4ZWQ7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5mTGVuZ3RoID0gMDsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0luZmluaXR5Ow0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX01heEhlaWdodF0uZkxlbmd0aCA9IDA7DQorICAgIG1fTWFyZ2luWzBdID0gbV9NYXJnaW5bMV0gPSBtX01hcmdpblsyXSA9IG1fTWFyZ2luWzNdID0gMDsNCisgIH0NCisgIGludDMyX3QgbV9pQ29sdW1uOw0KKyAgaW50MzJfdCBtX2lDb2x1bW5TcGFuOw0KKyAgaW50MzJfdCBtX2lSb3c7DQorICBpbnQzMl90IG1faVJvd1NwYW47DQorICBDRldMX0dyaWRMZW5ndGggbV9TaXplWzZdOw0KKyAgRlhfRFdPUkQgbV9kd01hcmdpbkZsYWc7DQorICBGWF9GTE9BVCBtX01hcmdpbls0XTsNCisgIEZYX0ZMT0FUIG1fZkFjdHVhbFdpZHRoOw0KKyAgRlhfRkxPQVQgbV9mQWN0dWFsSGVpZ2h0Ow0KIH07DQotY2xhc3MgQ0ZXTF9HcmlkSW1wIDogcHVibGljIENGV0xfQ29udGVudEltcA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfR3JpZEltcCgpOw0KLSAgICBDRldMX0dyaWRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9HcmlkSW1wKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRDbGFzc0lEKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQlVcGRhdGUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorY2xhc3MgQ0ZXTF9HcmlkSW1wIDogcHVibGljIENGV0xfQ29udGVudEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfR3JpZEltcCgpOw0KKyAgQ0ZXTF9HcmlkSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcyk7DQorICB2aXJ0dWFsIH5DRldMX0dyaWRJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KIA0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQlJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQgKnBDaGlsZCwgaW50MzJfdCBuSW5kZXggPSAtMSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCVJlbW92ZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZpcnR1YWwgRldMX0hHUklEQ09MUk9XCQlJbnNlcnRDb2xSb3coRlhfQk9PTCBiQ29sdW1uLCBpbnQzMl90IG5JbmRleCA9IC0xKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJQ291bnRDb2xSb3dzKEZYX0JPT0wgYkNvbHVtbik7DQotICAgIHZpcnR1YWwgRldMX0hHUklEQ09MUk9XCQlHZXRDb2xSb3coRlhfQk9PTCBiQ29sdW1uLCBpbnQzMl90IG5JbmRleCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldEluZGV4KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KTsNCi0gICAgdmlydHVhbCBGWF9GTE9BVAkJCUdldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCAmZVVuaXQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJU2V0U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVW5pdCk7DQotICAgIHZpcnR1YWwgRlhfRkxPQVQJCQlHZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQgJmVVbml0KTsNCi0gICAgdmlydHVhbAlGV0xfRVJSCQkJCVNldE1pblNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVuaXQpOw0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TWF4U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUICZlVW5pdCk7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJCQlTZXRNYXhTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVbml0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCURlbGV0ZUNvbFJvdyhGV0xfSEdSSURDT0xST1cgaENvbFJvdyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0NvbHVtbihGV0xfSEdSSURDT0xST1cgaENvbFJvdyk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFdpZGdldFBvcyhJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJCVNldFdpZGdldFBvcyhJRldMX1dpZGdldCAqcFdpZGdldCwgaW50MzJfdCBpUG9zLCBGWF9CT09MIGJDb2x1bW4pOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9CT09MIGJDb2x1bW4pOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQkJU2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCAqcFdpZGdldCwgaW50MzJfdCBpU3BhbiwgRlhfQk9PTCBiQ29sdW1uKTsNCi0gICAgdmlydHVhbCBGWF9GTE9BVAkJCUdldFdpZGdldFNpemUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklEU0laRSBlU2l6ZSwgRldMX0dSSURVTklUICZlVW5pdCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCQlTZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfR1JJRFNJWkUgZVNpemUsIEZYX0ZMT0FUIGZTaXplLCBGV0xfR1JJRFVOSVQgZVVpdCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlHZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sIEZYX0ZMT0FUICZmTWFyZ2luKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJCVNldFdpZGdldE1hcmdpbihJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0dSSURNQVJHSU4gZU1hcmdpbiwgRlhfRkxPQVQgZk1hcmdpbik7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCQlSZW1vdmVXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9HUklETUFSR0lOIGVNYXJnaW4pOw0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0R3JpZFNpemUoRldMX0dSSURTSVpFIGVTaXplLCBGV0xfR1JJRFVOSVQgJmVVbml0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJCVNldEdyaWRTaXplKEZXTF9HUklEU0laRSBlU2l6ZSwgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVWl0KTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGV0xfR3JpZFdpZGdldEluZm8qCUdldFdpZGdldEluZm8oSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KLSAgICB2b2lkCQkJUHJvY0ZpeGVkQ29sUm93KENGV0xfR3JpZENvbFJvdyAqcENvbFJvdywgaW50MzJfdCBuSW5kZXgsIEZYX0ZMT0FUIGZDb2xSb3dTaXplLCBGWF9CT09MIGJDb2x1bW4pOw0KLSAgICB2b2lkCQkJUHJvY0F1dG9Db2xSb3coQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93LCBpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQ29sdW1uKTsNCi0gICAgdm9pZAkJCVByb2NTY2FsZWRDb2xSb3coQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93LCBpbnQzMl90IG5JbmRleCwgRlhfRkxPQVQgZkNvbFJvd1NpemUsIEZYX0JPT0wgYkNvbHVtbik7DQotICAgIHZvaWQJCQlDYWxjV2lkZ2V0V2lkdGgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGV0xfR3JpZFdpZGdldEluZm8gKnBJbmZvLCBGWF9GTE9BVCBmQ29sdW5tV2lkdGgpOw0KLSAgICB2b2lkCQkJQ2FsY1dpZGdldEhlaWd0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRldMX0dyaWRXaWRnZXRJbmZvICpwSW5mbywgRlhfRkxPQVQgZlJvd0hlaWd0KTsNCi0gICAgRlhfRkxPQVQJCUNhbGNBdXRvQ29sdW1uV2lkZ2V0V2lkdGgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvKTsNCi0gICAgRlhfRkxPQVQJCUNhbGNBdXRvQ29sdW1uV2lkZ2V0SGVpZ2h0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyk7DQotICAgIEZYX0ZMT0FUCQlQcm9jZXNzQ29sdW1ucyhGWF9GTE9BVCBmV2lkdGgpOw0KLSAgICBGWF9GTE9BVAkJUHJvY2Vzc1Jvd3MoRlhfRkxPQVQgZkhlaWdodCk7DQotICAgIEZYX0ZMT0FUCQlQcm9jZXNzVW5DZXJ0YWluQ29sdW1ucygpOw0KLSAgICBGWF9GTE9BVAkJUHJvY2Vzc1VuQ2VydGFpblJvd3MoKTsNCi0gICAgRlhfQk9PTAkJCVNldENvbFJvd0FjdHVhbFNpemUoQ0ZXTF9HcmlkQ29sUm93ICpwQ29sUm93LCBGWF9GTE9BVCBmU2l6ZSwgRlhfQk9PTCBiU2V0QmV5b25kID0gRkFMU0UpOw0KLSAgICBGWF9GTE9BVAkJU2V0V2lkZ2V0QWN0dWFsV2lkdGgoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8sIEZYX0ZMT0FUIGZXaWR0aCk7DQotICAgIEZYX0ZMT0FUCQlTZXRXaWRnZXRBY3R1YWxIZWlnaHQoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyAqcEluZm8sIEZYX0ZMT0FUIGZIZWlnaHQpOw0KLSAgICB2b2lkCQkJU2V0QWxsV2lkZ2V0c1JlY3QoKTsNCi0gICAgRlhfQk9PTAkJCUlzR3JpZChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZvaWQJCQlTZXRTcGFuQXV0b0NvbFJvd1NpemUoY29uc3QgQ0ZYX1B0ckFycmF5ICZzcGFuQXV0b3MsIEZYX0ZMT0FUIGZUb3RhbFNpemUpOw0KLSAgICB2b2lkCQkJU2V0U3BhblNjYWxlZENvbFJvd1NpemUoY29uc3QgQ0ZYX1B0ckFycmF5ICZzcGFuU2NhbGVkcywgRlhfRkxPQVQgZlRvdGFsU2l6ZSwgRlhfRkxPQVQgZlRvdGFsU2NhbGVkTnVtKTsNCi0gICAgdm9pZAkJCVNldFNjYWxlZENvbFJvd3NTaXplKGNvbnN0IENGWF9QdHJBcnJheSAmc3BhblNjYWxlZHMsIEZYX0ZMT0FUIGZUb3RhbFNpemUsIEZYX0ZMT0FUIGZUb3RhbFNjYWxlZE51bSk7DQotICAgIENGWF9QdHJBcnJheQkJCQltX1Jvd3M7DQotICAgIENGWF9QdHJBcnJheQkJCQltX0NvbHVtbnM7DQotICAgIENGWF9QdHJBcnJheQkJCQltX1dpZGdldHM7DQotICAgIENGWF9NYXBQdHJUb1B0cgkJCQltX21hcFdpZGdldEluZm87DQotICAgIENGV0xfR3JpZExlbmd0aAkJCQltX1NpemVbNl07DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX0dyaWREZWxlZ2F0ZTsNCisgIHZpcnR1YWwgRldMX0VSUiBJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBDaGlsZCwgaW50MzJfdCBuSW5kZXggPSAtMSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgUmVtb3ZlV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRldMX0hHUklEQ09MUk9XIEluc2VydENvbFJvdyhGWF9CT09MIGJDb2x1bW4sIGludDMyX3QgbkluZGV4ID0gLTEpOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50Q29sUm93cyhGWF9CT09MIGJDb2x1bW4pOw0KKyAgdmlydHVhbCBGV0xfSEdSSURDT0xST1cgR2V0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgaW50MzJfdCBuSW5kZXgpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEluZGV4KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KTsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUJiBlVW5pdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVbml0KTsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0TWluU2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUJiBlVW5pdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWluU2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVbml0KTsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0TWF4U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUJiBlVW5pdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWF4U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVbml0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEZWxldGVDb2xSb3coRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzQ29sdW1uKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXaWRnZXRQb3MoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYkNvbHVtbik7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0UG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbHVtbik7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3BhbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbHVtbik7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldFdpZGdldFNpemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURTSVpFIGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCYgZVVuaXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldFNpemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFNJWkUgZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVWl0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTWFyZ2luKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXJnaW4pOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlbW92ZVdpZGdldE1hcmdpbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURNQVJHSU4gZU1hcmdpbik7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEdyaWRTaXplKEZXTF9HUklEU0laRSBlU2l6ZSwgRldMX0dSSURVTklUJiBlVW5pdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0R3JpZFNpemUoRldMX0dSSURTSVpFIGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVWl0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogR2V0V2lkZ2V0SW5mbyhJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2b2lkIFByb2NGaXhlZENvbFJvdyhDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3csDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb2xSb3dTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29sdW1uKTsNCisgIHZvaWQgUHJvY0F1dG9Db2xSb3coQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29sdW1uKTsNCisgIHZvaWQgUHJvY1NjYWxlZENvbFJvdyhDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbFJvd1NpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29sdW1uKTsNCisgIHZvaWQgQ2FsY1dpZGdldFdpZHRoKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8sDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29sdW5tV2lkdGgpOw0KKyAgdm9pZCBDYWxjV2lkZ2V0SGVpZ3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZSb3dIZWlndCk7DQorICBGWF9GTE9BVCBDYWxjQXV0b0NvbHVtbldpZGdldFdpZHRoKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyk7DQorICBGWF9GTE9BVCBDYWxjQXV0b0NvbHVtbldpZGdldEhlaWdodChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvKTsNCisgIEZYX0ZMT0FUIFByb2Nlc3NDb2x1bW5zKEZYX0ZMT0FUIGZXaWR0aCk7DQorICBGWF9GTE9BVCBQcm9jZXNzUm93cyhGWF9GTE9BVCBmSGVpZ2h0KTsNCisgIEZYX0ZMT0FUIFByb2Nlc3NVbkNlcnRhaW5Db2x1bW5zKCk7DQorICBGWF9GTE9BVCBQcm9jZXNzVW5DZXJ0YWluUm93cygpOw0KKyAgRlhfQk9PTCBTZXRDb2xSb3dBY3R1YWxTaXplKENGV0xfR3JpZENvbFJvdyogcENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXRCZXlvbmQgPSBGQUxTRSk7DQorICBGWF9GTE9BVCBTZXRXaWRnZXRBY3R1YWxXaWR0aChDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbywgRlhfRkxPQVQgZldpZHRoKTsNCisgIEZYX0ZMT0FUIFNldFdpZGdldEFjdHVhbEhlaWdodChDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbywgRlhfRkxPQVQgZkhlaWdodCk7DQorICB2b2lkIFNldEFsbFdpZGdldHNSZWN0KCk7DQorICBGWF9CT09MIElzR3JpZChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2b2lkIFNldFNwYW5BdXRvQ29sUm93U2l6ZShjb25zdCBDRlhfUHRyQXJyYXkmIHNwYW5BdXRvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUb3RhbFNpemUpOw0KKyAgdm9pZCBTZXRTcGFuU2NhbGVkQ29sUm93U2l6ZShjb25zdCBDRlhfUHRyQXJyYXkmIHNwYW5TY2FsZWRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVG90YWxTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVG90YWxTY2FsZWROdW0pOw0KKyAgdm9pZCBTZXRTY2FsZWRDb2xSb3dzU2l6ZShjb25zdCBDRlhfUHRyQXJyYXkmIHNwYW5TY2FsZWRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVG90YWxTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVG90YWxTY2FsZWROdW0pOw0KKyAgQ0ZYX1B0ckFycmF5IG1fUm93czsNCisgIENGWF9QdHJBcnJheSBtX0NvbHVtbnM7DQorICBDRlhfUHRyQXJyYXkgbV9XaWRnZXRzOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fbWFwV2lkZ2V0SW5mbzsNCisgIENGV0xfR3JpZExlbmd0aCBtX1NpemVbNl07DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9HcmlkRGVsZWdhdGU7DQogfTsNCi1jbGFzcyBDRldMX0dyaWREZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9HcmlkRGVsZWdhdGUoQ0ZXTF9HcmlkSW1wICpwT3duZXIpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGV0xfR3JpZEltcCAqbV9wT3duZXI7DQorY2xhc3MgQ0ZXTF9HcmlkRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfR3JpZERlbGVnYXRlKENGV0xfR3JpZEltcCogcE93bmVyKTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX0dyaWRJbXAqIG1fcE93bmVyOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oCmluZGV4IGNjOTRiMzcuLjFjMGU5MjIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgKQEAgLTE3LDE0MyArMTcsMTM1IEBACiBjbGFzcyBDRldMX0V2ZW50VGFyZ2V0Ow0KIGNsYXNzIENGV0xfVG9vbFRpcENvbnRhaW5lcjsNCiANCi1jbGFzcyBDRldMX05vdGVMb29wDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Ob3RlTG9vcChDRldMX1dpZGdldEltcCAqcEZvcm0gPSBOVUxMKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9Ob3RlTG9vcCgpIHt9DQotICAgIHZpcnR1YWwgRlhfQk9PTCBQcmVQcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCUlkbGUoaW50MzJfdCBjb3VudCk7DQotICAgIENGV0xfV2lkZ2V0SW1wKglHZXRGb3JtKCk7DQotICAgIEZYX0JPT0wJQ29udGludWVNb2RhbCgpOw0KLSAgICBGV0xfRVJSCUVuZE1vZGFsTG9vcCgpOw0KLSAgICBGWF9CT09MIFRyYW5zbGF0ZUFjY2VsZXJhdG9yKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KLSAgICBGV0xfRVJSCVNldE1haW5Gb3JtKENGV0xfV2lkZ2V0SW1wICpwRm9ybSk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkIEdlbmVyYXRlQ29tbW9uZEV2ZW50KEZYX0RXT1JEIGR3Q29tbWFuZCk7DQorY2xhc3MgQ0ZXTF9Ob3RlTG9vcCB7DQorIHB1YmxpYzoNCisgIENGV0xfTm90ZUxvb3AoQ0ZXTF9XaWRnZXRJbXAqIHBGb3JtID0gTlVMTCk7DQorICB2aXJ0dWFsIH5DRldMX05vdGVMb29wKCkge30NCisgIHZpcnR1YWwgRlhfQk9PTCBQcmVQcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBJZGxlKGludDMyX3QgY291bnQpOw0KKyAgQ0ZXTF9XaWRnZXRJbXAqIEdldEZvcm0oKTsNCisgIEZYX0JPT0wgQ29udGludWVNb2RhbCgpOw0KKyAgRldMX0VSUiBFbmRNb2RhbExvb3AoKTsNCisgIEZYX0JPT0wgVHJhbnNsYXRlQWNjZWxlcmF0b3IoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICBGV0xfRVJSIFNldE1haW5Gb3JtKENGV0xfV2lkZ2V0SW1wKiBwRm9ybSk7DQogDQotICAgIENGV0xfV2lkZ2V0SW1wCSptX3BGb3JtOw0KLSAgICBGWF9CT09MCQkJbV9iQ29udGludWVNb2RhbDsNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBHZW5lcmF0ZUNvbW1vbmRFdmVudChGWF9EV09SRCBkd0NvbW1hbmQpOw0KKw0KKyAgQ0ZXTF9XaWRnZXRJbXAqIG1fcEZvcm07DQorICBGWF9CT09MIG1fYkNvbnRpbnVlTW9kYWw7DQogfTsNCi1jbGFzcyBDRldMX05vdGVEcml2ZXINCi17DQotcHVibGljOg0KLSAgICBDRldMX05vdGVEcml2ZXIoKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9Ob3RlRHJpdmVyKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2VuZE5vdGUoQ0ZXTF9Ob3RlICpwTm90ZSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUG9zdE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJUmVnaXN0ZXJFdmVudFRhcmdldChJRldMX1dpZGdldCAqcExpc3RlbmVyLCBJRldMX1dpZGdldCAqcEV2ZW50U291cmNlID0gTlVMTCwgRlhfRFdPUkQgZHdGaWx0ZXIgPSBGV0xfRVZFTlRfQUxMX01BU0spOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVVucmVnaXN0ZXJFdmVudFRhcmdldChJRldMX1dpZGdldCAqcExpc3RlbmVyKTsNCi0gICAgdmlydHVhbAl2b2lkCQlDbGVhckV2ZW50VGFyZ2V0cyhGWF9CT09MIGJSZW1vdmVBbGwpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJR2V0UXVldWVNYXhTaXplKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJU2V0UXVldWVNYXhTaXplKGNvbnN0IGludDMyX3Qgc2l6ZSk7DQotICAgIHZpcnR1YWwgSUZXTF9Ob3RlVGhyZWFkKiBHZXRPd25lclRocmVhZCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVB1c2hOb3RlTG9vcChJRldMX05vdGVMb29wICpwTm90ZUxvb3ApOw0KLSAgICB2aXJ0dWFsIElGV0xfTm90ZUxvb3AqIFBvcE5vdGVMb29wKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0Rm9jdXMoSUZXTF9XaWRnZXQgKnBGb2N1cywgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCVJ1bigpOw0KLSAgICBJRldMX1dpZGdldCoJCUdldEZvY3VzKCk7DQotICAgIElGV0xfV2lkZ2V0KgkJR2V0SG92ZXIoKTsNCi0gICAgdm9pZAkJCQlTZXRIb3ZlcihJRldMX1dpZGdldCAqcEhvdmVyKTsNCi0gICAgdm9pZAkJCQlTZXRHcmFiKElGV0xfV2lkZ2V0ICpwR3JhYiwgRlhfQk9PTCBiU2V0KTsNCi0gICAgdm9pZAkJCQlOb3RpZnlUYXJnZXRIaWRlKElGV0xfV2lkZ2V0ICpwTm90ZVRhcmdldCk7DQotICAgIHZvaWQJCQkJTm90aWZ5VGFyZ2V0RGVzdHJveShJRldMX1dpZGdldCAqcE5vdGVUYXJnZXQpOw0KLSAgICB2b2lkCQkJCU5vdGlmeUZ1bGxTY3JlZW5Nb2RlKElGV0xfV2lkZ2V0ICpwTm90ZVRhcmdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbik7DQotICAgIEZXTF9FUlIJCQkJUmVnaXN0ZXJGb3JtKENGV0xfV2lkZ2V0SW1wICpwRm9ybSk7DQotICAgIEZXTF9FUlIJCQkJVW5SZWdpc3RlckZvcm0oQ0ZXTF9XaWRnZXRJbXAgKnBGb3JtKTsNCi0gICAgRlhfQk9PTAkJCQlRdWV1ZU1lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIEZYX0JPT0wJCQkJVW5xdWV1ZU1lc3NhZ2UoQ0ZXTF9Ob3RlTG9vcCAqcE5vdGVMb29wKTsNCi0gICAgQ0ZXTF9Ob3RlTG9vcCoJCUdldFRvcExvb3AoKTsNCi0gICAgaW50MzJfdCAgICAgICAgICAgIENvdW50TG9vcCgpOw0KLSAgICB2b2lkICAgICAgICAgICAgICAgIFNldEhvb2soRldMTWVzc2FnZUhvb2tDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogaW5mbyk7DQotICAgIEZYX0JPT0wJCQkJUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9CT09MCQkJCURpc3BhdGNoTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKTsNCi0gICAgRlhfQk9PTAkJCQlEb0FjdGl2YXRlKENGV0xfTXNnQWN0aXZhdGUgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pOw0KLSAgICBGWF9CT09MCQkJCURvRGVhY3RpdmF0ZShDRldMX01zZ0RlYWN0aXZhdGUgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pOw0KLSAgICBGWF9CT09MCQkJCURvU2V0Rm9jdXMoQ0ZXTF9Nc2dTZXRGb2N1cyAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSk7DQotICAgIEZYX0JPT0wJCQkJRG9LaWxsRm9jdXMoQ0ZXTF9Nc2dLaWxsRm9jdXMgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pOw0KLSAgICBGWF9CT09MCQkJCURvS2V5KENGV0xfTXNnS2V5ICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKTsNCi0gICAgRlhfQk9PTAkJCQlEb01vdXNlKENGV0xfTXNnTW91c2UgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pOw0KLSAgICBGWF9CT09MCQkJCURvV2hlZWwoQ0ZXTF9Nc2dNb3VzZVdoZWVsICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKTsNCi0gICAgRlhfQk9PTAkJCQlEb1NpemUoQ0ZXTF9Nc2dTaXplICpwTXNnKTsNCi0gICAgRlhfQk9PTAkJCQlEb1dpbmRvd01vdmUoQ0ZXTF9Nc2dXaW5kb3dNb3ZlICpwTXNnLCBJRldMX1dpZGdldCAqcE1lc3NhZ2VGb3JtKTsNCi0gICAgRlhfQk9PTAkJCQlEb0RyYWdGaWxlcyhDRldMX01zZ0Ryb3BGaWxlcyAqcE1zZywgSUZXTF9XaWRnZXQgKnBNZXNzYWdlRm9ybSk7DQotICAgIEZYX0JPT0wJCQkJRG9Nb3VzZUV4KENGV0xfTXNnTW91c2UgKnBNc2csIElGV0xfV2lkZ2V0ICpwTWVzc2FnZUZvcm0pOw0KLSAgICB2b2lkCQkJCU1vdXNlU2Vjb25kYXJ5KENGV0xfTXNnTW91c2UgKnBNc2cpOw0KLSAgICBGWF9CT09MCQkJCUlzVmFsaWRNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KLSAgICBJRldMX1dpZGdldCoJCUdldE1lc3NhZ2VGb3JtKElGV0xfV2lkZ2V0ICpwRHN0VGFyZ2V0KTsNCi0gICAgdm9pZAkJCQlDbGVhckludmFsaWRFdmVudFRhcmdldHMoRlhfQk9PTCBiUmVtb3ZlQWxsKTsNCi0gICAgQ0ZYX1B0ckFycmF5CQltX2Zvcm1zOw0KLSAgICBDRlhfUHRyQXJyYXkJCW1fbm90ZVF1ZXVlOw0KLSAgICBDRlhfUHRyQXJyYXkJCW1fbm90ZUxvb3BRdWV1ZTsNCi0gICAgQ0ZYX01hcFB0clRvUHRyCQltX2V2ZW50VGFyZ2V0czsNCi0gICAgaW50MzJfdAkJCW1fc2VuZEV2ZW50Q2FsbGVkOw0KLSAgICBpbnQzMl90CQkJbV9tYXhTaXplOw0KLSAgICBGWF9CT09MCQkJCW1fYkZ1bGxTY3JlZW47DQotICAgIElGV0xfV2lkZ2V0CQkJKm1fcEhvdmVyOw0KLSAgICBJRldMX1dpZGdldAkJCSptX3BGb2N1czsNCi0gICAgSUZXTF9XaWRnZXQJCQkqbV9wR3JhYjsNCi0gICAgQ0ZXTF9Ob3RlTG9vcAkJKm1fcE5vdGVMb29wOw0KLSAgICBGV0xNZXNzYWdlSG9va0NhbGxiYWNrIG1faG9vazsNCi0gICAgdm9pZCogICAgICAgICAgICAgIG1faG9va0luZm87DQorY2xhc3MgQ0ZXTF9Ob3RlRHJpdmVyIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Ob3RlRHJpdmVyKCk7DQorICB2aXJ0dWFsIH5DRldMX05vdGVEcml2ZXIoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZW5kTm90ZShDRldMX05vdGUqIHBOb3RlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQb3N0TWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBSZWdpc3RlckV2ZW50VGFyZ2V0KElGV0xfV2lkZ2V0KiBwTGlzdGVuZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcEV2ZW50U291cmNlID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmlsdGVyID0gRldMX0VWRU5UX0FMTF9NQVNLKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQqIHBMaXN0ZW5lcik7DQorICB2aXJ0dWFsIHZvaWQgQ2xlYXJFdmVudFRhcmdldHMoRlhfQk9PTCBiUmVtb3ZlQWxsKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRRdWV1ZU1heFNpemUoKSBjb25zdDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRRdWV1ZU1heFNpemUoY29uc3QgaW50MzJfdCBzaXplKTsNCisgIHZpcnR1YWwgSUZXTF9Ob3RlVGhyZWFkKiBHZXRPd25lclRocmVhZCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIFB1c2hOb3RlTG9vcChJRldMX05vdGVMb29wKiBwTm90ZUxvb3ApOw0KKyAgdmlydHVhbCBJRldMX05vdGVMb29wKiBQb3BOb3RlTG9vcCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvY3VzKElGV0xfV2lkZ2V0KiBwRm9jdXMsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBSdW4oKTsNCisgIElGV0xfV2lkZ2V0KiBHZXRGb2N1cygpOw0KKyAgSUZXTF9XaWRnZXQqIEdldEhvdmVyKCk7DQorICB2b2lkIFNldEhvdmVyKElGV0xfV2lkZ2V0KiBwSG92ZXIpOw0KKyAgdm9pZCBTZXRHcmFiKElGV0xfV2lkZ2V0KiBwR3JhYiwgRlhfQk9PTCBiU2V0KTsNCisgIHZvaWQgTm90aWZ5VGFyZ2V0SGlkZShJRldMX1dpZGdldCogcE5vdGVUYXJnZXQpOw0KKyAgdm9pZCBOb3RpZnlUYXJnZXREZXN0cm95KElGV0xfV2lkZ2V0KiBwTm90ZVRhcmdldCk7DQorICB2b2lkIE5vdGlmeUZ1bGxTY3JlZW5Nb2RlKElGV0xfV2lkZ2V0KiBwTm90ZVRhcmdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbik7DQorICBGV0xfRVJSIFJlZ2lzdGVyRm9ybShDRldMX1dpZGdldEltcCogcEZvcm0pOw0KKyAgRldMX0VSUiBVblJlZ2lzdGVyRm9ybShDRldMX1dpZGdldEltcCogcEZvcm0pOw0KKyAgRlhfQk9PTCBRdWV1ZU1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICBGWF9CT09MIFVucXVldWVNZXNzYWdlKENGV0xfTm90ZUxvb3AqIHBOb3RlTG9vcCk7DQorICBDRldMX05vdGVMb29wKiBHZXRUb3BMb29wKCk7DQorICBpbnQzMl90IENvdW50TG9vcCgpOw0KKyAgdm9pZCBTZXRIb29rKEZXTE1lc3NhZ2VIb29rQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIGluZm8pOw0KKyAgRlhfQk9PTCBQcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBEaXNwYXRjaE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSwgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSk7DQorICBGWF9CT09MIERvQWN0aXZhdGUoQ0ZXTF9Nc2dBY3RpdmF0ZSogcE1zZywgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSk7DQorICBGWF9CT09MIERvRGVhY3RpdmF0ZShDRldMX01zZ0RlYWN0aXZhdGUqIHBNc2csIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pOw0KKyAgRlhfQk9PTCBEb1NldEZvY3VzKENGV0xfTXNnU2V0Rm9jdXMqIHBNc2csIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pOw0KKyAgRlhfQk9PTCBEb0tpbGxGb2N1cyhDRldMX01zZ0tpbGxGb2N1cyogcE1zZywgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSk7DQorICBGWF9CT09MIERvS2V5KENGV0xfTXNnS2V5KiBwTXNnLCBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKTsNCisgIEZYX0JPT0wgRG9Nb3VzZShDRldMX01zZ01vdXNlKiBwTXNnLCBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKTsNCisgIEZYX0JPT0wgRG9XaGVlbChDRldMX01zZ01vdXNlV2hlZWwqIHBNc2csIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pOw0KKyAgRlhfQk9PTCBEb1NpemUoQ0ZXTF9Nc2dTaXplKiBwTXNnKTsNCisgIEZYX0JPT0wgRG9XaW5kb3dNb3ZlKENGV0xfTXNnV2luZG93TW92ZSogcE1zZywgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSk7DQorICBGWF9CT09MIERvRHJhZ0ZpbGVzKENGV0xfTXNnRHJvcEZpbGVzKiBwTXNnLCBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKTsNCisgIEZYX0JPT0wgRG9Nb3VzZUV4KENGV0xfTXNnTW91c2UqIHBNc2csIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pOw0KKyAgdm9pZCBNb3VzZVNlY29uZGFyeShDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIEZYX0JPT0wgSXNWYWxpZE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICBJRldMX1dpZGdldCogR2V0TWVzc2FnZUZvcm0oSUZXTF9XaWRnZXQqIHBEc3RUYXJnZXQpOw0KKyAgdm9pZCBDbGVhckludmFsaWRFdmVudFRhcmdldHMoRlhfQk9PTCBiUmVtb3ZlQWxsKTsNCisgIENGWF9QdHJBcnJheSBtX2Zvcm1zOw0KKyAgQ0ZYX1B0ckFycmF5IG1fbm90ZVF1ZXVlOw0KKyAgQ0ZYX1B0ckFycmF5IG1fbm90ZUxvb3BRdWV1ZTsNCisgIENGWF9NYXBQdHJUb1B0ciBtX2V2ZW50VGFyZ2V0czsNCisgIGludDMyX3QgbV9zZW5kRXZlbnRDYWxsZWQ7DQorICBpbnQzMl90IG1fbWF4U2l6ZTsNCisgIEZYX0JPT0wgbV9iRnVsbFNjcmVlbjsNCisgIElGV0xfV2lkZ2V0KiBtX3BIb3ZlcjsNCisgIElGV0xfV2lkZ2V0KiBtX3BGb2N1czsNCisgIElGV0xfV2lkZ2V0KiBtX3BHcmFiOw0KKyAgQ0ZXTF9Ob3RlTG9vcCogbV9wTm90ZUxvb3A7DQorICBGV0xNZXNzYWdlSG9va0NhbGxiYWNrIG1faG9vazsNCisgIHZvaWQqIG1faG9va0luZm87DQogfTsNCiB0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTx2b2lkKiwgRlhfRFdPUkQ+IENGV0xfRXZlbnRTb3VyY2U7DQotY2xhc3MgQ0ZXTF9FdmVudFRhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfRXZlbnRUYXJnZXQoQ0ZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciwgSUZXTF9XaWRnZXQgKnBMaXN0ZW5lcikNCi0gICAgICAgIDogbV9wTm90ZURyaXZlcihwTm90ZURyaXZlcikNCi0gICAgICAgICwgbV9wTGlzdGVuZXIocExpc3RlbmVyKQ0KLSAgICAgICAgLCBtX2JJbnZhbGlkKEZBTFNFKQ0KLSAgICB7DQotICAgIH0NCi0gICAgfkNGV0xfRXZlbnRUYXJnZXQoKTsNCi0gICAgaW50MzJfdCBTZXRFdmVudFNvdXJjZShJRldMX1dpZGdldCAqcFNvdXJjZSwgRlhfRFdPUkQgZHdGaWx0ZXIgPSBGV0xfRVZFTlRfQUxMX01BU0spOw0KLSAgICBGWF9CT09MICBQcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCi0gICAgRlhfQk9PTCAgSXNGaWx0ZXJFdmVudChDRldMX0V2ZW50ICpwRXZlbnQsIEZYX0RXT1JEIGR3RmlsdGVyKTsNCi0gICAgRlhfQk9PTAkgSXNJbnZhbGlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fYkludmFsaWQ7DQotICAgIH0NCi0gICAgdm9pZAkgRmxhZ0ludmFsaWQoKQ0KLSAgICB7DQotICAgICAgICBtX2JJbnZhbGlkID0gVFJVRTsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgQ0ZXTF9FdmVudFNvdXJjZSBtX2V2ZW50U291cmNlczsNCi0gICAgSUZXTF9XaWRnZXQgKm1fcExpc3RlbmVyOw0KLSAgICBDRldMX05vdGVEcml2ZXIgKm1fcE5vdGVEcml2ZXI7DQotICAgIEZYX0JPT0wJbV9iSW52YWxpZDsNCitjbGFzcyBDRldMX0V2ZW50VGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZXTF9FdmVudFRhcmdldChDRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyLCBJRldMX1dpZGdldCogcExpc3RlbmVyKQ0KKyAgICAgIDogbV9wTm90ZURyaXZlcihwTm90ZURyaXZlciksIG1fcExpc3RlbmVyKHBMaXN0ZW5lciksIG1fYkludmFsaWQoRkFMU0UpIHt9DQorICB+Q0ZXTF9FdmVudFRhcmdldCgpOw0KKyAgaW50MzJfdCBTZXRFdmVudFNvdXJjZShJRldMX1dpZGdldCogcFNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGaWx0ZXIgPSBGV0xfRVZFTlRfQUxMX01BU0spOw0KKyAgRlhfQk9PTCBQcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIEZYX0JPT0wgSXNGaWx0ZXJFdmVudChDRldMX0V2ZW50KiBwRXZlbnQsIEZYX0RXT1JEIGR3RmlsdGVyKTsNCisgIEZYX0JPT0wgSXNJbnZhbGlkKCkgeyByZXR1cm4gbV9iSW52YWxpZDsgfQ0KKyAgdm9pZCBGbGFnSW52YWxpZCgpIHsgbV9iSW52YWxpZCA9IFRSVUU7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9FdmVudFNvdXJjZSBtX2V2ZW50U291cmNlczsNCisgIElGV0xfV2lkZ2V0KiBtX3BMaXN0ZW5lcjsNCisgIENGV0xfTm90ZURyaXZlciogbV9wTm90ZURyaXZlcjsNCisgIEZYX0JPT0wgbV9iSW52YWxpZDsNCiB9Ow0KLWNsYXNzIENGV0xfVG9vbFRpcENvbnRhaW5lcg0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBDRldMX1Rvb2xUaXBDb250YWluZXIqIGdldEluc3RhbmNlKCk7DQotICAgIHN0YXRpYyB2b2lkIERlbGV0ZUluc3RhbmNlKCk7DQorY2xhc3MgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyIHsNCisgcHVibGljOg0KKyAgc3RhdGljIENGV0xfVG9vbFRpcENvbnRhaW5lciogZ2V0SW5zdGFuY2UoKTsNCisgIHN0YXRpYyB2b2lkIERlbGV0ZUluc3RhbmNlKCk7DQogDQotICAgIEZYX0VSUgkJQWRkVG9vbFRpcFRhcmdldChJRldMX1Rvb2xUaXBUYXJnZXQgKnBUYXJnZXQpOw0KLSAgICBGWF9FUlIJCVJlbW92ZVRvb2xUaXBUYXJnZXQoSUZXTF9Ub29sVGlwVGFyZ2V0ICpwVGFyZ2V0KTsNCi0gICAgSUZXTF9Ub29sVGlwVGFyZ2V0KiBHZXRDdXJyZW50VG9vbFRpcFRhcmdldCgpOw0KKyAgRlhfRVJSIEFkZFRvb2xUaXBUYXJnZXQoSUZXTF9Ub29sVGlwVGFyZ2V0KiBwVGFyZ2V0KTsNCisgIEZYX0VSUiBSZW1vdmVUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCogcFRhcmdldCk7DQorICBJRldMX1Rvb2xUaXBUYXJnZXQqIEdldEN1cnJlbnRUb29sVGlwVGFyZ2V0KCk7DQogDQotICAgIEZYX0JPT0wgSGFzVG9vbFRpcChJRldMX1dpZGdldCAqcFdpZGdldCk7DQorICBGWF9CT09MIEhhc1Rvb2xUaXAoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KIA0KLSAgICBGWF9CT09MIFByb2Nlc3NFbnRlcihDRldMX0V2dE1vdXNlICpwRXZ0LCBJRldMX1dpZGdldCAqcE93bmVyKTsNCi0gICAgRlhfQk9PTCBQcm9jZXNzTGVhdmUoQ0ZXTF9FdnRNb3VzZSAqcEV2dCk7DQorICBGWF9CT09MIFByb2Nlc3NFbnRlcihDRldMX0V2dE1vdXNlKiBwRXZ0LCBJRldMX1dpZGdldCogcE93bmVyKTsNCisgIEZYX0JPT0wgUHJvY2Vzc0xlYXZlKENGV0xfRXZ0TW91c2UqIHBFdnQpOw0KIA0KLSAgICBGWF9FUlIgIFNldFRvb2xUaXBJbml0aWFsRGVsYXkoaW50MzJfdCBpRGVsYXlUaW1lKTsNCi0gICAgRlhfRVJSICBTZXRUb29sVGlwQXV0b1BvcERlbGF5KGludDMyX3QgaURlbGF5VGltZSk7DQorICBGWF9FUlIgU2V0VG9vbFRpcEluaXRpYWxEZWxheShpbnQzMl90IGlEZWxheVRpbWUpOw0KKyAgRlhfRVJSIFNldFRvb2xUaXBBdXRvUG9wRGVsYXkoaW50MzJfdCBpRGVsYXlUaW1lKTsNCiANCi1wcm90ZWN0ZWQ6DQotICAgIENGV0xfVG9vbFRpcENvbnRhaW5lcigpOw0KLSAgICB2aXJ0dWFsIH5DRldMX1Rvb2xUaXBDb250YWluZXIoKTsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyKCk7DQorICB2aXJ0dWFsIH5DRldMX1Rvb2xUaXBDb250YWluZXIoKTsNCiANCi0gICAgSUZXTF9Ub29sVGlwVGFyZ2V0CQkqcEN1clRhcmdldDsNCi0gICAgQ0ZXTF9Ub29sVGlwSW1wCQkJKm1fcFRvb2xUaXBJbXA7DQotICAgIENGV0xfQ29yZVRvb3BUaXBEUAkJKm1fVG9vbFRpcERwOw0KLSAgICBDRlhfUHRyQXJyYXkJCQltX2FycldpZGdldDsNCisgIElGV0xfVG9vbFRpcFRhcmdldCogcEN1clRhcmdldDsNCisgIENGV0xfVG9vbFRpcEltcCogbV9wVG9vbFRpcEltcDsNCisgIENGV0xfQ29yZVRvb3BUaXBEUCogbV9Ub29sVGlwRHA7DQorICBDRlhfUHRyQXJyYXkgbV9hcnJXaWRnZXQ7DQogDQotcHJpdmF0ZToNCi0gICAgc3RhdGljIENGV0xfVG9vbFRpcENvbnRhaW5lciogc19wSW5zdGFuY2U7DQorIHByaXZhdGU6DQorICBzdGF0aWMgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyKiBzX3BJbnN0YW5jZTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9wYW5lbGltcC5oCmluZGV4IGJkYWY4YmQuLjUwOGM0YmIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmgKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfcGFuZWxpbXAuaApAQCAtMTEsMTkgKzExLDIwIEBACiBjbGFzcyBJRldMX1dpZGdldDsNCiBjbGFzcyBJRldMX0NvbnRlbnQ7DQogY2xhc3MgQ0ZXTF9QYW5lbEltcDsNCi1jbGFzcyBDRldMX1BhbmVsSW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9QYW5lbEltcChJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIENGV0xfUGFuZWxJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIHZpcnR1YWwgfkNGV0xfUGFuZWxJbXAoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJCVVwZGF0ZSgpOw0KLSAgICB2aXJ0dWFsIElGV0xfQ29udGVudCoJR2V0Q29udGVudCgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQlTZXRDb250ZW50KElGV0xfQ29udGVudCAqcENvbnRlbnQpOw0KLXByb3RlY3RlZDoNCi0gICAgSUZXTF9Db250ZW50CQkJKm1fcENvbnRlbnQ7DQorY2xhc3MgQ0ZXTF9QYW5lbEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfUGFuZWxJbXAoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgQ0ZXTF9QYW5lbEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBOVUxMKTsNCisgIHZpcnR1YWwgfkNGV0xfUGFuZWxJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgdmlydHVhbCBJRldMX0NvbnRlbnQqIEdldENvbnRlbnQoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRDb250ZW50KElGV0xfQ29udGVudCogcENvbnRlbnQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX0NvbnRlbnQqIG1fcENvbnRlbnQ7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oCmluZGV4IDNiMGI3YzMuLjNkZDNmNmEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oCkBAIC03LDI2ICs3LDI1IEBACiAjaWZuZGVmIF9GV0xfVEFSR0VUX0lNUF9IDQogI2RlZmluZSBfRldMX1RBUkdFVF9JTVBfSA0KIGNsYXNzIElGV0xfVGFyZ2V0Ow0KLWNsYXNzIENGV0xfVGFyZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJUmVsZWFzZSgpOw0KLSAgICB2aXJ0dWFsIElGV0xfVGFyZ2V0KglSZXRhaW4oKTsNCi0gICAgdmlydHVhbAlGWF9EV09SRAkJR2V0UmVmQ291bnQoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Q7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCUluaXRpYWxpemUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJRmluYWxpemUoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGV0xfVGFyZ2V0KCk7DQotICAgIHZpcnR1YWwgfkNGV0xfVGFyZ2V0KCk7DQotICAgIEZYX0RXT1JECW1fZHdSZWZDb3VudDsNCitjbGFzcyBDRldMX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRlhfRFdPUkQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCBJRldMX1RhcmdldCogUmV0YWluKCk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldFJlZkNvdW50KCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIElzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9UYXJnZXQoKTsNCisgIHZpcnR1YWwgfkNGV0xfVGFyZ2V0KCk7DQorICBGWF9EV09SRCBtX2R3UmVmQ291bnQ7DQogfTsNCi1jbGFzcyBJRldMX1RhcmdldERhdGEgOiBwdWJsaWMgSUZXTF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICB2b2lkKiBHZXREYXRhKCk7DQotICAgIHZvaWQJICBTZXREYXRhKHZvaWQqIHBEYXRhKTsNCitjbGFzcyBJRldMX1RhcmdldERhdGEgOiBwdWJsaWMgSUZXTF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICB2b2lkKiBHZXREYXRhKCk7DQorICB2b2lkIFNldERhdGEodm9pZCogcERhdGEpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90aHJlYWRpbXAuaAppbmRleCAyNmFjYzU0Li43MzU3MDhkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90aHJlYWRpbXAuaAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90aHJlYWRpbXAuaApAQCAtMTMsNDEgKzEzLDM0IEBACiBjbGFzcyBDRldMX1RocmVhZDsNCiBjbGFzcyBDRldMX05vdGVUaHJlYWQ7DQogY2xhc3MgQ0ZXTF9Db250cm9sVGhyZWFkOw0KLWNsYXNzIENGV0xfVGhyZWFkDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9UaHJlYWQoKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9UaHJlYWQoKTsNCi0gICAgdmlydHVhbCB2b2lkCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgUnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpOw0KK2NsYXNzIENGV0xfVGhyZWFkIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9UaHJlYWQoKTsNCisgIHZpcnR1YWwgfkNGV0xfVGhyZWFkKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRldMX0VSUiBSdW4oRldMX0hUSFJFQUQgaFRocmVhZCk7DQogfTsNCi1jbGFzcyBDRldMX0NvbnRyb2xUaHJlYWQgOiBwdWJsaWMgQ0ZXTF9UaHJlYWQNCi17DQotcHVibGljOg0KLSAgICBDRldMX0NvbnRyb2xUaHJlYWQoSUZXTF9UaHJlYWQgKiBkZWZIYW5kbGVyKQ0KLSAgICB7DQotICAgICAgICBfZGVmSGFuZGxlciA9IGRlZkhhbmRsZXI7DQotICAgIH0NCi0gICAgdmlydHVhbCB+Q0ZXTF9Db250cm9sVGhyZWFkKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUiBSdW4oRldMX0hUSFJFQUQgaFRocmVhZCk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX1RocmVhZCAqCV9kZWZIYW5kbGVyOw0KK2NsYXNzIENGV0xfQ29udHJvbFRocmVhZCA6IHB1YmxpYyBDRldMX1RocmVhZCB7DQorIHB1YmxpYzoNCisgIENGV0xfQ29udHJvbFRocmVhZChJRldMX1RocmVhZCogZGVmSGFuZGxlcikgeyBfZGVmSGFuZGxlciA9IGRlZkhhbmRsZXI7IH0NCisgIHZpcnR1YWwgfkNGV0xfQ29udHJvbFRocmVhZCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJ1bihGV0xfSFRIUkVBRCBoVGhyZWFkKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9UaHJlYWQqIF9kZWZIYW5kbGVyOw0KIH07DQotY2xhc3MgQ0ZXTF9Ob3RlVGhyZWFkIDogcHVibGljIENGV0xfVGhyZWFkDQotew0KLXB1YmxpYzoNCi0gICAgQ0ZXTF9Ob3RlVGhyZWFkKCk7DQotICAgIHZpcnR1YWwgfkNGV0xfTm90ZVRocmVhZCgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIgUnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpOw0KLSAgICB2aXJ0dWFsIElGV0xfTm90ZURyaXZlciogR2V0Tm90ZURyaXZlcigpOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZXTF9Ob3RlRHJpdmVyCQkqbV9wTm90ZURyaXZlcjsNCi0gICAgRldMX0hUSFJFQUQJCQkgbV9oVGhyZWFkOw0KLSAgICBzdGF0aWMgQ0ZXTF9Db250cm9sVGhyZWFkCSAqCV9hc3Npc3RhbnRUaHJlYWRIYW5kbGVyOw0KLSAgICBzdGF0aWMgRldMX0hUSFJFQUQJCQkJX2Fzc2lzdGFudFRocmVhZDsNCi0gICAgc3RhdGljIGludDMyX3QJCQkJCV9yZWZDb3VudDsNCitjbGFzcyBDRldMX05vdGVUaHJlYWQgOiBwdWJsaWMgQ0ZXTF9UaHJlYWQgew0KKyBwdWJsaWM6DQorICBDRldMX05vdGVUaHJlYWQoKTsNCisgIHZpcnR1YWwgfkNGV0xfTm90ZVRocmVhZCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJ1bihGV0xfSFRIUkVBRCBoVGhyZWFkKTsNCisgIHZpcnR1YWwgSUZXTF9Ob3RlRHJpdmVyKiBHZXROb3RlRHJpdmVyKCk7DQorDQorIHByb3RlY3RlZDoNCisgIENGV0xfTm90ZURyaXZlciogbV9wTm90ZURyaXZlcjsNCisgIEZXTF9IVEhSRUFEIG1faFRocmVhZDsNCisgIHN0YXRpYyBDRldMX0NvbnRyb2xUaHJlYWQqIF9hc3Npc3RhbnRUaHJlYWRIYW5kbGVyOw0KKyAgc3RhdGljIEZXTF9IVEhSRUFEIF9hc3Npc3RhbnRUaHJlYWQ7DQorICBzdGF0aWMgaW50MzJfdCBfcmVmQ291bnQ7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oCmluZGV4IGZhNTIzZjMuLmYzMmY3ZTEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oCkBAIC0xNSwxMTUgKzE1LDE1MCBAQAogY2xhc3MgSUZXTF9EYXRhUHJvdmlkZXI7DQogY2xhc3MgSUZXTF9XaWRnZXREZWxlZ2F0ZTsNCiBjbGFzcyBDRldMX1dpZGdldEltcDsNCi1jbGFzcyBDRldMX1dpZGdldEltcCA6IHB1YmxpYyBDRldMX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRldMX0VSUgkJSW5pdGlhbGl6ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUZpbmFsaXplKCk7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXAgOiBwdWJsaWMgQ0ZXTF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQogDQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYgJnJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldEdsb2JhbFJlY3QoQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRXaWRnZXRSZWN0KGNvbnN0IENGWF9SZWN0RiAmcmVjdCk7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJR2V0Q2xpZW50UmVjdChDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2aXJ0dWFsCUlGV0xfV2lkZ2V0KiBHZXRQYXJlbnQoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkgU2V0UGFyZW50KElGV0xfV2lkZ2V0ICpwUGFyZW50KTsNCi0gICAgdmlydHVhbAlJRldMX1dpZGdldCogR2V0T3duZXIoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkgU2V0T3duZXIoSUZXTF9XaWRnZXQgKnBPd25lcik7DQotICAgIHZpcnR1YWwgSUZXTF9XaWRnZXQqIEdldE91dGVyKCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3R5bGVzKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJTW9kaWZ5U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzQWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzUmVtb3ZlZCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0U3R5bGVzRXgoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRTdGF0ZXMoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwgdm9pZCogcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKTsNCi0gICAgdmlydHVhbCB2b2lkKglHZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpOw0KLSAgICB2aXJ0dWFsCUZXTF9FUlIJCVVwZGF0ZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUxvY2tVcGRhdGUoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlVbmxvY2tVcGRhdGUoKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRAlIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJVHJhbnNmb3JtVG8oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZydCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJR2V0TWF0cml4KENGWF9NYXRyaXggJm1hdHJpeCwgRlhfQk9PTCBiR2xvYmFsID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCURyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi0gICAgdmlydHVhbCBJRldMX1RoZW1lUHJvdmlkZXIqCUdldFRoZW1lUHJvdmlkZXIoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJCVNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWVQcm92aWRlcik7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCQlTZXREYXRhUHJvdmlkZXIoSUZXTF9EYXRhUHJvdmlkZXIgKnBEYXRhUHJvdmlkZXIpOw0KLSAgICB2aXJ0dWFsIElGV0xfV2lkZ2V0RGVsZWdhdGUqU2V0RGVsZWdhdGUoSUZXTF9XaWRnZXREZWxlZ2F0ZSAqcERlbGVnYXRlKTsNCi0gICAgdmlydHVhbAlJRldMX05vdGVUaHJlYWQqCUdldE93bmVyVGhyZWFkKCkgY29uc3Q7DQotICAgIEZXTF9FUlIJCQkJU2V0T3duZXJUaHJlYWQoQ0ZXTF9Ob3RlVGhyZWFkICpwT3duZXJUaHJlYWQpOw0KLSAgICBGV0xfRVJSCQkJCUdldFByb3BlcnRpZXMoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzKTsNCi0gICAgRldMX0VSUgkJCQlTZXRQcm9wZXJ0aWVzKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcyk7DQotICAgIElGV0xfV2lkZ2V0KgkJR2V0SW50ZXJmYWNlKCk7DQotICAgIHZvaWQJCQkJU2V0SW50ZXJmYWNlKElGV0xfV2lkZ2V0ICpwSW50ZXJmYWNlKTsNCi0gICAgQ0ZYX1NpemVGCQkJR2V0T2Zmc2V0RnJvbVBhcmVudChJRldMX1dpZGdldCAqcFBhcmVudCk7DQotcHJvdGVjdGVkOg0KLSAgICBDRldMX1dpZGdldEltcChJRldMX1dpZGdldCAqcE91dGVyID0gTlVMTCk7DQotICAgIENGV0xfV2lkZ2V0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyAmcHJvcGVydGllcywgSUZXTF9XaWRnZXQgKnBPdXRlciA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIH5DRldMX1dpZGdldEltcCgpOw0KLSAgICBGWF9CT09MCUlzRW5hYmxlZCgpOw0KLSAgICBGWF9CT09MCUlzVmlzaWJsZSgpOw0KLSAgICBGWF9CT09MIElzQWN0aXZlKCk7DQotICAgIEZYX0JPT0wgSXNPdmVyTGFwcGVyKCk7DQotICAgIEZYX0JPT0wgSXNQb3B1cCgpOw0KLSAgICBGWF9CT09MIElzQ2hpbGQoKTsNCi0gICAgRlhfQk9PTAlJc0xvY2tlZCgpOw0KLSAgICBGWF9CT09MIElzT2Zmc2NyZWVuKCk7DQotICAgIEZYX0JPT0wJSGFzQm9yZGVyKCk7DQotICAgIEZYX0JPT0wJSGFzRWRnZSgpOw0KLSAgICB2b2lkCQlHZXRFZGdlUmVjdChDRlhfUmVjdEYgJnJ0RWRnZSk7DQotICAgIEZYX0ZMT0FUCUdldEJvcmRlclNpemUoRlhfQk9PTCBiQ1ggPSBUUlVFKTsNCi0gICAgRlhfRkxPQVQJR2V0RWRnZVdpZHRoKCk7DQotICAgIHZvaWQJCUdldFJlbGF0aXZlUmVjdChDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2b2lkKglHZXRUaGVtZUNhcGFjaXR5KEZYX0RXT1JEIGR3Q2FwYWNpdHkpOw0KLSAgICBJRldMX1RoZW1lUHJvdmlkZXIqIEdldEF2YWlsYWJsZVRoZW1lKCk7DQotICAgIENGV0xfV2lkZ2V0SW1wKglHZXRSb290T3V0ZXIoKTsNCi0gICAgQ0ZXTF9XaWRnZXRJbXAqCUdldFNhbWVBbmNlc3RvcihDRldMX1dpZGdldEltcCAqcFdpZGdldCk7DQotICAgIENGWF9TaXplRglHZXRPZmZzZXRGcm9tQW5jZXN0b3IoQ0ZXTF9XaWRnZXRJbXAgKnBBbmNlc3Rvcik7DQotICAgIEZYX0JPT0wJCVRyYW5zZm9ybVRvT3V0ZXIoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpOw0KLSAgICBGWF9CT09MCQlUcmFuc2Zvcm1Gcm9tT3V0ZXIoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpOw0KLSAgICBDRlhfU2l6ZUYJQ2FsY1RleHRTaXplKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBGWF9CT09MIGJNdWx0aUxpbmUgPSBGQUxTRSwgaW50MzJfdCBpTGluZVdpZHRoID0gLTEpOw0KLSAgICB2b2lkCQlDYWxjVGV4dFJlY3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUsIEZYX0RXT1JEIGR3VFRPU3R5bGVzLCBpbnQzMl90IGlUVE9BbGlnbiwgQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgdm9pZAkJU2V0Rm9jdXMoRlhfQk9PTCBiRm9jdXMpOw0KLSAgICB2b2lkCQlTZXRHcmFiKEZYX0JPT0wgYlNldCk7DQotICAgIEZYX0JPT0wJCUdldFBvcHVwUG9zKEZYX0ZMT0FUIGZNaW5IZWlnaHQsIEZYX0ZMT0FUIGZNYXhIZWlnaHQsIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCk7DQotICAgIEZYX0JPT0wJCUdldFBvcHVwUG9zTWVudShGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApOw0KLSAgICBGWF9CT09MCQlHZXRQb3B1cFBvc0NvbWJvQm94KEZYX0ZMT0FUIGZNaW5IZWlnaHQsIEZYX0ZMT0FUIGZNYXhIZWlnaHQsIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCk7DQotICAgIEZYX0JPT0wJCUdldFBvcHVwUG9zR2VuZXJhbChGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApOw0KLSAgICBGWF9CT09MCQlHZXRTY3JlZW5TaXplKEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KTsNCi0gICAgdm9pZAkJUmVnaXN0ZXJFdmVudFRhcmdldChJRldMX1dpZGdldCAqcEV2ZW50U291cmNlID0gTlVMTCwgRlhfRFdPUkQgZHdGaWx0ZXIgPSBGV0xfRVZFTlRfQUxMX01BU0spOw0KLSAgICB2b2lkCQlVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoKTsNCi0gICAgdm9pZAkJRGlzcGF0Y2hLZXlFdmVudChDRldMX01zZ0tleSAqcE5vdGUpOw0KLSAgICB2b2lkCQlEaXNwYXRjaEV2ZW50KENGV0xfRXZlbnQgKnBFdmVudCk7DQotICAgIHZvaWQJCVJlcGFpbnQoY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCA9IE5VTEwpOw0KLSAgICB2b2lkCQlEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgaW50MzJfdCBpUGFydEJrLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCQlEcmF3Qm9yZGVyKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBpbnQzMl90IGlQYXJ0Qm9yZGVyLCBJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLSAgICB2b2lkCQlEcmF3RWRnZShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgaW50MzJfdCBpUGFydEVkZ2UsIElGV0xfVGhlbWVQcm92aWRlciAqcFRoZW1lLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotICAgIHZvaWQJCU5vdGlmeURyaXZlcigpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRHbG9iYWxSZWN0KENGWF9SZWN0RiYgcmVjdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsaWVudFJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgSUZXTF9XaWRnZXQqIEdldFBhcmVudCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFBhcmVudChJRldMX1dpZGdldCogcFBhcmVudCk7DQorICB2aXJ0dWFsIElGV0xfV2lkZ2V0KiBHZXRPd25lcigpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldE93bmVyKElGV0xfV2lkZ2V0KiBwT3duZXIpOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldCogR2V0T3V0ZXIoKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0U3R5bGVzKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgTW9kaWZ5U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzQWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzUmVtb3ZlZCk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldFN0eWxlc0V4KCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgTW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0U3RhdGVzKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spOw0KKyAgdmlydHVhbCB2b2lkKiBHZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIExvY2tVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVbmxvY2tVcGRhdGUoKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFRyYW5zZm9ybVRvKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgVHJhbnNmb3JtVG8oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldE1hdHJpeChDRlhfTWF0cml4JiBtYXRyaXgsIEZYX0JPT0wgYkdsb2JhbCA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRldMX1RoZW1lUHJvdmlkZXIqIEdldFRoZW1lUHJvdmlkZXIoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lUHJvdmlkZXIpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldERhdGFQcm92aWRlcihJRldMX0RhdGFQcm92aWRlciogcERhdGFQcm92aWRlcik7DQorICB2aXJ0dWFsIElGV0xfV2lkZ2V0RGVsZWdhdGUqIFNldERlbGVnYXRlKElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSk7DQorICB2aXJ0dWFsIElGV0xfTm90ZVRocmVhZCogR2V0T3duZXJUaHJlYWQoKSBjb25zdDsNCisgIEZXTF9FUlIgU2V0T3duZXJUaHJlYWQoQ0ZXTF9Ob3RlVGhyZWFkKiBwT3duZXJUaHJlYWQpOw0KKyAgRldMX0VSUiBHZXRQcm9wZXJ0aWVzKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcyk7DQorICBGV0xfRVJSIFNldFByb3BlcnRpZXMoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKTsNCisgIElGV0xfV2lkZ2V0KiBHZXRJbnRlcmZhY2UoKTsNCisgIHZvaWQgU2V0SW50ZXJmYWNlKElGV0xfV2lkZ2V0KiBwSW50ZXJmYWNlKTsNCisgIENGWF9TaXplRiBHZXRPZmZzZXRGcm9tUGFyZW50KElGV0xfV2lkZ2V0KiBwUGFyZW50KTsNCiANCi0gICAgRlhfQk9PTAkJSXNQYXJlbnQoSUZXTF9XaWRnZXQgKnBQYXJlbnQpOw0KLSAgICBDRldMX1dpZGdldE1ncgkJCSAgICptX3BXaWRnZXRNZ3I7DQotICAgIENGV0xfTm90ZVRocmVhZAkJCSAgICptX3BPd25lclRocmVhZDsNCi0gICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzICAgKm1fcFByb3BlcnRpZXM7DQotICAgIENGWF9Qcml2YXRlRGF0YQkJCSAgICptX3BQcml2YXRlRGF0YTsNCi0gICAgSUZXTF9XaWRnZXREZWxlZ2F0ZQkJICAgKm1fcERlbGVnYXRlOw0KLSAgICBJRldMX1dpZGdldERlbGVnYXRlCQkgICAqbV9wQ3VyRGVsZWdhdGU7DQotICAgIElGV0xfV2lkZ2V0CQkJICAgICAgICptX3BPdXRlcjsNCi0gICAgSUZXTF9XaWRnZXQJCQkJICAgKm1fcEludGVyZmFjZTsNCi0gICAgaW50MzJfdAkJCQkJbV9pTG9jazsNCi0gICAgZnJpZW5kIGNsYXNzIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU7DQotICAgIGZyaWVuZCB2b2lkIEZXTF9TZXRXaWRnZXRSZWN0KElGV0xfV2lkZ2V0ICp3aWRnZXQsIGNvbnN0IENGWF9SZWN0RiAmcmVjdCk7DQotICAgIGZyaWVuZCB2b2lkIEZXTF9TZXRXaWRnZXRTdGF0ZXMoSUZXTF9XaWRnZXQgKndpZGdldCwgRlhfRFdPUkQgZHdTdGF0ZXMpOw0KLSAgICBmcmllbmQgdm9pZCBGV0xfU2V0V2lkZ2V0U3R5bGVzKElGV0xfV2lkZ2V0ICp3aWRnZXQsIEZYX0RXT1JEIGR3U3R5bGVzKTsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9XaWRnZXRJbXAoSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgQ0ZXTF9XaWRnZXRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IE5VTEwpOw0KKyAgdmlydHVhbCB+Q0ZXTF9XaWRnZXRJbXAoKTsNCisgIEZYX0JPT0wgSXNFbmFibGVkKCk7DQorICBGWF9CT09MIElzVmlzaWJsZSgpOw0KKyAgRlhfQk9PTCBJc0FjdGl2ZSgpOw0KKyAgRlhfQk9PTCBJc092ZXJMYXBwZXIoKTsNCisgIEZYX0JPT0wgSXNQb3B1cCgpOw0KKyAgRlhfQk9PTCBJc0NoaWxkKCk7DQorICBGWF9CT09MIElzTG9ja2VkKCk7DQorICBGWF9CT09MIElzT2Zmc2NyZWVuKCk7DQorICBGWF9CT09MIEhhc0JvcmRlcigpOw0KKyAgRlhfQk9PTCBIYXNFZGdlKCk7DQorICB2b2lkIEdldEVkZ2VSZWN0KENGWF9SZWN0RiYgcnRFZGdlKTsNCisgIEZYX0ZMT0FUIEdldEJvcmRlclNpemUoRlhfQk9PTCBiQ1ggPSBUUlVFKTsNCisgIEZYX0ZMT0FUIEdldEVkZ2VXaWR0aCgpOw0KKyAgdm9pZCBHZXRSZWxhdGl2ZVJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQqIEdldFRoZW1lQ2FwYWNpdHkoRlhfRFdPUkQgZHdDYXBhY2l0eSk7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICBDRldMX1dpZGdldEltcCogR2V0Um9vdE91dGVyKCk7DQorICBDRldMX1dpZGdldEltcCogR2V0U2FtZUFuY2VzdG9yKENGV0xfV2lkZ2V0SW1wKiBwV2lkZ2V0KTsNCisgIENGWF9TaXplRiBHZXRPZmZzZXRGcm9tQW5jZXN0b3IoQ0ZXTF9XaWRnZXRJbXAqIHBBbmNlc3Rvcik7DQorICBGWF9CT09MIFRyYW5zZm9ybVRvT3V0ZXIoRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpOw0KKyAgRlhfQk9PTCBUcmFuc2Zvcm1Gcm9tT3V0ZXIoRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpOw0KKyAgQ0ZYX1NpemVGIENhbGNUZXh0U2l6ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTXVsdGlMaW5lID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxpbmVXaWR0aCA9IC0xKTsNCisgIHZvaWQgQ2FsY1RleHRSZWN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VFRPU3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVFRPQWxpZ24sDQorICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBTZXRGb2N1cyhGWF9CT09MIGJGb2N1cyk7DQorICB2b2lkIFNldEdyYWIoRlhfQk9PTCBiU2V0KTsNCisgIEZYX0JPT0wgR2V0UG9wdXBQb3MoRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKTsNCisgIEZYX0JPT0wgR2V0UG9wdXBQb3NNZW51KEZYX0ZMT0FUIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7DQorICBGWF9CT09MIEdldFBvcHVwUG9zQ29tYm9Cb3goRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKTsNCisgIEZYX0JPT0wgR2V0UG9wdXBQb3NHZW5lcmFsKEZYX0ZMT0FUIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7DQorICBGWF9CT09MIEdldFNjcmVlblNpemUoRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpOw0KKyAgdm9pZCBSZWdpc3RlckV2ZW50VGFyZ2V0KElGV0xfV2lkZ2V0KiBwRXZlbnRTb3VyY2UgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmlsdGVyID0gRldMX0VWRU5UX0FMTF9NQVNLKTsNCisgIHZvaWQgVW5yZWdpc3RlckV2ZW50VGFyZ2V0KCk7DQorICB2b2lkIERpc3BhdGNoS2V5RXZlbnQoQ0ZXTF9Nc2dLZXkqIHBOb3RlKTsNCisgIHZvaWQgRGlzcGF0Y2hFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KKyAgdm9pZCBSZXBhaW50KGNvbnN0IENGWF9SZWN0RiogcFJlY3QgPSBOVUxMKTsNCisgIHZvaWQgRHJhd0JhY2tncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhcnRCaywNCisgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0JvcmRlcihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYXJ0Qm9yZGVyLA0KKyAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0VkZ2UoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgIGludDMyX3QgaVBhcnRFZGdlLA0KKyAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBOb3RpZnlEcml2ZXIoKTsNCisNCisgIEZYX0JPT0wgSXNQYXJlbnQoSUZXTF9XaWRnZXQqIHBQYXJlbnQpOw0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIG1fcFdpZGdldE1ncjsNCisgIENGV0xfTm90ZVRocmVhZCogbV9wT3duZXJUaHJlYWQ7DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMqIG1fcFByb3BlcnRpZXM7DQorICBDRlhfUHJpdmF0ZURhdGEqIG1fcFByaXZhdGVEYXRhOw0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wRGVsZWdhdGU7DQorICBJRldMX1dpZGdldERlbGVnYXRlKiBtX3BDdXJEZWxlZ2F0ZTsNCisgIElGV0xfV2lkZ2V0KiBtX3BPdXRlcjsNCisgIElGV0xfV2lkZ2V0KiBtX3BJbnRlcmZhY2U7DQorICBpbnQzMl90IG1faUxvY2s7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCisgIGZyaWVuZCB2b2lkIEZXTF9TZXRXaWRnZXRSZWN0KElGV0xfV2lkZ2V0KiB3aWRnZXQsIGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7DQorICBmcmllbmQgdm9pZCBGV0xfU2V0V2lkZ2V0U3RhdGVzKElGV0xfV2lkZ2V0KiB3aWRnZXQsIEZYX0RXT1JEIGR3U3RhdGVzKTsNCisgIGZyaWVuZCB2b2lkIEZXTF9TZXRXaWRnZXRTdHlsZXMoSUZXTF9XaWRnZXQqIHdpZGdldCwgRlhfRFdPUkQgZHdTdHlsZXMpOw0KIH07DQotY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUoKTsNCi0gICAgdmlydHVhbCB+Q0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSgpIHt9DQotICAgIHZpcnR1YWwgaW50MzJfdAlPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUoKTsNCisgIHZpcnR1YWwgfkNGV0xfV2lkZ2V0SW1wRGVsZWdhdGUoKSB7fQ0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgKaW5kZXggMzFiOTc4ZS4uNWNkODUxMCAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgKQEAgLTEzLDEzMiArMTMsMTUxIEBACiBjbGFzcyBDRldMX1dpZGdldE1ncjsNCiBjbGFzcyBDRldMX1dpZGdldE1nckRlbGVnYXRlOw0KIGNsYXNzIElGV0xfQWRhcHRlck5hdGl2ZTsNCi1jbGFzcyBDRldMX1dpZGdldE1nckl0ZW0NCi17DQotcHVibGljOg0KLSAgICBDRldMX1dpZGdldE1nckl0ZW0oKQ0KLSAgICAgICAgOiBwUGFyZW50KE5VTEwpDQotICAgICAgICAsIHBPd25lcihOVUxMKQ0KLSAgICAgICAgLCBwQ2hpbGQoTlVMTCkNCi0gICAgICAgICwgcFByZXZpb3VzKE5VTEwpDQotICAgICAgICAsIHBOZXh0KE5VTEwpDQotICAgICAgICAsIHBXaWRnZXQoTlVMTCkNCi0gICAgICAgICwgcE9mZnNjcmVlbihOVUxMKQ0KLSAgICAgICAgLCBpUmVkcmF3Q291bnRlcigwKQ0KLSNpZiAoX0ZYX09TXz09X0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXz09X0ZYX1dJTjY0XykNCi0gICAgICAgICwgYk91dHNpZGVDaGFuZ2VkKEZBTFNFKQ0KK2NsYXNzIENGV0xfV2lkZ2V0TWdySXRlbSB7DQorIHB1YmxpYzoNCisgIENGV0xfV2lkZ2V0TWdySXRlbSgpDQorICAgICAgOiBwUGFyZW50KE5VTEwpLA0KKyAgICAgICAgcE93bmVyKE5VTEwpLA0KKyAgICAgICAgcENoaWxkKE5VTEwpLA0KKyAgICAgICAgcFByZXZpb3VzKE5VTEwpLA0KKyAgICAgICAgcE5leHQoTlVMTCksDQorICAgICAgICBwV2lkZ2V0KE5VTEwpLA0KKyAgICAgICAgcE9mZnNjcmVlbihOVUxMKSwNCisgICAgICAgIGlSZWRyYXdDb3VudGVyKDApDQorI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU18gPT0gX0ZYX1dJTjY0XykNCisgICAgICAgICwNCisgICAgICAgIGJPdXRzaWRlQ2hhbmdlZChGQUxTRSkNCiAjZW5kaWYNCi0gICAgew0KKyAgew0KKyAgfQ0KKyAgfkNGV0xfV2lkZ2V0TWdySXRlbSgpIHsNCisgICAgaWYgKHBPZmZzY3JlZW4pIHsNCisgICAgICBkZWxldGUgcE9mZnNjcmVlbjsNCisgICAgICBwT2Zmc2NyZWVuID0gTlVMTDsNCiAgICAgfQ0KLSAgICB+Q0ZXTF9XaWRnZXRNZ3JJdGVtKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHBPZmZzY3JlZW4pIHsNCi0gICAgICAgICAgICBkZWxldGUgcE9mZnNjcmVlbjsNCi0gICAgICAgICAgICBwT2Zmc2NyZWVuID0gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBDRldMX1dpZGdldE1nckl0ZW0JKnBQYXJlbnQ7DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbQkqcE93bmVyOw0KLSAgICBDRldMX1dpZGdldE1nckl0ZW0JKnBDaGlsZDsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtCSpwUHJldmlvdXM7DQotICAgIENGV0xfV2lkZ2V0TWdySXRlbQkqcE5leHQ7DQotICAgIElGV0xfV2lkZ2V0CQkJKnBXaWRnZXQ7DQotICAgIENGWF9HcmFwaGljcwkJKnBPZmZzY3JlZW47DQotICAgIGludDMyX3QJCQlpUmVkcmF3Q291bnRlcjsNCi0jaWYgKF9GWF9PU189PV9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU189PV9GWF9XSU42NF8pDQotICAgIEZYX0JPT0wJCQkJYk91dHNpZGVDaGFuZ2VkOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUGFyZW50Ow0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwT3duZXI7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBDaGlsZDsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcFByZXZpb3VzOw0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwTmV4dDsNCisgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0Ow0KKyAgQ0ZYX0dyYXBoaWNzKiBwT2Zmc2NyZWVuOw0KKyAgaW50MzJfdCBpUmVkcmF3Q291bnRlcjsNCisjaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXyA9PSBfRlhfV0lONjRfKQ0KKyAgRlhfQk9PTCBiT3V0c2lkZUNoYW5nZWQ7DQogI2VuZGlmDQogfTsNCiANCi1jbGFzcyBDRldMX1dpZGdldE1ncg0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfV2lkZ2V0TWdyKElGV0xfQWRhcHRlck5hdGl2ZSAqcEFkYXB0ZXJOYXRpdmUpOw0KLSAgICB2aXJ0dWFsIH5DRldMX1dpZGdldE1ncigpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUNvdW50V2lkZ2V0cyhJRldMX1dpZGdldCAqcFBhcmVudCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIElGV0xfV2lkZ2V0KglHZXRXaWRnZXQoaW50MzJfdCBuSW5kZXgsIElGV0xfV2lkZ2V0ICpwUGFyZW50ID0gTlVMTCk7DQotICAgIHZpcnR1YWwgSUZXTF9XaWRnZXQqCUdldFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX1dHVFJFTEFUSU9OIGVSZWxhdGlvbik7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0V2lkZ2V0SW5kZXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRXaWRnZXRJbmRleChJRldMX1dpZGdldCAqcFdpZGdldCwgaW50MzJfdCBuSW5kZXgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc1dpZGdldCh2b2lkKiBwT2JqKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJUmVwYWludFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRDYXBhYmlsaXR5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZHdDYXBhYmlsaXR5Ow0KLSAgICB9DQotICAgIHZvaWQJCQlBZGRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2b2lkCQkJSW5zZXJ0V2lkZ2V0KElGV0xfV2lkZ2V0ICpwUGFyZW50LCBJRldMX1dpZGdldCAqcENoaWxkLCBpbnQzMl90IG5JbmRleCA9IC0xKTsNCi0gICAgdm9pZAkJCVJlbW92ZVdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZvaWQJCQlTZXRPd25lcihJRldMX1dpZGdldCAqcE93bmVyLCBJRldMX1dpZGdldCAqcE93bmVkKTsNCi0gICAgdm9pZAkJCVNldFBhcmVudChJRldMX1dpZGdldCAqcFBhcmVudCwgSUZXTF9XaWRnZXQgKnBDaGlsZCk7DQotICAgIEZYX0JPT0wJCQlJc0NoaWxkKElGV0xfV2lkZ2V0ICpwQ2hpbGQsIElGV0xfV2lkZ2V0ICpwUGFyZW50KTsNCi0gICAgRldMX0VSUgkJCUNyZWF0ZVdpZGdldF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICBGV0xfRVJSCQkJRGVzdHJveVdpZGdldF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICBGV0xfRVJSCQkJR2V0V2lkZ2V0UmVjdF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9SZWN0RiAmcmVjdCk7DQotICAgIEZXTF9FUlIJCQlTZXRXaWRnZXRSZWN0X05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGICZyZWN0KTsNCi0gICAgRldMX0VSUgkJCVNldFdpZGdldFBvc2l0aW9uX05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgRldMX0VSUgkJCVNldFdpZGdldEljb25fTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfRElCaXRtYXAgKnBJY29uLCBGWF9CT09MIGJCaWcpOw0KLSAgICBGV0xfRVJSCQkJU2V0V2lkZ2V0Q2FwdGlvbl9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDYXB0aW9uKTsNCi0gICAgRldMX0VSUgkJCVNldEJvcmRlclJlZ2lvbl9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9QYXRoICpwUGF0aCk7DQotICAgIEZXTF9FUlIJCQlTaG93V2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIEZXTF9FUlIJCQlIaWRlV2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIEZXTF9FUlIJCQlTZXROb3JtYWxfTmF0aXZlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgRldMX0VSUgkJCVNldE1heGltaXplX05hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIEZXTF9FUlIJCQlTZXRNaW5pbWl6ZV9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICBGWF9CT09MCQkJQ2hlY2tNZXNzYWdlX05hdGl2ZSgpOw0KLSAgICBGV0xfRVJSCQkJRGlzcGF0Y2hNZXNzYWdlX05hdGl2ZSgpOw0KLSAgICBGWF9CT09MCQkJSXNJZGxlTWVzc2FnZV9OYXRpdmUoKTsNCi0gICAgRldMX0VSUgkJCUV4aXRfTmF0aXZlKGludDMyX3QgaUV4aXRDb2RlKTsNCi0gICAgRldMX0VSUgkJCUNyZWF0ZVdpZGdldFdpdGhOYXRpdmVJZF9OYXRpdmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIHZvaWQgKnZwKTsNCi0gICAgSUZXTF9XaWRnZXQqCUdldFdpZGdldEF0UG9pbnQoSUZXTF9XaWRnZXQgKnBQYXJlbnQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZvaWQJCQlOb3RpZnlTaXplQ2hhbmdlZChJRldMX1dpZGdldCAqcEZvcm0sIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIElGV0xfV2lkZ2V0KgluZXh0VGFiKElGV0xfV2lkZ2V0ICpwYXJlbnQsIElGV0xfV2lkZ2V0ICpmb2N1cywgRlhfQk9PTCAmYkZpbmQpOw0KLSAgICBpbnQzMl90CQlDb3VudFJhZGlvQnV0dG9uR3JvdXAoSUZXTF9XaWRnZXQgKnBGaXJzdCk7DQotICAgIElGV0xfV2lkZ2V0KglHZXRTaWJsaW5nUmFkaW9CdXR0b24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0JPT0wgYk5leHQpOw0KLSAgICBJRldMX1dpZGdldCoJR2V0UmFkaW9CdXR0b25Hcm91cEhlYWRlcihJRldMX1dpZGdldCAqcFJhZGlvQnV0dG9uKTsNCi0gICAgdm9pZAkJCUdldFNhbWVHcm91cFJhZGlvQnV0dG9uKElGV0xfV2lkZ2V0ICpwUmFkaW9CdXR0b24sIENGWF9QdHJBcnJheSAmZ3JvdXApOw0KLSAgICBJRldMX1dpZGdldCogICAgR2V0RGVmYXVsdEJ1dHRvbihJRldMX1dpZGdldCAqcFBhcmVudCk7DQotICAgIHZvaWQJCQlBZGRSZWRyYXdDb3VudHMoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICB2b2lkCQkJUmVzZXRSZWRyYXdDb3VudHMoSUZXTF9XaWRnZXQgKnBXaWRnZXQpOw0KLSAgICBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqCUdldEFkYXB0ZXJXaWRnZXRNZ3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wQWRhcHRlcjsNCi0gICAgfQ0KLSAgICBDRldMX1dpZGdldE1nckRlbGVnYXRlKiBHZXREZWxlZ2F0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BEZWxlZ2F0ZTsNCi0gICAgfQ0KLSAgICBDRldMX1dpZGdldE1nckl0ZW0qCQlHZXRXaWRnZXRNZ3JJdGVtKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgRlhfQk9PTAkJCQkJSXNUaHJlYWRFbmFibGVkKCk7DQotICAgIEZYX0JPT0wJCQkJCUlzRm9ybURpc2FibGVkKCk7DQotICAgIEZYX0JPT0wJCQlHZXRBZGFwdGVyUG9wdXBQb3MoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZYX0ZMT0FUIGZNaW5IZWlnaHQsIEZYX0ZMT0FUIGZNYXhIZWlnaHQsIGNvbnN0IENGWF9SZWN0RiAmcnRBbmNob3IsIENGWF9SZWN0RiAmcnRQb3B1cCk7DQotcHJvdGVjdGVkOg0KLSAgICBpbnQzMl90CQkJCVRyYXZlbFdpZGdldE1ncihDRldMX1dpZGdldE1nckl0ZW0gKnBQYXJlbnQsIGludDMyX3QgKnBJbmRleCwgQ0ZXTF9XaWRnZXRNZ3JJdGVtICpwSXRlbSwgSUZXTF9XaWRnZXQgKipwV2lkZ2V0ID0gTlVMTCk7DQotICAgIEZYX0JPT0wJCQkJCUlzQWJsZU5hdGl2ZShJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fbWFwV2lkZ2V0SXRlbTsNCi0gICAgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyICAqbV9wQWRhcHRlcjsNCi0gICAgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSAqbV9wRGVsZWdhdGU7DQotICAgIGZyaWVuZCBjbGFzcyBDRldMX1dpZGdldE1nckRlbGVnYXRlOw0KLSAgICBGWF9EV09SRAkJCQltX2R3Q2FwYWJpbGl0eTsNCi0jaWYgKF9GWF9PU189PV9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU189PV9GWF9XSU42NF8pDQotICAgIENGWF9SZWN0RgkJCQltX3J0U2NyZWVuOw0KK2NsYXNzIENGV0xfV2lkZ2V0TWdyIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9XaWRnZXRNZ3IoSUZXTF9BZGFwdGVyTmF0aXZlKiBwQWRhcHRlck5hdGl2ZSk7DQorICB2aXJ0dWFsIH5DRldMX1dpZGdldE1ncigpOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50V2lkZ2V0cyhJRldMX1dpZGdldCogcFBhcmVudCA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldCogR2V0V2lkZ2V0KGludDMyX3QgbkluZGV4LCBJRldMX1dpZGdldCogcFBhcmVudCA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldCogR2V0V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9XR1RSRUxBVElPTiBlUmVsYXRpb24pOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZGdldEluZGV4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRXaWRnZXRJbmRleChJRldMX1dpZGdldCogcFdpZGdldCwgaW50MzJfdCBuSW5kZXgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzV2lkZ2V0KHZvaWQqIHBPYmopOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENhcGFiaWxpdHkoKSB7IHJldHVybiBtX2R3Q2FwYWJpbGl0eTsgfQ0KKyAgdm9pZCBBZGRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdm9pZCBJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcENoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSAtMSk7DQorICB2b2lkIFJlbW92ZVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2b2lkIFNldE93bmVyKElGV0xfV2lkZ2V0KiBwT3duZXIsIElGV0xfV2lkZ2V0KiBwT3duZWQpOw0KKyAgdm9pZCBTZXRQYXJlbnQoSUZXTF9XaWRnZXQqIHBQYXJlbnQsIElGV0xfV2lkZ2V0KiBwQ2hpbGQpOw0KKyAgRlhfQk9PTCBJc0NoaWxkKElGV0xfV2lkZ2V0KiBwQ2hpbGQsIElGV0xfV2lkZ2V0KiBwUGFyZW50KTsNCisgIEZXTF9FUlIgQ3JlYXRlV2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICBGV0xfRVJSIERlc3Ryb3lXaWRnZXRfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdF9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcmVjdCk7DQorICBGV0xfRVJSIFNldFdpZGdldFJlY3RfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgRldMX0VSUiBTZXRXaWRnZXRQb3NpdGlvbl9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KTsNCisgIEZXTF9FUlIgU2V0V2lkZ2V0SWNvbl9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEljb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJpZyk7DQorICBGV0xfRVJSIFNldFdpZGdldENhcHRpb25fTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbik7DQorICBGV0xfRVJSIFNldEJvcmRlclJlZ2lvbl9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9QYXRoKiBwUGF0aCk7DQorICBGV0xfRVJSIFNob3dXaWRnZXRfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZXTF9FUlIgSGlkZVdpZGdldF9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgRldMX0VSUiBTZXROb3JtYWxfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZXTF9FUlIgU2V0TWF4aW1pemVfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZXTF9FUlIgU2V0TWluaW1pemVfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZYX0JPT0wgQ2hlY2tNZXNzYWdlX05hdGl2ZSgpOw0KKyAgRldMX0VSUiBEaXNwYXRjaE1lc3NhZ2VfTmF0aXZlKCk7DQorICBGWF9CT09MIElzSWRsZU1lc3NhZ2VfTmF0aXZlKCk7DQorICBGV0xfRVJSIEV4aXRfTmF0aXZlKGludDMyX3QgaUV4aXRDb2RlKTsNCisgIEZXTF9FUlIgQ3JlYXRlV2lkZ2V0V2l0aE5hdGl2ZUlkX05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCwgdm9pZCogdnApOw0KKyAgSUZXTF9XaWRnZXQqIEdldFdpZGdldEF0UG9pbnQoSUZXTF9XaWRnZXQqIHBQYXJlbnQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2b2lkIE5vdGlmeVNpemVDaGFuZ2VkKElGV0xfV2lkZ2V0KiBwRm9ybSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIElGV0xfV2lkZ2V0KiBuZXh0VGFiKElGV0xfV2lkZ2V0KiBwYXJlbnQsIElGV0xfV2lkZ2V0KiBmb2N1cywgRlhfQk9PTCYgYkZpbmQpOw0KKyAgaW50MzJfdCBDb3VudFJhZGlvQnV0dG9uR3JvdXAoSUZXTF9XaWRnZXQqIHBGaXJzdCk7DQorICBJRldMX1dpZGdldCogR2V0U2libGluZ1JhZGlvQnV0dG9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJOZXh0KTsNCisgIElGV0xfV2lkZ2V0KiBHZXRSYWRpb0J1dHRvbkdyb3VwSGVhZGVyKElGV0xfV2lkZ2V0KiBwUmFkaW9CdXR0b24pOw0KKyAgdm9pZCBHZXRTYW1lR3JvdXBSYWRpb0J1dHRvbihJRldMX1dpZGdldCogcFJhZGlvQnV0dG9uLCBDRlhfUHRyQXJyYXkmIGdyb3VwKTsNCisgIElGV0xfV2lkZ2V0KiBHZXREZWZhdWx0QnV0dG9uKElGV0xfV2lkZ2V0KiBwUGFyZW50KTsNCisgIHZvaWQgQWRkUmVkcmF3Q291bnRzKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZvaWQgUmVzZXRSZWRyYXdDb3VudHMoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyKiBHZXRBZGFwdGVyV2lkZ2V0TWdyKCkgeyByZXR1cm4gbV9wQWRhcHRlcjsgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSogR2V0RGVsZWdhdGUoKSB7IHJldHVybiBtX3BEZWxlZ2F0ZTsgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBHZXRXaWRnZXRNZ3JJdGVtKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZYX0JPT0wgSXNUaHJlYWRFbmFibGVkKCk7DQorICBGWF9CT09MIElzRm9ybURpc2FibGVkKCk7DQorICBGWF9CT09MIEdldEFkYXB0ZXJQb3B1cFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7DQorDQorIHByb3RlY3RlZDoNCisgIGludDMyX3QgVHJhdmVsV2lkZ2V0TWdyKENGV0xfV2lkZ2V0TWdySXRlbSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfV2lkZ2V0TWdySXRlbSogcEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCoqIHBXaWRnZXQgPSBOVUxMKTsNCisgIEZYX0JPT0wgSXNBYmxlTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIENGWF9NYXBQdHJUb1B0ciBtX21hcFdpZGdldEl0ZW07DQorICBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIG1fcEFkYXB0ZXI7DQorICBDRldMX1dpZGdldE1nckRlbGVnYXRlKiBtX3BEZWxlZ2F0ZTsNCisgIGZyaWVuZCBjbGFzcyBDRldMX1dpZGdldE1nckRlbGVnYXRlOw0KKyAgRlhfRFdPUkQgbV9kd0NhcGFiaWxpdHk7DQorI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU18gPT0gX0ZYX1dJTjY0XykNCisgIENGWF9SZWN0RiBtX3J0U2NyZWVuOw0KICNlbmRpZg0KIH07DQotY2xhc3MgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGUoQ0ZXTF9XaWRnZXRNZ3IgKnBXaWRnZXRNZ3IpOw0KLSAgICB2aXJ0dWFsIH5DRldMX1dpZGdldE1nckRlbGVnYXRlKCkge30NCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPblNldENhcGFiaWxpdHkoRlhfRFdPUkQgZHdDYXBhYmlsaXR5ID0gRldMX1dHVE1HUl9EaXNhYmxlVGhyZWFkKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2VUb0Zvcm0oQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwJRldMX0VSUgkJT25EcmF3V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAlEcmF3Q2hpbGQoSUZXTF9XaWRnZXQgKnBQYXJlbnQsIGNvbnN0IENGWF9SZWN0RiAmcnRDbGlwLCBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApOw0KLSAgICBDRlhfR3JhcGhpY3MqIERyYXdXaWRnZXRCZWZvcmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4KTsNCi0gICAgdm9pZAlEcmF3V2lkZ2V0QWZ0ZXIoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBDRlhfUmVjdEYgJnJ0Q2xpcCwgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCk7DQotICAgIEZYX0JPT0wgSXNOZWVkUmVwYWludChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgY29uc3QgQ0ZYX1JlY3RGICZydERpcnR5KTsNCi0gICAgRlhfQk9PTCBiVXNlT2Zmc2NyZWVuRGlyZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCitjbGFzcyBDRldMX1dpZGdldE1nckRlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZShDRldMX1dpZGdldE1nciogcFdpZGdldE1ncik7DQorICB2aXJ0dWFsIH5DRldMX1dpZGdldE1nckRlbGVnYXRlKCkge30NCisgIHZpcnR1YWwgRldMX0VSUiBPblNldENhcGFiaWxpdHkoDQorICAgICAgRlhfRFdPUkQgZHdDYXBhYmlsaXR5ID0gRldMX1dHVE1HUl9EaXNhYmxlVGhyZWFkKTsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlVG9Gb3JtKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KIA0KLSAgICBDRldMX1dpZGdldE1nciAqbV9wV2lkZ2V0TWdyOw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERyYXdDaGlsZChJRldMX1dpZGdldCogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIENGWF9HcmFwaGljcyogRHJhd1dpZGdldEJlZm9yZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd1dpZGdldEFmdGVyKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgRlhfQk9PTCBJc05lZWRSZXBhaW50KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydERpcnR5KTsNCisgIEZYX0JPT0wgYlVzZU9mZnNjcmVlbkRpcmVjdChJRldMX1dpZGdldCogcFdpZGdldCk7DQorDQorICBDRldMX1dpZGdldE1nciogbV9wV2lkZ2V0TWdyOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2FwcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvYXBwLmNwcAppbmRleCA1NDMyN2M4Li45NDQxYjhmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvYXBwLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvYXBwLmNwcApAQCAtNSwzOCArNSwzMCBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCi1DRldMX0FwcDo6Q0ZXTF9BcHAoKQ0KLSAgICA6IG1fcEFwcEltcChOVUxMKQ0KLSAgICAsIG1fcFRoZW1lUHJvdmlkZXIoTlVMTCkNCi17DQotICAgIG1fcEFwcEltcCA9IElGV0xfQXBwOjpDcmVhdGUoTlVMTCk7DQorQ0ZXTF9BcHA6OkNGV0xfQXBwKCkgOiBtX3BBcHBJbXAoTlVMTCksIG1fcFRoZW1lUHJvdmlkZXIoTlVMTCkgew0KKyAgbV9wQXBwSW1wID0gSUZXTF9BcHA6OkNyZWF0ZShOVUxMKTsNCiB9DQotQ0ZXTF9BcHA6On5DRldMX0FwcCgpDQotew0KLSAgICBpZiAobV9wVGhlbWVQcm92aWRlcikgew0KLSAgICAgICAgbV9wVGhlbWVQcm92aWRlci0+RmluYWxpemUoKTsNCi0gICAgICAgIGRlbGV0ZSBtX3BUaGVtZVByb3ZpZGVyOw0KLSAgICAgICAgbV9wVGhlbWVQcm92aWRlciA9IE5VTEw7DQotICAgIH0NCi0gICAgbV9wQXBwSW1wLT5SZWxlYXNlKCk7DQorQ0ZXTF9BcHA6On5DRldMX0FwcCgpIHsNCisgIGlmIChtX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgIG1fcFRoZW1lUHJvdmlkZXItPkZpbmFsaXplKCk7DQorICAgIGRlbGV0ZSBtX3BUaGVtZVByb3ZpZGVyOw0KKyAgICBtX3BUaGVtZVByb3ZpZGVyID0gTlVMTDsNCisgIH0NCisgIG1fcEFwcEltcC0+UmVsZWFzZSgpOw0KIH0NCi1GV0xfRVJSIENGV0xfQXBwOjpJbml0aWFsaXplKCkNCi17DQotICAgIG1fcFRoZW1lUHJvdmlkZXIgPSBGWF9ORVcgQ0ZXTF9UaGVtZTsNCi0gICAgbV9wVGhlbWVQcm92aWRlci0+SW5pdGlhbGl6ZSgpOw0KLSAgICBtX3BBcHBJbXAtPlNldFRoZW1lUHJvdmlkZXIoKElGV0xfVGhlbWVQcm92aWRlciopbV9wVGhlbWVQcm92aWRlcik7DQotICAgIHJldHVybiBtX3BBcHBJbXAtPkluaXRpYWxpemUoKTsNCitGV0xfRVJSIENGV0xfQXBwOjpJbml0aWFsaXplKCkgew0KKyAgbV9wVGhlbWVQcm92aWRlciA9IEZYX05FVyBDRldMX1RoZW1lOw0KKyAgbV9wVGhlbWVQcm92aWRlci0+SW5pdGlhbGl6ZSgpOw0KKyAgbV9wQXBwSW1wLT5TZXRUaGVtZVByb3ZpZGVyKChJRldMX1RoZW1lUHJvdmlkZXIqKW1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgcmV0dXJuIG1fcEFwcEltcC0+SW5pdGlhbGl6ZSgpOw0KIH0NCi1DRldMX1RoZW1lKglDRldMX0FwcDo6R2V0VGhlbWUoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcFRoZW1lUHJvdmlkZXI7DQorQ0ZXTF9UaGVtZSogQ0ZXTF9BcHA6OkdldFRoZW1lKCkgew0KKyAgcmV0dXJuIG1fcFRoZW1lUHJvdmlkZXI7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9BcHA6OkV4aXQoaW50MzJfdCBpRXhpdENvZGUgKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BBcHBJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBtX3BBcHBJbXAtPkV4aXQoaUV4aXRDb2RlKTsNCitGV0xfRVJSIENGV0xfQXBwOjpFeGl0KGludDMyX3QgaUV4aXRDb2RlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEFwcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBtX3BBcHBJbXAtPkV4aXQoaUV4aXRDb2RlKTsNCiB9DQotSUZXTF9BcHAqIENGV0xfQXBwOjpHZXRBcHAoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEFwcEltcDsNCitJRldMX0FwcCogQ0ZXTF9BcHA6OkdldEFwcCgpIHsNCisgIHJldHVybiBtX3BBcHBJbXA7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9iYXJjb2RlLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9iYXJjb2RlLmNwcAppbmRleCA2Yzc3MGMzLi5mNzFhMDBkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvYmFyY29kZS5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2JhcmNvZGUuY3BwCkBAIC01LDUzICs1LDQ1IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KLUNGV0xfQmFyY29kZSogQ0ZXTF9CYXJjb2RlOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDRldMX0JhcmNvZGU7DQorQ0ZXTF9CYXJjb2RlKiBDRldMX0JhcmNvZGU6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBGWF9ORVcgQ0ZXTF9CYXJjb2RlOw0KIH0NCi1GV0xfRVJSCUNGV0xfQmFyY29kZTo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoIW1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKHBQcm9wZXJ0aWVzKSB7DQotICAgICAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCi0gICAgfQ0KLSAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCi0gICAgcHJvcC5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCi0gICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgcHJvcC5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCi0gICAgcHJvcC5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCi0gICAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCi0gICAgcHJvcC5tX3BEYXRhUHJvdmlkZXIgPSAmbV9iYXJjb2RlRGF0YTsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudCkgew0KLSAgICAgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KLSAgICB9DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcikgew0KLSAgICAgICAgcHJvcC5tX3BPd25lciA9IG1fcFByb3BlcnRpZXMtPm1fcE93bmVyLT5HZXRXaWRnZXQoKTsNCi0gICAgfQ0KLSAgICBtX3BJbXAgPSBJRldMX0JhcmNvZGU6OkNyZWF0ZSgpOw0KLSAgICBGV0xfRVJSIHJldCA9ICgoSUZXTF9CYXJjb2RlKiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KLSAgICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQotICAgICAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KLSAgICB9DQotICAgIHJldHVybiByZXQ7DQorRldMX0VSUiBDRldMX0JhcmNvZGU6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTCghbV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKHBQcm9wZXJ0aWVzKSB7DQorICAgICptX3BQcm9wZXJ0aWVzID0gKnBQcm9wZXJ0aWVzOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICBwcm9wLm1fY3RtT25QYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50Ow0KKyAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgIHByb3AubV9wRGF0YVByb3ZpZGVyID0gJm1fYmFyY29kZURhdGE7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQorICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcikgew0KKyAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KKyAgfQ0KKyAgbV9wSW1wID0gSUZXTF9CYXJjb2RlOjpDcmVhdGUoKTsNCisgIEZXTF9FUlIgcmV0ID0gKChJRldMX0JhcmNvZGUqKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQorICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQorICB9DQorICByZXR1cm4gcmV0Ow0KIH0NCi1DRldMX0JhcmNvZGU6OkNGV0xfQmFyY29kZSgpDQotew0KK0NGV0xfQmFyY29kZTo6Q0ZXTF9CYXJjb2RlKCkge30NCitDRldMX0JhcmNvZGU6On5DRldMX0JhcmNvZGUoKSB7fQ0KK3ZvaWQgQ0ZXTF9CYXJjb2RlOjpTZXRUeXBlKEJDX1RZUEUgdHlwZSkgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BJbXApOw0KKyAgKChJRldMX0JhcmNvZGUqKW1fcEltcCktPlNldFR5cGUodHlwZSk7DQogfQ0KLUNGV0xfQmFyY29kZTo6fkNGV0xfQmFyY29kZSgpDQotew0KK0ZYX0JPT0wgQ0ZXTF9CYXJjb2RlOjpJc1Byb3RlY3RlZFR5cGUoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQorICByZXR1cm4gKChJRldMX0JhcmNvZGUqKW1fcEltcCktPklzUHJvdGVjdGVkVHlwZSgpOw0KIH0NCi12b2lkIENGV0xfQmFyY29kZTo6U2V0VHlwZShCQ19UWVBFIHR5cGUpDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcEltcCk7DQotICAgICgoSUZXTF9CYXJjb2RlKiltX3BJbXApLT5TZXRUeXBlKHR5cGUpOw0KLX0NCi1GWF9CT09MCUNGV0xfQmFyY29kZTo6SXNQcm90ZWN0ZWRUeXBlKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCi0gICAgcmV0dXJuICgoSUZXTF9CYXJjb2RlKiltX3BJbXApLT5Jc1Byb3RlY3RlZFR5cGUoKTsNCi19DQotRldMX0VSUiBDRldMX0JhcmNvZGU6OkNGV0xfQmFyY29kZURQOjpHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9CYXJjb2RlOjpDRldMX0JhcmNvZGVEUDo6R2V0Q2FwdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY2FyZXQuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NhcmV0LmNwcAppbmRleCBhOTNlNWQ5Li5hMDljZTQwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY2FyZXQuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jYXJldC5jcHAKQEAgLTUsNTQgKzUsNDQgQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQogDQogI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQotQ0ZXTF9DYXJldCogQ0ZXTF9DYXJldDo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBGWF9ORVcgQ0ZXTF9DYXJldDsNCitDRldMX0NhcmV0KiBDRldMX0NhcmV0OjpDcmVhdGUoKSB7DQorICByZXR1cm4gRlhfTkVXIENGV0xfQ2FyZXQ7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9DYXJldDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoIW1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKHBQcm9wZXJ0aWVzKSB7DQotICAgICAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCi0gICAgfQ0KLSAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCi0gICAgcHJvcC5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCi0gICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgcHJvcC5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCi0gICAgcHJvcC5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCi0gICAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudCkgew0KLSAgICAgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KLSAgICB9DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcikgew0KLSAgICAgICAgcHJvcC5tX3BPd25lciA9IG1fcFByb3BlcnRpZXMtPm1fcE93bmVyLT5HZXRXaWRnZXQoKTsNCi0gICAgfQ0KLSAgICBtX3BJbXAgPSBJRldMX0NhcmV0OjpDcmVhdGUoKTsNCi0gICAgRldMX0VSUiByZXQgPSAoKElGV0xfQ2FyZXQqKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQotICAgIGlmIChyZXQgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCi0gICAgICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJldDsNCitGV0xfRVJSIENGV0xfQ2FyZXQ6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTCghbV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKHBQcm9wZXJ0aWVzKSB7DQorICAgICptX3BQcm9wZXJ0aWVzID0gKnBQcm9wZXJ0aWVzOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICBwcm9wLm1fY3RtT25QYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50Ow0KKyAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCisgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQorICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQorICB9DQorICBtX3BJbXAgPSBJRldMX0NhcmV0OjpDcmVhdGUoKTsNCisgIEZXTF9FUlIgcmV0ID0gKChJRldMX0NhcmV0KiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KKyAgaWYgKHJldCA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KKyAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIHJldDsNCiB9DQotRldMX0VSUiBDRldMX0NhcmV0OjpTaG93Q2FyZXQoRlhfQk9PTCBiRmxhZykNCi17DQotICAgIHJldHVybiAoKElGV0xfQ2FyZXQqKW1fcEltcCktPlNob3dDYXJldChiRmxhZyk7DQorRldMX0VSUiBDRldMX0NhcmV0OjpTaG93Q2FyZXQoRlhfQk9PTCBiRmxhZykgew0KKyAgcmV0dXJuICgoSUZXTF9DYXJldCopbV9wSW1wKS0+U2hvd0NhcmV0KGJGbGFnKTsNCiB9DQotRldMX0VSUiBDRldMX0NhcmV0OjpHZXRGcmVxdWVuY3koRlhfRFdPUkQgJmVsYXBzZSkNCi17DQotICAgIHJldHVybiAoKElGV0xfQ2FyZXQqKW1fcEltcCktPkdldEZyZXF1ZW5jeShlbGFwc2UpOw0KK0ZXTF9FUlIgQ0ZXTF9DYXJldDo6R2V0RnJlcXVlbmN5KEZYX0RXT1JEJiBlbGFwc2UpIHsNCisgIHJldHVybiAoKElGV0xfQ2FyZXQqKW1fcEltcCktPkdldEZyZXF1ZW5jeShlbGFwc2UpOw0KIH0NCi1GV0xfRVJSIENGV0xfQ2FyZXQ6OlNldEZyZXF1ZW5jeShGWF9EV09SRCBlbGFwc2UpDQotew0KLSAgICByZXR1cm4gKChJRldMX0NhcmV0KiltX3BJbXApLT5TZXRGcmVxdWVuY3koZWxhcHNlKTsNCitGV0xfRVJSIENGV0xfQ2FyZXQ6OlNldEZyZXF1ZW5jeShGWF9EV09SRCBlbGFwc2UpIHsNCisgIHJldHVybiAoKElGV0xfQ2FyZXQqKW1fcEltcCktPlNldEZyZXF1ZW5jeShlbGFwc2UpOw0KIH0NCi1GV0xfRVJSCUNGV0xfQ2FyZXQ6OlNldENvbG9yKENGWF9Db2xvciBjckZpbGwpDQotew0KLSAgICByZXR1cm4gKChJRldMX0NhcmV0KiltX3BJbXApLT5TZXRDb2xvcihjckZpbGwpOw0KK0ZXTF9FUlIgQ0ZXTF9DYXJldDo6U2V0Q29sb3IoQ0ZYX0NvbG9yIGNyRmlsbCkgew0KKyAgcmV0dXJuICgoSUZXTF9DYXJldCopbV9wSW1wKS0+U2V0Q29sb3IoY3JGaWxsKTsNCiB9DQotQ0ZXTF9DYXJldDo6Q0ZXTF9DYXJldCgpDQotew0KLX0NCi1DRldMX0NhcmV0Ojp+Q0ZXTF9DYXJldCgpDQotew0KLX0NCitDRldMX0NhcmV0OjpDRldMX0NhcmV0KCkge30NCitDRldMX0NhcmV0Ojp+Q0ZXTF9DYXJldCgpIHt9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NoZWNrYm94LmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jaGVja2JveC5jcHAKaW5kZXggNTA3OTE1OS4uNzlkNDg4NiAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NoZWNrYm94LmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY2hlY2tib3guY3BwCkBAIC01LDcxICs1LDU3IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KLUNGV0xfQ2hlY2tCb3gqIENGV0xfQ2hlY2tCb3g6OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gRlhfTkVXIENGV0xfQ2hlY2tCb3g7DQorQ0ZXTF9DaGVja0JveCogQ0ZXTF9DaGVja0JveDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIEZYX05FVyBDRldMX0NoZWNrQm94Ow0KIH0NCi1GV0xfRVJSCUNGV0xfQ2hlY2tCb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyApDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGlmIChwUHJvcGVydGllcykgew0KLSAgICAgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQotICAgIH0NCi0gICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQotICAgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQotICAgIHByb3AubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQotICAgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQotICAgIHByb3AubV9kd1N0eWxlRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQotICAgIHByb3AubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQotICAgIHByb3AubV9wRGF0YVByb3ZpZGVyID0gJm1fY2hlY2tib3hEYXRhOw0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQotICAgICAgICBwcm9wLm1fcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudC0+R2V0V2lkZ2V0KCk7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQotICAgICAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KLSAgICB9DQotICAgIG1fcEltcCA9IElGV0xfQ2hlY2tCb3g6OkNyZWF0ZSgpOw0KLSAgICBGV0xfRVJSIHJldCA9ICgoSUZXTF9DaGVja0JveCopbV9wSW1wKS0+SW5pdGlhbGl6ZShwcm9wKTsNCi0gICAgaWYgKHJldCA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KLSAgICAgICAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcmV0Ow0KK0ZXTF9FUlIgQ0ZXTF9DaGVja0JveDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICB9DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICBwcm9wLm1fcnRXaWRnZXQgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgcHJvcC5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCisgIHByb3AubV9kd1N0eWxlRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorICBwcm9wLm1fZHdTdGF0ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KKyAgcHJvcC5tX3BEYXRhUHJvdmlkZXIgPSAmbV9jaGVja2JveERhdGE7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQorICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcikgew0KKyAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KKyAgfQ0KKyAgbV9wSW1wID0gSUZXTF9DaGVja0JveDo6Q3JlYXRlKCk7DQorICBGV0xfRVJSIHJldCA9ICgoSUZXTF9DaGVja0JveCopbV9wSW1wKS0+SW5pdGlhbGl6ZShwcm9wKTsNCisgIGlmIChyZXQgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCisgIH0NCisgIHJldHVybiByZXQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9DaGVja0JveDo6U2V0Q2FwdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbikNCi17DQotICAgIG1fY2hlY2tib3hEYXRhLm1fd3NDYXB0aW9uID0gd3NDYXB0aW9uOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0NoZWNrQm94OjpTZXRDYXB0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDYXB0aW9uKSB7DQorICBtX2NoZWNrYm94RGF0YS5tX3dzQ2FwdGlvbiA9IHdzQ2FwdGlvbjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX0NoZWNrQm94OjpTZXRCb3hTaXplKEZYX0ZMT0FUIGZIZWlnaHQpDQotew0KLSAgICBtX2NoZWNrYm94RGF0YS5tX2ZCb3hIZWlnaHQgPSBmSGVpZ2h0Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0NoZWNrQm94OjpTZXRCb3hTaXplKEZYX0ZMT0FUIGZIZWlnaHQpIHsNCisgIG1fY2hlY2tib3hEYXRhLm1fZkJveEhlaWdodCA9IGZIZWlnaHQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLWludDMyX3QgQ0ZXTF9DaGVja0JveDo6R2V0Q2hlY2tTdGF0ZSgpDQotew0KLSAgICByZXR1cm4gKChJRldMX0NoZWNrQm94KiltX3BJbXApLT5HZXRDaGVja1N0YXRlKCk7DQoraW50MzJfdCBDRldMX0NoZWNrQm94OjpHZXRDaGVja1N0YXRlKCkgew0KKyAgcmV0dXJuICgoSUZXTF9DaGVja0JveCopbV9wSW1wKS0+R2V0Q2hlY2tTdGF0ZSgpOw0KIH0NCi1GV0xfRVJSIENGV0xfQ2hlY2tCb3g6OlNldENoZWNrU3RhdGUoaW50MzJfdCBpQ2hlY2spDQotew0KLSAgICByZXR1cm4gKChJRldMX0NoZWNrQm94KiltX3BJbXApLT5TZXRDaGVja1N0YXRlKGlDaGVjayk7DQorRldMX0VSUiBDRldMX0NoZWNrQm94OjpTZXRDaGVja1N0YXRlKGludDMyX3QgaUNoZWNrKSB7DQorICByZXR1cm4gKChJRldMX0NoZWNrQm94KiltX3BJbXApLT5TZXRDaGVja1N0YXRlKGlDaGVjayk7DQogfQ0KLUNGV0xfQ2hlY2tCb3g6OkNGV0xfQ2hlY2tCb3goKQ0KLXsNCi19DQotQ0ZXTF9DaGVja0JveDo6fkNGV0xfQ2hlY2tCb3goKQ0KLXsNCi19DQorQ0ZXTF9DaGVja0JveDo6Q0ZXTF9DaGVja0JveCgpIHt9DQorQ0ZXTF9DaGVja0JveDo6fkNGV0xfQ2hlY2tCb3goKSB7fQ0KIENGV0xfQ2hlY2tCb3g6OkNGV0xfQ2hlY2tCb3hEUDo6Q0ZXTF9DaGVja0JveERQKCkNCi0gICAgOiBtX2ZCb3hIZWlnaHQoMTYuMGYpDQotICAgICwgbV93c0NhcHRpb24oTCJDaGVjayBib3giKQ0KLXsNCisgICAgOiBtX2ZCb3hIZWlnaHQoMTYuMGYpLCBtX3dzQ2FwdGlvbihMIkNoZWNrIGJveCIpIHt9DQorRldMX0VSUiBDRldMX0NoZWNrQm94OjpDRldMX0NoZWNrQm94RFA6OkdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgew0KKyAgd3NDYXB0aW9uID0gbV93c0NhcHRpb247DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9DaGVja0JveDo6Q0ZXTF9DaGVja0JveERQOjpHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKQ0KLXsNCi0gICAgd3NDYXB0aW9uID0gbV93c0NhcHRpb247DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfRkxPQVQgQ0ZXTF9DaGVja0JveDo6Q0ZXTF9DaGVja0JveERQOjpHZXRCb3hTaXplKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIG1fZkJveEhlaWdodDsNCitGWF9GTE9BVCBDRldMX0NoZWNrQm94OjpDRldMX0NoZWNrQm94RFA6OkdldEJveFNpemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX2ZCb3hIZWlnaHQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jb21ib2JveC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY29tYm9ib3guY3BwCmluZGV4IDIwMjExY2EuLmFlYzI0MDMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jb21ib2JveC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NvbWJvYm94LmNwcApAQCAtNSwzNTcgKzUsMzI0IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KLUNGV0xfQ29tYm9Cb3gqIENGV0xfQ29tYm9Cb3g6OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gRlhfTkVXIENGV0xfQ29tYm9Cb3g7DQorQ0ZXTF9Db21ib0JveCogQ0ZXTF9Db21ib0JveDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIEZYX05FVyBDRldMX0NvbWJvQm94Ow0KIH0NCi1GV0xfRVJSCUNGV0xfQ29tYm9Cb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyApDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGlmIChwUHJvcGVydGllcykgew0KLSAgICAgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoIW1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIGlmIChwUHJvcGVydGllcykgew0KKyAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCisgIH0NCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgcHJvcC5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCisgIHByb3AubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICBwcm9wLm1fZHdTdHlsZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzOw0KKyAgcHJvcC5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCisgIHByb3AubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorICBwcm9wLm1fcERhdGFQcm92aWRlciA9ICZtX2NvbWJvQm94RGF0YTsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCisgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQorICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQorICB9DQorICBtX3BJbXAgPSBJRldMX0NvbWJvQm94OjpDcmVhdGUoKTsNCisgIEZXTF9FUlIgcmV0ID0gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KKyAgaWYgKHJldCA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KKyAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIHJldDsNCit9DQoraW50MzJfdCBDRldMX0NvbWJvQm94OjpBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RleHQpIHsNCisgIENGV0xfQ29tYm9Cb3hJdGVtKiBwSXRlbSA9IEZYX05FVyBDRldMX0NvbWJvQm94SXRlbTsNCisgIHBJdGVtLT5tX3dzVGV4dCA9IHdzVGV4dDsNCisgIHBJdGVtLT5tX2R3U3R5bGVzID0gMDsNCisgIHJldHVybiBtX2NvbWJvQm94RGF0YS5tX2Fyckl0ZW0uQWRkKHBJdGVtKTsNCit9DQoraW50MzJfdCBDRldMX0NvbWJvQm94OjpBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwSWNvbikgew0KKyAgQ0ZXTF9Db21ib0JveEl0ZW0qIHBJdGVtID0gRlhfTkVXIENGV0xfQ29tYm9Cb3hJdGVtOw0KKyAgcEl0ZW0tPm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgcEl0ZW0tPm1fZHdTdHlsZXMgPSAwOw0KKyAgcEl0ZW0tPm1fcERJQiA9IHBJY29uOw0KKyAgcmV0dXJuIG1fY29tYm9Cb3hEYXRhLm1fYXJySXRlbS5BZGQocEl0ZW0pOw0KK30NCitpbnQzMl90IENGV0xfQ29tYm9Cb3g6OlJlbW92ZUF0KGludDMyX3QgaUluZGV4KSB7DQorICByZXR1cm4gbV9jb21ib0JveERhdGEubV9hcnJJdGVtLlJlbW92ZUF0KGlJbmRleCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveDo6UmVtb3ZlQWxsKCkgew0KKyAgbV9jb21ib0JveERhdGEubV9hcnJJdGVtLlJlbW92ZUFsbCgpOw0KKyAgcmV0dXJuIDA7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveDo6Q291bnRJdGVtcygpIHsNCisgIHJldHVybiBtX2NvbWJvQm94RGF0YS5Db3VudEl0ZW1zKEdldFdpZGdldCgpKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpHZXRUZXh0QnlJbmRleChpbnQzMl90IGlJbmRleCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgQ0ZXTF9Db21ib0JveEl0ZW0qIHBJdGVtID0NCisgICAgICAoQ0ZXTF9Db21ib0JveEl0ZW0qKShtX2NvbWJvQm94RGF0YS5HZXRJdGVtKChJRldMX1dpZGdldCopdGhpcywgaUluZGV4KSk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgd3NUZXh0ID0gcEl0ZW0tPm1fd3NUZXh0Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfQ29tYm9Cb3g6OkdldEN1clNlbCgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAtMSk7DQorICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5HZXRDdXJTZWwoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpTZXRDdXJTZWwoaW50MzJfdCBpU2VsKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPlNldEN1clNlbChpU2VsKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGV4dCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5TZXRFZGl0VGV4dCh3c1RleHQpOw0KK30NCitpbnQzMl90IENGV0xfQ29tYm9Cb3g6OkdldEVkaXRUZXh0TGVuZ3RoKCkgY29uc3Qgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KKyAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+R2V0RWRpdFRleHRMZW5ndGgoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCkgY29uc3Qgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5HZXRFZGl0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpTZXRFZGl0U2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPlNldEVkaXRTZWxSYW5nZShuU3RhcnQsIG5Db3VudCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveDo6R2V0RWRpdFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90JiBuU3RhcnQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkdldEVkaXRTZWxSYW5nZShuSW5kZXgsIG5TdGFydCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveDo6R2V0RWRpdExpbWl0KCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KKyAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+R2V0RWRpdExpbWl0KCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6U2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPlNldEVkaXRMaW1pdChuTGltaXQpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkVkaXREb0NsaXBib2FyZChpbnQzMl90IGlDbWQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdERvQ2xpcGJvYXJkKGlDbWQpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXRSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5FZGl0UmVkbyhic1JlY29yZCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveDo6RWRpdFVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRVbmRvKGJzUmVjb3JkKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpTZXRNYXhMaXN0SGVpZ2h0KEZYX0ZMT0FUIGZNYXhIZWlnaHQpIHsNCisgIG1fY29tYm9Cb3hEYXRhLm1fZk1heExpc3RIZWlnaHQgPSBmTWF4SGVpZ2h0Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldEl0ZW1EYXRhKGludDMyX3QgaUluZGV4LCB2b2lkKiBwRGF0YSkgew0KKyAgQ0ZXTF9Db21ib0JveEl0ZW0qIHBJdGVtID0NCisgICAgICAoQ0ZXTF9Db21ib0JveEl0ZW0qKShtX2NvbWJvQm94RGF0YS5HZXRJdGVtKChJRldMX1dpZGdldCopdGhpcywgaUluZGV4KSk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcEl0ZW0tPm1fcERhdGEgPSBwRGF0YTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCogQ0ZXTF9Db21ib0JveDo6R2V0SXRlbURhdGEoaW50MzJfdCBpSW5kZXgpIHsNCisgIENGV0xfQ29tYm9Cb3hJdGVtKiBwSXRlbSA9DQorICAgICAgKENGV0xfQ29tYm9Cb3hJdGVtKikobV9jb21ib0JveERhdGEuR2V0SXRlbSgoSUZXTF9XaWRnZXQqKXRoaXMsIGlJbmRleCkpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwSXRlbSwgTlVMTCk7DQorICByZXR1cm4gcEl0ZW0tPm1fcERhdGE7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6U2V0TGlzdFRoZW1lKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lKSB7DQorICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5HZXRMaXN0Qm94dCgpLT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveDo6QWZ0ZXJGb2N1c1Nob3dEcm9wTGlzdCgpIHsNCisgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkFmdGVyRm9jdXNTaG93RHJvcExpc3QoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpPcGVuRHJvcERvd25MaXN0KEZYX0JPT0wgYkFjdGl2YXRlKSB7DQorICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5PcGVuRHJvcERvd25MaXN0KGJBY3RpdmF0ZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveDo6RWRpdENhblVuZG8oKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdENhblVuZG8oKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0Q2FuUmVkbygpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5FZGl0Q2FuUmVkbygpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXRVbmRvKCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRVbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveDo6RWRpdFJlZG8oKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdFJlZG8oKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0Q2FuQ29weSgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5FZGl0Q2FuQ29weSgpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXRDYW5DdXQoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdENhbkN1dCgpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXRDYW5TZWxlY3RBbGwoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdENhblNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXRDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5FZGl0Q29weSh3c0NvcHkpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXRDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdEN1dCh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveDo6RWRpdFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdFBhc3RlKHdzUGFzdGUpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXRTZWxlY3RBbGwoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdFNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXREZWxldGUoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdERlbGV0ZSgpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXREZVNlbGVjdCgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5FZGl0RGVTZWxlY3QoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpHZXRCQm94KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkdldEJCb3gocmVjdCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6RWRpdE1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCkNCisgICAgICAtPkVkaXRNb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCit9DQorQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveCgpIHt9DQorQ0ZXTF9Db21ib0JveDo6fkNGV0xfQ29tYm9Cb3goKSB7fQ0KK0NGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6Q0ZXTF9Db21ib0JveERQKCkgew0KKyAgbV9mSXRlbUhlaWdodCA9IDA7DQorICBtX2ZNYXhMaXN0SGVpZ2h0ID0gMDsNCit9DQorQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjp+Q0ZXTF9Db21ib0JveERQKCkgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX2Fyckl0ZW0uR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgQ0ZXTF9Db21ib0JveEl0ZW0qIHBJdGVtID0gKENGV0xfQ29tYm9Cb3hJdGVtKiltX2Fyckl0ZW1baV07DQorICAgIGlmIChwSXRlbSkgew0KKyAgICAgIGRlbGV0ZSBwSXRlbTsNCiAgICAgfQ0KLSAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCi0gICAgcHJvcC5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCi0gICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgcHJvcC5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCi0gICAgcHJvcC5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCi0gICAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCi0gICAgcHJvcC5tX3BEYXRhUHJvdmlkZXIgPSAmbV9jb21ib0JveERhdGE7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCi0gICAgICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wT3duZXIpIHsNCi0gICAgICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQotICAgIH0NCi0gICAgbV9wSW1wID0gSUZXTF9Db21ib0JveDo6Q3JlYXRlKCk7DQotICAgIEZXTF9FUlIgcmV0ID0gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KLSAgICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQotICAgICAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KLSAgICB9DQotICAgIHJldHVybiByZXQ7DQorICB9DQorICBtX2Fyckl0ZW0uUmVtb3ZlQWxsKCk7DQogfQ0KLWludDMyX3QgQ0ZXTF9Db21ib0JveDo6QWRkU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KQ0KLXsNCi0gICAgQ0ZXTF9Db21ib0JveEl0ZW0gKnBJdGVtID0gRlhfTkVXIENGV0xfQ29tYm9Cb3hJdGVtOw0KLSAgICBwSXRlbS0+bV93c1RleHQgPSB3c1RleHQ7DQotICAgIHBJdGVtLT5tX2R3U3R5bGVzID0gMDsNCi0gICAgcmV0dXJuIG1fY29tYm9Cb3hEYXRhLm1fYXJySXRlbS5BZGQocEl0ZW0pOw0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpDb3VudEl0ZW1zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9hcnJJdGVtLkdldFNpemUoKTsNCiB9DQotaW50MzJfdCBDRldMX0NvbWJvQm94OjpBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RleHQsIENGWF9ESUJpdG1hcCAqcEljb24pDQotew0KLSAgICBDRldMX0NvbWJvQm94SXRlbSAqcEl0ZW0gPSBGWF9ORVcgQ0ZXTF9Db21ib0JveEl0ZW07DQotICAgIHBJdGVtLT5tX3dzVGV4dCA9IHdzVGV4dDsNCi0gICAgcEl0ZW0tPm1fZHdTdHlsZXMgPSAwOw0KLSAgICBwSXRlbS0+bV9wRElCID0gcEljb247DQotICAgIHJldHVybiBtX2NvbWJvQm94RGF0YS5tX2Fyckl0ZW0uQWRkKHBJdGVtKTsNCitGV0xfSExJU1RJVEVNIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX2Fyckl0ZW0uR2V0U2l6ZSgpOw0KKyAgaWYgKG5JbmRleCA+PSBpQ291bnQgfHwgbkluZGV4IDwgMCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiAoRldMX0hMSVNUSVRFTSltX2Fyckl0ZW1bbkluZGV4XTsNCiB9DQotaW50MzJfdCBDRldMX0NvbWJvQm94OjpSZW1vdmVBdChpbnQzMl90IGlJbmRleCkNCi17DQotICAgIHJldHVybiBtX2NvbWJvQm94RGF0YS5tX2Fyckl0ZW0uUmVtb3ZlQXQoaUluZGV4KTsNCitpbnQzMl90IENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgcmV0dXJuIG1fYXJySXRlbS5GaW5kKGhJdGVtKTsNCiB9DQotaW50MzJfdCBDRldMX0NvbWJvQm94OjpSZW1vdmVBbGwoKQ0KLXsNCi0gICAgbV9jb21ib0JveERhdGEubV9hcnJJdGVtLlJlbW92ZUFsbCgpOw0KLSAgICByZXR1cm4gMDsNCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7DQorICByZXR1cm4gbV9hcnJJdGVtLlNldEF0KG5JbmRleCwgaEl0ZW0pOw0KIH0NCi1pbnQzMl90IENGV0xfQ29tYm9Cb3g6OkNvdW50SXRlbXMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fY29tYm9Cb3hEYXRhLkNvdW50SXRlbXMoR2V0V2lkZ2V0KCkpOw0KK0ZYX0RXT1JEIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbVN0eWxlcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgMCk7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW0pLT5tX2R3U3R5bGVzOw0KIH0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkdldFRleHRCeUluZGV4KGludDMyX3QgaUluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgQ0ZXTF9Db21ib0JveEl0ZW0gKnBJdGVtID0gKENGV0xfQ29tYm9Cb3hJdGVtKikobV9jb21ib0JveERhdGEuR2V0SXRlbSgoSUZXTF9XaWRnZXQgKil0aGlzLCBpSW5kZXgpKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgd3NUZXh0ID0gcEl0ZW0tPm1fd3NUZXh0Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW1UZXh0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgd3NUZXh0ID0gKChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW0pLT5tX3dzVGV4dDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotaW50MzJfdCBDRldMX0NvbWJvQm94OjpHZXRDdXJTZWwoKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIC0xKTsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+R2V0Q3VyU2VsKCk7DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW1SZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0SXRlbSkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIENGV0xfQ29tYm9Cb3hJdGVtKiBwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW07DQorICBydEl0ZW0uU2V0KHBJdGVtLT5tX3J0SXRlbS5sZWZ0LCBwSXRlbS0+bV9ydEl0ZW0udG9wLCBwSXRlbS0+bV9ydEl0ZW0ud2lkdGgsDQorICAgICAgICAgICAgIHBJdGVtLT5tX3J0SXRlbS5oZWlnaHQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldEN1clNlbChpbnQzMl90IGlTZWwpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+U2V0Q3VyU2VsKGlTZWwpOw0KK3ZvaWQqIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbURhdGEoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBOVUxMKTsNCisgIENGV0xfQ29tYm9Cb3hJdGVtKiBwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW07DQorICByZXR1cm4gcEl0ZW0tPm1fcERhdGE7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6U2V0RWRpdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RleHQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+U2V0RWRpdFRleHQod3NUZXh0KTsNCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbVN0eWxlcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAoKENGV0xfQ29tYm9Cb3hJdGVtKiloSXRlbSktPm1fZHdTdHlsZXMgPSBkd1N0eWxlOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1pbnQzMl90IENGV0xfQ29tYm9Cb3g6OkdldEVkaXRUZXh0TGVuZ3RoKCkgY29uc3QNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+R2V0RWRpdFRleHRMZW5ndGgoKTsNCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbVRleHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pUZXh0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgKChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW0pLT5tX3dzVGV4dCA9IHBzelRleHQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6R2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSBjb25zdA0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkdldEVkaXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpTZXRJdGVtUmVjdChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0pIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAoKENGV0xfQ29tYm9Cb3hJdGVtKiloSXRlbSktPm1fcnRJdGVtID0gcnRJdGVtOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldEVkaXRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+U2V0RWRpdFNlbFJhbmdlKG5TdGFydCwgbkNvdW50KTsNCitGWF9GTE9BVCBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW1IZWlnaHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX2ZJdGVtSGVpZ2h0Ow0KIH0NCi1pbnQzMl90IENGV0xfQ29tYm9Cb3g6OkdldEVkaXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCAmblN0YXJ0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KLSAgICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5HZXRFZGl0U2VsUmFuZ2UobkluZGV4LCBuU3RhcnQpOw0KK0NGWF9ESUJpdG1hcCogQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpHZXRJdGVtSWNvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgTlVMTCk7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW0pLT5tX3BESUI7DQogfQ0KLWludDMyX3QgQ0ZXTF9Db21ib0JveDo6R2V0RWRpdExpbWl0KCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+R2V0RWRpdExpbWl0KCk7DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0Q2hlY2spIHsNCisgIENGV0xfQ29tYm9Cb3hJdGVtKiBwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW07DQorICBydENoZWNrID0gcEl0ZW0tPm1fcnRDaGVja0JveDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX0NvbWJvQm94OjpTZXRFZGl0TGltaXQoaW50MzJfdCBuTGltaXQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+U2V0RWRpdExpbWl0KG5MaW1pdCk7DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OlNldEl0ZW1DaGVja1JlY3QoDQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2hlY2spIHsNCisgIENGV0xfQ29tYm9Cb3hJdGVtKiBwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW07DQorICBwSXRlbS0+bV9ydENoZWNrQm94ID0gcnRDaGVjazsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX0NvbWJvQm94OjpFZGl0RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXREb0NsaXBib2FyZChpQ21kKTsNCitGWF9EV09SRCBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW1DaGVja1N0YXRlKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgQ0ZXTF9Db21ib0JveEl0ZW0qIHBJdGVtID0gKENGV0xfQ29tYm9Cb3hJdGVtKiloSXRlbTsNCisgIHJldHVybiBwSXRlbS0+bV9kd0NoZWNrU3RhdGU7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9Db21ib0JveDo6RWRpdFJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRSZWRvKGJzUmVjb3JkKTsNCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbUNoZWNrU3RhdGUoDQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICBGWF9EV09SRCBkd0NoZWNrU3RhdGUpIHsNCisgIENGV0xfQ29tYm9Cb3hJdGVtKiBwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW07DQorICBwSXRlbS0+bV9kd0NoZWNrU3RhdGUgPSBkd0NoZWNrU3RhdGU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9Db21ib0JveDo6RWRpdFVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRVbmRvKGJzUmVjb3JkKTsNCi19DQotRldMX0VSUiBDRldMX0NvbWJvQm94OjpTZXRNYXhMaXN0SGVpZ2h0KEZYX0ZMT0FUIGZNYXhIZWlnaHQpDQotew0KLSAgICBtX2NvbWJvQm94RGF0YS5tX2ZNYXhMaXN0SGVpZ2h0ID0gZk1heEhlaWdodDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfQ29tYm9Cb3g6OlNldEl0ZW1EYXRhKGludDMyX3QgaUluZGV4LCB2b2lkKiBwRGF0YSkNCi17DQotICAgIENGV0xfQ29tYm9Cb3hJdGVtICpwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopKG1fY29tYm9Cb3hEYXRhLkdldEl0ZW0oKElGV0xfV2lkZ2V0ICopdGhpcywgaUluZGV4KSk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHBJdGVtLT5tX3BEYXRhID0gcERhdGE7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotdm9pZCogQ0ZXTF9Db21ib0JveDo6R2V0SXRlbURhdGEoaW50MzJfdCBpSW5kZXgpDQotew0KLSAgICBDRldMX0NvbWJvQm94SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9Db21ib0JveEl0ZW0qKShtX2NvbWJvQm94RGF0YS5HZXRJdGVtKChJRldMX1dpZGdldCAqKXRoaXMsIGlJbmRleCkpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBJdGVtLCBOVUxMKTsNCi0gICAgcmV0dXJuIHBJdGVtLT5tX3BEYXRhOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldExpc3RUaGVtZShJRldMX1RoZW1lUHJvdmlkZXIgKnBUaGVtZSkNCi17DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkdldExpc3RCb3h0KCktPlNldFRoZW1lUHJvdmlkZXIocFRoZW1lKTsNCi19DQotRlhfQk9PTCBDRldMX0NvbWJvQm94OjpBZnRlckZvY3VzU2hvd0Ryb3BMaXN0KCkNCi17DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkFmdGVyRm9jdXNTaG93RHJvcExpc3QoKTsNCi19DQotRldMX0VSUiBDRldMX0NvbWJvQm94OjpPcGVuRHJvcERvd25MaXN0KEZYX0JPT0wgYkFjdGl2YXRlKQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+T3BlbkRyb3BEb3duTGlzdChiQWN0aXZhdGUpOw0KLX0NCi1GWF9CT09MCUNGV0xfQ29tYm9Cb3g6OkVkaXRDYW5VbmRvKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRDYW5VbmRvKCk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Db21ib0JveDo6RWRpdENhblJlZG8oKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdENhblJlZG8oKTsNCi19DQotRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0VW5kbygpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KLSAgICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5FZGl0VW5kbygpOw0KLX0NCi1GWF9CT09MCUNGV0xfQ29tYm9Cb3g6OkVkaXRSZWRvKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRSZWRvKCk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Db21ib0JveDo6RWRpdENhbkNvcHkoKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdENhbkNvcHkoKTsNCi19DQotRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0Q2FuQ3V0KCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRDYW5DdXQoKTsNCi19DQotRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0Q2FuU2VsZWN0QWxsKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRDYW5TZWxlY3RBbGwoKTsNCi19DQotRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0Q29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdENvcHkod3NDb3B5KTsNCi19DQotRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0Q3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRDdXQod3NDdXQpOw0KLX0NCi1GWF9CT09MCUNGV0xfQ29tYm9Cb3g6OkVkaXRQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRQYXN0ZSh3c1Bhc3RlKTsNCi19DQotRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0U2VsZWN0QWxsKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXRTZWxlY3RBbGwoKTsNCi19DQotRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0RGVsZXRlKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQotICAgIHJldHVybiAoKElGV0xfQ29tYm9Cb3gqKW1fcEltcCktPkVkaXREZWxldGUoKTsNCi19DQotRlhfQk9PTAlDRldMX0NvbWJvQm94OjpFZGl0RGVTZWxlY3QoKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCi0gICAgcmV0dXJuICgoSUZXTF9Db21ib0JveCopbV9wSW1wKS0+RWRpdERlU2VsZWN0KCk7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9Db21ib0JveDo6R2V0QkJveChDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KLSAgICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5HZXRCQm94KHJlY3QpOw0KLX0NCi1GV0xfRVJSIAlDRldMX0NvbWJvQm94OjpFZGl0TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KLSAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KLSAgICByZXR1cm4gKChJRldMX0NvbWJvQm94KiltX3BJbXApLT5FZGl0TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQotfQ0KLUNGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3goKQ0KLXsNCi19DQotQ0ZXTF9Db21ib0JveDo6fkNGV0xfQ29tYm9Cb3goKQ0KLXsNCi19DQotQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpDRldMX0NvbWJvQm94RFAoKQ0KLXsNCi0gICAgbV9mSXRlbUhlaWdodCA9IDA7DQotICAgIG1fZk1heExpc3RIZWlnaHQgPSAwOw0KLX0NCi1DRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6On5DRldMX0NvbWJvQm94RFAoKQ0KLXsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBtX2Fyckl0ZW0uR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIENGV0xfQ29tYm9Cb3hJdGVtICpwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopbV9hcnJJdGVtW2ldOw0KLSAgICAgICAgaWYgKHBJdGVtKSB7DQotICAgICAgICAgICAgZGVsZXRlIHBJdGVtOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fYXJySXRlbS5SZW1vdmVBbGwoKTsNCi19DQotaW50MzJfdCBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkNvdW50SXRlbXMoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gbV9hcnJJdGVtLkdldFNpemUoKTsNCi19DQotRldMX0hMSVNUSVRFTSBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW0oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGludDMyX3QgbkluZGV4KQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX2Fyckl0ZW0uR2V0U2l6ZSgpOw0KLSAgICBpZiAobkluZGV4ID49IGlDb3VudCB8fCBuSW5kZXggPCAwKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gKEZXTF9ITElTVElURU0pbV9hcnJJdGVtW25JbmRleF07DQotfQ0KLWludDMyX3QgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpHZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICByZXR1cm4gbV9hcnJJdGVtLkZpbmQoaEl0ZW0pOw0KLX0NCi1GWF9CT09MIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBpbnQzMl90IG5JbmRleCkNCi17DQotICAgIHJldHVybiBtX2Fyckl0ZW0uU2V0QXQobkluZGV4LCBoSXRlbSk7DQotfQ0KLUZYX0RXT1JEIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbVN0eWxlcyhJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIDApOw0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW0pLT5tX2R3U3R5bGVzOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbVRleHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICB3c1RleHQgPSAoKENGV0xfQ29tYm9Cb3hJdGVtKiloSXRlbSktPm1fd3NUZXh0Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpHZXRJdGVtUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1JlY3RGJiBydEl0ZW0pDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBDRldMX0NvbWJvQm94SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9Db21ib0JveEl0ZW0qKWhJdGVtOw0KLSAgICBydEl0ZW0uU2V0KHBJdGVtLT5tX3J0SXRlbS5sZWZ0LA0KLSAgICAgICAgICAgICAgIHBJdGVtLT5tX3J0SXRlbS50b3AsDQotICAgICAgICAgICAgICAgcEl0ZW0tPm1fcnRJdGVtLndpZHRoLA0KLSAgICAgICAgICAgICAgIHBJdGVtLT5tX3J0SXRlbS5oZWlnaHQpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLXZvaWQqIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbURhdGEoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBOVUxMKTsNCi0gICAgQ0ZXTF9Db21ib0JveEl0ZW0gKnBJdGVtID0gKENGV0xfQ29tYm9Cb3hJdGVtKiloSXRlbTsNCi0gICAgcmV0dXJuIHBJdGVtLT5tX3BEYXRhOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbVN0eWxlcyhJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfRFdPUkQgZHdTdHlsZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgICgoQ0ZXTF9Db21ib0JveEl0ZW0qKWhJdGVtKS0+bV9kd1N0eWxlcyA9IGR3U3R5bGU7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OlNldEl0ZW1UZXh0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBjb25zdCBGWF9XQ0hBUiogcHN6VGV4dCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgICgoQ0ZXTF9Db21ib0JveEl0ZW0qKWhJdGVtKS0+bV93c1RleHQgPSBwc3pUZXh0Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpTZXRJdGVtUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0pDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICAoKENGV0xfQ29tYm9Cb3hJdGVtKiloSXRlbSktPm1fcnRJdGVtID0gcnRJdGVtOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0ZMT0FUIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbUhlaWdodChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBtX2ZJdGVtSGVpZ2h0Ow0KLX0NCi1DRlhfRElCaXRtYXAqIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbUljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBOVUxMKTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveEl0ZW0qKWhJdGVtKS0+bV9wRElCOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbUNoZWNrUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1JlY3RGJiBydENoZWNrKQ0KLXsNCi0gICAgQ0ZXTF9Db21ib0JveEl0ZW0gKnBJdGVtID0gKENGV0xfQ29tYm9Cb3hJdGVtKiloSXRlbTsNCi0gICAgcnRDaGVjayA9IHBJdGVtLT5tX3J0Q2hlY2tCb3g7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OlNldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IENGWF9SZWN0RiYgcnRDaGVjaykNCi17DQotICAgIENGV0xfQ29tYm9Cb3hJdGVtICpwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW07DQotICAgIHBJdGVtLT5tX3J0Q2hlY2tCb3ggPSBydENoZWNrOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0RXT1JEIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICBDRldMX0NvbWJvQm94SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9Db21ib0JveEl0ZW0qKWhJdGVtOw0KLSAgICByZXR1cm4gcEl0ZW0tPm1fZHdDaGVja1N0YXRlOw0KLX0NCi1GV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0RXT1JEIGR3Q2hlY2tTdGF0ZSkNCi17DQotICAgIENGV0xfQ29tYm9Cb3hJdGVtICpwSXRlbSA9IChDRldMX0NvbWJvQm94SXRlbSopaEl0ZW07DQotICAgIHBJdGVtLT5tX2R3Q2hlY2tTdGF0ZSA9IGR3Q2hlY2tTdGF0ZTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9GTE9BVCBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldExpc3RIZWlnaHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gbV9mTWF4TGlzdEhlaWdodDsNCitGWF9GTE9BVCBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldExpc3RIZWlnaHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX2ZNYXhMaXN0SGVpZ2h0Ow0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvZGF0ZXRpbWVwaWNrZXIuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2RhdGV0aW1lcGlja2VyLmNwcAppbmRleCBlZTY0ZDA5Li4wMDhhMjIxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvZGF0ZXRpbWVwaWNrZXIuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9kYXRldGltZXBpY2tlci5jcHAKQEAgLTUsMTUyICs1LDEzNSBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCi1DRldMX0RhdGVUaW1lUGlja2VyKiBDRldMX0RhdGVUaW1lUGlja2VyOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDRldMX0RhdGVUaW1lUGlja2VyOw0KK0NGV0xfRGF0ZVRpbWVQaWNrZXIqIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBGWF9ORVcgQ0ZXTF9EYXRlVGltZVBpY2tlcjsNCiB9DQotRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTCghbV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBpZiAocFByb3BlcnRpZXMpIHsNCi0gICAgICAgICptX3BQcm9wZXJ0aWVzID0gKnBQcm9wZXJ0aWVzOw0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KLSAgICBwcm9wLm1fZHdTdHlsZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzOw0KLSAgICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KLSAgICBwcm9wLm1fZHdTdGF0ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KLSAgICBwcm9wLm1fY3RtT25QYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50Ow0KLSAgICBwcm9wLm1fcERhdGFQcm92aWRlciA9ICZtX0RhdGVUaW1lUGlja2VyRFA7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCi0gICAgICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wT3duZXIpIHsNCi0gICAgICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQotICAgIH0NCi0gICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgbV9wSW1wID0gSUZXTF9EYXRlVGltZVBpY2tlcjo6Q3JlYXRlKCk7DQotICAgIEZXTF9FUlIgcmV0ID0gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KLSAgICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQotICAgICAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KLSAgICB9DQotICAgIHJldHVybiByZXQ7DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpJbml0aWFsaXplKA0KKyAgICBjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICB9DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICBwcm9wLm1fcERhdGFQcm92aWRlciA9ICZtX0RhdGVUaW1lUGlja2VyRFA7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQorICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcikgew0KKyAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KKyAgfQ0KKyAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIG1fcEltcCA9IElGV0xfRGF0ZVRpbWVQaWNrZXI6OkNyZWF0ZSgpOw0KKyAgRldMX0VSUiByZXQgPSAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQorICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQorICB9DQorICByZXR1cm4gcmV0Ow0KIH0NCi1GV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldFRvZGF5KGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpDQotew0KLSAgICBtX0RhdGVUaW1lUGlja2VyRFAubV9pWWVhciA9IGlZZWFyOw0KLSAgICBtX0RhdGVUaW1lUGlja2VyRFAubV9pTW9udGggPSBpTW9udGg7DQotICAgIG1fRGF0ZVRpbWVQaWNrZXJEUC5tX2lEYXkgPSBpRGF5Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpTZXRUb2RheShpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXkpIHsNCisgIG1fRGF0ZVRpbWVQaWNrZXJEUC5tX2lZZWFyID0gaVllYXI7DQorICBtX0RhdGVUaW1lUGlja2VyRFAubV9pTW9udGggPSBpTW9udGg7DQorICBtX0RhdGVUaW1lUGlja2VyRFAubV9pRGF5ID0gaURheTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotaW50MzJfdCBDRldMX0RhdGVUaW1lUGlja2VyOjpDb3VudFNlbFJhbmdlcygpDQotew0KLSAgICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5Db3VudFNlbFJhbmdlcygpOw0KK2ludDMyX3QgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q291bnRTZWxSYW5nZXMoKSB7DQorICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5Db3VudFNlbFJhbmdlcygpOw0KIH0NCi1pbnQzMl90IENGV0xfRGF0ZVRpbWVQaWNrZXI6OkdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90ICZuU3RhcnQpDQotew0KLSAgICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5HZXRTZWxSYW5nZShuSW5kZXgsIG5TdGFydCk7DQoraW50MzJfdCBDRldMX0RhdGVUaW1lUGlja2VyOjpHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KSB7DQorICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5HZXRTZWxSYW5nZShuSW5kZXgsIG5TdGFydCk7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9EYXRlVGltZVBpY2tlcjo6R2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCi17DQotICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkdldEVkaXRUZXh0KHdzVGV4dCk7DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5HZXRFZGl0VGV4dCh3c1RleHQpOw0KIH0NCi1GV0xfRVJSCUNGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+U2V0RWRpdFRleHQod3NUZXh0KTsNCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KSB7DQorICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5TZXRFZGl0VGV4dCh3c1RleHQpOw0KIH0NCi1GV0xfRVJSCUNGV0xfRGF0ZVRpbWVQaWNrZXI6OkdldEN1clNlbChpbnQzMl90ICZpWWVhciwgaW50MzJfdCAmaU1vbnRoLCBpbnQzMl90ICZpRGF5KQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+R2V0Q3VyU2VsKGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6R2V0Q3VyU2VsKGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRGF5KSB7DQorICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5HZXRDdXJTZWwoaVllYXIsIGlNb250aCwgaURheSk7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9EYXRlVGltZVBpY2tlcjo6U2V0Q3VyU2VsKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpDQotew0KLSAgICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5TZXRDdXJTZWwoaVllYXIsIGlNb250aCwgaURheSk7DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpTZXRDdXJTZWwoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXkpIHsNCisgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPlNldEN1clNlbChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCiB9DQotQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q0ZXTF9EYXRlVGltZVBpY2tlcigpDQotew0KK0NGV0xfRGF0ZVRpbWVQaWNrZXI6OkNGV0xfRGF0ZVRpbWVQaWNrZXIoKSB7fQ0KK0NGV0xfRGF0ZVRpbWVQaWNrZXI6On5DRldMX0RhdGVUaW1lUGlja2VyKCkge30NCitDRldMX0RhdGVUaW1lUGlja2VyOjpDRldMX0RhdGVUaW1lUGlja2VyRFA6OkNGV0xfRGF0ZVRpbWVQaWNrZXJEUCgpIHsNCisgIG1faVllYXIgPSAyMDExOw0KKyAgbV9pTW9udGggPSAxOw0KKyAgbV9pRGF5ID0gMTsNCiB9DQotQ0ZXTF9EYXRlVGltZVBpY2tlcjo6fkNGV0xfRGF0ZVRpbWVQaWNrZXIoKQ0KLXsNCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNGV0xfRGF0ZVRpbWVQaWNrZXJEUDo6R2V0Q2FwdGlvbigNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pIHsNCisgIHdzQ2FwdGlvbiA9IG1fd3NEYXRhOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRldMX0RhdGVUaW1lUGlja2VyOjpDRldMX0RhdGVUaW1lUGlja2VyRFA6OkNGV0xfRGF0ZVRpbWVQaWNrZXJEUCgpDQotew0KLSAgICBtX2lZZWFyID0gMjAxMTsNCi0gICAgbV9pTW9udGggPSAxOw0KLSAgICBtX2lEYXkgPSAxOw0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q0ZXTF9EYXRlVGltZVBpY2tlckRQOjpHZXRUb2RheSgNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgIGludDMyX3QmIGlZZWFyLA0KKyAgICBpbnQzMl90JiBpTW9udGgsDQorICAgIGludDMyX3QmIGlEYXkpIHsNCisgIGlZZWFyID0gbV9pWWVhcjsNCisgIGlNb250aCA9IG1faU1vbnRoOw0KKyAgaURheSA9IG1faURheTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpDRldMX0RhdGVUaW1lUGlja2VyRFA6OkdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pDQotew0KLSAgICB3c0NhcHRpb24gPSBtX3dzRGF0YTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuVW5kbygpIHsNCisgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNhblVuZG8oKTsNCiB9DQotRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpDRldMX0RhdGVUaW1lUGlja2VyRFA6OkdldFRvZGF5KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBpbnQzMl90ICZpWWVhciwgaW50MzJfdCAmaU1vbnRoLCBpbnQzMl90ICZpRGF5KQ0KLXsNCi0gICAgaVllYXIgPSBtX2lZZWFyOw0KLSAgICBpTW9udGggPSBtX2lNb250aDsNCi0gICAgaURheSA9IG1faURheTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuUmVkbygpIHsNCisgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNhblJlZG8oKTsNCiB9DQotRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VyOjpDYW5VbmRvKCkNCi17DQotICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNhblVuZG8oKTsNCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXI6OlVuZG8oKSB7DQorICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5VbmRvKCk7DQogfQ0KLUZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuUmVkbygpDQotew0KLSAgICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5DYW5SZWRvKCk7DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VyOjpSZWRvKCkgew0KKyAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+UmVkbygpOw0KIH0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXI6OlVuZG8oKQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+VW5kbygpOw0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuQ29weSgpIHsNCisgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNhbkNvcHkoKTsNCiB9DQotRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VyOjpSZWRvKCkNCi17DQotICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPlJlZG8oKTsNCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNhbkN1dCgpIHsNCisgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNhbkN1dCgpOw0KIH0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXI6OkNhbkNvcHkoKQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+Q2FuQ29weSgpOw0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuU2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+Q2FuU2VsZWN0QWxsKCk7DQogfQ0KLUZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuQ3V0KCkNCi17DQotICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNhbkN1dCgpOw0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KSB7DQorICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5Db3B5KHdzQ29weSk7DQogfQ0KLUZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuU2VsZWN0QWxsKCkNCi17DQotICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkNhblNlbGVjdEFsbCgpOw0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgew0KKyAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+Q29weSh3c0N1dCk7DQogfQ0KLUZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+Q29weSh3c0NvcHkpOw0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpIHsNCisgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPlBhc3RlKHdzUGFzdGUpOw0KIH0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXI6OkN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpDQotew0KLSAgICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5Db3B5KHdzQ3V0KTsNCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXI6OlNlbGVjdEFsbCgpIHsNCisgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPlNlbGVjdEFsbCgpOw0KIH0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXI6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+UGFzdGUod3NQYXN0ZSk7DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VyOjpEZWxldGUoKSB7DQorICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5EZWxldGUoKTsNCiB9DQotRlhfQk9PTAlDRldMX0RhdGVUaW1lUGlja2VyOjpTZWxlY3RBbGwoKQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+U2VsZWN0QWxsKCk7DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VyOjpEZVNlbGVjdCgpIHsNCisgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkRlU2VsZWN0KCk7DQogfQ0KLUZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlcjo6RGVsZXRlKCkNCi17DQotICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkRlbGV0ZSgpOw0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6R2V0QkJveChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPkdldEJCb3gocmVjdCk7DQogfQ0KLUZYX0JPT0wJQ0ZXTF9EYXRlVGltZVBpY2tlcjo6RGVTZWxlY3QoKQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+RGVTZWxlY3QoKTsNCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCkgew0KKyAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+U2V0RWRpdExpbWl0KG5MaW1pdCk7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6R2V0QkJveChDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICByZXR1cm4gKChJRldMX0RhdGVUaW1lUGlja2VyKiltX3BJbXApLT5HZXRCQm94KHJlY3QpOw0KLX0NCi1GV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCkNCi17DQotICAgIHJldHVybiAoKElGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcEltcCktPlNldEVkaXRMaW1pdChuTGltaXQpOw0KLX0NCi1GV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6Ok1vZGlmeUVkaXRTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKS0+TW9kaWZ5RWRpdFN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6TW9kaWZ5RWRpdFN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCkgew0KKyAgcmV0dXJuICgoSUZXTF9EYXRlVGltZVBpY2tlciopbV9wSW1wKQ0KKyAgICAgIC0+TW9kaWZ5RWRpdFN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvZWRpdC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvZWRpdC5jcHAKaW5kZXggMzEwZTY4Yi4uODQ0N2QxNCAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2VkaXQuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9lZGl0LmNwcApAQCAtNSwyMjIgKzUsMTg3IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KLUNGV0xfRWRpdCogQ0ZXTF9FZGl0OjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDRldMX0VkaXQ7DQorQ0ZXTF9FZGl0KiBDRldMX0VkaXQ6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBGWF9ORVcgQ0ZXTF9FZGl0Ow0KIH0NCi1GV0xfRVJSIENGV0xfRWRpdDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoIW1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKHBQcm9wZXJ0aWVzKSB7DQotICAgICAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCi0gICAgfQ0KLSAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCi0gICAgcHJvcC5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCi0gICAgcHJvcC5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCi0gICAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCi0gICAgcHJvcC5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudCkgew0KLSAgICAgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KLSAgICB9DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcikgew0KLSAgICAgICAgcHJvcC5tX3BPd25lciA9IG1fcFByb3BlcnRpZXMtPm1fcE93bmVyLT5HZXRXaWRnZXQoKTsNCi0gICAgfQ0KLSAgICBwcm9wLm1fcnRXaWRnZXQgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KLSAgICBtX3BJbXAgPSBJRldMX0VkaXQ6OkNyZWF0ZSgpOw0KLSAgICBGV0xfRVJSIHJldCA9ICgoSUZXTF9FZGl0KiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KLSAgICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQotICAgICAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KLSAgICB9DQotICAgIHJldHVybiByZXQ7DQorRldMX0VSUiBDRldMX0VkaXQ6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTCghbV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKHBQcm9wZXJ0aWVzKSB7DQorICAgICptX3BQcm9wZXJ0aWVzID0gKnBQcm9wZXJ0aWVzOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICBwcm9wLm1fZHdTdHlsZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzOw0KKyAgcHJvcC5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCisgIHByb3AubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorICBwcm9wLm1fY3RtT25QYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50Ow0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudCkgew0KKyAgICBwcm9wLm1fcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudC0+R2V0V2lkZ2V0KCk7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9wT3duZXIpIHsNCisgICAgcHJvcC5tX3BPd25lciA9IG1fcFByb3BlcnRpZXMtPm1fcE93bmVyLT5HZXRXaWRnZXQoKTsNCisgIH0NCisgIHByb3AubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICBtX3BJbXAgPSBJRldMX0VkaXQ6OkNyZWF0ZSgpOw0KKyAgRldMX0VSUiByZXQgPSAoKElGV0xfRWRpdCopbV9wSW1wKS0+SW5pdGlhbGl6ZShwcm9wKTsNCisgIGlmIChyZXQgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCisgIH0NCisgIHJldHVybiByZXQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0OjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5TZXRUZXh0KHdzVGV4dCk7DQorRldMX0VSUiBDRldMX0VkaXQ6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldFRleHQod3NUZXh0KTsNCiB9DQotaW50MzJfdCBDRldMX0VkaXQ6OkdldFRleHRMZW5ndGgoKSBjb25zdA0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkdldFRleHRMZW5ndGgoKTsNCitpbnQzMl90IENGV0xfRWRpdDo6R2V0VGV4dExlbmd0aCgpIGNvbnN0IHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+R2V0VGV4dExlbmd0aCgpOw0KIH0NCi1GV0xfRVJSIENGV0xfRWRpdDo6R2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIGNvbnN0DQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5HZXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQpIGNvbnN0IHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5HZXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KIH0NCi1GV0xfRVJSIENGV0xfRWRpdDo6Q2xlYXJUZXh0KCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkNsZWFyVGV4dCgpOw0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpDbGVhclRleHQoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+Q2xlYXJUZXh0KCk7DQogfQ0KLWludDMyX3QgQ0ZXTF9FZGl0OjpHZXRDYXJldFBvcygpIGNvbnN0DQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgLTEpOw0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkdldENhcmV0UG9zKCk7DQoraW50MzJfdCBDRldMX0VkaXQ6OkdldENhcmV0UG9zKCkgY29uc3Qgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIC0xKTsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+R2V0Q2FyZXRQb3MoKTsNCiB9DQotaW50MzJfdCBDRldMX0VkaXQ6OlNldENhcmV0UG9zKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJCZWZvcmUpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgLTEpOw0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldENhcmV0UG9zKG5JbmRleCwgYkJlZm9yZSk7DQoraW50MzJfdCBDRldMX0VkaXQ6OlNldENhcmV0UG9zKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJCZWZvcmUpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAtMSk7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldENhcmV0UG9zKG5JbmRleCwgYkJlZm9yZSk7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0OjpBZGRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgKChJRldMX0VkaXQqKW1fcEltcCktPkFkZFNlbFJhbmdlKG5TdGFydCwgbkNvdW50KTsNCi0gICAgaW50MzJfdCBwb3MgPSAwOw0KLSAgICBpbnQzMl90IHN1bSA9ICgoSUZXTF9FZGl0KiltX3BJbXApLT5HZXRUZXh0TGVuZ3RoKCk7DQotICAgIGlmIChuQ291bnQgPT0gLTEpIHsNCi0gICAgICAgIHBvcyA9IHN1bTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBvcyA9IG5TdGFydCArIG5Db3VudDsNCi0gICAgfQ0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldENhcmV0UG9zKHBvcyk7DQorRldMX0VSUiBDRldMX0VkaXQ6OkFkZFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAoKElGV0xfRWRpdCopbV9wSW1wKS0+QWRkU2VsUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KKyAgaW50MzJfdCBwb3MgPSAwOw0KKyAgaW50MzJfdCBzdW0gPSAoKElGV0xfRWRpdCopbV9wSW1wKS0+R2V0VGV4dExlbmd0aCgpOw0KKyAgaWYgKG5Db3VudCA9PSAtMSkgew0KKyAgICBwb3MgPSBzdW07DQorICB9IGVsc2Ugew0KKyAgICBwb3MgPSBuU3RhcnQgKyBuQ291bnQ7DQorICB9DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldENhcmV0UG9zKHBvcyk7DQogfQ0KLWludDMyX3QgQ0ZXTF9FZGl0OjpDb3VudFNlbFJhbmdlcygpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+Q291bnRTZWxSYW5nZXMoKTsNCitpbnQzMl90IENGV0xfRWRpdDo6Q291bnRTZWxSYW5nZXMoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkNvdW50U2VsUmFuZ2VzKCk7DQogfQ0KLWludDMyX3QgQ0ZXTF9FZGl0OjpHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCAmblN0YXJ0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkdldFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCitpbnQzMl90IENGV0xfRWRpdDo6R2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KKyAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5HZXRTZWxSYW5nZShuSW5kZXgsIG5TdGFydCk7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0OjpDbGVhclNlbGVjdGlvbnMoKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+Q2xlYXJTZWxlY3Rpb25zKCk7DQorRldMX0VSUiBDRldMX0VkaXQ6OkNsZWFyU2VsZWN0aW9ucygpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5DbGVhclNlbGVjdGlvbnMoKTsNCiB9DQotaW50MzJfdCBDRldMX0VkaXQ6OkdldExpbWl0KCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAtMSk7DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+R2V0TGltaXQoKTsNCitpbnQzMl90IENGV0xfRWRpdDo6R2V0TGltaXQoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgLTEpOw0KKyAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5HZXRMaW1pdCgpOw0KIH0NCi1GV0xfRVJSIENGV0xfRWRpdDo6U2V0TGltaXQoaW50MzJfdCBuTGltaXQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5TZXRMaW1pdChuTGltaXQpOw0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpTZXRMaW1pdChpbnQzMl90IG5MaW1pdCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldExpbWl0KG5MaW1pdCk7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0OjpTZXRBbGlhc0NoYXIoRlhfV0NIQVIgd0FsaWFzKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+U2V0QWxpYXNDaGFyKHdBbGlhcyk7DQorRldMX0VSUiBDRldMX0VkaXQ6OlNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5TZXRBbGlhc0NoYXIod0FsaWFzKTsNCiB9DQotRldMX0VSUiBDRldMX0VkaXQ6OlNldEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGb3JtYXQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5TZXRGb3JtYXRTdHJpbmcod3NGb3JtYXQpOw0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpTZXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+U2V0Rm9ybWF0U3RyaW5nKHdzRm9ybWF0KTsNCiB9DQotRldMX0VSUiBDRldMX0VkaXQ6Okluc2VydChpbnQzMl90IG5TdGFydCwgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwgaW50MzJfdCBuTGVuKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+SW5zZXJ0KG5TdGFydCwgbHBUZXh0LCBuTGVuKTsNCitGV0xfRVJSIENGV0xfRWRpdDo6SW5zZXJ0KGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbikgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbik7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0OjpEZWxldGVTZWxlY3Rpb25zKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkRlbGV0ZVNlbGVjdGlvbnMoKTsNCitGV0xfRVJSIENGV0xfRWRpdDo6RGVsZXRlU2VsZWN0aW9ucygpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5EZWxldGVTZWxlY3Rpb25zKCk7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0OjpEZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5EZWxldGVSYW5nZShuU3RhcnQsIG5Db3VudCk7DQorRldMX0VSUiBDRldMX0VkaXQ6OkRlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkRlbGV0ZVJhbmdlKG5TdGFydCwgbkNvdW50KTsNCiB9DQotRldMX0VSUiBDRldMX0VkaXQ6OlJlcGxhY2VTZWxlY3Rpb25zKGNvbnN0IENGWF9XaWRlU3RyaW5nQyAmd3NSZXBsYWNlKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+UmVwbGFjZVNlbGVjdGlvbnMod3NSZXBsYWNlKTsNCitGV0xfRVJSIENGV0xfRWRpdDo6UmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlcGxhY2UpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5SZXBsYWNlU2VsZWN0aW9ucyh3c1JlcGxhY2UpOw0KIH0NCi1GV0xfRVJSIENGV0xfRWRpdDo6UmVwbGFjZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuTGVuLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MgJndzUmVwbGFjZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlJlcGxhY2UoblN0YXJ0LCBuTGVuLCB3c1JlcGxhY2UpOw0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpSZXBsYWNlKGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUmVwbGFjZSkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlJlcGxhY2UoblN0YXJ0LCBuTGVuLCB3c1JlcGxhY2UpOw0KIH0NCi1GV0xfRVJSIENGV0xfRWRpdDo6RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+RG9DbGlwYm9hcmQoaUNtZCk7DQorRldMX0VSUiBDRldMX0VkaXQ6OkRvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkRvQ2xpcGJvYXJkKGlDbWQpOw0KIH0NCi1GWF9CT09MIENGV0xfRWRpdDo6UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCi0gICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5SZWRvKGJzUmVjb3JkKTsNCitGWF9CT09MIENGV0xfRWRpdDo6UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5SZWRvKGJzUmVjb3JkKTsNCiB9DQotRlhfQk9PTCBDRldMX0VkaXQ6OlVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+VW5kbyhic1JlY29yZCk7DQorRlhfQk9PTCBDRldMX0VkaXQ6OlVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+VW5kbyhic1JlY29yZCk7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9FZGl0OjpTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+U2V0VGFiV2lkdGgoZlRhYldpZHRoLCBiRXF1aWRpc3RhbnQpOw0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+U2V0VGFiV2lkdGgoZlRhYldpZHRoLCBiRXF1aWRpc3RhbnQpOw0KIH0NCi1GV0xfRVJSCUNGV0xfRWRpdDo6U2V0TnVtYmVyUmFuZ2UoaW50MzJfdCBpTWluLCBpbnQzMl90IGlNYXgpDQotew0KLSAgICBpZiAoaU1pbiA+IGlNYXgpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1BhcmFtZXRlcl9JbnZhbGlkOw0KLSAgICB9DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+U2V0TnVtYmVyUmFuZ2UoaU1pbiwgaU1heCk7DQorRldMX0VSUiBDRldMX0VkaXQ6OlNldE51bWJlclJhbmdlKGludDMyX3QgaU1pbiwgaW50MzJfdCBpTWF4KSB7DQorICBpZiAoaU1pbiA+IGlNYXgpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQorICB9DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldE51bWJlclJhbmdlKGlNaW4sIGlNYXgpOw0KIH0NCi1GV0xfRVJSIENGV0xfRWRpdDo6U2V0QmFja0NvbG9yKEZYX0RXT1JEIGR3Q29sb3IpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5TZXRCYWNrQ29sb3IoZHdDb2xvcik7DQorRldMX0VSUiBDRldMX0VkaXQ6OlNldEJhY2tDb2xvcihGWF9EV09SRCBkd0NvbG9yKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+U2V0QmFja0NvbG9yKGR3Q29sb3IpOw0KIH0NCi1GV0xfRVJSIENGV0xfRWRpdDo6U2V0Rm9udChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NGb250LCBGWF9GTE9BVCBmU2l6ZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlNldEZvbnQod3NGb250LCBmU2l6ZSk7DQorRldMX0VSUiBDRldMX0VkaXQ6OlNldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9udCwgRlhfRkxPQVQgZlNpemUpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5TZXRGb250KHdzRm9udCwgZlNpemUpOw0KIH0NCi1GWF9CT09MCUNGV0xfRWRpdDo6Q2FuVW5kbygpDQotew0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkNhblVuZG8oKTsNCitGWF9CT09MIENGV0xfRWRpdDo6Q2FuVW5kbygpIHsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+Q2FuVW5kbygpOw0KIH0NCi1GWF9CT09MCUNGV0xfRWRpdDo6Q2FuUmVkbygpDQotew0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkNhblJlZG8oKTsNCitGWF9CT09MIENGV0xfRWRpdDo6Q2FuUmVkbygpIHsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+Q2FuUmVkbygpOw0KIH0NCi1GWF9CT09MCUNGV0xfRWRpdDo6VW5kbygpDQotew0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlVuZG8oKTsNCitGWF9CT09MIENGV0xfRWRpdDo6VW5kbygpIHsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+VW5kbygpOw0KIH0NCi1GWF9CT09MCUNGV0xfRWRpdDo6UmVkbygpDQotew0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlVuZG8oKTsNCitGWF9CT09MIENGV0xfRWRpdDo6UmVkbygpIHsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+VW5kbygpOw0KIH0NCi1GWF9CT09MCUNGV0xfRWRpdDo6Q29weShDRlhfV2lkZVN0cmluZyAmd3NDb3B5KQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5Db3B5KHdzQ29weSk7DQorRlhfQk9PTCBDRldMX0VkaXQ6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSkgew0KKyAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5Db3B5KHdzQ29weSk7DQogfQ0KLUZYX0JPT0wJQ0ZXTF9FZGl0OjpDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5DdXQod3NDdXQpOw0KK0ZYX0JPT0wgQ0ZXTF9FZGl0OjpDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KSB7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkN1dCh3c0N1dCk7DQogfQ0KLUZYX0JPT0wJQ0ZXTF9FZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCi17DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+UGFzdGUod3NQYXN0ZSk7DQorRlhfQk9PTCBDRldMX0VkaXQ6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKSB7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlBhc3RlKHdzUGFzdGUpOw0KIH0NCi1GWF9CT09MCUNGV0xfRWRpdDo6RGVsZXRlKCkNCi17DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+RGVsZXRlKCk7DQorRlhfQk9PTCBDRldMX0VkaXQ6OkRlbGV0ZSgpIHsNCisgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+RGVsZXRlKCk7DQogfQ0KLXZvaWQgQ0ZXTF9FZGl0OjpTZXRTY3JvbGxPZmZzZXQoRlhfRkxPQVQgZlNjcm9sbE9mZnNldCkNCi17DQotICAgIHJldHVybiAoKElGV0xfRWRpdCopbV9wSW1wKS0+U2V0U2Nyb2xsT2Zmc2V0KGZTY3JvbGxPZmZzZXQpOw0KK3ZvaWQgQ0ZXTF9FZGl0OjpTZXRTY3JvbGxPZmZzZXQoRlhfRkxPQVQgZlNjcm9sbE9mZnNldCkgew0KKyAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5TZXRTY3JvbGxPZmZzZXQoZlNjcm9sbE9mZnNldCk7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9FZGl0OjpHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9FZGl0KiltX3BJbXApLT5HZXRTdWdnZXN0V29yZHMocG9pbnRmLCBzU3VnZ2VzdCk7DQorRlhfQk9PTCBDRldMX0VkaXQ6OkdldFN1Z2dlc3RXb3JkcyhDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQXJyYXkmIHNTdWdnZXN0KSB7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPkdldFN1Z2dlc3RXb3Jkcyhwb2ludGYsIHNTdWdnZXN0KTsNCiB9DQotRlhfQk9PTCBDRldMX0VkaXQ6OlJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlcGxhY2UpDQotew0KLSAgICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlJlcGxhY2VTcGVsbENoZWNrV29yZChwb2ludGYsIGJzUmVwbGFjZSk7DQorRlhfQk9PTCBDRldMX0VkaXQ6OlJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKSB7DQorICByZXR1cm4gKChJRldMX0VkaXQqKW1fcEltcCktPlJlcGxhY2VTcGVsbENoZWNrV29yZChwb2ludGYsIGJzUmVwbGFjZSk7DQogfQ0KLUNGV0xfRWRpdDo6Q0ZXTF9FZGl0KCkNCi17DQotfQ0KLUNGV0xfRWRpdDo6fkNGV0xfRWRpdCgpDQotew0KLX0NCitDRldMX0VkaXQ6OkNGV0xfRWRpdCgpIHt9DQorQ0ZXTF9FZGl0Ojp+Q0ZXTF9FZGl0KCkge30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvbGlzdGJveC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvbGlzdGJveC5jcHAKaW5kZXggYzk2ZTM2OC4uMmJmZDEwYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2xpc3Rib3guY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9saXN0Ym94LmNwcApAQCAtNSwzMjMgKzUsMzA3IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KLUNGV0xfTGlzdEJveCogQ0ZXTF9MaXN0Qm94OjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDRldMX0xpc3RCb3g7DQorQ0ZXTF9MaXN0Qm94KiBDRldMX0xpc3RCb3g6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBGWF9ORVcgQ0ZXTF9MaXN0Qm94Ow0KIH0NCi1GV0xfRVJSCUNGV0xfTGlzdEJveDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoIW1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKHBQcm9wZXJ0aWVzKSB7DQotICAgICAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCitGV0xfRVJSIENGV0xfTGlzdEJveDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICB9DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICBwcm9wLm1fcERhdGFQcm92aWRlciA9ICZtX0xpc3RCb3hEUDsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCisgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQorICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQorICB9DQorICBwcm9wLm1fcnRXaWRnZXQgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgbV9wSW1wID0gSUZXTF9MaXN0Qm94OjpDcmVhdGUoKTsNCisgIEZXTF9FUlIgcmV0ID0gKChJRldMX0xpc3RCb3gqKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQorICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQorICB9DQorICByZXR1cm4gcmV0Ow0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6QWRkRElCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCLCBGV0xfSExJU1RJVEVNIGhJdGVtKSB7DQorICAoKENGV0xfTGlzdEl0ZW0qKWhJdGVtKS0+bV9wRElCID0gcERJQjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0hMSVNUSVRFTSBDRldMX0xpc3RCb3g6OkFkZFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQWRkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0KSB7DQorICBDRldMX0xpc3RJdGVtKiBwSXRlbSA9IEZYX05FVyBDRldMX0xpc3RJdGVtOw0KKyAgcEl0ZW0tPm1fZHdTdGF0ZXMgPSAwOw0KKyAgcEl0ZW0tPm1fd3NUZXh0ID0gd3NBZGQ7DQorICBwSXRlbS0+bV9kd1N0YXRlcyA9IGJTZWxlY3QgPyBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZCA6IDA7DQorICBtX0xpc3RCb3hEUC5tX2Fyckl0ZW0uQWRkKHBJdGVtKTsNCisgIHJldHVybiAoRldMX0hMSVNUSVRFTSlwSXRlbTsNCit9DQorRlhfQk9PTCBDRldMX0xpc3RCb3g6OkRlbGV0ZVN0cmluZyhGV0xfSExJU1RJVEVNIGhJdGVtKSB7DQorICBpbnQzMl90IG5JbmRleCA9IG1fTGlzdEJveERQLkdldEl0ZW1JbmRleChHZXRXaWRnZXQoKSwgaEl0ZW0pOw0KKyAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fTGlzdEJveERQLm1fYXJySXRlbS5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9MaXN0SXRlbSogcERlbEl0ZW0gPQ0KKyAgICAgIChDRldMX0xpc3RJdGVtKiltX0xpc3RCb3hEUC5HZXRJdGVtKChJRldMX0xpc3RCb3gqKXRoaXMsIG5JbmRleCk7DQorICBpbnQzMl90IGlDb3VudCA9IG1fTGlzdEJveERQLkNvdW50SXRlbXMoKElGV0xfTGlzdEJveCopdGhpcyk7DQorICBpbnQzMl90IGlTZWwgPSBuSW5kZXggKyAxOw0KKyAgaWYgKGlTZWwgPj0gaUNvdW50KSB7DQorICAgIGlTZWwgPSBuSW5kZXggLSAxOw0KKyAgICBpZiAoaVNlbCA8IDApIHsNCisgICAgICBpU2VsID0gLTE7DQogICAgIH0NCi0gICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQotICAgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQotICAgIHByb3AubV9kd1N0eWxlRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQotICAgIHByb3AubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQotICAgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQotICAgIHByb3AubV9wRGF0YVByb3ZpZGVyID0gJm1fTGlzdEJveERQOw0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQotICAgICAgICBwcm9wLm1fcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudC0+R2V0V2lkZ2V0KCk7DQorICB9DQorICBpZiAoaVNlbCA+PSAwKSB7DQorICAgIENGV0xfTGlzdEl0ZW0qIHBTZWwgPQ0KKyAgICAgICAgKENGV0xfTGlzdEl0ZW0qKW1fTGlzdEJveERQLkdldEl0ZW0oKElGV0xfTGlzdEJveCopdGhpcywgaVNlbCk7DQorICAgIHBTZWwtPm1fZHdTdGF0ZXMgfD0gRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQ7DQorICB9DQorICBtX0xpc3RCb3hEUC5tX2Fyckl0ZW0uUmVtb3ZlQXQobkluZGV4KTsNCisgIGRlbGV0ZSBwRGVsSXRlbTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfTGlzdEJveDo6RGVsZXRlQWxsKCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0xpc3RCb3hEUC5Db3VudEl0ZW1zKChJRldMX0xpc3RCb3gqKXRoaXMpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ0ZXTF9MaXN0SXRlbSogcEl0ZW0gPQ0KKyAgICAgICAgKENGV0xfTGlzdEl0ZW0qKW1fTGlzdEJveERQLkdldEl0ZW0oKElGV0xfTGlzdEJveCopdGhpcywgaSk7DQorICAgIGRlbGV0ZSBwSXRlbTsNCisgIH0NCisgIG1fTGlzdEJveERQLm1fYXJySXRlbS5SZW1vdmVBbGwoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitpbnQzMl90IENGV0xfTGlzdEJveDo6Q291bnRTZWxJdGVtcygpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgIHJldHVybiAoKElGV0xfTGlzdEJveCopbV9wSW1wKS0+Q291bnRTZWxJdGVtcygpOw0KK30NCitGV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveDo6R2V0U2VsSXRlbShpbnQzMl90IG5JbmRleFNlbCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIE5VTEwpOw0KKyAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5HZXRTZWxJdGVtKG5JbmRleFNlbCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9MaXN0Qm94OjpHZXRTZWxJbmRleChpbnQzMl90IG5JbmRleCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KKyAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5HZXRTZWxJbmRleChuSW5kZXgpOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6U2V0U2VsSXRlbShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTZWxlY3QpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5TZXRTZWxJdGVtKGhJdGVtLCBiU2VsZWN0KTsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkdldEl0ZW1UZXh0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkdldFNjcm9sbFBvcyhGWF9GTE9BVCYgZlBvcywgRlhfQk9PTCBiVmVydCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gKChJRldMX0xpc3RCb3gqKW1fcEltcCktPkdldFNjcm9sbFBvcyhmUG9zLCBiVmVydCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpTZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZJdGVtSGVpZ2h0KSB7DQorICBtX0xpc3RCb3hEUC5tX2ZJdGVtSGVpZ2h0ID0gZkl0ZW1IZWlnaHQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpHZXRGb2N1c0l0ZW0oKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX0xpc3RCb3hEUC5tX2Fyckl0ZW0uR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0ZXTF9MaXN0SXRlbSogaEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopKG1fTGlzdEJveERQLm1fYXJySXRlbVtpXSk7DQorICAgIGlmIChoSXRlbS0+bV9kd1N0YXRlcyAmIEZXTF9JVEVNU1RBVEVfTFRCX0ZvY3VzZWQpIHsNCisgICAgICByZXR1cm4gKEZXTF9ITElTVElURU0paEl0ZW07DQogICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQotICAgICAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KLSAgICB9DQotICAgIHByb3AubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQotICAgIG1fcEltcCA9IElGV0xfTGlzdEJveDo6Q3JlYXRlKCk7DQotICAgIEZXTF9FUlIgcmV0ID0gKChJRldMX0xpc3RCb3gqKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQotICAgIGlmIChyZXQgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCi0gICAgICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJldDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1GV0xfRVJSIENGV0xfTGlzdEJveDo6QWRkRElCaXRtYXAoQ0ZYX0RJQml0bWFwICpwRElCLCBGV0xfSExJU1RJVEVNIGhJdGVtKQ0KLXsNCi0gICAgKChDRldMX0xpc3RJdGVtKiloSXRlbSktPm1fcERJQiA9IHBESUI7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfTGlzdEJveDo6U2V0Rm9jdXNJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIGludDMyX3QgbkluZGV4ID0gbV9MaXN0Qm94RFAuR2V0SXRlbUluZGV4KEdldFdpZGdldCgpLCBoSXRlbSk7DQorICAoKENGV0xfTGlzdEl0ZW0qKShtX0xpc3RCb3hEUC5tX2Fyckl0ZW1bbkluZGV4XSkpLT5tX2R3U3RhdGVzIHw9DQorICAgICAgRldMX0lURU1TVEFURV9MVEJfRm9jdXNlZDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0hMSVNUSVRFTSBDRldMX0xpc3RCb3g6OkFkZFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQWRkLCBGWF9CT09MIGJTZWxlY3QpDQotew0KLSAgICBDRldMX0xpc3RJdGVtICogcEl0ZW0gPSBGWF9ORVcgQ0ZXTF9MaXN0SXRlbTsNCi0gICAgcEl0ZW0tPm1fZHdTdGF0ZXMgPSAwOw0KLSAgICBwSXRlbS0+bV93c1RleHQgPSB3c0FkZDsNCi0gICAgcEl0ZW0tPm1fZHdTdGF0ZXMgPSBiU2VsZWN0ID8gRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQgOiAwOw0KLSAgICBtX0xpc3RCb3hEUC5tX2Fyckl0ZW0uQWRkKHBJdGVtKTsNCi0gICAgcmV0dXJuIChGV0xfSExJU1RJVEVNKXBJdGVtOw0KK0ZXTF9FUlIqIENGV0xfTGlzdEJveDo6U29ydChJRldMX0xpc3RCb3hDb21wYXJlKiBwQ29tKSB7DQorICByZXR1cm4gKChJRldMX0xpc3RCb3gqKW1fcEltcCktPlNvcnQocENvbSk7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9MaXN0Qm94OjpEZWxldGVTdHJpbmcoRldMX0hMSVNUSVRFTSBoSXRlbSkNCi17DQotICAgIGludDMyX3QgbkluZGV4ID0gbV9MaXN0Qm94RFAuR2V0SXRlbUluZGV4KEdldFdpZGdldCgpLCBoSXRlbSk7DQotICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX0xpc3RCb3hEUC5tX2Fyckl0ZW0uR2V0U2l6ZSgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZXTF9MaXN0SXRlbSAqcERlbEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopbV9MaXN0Qm94RFAuR2V0SXRlbSgoSUZXTF9MaXN0Qm94Kil0aGlzLCBuSW5kZXgpOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fTGlzdEJveERQLkNvdW50SXRlbXMoKElGV0xfTGlzdEJveCopdGhpcyk7DQotICAgIGludDMyX3QgaVNlbCA9IG5JbmRleCArIDE7DQotICAgIGlmIChpU2VsID49IGlDb3VudCkgew0KLSAgICAgICAgaVNlbCA9IG5JbmRleCAtIDE7DQotICAgICAgICBpZiAoaVNlbCA8IDApIHsNCi0gICAgICAgICAgICBpU2VsID0gIC0xOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChpU2VsID49IDApIHsNCi0gICAgICAgIENGV0xfTGlzdEl0ZW0gKnBTZWwgPSAoQ0ZXTF9MaXN0SXRlbSopbV9MaXN0Qm94RFAuR2V0SXRlbSgoSUZXTF9MaXN0Qm94Kil0aGlzLCBpU2VsKTsNCi0gICAgICAgIHBTZWwtPm1fZHdTdGF0ZXMgfD0gRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQ7DQotICAgIH0NCi0gICAgbV9MaXN0Qm94RFAubV9hcnJJdGVtLlJlbW92ZUF0KG5JbmRleCk7DQotICAgIGRlbGV0ZSBwRGVsSXRlbTsNCi0gICAgcmV0dXJuIFRSVUU7DQoraW50MzJfdCBDRldMX0xpc3RCb3g6OkNvdW50SXRlbXMoKSB7DQorICByZXR1cm4gbV9MaXN0Qm94RFAubV9hcnJJdGVtLkdldFNpemUoKTsNCiB9DQotRlhfQk9PTAlDRldMX0xpc3RCb3g6OkRlbGV0ZUFsbCgpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fTGlzdEJveERQLkNvdW50SXRlbXMoKElGV0xfTGlzdEJveCopdGhpcyk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZXTF9MaXN0SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopbV9MaXN0Qm94RFAuR2V0SXRlbSgoSUZXTF9MaXN0Qm94Kil0aGlzLCBpKTsNCi0gICAgICAgIGRlbGV0ZSBwSXRlbTsNCi0gICAgfQ0KLSAgICBtX0xpc3RCb3hEUC5tX2Fyckl0ZW0uUmVtb3ZlQWxsKCk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1pbnQzMl90IENGV0xfTGlzdEJveDo6Q291bnRTZWxJdGVtcygpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQotICAgIHJldHVybiAoKElGV0xfTGlzdEJveCopbV9wSW1wKS0+Q291bnRTZWxJdGVtcygpOw0KLX0NCi1GV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveDo6R2V0U2VsSXRlbShpbnQzMl90IG5JbmRleFNlbCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBOVUxMKTsNCi0gICAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5HZXRTZWxJdGVtKG5JbmRleFNlbCk7DQotfQ0KLWludDMyX3QgQ0ZXTF9MaXN0Qm94OjpHZXRTZWxJbmRleChpbnQzMl90IG5JbmRleCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCi0gICAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5HZXRTZWxJbmRleChuSW5kZXgpOw0KLX0NCi1GV0xfRVJSIENGV0xfTGlzdEJveDo6U2V0U2VsSXRlbShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTZWxlY3QpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5TZXRTZWxJdGVtKGhJdGVtLCBiU2VsZWN0KTsNCi19DQotRldMX0VSUiBDRldMX0xpc3RCb3g6OkdldEl0ZW1UZXh0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCi19DQotRldMX0VSUiBDRldMX0xpc3RCb3g6OkdldFNjcm9sbFBvcyhGWF9GTE9BVCAmZlBvcywgRlhfQk9PTCBiVmVydCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gKChJRldMX0xpc3RCb3gqKW1fcEltcCktPkdldFNjcm9sbFBvcyhmUG9zLCBiVmVydCk7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpTZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZJdGVtSGVpZ2h0KQ0KLXsNCi0gICAgbV9MaXN0Qm94RFAubV9mSXRlbUhlaWdodCA9IGZJdGVtSGVpZ2h0Ow0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpHZXRGb2N1c0l0ZW0oKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9MaXN0Qm94RFAubV9hcnJJdGVtLkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICBDRldMX0xpc3RJdGVtICogaEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSAqKShtX0xpc3RCb3hEUC5tX2Fyckl0ZW1baV0pOw0KLSAgICAgICAgaWYgKGhJdGVtLT5tX2R3U3RhdGVzICYgRldMX0lURU1TVEFURV9MVEJfRm9jdXNlZCkgew0KLSAgICAgICAgICAgIHJldHVybiAoRldMX0hMSVNUSVRFTSloSXRlbTsNCi0gICAgICAgIH0NCi0gICAgfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpHZXRJdGVtKGludDMyX3QgbkluZGV4KSB7DQorICBpbnQzMl90IG5Db3VudCA9IG1fTGlzdEJveERQLm1fYXJySXRlbS5HZXRTaXplKCk7DQorICBpZiAobkluZGV4ID4gbkNvdW50IC0gMSAmJiBuSW5kZXggPCAwKSB7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIChGV0xfSExJU1RJVEVNKW1fTGlzdEJveERQLm1fYXJySXRlbVtuSW5kZXhdOw0KIH0NCi1GV0xfRVJSCUNGV0xfTGlzdEJveDo6U2V0Rm9jdXNJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICBpbnQzMl90IG5JbmRleCA9IG1fTGlzdEJveERQLkdldEl0ZW1JbmRleChHZXRXaWRnZXQoKSwgaEl0ZW0pOw0KLSAgICAoKENGV0xfTGlzdEl0ZW0gKikobV9MaXN0Qm94RFAubV9hcnJJdGVtW25JbmRleF0pKS0+bV9kd1N0YXRlcyB8PSBGV0xfSVRFTVNUQVRFX0xUQl9Gb2N1c2VkOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OlNldEl0ZW1TdHJpbmcoRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGV4dCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIENGV0xfTGlzdEl0ZW0qIHBJdGVtID0gKENGV0xfTGlzdEl0ZW0qKWhJdGVtOw0KKyAgcEl0ZW0tPm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSKiBDRldMX0xpc3RCb3g6OlNvcnQoSUZXTF9MaXN0Qm94Q29tcGFyZSAqcENvbSkNCi17DQotICAgIHJldHVybiAoKElGV0xfTGlzdEJveCopbV9wSW1wKS0+U29ydChwQ29tKTsNCitGV0xfRVJSIENGV0xfTGlzdEJveDo6R2V0SXRlbVN0cmluZyhGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBDRldMX0xpc3RJdGVtKiBwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgIHdzVGV4dCA9IHBJdGVtLT5tX3dzVGV4dDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotaW50MzJfdCBDRldMX0xpc3RCb3g6OkNvdW50SXRlbXMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fTGlzdEJveERQLm1fYXJySXRlbS5HZXRTaXplKCk7DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OlNldEl0ZW1EYXRhKEZXTF9ITElTVElURU0gaEl0ZW0sIHZvaWQqIHBEYXRhKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgQ0ZXTF9MaXN0SXRlbSogcEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopaEl0ZW07DQorICBwSXRlbS0+bV9wRGF0YSA9IHBEYXRhOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveDo6R2V0SXRlbShpbnQzMl90IG5JbmRleCkNCi17DQotICAgIGludDMyX3QgbkNvdW50ID0gbV9MaXN0Qm94RFAubV9hcnJJdGVtLkdldFNpemUoKTsNCi0gICAgaWYgKG5JbmRleCA+IG5Db3VudCAtIDEgJiYgbkluZGV4IDwgMCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQordm9pZCogQ0ZXTF9MaXN0Qm94OjpHZXRJdGVtRGF0YShGV0xfSExJU1RJVEVNIGhJdGVtKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBOVUxMKTsNCisgIENGV0xfTGlzdEl0ZW0qIHBJdGVtID0gKENGV0xfTGlzdEl0ZW0qKWhJdGVtOw0KKyAgcmV0dXJuIHBJdGVtLT5tX3BEYXRhOw0KK30NCitGV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveDo6R2V0SXRlbUF0UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBDRlhfUmVjdEYgcnRDbGllbnQ7DQorICBtX3BJbXAtPkdldENsaWVudFJlY3QocnRDbGllbnQpOw0KKyAgZnggLT0gcnRDbGllbnQubGVmdDsNCisgIGZ5IC09IHJ0Q2xpZW50LnRvcDsNCisgIEZYX0ZMT0FUIGZQb3NYID0gMDsNCisgIEZYX0ZMT0FUIGZQb3NZID0gMDsNCisgICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5HZXRTY3JvbGxQb3MoZngpOw0KKyAgKChJRldMX0xpc3RCb3gqKW1fcEltcCktPkdldFNjcm9sbFBvcyhmeSwgRkFMU0UpOw0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0xpc3RCb3hEUC5Db3VudEl0ZW1zKE5VTEwpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IG1fTGlzdEJveERQLkdldEl0ZW0oTlVMTCwgaSk7DQorICAgIGlmICghaEl0ZW0pIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICByZXR1cm4gKEZXTF9ITElTVElURU0pbV9MaXN0Qm94RFAubV9hcnJJdGVtW25JbmRleF07DQotfQ0KLUZXTF9FUlIJQ0ZXTF9MaXN0Qm94OjpTZXRJdGVtU3RyaW5nKEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgQ0ZXTF9MaXN0SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopaEl0ZW07DQotICAgIHBJdGVtLT5tX3dzVGV4dCA9IHdzVGV4dDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfTGlzdEJveDo6R2V0SXRlbVN0cmluZyhGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgQ0ZXTF9MaXN0SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopaEl0ZW07DQotICAgIHdzVGV4dCA9IHBJdGVtLT5tX3dzVGV4dDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfTGlzdEJveDo6U2V0SXRlbURhdGEoRldMX0hMSVNUSVRFTSBoSXRlbSwgdm9pZCogcERhdGEpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCi0gICAgcEl0ZW0tPm1fcERhdGEgPSBwRGF0YTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi12b2lkKiBDRldMX0xpc3RCb3g6OkdldEl0ZW1EYXRhKEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBOVUxMKTsNCi0gICAgQ0ZXTF9MaXN0SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopaEl0ZW07DQotICAgIHJldHVybiBwSXRlbS0+bV9wRGF0YTsNCi19DQotRldMX0hMSVNUSVRFTSBDRldMX0xpc3RCb3g6OkdldEl0ZW1BdFBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIENGWF9SZWN0RiBydENsaWVudDsNCi0gICAgbV9wSW1wLT5HZXRDbGllbnRSZWN0KHJ0Q2xpZW50KTsNCi0gICAgZnggLT0gcnRDbGllbnQubGVmdDsNCi0gICAgZnkgLT0gcnRDbGllbnQudG9wOw0KLSAgICBGWF9GTE9BVCBmUG9zWCA9IDA7DQotICAgIEZYX0ZMT0FUIGZQb3NZID0gMDsNCi0gICAgKChJRldMX0xpc3RCb3gqKW1fcEltcCktPkdldFNjcm9sbFBvcyhmeCk7DQotICAgICgoSUZXTF9MaXN0Qm94KiltX3BJbXApLT5HZXRTY3JvbGxQb3MoZnksIEZBTFNFKTsNCi0gICAgaW50MzJfdCBuQ291bnQgPSBtX0xpc3RCb3hEUC5Db3VudEl0ZW1zKE5VTEwpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBtX0xpc3RCb3hEUC5HZXRJdGVtKE5VTEwsIGkpOw0KLSAgICAgICAgaWYgKCFoSXRlbSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCi0gICAgICAgIG1fTGlzdEJveERQLkdldEl0ZW1SZWN0KE5VTEwsIGhJdGVtLCBydEl0ZW0pOw0KLSAgICAgICAgcnRJdGVtLk9mZnNldCgtZlBvc1gsIC1mUG9zWSk7DQotICAgICAgICBpZiAocnRJdGVtLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gaEl0ZW07DQotICAgICAgICB9DQorICAgIENGWF9SZWN0RiBydEl0ZW07DQorICAgIG1fTGlzdEJveERQLkdldEl0ZW1SZWN0KE5VTEwsIGhJdGVtLCBydEl0ZW0pOw0KKyAgICBydEl0ZW0uT2Zmc2V0KC1mUG9zWCwgLWZQb3NZKTsNCisgICAgaWYgKHJ0SXRlbS5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgcmV0dXJuIGhJdGVtOw0KICAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9MaXN0Qm94OjpHZXRJdGVtU3RhdGVzKEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIDApOw0KKyAgQ0ZXTF9MaXN0SXRlbSogcEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopaEl0ZW07DQorICByZXR1cm4gcEl0ZW0tPm1fZHdTdGF0ZXMgfCBwSXRlbS0+bV9kd0NoZWNrU3RhdGU7DQorfQ0KK0NGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94KCkge30NCitDRldMX0xpc3RCb3g6On5DRldMX0xpc3RCb3goKSB7fQ0KK0NGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkNGV0xfTGlzdEJveERQKCkge30NCitDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjp+Q0ZXTF9MaXN0Qm94RFAoKSB7DQorICBpbnQzMl90IG5Db3VudCA9IG1fYXJySXRlbS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBDRldMX0xpc3RJdGVtKiBwSXRlbSA9IChDRldMX0xpc3RJdGVtKiltX2Fyckl0ZW1baV07DQorICAgIGlmIChwSXRlbSAhPSBOVUxMKSB7DQorICAgICAgZGVsZXRlIHBJdGVtOw0KKyAgICB9DQorICB9DQorICBtX2Fyckl0ZW0uUmVtb3ZlQWxsKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0Q2FwdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgew0KKyAgd3NDYXB0aW9uID0gbV93c0RhdGE7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6Q291bnRJdGVtcyhJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fYXJySXRlbS5HZXRTaXplKCk7DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChuSW5kZXggPj0gbV9hcnJJdGVtLkdldFNpemUoKSB8fCBuSW5kZXggPCAwKSB7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIChGV0xfSExJU1RJVEVNKW1fYXJySXRlbVtuSW5kZXhdOw0KKyAgfQ0KIH0NCi1GWF9EV09SRCBDRldMX0xpc3RCb3g6OkdldEl0ZW1TdGF0ZXMoRldMX0hMSVNUSVRFTSBoSXRlbSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIDApOw0KLSAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCi0gICAgcmV0dXJuIHBJdGVtLT5tX2R3U3RhdGVzIHwgcEl0ZW0tPm1fZHdDaGVja1N0YXRlOw0KK2ludDMyX3QgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIHJldHVybiBtX2Fyckl0ZW0uRmluZChoSXRlbSk7DQogfQ0KLUNGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94KCkNCi17DQorRlhfQk9PTCBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpTZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCkgew0KKyAgcmV0dXJuIG1fYXJySXRlbS5TZXRBdChuSW5kZXgsIGhJdGVtKTsNCiB9DQotQ0ZXTF9MaXN0Qm94Ojp+Q0ZXTF9MaXN0Qm94KCkNCi17DQorRlhfRFdPUkQgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbVN0eWxlcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIC0xKTsNCisgIHJldHVybiAoKENGV0xfTGlzdEl0ZW0qKWhJdGVtKS0+bV9kd1N0YXRlczsNCiB9DQotQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6Q0ZXTF9MaXN0Qm94RFAoKQ0KLXsNCitGV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1UZXh0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICB3c1RleHQgPSAoKENGV0xfTGlzdEl0ZW0qKWhJdGVtKS0+bV93c1RleHQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUNGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6On5DRldMX0xpc3RCb3hEUCgpDQotew0KLSAgICBpbnQzMl90IG5Db3VudCA9IG1fYXJySXRlbS5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZXTF9MaXN0SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopbV9hcnJJdGVtW2ldOw0KLSAgICAgICAgaWYgKHBJdGVtICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBkZWxldGUgcEl0ZW07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9hcnJJdGVtLlJlbW92ZUFsbCgpOw0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydEl0ZW0pIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBDRldMX0xpc3RJdGVtKiBwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgIHJ0SXRlbSA9IHBJdGVtLT5tX3J0SXRlbTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKQ0KLXsNCi0gICAgd3NDYXB0aW9uID0gbV93c0RhdGE7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit2b2lkKiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtRGF0YShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBOVUxMKTsNCisgIENGV0xfTGlzdEl0ZW0qIHBJdGVtID0gKENGV0xfTGlzdEl0ZW0qKWhJdGVtOw0KKyAgcmV0dXJuIHBJdGVtLT5tX3BEYXRhOw0KIH0NCi1pbnQzMl90IENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkNvdW50SXRlbXMoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gbV9hcnJJdGVtLkdldFNpemUoKTsNCitGV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OlNldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAoKENGV0xfTGlzdEl0ZW0qKWhJdGVtKS0+bV9kd1N0YXRlcyA9IGR3U3R5bGU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbShJRldMX1dpZGdldCAqcFdpZGdldCwgaW50MzJfdCBuSW5kZXgpDQotew0KLSAgICBpZiAobkluZGV4ID49IG1fYXJySXRlbS5HZXRTaXplKCkgfHwgbkluZGV4IDwgMCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gKEZXTF9ITElTVElURU0pbV9hcnJJdGVtW25JbmRleF07DQotICAgIH0NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OlNldEl0ZW1UZXh0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pUZXh0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgKChDRldMX0xpc3RJdGVtKiloSXRlbSktPm1fd3NUZXh0ID0gcHN6VGV4dDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotaW50MzJfdCBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICByZXR1cm4gbV9hcnJJdGVtLkZpbmQoaEl0ZW0pOw0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6U2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0pIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICAoKENGV0xfTGlzdEl0ZW0qKWhJdGVtKS0+bV9ydEl0ZW0gPSBydEl0ZW07DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6U2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBpbnQzMl90IG5JbmRleCkNCi17DQotICAgIHJldHVybiBtX2Fyckl0ZW0uU2V0QXQobkluZGV4LCBoSXRlbSk7DQorRlhfRkxPQVQgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbUhlaWdodChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fZkl0ZW1IZWlnaHQ7DQogfQ0KLUZYX0RXT1JEIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCAtMSk7DQotICAgIHJldHVybiAoKENGV0xfTGlzdEl0ZW0qKWhJdGVtKS0+bV9kd1N0YXRlczsNCitDRlhfRElCaXRtYXAqIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1JY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9MaXN0SXRlbSopaEl0ZW0pLT5tX3BESUI7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbVRleHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICB3c1RleHQgPSAoKENGV0xfTGlzdEl0ZW0qKWhJdGVtKS0+bV93c1RleHQ7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRDaGVjaykgew0KKyAgQ0ZXTF9MaXN0SXRlbSogcEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopaEl0ZW07DQorICBydENoZWNrID0gcEl0ZW0tPm1fcnRDaGVja0JveDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtUmVjdChJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1JlY3RGICZydEl0ZW0pDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGhJdGVtLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCi0gICAgcnRJdGVtID0gcEl0ZW0tPm1fcnRJdGVtOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpTZXRJdGVtQ2hlY2tSZWN0KA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgY29uc3QgQ0ZYX1JlY3RGJiBydENoZWNrKSB7DQorICBDRldMX0xpc3RJdGVtKiBwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgIHBJdGVtLT5tX3J0Q2hlY2tCb3ggPSBydENoZWNrOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi12b2lkKiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtRGF0YShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIE5VTEwpOw0KLSAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCi0gICAgcmV0dXJuIHBJdGVtLT5tX3BEYXRhOw0KK0ZYX0RXT1JEIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1DaGVja1N0YXRlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIENGV0xfTGlzdEl0ZW0qIHBJdGVtID0gKENGV0xfTGlzdEl0ZW0qKWhJdGVtOw0KKyAgcmV0dXJuIHBJdGVtLT5tX2R3Q2hlY2tTdGF0ZTsNCiB9DQotRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpTZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9EV09SRCBkd1N0eWxlKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgKChDRldMX0xpc3RJdGVtKiloSXRlbSktPm1fZHdTdGF0ZXMgPSBkd1N0eWxlOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6U2V0SXRlbVRleHQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IEZYX1dDSEFSKiBwc3pUZXh0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChoSXRlbSwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgKChDRldMX0xpc3RJdGVtKiloSXRlbSktPm1fd3NUZXh0ID0gcHN6VGV4dDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OlNldEl0ZW1SZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBjb25zdCBDRlhfUmVjdEYgJnJ0SXRlbSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaEl0ZW0sIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgICgoQ0ZXTF9MaXN0SXRlbSopaEl0ZW0pLT5tX3J0SXRlbSA9IHJ0SXRlbTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9GTE9BVCBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtSGVpZ2h0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIG1fZkl0ZW1IZWlnaHQ7DQotfQ0KLUNGWF9ESUJpdG1hcCoJQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbUljb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICByZXR1cm4gKChDRldMX0xpc3RJdGVtKiloSXRlbSktPm1fcERJQjsNCi19DQotRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfUmVjdEYmIHJ0Q2hlY2spDQotew0KLSAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCi0gICAgcnRDaGVjayA9IHBJdGVtLT5tX3J0Q2hlY2tCb3g7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpTZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtLCBjb25zdCBDRlhfUmVjdEYmIHJ0Q2hlY2spDQotew0KLSAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCi0gICAgcEl0ZW0tPm1fcnRDaGVja0JveCA9IHJ0Q2hlY2s7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfRFdPUkQgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pDQotew0KLSAgICBDRldMX0xpc3RJdGVtICpwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCi0gICAgcmV0dXJuIHBJdGVtLT5tX2R3Q2hlY2tTdGF0ZTsNCi19DQotRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpTZXRJdGVtQ2hlY2tTdGF0ZShJRldMX1dpZGdldCAqcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfRFdPUkQgZHdDaGVja1N0YXRlKQ0KLXsNCi0gICAgQ0ZXTF9MaXN0SXRlbSAqcEl0ZW0gPSAoQ0ZXTF9MaXN0SXRlbSopaEl0ZW07DQotICAgIHBJdGVtLT5tX2R3Q2hlY2tTdGF0ZSA9IGR3Q2hlY2tTdGF0ZTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6U2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDaGVja1N0YXRlKSB7DQorICBDRldMX0xpc3RJdGVtKiBwSXRlbSA9IChDRldMX0xpc3RJdGVtKiloSXRlbTsNCisgIHBJdGVtLT5tX2R3Q2hlY2tTdGF0ZSA9IGR3Q2hlY2tTdGF0ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3BpY3R1cmVib3guY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3BpY3R1cmVib3guY3BwCmluZGV4IDYxOWE0NzMuLmRkN2ZlMTYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9waWN0dXJlYm94LmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5jcHAKQEAgLTUsMTQwICs1LDEyMSBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCi1DRldMX1BpY3R1cmVCb3gqIENGV0xfUGljdHVyZUJveDo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBGWF9ORVcgQ0ZXTF9QaWN0dXJlQm94Ow0KK0NGV0xfUGljdHVyZUJveCogQ0ZXTF9QaWN0dXJlQm94OjpDcmVhdGUoKSB7DQorICByZXR1cm4gRlhfTkVXIENGV0xfUGljdHVyZUJveDsNCiB9DQotRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyApDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGlmIChwUHJvcGVydGllcykgew0KLSAgICAgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQotICAgIH0NCi0gICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQotICAgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQotICAgIHByb3AubV9kd1N0eWxlRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQotICAgIHByb3AubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQotICAgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQotICAgIHByb3AubV9wRGF0YVByb3ZpZGVyID0gJm1fUGljdHVyZUJveERQOw0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQotICAgICAgICBwcm9wLm1fcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudC0+R2V0V2lkZ2V0KCk7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQotICAgICAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KLSAgICB9DQotICAgIHByb3AubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQotICAgIG1fcEltcCA9IElGV0xfUGljdHVyZUJveDo6Q3JlYXRlKCk7DQotICAgIEZXTF9FUlIgcmV0ID0gKChJRldMX1BpY3R1cmVCb3gqKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQotICAgIGlmIChyZXQgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCi0gICAgICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJldDsNCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICB9DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICBwcm9wLm1fcERhdGFQcm92aWRlciA9ICZtX1BpY3R1cmVCb3hEUDsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCisgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQorICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQorICB9DQorICBwcm9wLm1fcnRXaWRnZXQgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgbV9wSW1wID0gSUZXTF9QaWN0dXJlQm94OjpDcmVhdGUoKTsNCisgIEZXTF9FUlIgcmV0ID0gKChJRldMX1BpY3R1cmVCb3gqKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQorICBpZiAocmV0ID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQorICB9DQorICByZXR1cm4gcmV0Ow0KIH0NCi1DRlhfRElCaXRtYXAqIENGV0xfUGljdHVyZUJveDo6R2V0UGljdHVyZSgpDQotew0KLSAgICByZXR1cm4gbV9QaWN0dXJlQm94RFAubV9wQml0bWFwOw0KK0NGWF9ESUJpdG1hcCogQ0ZXTF9QaWN0dXJlQm94OjpHZXRQaWN0dXJlKCkgew0KKyAgcmV0dXJuIG1fUGljdHVyZUJveERQLm1fcEJpdG1hcDsNCiB9DQotRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OlNldFBpY3R1cmUoQ0ZYX0RJQml0bWFwICpwQml0bWFwKQ0KLXsNCi0gICAgbV9QaWN0dXJlQm94RFAubV9wQml0bWFwID0gcEJpdG1hcDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94OjpTZXRQaWN0dXJlKENGWF9ESUJpdG1hcCogcEJpdG1hcCkgew0KKyAgbV9QaWN0dXJlQm94RFAubV9wQml0bWFwID0gcEJpdG1hcDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRkxPQVQgQ0ZXTF9QaWN0dXJlQm94OjpHZXRSb3RhdGlvbigpDQotew0KLSAgICByZXR1cm4gbV9QaWN0dXJlQm94RFAubV9mUm90YXRpb247DQorRlhfRkxPQVQgQ0ZXTF9QaWN0dXJlQm94OjpHZXRSb3RhdGlvbigpIHsNCisgIHJldHVybiBtX1BpY3R1cmVCb3hEUC5tX2ZSb3RhdGlvbjsNCiB9DQotRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OlNldFJvdGF0aW9uKEZYX0ZMT0FUIGZSb3RhdGlvbikNCi17DQotICAgIG1fUGljdHVyZUJveERQLm1fZlJvdGF0aW9uID0gZlJvdGF0aW9uOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OlNldFJvdGF0aW9uKEZYX0ZMT0FUIGZSb3RhdGlvbikgew0KKyAgbV9QaWN0dXJlQm94RFAubV9mUm90YXRpb24gPSBmUm90YXRpb247DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLWludDMyX3QgQ0ZXTF9QaWN0dXJlQm94OjpHZXRGbGlwTW9kZSgpDQotew0KLSAgICByZXR1cm4gbV9QaWN0dXJlQm94RFAuR2V0RmxpcE1vZGUoKElGV0xfV2lkZ2V0Kil0aGlzKTsNCitpbnQzMl90IENGV0xfUGljdHVyZUJveDo6R2V0RmxpcE1vZGUoKSB7DQorICByZXR1cm4gbV9QaWN0dXJlQm94RFAuR2V0RmxpcE1vZGUoKElGV0xfV2lkZ2V0Kil0aGlzKTsNCiB9DQotRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OlNldEZsaXBNb2RlKGludDMyX3QgaUZsaXBNb2RlKQ0KLXsNCi0gICAgbV9QaWN0dXJlQm94RFAubV9pRmxpcE1vZGUgPSBpRmxpcE1vZGU7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6U2V0RmxpcE1vZGUoaW50MzJfdCBpRmxpcE1vZGUpIHsNCisgIG1fUGljdHVyZUJveERQLm1faUZsaXBNb2RlID0gaUZsaXBNb2RlOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1pbnQzMl90IENGV0xfUGljdHVyZUJveDo6R2V0T3BhY2l0eSgpDQotew0KLSAgICByZXR1cm4gbV9QaWN0dXJlQm94RFAuR2V0T3BhY2l0eSgoSUZXTF9XaWRnZXQqKXRoaXMpOw0KK2ludDMyX3QgQ0ZXTF9QaWN0dXJlQm94OjpHZXRPcGFjaXR5KCkgew0KKyAgcmV0dXJuIG1fUGljdHVyZUJveERQLkdldE9wYWNpdHkoKElGV0xfV2lkZ2V0Kil0aGlzKTsNCiB9DQotRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OlNldE9wYWNpdHkoaW50MzJfdCBpT3BhY2l0eSkNCi17DQotICAgIG1fUGljdHVyZUJveERQLm1faU9wYWNpdHkgPSBpT3BhY2l0eTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94OjpTZXRPcGFjaXR5KGludDMyX3QgaU9wYWNpdHkpIHsNCisgIG1fUGljdHVyZUJveERQLm1faU9wYWNpdHkgPSBpT3BhY2l0eTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OkdldFNjYWxlKEZYX0ZMT0FUICZmU2NhbGVYLCBGWF9GTE9BVCAmZlNjYWxlWSkNCi17DQotICAgIENGWF9NYXRyaXggbWF0cml4Ow0KLSAgICBtX1BpY3R1cmVCb3hEUC5HZXRNYXRyaXgoKElGV0xfV2lkZ2V0Kil0aGlzLCBtYXRyaXgpOw0KLSAgICBtYXRyaXguU2NhbGUoZlNjYWxlWCwgZlNjYWxlWSk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6R2V0U2NhbGUoRlhfRkxPQVQmIGZTY2FsZVgsIEZYX0ZMT0FUJiBmU2NhbGVZKSB7DQorICBDRlhfTWF0cml4IG1hdHJpeDsNCisgIG1fUGljdHVyZUJveERQLkdldE1hdHJpeCgoSUZXTF9XaWRnZXQqKXRoaXMsIG1hdHJpeCk7DQorICBtYXRyaXguU2NhbGUoZlNjYWxlWCwgZlNjYWxlWSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94OjpTZXRTY2FsZShGWF9GTE9BVCBmU2NhbGVYLCBGWF9GTE9BVCBmU2NhbGVZKQ0KLXsNCi0gICAgbV9QaWN0dXJlQm94RFAubV9mU2NhbGVYID0gZlNjYWxlWDsNCi0gICAgbV9QaWN0dXJlQm94RFAubV9mU2NhbGVZID0gZlNjYWxlWTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94OjpTZXRTY2FsZShGWF9GTE9BVCBmU2NhbGVYLCBGWF9GTE9BVCBmU2NhbGVZKSB7DQorICBtX1BpY3R1cmVCb3hEUC5tX2ZTY2FsZVggPSBmU2NhbGVYOw0KKyAgbV9QaWN0dXJlQm94RFAubV9mU2NhbGVZID0gZlNjYWxlWTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OkdldE9mZnNldChGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSkNCi17DQotICAgIENGWF9NYXRyaXggbWF0cml4Ow0KLSAgICBtX1BpY3R1cmVCb3hEUC5HZXRNYXRyaXgoKElGV0xfV2lkZ2V0Kil0aGlzLCBtYXRyaXgpOw0KLSAgICBmeCA9IG1hdHJpeC5lOw0KLSAgICBmeSA9IG1hdHJpeC5mOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OkdldE9mZnNldChGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSkgew0KKyAgQ0ZYX01hdHJpeCBtYXRyaXg7DQorICBtX1BpY3R1cmVCb3hEUC5HZXRNYXRyaXgoKElGV0xfV2lkZ2V0Kil0aGlzLCBtYXRyaXgpOw0KKyAgZnggPSBtYXRyaXguZTsNCisgIGZ5ID0gbWF0cml4LmY7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94OjpTZXRPZmZzZXQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgbV9QaWN0dXJlQm94RFAubV9mT2ZmU2V0WCA9IGZ4Ow0KLSAgICBtX1BpY3R1cmVCb3hEUC5tX2ZPZmZTZXRZID0gZnk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6U2V0T2Zmc2V0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgbV9QaWN0dXJlQm94RFAubV9mT2ZmU2V0WCA9IGZ4Ow0KKyAgbV9QaWN0dXJlQm94RFAubV9mT2ZmU2V0WSA9IGZ5Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRldMX1BpY3R1cmVCb3g6OkNGV0xfUGljdHVyZUJveCgpDQotew0KK0NGV0xfUGljdHVyZUJveDo6Q0ZXTF9QaWN0dXJlQm94KCkge30NCitDRldMX1BpY3R1cmVCb3g6On5DRldMX1BpY3R1cmVCb3goKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3hEUDo6R2V0Q2FwdGlvbigNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotQ0ZXTF9QaWN0dXJlQm94Ojp+Q0ZXTF9QaWN0dXJlQm94KCkNCi17DQorQ0ZYX0RJQml0bWFwKiBDRldMX1BpY3R1cmVCb3g6OkNGV0xfUGljdHVyZUJveERQOjpHZXRQaWN0dXJlKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fcEJpdG1hcDsNCiB9DQotRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OkNGV0xfUGljdHVyZUJveERQOjpHZXRDYXB0aW9uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NDYXB0aW9uKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0NGWF9ESUJpdG1hcCogQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3hEUDo6R2V0RXJyb3JQaWN0dXJlKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fcEJpdG1hcDsNCiB9DQotQ0ZYX0RJQml0bWFwKiBDRldMX1BpY3R1cmVCb3g6OkNGV0xfUGljdHVyZUJveERQOjpHZXRQaWN0dXJlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIG1fcEJpdG1hcDsNCitDRlhfRElCaXRtYXAqIENGV0xfUGljdHVyZUJveDo6Q0ZXTF9QaWN0dXJlQm94RFA6OkdldEluaXRpYWxQaWN0dXJlKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fcEJpdG1hcDsNCiB9DQotQ0ZYX0RJQml0bWFwKiBDRldMX1BpY3R1cmVCb3g6OkNGV0xfUGljdHVyZUJveERQOjpHZXRFcnJvclBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gbV9wQml0bWFwOw0KK2ludDMyX3QgQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3hEUDo6R2V0T3BhY2l0eShJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1faU9wYWNpdHk7DQogfQ0KLUNGWF9ESUJpdG1hcCogQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3hEUDo6R2V0SW5pdGlhbFBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gbV9wQml0bWFwOw0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3hEUDo6R2V0TWF0cml4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICBwV2lkZ2V0LT5HZXRDbGllbnRSZWN0KHJlY3QpOw0KKyAgRlhfRkxPQVQgZkxlbiA9IHJlY3Qud2lkdGggLyAyOw0KKyAgRlhfRkxPQVQgZldpZCA9IHJlY3QuaGVpZ2h0IC8gMjsNCisgIG1hdHJpeC5SZXNldCgpOw0KKyAgbWF0cml4LlRyYW5zbGF0ZSgtZkxlbiwgLWZXaWQpOw0KKyAgbWF0cml4LlJvdGF0ZShtX2ZSb3RhdGlvbik7DQorICBtYXRyaXguVHJhbnNsYXRlKGZMZW4sIGZXaWQpOw0KKyAgbWF0cml4LlNjYWxlKG1fZlNjYWxlWCwgbV9mU2NhbGVZKTsNCisgIG1hdHJpeC5UcmFuc2xhdGUobV9mT2ZmU2V0WCwgbV9mT2ZmU2V0WSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLWludDMyX3QgQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3hEUDo6R2V0T3BhY2l0eShJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBtX2lPcGFjaXR5Ow0KLX0NCi1GV0xfRVJSIENGV0xfUGljdHVyZUJveDo6Q0ZXTF9QaWN0dXJlQm94RFA6OkdldE1hdHJpeChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJlY3Q7DQotICAgIHBXaWRnZXQtPkdldENsaWVudFJlY3QocmVjdCk7DQotICAgIEZYX0ZMT0FUIGZMZW4gPSByZWN0LndpZHRoIC8gMjsNCi0gICAgRlhfRkxPQVQgZldpZCA9IHJlY3QuaGVpZ2h0IC8gMjsNCi0gICAgbWF0cml4LlJlc2V0KCk7DQotICAgIG1hdHJpeC5UcmFuc2xhdGUoLWZMZW4sIC1mV2lkKTsNCi0gICAgbWF0cml4LlJvdGF0ZShtX2ZSb3RhdGlvbik7DQotICAgIG1hdHJpeC5UcmFuc2xhdGUoZkxlbiwgZldpZCk7DQotICAgIG1hdHJpeC5TY2FsZShtX2ZTY2FsZVgsIG1fZlNjYWxlWSk7DQotICAgIG1hdHJpeC5UcmFuc2xhdGUobV9mT2ZmU2V0WCwgbV9mT2ZmU2V0WSk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotaW50MzJfdCBDRldMX1BpY3R1cmVCb3g6OkNGV0xfUGljdHVyZUJveERQOjpHZXRGbGlwTW9kZShJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBtX2lGbGlwTW9kZTsNCitpbnQzMl90IENGV0xfUGljdHVyZUJveDo6Q0ZXTF9QaWN0dXJlQm94RFA6OkdldEZsaXBNb2RlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9pRmxpcE1vZGU7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9wdXNoYnV0dG9uLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9wdXNoYnV0dG9uLmNwcAppbmRleCBmMDljM2NkLi5lMGRmNzdmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvcHVzaGJ1dHRvbi5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3B1c2hidXR0b24uY3BwCkBAIC01LDY3ICs1LDU4IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KLUNGV0xfUHVzaEJ1dHRvbiogQ0ZXTF9QdXNoQnV0dG9uOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDRldMX1B1c2hCdXR0b247DQorQ0ZXTF9QdXNoQnV0dG9uKiBDRldMX1B1c2hCdXR0b246OkNyZWF0ZSgpIHsNCisgIHJldHVybiBGWF9ORVcgQ0ZXTF9QdXNoQnV0dG9uOw0KIH0NCi1GV0xfRVJSIENGV0xfUHVzaEJ1dHRvbjo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzICkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoIW1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgaWYgKHBQcm9wZXJ0aWVzKSB7DQotICAgICAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCi0gICAgfQ0KLSAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCi0gICAgcHJvcC5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCi0gICAgcHJvcC5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCi0gICAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCi0gICAgcHJvcC5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCi0gICAgcHJvcC5tX3BEYXRhUHJvdmlkZXIgPSAmbV9idXR0b25EYXRhOw0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQotICAgICAgICBwcm9wLm1fcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudC0+R2V0V2lkZ2V0KCk7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQotICAgICAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KLSAgICB9DQotICAgIHByb3AubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQotICAgIG1fcEltcCA9IElGV0xfUHVzaEJ1dHRvbjo6Q3JlYXRlKCk7DQotICAgIEZXTF9FUlIgcmV0ID0gKChJRldMX1B1c2hCdXR0b24qKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQotICAgIGlmIChyZXQgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCi0gICAgICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJldDsNCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbjo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICB9DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICBwcm9wLm1fcERhdGFQcm92aWRlciA9ICZtX2J1dHRvbkRhdGE7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQorICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcikgew0KKyAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KKyAgfQ0KKyAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIG1fcEltcCA9IElGV0xfUHVzaEJ1dHRvbjo6Q3JlYXRlKCk7DQorICBGV0xfRVJSIHJldCA9ICgoSUZXTF9QdXNoQnV0dG9uKiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KKyAgaWYgKHJldCA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KKyAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIHJldDsNCiB9DQotRldMX0VSUiBDRldMX1B1c2hCdXR0b246OkdldENhcHRpb24oQ0ZYX1dpZGVTdHJpbmcgJndzQ2FwdGlvbikNCi17DQotICAgIHdzQ2FwdGlvbiA9IG1fYnV0dG9uRGF0YS5tX3dzQ2FwdGlvbjsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9QdXNoQnV0dG9uOjpHZXRDYXB0aW9uKENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pIHsNCisgIHdzQ2FwdGlvbiA9IG1fYnV0dG9uRGF0YS5tX3dzQ2FwdGlvbjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1B1c2hCdXR0b246OlNldENhcHRpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhcHRpb24pDQotew0KLSAgICBtX2J1dHRvbkRhdGEubV93c0NhcHRpb24gPSB3c0NhcHRpb247DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbjo6U2V0Q2FwdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbikgew0KKyAgbV9idXR0b25EYXRhLm1fd3NDYXB0aW9uID0gd3NDYXB0aW9uOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRlhfRElCaXRtYXAqIENGV0xfUHVzaEJ1dHRvbjo6R2V0UGljdHVyZSgpDQotew0KLSAgICByZXR1cm4gbV9idXR0b25EYXRhLm1fcEJpdG1hcDsNCitDRlhfRElCaXRtYXAqIENGV0xfUHVzaEJ1dHRvbjo6R2V0UGljdHVyZSgpIHsNCisgIHJldHVybiBtX2J1dHRvbkRhdGEubV9wQml0bWFwOw0KIH0NCi1GV0xfRVJSIENGV0xfUHVzaEJ1dHRvbjo6U2V0UGljdHVyZShDRlhfRElCaXRtYXAgKnBCaXRtYXApDQotew0KLSAgICBtX2J1dHRvbkRhdGEubV9wQml0bWFwID0gcEJpdG1hcDsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ0ZXTF9QdXNoQnV0dG9uOjpTZXRQaWN0dXJlKENGWF9ESUJpdG1hcCogcEJpdG1hcCkgew0KKyAgbV9idXR0b25EYXRhLm1fcEJpdG1hcCA9IHBCaXRtYXA7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUNGV0xfUHVzaEJ1dHRvbjo6Q0ZXTF9QdXNoQnV0dG9uKCkNCi17DQorQ0ZXTF9QdXNoQnV0dG9uOjpDRldMX1B1c2hCdXR0b24oKSB7fQ0KK0NGV0xfUHVzaEJ1dHRvbjo6fkNGV0xfUHVzaEJ1dHRvbigpIHt9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b246OkNGV0xfUHVzaEJ1dHRvbkRQOjpHZXRDYXB0aW9uKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgew0KKyAgd3NDYXB0aW9uID0gbV93c0NhcHRpb247DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUNGV0xfUHVzaEJ1dHRvbjo6fkNGV0xfUHVzaEJ1dHRvbigpDQotew0KLX0NCi1GV0xfRVJSIENGV0xfUHVzaEJ1dHRvbjo6Q0ZXTF9QdXNoQnV0dG9uRFA6OkdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pDQotew0KLSAgICB3c0NhcHRpb24gPSBtX3dzQ2FwdGlvbjsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1DRlhfRElCaXRtYXAqIENGV0xfUHVzaEJ1dHRvbjo6Q0ZXTF9QdXNoQnV0dG9uRFA6OkdldFBpY3R1cmUoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gbV9wQml0bWFwOw0KK0NGWF9ESUJpdG1hcCogQ0ZXTF9QdXNoQnV0dG9uOjpDRldMX1B1c2hCdXR0b25EUDo6R2V0UGljdHVyZSgNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX3BCaXRtYXA7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9zY3JvbGxiYXIuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Njcm9sbGJhci5jcHAKaW5kZXggNDkyYjBmOS4uNmI0ZTMyNiAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Njcm9sbGJhci5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Njcm9sbGJhci5jcHAKQEAgLTUsOTggKzUsODAgQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQogDQogI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQotQ0ZXTF9TY3JvbGxCYXIqIENGV0xfU2Nyb2xsQmFyOjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDRldMX1Njcm9sbEJhcjsNCitDRldMX1Njcm9sbEJhciogQ0ZXTF9TY3JvbGxCYXI6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBGWF9ORVcgQ0ZXTF9TY3JvbGxCYXI7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXI6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyApDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIGlmIChwUHJvcGVydGllcykgew0KLSAgICAgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQotICAgIH0NCi0gICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQotICAgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQotICAgIHByb3AubV9kd1N0eWxlRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQotICAgIHByb3AubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQotICAgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCi0gICAgICAgIHByb3AubV9wUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9wUGFyZW50LT5HZXRXaWRnZXQoKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wT3duZXIpIHsNCi0gICAgICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQotICAgIH0NCi0gICAgcHJvcC5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgbV9wSW1wID0gSUZXTF9TY3JvbGxCYXI6OkNyZWF0ZSgpOw0KLSAgICBGV0xfRVJSIHJldCA9ICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQotICAgIGlmIChyZXQgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCi0gICAgICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJldDsNCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoIW1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIGlmIChwUHJvcGVydGllcykgew0KKyAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCisgIH0NCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgcHJvcC5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCisgIHByb3AubV9kd1N0eWxlRXhlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorICBwcm9wLm1fZHdTdGF0ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KKyAgcHJvcC5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQpIHsNCisgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQorICAgIHByb3AubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lci0+R2V0V2lkZ2V0KCk7DQorICB9DQorICBwcm9wLm1fcnRXaWRnZXQgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgbV9wSW1wID0gSUZXTF9TY3JvbGxCYXI6OkNyZWF0ZSgpOw0KKyAgRldMX0VSUiByZXQgPSAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5Jbml0aWFsaXplKHByb3ApOw0KKyAgaWYgKHJldCA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KKyAgICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIHJldDsNCiB9DQotRlhfQk9PTCBDRldMX1Njcm9sbEJhcjo6SXNWZXJ0aWNhbCgpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KLSAgICByZXR1cm4gKChJRldMX1Njcm9sbEJhciopbV9wSW1wKS0+SXNWZXJ0aWNhbCgpOw0KK0ZYX0JPT0wgQ0ZXTF9TY3JvbGxCYXI6OklzVmVydGljYWwoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KKyAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPklzVmVydGljYWwoKTsNCiB9DQotRldMX0VSUiBDRldMX1Njcm9sbEJhcjo6R2V0UmFuZ2UoRlhfRkxPQVQgJmZNaW4sIEZYX0ZMT0FUICZmTWF4KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5HZXRSYW5nZShmTWluLCBmTWF4KTsNCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpHZXRSYW5nZShGWF9GTE9BVCYgZk1pbiwgRlhfRkxPQVQmIGZNYXgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPkdldFJhbmdlKGZNaW4sIGZNYXgpOw0KIH0NCi1GV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpTZXRSYW5nZShGWF9GTE9BVCBmTWluLCBGWF9GTE9BVCBmTWF4KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5TZXRSYW5nZShmTWluLCBmTWF4KTsNCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpTZXRSYW5nZShGWF9GTE9BVCBmTWluLCBGWF9GTE9BVCBmTWF4KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5TZXRSYW5nZShmTWluLCBmTWF4KTsNCiB9DQotRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXI6OkdldFBhZ2VTaXplKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCi0gICAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPkdldFBhZ2VTaXplKCk7DQorRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXI6OkdldFBhZ2VTaXplKCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KKyAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPkdldFBhZ2VTaXplKCk7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXI6OlNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gKChJRldMX1Njcm9sbEJhciopbV9wSW1wKS0+U2V0UGFnZVNpemUoZlBhZ2VTaXplKTsNCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpTZXRQYWdlU2l6ZShGWF9GTE9BVCBmUGFnZVNpemUpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPlNldFBhZ2VTaXplKGZQYWdlU2l6ZSk7DQogfQ0KLUZYX0ZMT0FUIENGV0xfU2Nyb2xsQmFyOjpHZXRTdGVwU2l6ZSgpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQotICAgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5HZXRTdGVwU2l6ZSgpOw0KK0ZYX0ZMT0FUIENGV0xfU2Nyb2xsQmFyOjpHZXRTdGVwU2l6ZSgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5HZXRTdGVwU2l6ZSgpOw0KIH0NCi1GV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpTZXRTdGVwU2l6ZShGWF9GTE9BVCBmU3RlcFNpemUpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPlNldFN0ZXBTaXplKGZTdGVwU2l6ZSk7DQorRldMX0VSUiBDRldMX1Njcm9sbEJhcjo6U2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5TZXRTdGVwU2l6ZShmU3RlcFNpemUpOw0KIH0NCi1GWF9GTE9BVCBDRldMX1Njcm9sbEJhcjo6R2V0UG9zKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAtMSk7DQotICAgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5HZXRQb3MoKTsNCitGWF9GTE9BVCBDRldMX1Njcm9sbEJhcjo6R2V0UG9zKCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIC0xKTsNCisgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5HZXRQb3MoKTsNCiB9DQotRldMX0VSUiBDRldMX1Njcm9sbEJhcjo6U2V0UG9zKEZYX0ZMT0FUIGZQb3MpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPlNldFBvcyhmUG9zKTsNCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpTZXRQb3MoRlhfRkxPQVQgZlBvcykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gKChJRldMX1Njcm9sbEJhciopbV9wSW1wKS0+U2V0UG9zKGZQb3MpOw0KIH0NCi1GWF9GTE9BVCBDRldMX1Njcm9sbEJhcjo6R2V0VHJhY2tQb3MoKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIC0xKTsNCi0gICAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPkdldFRyYWNrUG9zKCk7DQorRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXI6OkdldFRyYWNrUG9zKCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIC0xKTsNCisgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5HZXRUcmFja1BvcygpOw0KIH0NCi1GV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpTZXRUcmFja1BvcyhGWF9GTE9BVCBmVHJhY2tQb3MpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuICgoSUZXTF9TY3JvbGxCYXIqKW1fcEltcCktPlNldFRyYWNrUG9zKGZUcmFja1Bvcyk7DQorRldMX0VSUiBDRldMX1Njcm9sbEJhcjo6U2V0VHJhY2tQb3MoRlhfRkxPQVQgZlRyYWNrUG9zKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiAoKElGV0xfU2Nyb2xsQmFyKiltX3BJbXApLT5TZXRUcmFja1BvcyhmVHJhY2tQb3MpOw0KIH0NCi1GWF9CT09MIENGV0xfU2Nyb2xsQmFyOjpEb1Njcm9sbChGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRkFMU0UpOw0KLSAgICByZXR1cm4gKChJRldMX1Njcm9sbEJhciopbV9wSW1wKS0+RG9TY3JvbGwoZHdDb2RlLCBmUG9zKTsNCitGWF9CT09MIENGV0xfU2Nyb2xsQmFyOjpEb1Njcm9sbChGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGQUxTRSk7DQorICByZXR1cm4gKChJRldMX1Njcm9sbEJhciopbV9wSW1wKS0+RG9TY3JvbGwoZHdDb2RlLCBmUG9zKTsNCiB9DQotQ0ZXTF9TY3JvbGxCYXI6OkNGV0xfU2Nyb2xsQmFyKCkNCi17DQotfQ0KLUNGV0xfU2Nyb2xsQmFyOjp+Q0ZXTF9TY3JvbGxCYXIoKQ0KLXsNCi19DQorQ0ZXTF9TY3JvbGxCYXI6OkNGV0xfU2Nyb2xsQmFyKCkge30NCitDRldMX1Njcm9sbEJhcjo6fkNGV0xfU2Nyb2xsQmFyKCkge30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvdGhlbWUuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3RoZW1lLmNwcAppbmRleCBmOWEyYmFiLi5lOGZiNDFkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvdGhlbWUuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC90aGVtZS5jcHAKQEAgLTUsMTUxICs1LDE0MSBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCi1GWF9CT09MIENGV0xfVGhlbWU6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBDRldMX1dpZGdldFRQICpwVGhlbWUgPSBHZXRUaGVtZShwV2lkZ2V0KTsNCi0gICAgcmV0dXJuIHBUaGVtZSAhPSBOVUxMOw0KK0ZYX0JPT0wgQ0ZXTF9UaGVtZTo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgQ0ZXTF9XaWRnZXRUUCogcFRoZW1lID0gR2V0VGhlbWUocFdpZGdldCk7DQorICByZXR1cm4gcFRoZW1lICE9IE5VTEw7DQogfQ0KLUZYX0RXT1JEIENGV0xfVGhlbWU6OkdldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBDRldMX1dpZGdldFRQICpwVGhlbWUgPSBHZXRUaGVtZShwV2lkZ2V0KTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQotICAgIHJldHVybiBwVGhlbWUtPkdldFRoZW1lSUQocFdpZGdldCk7DQorRlhfRFdPUkQgQ0ZXTF9UaGVtZTo6R2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgQ0ZXTF9XaWRnZXRUUCogcFRoZW1lID0gR2V0VGhlbWUocFdpZGdldCk7DQorICBGWFNZU19hc3NlcnQocFRoZW1lKTsNCisgIHJldHVybiBwVGhlbWUtPkdldFRoZW1lSUQocFdpZGdldCk7DQogfQ0KLUZYX0RXT1JEIENGV0xfVGhlbWU6OlNldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0RXT1JEIGR3VGhlbWVJRCwgRlhfQk9PTCBiQ2hpbGRyZW4gKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX2FyclRoZW1lcy5HZXRTaXplKCk7DQotICAgIEZYX0RXT1JEIGR3SUQ7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZXTF9XaWRnZXRUUCAqcFRoZW1lID0gKENGV0xfV2lkZ2V0VFAqKW1fYXJyVGhlbWVzW2ldOw0KLSAgICAgICAgZHdJRCA9IHBUaGVtZS0+R2V0VGhlbWVJRChwV2lkZ2V0KTsNCi0gICAgICAgIHBUaGVtZS0+U2V0VGhlbWVJRChwV2lkZ2V0LCBkd1RoZW1lSUQsIEZBTFNFKTsNCitGWF9EV09SRCBDRldMX1RoZW1lOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUaGVtZUlELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4pIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJUaGVtZXMuR2V0U2l6ZSgpOw0KKyAgRlhfRFdPUkQgZHdJRDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENGV0xfV2lkZ2V0VFAqIHBUaGVtZSA9IChDRldMX1dpZGdldFRQKiltX2FyclRoZW1lc1tpXTsNCisgICAgZHdJRCA9IHBUaGVtZS0+R2V0VGhlbWVJRChwV2lkZ2V0KTsNCisgICAgcFRoZW1lLT5TZXRUaGVtZUlEKHBXaWRnZXQsIGR3VGhlbWVJRCwgRkFMU0UpOw0KKyAgfQ0KKyAgcmV0dXJuIGR3SUQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9UaGVtZTo6R2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfVGhlbWU6OlNldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9UaGVtZTo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIENGV0xfV2lkZ2V0VFAqIHBUaGVtZSA9IEdldFRoZW1lKHBQYXJhbXMtPm1fcFdpZGdldCk7DQorICBGWFNZU19hc3NlcnQocFRoZW1lKTsNCisgIHJldHVybiBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKHBQYXJhbXMpOw0KK30NCitGWF9CT09MIENGV0xfVGhlbWU6OkRyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKSB7DQorICBDRldMX1dpZGdldFRQKiBwVGhlbWUgPSBHZXRUaGVtZShwUGFyYW1zLT5tX3BXaWRnZXQpOw0KKyAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQorICByZXR1cm4gcFRoZW1lLT5EcmF3VGV4dChwUGFyYW1zKTsNCit9DQordm9pZCogQ0ZXTF9UaGVtZTo6R2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpIHsNCisgIENGV0xfV2lkZ2V0VFAqIHBUaGVtZSA9IEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCk7DQorICBGWFNZU19hc3NlcnQocFRoZW1lKTsNCisgIHJldHVybiBwVGhlbWUtPkdldENhcGFjaXR5KHBUaGVtZVBhcnQsIGR3Q2FwYWNpdHkpOw0KK30NCitGWF9CT09MIENGV0xfVGhlbWU6OklzQ3VzdG9taXplZExheW91dChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgQ0ZXTF9XaWRnZXRUUCogcFRoZW1lID0gR2V0VGhlbWUocFdpZGdldCk7DQorICBGWFNZU19hc3NlcnQocFRoZW1lKTsNCisgIHJldHVybiBwVGhlbWUtPklzQ3VzdG9taXplZExheW91dChwV2lkZ2V0KTsNCit9DQorRldMX0VSUiBDRldMX1RoZW1lOjpHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwgQ0ZYX1JlY3RGJiBydFBhcnQpIHsNCisgIENGV0xfV2lkZ2V0VFAqIHBUaGVtZSA9IEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCk7DQorICBGWFNZU19hc3NlcnQocFRoZW1lKTsNCisgIHJldHVybiBwVGhlbWUtPkdldFBhcnRSZWN0KHBUaGVtZVBhcnQsIHJ0UGFydCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9UaGVtZTo6SXNJblBhcnQoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBDRldMX1dpZGdldFRQKiBwVGhlbWUgPSBHZXRUaGVtZShwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpOw0KKyAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQorICByZXR1cm4gcFRoZW1lLT5Jc0luUGFydChwVGhlbWVQYXJ0LCBmeCwgZnkpOw0KK30NCitGWF9CT09MIENGV0xfVGhlbWU6OkNhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCogcFBhcmFtcywgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBDRldMX1dpZGdldFRQKiBwVGhlbWUgPSBHZXRUaGVtZShwUGFyYW1zLT5tX3BXaWRnZXQpOw0KKyAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQorICByZXR1cm4gcFRoZW1lLT5DYWxjVGV4dFJlY3QocFBhcmFtcywgcmVjdCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9UaGVtZTo6SW5pdGlhbGl6ZSgpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJUaGVtZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ0ZXTF9XaWRnZXRUUCogcFRoZW1lID0gKENGV0xfV2lkZ2V0VFAqKW1fYXJyVGhlbWVzW2ldOw0KKyAgICBwVGhlbWUtPkluaXRpYWxpemUoKTsNCisgIH0NCisgIEZXTFRIRU1FX0luaXQoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1RoZW1lOjpGaW5hbGl6ZSgpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJUaGVtZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ0ZXTF9XaWRnZXRUUCogcFRoZW1lID0gKENGV0xfV2lkZ2V0VFAqKW1fYXJyVGhlbWVzW2ldOw0KKyAgICBwVGhlbWUtPkZpbmFsaXplKCk7DQorICB9DQorICBGV0xUSEVNRV9SZWxlYXNlKCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGV0xfVGhlbWU6OkNGV0xfVGhlbWUoKSB7DQorICBDRldMX0Zvcm1UUCogcEZvcm1UUCA9IEZYX05FVyBDRldMX0Zvcm1UUDsNCisgIENGV0xfUHVzaEJ1dHRvblRQKiBwUHVzaEJ1dHRvblRQID0gRlhfTkVXIENGV0xfUHVzaEJ1dHRvblRQOw0KKyAgQ0ZXTF9DaGVja0JveFRQKiBwQ2hlY2tCb3hUUCA9IEZYX05FVyBDRldMX0NoZWNrQm94VFA7DQorICBDRldMX0xpc3RCb3hUUCogcExpc3RCb3hUUCA9IEZYX05FVyBDRldMX0xpc3RCb3hUUDsNCisgIENGV0xfUGljdHVyZUJveFRQKiBwUGljdHVyZUJveFRQID0gRlhfTkVXIENGV0xfUGljdHVyZUJveFRQOw0KKyAgQ0ZXTF9TY3JvbGxCYXJUUCogcFNyb2xsQmFyVFAgPSBGWF9ORVcgQ0ZXTF9TY3JvbGxCYXJUUDsNCisgIENGV0xfRWRpdFRQKiBwRWRpdFRQID0gRlhfTkVXIENGV0xfRWRpdFRQOw0KKyAgQ0ZXTF9Db21ib0JveFRQKiBwQ29tYm9Cb3hUUCA9IEZYX05FVyBDRldMX0NvbWJvQm94VFA7DQorICBDRldMX0JhcmNvZGVUUCogcEJhcmNvZGVUUCA9IEZYX05FVyBDRldMX0JhcmNvZGVUUDsNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXJUUCogcERhdGVUaW1lUGlja2VyVFAgPSBGWF9ORVcgQ0ZXTF9EYXRlVGltZVBpY2tlclRQOw0KKyAgQ0ZXTF9Nb250aENhbGVuZGFyVFAqIHBNb250aENhbGVuZGFyVFAgPSBGWF9ORVcgQ0ZXTF9Nb250aENhbGVuZGFyVFA7DQorICBDRldMX0NhcmV0VFAqIHBDYXJldFRQID0gRlhfTkVXIENGV0xfQ2FyZXRUUDsNCisgIG1fYXJyVGhlbWVzLkFkZChwRm9ybVRQKTsNCisgIG1fYXJyVGhlbWVzLkFkZChwUHVzaEJ1dHRvblRQKTsNCisgIG1fYXJyVGhlbWVzLkFkZChwQ2hlY2tCb3hUUCk7DQorICBtX2FyclRoZW1lcy5BZGQocExpc3RCb3hUUCk7DQorICBtX2FyclRoZW1lcy5BZGQocFBpY3R1cmVCb3hUUCk7DQorICBtX2FyclRoZW1lcy5BZGQocFNyb2xsQmFyVFApOw0KKyAgbV9hcnJUaGVtZXMuQWRkKHBFZGl0VFApOw0KKyAgbV9hcnJUaGVtZXMuQWRkKHBDb21ib0JveFRQKTsNCisgIG1fYXJyVGhlbWVzLkFkZChwQmFyY29kZVRQKTsNCisgIG1fYXJyVGhlbWVzLkFkZChwRGF0ZVRpbWVQaWNrZXJUUCk7DQorICBtX2FyclRoZW1lcy5BZGQocE1vbnRoQ2FsZW5kYXJUUCk7DQorICBtX2FyclRoZW1lcy5BZGQocENhcmV0VFApOw0KK30NCitDRldMX1RoZW1lOjp+Q0ZXTF9UaGVtZSgpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJUaGVtZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ0ZXTF9XaWRnZXRUUCogcFRoZW1lID0gKENGV0xfV2lkZ2V0VFAqKW1fYXJyVGhlbWVzW2ldOw0KKyAgICBkZWxldGUgcFRoZW1lOw0KKyAgfQ0KKyAgbV9hcnJUaGVtZXMuUmVtb3ZlQWxsKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9UaGVtZTo6U2V0Rm9udChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN0ckZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiByZ2JGb250KSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fYXJyVGhlbWVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENGV0xfV2lkZ2V0VFAqIHBUaGVtZSA9IChDRldMX1dpZGdldFRQKiltX2FyclRoZW1lc1tpXTsNCisgICAgcFRoZW1lLT5TZXRGb250KHBXaWRnZXQsIHN0ckZvbnQsIGZGb250U2l6ZSwgcmdiRm9udCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGV0xfV2lkZ2V0VFAqIENGV0xfVGhlbWU6OkdldFRoZW1lKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fYXJyVGhlbWVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENGV0xfV2lkZ2V0VFAqIHBUaGVtZSA9IChDRldMX1dpZGdldFRQKiltX2FyclRoZW1lc1tpXTsNCisgICAgaWYgKHBUaGVtZS0+SXNWYWxpZFdpZGdldChwV2lkZ2V0KSkgew0KKyAgICAgIHJldHVybiBwVGhlbWU7DQogICAgIH0NCi0gICAgcmV0dXJuIGR3SUQ7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9UaGVtZTo6R2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9NYXRyaXggJm1hdHJpeCkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi19DQotRldMX0VSUglDRldMX1RoZW1lOjpTZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9CT09MIENGV0xfVGhlbWU6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRUUCAqcFRoZW1lID0gR2V0VGhlbWUocFBhcmFtcy0+bV9wV2lkZ2V0KTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQotICAgIHJldHVybiBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKHBQYXJhbXMpOw0KLX0NCi1GWF9CT09MIENGV0xfVGhlbWU6OkRyYXdUZXh0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zKQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRUUCAqcFRoZW1lID0gR2V0VGhlbWUocFBhcmFtcy0+bV9wV2lkZ2V0KTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQotICAgIHJldHVybiBwVGhlbWUtPkRyYXdUZXh0KHBQYXJhbXMpOw0KLX0NCi12b2lkKiBDRldMX1RoZW1lOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSkNCi17DQotICAgIENGV0xfV2lkZ2V0VFAgKnBUaGVtZSA9IEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCk7DQotICAgIEZYU1lTX2Fzc2VydChwVGhlbWUpOw0KLSAgICByZXR1cm4gcFRoZW1lLT5HZXRDYXBhY2l0eShwVGhlbWVQYXJ0LCBkd0NhcGFjaXR5KTsNCi19DQotRlhfQk9PTCBDRldMX1RoZW1lOjpJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBDRldMX1dpZGdldFRQICpwVGhlbWUgPSBHZXRUaGVtZShwV2lkZ2V0KTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQotICAgIHJldHVybiBwVGhlbWUtPklzQ3VzdG9taXplZExheW91dChwV2lkZ2V0KTsNCi19DQotRldMX0VSUiBDRldMX1RoZW1lOjpHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwgQ0ZYX1JlY3RGICZydFBhcnQpDQotew0KLSAgICBDRldMX1dpZGdldFRQICpwVGhlbWUgPSBHZXRUaGVtZShwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpOw0KLSAgICBGWFNZU19hc3NlcnQocFRoZW1lKTsNCi0gICAgcmV0dXJuIHBUaGVtZS0+R2V0UGFydFJlY3QocFRoZW1lUGFydCwgcnRQYXJ0KTsNCi19DQotRlhfQk9PTCBDRldMX1RoZW1lOjpJc0luUGFydChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgQ0ZXTF9XaWRnZXRUUCAqcFRoZW1lID0gR2V0VGhlbWUocFRoZW1lUGFydC0+bV9wV2lkZ2V0KTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQotICAgIHJldHVybiBwVGhlbWUtPklzSW5QYXJ0KHBUaGVtZVBhcnQsIGZ4LCBmeSk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9UaGVtZTo6Q2FsY1RleHRSZWN0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zLCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBDRldMX1dpZGdldFRQICpwVGhlbWUgPSBHZXRUaGVtZShwUGFyYW1zLT5tX3BXaWRnZXQpOw0KLSAgICBGWFNZU19hc3NlcnQocFRoZW1lKTsNCi0gICAgcmV0dXJuIHBUaGVtZS0+Q2FsY1RleHRSZWN0KHBQYXJhbXMsIHJlY3QpOw0KLX0NCi1GV0xfRVJSCUNGV0xfVGhlbWU6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX2FyclRoZW1lcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZXTF9XaWRnZXRUUCAqcFRoZW1lID0gKENGV0xfV2lkZ2V0VFAqKW1fYXJyVGhlbWVzW2ldOw0KLSAgICAgICAgcFRoZW1lLT5Jbml0aWFsaXplKCk7DQotICAgIH0NCi0gICAgRldMVEhFTUVfSW5pdCgpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9UaGVtZTo6RmluYWxpemUoKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX2FyclRoZW1lcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZXTF9XaWRnZXRUUCAqcFRoZW1lID0gKENGV0xfV2lkZ2V0VFAqKW1fYXJyVGhlbWVzW2ldOw0KLSAgICAgICAgcFRoZW1lLT5GaW5hbGl6ZSgpOw0KLSAgICB9DQotICAgIEZXTFRIRU1FX1JlbGVhc2UoKTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1DRldMX1RoZW1lOjpDRldMX1RoZW1lKCkNCi17DQotICAgIENGV0xfRm9ybVRQICpwRm9ybVRQID0gRlhfTkVXIENGV0xfRm9ybVRQOw0KLSAgICBDRldMX1B1c2hCdXR0b25UUAkJKnBQdXNoQnV0dG9uVFAgPSBGWF9ORVcgQ0ZXTF9QdXNoQnV0dG9uVFA7DQotICAgIENGV0xfQ2hlY2tCb3hUUAkJCSpwQ2hlY2tCb3hUUCA9IEZYX05FVyBDRldMX0NoZWNrQm94VFA7DQotICAgIENGV0xfTGlzdEJveFRQCQkJKnBMaXN0Qm94VFAgPSBGWF9ORVcgQ0ZXTF9MaXN0Qm94VFA7DQotICAgIENGV0xfUGljdHVyZUJveFRQCQkqcFBpY3R1cmVCb3hUUCA9IEZYX05FVyBDRldMX1BpY3R1cmVCb3hUUDsNCi0gICAgQ0ZXTF9TY3JvbGxCYXJUUAkJKnBTcm9sbEJhclRQID0gRlhfTkVXIENGV0xfU2Nyb2xsQmFyVFA7DQotICAgIENGV0xfRWRpdFRQCQkJCSpwRWRpdFRQID0gRlhfTkVXIENGV0xfRWRpdFRQOw0KLSAgICBDRldMX0NvbWJvQm94VFAJCQkqcENvbWJvQm94VFAgPSBGWF9ORVcgQ0ZXTF9Db21ib0JveFRQOw0KLSAgICBDRldMX0JhcmNvZGVUUAkJCSpwQmFyY29kZVRQID0gRlhfTkVXIENGV0xfQmFyY29kZVRQOw0KLSAgICBDRldMX0RhdGVUaW1lUGlja2VyVFAJKnBEYXRlVGltZVBpY2tlclRQID0gRlhfTkVXIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDsNCi0gICAgQ0ZXTF9Nb250aENhbGVuZGFyVFAJKnBNb250aENhbGVuZGFyVFAgPSBGWF9ORVcgQ0ZXTF9Nb250aENhbGVuZGFyVFA7DQotICAgIENGV0xfQ2FyZXRUUAkJCSpwQ2FyZXRUUCA9IEZYX05FVyBDRldMX0NhcmV0VFA7DQotICAgIG1fYXJyVGhlbWVzLkFkZChwRm9ybVRQKTsNCi0gICAgbV9hcnJUaGVtZXMuQWRkKHBQdXNoQnV0dG9uVFApOw0KLSAgICBtX2FyclRoZW1lcy5BZGQocENoZWNrQm94VFApOw0KLSAgICBtX2FyclRoZW1lcy5BZGQocExpc3RCb3hUUCk7DQotICAgIG1fYXJyVGhlbWVzLkFkZChwUGljdHVyZUJveFRQKTsNCi0gICAgbV9hcnJUaGVtZXMuQWRkKHBTcm9sbEJhclRQKTsNCi0gICAgbV9hcnJUaGVtZXMuQWRkKHBFZGl0VFApOw0KLSAgICBtX2FyclRoZW1lcy5BZGQocENvbWJvQm94VFApOw0KLSAgICBtX2FyclRoZW1lcy5BZGQocEJhcmNvZGVUUCk7DQotICAgIG1fYXJyVGhlbWVzLkFkZChwRGF0ZVRpbWVQaWNrZXJUUCk7DQotICAgIG1fYXJyVGhlbWVzLkFkZChwTW9udGhDYWxlbmRhclRQKTsNCi0gICAgbV9hcnJUaGVtZXMuQWRkKHBDYXJldFRQKTsNCi19DQotQ0ZXTF9UaGVtZTo6fkNGV0xfVGhlbWUoKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX2FyclRoZW1lcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZXTF9XaWRnZXRUUCAqcFRoZW1lID0gKENGV0xfV2lkZ2V0VFAqKW1fYXJyVGhlbWVzW2ldOw0KLSAgICAgICAgZGVsZXRlIHBUaGVtZTsNCi0gICAgfQ0KLSAgICBtX2FyclRoZW1lcy5SZW1vdmVBbGwoKTsNCi19DQotRldMX0VSUglDRldMX1RoZW1lOjpTZXRGb250KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBGWF9XQ0hBUiogc3RyRm9udCwgRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9BUkdCIHJnYkZvbnQpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fYXJyVGhlbWVzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICBDRldMX1dpZGdldFRQICpwVGhlbWUgPSAoQ0ZXTF9XaWRnZXRUUCopbV9hcnJUaGVtZXNbaV07DQotICAgICAgICBwVGhlbWUtPlNldEZvbnQocFdpZGdldCwgc3RyRm9udCwgZkZvbnRTaXplLCByZ2JGb250KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUNGV0xfV2lkZ2V0VFAqIENGV0xfVGhlbWU6OkdldFRoZW1lKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX2FyclRoZW1lcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZXTF9XaWRnZXRUUCAqcFRoZW1lID0gKENGV0xfV2lkZ2V0VFAqKW1fYXJyVGhlbWVzW2ldOw0KLSAgICAgICAgaWYgKHBUaGVtZS0+SXNWYWxpZFdpZGdldChwV2lkZ2V0KSkgew0KLSAgICAgICAgICAgIHJldHVybiBwVGhlbWU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Rvb2x0aXBjdHJsLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC90b29sdGlwY3RybC5jcHAKaW5kZXggNzQ5MWU2Yi4uMTg2NGMyOCAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Rvb2x0aXBjdHJsLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuY3BwCkBAIC0xMSwxMzEgKzExLDEwNyBAQAogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfcGFuZWxpbXAuaCINCiAjaW5jbHVkZSAiLi4vY29yZS9pbmNsdWRlL2Z3bF9mb3JtaW1wLmgiDQogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQotQ0ZXTF9Ub29sVGlwKiBDRldMX1Rvb2xUaXA6OkNyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gRlhfTkVXIENGV0xfVG9vbFRpcDsNCitDRldMX1Rvb2xUaXAqIENGV0xfVG9vbFRpcDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIEZYX05FVyBDRldMX1Rvb2xUaXA7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAqcFByb3BlcnRpZXMgKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTCghbV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBpZiAocFByb3BlcnRpZXMpIHsNCi0gICAgICAgICptX3BQcm9wZXJ0aWVzID0gKnBQcm9wZXJ0aWVzOw0KLSAgICB9DQotICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KLSAgICBwcm9wLm1fZHdTdHlsZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzOw0KLSAgICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KLSAgICBwcm9wLm1fZHdTdGF0ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KLSAgICBwcm9wLm1fY3RtT25QYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50Ow0KLSAgICBwcm9wLm1fcERhdGFQcm92aWRlciA9ICZtX3Rvb2x0aXBEYXRhOw0KLSAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wUGFyZW50KSB7DQotICAgICAgICBwcm9wLm1fcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudC0+R2V0V2lkZ2V0KCk7DQotICAgIH0NCi0gICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcE93bmVyKSB7DQotICAgICAgICBwcm9wLm1fcE93bmVyID0gbV9wUHJvcGVydGllcy0+bV9wT3duZXItPkdldFdpZGdldCgpOw0KLSAgICB9DQotICAgIHByb3AubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQotICAgIG1fcEltcCA9IElGV0xfVG9vbFRpcDo6Q3JlYXRlKCk7DQotICAgIEZXTF9FUlIgcmV0ID0gKChJRldMX1Rvb2xUaXAqKW1fcEltcCktPkluaXRpYWxpemUocHJvcCk7DQotICAgIGlmIChyZXQgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCi0gICAgICAgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJldDsNCitGV0xfRVJSIENGV0xfVG9vbFRpcDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKCFtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICB9DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgIHByb3AubV9kd1N0eWxlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorICBwcm9wLm1fZHdTdHlsZUV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgcHJvcC5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgIHByb3AubV9jdG1PblBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQ7DQorICBwcm9wLm1fcERhdGFQcm92aWRlciA9ICZtX3Rvb2x0aXBEYXRhOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudCkgew0KKyAgICBwcm9wLm1fcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudC0+R2V0V2lkZ2V0KCk7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9wT3duZXIpIHsNCisgICAgcHJvcC5tX3BPd25lciA9IG1fcFByb3BlcnRpZXMtPm1fcE93bmVyLT5HZXRXaWRnZXQoKTsNCisgIH0NCisgIHByb3AubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICBtX3BJbXAgPSBJRldMX1Rvb2xUaXA6OkNyZWF0ZSgpOw0KKyAgRldMX0VSUiByZXQgPSAoKElGV0xfVG9vbFRpcCopbV9wSW1wKS0+SW5pdGlhbGl6ZShwcm9wKTsNCisgIGlmIChyZXQgPT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCisgIH0NCisgIHJldHVybiByZXQ7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpHZXRDYXB0aW9uKENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pDQotew0KLSAgICB3c0NhcHRpb24gPSBtX3Rvb2x0aXBEYXRhLm1fd3NDYXB0aW9uOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1Rvb2xUaXA6OkdldENhcHRpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgew0KKyAgd3NDYXB0aW9uID0gbV90b29sdGlwRGF0YS5tX3dzQ2FwdGlvbjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1Rvb2xUaXA6OlNldENhcHRpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhcHRpb24pDQotew0KLSAgICBtX3Rvb2x0aXBEYXRhLm1fd3NDYXB0aW9uID0gd3NDYXB0aW9uOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1Rvb2xUaXA6OlNldENhcHRpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhcHRpb24pIHsNCisgIG1fdG9vbHRpcERhdGEubV93c0NhcHRpb24gPSB3c0NhcHRpb247DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLWludDMyX3QgQ0ZXTF9Ub29sVGlwOjpHZXRJbml0aWFsRGVsYXkoKQ0KLXsNCi0gICAgcmV0dXJuIG1fdG9vbHRpcERhdGEubV9uSW5pdERlbGF5VGltZTsNCitpbnQzMl90IENGV0xfVG9vbFRpcDo6R2V0SW5pdGlhbERlbGF5KCkgew0KKyAgcmV0dXJuIG1fdG9vbHRpcERhdGEubV9uSW5pdERlbGF5VGltZTsNCiB9DQotaW50MzJfdCBDRldMX1Rvb2xUaXA6OlNldEluaXRpYWxEZWxheShpbnQzMl90IG5EZWxheVRpbWUpDQotew0KLSAgICBtX3Rvb2x0aXBEYXRhLm1fbkluaXREZWxheVRpbWUgPSBuRGVsYXlUaW1lOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQoraW50MzJfdCBDRldMX1Rvb2xUaXA6OlNldEluaXRpYWxEZWxheShpbnQzMl90IG5EZWxheVRpbWUpIHsNCisgIG1fdG9vbHRpcERhdGEubV9uSW5pdERlbGF5VGltZSA9IG5EZWxheVRpbWU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLWludDMyX3QgQ0ZXTF9Ub29sVGlwOjpHZXRBdXRvUG9wRGVsYXkoKQ0KLXsNCi0gICAgcmV0dXJuIG1fdG9vbHRpcERhdGEubV9uQXV0b1BvcERlbGF5VGltZTsNCitpbnQzMl90IENGV0xfVG9vbFRpcDo6R2V0QXV0b1BvcERlbGF5KCkgew0KKyAgcmV0dXJuIG1fdG9vbHRpcERhdGEubV9uQXV0b1BvcERlbGF5VGltZTsNCiB9DQotaW50MzJfdCBDRldMX1Rvb2xUaXA6OlNldEF1dG9Qb3BEZWxheShpbnQzMl90IG5EZWxheVRpbWUpDQotew0KLSAgICBtX3Rvb2x0aXBEYXRhLm1fbkF1dG9Qb3BEZWxheVRpbWUgPSBuRGVsYXlUaW1lOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQoraW50MzJfdCBDRldMX1Rvb2xUaXA6OlNldEF1dG9Qb3BEZWxheShpbnQzMl90IG5EZWxheVRpbWUpIHsNCisgIG1fdG9vbHRpcERhdGEubV9uQXV0b1BvcERlbGF5VGltZSA9IG5EZWxheVRpbWU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUNGWF9ESUJpdG1hcCogQ0ZXTF9Ub29sVGlwOjpHZXRUb29sVGlwSWNvbigpDQotew0KLSAgICByZXR1cm4gbV90b29sdGlwRGF0YS5tX3BCaXRtYXA7DQorQ0ZYX0RJQml0bWFwKiBDRldMX1Rvb2xUaXA6OkdldFRvb2xUaXBJY29uKCkgew0KKyAgcmV0dXJuIG1fdG9vbHRpcERhdGEubV9wQml0bWFwOw0KIH0NCi1GV0xfRVJSIENGV0xfVG9vbFRpcDo6U2V0VG9vbFRpcEljb24oQ0ZYX0RJQml0bWFwICpwQml0bWFwKQ0KLXsNCi0gICAgbV90b29sdGlwRGF0YS5tX3BCaXRtYXAgPSBwQml0bWFwOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1Rvb2xUaXA6OlNldFRvb2xUaXBJY29uKENGWF9ESUJpdG1hcCogcEJpdG1hcCkgew0KKyAgbV90b29sdGlwRGF0YS5tX3BCaXRtYXAgPSBwQml0bWFwOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRlhfU2l6ZUYgQ0ZXTF9Ub29sVGlwOjpHZXRUb29sVGlwSWNvblNpemUoKQ0KLXsNCi0gICAgcmV0dXJuIG1fdG9vbHRpcERhdGEubV9mSWNvblNpemU7DQorQ0ZYX1NpemVGIENGV0xfVG9vbFRpcDo6R2V0VG9vbFRpcEljb25TaXplKCkgew0KKyAgcmV0dXJuIG1fdG9vbHRpcERhdGEubV9mSWNvblNpemU7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpTZXRUb29sVGlwSWNvblNpemUoQ0ZYX1NpemVGIGZTaXplKQ0KLXsNCi0gICAgbV90b29sdGlwRGF0YS5tX2ZJY29uU2l6ZSA9IGZTaXplOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1Rvb2xUaXA6OlNldFRvb2xUaXBJY29uU2l6ZShDRlhfU2l6ZUYgZlNpemUpIHsNCisgIG1fdG9vbHRpcERhdGEubV9mSWNvblNpemUgPSBmU2l6ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1Rvb2xUaXA6OlNldEFuY2hvcihjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yKQ0KLXsNCi0gICAgcmV0dXJuICgoSUZXTF9Ub29sVGlwKiltX3BJbXApLT5TZXRBbmNob3IocnRBbmNob3IpOw0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpTZXRBbmNob3IoY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvcikgew0KKyAgcmV0dXJuICgoSUZXTF9Ub29sVGlwKiltX3BJbXApLT5TZXRBbmNob3IocnRBbmNob3IpOw0KIH0NCi1GV0xfRVJSIENGV0xfVG9vbFRpcDo6U2hvdygpDQotew0KLSAgICByZXR1cm4gKChJRldMX1Rvb2xUaXAqKW1fcEltcCktPlNob3coKTsNCitGV0xfRVJSIENGV0xfVG9vbFRpcDo6U2hvdygpIHsNCisgIHJldHVybiAoKElGV0xfVG9vbFRpcCopbV9wSW1wKS0+U2hvdygpOw0KIH0NCi1GV0xfRVJSIENGV0xfVG9vbFRpcDo6SGlkZSgpDQotew0KLSAgICByZXR1cm4gKChJRldMX1Rvb2xUaXAqKW1fcEltcCktPkhpZGUoKTsNCitGV0xfRVJSIENGV0xfVG9vbFRpcDo6SGlkZSgpIHsNCisgIHJldHVybiAoKElGV0xfVG9vbFRpcCopbV9wSW1wKS0+SGlkZSgpOw0KIH0NCi1DRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcCgpDQotew0KK0NGV0xfVG9vbFRpcDo6Q0ZXTF9Ub29sVGlwKCkge30NCitDRldMX1Rvb2xUaXA6On5DRldMX1Rvb2xUaXAoKSB7fQ0KK0NGV0xfVG9vbFRpcDo6Q0ZXTF9Ub29sVGlwRFA6OkNGV0xfVG9vbFRpcERQKCkgOiBtX3BCaXRtYXAoTlVMTCkgew0KKyAgbV93c0NhcHRpb24gPSBMIiI7DQorICBtX25Jbml0RGVsYXlUaW1lID0gNTAwOw0KKyAgbV9uQXV0b1BvcERlbGF5VGltZSA9IDUwMDAwOw0KKyAgbV9mSWNvblNpemUuU2V0KDAuMCwgMC4wKTsNCisgIG1fZkFuY2hvci5TZXQoMC4wLCAwLjAsIDAuMCwgMC4wKTsNCiB9DQotQ0ZXTF9Ub29sVGlwOjp+Q0ZXTF9Ub29sVGlwKCkNCi17DQorRldMX0VSUiBDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcERQOjpHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKSB7DQorICB3c0NhcHRpb24gPSBtX3dzQ2FwdGlvbjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotQ0ZXTF9Ub29sVGlwOjpDRldMX1Rvb2xUaXBEUDo6Q0ZXTF9Ub29sVGlwRFAoKQ0KLSAgICA6IG1fcEJpdG1hcChOVUxMKQ0KLXsNCi0gICAgbV93c0NhcHRpb24gPSBMIiI7DQotICAgIG1fbkluaXREZWxheVRpbWUgPSA1MDA7DQotICAgIG1fbkF1dG9Qb3BEZWxheVRpbWUgPSA1MDAwMDsNCi0gICAgbV9mSWNvblNpemUuU2V0KCAwLjAsIDAuMCk7DQotICAgIG1fZkFuY2hvci5TZXQoIDAuMCwgMC4wLCAwLjAsIDAuMCk7DQoraW50MzJfdCBDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcERQOjpHZXRJbml0aWFsRGVsYXkoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX25Jbml0RGVsYXlUaW1lOw0KIH0NCi1GV0xfRVJSIENGV0xfVG9vbFRpcDo6Q0ZXTF9Ub29sVGlwRFA6OkdldENhcHRpb24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c0NhcHRpb24pDQotew0KLSAgICB3c0NhcHRpb24gPSBtX3dzQ2FwdGlvbjsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK2ludDMyX3QgQ0ZXTF9Ub29sVGlwOjpDRldMX1Rvb2xUaXBEUDo6R2V0QXV0b1BvcERlbGF5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9uQXV0b1BvcERlbGF5VGltZTsNCiB9DQotaW50MzJfdCBDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcERQOjpHZXRJbml0aWFsRGVsYXkoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gbV9uSW5pdERlbGF5VGltZTsNCitDRlhfRElCaXRtYXAqIENGV0xfVG9vbFRpcDo6Q0ZXTF9Ub29sVGlwRFA6OkdldFRvb2xUaXBJY29uKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fcEJpdG1hcDsNCiB9DQotaW50MzJfdCBDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcERQOjpHZXRBdXRvUG9wRGVsYXkoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gbV9uQXV0b1BvcERlbGF5VGltZTsNCitDRlhfU2l6ZUYgQ0ZXTF9Ub29sVGlwOjpDRldMX1Rvb2xUaXBEUDo6R2V0VG9vbFRpcEljb25TaXplKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fZkljb25TaXplOw0KIH0NCi1DRlhfRElCaXRtYXAqIENGV0xfVG9vbFRpcDo6Q0ZXTF9Ub29sVGlwRFA6OkdldFRvb2xUaXBJY29uKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIG1fcEJpdG1hcDsNCi19DQotQ0ZYX1NpemVGIENGV0xfVG9vbFRpcDo6Q0ZXTF9Ub29sVGlwRFA6OkdldFRvb2xUaXBJY29uU2l6ZShJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBtX2ZJY29uU2l6ZTsNCi19DQotQ0ZYX1JlY3RGIENGV0xfVG9vbFRpcDo6Q0ZXTF9Ub29sVGlwRFA6OkdldEFuY2hvcigpDQotew0KLSAgICByZXR1cm4gbV9mQW5jaG9yOw0KK0NGWF9SZWN0RiBDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcERQOjpHZXRBbmNob3IoKSB7DQorICByZXR1cm4gbV9mQW5jaG9yOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvd2lkZ2V0LmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC93aWRnZXQuY3BwCmluZGV4IGJlNmM3MjguLjg1YmI3MTAgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC93aWRnZXQuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC93aWRnZXQuY3BwCkBAIC0xMCwzMzUgKzEwLDI5NiBAQAogI2luY2x1ZGUgIi4uL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KICNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KICNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oIg0KLUlGV0xfV2lkZ2V0KiBDRldMX1dpZGdldDo6R2V0V2lkZ2V0KCkNCi17DQotICAgIHJldHVybiBtX3BJbXA7DQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0OjpHZXRXaWRnZXQoKSB7DQorICByZXR1cm4gbV9wSW1wOw0KIH0NCi1GWF9EV09SRCBDRldMX1dpZGdldDo6UmVsZWFzZSgpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQotICAgIEZYX0RXT1JEIGR3UmVmID0gbV9wSW1wLT5HZXRSZWZDb3VudCgpOw0KLSAgICBpZiAoZHdSZWYgPT0gMSkgew0KLSAgICAgICAgbV9wSW1wLT5GaW5hbGl6ZSgpOw0KLSAgICB9DQotICAgIG1fcEltcC0+UmVsZWFzZSgpOw0KLSAgICBpZiAoZHdSZWYgPT0gMSkgew0KLSAgICAgICAgbV9wSW1wID0gTlVMTDsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHJldHVybiBkd1JlZiAtIDE7DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXQ6OlJlbGVhc2UoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQorICBGWF9EV09SRCBkd1JlZiA9IG1fcEltcC0+R2V0UmVmQ291bnQoKTsNCisgIGlmIChkd1JlZiA9PSAxKSB7DQorICAgIG1fcEltcC0+RmluYWxpemUoKTsNCisgIH0NCisgIG1fcEltcC0+UmVsZWFzZSgpOw0KKyAgaWYgKGR3UmVmID09IDEpIHsNCisgICAgbV9wSW1wID0gTlVMTDsNCisgICAgZGVsZXRlIHRoaXM7DQorICB9DQorICByZXR1cm4gZHdSZWYgLSAxOw0KIH0NCi1DRldMX1dpZGdldCogQ0ZXTF9XaWRnZXQ6OlJldGFpbigpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgTlVMTCk7DQotICAgIG1fcEltcC0+UmV0YWluKCk7DQotICAgIHJldHVybiB0aGlzOw0KK0NGV0xfV2lkZ2V0KiBDRldMX1dpZGdldDo6UmV0YWluKCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIE5VTEwpOw0KKyAgbV9wSW1wLT5SZXRhaW4oKTsNCisgIHJldHVybiB0aGlzOw0KIH0NCi1GWF9EV09SRCBDRldMX1dpZGdldDo6R2V0UmVmQ291bnQoKSBjb25zdA0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDEpOw0KLSAgICByZXR1cm4gbV9wSW1wLT5HZXRSZWZDb3VudCgpOw0KK0ZYX0RXT1JEIENGV0xfV2lkZ2V0OjpHZXRSZWZDb3VudCgpIGNvbnN0IHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAxKTsNCisgIHJldHVybiBtX3BJbXAtPkdldFJlZkNvdW50KCk7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyAmd3NDbGFzcykgY29uc3QNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gbV9wSW1wLT5HZXRDbGFzc05hbWUod3NDbGFzcyk7DQorRldMX0VSUiBDRldMX1dpZGdldDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBtX3BJbXAtPkdldENsYXNzTmFtZSh3c0NsYXNzKTsNCiB9DQotRlhfRFdPUkQgQ0ZXTF9XaWRnZXQ6OkdldENsYXNzSUQoKSBjb25zdA0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KLSAgICByZXR1cm4gbV9wSW1wLT5HZXRDbGFzc0lEKCk7DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXQ6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQorICByZXR1cm4gbV9wSW1wLT5HZXRDbGFzc0lEKCk7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9XaWRnZXQ6OklzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdA0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCi0gICAgcmV0dXJuIG1fcEltcC0+SXNJbnN0YW5jZSh3c0NsYXNzKTsNCitGWF9CT09MIENGV0xfV2lkZ2V0OjpJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Qgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZBTFNFKTsNCisgIHJldHVybiBtX3BJbXAtPklzSW5zdGFuY2Uod3NDbGFzcyk7DQogfQ0KIHN0YXRpYyB2b2lkKiBnc19wRldMV2lkZ2V0ID0gKHZvaWQqKUZYQlNUUl9JRCgnbCcsICdpJywgJ2cnLCAndCcpOw0KLUZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICpwUHJvcGVydGllcyApDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuIG1fcEltcC0+U2V0UHJpdmF0ZURhdGEoZ3NfcEZXTFdpZGdldCwgdGhpcywgTlVMTCk7DQorRldMX0VSUiBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBtX3BJbXAtPlNldFByaXZhdGVEYXRhKGdzX3BGV0xXaWRnZXQsIHRoaXMsIE5VTEwpOw0KIH0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0OjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBtX3BJbXAtPkdldFdpZGdldFJlY3QocmVjdCwgYkF1dG9TaXplKTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuIG1fcEltcC0+R2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpOw0KIH0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0OjpHZXRHbG9iYWxSZWN0KENGWF9SZWN0RiAmcmVjdCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gbV9wSW1wLT5HZXRHbG9iYWxSZWN0KHJlY3QpOw0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OkdldEdsb2JhbFJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBtX3BJbXAtPkdldEdsb2JhbFJlY3QocmVjdCk7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBtX3BJbXAtPlNldFdpZGdldFJlY3QocmVjdCk7DQorRldMX0VSUiBDRldMX1dpZGdldDo6U2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuIG1fcEltcC0+U2V0V2lkZ2V0UmVjdChyZWN0KTsNCiB9DQotRldMX0VSUiBDRldMX1dpZGdldDo6R2V0Q2xpZW50UmVjdChDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuIG1fcEltcC0+R2V0Q2xpZW50UmVjdChyZWN0KTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpHZXRDbGllbnRSZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gbV9wSW1wLT5HZXRDbGllbnRSZWN0KHJlY3QpOw0KIH0NCi1DRldMX1dpZGdldCogQ0ZXTF9XaWRnZXQ6OkdldFBhcmVudCgpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgTlVMTCk7DQotICAgIElGV0xfV2lkZ2V0ICpwYXJlbnQgPSBtX3BJbXAtPkdldFBhcmVudCgpOw0KLSAgICBpZiAocGFyZW50KSB7DQotICAgICAgICByZXR1cm4gKENGV0xfV2lkZ2V0KilwYXJlbnQtPkdldFByaXZhdGVEYXRhKGdzX3BGV0xXaWRnZXQpOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KK0NGV0xfV2lkZ2V0KiBDRldMX1dpZGdldDo6R2V0UGFyZW50KCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIE5VTEwpOw0KKyAgSUZXTF9XaWRnZXQqIHBhcmVudCA9IG1fcEltcC0+R2V0UGFyZW50KCk7DQorICBpZiAocGFyZW50KSB7DQorICAgIHJldHVybiAoQ0ZXTF9XaWRnZXQqKXBhcmVudC0+R2V0UHJpdmF0ZURhdGEoZ3NfcEZXTFdpZGdldCk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotRldMX0VSUglDRldMX1dpZGdldDo6U2V0UGFyZW50KENGV0xfV2lkZ2V0ICpwUGFyZW50KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBtX3BJbXAtPlNldFBhcmVudChwUGFyZW50ID8gcFBhcmVudC0+R2V0V2lkZ2V0KCkgOiBOVUxMKTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpTZXRQYXJlbnQoQ0ZXTF9XaWRnZXQqIHBQYXJlbnQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuIG1fcEltcC0+U2V0UGFyZW50KHBQYXJlbnQgPyBwUGFyZW50LT5HZXRXaWRnZXQoKSA6IE5VTEwpOw0KIH0NCi1DRldMX1dpZGdldCogQ0ZXTF9XaWRnZXQ6OkdldE93bmVyKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBOVUxMKTsNCi0gICAgcmV0dXJuIE5VTEw7DQorQ0ZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0OjpHZXRPd25lcigpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBOVUxMKTsNCisgIHJldHVybiBOVUxMOw0KIH0NCi1GV0xfRVJSCUNGV0xfV2lkZ2V0OjpTZXRPd25lcihDRldMX1dpZGdldCAqcE93bmVyKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpTZXRPd25lcihDRldMX1dpZGdldCogcE93bmVyKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRFdPUkQgQ0ZXTF9XaWRnZXQ6OkdldFN0eWxlcygpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQotICAgIHJldHVybiBtX3BJbXAtPkdldFN0eWxlcygpOw0KK0ZYX0RXT1JEIENGV0xfV2lkZ2V0OjpHZXRTdHlsZXMoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgMCk7DQorICByZXR1cm4gbV9wSW1wLT5HZXRTdHlsZXMoKTsNCiB9DQotRldMX0VSUglDRldMX1dpZGdldDo6TW9kaWZ5U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzQWRkZWQsIEZYX0RXT1JEIGR3U3R5bGVzUmVtb3ZlZCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gbV9wSW1wLT5Nb2RpZnlTdHlsZXMoZHdTdHlsZXNBZGRlZCwgZHdTdHlsZXNSZW1vdmVkKTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpNb2RpZnlTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXNBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNSZW1vdmVkKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBtX3BJbXAtPk1vZGlmeVN0eWxlcyhkd1N0eWxlc0FkZGVkLCBkd1N0eWxlc1JlbW92ZWQpOw0KIH0NCi1GWF9EV09SRCBDRldMX1dpZGdldDo6R2V0U3R5bGVzRXgoKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KLSAgICByZXR1cm4gbV9wSW1wLT5HZXRTdHlsZXNFeCgpOw0KK0ZYX0RXT1JEIENGV0xfV2lkZ2V0OjpHZXRTdHlsZXNFeCgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCisgIHJldHVybiBtX3BJbXAtPkdldFN0eWxlc0V4KCk7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXQ6Ok1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpDQotew0KLSAgICByZXR1cm4gbV9wSW1wLT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpIHsNCisgIHJldHVybiBtX3BJbXAtPk1vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KIH0NCi1GWF9EV09SRCBDRldMX1dpZGdldDo6R2V0U3RhdGVzKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gbV9wSW1wLT5HZXRTdGF0ZXMoKTsNCitGWF9EV09SRCBDRldMX1dpZGdldDo6R2V0U3RhdGVzKCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gbV9wSW1wLT5HZXRTdGF0ZXMoKTsNCiB9DQotRldMX0VSUglDRldMX1dpZGdldDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBtX3BJbXAtPlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorRldMX0VSUiBDRldMX1dpZGdldDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuIG1fcEltcC0+U2V0U3RhdGVzKGR3U3RhdGVzLCBiU2V0KTsNCiB9DQotRldMX0VSUglDRldMX1dpZGdldDo6U2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkLCB2b2lkKiBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuIG1fcEltcC0+U2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkLCBwRGF0YSwgY2FsbGJhY2spOw0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlNldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gbV9wSW1wLT5TZXRQcml2YXRlRGF0YShtb2R1bGVfaWQsIHBEYXRhLCBjYWxsYmFjayk7DQogfQ0KLXZvaWQqIENGV0xfV2lkZ2V0OjpHZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgTlVMTCk7DQotICAgIHJldHVybiBtX3BJbXAtPkdldFByaXZhdGVEYXRhKG1vZHVsZV9pZCk7DQordm9pZCogQ0ZXTF9XaWRnZXQ6OkdldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIE5VTEwpOw0KKyAgcmV0dXJuIG1fcEltcC0+R2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkKTsNCiB9DQotRldMX0VSUglDRldMX1dpZGdldDo6VXBkYXRlKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gbV9wSW1wLT5VcGRhdGUoKTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpVcGRhdGUoKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBtX3BJbXAtPlVwZGF0ZSgpOw0KIH0NCi1GV0xfRVJSCUNGV0xfV2lkZ2V0OjpMb2NrVXBkYXRlKCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICByZXR1cm4gbV9wSW1wLT5Mb2NrVXBkYXRlKCk7DQorRldMX0VSUiBDRldMX1dpZGdldDo6TG9ja1VwZGF0ZSgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuIG1fcEltcC0+TG9ja1VwZGF0ZSgpOw0KIH0NCi1GV0xfRVJSCUNGV0xfV2lkZ2V0OjpVbmxvY2tVcGRhdGUoKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBtX3BJbXAtPlVubG9ja1VwZGF0ZSgpOw0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlVubG9ja1VwZGF0ZSgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuIG1fcEltcC0+VW5sb2NrVXBkYXRlKCk7DQogfQ0KLUZYX0RXT1JEIENGV0xfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCAwKTsNCi0gICAgcmV0dXJuIG1fcEltcC0+SGl0VGVzdChmeCwgZnkpOw0KK0ZYX0RXT1JEIENGV0xfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIDApOw0KKyAgcmV0dXJuIG1fcEltcC0+SGl0VGVzdChmeCwgZnkpOw0KIH0NCi1GV0xfRVJSCUNGV0xfV2lkZ2V0OjpUcmFuc2Zvcm1UbyhDRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuIG1fcEltcC0+VHJhbnNmb3JtVG8ocFdpZGdldCA/IHBXaWRnZXQtPkdldFdpZGdldCgpIDogTlVMTCwgZngsIGZ5KTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpUcmFuc2Zvcm1UbyhDRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZ5KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBtX3BJbXAtPlRyYW5zZm9ybVRvKHBXaWRnZXQgPyBwV2lkZ2V0LT5HZXRXaWRnZXQoKSA6IE5VTEwsIGZ4LCBmeSk7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXQ6OlRyYW5zZm9ybVRvKENGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBtX3BJbXAtPlRyYW5zZm9ybVRvKHBXaWRnZXQgPyBwV2lkZ2V0LT5HZXRXaWRnZXQoKSA6IE5VTEwsIHJ0KTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpUcmFuc2Zvcm1UbyhDRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiBydCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gbV9wSW1wLT5UcmFuc2Zvcm1UbyhwV2lkZ2V0ID8gcFdpZGdldC0+R2V0V2lkZ2V0KCkgOiBOVUxMLCBydCk7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXQ6OkdldE1hdHJpeChDRlhfTWF0cml4ICZtYXRyaXgsIEZYX0JPT0wgYkdsb2JhbCApDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgcmV0dXJuIG1fcEltcC0+R2V0TWF0cml4KG1hdHJpeCwgYkdsb2JhbCk7DQorRldMX0VSUiBDRldMX1dpZGdldDo6R2V0TWF0cml4KENGWF9NYXRyaXgmIG1hdHJpeCwgRlhfQk9PTCBiR2xvYmFsKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIHJldHVybiBtX3BJbXAtPkdldE1hdHJpeChtYXRyaXgsIGJHbG9iYWwpOw0KIH0NCi1GV0xfRVJSCUNGV0xfV2lkZ2V0OjpTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBtX3BJbXAtPlNldE1hdHJpeChtYXRyaXgpOw0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcmV0dXJuIG1fcEltcC0+U2V0TWF0cml4KG1hdHJpeCk7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXQ6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHJldHVybiBtX3BJbXAtPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICByZXR1cm4gbV9wSW1wLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXQ6OkdldFByb3BlcnRpZXMoQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzKQ0KLXsNCi0gICAgcHJvcGVydGllcy5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCi0gICAgcHJvcGVydGllcy5tX3J0V2lkZ2V0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCi0gICAgcHJvcGVydGllcy5tX2R3U3R5bGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlczsNCi0gICAgcHJvcGVydGllcy5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCi0gICAgcHJvcGVydGllcy5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCi0gICAgcHJvcGVydGllcy5tX3BQYXJlbnQgPSBtX3BQcm9wZXJ0aWVzLT5tX3BQYXJlbnQ7DQotICAgIHByb3BlcnRpZXMubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcjsNCi0gICAgcHJvcGVydGllcy5tX3dzV2luZG93Y2xhc3MgPSBtX3BQcm9wZXJ0aWVzLT5tX3dzV2luZG93Y2xhc3M7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpHZXRQcm9wZXJ0aWVzKENGV0xfV2lkZ2V0UHJvcGVydGllcyYgcHJvcGVydGllcykgew0KKyAgcHJvcGVydGllcy5tX2N0bU9uUGFyZW50ID0gbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudDsNCisgIHByb3BlcnRpZXMubV9ydFdpZGdldCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICBwcm9wZXJ0aWVzLm1fZHdTdHlsZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzOw0KKyAgcHJvcGVydGllcy5tX2R3U3R5bGVFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCisgIHByb3BlcnRpZXMubV9kd1N0YXRlcyA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXM7DQorICBwcm9wZXJ0aWVzLm1fcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudDsNCisgIHByb3BlcnRpZXMubV9wT3duZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lcjsNCisgIHByb3BlcnRpZXMubV93c1dpbmRvd2NsYXNzID0gbV9wUHJvcGVydGllcy0+bV93c1dpbmRvd2NsYXNzOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSCUNGV0xfV2lkZ2V0OjpTZXRQcm9wZXJ0aWVzKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyAmcHJvcGVydGllcykNCi17DQotICAgIG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQgPSBwcm9wZXJ0aWVzLm1fY3RtT25QYXJlbnQ7DQotICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQgPSBwcm9wZXJ0aWVzLm1fcnRXaWRnZXQ7DQotICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgPSBwcm9wZXJ0aWVzLm1fZHdTdHlsZXM7DQotICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgPSBwcm9wZXJ0aWVzLm1fZHdTdHlsZUV4ZXM7DQotICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgPSBwcm9wZXJ0aWVzLm1fZHdTdGF0ZXM7DQotICAgIG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudCA9IHByb3BlcnRpZXMubV9wUGFyZW50Ow0KLSAgICBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lciA9IHByb3BlcnRpZXMubV9wT3duZXI7DQotICAgIG1fcFByb3BlcnRpZXMtPm1fd3NXaW5kb3djbGFzcyA9IHByb3BlcnRpZXMubV93c1dpbmRvd2NsYXNzOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorRldMX0VSUiBDRldMX1dpZGdldDo6U2V0UHJvcGVydGllcyhjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMmIHByb3BlcnRpZXMpIHsNCisgIG1fcFByb3BlcnRpZXMtPm1fY3RtT25QYXJlbnQgPSBwcm9wZXJ0aWVzLm1fY3RtT25QYXJlbnQ7DQorICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0ID0gcHJvcGVydGllcy5tX3J0V2lkZ2V0Ow0KKyAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyA9IHByb3BlcnRpZXMubV9kd1N0eWxlczsNCisgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgPSBwcm9wZXJ0aWVzLm1fZHdTdHlsZUV4ZXM7DQorICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzID0gcHJvcGVydGllcy5tX2R3U3RhdGVzOw0KKyAgbV9wUHJvcGVydGllcy0+bV9wUGFyZW50ID0gcHJvcGVydGllcy5tX3BQYXJlbnQ7DQorICBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lciA9IHByb3BlcnRpZXMubV9wT3duZXI7DQorICBtX3BQcm9wZXJ0aWVzLT5tX3dzV2luZG93Y2xhc3MgPSBwcm9wZXJ0aWVzLm1fd3NXaW5kb3djbGFzczsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotSUZXTF9XaWRnZXREZWxlZ2F0ZSogQ0ZXTF9XaWRnZXQ6OlNldERlbGVnYXRlKElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBOVUxMKTsNCi0gICAgbV9wRGVsZWdhdGUgPSBtX3BJbXAtPlNldERlbGVnYXRlKHBEZWxlZ2F0ZSk7DQotICAgIHJldHVybiBtX3BEZWxlZ2F0ZTsNCitJRldMX1dpZGdldERlbGVnYXRlKiBDRldMX1dpZGdldDo6U2V0RGVsZWdhdGUoSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgTlVMTCk7DQorICBtX3BEZWxlZ2F0ZSA9IG1fcEltcC0+U2V0RGVsZWdhdGUocERlbGVnYXRlKTsNCisgIHJldHVybiBtX3BEZWxlZ2F0ZTsNCiB9DQogQ0ZXTF9XaWRnZXQ6OkNGV0xfV2lkZ2V0KCkNCi0gICAgOiBtX3BJbXAoTlVMTCkNCi0gICAgLCBtX3BEZWxlZ2F0ZShOVUxMKQ0KLSAgICAsIG1fcFByb3BlcnRpZXMoTlVMTCkNCi17DQotICAgIG1fcFByb3BlcnRpZXMgPSBGWF9ORVcgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KLSAgICBtX3BXaWRnZXRNZ3IgPSAoQ0ZXTF9XaWRnZXRNZ3IqKUZXTF9HZXRXaWRnZXRNZ3IoKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcFdpZGdldE1nciAhPSBOVUxMKTsNCisgICAgOiBtX3BJbXAoTlVMTCksIG1fcERlbGVnYXRlKE5VTEwpLCBtX3BQcm9wZXJ0aWVzKE5VTEwpIHsNCisgIG1fcFByb3BlcnRpZXMgPSBGWF9ORVcgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KKyAgbV9wV2lkZ2V0TWdyID0gKENGV0xfV2lkZ2V0TWdyKilGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICBGWFNZU19hc3NlcnQobV9wV2lkZ2V0TWdyICE9IE5VTEwpOw0KIH0NCi1DRldMX1dpZGdldDo6fkNGV0xfV2lkZ2V0KCkNCi17DQotICAgIGlmIChtX3BQcm9wZXJ0aWVzKSB7DQotICAgICAgICBkZWxldGUgbV9wUHJvcGVydGllczsNCi0gICAgICAgIG1fcFByb3BlcnRpZXMgPSBOVUxMOw0KK0NGV0xfV2lkZ2V0Ojp+Q0ZXTF9XaWRnZXQoKSB7DQorICBpZiAobV9wUHJvcGVydGllcykgew0KKyAgICBkZWxldGUgbV9wUHJvcGVydGllczsNCisgICAgbV9wUHJvcGVydGllcyA9IE5VTEw7DQorICB9DQorICBpZiAobV9wSW1wKSB7DQorICAgIG1fcEltcC0+RmluYWxpemUoKTsNCisgICAgbV9wSW1wLT5SZWxlYXNlKCk7DQorICAgIG1fcEltcCA9IE5VTEw7DQorICB9DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlJlcGFpbnQoY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBDRlhfUmVjdEYgcmVjdDsNCisgIGlmIChwUmVjdCkgew0KKyAgICByZWN0ID0gKnBSZWN0Ow0KKyAgfSBlbHNlIHsNCisgICAgbV9wSW1wLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICByZWN0LmxlZnQgPSByZWN0LnRvcCA9IDA7DQorICB9DQorICByZXR1cm4gbV9wV2lkZ2V0TWdyLT5SZXBhaW50V2lkZ2V0KG1fcEltcCwgJnJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpTZXRGb2N1cyhGWF9CT09MIGJGb2N1cykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBJRldMX05vdGVUaHJlYWQqIHBUaHJlYWQgPSBtX3BJbXAtPkdldE93bmVyVGhyZWFkKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIElGV0xfTm90ZURyaXZlciogcERyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgaWYgKGJGb2N1cykgew0KKyAgICBwRHJpdmVyLT5TZXRGb2N1cyhtX3BJbXApOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKCgoQ0ZXTF9Ob3RlRHJpdmVyKilwRHJpdmVyKS0+R2V0Rm9jdXMoKSA9PSBtX3BJbXApIHsNCisgICAgICBwRHJpdmVyLT5TZXRGb2N1cyhOVUxMKTsNCiAgICAgfQ0KLSAgICBpZiAobV9wSW1wKSB7DQotICAgICAgICBtX3BJbXAtPkZpbmFsaXplKCk7DQotICAgICAgICBtX3BJbXAtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcEltcCA9IE5VTEw7DQotICAgIH0NCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRldMX0VSUiBDRldMX1dpZGdldDo6UmVwYWludChjb25zdCBDRlhfUmVjdEYgKnBSZWN0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIENGWF9SZWN0RiByZWN0Ow0KLSAgICBpZiAocFJlY3QpIHsNCi0gICAgICAgIHJlY3QgPSAqcFJlY3Q7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BJbXAtPkdldFdpZGdldFJlY3QocmVjdCk7DQotICAgICAgICByZWN0LmxlZnQgPSByZWN0LnRvcCA9IDA7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcFdpZGdldE1nci0+UmVwYWludFdpZGdldChtX3BJbXAsICZyZWN0KTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpTZXRHcmFiKEZYX0JPT0wgYlNldCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBJRldMX05vdGVUaHJlYWQqIHBUaHJlYWQgPSBtX3BJbXAtPkdldE93bmVyVGhyZWFkKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCisgIENGV0xfTm90ZURyaXZlciogcERyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KKyAgcERyaXZlci0+U2V0R3JhYihtX3BJbXAsIGJTZXQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0OjpTZXRGb2N1cyhGWF9CT09MIGJGb2N1cykNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBtX3BJbXAtPkdldE93bmVyVGhyZWFkKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBJRldMX05vdGVEcml2ZXIgKnBEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wSW1wLCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBpZiAoYkZvY3VzKSB7DQotICAgICAgICBwRHJpdmVyLT5TZXRGb2N1cyhtX3BJbXApOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKCgoQ0ZXTF9Ob3RlRHJpdmVyKilwRHJpdmVyKS0+R2V0Rm9jdXMoKSA9PSBtX3BJbXApIHsNCi0gICAgICAgICAgICBwRHJpdmVyLT5TZXRGb2N1cyhOVUxMKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQordm9pZCBDRldMX1dpZGdldDo6UmVnaXN0ZXJFdmVudFRhcmdldChDRldMX1dpZGdldCogcEV2ZW50U291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGaWx0ZXIpIHsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wSW1wKTsNCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IG1fcEltcC0+R2V0T3duZXJUaHJlYWQoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQorICBJRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTm90ZURyaXZlcik7DQorICBJRldMX1dpZGdldCogcEV2ZW50U291cmNlSW1wID0NCisgICAgICAhcEV2ZW50U291cmNlID8gTlVMTCA6IHBFdmVudFNvdXJjZS0+R2V0V2lkZ2V0KCk7DQorICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChHZXRXaWRnZXQoKSwgcEV2ZW50U291cmNlSW1wLCBkd0ZpbHRlcik7DQogfQ0KLUZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlNldEdyYWIoRlhfQk9PTCBiU2V0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIElGV0xfTm90ZVRocmVhZCAqcFRocmVhZCA9IG1fcEltcC0+R2V0T3duZXJUaHJlYWQoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIENGV0xfTm90ZURyaXZlciAqcERyaXZlciA9IChDRldMX05vdGVEcml2ZXIqKXBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQotICAgIHBEcml2ZXItPlNldEdyYWIobV9wSW1wLCBiU2V0KTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK3ZvaWQgQ0ZXTF9XaWRnZXQ6OkRpc3BhdGNoRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKG1fcEltcCk7DQorICBpZiAobV9wSW1wLT5HZXRPdXRlcigpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IG1fcEltcC0+R2V0T3duZXJUaHJlYWQoKTsNCisgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQorICBJRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTm90ZURyaXZlcik7DQorICBwTm90ZURyaXZlci0+U2VuZE5vdGUocEV2ZW50KTsNCiB9DQotdm9pZCBDRldMX1dpZGdldDo6UmVnaXN0ZXJFdmVudFRhcmdldChDRldMX1dpZGdldCAqcEV2ZW50U291cmNlICwgRlhfRFdPUkQgZHdGaWx0ZXIgKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChtX3BJbXApOw0KLSAgICBJRldMX05vdGVUaHJlYWQgKnBUaHJlYWQgPSBtX3BJbXAtPkdldE93bmVyVGhyZWFkKCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFRocmVhZCk7DQotICAgIElGV0xfTm90ZURyaXZlciAqcE5vdGVEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocE5vdGVEcml2ZXIpOw0KLSAgICBJRldMX1dpZGdldCAqcEV2ZW50U291cmNlSW1wID0gIXBFdmVudFNvdXJjZSA/IE5VTEwgOiBwRXZlbnRTb3VyY2UtPkdldFdpZGdldCgpOw0KLSAgICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChHZXRXaWRnZXQoKSwgcEV2ZW50U291cmNlSW1wLCBkd0ZpbHRlcik7DQorI2RlZmluZSBGV0xfV0dUX0NhbGNIZWlnaHQgMjA0OA0KKyNkZWZpbmUgRldMX1dHVF9DYWxjV2lkdGggMjA0OA0KKyNkZWZpbmUgRldMX1dHVF9DYWxjTXVsdGlMaW5lRGVmV2lkdGggMTIwLjBmDQorQ0ZYX1NpemVGIENGV0xfV2lkZ2V0OjpDYWxjVGV4dFNpemUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNdWx0aUxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGluZVdpZHRoKSB7DQorICBDRlhfU2l6ZUYgc3o7DQorICBzei5TZXQoMCwgMCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcEltcCwgc3opOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BJbXAtPkdldFRoZW1lUHJvdmlkZXIoKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFRoZW1lLCBzeik7DQorICBDRldMX1RoZW1lVGV4dCBjYWxQYXJ0Ow0KKyAgY2FsUGFydC5tX3BXaWRnZXQgPSBtX3BJbXA7DQorICBjYWxQYXJ0Lm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgY2FsUGFydC5tX2R3VFRPU3R5bGVzID0NCisgICAgICBiTXVsdGlMaW5lID8gRkRFX1RUT1NUWUxFX0xpbmVXcmFwIDogRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICBjYWxQYXJ0Lm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BMZWZ0Ow0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICBGWF9GTE9BVCBmV2lkdGggPSBiTXVsdGlMaW5lDQorICAgICAgICAgICAgICAgICAgICAgICAgPyAoaUxpbmVXaWR0aCA+IDAgPyAoRlhfRkxPQVQpaUxpbmVXaWR0aA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMX1dHVF9DYWxjTXVsdGlMaW5lRGVmV2lkdGgpDQorICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xfV0dUX0NhbGNXaWR0aDsNCisgIHJlY3QuU2V0KDAsIDAsIGZXaWR0aCwgRldMX1dHVF9DYWxjSGVpZ2h0KTsNCisgIHBUaGVtZS0+Q2FsY1RleHRSZWN0KCZjYWxQYXJ0LCByZWN0KTsNCisgIHN6LnggPSByZWN0LndpZHRoOw0KKyAgc3oueSA9IHJlY3QuaGVpZ2h0Ow0KKyAgcmV0dXJuIHN6Ow0KIH0NCi12b2lkIENGV0xfV2lkZ2V0OjpEaXNwYXRjaEV2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCi17DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwobV9wSW1wKTsNCi0gICAgaWYgKG1fcEltcC0+R2V0T3V0ZXIoKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElGV0xfTm90ZVRocmVhZCAqcFRocmVhZCA9IG1fcEltcC0+R2V0T3duZXJUaHJlYWQoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwVGhyZWFkKTsNCi0gICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwTm90ZURyaXZlcik7DQotICAgIHBOb3RlRHJpdmVyLT5TZW5kTm90ZShwRXZlbnQpOw0KK0NGV0xfV2lkZ2V0RGVsZWdhdGU6OkNGV0xfV2lkZ2V0RGVsZWdhdGUoKSB7fQ0KK0NGV0xfV2lkZ2V0RGVsZWdhdGU6On5DRldMX1dpZGdldERlbGVnYXRlKCkge30NCitpbnQzMl90IENGV0xfV2lkZ2V0RGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgcmV0dXJuIDE7DQogfQ0KLSNkZWZpbmUgRldMX1dHVF9DYWxjSGVpZ2h0CQkJCTIwNDgNCi0jZGVmaW5lIEZXTF9XR1RfQ2FsY1dpZHRoCQkJCTIwNDgNCi0jZGVmaW5lIEZXTF9XR1RfQ2FsY011bHRpTGluZURlZldpZHRoCTEyMC4wZg0KLUNGWF9TaXplRiBDRldMX1dpZGdldDo6Q2FsY1RleHRTaXplKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIEZYX0JPT0wgYk11bHRpTGluZSAsIGludDMyX3QgaUxpbmVXaWR0aCApDQotew0KLSAgICBDRlhfU2l6ZUYgc3o7DQotICAgIHN6LlNldCgwLCAwKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BJbXAsIHN6KTsNCi0gICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBtX3BJbXAtPkdldFRoZW1lUHJvdmlkZXIoKTsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwVGhlbWUsIHN6KTsNCi0gICAgQ0ZXTF9UaGVtZVRleHQgY2FsUGFydDsNCi0gICAgY2FsUGFydC5tX3BXaWRnZXQgPSBtX3BJbXA7DQotICAgIGNhbFBhcnQubV93c1RleHQgPSB3c1RleHQ7DQotICAgIGNhbFBhcnQubV9kd1RUT1N0eWxlcyA9IGJNdWx0aUxpbmUgPyBGREVfVFRPU1RZTEVfTGluZVdyYXAgOiBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCi0gICAgY2FsUGFydC5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfVG9wTGVmdDsNCi0gICAgQ0ZYX1JlY3RGIHJlY3Q7DQotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IGJNdWx0aUxpbmUgPw0KLSAgICAgICAgICAgICAgICAgICAgICAoaUxpbmVXaWR0aCA+IDAgPyAoRlhfRkxPQVQpaUxpbmVXaWR0aCA6IEZXTF9XR1RfQ2FsY011bHRpTGluZURlZldpZHRoKSA6DQotICAgICAgICAgICAgICAgICAgICAgIEZXTF9XR1RfQ2FsY1dpZHRoOw0KLSAgICByZWN0LlNldCgwLCAwLCBmV2lkdGgsIEZXTF9XR1RfQ2FsY0hlaWdodCk7DQotICAgIHBUaGVtZS0+Q2FsY1RleHRSZWN0KCZjYWxQYXJ0LCByZWN0KTsNCi0gICAgc3oueCA9IHJlY3Qud2lkdGg7DQotICAgIHN6LnkgPSByZWN0LmhlaWdodDsNCi0gICAgcmV0dXJuIHN6Ow0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXREZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUNGV0xfV2lkZ2V0RGVsZWdhdGU6OkNGV0xfV2lkZ2V0RGVsZWdhdGUoKQ0KLXsNCi19DQotQ0ZXTF9XaWRnZXREZWxlZ2F0ZTo6fkNGV0xfV2lkZ2V0RGVsZWdhdGUoKQ0KLXsNCi19DQotaW50MzJfdCBDRldMX1dpZGdldERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICByZXR1cm4gMTsNCi19DQotRldMX0VSUiBDRldMX1dpZGdldERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ0ZXTF9XaWRnZXREZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENGV0xfV2lkZ2V0RGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9iYXJjb2RldHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2JhcmNvZGV0cC5jcHAKaW5kZXggODZiYmY5Mi4uZmE5Y2VkMCAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2JhcmNvZGV0cC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2JhcmNvZGV0cC5jcHAKQEAgLTUsMzUgKzUsMzAgQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQogDQogI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQotQ0ZXTF9CYXJjb2RlVFA6OkNGV0xfQmFyY29kZVRQKCkNCi17DQorQ0ZXTF9CYXJjb2RlVFA6OkNGV0xfQmFyY29kZVRQKCkge30NCitDRldMX0JhcmNvZGVUUDo6fkNGV0xfQmFyY29kZVRQKCkge30NCitGWF9CT09MIENGV0xfQmFyY29kZVRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9CYXJjb2RlOw0KIH0NCi1DRldMX0JhcmNvZGVUUDo6fkNGV0xfQmFyY29kZVRQKCkNCi17DQotfQ0KLUZYX0JPT0wJQ0ZXTF9CYXJjb2RlVFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCi0gICAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0JhcmNvZGU7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9CYXJjb2RlVFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQotICAgIHN3aXRjaChwUGFyYW1zLT5tX2lQYXJ0KSB7DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0JDRF9Cb3JkZXI6IHsNCi0gICAgICAgICAgICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0JDRF9FZGdlOiB7DQotICAgICAgICAgICAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfQkNEX0JhY2tncm91bmQ6IHsNCi0gICAgICAgICAgICAgICAgRmlsbEJhY2tncm91bmQocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCitGWF9CT09MIENGV0xfQmFyY29kZVRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgY2FzZSBGV0xfUEFSVF9CQ0RfQm9yZGVyOiB7DQorICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIEZXTF9QQVJUX0JDRF9FZGdlOiB7DQorICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksDQorICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfQkNEX0JhY2tncm91bmQ6IHsNCisgICAgICBGaWxsQmFja2dyb3VuZChwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDoge30NCisgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvY2FyZXR0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvY2FyZXR0cC5jcHAKaW5kZXggYjMzYTk3ZC4uYzc2MDJiMCAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NhcmV0dHAuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9jYXJldHRwLmNwcApAQCAtNSwzOSArNSwzOCBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCi1DRldMX0NhcmV0VFA6OkNGV0xfQ2FyZXRUUCgpDQotew0KK0NGV0xfQ2FyZXRUUDo6Q0ZXTF9DYXJldFRQKCkge30NCitDRldMX0NhcmV0VFA6On5DRldMX0NhcmV0VFAoKSB7fQ0KK0ZYX0JPT0wgQ0ZXTF9DYXJldFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9DYXJldDsNCiB9DQotQ0ZXTF9DYXJldFRQOjp+Q0ZXTF9DYXJldFRQKCkNCi17DQotfQ0KLUZYX0JPT0wJQ0ZXTF9DYXJldFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGQUxTRSk7DQotICAgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9DYXJldDsNCi19DQotRlhfQk9PTAlDRldMX0NhcmV0VFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQotICAgIHN3aXRjaChwUGFyYW1zLT5tX2lQYXJ0KSB7DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0NBVF9CYWNrZ3JvdW5kOiB7DQotICAgICAgICAgICAgICAgIGlmICghKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NBVF9IaWdodExpZ2h0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRHJhd0NhcmV0QksocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fZHdTdGF0ZXMsICYocFBhcmFtcy0+bV9ydFBhcnQpLCAoQ0ZYX0NvbG9yICopcFBhcmFtcy0+bV9wRGF0YSwgJihwUGFyYW1zLT5tX21hdHJpeCkpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQorRlhfQk9PTCBDRldMX0NhcmV0VFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYXJhbXMsIEZBTFNFKTsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICBjYXNlIEZXTF9QQVJUX0NBVF9CYWNrZ3JvdW5kOiB7DQorICAgICAgaWYgKCEocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgRHJhd0NhcmV0QksocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fZHdTdGF0ZXMsDQorICAgICAgICAgICAgICAgICAgJihwUGFyYW1zLT5tX3J0UGFydCksIChDRlhfQ29sb3IqKXBQYXJhbXMtPm1fcERhdGEsDQorICAgICAgICAgICAgICAgICAgJihwUGFyYW1zLT5tX21hdHJpeCkpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ0ZXTF9DYXJldFRQOjpEcmF3Q2FyZXRCSyhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfRFdPUkQgZHdTdGF0ZXMsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIENGWF9Db2xvciAqY3JGaWxsLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgQ0ZYX0NvbG9yIGNyRmlsbHRlbXA7DQotICAgIGNyRmlsbCA/IGNyRmlsbHRlbXAgPSAqY3JGaWxsIDogY3JGaWxsdGVtcCA9IEFyZ2JFbmNvZGUoMjU1LCAwLCAwLCAwKTsNCi0gICAgQ0ZYX1JlY3RGIHJlY3QgPSAqcFJlY3Q7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCi0gICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbHRlbXApOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQordm9pZCBDRldMX0NhcmV0VFA6OkRyYXdDYXJldEJLKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NvbG9yKiBjckZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNyRmlsbHRlbXA7DQorICBjckZpbGwgPyBjckZpbGx0ZW1wID0gKmNyRmlsbCA6IGNyRmlsbHRlbXAgPSBBcmdiRW5jb2RlKDI1NSwgMCwgMCwgMCk7DQorICBDRlhfUmVjdEYgcmVjdCA9ICpwUmVjdDsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGx0ZW1wKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NoZWNrYm94dHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NoZWNrYm94dHAuY3BwCmluZGV4IGJiYTU2ZTYuLmQ4NmYxODggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9jaGVja2JveHRwLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvY2hlY2tib3h0cC5jcHAKQEAgLTUsNDk2ICs1LDUzOSBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCi0jZGVmaW5lIENIRUNLQk9YX1NJWkVfU0lHTk1BUkdJTgkJMw0KLSNkZWZpbmUgQ0hFQ0tCT1hfU0laRV9TSUdOQk9SREVSCQkyDQotI2RlZmluZSBDSEVDS0JPWF9TSVpFX1NJR05QQVRICQkJMTAwDQotI2RlZmluZSBDSEVDS0JPWF9DT0xPUl9CT1hMVDEJCShBcmdiRW5jb2RlKDI1NSwgMTcyLCAxNjgsIDE1MykpDQotI2RlZmluZSBDSEVDS0JPWF9DT0xPUl9CT1hMVDIJCShBcmdiRW5jb2RlKDI1NSwgMTEzLCAxMTEsIDEwMCkpDQotI2RlZmluZSBDSEVDS0JPWF9DT0xPUl9CT1hSQjEJCShBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIyNikpDQotI2RlZmluZSBDSEVDS0JPWF9DT0xPUl9CT1hSQjIJCShBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSkpDQotI2RlZmluZQlDSEVDS0JPWF9GWEdFX0Nvb3JkaW5hdGVzQWRqdXN0DQotQ0ZXTF9DaGVja0JveFRQOjpDRldMX0NoZWNrQm94VFAoKQ0KLSAgICA6IG1fcENoZWNrUGF0aChOVUxMKQ0KLXsNCi0gICAgbV9wVGhlbWVEYXRhID0gRlhfTkVXIENLQlRoZW1lRGF0YTsNCi0gICAgU2V0VGhlbWVEYXRhKDApOw0KKyNkZWZpbmUgQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOIDMNCisjZGVmaW5lIENIRUNLQk9YX1NJWkVfU0lHTkJPUkRFUiAyDQorI2RlZmluZSBDSEVDS0JPWF9TSVpFX1NJR05QQVRIIDEwMA0KKyNkZWZpbmUgQ0hFQ0tCT1hfQ09MT1JfQk9YTFQxIChBcmdiRW5jb2RlKDI1NSwgMTcyLCAxNjgsIDE1MykpDQorI2RlZmluZSBDSEVDS0JPWF9DT0xPUl9CT1hMVDIgKEFyZ2JFbmNvZGUoMjU1LCAxMTMsIDExMSwgMTAwKSkNCisjZGVmaW5lIENIRUNLQk9YX0NPTE9SX0JPWFJCMSAoQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMjYpKQ0KKyNkZWZpbmUgQ0hFQ0tCT1hfQ09MT1JfQk9YUkIyIChBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSkpDQorI2RlZmluZSBDSEVDS0JPWF9GWEdFX0Nvb3JkaW5hdGVzQWRqdXN0DQorQ0ZXTF9DaGVja0JveFRQOjpDRldMX0NoZWNrQm94VFAoKSA6IG1fcENoZWNrUGF0aChOVUxMKSB7DQorICBtX3BUaGVtZURhdGEgPSBGWF9ORVcgQ0tCVGhlbWVEYXRhOw0KKyAgU2V0VGhlbWVEYXRhKDApOw0KIH0NCi1DRldMX0NoZWNrQm94VFA6On5DRldMX0NoZWNrQm94VFAoKQ0KLXsNCi0gICAgaWYgKG1fcFRoZW1lRGF0YSkgew0KLSAgICAgICAgZGVsZXRlIG1fcFRoZW1lRGF0YTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YSA9IE5VTEw7DQorQ0ZXTF9DaGVja0JveFRQOjp+Q0ZXTF9DaGVja0JveFRQKCkgew0KKyAgaWYgKG1fcFRoZW1lRGF0YSkgew0KKyAgICBkZWxldGUgbV9wVGhlbWVEYXRhOw0KKyAgICBtX3BUaGVtZURhdGEgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcENoZWNrUGF0aCkgew0KKyAgICBtX3BDaGVja1BhdGgtPkNsZWFyKCk7DQorICAgIGRlbGV0ZSBtX3BDaGVja1BhdGg7DQorICAgIG1fcENoZWNrUGF0aCA9IE5VTEw7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9DaGVja0JveFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgIEZYX0RXT1JEIGR3SGFzaCA9IHBXaWRnZXQtPkdldENsYXNzSUQoKTsNCisgIHJldHVybiBkd0hhc2ggPT0gRldMX0NMQVNTSEFTSF9DaGVja0JveCB8fA0KKyAgICAgICAgIGR3SGFzaCA9PSBGV0xfQ0xBU1NIQVNIX1JhZGlvQnV0dG9uOw0KK30NCitGWF9EV09SRCBDRldMX0NoZWNrQm94VFA6OlNldFRoZW1lSUQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4pIHsNCisgIGlmIChtX3BUaGVtZURhdGEpIHsNCisgICAgU2V0VGhlbWVEYXRhKEZXTF9HZXRUaGVtZUNvbG9yKGR3VGhlbWVJRCkpOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OlNldFRoZW1lSUQocFdpZGdldCwgZHdUaGVtZUlELCBiQ2hpbGRyZW4pOw0KK30NCitGWF9CT09MIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wVGV4dE91dCwgRkFMU0UpOw0KKyAgRlhfQk9PTCBiRGlzYWJsZSA9IChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazEpID09DQorICAgICAgICAgICAgICAgICAgICAgRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQ7DQorICBGWF9BUkdCIGFyZ1RleHQgPQ0KKyAgICAgIGJEaXNhYmxlID8gRldMVEhFTUVfQ0FQQUNJVFlfVGV4dERpc0NvbG9yIDogRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yOw0KKyAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKGFyZ1RleHQpOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkRyYXdUZXh0KHBQYXJhbXMpOw0KK30NCitGWF9CT09MIENGV0xfQ2hlY2tCb3hUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KKyAgc3dpdGNoIChwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgIGNhc2UgRldMX1BBUlRfQ0tCX0JvcmRlcjogew0KKyAgICAgIERyYXdCb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpZiAobV9wQ2hlY2tQYXRoKSB7DQotICAgICAgICBtX3BDaGVja1BhdGgtPkNsZWFyKCk7DQotICAgICAgICBkZWxldGUgbV9wQ2hlY2tQYXRoOw0KLSAgICAgICAgbV9wQ2hlY2tQYXRoID0gTlVMTDsNCisgICAgY2FzZSBGV0xfUEFSVF9DS0JfRWRnZTogew0KKyAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLA0KKyAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLX0NCi1GWF9CT09MCUNGV0xfQ2hlY2tCb3hUUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRkFMU0UpOw0KLSAgICBGWF9EV09SRCBkd0hhc2ggPSBwV2lkZ2V0LT5HZXRDbGFzc0lEKCk7DQotICAgIHJldHVybiBkd0hhc2ggPT0gRldMX0NMQVNTSEFTSF9DaGVja0JveCB8fCBkd0hhc2ggPT0gRldMX0NMQVNTSEFTSF9SYWRpb0J1dHRvbjsNCi19DQotRlhfRFdPUkQgQ0ZXTF9DaGVja0JveFRQOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9EV09SRCBkd1RoZW1lSUQsIEZYX0JPT0wgYkNoaWxkcmVuICkNCi17DQotICAgIGlmIChtX3BUaGVtZURhdGEpIHsNCi0gICAgICAgIFNldFRoZW1lRGF0YShGV0xfR2V0VGhlbWVDb2xvcihkd1RoZW1lSUQpKTsNCisgICAgY2FzZSBGV0xfUEFSVF9DS0JfQmFja2dyb3VuZDogew0KKyAgICAgIEZpbGxCYWNrZ3JvdW5kKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX0ZvY3VzZWQpIHsNCisgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0ID0gKihDRlhfUmVjdEYqKXBQYXJhbXMtPm1fcERhdGE7DQorICAgICAgICBEcmF3Rm9jdXMocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OlNldFRoZW1lSUQocFdpZGdldCwgZHdUaGVtZUlELCBiQ2hpbGRyZW4pOw0KLX0NCi1GWF9CT09MCUNGV0xfQ2hlY2tCb3hUUDo6RHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQgKnBQYXJhbXMpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFRleHRPdXQsIEZBTFNFKTsNCi0gICAgRlhfQk9PTCBiRGlzYWJsZSA9IChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazEpID09IEZXTF9QQVJUU1RBVEVfQ0tCX0Rpc2FibGVkOw0KLSAgICBGWF9BUkdCIGFyZ1RleHQgPSBiRGlzYWJsZSA/IEZXTFRIRU1FX0NBUEFDSVRZX1RleHREaXNDb2xvciA6IEZXTFRIRU1FX0NBUEFDSVRZX1RleHRDb2xvcjsNCi0gICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKGFyZ1RleHQpOw0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RHJhd1RleHQocFBhcmFtcyk7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9DaGVja0JveFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KLSAgICBzd2l0Y2gocFBhcmFtcy0+bV9pUGFydCkgew0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9DS0JfQm9yZGVyOiB7DQotICAgICAgICAgICAgICAgIERyYXdCb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9DS0JfRWRnZTogew0KLSAgICAgICAgICAgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0NLQl9CYWNrZ3JvdW5kOiB7DQotICAgICAgICAgICAgICAgIEZpbGxCYWNrZ3JvdW5kKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGlmIChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfRm9jdXNlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9ydFBhcnQgPSAqKENGWF9SZWN0RiopcFBhcmFtcy0+bV9wRGF0YTsNCi0gICAgICAgICAgICAgICAgICAgIERyYXdGb2N1cyhwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfQ0tCX0NoZWNrQm94OiB7DQotICAgICAgICAgICAgICAgIERyYXdCb3hCayhwUGFyYW1zLT5tX3BXaWRnZXQsIHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIHBQYXJhbXMtPm1fZHdTdGF0ZXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGlmICgoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMikgPT0gRldMX1BBUlRTVEFURV9DS0JfQ2hlY2tlZCkgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9OZXV0cmFsKSkgew0KLSAgICAgICAgICAgICAgICAgICAgRHJhd1NpZ24ocFBhcmFtcy0+bV9wV2lkZ2V0LCBwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBwUGFyYW1zLT5tX2R3U3RhdGVzLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRpc2FibGUgPSAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9EaXNhYmxlZDsNCi0gICAgICAgICAgICAgICAgRHJhd1NpZ25Cb3JkZXIocFBhcmFtcy0+bV9wV2lkZ2V0LCBwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBiRGlzYWJsZSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0NLQl9DaGVja0JveDogew0KKyAgICAgIERyYXdCb3hCayhwUGFyYW1zLT5tX3BXaWRnZXQsIHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsDQorICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fZHdTdGF0ZXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgaWYgKCgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PQ0KKyAgICAgICAgICAgRldMX1BBUlRTVEFURV9DS0JfQ2hlY2tlZCkgfA0KKyAgICAgICAgICAoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMikgPT0NCisgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWwpKSB7DQorICAgICAgICBEcmF3U2lnbihwUGFyYW1zLT5tX3BXaWRnZXQsIHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsDQorICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX2R3U3RhdGVzLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIH0NCisgICAgICBGWF9CT09MIGJEaXNhYmxlID0gKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0NCisgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQ7DQorICAgICAgRHJhd1NpZ25Cb3JkZXIocFBhcmFtcy0+bV9wV2lkZ2V0LCBwUGFyYW1zLT5tX3BHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsIGJEaXNhYmxlLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGQUxTRTsgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9DaGVja0JveFRQOjpJbml0aWFsaXplKCkNCi17DQotICAgIEluaXRUVE8oKTsNCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkluaXRpYWxpemUoKTsNCitGV0xfRVJSIENGV0xfQ2hlY2tCb3hUUDo6SW5pdGlhbGl6ZSgpIHsNCisgIEluaXRUVE8oKTsNCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpJbml0aWFsaXplKCk7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9DaGVja0JveFRQOjpGaW5hbGl6ZSgpDQotew0KLSAgICBGaW5hbGl6ZVRUTygpOw0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCitGV0xfRVJSIENGV0xfQ2hlY2tCb3hUUDo6RmluYWxpemUoKSB7DQorICBGaW5hbGl6ZVRUTygpOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkZpbmFsaXplKCk7DQogfQ0KLXZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3Qm94QmsoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9EV09SRCBkd1N0YXRlcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBkd1N0YXRlcyAmPSAweDAzOw0KLSAgICBpbnQzMl90IGZpbGxNb2RlID0gRlhGSUxMX1dJTkRJTkc7DQotICAgIEZYX0RXT1JEIGR3U3R5bGVFeCA9IHBXaWRnZXQtPkdldFN0eWxlc0V4KCk7DQotICAgIGR3U3R5bGVFeCAmPSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlTWFzazsNCi0gICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgRlhfRkxPQVQgZlJpZ2h0ID0gcFJlY3QtPnJpZ2h0KCk7DQotICAgIEZYX0ZMT0FUIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7DQotICAgIEZYX0JPT0wgYkNsaXBTaWduID0gKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazEpID09IEZXTF9QQVJUU1RBVEVfQ0tCX0hvdmVyZWQ7DQotICAgIGlmICgoZHdTdHlsZUV4ID09IEZXTF9TVFlMRUVYVF9DS0JfU2hhcGVTb2xpZFNxdWFyZSkgfHwgKGR3U3R5bGVFeCA9PSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU3Vua2VuU3F1YXJlKSkgew0KLSAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQotICAgICAgICBpZiAoYkNsaXBTaWduKSB7DQotICAgICAgICAgICAgZmlsbE1vZGUgPSBGWEZJTExfQUxURVJOQVRFOw0KLSAgICAgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AgKyBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPndpZHRoIC0gQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOICogMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0IC0gQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOICogMik7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQordm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdCb3hCayhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgZHdTdGF0ZXMgJj0gMHgwMzsNCisgIGludDMyX3QgZmlsbE1vZGUgPSBGWEZJTExfV0lORElORzsNCisgIEZYX0RXT1JEIGR3U3R5bGVFeCA9IHBXaWRnZXQtPkdldFN0eWxlc0V4KCk7DQorICBkd1N0eWxlRXggJj0gRldMX1NUWUxFRVhUX0NLQl9TaGFwZU1hc2s7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIEZYX0ZMT0FUIGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOw0KKyAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCisgIEZYX0JPT0wgYkNsaXBTaWduID0NCisgICAgICAoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0gRldMX1BBUlRTVEFURV9DS0JfSG92ZXJlZDsNCisgIGlmICgoZHdTdHlsZUV4ID09IEZXTF9TVFlMRUVYVF9DS0JfU2hhcGVTb2xpZFNxdWFyZSkgfHwNCisgICAgICAoZHdTdHlsZUV4ID09IEZXTF9TVFlMRUVYVF9DS0JfU2hhcGVTdW5rZW5TcXVhcmUpKSB7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KKyAgICBpZiAoYkNsaXBTaWduKSB7DQorICAgICAgZmlsbE1vZGUgPSBGWEZJTExfQUxURVJOQVRFOw0KKyAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AgKyBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4sDQorICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPndpZHRoIC0gQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOICogMiwNCisgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0IC0gQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOICogMik7DQorICAgIH0NCisgIH0gZWxzZSB7DQogI2lmZGVmIENIRUNLQk9YX0ZYR0VfQ29vcmRpbmF0ZXNBZGp1c3QNCi0gICAgICAgIENGWF9SZWN0RiByZWN0KCpwUmVjdCk7DQotICAgICAgICByZWN0LkRlZmxhdGUoMCwgMCwgMSwgMSk7DQotICAgICAgICBwYXRoLkFkZEVsbGlwc2UocmVjdCk7DQorICAgIENGWF9SZWN0RiByZWN0KCpwUmVjdCk7DQorICAgIHJlY3QuRGVmbGF0ZSgwLCAwLCAxLCAxKTsNCisgICAgcGF0aC5BZGRFbGxpcHNlKHJlY3QpOw0KICNlbHNlDQotICAgICAgICBwYXRoLkFkZEVsbGlwc2UoKnBSZWN0KTsNCisgICAgcGF0aC5BZGRFbGxpcHNlKCpwUmVjdCk7DQogI2VuZGlmDQotICAgICAgICBpZiAoYkNsaXBTaWduKSB7DQotICAgICAgICAgICAgZmlsbE1vZGUgPSBGWEZJTExfQUxURVJOQVRFOw0KKyAgICBpZiAoYkNsaXBTaWduKSB7DQorICAgICAgZmlsbE1vZGUgPSBGWEZJTExfQUxURVJOQVRFOw0KICNpZmRlZiBDSEVDS0JPWF9GWEdFX0Nvb3JkaW5hdGVzQWRqdXN0DQotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0Q2xpcChyZWN0KTsNCisgICAgICBDRlhfUmVjdEYgcnRDbGlwKHJlY3QpOw0KICNlbHNlDQotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0Q2xpcCgqcFJlY3QpOw0KKyAgICAgIENGWF9SZWN0RiBydENsaXAoKnBSZWN0KTsNCiAjZW5kaWYNCi0gICAgICAgICAgICBydENsaXAuRGVmbGF0ZShDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4gLSAxLCBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4gLSAxKTsNCi0gICAgICAgICAgICBwYXRoLkFkZEVsbGlwc2UocnRDbGlwKTsNCi0gICAgICAgIH0NCisgICAgICBydENsaXAuRGVmbGF0ZShDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4gLSAxLA0KKyAgICAgICAgICAgICAgICAgICAgIENIRUNLQk9YX1NJWkVfU0lHTk1BUkdJTiAtIDEpOw0KKyAgICAgIHBhdGguQWRkRWxsaXBzZShydENsaXApOw0KICAgICB9DQotICAgIGludDMyX3QgaVRoZW1lID0gMTsNCi0gICAgaWYgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9Ib3ZlcmVkKSB7DQotICAgICAgICBpVGhlbWUgPSAyOw0KLSAgICB9IGVsc2UgaWYgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9QcmVzc2VkKSB7DQotICAgICAgICBpVGhlbWUgPSAzOw0KLSAgICB9IGVsc2UgaWYgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9EaXNhYmxlZCkgew0KLSAgICAgICAgaVRoZW1lID0gNDsNCisgIH0NCisgIGludDMyX3QgaVRoZW1lID0gMTsNCisgIGlmICgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0gRldMX1BBUlRTVEFURV9DS0JfSG92ZXJlZCkgew0KKyAgICBpVGhlbWUgPSAyOw0KKyAgfSBlbHNlIGlmICgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0NCisgICAgICAgICAgICAgRldMX1BBUlRTVEFURV9DS0JfUHJlc3NlZCkgew0KKyAgICBpVGhlbWUgPSAzOw0KKyAgfSBlbHNlIGlmICgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0NCisgICAgICAgICAgICAgRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQpIHsNCisgICAgaVRoZW1lID0gNDsNCisgIH0NCisgIGlmICgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMikgPT0gRldMX1BBUlRTVEFURV9DS0JfQ2hlY2tlZCkgew0KKyAgICBpVGhlbWUgKz0gNDsNCisgIH0gZWxzZSBpZiAoKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09DQorICAgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWwpIHsNCisgICAgaVRoZW1lICs9IDg7DQorICB9DQorICBEcmF3QXhpYWxTaGFkaW5nKHBHcmFwaGljcywgcFJlY3QtPmxlZnQgLSAxLCBwUmVjdC0+dG9wIC0gMSwgZlJpZ2h0LCBmQm90dG9tLA0KKyAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJveEJrW2lUaGVtZV1bMF0sDQorICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm94QmtbaVRoZW1lXVsxXSwgJnBhdGgsIGZpbGxNb2RlLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRCb3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUmVjdEYgcnRTaWduKCpwUnRCb3gpOw0KKyAgcnRTaWduLkRlZmxhdGUoQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOLCBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4pOw0KKyAgRlhfRFdPUkQgZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkNoZWNrOw0KKyAgRlhfQk9PTCBiQ2hlY2sgPSBUUlVFOw0KKyAgaWYgKCgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0gRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQpICYmDQorICAgICAgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkKSkgew0KKyAgICBkd0NvbG9yID0gbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyRGlzYWJsZTsNCisgIH0gZWxzZSBpZiAoKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09DQorICAgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWwpIHsNCisgICAgc3dpdGNoIChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSB7DQorICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NLQl9Ob3JtYWw6IHsNCisgICAgICAgIGJDaGVjayA9IEZBTFNFOw0KKyAgICAgICAgZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxOb3JtYWw7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NLQl9Ib3ZlcmVkOiB7DQorICAgICAgICBiQ2hlY2sgPSBGQUxTRTsNCisgICAgICAgIGR3Q29sb3IgPSBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsSG92ZXI7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NLQl9QcmVzc2VkOiB7DQorICAgICAgICBiQ2hlY2sgPSBGQUxTRSwgZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxQcmVzc2VkOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQ6IHsNCisgICAgICAgIGJDaGVjayA9IEZBTFNFLCBkd0NvbG9yID0gbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyRGlzYWJsZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAoKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09IEZXTF9QQVJUU1RBVEVfQ0tCX0NoZWNrZWQpIHsNCi0gICAgICAgIGlUaGVtZSArPSA0Ow0KLSAgICB9IGVsc2UgaWYgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9OZXV0cmFsKSB7DQotICAgICAgICBpVGhlbWUgKz0gODsNCisgIH0NCisgIGlmIChiQ2hlY2spIHsNCisgICAgRlhfRFdPUkQgZHdTdHlsZSA9IHBXaWRnZXQtPkdldFN0eWxlc0V4KCk7DQorICAgIHN3aXRjaCAoZHdTdHlsZSAmIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlTWFzaykgew0KKyAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaGVjazogew0KKyAgICAgICAgRHJhd1NpZ25DaGVjayhwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaXJjbGU6IHsNCisgICAgICAgIHJ0U2lnbi5EZWZsYXRlKDEsIDEpOw0KKyAgICAgICAgRHJhd1NpZ25DaXJjbGUocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ3Jvc3M6IHsNCisgICAgICAgIERyYXdTaWduQ3Jvc3MocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlRGlhbW9uZDogew0KKyAgICAgICAgRHJhd1NpZ25EaWFtb25kKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVNxdWFyZTogew0KKyAgICAgICAgRHJhd1NpZ25TcXVhcmUocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlU3Rhcjogew0KKyAgICAgICAgRHJhd1NpZ25TdGFyKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQogICAgIH0NCi0gICAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsIHBSZWN0LT5sZWZ0IC0gMSwgcFJlY3QtPnRvcCAtIDEsIGZSaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICBmQm90dG9tLCBtX3BUaGVtZURhdGEtPmNsckJveEJrW2lUaGVtZV1bMF0sDQotICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3hCa1tpVGhlbWVdWzFdLCAmcGF0aCwgZmlsbE1vZGUsIHBNYXRyaXgpOw0KKyAgfSBlbHNlIHsNCisgICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIEFyZ2JFbmNvZGUoMjU1LCAzMywgMTYxLCAzMyksICZydFNpZ24sIHBNYXRyaXgpOw0KKyAgfQ0KIH0NCi12b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ24oSUZXTF9XaWRnZXQgKnBXaWRnZXQsIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdEJveCwgRlhfRFdPUkQgZHdTdGF0ZXMsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0U2lnbigqcFJ0Qm94KTsNCi0gICAgcnRTaWduLkRlZmxhdGUoQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOLCBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4pOw0KLSAgICBGWF9EV09SRCBkd0NvbG9yID0gbV9wVGhlbWVEYXRhLT5jbHJTaWduQ2hlY2s7DQotICAgIEZYX0JPT0wgYkNoZWNrID0gVFJVRTsNCi0gICAgaWYgKCgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0gRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQpICYmDQotICAgICAgICAgICAgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkKSkgew0KLSAgICAgICAgZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlckRpc2FibGU7DQotICAgIH0gZWxzZSBpZiAoKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09IEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWwpIHsNCi0gICAgICAgIHN3aXRjaCAoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgew0KLSAgICAgICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9DS0JfTm9ybWFsOiB7DQotICAgICAgICAgICAgICAgICAgICBiQ2hlY2sgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIGR3Q29sb3IgPSBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsTm9ybWFsOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ0tCX0hvdmVyZWQ6IHsNCi0gICAgICAgICAgICAgICAgICAgIGJDaGVjayA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxIb3ZlcjsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NLQl9QcmVzc2VkOiB7DQotICAgICAgICAgICAgICAgICAgICBiQ2hlY2sgPSBGQUxTRSwJZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxQcmVzc2VkOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ0tCX0Rpc2FibGVkOiB7DQotICAgICAgICAgICAgICAgICAgICBiQ2hlY2sgPSBGQUxTRSwgZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlckRpc2FibGU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbk5ldXRyYWwoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICAoKENGWF9SZWN0RiopcFJ0U2lnbiktPkluZmxhdGUoLTMsIC0zKTsNCisgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsLCBwUnRTaWduLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduQ2hlY2soQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRTaWduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFtX3BDaGVja1BhdGgpIHsNCisgICAgaW5pdENoZWNrUGF0aChwUnRTaWduLT53aWR0aCk7DQorICB9DQorICBDRlhfTWF0cml4IG10Ow0KKyAgbXQuUmVzZXQoKTsNCisgIG10LlRyYW5zbGF0ZShwUnRTaWduLT5sZWZ0LCBwUnRTaWduLT50b3ApOw0KKyAgbXQuQ29uY2F0KCpwTWF0cml4KTsNCisgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKG1fcENoZWNrUGF0aCwgRlhGSUxMX1dJTkRJTkcsICZtdCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbkNpcmNsZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRTaWduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JGaWxsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkRWxsaXBzZSgqcFJ0U2lnbik7DQorICBDRlhfQ29sb3IgY3JGaWxsKGFyZ2JGaWxsKTsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25Dcm9zcyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIEZYX0ZMT0FUIGZSaWdodCA9IHBSdFNpZ24tPnJpZ2h0KCk7DQorICBGWF9GTE9BVCBmQm90dG9tID0gcFJ0U2lnbi0+Ym90dG9tKCk7DQorICBwYXRoLkFkZExpbmUocFJ0U2lnbi0+bGVmdCwgcFJ0U2lnbi0+dG9wLCBmUmlnaHQsIGZCb3R0b20pOw0KKyAgcGF0aC5BZGRMaW5lKHBSdFNpZ24tPmxlZnQsIGZCb3R0b20sIGZSaWdodCwgcFJ0U2lnbi0+dG9wKTsNCisgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JGaWxsKTsNCisgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEuMGYpOw0KKyAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduRGlhbW9uZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IHBSdFNpZ24tPndpZHRoOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IHBSdFNpZ24tPmhlaWdodDsNCisgIEZYX0ZMT0FUIGZCb3R0b20gPSBwUnRTaWduLT5ib3R0b20oKTsNCisgIHBhdGguTW92ZVRvKHBSdFNpZ24tPmxlZnQgKyBmV2lkdGggLyAyLCBwUnRTaWduLT50b3ApOw0KKyAgcGF0aC5MaW5lVG8ocFJ0U2lnbi0+bGVmdCwgcFJ0U2lnbi0+dG9wICsgZkhlaWdodCAvIDIpOw0KKyAgcGF0aC5MaW5lVG8ocFJ0U2lnbi0+bGVmdCArIGZXaWR0aCAvIDIsIGZCb3R0b20pOw0KKyAgcGF0aC5MaW5lVG8ocFJ0U2lnbi0+cmlnaHQoKSwgcFJ0U2lnbi0+dG9wICsgZkhlaWdodCAvIDIpOw0KKyAgcGF0aC5MaW5lVG8ocFJ0U2lnbi0+bGVmdCArIGZXaWR0aCAvIDIsIHBSdFNpZ24tPnRvcCk7DQorICBDRlhfQ29sb3IgY3JGaWxsKGFyZ2JGaWxsKTsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25TcXVhcmUoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUnRTaWduLT5sZWZ0LCBwUnRTaWduLT50b3AsIHBSdFNpZ24tPndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgcFJ0U2lnbi0+aGVpZ2h0KTsNCisgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnblN0YXIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JGaWxsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBGWF9GTE9BVCBmQm90dG9tID0gcFJ0U2lnbi0+Ym90dG9tKCk7DQorICBGWF9GTE9BVCBmUmFkaXVzID0NCisgICAgICAocFJ0U2lnbi0+dG9wIC0gZkJvdHRvbSkgLyAoMSArIChGWF9GTE9BVCljb3MoRlhfUEkgLyA1LjBmKSk7DQorICBDRlhfUG9pbnRGIHB0Q2VudGVyOw0KKyAgcHRDZW50ZXIuU2V0KChwUnRTaWduLT5sZWZ0ICsgcFJ0U2lnbi0+cmlnaHQoKSkgLyAyLjBmLA0KKyAgICAgICAgICAgICAgIChwUnRTaWduLT50b3AgKyBmQm90dG9tKSAvIDIuMGYpOw0KKyAgRlhfRkxPQVQgcHhbNV0sIHB5WzVdOw0KKyAgRlhfRkxPQVQgZkFuZ2VsID0gRlhfUEkgLyAxMC4wZjsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDU7IGkrKykgew0KKyAgICBweFtpXSA9IHB0Q2VudGVyLnggKyBmUmFkaXVzICogKEZYX0ZMT0FUKWNvcyhmQW5nZWwpOw0KKyAgICBweVtpXSA9IHB0Q2VudGVyLnkgKyBmUmFkaXVzICogKEZYX0ZMT0FUKXNpbihmQW5nZWwpOw0KKyAgICBmQW5nZWwgKz0gRlhfUEkgKiAyIC8gNS4wZjsNCisgIH0NCisgIHBhdGguTW92ZVRvKHB4WzBdLCBweVswXSk7DQorICBpbnQzMl90IG5OZXh0ID0gMDsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDU7IGorKykgew0KKyAgICBuTmV4dCArPSAyOw0KKyAgICBpZiAobk5leHQgPj0gNSkgew0KKyAgICAgIG5OZXh0IC09IDU7DQogICAgIH0NCi0gICAgaWYgKGJDaGVjaykgew0KLSAgICAgICAgRlhfRFdPUkQgZHdTdHlsZSA9IHBXaWRnZXQtPkdldFN0eWxlc0V4KCk7DQotICAgICAgICBzd2l0Y2goZHdTdHlsZSAmIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlTWFzaykgew0KLSAgICAgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaGVjazogew0KLSAgICAgICAgICAgICAgICAgICAgRHJhd1NpZ25DaGVjayhwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2lyY2xlOiB7DQotICAgICAgICAgICAgICAgICAgICBydFNpZ24uRGVmbGF0ZSgxLCAxKTsNCi0gICAgICAgICAgICAgICAgICAgIERyYXdTaWduQ2lyY2xlKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDcm9zczogew0KLSAgICAgICAgICAgICAgICAgICAgRHJhd1NpZ25Dcm9zcyhwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlRGlhbW9uZDogew0KLSAgICAgICAgICAgICAgICAgICAgRHJhd1NpZ25EaWFtb25kKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTcXVhcmU6IHsNCi0gICAgICAgICAgICAgICAgICAgIERyYXdTaWduU3F1YXJlKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTdGFyOiB7DQotICAgICAgICAgICAgICAgICAgICBEcmF3U2lnblN0YXIocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgQXJnYkVuY29kZSgyNTUsIDMzLCAxNjEsIDMzKSwgJnJ0U2lnbiwgcE1hdHJpeCk7DQorICAgIHBhdGguTGluZVRvKHB4W25OZXh0XSwgcHlbbk5leHRdKTsNCisgIH0NCisgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbkJvcmRlcihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEaXNhYmxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBzd2l0Y2ggKHBXaWRnZXQtPkdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlTWFzaykgew0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2hhcGVTb2xpZFNxdWFyZTogew0KKyAgICAgIERyYXdBbm51bHVzUmVjdChwR3JhcGhpY3MsIGJEaXNhYmxlID8gbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyRGlzYWJsZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyTm9ybWFsLA0KKyAgICAgICAgICAgICAgICAgICAgICBwUnRCb3gsIDEsIHBNYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbk5ldXRyYWwoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0U2lnbiwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICAoKENGWF9SZWN0RiopcFJ0U2lnbiktPkluZmxhdGUoLTMsIC0zKTsNCi0gICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWwsIHBSdFNpZ24sIHBNYXRyaXgpOw0KLX0NCi12b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25DaGVjayhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRTaWduLCBGWF9BUkdCIGFyZ2JGaWxsLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIGlmICghbV9wQ2hlY2tQYXRoKSB7DQotICAgICAgICBpbml0Q2hlY2tQYXRoKHBSdFNpZ24tPndpZHRoKTsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU3Vua2VuU3F1YXJlOiB7DQorICAgICAgRHJhdzNEUmVjdChwR3JhcGhpY3MsIEZXTFRIRU1FX0VER0VfU3Vua2VuLCBDSEVDS0JPWF9TSVpFX1NJR05CT1JERVIsDQorICAgICAgICAgICAgICAgICBwUnRCb3gsIENIRUNLQk9YX0NPTE9SX0JPWExUMSwgQ0hFQ0tCT1hfQ09MT1JfQk9YTFQyLA0KKyAgICAgICAgICAgICAgICAgQ0hFQ0tCT1hfQ09MT1JfQk9YUkIxLCBDSEVDS0JPWF9DT0xPUl9CT1hSQjIsIHBNYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIENGWF9NYXRyaXggbXQ7DQotICAgIG10LlJlc2V0KCk7DQotICAgIG10LlRyYW5zbGF0ZShwUnRTaWduLT5sZWZ0LCBwUnRTaWduLT50b3ApOw0KLSAgICBtdC5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICBDRlhfQ29sb3IgY3JGaWxsKGFyZ2JGaWxsKTsNCi0gICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCi0gICAgcEdyYXBoaWNzLT5GaWxsUGF0aChtX3BDaGVja1BhdGgsIEZYRklMTF9XSU5ESU5HLCAmbXQpOw0KLSAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQotfQ0KLXZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbkNpcmNsZShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRTaWduLCBGWF9BUkdCIGFyZ2JGaWxsLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIENGWF9QYXRoIHBhdGg7DQotICAgIHBhdGguQ3JlYXRlKCk7DQotICAgIHBhdGguQWRkRWxsaXBzZSgqcFJ0U2lnbik7DQotICAgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi19DQotdm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduQ3Jvc3MoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0U2lnbiwgRlhfQVJHQiBhcmdiRmlsbCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBGWF9GTE9BVCBmUmlnaHQgPSBwUnRTaWduLT5yaWdodCgpOw0KLSAgICBGWF9GTE9BVCBmQm90dG9tID0gcFJ0U2lnbi0+Ym90dG9tKCk7DQotICAgIHBhdGguQWRkTGluZShwUnRTaWduLT5sZWZ0LCBwUnRTaWduLT50b3AsIGZSaWdodCwgZkJvdHRvbSk7DQotICAgIHBhdGguQWRkTGluZShwUnRTaWduLT5sZWZ0LCBmQm90dG9tLCBmUmlnaHQsIHBSdFNpZ24tPnRvcCk7DQotICAgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyRmlsbCk7DQotICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEuMGYpOw0KLSAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KLSAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQotfQ0KLXZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbkRpYW1vbmQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0U2lnbiwgRlhfQVJHQiBhcmdiRmlsbCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBGWF9GTE9BVCBmV2lkdGggPSBwUnRTaWduLT53aWR0aDsNCi0gICAgRlhfRkxPQVQgZkhlaWdodCA9IHBSdFNpZ24tPmhlaWdodDsNCi0gICAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSdFNpZ24tPmJvdHRvbSgpOw0KLSAgICBwYXRoLk1vdmVUbyhwUnRTaWduLT5sZWZ0ICsgZldpZHRoIC8gMiwgcFJ0U2lnbi0+dG9wKTsNCi0gICAgcGF0aC5MaW5lVG8ocFJ0U2lnbi0+bGVmdCwgcFJ0U2lnbi0+dG9wICsgZkhlaWdodCAvIDIpOw0KLSAgICBwYXRoLkxpbmVUbyhwUnRTaWduLT5sZWZ0ICsgZldpZHRoIC8gMiwgZkJvdHRvbSk7DQotICAgIHBhdGguTGluZVRvKHBSdFNpZ24tPnJpZ2h0KCksIHBSdFNpZ24tPnRvcCArIGZIZWlnaHQgLyAyKTsNCi0gICAgcGF0aC5MaW5lVG8ocFJ0U2lnbi0+bGVmdCArIGZXaWR0aCAvIDIsIHBSdFNpZ24tPnRvcCk7DQotICAgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi19DQotdm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduU3F1YXJlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdFNpZ24sIEZYX0FSR0IgYXJnYkZpbGwsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocFJ0U2lnbi0+bGVmdCwgcFJ0U2lnbi0+dG9wLCBwUnRTaWduLT53aWR0aCwgcFJ0U2lnbi0+aGVpZ2h0KTsNCi0gICAgQ0ZYX0NvbG9yIGNyRmlsbChhcmdiRmlsbCk7DQotICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQotICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLX0NCi12b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25TdGFyKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSdFNpZ24sIEZYX0FSR0IgYXJnYkZpbGwsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSdFNpZ24tPmJvdHRvbSgpOw0KLSAgICBGWF9GTE9BVCBmUmFkaXVzID0gKHBSdFNpZ24tPnRvcCAtIGZCb3R0b20pIC8gKCAxICsgKEZYX0ZMT0FUKWNvcyhGWF9QSSAvIDUuMGYpKTsNCi0gICAgQ0ZYX1BvaW50RiBwdENlbnRlcjsNCi0gICAgcHRDZW50ZXIuU2V0KChwUnRTaWduLT5sZWZ0ICsgcFJ0U2lnbi0+cmlnaHQoKSkgLyAyLjBmLCAocFJ0U2lnbi0+dG9wICsgZkJvdHRvbSkgLyAyLjBmKTsNCi0gICAgRlhfRkxPQVQgcHhbNV0sIHB5WzVdOw0KLSAgICBGWF9GTE9BVCBmQW5nZWwgPSBGWF9QSSAvIDEwLjBmOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA1OyBpKyspIHsNCi0gICAgICAgIHB4W2ldID0gcHRDZW50ZXIueCArIGZSYWRpdXMgKiAoRlhfRkxPQVQpY29zKGZBbmdlbCk7DQotICAgICAgICBweVtpXSA9IHB0Q2VudGVyLnkgKyBmUmFkaXVzICogKEZYX0ZMT0FUKXNpbihmQW5nZWwpOw0KLSAgICAgICAgZkFuZ2VsICs9IEZYX1BJICogMiAvIDUuMGY7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVNvbGlkQ2lyY2xlOiB7DQorICAgICAgRHJhd0FubnVsdXNDaXJjbGUocEdyYXBoaWNzLCBiRGlzYWJsZSA/IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlckRpc2FibGUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyTm9ybWFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBSdEJveCwgMSwgcE1hdHJpeCk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcGF0aC5Nb3ZlVG8ocHhbMF0sIHB5WzBdKTsNCi0gICAgaW50MzJfdCBuTmV4dCA9IDA7DQotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDU7IGorKykgew0KLSAgICAgICAgbk5leHQgKz0gMjsNCi0gICAgICAgIGlmIChuTmV4dCA+PSA1KSB7DQotICAgICAgICAgICAgbk5leHQgLT0gNTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBhdGguTGluZVRvKHB4W25OZXh0XSwgcHlbbk5leHRdKTsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU3Vua2VuQ2lyY2xlOiB7DQorICAgICAgRHJhdzNEQ2lyY2xlKHBHcmFwaGljcywgRldMVEhFTUVfRURHRV9TdW5rZW4sIENIRUNLQk9YX1NJWkVfU0lHTkJPUkRFUiwNCisgICAgICAgICAgICAgICAgICAgcFJ0Qm94LCBDSEVDS0JPWF9DT0xPUl9CT1hMVDEsIENIRUNLQk9YX0NPTE9SX0JPWExUMiwNCisgICAgICAgICAgICAgICAgICAgQ0hFQ0tCT1hfQ09MT1JfQk9YUkIxLCBDSEVDS0JPWF9DT0xPUl9CT1hSQjIsIHBNYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIH0NCiB9DQotdm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduQm9yZGVyKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRCb3gsIEZYX0JPT0wgYkRpc2FibGUgLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIHN3aXRjaChwV2lkZ2V0LT5HZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0NLQl9TaGFwZU1hc2spIHsNCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVNvbGlkU3F1YXJlOiB7DQotICAgICAgICAgICAgICAgIERyYXdBbm51bHVzUmVjdChwR3JhcGhpY3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGlzYWJsZSA/IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlckRpc2FibGUgOiBtX3BUaGVtZURhdGEtPmNsclNpZ25Cb3JkZXJOb3JtYWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnRCb3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVN1bmtlblNxdWFyZTogew0KLSAgICAgICAgICAgICAgICBEcmF3M0RSZWN0KHBHcmFwaGljcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9FREdFX1N1bmtlbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0JPWF9TSVpFX1NJR05CT1JERVIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ0Qm94LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLQk9YX0NPTE9SX0JPWExUMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0JPWF9DT0xPUl9CT1hMVDIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tCT1hfQ09MT1JfQk9YUkIxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLQk9YX0NPTE9SX0JPWFJCMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwTWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU29saWRDaXJjbGU6IHsNCi0gICAgICAgICAgICAgICAgRHJhd0FubnVsdXNDaXJjbGUocEdyYXBoaWNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGlzYWJsZSA/IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlckRpc2FibGUgOiBtX3BUaGVtZURhdGEtPmNsclNpZ25Cb3JkZXJOb3JtYWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdEJveCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVN1bmtlbkNpcmNsZTogew0KLSAgICAgICAgICAgICAgICBEcmF3M0RDaXJjbGUocEdyYXBoaWNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRURHRV9TdW5rZW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0JPWF9TSVpFX1NJR05CT1JERVIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnRCb3gsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0JPWF9DT0xPUl9CT1hMVDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0JPWF9DT0xPUl9CT1hMVDIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0JPWF9DT0xPUl9CT1hSQjEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0JPWF9DT0xPUl9CT1hSQjIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQordm9pZCBDRldMX0NoZWNrQm94VFA6OlNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKSB7DQorICBGWF9EV09SRCogcERhdGEgPSAoRlhfRFdPUkQqKSZtX3BUaGVtZURhdGEtPmNsckJveEJrOw0KKyAgaWYgKGR3SUQpIHsNCisgICAgKnBEYXRhKysgPSAwLCAqcERhdGErKyA9IDAsICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDE3NiwgMTc2LCAxNjcpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIzOSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjIwLCAyMjAsIDIxNSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQ4LCAxNzksIDQ4KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlck5vcm1hbCA9IEFyZ2JFbmNvZGUoMjU1LCAxNTQsIDE2NywgMTE0KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyRGlzYWJsZSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDIsIDIwMCwgMTg3KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduQ2hlY2sgPSBBcmdiRW5jb2RlKDI1NSwgMTY0LCAxODAsIDEzOCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWwgPSBBcmdiRW5jb2RlKDIyNTUsIDI4LCAxMzQsIDI2KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbE5vcm1hbCA9IEFyZ2JFbmNvZGUoMjU1LCAxMTQsIDE5MiwgMTEzKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbEhvdmVyID0gQXJnYkVuY29kZSgyNTUsIDMzLCAxNjEsIDMzKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbFByZXNzZWQgPSBBcmdiRW5jb2RlKDI1NSwgMjgsIDEzNCwgMjYpOw0KKyAgfSBlbHNlIHsNCisgICAgKnBEYXRhKysgPSAwLCAqcERhdGErKyA9IDAsICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDE3NiwgMTc2LCAxNjcpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIzOSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjIwLCAyMjAsIDIxNSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQ4LCAxNzksIDQ4KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlck5vcm1hbCA9IEFyZ2JFbmNvZGUoMjU1LCAyOCwgODEsIDEyOCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlckRpc2FibGUgPSBBcmdiRW5jb2RlKDI1NSwgMjAyLCAyMDAsIDE4Nyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkNoZWNrID0gQXJnYkVuY29kZSgyNTUsIDI4LCA4MSwgMTI4KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbCA9IEFyZ2JFbmNvZGUoMjU1LCAyOCwgMTM0LCAyNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxOb3JtYWwgPSBBcmdiRW5jb2RlKDI1NSwgMTE0LCAxOTIsIDExMyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxIb3ZlciA9IEFyZ2JFbmNvZGUoMjU1LCAzMywgMTYxLCAzMyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxQcmVzc2VkID0gQXJnYkVuY29kZSgyNTUsIDI4LCAxMzQsIDI2KTsNCisgIH0NCiB9DQotdm9pZCBDRldMX0NoZWNrQm94VFA6OlNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKQ0KLXsNCi0gICAgRlhfRFdPUkQgKnBEYXRhID0gKEZYX0RXT1JEKikmbV9wVGhlbWVEYXRhLT5jbHJCb3hCazsNCi0gICAgaWYgKGR3SUQpIHsNCi0gICAgICAgICpwRGF0YSsrID0gMCwgKnBEYXRhKysgPSAwLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjIwLCAyMjAsIDIxNSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQ4LCAxNzksIDQ4KSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIzOSksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQ4LCAxNzksIDQ4KSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDE3NiwgMTc2LCAxNjcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIzOSksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyTm9ybWFsID0gQXJnYkVuY29kZSgyNTUsIDE1NCwgMTY3LCAxMTQpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyRGlzYWJsZSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDIsIDIwMCwgMTg3KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkNoZWNrID0gQXJnYkVuY29kZSgyNTUsIDE2NCwgMTgwLCAxMzgpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbCA9IEFyZ2JFbmNvZGUoMjI1NSwgMjgsIDEzNCwgMjYpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbE5vcm1hbCA9IEFyZ2JFbmNvZGUoMjU1LCAxMTQsIDE5MiwgMTEzKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxIb3ZlciA9IEFyZ2JFbmNvZGUoMjU1LCAzMywgMTYxLCAzMyk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsUHJlc3NlZCA9IEFyZ2JFbmNvZGUoMjU1LCAyOCwgMTM0LCAyNik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICAqcERhdGErKyA9IDAsICpwRGF0YSsrID0gMCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIzOSksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQ4LCAxNzksIDQ4KSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlck5vcm1hbCA9IEFyZ2JFbmNvZGUoMjU1LCAyOCwgODEsIDEyOCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25Cb3JkZXJEaXNhYmxlID0gQXJnYkVuY29kZSgyNTUsIDIwMiwgMjAwLCAxODcpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduQ2hlY2sgPSBBcmdiRW5jb2RlKDI1NSwgMjgsIDgxLCAxMjgpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbCA9IEFyZ2JFbmNvZGUoMjU1LCAyOCwgMTM0LCAyNik7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsTm9ybWFsID0gQXJnYkVuY29kZSgyNTUsIDExNCwgMTkyLCAxMTMpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbEhvdmVyID0gQXJnYkVuY29kZSgyNTUsIDMzLCAxNjEsIDMzKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxQcmVzc2VkID0gQXJnYkVuY29kZSgyNTUsIDI4LCAxMzQsIDI2KTsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfQ2hlY2tCb3hUUDo6aW5pdENoZWNrUGF0aChGWF9GTE9BVCBmQ2hlY2tMZW4pDQotew0KLSAgICBpZiAoIW1fcENoZWNrUGF0aCkgew0KLSAgICAgICAgbV9wQ2hlY2tQYXRoID0gRlhfTkVXIENGWF9QYXRoOw0KLSAgICAgICAgbV9wQ2hlY2tQYXRoLT5DcmVhdGUoKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IENIRUNLQk9YX1NJWkVfU0lHTlBBVEg7DQotICAgICAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gLUNIRUNLQk9YX1NJWkVfU0lHTlBBVEg7DQotICAgICAgICBGWF9GTE9BVCBmQm90dG9tID0gQ0hFQ0tCT1hfU0laRV9TSUdOUEFUSDsNCi0gICAgICAgIEZYX0ZMT0FUIHB4MSwgcHkxLCBweDIsIHB5MjsNCi0gICAgICAgIENGWF9Qb2ludEYgcHQxOw0KLSAgICAgICAgcHQxLlNldChmV2lkdGggLyAxNS4wZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAyIC8gNS4wZik7DQotICAgICAgICBDRlhfUG9pbnRGIHB0MjsNCi0gICAgICAgIHB0Mi5TZXQoZldpZHRoIC8gNC41ZiwgZkJvdHRvbSArIGZIZWlnaHQgLyAxNi4wZik7DQotICAgICAgICBDRlhfUG9pbnRGIHB0MzsNCi0gICAgICAgIHB0My5TZXQoZldpZHRoIC8gMy4wZiwgZkJvdHRvbSk7DQotICAgICAgICBDRlhfUG9pbnRGIHB0NDsNCi0gICAgICAgIHB0NC5TZXQoZldpZHRoICogMTQgLyAxNS4wZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAxNSAvIDE2LjBmKTsNCi0gICAgICAgIENGWF9Qb2ludEYgcHQ1Ow0KLSAgICAgICAgcHQ1LlNldChmV2lkdGggLyAzLjZmLCBmQm90dG9tICsgZkhlaWdodCAvIDMuNWYpOw0KLSAgICAgICAgQ0ZYX1BvaW50RiBwdDEyOw0KLSAgICAgICAgcHQxMi5TZXQoZldpZHRoIC8gNy4wZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAyIC8gNy4wZik7DQotICAgICAgICBDRlhfUG9pbnRGIHB0MjE7DQotICAgICAgICBwdDIxLlNldChmV2lkdGggLyA1LjBmLCBmQm90dG9tICsgZkhlaWdodCAvIDUuMGYpOw0KLSAgICAgICAgQ0ZYX1BvaW50RiBwdDIzOw0KLSAgICAgICAgcHQyMy5TZXQoZldpZHRoIC8gNC40ZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAwIC8gMTYuMGYpOw0KLSAgICAgICAgQ0ZYX1BvaW50RiBwdDMyOw0KLSAgICAgICAgcHQzMi5TZXQoZldpZHRoIC8gNC4wZiwgZkJvdHRvbSk7DQotICAgICAgICBDRlhfUG9pbnRGIHB0MzQ7DQotICAgICAgICBwdDM0LlNldChmV2lkdGggKiAoMSAvIDcuMGYgKyA3IC8gMTUuMGYpLCBmQm90dG9tICsgZkhlaWdodCAqIDQgLyA1LjBmKTsNCi0gICAgICAgIENGWF9Qb2ludEYgcHQ0MzsNCi0gICAgICAgIHB0NDMuU2V0KGZXaWR0aCAqICgxIC8gNy4wZiArIDcgLyAxNS4wZiksIGZCb3R0b20gKyBmSGVpZ2h0ICogNCAvIDUuMGYpOw0KLSAgICAgICAgQ0ZYX1BvaW50RiBwdDQ1Ow0KLSAgICAgICAgcHQ0NS5TZXQoZldpZHRoICogNyAvIDE1LjBmLCBmQm90dG9tICsgZkhlaWdodCAqIDggLyA3LjBmKTsNCi0gICAgICAgIENGWF9Qb2ludEYgcHQ1NDsNCi0gICAgICAgIHB0NTQuU2V0KGZXaWR0aCAvIDMuNGYsIGZCb3R0b20gKyBmSGVpZ2h0IC8gMy41Zik7DQotICAgICAgICBDRlhfUG9pbnRGIHB0NTE7DQotICAgICAgICBwdDUxLlNldChmV2lkdGggLyAzLjZmLCBmQm90dG9tICsgZkhlaWdodCAvIDQuMGYpOw0KLSAgICAgICAgQ0ZYX1BvaW50RiBwdDE1Ow0KLSAgICAgICAgcHQxNS5TZXQoZldpZHRoIC8gMy41ZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAzLjVmIC8gNS4wZik7DQotICAgICAgICBtX3BDaGVja1BhdGgtPk1vdmVUbyhwdDEueCwgcHQxLnkpOw0KLSAgICAgICAgcHgxID0gcHQxMi54IC0gcHQxLng7DQotICAgICAgICBweTEgPSBwdDEyLnkgLSBwdDEueTsNCi0gICAgICAgIHB4MiA9IHB0MjEueCAtIHB0Mi54Ow0KLSAgICAgICAgcHkyID0gcHQyMS55IC0gcHQyLnk7DQotICAgICAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0MS54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLCBwdDEueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQyLnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0Mi55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDIueCwgcHQyLnkpOw0KLSAgICAgICAgcHgxID0gcHQyMy54IC0gcHQyLng7DQotICAgICAgICBweTEgPSBwdDIzLnkgLSBwdDIueTsNCi0gICAgICAgIHB4MiA9IHB0MzIueCAtIHB0My54Ow0KLSAgICAgICAgcHkyID0gcHQzMi55IC0gcHQzLnk7DQotICAgICAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0Mi54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLCBwdDIueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQzLnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0My55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDMueCwgcHQzLnkpOw0KLSAgICAgICAgcHgxID0gcHQzNC54IC0gcHQzLng7DQotICAgICAgICBweTEgPSBwdDM0LnkgLSBwdDMueTsNCi0gICAgICAgIHB4MiA9IHB0NDMueCAtIHB0NC54Ow0KLSAgICAgICAgcHkyID0gcHQ0My55IC0gcHQ0Lnk7DQotICAgICAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0My54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLCBwdDMueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQ0LnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0NC55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDQueCwgcHQ0LnkpOw0KLSAgICAgICAgcHgxID0gcHQ0NS54IC0gcHQ0Lng7DQotICAgICAgICBweTEgPSBwdDQ1LnkgLSBwdDQueTsNCi0gICAgICAgIHB4MiA9IHB0NTQueCAtIHB0NS54Ow0KLSAgICAgICAgcHkyID0gcHQ1NC55IC0gcHQ1Lnk7DQotICAgICAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0NC54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLCBwdDQueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQ1LnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0NS55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDUueCwgcHQ1LnkpOw0KLSAgICAgICAgcHgxID0gcHQ1MS54IC0gcHQ1Lng7DQotICAgICAgICBweTEgPSBwdDUxLnkgLSBwdDUueTsNCi0gICAgICAgIHB4MiA9IHB0MTUueCAtIHB0MS54Ow0KLSAgICAgICAgcHkyID0gcHQxNS55IC0gcHQxLnk7DQotICAgICAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0NS54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLCBwdDUueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQxLnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0MS55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDEueCwgcHQxLnkpOw0KLSAgICAgICAgRlhfRkxPQVQgZlNjYWxlID0gZkNoZWNrTGVuIC8gQ0hFQ0tCT1hfU0laRV9TSUdOUEFUSDsNCi0gICAgICAgIENGWF9BZmZpbmVNYXRyaXggbXQ7DQotICAgICAgICBtdC5TZXQoMSwgMCwgMCwgMSwgMCwgMCk7DQotICAgICAgICBtdC5TY2FsZShmU2NhbGUsIGZTY2FsZSk7DQotICAgICAgICBDRlhfUGF0aERhdGEgKnBEYXRhID0gbV9wQ2hlY2tQYXRoLT5HZXRQYXRoRGF0YSgpOw0KLSAgICAgICAgcERhdGEtPlRyYW5zZm9ybSgmbXQpOw0KLSAgICB9DQordm9pZCBDRldMX0NoZWNrQm94VFA6OmluaXRDaGVja1BhdGgoRlhfRkxPQVQgZkNoZWNrTGVuKSB7DQorICBpZiAoIW1fcENoZWNrUGF0aCkgew0KKyAgICBtX3BDaGVja1BhdGggPSBGWF9ORVcgQ0ZYX1BhdGg7DQorICAgIG1fcENoZWNrUGF0aC0+Q3JlYXRlKCk7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IENIRUNLQk9YX1NJWkVfU0lHTlBBVEg7DQorICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSAtQ0hFQ0tCT1hfU0laRV9TSUdOUEFUSDsNCisgICAgRlhfRkxPQVQgZkJvdHRvbSA9IENIRUNLQk9YX1NJWkVfU0lHTlBBVEg7DQorICAgIEZYX0ZMT0FUIHB4MSwgcHkxLCBweDIsIHB5MjsNCisgICAgQ0ZYX1BvaW50RiBwdDE7DQorICAgIHB0MS5TZXQoZldpZHRoIC8gMTUuMGYsIGZCb3R0b20gKyBmSGVpZ2h0ICogMiAvIDUuMGYpOw0KKyAgICBDRlhfUG9pbnRGIHB0MjsNCisgICAgcHQyLlNldChmV2lkdGggLyA0LjVmLCBmQm90dG9tICsgZkhlaWdodCAvIDE2LjBmKTsNCisgICAgQ0ZYX1BvaW50RiBwdDM7DQorICAgIHB0My5TZXQoZldpZHRoIC8gMy4wZiwgZkJvdHRvbSk7DQorICAgIENGWF9Qb2ludEYgcHQ0Ow0KKyAgICBwdDQuU2V0KGZXaWR0aCAqIDE0IC8gMTUuMGYsIGZCb3R0b20gKyBmSGVpZ2h0ICogMTUgLyAxNi4wZik7DQorICAgIENGWF9Qb2ludEYgcHQ1Ow0KKyAgICBwdDUuU2V0KGZXaWR0aCAvIDMuNmYsIGZCb3R0b20gKyBmSGVpZ2h0IC8gMy41Zik7DQorICAgIENGWF9Qb2ludEYgcHQxMjsNCisgICAgcHQxMi5TZXQoZldpZHRoIC8gNy4wZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAyIC8gNy4wZik7DQorICAgIENGWF9Qb2ludEYgcHQyMTsNCisgICAgcHQyMS5TZXQoZldpZHRoIC8gNS4wZiwgZkJvdHRvbSArIGZIZWlnaHQgLyA1LjBmKTsNCisgICAgQ0ZYX1BvaW50RiBwdDIzOw0KKyAgICBwdDIzLlNldChmV2lkdGggLyA0LjRmLCBmQm90dG9tICsgZkhlaWdodCAqIDAgLyAxNi4wZik7DQorICAgIENGWF9Qb2ludEYgcHQzMjsNCisgICAgcHQzMi5TZXQoZldpZHRoIC8gNC4wZiwgZkJvdHRvbSk7DQorICAgIENGWF9Qb2ludEYgcHQzNDsNCisgICAgcHQzNC5TZXQoZldpZHRoICogKDEgLyA3LjBmICsgNyAvIDE1LjBmKSwgZkJvdHRvbSArIGZIZWlnaHQgKiA0IC8gNS4wZik7DQorICAgIENGWF9Qb2ludEYgcHQ0MzsNCisgICAgcHQ0My5TZXQoZldpZHRoICogKDEgLyA3LjBmICsgNyAvIDE1LjBmKSwgZkJvdHRvbSArIGZIZWlnaHQgKiA0IC8gNS4wZik7DQorICAgIENGWF9Qb2ludEYgcHQ0NTsNCisgICAgcHQ0NS5TZXQoZldpZHRoICogNyAvIDE1LjBmLCBmQm90dG9tICsgZkhlaWdodCAqIDggLyA3LjBmKTsNCisgICAgQ0ZYX1BvaW50RiBwdDU0Ow0KKyAgICBwdDU0LlNldChmV2lkdGggLyAzLjRmLCBmQm90dG9tICsgZkhlaWdodCAvIDMuNWYpOw0KKyAgICBDRlhfUG9pbnRGIHB0NTE7DQorICAgIHB0NTEuU2V0KGZXaWR0aCAvIDMuNmYsIGZCb3R0b20gKyBmSGVpZ2h0IC8gNC4wZik7DQorICAgIENGWF9Qb2ludEYgcHQxNTsNCisgICAgcHQxNS5TZXQoZldpZHRoIC8gMy41ZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAzLjVmIC8gNS4wZik7DQorICAgIG1fcENoZWNrUGF0aC0+TW92ZVRvKHB0MS54LCBwdDEueSk7DQorICAgIHB4MSA9IHB0MTIueCAtIHB0MS54Ow0KKyAgICBweTEgPSBwdDEyLnkgLSBwdDEueTsNCisgICAgcHgyID0gcHQyMS54IC0gcHQyLng7DQorICAgIHB5MiA9IHB0MjEueSAtIHB0Mi55Ow0KKyAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0MS54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0MS55ICsgcHkxICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0Mi54ICsgcHgyICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0Mi55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLCBwdDIueCwgcHQyLnkpOw0KKyAgICBweDEgPSBwdDIzLnggLSBwdDIueDsNCisgICAgcHkxID0gcHQyMy55IC0gcHQyLnk7DQorICAgIHB4MiA9IHB0MzIueCAtIHB0My54Ow0KKyAgICBweTIgPSBwdDMyLnkgLSBwdDMueTsNCisgICAgbV9wQ2hlY2tQYXRoLT5CZXppZXJUbyhwdDIueCArIHB4MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDIueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDMueCArIHB4MiAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDMueSArIHB5MiAqIEZXTFRIRU1FX0JFWklFUiwgcHQzLngsIHB0My55KTsNCisgICAgcHgxID0gcHQzNC54IC0gcHQzLng7DQorICAgIHB5MSA9IHB0MzQueSAtIHB0My55Ow0KKyAgICBweDIgPSBwdDQzLnggLSBwdDQueDsNCisgICAgcHkyID0gcHQ0My55IC0gcHQ0Lnk7DQorICAgIG1fcENoZWNrUGF0aC0+QmV6aWVyVG8ocHQzLnggKyBweDEgKiBGV0xUSEVNRV9CRVpJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQzLnkgKyBweTEgKiBGV0xUSEVNRV9CRVpJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQ0LnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQ0LnkgKyBweTIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0NC54LCBwdDQueSk7DQorICAgIHB4MSA9IHB0NDUueCAtIHB0NC54Ow0KKyAgICBweTEgPSBwdDQ1LnkgLSBwdDQueTsNCisgICAgcHgyID0gcHQ1NC54IC0gcHQ1Lng7DQorICAgIHB5MiA9IHB0NTQueSAtIHB0NS55Ow0KKyAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0NC54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0NC55ICsgcHkxICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0NS54ICsgcHgyICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0NS55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLCBwdDUueCwgcHQ1LnkpOw0KKyAgICBweDEgPSBwdDUxLnggLSBwdDUueDsNCisgICAgcHkxID0gcHQ1MS55IC0gcHQ1Lnk7DQorICAgIHB4MiA9IHB0MTUueCAtIHB0MS54Ow0KKyAgICBweTIgPSBwdDE1LnkgLSBwdDEueTsNCisgICAgbV9wQ2hlY2tQYXRoLT5CZXppZXJUbyhwdDUueCArIHB4MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDUueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDEueCArIHB4MiAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDEueSArIHB5MiAqIEZXTFRIRU1FX0JFWklFUiwgcHQxLngsIHB0MS55KTsNCisgICAgRlhfRkxPQVQgZlNjYWxlID0gZkNoZWNrTGVuIC8gQ0hFQ0tCT1hfU0laRV9TSUdOUEFUSDsNCisgICAgQ0ZYX0FmZmluZU1hdHJpeCBtdDsNCisgICAgbXQuU2V0KDEsIDAsIDAsIDEsIDAsIDApOw0KKyAgICBtdC5TY2FsZShmU2NhbGUsIGZTY2FsZSk7DQorICAgIENGWF9QYXRoRGF0YSogcERhdGEgPSBtX3BDaGVja1BhdGgtPkdldFBhdGhEYXRhKCk7DQorICAgIHBEYXRhLT5UcmFuc2Zvcm0oJm10KTsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NvbWJvYm94dHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NvbWJvYm94dHAuY3BwCmluZGV4IDI4YTE5NTguLmU2MGFiNDcgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9jb21ib2JveHRwLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvY29tYm9ib3h0cC5jcHAKQEAgLTUsMTQzICs1LDE0NSBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCi0jZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0NvbWJvRm9ybUhhbmRsZXIJOC4wZg0KLUNGV0xfQ29tYm9Cb3hUUDo6Q0ZXTF9Db21ib0JveFRQKCkNCi17DQotICAgIG1fZHdUaGVtZUlEID0gMDsNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0NvbWJvRm9ybUhhbmRsZXIgOC4wZg0KK0NGV0xfQ29tYm9Cb3hUUDo6Q0ZXTF9Db21ib0JveFRQKCkgew0KKyAgbV9kd1RoZW1lSUQgPSAwOw0KIH0NCi1DRldMX0NvbWJvQm94VFA6On5DRldMX0NvbWJvQm94VFAoKQ0KLXsNCitDRldMX0NvbWJvQm94VFA6On5DRldMX0NvbWJvQm94VFAoKSB7fQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9Db21ib0JveDsNCiB9DQotRlhfQk9PTCBDRldMX0NvbWJvQm94VFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCi0gICAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0NvbWJvQm94Ow0KLX0NCi1GWF9CT09MCUNGV0xfQ29tYm9Cb3hUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYXJhbXMsIEZBTFNFKTsNCi0gICAgc3dpdGNoKHBQYXJhbXMtPm1faVBhcnQpIHsNCi0gICAgICAgIGNhc2UgRldMX1BBUlRfQ01CX0JvcmRlcjogew0KLSAgICAgICAgICAgICAgICBEcmF3Qm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfQ01CX0VkZ2U6IHsNCi0gICAgICAgICAgICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9DTUJfQmFja2dyb3VuZDogew0KLSAgICAgICAgICAgICAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICAgICAgICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICAgICAgICAgICAgICBDRlhfUmVjdEYgJiByZWN0ID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQotICAgICAgICAgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCi0gICAgICAgICAgICAgICAgQ0ZYX0NvbG9yIGNyOw0KLSAgICAgICAgICAgICAgICBzd2l0Y2gocFBhcmFtcy0+bV9kd1N0YXRlcykgew0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9TZWxlY3RlZDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjciA9IEZXTFRIRU1FX0NPTE9SX0JLU2VsZWN0ZWQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ01CX0Rpc2FibGVkOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyID0gRldMVEhFTUVfQ09MT1JfRURHRVJCMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgY3IgPSAweEZGRkZGRkZGOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0NNQl9Ecm9wRG93bkJ1dHRvbjogew0KLSAgICAgICAgICAgICAgICBEcmF3RHJvcERvd25CdXR0b24ocFBhcmFtcywgcFBhcmFtcy0+bV9kd1N0YXRlcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9DTUJfU3RyZXRjZ0hhbmRsZXI6IHsNCi0gICAgICAgICAgICAgICAgRHJhd1N0cmV0aEhhbmRsZXIocFBhcmFtcywgMCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgY2FzZSBGV0xfUEFSVF9DTUJfQm9yZGVyOiB7DQorICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENGV0xfQ29tYm9Cb3hUUDo6RHJhd1N0cmV0aEhhbmRsZXIoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIEZYX0RXT1JEIGR3U3RhdGVzLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocFBhcmFtcy0+bV9ydFBhcnQubGVmdCwNCi0gICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9ydFBhcnQudG9wLA0KLSAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydC53aWR0aCAtIDEsDQotICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCk7DQotICAgIENGWF9Db2xvciBjcihBcmdiRW5jb2RlKDB4ZmYsIDB4ZmYsIDAsIDApKTsNCi0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLX0NCi12b2lkKiBDRldMX0NvbWJvQm94VFA6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KQ0KLXsNCi0gICAgaWYgKGR3Q2FwYWNpdHkgPT0gRldMX1dHVENBUEFDSVRZX0NNQl9Db21ib0Zvcm1IYW5kbGVyKSB7DQotICAgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0NvbWJvRm9ybUhhbmRsZXI7DQotICAgICAgICByZXR1cm4gJm1fZlZhbHVlOw0KKyAgICBjYXNlIEZXTF9QQVJUX0NNQl9FZGdlOiB7DQorICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksDQorICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpHZXRDYXBhY2l0eShwVGhlbWVQYXJ0LCBkd0NhcGFjaXR5KTsNCisgICAgY2FzZSBGV0xfUEFSVF9DTUJfQmFja2dyb3VuZDogew0KKyAgICAgIENGWF9QYXRoIHBhdGg7DQorICAgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgICBDRlhfUmVjdEYmIHJlY3QgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgICAgICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICAgICAgQ0ZYX0NvbG9yIGNyOw0KKyAgICAgIHN3aXRjaCAocFBhcmFtcy0+bV9kd1N0YXRlcykgew0KKyAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9TZWxlY3RlZDoNCisgICAgICAgICAgY3IgPSBGV0xUSEVNRV9DT0xPUl9CS1NlbGVjdGVkOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9DTUJfRGlzYWJsZWQ6DQorICAgICAgICAgIGNyID0gRldMVEhFTUVfQ09MT1JfRURHRVJCMTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBjciA9IDB4RkZGRkZGRkY7DQorICAgICAgfQ0KKyAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfQ01CX0Ryb3BEb3duQnV0dG9uOiB7DQorICAgICAgRHJhd0Ryb3BEb3duQnV0dG9uKHBQYXJhbXMsIHBQYXJhbXMtPm1fZHdTdGF0ZXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9DTUJfU3RyZXRjZ0hhbmRsZXI6IHsNCisgICAgICBEcmF3U3RyZXRoSGFuZGxlcihwUGFyYW1zLCAwLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZBTFNFOyB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRldMX0NvbWJvQm94VFA6OkRyYXdTdHJldGhIYW5kbGVyKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUGFyYW1zLT5tX3J0UGFydC5sZWZ0LCBwUGFyYW1zLT5tX3J0UGFydC50b3AsDQorICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydC53aWR0aCAtIDEsIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCk7DQorICBDRlhfQ29sb3IgY3IoQXJnYkVuY29kZSgweGZmLCAweGZmLCAwLCAwKSk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KK30NCit2b2lkKiBDRldMX0NvbWJvQm94VFA6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDYXBhY2l0eSkgew0KKyAgaWYgKGR3Q2FwYWNpdHkgPT0gRldMX1dHVENBUEFDSVRZX0NNQl9Db21ib0Zvcm1IYW5kbGVyKSB7DQorICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQ29tYm9Gb3JtSGFuZGxlcjsNCisgICAgcmV0dXJuICZtX2ZWYWx1ZTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpHZXRDYXBhY2l0eShwVGhlbWVQYXJ0LCBkd0NhcGFjaXR5KTsNCiB9DQogI2lmZGVmIFRIRU1FX1hQU2ltaWxhcg0KLXZvaWQgQ0ZXTF9Db21ib0JveFRQOjpEcmF3RHJvcERvd25CdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIEZYX0RXT1JEIGR3U3RhdGVzLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfTm9ybWFsOw0KLSAgICBzd2l0Y2ggKCBkd1N0YXRlcykgew0KLSAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw6IHsNCi0gICAgICAgICAgICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfTm9ybWFsOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ01CX0hvdmVyZWQ6IHsNCi0gICAgICAgICAgICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfSG92ZXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9DTUJfUHJlc3NlZDogew0KLSAgICAgICAgICAgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ01CX0Rpc2FibGVkOiB7DQotICAgICAgICAgICAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveFRQOjpEcmF3RHJvcERvd25CdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX05vcm1hbDsNCisgIHN3aXRjaCAoZHdTdGF0ZXMpIHsNCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw6IHsNCisgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9Ob3JtYWw7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgRHJhd0Fycm93QnRuKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duLCBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9DTUJfSG92ZXJlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0hvdmVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9DTUJfUHJlc3NlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX1ByZXNzZWQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9EaXNhYmxlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICBEcmF3QXJyb3dCdG4ocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwNCisgICAgICAgICAgICAgICBGV0xUSEVNRV9ESVJFQ1RJT05fRG93biwgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KIH0NCiAjZWxzZQ0KLXZvaWQgQ0ZXTF9Db21ib0JveFRQOjpEcmF3RHJvcERvd25CdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIEZYX0RXT1JEIGR3U3RhdGVzLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgRlhfQk9PTCBiUHJlc3NlZCA9ICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9DTUJQQVJUU1RBVEVfUHJlc3NlZCkgPT0gRldMX0NNQlBBUlRTVEFURV9QcmVzc2VkKTsNCi0gICAgRlhfRkxPQVQgZldpZHRoID0gIGJQcmVzc2VkID8gMS4wZiA6IDIuMGY7DQotICAgIEZXTFRIRU1FX0VER0UgZVR5cGUgPSBiUHJlc3NlZCA/IEZXTFRIRU1FX0VER0VfRmxhdCA6IEZXTFRIRU1FX0VER0VfUmFpc2VkOw0KLSAgICBEcmF3M0RSZWN0KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBlVHlwZSwgZldpZHRoLCAmcFBhcmFtcy0+bV9ydFBhcnQsIEZXTFRIRU1FX0NPTE9SX0VER0VMVDEsIEZXTFRIRU1FX0NPTE9SX0VER0VMVDIsIEZXTFRIRU1FX0NPTE9SX0VER0VSQjEsIEZXTFRIRU1FX0NPTE9SX0VER0VSQjIsIHBNYXRyaXgpOw0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShwUGFyYW1zLT5tX3J0UGFydC5sZWZ0ICsgZldpZHRoLCBwUGFyYW1zLT5tX3J0UGFydC50b3AgKyBmV2lkdGgsIHBQYXJhbXMtPm1fcnRQYXJ0LndpZHRoIC0gMiAqIGZXaWR0aCwgcFBhcmFtcy0+bV9ydFBhcnQuaGVpZ2h0IC0gMiAqIGZXaWR0aCk7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBDRlhfQ29sb3IgY3JGaWxsKEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi0gICAgRlhfQVJHQiBhcmdiRmlsbCA9IEFyZ2JFbmNvZGUoMjU1LCA3NywgOTcsIDEzMyk7DQotICAgIHN3aXRjaChwUGFyYW1zLT5tX2R3U3RhdGVzICYgMHgwMykgew0KLSAgICAgICAgY2FzZSBGV0xfQ01CUEFSVFNUQVRFX05vcm1hbDogew0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX0NNQlBBUlRTVEFURV9Ib3ZlcmVkOiB7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfQ01CUEFSVFNUQVRFX1ByZXNzZWQ6IHsNCi0gICAgICAgICAgICAgICAgYXJnYkZpbGwgPSAweEZGMDAwMDAwOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9DTUJQQVJUU1RBVEVfRGlzYWJsZWQ6IHsNCi0gICAgICAgICAgICAgICAgYXJnYkZpbGwgPSAweEZGRjBGMEYwOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQordm9pZCBDRldMX0NvbWJvQm94VFA6OkRyYXdEcm9wRG93bkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhfQk9PTCBiUHJlc3NlZCA9ICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9DTUJQQVJUU1RBVEVfUHJlc3NlZCkgPT0NCisgICAgICAgICAgICAgICAgICAgICAgRldMX0NNQlBBUlRTVEFURV9QcmVzc2VkKTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IGJQcmVzc2VkID8gMS4wZiA6IDIuMGY7DQorICBGV0xUSEVNRV9FREdFIGVUeXBlID0gYlByZXNzZWQgPyBGV0xUSEVNRV9FREdFX0ZsYXQgOiBGV0xUSEVNRV9FREdFX1JhaXNlZDsNCisgIERyYXczRFJlY3QocFBhcmFtcy0+bV9wR3JhcGhpY3MsIGVUeXBlLCBmV2lkdGgsICZwUGFyYW1zLT5tX3J0UGFydCwNCisgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRUxUMSwgRldMVEhFTUVfQ09MT1JfRURHRUxUMiwNCisgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRVJCMSwgRldMVEhFTUVfQ09MT1JfRURHRVJCMiwgcE1hdHJpeCk7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHBQYXJhbXMtPm1fcnRQYXJ0LmxlZnQgKyBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydC50b3AgKyBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydC53aWR0aCAtIDIgKiBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydC5oZWlnaHQgLSAyICogZldpZHRoKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNyRmlsbChGV0xUSEVNRV9DT0xPUl9CYWNrZ3JvdW5kKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICBGWF9BUkdCIGFyZ2JGaWxsID0gQXJnYkVuY29kZSgyNTUsIDc3LCA5NywgMTMzKTsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIDB4MDMpIHsNCisgICAgY2FzZSBGV0xfQ01CUEFSVFNUQVRFX05vcm1hbDogew0KICAgICB9DQotICAgIERyYXdBcnJvdyhwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBGV0xUSEVNRV9ESVJFQ1RJT05fRG93biwgYXJnYkZpbGwsIGJQcmVzc2VkLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICBjYXNlIEZXTF9DTUJQQVJUU1RBVEVfSG92ZXJlZDogew0KKyAgICB9DQorICAgIGNhc2UgRldMX0NNQlBBUlRTVEFURV9QcmVzc2VkOiB7DQorICAgICAgYXJnYkZpbGwgPSAweEZGMDAwMDAwOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX0NNQlBBUlRTVEFURV9EaXNhYmxlZDogew0KKyAgICAgIGFyZ2JGaWxsID0gMHhGRkYwRjBGMDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgRHJhd0Fycm93KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duLA0KKyAgICAgICAgICAgIGFyZ2JGaWxsLCBiUHJlc3NlZCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCiB9DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2RhdGV0aW1lcGlja2VydHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2RhdGV0aW1lcGlja2VydHAuY3BwCmluZGV4IGJjOTRlZTkuLjcwZDMxMjUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9kYXRldGltZXBpY2tlcnRwLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5jcHAKQEAgLTUsMTE2ICs1LDEyOSBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCi1DRldMX0RhdGVUaW1lUGlja2VyVFA6OkNGV0xfRGF0ZVRpbWVQaWNrZXJUUCgpDQotew0KLSAgICBtX3BUaGVtZURhdGEgPSBGWF9ORVcgRFRQVGhlbWVEYXRhOw0KLSAgICBpbml0VGhlbWVEYXRhKCk7DQorQ0ZXTF9EYXRlVGltZVBpY2tlclRQOjpDRldMX0RhdGVUaW1lUGlja2VyVFAoKSB7DQorICBtX3BUaGVtZURhdGEgPSBGWF9ORVcgRFRQVGhlbWVEYXRhOw0KKyAgaW5pdFRoZW1lRGF0YSgpOw0KIH0NCi1DRldMX0RhdGVUaW1lUGlja2VyVFA6On5DRldMX0RhdGVUaW1lUGlja2VyVFAoKQ0KLXsNCi0gICAgZGVsZXRlIG1fcFRoZW1lRGF0YTsNCitDRldMX0RhdGVUaW1lUGlja2VyVFA6On5DRldMX0RhdGVUaW1lUGlja2VyVFAoKSB7DQorICBkZWxldGUgbV9wVGhlbWVEYXRhOw0KIH0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRkFMU0UpOw0KLSAgICByZXR1cm4gcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfRGF0ZVRpbWVQaWNrZXI7DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VyVFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRkFMU0UpOw0KKyAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyOw0KIH0NCi1GWF9CT09MCUNGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYXJhbXMsIEZBTFNFKTsNCi0gICAgc3dpdGNoKHBQYXJhbXMtPm1faVBhcnQpIHsNCi0gICAgICAgIGNhc2UgRldMX1BBUlRfRFRQX0JvcmRlcjogew0KLSAgICAgICAgICAgICAgICBEcmF3Qm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfRFRQX0VkZ2U6IHsNCi0gICAgICAgICAgICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9EVFBfRHJvcERvd25CdXR0b246IHsNCi0gICAgICAgICAgICAgICAgRHJhd0Ryb3BEb3duQnV0dG9uKHBQYXJhbXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICB9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VyVFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYXJhbXMsIEZBTFNFKTsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICBjYXNlIEZXTF9QQVJUX0RUUF9Cb3JkZXI6IHsNCisgICAgICBEcmF3Qm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgRldMX1BBUlRfRFRQX0VkZ2U6IHsNCisgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwNCisgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9EVFBfRHJvcERvd25CdXR0b246IHsNCisgICAgICBEcmF3RHJvcERvd25CdXR0b24ocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KICNpZmRlZiBUSEVNRV9YUFNpbWlsYXINCi12b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6RHJhd0Ryb3BEb3duQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdTdGF0ZXMgPQlwUGFyYW1zLT5tX2R3U3RhdGVzOw0KLSAgICBkd1N0YXRlcyAmPSAweDAzOw0KLSAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9Ob3JtYWw7DQotICAgIHN3aXRjaCAoZVN0YXRlICYgZHdTdGF0ZXMpIHsNCi0gICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsOiB7DQotICAgICAgICAgICAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX05vcm1hbDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9Ib3ZlcmVkOiB7DQotICAgICAgICAgICAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0hvdmVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRFRQX1ByZXNzZWQ6IHsNCi0gICAgICAgICAgICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfUHJlc3NlZDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9EaXNhYmxlZDogew0KLSAgICAgICAgICAgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9EaXNhYmFsZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6RHJhd0Ryb3BEb3duQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhfRFdPUkQgZHdTdGF0ZXMgPSBwUGFyYW1zLT5tX2R3U3RhdGVzOw0KKyAgZHdTdGF0ZXMgJj0gMHgwMzsNCisgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX05vcm1hbDsNCisgIHN3aXRjaCAoZVN0YXRlICYgZHdTdGF0ZXMpIHsNCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9Ob3JtYWw6IHsNCisgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9Ob3JtYWw7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgRHJhd0Fycm93QnRuKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duLCBlU3RhdGUsIHBNYXRyaXgpOw0KKyAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRFRQX0hvdmVyZWQ6IHsNCisgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9Ib3ZlcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRFRQX1ByZXNzZWQ6IHsNCisgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9EVFBfRGlzYWJsZWQ6IHsNCisgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9EaXNhYmFsZTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgRHJhd0Fycm93QnRuKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsDQorICAgICAgICAgICAgICAgRldMVEhFTUVfRElSRUNUSU9OX0Rvd24sIGVTdGF0ZSwgcE1hdHJpeCk7DQogfQ0KICNlbHNlDQotdm9pZCBDRldMX0RhdGVUaW1lUGlja2VyVFA6OkRyYXdEcm9wRG93bkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIEZYX0JPT0wgYlByZXNzZWQgPSAoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0RUUF9QcmVzc2VkKSA9PSBGV0xfUEFSVFNUQVRFX0RUUF9QcmVzc2VkKTsNCi0gICAgRlhfRkxPQVQgZldpZHRoID0gIGJQcmVzc2VkID8gMS4wZiA6IDIuMGY7DQotICAgIEZXTFRIRU1FX0VER0UgZVR5cGUgPSBiUHJlc3NlZCA/IEZXTFRIRU1FX0VER0VfRmxhdCA6IEZXTFRIRU1FX0VER0VfUmFpc2VkOw0KLSAgICBEcmF3M0RSZWN0KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBlVHlwZSwgZldpZHRoLCAmcFBhcmFtcy0+bV9ydFBhcnQsIEZXTFRIRU1FX0NPTE9SX0VER0VMVDEsIEZXTFRIRU1FX0NPTE9SX0VER0VMVDIsIEZXTFRIRU1FX0NPTE9SX0VER0VSQjEsIEZXTFRIRU1FX0NPTE9SX0VER0VSQjIsIHBNYXRyaXgpOw0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShwUGFyYW1zLT5tX3J0UGFydC5sZWZ0ICsgZldpZHRoLCBwUGFyYW1zLT5tX3J0UGFydC50b3AgKyBmV2lkdGgsIHBQYXJhbXMtPm1fcnRQYXJ0LndpZHRoIC0gMiAqIGZXaWR0aCwgcFBhcmFtcy0+bV9ydFBhcnQuaGVpZ2h0IC0gMiAqIGZXaWR0aCk7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBDRlhfQ29sb3IgY3JGaWxsKEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQotICAgIEZYX0FSR0IgYXJnYkZpbGwgPSBBcmdiRW5jb2RlKDI1NSwgNzcsIDk3LCAxMzMpOw0KLSAgICBzd2l0Y2gocFBhcmFtcy0+bV9kd1N0YXRlcyAmIDB4MDMpIHsNCi0gICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsOiB7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9Ib3ZlcmVkOiB7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9QcmVzc2VkOiB7DQotICAgICAgICAgICAgICAgIGFyZ2JGaWxsID0gMHhGRjAwMDAwMDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9EaXNhYmxlZDogew0KLSAgICAgICAgICAgICAgICBhcmdiRmlsbCA9IDB4RkZGMEYwRjA7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6RHJhd0Ryb3BEb3duQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhfQk9PTCBiUHJlc3NlZCA9ICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfRFRQX1ByZXNzZWQpID09DQorICAgICAgICAgICAgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfRFRQX1ByZXNzZWQpOw0KKyAgRlhfRkxPQVQgZldpZHRoID0gYlByZXNzZWQgPyAxLjBmIDogMi4wZjsNCisgIEZXTFRIRU1FX0VER0UgZVR5cGUgPSBiUHJlc3NlZCA/IEZXTFRIRU1FX0VER0VfRmxhdCA6IEZXTFRIRU1FX0VER0VfUmFpc2VkOw0KKyAgRHJhdzNEUmVjdChwUGFyYW1zLT5tX3BHcmFwaGljcywgZVR5cGUsIGZXaWR0aCwgJnBQYXJhbXMtPm1fcnRQYXJ0LA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFTFQxLCBGV0xUSEVNRV9DT0xPUl9FREdFTFQyLA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFUkIxLCBGV0xUSEVNRV9DT0xPUl9FREdFUkIyLCBwTWF0cml4KTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFBhcmFtcy0+bV9ydFBhcnQubGVmdCArIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0LnRvcCArIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0LndpZHRoIC0gMiAqIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCAtIDIgKiBmV2lkdGgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3JGaWxsKEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICBGWF9BUkdCIGFyZ2JGaWxsID0gQXJnYkVuY29kZSgyNTUsIDc3LCA5NywgMTMzKTsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIDB4MDMpIHsNCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9Ob3JtYWw6IHsNCiAgICAgfQ0KLSAgICBEcmF3QXJyb3cocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgRldMVEhFTUVfRElSRUNUSU9OX0Rvd24sIGFyZ2JGaWxsLCBiUHJlc3NlZCwgcE1hdHJpeCk7DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9EVFBfSG92ZXJlZDogew0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9EVFBfUHJlc3NlZDogew0KKyAgICAgIGFyZ2JGaWxsID0gMHhGRjAwMDAwMDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRFRQX0Rpc2FibGVkOiB7DQorICAgICAgYXJnYkZpbGwgPSAweEZGRjBGMEYwOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBEcmF3QXJyb3cocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgRldMVEhFTUVfRElSRUNUSU9OX0Rvd24sDQorICAgICAgICAgICAgYXJnYkZpbGwsIGJQcmVzc2VkLCBwTWF0cml4KTsNCiB9DQogI2VuZGlmDQotdm9pZCBDRldMX0RhdGVUaW1lUGlja2VyVFA6OmluaXRUaGVtZURhdGEoKQ0KLXsNCi0gICAgRlhfRFdPUkQgKnBEYXRhID0gKEZYX0RXT1JEKikmbV9wVGhlbWVEYXRhLT5Cb3hCa0NvbG9yOw0KLSAgICAqcERhdGErKyA9IDAsICpwRGF0YSsrID0gMCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjIwLCAyMjAsIDIxNSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjIwLCAyMjAsIDIxNSksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDE3NiwgMTc2LCAxNjcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDE3NiwgMTc2LCAxNjcpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6aW5pdFRoZW1lRGF0YSgpIHsNCisgIEZYX0RXT1JEKiBwRGF0YSA9IChGWF9EV09SRCopJm1fcFRoZW1lRGF0YS0+Qm94QmtDb2xvcjsNCisgICpwRGF0YSsrID0gMCwgKnBEYXRhKysgPSAwLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9lZGl0dHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2VkaXR0cC5jcHAKaW5kZXggNTdhOTZiYy4uMTU1Y2Y1NyAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2VkaXR0cC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2VkaXR0cC5jcHAKQEAgLTUsODAgKzUsNzkgQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQogDQogI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQotQ0ZXTF9FZGl0VFA6OkNGV0xfRWRpdFRQKCkNCi17DQorQ0ZXTF9FZGl0VFA6OkNGV0xfRWRpdFRQKCkge30NCitDRldMX0VkaXRUUDo6fkNGV0xfRWRpdFRQKCkge30NCitGWF9CT09MIENGV0xfRWRpdFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9FZGl0Ow0KIH0NCi1DRldMX0VkaXRUUDo6fkNGV0xfRWRpdFRQKCkNCi17DQotfQ0KLUZYX0JPT0wJQ0ZXTF9FZGl0VFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCi0gICAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0VkaXQ7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9FZGl0VFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKQ0KLXsNCi0gICAgc3dpdGNoKHBQYXJhbXMtPm1faVBhcnQpIHsNCi0gICAgICAgIGNhc2UgRldMX1BBUlRfRURUX0JvcmRlcjogew0KLSAgICAgICAgICAgICAgICBEcmF3Qm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmIHBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0VEVF9FZGdlOiB7DQotICAgICAgICAgICAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfRURUX0JhY2tncm91bmQ6IHsNCi0gICAgICAgICAgICAgICAgaWYgKHBQYXJhbXMtPm1fcFBhdGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzID0gcFBhcmFtcy0+bV9wR3JhcGhpY3M7DQotICAgICAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgICAgICAgICAgICAgICAgICBDRlhfQ29sb3IgY3JTZWxlY3RlZChGV0xfR2V0VGhlbWVDb2xvcihtX2R3VGhlbWVJRCkgPT0gMCA/IEZXTFRIRU1FX0NPTE9SX0JLU2VsZWN0ZWQgOiBGV0xUSEVNRV9DT0xPUl9HcmVlbl9CS1NlbGVjdGVkKTsNCi0gICAgICAgICAgICAgICAgICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjclNlbGVjdGVkKTsNCi0gICAgICAgICAgICAgICAgICAgIHBHcmFwaGljcy0+RmlsbFBhdGgocFBhcmFtcy0+bV9wUGF0aCwgRlhGSUxMX1dJTkRJTkcsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGF0aWMgPSBwUGFyYW1zLT5tX2R3RGF0YSA9PSBGV0xfUEFSVERBVEFfRURUX1N0YXRpY0JhY2tncm91bmQ7DQotICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICAgICAgICAgICAgICAgICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgICAgICAgICAgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBQYXJhbXMtPm1fcnRQYXJ0LmxlZnQsIHBQYXJhbXMtPm1fcnRQYXJ0LnRvcCwgcFBhcmFtcy0+bV9ydFBhcnQud2lkdGgsIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCk7DQotICAgICAgICAgICAgICAgICAgICBDRlhfQ29sb3IgY3IoRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIWJTdGF0aWMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0VEVF9EaXNhYmxlKSA9PSBGV0xfUEFSVFNUQVRFX0VEVF9EaXNhYmxlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyLlNldChGV0xUSEVNRV9DT0xPUl9FREdFUkIxKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0VEVF9SZWFkT25seSkgPT0gRldMX1BBUlRTVEFURV9FRFRfUmVhZE9ubHkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3IuU2V0KEFyZ2JFbmNvZGUoMjU1LCAyMzYsIDIzMywgMjE2KSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3IuU2V0KDB4RkZGRkZGRkYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOw0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfRURUX0NvbWJUZXh0TGluZTogew0KLSAgICAgICAgICAgICAgICBGWF9BUkdCIGNyID0gMHhGRjAwMDAwMDsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoID0gMS4wZjsNCi0gICAgICAgICAgICAgICAgQ0ZYX0NvbG9yIGNyTGluZShjcik7DQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JMaW5lKTsNCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldExpbmVXaWR0aChmV2lkdGgpOw0KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aChwUGFyYW1zLT5tX3BQYXRoLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCitGWF9CT09MIENGV0xfRWRpdFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgc3dpdGNoIChwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgIGNhc2UgRldMX1BBUlRfRURUX0JvcmRlcjogew0KKyAgICAgIERyYXdCb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBGV0xfUEFSVF9FRFRfRWRnZTogew0KKyAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLA0KKyAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0VEVF9CYWNrZ3JvdW5kOiB7DQorICAgICAgaWYgKHBQYXJhbXMtPm1fcFBhdGgpIHsNCisgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzID0gcFBhcmFtcy0+bV9wR3JhcGhpY3M7DQorICAgICAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgICAgICBDRlhfQ29sb3IgY3JTZWxlY3RlZChGV0xfR2V0VGhlbWVDb2xvcihtX2R3VGhlbWVJRCkgPT0gMA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMVEhFTUVfQ09MT1JfQktTZWxlY3RlZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMVEhFTUVfQ09MT1JfR3JlZW5fQktTZWxlY3RlZCk7DQorICAgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JTZWxlY3RlZCk7DQorICAgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKHBQYXJhbXMtPm1fcFBhdGgsIEZYRklMTF9XSU5ESU5HLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9CT09MIGJTdGF0aWMgPQ0KKyAgICAgICAgICAgIHBQYXJhbXMtPm1fZHdEYXRhID09IEZXTF9QQVJUREFUQV9FRFRfU3RhdGljQmFja2dyb3VuZDsNCisgICAgICAgIENGWF9QYXRoIHBhdGg7DQorICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocFBhcmFtcy0+bV9ydFBhcnQubGVmdCwgcFBhcmFtcy0+bV9ydFBhcnQudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9ydFBhcnQud2lkdGgsIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCk7DQorICAgICAgICBDRlhfQ29sb3IgY3IoRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZCk7DQorICAgICAgICBpZiAoIWJTdGF0aWMpIHsNCisgICAgICAgICAgaWYgKChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9FRFRfRGlzYWJsZSkgPT0NCisgICAgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfRURUX0Rpc2FibGUpIHsNCisgICAgICAgICAgICBjci5TZXQoRldMVEhFTUVfQ09MT1JfRURHRVJCMSk7DQorICAgICAgICAgIH0gZWxzZSBpZiAoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0VEVF9SZWFkT25seSkgPT0NCisgICAgICAgICAgICAgICAgICAgICBGV0xfUEFSVFNUQVRFX0VEVF9SZWFkT25seSkgew0KKyAgICAgICAgICAgIGNyLlNldChBcmdiRW5jb2RlKDI1NSwgMjM2LCAyMzMsIDIxNikpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNyLlNldCgweEZGRkZGRkZGKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9FRFRfQ29tYlRleHRMaW5lOiB7DQorICAgICAgRlhfQVJHQiBjciA9IDB4RkYwMDAwMDA7DQorICAgICAgRlhfRkxPQVQgZldpZHRoID0gMS4wZjsNCisgICAgICBDRlhfQ29sb3IgY3JMaW5lKGNyKTsNCisgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyTGluZSk7DQorICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldExpbmVXaWR0aChmV2lkdGgpOw0KKyAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKHBQYXJhbXMtPm1fcFBhdGgsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyBicmVhazsgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9FZGl0VFA6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgSW5pdFRUTygpOw0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgQ0ZXTF9FZGl0VFA6OkluaXRpYWxpemUoKSB7DQorICBJbml0VFRPKCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSCUNGV0xfRWRpdFRQOjpGaW5hbGl6ZSgpDQotew0KLSAgICBGaW5hbGl6ZVRUTygpOw0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCitGV0xfRVJSIENGV0xfRWRpdFRQOjpGaW5hbGl6ZSgpIHsNCisgIEZpbmFsaXplVFRPKCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2Zvcm10cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZm9ybXRwLmNwcAppbmRleCBkYjE1MmVkLi42YmIzNzJkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZm9ybXRwLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZm9ybXRwLmNwcApAQCAtNSw3OTIgKzUsODgxIEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KLSNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfQ1hGb3JtQm9yZGVyCQkzDQotI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUZvcm1Cb3JkZXIJCTMNCi0jZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0NZTmFycm93Q2FwdGlvbgkxOA0KLSNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfQ1lDYXB0aW9uCQkJMjkNCi0jZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0JpZ0ljb25TaXplCQkzMg0KLSNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfU21hbGxJY29uU2l6ZQkJMTYNCi0jZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0Zvcm1UZXh0Q29sb3IJCTB4RkZGRkZGRkYNCi0jZGVmaW5lIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luCQkJCTUNCi0jZGVmaW5lIEZXTFRIRU1FX0ZPUk1CVE5fU3BhbgkJCQkyDQotI2RlZmluZSBGV0xUSEVNRV9GT1JNQlROX1NpemUJCQkJMjENCi1DRldMX0Zvcm1UUDo6Q0ZXTF9Gb3JtVFAoKQ0KLSAgICA6IG1fcEFjdGl2ZUJpdG1hcChOVUxMKQ0KLSAgICAsIG1fcERlYWN0aXZlYml0bWFwKE5VTEwpDQotew0KLSAgICBtX3BUaGVtZURhdGEgPSBGWF9ORVcgU0JUaGVtZURhdGE7DQotICAgIFNldFRoZW1lRGF0YSgwKTsNCi0gICAgbV9ydERpc0xCb3JkZXIuUmVzZXQoKTsNCi0gICAgbV9ydERpc1JCb3JkZXIuUmVzZXQoKTsNCi0gICAgbV9ydERpc0JCb3JkZXIuUmVzZXQoKTsNCi0gICAgbV9ydERpc0NhcHRpb24uUmVzZXQoKTsNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0NYRm9ybUJvcmRlciAzDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUZvcm1Cb3JkZXIgMw0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfQ1lOYXJyb3dDYXB0aW9uIDE4DQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24gMjkNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0JpZ0ljb25TaXplIDMyDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9TbWFsbEljb25TaXplIDE2DQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9Gb3JtVGV4dENvbG9yIDB4RkZGRkZGRkYNCisjZGVmaW5lIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luIDUNCisjZGVmaW5lIEZXTFRIRU1FX0ZPUk1CVE5fU3BhbiAyDQorI2RlZmluZSBGV0xUSEVNRV9GT1JNQlROX1NpemUgMjENCitDRldMX0Zvcm1UUDo6Q0ZXTF9Gb3JtVFAoKSA6IG1fcEFjdGl2ZUJpdG1hcChOVUxMKSwgbV9wRGVhY3RpdmViaXRtYXAoTlVMTCkgew0KKyAgbV9wVGhlbWVEYXRhID0gRlhfTkVXIFNCVGhlbWVEYXRhOw0KKyAgU2V0VGhlbWVEYXRhKDApOw0KKyAgbV9ydERpc0xCb3JkZXIuUmVzZXQoKTsNCisgIG1fcnREaXNSQm9yZGVyLlJlc2V0KCk7DQorICBtX3J0RGlzQkJvcmRlci5SZXNldCgpOw0KKyAgbV9ydERpc0NhcHRpb24uUmVzZXQoKTsNCiB9DQotQ0ZXTF9Gb3JtVFA6On5DRldMX0Zvcm1UUCgpDQotew0KLSAgICBpZiAobV9wVGhlbWVEYXRhKSB7DQotICAgICAgICBkZWxldGUgbV9wVGhlbWVEYXRhOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhID0gTlVMTDsNCitDRldMX0Zvcm1UUDo6fkNGV0xfRm9ybVRQKCkgew0KKyAgaWYgKG1fcFRoZW1lRGF0YSkgew0KKyAgICBkZWxldGUgbV9wVGhlbWVEYXRhOw0KKyAgICBtX3BUaGVtZURhdGEgPSBOVUxMOw0KKyAgfQ0KK30NCitGV0xfRVJSIENGV0xfRm9ybVRQOjpJbml0aWFsaXplKCkgew0KKyAgSW5pdFRUTygpOw0KKyAgSW5pdENhcHRpb24oVFJVRSk7DQorICBJbml0Q2FwdGlvbihGQUxTRSk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfRm9ybVRQOjpGaW5hbGl6ZSgpIHsNCisgIEZpbmFsaXplVFRPKCk7DQorICBpZiAobV9wQWN0aXZlQml0bWFwKSB7DQorICAgIGRlbGV0ZSBtX3BBY3RpdmVCaXRtYXA7DQorICAgIG1fcEFjdGl2ZUJpdG1hcCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wRGVhY3RpdmViaXRtYXApIHsNCisgICAgZGVsZXRlIG1fcERlYWN0aXZlYml0bWFwOw0KKyAgICBtX3BEZWFjdGl2ZWJpdG1hcCA9IE5VTEw7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCit9DQorRlhfQk9PTCBDRldMX0Zvcm1UUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGQUxTRSk7DQorICBGWF9EV09SRCBkd0hhc2ggPSBwV2lkZ2V0LT5HZXRDbGFzc0lEKCk7DQorICByZXR1cm4gZHdIYXNoID09IEZXTF9DTEFTU0hBU0hfRm9ybTsNCit9DQorRlhfRFdPUkQgQ0ZXTF9Gb3JtVFA6OlNldFRoZW1lSUQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUaGVtZUlELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoaWxkcmVuKSB7DQorICBpZiAobV9wVGhlbWVEYXRhKSB7DQorICAgIFNldFRoZW1lRGF0YShGV0xfR2V0VGhlbWVDb2xvcihkd1RoZW1lSUQpKTsNCisgIH0NCisgIEluaXRDYXB0aW9uKFRSVUUpOw0KKyAgSW5pdENhcHRpb24oRkFMU0UpOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OlNldFRoZW1lSUQocFdpZGdldCwgZHdUaGVtZUlELCBiQ2hpbGRyZW4pOw0KK30NCitGWF9CT09MIENGV0xfRm9ybVRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQorICBpbnQzMl90IGlBY3RpdmUgPSAwOw0KKyAgaWYgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0ZSTV9JbmFjdGl2ZSkgew0KKyAgICBpQWN0aXZlID0gMTsNCisgIH0NCisgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX05vcm1hbDsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIDB4MDMpIHsNCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0ZSTV9Ib3Zlcjogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0hvdmVyOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9GUk1fUHJlc3NlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX1ByZXNzZWQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0ZSTV9EaXNhYmxlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgY2FzZSBGV0xfUEFSVF9GUk1fQm9yZGVyOiB7DQorICAgICAgRHJhd0Zvcm1Cb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX21hdHJpeCwgaUFjdGl2ZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9GUk1fRWRnZTogew0KKyAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLA0KKyAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0ZSTV9CYWNrZ3JvdW5kOiB7DQorICAgICAgRmlsbEJhY2tncm91bmQocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwNCisgICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfRlJNX0NhcHRpb246IHsNCisgICAgICBEcmF3Q2FwdGlvbihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4LCBpQWN0aXZlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0ZSTV9OYXJyb3dDYXB0aW9uOiB7DQorICAgICAgRHJhd05hcnJvd0NhcHRpb24ocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX21hdHJpeCwgaUFjdGl2ZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9GUk1fQ2xvc2VCb3g6IHsNCisgICAgICBEcmF3Q2xvc2VCb3gocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9tYXRyaXgsIGlBY3RpdmUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfRlJNX01pbmltaXplQm94OiB7DQorICAgICAgRHJhd01pbmltaXplQm94KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4LCBpQWN0aXZlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveDogew0KKyAgICAgIERyYXdNYXhpbWl6ZUJveChwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fZHdEYXRhLCAmcFBhcmFtcy0+bV9tYXRyaXgsIGlBY3RpdmUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfRlJNX0ljb246IHsNCisgICAgICBEcmF3SWNvbkltYWdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BJbWFnZSwgJnBQYXJhbXMtPm1fcnRQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgsIGlBY3RpdmUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotRldMX0VSUglDRldMX0Zvcm1UUDo6SW5pdGlhbGl6ZSgpDQotew0KLSAgICBJbml0VFRPKCk7DQotICAgIEluaXRDYXB0aW9uKFRSVUUpOw0KLSAgICBJbml0Q2FwdGlvbihGQUxTRSk7DQotICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpJbml0aWFsaXplKCk7DQorRlhfQk9PTCBDRldMX0Zvcm1UUDo6RHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wVGV4dE91dCwgRkFMU0UpOw0KKyAgaWYgKHBQYXJhbXMtPm1faVBhcnQgPT0gRldMX1BBUlRfRlJNX0NhcHRpb24pIHsNCisgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKDB4RkZGRkZGRkYpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKDB4RkYwMDAwMDApOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkRyYXdUZXh0KHBQYXJhbXMpOw0KIH0NCi1GV0xfRVJSCUNGV0xfRm9ybVRQOjpGaW5hbGl6ZSgpDQotew0KLSAgICBGaW5hbGl6ZVRUTygpOw0KK3ZvaWQqIENGV0xfRm9ybVRQOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDYXBhY2l0eSkgew0KKyAgRlhfQk9PTCBiRGVmUHJvID0gRkFMU0U7DQorICBGWF9CT09MIGJEd29yZFZhbCA9IEZBTFNFOw0KKyAgc3dpdGNoIChkd0NhcGFjaXR5KSB7DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0NYQm9yZGVyOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9DWEZvcm1Cb3JkZXI7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXI6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0NZRm9ybUJvcmRlcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9GUk1fQ1lDYXB0aW9uOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb247DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZTmFycm93Q2FwdGlvbjogew0KKyAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQ1lDYXB0aW9uOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX1RleHRDb2xvcjogew0KKyAgICAgIGJEd29yZFZhbCA9IFRSVUU7DQorICAgICAgbV9kd1ZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfRm9ybVRleHRDb2xvcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9GUk1fQmlnSWNvbjogew0KKyAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQmlnSWNvblNpemU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRlJNX1NtYWxsSWNvbjogew0KKyAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfU21hbGxJY29uU2l6ZTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IGJEZWZQcm8gPSBUUlVFOyB9DQorICB9DQorICBpZiAoIWJEZWZQcm8pIHsNCisgICAgaWYgKGJEd29yZFZhbCkgew0KKyAgICAgIHJldHVybiAmbV9kd1ZhbHVlOw0KKyAgICB9DQorICAgIHJldHVybiAmbV9mVmFsdWU7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6R2V0Q2FwYWNpdHkocFRoZW1lUGFydCwgZHdDYXBhY2l0eSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtVFA6OkdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQYXJ0KSB7DQorICBzd2l0Y2ggKHBUaGVtZVBhcnQtPm1faVBhcnQpIHsNCisgICAgY2FzZSBGV0xfUEFSVF9GUk1fQ2xvc2VCb3g6IHsNCisgICAgICBDYWxDbG9zZUJveChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQsIHJ0UGFydCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9GUk1fTWF4aW1pemVCb3g6IHsNCisgICAgICBDYWxNYXhCb3gocFRoZW1lUGFydC0+bV9wV2lkZ2V0LCBydFBhcnQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfRlJNX01pbmltaXplQm94OiB7DQorICAgICAgQ2FsTWluQm94KHBUaGVtZVBhcnQtPm1fcFdpZGdldCwgcnRQYXJ0KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0ZSTV9IZWFkVGV4dDogew0KKyAgICAgIENhbENhcHRpb24ocFRoZW1lUGFydC0+bV9wV2lkZ2V0LCBydFBhcnQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfRlJNX0ljb246IHsNCisgICAgICBDYWxJY29uKHBUaGVtZVBhcnQtPm1fcFdpZGdldCwgcnRQYXJ0KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpDYWxDbG9zZUJveChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBGWF9EV09SRCBkd1N0eWxlcyA9IHBXaWRnZXQtPkdldFN0eWxlcygpOw0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICBydFdpZGdldC5PZmZzZXQoLXJ0V2lkZ2V0LmxlZnQsIC1ydFdpZGdldC50b3ApOw0KKyAgaWYgKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX0Nsb3NlQm94KSB7DQorICAgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArIEZXTFRIRU1FX0ZPUk1CVE5fU3BhbiwNCisgICAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSwNCisgICAgICAgICAgICAgRldMVEhFTUVfRk9STUJUTl9TaXplKTsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArIEZXTFRIRU1FX0ZPUk1CVE5fU3BhbiwNCisgICAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sIDAsIDApOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpDYWxNYXhCb3goSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcmVjdCkgew0KKyAgRlhfRFdPUkQgZHdTdHlsZXMgPSBwV2lkZ2V0LT5HZXRTdHlsZXMoKTsNCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgcnRXaWRnZXQuT2Zmc2V0KC1ydFdpZGdldC5sZWZ0LCAtcnRXaWRnZXQudG9wKTsNCisgIGlmIChkd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9NYXhpbWl6ZUJveCkgew0KKyAgICByZWN0LlNldChydFdpZGdldC5sZWZ0ICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4gKyBGV0xUSEVNRV9GT1JNQlROX1NpemUgKw0KKyAgICAgICAgICAgICAgICAgRldMVEhFTUVfRk9STUJUTl9TcGFuICogMiwNCisgICAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSwNCisgICAgICAgICAgICAgRldMVEhFTUVfRk9STUJUTl9TaXplKTsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSArDQorICAgICAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NwYW4gKiAyLA0KKyAgICAgICAgICAgICBydFdpZGdldC50b3AgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiwgMCwgMCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkNhbE1pbkJveChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBGWF9EV09SRCBkd1N0eWxlcyA9IHBXaWRnZXQtPkdldFN0eWxlcygpOw0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICBydFdpZGdldC5PZmZzZXQoLXJ0V2lkZ2V0LmxlZnQsIC1ydFdpZGdldC50b3ApOw0KKyAgaWYgKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX01pbmltaXplQm94KSB7DQorICAgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArDQorICAgICAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUgKiAyICsgRldMVEhFTUVfRk9STUJUTl9TcGFuICogMywNCisgICAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSwNCisgICAgICAgICAgICAgRldMVEhFTUVfRk9STUJUTl9TaXplKTsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArDQorICAgICAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUgKiAyICsgRldMVEhFTUVfRk9STUJUTl9TcGFuICogMywNCisgICAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sIDAsIDApOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpDYWxDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgcnRXaWRnZXQuT2Zmc2V0KC1ydFdpZGdldC5sZWZ0LCAtcnRXaWRnZXQudG9wKTsNCisgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiwNCisgICAgICAgICAgIHJ0V2lkZ2V0LnRvcCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luIC0gMiwNCisgICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoIC0gRldMVEhFTUVfRk9STUJUTl9NYXJnaW4gKiAyLA0KKyAgICAgICAgICAgRldMVEhFTUVfRk9STUJUTl9TaXplICsgMiAqIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luICsgNCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkNhbEljb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcmVjdCkge30NCit2b2lkIENGV0xfRm9ybVRQOjpEcmF3Rm9ybUJvcmRlcihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSkgew0KKyAgQ0ZYX1JlY3RGIHJ0Ow0KKyAgcnQuU2V0KHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCAxLCBwUmVjdC0+aGVpZ2h0KTsNCisgIEZYX0ZMT0FUIGZCb3R0b20sIGZSaWdodDsNCisgIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7DQorICBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNsckxpbmU7DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLk1vdmVUbyhwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCk7DQorICBwYXRoLkxpbmVUbyhwUmVjdC0+bGVmdCwgZkJvdHRvbSAtIDEpOw0KKyAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gMSwgZkJvdHRvbSAtIDEpOw0KKyAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gMSwgcFJlY3QtPnRvcCk7DQorICBjbHJMaW5lID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyW2lBY3RpdmVdWzJdOw0KKyAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTGluZSk7DQorICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5Nb3ZlVG8ocFJlY3QtPmxlZnQgKyAxLCBwUmVjdC0+dG9wKTsNCisgIHBhdGguTGluZVRvKHBSZWN0LT5sZWZ0ICsgMSwgZkJvdHRvbSAtIDIpOw0KKyAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gMiwgZkJvdHRvbSAtIDIpOw0KKyAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gMiwgcFJlY3QtPnRvcCk7DQorICBjbHJMaW5lID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyW2lBY3RpdmVdWzFdOw0KKyAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTGluZSk7DQorICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5Nb3ZlVG8ocFJlY3QtPmxlZnQgKyAyLCBwUmVjdC0+dG9wKTsNCisgIHBhdGguTGluZVRvKHBSZWN0LT5sZWZ0ICsgMiwgZkJvdHRvbSAtIDMpOw0KKyAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gMywgZkJvdHRvbSAtIDMpOw0KKyAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gMywgcFJlY3QtPnRvcCk7DQorICBjbHJMaW5lID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyW2lBY3RpdmVdWzBdOw0KKyAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTGluZSk7DQorICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5Nb3ZlVG8ocFJlY3QtPmxlZnQgKyAzLCBwUmVjdC0+dG9wKTsNCisgIHBhdGguTGluZVRvKHBSZWN0LT5sZWZ0ICsgMywgZkJvdHRvbSAtIDQpOw0KKyAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gNCwgZkJvdHRvbSAtIDQpOw0KKyAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gNCwgcFJlY3QtPnRvcCk7DQorICBjbHJMaW5lID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyW2lBY3RpdmVdWzRdOw0KKyAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTGluZSk7DQorICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgbV9ydERpc0xCb3JkZXIuU2V0KHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wICsgMjksIDQsIHBSZWN0LT5oZWlnaHQgLSAyOSk7DQorICBtX3J0RGlzUkJvcmRlci5TZXQocFJlY3QtPnJpZ2h0KCkgLSA0LCBwUmVjdC0+dG9wICsgMjksIDQsDQorICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPmhlaWdodCAtIDI5KTsNCisgIG1fcnREaXNCQm9yZGVyLlNldChwUmVjdC0+bGVmdCwgcFJlY3QtPmJvdHRvbSgpIC0gNCwgcFJlY3QtPndpZHRoLCA0KTsNCisgIG1fcnREaXNDYXB0aW9uLlNldChwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCAyOSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkRyYXdDYXB0aW9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQWN0aXZlKSB7DQorICBDRlhfUmVjdEYgcnQ7DQorICBGWF9GTE9BVCBmQm90dG9tLCBmUmlnaHQ7DQorICBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOw0KKyAgZlJpZ2h0ID0gcFJlY3QtPnJpZ2h0KCk7DQorICBydC5TZXQocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgMSk7DQorICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFtpQWN0aXZlXVswXSwgJnJ0LA0KKyAgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgIHJ0Lk9mZnNldCgwLCAxKTsNCisgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wW2lBY3RpdmVdWzFdLCAmcnQsDQorICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgcnQuT2Zmc2V0KDAsIDEpOw0KKyAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbaUFjdGl2ZV1bMl0sICZydCwNCisgICAgICAgICAgICAgICAgcE1hdHJpeCk7DQorICBydC5TZXQocFJlY3QtPmxlZnQsIHBSZWN0LT5ib3R0b20oKSAtIDEsIHBSZWN0LT53aWR0aCwgMSk7DQorICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVtpQWN0aXZlXVsyXSwgJnJ0LA0KKyAgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgIHJ0Lk9mZnNldCgwLCAtMSk7DQorICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVtpQWN0aXZlXVsxXSwgJnJ0LA0KKyAgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgIHJ0LlNldChwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgMSwgcFJlY3QtPmhlaWdodCk7DQorICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbaUFjdGl2ZV1bMl0sICZydCwNCisgICAgICAgICAgICAgICAgcE1hdHJpeCk7DQorICBydC5TZXQocFJlY3QtPmxlZnQgKyAxLCBwUmVjdC0+dG9wICsgMSwgMSwgZkJvdHRvbSAtIDEpOw0KKyAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0W2lBY3RpdmVdWzFdLCAmcnQsDQorICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgcnQuU2V0KHBSZWN0LT5sZWZ0ICsgMiwgcFJlY3QtPnRvcCArIDIsIDEsIGZCb3R0b20gLSAyKTsNCisgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFtpQWN0aXZlXVswXSwgJnJ0LA0KKyAgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgIHJ0LlNldChmUmlnaHQgLSAxLCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KKyAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFtpQWN0aXZlXVsyXSwgJnJ0LA0KKyAgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgIHJ0LlNldChmUmlnaHQgLSAyLCBwUmVjdC0+dG9wICsgMSwgMSwgZkJvdHRvbSAtIDEpOw0KKyAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFtpQWN0aXZlXVsxXSwgJnJ0LA0KKyAgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgIHJ0LlNldChmUmlnaHQgLSAzLCBwUmVjdC0+dG9wICsgMiwgMSwgZkJvdHRvbSAtIDIpOw0KKyAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFtpQWN0aXZlXVswXSwgJnJ0LA0KKyAgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgIENGWF9SZWN0RiByZWN0KCpwUmVjdCk7DQorICByZWN0LlNldChyZWN0LmxlZnQgKyAzLCByZWN0LnRvcCArIDMsIHJlY3Qud2lkdGggLSA2LCByZWN0LmhlaWdodCAtIDUpOw0KKyAgaWYgKGlBY3RpdmUgPT0gMCkgew0KKyAgICBwR3JhcGhpY3MtPlN0cmV0Y2hJbWFnZShtX3BBY3RpdmVCaXRtYXAsIHJlY3QsIHBNYXRyaXgpOw0KKyAgfSBlbHNlIHsNCisgICAgcEdyYXBoaWNzLT5TdHJldGNoSW1hZ2UobV9wRGVhY3RpdmViaXRtYXAsIHJlY3QsIHBNYXRyaXgpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpEcmF3TmFycm93Q2FwdGlvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSkge30NCit2b2lkIENGV0xfRm9ybVRQOjpEcmF3Q2xvc2VCb3goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQWN0aXZlKSB7DQorICBGWF9GTE9BVCBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCisgIEZYX0ZMT0FUIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7DQorICBGWF9GTE9BVCBmV2lkdGggPSBwUmVjdC0+d2lkdGg7DQorICBGWF9GTE9BVCBmSGVpZ2h0ID0gcFJlY3QtPmhlaWdodDsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9SZWN0RiBydCgqcFJlY3QpOw0KKyAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMS4wZik7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBydC50b3AsIGZXaWR0aCAtIDIsIDEpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wICsgMSwgMSwgZkhlaWdodCAtIDIpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMSwgcnQudG9wICsgMSwgMSwgZkhlaWdodCAtIDIpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDEsIGZCb3R0b20gLSAxLCBmV2lkdGggLSAyLCAxKTsNCisgIENGWF9Db2xvciBjckZpbGw7DQorICBjckZpbGwgPSBtX3BUaGVtZURhdGEtPmNsckJ0bkVkZ2VPdXRbaUFjdGl2ZV07DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBhdGguQ2xlYXIoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBydC50b3AgKyAxLCAxLCAxKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIHJ0LnRvcCArIDEsIDEsIDEpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDEsIGZCb3R0b20gLSAyLCAxLCAxKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIGZCb3R0b20gLSAyLCAxLCAxKTsNCisgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbaUFjdGl2ZV1bZVN0YXRlIC0gMV07DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBhdGguQ2xlYXIoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAyLCBydC50b3AgKyAxLCBmV2lkdGggLSA0LCAxKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBydC50b3AgKyAyLCAxLCBmSGVpZ2h0IC0gNCk7DQorICBjckZpbGwgPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbaUFjdGl2ZV1bZVN0YXRlIC0gMV07DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBhdGguQ2xlYXIoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIHJ0LnRvcCArIDIsIDEsIGZIZWlnaHQgLSA0KTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAyLCBmQm90dG9tIC0gMiwgZldpZHRoIC0gNCwgMSk7DQorICBjckZpbGwgPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1tpQWN0aXZlXVtlU3RhdGUgLSAxXTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyAyLCBwUmVjdC0+dG9wICsgMiwgZldpZHRoIC0gNCwgZkhlaWdodCAtIDQpOw0KKyAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsIHBSZWN0LT5sZWZ0ICsgMiwgcFJlY3QtPnRvcCArIDIsIGZSaWdodCAtIDIsDQorICAgICAgICAgICAgICAgICAgIGZCb3R0b20gLSAyLA0KKyAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0W2lBY3RpdmVdW2VTdGF0ZSAtIDFdLA0KKyAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFtpQWN0aXZlXVtlU3RhdGUgLSAxXSwgJnBhdGgsDQorICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIENGWF9SZWN0RiBydFgoKnBSZWN0KTsNCisgIHJ0WC5JbmZsYXRlKC01LCAtNSk7DQorICBGWF9GTE9BVCBmUiA9IHJ0WC5yaWdodCgpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgRlhfRkxPQVQgZnJ0WFJpZ2h0ID0gcnRYLnJpZ2h0KCk7DQorICBGWF9GTE9BVCBmcnRYQm90dG9tID0gcnRYLmJvdHRvbSgpOw0KKyAgcGF0aC5BZGRMaW5lKHJ0WC5sZWZ0LCBydFgudG9wICsgMSwgZnJ0WFJpZ2h0IC0gMSwgZnJ0WEJvdHRvbSk7DQorICBwYXRoLkFkZExpbmUocnRYLmxlZnQsIHJ0WC50b3AsIGZydFhSaWdodCwgZnJ0WEJvdHRvbSk7DQorICBwYXRoLkFkZExpbmUocnRYLmxlZnQgKyAxLCBydFgudG9wLCBmcnRYUmlnaHQsIGZydFhCb3R0b20gLSAxKTsNCisgIHBhdGguQWRkTGluZShydFgubGVmdCwgZnJ0WEJvdHRvbSAtIDEsIGZydFhSaWdodCAtIDEsIHJ0WC50b3ApOw0KKyAgcGF0aC5BZGRMaW5lKHJ0WC5sZWZ0LCBmcnRYQm90dG9tLCBmcnRYUmlnaHQsIHJ0WC50b3ApOw0KKyAgcGF0aC5BZGRMaW5lKHJ0WC5sZWZ0ICsgMSwgZnJ0WEJvdHRvbSwgZnJ0WFJpZ2h0LCBydFgudG9wICsgMSk7DQorICBDRlhfQ29sb3IgY2xyTGluZSgweGZmZmZmZmZmKTsNCisgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEuMGYpOw0KKyAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTGluZSk7DQorICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpEcmF3TWluTWF4Qm94Q29tbW9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBY3RpdmUpIHsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIEZYX0ZMT0FUIGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOw0KKyAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IHBSZWN0LT53aWR0aDsNCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBwUmVjdC0+aGVpZ2h0Ow0KKyAgQ0ZYX1JlY3RGIHJ0KCpwUmVjdCk7DQorICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxLjBmKTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDEsIHJ0LnRvcCwgZldpZHRoIC0gMiwgMSk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0LCBydC50b3AgKyAxLCAxLCBmSGVpZ2h0IC0gMik7DQorICBwYXRoLkFkZFJlY3RhbmdsZShmUmlnaHQgLSAxLCBydC50b3AgKyAxLCAxLCBmSGVpZ2h0IC0gMik7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgZkJvdHRvbSAtIDEsIGZXaWR0aCAtIDIsIDEpOw0KKyAgQ0ZYX0NvbG9yIGNyRmlsbDsNCisgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuRWRnZU91dFtpQWN0aXZlXTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDEsIHJ0LnRvcCArIDEsIDEsIDEpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMiwgcnQudG9wICsgMSwgMSwgMSk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgZkJvdHRvbSAtIDIsIDEsIDEpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMiwgZkJvdHRvbSAtIDIsIDEsIDEpOw0KKyAgY3JGaWxsID0gbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFtpQWN0aXZlXVtlU3RhdGUgLSAxXTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDIsIHJ0LnRvcCArIDEsIGZXaWR0aCAtIDQsIDEpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDEsIHJ0LnRvcCArIDIsIDEsIGZIZWlnaHQgLSA0KTsNCisgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbaUFjdGl2ZV1bZVN0YXRlIC0gMV07DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBhdGguQ2xlYXIoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIHJ0LnRvcCArIDIsIDEsIGZIZWlnaHQgLSA0KTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAyLCBmQm90dG9tIC0gMiwgZldpZHRoIC0gNCwgMSk7DQorICBjckZpbGwgPSBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbaUFjdGl2ZV1bZVN0YXRlIC0gMV07DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIHBhdGguQ2xlYXIoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgMiwgcFJlY3QtPnRvcCArIDIsIGZXaWR0aCAtIDQsIGZIZWlnaHQgLSA0KTsNCisgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLCBwUmVjdC0+bGVmdCArIDIsIHBSZWN0LT50b3AgKyAyLCBmUmlnaHQgLSAyLA0KKyAgICAgICAgICAgICAgICAgICBmQm90dG9tIC0gMiwNCisgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbaUFjdGl2ZV1bZVN0YXRlIC0gMV0sDQorICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFtpQWN0aXZlXVtlU3RhdGUgLSAxXSwgJnBhdGgsDQorICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX0Zvcm1UUDo6RHJhd01pbmltaXplQm94KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSkgew0KKyAgRHJhd01pbk1heEJveENvbW1vbihwR3JhcGhpY3MsIHBSZWN0LCBlU3RhdGUsIHBNYXRyaXgpOw0KKyAgQ0ZYX1JlY3RGIHJ0TWluOw0KKyAgcnRNaW4uU2V0KHBSZWN0LT5sZWZ0ICsgNSwgcFJlY3QtPnRvcCArIDEzLCBwUmVjdC0+d2lkdGggLSAxNCwNCisgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0IC0gMTgpOw0KKyAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIDB4RkZGRkZGRkYsICZydE1pbiwgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkRyYXdNYXhpbWl6ZUJveChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNYXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSkgew0KKyAgRHJhd01pbk1heEJveENvbW1vbihwR3JhcGhpY3MsIHBSZWN0LCBlU3RhdGUsIHBNYXRyaXgpOw0KKyAgRlhfRkxPQVQgZldpZHRoID0gcFJlY3QtPndpZHRoOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IHBSZWN0LT5oZWlnaHQ7DQorICBpZiAoYk1heCkgew0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBwYXRoLkFkZExpbmUocFJlY3QtPmxlZnQgKyA3LCBwUmVjdC0+dG9wICsgNiwgcFJlY3QtPmxlZnQgKyAxNCwNCisgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AgKyA2KTsNCisgICAgcGF0aC5BZGRMaW5lKHBSZWN0LT5sZWZ0ICsgNCwgcFJlY3QtPnRvcCArIDksIHBSZWN0LT5sZWZ0ICsgMTEsDQorICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wICsgOSk7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMik7DQorICAgIENGWF9Db2xvciBjclN0cm9rZSgweEZGRkZGRkZGKTsNCisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JTdHJva2UpOw0KKyAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxKTsNCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLkFkZExpbmUocFJlY3QtPmxlZnQgKyA0LCBwUmVjdC0+dG9wICsgMTAsIHBSZWN0LT5sZWZ0ICsgNCwNCisgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AgKyAxNCk7DQorICAgIHBhdGguQWRkTGluZShwUmVjdC0+bGVmdCArIDEwLCBwUmVjdC0+dG9wICsgMTAsIHBSZWN0LT5sZWZ0ICsgMTAsDQorICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wICsgMTQpOw0KKyAgICBwYXRoLkFkZExpbmUocFJlY3QtPmxlZnQgKyAxMywgcFJlY3QtPnRvcCArIDcsIHBSZWN0LT5sZWZ0ICsgMTMsDQorICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wICsgMTEpOw0KKyAgICBwYXRoLkFkZExpbmUocFJlY3QtPmxlZnQgKyA0LCBwUmVjdC0+dG9wICsgMTQsIHBSZWN0LT5sZWZ0ICsgMTAsDQorICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wICsgMTQpOw0KKyAgICBwYXRoLkFkZExpbmUocFJlY3QtPmxlZnQgKyAxMiwgcFJlY3QtPnRvcCArIDExLCBwUmVjdC0+bGVmdCArIDEyLA0KKyAgICAgICAgICAgICAgICAgcFJlY3QtPnRvcCArIDExKTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1JlY3RGIHJ0TWF4KCpwUmVjdCk7DQorICAgIHJ0TWF4LkluZmxhdGUoLTUsIC01KTsNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyA1LCBwUmVjdC0+dG9wICsgNSwgZldpZHRoIC0gMTAsDQorICAgICAgICAgICAgICAgICAgICAgIGZIZWlnaHQgLSAxMCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgNiwgcFJlY3QtPnRvcCArIDgsIGZXaWR0aCAtIDEyLA0KKyAgICAgICAgICAgICAgICAgICAgICBmSGVpZ2h0IC0gMTQpOw0KKyAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIENGWF9Db2xvciBjckZpbGwoMHhGRkZGRkZGRik7DQorICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpEcmF3SWNvbkltYWdlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSkgew0KKyAgcEdyYXBoaWNzLT5TdHJldGNoSW1hZ2UocERJQml0bWFwLCAqcFJlY3QsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCkgew0KKyAgbV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlID0gQXJnYkVuY29kZSgweDY1LCAyNTUsIDI1NSwgMjU1KTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI0MCwgMTY2LCAxNDgpOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIyOCwgNjEsIDUpOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAxODQsIDE3Nik7DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjUyLCAxMDcsIDcxKTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0MSwgNDQsIDIwKTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAyMDIsIDcyLCAzMyk7DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMTIyLCAxMDcpOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIxOCwgNzcsIDU0KTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCA5MywgNzQpOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIxOCwgNzQsIDUxKTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTkxLCA2MSwgMjgpOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDkzLCAzMCwgMTMpOw0KKyAgaWYgKGR3SUQpIHsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NCwgMjA1LCAxNDkpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTcwLCAxODQsIDEzMSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNjgsIDE4MiwgMTI4KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bM10gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NCwgMjA1LCAxNDkpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTE3LCAxNDEsIDk0KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEzOSwgMTYxLCAxMDUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTcxLCAxODksIDEzMyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTU1LCAxNzUsIDEyNSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxNDYsIDEwMyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgOTQsIDExOCwgNzkpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxMzksIDE2MSwgMTA1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjM0LCAyNDUsIDIwMSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NCwgMjA1LCAxNDkpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNzUsIDE4OSwgMTMzKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTUzLCAxNjgsIDEyMSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1MCwgMTY4LCAxMDMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTgyLCAxOTUsIDE2Mik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxNDQsIDg0KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIzNCwgMjQxLCAyMDgpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2OSwgMTg2LCAxMTIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTk5LCAxOTksIDE5MCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTMzLCAxNDgsIDg4KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTYzLCAxNzYsIDEzNyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTE4LCAxMzUsIDgzKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTU0LCAxNzQsIDEwNSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTU0LCAxNzQsIDEwNSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE3MiwgMTkzLCAxMjMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1NCwgMTc0LCAxMDUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyMjAsIDIyMCwgMjIwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIyNSwgMjI1LCAyMjUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkVkZ2VPdXRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDExNywgMTQxLCA5NCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTM5LCAxNjEsIDEwNSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTcxLCAxODksIDEzMyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVszXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTY0LCAxNzgsIDEyNyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVs0XSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlckxpZ2h0WzBdID0gQXJnYkVuY29kZSgweGZmLCAxNzEsIDE4OSwgMTMzKTsNCisgIH0gZWxzZSB7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAzLCAxMTQsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAwLCA4NSwgMjI2KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDg1LCAyMjYpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVszXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMywgMTE0LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMzIsIDIwMCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAwLCA2MSwgMjIwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDU0LCAyMTApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDU2LCAyMzQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDUwLCAxOTMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDE5LCAxMzkpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAwLCA4OCwgMjM4KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgNjMsIDE1MSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMywgMTE0LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAwLCA5NiwgMjUyKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgNjMsIDE1MSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgNjcsIDIwNyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCA0OSwgMTEyKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCA4NywgMTg4KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1NCwgMTgzLCAyNTApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE3LCAxMTAsIDI0OCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNjQsIDE5NCwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyOSwgMTU4LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCA2OCwgMTIwLCAyNDUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI0LCA3MiwgMTg3KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgNzIsIDEyMiwgMjQ1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAzNSwgODcsIDE5NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDYwLCAxMTQsIDI0NCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjEsIDcwLCAxODUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyMjAsIDIyMCwgMjIwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIyNSwgMjI1LCAyMjUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkVkZ2VPdXRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDcyLCAyNDEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDYxLCAyMjApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDMwLCAxNjApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bM10gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDE5LCAxNDApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bNF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJMaWdodFswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjIsIDEwNiwgMjM5KTsNCisgIH0NCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzBdWzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFswXVswXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFswXVsxXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzBdWzJdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFswXVsyXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFsxXVswXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzBdWzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMV1bMF0gPQ0KKyAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzBdWzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzFdWzFdID0NCisgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMF1bMV07DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1sxXVsxXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMF1bMV07DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMV1bMl0gPQ0KKyAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFswXVsyXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzFdWzJdID0NCisgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1swXVsyXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMF07DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1sxXVsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsyXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzNdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bM107DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFsxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzBdWzJdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsxXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMF1bMF07DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMF07DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMV07DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFswXVswXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFsxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVswXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVsxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFsxXVsyXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFsxXVswXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMF1bMF07DQorICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMF07DQorICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFsxXVsxXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMF1bMV07DQorICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMF1bMV07DQorICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzFdWzBdID0NCisgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzBdWzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzFdWzBdID0NCisgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMF1bMF07DQorICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzFdWzFdID0NCisgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzFdWzFdID0NCisgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMF1bMV07DQorICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzFdWzJdID0NCisgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzBdWzJdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzFdWzJdID0NCisgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVswXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFsxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsckJ0bkVkZ2VPdXRbMV0gPSBtX3BUaGVtZURhdGEtPmNsckJ0bkVkZ2VPdXRbMF07DQorICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMF07DQorICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMV07DQorICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bM10gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bM107DQorICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bNF0gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bNF07DQorICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJMaWdodFsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlckxpZ2h0WzBdOw0KKyAgRGVhY3RpdmVGb3JtKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkRlYWN0aXZlRm9ybSgpIHsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMF0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1sxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzJdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bM10pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMF0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzFdWzBdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFsxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFsxXVswXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzFdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVsxXVswXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzFdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMV1bMF0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMV1bMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzFdWzBdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFsxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFsxXVswXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzFdWzFdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzFdWzBdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFsxXVswXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzFdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckJ0bkVkZ2VPdXRbMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzBdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzNdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVs0XSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJMaWdodFsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzFdWzBdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMV1bMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFsxXVsyXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFsxXVswXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFsxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFsxXVsyXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMV1bMF0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzFdWzFdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFsxXVsyXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1sxXVswXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1sxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1sxXVsyXSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OlRyYW5zTW9kZUNvbG9yKEZYX0FSR0IgY2xyRm9yZSwgRlhfQVJHQiYgY2xyQmFjaykgew0KKyAgaW50MzJfdCBpQWxmYUYsIGlSRiwgaUdGLCBpQkY7DQorICBpbnQzMl90IGlBbGZhQiwgaVJCLCBpR0IsIGlCQjsNCisgIEFyZ2JEZWNvZGUoY2xyRm9yZSwgaUFsZmFGLCBpUkYsIGlHRiwgaUJGKTsNCisgIEFyZ2JEZWNvZGUoY2xyQmFjaywgaUFsZmFCLCBpUkIsIGlHQiwgaUJCKTsNCisgIGNsckJhY2sgPSBBcmdiRW5jb2RlKDB4ZmYsIGlSQiArIChpUkYgLSBpUkIpICogaUFsZmFGIC8gMjU1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaUdCICsgKGlHRiAtIGlHQikgKiBpQWxmYUYgLyAyNTUsDQorICAgICAgICAgICAgICAgICAgICAgICBpQkIgKyAoaUJGIC0gaUJCKSAqIGlBbGZhRiAvIDI1NSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkluaXRDYXB0aW9uKEZYX0JPT0wgYkFjdGl2ZSkgew0KKyAgaWYgKGJBY3RpdmUpIHsNCisgICAgQ0ZYX0Z4Z2VEZXZpY2UgZGV2Ow0KKyAgICBDRlhfR3JhcGhpY3MgZ3M7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQogICAgIGlmIChtX3BBY3RpdmVCaXRtYXApIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BBY3RpdmVCaXRtYXA7DQotICAgICAgICBtX3BBY3RpdmVCaXRtYXAgPSBOVUxMOw0KKyAgICAgIGRlbGV0ZSBtX3BBY3RpdmVCaXRtYXA7DQorICAgICAgbV9wQWN0aXZlQml0bWFwID0gTlVMTDsNCiAgICAgfQ0KKyAgICBtX3BBY3RpdmVCaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOw0KKyAgICBtX3BBY3RpdmVCaXRtYXAtPkNyZWF0ZSgxLCBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24sIEZYRElCX0FyZ2IpOw0KKyAgICBkZXYuQXR0YWNoKG1fcEFjdGl2ZUJpdG1hcCk7DQorICAgIGdzLkNyZWF0ZSgmZGV2KTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUoMCwgMCwgMSwgNSk7DQorICAgIERyYXdBeGlhbFNoYWRpbmcoJmdzLCAwLCAwLCAwLCA1LCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVswXSwNCisgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsxXSwgJnBhdGgpOw0KKyAgICBwYXRoLkNsZWFyKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKDAsIDUsIDEsIDE1KTsNCisgICAgRHJhd0F4aWFsU2hhZGluZygmZ3MsIDAsIDUsIDAsIDIwLCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsxXSwNCisgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsyXSwgJnBhdGgpOw0KKyAgICBwYXRoLkNsZWFyKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKDAsIDIwLCAxLCBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24gLSAxOSk7DQorICAgIERyYXdBeGlhbFNoYWRpbmcoJmdzLCAwLCAyMCwgMCwgRldMVEhFTUVfQ0FQQUNJVFlfQ1lDYXB0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzJdLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzNdLCAmcGF0aCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfRnhnZURldmljZSBkZXY7DQorICAgIENGWF9HcmFwaGljcyBnczsNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCiAgICAgaWYgKG1fcERlYWN0aXZlYml0bWFwKSB7DQotICAgICAgICBkZWxldGUgbV9wRGVhY3RpdmViaXRtYXA7DQotICAgICAgICBtX3BEZWFjdGl2ZWJpdG1hcCA9IE5VTEw7DQorICAgICAgZGVsZXRlIG1fcERlYWN0aXZlYml0bWFwOw0KKyAgICAgIG1fcERlYWN0aXZlYml0bWFwID0gTlVMTDsNCiAgICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCi19DQotRlhfQk9PTAlDRldMX0Zvcm1UUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRkFMU0UpOw0KLSAgICBGWF9EV09SRCBkd0hhc2ggPSBwV2lkZ2V0LT5HZXRDbGFzc0lEKCk7DQotICAgIHJldHVybiBkd0hhc2ggPT0gRldMX0NMQVNTSEFTSF9Gb3JtOw0KLX0NCi1GWF9EV09SRCBDRldMX0Zvcm1UUDo6U2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRFdPUkQgZHdUaGVtZUlELCBGWF9CT09MIGJDaGlsZHJlbiApDQotew0KLSAgICBpZiAobV9wVGhlbWVEYXRhKSB7DQotICAgICAgICBTZXRUaGVtZURhdGEoRldMX0dldFRoZW1lQ29sb3IoZHdUaGVtZUlEKSk7DQotICAgIH0NCi0gICAgSW5pdENhcHRpb24oVFJVRSk7DQotICAgIEluaXRDYXB0aW9uKEZBTFNFKTsNCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OlNldFRoZW1lSUQocFdpZGdldCwgZHdUaGVtZUlELCBiQ2hpbGRyZW4pOw0KLX0NCi1GWF9CT09MIENGV0xfRm9ybVRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KLSAgICBpbnQzMl90IGlBY3RpdmUgPSAwOw0KLSAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfRlJNX0luYWN0aXZlKSB7DQotICAgICAgICBpQWN0aXZlID0gMTsNCi0gICAgfQ0KLSAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9Ob3JtYWw7DQotICAgIHN3aXRjaCAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIDB4MDMpIHsNCi0gICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9GUk1fSG92ZXI6IHsNCi0gICAgICAgICAgICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfSG92ZXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9GUk1fUHJlc3NlZDogew0KLSAgICAgICAgICAgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRlJNX0Rpc2FibGVkOiB7DQotICAgICAgICAgICAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotICAgIHN3aXRjaChwUGFyYW1zLT5tX2lQYXJ0KSB7DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9Cb3JkZXI6IHsNCi0gICAgICAgICAgICAgICAgRHJhd0Zvcm1Cb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgsIGlBY3RpdmUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9FZGdlOiB7DQotICAgICAgICAgICAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfRlJNX0JhY2tncm91bmQ6IHsNCi0gICAgICAgICAgICAgICAgRmlsbEJhY2tncm91bmQocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9GUk1fQ2FwdGlvbjogew0KLSAgICAgICAgICAgICAgICBEcmF3Q2FwdGlvbihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCwgaUFjdGl2ZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfRlJNX05hcnJvd0NhcHRpb246IHsNCi0gICAgICAgICAgICAgICAgRHJhd05hcnJvd0NhcHRpb24ocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgsIGlBY3RpdmUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9DbG9zZUJveDogew0KLSAgICAgICAgICAgICAgICBEcmF3Q2xvc2VCb3gocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgsIGlBY3RpdmUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9NaW5pbWl6ZUJveDogew0KLSAgICAgICAgICAgICAgICBEcmF3TWluaW1pemVCb3gocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgsIGlBY3RpdmUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveDogew0KLSAgICAgICAgICAgICAgICBEcmF3TWF4aW1pemVCb3gocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLCBwUGFyYW1zLT5tX2R3RGF0YSwgJnBQYXJhbXMtPm1fbWF0cml4LCBpQWN0aXZlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9GUk1fSWNvbjogew0KLSAgICAgICAgICAgICAgICBEcmF3SWNvbkltYWdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BJbWFnZSwgJnBQYXJhbXMtPm1fcnRQYXJ0LCBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCwgaUFjdGl2ZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Gb3JtVFA6OkRyYXdUZXh0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BUZXh0T3V0LCBGQUxTRSk7DQotICAgIGlmIChwUGFyYW1zLT5tX2lQYXJ0ID09IEZXTF9QQVJUX0ZSTV9DYXB0aW9uKSB7DQotICAgICAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoMHhGRkZGRkZGRik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoMHhGRjAwMDAwMCk7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkRyYXdUZXh0KHBQYXJhbXMpOw0KLX0NCi12b2lkKiBDRldMX0Zvcm1UUDo6R2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpDQotew0KLSAgICBGWF9CT09MIGJEZWZQcm8gPSBGQUxTRTsNCi0gICAgRlhfQk9PTCBiRHdvcmRWYWwgPSBGQUxTRTsNCi0gICAgc3dpdGNoKGR3Q2FwYWNpdHkpIHsNCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0NYQm9yZGVyOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQ1hGb3JtQm9yZGVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9DWUJvcmRlcjogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0NZRm9ybUJvcmRlcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZQ2FwdGlvbjogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0NZQ2FwdGlvbjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZTmFycm93Q2FwdGlvbjogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0NZQ2FwdGlvbjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVGV4dENvbG9yOiB7DQotICAgICAgICAgICAgICAgIGJEd29yZFZhbCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIG1fZHdWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0Zvcm1UZXh0Q29sb3I7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0ZSTV9CaWdJY29uOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQmlnSWNvblNpemU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0ZSTV9TbWFsbEljb246IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9TbWFsbEljb25TaXplOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIGJEZWZQcm8gPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoIWJEZWZQcm8pIHsNCi0gICAgICAgIGlmIChiRHdvcmRWYWwpIHsNCi0gICAgICAgICAgICByZXR1cm4gJm1fZHdWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAmbV9mVmFsdWU7DQotICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkdldENhcGFjaXR5KHBUaGVtZVBhcnQsIGR3Q2FwYWNpdHkpOw0KLX0NCi1GV0xfRVJSCUNGV0xfRm9ybVRQOjpHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgQ0ZYX1JlY3RGJiBydFBhcnQpDQotew0KLSAgICBzd2l0Y2gocFRoZW1lUGFydC0+bV9pUGFydCkgew0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9GUk1fQ2xvc2VCb3g6IHsNCi0gICAgICAgICAgICAgICAgQ2FsQ2xvc2VCb3gocFRoZW1lUGFydC0+bV9wV2lkZ2V0LCBydFBhcnQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveDogew0KLSAgICAgICAgICAgICAgICBDYWxNYXhCb3gocFRoZW1lUGFydC0+bV9wV2lkZ2V0LCBydFBhcnQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9NaW5pbWl6ZUJveDogew0KLSAgICAgICAgICAgICAgICBDYWxNaW5Cb3gocFRoZW1lUGFydC0+bV9wV2lkZ2V0LCBydFBhcnQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0ZSTV9IZWFkVGV4dDogew0KLSAgICAgICAgICAgICAgICBDYWxDYXB0aW9uKHBUaGVtZVBhcnQtPm1fcFdpZGdldCwgcnRQYXJ0KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9GUk1fSWNvbjogew0KLSAgICAgICAgICAgICAgICBDYWxJY29uKHBUaGVtZVBhcnQtPm1fcFdpZGdldCwgcnRQYXJ0KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtVFA6OkNhbENsb3NlQm94KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBGWF9EV09SRCBkd1N0eWxlcyA9IHBXaWRnZXQtPkdldFN0eWxlcygpOw0KLSAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQotICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KLSAgICBydFdpZGdldC5PZmZzZXQoLXJ0V2lkZ2V0LmxlZnQsIC1ydFdpZGdldC50b3ApOw0KLSAgICBpZiAoZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQ2xvc2VCb3gpIHsNCi0gICAgICAgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArIEZXTFRIRU1FX0ZPUk1CVE5fU3BhbiwNCi0gICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LnRvcCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luLA0KLSAgICAgICAgICAgICAgICAgRldMVEhFTUVfRk9STUJUTl9TaXplLA0KLSAgICAgICAgICAgICAgICAgRldMVEhFTUVfRk9STUJUTl9TaXplKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArIEZXTFRIRU1FX0ZPUk1CVE5fU3BhbiwNCi0gICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LnRvcCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luLA0KLSAgICAgICAgICAgICAgICAgMCwNCi0gICAgICAgICAgICAgICAgIDApOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtVFA6OkNhbE1heEJveChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdTdHlsZXMgPSBwV2lkZ2V0LT5HZXRTdHlsZXMoKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KLSAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCi0gICAgcnRXaWRnZXQuT2Zmc2V0KC1ydFdpZGdldC5sZWZ0LCAtcnRXaWRnZXQudG9wKTsNCi0gICAgaWYgKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX01heGltaXplQm94KSB7DQotICAgICAgICByZWN0LlNldChydFdpZGdldC5sZWZ0ICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4gKyBGV0xUSEVNRV9GT1JNQlROX1NpemUgKyBGV0xUSEVNRV9GT1JNQlROX1NwYW4gKiAyLA0KLSAgICAgICAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sDQotICAgICAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUsDQotICAgICAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmVjdC5TZXQocnRXaWRnZXQubGVmdCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luICsgRldMVEhFTUVfRk9STUJUTl9TaXplICsgRldMVEhFTUVfRk9STUJUTl9TcGFuICogMiwNCi0gICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LnRvcCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luLA0KLSAgICAgICAgICAgICAgICAgMCwNCi0gICAgICAgICAgICAgICAgIDApOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtVFA6OkNhbE1pbkJveChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdTdHlsZXMgPSBwV2lkZ2V0LT5HZXRTdHlsZXMoKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KLSAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCi0gICAgcnRXaWRnZXQuT2Zmc2V0KC1ydFdpZGdldC5sZWZ0LCAtcnRXaWRnZXQudG9wKTsNCi0gICAgaWYgKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX01pbmltaXplQm94KSB7DQotICAgICAgICByZWN0LlNldChydFdpZGdldC5sZWZ0ICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4gKyBGV0xUSEVNRV9GT1JNQlROX1NpemUgKiAyICsgRldMVEhFTUVfRk9STUJUTl9TcGFuICogMywNCi0gICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LnRvcCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luLA0KLSAgICAgICAgICAgICAgICAgRldMVEhFTUVfRk9STUJUTl9TaXplLA0KLSAgICAgICAgICAgICAgICAgRldMVEhFTUVfRk9STUJUTl9TaXplKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSAqIDIgKyBGV0xUSEVNRV9GT1JNQlROX1NwYW4gKiAzLA0KLSAgICAgICAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4sDQotICAgICAgICAgICAgICAgICAwLA0KLSAgICAgICAgICAgICAgICAgMCk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0Zvcm1UUDo6Q2FsQ2FwdGlvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KLSAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCi0gICAgcnRXaWRnZXQuT2Zmc2V0KC1ydFdpZGdldC5sZWZ0LCAtcnRXaWRnZXQudG9wKTsNCi0gICAgcmVjdC5TZXQocnRXaWRnZXQubGVmdCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luLA0KLSAgICAgICAgICAgICBydFdpZGdldC50b3AgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiAtIDIsDQotICAgICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoIC0gRldMVEhFTUVfRk9STUJUTl9NYXJnaW4gKiAyLA0KLSAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUgKyAyICogRldMVEhFTUVfRk9STUJUTl9NYXJnaW4gKyA0KTsNCi19DQotdm9pZCBDRldMX0Zvcm1UUDo6Q2FsSWNvbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi19DQotdm9pZCBDRldMX0Zvcm1UUDo6RHJhd0Zvcm1Cb3JkZXIoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgaW50MzJfdCBpQWN0aXZlKQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0Ow0KLSAgICBydC5TZXQocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIDEsIHBSZWN0LT5oZWlnaHQpOw0KLSAgICBGWF9GTE9BVCBmQm90dG9tLCBmUmlnaHQ7DQotICAgIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7DQotICAgIGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOw0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBDRlhfQ29sb3IgY2xyTGluZTsNCisgICAgbV9wRGVhY3RpdmViaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOw0KKyAgICBtX3BEZWFjdGl2ZWJpdG1hcC0+Q3JlYXRlKDEsIEZXTFRIRU1FX0NBUEFDSVRZX0NZQ2FwdGlvbiwgRlhESUJfQXJnYik7DQorICAgIGRldi5BdHRhY2gobV9wRGVhY3RpdmViaXRtYXApOw0KKyAgICBncy5DcmVhdGUoJmRldik7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKDAsIDAsIDEsIDUpOw0KKyAgICBEcmF3QXhpYWxTaGFkaW5nKCZncywgMCwgMCwgMCwgNSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMF0sDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMV0sICZwYXRoKTsNCiAgICAgcGF0aC5DbGVhcigpOw0KLSAgICBwYXRoLk1vdmVUbyhwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCk7DQotICAgIHBhdGguTGluZVRvKHBSZWN0LT5sZWZ0LCBmQm90dG9tIC0gMSk7DQotICAgIHBhdGguTGluZVRvKGZSaWdodCAtIDEsIGZCb3R0b20gLSAxKTsNCi0gICAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gMSwgcFJlY3QtPnRvcCk7DQotICAgIGNsckxpbmUgPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbaUFjdGl2ZV1bMl07DQotICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckxpbmUpOw0KLSAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCA1LCAxLCAxNSk7DQorICAgIERyYXdBeGlhbFNoYWRpbmcoJmdzLCAwLCA1LCAwLCAyMCwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMV0sDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMl0sICZwYXRoKTsNCiAgICAgcGF0aC5DbGVhcigpOw0KLSAgICBwYXRoLk1vdmVUbyhwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3ApOw0KLSAgICBwYXRoLkxpbmVUbyhwUmVjdC0+bGVmdCArIDEsIGZCb3R0b20gLSAyKTsNCi0gICAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gMiwgZkJvdHRvbSAtIDIpOw0KLSAgICBwYXRoLkxpbmVUbyhmUmlnaHQgLSAyLCBwUmVjdC0+dG9wKTsNCi0gICAgY2xyTGluZSA9IG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlcltpQWN0aXZlXVsxXTsNCi0gICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTGluZSk7DQotICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQotICAgIHBhdGguQ2xlYXIoKTsNCi0gICAgcGF0aC5Nb3ZlVG8ocFJlY3QtPmxlZnQgKyAyLCBwUmVjdC0+dG9wKTsNCi0gICAgcGF0aC5MaW5lVG8ocFJlY3QtPmxlZnQgKyAyLCBmQm90dG9tIC0gMyk7DQotICAgIHBhdGguTGluZVRvKGZSaWdodCAtIDMsIGZCb3R0b20gLSAzKTsNCi0gICAgcGF0aC5MaW5lVG8oZlJpZ2h0IC0gMywgcFJlY3QtPnRvcCk7DQotICAgIGNsckxpbmUgPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbaUFjdGl2ZV1bMF07DQotICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckxpbmUpOw0KLSAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KLSAgICBwYXRoLkNsZWFyKCk7DQotICAgIHBhdGguTW92ZVRvKHBSZWN0LT5sZWZ0ICsgMywgcFJlY3QtPnRvcCk7DQotICAgIHBhdGguTGluZVRvKHBSZWN0LT5sZWZ0ICsgMywgZkJvdHRvbSAtIDQpOw0KLSAgICBwYXRoLkxpbmVUbyhmUmlnaHQgLSA0LCBmQm90dG9tIC0gNCk7DQotICAgIHBhdGguTGluZVRvKGZSaWdodCAtIDQsIHBSZWN0LT50b3ApOw0KLSAgICBjbHJMaW5lID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyW2lBY3RpdmVdWzRdOw0KLSAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMaW5lKTsNCi0gICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgbV9ydERpc0xCb3JkZXIuU2V0KHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wICsgMjksIDQsIHBSZWN0LT5oZWlnaHQgLSAyOSk7DQotICAgIG1fcnREaXNSQm9yZGVyLlNldChwUmVjdC0+cmlnaHQoKSAtIDQsIHBSZWN0LT50b3AgKyAyOSwgNCwgcFJlY3QtPmhlaWdodCAtIDI5KTsNCi0gICAgbV9ydERpc0JCb3JkZXIuU2V0KHBSZWN0LT5sZWZ0LCBwUmVjdC0+Ym90dG9tKCkgLSA0LCBwUmVjdC0+d2lkdGgsIDQpOw0KLSAgICBtX3J0RGlzQ2FwdGlvbi5TZXQocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgMjkpOw0KLX0NCi12b2lkIENGV0xfRm9ybVRQOjpEcmF3Q2FwdGlvbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgaW50MzJfdCBpQWN0aXZlKQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0Ow0KLSAgICBGWF9GTE9BVCAgZkJvdHRvbSwgZlJpZ2h0Ow0KLSAgICBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOw0KLSAgICBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCi0gICAgcnQuU2V0KHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIDEpOw0KLSAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFtpQWN0aXZlXVswXSwgJnJ0LCBwTWF0cml4KTsNCi0gICAgcnQuT2Zmc2V0KDAsIDEpOw0KLSAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFtpQWN0aXZlXVsxXSwgJnJ0LCBwTWF0cml4KTsNCi0gICAgcnQuT2Zmc2V0KDAsIDEpOw0KLSAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFtpQWN0aXZlXVsyXSwgJnJ0LCBwTWF0cml4KTsNCi0gICAgcnQuU2V0KHBSZWN0LT5sZWZ0LCBwUmVjdC0+Ym90dG9tKCkgLSAxLCBwUmVjdC0+d2lkdGgsIDEpOw0KLSAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVtpQWN0aXZlXVsyXSwgJnJ0LCBwTWF0cml4KTsNCi0gICAgcnQuT2Zmc2V0KDAsIC0xKTsNCi0gICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21baUFjdGl2ZV1bMV0sICZydCwgcE1hdHJpeCk7DQotICAgIHJ0LlNldChwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgMSwgcFJlY3QtPmhlaWdodCk7DQotICAgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFtpQWN0aXZlXVsyXSwgJnJ0LCBwTWF0cml4KTsNCi0gICAgcnQuU2V0KHBSZWN0LT5sZWZ0ICsgMSwgcFJlY3QtPnRvcCArIDEsIDEsIGZCb3R0b20gLSAxKTsNCi0gICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0W2lBY3RpdmVdWzFdLCAmcnQsIHBNYXRyaXgpOw0KLSAgICBydC5TZXQocFJlY3QtPmxlZnQgKyAyLCBwUmVjdC0+dG9wICsgMiwgMSwgZkJvdHRvbSAtIDIpOw0KLSAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbaUFjdGl2ZV1bMF0sICZydCwgcE1hdHJpeCk7DQotICAgIHJ0LlNldChmUmlnaHQgLSAxLCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KLSAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0W2lBY3RpdmVdWzJdLCAmcnQsIHBNYXRyaXgpOw0KLSAgICBydC5TZXQoZlJpZ2h0IC0gMiwgcFJlY3QtPnRvcCArIDEsIDEsIGZCb3R0b20gLSAxKTsNCi0gICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFtpQWN0aXZlXVsxXSwgJnJ0LCBwTWF0cml4KTsNCi0gICAgcnQuU2V0KGZSaWdodCAtIDMsIHBSZWN0LT50b3AgKyAyLCAxLCBmQm90dG9tIC0gMik7DQotICAgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbaUFjdGl2ZV1bMF0sICZydCwgcE1hdHJpeCk7DQotICAgIENGWF9SZWN0RiByZWN0KCpwUmVjdCk7DQotICAgIHJlY3QuU2V0KHJlY3QubGVmdCArIDMsIHJlY3QudG9wICsgMywgcmVjdC53aWR0aCAtIDYsIHJlY3QuaGVpZ2h0IC0gNSk7DQotICAgIGlmIChpQWN0aXZlID09IDApIHsNCi0gICAgICAgIHBHcmFwaGljcy0+U3RyZXRjaEltYWdlKG1fcEFjdGl2ZUJpdG1hcCwgcmVjdCwgcE1hdHJpeCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwR3JhcGhpY3MtPlN0cmV0Y2hJbWFnZShtX3BEZWFjdGl2ZWJpdG1hcCwgcmVjdCwgcE1hdHJpeCk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0Zvcm1UUDo6RHJhd05hcnJvd0NhcHRpb24oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXgsIGludDMyX3QgaUFjdGl2ZSkNCi17DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtVFA6OkRyYXdDbG9zZUJveChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgaW50MzJfdCBpQWN0aXZlKQ0KLXsNCi0gICAgRlhfRkxPQVQgZlJpZ2h0ID0gcFJlY3QtPnJpZ2h0KCk7DQotICAgIEZYX0ZMT0FUIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7DQotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBSZWN0LT53aWR0aDsNCi0gICAgRlhfRkxPQVQgZkhlaWdodCA9IHBSZWN0LT5oZWlnaHQ7DQotICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0KCpwUmVjdCk7DQotICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEuMGYpOw0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgcnQudG9wLCBmV2lkdGggLSAyLCAxKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wICsgMSwgMSwgZkhlaWdodCAtIDIpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShmUmlnaHQgLSAxLCBydC50b3AgKyAxLCAxLCBmSGVpZ2h0IC0gMik7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBmQm90dG9tIC0gMSwgZldpZHRoIC0gMiwgMSk7DQotICAgIENGWF9Db2xvciBjckZpbGw7DQotICAgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuRWRnZU91dFtpQWN0aXZlXTsNCi0gICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQotICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgcGF0aC5DbGVhcigpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgcnQudG9wICsgMSwgMSwgMSk7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIHJ0LnRvcCArIDEsIDEsIDEpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgZkJvdHRvbSAtIDIsIDEsIDEpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShmUmlnaHQgLSAyLCBmQm90dG9tIC0gMiwgMSwgMSk7DQotICAgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbaUFjdGl2ZV1bZVN0YXRlIC0gMV07DQotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIHBhdGguQ2xlYXIoKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDIsIHJ0LnRvcCArIDEsIGZXaWR0aCAtIDQsIDEpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgcnQudG9wICsgMiwgMSwgZkhlaWdodCAtIDQpOw0KLSAgICBjckZpbGwgPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbaUFjdGl2ZV1bZVN0YXRlIC0gMV07DQotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIHBhdGguQ2xlYXIoKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMiwgcnQudG9wICsgMiwgMSwgZkhlaWdodCAtIDQpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMiwgZkJvdHRvbSAtIDIsIGZXaWR0aCAtIDQsIDEpOw0KLSAgICBjckZpbGwgPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1tpQWN0aXZlXVtlU3RhdGUgLSAxXTsNCi0gICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQotICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgcGF0aC5DbGVhcigpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDIsIHBSZWN0LT50b3AgKyAyLCBmV2lkdGggLSA0LCBmSGVpZ2h0IC0gNCk7DQotICAgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLA0KLSAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5sZWZ0ICsgMiwNCi0gICAgICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wICsgMiwNCi0gICAgICAgICAgICAgICAgICAgICBmUmlnaHQgLSAyLA0KLSAgICAgICAgICAgICAgICAgICAgIGZCb3R0b20gLSAyLA0KLSAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbaUFjdGl2ZV1bZVN0YXRlIC0gMV0sDQotICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbaUFjdGl2ZV1bZVN0YXRlIC0gMV0sDQotICAgICAgICAgICAgICAgICAgICAgJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgQ0ZYX1JlY3RGIHJ0WCgqcFJlY3QpOw0KLSAgICBydFguSW5mbGF0ZSgtNSwgLTUpOw0KLSAgICBGWF9GTE9BVCBmUiA9IHJ0WC5yaWdodCgpOw0KLSAgICBwYXRoLkNsZWFyKCk7DQotICAgIEZYX0ZMT0FUIGZydFhSaWdodCA9IHJ0WC5yaWdodCgpOw0KLSAgICBGWF9GTE9BVCBmcnRYQm90dG9tID0gcnRYLmJvdHRvbSgpOw0KLSAgICBwYXRoLkFkZExpbmUocnRYLmxlZnQsIHJ0WC50b3AgKyAxLCBmcnRYUmlnaHQgLSAxLCBmcnRYQm90dG9tKTsNCi0gICAgcGF0aC5BZGRMaW5lKHJ0WC5sZWZ0LCBydFgudG9wLCBmcnRYUmlnaHQsIGZydFhCb3R0b20pOw0KLSAgICBwYXRoLkFkZExpbmUocnRYLmxlZnQgKyAxLCBydFgudG9wLCBmcnRYUmlnaHQsIGZydFhCb3R0b20gLSAxKTsNCi0gICAgcGF0aC5BZGRMaW5lKHJ0WC5sZWZ0LCBmcnRYQm90dG9tIC0gMSwgZnJ0WFJpZ2h0IC0gMSwgcnRYLnRvcCk7DQotICAgIHBhdGguQWRkTGluZShydFgubGVmdCwgZnJ0WEJvdHRvbSwgZnJ0WFJpZ2h0LCBydFgudG9wKTsNCi0gICAgcGF0aC5BZGRMaW5lKHJ0WC5sZWZ0ICsgMSwgZnJ0WEJvdHRvbSwgZnJ0WFJpZ2h0LCBydFgudG9wICsgMSk7DQotICAgIENGWF9Db2xvciBjbHJMaW5lKDB4ZmZmZmZmZmYpOw0KLSAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxLjBmKTsNCi0gICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTGluZSk7DQotICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQotICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi19DQotdm9pZCBDRldMX0Zvcm1UUDo6RHJhd01pbk1heEJveENvbW1vbihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCwgaW50MzJfdCBpQWN0aXZlKQ0KLXsNCi0gICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBGWF9GTE9BVCBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCi0gICAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCi0gICAgRlhfRkxPQVQgZldpZHRoID0gcFJlY3QtPndpZHRoOw0KLSAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gcFJlY3QtPmhlaWdodDsNCi0gICAgQ0ZYX1JlY3RGIHJ0KCpwUmVjdCk7DQotICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEuMGYpOw0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgcnQudG9wLCBmV2lkdGggLSAyLCAxKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wICsgMSwgMSwgZkhlaWdodCAtIDIpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShmUmlnaHQgLSAxLCBydC50b3AgKyAxLCAxLCBmSGVpZ2h0IC0gMik7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBmQm90dG9tIC0gMSwgZldpZHRoIC0gMiwgMSk7DQotICAgIENGWF9Db2xvciBjckZpbGw7DQotICAgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuRWRnZU91dFtpQWN0aXZlXTsNCi0gICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQotICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgcGF0aC5DbGVhcigpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgcnQudG9wICsgMSwgMSwgMSk7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIHJ0LnRvcCArIDEsIDEsIDEpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgZkJvdHRvbSAtIDIsIDEsIDEpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShmUmlnaHQgLSAyLCBmQm90dG9tIC0gMiwgMSwgMSk7DQotICAgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbaUFjdGl2ZV1bZVN0YXRlIC0gMV07DQotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIHBhdGguQ2xlYXIoKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDIsIHJ0LnRvcCArIDEsIGZXaWR0aCAtIDQsIDEpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgcnQudG9wICsgMiwgMSwgZkhlaWdodCAtIDQpOw0KLSAgICBjckZpbGwgPSBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0W2lBY3RpdmVdW2VTdGF0ZSAtIDFdOw0KLSAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCi0gICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KLSAgICBwYXRoLkNsZWFyKCk7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIHJ0LnRvcCArIDIsIDEsIGZIZWlnaHQgLSA0KTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDIsIGZCb3R0b20gLSAyLCBmV2lkdGggLSA0LCAxKTsNCi0gICAgY3JGaWxsID0gbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrW2lBY3RpdmVdW2VTdGF0ZSAtIDFdOw0KLSAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCi0gICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KLSAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQotICAgIHBhdGguQ2xlYXIoKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyAyLCBwUmVjdC0+dG9wICsgMiwgZldpZHRoIC0gNCwgZkhlaWdodCAtIDQpOw0KLSAgICBEcmF3QXhpYWxTaGFkaW5nKHBHcmFwaGljcywNCi0gICAgICAgICAgICAgICAgICAgICBwUmVjdC0+bGVmdCArIDIsDQotICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPnRvcCArIDIsDQotICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0IC0gMiwNCi0gICAgICAgICAgICAgICAgICAgICBmQm90dG9tIC0gMiwNCi0gICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFtpQWN0aXZlXVtlU3RhdGUgLSAxXSwNCi0gICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbaUFjdGl2ZV1bZVN0YXRlIC0gMV0sDQotICAgICAgICAgICAgICAgICAgICAgJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi19DQotdm9pZCBDRldMX0Zvcm1UUDo6RHJhd01pbmltaXplQm94KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4LCBpbnQzMl90IGlBY3RpdmUpDQotew0KLSAgICBEcmF3TWluTWF4Qm94Q29tbW9uKHBHcmFwaGljcywgcFJlY3QsIGVTdGF0ZSwgcE1hdHJpeCk7DQotICAgIENGWF9SZWN0RiBydE1pbjsNCi0gICAgcnRNaW4uU2V0KHBSZWN0LT5sZWZ0ICsgNSwgcFJlY3QtPnRvcCArIDEzLCBwUmVjdC0+d2lkdGggLSAxNCwgcFJlY3QtPmhlaWdodCAtIDE4KTsNCi0gICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIDB4RkZGRkZGRkYsICZydE1pbiwgcE1hdHJpeCk7DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtVFA6OkRyYXdNYXhpbWl6ZUJveChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgRlhfQk9PTCBiTWF4LCBDRlhfTWF0cml4ICpwTWF0cml4LCBpbnQzMl90IGlBY3RpdmUpDQotew0KLSAgICBEcmF3TWluTWF4Qm94Q29tbW9uKHBHcmFwaGljcywgcFJlY3QsIGVTdGF0ZSwgcE1hdHJpeCk7DQotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBSZWN0LT53aWR0aDsNCi0gICAgRlhfRkxPQVQgZkhlaWdodCA9IHBSZWN0LT5oZWlnaHQ7DQotICAgIGlmIChiTWF4KSB7DQotICAgICAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICAgICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgICAgIHBhdGguQWRkTGluZShwUmVjdC0+bGVmdCArIDcsIHBSZWN0LT50b3AgKyA2LCBwUmVjdC0+bGVmdCArIDE0LCBwUmVjdC0+dG9wICsgNik7DQotICAgICAgICBwYXRoLkFkZExpbmUocFJlY3QtPmxlZnQgKyA0LCBwUmVjdC0+dG9wICsgOSwgcFJlY3QtPmxlZnQgKyAxMSwgcFJlY3QtPnRvcCArIDkpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMik7DQotICAgICAgICBDRlhfQ29sb3IgY3JTdHJva2UoMHhGRkZGRkZGRik7DQotICAgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjclN0cm9rZSk7DQotICAgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMSk7DQotICAgICAgICBwYXRoLkNsZWFyKCk7DQotICAgICAgICBwYXRoLkFkZExpbmUocFJlY3QtPmxlZnQgKyA0LCBwUmVjdC0+dG9wICsgMTAsIHBSZWN0LT5sZWZ0ICsgNCwgcFJlY3QtPnRvcCArIDE0KTsNCi0gICAgICAgIHBhdGguQWRkTGluZShwUmVjdC0+bGVmdCArIDEwLCBwUmVjdC0+dG9wICsgMTAsIHBSZWN0LT5sZWZ0ICsgMTAsIHBSZWN0LT50b3AgKyAxNCk7DQotICAgICAgICBwYXRoLkFkZExpbmUocFJlY3QtPmxlZnQgKyAxMywgcFJlY3QtPnRvcCArIDcsIHBSZWN0LT5sZWZ0ICsgMTMsIHBSZWN0LT50b3AgKyAxMSk7DQotICAgICAgICBwYXRoLkFkZExpbmUocFJlY3QtPmxlZnQgKyA0LCBwUmVjdC0+dG9wICsgMTQsIHBSZWN0LT5sZWZ0ICsgMTAsIHBSZWN0LT50b3AgKyAxNCk7DQotICAgICAgICBwYXRoLkFkZExpbmUocFJlY3QtPmxlZnQgKyAxMiwgcFJlY3QtPnRvcCArIDExLCBwUmVjdC0+bGVmdCArIDEyLCBwUmVjdC0+dG9wICsgMTEpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9SZWN0RiBydE1heCgqcFJlY3QpOw0KLSAgICAgICAgcnRNYXguSW5mbGF0ZSgtNSwgLTUpOw0KLSAgICAgICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgICAgIHBhdGguQ3JlYXRlKCk7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDUsIHBSZWN0LT50b3AgKyA1LCBmV2lkdGggLSAxMCwgZkhlaWdodCAtIDEwKTsNCi0gICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgNiwgcFJlY3QtPnRvcCArIDgsIGZXaWR0aCAtIDEyLCBmSGVpZ2h0IC0gMTQpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICAgICAgQ0ZYX0NvbG9yIGNyRmlsbCgweEZGRkZGRkZGKTsNCi0gICAgICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQotICAgICAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0Zvcm1UUDo6RHJhd0ljb25JbWFnZShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgQ0ZYX0RJQml0bWFwICpwRElCaXRtYXAsICBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4LCBpbnQzMl90IGlBY3RpdmUpDQotew0KLSAgICBwR3JhcGhpY3MtPlN0cmV0Y2hJbWFnZShwRElCaXRtYXAsICpwUmVjdCwgcE1hdHJpeCk7DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtVFA6OlNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKQ0KLXsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlID0gQXJnYkVuY29kZSgweDY1LCAyNTUsIDI1NSwgMjU1KTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjQwLCAxNjYsIDE0OCk7DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyMjgsIDYxLCA1KTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAxODQsIDE3Nik7DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyNTIsIDEwNywgNzEpOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNDEsIDQ0LCAyMCk7DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAyMDIsIDcyLCAzMyk7DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAxMjIsIDEwNyk7DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyMTgsIDc3LCA1NCk7DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCA5MywgNzQpOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1swXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjE4LCA3NCwgNTEpOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5MSwgNjEsIDI4KTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDkzLCAzMCwgMTMpOw0KLSAgICBpZiAoZHdJRCkgew0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NCwgMjA1LCAxNDkpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE3MCwgMTg0LCAxMzEpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2OCwgMTgyLCAxMjgpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bM10gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NCwgMjA1LCAxNDkpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDExNywgMTQxLCA5NCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTM5LCAxNjEsIDEwNSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTcxLCAxODksIDEzMyk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1NSwgMTc1LCAxMjUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxMjgsIDE0NiwgMTAzKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgOTQsIDExOCwgNzkpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTM5LCAxNjEsIDEwNSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyMzQsIDI0NSwgMjAxKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NCwgMjA1LCAxNDkpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTc1LCAxODksIDEzMyApOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTUzLCAxNjgsIDEyMSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNTAsIDE2OCwgMTAzKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxODIsIDE5NSwgMTYyKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxNDQsIDg0KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyMzQsIDI0MSwgMjA4KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTY5LCAxODYsIDExMik7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTk5LCAxOTksIDE5MCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEzMywgMTQ4LCA4OCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNjMsIDE3NiwgMTM3KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTE4LCAxMzUsIDgzKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1NCwgMTc0LCAxMDUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNTQsIDE3NCwgMTA1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE3MiwgMTkzLCAxMjMpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNTQsIDE3NCwgMTA1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIyMCwgMjIwLCAyMjApOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAyNTUsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAyMjUsIDIyNSwgMjI1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuRWRnZU91dFswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAyNTUsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDExNywgMTQxLCA5NCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEzOSwgMTYxLCAxMDUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNzEsIDE4OSwgMTMzKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVszXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTY0LCAxNzgsIDEyNyk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bNF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyTGlnaHRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE3MSwgMTg5LCAxMzMpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDMsIDExNCwgMjU1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAwLCA4NSwgMjI2KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCA4NSwgMjI2KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzNdID0gQXJnYkVuY29kZSgweGZmLCAzLCAxMTQsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMzIsIDIwMCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgNjEsIDIyMCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgNTQsIDIxMCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDU2LCAyMzQpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAwLCA1MCwgMTkzKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMTksIDEzOSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAwLCA4OCwgMjM4KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDYzLCAxNTEsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAzLCAxMTQsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAwLCA5NiwgMjUyKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDYzLCAxNTEsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCA2NywgMjA3KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCA0OSwgMTEyKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgODcsIDE4OCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTU0LCAxODMsIDI1MCApOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNywgMTEwLCAyNDgpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2NCwgMTk0LCAyNTUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyOSwgMTU4LCAyNTUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgNjgsIDEyMCwgMjQ1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjQsIDcyLCAxODcpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgNzIsIDEyMiwgMjQ1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMzUsIDg3LCAxOTUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgNjAsIDExNCwgMjQ0KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjEsIDcwLCAxODUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjIwLCAyMjAsIDIyMCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyNTUsIDI1NSwgMjU1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIyNSwgMjI1LCAyMjUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0WzBdID0gQXJnYkVuY29kZSgweGZmLCAyNTUsIDI1NSwgMjU1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgNzIsIDI0MSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDYxLCAyMjApOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCAzMCwgMTYwKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVszXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMTksIDE0MCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bNF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyTGlnaHRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIyLCAxMDYsIDIzOSk7DQotICAgIH0NCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMF1bMF07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMF1bMF07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzBdWzFdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFsxXVsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzBdWzFdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFswXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFswXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzBdWzBdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1sxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzBdWzBdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMF1bMV07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMF1bMV07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFsxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFswXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1swXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVswXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsxXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bM10gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVszXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsxXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVswXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzBdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMV07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFsxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFswXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMF07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzFdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFswXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMF1bMF07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzFdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFswXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzJdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzBdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMF07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMF1bMV07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFsxXVsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVsxXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMF07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVswXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFsxXVsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMV07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVsxXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFsxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMl07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVsyXSA9IG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMF07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzFdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVsyXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0WzFdID0gbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0WzBdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bMF0gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMF07DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVsxXSA9IG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVsxXTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzJdOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bM10gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bM107DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVs0XSA9IG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclswXVs0XTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyTGlnaHRbMV0gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJMaWdodFswXTsNCi0gICAgRGVhY3RpdmVGb3JtKCk7DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtVFA6OkRlYWN0aXZlRm9ybSgpDQotew0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzBdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1sxXVsxXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMl0pOw0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzNdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFsxXVswXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMV0pOw0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzFdWzJdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMV1bMF0pOw0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFsxXVsxXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzFdWzJdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzBdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzFdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzJdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzBdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzFdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzJdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFsxXVswXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMV1bMV0pOw0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzFdWzJdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMF0pOw0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFsxXVsxXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzFdWzJdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzFdWzBdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzFdWzFdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzFdWzJdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMV1bMF0pOw0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVsxXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzFdWzJdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzBdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzFdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzJdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckJ0bkVkZ2VPdXRbMV0pOw0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVswXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzFdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bMl0pOw0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVszXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzRdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJMaWdodFsxXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFsxXVswXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFsxXVsxXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFsxXVsyXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMV1bMF0pOw0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzFdWzFdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFsxXVsyXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzFdWzBdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMV1bMV0pOw0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFsxXVsyXSk7DQotICAgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMV1bMF0pOw0KLSAgICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzFdWzFdKTsNCi0gICAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1sxXVsyXSk7DQotfQ0KLXZvaWQgQ0ZXTF9Gb3JtVFA6OlRyYW5zTW9kZUNvbG9yKEZYX0FSR0IgY2xyRm9yZSwgRlhfQVJHQiAmY2xyQmFjaykNCi17DQotICAgIGludDMyX3QgaUFsZmFGLCBpUkYsIGlHRiwgaUJGOw0KLSAgICBpbnQzMl90IGlBbGZhQiwgaVJCLCBpR0IsIGlCQjsNCi0gICAgQXJnYkRlY29kZShjbHJGb3JlLCBpQWxmYUYsIGlSRiwgaUdGLCBpQkYpOw0KLSAgICBBcmdiRGVjb2RlKGNsckJhY2ssIGlBbGZhQiwgaVJCLCBpR0IsIGlCQik7DQotICAgIGNsckJhY2sgPSBBcmdiRW5jb2RlKDB4ZmYsDQotICAgICAgICAgICAgICAgICAgICAgICAgIGlSQiArIChpUkYgLSBpUkIpICogaUFsZmFGIC8gMjU1LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBpR0IgKyAoaUdGIC0gaUdCKSAqIGlBbGZhRiAvIDI1NSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgaUJCICsgKGlCRiAtIGlCQikgKiBpQWxmYUYgLyAyNTUpOw0KLX0NCi12b2lkIENGV0xfRm9ybVRQOjpJbml0Q2FwdGlvbihGWF9CT09MIGJBY3RpdmUpDQotew0KLSAgICBpZiAoYkFjdGl2ZSkgew0KLSAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UgZGV2Ow0KLSAgICAgICAgQ0ZYX0dyYXBoaWNzIGdzOw0KLSAgICAgICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgICAgIHBhdGguQ3JlYXRlKCk7DQotICAgICAgICBpZiAobV9wQWN0aXZlQml0bWFwKSB7DQotICAgICAgICAgICAgZGVsZXRlIG1fcEFjdGl2ZUJpdG1hcDsNCi0gICAgICAgICAgICBtX3BBY3RpdmVCaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wQWN0aXZlQml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsNCi0gICAgICAgIG1fcEFjdGl2ZUJpdG1hcC0+Q3JlYXRlKDEsIEZXTFRIRU1FX0NBUEFDSVRZX0NZQ2FwdGlvbiwgRlhESUJfQXJnYik7DQotICAgICAgICBkZXYuQXR0YWNoKG1fcEFjdGl2ZUJpdG1hcCk7DQotICAgICAgICBncy5DcmVhdGUoJmRldik7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCAwLCAxLCA1KTsNCi0gICAgICAgIERyYXdBeGlhbFNoYWRpbmcoJmdzLCAwLCAwLCAwLCA1LCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVswXSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMV0sICZwYXRoKTsNCi0gICAgICAgIHBhdGguQ2xlYXIoKTsNCi0gICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKDAsIDUsIDEsIDE1KTsNCi0gICAgICAgIERyYXdBeGlhbFNoYWRpbmcoJmdzLCAwLCA1LCAwLCAyMCwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMV0sIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzJdLCAmcGF0aCk7DQotICAgICAgICBwYXRoLkNsZWFyKCk7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCAyMCwgMSwgRldMVEhFTUVfQ0FQQUNJVFlfQ1lDYXB0aW9uIC0gMTkpOw0KLSAgICAgICAgRHJhd0F4aWFsU2hhZGluZygmZ3MsIDAsIDIwLCAwLCBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24sIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzJdLCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVszXSwgJnBhdGgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UgZGV2Ow0KLSAgICAgICAgQ0ZYX0dyYXBoaWNzIGdzOw0KLSAgICAgICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgICAgIHBhdGguQ3JlYXRlKCk7DQotICAgICAgICBpZiAobV9wRGVhY3RpdmViaXRtYXApIHsNCi0gICAgICAgICAgICBkZWxldGUgbV9wRGVhY3RpdmViaXRtYXA7DQotICAgICAgICAgICAgbV9wRGVhY3RpdmViaXRtYXAgPSBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wRGVhY3RpdmViaXRtYXAgPSBGWF9ORVcgQ0ZYX0RJQml0bWFwOw0KLSAgICAgICAgbV9wRGVhY3RpdmViaXRtYXAtPkNyZWF0ZSgxLCBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24sIEZYRElCX0FyZ2IpOw0KLSAgICAgICAgZGV2LkF0dGFjaChtX3BEZWFjdGl2ZWJpdG1hcCk7DQotICAgICAgICBncy5DcmVhdGUoJmRldik7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCAwLCAxLCA1KTsNCi0gICAgICAgIERyYXdBeGlhbFNoYWRpbmcoJmdzLCAwLCAwLCAwLCA1LCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1sxXVswXSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMV0sICZwYXRoKTsNCi0gICAgICAgIHBhdGguQ2xlYXIoKTsNCi0gICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKDAsIDUsIDEsIDE1KTsNCi0gICAgICAgIERyYXdBeGlhbFNoYWRpbmcoJmdzLCAwLCA1LCAwLCAyMCwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMV0sIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzJdLCAmcGF0aCk7DQotICAgICAgICBwYXRoLkNsZWFyKCk7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCAyMCwgMSwgRldMVEhFTUVfQ0FQQUNJVFlfQ1lDYXB0aW9uIC0gMTkpOw0KLSAgICAgICAgRHJhd0F4aWFsU2hhZGluZygmZ3MsIDAsIDIwLCAwLCBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24sIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzJdLCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1sxXVszXSwgJnBhdGgpOw0KLSAgICB9DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKDAsIDIwLCAxLCBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24gLSAxOSk7DQorICAgIERyYXdBeGlhbFNoYWRpbmcoJmdzLCAwLCAyMCwgMCwgRldMVEhFTUVfQ0FQQUNJVFlfQ1lDYXB0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzJdLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzNdLCAmcGF0aCk7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9saXN0Ym94dHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2xpc3Rib3h0cC5jcHAKaW5kZXggYzE2ZGY1OC4uMzU0MmFlNCAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2xpc3Rib3h0cC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2xpc3Rib3h0cC5jcHAKQEAgLTUsODggKzUsOTAgQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQogDQogI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQotQ0ZXTF9MaXN0Qm94VFA6OkNGV0xfTGlzdEJveFRQKCkNCi17DQorQ0ZXTF9MaXN0Qm94VFA6OkNGV0xfTGlzdEJveFRQKCkge30NCitDRldMX0xpc3RCb3hUUDo6fkNGV0xfTGlzdEJveFRQKCkge30NCitGWF9CT09MIENGV0xfTGlzdEJveFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9MaXN0Qm94Ow0KIH0NCi1DRldMX0xpc3RCb3hUUDo6fkNGV0xfTGlzdEJveFRQKCkNCi17DQotfQ0KLUZYX0JPT0wJQ0ZXTF9MaXN0Qm94VFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCi0gICAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0xpc3RCb3g7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9MaXN0Qm94VFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQotICAgIHN3aXRjaChwUGFyYW1zLT5tX2lQYXJ0KSB7DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0xUQl9Cb3JkZXI6IHsNCi0gICAgICAgICAgICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0xUQl9FZGdlOiB7DQotICAgICAgICAgICAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfTFRCX0JhY2tncm91bmQ6IHsNCi0gICAgICAgICAgICAgICAgRmlsbFNvaWxkUmVjdChwUGFyYW1zLT5tX3BHcmFwaGljcywgQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGlmIChwUGFyYW1zLT5tX3BEYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICBGaWxsU29pbGRSZWN0KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBGV0xUSEVNRV9DT0xPUl9CYWNrZ3JvdW5kLCAoQ0ZYX1JlY3RGKilwUGFyYW1zLT5tX3BEYXRhLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfTFRCX0xpc3RJdGVtOiB7DQotICAgICAgICAgICAgICAgIERyYXdMaXN0Qm94SXRlbShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9kd1N0YXRlcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBwUGFyYW1zLT5tX3BEYXRhLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0xUQl9JY29uOiB7DQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJldGNoSW1hZ2UocFBhcmFtcy0+bV9wSW1hZ2UsIHBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX0xUQl9DaGVjazogew0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciA9IDB4RkYwMDAwMDA7DQotICAgICAgICAgICAgICAgIGlmIChwUGFyYW1zLT5tX2R3U3RhdGVzID09IEZXTF9QQVJUU1RBVEVfTFRCX0NoZWNrZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yID0gMHhGRkZGMDAwMDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwUGFyYW1zLT5tX2R3U3RhdGVzID09IEZXTF9QQVJUU1RBVEVfTFRCX1VuQ2hlY2tlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAweEZGMDAwMEZGOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZpbGxTb2lsZFJlY3QocFBhcmFtcy0+bV9wR3JhcGhpY3MsIGNvbG9yLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCitGWF9CT09MIENGV0xfTGlzdEJveFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgY2FzZSBGV0xfUEFSVF9MVEJfQm9yZGVyOiB7DQorICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIEZXTF9QQVJUX0xUQl9FZGdlOiB7DQorICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksDQorICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfTFRCX0JhY2tncm91bmQ6IHsNCisgICAgICBGaWxsU29pbGRSZWN0KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgaWYgKHBQYXJhbXMtPm1fcERhdGEpIHsNCisgICAgICAgIEZpbGxTb2lsZFJlY3QocFBhcmFtcy0+bV9wR3JhcGhpY3MsIEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQsDQorICAgICAgICAgICAgICAgICAgICAgIChDRlhfUmVjdEYqKXBQYXJhbXMtPm1fcERhdGEsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfTFRCX0xpc3RJdGVtOiB7DQorICAgICAgRHJhd0xpc3RCb3hJdGVtKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX2R3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsIHBQYXJhbXMtPm1fcERhdGEsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9MVEJfSWNvbjogew0KKyAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJldGNoSW1hZ2UocFBhcmFtcy0+bV9wSW1hZ2UsIHBQYXJhbXMtPm1fcnRQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0xUQl9DaGVjazogew0KKyAgICAgIEZYX0RXT1JEIGNvbG9yID0gMHhGRjAwMDAwMDsNCisgICAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyA9PSBGV0xfUEFSVFNUQVRFX0xUQl9DaGVja2VkKSB7DQorICAgICAgICBjb2xvciA9IDB4RkZGRjAwMDA7DQorICAgICAgfSBlbHNlIGlmIChwUGFyYW1zLT5tX2R3U3RhdGVzID09IEZXTF9QQVJUU1RBVEVfTFRCX1VuQ2hlY2tlZCkgew0KKyAgICAgICAgY29sb3IgPSAweEZGMDAwMEZGOw0KKyAgICAgIH0NCisgICAgICBGaWxsU29pbGRSZWN0KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBjb2xvciwgJnBQYXJhbXMtPm1fcnRQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9MaXN0Qm94VFA6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgSW5pdFRUTygpOw0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94VFA6OkluaXRpYWxpemUoKSB7DQorICBJbml0VFRPKCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KIH0NCi1GV0xfRVJSCUNGV0xfTGlzdEJveFRQOjpGaW5hbGl6ZSgpDQotew0KLSAgICBGaW5hbGl6ZVRUTygpOw0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCitGV0xfRVJSIENGV0xfTGlzdEJveFRQOjpGaW5hbGl6ZSgpIHsNCisgIEZpbmFsaXplVFRPKCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCiB9DQotdm9pZCBDRldMX0xpc3RCb3hUUDo6RHJhd0xpc3RCb3hJdGVtKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGWF9EV09SRCBkd1N0YXRlcywgY29uc3QgQ0ZYX1JlY3RGICpwcnRJdGVtLCB2b2lkKiBwRGF0YSAsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgaWYgKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9MVEJfU2VsZWN0ZWQpIHsNCi0gICAgICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgICAgIENGWF9Db2xvciBjckZpbGwoRldMX0dldFRoZW1lQ29sb3IobV9kd1RoZW1lSUQpID09IDAgPyBGV0xUSEVNRV9DT0xPUl9CS1NlbGVjdGVkIDogRldMVEhFTUVfQ09MT1JfR3JlZW5fQktTZWxlY3RlZCk7DQotICAgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCi0gICAgICAgIENGWF9SZWN0RiBydCgqcHJ0SXRlbSk7DQotICAgICAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICAgICAgcGF0aC5DcmVhdGUoKTsNCi0jaWYgKF9GWF9PU189PV9GWF9NQUNPU1hfKQ0KLSAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wLCBydC53aWR0aCAtIDEsIHJ0LmhlaWdodCAtIDEpOw0KK3ZvaWQgQ0ZXTF9MaXN0Qm94VFA6OkRyYXdMaXN0Qm94SXRlbShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcHJ0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmIChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTFRCX1NlbGVjdGVkKSB7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX0NvbG9yIGNyRmlsbChGV0xfR2V0VGhlbWVDb2xvcihtX2R3VGhlbWVJRCkgPT0gMA0KKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEZXTFRIRU1FX0NPTE9SX0JLU2VsZWN0ZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xUSEVNRV9DT0xPUl9HcmVlbl9CS1NlbGVjdGVkKTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICAgIENGWF9SZWN0RiBydCgqcHJ0SXRlbSk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0LCBydC50b3AsIHJ0LndpZHRoIC0gMSwgcnQuaGVpZ2h0IC0gMSk7DQogI2Vsc2UNCi0gICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQud2lkdGgsIHJ0LmhlaWdodCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQud2lkdGgsIHJ0LmhlaWdodCk7DQogI2VuZGlmDQotICAgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgICAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgfQ0KKyAgaWYgKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9MVEJfRm9jdXNlZCkgew0KKyAgICBpZiAocERhdGEpIHsNCisgICAgICBEcmF3Rm9jdXMocEdyYXBoaWNzLCAoQ0ZYX1JlY3RGKilwRGF0YSwgcE1hdHJpeCk7DQogICAgIH0NCi0gICAgaWYgKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9MVEJfRm9jdXNlZCkgew0KLSAgICAgICAgaWYgKHBEYXRhKSB7DQotICAgICAgICAgICAgRHJhd0ZvY3VzKHBHcmFwaGljcywgKENGWF9SZWN0RiopcERhdGEsIHBNYXRyaXgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9tb250aGNhbGVuZGFydHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL21vbnRoY2FsZW5kYXJ0cC5jcHAKaW5kZXggZGU3ZjNhOC4uNjc1ODZmMSAxMDA2NDQKLS0tIGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL21vbnRoY2FsZW5kYXJ0cC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL21vbnRoY2FsZW5kYXJ0cC5jcHAKQEAgLTUsNTUwICs1LDU2OSBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAiLi4vLi4vLi4vZm94aXRsaWIuaCINCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9XSURUSAkJCTIwMA0KLSNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0hFSUdIVAkJCTMwDQotI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1dJRFRICQkxOA0KLSNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9IRUlHSFQJCTE2DQotI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX0hNQVJHSU4JCTUNCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fVk1BUkdJTgkJKEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9IRUlHSFQgLSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX0hFSUdIVCkvMg0KLSNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRXSURIVAkJMTAwDQotI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVEhFSUdIVAkJMjANCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUX0hNQVJHSU4JKEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9XSURUSCAtIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUV0lESFQpLzINCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUX1ZNQVJHSU4JKEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9IRUlHSFQgLSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVEhFSUdIVCkvMg0KLSNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSFNFUF9XSURUSAkJCQkoRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS19XSURUSCAtIDEwKQ0KLSNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSFNFUF9IRUlHSFQJCQkxDQotI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19WU0VQX1dJRFRICQkJCTENCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1ZTRVBfSEVJR0hUCQkJRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS05VTV9IRUlHSFQNCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtOVU1fV0lEVEgJCQkyNg0KLSNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfU0VQX0RPRkZTRVQJCQkJLTQNCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9YCQkJCQkzDQotI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19TRVBfWQkJCQkJKEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9IRUlHSFQgKyBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLX0hFSUdIVCArIEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9ET0ZGU0VUKQ0KLSNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS05VTV9IRUlHSFQJCQkoNipGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVCkNCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtfV0lEVEgJCQkJKEZXTF9USEVNRUNBUEFDSVRZX01DX0RBVEVTX0NFTExfV0lEVEgqNykNCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtfSEVJR0hUCQkJRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQNCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0RBVEVTX0NFTExfV0lEVEgJCShGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEgvNykNCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0RBVEVTX0NFTExfSEVJR0hUCQkJCTE2DQotI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19UT0RBWV9XSURIVAkJCUZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9XSURUSA0KLSNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfVE9EQVlfSEVJR0hUCQkJRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQNCi0jZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1RPREFZX0ZMQUdfV0lESFQJCUZXTF9USEVNRUNBUEFDSVRZX01DX0RBVEVTX0NFTExfV0lEVEgNCi0jZGVmaW5lIEZXTF9NQ19XSURUSAkJCQkJMjAwDQotI2RlZmluZSBGV0xfTUNfSEVJR0hUCQkJCSAgICAxNjANCi1DRldMX01vbnRoQ2FsZW5kYXJUUDo6Q0ZXTF9Nb250aENhbGVuZGFyVFAoKQ0KLXsNCi0gICAgbV9wVGhlbWVEYXRhID0gRlhfTkVXIE1DVGhlbWVEYXRhOw0KLSAgICBTZXRUaGVtZURhdGEoMCk7DQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEggMjAwDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfSEVJR0hUIDMwDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1dJRFRIIDE4DQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX0hFSUdIVCAxNg0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9ITUFSR0lOIDUNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fVk1BUkdJTiBcDQorICAoRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0hFSUdIVCAtICAgICAgICAgXA0KKyAgIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fSEVJR0hUKSAvICAgIFwNCisgICAgICAyDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVFdJREhUIDEwMA0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRIRUlHSFQgMjANCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUX0hNQVJHSU4gXA0KKyAgKEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9XSURUSCAtICAgICAgICAgICBcDQorICAgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRXSURIVCkgLyAgICAgIFwNCisgICAgICAyDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9WTUFSR0lOIFwNCisgIChGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfSEVJR0hUIC0gICAgICAgICAgXA0KKyAgIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUSEVJR0hUKSAvICAgICBcDQorICAgICAgMg0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSFNFUF9XSURUSCAoRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS19XSURUSCAtIDEwKQ0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSFNFUF9IRUlHSFQgMQ0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfVlNFUF9XSURUSCAxDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19WU0VQX0hFSUdIVCBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLTlVNX0hFSUdIVA0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS05VTV9XSURUSCAyNg0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfU0VQX0RPRkZTRVQgLTQNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9YIDMNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAoRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0hFSUdIVCArIEZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtfSEVJR0hUICsgXA0KKyAgIEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9ET0ZGU0VUKQ0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS05VTV9IRUlHSFQgXA0KKyAgKDYgKiBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVCkNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtfV0lEVEggXA0KKyAgKEZXTF9USEVNRUNBUEFDSVRZX01DX0RBVEVTX0NFTExfV0lEVEggKiA3KQ0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS19IRUlHSFQgRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0RBVEVTX0NFTExfV0lEVEggXA0KKyAgKEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9XSURUSCAvIDcpDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVCAxNg0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfVE9EQVlfV0lESFQgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1dJRFRIDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19UT0RBWV9IRUlHSFQgRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1RPREFZX0ZMQUdfV0lESFQgXA0KKyAgRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9XSURUSA0KKyNkZWZpbmUgRldMX01DX1dJRFRIIDIwMA0KKyNkZWZpbmUgRldMX01DX0hFSUdIVCAxNjANCitDRldMX01vbnRoQ2FsZW5kYXJUUDo6Q0ZXTF9Nb250aENhbGVuZGFyVFAoKSB7DQorICBtX3BUaGVtZURhdGEgPSBGWF9ORVcgTUNUaGVtZURhdGE7DQorICBTZXRUaGVtZURhdGEoMCk7DQogfQ0KLUNGV0xfTW9udGhDYWxlbmRhclRQOjp+Q0ZXTF9Nb250aENhbGVuZGFyVFAoKQ0KLXsNCi0gICAgZGVsZXRlIG1fcFRoZW1lRGF0YTsNCitDRldMX01vbnRoQ2FsZW5kYXJUUDo6fkNGV0xfTW9udGhDYWxlbmRhclRQKCkgew0KKyAgZGVsZXRlIG1fcFRoZW1lRGF0YTsNCiB9DQotRlhfQk9PTAlDRldMX01vbnRoQ2FsZW5kYXJUUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFdpZGdldCwgRkFMU0UpOw0KLSAgICByZXR1cm4gcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfTW9udGhDYWxlbmRhcjsNCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhclRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9Nb250aENhbGVuZGFyOw0KIH0NCi1GWF9EV09SRCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6U2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRFdPUkQgZHdUaGVtZUlELCBGWF9CT09MIGJDaGlsZHJlbiApDQotew0KLSAgICBpZiAobV9wVGhlbWVEYXRhKSB7DQotICAgICAgICBTZXRUaGVtZURhdGEoRldMX0dldFRoZW1lQ29sb3IoZHdUaGVtZUlEKSk7DQorRlhfRFdPUkQgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OlNldFRoZW1lSUQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUaGVtZUlELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoaWxkcmVuKSB7DQorICBpZiAobV9wVGhlbWVEYXRhKSB7DQorICAgIFNldFRoZW1lRGF0YShGV0xfR2V0VGhlbWVDb2xvcihkd1RoZW1lSUQpKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKHBXaWRnZXQsIGR3VGhlbWVJRCwgYkNoaWxkcmVuKTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KKyAgc3dpdGNoIChwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgIGNhc2UgRldMX1BBUlRfTUNEX0JvcmRlcjogew0KKyAgICAgIERyYXdCb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6U2V0VGhlbWVJRChwV2lkZ2V0LCBkd1RoZW1lSUQsIGJDaGlsZHJlbik7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQotICAgIHN3aXRjaChwUGFyYW1zLT5tX2lQYXJ0KSB7DQotICAgICAgICBjYXNlIEZXTF9QQVJUX01DRF9Cb3JkZXI6IHsNCi0gICAgICAgICAgICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX01DRF9FZGdlOiB7DQotICAgICAgICAgICAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfTUNEX0JhY2tncm91bmQ6IHsNCi0gICAgICAgICAgICAgICAgRHJhd1RvdGFsQksocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9NQ0RfSGVhZGVyOiB7DQotICAgICAgICAgICAgICAgIERyYXdIZWFkQmsocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9NQ0RfTEJ0bjogew0KKyAgICBjYXNlIEZXTF9QQVJUX01DRF9FZGdlOiB7DQorICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksDQorICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfTUNEX0JhY2tncm91bmQ6IHsNCisgICAgICBEcmF3VG90YWxCSyhwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfTUNEX0hlYWRlcjogew0KKyAgICAgIERyYXdIZWFkQmsocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX01DRF9MQnRuOiB7DQogI2lmZGVmIFRIRU1FX1hQU2ltaWxhcg0KLSAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUgPSBHZXRTdGF0ZShwUGFyYW1zLT5tX2R3U3RhdGVzKTsNCi0gICAgICAgICAgICAgICAgRHJhd0Fycm93QnRuKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIEZXTFRIRU1FX0RJUkVDVElPTl9MZWZ0LCBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlID0gR2V0U3RhdGUocFBhcmFtcy0+bV9kd1N0YXRlcyk7DQorICAgICAgRHJhd0Fycm93QnRuKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsDQorICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTl9MZWZ0LCBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQogI2Vsc2UNCi0gICAgICAgICAgICAgICAgRHJhd0xCdXR0b24ocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBEcmF3TEJ1dHRvbihwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KICNlbmRpZg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX01DRF9SQnRuOiB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9NQ0RfUkJ0bjogew0KICNpZmRlZiBUSEVNRV9YUFNpbWlsYXINCi0gICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlID0gR2V0U3RhdGUocFBhcmFtcy0+bV9kd1N0YXRlcyk7DQotICAgICAgICAgICAgICAgIERyYXdBcnJvd0J0bihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBGV0xUSEVNRV9ESVJFQ1RJT05fUmlnaHQsIGVTdGF0ZSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUgPSBHZXRTdGF0ZShwUGFyYW1zLT5tX2R3U3RhdGVzKTsNCisgICAgICBEcmF3QXJyb3dCdG4ocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwNCisgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRElSRUNUSU9OX1JpZ2h0LCBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQogI2Vsc2UNCi0gICAgICAgICAgICAgICAgRHJhd1JCdXR0b24ocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBEcmF3UkJ1dHRvbihwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KICNlbmRpZg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX01DRF9IU2VwYXJhdG9yOiB7DQotICAgICAgICAgICAgICAgIERyYXdIU2VwZXJhdG9yKHBQYXJhbXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfTUNEX0RhdGVzSW46IHsNCi0gICAgICAgICAgICAgICAgRHJhd0RhdGVzSW5CSyhwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX01DRF9Ub2RheUNpcmNsZTogew0KLSAgICAgICAgICAgICAgICBEcmF3VG9kYXlDaXJjbGUocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9NQ0RfRGF0ZUluQ2lyY2xlOiB7DQotICAgICAgICAgICAgICAgIERyYXdEYXRlc0luQ2lyY2xlKHBQYXJhbXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfTUNEX1dlZWtOdW1TZXA6IHsNCi0gICAgICAgICAgICAgICAgRHJhd1dlZWtOdW1TZXAocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTAlDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQgKnBQYXJhbXMpDQotew0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFRleHRPdXQsIEZBTFNFKTsNCi0gICAgaWYgKChwUGFyYW1zLT5tX2lQYXJ0ID09IEZXTF9QQVJUX01DRF9EYXRlc0luKSAmJiAhKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfSVRFTVNUQVRFX01DRF9GbGFnKSAmJg0KLSAgICAgICAgICAgIChwUGFyYW1zLT5tX2R3U3RhdGVzICYgKEZXTF9QQVJUU1RBVEVfTUNEX0hvdmVyZWQgfCBGV0xfUEFSVFNUQVRFX01DRF9TZWxlY3RlZCkpKSB7DQotICAgICAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoMHhGRkZGRkZGRik7DQotICAgIH0gZWxzZSBpZiAocFBhcmFtcy0+bV9pUGFydCA9PSBGV0xfUEFSVF9NQ0RfQ2FwdGlvbikgew0KLSAgICAgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyQ2FwdGlvbik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoMHhGRjAwMDAwMCk7DQorICAgIGNhc2UgRldMX1BBUlRfTUNEX0hTZXBhcmF0b3I6IHsNCisgICAgICBEcmF3SFNlcGVyYXRvcihwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpEcmF3VGV4dChwUGFyYW1zKTsNCi19DQotdm9pZCogQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KQ0KLXsNCi0gICAgRlhfQk9PTCBiRGVmUHJvID0gRkFMU0U7DQotICAgIEZYX0JPT0wgYkR3b3JkVmFsID0gRkFMU0U7DQotICAgIHN3aXRjaChkd0NhcGFjaXR5KSB7DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEg6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEg7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9IZWlnaHQ6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfSEVJR0hUOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1dJRFRIOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9XSURUSDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9IRUlHSFQ6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX0hFSUdIVDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9ITUFSR0lOOiB7DQotICAgICAgICAgICAgICAgIGJEd29yZFZhbCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIG1fZHdWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fSE1BUkdJTjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9WTUFSR0lOOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9WTUFSR0lOOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVFdJREhUOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRXSURIVDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRIRUlHSFQ6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVEhFSUdIVDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRfSE1BUkdJTjogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUX0hNQVJHSU47DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUX1ZNQVJHSU46IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9WTUFSR0lOOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IU0VQX1dJRFRIOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSFNFUF9XSURUSDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSFNFUF9IRUlHSFQ6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IU0VQX0hFSUdIVDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVlNFUF9XSURUSDogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1ZTRVBfV0lEVEg7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1ZTRVBfSEVJR0hUOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfVlNFUF9IRUlHSFQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1dFRUtOVU1fV0lEVEg6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLTlVNX1dJRFRIOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLTlVNX0hFSUdIVDogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtOVU1fSEVJR0hUOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLX1dJRFRIOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS19XSURUSDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS19IRUlHSFQ6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSAJRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS19IRUlHSFQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1NFUF9ET0ZGU0VUOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfU0VQX0RPRkZTRVQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1NFUF9YOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfU0VQX1g7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1NFUF9ZOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfU0VQX1k7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0RBVEVTX0NFTExfV0lEVEg6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX1dJRFRIOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVDogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0RBVEVTX0NFTExfSEVJR0hUOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9XSURIVDogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1RPREFZX1dJREhUOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9IRUlHSFQ6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19UT0RBWV9IRUlHSFQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1RPREFZX0ZMQUdfV0lESFQ6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19UT0RBWV9GTEFHX1dJREhUOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19XSURUSDogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTF9NQ19XSURUSDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVJR0hUOiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMX01DX0hFSUdIVDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9TdW46IHsNCi0gICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiU3VuIjsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfTW9uOiB7DQotICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIk1vbiI7DQotICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX1R1ZTogew0KLSAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gTCJUdWUiOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9XZWQ6IHsNCi0gICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiV2VkIjsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfVGh1OiB7DQotICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIlRodSI7DQotICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0ZyaTogew0KLSAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gTCJGcmkiOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9TYXQ6IHsNCi0gICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiU2F0IjsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfSmFudWFyeTogew0KLSAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gTCJKYW51YXJ5IjsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfRmVicnVhcnk6IHsNCi0gICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiRmVicnVhcnkiOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9NYXJjaDogew0KLSAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gTCJNYXJjaCI7DQotICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0FwcmlsOiB7DQotICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIkFwcmlsIjsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfTWF5OiB7DQotICAgICAgICAgICAgICAgIHdzUmVzb3VyY2UgPSBMIk1heSI7DQotICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0p1bmU6IHsNCi0gICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiSnVuZSI7DQotICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0p1bHk6IHsNCi0gICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiSnVseSI7DQotICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0F1Z3VzdDogew0KLSAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gTCJBdWd1c3QiOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9TZXB0ZW1iZXI6IHsNCi0gICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiU2VwdGVtYmVyIjsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfT2N0b2Jlcjogew0KLSAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gTCJPY3RvYmVyIjsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfTm92ZW1iZXI6IHsNCi0gICAgICAgICAgICAgICAgd3NSZXNvdXJjZSA9IEwiTm92ZW1iZXIiOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9EZWNlbWJlcjogew0KLSAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gIEwiRGVjZW1iZXIiOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9Ub2RheTogew0KLSAgICAgICAgICAgICAgICB3c1Jlc291cmNlID0gTCJUb2RheSI7DQotICAgICAgICAgICAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIGJEZWZQcm8gPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9NQ0RfRGF0ZXNJbjogew0KKyAgICAgIERyYXdEYXRlc0luQksocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpZiAoIWJEZWZQcm8pIHsNCi0gICAgICAgIGlmIChiRHdvcmRWYWwpIHsNCi0gICAgICAgICAgICByZXR1cm4gJm1fZHdWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAmbV9mVmFsdWU7DQorICAgIGNhc2UgRldMX1BBUlRfTUNEX1RvZGF5Q2lyY2xlOiB7DQorICAgICAgRHJhd1RvZGF5Q2lyY2xlKHBQYXJhbXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkdldENhcGFjaXR5KHBUaGVtZVBhcnQsIGR3Q2FwYWNpdHkpOw0KKyAgICBjYXNlIEZXTF9QQVJUX01DRF9EYXRlSW5DaXJjbGU6IHsNCisgICAgICBEcmF3RGF0ZXNJbkNpcmNsZShwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfTUNEX1dlZWtOdW1TZXA6IHsNCisgICAgICBEcmF3V2Vla051bVNlcChwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotRldMX0VSUglDRldMX01vbnRoQ2FsZW5kYXJUUDo6SW5pdGlhbGl6ZSgpDQotew0KLSAgICBJbml0VFRPKCk7DQotICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpJbml0aWFsaXplKCk7DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMpIHsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wVGV4dE91dCwgRkFMU0UpOw0KKyAgaWYgKChwUGFyYW1zLT5tX2lQYXJ0ID09IEZXTF9QQVJUX01DRF9EYXRlc0luKSAmJg0KKyAgICAgICEocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9JVEVNU1RBVEVfTUNEX0ZsYWcpICYmDQorICAgICAgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJg0KKyAgICAgICAoRldMX1BBUlRTVEFURV9NQ0RfSG92ZXJlZCB8IEZXTF9QQVJUU1RBVEVfTUNEX1NlbGVjdGVkKSkpIHsNCisgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKDB4RkZGRkZGRkYpOw0KKyAgfSBlbHNlIGlmIChwUGFyYW1zLT5tX2lQYXJ0ID09IEZXTF9QQVJUX01DRF9DYXB0aW9uKSB7DQorICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihtX3BUaGVtZURhdGEtPmNsckNhcHRpb24pOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKDB4RkYwMDAwMDApOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkRyYXdUZXh0KHBQYXJhbXMpOw0KIH0NCi1GV0xfRVJSCUNGV0xfTW9udGhDYWxlbmRhclRQOjpGaW5hbGl6ZSgpDQotew0KLSAgICBGaW5hbGl6ZVRUTygpOw0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCit2b2lkKiBDRldMX01vbnRoQ2FsZW5kYXJUUDo6R2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q2FwYWNpdHkpIHsNCisgIEZYX0JPT0wgYkRlZlBybyA9IEZBTFNFOw0KKyAgRlhfQk9PTCBiRHdvcmRWYWwgPSBGQUxTRTsNCisgIHN3aXRjaCAoZHdDYXBhY2l0eSkgew0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEg6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9XSURUSDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfSGVpZ2h0OiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfSEVJR0hUOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fV0lEVEg6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fV0lEVEg7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9IRUlHSFQ6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fSEVJR0hUOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fSE1BUkdJTjogew0KKyAgICAgIGJEd29yZFZhbCA9IFRSVUU7DQorICAgICAgbV9kd1ZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9ITUFSR0lOOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fVk1BUkdJTjogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9WTUFSR0lOOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUV0lESFQ6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUV0lESFQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRIRUlHSFQ6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUSEVJR0hUOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUX0hNQVJHSU46IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUX0hNQVJHSU47DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRfVk1BUkdJTjogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRfVk1BUkdJTjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IU0VQX1dJRFRIOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IU0VQX1dJRFRIOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hTRVBfSEVJR0hUOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IU0VQX0hFSUdIVDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19WU0VQX1dJRFRIOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19WU0VQX1dJRFRIOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1ZTRVBfSEVJR0hUOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19WU0VQX0hFSUdIVDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLTlVNX1dJRFRIOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLTlVNX1dJRFRIOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1dFRUtOVU1fSEVJR0hUOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLTlVNX0hFSUdIVDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLX1dJRFRIOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLX1dJRFRIOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1dFRUtfSEVJR0hUOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLX0hFSUdIVDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfRE9GRlNFVDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfU0VQX0RPRkZTRVQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfU0VQX1g6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9YOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1NFUF9ZOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19TRVBfWTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX1dJRFRIOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX1dJRFRIOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0RBVEVTX0NFTExfSEVJR0hUOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9XSURIVDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfVE9EQVlfV0lESFQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfSEVJR0hUOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19UT0RBWV9IRUlHSFQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfRkxBR19XSURIVDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfVE9EQVlfRkxBR19XSURIVDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19XSURUSDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX01DX1dJRFRIOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFSUdIVDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX01DX0hFSUdIVDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX1N1bjogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIlN1biI7DQorICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfTW9uOiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiTW9uIjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9UdWU6IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJUdWUiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX1dlZDogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIldlZCI7DQorICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfVGh1OiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiVGh1IjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9Gcmk6IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJGcmkiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX1NhdDogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIlNhdCI7DQorICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfSmFudWFyeTogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIkphbnVhcnkiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0ZlYnJ1YXJ5OiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiRmVicnVhcnkiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX01hcmNoOiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiTWFyY2giOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0FwcmlsOiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiQXByaWwiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX01heTogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIk1heSI7DQorICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfSnVuZTogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIkp1bmUiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0p1bHk6IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJKdWx5IjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9BdWd1c3Q6IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJBdWd1c3QiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX1NlcHRlbWJlcjogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIlNlcHRlbWJlciI7DQorICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfT2N0b2Jlcjogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIk9jdG9iZXIiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX05vdmVtYmVyOiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiTm92ZW1iZXIiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0RlY2VtYmVyOiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiRGVjZW1iZXIiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX1RvZGF5OiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiVG9kYXkiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IGJEZWZQcm8gPSBUUlVFOyB9DQorICB9DQorICBpZiAoIWJEZWZQcm8pIHsNCisgICAgaWYgKGJEd29yZFZhbCkgew0KKyAgICAgIHJldHVybiAmbV9kd1ZhbHVlOw0KKyAgICB9DQorICAgIHJldHVybiAmbV9mVmFsdWU7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6R2V0Q2FwYWNpdHkocFRoZW1lUGFydCwgZHdDYXBhY2l0eSk7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdUb3RhbEJLKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCi0gICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0VG90YWwocFBhcmFtcy0+bV9ydFBhcnQpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydFRvdGFsLmxlZnQsIHJ0VG90YWwudG9wLCBydFRvdGFsLndpZHRoLCBydFRvdGFsLmhlaWdodCk7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBDRlhfQ29sb3IgY2xyQksobV9wVGhlbWVEYXRhLT5jbHJCSyk7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsckJLKTsNCitGV0xfRVJSIENGV0xfTW9udGhDYWxlbmRhclRQOjpJbml0aWFsaXplKCkgew0KKyAgSW5pdFRUTygpOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RmluYWxpemUoKSB7DQorICBGaW5hbGl6ZVRUTygpOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkZpbmFsaXplKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdUb3RhbEJLKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgQ0ZYX1JlY3RGIHJ0VG90YWwocFBhcmFtcy0+bV9ydFBhcnQpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnRUb3RhbC5sZWZ0LCBydFRvdGFsLnRvcCwgcnRUb3RhbC53aWR0aCwgcnRUb3RhbC5oZWlnaHQpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY2xyQksobV9wVGhlbWVEYXRhLT5jbHJCSyk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJCSyk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdIZWFkQmsoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIENGWF9SZWN0RiBydEhlYWQgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0SGVhZC5sZWZ0LCBydEhlYWQudG9wLCBydEhlYWQud2lkdGgsIHJ0SGVhZC5oZWlnaHQpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY2xySGVhZEJLKG1fcFRoZW1lRGF0YS0+Y2xyQkspOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xySGVhZEJLKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd0xCdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBDRlhfUmVjdEYgcnRMQnRuOw0KKyAgcnRMQnRuID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydExCdG4ubGVmdCwgcnRMQnRuLnRvcCwgcnRMQnRuLndpZHRoLCBydExCdG4uaGVpZ2h0KTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNsckxCdG5FZGdlKEFyZ2JFbmNvZGUoMHhmZiwgMjA1LCAyMTksIDI0MykpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMQnRuRWRnZSk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBpZiAoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkKSA9PQ0KKyAgICAgIEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQpIHsNCisgICAgQ0ZYX0NvbG9yIGNsckxCdG5GaWxsKEFyZ2JFbmNvZGUoMHhmZiwgMTc0LCAxOTgsIDI0MikpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJMQnRuRmlsbCk7DQogICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdIZWFkQmsoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBDRlhfUmVjdEYgcnRIZWFkID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0SGVhZC5sZWZ0LCBydEhlYWQudG9wLCBydEhlYWQud2lkdGgsIHJ0SGVhZC5oZWlnaHQpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX0NvbG9yIGNsckhlYWRCSyhtX3BUaGVtZURhdGEtPmNsckJLKTsNCi0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xySGVhZEJLKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9Db2xvciBjbHJMQnRuRmlsbChBcmdiRW5jb2RlKDB4ZmYsIDIyNywgMjM1LCAyNDkpKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xyTEJ0bkZpbGwpOw0KICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5Nb3ZlVG8ocnRMQnRuLmxlZnQgKyBydExCdG4uV2lkdGgoKSAvIDMgKiAyLA0KKyAgICAgICAgICAgICAgcnRMQnRuLnRvcCArIHJ0TEJ0bi5oZWlnaHQgLyA0KTsNCisgIHBhdGguTGluZVRvKHJ0TEJ0bi5sZWZ0ICsgcnRMQnRuLldpZHRoKCkgLyAzLCBydExCdG4udG9wICsgcnRMQnRuLmhlaWdodCAvIDIpOw0KKyAgcGF0aC5MaW5lVG8ocnRMQnRuLmxlZnQgKyBydExCdG4uV2lkdGgoKSAvIDMgKiAyLA0KKyAgICAgICAgICAgICAgcnRMQnRuLmJvdHRvbSgpIC0gcnRMQnRuLmhlaWdodCAvIDQpOw0KKyAgQ0ZYX0NvbG9yIGNsckZsYWcoQXJnYkVuY29kZSgweGZmLCA1MCwgMTA0LCAyMDUpKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyRmxhZyk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MCUNGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3TEJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIENGWF9QYXRoIHBhdGg7DQotICAgIHBhdGguQ3JlYXRlKCk7DQotICAgIENGWF9SZWN0RiBydExCdG47DQotICAgIHJ0TEJ0biA9IHBQYXJhbXMtPm1fcnRQYXJ0Ow0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydExCdG4ubGVmdCwgcnRMQnRuLnRvcCwgcnRMQnRuLndpZHRoLCBydExCdG4uaGVpZ2h0KTsNCi0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIENGWF9Db2xvciBjbHJMQnRuRWRnZShBcmdiRW5jb2RlKDB4ZmYsIDIwNSwgMjE5LCAyNDMpKTsNCi0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMQnRuRWRnZSk7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgaWYgKChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZCkgPT0gRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZCkgew0KLSAgICAgICAgQ0ZYX0NvbG9yIGNsckxCdG5GaWxsKEFyZ2JFbmNvZGUoMHhmZiwgMTc0LCAxOTgsIDI0MikpOw0KLSAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xyTEJ0bkZpbGwpOw0KLSAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfQ29sb3IgY2xyTEJ0bkZpbGwoQXJnYkVuY29kZSgweGZmLCAyMjcsIDIzNSwgMjQ5KSk7DQotICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJMQnRuRmlsbCk7DQotICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBwYXRoLkNsZWFyKCk7DQotICAgIHBhdGguTW92ZVRvKHJ0TEJ0bi5sZWZ0ICsgcnRMQnRuLldpZHRoKCkgLyAzICogMiwgcnRMQnRuLnRvcCArIHJ0TEJ0bi5oZWlnaHQgLyA0KTsNCi0gICAgcGF0aC5MaW5lVG8ocnRMQnRuLmxlZnQgKyBydExCdG4uV2lkdGgoKSAvIDMsIHJ0TEJ0bi50b3AgKyBydExCdG4uaGVpZ2h0IC8gMik7DQotICAgIHBhdGguTGluZVRvKHJ0TEJ0bi5sZWZ0ICsgcnRMQnRuLldpZHRoKCkgLyAzICogMiwgcnRMQnRuLmJvdHRvbSgpIC0gcnRMQnRuLmhlaWdodCAvIDQpOw0KLSAgICBDRlhfQ29sb3IgY2xyRmxhZyhBcmdiRW5jb2RlKDB4ZmYsIDUwLCAxMDQsIDIwNSkpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckZsYWcpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3UkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIENGWF9SZWN0RiBydFJCdG47DQorICBydFJCdG4gPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0UkJ0bi5sZWZ0LCBydFJCdG4udG9wLCBydFJCdG4ud2lkdGgsIHJ0UkJ0bi5oZWlnaHQpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY2xyUkJ0bkVkZ2UoQXJnYkVuY29kZSgweGZmLCAyMDUsIDIxOSwgMjQzKSk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsclJCdG5FZGdlKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIGlmICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQpID09DQorICAgICAgRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZCkgew0KKyAgICBDRlhfQ29sb3IgY2xyUkJ0bkZpbGwoQXJnYkVuY29kZSgweGZmLCAxNzQsIDE5OCwgMjQyKSk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclJCdG5GaWxsKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfQ29sb3IgY2xyUkJ0bkZpbGwoQXJnYkVuY29kZSgweGZmLCAyMjcsIDIzNSwgMjQ5KSk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclJCdG5GaWxsKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICB9DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLk1vdmVUbyhydFJCdG4ubGVmdCArIHJ0UkJ0bi5XaWR0aCgpIC8gMywgcnRSQnRuLnRvcCArIHJ0UkJ0bi5oZWlnaHQgLyA0KTsNCisgIHBhdGguTGluZVRvKHJ0UkJ0bi5sZWZ0ICsgcnRSQnRuLldpZHRoKCkgLyAzICogMiwNCisgICAgICAgICAgICAgIHJ0UkJ0bi50b3AgKyBydFJCdG4uaGVpZ2h0IC8gMik7DQorICBwYXRoLkxpbmVUbyhydFJCdG4ubGVmdCArIHJ0UkJ0bi5XaWR0aCgpIC8gMywNCisgICAgICAgICAgICAgIHJ0UkJ0bi5ib3R0b20oKSAtIHJ0UkJ0bi5oZWlnaHQgLyA0KTsNCisgIENGWF9Db2xvciBjbHJGbGFnKEFyZ2JFbmNvZGUoMHhmZiwgNTAsIDEwNCwgMjA1KSk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckZsYWcpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAlDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd1JCdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMsIENGWF9NYXRyaXggKnBNYXRyaXgpDQotew0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBDRlhfUmVjdEYgcnRSQnRuOw0KLSAgICBydFJCdG4gPSBwUGFyYW1zLT5tX3J0UGFydDsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocnRSQnRuLmxlZnQsIHJ0UkJ0bi50b3AsIHJ0UkJ0bi53aWR0aCwgcnRSQnRuLmhlaWdodCk7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBDRlhfQ29sb3IgY2xyUkJ0bkVkZ2UoQXJnYkVuY29kZSgweGZmLCAyMDUsIDIxOSwgMjQzKSk7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyUkJ0bkVkZ2UpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQotICAgIGlmICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQpID09IEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQpIHsNCi0gICAgICAgIENGWF9Db2xvciBjbHJSQnRuRmlsbChBcmdiRW5jb2RlKDB4ZmYsIDE3NCwgMTk4LCAyNDIpKTsNCi0gICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclJCdG5GaWxsKTsNCi0gICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX0NvbG9yIGNsclJCdG5GaWxsKEFyZ2JFbmNvZGUoMHhmZiwgMjI3LCAyMzUsIDI0OSkpOw0KLSAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xyUkJ0bkZpbGwpOw0KLSAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIH0NCi0gICAgcGF0aC5DbGVhcigpOw0KLSAgICBwYXRoLk1vdmVUbyhydFJCdG4ubGVmdCArIHJ0UkJ0bi5XaWR0aCgpIC8gMywgcnRSQnRuLnRvcCArIHJ0UkJ0bi5oZWlnaHQgLyA0KTsNCi0gICAgcGF0aC5MaW5lVG8ocnRSQnRuLmxlZnQgKyBydFJCdG4uV2lkdGgoKSAvIDMgKiAyLCBydFJCdG4udG9wICsgcnRSQnRuLmhlaWdodCAvIDIpOw0KLSAgICBwYXRoLkxpbmVUbyhydFJCdG4ubGVmdCArIHJ0UkJ0bi5XaWR0aCgpIC8gMywgcnRSQnRuLmJvdHRvbSgpIC0gcnRSQnRuLmhlaWdodCAvIDQpOw0KLSAgICBDRlhfQ29sb3IgY2xyRmxhZyhBcmdiRW5jb2RlKDB4ZmYsIDUwLCAxMDQsIDIwNSkpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckZsYWcpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3SFNlcGVyYXRvcihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIENGWF9SZWN0RiBydEhTZXA7DQorICBydEhTZXAgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgIHBhdGguTW92ZVRvKHJ0SFNlcC5sZWZ0LCBydEhTZXAudG9wICsgcnRIU2VwLmhlaWdodCAvIDIpOw0KKyAgcGF0aC5MaW5lVG8ocnRIU2VwLnJpZ2h0KCksIHJ0SFNlcC50b3AgKyBydEhTZXAuaGVpZ2h0IC8gMik7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9Db2xvciBjbHJIU2VwKG1fcFRoZW1lRGF0YS0+Y2xyU2VwZXJhdG9yKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xySFNlcCk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MCUNGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3SFNlcGVyYXRvcihDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIENGWF9QYXRoIHBhdGg7DQotICAgIHBhdGguQ3JlYXRlKCk7DQotICAgIENGWF9SZWN0RiBydEhTZXA7DQotICAgIHJ0SFNlcCA9IHBQYXJhbXMtPm1fcnRQYXJ0Ow0KLSAgICBwYXRoLk1vdmVUbyhydEhTZXAubGVmdCwgcnRIU2VwLnRvcCArIHJ0SFNlcC5oZWlnaHQgLyAyKTsNCi0gICAgcGF0aC5MaW5lVG8ocnRIU2VwLnJpZ2h0KCksIHJ0SFNlcC50b3AgKyBydEhTZXAuaGVpZ2h0IC8gMik7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBDRlhfQ29sb3IgY2xySFNlcChtX3BUaGVtZURhdGEtPmNsclNlcGVyYXRvcik7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xySFNlcCk7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdXZWVrTnVtU2VwKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgQ0ZYX1JlY3RGIHJ0V2Vla1NlcDsNCisgIHJ0V2Vla1NlcCA9IHBQYXJhbXMtPm1fcnRQYXJ0Ow0KKyAgcGF0aC5Nb3ZlVG8ocnRXZWVrU2VwLmxlZnQsIHJ0V2Vla1NlcC50b3ApOw0KKyAgcGF0aC5MaW5lVG8ocnRXZWVrU2VwLmxlZnQsIHJ0V2Vla1NlcC5ib3R0b20oKSk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9Db2xvciBjbHJIU2VwKG1fcFRoZW1lRGF0YS0+Y2xyU2VwZXJhdG9yKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xySFNlcCk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MCUNGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3V2Vla051bVNlcChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIENGWF9QYXRoIHBhdGg7DQotICAgIHBhdGguQ3JlYXRlKCk7DQotICAgIENGWF9SZWN0RiBydFdlZWtTZXA7DQotICAgIHJ0V2Vla1NlcCA9IHBQYXJhbXMtPm1fcnRQYXJ0Ow0KLSAgICBwYXRoLk1vdmVUbyhydFdlZWtTZXAubGVmdCwgcnRXZWVrU2VwLnRvcCk7DQotICAgIHBhdGguTGluZVRvKHJ0V2Vla1NlcC5sZWZ0LCBydFdlZWtTZXAuYm90dG9tKCkpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX0NvbG9yIGNsckhTZXAobV9wVGhlbWVEYXRhLT5jbHJTZXBlcmF0b3IpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckhTZXApOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTAlDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd0RhdGVzSW5CSyhDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTUNEX1NlbGVjdGVkKSB7DQotICAgICAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICAgICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgICAgIENGWF9SZWN0RiBydFNlbERheTsNCi0gICAgICAgIHJ0U2VsRGF5ID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShydFNlbERheS5sZWZ0LCBydFNlbERheS50b3AsIHJ0U2VsRGF5LndpZHRoLCBydFNlbERheS5oZWlnaHQpOw0KLSAgICAgICAgQ0ZYX0NvbG9yIGNsclNlbERheUJLOw0KLSAgICAgICAgY2xyU2VsRGF5QksgPSBtX3BUaGVtZURhdGEtPmNsckRhdGVzU2VsZWN0ZWRCSzsNCi0gICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclNlbERheUJLKTsNCi0gICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KLSAgICB9IGVsc2UgaWYgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX01DRF9Ib3ZlcmVkKSB7DQotICAgICAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICAgICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgICAgIENGWF9SZWN0RiBydFNlbERheTsNCi0gICAgICAgIHJ0U2VsRGF5ID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShydFNlbERheS5sZWZ0LCBydFNlbERheS50b3AsIHJ0U2VsRGF5LndpZHRoLCBydFNlbERheS5oZWlnaHQpOw0KLSAgICAgICAgQ0ZYX0NvbG9yIGNsclNlbERheUJLOw0KLSAgICAgICAgY2xyU2VsRGF5QksgPSBtX3BUaGVtZURhdGEtPmNsckRhdGVzSG92ZXJCSzsNCi0gICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclNlbERheUJLKTsNCi0gICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KLSAgICB9DQotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdEYXRlc0luQ2lyY2xlKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zLCBDRlhfTWF0cml4ICpwTWF0cml4KQ0KLXsNCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3RGF0ZXNJbkJLKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTUNEX1NlbGVjdGVkKSB7DQogICAgIENGWF9QYXRoIHBhdGg7DQogICAgIHBhdGguQ3JlYXRlKCk7DQogICAgIENGWF9SZWN0RiBydFNlbERheTsNCiAgICAgcnRTZWxEYXkgPSBwUGFyYW1zLT5tX3J0UGFydDsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocnRTZWxEYXkubGVmdCwgcnRTZWxEYXkudG9wLCBydFNlbERheS53aWR0aCwgcnRTZWxEYXkuaGVpZ2h0KTsNCi0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0U2VsRGF5LmxlZnQsIHJ0U2VsRGF5LnRvcCwgcnRTZWxEYXkud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgIHJ0U2VsRGF5LmhlaWdodCk7DQogICAgIENGWF9Db2xvciBjbHJTZWxEYXlCSzsNCi0gICAgY2xyU2VsRGF5QksgPSBtX3BUaGVtZURhdGEtPmNsckRhdGVzQ2lyY2xlOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsclNlbERheUJLKTsNCi0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdUb2RheUNpcmNsZShDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcywgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQorICAgIGNsclNlbERheUJLID0gbV9wVGhlbWVEYXRhLT5jbHJEYXRlc1NlbGVjdGVkQks7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclNlbERheUJLKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICB9IGVsc2UgaWYgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX01DRF9Ib3ZlcmVkKSB7DQogICAgIENGWF9QYXRoIHBhdGg7DQogICAgIHBhdGguQ3JlYXRlKCk7DQotICAgIENGWF9SZWN0RiBydFRvZGF5Q2lyY2xlOw0KLSAgICBydFRvZGF5Q2lyY2xlID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0VG9kYXlDaXJjbGUubGVmdCwgcnRUb2RheUNpcmNsZS50b3AsIHJ0VG9kYXlDaXJjbGUud2lkdGgsIHJ0VG9kYXlDaXJjbGUuaGVpZ2h0KTsNCi0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIENGWF9Db2xvciBjbHJUb2RheUNpcmNsZTsNCi0gICAgY2xyVG9kYXlDaXJjbGUgPSBtX3BUaGVtZURhdGEtPmNsckRhdGVzQ2lyY2xlOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsclRvZGF5Q2lyY2xlKTsNCi0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIENGWF9SZWN0RiBydFNlbERheTsNCisgICAgcnRTZWxEYXkgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocnRTZWxEYXkubGVmdCwgcnRTZWxEYXkudG9wLCBydFNlbERheS53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgcnRTZWxEYXkuaGVpZ2h0KTsNCisgICAgQ0ZYX0NvbG9yIGNsclNlbERheUJLOw0KKyAgICBjbHJTZWxEYXlCSyA9IG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNIb3ZlckJLOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJTZWxEYXlCSyk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZXTFRIRU1FX1NUQVRFIENGV0xfTW9udGhDYWxlbmRhclRQOjpHZXRTdGF0ZShGWF9EV09SRCBkd0ZXTFN0YXRlcykNCi17DQotICAgIGlmIChkd0ZXTFN0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTUNEX0hvdmVyZWQpIHsNCi0gICAgICAgIHJldHVybiBGV0xUSEVNRV9TVEFURV9Ib3ZlcjsNCi0gICAgfSBlbHNlIGlmIChkd0ZXTFN0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQpIHsNCi0gICAgICAgIHJldHVybiBGV0xUSEVNRV9TVEFURV9QcmVzc2VkOw0KLSAgICB9DQotICAgIHJldHVybiBGV0xUSEVNRV9TVEFURV9Ob3JtYWw7DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd0RhdGVzSW5DaXJjbGUoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBDRlhfUmVjdEYgcnRTZWxEYXk7DQorICBydFNlbERheSA9IHBQYXJhbXMtPm1fcnRQYXJ0Ow0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnRTZWxEYXkubGVmdCwgcnRTZWxEYXkudG9wLCBydFNlbERheS53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgIHJ0U2VsRGF5LmhlaWdodCk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9Db2xvciBjbHJTZWxEYXlCSzsNCisgIGNsclNlbERheUJLID0gbV9wVGhlbWVEYXRhLT5jbHJEYXRlc0NpcmNsZTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyU2VsRGF5QkspOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6U2V0VGhlbWVEYXRhKEZYX0RXT1JEIGR3VGhlbWVJRCkNCi17DQotICAgIGlmIChkd1RoZW1lSUQgPT0gMCkgew0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDYXB0aW9uID0gQXJnYkVuY29kZSgweGZmLCAwLCAxNTMsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclNlcGVyYXRvciA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQxLCAxNjEsIDIzOSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckRhdGVzSG92ZXJCSyA9IEFyZ2JFbmNvZGUoMHhmZiwgMTkzLCAyMTEsIDI1MSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckRhdGVzU2VsZWN0ZWRCSyA9IEFyZ2JFbmNvZGUoMHhmZiwgMTczLCAxODgsIDIzOSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckRhdGVzQ2lyY2xlID0gQXJnYkVuY29kZSgweGZmLCAxMDMsIDE0NCwgMjA5KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyVG9kYXkgPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDAsIDApOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCSyA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAyNTUsIDI1NSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNhcHRpb24gPSBBcmdiRW5jb2RlKDB4ZmYsIDEyOCwgMTI4LCAwKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2VwZXJhdG9yID0gQXJnYkVuY29kZSgweGZmLCAxMjgsIDEyOCwgNjQpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJEYXRlc0hvdmVyQksgPSBBcmdiRW5jb2RlKDB4ZmYsICAyMTcsIDIyMCwgMTkxKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNTZWxlY3RlZEJLID0gQXJnYkVuY29kZSgweGZmLCAyMDQsIDIwOCwgMTgzKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNDaXJjbGUgPSBBcmdiRW5jb2RlKDB4ZmYsIDEyOCwgMTI4LCAwKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyVG9kYXkgPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDAsIDApOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCSyA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAyNTUsIDI1NSk7DQotICAgIH0NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3VG9kYXlDaXJjbGUoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgQ0ZYX1JlY3RGIHJ0VG9kYXlDaXJjbGU7DQorICBydFRvZGF5Q2lyY2xlID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydFRvZGF5Q2lyY2xlLmxlZnQsIHJ0VG9kYXlDaXJjbGUudG9wLCBydFRvZGF5Q2lyY2xlLndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgcnRUb2RheUNpcmNsZS5oZWlnaHQpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY2xyVG9kYXlDaXJjbGU7DQorICBjbHJUb2RheUNpcmNsZSA9IG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNDaXJjbGU7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsclRvZGF5Q2lyY2xlKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTFRIRU1FX1NUQVRFIENGV0xfTW9udGhDYWxlbmRhclRQOjpHZXRTdGF0ZShGWF9EV09SRCBkd0ZXTFN0YXRlcykgew0KKyAgaWYgKGR3RldMU3RhdGVzICYgRldMX1BBUlRTVEFURV9NQ0RfSG92ZXJlZCkgew0KKyAgICByZXR1cm4gRldMVEhFTUVfU1RBVEVfSG92ZXI7DQorICB9IGVsc2UgaWYgKGR3RldMU3RhdGVzICYgRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZCkgew0KKyAgICByZXR1cm4gRldMVEhFTUVfU1RBVEVfUHJlc3NlZDsNCisgIH0NCisgIHJldHVybiBGV0xUSEVNRV9TVEFURV9Ob3JtYWw7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OlNldFRoZW1lRGF0YShGWF9EV09SRCBkd1RoZW1lSUQpIHsNCisgIGlmIChkd1RoZW1lSUQgPT0gMCkgew0KKyAgICBtX3BUaGVtZURhdGEtPmNsckNhcHRpb24gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDE1MywgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTZXBlcmF0b3IgPSBBcmdiRW5jb2RlKDB4ZmYsIDE0MSwgMTYxLCAyMzkpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckRhdGVzSG92ZXJCSyA9IEFyZ2JFbmNvZGUoMHhmZiwgMTkzLCAyMTEsIDI1MSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNTZWxlY3RlZEJLID0gQXJnYkVuY29kZSgweGZmLCAxNzMsIDE4OCwgMjM5KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJEYXRlc0NpcmNsZSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTAzLCAxNDQsIDIwOSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyVG9kYXkgPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDAsIDApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJLID0gQXJnYkVuY29kZSgweGZmLCAyNTUsIDI1NSwgMjU1KTsNCisgIH0gZWxzZSB7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2FwdGlvbiA9IEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxMjgsIDApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclNlcGVyYXRvciA9IEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxMjgsIDY0KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJEYXRlc0hvdmVyQksgPSBBcmdiRW5jb2RlKDB4ZmYsIDIxNywgMjIwLCAxOTEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckRhdGVzU2VsZWN0ZWRCSyA9IEFyZ2JFbmNvZGUoMHhmZiwgMjA0LCAyMDgsIDE4Myk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNDaXJjbGUgPSBBcmdiRW5jb2RlKDB4ZmYsIDEyOCwgMTI4LCAwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJUb2RheSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMCwgMCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQksgPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KKyAgfQ0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvcGljdHVyZWJveHRwLmNwcCBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9waWN0dXJlYm94dHAuY3BwCmluZGV4IDkxOWU3ODYuLmVmNTliYmYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9waWN0dXJlYm94dHAuY3BwCisrKyBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9waWN0dXJlYm94dHAuY3BwCkBAIC01LDMxICs1LDI1IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KLUNGV0xfUGljdHVyZUJveFRQOjpDRldMX1BpY3R1cmVCb3hUUCgpDQotew0KK0NGV0xfUGljdHVyZUJveFRQOjpDRldMX1BpY3R1cmVCb3hUUCgpIHt9DQorQ0ZXTF9QaWN0dXJlQm94VFA6On5DRldMX1BpY3R1cmVCb3hUUCgpIHt9DQorRlhfQk9PTCBDRldMX1BpY3R1cmVCb3hUUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGQUxTRSk7DQorICByZXR1cm4gcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfUGljdHVyZUJveDsNCiB9DQotQ0ZXTF9QaWN0dXJlQm94VFA6On5DRldMX1BpY3R1cmVCb3hUUCgpDQotew0KLX0NCi1GWF9CT09MCUNGV0xfUGljdHVyZUJveFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGQUxTRSk7DQotICAgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9QaWN0dXJlQm94Ow0KLX0NCi1GWF9CT09MCUNGV0xfUGljdHVyZUJveFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KLSAgICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCi0gICAgICAgIGNhc2UgRldMX1BBUlRfUFRCX0JvcmRlcjogew0KLSAgICAgICAgICAgICAgICBEcmF3Qm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRfUFRCX0VkZ2U6IHsNCi0gICAgICAgICAgICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCitGWF9CT09MIENGV0xfUGljdHVyZUJveFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgY2FzZSBGV0xfUEFSVF9QVEJfQm9yZGVyOiB7DQorICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIEZXTF9QQVJUX1BUQl9FZGdlOiB7DQorICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksDQorICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL3B1c2hidXR0b250cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvcHVzaGJ1dHRvbnRwLmNwcAppbmRleCA5ZjMxMjdmLi41ODIwMTEzIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvcHVzaGJ1dHRvbnRwLmNwcAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvcHVzaGJ1dHRvbnRwLmNwcApAQCAtNSwxNjEgKzUsMTQ5IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KLSNkZWZpbmUgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lcgkJMg0KLUNGV0xfUHVzaEJ1dHRvblRQOjpDRldMX1B1c2hCdXR0b25UUCgpDQotew0KLSAgICBtX3BUaGVtZURhdGEgPSBGWF9ORVcgUEJUaGVtZURhdGE7DQotICAgIFNldFRoZW1lRGF0YSgwKTsNCisjZGVmaW5lIFBVU0hCVVRUT05fU0laRV9Db3JuZXIgMg0KK0NGV0xfUHVzaEJ1dHRvblRQOjpDRldMX1B1c2hCdXR0b25UUCgpIHsNCisgIG1fcFRoZW1lRGF0YSA9IEZYX05FVyBQQlRoZW1lRGF0YTsNCisgIFNldFRoZW1lRGF0YSgwKTsNCiB9DQotQ0ZXTF9QdXNoQnV0dG9uVFA6On5DRldMX1B1c2hCdXR0b25UUCgpDQotew0KLSAgICBpZiAobV9wVGhlbWVEYXRhKSB7DQotICAgICAgICBkZWxldGUgbV9wVGhlbWVEYXRhOw0KK0NGV0xfUHVzaEJ1dHRvblRQOjp+Q0ZXTF9QdXNoQnV0dG9uVFAoKSB7DQorICBpZiAobV9wVGhlbWVEYXRhKSB7DQorICAgIGRlbGV0ZSBtX3BUaGVtZURhdGE7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9QdXNoQnV0dG9uVFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9QdXNoQnV0dG9uOw0KK30NCitGWF9EV09SRCBDRldMX1B1c2hCdXR0b25UUDo6U2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RoZW1lSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4pIHsNCisgIFNldFRoZW1lRGF0YShGV0xfR2V0VGhlbWVDb2xvcihkd1RoZW1lSUQpKTsNCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKHBXaWRnZXQsIGR3VGhlbWVJRCwgYkNoaWxkcmVuKTsNCit9DQorRlhfQk9PTCBDRldMX1B1c2hCdXR0b25UUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICBjYXNlIEZXTF9QQVJUX1BTQl9Cb3JkZXI6IHsNCisgICAgICBEcmF3Qm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi19DQotRlhfQk9PTCBDRldMX1B1c2hCdXR0b25UUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9QdXNoQnV0dG9uOw0KLX0NCi1GWF9EV09SRCBDRldMX1B1c2hCdXR0b25UUDo6U2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRFdPUkQgZHdUaGVtZUlELCBGWF9CT09MIGJDaGlsZHJlbiApDQotew0KLSAgICBTZXRUaGVtZURhdGEoRldMX0dldFRoZW1lQ29sb3IoZHdUaGVtZUlEKSk7DQotICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKHBXaWRnZXQsIGR3VGhlbWVJRCwgYkNoaWxkcmVuKTsNCi19DQotRlhfQk9PTAlDRldMX1B1c2hCdXR0b25UUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpDQotew0KLSAgICBzd2l0Y2gocFBhcmFtcy0+bV9pUGFydCkgew0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9QU0JfQm9yZGVyOiB7DQotICAgICAgICAgICAgICAgIERyYXdCb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9QU0JfRWRnZTogew0KLSAgICAgICAgICAgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX1BTQl9CYWNrZ3JvdW5kOiB7DQotICAgICAgICAgICAgICAgIENGWF9SZWN0RiAmcmVjdCA9IHBQYXJhbXMtPm1fcnRQYXJ0Ow0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUmlnaHQgPSByZWN0LnJpZ2h0KCk7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZCb3R0b20gPSByZWN0LmJvdHRvbSgpOw0KLSAgICAgICAgICAgICAgICBDRlhfUGF0aCBzdHJva2VQYXRoOw0KLSAgICAgICAgICAgICAgICBzdHJva2VQYXRoLkNyZWF0ZSgpOw0KLSAgICAgICAgICAgICAgICBzdHJva2VQYXRoLk1vdmVUbyhyZWN0LmxlZnQgKyBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLCByZWN0LnRvcCk7DQotICAgICAgICAgICAgICAgIHN0cm9rZVBhdGguTGluZVRvKGZSaWdodCAtIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsIHJlY3QudG9wKTsNCi0gICAgICAgICAgICAgICAgc3Ryb2tlUGF0aC5MaW5lVG8oZlJpZ2h0LCByZWN0LnRvcCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIpOw0KLSAgICAgICAgICAgICAgICBzdHJva2VQYXRoLkxpbmVUbyhmUmlnaHQsIGZCb3R0b20gLSBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyKTsNCi0gICAgICAgICAgICAgICAgc3Ryb2tlUGF0aC5MaW5lVG8oZlJpZ2h0IC0gUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciwgZkJvdHRvbSk7DQotICAgICAgICAgICAgICAgIHN0cm9rZVBhdGguTGluZVRvKHJlY3QubGVmdCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsIGZCb3R0b20pOw0KLSAgICAgICAgICAgICAgICBzdHJva2VQYXRoLkxpbmVUbyhyZWN0LmxlZnQsIGZCb3R0b20gLSBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyKTsNCi0gICAgICAgICAgICAgICAgc3Ryb2tlUGF0aC5MaW5lVG8ocmVjdC5sZWZ0LCByZWN0LnRvcCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIpOw0KLSAgICAgICAgICAgICAgICBzdHJva2VQYXRoLkxpbmVUbyhyZWN0LmxlZnQgKyBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLCByZWN0LnRvcCk7DQotICAgICAgICAgICAgICAgIENGWF9QYXRoIGZpbGxQYXRoOw0KLSAgICAgICAgICAgICAgICBmaWxsUGF0aC5DcmVhdGUoKTsNCi0gICAgICAgICAgICAgICAgZmlsbFBhdGguQWRkU3VicGF0aCgmc3Ryb2tlUGF0aCk7DQotICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzID0gcFBhcmFtcy0+bV9wR3JhcGhpY3M7DQotICAgICAgICAgICAgICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0SW5uZXIocmVjdCk7DQotICAgICAgICAgICAgICAgIHJ0SW5uZXIuRGVmbGF0ZShQVVNIQlVUVE9OX1NJWkVfQ29ybmVyICsgMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVU0hCVVRUT05fU0laRV9Db3JuZXIgKyAxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVU0hCVVRUT05fU0laRV9Db3JuZXIpOw0KLSAgICAgICAgICAgICAgICBmaWxsUGF0aC5BZGRSZWN0YW5nbGUocnRJbm5lci5sZWZ0LCBydElubmVyLnRvcCwgcnRJbm5lci53aWR0aCwgcnRJbm5lci5oZWlnaHQpOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlDb2xvciA9IEdldENvbG9ySUQocFBhcmFtcy0+bV9kd1N0YXRlcyk7DQotICAgICAgICAgICAgICAgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ICsgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbaUNvbG9yXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFtpQ29sb3JdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxsUGF0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIENGWF9Db2xvciBjclN0cm9rZShtX3BUaGVtZURhdGEtPmNsckJvcmRlcltpQ29sb3JdKTsNCi0gICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JTdHJva2UpOw0KLSAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnN0cm9rZVBhdGgsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGZpbGxQYXRoLkNsZWFyKCk7DQotICAgICAgICAgICAgICAgIGZpbGxQYXRoLkFkZFJlY3RhbmdsZShydElubmVyLmxlZnQsIHJ0SW5uZXIudG9wLCBydElubmVyLndpZHRoLCBydElubmVyLmhlaWdodCk7DQotICAgICAgICAgICAgICAgIENGWF9Db2xvciBjckZpbGwobV9wVGhlbWVEYXRhLT5jbHJGaWxsW2lDb2xvcl0pOw0KLSAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCi0gICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmZmlsbFBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfUFNCX0ZvY3VzZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJ0SW5uZXIuSW5mbGF0ZSgxLCAxLCAwLCAwKTsNCi0gICAgICAgICAgICAgICAgICAgIERyYXdGb2N1cyhwR3JhcGhpY3MsICZydElubmVyLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9QU0JfRWRnZTogew0KKyAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLA0KKyAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCogQ0ZXTF9QdXNoQnV0dG9uVFA6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KQ0KLXsNCi0gICAgaWYgKGR3Q2FwYWNpdHkgPT0gRldMX1dHVENBUEFDSVRZX1BTQl9NYXJnaW4pIHsNCi0gICAgICAgIG1fZlZhbHVlID0gMDsNCi0gICAgICAgIHJldHVybiAmbV9mVmFsdWU7DQorICAgIGNhc2UgRldMX1BBUlRfUFNCX0JhY2tncm91bmQ6IHsNCisgICAgICBDRlhfUmVjdEYmIHJlY3QgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgICAgICBGWF9GTE9BVCBmUmlnaHQgPSByZWN0LnJpZ2h0KCk7DQorICAgICAgRlhfRkxPQVQgZkJvdHRvbSA9IHJlY3QuYm90dG9tKCk7DQorICAgICAgQ0ZYX1BhdGggc3Ryb2tlUGF0aDsNCisgICAgICBzdHJva2VQYXRoLkNyZWF0ZSgpOw0KKyAgICAgIHN0cm9rZVBhdGguTW92ZVRvKHJlY3QubGVmdCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsIHJlY3QudG9wKTsNCisgICAgICBzdHJva2VQYXRoLkxpbmVUbyhmUmlnaHQgLSBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLCByZWN0LnRvcCk7DQorICAgICAgc3Ryb2tlUGF0aC5MaW5lVG8oZlJpZ2h0LCByZWN0LnRvcCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIpOw0KKyAgICAgIHN0cm9rZVBhdGguTGluZVRvKGZSaWdodCwgZkJvdHRvbSAtIFBVU0hCVVRUT05fU0laRV9Db3JuZXIpOw0KKyAgICAgIHN0cm9rZVBhdGguTGluZVRvKGZSaWdodCAtIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsIGZCb3R0b20pOw0KKyAgICAgIHN0cm9rZVBhdGguTGluZVRvKHJlY3QubGVmdCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsIGZCb3R0b20pOw0KKyAgICAgIHN0cm9rZVBhdGguTGluZVRvKHJlY3QubGVmdCwgZkJvdHRvbSAtIFBVU0hCVVRUT05fU0laRV9Db3JuZXIpOw0KKyAgICAgIHN0cm9rZVBhdGguTGluZVRvKHJlY3QubGVmdCwgcmVjdC50b3AgKyBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyKTsNCisgICAgICBzdHJva2VQYXRoLkxpbmVUbyhyZWN0LmxlZnQgKyBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLCByZWN0LnRvcCk7DQorICAgICAgQ0ZYX1BhdGggZmlsbFBhdGg7DQorICAgICAgZmlsbFBhdGguQ3JlYXRlKCk7DQorICAgICAgZmlsbFBhdGguQWRkU3VicGF0aCgmc3Ryb2tlUGF0aCk7DQorICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsNCisgICAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgICAgQ0ZYX1JlY3RGIHJ0SW5uZXIocmVjdCk7DQorICAgICAgcnRJbm5lci5EZWZsYXRlKFBVU0hCVVRUT05fU0laRV9Db3JuZXIgKyAxLCBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyICsgMSwNCisgICAgICAgICAgICAgICAgICAgICAgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciwgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lcik7DQorICAgICAgZmlsbFBhdGguQWRkUmVjdGFuZ2xlKHJ0SW5uZXIubGVmdCwgcnRJbm5lci50b3AsIHJ0SW5uZXIud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0SW5uZXIuaGVpZ2h0KTsNCisgICAgICBpbnQzMl90IGlDb2xvciA9IEdldENvbG9ySUQocFBhcmFtcy0+bV9kd1N0YXRlcyk7DQorICAgICAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsIHJlY3QubGVmdCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsIHJlY3QudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ICsgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciwgcmVjdC5ib3R0b20oKSwNCisgICAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbaUNvbG9yXSwNCisgICAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kW2lDb2xvcl0sICZmaWxsUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9BTFRFUk5BVEUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgQ0ZYX0NvbG9yIGNyU3Ryb2tlKG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyW2lDb2xvcl0pOw0KKyAgICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyU3Ryb2tlKTsNCisgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnN0cm9rZVBhdGgsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgZmlsbFBhdGguQ2xlYXIoKTsNCisgICAgICBmaWxsUGF0aC5BZGRSZWN0YW5nbGUocnRJbm5lci5sZWZ0LCBydElubmVyLnRvcCwgcnRJbm5lci53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRJbm5lci5oZWlnaHQpOw0KKyAgICAgIENGWF9Db2xvciBjckZpbGwobV9wVGhlbWVEYXRhLT5jbHJGaWxsW2lDb2xvcl0pOw0KKyAgICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJmZpbGxQYXRoLCBGWEZJTExfV0lORElORywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfUFNCX0ZvY3VzZWQpIHsNCisgICAgICAgIHJ0SW5uZXIuSW5mbGF0ZSgxLCAxLCAwLCAwKTsNCisgICAgICAgIERyYXdGb2N1cyhwR3JhcGhpY3MsICZydElubmVyLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIH0NCisgICAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkdldENhcGFjaXR5KHBUaGVtZVBhcnQsIGR3Q2FwYWNpdHkpOw0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9QdXNoQnV0dG9uVFA6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgSW5pdFRUTygpOw0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KK3ZvaWQqIENGV0xfUHVzaEJ1dHRvblRQOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDYXBhY2l0eSkgew0KKyAgaWYgKGR3Q2FwYWNpdHkgPT0gRldMX1dHVENBUEFDSVRZX1BTQl9NYXJnaW4pIHsNCisgICAgbV9mVmFsdWUgPSAwOw0KKyAgICByZXR1cm4gJm1fZlZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkdldENhcGFjaXR5KHBUaGVtZVBhcnQsIGR3Q2FwYWNpdHkpOw0KIH0NCi1GV0xfRVJSCUNGV0xfUHVzaEJ1dHRvblRQOjpGaW5hbGl6ZSgpDQotew0KLSAgICBGaW5hbGl6ZVRUTygpOw0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvblRQOjpJbml0aWFsaXplKCkgew0KKyAgSW5pdFRUTygpOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkluaXRpYWxpemUoKTsNCiB9DQotdm9pZCBDRldMX1B1c2hCdXR0b25UUDo6U2V0VGhlbWVEYXRhKEZYX0RXT1JEIGR3SUQpDQotew0KLSAgICBGWF9BUkdCICpwRGF0YSA9IChGWF9BUkdCKikmKm1fcFRoZW1lRGF0YTsNCi0gICAgaWYgKGR3SUQpIHsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzBdID0gQXJnYkVuY29kZSgyNTUsIDU1LCA5OCwgNik7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJvcmRlclsxXSA9IEFyZ2JFbmNvZGUoMjU1LCA1NSwgOTgsIDYpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDI1NSwgNTUsIDk4LCA2KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzNdID0gQXJnYkVuY29kZSgyNTUsIDU1LCA5OCwgNik7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJvcmRlcls0XSA9IEFyZ2JFbmNvZGUoMjU1LCAxNzIsIDE2OCwgMTUzKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI0Nik7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzFdID0gQXJnYkVuY29kZSgyNTUsIDIyMywgMjA1LCAxODApOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTIsIDE5NywgMTQ5KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMTk0LCAyMDksIDE0Myk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzRdID0gQXJnYkVuY29kZSgyNTUsIDIxNiwgMjE2LCAyMTYpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjI3LCAyMDksIDE4NCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDI0NCwgMjI4KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzJdID0gQXJnYkVuY29kZSgyNTUsIDIwNywgMTE0LCAzNyk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAxNDQsIDE5MywgODQpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbNF0gPSBBcmdiRW5jb2RlKDI1NSwgMTcyLCAxNjgsIDE1Myk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjI2LCAyMjUsIDIxOCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbM10gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbNF0gPSBBcmdiRW5jb2RlKDI1NSwgMjQ1LCAyNDQsIDIzNCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJvcmRlclswXSA9IEFyZ2JFbmNvZGUoMjU1LCAwLCA2MCwgMTE2KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzFdID0gQXJnYkVuY29kZSgyNTUsIDAsIDYwLCAxMTYpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMCwgNjAsIDExNik7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJvcmRlclszXSA9IEFyZ2JFbmNvZGUoMjU1LCAwLCA2MCwgMTE2KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzRdID0gQXJnYkVuY29kZSgyNTUsIDIwMSwgMTk5LCAxODYpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjA5LCAyMDQsIDE5Myk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzJdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDYsIDIzMSwgMjU1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbNF0gPSBBcmdiRW5jb2RlKDI1NSwgMjQ1LCAyNDQsIDIzNCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMTQsIDIwOCwgMTk3KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzFdID0gQXJnYkVuY29kZSgyNTUsIDI0MiwgMjQxLCAyMzgpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjI5LCAxNTEsIDApOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMTA1LCAxMzAsIDIzOCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFs0XSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDUsIDI0NCwgMjM0KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMjYsIDIyNSwgMjE4KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFs0XSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDUsIDI0NCwgMjM0KTsNCi0gICAgfQ0KK0ZXTF9FUlIgQ0ZXTF9QdXNoQnV0dG9uVFA6OkZpbmFsaXplKCkgew0KKyAgRmluYWxpemVUVE8oKTsNCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpGaW5hbGl6ZSgpOw0KIH0NCi1pbnQzMl90IENGV0xfUHVzaEJ1dHRvblRQOjpHZXRDb2xvcklEKEZYX0RXT1JEIGR3U3RhdGVzKQ0KLXsNCi0gICAgcmV0dXJuIGR3U3RhdGVzICY9IEZXTF9QQVJUU1RBVEVfUFNCX01hc2s7DQordm9pZCBDRldMX1B1c2hCdXR0b25UUDo6U2V0VGhlbWVEYXRhKEZYX0RXT1JEIGR3SUQpIHsNCisgIEZYX0FSR0IqIHBEYXRhID0gKEZYX0FSR0IqKSYqbV9wVGhlbWVEYXRhOw0KKyAgaWYgKGR3SUQpIHsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbMF0gPSBBcmdiRW5jb2RlKDI1NSwgNTUsIDk4LCA2KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDI1NSwgNTUsIDk4LCA2KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDI1NSwgNTUsIDk4LCA2KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbM10gPSBBcmdiRW5jb2RlKDI1NSwgNTUsIDk4LCA2KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbNF0gPSBBcmdiRW5jb2RlKDI1NSwgMTcyLCAxNjgsIDE1Myk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI0Nik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjIzLCAyMDUsIDE4MCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjUyLCAxOTcsIDE0OSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMTk0LCAyMDksIDE0Myk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU3RhcnRbNF0gPSBBcmdiRW5jb2RlKDI1NSwgMjE2LCAyMTYsIDIxNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzBdID0gQXJnYkVuY29kZSgyNTUsIDIyNywgMjA5LCAxODQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckVuZFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDI0NCwgMjI4KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjA3LCAxMTQsIDM3KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMTQ0LCAxOTMsIDg0KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbNF0gPSBBcmdiRW5jb2RlKDI1NSwgMTcyLCAxNjgsIDE1Myk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGaWxsWzFdID0gQXJnYkVuY29kZSgyNTUsIDIyNiwgMjI1LCAyMTgpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGaWxsWzRdID0gQXJnYkVuY29kZSgyNTUsIDI0NSwgMjQ0LCAyMzQpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMCwgNjAsIDExNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzFdID0gQXJnYkVuY29kZSgyNTUsIDAsIDYwLCAxMTYpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJvcmRlclsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAwLCA2MCwgMTE2KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbM10gPSBBcmdiRW5jb2RlKDI1NSwgMCwgNjAsIDExNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzRdID0gQXJnYkVuY29kZSgyNTUsIDIwMSwgMTk5LCAxODYpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzBdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzFdID0gQXJnYkVuY29kZSgyNTUsIDIwOSwgMjA0LCAxOTMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzJdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzNdID0gQXJnYkVuY29kZSgyNTUsIDIwNiwgMjMxLCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzRdID0gQXJnYkVuY29kZSgyNTUsIDI0NSwgMjQ0LCAyMzQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckVuZFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMTQsIDIwOCwgMTk3KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjQyLCAyNDEsIDIzOCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzJdID0gQXJnYkVuY29kZSgyNTUsIDIyOSwgMTUxLCAwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMTA1LCAxMzAsIDIzOCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzRdID0gQXJnYkVuY29kZSgyNTUsIDI0NSwgMjQ0LCAyMzQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMjYsIDIyNSwgMjE4KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGaWxsWzJdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbM10gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFs0XSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDUsIDI0NCwgMjM0KTsNCisgIH0NCit9DQoraW50MzJfdCBDRldMX1B1c2hCdXR0b25UUDo6R2V0Q29sb3JJRChGWF9EV09SRCBkd1N0YXRlcykgew0KKyAgcmV0dXJuIGR3U3RhdGVzICY9IEZXTF9QQVJUU1RBVEVfUFNCX01hc2s7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9zY3JvbGxiYXJ0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvc2Nyb2xsYmFydHAuY3BwCmluZGV4IGMxMDUwN2EuLmJjOWY0MTkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9zY3JvbGxiYXJ0cC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL3Njcm9sbGJhcnRwLmNwcApAQCAtNSwzNTggKzUsMzY3IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KLSNkZWZpbmUgRldMX1NDUk9MTF9QYXdMZW4JMTIuNWYNCi1DRldMX1Njcm9sbEJhclRQOjpDRldMX1Njcm9sbEJhclRQKCkNCi17DQotICAgIG1fcFRoZW1lRGF0YSA9IEZYX05FVyBTQlRoZW1lRGF0YTsNCi0gICAgU2V0VGhlbWVEYXRhKDApOw0KKyNkZWZpbmUgRldMX1NDUk9MTF9QYXdMZW4gMTIuNWYNCitDRldMX1Njcm9sbEJhclRQOjpDRldMX1Njcm9sbEJhclRQKCkgew0KKyAgbV9wVGhlbWVEYXRhID0gRlhfTkVXIFNCVGhlbWVEYXRhOw0KKyAgU2V0VGhlbWVEYXRhKDApOw0KIH0NCi1DRldMX1Njcm9sbEJhclRQOjp+Q0ZXTF9TY3JvbGxCYXJUUCgpDQotew0KLSAgICBpZiAobV9wVGhlbWVEYXRhKSB7DQotICAgICAgICBkZWxldGUgbV9wVGhlbWVEYXRhOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhICA9IE5VTEw7DQotICAgIH0NCitDRldMX1Njcm9sbEJhclRQOjp+Q0ZXTF9TY3JvbGxCYXJUUCgpIHsNCisgIGlmIChtX3BUaGVtZURhdGEpIHsNCisgICAgZGVsZXRlIG1fcFRoZW1lRGF0YTsNCisgICAgbV9wVGhlbWVEYXRhID0gTlVMTDsNCisgIH0NCiB9DQotRlhfQk9PTAlDRldMX1Njcm9sbEJhclRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGQUxTRSk7DQotICAgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9TY3JvbGxCYXI7DQorRlhfQk9PTCBDRldMX1Njcm9sbEJhclRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZBTFNFKTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9TY3JvbGxCYXI7DQogfQ0KLXZvaWQqIENGV0xfU2Nyb2xsQmFyVFA6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KQ0KLXsNCi0gICAgaWYgKGR3Q2FwYWNpdHkgPT0gRldMX0NBUEFDSVRZX1NDQl9TaXplKSB7DQotICAgICAgICBtX2ZWYWx1ZSA9IDU7DQotICAgICAgICByZXR1cm4gJm1fZlZhbHVlOw0KLSAgICB9DQotICAgIHJldHVybiBDRldMX1dpZGdldFRQOjpHZXRDYXBhY2l0eShwVGhlbWVQYXJ0LCBkd0NhcGFjaXR5KTsNCit2b2lkKiBDRldMX1Njcm9sbEJhclRQOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NhcGFjaXR5KSB7DQorICBpZiAoZHdDYXBhY2l0eSA9PSBGV0xfQ0FQQUNJVFlfU0NCX1NpemUpIHsNCisgICAgbV9mVmFsdWUgPSA1Ow0KKyAgICByZXR1cm4gJm1fZlZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkdldENhcGFjaXR5KHBUaGVtZVBhcnQsIGR3Q2FwYWNpdHkpOw0KIH0NCi1GWF9EV09SRCBDRldMX1Njcm9sbEJhclRQOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9EV09SRCBkd1RoZW1lSUQsIEZYX0JPT0wgYkNoaWxkcmVuICkNCi17DQotICAgIGlmIChtX3BUaGVtZURhdGEpIHsNCi0gICAgICAgIFNldFRoZW1lRGF0YShGV0xfR2V0VGhlbWVDb2xvcihkd1RoZW1lSUQpKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6U2V0VGhlbWVJRChwV2lkZ2V0LCBkd1RoZW1lSUQsIGJDaGlsZHJlbik7DQorRlhfRFdPUkQgQ0ZXTF9TY3JvbGxCYXJUUDo6U2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoaWxkcmVuKSB7DQorICBpZiAobV9wVGhlbWVEYXRhKSB7DQorICAgIFNldFRoZW1lRGF0YShGV0xfR2V0VGhlbWVDb2xvcihkd1RoZW1lSUQpKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKHBXaWRnZXQsIGR3VGhlbWVJRCwgYkNoaWxkcmVuKTsNCiB9DQotRlhfQk9PTAlDRldMX1Njcm9sbEJhclRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCi17DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KLSAgICBJRldMX1dpZGdldCAqcFdpZGdldCA9IHBQYXJhbXMtPm1fcFdpZGdldDsNCi0gICAgRlhfRFdPUkQgZHdTdHlsZUV4ID0gcFdpZGdldC0+R2V0U3R5bGVzRXgoKTsNCi0gICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfTm9ybWFsOw0KLSAgICBzd2l0Y2ggKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiAweDAzKSB7DQotICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfU0NCX0hvdmVyZWQ6IHsNCi0gICAgICAgICAgICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfSG92ZXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZDogew0KLSAgICAgICAgICAgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfU0NCX0Rpc2FibGVkOiB7DQotICAgICAgICAgICAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQorRlhfQk9PTCBDRldMX1Njcm9sbEJhclRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQorICBJRldMX1dpZGdldCogcFdpZGdldCA9IHBQYXJhbXMtPm1fcFdpZGdldDsNCisgIEZYX0RXT1JEIGR3U3R5bGVFeCA9IHBXaWRnZXQtPkdldFN0eWxlc0V4KCk7DQorICBGV0xUSEVNRV9TVEFURSBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9Ob3JtYWw7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiAweDAzKSB7DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9TQ0JfSG92ZXJlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0hvdmVyOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIENGWF9HcmFwaGljcyAqcEdyYXBoaWNzID0gcFBhcmFtcy0+bV9wR3JhcGhpY3M7DQotICAgIENGWF9SZWN0RiAqcFJlY3QgPSAmcFBhcmFtcy0+bV9ydFBhcnQ7DQotICAgIEZYX0JPT0wgYlZlcnQgPSBwV2lkZ2V0LT5HZXRTdHlsZXNFeCgpOw0KLSAgICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCi0gICAgICAgIGNhc2UgRldMX1BBUlRfU0NCX0ZvcmVBcnJvdzogew0KLSAgICAgICAgICAgICAgICBEcmF3TWF4TWluQnRuKHBHcmFwaGljcywgcFJlY3QsIGJWZXJ0ID8gRldMVEhFTUVfRElSRUNUSU9OX1VwIDogRldMVEhFTUVfRElSRUNUSU9OX0xlZnQsIGVTdGF0ZSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9TQ0JfQmFja0Fycm93OiB7DQotICAgICAgICAgICAgICAgIERyYXdNYXhNaW5CdG4ocEdyYXBoaWNzLCBwUmVjdCwgYlZlcnQgPyBGV0xUSEVNRV9ESVJFQ1RJT05fRG93biA6IEZXTFRIRU1FX0RJUkVDVElPTl9SaWdodCwgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9QQVJUX1NDQl9UaHVtYjogew0KLSAgICAgICAgICAgICAgICBEcmF3VGh1bWJCdG4ocEdyYXBoaWNzLCBwUmVjdCwgYlZlcnQsIGVTdGF0ZSwgVFJVRSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9TQ0JfTG93ZXJUcmFjazogew0KLSAgICAgICAgICAgICAgICBEcmF3VHJhY2socEdyYXBoaWNzLCBwUmVjdCwgYlZlcnQsIGVTdGF0ZSwgVFJVRSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfUEFSVF9TQ0JfVXBwZXJUcmFjazogew0KLSAgICAgICAgICAgICAgICBEcmF3VHJhY2socEdyYXBoaWNzLCBwUmVjdCwgYlZlcnQsIGVTdGF0ZSwgRkFMU0UsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICB9DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX1ByZXNzZWQ7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9TQ0JfRGlzYWJsZWQ6IHsNCisgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9EaXNhYmFsZTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsNCisgIENGWF9SZWN0RiogcFJlY3QgPSAmcFBhcmFtcy0+bV9ydFBhcnQ7DQorICBGWF9CT09MIGJWZXJ0ID0gcFdpZGdldC0+R2V0U3R5bGVzRXgoKTsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICBjYXNlIEZXTF9QQVJUX1NDQl9Gb3JlQXJyb3c6IHsNCisgICAgICBEcmF3TWF4TWluQnRuKHBHcmFwaGljcywgcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICBiVmVydCA/IEZXTFRIRU1FX0RJUkVDVElPTl9VcCA6IEZXTFRIRU1FX0RJUkVDVElPTl9MZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfU0NCX0JhY2tBcnJvdzogew0KKyAgICAgIERyYXdNYXhNaW5CdG4ocEdyYXBoaWNzLCBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgIGJWZXJ0ID8gRldMVEhFTUVfRElSRUNUSU9OX0Rvd24gOiBGV0xUSEVNRV9ESVJFQ1RJT05fUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9TQ0JfVGh1bWI6IHsNCisgICAgICBEcmF3VGh1bWJCdG4ocEdyYXBoaWNzLCBwUmVjdCwgYlZlcnQsIGVTdGF0ZSwgVFJVRSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX1NDQl9Mb3dlclRyYWNrOiB7DQorICAgICAgRHJhd1RyYWNrKHBHcmFwaGljcywgcFJlY3QsIGJWZXJ0LCBlU3RhdGUsIFRSVUUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9TQ0JfVXBwZXJUcmFjazogew0KKyAgICAgIERyYXdUcmFjayhwR3JhcGhpY3MsIHBSZWN0LCBiVmVydCwgZVN0YXRlLCBGQUxTRSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KICNpZmRlZiBUSEVNRV9YUFNpbWlsYXINCi12b2lkIENGV0xfU2Nyb2xsQmFyVFA6OkRyYXdUaHVtYkJ0bihDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRlhfQk9PTCBiVmVydCwgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBGWF9CT09MIGJQYXdCdXR0b24sIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgaWYgKGVTdGF0ZSA8IEZXTFRIRU1FX1NUQVRFX05vcm1hbCB8fCBlU3RhdGUgPiBGV0xUSEVNRV9TVEFURV9EaXNhYmFsZSkgew0KLSAgICAgICAgcmV0dXJuOw0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RodW1iQnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGF3QnV0dG9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmIChlU3RhdGUgPCBGV0xUSEVNRV9TVEFURV9Ob3JtYWwgfHwgZVN0YXRlID4gRldMVEhFTUVfU1RBVEVfRGlzYWJhbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBDRlhfUmVjdEYgcmVjdCgqcFJlY3QpOw0KKyAgaWYgKGJWZXJ0KSB7DQorICAgIHJlY3QuRGVmbGF0ZSgxLCAwKTsNCisgICAgaWYgKHJlY3QuSXNFbXB0eSgwLjFmKSkgew0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBDRlhfUmVjdEYgcmVjdCgqcFJlY3QpOw0KLSAgICBpZiAoYlZlcnQpIHsNCi0gICAgICAgIHJlY3QuRGVmbGF0ZSgxLCAwKTsNCi0gICAgICAgIGlmIChyZWN0LklzRW1wdHkoMC4xZikpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQotICAgICAgICBEcmF3QXhpYWxTaGFkaW5nKHBHcmFwaGljcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1tlU3RhdGUgLSAxXVswXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1tlU3RhdGUgLSAxXVsxXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwTWF0cml4KTsNCi0gICAgICAgIENGWF9Db2xvciByY1N0cm9rZTsNCi0gICAgICAgIHJjU3Ryb2tlLlNldChtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlcltlU3RhdGUgLSAxXSk7DQotICAgICAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZyY1N0cm9rZSk7DQotICAgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmVjdC5EZWZsYXRlKDAsIDEpOw0KLSAgICAgICAgaWYgKHJlY3QuSXNFbXB0eSgwLjFmKSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCi0gICAgICAgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbZVN0YXRlIC0gMV1bMF0sDQotICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbZVN0YXRlIC0gMV1bMV0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcE1hdHJpeCk7DQotICAgICAgICBDRlhfQ29sb3IgcmNTdHJva2U7DQotICAgICAgICByY1N0cm9rZS5TZXQobV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbZVN0YXRlIC0gMV0pOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmcmNTdHJva2UpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfU2Nyb2xsQmFyVFA6OkRyYXdQYXcoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0JPT0wgYlZlcnQsIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBpZiAoYlZlcnQpIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZQYXdMZW4gPSBGV0xfU0NST0xMX1Bhd0xlbjsNCi0gICAgICAgIGlmIChwUmVjdC0+d2lkdGggLyAyIDw9IGZQYXdMZW4pIHsNCi0gICAgICAgICAgICBmUGF3TGVuID0gKHBSZWN0LT53aWR0aCAtIDYpIC8gMiA7DQotICAgICAgICB9DQotICAgICAgICBGWF9GTE9BVCBmWCA9IHBSZWN0LT5sZWZ0ICsgcFJlY3QtPndpZHRoIC8gNDsNCi0gICAgICAgIEZYX0ZMT0FUIGZZID0gcFJlY3QtPnRvcCArIHBSZWN0LT5oZWlnaHQgLyAyOw0KLSAgICAgICAgcGF0aC5Nb3ZlVG8oZlgsIGZZIC0gNCk7DQotICAgICAgICBwYXRoLkxpbmVUbyhmWCArIGZQYXdMZW4sIGZZIC0gNCk7DQotICAgICAgICBwYXRoLk1vdmVUbyhmWCwgZlkgLSAyKTsNCi0gICAgICAgIHBhdGguTGluZVRvKGZYICsgZlBhd0xlbiwgZlkgLSAyKTsNCi0gICAgICAgIHBhdGguTW92ZVRvKGZYICwgZlkpOw0KLSAgICAgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSk7DQotICAgICAgICBwYXRoLk1vdmVUbyhmWCwgZlkgKyAyKTsNCi0gICAgICAgIHBhdGguTGluZVRvKGZYICsgZlBhd0xlbiwgZlkgKyAyKTsNCi0gICAgICAgIENGWF9Db2xvciBjbHJMaWdodChtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbZVN0YXRlIC0gMV0pOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMSk7DQotICAgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMaWdodCk7DQotICAgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgpOw0KLSAgICAgICAgZlgrKzsNCi0gICAgICAgIHBhdGguQ2xlYXIoKTsNCi0gICAgICAgIHBhdGguTW92ZVRvKGZYLCBmWSAtIDMpOw0KLSAgICAgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSAtIDMpOw0KLSAgICAgICAgcGF0aC5Nb3ZlVG8oZlgsIGZZIC0gMSk7DQotICAgICAgICBwYXRoLkxpbmVUbyhmWCArIGZQYXdMZW4sIGZZIC0gMSk7DQotICAgICAgICBwYXRoLk1vdmVUbyhmWCwgZlkgKyAxKTsNCi0gICAgICAgIHBhdGguTGluZVRvKGZYICsgZlBhd0xlbiwgZlkgKyAxKTsNCi0gICAgICAgIHBhdGguTW92ZVRvKGZYLCBmWSArIDMpOw0KLSAgICAgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSArIDMpOw0KLSAgICAgICAgQ0ZYX0NvbG9yIGNsckRhcmsobV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckRhcmtbZVN0YXRlIC0gMV0pOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMSk7DQotICAgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJEYXJrKTsNCi0gICAgICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWF9GTE9BVCBmUGF3TGVuID0gRldMX1NDUk9MTF9QYXdMZW47DQotICAgICAgICBpZiAocFJlY3QtPmhlaWdodCAvIDIgPD0gZlBhd0xlbikgew0KLSAgICAgICAgICAgIGZQYXdMZW4gPSAocFJlY3QtPmhlaWdodCAtIDYpIC8gMjsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZMT0FUIGZYID0gcFJlY3QtPmxlZnQgKyBwUmVjdC0+d2lkdGggLyAyOw0KLSAgICAgICAgRlhfRkxPQVQgZlkgPSBwUmVjdC0+dG9wICsgcFJlY3QtPmhlaWdodCAvIDQ7DQotICAgICAgICBwYXRoLk1vdmVUbyhmWCAtIDQsIGZZKTsNCi0gICAgICAgIHBhdGguTGluZVRvKGZYIC0gNCwgZlkgKyBmUGF3TGVuKTsNCi0gICAgICAgIHBhdGguTW92ZVRvKGZYIC0gMiwgZlkpOw0KLSAgICAgICAgcGF0aC5MaW5lVG8oZlggLSAyLCBmWSArIGZQYXdMZW4pOw0KLSAgICAgICAgcGF0aC5Nb3ZlVG8oZlgsIGZZKTsNCi0gICAgICAgIHBhdGguTGluZVRvKGZYLCBmWSArIGZQYXdMZW4pOw0KLSAgICAgICAgcGF0aC5Nb3ZlVG8oZlggKyAyLCBmWSk7DQotICAgICAgICBwYXRoLkxpbmVUbyhmWCArIDIsIGZZICsgZlBhd0xlbik7DQotICAgICAgICBDRlhfQ29sb3IgY2xyTGlnaHQobV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0W2VTdGF0ZSAtIDFdKTsNCi0gICAgICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTGlnaHQpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgICAgIGZZICsrOw0KLSAgICAgICAgcGF0aC5DbGVhcigpOw0KLSAgICAgICAgcGF0aC5Nb3ZlVG8oZlggLSAzLCBmWSk7DQotICAgICAgICBwYXRoLkxpbmVUbyhmWCAtIDMsIGZZICsgZlBhd0xlbik7DQotICAgICAgICBwYXRoLk1vdmVUbyhmWCAtIDEsIGZZKTsNCi0gICAgICAgIHBhdGguTGluZVRvKGZYIC0gMSwgZlkgKyBmUGF3TGVuKTsNCi0gICAgICAgIHBhdGguTW92ZVRvKGZYICsgMSwgZlkpOw0KLSAgICAgICAgcGF0aC5MaW5lVG8oZlggKyAxLCBmWSArIGZQYXdMZW4pOw0KLSAgICAgICAgcGF0aC5Nb3ZlVG8oZlggKyAzLCBmWSk7DQotICAgICAgICBwYXRoLkxpbmVUbyhmWCArIDMsIGZZICsgZlBhd0xlbik7DQotICAgICAgICBDRlhfQ29sb3IgY2xyRGFyayhtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1tlU3RhdGUgLSAxXSk7DQotICAgICAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxKTsNCi0gICAgICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckRhcmspOw0KLSAgICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgfQ0KLX0NCi12b2lkIENGV0xfU2Nyb2xsQmFyVFA6OkRyYXdUcmFjayhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRlhfQk9PTCBiVmVydCwgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBGWF9CT09MIGJMb3dlclRyYWNrLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIGlmIChlU3RhdGUgPCBGV0xUSEVNRV9TVEFURV9Ob3JtYWwgfHwgZVN0YXRlID4gRldMVEhFTUVfU1RBVEVfRGlzYWJhbGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICAgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0KCksIHJlY3QudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbZVN0YXRlIC0gMV1bMF0sDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1tlU3RhdGUgLSAxXVsxXSwgJnBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBDRlhfQ29sb3IgcmNTdHJva2U7DQorICAgIHJjU3Ryb2tlLlNldChtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlcltlU3RhdGUgLSAxXSk7DQogICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX0NvbG9yIGNvbG9yTGluZShBcmdiRW5jb2RlKDI1NSwgMjM4LCAyMzcsIDIyOSkpOw0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBGWF9GTE9BVCBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCi0gICAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCi0gICAgaWYgKGJWZXJ0KSB7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgMSwgcFJlY3QtPmhlaWdodCk7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShmUmlnaHQgLSAxLCBwUmVjdC0+dG9wLCAxLCBwUmVjdC0+aGVpZ2h0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIDEpOw0KLSAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIGZCb3R0b20gLSAxLCBwUmVjdC0+d2lkdGgsIDEpOw0KLSAgICB9DQotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjb2xvckxpbmUpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIHBhdGguQ2xlYXIoKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyAxLCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGggLSAyLCBwUmVjdC0+aGVpZ2h0KTsNCi0gICAgRlhfRkxPQVQgeDEgPSBiVmVydCA/IHBSZWN0LT5sZWZ0ICsgMSA6IHBSZWN0LT5sZWZ0Ow0KLSAgICBGWF9GTE9BVCB5MSA9IGJWZXJ0ID8gcFJlY3QtPnRvcCA6IHBSZWN0LT50b3AgKyAxOw0KLSAgICBGWF9GTE9BVCB4MiA9IGJWZXJ0ID8gZlJpZ2h0IC0gMSA6IHBSZWN0LT5sZWZ0Ow0KLSAgICBGWF9GTE9BVCB5MiA9IGJWZXJ0ID8gcFJlY3QtPnRvcCA6IGZCb3R0b20gLSAxOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZyY1N0cm9rZSk7DQorICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQogICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi0gICAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsDQotICAgICAgICAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsDQotICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJUcmFja0JLU3RhcnQsDQotICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJUcmFja0JLRW5kLA0KLSAgICAgICAgICAgICAgICAgICAgICZwYXRoLA0KLSAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HLA0KLSAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdC5EZWZsYXRlKDAsIDEpOw0KKyAgICBpZiAocmVjdC5Jc0VtcHR5KDAuMWYpKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgICAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QubGVmdCwgcmVjdC5ib3R0b20oKSwNCisgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLW2VTdGF0ZSAtIDFdWzBdLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbZVN0YXRlIC0gMV1bMV0sICZwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgQ0ZYX0NvbG9yIHJjU3Ryb2tlOw0KKyAgICByY1N0cm9rZS5TZXQobV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbZVN0YXRlIC0gMV0pOw0KKyAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJnJjU3Ryb2tlKTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgfQ0KIH0NCi12b2lkIENGV0xfU2Nyb2xsQmFyVFA6OkRyYXdNYXhNaW5CdG4oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsICBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBEcmF3VHJhY2socEdyYXBoaWNzLA0KLSAgICAgICAgICAgICAgcFJlY3QsDQotICAgICAgICAgICAgICBlRGljdCA9PSBGV0xUSEVNRV9ESVJFQ1RJT05fVXAgfHwgZURpY3QgPT0gRldMVEhFTUVfRElSRUNUSU9OX0Rvd24sDQotICAgICAgICAgICAgICBlU3RhdGUsDQotICAgICAgICAgICAgICBUUlVFLA0KLSAgICAgICAgICAgICAgcE1hdHJpeCk7DQotICAgIENGWF9SZWN0RiBydEFycm93QnRuKCpwUmVjdCk7DQotICAgIHJ0QXJyb3dCdG4uRGVmbGF0ZSgxLCAxLCAxLCAxKTsNCi0gICAgRHJhd0Fycm93QnRuKHBHcmFwaGljcywgJnJ0QXJyb3dCdG4sIGVEaWN0LCBlU3RhdGUsIHBNYXRyaXgpOw0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1BhdyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIGlmIChiVmVydCkgew0KKyAgICBGWF9GTE9BVCBmUGF3TGVuID0gRldMX1NDUk9MTF9QYXdMZW47DQorICAgIGlmIChwUmVjdC0+d2lkdGggLyAyIDw9IGZQYXdMZW4pIHsNCisgICAgICBmUGF3TGVuID0gKHBSZWN0LT53aWR0aCAtIDYpIC8gMjsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmWCA9IHBSZWN0LT5sZWZ0ICsgcFJlY3QtPndpZHRoIC8gNDsNCisgICAgRlhfRkxPQVQgZlkgPSBwUmVjdC0+dG9wICsgcFJlY3QtPmhlaWdodCAvIDI7DQorICAgIHBhdGguTW92ZVRvKGZYLCBmWSAtIDQpOw0KKyAgICBwYXRoLkxpbmVUbyhmWCArIGZQYXdMZW4sIGZZIC0gNCk7DQorICAgIHBhdGguTW92ZVRvKGZYLCBmWSAtIDIpOw0KKyAgICBwYXRoLkxpbmVUbyhmWCArIGZQYXdMZW4sIGZZIC0gMik7DQorICAgIHBhdGguTW92ZVRvKGZYLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYICsgZlBhd0xlbiwgZlkpOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkgKyAyKTsNCisgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSArIDIpOw0KKyAgICBDRlhfQ29sb3IgY2xyTGlnaHQobV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0W2VTdGF0ZSAtIDFdKTsNCisgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMSk7DQorICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckxpZ2h0KTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoKTsNCisgICAgZlgrKzsNCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkgLSAzKTsNCisgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSAtIDMpOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkgLSAxKTsNCisgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSAtIDEpOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkgKyAxKTsNCisgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSArIDEpOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkgKyAzKTsNCisgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSArIDMpOw0KKyAgICBDRlhfQ29sb3IgY2xyRGFyayhtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1tlU3RhdGUgLSAxXSk7DQorICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEpOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJEYXJrKTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIH0gZWxzZSB7DQorICAgIEZYX0ZMT0FUIGZQYXdMZW4gPSBGV0xfU0NST0xMX1Bhd0xlbjsNCisgICAgaWYgKHBSZWN0LT5oZWlnaHQgLyAyIDw9IGZQYXdMZW4pIHsNCisgICAgICBmUGF3TGVuID0gKHBSZWN0LT5oZWlnaHQgLSA2KSAvIDI7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlggPSBwUmVjdC0+bGVmdCArIHBSZWN0LT53aWR0aCAvIDI7DQorICAgIEZYX0ZMT0FUIGZZID0gcFJlY3QtPnRvcCArIHBSZWN0LT5oZWlnaHQgLyA0Ow0KKyAgICBwYXRoLk1vdmVUbyhmWCAtIDQsIGZZKTsNCisgICAgcGF0aC5MaW5lVG8oZlggLSA0LCBmWSArIGZQYXdMZW4pOw0KKyAgICBwYXRoLk1vdmVUbyhmWCAtIDIsIGZZKTsNCisgICAgcGF0aC5MaW5lVG8oZlggLSAyLCBmWSArIGZQYXdMZW4pOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkpOw0KKyAgICBwYXRoLkxpbmVUbyhmWCwgZlkgKyBmUGF3TGVuKTsNCisgICAgcGF0aC5Nb3ZlVG8oZlggKyAyLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYICsgMiwgZlkgKyBmUGF3TGVuKTsNCisgICAgQ0ZYX0NvbG9yIGNsckxpZ2h0KG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JMaWdodFtlU3RhdGUgLSAxXSk7DQorICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEpOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMaWdodCk7DQorICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICAgIGZZKys7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgcGF0aC5Nb3ZlVG8oZlggLSAzLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYIC0gMywgZlkgKyBmUGF3TGVuKTsNCisgICAgcGF0aC5Nb3ZlVG8oZlggLSAxLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYIC0gMSwgZlkgKyBmUGF3TGVuKTsNCisgICAgcGF0aC5Nb3ZlVG8oZlggKyAxLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYICsgMSwgZlkgKyBmUGF3TGVuKTsNCisgICAgcGF0aC5Nb3ZlVG8oZlggKyAzLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYICsgMywgZlkgKyBmUGF3TGVuKTsNCisgICAgQ0ZYX0NvbG9yIGNsckRhcmsobV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckRhcmtbZVN0YXRlIC0gMV0pOw0KKyAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxKTsNCisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyRGFyayk7DQorICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RyYWNrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG93ZXJUcmFjaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoZVN0YXRlIDwgRldMVEhFTUVfU1RBVEVfTm9ybWFsIHx8IGVTdGF0ZSA+IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9Db2xvciBjb2xvckxpbmUoQXJnYkVuY29kZSgyNTUsIDIzOCwgMjM3LCAyMjkpKTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgRlhfRkxPQVQgZlJpZ2h0ID0gcFJlY3QtPnJpZ2h0KCk7DQorICBGWF9GTE9BVCBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOw0KKyAgaWYgKGJWZXJ0KSB7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCAxLCBwUmVjdC0+aGVpZ2h0KTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMSwgcFJlY3QtPnRvcCwgMSwgcFJlY3QtPmhlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCAxKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIGZCb3R0b20gLSAxLCBwUmVjdC0+d2lkdGgsIDEpOw0KKyAgfQ0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNvbG9yTGluZSk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCAtIDIsDQorICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0KTsNCisgIEZYX0ZMT0FUIHgxID0gYlZlcnQgPyBwUmVjdC0+bGVmdCArIDEgOiBwUmVjdC0+bGVmdDsNCisgIEZYX0ZMT0FUIHkxID0gYlZlcnQgPyBwUmVjdC0+dG9wIDogcFJlY3QtPnRvcCArIDE7DQorICBGWF9GTE9BVCB4MiA9IGJWZXJ0ID8gZlJpZ2h0IC0gMSA6IHBSZWN0LT5sZWZ0Ow0KKyAgRlhfRkxPQVQgeTIgPSBiVmVydCA/IHBSZWN0LT50b3AgOiBmQm90dG9tIC0gMTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLCB4MSwgeTEsIHgyLCB5MiwgbV9wVGhlbWVEYXRhLT5jbHJUcmFja0JLU3RhcnQsDQorICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyVHJhY2tCS0VuZCwgJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX1Njcm9sbEJhclRQOjpEcmF3TWF4TWluQnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRHJhd1RyYWNrKHBHcmFwaGljcywgcFJlY3QsDQorICAgICAgICAgICAgZURpY3QgPT0gRldMVEhFTUVfRElSRUNUSU9OX1VwIHx8IGVEaWN0ID09IEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duLA0KKyAgICAgICAgICAgIGVTdGF0ZSwgVFJVRSwgcE1hdHJpeCk7DQorICBDRlhfUmVjdEYgcnRBcnJvd0J0bigqcFJlY3QpOw0KKyAgcnRBcnJvd0J0bi5EZWZsYXRlKDEsIDEsIDEsIDEpOw0KKyAgRHJhd0Fycm93QnRuKHBHcmFwaGljcywgJnJ0QXJyb3dCdG4sIGVEaWN0LCBlU3RhdGUsIHBNYXRyaXgpOw0KIH0NCiAjZWxzZQ0KLXZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RodW1iQnRuKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9CT09MIGJWZXJ0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIEZYX0JPT0wgYlBhd0J1dHRvbiwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBpZiAocFJlY3QtPklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9SZWN0RiBydFRodW1iKCpwUmVjdCk7DQotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDI7DQotICAgIERyYXczRFJlY3QocEdyYXBoaWNzLCBGV0xUSEVNRV9FREdFX1JhaXNlZCwgZldpZHRoLCBwUmVjdCwgRldMVEhFTUVfQ09MT1JfRURHRUxUMSwgRldMVEhFTUVfQ09MT1JfRURHRUxUMiwgRldMVEhFTUVfQ09MT1JfRURHRVJCMSwgRldMVEhFTUVfQ09MT1JfRURHRVJCMiwgcE1hdHJpeCk7DQotICAgIENGWF9QYXRoIHBhdGg7DQotICAgIHBhdGguQ3JlYXRlKCk7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgZldpZHRoLCBwUmVjdC0+dG9wICsgZldpZHRoLCBwUmVjdC0+d2lkdGggLSAyICogZldpZHRoLCBwUmVjdC0+aGVpZ2h0IC0gMiAqIGZXaWR0aCk7DQotICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX0NvbG9yIGNyRmlsbChGV0xUSEVNRV9DT0xPUl9CYWNrZ3JvdW5kKTsNCi0gICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQotICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RodW1iQnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGF3QnV0dG9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmIChwUmVjdC0+SXNFbXB0eSgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9SZWN0RiBydFRodW1iKCpwUmVjdCk7DQorICBGWF9GTE9BVCBmV2lkdGggPSAyOw0KKyAgRHJhdzNEUmVjdChwR3JhcGhpY3MsIEZXTFRIRU1FX0VER0VfUmFpc2VkLCBmV2lkdGgsIHBSZWN0LA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFTFQxLCBGV0xUSEVNRV9DT0xPUl9FREdFTFQyLA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFUkIxLCBGV0xUSEVNRV9DT0xPUl9FREdFUkIyLCBwTWF0cml4KTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyBmV2lkdGgsIHBSZWN0LT50b3AgKyBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBwUmVjdC0+d2lkdGggLSAyICogZldpZHRoLCBwUmVjdC0+aGVpZ2h0IC0gMiAqIGZXaWR0aCk7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3JGaWxsKEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQogfQ0KLXZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RyYWNrKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9CT09MIGJWZXJ0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIEZYX0JPT0wgYkxvd2VyVHJhY2ssIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgaWYgKHBSZWN0LT5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0KTsNCi0gICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBDRlhfQ29sb3IgY2xyRmlsbCgweEZGRjBGMEYwKTsNCi0gICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsckZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit2b2lkIENGV0xfU2Nyb2xsQmFyVFA6OkRyYXdUcmFjayhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvd2VyVHJhY2ssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKHBSZWN0LT5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0KTsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9Db2xvciBjbHJGaWxsKDB4RkZGMEYwRjApOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KIH0NCi12b2lkIENGV0xfU2Nyb2xsQmFyVFA6OkRyYXdNYXhNaW5CdG4oQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwgRldMVEhFTUVfU1RBVEUgZVN0YXRlLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIENGWF9SZWN0RiBydFRodW1iKCpwUmVjdCk7DQotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IGVTdGF0ZSA9PSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkID8gMS4wZiA6IDIuMGY7DQotICAgIEZXTFRIRU1FX0VER0UgZVR5cGUgPSBlU3RhdGUgPT0gRldMVEhFTUVfU1RBVEVfUHJlc3NlZCA/IEZXTFRIRU1FX0VER0VfRmxhdCA6IEZXTFRIRU1FX0VER0VfUmFpc2VkOw0KLSAgICBEcmF3M0RSZWN0KHBHcmFwaGljcywgZVR5cGUsIGZXaWR0aCwgcFJlY3QsIEZXTFRIRU1FX0NPTE9SX0VER0VMVDEsIEZXTFRIRU1FX0NPTE9SX0VER0VMVDIsIEZXTFRIRU1FX0NPTE9SX0VER0VSQjEsIEZXTFRIRU1FX0NPTE9SX0VER0VSQjIsIHBNYXRyaXgpOw0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIGZXaWR0aCwgcFJlY3QtPnRvcCArIGZXaWR0aCwgcFJlY3QtPndpZHRoIC0gMiAqIGZXaWR0aCwgcFJlY3QtPmhlaWdodCAtIDIgKiBmV2lkdGgpOw0KLSAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIENGWF9Db2xvciBjckZpbGwoRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZCk7DQotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi0gICAgRHJhd0Fycm93KHBHcmFwaGljcywNCi0gICAgICAgICAgICAgIHBSZWN0LA0KLSAgICAgICAgICAgICAgZURpY3QsDQotICAgICAgICAgICAgICBlU3RhdGUgPT0gRldMVEhFTUVfU1RBVEVfRGlzYWJhbGUgPyAweEZGQTBBMEEwIDogMHhGRjAwMDAwMCwNCi0gICAgICAgICAgICAgIGVTdGF0ZSA9PSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkLA0KLSAgICAgICAgICAgICAgcE1hdHJpeCk7DQordm9pZCBDRldMX1Njcm9sbEJhclRQOjpEcmF3TWF4TWluQnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1JlY3RGIHJ0VGh1bWIoKnBSZWN0KTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IGVTdGF0ZSA9PSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkID8gMS4wZiA6IDIuMGY7DQorICBGV0xUSEVNRV9FREdFIGVUeXBlID0gZVN0YXRlID09IEZXTFRIRU1FX1NUQVRFX1ByZXNzZWQgPyBGV0xUSEVNRV9FREdFX0ZsYXQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZXTFRIRU1FX0VER0VfUmFpc2VkOw0KKyAgRHJhdzNEUmVjdChwR3JhcGhpY3MsIGVUeXBlLCBmV2lkdGgsIHBSZWN0LCBGV0xUSEVNRV9DT0xPUl9FREdFTFQxLA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFTFQyLCBGV0xUSEVNRV9DT0xPUl9FREdFUkIxLA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFUkIyLCBwTWF0cml4KTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyBmV2lkdGgsIHBSZWN0LT50b3AgKyBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBwUmVjdC0+d2lkdGggLSAyICogZldpZHRoLCBwUmVjdC0+aGVpZ2h0IC0gMiAqIGZXaWR0aCk7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3JGaWxsKEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICBEcmF3QXJyb3cocEdyYXBoaWNzLCBwUmVjdCwgZURpY3QsDQorICAgICAgICAgICAgZVN0YXRlID09IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlID8gMHhGRkEwQTBBMCA6IDB4RkYwMDAwMDAsDQorICAgICAgICAgICAgZVN0YXRlID09IEZXTFRIRU1FX1NUQVRFX1ByZXNzZWQsIHBNYXRyaXgpOw0KIH0NCiAjZW5kaWYNCi12b2lkIENGV0xfU2Nyb2xsQmFyVFA6OlNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKQ0KLXsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0WzNdID0gQXJnYkVuY29kZSgweGZmLCAyMDgsIDIyMywgMTcyKTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckRhcmtbM10gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0MCwgMTU3LCAxMTUpOw0KLSAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzNdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNjQsIDE4MCwgMTM5KTsNCi0gICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1szXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQxLCAxNTcsIDExNSk7DQotICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQm9yZGVyWzNdID0gQXJnYkVuY29kZSgweGZmLCAyMzYsIDIzMywgMjE2KTsNCi0gICAgaWYgKGR3SUQpIHsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JMaWdodFswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjA4LCAyMjMsIDE3Mik7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1swXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQwLCAxNTcsIDExNSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNjIsIDE3OSwgMTQxKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0OSwgMTY3LCAxMTcpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0MiwgMTUzLCAxMjUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0WzFdID0gQXJnYkVuY29kZSgweGZmLCAyMzUsIDI0NSwgMjEyKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JEYXJrWzFdID0gQXJnYkVuY29kZSgweGZmLCAxODIsIDE5OCwgMTQyKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMV1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwMCwgMjEzLCAxNzApOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1sxXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTk1LCAyMDgsIDE1MCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlclsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTg5LCAyMDMsIDE1MCk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwOCwgMjIzLCAxNzIpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckRhcmtbMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0MCwgMTU3LCAxMTUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1syXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTY0LCAxODAsIDEzOSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzJdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNDEsIDE1NywgMTE1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQm9yZGVyWzJdID0gQXJnYkVuY29kZSgweGZmLCAxMjgsIDE0NiwgMTAyKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyVHJhY2tCS1N0YXJ0ID0gQXJnYkVuY29kZSgweGZmLCAyNDMsIDI0MSwgMjM2KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyVHJhY2tCS0VuZCA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU0LCAyNTQsIDI1MSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIzOCwgMjQ0LCAyNTQpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckRhcmtbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0MCwgMTc2LCAyNDgpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1swXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTk3LCAyMTMsIDI1Mik7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxODIsIDIwNSwgMjUxKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQm9yZGVyWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNDgsIDE3NiwgMjIxKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JMaWdodFsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjUyLCAyNTMsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1sxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTU2LCAxOTcsIDI1NSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzFdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyMTYsIDIzMiwgMjU1KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMV1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwNCwgMjI1LCAyNTUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIxOCwgMjMwLCAyNTQpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0WzJdID0gQXJnYkVuY29kZSgweGZmLCAyMDcsIDIyMSwgMjUzKTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JEYXJrWzJdID0gQXJnYkVuY29kZSgweGZmLCAxMzEsIDE1OCwgMjE2KTsNCi0gICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMl1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2NywgMTkwLCAyNDUpOw0KLSAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1syXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQ2LCAxNzksIDI0OSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlclsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTI0LCAxNTksIDIxMSk7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclRyYWNrQktTdGFydCA9IEFyZ2JFbmNvZGUoMHhmZiwgMjQzLCAyNDEsIDIzNik7DQotICAgICAgICBtX3BUaGVtZURhdGEtPmNsclRyYWNrQktFbmQgPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NCwgMjU0LCAyNTEpOw0KLSAgICB9DQordm9pZCBDRldMX1Njcm9sbEJhclRQOjpTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCkgew0KKyAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0WzNdID0gQXJnYkVuY29kZSgweGZmLCAyMDgsIDIyMywgMTcyKTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JEYXJrWzNdID0gQXJnYkVuY29kZSgweGZmLCAxNDAsIDE1NywgMTE1KTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbM11bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2NCwgMTgwLCAxMzkpOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1szXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQxLCAxNTcsIDExNSk7DQorICBtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlclszXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjM2LCAyMzMsIDIxNik7DQorICBpZiAoZHdJRCkgew0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwOCwgMjIzLCAxNzIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1swXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQwLCAxNTcsIDExNSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2MiwgMTc5LCAxNDEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNDksIDE2NywgMTE3KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0MiwgMTUzLCAxMjUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIzNSwgMjQ1LCAyMTIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1sxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTgyLCAxOTgsIDE0Mik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMV1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwMCwgMjEzLCAxNzApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzFdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxOTUsIDIwOCwgMTUwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE4OSwgMjAzLCAxNTApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwOCwgMjIzLCAxNzIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1syXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQwLCAxNTcsIDExNSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMl1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2NCwgMTgwLCAxMzkpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzJdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNDEsIDE1NywgMTE1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEyOCwgMTQ2LCAxMDIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclRyYWNrQktTdGFydCA9IEFyZ2JFbmNvZGUoMHhmZiwgMjQzLCAyNDEsIDIzNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyVHJhY2tCS0VuZCA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU0LCAyNTQsIDI1MSk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIzOCwgMjQ0LCAyNTQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1swXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQwLCAxNzYsIDI0OCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NywgMjEzLCAyNTIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxODIsIDIwNSwgMjUxKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0OCwgMTc2LCAyMjEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1MiwgMjUzLCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1sxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTU2LCAxOTcsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMV1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIxNiwgMjMyLCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzFdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyMDQsIDIyNSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIxOCwgMjMwLCAyNTQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwNywgMjIxLCAyNTMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1syXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTMxLCAxNTgsIDIxNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMl1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2NywgMTkwLCAyNDUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzJdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNDYsIDE3OSwgMjQ5KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEyNCwgMTU5LCAyMTEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclRyYWNrQktTdGFydCA9IEFyZ2JFbmNvZGUoMHhmZiwgMjQzLCAyNDEsIDIzNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyVHJhY2tCS0VuZCA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU0LCAyNTQsIDI1MSk7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS93aWRnZXR0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvd2lkZ2V0dHAuY3BwCmluZGV4IDdjZTA4YWIuLjhkNDIxYjYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS93aWRnZXR0cC5jcHAKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL3dpZGdldHRwLmNwcApAQCAtNSw4MjMgKzUsODI0IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KLXN0YXRpYyB2b2lkIEZXTF9TZXRDaGlsZFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBQYXJlbnQsIEZYX0RXT1JEIGR3VGhlbWVJRCkNCi17DQotICAgIElGV0xfV2lkZ2V0TWdyICpwV2lkZ2V0TWdyID0gRldMX0dldFdpZGdldE1ncigpOw0KLSAgICBJRldMX1dpZGdldCAqcENoaWxkID0gcFdpZGdldE1nci0+R2V0V2lkZ2V0KHBQYXJlbnQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCi0gICAgd2hpbGUgKHBDaGlsZCkgew0KLSAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyICpwVGhlbWUgPSBwQ2hpbGQtPkdldFRoZW1lUHJvdmlkZXIoKTsNCi0gICAgICAgIGlmIChwVGhlbWUpIHsNCi0gICAgICAgICAgICBwVGhlbWUtPlNldFRoZW1lSUQocENoaWxkLCBkd1RoZW1lSUQsIEZBTFNFKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZXTF9TZXRDaGlsZFRoZW1lSUQocENoaWxkLCBkd1RoZW1lSUQpOw0KLSAgICAgICAgcENoaWxkID0gcFdpZGdldE1nci0+R2V0V2lkZ2V0KHBDaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCitzdGF0aWMgdm9pZCBGV0xfU2V0Q2hpbGRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwUGFyZW50LCBGWF9EV09SRCBkd1RoZW1lSUQpIHsNCisgIElGV0xfV2lkZ2V0TWdyKiBwV2lkZ2V0TWdyID0gRldMX0dldFdpZGdldE1ncigpOw0KKyAgSUZXTF9XaWRnZXQqIHBDaGlsZCA9DQorICAgICAgcFdpZGdldE1nci0+R2V0V2lkZ2V0KHBQYXJlbnQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBwQ2hpbGQtPkdldFRoZW1lUHJvdmlkZXIoKTsNCisgICAgaWYgKHBUaGVtZSkgew0KKyAgICAgIHBUaGVtZS0+U2V0VGhlbWVJRChwQ2hpbGQsIGR3VGhlbWVJRCwgRkFMU0UpOw0KICAgICB9DQorICAgIEZXTF9TZXRDaGlsZFRoZW1lSUQocENoaWxkLCBkd1RoZW1lSUQpOw0KKyAgICBwQ2hpbGQgPSBwV2lkZ2V0TWdyLT5HZXRXaWRnZXQocENoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KIH0NCi1GWF9CT09MCUNGV0xfV2lkZ2V0VFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDRldMX1dpZGdldFRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0RXT1JEIENGV0xfV2lkZ2V0VFA6OkdldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gbV9kd1RoZW1lSUQ7DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXRUUDo6R2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fZHdUaGVtZUlEOw0KIH0NCi1GWF9EV09SRCBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9EV09SRCBkd1RoZW1lSUQsIEZYX0JPT0wgYkNoaWxkcmVuICkNCi17DQotICAgIEZYX0RXT1JEIGR3T2xkID0gbV9kd1RoZW1lSUQ7DQotICAgIG1fZHdUaGVtZUlEID0gZHdUaGVtZUlEOw0KLSAgICBpZiAoQ0ZXTF9BcnJvd0RhdGE6OklzSW5zdGFuY2UoKSkgew0KLSAgICAgICAgQ0ZXTF9BcnJvd0RhdGE6OkdldEluc3RhbmNlKCktPlNldENvbG9yRGF0YShGV0xfR2V0VGhlbWVDb2xvcihkd1RoZW1lSUQpKTsNCitGWF9EV09SRCBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUaGVtZUlELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4pIHsNCisgIEZYX0RXT1JEIGR3T2xkID0gbV9kd1RoZW1lSUQ7DQorICBtX2R3VGhlbWVJRCA9IGR3VGhlbWVJRDsNCisgIGlmIChDRldMX0Fycm93RGF0YTo6SXNJbnN0YW5jZSgpKSB7DQorICAgIENGV0xfQXJyb3dEYXRhOjpHZXRJbnN0YW5jZSgpLT5TZXRDb2xvckRhdGEoRldMX0dldFRoZW1lQ29sb3IoZHdUaGVtZUlEKSk7DQorICB9DQorICBpZiAoYkNoaWxkcmVuKSB7DQorICAgIEZXTF9TZXRDaGlsZFRoZW1lSUQocFdpZGdldCwgZHdUaGVtZUlEKTsNCisgIH0NCisgIHJldHVybiBkd09sZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldFRQOjpHZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgbWF0cml4LlNldChfY3RtLmEsIF9jdG0uYiwgX2N0bS5jLCBfY3RtLmQsIF9jdG0uZSwgX2N0bS5mKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldFRQOjpTZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgX2N0bS5TZXQobWF0cml4LmEsIG1hdHJpeC5iLCBtYXRyaXguYywgbWF0cml4LmQsIG1hdHJpeC5lLCBtYXRyaXguZik7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0VFA6OkRyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKSB7DQorICBpZiAoIW1fcFRleHRPdXQpIHsNCisgICAgSW5pdFRUTygpOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuID0gcFBhcmFtcy0+bV93c1RleHQuR2V0TGVuZ3RoKCk7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGlMZW4gPiAwLCBGQUxTRSkNCisgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzID0gcFBhcmFtcy0+bV9wR3JhcGhpY3M7DQorICBtX3BUZXh0T3V0LT5TZXRSZW5kZXJEZXZpY2UocEdyYXBoaWNzLT5HZXRSZW5kZXJEZXZpY2UoKSk7DQorICBtX3BUZXh0T3V0LT5TZXRTdHlsZXMocFBhcmFtcy0+bV9kd1RUT1N0eWxlcyk7DQorICBtX3BUZXh0T3V0LT5TZXRBbGlnbm1lbnQocFBhcmFtcy0+bV9pVFRPQWxpZ24pOw0KKyAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9ICZwUGFyYW1zLT5tX21hdHJpeDsNCisgIHBNYXRyaXgtPkNvbmNhdCgqcEdyYXBoaWNzLT5HZXRNYXRyaXgoKSk7DQorICBtX3BUZXh0T3V0LT5TZXRNYXRyaXgoKnBNYXRyaXgpOw0KKyAgbV9wVGV4dE91dC0+RHJhd0xvZ2ljVGV4dChwUGFyYW1zLT5tX3dzVGV4dCwgaUxlbiwgcFBhcmFtcy0+bV9ydFBhcnQpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQqIENGV0xfV2lkZ2V0VFA6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q2FwYWNpdHkpIHsNCisgIHN3aXRjaCAoZHdDYXBhY2l0eSkgew0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9DWEJvcmRlcjogew0KKyAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQ1hCb3JkZXI7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKGJDaGlsZHJlbikgew0KLSAgICAgICAgRldMX1NldENoaWxkVGhlbWVJRChwV2lkZ2V0LCBkd1RoZW1lSUQpOw0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9DWUJvcmRlcjogew0KKyAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQ1lCb3JkZXI7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIGR3T2xkOw0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9FZGdlRmxhdDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfRWRnZUZsYXQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVJhaXNlZDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfRWRnZVJhaXNlZDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9FZGdlU3Vua2VuOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlU3Vua2VuOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0ZvbnRTaXplOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9Gb250U2l6ZTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9UZXh0Q29sb3I6IHsNCisgICAgICBtX2R3VmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3I7DQorICAgICAgcmV0dXJuICZtX2R3VmFsdWU7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGg6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX1Njcm9sbEJhcldpZHRoOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0ZvbnQ6IHsNCisgICAgICByZXR1cm4gbV9wRkRFRm9udDsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9UZXh0U2VsQ29sb3I6IHsNCisgICAgICBtX2R3VmFsdWUgPSAobV9kd1RoZW1lSUQgPT0gMCkgPyBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0U2VsQ29sb3INCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xUSEVNRV9DT0xPUl9HcmVlbl9CS1NlbGVjdGVkOw0KKyAgICAgIHJldHVybiAmbV9kd1ZhbHVlOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0xpbmVIZWlnaHQ6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0xpbmVIZWlnaHQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW46IHsNCisgICAgICBtX3J0TWFyZ2luLlNldCgwLCAwLCAwLCAwKTsNCisgICAgICByZXR1cm4gJm1fcnRNYXJnaW47DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gTlVMTDsgfQ0KKyAgfQ0KKyAgcmV0dXJuICZtX2ZWYWx1ZTsNCiB9DQotRldMX0VSUglDRldMX1dpZGdldFRQOjpHZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX01hdHJpeCAmbWF0cml4KQ0KLXsNCi0gICAgbWF0cml4LlNldChfY3RtLmEsIF9jdG0uYiwgX2N0bS5jLCBfY3RtLmQsIF9jdG0uZSwgX2N0bS5mKTsNCitGWF9CT09MIENGV0xfV2lkZ2V0VFA6OklzQ3VzdG9taXplZExheW91dChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIEZXTF9HZXRUaGVtZUxheW91dChtX2R3VGhlbWVJRCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRUUDo6R2V0UGFydFJlY3QoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldFRQOjpJc0luUGFydChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0VFA6OkNhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCogcFBhcmFtcywgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYXJhbXMsIEZBTFNFKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wVGV4dE91dCwgRkFMU0UpOw0KKyAgbV9wVGV4dE91dC0+U2V0QWxpZ25tZW50KHBQYXJhbXMtPm1faVRUT0FsaWduKTsNCisgIG1fcFRleHRPdXQtPlNldFN0eWxlcyhwUGFyYW1zLT5tX2R3VFRPU3R5bGVzIHwgRkRFX1RUT1NUWUxFX0FyYWJpY0NvbnRleHQpOw0KKyAgbV9wVGV4dE91dC0+Q2FsY0xvZ2ljU2l6ZShwUGFyYW1zLT5tX3dzVGV4dCwgcFBhcmFtcy0+bV93c1RleHQuR2V0TGVuZ3RoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpIHsNCisgIG1fZHdUaGVtZUlEID0gMDsNCisgIF9jdG0uUmVzZXQoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldFRQOjpGaW5hbGl6ZSgpIHsNCisgIGlmICghbV9wVGV4dE91dCkgew0KKyAgICBGaW5hbGl6ZVRUTygpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRldMX1dpZGdldFRQOjp+Q0ZXTF9XaWRnZXRUUCgpIHt9DQorRldMX0VSUiBDRldMX1dpZGdldFRQOjpTZXRGb250KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3RyRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIHJnYkZvbnQpIHsNCisgIGlmICghbV9wVGV4dE91dCkgew0KICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBtX3BGREVGb250ID0gRldMX0dldEZvbnRNYW5hZ2VyKCktPkZpbmRGb250KHN0ckZvbnQsIDAsIDApOw0KKyAgbV9wVGV4dE91dC0+U2V0Rm9udChtX3BGREVGb250KTsNCisgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQorICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IocmdiRm9udCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRUUDo6U2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9NYXRyaXggJm1hdHJpeCkNCi17DQotICAgIF9jdG0uU2V0KG1hdHJpeC5hLCBtYXRyaXguYiwgbWF0cml4LmMsIG1hdHJpeC5kLCBtYXRyaXguZSwgbWF0cml4LmYpOw0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRUUDo6U2V0Rm9udChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqIHBGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgcmdiRm9udCkgew0KKyAgaWYgKCFtX3BUZXh0T3V0KSB7DQogICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIG1fcFRleHRPdXQtPlNldEZvbnQocEZvbnQpOw0KKyAgbV9wVGV4dE91dC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsNCisgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihyZ2JGb250KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfQk9PTAlDRldMX1dpZGdldFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCi17DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNGV0xfV2lkZ2V0VFA6OkRyYXdUZXh0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zKQ0KLXsNCi0gICAgaWYgKCFtX3BUZXh0T3V0KSB7DQotICAgICAgICBJbml0VFRPKCk7DQotICAgIH0NCi0gICAgaW50MzJfdCBpTGVuID0gcFBhcmFtcy0+bV93c1RleHQuR2V0TGVuZ3RoKCk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaUxlbiA+IDAsIEZBTFNFKQ0KLSAgICBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcyA9IHBQYXJhbXMtPm1fcEdyYXBoaWNzOw0KLSAgICBtX3BUZXh0T3V0LT5TZXRSZW5kZXJEZXZpY2UocEdyYXBoaWNzLT5HZXRSZW5kZXJEZXZpY2UoKSk7DQotICAgIG1fcFRleHRPdXQtPlNldFN0eWxlcyhwUGFyYW1zLT5tX2R3VFRPU3R5bGVzKTsNCi0gICAgbV9wVGV4dE91dC0+U2V0QWxpZ25tZW50KHBQYXJhbXMtPm1faVRUT0FsaWduKTsNCi0gICAgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9ICZwUGFyYW1zLT5tX21hdHJpeDsNCi0gICAgcE1hdHJpeC0+Q29uY2F0KCpwR3JhcGhpY3MtPkdldE1hdHJpeCgpKTsNCi0gICAgbV9wVGV4dE91dC0+U2V0TWF0cml4KCpwTWF0cml4KTsNCi0gICAgbV9wVGV4dE91dC0+RHJhd0xvZ2ljVGV4dChwUGFyYW1zLT5tX3dzVGV4dCwgaUxlbiwgcFBhcmFtcy0+bV9ydFBhcnQpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCogQ0ZXTF9XaWRnZXRUUDo6R2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpDQotew0KLSAgICBzd2l0Y2goZHdDYXBhY2l0eSkgew0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXI6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9DWEJvcmRlcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXI6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUJvcmRlcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRWRnZUZsYXQ6IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlRmxhdDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVJhaXNlZDogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0VkZ2VSYWlzZWQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0VkZ2VTdW5rZW46IHsNCi0gICAgICAgICAgICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlU3Vua2VuOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9Gb250U2l6ZTogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9UZXh0Q29sb3I6IHsNCi0gICAgICAgICAgICAgICAgbV9kd1ZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gJm1fZHdWYWx1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aDogew0KLSAgICAgICAgICAgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX1Njcm9sbEJhcldpZHRoOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9Gb250OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtX3BGREVGb250Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX1RleHRTZWxDb2xvcjogew0KLSAgICAgICAgICAgICAgICBtX2R3VmFsdWUgPSAobV9kd1RoZW1lSUQgPT0gMCkgPyBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0U2VsQ29sb3IgOiBGV0xUSEVNRV9DT0xPUl9HcmVlbl9CS1NlbGVjdGVkOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gJm1fZHdWYWx1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9MaW5lSGVpZ2h0OiB7DQotICAgICAgICAgICAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfTGluZUhlaWdodDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW46IHsNCi0gICAgICAgICAgICAgICAgbV9ydE1hcmdpbi5TZXQoMCwgMCwgMCwgMCk7DQotICAgICAgICAgICAgICAgIHJldHVybiAmbV9ydE1hcmdpbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gJm1fZlZhbHVlOw0KLX0NCi1GWF9CT09MCUNGV0xfV2lkZ2V0VFA6OklzQ3VzdG9taXplZExheW91dChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBGV0xfR2V0VGhlbWVMYXlvdXQobV9kd1RoZW1lSUQpOw0KLX0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0VFA6OkdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0JPT0wJQ0ZXTF9XaWRnZXRUUDo6SXNJblBhcnQoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNGV0xfV2lkZ2V0VFA6OkNhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcywgQ0ZYX1JlY3RGICZyZWN0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQotICAgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobV9wVGV4dE91dCwgRkFMU0UpOw0KLSAgICBtX3BUZXh0T3V0LT5TZXRBbGlnbm1lbnQocFBhcmFtcy0+bV9pVFRPQWxpZ24pOw0KLSAgICBtX3BUZXh0T3V0LT5TZXRTdHlsZXMocFBhcmFtcy0+bV9kd1RUT1N0eWxlcyB8IEZERV9UVE9TVFlMRV9BcmFiaWNDb250ZXh0KTsNCi0gICAgbV9wVGV4dE91dC0+Q2FsY0xvZ2ljU2l6ZShwUGFyYW1zLT5tX3dzVGV4dCwgcFBhcmFtcy0+bV93c1RleHQuR2V0TGVuZ3RoKCksIHJlY3QpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRldMX0VSUglDRldMX1dpZGdldFRQOjpJbml0aWFsaXplKCkNCi17DQotICAgIG1fZHdUaGVtZUlEID0gMDsNCi0gICAgX2N0bS5SZXNldCgpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIJQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKQ0KLXsNCi0gICAgaWYoIW1fcFRleHRPdXQpIHsNCi0gICAgICAgIEZpbmFsaXplVFRPKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1DRldMX1dpZGdldFRQOjp+Q0ZXTF9XaWRnZXRUUCgpDQotew0KLX0NCi1GV0xfRVJSIENGV0xfV2lkZ2V0VFA6OlNldEZvbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IEZYX1dDSEFSKiBzdHJGb250LCBGWF9GTE9BVCBmRm9udFNpemUsIEZYX0FSR0IgcmdiRm9udCkNCi17DQotICAgIGlmICghbV9wVGV4dE91dCkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLSAgICB9DQotICAgIG1fcEZERUZvbnQgPSBGV0xfR2V0Rm9udE1hbmFnZXIoKS0+RmluZEZvbnQoc3RyRm9udCwgMCwgMCk7DQotICAgIG1fcFRleHRPdXQtPlNldEZvbnQobV9wRkRFRm9udCk7DQotICAgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQotICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihyZ2JGb250KTsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GV0xfRVJSCUNGV0xfV2lkZ2V0VFA6OlNldEZvbnQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIElGWF9Gb250ICpwRm9udCwgRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9BUkdCIHJnYkZvbnQpDQotew0KLSAgICBpZiAoIW1fcFRleHRPdXQpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICBtX3BUZXh0T3V0LT5TZXRGb250KHBGb250KTsNCi0gICAgbV9wVGV4dE91dC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsNCi0gICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKHJnYkZvbnQpOw0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUlGWF9Gb250KiBDRldMX1dpZGdldFRQOjpHZXRGb250KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIG1fcEZERUZvbnQ7DQorSUZYX0ZvbnQqIENGV0xfV2lkZ2V0VFA6OkdldEZvbnQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX3BGREVGb250Ow0KIH0NCiBDRldMX1dpZGdldFRQOjpDRldMX1dpZGdldFRQKCkNCi0gICAgOiBtX2R3UmVmQ291bnQoMSkNCi0gICAgLCBtX3BUZXh0T3V0KE5VTEwpDQotICAgICwgbV9wRkRFRm9udChOVUxMKQ0KLSAgICAsIG1fZHdUaGVtZUlEKDApDQotew0KLX0NCi1GWF9FUlIgQ0ZXTF9XaWRnZXRUUDo6SW5pdFRUTygpDQotew0KLSAgICBpZiAobV9wVGV4dE91dCkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLSAgICB9DQotICAgIG1fcEZERUZvbnQgPSBGV0xfR2V0Rm9udE1hbmFnZXIoKS0+RmluZEZvbnQoRlhfV1NUUkMoTCJIZWx2ZXRpY2EiKSwgMCwgMCk7DQotICAgIG1fcFRleHRPdXQgPSBJRkRFX1RleHRPdXQ6OkNyZWF0ZSgpOw0KLSAgICBtX3BUZXh0T3V0LT5TZXRGb250KG1fcEZERUZvbnQpOw0KLSAgICBtX3BUZXh0T3V0LT5TZXRGb250U2l6ZShGV0xUSEVNRV9DQVBBQ0lUWV9Gb250U2l6ZSk7DQotICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3IpOw0KLSAgICBtX3BUZXh0T3V0LT5TZXRFbGxpcHNpc1N0cmluZyhMIi4uLiIpOw0KKyAgICA6IG1fZHdSZWZDb3VudCgxKSwgbV9wVGV4dE91dChOVUxMKSwgbV9wRkRFRm9udChOVUxMKSwgbV9kd1RoZW1lSUQoMCkge30NCitGWF9FUlIgQ0ZXTF9XaWRnZXRUUDo6SW5pdFRUTygpIHsNCisgIGlmIChtX3BUZXh0T3V0KSB7DQogICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIG1fcEZERUZvbnQgPSBGV0xfR2V0Rm9udE1hbmFnZXIoKS0+RmluZEZvbnQoRlhfV1NUUkMoTCJIZWx2ZXRpY2EiKSwgMCwgMCk7DQorICBtX3BUZXh0T3V0ID0gSUZERV9UZXh0T3V0OjpDcmVhdGUoKTsNCisgIG1fcFRleHRPdXQtPlNldEZvbnQobV9wRkRFRm9udCk7DQorICBtX3BUZXh0T3V0LT5TZXRGb250U2l6ZShGV0xUSEVNRV9DQVBBQ0lUWV9Gb250U2l6ZSk7DQorICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yKTsNCisgIG1fcFRleHRPdXQtPlNldEVsbGlwc2lzU3RyaW5nKEwiLi4uIik7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0VSUiBDRldMX1dpZGdldFRQOjpGaW5hbGl6ZVRUTygpDQotew0KLSAgICBpZiAobV9wVGV4dE91dCkgew0KLSAgICAgICAgbV9wVGV4dE91dC0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wVGV4dE91dCA9IE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZYX0VSUiBDRldMX1dpZGdldFRQOjpGaW5hbGl6ZVRUTygpIHsNCisgIGlmIChtX3BUZXh0T3V0KSB7DQorICAgIG1fcFRleHRPdXQtPlJlbGVhc2UoKTsNCisgICAgbV9wVGV4dE91dCA9IE5VTEw7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KICNpZmRlZiBUSEVNRV9YUFNpbWlsYXINCi12b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdFZGdlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGWF9EV09SRCBkd1N0eWxlcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCkNCi17DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEdyYXBoaWNzKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQotICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX0NvbG9yIGNyU3Ryb2tlKEZXTF9HZXRUaGVtZUNvbG9yKG1fZHdUaGVtZUlEKSA9PSAwID8gQXJnYkVuY29kZSgyNTUsIDEyNywgMTU3LCAxODUpIDogRldMVEhFTUVfQ09MT1JfR3JlZW5fQktTZWxlY3RlZCk7DQotICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyU3Ryb2tlKTsNCi0gICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCAtIDEsIHBSZWN0LT5oZWlnaHQgLSAxKTsNCi0gICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgcGF0aC5DbGVhcigpOw0KLSAgICBjclN0cm9rZSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCi0gICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JTdHJva2UpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3AgKyAxLCBwUmVjdC0+d2lkdGggLSAzLCBwUmVjdC0+aGVpZ2h0IC0gMyk7DQotICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQotICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit2b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdFZGdlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwR3JhcGhpY3MpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3JTdHJva2UoRldMX0dldFRoZW1lQ29sb3IobV9kd1RoZW1lSUQpID09IDANCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcmdiRW5jb2RlKDI1NSwgMTI3LCAxNTcsIDE4NSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xUSEVNRV9DT0xPUl9HcmVlbl9CS1NlbGVjdGVkKTsNCisgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyU3Ryb2tlKTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCAtIDEsDQorICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0IC0gMSk7DQorICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgY3JTdHJva2UgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjclN0cm9rZSk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3AgKyAxLCBwUmVjdC0+d2lkdGggLSAzLA0KKyAgICAgICAgICAgICAgICAgICAgcFJlY3QtPmhlaWdodCAtIDMpOw0KKyAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCiB9DQogI2Vsc2UNCi12b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdFZGdlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGWF9EV09SRCBkd1N0eWxlcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFJlY3QpOw0KLSAgICBGV0xUSEVNRV9FREdFIGVUeXBlOw0KLSAgICBGWF9GTE9BVCBmV2lkdGg7DQotICAgIHN3aXRjaChkd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9FZGdlTWFzaykgew0KLSAgICAgICAgY2FzZSBGV0xfV0dUU1RZTEVfRWRnZVJhaXNlZDogew0KLSAgICAgICAgICAgICAgICBlVHlwZSA9IEZXTFRIRU1FX0VER0VfUmFpc2VkLCBmV2lkdGggPSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlUmFpc2VkOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlU3Vua2VuOiB7DQotICAgICAgICAgICAgICAgIGVUeXBlID0gRldMVEhFTUVfRURHRV9TdW5rZW4sIGZXaWR0aCA9IEZXTFRIRU1FX0NBUEFDSVRZX0VkZ2VTdW5rZW47DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMX1dHVFNUWUxFX0VkZ2VGbGF0Og0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0VkZ2UoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBSZWN0KTsNCisgIEZXTFRIRU1FX0VER0UgZVR5cGU7DQorICBGWF9GTE9BVCBmV2lkdGg7DQorICBzd2l0Y2ggKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX0VkZ2VNYXNrKSB7DQorICAgIGNhc2UgRldMX1dHVFNUWUxFX0VkZ2VSYWlzZWQ6IHsNCisgICAgICBlVHlwZSA9IEZXTFRIRU1FX0VER0VfUmFpc2VkLCBmV2lkdGggPSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlUmFpc2VkOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIERyYXczRFJlY3QocEdyYXBoaWNzLA0KLSAgICAgICAgICAgICAgIGVUeXBlLA0KLSAgICAgICAgICAgICAgIGZXaWR0aCwNCi0gICAgICAgICAgICAgICBwUmVjdCwNCi0gICAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFTFQxLA0KLSAgICAgICAgICAgICAgIEZXTFRIRU1FX0NPTE9SX0VER0VMVDIsDQotICAgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRVJCMSwNCi0gICAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFUkIyLA0KLSAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlU3Vua2VuOiB7DQorICAgICAgZVR5cGUgPSBGV0xUSEVNRV9FREdFX1N1bmtlbiwgZldpZHRoID0gRldMVEhFTUVfQ0FQQUNJVFlfRWRnZVN1bmtlbjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlRmxhdDoNCisgICAgZGVmYXVsdDogeyByZXR1cm47IH0NCisgIH0NCisgIERyYXczRFJlY3QocEdyYXBoaWNzLCBlVHlwZSwgZldpZHRoLCBwUmVjdCwgRldMVEhFTUVfQ09MT1JfRURHRUxUMSwNCisgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRUxUMiwgRldMVEhFTUVfQ09MT1JfRURHRVJCMSwNCisgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRVJCMiwgcE1hdHJpeCk7DQogfQ0KICNlbmRpZg0KLXZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhdzNEUmVjdChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRldMVEhFTUVfRURHRSBlVHlwZSwgRlhfRkxPQVQgZldpZHRoLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9BUkdCIGNyMSwgRlhfQVJHQiBjcjIsIEZYX0FSR0IgY3IzLCBGWF9BUkdCIGNyNCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFJlY3QpOw0KLSAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIGlmIChlVHlwZSA9PSBGV0xUSEVNRV9FREdFX0ZsYXQpIHsNCi0gICAgICAgIENGWF9QYXRoIHBhdGg7DQotICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPndpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPmhlaWdodCk7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wICsgMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT53aWR0aCAtIDIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0IC0gMik7DQotICAgICAgICBDRlhfQ29sb3IgY3IoQXJnYkVuY29kZSgyNTUsIDEwMCwgMTAwLCAxMDApKTsNCi0gICAgICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQotICAgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgICAgICBwYXRoLkNsZWFyKCk7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wICsgMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT53aWR0aCAtIDIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0IC0gMik7DQotICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wICsgMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT53aWR0aCAtIDQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0IC0gNCk7DQotICAgICAgICBjci5TZXQoMHhGRkZGRkZGRik7DQotICAgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhfRkxPQVQgZkxlZnQgPSBwUmVjdC0+bGVmdDsNCi0gICAgICAgIEZYX0ZMT0FUIGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOw0KLSAgICAgICAgRlhfRkxPQVQgZlRvcCA9IHBSZWN0LT50b3A7DQotICAgICAgICBGWF9GTE9BVCBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOw0KLSAgICAgICAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZXaWR0aCAvIDIuMGY7DQotICAgICAgICBDRlhfQ29sb3IgY3JMVChlVHlwZSA9PSBGV0xUSEVNRV9FREdFX1JhaXNlZCA/IGNyNCA6IGNyMSk7DQotICAgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JMVCk7DQotICAgICAgICBDRlhfUGF0aCBwYXRoTFQ7DQotICAgICAgICBwYXRoTFQuQ3JlYXRlKCk7DQotICAgICAgICBwYXRoTFQuTW92ZVRvKGZMZWZ0LCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQotICAgICAgICBwYXRoTFQuTGluZVRvKGZMZWZ0LCBmVG9wKTsNCi0gICAgICAgIHBhdGhMVC5MaW5lVG8oZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCk7DQotICAgICAgICBwYXRoTFQuTGluZVRvKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCi0gICAgICAgIHBhdGhMVC5MaW5lVG8oZkxlZnQgKyBmSGFsZldpZHRoLCBmVG9wICsgZkhhbGZXaWR0aCk7DQotICAgICAgICBwYXRoTFQuTGluZVRvKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSAtIGZIYWxmV2lkdGgpOw0KLSAgICAgICAgcGF0aExULkxpbmVUbyhmTGVmdCwgZkJvdHRvbSAtIGZIYWxmV2lkdGgpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aExULCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgICAgICBjckxUID0gQ0ZYX0NvbG9yKGVUeXBlID09IEZXTFRIRU1FX0VER0VfUmFpc2VkID8gY3IzIDogY3IyKTsNCi0gICAgICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckxUKTsNCi0gICAgICAgIHBhdGhMVC5DbGVhcigpOw0KLSAgICAgICAgcGF0aExULk1vdmVUbyhmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gLSBmV2lkdGgpOw0KLSAgICAgICAgcGF0aExULkxpbmVUbyhmTGVmdCArIGZIYWxmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCi0gICAgICAgIHBhdGhMVC5MaW5lVG8oZlJpZ2h0IC0gZldpZHRoLCBmVG9wICsgZkhhbGZXaWR0aCk7DQotICAgICAgICBwYXRoTFQuTGluZVRvKGZSaWdodCAtIGZXaWR0aCwgZlRvcCArIGZXaWR0aCk7DQotICAgICAgICBwYXRoTFQuTGluZVRvKGZMZWZ0ICsgZldpZHRoLCBmVG9wICsgZldpZHRoKTsNCi0gICAgICAgIHBhdGhMVC5MaW5lVG8oZkxlZnQgKyBmV2lkdGgsIGZCb3R0b20gLSBmV2lkdGgpOw0KLSAgICAgICAgcGF0aExULkxpbmVUbyhmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gLSBmV2lkdGgpOw0KLSAgICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aExULCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgICAgICBDRlhfQ29sb3IgY3JSQihlVHlwZSA9PSBGV0xUSEVNRV9FREdFX1JhaXNlZCA/IGNyMSA6IGNyMyk7DQotICAgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JSQik7DQotICAgICAgICBDRlhfUGF0aCBwYXRoUkI7DQotICAgICAgICBwYXRoUkIuQ3JlYXRlKCk7DQotICAgICAgICBwYXRoUkIuTW92ZVRvKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCi0gICAgICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZkJvdHRvbSAtIGZIYWxmV2lkdGgpOw0KLSAgICAgICAgcGF0aFJCLkxpbmVUbyhmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gLSBmSGFsZldpZHRoKTsNCi0gICAgICAgIHBhdGhSQi5MaW5lVG8oZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tIC0gZldpZHRoKTsNCi0gICAgICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0IC0gZldpZHRoLCBmQm90dG9tIC0gZldpZHRoKTsNCi0gICAgICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0IC0gZldpZHRoLCBmVG9wICsgZkhhbGZXaWR0aCk7DQotICAgICAgICBwYXRoUkIuTGluZVRvKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCi0gICAgICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGhSQiwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KLSAgICAgICAgY3JSQiA9IENGWF9Db2xvcihlVHlwZSA9PSBGV0xUSEVNRV9FREdFX1JhaXNlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICA/IGNyMiA6IGNyNCk7DQotICAgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JSQik7DQotICAgICAgICBwYXRoUkIuQ2xlYXIoKTsNCi0gICAgICAgIHBhdGhSQi5Nb3ZlVG8oZlJpZ2h0LCBmVG9wKTsNCi0gICAgICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0LCBmQm90dG9tKTsNCi0gICAgICAgIHBhdGhSQi5MaW5lVG8oZkxlZnQsIGZCb3R0b20pOw0KLSAgICAgICAgcGF0aFJCLkxpbmVUbyhmTGVmdCwgZkJvdHRvbSAtIGZIYWxmV2lkdGgpOw0KLSAgICAgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmSGFsZldpZHRoLCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQotICAgICAgICBwYXRoUkIuTGluZVRvKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3ApOw0KLSAgICAgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQsIGZUb3ApOw0KLSAgICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aFJCLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIH0NCi0gICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXczRENpcmNsZShDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRldMVEhFTUVfRURHRSBlVHlwZSwgRlhfRkxPQVQgZldpZHRoLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGWF9BUkdCIGNyMSwgRlhfQVJHQiBjcjIsIEZYX0FSR0IgY3IzLCBGWF9BUkdCIGNyNCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFJlY3QpOw0KLSAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIEZYX0ZMT0FUIGZSYWRpdXMgPSBwUmVjdC0+d2lkdGggLyAyOw0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhdzNEUmVjdChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRURHRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgY3IzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyNCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwR3JhcGhpY3MpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBpZiAoZVR5cGUgPT0gRldMVEhFTUVfRURHRV9GbGF0KSB7DQogICAgIENGWF9QYXRoIHBhdGg7DQogICAgIHBhdGguQ3JlYXRlKCk7DQotICAgIHBhdGguQWRkQXJjKHBSZWN0LT5sZWZ0LA0KLSAgICAgICAgICAgICAgICBwUmVjdC0+dG9wLA0KLSAgICAgICAgICAgICAgICBwUmVjdC0+d2lkdGgsDQotICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQsDQotICAgICAgICAgICAgICAgIEZXTFRIRU1FX1BJICogMyAvIDQsDQotICAgICAgICAgICAgICAgIEZXTFRIRU1FX1BJKTsNCi0gICAgQ0ZYX0NvbG9yIGNyRmlsbDEoZVR5cGUgPT0gRldMVEhFTUVfRURHRV9SYWlzZWQgPyBjcjQgOiBjcjEpOw0KLSAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckZpbGwxKTsNCi0gICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgQ0ZYX1JlY3RGIHJ0SW5uZXIoKnBSZWN0KTsNCi0gICAgcnRJbm5lci5EZWZsYXRlKHBSZWN0LT53aWR0aCAvIDQsIHBSZWN0LT5oZWlnaHQgLyA0KTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgMSwgcFJlY3QtPnRvcCArIDEsIHBSZWN0LT53aWR0aCAtIDIsDQorICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQgLSAyKTsNCisgICAgQ0ZYX0NvbG9yIGNyKEFyZ2JFbmNvZGUoMjU1LCAxMDAsIDEwMCwgMTAwKSk7DQorICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCiAgICAgcGF0aC5DbGVhcigpOw0KLSAgICBwYXRoLkFkZEFyYyhydElubmVyLmxlZnQsDQotICAgICAgICAgICAgICAgIHJ0SW5uZXIudG9wLA0KLSAgICAgICAgICAgICAgICBydElubmVyLndpZHRoLA0KLSAgICAgICAgICAgICAgICBydElubmVyLmhlaWdodCwNCi0gICAgICAgICAgICAgICAgRldMVEhFTUVfUEkgKiAzIC8gNCwNCi0gICAgICAgICAgICAgICAgRldMVEhFTUVfUEkpOw0KLSAgICBDRlhfQ29sb3IgY3JGaWxsMihlVHlwZSA9PSBGV0xUSEVNRV9FREdFX1JhaXNlZCA/IGNyMyA6IGNyMik7DQotICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyRmlsbDIpOw0KLSAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KLSAgICBwYXRoLkNsZWFyKCk7DQotICAgIHBhdGguQWRkQXJjKHBSZWN0LT5sZWZ0LA0KLSAgICAgICAgICAgICAgICBwUmVjdC0+dG9wLA0KLSAgICAgICAgICAgICAgICBwUmVjdC0+d2lkdGgsDQotICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQsDQotICAgICAgICAgICAgICAgIEZXTFRIRU1FX1BJICogNyAvIDQsDQotICAgICAgICAgICAgICAgIEZXTFRIRU1FX1BJKTsNCi0gICAgQ0ZYX0NvbG9yIGNyRmlsbDMoZVR5cGUgPT0gRldMVEhFTUVfRURHRV9SYWlzZWQgPyBjcjEgOiBjcjMpOw0KLSAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckZpbGwzKTsNCi0gICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgcGF0aC5BZGRBcmMocnRJbm5lci5sZWZ0LA0KLSAgICAgICAgICAgICAgICBydElubmVyLnRvcCwNCi0gICAgICAgICAgICAgICAgcnRJbm5lci53aWR0aCwNCi0gICAgICAgICAgICAgICAgcnRJbm5lci5oZWlnaHQsDQotICAgICAgICAgICAgICAgIEZXTFRIRU1FX1BJICAqIDcgLyA0LA0KLSAgICAgICAgICAgICAgICBGV0xUSEVNRV9QSSk7DQotICAgIENGWF9Db2xvciBjckZpbGw0KGVUeXBlID09IEZXTFRIRU1FX0VER0VfUmFpc2VkID8gY3IyIDogY3I0KTsNCi0gICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JGaWxsNCk7DQotICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQotICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi19DQotdm9pZCBDRldMX1dpZGdldFRQOjpEcmF3Qm9yZGVyKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEdyYXBoaWNzKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQotICAgIENGWF9QYXRoIHBhdGg7DQotICAgIHBhdGguQ3JlYXRlKCk7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3AgKyAxLCBwUmVjdC0+d2lkdGggLSAyLCBwUmVjdC0+aGVpZ2h0IC0gMik7DQotICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX0NvbG9yIGNyRmlsbChBcmdiRW5jb2RlKDI1NSwgMCwgMCwgMCkpOw0KLSAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCi0gICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQotICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi19DQotdm9pZCBDRldMX1dpZGdldFRQOjpGaWxsQmFja2dyb3VuZChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZCwgcFJlY3QsIHBNYXRyaXgpOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0VFA6OkZpbGxTb2lsZFJlY3QoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIEZYX0FSR0IgZmlsbENvbG9yLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEdyYXBoaWNzKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQotICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX0NvbG9yIGNyRmlsbChmaWxsQ29sb3IpOw0KLSAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCi0gICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQotICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBeGlhbFNoYWRpbmcoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIEZYX0ZMT0FUIGZ4MSwgRlhfRkxPQVQgZnkxLCBGWF9GTE9BVCBmeDIsIEZYX0ZMT0FUIGZ5MiwgRlhfQVJHQiBiZWdpbkNvbG9yLCBGWF9BUkdCIGVuZENvbG9yLCBDRlhfUGF0aCAqcGF0aCwgaW50MzJfdCBmaWxsTW9kZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocGF0aCk7DQotICAgIENGWF9Qb2ludEYgYmVnUG9pbnQsIGVuZFBvaW50Ow0KLSAgICBiZWdQb2ludC5TZXQoZngxLCBmeTEpOw0KLSAgICBlbmRQb2ludC5TZXQoZngyLCBmeTIpOw0KLSAgICBDRlhfU2hhZGluZyBzaGFkaW5nOw0KLSAgICBzaGFkaW5nLkNyZWF0ZUF4aWFsKGJlZ1BvaW50LCBlbmRQb2ludCwgRkFMU0UsIEZBTFNFLCBiZWdpbkNvbG9yLCBlbmRDb2xvcik7DQotICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX0NvbG9yIGNvbG9yMSgmc2hhZGluZyk7DQotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjb2xvcjEpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKHBhdGgsIGZpbGxNb2RlLCBwTWF0cml4KTsNCi0gICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBbm51bHVzUmVjdChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgRlhfQVJHQiBmaWxsQ29sb3IsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIEZYX0ZMT0FUIGZSaW5nV2lkdGggLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocEdyYXBoaWNzKTsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQotICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX0NvbG9yIGNyKGZpbGxDb2xvcik7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgMSwgcFJlY3QtPnRvcCArIDEsIHBSZWN0LT53aWR0aCAtIDIsDQorICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQgLSAyKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyAyLCBwUmVjdC0+dG9wICsgMiwgcFJlY3QtPndpZHRoIC0gNCwNCisgICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPmhlaWdodCAtIDQpOw0KKyAgICBjci5TZXQoMHhGRkZGRkZGRik7DQogICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQotICAgIENGWF9QYXRoIHBhdGg7DQotICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIH0gZWxzZSB7DQorICAgIEZYX0ZMT0FUIGZMZWZ0ID0gcFJlY3QtPmxlZnQ7DQogICAgIEZYX0ZMT0FUIGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOw0KKyAgICBGWF9GTE9BVCBmVG9wID0gcFJlY3QtPnRvcDsNCiAgICAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0SW5uZXIoKnBSZWN0KTsNCi0gICAgcnRJbm5lci5EZWZsYXRlKGZSaW5nV2lkdGgsIGZSaW5nV2lkdGgpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShydElubmVyLmxlZnQsIHJ0SW5uZXIudG9wLCBydElubmVyLndpZHRoLCBydElubmVyLmhlaWdodCk7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCBwTWF0cml4KTsNCi0gICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsNCisgICAgQ0ZYX0NvbG9yIGNyTFQoZVR5cGUgPT0gRldMVEhFTUVfRURHRV9SYWlzZWQgPyBjcjQgOiBjcjEpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JMVCk7DQorICAgIENGWF9QYXRoIHBhdGhMVDsNCisgICAgcGF0aExULkNyZWF0ZSgpOw0KKyAgICBwYXRoTFQuTW92ZVRvKGZMZWZ0LCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQorICAgIHBhdGhMVC5MaW5lVG8oZkxlZnQsIGZUb3ApOw0KKyAgICBwYXRoTFQuTGluZVRvKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3ApOw0KKyAgICBwYXRoTFQuTGluZVRvKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCisgICAgcGF0aExULkxpbmVUbyhmTGVmdCArIGZIYWxmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCisgICAgcGF0aExULkxpbmVUbyhmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gLSBmSGFsZldpZHRoKTsNCisgICAgcGF0aExULkxpbmVUbyhmTGVmdCwgZkJvdHRvbSAtIGZIYWxmV2lkdGgpOw0KKyAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoTFQsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgY3JMVCA9IENGWF9Db2xvcihlVHlwZSA9PSBGV0xUSEVNRV9FREdFX1JhaXNlZCA/IGNyMyA6IGNyMik7DQorICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckxUKTsNCisgICAgcGF0aExULkNsZWFyKCk7DQorICAgIHBhdGhMVC5Nb3ZlVG8oZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tIC0gZldpZHRoKTsNCisgICAgcGF0aExULkxpbmVUbyhmTGVmdCArIGZIYWxmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCisgICAgcGF0aExULkxpbmVUbyhmUmlnaHQgLSBmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCisgICAgcGF0aExULkxpbmVUbyhmUmlnaHQgLSBmV2lkdGgsIGZUb3AgKyBmV2lkdGgpOw0KKyAgICBwYXRoTFQuTGluZVRvKGZMZWZ0ICsgZldpZHRoLCBmVG9wICsgZldpZHRoKTsNCisgICAgcGF0aExULkxpbmVUbyhmTGVmdCArIGZXaWR0aCwgZkJvdHRvbSAtIGZXaWR0aCk7DQorICAgIHBhdGhMVC5MaW5lVG8oZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tIC0gZldpZHRoKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aExULCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICAgIENGWF9Db2xvciBjclJCKGVUeXBlID09IEZXTFRIRU1FX0VER0VfUmFpc2VkID8gY3IxIDogY3IzKTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyUkIpOw0KKyAgICBDRlhfUGF0aCBwYXRoUkI7DQorICAgIHBhdGhSQi5DcmVhdGUoKTsNCisgICAgcGF0aFJCLk1vdmVUbyhmUmlnaHQgLSBmSGFsZldpZHRoLCBmVG9wICsgZkhhbGZXaWR0aCk7DQorICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZkJvdHRvbSAtIGZIYWxmV2lkdGgpOw0KKyAgICBwYXRoUkIuTGluZVRvKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSAtIGZIYWxmV2lkdGgpOw0KKyAgICBwYXRoUkIuTGluZVRvKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSAtIGZXaWR0aCk7DQorICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0IC0gZldpZHRoLCBmQm90dG9tIC0gZldpZHRoKTsNCisgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCisgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmSGFsZldpZHRoLCBmVG9wICsgZkhhbGZXaWR0aCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGhSQiwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBjclJCID0gQ0ZYX0NvbG9yKGVUeXBlID09IEZXTFRIRU1FX0VER0VfUmFpc2VkID8gY3IyIDogY3I0KTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyUkIpOw0KKyAgICBwYXRoUkIuQ2xlYXIoKTsNCisgICAgcGF0aFJCLk1vdmVUbyhmUmlnaHQsIGZUb3ApOw0KKyAgICBwYXRoUkIuTGluZVRvKGZSaWdodCwgZkJvdHRvbSk7DQorICAgIHBhdGhSQi5MaW5lVG8oZkxlZnQsIGZCb3R0b20pOw0KKyAgICBwYXRoUkIuTGluZVRvKGZMZWZ0LCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQorICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZkJvdHRvbSAtIGZIYWxmV2lkdGgpOw0KKyAgICBwYXRoUkIuTGluZVRvKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3ApOw0KKyAgICBwYXRoUkIuTGluZVRvKGZSaWdodCwgZlRvcCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGhSQiwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KIH0NCi12b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBbm51bHVzQ2lyY2xlKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBGWF9BUkdCIGZpbGxDb2xvciwgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRlhfRkxPQVQgZldpZHRoICwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQotICAgIF9GV0xfUkVUVVJOX0lGX0ZBSUwocFJlY3QpOw0KLSAgICBpZiAoZldpZHRoID4gcFJlY3QtPndpZHRoIC8gMikgew0KLSAgICAgICAgcmV0dXJuOw0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhdzNEQ2lyY2xlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0VER0UgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwR3JhcGhpY3MpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBGWF9GTE9BVCBmUmFkaXVzID0gcFJlY3QtPndpZHRoIC8gMjsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRBcmMocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCwNCisgICAgICAgICAgICAgIEZXTFRIRU1FX1BJICogMyAvIDQsIEZXTFRIRU1FX1BJKTsNCisgIENGWF9Db2xvciBjckZpbGwxKGVUeXBlID09IEZXTFRIRU1FX0VER0VfUmFpc2VkID8gY3I0IDogY3IxKTsNCisgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyRmlsbDEpOw0KKyAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIENGWF9SZWN0RiBydElubmVyKCpwUmVjdCk7DQorICBydElubmVyLkRlZmxhdGUocFJlY3QtPndpZHRoIC8gNCwgcFJlY3QtPmhlaWdodCAvIDQpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5BZGRBcmMocnRJbm5lci5sZWZ0LCBydElubmVyLnRvcCwgcnRJbm5lci53aWR0aCwgcnRJbm5lci5oZWlnaHQsDQorICAgICAgICAgICAgICBGV0xUSEVNRV9QSSAqIDMgLyA0LCBGV0xUSEVNRV9QSSk7DQorICBDRlhfQ29sb3IgY3JGaWxsMihlVHlwZSA9PSBGV0xUSEVNRV9FREdFX1JhaXNlZCA/IGNyMyA6IGNyMik7DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckZpbGwyKTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLkFkZEFyYyhwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0LA0KKyAgICAgICAgICAgICAgRldMVEhFTUVfUEkgKiA3IC8gNCwgRldMVEhFTUVfUEkpOw0KKyAgQ0ZYX0NvbG9yIGNyRmlsbDMoZVR5cGUgPT0gRldMVEhFTUVfRURHRV9SYWlzZWQgPyBjcjEgOiBjcjMpOw0KKyAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JGaWxsMyk7DQorICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcGF0aC5BZGRBcmMocnRJbm5lci5sZWZ0LCBydElubmVyLnRvcCwgcnRJbm5lci53aWR0aCwgcnRJbm5lci5oZWlnaHQsDQorICAgICAgICAgICAgICBGV0xUSEVNRV9QSSAqIDcgLyA0LCBGV0xUSEVNRV9QSSk7DQorICBDRlhfQ29sb3IgY3JGaWxsNChlVHlwZSA9PSBGV0xUSEVNRV9FREdFX1JhaXNlZCA/IGNyMiA6IGNyNCk7DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckZpbGw0KTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0JvcmRlcihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwR3JhcGhpY3MpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyAxLCBwUmVjdC0+dG9wICsgMSwgcFJlY3QtPndpZHRoIC0gMiwNCisgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQgLSAyKTsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9Db2xvciBjckZpbGwoQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApKTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RmlsbEJhY2tncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQsIHBSZWN0LCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX1dpZGdldFRQOjpGaWxsU29pbGRSZWN0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwR3JhcGhpY3MpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3JGaWxsKGZpbGxDb2xvcik7DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0F4aWFsU2hhZGluZyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGJlZ2luQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZW5kQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoKiBwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZpbGxNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBhdGgpOw0KKyAgQ0ZYX1BvaW50RiBiZWdQb2ludCwgZW5kUG9pbnQ7DQorICBiZWdQb2ludC5TZXQoZngxLCBmeTEpOw0KKyAgZW5kUG9pbnQuU2V0KGZ4MiwgZnkyKTsNCisgIENGWF9TaGFkaW5nIHNoYWRpbmc7DQorICBzaGFkaW5nLkNyZWF0ZUF4aWFsKGJlZ1BvaW50LCBlbmRQb2ludCwgRkFMU0UsIEZBTFNFLCBiZWdpbkNvbG9yLCBlbmRDb2xvcik7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY29sb3IxKCZzaGFkaW5nKTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjb2xvcjEpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aChwYXRoLCBmaWxsTW9kZSwgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0FubnVsdXNSZWN0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlJpbmdXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBSZWN0KTsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9Db2xvciBjcihmaWxsQ29sb3IpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgRlhfRkxPQVQgZlJpZ2h0ID0gcFJlY3QtPnJpZ2h0KCk7DQorICBGWF9GTE9BVCBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOw0KKyAgQ0ZYX1JlY3RGIHJ0SW5uZXIoKnBSZWN0KTsNCisgIHJ0SW5uZXIuRGVmbGF0ZShmUmluZ1dpZHRoLCBmUmluZ1dpZHRoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0SW5uZXIubGVmdCwgcnRJbm5lci50b3AsIHJ0SW5uZXIud2lkdGgsIHJ0SW5uZXIuaGVpZ2h0KTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0FubnVsdXNDaXJjbGUoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBHcmFwaGljcyk7DQorICBfRldMX1JFVFVSTl9JRl9GQUlMKHBSZWN0KTsNCisgIGlmIChmV2lkdGggPiBwUmVjdC0+d2lkdGggLyAyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9Db2xvciBjcihmaWxsQ29sb3IpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRFbGxpcHNlKCpwUmVjdCk7DQorICBDRlhfUmVjdEYgcnRJbigqcFJlY3QpOw0KKyAgcnRJbi5JbmZsYXRlKC1mV2lkdGgsIC1mV2lkdGgpOw0KKyAgcGF0aC5BZGRFbGxpcHNlKHJ0SW4pOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0ZvY3VzKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwR3JhcGhpY3MpOw0KKyAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwUmVjdCk7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3IoMHhGRjAwMDAwMCk7DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQorICBGWF9GTE9BVCBEYXNoUGF0dGVyblsyXSA9IHsxLCAxfTsNCisgIHBHcmFwaGljcy0+U2V0TGluZURhc2goMC4wZiwgRGFzaFBhdHRlcm4sIDIpOw0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0KTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KKyNkZWZpbmUgRldMVEhFTUVfQVJST1dfRGVub21pbmF0b3IgMw0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0Fycm93KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJlc3NlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUmVjdEYgcnRBcnJvdygqcFJlY3QpOw0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBGWF9GTE9BVCBmQnRuID0NCisgICAgICBGWF9NSU4ocFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0KSAvIEZXTFRIRU1FX0FSUk9XX0Rlbm9taW5hdG9yOw0KKyAgcnRBcnJvdy5sZWZ0ID0gcFJlY3QtPmxlZnQgKyAocFJlY3QtPndpZHRoIC0gZkJ0bikgLyAyOw0KKyAgcnRBcnJvdy50b3AgPSBwUmVjdC0+dG9wICsgKHBSZWN0LT5oZWlnaHQgLSBmQnRuKSAvIDI7DQorICBydEFycm93LndpZHRoID0gZkJ0bjsNCisgIHJ0QXJyb3cuaGVpZ2h0ID0gZkJ0bjsNCisgIGlmIChiUHJlc3NlZCkgew0KKyAgICBydEFycm93Lk9mZnNldCgxLCAxKTsNCisgIH0NCisgIHN3aXRjaCAoZURpY3QpIHsNCisgICAgY2FzZSBGV0xUSEVNRV9ESVJFQ1RJT05fVXA6IHsNCisgICAgICBwYXRoLk1vdmVUbyhydEFycm93LmxlZnQsIHJ0QXJyb3cuYm90dG9tKCkpOw0KKyAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5sZWZ0ICsgZkJ0biAvIDIsIHJ0QXJyb3cudG9wKTsNCisgICAgICBwYXRoLkxpbmVUbyhydEFycm93LmxlZnQsIHJ0QXJyb3cuYm90dG9tKCkpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX0NvbG9yIGNyKGZpbGxDb2xvcik7DQotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQotICAgIENGWF9QYXRoIHBhdGg7DQotICAgIHBhdGguQ3JlYXRlKCk7DQotICAgIHBhdGguQWRkRWxsaXBzZSgqcFJlY3QpOw0KLSAgICBDRlhfUmVjdEYgcnRJbigqcFJlY3QpOw0KLSAgICBydEluLkluZmxhdGUoLWZXaWR0aCwgLWZXaWR0aCk7DQotICAgIHBhdGguQWRkRWxsaXBzZShydEluKTsNCi0gICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQotICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi19DQotdm9pZCBDRldMX1dpZGdldFRQOjpEcmF3Rm9jdXMoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJlY3QsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fSUZfRkFJTChwR3JhcGhpY3MpOw0KLSAgICBfRldMX1JFVFVSTl9JRl9GQUlMKHBSZWN0KTsNCi0gICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBDRlhfQ29sb3IgY3IoMHhGRjAwMDAwMCk7DQotICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsNCi0gICAgRlhfRkxPQVQgRGFzaFBhdHRlcm5bMl0gPSB7MSwgMX07DQotICAgIHBHcmFwaGljcy0+U2V0TGluZURhc2goMC4wZiwgRGFzaFBhdHRlcm4sIDIpOw0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0KTsNCi0gICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLX0NCi0jZGVmaW5lIEZXTFRIRU1FX0FSUk9XX0Rlbm9taW5hdG9yCTMNCi12b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBcnJvdyhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LCBGWF9BUkdCIGFyZ2JGaWxsLCBGWF9CT09MIGJQcmVzc2VkLCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIENGWF9SZWN0RiBydEFycm93KCpwUmVjdCk7DQotICAgIENGWF9QYXRoIHBhdGg7DQotICAgIHBhdGguQ3JlYXRlKCk7DQotICAgIEZYX0ZMT0FUIGZCdG4gPSBGWF9NSU4ocFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0KSAvIEZXTFRIRU1FX0FSUk9XX0Rlbm9taW5hdG9yOw0KLSAgICBydEFycm93LmxlZnQgPSBwUmVjdC0+bGVmdCArIChwUmVjdC0+d2lkdGggLSBmQnRuKSAvIDI7DQotICAgIHJ0QXJyb3cudG9wID0gcFJlY3QtPnRvcCArIChwUmVjdC0+aGVpZ2h0IC0gZkJ0bikgLyAyOw0KLSAgICBydEFycm93LndpZHRoID0gZkJ0bjsNCi0gICAgcnRBcnJvdy5oZWlnaHQgPSBmQnRuOw0KLSAgICBpZiAoYlByZXNzZWQpIHsNCi0gICAgICAgIHJ0QXJyb3cuT2Zmc2V0KDEsIDEpOw0KKyAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9MZWZ0OiB7DQorICAgICAgcGF0aC5Nb3ZlVG8ocnRBcnJvdy5yaWdodCgpLCBydEFycm93LnRvcCk7DQorICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5yaWdodCgpLCBydEFycm93LmJvdHRvbSgpKTsNCisgICAgICBwYXRoLkxpbmVUbyhydEFycm93LmxlZnQsIHJ0QXJyb3cudG9wICsgZkJ0biAvIDIpOw0KKyAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy50b3ApOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHN3aXRjaCAoZURpY3QpIHsNCi0gICAgICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX1VwOiB7DQotICAgICAgICAgICAgICAgIHBhdGguTW92ZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy5ib3R0b20oKSk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy5ib3R0b20oKSk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCArIGZCdG4gLyAyLCBydEFycm93LnRvcCk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy5ib3R0b20oKSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX0xlZnQ6IHsNCi0gICAgICAgICAgICAgICAgcGF0aC5Nb3ZlVG8ocnRBcnJvdy5yaWdodCgpLCBydEFycm93LnRvcCk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy5ib3R0b20oKSk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy50b3AgKyBmQnRuIC8gMik7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy50b3ApOw0KLSAgICAgICAgICAgICAgICBicmVhayA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xUSEVNRV9ESVJFQ1RJT05fUmlnaHQ6IHsNCi0gICAgICAgICAgICAgICAgcGF0aC5Nb3ZlVG8ocnRBcnJvdy5sZWZ0LCBydEFycm93LnRvcCk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy5ib3R0b20oKSk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy50b3AgKyBmQnRuIC8gMik7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy50b3ApOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duOg0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICBwYXRoLk1vdmVUbyhydEFycm93LmxlZnQsIHJ0QXJyb3cudG9wKTsNCi0gICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5yaWdodCgpLCBydEFycm93LnRvcCk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCArIGZCdG4gLyAyLCBydEFycm93LmJvdHRvbSgpKTsNCi0gICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5sZWZ0LCBydEFycm93LnRvcCk7DQotICAgICAgICAgICAgfQ0KKyAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9SaWdodDogew0KKyAgICAgIHBhdGguTW92ZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy50b3ApOw0KKyAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5yaWdodCgpLCBydEFycm93LnRvcCArIGZCdG4gLyAyKTsNCisgICAgICBwYXRoLkxpbmVUbyhydEFycm93LmxlZnQsIHJ0QXJyb3cudG9wKTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIENGWF9Db2xvciBjcihhcmdiRmlsbCk7DQotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQotICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLX0NCi12b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBcnJvdyhDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUmVjdCwgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LCBGWF9BUkdCIGFyZ1NpZ24sIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0QXJyb3coKnBSZWN0KTsNCi0gICAgRlhfQk9PTCBiVmVydCA9IChlRGljdCA9PSBGV0xUSEVNRV9ESVJFQ1RJT05fVXAgfHwgZURpY3QgPT0gRldMVEhFTUVfRElSRUNUSU9OX0Rvd24pOw0KLSAgICBGWF9GTE9BVCBmTGVmdCA9IChGWF9GTE9BVCkoKChwUmVjdC0+d2lkdGggLSAoYlZlcnQgPyA5IDogNikpIC8gMiArIHBSZWN0LT5sZWZ0KSArIDAuNSk7DQotICAgIEZYX0ZMT0FUIGZUb3AgPSAoRlhfRkxPQVQpKCgocFJlY3QtPmhlaWdodCAtIChiVmVydCA/IDYgOiA5KSkgLyAyICsgcFJlY3QtPnRvcCkgKyAwLjUpOw0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBzd2l0Y2ggKGVEaWN0KSB7DQotICAgICAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duOiB7DQotICAgICAgICAgICAgICAgIHBhdGguTW92ZVRvKGZMZWZ0LCBmVG9wICsgMSk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNCwgZlRvcCArIDUpOw0KLSAgICAgICAgICAgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDgsIGZUb3AgKyAxKTsNCi0gICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA3LCBmVG9wKTsNCi0gICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA0LCBmVG9wICsgMyk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgMSwgZlRvcCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX1VwOiB7DQotICAgICAgICAgICAgICAgIHBhdGguTW92ZVRvKGZMZWZ0LCBmVG9wICsgNCk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNCwgZlRvcCk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgOCwgZlRvcCArIDQpOw0KLSAgICAgICAgICAgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDcsIGZUb3AgKyA1KTsNCi0gICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA0LCBmVG9wICsgMik7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgMSwgZlRvcCArIDUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9SaWdodDogew0KLSAgICAgICAgICAgICAgICBwYXRoLk1vdmVUbyhmTGVmdCArIDEsIGZUb3ApOw0KLSAgICAgICAgICAgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDUsIGZUb3AgKyA0KTsNCi0gICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyAxLCBmVG9wICsgOCk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0LCBmVG9wICsgNyk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgMywgZlRvcCArIDQpOw0KLSAgICAgICAgICAgICAgICBwYXRoLkxpbmVUbyhmTGVmdCwgZlRvcCArIDEpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9MZWZ0OiB7DQotICAgICAgICAgICAgICAgIHBhdGguTW92ZVRvKGZMZWZ0LCBmVG9wICsgNCk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNCwgZlRvcCk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNSwgZlRvcCArIDEpOw0KLSAgICAgICAgICAgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDIsIGZUb3AgKyA0KTsNCi0gICAgICAgICAgICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA1LCBmVG9wICsgNyk7DQotICAgICAgICAgICAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNCwgZlRvcCArIDgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQorICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX0Rvd246DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBwYXRoLk1vdmVUbyhydEFycm93LmxlZnQsIHJ0QXJyb3cudG9wKTsNCisgICAgICBwYXRoLkxpbmVUbyhydEFycm93LnJpZ2h0KCksIHJ0QXJyb3cudG9wKTsNCisgICAgICBwYXRoLkxpbmVUbyhydEFycm93LmxlZnQgKyBmQnRuIC8gMiwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5sZWZ0LCBydEFycm93LnRvcCk7DQogICAgIH0NCi0gICAgQ0ZYX0NvbG9yIGNyKGFyZ1NpZ24pOw0KLSAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOw0KLSAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICB9DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3IoYXJnYkZpbGwpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCiB9DQotdm9pZCBDRldMX1dpZGdldFRQOjpEcmF3QnRuKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGV0xUSEVNRV9TVEFURSBlU3RhdGUsIENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgaWYgKCFDRldMX0Fycm93RGF0YTo6SXNJbnN0YW5jZSgpKSB7DQotICAgICAgICBDRldMX0Fycm93RGF0YTo6R2V0SW5zdGFuY2UoKS0+U2V0Q29sb3JEYXRhKEZXTF9HZXRUaGVtZUNvbG9yKG1fZHdUaGVtZUlEKSk7DQordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3QXJyb3coQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdTaWduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9SZWN0RiBydEFycm93KCpwUmVjdCk7DQorICBGWF9CT09MIGJWZXJ0ID0NCisgICAgICAoZURpY3QgPT0gRldMVEhFTUVfRElSRUNUSU9OX1VwIHx8IGVEaWN0ID09IEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duKTsNCisgIEZYX0ZMT0FUIGZMZWZ0ID0NCisgICAgICAoRlhfRkxPQVQpKCgocFJlY3QtPndpZHRoIC0gKGJWZXJ0ID8gOSA6IDYpKSAvIDIgKyBwUmVjdC0+bGVmdCkgKyAwLjUpOw0KKyAgRlhfRkxPQVQgZlRvcCA9DQorICAgICAgKEZYX0ZMT0FUKSgoKHBSZWN0LT5oZWlnaHQgLSAoYlZlcnQgPyA2IDogOSkpIC8gMiArIHBSZWN0LT50b3ApICsgMC41KTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgc3dpdGNoIChlRGljdCkgew0KKyAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duOiB7DQorICAgICAgcGF0aC5Nb3ZlVG8oZkxlZnQsIGZUb3AgKyAxKTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDQsIGZUb3AgKyA1KTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDgsIGZUb3AgKyAxKTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDcsIGZUb3ApOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNCwgZlRvcCArIDMpOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgMSwgZlRvcCk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgQ0ZXTF9BcnJvd0RhdGE6OkNDb2xvckRhdGEgKnBDb2xvckRhdGEgPSBDRldMX0Fycm93RGF0YTo6R2V0SW5zdGFuY2UoKS0+bV9wQ29sb3JEYXRhOw0KLSAgICBGWF9GTE9BVCBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCi0gICAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQotICAgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLA0KLSAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5sZWZ0LA0KLSAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AsDQotICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0LA0KLSAgICAgICAgICAgICAgICAgICAgIGZCb3R0b20sDQotICAgICAgICAgICAgICAgICAgICAgcENvbG9yRGF0YS0+Y2xyU3RhcnRbZVN0YXRlIC0gMV0sDQotICAgICAgICAgICAgICAgICAgICAgcENvbG9yRGF0YS0+Y2xyRW5kW2VTdGF0ZSAtIDFdLA0KLSAgICAgICAgICAgICAgICAgICAgICZwYXRoLA0KLSAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HLA0KLSAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KLSAgICBDRlhfQ29sb3IgcmNTdHJva2U7DQotICAgIHJjU3Ryb2tlLlNldChwQ29sb3JEYXRhLT5jbHJCb3JkZXJbZVN0YXRlIC0gMV0pOw0KLSAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZyY1N0cm9rZSk7DQotICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQotfQ0KLXZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0Fycm93QnRuKENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0LCBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBEcmF3QnRuKHBHcmFwaGljcywgcFJlY3QsIGVTdGF0ZSwgcE1hdHJpeCk7DQotICAgIGlmICghQ0ZXTF9BcnJvd0RhdGE6OklzSW5zdGFuY2UoKSkgew0KLSAgICAgICAgQ0ZXTF9BcnJvd0RhdGE6OkdldEluc3RhbmNlKCktPlNldENvbG9yRGF0YShGV0xfR2V0VGhlbWVDb2xvcihtX2R3VGhlbWVJRCkpOw0KKyAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9VcDogew0KKyAgICAgIHBhdGguTW92ZVRvKGZMZWZ0LCBmVG9wICsgNCk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA0LCBmVG9wKTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDgsIGZUb3AgKyA0KTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDcsIGZUb3AgKyA1KTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDQsIGZUb3AgKyAyKTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDEsIGZUb3AgKyA1KTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBDRldMX0Fycm93RGF0YTo6Q0NvbG9yRGF0YSAqcENvbG9yRGF0YSA9IENGV0xfQXJyb3dEYXRhOjpHZXRJbnN0YW5jZSgpLT5tX3BDb2xvckRhdGE7DQotICAgIERyYXdBcnJvdyhwR3JhcGhpY3MsIHBSZWN0LCBlRGljdCwgcENvbG9yRGF0YS0+Y2xyU2lnbltlU3RhdGUgLSAxXSwgcE1hdHJpeCk7DQotfQ0KLUZXTENPTE9SIENGV0xfV2lkZ2V0VFA6OkJsZW5kQ29sb3IoRldMQ09MT1Igc3JjQ29sb3IsIEZXTENPTE9SIHJlbmRlckNvbG9yLCB1aW50OF90IHNjYWxlKQ0KLXsNCi0gICAgRldMQ09MT1IgZHN0Q29sb3I7DQotICAgIHVpbnQ4X3QgbiA9IDI1NSAtIHNjYWxlOw0KLSAgICBkc3RDb2xvci5hID0gKHVpbnQ4X3QpKCgoRlhfV09SRClzcmNDb2xvci5hICogbiArIChGWF9XT1JEKXJlbmRlckNvbG9yLmEgKiBzY2FsZSkgPj4gOCk7DQotICAgIGRzdENvbG9yLnIgPSAodWludDhfdCkoKChGWF9XT1JEKXNyY0NvbG9yLnIgKiBuICsgKEZYX1dPUkQpcmVuZGVyQ29sb3IuciAqIHNjYWxlKSA+PiA4KTsNCi0gICAgZHN0Q29sb3IuZyA9ICh1aW50OF90KSgoKEZYX1dPUkQpc3JjQ29sb3IuZyAqIG4gKyAoRlhfV09SRClyZW5kZXJDb2xvci5nICogc2NhbGUpID4+IDgpOw0KLSAgICBkc3RDb2xvci5iID0gKHVpbnQ4X3QpKCgoRlhfV09SRClzcmNDb2xvci5iICogbiArIChGWF9XT1JEKXJlbmRlckNvbG9yLmIgKiBzY2FsZSkgPj4gOCk7DQotICAgIHJldHVybiBkc3RDb2xvcjsNCi19DQotQ0ZXTF9BcnJvd0RhdGE6OkNGV0xfQXJyb3dEYXRhKCkNCi0gICAgOiBtX3BDb2xvckRhdGEoTlVMTCkNCi17DQotICAgIFNldENvbG9yRGF0YSgwKTsNCi19DQotQ0ZXTF9Gb250TWFuYWdlciAqRldMX0dldEZvbnRNYW5hZ2VyKCkNCi17DQotICAgIHN0YXRpYyBDRldMX0ZvbnRNYW5hZ2VyICogX2ZvbnRNYW5hZ2VyID0gTlVMTDsNCi0gICAgaWYgKF9mb250TWFuYWdlciA9PSBOVUxMKSB7DQotICAgICAgICBfZm9udE1hbmFnZXIgPSBGWF9ORVcgQ0ZXTF9Gb250TWFuYWdlcjsNCisgICAgY2FzZSBGV0xUSEVNRV9ESVJFQ1RJT05fUmlnaHQ6IHsNCisgICAgICBwYXRoLk1vdmVUbyhmTGVmdCArIDEsIGZUb3ApOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNSwgZlRvcCArIDQpOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgMSwgZlRvcCArIDgpOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0LCBmVG9wICsgNyk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyAzLCBmVG9wICsgNCk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQsIGZUb3AgKyAxKTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gX2ZvbnRNYW5hZ2VyOw0KKyAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9MZWZ0OiB7DQorICAgICAgcGF0aC5Nb3ZlVG8oZkxlZnQsIGZUb3AgKyA0KTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDQsIGZUb3ApOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNSwgZlRvcCArIDEpOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgMiwgZlRvcCArIDQpOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNSwgZlRvcCArIDcpOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNCwgZlRvcCArIDgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBDRlhfQ29sb3IgY3IoYXJnU2lnbik7DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KIH0NCi12b2lkIEZXTF9SZWxlYXNlRm9udE1hbmFnZXIoKQ0KLXsNCi0gICAgQ0ZXTF9Gb250TWFuYWdlciAqIGZvbnRNYW5hZ2VyID0gRldMX0dldEZvbnRNYW5hZ2VyKCk7DQotICAgIGRlbGV0ZSBmb250TWFuYWdlcjsNCit2b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdCdG4oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBpZiAoIUNGV0xfQXJyb3dEYXRhOjpJc0luc3RhbmNlKCkpIHsNCisgICAgQ0ZXTF9BcnJvd0RhdGE6OkdldEluc3RhbmNlKCktPlNldENvbG9yRGF0YShGV0xfR2V0VGhlbWVDb2xvcihtX2R3VGhlbWVJRCkpOw0KKyAgfQ0KKyAgQ0ZXTF9BcnJvd0RhdGE6OkNDb2xvckRhdGEqIHBDb2xvckRhdGEgPQ0KKyAgICAgIENGV0xfQXJyb3dEYXRhOjpHZXRJbnN0YW5jZSgpLT5tX3BDb2xvckRhdGE7DQorICBGWF9GTE9BVCBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCisgIEZYX0ZMT0FUIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0KTsNCisgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgZlJpZ2h0LCBmQm90dG9tLA0KKyAgICAgICAgICAgICAgICAgICBwQ29sb3JEYXRhLT5jbHJTdGFydFtlU3RhdGUgLSAxXSwNCisgICAgICAgICAgICAgICAgICAgcENvbG9yRGF0YS0+Y2xyRW5kW2VTdGF0ZSAtIDFdLCAmcGF0aCwgRlhGSUxMX1dJTkRJTkcsDQorICAgICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgQ0ZYX0NvbG9yIHJjU3Ryb2tlOw0KKyAgcmNTdHJva2UuU2V0KHBDb2xvckRhdGEtPmNsckJvcmRlcltlU3RhdGUgLSAxXSk7DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZyY1N0cm9rZSk7DQorICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBcnJvd0J0bihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRHJhd0J0bihwR3JhcGhpY3MsIHBSZWN0LCBlU3RhdGUsIHBNYXRyaXgpOw0KKyAgaWYgKCFDRldMX0Fycm93RGF0YTo6SXNJbnN0YW5jZSgpKSB7DQorICAgIENGV0xfQXJyb3dEYXRhOjpHZXRJbnN0YW5jZSgpLT5TZXRDb2xvckRhdGEoRldMX0dldFRoZW1lQ29sb3IobV9kd1RoZW1lSUQpKTsNCisgIH0NCisgIENGV0xfQXJyb3dEYXRhOjpDQ29sb3JEYXRhKiBwQ29sb3JEYXRhID0NCisgICAgICBDRldMX0Fycm93RGF0YTo6R2V0SW5zdGFuY2UoKS0+bV9wQ29sb3JEYXRhOw0KKyAgRHJhd0Fycm93KHBHcmFwaGljcywgcFJlY3QsIGVEaWN0LCBwQ29sb3JEYXRhLT5jbHJTaWduW2VTdGF0ZSAtIDFdLCBwTWF0cml4KTsNCit9DQorRldMQ09MT1IgQ0ZXTF9XaWRnZXRUUDo6QmxlbmRDb2xvcihGV0xDT0xPUiBzcmNDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTENPTE9SIHJlbmRlckNvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FsZSkgew0KKyAgRldMQ09MT1IgZHN0Q29sb3I7DQorICB1aW50OF90IG4gPSAyNTUgLSBzY2FsZTsNCisgIGRzdENvbG9yLmEgPSAodWludDhfdCkoDQorICAgICAgKChGWF9XT1JEKXNyY0NvbG9yLmEgKiBuICsgKEZYX1dPUkQpcmVuZGVyQ29sb3IuYSAqIHNjYWxlKSA+PiA4KTsNCisgIGRzdENvbG9yLnIgPSAodWludDhfdCkoDQorICAgICAgKChGWF9XT1JEKXNyY0NvbG9yLnIgKiBuICsgKEZYX1dPUkQpcmVuZGVyQ29sb3IuciAqIHNjYWxlKSA+PiA4KTsNCisgIGRzdENvbG9yLmcgPSAodWludDhfdCkoDQorICAgICAgKChGWF9XT1JEKXNyY0NvbG9yLmcgKiBuICsgKEZYX1dPUkQpcmVuZGVyQ29sb3IuZyAqIHNjYWxlKSA+PiA4KTsNCisgIGRzdENvbG9yLmIgPSAodWludDhfdCkoDQorICAgICAgKChGWF9XT1JEKXNyY0NvbG9yLmIgKiBuICsgKEZYX1dPUkQpcmVuZGVyQ29sb3IuYiAqIHNjYWxlKSA+PiA4KTsNCisgIHJldHVybiBkc3RDb2xvcjsNCit9DQorQ0ZXTF9BcnJvd0RhdGE6OkNGV0xfQXJyb3dEYXRhKCkgOiBtX3BDb2xvckRhdGEoTlVMTCkgew0KKyAgU2V0Q29sb3JEYXRhKDApOw0KK30NCitDRldMX0ZvbnRNYW5hZ2VyKiBGV0xfR2V0Rm9udE1hbmFnZXIoKSB7DQorICBzdGF0aWMgQ0ZXTF9Gb250TWFuYWdlciogX2ZvbnRNYW5hZ2VyID0gTlVMTDsNCisgIGlmIChfZm9udE1hbmFnZXIgPT0gTlVMTCkgew0KKyAgICBfZm9udE1hbmFnZXIgPSBGWF9ORVcgQ0ZXTF9Gb250TWFuYWdlcjsNCisgIH0NCisgIHJldHVybiBfZm9udE1hbmFnZXI7DQorfQ0KK3ZvaWQgRldMX1JlbGVhc2VGb250TWFuYWdlcigpIHsNCisgIENGV0xfRm9udE1hbmFnZXIqIGZvbnRNYW5hZ2VyID0gRldMX0dldEZvbnRNYW5hZ2VyKCk7DQorICBkZWxldGUgZm9udE1hbmFnZXI7DQogfQ0KIENGV0xfRm9udERhdGE6OkNGV0xfRm9udERhdGEoKQ0KLSAgICA6IG1fZHdTdHlsZXMoMCkNCi0gICAgLCBtX2R3Q29kZVBhZ2UoMCkNCi0gICAgLCBtX3BGb250KDApDQotICAgICwgbV9wRm9udE1ncihOVUxMKQ0KKyAgICA6IG1fZHdTdHlsZXMoMCksDQorICAgICAgbV9kd0NvZGVQYWdlKDApLA0KKyAgICAgIG1fcEZvbnQoMCksDQorICAgICAgbV9wRm9udE1ncihOVUxMKQ0KICNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQotICAgICwgbV9wRm9udFNvdXJjZShOVUxMKQ0KKyAgICAgICwNCisgICAgICBtX3BGb250U291cmNlKE5VTEwpDQogI2VuZGlmDQogew0KIH0NCi1DRldMX0ZvbnREYXRhOjp+Q0ZXTF9Gb250RGF0YSgpDQotew0KLSAgICBpZiAobV9wRm9udCkgew0KLSAgICAgICAgbV9wRm9udC0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIGlmIChtX3BGb250TWdyKSB7DQotICAgICAgICBtX3BGb250TWdyLT5SZWxlYXNlKCk7DQotICAgIH0NCitDRldMX0ZvbnREYXRhOjp+Q0ZXTF9Gb250RGF0YSgpIHsNCisgIGlmIChtX3BGb250KSB7DQorICAgIG1fcEZvbnQtPlJlbGVhc2UoKTsNCisgIH0NCisgIGlmIChtX3BGb250TWdyKSB7DQorICAgIG1fcEZvbnRNZ3ItPlJlbGVhc2UoKTsNCisgIH0NCiAjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KLSAgICBpZihtX3BGb250U291cmNlICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcEZvbnRTb3VyY2UtPlJlbGVhc2UoKTsNCi0gICAgfQ0KKyAgaWYgKG1fcEZvbnRTb3VyY2UgIT0gTlVMTCkgew0KKyAgICBtX3BGb250U291cmNlLT5SZWxlYXNlKCk7DQorICB9DQogI2VuZGlmDQogfQ0KLUZYX0JPT0wgQ0ZXTF9Gb250RGF0YTo6RXF1YWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UpDQotew0KLSAgICByZXR1cm4gbV93c0ZhbWlseSA9PSB3c0ZvbnRGYW1pbHkgJiYgbV9kd1N0eWxlcyA9PSBkd0ZvbnRTdHlsZXMgJiYgbV9kd0NvZGVQYWdlID09IHdDb2RlUGFnZTsNCitGWF9CT09MIENGV0xfRm9udERhdGE6OkVxdWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgIHJldHVybiBtX3dzRmFtaWx5ID09IHdzRm9udEZhbWlseSAmJiBtX2R3U3R5bGVzID09IGR3Rm9udFN0eWxlcyAmJg0KKyAgICAgICAgIG1fZHdDb2RlUGFnZSA9PSB3Q29kZVBhZ2U7DQogfQ0KLUZYX0JPT0wgQ0ZXTF9Gb250RGF0YTo6TG9hZEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCBkd0NvZGVQYWdlKQ0KLXsNCi0gICAgbV93c0ZhbWlseSA9IHdzRm9udEZhbWlseTsNCi0gICAgbV9kd1N0eWxlcyA9IGR3Rm9udFN0eWxlczsNCi0gICAgbV9kd0NvZGVQYWdlID0gZHdDb2RlUGFnZTsNCi0gICAgaWYgKCFtX3BGb250TWdyKSB7DQorRlhfQk9PTCBDRldMX0ZvbnREYXRhOjpMb2FkRm9udChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgZHdDb2RlUGFnZSkgew0KKyAgbV93c0ZhbWlseSA9IHdzRm9udEZhbWlseTsNCisgIG1fZHdTdHlsZXMgPSBkd0ZvbnRTdHlsZXM7DQorICBtX2R3Q29kZVBhZ2UgPSBkd0NvZGVQYWdlOw0KKyAgaWYgKCFtX3BGb250TWdyKSB7DQogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgICAgIG1fcEZvbnRNZ3IgPSBJRlhfRm9udE1ncjo6Q3JlYXRlKEZYX0dldERlZkZvbnRFbnVtZXJhdG9yKCkpOw0KKyAgICBtX3BGb250TWdyID0gSUZYX0ZvbnRNZ3I6OkNyZWF0ZShGWF9HZXREZWZGb250RW51bWVyYXRvcigpKTsNCiAjZWxzZQ0KLSAgICAgICAgbV9wRm9udFNvdXJjZSA9IEZYX0NyZWF0ZURlZmF1bHRGb250U291cmNlRW51bSgpOw0KLSAgICAgICAgbV9wRm9udE1nciA9IElGWF9Gb250TWdyOjpDcmVhdGUobV9wRm9udFNvdXJjZSk7DQorICAgIG1fcEZvbnRTb3VyY2UgPSBGWF9DcmVhdGVEZWZhdWx0Rm9udFNvdXJjZUVudW0oKTsNCisgICAgbV9wRm9udE1nciA9IElGWF9Gb250TWdyOjpDcmVhdGUobV9wRm9udFNvdXJjZSk7DQogI2VuZGlmDQorICB9DQorICBtX3BGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KHdzRm9udEZhbWlseS5HZXRQdHIoKSwgZHdGb250U3R5bGVzLCBkd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250TWdyKTsNCisgIHJldHVybiBtX3BGb250ICE9IE5VTEw7DQorfQ0KK0NGV0xfRm9udE1hbmFnZXI6OkNGV0xfRm9udE1hbmFnZXIoKSB7fQ0KK0NGV0xfRm9udE1hbmFnZXI6On5DRldMX0ZvbnRNYW5hZ2VyKCkgew0KKyAgaW50MzJfdCBjb3VudCA9IG1fYXJyRm9udHMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICBDRldMX0ZvbnREYXRhKiBkYXRhID0gKENGV0xfRm9udERhdGEqKW1fYXJyRm9udHNbaV07DQorICAgIGRlbGV0ZSBkYXRhOw0KKyAgfQ0KKyAgbV9hcnJGb250cy5SZW1vdmVBbGwoKTsNCit9DQorSUZYX0ZvbnQqIENGV0xfRm9udE1hbmFnZXI6OkZpbmRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBpbnQzMl90IGNvdW50ID0gbV9hcnJGb250cy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgIENGV0xfRm9udERhdGEqIGRhdGEgPSAoQ0ZXTF9Gb250RGF0YSopbV9hcnJGb250c1tpXTsNCisgICAgaWYgKGRhdGEtPkVxdWFsKHdzRm9udEZhbWlseSwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpKSB7DQorICAgICAgcmV0dXJuIGRhdGEtPkdldEZvbnQoKTsNCiAgICAgfQ0KLSAgICBtX3BGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KHdzRm9udEZhbWlseS5HZXRQdHIoKSwgZHdGb250U3R5bGVzLCBkd0NvZGVQYWdlLCBtX3BGb250TWdyKTsNCi0gICAgcmV0dXJuIG1fcEZvbnQgIT0gTlVMTDsNCisgIH0NCisgIENGV0xfRm9udERhdGEqIGZvbnREYXRhID0gRlhfTkVXIENGV0xfRm9udERhdGE7DQorICBpZiAoIWZvbnREYXRhLT5Mb2FkRm9udCh3c0ZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKSkgew0KKyAgICBkZWxldGUgZm9udERhdGE7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgbV9hcnJGb250cy5BZGQoZm9udERhdGEpOw0KKyAgcmV0dXJuIGZvbnREYXRhLT5HZXRGb250KCk7DQogfQ0KLUNGV0xfRm9udE1hbmFnZXI6OkNGV0xfRm9udE1hbmFnZXIoKQ0KLXsNCitGWF9CT09MIEZXTFRIRU1FX0luaXQoKSB7DQorICByZXR1cm4gVFJVRTsNCiB9DQotQ0ZXTF9Gb250TWFuYWdlcjo6fkNGV0xfRm9udE1hbmFnZXIoKQ0KLXsNCi0gICAgaW50MzJfdCBjb3VudCA9IG1fYXJyRm9udHMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgew0KLSAgICAgICAgQ0ZXTF9Gb250RGF0YSAqZGF0YSA9IChDRldMX0ZvbnREYXRhKiltX2FyckZvbnRzW2ldOw0KLSAgICAgICAgZGVsZXRlIGRhdGE7DQotICAgIH0NCi0gICAgbV9hcnJGb250cy5SZW1vdmVBbGwoKTsNCit2b2lkIEZXTFRIRU1FX1JlbGVhc2UoKSB7DQorICBDRldMX0Fycm93RGF0YTo6RGVzdHJveUluc3RhbmNlKCk7DQorICBGV0xfUmVsZWFzZUZvbnRNYW5hZ2VyKCk7DQogfQ0KLUlGWF9Gb250KiBDRldMX0ZvbnRNYW5hZ2VyOjpGaW5kRm9udChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwgRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSkNCi17DQotICAgIGludDMyX3QgY291bnQgPSBtX2FyckZvbnRzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsNCi0gICAgICAgIENGV0xfRm9udERhdGEgKmRhdGEgPSAoQ0ZXTF9Gb250RGF0YSopbV9hcnJGb250c1tpXTsNCi0gICAgICAgIGlmIChkYXRhLT5FcXVhbCh3c0ZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKSkgew0KLSAgICAgICAgICAgIHJldHVybiBkYXRhLT5HZXRGb250KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgQ0ZXTF9Gb250RGF0YSAqZm9udERhdGEgPSBGWF9ORVcgQ0ZXTF9Gb250RGF0YTsNCi0gICAgaWYgKCFmb250RGF0YS0+TG9hZEZvbnQod3NGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSkpIHsNCi0gICAgICAgIGRlbGV0ZSBmb250RGF0YTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIG1fYXJyRm9udHMuQWRkKGZvbnREYXRhKTsNCi0gICAgcmV0dXJuIGZvbnREYXRhLT5HZXRGb250KCk7DQorRlhfRFdPUkQgRldMX0dldFRoZW1lTGF5b3V0KEZYX0RXT1JEIGR3VGhlbWVJRCkgew0KKyAgcmV0dXJuIDB4ZmZmZjAwMDAgJiBkd1RoZW1lSUQ7DQogfQ0KLUZYX0JPT0wJRldMVEhFTUVfSW5pdCgpDQotew0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9EV09SRCBGV0xfR2V0VGhlbWVDb2xvcihGWF9EV09SRCBkd1RoZW1lSUQpIHsNCisgIHJldHVybiAweDAwMDBmZmZmICYgZHdUaGVtZUlEOw0KIH0NCi12b2lkIEZXTFRIRU1FX1JlbGVhc2UoKQ0KLXsNCi0gICAgQ0ZXTF9BcnJvd0RhdGE6OkRlc3Ryb3lJbnN0YW5jZSgpOw0KLSAgICBGV0xfUmVsZWFzZUZvbnRNYW5hZ2VyKCk7DQorRlhfRFdPUkQgRldMX01ha2VUaGVtZUlEKEZYX0RXT1JEIGR3TGF5b3V0LCBGWF9EV09SRCBkd0NvbG9yKSB7DQorICByZXR1cm4gKGR3TGF5b3V0IDw8IDE2KSB8ICgweDAwMDBGRkZGICYgZHdDb2xvcik7DQogfQ0KLUZYX0RXT1JEIEZXTF9HZXRUaGVtZUxheW91dChGWF9EV09SRCBkd1RoZW1lSUQpDQotew0KLSAgICByZXR1cm4gMHhmZmZmMDAwMCAmIGR3VGhlbWVJRDsNCitDRldMX0Fycm93RGF0YSogQ0ZXTF9BcnJvd0RhdGE6Om1fcEluc3RhbmNlID0gTlVMTDsNCitDRldMX0Fycm93RGF0YSogQ0ZXTF9BcnJvd0RhdGE6OkdldEluc3RhbmNlKCkgew0KKyAgaWYgKCFtX3BJbnN0YW5jZSkgew0KKyAgICBtX3BJbnN0YW5jZSA9IEZYX05FVyBDRldMX0Fycm93RGF0YTsNCisgIH0NCisgIHJldHVybiBtX3BJbnN0YW5jZTsNCiB9DQotRlhfRFdPUkQgRldMX0dldFRoZW1lQ29sb3IoRlhfRFdPUkQgZHdUaGVtZUlEKQ0KLXsNCi0gICAgcmV0dXJuIDB4MDAwMGZmZmYgJiBkd1RoZW1lSUQ7DQorRlhfQk9PTCBDRldMX0Fycm93RGF0YTo6SXNJbnN0YW5jZSgpIHsNCisgIHJldHVybiAobV9wSW5zdGFuY2UgIT0gTlVMTCk7DQogfQ0KLUZYX0RXT1JEIEZXTF9NYWtlVGhlbWVJRChGWF9EV09SRCBkd0xheW91dCwgRlhfRFdPUkQgZHdDb2xvcikNCi17DQotICAgIHJldHVybiAoZHdMYXlvdXQgPDwgMTYpIHwgKDB4MDAwMEZGRkYgJiBkd0NvbG9yKTsNCit2b2lkIENGV0xfQXJyb3dEYXRhOjpEZXN0cm95SW5zdGFuY2UoKSB7DQorICBpZiAobV9wSW5zdGFuY2UpIHsNCisgICAgZGVsZXRlIG1fcEluc3RhbmNlOw0KKyAgICBtX3BJbnN0YW5jZSA9IE5VTEw7DQorICB9DQogfQ0KLUNGV0xfQXJyb3dEYXRhICpDRldMX0Fycm93RGF0YTo6bV9wSW5zdGFuY2UgPSBOVUxMOw0KLUNGV0xfQXJyb3dEYXRhKiBDRldMX0Fycm93RGF0YTo6R2V0SW5zdGFuY2UoKQ0KLXsNCi0gICAgaWYgKCFtX3BJbnN0YW5jZSkgew0KLSAgICAgICAgbV9wSW5zdGFuY2UgPSBGWF9ORVcgQ0ZXTF9BcnJvd0RhdGE7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcEluc3RhbmNlOw0KK0NGV0xfQXJyb3dEYXRhOjp+Q0ZXTF9BcnJvd0RhdGEoKSB7DQorICBpZiAobV9wQ29sb3JEYXRhKSB7DQorICAgIGRlbGV0ZSBtX3BDb2xvckRhdGE7DQorICAgIG1fcENvbG9yRGF0YSA9IE5VTEw7DQorICB9DQogfQ0KLUZYX0JPT0wgQ0ZXTF9BcnJvd0RhdGE6OklzSW5zdGFuY2UoKQ0KLXsNCi0gICAgcmV0dXJuIChtX3BJbnN0YW5jZSAhPSBOVUxMKTsNCi19DQotdm9pZCBDRldMX0Fycm93RGF0YTo6RGVzdHJveUluc3RhbmNlKCkNCi17DQotICAgIGlmIChtX3BJbnN0YW5jZSkgew0KLSAgICAgICAgZGVsZXRlIG1fcEluc3RhbmNlOw0KLSAgICAgICAgbV9wSW5zdGFuY2UgPSBOVUxMOw0KLSAgICB9DQotfQ0KLUNGV0xfQXJyb3dEYXRhOjp+Q0ZXTF9BcnJvd0RhdGEoKQ0KLXsNCi0gICAgaWYgKG1fcENvbG9yRGF0YSkgew0KLSAgICAgICAgZGVsZXRlIG1fcENvbG9yRGF0YTsNCi0gICAgICAgIG1fcENvbG9yRGF0YSA9IE5VTEw7DQotICAgIH0NCi19DQotdm9pZCBDRldMX0Fycm93RGF0YTo6U2V0Q29sb3JEYXRhKEZYX0RXT1JECWR3SUQpDQotew0KLSAgICBpZiAoIW1fcENvbG9yRGF0YSkgew0KLSAgICAgICAgbV9wQ29sb3JEYXRhID0gRlhfTkVXIENDb2xvckRhdGE7DQotICAgIH0NCi0gICAgaWYgKGR3SUQpIHsNCi0gICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyQm9yZGVyWzBdID0gQXJnYkVuY29kZSgyNTUsIDE0MiwgMTUzLCAxMjUpOw0KLSAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJCb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMTU3LCAxNzEsIDExOSk7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAxMTgsIDEzMSwgOTcpOw0KLSAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJCb3JkZXJbM10gPSBBcmdiRW5jb2RlKDI1NSwgMTcyLCAxNjgsIDE1Myk7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsclN0YXJ0WzBdID0gQXJnYkVuY29kZSgyNTUsIDIwMywgMjE1LCAxODYpOw0KLSAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMTgsIDIzMiwgMTg1KTsNCi0gICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjAzLCAyMTUsIDE4Nik7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsclN0YXJ0WzNdID0gQXJnYkVuY29kZSgyNTUsIDI1NCwgMjU0LCAyNTEpOw0KLSAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJFbmRbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMTQ5LCAxNjcsIDExNyk7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsckVuZFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAxOTgsIDIxMSwgMTU1KTsNCi0gICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyRW5kWzJdID0gQXJnYkVuY29kZSgyNTUsIDE0OSwgMTY3LCAxMTcpOw0KLSAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJFbmRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMjQzLCAyNDEsIDIzNik7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsclNpZ25bMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsclNpZ25bMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsclNpZ25bMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsclNpZ25bM10gPSBBcmdiRW5jb2RlKDI1NSwgMTI4LCAxMjgsIDEyOCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDIsIDIxNiwgMjQ5KTsNCi0gICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyQm9yZGVyWzFdID0gQXJnYkVuY29kZSgyNTUsIDE3MSwgMTkwLCAyMzMpOw0KLSAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJCb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMTM1LCAxNDcsIDIxOSk7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclszXSA9IEFyZ2JFbmNvZGUoMjU1LCAxNzIsIDE2OCwgMTUzKTsNCi0gICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjI1LCAyMzQsIDI1NCk7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsclN0YXJ0WzFdID0gQXJnYkVuY29kZSgyNTUsIDI1MywgMjU1LCAyNTUpOw0KLSAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAxMTAsIDE0MiwgMjQxKTsNCi0gICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMjU0LCAyNTQsIDI1MSk7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsckVuZFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAxNzUsIDIwNCwgMjUxKTsNCi0gICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyRW5kWzFdID0gQXJnYkVuY29kZSgyNTUsIDE4NSwgMjE4LCAyNTEpOw0KLSAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJFbmRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjEwLCAyMjIsIDIzNSk7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsckVuZFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDMsIDI0MSwgMjM2KTsNCi0gICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblswXSA9IEFyZ2JFbmNvZGUoMjU1LCA3NywgOTcsIDEzMyk7DQotICAgICAgICBtX3BDb2xvckRhdGEtPmNsclNpZ25bMV0gPSBBcmdiRW5jb2RlKDI1NSwgNzcsIDk3LCAxMzMpOw0KLSAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJTaWduWzJdID0gQXJnYkVuY29kZSgyNTUsIDc3LCA5NywgMTMzKTsNCi0gICAgICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblszXSA9IEFyZ2JFbmNvZGUoMjU1LCAxMjgsIDEyOCwgMTI4KTsNCi0gICAgfQ0KK3ZvaWQgQ0ZXTF9BcnJvd0RhdGE6OlNldENvbG9yRGF0YShGWF9EV09SRCBkd0lEKSB7DQorICBpZiAoIW1fcENvbG9yRGF0YSkgew0KKyAgICBtX3BDb2xvckRhdGEgPSBGWF9ORVcgQ0NvbG9yRGF0YTsNCisgIH0NCisgIGlmIChkd0lEKSB7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyQm9yZGVyWzBdID0gQXJnYkVuY29kZSgyNTUsIDE0MiwgMTUzLCAxMjUpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAxNTcsIDE3MSwgMTE5KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJCb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMTE4LCAxMzEsIDk3KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJCb3JkZXJbM10gPSBBcmdiRW5jb2RlKDI1NSwgMTcyLCAxNjgsIDE1Myk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjAzLCAyMTUsIDE4Nik7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjE4LCAyMzIsIDE4NSk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjAzLCAyMTUsIDE4Nik7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMjU0LCAyNTQsIDI1MSk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyRW5kWzBdID0gQXJnYkVuY29kZSgyNTUsIDE0OSwgMTY3LCAxMTcpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsckVuZFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAxOTgsIDIxMSwgMTU1KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJFbmRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMTQ5LCAxNjcsIDExNyk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyRW5kWzNdID0gQXJnYkVuY29kZSgyNTUsIDI0MywgMjQxLCAyMzYpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsclNpZ25bMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJTaWduWzJdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsclNpZ25bM10gPSBBcmdiRW5jb2RlKDI1NSwgMTI4LCAxMjgsIDEyOCk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDIsIDIxNiwgMjQ5KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJCb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMTcxLCAxOTAsIDIzMyk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyQm9yZGVyWzJdID0gQXJnYkVuY29kZSgyNTUsIDEzNSwgMTQ3LCAyMTkpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclszXSA9IEFyZ2JFbmNvZGUoMjU1LCAxNzIsIDE2OCwgMTUzKTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMjUsIDIzNCwgMjU0KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTMsIDI1NSwgMjU1KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAxMTAsIDE0MiwgMjQxKTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTQsIDI1NCwgMjUxKTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJFbmRbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMTc1LCAyMDQsIDI1MSk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyRW5kWzFdID0gQXJnYkVuY29kZSgyNTUsIDE4NSwgMjE4LCAyNTEpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsckVuZFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMTAsIDIyMiwgMjM1KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJFbmRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMjQzLCAyNDEsIDIzNik7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblswXSA9IEFyZ2JFbmNvZGUoMjU1LCA3NywgOTcsIDEzMyk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblsxXSA9IEFyZ2JFbmNvZGUoMjU1LCA3NywgOTcsIDEzMyk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblsyXSA9IEFyZ2JFbmNvZGUoMjU1LCA3NywgOTcsIDEzMyk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblszXSA9IEFyZ2JFbmNvZGUoMjU1LCAxMjgsIDEyOCwgMTI4KTsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQmFyQ29kZS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmNwcAppbmRleCA3NDVkZGI5Li41YjI2OGFiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmNwcApAQCAtMyw3ICszLDcgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQogLyoNCiAgKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzDQogICoNCkBAIC04MCw3OTQgKzgwLDc5OSBAQAogI2luY2x1ZGUgInBkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmgiDQogI2luY2x1ZGUgInFyY29kZS9CQ19RUkNvZGVSZWFkZXIuaCINCiAjaW5jbHVkZSAicXJjb2RlL0JDX1FSQ29kZVdyaXRlci5oIg0KLUNCQ19Db2RlQmFzZSA6OiBDQkNfQ29kZUJhc2UoKQ0KLXsNCitDQkNfQ29kZUJhc2U6OkNCQ19Db2RlQmFzZSgpIHt9DQorQ0JDX0NvZGVCYXNlOjp+Q0JDX0NvZGVCYXNlKCkge30NCitGWF9CT09MIENCQ19Db2RlQmFzZTo6U2V0Q2hhckVuY29kaW5nKGludDMyX3QgZW5jb2RpbmcpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICByZXR1cm4gbV9wQkNXcml0ZXItPlNldENoYXJFbmNvZGluZyhlbmNvZGluZyk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUNCQ19Db2RlQmFzZSA6OiB+Q0JDX0NvZGVCYXNlKCkNCi17DQorRlhfQk9PTCBDQkNfQ29kZUJhc2U6OlNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCkgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0TW9kdWxlSGVpZ2h0KG1vZHVsZUhlaWdodCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wgQ0JDX0NvZGVCYXNlOjpTZXRDaGFyRW5jb2RpbmcoaW50MzJfdCBlbmNvZGluZykNCi17DQotICAgIGlmIChtX3BCQ1dyaXRlcikgew0KLSAgICAgICAgcmV0dXJuIG1fcEJDV3JpdGVyLT5TZXRDaGFyRW5jb2RpbmcoZW5jb2RpbmcpOw0KLSAgICB9DQorRlhfQk9PTCBDQkNfQ29kZUJhc2U6OlNldE1vZHVsZVdpZHRoKGludDMyX3QgbW9kdWxlV2lkdGgpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICByZXR1cm4gbV9wQkNXcml0ZXItPlNldE1vZHVsZVdpZHRoKG1vZHVsZVdpZHRoKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDQkNfQ29kZUJhc2U6OlNldEhlaWdodChpbnQzMl90IGhlaWdodCkgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0SGVpZ2h0KGhlaWdodCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGVCYXNlOjpTZXRXaWR0aChpbnQzMl90IHdpZHRoKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgcmV0dXJuIG1fcEJDV3JpdGVyLT5TZXRXaWR0aCh3aWR0aCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ0JDX0NvZGVCYXNlOjpTZXRCYWNrZ3JvdW5kQ29sb3IoRlhfQVJHQiBiYWNrZ3JvdW5kQ29sb3IpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICBtX3BCQ1dyaXRlci0+U2V0QmFja2dyb3VuZENvbG9yKGJhY2tncm91bmRDb2xvcik7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX0NvZGVCYXNlOjpTZXRCYXJjb2RlQ29sb3IoRlhfQVJHQiBmb3JlZ3JvdW5kQ29sb3IpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICBtX3BCQ1dyaXRlci0+U2V0QmFyY29kZUNvbG9yKGZvcmVncm91bmRDb2xvcik7DQorICB9DQorfQ0KK0NCQ19PbmVDb2RlOjpDQkNfT25lQ29kZSgpe307DQorQ0JDX09uZUNvZGU6On5DQkNfT25lQ29kZSgpIHt9DQorRlhfQk9PTCBDQkNfT25lQ29kZTo6Q2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIHJldHVybiAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+Q2hlY2tDb250ZW50VmFsaWRpdHkoY29udGVudHMpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfT25lQ29kZTo6RmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgdG1wOw0KKyAgaWYgKG1fcEJDV3JpdGVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIHRtcDsNCisgIH0NCisgIHJldHVybiAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+RmlsdGVyQ29udGVudHMoY29udGVudHMpOw0KK30NCit2b2lkIENCQ19PbmVDb2RlOjpTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgY2hlY2tzdW0pIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0UHJpbnRDaGVja3N1bShjaGVja3N1bSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX09uZUNvZGU6OlNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0RGF0YUxlbmd0aChsZW5ndGgpOw0KKyAgfQ0KK30NCit2b2lkIENCQ19PbmVDb2RlOjpTZXRDYWxDaGVja3N1bShGWF9CT09MIGNhbGMpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0Q2FsY0NoZWNrc3VtKGNhbGMpOw0KKyAgfQ0KK30NCitGWF9CT09MIENCQ19PbmVDb2RlOjpTZXRGb250KENGWF9Gb250KiBjRm9udCkgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIHJldHVybiAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0Rm9udChjRm9udCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ0JDX09uZUNvZGU6OlNldEZvbnRTaXplKEZYX0ZMT0FUIHNpemUpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0Rm9udFNpemUoc2l6ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX09uZUNvZGU6OlNldEZvbnRTdHlsZShpbnQzMl90IHN0eWxlKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldEZvbnRTdHlsZShzdHlsZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX09uZUNvZGU6OlNldEZvbnRDb2xvcihGWF9BUkdCIGNvbG9yKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldEZvbnRDb2xvcihjb2xvcik7DQorICB9DQorfQ0KK0NCQ19Db2RlMzk6OkNCQ19Db2RlMzkoKSB7DQorICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKilGWF9ORVcoQ0JDX09uZWRDb2RlMzlSZWFkZXIpOw0KKyAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopRlhfTkVXKENCQ19PbmVkQ29kZTM5V3JpdGVyKTsNCit9DQorQ0JDX0NvZGUzOTo6Q0JDX0NvZGUzOShGWF9CT09MIHVzaW5nQ2hlY2tEaWdpdCkgew0KKyAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopRlhfTkVXIENCQ19PbmVkQ29kZTM5UmVhZGVyKHVzaW5nQ2hlY2tEaWdpdCk7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKilGWF9ORVcgQ0JDX09uZWRDb2RlMzlXcml0ZXI7DQorfQ0KK0NCQ19Db2RlMzk6OkNCQ19Db2RlMzkoRlhfQk9PTCB1c2luZ0NoZWNrRGlnaXQsIEZYX0JPT0wgZXh0ZW5kZWRNb2RlKSB7DQorICBtX3BCQ1JlYWRlciA9DQorICAgICAgKENCQ19SZWFkZXIqKUZYX05FVyBDQkNfT25lZENvZGUzOVJlYWRlcih1c2luZ0NoZWNrRGlnaXQsIGV4dGVuZGVkTW9kZSk7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKilGWF9ORVcgQ0JDX09uZWRDb2RlMzlXcml0ZXIoZXh0ZW5kZWRNb2RlKTsNCit9DQorQ0JDX0NvZGUzOTo6fkNCQ19Db2RlMzkoKSB7DQorICBpZiAobV9wQkNSZWFkZXIpIHsNCisgICAgZGVsZXRlIChtX3BCQ1JlYWRlcik7DQorICAgIG1fcEJDUmVhZGVyID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDV3JpdGVyKTsNCisgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KKyAgfQ0KK30NCitGWF9CT09MIENCQ19Db2RlMzk6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvbnRlbnRzLklzRW1wdHkoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9DT0RFXzM5Ow0KKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQorICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50cyA9DQorICAgICAgKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQorICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb250ZW50cyA9DQorICAgICAgKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJUZXh0Q29udGVudHMoY29udGVudHMpOw0KKyAgbV9yZW5kZXJDb250ZW50cyA9IHJlbmRlckNvbnRlbnRzOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGZpbHRlcmNvbnRlbnRzLlVURjhFbmNvZGUoKTsNCisgIHVpbnQ4X3QqIGRhdGEgPQ0KKyAgICAgIG1fcEJDV3JpdGVyLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyUmVzdWx0KHJlbmRlckNvbnRlbnRzLCBkYXRhLCBvdXRXaWR0aCwgaXNEZXZpY2UsIGUpOw0KKyAgRlhfRnJlZShkYXRhKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDQkNfQ29kZUJhc2U6OlNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCkNCi17DQotICAgIGlmIChtX3BCQ1dyaXRlcikgew0KLSAgICAgICAgcmV0dXJuIG1fcEJDV3JpdGVyLT5TZXRNb2R1bGVIZWlnaHQobW9kdWxlSGVpZ2h0KTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ0JDX0NvZGUzOTo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29uID0gKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cywgZSk7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCByZW5kZXJDb24sIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19Db2RlMzk6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKSB7DQorICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb24gPSAoKENCQ19PbmVkQ29kZTM5V3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmVuY29kZWRDb250ZW50cyhtX3JlbmRlckNvbnRlbnRzLCBlKTsNCisgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgcmVuZGVyQ29uLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0NvZGUzOTo6RGVjb2RlKHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KKyAgcmV0dXJuIHN0cjsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0NvZGUzOTo6RGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQorICBDQkNfQmluYXJ5Qml0bWFwIGJpdG1hcCgmYmluYXJpemVyKTsNCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN0ciwgc3RyLkdldExlbmd0aCgpKTsNCit9DQorRlhfQk9PTCBDQkNfQ29kZTM5OjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICByZXR1cm4gKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRUZXh0TG9jYXRpb24obG9jYXRpb24pOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENCQ19Db2RlMzk6OlNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgcmV0dXJuICgoQ0JDX09uZWRDb2RlMzlXcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0V2lkZU5hcnJvd1JhdGlvKHJhdGlvKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ0JDX0NvZGFiYXI6OkNCQ19Db2RhYmFyKCkgew0KKyAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopRlhfTkVXKENCQ19PbmVkQ29kYUJhclJlYWRlcik7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKilGWF9ORVcoQ0JDX09uZWRDb2RhQmFyV3JpdGVyKTsNCit9DQorQ0JDX0NvZGFiYXI6On5DQkNfQ29kYWJhcigpIHsNCisgIGlmIChtX3BCQ1JlYWRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDUmVhZGVyKTsNCisgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNXcml0ZXIpOw0KKyAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGFiYXI6OlNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgcmV0dXJuICgoQ0JDX09uZWRDb2RhQmFyV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFN0YXJ0Q2hhcihzdGFydCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGFiYXI6OlNldEVuZENoYXIoRlhfQ0hBUiBlbmQpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICByZXR1cm4gKChDQkNfT25lZENvZGFCYXJXcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0RW5kQ2hhcihlbmQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENCQ19Db2RhYmFyOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pIHsNCisgIHJldHVybiAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRUZXh0TG9jYXRpb24obG9jYXRpb24pOw0KK30NCitGWF9CT09MIENCQ19Db2RhYmFyOjpTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbykgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIHJldHVybiAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRXaWRlTmFycm93UmF0aW8ocmF0aW8pOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENCQ19Db2RhYmFyOjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvbnRlbnRzLklzRW1wdHkoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9DT0RBQkFSOw0KKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQorICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50cyA9DQorICAgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPkZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsNCisgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBmaWx0ZXJjb250ZW50cy5VVEY4RW5jb2RlKCk7DQorICBtX3JlbmRlckNvbnRlbnRzID0gZmlsdGVyY29udGVudHM7DQorICB1aW50OF90KiBkYXRhID0NCisgICAgICBtX3BCQ1dyaXRlci0+RW5jb2RlKGJ5dGVTdHJpbmcsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAtPlJlbmRlclJlc3VsdChmaWx0ZXJjb250ZW50cywgZGF0YSwgb3V0V2lkdGgsIGlzRGV2aWNlLCBlKTsNCisgIEZYX0ZyZWUoZGF0YSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0JDX0NvZGVCYXNlOjpTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKQ0KLXsNCi0gICAgaWYgKG1fcEJDV3JpdGVyKSB7DQotICAgICAgICByZXR1cm4gbV9wQkNXcml0ZXItPlNldE1vZHVsZVdpZHRoKG1vZHVsZVdpZHRoKTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ0JDX0NvZGFiYXI6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29uID0NCisgICAgICAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cyk7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCByZW5kZXJDb24sIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19Db2RhYmFyOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29uID0NCisgICAgICAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cyk7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIHJlbmRlckNvbiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19Db2RhYmFyOjpEZWNvZGUodWludDhfdCogYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfV2lkZVN0cmluZyBzdHI7DQorICByZXR1cm4gc3RyOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfQ29kYWJhcjo6RGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQorICBDQkNfQmluYXJ5Qml0bWFwIGJpdG1hcCgmYmluYXJpemVyKTsNCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN0ciwgc3RyLkdldExlbmd0aCgpKTsNCit9DQorQ0JDX0NvZGUxMjg6OkNCQ19Db2RlMTI4KEJDX1RZUEUgdHlwZSkgew0KKyAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopRlhfTkVXKENCQ19PbmVkQ29kZTEyOFJlYWRlcik7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKilGWF9ORVcgQ0JDX09uZWRDb2RlMTI4V3JpdGVyKHR5cGUpOw0KK30NCitDQkNfQ29kZTEyODo6fkNCQ19Db2RlMTI4KCkgew0KKyAgaWYgKG1fcEJDUmVhZGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNSZWFkZXIpOw0KKyAgICBtX3BCQ1JlYWRlciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgZGVsZXRlIChtX3BCQ1dyaXRlcik7DQorICAgIG1fcEJDV3JpdGVyID0gTlVMTDsNCisgIH0NCit9DQorRlhfQk9PTCBDQkNfQ29kZTEyODo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgcmV0dXJuICgoQ0JDX09uZWRDb2RlMTI4V3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFRleHRMb2NhdGlvbihsb2NhdGlvbik7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGUxMjg6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY29udGVudHMuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vQ29udGVudHM7DQogICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEJDRk9STUFUIGZvcm1hdCA9IEJDRk9STUFUX0NPREVfMTI4Ow0KKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQorICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyBjb250ZW50ID0gY29udGVudHM7DQorICBpZiAoY29udGVudHMuR2V0TGVuZ3RoKCkgJSAyICYmDQorICAgICAgKChDQkNfT25lZENvZGUxMjhXcml0ZXIqKW1fcEJDV3JpdGVyKS0+R2V0VHlwZSgpID09IEJDX0NPREUxMjhfQykgew0KKyAgICBjb250ZW50ICs9ICcwJzsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0NCisgICAgICAoKENCQ19PbmVkQ29kZTEyOFdyaXRlciopbV9wQkNXcml0ZXIpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50KTsNCisgIG1fcmVuZGVyQ29udGVudHMgPSBlbmNvZGVDb250ZW50czsNCisgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7DQorICB1aW50OF90KiBkYXRhID0NCisgICAgICBtX3BCQ1dyaXRlci0+RW5jb2RlKGJ5dGVTdHJpbmcsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAtPlJlbmRlclJlc3VsdChlbmNvZGVDb250ZW50cywgZGF0YSwgb3V0V2lkdGgsIGlzRGV2aWNlLCBlKTsNCisgIEZYX0ZyZWUoZGF0YSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0JDX0NvZGVCYXNlOjpTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpDQotew0KLSAgICBpZiAobV9wQkNXcml0ZXIpIHsNCi0gICAgICAgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0SGVpZ2h0KGhlaWdodCk7DQorRlhfQk9PTCBDQkNfQ29kZTEyODo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCBtX3JlbmRlckNvbnRlbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQkNfQ29kZTEyODo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIHsNCisgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgbV9yZW5kZXJDb250ZW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19Db2RlMTI4OjpEZWNvZGUodWludDhfdCogYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfV2lkZVN0cmluZyBzdHI7DQorICByZXR1cm4gc3RyOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfQ29kZTEyODo6RGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQorICBDQkNfQmluYXJ5Qml0bWFwIGJpdG1hcCgmYmluYXJpemVyKTsNCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN0ciwgc3RyLkdldExlbmd0aCgpKTsNCit9DQorQ0JDX0VBTjg6OkNCQ19FQU44KCkgew0KKyAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopRlhfTkVXKENCQ19PbmVkRUFOOFJlYWRlcik7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKilGWF9ORVcoQ0JDX09uZWRFQU44V3JpdGVyKTsNCit9DQorQ0JDX0VBTjg6On5DQkNfRUFOOCgpIHsNCisgIGlmIChtX3BCQ1JlYWRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDUmVhZGVyKTsNCisgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNXcml0ZXIpOw0KKyAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQorICB9DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19FQU44OjpQcmVwcm9jZXNzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0NCisgICAgICAoKENCQ19PbmVkRUFOOFdyaXRlciopbV9wQkNXcml0ZXIpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQorICBpbnQzMl90IGxlbmd0aCA9IGVuY29kZUNvbnRlbnRzLkdldExlbmd0aCgpOw0KKyAgaWYgKGxlbmd0aCA8PSA3KSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDcgLSBsZW5ndGg7IGkrKykgew0KKyAgICAgIGVuY29kZUNvbnRlbnRzID0gRlhfV0NIQVIoJzAnKSArIGVuY29kZUNvbnRlbnRzOw0KICAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDQkNfQ29kZUJhc2U6OlNldFdpZHRoKGludDMyX3Qgd2lkdGgpDQotew0KLSAgICBpZiAobV9wQkNXcml0ZXIpIHsNCi0gICAgICAgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0V2lkdGgod2lkdGgpOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotdm9pZCBDQkNfQ29kZUJhc2U6OlNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcikNCi17DQotICAgIGlmIChtX3BCQ1dyaXRlcikgew0KLSAgICAgICAgbV9wQkNXcml0ZXItPlNldEJhY2tncm91bmRDb2xvcihiYWNrZ3JvdW5kQ29sb3IpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0JDX0NvZGVCYXNlOjpTZXRCYXJjb2RlQ29sb3IoRlhfQVJHQiBmb3JlZ3JvdW5kQ29sb3IpDQotew0KLSAgICBpZiAobV9wQkNXcml0ZXIpIHsNCi0gICAgICAgIG1fcEJDV3JpdGVyLT5TZXRCYXJjb2RlQ29sb3IoZm9yZWdyb3VuZENvbG9yKTsNCi0gICAgfQ0KLX0NCi1DQkNfT25lQ29kZTo6Q0JDX09uZUNvZGUoKQ0KLXsNCi19Ow0KLUNCQ19PbmVDb2RlOjp+Q0JDX09uZUNvZGUoKQ0KLXsNCi19DQotRlhfQk9PTCBDQkNfT25lQ29kZTo6Q2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykNCi17DQotICAgIGlmIChtX3BCQ1dyaXRlcikgew0KLSAgICAgICAgcmV0dXJuICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5DaGVja0NvbnRlbnRWYWxpZGl0eShjb250ZW50cyk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1DRlhfV2lkZVN0cmluZyBDQkNfT25lQ29kZTo6RmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHRtcDsNCi0gICAgaWYgKG1fcEJDV3JpdGVyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiB0bXA7DQotICAgIH0NCi0gICAgcmV0dXJuICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQotfQ0KLXZvaWQgQ0JDX09uZUNvZGU6OlNldFByaW50Q2hlY2tzdW0oRlhfQk9PTCBjaGVja3N1bSkNCi17DQotICAgIGlmIChtX3BCQ1dyaXRlcikgew0KLSAgICAgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFByaW50Q2hlY2tzdW0oY2hlY2tzdW0pOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0JDX09uZUNvZGU6OlNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpDQotew0KLSAgICBpZiAobV9wQkNXcml0ZXIpIHsNCi0gICAgICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXREYXRhTGVuZ3RoKGxlbmd0aCk7DQotICAgIH0NCi19DQotdm9pZCBDQkNfT25lQ29kZTo6U2V0Q2FsQ2hlY2tzdW0oRlhfQk9PTCBjYWxjKQ0KLXsNCi0gICAgaWYgKG1fcEJDV3JpdGVyKSB7DQotICAgICAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0Q2FsY0NoZWNrc3VtKGNhbGMpOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ0JDX09uZUNvZGU6OlNldEZvbnQoQ0ZYX0ZvbnQqIGNGb250KQ0KLXsNCi0gICAgaWYgKG1fcEJDV3JpdGVyKSB7DQotICAgICAgICByZXR1cm4gKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldEZvbnQoY0ZvbnQpOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotdm9pZCBDQkNfT25lQ29kZTo6U2V0Rm9udFNpemUoRlhfRkxPQVQgc2l6ZSkNCi17DQotICAgIGlmIChtX3BCQ1dyaXRlcikgew0KLSAgICAgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldEZvbnRTaXplKHNpemUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0JDX09uZUNvZGU6OlNldEZvbnRTdHlsZShpbnQzMl90IHN0eWxlKQ0KLXsNCi0gICAgaWYgKG1fcEJDV3JpdGVyKSB7DQotICAgICAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0Rm9udFN0eWxlKHN0eWxlKTsNCi0gICAgfQ0KLX0NCi12b2lkIENCQ19PbmVDb2RlOjpTZXRGb250Q29sb3IoRlhfQVJHQiBjb2xvcikNCi17DQotICAgIGlmIChtX3BCQ1dyaXRlcikgew0KLSAgICAgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldEZvbnRDb2xvcihjb2xvcik7DQotICAgIH0NCi19DQotQ0JDX0NvZGUzOTo6Q0JDX0NvZGUzOSgpDQotew0KLSAgICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKikgRlhfTkVXIChDQkNfT25lZENvZGUzOVJlYWRlcik7DQotICAgIG1fcEJDV3JpdGVyID0gKENCQ19Xcml0ZXIqKSBGWF9ORVcgKENCQ19PbmVkQ29kZTM5V3JpdGVyKTsNCi19DQotQ0JDX0NvZGUzOTo6Q0JDX0NvZGUzOShGWF9CT09MIHVzaW5nQ2hlY2tEaWdpdCkNCi17DQotICAgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKSBGWF9ORVcgQ0JDX09uZWRDb2RlMzlSZWFkZXIodXNpbmdDaGVja0RpZ2l0KTsNCi0gICAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopIEZYX05FVyBDQkNfT25lZENvZGUzOVdyaXRlcjsNCi19DQotQ0JDX0NvZGUzOTo6Q0JDX0NvZGUzOShGWF9CT09MIHVzaW5nQ2hlY2tEaWdpdCwgRlhfQk9PTCBleHRlbmRlZE1vZGUpDQotew0KLSAgICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKikgRlhfTkVXIENCQ19PbmVkQ29kZTM5UmVhZGVyKHVzaW5nQ2hlY2tEaWdpdCwgZXh0ZW5kZWRNb2RlKTsNCi0gICAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopIEZYX05FVyBDQkNfT25lZENvZGUzOVdyaXRlcihleHRlbmRlZE1vZGUpOw0KLX0NCi1DQkNfQ29kZTM5Ojp+Q0JDX0NvZGUzOSgpDQotew0KLSAgICBpZihtX3BCQ1JlYWRlcikgew0KLSAgICAgICAgZGVsZXRlKG1fcEJDUmVhZGVyKTsNCi0gICAgICAgIG1fcEJDUmVhZGVyID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZihtX3BCQ1dyaXRlcikgew0KLSAgICAgICAgZGVsZXRlKG1fcEJDV3JpdGVyKTsNCi0gICAgICAgIG1fcEJDV3JpdGVyID0gTlVMTDsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENCQ19Db2RlMzk6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYoY29udGVudHMuSXNFbXB0eSgpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEJDRk9STUFUIGZvcm1hdAk9IEJDRk9STUFUX0NPREVfMzk7DQotICAgIGludDMyX3Qgb3V0V2lkdGggPSAwOw0KLSAgICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzID0gKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQotICAgIENGWF9XaWRlU3RyaW5nIHJlbmRlckNvbnRlbnRzID0gKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJUZXh0Q29udGVudHMoY29udGVudHMpOw0KLSAgICBtX3JlbmRlckNvbnRlbnRzID0gcmVuZGVyQ29udGVudHM7DQotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSAgZmlsdGVyY29udGVudHMuVVRGOEVuY29kZSgpOw0KLSAgICB1aW50OF90ICpkYXRhID0gbV9wQkNXcml0ZXItPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyUmVzdWx0KHJlbmRlckNvbnRlbnRzLCBkYXRhLCBvdXRXaWR0aCwgaXNEZXZpY2UsIGUpOw0KLSAgICBGWF9GcmVlKGRhdGEpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTAlDQkNfQ29kZTM5OjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb24gPSAoKENCQ19PbmVkQ29kZTM5V3JpdGVyKiltX3BCQ1dyaXRlciktPmVuY29kZWRDb250ZW50cyhtX3JlbmRlckNvbnRlbnRzLCBlKTsNCi0gICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdGlyeCwgcmVuZGVyQ29uLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0JDX0NvZGUzOTo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb24gPSAoKENCQ19PbmVkQ29kZTM5V3JpdGVyKiltX3BCQ1dyaXRlciktPmVuY29kZWRDb250ZW50cyhtX3JlbmRlckNvbnRlbnRzLCBlKTsNCi0gICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCByZW5kZXJDb24sIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX0NvZGUzOTo6RGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsNCi0gICAgcmV0dXJuIHN0cjsNCi19DQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX0NvZGUzOTo6RGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCi0gICAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQotICAgIENCQ19CaW5hcnlCaXRtYXAgIGJpdG1hcCgmYmluYXJpemVyKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gbV9wQkNSZWFkZXItPkRlY29kZSgmYml0bWFwLCAwLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN0ciwgc3RyLkdldExlbmd0aCgpKTsNCi19DQotRlhfQk9PTCBDQkNfQ29kZTM5OjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pDQotew0KLSAgICBpZiAobV9wQkNXcml0ZXIpIHsNCi0gICAgICAgIHJldHVybiAoKENCQ19PbmVkQ29kZTM5V3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFRleHRMb2NhdGlvbihsb2NhdGlvbik7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENCQ19Db2RlMzk6OlNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKQ0KLXsNCi0gICAgaWYgKG1fcEJDV3JpdGVyKSB7DQotICAgICAgICByZXR1cm4gKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRXaWRlTmFycm93UmF0aW8ocmF0aW8pOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotQ0JDX0NvZGFiYXI6OkNCQ19Db2RhYmFyKCkNCi17DQotICAgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKSBGWF9ORVcgKENCQ19PbmVkQ29kYUJhclJlYWRlcik7DQotICAgIG1fcEJDV3JpdGVyID0gKENCQ19Xcml0ZXIqKSBGWF9ORVcgKENCQ19PbmVkQ29kYUJhcldyaXRlcik7DQotfQ0KLUNCQ19Db2RhYmFyOjp+Q0JDX0NvZGFiYXIoKQ0KLXsNCi0gICAgaWYobV9wQkNSZWFkZXIpIHsNCi0gICAgICAgIGRlbGV0ZShtX3BCQ1JlYWRlcik7DQotICAgICAgICBtX3BCQ1JlYWRlciA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYobV9wQkNXcml0ZXIpIHsNCi0gICAgICAgIGRlbGV0ZShtX3BCQ1dyaXRlcik7DQotICAgICAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQotICAgIH0NCi19DQotRlhfQk9PTCBDQkNfQ29kYWJhcjo6U2V0U3RhcnRDaGFyKEZYX0NIQVIgc3RhcnQpDQotew0KLSAgICBpZiAobV9wQkNXcml0ZXIpIHsNCi0gICAgICAgIHJldHVybiAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRTdGFydENoYXIoc3RhcnQpOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDQkNfQ29kYWJhcjo6U2V0RW5kQ2hhcihGWF9DSEFSIGVuZCkNCi17DQotICAgIGlmIChtX3BCQ1dyaXRlcikgew0KLSAgICAgICAgcmV0dXJuICgoQ0JDX09uZWRDb2RhQmFyV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldEVuZENoYXIoZW5kKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ0JDX0NvZGFiYXI6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikNCi17DQotICAgIHJldHVybiAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopIG1fcEJDV3JpdGVyKS0+U2V0VGV4dExvY2F0aW9uKGxvY2F0aW9uKTsNCi19DQotRlhfQk9PTCBDQkNfQ29kYWJhcjo6U2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pDQotew0KLSAgICBpZiAobV9wQkNXcml0ZXIpIHsNCi0gICAgICAgIHJldHVybiAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopIG1fcEJDV3JpdGVyKS0+U2V0V2lkZU5hcnJvd1JhdGlvKHJhdGlvKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ0JDX0NvZGFiYXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYoY29udGVudHMuSXNFbXB0eSgpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEJDRk9STUFUIGZvcm1hdAk9IEJDRk9STUFUX0NPREFCQVI7DQotICAgIGludDMyX3Qgb3V0V2lkdGggPSAwOw0KLSAgICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzID0gKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPkZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGZpbHRlcmNvbnRlbnRzLlVURjhFbmNvZGUoKTsNCi0gICAgbV9yZW5kZXJDb250ZW50cyA9IGZpbHRlcmNvbnRlbnRzOw0KLSAgICB1aW50OF90ICpkYXRhID0gbV9wQkNXcml0ZXItPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyUmVzdWx0KGZpbHRlcmNvbnRlbnRzLCBkYXRhLCBvdXRXaWR0aCwgaXNEZXZpY2UsIGUpOw0KLSAgICBGWF9GcmVlKGRhdGEpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTAlDQkNfQ29kYWJhcjo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29uID0gKChDQkNfT25lZENvZGFCYXJXcml0ZXIqKW1fcEJDV3JpdGVyKS0+ZW5jb2RlZENvbnRlbnRzKG1fcmVuZGVyQ29udGVudHMpOw0KLSAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCByZW5kZXJDb24sIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTAlDQkNfQ29kYWJhcjo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb24gPSAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cyk7DQotICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgcmVuZGVyQ29uLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19Db2RhYmFyOjpEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KLSAgICByZXR1cm4gc3RyOw0KLX0NCi1DRlhfV2lkZVN0cmluZyBDQkNfQ29kYWJhcjo6RGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCi0gICAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQotICAgIENCQ19CaW5hcnlCaXRtYXAgIGJpdG1hcCgmYmluYXJpemVyKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gbV9wQkNSZWFkZXItPkRlY29kZSgmYml0bWFwLCAwLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN0ciwgc3RyLkdldExlbmd0aCgpKTsNCi19DQotQ0JDX0NvZGUxMjg6OkNCQ19Db2RlMTI4KEJDX1RZUEUgdHlwZSkNCi17DQotICAgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIgKikgRlhfTkVXIChDQkNfT25lZENvZGUxMjhSZWFkZXIpOw0KLSAgICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyICopIEZYX05FVyBDQkNfT25lZENvZGUxMjhXcml0ZXIodHlwZSk7DQotfQ0KLUNCQ19Db2RlMTI4Ojp+Q0JDX0NvZGUxMjgoKQ0KLXsNCi0gICAgaWYobV9wQkNSZWFkZXIpIHsNCi0gICAgICAgIGRlbGV0ZShtX3BCQ1JlYWRlcik7DQotICAgICAgICBtX3BCQ1JlYWRlciA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYobV9wQkNXcml0ZXIpIHsNCi0gICAgICAgIGRlbGV0ZShtX3BCQ1dyaXRlcik7DQotICAgICAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQotICAgIH0NCi19DQotRlhfQk9PTCBDQkNfQ29kZTEyODo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKQ0KLXsNCi0gICAgaWYgKG1fcEJDV3JpdGVyKSB7DQotICAgICAgICByZXR1cm4gKCggQ0JDX09uZWRDb2RlMTI4V3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFRleHRMb2NhdGlvbihsb2NhdGlvbik7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENCQ19Db2RlMTI4OjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKGNvbnRlbnRzLklzRW1wdHkoKSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm9Db250ZW50czsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBCQ0ZPUk1BVCBmb3JtYXQJPSBCQ0ZPUk1BVF9DT0RFXzEyODsNCi0gICAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQotICAgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgY29udGVudCA9IGNvbnRlbnRzOw0KLSAgICBpZiAoY29udGVudHMuR2V0TGVuZ3RoKCkgJSAyICYmICgoQ0JDX09uZWRDb2RlMTI4V3JpdGVyICopbV9wQkNXcml0ZXIpLT5HZXRUeXBlKCkgPT0gQkNfQ09ERTEyOF9DKSB7DQotICAgICAgICBjb250ZW50ICs9ICcwJzsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9ICgoQ0JDX09uZWRDb2RlMTI4V3JpdGVyKiltX3BCQ1dyaXRlciktPkZpbHRlckNvbnRlbnRzKGNvbnRlbnQpOw0KLSAgICBtX3JlbmRlckNvbnRlbnRzID0gZW5jb2RlQ29udGVudHM7DQogICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7DQotICAgIHVpbnQ4X3QgKmRhdGEgPSBtX3BCQ1dyaXRlci0+RW5jb2RlKGJ5dGVTdHJpbmcsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQotICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJSZXN1bHQoZW5jb2RlQ29udGVudHMsIGRhdGEsIG91dFdpZHRoLCBpc0RldmljZSwgZSk7DQotICAgIEZYX0ZyZWUoZGF0YSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQotICAgIHJldHVybiBUUlVFOw0KKyAgICBpbnQzMl90IGNoZWNrc3VtID0NCisgICAgICAgICgoQ0JDX09uZWRFQU44V3JpdGVyKiltX3BCQ1dyaXRlciktPkNhbGNDaGVja3N1bShieXRlU3RyaW5nKTsNCisgICAgZW5jb2RlQ29udGVudHMgKz0gRlhfV0NIQVIoY2hlY2tzdW0gLSAwICsgJzAnKTsNCisgIH0NCisgIGlmIChsZW5ndGggPiA4KSB7DQorICAgIGVuY29kZUNvbnRlbnRzID0gZW5jb2RlQ29udGVudHMuTWlkKDAsIDgpOw0KKyAgfQ0KKyAgcmV0dXJuIGVuY29kZUNvbnRlbnRzOw0KIH0NCi1GWF9CT09MCUNCQ19Db2RlMTI4OjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIGludDMyX3QgJmUpDQotew0KLSAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCBtX3JlbmRlckNvbnRlbnRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDQkNfRUFOODo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjb250ZW50cy5Jc0VtcHR5KCkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTm9Db250ZW50czsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQkNGT1JNQVQgZm9ybWF0ID0gQkNGT1JNQVRfRUFOXzg7DQorICBpbnQzMl90IG91dFdpZHRoID0gMDsNCisgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0gUHJlcHJvY2Vzcyhjb250ZW50cyk7DQorICBDRlhfQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZW5jb2RlQ29udGVudHMuVVRGOEVuY29kZSgpOw0KKyAgbV9yZW5kZXJDb250ZW50cyA9IGVuY29kZUNvbnRlbnRzOw0KKyAgdWludDhfdCogZGF0YSA9DQorICAgICAgbV9wQkNXcml0ZXItPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgLT5SZW5kZXJSZXN1bHQoZW5jb2RlQ29udGVudHMsIGRhdGEsIG91dFdpZHRoLCBpc0RldmljZSwgZSk7DQorICBGWF9GcmVlKGRhdGEpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MCUNCQ19Db2RlMTI4OjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgaW50MzJfdCAmZSkNCi17DQotICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgbV9yZW5kZXJDb250ZW50cywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0JDX0VBTjg6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAtPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdGlyeCwgbV9yZW5kZXJDb250ZW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19Db2RlMTI4OjpEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KLSAgICByZXR1cm4gc3RyOw0KK0ZYX0JPT0wgQ0JDX0VBTjg6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKSB7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIG1fcmVuZGVyQ29udGVudHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDQkNfQ29kZTEyODo6RGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCi0gICAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQotICAgIENCQ19CaW5hcnlCaXRtYXAgIGJpdG1hcCgmYmluYXJpemVyKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gbV9wQkNSZWFkZXItPkRlY29kZSgmYml0bWFwLCAwLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN0ciwgc3RyLkdldExlbmd0aCgpKTsNCitDRlhfV2lkZVN0cmluZyBDQkNfRUFOODo6RGVjb2RlKHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KKyAgcmV0dXJuIHN0cjsNCiB9DQotQ0JDX0VBTjg6OkNCQ19FQU44KCkNCi17DQotICAgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKSBGWF9ORVcgKENCQ19PbmVkRUFOOFJlYWRlcik7DQotICAgIG1fcEJDV3JpdGVyID0gKENCQ19Xcml0ZXIqKSBGWF9ORVcgKENCQ19PbmVkRUFOOFdyaXRlcik7DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VBTjg6OkRlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpIHsNCisgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCisgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgYmluYXJpemVyKCZzb3VyY2UpOw0KKyAgQ0JDX0JpbmFyeUJpdG1hcCBiaXRtYXAoJmJpbmFyaXplcik7DQorICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzdHIsIHN0ci5HZXRMZW5ndGgoKSk7DQogfQ0KLUNCQ19FQU44Ojp+Q0JDX0VBTjgoKQ0KLXsNCi0gICAgaWYobV9wQkNSZWFkZXIpIHsNCi0gICAgICAgIGRlbGV0ZShtX3BCQ1JlYWRlcik7DQotICAgICAgICBtX3BCQ1JlYWRlciA9IE5VTEw7DQorQ0JDX0VBTjEzOjpDQkNfRUFOMTMoKSB7DQorICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKilGWF9ORVcoQ0JDX09uZWRFQU4xM1JlYWRlcik7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKilGWF9ORVcoQ0JDX09uZWRFQU4xM1dyaXRlcik7DQorfQ0KK0NCQ19FQU4xMzo6fkNCQ19FQU4xMygpIHsNCisgIGlmIChtX3BCQ1JlYWRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDUmVhZGVyKTsNCisgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNXcml0ZXIpOw0KKyAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQorICB9DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19FQU4xMzo6UHJlcHJvY2Vzcyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9DQorICAgICAgKChDQkNfT25lZEVBTjhXcml0ZXIqKW1fcEJDV3JpdGVyKS0+RmlsdGVyQ29udGVudHMoY29udGVudHMpOw0KKyAgaW50MzJfdCBsZW5ndGggPSBlbmNvZGVDb250ZW50cy5HZXRMZW5ndGgoKTsNCisgIGlmIChsZW5ndGggPD0gMTIpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTIgLSBsZW5ndGg7IGkrKykgew0KKyAgICAgIGVuY29kZUNvbnRlbnRzID0gRlhfV0NIQVIoJzAnKSArIGVuY29kZUNvbnRlbnRzOw0KICAgICB9DQotICAgIGlmKG1fcEJDV3JpdGVyKSB7DQotICAgICAgICBkZWxldGUobV9wQkNXcml0ZXIpOw0KLSAgICAgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KLSAgICB9DQotfQ0KLUNGWF9XaWRlU3RyaW5nCUNCQ19FQU44OjpQcmVwcm9jZXNzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9ICgoQ0JDX09uZWRFQU44V3JpdGVyKiltX3BCQ1dyaXRlciktPkZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsNCi0gICAgaW50MzJfdCBsZW5ndGggPSBlbmNvZGVDb250ZW50cy5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGxlbmd0aCA8PSA3KSB7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA3IC0gbGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBlbmNvZGVDb250ZW50cyA9IEZYX1dDSEFSKCcwJykgKyBlbmNvZGVDb250ZW50czsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7DQotICAgICAgICBpbnQzMl90IGNoZWNrc3VtID0gKChDQkNfT25lZEVBTjhXcml0ZXIgKiltX3BCQ1dyaXRlciktPkNhbGNDaGVja3N1bShieXRlU3RyaW5nKTsNCi0gICAgICAgIGVuY29kZUNvbnRlbnRzICs9IEZYX1dDSEFSKGNoZWNrc3VtIC0gMCArICcwJyk7DQotICAgIH0NCi0gICAgaWYgKGxlbmd0aCA+IDgpIHsNCi0gICAgICAgIGVuY29kZUNvbnRlbnRzID0gZW5jb2RlQ29udGVudHMuTWlkKDAsIDgpOw0KLSAgICB9DQotICAgIHJldHVybiBlbmNvZGVDb250ZW50czsNCi19DQotRlhfQk9PTCBDQkNfRUFOODo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihjb250ZW50cy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vQ29udGVudHM7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQkNGT1JNQVQgZm9ybWF0CT0gQkNGT1JNQVRfRUFOXzg7DQotICAgIGludDMyX3Qgb3V0V2lkdGggPSAwOw0KLSAgICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0gUHJlcHJvY2Vzcyhjb250ZW50cyk7DQogICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7DQotICAgIG1fcmVuZGVyQ29udGVudHMgPSBlbmNvZGVDb250ZW50czsNCi0gICAgdWludDhfdCAqZGF0YSA9IG1fcEJDV3JpdGVyLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCi0gICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlclJlc3VsdChlbmNvZGVDb250ZW50cywgZGF0YSwgb3V0V2lkdGgsIGlzRGV2aWNlLCBlKTsNCi0gICAgRlhfRnJlZShkYXRhKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIGludDMyX3QgY2hlY2tzdW0gPQ0KKyAgICAgICAgKChDQkNfT25lZEVBTjEzV3JpdGVyKiltX3BCQ1dyaXRlciktPkNhbGNDaGVja3N1bShieXRlU3RyaW5nKTsNCisgICAgYnl0ZVN0cmluZyArPSBjaGVja3N1bSAtIDAgKyAnMCc7DQorICAgIGVuY29kZUNvbnRlbnRzID0gYnl0ZVN0cmluZy5VVEY4RGVjb2RlKCk7DQorICB9DQorICBpZiAobGVuZ3RoID4gMTMpIHsNCisgICAgZW5jb2RlQ29udGVudHMgPSBlbmNvZGVDb250ZW50cy5NaWQoMCwgMTMpOw0KKyAgfQ0KKyAgcmV0dXJuIGVuY29kZUNvbnRlbnRzOw0KIH0NCi1GWF9CT09MCUNCQ19FQU44OjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIGludDMyX3QgJmUpDQotew0KLSAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCBtX3JlbmRlckNvbnRlbnRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDQkNfRUFOMTM6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjb250ZW50cy5Jc0VtcHR5KCkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTm9Db250ZW50czsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQkNGT1JNQVQgZm9ybWF0ID0gQkNGT1JNQVRfRUFOXzEzOw0KKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQorICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9IFByZXByb2Nlc3MoY29udGVudHMpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGVuY29kZUNvbnRlbnRzLlVURjhFbmNvZGUoKTsNCisgIG1fcmVuZGVyQ29udGVudHMgPSBlbmNvZGVDb250ZW50czsNCisgIHVpbnQ4X3QqIGRhdGEgPQ0KKyAgICAgIG1fcEJDV3JpdGVyLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyUmVzdWx0KGVuY29kZUNvbnRlbnRzLCBkYXRhLCBvdXRXaWR0aCwgaXNEZXZpY2UsIGUpOw0KKyAgRlhfRnJlZShkYXRhKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAlDQkNfRUFOODo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIGludDMyX3QgJmUpDQotew0KLSAgICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIG1fcmVuZGVyQ29udGVudHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENCQ19FQU4xMzo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgLT5SZW5kZXJEZXZpY2VSZXN1bHQoZGV2aWNlLCBtYXRpcngsIG1fcmVuZGVyQ29udGVudHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDQkNfRUFOODo6RGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsNCi0gICAgcmV0dXJuIHN0cjsNCitGWF9CT09MIENCQ19FQU4xMzo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIHsNCisgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgbV9yZW5kZXJDb250ZW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19FQU44OjpEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KLSAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCi0gICAgQ0JDX0JpbmFyeUJpdG1hcCAgYml0bWFwKCZiaW5hcml6ZXIpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3RyLCBzdHIuR2V0TGVuZ3RoKCkpOw0KK0NGWF9XaWRlU3RyaW5nIENCQ19FQU4xMzo6RGVjb2RlKHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KKyAgcmV0dXJuIHN0cjsNCiB9DQotQ0JDX0VBTjEzOjpDQkNfRUFOMTMoKQ0KLXsNCi0gICAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopIEZYX05FVyAoQ0JDX09uZWRFQU4xM1JlYWRlcik7DQotICAgIG1fcEJDV3JpdGVyID0gKENCQ19Xcml0ZXIqKSBGWF9ORVcgKENCQ19PbmVkRUFOMTNXcml0ZXIpOw0KK0NGWF9XaWRlU3RyaW5nIENCQ19FQU4xMzo6RGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQorICBDQkNfQmluYXJ5Qml0bWFwIGJpdG1hcCgmYmluYXJpemVyKTsNCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN0ciwgc3RyLkdldExlbmd0aCgpKTsNCiB9DQotQ0JDX0VBTjEzOjp+Q0JDX0VBTjEzKCkNCi17DQotICAgIGlmKG1fcEJDUmVhZGVyKSB7DQotICAgICAgICBkZWxldGUobV9wQkNSZWFkZXIpOw0KLSAgICAgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KK0NCQ19VUENBOjpDQkNfVVBDQSgpIHsNCisgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKUZYX05FVyhDQkNfT25lZFVQQ0FSZWFkZXIpOw0KKyAgKChDQkNfT25lZFVQQ0FSZWFkZXIqKW1fcEJDUmVhZGVyKS0+SW5pdCgpOw0KKyAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopRlhfTkVXKENCQ19PbmVkVVBDQVdyaXRlcik7DQorfQ0KK0NCQ19VUENBOjp+Q0JDX1VQQ0EoKSB7DQorICBpZiAobV9wQkNSZWFkZXIpIHsNCisgICAgZGVsZXRlIChtX3BCQ1JlYWRlcik7DQorICAgIG1fcEJDUmVhZGVyID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDV3JpdGVyKTsNCisgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KKyAgfQ0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfVVBDQTo6UHJlcHJvY2Vzcyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9DQorICAgICAgKChDQkNfT25lZEVBTjhXcml0ZXIqKW1fcEJDV3JpdGVyKS0+RmlsdGVyQ29udGVudHMoY29udGVudHMpOw0KKyAgaW50MzJfdCBsZW5ndGggPSBlbmNvZGVDb250ZW50cy5HZXRMZW5ndGgoKTsNCisgIGlmIChsZW5ndGggPD0gMTEpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTEgLSBsZW5ndGg7IGkrKykgew0KKyAgICAgIGVuY29kZUNvbnRlbnRzID0gRlhfV0NIQVIoJzAnKSArIGVuY29kZUNvbnRlbnRzOw0KICAgICB9DQotICAgIGlmKG1fcEJDV3JpdGVyKSB7DQotICAgICAgICBkZWxldGUobV9wQkNXcml0ZXIpOw0KLSAgICAgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KLSAgICB9DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19FQU4xMzo6UHJlcHJvY2Vzcyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPSAoKENCQ19PbmVkRUFOOFdyaXRlciopbV9wQkNXcml0ZXIpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQotICAgIGludDMyX3QgbGVuZ3RoID0gZW5jb2RlQ29udGVudHMuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChsZW5ndGggPD0gMTIpIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDEyIC0gbGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBlbmNvZGVDb250ZW50cyA9IEZYX1dDSEFSKCcwJykgKyBlbmNvZGVDb250ZW50czsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7DQotICAgICAgICBpbnQzMl90IGNoZWNrc3VtID0gKChDQkNfT25lZEVBTjEzV3JpdGVyICopbV9wQkNXcml0ZXIpLT5DYWxjQ2hlY2tzdW0oYnl0ZVN0cmluZyk7DQotICAgICAgICBieXRlU3RyaW5nICs9IGNoZWNrc3VtIC0gMCArICcwJzsNCi0gICAgICAgIGVuY29kZUNvbnRlbnRzID0gYnl0ZVN0cmluZy5VVEY4RGVjb2RlKCk7DQotICAgIH0NCi0gICAgaWYgKGxlbmd0aCA+IDEzKSB7DQotICAgICAgICBlbmNvZGVDb250ZW50cyA9IGVuY29kZUNvbnRlbnRzLk1pZCgwLCAxMyk7DQotICAgIH0NCi0gICAgcmV0dXJuIGVuY29kZUNvbnRlbnRzOw0KLX0NCi1GWF9CT09MIENCQ19FQU4xMzo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihjb250ZW50cy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vQ29udGVudHM7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQkNGT1JNQVQgZm9ybWF0CT0gQkNGT1JNQVRfRUFOXzEzOw0KLSAgICBpbnQzMl90IG91dFdpZHRoID0gMDsNCi0gICAgaW50MzJfdCBvdXRIZWlnaHQgPSAwOw0KLSAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9IFByZXByb2Nlc3MoY29udGVudHMpOw0KICAgICBDRlhfQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZW5jb2RlQ29udGVudHMuVVRGOEVuY29kZSgpOw0KLSAgICBtX3JlbmRlckNvbnRlbnRzID0gZW5jb2RlQ29udGVudHM7DQotICAgIHVpbnQ4X3QgKmRhdGEgPSBtX3BCQ1dyaXRlci0+RW5jb2RlKGJ5dGVTdHJpbmcsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQotICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJSZXN1bHQoZW5jb2RlQ29udGVudHMsIGRhdGEsIG91dFdpZHRoLCBpc0RldmljZSwgZSk7DQotICAgIEZYX0ZyZWUoZGF0YSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQotICAgIHJldHVybiBUUlVFOw0KKyAgICBpbnQzMl90IGNoZWNrc3VtID0NCisgICAgICAgICgoQ0JDX09uZWRVUENBV3JpdGVyKiltX3BCQ1dyaXRlciktPkNhbGNDaGVja3N1bShieXRlU3RyaW5nKTsNCisgICAgYnl0ZVN0cmluZyArPSBjaGVja3N1bSAtIDAgKyAnMCc7DQorICAgIGVuY29kZUNvbnRlbnRzID0gYnl0ZVN0cmluZy5VVEY4RGVjb2RlKCk7DQorICB9DQorICBpZiAobGVuZ3RoID4gMTIpIHsNCisgICAgZW5jb2RlQ29udGVudHMgPSBlbmNvZGVDb250ZW50cy5NaWQoMCwgMTIpOw0KKyAgfQ0KKyAgcmV0dXJuIGVuY29kZUNvbnRlbnRzOw0KIH0NCi1GWF9CT09MCUNCQ19FQU4xMzo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdGlyeCwgbV9yZW5kZXJDb250ZW50cywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0JDX1VQQ0E6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY29udGVudHMuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vQ29udGVudHM7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEJDRk9STUFUIGZvcm1hdCA9IEJDRk9STUFUX1VQQ19BOw0KKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQorICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9IFByZXByb2Nlc3MoY29udGVudHMpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGVuY29kZUNvbnRlbnRzLlVURjhFbmNvZGUoKTsNCisgIG1fcmVuZGVyQ29udGVudHMgPSBlbmNvZGVDb250ZW50czsNCisgICgoQ0JDX09uZWRVUENBV3JpdGVyKiltX3BCQ1dyaXRlciktPkluaXQoKTsNCisgIHVpbnQ4X3QqIGRhdGEgPQ0KKyAgICAgIG1fcEJDV3JpdGVyLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyUmVzdWx0KGVuY29kZUNvbnRlbnRzLCBkYXRhLCBvdXRXaWR0aCwgaXNEZXZpY2UsIGUpOw0KKyAgRlhfRnJlZShkYXRhKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAlDQkNfRUFOMTM6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBtX3JlbmRlckNvbnRlbnRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDQkNfVVBDQTo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCBtX3JlbmRlckNvbnRlbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VBTjEzOjpEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KLSAgICByZXR1cm4gc3RyOw0KK0ZYX0JPT0wgQ0JDX1VQQ0E6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKSB7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIG1fcmVuZGVyQ29udGVudHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDQkNfRUFOMTM6OkRlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIGludDMyX3QgJmUpDQotew0KLSAgICBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSBzb3VyY2UocEJpdG1hcCk7DQotICAgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgYmluYXJpemVyKCZzb3VyY2UpOw0KLSAgICBDQkNfQmluYXJ5Qml0bWFwICBiaXRtYXAoJmJpbmFyaXplcik7DQotICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGWF9XU1RSQyhMIiIpKTsNCi0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzdHIsIHN0ci5HZXRMZW5ndGgoKSk7DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1VQQ0E6OkRlY29kZSh1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgIHJldHVybiBzdHI7DQogfQ0KLUNCQ19VUENBOjpDQkNfVVBDQSgpDQotew0KLSAgICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKikgRlhfTkVXIChDQkNfT25lZFVQQ0FSZWFkZXIpOw0KLSAgICAoKENCQ19PbmVkVVBDQVJlYWRlciAqKW1fcEJDUmVhZGVyKS0+SW5pdCgpOw0KLSAgICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKikgRlhfTkVXIChDQkNfT25lZFVQQ0FXcml0ZXIpOw0KK0NGWF9XaWRlU3RyaW5nIENCQ19VUENBOjpEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90JiBlKSB7DQorICBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSBzb3VyY2UocEJpdG1hcCk7DQorICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgIENCQ19CaW5hcnlCaXRtYXAgYml0bWFwKCZiaW5hcml6ZXIpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gbV9wQkNSZWFkZXItPkRlY29kZSgmYml0bWFwLCAwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGWF9XU1RSQyhMIiIpKTsNCisgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3RyLCBzdHIuR2V0TGVuZ3RoKCkpOw0KIH0NCi1DQkNfVVBDQTo6fkNCQ19VUENBKCkNCi17DQotICAgIGlmKG1fcEJDUmVhZGVyKSB7DQotICAgICAgICBkZWxldGUobV9wQkNSZWFkZXIpOw0KLSAgICAgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKG1fcEJDV3JpdGVyKSB7DQotICAgICAgICBkZWxldGUobV9wQkNXcml0ZXIpOw0KLSAgICAgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KLSAgICB9DQorQ0JDX1FSQ29kZTo6Q0JDX1FSQ29kZSgpIHsNCisgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKUZYX05FVyhDQkNfUVJDb2RlUmVhZGVyKTsNCisgICgoQ0JDX1FSQ29kZVJlYWRlciopbV9wQkNSZWFkZXIpLT5Jbml0KCk7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKilGWF9ORVcoQ0JDX1FSQ29kZVdyaXRlcik7DQogfQ0KLUNGWF9XaWRlU3RyaW5nCUNCQ19VUENBOjpQcmVwcm9jZXNzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9ICgoQ0JDX09uZWRFQU44V3JpdGVyKiltX3BCQ1dyaXRlciktPkZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsNCi0gICAgaW50MzJfdCBsZW5ndGggPSBlbmNvZGVDb250ZW50cy5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGxlbmd0aCA8PSAxMSkgew0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTEgLSBsZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIGVuY29kZUNvbnRlbnRzID0gRlhfV0NIQVIoJzAnKSArIGVuY29kZUNvbnRlbnRzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGVuY29kZUNvbnRlbnRzLlVURjhFbmNvZGUoKTsNCi0gICAgICAgIGludDMyX3QgY2hlY2tzdW0gPSAoKENCQ19PbmVkVVBDQVdyaXRlciAqKW1fcEJDV3JpdGVyKS0+Q2FsY0NoZWNrc3VtKGJ5dGVTdHJpbmcpOw0KLSAgICAgICAgYnl0ZVN0cmluZyArPSBjaGVja3N1bSAtIDAgKyAnMCc7DQotICAgICAgICBlbmNvZGVDb250ZW50cyA9IGJ5dGVTdHJpbmcuVVRGOERlY29kZSgpOw0KLSAgICB9DQotICAgIGlmIChsZW5ndGggPiAxMikgew0KLSAgICAgICAgZW5jb2RlQ29udGVudHMgPSBlbmNvZGVDb250ZW50cy5NaWQoMCwgMTIpOw0KLSAgICB9DQotICAgIHJldHVybiBlbmNvZGVDb250ZW50czsNCitDQkNfUVJDb2RlOjp+Q0JDX1FSQ29kZSgpIHsNCisgIGlmIChtX3BCQ1JlYWRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDUmVhZGVyKTsNCisgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNXcml0ZXIpOw0KKyAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQorICB9DQogfQ0KLUZYX0JPT0wgQ0JDX1VQQ0E6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYoY29udGVudHMuSXNFbXB0eSgpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEJDRk9STUFUIGZvcm1hdAk9IEJDRk9STUFUX1VQQ19BOw0KLSAgICBpbnQzMl90IG91dFdpZHRoID0gMDsNCi0gICAgaW50MzJfdCBvdXRIZWlnaHQgPSAwOw0KLSAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9IFByZXByb2Nlc3MoY29udGVudHMpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZW5jb2RlQ29udGVudHMuVVRGOEVuY29kZSgpOw0KLSAgICBtX3JlbmRlckNvbnRlbnRzID0gZW5jb2RlQ29udGVudHM7DQotICAgICgoQ0JDX09uZWRVUENBV3JpdGVyKiltX3BCQ1dyaXRlciktPkluaXQoKTsNCi0gICAgdWludDhfdCAqZGF0YSA9IG1fcEJDV3JpdGVyLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCi0gICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlclJlc3VsdChlbmNvZGVDb250ZW50cywgZGF0YSwgb3V0V2lkdGgsIGlzRGV2aWNlLCBlKTsNCi0gICAgRlhfRnJlZShkYXRhKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDQkNfUVJDb2RlOjpTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbikgew0KKyAgaWYgKHZlcnNpb24gPCAwIHx8IHZlcnNpb24gPiA0MCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9wQkNXcml0ZXIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gKChDQkNfUVJDb2RlV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFZlcnNpb24odmVyc2lvbik7DQogfQ0KLUZYX0JPT0wJQ0JDX1VQQ0E6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwgaW50MzJfdCAmZSkNCi17DQotICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJEZXZpY2VSZXN1bHQoZGV2aWNlLCBtYXRpcngsIG1fcmVuZGVyQ29udGVudHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENCQ19RUkNvZGU6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpIHsNCisgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiAzKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChtX3BCQ1dyaXRlciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwobGV2ZWwpOw0KIH0NCi1GWF9CT09MCUNCQ19VUENBOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwIComcE91dEJpdG1hcCwgaW50MzJfdCAmZSkNCi17DQotICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgbV9yZW5kZXJDb250ZW50cywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0JDX1FSQ29kZTo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IG91dFdpZHRoID0gMDsNCisgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsNCisgIHVpbnQ4X3QqIGRhdGEgPSAoKENCQ19RUkNvZGVXcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgICAgICAgICAgICAgICAgICAtPkVuY29kZShjb250ZW50cywgKChDQkNfUVJDb2RlV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldEVycm9yQ29ycmVjdGlvbkxldmVsKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJSZXN1bHQoZGF0YSwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQorICBGWF9GcmVlKGRhdGEpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDQkNfVVBDQTo6RGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsNCi0gICAgcmV0dXJuIHN0cjsNCitGWF9CT09MIENCQ19RUkNvZGU6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJEZXZpY2VSZXN1bHQoZGV2aWNlLCBtYXRpcngpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19VUENBOjpEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KLSAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCi0gICAgQ0JDX0JpbmFyeUJpdG1hcCAgYml0bWFwKCZiaW5hcml6ZXIpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3RyLCBzdHIuR2V0TGVuZ3RoKCkpOw0KK0ZYX0JPT0wgQ0JDX1FSQ29kZTo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIHsNCisgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUNCQ19RUkNvZGU6OkNCQ19RUkNvZGUoKQ0KLXsNCi0gICAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciAqKSBGWF9ORVcgKENCQ19RUkNvZGVSZWFkZXIpOw0KLSAgICAoKENCQ19RUkNvZGVSZWFkZXIqKW1fcEJDUmVhZGVyKS0+SW5pdCgpOw0KLSAgICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyICopIEZYX05FVyAoQ0JDX1FSQ29kZVdyaXRlcik7DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1FSQ29kZTo6RGVjb2RlKHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KKyAgcmV0dXJuIHN0cjsNCiB9DQotQ0JDX1FSQ29kZSA6On5DQkNfUVJDb2RlKCkNCi17DQotICAgIGlmKG1fcEJDUmVhZGVyKSB7DQotICAgICAgICBkZWxldGUobV9wQkNSZWFkZXIpOw0KLSAgICAgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKG1fcEJDV3JpdGVyKSB7DQotICAgICAgICBkZWxldGUobV9wQkNXcml0ZXIpOw0KLSAgICAgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KLSAgICB9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1FSQ29kZTo6RGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQorICBDQkNfQmluYXJ5Qml0bWFwIGJpdG1hcCgmYmluYXJpemVyKTsNCisgIENGWF9CeXRlU3RyaW5nIHJldFN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHJldFN0ciwgcmV0U3RyLkdldExlbmd0aCgpKTsNCiB9DQotRlhfQk9PTCBDQkNfUVJDb2RlOjpTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbikNCi17DQotICAgIGlmICh2ZXJzaW9uIDwgMCB8fCB2ZXJzaW9uID4gNDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAobV9wQkNXcml0ZXIgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybigoQ0JDX1FSQ29kZVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRWZXJzaW9uKHZlcnNpb24pOw0KK0NCQ19QREY0MTdJOjpDQkNfUERGNDE3SSgpIHsNCisgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKUZYX05FVyhDQkNfUERGNDE3UmVhZGVyKTsNCisgIG1fcEJDV3JpdGVyID0gKENCQ19Xcml0ZXIqKUZYX05FVyhDQkNfUERGNDE3V3JpdGVyKTsNCiB9DQotRlhfQk9PTCBDQkNfUVJDb2RlOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbCAoaW50MzJfdCBsZXZlbCkNCi17DQotICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiAzKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG1fcEJDV3JpdGVyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gKChDQkNfVHdvRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGxldmVsKTsNCitDQkNfUERGNDE3STo6fkNCQ19QREY0MTdJKCkgew0KKyAgaWYgKG1fcEJDUmVhZGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNSZWFkZXIpOw0KKyAgICBtX3BCQ1JlYWRlciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgZGVsZXRlIChtX3BCQ1dyaXRlcik7DQorICAgIG1fcEJDV3JpdGVyID0gTlVMTDsNCisgIH0NCiB9DQotRlhfQk9PTCBDQkNfUVJDb2RlOjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3Qgb3V0V2lkdGggPSAwOw0KLSAgICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQotICAgIHVpbnQ4X3QgKmRhdGEgPSAoKENCQ19RUkNvZGVXcml0ZXIqKW1fcEJDV3JpdGVyKS0+RW5jb2RlKGNvbnRlbnRzLCAoKENCQ19RUkNvZGVXcml0ZXIqKW1fcEJDV3JpdGVyKS0+R2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQotICAgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJSZXN1bHQoZGF0YSwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQotICAgIEZYX0ZyZWUoZGF0YSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0JDX1BERjQxN0k6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpIHsNCisgICgoQ0JDX1BERjQxN1dyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRFcnJvckNvcnJlY3Rpb25MZXZlbChsZXZlbCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAlDQkNfUVJDb2RlOjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIGludDMyX3QgJmUpDQotew0KLSAgICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4KTsNCi0gICAgcmV0dXJuIFRSVUU7DQordm9pZCBDQkNfUERGNDE3STo6U2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKSB7DQorICAoKENCQ19QREY0MTdXcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0VHJ1bmNhdGVkKHRydW5jYXRlZCk7DQogfQ0KLUZYX0JPT0wJQ0JDX1FSQ29kZTo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIGludDMyX3QgJmUpDQotew0KLSAgICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENCQ19QREY0MTdJOjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQkNGT1JNQVQgZm9ybWF0ID0gQkNGT1JNQVRfUERGXzQxNzsNCisgIGludDMyX3Qgb3V0V2lkdGggPSAwOw0KKyAgaW50MzJfdCBvdXRIZWlnaHQgPSAwOw0KKyAgdWludDhfdCogZGF0YSA9ICgoQ0JDX1BERjQxN1dyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgICAgICAgICAgICAgICAgIC0+RW5jb2RlKGNvbnRlbnRzLCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyUmVzdWx0KGRhdGEsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgRlhfRnJlZShkYXRhKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX1FSQ29kZTo6RGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsNCi0gICAgcmV0dXJuIHN0cjsNCitGWF9CT09MIENCQ19QREY0MTdJOjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJEZXZpY2VSZXN1bHQoZGV2aWNlLCBtYXRpcngpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19RUkNvZGU6OkRlY29kZShDRlhfRElCaXRtYXAgKnBCaXRtYXAsIGludDMyX3QgJmUpDQotew0KLSAgICBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSBzb3VyY2UocEJpdG1hcCk7DQotICAgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgYmluYXJpemVyKCZzb3VyY2UpOw0KLSAgICBDQkNfQmluYXJ5Qml0bWFwICBiaXRtYXAoJmJpbmFyaXplcik7DQotICAgIENGWF9CeXRlU3RyaW5nIHJldFN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGWF9XU1RSQyhMIiIpKTsNCi0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChyZXRTdHIsIHJldFN0ci5HZXRMZW5ndGgoKSk7DQorRlhfQk9PTCBDQkNfUERGNDE3STo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIHsNCisgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUNCQ19QREY0MTdJOjpDQkNfUERGNDE3SSgpDQotew0KLSAgICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKikgRlhfTkVXIChDQkNfUERGNDE3UmVhZGVyKTsNCi0gICAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopIEZYX05FVyAoQ0JDX1BERjQxN1dyaXRlcik7DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1BERjQxN0k6OkRlY29kZSh1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgIHJldHVybiBzdHI7DQogfQ0KLUNCQ19QREY0MTdJOjp+Q0JDX1BERjQxN0koKQ0KLXsNCi0gICAgaWYobV9wQkNSZWFkZXIpIHsNCi0gICAgICAgIGRlbGV0ZShtX3BCQ1JlYWRlcik7DQotICAgICAgICBtX3BCQ1JlYWRlciA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYobV9wQkNXcml0ZXIpIHsNCi0gICAgICAgIGRlbGV0ZShtX3BCQ1dyaXRlcik7DQotICAgICAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQotICAgIH0NCitDRlhfV2lkZVN0cmluZyBDQkNfUERGNDE3STo6RGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQorICBDQkNfQmluYXJ5Qml0bWFwIGJpdG1hcCgmYmluYXJpemVyKTsNCisgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHJpbmcgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChieXRlc3RyaW5nLCBieXRlc3RyaW5nLkdldExlbmd0aCgpKTsNCiB9DQotRlhfQk9PTCBDQkNfUERGNDE3STo6U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwgKGludDMyX3QgbGV2ZWwpDQotew0KLSAgICAoKENCQ19QREY0MTdXcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwobGV2ZWwpOw0KLSAgICByZXR1cm4gVFJVRTsNCitDQkNfRGF0YU1hdHJpeDo6Q0JDX0RhdGFNYXRyaXgoKSB7DQorICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKilGWF9ORVcoQ0JDX0RhdGFNYXRyaXhSZWFkZXIpOw0KKyAgKChDQkNfRGF0YU1hdHJpeFJlYWRlciopbV9wQkNSZWFkZXIpLT5Jbml0KCk7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKilGWF9ORVcoQ0JDX0RhdGFNYXRyaXhXcml0ZXIpOw0KIH0NCi12b2lkIENCQ19QREY0MTdJOjpTZXRUcnVuY2F0ZWQoRlhfQk9PTCB0cnVuY2F0ZWQpDQotew0KLSAgICAoKENCQ19QREY0MTdXcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0VHJ1bmNhdGVkKHRydW5jYXRlZCk7DQorQ0JDX0RhdGFNYXRyaXg6On5DQkNfRGF0YU1hdHJpeCgpIHsNCisgIGlmIChtX3BCQ1JlYWRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDUmVhZGVyKTsNCisgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNXcml0ZXIpOw0KKyAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQorICB9DQogfQ0KLUZYX0JPT0wgQ0JDX1BERjQxN0k6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQkNGT1JNQVQgZm9ybWF0CT0gQkNGT1JNQVRfUERGXzQxNzsNCi0gICAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQotICAgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsNCi0gICAgdWludDhfdCAqZGF0YSA9ICgoQ0JDX1BERjQxN1dyaXRlciopbV9wQkNXcml0ZXIpLT5FbmNvZGUoY29udGVudHMsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyUmVzdWx0KGRhdGEsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KLSAgICBGWF9GcmVlKGRhdGEpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENCQ19EYXRhTWF0cml4OjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQorICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQorICB1aW50OF90KiBkYXRhID0gKChDQkNfRGF0YU1hdHJpeFdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgICAgICAgICAgICAgICAgIC0+RW5jb2RlKGNvbnRlbnRzLCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyUmVzdWx0KGRhdGEsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgRlhfRnJlZShkYXRhKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAlDQkNfUERGNDE3STo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgKChDQkNfVHdvRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdGlyeCk7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0JDX0RhdGFNYXRyaXg6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgKChDQkNfVHdvRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdGlyeCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAlDQkNfUERGNDE3STo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIGludDMyX3QgJmUpDQotew0KLSAgICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENCQ19EYXRhTWF0cml4OjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgKChDQkNfVHdvRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX1BERjQxN0k6OkRlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyBzdHI7DQotICAgIHJldHVybiBzdHI7DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0RhdGFNYXRyaXg6OkRlY29kZSh1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgIHJldHVybiBzdHI7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19QREY0MTdJOjpEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KLSAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCi0gICAgQ0JDX0JpbmFyeUJpdG1hcCAgYml0bWFwKCZiaW5hcml6ZXIpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nID0gbV9wQkNSZWFkZXItPkRlY29kZSgmYml0bWFwLCAwLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJ5dGVzdHJpbmcsIGJ5dGVzdHJpbmcuR2V0TGVuZ3RoKCkpOw0KLX0NCi1DQkNfRGF0YU1hdHJpeDo6Q0JDX0RhdGFNYXRyaXgoKQ0KLXsNCi0gICAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopIEZYX05FVyAoQ0JDX0RhdGFNYXRyaXhSZWFkZXIpOw0KLSAgICAoKENCQ19EYXRhTWF0cml4UmVhZGVyKiltX3BCQ1JlYWRlciktPkluaXQoKTsNCi0gICAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopIEZYX05FVyAoQ0JDX0RhdGFNYXRyaXhXcml0ZXIpOw0KLX0NCi1DQkNfRGF0YU1hdHJpeDo6fkNCQ19EYXRhTWF0cml4KCkNCi17DQotICAgIGlmKG1fcEJDUmVhZGVyKSB7DQotICAgICAgICBkZWxldGUobV9wQkNSZWFkZXIpOw0KLSAgICAgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKG1fcEJDV3JpdGVyKSB7DQotICAgICAgICBkZWxldGUobV9wQkNXcml0ZXIpOw0KLSAgICAgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ0JDX0RhdGFNYXRyaXg6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQotICAgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsNCi0gICAgdWludDhfdCAqZGF0YSA9ICgoQ0JDX0RhdGFNYXRyaXhXcml0ZXIgKiltX3BCQ1dyaXRlciktPkVuY29kZShjb250ZW50cywgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQotICAgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJSZXN1bHQoZGF0YSwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQotICAgIEZYX0ZyZWUoZGF0YSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNCQ19EYXRhTWF0cml4OjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsIGludDMyX3QgJmUpDQotew0KLSAgICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4KTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ0JDX0RhdGFNYXRyaXg6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgKChDQkNfVHdvRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19EYXRhTWF0cml4OjpEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KLSAgICByZXR1cm4gc3RyOw0KLX0NCi1DRlhfV2lkZVN0cmluZyBDQkNfRGF0YU1hdHJpeDo6RGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCi0gICAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQotICAgIENCQ19CaW5hcnlCaXRtYXAgIGJpdG1hcCgmYmluYXJpemVyKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgcmV0U3RyID0gbV9wQkNSZWFkZXItPkRlY29kZSgmYml0bWFwLCAwLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHJldFN0ciwgcmV0U3RyLkdldExlbmd0aCgpKTsNCitDRlhfV2lkZVN0cmluZyBDQkNfRGF0YU1hdHJpeDo6RGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQorICBDQkNfQmluYXJ5Qml0bWFwIGJpdG1hcCgmYmluYXJpemVyKTsNCisgIENGWF9CeXRlU3RyaW5nIHJldFN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHJldFN0ciwgcmV0U3RyLkdldExlbmd0aCgpKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJpemVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyaXplci5jcHAKaW5kZXggZGE0MzNkNy4uOGI0NWUxOSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJpemVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcml6ZXIuY3BwCkBAIC0yNSwxNCArMjUsMTAgQEAKICNpbmNsdWRlICJCQ19CaW5hcml6ZXIuaCINCiAjaW5jbHVkZSAiY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KICNpbmNsdWRlICJjb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCINCi1DQkNfQmluYXJpemVyOjpDQkNfQmluYXJpemVyKENCQ19MdW1pbmFuY2VTb3VyY2UgKnNvdXJjZSkNCi17DQotICAgIG1fc291cmNlID0gc291cmNlOw0KK0NCQ19CaW5hcml6ZXI6OkNCQ19CaW5hcml6ZXIoQ0JDX0x1bWluYW5jZVNvdXJjZSogc291cmNlKSB7DQorICBtX3NvdXJjZSA9IHNvdXJjZTsNCiB9DQotQ0JDX0JpbmFyaXplcjo6fkNCQ19CaW5hcml6ZXIoKQ0KLXsNCi19DQotQ0JDX0x1bWluYW5jZVNvdXJjZSAqQ0JDX0JpbmFyaXplcjo6R2V0THVtaW5hbmNlU291cmNlKCkNCi17DQotICAgIHJldHVybiBtX3NvdXJjZTsNCitDQkNfQmluYXJpemVyOjp+Q0JDX0JpbmFyaXplcigpIHt9DQorQ0JDX0x1bWluYW5jZVNvdXJjZSogQ0JDX0JpbmFyaXplcjo6R2V0THVtaW5hbmNlU291cmNlKCkgew0KKyAgcmV0dXJuIG1fc291cmNlOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcml6ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyaXplci5oCmluZGV4IDI0MWJjMWQuLjM1ODA1YzggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyaXplci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyaXplci5oCkBAIC0xMCwxNSArMTAsMTcgQEAKIGNsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQogY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KIGNsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQotY2xhc3MgQ0JDX0JpbmFyaXplcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19CaW5hcml6ZXIoQ0JDX0x1bWluYW5jZVNvdXJjZSAqc291cmNlKTsNCi0gICAgdmlydHVhbCB+Q0JDX0JpbmFyaXplcigpOw0KLSAgICBDQkNfTHVtaW5hbmNlU291cmNlICpHZXRMdW1pbmFuY2VTb3VyY2UoKTsNCi0gICAgdmlydHVhbCBDQkNfQ29tbW9uQml0TWF0cml4ICpHZXRCbGFja01hdHJpeChpbnQzMl90ICZlKSA9IDA7DQotICAgIHZpcnR1YWwgQ0JDX0NvbW1vbkJpdEFycmF5ICpHZXRCbGFja1JvdyhpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90ICZlKSA9IDA7DQotcHJpdmF0ZToNCi0gICAgQ0JDX0x1bWluYW5jZVNvdXJjZSAqbV9zb3VyY2U7DQorY2xhc3MgQ0JDX0JpbmFyaXplciB7DQorIHB1YmxpYzoNCisgIENCQ19CaW5hcml6ZXIoQ0JDX0x1bWluYW5jZVNvdXJjZSogc291cmNlKTsNCisgIHZpcnR1YWwgfkNCQ19CaW5hcml6ZXIoKTsNCisgIENCQ19MdW1pbmFuY2VTb3VyY2UqIEdldEx1bWluYW5jZVNvdXJjZSgpOw0KKyAgdmlydHVhbCBDQkNfQ29tbW9uQml0TWF0cml4KiBHZXRCbGFja01hdHJpeChpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIENCQ19Db21tb25CaXRBcnJheSogR2V0QmxhY2tSb3coaW50MzJfdCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpID0gMDsNCisNCisgcHJpdmF0ZToNCisgIENCQ19MdW1pbmFuY2VTb3VyY2UqIG1fc291cmNlOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJ5Qml0bWFwLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyeUJpdG1hcC5jcHAKaW5kZXggZjM3YjQ5Yy4uMTg4MDY3MCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJ5Qml0bWFwLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuY3BwCkBAIC0yNiw1MSArMjYsNDQgQEAKICNpbmNsdWRlICJCQ19CaW5hcnlCaXRtYXAuaCINCiAjaW5jbHVkZSAiY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KICNpbmNsdWRlICJjb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCINCi1DQkNfQmluYXJ5Qml0bWFwOjpDQkNfQmluYXJ5Qml0bWFwKENCQ19CaW5hcml6ZXIgKmJpbmFyaXplcik6IG1fYmluYXJpemVyKGJpbmFyaXplciksIG1fbWF0cml4KE5VTEwpDQotew0KK0NCQ19CaW5hcnlCaXRtYXA6OkNCQ19CaW5hcnlCaXRtYXAoQ0JDX0JpbmFyaXplciogYmluYXJpemVyKQ0KKyAgICA6IG1fYmluYXJpemVyKGJpbmFyaXplciksIG1fbWF0cml4KE5VTEwpIHt9DQorQ0JDX0JpbmFyeUJpdG1hcDo6fkNCQ19CaW5hcnlCaXRtYXAoKSB7DQorICBpZiAobV9tYXRyaXggIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9tYXRyaXg7DQorICB9DQorICBtX21hdHJpeCA9IE5VTEw7DQogfQ0KLUNCQ19CaW5hcnlCaXRtYXA6On5DQkNfQmluYXJ5Qml0bWFwKCkNCi17DQotICAgIGlmICAobV9tYXRyaXggIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIG1fbWF0cml4Ow0KLSAgICB9DQotICAgIG1fbWF0cml4ID0gTlVMTDsNCitpbnQzMl90IENCQ19CaW5hcnlCaXRtYXA6OkdldEhlaWdodCgpIHsNCisgIHJldHVybiBtX2JpbmFyaXplci0+R2V0THVtaW5hbmNlU291cmNlKCktPkdldEhlaWdodCgpOw0KIH0NCi1pbnQzMl90IENCQ19CaW5hcnlCaXRtYXA6OkdldEhlaWdodCgpDQotew0KLSAgICByZXR1cm4gbV9iaW5hcml6ZXItPkdldEx1bWluYW5jZVNvdXJjZSgpLT5HZXRIZWlnaHQoKTsNCitpbnQzMl90IENCQ19CaW5hcnlCaXRtYXA6OkdldFdpZHRoKCkgew0KKyAgcmV0dXJuIG1fYmluYXJpemVyLT5HZXRMdW1pbmFuY2VTb3VyY2UoKS0+R2V0V2lkdGgoKTsNCiB9DQotaW50MzJfdCBDQkNfQmluYXJ5Qml0bWFwOjpHZXRXaWR0aCgpDQotew0KLSAgICByZXR1cm4gbV9iaW5hcml6ZXItPkdldEx1bWluYW5jZVNvdXJjZSgpLT5HZXRXaWR0aCgpOw0KLX0NCi1DQkNfQ29tbW9uQml0TWF0cml4ICpDQkNfQmluYXJ5Qml0bWFwOjpHZXRNYXRyaXgoaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChtX21hdHJpeCA9PSBOVUxMKSB7DQotICAgICAgICBtX21hdHJpeCA9IG1fYmluYXJpemVyLT5HZXRCbGFja01hdHJpeChlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9tYXRyaXg7DQotfQ0KLUZYX0JPT0wgQ0JDX0JpbmFyeUJpdG1hcDo6SXNDcm9wU3VwcG9ydGVkKCkNCi17DQotICAgIHJldHVybiBtX2JpbmFyaXplci0+R2V0THVtaW5hbmNlU291cmNlKCktPklzQ3JvcFN1cHBvcnRlZCgpOw0KLX0NCi1GWF9CT09MIENCQ19CaW5hcnlCaXRtYXA6OklzUm90YXRlU3VwcG9ydGVkKCkNCi17DQotICAgIHJldHVybiBtX2JpbmFyaXplci0+R2V0THVtaW5hbmNlU291cmNlKCktPklzUm90YXRlU3VwcG9ydGVkKCk7DQotfQ0KLUNCQ19Db21tb25CaXRBcnJheSAqQ0JDX0JpbmFyeUJpdG1hcDo6R2V0QmxhY2tSb3coaW50MzJfdCB5LCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19Db21tb25CaXRBcnJheSAqdGVtcCA9IG1fYmluYXJpemVyLT5HZXRCbGFja1Jvdyh5LCByb3csIGUpOw0KK0NCQ19Db21tb25CaXRNYXRyaXgqIENCQ19CaW5hcnlCaXRtYXA6OkdldE1hdHJpeChpbnQzMl90JiBlKSB7DQorICBpZiAobV9tYXRyaXggPT0gTlVMTCkgew0KKyAgICBtX21hdHJpeCA9IG1fYmluYXJpemVyLT5HZXRCbGFja01hdHJpeChlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gdGVtcDsNCisgIH0NCisgIHJldHVybiBtX21hdHJpeDsNCiB9DQotQ0JDX0NvbW1vbkJpdE1hdHJpeCAqQ0JDX0JpbmFyeUJpdG1hcDo6R2V0QmxhY2tNYXRyaXgoaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChtX21hdHJpeCA9PSBOVUxMKSB7DQotICAgICAgICBtX21hdHJpeCA9IG1fYmluYXJpemVyLT5HZXRCbGFja01hdHJpeChlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9tYXRyaXg7DQorRlhfQk9PTCBDQkNfQmluYXJ5Qml0bWFwOjpJc0Nyb3BTdXBwb3J0ZWQoKSB7DQorICByZXR1cm4gbV9iaW5hcml6ZXItPkdldEx1bWluYW5jZVNvdXJjZSgpLT5Jc0Nyb3BTdXBwb3J0ZWQoKTsNCit9DQorRlhfQk9PTCBDQkNfQmluYXJ5Qml0bWFwOjpJc1JvdGF0ZVN1cHBvcnRlZCgpIHsNCisgIHJldHVybiBtX2JpbmFyaXplci0+R2V0THVtaW5hbmNlU291cmNlKCktPklzUm90YXRlU3VwcG9ydGVkKCk7DQorfQ0KK0NCQ19Db21tb25CaXRBcnJheSogQ0JDX0JpbmFyeUJpdG1hcDo6R2V0QmxhY2tSb3coaW50MzJfdCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQ29tbW9uQml0QXJyYXkqIHRlbXAgPSBtX2JpbmFyaXplci0+R2V0QmxhY2tSb3coeSwgcm93LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiB0ZW1wOw0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfQmluYXJ5Qml0bWFwOjpHZXRCbGFja01hdHJpeChpbnQzMl90JiBlKSB7DQorICBpZiAobV9tYXRyaXggPT0gTlVMTCkgew0KKyAgICBtX21hdHJpeCA9IG1fYmluYXJpemVyLT5HZXRCbGFja01hdHJpeChlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fbWF0cml4Ow0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyeUJpdG1hcC5oCmluZGV4IDQzOWU0NDYuLjRkNzlmYTcgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyeUJpdG1hcC5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyeUJpdG1hcC5oCkBAIC0xMCwyMCArMTAsMjIgQEAKIGNsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQogY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KIGNsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQotY2xhc3MgQ0JDX0JpbmFyeUJpdG1hcA0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19CaW5hcnlCaXRtYXAoQ0JDX0JpbmFyaXplciAqYmluYXJpemVyKTsNCi0gICAgdmlydHVhbCB+Q0JDX0JpbmFyeUJpdG1hcCgpOw0KLSAgICBpbnQzMl90CQkJCUdldFdpZHRoKCk7DQotICAgIGludDMyX3QJCQkJR2V0SGVpZ2h0KCk7DQotICAgIENCQ19Db21tb25CaXRNYXRyaXggKglHZXRNYXRyaXgoaW50MzJfdCAmZSk7DQotICAgIENCQ19Db21tb25CaXRBcnJheSAqCUdldEJsYWNrUm93KGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIGludDMyX3QgJmUpOw0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4ICoJR2V0QmxhY2tNYXRyaXgoaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wJCQkJCUlzQ3JvcFN1cHBvcnRlZCgpOw0KLSAgICBGWF9CT09MCQkJCQlJc1JvdGF0ZVN1cHBvcnRlZCgpOw0KLXByaXZhdGU6DQotICAgIENCQ19CaW5hcml6ZXIgKgkJCW1fYmluYXJpemVyOw0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4ICoJbV9tYXRyaXg7DQorY2xhc3MgQ0JDX0JpbmFyeUJpdG1hcCB7DQorIHB1YmxpYzoNCisgIENCQ19CaW5hcnlCaXRtYXAoQ0JDX0JpbmFyaXplciogYmluYXJpemVyKTsNCisgIHZpcnR1YWwgfkNCQ19CaW5hcnlCaXRtYXAoKTsNCisgIGludDMyX3QgR2V0V2lkdGgoKTsNCisgIGludDMyX3QgR2V0SGVpZ2h0KCk7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBHZXRNYXRyaXgoaW50MzJfdCYgZSk7DQorICBDQkNfQ29tbW9uQml0QXJyYXkqIEdldEJsYWNrUm93KGludDMyX3QgeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogR2V0QmxhY2tNYXRyaXgoaW50MzJfdCYgZSk7DQorICBGWF9CT09MIElzQ3JvcFN1cHBvcnRlZCgpOw0KKyAgRlhfQk9PTCBJc1JvdGF0ZVN1cHBvcnRlZCgpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0JDX0JpbmFyaXplciogbV9iaW5hcml6ZXI7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBtX21hdHJpeDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5jcHAKaW5kZXggN2EyNjZhNy4uMTlmNjhiMCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5jcHAKQEAgLTMsNyArMyw3IEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KIC8qDQogICogQ29weXJpZ2h0IDIwMDkgWlhpbmcgYXV0aG9ycw0KICAqDQpAQCAtMjMsMTc4ICsyMywxNjkgQEAKICNpbmNsdWRlICJiYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX0x1bWluYW5jZVNvdXJjZS5oIg0KICNpbmNsdWRlICJCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlLmgiDQotY2xhc3MgQ0JDX1BhdXNlIDogcHVibGljIElGWF9QYXVzZQ0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRlhfQk9PTAlOZWVkVG9QYXVzZU5vdygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQorY2xhc3MgQ0JDX1BhdXNlIDogcHVibGljIElGWF9QYXVzZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRlhfQk9PTCBOZWVkVG9QYXVzZU5vdygpIHsgcmV0dXJuIFRSVUU7IH0NCiB9Ow0KLXN0YXRpYyBDRlhfRElCaXRtYXAqIENyZWF0ZURJQlNvdXJjZShJRlhfRmlsZVJlYWQqIGZpbGVyZWFkKQ0KLXsNCi0gICAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBOVUxMOw0KLSAgICBDQ29kZWNfTW9kdWxlTWdyKiBwQ29kZWNNZ3IJPSBOVUxMOw0KLSAgICBJQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwSW1hZ2VDb2RlYyA9IE5VTEw7DQotICAgIHBDb2RlY01nciA9IG5ldyBDQ29kZWNfTW9kdWxlTWdyKCk7DQotICAgIHBJbWFnZUNvZGVjID0gcENvZGVjTWdyLT5DcmVhdGVQcm9ncmVzc2l2ZURlY29kZXIoKTsNCi0gICAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCi0gICAgc3RhdHVzID0gcEltYWdlQ29kZWMtPkxvYWRJbWFnZUluZm8oZmlsZXJlYWQsIEZYQ09ERUNfSU1BR0VfVU5LTk9XTik7DQotICAgIGlmIChzdGF0dXMgIT0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFkpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7DQotICAgIGJpdG1hcC0+Q3JlYXRlKHBJbWFnZUNvZGVjLT5HZXRXaWR0aCgpLCBwSW1hZ2VDb2RlYy0+R2V0SGVpZ2h0KCksIEZYRElCX0FyZ2IpOw0KLSAgICBiaXRtYXAtPkNsZWFyKEZYQVJHQl9NQUtFKDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYpKTsNCi0gICAgQ0JDX1BhdXNlIHBhdXNlOw0KLSAgICBpbnQzMl90IGZyYW1lczsNCitzdGF0aWMgQ0ZYX0RJQml0bWFwKiBDcmVhdGVESUJTb3VyY2UoSUZYX0ZpbGVSZWFkKiBmaWxlcmVhZCkgew0KKyAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBOVUxMOw0KKyAgQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyID0gTlVMTDsNCisgIElDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBJbWFnZUNvZGVjID0gTlVMTDsNCisgIHBDb2RlY01nciA9IG5ldyBDQ29kZWNfTW9kdWxlTWdyKCk7DQorICBwSW1hZ2VDb2RlYyA9IHBDb2RlY01nci0+Q3JlYXRlUHJvZ3Jlc3NpdmVEZWNvZGVyKCk7DQorICBGWENPREVDX1NUQVRVUyBzdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgc3RhdHVzID0gcEltYWdlQ29kZWMtPkxvYWRJbWFnZUluZm8oZmlsZXJlYWQsIEZYQ09ERUNfSU1BR0VfVU5LTk9XTik7DQorICBpZiAoc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgYml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsNCisgIGJpdG1hcC0+Q3JlYXRlKHBJbWFnZUNvZGVjLT5HZXRXaWR0aCgpLCBwSW1hZ2VDb2RlYy0+R2V0SGVpZ2h0KCksIEZYRElCX0FyZ2IpOw0KKyAgYml0bWFwLT5DbGVhcihGWEFSR0JfTUFLRSgweEZGLCAweEZGLCAweEZGLCAweEZGKSk7DQorICBDQkNfUGF1c2UgcGF1c2U7DQorICBpbnQzMl90IGZyYW1lczsNCisgIHN0YXR1cyA9IHBJbWFnZUNvZGVjLT5HZXRGcmFtZXMoZnJhbWVzLCAmcGF1c2UpOw0KKyAgd2hpbGUgKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19GUkFNRV9UT0JFQ09OVElOVUUpIHsNCiAgICAgc3RhdHVzID0gcEltYWdlQ29kZWMtPkdldEZyYW1lcyhmcmFtZXMsICZwYXVzZSk7DQotICAgIHdoaWxlIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfRlJBTUVfVE9CRUNPTlRJTlVFKSB7DQotICAgICAgICBzdGF0dXMgPSBwSW1hZ2VDb2RlYy0+R2V0RnJhbWVzKGZyYW1lcywgJnBhdXNlKTsNCi0gICAgfQ0KLSAgICBpZiAoc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWSkgew0KLSAgICAgICAgZ290byBleGNlcHQ7DQotICAgIH0NCi0gICAgc3RhdHVzID0gcEltYWdlQ29kZWMtPlN0YXJ0RGVjb2RlKGJpdG1hcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5HZXRXaWR0aCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5HZXRIZWlnaHQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7DQotICAgIGlmIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUykgew0KLSAgICAgICAgZ290byBleGNlcHQ7DQotICAgIH0NCi0gICAgaWYgKHN0YXR1cyAhPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7DQotICAgICAgICBnb3RvIGV4Y2VwdDsNCi0gICAgfQ0KLSAgICB3aGlsZSAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsNCi0gICAgICAgIHN0YXR1cyA9IHBJbWFnZUNvZGVjLT5Db250aW51ZURlY29kZSgmcGF1c2UpOw0KLSAgICB9DQotICAgIGlmIChzdGF0dXMgIT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSCkgew0KLSAgICAgICAgZ290byBleGNlcHQ7DQotICAgIH0NCi0gICAgaWYgKHBJbWFnZUNvZGVjKSB7DQotICAgICAgICBkZWxldGUgcEltYWdlQ29kZWM7DQotICAgICAgICBwSW1hZ2VDb2RlYyA9IE5VTEw7DQotICAgIH0NCi0gICAgZGVsZXRlIHBDb2RlY01ncjsNCi0gICAgcENvZGVjTWdyID0gTlVMTDsNCi0gICAgcmV0dXJuIGJpdG1hcDsNCisgIH0NCisgIGlmIChzdGF0dXMgIT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZKSB7DQorICAgIGdvdG8gZXhjZXB0Ow0KKyAgfQ0KKyAgc3RhdHVzID0gcEltYWdlQ29kZWMtPlN0YXJ0RGVjb2RlKGJpdG1hcCwgMCwgMCwgYml0bWFwLT5HZXRXaWR0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+R2V0SGVpZ2h0KCksIDAsIEZBTFNFKTsNCisgIGlmIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUykgew0KKyAgICBnb3RvIGV4Y2VwdDsNCisgIH0NCisgIGlmIChzdGF0dXMgIT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgew0KKyAgICBnb3RvIGV4Y2VwdDsNCisgIH0NCisgIHdoaWxlIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgew0KKyAgICBzdGF0dXMgPSBwSW1hZ2VDb2RlYy0+Q29udGludWVEZWNvZGUoJnBhdXNlKTsNCisgIH0NCisgIGlmIChzdGF0dXMgIT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSCkgew0KKyAgICBnb3RvIGV4Y2VwdDsNCisgIH0NCisgIGlmIChwSW1hZ2VDb2RlYykgew0KKyAgICBkZWxldGUgcEltYWdlQ29kZWM7DQorICAgIHBJbWFnZUNvZGVjID0gTlVMTDsNCisgIH0NCisgIGRlbGV0ZSBwQ29kZWNNZ3I7DQorICBwQ29kZWNNZ3IgPSBOVUxMOw0KKyAgcmV0dXJuIGJpdG1hcDsNCiBleGNlcHQ6DQotICAgIGlmIChwSW1hZ2VDb2RlYykgew0KLSAgICAgICAgZGVsZXRlIHBJbWFnZUNvZGVjOw0KLSAgICAgICAgcEltYWdlQ29kZWMgPSBOVUxMOw0KLSAgICB9DQotICAgIGRlbGV0ZSBwQ29kZWNNZ3I7DQotICAgIHBDb2RlY01nciA9IE5VTEw7DQotICAgIGlmIChiaXRtYXApIHsNCi0gICAgICAgIGRlbGV0ZSBiaXRtYXA7DQotICAgIH0NCisgIGlmIChwSW1hZ2VDb2RlYykgew0KKyAgICBkZWxldGUgcEltYWdlQ29kZWM7DQorICAgIHBJbWFnZUNvZGVjID0gTlVMTDsNCisgIH0NCisgIGRlbGV0ZSBwQ29kZWNNZ3I7DQorICBwQ29kZWNNZ3IgPSBOVUxMOw0KKyAgaWYgKGJpdG1hcCkgew0KKyAgICBkZWxldGUgYml0bWFwOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjpDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVuYW1lKQ0KKyAgICA6IENCQ19MdW1pbmFuY2VTb3VyY2UoMCwgMCksIG1fZmlsZW5hbWUoZmlsZW5hbWUpIHsNCisgIG1faGVpZ2h0ID0gMDsNCisgIG1fd2lkdGggPSAwOw0KKyAgbV9ieXRlc1BlckxpbmUgPSAwOw0KKyAgbV90b3AgPSAwOw0KKyAgbV9sZWZ0ID0gMDsNCit9DQordm9pZCBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6SW5pdChpbnQzMl90JiBlKSB7DQorICBJRlhfRmlsZVJlYWQqIGZpbGVyZWFkID0gRlhfQ3JlYXRlRmlsZVJlYWQobV9maWxlbmFtZSk7DQorICBtX3BCaXRtYXAgPSBDcmVhdGVESUJTb3VyY2UoZmlsZXJlYWQpOw0KKyAgaWYgKG1fcEJpdG1hcCA9PSBOVUxMKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkxvYWRGaWxlOw0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfQXJnYik7DQorICBtX2hlaWdodCA9IG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorICBtX3dpZHRoID0gbV9wQml0bWFwLT5HZXRXaWR0aCgpOw0KKyAgbV9yZ2JEYXRhLlNldFNpemUobV9oZWlnaHQgKiBtX3dpZHRoKTsNCisgIG1fYnl0ZXNQZXJMaW5lID0gbV93aWR0aCAqIDQ7DQorICBtX3RvcCA9IDA7DQorICBtX2xlZnQgPSAwOw0KK30NCitDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6Q0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UoDQorICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCkNCisgICAgOiBDQkNfTHVtaW5hbmNlU291cmNlKDAsIDApIHsNCisgIG1fcEJpdG1hcCA9IHBCaXRtYXAtPkNsb25lKCk7DQorICBtX3BCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfQXJnYik7DQorICBtX2hlaWdodCA9IG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorICBtX3dpZHRoID0gbV9wQml0bWFwLT5HZXRXaWR0aCgpOw0KKyAgbV9yZ2JEYXRhLlNldFNpemUobV9oZWlnaHQgKiBtX3dpZHRoKTsNCisgIG1fYnl0ZXNQZXJMaW5lID0gbV93aWR0aCAqIDQ7DQorICBtX3RvcCA9IDA7DQorICBtX2xlZnQgPSAwOw0KK30NCitDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6fkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKCkgew0KKyAgZGVsZXRlIG1fcEJpdG1hcDsNCisgIG1fcEJpdG1hcCA9IE5VTEw7DQorfQ0KK0NGWF9CeXRlQXJyYXkqIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjpHZXRSb3coaW50MzJfdCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVBcnJheSYgcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKHkgPCAwIHx8IHkgPj0gbV9oZWlnaHQpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uUmVxdWVzdGVkUm93SXNPdXRTaXplVGhlSW1hZ2U7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCB3aWR0aCA9IG1fd2lkdGg7DQorICBpZiAocm93LkdldFNpemUoKSA9PSAwIHx8IHJvdy5HZXRTaXplKCkgPCB3aWR0aCkgew0KKyAgICByb3cuU2V0U2l6ZSh3aWR0aCk7DQorICB9DQorICBpZiAobV9yZ2JEYXRhLkdldFNpemUoKSA9PSAwIHx8IG1fcmdiRGF0YS5HZXRTaXplKCkgPCB3aWR0aCkgew0KKyAgICBtX3JnYkRhdGEuU2V0U2l6ZSh3aWR0aCk7DQorICB9DQorICBpbnQzMl90KiByb3dMaW5lID0gKGludDMyX3QqKW1fcEJpdG1hcC0+R2V0U2NhbmxpbmUoeSk7DQorICBpbnQzMl90IHg7DQorICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgew0KKyAgICBpbnQzMl90IHBpeGVsID0gcm93TGluZVt4XTsNCisgICAgaW50MzJfdCBsdW1pbmFuY2UgPSAoMzA2ICogKChwaXhlbCA+PiAxNikgJiAweEZGKSArDQorICAgICAgICAgICAgICAgICAgICAgICAgIDYwMSAqICgocGl4ZWwgPj4gOCkgJiAweEZGKSArIDExNyAqIChwaXhlbCAmIDB4RkYpKSA+Pg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDEwOw0KKyAgICByb3dbeF0gPSAodWludDhfdClsdW1pbmFuY2U7DQorICB9DQorICByZXR1cm4gJnJvdzsNCiB9DQotQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2U6OkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZmaWxlbmFtZSk6IENCQ19MdW1pbmFuY2VTb3VyY2UoMCwgMCksIG1fZmlsZW5hbWUoZmlsZW5hbWUpDQotew0KLSAgICBtX2hlaWdodCA9IDA7DQotICAgIG1fd2lkdGggPSAwOw0KLSAgICBtX2J5dGVzUGVyTGluZSA9IDA7DQotICAgIG1fdG9wID0gMDsNCi0gICAgbV9sZWZ0ID0gMDsNCi19DQotdm9pZCBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6SW5pdChpbnQzMl90ICZlKQ0KLXsNCi0gICAgSUZYX0ZpbGVSZWFkKiBmaWxlcmVhZCA9IEZYX0NyZWF0ZUZpbGVSZWFkKG1fZmlsZW5hbWUpOw0KLSAgICBtX3BCaXRtYXAgPSBDcmVhdGVESUJTb3VyY2UoZmlsZXJlYWQpOw0KLSAgICBpZiAobV9wQml0bWFwID09IE5VTEwpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkxvYWRGaWxlOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIG1fcEJpdG1hcC0+Q29udmVydEZvcm1hdChGWERJQl9BcmdiKTsNCi0gICAgbV9oZWlnaHQgPSBtX3BCaXRtYXAtPkdldEhlaWdodCgpOw0KLSAgICBtX3dpZHRoID0gbV9wQml0bWFwLT5HZXRXaWR0aCgpOw0KLSAgICBtX3JnYkRhdGEuU2V0U2l6ZShtX2hlaWdodCAqIG1fd2lkdGgpOw0KLSAgICBtX2J5dGVzUGVyTGluZSA9IG1fd2lkdGggKiA0Ow0KLSAgICBtX3RvcCA9IDA7DQotICAgIG1fbGVmdCA9IDA7DQotfQ0KLUNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjpDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZShDRlhfRElCaXRtYXAgKnBCaXRtYXApOiBDQkNfTHVtaW5hbmNlU291cmNlKDAsIDApDQotew0KLSAgICBtX3BCaXRtYXAgPSBwQml0bWFwLT5DbG9uZSgpOw0KLSAgICBtX3BCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfQXJnYik7DQotICAgIG1faGVpZ2h0ID0gbV9wQml0bWFwLT5HZXRIZWlnaHQoKTsNCi0gICAgbV93aWR0aCA9IG1fcEJpdG1hcC0+R2V0V2lkdGgoKTsNCi0gICAgbV9yZ2JEYXRhLlNldFNpemUobV9oZWlnaHQgKiBtX3dpZHRoKTsNCi0gICAgbV9ieXRlc1BlckxpbmUgPSBtX3dpZHRoICogNDsNCi0gICAgbV90b3AgPSAwOw0KLSAgICBtX2xlZnQgPSAwOw0KLX0NCi1DQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6fkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKCkNCi17DQotICAgIGRlbGV0ZSBtX3BCaXRtYXA7DQotICAgIG1fcEJpdG1hcCA9IE5VTEw7DQotfQ0KLUNGWF9CeXRlQXJyYXkgKkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjpHZXRSb3coaW50MzJfdCB5LCBDRlhfQnl0ZUFycmF5ICZyb3csIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoeSA8IDAgfHwgeSA+PSBtX2hlaWdodCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uUmVxdWVzdGVkUm93SXNPdXRTaXplVGhlSW1hZ2U7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHdpZHRoID0gbV93aWR0aDsNCi0gICAgaWYocm93LkdldFNpemUoKSA9PSAwIHx8IHJvdy5HZXRTaXplKCkgPCB3aWR0aCkgew0KLSAgICAgICAgcm93LlNldFNpemUod2lkdGgpOw0KLSAgICB9DQotICAgIGlmKG1fcmdiRGF0YS5HZXRTaXplKCkgPT0gMCB8fCBtX3JnYkRhdGEuR2V0U2l6ZSgpIDwgd2lkdGgpIHsNCi0gICAgICAgIG1fcmdiRGF0YS5TZXRTaXplKHdpZHRoKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90KiByb3dMaW5lID0gKGludDMyX3QqKW1fcEJpdG1hcC0+R2V0U2NhbmxpbmUoeSk7DQorQ0ZYX0J5dGVBcnJheSogQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2U6OkdldE1hdHJpeCgpIHsNCisgIENGWF9CeXRlQXJyYXkqIG1hdGlyeCA9IEZYX05FVyBDRlhfQnl0ZUFycmF5KCk7DQorICBtYXRpcngtPlNldFNpemUobV9ieXRlc1BlckxpbmUgKiBtX2hlaWdodCk7DQorICBpbnQzMl90KiByZ2IgPSAoaW50MzJfdCopbV9wQml0bWFwLT5HZXRCdWZmZXIoKTsNCisgIGludDMyX3QgeTsNCisgIGZvciAoeSA9IDA7IHkgPCBtX2hlaWdodDsgeSsrKSB7DQorICAgIGludDMyX3Qgb2Zmc2V0ID0geSAqIG1fd2lkdGg7DQogICAgIGludDMyX3QgeDsNCi0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsNCi0gICAgICAgIGludDMyX3QgcGl4ZWwgPSByb3dMaW5lW3hdOw0KLSAgICAgICAgaW50MzJfdCBsdW1pbmFuY2UgPSAoMzA2ICogKChwaXhlbCA+PiAxNikgJiAweEZGKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjAxICogKChwaXhlbCA+PiA4KSAmIDB4RkYpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTcgKiAocGl4ZWwgJiAweEZGKSkgPj4gMTA7DQotICAgICAgICByb3dbeF0gPSAodWludDhfdCkgbHVtaW5hbmNlOw0KKyAgICBmb3IgKHggPSAwOyB4IDwgbV93aWR0aDsgeCsrKSB7DQorICAgICAgaW50MzJfdCBwaXhlbCA9IHJnYltvZmZzZXQgKyB4XTsNCisgICAgICBpbnQzMl90IGx1bWluYW5jZSA9DQorICAgICAgICAgICgzMDYgKiAoKHBpeGVsID4+IDE2KSAmIDB4RkYpICsgNjAxICogKChwaXhlbCA+PiA4KSAmIDB4RkYpICsNCisgICAgICAgICAgIDExNyAqIChwaXhlbCAmIDB4RkYpKSA+Pg0KKyAgICAgICAgICAxMDsNCisgICAgICAoKm1hdGlyeClbb2Zmc2V0ICsgeF0gPSAodWludDhfdClsdW1pbmFuY2U7DQogICAgIH0NCi0gICAgcmV0dXJuICZyb3c7DQorICB9DQorICByZXR1cm4gbWF0aXJ4Ow0KIH0NCi1DRlhfQnl0ZUFycmF5ICpDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6R2V0TWF0cml4KCkNCi17DQotICAgIENGWF9CeXRlQXJyYXkgKm1hdGlyeCA9IEZYX05FVyBDRlhfQnl0ZUFycmF5KCk7DQotICAgIG1hdGlyeC0+U2V0U2l6ZShtX2J5dGVzUGVyTGluZSAqIG1faGVpZ2h0KTsNCi0gICAgaW50MzJfdCAqcmdiID0gKGludDMyX3QqKW1fcEJpdG1hcC0+R2V0QnVmZmVyKCk7DQotICAgIGludDMyX3QgeTsNCi0gICAgZm9yKHkgPSAwOyB5IDwgbV9oZWlnaHQ7IHkrKykgew0KLSAgICAgICAgaW50MzJfdCBvZmZzZXQgPSB5ICogbV93aWR0aDsNCi0gICAgICAgIGludDMyX3QgeDsNCi0gICAgICAgIGZvcih4ID0gMDsgeCA8IG1fd2lkdGg7IHgrKykgew0KLSAgICAgICAgICAgIGludDMyX3QgcGl4ZWwgPSByZ2Jbb2Zmc2V0ICsgeF07DQotICAgICAgICAgICAgaW50MzJfdCBsdW1pbmFuY2UgPSAoMzA2ICogKChwaXhlbCA+PiAxNikgJiAweEZGKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwMSAqICgocGl4ZWwgPj4gOCkgJiAweEZGKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNyAqIChwaXhlbCAmIDB4RkYpKSA+PiAxMDsNCi0gICAgICAgICAgICAoKm1hdGlyeClbb2Zmc2V0ICsgeF0gPSAodWludDhfdCkgbHVtaW5hbmNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBtYXRpcng7DQorRlhfQk9PTCBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6SXNDcm9wU3VwcG9ydGVkKCkgew0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2U6OklzQ3JvcFN1cHBvcnRlZCgpDQotew0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjpJc1JvdGF0ZVN1cHBvcnRlZCgpIHsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjpJc1JvdGF0ZVN1cHBvcnRlZCgpDQotew0KLSAgICByZXR1cm4gVFJVRTsNCitDQkNfTHVtaW5hbmNlU291cmNlKiBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6Q3JvcChpbnQzMl90IGxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkgew0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLUNCQ19MdW1pbmFuY2VTb3VyY2UgKkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjpDcm9wKGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KQ0KLXsNCitDQkNfTHVtaW5hbmNlU291cmNlKiBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6Um90YXRlQ291bnRlckNsb2Nrd2lzZSgNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKCFJc1JvdGF0ZVN1cHBvcnRlZCgpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvblJvdGF0ZU5vdFN1cHBvcnRlZDsNCiAgICAgcmV0dXJuIE5VTEw7DQotfQ0KLUNCQ19MdW1pbmFuY2VTb3VyY2UgKkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjpSb3RhdGVDb3VudGVyQ2xvY2t3aXNlKGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoIUlzUm90YXRlU3VwcG9ydGVkKCkpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJvdGF0ZU5vdFN1cHBvcnRlZDsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGludDMyX3Qgc291cmNlV2lkdGggPSBtX3dpZHRoOw0KLSAgICBpbnQzMl90IHNvdXJjZUhlaWdodCA9IG1faGVpZ2h0Ow0KLSAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3Qgc291cmNlV2lkdGggPSBtX3dpZHRoOw0KKyAgaW50MzJfdCBzb3VyY2VIZWlnaHQgPSBtX2hlaWdodDsNCisgIHJldHVybiBOVUxMOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlLmgKaW5kZXggMTFkNTFlMy4uMjc5OWRmNSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UuaApAQCAtOCwyNiArOCwyOSBAQAogI2RlZmluZSBfQkNfQlVGRkVSRURJTUFHRUxVTUlOQU5DRVNPVVJDRV9IXw0KIGNsYXNzIENCQ19MdW1pbmFuY2VTb3VyY2U7DQogY2xhc3MgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2U7DQotY2xhc3MgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UgOiBwdWJsaWMgQ0JDX0x1bWluYW5jZVNvdXJjZQ0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZmaWxlbmFtZSk7DQotICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCk7DQotICAgIHZpcnR1YWwgfkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKCk7DQotICAgIENCQ19MdW1pbmFuY2VTb3VyY2UgKlJvdGF0ZUNvdW50ZXJDbG9ja3dpc2UoaW50MzJfdCAmZSk7DQotICAgIENCQ19MdW1pbmFuY2VTb3VyY2UgKkNyb3AoaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOw0KK2NsYXNzIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIDogcHVibGljIENCQ19MdW1pbmFuY2VTb3VyY2Ugew0KKyBwdWJsaWM6DQorICBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZShjb25zdCBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUpOw0KKyAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsNCisgIHZpcnR1YWwgfkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKCk7DQorICBDQkNfTHVtaW5hbmNlU291cmNlKiBSb3RhdGVDb3VudGVyQ2xvY2t3aXNlKGludDMyX3QmIGUpOw0KKyAgQ0JDX0x1bWluYW5jZVNvdXJjZSogQ3JvcChpbnQzMl90IGxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCk7DQogDQotICAgIENGWF9CeXRlQXJyYXkgKkdldFJvdyhpbnQzMl90IHksIENGWF9CeXRlQXJyYXkgJnJvdywgaW50MzJfdCAmZSk7DQotICAgIENGWF9CeXRlQXJyYXkgKkdldE1hdHJpeCgpOw0KLSAgICBGWF9CT09MIElzQ3JvcFN1cHBvcnRlZCgpOw0KLSAgICBGWF9CT09MIElzUm90YXRlU3VwcG9ydGVkKCk7DQotICAgIHZpcnR1YWwgdm9pZCBJbml0KGludDMyX3QgJmUpOw0KLXByaXZhdGU6DQotICAgIGludDMyX3QgbV9ieXRlc1BlckxpbmU7DQotICAgIGludDMyX3QgbV9sZWZ0Ow0KLSAgICBpbnQzMl90IG1fdG9wOw0KLSAgICBDRlhfSW50MzJBcnJheSBtX3JnYkRhdGE7DQotICAgIENGWF9ESUJpdG1hcCAqbV9wQml0bWFwOw0KLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyBtX2ZpbGVuYW1lOw0KKyAgQ0ZYX0J5dGVBcnJheSogR2V0Um93KGludDMyX3QgeSwgQ0ZYX0J5dGVBcnJheSYgcm93LCBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlQXJyYXkqIEdldE1hdHJpeCgpOw0KKyAgRlhfQk9PTCBJc0Nyb3BTdXBwb3J0ZWQoKTsNCisgIEZYX0JPT0wgSXNSb3RhdGVTdXBwb3J0ZWQoKTsNCisgIHZpcnR1YWwgdm9pZCBJbml0KGludDMyX3QmIGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBtX2J5dGVzUGVyTGluZTsNCisgIGludDMyX3QgbV9sZWZ0Ow0KKyAgaW50MzJfdCBtX3RvcDsNCisgIENGWF9JbnQzMkFycmF5IG1fcmdiRGF0YTsNCisgIENGWF9ESUJpdG1hcCogbV9wQml0bWFwOw0KKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgbV9maWxlbmFtZTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0RlY29kZXJSZXN1bHQuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0RlY29kZXJSZXN1bHQuaAppbmRleCAxZGNmYjhhLi43ZjU1YjVmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19EZWNvZGVyUmVzdWx0LmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfRGVjb2RlclJlc3VsdC5oCkBAIC03LDI2ICs3LDI4IEBACiAjaWZuZGVmIF9CQ19ERUNPREVSUkVTVUxUX0hfDQogI2RlZmluZSBfQkNfREVDT0RFUlJFU1VMVF9IXw0KIGNsYXNzIENCQ19EZWNvZGVyUmVzdWx0Ow0KLWNsYXNzIENCQ19EZWNvZGVyUmVzdWx0DQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0RlY29kZXJSZXN1bHQoQ0ZYX0J5dGVBcnJheSogcmF3Qnl0ZXMsIENGWF9CeXRlU3RyaW5nIHRleHQsICBDRlhfQnl0ZVN0cmluZyBlY0xldmVsKTsNCi0gICAgdmlydHVhbCB+Q0JDX0RlY29kZXJSZXN1bHQoKTsNCi0gICAgQ0ZYX0J5dGVBcnJheSogZ2V0UmF3Qnl0ZXMoKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgZ2V0VGV4dCgpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBnZXRFQ0xldmVsKCk7DQotICAgIGludDMyX3QgZ2V0RXJyb3JzQ29ycmVjdGVkKCk7DQotICAgIHZvaWQgc2V0RXJyb3JzQ29ycmVjdGVkKGludDMyX3QgZXJyb3JzQ29ycmVjdGVkKTsNCi0gICAgaW50MzJfdCBnZXRFcmFzdXJlcygpOw0KLSAgICB2b2lkIHNldEVyYXN1cmVzKGludDMyX3QgZXJhc3VyZXMpOw0KLSAgICB2b2lkKiBnZXRPdGhlcigpOw0KLSAgICB2b2lkIHNldE90aGVyKHZvaWQqIG90aGVyKTsNCi1wcml2YXRlOg0KLSAgICBDRlhfQnl0ZUFycmF5KiBtX3Jhd0J5dGVzOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBtX3RleHQ7DQotICAgIENGWF9CeXRlU3RyaW5nIG1fZWNMZXZlbDsNCi0gICAgaW50MzJfdCBtX2Vycm9yc0NvcnJlY3RlZDsNCi0gICAgaW50MzJfdCBtX2VyYXN1cmVzOw0KLSAgICB2b2lkKiBtX290aGVyOw0KK2NsYXNzIENCQ19EZWNvZGVyUmVzdWx0IHsNCisgcHVibGljOg0KKyAgQ0JDX0RlY29kZXJSZXN1bHQoQ0ZYX0J5dGVBcnJheSogcmF3Qnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZWNMZXZlbCk7DQorICB2aXJ0dWFsIH5DQkNfRGVjb2RlclJlc3VsdCgpOw0KKyAgQ0ZYX0J5dGVBcnJheSogZ2V0UmF3Qnl0ZXMoKTsNCisgIENGWF9CeXRlU3RyaW5nIGdldFRleHQoKTsNCisgIENGWF9CeXRlU3RyaW5nIGdldEVDTGV2ZWwoKTsNCisgIGludDMyX3QgZ2V0RXJyb3JzQ29ycmVjdGVkKCk7DQorICB2b2lkIHNldEVycm9yc0NvcnJlY3RlZChpbnQzMl90IGVycm9yc0NvcnJlY3RlZCk7DQorICBpbnQzMl90IGdldEVyYXN1cmVzKCk7DQorICB2b2lkIHNldEVyYXN1cmVzKGludDMyX3QgZXJhc3VyZXMpOw0KKyAgdm9pZCogZ2V0T3RoZXIoKTsNCisgIHZvaWQgc2V0T3RoZXIodm9pZCogb3RoZXIpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX0J5dGVBcnJheSogbV9yYXdCeXRlczsNCisgIENGWF9CeXRlU3RyaW5nIG1fdGV4dDsNCisgIENGWF9CeXRlU3RyaW5nIG1fZWNMZXZlbDsNCisgIGludDMyX3QgbV9lcnJvcnNDb3JyZWN0ZWQ7DQorICBpbnQzMl90IG1fZXJhc3VyZXM7DQorICB2b2lkKiBtX290aGVyOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5jcHAKaW5kZXggZGNkMzlhZS4uMTNjYzhkNSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uY3BwCkBAIC0yMywzMyArMjMsMjQgQEAKICNpbmNsdWRlICJiYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX0RpbWVuc2lvbi5oIg0KICNpbmNsdWRlICJkYXRhbWF0cml4L0JDX0VuY29kZXIuaCINCi1DQkNfRGltZW5zaW9uOjpDQkNfRGltZW5zaW9uKCkNCi17DQorQ0JDX0RpbWVuc2lvbjo6Q0JDX0RpbWVuc2lvbigpIHt9DQorQ0JDX0RpbWVuc2lvbjo6Q0JDX0RpbWVuc2lvbihpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCYgZSkgew0KKyAgaWYgKHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkhlaWdodEFuZFdpZHRoTXVzdEJlQXRMZWFzdDE7DQorICB9DQorICBtX3dpZHRoID0gd2lkdGg7DQorICBtX2hlaWdodCA9IGhlaWdodDsNCiB9DQotQ0JDX0RpbWVuc2lvbjo6Q0JDX0RpbWVuc2lvbihpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmICh3aWR0aCA8IDAgfHwgaGVpZ2h0IDwgMCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSGVpZ2h0QW5kV2lkdGhNdXN0QmVBdExlYXN0MTsNCi0gICAgfQ0KLSAgICBtX3dpZHRoID0gd2lkdGg7DQotICAgIG1faGVpZ2h0ID0gaGVpZ2h0Ow0KK0NCQ19EaW1lbnNpb246On5DQkNfRGltZW5zaW9uKCkge30NCitpbnQzMl90IENCQ19EaW1lbnNpb246OmdldFdpZHRoKCkgew0KKyAgcmV0dXJuIG1fd2lkdGg7DQogfQ0KLUNCQ19EaW1lbnNpb246On5DQkNfRGltZW5zaW9uKCkNCi17DQoraW50MzJfdCBDQkNfRGltZW5zaW9uOjpnZXRIZWlnaHQoKSB7DQorICByZXR1cm4gbV9oZWlnaHQ7DQogfQ0KLWludDMyX3QgQ0JDX0RpbWVuc2lvbjo6Z2V0V2lkdGgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fd2lkdGg7DQoraW50MzJfdCBDQkNfRGltZW5zaW9uOjpoYXNoQ29kZSgpIHsNCisgIHJldHVybiBtX3dpZHRoICogMzI3MTMgKyBtX2hlaWdodDsNCiB9DQotaW50MzJfdCBDQkNfRGltZW5zaW9uOjpnZXRIZWlnaHQoKQ0KLXsNCi0gICAgcmV0dXJuIG1faGVpZ2h0Ow0KLX0NCi1pbnQzMl90IENCQ19EaW1lbnNpb246Omhhc2hDb2RlKCkNCi17DQotICAgIHJldHVybiBtX3dpZHRoICogMzI3MTMgKyBtX2hlaWdodDsNCi19DQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX0RpbWVuc2lvbjo6dG9TdHJpbmcoKQ0KLXsNCi0gICAgcmV0dXJuIChGWF9XQ0hBUikobV93aWR0aCArIChGWF9XQ0hBUikneCcgKyBtX2hlaWdodCk7DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0RpbWVuc2lvbjo6dG9TdHJpbmcoKSB7DQorICByZXR1cm4gKEZYX1dDSEFSKShtX3dpZHRoICsgKEZYX1dDSEFSKSd4JyArIG1faGVpZ2h0KTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uaAppbmRleCA2NTVkNWU0Li45MGNmOTA5IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uaApAQCAtNywxOCArNywxOCBAQAogI2lmbmRlZiBfQkNfRElNRU5TSU9OX0hfDQogI2RlZmluZSBfQkNfRElNRU5TSU9OX0hfDQogY2xhc3MgQ0JDX0RpbWVuc2lvbjsNCi1jbGFzcyBDQkNfRGltZW5zaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0RpbWVuc2lvbigpOw0KLSAgICBDQkNfRGltZW5zaW9uKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90ICZlKTsNCi0gICAgdmlydHVhbCB+Q0JDX0RpbWVuc2lvbigpOw0KLSAgICBpbnQzMl90IGdldFdpZHRoKCk7DQotICAgIGludDMyX3QgZ2V0SGVpZ2h0KCk7DQotICAgIGludDMyX3QgaGFzaENvZGUoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgdG9TdHJpbmcoKTsNCi1wcml2YXRlOg0KLSAgICBpbnQzMl90IG1fd2lkdGg7DQotICAgIGludDMyX3QgbV9oZWlnaHQ7DQorY2xhc3MgQ0JDX0RpbWVuc2lvbiB7DQorIHB1YmxpYzoNCisgIENCQ19EaW1lbnNpb24oKTsNCisgIENCQ19EaW1lbnNpb24oaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB+Q0JDX0RpbWVuc2lvbigpOw0KKyAgaW50MzJfdCBnZXRXaWR0aCgpOw0KKyAgaW50MzJfdCBnZXRIZWlnaHQoKTsNCisgIGludDMyX3QgaGFzaENvZGUoKTsNCisgIENGWF9XaWRlU3RyaW5nIHRvU3RyaW5nKCk7DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fd2lkdGg7DQorICBpbnQzMl90IG1faGVpZ2h0Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfTGlicmFyeS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmNwcAppbmRleCA5MTdhOTAyLi41Zjg3NWI5IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmNwcApAQCAtODYsMzggKzg2LDM2IEBACiAjaW5jbHVkZSAicXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmgiDQogI2luY2x1ZGUgInFyY29kZS9CQ19RUkRhdGFNYXNrLmgiDQogI2luY2x1ZGUgInFyY29kZS9CQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCi12b2lkIEJDX0xpYnJhcnlfSW5pdCgpDQotew0KLSAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpJbml0aWFsaXplKCk7DQotICAgIENCQ19RUkNvZGVyTW9kZTo6SW5pdGlhbGl6ZSgpOw0KLSAgICBDQkNfUVJDb2RlclZlcnNpb246OkluaXRpYWxpemUoKTsNCi0gICAgQ0JDX1FSRGF0YU1hc2s6OkluaXRpYWxpemUoKTsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkluaXRpYWxpemUoKTsNCi0gICAgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpJbml0aWFsaXplKCk7DQotICAgIENCQ19TeW1ib2xJbmZvOjpJbml0aWFsaXplKCk7DQotICAgIENCQ19FcnJvckNvcnJlY3Rpb246OkluaXRpYWxpemUoKTsNCi0gICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKTsNCi0gICAgaW50MzJfdCBlID0gMDsNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpJbml0aWFsaXplKGUpOw0KLSAgICBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpJbml0aWFsaXplKCk7DQotICAgIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OkluaXRpYWxpemUoKTsNCi0gICAgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKGUpOw0KLSAgICBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpJbml0aWFsaXplKCk7DQordm9pZCBCQ19MaWJyYXJ5X0luaXQoKSB7DQorICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpJbml0aWFsaXplKCk7DQorICBDQkNfUVJDb2Rlck1vZGU6OkluaXRpYWxpemUoKTsNCisgIENCQ19RUkNvZGVyVmVyc2lvbjo6SW5pdGlhbGl6ZSgpOw0KKyAgQ0JDX1FSRGF0YU1hc2s6OkluaXRpYWxpemUoKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2OjpJbml0aWFsaXplKCk7DQorICBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkluaXRpYWxpemUoKTsNCisgIENCQ19TeW1ib2xJbmZvOjpJbml0aWFsaXplKCk7DQorICBDQkNfRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKCk7DQorICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6SW5pdGlhbGl6ZSgpOw0KKyAgaW50MzJfdCBlID0gMDsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNHRjo6SW5pdGlhbGl6ZShlKTsNCisgIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OkluaXRpYWxpemUoKTsNCisgIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OkluaXRpYWxpemUoKTsNCisgIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6SW5pdGlhbGl6ZShlKTsNCisgIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OkluaXRpYWxpemUoKTsNCiB9DQotdm9pZCBCQ19MaWJyYXJ5X0Rlc3RvcnkoKQ0KLXsNCi0gICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6RmluYWxpemUoKTsNCi0gICAgQ0JDX1FSQ29kZXJNb2RlOjpGaW5hbGl6ZSgpOw0KLSAgICBDQkNfUVJDb2RlclZlcnNpb246OkZpbmFsaXplKCk7DQotICAgIENCQ19RUkRhdGFNYXNrOjpGaW5hbGl6ZSgpOw0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1Njo6RmluYWxpemUoKTsNCi0gICAgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpGaW5hbGl6ZSgpOw0KLSAgICBDQkNfU3ltYm9sSW5mbzo6RmluYWxpemUoKTsNCi0gICAgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6RmluYWxpemUoKTsNCi0gICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCk7DQotICAgIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OkZpbmFsaXplKCk7DQotICAgIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OkZpbmFsaXplKCk7DQotICAgIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6RmluYWxpemUoKTsNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpGaW5hbGl6ZSgpOw0KLSAgICBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpGaW5hbGl6ZSgpOw0KK3ZvaWQgQkNfTGlicmFyeV9EZXN0b3J5KCkgew0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6RmluYWxpemUoKTsNCisgIENCQ19RUkNvZGVyTW9kZTo6RmluYWxpemUoKTsNCisgIENCQ19RUkNvZGVyVmVyc2lvbjo6RmluYWxpemUoKTsNCisgIENCQ19RUkRhdGFNYXNrOjpGaW5hbGl6ZSgpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkZpbmFsaXplKCk7DQorICBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkZpbmFsaXplKCk7DQorICBDQkNfU3ltYm9sSW5mbzo6RmluYWxpemUoKTsNCisgIENCQ19FcnJvckNvcnJlY3Rpb246OkZpbmFsaXplKCk7DQorICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6RmluYWxpemUoKTsNCisgIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OkZpbmFsaXplKCk7DQorICBDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyOjpGaW5hbGl6ZSgpOw0KKyAgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpGaW5hbGl6ZSgpOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpGaW5hbGl6ZSgpOw0KKyAgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6RmluYWxpemUoKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfTHVtaW5hbmNlU291cmNlLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0x1bWluYW5jZVNvdXJjZS5jcHAKaW5kZXggYjY1NjM4OS4uZmVmNWUwMyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvQkNfTHVtaW5hbmNlU291cmNlLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19MdW1pbmFuY2VTb3VyY2UuY3BwCkBAIC0yMiwxNyArMjIsMTIgQEAKIA0KICNpbmNsdWRlICJiYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX0x1bWluYW5jZVNvdXJjZS5oIg0KLUNCQ19MdW1pbmFuY2VTb3VyY2U6OkNCQ19MdW1pbmFuY2VTb3VyY2UoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOiBtX3dpZHRoKHdpZHRoKSwgbV9oZWlnaHQoaGVpZ2h0KQ0KLXsNCitDQkNfTHVtaW5hbmNlU291cmNlOjpDQkNfTHVtaW5hbmNlU291cmNlKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KQ0KKyAgICA6IG1fd2lkdGgod2lkdGgpLCBtX2hlaWdodChoZWlnaHQpIHt9DQorQ0JDX0x1bWluYW5jZVNvdXJjZTo6fkNCQ19MdW1pbmFuY2VTb3VyY2UoKSB7fQ0KK2ludDMyX3QgQ0JDX0x1bWluYW5jZVNvdXJjZTo6R2V0V2lkdGgoKSB7DQorICByZXR1cm4gbV93aWR0aDsNCiB9DQotQ0JDX0x1bWluYW5jZVNvdXJjZTo6fkNCQ19MdW1pbmFuY2VTb3VyY2UoKQ0KLXsNCi19DQotaW50MzJfdCBDQkNfTHVtaW5hbmNlU291cmNlOjpHZXRXaWR0aCgpDQotew0KLSAgICByZXR1cm4gbV93aWR0aDsNCi19DQotaW50MzJfdCBDQkNfTHVtaW5hbmNlU291cmNlOjpHZXRIZWlnaHQoKQ0KLXsNCi0gICAgcmV0dXJuIG1faGVpZ2h0Ow0KK2ludDMyX3QgQ0JDX0x1bWluYW5jZVNvdXJjZTo6R2V0SGVpZ2h0KCkgew0KKyAgcmV0dXJuIG1faGVpZ2h0Ow0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19MdW1pbmFuY2VTb3VyY2UuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0x1bWluYW5jZVNvdXJjZS5oCmluZGV4IDE2ODg2OGUuLmFiZjJkMjMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0x1bWluYW5jZVNvdXJjZS5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0x1bWluYW5jZVNvdXJjZS5oCkBAIC03LDI4ICs3LDIyIEBACiAjaWZuZGVmIF9CQ19MVU1JTkFOQ0VTT1VSQ0VfSA0KICNkZWZpbmUgX0JDX0xVTUlOQU5DRVNPVVJDRV9IDQogY2xhc3MgQ0JDX0x1bWluYW5jZVNvdXJjZTsNCi1jbGFzcyBDQkNfTHVtaW5hbmNlU291cmNlDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0x1bWluYW5jZVNvdXJjZShpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7DQotICAgIHZpcnR1YWwgfkNCQ19MdW1pbmFuY2VTb3VyY2UoKTsNCi0gICAgaW50MzJfdCBHZXRXaWR0aCgpOw0KLSAgICBpbnQzMl90IEdldEhlaWdodCgpOw0KK2NsYXNzIENCQ19MdW1pbmFuY2VTb3VyY2Ugew0KKyBwdWJsaWM6DQorICBDQkNfTHVtaW5hbmNlU291cmNlKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsNCisgIHZpcnR1YWwgfkNCQ19MdW1pbmFuY2VTb3VyY2UoKTsNCisgIGludDMyX3QgR2V0V2lkdGgoKTsNCisgIGludDMyX3QgR2V0SGVpZ2h0KCk7DQogDQotICAgIHZpcnR1YWwgQ0ZYX0J5dGVBcnJheSAqR2V0Um93KGludDMyX3QgeSwgQ0ZYX0J5dGVBcnJheSAmcm93LCBpbnQzMl90ICZlKSA9IDA7DQotICAgIHZpcnR1YWwgQ0ZYX0J5dGVBcnJheSAqR2V0TWF0cml4KCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgSXNDcm9wU3VwcG9ydGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQk9PTCBJc1JvdGF0ZVN1cHBvcnRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KKyAgdmlydHVhbCBDRlhfQnl0ZUFycmF5KiBHZXRSb3coaW50MzJfdCB5LCBDRlhfQnl0ZUFycmF5JiByb3csIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgQ0ZYX0J5dGVBcnJheSogR2V0TWF0cml4KCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzQ3JvcFN1cHBvcnRlZCgpIHsgcmV0dXJuIEZBTFNFOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNSb3RhdGVTdXBwb3J0ZWQoKSB7IHJldHVybiBGQUxTRTsgfQ0KIA0KLSAgICB2aXJ0dWFsIENCQ19MdW1pbmFuY2VTb3VyY2UgKlJvdGF0ZUNvdW50ZXJDbG9ja3dpc2UoaW50MzJfdCAmZSkgPSAwOw0KLXByb3RlY3RlZDoNCi0gICAgaW50MzJfdCBtX3dpZHRoOw0KLSAgICBpbnQzMl90IG1faGVpZ2h0Ow0KKyAgdmlydHVhbCBDQkNfTHVtaW5hbmNlU291cmNlKiBSb3RhdGVDb3VudGVyQ2xvY2t3aXNlKGludDMyX3QmIGUpID0gMDsNCisNCisgcHJvdGVjdGVkOg0KKyAgaW50MzJfdCBtX3dpZHRoOw0KKyAgaW50MzJfdCBtX2hlaWdodDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuY3BwCmluZGV4IDNiMDkyOWIuLmM5OTE2ODcgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmNwcApAQCAtNiw5ICs2LDUgQEAKIA0KICNpbmNsdWRlICJiYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX1JlYWRlci5oIg0KLUNCQ19SZWFkZXI6OkNCQ19SZWFkZXIoKQ0KLXsNCi19DQotQ0JDX1JlYWRlcjo6fkNCQ19SZWFkZXIoKQ0KLXsNCi19DQorQ0JDX1JlYWRlcjo6Q0JDX1JlYWRlcigpIHt9DQorQ0JDX1JlYWRlcjo6fkNCQ19SZWFkZXIoKSB7fQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmgKaW5kZXggMGRiNjk5ZC4uYmE1ZDUxMiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmgKQEAgLTgsMTIgKzgsMTMgQEAKICNkZWZpbmUgX0JDX1JFQURFUl9IXw0KIGNsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQogY2xhc3MgQ0JDX1JlYWRlcjsNCi1jbGFzcyBDQkNfUmVhZGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX1JlYWRlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUmVhZGVyKCk7DQotICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBpbnQzMl90ICZlKSA9IDA7DQotICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKSA9IDA7DQorY2xhc3MgQ0JDX1JlYWRlciB7DQorIHB1YmxpYzoNCisgIENCQ19SZWFkZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19SZWFkZXIoKTsNCisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLCBpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSA9IDA7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZXN1bHRQb2ludC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZXN1bHRQb2ludC5jcHAKaW5kZXggNmYxYWFjNC4uN2ZiMTI3YyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmNwcApAQCAtMjIsMTQgKzIyLDEwIEBACiANCiAjaW5jbHVkZSAiYmFyY29kZS5oIg0KICNpbmNsdWRlICJCQ19SZXN1bHRQb2ludC5oIg0KLUNCQ19SZXN1bHRQb2ludDo6Q0JDX1Jlc3VsdFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOiBtX3goeCksIG1feSh5KQ0KLXsNCitDQkNfUmVzdWx0UG9pbnQ6OkNCQ19SZXN1bHRQb2ludChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSA6IG1feCh4KSwgbV95KHkpIHt9DQorRlhfRkxPQVQgQ0JDX1Jlc3VsdFBvaW50OjpHZXRYKCkgew0KKyAgcmV0dXJuIG1feDsNCiB9DQotRlhfRkxPQVQgQ0JDX1Jlc3VsdFBvaW50OjpHZXRYKCkNCi17DQotICAgIHJldHVybiBtX3g7DQotfQ0KLUZYX0ZMT0FUIENCQ19SZXN1bHRQb2ludDo6R2V0WSgpDQotew0KLSAgICByZXR1cm4gbV95Ow0KK0ZYX0ZMT0FUIENCQ19SZXN1bHRQb2ludDo6R2V0WSgpIHsNCisgIHJldHVybiBtX3k7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZXN1bHRQb2ludC5oCmluZGV4IDAzYTIzZDQuLmU3ZDFmM2UgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuaApAQCAtNywxOCArNywxNiBAQAogI2lmbmRlZiBfQkNfUkVTVUxUUE9JTlRfSF8NCiAjZGVmaW5lIF9CQ19SRVNVTFRQT0lOVF9IXw0KIGNsYXNzIENCQ19SZXN1bHRQb2ludDsNCi1jbGFzcyBDQkNfUmVzdWx0UG9pbnQNCi17DQotcHVibGljOg0KLSAgICBDQkNfUmVzdWx0UG9pbnQoKTsNCi0gICAgQ0JDX1Jlc3VsdFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUmVzdWx0UG9pbnQoKQ0KLSAgICB7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9GTE9BVCBHZXRYKCk7DQotICAgIHZpcnR1YWwgRlhfRkxPQVQgR2V0WSgpOw0KLXByb3RlY3RlZDoNCi0gICAgRlhfRkxPQVQgbV94Ow0KLSAgICBGWF9GTE9BVCBtX3k7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50IHsNCisgcHVibGljOg0KKyAgQ0JDX1Jlc3VsdFBvaW50KCk7DQorICBDQkNfUmVzdWx0UG9pbnQoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7DQorICB2aXJ0dWFsIH5DQkNfUmVzdWx0UG9pbnQoKSB7fQ0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRYKCk7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldFkoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfRkxPQVQgbV94Ow0KKyAgRlhfRkxPQVQgbV95Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5jcHAKaW5kZXggN2MyNjFhYS4uZWJhNGYxNCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuY3BwCkBAIC04LDEzMCArOCwxNDEgQEAKICNpbmNsdWRlICJjb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQogI2luY2x1ZGUgIkJDX1dyaXRlci5oIg0KICNpbmNsdWRlICJCQ19Ud29EaW1Xcml0ZXIuaCINCi1DQkNfVHdvRGltV3JpdGVyOjpDQkNfVHdvRGltV3JpdGVyKCkNCi17DQotICAgIG1faUNvcnJlY3RMZXZlbAkJPSAxOw0KLSAgICBtX2JGaXhlZFNpemUJCT0gVFJVRTsNCitDQkNfVHdvRGltV3JpdGVyOjpDQkNfVHdvRGltV3JpdGVyKCkgew0KKyAgbV9pQ29ycmVjdExldmVsID0gMTsNCisgIG1fYkZpeGVkU2l6ZSA9IFRSVUU7DQorICBtX291dHB1dCA9IE5VTEw7DQorfQ0KK0NCQ19Ud29EaW1Xcml0ZXI6On5DQkNfVHdvRGltV3JpdGVyKCkgew0KKyAgaWYgKG1fb3V0cHV0ICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fb3V0cHV0Ow0KICAgICBtX291dHB1dCA9IE5VTEw7DQorICB9DQogfQ0KLUNCQ19Ud29EaW1Xcml0ZXI6On5DQkNfVHdvRGltV3JpdGVyKCkNCi17DQotICAgIGlmIChtX291dHB1dCAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgbV9vdXRwdXQ7DQotICAgICAgICBtX291dHB1dCA9IE5VTEw7DQordm9pZCBDQkNfVHdvRGltV3JpdGVyOjpSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIHN0YXRlRGF0YTsNCisgIENGWF9QYXRoRGF0YSBwYXRoOw0KKyAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIChGWF9GTE9BVCltX1dpZHRoLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgZGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgbWF0cml4LCAmc3RhdGVEYXRhLCBtX2JhY2tncm91bmRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgbV9iYWNrZ3JvdW5kQ29sb3IsIEZYRklMTF9BTFRFUk5BVEUpOw0KKyAgaW50MzJfdCBsZWZ0UG9zID0gMDsNCisgIGludDMyX3QgdG9wUG9zID0gMDsNCisgIGlmIChtX2JGaXhlZFNpemUpIHsNCisgICAgbGVmdFBvcyA9IChtX1dpZHRoIC0gbV9vdXRwdXQtPkdldFdpZHRoKCkpIC8gMjsNCisgICAgdG9wUG9zID0gKG1fSGVpZ2h0IC0gbV9vdXRwdXQtPkdldEhlaWdodCgpKSAvIDI7DQorICB9DQorICBDRlhfTWF0cml4IG1hdHJpID0gKm1hdHJpeDsNCisgIGlmIChtX1dpZHRoIDwgbV9vdXRwdXQtPkdldFdpZHRoKCkgJiYgbV9IZWlnaHQgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCkpIHsNCisgICAgQ0ZYX01hdHJpeCBtYXRyaVNjYWxlKA0KKyAgICAgICAgKEZYX0ZMT0FUKW1fV2lkdGggLyAoRlhfRkxPQVQpbV9vdXRwdXQtPkdldFdpZHRoKCksIDAuMCwgMC4wLA0KKyAgICAgICAgKEZYX0ZMT0FUKW1fSGVpZ2h0IC8gKEZYX0ZMT0FUKW1fb3V0cHV0LT5HZXRIZWlnaHQoKSwgMC4wLCAwLjApOw0KKyAgICBtYXRyaVNjYWxlLkNvbmNhdCgqbWF0cml4KTsNCisgICAgbWF0cmkgPSBtYXRyaVNjYWxlOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbV9vdXRwdXQtPkdldFdpZHRoKCk7IHgrKykgew0KKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCk7IHkrKykgew0KKyAgICAgIENGWF9QYXRoRGF0YSByZWN0Ow0KKyAgICAgIHJlY3QuQXBwZW5kUmVjdCgoRlhfRkxPQVQpbGVmdFBvcyArIHgsIChGWF9GTE9BVCl0b3BQb3MgKyB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3MgKyB4ICsgMSksIChGWF9GTE9BVCkodG9wUG9zICsgeSArIDEpKTsNCisgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgc3RhdGVEYXRhOw0KKyAgICAgIGlmIChtX291dHB1dC0+R2V0KHgsIHkpKSB7DQorICAgICAgICBkZXZpY2UtPkRyYXdQYXRoKCZyZWN0LCAmbWF0cmksICZzdGF0ZURhdGEsIG1fYmFyQ29sb3IsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HKTsNCisgICAgICB9DQogICAgIH0NCisgIH0NCiB9DQotdm9pZCBDQkNfVHdvRGltV3JpdGVyOjpSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpDQotew0KLSAgICBDRlhfR3JhcGhTdGF0ZURhdGEgc3RhdGVEYXRhOw0KLSAgICBDRlhfUGF0aERhdGEgcGF0aDsNCi0gICAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIChGWF9GTE9BVCltX1dpZHRoLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KLSAgICBkZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBtYXRyaXgsICZzdGF0ZURhdGEsIG1fYmFja2dyb3VuZENvbG9yLCBtX2JhY2tncm91bmRDb2xvciwgRlhGSUxMX0FMVEVSTkFURSk7DQotICAgIGludDMyX3QgbGVmdFBvcyA9IDA7DQotICAgIGludDMyX3QgdG9wUG9zID0gMDsNCi0gICAgaWYgKCBtX2JGaXhlZFNpemUpIHsNCi0gICAgICAgIGxlZnRQb3MgPSAobV9XaWR0aCAtIG1fb3V0cHV0LT5HZXRXaWR0aCgpKSAvIDI7DQotICAgICAgICB0b3BQb3MgPSAobV9IZWlnaHQgLSBtX291dHB1dC0+R2V0SGVpZ2h0KCkpIC8gMjsNCit2b2lkIENCQ19Ud29EaW1Xcml0ZXI6OlJlbmRlckJpdG1hcFJlc3VsdChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtX2JGaXhlZFNpemUpIHsNCisgICAgcE91dEJpdG1hcCA9IENyZWF0ZURJQml0bWFwKG1fV2lkdGgsIG1fSGVpZ2h0KTsNCisgIH0gZWxzZSB7DQorICAgIHBPdXRCaXRtYXAgPSBDcmVhdGVESUJpdG1hcChtX291dHB1dC0+R2V0V2lkdGgoKSwgbV9vdXRwdXQtPkdldEhlaWdodCgpKTsNCisgIH0NCisgIGlmICghcE91dEJpdG1hcCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25GYWlsVG9DcmVhdGVCaXRtYXA7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBPdXRCaXRtYXAtPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCisgIGludDMyX3QgbGVmdFBvcyA9IDA7DQorICBpbnQzMl90IHRvcFBvcyA9IDA7DQorICBpZiAobV9iRml4ZWRTaXplKSB7DQorICAgIGxlZnRQb3MgPSAobV9XaWR0aCAtIG1fb3V0cHV0LT5HZXRXaWR0aCgpKSAvIDI7DQorICAgIHRvcFBvcyA9IChtX0hlaWdodCAtIG1fb3V0cHV0LT5HZXRIZWlnaHQoKSkgLyAyOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbV9vdXRwdXQtPkdldFdpZHRoKCk7IHgrKykgew0KKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCk7IHkrKykgew0KKyAgICAgIGlmIChtX291dHB1dC0+R2V0KHgsIHkpKSB7DQorICAgICAgICBwT3V0Qml0bWFwLT5TZXRQaXhlbChsZWZ0UG9zICsgeCwgdG9wUG9zICsgeSwgbV9iYXJDb2xvcik7DQorICAgICAgfQ0KICAgICB9DQotICAgIENGWF9NYXRyaXggbWF0cmkgPSAqbWF0cml4Ow0KLSAgICBpZiAobV9XaWR0aCA8IG1fb3V0cHV0LT5HZXRXaWR0aCgpICYmIG1fSGVpZ2h0IDwgbV9vdXRwdXQtPkdldEhlaWdodCgpKSB7DQotICAgICAgICBDRlhfTWF0cml4IG1hdHJpU2NhbGUoKEZYX0ZMT0FUKW1fV2lkdGggLyAoRlhfRkxPQVQpbV9vdXRwdXQtPkdldFdpZHRoKCksIDAuMCwgMC4wLCAoRlhfRkxPQVQpbV9IZWlnaHQgLyAoRlhfRkxPQVQpbV9vdXRwdXQtPkdldEhlaWdodCgpLCAwLjAsIDAuMCk7DQotICAgICAgICBtYXRyaVNjYWxlLkNvbmNhdCgqbWF0cml4KTsNCi0gICAgICAgIG1hdHJpID0gbWF0cmlTY2FsZTsNCisgIH0NCisgIGlmICghbV9iRml4ZWRTaXplKSB7DQorICAgIENGWF9ESUJpdG1hcCogcFN0cmV0Y2hCaXRtYXAgPSBwT3V0Qml0bWFwLT5TdHJldGNoVG8obV9XaWR0aCwgbV9IZWlnaHQpOw0KKyAgICBpZiAocE91dEJpdG1hcCkgew0KKyAgICAgIGRlbGV0ZSBwT3V0Qml0bWFwOw0KICAgICB9DQotICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1fb3V0cHV0LT5HZXRXaWR0aCgpOyB4KyspIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1fb3V0cHV0LT5HZXRIZWlnaHQoKTsgeSsrKSB7DQotICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIHJlY3Q7DQotICAgICAgICAgICAgcmVjdC5BcHBlbmRSZWN0KChGWF9GTE9BVClsZWZ0UG9zICsgeCwgKEZYX0ZMT0FUKXRvcFBvcyArIHksIChGWF9GTE9BVCkobGVmdFBvcyArIHggKyAxKSwgKEZYX0ZMT0FUKSh0b3BQb3MgKyB5ICsgMSkpOw0KLSAgICAgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBzdGF0ZURhdGE7DQotICAgICAgICAgICAgaWYobV9vdXRwdXQtPkdldCh4LCB5KSkgew0KLSAgICAgICAgICAgICAgICBkZXZpY2UtPkRyYXdQYXRoKCZyZWN0LCAmbWF0cmksICZzdGF0ZURhdGEsIG1fYmFyQ29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCisgICAgcE91dEJpdG1hcCA9IHBTdHJldGNoQml0bWFwOw0KKyAgfQ0KIH0NCi12b2lkIENCQ19Ud29EaW1Xcml0ZXI6OlJlbmRlckJpdG1hcFJlc3VsdChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBpbnQzMl90JiBlKQ0KLXsNCi0gICAgaWYgKG1fYkZpeGVkU2l6ZSkgew0KLSAgICAgICAgcE91dEJpdG1hcCA9IENyZWF0ZURJQml0bWFwKG1fV2lkdGgsIG1fSGVpZ2h0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBPdXRCaXRtYXAgPSBDcmVhdGVESUJpdG1hcChtX291dHB1dC0+R2V0V2lkdGgoKSwgbV9vdXRwdXQtPkdldEhlaWdodCgpKTsNCit2b2lkIENCQ19Ud29EaW1Xcml0ZXI6OlJlbmRlclJlc3VsdCh1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGlucHV0V2lkdGggPSBjb2RlV2lkdGg7DQorICBpbnQzMl90IGlucHV0SGVpZ2h0ID0gY29kZUhlaWdodDsNCisgIGludDMyX3QgdGVtcFdpZHRoID0gaW5wdXRXaWR0aCArICgxIDw8IDEpOw0KKyAgaW50MzJfdCB0ZW1wSGVpZ2h0ID0gaW5wdXRIZWlnaHQgKyAoMSA8PCAxKTsNCisgIEZYX0ZMT0FUIG1vZHVsZUhTaXplID0gKEZYX0ZMT0FUKUZYX01JTihtX01vZHVsZVdpZHRoLCBtX01vZHVsZUhlaWdodCk7DQorICBpZiAobW9kdWxlSFNpemUgPiA4KSB7DQorICAgIG1vZHVsZUhTaXplID0gODsNCisgIH0gZWxzZSBpZiAobW9kdWxlSFNpemUgPCAxKSB7DQorICAgIG1vZHVsZUhTaXplID0gMTsNCisgIH0NCisgIGludDMyX3Qgb3V0cHV0V2lkdGggPSAoaW50MzJfdClGWF9NQVgodGVtcFdpZHRoICogbW9kdWxlSFNpemUsIHRlbXBXaWR0aCk7DQorICBpbnQzMl90IG91dHB1dEhlaWdodCA9IChpbnQzMl90KUZYX01BWCh0ZW1wSGVpZ2h0ICogbW9kdWxlSFNpemUsIHRlbXBIZWlnaHQpOw0KKyAgaW50MzJfdCBtdWx0aVggPSAxOw0KKyAgaW50MzJfdCBtdWx0aVkgPSAxOw0KKyAgaWYgKG1fYkZpeGVkU2l6ZSkgew0KKyAgICBpZiAobV9XaWR0aCA8IG91dHB1dFdpZHRoIHx8IG1fSGVpZ2h0IDwgb3V0cHV0SGVpZ2h0KSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uQml0bWFwU2l6ZUVycm9yOw0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KLSAgICBpZiAoIXBPdXRCaXRtYXApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZhaWxUb0NyZWF0ZUJpdG1hcDsNCi0gICAgICAgIHJldHVybjsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX1dpZHRoID4gb3V0cHV0V2lkdGggfHwgbV9IZWlnaHQgPiBvdXRwdXRIZWlnaHQpIHsNCisgICAgICBvdXRwdXRXaWR0aCA9IChpbnQzMl90KShvdXRwdXRXaWR0aCAqDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VpbCgoRlhfRkxPQVQpbV9XaWR0aCAvIChGWF9GTE9BVClvdXRwdXRXaWR0aCkpOw0KKyAgICAgIG91dHB1dEhlaWdodCA9IChpbnQzMl90KSgNCisgICAgICAgICAgb3V0cHV0SGVpZ2h0ICogY2VpbCgoRlhfRkxPQVQpbV9IZWlnaHQgLyAoRlhfRkxPQVQpb3V0cHV0SGVpZ2h0KSk7DQogICAgIH0NCi0gICAgcE91dEJpdG1hcC0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOw0KLSAgICBpbnQzMl90IGxlZnRQb3MgPSAwOw0KLSAgICBpbnQzMl90IHRvcFBvcyA9IDA7DQotICAgIGlmICggbV9iRml4ZWRTaXplKSB7DQotICAgICAgICBsZWZ0UG9zID0gKG1fV2lkdGggLSBtX291dHB1dC0+R2V0V2lkdGgoKSkgLyAyOw0KLSAgICAgICAgdG9wUG9zID0gKG1fSGVpZ2h0IC0gbV9vdXRwdXQtPkdldEhlaWdodCgpKSAvIDI7DQorICB9DQorICBtdWx0aVggPSAoaW50MzJfdCljZWlsKChGWF9GTE9BVClvdXRwdXRXaWR0aCAvIChGWF9GTE9BVCl0ZW1wV2lkdGgpOw0KKyAgbXVsdGlZID0gKGludDMyX3QpY2VpbCgoRlhfRkxPQVQpb3V0cHV0SGVpZ2h0IC8gKEZYX0ZMT0FUKXRlbXBIZWlnaHQpOw0KKyAgaWYgKG1fYkZpeGVkU2l6ZSkgew0KKyAgICBtdWx0aVggPSBGWF9NSU4obXVsdGlYLCBtdWx0aVkpOw0KKyAgICBtdWx0aVkgPSBtdWx0aVg7DQorICB9DQorICBpbnQzMl90IGxlZnRQYWRkaW5nID0gKG91dHB1dFdpZHRoIC0gKGlucHV0V2lkdGggKiBtdWx0aVgpKSAvIDI7DQorICBpbnQzMl90IHRvcFBhZGRpbmcgPSAob3V0cHV0SGVpZ2h0IC0gKGlucHV0SGVpZ2h0ICogbXVsdGlZKSkgLyAyOw0KKyAgaWYgKGxlZnRQYWRkaW5nIDwgMCkgew0KKyAgICBsZWZ0UGFkZGluZyA9IDA7DQorICB9DQorICBpZiAodG9wUGFkZGluZyA8IDApIHsNCisgICAgdG9wUGFkZGluZyA9IDA7DQorICB9DQorICBtX291dHB1dCA9IEZYX05FVyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KKyAgbV9vdXRwdXQtPkluaXQob3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7DQorICBmb3IgKGludDMyX3QgaW5wdXRZID0gMCwgb3V0cHV0WSA9IHRvcFBhZGRpbmc7DQorICAgICAgIChpbnB1dFkgPCBpbnB1dEhlaWdodCkgJiYgKG91dHB1dFkgPCBvdXRwdXRIZWlnaHQgLSBtdWx0aVkpOw0KKyAgICAgICBpbnB1dFkrKywgb3V0cHV0WSArPSBtdWx0aVkpIHsNCisgICAgZm9yIChpbnQzMl90IGlucHV0WCA9IDAsIG91dHB1dFggPSBsZWZ0UGFkZGluZzsNCisgICAgICAgICAoaW5wdXRYIDwgaW5wdXRXaWR0aCkgJiYgKG91dHB1dFggPCBvdXRwdXRXaWR0aCAtIG11bHRpWCk7DQorICAgICAgICAgaW5wdXRYKyssIG91dHB1dFggKz0gbXVsdGlYKSB7DQorICAgICAgaWYgKGNvZGVbaW5wdXRYICsgaW5wdXRZICogaW5wdXRXaWR0aF0gPT0gMSkgew0KKyAgICAgICAgbV9vdXRwdXQtPlNldFJlZ2lvbihvdXRwdXRYLCBvdXRwdXRZLCBtdWx0aVgsIG11bHRpWSwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbV9vdXRwdXQtPkdldFdpZHRoKCk7IHgrKykgew0KLSAgICAgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbV9vdXRwdXQtPkdldEhlaWdodCgpOyB5KyspIHsNCi0gICAgICAgICAgICBpZiAobV9vdXRwdXQtPkdldCh4LCB5KSkgew0KLSAgICAgICAgICAgICAgICBwT3V0Qml0bWFwLT5TZXRQaXhlbChsZWZ0UG9zICsgeCwgdG9wUG9zICsgeSwgbV9iYXJDb2xvcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmICghbV9iRml4ZWRTaXplKSB7DQotICAgICAgICBDRlhfRElCaXRtYXAgKiBwU3RyZXRjaEJpdG1hcCA9IHBPdXRCaXRtYXAtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7DQotICAgICAgICBpZiAocE91dEJpdG1hcCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBwT3V0Qml0bWFwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcE91dEJpdG1hcCA9IHBTdHJldGNoQml0bWFwOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0JDX1R3b0RpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KHVpbnQ4X3QgKmNvZGUsIGludDMyX3QgY29kZVdpZHRoLCBpbnQzMl90IGNvZGVIZWlnaHQsIGludDMyX3QgJmUpDQotew0KLSAgICBpbnQzMl90IGlucHV0V2lkdGggPSBjb2RlV2lkdGg7DQotICAgIGludDMyX3QgaW5wdXRIZWlnaHQgPSBjb2RlSGVpZ2h0Ow0KLSAgICBpbnQzMl90IHRlbXBXaWR0aCA9IGlucHV0V2lkdGggKyAoMSA8PCAxKTsNCi0gICAgaW50MzJfdCB0ZW1wSGVpZ2h0ID0gaW5wdXRIZWlnaHQgKyAoMSA8PCAxKTsNCi0gICAgRlhfRkxPQVQgbW9kdWxlSFNpemUgPSAoRlhfRkxPQVQpRlhfTUlOKG1fTW9kdWxlV2lkdGgsIG1fTW9kdWxlSGVpZ2h0KTsNCi0gICAgaWYgKG1vZHVsZUhTaXplID4gOCkgew0KLSAgICAgICAgbW9kdWxlSFNpemUgPSA4Ow0KLSAgICB9IGVsc2UgaWYgKG1vZHVsZUhTaXplIDwgMSkgew0KLSAgICAgICAgbW9kdWxlSFNpemUgPSAxOw0KLSAgICB9DQotICAgIGludDMyX3Qgb3V0cHV0V2lkdGggPSAoaW50MzJfdClGWF9NQVgodGVtcFdpZHRoICogbW9kdWxlSFNpemUsIHRlbXBXaWR0aCk7DQotICAgIGludDMyX3Qgb3V0cHV0SGVpZ2h0ID0gKGludDMyX3QpRlhfTUFYKHRlbXBIZWlnaHQgKiBtb2R1bGVIU2l6ZSwgdGVtcEhlaWdodCk7DQotICAgIGludDMyX3QgbXVsdGlYID0gMTsNCi0gICAgaW50MzJfdCBtdWx0aVkgPSAxOw0KLSAgICBpZiAobV9iRml4ZWRTaXplKSB7DQotICAgICAgICBpZiAobV9XaWR0aCA8IG91dHB1dFdpZHRoIHx8IG1fSGVpZ2h0IDwgb3V0cHV0SGVpZ2h0KSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uQml0bWFwU2l6ZUVycm9yOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChtX1dpZHRoID4gb3V0cHV0V2lkdGggfHwgbV9IZWlnaHQgPiBvdXRwdXRIZWlnaHQpIHsNCi0gICAgICAgICAgICBvdXRwdXRXaWR0aCA9IChpbnQzMl90KShvdXRwdXRXaWR0aCAqIGNlaWwgKCAoRlhfRkxPQVQpbV9XaWR0aCAvIChGWF9GTE9BVClvdXRwdXRXaWR0aCkpOw0KLSAgICAgICAgICAgIG91dHB1dEhlaWdodCA9IChpbnQzMl90KShvdXRwdXRIZWlnaHQgKiBjZWlsICggKEZYX0ZMT0FUKW1fSGVpZ2h0IC8gKEZYX0ZMT0FUKW91dHB1dEhlaWdodCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG11bHRpWCA9IChpbnQzMl90KWNlaWwoKEZYX0ZMT0FUKW91dHB1dFdpZHRoIC8gKEZYX0ZMT0FUKXRlbXBXaWR0aCk7DQotICAgIG11bHRpWSA9IChpbnQzMl90KWNlaWwoKEZYX0ZMT0FUKW91dHB1dEhlaWdodCAvIChGWF9GTE9BVCkgdGVtcEhlaWdodCk7DQotICAgIGlmIChtX2JGaXhlZFNpemUpIHsNCi0gICAgICAgIG11bHRpWCA9IEZYX01JTihtdWx0aVgsIG11bHRpWSk7DQotICAgICAgICBtdWx0aVkgPSBtdWx0aVg7DQotICAgIH0NCi0gICAgaW50MzJfdCBsZWZ0UGFkZGluZyA9IChvdXRwdXRXaWR0aCAtIChpbnB1dFdpZHRoICogbXVsdGlYKSkgLyAyOw0KLSAgICBpbnQzMl90IHRvcFBhZGRpbmcgPSAob3V0cHV0SGVpZ2h0IC0gKGlucHV0SGVpZ2h0ICogbXVsdGlZKSkgLyAyOw0KLSAgICBpZiAobGVmdFBhZGRpbmcgPCAwKSB7DQotICAgICAgICBsZWZ0UGFkZGluZyA9IDA7DQotICAgIH0NCi0gICAgaWYgKHRvcFBhZGRpbmcgPCAwKSB7DQotICAgICAgICB0b3BQYWRkaW5nID0gMDsNCi0gICAgfQ0KLSAgICBtX291dHB1dCA9IEZYX05FVyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KLSAgICBtX291dHB1dC0+SW5pdChvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsNCi0gICAgZm9yIChpbnQzMl90IGlucHV0WSA9IDAsIG91dHB1dFkgPSB0b3BQYWRkaW5nOyAoaW5wdXRZIDwgaW5wdXRIZWlnaHQpICYmIChvdXRwdXRZIDwgb3V0cHV0SGVpZ2h0IC0gbXVsdGlZKTsgaW5wdXRZKyssIG91dHB1dFkgKz0gbXVsdGlZKSB7DQotICAgICAgICBmb3IgKGludDMyX3QgaW5wdXRYID0gMCwgb3V0cHV0WCA9IGxlZnRQYWRkaW5nOyAoaW5wdXRYIDwgaW5wdXRXaWR0aCkgJiYgKG91dHB1dFggPCBvdXRwdXRXaWR0aCAtIG11bHRpWCk7IGlucHV0WCsrLCBvdXRwdXRYICs9IG11bHRpWCkgew0KLSAgICAgICAgICAgIGlmIChjb2RlW2lucHV0WCArIGlucHV0WSAqIGlucHV0V2lkdGhdID09IDEpIHsNCi0gICAgICAgICAgICAgICAgbV9vdXRwdXQtPlNldFJlZ2lvbihvdXRwdXRYLCBvdXRwdXRZLCBtdWx0aVgsIG11bHRpWSwgZSk7DQotICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KKyAgfQ0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oCmluZGV4IDllZDI5MzIuLjFhZmU1OWYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oCkBAIC0xMCwzNSArMTAsNDUgQEAKIGNsYXNzIENCQ19Xcml0ZXI7DQogY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCiBjbGFzcyBDQkNfVHdvRGltV3JpdGVyOw0KLWNsYXNzIENCQ19Ud29EaW1Xcml0ZXIgOiBwdWJsaWMgQ0JDX1dyaXRlcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19Ud29EaW1Xcml0ZXIoKTsNCi0gICAgdmlydHVhbCB+Q0JDX1R3b0RpbVdyaXRlcigpOw0KLSAgICB2aXJ0dWFsIHVpbnQ4X3QqCUVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsIGludDMyX3QgZWNMZXZlbCwgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCAgJmUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9Ow0KLSAgICB2aXJ0dWFsIHVpbnQ4X3QqCUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH07DQotICAgIHZpcnR1YWwgdWludDhfdCoJRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90ICZlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfTsNCi0gICAgdmlydHVhbCB2b2lkCQlSZW5kZXJSZXN1bHQodWludDhfdCAqY29kZSwgaW50MzJfdCBjb2RlV2lkdGgsIGludDMyX3QgY29kZUhlaWdodCwgaW50MzJfdCAmZSk7DQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgUmVuZGVyQml0bWFwUmVzdWx0KENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIGludDMyX3QmIGUpOw0KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIFJlbmRlckRldmljZVJlc3VsdChDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwgKGludDMyX3QgbGV2ZWwpID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90ICAgIEdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faUNvcnJlY3RMZXZlbDsNCi0gICAgfTsNCitjbGFzcyBDQkNfVHdvRGltV3JpdGVyIDogcHVibGljIENCQ19Xcml0ZXIgew0KKyBwdWJsaWM6DQorICBDQkNfVHdvRGltV3JpdGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfVHdvRGltV3JpdGVyKCk7DQorICB2aXJ0dWFsIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9Ow0KKyAgdmlydHVhbCB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH07DQorICB2aXJ0dWFsIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9Ow0KKyAgdmlydHVhbCB2b2lkIFJlbmRlclJlc3VsdCh1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJCaXRtYXBSZXN1bHQoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIHZvaWQgUmVuZGVyRGV2aWNlUmVzdWx0KENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSB7IHJldHVybiBtX2lDb3JyZWN0TGV2ZWw7IH07DQogDQotcHJvdGVjdGVkOg0KLSAgICBpbnQzMl90CQltX2lDb3JyZWN0TGV2ZWw7DQotICAgIEZYX0JPT0wJCQltX2JGaXhlZFNpemU7DQotICAgIENCQ19Db21tb25CaXRNYXRyaXgqICAgICBtX291dHB1dDsNCisgcHJvdGVjdGVkOg0KKyAgaW50MzJfdCBtX2lDb3JyZWN0TGV2ZWw7DQorICBGWF9CT09MIG1fYkZpeGVkU2l6ZTsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1fb3V0cHV0Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuY3BwCmluZGV4IDQ0MGRmN2MuLjBlNGQ0NDggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5jcHAKQEAgLTYsNDQgKzYsNDEgQEAKIA0KICNpbmNsdWRlICJiYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX1V0aWxDb2RpbmdDb252ZXJ0LmgiDQotQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpDQkNfVXRpbENvZGluZ0NvbnZlcnQoKQ0KLXsNCitDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OkNCQ19VdGlsQ29kaW5nQ29udmVydCgpIHt9DQorQ0JDX1V0aWxDb2RpbmdDb252ZXJ0Ojp+Q0JDX1V0aWxDb2RpbmdDb252ZXJ0KCkge30NCit2b2lkIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvTG9jYWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgZHN0KSB7DQorICBkc3QuQ29udmVydEZyb20oc3JjKTsNCiB9DQotQ0JDX1V0aWxDb2RpbmdDb252ZXJ0Ojp+Q0JDX1V0aWxDb2RpbmdDb252ZXJ0KCkNCi17DQordm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OkxvY2FsZVRvVXRmOChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGRzdCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3JjLCBzcmMuR2V0TGVuZ3RoKCkpOw0KKyAgZHN0ID0gdW5pY29kZS5VVEY4RW5jb2RlKCk7DQogfQ0KLXZvaWQgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVbmljb2RlVG9Mb2NhbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnNyYywgQ0ZYX0J5dGVTdHJpbmcgJmRzdCkNCi17DQotICAgIGRzdC5Db252ZXJ0RnJvbShzcmMpOw0KK3ZvaWQgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpMb2NhbGVUb1V0ZjgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlQXJyYXkmIGRzdCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3JjLCBzcmMuR2V0TGVuZ3RoKCkpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdXRmOCA9IHVuaWNvZGUuVVRGOEVuY29kZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdXRmOC5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIGRzdC5BZGQodXRmOFtpXSk7DQorICB9DQogfQ0KLXZvaWQgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpMb2NhbGVUb1V0ZjgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJnNyYywgQ0ZYX0J5dGVTdHJpbmcgJmRzdCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHVuaWNvZGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHNyYywgc3JjLkdldExlbmd0aCgpKTsNCi0gICAgZHN0ID0gdW5pY29kZS5VVEY4RW5jb2RlKCk7DQordm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlV0ZjhUb0xvY2FsZShjb25zdCBDRlhfQnl0ZUFycmF5JiBzcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgZHN0KSB7DQorICBDRlhfQnl0ZVN0cmluZyB1dGY4Ow0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc3JjLkdldFNpemUoKTsgaSsrKSB7DQorICAgIHV0ZjggKz0gc3JjW2ldOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCh1dGY4LCB1dGY4LkdldExlbmd0aCgpKTsNCisgIGRzdC5Db252ZXJ0RnJvbSh1bmljb2RlKTsNCiB9DQotdm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OkxvY2FsZVRvVXRmOChjb25zdCBDRlhfQnl0ZVN0cmluZyAmc3JjLCBDRlhfQnl0ZUFycmF5ICZkc3QpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB1bmljb2RlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzcmMsIHNyYy5HZXRMZW5ndGgoKSk7DQotICAgIENGWF9CeXRlU3RyaW5nIHV0ZjggPSB1bmljb2RlLlVURjhFbmNvZGUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdXRmOC5HZXRMZW5ndGgoKTsgaSArKykgew0KLSAgICAgICAgZHN0LkFkZCh1dGY4W2ldKTsNCi0gICAgfQ0KK3ZvaWQgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVdGY4VG9Mb2NhbGUoY29uc3QgdWludDhfdCogc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBkc3QpIHsNCisgIENGWF9XaWRlU3RyaW5nIHVuaWNvZGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKGNvbnN0IGNoYXIqKXNyYywgY291bnQpOw0KKyAgZHN0LkNvbnZlcnRGcm9tKHVuaWNvZGUpOw0KIH0NCi12b2lkIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VXRmOFRvTG9jYWxlKGNvbnN0IENGWF9CeXRlQXJyYXkgJnNyYywgQ0ZYX0J5dGVTdHJpbmcgJmRzdCkNCi17DQotICAgIENGWF9CeXRlU3RyaW5nIHV0Zjg7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNyYy5HZXRTaXplKCk7IGkgKyspIHsNCi0gICAgICAgIHV0ZjggKz0gc3JjW2ldOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHVuaWNvZGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgodXRmOCwgdXRmOC5HZXRMZW5ndGgoKSk7DQotICAgIGRzdC5Db252ZXJ0RnJvbSh1bmljb2RlKTsNCi19DQotdm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlV0ZjhUb0xvY2FsZShjb25zdCB1aW50OF90ICpzcmMsIGludDMyX3QgY291bnQsIENGWF9CeXRlU3RyaW5nICZkc3QpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB1bmljb2RlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KChjb25zdCBjaGFyKilzcmMsIGNvdW50KTsNCi0gICAgZHN0LkNvbnZlcnRGcm9tKHVuaWNvZGUpOw0KLX0NCi12b2lkIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChjb25zdCBDRlhfV2lkZVN0cmluZyAmc3JjLCBDRlhfQnl0ZVN0cmluZyAmZHN0KQ0KLXsNCi0gICAgZHN0ID0gc3JjLlVURjhFbmNvZGUoKTsNCit2b2lkIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBkc3QpIHsNCisgIGRzdCA9IHNyYy5VVEY4RW5jb2RlKCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oCmluZGV4IDE3NWQzMmUuLmU3YWQwYjEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaApAQCAtNiwxNyArNiwyMSBAQAogDQogI2lmbmRlZiBfQkNfVVRJTENPRElOR0NPTlZFUlRfSF8NCiAjZGVmaW5lIF9CQ19VVElMQ09ESU5HQ09OVkVSVF9IXw0KLWNsYXNzICBDQkNfVXRpbENvZGluZ0NvbnZlcnQ7DQotY2xhc3MgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0DQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0KCk7DQotICAgIHZpcnR1YWwgfkNCQ19VdGlsQ29kaW5nQ29udmVydCgpOw0KLSAgICBzdGF0aWMgdm9pZCBVbmljb2RlVG9Mb2NhbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnNvdXJjZSwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCk7DQotICAgIHN0YXRpYyB2b2lkIExvY2FsZVRvVXRmOChjb25zdCBDRlhfQnl0ZVN0cmluZyAmc291cmNlLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0KTsNCi0gICAgc3RhdGljIHZvaWQgTG9jYWxlVG9VdGY4KGNvbnN0IENGWF9CeXRlU3RyaW5nICZzb3VyY2UsIENGWF9CeXRlQXJyYXkgJnJlc3VsdCk7DQotICAgIHN0YXRpYyB2b2lkIFV0ZjhUb0xvY2FsZShjb25zdCBDRlhfQnl0ZUFycmF5ICZzb3VyY2UsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQpOw0KLSAgICBzdGF0aWMgdm9pZCBVdGY4VG9Mb2NhbGUoY29uc3QgdWludDhfdCAqc291cmNlLCBpbnQzMl90IGNvdW50LCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0KTsNCi0gICAgc3RhdGljIHZvaWQgVW5pY29kZVRvVVRGOChjb25zdCBDRlhfV2lkZVN0cmluZyAmc291cmNlLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0KTsNCitjbGFzcyBDQkNfVXRpbENvZGluZ0NvbnZlcnQ7DQorY2xhc3MgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0IHsNCisgcHVibGljOg0KKyAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0KCk7DQorICB2aXJ0dWFsIH5DQkNfVXRpbENvZGluZ0NvbnZlcnQoKTsNCisgIHN0YXRpYyB2b2lkIFVuaWNvZGVUb0xvY2FsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQpOw0KKyAgc3RhdGljIHZvaWQgTG9jYWxlVG9VdGY4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCk7DQorICBzdGF0aWMgdm9pZCBMb2NhbGVUb1V0ZjgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNvdXJjZSwgQ0ZYX0J5dGVBcnJheSYgcmVzdWx0KTsNCisgIHN0YXRpYyB2b2lkIFV0ZjhUb0xvY2FsZShjb25zdCBDRlhfQnl0ZUFycmF5JiBzb3VyY2UsIENGWF9CeXRlU3RyaW5nJiByZXN1bHQpOw0KKyAgc3RhdGljIHZvaWQgVXRmOFRvTG9jYWxlKGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQpOw0KKyAgc3RhdGljIHZvaWQgVW5pY29kZVRvVVRGOChjb25zdCBDRlhfV2lkZVN0cmluZyYgc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxSU1MuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbFJTUy5jcHAKaW5kZXggOGViZmI2ZC4uZDcyMDcwMSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbFJTUy5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbFJTUy5jcHAKQEAgLTIyLDE0MyArMjIsMTM5IEBACiANCiAjaW5jbHVkZSAiYmFyY29kZS5oIg0KICNpbmNsdWRlICJCQ19VdGlsUlNTLmgiDQotQ0JDX1V0aWxSU1M6OkNCQ19VdGlsUlNTKCkNCi17DQotfQ0KLUNCQ19VdGlsUlNTOjp+Q0JDX1V0aWxSU1MoKQ0KLXsNCi19DQotQ0ZYX0ludDMyQXJyYXkgKkNCQ19VdGlsUlNTOjpHZXRSc3NXaWR0aHMoaW50MzJfdCB2YWwsIGludDMyX3QgbiwgaW50MzJfdCBlbGVtZW50cywgaW50MzJfdCBtYXhXaWR0aCwgRlhfQk9PTCBub05hcnJvdykNCi17DQotICAgIENGWF9JbnQzMkFycmF5ICppVGVtcCA9ICBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQotICAgIGlUZW1wLT5TZXRTaXplKGVsZW1lbnRzKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0ZYX0ludDMyQXJyYXkgPiB3aWR0aHMoaVRlbXApOw0KLSAgICBpbnQzMl90IGJhcjsNCi0gICAgaW50MzJfdCBuYXJyb3dNYXNrID0gMDsNCi0gICAgZm9yIChiYXIgPSAwOyBiYXIgPCBlbGVtZW50cyAtIDE7IGJhcisrKSB7DQotICAgICAgICBuYXJyb3dNYXNrIHw9ICgxIDw8IGJhcik7DQotICAgICAgICBpbnQzMl90IGVsbVdpZHRoID0gMTsNCi0gICAgICAgIGludDMyX3Qgc3ViVmFsOw0KLSAgICAgICAgd2hpbGUgKFRSVUUpIHsNCi0gICAgICAgICAgICBzdWJWYWwgPSBDb21iaW5zKG4gLSBlbG1XaWR0aCAtIDEsIGVsZW1lbnRzIC0gYmFyIC0gMik7DQotICAgICAgICAgICAgaWYgKG5vTmFycm93ICYmIChuYXJyb3dNYXNrID09IDApICYmDQotICAgICAgICAgICAgICAgICAgICAobiAtIGVsbVdpZHRoIC0gKGVsZW1lbnRzIC0gYmFyIC0gMSkgPj0gZWxlbWVudHMgLSBiYXIgLSAxKSkgew0KLSAgICAgICAgICAgICAgICBzdWJWYWwgLT0gQ29tYmlucyhuIC0gZWxtV2lkdGggLSAoZWxlbWVudHMgLSBiYXIpLCBlbGVtZW50cyAtIGJhciAtIDIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZWxlbWVudHMgLSBiYXIgLSAxID4gMSkgew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGxlc3NWYWwgPSAwOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgbXh3RWxlbWVudCA9IG4gLSBlbG1XaWR0aCAtIChlbGVtZW50cyAtIGJhciAtIDIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG14d0VsZW1lbnQgPiBtYXhXaWR0aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBteHdFbGVtZW50LS0pIHsNCi0gICAgICAgICAgICAgICAgICAgIGxlc3NWYWwgKz0gQ29tYmlucyhuIC0gZWxtV2lkdGggLSBteHdFbGVtZW50IC0gMSwgZWxlbWVudHMgLSBiYXIgLSAzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBzdWJWYWwgLT0gbGVzc1ZhbCAqIChlbGVtZW50cyAtIDEgLSBiYXIpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiAtIGVsbVdpZHRoID4gbWF4V2lkdGgpIHsNCi0gICAgICAgICAgICAgICAgc3ViVmFsLS07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbCAtPSBzdWJWYWw7DQotICAgICAgICAgICAgaWYgKHZhbCA8IDApIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsbVdpZHRoKys7DQotICAgICAgICAgICAgbmFycm93TWFzayAmPSB+KDEgPDwgYmFyKTsNCitDQkNfVXRpbFJTUzo6Q0JDX1V0aWxSU1MoKSB7fQ0KK0NCQ19VdGlsUlNTOjp+Q0JDX1V0aWxSU1MoKSB7fQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfVXRpbFJTUzo6R2V0UnNzV2lkdGhzKGludDMyX3QgdmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBub05hcnJvdykgew0KKyAgQ0ZYX0ludDMyQXJyYXkqIGlUZW1wID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgaVRlbXAtPlNldFNpemUoZWxlbWVudHMpOw0KKyAgQ0JDX0F1dG9QdHI8Q0ZYX0ludDMyQXJyYXk+IHdpZHRocyhpVGVtcCk7DQorICBpbnQzMl90IGJhcjsNCisgIGludDMyX3QgbmFycm93TWFzayA9IDA7DQorICBmb3IgKGJhciA9IDA7IGJhciA8IGVsZW1lbnRzIC0gMTsgYmFyKyspIHsNCisgICAgbmFycm93TWFzayB8PSAoMSA8PCBiYXIpOw0KKyAgICBpbnQzMl90IGVsbVdpZHRoID0gMTsNCisgICAgaW50MzJfdCBzdWJWYWw7DQorICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgc3ViVmFsID0gQ29tYmlucyhuIC0gZWxtV2lkdGggLSAxLCBlbGVtZW50cyAtIGJhciAtIDIpOw0KKyAgICAgIGlmIChub05hcnJvdyAmJiAobmFycm93TWFzayA9PSAwKSAmJg0KKyAgICAgICAgICAobiAtIGVsbVdpZHRoIC0gKGVsZW1lbnRzIC0gYmFyIC0gMSkgPj0gZWxlbWVudHMgLSBiYXIgLSAxKSkgew0KKyAgICAgICAgc3ViVmFsIC09IENvbWJpbnMobiAtIGVsbVdpZHRoIC0gKGVsZW1lbnRzIC0gYmFyKSwgZWxlbWVudHMgLSBiYXIgLSAyKTsNCisgICAgICB9DQorICAgICAgaWYgKGVsZW1lbnRzIC0gYmFyIC0gMSA+IDEpIHsNCisgICAgICAgIGludDMyX3QgbGVzc1ZhbCA9IDA7DQorICAgICAgICBmb3IgKGludDMyX3QgbXh3RWxlbWVudCA9IG4gLSBlbG1XaWR0aCAtIChlbGVtZW50cyAtIGJhciAtIDIpOw0KKyAgICAgICAgICAgICBteHdFbGVtZW50ID4gbWF4V2lkdGg7IG14d0VsZW1lbnQtLSkgew0KKyAgICAgICAgICBsZXNzVmFsICs9IENvbWJpbnMobiAtIGVsbVdpZHRoIC0gbXh3RWxlbWVudCAtIDEsIGVsZW1lbnRzIC0gYmFyIC0gMyk7DQogICAgICAgICB9DQotICAgICAgICB2YWwgKz0gc3ViVmFsOw0KLSAgICAgICAgbiAtPSBlbG1XaWR0aDsNCi0gICAgICAgICgqd2lkdGhzKVtiYXJdID0gZWxtV2lkdGg7DQorICAgICAgICBzdWJWYWwgLT0gbGVzc1ZhbCAqIChlbGVtZW50cyAtIDEgLSBiYXIpOw0KKyAgICAgIH0gZWxzZSBpZiAobiAtIGVsbVdpZHRoID4gbWF4V2lkdGgpIHsNCisgICAgICAgIHN1YlZhbC0tOw0KKyAgICAgIH0NCisgICAgICB2YWwgLT0gc3ViVmFsOw0KKyAgICAgIGlmICh2YWwgPCAwKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZWxtV2lkdGgrKzsNCisgICAgICBuYXJyb3dNYXNrICY9IH4oMSA8PCBiYXIpOw0KICAgICB9DQotICAgICgqd2lkdGhzKVtiYXJdID0gbjsNCi0gICAgcmV0dXJuIHdpZHRocy5yZWxlYXNlKCk7DQorICAgIHZhbCArPSBzdWJWYWw7DQorICAgIG4gLT0gZWxtV2lkdGg7DQorICAgICgqd2lkdGhzKVtiYXJdID0gZWxtV2lkdGg7DQorICB9DQorICAoKndpZHRocylbYmFyXSA9IG47DQorICByZXR1cm4gd2lkdGhzLnJlbGVhc2UoKTsNCiB9DQotaW50MzJfdCBDQkNfVXRpbFJTUzo6R2V0UlNTdmFsdWUoQ0ZYX0ludDMyQXJyYXkgJndpZHRocywgaW50MzJfdCBtYXhXaWR0aCwgRlhfQk9PTCBub05hcnJvdykNCi17DQotICAgIGludDMyX3QgZWxlbWVudHMgPSB3aWR0aHMuR2V0U2l6ZSgpOw0KLSAgICBpbnQzMl90IG4gPSAwOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBlbGVtZW50czsgaSsrKSB7DQotICAgICAgICBuICs9IHdpZHRoc1tpXTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHZhbCA9IDA7DQotICAgIGludDMyX3QgbmFycm93TWFzayA9IDA7DQotICAgIGZvciAoaW50MzJfdCBiYXIgPSAwOyBiYXIgPCBlbGVtZW50cyAtIDE7IGJhcisrKSB7DQotICAgICAgICBpbnQzMl90IGVsbVdpZHRoOw0KLSAgICAgICAgZm9yIChlbG1XaWR0aCA9IDEsIG5hcnJvd01hc2sgfD0gKDEgPDwgYmFyKTsNCi0gICAgICAgICAgICAgICAgZWxtV2lkdGggPCB3aWR0aHNbYmFyXTsNCi0gICAgICAgICAgICAgICAgZWxtV2lkdGgrKywgbmFycm93TWFzayAmPSB+KDEgPDwgYmFyKSkgew0KLSAgICAgICAgICAgIGludDMyX3Qgc3ViVmFsID0gQ29tYmlucyhuIC0gZWxtV2lkdGggLSAxLCBlbGVtZW50cyAtIGJhciAtIDIpOw0KLSAgICAgICAgICAgIGlmIChub05hcnJvdyAmJiAobmFycm93TWFzayA9PSAwKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgKG4gLSBlbG1XaWR0aCAtIChlbGVtZW50cyAtIGJhciAtIDEpID49IGVsZW1lbnRzIC0gYmFyIC0gMSkpIHsNCi0gICAgICAgICAgICAgICAgc3ViVmFsIC09IENvbWJpbnMobiAtIGVsbVdpZHRoIC0gKGVsZW1lbnRzIC0gYmFyKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgLSBiYXIgLSAyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGVsZW1lbnRzIC0gYmFyIC0gMSA+IDEpIHsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBsZXNzVmFsID0gMDsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IG14d0VsZW1lbnQgPSBuIC0gZWxtV2lkdGggLSAoZWxlbWVudHMgLSBiYXIgLSAyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBteHdFbGVtZW50ID4gbWF4V2lkdGg7IG14d0VsZW1lbnQtLSkgew0KLSAgICAgICAgICAgICAgICAgICAgbGVzc1ZhbCArPSBDb21iaW5zKG4gLSBlbG1XaWR0aCAtIG14d0VsZW1lbnQgLSAxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIC0gYmFyIC0gMyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgc3ViVmFsIC09IGxlc3NWYWwgKiAoZWxlbWVudHMgLSAxIC0gYmFyKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gLSBlbG1XaWR0aCA+IG1heFdpZHRoKSB7DQotICAgICAgICAgICAgICAgIHN1YlZhbC0tOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB2YWwgKz0gc3ViVmFsOw0KK2ludDMyX3QgQ0JDX1V0aWxSU1M6OkdldFJTU3ZhbHVlKENGWF9JbnQzMkFycmF5JiB3aWR0aHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIG5vTmFycm93KSB7DQorICBpbnQzMl90IGVsZW1lbnRzID0gd2lkdGhzLkdldFNpemUoKTsNCisgIGludDMyX3QgbiA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBlbGVtZW50czsgaSsrKSB7DQorICAgIG4gKz0gd2lkdGhzW2ldOw0KKyAgfQ0KKyAgaW50MzJfdCB2YWwgPSAwOw0KKyAgaW50MzJfdCBuYXJyb3dNYXNrID0gMDsNCisgIGZvciAoaW50MzJfdCBiYXIgPSAwOyBiYXIgPCBlbGVtZW50cyAtIDE7IGJhcisrKSB7DQorICAgIGludDMyX3QgZWxtV2lkdGg7DQorICAgIGZvciAoZWxtV2lkdGggPSAxLCBuYXJyb3dNYXNrIHw9ICgxIDw8IGJhcik7IGVsbVdpZHRoIDwgd2lkdGhzW2Jhcl07DQorICAgICAgICAgZWxtV2lkdGgrKywgbmFycm93TWFzayAmPSB+KDEgPDwgYmFyKSkgew0KKyAgICAgIGludDMyX3Qgc3ViVmFsID0gQ29tYmlucyhuIC0gZWxtV2lkdGggLSAxLCBlbGVtZW50cyAtIGJhciAtIDIpOw0KKyAgICAgIGlmIChub05hcnJvdyAmJiAobmFycm93TWFzayA9PSAwKSAmJg0KKyAgICAgICAgICAobiAtIGVsbVdpZHRoIC0gKGVsZW1lbnRzIC0gYmFyIC0gMSkgPj0gZWxlbWVudHMgLSBiYXIgLSAxKSkgew0KKyAgICAgICAgc3ViVmFsIC09IENvbWJpbnMobiAtIGVsbVdpZHRoIC0gKGVsZW1lbnRzIC0gYmFyKSwgZWxlbWVudHMgLSBiYXIgLSAyKTsNCisgICAgICB9DQorICAgICAgaWYgKGVsZW1lbnRzIC0gYmFyIC0gMSA+IDEpIHsNCisgICAgICAgIGludDMyX3QgbGVzc1ZhbCA9IDA7DQorICAgICAgICBmb3IgKGludDMyX3QgbXh3RWxlbWVudCA9IG4gLSBlbG1XaWR0aCAtIChlbGVtZW50cyAtIGJhciAtIDIpOw0KKyAgICAgICAgICAgICBteHdFbGVtZW50ID4gbWF4V2lkdGg7IG14d0VsZW1lbnQtLSkgew0KKyAgICAgICAgICBsZXNzVmFsICs9IENvbWJpbnMobiAtIGVsbVdpZHRoIC0gbXh3RWxlbWVudCAtIDEsIGVsZW1lbnRzIC0gYmFyIC0gMyk7DQogICAgICAgICB9DQotICAgICAgICBuIC09IGVsbVdpZHRoOw0KKyAgICAgICAgc3ViVmFsIC09IGxlc3NWYWwgKiAoZWxlbWVudHMgLSAxIC0gYmFyKTsNCisgICAgICB9IGVsc2UgaWYgKG4gLSBlbG1XaWR0aCA+IG1heFdpZHRoKSB7DQorICAgICAgICBzdWJWYWwtLTsNCisgICAgICB9DQorICAgICAgdmFsICs9IHN1YlZhbDsNCiAgICAgfQ0KLSAgICByZXR1cm4gdmFsOw0KKyAgICBuIC09IGVsbVdpZHRoOw0KKyAgfQ0KKyAgcmV0dXJuIHZhbDsNCiB9DQotaW50MzJfdCBDQkNfVXRpbFJTUzo6Q29tYmlucyhpbnQzMl90IG4sIGludDMyX3QgcikNCi17DQotICAgIGludDMyX3QgbWF4RGVub207DQotICAgIGludDMyX3QgbWluRGVub207DQotICAgIGlmIChuIC0gciA+IHIpIHsNCi0gICAgICAgIG1pbkRlbm9tID0gcjsNCi0gICAgICAgIG1heERlbm9tID0gbiAtIHI7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtaW5EZW5vbSA9IG4gLSByOw0KLSAgICAgICAgbWF4RGVub20gPSByOw0KK2ludDMyX3QgQ0JDX1V0aWxSU1M6OkNvbWJpbnMoaW50MzJfdCBuLCBpbnQzMl90IHIpIHsNCisgIGludDMyX3QgbWF4RGVub207DQorICBpbnQzMl90IG1pbkRlbm9tOw0KKyAgaWYgKG4gLSByID4gcikgew0KKyAgICBtaW5EZW5vbSA9IHI7DQorICAgIG1heERlbm9tID0gbiAtIHI7DQorICB9IGVsc2Ugew0KKyAgICBtaW5EZW5vbSA9IG4gLSByOw0KKyAgICBtYXhEZW5vbSA9IHI7DQorICB9DQorICBpbnQzMl90IHZhbCA9IDE7DQorICBpbnQzMl90IGogPSAxOw0KKyAgZm9yIChpbnQzMl90IGkgPSBuOyBpID4gbWF4RGVub207IGktLSkgew0KKyAgICB2YWwgKj0gaTsNCisgICAgaWYgKGogPD0gbWluRGVub20pIHsNCisgICAgICB2YWwgLz0gajsNCisgICAgICBqKys7DQogICAgIH0NCi0gICAgaW50MzJfdCB2YWwgPSAxOw0KLSAgICBpbnQzMl90IGogPSAxOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IG47IGkgPiBtYXhEZW5vbTsgaS0tKSB7DQotICAgICAgICB2YWwgKj0gaTsNCi0gICAgICAgIGlmIChqIDw9IG1pbkRlbm9tKSB7DQotICAgICAgICAgICAgdmFsIC89IGo7DQotICAgICAgICAgICAgaisrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHdoaWxlIChqIDw9IG1pbkRlbm9tKSB7DQotICAgICAgICB2YWwgLz0gajsNCi0gICAgICAgIGorKzsNCi0gICAgfQ0KLSAgICByZXR1cm4gdmFsOw0KKyAgfQ0KKyAgd2hpbGUgKGogPD0gbWluRGVub20pIHsNCisgICAgdmFsIC89IGo7DQorICAgIGorKzsNCisgIH0NCisgIHJldHVybiB2YWw7DQogfQ0KLUNGWF9JbnQzMkFycmF5ICpDQkNfVXRpbFJTUzo6RWxlbWVudHMoQ0ZYX0ludDMyQXJyYXkgJmVEaXN0LCBpbnQzMl90IE4sIGludDMyX3QgSykNCi17DQotICAgIENGWF9JbnQzMkFycmF5ICp3aWR0aHMgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQotICAgIHdpZHRocy0+U2V0U2l6ZShlRGlzdC5HZXRTaXplKCkgKyAyKTsNCi0gICAgaW50MzJfdCB0d29LID0gSyA8PCAxOw0KLSAgICAoKndpZHRocylbMF0gPSAxOw0KLSAgICBpbnQzMl90IGk7DQotICAgIGludDMyX3QgbWluRXZlbiA9IDEwOw0KLSAgICBpbnQzMl90IGJhclN1bSA9IDE7DQotICAgIGZvciAoaSA9IDE7IGkgPCB0d29LIC0gMjsgaSArPSAyKSB7DQotICAgICAgICAoKndpZHRocylbaV0gPSBlRGlzdFtpIC0gMV0gLSAoKndpZHRocylbaSAtIDFdOw0KLSAgICAgICAgKCp3aWR0aHMpW2kgKyAxXSA9IGVEaXN0W2ldIC0gKCp3aWR0aHMpW2ldOw0KLSAgICAgICAgYmFyU3VtICs9ICgqd2lkdGhzKVtpXSArICgqd2lkdGhzKVtpICsgMV07DQotICAgICAgICBpZiAoKCp3aWR0aHMpW2ldIDwgbWluRXZlbikgew0KLSAgICAgICAgICAgIG1pbkV2ZW4gPSAoKndpZHRocylbaV07DQotICAgICAgICB9DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19VdGlsUlNTOjpFbGVtZW50cyhDRlhfSW50MzJBcnJheSYgZURpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IE4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IEspIHsNCisgIENGWF9JbnQzMkFycmF5KiB3aWR0aHMgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICB3aWR0aHMtPlNldFNpemUoZURpc3QuR2V0U2l6ZSgpICsgMik7DQorICBpbnQzMl90IHR3b0sgPSBLIDw8IDE7DQorICAoKndpZHRocylbMF0gPSAxOw0KKyAgaW50MzJfdCBpOw0KKyAgaW50MzJfdCBtaW5FdmVuID0gMTA7DQorICBpbnQzMl90IGJhclN1bSA9IDE7DQorICBmb3IgKGkgPSAxOyBpIDwgdHdvSyAtIDI7IGkgKz0gMikgew0KKyAgICAoKndpZHRocylbaV0gPSBlRGlzdFtpIC0gMV0gLSAoKndpZHRocylbaSAtIDFdOw0KKyAgICAoKndpZHRocylbaSArIDFdID0gZURpc3RbaV0gLSAoKndpZHRocylbaV07DQorICAgIGJhclN1bSArPSAoKndpZHRocylbaV0gKyAoKndpZHRocylbaSArIDFdOw0KKyAgICBpZiAoKCp3aWR0aHMpW2ldIDwgbWluRXZlbikgew0KKyAgICAgIG1pbkV2ZW4gPSAoKndpZHRocylbaV07DQogICAgIH0NCi0gICAgKCp3aWR0aHMpW3R3b0sgLSAxXSA9IE4gLSBiYXJTdW07DQotICAgIGlmICgoKndpZHRocylbdHdvSyAtIDFdIDwgbWluRXZlbikgew0KLSAgICAgICAgbWluRXZlbiA9ICgqd2lkdGhzKVt0d29LIC0gMV07DQorICB9DQorICAoKndpZHRocylbdHdvSyAtIDFdID0gTiAtIGJhclN1bTsNCisgIGlmICgoKndpZHRocylbdHdvSyAtIDFdIDwgbWluRXZlbikgew0KKyAgICBtaW5FdmVuID0gKCp3aWR0aHMpW3R3b0sgLSAxXTsNCisgIH0NCisgIGlmIChtaW5FdmVuID4gMSkgew0KKyAgICBmb3IgKGkgPSAwOyBpIDwgdHdvSzsgaSArPSAyKSB7DQorICAgICAgKCp3aWR0aHMpW2ldICs9IG1pbkV2ZW4gLSAxOw0KKyAgICAgICgqd2lkdGhzKVtpICsgMV0gLT0gbWluRXZlbiAtIDE7DQogICAgIH0NCi0gICAgaWYgKG1pbkV2ZW4gPiAxKSB7DQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHdvSzsgaSArPSAyKSB7DQotICAgICAgICAgICAgKCp3aWR0aHMpW2ldICs9IG1pbkV2ZW4gLSAxOw0KLSAgICAgICAgICAgICgqd2lkdGhzKVtpICsgMV0gLT0gbWluRXZlbiAtIDE7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIHdpZHRoczsNCisgIH0NCisgIHJldHVybiB3aWR0aHM7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxSU1MuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxSU1MuaAppbmRleCAzYzYzYTUxLi4xMWJlZDAzIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsUlNTLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbFJTUy5oCkBAIC03LDE3ICs3LDIzIEBACiAjaWZuZGVmIF9CQ19VVElMUkVTU19IXw0KICNkZWZpbmUgX0JDX1VUSUxSRVNTX0hfDQogY2xhc3MgQ0JDX1Jzc1BhaXI7DQotY2xhc3MgQ0JDX1V0aWxSU1MNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5DQkNfVXRpbFJTUygpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBHZXRSU1N2YWx1ZShDRlhfSW50MzJBcnJheSAmd2lkdGhzLCBpbnQzMl90IG1heFdpZHRoLCBGWF9CT09MIG5vTmFycm93KTsNCitjbGFzcyBDQkNfVXRpbFJTUyB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfkNCQ19VdGlsUlNTKCk7DQorICBzdGF0aWMgaW50MzJfdCBHZXRSU1N2YWx1ZShDRlhfSW50MzJBcnJheSYgd2lkdGhzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgbm9OYXJyb3cpOw0KIA0KLXByb3RlY3RlZDoNCi0gICAgc3RhdGljIENGWF9JbnQzMkFycmF5ICpHZXRSc3NXaWR0aHMoaW50MzJfdCB2YWwsIGludDMyX3QgbiwgaW50MzJfdCBlbGVtZW50cywgaW50MzJfdCBtYXhXaWR0aCwgRlhfQk9PTCBub05hcnJvdyk7DQotICAgIHN0YXRpYyBpbnQzMl90IENvbWJpbnMoaW50MzJfdCBuLCBpbnQzMl90IHIpOw0KLSAgICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkgKkVsZW1lbnRzKENGWF9JbnQzMkFycmF5ICZlRGlzdCwgaW50MzJfdCBOLCBpbnQzMl90IEspOw0KLXByaXZhdGU6DQotICAgIENCQ19VdGlsUlNTKCk7DQorIHByb3RlY3RlZDoNCisgIHN0YXRpYyBDRlhfSW50MzJBcnJheSogR2V0UnNzV2lkdGhzKGludDMyX3QgdmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIG5vTmFycm93KTsNCisgIHN0YXRpYyBpbnQzMl90IENvbWJpbnMoaW50MzJfdCBuLCBpbnQzMl90IHIpOw0KKyAgc3RhdGljIENGWF9JbnQzMkFycmF5KiBFbGVtZW50cyhDRlhfSW50MzJBcnJheSYgZURpc3QsIGludDMyX3QgTiwgaW50MzJfdCBLKTsNCisNCisgcHJpdmF0ZToNCisgIENCQ19VdGlsUlNTKCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlscy5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlscy5jcHAKaW5kZXggOGRkYmI1MS4uOTE3ZWNiOSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbHMuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxzLmNwcApAQCAtNSw0MiArNSw0MiBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAiYmFyY29kZS5oIg0KLUZYX0JPT0wgQkNfRlhfQnl0ZVN0cmluZ19SZXBsYWNlKENGWF9CeXRlU3RyaW5nICZkc3QsIEZYX0RXT1JEIGZpcnN0LCBGWF9EV09SRCBsYXN0LCBpbnQzMl90IGNvdW50LCBGWF9DSEFSIGMpDQotew0KLSAgICBpZiAoZmlyc3QgPiBsYXN0IHx8IGNvdW50IDw9IDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBkc3QuRGVsZXRlKGZpcnN0LCBsYXN0IC0gZmlyc3QpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgew0KLSAgICAgICAgZHN0Lkluc2VydCgwLCBjKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIEJDX0ZYX0J5dGVTdHJpbmdfUmVwbGFjZShDRlhfQnl0ZVN0cmluZyYgZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGxhc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIGMpIHsNCisgIGlmIChmaXJzdCA+IGxhc3QgfHwgY291bnQgPD0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBkc3QuRGVsZXRlKGZpcnN0LCBsYXN0IC0gZmlyc3QpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICBkc3QuSW5zZXJ0KDAsIGMpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQoQ0ZYX0J5dGVTdHJpbmcgJmRzdCwgaW50MzJfdCBjb3VudCwgRlhfQ0hBUiBjKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsNCi0gICAgICAgIGRzdCArPSBjOw0KLSAgICB9DQordm9pZCBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChDRlhfQnl0ZVN0cmluZyYgZHN0LCBpbnQzMl90IGNvdW50LCBGWF9DSEFSIGMpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsNCisgICAgZHN0ICs9IGM7DQorICB9DQogfQ0KLXZvaWQgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQoQ0ZYX0J5dGVTdHJpbmcgJmRzdCwgY29uc3QgQ0ZYX0J5dGVBcnJheSAmYmEpDQotew0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBiYS5HZXRTaXplKCk7IGkgKyspIHsNCi0gICAgICAgIGRzdCArPSBiYVtpXTsNCi0gICAgfQ0KK3ZvaWQgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQoQ0ZYX0J5dGVTdHJpbmcmIGRzdCwgY29uc3QgQ0ZYX0J5dGVBcnJheSYgYmEpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJhLkdldFNpemUoKTsgaSsrKSB7DQorICAgIGRzdCArPSBiYVtpXTsNCisgIH0NCiB9DQotdm9pZCBCQ19GWF9QdHJBcnJheV9Tb3J0KENGWF9QdHJBcnJheSAmc3JjLCBCQ19QdHJBcnJheUNvbXBhcmVDYWxsYmFjayBmdW4pDQotew0KLSAgICBpbnQzMl90IG5MZW5ndGggPSBzcmMuR2V0U2l6ZSgpOw0KLSAgICBGWF9CT09MIGNoYW5nZWQgPSB0cnVlOw0KLSAgICBkbyB7DQotICAgICAgICBjaGFuZ2VkID0gZmFsc2U7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuTGVuZ3RoIC0gMTsgaSsrKSB7DQotICAgICAgICAgICAgaWYgKCBmdW4oc3JjW2kgKyAxXSwgc3JjW2ldKSApIHsNCi0gICAgICAgICAgICAgICAgdm9pZCAqdGVtcCA9IHNyY1tpXTsNCi0gICAgICAgICAgICAgICAgc3JjLlNldEF0KGksIHNyY1tpICsgMV0pOw0KLSAgICAgICAgICAgICAgICBzcmMuU2V0QXQoaSArIDEsIHRlbXApOw0KLSAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGNoYW5nZWQpOw0KK3ZvaWQgQkNfRlhfUHRyQXJyYXlfU29ydChDRlhfUHRyQXJyYXkmIHNyYywgQkNfUHRyQXJyYXlDb21wYXJlQ2FsbGJhY2sgZnVuKSB7DQorICBpbnQzMl90IG5MZW5ndGggPSBzcmMuR2V0U2l6ZSgpOw0KKyAgRlhfQk9PTCBjaGFuZ2VkID0gdHJ1ZTsNCisgIGRvIHsNCisgICAgY2hhbmdlZCA9IGZhbHNlOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuTGVuZ3RoIC0gMTsgaSsrKSB7DQorICAgICAgaWYgKGZ1bihzcmNbaSArIDFdLCBzcmNbaV0pKSB7DQorICAgICAgICB2b2lkKiB0ZW1wID0gc3JjW2ldOw0KKyAgICAgICAgc3JjLlNldEF0KGksIHNyY1tpICsgMV0pOw0KKyAgICAgICAgc3JjLlNldEF0KGkgKyAxLCB0ZW1wKTsNCisgICAgICAgIGNoYW5nZWQgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSB3aGlsZSAoY2hhbmdlZCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1dyaXRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19Xcml0ZXIuY3BwCmluZGV4IDA3ZGFiYjMuLjgwYzNjNjkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1dyaXRlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfV3JpdGVyLmNwcApAQCAtNiw2NSArNiw1NCBAQAogDQogI2luY2x1ZGUgImJhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfV3JpdGVyLmgiDQotQ0JDX1dyaXRlcjo6Q0JDX1dyaXRlcigpDQotew0KLSAgICBtX0NoYXJFbmNvZGluZwkJPSAwOw0KLSAgICBtX01vZHVsZUhlaWdodAkJPSAxOw0KLSAgICBtX01vZHVsZVdpZHRoCQk9IDE7DQotICAgIG1fSGVpZ2h0CQkJPSAzMjA7DQotICAgIG1fV2lkdGgJCQkJPSA2NDA7DQotICAgIG1fY29sb3JTcGFjZQkJPSBGWERJQl9BcmdiOw0KLSAgICBtX2JhckNvbG9yCQkJPSAweGZmMDAwMDAwOw0KLSAgICBtX2JhY2tncm91bmRDb2xvcgk9IDB4ZmZmZmZmZmY7DQorQ0JDX1dyaXRlcjo6Q0JDX1dyaXRlcigpIHsNCisgIG1fQ2hhckVuY29kaW5nID0gMDsNCisgIG1fTW9kdWxlSGVpZ2h0ID0gMTsNCisgIG1fTW9kdWxlV2lkdGggPSAxOw0KKyAgbV9IZWlnaHQgPSAzMjA7DQorICBtX1dpZHRoID0gNjQwOw0KKyAgbV9jb2xvclNwYWNlID0gRlhESUJfQXJnYjsNCisgIG1fYmFyQ29sb3IgPSAweGZmMDAwMDAwOw0KKyAgbV9iYWNrZ3JvdW5kQ29sb3IgPSAweGZmZmZmZmZmOw0KIH0NCi1DQkNfV3JpdGVyOjp+Q0JDX1dyaXRlcigpDQotew0KK0NCQ19Xcml0ZXI6On5DQkNfV3JpdGVyKCkge30NCitGWF9CT09MIENCQ19Xcml0ZXI6OlNldENoYXJFbmNvZGluZyhpbnQzMl90IGVuY29kaW5nKSB7DQorICBtX0NoYXJFbmNvZGluZyA9IGVuY29kaW5nOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0JDX1dyaXRlcjo6U2V0Q2hhckVuY29kaW5nKGludDMyX3QgZW5jb2RpbmcpDQotew0KLSAgICBtX0NoYXJFbmNvZGluZyA9IGVuY29kaW5nOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENCQ19Xcml0ZXI6OlNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCkgew0KKyAgaWYgKG1vZHVsZUhlaWdodCA+IDEwIHx8IG1vZHVsZUhlaWdodCA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9Nb2R1bGVIZWlnaHQgPSBtb2R1bGVIZWlnaHQ7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDQkNfV3JpdGVyOjpTZXRNb2R1bGVIZWlnaHQoaW50MzJfdCBtb2R1bGVIZWlnaHQpDQotew0KLSAgICBpZiAobW9kdWxlSGVpZ2h0ID4gMTAgfHwgbW9kdWxlSGVpZ2h0IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG1fTW9kdWxlSGVpZ2h0ID0gbW9kdWxlSGVpZ2h0Ow0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENCQ19Xcml0ZXI6OlNldE1vZHVsZVdpZHRoKGludDMyX3QgbW9kdWxlV2lkdGgpIHsNCisgIGlmIChtb2R1bGVXaWR0aCA+IDEwIHx8IG1vZHVsZVdpZHRoIDwgMSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX01vZHVsZVdpZHRoID0gbW9kdWxlV2lkdGg7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDQkNfV3JpdGVyOjpTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKQ0KLXsNCi0gICAgaWYgKCBtb2R1bGVXaWR0aCA+IDEwIHx8IG1vZHVsZVdpZHRoIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG1fTW9kdWxlV2lkdGggPSBtb2R1bGVXaWR0aDsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDQkNfV3JpdGVyOjpTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpIHsNCisgIG1fSGVpZ2h0ID0gaGVpZ2h0Ow0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0JDX1dyaXRlcjo6U2V0SGVpZ2h0KGludDMyX3QgaGVpZ2h0KQ0KLXsNCi0gICAgbV9IZWlnaHQgPSBoZWlnaHQ7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0JDX1dyaXRlcjo6U2V0V2lkdGgoaW50MzJfdCB3aWR0aCkgew0KKyAgbV9XaWR0aCA9IHdpZHRoOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0JDX1dyaXRlcjo6U2V0V2lkdGgoaW50MzJfdCB3aWR0aCkNCi17DQotICAgIG1fV2lkdGggPSB3aWR0aDsNCi0gICAgcmV0dXJuIFRSVUU7DQordm9pZCBDQkNfV3JpdGVyOjpTZXRCYWNrZ3JvdW5kQ29sb3IoRlhfQVJHQiBiYWNrZ3JvdW5kQ29sb3IpIHsNCisgIG1fYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yOw0KIH0NCi12b2lkIENCQ19Xcml0ZXI6OlNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcikNCi17DQotICAgIG1fYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yOw0KK3ZvaWQgQ0JDX1dyaXRlcjo6U2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKSB7DQorICBtX2JhckNvbG9yID0gZm9yZWdyb3VuZENvbG9yOw0KIH0NCi12b2lkIENCQ19Xcml0ZXI6OlNldEJhcmNvZGVDb2xvcihGWF9BUkdCIGZvcmVncm91bmRDb2xvcikNCi17DQotICAgIG1fYmFyQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7DQotfQ0KLUNGWF9ESUJpdG1hcCogQ0JDX1dyaXRlcjo6Q3JlYXRlRElCaXRtYXAoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpDQotew0KLSAgICBDRlhfRElCaXRtYXAgKnBESUJpdG1hcCA9IE5VTEw7DQotICAgIHBESUJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXA7DQotICAgIGlmKHBESUJpdG1hcCAhPSBOVUxMKSB7DQotICAgICAgICBwRElCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBtX2NvbG9yU3BhY2UpOw0KLSAgICB9DQotICAgIHJldHVybiBwRElCaXRtYXA7DQorQ0ZYX0RJQml0bWFwKiBDQkNfV3JpdGVyOjpDcmVhdGVESUJpdG1hcChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgew0KKyAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBOVUxMOw0KKyAgcERJQml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcDsNCisgIGlmIChwRElCaXRtYXAgIT0gTlVMTCkgew0KKyAgICBwRElCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBtX2NvbG9yU3BhY2UpOw0KKyAgfQ0KKyAgcmV0dXJuIHBESUJpdG1hcDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfV3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaAppbmRleCAzZDIyNjI1Li41Njg0MDk2IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaApAQCAtNywyOSArNywzOCBAQAogI2lmbmRlZiBfQkNfV1JJVEVSX0hfDQogI2RlZmluZSBfQkNfV1JJVEVSX0hfDQogY2xhc3MgQ0JDX1dyaXRlcjsNCi1jbGFzcyBDQkNfV3JpdGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX1dyaXRlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfV3JpdGVyKCk7DQotICAgIHZpcnR1YWwgdWludDhfdAkJKkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCAmZSkgPSAwOw0KLSAgICB2aXJ0dWFsIHVpbnQ4X3QJCSpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRDaGFyRW5jb2RpbmcoaW50MzJfdCBlbmNvZGluZyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgbW9kdWxlSGVpZ2h0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldFdpZHRoKGludDMyX3Qgd2lkdGgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcik7DQotICAgIHZpcnR1YWwgdm9pZAkJU2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGWF9ESUJpdG1hcCoJQ3JlYXRlRElCaXRtYXAoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOw0KLSAgICBpbnQzMl90CQltX0NoYXJFbmNvZGluZzsNCi0gICAgaW50MzJfdAkJbV9Nb2R1bGVIZWlnaHQ7DQotICAgIGludDMyX3QJCW1fTW9kdWxlV2lkdGg7DQotICAgIGludDMyX3QJCW1fSGVpZ2h0Ow0KLSAgICBpbnQzMl90CQltX1dpZHRoOw0KLSAgICBGWERJQl9Gb3JtYXQJbV9jb2xvclNwYWNlOw0KLSAgICBGWF9BUkdCCQkJbV9iYXJDb2xvcjsNCi0gICAgRlhfQVJHQgkJCW1fYmFja2dyb3VuZENvbG9yOw0KK2NsYXNzIENCQ19Xcml0ZXIgew0KKyBwdWJsaWM6DQorICBDQkNfV3JpdGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfV3JpdGVyKCk7DQorICB2aXJ0dWFsIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDaGFyRW5jb2RpbmcoaW50MzJfdCBlbmNvZGluZyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgbW9kdWxlSGVpZ2h0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFdpZHRoKGludDMyX3Qgd2lkdGgpOw0KKyAgdmlydHVhbCB2b2lkIFNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcik7DQorICB2aXJ0dWFsIHZvaWQgU2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX0RJQml0bWFwKiBDcmVhdGVESUJpdG1hcChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7DQorICBpbnQzMl90IG1fQ2hhckVuY29kaW5nOw0KKyAgaW50MzJfdCBtX01vZHVsZUhlaWdodDsNCisgIGludDMyX3QgbV9Nb2R1bGVXaWR0aDsNCisgIGludDMyX3QgbV9IZWlnaHQ7DQorICBpbnQzMl90IG1fV2lkdGg7DQorICBGWERJQl9Gb3JtYXQgbV9jb2xvclNwYWNlOw0KKyAgRlhfQVJHQiBtX2JhckNvbG9yOw0KKyAgRlhfQVJHQiBtX2JhY2tncm91bmRDb2xvcjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuY3BwCmluZGV4IDcxYzUyMTcuLmQwZDBkOGUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmNwcApAQCAtMjIsMTAzICsyMiw5MSBAQAogDQogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfQ29tbW9uQml0QXJyYXkuaCINCi1DQkNfQ29tbW9uQml0QXJyYXk6OkNCQ19Db21tb25CaXRBcnJheShDQkNfQ29tbW9uQml0QXJyYXkqIGFycmF5KQ0KLXsNCi0gICAgbV9zaXplID0gYXJyYXktPkdldFNpemUoKTsNCi0gICAgbV9iaXRzLkNvcHkoYXJyYXktPkdldEJpdHMoKSk7DQorQ0JDX0NvbW1vbkJpdEFycmF5OjpDQkNfQ29tbW9uQml0QXJyYXkoQ0JDX0NvbW1vbkJpdEFycmF5KiBhcnJheSkgew0KKyAgbV9zaXplID0gYXJyYXktPkdldFNpemUoKTsNCisgIG1fYml0cy5Db3B5KGFycmF5LT5HZXRCaXRzKCkpOw0KIH0NCi1DQkNfQ29tbW9uQml0QXJyYXk6OkNCQ19Db21tb25CaXRBcnJheSgpDQotew0KLSAgICBtX2JpdHMuU2V0U2l6ZSgxKTsNCi0gICAgbV9zaXplID0gMDsNCitDQkNfQ29tbW9uQml0QXJyYXk6OkNCQ19Db21tb25CaXRBcnJheSgpIHsNCisgIG1fYml0cy5TZXRTaXplKDEpOw0KKyAgbV9zaXplID0gMDsNCiB9DQotQ0JDX0NvbW1vbkJpdEFycmF5OjpDQkNfQ29tbW9uQml0QXJyYXkoaW50MzJfdCBzaXplKQ0KLXsNCi0gICAgbV9iaXRzLlNldFNpemUoKHNpemUgKyAzMSkgPj4gNSk7DQotICAgIG1fc2l6ZSA9IHNpemU7DQorQ0JDX0NvbW1vbkJpdEFycmF5OjpDQkNfQ29tbW9uQml0QXJyYXkoaW50MzJfdCBzaXplKSB7DQorICBtX2JpdHMuU2V0U2l6ZSgoc2l6ZSArIDMxKSA+PiA1KTsNCisgIG1fc2l6ZSA9IHNpemU7DQogfQ0KLUNCQ19Db21tb25CaXRBcnJheTo6fkNCQ19Db21tb25CaXRBcnJheSgpDQotew0KLSAgICBtX3NpemUgPSAwOw0KK0NCQ19Db21tb25CaXRBcnJheTo6fkNCQ19Db21tb25CaXRBcnJheSgpIHsNCisgIG1fc2l6ZSA9IDA7DQogfQ0KLWludDMyX3QgQ0JDX0NvbW1vbkJpdEFycmF5OjpHZXRTaXplKCkNCi17DQotICAgIHJldHVybiBtX3NpemU7DQoraW50MzJfdCBDQkNfQ29tbW9uQml0QXJyYXk6OkdldFNpemUoKSB7DQorICByZXR1cm4gbV9zaXplOw0KIH0NCi1DRlhfSW50MzJBcnJheSYgQ0JDX0NvbW1vbkJpdEFycmF5OjpHZXRCaXRzKCkNCi17DQotICAgIHJldHVybiBtX2JpdHM7DQorQ0ZYX0ludDMyQXJyYXkmIENCQ19Db21tb25CaXRBcnJheTo6R2V0Qml0cygpIHsNCisgIHJldHVybiBtX2JpdHM7DQogfQ0KLWludDMyX3QgQ0JDX0NvbW1vbkJpdEFycmF5OjpHZXRTaXplSW5CeXRlcygpDQotew0KLSAgICByZXR1cm4gKG1fc2l6ZSArIDcpID4+IDM7DQoraW50MzJfdCBDQkNfQ29tbW9uQml0QXJyYXk6OkdldFNpemVJbkJ5dGVzKCkgew0KKyAgcmV0dXJuIChtX3NpemUgKyA3KSA+PiAzOw0KIH0NCi1GWF9CT09MIENCQ19Db21tb25CaXRBcnJheTo6R2V0KGludDMyX3QgaSkNCi17DQotICAgIHJldHVybiAobV9iaXRzW2kgPj4gNV0gJiAoMSA8PCAoaSAmIDB4MWYpKSkgIT0gMDsNCitGWF9CT09MIENCQ19Db21tb25CaXRBcnJheTo6R2V0KGludDMyX3QgaSkgew0KKyAgcmV0dXJuIChtX2JpdHNbaSA+PiA1XSAmICgxIDw8IChpICYgMHgxZikpKSAhPSAwOw0KIH0NCi12b2lkIENCQ19Db21tb25CaXRBcnJheTo6U2V0KGludDMyX3QgaSkNCi17DQotICAgIG1fYml0c1tpID4+IDVdIHw9IDEgPDwgKGkgJiAweDFGKTsNCit2b2lkIENCQ19Db21tb25CaXRBcnJheTo6U2V0KGludDMyX3QgaSkgew0KKyAgbV9iaXRzW2kgPj4gNV0gfD0gMSA8PCAoaSAmIDB4MUYpOw0KIH0NCi12b2lkIENCQ19Db21tb25CaXRBcnJheTo6RmxpcChpbnQzMl90IGkpDQotew0KLSAgICBtX2JpdHNbaSA+PiA1XSBePSAxIDw8IChpICYgMHgxRik7DQordm9pZCBDQkNfQ29tbW9uQml0QXJyYXk6OkZsaXAoaW50MzJfdCBpKSB7DQorICBtX2JpdHNbaSA+PiA1XSBePSAxIDw8IChpICYgMHgxRik7DQogfQ0KLXZvaWQgQ0JDX0NvbW1vbkJpdEFycmF5OjpTZXRCdWxrKGludDMyX3QgaSwgaW50MzJfdCBuZXdCaXRzKQ0KLXsNCi0gICAgbV9iaXRzW2kgPj4gNV0gPSBuZXdCaXRzOw0KK3ZvaWQgQ0JDX0NvbW1vbkJpdEFycmF5OjpTZXRCdWxrKGludDMyX3QgaSwgaW50MzJfdCBuZXdCaXRzKSB7DQorICBtX2JpdHNbaSA+PiA1XSA9IG5ld0JpdHM7DQogfQ0KLXZvaWQgQ0JDX0NvbW1vbkJpdEFycmF5OjpDbGVhcigpDQotew0KLSAgICBGWFNZU19tZW1zZXQoJm1fYml0c1swXSwgMHgwMCwgbV9iaXRzLkdldFNpemUoKSAqIHNpemVvZihpbnQzMl90KSk7DQordm9pZCBDQkNfQ29tbW9uQml0QXJyYXk6OkNsZWFyKCkgew0KKyAgRlhTWVNfbWVtc2V0KCZtX2JpdHNbMF0sIDB4MDAsIG1fYml0cy5HZXRTaXplKCkgKiBzaXplb2YoaW50MzJfdCkpOw0KIH0NCi1GWF9CT09MIENCQ19Db21tb25CaXRBcnJheTo6SXNSYW5nZShpbnQzMl90IHN0YXJ0LCBpbnQzMl90IGVuZCwgRlhfQk9PTCB2YWx1ZSwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChlbmQgPCBzdGFydCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uRW5kTGVzc1RoYW5TdGFydDsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoZW5kID09IHN0YXJ0KSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBlbmQtLTsNCi0gICAgaW50MzJfdCBmaXJzdEludCA9IHN0YXJ0ID4+IDU7DQotICAgIGludDMyX3QgbGFzdEludCA9IGVuZCA+PiA1Ow0KLSAgICBpbnQzMl90IGk7DQotICAgIGZvciAoaSA9IGZpcnN0SW50OyBpIDw9IGxhc3RJbnQ7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBmaXJzdEJpdCA9IGkgPiBmaXJzdEludCA/IDAgOiBzdGFydCAmIDB4MUY7DQotICAgICAgICBpbnQzMl90IGxhc3RCaXQgPSBpIDwgbGFzdEludCA/IDMxIDogZW5kICYgMHgxRjsNCi0gICAgICAgIGludDMyX3QgbWFzazsNCi0gICAgICAgIGlmIChmaXJzdEJpdCA9PSAwICYmIGxhc3RCaXQgPT0gMzEpIHsNCi0gICAgICAgICAgICBtYXNrID0gLTE7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1hc2sgPSAwOw0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gZmlyc3RCaXQ7IGogPD0gbGFzdEJpdDsgaisrKSB7DQotICAgICAgICAgICAgICAgIG1hc2sgfD0gMSA8PCBqOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICgobV9iaXRzW2ldICYgbWFzaykgIT0gKHZhbHVlID8gbWFzayA6IDApKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQorRlhfQk9PTCBDQkNfQ29tbW9uQml0QXJyYXk6OklzUmFuZ2UoaW50MzJfdCBzdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIHZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChlbmQgPCBzdGFydCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25FbmRMZXNzVGhhblN0YXJ0Ow0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoZW5kID09IHN0YXJ0KSB7DQogICAgIHJldHVybiBUUlVFOw0KLX0NCi1pbnQzMl90KiBDQkNfQ29tbW9uQml0QXJyYXk6OkdldEJpdEFycmF5KCkNCi17DQotICAgIHJldHVybiAmbV9iaXRzWzBdOw0KLX0NCi12b2lkIENCQ19Db21tb25CaXRBcnJheTo6UmV2ZXJzZSgpDQotew0KLSAgICBpbnQzMl90KiBuZXdCaXRzID0gRlhfQWxsb2MoaW50MzJfdCwgbV9iaXRzLkdldFNpemUoKSk7DQotICAgIEZYU1lTX21lbXNldChuZXdCaXRzLCAweDAwLCBtX2JpdHMuR2V0U2l6ZSgpICogc2l6ZW9mKGludDMyX3QpKTsNCi0gICAgaW50MzJfdCBzaXplID0gbV9zaXplOw0KLSAgICBpbnQzMl90IGk7DQotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCi0gICAgICAgIGlmIChHZXQoc2l6ZSAtIGkgLSAxKSkgew0KLSAgICAgICAgICAgIG5ld0JpdHNbaSA+PiA1XSB8PSAxIDw8IChpICYgMHgxRik7DQotICAgICAgICB9DQorICB9DQorICBlbmQtLTsNCisgIGludDMyX3QgZmlyc3RJbnQgPSBzdGFydCA+PiA1Ow0KKyAgaW50MzJfdCBsYXN0SW50ID0gZW5kID4+IDU7DQorICBpbnQzMl90IGk7DQorICBmb3IgKGkgPSBmaXJzdEludDsgaSA8PSBsYXN0SW50OyBpKyspIHsNCisgICAgaW50MzJfdCBmaXJzdEJpdCA9IGkgPiBmaXJzdEludCA/IDAgOiBzdGFydCAmIDB4MUY7DQorICAgIGludDMyX3QgbGFzdEJpdCA9IGkgPCBsYXN0SW50ID8gMzEgOiBlbmQgJiAweDFGOw0KKyAgICBpbnQzMl90IG1hc2s7DQorICAgIGlmIChmaXJzdEJpdCA9PSAwICYmIGxhc3RCaXQgPT0gMzEpIHsNCisgICAgICBtYXNrID0gLTE7DQorICAgIH0gZWxzZSB7DQorICAgICAgbWFzayA9IDA7DQorICAgICAgZm9yIChpbnQzMl90IGogPSBmaXJzdEJpdDsgaiA8PSBsYXN0Qml0OyBqKyspIHsNCisgICAgICAgIG1hc2sgfD0gMSA8PCBqOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGWFNZU19tZW1jcHkoJm1fYml0c1swXSwgbmV3Qml0cywgbV9iaXRzLkdldFNpemUoKSAqIHNpemVvZihpbnQzMl90KSk7DQotICAgIEZYX0ZyZWUobmV3Qml0cyk7DQorICAgIGlmICgobV9iaXRzW2ldICYgbWFzaykgIT0gKHZhbHVlID8gbWFzayA6IDApKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQoraW50MzJfdCogQ0JDX0NvbW1vbkJpdEFycmF5OjpHZXRCaXRBcnJheSgpIHsNCisgIHJldHVybiAmbV9iaXRzWzBdOw0KK30NCit2b2lkIENCQ19Db21tb25CaXRBcnJheTo6UmV2ZXJzZSgpIHsNCisgIGludDMyX3QqIG5ld0JpdHMgPSBGWF9BbGxvYyhpbnQzMl90LCBtX2JpdHMuR2V0U2l6ZSgpKTsNCisgIEZYU1lTX21lbXNldChuZXdCaXRzLCAweDAwLCBtX2JpdHMuR2V0U2l6ZSgpICogc2l6ZW9mKGludDMyX3QpKTsNCisgIGludDMyX3Qgc2l6ZSA9IG1fc2l6ZTsNCisgIGludDMyX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisgICAgaWYgKEdldChzaXplIC0gaSAtIDEpKSB7DQorICAgICAgbmV3Qml0c1tpID4+IDVdIHw9IDEgPDwgKGkgJiAweDFGKTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhTWVNfbWVtY3B5KCZtX2JpdHNbMF0sIG5ld0JpdHMsIG1fYml0cy5HZXRTaXplKCkgKiBzaXplb2YoaW50MzJfdCkpOw0KKyAgRlhfRnJlZShuZXdCaXRzKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaAppbmRleCAzMmI5NGY0Li5mNDc1OGY3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaApAQCAtNiwyNiArNiwyNiBAQAogDQogI2lmbmRlZiBfQkNfQ09NTU9OQklUQVJSQVlfSF8NCiAjZGVmaW5lIF9CQ19DT01NT05CSVRBUlJBWV9IXw0KLWNsYXNzIENCQ19Db21tb25CaXRBcnJheQ0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19Db21tb25CaXRBcnJheShDQkNfQ29tbW9uQml0QXJyYXkqIGFycmF5KTsNCi0gICAgQ0JDX0NvbW1vbkJpdEFycmF5KGludDMyX3Qgc2l6ZSk7DQotICAgIENCQ19Db21tb25CaXRBcnJheSgpOw0KLSAgICB2aXJ0dWFsIH5DQkNfQ29tbW9uQml0QXJyYXkoKTsNCi0gICAgaW50MzJfdCBHZXRTaXplKCk7DQotICAgIENGWF9JbnQzMkFycmF5JiBHZXRCaXRzKCk7DQotICAgIGludDMyX3QgR2V0U2l6ZUluQnl0ZXMoKTsNCi0gICAgRlhfQk9PTCBHZXQoaW50MzJfdCBpKTsNCi0gICAgdm9pZCBTZXQoaW50MzJfdCBpKTsNCi0gICAgdm9pZCBGbGlwKGludDMyX3QgaSk7DQotICAgIHZvaWQgU2V0QnVsayhpbnQzMl90IGksIGludDMyX3QgbmV3Qml0cyk7DQotICAgIEZYX0JPT0wgSXNSYW5nZShpbnQzMl90IHN0YXJ0LCBpbnQzMl90IGVuZCwgRlhfQk9PTCB2YWx1ZSwgaW50MzJfdCAmZSk7DQotICAgIGludDMyX3QgKkdldEJpdEFycmF5KCk7DQotICAgIHZvaWQgUmV2ZXJzZSgpOw0KLSAgICB2b2lkIENsZWFyKCk7DQotcHJpdmF0ZToNCi0gICAgaW50MzJfdCAgbV9zaXplOw0KLSAgICBDRlhfSW50MzJBcnJheSBtX2JpdHM7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5IHsNCisgcHVibGljOg0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KENCQ19Db21tb25CaXRBcnJheSogYXJyYXkpOw0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KGludDMyX3Qgc2l6ZSk7DQorICBDQkNfQ29tbW9uQml0QXJyYXkoKTsNCisgIHZpcnR1YWwgfkNCQ19Db21tb25CaXRBcnJheSgpOw0KKyAgaW50MzJfdCBHZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSYgR2V0Qml0cygpOw0KKyAgaW50MzJfdCBHZXRTaXplSW5CeXRlcygpOw0KKyAgRlhfQk9PTCBHZXQoaW50MzJfdCBpKTsNCisgIHZvaWQgU2V0KGludDMyX3QgaSk7DQorICB2b2lkIEZsaXAoaW50MzJfdCBpKTsNCisgIHZvaWQgU2V0QnVsayhpbnQzMl90IGksIGludDMyX3QgbmV3Qml0cyk7DQorICBGWF9CT09MIElzUmFuZ2UoaW50MzJfdCBzdGFydCwgaW50MzJfdCBlbmQsIEZYX0JPT0wgdmFsdWUsIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCogR2V0Qml0QXJyYXkoKTsNCisgIHZvaWQgUmV2ZXJzZSgpOw0KKyAgdm9pZCBDbGVhcigpOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBtX3NpemU7DQorICBDRlhfSW50MzJBcnJheSBtX2JpdHM7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguY3BwCmluZGV4IDk2ZGJlZDguLmQ1Nzk2ZDEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguY3BwCkBAIC0yMywxMzkgKzIzLDEyNyBAQAogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfQ29tbW9uQml0QXJyYXkuaCINCiAjaW5jbHVkZSAiQkNfQ29tbW9uQml0TWF0cml4LmgiDQotQ0JDX0NvbW1vbkJpdE1hdHJpeDo6Q0JDX0NvbW1vbkJpdE1hdHJpeCgpDQotew0KLSAgICBtX3dpZHRoID0gMDsNCi0gICAgbV9oZWlnaHQgPSAwOw0KLSAgICBtX3Jvd1NpemUgPSAwOw0KLSAgICBtX2JpdHMgPSBOVUxMOw0KK0NCQ19Db21tb25CaXRNYXRyaXg6OkNCQ19Db21tb25CaXRNYXRyaXgoKSB7DQorICBtX3dpZHRoID0gMDsNCisgIG1faGVpZ2h0ID0gMDsNCisgIG1fcm93U2l6ZSA9IDA7DQorICBtX2JpdHMgPSBOVUxMOw0KIH0NCi12b2lkIENCQ19Db21tb25CaXRNYXRyaXg6OkluaXQoaW50MzJfdCBkaW1lbnNpb24pDQotew0KLSAgICBtX3dpZHRoID0gZGltZW5zaW9uOw0KLSAgICBtX2hlaWdodCA9IGRpbWVuc2lvbjsNCi0gICAgaW50MzJfdCByb3dTaXplID0gKG1faGVpZ2h0ICsgMzEpID4+IDU7DQotICAgIG1fcm93U2l6ZSA9IHJvd1NpemU7DQotICAgIG1fYml0cyA9IEZYX0FsbG9jKGludDMyX3QsIG1fcm93U2l6ZSAqIG1faGVpZ2h0KTsNCi0gICAgRlhTWVNfbWVtc2V0KG1fYml0cywgMCwgbV9yb3dTaXplICogbV9oZWlnaHQgKiBzaXplb2YoaW50MzJfdCkpOw0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6SW5pdChpbnQzMl90IGRpbWVuc2lvbikgew0KKyAgbV93aWR0aCA9IGRpbWVuc2lvbjsNCisgIG1faGVpZ2h0ID0gZGltZW5zaW9uOw0KKyAgaW50MzJfdCByb3dTaXplID0gKG1faGVpZ2h0ICsgMzEpID4+IDU7DQorICBtX3Jvd1NpemUgPSByb3dTaXplOw0KKyAgbV9iaXRzID0gRlhfQWxsb2MoaW50MzJfdCwgbV9yb3dTaXplICogbV9oZWlnaHQpOw0KKyAgRlhTWVNfbWVtc2V0KG1fYml0cywgMCwgbV9yb3dTaXplICogbV9oZWlnaHQgKiBzaXplb2YoaW50MzJfdCkpOw0KIH0NCi12b2lkIENCQ19Db21tb25CaXRNYXRyaXg6OkluaXQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpDQotew0KLSAgICBtX3dpZHRoID0gd2lkdGg7DQotICAgIG1faGVpZ2h0ID0gaGVpZ2h0Ow0KLSAgICBpbnQzMl90IHJvd1NpemUgPSAod2lkdGggKyAzMSkgPj4gNTsNCi0gICAgbV9yb3dTaXplID0gcm93U2l6ZTsNCi0gICAgbV9iaXRzID0gRlhfQWxsb2MoaW50MzJfdCwgbV9yb3dTaXplICogbV9oZWlnaHQpOw0KLSAgICBGWFNZU19tZW1zZXQobV9iaXRzLCAwLCBtX3Jvd1NpemUgKiBtX2hlaWdodCAqIHNpemVvZihpbnQzMl90KSk7DQordm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpJbml0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7DQorICBtX3dpZHRoID0gd2lkdGg7DQorICBtX2hlaWdodCA9IGhlaWdodDsNCisgIGludDMyX3Qgcm93U2l6ZSA9ICh3aWR0aCArIDMxKSA+PiA1Ow0KKyAgbV9yb3dTaXplID0gcm93U2l6ZTsNCisgIG1fYml0cyA9IEZYX0FsbG9jKGludDMyX3QsIG1fcm93U2l6ZSAqIG1faGVpZ2h0KTsNCisgIEZYU1lTX21lbXNldChtX2JpdHMsIDAsIG1fcm93U2l6ZSAqIG1faGVpZ2h0ICogc2l6ZW9mKGludDMyX3QpKTsNCiB9DQotQ0JDX0NvbW1vbkJpdE1hdHJpeDo6fkNCQ19Db21tb25CaXRNYXRyaXgoKQ0KLXsNCi0gICAgaWYgKG1fYml0cyAhPSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKG1fYml0cyk7DQotICAgIH0NCi0gICAgbV9iaXRzID0gTlVMTDsNCi0gICAgbV9oZWlnaHQgPSBtX3dpZHRoID0gbV9yb3dTaXplID0gMDsNCitDQkNfQ29tbW9uQml0TWF0cml4Ojp+Q0JDX0NvbW1vbkJpdE1hdHJpeCgpIHsNCisgIGlmIChtX2JpdHMgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fYml0cyk7DQorICB9DQorICBtX2JpdHMgPSBOVUxMOw0KKyAgbV9oZWlnaHQgPSBtX3dpZHRoID0gbV9yb3dTaXplID0gMDsNCiB9DQotRlhfQk9PTCBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXQoaW50MzJfdCB4LCBpbnQzMl90IHkpDQotew0KLSAgICBpbnQzMl90IG9mZnNldCA9IHkgKiBtX3Jvd1NpemUgKyAoeCA+PiA1KTsNCi0gICAgaWYgKG9mZnNldCA+PSBtX3Jvd1NpemUgKiBtX2hlaWdodCB8fCBvZmZzZXQgPCAwKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0gICAgcmV0dXJuICgoKChGWF9EV09SRCltX2JpdHNbb2Zmc2V0XSkgPj4gKHggJiAweDFmKSkgJiAxKSAhPSAwOw0KK0ZYX0JPT0wgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0KGludDMyX3QgeCwgaW50MzJfdCB5KSB7DQorICBpbnQzMl90IG9mZnNldCA9IHkgKiBtX3Jvd1NpemUgKyAoeCA+PiA1KTsNCisgIGlmIChvZmZzZXQgPj0gbV9yb3dTaXplICogbV9oZWlnaHQgfHwgb2Zmc2V0IDwgMCkgew0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICByZXR1cm4gKCgoKEZYX0RXT1JEKW1fYml0c1tvZmZzZXRdKSA+PiAoeCAmIDB4MWYpKSAmIDEpICE9IDA7DQogfQ0KLWludDMyX3QqIENCQ19Db21tb25CaXRNYXRyaXg6OkdldEJpdHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYml0czsNCitpbnQzMl90KiBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXRCaXRzKCkgew0KKyAgcmV0dXJuIG1fYml0czsNCiB9DQotdm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpTZXQoaW50MzJfdCB4LCBpbnQzMl90IHkpDQotew0KLSAgICBpbnQzMl90IG9mZnNldCA9IHkgKiBtX3Jvd1NpemUgKyAoeCA+PiA1KTsNCi0gICAgaWYgKG9mZnNldCA+PSBtX3Jvd1NpemUgKiBtX2hlaWdodCB8fCBvZmZzZXQgPCAwKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgbV9iaXRzW29mZnNldF0gfD0gMSA8PCAoeCAmIDB4MWYpOw0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0KGludDMyX3QgeCwgaW50MzJfdCB5KSB7DQorICBpbnQzMl90IG9mZnNldCA9IHkgKiBtX3Jvd1NpemUgKyAoeCA+PiA1KTsNCisgIGlmIChvZmZzZXQgPj0gbV9yb3dTaXplICogbV9oZWlnaHQgfHwgb2Zmc2V0IDwgMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX2JpdHNbb2Zmc2V0XSB8PSAxIDw8ICh4ICYgMHgxZik7DQogfQ0KLXZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6RmxpcChpbnQzMl90IHgsIGludDMyX3QgeSkNCi17DQotICAgIGludDMyX3Qgb2Zmc2V0ID0geSAqIG1fcm93U2l6ZSArICh4ID4+IDUpOw0KLSAgICBtX2JpdHNbb2Zmc2V0XSBePSAxIDw8ICh4ICYgMHgxZik7DQordm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpGbGlwKGludDMyX3QgeCwgaW50MzJfdCB5KSB7DQorICBpbnQzMl90IG9mZnNldCA9IHkgKiBtX3Jvd1NpemUgKyAoeCA+PiA1KTsNCisgIG1fYml0c1tvZmZzZXRdIF49IDEgPDwgKHggJiAweDFmKTsNCiB9DQotdm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpDbGVhcigpDQotew0KLSAgICBGWFNZU19tZW1zZXQobV9iaXRzLCAwLCBtX3Jvd1NpemUgKiBtX2hlaWdodCAqIHNpemVvZihpbnQzMl90KSk7DQordm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpDbGVhcigpIHsNCisgIEZYU1lTX21lbXNldChtX2JpdHMsIDAsIG1fcm93U2l6ZSAqIG1faGVpZ2h0ICogc2l6ZW9mKGludDMyX3QpKTsNCiB9DQotdm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpTZXRSZWdpb24oaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAodG9wIDwgMCB8fCBsZWZ0IDwgMCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTGVmdEFuZFRvcE11c3RCZU5vbm5lZ2F0aXZlOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChoZWlnaHQgPCAxIHx8IHdpZHRoIDwgMSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSGVpZ2h0QW5kV2lkdGhNdXN0QmVBdExlYXN0MTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHJpZ2h0ID0gbGVmdCArIHdpZHRoOw0KLSAgICBpbnQzMl90IGJvdHRvbSA9IHRvcCArIGhlaWdodDsNCi0gICAgaWYgKG1faGVpZ2h0IDwgYm90dG9tIHx8IG1fd2lkdGggPCByaWdodCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uUmVnaW9uTXVzdEZpdEluc2lkZU1hdHJpeDsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHk7DQotICAgIGZvciAoeSA9IHRvcDsgeSA8IGJvdHRvbTsgeSsrKSB7DQotICAgICAgICBpbnQzMl90IG9mZnNldCA9IHkgKiBtX3Jvd1NpemU7DQotICAgICAgICBpbnQzMl90IHg7DQotICAgICAgICBmb3IgKHggPSBsZWZ0OyB4IDwgcmlnaHQ7IHgrKykgew0KLSAgICAgICAgICAgIG1fYml0c1tvZmZzZXQgKyAoeCA+PiA1KV0gfD0gMSA8PCAoeCAmIDB4MWYpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLUNCQ19Db21tb25CaXRBcnJheSogQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0Um93KGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3cpDQotew0KLSAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvd0FycmF5ID0gTlVMTDsNCi0gICAgaWYgKHJvdyA9PSBOVUxMIHx8IHJvdy0+R2V0U2l6ZSgpIDwgbV93aWR0aCkgew0KLSAgICAgICAgcm93QXJyYXkgPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdEFycmF5KG1fd2lkdGgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcm93QXJyYXkgPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdEFycmF5KHJvdyk7DQotICAgIH0NCit2b2lkIENCQ19Db21tb25CaXRNYXRyaXg6OlNldFJlZ2lvbihpbnQzMl90IGxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAodG9wIDwgMCB8fCBsZWZ0IDwgMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25MZWZ0QW5kVG9wTXVzdEJlTm9ubmVnYXRpdmU7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChoZWlnaHQgPCAxIHx8IHdpZHRoIDwgMSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25IZWlnaHRBbmRXaWR0aE11c3RCZUF0TGVhc3QxOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IHJpZ2h0ID0gbGVmdCArIHdpZHRoOw0KKyAgaW50MzJfdCBib3R0b20gPSB0b3AgKyBoZWlnaHQ7DQorICBpZiAobV9oZWlnaHQgPCBib3R0b20gfHwgbV93aWR0aCA8IHJpZ2h0KSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvblJlZ2lvbk11c3RGaXRJbnNpZGVNYXRyaXg7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgeTsNCisgIGZvciAoeSA9IHRvcDsgeSA8IGJvdHRvbTsgeSsrKSB7DQogICAgIGludDMyX3Qgb2Zmc2V0ID0geSAqIG1fcm93U2l6ZTsNCiAgICAgaW50MzJfdCB4Ow0KLSAgICBmb3IgKHggPSAwOyB4IDwgbV9yb3dTaXplOyB4KyspIHsNCi0gICAgICAgIHJvd0FycmF5LT5TZXRCdWxrKHggPDwgNSwgbV9iaXRzW29mZnNldCArIHhdKTsNCisgICAgZm9yICh4ID0gbGVmdDsgeCA8IHJpZ2h0OyB4KyspIHsNCisgICAgICBtX2JpdHNbb2Zmc2V0ICsgKHggPj4gNSldIHw9IDEgPDwgKHggJiAweDFmKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gcm93QXJyYXk7DQorICB9DQogfQ0KLXZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0Um93KGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3cpDQotew0KLSAgICBpbnQzMl90IGwgPSB5ICogbV9yb3dTaXplOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX3Jvd1NpemU7IGkrKykgew0KLSAgICAgICAgbV9iaXRzW2xdID0gcm93LT5HZXRCaXRBcnJheSgpW2ldOw0KLSAgICAgICAgbCsrOw0KLSAgICB9DQorQ0JDX0NvbW1vbkJpdEFycmF5KiBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXRSb3coaW50MzJfdCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93KSB7DQorICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvd0FycmF5ID0gTlVMTDsNCisgIGlmIChyb3cgPT0gTlVMTCB8fCByb3ctPkdldFNpemUoKSA8IG1fd2lkdGgpIHsNCisgICAgcm93QXJyYXkgPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdEFycmF5KG1fd2lkdGgpOw0KKyAgfSBlbHNlIHsNCisgICAgcm93QXJyYXkgPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdEFycmF5KHJvdyk7DQorICB9DQorICBpbnQzMl90IG9mZnNldCA9IHkgKiBtX3Jvd1NpemU7DQorICBpbnQzMl90IHg7DQorICBmb3IgKHggPSAwOyB4IDwgbV9yb3dTaXplOyB4KyspIHsNCisgICAgcm93QXJyYXktPlNldEJ1bGsoeCA8PCA1LCBtX2JpdHNbb2Zmc2V0ICsgeF0pOw0KKyAgfQ0KKyAgcmV0dXJuIHJvd0FycmF5Ow0KIH0NCi12b2lkIENCQ19Db21tb25CaXRNYXRyaXg6OlNldENvbChpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSogY29sKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29sLT5HZXRCaXRzKCkuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIG1fYml0c1tpICogbV9yb3dTaXplICsgeV0gPSBjb2wtPkdldEJpdEFycmF5KClbaV07DQotICAgIH0NCit2b2lkIENCQ19Db21tb25CaXRNYXRyaXg6OlNldFJvdyhpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSogcm93KSB7DQorICBpbnQzMl90IGwgPSB5ICogbV9yb3dTaXplOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9yb3dTaXplOyBpKyspIHsNCisgICAgbV9iaXRzW2xdID0gcm93LT5HZXRCaXRBcnJheSgpW2ldOw0KKyAgICBsKys7DQorICB9DQogfQ0KLWludDMyX3QgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0V2lkdGgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fd2lkdGg7DQordm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpTZXRDb2woaW50MzJfdCB5LCBDQkNfQ29tbW9uQml0QXJyYXkqIGNvbCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29sLT5HZXRCaXRzKCkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgbV9iaXRzW2kgKiBtX3Jvd1NpemUgKyB5XSA9IGNvbC0+R2V0Qml0QXJyYXkoKVtpXTsNCisgIH0NCiB9DQotaW50MzJfdCBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXRIZWlnaHQoKQ0KLXsNCi0gICAgcmV0dXJuIG1faGVpZ2h0Ow0KK2ludDMyX3QgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0V2lkdGgoKSB7DQorICByZXR1cm4gbV93aWR0aDsNCiB9DQotaW50MzJfdCBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXRSb3dTaXplKCkNCi17DQotICAgIHJldHVybiBtX3Jvd1NpemU7DQoraW50MzJfdCBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXRIZWlnaHQoKSB7DQorICByZXR1cm4gbV9oZWlnaHQ7DQogfQ0KLWludDMyX3QgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0RGltZW5zaW9uKGludDMyX3QgJmUpDQotew0KLSAgICBpZiAobV93aWR0aCAhPSBtX2hlaWdodCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2FuTm90Q2FsbEdldERpbWVuc2lvbk9uTm9uU3F1YXJlTWF0cml4Ow0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fd2lkdGg7DQoraW50MzJfdCBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXRSb3dTaXplKCkgew0KKyAgcmV0dXJuIG1fcm93U2l6ZTsNCit9DQoraW50MzJfdCBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXREaW1lbnNpb24oaW50MzJfdCYgZSkgew0KKyAgaWYgKG1fd2lkdGggIT0gbV9oZWlnaHQpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQ2FuTm90Q2FsbEdldERpbWVuc2lvbk9uTm9uU3F1YXJlTWF0cml4Ow0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiBtX3dpZHRoOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgKaW5kZXggNGMxMjlmZC4uNDJjYmVkZiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaApAQCAtNywzMSArNywzNSBAQAogI2lmbmRlZiBfQkNfQ09NTU9OQklUTUFUUklYX0hfDQogI2RlZmluZSBfQkNfQ09NTU9OQklUTUFUUklYX0hfDQogY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KLWNsYXNzIENCQ19Db21tb25CaXRNYXRyaXgNCi17DQotcHVibGljOg0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4KCk7DQotICAgIHZpcnR1YWwgfkNCQ19Db21tb25CaXRNYXRyaXgoKTsNCi0gICAgRlhfQk9PTCBHZXQoaW50MzJfdCB4LCBpbnQzMl90IHkpOw0KLSAgICB2b2lkIFNldChpbnQzMl90IHgsIGludDMyX3QgeSk7DQotICAgIHZvaWQgRmxpcChpbnQzMl90IHgsIGludDMyX3QgeSk7DQotICAgIHZvaWQgQ2xlYXIoKTsNCi0gICAgdm9pZCBTZXRSZWdpb24oaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgJmUpOw0KLSAgICBDQkNfQ29tbW9uQml0QXJyYXkqIEdldFJvdyhpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSogcm93KTsNCi0gICAgdm9pZCBTZXRSb3coaW50MzJfdCB5LCBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdyk7DQotICAgIENCQ19Db21tb25CaXRBcnJheSogR2V0Q29sKGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3cpOw0KLSAgICB2b2lkIFNldENvbChpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSogY29sKTsNCi0gICAgaW50MzJfdCBHZXRXaWR0aCgpOw0KLSAgICBpbnQzMl90IEdldEhlaWdodCgpOw0KLSAgICBpbnQzMl90IEdldFJvd1NpemUoKTsNCi0gICAgaW50MzJfdCBHZXREaW1lbnNpb24oaW50MzJfdCAmZSk7DQotICAgIHZpcnR1YWwgdm9pZCBJbml0KGludDMyX3QgZGltZW5zaW9uKTsNCi0gICAgdmlydHVhbCB2b2lkIEluaXQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOw0KLSAgICBpbnQzMl90KiBHZXRCaXRzKCk7DQotcHJpdmF0ZToNCi0gICAgaW50MzJfdCBtX3dpZHRoOw0KLSAgICBpbnQzMl90IG1faGVpZ2h0Ow0KLSAgICBpbnQzMl90IG1fcm93U2l6ZTsNCi0gICAgaW50MzJfdCogbV9iaXRzOw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXggew0KKyBwdWJsaWM6DQorICBDQkNfQ29tbW9uQml0TWF0cml4KCk7DQorICB2aXJ0dWFsIH5DQkNfQ29tbW9uQml0TWF0cml4KCk7DQorICBGWF9CT09MIEdldChpbnQzMl90IHgsIGludDMyX3QgeSk7DQorICB2b2lkIFNldChpbnQzMl90IHgsIGludDMyX3QgeSk7DQorICB2b2lkIEZsaXAoaW50MzJfdCB4LCBpbnQzMl90IHkpOw0KKyAgdm9pZCBDbGVhcigpOw0KKyAgdm9pZCBTZXRSZWdpb24oaW50MzJfdCBsZWZ0LA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCB0b3AsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENCQ19Db21tb25CaXRBcnJheSogR2V0Um93KGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3cpOw0KKyAgdm9pZCBTZXRSb3coaW50MzJfdCB5LCBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdyk7DQorICBDQkNfQ29tbW9uQml0QXJyYXkqIEdldENvbChpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSogcm93KTsNCisgIHZvaWQgU2V0Q29sKGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiBjb2wpOw0KKyAgaW50MzJfdCBHZXRXaWR0aCgpOw0KKyAgaW50MzJfdCBHZXRIZWlnaHQoKTsNCisgIGludDMyX3QgR2V0Um93U2l6ZSgpOw0KKyAgaW50MzJfdCBHZXREaW1lbnNpb24oaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdChpbnQzMl90IGRpbWVuc2lvbik7DQorICB2aXJ0dWFsIHZvaWQgSW5pdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7DQorICBpbnQzMl90KiBHZXRCaXRzKCk7DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fd2lkdGg7DQorICBpbnQzMl90IG1faGVpZ2h0Ow0KKyAgaW50MzJfdCBtX3Jvd1NpemU7DQorICBpbnQzMl90KiBtX2JpdHM7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0U291cmNlLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRTb3VyY2UuY3BwCmluZGV4IGYzMmQ2MzQuLjIwYjBkMmEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRTb3VyY2UuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRTb3VyY2UuY3BwCkBAIC0yMiw1NSArMjIsNTAgQEAKIA0KICNpbmNsdWRlICIuLi9iYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX0NvbW1vbkJpdFNvdXJjZS5oIg0KLUNCQ19Db21tb25CaXRTb3VyY2U6OkNCQ19Db21tb25CaXRTb3VyY2UoQ0ZYX0J5dGVBcnJheSogYnl0ZXMpDQotew0KLSAgICBtX2J5dGVzLkNvcHkoKCpieXRlcykpOw0KLSAgICBtX2JpdE9mZnNldCA9IDA7DQotICAgIG1fYnl0ZU9mZnNldCA9IDA7DQorQ0JDX0NvbW1vbkJpdFNvdXJjZTo6Q0JDX0NvbW1vbkJpdFNvdXJjZShDRlhfQnl0ZUFycmF5KiBieXRlcykgew0KKyAgbV9ieXRlcy5Db3B5KCgqYnl0ZXMpKTsNCisgIG1fYml0T2Zmc2V0ID0gMDsNCisgIG1fYnl0ZU9mZnNldCA9IDA7DQogfQ0KLUNCQ19Db21tb25CaXRTb3VyY2U6On5DQkNfQ29tbW9uQml0U291cmNlKCkNCi17DQotfQ0KLWludDMyX3QgQ0JDX0NvbW1vbkJpdFNvdXJjZTo6UmVhZEJpdHMoaW50MzJfdCBudW1CaXRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKG51bUJpdHMgPCAxIHx8IG51bUJpdHMgPiAzMikgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KLSAgICAgICAgcmV0dXJuIDA7DQorQ0JDX0NvbW1vbkJpdFNvdXJjZTo6fkNCQ19Db21tb25CaXRTb3VyY2UoKSB7fQ0KK2ludDMyX3QgQ0JDX0NvbW1vbkJpdFNvdXJjZTo6UmVhZEJpdHMoaW50MzJfdCBudW1CaXRzLCBpbnQzMl90JiBlKSB7DQorICBpZiAobnVtQml0cyA8IDEgfHwgbnVtQml0cyA+IDMyKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IHJlc3VsdCA9IDA7DQorICBpZiAobV9iaXRPZmZzZXQgPiAwKSB7DQorICAgIGludDMyX3QgYml0c0xlZnQgPSA4IC0gbV9iaXRPZmZzZXQ7DQorICAgIGludDMyX3QgdG9SZWFkID0gbnVtQml0cyA8IGJpdHNMZWZ0ID8gbnVtQml0cyA6IGJpdHNMZWZ0Ow0KKyAgICBpbnQzMl90IGJpdHNUb05vdFJlYWQgPSBiaXRzTGVmdCAtIHRvUmVhZDsNCisgICAgaW50MzJfdCBtYXNrID0gKDB4ZmYgPj4gKDggLSB0b1JlYWQpKSA8PCBiaXRzVG9Ob3RSZWFkOw0KKyAgICByZXN1bHQgPSAobV9ieXRlc1ttX2J5dGVPZmZzZXRdICYgbWFzaykgPj4gYml0c1RvTm90UmVhZDsNCisgICAgbnVtQml0cyAtPSB0b1JlYWQ7DQorICAgIG1fYml0T2Zmc2V0ICs9IHRvUmVhZDsNCisgICAgaWYgKG1fYml0T2Zmc2V0ID09IDgpIHsNCisgICAgICBtX2JpdE9mZnNldCA9IDA7DQorICAgICAgbV9ieXRlT2Zmc2V0Kys7DQogICAgIH0NCi0gICAgaW50MzJfdCByZXN1bHQgPSAwOw0KLSAgICBpZiAobV9iaXRPZmZzZXQgPiAwKSB7DQotICAgICAgICBpbnQzMl90IGJpdHNMZWZ0ID0gOCAtIG1fYml0T2Zmc2V0Ow0KLSAgICAgICAgaW50MzJfdCB0b1JlYWQgPSBudW1CaXRzIDwgYml0c0xlZnQgPyBudW1CaXRzIDogYml0c0xlZnQ7DQotICAgICAgICBpbnQzMl90IGJpdHNUb05vdFJlYWQgPSBiaXRzTGVmdCAtIHRvUmVhZDsNCi0gICAgICAgIGludDMyX3QgbWFzayA9ICgweGZmID4+ICg4IC0gdG9SZWFkKSkgPDwgYml0c1RvTm90UmVhZDsNCi0gICAgICAgIHJlc3VsdCA9IChtX2J5dGVzW21fYnl0ZU9mZnNldF0gJiBtYXNrKSA+PiBiaXRzVG9Ob3RSZWFkOw0KLSAgICAgICAgbnVtQml0cyAtPSB0b1JlYWQ7DQotICAgICAgICBtX2JpdE9mZnNldCArPSB0b1JlYWQ7DQotICAgICAgICBpZiAobV9iaXRPZmZzZXQgPT0gOCkgew0KLSAgICAgICAgICAgIG1fYml0T2Zmc2V0ID0gMDsNCi0gICAgICAgICAgICBtX2J5dGVPZmZzZXQrKzsNCi0gICAgICAgIH0NCisgIH0NCisgIGlmIChudW1CaXRzID4gMCkgew0KKyAgICB3aGlsZSAobnVtQml0cyA+PSA4KSB7DQorICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSB8IChtX2J5dGVzW21fYnl0ZU9mZnNldF0gJiAweGZmKTsNCisgICAgICBtX2J5dGVPZmZzZXQrKzsNCisgICAgICBudW1CaXRzIC09IDg7DQogICAgIH0NCiAgICAgaWYgKG51bUJpdHMgPiAwKSB7DQotICAgICAgICB3aGlsZShudW1CaXRzID49IDgpIHsNCi0gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpIHwgKG1fYnl0ZXNbbV9ieXRlT2Zmc2V0XSAmIDB4ZmYpOw0KLSAgICAgICAgICAgIG1fYnl0ZU9mZnNldCsrOw0KLSAgICAgICAgICAgIG51bUJpdHMgLT0gODsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChudW1CaXRzID4gMCkgew0KLSAgICAgICAgICAgIGludDMyX3QgYml0c1RvTm90UmVhZCA9IDggLSBudW1CaXRzOw0KLSAgICAgICAgICAgIGludDMyX3QgbWFzayA9ICgweGZmID4+IGJpdHNUb05vdFJlYWQpIDw8IGJpdHNUb05vdFJlYWQ7DQotICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCBudW1CaXRzKSB8ICgobV9ieXRlc1ttX2J5dGVPZmZzZXRdICYgbWFzaykgPj4gYml0c1RvTm90UmVhZCk7DQotICAgICAgICAgICAgbV9iaXRPZmZzZXQgKz0gbnVtQml0czsNCi0gICAgICAgIH0NCisgICAgICBpbnQzMl90IGJpdHNUb05vdFJlYWQgPSA4IC0gbnVtQml0czsNCisgICAgICBpbnQzMl90IG1hc2sgPSAoMHhmZiA+PiBiaXRzVG9Ob3RSZWFkKSA8PCBiaXRzVG9Ob3RSZWFkOw0KKyAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgbnVtQml0cykgfA0KKyAgICAgICAgICAgICAgICgobV9ieXRlc1ttX2J5dGVPZmZzZXRdICYgbWFzaykgPj4gYml0c1RvTm90UmVhZCk7DQorICAgICAgbV9iaXRPZmZzZXQgKz0gbnVtQml0czsNCiAgICAgfQ0KLSAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCiB9DQotaW50MzJfdCBDQkNfQ29tbW9uQml0U291cmNlOjpBdmFpbGFibGUoKQ0KLXsNCi0gICAgcmV0dXJuIDggKiAobV9ieXRlcy5HZXRTaXplKCkgLSBtX2J5dGVPZmZzZXQpIC0gbV9iaXRPZmZzZXQ7DQoraW50MzJfdCBDQkNfQ29tbW9uQml0U291cmNlOjpBdmFpbGFibGUoKSB7DQorICByZXR1cm4gOCAqIChtX2J5dGVzLkdldFNpemUoKSAtIG1fYnl0ZU9mZnNldCkgLSBtX2JpdE9mZnNldDsNCiB9DQotaW50MzJfdCBDQkNfQ29tbW9uQml0U291cmNlOjpnZXRCeXRlT2Zmc2V0KCkNCi17DQotICAgIHJldHVybiBtX2J5dGVPZmZzZXQ7DQoraW50MzJfdCBDQkNfQ29tbW9uQml0U291cmNlOjpnZXRCeXRlT2Zmc2V0KCkgew0KKyAgcmV0dXJuIG1fYnl0ZU9mZnNldDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdFNvdXJjZS5oIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdFNvdXJjZS5oCmluZGV4IDI3OGI0YjYuLmNjYjY2YmYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRTb3VyY2UuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0U291cmNlLmgKQEAgLTYsMTcgKzYsMTcgQEAKIA0KICNpZm5kZWYgX0JDX0NPTU1PTkJJVFNPVVJDRV9IXw0KICNkZWZpbmUgX0JDX0NPTU1PTkJJVFNPVVJDRV9IXw0KLWNsYXNzIENCQ19Db21tb25CaXRTb3VyY2UNCi17DQotcHVibGljOg0KLSAgICBDQkNfQ29tbW9uQml0U291cmNlKENGWF9CeXRlQXJyYXkgKmJ5dGVzKTsNCi0gICAgdmlydHVhbCB+Q0JDX0NvbW1vbkJpdFNvdXJjZSgpOw0KLSAgICBpbnQzMl90IFJlYWRCaXRzKGludDMyX3QgbnVtQml0cywgaW50MzJfdCAmZSk7DQotICAgIGludDMyX3QgQXZhaWxhYmxlKCk7DQotICAgIGludDMyX3QgZ2V0Qnl0ZU9mZnNldCgpOw0KLXByaXZhdGU6DQotICAgIENGWF9CeXRlQXJyYXkgbV9ieXRlczsNCi0gICAgaW50MzJfdCBtX2J5dGVPZmZzZXQ7DQotICAgIGludDMyX3QgbV9iaXRPZmZzZXQ7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdFNvdXJjZSB7DQorIHB1YmxpYzoNCisgIENCQ19Db21tb25CaXRTb3VyY2UoQ0ZYX0J5dGVBcnJheSogYnl0ZXMpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbW1vbkJpdFNvdXJjZSgpOw0KKyAgaW50MzJfdCBSZWFkQml0cyhpbnQzMl90IG51bUJpdHMsIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBBdmFpbGFibGUoKTsNCisgIGludDMyX3QgZ2V0Qnl0ZU9mZnNldCgpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX0J5dGVBcnJheSBtX2J5dGVzOw0KKyAgaW50MzJfdCBtX2J5dGVPZmZzZXQ7DQorICBpbnQzMl90IG1fYml0T2Zmc2V0Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmNwcAppbmRleCBiZWM3OWQyLi4wYWQwN2ZkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmNwcApAQCAtMjIsOTMgKzIyLDgzIEBACiANCiAjaW5jbHVkZSAiLi4vYmFyY29kZS5oIg0KICNpbmNsdWRlICJCQ19Db21tb25CeXRlQXJyYXkuaCINCi1DQkNfQ29tbW9uQnl0ZUFycmF5OjpDQkNfQ29tbW9uQnl0ZUFycmF5KCkNCi17DQorQ0JDX0NvbW1vbkJ5dGVBcnJheTo6Q0JDX0NvbW1vbkJ5dGVBcnJheSgpIHsNCisgIG1fYnl0ZXMgPSBOVUxMOw0KKyAgbV9zaXplID0gMDsNCisgIG1faW5kZXggPSAwOw0KK30NCitDQkNfQ29tbW9uQnl0ZUFycmF5OjpDQkNfQ29tbW9uQnl0ZUFycmF5KGludDMyX3Qgc2l6ZSkgew0KKyAgbV9zaXplID0gc2l6ZTsNCisgIG1fYnl0ZXMgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsNCisgIEZYU1lTX21lbXNldChtX2J5dGVzLCAwLCBzaXplKTsNCisgIG1faW5kZXggPSAwOw0KK30NCitDQkNfQ29tbW9uQnl0ZUFycmF5OjpDQkNfQ29tbW9uQnl0ZUFycmF5KHVpbnQ4X3QqIGJ5dGVBcnJheSwgaW50MzJfdCBzaXplKSB7DQorICBtX3NpemUgPSBzaXplOw0KKyAgbV9ieXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOw0KKyAgRlhTWVNfbWVtY3B5KG1fYnl0ZXMsIGJ5dGVBcnJheSwgc2l6ZSk7DQorICBtX2luZGV4ID0gc2l6ZTsNCit9DQorQ0JDX0NvbW1vbkJ5dGVBcnJheTo6fkNCQ19Db21tb25CeXRlQXJyYXkoKSB7DQorICBpZiAobV9ieXRlcyAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUobV9ieXRlcyk7DQogICAgIG1fYnl0ZXMgPSBOVUxMOw0KLSAgICBtX3NpemUgPSAwOw0KLSAgICBtX2luZGV4ID0gMDsNCisgIH0NCisgIG1faW5kZXggPSAwOw0KKyAgbV9zaXplID0gMDsNCiB9DQotQ0JDX0NvbW1vbkJ5dGVBcnJheTo6Q0JDX0NvbW1vbkJ5dGVBcnJheShpbnQzMl90IHNpemUpDQotew0KLSAgICBtX3NpemUgPSBzaXplOw0KLSAgICBtX2J5dGVzID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7DQotICAgIEZYU1lTX21lbXNldChtX2J5dGVzLCAwLCBzaXplKTsNCi0gICAgbV9pbmRleCA9IDA7DQoraW50MzJfdCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpBdChpbnQzMl90IGluZGV4KSB7DQorICByZXR1cm4gbV9ieXRlc1tpbmRleF0gJiAweGZmOw0KIH0NCi1DQkNfQ29tbW9uQnl0ZUFycmF5OjpDQkNfQ29tbW9uQnl0ZUFycmF5KHVpbnQ4X3QqIGJ5dGVBcnJheSwgaW50MzJfdCBzaXplKQ0KLXsNCi0gICAgbV9zaXplID0gc2l6ZTsNCi0gICAgbV9ieXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOw0KLSAgICBGWFNZU19tZW1jcHkobV9ieXRlcywgYnl0ZUFycmF5LCBzaXplKTsNCi0gICAgbV9pbmRleCA9IHNpemU7DQordm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpTZXQoaW50MzJfdCBpbmRleCwgaW50MzJfdCB2YWx1ZSkgew0KKyAgbV9ieXRlc1tpbmRleF0gPSAodWludDhfdCl2YWx1ZTsNCiB9DQotQ0JDX0NvbW1vbkJ5dGVBcnJheTo6fkNCQ19Db21tb25CeXRlQXJyYXkoKQ0KLXsNCi0gICAgaWYgKCBtX2J5dGVzICE9IE5VTEwpIHsNCi0gICAgICAgIEZYX0ZyZWUoIG1fYnl0ZXMgKTsNCi0gICAgICAgIG1fYnl0ZXMgPSBOVUxMOw0KLSAgICB9DQotICAgIG1faW5kZXggPSAwOw0KLSAgICBtX3NpemUgPSAwOw0KK2ludDMyX3QgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6U2l6ZSgpIHsNCisgIHJldHVybiBtX3NpemU7DQogfQ0KLWludDMyX3QgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6QXQoaW50MzJfdCBpbmRleCkNCi17DQotICAgIHJldHVybiBtX2J5dGVzW2luZGV4XSAmIDB4ZmY7DQorRlhfQk9PTCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpJc0VtcHR5KCkgew0KKyAgcmV0dXJuIG1fc2l6ZSA9PSAwOw0KIH0NCi12b2lkIENCQ19Db21tb25CeXRlQXJyYXk6OlNldChpbnQzMl90IGluZGV4LCBpbnQzMl90IHZhbHVlKQ0KLXsNCi0gICAgbV9ieXRlc1tpbmRleF0gPSAodWludDhfdCkgdmFsdWU7DQordm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpBcHBlbmRCeXRlKGludDMyX3QgdmFsdWUpIHsNCisgIGlmIChtX3NpemUgPT0gMCB8fCBtX2luZGV4ID49IG1fc2l6ZSkgew0KKyAgICBpbnQzMl90IG5ld1NpemUgPSBGWF9NQVgoMzIsIG1fc2l6ZSA8PCAxKTsNCisgICAgUmVzZXJ2ZShuZXdTaXplKTsNCisgIH0NCisgIG1fYnl0ZXNbbV9pbmRleF0gPSAodWludDhfdCl2YWx1ZTsNCisgIG1faW5kZXgrKzsNCiB9DQotaW50MzJfdCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpTaXplKCkNCi17DQotICAgIHJldHVybiBtX3NpemU7DQotfQ0KLUZYX0JPT0wgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6SXNFbXB0eSgpDQotew0KLSAgICByZXR1cm4gbV9zaXplID09IDA7DQotfQ0KLXZvaWQgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6QXBwZW5kQnl0ZShpbnQzMl90IHZhbHVlKQ0KLXsNCi0gICAgaWYgKG1fc2l6ZSA9PSAwIHx8IG1faW5kZXggPj0gbV9zaXplKSB7DQotICAgICAgICBpbnQzMl90IG5ld1NpemUgPSBGWF9NQVgoMzIsIG1fc2l6ZSA8PCAxKTsNCi0gICAgICAgIFJlc2VydmUobmV3U2l6ZSk7DQotICAgIH0NCi0gICAgbV9ieXRlc1ttX2luZGV4XSA9ICh1aW50OF90KXZhbHVlOw0KLSAgICBtX2luZGV4Kys7DQotfQ0KLXZvaWQgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6UmVzZXJ2ZShpbnQzMl90IGNhcGFjaXR5KQ0KLXsNCi0gICAgaWYgKG1fYnl0ZXMgPT0gTlVMTCB8fCBtX3NpemUgPCBjYXBhY2l0eSkgew0KLSAgICAgICAgdWludDhfdCAqbmV3QXJyYXkgPSBGWF9BbGxvYyh1aW50OF90LCBjYXBhY2l0eSk7DQotICAgICAgICBGWFNZU19tZW1zZXQobmV3QXJyYXksIDAsIGNhcGFjaXR5KTsNCi0gICAgICAgIGlmIChtX2J5dGVzICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBGWFNZU19tZW1jcHkobmV3QXJyYXksIG1fYnl0ZXMsIG1fc2l6ZSk7DQotICAgICAgICAgICAgRlhfRnJlZSggbV9ieXRlcyApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9ieXRlcyA9IG5ld0FycmF5Ow0KLSAgICAgICAgbV9zaXplID0gY2FwYWNpdHk7DQotICAgIH0NCi19DQotdm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpTZXQodWludDhfdCogc291cmNlLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBjb3VudCkNCi17DQordm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpSZXNlcnZlKGludDMyX3QgY2FwYWNpdHkpIHsNCisgIGlmIChtX2J5dGVzID09IE5VTEwgfHwgbV9zaXplIDwgY2FwYWNpdHkpIHsNCisgICAgdWludDhfdCogbmV3QXJyYXkgPSBGWF9BbGxvYyh1aW50OF90LCBjYXBhY2l0eSk7DQorICAgIEZYU1lTX21lbXNldChuZXdBcnJheSwgMCwgY2FwYWNpdHkpOw0KICAgICBpZiAobV9ieXRlcyAhPSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKCBtX2J5dGVzICk7DQorICAgICAgRlhTWVNfbWVtY3B5KG5ld0FycmF5LCBtX2J5dGVzLCBtX3NpemUpOw0KKyAgICAgIEZYX0ZyZWUobV9ieXRlcyk7DQogICAgIH0NCi0gICAgbV9ieXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIGNvdW50KTsNCi0gICAgbV9zaXplID0gY291bnQ7DQotICAgIEZYU1lTX21lbWNweShtX2J5dGVzLCBzb3VyY2UgKyBvZmZzZXQsIGNvdW50KTsNCi0gICAgbV9pbmRleCA9IGNvdW50Ow0KKyAgICBtX2J5dGVzID0gbmV3QXJyYXk7DQorICAgIG1fc2l6ZSA9IGNhcGFjaXR5Ow0KKyAgfQ0KIH0NCi12b2lkIENCQ19Db21tb25CeXRlQXJyYXk6OlNldChDRlhfQnl0ZUFycmF5KiBzb3VyY2UsIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGNvdW50KQ0KLXsNCi0gICAgaWYgKG1fYnl0ZXMgIT0gTlVMTCkgew0KLSAgICAgICAgRlhfRnJlZSggbV9ieXRlcyApOw0KLSAgICB9DQotICAgIG1fYnl0ZXMgPSAgRlhfQWxsb2ModWludDhfdCwgY291bnQpOw0KLSAgICBtX3NpemUgPSBjb3VudDsNCi0gICAgaW50MzJfdCBpOw0KLSAgICBmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQotICAgICAgICBtX2J5dGVzW2ldID0gc291cmNlLT5vcGVyYXRvciBbXShpICsgb2Zmc2V0KTsNCi0gICAgfQ0KLSAgICBtX2luZGV4ID0gbV9zaXplOw0KK3ZvaWQgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6U2V0KHVpbnQ4X3QqIHNvdXJjZSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgY291bnQpIHsNCisgIGlmIChtX2J5dGVzICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShtX2J5dGVzKTsNCisgIH0NCisgIG1fYnl0ZXMgPSBGWF9BbGxvYyh1aW50OF90LCBjb3VudCk7DQorICBtX3NpemUgPSBjb3VudDsNCisgIEZYU1lTX21lbWNweShtX2J5dGVzLCBzb3VyY2UgKyBvZmZzZXQsIGNvdW50KTsNCisgIG1faW5kZXggPSBjb3VudDsNCit9DQordm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpTZXQoQ0ZYX0J5dGVBcnJheSogc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQpIHsNCisgIGlmIChtX2J5dGVzICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShtX2J5dGVzKTsNCisgIH0NCisgIG1fYnl0ZXMgPSBGWF9BbGxvYyh1aW50OF90LCBjb3VudCk7DQorICBtX3NpemUgPSBjb3VudDsNCisgIGludDMyX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgIG1fYnl0ZXNbaV0gPSBzb3VyY2UtPm9wZXJhdG9yW10oaSArIG9mZnNldCk7DQorICB9DQorICBtX2luZGV4ID0gbV9zaXplOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmgKaW5kZXggMjM0YjI1ZC4uMTJlMjE0YyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlQXJyYXkuaApAQCAtNiwyNCArNiwyNCBAQAogDQogI2lmbmRlZiBfQkNfQ09NTU9OQllURUFSUkFZX0hfDQogI2RlZmluZSBfQkNfQ09NTU9OQllURUFSUkFZX0hfDQotY2xhc3MgQ0JDX0NvbW1vbkJ5dGVBcnJheQ0KLXsNCi1wcml2YXRlOg0KLSAgICBpbnQzMl90IG1fc2l6ZTsNCi0gICAgaW50MzJfdCBtX2luZGV4Ow0KLSAgICB1aW50OF90KiBtX2J5dGVzOw0KLXB1YmxpYzoNCi0gICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSgpOw0KLSAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KGludDMyX3Qgc2l6ZSk7DQotICAgIENCQ19Db21tb25CeXRlQXJyYXkodWludDhfdCogYnl0ZUFycmF5LCBpbnQzMl90IHNpemUpOw0KLSAgICB2aXJ0dWFsIH5DQkNfQ29tbW9uQnl0ZUFycmF5KCk7DQotICAgIGludDMyX3QgQXQoaW50MzJfdCBpbmRleCk7DQotICAgIHZvaWQgU2V0KGludDMyX3QgaW5kZXgsIGludDMyX3QgdmFsdWUpOw0KLSAgICBpbnQzMl90IFNpemUoKTsNCi0gICAgRlhfQk9PTCBJc0VtcHR5KCk7DQotICAgIHZvaWQgQXBwZW5kQnl0ZShpbnQzMl90IHZhbHVlKTsNCi0gICAgdm9pZCBSZXNlcnZlKGludDMyX3QgY2FwYWNpdHkpOw0KLSAgICB2b2lkIFNldCh1aW50OF90KiBzb3VyY2UsIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGNvdW50KTsNCi0gICAgdm9pZCBTZXQoQ0ZYX0J5dGVBcnJheSogc291cmNlLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBjb3VudCk7DQorY2xhc3MgQ0JDX0NvbW1vbkJ5dGVBcnJheSB7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fc2l6ZTsNCisgIGludDMyX3QgbV9pbmRleDsNCisgIHVpbnQ4X3QqIG1fYnl0ZXM7DQorDQorIHB1YmxpYzoNCisgIENCQ19Db21tb25CeXRlQXJyYXkoKTsNCisgIENCQ19Db21tb25CeXRlQXJyYXkoaW50MzJfdCBzaXplKTsNCisgIENCQ19Db21tb25CeXRlQXJyYXkodWludDhfdCogYnl0ZUFycmF5LCBpbnQzMl90IHNpemUpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbW1vbkJ5dGVBcnJheSgpOw0KKyAgaW50MzJfdCBBdChpbnQzMl90IGluZGV4KTsNCisgIHZvaWQgU2V0KGludDMyX3QgaW5kZXgsIGludDMyX3QgdmFsdWUpOw0KKyAgaW50MzJfdCBTaXplKCk7DQorICBGWF9CT09MIElzRW1wdHkoKTsNCisgIHZvaWQgQXBwZW5kQnl0ZShpbnQzMl90IHZhbHVlKTsNCisgIHZvaWQgUmVzZXJ2ZShpbnQzMl90IGNhcGFjaXR5KTsNCisgIHZvaWQgU2V0KHVpbnQ4X3QqIHNvdXJjZSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgY291bnQpOw0KKyAgdm9pZCBTZXQoQ0ZYX0J5dGVBcnJheSogc291cmNlLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBjb3VudCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5jcHAKaW5kZXggZDk2M2ViOS4uZWU0ZWVlMiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmNwcApAQCAtMjIsNTUgKzIyLDQ1IEBACiANCiAjaW5jbHVkZSAiLi4vYmFyY29kZS5oIg0KICNpbmNsdWRlICJCQ19Db21tb25CeXRlTWF0cml4LmgiDQotQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkNCQ19Db21tb25CeXRlTWF0cml4KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KQ0KLXsNCi0gICAgbV9oZWlnaHQgPSBoZWlnaHQ7DQotICAgIG1fd2lkdGggPSB3aWR0aDsNCitDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6Q0JDX0NvbW1vbkJ5dGVNYXRyaXgoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsNCisgIG1faGVpZ2h0ID0gaGVpZ2h0Ow0KKyAgbV93aWR0aCA9IHdpZHRoOw0KKyAgbV9ieXRlcyA9IE5VTEw7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkluaXQoKSB7DQorICBtX2J5dGVzID0gRlhfQWxsb2ModWludDhfdCwgbV9oZWlnaHQgKiBtX3dpZHRoKTsNCisgIEZYU1lTX21lbXNldChtX2J5dGVzLCAweGZmLCBtX2hlaWdodCAqIG1fd2lkdGgpOw0KK30NCitDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6fkNCQ19Db21tb25CeXRlTWF0cml4KCkgew0KKyAgaWYgKG1fYnl0ZXMgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fYnl0ZXMpOw0KICAgICBtX2J5dGVzID0gTlVMTDsNCisgIH0NCiB9DQotdm9pZCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6SW5pdCgpDQotew0KLSAgICBtX2J5dGVzID0gRlhfQWxsb2ModWludDhfdCwgbV9oZWlnaHQgKiBtX3dpZHRoKTsNCi0gICAgRlhTWVNfbWVtc2V0KG1fYnl0ZXMsIDB4ZmYsIG1faGVpZ2h0ICogbV93aWR0aCk7DQoraW50MzJfdCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6R2V0SGVpZ2h0KCkgew0KKyAgcmV0dXJuIG1faGVpZ2h0Ow0KIH0NCi1DQkNfQ29tbW9uQnl0ZU1hdHJpeDo6fkNCQ19Db21tb25CeXRlTWF0cml4KCkNCi17DQotICAgIGlmKG1fYnl0ZXMgIT0gTlVMTCkgew0KLSAgICAgICAgRlhfRnJlZShtX2J5dGVzKTsNCi0gICAgICAgIG1fYnl0ZXMgPSBOVUxMOw0KK2ludDMyX3QgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkdldFdpZHRoKCkgew0KKyAgcmV0dXJuIG1fd2lkdGg7DQorfQ0KK3VpbnQ4X3QgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkdldChpbnQzMl90IHgsIGludDMyX3QgeSkgew0KKyAgcmV0dXJuIG1fYnl0ZXNbeSAqIG1fd2lkdGggKyB4XTsNCit9DQordm9pZCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6U2V0KGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHZhbHVlKSB7DQorICBtX2J5dGVzW3kgKiBtX3dpZHRoICsgeF0gPSAodWludDhfdCl2YWx1ZTsNCit9DQordm9pZCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6U2V0KGludDMyX3QgeCwgaW50MzJfdCB5LCB1aW50OF90IHZhbHVlKSB7DQorICBtX2J5dGVzW3kgKiBtX3dpZHRoICsgeF0gPSB2YWx1ZTsNCit9DQordm9pZCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6Y2xlYXIodWludDhfdCB2YWx1ZSkgew0KKyAgaW50MzJfdCB5Ow0KKyAgZm9yICh5ID0gMDsgeSA8IG1faGVpZ2h0OyB5KyspIHsNCisgICAgaW50MzJfdCB4Ow0KKyAgICBmb3IgKHggPSAwOyB4IDwgbV93aWR0aDsgeCsrKSB7DQorICAgICAgbV9ieXRlc1t5ICogbV93aWR0aCArIHhdID0gdmFsdWU7DQogICAgIH0NCisgIH0NCiB9DQotaW50MzJfdCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6R2V0SGVpZ2h0KCkNCi17DQotICAgIHJldHVybiBtX2hlaWdodDsNCi19DQotaW50MzJfdCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6R2V0V2lkdGgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fd2lkdGg7DQotfQ0KLXVpbnQ4X3QgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkdldChpbnQzMl90IHgsIGludDMyX3QgeSkNCi17DQotICAgIHJldHVybiBtX2J5dGVzW3kgKiBtX3dpZHRoICsgeF07DQotfQ0KLXZvaWQgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OlNldChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB2YWx1ZSkNCi17DQotICAgIG1fYnl0ZXNbeSAqIG1fd2lkdGggKyB4XSA9ICh1aW50OF90KXZhbHVlOw0KLX0NCi12b2lkIENCQ19Db21tb25CeXRlTWF0cml4OjpTZXQoaW50MzJfdCB4LCBpbnQzMl90IHksIHVpbnQ4X3QgdmFsdWUpDQotew0KLSAgICBtX2J5dGVzW3kgKiBtX3dpZHRoICsgeF0gPSB2YWx1ZTsNCi19DQotdm9pZCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6Y2xlYXIodWludDhfdCB2YWx1ZSkNCi17DQotICAgIGludDMyX3QgeTsNCi0gICAgZm9yKHkgPSAwOyB5IDwgbV9oZWlnaHQ7IHkrKykgew0KLSAgICAgICAgaW50MzJfdCB4Ow0KLSAgICAgICAgZm9yKHggPSAwOyB4IDwgbV93aWR0aDsgeCsrKSB7DQotICAgICAgICAgICAgbV9ieXRlc1t5ICogbV93aWR0aCArIHhdID0gdmFsdWU7DQotICAgICAgICB9DQotICAgIH0NCi19DQotdWludDhfdCogQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkdldEFycmF5KCkNCi17DQotICAgIHJldHVybiBtX2J5dGVzOw0KK3VpbnQ4X3QqIENCQ19Db21tb25CeXRlTWF0cml4OjpHZXRBcnJheSgpIHsNCisgIHJldHVybiBtX2J5dGVzOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguaAppbmRleCBmMTllMDAzLi5iOTRkYWY4IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgKQEAgLTYsMjMgKzYsMjMgQEAKIA0KICNpZm5kZWYgX0JDX0NPTU1PTkJZVEVNQVRSSVhfSF8NCiAjZGVmaW5lIF9CQ19DT01NT05CWVRFTUFUUklYX0hfDQotY2xhc3MgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgNCi17DQotcHVibGljOg0KLSAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7DQotICAgIHZpcnR1YWwgfkNCQ19Db21tb25CeXRlTWF0cml4KCk7DQotICAgIGludDMyX3QgR2V0SGVpZ2h0KCk7DQotICAgIGludDMyX3QgR2V0V2lkdGgoKTsNCi0gICAgdWludDhfdCBHZXQoaW50MzJfdCB4LCBpbnQzMl90IHkpOw0KLSAgICB1aW50OF90KiBHZXRBcnJheSgpOw0KK2NsYXNzIENCQ19Db21tb25CeXRlTWF0cml4IHsNCisgcHVibGljOg0KKyAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbW1vbkJ5dGVNYXRyaXgoKTsNCisgIGludDMyX3QgR2V0SGVpZ2h0KCk7DQorICBpbnQzMl90IEdldFdpZHRoKCk7DQorICB1aW50OF90IEdldChpbnQzMl90IHgsIGludDMyX3QgeSk7DQorICB1aW50OF90KiBHZXRBcnJheSgpOw0KIA0KLSAgICB2b2lkIFNldChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB2YWx1ZSk7DQotICAgIHZvaWQgU2V0KGludDMyX3QgeCwgaW50MzJfdCB5LCB1aW50OF90IHZhbHVlKTsNCi0gICAgdm9pZCBjbGVhcih1aW50OF90IHZhbHVlKTsNCi0gICAgdmlydHVhbCB2b2lkIEluaXQoKTsNCi1wcml2YXRlOg0KLSAgICB1aW50OF90ICptX2J5dGVzOw0KLSAgICBpbnQzMl90IG1fd2lkdGg7DQotICAgIGludDMyX3QgbV9oZWlnaHQ7DQorICB2b2lkIFNldChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB2YWx1ZSk7DQorICB2b2lkIFNldChpbnQzMl90IHgsIGludDMyX3QgeSwgdWludDhfdCB2YWx1ZSk7DQorICB2b2lkIGNsZWFyKHVpbnQ4X3QgdmFsdWUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoKTsNCisNCisgcHJpdmF0ZToNCisgIHVpbnQ4X3QqIG1fYnl0ZXM7DQorICBpbnQzMl90IG1fd2lkdGg7DQorICBpbnQzMl90IG1faGVpZ2h0Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmNwcAppbmRleCAzNmY4ZTEwLi5mYmM2NjA3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmNwcApAQCAtMjMsMjggKzIzLDIyIEBACiAjaW5jbHVkZSAiLi4vYmFyY29kZS5oIg0KICNpbmNsdWRlICJCQ19Db21tb25FQ0kuaCINCiAjaW5jbHVkZSAiQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmgiDQotdm9pZCBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjppbml0aWFsaXplKCkNCi17DQordm9pZCBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjppbml0aWFsaXplKCkge30NCitDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjpDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKA0KKyAgICBpbnQzMl90IHZhbHVlLA0KKyAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZ05hbWUpDQorICAgIDogQ0JDX0NvbW1vbkVDSSh2YWx1ZSksIG1fZW5jb2RpbmdOYW1lKGVuY29kaW5nTmFtZSkge30NCitDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjp+Q0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSgpIHt9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSTo6R2V0RW5jb2RpbmdOYW1lKCkgew0KKyAgcmV0dXJuIG1fZW5jb2RpbmdOYW1lOw0KIH0NCi1DQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjpDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKGludDMyX3QgdmFsdWUsIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nTmFtZSk6DQotICAgIENCQ19Db21tb25FQ0kodmFsdWUpLCBtX2VuY29kaW5nTmFtZShlbmNvZGluZ05hbWUpDQotew0KK3ZvaWQgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSTo6QWRkQ2hhcmFjdGVyU2V0KGludDMyX3QgdmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmdOYW1lKSB7fQ0KK0NCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kqIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0k6OkdldENoYXJhY3RlclNldEVDSUJ5VmFsdWUoDQorICAgIGludDMyX3QgdmFsdWUpIHsNCisgIHJldHVybiBOVUxMOw0KIH0NCi1DQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjp+Q0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSgpDQotew0KLX0NCi1DRlhfQnl0ZVN0cmluZyBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjpHZXRFbmNvZGluZ05hbWUoKQ0KLXsNCi0gICAgcmV0dXJuIG1fZW5jb2RpbmdOYW1lOw0KLX0NCi12b2lkIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0k6OkFkZENoYXJhY3RlclNldChpbnQzMl90IHZhbHVlLCBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZ05hbWUpDQotew0KLX0NCi1DQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKiBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjpHZXRDaGFyYWN0ZXJTZXRFQ0lCeVZhbHVlKGludDMyX3QgdmFsdWUpDQotew0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSogQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSTo6R2V0Q2hhcmFjdGVyU2V0RUNJQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQorQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSogQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSTo6R2V0Q2hhcmFjdGVyU2V0RUNJQnlOYW1lKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgew0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kuaAppbmRleCAxYzMyNDc5Li41Y2RjNGQ2IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5oCkBAIC04LDE4ICs4LDE5IEBACiAjZGVmaW5lIF9CQ19DT01NT05DSEFSQUNURVJTRVRFQ0lfSF8NCiBjbGFzcyBDQkNfQ29tbW9uRUNJOw0KIGNsYXNzIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0k7DQotY2xhc3MgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSA6IHB1YmxpYyBDQkNfQ29tbW9uRUNJDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSShpbnQzMl90IHZhbHVlLCBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZ05hbWUpOw0KLSAgICB2aXJ0dWFsIH5DQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKCk7DQotICAgIENGWF9CeXRlU3RyaW5nIEdldEVuY29kaW5nTmFtZSgpOw0KLSAgICBzdGF0aWMgdm9pZCBBZGRDaGFyYWN0ZXJTZXQoaW50MzJfdCB2YWx1ZSwgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmdOYW1lKTsNCi0gICAgaW50MzJfdCBHZXRWYWx1ZSgpOw0KLSAgICBzdGF0aWMgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSogR2V0Q2hhcmFjdGVyU2V0RUNJQnlWYWx1ZShpbnQzMl90IHZhbHVlKTsNCi0gICAgc3RhdGljIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kqIEdldENoYXJhY3RlclNldEVDSUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7DQotcHJpdmF0ZToNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgbV9lbmNvZGluZ05hbWU7DQotICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKTsNCitjbGFzcyBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJIDogcHVibGljIENCQ19Db21tb25FQ0kgew0KKyBwdWJsaWM6DQorICBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKGludDMyX3QgdmFsdWUsIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nTmFtZSk7DQorICB2aXJ0dWFsIH5DQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKCk7DQorICBDRlhfQnl0ZVN0cmluZyBHZXRFbmNvZGluZ05hbWUoKTsNCisgIHN0YXRpYyB2b2lkIEFkZENoYXJhY3RlclNldChpbnQzMl90IHZhbHVlLCBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZ05hbWUpOw0KKyAgaW50MzJfdCBHZXRWYWx1ZSgpOw0KKyAgc3RhdGljIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kqIEdldENoYXJhY3RlclNldEVDSUJ5VmFsdWUoaW50MzJfdCB2YWx1ZSk7DQorICBzdGF0aWMgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSogR2V0Q2hhcmFjdGVyU2V0RUNJQnlOYW1lKA0KKyAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9CeXRlU3RyaW5nIG1fZW5jb2RpbmdOYW1lOw0KKyAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuY3BwCmluZGV4IGUxN2E1OGQuLmQ1Zjk3MDIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5jcHAKQEAgLTI0LDU2ICsyNCw1NCBAQAogI2luY2x1ZGUgIi4uL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCiAjaW5jbHVkZSAiLi4vcGRmNDE3L0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhLmgiDQogI2luY2x1ZGUgIkJDX0NvbW1vbkRlY29kZXJSZXN1bHQuaCINCi1DQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6Q0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKQ0KLXsNCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6Q0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKSB7fQ0KK3ZvaWQgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OkluaXQoY29uc3QgQ0ZYX0J5dGVBcnJheSYgcmF3Qnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgdGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBieXRlU2VnbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKHRleHQuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9yYXdCeXRlcy5Db3B5KHJhd0J5dGVzKTsNCisgIG1fdGV4dCA9IHRleHQ7DQorICBtX2J5dGVTZWdtZW50cy5Db3B5KGJ5dGVTZWdtZW50cyk7DQorICBtX2VjTGV2ZWwgPSBlY0xldmVsOw0KKyAgbV9vdGhlciA9IE5VTEw7DQogfQ0KLXZvaWQgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OkluaXQoY29uc3QgQ0ZYX0J5dGVBcnJheSAmcmF3Qnl0ZXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nICZ0ZXh0LCBjb25zdCBDRlhfSW50MzJBcnJheSAmYnl0ZVNlZ21lbnRzLCAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKHRleHQuSXNFbXB0eSgpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgbV9yYXdCeXRlcy5Db3B5KHJhd0J5dGVzKTsNCi0gICAgbV90ZXh0ID0gdGV4dDsNCi0gICAgbV9ieXRlU2VnbWVudHMuQ29weShieXRlU2VnbWVudHMpOw0KLSAgICBtX2VjTGV2ZWwgPSBlY0xldmVsOw0KLSAgICBtX290aGVyID0gTlVMTDsNCit2b2lkIENCQ19Db21tb25EZWNvZGVyUmVzdWx0OjpJbml0KGNvbnN0IENGWF9CeXRlQXJyYXkmIHJhd0J5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUHRyQXJyYXkmIGJ5dGVTZWdtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKHRleHQuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9yYXdCeXRlcy5Db3B5KHJhd0J5dGVzKTsNCisgIG1fdGV4dCA9IHRleHQ7DQorICBtX3BkZjQxN2J5dGVTZWdtZW50cy5Db3B5KGJ5dGVTZWdtZW50cyk7DQorICBtX3BkZjQxN2VjTGV2ZWwgPSBlY0xldmVsOw0KKyAgbV9vdGhlciA9IE5VTEw7DQogfQ0KLXZvaWQgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OkluaXQoY29uc3QgQ0ZYX0J5dGVBcnJheSAmcmF3Qnl0ZXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nICZ0ZXh0LCBjb25zdCBDRlhfUHRyQXJyYXkgJmJ5dGVTZWdtZW50cywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmVjTGV2ZWwsIGludDMyX3QgJmUpDQotew0KLSAgICBpZih0ZXh0LklzRW1wdHkoKSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIG1fcmF3Qnl0ZXMuQ29weShyYXdCeXRlcyk7DQotICAgIG1fdGV4dCA9IHRleHQ7DQotICAgIG1fcGRmNDE3Ynl0ZVNlZ21lbnRzLkNvcHkoYnl0ZVNlZ21lbnRzKTsNCi0gICAgbV9wZGY0MTdlY0xldmVsID0gZWNMZXZlbDsNCi0gICAgbV9vdGhlciA9IE5VTEw7DQordm9pZCBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6c2V0T3RoZXIoQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKiBvdGhlcikgew0KKyAgbV9vdGhlciA9IG90aGVyOw0KIH0NCi12b2lkIENCQ19Db21tb25EZWNvZGVyUmVzdWx0OjpzZXRPdGhlcihDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEqIG90aGVyKQ0KLXsNCi0gICAgbV9vdGhlciA9IG90aGVyOw0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0Ojp+Q0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKSB7DQorICBpZiAobV9vdGhlciAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX290aGVyOw0KKyAgfQ0KIH0NCi1DQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6fkNCQ19Db21tb25EZWNvZGVyUmVzdWx0KCkNCi17DQotICAgIGlmIChtX290aGVyICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBtX290aGVyOw0KLSAgICB9DQorY29uc3QgQ0ZYX0J5dGVBcnJheSYgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OkdldFJhd0J5dGVzKCkgew0KKyAgcmV0dXJuIG1fcmF3Qnl0ZXM7DQogfQ0KLWNvbnN0IENGWF9CeXRlQXJyYXkmIENCQ19Db21tb25EZWNvZGVyUmVzdWx0OjpHZXRSYXdCeXRlcygpDQotew0KLSAgICByZXR1cm4gbV9yYXdCeXRlczsNCitjb25zdCBDRlhfSW50MzJBcnJheSYgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OkdldEJ5dGVTZWdtZW50cygpIHsNCisgIHJldHVybiBtX2J5dGVTZWdtZW50czsNCiB9DQotY29uc3QgQ0ZYX0ludDMyQXJyYXkmIENCQ19Db21tb25EZWNvZGVyUmVzdWx0OjpHZXRCeXRlU2VnbWVudHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYnl0ZVNlZ21lbnRzOw0KK2NvbnN0IENGWF9CeXRlU3RyaW5nJiBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6R2V0VGV4dCgpIHsNCisgIHJldHVybiBtX3RleHQ7DQogfQ0KLWNvbnN0IENGWF9CeXRlU3RyaW5nJiBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6R2V0VGV4dCgpDQotew0KLSAgICByZXR1cm4gbV90ZXh0Ow0KLX0NCi1DQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDo6R2V0RUNMZXZlbCgpDQotew0KLSAgICByZXR1cm4gbV9lY0xldmVsOw0KK0NCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIENCQ19Db21tb25EZWNvZGVyUmVzdWx0OjpHZXRFQ0xldmVsKCkgew0KKyAgcmV0dXJuIG1fZWNMZXZlbDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmgKaW5kZXggZTg1MzE3OS4uNDBjM2EwOSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5oCkBAIC04LDI1ICs4LDMzIEBACiAjZGVmaW5lIF9CQ19DT01NT05ERUNPREVSUkVTVUxUX0hfDQogY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsNCiBjbGFzcyBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE7DQotY2xhc3MgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQNCi17DQotcHVibGljOg0KLSAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCgpOw0KLSAgICB2aXJ0dWFsIH5DQkNfQ29tbW9uRGVjb2RlclJlc3VsdCgpOw0KLSAgICBjb25zdCBDRlhfQnl0ZUFycmF5JiBHZXRSYXdCeXRlcygpOw0KLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgR2V0VGV4dCgpOw0KLSAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgR2V0Qnl0ZVNlZ21lbnRzKCk7DQotICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIEdldEVDTGV2ZWwoKTsNCi0gICAgdmlydHVhbCB2b2lkIEluaXQoY29uc3QgQ0ZYX0J5dGVBcnJheSAmcmF3Qnl0ZXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nICZ0ZXh0LCBjb25zdCBDRlhfSW50MzJBcnJheSAmYnl0ZVNlZ21lbnRzLCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLCBpbnQzMl90ICZlKTsNCi0gICAgdmlydHVhbCB2b2lkIEluaXQoY29uc3QgQ0ZYX0J5dGVBcnJheSAmcmF3Qnl0ZXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nICZ0ZXh0LCBjb25zdCBDRlhfUHRyQXJyYXkgJmJ5dGVTZWdtZW50cywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmVjTGV2ZWwsIGludDMyX3QgJmUpOw0KLSAgICB2b2lkIHNldE90aGVyKENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSogb3RoZXIpOw0KLXByaXZhdGU6DQotICAgIENGWF9CeXRlQXJyYXkgbV9yYXdCeXRlczsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgbV90ZXh0Ow0KLSAgICBDRlhfSW50MzJBcnJheSBtX2J5dGVTZWdtZW50czsNCi0gICAgQ0ZYX1B0ckFycmF5ICAgbV9wZGY0MTdieXRlU2VnbWVudHM7DQotICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIG1fZWNMZXZlbDsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgbV9wZGY0MTdlY0xldmVsOw0KLSAgICBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEqIG1fb3RoZXI7DQorY2xhc3MgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQgew0KKyBwdWJsaWM6DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCgpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKTsNCisgIGNvbnN0IENGWF9CeXRlQXJyYXkmIEdldFJhd0J5dGVzKCk7DQorICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgR2V0VGV4dCgpOw0KKyAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIEdldEJ5dGVTZWdtZW50cygpOw0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogR2V0RUNMZXZlbCgpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoY29uc3QgQ0ZYX0J5dGVBcnJheSYgcmF3Qnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgdGV4dCwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBieXRlU2VnbWVudHMsDQorICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdChjb25zdCBDRlhfQnl0ZUFycmF5JiByYXdCeXRlcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1B0ckFycmF5JiBieXRlU2VnbWVudHMsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdm9pZCBzZXRPdGhlcihDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEqIG90aGVyKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9CeXRlQXJyYXkgbV9yYXdCeXRlczsNCisgIENGWF9CeXRlU3RyaW5nIG1fdGV4dDsNCisgIENGWF9JbnQzMkFycmF5IG1fYnl0ZVNlZ21lbnRzOw0KKyAgQ0ZYX1B0ckFycmF5IG1fcGRmNDE3Ynl0ZVNlZ21lbnRzOw0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogbV9lY0xldmVsOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgbV9wZGY0MTdlY0xldmVsOw0KKyAgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKiBtX290aGVyOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkVDSS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRUNJLmNwcAppbmRleCA5OGU4OGI1Li4wOGNkZGM5IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRUNJLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRUNJLmNwcApAQCAtMjMsMjQgKzIzLDE5IEBACiAjaW5jbHVkZSAiLi4vYmFyY29kZS5oIg0KICNpbmNsdWRlICJCQ19Db21tb25FQ0kuaCINCiAjaW5jbHVkZSAiQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmgiDQotQ0JDX0NvbW1vbkVDSTo6Q0JDX0NvbW1vbkVDSShpbnQzMl90IHZhbHVlKQ0KLXsNCi0gICAgbV92YWx1ZSA9IHZhbHVlOw0KK0NCQ19Db21tb25FQ0k6OkNCQ19Db21tb25FQ0koaW50MzJfdCB2YWx1ZSkgew0KKyAgbV92YWx1ZSA9IHZhbHVlOw0KIH0NCi1DQkNfQ29tbW9uRUNJOjp+Q0JDX0NvbW1vbkVDSSgpDQotew0KK0NCQ19Db21tb25FQ0k6On5DQkNfQ29tbW9uRUNJKCkge30NCitpbnQzMl90IENCQ19Db21tb25FQ0k6OkdldFZhbHVlKCkgew0KKyAgcmV0dXJuIG1fdmFsdWU7DQogfQ0KLWludDMyX3QgQ0JDX0NvbW1vbkVDSTo6R2V0VmFsdWUoKQ0KLXsNCi0gICAgcmV0dXJuIG1fdmFsdWU7DQotfQ0KLUNCQ19Db21tb25FQ0kqIENCQ19Db21tb25FQ0k6OkdldEVJQ0J5VmFsdWUoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDk5OTk5OSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uQmFkRUNJOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaWYodmFsdWUgPCA5MDApIHsNCi0gICAgfQ0KK0NCQ19Db21tb25FQ0kqIENCQ19Db21tb25FQ0k6OkdldEVJQ0J5VmFsdWUoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCYgZSkgew0KKyAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDk5OTk5OSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25CYWRFQ0k7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKHZhbHVlIDwgOTAwKSB7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkVDSS5oIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkVDSS5oCmluZGV4IDUwM2YxNWYuLjFmOTAzODMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25FQ0kuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRUNJLmgKQEAgLTYsMTUgKzYsMTUgQEAKIA0KICNpZm5kZWYgX0JDX0NPTU1PTkVDSV9IXw0KICNkZWZpbmUgX0JDX0NPTU1PTkVDSV9IXw0KLWNsYXNzIENCQ19Db21tb25FQ0kNCi17DQotcHVibGljOg0KLSAgICBDQkNfQ29tbW9uRUNJKGludDMyX3QgdmFsdWUpOw0KLSAgICB2aXJ0dWFsIH5DQkNfQ29tbW9uRUNJKCk7DQorY2xhc3MgQ0JDX0NvbW1vbkVDSSB7DQorIHB1YmxpYzoNCisgIENCQ19Db21tb25FQ0koaW50MzJfdCB2YWx1ZSk7DQorICB2aXJ0dWFsIH5DQkNfQ29tbW9uRUNJKCk7DQogDQotICAgIGludDMyX3QgR2V0VmFsdWUoKTsNCi0gICAgc3RhdGljIENCQ19Db21tb25FQ0kqIEdldEVJQ0J5VmFsdWUoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCAmZSk7DQotcHJpdmF0ZToNCi0gICAgaW50MzJfdCBtX3ZhbHVlOw0KKyAgaW50MzJfdCBHZXRWYWx1ZSgpOw0KKyAgc3RhdGljIENCQ19Db21tb25FQ0kqIEdldEVJQ0J5VmFsdWUoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fdmFsdWU7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtLmNwcAppbmRleCA3ZmJjYWM1Li40OThjY2EyIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0uY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybS5jcHAKQEAgLTIyLDEwNCArMjIsMTI2IEBACiANCiAjaW5jbHVkZSAiLi4vYmFyY29kZS5oIg0KICNpbmNsdWRlICJCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybS5oIg0KLUNCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6Q0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKEZYX0ZMT0FUIGExMSwgRlhfRkxPQVQgYTIxLCBGWF9GTE9BVCBhMzEsDQotICAgICAgICBGWF9GTE9BVCBhMTIsIEZYX0ZMT0FUIGEyMiwgRlhfRkxPQVQgYTMyLA0KLSAgICAgICAgRlhfRkxPQVQgYTEzLCBGWF9GTE9BVCBhMjMsIEZYX0ZMT0FUIGEzMykgOg0KLSAgICBtX2ExMShhMTEpLCBtX2EyMShhMjEpLCBtX2EzMShhMzEpLA0KLSAgICBtX2ExMihhMTIpLCBtX2EyMihhMjIpLCBtX2EzMihhMzIpLA0KLSAgICBtX2ExMyhhMTMpLCBtX2EyMyhhMjMpLCBtX2EzMyhhMzMpDQotew0KK0NCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6Q0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKEZYX0ZMT0FUIGExMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMjEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYTMxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGExMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMjIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYTMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGExMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMjMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYTMzKQ0KKyAgICA6IG1fYTExKGExMSksDQorICAgICAgbV9hMjEoYTIxKSwNCisgICAgICBtX2EzMShhMzEpLA0KKyAgICAgIG1fYTEyKGExMiksDQorICAgICAgbV9hMjIoYTIyKSwNCisgICAgICBtX2EzMihhMzIpLA0KKyAgICAgIG1fYTEzKGExMyksDQorICAgICAgbV9hMjMoYTIzKSwNCisgICAgICBtX2EzMyhhMzMpIHt9DQorQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOjp+Q0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKCkge30NCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0qDQorQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOjpRdWFkcmlsYXRlcmFsVG9RdWFkcmlsYXRlcmFsKEZYX0ZMT0FUIHgwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDBwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgxcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MnAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkycCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDNwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5M3ApIHsNCisgIENCQ19BdXRvUHRyPENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybT4gcVRvUygNCisgICAgICBRdWFkcmlsYXRlcmFsVG9TcXVhcmUoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSk7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0+IHNUb1EoDQorICAgICAgU3F1YXJlVG9RdWFkcmlsYXRlcmFsKHgwcCwgeTBwLCB4MXAsIHkxcCwgeDJwLCB5MnAsIHgzcCwgeTNwKSk7DQorICByZXR1cm4gc1RvUS0+VGltZXMoKihxVG9TLmdldCgpKSk7DQogfQ0KLUNCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6fkNCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSgpDQotew0KK3ZvaWQgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOjpUcmFuc2Zvcm1Qb2ludHMoQ0ZYX0Zsb2F0QXJyYXkqIHBvaW50cykgew0KKyAgaW50MzJfdCBtYXggPSBwb2ludHMtPkdldFNpemUoKTsNCisgIEZYX0ZMT0FUIGExMSA9IG1fYTExOw0KKyAgRlhfRkxPQVQgYTEyID0gbV9hMTI7DQorICBGWF9GTE9BVCBhMTMgPSBtX2ExMzsNCisgIEZYX0ZMT0FUIGEyMSA9IG1fYTIxOw0KKyAgRlhfRkxPQVQgYTIyID0gbV9hMjI7DQorICBGWF9GTE9BVCBhMjMgPSBtX2EyMzsNCisgIEZYX0ZMT0FUIGEzMSA9IG1fYTMxOw0KKyAgRlhfRkxPQVQgYTMyID0gbV9hMzI7DQorICBGWF9GTE9BVCBhMzMgPSBtX2EzMzsNCisgIGludDMyX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkgKz0gMikgew0KKyAgICBGWF9GTE9BVCB4ID0gKCpwb2ludHMpW2ldOw0KKyAgICBGWF9GTE9BVCB5ID0gKCpwb2ludHMpW2kgKyAxXTsNCisgICAgRlhfRkxPQVQgZGVub21pbmF0b3IgPSBhMTMgKiB4ICsgYTIzICogeSArIGEzMzsNCisgICAgKCpwb2ludHMpW2ldID0gKGExMSAqIHggKyBhMjEgKiB5ICsgYTMxKSAvIGRlbm9taW5hdG9yOw0KKyAgICAoKnBvaW50cylbaSArIDFdID0gKGExMiAqIHggKyBhMjIgKiB5ICsgYTMyKSAvIGRlbm9taW5hdG9yOw0KKyAgfQ0KIH0NCi1DQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0gKkNCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6UXVhZHJpbGF0ZXJhbFRvUXVhZHJpbGF0ZXJhbChGWF9GTE9BVCB4MCwgRlhfRkxPQVQgeTAsDQotICAgICAgICBGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsDQotICAgICAgICBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsDQotICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMsDQotICAgICAgICBGWF9GTE9BVCB4MHAsIEZYX0ZMT0FUIHkwcCwNCi0gICAgICAgIEZYX0ZMT0FUIHgxcCwgRlhfRkxPQVQgeTFwLA0KLSAgICAgICAgRlhfRkxPQVQgeDJwLCBGWF9GTE9BVCB5MnAsDQotICAgICAgICBGWF9GTE9BVCB4M3AsIEZYX0ZMT0FUIHkzcCkNCi17DQotICAgIENCQ19BdXRvUHRyPENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybT4gcVRvUyhRdWFkcmlsYXRlcmFsVG9TcXVhcmUoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSk7DQotICAgIENCQ19BdXRvUHRyPENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybT4gc1RvUShTcXVhcmVUb1F1YWRyaWxhdGVyYWwoeDBwLCB5MHAsIHgxcCwgeTFwLCB4MnAsIHkycCwgeDNwLCB5M3ApKTsNCi0gICAgcmV0dXJuIHNUb1EtPlRpbWVzKCoocVRvUy5nZXQoKSkpOw0KK0NCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSoNCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OlNxdWFyZVRvUXVhZHJpbGF0ZXJhbChGWF9GTE9BVCB4MCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5Mykgew0KKyAgRlhfRkxPQVQgZHkyID0geTMgLSB5MjsNCisgIEZYX0ZMT0FUIGR5MyA9IHkwIC0geTEgKyB5MiAtIHkzOw0KKyAgaWYgKChkeTIgPT0gMC4wZikgJiYgKGR5MyA9PSAwLjBmKSkgew0KKyAgICByZXR1cm4gRlhfTkVXIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSh4MSAtIHgwLCB4MiAtIHgxLCB4MCwgeTEgLSB5MCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTIgLSB5MSwgeTAsIDAuMGYsIDAuMGYsIDEuMGYpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhfRkxPQVQgZHgxID0geDEgLSB4MjsNCisgICAgRlhfRkxPQVQgZHgyID0geDMgLSB4MjsNCisgICAgRlhfRkxPQVQgZHgzID0geDAgLSB4MSArIHgyIC0geDM7DQorICAgIEZYX0ZMT0FUIGR5MSA9IHkxIC0geTI7DQorICAgIEZYX0ZMT0FUIGRlbm9taW5hdG9yID0gZHgxICogZHkyIC0gZHgyICogZHkxOw0KKyAgICBGWF9GTE9BVCBhMTMgPSAoZHgzICogZHkyIC0gZHgyICogZHkzKSAvIGRlbm9taW5hdG9yOw0KKyAgICBGWF9GTE9BVCBhMjMgPSAoZHgxICogZHkzIC0gZHgzICogZHkxKSAvIGRlbm9taW5hdG9yOw0KKyAgICByZXR1cm4gRlhfTkVXIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSgNCisgICAgICAgIHgxIC0geDAgKyBhMTMgKiB4MSwgeDMgLSB4MCArIGEyMyAqIHgzLCB4MCwgeTEgLSB5MCArIGExMyAqIHkxLA0KKyAgICAgICAgeTMgLSB5MCArIGEyMyAqIHkzLCB5MCwgYTEzLCBhMjMsIDEuMGYpOw0KKyAgfQ0KIH0NCi12b2lkIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6VHJhbnNmb3JtUG9pbnRzKENGWF9GbG9hdEFycmF5ICpwb2ludHMpDQotew0KLSAgICBpbnQzMl90IG1heCA9IHBvaW50cy0+R2V0U2l6ZSgpOw0KLSAgICBGWF9GTE9BVCBhMTEgPSBtX2ExMTsNCi0gICAgRlhfRkxPQVQgYTEyID0gbV9hMTI7DQotICAgIEZYX0ZMT0FUIGExMyA9IG1fYTEzOw0KLSAgICBGWF9GTE9BVCBhMjEgPSBtX2EyMTsNCi0gICAgRlhfRkxPQVQgYTIyID0gbV9hMjI7DQotICAgIEZYX0ZMT0FUIGEyMyA9IG1fYTIzOw0KLSAgICBGWF9GTE9BVCBhMzEgPSBtX2EzMTsNCi0gICAgRlhfRkxPQVQgYTMyID0gbV9hMzI7DQotICAgIEZYX0ZMT0FUIGEzMyA9IG1fYTMzOw0KLSAgICBpbnQzMl90IGk7DQotICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkgKz0gMikgew0KLSAgICAgICAgRlhfRkxPQVQgeCA9ICgqcG9pbnRzKVtpXTsNCi0gICAgICAgIEZYX0ZMT0FUIHkgPSAoKnBvaW50cylbaSArIDFdOw0KLSAgICAgICAgRlhfRkxPQVQgZGVub21pbmF0b3IgPSBhMTMgKiB4ICsgYTIzICogeSArIGEzMzsNCi0gICAgICAgICgqcG9pbnRzKVtpXSA9IChhMTEgKiB4ICsgYTIxICogeSArIGEzMSkgLyBkZW5vbWluYXRvcjsNCi0gICAgICAgICgqcG9pbnRzKVtpICsgMV0gPSAoYTEyICogeCArIGEyMiAqIHkgKyBhMzIpIC8gZGVub21pbmF0b3I7DQotICAgIH0NCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0qDQorQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOjpRdWFkcmlsYXRlcmFsVG9TcXVhcmUoRlhfRkxPQVQgeDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTMpIHsNCisgIENCQ19BdXRvUHRyPENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybT4gdGVtcDEoDQorICAgICAgU3F1YXJlVG9RdWFkcmlsYXRlcmFsKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MykpOw0KKyAgcmV0dXJuIHRlbXAxLT5CdWlsZEFkam9pbnQoKTsNCiB9DQotQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtICpDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OlNxdWFyZVRvUXVhZHJpbGF0ZXJhbChGWF9GTE9BVCB4MCwgRlhfRkxPQVQgeTAsDQotICAgICAgICBGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsDQotICAgICAgICBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsDQotICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMpDQotew0KLSAgICBGWF9GTE9BVCBkeTIgPSB5MyAtIHkyOw0KLSAgICBGWF9GTE9BVCBkeTMgPSB5MCAtIHkxICsgeTIgLSB5MzsNCi0gICAgaWYgKChkeTIgPT0gMC4wZikgJiYgKGR5MyA9PSAwLjBmKSkgew0KLSAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0oeDEgLSB4MCwgeDIgLSB4MSwgeDAsDQotICAgICAgICAgICAgICAgIHkxIC0geTAsIHkyIC0geTEsIHkwLA0KLSAgICAgICAgICAgICAgICAwLjBmLCAwLjBmLCAxLjBmKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYX0ZMT0FUIGR4MSA9IHgxIC0geDI7DQotICAgICAgICBGWF9GTE9BVCBkeDIgPSB4MyAtIHgyOw0KLSAgICAgICAgRlhfRkxPQVQgZHgzID0geDAgLSB4MSArIHgyIC0geDM7DQotICAgICAgICBGWF9GTE9BVCBkeTEgPSB5MSAtIHkyOw0KLSAgICAgICAgRlhfRkxPQVQgZGVub21pbmF0b3IgPSBkeDEgKiBkeTIgLSBkeDIgKiBkeTE7DQotICAgICAgICBGWF9GTE9BVCBhMTMgPSAoZHgzICogZHkyIC0gZHgyICogZHkzKSAvIGRlbm9taW5hdG9yOw0KLSAgICAgICAgRlhfRkxPQVQgYTIzID0gKGR4MSAqIGR5MyAtIGR4MyAqIGR5MSkgLyBkZW5vbWluYXRvcjsNCi0gICAgICAgIHJldHVybiBGWF9ORVcgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKHgxIC0geDAgKyBhMTMgKiB4MSwgeDMgLSB4MCArIGEyMyAqIHgzLCB4MCwNCi0gICAgICAgICAgICAgICAgeTEgLSB5MCArIGExMyAqIHkxLCB5MyAtIHkwICsgYTIzICogeTMsIHkwLA0KLSAgICAgICAgICAgICAgICBhMTMsIGEyMywgMS4wZik7DQotICAgIH0NCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0qIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTo6QnVpbGRBZGpvaW50KCkgew0KKyAgcmV0dXJuIEZYX05FVyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0oDQorICAgICAgbV9hMjIgKiBtX2EzMyAtIG1fYTIzICogbV9hMzIsIG1fYTIzICogbV9hMzEgLSBtX2EyMSAqIG1fYTMzLA0KKyAgICAgIG1fYTIxICogbV9hMzIgLSBtX2EyMiAqIG1fYTMxLCBtX2ExMyAqIG1fYTMyIC0gbV9hMTIgKiBtX2EzMywNCisgICAgICBtX2ExMSAqIG1fYTMzIC0gbV9hMTMgKiBtX2EzMSwgbV9hMTIgKiBtX2EzMSAtIG1fYTExICogbV9hMzIsDQorICAgICAgbV9hMTIgKiBtX2EyMyAtIG1fYTEzICogbV9hMjIsIG1fYTEzICogbV9hMjEgLSBtX2ExMSAqIG1fYTIzLA0KKyAgICAgIG1fYTExICogbV9hMjIgLSBtX2ExMiAqIG1fYTIxKTsNCiB9DQotQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtICpDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OlF1YWRyaWxhdGVyYWxUb1NxdWFyZShGWF9GTE9BVCB4MCwgRlhfRkxPQVQgeTAsDQotICAgICAgICBGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsDQotICAgICAgICBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsDQotICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMpDQotew0KLSAgICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0+IHRlbXAxKFNxdWFyZVRvUXVhZHJpbGF0ZXJhbCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpKTsNCi0gICAgcmV0dXJuIHRlbXAxLT5CdWlsZEFkam9pbnQoKTsNCi19DQotQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtICpDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OkJ1aWxkQWRqb2ludCgpDQotew0KLSAgICByZXR1cm4gRlhfTkVXIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybShtX2EyMiAqIG1fYTMzIC0gbV9hMjMgKiBtX2EzMiwNCi0gICAgICAgICAgICBtX2EyMyAqIG1fYTMxIC0gbV9hMjEgKiBtX2EzMywNCi0gICAgICAgICAgICBtX2EyMSAqIG1fYTMyIC0gbV9hMjIgKiBtX2EzMSwNCi0gICAgICAgICAgICBtX2ExMyAqIG1fYTMyIC0gbV9hMTIgKiBtX2EzMywNCi0gICAgICAgICAgICBtX2ExMSAqIG1fYTMzIC0gbV9hMTMgKiBtX2EzMSwNCi0gICAgICAgICAgICBtX2ExMiAqIG1fYTMxIC0gbV9hMTEgKiBtX2EzMiwNCi0gICAgICAgICAgICBtX2ExMiAqIG1fYTIzIC0gbV9hMTMgKiBtX2EyMiwNCi0gICAgICAgICAgICBtX2ExMyAqIG1fYTIxIC0gbV9hMTEgKiBtX2EyMywNCi0gICAgICAgICAgICBtX2ExMSAqIG1fYTIyIC0gbV9hMTIgKiBtX2EyMSk7DQotfQ0KLUNCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSAqQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOjpUaW1lcyhDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0gJm90aGVyKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0obV9hMTEgKiBvdGhlci5tX2ExMSArIG1fYTIxICogb3RoZXIubV9hMTIgKyBtX2EzMSAqIG90aGVyLm1fYTEzLA0KLSAgICAgICAgICAgIG1fYTExICogb3RoZXIubV9hMjEgKyBtX2EyMSAqIG90aGVyLm1fYTIyICsgbV9hMzEgKiBvdGhlci5tX2EyMywNCi0gICAgICAgICAgICBtX2ExMSAqIG90aGVyLm1fYTMxICsgbV9hMjEgKiBvdGhlci5tX2EzMiArIG1fYTMxICogb3RoZXIubV9hMzMsDQotICAgICAgICAgICAgbV9hMTIgKiBvdGhlci5tX2ExMSArIG1fYTIyICogb3RoZXIubV9hMTIgKyBtX2EzMiAqIG90aGVyLm1fYTEzLA0KLSAgICAgICAgICAgIG1fYTEyICogb3RoZXIubV9hMjEgKyBtX2EyMiAqIG90aGVyLm1fYTIyICsgbV9hMzIgKiBvdGhlci5tX2EyMywNCi0gICAgICAgICAgICBtX2ExMiAqIG90aGVyLm1fYTMxICsgbV9hMjIgKiBvdGhlci5tX2EzMiArIG1fYTMyICogb3RoZXIubV9hMzMsDQotICAgICAgICAgICAgbV9hMTMgKiBvdGhlci5tX2ExMSArIG1fYTIzICogb3RoZXIubV9hMTIgKyBtX2EzMyAqIG90aGVyLm1fYTEzLA0KLSAgICAgICAgICAgIG1fYTEzICogb3RoZXIubV9hMjEgKyBtX2EyMyAqIG90aGVyLm1fYTIyICsgbV9hMzMgKiBvdGhlci5tX2EyMywNCi0gICAgICAgICAgICBtX2ExMyAqIG90aGVyLm1fYTMxICsgbV9hMjMgKiBvdGhlci5tX2EzMiArIG1fYTMzICogb3RoZXIubV9hMzMpOw0KK0NCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSogQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOjpUaW1lcygNCisgICAgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtJiBvdGhlcikgew0KKyAgcmV0dXJuIEZYX05FVyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0oDQorICAgICAgbV9hMTEgKiBvdGhlci5tX2ExMSArIG1fYTIxICogb3RoZXIubV9hMTIgKyBtX2EzMSAqIG90aGVyLm1fYTEzLA0KKyAgICAgIG1fYTExICogb3RoZXIubV9hMjEgKyBtX2EyMSAqIG90aGVyLm1fYTIyICsgbV9hMzEgKiBvdGhlci5tX2EyMywNCisgICAgICBtX2ExMSAqIG90aGVyLm1fYTMxICsgbV9hMjEgKiBvdGhlci5tX2EzMiArIG1fYTMxICogb3RoZXIubV9hMzMsDQorICAgICAgbV9hMTIgKiBvdGhlci5tX2ExMSArIG1fYTIyICogb3RoZXIubV9hMTIgKyBtX2EzMiAqIG90aGVyLm1fYTEzLA0KKyAgICAgIG1fYTEyICogb3RoZXIubV9hMjEgKyBtX2EyMiAqIG90aGVyLm1fYTIyICsgbV9hMzIgKiBvdGhlci5tX2EyMywNCisgICAgICBtX2ExMiAqIG90aGVyLm1fYTMxICsgbV9hMjIgKiBvdGhlci5tX2EzMiArIG1fYTMyICogb3RoZXIubV9hMzMsDQorICAgICAgbV9hMTMgKiBvdGhlci5tX2ExMSArIG1fYTIzICogb3RoZXIubV9hMTIgKyBtX2EzMyAqIG90aGVyLm1fYTEzLA0KKyAgICAgIG1fYTEzICogb3RoZXIubV9hMjEgKyBtX2EyMyAqIG90aGVyLm1fYTIyICsgbV9hMzMgKiBvdGhlci5tX2EyMywNCisgICAgICBtX2ExMyAqIG90aGVyLm1fYTMxICsgbV9hMjMgKiBvdGhlci5tX2EzMiArIG1fYTMzICogb3RoZXIubV9hMzMpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybS5oCmluZGV4IGNmN2Y4MDQuLjIyZTkwY2QgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybS5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybS5oCkBAIC02LDMzICs2LDU2IEBACiANCiAjaWZuZGVmIF9CQ19DT01NT05QRVJTUEVDVElWRVRSQU5TRk9STV9IXw0KICNkZWZpbmUgX0JDX0NPTU1PTlBFUlNQRUNUSVZFVFJBTlNGT1JNX0hfDQotY2xhc3MgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKEZYX0ZMT0FUIGExMSwgRlhfRkxPQVQgYTIxLCBGWF9GTE9BVCBhMzEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMTIsIEZYX0ZMT0FUIGEyMiwgRlhfRkxPQVQgYTMyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYTEzLCBGWF9GTE9BVCBhMjMsIEZYX0ZMT0FUIGEzMyk7DQotICAgIHZpcnR1YWwgfkNCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSgpOw0KLSAgICBzdGF0aWMgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtICpRdWFkcmlsYXRlcmFsVG9RdWFkcmlsYXRlcmFsKEZYX0ZMT0FUIHgwLCBGWF9GTE9BVCB5MCwNCi0gICAgICAgICAgICBGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsDQotICAgICAgICAgICAgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLA0KLSAgICAgICAgICAgIEZYX0ZMT0FUIHgzLCBGWF9GTE9BVCB5MywNCi0gICAgICAgICAgICBGWF9GTE9BVCB4MHAsIEZYX0ZMT0FUIHkwcCwNCi0gICAgICAgICAgICBGWF9GTE9BVCB4MXAsIEZYX0ZMT0FUIHkxcCwNCi0gICAgICAgICAgICBGWF9GTE9BVCB4MnAsIEZYX0ZMT0FUIHkycCwNCi0gICAgICAgICAgICBGWF9GTE9BVCB4M3AsIEZYX0ZMT0FUIHkzcCk7DQotICAgIHN0YXRpYyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0gKlNxdWFyZVRvUXVhZHJpbGF0ZXJhbChGWF9GTE9BVCB4MCwgRlhfRkxPQVQgeTAsDQotICAgICAgICAgICAgRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLA0KLSAgICAgICAgICAgIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwNCi0gICAgICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMpOw0KLSAgICBzdGF0aWMgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtICpRdWFkcmlsYXRlcmFsVG9TcXVhcmUoRlhfRkxPQVQgeDAsIEZYX0ZMT0FUIHkwLA0KLSAgICAgICAgICAgIEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwNCi0gICAgICAgICAgICBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsDQotICAgICAgICAgICAgRlhfRkxPQVQgeDMsIEZYX0ZMT0FUIHkzKTsNCi0gICAgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtICpCdWlsZEFkam9pbnQoKTsNCi0gICAgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtICpUaW1lcyhDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0gJm90aGVyKTsNCi0gICAgdm9pZCBUcmFuc2Zvcm1Qb2ludHMoQ0ZYX0Zsb2F0QXJyYXkgKnBvaW50cyk7DQotcHJpdmF0ZToNCi0gICAgRlhfRkxPQVQgbV9hMTEsIG1fYTEyLCBtX2ExMywgbV9hMjEsIG1fYTIyLCBtX2EyMywgbV9hMzEsIG1fYTMyLCBtX2EzMzsNCitjbGFzcyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0gew0KKyBwdWJsaWM6DQorICBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0oRlhfRkxPQVQgYTExLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGEyMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYTEyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGEyMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYTEzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGEyMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMzMpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKCk7DQorICBzdGF0aWMgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKiBRdWFkcmlsYXRlcmFsVG9RdWFkcmlsYXRlcmFsKA0KKyAgICAgIEZYX0ZMT0FUIHgwLA0KKyAgICAgIEZYX0ZMT0FUIHkwLA0KKyAgICAgIEZYX0ZMT0FUIHgxLA0KKyAgICAgIEZYX0ZMT0FUIHkxLA0KKyAgICAgIEZYX0ZMT0FUIHgyLA0KKyAgICAgIEZYX0ZMT0FUIHkyLA0KKyAgICAgIEZYX0ZMT0FUIHgzLA0KKyAgICAgIEZYX0ZMT0FUIHkzLA0KKyAgICAgIEZYX0ZMT0FUIHgwcCwNCisgICAgICBGWF9GTE9BVCB5MHAsDQorICAgICAgRlhfRkxPQVQgeDFwLA0KKyAgICAgIEZYX0ZMT0FUIHkxcCwNCisgICAgICBGWF9GTE9BVCB4MnAsDQorICAgICAgRlhfRkxPQVQgeTJwLA0KKyAgICAgIEZYX0ZMT0FUIHgzcCwNCisgICAgICBGWF9GTE9BVCB5M3ApOw0KKyAgc3RhdGljIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSogU3F1YXJlVG9RdWFkcmlsYXRlcmFsKEZYX0ZMT0FUIHgwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkzKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0qIFF1YWRyaWxhdGVyYWxUb1NxdWFyZShGWF9GTE9BVCB4MCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5Myk7DQorICBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0qIEJ1aWxkQWRqb2ludCgpOw0KKyAgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKiBUaW1lcyhDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0mIG90aGVyKTsNCisgIHZvaWQgVHJhbnNmb3JtUG9pbnRzKENGWF9GbG9hdEFycmF5KiBwb2ludHMpOw0KKw0KKyBwcml2YXRlOg0KKyAgRlhfRkxPQVQgbV9hMTEsIG1fYTEyLCBtX2ExMywgbV9hMjEsIG1fYTIyLCBtX2EyMywgbV9hMzEsIG1fYTMyLCBtX2EzMzsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5jcHAKaW5kZXggNTk3NmQ0NS4uODhiMGM0MyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5jcHAKQEAgLTI5LDE0MSArMjksMTQxIEBACiBjb25zdCBpbnQzMl90IExVTUlOQU5DRV9CSVRTID0gNTsNCiBjb25zdCBpbnQzMl90IExVTUlOQU5DRV9TSElGVCA9IDggLSBMVU1JTkFOQ0VfQklUUzsNCiBjb25zdCBpbnQzMl90IExVTUlOQU5DRV9CVUNLRVRTID0gMSA8PCBMVU1JTkFOQ0VfQklUUzsNCi1DQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyOjpDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyKENCQ19MdW1pbmFuY2VTb3VyY2UgKnNvdXJjZSk6IENCQ19CaW5hcml6ZXIoc291cmNlKQ0KLXsNCitDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyOjpDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyKA0KKyAgICBDQkNfTHVtaW5hbmNlU291cmNlKiBzb3VyY2UpDQorICAgIDogQ0JDX0JpbmFyaXplcihzb3VyY2UpIHt9DQorQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcjo6fkNCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIoKSB7fQ0KK0NCQ19Db21tb25CaXRBcnJheSogQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcjo6R2V0QmxhY2tSb3coDQorICAgIGludDMyX3QgeSwNCisgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19MdW1pbmFuY2VTb3VyY2UqIHNvdXJjZSA9IEdldEx1bWluYW5jZVNvdXJjZSgpOw0KKyAgaW50MzJfdCB3aWR0aCA9IHNvdXJjZS0+R2V0V2lkdGgoKTsNCisgIENCQ19BdXRvUHRyPENCQ19Db21tb25CaXRBcnJheT4gcmVzdWx0KEZYX05FVyBDQkNfQ29tbW9uQml0QXJyYXkod2lkdGgpKTsNCisgIEluaXRBcnJheXMod2lkdGgpOw0KKyAgQ0ZYX0J5dGVBcnJheSogbG9jYWxMdW1pbmFuY2VzID0gc291cmNlLT5HZXRSb3coeSwgbV9sdW1pbmFuY2UsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsNCisgIH0NCisgIENGWF9JbnQzMkFycmF5IGxvY2FsQnVja2V0czsNCisgIGxvY2FsQnVja2V0cy5Db3B5KG1fYnVja2V0cyk7DQorICBpbnQzMl90IHg7DQorICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgew0KKyAgICBpbnQzMl90IHBpeGVsID0gKCpsb2NhbEx1bWluYW5jZXMpW3hdICYgMHhmZjsNCisgICAgbG9jYWxCdWNrZXRzW3BpeGVsID4+IExVTUlOQU5DRV9TSElGVF0rKzsNCisgIH0NCisgIGludDMyX3QgYmxhY2tQb2ludCA9IEVzdGltYXRlQmxhY2tQb2ludChsb2NhbEJ1Y2tldHMsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsNCisgIH0NCisgIGludDMyX3QgbGVmdCA9ICgqbG9jYWxMdW1pbmFuY2VzKVswXSAmIDB4ZmY7DQorICBpbnQzMl90IGNlbnRlciA9ICgqbG9jYWxMdW1pbmFuY2VzKVsxXSAmIDB4ZmY7DQorICBmb3IgKHggPSAxOyB4IDwgd2lkdGggLSAxOyB4KyspIHsNCisgICAgaW50MzJfdCByaWdodCA9ICgqbG9jYWxMdW1pbmFuY2VzKVt4ICsgMV0gJiAweGZmOw0KKyAgICBpbnQzMl90IGx1bWluYW5jZSA9ICgoY2VudGVyIDw8IDIpIC0gbGVmdCAtIHJpZ2h0KSA+PiAxOw0KKyAgICBpZiAobHVtaW5hbmNlIDwgYmxhY2tQb2ludCkgew0KKyAgICAgIHJlc3VsdC0+U2V0KHgpOw0KKyAgICB9DQorICAgIGxlZnQgPSBjZW50ZXI7DQorICAgIGNlbnRlciA9IHJpZ2h0Ow0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQogfQ0KLUNCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI6On5DQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyKCkNCi17DQotfQ0KLUNCQ19Db21tb25CaXRBcnJheSAqQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcjo6R2V0QmxhY2tSb3coaW50MzJfdCB5LCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19MdW1pbmFuY2VTb3VyY2UgKnNvdXJjZSA9IEdldEx1bWluYW5jZVNvdXJjZSgpOw0KLSAgICBpbnQzMl90IHdpZHRoID0gc291cmNlLT5HZXRXaWR0aCgpOw0KLSAgICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQml0QXJyYXk+IHJlc3VsdChGWF9ORVcgQ0JDX0NvbW1vbkJpdEFycmF5KHdpZHRoKSk7DQotICAgIEluaXRBcnJheXMod2lkdGgpOw0KLSAgICBDRlhfQnl0ZUFycmF5ICpsb2NhbEx1bWluYW5jZXMgPSBzb3VyY2UtPkdldFJvdyh5LCBtX2x1bWluYW5jZSwgZSk7DQotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOw0KLSAgICB9DQotICAgIENGWF9JbnQzMkFycmF5IGxvY2FsQnVja2V0czsNCi0gICAgbG9jYWxCdWNrZXRzLkNvcHkobV9idWNrZXRzKTsNCi0gICAgaW50MzJfdCB4Ow0KLSAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgew0KLSAgICAgICAgaW50MzJfdCBwaXhlbCA9ICgqbG9jYWxMdW1pbmFuY2VzKVt4XSAmIDB4ZmY7DQotICAgICAgICBsb2NhbEJ1Y2tldHNbcGl4ZWwgPj4gTFVNSU5BTkNFX1NISUZUXSsrOw0KLSAgICB9DQotICAgIGludDMyX3QgYmxhY2tQb2ludCA9IEVzdGltYXRlQmxhY2tQb2ludChsb2NhbEJ1Y2tldHMsIGUpOw0KLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGxlZnQgPSAoKmxvY2FsTHVtaW5hbmNlcylbMF0gJiAweGZmOw0KLSAgICBpbnQzMl90IGNlbnRlciA9ICgqbG9jYWxMdW1pbmFuY2VzKVsxXSAmIDB4ZmY7DQotICAgIGZvciAoeCA9IDE7IHggPCB3aWR0aCAtIDE7IHgrKykgew0KLSAgICAgICAgaW50MzJfdCByaWdodCA9ICgqbG9jYWxMdW1pbmFuY2VzKVt4ICsgMV0gJiAweGZmOw0KLSAgICAgICAgaW50MzJfdCBsdW1pbmFuY2UgPSAoKGNlbnRlciA8PCAyKSAtIGxlZnQgLSByaWdodCkgPj4gMTsNCi0gICAgICAgIGlmIChsdW1pbmFuY2UgPCBibGFja1BvaW50KSB7DQotICAgICAgICAgICAgcmVzdWx0LT5TZXQoeCk7DQotICAgICAgICB9DQotICAgICAgICBsZWZ0ID0gY2VudGVyOw0KLSAgICAgICAgY2VudGVyID0gcmlnaHQ7DQotICAgIH0NCi0gICAgcmV0dXJuICByZXN1bHQucmVsZWFzZSgpOw0KLX0NCi1DQkNfQ29tbW9uQml0TWF0cml4ICpDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyOjpHZXRCbGFja01hdHJpeChpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX0x1bWluYW5jZVNvdXJjZSAqc291cmNlID0gR2V0THVtaW5hbmNlU291cmNlKCk7DQotICAgIGludDMyX3Qgd2lkdGggPSBzb3VyY2UtPkdldFdpZHRoKCk7DQotICAgIGludDMyX3QgaGVpZ2h0ID0gc291cmNlLT5HZXRIZWlnaHQoKTsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqQml0TWF0cml4VGVtcCA9IEZYX05FVyBDQkNfQ29tbW9uQml0TWF0cml4KCk7DQotICAgIEJpdE1hdHJpeFRlbXAtPkluaXQod2lkdGgsIGhlaWdodCk7DQotICAgIENCQ19BdXRvUHRyPENCQ19Db21tb25CaXRNYXRyaXg+IG1hdHJpeChCaXRNYXRyaXhUZW1wKTsNCi0gICAgSW5pdEFycmF5cyh3aWR0aCk7DQotICAgIENGWF9JbnQzMkFycmF5IGxvY2FsQnVja2V0czsNCi0gICAgbG9jYWxCdWNrZXRzLkNvcHkobV9idWNrZXRzKTsNCi0gICAgaW50MzJfdCB5Ow0KLSAgICBmb3IgKHkgPSAxOyB5IDwgNTsgeSsrKSB7DQotICAgICAgICBpbnQzMl90IHJvdyA9IGhlaWdodCAqIHkgLyA1Ow0KLSAgICAgICAgQ0ZYX0J5dGVBcnJheSAqbG9jYWxMdW1pbmFuY2VzID0gc291cmNlLT5HZXRSb3cocm93LCBtX2x1bWluYW5jZSwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICBpbnQzMl90IHJpZ2h0ID0gKHdpZHRoIDw8IDIpIC8gNTsNCi0gICAgICAgIGludDMyX3QgeDsNCi0gICAgICAgIGZvciAoeCA9IHdpZHRoIC8gNTsgeCA8IHJpZ2h0OyB4KyspIHsNCi0gICAgICAgICAgICBpbnQzMl90IHBpeGVsID0gKCpsb2NhbEx1bWluYW5jZXMpW3hdICYgMHhmZjsNCi0gICAgICAgICAgICBsb2NhbEJ1Y2tldHNbcGl4ZWwgPj4gTFVNSU5BTkNFX1NISUZUXSsrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGludDMyX3QgYmxhY2tQb2ludCA9IEVzdGltYXRlQmxhY2tQb2ludChsb2NhbEJ1Y2tldHMsIGUpOw0KK0NCQ19Db21tb25CaXRNYXRyaXgqIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI6OkdldEJsYWNrTWF0cml4KGludDMyX3QmIGUpIHsNCisgIENCQ19MdW1pbmFuY2VTb3VyY2UqIHNvdXJjZSA9IEdldEx1bWluYW5jZVNvdXJjZSgpOw0KKyAgaW50MzJfdCB3aWR0aCA9IHNvdXJjZS0+R2V0V2lkdGgoKTsNCisgIGludDMyX3QgaGVpZ2h0ID0gc291cmNlLT5HZXRIZWlnaHQoKTsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIEJpdE1hdHJpeFRlbXAgPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdE1hdHJpeCgpOw0KKyAgQml0TWF0cml4VGVtcC0+SW5pdCh3aWR0aCwgaGVpZ2h0KTsNCisgIENCQ19BdXRvUHRyPENCQ19Db21tb25CaXRNYXRyaXg+IG1hdHJpeChCaXRNYXRyaXhUZW1wKTsNCisgIEluaXRBcnJheXMod2lkdGgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgbG9jYWxCdWNrZXRzOw0KKyAgbG9jYWxCdWNrZXRzLkNvcHkobV9idWNrZXRzKTsNCisgIGludDMyX3QgeTsNCisgIGZvciAoeSA9IDE7IHkgPCA1OyB5KyspIHsNCisgICAgaW50MzJfdCByb3cgPSBoZWlnaHQgKiB5IC8gNTsNCisgICAgQ0ZYX0J5dGVBcnJheSogbG9jYWxMdW1pbmFuY2VzID0gc291cmNlLT5HZXRSb3cocm93LCBtX2x1bWluYW5jZSwgZSk7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0ZYX0J5dGVBcnJheT4gbG9jYWxMdW1pbmFuY2VzKHNvdXJjZS0+R2V0TWF0cml4KCkpOw0KLSAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsNCi0gICAgICAgIGludDMyX3Qgb2Zmc2V0ID0geSAqIHdpZHRoOw0KLSAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgew0KLSAgICAgICAgICAgIGludDMyX3QgcGl4ZWwgPSAoKmxvY2FsTHVtaW5hbmNlcylbb2Zmc2V0ICsgeF0gJiAweGZmOw0KLSAgICAgICAgICAgIGlmIChwaXhlbCA8IGJsYWNrUG9pbnQpIHsNCi0gICAgICAgICAgICAgICAgbWF0cml4LT5TZXQoeCwgeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBtYXRyaXgucmVsZWFzZSgpOw0KLX0NCi12b2lkIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI6OkluaXRBcnJheXMoaW50MzJfdCBsdW1pbmFuY2VTaXplKQ0KLXsNCi0gICAgaWYobV9sdW1pbmFuY2UuR2V0U2l6ZSgpIDwgbHVtaW5hbmNlU2l6ZSkgew0KLSAgICAgICAgbV9sdW1pbmFuY2UuU2V0U2l6ZShsdW1pbmFuY2VTaXplKTsNCi0gICAgfQ0KLSAgICBpZihtX2J1Y2tldHMuR2V0U2l6ZSgpIDw9IDApIHsNCi0gICAgICAgIG1fYnVja2V0cy5TZXRTaXplKExVTUlOQU5DRV9CVUNLRVRTKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGludDMyX3QgeDsNCi0gICAgICAgIGZvcih4ID0gMDsgeCA8IExVTUlOQU5DRV9CVUNLRVRTOyB4KyspIHsNCi0gICAgICAgICAgICBtX2J1Y2tldHNbeF0gPSAwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLWludDMyX3QgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcjo6RXN0aW1hdGVCbGFja1BvaW50KENGWF9JbnQzMkFycmF5ICZidWNrZXRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBudW1CdWNrZXRzID0gYnVja2V0cy5HZXRTaXplKCk7DQotICAgIGludDMyX3QgbWF4QnVja2V0Q291bnQgPSAwOw0KLSAgICBpbnQzMl90IGZpcnN0UGVhayA9IDA7DQotICAgIGludDMyX3QgZmlyc3RQZWFrU2l6ZSA9IDA7DQorICAgIGludDMyX3QgcmlnaHQgPSAod2lkdGggPDwgMikgLyA1Ow0KICAgICBpbnQzMl90IHg7DQotICAgIGZvciAoeCA9IDA7IHggPCBudW1CdWNrZXRzOyB4KyspIHsNCi0gICAgICAgIGlmIChidWNrZXRzW3hdID4gZmlyc3RQZWFrU2l6ZSkgew0KLSAgICAgICAgICAgIGZpcnN0UGVhayA9IHg7DQotICAgICAgICAgICAgZmlyc3RQZWFrU2l6ZSA9IGJ1Y2tldHNbeF07DQotICAgICAgICB9DQotICAgICAgICBpZiAoYnVja2V0c1t4XSA+IG1heEJ1Y2tldENvdW50KSB7DQotICAgICAgICAgICAgbWF4QnVja2V0Q291bnQgPSBidWNrZXRzW3hdOw0KLSAgICAgICAgfQ0KKyAgICBmb3IgKHggPSB3aWR0aCAvIDU7IHggPCByaWdodDsgeCsrKSB7DQorICAgICAgaW50MzJfdCBwaXhlbCA9ICgqbG9jYWxMdW1pbmFuY2VzKVt4XSAmIDB4ZmY7DQorICAgICAgbG9jYWxCdWNrZXRzW3BpeGVsID4+IExVTUlOQU5DRV9TSElGVF0rKzsNCiAgICAgfQ0KLSAgICBpbnQzMl90IHNlY29uZFBlYWsgPSAwOw0KLSAgICBpbnQzMl90IHNlY29uZFBlYWtTY29yZSA9IDA7DQotICAgIGZvciAoeCA9IDA7IHggPCBudW1CdWNrZXRzOyB4KyspIHsNCi0gICAgICAgIGludDMyX3QgZGlzdGFuY2VUb0JpZ2dlc3QgPSB4IC0gZmlyc3RQZWFrOw0KLSAgICAgICAgaW50MzJfdCBzY29yZSA9IGJ1Y2tldHNbeF0gKiBkaXN0YW5jZVRvQmlnZ2VzdCAqIGRpc3RhbmNlVG9CaWdnZXN0Ow0KLSAgICAgICAgaWYgKHNjb3JlID4gc2Vjb25kUGVha1Njb3JlKSB7DQotICAgICAgICAgICAgc2Vjb25kUGVhayA9IHg7DQotICAgICAgICAgICAgc2Vjb25kUGVha1Njb3JlID0gc2NvcmU7DQotICAgICAgICB9DQorICB9DQorICBpbnQzMl90IGJsYWNrUG9pbnQgPSBFc3RpbWF0ZUJsYWNrUG9pbnQobG9jYWxCdWNrZXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENGWF9CeXRlQXJyYXk+IGxvY2FsTHVtaW5hbmNlcyhzb3VyY2UtPkdldE1hdHJpeCgpKTsNCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgew0KKyAgICBpbnQzMl90IG9mZnNldCA9IHkgKiB3aWR0aDsNCisgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgew0KKyAgICAgIGludDMyX3QgcGl4ZWwgPSAoKmxvY2FsTHVtaW5hbmNlcylbb2Zmc2V0ICsgeF0gJiAweGZmOw0KKyAgICAgIGlmIChwaXhlbCA8IGJsYWNrUG9pbnQpIHsNCisgICAgICAgIG1hdHJpeC0+U2V0KHgsIHkpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAoZmlyc3RQZWFrID4gc2Vjb25kUGVhaykgew0KLSAgICAgICAgaW50MzJfdCB0ZW1wID0gZmlyc3RQZWFrOw0KLSAgICAgICAgZmlyc3RQZWFrID0gc2Vjb25kUGVhazsNCi0gICAgICAgIHNlY29uZFBlYWsgPSB0ZW1wOw0KKyAgfQ0KKyAgcmV0dXJuIG1hdHJpeC5yZWxlYXNlKCk7DQorfQ0KK3ZvaWQgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcjo6SW5pdEFycmF5cyhpbnQzMl90IGx1bWluYW5jZVNpemUpIHsNCisgIGlmIChtX2x1bWluYW5jZS5HZXRTaXplKCkgPCBsdW1pbmFuY2VTaXplKSB7DQorICAgIG1fbHVtaW5hbmNlLlNldFNpemUobHVtaW5hbmNlU2l6ZSk7DQorICB9DQorICBpZiAobV9idWNrZXRzLkdldFNpemUoKSA8PSAwKSB7DQorICAgIG1fYnVja2V0cy5TZXRTaXplKExVTUlOQU5DRV9CVUNLRVRTKTsNCisgIH0gZWxzZSB7DQorICAgIGludDMyX3QgeDsNCisgICAgZm9yICh4ID0gMDsgeCA8IExVTUlOQU5DRV9CVUNLRVRTOyB4KyspIHsNCisgICAgICBtX2J1Y2tldHNbeF0gPSAwOw0KICAgICB9DQotICAgIGlmIChzZWNvbmRQZWFrIC0gZmlyc3RQZWFrIDw9IG51bUJ1Y2tldHMgPj4gNCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCi0gICAgICAgIHJldHVybiAwOw0KKyAgfQ0KK30NCitpbnQzMl90IENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI6OkVzdGltYXRlQmxhY2tQb2ludCgNCisgICAgQ0ZYX0ludDMyQXJyYXkmIGJ1Y2tldHMsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgbnVtQnVja2V0cyA9IGJ1Y2tldHMuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBtYXhCdWNrZXRDb3VudCA9IDA7DQorICBpbnQzMl90IGZpcnN0UGVhayA9IDA7DQorICBpbnQzMl90IGZpcnN0UGVha1NpemUgPSAwOw0KKyAgaW50MzJfdCB4Ow0KKyAgZm9yICh4ID0gMDsgeCA8IG51bUJ1Y2tldHM7IHgrKykgew0KKyAgICBpZiAoYnVja2V0c1t4XSA+IGZpcnN0UGVha1NpemUpIHsNCisgICAgICBmaXJzdFBlYWsgPSB4Ow0KKyAgICAgIGZpcnN0UGVha1NpemUgPSBidWNrZXRzW3hdOw0KICAgICB9DQotICAgIGludDMyX3QgYmVzdFZhbGxleSA9IHNlY29uZFBlYWsgLSAxOw0KLSAgICBpbnQzMl90IGJlc3RWYWxsZXlTY29yZSA9IC0xOw0KLSAgICBmb3IgKHggPSBzZWNvbmRQZWFrIC0gMTsgeCA+IGZpcnN0UGVhazsgeC0tKSB7DQotICAgICAgICBpbnQzMl90IGZyb21GaXJzdCA9IHggLSBmaXJzdFBlYWs7DQotICAgICAgICBpbnQzMl90IHNjb3JlID0gZnJvbUZpcnN0ICogZnJvbUZpcnN0ICogKHNlY29uZFBlYWsgLSB4KSAqIChtYXhCdWNrZXRDb3VudCAtIGJ1Y2tldHNbeF0pOw0KLSAgICAgICAgaWYgKHNjb3JlID4gYmVzdFZhbGxleVNjb3JlKSB7DQotICAgICAgICAgICAgYmVzdFZhbGxleSA9IHg7DQotICAgICAgICAgICAgYmVzdFZhbGxleVNjb3JlID0gc2NvcmU7DQotICAgICAgICB9DQorICAgIGlmIChidWNrZXRzW3hdID4gbWF4QnVja2V0Q291bnQpIHsNCisgICAgICBtYXhCdWNrZXRDb3VudCA9IGJ1Y2tldHNbeF07DQogICAgIH0NCi0gICAgcmV0dXJuIGJlc3RWYWxsZXkgPDwgTFVNSU5BTkNFX1NISUZUOw0KKyAgfQ0KKyAgaW50MzJfdCBzZWNvbmRQZWFrID0gMDsNCisgIGludDMyX3Qgc2Vjb25kUGVha1Njb3JlID0gMDsNCisgIGZvciAoeCA9IDA7IHggPCBudW1CdWNrZXRzOyB4KyspIHsNCisgICAgaW50MzJfdCBkaXN0YW5jZVRvQmlnZ2VzdCA9IHggLSBmaXJzdFBlYWs7DQorICAgIGludDMyX3Qgc2NvcmUgPSBidWNrZXRzW3hdICogZGlzdGFuY2VUb0JpZ2dlc3QgKiBkaXN0YW5jZVRvQmlnZ2VzdDsNCisgICAgaWYgKHNjb3JlID4gc2Vjb25kUGVha1Njb3JlKSB7DQorICAgICAgc2Vjb25kUGVhayA9IHg7DQorICAgICAgc2Vjb25kUGVha1Njb3JlID0gc2NvcmU7DQorICAgIH0NCisgIH0NCisgIGlmIChmaXJzdFBlYWsgPiBzZWNvbmRQZWFrKSB7DQorICAgIGludDMyX3QgdGVtcCA9IGZpcnN0UGVhazsNCisgICAgZmlyc3RQZWFrID0gc2Vjb25kUGVhazsNCisgICAgc2Vjb25kUGVhayA9IHRlbXA7DQorICB9DQorICBpZiAoc2Vjb25kUGVhayAtIGZpcnN0UGVhayA8PSBudW1CdWNrZXRzID4+IDQpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGJlc3RWYWxsZXkgPSBzZWNvbmRQZWFrIC0gMTsNCisgIGludDMyX3QgYmVzdFZhbGxleVNjb3JlID0gLTE7DQorICBmb3IgKHggPSBzZWNvbmRQZWFrIC0gMTsgeCA+IGZpcnN0UGVhazsgeC0tKSB7DQorICAgIGludDMyX3QgZnJvbUZpcnN0ID0geCAtIGZpcnN0UGVhazsNCisgICAgaW50MzJfdCBzY29yZSA9IGZyb21GaXJzdCAqIGZyb21GaXJzdCAqIChzZWNvbmRQZWFrIC0geCkgKg0KKyAgICAgICAgICAgICAgICAgICAgKG1heEJ1Y2tldENvdW50IC0gYnVja2V0c1t4XSk7DQorICAgIGlmIChzY29yZSA+IGJlc3RWYWxsZXlTY29yZSkgew0KKyAgICAgIGJlc3RWYWxsZXkgPSB4Ow0KKyAgICAgIGJlc3RWYWxsZXlTY29yZSA9IHNjb3JlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gYmVzdFZhbGxleSA8PCBMVU1JTkFOQ0VfU0hJRlQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuaAppbmRleCA2YzZkOGJhLi42M2ZmM2U3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5oCkBAIC0xMSwxOCArMTEsMjAgQEAKIGNsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQogY2xhc3MgQ0JDX0x1bWluYW5jZVNvdXJjZTsNCiBjbGFzcyBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyOw0KLWNsYXNzIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgIDogcHVibGljIENCQ19CaW5hcml6ZXINCi17DQotcHVibGljOg0KLSAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyKENCQ19MdW1pbmFuY2VTb3VyY2UgKnNvdXJjZSk7DQotICAgIHZpcnR1YWwgfkNCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIoKTsNCitjbGFzcyBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIDogcHVibGljIENCQ19CaW5hcml6ZXIgew0KKyBwdWJsaWM6DQorICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyKENCQ19MdW1pbmFuY2VTb3VyY2UqIHNvdXJjZSk7DQorICB2aXJ0dWFsIH5DQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyKCk7DQogDQotICAgIHZvaWQgSW5pdEFycmF5cyhpbnQzMl90IGx1bWluYW5jZVNpemUpOw0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4ICpHZXRCbGFja01hdHJpeChpbnQzMl90ICZlKTsNCi0gICAgQ0JDX0NvbW1vbkJpdEFycmF5ICpHZXRCbGFja1JvdyhpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIGludDMyX3QgRXN0aW1hdGVCbGFja1BvaW50KENGWF9JbnQzMkFycmF5ICZidWNrZXRzLCBpbnQzMl90ICZlKTsNCi1wcml2YXRlOg0KLSAgICBDRlhfQnl0ZUFycmF5IG1fbHVtaW5hbmNlOw0KLSAgICBDRlhfSW50MzJBcnJheSBtX2J1Y2tldHM7DQorICB2b2lkIEluaXRBcnJheXMoaW50MzJfdCBsdW1pbmFuY2VTaXplKTsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIEdldEJsYWNrTWF0cml4KGludDMyX3QmIGUpOw0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KiBHZXRCbGFja1JvdyhpbnQzMl90IHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBpbnQzMl90IEVzdGltYXRlQmxhY2tQb2ludChDRlhfSW50MzJBcnJheSYgYnVja2V0cywgaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBDRlhfQnl0ZUFycmF5IG1fbHVtaW5hbmNlOw0KKyAgQ0ZYX0ludDMyQXJyYXkgbV9idWNrZXRzOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IuY3BwCmluZGV4IDNkMzUwOTkuLjI1MWViNTkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvci5jcHAKQEAgLTI2LDIxOSArMjYsMjM1IEBACiAjaW5jbHVkZSAiLi4vQkNfUmVzdWx0UG9pbnQuaCINCiBjb25zdCBpbnQzMl90IENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpJTklUX1NJWkUgPSAzMDsNCiBjb25zdCBpbnQzMl90IENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpDT1JSID0gMTsNCi1DQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvcjo6Q0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UpDQotew0KLSAgICBtX2ltYWdlID0gaW1hZ2U7DQotICAgIG1faGVpZ2h0ID0gaW1hZ2UtPkdldEhlaWdodCgpOw0KLSAgICBtX3dpZHRoID0gaW1hZ2UtPkdldFdpZHRoKCk7DQotICAgIG1fbGVmdEluaXQgPSAobV93aWR0aCAtIElOSVRfU0laRSkgPj4gMTsNCi0gICAgbV9yaWdodEluaXQgPSAobV93aWR0aCArIElOSVRfU0laRSkgPj4gMTsNCi0gICAgbV91cEluaXQgPSAobV9oZWlnaHQgLSBJTklUX1NJWkUpID4+IDE7DQotICAgIG1fZG93bkluaXQgPSAobV9oZWlnaHQgKyBJTklUX1NJWkUpID4+IDE7DQorQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkNCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKA0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSkgew0KKyAgbV9pbWFnZSA9IGltYWdlOw0KKyAgbV9oZWlnaHQgPSBpbWFnZS0+R2V0SGVpZ2h0KCk7DQorICBtX3dpZHRoID0gaW1hZ2UtPkdldFdpZHRoKCk7DQorICBtX2xlZnRJbml0ID0gKG1fd2lkdGggLSBJTklUX1NJWkUpID4+IDE7DQorICBtX3JpZ2h0SW5pdCA9IChtX3dpZHRoICsgSU5JVF9TSVpFKSA+PiAxOw0KKyAgbV91cEluaXQgPSAobV9oZWlnaHQgLSBJTklUX1NJWkUpID4+IDE7DQorICBtX2Rvd25Jbml0ID0gKG1faGVpZ2h0ICsgSU5JVF9TSVpFKSA+PiAxOw0KIH0NCi12b2lkIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpJbml0KGludDMyX3QgJmUpDQotew0KLSAgICBpZiAobV91cEluaXQgPCAwIHx8IG1fbGVmdEluaXQgPCAwIHx8IG1fZG93bkluaXQgPj0gbV9oZWlnaHQgfHwgbV9yaWdodEluaXQgPj0gbV93aWR0aCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCit2b2lkIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpJbml0KGludDMyX3QmIGUpIHsNCisgIGlmIChtX3VwSW5pdCA8IDAgfHwgbV9sZWZ0SW5pdCA8IDAgfHwgbV9kb3duSW5pdCA+PSBtX2hlaWdodCB8fA0KKyAgICAgIG1fcmlnaHRJbml0ID49IG1fd2lkdGgpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KK30NCitDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvcjo6Q0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IoDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICBpbnQzMl90IGluaXRTaXplLA0KKyAgICBpbnQzMl90IHgsDQorICAgIGludDMyX3QgeSkgew0KKyAgbV9pbWFnZSA9IGltYWdlOw0KKyAgbV9oZWlnaHQgPSBpbWFnZS0+R2V0SGVpZ2h0KCk7DQorICBtX3dpZHRoID0gaW1hZ2UtPkdldFdpZHRoKCk7DQorICBpbnQzMl90IGhhbGZzaXplID0gaW5pdFNpemUgPj4gMTsNCisgIG1fbGVmdEluaXQgPSB4IC0gaGFsZnNpemU7DQorICBtX3JpZ2h0SW5pdCA9IHggKyBoYWxmc2l6ZTsNCisgIG1fdXBJbml0ID0geSAtIGhhbGZzaXplOw0KKyAgbV9kb3duSW5pdCA9IHkgKyBoYWxmc2l6ZTsNCit9DQorQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6On5DQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcigpIHt9DQorQ0ZYX1B0ckFycmF5KiBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvcjo6RGV0ZWN0KGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgbGVmdCA9IG1fbGVmdEluaXQ7DQorICBpbnQzMl90IHJpZ2h0ID0gbV9yaWdodEluaXQ7DQorICBpbnQzMl90IHVwID0gbV91cEluaXQ7DQorICBpbnQzMl90IGRvd24gPSBtX2Rvd25Jbml0Ow0KKyAgRlhfQk9PTCBzaXplRXhjZWVkZWQgPSBGQUxTRTsNCisgIEZYX0JPT0wgYUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gVFJVRTsNCisgIEZYX0JPT0wgYXRMZWFzdE9uZUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gRkFMU0U7DQorICB3aGlsZSAoYUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyKSB7DQorICAgIGFCbGFja1BvaW50Rm91bmRPbkJvcmRlciA9IEZBTFNFOw0KKyAgICBGWF9CT09MIHJpZ2h0Qm9yZGVyTm90V2hpdGUgPSBUUlVFOw0KKyAgICB3aGlsZSAocmlnaHRCb3JkZXJOb3RXaGl0ZSAmJiByaWdodCA8IG1fd2lkdGgpIHsNCisgICAgICByaWdodEJvcmRlck5vdFdoaXRlID0gQ29udGFpbnNCbGFja1BvaW50KHVwLCBkb3duLCByaWdodCwgRkFMU0UpOw0KKyAgICAgIGlmIChyaWdodEJvcmRlck5vdFdoaXRlKSB7DQorICAgICAgICByaWdodCsrOw0KKyAgICAgICAgYUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gVFJVRTsNCisgICAgICB9DQogICAgIH0NCi19DQotQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkNCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlLCBpbnQzMl90IGluaXRTaXplLCBpbnQzMl90IHgsIGludDMyX3QgeSkNCi17DQotICAgIG1faW1hZ2UgPSBpbWFnZTsNCi0gICAgbV9oZWlnaHQgPSBpbWFnZS0+R2V0SGVpZ2h0KCk7DQotICAgIG1fd2lkdGggPSBpbWFnZS0+R2V0V2lkdGgoKTsNCi0gICAgaW50MzJfdCBoYWxmc2l6ZSA9IGluaXRTaXplID4+IDE7DQotICAgIG1fbGVmdEluaXQgPSB4IC0gaGFsZnNpemU7DQotICAgIG1fcmlnaHRJbml0ID0geCArIGhhbGZzaXplOw0KLSAgICBtX3VwSW5pdCA9IHkgLSBoYWxmc2l6ZTsNCi0gICAgbV9kb3duSW5pdCA9IHkgKyBoYWxmc2l6ZTsNCi19DQotQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6On5DQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcigpDQotew0KLX0NCi1DRlhfUHRyQXJyYXkgKkNCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpEZXRlY3QoaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgbGVmdCA9IG1fbGVmdEluaXQ7DQotICAgIGludDMyX3QgcmlnaHQgPSBtX3JpZ2h0SW5pdDsNCi0gICAgaW50MzJfdCB1cCA9IG1fdXBJbml0Ow0KLSAgICBpbnQzMl90IGRvd24gPSBtX2Rvd25Jbml0Ow0KLSAgICBGWF9CT09MIHNpemVFeGNlZWRlZCA9IEZBTFNFOw0KLSAgICBGWF9CT09MIGFCbGFja1BvaW50Rm91bmRPbkJvcmRlciA9IFRSVUU7DQotICAgIEZYX0JPT0wgYXRMZWFzdE9uZUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gRkFMU0U7DQotICAgIHdoaWxlIChhQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIpIHsNCi0gICAgICAgIGFCbGFja1BvaW50Rm91bmRPbkJvcmRlciA9IEZBTFNFOw0KLSAgICAgICAgRlhfQk9PTCByaWdodEJvcmRlck5vdFdoaXRlID0gVFJVRTsNCi0gICAgICAgIHdoaWxlIChyaWdodEJvcmRlck5vdFdoaXRlICYmIHJpZ2h0IDwgbV93aWR0aCkgew0KLSAgICAgICAgICAgIHJpZ2h0Qm9yZGVyTm90V2hpdGUgPSBDb250YWluc0JsYWNrUG9pbnQodXAsIGRvd24sIHJpZ2h0LCBGQUxTRSk7DQotICAgICAgICAgICAgaWYgKHJpZ2h0Qm9yZGVyTm90V2hpdGUpIHsNCi0gICAgICAgICAgICAgICAgcmlnaHQrKzsNCi0gICAgICAgICAgICAgICAgYUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAocmlnaHQgPj0gbV93aWR0aCkgew0KLSAgICAgICAgICAgIHNpemVFeGNlZWRlZCA9IFRSVUU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBGWF9CT09MIGJvdHRvbUJvcmRlck5vdFdoaXRlID0gVFJVRTsNCi0gICAgICAgIHdoaWxlIChib3R0b21Cb3JkZXJOb3RXaGl0ZSAmJiBkb3duIDwgbV9oZWlnaHQpIHsNCi0gICAgICAgICAgICBib3R0b21Cb3JkZXJOb3RXaGl0ZSA9IENvbnRhaW5zQmxhY2tQb2ludChsZWZ0LCByaWdodCwgZG93biwgVFJVRSk7DQotICAgICAgICAgICAgaWYgKGJvdHRvbUJvcmRlck5vdFdoaXRlKSB7DQotICAgICAgICAgICAgICAgIGRvd24rKzsNCi0gICAgICAgICAgICAgICAgYUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoZG93biA+PSBtX2hlaWdodCkgew0KLSAgICAgICAgICAgIHNpemVFeGNlZWRlZCA9IFRSVUU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBGWF9CT09MIGxlZnRCb3JkZXJOb3RXaGl0ZSA9IFRSVUU7DQotICAgICAgICB3aGlsZSAobGVmdEJvcmRlck5vdFdoaXRlICYmIGxlZnQgPj0gMCkgew0KLSAgICAgICAgICAgIGxlZnRCb3JkZXJOb3RXaGl0ZSA9IENvbnRhaW5zQmxhY2tQb2ludCh1cCwgZG93biwgbGVmdCwgRkFMU0UpOw0KLSAgICAgICAgICAgIGlmIChsZWZ0Qm9yZGVyTm90V2hpdGUpIHsNCi0gICAgICAgICAgICAgICAgbGVmdC0tOw0KLSAgICAgICAgICAgICAgICBhQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIgPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChsZWZ0IDwgMCkgew0KLSAgICAgICAgICAgIHNpemVFeGNlZWRlZCA9IFRSVUU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBGWF9CT09MIHRvcEJvcmRlck5vdFdoaXRlID0gVFJVRTsNCi0gICAgICAgIHdoaWxlICh0b3BCb3JkZXJOb3RXaGl0ZSAmJiB1cCA+PSAwKSB7DQotICAgICAgICAgICAgdG9wQm9yZGVyTm90V2hpdGUgPSBDb250YWluc0JsYWNrUG9pbnQobGVmdCwgcmlnaHQsIHVwLCBUUlVFKTsNCi0gICAgICAgICAgICBpZiAodG9wQm9yZGVyTm90V2hpdGUpIHsNCi0gICAgICAgICAgICAgICAgdXAtLTsNCi0gICAgICAgICAgICAgICAgYUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAodXAgPCAwKSB7DQotICAgICAgICAgICAgc2l6ZUV4Y2VlZGVkID0gVFJVRTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChhQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIpIHsNCi0gICAgICAgICAgICBhdExlYXN0T25lQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIgPSBUUlVFOw0KLSAgICAgICAgfQ0KKyAgICBpZiAocmlnaHQgPj0gbV93aWR0aCkgew0KKyAgICAgIHNpemVFeGNlZWRlZCA9IFRSVUU7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKCFzaXplRXhjZWVkZWQgJiYgYXRMZWFzdE9uZUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyKSB7DQotICAgICAgICBpbnQzMl90IG1heFNpemUgPSByaWdodCAtIGxlZnQ7DQotICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IHooTlVMTCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBtYXhTaXplOyBpKyspIHsNCi0gICAgICAgICAgICB6ID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PihHZXRCbGFja1BvaW50T25TZWdtZW50KChGWF9GTE9BVClsZWZ0LCAoRlhfRkxPQVQpKGRvd24gLSBpKSwgKEZYX0ZMT0FUKShsZWZ0ICsgaSksIChGWF9GTE9BVCkoZG93bikpICk7DQotICAgICAgICAgICAgaWYgKHouZ2V0KCkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoei5nZXQoKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiB0KE5VTEwpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGogPSAxOyBqIDwgbWF4U2l6ZTsgaisrKSB7DQotICAgICAgICAgICAgdCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4oR2V0QmxhY2tQb2ludE9uU2VnbWVudCgoRlhfRkxPQVQpbGVmdCwgKEZYX0ZMT0FUKSh1cCArIGopLCAoRlhfRkxPQVQpKGxlZnQgKyBqKSwgKEZYX0ZMT0FUKXVwKSk7DQotICAgICAgICAgICAgaWYgKHQuZ2V0KCkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAodC5nZXQoKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiB4KE5VTEwpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGsgPSAxOyBrIDwgbWF4U2l6ZTsgaysrKSB7DQotICAgICAgICAgICAgeCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4oR2V0QmxhY2tQb2ludE9uU2VnbWVudCgoRlhfRkxPQVQpcmlnaHQsIChGWF9GTE9BVCkodXAgKyBrKSwgKEZYX0ZMT0FUKShyaWdodCAtIGspLCAoRlhfRkxPQVQpdXApKTsNCi0gICAgICAgICAgICBpZiAoeC5nZXQoKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh4LmdldCgpID09IE5VTEwpIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICB9DQotICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IHkoTlVMTCk7DQotICAgICAgICBmb3IgKGludDMyX3QgbSA9IDE7CW0gPCBtYXhTaXplOyBtKyspIHsNCi0gICAgICAgICAgICB5ID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PihHZXRCbGFja1BvaW50T25TZWdtZW50KChGWF9GTE9BVClyaWdodCwgKEZYX0ZMT0FUKShkb3duIC0gbSksIChGWF9GTE9BVCkocmlnaHQgLSBtKSwgKEZYX0ZMT0FUKSBkb3duKSk7DQotICAgICAgICAgICAgaWYgKHkuZ2V0KCkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoeS5nZXQoKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIENlbnRlckVkZ2VzKHkuZ2V0KCksIHouZ2V0KCksIHguZ2V0KCksIHQuZ2V0KCkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIEZYX0JPT0wgYm90dG9tQm9yZGVyTm90V2hpdGUgPSBUUlVFOw0KKyAgICB3aGlsZSAoYm90dG9tQm9yZGVyTm90V2hpdGUgJiYgZG93biA8IG1faGVpZ2h0KSB7DQorICAgICAgYm90dG9tQm9yZGVyTm90V2hpdGUgPSBDb250YWluc0JsYWNrUG9pbnQobGVmdCwgcmlnaHQsIGRvd24sIFRSVUUpOw0KKyAgICAgIGlmIChib3R0b21Cb3JkZXJOb3RXaGl0ZSkgew0KKyAgICAgICAgZG93bisrOw0KKyAgICAgICAgYUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gVFJVRTsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLWludDMyX3QgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OlJvdW5kKEZYX0ZMT0FUIGQpDQotew0KLSAgICByZXR1cm4gKGludDMyX3QpIChkICsgMC41Zik7DQotfQ0KLUNCQ19SZXN1bHRQb2ludCAqQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkdldEJsYWNrUG9pbnRPblNlZ21lbnQoRlhfRkxPQVQgYVgsIEZYX0ZMT0FUIGFZLCBGWF9GTE9BVCBiWCwgRlhfRkxPQVQgYlkpDQotew0KLSAgICBpbnQzMl90IGRpc3QgPSBEaXN0YW5jZUwyKGFYLCBhWSwgYlgsIGJZKTsNCi0gICAgZmxvYXQgeFN0ZXAgPSAoYlggLSBhWCkgLyBkaXN0Ow0KLSAgICBmbG9hdCB5U3RlcCA9IChiWSAtIGFZKSAvIGRpc3Q7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRpc3Q7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCB4ID0gUm91bmQoYVggKyBpICogeFN0ZXApOw0KLSAgICAgICAgaW50MzJfdCB5ID0gUm91bmQoYVkgKyBpICogeVN0ZXApOw0KLSAgICAgICAgaWYgKG1faW1hZ2UtPkdldCh4LCB5KSkgew0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KChGWF9GTE9BVCl4LCAoRlhfRkxPQVQpIHkpOw0KLSAgICAgICAgfQ0KKyAgICBpZiAoZG93biA+PSBtX2hlaWdodCkgew0KKyAgICAgIHNpemVFeGNlZWRlZCA9IFRSVUU7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLWludDMyX3QgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkRpc3RhbmNlTDIoRlhfRkxPQVQgYVgsIEZYX0ZMT0FUIGFZLCBGWF9GTE9BVCBiWCwgRlhfRkxPQVQgYlkpDQotew0KLSAgICBmbG9hdCB4RGlmZiA9IGFYIC0gYlg7DQotICAgIGZsb2F0IHlEaWZmID0gYVkgLSBiWTsNCi0gICAgcmV0dXJuIFJvdW5kKChmbG9hdClzcXJ0KHhEaWZmICogeERpZmYgKyB5RGlmZiAqIHlEaWZmKSk7DQotfQ0KLUNGWF9QdHJBcnJheSAqQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkNlbnRlckVkZ2VzKENCQ19SZXN1bHRQb2ludCAqeSwgQ0JDX1Jlc3VsdFBvaW50ICp6LCBDQkNfUmVzdWx0UG9pbnQgKngsIENCQ19SZXN1bHRQb2ludCAqdCkNCi17DQotICAgIGZsb2F0IHlpID0geS0+R2V0WCgpOw0KLSAgICBmbG9hdCB5aiA9IHktPkdldFkoKTsNCi0gICAgZmxvYXQgemkgPSB6LT5HZXRYKCk7DQotICAgIGZsb2F0IHpqID0gei0+R2V0WSgpOw0KLSAgICBmbG9hdCB4aSA9IHgtPkdldFgoKTsNCi0gICAgZmxvYXQgeGogPSB4LT5HZXRZKCk7DQotICAgIGZsb2F0IHRpID0gdC0+R2V0WCgpOw0KLSAgICBmbG9hdCB0aiA9IHQtPkdldFkoKTsNCi0gICAgaWYgKHlpIDwgbV93aWR0aCAvIDIpIHsNCi0gICAgICAgIENGWF9QdHJBcnJheSAqcmVzdWx0ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCi0gICAgICAgIHJlc3VsdC0+U2V0U2l6ZSg0KTsNCi0gICAgICAgICgqcmVzdWx0KVswXSA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQodGkgLSBDT1JSLCB0aiArIENPUlIpOw0KLSAgICAgICAgKCpyZXN1bHQpWzFdID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCh6aSArIENPUlIsIHpqICsgQ09SUik7DQotICAgICAgICAoKnJlc3VsdClbMl0gPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHhpIC0gQ09SUiwgeGogLSBDT1JSKTsNCi0gICAgICAgICgqcmVzdWx0KVszXSA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoeWkgKyBDT1JSLCB5aiAtIENPUlIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9QdHJBcnJheSAqcmVzdWx0ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCi0gICAgICAgIHJlc3VsdC0+U2V0U2l6ZSg0KTsNCi0gICAgICAgICgqcmVzdWx0KVswXSA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQodGkgKyBDT1JSLCB0aiArIENPUlIpOw0KLSAgICAgICAgKCpyZXN1bHQpWzFdID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCh6aSArIENPUlIsIHpqIC0gQ09SUik7DQotICAgICAgICAoKnJlc3VsdClbMl0gPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHhpIC0gQ09SUiwgeGogKyBDT1JSKTsNCi0gICAgICAgICgqcmVzdWx0KVszXSA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoeWkgLSBDT1JSLCB5aiAtIENPUlIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgRlhfQk9PTCBsZWZ0Qm9yZGVyTm90V2hpdGUgPSBUUlVFOw0KKyAgICB3aGlsZSAobGVmdEJvcmRlck5vdFdoaXRlICYmIGxlZnQgPj0gMCkgew0KKyAgICAgIGxlZnRCb3JkZXJOb3RXaGl0ZSA9IENvbnRhaW5zQmxhY2tQb2ludCh1cCwgZG93biwgbGVmdCwgRkFMU0UpOw0KKyAgICAgIGlmIChsZWZ0Qm9yZGVyTm90V2hpdGUpIHsNCisgICAgICAgIGxlZnQtLTsNCisgICAgICAgIGFCbGFja1BvaW50Rm91bmRPbkJvcmRlciA9IFRSVUU7DQorICAgICAgfQ0KICAgICB9DQotfQ0KLUZYX0JPT0wgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkNvbnRhaW5zQmxhY2tQb2ludChpbnQzMl90IGEsIGludDMyX3QgYiwgaW50MzJfdCBmaXhlZCwgRlhfQk9PTCBob3Jpem9udGFsKQ0KLXsNCi0gICAgaWYgKGhvcml6b250YWwpIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCB4ID0gYTsgeCA8PSBiOyB4KyspIHsNCi0gICAgICAgICAgICBpZiAobV9pbWFnZS0+R2V0KHgsIGZpeGVkKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBmb3IgKGludDMyX3QgeSA9IGE7IHkgPD0gYjsgeSsrKSB7DQotICAgICAgICAgICAgaWYgKG1faW1hZ2UtPkdldChmaXhlZCwgeSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgICBpZiAobGVmdCA8IDApIHsNCisgICAgICBzaXplRXhjZWVkZWQgPSBUUlVFOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCisgICAgRlhfQk9PTCB0b3BCb3JkZXJOb3RXaGl0ZSA9IFRSVUU7DQorICAgIHdoaWxlICh0b3BCb3JkZXJOb3RXaGl0ZSAmJiB1cCA+PSAwKSB7DQorICAgICAgdG9wQm9yZGVyTm90V2hpdGUgPSBDb250YWluc0JsYWNrUG9pbnQobGVmdCwgcmlnaHQsIHVwLCBUUlVFKTsNCisgICAgICBpZiAodG9wQm9yZGVyTm90V2hpdGUpIHsNCisgICAgICAgIHVwLS07DQorICAgICAgICBhQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAodXAgPCAwKSB7DQorICAgICAgc2l6ZUV4Y2VlZGVkID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoYUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyKSB7DQorICAgICAgYXRMZWFzdE9uZUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFzaXplRXhjZWVkZWQgJiYgYXRMZWFzdE9uZUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyKSB7DQorICAgIGludDMyX3QgbWF4U2l6ZSA9IHJpZ2h0IC0gbGVmdDsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiB6KE5VTEwpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBtYXhTaXplOyBpKyspIHsNCisgICAgICB6ID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PigNCisgICAgICAgICAgR2V0QmxhY2tQb2ludE9uU2VnbWVudCgoRlhfRkxPQVQpbGVmdCwgKEZYX0ZMT0FUKShkb3duIC0gaSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShsZWZ0ICsgaSksIChGWF9GTE9BVCkoZG93bikpKTsNCisgICAgICBpZiAoei5nZXQoKSAhPSBOVUxMKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKHouZ2V0KCkgPT0gTlVMTCkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgfQ0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IHQoTlVMTCk7DQorICAgIGZvciAoaW50MzJfdCBqID0gMTsgaiA8IG1heFNpemU7IGorKykgew0KKyAgICAgIHQgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+KA0KKyAgICAgICAgICBHZXRCbGFja1BvaW50T25TZWdtZW50KChGWF9GTE9BVClsZWZ0LCAoRlhfRkxPQVQpKHVwICsgaiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShsZWZ0ICsgaiksIChGWF9GTE9BVCl1cCkpOw0KKyAgICAgIGlmICh0LmdldCgpICE9IE5VTEwpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAodC5nZXQoKSA9PSBOVUxMKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4geChOVUxMKTsNCisgICAgZm9yIChpbnQzMl90IGsgPSAxOyBrIDwgbWF4U2l6ZTsgaysrKSB7DQorICAgICAgeCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4oDQorICAgICAgICAgIEdldEJsYWNrUG9pbnRPblNlZ21lbnQoKEZYX0ZMT0FUKXJpZ2h0LCAoRlhfRkxPQVQpKHVwICsgayksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShyaWdodCAtIGspLCAoRlhfRkxPQVQpdXApKTsNCisgICAgICBpZiAoeC5nZXQoKSAhPSBOVUxMKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKHguZ2V0KCkgPT0gTlVMTCkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgfQ0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IHkoTlVMTCk7DQorICAgIGZvciAoaW50MzJfdCBtID0gMTsgbSA8IG1heFNpemU7IG0rKykgew0KKyAgICAgIHkgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+KA0KKyAgICAgICAgICBHZXRCbGFja1BvaW50T25TZWdtZW50KChGWF9GTE9BVClyaWdodCwgKEZYX0ZMT0FUKShkb3duIC0gbSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShyaWdodCAtIG0pLCAoRlhfRkxPQVQpZG93bikpOw0KKyAgICAgIGlmICh5LmdldCgpICE9IE5VTEwpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoeS5nZXQoKSA9PSBOVUxMKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIHJldHVybiBDZW50ZXJFZGdlcyh5LmdldCgpLCB6LmdldCgpLCB4LmdldCgpLCB0LmdldCgpKTsNCisgIH0gZWxzZSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvcjo6Um91bmQoRlhfRkxPQVQgZCkgew0KKyAgcmV0dXJuIChpbnQzMl90KShkICsgMC41Zik7DQorfQ0KK0NCQ19SZXN1bHRQb2ludCogQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkdldEJsYWNrUG9pbnRPblNlZ21lbnQoDQorICAgIEZYX0ZMT0FUIGFYLA0KKyAgICBGWF9GTE9BVCBhWSwNCisgICAgRlhfRkxPQVQgYlgsDQorICAgIEZYX0ZMT0FUIGJZKSB7DQorICBpbnQzMl90IGRpc3QgPSBEaXN0YW5jZUwyKGFYLCBhWSwgYlgsIGJZKTsNCisgIGZsb2F0IHhTdGVwID0gKGJYIC0gYVgpIC8gZGlzdDsNCisgIGZsb2F0IHlTdGVwID0gKGJZIC0gYVkpIC8gZGlzdDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRpc3Q7IGkrKykgew0KKyAgICBpbnQzMl90IHggPSBSb3VuZChhWCArIGkgKiB4U3RlcCk7DQorICAgIGludDMyX3QgeSA9IFJvdW5kKGFZICsgaSAqIHlTdGVwKTsNCisgICAgaWYgKG1faW1hZ2UtPkdldCh4LCB5KSkgew0KKyAgICAgIHJldHVybiBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KChGWF9GTE9BVCl4LCAoRlhfRkxPQVQpeSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitpbnQzMl90IENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpEaXN0YW5jZUwyKEZYX0ZMT0FUIGFYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJZKSB7DQorICBmbG9hdCB4RGlmZiA9IGFYIC0gYlg7DQorICBmbG9hdCB5RGlmZiA9IGFZIC0gYlk7DQorICByZXR1cm4gUm91bmQoKGZsb2F0KXNxcnQoeERpZmYgKiB4RGlmZiArIHlEaWZmICogeURpZmYpKTsNCit9DQorQ0ZYX1B0ckFycmF5KiBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvcjo6Q2VudGVyRWRnZXMoQ0JDX1Jlc3VsdFBvaW50KiB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogeiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0KSB7DQorICBmbG9hdCB5aSA9IHktPkdldFgoKTsNCisgIGZsb2F0IHlqID0geS0+R2V0WSgpOw0KKyAgZmxvYXQgemkgPSB6LT5HZXRYKCk7DQorICBmbG9hdCB6aiA9IHotPkdldFkoKTsNCisgIGZsb2F0IHhpID0geC0+R2V0WCgpOw0KKyAgZmxvYXQgeGogPSB4LT5HZXRZKCk7DQorICBmbG9hdCB0aSA9IHQtPkdldFgoKTsNCisgIGZsb2F0IHRqID0gdC0+R2V0WSgpOw0KKyAgaWYgKHlpIDwgbV93aWR0aCAvIDIpIHsNCisgICAgQ0ZYX1B0ckFycmF5KiByZXN1bHQgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5Ow0KKyAgICByZXN1bHQtPlNldFNpemUoNCk7DQorICAgICgqcmVzdWx0KVswXSA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQodGkgLSBDT1JSLCB0aiArIENPUlIpOw0KKyAgICAoKnJlc3VsdClbMV0gPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHppICsgQ09SUiwgemogKyBDT1JSKTsNCisgICAgKCpyZXN1bHQpWzJdID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCh4aSAtIENPUlIsIHhqIC0gQ09SUik7DQorICAgICgqcmVzdWx0KVszXSA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoeWkgKyBDT1JSLCB5aiAtIENPUlIpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1B0ckFycmF5KiByZXN1bHQgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5Ow0KKyAgICByZXN1bHQtPlNldFNpemUoNCk7DQorICAgICgqcmVzdWx0KVswXSA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQodGkgKyBDT1JSLCB0aiArIENPUlIpOw0KKyAgICAoKnJlc3VsdClbMV0gPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHppICsgQ09SUiwgemogLSBDT1JSKTsNCisgICAgKCpyZXN1bHQpWzJdID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCh4aSAtIENPUlIsIHhqICsgQ09SUik7DQorICAgICgqcmVzdWx0KVszXSA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoeWkgLSBDT1JSLCB5aiAtIENPUlIpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KK30NCitGWF9CT09MIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpDb250YWluc0JsYWNrUG9pbnQoaW50MzJfdCBhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZml4ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaG9yaXpvbnRhbCkgew0KKyAgaWYgKGhvcml6b250YWwpIHsNCisgICAgZm9yIChpbnQzMl90IHggPSBhOyB4IDw9IGI7IHgrKykgew0KKyAgICAgIGlmIChtX2ltYWdlLT5HZXQoeCwgZml4ZWQpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGZvciAoaW50MzJfdCB5ID0gYTsgeSA8PSBiOyB5KyspIHsNCisgICAgICBpZiAobV9pbWFnZS0+R2V0KGZpeGVkLCB5KSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvci5oCmluZGV4IGM3NjA3ZjkuLjc0MTEyZDIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IuaApAQCAtOCwzMCArOCw0MSBAQAogI2RlZmluZSBfQkNfV0hJVEVSRUNUQU5MRURFVEVDVE9SX0hfDQogY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCiBjbGFzcyBDQkNfUmVzdWx0UG9pbnQ7DQotY2xhc3MgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3INCi17DQotcHVibGljOg0KLSAgICBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcihDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSk7DQotICAgIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlLCBpbnQzMl90IGluaXRTaXplLCBpbnQzMl90IHgsIGludDMyX3QgeSk7DQotICAgIHZpcnR1YWwgfkNCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKCk7DQotICAgIENGWF9QdHJBcnJheSAqRGV0ZWN0KGludDMyX3QgJmUpOw0KLSAgICB2aXJ0dWFsIHZvaWQgSW5pdChpbnQzMl90ICZlKTsNCi1wcml2YXRlOg0KLSAgICBpbnQzMl90IFJvdW5kKGZsb2F0IGQpOw0KLSAgICBDQkNfUmVzdWx0UG9pbnQgKkdldEJsYWNrUG9pbnRPblNlZ21lbnQoRlhfRkxPQVQgYVgsIEZYX0ZMT0FUIGFZLCBGWF9GTE9BVCBiWCwgRlhfRkxPQVQgYlkpOw0KLSAgICBpbnQzMl90IERpc3RhbmNlTDIoRlhfRkxPQVQgYVgsIEZYX0ZMT0FUIGFZLCBGWF9GTE9BVCBiWCwgRlhfRkxPQVQgYlkpOw0KLSAgICBDRlhfUHRyQXJyYXkgKkNlbnRlckVkZ2VzKENCQ19SZXN1bHRQb2ludCAqeSwgQ0JDX1Jlc3VsdFBvaW50ICp6LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCAqeCwgQ0JDX1Jlc3VsdFBvaW50ICp0KTsNCi0gICAgRlhfQk9PTCBDb250YWluc0JsYWNrUG9pbnQoaW50MzJfdCBhLCBpbnQzMl90IGIsIGludDMyX3QgZml4ZWQsIEZYX0JPT0wgaG9yaXpvbnRhbCk7DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IElOSVRfU0laRTsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09SUjsNCitjbGFzcyBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvciB7DQorIHB1YmxpYzoNCisgIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlKTsNCisgIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbml0U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSk7DQorICB2aXJ0dWFsIH5DQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcigpOw0KKyAgQ0ZYX1B0ckFycmF5KiBEZXRlY3QoaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdChpbnQzMl90JiBlKTsNCiANCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqbV9pbWFnZTsNCi0gICAgaW50MzJfdCBtX2hlaWdodDsNCi0gICAgaW50MzJfdCBtX3dpZHRoOw0KLSAgICBpbnQzMl90IG1fbGVmdEluaXQ7DQotICAgIGludDMyX3QgbV9yaWdodEluaXQ7DQotICAgIGludDMyX3QgbV9kb3duSW5pdDsNCi0gICAgaW50MzJfdCBtX3VwSW5pdDsNCisgcHJpdmF0ZToNCisgIGludDMyX3QgUm91bmQoZmxvYXQgZCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIEdldEJsYWNrUG9pbnRPblNlZ21lbnQoRlhfRkxPQVQgYVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYlgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYlkpOw0KKyAgaW50MzJfdCBEaXN0YW5jZUwyKEZYX0ZMT0FUIGFYLCBGWF9GTE9BVCBhWSwgRlhfRkxPQVQgYlgsIEZYX0ZMT0FUIGJZKTsNCisgIENGWF9QdHJBcnJheSogQ2VudGVyRWRnZXMoQ0JDX1Jlc3VsdFBvaW50KiB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0KTsNCisgIEZYX0JPT0wgQ29udGFpbnNCbGFja1BvaW50KGludDMyX3QgYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZml4ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGhvcml6b250YWwpOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgSU5JVF9TSVpFOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09SUjsNCisNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1faW1hZ2U7DQorICBpbnQzMl90IG1faGVpZ2h0Ow0KKyAgaW50MzJfdCBtX3dpZHRoOw0KKyAgaW50MzJfdCBtX2xlZnRJbml0Ow0KKyAgaW50MzJfdCBtX3JpZ2h0SW5pdDsNCisgIGludDMyX3QgbV9kb3duSW5pdDsNCisgIGludDMyX3QgbV91cEluaXQ7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmNwcAppbmRleCAxZWNlMmFkLi4yODY5MDZkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbi5jcHAKQEAgLTI0LDc3ICsyNCw3OSBAQAogI2luY2x1ZGUgIkJDX1JlZWRTb2xvbW9uR0YyNTYuaCINCiAjaW5jbHVkZSAiQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaCINCiAjaW5jbHVkZSAiQkNfUmVlZFNvbG9tb24uaCINCi1DQkNfUmVlZFNvbG9tb25FbmNvZGVyOjpDQkNfUmVlZFNvbG9tb25FbmNvZGVyKENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCkNCi17DQotICAgIG1fZmllbGQgPSBmaWVsZDsNCitDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjpDQkNfUmVlZFNvbG9tb25FbmNvZGVyKENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCkgew0KKyAgbV9maWVsZCA9IGZpZWxkOw0KIH0NCi12b2lkIENCQ19SZWVkU29sb21vbkVuY29kZXI6OkluaXQoKQ0KLXsNCi0gICAgbV9jYWNoZWRHZW5lcmF0b3JzLkFkZChGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KG1fZmllbGQsIDEpKTsNCit2b2lkIENCQ19SZWVkU29sb21vbkVuY29kZXI6OkluaXQoKSB7DQorICBtX2NhY2hlZEdlbmVyYXRvcnMuQWRkKEZYX05FVyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkobV9maWVsZCwgMSkpOw0KIH0NCi1DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkVuY29kZXI6OkJ1aWxkR2VuZXJhdG9yKGludDMyX3QgZGVncmVlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYoZGVncmVlID49IG1fY2FjaGVkR2VuZXJhdG9ycy5HZXRTaXplKCkpIHsNCi0gICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogbGFzdEdlbmVyYXRvciA9IChDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqKShtX2NhY2hlZEdlbmVyYXRvcnNbbV9jYWNoZWRHZW5lcmF0b3JzLkdldFNpemUoKSAtIDFdKTsNCi0gICAgICAgIGZvcihpbnQzMl90IGQgPSBtX2NhY2hlZEdlbmVyYXRvcnMuR2V0U2l6ZSgpOyBkIDw9IGRlZ3JlZTsgZCsrKSB7DQotICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkgdGVtcDsNCi0gICAgICAgICAgICB0ZW1wLkFkZCgxKTsNCi0gICAgICAgICAgICB0ZW1wLkFkZChtX2ZpZWxkLT5FeHAoZCAtIDEpKTsNCi0gICAgICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgdGVtcF9wb2x5Ow0KLSAgICAgICAgICAgIHRlbXBfcG9seS5Jbml0KG1fZmllbGQsICZ0ZW1wLCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBuZXh0R2VuZXJhdG9yID0gbGFzdEdlbmVyYXRvci0+TXVsdGlwbHkoJnRlbXBfcG9seSwgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgIG1fY2FjaGVkR2VuZXJhdG9ycy5BZGQobmV4dEdlbmVyYXRvcik7DQotICAgICAgICAgICAgbGFzdEdlbmVyYXRvciA9IG5leHRHZW5lcmF0b3I7DQotICAgICAgICB9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjpCdWlsZEdlbmVyYXRvcihpbnQzMl90IGRlZ3JlZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChkZWdyZWUgPj0gbV9jYWNoZWRHZW5lcmF0b3JzLkdldFNpemUoKSkgew0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGxhc3RHZW5lcmF0b3IgPQ0KKyAgICAgICAgKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSopKG1fY2FjaGVkR2VuZXJhdG9ycw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbV9jYWNoZWRHZW5lcmF0b3JzLkdldFNpemUoKSAtIDFdKTsNCisgICAgZm9yIChpbnQzMl90IGQgPSBtX2NhY2hlZEdlbmVyYXRvcnMuR2V0U2l6ZSgpOyBkIDw9IGRlZ3JlZTsgZCsrKSB7DQorICAgICAgQ0ZYX0ludDMyQXJyYXkgdGVtcDsNCisgICAgICB0ZW1wLkFkZCgxKTsNCisgICAgICB0ZW1wLkFkZChtX2ZpZWxkLT5FeHAoZCAtIDEpKTsNCisgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgdGVtcF9wb2x5Ow0KKyAgICAgIHRlbXBfcG9seS5Jbml0KG1fZmllbGQsICZ0ZW1wLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBuZXh0R2VuZXJhdG9yID0NCisgICAgICAgICAgbGFzdEdlbmVyYXRvci0+TXVsdGlwbHkoJnRlbXBfcG9seSwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgIG1fY2FjaGVkR2VuZXJhdG9ycy5BZGQobmV4dEdlbmVyYXRvcik7DQorICAgICAgbGFzdEdlbmVyYXRvciA9IG5leHRHZW5lcmF0b3I7DQogICAgIH0NCi0gICAgcmV0dXJuIChDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqKShtX2NhY2hlZEdlbmVyYXRvcnNbZGVncmVlXSk7DQorICB9DQorICByZXR1cm4gKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSopKG1fY2FjaGVkR2VuZXJhdG9yc1tkZWdyZWVdKTsNCiB9DQotdm9pZCBDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjpFbmNvZGUoQ0ZYX0ludDMyQXJyYXkgKnRvRW5jb2RlLCBpbnQzMl90IGVjQnl0ZXMsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihlY0J5dGVzID09IDApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vQ29ycmVjdGlvbkJ5dGVzOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgaW50MzJfdCBkYXRhQnl0ZXMgPSB0b0VuY29kZS0+R2V0U2l6ZSgpIC0gZWNCeXRlczsNCi0gICAgaWYoZGF0YUJ5dGVzIDw9IDApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vRGF0YUJ5dGVzUHJvdmlkZWQ7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGdlbmVyYXRvciA9IEJ1aWxkR2VuZXJhdG9yKGVjQnl0ZXMsIGUpOw0KK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uRW5jb2Rlcjo6RW5jb2RlKENGWF9JbnQzMkFycmF5KiB0b0VuY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVjQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGVjQnl0ZXMgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob0NvcnJlY3Rpb25CeXRlczsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIENGWF9JbnQzMkFycmF5IGluZm9Db2VmZmljaWVudHM7DQotICAgIGluZm9Db2VmZmljaWVudHMuU2V0U2l6ZShkYXRhQnl0ZXMpOw0KLSAgICBmb3IoaW50MzJfdCB4ID0gMDsgeCA8IGRhdGFCeXRlczsgeCsrKSB7DQotICAgICAgICBpbmZvQ29lZmZpY2llbnRzW3hdID0gdG9FbmNvZGUtPm9wZXJhdG9yIFtdKHgpOw0KLSAgICB9DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSBpbmZvOw0KLSAgICBpbmZvLkluaXQobV9maWVsZCwgJmluZm9Db2VmZmljaWVudHMsIGUpOw0KKyAgfQ0KKyAgaW50MzJfdCBkYXRhQnl0ZXMgPSB0b0VuY29kZS0+R2V0U2l6ZSgpIC0gZWNCeXRlczsNCisgIGlmIChkYXRhQnl0ZXMgPD0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob0RhdGFCeXRlc1Byb3ZpZGVkOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cgPSBpbmZvLk11bHRpcGx5QnlNb25vbWlhbChlY0J5dGVzLCAxLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gaW5mb1RlbXAocnNnKTsNCi0gICAgQ0ZYX1B0ckFycmF5ICpwYSA9IGluZm9UZW1wLT5EaXZpZGUoZ2VuZXJhdG9yLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIENCQ19BdXRvUHRyPENGWF9QdHJBcnJheSA+IHRlbXAocGEpOw0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJlbWFpbmRlciA9IChDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqKSh0ZW1wLT5vcGVyYXRvciBbXSgxKSk7DQotICAgIENGWF9JbnQzMkFycmF5KiBjb2VmZmljaWVudHMgPSByZW1haW5kZXItPkdldENvZWZmaWNpZW50cygpOw0KLSAgICBpbnQzMl90IG51bVplcm9Db2VmZmljaWVudHMgPSBlY0J5dGVzIC0gY29lZmZpY2llbnRzLT5HZXRTaXplKCk7DQotICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgbnVtWmVyb0NvZWZmaWNpZW50czsgaSsrKSB7DQotICAgICAgICAoKnRvRW5jb2RlKVtkYXRhQnl0ZXMgKyBpXSA9IDA7DQotICAgIH0NCi0gICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBjb2VmZmljaWVudHMtPkdldFNpemUoKTsgeSsrKSB7DQotICAgICAgICAoKnRvRW5jb2RlKVtkYXRhQnl0ZXMgKyBudW1aZXJvQ29lZmZpY2llbnRzICsgeV0gPQ0KLSAgICAgICAgICAgIGNvZWZmaWNpZW50cy0+b3BlcmF0b3IgW10oeSk7DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgdGVtcC0+R2V0U2l6ZSgpOyBrKyspIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KikoKnRlbXApW2tdOw0KLSAgICB9DQorICB9DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGdlbmVyYXRvciA9IEJ1aWxkR2VuZXJhdG9yKGVjQnl0ZXMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBDRlhfSW50MzJBcnJheSBpbmZvQ29lZmZpY2llbnRzOw0KKyAgaW5mb0NvZWZmaWNpZW50cy5TZXRTaXplKGRhdGFCeXRlcyk7DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBkYXRhQnl0ZXM7IHgrKykgew0KKyAgICBpbmZvQ29lZmZpY2llbnRzW3hdID0gdG9FbmNvZGUtPm9wZXJhdG9yW10oeCk7DQorICB9DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgaW5mbzsNCisgIGluZm8uSW5pdChtX2ZpZWxkLCAmaW5mb0NvZWZmaWNpZW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnID0gaW5mby5NdWx0aXBseUJ5TW9ub21pYWwoZWNCeXRlcywgMSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gaW5mb1RlbXAocnNnKTsNCisgIENGWF9QdHJBcnJheSogcGEgPSBpbmZvVGVtcC0+RGl2aWRlKGdlbmVyYXRvciwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENCQ19BdXRvUHRyPENGWF9QdHJBcnJheT4gdGVtcChwYSk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJlbWFpbmRlciA9DQorICAgICAgKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSopKHRlbXAtPm9wZXJhdG9yW10oMSkpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGNvZWZmaWNpZW50cyA9IHJlbWFpbmRlci0+R2V0Q29lZmZpY2llbnRzKCk7DQorICBpbnQzMl90IG51bVplcm9Db2VmZmljaWVudHMgPSBlY0J5dGVzIC0gY29lZmZpY2llbnRzLT5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1aZXJvQ29lZmZpY2llbnRzOyBpKyspIHsNCisgICAgKCp0b0VuY29kZSlbZGF0YUJ5dGVzICsgaV0gPSAwOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgY29lZmZpY2llbnRzLT5HZXRTaXplKCk7IHkrKykgew0KKyAgICAoKnRvRW5jb2RlKVtkYXRhQnl0ZXMgKyBudW1aZXJvQ29lZmZpY2llbnRzICsgeV0gPQ0KKyAgICAgICAgY29lZmZpY2llbnRzLT5vcGVyYXRvcltdKHkpOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgdGVtcC0+R2V0U2l6ZSgpOyBrKyspIHsNCisgICAgZGVsZXRlIChDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqKSgqdGVtcClba107DQorICB9DQogfQ0KLUNCQ19SZWVkU29sb21vbkVuY29kZXI6On5DQkNfUmVlZFNvbG9tb25FbmNvZGVyKCkNCi17DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fY2FjaGVkR2VuZXJhdG9ycy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgZGVsZXRlIChDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqKW1fY2FjaGVkR2VuZXJhdG9yc1tpXTsNCi0gICAgfQ0KK0NCQ19SZWVkU29sb21vbkVuY29kZXI6On5DQkNfUmVlZFNvbG9tb25FbmNvZGVyKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9jYWNoZWRHZW5lcmF0b3JzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIGRlbGV0ZSAoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiltX2NhY2hlZEdlbmVyYXRvcnNbaV07DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbi5oIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmgKaW5kZXggYmMzNWViZS4uNjcyNTYzNiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmgKQEAgLTgsMTcgKzgsMTcgQEAKICNkZWZpbmUgX0JDX1JFQURTT0xPTU9OX0hfDQogY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTY7DQogY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5Ow0KLWNsYXNzIENCQ19SZWVkU29sb21vbkVuY29kZXINCi17DQotcHJpdmF0ZToNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIG1fZmllbGQ7DQotICAgIENGWF9QdHJBcnJheSBtX2NhY2hlZEdlbmVyYXRvcnM7DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQnVpbGRHZW5lcmF0b3IoaW50MzJfdCBkZWdyZWUsIGludDMyX3QgJmUpOw0KLXB1YmxpYzoNCi0gICAgQ0JDX1JlZWRTb2xvbW9uRW5jb2RlcihDQkNfUmVlZFNvbG9tb25HRjI1NiAqIGZpZWxkKTsNCi0gICAgdmlydHVhbCB+Q0JDX1JlZWRTb2xvbW9uRW5jb2RlcigpOw0KK2NsYXNzIENCQ19SZWVkU29sb21vbkVuY29kZXIgew0KKyBwcml2YXRlOg0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIG1fZmllbGQ7DQorICBDRlhfUHRyQXJyYXkgbV9jYWNoZWRHZW5lcmF0b3JzOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBCdWlsZEdlbmVyYXRvcihpbnQzMl90IGRlZ3JlZSwgaW50MzJfdCYgZSk7DQogDQotICAgIHZvaWQgRW5jb2RlKENGWF9JbnQzMkFycmF5ICp0b0VuY29kZSwgaW50MzJfdCBlY0J5dGVzLCBpbnQzMl90ICZlKTsNCi0gICAgdmlydHVhbCB2b2lkIEluaXQoKTsNCisgcHVibGljOg0KKyAgQ0JDX1JlZWRTb2xvbW9uRW5jb2RlcihDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQpOw0KKyAgdmlydHVhbCB+Q0JDX1JlZWRTb2xvbW9uRW5jb2RlcigpOw0KKw0KKyAgdm9pZCBFbmNvZGUoQ0ZYX0ludDMyQXJyYXkqIHRvRW5jb2RlLCBpbnQzMl90IGVjQnl0ZXMsIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkRlY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5jcHAKaW5kZXggZjBlODdiOC4uZDU3ZWZlMSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5jcHAKQEAgLTI0LDIwMSArMjQsMjE2IEBACiAjaW5jbHVkZSAiQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KICNpbmNsdWRlICJCQ19SZWVkU29sb21vbkdGMjU2UG9seS5oIg0KICNpbmNsdWRlICJCQ19SZWVkU29sb21vbkRlY29kZXIuaCINCi1DQkNfUmVlZFNvbG9tb25EZWNvZGVyOjpDQkNfUmVlZFNvbG9tb25EZWNvZGVyKENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCkNCi17DQotICAgIG1fZmllbGQgPSBmaWVsZDsNCitDQkNfUmVlZFNvbG9tb25EZWNvZGVyOjpDQkNfUmVlZFNvbG9tb25EZWNvZGVyKENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCkgew0KKyAgbV9maWVsZCA9IGZpZWxkOw0KIH0NCi1DQkNfUmVlZFNvbG9tb25EZWNvZGVyOjp+Q0JDX1JlZWRTb2xvbW9uRGVjb2RlcigpDQotew0KK0NCQ19SZWVkU29sb21vbkRlY29kZXI6On5DQkNfUmVlZFNvbG9tb25EZWNvZGVyKCkge30NCit2b2lkIENCQ19SZWVkU29sb21vbkRlY29kZXI6OkRlY29kZShDRlhfSW50MzJBcnJheSogcmVjZWl2ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0d29TLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSBwb2x5Ow0KKyAgcG9seS5Jbml0KG1fZmllbGQsIHJlY2VpdmVkLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgc3luZHJvbWVDb2VmZmljaWVudHM7DQorICBzeW5kcm9tZUNvZWZmaWNpZW50cy5TZXRTaXplKHR3b1MpOw0KKyAgRlhfQk9PTCBkYXRhTWF0cml4ID0gRkFMU0U7DQorICBGWF9CT09MIG5vRXJyb3IgPSBUUlVFOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdHdvUzsgaSsrKSB7DQorICAgIGludDMyX3QgZXZhbCA9IHBvbHkuRXZhbHVhdGVBdChtX2ZpZWxkLT5FeHAoZGF0YU1hdHJpeCA/IGkgKyAxIDogaSkpOw0KKyAgICBzeW5kcm9tZUNvZWZmaWNpZW50c1t0d29TIC0gMSAtIGldID0gZXZhbDsNCisgICAgaWYgKGV2YWwgIT0gMCkgew0KKyAgICAgIG5vRXJyb3IgPSBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG5vRXJyb3IpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5IHN5bmRyb21lOw0KKyAgc3luZHJvbWUuSW5pdChtX2ZpZWxkLCAmc3luZHJvbWVDb2VmZmljaWVudHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZyA9IG1fZmllbGQtPkJ1aWxkTW9ub21pYWwodHdvUywgMSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcChyc2cpOw0KKyAgQ0ZYX1B0ckFycmF5KiBwYSA9IFJ1bkV1Y2xpZGVhbkFsZ29yaXRobSh0ZW1wLmdldCgpLCAmc3luZHJvbWUsIHR3b1MsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBDQkNfQXV0b1B0cjxDRlhfUHRyQXJyYXk+IHNpZ21hT21lZ2EocGEpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBzaWdtYSgNCisgICAgICAoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KikoKnNpZ21hT21lZ2EpWzBdKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gb21lZ2EoDQorICAgICAgKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSopKCpzaWdtYU9tZWdhKVsxXSk7DQorICBDRlhfSW50MzJBcnJheSogaWExID0gRmluZEVycm9yTG9jYXRpb25zKHNpZ21hLmdldCgpLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0JDX0F1dG9QdHI8Q0ZYX0ludDMyQXJyYXk+IGVycm9yTG9jYXRpb25zKGlhMSk7DQorICBDRlhfSW50MzJBcnJheSogaWEyID0NCisgICAgICBGaW5kRXJyb3JNYWduaXR1ZGVzKG9tZWdhLmdldCgpLCBlcnJvckxvY2F0aW9ucy5nZXQoKSwgZGF0YU1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENCQ19BdXRvUHRyPENGWF9JbnQzMkFycmF5PiBlcnJvck1hZ25pdHVkZXMoaWEyKTsNCisgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IGVycm9yTG9jYXRpb25zLT5HZXRTaXplKCk7IGsrKykgew0KKyAgICBpbnQzMl90IHBvc2l0aW9uID0NCisgICAgICAgIHJlY2VpdmVkLT5HZXRTaXplKCkgLSAxIC0gbV9maWVsZC0+TG9nKCgqZXJyb3JMb2NhdGlvbnMpW2tdLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIGlmIChwb3NpdGlvbiA8IDApIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25CYWRFcnJvckxvY2F0aW9uOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgICgqcmVjZWl2ZWQpW3Bvc2l0aW9uXSA9IENCQ19SZWVkU29sb21vbkdGMjU2OjpBZGRPclN1YnRyYWN0KA0KKyAgICAgICAgKCpyZWNlaXZlZClbcG9zaXRpb25dLCAoKmVycm9yTWFnbml0dWRlcylba10pOw0KKyAgfQ0KIH0NCi12b2lkIENCQ19SZWVkU29sb21vbkRlY29kZXI6OkRlY29kZShDRlhfSW50MzJBcnJheSogcmVjZWl2ZWQsIGludDMyX3QgdHdvUywgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSBwb2x5Ow0KLSAgICBwb2x5LkluaXQobV9maWVsZCwgcmVjZWl2ZWQsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgc3luZHJvbWVDb2VmZmljaWVudHM7DQotICAgIHN5bmRyb21lQ29lZmZpY2llbnRzLlNldFNpemUodHdvUyk7DQotICAgIEZYX0JPT0wgZGF0YU1hdHJpeCA9IEZBTFNFOw0KLSAgICBGWF9CT09MIG5vRXJyb3IgPSBUUlVFOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCB0d29TOyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgZXZhbCA9IHBvbHkuRXZhbHVhdGVBdChtX2ZpZWxkLT5FeHAoZGF0YU1hdHJpeCA/IGkgKyAxIDogaSkpOw0KLSAgICAgICAgc3luZHJvbWVDb2VmZmljaWVudHNbdHdvUyAtIDEgLSBpXSA9IGV2YWw7DQotICAgICAgICBpZiAoZXZhbCAhPSAwKSB7DQotICAgICAgICAgICAgbm9FcnJvciA9IEZBTFNFOw0KLSAgICAgICAgfQ0KK0NGWF9QdHJBcnJheSogQ0JDX1JlZWRTb2xvbW9uRGVjb2Rlcjo6UnVuRXVjbGlkZWFuQWxnb3JpdGhtKA0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGEsDQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogYiwNCisgICAgaW50MzJfdCBSLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoYS0+R2V0RGVncmVlKCkgPCBiLT5HZXREZWdyZWUoKSkgew0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHRlbXAgPSBhOw0KKyAgICBhID0gYjsNCisgICAgYiA9IHRlbXA7DQorICB9DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzEgPSBhLT5DbG9uZShlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gckxhc3QocnNnMSk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzIgPSBiLT5DbG9uZShlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gcihyc2cyKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnMyA9IG1fZmllbGQtPkdldE9uZSgpLT5DbG9uZShlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gc0xhc3QocnNnMyk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzQgPSBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBzKHJzZzQpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c1ID0gbV9maWVsZC0+R2V0WmVybygpLT5DbG9uZShlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdExhc3QocnNnNSk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzYgPSBtX2ZpZWxkLT5HZXRPbmUoKS0+Q2xvbmUoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHQocnNnNik7DQorICB3aGlsZSAoci0+R2V0RGVncmVlKCkgPj0gUiAvIDIpIHsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiByTGFzdExhc3QgPSByTGFzdDsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBzTGFzdExhc3QgPSBzTGFzdDsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0TGFzdGxhc3QgPSB0TGFzdDsNCisgICAgckxhc3QgPSByOw0KKyAgICBzTGFzdCA9IHM7DQorICAgIHRMYXN0ID0gdDsNCisgICAgaWYgKHJMYXN0LT5Jc1plcm8oKSkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvblJfSV8xSXNaZXJvOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCiAgICAgfQ0KLSAgICBpZihub0Vycm9yKSB7DQotICAgICAgICByZXR1cm47DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnNyA9IHJMYXN0TGFzdC0+Q2xvbmUoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiByVGVtcChyc2c3KTsNCisgICAgciA9IHJUZW1wOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzggPSBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gcShyc2c4KTsNCisgICAgaW50MzJfdCBkZW5vbWluYXRvckxlYWRpbmdUZXJtID0gckxhc3QtPkdldENvZWZmaWNpZW50cyhyTGFzdC0+R2V0RGVncmVlKCkpOw0KKyAgICBpbnQzMl90IGRsdEludmVyc2UgPSBtX2ZpZWxkLT5JbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0sIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHdoaWxlIChyLT5HZXREZWdyZWUoKSA+PSByTGFzdC0+R2V0RGVncmVlKCkgJiYgIShyLT5Jc1plcm8oKSkpIHsNCisgICAgICBpbnQzMl90IGRlZ3JlZURpZmYgPSByLT5HZXREZWdyZWUoKSAtIHJMYXN0LT5HZXREZWdyZWUoKTsNCisgICAgICBpbnQzMl90IHNjYWxlID0NCisgICAgICAgICAgbV9maWVsZC0+TXVsdGlwbHkoci0+R2V0Q29lZmZpY2llbnRzKHItPkdldERlZ3JlZSgpKSwgZGx0SW52ZXJzZSk7DQorICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2dwMSA9DQorICAgICAgICAgIG1fZmllbGQtPkJ1aWxkTW9ub21pYWwoZGVncmVlRGlmZiwgc2NhbGUsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IGJ1aWxkKHJzZ3AxKTsNCisgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZ3AyID0gcS0+QWRkT3JTdWJ0cmFjdChidWlsZC5nZXQoKSwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcChyc2dwMik7DQorICAgICAgcSA9IHRlbXA7DQorICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2dwMyA9DQorICAgICAgICAgIHJMYXN0LT5NdWx0aXBseUJ5TW9ub21pYWwoZGVncmVlRGlmZiwgc2NhbGUsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IG11bHRpcGx5KHJzZ3AzKTsNCisgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZ3A0ID0gci0+QWRkT3JTdWJ0cmFjdChtdWx0aXBseS5nZXQoKSwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDMocnNncDQpOw0KKyAgICAgIHIgPSB0ZW1wMzsNCiAgICAgfQ0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgc3luZHJvbWU7DQotICAgIHN5bmRyb21lLkluaXQobV9maWVsZCwgJnN5bmRyb21lQ29lZmZpY2llbnRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnID0gbV9maWVsZC0+QnVpbGRNb25vbWlhbCh0d29TLCAxLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcChyc2cpOw0KLSAgICBDRlhfUHRyQXJyYXkqIHBhID0gUnVuRXVjbGlkZWFuQWxnb3JpdGhtKHRlbXAuZ2V0KCksICZzeW5kcm9tZSwgdHdvUywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBDQkNfQXV0b1B0cjxDRlhfUHRyQXJyYXkgPiBzaWdtYU9tZWdhKHBhKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBzaWdtYSgoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KikoKnNpZ21hT21lZ2EpWzBdKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBvbWVnYSgoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KikoKnNpZ21hT21lZ2EpWzFdKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkqIGlhMSA9IEZpbmRFcnJvckxvY2F0aW9ucyhzaWdtYS5nZXQoKSwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheSA+IGVycm9yTG9jYXRpb25zKGlhMSk7DQotICAgIENGWF9JbnQzMkFycmF5KiBpYTIgPSBGaW5kRXJyb3JNYWduaXR1ZGVzKG9tZWdhLmdldCgpLCBlcnJvckxvY2F0aW9ucy5nZXQoKSwgZGF0YU1hdHJpeCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheSA+IGVycm9yTWFnbml0dWRlcyhpYTIpOw0KLSAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBlcnJvckxvY2F0aW9ucy0+R2V0U2l6ZSgpOyBrKyspIHsNCi0gICAgICAgIGludDMyX3QgcG9zaXRpb24gPSByZWNlaXZlZC0+R2V0U2l6ZSgpIC0gMSAtIG1fZmllbGQtPkxvZygoKmVycm9yTG9jYXRpb25zKVtrXSwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIGlmKHBvc2l0aW9uIDwgMCkgew0KLSAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkJhZEVycm9yTG9jYXRpb247DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICB9DQotICAgICAgICAoKnJlY2VpdmVkKVtwb3NpdGlvbl0gPSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdCgoKnJlY2VpdmVkKVtwb3NpdGlvbl0sICgqZXJyb3JNYWduaXR1ZGVzKVtrXSk7DQotICAgIH0NCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c5ID0gcS0+TXVsdGlwbHkoc0xhc3QuZ2V0KCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDEocnNnOSk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnMTAgPSB0ZW1wMS0+QWRkT3JTdWJ0cmFjdChzTGFzdExhc3QuZ2V0KCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDIocnNnMTApOw0KKyAgICBzID0gdGVtcDI7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnMTEgPSBxLT5NdWx0aXBseSh0TGFzdC5nZXQoKSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0ZW1wNShyc2cxMSk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnMTIgPSB0ZW1wNS0+QWRkT3JTdWJ0cmFjdCh0TGFzdGxhc3QuZ2V0KCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDYocnNnMTIpOw0KKyAgICB0ID0gdGVtcDY7DQorICB9DQorICBpbnQzMl90IHNpZ21hVGlsZGVBdFplcm8gPSB0LT5HZXRDb2VmZmljaWVudHMoMCk7DQorICBpZiAoc2lnbWFUaWxkZUF0WmVybyA9PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklzWmVybzsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgaW50MzJfdCBpbnZlcnNlID0gbV9maWVsZC0+SW52ZXJzZShzaWdtYVRpbGRlQXRaZXJvLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnMTMgPSB0LT5NdWx0aXBseShpbnZlcnNlLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gc2lnbWEocnNnMTMpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxNCA9IHItPk11bHRpcGx5KGludmVyc2UsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBvbWVnYShyc2cxNCk7DQorICBDRlhfUHRyQXJyYXkqIHRlbXAgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5Ow0KKyAgdGVtcC0+QWRkKHNpZ21hLnJlbGVhc2UoKSk7DQorICB0ZW1wLT5BZGQob21lZ2EucmVsZWFzZSgpKTsNCisgIHJldHVybiB0ZW1wOw0KIH0NCi1DRlhfUHRyQXJyYXkgKkNCQ19SZWVkU29sb21vbkRlY29kZXI6OlJ1bkV1Y2xpZGVhbkFsZ29yaXRobShDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGEsIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogYiwgaW50MzJfdCBSLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKGEtPkdldERlZ3JlZSgpIDwgYi0+R2V0RGVncmVlKCkpIHsNCi0gICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogdGVtcCA9IGE7DQotICAgICAgICBhID0gYjsNCi0gICAgICAgIGIgPSB0ZW1wOw0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUmVlZFNvbG9tb25EZWNvZGVyOjpGaW5kRXJyb3JMb2NhdGlvbnMoDQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogZXJyb3JMb2NhdG9yLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IG51bUVycm9ycyA9IGVycm9yTG9jYXRvci0+R2V0RGVncmVlKCk7DQorICBpZiAobnVtRXJyb3JzID09IDEpIHsNCisgICAgQ0JDX0F1dG9QdHI8Q0ZYX0ludDMyQXJyYXk+IHRlbXAoRlhfTkVXIENGWF9JbnQzMkFycmF5KTsNCisgICAgdGVtcC0+QWRkKGVycm9yTG9jYXRvci0+R2V0Q29lZmZpY2llbnRzKDEpKTsNCisgICAgcmV0dXJuIHRlbXAucmVsZWFzZSgpOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkqIHRlbXBUID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgdGVtcFQtPlNldFNpemUobnVtRXJyb3JzKTsNCisgIENCQ19BdXRvUHRyPENGWF9JbnQzMkFycmF5PiByZXN1bHQodGVtcFQpOw0KKyAgaW50MzJfdCBpZSA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCAyNTYgJiYgaWUgPCBudW1FcnJvcnM7IGkrKykgew0KKyAgICBpZiAoZXJyb3JMb2NhdG9yLT5FdmFsdWF0ZUF0KGkpID09IDApIHsNCisgICAgICAoKnJlc3VsdClbaWVdID0gbV9maWVsZC0+SW52ZXJzZShpLCBpZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgIGllKys7DQogICAgIH0NCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxID0gYS0+Q2xvbmUoZSk7DQorICB9DQorICBpZiAoaWUgIT0gbnVtRXJyb3JzKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkRlZ3JlZU5vdE1hdGNoUm9vdHM7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiByTGFzdChyc2cxKTsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cyID0gYi0+Q2xvbmUoZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiByKHJzZzIpOw0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzMgPSBtX2ZpZWxkLT5HZXRPbmUoKS0+Q2xvbmUoZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBzTGFzdChyc2czKTsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c0ID0gbV9maWVsZC0+R2V0WmVybygpLT5DbG9uZShlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHMocnNnNCk7DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnNSA9IG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0TGFzdChyc2c1KTsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c2ID0gbV9maWVsZC0+R2V0T25lKCktPkNsb25lKGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdChyc2c2KTsNCi0gICAgd2hpbGUgKHItPkdldERlZ3JlZSgpID49IFIgLyAyKSB7DQotICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHJMYXN0TGFzdCA9IHJMYXN0Ow0KLSAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBzTGFzdExhc3QgPSBzTGFzdDsNCi0gICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdExhc3RsYXN0ID0gdExhc3Q7DQotICAgICAgICByTGFzdCA9IHI7DQotICAgICAgICBzTGFzdCA9IHM7DQotICAgICAgICB0TGFzdCA9IHQ7DQotICAgICAgICBpZiAockxhc3QtPklzWmVybygpKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uUl9JXzFJc1plcm87DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c3ID0gIHJMYXN0TGFzdC0+Q2xvbmUoZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHJUZW1wKHJzZzcpOw0KLSAgICAgICAgciA9IHJUZW1wOw0KLSAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c4ID0gIG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHEocnNnOCk7DQotICAgICAgICBpbnQzMl90IGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPSByTGFzdC0+R2V0Q29lZmZpY2llbnRzKHJMYXN0LT5HZXREZWdyZWUoKSk7DQotICAgICAgICBpbnQzMl90IGRsdEludmVyc2UgPSBtX2ZpZWxkLT5JbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0sIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgd2hpbGUgKHItPkdldERlZ3JlZSgpID49IHJMYXN0LT5HZXREZWdyZWUoKSAmJiAhKHItPklzWmVybygpKSkgew0KLSAgICAgICAgICAgIGludDMyX3QgZGVncmVlRGlmZiA9IHItPkdldERlZ3JlZSgpIC0gckxhc3QtPkdldERlZ3JlZSgpOw0KLSAgICAgICAgICAgIGludDMyX3Qgc2NhbGUgPSBtX2ZpZWxkLT5NdWx0aXBseShyLT5HZXRDb2VmZmljaWVudHMoci0+R2V0RGVncmVlKCkpLCBkbHRJbnZlcnNlKTsNCi0gICAgICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZ3AxID0gbV9maWVsZC0+QnVpbGRNb25vbWlhbChkZWdyZWVEaWZmLCBzY2FsZSwgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gYnVpbGQocnNncDEpOw0KLSAgICAgICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNncDIgPSBxLT5BZGRPclN1YnRyYWN0KGJ1aWxkLmdldCgpLCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0ZW1wKHJzZ3AyKTsNCi0gICAgICAgICAgICBxID0gdGVtcDsNCi0gICAgICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZ3AzID0gckxhc3QtPk11bHRpcGx5QnlNb25vbWlhbChkZWdyZWVEaWZmLCBzY2FsZSwgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gbXVsdGlwbHkocnNncDMpOw0KLSAgICAgICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNncDQgPSByLT5BZGRPclN1YnRyYWN0KG11bHRpcGx5LmdldCgpLCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0ZW1wMyhyc2dwNCk7DQotICAgICAgICAgICAgciA9IHRlbXAzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c5ID0gcS0+TXVsdGlwbHkoc0xhc3QuZ2V0KCksIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0ZW1wMShyc2c5KTsNCi0gICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnMTAgPSB0ZW1wMS0+QWRkT3JTdWJ0cmFjdChzTGFzdExhc3QuZ2V0KCksIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0ZW1wMihyc2cxMCk7DQotICAgICAgICBzID0gdGVtcDI7DQotICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzExID0gcS0+TXVsdGlwbHkodExhc3QuZ2V0KCksIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0ZW1wNShyc2cxMSk7DQotICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzEyID0gdGVtcDUtPkFkZE9yU3VidHJhY3QodExhc3RsYXN0LmdldCgpLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDYocnNnMTIpOw0KLSAgICAgICAgdCA9IHRlbXA2Ow0KLSAgICB9DQotICAgIGludDMyX3Qgc2lnbWFUaWxkZUF0WmVybyA9IHQtPkdldENvZWZmaWNpZW50cygwKTsNCi0gICAgaWYgKHNpZ21hVGlsZGVBdFplcm8gPT0gMCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSXNaZXJvOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICB9DQotICAgIGludDMyX3QgaW52ZXJzZSA9IG1fZmllbGQtPkludmVyc2Uoc2lnbWFUaWxkZUF0WmVybywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxMyA9IHQtPk11bHRpcGx5KGludmVyc2UsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gc2lnbWEocnNnMTMpOw0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzE0ID0gci0+TXVsdGlwbHkoaW52ZXJzZSwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBvbWVnYShyc2cxNCk7DQotICAgIENGWF9QdHJBcnJheSAqdGVtcCA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQotICAgIHRlbXAtPkFkZChzaWdtYS5yZWxlYXNlKCkpOw0KLSAgICB0ZW1wLT5BZGQob21lZ2EucmVsZWFzZSgpKTsNCi0gICAgcmV0dXJuIHRlbXA7DQorICB9DQorICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsNCiB9DQotQ0ZYX0ludDMyQXJyYXkgKkNCQ19SZWVkU29sb21vbkRlY29kZXI6OkZpbmRFcnJvckxvY2F0aW9ucyhDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGVycm9yTG9jYXRvciwgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgbnVtRXJyb3JzID0gZXJyb3JMb2NhdG9yLT5HZXREZWdyZWUoKTsNCi0gICAgaWYgKG51bUVycm9ycyA9PSAxKSB7DQotICAgICAgICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheSA+IHRlbXAoRlhfTkVXIENGWF9JbnQzMkFycmF5KTsNCi0gICAgICAgIHRlbXAtPkFkZChlcnJvckxvY2F0b3ItPkdldENvZWZmaWNpZW50cygxKSk7DQotICAgICAgICByZXR1cm4gdGVtcC5yZWxlYXNlKCk7DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19SZWVkU29sb21vbkRlY29kZXI6OkZpbmRFcnJvck1hZ25pdHVkZXMoDQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogZXJyb3JFdmFsdWF0b3IsDQorICAgIENGWF9JbnQzMkFycmF5KiBlcnJvckxvY2F0aW9ucywNCisgICAgRlhfQk9PTCBkYXRhTWF0cml4LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IHMgPSBlcnJvckxvY2F0aW9ucy0+R2V0U2l6ZSgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIHRlbXAgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICB0ZW1wLT5TZXRTaXplKHMpOw0KKyAgQ0JDX0F1dG9QdHI8Q0ZYX0ludDMyQXJyYXk+IHJlc3VsdCh0ZW1wKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHM7IGkrKykgew0KKyAgICBpbnQzMl90IHhpSW52ZXJzZSA9IG1fZmllbGQtPkludmVyc2UoZXJyb3JMb2NhdGlvbnMtPm9wZXJhdG9yW10oaSksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIGludDMyX3QgZGVub21pbmF0b3IgPSAxOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBzOyBqKyspIHsNCisgICAgICBpZiAoaSAhPSBqKSB7DQorICAgICAgICBkZW5vbWluYXRvciA9IG1fZmllbGQtPk11bHRpcGx5KA0KKyAgICAgICAgICAgIGRlbm9taW5hdG9yLCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIG1fZmllbGQtPk11bHRpcGx5KGVycm9yTG9jYXRpb25zLT5vcGVyYXRvcltdKGopLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGlJbnZlcnNlKSkpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBDRlhfSW50MzJBcnJheSAqdGVtcFQgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQotICAgIHRlbXBULT5TZXRTaXplKG51bUVycm9ycyk7DQotICAgIENCQ19BdXRvUHRyPENGWF9JbnQzMkFycmF5ID4gcmVzdWx0KHRlbXBUKTsNCi0gICAgaW50MzJfdCBpZSA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IDI1NiAmJiBpZSA8IG51bUVycm9yczsgaSsrKSB7DQotICAgICAgICBpZihlcnJvckxvY2F0b3ItPkV2YWx1YXRlQXQoaSkgPT0gMCkgew0KLSAgICAgICAgICAgICgqcmVzdWx0KVtpZV0gPSBtX2ZpZWxkLT5JbnZlcnNlKGksIGllKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgaWUrKzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoaWUgIT0gbnVtRXJyb3JzKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25EZWdyZWVOb3RNYXRjaFJvb3RzOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICB9DQotICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOw0KLX0NCi1DRlhfSW50MzJBcnJheSAqQ0JDX1JlZWRTb2xvbW9uRGVjb2Rlcjo6RmluZEVycm9yTWFnbml0dWRlcyhDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGVycm9yRXZhbHVhdG9yLCBDRlhfSW50MzJBcnJheSogZXJyb3JMb2NhdGlvbnMsIEZYX0JPT0wgZGF0YU1hdHJpeCwgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgcyA9IGVycm9yTG9jYXRpb25zLT5HZXRTaXplKCk7DQotICAgIENGWF9JbnQzMkFycmF5ICogdGVtcCA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCi0gICAgdGVtcC0+U2V0U2l6ZShzKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0ZYX0ludDMyQXJyYXkgPiByZXN1bHQodGVtcCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHM7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCB4aUludmVyc2UgPSBtX2ZpZWxkLT5JbnZlcnNlKGVycm9yTG9jYXRpb25zLT5vcGVyYXRvciBbXShpKSwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICBpbnQzMl90IGRlbm9taW5hdG9yID0gMTsNCi0gICAgICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgczsgaisrKSB7DQotICAgICAgICAgICAgaWYoaSAhPSBqKSB7DQotICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gbV9maWVsZC0+TXVsdGlwbHkoZGVub21pbmF0b3IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QoMSwgbV9maWVsZC0+TXVsdGlwbHkoZXJyb3JMb2NhdGlvbnMtPm9wZXJhdG9yIFtdKGopLCB4aUludmVyc2UpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCB0ZW1wID0gbV9maWVsZC0+SW52ZXJzZShkZW5vbWluYXRvciwgdGVtcCk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAoKnJlc3VsdClbaV0gPSBtX2ZpZWxkLT5NdWx0aXBseShlcnJvckV2YWx1YXRvci0+RXZhbHVhdGVBdCh4aUludmVyc2UpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQorICAgIGludDMyX3QgdGVtcCA9IG1fZmllbGQtPkludmVyc2UoZGVub21pbmF0b3IsIHRlbXApOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICgqcmVzdWx0KVtpXSA9DQorICAgICAgICBtX2ZpZWxkLT5NdWx0aXBseShlcnJvckV2YWx1YXRvci0+RXZhbHVhdGVBdCh4aUludmVyc2UpLCB0ZW1wKTsNCisgIH0NCisgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25EZWNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25EZWNvZGVyLmgKaW5kZXggZWRlZmQ0YS4uNzQ3NzU1YyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkRlY29kZXIuaApAQCAtOCwxNiArOCwyMyBAQAogI2RlZmluZSBfQkNfUkVFRFNPTE9NT05ERUNPREVSX0hfDQogY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTY7DQogY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5Ow0KLWNsYXNzIENCQ19SZWVkU29sb21vbkRlY29kZXINCi17DQotcHJpdmF0ZToNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTYgKiBtX2ZpZWxkOw0KLXB1YmxpYzoNCi0gICAgQ0JDX1JlZWRTb2xvbW9uRGVjb2RlcihDQkNfUmVlZFNvbG9tb25HRjI1NiAqIGZpZWxkKTsNCi0gICAgdmlydHVhbCB+Q0JDX1JlZWRTb2xvbW9uRGVjb2RlcigpOw0KLSAgICB2b2lkIERlY29kZShDRlhfSW50MzJBcnJheSogcmVjZWl2ZWQsIGludDMyX3QgdHdvUywgaW50MzJfdCAmZSk7DQotICAgIENGWF9QdHJBcnJheSogUnVuRXVjbGlkZWFuQWxnb3JpdGhtKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogYSwgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBiLCBpbnQzMl90IFIsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfSW50MzJBcnJheSogRmluZEVycm9yTG9jYXRpb25zKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogZXJyb3JMb2NhdG9yLCBpbnQzMl90ICZlKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkqIEZpbmRFcnJvck1hZ25pdHVkZXMoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBlcnJvckV2YWx1YXRvciwgQ0ZYX0ludDMyQXJyYXkqIGVycm9yTG9jYXRpb25zLCBGWF9CT09MIGRhdGFNYXRyaXgsIGludDMyX3QgJmUpOw0KK2NsYXNzIENCQ19SZWVkU29sb21vbkRlY29kZXIgew0KKyBwcml2YXRlOg0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIG1fZmllbGQ7DQorDQorIHB1YmxpYzoNCisgIENCQ19SZWVkU29sb21vbkRlY29kZXIoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkKTsNCisgIHZpcnR1YWwgfkNCQ19SZWVkU29sb21vbkRlY29kZXIoKTsNCisgIHZvaWQgRGVjb2RlKENGWF9JbnQzMkFycmF5KiByZWNlaXZlZCwgaW50MzJfdCB0d29TLCBpbnQzMl90JiBlKTsNCisgIENGWF9QdHJBcnJheSogUnVuRXVjbGlkZWFuQWxnb3JpdGhtKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIEZpbmRFcnJvckxvY2F0aW9ucyhDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGVycm9yTG9jYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDRlhfSW50MzJBcnJheSogRmluZEVycm9yTWFnbml0dWRlcyhDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGVycm9yRXZhbHVhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIGVycm9yTG9jYXRpb25zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBkYXRhTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5jcHAKaW5kZXggNDI2YWMyZi4uNDNjOGM4MiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmNwcApAQCAtMjMsMTE4ICsyMywxMDggQEAKICNpbmNsdWRlICIuLi8uLi9iYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmgiDQogI2luY2x1ZGUgIkJDX1JlZWRTb2xvbW9uR0YyNTYuaCINCi1DQkNfUmVlZFNvbG9tb25HRjI1NiAqQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OlFSQ29kZUZpbGQgPSBOVUxMOw0KLUNCQ19SZWVkU29sb21vbkdGMjU2ICpDQkNfUmVlZFNvbG9tb25HRjI1Njo6RGF0YU1hdHJpeEZpZWxkID0gTlVMTDsNCi12b2lkIENCQ19SZWVkU29sb21vbkdGMjU2OjpJbml0aWFsaXplKCkNCi17DQotICAgIFFSQ29kZUZpbGQgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTYoMHgwMTFEKTsNCi0gICAgUVJDb2RlRmlsZC0+SW5pdCgpOw0KLSAgICBEYXRhTWF0cml4RmllbGQgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTYoMHgwMTJEKTsNCi0gICAgRGF0YU1hdHJpeEZpZWxkLT5Jbml0KCk7DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIENCQ19SZWVkU29sb21vbkdGMjU2OjpRUkNvZGVGaWxkID0gTlVMTDsNCitDQkNfUmVlZFNvbG9tb25HRjI1NiogQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkRhdGFNYXRyaXhGaWVsZCA9IE5VTEw7DQordm9pZCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6SW5pdGlhbGl6ZSgpIHsNCisgIFFSQ29kZUZpbGQgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTYoMHgwMTFEKTsNCisgIFFSQ29kZUZpbGQtPkluaXQoKTsNCisgIERhdGFNYXRyaXhGaWVsZCA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25HRjI1NigweDAxMkQpOw0KKyAgRGF0YU1hdHJpeEZpZWxkLT5Jbml0KCk7DQogfQ0KLXZvaWQgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkZpbmFsaXplKCkNCi17DQotICAgIGlmIChRUkNvZGVGaWxkKSB7DQotICAgICAgICBkZWxldGUgUVJDb2RlRmlsZDsNCi0gICAgfQ0KLSAgICBRUkNvZGVGaWxkID0gTlVMTDsNCi0gICAgaWYgKERhdGFNYXRyaXhGaWVsZCkgew0KLSAgICAgICAgZGVsZXRlIERhdGFNYXRyaXhGaWVsZDsNCi0gICAgfQ0KLSAgICBEYXRhTWF0cml4RmllbGQgPSBOVUxMOw0KK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkZpbmFsaXplKCkgew0KKyAgaWYgKFFSQ29kZUZpbGQpIHsNCisgICAgZGVsZXRlIFFSQ29kZUZpbGQ7DQorICB9DQorICBRUkNvZGVGaWxkID0gTlVMTDsNCisgIGlmIChEYXRhTWF0cml4RmllbGQpIHsNCisgICAgZGVsZXRlIERhdGFNYXRyaXhGaWVsZDsNCisgIH0NCisgIERhdGFNYXRyaXhGaWVsZCA9IE5VTEw7DQogfQ0KLUNCQ19SZWVkU29sb21vbkdGMjU2OjpDQkNfUmVlZFNvbG9tb25HRjI1NihpbnQzMl90IHByaW1pdGl2ZSkNCi17DQotICAgIGludDMyX3QgeCA9IDE7DQotICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgMjU2OyBqKyspIHsNCi0gICAgICAgIG1fZXhwVGFibGVbal0gPSB4Ow0KLSAgICAgICAgeCA8PD0gMTsNCi0gICAgICAgIGlmKHggPj0gMHgxMDApIHsNCi0gICAgICAgICAgICB4IF49IHByaW1pdGl2ZTsNCi0gICAgICAgIH0NCitDQkNfUmVlZFNvbG9tb25HRjI1Njo6Q0JDX1JlZWRTb2xvbW9uR0YyNTYoaW50MzJfdCBwcmltaXRpdmUpIHsNCisgIGludDMyX3QgeCA9IDE7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCAyNTY7IGorKykgew0KKyAgICBtX2V4cFRhYmxlW2pdID0geDsNCisgICAgeCA8PD0gMTsNCisgICAgaWYgKHggPj0gMHgxMDApIHsNCisgICAgICB4IF49IHByaW1pdGl2ZTsNCiAgICAgfQ0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IDI1NTsgaSsrKSB7DQotICAgICAgICBtX2xvZ1RhYmxlW21fZXhwVGFibGVbaV1dID0gaTsNCi0gICAgfQ0KLSAgICBtX2xvZ1RhYmxlWzBdID0gMDsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI1NTsgaSsrKSB7DQorICAgIG1fbG9nVGFibGVbbV9leHBUYWJsZVtpXV0gPSBpOw0KKyAgfQ0KKyAgbV9sb2dUYWJsZVswXSA9IDA7DQogfQ0KLXZvaWQgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkluaXQoKQ0KLXsNCi0gICAgbV96ZXJvID0gRlhfTkVXIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSh0aGlzLCAwKTsNCi0gICAgbV9vbmUgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KHRoaXMsIDEpOw0KK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkluaXQoKSB7DQorICBtX3plcm8gPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KHRoaXMsIDApOw0KKyAgbV9vbmUgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KHRoaXMsIDEpOw0KIH0NCi1DQkNfUmVlZFNvbG9tb25HRjI1Njo6fkNCQ19SZWVkU29sb21vbkdGMjU2KCkNCi17DQotICAgIGlmKG1femVybyAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgbV96ZXJvOw0KLSAgICAgICAgbV96ZXJvID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZihtX29uZSAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgbV9vbmU7DQotICAgICAgICBtX29uZSA9IE5VTEw7DQotICAgIH0NCitDQkNfUmVlZFNvbG9tb25HRjI1Njo6fkNCQ19SZWVkU29sb21vbkdGMjU2KCkgew0KKyAgaWYgKG1femVybyAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX3plcm87DQorICAgIG1femVybyA9IE5VTEw7DQorICB9DQorICBpZiAobV9vbmUgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9vbmU7DQorICAgIG1fb25lID0gTlVMTDsNCisgIH0NCiB9DQotQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1Njo6R2V0WmVybygpDQotew0KLSAgICByZXR1cm4gbV96ZXJvOw0KK0NCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkdldFplcm8oKSB7DQorICByZXR1cm4gbV96ZXJvOw0KIH0NCi1DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2OjpHZXRPbmUoKQ0KLXsNCi0gICAgcmV0dXJuIG1fb25lOw0KK0NCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkdldE9uZSgpIHsNCisgIHJldHVybiBtX29uZTsNCiB9DQotQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QnVpbGRNb25vbWlhbChpbnQzMl90IGRlZ3JlZSwgaW50MzJfdCBjb2VmZmljaWVudCwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKGRlZ3JlZSA8IDApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkRlZ3JlZUlzTmVnYXRpdmU7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIH0NCi0gICAgaWYoY29lZmZpY2llbnQgPT0gMCkgew0KLSAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gbV96ZXJvLT5DbG9uZShlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgIHJldHVybiB0ZW1wOw0KLSAgICB9DQotICAgIENGWF9JbnQzMkFycmF5ICBjb2VmZmljaWVudHM7DQotICAgIGNvZWZmaWNpZW50cy5TZXRTaXplKGRlZ3JlZSArIDEpOw0KLSAgICBjb2VmZmljaWVudHNbMF0gPSBjb2VmZmljaWVudDsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5ICp0ZW1wID0gRlhfTkVXIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOw0KLSAgICB0ZW1wLT5Jbml0KHRoaXMsICZjb2VmZmljaWVudHMsIGUpOw0KK0NCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkJ1aWxkTW9ub21pYWwoDQorICAgIGludDMyX3QgZGVncmVlLA0KKyAgICBpbnQzMl90IGNvZWZmaWNpZW50LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoZGVncmVlIDwgMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25EZWdyZWVJc05lZ2F0aXZlOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICBpZiAoY29lZmZpY2llbnQgPT0gMCkgew0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHRlbXAgPSBtX3plcm8tPkNsb25lKGUpOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQogICAgIHJldHVybiB0ZW1wOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgY29lZmZpY2llbnRzOw0KKyAgY29lZmZpY2llbnRzLlNldFNpemUoZGVncmVlICsgMSk7DQorICBjb2VmZmljaWVudHNbMF0gPSBjb2VmZmljaWVudDsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogdGVtcCA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCisgIHRlbXAtPkluaXQodGhpcywgJmNvZWZmaWNpZW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gdGVtcDsNCiB9DQotaW50MzJfdCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdChpbnQzMl90IGEsIGludDMyX3QgYikNCi17DQotICAgIHJldHVybiBhIF4gYjsNCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpBZGRPclN1YnRyYWN0KGludDMyX3QgYSwgaW50MzJfdCBiKSB7DQorICByZXR1cm4gYSBeIGI7DQogfQ0KLWludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkV4cChpbnQzMl90IGEpDQotew0KLSAgICByZXR1cm4gbV9leHBUYWJsZVthXTsNCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpFeHAoaW50MzJfdCBhKSB7DQorICByZXR1cm4gbV9leHBUYWJsZVthXTsNCiB9DQotaW50MzJfdCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6TG9nKGludDMyX3QgYSwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKGEgPT0gMCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uQUlzWmVybzsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9sb2dUYWJsZVthXTsNCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpMb2coaW50MzJfdCBhLCBpbnQzMl90JiBlKSB7DQorICBpZiAoYSA9PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkFJc1plcm87DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgIH0NCisgIHJldHVybiBtX2xvZ1RhYmxlW2FdOw0KIH0NCi1pbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpJbnZlcnNlKGludDMyX3QgYSwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKGEgPT0gMCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uQUlzWmVybzsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9leHBUYWJsZVsyNTUgLSBtX2xvZ1RhYmxlW2FdXTsNCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpJbnZlcnNlKGludDMyX3QgYSwgaW50MzJfdCYgZSkgew0KKyAgaWYgKGEgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25BSXNaZXJvOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICB9DQorICByZXR1cm4gbV9leHBUYWJsZVsyNTUgLSBtX2xvZ1RhYmxlW2FdXTsNCiB9DQotaW50MzJfdCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6TXVsdGlwbHkoaW50MzJfdCBhLCBpbnQzMl90IGIpDQotew0KLSAgICBpZihhID09IDAgfHwgYiA9PSAwKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpZihhID09IDEpIHsNCi0gICAgICAgIHJldHVybiBiOw0KLSAgICB9DQotICAgIGlmKGIgPT0gMSkgew0KLSAgICAgICAgcmV0dXJuIGE7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fZXhwVGFibGVbKG1fbG9nVGFibGVbYV0gKyBtX2xvZ1RhYmxlW2JdKSAlIDI1NV07DQoraW50MzJfdCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6TXVsdGlwbHkoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsNCisgIGlmIChhID09IDAgfHwgYiA9PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKGEgPT0gMSkgew0KKyAgICByZXR1cm4gYjsNCisgIH0NCisgIGlmIChiID09IDEpIHsNCisgICAgcmV0dXJuIGE7DQorICB9DQorICByZXR1cm4gbV9leHBUYWJsZVsobV9sb2dUYWJsZVthXSArIG1fbG9nVGFibGVbYl0pICUgMjU1XTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmgKaW5kZXggMTQxYzNkYS4uNThlMmY5ZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5oCkBAIC03LDI4ICs3LDMwIEBACiAjaWZuZGVmIF9CQ19SRUVEU09MT01PTkdGMjU2X0hfDQogI2RlZmluZSBfQkNfUkVFRFNPTE9NT05HRjI1Nl9IXw0KIGNsYXNzIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTsNCi1jbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1Ng0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCi0gICAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCi0gICAgc3RhdGljIENCQ19SZWVkU29sb21vbkdGMjU2ICpRUkNvZGVGaWxkOw0KLSAgICBzdGF0aWMgQ0JDX1JlZWRTb2xvbW9uR0YyNTYgKkRhdGFNYXRyaXhGaWVsZDsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTYoaW50MzJfdCBwcmltaXRpdmUpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUmVlZFNvbG9tb25HRjI1NigpOw0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIEdldFplcm8oKTsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBHZXRPbmUoKTsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBCdWlsZE1vbm9taWFsKGludDMyX3QgZGVncmVlLCBpbnQzMl90IGNvZWZmaWNpZW50LCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIGludDMyX3QgQWRkT3JTdWJ0cmFjdChpbnQzMl90IGEsIGludDMyX3QgYik7DQotICAgIGludDMyX3QgRXhwKGludDMyX3QgYSk7DQotICAgIGludDMyX3QgTG9nKGludDMyX3QgYSwgaW50MzJfdCAmZSk7DQotICAgIGludDMyX3QgSW52ZXJzZShpbnQzMl90IGEsIGludDMyX3QgJmUpOw0KLSAgICBpbnQzMl90IE11bHRpcGx5KGludDMyX3QgYSwgaW50MzJfdCBiKTsNCi0gICAgdmlydHVhbCB2b2lkIEluaXQoKTsNCi1wcml2YXRlOg0KLSAgICBpbnQzMl90IG1fZXhwVGFibGVbMjU2XTsNCi0gICAgaW50MzJfdCBtX2xvZ1RhYmxlWzI1Nl07DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqbV96ZXJvOw0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgKm1fb25lOw0KK2NsYXNzIENCQ19SZWVkU29sb21vbkdGMjU2IHsNCisgcHVibGljOg0KKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KKyAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisgIHN0YXRpYyBDQkNfUmVlZFNvbG9tb25HRjI1NiogUVJDb2RlRmlsZDsNCisgIHN0YXRpYyBDQkNfUmVlZFNvbG9tb25HRjI1NiogRGF0YU1hdHJpeEZpZWxkOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTYoaW50MzJfdCBwcmltaXRpdmUpOw0KKyAgdmlydHVhbCB+Q0JDX1JlZWRTb2xvbW9uR0YyNTYoKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogR2V0WmVybygpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBHZXRPbmUoKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQnVpbGRNb25vbWlhbChpbnQzMl90IGRlZ3JlZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZWZmaWNpZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIGludDMyX3QgQWRkT3JTdWJ0cmFjdChpbnQzMl90IGEsIGludDMyX3QgYik7DQorICBpbnQzMl90IEV4cChpbnQzMl90IGEpOw0KKyAgaW50MzJfdCBMb2coaW50MzJfdCBhLCBpbnQzMl90JiBlKTsNCisgIGludDMyX3QgSW52ZXJzZShpbnQzMl90IGEsIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBNdWx0aXBseShpbnQzMl90IGEsIGludDMyX3QgYik7DQorICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBtX2V4cFRhYmxlWzI1Nl07DQorICBpbnQzMl90IG1fbG9nVGFibGVbMjU2XTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogbV96ZXJvOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBtX29uZTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuY3BwCmluZGV4IGQ1OWY2MTkuLjFhYjQyZWIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmNwcApAQCAtMjMsMjM1ICsyMywyMzggQEAKICNpbmNsdWRlICIuLi8uLi9iYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX1JlZWRTb2xvbW9uR0YyNTYuaCINCiAjaW5jbHVkZSAiQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaCINCi1DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkNCQ19SZWVkU29sb21vbkdGMjU2UG9seShDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQsIGludDMyX3QgY29lZmZpY2llbnRzKQ0KLXsNCi0gICAgaWYoZmllbGQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIG1fZmllbGQgPSBmaWVsZDsNCi0gICAgbV9jb2VmZmljaWVudHMuQWRkKGNvZWZmaWNpZW50cyk7DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29lZmZpY2llbnRzKSB7DQorICBpZiAoZmllbGQgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX2ZpZWxkID0gZmllbGQ7DQorICBtX2NvZWZmaWNpZW50cy5BZGQoY29lZmZpY2llbnRzKTsNCiB9DQotQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKQ0KLXsNCi0gICAgbV9maWVsZCA9IE5VTEw7DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKSB7DQorICBtX2ZpZWxkID0gTlVMTDsNCiB9DQotdm9pZCBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkluaXQoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkLCBDRlhfSW50MzJBcnJheSogY29lZmZpY2llbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYoY29lZmZpY2llbnRzID09IE5VTEwgfHwgY29lZmZpY2llbnRzLT5HZXRTaXplKCkgPT0gMCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ29lZmZpY2llbnRzU2l6ZUlzTnVsbDsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpJbml0KENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogY29lZmZpY2llbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjb2VmZmljaWVudHMgPT0gTlVMTCB8fCBjb2VmZmljaWVudHMtPkdldFNpemUoKSA9PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkNvZWZmaWNpZW50c1NpemVJc051bGw7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgbV9maWVsZCA9IGZpZWxkOw0KKyAgaW50MzJfdCBjb2VmZmljaWVudHNMZW5ndGggPSBjb2VmZmljaWVudHMtPkdldFNpemUoKTsNCisgIGlmICgoY29lZmZpY2llbnRzTGVuZ3RoID4gMSAmJiAoKmNvZWZmaWNpZW50cylbMF0gPT0gMCkpIHsNCisgICAgaW50MzJfdCBmaXJzdE5vblplcm8gPSAxOw0KKyAgICB3aGlsZSAoKGZpcnN0Tm9uWmVybyA8IGNvZWZmaWNpZW50c0xlbmd0aCkgJiYNCisgICAgICAgICAgICgoKmNvZWZmaWNpZW50cylbZmlyc3ROb25aZXJvXSA9PSAwKSkgew0KKyAgICAgIGZpcnN0Tm9uWmVybysrOw0KICAgICB9DQotICAgIG1fZmllbGQgPSBmaWVsZDsNCi0gICAgaW50MzJfdCBjb2VmZmljaWVudHNMZW5ndGggPSBjb2VmZmljaWVudHMtPkdldFNpemUoKTsNCi0gICAgaWYoKGNvZWZmaWNpZW50c0xlbmd0aCA+IDEgJiYgKCpjb2VmZmljaWVudHMpWzBdID09IDApKSB7DQotICAgICAgICBpbnQzMl90IGZpcnN0Tm9uWmVybyA9IDE7DQotICAgICAgICB3aGlsZSgoZmlyc3ROb25aZXJvIDwgY29lZmZpY2llbnRzTGVuZ3RoKSAmJiAoKCpjb2VmZmljaWVudHMpW2ZpcnN0Tm9uWmVyb10gPT0gMCkpIHsNCi0gICAgICAgICAgICBmaXJzdE5vblplcm8rKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGZpcnN0Tm9uWmVybyA9PSBjb2VmZmljaWVudHNMZW5ndGgpIHsNCi0gICAgICAgICAgICBtX2NvZWZmaWNpZW50cy5Db3B5KCAqKG1fZmllbGQtPkdldFplcm8oKS0+R2V0Q29lZmZpY2llbnRzKCkpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9jb2VmZmljaWVudHMuU2V0U2l6ZShjb2VmZmljaWVudHNMZW5ndGggLSBmaXJzdE5vblplcm8pOw0KLSAgICAgICAgICAgIGZvcihpbnQzMl90IGkgPSBmaXJzdE5vblplcm8sIGogPSAwOyBpIDwgY29lZmZpY2llbnRzTGVuZ3RoOyBpKyssIGorKykgew0KLSAgICAgICAgICAgICAgICBtX2NvZWZmaWNpZW50c1tqXSA9IGNvZWZmaWNpZW50cy0+b3BlcmF0b3IgW10oaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgICBpZiAoZmlyc3ROb25aZXJvID09IGNvZWZmaWNpZW50c0xlbmd0aCkgew0KKyAgICAgIG1fY29lZmZpY2llbnRzLkNvcHkoKihtX2ZpZWxkLT5HZXRaZXJvKCktPkdldENvZWZmaWNpZW50cygpKSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBtX2NvZWZmaWNpZW50cy5Db3B5KCpjb2VmZmljaWVudHMpOw0KKyAgICAgIG1fY29lZmZpY2llbnRzLlNldFNpemUoY29lZmZpY2llbnRzTGVuZ3RoIC0gZmlyc3ROb25aZXJvKTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IGZpcnN0Tm9uWmVybywgaiA9IDA7IGkgPCBjb2VmZmljaWVudHNMZW5ndGg7IGkrKywgaisrKSB7DQorICAgICAgICBtX2NvZWZmaWNpZW50c1tqXSA9IGNvZWZmaWNpZW50cy0+b3BlcmF0b3JbXShpKTsNCisgICAgICB9DQogICAgIH0NCisgIH0gZWxzZSB7DQorICAgIG1fY29lZmZpY2llbnRzLkNvcHkoKmNvZWZmaWNpZW50cyk7DQorICB9DQogfQ0KLUNGWF9JbnQzMkFycmF5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkdldENvZWZmaWNpZW50cygpDQotew0KLSAgICByZXR1cm4gJm1fY29lZmZpY2llbnRzOw0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkdldENvZWZmaWNpZW50cygpIHsNCisgIHJldHVybiAmbV9jb2VmZmljaWVudHM7DQogfQ0KLWludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpHZXREZWdyZWUoKQ0KLXsNCi0gICAgcmV0dXJuIG1fY29lZmZpY2llbnRzLkdldFNpemUoKSAtIDE7DQoraW50MzJfdCBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkdldERlZ3JlZSgpIHsNCisgIHJldHVybiBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCkgLSAxOw0KIH0NCi1GWF9CT09MIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6SXNaZXJvKCkNCi17DQotICAgIHJldHVybiBtX2NvZWZmaWNpZW50c1swXSA9PSAwOw0KK0ZYX0JPT0wgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpJc1plcm8oKSB7DQorICByZXR1cm4gbV9jb2VmZmljaWVudHNbMF0gPT0gMDsNCiB9DQotaW50MzJfdCBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkdldENvZWZmaWNpZW50cyhpbnQzMl90IGRlZ3JlZSkNCi17DQotICAgIHJldHVybiBtX2NvZWZmaWNpZW50c1ttX2NvZWZmaWNpZW50cy5HZXRTaXplKCkgLSAxIC0gZGVncmVlXTsNCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6R2V0Q29lZmZpY2llbnRzKGludDMyX3QgZGVncmVlKSB7DQorICByZXR1cm4gbV9jb2VmZmljaWVudHNbbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpIC0gMSAtIGRlZ3JlZV07DQogfQ0KLWludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpFdmFsdWF0ZUF0KGludDMyX3QgYSkNCi17DQotICAgIGlmKGEgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEdldENvZWZmaWNpZW50cygwKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHNpemUgPSBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCk7DQotICAgIGlmKGEgPT0gMSkgew0KLSAgICAgICAgaW50MzJfdCByZXN1bHQgPSAwOw0KLSAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdChyZXN1bHQsIG1fY29lZmZpY2llbnRzW2ldKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0gICAgaW50MzJfdCByZXN1bHQgPSBtX2NvZWZmaWNpZW50c1swXTsNCi0gICAgZm9yKGludDMyX3QgaiA9IDE7IGogPCBzaXplOyBqKyspIHsNCi0gICAgICAgIHJlc3VsdCA9IENCQ19SZWVkU29sb21vbkdGMjU2OjpBZGRPclN1YnRyYWN0KA0KLSAgICAgICAgICAgICAgICAgICAgIG1fZmllbGQtPk11bHRpcGx5KGEsIHJlc3VsdCksDQotICAgICAgICAgICAgICAgICAgICAgbV9jb2VmZmljaWVudHNbal0pOw0KK2ludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpFdmFsdWF0ZUF0KGludDMyX3QgYSkgew0KKyAgaWYgKGEgPT0gMCkgew0KKyAgICByZXR1cm4gR2V0Q29lZmZpY2llbnRzKDApOw0KKyAgfQ0KKyAgaW50MzJfdCBzaXplID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgaWYgKGEgPT0gMSkgew0KKyAgICBpbnQzMl90IHJlc3VsdCA9IDA7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKyAgICAgIHJlc3VsdCA9IENCQ19SZWVkU29sb21vbkdGMjU2OjpBZGRPclN1YnRyYWN0KHJlc3VsdCwgbV9jb2VmZmljaWVudHNbaV0pOw0KICAgICB9DQogICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorICBpbnQzMl90IHJlc3VsdCA9IG1fY29lZmZpY2llbnRzWzBdOw0KKyAgZm9yIChpbnQzMl90IGogPSAxOyBqIDwgc2l6ZTsgaisrKSB7DQorICAgIHJlc3VsdCA9IENCQ19SZWVkU29sb21vbkdGMjU2OjpBZGRPclN1YnRyYWN0KG1fZmllbGQtPk11bHRpcGx5KGEsIHJlc3VsdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29lZmZpY2llbnRzW2pdKTsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQogfQ0KLUNCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpDbG9uZShpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5ICp0ZW1wICA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCi0gICAgdGVtcC0+SW5pdChtX2ZpZWxkLCAmbV9jb2VmZmljaWVudHMsIGUpOw0KK0NCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpDbG9uZShpbnQzMl90JiBlKSB7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHRlbXAgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7DQorICB0ZW1wLT5Jbml0KG1fZmllbGQsICZtX2NvZWZmaWNpZW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gdGVtcDsNCit9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkFkZE9yU3VidHJhY3QoDQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChJc1plcm8oKSkgew0KKyAgICByZXR1cm4gb3RoZXItPkNsb25lKGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICBpZiAob3RoZXItPklzWmVybygpKSB7DQorICAgIHJldHVybiB0aGlzLT5DbG9uZShlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgc21hbGxlckNvZWZmaWNpZW50czsNCisgIHNtYWxsZXJDb2VmZmljaWVudHMuQ29weShtX2NvZWZmaWNpZW50cyk7DQorICBDRlhfSW50MzJBcnJheSBsYXJnZXJDb2VmZmljaWVudHM7DQorICBsYXJnZXJDb2VmZmljaWVudHMuQ29weSgqKG90aGVyLT5HZXRDb2VmZmljaWVudHMoKSkpOw0KKyAgaWYgKHNtYWxsZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpID4gbGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKSkgew0KKyAgICBDRlhfSW50MzJBcnJheSB0ZW1wOw0KKyAgICB0ZW1wLkNvcHkoc21hbGxlckNvZWZmaWNpZW50cyk7DQorICAgIHNtYWxsZXJDb2VmZmljaWVudHMuQ29weShsYXJnZXJDb2VmZmljaWVudHMpOw0KKyAgICBsYXJnZXJDb2VmZmljaWVudHMuQ29weSh0ZW1wKTsNCisgIH0NCisgIENGWF9JbnQzMkFycmF5IHN1bURpZmY7DQorICBzdW1EaWZmLlNldFNpemUobGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKSk7DQorICBpbnQzMl90IGxlbmd0aERpZmYgPQ0KKyAgICAgIGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCkgLSBzbWFsbGVyQ29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbmd0aERpZmY7IGkrKykgew0KKyAgICBzdW1EaWZmW2ldID0gbGFyZ2VyQ29lZmZpY2llbnRzW2ldOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGogPSBsZW5ndGhEaWZmOyBqIDwgbGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKTsgaisrKSB7DQorICAgIHN1bURpZmZbal0gPSAoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QoDQorICAgICAgICBzbWFsbGVyQ29lZmZpY2llbnRzW2ogLSBsZW5ndGhEaWZmXSwgbGFyZ2VyQ29lZmZpY2llbnRzW2pdKSk7DQorICB9DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHRlbXAgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7DQorICB0ZW1wLT5Jbml0KG1fZmllbGQsICZzdW1EaWZmLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiB0ZW1wOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6TXVsdGlwbHkoDQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChJc1plcm8oKSB8fCBvdGhlci0+SXNaZXJvKCkpIHsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gbV9maWVsZC0+R2V0WmVybygpLT5DbG9uZShlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KICAgICByZXR1cm4gdGVtcDsNCisgIH0NCisgIENGWF9JbnQzMkFycmF5IGFDb2VmZmljaWVudHM7DQorICBhQ29lZmZpY2llbnRzLkNvcHkobV9jb2VmZmljaWVudHMpOw0KKyAgaW50MzJfdCBhTGVuZ3RoID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgYkNvZWZmaWNpZW50czsNCisgIGJDb2VmZmljaWVudHMuQ29weSgqKG90aGVyLT5HZXRDb2VmZmljaWVudHMoKSkpOw0KKyAgaW50MzJfdCBiTGVuZ3RoID0gb3RoZXItPkdldENvZWZmaWNpZW50cygpLT5HZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSBwcm9kdWN0Ow0KKyAgcHJvZHVjdC5TZXRTaXplKGFMZW5ndGggKyBiTGVuZ3RoIC0gMSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhTGVuZ3RoOyBpKyspIHsNCisgICAgaW50MzJfdCBhQ29lZmYgPSBtX2NvZWZmaWNpZW50c1tpXTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgYkxlbmd0aDsgaisrKSB7DQorICAgICAgcHJvZHVjdFtpICsgal0gPSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdCgNCisgICAgICAgICAgcHJvZHVjdFtpICsgal0sDQorICAgICAgICAgIG1fZmllbGQtPk11bHRpcGx5KGFDb2VmZiwgb3RoZXItPkdldENvZWZmaWNpZW50cygpLT5vcGVyYXRvcltdKGopKSk7DQorICAgIH0NCisgIH0NCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogdGVtcCA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCisgIHRlbXAtPkluaXQobV9maWVsZCwgJnByb2R1Y3QsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHRlbXA7DQogfQ0KLUNCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpBZGRPclN1YnRyYWN0KENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihJc1plcm8oKSkgew0KLSAgICAgICAgcmV0dXJuIG90aGVyLT5DbG9uZShlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgfQ0KLSAgICBpZihvdGhlci0+SXNaZXJvKCkpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLT5DbG9uZShlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgfQ0KLSAgICBDRlhfSW50MzJBcnJheSBzbWFsbGVyQ29lZmZpY2llbnRzOw0KLSAgICBzbWFsbGVyQ29lZmZpY2llbnRzLkNvcHkobV9jb2VmZmljaWVudHMpOw0KLSAgICBDRlhfSW50MzJBcnJheSBsYXJnZXJDb2VmZmljaWVudHM7DQotICAgIGxhcmdlckNvZWZmaWNpZW50cy5Db3B5KCAqKG90aGVyLT5HZXRDb2VmZmljaWVudHMoKSkpOw0KLSAgICBpZihzbWFsbGVyQ29lZmZpY2llbnRzLkdldFNpemUoKSA+IGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCkpIHsNCi0gICAgICAgIENGWF9JbnQzMkFycmF5IHRlbXA7DQotICAgICAgICB0ZW1wLkNvcHkoc21hbGxlckNvZWZmaWNpZW50cyk7DQotICAgICAgICBzbWFsbGVyQ29lZmZpY2llbnRzLkNvcHkobGFyZ2VyQ29lZmZpY2llbnRzKTsNCi0gICAgICAgIGxhcmdlckNvZWZmaWNpZW50cy5Db3B5KHRlbXApOw0KLSAgICB9DQotICAgIENGWF9JbnQzMkFycmF5IHN1bURpZmY7DQotICAgIHN1bURpZmYuU2V0U2l6ZShsYXJnZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpICk7DQotICAgIGludDMyX3QgbGVuZ3RoRGlmZiA9IGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCkgLSBzbWFsbGVyQ29lZmZpY2llbnRzLkdldFNpemUoKTsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBsZW5ndGhEaWZmOyBpKyspIHsNCi0gICAgICAgIHN1bURpZmZbaV0gPSBsYXJnZXJDb2VmZmljaWVudHNbaV07DQotICAgIH0NCi0gICAgZm9yKGludDMyX3QgaiA9IGxlbmd0aERpZmY7IGogPCBsYXJnZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpOyBqKyspIHsNCi0gICAgICAgIHN1bURpZmZbal0gPSAoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3Qoc21hbGxlckNvZWZmaWNpZW50c1tqIC0gbGVuZ3RoRGlmZl0sDQotICAgICAgICAgICAgICAgICAgICAgIGxhcmdlckNvZWZmaWNpZW50c1tqXSkpOw0KLSAgICB9DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqdGVtcCA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCi0gICAgdGVtcC0+SW5pdChtX2ZpZWxkLCAmc3VtRGlmZiwgZSk7DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6Ok11bHRpcGx5KGludDMyX3Qgc2NhbGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoc2NhbGFyID09IDApIHsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gbV9maWVsZC0+R2V0WmVybygpLT5DbG9uZShlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KICAgICByZXR1cm4gdGVtcDsNCisgIH0NCisgIGlmIChzY2FsYXIgPT0gMSkgew0KKyAgICByZXR1cm4gdGhpcy0+Q2xvbmUoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIGludDMyX3Qgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIENGWF9JbnQzMkFycmF5IHByb2R1Y3Q7DQorICBwcm9kdWN0LlNldFNpemUoc2l6ZSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisgICAgcHJvZHVjdFtpXSA9IG1fZmllbGQtPk11bHRpcGx5KG1fY29lZmZpY2llbnRzW2ldLCBzY2FsYXIpOw0KKyAgfQ0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gRlhfTkVXIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOw0KKyAgdGVtcC0+SW5pdChtX2ZpZWxkLCAmcHJvZHVjdCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gdGVtcDsNCiB9DQotQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6Ok11bHRpcGx5KENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihJc1plcm8oKSB8fCBvdGhlci0+SXNaZXJvKCkpIHsNCi0gICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqdGVtcCA9IG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICByZXR1cm4gdGVtcDsNCi0gICAgfQ0KLSAgICBDRlhfSW50MzJBcnJheSBhQ29lZmZpY2llbnRzIDsNCi0gICAgYUNvZWZmaWNpZW50cy5Db3B5KG1fY29lZmZpY2llbnRzKTsNCi0gICAgaW50MzJfdCBhTGVuZ3RoID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KLSAgICBDRlhfSW50MzJBcnJheSBiQ29lZmZpY2llbnRzOw0KLSAgICBiQ29lZmZpY2llbnRzLkNvcHkoKihvdGhlci0+R2V0Q29lZmZpY2llbnRzKCkpKTsNCi0gICAgaW50MzJfdCBiTGVuZ3RoID0gb3RoZXItPkdldENvZWZmaWNpZW50cygpLT5HZXRTaXplKCk7DQotICAgIENGWF9JbnQzMkFycmF5IHByb2R1Y3Q7DQotICAgIHByb2R1Y3QuU2V0U2l6ZShhTGVuZ3RoICsgYkxlbmd0aCAtIDEpOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGFMZW5ndGg7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBhQ29lZmYgPSBtX2NvZWZmaWNpZW50c1tpXTsNCi0gICAgICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgYkxlbmd0aDsgaisrKSB7DQotICAgICAgICAgICAgcHJvZHVjdFtpICsgal0gPSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0W2kgKyBqXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZpZWxkLT5NdWx0aXBseShhQ29lZmYsIG90aGVyLT5HZXRDb2VmZmljaWVudHMoKS0+b3BlcmF0b3IgW10oaikpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgKnRlbXAgPSBGWF9ORVcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7DQotICAgIHRlbXAtPkluaXQobV9maWVsZCwgJnByb2R1Y3QsIGUpOw0KK0NCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpNdWx0aXBseUJ5TW9ub21pYWwoDQorICAgIGludDMyX3QgZGVncmVlLA0KKyAgICBpbnQzMl90IGNvZWZmaWNpZW50LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoZGVncmVlIDwgMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25EZWdyZWVJc05lZ2F0aXZlOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICBpZiAoY29lZmZpY2llbnQgPT0gMCkgew0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHRlbXAgPSBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKGUpOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQogICAgIHJldHVybiB0ZW1wOw0KKyAgfQ0KKyAgaW50MzJfdCBzaXplID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgcHJvZHVjdDsNCisgIHByb2R1Y3QuU2V0U2l6ZShzaXplICsgZGVncmVlKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKyAgICBwcm9kdWN0W2ldID0gKG1fZmllbGQtPk11bHRpcGx5KG1fY29lZmZpY2llbnRzW2ldLCBjb2VmZmljaWVudCkpOw0KKyAgfQ0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gRlhfTkVXIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOw0KKyAgdGVtcC0+SW5pdChtX2ZpZWxkLCAmcHJvZHVjdCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gdGVtcDsNCiB9DQotQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6Ok11bHRpcGx5KGludDMyX3Qgc2NhbGFyLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYoc2NhbGFyID09IDApIHsNCi0gICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqdGVtcCA9IG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICByZXR1cm4gdGVtcDsNCi0gICAgfQ0KLSAgICBpZihzY2FsYXIgPT0gMSkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMtPkNsb25lKGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICB9DQotICAgIGludDMyX3Qgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgcHJvZHVjdDsNCi0gICAgcHJvZHVjdC5TZXRTaXplKHNpemUpOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KLSAgICAgICAgcHJvZHVjdFtpXSA9IG1fZmllbGQtPk11bHRpcGx5KG1fY29lZmZpY2llbnRzW2ldLCBzY2FsYXIpOw0KLSAgICB9DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqdGVtcCA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCi0gICAgdGVtcC0+SW5pdChtX2ZpZWxkLCAmcHJvZHVjdCwgZSk7DQorQ0ZYX1B0ckFycmF5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkRpdmlkZShDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG90aGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG90aGVyLT5Jc1plcm8oKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25EaXZpZGVCeVplcm87DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgcmV0dXJuIHRlbXA7DQorICB9DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzEgPSBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBxdW90aWVudChyc2cxKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnMiA9IHRoaXMtPkNsb25lKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiByZW1haW5kZXIocnNnMik7DQorICBpbnQzMl90IGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPSBvdGhlci0+R2V0Q29lZmZpY2llbnRzKG90aGVyLT5HZXREZWdyZWUoKSk7DQorICBpbnQzMl90IGludmVyc2VEZW5vbWluYXRvckxlYWRpbmdUZWFtID0NCisgICAgICBtX2ZpZWxkLT5JbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0sIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOw0KKyAgd2hpbGUgKHJlbWFpbmRlci0+R2V0RGVncmVlKCkgPj0gb3RoZXItPkdldERlZ3JlZSgpICYmICFyZW1haW5kZXItPklzWmVybygpKSB7DQorICAgIGludDMyX3QgZGVncmVlRGlmZmVyZW5jZSA9IHJlbWFpbmRlci0+R2V0RGVncmVlKCkgLSBvdGhlci0+R2V0RGVncmVlKCk7DQorICAgIGludDMyX3Qgc2NhbGUgPQ0KKyAgICAgICAgbV9maWVsZC0+TXVsdGlwbHkocmVtYWluZGVyLT5HZXRDb2VmZmljaWVudHMoKHJlbWFpbmRlci0+R2V0RGVncmVlKCkpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VEZW5vbWluYXRvckxlYWRpbmdUZWFtKTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2czID0NCisgICAgICAgIG90aGVyLT5NdWx0aXBseUJ5TW9ub21pYWwoZGVncmVlRGlmZmVyZW5jZSwgc2NhbGUsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVybShyc2czKTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c0ID0NCisgICAgICAgIG1fZmllbGQtPkJ1aWxkTW9ub21pYWwoZGVncmVlRGlmZmVyZW5jZSwgc2NhbGUsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gaXRlcmF0b3JRdW90aWVudChyc2c0KTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c1ID0NCisgICAgICAgIHF1b3RpZW50LT5BZGRPclN1YnRyYWN0KGl0ZXJhdG9yUXVvdGllbnQuZ2V0KCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcChyc2c1KTsNCisgICAgcXVvdGllbnQgPSB0ZW1wOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzYgPSByZW1haW5kZXItPkFkZE9yU3VidHJhY3QodGVybS5nZXQoKSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0ZW1wMShyc2c2KTsNCisgICAgcmVtYWluZGVyID0gdGVtcDE7DQorICB9DQorICBDRlhfUHRyQXJyYXkqIHRlbXBQdHJBID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgIHRlbXBQdHJBLT5BZGQocXVvdGllbnQucmVsZWFzZSgpKTsNCisgIHRlbXBQdHJBLT5BZGQocmVtYWluZGVyLnJlbGVhc2UoKSk7DQorICByZXR1cm4gdGVtcFB0ckE7DQogfQ0KLUNCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpNdWx0aXBseUJ5TW9ub21pYWwoaW50MzJfdCBkZWdyZWUsIGludDMyX3QgY29lZmZpY2llbnQsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihkZWdyZWUgPCAwKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25EZWdyZWVJc05lZ2F0aXZlOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICB9DQotICAgIGlmKGNvZWZmaWNpZW50ID09IDApIHsNCi0gICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqdGVtcCA9IG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICByZXR1cm4gdGVtcDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHNpemUgPSBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCk7DQotICAgIENGWF9JbnQzMkFycmF5IHByb2R1Y3Q7DQotICAgIHByb2R1Y3QuU2V0U2l6ZShzaXplICsgZGVncmVlKTsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCi0gICAgICAgIHByb2R1Y3RbaV0gPSAobV9maWVsZC0+TXVsdGlwbHkobV9jb2VmZmljaWVudHNbaV0sIGNvZWZmaWNpZW50KSk7DQotICAgIH0NCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5ICp0ZW1wID0gRlhfTkVXIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOw0KLSAgICB0ZW1wLT5Jbml0KG1fZmllbGQsICZwcm9kdWN0LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gdGVtcDsNCi19DQotQ0ZYX1B0ckFycmF5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkRpdmlkZShDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgKm90aGVyLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYob3RoZXItPklzWmVybygpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25EaXZpZGVCeVplcm87DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIH0NCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxID0gbV9maWVsZC0+R2V0WmVybygpLT5DbG9uZShlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHF1b3RpZW50KHJzZzEpOw0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzIgPSB0aGlzLT5DbG9uZShlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHJlbWFpbmRlcihyc2cyKTsNCi0gICAgaW50MzJfdCBkZW5vbWluYXRvckxlYWRpbmdUZXJtID0gb3RoZXItPkdldENvZWZmaWNpZW50cyhvdGhlci0+R2V0RGVncmVlKCkpOw0KLSAgICBpbnQzMl90IGludmVyc2VEZW5vbWluYXRvckxlYWRpbmdUZWFtID0gbV9maWVsZC0+SW52ZXJzZShkZW5vbWluYXRvckxlYWRpbmdUZXJtLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7DQotICAgIHdoaWxlKHJlbWFpbmRlci0+R2V0RGVncmVlKCkgPj0gb3RoZXItPkdldERlZ3JlZSgpICYmICFyZW1haW5kZXItPklzWmVybygpKSB7DQotICAgICAgICBpbnQzMl90IGRlZ3JlZURpZmZlcmVuY2UgPSByZW1haW5kZXItPkdldERlZ3JlZSgpIC0gb3RoZXItPkdldERlZ3JlZSgpOw0KLSAgICAgICAgaW50MzJfdCBzY2FsZSA9IG1fZmllbGQtPk11bHRpcGx5KHJlbWFpbmRlci0+R2V0Q29lZmZpY2llbnRzKChyZW1haW5kZXItPkdldERlZ3JlZSgpKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VEZW5vbWluYXRvckxlYWRpbmdUZWFtKTsNCi0gICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnMyA9IG90aGVyLT5NdWx0aXBseUJ5TW9ub21pYWwoZGVncmVlRGlmZmVyZW5jZSwgc2NhbGUsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0ZXJtKHJzZzMpOw0KLSAgICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c0ID0gbV9maWVsZC0+QnVpbGRNb25vbWlhbChkZWdyZWVEaWZmZXJlbmNlLCBzY2FsZSwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IGl0ZXJhdG9yUXVvdGllbnQocnNnNCk7DQotICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzUgPSBxdW90aWVudC0+QWRkT3JTdWJ0cmFjdChpdGVyYXRvclF1b3RpZW50LmdldCgpLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcChyc2c1KTsNCi0gICAgICAgIHF1b3RpZW50ID0gdGVtcDsNCi0gICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnNiA9IHJlbWFpbmRlci0+QWRkT3JTdWJ0cmFjdCh0ZXJtLmdldCgpLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDEocnNnNik7DQotICAgICAgICByZW1haW5kZXIgPSB0ZW1wMTsNCi0gICAgfQ0KLSAgICBDRlhfUHRyQXJyYXkqIHRlbXBQdHJBID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCi0gICAgdGVtcFB0ckEtPkFkZChxdW90aWVudC5yZWxlYXNlKCkpOw0KLSAgICB0ZW1wUHRyQS0+QWRkKHJlbWFpbmRlci5yZWxlYXNlKCkpOw0KLSAgICByZXR1cm4gdGVtcFB0ckE7DQotfQ0KLUNCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6fkNCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpDQotew0KLSAgICBtX2NvZWZmaWNpZW50cy5SZW1vdmVBbGwoKTsNCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6On5DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKSB7DQorICBtX2NvZWZmaWNpZW50cy5SZW1vdmVBbGwoKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaAppbmRleCBkN2YxNTA4Li45ZjFhNWRmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaApAQCAtNywyNiArNywzMiBAQAogI2lmbmRlZiBfQkNfUkVBRFNPTE9NT05HRjI1NlBPTFlfSF8NCiAjZGVmaW5lIF9CQ19SRUFEU09MT01PTkdGMjU2UE9MWV9IXw0KIGNsYXNzIENCQ19SZWVkU29sb21vbkdGMjU2Ow0KLWNsYXNzIENCQ19SZWVkU29sb21vbkdGMjU2UG9seQ0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seShDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQsIGludDMyX3QgY29lZmZpY2llbnRzKTsNCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7DQotICAgIHZpcnR1YWwgfkNCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOw0KLSAgICBpbnQzMl90IEdldENvZWZmaWNpZW50cyhpbnQzMl90IGRlZ3JlZSk7DQotICAgIENGWF9JbnQzMkFycmF5KiBHZXRDb2VmZmljaWVudHMoKTsNCi0gICAgaW50MzJfdAkJR2V0RGVncmVlKCk7DQotICAgIEZYX0JPT0wJCQlJc1plcm8oKTsNCi0gICAgaW50MzJfdAkJRXZhbHVhdGVBdChpbnQzMl90IGEpOw0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIEFkZE9yU3VidHJhY3QoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBvdGhlciwgaW50MzJfdCAmZSk7DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogTXVsdGlwbHkoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBvdGhlciwgaW50MzJfdCAmZSk7DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogTXVsdGlwbHkoaW50MzJfdCBzY2FsYXIsIGludDMyX3QgJmUpOw0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIE11bHRpcGx5QnlNb25vbWlhbChpbnQzMl90IGRlZ3JlZSwgaW50MzJfdCBjb2VmZmljaWVudCwgaW50MzJfdCAmZSk7DQotICAgIENGWF9QdHJBcnJheSogRGl2aWRlKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSAqb3RoZXIsIGludDMyX3QgJmUpOw0KLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENsb25lKGludDMyX3QgJmUpOw0KLSAgICB2aXJ0dWFsIHZvaWQgSW5pdChDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQsIENGWF9JbnQzMkFycmF5KiBjb2VmZmljaWVudHMsIGludDMyX3QgJmUpOw0KLXByaXZhdGU6DQotICAgIENCQ19SZWVkU29sb21vbkdGMjU2KiBtX2ZpZWxkOw0KLSAgICBDRlhfSW50MzJBcnJheSBtX2NvZWZmaWNpZW50czsNCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgew0KKyBwdWJsaWM6DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkLCBpbnQzMl90IGNvZWZmaWNpZW50cyk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCisgIHZpcnR1YWwgfkNCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOw0KKyAgaW50MzJfdCBHZXRDb2VmZmljaWVudHMoaW50MzJfdCBkZWdyZWUpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIEdldENvZWZmaWNpZW50cygpOw0KKyAgaW50MzJfdCBHZXREZWdyZWUoKTsNCisgIEZYX0JPT0wgSXNaZXJvKCk7DQorICBpbnQzMl90IEV2YWx1YXRlQXQoaW50MzJfdCBhKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQWRkT3JTdWJ0cmFjdChDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG90aGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBNdWx0aXBseShDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG90aGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogTXVsdGlwbHkoaW50MzJfdCBzY2FsYXIsIGludDMyX3QmIGUpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBNdWx0aXBseUJ5TW9ub21pYWwoaW50MzJfdCBkZWdyZWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZWZmaWNpZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDRlhfUHRyQXJyYXkqIERpdmlkZShDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG90aGVyLCBpbnQzMl90JiBlKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ2xvbmUoaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdChDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQsDQorICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogY29lZmZpY2llbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NiogbV9maWVsZDsNCisgIENGWF9JbnQzMkFycmF5IG1fY29lZmZpY2llbnRzOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuY3BwCmluZGV4IGRmNThmMTUuLjM5MzEyMDYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0FTQ0lJRW5jb2Rlci5jcHAKQEAgLTMsNyArMyw3IEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KIC8qDQogICogQ29weXJpZ2h0IDIwMDYtMjAwNyBKZXJlbWlhcyBNYWVya2kuDQogICoNCkBAIC0yOCw3MiArMjgsNzIgQEAKICNpbmNsdWRlICJCQ19FbmNvZGVyQ29udGV4dC5oIg0KICNpbmNsdWRlICJCQ19IaWdoTGV2ZWxFbmNvZGVyLmgiDQogI2luY2x1ZGUgIkJDX0FTQ0lJRW5jb2Rlci5oIg0KLUNCQ19BU0NJSUVuY29kZXI6OkNCQ19BU0NJSUVuY29kZXIoKQ0KLXsNCitDQkNfQVNDSUlFbmNvZGVyOjpDQkNfQVNDSUlFbmNvZGVyKCkge30NCitDQkNfQVNDSUlFbmNvZGVyOjp+Q0JDX0FTQ0lJRW5jb2RlcigpIHt9DQoraW50MzJfdCBDQkNfQVNDSUlFbmNvZGVyOjpnZXRFbmNvZGluZ01vZGUoKSB7DQorICByZXR1cm4gQVNDSUlfRU5DT0RBVElPTjsNCiB9DQotQ0JDX0FTQ0lJRW5jb2Rlcjo6fkNCQ19BU0NJSUVuY29kZXIoKQ0KLXsNCi19DQotaW50MzJfdCBDQkNfQVNDSUlFbmNvZGVyOjpnZXRFbmNvZGluZ01vZGUoKQ0KLXsNCi0gICAgcmV0dXJuIEFTQ0lJX0VOQ09EQVRJT047DQotfQ0KLXZvaWQgQ0JDX0FTQ0lJRW5jb2Rlcjo6RW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgbiA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZURpZ2l0Q291bnQoY29udGV4dC5tX21zZywgY29udGV4dC5tX3Bvcyk7DQotICAgIGlmIChuID49IDIpIHsNCi0gICAgICAgIEZYX1dDSEFSIGNvZGUgPSBlbmNvZGVBU0NJSURpZ2l0cyhjb250ZXh0Lm1fbXNnLkdldEF0KGNvbnRleHQubV9wb3MpLCBjb250ZXh0Lm1fbXNnLkdldEF0KGNvbnRleHQubV9wb3MgKyAxKSwgZSk7DQotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKGNvZGUpOw0KLSAgICAgICAgY29udGV4dC5tX3BvcyArPSAyOw0KK3ZvaWQgQ0JDX0FTQ0lJRW5jb2Rlcjo6RW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBuID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudCgNCisgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zKTsNCisgIGlmIChuID49IDIpIHsNCisgICAgRlhfV0NIQVIgY29kZSA9DQorICAgICAgICBlbmNvZGVBU0NJSURpZ2l0cyhjb250ZXh0Lm1fbXNnLkdldEF0KGNvbnRleHQubV9wb3MpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tX21zZy5HZXRBdChjb250ZXh0Lm1fcG9zICsgMSksIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChjb2RlKTsNCisgICAgY29udGV4dC5tX3BvcyArPSAyOw0KKyAgfSBlbHNlIHsNCisgICAgRlhfV0NIQVIgYyA9IGNvbnRleHQuZ2V0Q3VycmVudENoYXIoKTsNCisgICAgaW50MzJfdCBuZXdNb2RlID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Omxvb2tBaGVhZFRlc3QoDQorICAgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7DQorICAgIGlmIChuZXdNb2RlICE9IGdldEVuY29kaW5nTW9kZSgpKSB7DQorICAgICAgc3dpdGNoIChuZXdNb2RlKSB7DQorICAgICAgICBjYXNlIEJBU0UyNTZfRU5DT0RBVElPTjoNCisgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19CQVNFMjU2KTsNCisgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEJBU0UyNTZfRU5DT0RBVElPTik7DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIGNhc2UgQzQwX0VOQ09EQVRJT046DQorICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQzQwKTsNCisgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEM0MF9FTkNPREFUSU9OKTsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgY2FzZSBYMTJfRU5DT0RBVElPTjoNCisgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19BTlNJWDEyKTsNCisgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKFgxMl9FTkNPREFUSU9OKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRFWFRfRU5DT0RBVElPTjoNCisgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19URVhUKTsNCisgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKFRFWFRfRU5DT0RBVElPTik7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBFRElGQUNUX0VOQ09EQVRJT046DQorICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fRURJRkFDVCk7DQorICAgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShFRElGQUNUX0VOQ09EQVRJT04pOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZUlsbGVnYWxNb2RlOw0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0V4dGVuZGVkQVNDSUkoYykpIHsNCisgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OlVQUEVSX1NISUZUKTsNCisgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoKEZYX1dDSEFSKShjIC0gMTI4ICsgMSkpOw0KKyAgICAgIGNvbnRleHQubV9wb3MrKzsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7DQotICAgICAgICBpbnQzMl90IG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdChjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7DQotICAgICAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgew0KLSAgICAgICAgICAgIHN3aXRjaCAobmV3TW9kZSkgew0KLSAgICAgICAgICAgICAgICBjYXNlIEJBU0UyNTZfRU5DT0RBVElPTjoNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQkFTRTI1Nik7DQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQkFTRTI1Nl9FTkNPREFUSU9OKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgY2FzZSBDNDBfRU5DT0RBVElPTjoNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQzQwKTsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShDNDBfRU5DT0RBVElPTik7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIGNhc2UgWDEyX0VOQ09EQVRJT046DQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0FOU0lYMTIpOw0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKFgxMl9FTkNPREFUSU9OKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIFRFWFRfRU5DT0RBVElPTjoNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fVEVYVCk7DQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoVEVYVF9FTkNPREFUSU9OKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEVESUZBQ1RfRU5DT0RBVElPTjoNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fRURJRkFDVCk7DQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoRURJRkFDVF9FTkNPREFUSU9OKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlSWxsZWdhbE1vZGU7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNFeHRlbmRlZEFTQ0lJKGMpKSB7DQotICAgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpVUFBFUl9TSElGVCk7DQotICAgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKChGWF9XQ0hBUikgKGMgLSAxMjggKyAxKSk7DQotICAgICAgICAgICAgY29udGV4dC5tX3BvcysrOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoKEZYX1dDSEFSKSAoYyArIDEpKTsNCi0gICAgICAgICAgICBjb250ZXh0Lm1fcG9zKys7DQotICAgICAgICB9DQorICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKChGWF9XQ0hBUikoYyArIDEpKTsNCisgICAgICBjb250ZXh0Lm1fcG9zKys7DQogICAgIH0NCisgIH0NCiB9DQotRlhfV0NIQVIgQ0JDX0FTQ0lJRW5jb2Rlcjo6ZW5jb2RlQVNDSUlEaWdpdHMoRlhfV0NIQVIgZGlnaXQxLCBGWF9XQ0hBUiBkaWdpdDIsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzRGlnaXQoZGlnaXQxKSAmJiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNEaWdpdChkaWdpdDIpKSB7DQotICAgICAgICBpbnQzMl90IG51bSA9IChkaWdpdDEgLSA0OCkgKiAxMCArIChkaWdpdDIgLSA0OCk7DQotICAgICAgICBGWF9XQ0hBUiBhID0gKEZYX1dDSEFSKSAobnVtICsgMTMwKTsNCi0gICAgICAgIHJldHVybiAoRlhfV0NIQVIpIChudW0gKyAxMzApOw0KLSAgICB9DQotICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudE5vdEdpZ2l0czsNCi0gICAgcmV0dXJuIDA7DQorRlhfV0NIQVIgQ0JDX0FTQ0lJRW5jb2Rlcjo6ZW5jb2RlQVNDSUlEaWdpdHMoRlhfV0NIQVIgZGlnaXQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIGRpZ2l0MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzRGlnaXQoZGlnaXQxKSAmJg0KKyAgICAgIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0RpZ2l0KGRpZ2l0MikpIHsNCisgICAgaW50MzJfdCBudW0gPSAoZGlnaXQxIC0gNDgpICogMTAgKyAoZGlnaXQyIC0gNDgpOw0KKyAgICBGWF9XQ0hBUiBhID0gKEZYX1dDSEFSKShudW0gKyAxMzApOw0KKyAgICByZXR1cm4gKEZYX1dDSEFSKShudW0gKyAxMzApOw0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Tm90R2lnaXRzOw0KKyAgcmV0dXJuIDA7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0FTQ0lJRW5jb2Rlci5oCmluZGV4IDNjMDVhNDEuLjRhZmQzMjMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuaApAQCAtOSwxNCArOSwxNiBAQAogY2xhc3MgQ0JDX0VuY29kZXI7DQogY2xhc3MgQ0JDX0VuY29kZXJDb250ZXh0Ow0KIGNsYXNzIENCQ19BU0NJSUVuY29kZXI7DQotY2xhc3MgQ0JDX0FTQ0lJRW5jb2RlciA6IHB1YmxpYyBDQkNfRW5jb2Rlcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19BU0NJSUVuY29kZXIoKTsNCi0gICAgdmlydHVhbCB+Q0JDX0FTQ0lJRW5jb2RlcigpOw0KLSAgICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpOw0KLSAgICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIGludDMyX3QgJmUpOw0KLXByaXZhdGU6DQotICAgIHN0YXRpYyBGWF9XQ0hBUiBlbmNvZGVBU0NJSURpZ2l0cyhGWF9XQ0hBUiBkaWdpdDEsIEZYX1dDSEFSIGRpZ2l0MiwgaW50MzJfdCAmZSk7DQorY2xhc3MgQ0JDX0FTQ0lJRW5jb2RlciA6IHB1YmxpYyBDQkNfRW5jb2RlciB7DQorIHB1YmxpYzoNCisgIENCQ19BU0NJSUVuY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19BU0NJSUVuY29kZXIoKTsNCisgIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCk7DQorICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIEZYX1dDSEFSIGVuY29kZUFTQ0lJRGlnaXRzKEZYX1dDSEFSIGRpZ2l0MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBkaWdpdDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuY3BwCmluZGV4IDdhNjhmY2EuLjlkZjI4ZTEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuY3BwCkBAIC0zLDcgKzMsNyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCiAvKg0KICAqIENvcHlyaWdodCAyMDA2LTIwMDcgSmVyZW1pYXMgTWFlcmtpLg0KICAqDQpAQCAtMjgsNjggKzI4LDY1IEBACiAjaW5jbHVkZSAiQkNfRW5jb2RlckNvbnRleHQuaCINCiAjaW5jbHVkZSAiQkNfSGlnaExldmVsRW5jb2Rlci5oIg0KICNpbmNsdWRlICJCQ19CYXNlMjU2RW5jb2Rlci5oIg0KLUNCQ19CYXNlMjU2RW5jb2Rlcjo6Q0JDX0Jhc2UyNTZFbmNvZGVyKCkNCi17DQorQ0JDX0Jhc2UyNTZFbmNvZGVyOjpDQkNfQmFzZTI1NkVuY29kZXIoKSB7fQ0KK0NCQ19CYXNlMjU2RW5jb2Rlcjo6fkNCQ19CYXNlMjU2RW5jb2RlcigpIHt9DQoraW50MzJfdCBDQkNfQmFzZTI1NkVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsNCisgIHJldHVybiBCQVNFMjU2X0VOQ09EQVRJT047DQogfQ0KLUNCQ19CYXNlMjU2RW5jb2Rlcjo6fkNCQ19CYXNlMjU2RW5jb2RlcigpDQotew0KLX0NCi1pbnQzMl90IENCQ19CYXNlMjU2RW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkNCi17DQotICAgIHJldHVybiBCQVNFMjU2X0VOQ09EQVRJT047DQotfQ0KLXZvaWQgQ0JDX0Jhc2UyNTZFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgYnVmZmVyOw0KLSAgICBidWZmZXIgKz0gKEZYX1dDSEFSKSdcMCc7DQotICAgIHdoaWxlIChjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsNCi0gICAgICAgIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7DQotICAgICAgICBidWZmZXIgKz0gYzsNCi0gICAgICAgIGNvbnRleHQubV9wb3MrKzsNCi0gICAgICAgIGludDMyX3QgbmV3TW9kZSA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpsb29rQWhlYWRUZXN0KGNvbnRleHQubV9tc2csIGNvbnRleHQubV9wb3MsIGdldEVuY29kaW5nTW9kZSgpKTsNCi0gICAgICAgIGlmIChuZXdNb2RlICE9IGdldEVuY29kaW5nTW9kZSgpKSB7DQotICAgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKG5ld01vZGUpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ0JDX0Jhc2UyNTZFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSB7DQorICBDRlhfV2lkZVN0cmluZyBidWZmZXI7DQorICBidWZmZXIgKz0gKEZYX1dDSEFSKSdcMCc7DQorICB3aGlsZSAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQorICAgIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7DQorICAgIGJ1ZmZlciArPSBjOw0KKyAgICBjb250ZXh0Lm1fcG9zKys7DQorICAgIGludDMyX3QgbmV3TW9kZSA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpsb29rQWhlYWRUZXN0KA0KKyAgICAgICAgY29udGV4dC5tX21zZywgY29udGV4dC5tX3BvcywgZ2V0RW5jb2RpbmdNb2RlKCkpOw0KKyAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgew0KKyAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShuZXdNb2RlKTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpbnQzMl90IGRhdGFDb3VudCA9IGJ1ZmZlci5HZXRMZW5ndGgoKSAtIDE7DQotICAgIEZYX0NIQVIgYnVmWzEyOF07DQorICB9DQorICBpbnQzMl90IGRhdGFDb3VudCA9IGJ1ZmZlci5HZXRMZW5ndGgoKSAtIDE7DQorICBGWF9DSEFSIGJ1ZlsxMjhdOw0KICNpZiBkZWZpbmVkKF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8pDQotICAgIG1lbXNldChidWYsIDAsIHNpemVvZihGWF9DSEFSKSAqIDEyOCk7DQotICAgIF9pdG9hX3MoZGF0YUNvdW50LCBidWYsIDEyOCwgMTApOw0KKyAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKEZYX0NIQVIpICogMTI4KTsNCisgIF9pdG9hX3MoZGF0YUNvdW50LCBidWYsIDEyOCwgMTApOw0KICNlbHNlDQotICAgIEZYU1lTX2l0b2EoZGF0YUNvdW50LCBidWYsIDEwKTsNCisgIEZYU1lTX2l0b2EoZGF0YUNvdW50LCBidWYsIDEwKTsNCiAjZW5kaWYNCi0gICAgYnVmZmVyLlNldEF0KDAsIEZYX1dDSEFSKCpidWYpIC0gJzAnKTsNCi0gICAgaW50MzJfdCBsZW5ndGhGaWVsZFNpemUgPSAxOw0KLSAgICBpbnQzMl90IGN1cnJlbnRTaXplID0gY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyBkYXRhQ291bnQgKyBsZW5ndGhGaWVsZFNpemU7DQotICAgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhjdXJyZW50U2l6ZSwgZSk7DQotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9CT09MIG11c3RQYWQgPSAoY29udGV4dC5tX3N5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5IC0gY3VycmVudFNpemUpID4gMDsNCi0gICAgaWYgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSB8fCBtdXN0UGFkKSB7DQotICAgICAgICBpZiAoZGF0YUNvdW50IDw9IDI0OSkgew0KLSAgICAgICAgICAgIGJ1ZmZlci5TZXRBdCgwLCAoRlhfV0NIQVIpIGRhdGFDb3VudCk7DQotICAgICAgICB9IGVsc2UgaWYgKGRhdGFDb3VudCA+IDI0OSAmJiBkYXRhQ291bnQgPD0gMTU1NSkgew0KLSAgICAgICAgICAgIGJ1ZmZlci5TZXRBdCgwLCAoRlhfV0NIQVIpICgoZGF0YUNvdW50IC8gMjUwKSArIDI0OSkpOw0KLSAgICAgICAgICAgIGJ1ZmZlci5JbnNlcnQoMSwgKEZYX1dDSEFSKSAoZGF0YUNvdW50ICUgMjUwKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZU1lc3NhZ2VMZW5ndGhJbnZhbGlkOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBmb3IgKGludDMyX3QgaSA9IDAsIGMgPSBidWZmZXIuR2V0TGVuZ3RoKCk7IGkgPCBjOyBpKyspIHsNCi0gICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChyYW5kb21pemUyNTVTdGF0ZShidWZmZXIuR2V0QXQoaSksIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpICsgMSkpOw0KLSAgICB9DQotfQ0KLUZYX1dDSEFSIENCQ19CYXNlMjU2RW5jb2Rlcjo6cmFuZG9taXplMjU1U3RhdGUoRlhfV0NIQVIgY2gsIGludDMyX3QgY29kZXdvcmRQb3NpdGlvbikNCi17DQotICAgIGludDMyX3QgcHNldWRvUmFuZG9tID0gKCgxNDkgKiBjb2Rld29yZFBvc2l0aW9uKSAlIDI1NSkgKyAxOw0KLSAgICBpbnQzMl90IHRlbXBWYXJpYWJsZSA9IGNoICsgcHNldWRvUmFuZG9tOw0KLSAgICBpZiAodGVtcFZhcmlhYmxlIDw9IDI1NSkgew0KLSAgICAgICAgcmV0dXJuIChGWF9XQ0hBUikgdGVtcFZhcmlhYmxlOw0KKyAgYnVmZmVyLlNldEF0KDAsIEZYX1dDSEFSKCpidWYpIC0gJzAnKTsNCisgIGludDMyX3QgbGVuZ3RoRmllbGRTaXplID0gMTsNCisgIGludDMyX3QgY3VycmVudFNpemUgPQ0KKyAgICAgIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpICsgZGF0YUNvdW50ICsgbGVuZ3RoRmllbGRTaXplOw0KKyAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGN1cnJlbnRTaXplLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBtdXN0UGFkID0gKGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGN1cnJlbnRTaXplKSA+IDA7DQorICBpZiAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpIHx8IG11c3RQYWQpIHsNCisgICAgaWYgKGRhdGFDb3VudCA8PSAyNDkpIHsNCisgICAgICBidWZmZXIuU2V0QXQoMCwgKEZYX1dDSEFSKWRhdGFDb3VudCk7DQorICAgIH0gZWxzZSBpZiAoZGF0YUNvdW50ID4gMjQ5ICYmIGRhdGFDb3VudCA8PSAxNTU1KSB7DQorICAgICAgYnVmZmVyLlNldEF0KDAsIChGWF9XQ0hBUikoKGRhdGFDb3VudCAvIDI1MCkgKyAyNDkpKTsNCisgICAgICBidWZmZXIuSW5zZXJ0KDEsIChGWF9XQ0hBUikoZGF0YUNvdW50ICUgMjUwKSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gKEZYX1dDSEFSKSAodGVtcFZhcmlhYmxlIC0gMjU2KTsNCisgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVNZXNzYWdlTGVuZ3RoSW52YWxpZDsNCisgICAgICByZXR1cm47DQogICAgIH0NCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMCwgYyA9IGJ1ZmZlci5HZXRMZW5ndGgoKTsgaSA8IGM7IGkrKykgew0KKyAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoDQorICAgICAgICByYW5kb21pemUyNTVTdGF0ZShidWZmZXIuR2V0QXQoaSksIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpICsgMSkpOw0KKyAgfQ0KK30NCitGWF9XQ0hBUiBDQkNfQmFzZTI1NkVuY29kZXI6OnJhbmRvbWl6ZTI1NVN0YXRlKEZYX1dDSEFSIGNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2Rld29yZFBvc2l0aW9uKSB7DQorICBpbnQzMl90IHBzZXVkb1JhbmRvbSA9ICgoMTQ5ICogY29kZXdvcmRQb3NpdGlvbikgJSAyNTUpICsgMTsNCisgIGludDMyX3QgdGVtcFZhcmlhYmxlID0gY2ggKyBwc2V1ZG9SYW5kb207DQorICBpZiAodGVtcFZhcmlhYmxlIDw9IDI1NSkgew0KKyAgICByZXR1cm4gKEZYX1dDSEFSKXRlbXBWYXJpYWJsZTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiAoRlhfV0NIQVIpKHRlbXBWYXJpYWJsZSAtIDI1Nik7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuaAppbmRleCA2MWU2YzgwLi43MzQyNDJhIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19CYXNlMjU2RW5jb2Rlci5oCkBAIC04LDE0ICs4LDE0IEBACiAjZGVmaW5lIF9CQ19CQVNFMjU2RU5DT0RFUl9IXw0KIGNsYXNzIENCQ19FbmNvZGVyOw0KIGNsYXNzIENCQ19CYXNlMjU2RW5jb2RlcjsNCi1jbGFzcyBDQkNfQmFzZTI1NkVuY29kZXIgOiBwdWJsaWMgQ0JDX0VuY29kZXINCi17DQotcHVibGljOg0KLSAgICBDQkNfQmFzZTI1NkVuY29kZXIoKTsNCi0gICAgdmlydHVhbCB+Q0JDX0Jhc2UyNTZFbmNvZGVyKCk7DQotICAgIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCk7DQotICAgIHZvaWQgRW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgaW50MzJfdCAmZSk7DQotcHJpdmF0ZToNCi0gICAgc3RhdGljIEZYX1dDSEFSIHJhbmRvbWl6ZTI1NVN0YXRlKEZYX1dDSEFSIGNoLCBpbnQzMl90IGNvZGV3b3JkUG9zaXRpb24pOw0KK2NsYXNzIENCQ19CYXNlMjU2RW5jb2RlciA6IHB1YmxpYyBDQkNfRW5jb2RlciB7DQorIHB1YmxpYzoNCisgIENCQ19CYXNlMjU2RW5jb2RlcigpOw0KKyAgdmlydHVhbCB+Q0JDX0Jhc2UyNTZFbmNvZGVyKCk7DQorICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpOw0KKyAgdm9pZCBFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBGWF9XQ0hBUiByYW5kb21pemUyNTVTdGF0ZShGWF9XQ0hBUiBjaCwgaW50MzJfdCBjb2Rld29yZFBvc2l0aW9uKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuY3BwCmluZGV4IDBhZmQwMTguLjdlNThkOGUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmNwcApAQCAtMjksMTcwICsyOSwxNzAgQEAKICNpbmNsdWRlICJCQ19FbmNvZGVyQ29udGV4dC5oIg0KICNpbmNsdWRlICJCQ19IaWdoTGV2ZWxFbmNvZGVyLmgiDQogI2luY2x1ZGUgIkJDX0M0MEVuY29kZXIuaCINCi1DQkNfQzQwRW5jb2Rlcjo6Q0JDX0M0MEVuY29kZXIoKQ0KLXsNCitDQkNfQzQwRW5jb2Rlcjo6Q0JDX0M0MEVuY29kZXIoKSB7fQ0KK0NCQ19DNDBFbmNvZGVyOjp+Q0JDX0M0MEVuY29kZXIoKSB7fQ0KK2ludDMyX3QgQ0JDX0M0MEVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsNCisgIHJldHVybiBDNDBfRU5DT0RBVElPTjsNCiB9DQotQ0JDX0M0MEVuY29kZXI6On5DQkNfQzQwRW5jb2RlcigpDQotew0KLX0NCi1pbnQzMl90IENCQ19DNDBFbmNvZGVyOjpnZXRFbmNvZGluZ01vZGUoKQ0KLXsNCi0gICAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOw0KLX0NCi12b2lkIENCQ19DNDBFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgYnVmZmVyOw0KLSAgICB3aGlsZSAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQotICAgICAgICBGWF9XQ0hBUiBjID0gY29udGV4dC5nZXRDdXJyZW50Q2hhcigpOw0KLSAgICAgICAgY29udGV4dC5tX3BvcysrOw0KLSAgICAgICAgaW50MzJfdCBsYXN0Q2hhclNpemUgPSBlbmNvZGVDaGFyKGMsIGJ1ZmZlciwgZSk7DQotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCB1bndyaXR0ZW4gPSAoYnVmZmVyLkdldExlbmd0aCgpIC8gMykgKiAyOw0KLSAgICAgICAgaW50MzJfdCBjdXJDb2Rld29yZENvdW50ID0gY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyB1bndyaXR0ZW47DQotICAgICAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oY3VyQ29kZXdvcmRDb3VudCwgZSk7DQotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBhdmFpbGFibGUgPSBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjdXJDb2Rld29yZENvdW50Ow0KLSAgICAgICAgaWYgKCFjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyByZW1vdmVkOw0KLSAgICAgICAgICAgIGlmICgoYnVmZmVyLkdldExlbmd0aCgpICUgMykgPT0gMikgew0KLSAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlIDwgMiB8fCBhdmFpbGFibGUgPiAyKSB7DQotICAgICAgICAgICAgICAgICAgICBsYXN0Q2hhclNpemUgPSBiYWNrdHJhY2tPbmVDaGFyYWN0ZXIoY29udGV4dCwgYnVmZmVyLCByZW1vdmVkLCBsYXN0Q2hhclNpemUsIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3aGlsZSAoKGJ1ZmZlci5HZXRMZW5ndGgoKSAlIDMpID09IDENCi0gICAgICAgICAgICAgICAgICAgICYmICgobGFzdENoYXJTaXplIDw9IDMgJiYgYXZhaWxhYmxlICE9IDEpIHx8IGxhc3RDaGFyU2l6ZSA+IDMpKSB7DQotICAgICAgICAgICAgICAgIGxhc3RDaGFyU2l6ZSA9IGJhY2t0cmFja09uZUNoYXJhY3Rlcihjb250ZXh0LCBidWZmZXIsIHJlbW92ZWQsIGxhc3RDaGFyU2l6ZSwgZSk7DQotICAgICAgICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7DQotICAgICAgICBpZiAoKGNvdW50ICUgMykgPT0gMCkgew0KLSAgICAgICAgICAgIGludDMyX3QgbmV3TW9kZSA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpsb29rQWhlYWRUZXN0KGNvbnRleHQubV9tc2csIGNvbnRleHQubV9wb3MsIGdldEVuY29kaW5nTW9kZSgpKTsNCi0gICAgICAgICAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgew0KLSAgICAgICAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UobmV3TW9kZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCit2b2lkIENCQ19DNDBFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSB7DQorICBDRlhfV2lkZVN0cmluZyBidWZmZXI7DQorICB3aGlsZSAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQorICAgIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7DQorICAgIGNvbnRleHQubV9wb3MrKzsNCisgICAgaW50MzJfdCBsYXN0Q2hhclNpemUgPSBlbmNvZGVDaGFyKGMsIGJ1ZmZlciwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICByZXR1cm47DQogICAgIH0NCi0gICAgaGFuZGxlRU9EKGNvbnRleHQsIGJ1ZmZlciwgZSk7DQotfQ0KLXZvaWQgQ0JDX0M0MEVuY29kZXI6OndyaXRlTmV4dFRyaXBsZXQoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBDRlhfV2lkZVN0cmluZyAmYnVmZmVyKQ0KLXsNCi0gICAgY29udGV4dC53cml0ZUNvZGV3b3JkcyhlbmNvZGVUb0NvZGV3b3JkcyhidWZmZXIsIDApKTsNCi0gICAgYnVmZmVyLkRlbGV0ZSgwLCAzKTsNCi19DQotdm9pZCBDQkNfQzQwRW5jb2Rlcjo6aGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgQ0ZYX1dpZGVTdHJpbmcgJmJ1ZmZlciwgaW50MzJfdCAmZSkNCi17DQogICAgIGludDMyX3QgdW53cml0dGVuID0gKGJ1ZmZlci5HZXRMZW5ndGgoKSAvIDMpICogMjsNCi0gICAgaW50MzJfdCByZXN0ID0gYnVmZmVyLkdldExlbmd0aCgpICUgMzsNCiAgICAgaW50MzJfdCBjdXJDb2Rld29yZENvdW50ID0gY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyB1bndyaXR0ZW47DQogICAgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhjdXJDb2Rld29yZENvdW50LCBlKTsNCiAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KICAgICBpbnQzMl90IGF2YWlsYWJsZSA9IGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGN1ckNvZGV3b3JkQ291bnQ7DQotICAgIGlmIChyZXN0ID09IDIpIHsNCi0gICAgICAgIGJ1ZmZlciArPSAoRlhfV0NIQVIpJ1wwJzsNCi0gICAgICAgIHdoaWxlIChidWZmZXIuR2V0TGVuZ3RoKCkgPj0gMykgew0KLSAgICAgICAgICAgIHdyaXRlTmV4dFRyaXBsZXQoY29udGV4dCwgYnVmZmVyKTsNCisgICAgaWYgKCFjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyByZW1vdmVkOw0KKyAgICAgIGlmICgoYnVmZmVyLkdldExlbmd0aCgpICUgMykgPT0gMikgew0KKyAgICAgICAgaWYgKGF2YWlsYWJsZSA8IDIgfHwgYXZhaWxhYmxlID4gMikgew0KKyAgICAgICAgICBsYXN0Q2hhclNpemUgPQ0KKyAgICAgICAgICAgICAgYmFja3RyYWNrT25lQ2hhcmFjdGVyKGNvbnRleHQsIGJ1ZmZlciwgcmVtb3ZlZCwgbGFzdENoYXJTaXplLCBlKTsNCisgICAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgaWYgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6QzQwX1VOTEFUQ0gpOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAoKGJ1ZmZlci5HZXRMZW5ndGgoKSAlIDMpID09IDEgJiYNCisgICAgICAgICAgICAgKChsYXN0Q2hhclNpemUgPD0gMyAmJiBhdmFpbGFibGUgIT0gMSkgfHwgbGFzdENoYXJTaXplID4gMykpIHsNCisgICAgICAgIGxhc3RDaGFyU2l6ZSA9DQorICAgICAgICAgICAgYmFja3RyYWNrT25lQ2hhcmFjdGVyKGNvbnRleHQsIGJ1ZmZlciwgcmVtb3ZlZCwgbGFzdENoYXJTaXplLCBlKTsNCisgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZSA9PSAxICYmIHJlc3QgPT0gMSkgew0KLSAgICAgICAgd2hpbGUgKGJ1ZmZlci5HZXRMZW5ndGgoKSA+PSAzKSB7DQotICAgICAgICAgICAgd3JpdGVOZXh0VHJpcGxldChjb250ZXh0LCBidWZmZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6QzQwX1VOTEFUQ0gpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY29udGV4dC5tX3Bvcy0tOw0KLSAgICB9IGVsc2UgaWYgKHJlc3QgPT0gMCkgew0KLSAgICAgICAgd2hpbGUgKGJ1ZmZlci5HZXRMZW5ndGgoKSA+PSAzKSB7DQotICAgICAgICAgICAgd3JpdGVOZXh0VHJpcGxldChjb250ZXh0LCBidWZmZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGF2YWlsYWJsZSA+IDAgfHwgY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQotICAgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpDNDBfVU5MQVRDSCk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVVbmV4cGVjdGVkQ2FzZTsNCi0gICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEFTQ0lJX0VOQ09EQVRJT04pOw0KLX0NCi1pbnQzMl90IENCQ19DNDBFbmNvZGVyOjplbmNvZGVDaGFyKEZYX1dDSEFSIGMsIENGWF9XaWRlU3RyaW5nICZzYiwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChjID09ICcgJykgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSdcMyc7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfSBlbHNlIGlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDQ4ICsgNCk7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfSBlbHNlIGlmICgoYyA+PSAnQScpICYmIChjIDw9ICdaJykpIHsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDY1ICsgMTQpOw0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0gZWxzZSBpZiAoKGMgPj0gJ1wwJykgJiYgKGMgPD0gMHgxZikpIHsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDAnOw0KLSAgICAgICAgc2IgKz0gYzsNCi0gICAgICAgIHJldHVybiAyOw0KLSAgICB9IGVsc2UgaWYgKChjID49ICchJykgJiYgKGMgPD0gJy8nKSkgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSAzMyk7DQotICAgICAgICByZXR1cm4gMjsNCi0gICAgfSBlbHNlIGlmICgoYyA+PSAnOicpICYmIChjIDw9ICdAJykpIHsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNTggKyAxNSk7DQotICAgICAgICByZXR1cm4gMjsNCi0gICAgfSBlbHNlIGlmICgoYyA+PSAnWycpICYmIChjIDw9ICdfJykpIHsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gOTEgKyAyMik7DQotICAgICAgICByZXR1cm4gMjsNCi0gICAgfSBlbHNlIGlmICgoYyA+PSA2MCkgJiYgKGMgPD0gMHg3ZikpIHsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDInOw0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gOTYpOw0KLSAgICAgICAgcmV0dXJuIDI7DQotICAgIH0gZWxzZSBpZiAoYyA+PSA4MCkgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpMHgwMDFlOw0KLSAgICAgICAgaW50MzJfdCBsZW4gPSAyOw0KLSAgICAgICAgbGVuICs9IGVuY29kZUNoYXIoKGMgLSAxMjgpLCBzYiwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIDApOw0KLSAgICAgICAgcmV0dXJuIGxlbjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotfQ0KLWludDMyX3QgQ0JDX0M0MEVuY29kZXI6OmJhY2t0cmFja09uZUNoYXJhY3RlcihDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIENGWF9XaWRlU3RyaW5nICZidWZmZXIsIENGWF9XaWRlU3RyaW5nICZyZW1vdmVkLCBpbnQzMl90IGxhc3RDaGFyU2l6ZSwgaW50MzJfdCAmZSkNCi17DQogICAgIGludDMyX3QgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7DQotICAgIGJ1ZmZlci5EZWxldGUoY291bnQgLSBsYXN0Q2hhclNpemUsIGNvdW50KTsNCi0gICAgY29udGV4dC5tX3Bvcy0tOw0KLSAgICBGWF9XQ0hBUiBjID0gY29udGV4dC5nZXRDdXJyZW50Q2hhcigpOw0KLSAgICBsYXN0Q2hhclNpemUgPSBlbmNvZGVDaGFyKGMsIHJlbW92ZWQsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIC0xKTsNCi0gICAgY29udGV4dC5yZXNldFN5bWJvbEluZm8oKTsNCi0gICAgcmV0dXJuIGxhc3RDaGFyU2l6ZTsNCisgICAgaWYgKChjb3VudCAlIDMpID09IDApIHsNCisgICAgICBpbnQzMl90IG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdCgNCisgICAgICAgICAgY29udGV4dC5tX21zZywgY29udGV4dC5tX3BvcywgZ2V0RW5jb2RpbmdNb2RlKCkpOw0KKyAgICAgIGlmIChuZXdNb2RlICE9IGdldEVuY29kaW5nTW9kZSgpKSB7DQorICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UobmV3TW9kZSk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGhhbmRsZUVPRChjb250ZXh0LCBidWZmZXIsIGUpOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDQkNfQzQwRW5jb2Rlcjo6ZW5jb2RlVG9Db2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgc2IsIGludDMyX3Qgc3RhcnRQb3MpDQotew0KLSAgICBGWF9XQ0hBUiBjMSA9IHNiLkdldEF0KHN0YXJ0UG9zKTsNCi0gICAgRlhfV0NIQVIgYzIgPSBzYi5HZXRBdChzdGFydFBvcyArIDEpOw0KLSAgICBGWF9XQ0hBUiBjMyA9IHNiLkdldEF0KHN0YXJ0UG9zICsgMik7DQotICAgIGludDMyX3QgdiA9ICgxNjAwICogYzEpICsgKDQwICogYzIpICsgYzMgKyAxOw0KLSAgICBGWF9XQ0hBUiBjdzEgPSAoRlhfV0NIQVIpICh2IC8gMjU2KTsNCi0gICAgRlhfV0NIQVIgY3cyID0gKEZYX1dDSEFSKSAodiAlIDI1Nik7DQotICAgIENGWF9XaWRlU3RyaW5nIGIxKGN3MSk7DQotICAgIENGWF9XaWRlU3RyaW5nIGIyKGN3Mik7DQotICAgIHJldHVybiBiMSArIGIyOw0KK3ZvaWQgQ0JDX0M0MEVuY29kZXI6OndyaXRlTmV4dFRyaXBsZXQoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGJ1ZmZlcikgew0KKyAgY29udGV4dC53cml0ZUNvZGV3b3JkcyhlbmNvZGVUb0NvZGV3b3JkcyhidWZmZXIsIDApKTsNCisgIGJ1ZmZlci5EZWxldGUoMCwgMyk7DQorfQ0KK3ZvaWQgQ0JDX0M0MEVuY29kZXI6OmhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgdW53cml0dGVuID0gKGJ1ZmZlci5HZXRMZW5ndGgoKSAvIDMpICogMjsNCisgIGludDMyX3QgcmVzdCA9IGJ1ZmZlci5HZXRMZW5ndGgoKSAlIDM7DQorICBpbnQzMl90IGN1ckNvZGV3b3JkQ291bnQgPSBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKSArIHVud3JpdHRlbjsNCisgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhjdXJDb2Rld29yZENvdW50LCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBhdmFpbGFibGUgPSBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjdXJDb2Rld29yZENvdW50Ow0KKyAgaWYgKHJlc3QgPT0gMikgew0KKyAgICBidWZmZXIgKz0gKEZYX1dDSEFSKSdcMCc7DQorICAgIHdoaWxlIChidWZmZXIuR2V0TGVuZ3RoKCkgPj0gMykgew0KKyAgICAgIHdyaXRlTmV4dFRyaXBsZXQoY29udGV4dCwgYnVmZmVyKTsNCisgICAgfQ0KKyAgICBpZiAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQorICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpDNDBfVU5MQVRDSCk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoYXZhaWxhYmxlID09IDEgJiYgcmVzdCA9PSAxKSB7DQorICAgIHdoaWxlIChidWZmZXIuR2V0TGVuZ3RoKCkgPj0gMykgew0KKyAgICAgIHdyaXRlTmV4dFRyaXBsZXQoY29udGV4dCwgYnVmZmVyKTsNCisgICAgfQ0KKyAgICBpZiAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQorICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpDNDBfVU5MQVRDSCk7DQorICAgIH0NCisgICAgY29udGV4dC5tX3Bvcy0tOw0KKyAgfSBlbHNlIGlmIChyZXN0ID09IDApIHsNCisgICAgd2hpbGUgKGJ1ZmZlci5HZXRMZW5ndGgoKSA+PSAzKSB7DQorICAgICAgd3JpdGVOZXh0VHJpcGxldChjb250ZXh0LCBidWZmZXIpOw0KKyAgICB9DQorICAgIGlmIChhdmFpbGFibGUgPiAwIHx8IGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KKyAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6QzQwX1VOTEFUQ0gpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVVbmV4cGVjdGVkQ2FzZTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEFTQ0lJX0VOQ09EQVRJT04pOw0KK30NCitpbnQzMl90IENCQ19DNDBFbmNvZGVyOjplbmNvZGVDaGFyKEZYX1dDSEFSIGMsIENGWF9XaWRlU3RyaW5nJiBzYiwgaW50MzJfdCYgZSkgew0KKyAgaWYgKGMgPT0gJyAnKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUiknXDMnOw0KKyAgICByZXR1cm4gMTsNCisgIH0gZWxzZSBpZiAoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDQ4ICsgNCk7DQorICAgIHJldHVybiAxOw0KKyAgfSBlbHNlIGlmICgoYyA+PSAnQScpICYmIChjIDw9ICdaJykpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNjUgKyAxNCk7DQorICAgIHJldHVybiAxOw0KKyAgfSBlbHNlIGlmICgoYyA+PSAnXDAnKSAmJiAoYyA8PSAweDFmKSkgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wwJzsNCisgICAgc2IgKz0gYzsNCisgICAgcmV0dXJuIDI7DQorICB9IGVsc2UgaWYgKChjID49ICchJykgJiYgKGMgPD0gJy8nKSkgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wxJzsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gMzMpOw0KKyAgICByZXR1cm4gMjsNCisgIH0gZWxzZSBpZiAoKGMgPj0gJzonKSAmJiAoYyA8PSAnQCcpKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KKyAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA1OCArIDE1KTsNCisgICAgcmV0dXJuIDI7DQorICB9IGVsc2UgaWYgKChjID49ICdbJykgJiYgKGMgPD0gJ18nKSkgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wxJzsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gOTEgKyAyMik7DQorICAgIHJldHVybiAyOw0KKyAgfSBlbHNlIGlmICgoYyA+PSA2MCkgJiYgKGMgPD0gMHg3ZikpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMic7DQorICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDk2KTsNCisgICAgcmV0dXJuIDI7DQorICB9IGVsc2UgaWYgKGMgPj0gODApIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQorICAgIHNiICs9IChGWF9XQ0hBUikweDAwMWU7DQorICAgIGludDMyX3QgbGVuID0gMjsNCisgICAgbGVuICs9IGVuY29kZUNoYXIoKGMgLSAxMjgpLCBzYiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgcmV0dXJuIGxlbjsNCisgIH0gZWxzZSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuIDA7DQorICB9DQorfQ0KK2ludDMyX3QgQ0JDX0M0MEVuY29kZXI6OmJhY2t0cmFja09uZUNoYXJhY3RlcihDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiByZW1vdmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxhc3RDaGFyU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBjb3VudCA9IGJ1ZmZlci5HZXRMZW5ndGgoKTsNCisgIGJ1ZmZlci5EZWxldGUoY291bnQgLSBsYXN0Q2hhclNpemUsIGNvdW50KTsNCisgIGNvbnRleHQubV9wb3MtLTsNCisgIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7DQorICBsYXN0Q2hhclNpemUgPSBlbmNvZGVDaGFyKGMsIHJlbW92ZWQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCisgIGNvbnRleHQucmVzZXRTeW1ib2xJbmZvKCk7DQorICByZXR1cm4gbGFzdENoYXJTaXplOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfQzQwRW5jb2Rlcjo6ZW5jb2RlVG9Db2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgc2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRQb3MpIHsNCisgIEZYX1dDSEFSIGMxID0gc2IuR2V0QXQoc3RhcnRQb3MpOw0KKyAgRlhfV0NIQVIgYzIgPSBzYi5HZXRBdChzdGFydFBvcyArIDEpOw0KKyAgRlhfV0NIQVIgYzMgPSBzYi5HZXRBdChzdGFydFBvcyArIDIpOw0KKyAgaW50MzJfdCB2ID0gKDE2MDAgKiBjMSkgKyAoNDAgKiBjMikgKyBjMyArIDE7DQorICBGWF9XQ0hBUiBjdzEgPSAoRlhfV0NIQVIpKHYgLyAyNTYpOw0KKyAgRlhfV0NIQVIgY3cyID0gKEZYX1dDSEFSKSh2ICUgMjU2KTsNCisgIENGWF9XaWRlU3RyaW5nIGIxKGN3MSk7DQorICBDRlhfV2lkZVN0cmluZyBiMihjdzIpOw0KKyAgcmV0dXJuIGIxICsgYjI7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmgKaW5kZXggMmFiN2Y0ZS4uZGE5ODA5NiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmgKQEAgLTcsMTggKzcsMjUgQEAKICNpZm5kZWYgX0JDX0M0MEVOQ09ERVJfSF8NCiAjZGVmaW5lIF9CQ19DNDBFTkNPREVSX0hfDQogY2xhc3MgQ0JDX0M0MEVuY29kZXI7DQotY2xhc3MgQ0JDX0M0MEVuY29kZXIgOiBwdWJsaWMgQ0JDX0VuY29kZXINCi17DQotcHVibGljOg0KLSAgICBDQkNfQzQwRW5jb2RlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfQzQwRW5jb2RlcigpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCk7DQotICAgIHZpcnR1YWwgdm9pZCBFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgd3JpdGVOZXh0VHJpcGxldChDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIENGWF9XaWRlU3RyaW5nICZidWZmZXIpOw0KLSAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgQ0ZYX1dpZGVTdHJpbmcgJmJ1ZmZlciwgaW50MzJfdCAmZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdCBlbmNvZGVDaGFyKEZYX1dDSEFSIGMsIENGWF9XaWRlU3RyaW5nICZzYiwgaW50MzJfdCAmZSk7DQotcHJpdmF0ZToNCi0gICAgaW50MzJfdCBiYWNrdHJhY2tPbmVDaGFyYWN0ZXIoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBDRlhfV2lkZVN0cmluZyAmYnVmZmVyLCBDRlhfV2lkZVN0cmluZyAmcmVtb3ZlZCwgaW50MzJfdCBsYXN0Q2hhclNpemUsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlVG9Db2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgc2IsIGludDMyX3Qgc3RhcnRQb3MpOw0KK2NsYXNzIENCQ19DNDBFbmNvZGVyIDogcHVibGljIENCQ19FbmNvZGVyIHsNCisgcHVibGljOg0KKyAgQ0JDX0M0MEVuY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19DNDBFbmNvZGVyKCk7DQorICB2aXJ0dWFsIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCk7DQorICB2aXJ0dWFsIHZvaWQgRW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCB3cml0ZU5leHRUcmlwbGV0KENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGJ1ZmZlcik7DQorICB2aXJ0dWFsIHZvaWQgaGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIGludDMyX3QgZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyYgc2IsIGludDMyX3QmIGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBiYWNrdHJhY2tPbmVDaGFyYWN0ZXIoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiByZW1vdmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsYXN0Q2hhclNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBlbmNvZGVUb0NvZGV3b3JkcyhDRlhfV2lkZVN0cmluZyBzYiwgaW50MzJfdCBzdGFydFBvcyk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmNwcAppbmRleCA0ZmI4MmYxLi4xNjI3NWEwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlci5jcHAKQEAgLTI0LDM0MyArMjQsMzU3IEBACiAjaW5jbHVkZSAiLi4vY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KICNpbmNsdWRlICJCQ19EYXRhTWF0cml4VmVyc2lvbi5oIg0KICNpbmNsdWRlICJCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmgiDQotQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OkNCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyKCkNCi17DQotICAgIG1fbWFwcGluZ0JpdE1hdHJpeCA9IE5VTEw7DQotICAgIG1fdmVyc2lvbiA9IE5VTEw7DQotICAgIG1fcmVhZE1hcHBpbmdNYXRyaXggPSBOVUxMOw0KK0NCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcigpIHsNCisgIG1fbWFwcGluZ0JpdE1hdHJpeCA9IE5VTEw7DQorICBtX3ZlcnNpb24gPSBOVUxMOw0KKyAgbV9yZWFkTWFwcGluZ01hdHJpeCA9IE5VTEw7DQogfQ0KLXZvaWQgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OkluaXQoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqYml0TWF0cml4LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBkaW1lbnNpb24gPSBiaXRNYXRyaXgtPkdldEhlaWdodCgpOw0KLSAgICBpZiAoZGltZW5zaW9uIDwgOCB8fCBkaW1lbnNpb24gPiAxNDQgfHwgKGRpbWVuc2lvbiAmIDB4MDEpICE9IDApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBtX3ZlcnNpb24gPSBSZWFkVmVyc2lvbihiaXRNYXRyaXgsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgbV9tYXBwaW5nQml0TWF0cml4ID0gRXh0cmFjdERhdGFSZWdpb24oYml0TWF0cml4LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIG1fcmVhZE1hcHBpbmdNYXRyaXggPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdE1hdHJpeCgpOw0KLSAgICBtX3JlYWRNYXBwaW5nTWF0cml4LT5Jbml0KG1fbWFwcGluZ0JpdE1hdHJpeC0+R2V0V2lkdGgoKSwgbV9tYXBwaW5nQml0TWF0cml4LT5HZXRIZWlnaHQoKSk7DQordm9pZCBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6SW5pdChDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGRpbWVuc2lvbiA9IGJpdE1hdHJpeC0+R2V0SGVpZ2h0KCk7DQorICBpZiAoZGltZW5zaW9uIDwgOCB8fCBkaW1lbnNpb24gPiAxNDQgfHwgKGRpbWVuc2lvbiAmIDB4MDEpICE9IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICByZXR1cm47DQorICB9DQorICBtX3ZlcnNpb24gPSBSZWFkVmVyc2lvbihiaXRNYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBtX21hcHBpbmdCaXRNYXRyaXggPSBFeHRyYWN0RGF0YVJlZ2lvbihiaXRNYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBtX3JlYWRNYXBwaW5nTWF0cml4ID0gRlhfTkVXIENCQ19Db21tb25CaXRNYXRyaXgoKTsNCisgIG1fcmVhZE1hcHBpbmdNYXRyaXgtPkluaXQobV9tYXBwaW5nQml0TWF0cml4LT5HZXRXaWR0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX21hcHBpbmdCaXRNYXRyaXgtPkdldEhlaWdodCgpKTsNCiB9DQotQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6On5DQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcigpDQotew0KLSAgICBpZihtX21hcHBpbmdCaXRNYXRyaXggIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIG1fbWFwcGluZ0JpdE1hdHJpeDsNCi0gICAgfQ0KLSAgICBtX21hcHBpbmdCaXRNYXRyaXggPSBOVUxMOw0KLSAgICBpZihtX3JlYWRNYXBwaW5nTWF0cml4ICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3JlYWRNYXBwaW5nTWF0cml4Ow0KLSAgICB9DQotICAgIG1fcmVhZE1hcHBpbmdNYXRyaXggPSBOVUxMOw0KK0NCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjp+Q0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIoKSB7DQorICBpZiAobV9tYXBwaW5nQml0TWF0cml4ICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fbWFwcGluZ0JpdE1hdHJpeDsNCisgIH0NCisgIG1fbWFwcGluZ0JpdE1hdHJpeCA9IE5VTEw7DQorICBpZiAobV9yZWFkTWFwcGluZ01hdHJpeCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX3JlYWRNYXBwaW5nTWF0cml4Ow0KKyAgfQ0KKyAgbV9yZWFkTWFwcGluZ01hdHJpeCA9IE5VTEw7DQogfQ0KLUNCQ19EYXRhTWF0cml4VmVyc2lvbiAqQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OkdldFZlcnNpb24oKQ0KLXsNCi0gICAgcmV0dXJuIG1fdmVyc2lvbjsNCitDQkNfRGF0YU1hdHJpeFZlcnNpb24qIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpHZXRWZXJzaW9uKCkgew0KKyAgcmV0dXJuIG1fdmVyc2lvbjsNCiB9DQotQ0JDX0RhdGFNYXRyaXhWZXJzaW9uICpDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6UmVhZFZlcnNpb24oQ0JDX0NvbW1vbkJpdE1hdHJpeCAqYml0TWF0cml4LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCByb3dzID0gYml0TWF0cml4LT5HZXRIZWlnaHQoKTsNCi0gICAgaW50MzJfdCBjb2x1bW5zID0gYml0TWF0cml4LT5HZXRXaWR0aCgpOw0KLSAgICBDQkNfRGF0YU1hdHJpeFZlcnNpb24gKnRlbXAgPSBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldFZlcnNpb25Gb3JEaW1lbnNpb25zKHJvd3MsIGNvbHVtbnMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIHJldHVybiB0ZW1wOw0KK0NCQ19EYXRhTWF0cml4VmVyc2lvbiogQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OlJlYWRWZXJzaW9uKA0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRNYXRyaXgsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgcm93cyA9IGJpdE1hdHJpeC0+R2V0SGVpZ2h0KCk7DQorICBpbnQzMl90IGNvbHVtbnMgPSBiaXRNYXRyaXgtPkdldFdpZHRoKCk7DQorICBDQkNfRGF0YU1hdHJpeFZlcnNpb24qIHRlbXAgPQ0KKyAgICAgIENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0VmVyc2lvbkZvckRpbWVuc2lvbnMocm93cywgY29sdW1ucywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gdGVtcDsNCiB9DQotQ0ZYX0J5dGVBcnJheSAqQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OlJlYWRDb2Rld29yZHMoaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19BdXRvUHRyPENGWF9CeXRlQXJyYXk+IHJlc3VsdChGWF9ORVcgQ0ZYX0J5dGVBcnJheSgpKTsNCi0gICAgcmVzdWx0LT5TZXRTaXplKG1fdmVyc2lvbi0+R2V0VG90YWxDb2Rld29yZHMoKSk7DQotICAgIGludDMyX3QgcmVzdWx0T2Zmc2V0ID0gMDsNCi0gICAgaW50MzJfdCByb3cgPSA0Ow0KLSAgICBpbnQzMl90IGNvbHVtbiA9IDA7DQotICAgIGludDMyX3QgbnVtUm93cyA9IG1fbWFwcGluZ0JpdE1hdHJpeC0+R2V0SGVpZ2h0KCk7DQotICAgIGludDMyX3QgbnVtQ29sdW1ucyA9IG1fbWFwcGluZ0JpdE1hdHJpeC0+R2V0V2lkdGgoKTsNCi0gICAgRlhfQk9PTCBjb3JuZXIxUmVhZCA9IEZBTFNFOw0KLSAgICBGWF9CT09MIGNvcm5lcjJSZWFkID0gRkFMU0U7DQotICAgIEZYX0JPT0wgY29ybmVyM1JlYWQgPSBGQUxTRTsNCi0gICAgRlhfQk9PTCBjb3JuZXI0UmVhZCA9IEZBTFNFOw0KLSAgICBkbyB7DQotICAgICAgICBpZiAoKHJvdyA9PSBudW1Sb3dzKSAmJiAoY29sdW1uID09IDApICYmICFjb3JuZXIxUmVhZCkgew0KLSAgICAgICAgICAgICgqcmVzdWx0KVtyZXN1bHRPZmZzZXQrK10gPSAodWludDhfdCkgUmVhZENvcm5lcjEobnVtUm93cywgbnVtQ29sdW1ucyk7DQotICAgICAgICAgICAgcm93IC09IDI7DQotICAgICAgICAgICAgY29sdW1uICs9IDI7DQotICAgICAgICAgICAgY29ybmVyMVJlYWQgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIGlmICgocm93ID09IG51bVJvd3MgLSAyKSAmJiAoY29sdW1uID09IDApICYmICgobnVtQ29sdW1ucyAmIDB4MDMpICE9IDApICYmICFjb3JuZXIyUmVhZCkgew0KLSAgICAgICAgICAgICgqcmVzdWx0KVtyZXN1bHRPZmZzZXQrK10gPSAodWludDhfdCkgUmVhZENvcm5lcjIobnVtUm93cywgbnVtQ29sdW1ucyk7DQotICAgICAgICAgICAgcm93IC09IDI7DQotICAgICAgICAgICAgY29sdW1uICs9IDI7DQotICAgICAgICAgICAgY29ybmVyMlJlYWQgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIGlmICgocm93ID09IG51bVJvd3MgKyA0KSAmJiAoY29sdW1uID09IDIpICYmICgobnVtQ29sdW1ucyAmIDB4MDcpID09IDApICYmICFjb3JuZXIzUmVhZCkgew0KLSAgICAgICAgICAgICgqcmVzdWx0KVtyZXN1bHRPZmZzZXQrK10gPSAodWludDhfdCkgUmVhZENvcm5lcjMobnVtUm93cywgbnVtQ29sdW1ucyk7DQotICAgICAgICAgICAgcm93IC09IDI7DQotICAgICAgICAgICAgY29sdW1uICs9IDI7DQotICAgICAgICAgICAgY29ybmVyM1JlYWQgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIGlmICgocm93ID09IG51bVJvd3MgLSAyKSAmJiAoY29sdW1uID09IDApICYmICgobnVtQ29sdW1ucyAmIDB4MDcpID09IDQpICYmICFjb3JuZXI0UmVhZCkgew0KLSAgICAgICAgICAgICgqcmVzdWx0KVtyZXN1bHRPZmZzZXQrK10gPSAodWludDhfdCkgUmVhZENvcm5lcjQobnVtUm93cywgbnVtQ29sdW1ucyk7DQotICAgICAgICAgICAgcm93IC09IDI7DQotICAgICAgICAgICAgY29sdW1uICs9IDI7DQotICAgICAgICAgICAgY29ybmVyNFJlYWQgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBkbyB7DQotICAgICAgICAgICAgICAgIGlmICgocm93IDwgbnVtUm93cykgJiYgKGNvbHVtbiA+PSAwKSAmJiAhbV9yZWFkTWFwcGluZ01hdHJpeC0+R2V0KGNvbHVtbiwgcm93KSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdE9mZnNldCA8ICgqcmVzdWx0KS5HZXRTaXplKCkgKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9ICh1aW50OF90KSBSZWFkVXRhaChyb3csIGNvbHVtbiwgbnVtUm93cywgbnVtQ29sdW1ucyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcm93IC09IDI7DQotICAgICAgICAgICAgICAgIGNvbHVtbiArPSAyOw0KLSAgICAgICAgICAgIH0gd2hpbGUgKChyb3cgPj0gMCkgJiYgKGNvbHVtbiA8IG51bUNvbHVtbnMpKTsNCi0gICAgICAgICAgICByb3cgKz0gMTsNCi0gICAgICAgICAgICBjb2x1bW4gKz0gMzsNCi0gICAgICAgICAgICBkbyB7DQotICAgICAgICAgICAgICAgIGlmICgocm93ID49IDApICYmIChjb2x1bW4gPCBudW1Db2x1bW5zKSAmJiAhbV9yZWFkTWFwcGluZ01hdHJpeC0+R2V0KGNvbHVtbiwgcm93KSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdE9mZnNldCA8ICgqcmVzdWx0KS5HZXRTaXplKCkgKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9ICh1aW50OF90KSBSZWFkVXRhaChyb3csIGNvbHVtbiwgbnVtUm93cywgbnVtQ29sdW1ucyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcm93ICs9IDI7DQotICAgICAgICAgICAgICAgIGNvbHVtbiAtPSAyOw0KLSAgICAgICAgICAgIH0gd2hpbGUgKChyb3cgPCBudW1Sb3dzKSAmJiAoY29sdW1uID49IDApKTsNCi0gICAgICAgICAgICByb3cgKz0gMzsNCi0gICAgICAgICAgICBjb2x1bW4gKz0gMTsNCitDRlhfQnl0ZUFycmF5KiBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6UmVhZENvZGV3b3JkcyhpbnQzMl90JiBlKSB7DQorICBDQkNfQXV0b1B0cjxDRlhfQnl0ZUFycmF5PiByZXN1bHQoRlhfTkVXIENGWF9CeXRlQXJyYXkoKSk7DQorICByZXN1bHQtPlNldFNpemUobV92ZXJzaW9uLT5HZXRUb3RhbENvZGV3b3JkcygpKTsNCisgIGludDMyX3QgcmVzdWx0T2Zmc2V0ID0gMDsNCisgIGludDMyX3Qgcm93ID0gNDsNCisgIGludDMyX3QgY29sdW1uID0gMDsNCisgIGludDMyX3QgbnVtUm93cyA9IG1fbWFwcGluZ0JpdE1hdHJpeC0+R2V0SGVpZ2h0KCk7DQorICBpbnQzMl90IG51bUNvbHVtbnMgPSBtX21hcHBpbmdCaXRNYXRyaXgtPkdldFdpZHRoKCk7DQorICBGWF9CT09MIGNvcm5lcjFSZWFkID0gRkFMU0U7DQorICBGWF9CT09MIGNvcm5lcjJSZWFkID0gRkFMU0U7DQorICBGWF9CT09MIGNvcm5lcjNSZWFkID0gRkFMU0U7DQorICBGWF9CT09MIGNvcm5lcjRSZWFkID0gRkFMU0U7DQorICBkbyB7DQorICAgIGlmICgocm93ID09IG51bVJvd3MpICYmIChjb2x1bW4gPT0gMCkgJiYgIWNvcm5lcjFSZWFkKSB7DQorICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9ICh1aW50OF90KVJlYWRDb3JuZXIxKG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgIHJvdyAtPSAyOw0KKyAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgIGNvcm5lcjFSZWFkID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICgocm93ID09IG51bVJvd3MgLSAyKSAmJiAoY29sdW1uID09IDApICYmDQorICAgICAgICAgICAgICAgKChudW1Db2x1bW5zICYgMHgwMykgIT0gMCkgJiYgIWNvcm5lcjJSZWFkKSB7DQorICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9ICh1aW50OF90KVJlYWRDb3JuZXIyKG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgIHJvdyAtPSAyOw0KKyAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgIGNvcm5lcjJSZWFkID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICgocm93ID09IG51bVJvd3MgKyA0KSAmJiAoY29sdW1uID09IDIpICYmDQorICAgICAgICAgICAgICAgKChudW1Db2x1bW5zICYgMHgwNykgPT0gMCkgJiYgIWNvcm5lcjNSZWFkKSB7DQorICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9ICh1aW50OF90KVJlYWRDb3JuZXIzKG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgIHJvdyAtPSAyOw0KKyAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgIGNvcm5lcjNSZWFkID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICgocm93ID09IG51bVJvd3MgLSAyKSAmJiAoY29sdW1uID09IDApICYmDQorICAgICAgICAgICAgICAgKChudW1Db2x1bW5zICYgMHgwNykgPT0gNCkgJiYgIWNvcm5lcjRSZWFkKSB7DQorICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9ICh1aW50OF90KVJlYWRDb3JuZXI0KG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgIHJvdyAtPSAyOw0KKyAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgIGNvcm5lcjRSZWFkID0gVFJVRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBkbyB7DQorICAgICAgICBpZiAoKHJvdyA8IG51bVJvd3MpICYmIChjb2x1bW4gPj0gMCkgJiYNCisgICAgICAgICAgICAhbV9yZWFkTWFwcGluZ01hdHJpeC0+R2V0KGNvbHVtbiwgcm93KSkgew0KKyAgICAgICAgICBpZiAocmVzdWx0T2Zmc2V0IDwgKCpyZXN1bHQpLkdldFNpemUoKSkgew0KKyAgICAgICAgICAgICgqcmVzdWx0KVtyZXN1bHRPZmZzZXQrK10gPQ0KKyAgICAgICAgICAgICAgICAodWludDhfdClSZWFkVXRhaChyb3csIGNvbHVtbiwgbnVtUm93cywgbnVtQ29sdW1ucyk7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCi0gICAgfSB3aGlsZSAoKHJvdyA8IG51bVJvd3MpIHx8IChjb2x1bW4gPCBudW1Db2x1bW5zKSk7DQotICAgIGlmIChyZXN1bHRPZmZzZXQgIT0gbV92ZXJzaW9uLT5HZXRUb3RhbENvZGV3b3JkcygpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsNCi19DQotRlhfQk9PTCBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6UmVhZE1vZHVsZShpbnQzMl90IHJvdywgaW50MzJfdCBjb2x1bW4sIGludDMyX3QgbnVtUm93cywgaW50MzJfdCBudW1Db2x1bW5zKQ0KLXsNCi0gICAgaWYgKHJvdyA8IDApIHsNCi0gICAgICAgIHJvdyArPSBudW1Sb3dzOw0KLSAgICAgICAgY29sdW1uICs9IDQgLSAoKG51bVJvd3MgKyA0KSAmIDB4MDcpOw0KLSAgICB9DQotICAgIGlmIChjb2x1bW4gPCAwKSB7DQotICAgICAgICBjb2x1bW4gKz0gbnVtQ29sdW1uczsNCi0gICAgICAgIHJvdyArPSA0IC0gKChudW1Db2x1bW5zICsgNCkgJiAweDA3KTsNCi0gICAgfQ0KLSAgICBtX3JlYWRNYXBwaW5nTWF0cml4LT5TZXQoY29sdW1uLCByb3cpOw0KLSAgICByZXR1cm4gbV9tYXBwaW5nQml0TWF0cml4LT5HZXQoY29sdW1uLCByb3cpOw0KLX0NCi1pbnQzMl90IENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkVXRhaChpbnQzMl90IHJvdywgaW50MzJfdCBjb2x1bW4sIGludDMyX3QgbnVtUm93cywgaW50MzJfdCBudW1Db2x1bW5zKQ0KLXsNCi0gICAgaW50MzJfdCBjdXJyZW50Qnl0ZSA9IDA7DQotICAgIGlmIChSZWFkTW9kdWxlKHJvdyAtIDIsIGNvbHVtbiAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZShyb3cgLSAyLCBjb2x1bW4gLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KLSAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCi0gICAgfQ0KLSAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCi0gICAgaWYgKFJlYWRNb2R1bGUocm93IC0gMSwgY29sdW1uIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgY3VycmVudEJ5dGUgPDw9IDE7DQotICAgIGlmIChSZWFkTW9kdWxlKHJvdyAtIDEsIGNvbHVtbiAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZShyb3cgLSAxLCBjb2x1bW4sIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZShyb3csIGNvbHVtbiAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZShyb3csIGNvbHVtbiAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZShyb3csIGNvbHVtbiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgcmV0dXJuIGN1cnJlbnRCeXRlOw0KLX0NCi1pbnQzMl90IENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkQ29ybmVyMShpbnQzMl90IG51bVJvd3MsIGludDMyX3QgbnVtQ29sdW1ucykNCi17DQotICAgIGludDMyX3QgY3VycmVudEJ5dGUgPSAwOw0KLSAgICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMSwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgY3VycmVudEJ5dGUgPDw9IDE7DQotICAgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAxLCAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KLSAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCi0gICAgfQ0KLSAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCi0gICAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDEsIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgY3VycmVudEJ5dGUgPDw9IDE7DQotICAgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KLSAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCi0gICAgfQ0KLSAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCi0gICAgaWYgKFJlYWRNb2R1bGUoMSwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZSgyLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgY3VycmVudEJ5dGUgPDw9IDE7DQotICAgIGlmIChSZWFkTW9kdWxlKDMsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KLSAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCi0gICAgfQ0KLSAgICByZXR1cm4gY3VycmVudEJ5dGU7DQotfQ0KLWludDMyX3QgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OlJlYWRDb3JuZXIyKGludDMyX3QgbnVtUm93cywgaW50MzJfdCBudW1Db2x1bW5zKQ0KLXsNCi0gICAgaW50MzJfdCBjdXJyZW50Qnl0ZSA9IDA7DQotICAgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAzLCAwLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KLSAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCi0gICAgfQ0KLSAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCi0gICAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDIsIDAsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMSwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgY3VycmVudEJ5dGUgPDw9IDE7DQotICAgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSA0LCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KLSAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCi0gICAgfQ0KLSAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCi0gICAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDMsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgY3VycmVudEJ5dGUgPDw9IDE7DQotICAgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KLSAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCi0gICAgfQ0KLSAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCi0gICAgaWYgKFJlYWRNb2R1bGUoMSwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIHJldHVybiBjdXJyZW50Qnl0ZTsNCi19DQotaW50MzJfdCBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6UmVhZENvcm5lcjMoaW50MzJfdCBudW1Sb3dzLCBpbnQzMl90IG51bUNvbHVtbnMpDQotew0KLSAgICBpbnQzMl90IGN1cnJlbnRCeXRlID0gMDsNCi0gICAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDEsIDAsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMSwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMywgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgY3VycmVudEJ5dGUgPDw9IDE7DQotICAgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAyLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KLSAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCi0gICAgfQ0KLSAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCi0gICAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZSgxLCBudW1Db2x1bW5zIC0gMywgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgY3VycmVudEJ5dGUgPDw9IDE7DQotICAgIGlmIChSZWFkTW9kdWxlKDEsIG51bUNvbHVtbnMgLSAyLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KLSAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCi0gICAgfQ0KLSAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCi0gICAgaWYgKFJlYWRNb2R1bGUoMSwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIHJldHVybiBjdXJyZW50Qnl0ZTsNCi19DQotaW50MzJfdCBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6UmVhZENvcm5lcjQoaW50MzJfdCBudW1Sb3dzLCBpbnQzMl90IG51bUNvbHVtbnMpDQotew0KLSAgICBpbnQzMl90IGN1cnJlbnRCeXRlID0gMDsNCi0gICAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDMsIDAsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMiwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgY3VycmVudEJ5dGUgPDw9IDE7DQotICAgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAxLCAwLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KLSAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCi0gICAgfQ0KLSAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCi0gICAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgY3VycmVudEJ5dGUgPDw9IDE7DQotICAgIGlmIChSZWFkTW9kdWxlKDEsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KLSAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCi0gICAgfQ0KLSAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCi0gICAgaWYgKFJlYWRNb2R1bGUoMiwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQotICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICB9DQotICAgIGN1cnJlbnRCeXRlIDw8PSAxOw0KLSAgICBpZiAoUmVhZE1vZHVsZSgzLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCi0gICAgICAgIGN1cnJlbnRCeXRlIHw9IDE7DQotICAgIH0NCi0gICAgcmV0dXJuIGN1cnJlbnRCeXRlOw0KLX0NCi1DQkNfQ29tbW9uQml0TWF0cml4ICpDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6RXh0cmFjdERhdGFSZWdpb24oQ0JDX0NvbW1vbkJpdE1hdHJpeCAqYml0TWF0cml4ICwgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3Qgc3ltYm9sU2l6ZVJvd3MgPSBtX3ZlcnNpb24tPkdldFN5bWJvbFNpemVSb3dzKCk7DQotICAgIGludDMyX3Qgc3ltYm9sU2l6ZUNvbHVtbnMgPSBtX3ZlcnNpb24tPkdldFN5bWJvbFNpemVDb2x1bW5zKCk7DQotICAgIGlmIChiaXRNYXRyaXgtPkdldEhlaWdodCgpICE9IHN5bWJvbFNpemVSb3dzKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25DYW5Ob3RDYWxsR2V0RGltZW5zaW9uT25Ob25TcXVhcmVNYXRyaXg7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGRhdGFSZWdpb25TaXplUm93cyA9IG1fdmVyc2lvbi0+R2V0RGF0YVJlZ2lvblNpemVSb3dzKCk7DQotICAgIGludDMyX3QgZGF0YVJlZ2lvblNpemVDb2x1bW5zID0gbV92ZXJzaW9uLT5HZXREYXRhUmVnaW9uU2l6ZUNvbHVtbnMoKTsNCi0gICAgaW50MzJfdCBudW1EYXRhUmVnaW9uc1JvdyA9IHN5bWJvbFNpemVSb3dzIC8gZGF0YVJlZ2lvblNpemVSb3dzOw0KLSAgICBpbnQzMl90IG51bURhdGFSZWdpb25zQ29sdW1uID0gc3ltYm9sU2l6ZUNvbHVtbnMgLyBkYXRhUmVnaW9uU2l6ZUNvbHVtbnM7DQotICAgIGludDMyX3Qgc2l6ZURhdGFSZWdpb25Sb3cgPSBudW1EYXRhUmVnaW9uc1JvdyAqIGRhdGFSZWdpb25TaXplUm93czsNCi0gICAgaW50MzJfdCBzaXplRGF0YVJlZ2lvbkNvbHVtbiA9IG51bURhdGFSZWdpb25zQ29sdW1uICogZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4ICpiaXRNYXRyaXhXaXRob3V0QWxpZ25tZW50ID0gRlhfTkVXIENCQ19Db21tb25CaXRNYXRyaXgoKTsNCi0gICAgYml0TWF0cml4V2l0aG91dEFsaWdubWVudC0+SW5pdChzaXplRGF0YVJlZ2lvbkNvbHVtbiwgc2l6ZURhdGFSZWdpb25Sb3cpOw0KLSAgICBpbnQzMl90IGRhdGFSZWdpb25Sb3c7DQotICAgIGZvciAoZGF0YVJlZ2lvblJvdyA9IDA7IGRhdGFSZWdpb25Sb3cgPCBudW1EYXRhUmVnaW9uc1JvdzsgKytkYXRhUmVnaW9uUm93KSB7DQotICAgICAgICBpbnQzMl90IGRhdGFSZWdpb25Sb3dPZmZzZXQgPSBkYXRhUmVnaW9uUm93ICogZGF0YVJlZ2lvblNpemVSb3dzOw0KLSAgICAgICAgaW50MzJfdCBkYXRhUmVnaW9uQ29sdW1uOw0KLSAgICAgICAgZm9yIChkYXRhUmVnaW9uQ29sdW1uID0gMDsgZGF0YVJlZ2lvbkNvbHVtbiA8IG51bURhdGFSZWdpb25zQ29sdW1uOyArK2RhdGFSZWdpb25Db2x1bW4pIHsNCi0gICAgICAgICAgICBpbnQzMl90IGRhdGFSZWdpb25Db2x1bW5PZmZzZXQgPSBkYXRhUmVnaW9uQ29sdW1uICogZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KLSAgICAgICAgICAgIGludDMyX3QgaTsNCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YVJlZ2lvblNpemVSb3dzOyArK2kpIHsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCByZWFkUm93T2Zmc2V0ID0gZGF0YVJlZ2lvblJvdyAqIChkYXRhUmVnaW9uU2l6ZVJvd3MgKyAyKSArIDEgKyBpOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHdyaXRlUm93T2Zmc2V0ID0gZGF0YVJlZ2lvblJvd09mZnNldCArIGk7DQotICAgICAgICAgICAgICAgIGludDMyX3QgajsNCi0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRhdGFSZWdpb25TaXplQ29sdW1uczsgKytqKSB7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJlYWRDb2x1bW5PZmZzZXQgPSBkYXRhUmVnaW9uQ29sdW1uICogKGRhdGFSZWdpb25TaXplQ29sdW1ucyArIDIpICsgMSArIGo7DQotICAgICAgICAgICAgICAgICAgICBpZiAoYml0TWF0cml4LT5HZXQocmVhZENvbHVtbk9mZnNldCwgcmVhZFJvd09mZnNldCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdyaXRlQ29sdW1uT2Zmc2V0ID0gZGF0YVJlZ2lvbkNvbHVtbk9mZnNldCArIGo7DQotICAgICAgICAgICAgICAgICAgICAgICAgYml0TWF0cml4V2l0aG91dEFsaWdubWVudC0+U2V0KHdyaXRlQ29sdW1uT2Zmc2V0LCB3cml0ZVJvd09mZnNldCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQorICAgICAgICByb3cgLT0gMjsNCisgICAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgIH0gd2hpbGUgKChyb3cgPj0gMCkgJiYgKGNvbHVtbiA8IG51bUNvbHVtbnMpKTsNCisgICAgICByb3cgKz0gMTsNCisgICAgICBjb2x1bW4gKz0gMzsNCisgICAgICBkbyB7DQorICAgICAgICBpZiAoKHJvdyA+PSAwKSAmJiAoY29sdW1uIDwgbnVtQ29sdW1ucykgJiYNCisgICAgICAgICAgICAhbV9yZWFkTWFwcGluZ01hdHJpeC0+R2V0KGNvbHVtbiwgcm93KSkgew0KKyAgICAgICAgICBpZiAocmVzdWx0T2Zmc2V0IDwgKCpyZXN1bHQpLkdldFNpemUoKSkgew0KKyAgICAgICAgICAgICgqcmVzdWx0KVtyZXN1bHRPZmZzZXQrK10gPQ0KKyAgICAgICAgICAgICAgICAodWludDhfdClSZWFkVXRhaChyb3csIGNvbHVtbiwgbnVtUm93cywgbnVtQ29sdW1ucyk7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCisgICAgICAgIHJvdyArPSAyOw0KKyAgICAgICAgY29sdW1uIC09IDI7DQorICAgICAgfSB3aGlsZSAoKHJvdyA8IG51bVJvd3MpICYmIChjb2x1bW4gPj0gMCkpOw0KKyAgICAgIHJvdyArPSAzOw0KKyAgICAgIGNvbHVtbiArPSAxOw0KICAgICB9DQotICAgIHJldHVybiBiaXRNYXRyaXhXaXRob3V0QWxpZ25tZW50Ow0KKyAgfSB3aGlsZSAoKHJvdyA8IG51bVJvd3MpIHx8IChjb2x1bW4gPCBudW1Db2x1bW5zKSk7DQorICBpZiAocmVzdWx0T2Zmc2V0ICE9IG1fdmVyc2lvbi0+R2V0VG90YWxDb2Rld29yZHMoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQorfQ0KK0ZYX0JPT0wgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OlJlYWRNb2R1bGUoaW50MzJfdCByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtUm93cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtQ29sdW1ucykgew0KKyAgaWYgKHJvdyA8IDApIHsNCisgICAgcm93ICs9IG51bVJvd3M7DQorICAgIGNvbHVtbiArPSA0IC0gKChudW1Sb3dzICsgNCkgJiAweDA3KTsNCisgIH0NCisgIGlmIChjb2x1bW4gPCAwKSB7DQorICAgIGNvbHVtbiArPSBudW1Db2x1bW5zOw0KKyAgICByb3cgKz0gNCAtICgobnVtQ29sdW1ucyArIDQpICYgMHgwNyk7DQorICB9DQorICBtX3JlYWRNYXBwaW5nTWF0cml4LT5TZXQoY29sdW1uLCByb3cpOw0KKyAgcmV0dXJuIG1fbWFwcGluZ0JpdE1hdHJpeC0+R2V0KGNvbHVtbiwgcm93KTsNCit9DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6UmVhZFV0YWgoaW50MzJfdCByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Sb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtQ29sdW1ucykgew0KKyAgaW50MzJfdCBjdXJyZW50Qnl0ZSA9IDA7DQorICBpZiAoUmVhZE1vZHVsZShyb3cgLSAyLCBjb2x1bW4gLSAyLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShyb3cgLSAyLCBjb2x1bW4gLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShyb3cgLSAxLCBjb2x1bW4gLSAyLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShyb3cgLSAxLCBjb2x1bW4gLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShyb3cgLSAxLCBjb2x1bW4sIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKHJvdywgY29sdW1uIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUocm93LCBjb2x1bW4gLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShyb3csIGNvbHVtbiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIHJldHVybiBjdXJyZW50Qnl0ZTsNCit9DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6UmVhZENvcm5lcjEoaW50MzJfdCBudW1Sb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtQ29sdW1ucykgew0KKyAgaW50MzJfdCBjdXJyZW50Qnl0ZSA9IDA7DQorICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMSwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDEsIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAxLCAyLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDEsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgyLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMywgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICByZXR1cm4gY3VycmVudEJ5dGU7DQorfQ0KK2ludDMyX3QgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OlJlYWRDb3JuZXIyKGludDMyX3QgbnVtUm93cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUNvbHVtbnMpIHsNCisgIGludDMyX3QgY3VycmVudEJ5dGUgPSAwOw0KKyAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDMsIDAsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAyLCAwLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMSwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDQsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAzLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDEsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgcmV0dXJuIGN1cnJlbnRCeXRlOw0KK30NCitpbnQzMl90IENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkQ29ybmVyMyhpbnQzMl90IG51bVJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Db2x1bW5zKSB7DQorICBpbnQzMl90IGN1cnJlbnRCeXRlID0gMDsNCisgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAxLCAwLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMSwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAzLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDEsIG51bUNvbHVtbnMgLSAzLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgxLCBudW1Db2x1bW5zIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMSwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICByZXR1cm4gY3VycmVudEJ5dGU7DQorfQ0KK2ludDMyX3QgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OlJlYWRDb3JuZXI0KGludDMyX3QgbnVtUm93cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUNvbHVtbnMpIHsNCisgIGludDMyX3QgY3VycmVudEJ5dGUgPSAwOw0KKyAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDMsIDAsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAyLCAwLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMSwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgxLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMiwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDMsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgcmV0dXJuIGN1cnJlbnRCeXRlOw0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6RXh0cmFjdERhdGFSZWdpb24oDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBzeW1ib2xTaXplUm93cyA9IG1fdmVyc2lvbi0+R2V0U3ltYm9sU2l6ZVJvd3MoKTsNCisgIGludDMyX3Qgc3ltYm9sU2l6ZUNvbHVtbnMgPSBtX3ZlcnNpb24tPkdldFN5bWJvbFNpemVDb2x1bW5zKCk7DQorICBpZiAoYml0TWF0cml4LT5HZXRIZWlnaHQoKSAhPSBzeW1ib2xTaXplUm93cykgew0KKyAgICBlID0gQkNFeGNlcHRpb25DYW5Ob3RDYWxsR2V0RGltZW5zaW9uT25Ob25TcXVhcmVNYXRyaXg7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBkYXRhUmVnaW9uU2l6ZVJvd3MgPSBtX3ZlcnNpb24tPkdldERhdGFSZWdpb25TaXplUm93cygpOw0KKyAgaW50MzJfdCBkYXRhUmVnaW9uU2l6ZUNvbHVtbnMgPSBtX3ZlcnNpb24tPkdldERhdGFSZWdpb25TaXplQ29sdW1ucygpOw0KKyAgaW50MzJfdCBudW1EYXRhUmVnaW9uc1JvdyA9IHN5bWJvbFNpemVSb3dzIC8gZGF0YVJlZ2lvblNpemVSb3dzOw0KKyAgaW50MzJfdCBudW1EYXRhUmVnaW9uc0NvbHVtbiA9IHN5bWJvbFNpemVDb2x1bW5zIC8gZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KKyAgaW50MzJfdCBzaXplRGF0YVJlZ2lvblJvdyA9IG51bURhdGFSZWdpb25zUm93ICogZGF0YVJlZ2lvblNpemVSb3dzOw0KKyAgaW50MzJfdCBzaXplRGF0YVJlZ2lvbkNvbHVtbiA9IG51bURhdGFSZWdpb25zQ29sdW1uICogZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0TWF0cml4V2l0aG91dEFsaWdubWVudCA9IEZYX05FVyBDQkNfQ29tbW9uQml0TWF0cml4KCk7DQorICBiaXRNYXRyaXhXaXRob3V0QWxpZ25tZW50LT5Jbml0KHNpemVEYXRhUmVnaW9uQ29sdW1uLCBzaXplRGF0YVJlZ2lvblJvdyk7DQorICBpbnQzMl90IGRhdGFSZWdpb25Sb3c7DQorICBmb3IgKGRhdGFSZWdpb25Sb3cgPSAwOyBkYXRhUmVnaW9uUm93IDwgbnVtRGF0YVJlZ2lvbnNSb3c7ICsrZGF0YVJlZ2lvblJvdykgew0KKyAgICBpbnQzMl90IGRhdGFSZWdpb25Sb3dPZmZzZXQgPSBkYXRhUmVnaW9uUm93ICogZGF0YVJlZ2lvblNpemVSb3dzOw0KKyAgICBpbnQzMl90IGRhdGFSZWdpb25Db2x1bW47DQorICAgIGZvciAoZGF0YVJlZ2lvbkNvbHVtbiA9IDA7IGRhdGFSZWdpb25Db2x1bW4gPCBudW1EYXRhUmVnaW9uc0NvbHVtbjsNCisgICAgICAgICArK2RhdGFSZWdpb25Db2x1bW4pIHsNCisgICAgICBpbnQzMl90IGRhdGFSZWdpb25Db2x1bW5PZmZzZXQgPSBkYXRhUmVnaW9uQ29sdW1uICogZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KKyAgICAgIGludDMyX3QgaTsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YVJlZ2lvblNpemVSb3dzOyArK2kpIHsNCisgICAgICAgIGludDMyX3QgcmVhZFJvd09mZnNldCA9DQorICAgICAgICAgICAgZGF0YVJlZ2lvblJvdyAqIChkYXRhUmVnaW9uU2l6ZVJvd3MgKyAyKSArIDEgKyBpOw0KKyAgICAgICAgaW50MzJfdCB3cml0ZVJvd09mZnNldCA9IGRhdGFSZWdpb25Sb3dPZmZzZXQgKyBpOw0KKyAgICAgICAgaW50MzJfdCBqOw0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGRhdGFSZWdpb25TaXplQ29sdW1uczsgKytqKSB7DQorICAgICAgICAgIGludDMyX3QgcmVhZENvbHVtbk9mZnNldCA9DQorICAgICAgICAgICAgICBkYXRhUmVnaW9uQ29sdW1uICogKGRhdGFSZWdpb25TaXplQ29sdW1ucyArIDIpICsgMSArIGo7DQorICAgICAgICAgIGlmIChiaXRNYXRyaXgtPkdldChyZWFkQ29sdW1uT2Zmc2V0LCByZWFkUm93T2Zmc2V0KSkgew0KKyAgICAgICAgICAgIGludDMyX3Qgd3JpdGVDb2x1bW5PZmZzZXQgPSBkYXRhUmVnaW9uQ29sdW1uT2Zmc2V0ICsgajsNCisgICAgICAgICAgICBiaXRNYXRyaXhXaXRob3V0QWxpZ25tZW50LT5TZXQod3JpdGVDb2x1bW5PZmZzZXQsIHdyaXRlUm93T2Zmc2V0KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGJpdE1hdHJpeFdpdGhvdXRBbGlnbm1lbnQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmgKaW5kZXggZGE5ZmRjNy4uNDkyYmMwNSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmgKQEAgLTgsMjUgKzgsMzMgQEAKICNkZWZpbmUgX0JDX0RBVEFNQVRSSVhCSVRNQVRSSVhQQVJTRVJfSF8NCiBjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KIGNsYXNzIENCQ19EYXRhTWF0cml4VmVyc2lvbjsNCi1jbGFzcyBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyKCk7DQotICAgIENCQ19EYXRhTWF0cml4VmVyc2lvbiAqR2V0VmVyc2lvbigpOw0KLSAgICBDRlhfQnl0ZUFycmF5ICpSZWFkQ29kZXdvcmRzKGludDMyX3QgJmUpOw0KLSAgICBGWF9CT09MIFJlYWRNb2R1bGUoaW50MzJfdCByb3csIGludDMyX3QgY29sdW1uLCBpbnQzMl90IG51bVJvd3MsIGludDMyX3QgbnVtQ29sdW1ucyk7DQotICAgIGludDMyX3QgUmVhZFV0YWgoaW50MzJfdCByb3csIGludDMyX3QgY29sdW1uLCBpbnQzMl90IG51bVJvd3MsIGludDMyX3QgbnVtQ29sdW1ucyk7DQotICAgIGludDMyX3QgUmVhZENvcm5lcjEoaW50MzJfdCBudW1Sb3dzLCBpbnQzMl90IG51bUNvbHVtbnMpOw0KLSAgICBpbnQzMl90IFJlYWRDb3JuZXIyKGludDMyX3QgbnVtUm93cywgaW50MzJfdCBudW1Db2x1bW5zKTsNCi0gICAgaW50MzJfdCBSZWFkQ29ybmVyMyhpbnQzMl90IG51bVJvd3MsIGludDMyX3QgbnVtQ29sdW1ucyk7DQotICAgIGludDMyX3QgUmVhZENvcm5lcjQoaW50MzJfdCBudW1Sb3dzLCBpbnQzMl90IG51bUNvbHVtbnMpOw0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4ICpFeHRyYWN0RGF0YVJlZ2lvbihDQkNfQ29tbW9uQml0TWF0cml4ICpiaXRNYXRyaXgsIGludDMyX3QgJmUpOw0KLSAgICB2aXJ0dWFsIHZvaWQgSW5pdChDQkNfQ29tbW9uQml0TWF0cml4ICpiaXRNYXRyaXgsIGludDMyX3QgJmUpOw0KLXByaXZhdGU6DQotICAgIHN0YXRpYyBDQkNfRGF0YU1hdHJpeFZlcnNpb24qIFJlYWRWZXJzaW9uKENCQ19Db21tb25CaXRNYXRyaXggKmJpdE1hdHJpeCwgaW50MzJfdCAmZSk7DQotICAgIENCQ19Db21tb25CaXRNYXRyaXggKm1fbWFwcGluZ0JpdE1hdHJpeDsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqbV9yZWFkTWFwcGluZ01hdHJpeDsNCi0gICAgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uICptX3ZlcnNpb247DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIgew0KKyBwdWJsaWM6DQorICBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcigpOw0KKyAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIoKTsNCisgIENCQ19EYXRhTWF0cml4VmVyc2lvbiogR2V0VmVyc2lvbigpOw0KKyAgQ0ZYX0J5dGVBcnJheSogUmVhZENvZGV3b3JkcyhpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVhZE1vZHVsZShpbnQzMl90IHJvdywNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Db2x1bW5zKTsNCisgIGludDMyX3QgUmVhZFV0YWgoaW50MzJfdCByb3csDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVJvd3MsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtQ29sdW1ucyk7DQorICBpbnQzMl90IFJlYWRDb3JuZXIxKGludDMyX3QgbnVtUm93cywgaW50MzJfdCBudW1Db2x1bW5zKTsNCisgIGludDMyX3QgUmVhZENvcm5lcjIoaW50MzJfdCBudW1Sb3dzLCBpbnQzMl90IG51bUNvbHVtbnMpOw0KKyAgaW50MzJfdCBSZWFkQ29ybmVyMyhpbnQzMl90IG51bVJvd3MsIGludDMyX3QgbnVtQ29sdW1ucyk7DQorICBpbnQzMl90IFJlYWRDb3JuZXI0KGludDMyX3QgbnVtUm93cywgaW50MzJfdCBudW1Db2x1bW5zKTsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIEV4dHJhY3REYXRhUmVnaW9uKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0TWF0cml4LCBpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBDQkNfRGF0YU1hdHJpeFZlcnNpb24qIFJlYWRWZXJzaW9uKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9tYXBwaW5nQml0TWF0cml4Ow0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9yZWFkTWFwcGluZ01hdHJpeDsNCisgIENCQ19EYXRhTWF0cml4VmVyc2lvbiogbV92ZXJzaW9uOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGF0YUJsb2NrLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5jcHAKaW5kZXggZmNmMjgwNC4uZjlkOTkxYiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGF0YUJsb2NrLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEYXRhQmxvY2suY3BwCkBAIC0yMyw3NyArMjMsODkgQEAKICNpbmNsdWRlICIuLi9iYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhWZXJzaW9uLmgiDQogI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhEYXRhQmxvY2suaCINCi1DQkNfRGF0YU1hdHJpeERhdGFCbG9jazo6fkNCQ19EYXRhTWF0cml4RGF0YUJsb2NrKCkNCi17DQorQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6On5DQkNfRGF0YU1hdHJpeERhdGFCbG9jaygpIHt9DQorQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6OkNCQ19EYXRhTWF0cml4RGF0YUJsb2NrKGludDMyX3QgbnVtRGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVBcnJheSogY29kZXdvcmRzKSB7DQorICBtX2NvZGV3b3Jkcy5Db3B5KCpjb2Rld29yZHMpOw0KKyAgbV9udW1EYXRhQ29kZXdvcmRzID0gbnVtRGF0YUNvZGV3b3JkczsNCiB9DQotQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6OkNCQ19EYXRhTWF0cml4RGF0YUJsb2NrKGludDMyX3QgbnVtRGF0YUNvZGV3b3JkcywgQ0ZYX0J5dGVBcnJheSAqY29kZXdvcmRzKQ0KLXsNCi0gICAgbV9jb2Rld29yZHMuQ29weSgqY29kZXdvcmRzKTsNCi0gICAgbV9udW1EYXRhQ29kZXdvcmRzID0gbnVtRGF0YUNvZGV3b3JkczsNCi19DQotQ0ZYX1B0ckFycmF5ICpDQkNfRGF0YU1hdHJpeERhdGFCbG9jazo6R2V0RGF0YUJsb2NrcyhDRlhfQnl0ZUFycmF5KiByYXdDb2Rld29yZHMsIENCQ19EYXRhTWF0cml4VmVyc2lvbiAqdmVyc2lvbiwgaW50MzJfdCAmZSkNCi17DQotICAgIEVDQmxvY2tzICplY0Jsb2NrcyA9IHZlcnNpb24tPkdldEVDQmxvY2tzKCk7DQotICAgIGludDMyX3QgdG90YWxCbG9ja3MgPSAwOw0KLSAgICBjb25zdCBDRlhfUHRyQXJyYXkgJmVjQmxvY2tBcnJheSA9IGVjQmxvY2tzLT5HZXRFQ0Jsb2NrcygpOw0KLSAgICBpbnQzMl90IGk7DQotICAgIGZvciAoaSA9IDA7IGkgPCBlY0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIHRvdGFsQmxvY2tzICs9ICgoRUNCKillY0Jsb2NrQXJyYXlbaV0pLT5HZXRDb3VudCgpOw0KK0NGWF9QdHJBcnJheSogQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6OkdldERhdGFCbG9ja3MoDQorICAgIENGWF9CeXRlQXJyYXkqIHJhd0NvZGV3b3JkcywNCisgICAgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKiB2ZXJzaW9uLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBFQ0Jsb2NrcyogZWNCbG9ja3MgPSB2ZXJzaW9uLT5HZXRFQ0Jsb2NrcygpOw0KKyAgaW50MzJfdCB0b3RhbEJsb2NrcyA9IDA7DQorICBjb25zdCBDRlhfUHRyQXJyYXkmIGVjQmxvY2tBcnJheSA9IGVjQmxvY2tzLT5HZXRFQ0Jsb2NrcygpOw0KKyAgaW50MzJfdCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IGVjQmxvY2tBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICB0b3RhbEJsb2NrcyArPSAoKEVDQiopZWNCbG9ja0FycmF5W2ldKS0+R2V0Q291bnQoKTsNCisgIH0NCisgIENCQ19BdXRvUHRyPENGWF9QdHJBcnJheT4gcmVzdWx0KEZYX05FVyBDRlhfUHRyQXJyYXkoKSk7DQorICByZXN1bHQtPlNldFNpemUodG90YWxCbG9ja3MpOw0KKyAgaW50MzJfdCBudW1SZXN1bHRCbG9ja3MgPSAwOw0KKyAgaW50MzJfdCBqOw0KKyAgZm9yIChqID0gMDsgaiA8IGVjQmxvY2tBcnJheS5HZXRTaXplKCk7IGorKykgew0KKyAgICBmb3IgKGkgPSAwOyBpIDwgKChFQ0IqKWVjQmxvY2tBcnJheVtqXSktPkdldENvdW50KCk7IGkrKykgew0KKyAgICAgIGludDMyX3QgbnVtRGF0YUNvZGV3b3JkcyA9ICgoRUNCKillY0Jsb2NrQXJyYXlbal0pLT5HZXREYXRhQ29kZXdvcmRzKCk7DQorICAgICAgaW50MzJfdCBudW1CbG9ja0NvZGV3b3JkcyA9IGVjQmxvY2tzLT5HZXRFQ0NvZGV3b3JkcygpICsgbnVtRGF0YUNvZGV3b3JkczsNCisgICAgICBDRlhfQnl0ZUFycmF5IGNvZGV3b3JkczsNCisgICAgICBjb2Rld29yZHMuU2V0U2l6ZShudW1CbG9ja0NvZGV3b3Jkcyk7DQorICAgICAgKCpyZXN1bHQpW251bVJlc3VsdEJsb2NrcysrXSA9DQorICAgICAgICAgIEZYX05FVyBDQkNfRGF0YU1hdHJpeERhdGFCbG9jayhudW1EYXRhQ29kZXdvcmRzLCAmY29kZXdvcmRzKTsNCisgICAgICBjb2Rld29yZHMuU2V0U2l6ZSgwKTsNCiAgICAgfQ0KLSAgICBDQkNfQXV0b1B0cjxDRlhfUHRyQXJyYXk+cmVzdWx0KEZYX05FVyBDRlhfUHRyQXJyYXkoKSk7DQotICAgIHJlc3VsdC0+U2V0U2l6ZSh0b3RhbEJsb2Nrcyk7DQotICAgIGludDMyX3QgbnVtUmVzdWx0QmxvY2tzID0gMDsNCisgIH0NCisgIGludDMyX3QgbG9uZ2VyQmxvY2tzVG90YWxDb2Rld29yZHMgPQ0KKyAgICAgICgoQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sqKSgqcmVzdWx0KVswXSktPkdldENvZGV3b3JkcygpLT5HZXRTaXplKCk7DQorICBpbnQzMl90IGxvbmdlckJsb2Nrc051bURhdGFDb2Rld29yZHMgPQ0KKyAgICAgIGxvbmdlckJsb2Nrc1RvdGFsQ29kZXdvcmRzIC0gZWNCbG9ja3MtPkdldEVDQ29kZXdvcmRzKCk7DQorICBpbnQzMl90IHNob3J0ZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzID0gbG9uZ2VyQmxvY2tzTnVtRGF0YUNvZGV3b3JkcyAtIDE7DQorICBpbnQzMl90IHJhd0NvZGV3b3Jkc09mZnNldCA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkrKykgew0KICAgICBpbnQzMl90IGo7DQotICAgIGZvciAoaiA9IDA7IGogPCBlY0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOyBqKyspIHsNCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAoKEVDQiopZWNCbG9ja0FycmF5W2pdKS0+R2V0Q291bnQoKTsgaSsrKSB7DQotICAgICAgICAgICAgaW50MzJfdCBudW1EYXRhQ29kZXdvcmRzID0gKChFQ0IqKWVjQmxvY2tBcnJheVtqXSktPkdldERhdGFDb2Rld29yZHMoKTsNCi0gICAgICAgICAgICBpbnQzMl90IG51bUJsb2NrQ29kZXdvcmRzID0gZWNCbG9ja3MtPkdldEVDQ29kZXdvcmRzKCkgKyBudW1EYXRhQ29kZXdvcmRzOw0KLSAgICAgICAgICAgIENGWF9CeXRlQXJyYXkgY29kZXdvcmRzOw0KLSAgICAgICAgICAgIGNvZGV3b3Jkcy5TZXRTaXplKG51bUJsb2NrQ29kZXdvcmRzKTsNCi0gICAgICAgICAgICAoKnJlc3VsdClbbnVtUmVzdWx0QmxvY2tzKytdID0gRlhfTkVXIENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKG51bURhdGFDb2Rld29yZHMsICZjb2Rld29yZHMpOw0KLSAgICAgICAgICAgIGNvZGV3b3Jkcy5TZXRTaXplKDApOw0KLSAgICAgICAgfQ0KKyAgICBmb3IgKGogPSAwOyBqIDwgbnVtUmVzdWx0QmxvY2tzOyBqKyspIHsNCisgICAgICBpZiAocmF3Q29kZXdvcmRzT2Zmc2V0IDwgcmF3Q29kZXdvcmRzLT5HZXRTaXplKCkpIHsNCisgICAgICAgICgoQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sqKSgqcmVzdWx0KVtqXSkNCisgICAgICAgICAgICAtPkdldENvZGV3b3JkcygpDQorICAgICAgICAgICAgLT4NCisgICAgICAgICAgICBvcGVyYXRvcltdKGkpID0gKCpyYXdDb2Rld29yZHMpW3Jhd0NvZGV3b3Jkc09mZnNldCsrXTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaW50MzJfdCBsb25nZXJCbG9ja3NUb3RhbENvZGV3b3JkcyA9ICgoQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sqKSgqcmVzdWx0KVswXSktPkdldENvZGV3b3JkcygpLT5HZXRTaXplKCk7DQotICAgIGludDMyX3QgbG9uZ2VyQmxvY2tzTnVtRGF0YUNvZGV3b3JkcyA9IGxvbmdlckJsb2Nrc1RvdGFsQ29kZXdvcmRzIC0gZWNCbG9ja3MtPkdldEVDQ29kZXdvcmRzKCk7DQotICAgIGludDMyX3Qgc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHMgPSBsb25nZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzIC0gMTsNCi0gICAgaW50MzJfdCByYXdDb2Rld29yZHNPZmZzZXQgPSAwOw0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBqOw0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bVJlc3VsdEJsb2NrczsgaisrKSB7DQotICAgICAgICAgICAgaWYgKHJhd0NvZGV3b3Jkc09mZnNldCA8IHJhd0NvZGV3b3Jkcy0+R2V0U2l6ZSgpKSB7DQotICAgICAgICAgICAgICAgICgoQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sqKSgqcmVzdWx0KVtqXSktPkdldENvZGV3b3JkcygpLT5vcGVyYXRvciBbXShpKSA9ICgqcmF3Q29kZXdvcmRzKVtyYXdDb2Rld29yZHNPZmZzZXQrK107DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBzcGVjaWFsVmVyc2lvbiA9IHZlcnNpb24tPkdldFZlcnNpb25OdW1iZXIoKSA9PSAyNDsNCisgIGludDMyX3QgbnVtTG9uZ2VyQmxvY2tzID0gc3BlY2lhbFZlcnNpb24gPyA4IDogbnVtUmVzdWx0QmxvY2tzOw0KKyAgZm9yIChqID0gMDsgaiA8IG51bUxvbmdlckJsb2NrczsgaisrKSB7DQorICAgIGlmIChyYXdDb2Rld29yZHNPZmZzZXQgPCByYXdDb2Rld29yZHMtPkdldFNpemUoKSkgew0KKyAgICAgICgoQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sqKSgqcmVzdWx0KVtqXSkNCisgICAgICAgICAgLT5HZXRDb2Rld29yZHMoKQ0KKyAgICAgICAgICAtPg0KKyAgICAgICAgICBvcGVyYXRvcltdKGxvbmdlckJsb2Nrc051bURhdGFDb2Rld29yZHMgLSAxKSA9DQorICAgICAgICAgICgqcmF3Q29kZXdvcmRzKVtyYXdDb2Rld29yZHNPZmZzZXQrK107DQogICAgIH0NCi0gICAgRlhfQk9PTCBzcGVjaWFsVmVyc2lvbiA9IHZlcnNpb24tPkdldFZlcnNpb25OdW1iZXIoKSA9PSAyNDsNCi0gICAgaW50MzJfdCBudW1Mb25nZXJCbG9ja3MgPSBzcGVjaWFsVmVyc2lvbiA/IDggOiBudW1SZXN1bHRCbG9ja3M7DQotICAgIGZvciAoaiA9IDA7IGogPCBudW1Mb25nZXJCbG9ja3M7IGorKykgew0KLSAgICAgICAgaWYgKHJhd0NvZGV3b3Jkc09mZnNldCA8IHJhd0NvZGV3b3Jkcy0+R2V0U2l6ZSgpKSB7DQotICAgICAgICAgICAgKChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpyZXN1bHQpW2pdKS0+R2V0Q29kZXdvcmRzKCktPm9wZXJhdG9yIFtdKGxvbmdlckJsb2Nrc051bURhdGFDb2Rld29yZHMgLSAxKSA9ICgqcmF3Q29kZXdvcmRzKVtyYXdDb2Rld29yZHNPZmZzZXQrK107DQotICAgICAgICB9DQorICB9DQorICBpbnQzMl90IG1heCA9DQorICAgICAgKChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpyZXN1bHQpWzBdKS0+R2V0Q29kZXdvcmRzKCktPkdldFNpemUoKTsNCisgIGZvciAoaSA9IGxvbmdlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkgPCBtYXg7IGkrKykgew0KKyAgICBpbnQzMl90IGo7DQorICAgIGZvciAoaiA9IDA7IGogPCBudW1SZXN1bHRCbG9ja3M7IGorKykgew0KKyAgICAgIGludDMyX3QgaU9mZnNldCA9IHNwZWNpYWxWZXJzaW9uICYmIGogPiA3ID8gaSAtIDEgOiBpOw0KKyAgICAgIGlmIChyYXdDb2Rld29yZHNPZmZzZXQgPCByYXdDb2Rld29yZHMtPkdldFNpemUoKSkgew0KKyAgICAgICAgKChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpyZXN1bHQpW2pdKQ0KKyAgICAgICAgICAgIC0+R2V0Q29kZXdvcmRzKCkNCisgICAgICAgICAgICAtPg0KKyAgICAgICAgICAgIG9wZXJhdG9yW10oaU9mZnNldCkgPSAoKnJhd0NvZGV3b3JkcylbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpbnQzMl90IG1heCA9ICgoQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sqKSgqcmVzdWx0KVswXSktPkdldENvZGV3b3JkcygpLT5HZXRTaXplKCk7DQotICAgIGZvciAoaSA9IGxvbmdlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkgPCBtYXg7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBqOw0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bVJlc3VsdEJsb2NrczsgaisrKSB7DQotICAgICAgICAgICAgaW50MzJfdCBpT2Zmc2V0ID0gc3BlY2lhbFZlcnNpb24gJiYgaiA+IDcgPyBpIC0gMSA6IGk7DQotICAgICAgICAgICAgaWYgKHJhd0NvZGV3b3Jkc09mZnNldCA8IHJhd0NvZGV3b3Jkcy0+R2V0U2l6ZSgpKSB7DQotICAgICAgICAgICAgICAgICgoQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sqKSgqcmVzdWx0KVtqXSktPkdldENvZGV3b3JkcygpLT5vcGVyYXRvciBbXShpT2Zmc2V0KSA9ICgqcmF3Q29kZXdvcmRzKVtyYXdDb2Rld29yZHNPZmZzZXQrK107DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChyYXdDb2Rld29yZHNPZmZzZXQgIT0gcmF3Q29kZXdvcmRzLT5HZXRTaXplKCkpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOw0KKyAgfQ0KKyAgaWYgKHJhd0NvZGV3b3Jkc09mZnNldCAhPSByYXdDb2Rld29yZHMtPkdldFNpemUoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQogfQ0KLWludDMyX3QgQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6OkdldE51bURhdGFDb2Rld29yZHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbnVtRGF0YUNvZGV3b3JkczsNCitpbnQzMl90IENCQ19EYXRhTWF0cml4RGF0YUJsb2NrOjpHZXROdW1EYXRhQ29kZXdvcmRzKCkgew0KKyAgcmV0dXJuIG1fbnVtRGF0YUNvZGV3b3JkczsNCiB9DQotQ0ZYX0J5dGVBcnJheSAqQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6OkdldENvZGV3b3JkcygpDQotew0KLSAgICByZXR1cm4gJm1fY29kZXdvcmRzOw0KK0NGWF9CeXRlQXJyYXkqIENCQ19EYXRhTWF0cml4RGF0YUJsb2NrOjpHZXRDb2Rld29yZHMoKSB7DQorICByZXR1cm4gJm1fY29kZXdvcmRzOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEYXRhQmxvY2suaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5oCmluZGV4IDIxYmU2NjUuLjZmMzRlNjggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5oCkBAIC03LDE5ICs3LDIxIEBACiAjaWZuZGVmIF9CQ19EQVRBTUFUUklYREFUQUJMT0NLX0hfDQogI2RlZmluZSBfQkNfREFUQU1BVFJJWERBVEFCTE9DS19IXw0KIGNsYXNzIENCQ19EYXRhTWF0cml4VmVyc2lvbjsNCi1jbGFzcyBDQkNfRGF0YU1hdHJpeERhdGFCbG9jaw0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4RGF0YUJsb2NrKCk7DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5DQkNfRGF0YU1hdHJpeERhdGFCbG9jaygpOw0KIA0KLSAgICBpbnQzMl90IEdldE51bURhdGFDb2Rld29yZHMoKTsNCi0gICAgQ0ZYX0J5dGVBcnJheSogR2V0Q29kZXdvcmRzKCk7DQorICBpbnQzMl90IEdldE51bURhdGFDb2Rld29yZHMoKTsNCisgIENGWF9CeXRlQXJyYXkqIEdldENvZGV3b3JkcygpOw0KIA0KLSAgICBzdGF0aWMgQ0ZYX1B0ckFycmF5ICpHZXREYXRhQmxvY2tzKENGWF9CeXRlQXJyYXkqIHJhd0NvZGV3b3JkcywgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uICp2ZXJzaW9uLCBpbnQzMl90ICZlKTsNCi1wcml2YXRlOg0KLSAgICBpbnQzMl90IG1fbnVtRGF0YUNvZGV3b3JkczsNCi0gICAgQ0ZYX0J5dGVBcnJheSBtX2NvZGV3b3JkczsNCisgIHN0YXRpYyBDRlhfUHRyQXJyYXkqIEdldERhdGFCbG9ja3MoQ0ZYX0J5dGVBcnJheSogcmF3Q29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfRGF0YU1hdHJpeFZlcnNpb24qIHZlcnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KIA0KLSAgICBDQkNfRGF0YU1hdHJpeERhdGFCbG9jayhpbnQzMl90IG51bURhdGFDb2Rld29yZHMsIENGWF9CeXRlQXJyYXkgKmNvZGV3b3Jkcyk7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fbnVtRGF0YUNvZGV3b3JkczsNCisgIENGWF9CeXRlQXJyYXkgbV9jb2Rld29yZHM7DQorDQorICBDQkNfRGF0YU1hdHJpeERhdGFCbG9jayhpbnQzMl90IG51bURhdGFDb2Rld29yZHMsIENGWF9CeXRlQXJyYXkqIGNvZGV3b3Jkcyk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuY3BwCmluZGV4IDA3MzkzYzAuLjg2YTkzZDEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuY3BwCkBAIC0yNywyMSArMjcsMTggQEAKIGNvbnN0IEZYX0NIQVIgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpDNDBfQkFTSUNfU0VUX0NIQVJTW10gPSB7DQogICAgICcqJywgJyonLCAnKicsICcgJywgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLA0KICAgICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywNCi0gICAgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJw0KLX07DQorICAgICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWid9Ow0KIGNvbnN0IEZYX0NIQVIgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpDNDBfU0hJRlQyX1NFVF9DSEFSU1tdID0gew0KICAgICAnIScsICciJywgJyMnLCAnJCcsICclJywgJyYnLCAnXCcnLCAnKCcsICcpJywgJyonLCAgJysnLCAnLCcsICctJywgJy4nLA0KLSAgICAnLycsICc6JywgJzsnLCAnPCcsICc9JywgJz4nLCAnPycsICAnQCcsICdbJywgJ1xcJywgJ10nLCAnXicsICdfJw0KLX07DQorICAgICcvJywgJzonLCAnOycsICc8JywgJz0nLCAnPicsICc/JywgICdAJywgJ1snLCAnXFwnLCAnXScsICdeJywgJ18nfTsNCiBjb25zdCBGWF9DSEFSIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6VEVYVF9CQVNJQ19TRVRfQ0hBUlNbXSA9IHsNCiAgICAgJyonLCAnKicsICcqJywgJyAnLCAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsDQogICAgICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLA0KLSAgICAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onDQotfTsNCisgICAgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6J307DQogY29uc3QgRlhfQ0hBUiBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlRFWFRfU0hJRlQzX1NFVF9DSEFSU1tdID0gew0KLSAgICAnXCcnLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywNCi0gICAgJ08nLCAgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsICd7JywgJ3wnLCAnfScsICd+JywgKEZYX0NIQVIpIDEyNw0KLX07DQorICAgICdcJycsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICAgICAgICAgJ0onLA0KKyAgICAnSycsICAnTCcsICdNJywgJ04nLCAnTycsICdQJywgJ1EnLCAnUicsICdTJywgJ1QnLCAgICAgICAgICdVJywNCisgICAgJ1YnLCAgJ1cnLCAnWCcsICdZJywgJ1onLCAneycsICd8JywgJ30nLCAnficsIChGWF9DSEFSKTEyN307DQogY29uc3QgaW50MzJfdCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlBBRF9FTkNPREUgPSAwOw0KIGNvbnN0IGludDMyX3QgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpBU0NJSV9FTkNPREUgPSAxOw0KIGNvbnN0IGludDMyX3QgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpDNDBfRU5DT0RFID0gMjsNCkBAIC00OSw0MjQgKzQ2LDQ0MCBAQAogY29uc3QgaW50MzJfdCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkFOU0lYMTJfRU5DT0RFID0gNDsNCiBjb25zdCBpbnQzMl90IENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RURJRkFDVF9FTkNPREUgPSA1Ow0KIGNvbnN0IGludDMyX3QgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpCQVNFMjU2X0VOQ09ERSA9IDY7DQotQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIoKQ0KLXsNCi19DQotQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjp+Q0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyKCkNCi17DQotfQ0KLUNCQ19Db21tb25EZWNvZGVyUmVzdWx0ICpDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZShDRlhfQnl0ZUFycmF5ICZieXRlcywgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19Db21tb25CaXRTb3VyY2UgYml0cygmYnl0ZXMpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdFRyYWlsZXI7DQotICAgIENGWF9JbnQzMkFycmF5IGJ5dGVTZWdtZW50czsNCi0gICAgaW50MzJfdCBtb2RlID0gQVNDSUlfRU5DT0RFOw0KLSAgICBkbyB7DQotICAgICAgICBpZiAobW9kZSA9PSAxKSB7DQotICAgICAgICAgICAgbW9kZSA9IERlY29kZUFzY2lpU2VnbWVudCgmYml0cywgcmVzdWx0LCByZXN1bHRUcmFpbGVyLCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgew0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBEZWNvZGVDNDBTZWdtZW50KCZiaXRzLCByZXN1bHQsIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIERlY29kZVRleHRTZWdtZW50KCZiaXRzLCByZXN1bHQsIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIERlY29kZUFuc2lYMTJTZWdtZW50KCZiaXRzLCByZXN1bHQsIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNToNCi0gICAgICAgICAgICAgICAgICAgIERlY29kZUVkaWZhY3RTZWdtZW50KCZiaXRzLCByZXN1bHQsIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNjoNCi0gICAgICAgICAgICAgICAgICAgIERlY29kZUJhc2UyNTZTZWdtZW50KCZiaXRzLCByZXN1bHQsIGJ5dGVTZWdtZW50cywgZSk7DQotICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIE5VTEw7DQotICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbW9kZSA9IEFTQ0lJX0VOQ09ERTsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAobW9kZSAhPSBQQURfRU5DT0RFICYmIGJpdHMuQXZhaWxhYmxlKCkgPiAwKTsNCi0gICAgaWYgKHJlc3VsdFRyYWlsZXIuR2V0TGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICByZXN1bHQgKz0gcmVzdWx0VHJhaWxlcjsNCi0gICAgfQ0KLSAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCAqdGVtcENwID0gIEZYX05FVyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCgpOw0KLSAgICB0ZW1wQ3AtPkluaXQoYnl0ZXMsIHJlc3VsdCwgKGJ5dGVTZWdtZW50cy5HZXRTaXplKCkgPD0gMCkgPyBDRlhfSW50MzJBcnJheSgpIDogYnl0ZVNlZ21lbnRzLCBOVUxMLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gdGVtcENwOw0KLX0NCi1pbnQzMl90IENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlQXNjaWlTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UgKmJpdHMsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIENGWF9CeXRlU3RyaW5nICZyZXN1bHRUcmFpbGVyLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgRlhfQ0hBUiBidWZmZXJbMTI4XTsNCi0gICAgRlhfQk9PTCB1cHBlclNoaWZ0ID0gRkFMU0U7DQotICAgIGRvIHsNCi0gICAgICAgIGludDMyX3Qgb25lQnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KLSAgICAgICAgaWYgKG9uZUJ5dGUgPT0gMCkgew0KLSAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0gZWxzZSBpZiAob25lQnl0ZSA8PSAxMjgpIHsNCi0gICAgICAgICAgICBvbmVCeXRlID0gdXBwZXJTaGlmdCA/IG9uZUJ5dGUgKyAxMjggOiBvbmVCeXRlOw0KLSAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCi0gICAgICAgICAgICByZXN1bHQgKz0gKChGWF9DSEFSKSAob25lQnl0ZSAtIDEpKTsNCi0gICAgICAgICAgICByZXR1cm4gQVNDSUlfRU5DT0RFOw0KLSAgICAgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDEyOSkgew0KLSAgICAgICAgICAgIHJldHVybiBQQURfRU5DT0RFOw0KLSAgICAgICAgfSBlbHNlIGlmIChvbmVCeXRlIDw9IDIyOSkgew0KLSAgICAgICAgICAgIGludDMyX3QgdmFsdWUgPSBvbmVCeXRlIC0gMTMwOw0KLSNpZiBkZWZpbmVkKF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8pDQotICAgICAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKEZYX0NIQVIpICogMTI4KTsNCi0gICAgICAgICAgICBfaXRvYV9zKHZhbHVlLCBidWZmZXIsIDEyOCwgMTApOw0KLSNlbHNlDQotICAgICAgICAgICAgRlhTWVNfaXRvYSh2YWx1ZSwgYnVmZmVyLCAxMCk7DQotI2VuZGlmDQotICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcwJzsNCi0gICAgICAgICAgICAgICAgYnVmZmVyWzFdID0gJ1wwJzsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBidWZmZXJbMl0gPSAnXDAnOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHQgKz0gYnVmZmVyOw0KLSAgICAgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDIzMCkgew0KLSAgICAgICAgICAgIHJldHVybiBDNDBfRU5DT0RFOw0KLSAgICAgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDIzMSkgew0KLSAgICAgICAgICAgIHJldHVybiBCQVNFMjU2X0VOQ09ERTsNCi0gICAgICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzIgfHwgb25lQnl0ZSA9PSAyMzMgfHwgb25lQnl0ZSA9PSAyMzQpIHsNCi0gICAgICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzUpIHsNCi0gICAgICAgICAgICB1cHBlclNoaWZ0ID0gVFJVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzYpIHsNCi0gICAgICAgICAgICByZXN1bHQgKz0gIlspPiI7DQotICAgICAgICAgICAgcmVzdWx0ICs9IDB4MUU7DQotICAgICAgICAgICAgcmVzdWx0ICs9ICIwNSI7DQotICAgICAgICAgICAgcmVzdWx0ICs9IDB4MUQ7DQotICAgICAgICAgICAgcmVzdWx0VHJhaWxlci5JbnNlcnQoMCwgMHgxRSk7DQotICAgICAgICAgICAgcmVzdWx0VHJhaWxlci5JbnNlcnQoMCArIDEsIDB4MDQpOw0KLSAgICAgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDIzNykgew0KLSAgICAgICAgICAgIHJlc3VsdCArPSAiWyk+IjsNCi0gICAgICAgICAgICByZXN1bHQgKz0gMHgxRTsNCi0gICAgICAgICAgICByZXN1bHQgKz0gIjA2IjsNCi0gICAgICAgICAgICByZXN1bHQgKz0gMHgxRDsNCi0gICAgICAgICAgICByZXN1bHRUcmFpbGVyLkluc2VydCgwLCAweDFFKTsNCi0gICAgICAgICAgICByZXN1bHRUcmFpbGVyLkluc2VydCgwICsgMSwgMHgwNCk7DQotICAgICAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjM4KSB7DQotICAgICAgICAgICAgcmV0dXJuIEFOU0lYMTJfRU5DT0RFOw0KLSAgICAgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDIzOSkgew0KLSAgICAgICAgICAgIHJldHVybiBURVhUX0VOQ09ERTsNCi0gICAgICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyNDApIHsNCi0gICAgICAgICAgICByZXR1cm4gRURJRkFDVF9FTkNPREU7DQotICAgICAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjQxKSB7DQotICAgICAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPj0gMjQyKSB7DQotICAgICAgICAgICAgaWYgKG9uZUJ5dGUgPT0gMjU0ICYmIGJpdHMtPkF2YWlsYWJsZSgpID09IDApIHsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQotICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAoYml0cy0+QXZhaWxhYmxlKCkgPiAwKTsNCi0gICAgcmV0dXJuIEFTQ0lJX0VOQ09ERTsNCi19DQotdm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZUM0MFNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSAqYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgaW50MzJfdCAmZSkNCi17DQotICAgIEZYX0JPT0wgdXBwZXJTaGlmdCA9IEZBTFNFOw0KLSAgICBDRlhfSW50MzJBcnJheSBjVmFsdWVzOw0KLSAgICBjVmFsdWVzLlNldFNpemUoMyk7DQotICAgIGRvIHsNCi0gICAgICAgIGlmIChiaXRzLT5BdmFpbGFibGUoKSA9PSA4KSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBmaXJzdEJ5dGUgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgaWYgKGZpcnN0Qnl0ZSA9PSAyNTQpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IHRlbXBwID0gYml0cy0+UmVhZEJpdHMoOCwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIFBhcnNlVHdvQnl0ZXMoZmlyc3RCeXRlLCB0ZW1wcCwgY1ZhbHVlcyk7DQotICAgICAgICBpbnQzMl90IHNoaWZ0ID0gMDsNCi0gICAgICAgIGludDMyX3QgaTsNCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsNCi0gICAgICAgICAgICBpbnQzMl90IGNWYWx1ZSA9IGNWYWx1ZXNbaV07DQotICAgICAgICAgICAgc3dpdGNoIChzaGlmdCkgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBpZiAoY1ZhbHVlIDwgMykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gY1ZhbHVlICsgMTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlIDwgMjcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIGM0MGNoYXIgPSBDNDBfQkFTSUNfU0VUX0NIQVJTW2NWYWx1ZV07DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwcGVyU2hpZnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSAoYzQwY2hhciArIDEyOCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gYzQwY2hhcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIGlmICh1cHBlclNoaWZ0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSAoY1ZhbHVlICsgMTI4KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNWYWx1ZSA8IDI3KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUiBjNDBjaGFyID0gQzQwX1NISUZUMl9TRVRfQ0hBUlNbY1ZhbHVlXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBwZXJTaGlmdCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpIChjNDBjaGFyICsgMTI4KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJTaGlmdCA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjNDBjaGFyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlID09IDI3KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlID09IDMwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJTaGlmdCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVwcGVyU2hpZnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpIChjVmFsdWUgKyAyMjQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSAoY1ZhbHVlICsgOTYpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGJpdHMtPkF2YWlsYWJsZSgpID4gMCk7DQotfQ0KLXZvaWQgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVUZXh0U2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlICpiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgRlhfQk9PTCB1cHBlclNoaWZ0ID0gRkFMU0U7DQotICAgIENGWF9JbnQzMkFycmF5IGNWYWx1ZXM7DQotICAgIGNWYWx1ZXMuU2V0U2l6ZSgzKTsNCi0gICAgaW50MzJfdCBzaGlmdCA9IDA7DQotICAgIGRvIHsNCi0gICAgICAgIGlmIChiaXRzLT5BdmFpbGFibGUoKSA9PSA4KSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBmaXJzdEJ5dGUgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgaWYgKGZpcnN0Qnl0ZSA9PSAyNTQpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGluVHAgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgUGFyc2VUd29CeXRlcyhmaXJzdEJ5dGUsIGluVHAsIGNWYWx1ZXMpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSsrKSB7DQotICAgICAgICAgICAgaW50MzJfdCBjVmFsdWUgPSBjVmFsdWVzW2ldOw0KLSAgICAgICAgICAgIHN3aXRjaCAoc2hpZnQpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNWYWx1ZSA8IDMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IGNWYWx1ZSArIDE7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA8IDQwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUiB0ZXh0Q2hhciA9IFRFWFRfQkFTSUNfU0VUX0NIQVJTW2NWYWx1ZV07DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwcGVyU2hpZnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSAodGV4dENoYXIgKyAxMjgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRleHRDaGFyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBpZiAodXBwZXJTaGlmdCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgKGNWYWx1ZSArIDEyOCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJTaGlmdCA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY1ZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjVmFsdWUgPCAyNykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NIQVIgYzQwY2hhciA9IEM0MF9TSElGVDJfU0VUX0NIQVJTW2NWYWx1ZV07DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwcGVyU2hpZnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSAoYzQwY2hhciArIDEyOCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gYzQwY2hhcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAyNykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAzMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjVmFsdWUgPCAxOSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NIQVIgdGV4dENoYXIgPSBURVhUX1NISUZUM19TRVRfQ0hBUlNbY1ZhbHVlXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBwZXJTaGlmdCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpICh0ZXh0Q2hhciArIDEyOCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGV4dENoYXI7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlIChiaXRzLT5BdmFpbGFibGUoKSA+IDApOw0KLX0NCi12b2lkIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlQW5zaVgxMlNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSAqYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9JbnQzMkFycmF5IGNWYWx1ZXM7DQotICAgIGNWYWx1ZXMuU2V0U2l6ZSgzKTsNCi0gICAgZG8gew0KLSAgICAgICAgaWYgKGJpdHMtPkF2YWlsYWJsZSgpID09IDgpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGZpcnN0Qnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICBpZiAoZmlyc3RCeXRlID09IDI1NCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaVRlbXAxID0gYml0cy0+UmVhZEJpdHMoOCwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIFBhcnNlVHdvQnl0ZXMoZmlyc3RCeXRlLCBpVGVtcDEsIGNWYWx1ZXMpOw0KLSAgICAgICAgaW50MzJfdCBpOw0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgew0KLSAgICAgICAgICAgIGludDMyX3QgY1ZhbHVlID0gY1ZhbHVlc1tpXTsNCi0gICAgICAgICAgICBpZiAoY1ZhbHVlID09IDApIHsNCi0gICAgICAgICAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCAnXHInKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAxKSB7DQotICAgICAgICAgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgJyonKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAyKSB7DQotICAgICAgICAgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgJz4nKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAzKSB7DQotICAgICAgICAgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgJyAnKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA8IDE0KSB7DQotICAgICAgICAgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgKEZYX0NIQVIpIChjVmFsdWUgKyA0NCkpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlIDwgNDApIHsNCi0gICAgICAgICAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCAoRlhfQ0hBUikgKGNWYWx1ZSArIDUxKSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlIChiaXRzLT5BdmFpbGFibGUoKSA+IDApOw0KLX0NCi12b2lkIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6UGFyc2VUd29CeXRlcyhpbnQzMl90IGZpcnN0Qnl0ZSwgaW50MzJfdCBzZWNvbmRCeXRlLCBDRlhfSW50MzJBcnJheSAmcmVzdWx0KQ0KLXsNCi0gICAgaW50MzJfdCBmdWxsQml0VmFsdWUgPSAoZmlyc3RCeXRlIDw8IDgpICsgc2Vjb25kQnl0ZSAtIDE7DQotICAgIGludDMyX3QgdGVtcCA9IGZ1bGxCaXRWYWx1ZSAvIDE2MDA7DQotICAgIHJlc3VsdFswXSA9IHRlbXA7DQotICAgIGZ1bGxCaXRWYWx1ZSAtPSB0ZW1wICogMTYwMDsNCi0gICAgdGVtcCA9IGZ1bGxCaXRWYWx1ZSAvIDQwOw0KLSAgICByZXN1bHRbMV0gPSB0ZW1wOw0KLSAgICByZXN1bHRbMl0gPSBmdWxsQml0VmFsdWUgLSB0ZW1wICogNDA7DQotfQ0KLXZvaWQgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVFZGlmYWN0U2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlICpiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgRlhfQ0hBUiBidWZmZXJbMTI4XTsNCi0gICAgRlhfQk9PTCB1bmxhdGNoID0gRkFMU0U7DQotICAgIGRvIHsNCi0gICAgICAgIGlmIChiaXRzLT5BdmFpbGFibGUoKSA8PSAxNikgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaTsNCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsNCi0gICAgICAgICAgICBpbnQzMl90IGVkaWZhY3RWYWx1ZSA9IGJpdHMtPlJlYWRCaXRzKDYsIGUpOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgICAgIGlmIChlZGlmYWN0VmFsdWUgPT0gMHgxRikgew0KLSAgICAgICAgICAgICAgICB1bmxhdGNoID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCF1bmxhdGNoKSB7DQotICAgICAgICAgICAgICAgIGlmICgoZWRpZmFjdFZhbHVlICYgMzIpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGVkaWZhY3RWYWx1ZSB8PSA2NDsNCi0gICAgICAgICAgICAgICAgfQ0KLSNpZiBkZWZpbmVkKF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8pDQotICAgICAgICAgICAgICAgIG1lbXNldChidWZmZXIsIDAsIHNpemVvZihGWF9DSEFSKSAqIDEyOCk7DQotICAgICAgICAgICAgICAgIF9pdG9hX3MoZWRpZmFjdFZhbHVlLCBidWZmZXIsIDEyOCwgMTApOw0KLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gYnVmZmVyOw0KLSNlbHNlDQotICAgICAgICAgICAgICAgIHJlc3VsdCArPSBGWFNZU19pdG9hKGVkaWZhY3RWYWx1ZSwgYnVmZmVyLCAxMCk7DQotI2VuZGlmDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlICghdW5sYXRjaCAmJiBiaXRzLT5BdmFpbGFibGUoKSA+IDApOw0KLX0NCi12b2lkIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlQmFzZTI1NlNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSAqYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgQ0ZYX0ludDMyQXJyYXkgJmJ5dGVTZWdtZW50cywgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgY29kZXdvcmRQb3NpdGlvbiA9IDEgKyBiaXRzLT5nZXRCeXRlT2Zmc2V0KCk7DQotICAgIGludDMyX3QgaVRtcCA9ICBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIGludDMyX3QgZDEgPSBVbnJhbmRvbWl6ZTI1NVN0YXRlKGlUbXAsIGNvZGV3b3JkUG9zaXRpb24rKyk7DQotICAgIGludDMyX3QgY291bnQ7DQotICAgIGlmIChkMSA9PSAwKSB7DQotICAgICAgICBjb3VudCA9IGJpdHMtPkF2YWlsYWJsZSgpIC8gODsNCi0gICAgfSBlbHNlIGlmIChkMSA8IDI1MCkgew0KLSAgICAgICAgY291bnQgPSBkMTsNCitDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkNCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcigpIHt9DQorQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjp+Q0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyKCkge30NCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGUoDQorICAgIENGWF9CeXRlQXJyYXkmIGJ5dGVzLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQ29tbW9uQml0U291cmNlIGJpdHMoJmJ5dGVzKTsNCisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdFRyYWlsZXI7DQorICBDRlhfSW50MzJBcnJheSBieXRlU2VnbWVudHM7DQorICBpbnQzMl90IG1vZGUgPSBBU0NJSV9FTkNPREU7DQorICBkbyB7DQorICAgIGlmIChtb2RlID09IDEpIHsNCisgICAgICBtb2RlID0gRGVjb2RlQXNjaWlTZWdtZW50KCZiaXRzLCByZXN1bHQsIHJlc3VsdFRyYWlsZXIsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIGludDMyX3QgaVRtcDMgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgY291bnQgPSAyNTAgKiAoZDEgLSAyNDkpICsgVW5yYW5kb21pemUyNTVTdGF0ZShpVG1wMywgY29kZXdvcmRQb3NpdGlvbisrKTsNCisgICAgICBzd2l0Y2ggKG1vZGUpIHsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgRGVjb2RlQzQwU2VnbWVudCgmYml0cywgcmVzdWx0LCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgRGVjb2RlVGV4dFNlZ21lbnQoJmJpdHMsIHJlc3VsdCwgZSk7DQorICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgIERlY29kZUFuc2lYMTJTZWdtZW50KCZiaXRzLCByZXN1bHQsIGUpOw0KKyAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSA1Og0KKyAgICAgICAgICBEZWNvZGVFZGlmYWN0U2VnbWVudCgmYml0cywgcmVzdWx0LCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNjoNCisgICAgICAgICAgRGVjb2RlQmFzZTI1NlNlZ21lbnQoJmJpdHMsIHJlc3VsdCwgYnl0ZVNlZ21lbnRzLCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIE5VTEw7DQorICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIG1vZGUgPSBBU0NJSV9FTkNPREU7DQogICAgIH0NCi0gICAgaWYgKGNvdW50IDwgMCkgew0KKyAgfSB3aGlsZSAobW9kZSAhPSBQQURfRU5DT0RFICYmIGJpdHMuQXZhaWxhYmxlKCkgPiAwKTsNCisgIGlmIChyZXN1bHRUcmFpbGVyLkdldExlbmd0aCgpID4gMCkgew0KKyAgICByZXN1bHQgKz0gcmVzdWx0VHJhaWxlcjsNCisgIH0NCisgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiB0ZW1wQ3AgPSBGWF9ORVcgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKTsNCisgIHRlbXBDcC0+SW5pdChieXRlcywgcmVzdWx0LA0KKyAgICAgICAgICAgICAgIChieXRlU2VnbWVudHMuR2V0U2l6ZSgpIDw9IDApID8gQ0ZYX0ludDMyQXJyYXkoKSA6IGJ5dGVTZWdtZW50cywNCisgICAgICAgICAgICAgICBOVUxMLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiB0ZW1wQ3A7DQorfQ0KK2ludDMyX3QgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVBc2NpaVNlZ21lbnQoDQorICAgIENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHRUcmFpbGVyLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBGWF9DSEFSIGJ1ZmZlclsxMjhdOw0KKyAgRlhfQk9PTCB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICBkbyB7DQorICAgIGludDMyX3Qgb25lQnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgIGlmIChvbmVCeXRlID09IDApIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA8PSAxMjgpIHsNCisgICAgICBvbmVCeXRlID0gdXBwZXJTaGlmdCA/IG9uZUJ5dGUgKyAxMjggOiBvbmVCeXRlOw0KKyAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgICAgICByZXN1bHQgKz0gKChGWF9DSEFSKShvbmVCeXRlIC0gMSkpOw0KKyAgICAgIHJldHVybiBBU0NJSV9FTkNPREU7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAxMjkpIHsNCisgICAgICByZXR1cm4gUEFEX0VOQ09ERTsNCisgICAgfSBlbHNlIGlmIChvbmVCeXRlIDw9IDIyOSkgew0KKyAgICAgIGludDMyX3QgdmFsdWUgPSBvbmVCeXRlIC0gMTMwOw0KKyNpZiBkZWZpbmVkKF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8pDQorICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKEZYX0NIQVIpICogMTI4KTsNCisgICAgICBfaXRvYV9zKHZhbHVlLCBidWZmZXIsIDEyOCwgMTApOw0KKyNlbHNlDQorICAgICAgRlhTWVNfaXRvYSh2YWx1ZSwgYnVmZmVyLCAxMCk7DQorI2VuZGlmDQorICAgICAgaWYgKHZhbHVlIDwgMTApIHsNCisgICAgICAgIHJlc3VsdCArPSAnMCc7DQorICAgICAgICBidWZmZXJbMV0gPSAnXDAnOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBidWZmZXJbMl0gPSAnXDAnOw0KKyAgICAgIH0NCisgICAgICByZXN1bHQgKz0gYnVmZmVyOw0KKyAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjMwKSB7DQorICAgICAgcmV0dXJuIEM0MF9FTkNPREU7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzEpIHsNCisgICAgICByZXR1cm4gQkFTRTI1Nl9FTkNPREU7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzIgfHwgb25lQnl0ZSA9PSAyMzMgfHwgb25lQnl0ZSA9PSAyMzQpIHsNCisgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDIzNSkgew0KKyAgICAgIHVwcGVyU2hpZnQgPSBUUlVFOw0KKyAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjM2KSB7DQorICAgICAgcmVzdWx0ICs9ICJbKT4iOw0KKyAgICAgIHJlc3VsdCArPSAweDFFOw0KKyAgICAgIHJlc3VsdCArPSAiMDUiOw0KKyAgICAgIHJlc3VsdCArPSAweDFEOw0KKyAgICAgIHJlc3VsdFRyYWlsZXIuSW5zZXJ0KDAsIDB4MUUpOw0KKyAgICAgIHJlc3VsdFRyYWlsZXIuSW5zZXJ0KDAgKyAxLCAweDA0KTsNCisgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDIzNykgew0KKyAgICAgIHJlc3VsdCArPSAiWyk+IjsNCisgICAgICByZXN1bHQgKz0gMHgxRTsNCisgICAgICByZXN1bHQgKz0gIjA2IjsNCisgICAgICByZXN1bHQgKz0gMHgxRDsNCisgICAgICByZXN1bHRUcmFpbGVyLkluc2VydCgwLCAweDFFKTsNCisgICAgICByZXN1bHRUcmFpbGVyLkluc2VydCgwICsgMSwgMHgwNCk7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzgpIHsNCisgICAgICByZXR1cm4gQU5TSVgxMl9FTkNPREU7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzkpIHsNCisgICAgICByZXR1cm4gVEVYVF9FTkNPREU7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyNDApIHsNCisgICAgICByZXR1cm4gRURJRkFDVF9FTkNPREU7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyNDEpIHsNCisgICAgfSBlbHNlIGlmIChvbmVCeXRlID49IDI0Mikgew0KKyAgICAgIGlmIChvbmVCeXRlID09IDI1NCAmJiBiaXRzLT5BdmFpbGFibGUoKSA9PSAwKSB7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSB3aGlsZSAoYml0cy0+QXZhaWxhYmxlKCkgPiAwKTsNCisgIHJldHVybiBBU0NJSV9FTkNPREU7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVDNDBTZWdtZW50KA0KKyAgICBDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLA0KKyAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBGWF9CT09MIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgIENGWF9JbnQzMkFycmF5IGNWYWx1ZXM7DQorICBjVmFsdWVzLlNldFNpemUoMyk7DQorICBkbyB7DQorICAgIGlmIChiaXRzLT5BdmFpbGFibGUoKSA9PSA4KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGludDMyX3QgZmlyc3RCeXRlID0gYml0cy0+UmVhZEJpdHMoOCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBpZiAoZmlyc3RCeXRlID09IDI1NCkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpbnQzMl90IHRlbXBwID0gYml0cy0+UmVhZEJpdHMoOCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBQYXJzZVR3b0J5dGVzKGZpcnN0Qnl0ZSwgdGVtcHAsIGNWYWx1ZXMpOw0KKyAgICBpbnQzMl90IHNoaWZ0ID0gMDsNCisgICAgaW50MzJfdCBpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgaW50MzJfdCBjVmFsdWUgPSBjVmFsdWVzW2ldOw0KKyAgICAgIHN3aXRjaCAoc2hpZnQpIHsNCisgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgaWYgKGNWYWx1ZSA8IDMpIHsNCisgICAgICAgICAgICBzaGlmdCA9IGNWYWx1ZSArIDE7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlIDwgMjcpIHsNCisgICAgICAgICAgICBGWF9DSEFSIGM0MGNoYXIgPSBDNDBfQkFTSUNfU0VUX0NIQVJTW2NWYWx1ZV07DQorICAgICAgICAgICAgaWYgKHVwcGVyU2hpZnQpIHsNCisgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikoYzQwY2hhciArIDEyOCk7DQorICAgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJlc3VsdCArPSBjNDBjaGFyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICBpZiAodXBwZXJTaGlmdCkgew0KKyAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikoY1ZhbHVlICsgMTI4KTsNCisgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9IGNWYWx1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaGlmdCA9IDA7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICBpZiAoY1ZhbHVlIDwgMjcpIHsNCisgICAgICAgICAgICBGWF9DSEFSIGM0MGNoYXIgPSBDNDBfU0hJRlQyX1NFVF9DSEFSU1tjVmFsdWVdOw0KKyAgICAgICAgICAgIGlmICh1cHBlclNoaWZ0KSB7DQorICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpKGM0MGNoYXIgKyAxMjgpOw0KKyAgICAgICAgICAgICAgdXBwZXJTaGlmdCA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXN1bHQgKz0gYzQwY2hhcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlID09IDI3KSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfSBlbHNlIGlmIChjVmFsdWUgPT0gMzApIHsNCisgICAgICAgICAgICB1cHBlclNoaWZ0ID0gVFJVRTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNoaWZ0ID0gMDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDM6DQorICAgICAgICAgIGlmICh1cHBlclNoaWZ0KSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKShjVmFsdWUgKyAyMjQpOw0KKyAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpKGNWYWx1ZSArIDk2KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaGlmdCA9IDA7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSB3aGlsZSAoYml0cy0+QXZhaWxhYmxlKCkgPiAwKTsNCit9DQordm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZVRleHRTZWdtZW50KA0KKyAgICBDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLA0KKyAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBGWF9CT09MIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgIENGWF9JbnQzMkFycmF5IGNWYWx1ZXM7DQorICBjVmFsdWVzLlNldFNpemUoMyk7DQorICBpbnQzMl90IHNoaWZ0ID0gMDsNCisgIGRvIHsNCisgICAgaWYgKGJpdHMtPkF2YWlsYWJsZSgpID09IDgpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaW50MzJfdCBmaXJzdEJ5dGUgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIGlmIChmaXJzdEJ5dGUgPT0gMjU0KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGludDMyX3QgaW5UcCA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgUGFyc2VUd29CeXRlcyhmaXJzdEJ5dGUsIGluVHAsIGNWYWx1ZXMpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCisgICAgICBpbnQzMl90IGNWYWx1ZSA9IGNWYWx1ZXNbaV07DQorICAgICAgc3dpdGNoIChzaGlmdCkgew0KKyAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICBpZiAoY1ZhbHVlIDwgMykgew0KKyAgICAgICAgICAgIHNoaWZ0ID0gY1ZhbHVlICsgMTsNCisgICAgICAgICAgfSBlbHNlIGlmIChjVmFsdWUgPCA0MCkgew0KKyAgICAgICAgICAgIEZYX0NIQVIgdGV4dENoYXIgPSBURVhUX0JBU0lDX1NFVF9DSEFSU1tjVmFsdWVdOw0KKyAgICAgICAgICAgIGlmICh1cHBlclNoaWZ0KSB7DQorICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpKHRleHRDaGFyICsgMTI4KTsNCisgICAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmVzdWx0ICs9IHRleHRDaGFyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICBpZiAodXBwZXJTaGlmdCkgew0KKyAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikoY1ZhbHVlICsgMTI4KTsNCisgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9IGNWYWx1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaGlmdCA9IDA7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICBpZiAoY1ZhbHVlIDwgMjcpIHsNCisgICAgICAgICAgICBGWF9DSEFSIGM0MGNoYXIgPSBDNDBfU0hJRlQyX1NFVF9DSEFSU1tjVmFsdWVdOw0KKyAgICAgICAgICAgIGlmICh1cHBlclNoaWZ0KSB7DQorICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpKGM0MGNoYXIgKyAxMjgpOw0KKyAgICAgICAgICAgICAgdXBwZXJTaGlmdCA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXN1bHQgKz0gYzQwY2hhcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlID09IDI3KSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfSBlbHNlIGlmIChjVmFsdWUgPT0gMzApIHsNCisgICAgICAgICAgICB1cHBlclNoaWZ0ID0gVFJVRTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHNoaWZ0ID0gMDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDM6DQorICAgICAgICAgIGlmIChjVmFsdWUgPCAxOSkgew0KKyAgICAgICAgICAgIEZYX0NIQVIgdGV4dENoYXIgPSBURVhUX1NISUZUM19TRVRfQ0hBUlNbY1ZhbHVlXTsNCisgICAgICAgICAgICBpZiAodXBwZXJTaGlmdCkgew0KKyAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSh0ZXh0Q2hhciArIDEyOCk7DQorICAgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJlc3VsdCArPSB0ZXh0Q2hhcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc2hpZnQgPSAwOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICB9DQorICB9IHdoaWxlIChiaXRzLT5BdmFpbGFibGUoKSA+IDApOw0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlQW5zaVgxMlNlZ21lbnQoDQorICAgIENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9JbnQzMkFycmF5IGNWYWx1ZXM7DQorICBjVmFsdWVzLlNldFNpemUoMyk7DQorICBkbyB7DQorICAgIGlmIChiaXRzLT5BdmFpbGFibGUoKSA9PSA4KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGludDMyX3QgZmlyc3RCeXRlID0gYml0cy0+UmVhZEJpdHMoOCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBpZiAoZmlyc3RCeXRlID09IDI1NCkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlUZW1wMSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgUGFyc2VUd29CeXRlcyhmaXJzdEJ5dGUsIGlUZW1wMSwgY1ZhbHVlcyk7DQorICAgIGludDMyX3QgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICAgIGludDMyX3QgY1ZhbHVlID0gY1ZhbHVlc1tpXTsNCisgICAgICBpZiAoY1ZhbHVlID09IDApIHsNCisgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgJ1xyJyk7DQorICAgICAgfSBlbHNlIGlmIChjVmFsdWUgPT0gMSkgew0KKyAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCAnKicpOw0KKyAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlID09IDIpIHsNCisgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgJz4nKTsNCisgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAzKSB7DQorICAgICAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsICcgJyk7DQorICAgICAgfSBlbHNlIGlmIChjVmFsdWUgPCAxNCkgew0KKyAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCAoRlhfQ0hBUikoY1ZhbHVlICsgNDQpKTsNCisgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA8IDQwKSB7DQorICAgICAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsIChGWF9DSEFSKShjVmFsdWUgKyA1MSkpOw0KKyAgICAgIH0gZWxzZSB7DQogICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQogICAgICAgICByZXR1cm47DQorICAgICAgfQ0KICAgICB9DQotICAgIENGWF9CeXRlQXJyYXkgKmJ5dGVzID0gRlhfTkVXIENGWF9CeXRlQXJyYXkoKTsNCi0gICAgYnl0ZXMtPlNldFNpemUoY291bnQpOw0KLSAgICBpbnQzMl90IGk7DQotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQotICAgICAgICBpZiAoYml0cy0+QXZhaWxhYmxlKCkgPCA4KSB7DQotICAgICAgICAgICAgZSAgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCi0gICAgICAgICAgICBkZWxldGUgYnl0ZXM7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpVGVtcDUgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBkZWxldGUgYnl0ZXM7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnl0ZXMtPlNldEF0KGksIFVucmFuZG9taXplMjU1U3RhdGUoaVRlbXA1LCBjb2Rld29yZFBvc2l0aW9uKyspKTsNCi0gICAgfQ0KLSAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsICpieXRlcyk7DQotICAgIGRlbGV0ZSBieXRlczsNCisgIH0gd2hpbGUgKGJpdHMtPkF2YWlsYWJsZSgpID4gMCk7DQogfQ0KLXVpbnQ4X3QgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpVbnJhbmRvbWl6ZTI1NVN0YXRlKGludDMyX3QgcmFuZG9taXplZEJhc2UyNTZDb2Rld29yZCwgaW50MzJfdCBiYXNlMjU2Q29kZXdvcmRQb3NpdGlvbikNCi17DQotICAgIGludDMyX3QgcHNldWRvUmFuZG9tTnVtYmVyID0gKCgxNDkgKiBiYXNlMjU2Q29kZXdvcmRQb3NpdGlvbikgJSAyNTUpICsgMTsNCi0gICAgaW50MzJfdCB0ZW1wVmFyaWFibGUgPSByYW5kb21pemVkQmFzZTI1NkNvZGV3b3JkIC0gcHNldWRvUmFuZG9tTnVtYmVyOw0KLSAgICByZXR1cm4gKHVpbnQ4X3QpICh0ZW1wVmFyaWFibGUgPj0gMCA/IHRlbXBWYXJpYWJsZSA6IHRlbXBWYXJpYWJsZSArIDI1Nik7DQordm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlBhcnNlVHdvQnl0ZXMoDQorICAgIGludDMyX3QgZmlyc3RCeXRlLA0KKyAgICBpbnQzMl90IHNlY29uZEJ5dGUsDQorICAgIENGWF9JbnQzMkFycmF5JiByZXN1bHQpIHsNCisgIGludDMyX3QgZnVsbEJpdFZhbHVlID0gKGZpcnN0Qnl0ZSA8PCA4KSArIHNlY29uZEJ5dGUgLSAxOw0KKyAgaW50MzJfdCB0ZW1wID0gZnVsbEJpdFZhbHVlIC8gMTYwMDsNCisgIHJlc3VsdFswXSA9IHRlbXA7DQorICBmdWxsQml0VmFsdWUgLT0gdGVtcCAqIDE2MDA7DQorICB0ZW1wID0gZnVsbEJpdFZhbHVlIC8gNDA7DQorICByZXN1bHRbMV0gPSB0ZW1wOw0KKyAgcmVzdWx0WzJdID0gZnVsbEJpdFZhbHVlIC0gdGVtcCAqIDQwOw0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlRWRpZmFjdFNlZ21lbnQoDQorICAgIENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgIGludDMyX3QmIGUpIHsNCisgIEZYX0NIQVIgYnVmZmVyWzEyOF07DQorICBGWF9CT09MIHVubGF0Y2ggPSBGQUxTRTsNCisgIGRvIHsNCisgICAgaWYgKGJpdHMtPkF2YWlsYWJsZSgpIDw9IDE2KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGludDMyX3QgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgew0KKyAgICAgIGludDMyX3QgZWRpZmFjdFZhbHVlID0gYml0cy0+UmVhZEJpdHMoNiwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgaWYgKGVkaWZhY3RWYWx1ZSA9PSAweDFGKSB7DQorICAgICAgICB1bmxhdGNoID0gVFJVRTsNCisgICAgICB9DQorICAgICAgaWYgKCF1bmxhdGNoKSB7DQorICAgICAgICBpZiAoKGVkaWZhY3RWYWx1ZSAmIDMyKSA9PSAwKSB7DQorICAgICAgICAgIGVkaWZhY3RWYWx1ZSB8PSA2NDsNCisgICAgICAgIH0NCisjaWYgZGVmaW5lZChfRlhfV0lOQVBJX1BBUlRJVElPTl9BUFBfKQ0KKyAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKEZYX0NIQVIpICogMTI4KTsNCisgICAgICAgIF9pdG9hX3MoZWRpZmFjdFZhbHVlLCBidWZmZXIsIDEyOCwgMTApOw0KKyAgICAgICAgcmVzdWx0ICs9IGJ1ZmZlcjsNCisjZWxzZQ0KKyAgICAgICAgcmVzdWx0ICs9IEZYU1lTX2l0b2EoZWRpZmFjdFZhbHVlLCBidWZmZXIsIDEwKTsNCisjZW5kaWYNCisgICAgICB9DQorICAgIH0NCisgIH0gd2hpbGUgKCF1bmxhdGNoICYmIGJpdHMtPkF2YWlsYWJsZSgpID4gMCk7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVCYXNlMjU2U2VnbWVudCgNCisgICAgQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgQ0ZYX0ludDMyQXJyYXkmIGJ5dGVTZWdtZW50cywNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBjb2Rld29yZFBvc2l0aW9uID0gMSArIGJpdHMtPmdldEJ5dGVPZmZzZXQoKTsNCisgIGludDMyX3QgaVRtcCA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBpbnQzMl90IGQxID0gVW5yYW5kb21pemUyNTVTdGF0ZShpVG1wLCBjb2Rld29yZFBvc2l0aW9uKyspOw0KKyAgaW50MzJfdCBjb3VudDsNCisgIGlmIChkMSA9PSAwKSB7DQorICAgIGNvdW50ID0gYml0cy0+QXZhaWxhYmxlKCkgLyA4Ow0KKyAgfSBlbHNlIGlmIChkMSA8IDI1MCkgew0KKyAgICBjb3VudCA9IGQxOw0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBpVG1wMyA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgY291bnQgPSAyNTAgKiAoZDEgLSAyNDkpICsgVW5yYW5kb21pemUyNTVTdGF0ZShpVG1wMywgY29kZXdvcmRQb3NpdGlvbisrKTsNCisgIH0NCisgIGlmIChjb3VudCA8IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfQnl0ZUFycmF5KiBieXRlcyA9IEZYX05FVyBDRlhfQnl0ZUFycmF5KCk7DQorICBieXRlcy0+U2V0U2l6ZShjb3VudCk7DQorICBpbnQzMl90IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICBpZiAoYml0cy0+QXZhaWxhYmxlKCkgPCA4KSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgIGRlbGV0ZSBieXRlczsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaW50MzJfdCBpVGVtcDUgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGRlbGV0ZSBieXRlczsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgYnl0ZXMtPlNldEF0KGksIFVucmFuZG9taXplMjU1U3RhdGUoaVRlbXA1LCBjb2Rld29yZFBvc2l0aW9uKyspKTsNCisgIH0NCisgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgKmJ5dGVzKTsNCisgIGRlbGV0ZSBieXRlczsNCit9DQordWludDhfdCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlVucmFuZG9taXplMjU1U3RhdGUoDQorICAgIGludDMyX3QgcmFuZG9taXplZEJhc2UyNTZDb2Rld29yZCwNCisgICAgaW50MzJfdCBiYXNlMjU2Q29kZXdvcmRQb3NpdGlvbikgew0KKyAgaW50MzJfdCBwc2V1ZG9SYW5kb21OdW1iZXIgPSAoKDE0OSAqIGJhc2UyNTZDb2Rld29yZFBvc2l0aW9uKSAlIDI1NSkgKyAxOw0KKyAgaW50MzJfdCB0ZW1wVmFyaWFibGUgPSByYW5kb21pemVkQmFzZTI1NkNvZGV3b3JkIC0gcHNldWRvUmFuZG9tTnVtYmVyOw0KKyAgcmV0dXJuICh1aW50OF90KSh0ZW1wVmFyaWFibGUgPj0gMCA/IHRlbXBWYXJpYWJsZSA6IHRlbXBWYXJpYWJsZSArIDI1Nik7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuaAppbmRleCA0ZmE1NDA3Li4wNGFkMzk2IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oCkBAIC04LDM1ICs4LDUwIEBACiAjZGVmaW5lIF9CQ19EQVRBTUFUUklYREVDT0RFREJJVFNUUkVBTVBBUlNFUl9IXw0KIGNsYXNzIENCQ19Db21tb25EZWNvZGVyUmVzdWx0Ow0KIGNsYXNzIENCQ19Db21tb25CaXRTb3VyY2U7DQotY2xhc3MgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcigpOw0KLSAgICBzdGF0aWMgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQgKkRlY29kZShDRlhfQnl0ZUFycmF5ICZieXRlcywgaW50MzJfdCAmZSk7DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyIHsNCisgcHVibGljOg0KKyAgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyKCk7DQorICB2aXJ0dWFsIH5DQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIoKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogRGVjb2RlKENGWF9CeXRlQXJyYXkmIGJ5dGVzLCBpbnQzMl90JiBlKTsNCiANCi1wcml2YXRlOg0KLSAgICBzdGF0aWMgaW50MzJfdCBEZWNvZGVBc2NpaVNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSAqYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdFRyYWlsZXIsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBEZWNvZGVDNDBTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UgKmJpdHMsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBEZWNvZGVUZXh0U2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlICpiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgRGVjb2RlQW5zaVgxMlNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSAqYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIFBhcnNlVHdvQnl0ZXMoaW50MzJfdCBmaXJzdEJ5dGUsIGludDMyX3Qgc2Vjb25kQnl0ZSwgQ0ZYX0ludDMyQXJyYXkgJnJlc3VsdCk7DQotICAgIHN0YXRpYyB2b2lkIERlY29kZUVkaWZhY3RTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UgKmJpdHMsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBEZWNvZGVCYXNlMjU2U2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlICpiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBDRlhfSW50MzJBcnJheSAmYnl0ZVNlZ21lbnRzLCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHVpbnQ4X3QgVW5yYW5kb21pemUyNTVTdGF0ZShpbnQzMl90IHJhbmRvbWl6ZWRCYXNlMjU2Q29kZXdvcmQsIGludDMyX3QgYmFzZTI1NkNvZGV3b3JkUG9zaXRpb24pOw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIGludDMyX3QgRGVjb2RlQXNjaWlTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0VHJhaWxlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIERlY29kZUM0MFNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBEZWNvZGVUZXh0U2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRGVjb2RlQW5zaVgxMlNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIFBhcnNlVHdvQnl0ZXMoaW50MzJfdCBmaXJzdEJ5dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vjb25kQnl0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIHJlc3VsdCk7DQorICBzdGF0aWMgdm9pZCBEZWNvZGVFZGlmYWN0U2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRGVjb2RlQmFzZTI1NlNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgYnl0ZVNlZ21lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdWludDhfdCBVbnJhbmRvbWl6ZTI1NVN0YXRlKGludDMyX3QgcmFuZG9taXplZEJhc2UyNTZDb2Rld29yZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXNlMjU2Q29kZXdvcmRQb3NpdGlvbik7DQogDQotICAgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIEM0MF9CQVNJQ19TRVRfQ0hBUlNbXTsNCi0gICAgY29uc3Qgc3RhdGljIEZYX0NIQVIgQzQwX1NISUZUMl9TRVRfQ0hBUlNbXTsNCisgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIEM0MF9CQVNJQ19TRVRfQ0hBUlNbXTsNCisgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIEM0MF9TSElGVDJfU0VUX0NIQVJTW107DQogDQotDQotICAgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIFRFWFRfQkFTSUNfU0VUX0NIQVJTW107DQotICAgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIFRFWFRfU0hJRlQzX1NFVF9DSEFSU1tdOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBQQURfRU5DT0RFOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBBU0NJSV9FTkNPREU7DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEM0MF9FTkNPREU7DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFRFWFRfRU5DT0RFOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBBTlNJWDEyX0VOQ09ERTsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgRURJRkFDVF9FTkNPREU7DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEJBU0UyNTZfRU5DT0RFOw0KKyAgY29uc3Qgc3RhdGljIEZYX0NIQVIgVEVYVF9CQVNJQ19TRVRfQ0hBUlNbXTsNCisgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIFRFWFRfU0hJRlQzX1NFVF9DSEFSU1tdOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgUEFEX0VOQ09ERTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEFTQ0lJX0VOQ09ERTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEM0MF9FTkNPREU7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBURVhUX0VOQ09ERTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEFOU0lYMTJfRU5DT0RFOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgRURJRkFDVF9FTkNPREU7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBCQVNFMjU2X0VOQ09ERTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGVjb2Rlci5jcHAKaW5kZXggOGRmZGVhOC4uZDBmZTM3ZiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGVjb2Rlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGVjb2Rlci5jcHAKQEAgLTI5LDgyICsyOSw4NyBAQAogI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhWZXJzaW9uLmgiDQogI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhEYXRhQmxvY2suaCINCiAjaW5jbHVkZSAiQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCi1DQkNfRGF0YU1hdHJpeERlY29kZXI6OkNCQ19EYXRhTWF0cml4RGVjb2RlcigpDQotew0KLSAgICBtX3JzRGVjb2RlciA9IE5VTEw7DQorQ0JDX0RhdGFNYXRyaXhEZWNvZGVyOjpDQkNfRGF0YU1hdHJpeERlY29kZXIoKSB7DQorICBtX3JzRGVjb2RlciA9IE5VTEw7DQogfQ0KLXZvaWQgQ0JDX0RhdGFNYXRyaXhEZWNvZGVyOjpJbml0KCkNCi17DQotICAgIG1fcnNEZWNvZGVyID0gRlhfTkVXIENCQ19SZWVkU29sb21vbkRlY29kZXIoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkRhdGFNYXRyaXhGaWVsZCk7DQordm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZXI6OkluaXQoKSB7DQorICBtX3JzRGVjb2RlciA9DQorICAgICAgRlhfTkVXIENCQ19SZWVkU29sb21vbkRlY29kZXIoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkRhdGFNYXRyaXhGaWVsZCk7DQogfQ0KLUNCQ19EYXRhTWF0cml4RGVjb2Rlcjo6fkNCQ19EYXRhTWF0cml4RGVjb2RlcigpDQotew0KLSAgICBpZihtX3JzRGVjb2RlciAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgbV9yc0RlY29kZXI7DQotICAgIH0NCi0gICAgbV9yc0RlY29kZXIgPSBOVUxMOw0KK0NCQ19EYXRhTWF0cml4RGVjb2Rlcjo6fkNCQ19EYXRhTWF0cml4RGVjb2RlcigpIHsNCisgIGlmIChtX3JzRGVjb2RlciAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX3JzRGVjb2RlcjsNCisgIH0NCisgIG1fcnNEZWNvZGVyID0gTlVMTDsNCiB9DQotQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQgKkNCQ19EYXRhTWF0cml4RGVjb2Rlcjo6RGVjb2RlKENCQ19Db21tb25CaXRNYXRyaXggKmJpdHMsIGludDMyX3QgJmUpDQotew0KLSAgICBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlciBwYXJzZXI7DQotICAgIHBhcnNlci5Jbml0KGJpdHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIENCQ19EYXRhTWF0cml4VmVyc2lvbiAqdmVyc2lvbiA9IHBhcnNlci5HZXRWZXJzaW9uKCk7DQotICAgIENGWF9CeXRlQXJyYXkqIGJ5dGVUZW1wID0gcGFyc2VyLlJlYWRDb2Rld29yZHMoZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0ZYX0J5dGVBcnJheT4gY29kZXdvcmRzKGJ5dGVUZW1wKTsNCi0gICAgQ0ZYX1B0ckFycmF5ICpkYXRhQmxvY2tzID0gQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6OkdldERhdGFCbG9ja3MoY29kZXdvcmRzLmdldCgpLCB2ZXJzaW9uLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBpbnQzMl90IGRhdGFCbG9ja3NDb3VudCA9IGRhdGFCbG9ja3MtPkdldFNpemUoKTsNCi0gICAgaW50MzJfdCB0b3RhbEJ5dGVzID0gMDsNCi0gICAgaW50MzJfdCBpLCBqOw0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUJsb2Nrc0NvdW50OyBpKyspIHsNCi0gICAgICAgIHRvdGFsQnl0ZXMgKz0gKChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpkYXRhQmxvY2tzKVtpXSktPkdldE51bURhdGFDb2Rld29yZHMoKTsNCi0gICAgfQ0KLSAgICBDRlhfQnl0ZUFycmF5IHJlc3VsdEJ5dGVzOw0KLSAgICByZXN1bHRCeXRlcy5TZXRTaXplKHRvdGFsQnl0ZXMpOw0KLSAgICBmb3IgKGogPSAwOyBqIDwgZGF0YUJsb2Nrc0NvdW50OyBqKyspIHsNCi0gICAgICAgIENGWF9CeXRlQXJyYXkgKmNvZGV3b3JkQnl0ZXMgPSAoKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2pdKS0+R2V0Q29kZXdvcmRzKCk7DQotICAgICAgICBpbnQzMl90IG51bURhdGFDb2Rld29yZHMgPSAoKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2pdKS0+R2V0TnVtRGF0YUNvZGV3b3JkcygpOw0KLSAgICAgICAgQ29ycmVjdEVycm9ycygqY29kZXdvcmRCeXRlcywgbnVtRGF0YUNvZGV3b3JkcywgZSk7DQotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBkYXRhQmxvY2tzLT5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICBkZWxldGUgKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2ldOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkZWxldGUgZGF0YUJsb2NrczsNCi0gICAgICAgICAgICBkYXRhQmxvY2tzID0gTlVMTDsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaTsNCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1EYXRhQ29kZXdvcmRzOyBpKyspIHsNCi0gICAgICAgICAgICByZXN1bHRCeXRlc1tpICogZGF0YUJsb2Nrc0NvdW50ICsgal0gPSAoKmNvZGV3b3JkQnl0ZXMpW2ldOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGZvcihpID0gMDsgaSA8IChkYXRhQmxvY2tzLT5HZXRTaXplKCkpOyBpKyspIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sqKSgqZGF0YUJsb2NrcylbaV07DQotICAgIH0NCi0gICAgZGVsZXRlIGRhdGFCbG9ja3M7DQotICAgIGRhdGFCbG9ja3MgPSBOVUxMOw0KLSAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCAqcmVzdWx0UiA9IENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlKHJlc3VsdEJ5dGVzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gcmVzdWx0UjsNCi19DQotdm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZXI6OkNvcnJlY3RFcnJvcnMoQ0ZYX0J5dGVBcnJheSAmY29kZXdvcmRCeXRlcywgaW50MzJfdCBudW1EYXRhQ29kZXdvcmRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBudW1Db2Rld29yZHMgPSBjb2Rld29yZEJ5dGVzLkdldFNpemUoKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgY29kZXdvcmRzSW50czsNCi0gICAgY29kZXdvcmRzSW50cy5TZXRTaXplKG51bUNvZGV3b3Jkcyk7DQotICAgIGludDMyX3QgaTsNCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUNvZGV3b3JkczsgaSsrKSB7DQotICAgICAgICBjb2Rld29yZHNJbnRzW2ldID0gY29kZXdvcmRCeXRlc1tpXSAmIDB4RkY7DQotICAgIH0NCi0gICAgaW50MzJfdCBudW1FQ0NvZGV3b3JkcyA9IGNvZGV3b3JkQnl0ZXMuR2V0U2l6ZSgpIC0gbnVtRGF0YUNvZGV3b3JkczsNCi0gICAgbV9yc0RlY29kZXItPkRlY29kZSgmY29kZXdvcmRzSW50cywgbnVtRUNDb2Rld29yZHMsIGUpOw0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfRGF0YU1hdHJpeERlY29kZXI6OkRlY29kZSgNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0cywNCisgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIgcGFyc2VyOw0KKyAgcGFyc2VyLkluaXQoYml0cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfRGF0YU1hdHJpeFZlcnNpb24qIHZlcnNpb24gPSBwYXJzZXIuR2V0VmVyc2lvbigpOw0KKyAgQ0ZYX0J5dGVBcnJheSogYnl0ZVRlbXAgPSBwYXJzZXIuUmVhZENvZGV3b3JkcyhlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENGWF9CeXRlQXJyYXk+IGNvZGV3b3JkcyhieXRlVGVtcCk7DQorICBDRlhfUHRyQXJyYXkqIGRhdGFCbG9ja3MgPQ0KKyAgICAgIENCQ19EYXRhTWF0cml4RGF0YUJsb2NrOjpHZXREYXRhQmxvY2tzKGNvZGV3b3Jkcy5nZXQoKSwgdmVyc2lvbiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBpbnQzMl90IGRhdGFCbG9ja3NDb3VudCA9IGRhdGFCbG9ja3MtPkdldFNpemUoKTsNCisgIGludDMyX3QgdG90YWxCeXRlcyA9IDA7DQorICBpbnQzMl90IGksIGo7DQorICBmb3IgKGkgPSAwOyBpIDwgZGF0YUJsb2Nrc0NvdW50OyBpKyspIHsNCisgICAgdG90YWxCeXRlcyArPQ0KKyAgICAgICAgKChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpkYXRhQmxvY2tzKVtpXSktPkdldE51bURhdGFDb2Rld29yZHMoKTsNCisgIH0NCisgIENGWF9CeXRlQXJyYXkgcmVzdWx0Qnl0ZXM7DQorICByZXN1bHRCeXRlcy5TZXRTaXplKHRvdGFsQnl0ZXMpOw0KKyAgZm9yIChqID0gMDsgaiA8IGRhdGFCbG9ja3NDb3VudDsgaisrKSB7DQorICAgIENGWF9CeXRlQXJyYXkqIGNvZGV3b3JkQnl0ZXMgPQ0KKyAgICAgICAgKChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpkYXRhQmxvY2tzKVtqXSktPkdldENvZGV3b3JkcygpOw0KKyAgICBpbnQzMl90IG51bURhdGFDb2Rld29yZHMgPQ0KKyAgICAgICAgKChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpkYXRhQmxvY2tzKVtqXSktPkdldE51bURhdGFDb2Rld29yZHMoKTsNCisgICAgQ29ycmVjdEVycm9ycygqY29kZXdvcmRCeXRlcywgbnVtRGF0YUNvZGV3b3JkcywgZSk7DQogICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uOw0KLSAgICAgICAgcmV0dXJuIDsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkYXRhQmxvY2tzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgZGVsZXRlIChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpkYXRhQmxvY2tzKVtpXTsNCisgICAgICB9DQorICAgICAgZGVsZXRlIGRhdGFCbG9ja3M7DQorICAgICAgZGF0YUJsb2NrcyA9IE5VTEw7DQorICAgICAgcmV0dXJuIE5VTEw7DQogICAgIH0NCisgICAgaW50MzJfdCBpOw0KICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRGF0YUNvZGV3b3JkczsgaSsrKSB7DQotICAgICAgICBjb2Rld29yZEJ5dGVzW2ldID0gKHVpbnQ4X3QpIGNvZGV3b3Jkc0ludHNbaV07DQorICAgICAgcmVzdWx0Qnl0ZXNbaSAqIGRhdGFCbG9ja3NDb3VudCArIGpdID0gKCpjb2Rld29yZEJ5dGVzKVtpXTsNCiAgICAgfQ0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IChkYXRhQmxvY2tzLT5HZXRTaXplKCkpOyBpKyspIHsNCisgICAgZGVsZXRlIChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpkYXRhQmxvY2tzKVtpXTsNCisgIH0NCisgIGRlbGV0ZSBkYXRhQmxvY2tzOw0KKyAgZGF0YUJsb2NrcyA9IE5VTEw7DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogcmVzdWx0UiA9DQorICAgICAgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGUocmVzdWx0Qnl0ZXMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHJlc3VsdFI7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhEZWNvZGVyOjpDb3JyZWN0RXJyb3JzKENGWF9CeXRlQXJyYXkmIGNvZGV3b3JkQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1EYXRhQ29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgbnVtQ29kZXdvcmRzID0gY29kZXdvcmRCeXRlcy5HZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSBjb2Rld29yZHNJbnRzOw0KKyAgY29kZXdvcmRzSW50cy5TZXRTaXplKG51bUNvZGV3b3Jkcyk7DQorICBpbnQzMl90IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29kZXdvcmRzOyBpKyspIHsNCisgICAgY29kZXdvcmRzSW50c1tpXSA9IGNvZGV3b3JkQnl0ZXNbaV0gJiAweEZGOw0KKyAgfQ0KKyAgaW50MzJfdCBudW1FQ0NvZGV3b3JkcyA9IGNvZGV3b3JkQnl0ZXMuR2V0U2l6ZSgpIC0gbnVtRGF0YUNvZGV3b3JkczsNCisgIG1fcnNEZWNvZGVyLT5EZWNvZGUoJmNvZGV3b3Jkc0ludHMsIG51bUVDQ29kZXdvcmRzLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQorICAgIHJldHVybjsNCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCBudW1EYXRhQ29kZXdvcmRzOyBpKyspIHsNCisgICAgY29kZXdvcmRCeXRlc1tpXSA9ICh1aW50OF90KWNvZGV3b3Jkc0ludHNbaV07DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZXIuaAppbmRleCBkNGQyY2M3Li4zMTMxMWI1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGVjb2Rlci5oCkBAIC05LDE1ICs5LDE3IEBACiBjbGFzcyBDQkNfUmVlZFNvbG9tb25EZWNvZGVyOw0KIGNsYXNzIENCQ19Db21tb25EZWNvZGVyUmVzdWx0Ow0KIGNsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQotY2xhc3MgQ0JDX0RhdGFNYXRyaXhEZWNvZGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0RhdGFNYXRyaXhEZWNvZGVyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4RGVjb2RlcigpOw0KLSAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCAqRGVjb2RlKENCQ19Db21tb25CaXRNYXRyaXggKmJpdHMsIGludDMyX3QgJmUpOw0KLSAgICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KLXByaXZhdGU6DQotICAgIHZvaWQgQ29ycmVjdEVycm9ycyhDRlhfQnl0ZUFycmF5ICZjb2Rld29yZEJ5dGVzLCBpbnQzMl90IG51bURhdGFDb2Rld29yZHMsIGludDMyX3QgJmUpOw0KLSAgICBDQkNfUmVlZFNvbG9tb25EZWNvZGVyICptX3JzRGVjb2RlcjsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeERlY29kZXIgew0KKyBwdWJsaWM6DQorICBDQkNfRGF0YU1hdHJpeERlY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4RGVjb2RlcigpOw0KKyAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIERlY29kZShDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzLCBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgdm9pZCBJbml0KCk7DQorDQorIHByaXZhdGU6DQorICB2b2lkIENvcnJlY3RFcnJvcnMoQ0ZYX0J5dGVBcnJheSYgY29kZXdvcmRCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bURhdGFDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDQkNfUmVlZFNvbG9tb25EZWNvZGVyKiBtX3JzRGVjb2RlcjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERldGVjdG9yLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERldGVjdG9yLmNwcAppbmRleCA1YTRhMjA2Li4yZGNlOTcyIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZXRlY3Rvci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGV0ZWN0b3IuY3BwCkBAIC0yOSwzNDAgKzI5LDM3NiBAQAogI2luY2x1ZGUgIi4uL3FyY29kZS9CQ19RUkdyaWRTYW1wbGVyLmgiDQogI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhEZXRlY3Rvci5oIg0KIGNvbnN0IGludDMyX3QgQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6SU5URUdFUlNbNV0gPSB7MCwgMSwgMiwgMywgNH07DQotQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6Q0JDX0RhdGFNYXRyaXhEZXRlY3RvcihDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSk6DQotICAgIG1faW1hZ2UoaW1hZ2UpLCBtX3JlY3RhbmdsZURldGVjdG9yKE5VTEwpDQotew0KK0NCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OkNCQ19EYXRhTWF0cml4RGV0ZWN0b3IoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UpDQorICAgIDogbV9pbWFnZShpbWFnZSksIG1fcmVjdGFuZ2xlRGV0ZWN0b3IoTlVMTCkge30NCit2b2lkIENCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OkluaXQoaW50MzJfdCYgZSkgew0KKyAgbV9yZWN0YW5nbGVEZXRlY3RvciA9IEZYX05FVyBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcihtX2ltYWdlKTsNCisgIG1fcmVjdGFuZ2xlRGV0ZWN0b3ItPkluaXQoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCiB9DQotdm9pZCBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpJbml0KGludDMyX3QgJmUpDQotew0KLSAgICBtX3JlY3RhbmdsZURldGVjdG9yID0gRlhfTkVXIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKG1faW1hZ2UpOw0KLSAgICBtX3JlY3RhbmdsZURldGVjdG9yLT5Jbml0KGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCitDQkNfRGF0YU1hdHJpeERldGVjdG9yOjp+Q0JDX0RhdGFNYXRyaXhEZXRlY3RvcigpIHsNCisgIGlmIChtX3JlY3RhbmdsZURldGVjdG9yICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fcmVjdGFuZ2xlRGV0ZWN0b3I7DQorICB9DQorICBtX3JlY3RhbmdsZURldGVjdG9yID0gTlVMTDsNCiB9DQotQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6fkNCQ19EYXRhTWF0cml4RGV0ZWN0b3IoKQ0KLXsNCi0gICAgaWYobV9yZWN0YW5nbGVEZXRlY3RvciAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgbV9yZWN0YW5nbGVEZXRlY3RvcjsNCi0gICAgfQ0KLSAgICBtX3JlY3RhbmdsZURldGVjdG9yID0gTlVMTDsNCitpbmxpbmUgRlhfQk9PTCBSZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9uc0NvbXBhcmF0b3Iodm9pZCogYSwgdm9pZCogYikgew0KKyAgcmV0dXJuICgoQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKiliKS0+R2V0VHJhbnNpdGlvbnMoKSA+DQorICAgICAgICAgKChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMqKWEpLT5HZXRUcmFuc2l0aW9ucygpOw0KIH0NCi1pbmxpbmUgRlhfQk9PTCBSZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9uc0NvbXBhcmF0b3Iodm9pZCogYSwgdm9pZCogYikNCi17DQotICAgIHJldHVybiAoKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyAqKWIpLT5HZXRUcmFuc2l0aW9ucygpID4gKChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMgKilhKS0+R2V0VHJhbnNpdGlvbnMoKTsNCi19DQotQ0JDX1FSRGV0ZWN0b3JSZXN1bHQgKkNCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OkRldGVjdChpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX1B0ckFycmF5KiBjb3JuZXJQb2ludHMgPSBtX3JlY3RhbmdsZURldGVjdG9yLT5EZXRlY3QoZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX1Jlc3VsdFBvaW50ICpwb2ludEEgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKmNvcm5lclBvaW50cylbMF07DQotICAgIENCQ19SZXN1bHRQb2ludCAqcG9pbnRCID0gKENCQ19SZXN1bHRQb2ludCopKCpjb3JuZXJQb2ludHMpWzFdOw0KLSAgICBDQkNfUmVzdWx0UG9pbnQgKnBvaW50QyA9IChDQkNfUmVzdWx0UG9pbnQqKSgqY29ybmVyUG9pbnRzKVsyXTsNCi0gICAgQ0JDX1Jlc3VsdFBvaW50ICpwb2ludEQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKmNvcm5lclBvaW50cylbM107DQotICAgIGRlbGV0ZSBjb3JuZXJQb2ludHM7DQotICAgIGNvcm5lclBvaW50cyA9IE5VTEw7DQotICAgIENGWF9QdHJBcnJheSB0cmFuc2l0aW9uczsNCi0gICAgdHJhbnNpdGlvbnMuQWRkKFRyYW5zaXRpb25zQmV0d2Vlbihwb2ludEEsIHBvaW50QikpOw0KLSAgICB0cmFuc2l0aW9ucy5BZGQoVHJhbnNpdGlvbnNCZXR3ZWVuKHBvaW50QSwgcG9pbnRDKSk7DQotICAgIHRyYW5zaXRpb25zLkFkZChUcmFuc2l0aW9uc0JldHdlZW4ocG9pbnRCLCBwb2ludEQpKTsNCi0gICAgdHJhbnNpdGlvbnMuQWRkKFRyYW5zaXRpb25zQmV0d2Vlbihwb2ludEMsIHBvaW50RCkpOw0KLSAgICBCQ19GWF9QdHJBcnJheV9Tb3J0KHRyYW5zaXRpb25zLCAmUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnNDb21wYXJhdG9yKTsNCi0gICAgZGVsZXRlICggKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyAqKXRyYW5zaXRpb25zWzJdICk7DQotICAgIGRlbGV0ZSAoIChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMgKil0cmFuc2l0aW9uc1szXSApOw0KLSAgICBDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMgKmxTaWRlT25lID0gKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyopdHJhbnNpdGlvbnNbMF07DQotICAgIENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyAqbFNpZGVUd28gPSAoQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKil0cmFuc2l0aW9uc1sxXTsNCi0gICAgQ0ZYX01hcFB0clRlbXBsYXRlPENCQ19SZXN1bHRQb2ludCosIGludDMyX3Q+IHBvaW50Q291bnQ7DQotICAgIEluY3JlbWVudChwb2ludENvdW50LCBsU2lkZU9uZS0+R2V0RnJvbSgpKTsNCi0gICAgSW5jcmVtZW50KHBvaW50Q291bnQsIGxTaWRlT25lLT5HZXRUbygpKTsNCi0gICAgSW5jcmVtZW50KHBvaW50Q291bnQsIGxTaWRlVHdvLT5HZXRGcm9tKCkpOw0KLSAgICBJbmNyZW1lbnQocG9pbnRDb3VudCwgbFNpZGVUd28tPkdldFRvKCkpOw0KLSAgICBkZWxldGUgKCAoQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zICopdHJhbnNpdGlvbnNbMV0gKTsNCi0gICAgZGVsZXRlICggKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyAqKXRyYW5zaXRpb25zWzBdICk7DQotICAgIHRyYW5zaXRpb25zLlJlbW92ZUFsbCgpOw0KLSAgICBDQkNfUmVzdWx0UG9pbnQgKm1heWJlVG9wTGVmdCA9IE5VTEw7DQotICAgIENCQ19SZXN1bHRQb2ludCAqYm90dG9tTGVmdCA9IE5VTEw7DQotICAgIENCQ19SZXN1bHRQb2ludCAqbWF5YmVCb3R0b21SaWdodCA9IE5VTEw7DQotICAgIEZYX1BPU0lUSU9OIGl0QmVnaW4gPSBwb2ludENvdW50LkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUoaXRCZWdpbiAhPSBOVUxMKSB7DQotICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKmtleSA9IDA7DQotICAgICAgICBpbnQzMl90IHZhbHVlID0gMDsNCi0gICAgICAgIHBvaW50Q291bnQuR2V0TmV4dEFzc29jKGl0QmVnaW4sIGtleSwgdmFsdWUpOw0KLSAgICAgICAgaWYodmFsdWUgPT0gMikgew0KLSAgICAgICAgICAgIGJvdHRvbUxlZnQgPSBrZXk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChtYXliZUJvdHRvbVJpZ2h0ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgbWF5YmVCb3R0b21SaWdodCA9IGtleTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtYXliZVRvcExlZnQgPSBrZXk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChtYXliZVRvcExlZnQgPT0gTlVMTCB8fCBib3R0b21MZWZ0ID09IE5VTEwgfHwgbWF5YmVCb3R0b21SaWdodCA9PSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgcG9pbnRBOw0KLSAgICAgICAgZGVsZXRlIHBvaW50QjsNCi0gICAgICAgIGRlbGV0ZSBwb2ludEM7DQotICAgICAgICBkZWxldGUgcG9pbnREOw0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfUHRyQXJyYXkgY29ybmVyczsNCi0gICAgY29ybmVycy5TZXRTaXplKDMpOw0KLSAgICBjb3JuZXJzWzBdID0gbWF5YmVUb3BMZWZ0Ow0KLSAgICBjb3JuZXJzWzFdID0gYm90dG9tTGVmdDsNCi0gICAgY29ybmVyc1syXSA9IG1heWJlQm90dG9tUmlnaHQ7DQotICAgIE9yZGVyQmVzdFBhdHRlcm5zKCZjb3JuZXJzKTsNCi0gICAgQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21SaWdodCA9IChDQkNfUmVzdWx0UG9pbnQqKWNvcm5lcnNbMF07DQotICAgIGJvdHRvbUxlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50Kiljb3JuZXJzWzFdOw0KLSAgICBDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50Kiljb3JuZXJzWzJdOw0KLSAgICBDQkNfUmVzdWx0UG9pbnQgKnRvcFJpZ2h0ID0gTlVMTDsNCi0gICAgaW50MzJfdCB2YWx1ZTsNCi0gICAgaWYgKCFwb2ludENvdW50Lkxvb2t1cChwb2ludEEsIHZhbHVlKSkgew0KLSAgICAgICAgdG9wUmlnaHQgPSBwb2ludEE7DQotICAgIH0gZWxzZSBpZiAoIXBvaW50Q291bnQuTG9va3VwKHBvaW50QiwgdmFsdWUpKSB7DQotICAgICAgICB0b3BSaWdodCA9IHBvaW50QjsNCi0gICAgfSBlbHNlIGlmICghcG9pbnRDb3VudC5Mb29rdXAocG9pbnRDLCB2YWx1ZSkpIHsNCi0gICAgICAgIHRvcFJpZ2h0ID0gcG9pbnRDOw0KK0NCQ19RUkRldGVjdG9yUmVzdWx0KiBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpEZXRlY3QoaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1B0ckFycmF5KiBjb3JuZXJQb2ludHMgPSBtX3JlY3RhbmdsZURldGVjdG9yLT5EZXRlY3QoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIHBvaW50QSA9IChDQkNfUmVzdWx0UG9pbnQqKSgqY29ybmVyUG9pbnRzKVswXTsNCisgIENCQ19SZXN1bHRQb2ludCogcG9pbnRCID0gKENCQ19SZXN1bHRQb2ludCopKCpjb3JuZXJQb2ludHMpWzFdOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBwb2ludEMgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKmNvcm5lclBvaW50cylbMl07DQorICBDQkNfUmVzdWx0UG9pbnQqIHBvaW50RCA9IChDQkNfUmVzdWx0UG9pbnQqKSgqY29ybmVyUG9pbnRzKVszXTsNCisgIGRlbGV0ZSBjb3JuZXJQb2ludHM7DQorICBjb3JuZXJQb2ludHMgPSBOVUxMOw0KKyAgQ0ZYX1B0ckFycmF5IHRyYW5zaXRpb25zOw0KKyAgdHJhbnNpdGlvbnMuQWRkKFRyYW5zaXRpb25zQmV0d2Vlbihwb2ludEEsIHBvaW50QikpOw0KKyAgdHJhbnNpdGlvbnMuQWRkKFRyYW5zaXRpb25zQmV0d2Vlbihwb2ludEEsIHBvaW50QykpOw0KKyAgdHJhbnNpdGlvbnMuQWRkKFRyYW5zaXRpb25zQmV0d2Vlbihwb2ludEIsIHBvaW50RCkpOw0KKyAgdHJhbnNpdGlvbnMuQWRkKFRyYW5zaXRpb25zQmV0d2Vlbihwb2ludEMsIHBvaW50RCkpOw0KKyAgQkNfRlhfUHRyQXJyYXlfU29ydCh0cmFuc2l0aW9ucywgJlJlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zQ29tcGFyYXRvcik7DQorICBkZWxldGUgKChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMqKXRyYW5zaXRpb25zWzJdKTsNCisgIGRlbGV0ZSAoKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyopdHJhbnNpdGlvbnNbM10pOw0KKyAgQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKiBsU2lkZU9uZSA9DQorICAgICAgKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyopdHJhbnNpdGlvbnNbMF07DQorICBDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMqIGxTaWRlVHdvID0NCisgICAgICAoQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKil0cmFuc2l0aW9uc1sxXTsNCisgIENGWF9NYXBQdHJUZW1wbGF0ZTxDQkNfUmVzdWx0UG9pbnQqLCBpbnQzMl90PiBwb2ludENvdW50Ow0KKyAgSW5jcmVtZW50KHBvaW50Q291bnQsIGxTaWRlT25lLT5HZXRGcm9tKCkpOw0KKyAgSW5jcmVtZW50KHBvaW50Q291bnQsIGxTaWRlT25lLT5HZXRUbygpKTsNCisgIEluY3JlbWVudChwb2ludENvdW50LCBsU2lkZVR3by0+R2V0RnJvbSgpKTsNCisgIEluY3JlbWVudChwb2ludENvdW50LCBsU2lkZVR3by0+R2V0VG8oKSk7DQorICBkZWxldGUgKChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMqKXRyYW5zaXRpb25zWzFdKTsNCisgIGRlbGV0ZSAoKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyopdHJhbnNpdGlvbnNbMF0pOw0KKyAgdHJhbnNpdGlvbnMuUmVtb3ZlQWxsKCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIG1heWJlVG9wTGVmdCA9IE5VTEw7DQorICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbUxlZnQgPSBOVUxMOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBtYXliZUJvdHRvbVJpZ2h0ID0gTlVMTDsNCisgIEZYX1BPU0lUSU9OIGl0QmVnaW4gPSBwb2ludENvdW50LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChpdEJlZ2luICE9IE5VTEwpIHsNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBrZXkgPSAwOw0KKyAgICBpbnQzMl90IHZhbHVlID0gMDsNCisgICAgcG9pbnRDb3VudC5HZXROZXh0QXNzb2MoaXRCZWdpbiwga2V5LCB2YWx1ZSk7DQorICAgIGlmICh2YWx1ZSA9PSAyKSB7DQorICAgICAgYm90dG9tTGVmdCA9IGtleTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIHRvcFJpZ2h0ID0gcG9pbnREOw0KKyAgICAgIGlmIChtYXliZUJvdHRvbVJpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgIG1heWJlQm90dG9tUmlnaHQgPSBrZXk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1heWJlVG9wTGVmdCA9IGtleTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaW50MzJfdCBkaW1lbnNpb25Ub3AgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbih0b3BMZWZ0LCB0b3BSaWdodCkpLT5HZXRUcmFuc2l0aW9ucygpOw0KLSAgICBpbnQzMl90IGRpbWVuc2lvblJpZ2h0ID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPihUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIHRvcFJpZ2h0KSktPkdldFRyYW5zaXRpb25zKCk7DQorICB9DQorICBpZiAobWF5YmVUb3BMZWZ0ID09IE5VTEwgfHwgYm90dG9tTGVmdCA9PSBOVUxMIHx8IG1heWJlQm90dG9tUmlnaHQgPT0gTlVMTCkgew0KKyAgICBkZWxldGUgcG9pbnRBOw0KKyAgICBkZWxldGUgcG9pbnRCOw0KKyAgICBkZWxldGUgcG9pbnRDOw0KKyAgICBkZWxldGUgcG9pbnREOw0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfUHRyQXJyYXkgY29ybmVyczsNCisgIGNvcm5lcnMuU2V0U2l6ZSgzKTsNCisgIGNvcm5lcnNbMF0gPSBtYXliZVRvcExlZnQ7DQorICBjb3JuZXJzWzFdID0gYm90dG9tTGVmdDsNCisgIGNvcm5lcnNbMl0gPSBtYXliZUJvdHRvbVJpZ2h0Ow0KKyAgT3JkZXJCZXN0UGF0dGVybnMoJmNvcm5lcnMpOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21SaWdodCA9IChDQkNfUmVzdWx0UG9pbnQqKWNvcm5lcnNbMF07DQorICBib3R0b21MZWZ0ID0gKENCQ19SZXN1bHRQb2ludCopY29ybmVyc1sxXTsNCisgIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCA9IChDQkNfUmVzdWx0UG9pbnQqKWNvcm5lcnNbMl07DQorICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0ID0gTlVMTDsNCisgIGludDMyX3QgdmFsdWU7DQorICBpZiAoIXBvaW50Q291bnQuTG9va3VwKHBvaW50QSwgdmFsdWUpKSB7DQorICAgIHRvcFJpZ2h0ID0gcG9pbnRBOw0KKyAgfSBlbHNlIGlmICghcG9pbnRDb3VudC5Mb29rdXAocG9pbnRCLCB2YWx1ZSkpIHsNCisgICAgdG9wUmlnaHQgPSBwb2ludEI7DQorICB9IGVsc2UgaWYgKCFwb2ludENvdW50Lkxvb2t1cChwb2ludEMsIHZhbHVlKSkgew0KKyAgICB0b3BSaWdodCA9IHBvaW50QzsNCisgIH0gZWxzZSB7DQorICAgIHRvcFJpZ2h0ID0gcG9pbnREOw0KKyAgfQ0KKyAgaW50MzJfdCBkaW1lbnNpb25Ub3AgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIHRvcFJpZ2h0KSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKTsNCisgIGludDMyX3QgZGltZW5zaW9uUmlnaHQgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIHRvcFJpZ2h0KSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRUcmFuc2l0aW9ucygpOw0KKyAgaWYgKChkaW1lbnNpb25Ub3AgJiAweDAxKSA9PSAxKSB7DQorICAgIGRpbWVuc2lvblRvcCsrOw0KKyAgfQ0KKyAgZGltZW5zaW9uVG9wICs9IDI7DQorICBpZiAoKGRpbWVuc2lvblJpZ2h0ICYgMHgwMSkgPT0gMSkgew0KKyAgICBkaW1lbnNpb25SaWdodCsrOw0KKyAgfQ0KKyAgZGltZW5zaW9uUmlnaHQgKz0gMjsNCisgIENCQ19BdXRvUHRyPENCQ19Db21tb25CaXRNYXRyaXg+IGJpdHMoTlVMTCk7DQorICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IGNvcnJlY3RlZFRvcFJpZ2h0KE5VTEwpOw0KKyAgaWYgKDQgKiBkaW1lbnNpb25Ub3AgPj0gNyAqIGRpbWVuc2lvblJpZ2h0IHx8DQorICAgICAgNCAqIGRpbWVuc2lvblJpZ2h0ID49IDcgKiBkaW1lbnNpb25Ub3ApIHsNCisgICAgY29ycmVjdGVkVG9wUmlnaHQgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+KA0KKyAgICAgICAgQ29ycmVjdFRvcFJpZ2h0UmVjdGFuZ3VsYXIoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIHRvcExlZnQsIHRvcFJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uVG9wLCBkaW1lbnNpb25SaWdodCkpOw0KKyAgICBpZiAoY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkgPT0gTlVMTCkgew0KKyAgICAgIGNvcnJlY3RlZFRvcFJpZ2h0ID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50Pih0b3BSaWdodCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZGVsZXRlIHRvcFJpZ2h0Ow0KKyAgICAgIHRvcFJpZ2h0ID0gTlVMTDsNCisgICAgfQ0KKyAgICBkaW1lbnNpb25Ub3AgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIGNvcnJlY3RlZFRvcFJpZ2h0LmdldCgpKSkNCisgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKTsNCisgICAgZGltZW5zaW9uUmlnaHQgPQ0KKyAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPigNCisgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIGNvcnJlY3RlZFRvcFJpZ2h0LmdldCgpKSkNCisgICAgICAgICAgICAtPkdldFRyYW5zaXRpb25zKCk7DQogICAgIGlmICgoZGltZW5zaW9uVG9wICYgMHgwMSkgPT0gMSkgew0KLSAgICAgICAgZGltZW5zaW9uVG9wKys7DQorICAgICAgZGltZW5zaW9uVG9wKys7DQogICAgIH0NCi0gICAgZGltZW5zaW9uVG9wICs9IDI7DQogICAgIGlmICgoZGltZW5zaW9uUmlnaHQgJiAweDAxKSA9PSAxKSB7DQotICAgICAgICBkaW1lbnNpb25SaWdodCsrOw0KKyAgICAgIGRpbWVuc2lvblJpZ2h0Kys7DQogICAgIH0NCi0gICAgZGltZW5zaW9uUmlnaHQgKz0gMjsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJpdE1hdHJpeD4gYml0cyhOVUxMKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiBjb3JyZWN0ZWRUb3BSaWdodChOVUxMKTsNCi0gICAgaWYgKDQgKiBkaW1lbnNpb25Ub3AgPj0gNyAqIGRpbWVuc2lvblJpZ2h0IHx8IDQgKiBkaW1lbnNpb25SaWdodCA+PSA3ICogZGltZW5zaW9uVG9wKSB7DQotICAgICAgICBjb3JyZWN0ZWRUb3BSaWdodCA9DQotICAgICAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PihDb3JyZWN0VG9wUmlnaHRSZWN0YW5ndWxhcihib3R0b21MZWZ0LCBib3R0b21SaWdodCwgdG9wTGVmdCwgdG9wUmlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25Ub3AsIGRpbWVuc2lvblJpZ2h0KSk7DQotICAgICAgICBpZiAoY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIGNvcnJlY3RlZFRvcFJpZ2h0ID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50Pih0b3BSaWdodCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGRlbGV0ZSB0b3BSaWdodDsNCi0gICAgICAgICAgICB0b3BSaWdodCA9IE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBkaW1lbnNpb25Ub3AgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbih0b3BMZWZ0LCBjb3JyZWN0ZWRUb3BSaWdodC5nZXQoKSkpLT5HZXRUcmFuc2l0aW9ucygpOw0KLSAgICAgICAgZGltZW5zaW9uUmlnaHQgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbihib3R0b21SaWdodCwgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKTsNCi0gICAgICAgIGlmICgoZGltZW5zaW9uVG9wICYgMHgwMSkgPT0gMSkgew0KLSAgICAgICAgICAgIGRpbWVuc2lvblRvcCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKChkaW1lbnNpb25SaWdodCAmIDB4MDEpID09IDEpIHsNCi0gICAgICAgICAgICBkaW1lbnNpb25SaWdodCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYml0cyA9IENCQ19BdXRvUHRyPENCQ19Db21tb25CaXRNYXRyaXg+KFNhbXBsZUdyaWQobV9pbWFnZSwgdG9wTGVmdCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCksIGRpbWVuc2lvblRvcCwgZGltZW5zaW9uUmlnaHQsIGUpKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGludDMyX3QgZGltZW5zaW9uID0gRlhfTUlOKGRpbWVuc2lvblJpZ2h0LCBkaW1lbnNpb25Ub3ApOw0KLSAgICAgICAgY29ycmVjdGVkVG9wUmlnaHQgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+KENvcnJlY3RUb3BSaWdodChib3R0b21MZWZ0LCBib3R0b21SaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGVmdCwgdG9wUmlnaHQsIGRpbWVuc2lvbikpOw0KLSAgICAgICAgaWYgKGNvcnJlY3RlZFRvcFJpZ2h0LmdldCgpID09IE5VTEwpIHsNCi0gICAgICAgICAgICBjb3JyZWN0ZWRUb3BSaWdodCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4odG9wUmlnaHQpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBkZWxldGUgdG9wUmlnaHQ7DQotICAgICAgICAgICAgdG9wUmlnaHQgPSBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBkaW1lbnNpb25Db3JyZWN0ZWQgPSBGWF9NQVgoQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPihUcmFuc2l0aW9uc0JldHdlZW4odG9wTGVmdCwgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbihib3R0b21SaWdodCwgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKSk7DQotICAgICAgICBkaW1lbnNpb25Db3JyZWN0ZWQrKzsNCi0gICAgICAgIGlmICgoZGltZW5zaW9uQ29ycmVjdGVkICYgMHgwMSkgPT0gMSkgew0KLSAgICAgICAgICAgIGRpbWVuc2lvbkNvcnJlY3RlZCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYml0cyA9IENCQ19BdXRvUHRyPENCQ19Db21tb25CaXRNYXRyaXg+KFNhbXBsZUdyaWQobV9pbWFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbUxlZnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tUmlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uQ29ycmVjdGVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbkNvcnJlY3RlZCwgZSkpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICB9DQotICAgIENGWF9QdHJBcnJheSAqcmVzdWx0ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCi0gICAgcmVzdWx0LT5TZXRTaXplKDQpOw0KLSAgICByZXN1bHQtPkFkZCh0b3BMZWZ0KTsNCi0gICAgcmVzdWx0LT5BZGQoYm90dG9tTGVmdCk7DQotICAgIHJlc3VsdC0+QWRkKGJvdHRvbVJpZ2h0KTsNCi0gICAgcmVzdWx0LT5BZGQoY29ycmVjdGVkVG9wUmlnaHQucmVsZWFzZSgpKTsNCi0gICAgcmV0dXJuIEZYX05FVyBDQkNfUVJEZXRlY3RvclJlc3VsdChiaXRzLnJlbGVhc2UoKSwgcmVzdWx0KTsNCi19DQotQ0JDX1Jlc3VsdFBvaW50ICpDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpDb3JyZWN0VG9wUmlnaHRSZWN0YW5ndWxhcihDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbUxlZnQsIENCQ19SZXN1bHRQb2ludCAqYm90dG9tUmlnaHQsIENCQ19SZXN1bHRQb2ludCAqdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50ICp0b3BSaWdodCwgaW50MzJfdCBkaW1lbnNpb25Ub3AsIGludDMyX3QgZGltZW5zaW9uUmlnaHQpDQotew0KLSAgICBGWF9GTE9BVCBjb3JyID0gRGlzdGFuY2UoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQpIC8gKEZYX0ZMT0FUKWRpbWVuc2lvblRvcDsNCi0gICAgaW50MzJfdCBub3JtID0gRGlzdGFuY2UodG9wTGVmdCwgdG9wUmlnaHQpOw0KLSAgICBGWF9GTE9BVCBjb3MgPSAodG9wUmlnaHQtPkdldFgoKSAtIHRvcExlZnQtPkdldFgoKSkgLyBub3JtOw0KLSAgICBGWF9GTE9BVCBzaW4gPSAodG9wUmlnaHQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSkgLyBub3JtOw0KLSAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IGMxKEZYX05FVyBDQkNfUmVzdWx0UG9pbnQodG9wUmlnaHQtPkdldFgoKSArIGNvcnIgKiBjb3MsIHRvcFJpZ2h0LT5HZXRZKCkgKyBjb3JyICogc2luKSk7DQotICAgIGNvcnIgPSBEaXN0YW5jZShib3R0b21MZWZ0LCB0b3BMZWZ0KSAvIChGWF9GTE9BVClkaW1lbnNpb25SaWdodDsNCi0gICAgbm9ybSA9IERpc3RhbmNlKGJvdHRvbVJpZ2h0LCB0b3BSaWdodCk7DQotICAgIGNvcyA9ICh0b3BSaWdodC0+R2V0WCgpIC0gYm90dG9tUmlnaHQtPkdldFgoKSkgLyBub3JtOw0KLSAgICBzaW4gPSAodG9wUmlnaHQtPkdldFkoKSAtIGJvdHRvbVJpZ2h0LT5HZXRZKCkpIC8gbm9ybTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiBjMihGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHRvcFJpZ2h0LT5HZXRYKCkgKyBjb3JyICogY29zLCB0b3BSaWdodC0+R2V0WSgpICsgY29yciAqIHNpbikpOw0KLSAgICBpZiAoIUlzVmFsaWQoYzEuZ2V0KCkpKSB7DQotICAgICAgICBpZiAoSXNWYWxpZChjMi5nZXQoKSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gYzIucmVsZWFzZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0gZWxzZSBpZiAoIUlzVmFsaWQoYzIuZ2V0KCkpKSB7DQotICAgICAgICByZXR1cm4gYzEucmVsZWFzZSgpOw0KLSAgICB9DQotICAgIGludDMyX3QgbDEgPSBGWFNZU19hYnMoZGltZW5zaW9uVG9wIC0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPihUcmFuc2l0aW9uc0JldHdlZW4odG9wTGVmdCwgYzEuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKSkgKw0KLSAgICAgICAgICAgICAgICAgIEZYU1lTX2FicyhkaW1lbnNpb25SaWdodCAtIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oVHJhbnNpdGlvbnNCZXR3ZWVuKGJvdHRvbVJpZ2h0LCBjMS5nZXQoKSkpLT5HZXRUcmFuc2l0aW9ucygpKTsNCi0gICAgaW50MzJfdCBsMiA9IEZYU1lTX2FicyhkaW1lbnNpb25Ub3AgLSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbih0b3BMZWZ0LCBjMi5nZXQoKSkpLT5HZXRUcmFuc2l0aW9ucygpKSArDQotICAgICAgICAgICAgICAgICAgRlhTWVNfYWJzKGRpbWVuc2lvblJpZ2h0IC0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPihUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIGMyLmdldCgpKSktPkdldFRyYW5zaXRpb25zKCkpOw0KLSAgICBpZiAobDEgPD0gbDIpIHsNCi0gICAgICAgIHJldHVybiBjMS5yZWxlYXNlKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGMyLnJlbGVhc2UoKTsNCi19DQotQ0JDX1Jlc3VsdFBvaW50ICpDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpDb3JyZWN0VG9wUmlnaHQoQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21MZWZ0LCBDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbVJpZ2h0LCBDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsIGludDMyX3QgZGltZW5zaW9uKQ0KLXsNCi0gICAgRlhfRkxPQVQgY29yciA9IERpc3RhbmNlKGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0KSAvIChGWF9GTE9BVCkgZGltZW5zaW9uOw0KLSAgICBpbnQzMl90IG5vcm0gPSBEaXN0YW5jZSh0b3BMZWZ0LCB0b3BSaWdodCk7DQotICAgIEZYX0ZMT0FUIGNvcyA9ICh0b3BSaWdodC0+R2V0WCgpIC0gdG9wTGVmdC0+R2V0WCgpKSAvIG5vcm07DQotICAgIEZYX0ZMT0FUIHNpbiA9ICh0b3BSaWdodC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpKSAvIG5vcm07DQotICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4gYzEoRlhfTkVXIENCQ19SZXN1bHRQb2ludCh0b3BSaWdodC0+R2V0WCgpICsgY29yciAqIGNvcywgdG9wUmlnaHQtPkdldFkoKSArIGNvcnIgKiBzaW4pKTsNCi0gICAgY29yciA9IERpc3RhbmNlKGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0KSAvIChGWF9GTE9BVCkgZGltZW5zaW9uOw0KLSAgICBub3JtID0gRGlzdGFuY2UoYm90dG9tUmlnaHQsIHRvcFJpZ2h0KTsNCi0gICAgY29zID0gKHRvcFJpZ2h0LT5HZXRYKCkgLSBib3R0b21SaWdodC0+R2V0WCgpKSAvIG5vcm07DQotICAgIHNpbiA9ICh0b3BSaWdodC0+R2V0WSgpIC0gYm90dG9tUmlnaHQtPkdldFkoKSkgLyBub3JtOw0KLSAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IGMyKEZYX05FVyBDQkNfUmVzdWx0UG9pbnQodG9wUmlnaHQtPkdldFgoKSArIGNvcnIgKiBjb3MsIHRvcFJpZ2h0LT5HZXRZKCkgKyBjb3JyICogc2luKSk7DQotICAgIGlmICghSXNWYWxpZChjMS5nZXQoKSkpIHsNCi0gICAgICAgIGlmIChJc1ZhbGlkKGMyLmdldCgpKSkgew0KLSAgICAgICAgICAgIHJldHVybiBjMi5yZWxlYXNlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfSBlbHNlIGlmICghSXNWYWxpZChjMi5nZXQoKSkpIHsNCi0gICAgICAgIHJldHVybiBjMS5yZWxlYXNlKCk7DQotICAgIH0NCi0gICAgaW50MzJfdCBsMSA9IEZYU1lTX2FicyhDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbih0b3BMZWZ0LCBjMS5nZXQoKSkpLT5HZXRUcmFuc2l0aW9ucygpIC0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPihUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIGMxLmdldCgpKSktPkdldFRyYW5zaXRpb25zKCkpOw0KLSAgICBpbnQzMl90IGwyID0gRlhTWVNfYWJzKENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIGMyLmdldCgpKSktPkdldFRyYW5zaXRpb25zKCkgLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KFRyYW5zaXRpb25zQmV0d2Vlbihib3R0b21SaWdodCwgYzIuZ2V0KCkpKS0+R2V0VHJhbnNpdGlvbnMoKSk7DQotICAgIHJldHVybiBsMSA8PSBsMiA/IGMxLnJlbGVhc2UoKSA6IGMyLnJlbGVhc2UoKTsNCi19DQotRlhfQk9PTCBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpJc1ZhbGlkKENCQ19SZXN1bHRQb2ludCAqcCkNCi17DQotICAgIHJldHVybiBwLT5HZXRYKCkgPj0gMCAmJiBwLT5HZXRYKCkgPCBtX2ltYWdlLT5HZXRXaWR0aCgpICYmIHAtPkdldFkoKSA+IDAgJiYgcC0+R2V0WSgpIDwgbV9pbWFnZS0+R2V0SGVpZ2h0KCk7DQotfQ0KLWludDMyX3QgQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6Um91bmQoRlhfRkxPQVQgZCkNCi17DQotICAgIHJldHVybiAoaW50MzJfdCkgKGQgKyAwLjVmKTsNCi19DQotaW50MzJfdCBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpEaXN0YW5jZShDQkNfUmVzdWx0UG9pbnQgKmEsIENCQ19SZXN1bHRQb2ludCAqYikNCi17DQotICAgIHJldHVybiBSb3VuZCgoRlhfRkxPQVQpIHNxcnQoKGEtPkdldFgoKSAtIGItPkdldFgoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhLT5HZXRYKCkgLSBiLT5HZXRYKCkpICsgKGEtPkdldFkoKSAtIGItPkdldFkoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhLT5HZXRZKCkgLSBiLT5HZXRZKCkpKSk7DQotfQ0KLXZvaWQgQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6SW5jcmVtZW50KENGWF9NYXBQdHJUZW1wbGF0ZTxDQkNfUmVzdWx0UG9pbnQqLCBpbnQzMl90PiAmdGFibGUsIENCQ19SZXN1bHRQb2ludCAqa2V5KQ0KLXsNCi0gICAgaW50MzJfdCB2YWx1ZTsNCi0gICAgaWYodGFibGUuTG9va3VwKGtleSwgdmFsdWUpKSB7DQotICAgICAgICB0YWJsZS5TZXRBdChrZXksIElOVEVHRVJTW3ZhbHVlICsgMV0pOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgdGFibGUuU2V0QXQoa2V5LCBJTlRFR0VSU1sxXSk7DQotICAgIH0NCi19DQotQ0JDX0NvbW1vbkJpdE1hdHJpeCAqQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6U2FtcGxlR3JpZChDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSwNCi0gICAgICAgIENCQ19SZXN1bHRQb2ludCAqdG9wTGVmdCwNCi0gICAgICAgIENCQ19SZXN1bHRQb2ludCAqYm90dG9tTGVmdCwNCi0gICAgICAgIENCQ19SZXN1bHRQb2ludCAqYm90dG9tUmlnaHQsDQotICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKnRvcFJpZ2h0LA0KLSAgICAgICAgaW50MzJfdCBkaW1lbnNpb25YLCBpbnQzMl90IGRpbWVuc2lvblksIGludDMyX3QgJmUpDQotew0KLSAgICBDQkNfUVJHcmlkU2FtcGxlciAmc2FtcGxlciA9IENCQ19RUkdyaWRTYW1wbGVyOjpHZXRJbnN0YW5jZSgpOw0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBjYm0gPSBzYW1wbGVyLlNhbXBsZUdyaWQoaW1hZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvblgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvblksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNWYsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNWYsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvblggLSAwLjVmLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjVmLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25YIC0gMC41ZiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uWSAtIDAuNWYsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNWYsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvblkgLSAwLjVmLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0LT5HZXRYKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcExlZnQtPkdldFkoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wUmlnaHQtPkdldFgoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wUmlnaHQtPkdldFkoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tUmlnaHQtPkdldFgoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tUmlnaHQtPkdldFkoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tTGVmdC0+R2V0WCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b21MZWZ0LT5HZXRZKCksIGUpOw0KKyAgICBiaXRzID0gQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJpdE1hdHJpeD4oDQorICAgICAgICBTYW1wbGVHcmlkKG1faW1hZ2UsIHRvcExlZnQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICBjb3JyZWN0ZWRUb3BSaWdodC5nZXQoKSwgZGltZW5zaW9uVG9wLCBkaW1lbnNpb25SaWdodCwgZSkpOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIHJldHVybiBjYm07DQotfQ0KLUNCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyAqQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6VHJhbnNpdGlvbnNCZXR3ZWVuKENCQ19SZXN1bHRQb2ludCAqZnJvbSwgQ0JDX1Jlc3VsdFBvaW50ICp0bykNCi17DQotICAgIGludDMyX3QgZnJvbVggPSAoaW50MzJfdCkgZnJvbS0+R2V0WCgpOw0KLSAgICBpbnQzMl90IGZyb21ZID0gKGludDMyX3QpIGZyb20tPkdldFkoKTsNCi0gICAgaW50MzJfdCB0b1ggPSAoaW50MzJfdCkgdG8tPkdldFgoKTsNCi0gICAgaW50MzJfdCB0b1kgPSAoaW50MzJfdCkgdG8tPkdldFkoKTsNCi0gICAgRlhfQk9PTCBzdGVlcCA9IEZYU1lTX2Ficyh0b1kgLSBmcm9tWSkgPiBGWFNZU19hYnModG9YIC0gZnJvbVgpOw0KLSAgICBpZiAoc3RlZXApIHsNCi0gICAgICAgIGludDMyX3QgdGVtcCA9IGZyb21YOw0KLSAgICAgICAgZnJvbVggPSBmcm9tWTsNCi0gICAgICAgIGZyb21ZID0gdGVtcDsNCi0gICAgICAgIHRlbXAgPSB0b1g7DQotICAgICAgICB0b1ggPSB0b1k7DQotICAgICAgICB0b1kgPSB0ZW1wOw0KLSAgICB9DQotICAgIGludDMyX3QgZHggPSBGWFNZU19hYnModG9YIC0gZnJvbVgpOw0KLSAgICBpbnQzMl90IGR5ID0gRlhTWVNfYWJzKHRvWSAtIGZyb21ZKTsNCi0gICAgaW50MzJfdCBlcnJvciA9IC1keCA+PiAxOw0KLSAgICBpbnQzMl90IHlzdGVwID0gZnJvbVkgPCB0b1kgPyAxIDogLTE7DQotICAgIGludDMyX3QgeHN0ZXAgPSBmcm9tWCA8IHRvWCA/IDEgOiAtMTsNCi0gICAgaW50MzJfdCB0cmFuc2l0aW9ucyA9IDA7DQotICAgIEZYX0JPT0wgaW5CbGFjayA9IG1faW1hZ2UtPkdldChzdGVlcCA/IGZyb21ZIDogZnJvbVgsIHN0ZWVwID8gZnJvbVggOiBmcm9tWSk7DQotICAgIGZvciAoaW50MzJfdCB4ID0gZnJvbVgsIHkgPSBmcm9tWTsgeCAhPSB0b1g7IHggKz0geHN0ZXApIHsNCi0gICAgICAgIEZYX0JPT0wgaXNCbGFjayA9IG1faW1hZ2UtPkdldChzdGVlcCA/IHkgOiB4LCBzdGVlcCA/IHggOiB5KTsNCi0gICAgICAgIGlmIChpc0JsYWNrICE9IGluQmxhY2spIHsNCi0gICAgICAgICAgICB0cmFuc2l0aW9ucysrOw0KLSAgICAgICAgICAgIGluQmxhY2sgPSBpc0JsYWNrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZXJyb3IgKz0gZHk7DQotICAgICAgICBpZiAoZXJyb3IgPiAwKSB7DQotICAgICAgICAgICAgaWYgKHkgPT0gdG9ZKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB5ICs9IHlzdGVwOw0KLSAgICAgICAgICAgIGVycm9yIC09IGR4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKGZyb20sIHRvLCB0cmFuc2l0aW9ucyk7DQotfQ0KLXZvaWQgQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6T3JkZXJCZXN0UGF0dGVybnMoQ0ZYX1B0ckFycmF5ICpwYXR0ZXJucykNCi17DQotICAgIEZYX0ZMT0FUIGFiRGlzdGFuY2UgPSAoRlhfRkxPQVQpRGlzdGFuY2UoKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMF0sIChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzFdKTsNCi0gICAgRlhfRkxPQVQgYmNEaXN0YW5jZSA9IChGWF9GTE9BVClEaXN0YW5jZSgoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsxXSwgKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl0pOw0KLSAgICBGWF9GTE9BVCBhY0Rpc3RhbmNlID0gKEZYX0ZMT0FUKURpc3RhbmNlKChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzBdLCAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXSk7DQotICAgIENCQ19SZXN1bHRQb2ludCAqdG9wTGVmdCwgKnRvcFJpZ2h0LCAqYm90dG9tTGVmdDsNCi0gICAgaWYgKGJjRGlzdGFuY2UgPj0gYWJEaXN0YW5jZSAmJiBiY0Rpc3RhbmNlID49IGFjRGlzdGFuY2UpIHsNCi0gICAgICAgIHRvcExlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVswXTsNCi0gICAgICAgIHRvcFJpZ2h0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMV07DQotICAgICAgICBib3R0b21MZWZ0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl07DQotICAgIH0gZWxzZSBpZiAoYWNEaXN0YW5jZSA+PSBiY0Rpc3RhbmNlICYmIGFjRGlzdGFuY2UgPj0gYWJEaXN0YW5jZSkgew0KLSAgICAgICAgdG9wTGVmdCA9IChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzFdOw0KLSAgICAgICAgdG9wUmlnaHQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVswXTsNCi0gICAgICAgIGJvdHRvbUxlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXTsNCisgIH0gZWxzZSB7DQorICAgIGludDMyX3QgZGltZW5zaW9uID0gRlhfTUlOKGRpbWVuc2lvblJpZ2h0LCBkaW1lbnNpb25Ub3ApOw0KKyAgICBjb3JyZWN0ZWRUb3BSaWdodCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4oDQorICAgICAgICBDb3JyZWN0VG9wUmlnaHQoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIHRvcExlZnQsIHRvcFJpZ2h0LCBkaW1lbnNpb24pKTsNCisgICAgaWYgKGNvcnJlY3RlZFRvcFJpZ2h0LmdldCgpID09IE5VTEwpIHsNCisgICAgICBjb3JyZWN0ZWRUb3BSaWdodCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4odG9wUmlnaHQpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgdG9wTGVmdCA9IChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzJdOw0KLSAgICAgICAgdG9wUmlnaHQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVswXTsNCi0gICAgICAgIGJvdHRvbUxlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsxXTsNCisgICAgICBkZWxldGUgdG9wUmlnaHQ7DQorICAgICAgdG9wUmlnaHQgPSBOVUxMOw0KICAgICB9DQotICAgIGlmICgoYm90dG9tTGVmdC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpKSAqICh0b3BSaWdodC0+R2V0WCgpIC0gdG9wTGVmdC0+R2V0WCgpKSA8IChib3R0b21MZWZ0LT5HZXRYKCkNCi0gICAgICAgICAgICAtIHRvcExlZnQtPkdldFgoKSkgKiAodG9wUmlnaHQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSkpIHsNCi0gICAgICAgIENCQ19SZXN1bHRQb2ludCAqdGVtcCA9IHRvcFJpZ2h0Ow0KLSAgICAgICAgdG9wUmlnaHQgPSBib3R0b21MZWZ0Ow0KLSAgICAgICAgYm90dG9tTGVmdCA9IHRlbXA7DQorICAgIGludDMyX3QgZGltZW5zaW9uQ29ycmVjdGVkID0NCisgICAgICAgIEZYX01BWChDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4odG9wTGVmdCwgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkpKQ0KKyAgICAgICAgICAgICAgICAgICAtPkdldFRyYW5zaXRpb25zKCksDQorICAgICAgICAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPigNCisgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbnNCZXR3ZWVuKGJvdHRvbVJpZ2h0LCBjb3JyZWN0ZWRUb3BSaWdodC5nZXQoKSkpDQorICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKSk7DQorICAgIGRpbWVuc2lvbkNvcnJlY3RlZCsrOw0KKyAgICBpZiAoKGRpbWVuc2lvbkNvcnJlY3RlZCAmIDB4MDEpID09IDEpIHsNCisgICAgICBkaW1lbnNpb25Db3JyZWN0ZWQrKzsNCiAgICAgfQ0KLSAgICAoKnBhdHRlcm5zKVswXSA9IGJvdHRvbUxlZnQ7DQotICAgICgqcGF0dGVybnMpWzFdID0gdG9wTGVmdDsNCi0gICAgKCpwYXR0ZXJucylbMl0gPSB0b3BSaWdodDsNCisgICAgYml0cyA9IENCQ19BdXRvUHRyPENCQ19Db21tb25CaXRNYXRyaXg+KFNhbXBsZUdyaWQoDQorICAgICAgICBtX2ltYWdlLCB0b3BMZWZ0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodCwgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCksDQorICAgICAgICBkaW1lbnNpb25Db3JyZWN0ZWQsIGRpbWVuc2lvbkNvcnJlY3RlZCwgZSkpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICBDRlhfUHRyQXJyYXkqIHJlc3VsdCA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQorICByZXN1bHQtPlNldFNpemUoNCk7DQorICByZXN1bHQtPkFkZCh0b3BMZWZ0KTsNCisgIHJlc3VsdC0+QWRkKGJvdHRvbUxlZnQpOw0KKyAgcmVzdWx0LT5BZGQoYm90dG9tUmlnaHQpOw0KKyAgcmVzdWx0LT5BZGQoY29ycmVjdGVkVG9wUmlnaHQucmVsZWFzZSgpKTsNCisgIHJldHVybiBGWF9ORVcgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQoYml0cy5yZWxlYXNlKCksIHJlc3VsdCk7DQorfQ0KK0NCQ19SZXN1bHRQb2ludCogQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6Q29ycmVjdFRvcFJpZ2h0UmVjdGFuZ3VsYXIoDQorICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21SaWdodCwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LA0KKyAgICBpbnQzMl90IGRpbWVuc2lvblRvcCwNCisgICAgaW50MzJfdCBkaW1lbnNpb25SaWdodCkgew0KKyAgRlhfRkxPQVQgY29yciA9IERpc3RhbmNlKGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0KSAvIChGWF9GTE9BVClkaW1lbnNpb25Ub3A7DQorICBpbnQzMl90IG5vcm0gPSBEaXN0YW5jZSh0b3BMZWZ0LCB0b3BSaWdodCk7DQorICBGWF9GTE9BVCBjb3MgPSAodG9wUmlnaHQtPkdldFgoKSAtIHRvcExlZnQtPkdldFgoKSkgLyBub3JtOw0KKyAgRlhfRkxPQVQgc2luID0gKHRvcFJpZ2h0LT5HZXRZKCkgLSB0b3BMZWZ0LT5HZXRZKCkpIC8gbm9ybTsNCisgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4gYzEoRlhfTkVXIENCQ19SZXN1bHRQb2ludCgNCisgICAgICB0b3BSaWdodC0+R2V0WCgpICsgY29yciAqIGNvcywgdG9wUmlnaHQtPkdldFkoKSArIGNvcnIgKiBzaW4pKTsNCisgIGNvcnIgPSBEaXN0YW5jZShib3R0b21MZWZ0LCB0b3BMZWZ0KSAvIChGWF9GTE9BVClkaW1lbnNpb25SaWdodDsNCisgIG5vcm0gPSBEaXN0YW5jZShib3R0b21SaWdodCwgdG9wUmlnaHQpOw0KKyAgY29zID0gKHRvcFJpZ2h0LT5HZXRYKCkgLSBib3R0b21SaWdodC0+R2V0WCgpKSAvIG5vcm07DQorICBzaW4gPSAodG9wUmlnaHQtPkdldFkoKSAtIGJvdHRvbVJpZ2h0LT5HZXRZKCkpIC8gbm9ybTsNCisgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4gYzIoRlhfTkVXIENCQ19SZXN1bHRQb2ludCgNCisgICAgICB0b3BSaWdodC0+R2V0WCgpICsgY29yciAqIGNvcywgdG9wUmlnaHQtPkdldFkoKSArIGNvcnIgKiBzaW4pKTsNCisgIGlmICghSXNWYWxpZChjMS5nZXQoKSkpIHsNCisgICAgaWYgKElzVmFsaWQoYzIuZ2V0KCkpKSB7DQorICAgICAgcmV0dXJuIGMyLnJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0gZWxzZSBpZiAoIUlzVmFsaWQoYzIuZ2V0KCkpKSB7DQorICAgIHJldHVybiBjMS5yZWxlYXNlKCk7DQorICB9DQorICBpbnQzMl90IGwxID0gRlhTWVNfYWJzKGRpbWVuc2lvblRvcCAtDQorICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4odG9wTGVmdCwgYzEuZ2V0KCkpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRUcmFuc2l0aW9ucygpKSArDQorICAgICAgICAgICAgICAgRlhTWVNfYWJzKGRpbWVuc2lvblJpZ2h0IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zaXRpb25zQmV0d2Vlbihib3R0b21SaWdodCwgYzEuZ2V0KCkpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRUcmFuc2l0aW9ucygpKTsNCisgIGludDMyX3QgbDIgPSBGWFNZU19hYnMoZGltZW5zaW9uVG9wIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zaXRpb25zQmV0d2Vlbih0b3BMZWZ0LCBjMi5nZXQoKSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFRyYW5zaXRpb25zKCkpICsNCisgICAgICAgICAgICAgICBGWFNZU19hYnMoZGltZW5zaW9uUmlnaHQgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbnNCZXR3ZWVuKGJvdHRvbVJpZ2h0LCBjMi5nZXQoKSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFRyYW5zaXRpb25zKCkpOw0KKyAgaWYgKGwxIDw9IGwyKSB7DQorICAgIHJldHVybiBjMS5yZWxlYXNlKCk7DQorICB9DQorICByZXR1cm4gYzIucmVsZWFzZSgpOw0KK30NCitDQkNfUmVzdWx0UG9pbnQqIENCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OkNvcnJlY3RUb3BSaWdodCgNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0LA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsDQorICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgIGludDMyX3QgZGltZW5zaW9uKSB7DQorICBGWF9GTE9BVCBjb3JyID0gRGlzdGFuY2UoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQpIC8gKEZYX0ZMT0FUKWRpbWVuc2lvbjsNCisgIGludDMyX3Qgbm9ybSA9IERpc3RhbmNlKHRvcExlZnQsIHRvcFJpZ2h0KTsNCisgIEZYX0ZMT0FUIGNvcyA9ICh0b3BSaWdodC0+R2V0WCgpIC0gdG9wTGVmdC0+R2V0WCgpKSAvIG5vcm07DQorICBGWF9GTE9BVCBzaW4gPSAodG9wUmlnaHQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSkgLyBub3JtOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiBjMShGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KA0KKyAgICAgIHRvcFJpZ2h0LT5HZXRYKCkgKyBjb3JyICogY29zLCB0b3BSaWdodC0+R2V0WSgpICsgY29yciAqIHNpbikpOw0KKyAgY29yciA9IERpc3RhbmNlKGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0KSAvIChGWF9GTE9BVClkaW1lbnNpb247DQorICBub3JtID0gRGlzdGFuY2UoYm90dG9tUmlnaHQsIHRvcFJpZ2h0KTsNCisgIGNvcyA9ICh0b3BSaWdodC0+R2V0WCgpIC0gYm90dG9tUmlnaHQtPkdldFgoKSkgLyBub3JtOw0KKyAgc2luID0gKHRvcFJpZ2h0LT5HZXRZKCkgLSBib3R0b21SaWdodC0+R2V0WSgpKSAvIG5vcm07DQorICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IGMyKEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoDQorICAgICAgdG9wUmlnaHQtPkdldFgoKSArIGNvcnIgKiBjb3MsIHRvcFJpZ2h0LT5HZXRZKCkgKyBjb3JyICogc2luKSk7DQorICBpZiAoIUlzVmFsaWQoYzEuZ2V0KCkpKSB7DQorICAgIGlmIChJc1ZhbGlkKGMyLmdldCgpKSkgew0KKyAgICAgIHJldHVybiBjMi5yZWxlYXNlKCk7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorICB9IGVsc2UgaWYgKCFJc1ZhbGlkKGMyLmdldCgpKSkgew0KKyAgICByZXR1cm4gYzEucmVsZWFzZSgpOw0KKyAgfQ0KKyAgaW50MzJfdCBsMSA9IEZYU1lTX2FicyhDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIGMxLmdldCgpKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIGMxLmdldCgpKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKSk7DQorICBpbnQzMl90IGwyID0gRlhTWVNfYWJzKENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4odG9wTGVmdCwgYzIuZ2V0KCkpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRUcmFuc2l0aW9ucygpIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zaXRpb25zQmV0d2Vlbihib3R0b21SaWdodCwgYzIuZ2V0KCkpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRUcmFuc2l0aW9ucygpKTsNCisgIHJldHVybiBsMSA8PSBsMiA/IGMxLnJlbGVhc2UoKSA6IGMyLnJlbGVhc2UoKTsNCit9DQorRlhfQk9PTCBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpJc1ZhbGlkKENCQ19SZXN1bHRQb2ludCogcCkgew0KKyAgcmV0dXJuIHAtPkdldFgoKSA+PSAwICYmIHAtPkdldFgoKSA8IG1faW1hZ2UtPkdldFdpZHRoKCkgJiYgcC0+R2V0WSgpID4gMCAmJg0KKyAgICAgICAgIHAtPkdldFkoKSA8IG1faW1hZ2UtPkdldEhlaWdodCgpOw0KK30NCitpbnQzMl90IENCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OlJvdW5kKEZYX0ZMT0FUIGQpIHsNCisgIHJldHVybiAoaW50MzJfdCkoZCArIDAuNWYpOw0KK30NCitpbnQzMl90IENCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OkRpc3RhbmNlKENCQ19SZXN1bHRQb2ludCogYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYikgew0KKyAgcmV0dXJuIFJvdW5kKA0KKyAgICAgIChGWF9GTE9BVClzcXJ0KChhLT5HZXRYKCkgLSBiLT5HZXRYKCkpICogKGEtPkdldFgoKSAtIGItPkdldFgoKSkgKw0KKyAgICAgICAgICAgICAgICAgICAgIChhLT5HZXRZKCkgLSBiLT5HZXRZKCkpICogKGEtPkdldFkoKSAtIGItPkdldFkoKSkpKTsNCit9DQordm9pZCBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpJbmNyZW1lbnQoDQorICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxDQkNfUmVzdWx0UG9pbnQqLCBpbnQzMl90PiYgdGFibGUsDQorICAgIENCQ19SZXN1bHRQb2ludCoga2V5KSB7DQorICBpbnQzMl90IHZhbHVlOw0KKyAgaWYgKHRhYmxlLkxvb2t1cChrZXksIHZhbHVlKSkgew0KKyAgICB0YWJsZS5TZXRBdChrZXksIElOVEVHRVJTW3ZhbHVlICsgMV0pOw0KKyAgfSBlbHNlIHsNCisgICAgdGFibGUuU2V0QXQoa2V5LCBJTlRFR0VSU1sxXSk7DQorICB9DQorfQ0KK0NCQ19Db21tb25CaXRNYXRyaXgqIENCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OlNhbXBsZUdyaWQoDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsDQorICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21SaWdodCwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BSaWdodCwNCisgICAgaW50MzJfdCBkaW1lbnNpb25YLA0KKyAgICBpbnQzMl90IGRpbWVuc2lvblksDQorICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19RUkdyaWRTYW1wbGVyJiBzYW1wbGVyID0gQ0JDX1FSR3JpZFNhbXBsZXI6OkdldEluc3RhbmNlKCk7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBjYm0gPSBzYW1wbGVyLlNhbXBsZUdyaWQoDQorICAgICAgaW1hZ2UsIGRpbWVuc2lvblgsIGRpbWVuc2lvblksIDAuNWYsIDAuNWYsIGRpbWVuc2lvblggLSAwLjVmLCAwLjVmLA0KKyAgICAgIGRpbWVuc2lvblggLSAwLjVmLCBkaW1lbnNpb25ZIC0gMC41ZiwgMC41ZiwgZGltZW5zaW9uWSAtIDAuNWYsDQorICAgICAgdG9wTGVmdC0+R2V0WCgpLCB0b3BMZWZ0LT5HZXRZKCksIHRvcFJpZ2h0LT5HZXRYKCksIHRvcFJpZ2h0LT5HZXRZKCksDQorICAgICAgYm90dG9tUmlnaHQtPkdldFgoKSwgYm90dG9tUmlnaHQtPkdldFkoKSwgYm90dG9tTGVmdC0+R2V0WCgpLA0KKyAgICAgIGJvdHRvbUxlZnQtPkdldFkoKSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gY2JtOw0KK30NCitDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMqIENCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OlRyYW5zaXRpb25zQmV0d2VlbigNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBmcm9tLA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHRvKSB7DQorICBpbnQzMl90IGZyb21YID0gKGludDMyX3QpZnJvbS0+R2V0WCgpOw0KKyAgaW50MzJfdCBmcm9tWSA9IChpbnQzMl90KWZyb20tPkdldFkoKTsNCisgIGludDMyX3QgdG9YID0gKGludDMyX3QpdG8tPkdldFgoKTsNCisgIGludDMyX3QgdG9ZID0gKGludDMyX3QpdG8tPkdldFkoKTsNCisgIEZYX0JPT0wgc3RlZXAgPSBGWFNZU19hYnModG9ZIC0gZnJvbVkpID4gRlhTWVNfYWJzKHRvWCAtIGZyb21YKTsNCisgIGlmIChzdGVlcCkgew0KKyAgICBpbnQzMl90IHRlbXAgPSBmcm9tWDsNCisgICAgZnJvbVggPSBmcm9tWTsNCisgICAgZnJvbVkgPSB0ZW1wOw0KKyAgICB0ZW1wID0gdG9YOw0KKyAgICB0b1ggPSB0b1k7DQorICAgIHRvWSA9IHRlbXA7DQorICB9DQorICBpbnQzMl90IGR4ID0gRlhTWVNfYWJzKHRvWCAtIGZyb21YKTsNCisgIGludDMyX3QgZHkgPSBGWFNZU19hYnModG9ZIC0gZnJvbVkpOw0KKyAgaW50MzJfdCBlcnJvciA9IC1keCA+PiAxOw0KKyAgaW50MzJfdCB5c3RlcCA9IGZyb21ZIDwgdG9ZID8gMSA6IC0xOw0KKyAgaW50MzJfdCB4c3RlcCA9IGZyb21YIDwgdG9YID8gMSA6IC0xOw0KKyAgaW50MzJfdCB0cmFuc2l0aW9ucyA9IDA7DQorICBGWF9CT09MIGluQmxhY2sgPSBtX2ltYWdlLT5HZXQoc3RlZXAgPyBmcm9tWSA6IGZyb21YLCBzdGVlcCA/IGZyb21YIDogZnJvbVkpOw0KKyAgZm9yIChpbnQzMl90IHggPSBmcm9tWCwgeSA9IGZyb21ZOyB4ICE9IHRvWDsgeCArPSB4c3RlcCkgew0KKyAgICBGWF9CT09MIGlzQmxhY2sgPSBtX2ltYWdlLT5HZXQoc3RlZXAgPyB5IDogeCwgc3RlZXAgPyB4IDogeSk7DQorICAgIGlmIChpc0JsYWNrICE9IGluQmxhY2spIHsNCisgICAgICB0cmFuc2l0aW9ucysrOw0KKyAgICAgIGluQmxhY2sgPSBpc0JsYWNrOw0KKyAgICB9DQorICAgIGVycm9yICs9IGR5Ow0KKyAgICBpZiAoZXJyb3IgPiAwKSB7DQorICAgICAgaWYgKHkgPT0gdG9ZKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgeSArPSB5c3RlcDsNCisgICAgICBlcnJvciAtPSBkeDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZYX05FVyBDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMoZnJvbSwgdG8sIHRyYW5zaXRpb25zKTsNCit9DQordm9pZCBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpPcmRlckJlc3RQYXR0ZXJucyhDRlhfUHRyQXJyYXkqIHBhdHRlcm5zKSB7DQorICBGWF9GTE9BVCBhYkRpc3RhbmNlID0gKEZYX0ZMT0FUKURpc3RhbmNlKChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzBdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsxXSk7DQorICBGWF9GTE9BVCBiY0Rpc3RhbmNlID0gKEZYX0ZMT0FUKURpc3RhbmNlKChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzFdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXSk7DQorICBGWF9GTE9BVCBhY0Rpc3RhbmNlID0gKEZYX0ZMT0FUKURpc3RhbmNlKChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzBdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXSk7DQorICBDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsICp0b3BSaWdodCwgKmJvdHRvbUxlZnQ7DQorICBpZiAoYmNEaXN0YW5jZSA+PSBhYkRpc3RhbmNlICYmIGJjRGlzdGFuY2UgPj0gYWNEaXN0YW5jZSkgew0KKyAgICB0b3BMZWZ0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMF07DQorICAgIHRvcFJpZ2h0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMV07DQorICAgIGJvdHRvbUxlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXTsNCisgIH0gZWxzZSBpZiAoYWNEaXN0YW5jZSA+PSBiY0Rpc3RhbmNlICYmIGFjRGlzdGFuY2UgPj0gYWJEaXN0YW5jZSkgew0KKyAgICB0b3BMZWZ0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMV07DQorICAgIHRvcFJpZ2h0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMF07DQorICAgIGJvdHRvbUxlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXTsNCisgIH0gZWxzZSB7DQorICAgIHRvcExlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXTsNCisgICAgdG9wUmlnaHQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVswXTsNCisgICAgYm90dG9tTGVmdCA9IChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzFdOw0KKyAgfQ0KKyAgaWYgKChib3R0b21MZWZ0LT5HZXRZKCkgLSB0b3BMZWZ0LT5HZXRZKCkpICoNCisgICAgICAgICAgKHRvcFJpZ2h0LT5HZXRYKCkgLSB0b3BMZWZ0LT5HZXRYKCkpIDwNCisgICAgICAoYm90dG9tTGVmdC0+R2V0WCgpIC0gdG9wTGVmdC0+R2V0WCgpKSAqDQorICAgICAgICAgICh0b3BSaWdodC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpKSkgew0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHRlbXAgPSB0b3BSaWdodDsNCisgICAgdG9wUmlnaHQgPSBib3R0b21MZWZ0Ow0KKyAgICBib3R0b21MZWZ0ID0gdGVtcDsNCisgIH0NCisgICgqcGF0dGVybnMpWzBdID0gYm90dG9tTGVmdDsNCisgICgqcGF0dGVybnMpWzFdID0gdG9wTGVmdDsNCisgICgqcGF0dGVybnMpWzJdID0gdG9wUmlnaHQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERldGVjdG9yLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZXRlY3Rvci5oCmluZGV4IGUzNmVmNjcuLjdjZjMyZGEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERldGVjdG9yLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGV0ZWN0b3IuaApAQCAtMTIsNjcgKzEyLDYyIEBACiBjbGFzcyBDQkNfUVJEZXRlY3RvclJlc3VsdDsNCiBjbGFzcyBDQkNfRGF0YU1hdHJpeERldGVjdG9yOw0KIGNsYXNzIFJlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zOw0KLWNsYXNzIENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucw0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyhDQkNfUmVzdWx0UG9pbnQgKmZyb20sIENCQ19SZXN1bHRQb2ludCAqdG8sIGludDMyX3QgdHJhbnNpdGlvbnMpDQotICAgIHsNCi0gICAgICAgIG1fZnJvbSA9IGZyb207DQotICAgICAgICBtX3RvID0gdG87DQotICAgICAgICBtX3RyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7DQotICAgIH0NCi0gICAgfkNCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucygpDQotICAgIHsNCi0gICAgfQ0KLSAgICBDQkNfUmVzdWx0UG9pbnQgKkdldEZyb20oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9mcm9tOw0KLSAgICB9DQotICAgIENCQ19SZXN1bHRQb2ludCAqR2V0VG8oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV90bzsNCi0gICAgfQ0KLSAgICBpbnQzMl90IEdldFRyYW5zaXRpb25zKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fdHJhbnNpdGlvbnM7DQotICAgIH0NCi1wcml2YXRlOg0KLSAgICBDQkNfUmVzdWx0UG9pbnQgKm1fZnJvbTsNCi0gICAgQ0JDX1Jlc3VsdFBvaW50ICptX3RvOw0KLSAgICBpbnQzMl90IG1fdHJhbnNpdGlvbnM7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zIHsNCisgcHVibGljOg0KKyAgQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKENCQ19SZXN1bHRQb2ludCogZnJvbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhbnNpdGlvbnMpIHsNCisgICAgbV9mcm9tID0gZnJvbTsNCisgICAgbV90byA9IHRvOw0KKyAgICBtX3RyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7DQorICB9DQorICB+Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKCkge30NCisgIENCQ19SZXN1bHRQb2ludCogR2V0RnJvbSgpIHsgcmV0dXJuIG1fZnJvbTsgfQ0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBHZXRUbygpIHsgcmV0dXJuIG1fdG87IH0NCisgIGludDMyX3QgR2V0VHJhbnNpdGlvbnMoKSB7IHJldHVybiBtX3RyYW5zaXRpb25zOyB9DQorDQorIHByaXZhdGU6DQorICBDQkNfUmVzdWx0UG9pbnQqIG1fZnJvbTsNCisgIENCQ19SZXN1bHRQb2ludCogbV90bzsNCisgIGludDMyX3QgbV90cmFuc2l0aW9uczsNCiB9Ow0KLWNsYXNzIENCQ19EYXRhTWF0cml4RGV0ZWN0b3INCi17DQotcHVibGljOg0KLSAgICBDQkNfRGF0YU1hdHJpeERldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlKTsNCi0gICAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhEZXRlY3RvcigpOw0KLSAgICBDQkNfUVJEZXRlY3RvclJlc3VsdCAqRGV0ZWN0KGludDMyX3QgJmUpOw0KLSAgICBDQkNfUmVzdWx0UG9pbnQgKkNvcnJlY3RUb3BSaWdodFJlY3Rhbmd1bGFyKENCQ19SZXN1bHRQb2ludCAqYm90dG9tTGVmdCwNCi0gICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbVJpZ2h0LA0KLSAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCAqdG9wTGVmdCwNCi0gICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKnRvcFJpZ2h0LA0KLSAgICAgICAgICAgIGludDMyX3QgZGltZW5zaW9uVG9wLCBpbnQzMl90IGRpbWVuc2lvblJpZ2h0KTsNCi0gICAgQ0JDX1Jlc3VsdFBvaW50ICpDb3JyZWN0VG9wUmlnaHQoQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21MZWZ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbVJpZ2h0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGltZW5zaW9uKTsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqU2FtcGxlR3JpZChDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50ICpib3R0b21MZWZ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCAqYm90dG9tUmlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50ICp0b3BSaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpbWVuc2lvblgsIGludDMyX3QgZGltZW5zaW9uWSwgaW50MzJfdCAmZSk7DQotICAgIENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyAqVHJhbnNpdGlvbnNCZXR3ZWVuKENCQ19SZXN1bHRQb2ludCAqZnJvbSwgQ0JDX1Jlc3VsdFBvaW50ICp0byk7DQotICAgIEZYX0JPT0wgSXNWYWxpZChDQkNfUmVzdWx0UG9pbnQgKnApOw0KLSAgICBpbnQzMl90IERpc3RhbmNlKENCQ19SZXN1bHRQb2ludCAqYSwgQ0JDX1Jlc3VsdFBvaW50ICpiKTsNCi0gICAgdm9pZCBJbmNyZW1lbnQoQ0ZYX01hcFB0clRlbXBsYXRlPENCQ19SZXN1bHRQb2ludCosIGludDMyX3Q+ICZ0YWJsZSwgQ0JDX1Jlc3VsdFBvaW50ICprZXkpOw0KLSAgICBpbnQzMl90IFJvdW5kKEZYX0ZMT0FUIGQpOw0KLSAgICB2b2lkIE9yZGVyQmVzdFBhdHRlcm5zKENGWF9QdHJBcnJheSAqcGF0dGVybnMpOw0KLSAgICB2aXJ0dWFsIHZvaWQgSW5pdChpbnQzMl90ICZlKTsNCi1wcml2YXRlOg0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4ICptX2ltYWdlOw0KLSAgICBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvciAqbV9yZWN0YW5nbGVEZXRlY3RvcjsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgSU5URUdFUlNbNV07DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhEZXRlY3RvciB7DQorIHB1YmxpYzoNCisgIENCQ19EYXRhTWF0cml4RGV0ZWN0b3IoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UpOw0KKyAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhEZXRlY3RvcigpOw0KKyAgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQqIERldGVjdChpbnQzMl90JiBlKTsNCisgIENCQ19SZXN1bHRQb2ludCogQ29ycmVjdFRvcFJpZ2h0UmVjdGFuZ3VsYXIoQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGltZW5zaW9uVG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpbWVuc2lvblJpZ2h0KTsNCisgIENCQ19SZXN1bHRQb2ludCogQ29ycmVjdFRvcFJpZ2h0KENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaW1lbnNpb24pOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogU2FtcGxlR3JpZChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbUxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGltZW5zaW9uWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaW1lbnNpb25ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyogVHJhbnNpdGlvbnNCZXR3ZWVuKENCQ19SZXN1bHRQb2ludCogZnJvbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG8pOw0KKyAgRlhfQk9PTCBJc1ZhbGlkKENCQ19SZXN1bHRQb2ludCogcCk7DQorICBpbnQzMl90IERpc3RhbmNlKENCQ19SZXN1bHRQb2ludCogYSwgQ0JDX1Jlc3VsdFBvaW50KiBiKTsNCisgIHZvaWQgSW5jcmVtZW50KENGWF9NYXBQdHJUZW1wbGF0ZTxDQkNfUmVzdWx0UG9pbnQqLCBpbnQzMl90PiYgdGFibGUsDQorICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGtleSk7DQorICBpbnQzMl90IFJvdW5kKEZYX0ZMT0FUIGQpOw0KKyAgdm9pZCBPcmRlckJlc3RQYXR0ZXJucyhDRlhfUHRyQXJyYXkqIHBhdHRlcm5zKTsNCisgIHZpcnR1YWwgdm9pZCBJbml0KGludDMyX3QmIGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9pbWFnZTsNCisgIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKiBtX3JlY3RhbmdsZURldGVjdG9yOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgSU5URUdFUlNbNV07DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4UmVhZGVyLmNwcAppbmRleCAxYjlmNTVkLi43ZTE3NzdmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhSZWFkZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFJlYWRlci5jcHAKQEAgLTI4LDQwICsyOCwzOSBAQAogI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhEZWNvZGVyLmgiDQogI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhEZXRlY3Rvci5oIg0KICNpbmNsdWRlICJCQ19EYXRhTWF0cml4UmVhZGVyLmgiDQotQ0JDX0RhdGFNYXRyaXhSZWFkZXI6OkNCQ19EYXRhTWF0cml4UmVhZGVyKCkNCi17DQotICAgIG1fZGVjb2RlciA9IE5VTEw7DQorQ0JDX0RhdGFNYXRyaXhSZWFkZXI6OkNCQ19EYXRhTWF0cml4UmVhZGVyKCkgew0KKyAgbV9kZWNvZGVyID0gTlVMTDsNCiB9DQotdm9pZCBDQkNfRGF0YU1hdHJpeFJlYWRlcjo6SW5pdCgpDQotew0KLSAgICBtX2RlY29kZXIgPSBGWF9ORVcgQ0JDX0RhdGFNYXRyaXhEZWNvZGVyOw0KLSAgICBtX2RlY29kZXItPkluaXQoKTsNCit2b2lkIENCQ19EYXRhTWF0cml4UmVhZGVyOjpJbml0KCkgew0KKyAgbV9kZWNvZGVyID0gRlhfTkVXIENCQ19EYXRhTWF0cml4RGVjb2RlcjsNCisgIG1fZGVjb2Rlci0+SW5pdCgpOw0KIH0NCi1DQkNfRGF0YU1hdHJpeFJlYWRlcjo6fkNCQ19EYXRhTWF0cml4UmVhZGVyKCkNCi17DQotICAgIGlmKG1fZGVjb2RlciAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgbV9kZWNvZGVyOw0KLSAgICB9DQotICAgIG1fZGVjb2RlciA9IE5VTEw7DQorQ0JDX0RhdGFNYXRyaXhSZWFkZXI6On5DQkNfRGF0YU1hdHJpeFJlYWRlcigpIHsNCisgIGlmIChtX2RlY29kZXIgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9kZWNvZGVyOw0KKyAgfQ0KKyAgbV9kZWNvZGVyID0gTlVMTDsNCiB9DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX0RhdGFNYXRyaXhSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19Db21tb25CaXRNYXRyaXggKmNkciA9IGltYWdlLT5HZXRCbGFja01hdHJpeChlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgQ0JDX0RhdGFNYXRyaXhEZXRlY3RvciBkZXRlY3RvcihjZHIpOw0KLSAgICBkZXRlY3Rvci5Jbml0KGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICBDQkNfUVJEZXRlY3RvclJlc3VsdCogZGRyID0gZGV0ZWN0b3IuRGV0ZWN0KGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICBDQkNfQXV0b1B0cjxDQkNfUVJEZXRlY3RvclJlc3VsdD4gZGV0ZWN0b3JSZXN1bHQoZGRyKTsNCi0gICAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIFJlc3VsdFRlbXAgPSBtX2RlY29kZXItPkRlY29kZShkZXRlY3RvclJlc3VsdC0+R2V0Qml0cygpLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ+IGRlY29kZVJlc3VsdChSZXN1bHRUZW1wKTsNCi0gICAgcmV0dXJuIGRlY29kZVJlc3VsdC0+R2V0VGV4dCgpOw0KK0NGWF9CeXRlU3RyaW5nIENCQ19EYXRhTWF0cml4UmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogY2RyID0gaW1hZ2UtPkdldEJsYWNrTWF0cml4KGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIENCQ19EYXRhTWF0cml4RGV0ZWN0b3IgZGV0ZWN0b3IoY2RyKTsNCisgIGRldGVjdG9yLkluaXQoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQqIGRkciA9IGRldGVjdG9yLkRldGVjdChlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBDQkNfQXV0b1B0cjxDQkNfUVJEZXRlY3RvclJlc3VsdD4gZGV0ZWN0b3JSZXN1bHQoZGRyKTsNCisgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBSZXN1bHRUZW1wID0NCisgICAgICBtX2RlY29kZXItPkRlY29kZShkZXRlY3RvclJlc3VsdC0+R2V0Qml0cygpLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uRGVjb2RlclJlc3VsdD4gZGVjb2RlUmVzdWx0KFJlc3VsdFRlbXApOw0KKyAgcmV0dXJuIGRlY29kZVJlc3VsdC0+R2V0VGV4dCgpOw0KIH0NCi1DRlhfQnl0ZVN0cmluZyBDQkNfRGF0YU1hdHJpeFJlYWRlcjo6RGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSBEZWNvZGUoaW1hZ2UsIDAsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICByZXR1cm4gYnM7DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX0RhdGFNYXRyaXhSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIGJzID0gRGVjb2RlKGltYWdlLCAwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICByZXR1cm4gYnM7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFJlYWRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4UmVhZGVyLmgKaW5kZXggNmJhMTdhOC4uMjk1ODIyMyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4UmVhZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4UmVhZGVyLmgKQEAgLTEwLDE2ICsxMCwxNiBAQAogY2xhc3MgQ0JDX0RhdGFNYXRyaXhEZWNvZGVyOw0KIGNsYXNzIENCQ19SZWFkZXI7DQogY2xhc3MgQ0JDX0RhdGFNYXRyaXhSZWFkZXI7DQotY2xhc3MgQ0JDX0RhdGFNYXRyaXhSZWFkZXIgIDogcHVibGljIENCQ19SZWFkZXINCi17DQotcHVibGljOg0KLSAgICBDQkNfRGF0YU1hdHJpeFJlYWRlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfRGF0YU1hdHJpeFJlYWRlcigpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIGludCBoaW50cywgaW50MzJfdCAmZSk7DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhSZWFkZXIgOiBwdWJsaWMgQ0JDX1JlYWRlciB7DQorIHB1YmxpYzoNCisgIENCQ19EYXRhTWF0cml4UmVhZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfRGF0YU1hdHJpeFJlYWRlcigpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLCBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgaW50IGhpbnRzLCBpbnQzMl90JiBlKTsNCiANCi0gICAgdmlydHVhbCB2b2lkIEluaXQoKTsNCi1wcml2YXRlOg0KLSAgICBDQkNfRGF0YU1hdHJpeERlY29kZXIgKm1fZGVjb2RlcjsNCisgIHZpcnR1YWwgdm9pZCBJbml0KCk7DQorDQorIHByaXZhdGU6DQorICBDQkNfRGF0YU1hdHJpeERlY29kZXIqIG1fZGVjb2RlcjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5jcHAKaW5kZXggZGZlMGUxMS4uZDYxNzZiZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5jcHAKQEAgLTI1LDE5ICsyNSwxNiBAQAogI2luY2x1ZGUgIkJDX1N5bWJvbFNoYXBlSGludC5oIg0KICNpbmNsdWRlICJCQ19TeW1ib2xJbmZvLmgiDQogI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgiDQotQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0OjpDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKSA6IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxNTU4LCA2MjAsIDIyLCAyMiwgMzYpDQotew0KLSAgICBtX3JzQmxvY2tEYXRhID0gLTE7DQotICAgIG1fcnNCbG9ja0Vycm9yID0gNjI7DQorQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0OjpDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKQ0KKyAgICA6IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxNTU4LCA2MjAsIDIyLCAyMiwgMzYpIHsNCisgIG1fcnNCbG9ja0RhdGEgPSAtMTsNCisgIG1fcnNCbG9ja0Vycm9yID0gNjI7DQogfQ0KLUNCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NDo6fkNCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpDQotew0KK0NCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NDo6fkNCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpIHt9DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQ6OmdldEludGVybGVhdmVkQmxvY2tDb3VudCgpIHsNCisgIHJldHVybiAxMDsNCiB9DQotaW50MzJfdCBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQ6OmdldEludGVybGVhdmVkQmxvY2tDb3VudCgpDQotew0KLSAgICByZXR1cm4gMTA7DQotfQ0KLWludDMyX3QgQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0Z2V0RGF0YUxlbmd0aEZvckludGVybGVhdmVkQmxvY2soaW50MzJfdCBpbmRleCkNCi17DQotICAgIHJldHVybiAoaW5kZXggPD0gOCkgPyAxNTYgOiAxNTU7DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDRnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jaygNCisgICAgaW50MzJfdCBpbmRleCkgew0KKyAgcmV0dXJuIChpbmRleCA8PSA4KSA/IDE1NiA6IDE1NTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oCmluZGV4IDJjMTM1NTEuLjZjMzI1YTQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgKQEAgLTgsMTIgKzgsMTEgQEAKICNkZWZpbmUgX0JDX0RBVEFNQVRSSVhTWU1CT0xJTkZPMTQ0X0hfDQogY2xhc3MgQ0JDX1N5bWJvbEluZm87DQogY2xhc3MgQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0Ow0KLWNsYXNzIENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCA6IHB1YmxpYyBDQkNfU3ltYm9sSW5mbw0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpOw0KLSAgICB2aXJ0dWFsIH5DQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKTsNCi0gICAgaW50MzJfdCBnZXRJbnRlcmxlYXZlZEJsb2NrQ291bnQoKTsNCi0gICAgaW50MzJfdCBnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KTsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQgOiBwdWJsaWMgQ0JDX1N5bWJvbEluZm8gew0KKyBwdWJsaWM6DQorICBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKTsNCisgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpOw0KKyAgaW50MzJfdCBnZXRJbnRlcmxlYXZlZEJsb2NrQ291bnQoKTsNCisgIGludDMyX3QgZ2V0RGF0YUxlbmd0aEZvckludGVybGVhdmVkQmxvY2soaW50MzJfdCBpbmRleCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhWZXJzaW9uLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFZlcnNpb24uY3BwCmluZGV4IGJiYmY0YmQuLjU1YjNjOGQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFZlcnNpb24uY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFZlcnNpb24uY3BwCkBAIC0yMywxMjUgKzIzLDE1MCBAQAogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfRGF0YU1hdHJpeFZlcnNpb24uaCINCiBDRlhfUHRyQXJyYXkqIENCQ19EYXRhTWF0cml4VmVyc2lvbjo6VkVSU0lPTlMgPSBOVUxMOw0KLXZvaWQgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpJbml0aWFsaXplKCkNCi17DQotICAgIFZFUlNJT05TID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpJbml0aWFsaXplKCkgew0KKyAgVkVSU0lPTlMgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5KCk7DQogfQ0KLXZvaWQgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpGaW5hbGl6ZSgpDQotew0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBWRVJTSU9OUy0+R2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIGRlbGV0ZSAoIChDQkNfRGF0YU1hdHJpeFZlcnNpb24qKShWRVJTSU9OUy0+R2V0QXQoaSkpICk7DQotICAgIH0NCi0gICAgVkVSU0lPTlMtPlJlbW92ZUFsbCgpOw0KLSAgICBkZWxldGUgVkVSU0lPTlM7DQordm9pZCBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkZpbmFsaXplKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgVkVSU0lPTlMtPkdldFNpemUoKTsgaSsrKSB7DQorICAgIGRlbGV0ZSAoKENCQ19EYXRhTWF0cml4VmVyc2lvbiopKFZFUlNJT05TLT5HZXRBdChpKSkpOw0KKyAgfQ0KKyAgVkVSU0lPTlMtPlJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIFZFUlNJT05TOw0KIH0NCiBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkNCQ19EYXRhTWF0cml4VmVyc2lvbihpbnQzMl90IHZlcnNpb25OdW1iZXIsDQotICAgICAgICBpbnQzMl90IHN5bWJvbFNpemVSb3dzLA0KLSAgICAgICAgaW50MzJfdCBzeW1ib2xTaXplQ29sdW1ucywNCi0gICAgICAgIGludDMyX3QgZGF0YVJlZ2lvblNpemVSb3dzLA0KLSAgICAgICAgaW50MzJfdCBkYXRhUmVnaW9uU2l6ZUNvbHVtbnMsDQotICAgICAgICBFQ0Jsb2NrcyAqZWNCbG9ja3MpDQotew0KLSAgICBtX3ZlcnNpb25OdW1iZXIgPSB2ZXJzaW9uTnVtYmVyOw0KLSAgICBtX3N5bWJvbFNpemVSb3dzID0gc3ltYm9sU2l6ZVJvd3M7DQotICAgIG1fc3ltYm9sU2l6ZUNvbHVtbnMgPSBzeW1ib2xTaXplQ29sdW1uczsNCi0gICAgbV9kYXRhUmVnaW9uU2l6ZVJvd3MgPSBkYXRhUmVnaW9uU2l6ZVJvd3M7DQotICAgIG1fZGF0YVJlZ2lvblNpemVDb2x1bW5zID0gZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KLSAgICBtX2VjQmxvY2tzID0gZWNCbG9ja3M7DQotICAgIGludDMyX3QgdG90YWwgPSAwOw0KLSAgICBpbnQzMl90IGVjQ29kZXdvcmRzID0gZWNCbG9ja3MtPkdldEVDQ29kZXdvcmRzKCk7DQotICAgIGNvbnN0IENGWF9QdHJBcnJheSAmZWNiQXJyYXkgPSBlY0Jsb2Nrcy0+R2V0RUNCbG9ja3MoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZWNiQXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIHRvdGFsICs9ICgoRUNCKillY2JBcnJheVtpXSktPkdldENvdW50KCkgKiAoKChFQ0IqKWVjYkFycmF5W2ldKS0+R2V0RGF0YUNvZGV3b3JkcygpICsgZWNDb2Rld29yZHMpOw0KLSAgICB9DQotICAgIG1fdG90YWxDb2Rld29yZHMgPSB0b3RhbDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN5bWJvbFNpemVSb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3ltYm9sU2l6ZUNvbHVtbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhUmVnaW9uU2l6ZVJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhUmVnaW9uU2l6ZUNvbHVtbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNCbG9ja3MqIGVjQmxvY2tzKSB7DQorICBtX3ZlcnNpb25OdW1iZXIgPSB2ZXJzaW9uTnVtYmVyOw0KKyAgbV9zeW1ib2xTaXplUm93cyA9IHN5bWJvbFNpemVSb3dzOw0KKyAgbV9zeW1ib2xTaXplQ29sdW1ucyA9IHN5bWJvbFNpemVDb2x1bW5zOw0KKyAgbV9kYXRhUmVnaW9uU2l6ZVJvd3MgPSBkYXRhUmVnaW9uU2l6ZVJvd3M7DQorICBtX2RhdGFSZWdpb25TaXplQ29sdW1ucyA9IGRhdGFSZWdpb25TaXplQ29sdW1uczsNCisgIG1fZWNCbG9ja3MgPSBlY0Jsb2NrczsNCisgIGludDMyX3QgdG90YWwgPSAwOw0KKyAgaW50MzJfdCBlY0NvZGV3b3JkcyA9IGVjQmxvY2tzLT5HZXRFQ0NvZGV3b3JkcygpOw0KKyAgY29uc3QgQ0ZYX1B0ckFycmF5JiBlY2JBcnJheSA9IGVjQmxvY2tzLT5HZXRFQ0Jsb2NrcygpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZWNiQXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgdG90YWwgKz0gKChFQ0IqKWVjYkFycmF5W2ldKS0+R2V0Q291bnQoKSAqDQorICAgICAgICAgICAgICgoKEVDQiopZWNiQXJyYXlbaV0pLT5HZXREYXRhQ29kZXdvcmRzKCkgKyBlY0NvZGV3b3Jkcyk7DQorICB9DQorICBtX3RvdGFsQ29kZXdvcmRzID0gdG90YWw7DQogfQ0KLUNCQ19EYXRhTWF0cml4VmVyc2lvbjo6fkNCQ19EYXRhTWF0cml4VmVyc2lvbigpDQotew0KLSAgICBpZihtX2VjQmxvY2tzICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBtX2VjQmxvY2tzOw0KLSAgICB9DQotICAgIG1fZWNCbG9ja3MgPSBOVUxMOw0KK0NCQ19EYXRhTWF0cml4VmVyc2lvbjo6fkNCQ19EYXRhTWF0cml4VmVyc2lvbigpIHsNCisgIGlmIChtX2VjQmxvY2tzICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fZWNCbG9ja3M7DQorICB9DQorICBtX2VjQmxvY2tzID0gTlVMTDsNCiB9DQotaW50MzJfdCBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldFZlcnNpb25OdW1iZXIoKQ0KLXsNCi0gICAgcmV0dXJuIG1fdmVyc2lvbk51bWJlcjsNCitpbnQzMl90IENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0VmVyc2lvbk51bWJlcigpIHsNCisgIHJldHVybiBtX3ZlcnNpb25OdW1iZXI7DQogfQ0KLWludDMyX3QgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpHZXRTeW1ib2xTaXplUm93cygpDQotew0KLSAgICByZXR1cm4gbV9zeW1ib2xTaXplUm93czsNCitpbnQzMl90IENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0U3ltYm9sU2l6ZVJvd3MoKSB7DQorICByZXR1cm4gbV9zeW1ib2xTaXplUm93czsNCiB9DQotaW50MzJfdCBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldFN5bWJvbFNpemVDb2x1bW5zKCkNCi17DQotICAgIHJldHVybiBtX3N5bWJvbFNpemVDb2x1bW5zOw0KK2ludDMyX3QgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpHZXRTeW1ib2xTaXplQ29sdW1ucygpIHsNCisgIHJldHVybiBtX3N5bWJvbFNpemVDb2x1bW5zOw0KIH0NCi1pbnQzMl90IENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0RGF0YVJlZ2lvblNpemVSb3dzKCkNCi17DQotICAgIHJldHVybiBtX2RhdGFSZWdpb25TaXplUm93czsNCitpbnQzMl90IENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0RGF0YVJlZ2lvblNpemVSb3dzKCkgew0KKyAgcmV0dXJuIG1fZGF0YVJlZ2lvblNpemVSb3dzOw0KIH0NCi1pbnQzMl90IENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0RGF0YVJlZ2lvblNpemVDb2x1bW5zKCkNCi17DQotICAgIHJldHVybiBtX2RhdGFSZWdpb25TaXplQ29sdW1uczsNCitpbnQzMl90IENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0RGF0YVJlZ2lvblNpemVDb2x1bW5zKCkgew0KKyAgcmV0dXJuIG1fZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KIH0NCi1pbnQzMl90IENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0VG90YWxDb2Rld29yZHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fdG90YWxDb2Rld29yZHM7DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldFRvdGFsQ29kZXdvcmRzKCkgew0KKyAgcmV0dXJuIG1fdG90YWxDb2Rld29yZHM7DQogfQ0KLUVDQmxvY2tzICpDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldEVDQmxvY2tzKCkNCi17DQotICAgIHJldHVybiBtX2VjQmxvY2tzOw0KK0VDQmxvY2tzKiBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldEVDQmxvY2tzKCkgew0KKyAgcmV0dXJuIG1fZWNCbG9ja3M7DQogfQ0KLXZvaWQgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpSZWxlYXNlQWxsKCkNCi17DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IFZFUlNJT05TLT5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgZGVsZXRlIChDQkNfRGF0YU1hdHJpeFZlcnNpb24qKVZFUlNJT05TLT5HZXRBdChpKTsNCi0gICAgfQ0KLSAgICBWRVJTSU9OUy0+UmVtb3ZlQWxsKCk7DQordm9pZCBDQkNfRGF0YU1hdHJpeFZlcnNpb246OlJlbGVhc2VBbGwoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBWRVJTSU9OUy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgZGVsZXRlIChDQkNfRGF0YU1hdHJpeFZlcnNpb24qKVZFUlNJT05TLT5HZXRBdChpKTsNCisgIH0NCisgIFZFUlNJT05TLT5SZW1vdmVBbGwoKTsNCiB9DQotQ0JDX0RhdGFNYXRyaXhWZXJzaW9uICpDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldFZlcnNpb25Gb3JEaW1lbnNpb25zKGludDMyX3QgbnVtUm93cywgaW50MzJfdCBudW1Db2x1bW5zLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKChudW1Sb3dzICYgMHgwMSkgIT0gMCB8fCAobnVtQ29sdW1ucyAmIDB4MDEpICE9IDApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaWYoVkVSU0lPTlMtPkdldFNpemUoKSA9PSAwKSB7DQotICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMSwgMTAsIDEwLCA4LCA4LCBGWF9ORVcgRUNCbG9ja3MoNSwgRlhfTkVXIEVDQigxLCAzKSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigyLCAxMiwgMTIsIDEwLCAxMCwgRlhfTkVXIEVDQmxvY2tzKDcsIEZYX05FVyBFQ0IoMSwgNSkpKSk7DQotICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMywgMTQsIDE0LCAxMiwgMTIsIEZYX05FVyBFQ0Jsb2NrcygxMCwgRlhfTkVXIEVDQigxLCA4KSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbig0LCAxNiwgMTYsIDE0LCAxNCwgRlhfTkVXIEVDQmxvY2tzKDEyLCBGWF9ORVcgRUNCKDEsIDEyKSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbig1LCAxOCwgMTgsIDE2LCAxNiwgRlhfTkVXIEVDQmxvY2tzKDE0LCBGWF9ORVcgRUNCKDEsIDE4KSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbig2LCAyMCwgMjAsIDE4LCAxOCwgRlhfTkVXIEVDQmxvY2tzKDE4LCBGWF9ORVcgRUNCKDEsIDIyKSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbig3LCAyMiwgMjIsIDIwLCAyMCwgRlhfTkVXIEVDQmxvY2tzKDIwLCBGWF9ORVcgRUNCKDEsIDMwKSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbig4LCAyNCwgMjQsIDIyLCAyMiwgRlhfTkVXIEVDQmxvY2tzKDI0LCBGWF9ORVcgRUNCKDEsIDM2KSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbig5LCAyNiwgMjYsIDI0LCAyNCwgRlhfTkVXIEVDQmxvY2tzKDI4LCBGWF9ORVcgRUNCKDEsIDQ0KSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigxMCwgMzIsIDMyLCAxNCwgMTQsIEZYX05FVyBFQ0Jsb2NrcygzNiwgRlhfTkVXIEVDQigxLCA2MikpKSk7DQotICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTEsIDM2LCAzNiwgMTYsIDE2LCBGWF9ORVcgRUNCbG9ja3MoNDIsIEZYX05FVyBFQ0IoMSwgODYpKSkpOw0KLSAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDEyLCA0MCwgNDAsIDE4LCAxOCwgRlhfTkVXIEVDQmxvY2tzKDQ4LCBGWF9ORVcgRUNCKDEsIDExNCkpKSk7DQotICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTMsIDQ0LCA0NCwgMjAsIDIwLCBGWF9ORVcgRUNCbG9ja3MoNTYsIEZYX05FVyBFQ0IoMSwgMTQ0KSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigxNCwgNDgsIDQ4LCAyMiwgMjIsIEZYX05FVyBFQ0Jsb2Nrcyg2OCwgRlhfTkVXIEVDQigxLCAxNzQpKSkpOw0KLSAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDE1LCA1MiwgNTIsIDI0LCAyNCwgRlhfTkVXIEVDQmxvY2tzKDQyLCBGWF9ORVcgRUNCKDIsIDEwMikpKSk7DQotICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTYsIDY0LCA2NCwgMTQsIDE0LCBGWF9ORVcgRUNCbG9ja3MoNTYsIEZYX05FVyBFQ0IoMiwgMTQwKSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigxNywgNzIsIDcyLCAxNiwgMTYsIEZYX05FVyBFQ0Jsb2NrcygzNiwgRlhfTkVXIEVDQig0LCA5MikpKSk7DQotICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTgsIDgwLCA4MCwgMTgsIDE4LCBGWF9ORVcgRUNCbG9ja3MoNDgsIEZYX05FVyBFQ0IoNCwgMTE0KSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigxOSwgODgsIDg4LCAyMCwgMjAsIEZYX05FVyBFQ0Jsb2Nrcyg1NiwgRlhfTkVXIEVDQig0LCAxNDQpKSkpOw0KLSAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDIwLCA5NiwgOTYsIDIyLCAyMiwgRlhfTkVXIEVDQmxvY2tzKDY4LCBGWF9ORVcgRUNCKDQsIDE3NCkpKSk7DQotICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMjEsIDEwNCwgMTA0LCAyNCwgMjQsIEZYX05FVyBFQ0Jsb2Nrcyg1NiwgRlhfTkVXIEVDQig2LCAxMzYpKSkpOw0KLSAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDIyLCAxMjAsIDEyMCwgMTgsIDE4LCBGWF9ORVcgRUNCbG9ja3MoNjgsIEZYX05FVyBFQ0IoNiwgMTc1KSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigyMywgMTMyLCAxMzIsIDIwLCAyMCwgRlhfTkVXIEVDQmxvY2tzKDYyLCBGWF9ORVcgRUNCKDgsIDE2MykpKSk7DQotICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMjQsIDE0NCwgMTQ0LCAyMiwgMjIsIEZYX05FVyBFQ0Jsb2Nrcyg2MiwgRlhfTkVXIEVDQig4LCAxNTYpLCBGWF9ORVcgRUNCKDIsIDE1NSkpKSk7DQotICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMjUsIDgsIDE4LCA2LCAxNiwgRlhfTkVXIEVDQmxvY2tzKDcsIEZYX05FVyBFQ0IoMSwgNSkpKSk7DQotICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMjYsIDgsIDMyLCA2LCAxNCwgRlhfTkVXIEVDQmxvY2tzKDExLCBGWF9ORVcgRUNCKDEsIDEwKSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigyNywgMTIsIDI2LCAxMCwgMjQsIEZYX05FVyBFQ0Jsb2NrcygxNCwgRlhfTkVXIEVDQigxLCAxNikpKSk7DQotICAgICAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMjgsIDEyLCAzNiwgMTAsIDE2LCBGWF9ORVcgRUNCbG9ja3MoMTgsIEZYX05FVyBFQ0IoMSwgMjIpKSkpOw0KLSAgICAgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDI5LCAxNiwgMzYsIDE0LCAxNiwgRlhfTkVXIEVDQmxvY2tzKDI0LCBGWF9ORVcgRUNCKDEsIDMyKSkpKTsNCi0gICAgICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigzMCwgMTYsIDQ4LCAxNCwgMjIsIEZYX05FVyBFQ0Jsb2NrcygyOCwgRlhfTkVXIEVDQigxLCA0OSkpKSk7DQotICAgIH0NCi0gICAgaW50MzJfdCBudW1WZXJzaW9ucyA9IFZFUlNJT05TLT5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVZlcnNpb25zOyArK2kpIHsNCi0gICAgICAgIGlmICgoKENCQ19EYXRhTWF0cml4VmVyc2lvbiopKCgqVkVSU0lPTlMpW2ldKSktPm1fc3ltYm9sU2l6ZVJvd3MgPT0gbnVtUm93cyAmJiAoKENCQ19EYXRhTWF0cml4VmVyc2lvbiopKCgqVkVSU0lPTlMpW2ldKSktPm1fc3ltYm9sU2l6ZUNvbHVtbnMgPT0gbnVtQ29sdW1ucykgew0KLSAgICAgICAgICAgIHJldHVybiAoQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKikoKlZFUlNJT05TKVtpXTsNCi0gICAgICAgIH0NCi0gICAgfQ0KK0NCQ19EYXRhTWF0cml4VmVyc2lvbiogQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpHZXRWZXJzaW9uRm9yRGltZW5zaW9ucygNCisgICAgaW50MzJfdCBudW1Sb3dzLA0KKyAgICBpbnQzMl90IG51bUNvbHVtbnMsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmICgobnVtUm93cyAmIDB4MDEpICE9IDAgfHwgKG51bUNvbHVtbnMgJiAweDAxKSAhPSAwKSB7DQogICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KICAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChWRVJTSU9OUy0+R2V0U2l6ZSgpID09IDApIHsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgMSwgMTAsIDEwLCA4LCA4LCBGWF9ORVcgRUNCbG9ja3MoNSwgRlhfTkVXIEVDQigxLCAzKSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgMiwgMTIsIDEyLCAxMCwgMTAsIEZYX05FVyBFQ0Jsb2Nrcyg3LCBGWF9ORVcgRUNCKDEsIDUpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICAzLCAxNCwgMTQsIDEyLCAxMiwgRlhfTkVXIEVDQmxvY2tzKDEwLCBGWF9ORVcgRUNCKDEsIDgpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICA0LCAxNiwgMTYsIDE0LCAxNCwgRlhfTkVXIEVDQmxvY2tzKDEyLCBGWF9ORVcgRUNCKDEsIDEyKSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgNSwgMTgsIDE4LCAxNiwgMTYsIEZYX05FVyBFQ0Jsb2NrcygxNCwgRlhfTkVXIEVDQigxLCAxOCkpKSk7DQorICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigNCisgICAgICAgIDYsIDIwLCAyMCwgMTgsIDE4LCBGWF9ORVcgRUNCbG9ja3MoMTgsIEZYX05FVyBFQ0IoMSwgMjIpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICA3LCAyMiwgMjIsIDIwLCAyMCwgRlhfTkVXIEVDQmxvY2tzKDIwLCBGWF9ORVcgRUNCKDEsIDMwKSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgOCwgMjQsIDI0LCAyMiwgMjIsIEZYX05FVyBFQ0Jsb2NrcygyNCwgRlhfTkVXIEVDQigxLCAzNikpKSk7DQorICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigNCisgICAgICAgIDksIDI2LCAyNiwgMjQsIDI0LCBGWF9ORVcgRUNCbG9ja3MoMjgsIEZYX05FVyBFQ0IoMSwgNDQpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICAxMCwgMzIsIDMyLCAxNCwgMTQsIEZYX05FVyBFQ0Jsb2NrcygzNiwgRlhfTkVXIEVDQigxLCA2MikpKSk7DQorICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigNCisgICAgICAgIDExLCAzNiwgMzYsIDE2LCAxNiwgRlhfTkVXIEVDQmxvY2tzKDQyLCBGWF9ORVcgRUNCKDEsIDg2KSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgMTIsIDQwLCA0MCwgMTgsIDE4LCBGWF9ORVcgRUNCbG9ja3MoNDgsIEZYX05FVyBFQ0IoMSwgMTE0KSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgMTMsIDQ0LCA0NCwgMjAsIDIwLCBGWF9ORVcgRUNCbG9ja3MoNTYsIEZYX05FVyBFQ0IoMSwgMTQ0KSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgMTQsIDQ4LCA0OCwgMjIsIDIyLCBGWF9ORVcgRUNCbG9ja3MoNjgsIEZYX05FVyBFQ0IoMSwgMTc0KSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgMTUsIDUyLCA1MiwgMjQsIDI0LCBGWF9ORVcgRUNCbG9ja3MoNDIsIEZYX05FVyBFQ0IoMiwgMTAyKSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgMTYsIDY0LCA2NCwgMTQsIDE0LCBGWF9ORVcgRUNCbG9ja3MoNTYsIEZYX05FVyBFQ0IoMiwgMTQwKSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgMTcsIDcyLCA3MiwgMTYsIDE2LCBGWF9ORVcgRUNCbG9ja3MoMzYsIEZYX05FVyBFQ0IoNCwgOTIpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICAxOCwgODAsIDgwLCAxOCwgMTgsIEZYX05FVyBFQ0Jsb2Nrcyg0OCwgRlhfTkVXIEVDQig0LCAxMTQpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICAxOSwgODgsIDg4LCAyMCwgMjAsIEZYX05FVyBFQ0Jsb2Nrcyg1NiwgRlhfTkVXIEVDQig0LCAxNDQpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICAyMCwgOTYsIDk2LCAyMiwgMjIsIEZYX05FVyBFQ0Jsb2Nrcyg2OCwgRlhfTkVXIEVDQig0LCAxNzQpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICAyMSwgMTA0LCAxMDQsIDI0LCAyNCwgRlhfTkVXIEVDQmxvY2tzKDU2LCBGWF9ORVcgRUNCKDYsIDEzNikpKSk7DQorICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigNCisgICAgICAgIDIyLCAxMjAsIDEyMCwgMTgsIDE4LCBGWF9ORVcgRUNCbG9ja3MoNjgsIEZYX05FVyBFQ0IoNiwgMTc1KSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgMjMsIDEzMiwgMTMyLCAyMCwgMjAsIEZYX05FVyBFQ0Jsb2Nrcyg2MiwgRlhfTkVXIEVDQig4LCAxNjMpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICAyNCwgMTQ0LCAxNDQsIDIyLCAyMiwNCisgICAgICAgIEZYX05FVyBFQ0Jsb2Nrcyg2MiwgRlhfTkVXIEVDQig4LCAxNTYpLCBGWF9ORVcgRUNCKDIsIDE1NSkpKSk7DQorICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigNCisgICAgICAgIDI1LCA4LCAxOCwgNiwgMTYsIEZYX05FVyBFQ0Jsb2Nrcyg3LCBGWF9ORVcgRUNCKDEsIDUpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICAyNiwgOCwgMzIsIDYsIDE0LCBGWF9ORVcgRUNCbG9ja3MoMTEsIEZYX05FVyBFQ0IoMSwgMTApKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICAyNywgMTIsIDI2LCAxMCwgMjQsIEZYX05FVyBFQ0Jsb2NrcygxNCwgRlhfTkVXIEVDQigxLCAxNikpKSk7DQorICAgIFZFUlNJT05TLT5BZGQoRlhfTkVXIENCQ19EYXRhTWF0cml4VmVyc2lvbigNCisgICAgICAgIDI4LCAxMiwgMzYsIDEwLCAxNiwgRlhfTkVXIEVDQmxvY2tzKDE4LCBGWF9ORVcgRUNCKDEsIDIyKSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChGWF9ORVcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgMjksIDE2LCAzNiwgMTQsIDE2LCBGWF9ORVcgRUNCbG9ja3MoMjQsIEZYX05FVyBFQ0IoMSwgMzIpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKEZYX05FVyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oDQorICAgICAgICAzMCwgMTYsIDQ4LCAxNCwgMjIsIEZYX05FVyBFQ0Jsb2NrcygyOCwgRlhfTkVXIEVDQigxLCA0OSkpKSk7DQorICB9DQorICBpbnQzMl90IG51bVZlcnNpb25zID0gVkVSU0lPTlMtPkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVZlcnNpb25zOyArK2kpIHsNCisgICAgaWYgKCgoQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKikoKCpWRVJTSU9OUylbaV0pKS0+bV9zeW1ib2xTaXplUm93cyA9PQ0KKyAgICAgICAgICAgIG51bVJvd3MgJiYNCisgICAgICAgICgoQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKikoKCpWRVJTSU9OUylbaV0pKS0+bV9zeW1ib2xTaXplQ29sdW1ucyA9PQ0KKyAgICAgICAgICAgIG51bUNvbHVtbnMpIHsNCisgICAgICByZXR1cm4gKENCQ19EYXRhTWF0cml4VmVyc2lvbiopKCpWRVJTSU9OUylbaV07DQorICAgIH0NCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFZlcnNpb24uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFZlcnNpb24uaAppbmRleCA5MGY2NTA5Li44ZTE5N2IxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhWZXJzaW9uLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4VmVyc2lvbi5oCkBAIC04LDkzICs4LDc5IEBACiAjZGVmaW5lIF9CQ19EQVRBTUFUUklYVkVSU0lPTl9IXw0KIGNsYXNzIEVDQmxvY2tzOw0KIGNsYXNzIENCQ19EYXRhTWF0cml4VmVyc2lvbjsNCi1jbGFzcyBFQ0INCi17DQotcHVibGljOg0KLSAgICBFQ0IoaW50MzJfdCBjb3VudCwgaW50MzJfdCBkYXRhQ29kZXdvcmRzKQ0KLSAgICB7DQotICAgICAgICBtX2NvdW50ID0gY291bnQ7DQotICAgICAgICBtX2RhdGFDb2Rld29yZHMgPSBkYXRhQ29kZXdvcmRzOw0KLSAgICB9DQorY2xhc3MgRUNCIHsNCisgcHVibGljOg0KKyAgRUNCKGludDMyX3QgY291bnQsIGludDMyX3QgZGF0YUNvZGV3b3Jkcykgew0KKyAgICBtX2NvdW50ID0gY291bnQ7DQorICAgIG1fZGF0YUNvZGV3b3JkcyA9IGRhdGFDb2Rld29yZHM7DQorICB9DQogDQotICAgIGludDMyX3QgR2V0Q291bnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9jb3VudDsNCi0gICAgfQ0KKyAgaW50MzJfdCBHZXRDb3VudCgpIHsgcmV0dXJuIG1fY291bnQ7IH0NCiANCi0gICAgaW50MzJfdCBHZXREYXRhQ29kZXdvcmRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZGF0YUNvZGV3b3JkczsNCi0gICAgfQ0KLXByaXZhdGU6DQotICAgIGludDMyX3QgbV9jb3VudDsNCi0gICAgaW50MzJfdCBtX2RhdGFDb2Rld29yZHM7DQorICBpbnQzMl90IEdldERhdGFDb2Rld29yZHMoKSB7IHJldHVybiBtX2RhdGFDb2Rld29yZHM7IH0NCisNCisgcHJpdmF0ZToNCisgIGludDMyX3QgbV9jb3VudDsNCisgIGludDMyX3QgbV9kYXRhQ29kZXdvcmRzOw0KIH07DQotY2xhc3MgRUNCbG9ja3MNCi17DQotcHVibGljOg0KLSAgICBFQ0Jsb2NrcyhpbnQzMl90IGVjQ29kZXdvcmRzLCBFQ0IgKmVjQmxvY2tzKQ0KLSAgICB7DQotICAgICAgICBtX2VjQ29kZXdvcmRzID0gZWNDb2Rld29yZHM7DQotICAgICAgICBtX2VjQmxvY2tzLkFkZChlY0Jsb2Nrcyk7DQotICAgIH0NCitjbGFzcyBFQ0Jsb2NrcyB7DQorIHB1YmxpYzoNCisgIEVDQmxvY2tzKGludDMyX3QgZWNDb2Rld29yZHMsIEVDQiogZWNCbG9ja3MpIHsNCisgICAgbV9lY0NvZGV3b3JkcyA9IGVjQ29kZXdvcmRzOw0KKyAgICBtX2VjQmxvY2tzLkFkZChlY0Jsb2Nrcyk7DQorICB9DQogDQotICAgIEVDQmxvY2tzKGludDMyX3QgZWNDb2Rld29yZHMsIEVDQiAqZWNCbG9ja3MxLCBFQ0IgKmVjQmxvY2tzMikNCi0gICAgew0KLSAgICAgICAgbV9lY0NvZGV3b3JkcyA9IGVjQ29kZXdvcmRzOw0KLSAgICAgICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MxKTsNCi0gICAgICAgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzMik7DQorICBFQ0Jsb2NrcyhpbnQzMl90IGVjQ29kZXdvcmRzLCBFQ0IqIGVjQmxvY2tzMSwgRUNCKiBlY0Jsb2NrczIpIHsNCisgICAgbV9lY0NvZGV3b3JkcyA9IGVjQ29kZXdvcmRzOw0KKyAgICBtX2VjQmxvY2tzLkFkZChlY0Jsb2NrczEpOw0KKyAgICBtX2VjQmxvY2tzLkFkZChlY0Jsb2NrczIpOw0KKyAgfQ0KKyAgfkVDQmxvY2tzKCkgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2VjQmxvY2tzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgZGVsZXRlIChFQ0IqKW1fZWNCbG9ja3NbaV07DQogICAgIH0NCi0gICAgfkVDQmxvY2tzKCkNCi0gICAgew0KLSAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBtX2VjQmxvY2tzLkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgZGVsZXRlIChFQ0IqKW1fZWNCbG9ja3NbaV07DQotICAgICAgICB9DQotICAgICAgICBtX2VjQmxvY2tzLlJlbW92ZUFsbCgpOw0KLSAgICB9DQorICAgIG1fZWNCbG9ja3MuUmVtb3ZlQWxsKCk7DQorICB9DQogDQotICAgIGludDMyX3QgR2V0RUNDb2Rld29yZHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9lY0NvZGV3b3JkczsNCi0gICAgfQ0KKyAgaW50MzJfdCBHZXRFQ0NvZGV3b3JkcygpIHsgcmV0dXJuIG1fZWNDb2Rld29yZHM7IH0NCiANCi0gICAgY29uc3QgQ0ZYX1B0ckFycmF5ICZHZXRFQ0Jsb2NrcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2VjQmxvY2tzOw0KLSAgICB9DQotcHJpdmF0ZToNCi0gICAgaW50MzJfdCBtX2VjQ29kZXdvcmRzOw0KLSAgICBDRlhfUHRyQXJyYXkgbV9lY0Jsb2NrczsNCisgIGNvbnN0IENGWF9QdHJBcnJheSYgR2V0RUNCbG9ja3MoKSB7IHJldHVybiBtX2VjQmxvY2tzOyB9DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fZWNDb2Rld29yZHM7DQorICBDRlhfUHRyQXJyYXkgbV9lY0Jsb2NrczsNCiB9Ow0KLWNsYXNzIENCQ19EYXRhTWF0cml4VmVyc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19EYXRhTWF0cml4VmVyc2lvbihpbnQzMl90IHZlcnNpb25OdW1iZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN5bWJvbFNpemVSb3dzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzeW1ib2xTaXplQ29sdW1ucywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVJlZ2lvblNpemVSb3dzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhUmVnaW9uU2l6ZUNvbHVtbnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBFQ0Jsb2NrcyAqZWNCbG9ja3MpOw0KLSAgICB2aXJ0dWFsIH5DQkNfRGF0YU1hdHJpeFZlcnNpb24oKTsNCi0gICAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KLSAgICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KLSAgICBpbnQzMl90IEdldFZlcnNpb25OdW1iZXIoKTsNCi0gICAgaW50MzJfdCBHZXRTeW1ib2xTaXplUm93cygpOw0KLSAgICBpbnQzMl90IEdldFN5bWJvbFNpemVDb2x1bW5zKCk7DQotICAgIGludDMyX3QgR2V0RGF0YVJlZ2lvblNpemVSb3dzKCk7DQotICAgIGludDMyX3QgR2V0RGF0YVJlZ2lvblNpemVDb2x1bW5zKCk7DQotICAgIGludDMyX3QgR2V0VG90YWxDb2Rld29yZHMoKTsNCi0gICAgRUNCbG9ja3MgKkdldEVDQmxvY2tzKCk7DQotICAgIHN0YXRpYyBDQkNfRGF0YU1hdHJpeFZlcnNpb24gKkdldFZlcnNpb25Gb3JEaW1lbnNpb25zKGludDMyX3QgbnVtUm93cywgaW50MzJfdCBudW1Db2x1bW5zLCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgUmVsZWFzZUFsbCgpOw0KLXByaXZhdGU6DQotICAgIGludDMyX3QgbV92ZXJzaW9uTnVtYmVyOw0KLSAgICBpbnQzMl90IG1fc3ltYm9sU2l6ZVJvd3M7DQotICAgIGludDMyX3QgbV9zeW1ib2xTaXplQ29sdW1uczsNCi0gICAgaW50MzJfdCBtX2RhdGFSZWdpb25TaXplUm93czsNCi0gICAgaW50MzJfdCBtX2RhdGFSZWdpb25TaXplQ29sdW1uczsNCi0gICAgRUNCbG9ja3MgKm1fZWNCbG9ja3M7DQotICAgIGludDMyX3QgbV90b3RhbENvZGV3b3JkczsNCi0gICAgc3RhdGljIENGWF9QdHJBcnJheSogVkVSU0lPTlM7DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uIHsNCisgcHVibGljOg0KKyAgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKGludDMyX3QgdmVyc2lvbk51bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN5bWJvbFNpemVSb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3ltYm9sU2l6ZUNvbHVtbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhUmVnaW9uU2l6ZVJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhUmVnaW9uU2l6ZUNvbHVtbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgRUNCbG9ja3MqIGVjQmxvY2tzKTsNCisgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4VmVyc2lvbigpOw0KKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KKyAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisgIGludDMyX3QgR2V0VmVyc2lvbk51bWJlcigpOw0KKyAgaW50MzJfdCBHZXRTeW1ib2xTaXplUm93cygpOw0KKyAgaW50MzJfdCBHZXRTeW1ib2xTaXplQ29sdW1ucygpOw0KKyAgaW50MzJfdCBHZXREYXRhUmVnaW9uU2l6ZVJvd3MoKTsNCisgIGludDMyX3QgR2V0RGF0YVJlZ2lvblNpemVDb2x1bW5zKCk7DQorICBpbnQzMl90IEdldFRvdGFsQ29kZXdvcmRzKCk7DQorICBFQ0Jsb2NrcyogR2V0RUNCbG9ja3MoKTsNCisgIHN0YXRpYyBDQkNfRGF0YU1hdHJpeFZlcnNpb24qIEdldFZlcnNpb25Gb3JEaW1lbnNpb25zKGludDMyX3QgbnVtUm93cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtQ29sdW1ucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgUmVsZWFzZUFsbCgpOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBtX3ZlcnNpb25OdW1iZXI7DQorICBpbnQzMl90IG1fc3ltYm9sU2l6ZVJvd3M7DQorICBpbnQzMl90IG1fc3ltYm9sU2l6ZUNvbHVtbnM7DQorICBpbnQzMl90IG1fZGF0YVJlZ2lvblNpemVSb3dzOw0KKyAgaW50MzJfdCBtX2RhdGFSZWdpb25TaXplQ29sdW1uczsNCisgIEVDQmxvY2tzKiBtX2VjQmxvY2tzOw0KKyAgaW50MzJfdCBtX3RvdGFsQ29kZXdvcmRzOw0KKyAgc3RhdGljIENGWF9QdHJBcnJheSogVkVSU0lPTlM7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhXcml0ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmNwcAppbmRleCA3YjEzMzllLi41Mzk1NzJmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhXcml0ZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5jcHAKQEAgLTQzLDk2ICs0MywxMDkgQEAKICNpbmNsdWRlICJCQ19BU0NJSUVuY29kZXIuaCINCiAjaW5jbHVkZSAiQkNfSGlnaExldmVsRW5jb2Rlci5oIg0KICNpbmNsdWRlICJCQ19EYXRhTWF0cml4V3JpdGVyLmgiDQotQ0JDX0RhdGFNYXRyaXhXcml0ZXI6OkNCQ19EYXRhTWF0cml4V3JpdGVyKCkNCi17DQorQ0JDX0RhdGFNYXRyaXhXcml0ZXI6OkNCQ19EYXRhTWF0cml4V3JpdGVyKCkge30NCitDQkNfRGF0YU1hdHJpeFdyaXRlcjo6fkNCQ19EYXRhTWF0cml4V3JpdGVyKCkge30NCitGWF9CT09MIENCQ19EYXRhTWF0cml4V3JpdGVyOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSB7DQorICBtX2lDb3JyZWN0TGV2ZWwgPSBsZXZlbDsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1DQkNfRGF0YU1hdHJpeFdyaXRlcjo6fkNCQ19EYXRhTWF0cml4V3JpdGVyKCkNCi17DQordWludDhfdCogQ0JDX0RhdGFNYXRyaXhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChvdXRXaWR0aCA8IDAgfHwgb3V0SGVpZ2h0IDwgMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25IZWlnaHRBbmRXaWR0aE11c3RCZUF0TGVhc3QxOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICBDQkNfU3ltYm9sU2hhcGVIaW50OjpTeW1ib2xTaGFwZUhpbnQgc2hhcGUgPQ0KKyAgICAgIENCQ19TeW1ib2xTaGFwZUhpbnQ6OkZPUkNFX1NRVUFSRTsNCisgIENCQ19EaW1lbnNpb24qIG1pblNpemUgPSBOVUxMOw0KKyAgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSA9IE5VTEw7DQorICBDRlhfV2lkZVN0cmluZyBlY0xldmVsOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlZCA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVIaWdoTGV2ZWwoDQorICAgICAgY29udGVudHMsIGVjTGV2ZWwsIHNoYXBlLCBtaW5TaXplLCBtYXhTaXplLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19TeW1ib2xJbmZvKiBzeW1ib2xJbmZvID0gQ0JDX1N5bWJvbEluZm86Omxvb2t1cCgNCisgICAgICBlbmNvZGVkLkdldExlbmd0aCgpLCBzaGFwZSwgbWluU2l6ZSwgbWF4U2l6ZSwgVFJVRSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMgPQ0KKyAgICAgIENCQ19FcnJvckNvcnJlY3Rpb246OmVuY29kZUVDQzIwMChlbmNvZGVkLCBzeW1ib2xJbmZvLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19EZWZhdWx0UGxhY2VtZW50KiBwbGFjZW1lbnQgPQ0KKyAgICAgIEZYX05FVyBDQkNfRGVmYXVsdFBsYWNlbWVudChjb2Rld29yZHMsIHN5bWJvbEluZm8tPmdldFN5bWJvbERhdGFXaWR0aChlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sSW5mby0+Z2V0U3ltYm9sRGF0YUhlaWdodChlKSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBwbGFjZW1lbnQtPnBsYWNlKCk7DQorICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogYnl0ZW1hdHJpeCA9IGVuY29kZUxvd0xldmVsKHBsYWNlbWVudCwgc3ltYm9sSW5mbywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBvdXRXaWR0aCA9IGJ5dGVtYXRyaXgtPkdldFdpZHRoKCk7DQorICBvdXRIZWlnaHQgPSBieXRlbWF0cml4LT5HZXRIZWlnaHQoKTsNCisgIHVpbnQ4X3QqIHJlc3VsdCA9IEZYX0FsbG9jKHVpbnQ4X3QsIG91dFdpZHRoICogb3V0SGVpZ2h0KTsNCisgIEZYU1lTX21lbWNweShyZXN1bHQsIGJ5dGVtYXRyaXgtPkdldEFycmF5KCksIG91dFdpZHRoICogb3V0SGVpZ2h0KTsNCisgIGRlbGV0ZSBieXRlbWF0cml4Ow0KKyAgZGVsZXRlIHBsYWNlbWVudDsNCisgIHJldHVybiByZXN1bHQ7DQogfQ0KLUZYX0JPT0wgQ0JDX0RhdGFNYXRyaXhXcml0ZXI6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsIChpbnQzMl90IGxldmVsKQ0KLXsNCi0gICAgbV9pQ29ycmVjdExldmVsID0gbGV2ZWw7DQotICAgIHJldHVybiBUUlVFOw0KK3VpbnQ4X3QqIENCQ19EYXRhTWF0cml4V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICByZXR1cm4gTlVMTDsNCiB9DQotdWludDhfdCogQ0JDX0RhdGFNYXRyaXhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyAmY29udGVudHMsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAob3V0V2lkdGggPCAwIHx8IG91dEhlaWdodCA8IDApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkhlaWdodEFuZFdpZHRoTXVzdEJlQXRMZWFzdDE7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQordWludDhfdCogQ0JDX0RhdGFNYXRyaXhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIENCQ19EYXRhTWF0cml4V3JpdGVyOjplbmNvZGVMb3dMZXZlbCgNCisgICAgQ0JDX0RlZmF1bHRQbGFjZW1lbnQqIHBsYWNlbWVudCwNCisgICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sDQorICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgc3ltYm9sV2lkdGggPSBzeW1ib2xJbmZvLT5nZXRTeW1ib2xEYXRhV2lkdGgoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBpbnQzMl90IHN5bWJvbEhlaWdodCA9IHN5bWJvbEluZm8tPmdldFN5bWJvbERhdGFIZWlnaHQoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4ID0gRlhfTkVXIENCQ19Db21tb25CeXRlTWF0cml4KA0KKyAgICAgIHN5bWJvbEluZm8tPmdldFN5bWJvbFdpZHRoKGUpLCBzeW1ib2xJbmZvLT5nZXRTeW1ib2xIZWlnaHQoZSkpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgbWF0cml4LT5Jbml0KCk7DQorICBpbnQzMl90IG1hdHJpeFkgPSAwOw0KKyAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgc3ltYm9sSGVpZ2h0OyB5KyspIHsNCisgICAgaW50MzJfdCBtYXRyaXhYOw0KKyAgICBpZiAoKHkgJSBzeW1ib2xJbmZvLT5tX21hdHJpeEhlaWdodCkgPT0gMCkgew0KKyAgICAgIG1hdHJpeFggPSAwOw0KKyAgICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHN5bWJvbEluZm8tPmdldFN5bWJvbFdpZHRoKGUpOyB4KyspIHsNCisgICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksICh4ICUgMikgPT0gMCk7DQorICAgICAgICBtYXRyaXhYKys7DQorICAgICAgfQ0KKyAgICAgIG1hdHJpeFkrKzsNCiAgICAgfQ0KLSAgICBDQkNfU3ltYm9sU2hhcGVIaW50OjpTeW1ib2xTaGFwZUhpbnQgc2hhcGUgPSBDQkNfU3ltYm9sU2hhcGVIaW50OjpGT1JDRV9TUVVBUkU7DQotICAgIENCQ19EaW1lbnNpb24qIG1pblNpemUgPSBOVUxMOw0KLSAgICBDQkNfRGltZW5zaW9uKiBtYXhTaXplID0gTlVMTDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlZCA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVIaWdoTGV2ZWwoY29udGVudHMsIGVjTGV2ZWwsIHNoYXBlLCBtaW5TaXplLCBtYXhTaXplLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICBOVUxMKTsNCi0gICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8gPSBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGVuY29kZWQuR2V0TGVuZ3RoKCksIHNoYXBlLCBtaW5TaXplLCBtYXhTaXplLCBUUlVFLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICBOVUxMKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzID0gQ0JDX0Vycm9yQ29ycmVjdGlvbjo6ZW5jb2RlRUNDMjAwKGVuY29kZWQsIHN5bWJvbEluZm8sIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIE5VTEwpOw0KLSAgICBDQkNfRGVmYXVsdFBsYWNlbWVudCogcGxhY2VtZW50ID0gRlhfTkVXIENCQ19EZWZhdWx0UGxhY2VtZW50KGNvZGV3b3Jkcywgc3ltYm9sSW5mby0+Z2V0U3ltYm9sRGF0YVdpZHRoKGUpLCBzeW1ib2xJbmZvLT5nZXRTeW1ib2xEYXRhSGVpZ2h0KGUpKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICBOVUxMKTsNCi0gICAgcGxhY2VtZW50LT5wbGFjZSgpOw0KLSAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogYnl0ZW1hdHJpeCA9IGVuY29kZUxvd0xldmVsKHBsYWNlbWVudCwgc3ltYm9sSW5mbywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAgTlVMTCk7DQotICAgIG91dFdpZHRoID0gYnl0ZW1hdHJpeC0+R2V0V2lkdGgoKTsNCi0gICAgb3V0SGVpZ2h0ID0gYnl0ZW1hdHJpeC0+R2V0SGVpZ2h0KCk7DQotICAgIHVpbnQ4X3QqIHJlc3VsdCA9IEZYX0FsbG9jKHVpbnQ4X3QsIG91dFdpZHRoICogb3V0SGVpZ2h0KTsNCi0gICAgRlhTWVNfbWVtY3B5KHJlc3VsdCwgYnl0ZW1hdHJpeC0+R2V0QXJyYXkoKSwgb3V0V2lkdGggKiBvdXRIZWlnaHQpOw0KLSAgICBkZWxldGUgYnl0ZW1hdHJpeDsNCi0gICAgZGVsZXRlIHBsYWNlbWVudDsNCi0gICAgcmV0dXJuIHJlc3VsdDsNCi19DQotdWludDhfdCAqQ0JDX0RhdGFNYXRyaXhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCAmZSkNCi17DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi11aW50OF90ICpDQkNfRGF0YU1hdHJpeFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUNCQ19Db21tb25CeXRlTWF0cml4KiBDQkNfRGF0YU1hdHJpeFdyaXRlcjo6ZW5jb2RlTG93TGV2ZWwoQ0JDX0RlZmF1bHRQbGFjZW1lbnQqIHBsYWNlbWVudCwgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sIGludDMyX3QgJmUpDQotew0KLSAgICBpbnQzMl90IHN5bWJvbFdpZHRoID0gc3ltYm9sSW5mby0+Z2V0U3ltYm9sRGF0YVdpZHRoKGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIE5VTEwpOw0KLSAgICBpbnQzMl90IHN5bWJvbEhlaWdodCA9IHN5bWJvbEluZm8tPmdldFN5bWJvbERhdGFIZWlnaHQoZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAgTlVMTCk7DQotICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXggPSBGWF9ORVcgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgoc3ltYm9sSW5mby0+Z2V0U3ltYm9sV2lkdGgoZSksIHN5bWJvbEluZm8tPmdldFN5bWJvbEhlaWdodChlKSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAgTlVMTCk7DQotICAgIG1hdHJpeC0+SW5pdCgpOw0KLSAgICBpbnQzMl90IG1hdHJpeFkgPSAwOw0KLSAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBzeW1ib2xIZWlnaHQ7IHkrKykgew0KLSAgICAgICAgaW50MzJfdCBtYXRyaXhYOw0KLSAgICAgICAgaWYgKCh5ICUgc3ltYm9sSW5mby0+bV9tYXRyaXhIZWlnaHQpID09IDApIHsNCi0gICAgICAgICAgICBtYXRyaXhYID0gMDsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBzeW1ib2xJbmZvLT5nZXRTeW1ib2xXaWR0aChlKTsgeCsrKSB7DQotICAgICAgICAgICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksICh4ICUgMikgPT0gMCk7DQotICAgICAgICAgICAgICAgIG1hdHJpeFgrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbWF0cml4WSsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbWF0cml4WCA9IDA7DQotICAgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBzeW1ib2xXaWR0aDsgeCsrKSB7DQotICAgICAgICAgICAgaWYgKCh4ICUgc3ltYm9sSW5mby0+bV9tYXRyaXhXaWR0aCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICBtYXRyaXgtPlNldChtYXRyaXhYLCBtYXRyaXhZLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgbWF0cml4WCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtYXRyaXgtPlNldChtYXRyaXhYLCBtYXRyaXhZLCBwbGFjZW1lbnQtPmdldEJpdCh4LCB5KSk7DQotICAgICAgICAgICAgbWF0cml4WCsrOw0KLSAgICAgICAgICAgIGlmICgoeCAlIHN5bWJvbEluZm8tPm1fbWF0cml4V2lkdGgpID09IHN5bWJvbEluZm8tPm1fbWF0cml4V2lkdGggLSAxKSB7DQotICAgICAgICAgICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksICh5ICUgMikgPT0gMCk7DQotICAgICAgICAgICAgICAgIG1hdHJpeFgrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBtYXRyaXhZKys7DQotICAgICAgICBpZiAoKHkgJSBzeW1ib2xJbmZvLT5tX21hdHJpeEhlaWdodCkgPT0gc3ltYm9sSW5mby0+bV9tYXRyaXhIZWlnaHQgLSAxKSB7DQotICAgICAgICAgICAgbWF0cml4WCA9IDA7DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgc3ltYm9sSW5mby0+Z2V0U3ltYm9sV2lkdGgoZSk7IHgrKykgew0KLSAgICAgICAgICAgICAgICBtYXRyaXgtPlNldChtYXRyaXhYLCBtYXRyaXhZLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgbWF0cml4WCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtYXRyaXhZKys7DQotICAgICAgICB9DQorICAgIG1hdHJpeFggPSAwOw0KKyAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBzeW1ib2xXaWR0aDsgeCsrKSB7DQorICAgICAgaWYgKCh4ICUgc3ltYm9sSW5mby0+bV9tYXRyaXhXaWR0aCkgPT0gMCkgew0KKyAgICAgICAgbWF0cml4LT5TZXQobWF0cml4WCwgbWF0cml4WSwgVFJVRSk7DQorICAgICAgICBtYXRyaXhYKys7DQorICAgICAgfQ0KKyAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksIHBsYWNlbWVudC0+Z2V0Qml0KHgsIHkpKTsNCisgICAgICBtYXRyaXhYKys7DQorICAgICAgaWYgKCh4ICUgc3ltYm9sSW5mby0+bV9tYXRyaXhXaWR0aCkgPT0gc3ltYm9sSW5mby0+bV9tYXRyaXhXaWR0aCAtIDEpIHsNCisgICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksICh5ICUgMikgPT0gMCk7DQorICAgICAgICBtYXRyaXhYKys7DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiBtYXRyaXg7DQorICAgIG1hdHJpeFkrKzsNCisgICAgaWYgKCh5ICUgc3ltYm9sSW5mby0+bV9tYXRyaXhIZWlnaHQpID09IHN5bWJvbEluZm8tPm1fbWF0cml4SGVpZ2h0IC0gMSkgew0KKyAgICAgIG1hdHJpeFggPSAwOw0KKyAgICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHN5bWJvbEluZm8tPmdldFN5bWJvbFdpZHRoKGUpOyB4KyspIHsNCisgICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksIFRSVUUpOw0KKyAgICAgICAgbWF0cml4WCsrOw0KKyAgICAgIH0NCisgICAgICBtYXRyaXhZKys7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBtYXRyaXg7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmgKaW5kZXggMjQxMjI5Yi4uNWVmMTI0ZiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmgKQEAgLTEzLDE4ICsxMywzMSBAQAogY2xhc3MgQ0JDX1N5bWJvbEluZm87DQogY2xhc3MgQ0JDX1R3b0RpbVdyaXRlcjsNCiBjbGFzcyBDQkNfRGF0YU1hdHJpeFdyaXRlcjsNCi1jbGFzcyBDQkNfRGF0YU1hdHJpeFdyaXRlciA6IHB1YmxpYyBDQkNfVHdvRGltV3JpdGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0RhdGFNYXRyaXhXcml0ZXIoKTsNCi0gICAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhXcml0ZXIoKTsNCi0gICAgdWludDhfdCoJRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZjb250ZW50cywgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCAmZSk7DQotICAgIHVpbnQ4X3QgKglFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgJmUpOw0KLSAgICB1aW50OF90ICoJRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKTsNCi0gICAgRlhfQk9PTAkJU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwgKGludDMyX3QgbGV2ZWwpOw0KK2NsYXNzIENCQ19EYXRhTWF0cml4V3JpdGVyIDogcHVibGljIENCQ19Ud29EaW1Xcml0ZXIgew0KKyBwdWJsaWM6DQorICBDQkNfRGF0YU1hdHJpeFdyaXRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhXcml0ZXIoKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpOw0KIA0KLXByaXZhdGU6DQotICAgIHN0YXRpYyBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogZW5jb2RlTG93TGV2ZWwoQ0JDX0RlZmF1bHRQbGFjZW1lbnQqIHBsYWNlbWVudCwgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sIGludDMyX3QgJmUpOw0KLSAgICBpbnQzMl90CW1faUNvcnJlY3RMZXZlbDsNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogZW5jb2RlTG93TGV2ZWwoQ0JDX0RlZmF1bHRQbGFjZW1lbnQqIHBsYWNlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBtX2lDb3JyZWN0TGV2ZWw7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EZWZhdWx0UGxhY2VtZW50LmNwcAppbmRleCA1N2M2Y2M5Li44NmMyYTgwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5jcHAKQEAgLTIzLDE1MiArMjMsMTQyIEBACiAjaW5jbHVkZSAiLi4vYmFyY29kZS5oIg0KICNpbmNsdWRlICJCQ19FbmNvZGVyLmgiDQogI2luY2x1ZGUgIkJDX0RlZmF1bHRQbGFjZW1lbnQuaCINCi1DQkNfRGVmYXVsdFBsYWNlbWVudDo6Q0JDX0RlZmF1bHRQbGFjZW1lbnQoQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLCBpbnQzMl90IG51bWNvbHMsIGludDMyX3QgbnVtcm93cykNCi17DQotICAgIG1fY29kZXdvcmRzID0gY29kZXdvcmRzOw0KLSAgICBtX251bWNvbHMgPSBudW1jb2xzOw0KLSAgICBtX251bXJvd3MgPSBudW1yb3dzOw0KLSAgICBtX2JpdHMuU2V0U2l6ZShudW1jb2xzICogbnVtcm93cyk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bWNvbHMgKiBudW1yb3dzOyBpKyspIHsNCi0gICAgICAgIG1fYml0c1tpXSA9ICh1aW50OF90KSAyOw0KK0NCQ19EZWZhdWx0UGxhY2VtZW50OjpDQkNfRGVmYXVsdFBsYWNlbWVudChDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtY29scywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1yb3dzKSB7DQorICBtX2NvZGV3b3JkcyA9IGNvZGV3b3JkczsNCisgIG1fbnVtY29scyA9IG51bWNvbHM7DQorICBtX251bXJvd3MgPSBudW1yb3dzOw0KKyAgbV9iaXRzLlNldFNpemUobnVtY29scyAqIG51bXJvd3MpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtY29scyAqIG51bXJvd3M7IGkrKykgew0KKyAgICBtX2JpdHNbaV0gPSAodWludDhfdCkyOw0KKyAgfQ0KK30NCitDQkNfRGVmYXVsdFBsYWNlbWVudDo6fkNCQ19EZWZhdWx0UGxhY2VtZW50KCkgew0KKyAgbV9iaXRzLlJlbW92ZUFsbCgpOw0KK30NCitpbnQzMl90IENCQ19EZWZhdWx0UGxhY2VtZW50OjpnZXROdW1yb3dzKCkgew0KKyAgcmV0dXJuIG1fbnVtcm93czsNCit9DQoraW50MzJfdCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Z2V0TnVtY29scygpIHsNCisgIHJldHVybiBtX251bWNvbHM7DQorfQ0KK0NGWF9CeXRlQXJyYXkmIENCQ19EZWZhdWx0UGxhY2VtZW50OjpnZXRCaXRzKCkgew0KKyAgcmV0dXJuIG1fYml0czsNCit9DQorRlhfQk9PTCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Z2V0Qml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdykgew0KKyAgcmV0dXJuIG1fYml0c1tyb3cgKiBtX251bWNvbHMgKyBjb2xdID09IDE7DQorfQ0KK3ZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OnNldEJpdChpbnQzMl90IGNvbCwgaW50MzJfdCByb3csIEZYX0JPT0wgYml0KSB7DQorICBtX2JpdHNbcm93ICogbV9udW1jb2xzICsgY29sXSA9IGJpdCA/ICh1aW50OF90KTEgOiAodWludDhfdCkwOw0KK30NCitGWF9CT09MIENCQ19EZWZhdWx0UGxhY2VtZW50OjpoYXNCaXQoaW50MzJfdCBjb2wsIGludDMyX3Qgcm93KSB7DQorICByZXR1cm4gbV9iaXRzW3JvdyAqIG1fbnVtY29scyArIGNvbF0gIT0gMjsNCit9DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6cGxhY2UoKSB7DQorICBpbnQzMl90IHBvcyA9IDA7DQorICBpbnQzMl90IHJvdyA9IDQ7DQorICBpbnQzMl90IGNvbCA9IDA7DQorICBkbyB7DQorICAgIGlmICgocm93ID09IG1fbnVtcm93cykgJiYgKGNvbCA9PSAwKSkgew0KKyAgICAgIGNvcm5lcjEocG9zKyspOw0KICAgICB9DQotfQ0KLUNCQ19EZWZhdWx0UGxhY2VtZW50Ojp+Q0JDX0RlZmF1bHRQbGFjZW1lbnQoKQ0KLXsNCi0gICAgbV9iaXRzLlJlbW92ZUFsbCgpOw0KLX0NCi1pbnQzMl90IENCQ19EZWZhdWx0UGxhY2VtZW50OjpnZXROdW1yb3dzKCkNCi17DQotICAgIHJldHVybiBtX251bXJvd3M7DQotfQ0KLWludDMyX3QgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmdldE51bWNvbHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbnVtY29sczsNCi19DQotQ0ZYX0J5dGVBcnJheSYgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmdldEJpdHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYml0czsNCi19DQotRlhfQk9PTCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Z2V0Qml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdykNCi17DQotICAgIHJldHVybiBtX2JpdHNbcm93ICogbV9udW1jb2xzICsgY29sXSA9PSAxOw0KLX0NCi12b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50OjpzZXRCaXQoaW50MzJfdCBjb2wsIGludDMyX3Qgcm93LCBGWF9CT09MIGJpdCkNCi17DQotICAgIG1fYml0c1tyb3cgKiBtX251bWNvbHMgKyBjb2xdID0gYml0ID8gKHVpbnQ4X3QpIDEgOiAodWludDhfdCkgMDsNCi19DQotRlhfQk9PTCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6aGFzQml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdykNCi17DQotICAgIHJldHVybiBtX2JpdHNbcm93ICogbV9udW1jb2xzICsgY29sXSAhPSAyOw0KLX0NCi12b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50OjpwbGFjZSgpDQotew0KLSAgICBpbnQzMl90IHBvcyA9IDA7DQotICAgIGludDMyX3Qgcm93ID0gNDsNCi0gICAgaW50MzJfdCBjb2wgPSAwOw0KKyAgICBpZiAoKHJvdyA9PSBtX251bXJvd3MgLSAyKSAmJiAoY29sID09IDApICYmICgobV9udW1jb2xzICUgNCkgIT0gMCkpIHsNCisgICAgICBjb3JuZXIyKHBvcysrKTsNCisgICAgfQ0KKyAgICBpZiAoKHJvdyA9PSBtX251bXJvd3MgLSAyKSAmJiAoY29sID09IDApICYmIChtX251bWNvbHMgJSA4ID09IDQpKSB7DQorICAgICAgY29ybmVyMyhwb3MrKyk7DQorICAgIH0NCisgICAgaWYgKChyb3cgPT0gbV9udW1yb3dzICsgNCkgJiYgKGNvbCA9PSAyKSAmJiAoKG1fbnVtY29scyAlIDgpID09IDApKSB7DQorICAgICAgY29ybmVyNChwb3MrKyk7DQorICAgIH0NCiAgICAgZG8gew0KLSAgICAgICAgaWYgKChyb3cgPT0gbV9udW1yb3dzKSAmJiAoY29sID09IDApKSB7DQotICAgICAgICAgICAgY29ybmVyMShwb3MrKyk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoKHJvdyA9PSBtX251bXJvd3MgLSAyKSAmJiAoY29sID09IDApICYmICgobV9udW1jb2xzICUgNCkgIT0gMCkpIHsNCi0gICAgICAgICAgICBjb3JuZXIyKHBvcysrKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICgocm93ID09IG1fbnVtcm93cyAtIDIpICYmIChjb2wgPT0gMCkgJiYgKG1fbnVtY29scyAlIDggPT0gNCkpIHsNCi0gICAgICAgICAgICBjb3JuZXIzKHBvcysrKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICgocm93ID09IG1fbnVtcm93cyArIDQpICYmIChjb2wgPT0gMikgJiYgKChtX251bWNvbHMgJSA4KSA9PSAwKSkgew0KLSAgICAgICAgICAgIGNvcm5lcjQocG9zKyspOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG8gew0KLSAgICAgICAgICAgIGlmICgocm93IDwgbV9udW1yb3dzKSAmJiAoY29sID49IDApICYmICFoYXNCaXQoY29sLCByb3cpKSB7DQotICAgICAgICAgICAgICAgIHV0YWgocm93LCBjb2wsIHBvcysrKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcm93IC09IDI7DQotICAgICAgICAgICAgY29sICs9IDI7DQotICAgICAgICB9IHdoaWxlIChyb3cgPj0gMCAmJiAoY29sIDwgbV9udW1jb2xzKSk7DQotICAgICAgICByb3crKzsNCi0gICAgICAgIGNvbCArPSAzOw0KLSAgICAgICAgZG8gew0KLSAgICAgICAgICAgIGlmICgocm93ID49IDApICYmIChjb2wgPCBtX251bWNvbHMpICYmICFoYXNCaXQoY29sLCByb3cpKSB7DQotICAgICAgICAgICAgICAgIHV0YWgocm93LCBjb2wsIHBvcysrKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcm93ICs9IDI7DQotICAgICAgICAgICAgY29sIC09IDI7DQotICAgICAgICB9IHdoaWxlICgocm93IDwgbV9udW1yb3dzKSAmJiAoY29sID49IDApKTsNCi0gICAgICAgIHJvdyArPSAzOw0KLSAgICAgICAgY29sKys7DQotICAgIH0gd2hpbGUgKChyb3cgPCBtX251bXJvd3MpIHx8IChjb2wgPCBtX251bWNvbHMpKTsNCi0gICAgaWYgKCFoYXNCaXQobV9udW1jb2xzIC0gMSwgbV9udW1yb3dzIC0gMSkpIHsNCi0gICAgICAgIHNldEJpdChtX251bWNvbHMgLSAxLCBtX251bXJvd3MgLSAxLCBUUlVFKTsNCi0gICAgICAgIHNldEJpdChtX251bWNvbHMgLSAyLCBtX251bXJvd3MgLSAyLCBUUlVFKTsNCi0gICAgfQ0KKyAgICAgIGlmICgocm93IDwgbV9udW1yb3dzKSAmJiAoY29sID49IDApICYmICFoYXNCaXQoY29sLCByb3cpKSB7DQorICAgICAgICB1dGFoKHJvdywgY29sLCBwb3MrKyk7DQorICAgICAgfQ0KKyAgICAgIHJvdyAtPSAyOw0KKyAgICAgIGNvbCArPSAyOw0KKyAgICB9IHdoaWxlIChyb3cgPj0gMCAmJiAoY29sIDwgbV9udW1jb2xzKSk7DQorICAgIHJvdysrOw0KKyAgICBjb2wgKz0gMzsNCisgICAgZG8gew0KKyAgICAgIGlmICgocm93ID49IDApICYmIChjb2wgPCBtX251bWNvbHMpICYmICFoYXNCaXQoY29sLCByb3cpKSB7DQorICAgICAgICB1dGFoKHJvdywgY29sLCBwb3MrKyk7DQorICAgICAgfQ0KKyAgICAgIHJvdyArPSAyOw0KKyAgICAgIGNvbCAtPSAyOw0KKyAgICB9IHdoaWxlICgocm93IDwgbV9udW1yb3dzKSAmJiAoY29sID49IDApKTsNCisgICAgcm93ICs9IDM7DQorICAgIGNvbCsrOw0KKyAgfSB3aGlsZSAoKHJvdyA8IG1fbnVtcm93cykgfHwgKGNvbCA8IG1fbnVtY29scykpOw0KKyAgaWYgKCFoYXNCaXQobV9udW1jb2xzIC0gMSwgbV9udW1yb3dzIC0gMSkpIHsNCisgICAgc2V0Qml0KG1fbnVtY29scyAtIDEsIG1fbnVtcm93cyAtIDEsIFRSVUUpOw0KKyAgICBzZXRCaXQobV9udW1jb2xzIC0gMiwgbV9udW1yb3dzIC0gMiwgVFJVRSk7DQorICB9DQogfQ0KLXZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6Om1vZHVsZShpbnQzMl90IHJvdywgaW50MzJfdCBjb2wsIGludDMyX3QgcG9zLCBpbnQzMl90IGJpdCkNCi17DQotICAgIGlmIChyb3cgPCAwKSB7DQotICAgICAgICByb3cgKz0gbV9udW1yb3dzOw0KLSAgICAgICAgY29sICs9IDQgLSAoKG1fbnVtcm93cyArIDQpICUgOCk7DQotICAgIH0NCi0gICAgaWYgKGNvbCA8IDApIHsNCi0gICAgICAgIGNvbCArPSBtX251bWNvbHM7DQotICAgICAgICByb3cgKz0gNCAtICgobV9udW1jb2xzICsgNCkgJSA4KTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHYgPSBtX2NvZGV3b3Jkcy5HZXRBdChwb3MpOw0KLSAgICB2ICY9IDEgPDwgKDggLSBiaXQpOw0KLSAgICBzZXRCaXQoY29sLCByb3csIHYgIT0gMCk7DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6bW9kdWxlKGludDMyX3Qgcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYml0KSB7DQorICBpZiAocm93IDwgMCkgew0KKyAgICByb3cgKz0gbV9udW1yb3dzOw0KKyAgICBjb2wgKz0gNCAtICgobV9udW1yb3dzICsgNCkgJSA4KTsNCisgIH0NCisgIGlmIChjb2wgPCAwKSB7DQorICAgIGNvbCArPSBtX251bWNvbHM7DQorICAgIHJvdyArPSA0IC0gKChtX251bWNvbHMgKyA0KSAlIDgpOw0KKyAgfQ0KKyAgaW50MzJfdCB2ID0gbV9jb2Rld29yZHMuR2V0QXQocG9zKTsNCisgIHYgJj0gMSA8PCAoOCAtIGJpdCk7DQorICBzZXRCaXQoY29sLCByb3csIHYgIT0gMCk7DQogfQ0KLXZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OnV0YWgoaW50MzJfdCByb3csIGludDMyX3QgY29sLCBpbnQzMl90IHBvcykNCi17DQotICAgIG1vZHVsZShyb3cgLSAyLCBjb2wgLSAyLCBwb3MsIDEpOw0KLSAgICBtb2R1bGUocm93IC0gMiwgY29sIC0gMSwgcG9zLCAyKTsNCi0gICAgbW9kdWxlKHJvdyAtIDEsIGNvbCAtIDIsIHBvcywgMyk7DQotICAgIG1vZHVsZShyb3cgLSAxLCBjb2wgLSAxLCBwb3MsIDQpOw0KLSAgICBtb2R1bGUocm93IC0gMSwgY29sLCBwb3MsIDUpOw0KLSAgICBtb2R1bGUocm93LCBjb2wgLSAyLCBwb3MsIDYpOw0KLSAgICBtb2R1bGUocm93LCBjb2wgLSAxLCBwb3MsIDcpOw0KLSAgICBtb2R1bGUocm93LCBjb2wsIHBvcywgOCk7DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6dXRhaChpbnQzMl90IHJvdywgaW50MzJfdCBjb2wsIGludDMyX3QgcG9zKSB7DQorICBtb2R1bGUocm93IC0gMiwgY29sIC0gMiwgcG9zLCAxKTsNCisgIG1vZHVsZShyb3cgLSAyLCBjb2wgLSAxLCBwb3MsIDIpOw0KKyAgbW9kdWxlKHJvdyAtIDEsIGNvbCAtIDIsIHBvcywgMyk7DQorICBtb2R1bGUocm93IC0gMSwgY29sIC0gMSwgcG9zLCA0KTsNCisgIG1vZHVsZShyb3cgLSAxLCBjb2wsIHBvcywgNSk7DQorICBtb2R1bGUocm93LCBjb2wgLSAyLCBwb3MsIDYpOw0KKyAgbW9kdWxlKHJvdywgY29sIC0gMSwgcG9zLCA3KTsNCisgIG1vZHVsZShyb3csIGNvbCwgcG9zLCA4KTsNCiB9DQotdm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyMShpbnQzMl90IHBvcykNCi17DQotICAgIG1vZHVsZShtX251bXJvd3MgLSAxLCAwLCBwb3MsIDEpOw0KLSAgICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMSwgcG9zLCAyKTsNCi0gICAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIDIsIHBvcywgMyk7DQotICAgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAyLCBwb3MsIDQpOw0KLSAgICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMSwgcG9zLCA1KTsNCi0gICAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDEsIHBvcywgNik7DQotICAgIG1vZHVsZSgyLCBtX251bWNvbHMgLSAxLCBwb3MsIDcpOw0KLSAgICBtb2R1bGUoMywgbV9udW1jb2xzIC0gMSwgcG9zLCA4KTsNCit2b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50Ojpjb3JuZXIxKGludDMyX3QgcG9zKSB7DQorICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMCwgcG9zLCAxKTsNCisgIG1vZHVsZShtX251bXJvd3MgLSAxLCAxLCBwb3MsIDIpOw0KKyAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIDIsIHBvcywgMyk7DQorICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMiwgcG9zLCA0KTsNCisgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAxLCBwb3MsIDUpOw0KKyAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDEsIHBvcywgNik7DQorICBtb2R1bGUoMiwgbV9udW1jb2xzIC0gMSwgcG9zLCA3KTsNCisgIG1vZHVsZSgzLCBtX251bWNvbHMgLSAxLCBwb3MsIDgpOw0KIH0NCi12b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50Ojpjb3JuZXIyKGludDMyX3QgcG9zKQ0KLXsNCi0gICAgbW9kdWxlKG1fbnVtcm93cyAtIDMsIDAsIHBvcywgMSk7DQotICAgIG1vZHVsZShtX251bXJvd3MgLSAyLCAwLCBwb3MsIDIpOw0KLSAgICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMCwgcG9zLCAzKTsNCi0gICAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDQsIHBvcywgNCk7DQotICAgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAzLCBwb3MsIDUpOw0KLSAgICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMiwgcG9zLCA2KTsNCi0gICAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDEsIHBvcywgNyk7DQotICAgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAxLCBwb3MsIDgpOw0KK3ZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmNvcm5lcjIoaW50MzJfdCBwb3MpIHsNCisgIG1vZHVsZShtX251bXJvd3MgLSAzLCAwLCBwb3MsIDEpOw0KKyAgbW9kdWxlKG1fbnVtcm93cyAtIDIsIDAsIHBvcywgMik7DQorICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMCwgcG9zLCAzKTsNCisgIG1vZHVsZSgwLCBtX251bWNvbHMgLSA0LCBwb3MsIDQpOw0KKyAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDMsIHBvcywgNSk7DQorICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMiwgcG9zLCA2KTsNCisgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAxLCBwb3MsIDcpOw0KKyAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDEsIHBvcywgOCk7DQogfQ0KLXZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmNvcm5lcjMoaW50MzJfdCBwb3MpDQotew0KLSAgICBtb2R1bGUobV9udW1yb3dzIC0gMywgMCwgcG9zLCAxKTsNCi0gICAgbW9kdWxlKG1fbnVtcm93cyAtIDIsIDAsIHBvcywgMik7DQotICAgIG1vZHVsZShtX251bXJvd3MgLSAxLCAwLCBwb3MsIDMpOw0KLSAgICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMiwgcG9zLCA0KTsNCi0gICAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDEsIHBvcywgNSk7DQotICAgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAxLCBwb3MsIDYpOw0KLSAgICBtb2R1bGUoMiwgbV9udW1jb2xzIC0gMSwgcG9zLCA3KTsNCi0gICAgbW9kdWxlKDMsIG1fbnVtY29scyAtIDEsIHBvcywgOCk7DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyMyhpbnQzMl90IHBvcykgew0KKyAgbW9kdWxlKG1fbnVtcm93cyAtIDMsIDAsIHBvcywgMSk7DQorICBtb2R1bGUobV9udW1yb3dzIC0gMiwgMCwgcG9zLCAyKTsNCisgIG1vZHVsZShtX251bXJvd3MgLSAxLCAwLCBwb3MsIDMpOw0KKyAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDIsIHBvcywgNCk7DQorICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMSwgcG9zLCA1KTsNCisgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAxLCBwb3MsIDYpOw0KKyAgbW9kdWxlKDIsIG1fbnVtY29scyAtIDEsIHBvcywgNyk7DQorICBtb2R1bGUoMywgbV9udW1jb2xzIC0gMSwgcG9zLCA4KTsNCiB9DQotdm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyNChpbnQzMl90IHBvcykNCi17DQotICAgIG1vZHVsZShtX251bXJvd3MgLSAxLCAwLCBwb3MsIDEpOw0KLSAgICBtb2R1bGUobV9udW1yb3dzIC0gMSwgbV9udW1jb2xzIC0gMSwgcG9zLCAyKTsNCi0gICAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDMsIHBvcywgMyk7DQotICAgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAyLCBwb3MsIDQpOw0KLSAgICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMSwgcG9zLCA1KTsNCi0gICAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDMsIHBvcywgNik7DQotICAgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAyLCBwb3MsIDcpOw0KLSAgICBtb2R1bGUoMSwgbV9udW1jb2xzIC0gMSwgcG9zLCA4KTsNCit2b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50Ojpjb3JuZXI0KGludDMyX3QgcG9zKSB7DQorICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMCwgcG9zLCAxKTsNCisgIG1vZHVsZShtX251bXJvd3MgLSAxLCBtX251bWNvbHMgLSAxLCBwb3MsIDIpOw0KKyAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDMsIHBvcywgMyk7DQorICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMiwgcG9zLCA0KTsNCisgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAxLCBwb3MsIDUpOw0KKyAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDMsIHBvcywgNik7DQorICBtb2R1bGUoMSwgbV9udW1jb2xzIC0gMiwgcG9zLCA3KTsNCisgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAxLCBwb3MsIDgpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5oCmluZGV4IGRlYzI2YTYuLjY3YmY3ZDkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5oCkBAIC02LDI5ICs2LDMxIEBACiANCiAjaWZuZGVmIF9CQ19ERUZBVUxUUExBQ0VNRU5UX0hfDQogI2RlZmluZSBfQkNfREVGQVVMVFBMQUNFTUVOVF9IXw0KLWNsYXNzIENCQ19EZWZhdWx0UGxhY2VtZW50DQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0RlZmF1bHRQbGFjZW1lbnQoQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLCBpbnQzMl90IG51bWNvbHMsIGludDMyX3QgbnVtcm93cyk7DQotICAgIHZpcnR1YWwgfkNCQ19EZWZhdWx0UGxhY2VtZW50KCk7DQorY2xhc3MgQ0JDX0RlZmF1bHRQbGFjZW1lbnQgew0KKyBwdWJsaWM6DQorICBDQkNfRGVmYXVsdFBsYWNlbWVudChDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bWNvbHMsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bXJvd3MpOw0KKyAgdmlydHVhbCB+Q0JDX0RlZmF1bHRQbGFjZW1lbnQoKTsNCiANCi0gICAgaW50MzJfdCBnZXROdW1yb3dzKCk7DQotICAgIGludDMyX3QgZ2V0TnVtY29scygpOw0KLSAgICBDRlhfQnl0ZUFycmF5JiBnZXRCaXRzKCk7DQotICAgIEZYX0JPT0wgZ2V0Qml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdyk7DQotICAgIHZvaWQgc2V0Qml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdywgRlhfQk9PTCBiaXQpOw0KLSAgICBGWF9CT09MIGhhc0JpdChpbnQzMl90IGNvbCwgaW50MzJfdCByb3cpOw0KLSAgICB2b2lkIHBsYWNlKCk7DQotcHJpdmF0ZToNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgbV9jb2Rld29yZHM7DQotICAgIGludDMyX3QgbV9udW1yb3dzOw0KLSAgICBpbnQzMl90IG1fbnVtY29sczsNCi0gICAgQ0ZYX0J5dGVBcnJheSBtX2JpdHM7DQotICAgIHZvaWQgbW9kdWxlKGludDMyX3Qgcm93LCBpbnQzMl90IGNvbCwgaW50MzJfdCBwb3MsIGludDMyX3QgYml0KTsNCi0gICAgdm9pZCB1dGFoKGludDMyX3Qgcm93LCBpbnQzMl90IGNvbCwgaW50MzJfdCBwb3MpOw0KLSAgICB2b2lkIGNvcm5lcjEoaW50MzJfdCBwb3MpOw0KLSAgICB2b2lkIGNvcm5lcjIoaW50MzJfdCBwb3MpOw0KLSAgICB2b2lkIGNvcm5lcjMoaW50MzJfdCBwb3MpOw0KLSAgICB2b2lkIGNvcm5lcjQoaW50MzJfdCBwb3MpOw0KKyAgaW50MzJfdCBnZXROdW1yb3dzKCk7DQorICBpbnQzMl90IGdldE51bWNvbHMoKTsNCisgIENGWF9CeXRlQXJyYXkmIGdldEJpdHMoKTsNCisgIEZYX0JPT0wgZ2V0Qml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdyk7DQorICB2b2lkIHNldEJpdChpbnQzMl90IGNvbCwgaW50MzJfdCByb3csIEZYX0JPT0wgYml0KTsNCisgIEZYX0JPT0wgaGFzQml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdyk7DQorICB2b2lkIHBsYWNlKCk7DQorDQorIHByaXZhdGU6DQorICBDRlhfV2lkZVN0cmluZyBtX2NvZGV3b3JkczsNCisgIGludDMyX3QgbV9udW1yb3dzOw0KKyAgaW50MzJfdCBtX251bWNvbHM7DQorICBDRlhfQnl0ZUFycmF5IG1fYml0czsNCisgIHZvaWQgbW9kdWxlKGludDMyX3Qgcm93LCBpbnQzMl90IGNvbCwgaW50MzJfdCBwb3MsIGludDMyX3QgYml0KTsNCisgIHZvaWQgdXRhaChpbnQzMl90IHJvdywgaW50MzJfdCBjb2wsIGludDMyX3QgcG9zKTsNCisgIHZvaWQgY29ybmVyMShpbnQzMl90IHBvcyk7DQorICB2b2lkIGNvcm5lcjIoaW50MzJfdCBwb3MpOw0KKyAgdm9pZCBjb3JuZXIzKGludDMyX3QgcG9zKTsNCisgIHZvaWQgY29ybmVyNChpbnQzMl90IHBvcyk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuY3BwCmluZGV4IGNjNDZiODEuLjYwYjc5NmEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuY3BwCkBAIC0yOSwxMjUgKzI5LDEyNiBAQAogI2luY2x1ZGUgIkJDX0VuY29kZXJDb250ZXh0LmgiDQogI2luY2x1ZGUgIkJDX0hpZ2hMZXZlbEVuY29kZXIuaCINCiAjaW5jbHVkZSAiQkNfRWRpZmFjdEVuY29kZXIuaCINCi1DQkNfRWRpZmFjdEVuY29kZXI6OkNCQ19FZGlmYWN0RW5jb2RlcigpDQotew0KK0NCQ19FZGlmYWN0RW5jb2Rlcjo6Q0JDX0VkaWZhY3RFbmNvZGVyKCkge30NCitDQkNfRWRpZmFjdEVuY29kZXI6On5DQkNfRWRpZmFjdEVuY29kZXIoKSB7fQ0KK2ludDMyX3QgQ0JDX0VkaWZhY3RFbmNvZGVyOjpnZXRFbmNvZGluZ01vZGUoKSB7DQorICByZXR1cm4gRURJRkFDVF9FTkNPREFUSU9OOw0KIH0NCi1DQkNfRWRpZmFjdEVuY29kZXI6On5DQkNfRWRpZmFjdEVuY29kZXIoKQ0KLXsNCi19DQotaW50MzJfdCBDQkNfRWRpZmFjdEVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpDQotew0KLSAgICByZXR1cm4gRURJRkFDVF9FTkNPREFUSU9OOw0KLX0NCi12b2lkIENCQ19FZGlmYWN0RW5jb2Rlcjo6RW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIGJ1ZmZlcjsNCi0gICAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KLSAgICAgICAgRlhfV0NIQVIgYyA9IGNvbnRleHQuZ2V0Q3VycmVudENoYXIoKTsNCi0gICAgICAgIGVuY29kZUNoYXIoYywgYnVmZmVyLCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBjb250ZXh0Lm1fcG9zKys7DQotICAgICAgICBpbnQzMl90IGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOw0KLSAgICAgICAgaWYgKGNvdW50ID49IDQpIHsNCi0gICAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmRzKGVuY29kZVRvQ29kZXdvcmRzKGJ1ZmZlciwgMCwgZSkpOw0KLSAgICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBidWZmZXIuRGVsZXRlKDAsIDQpOw0KLSAgICAgICAgICAgIGludDMyX3QgbmV3TW9kZSA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpsb29rQWhlYWRUZXN0KGNvbnRleHQubV9tc2csIGNvbnRleHQubV9wb3MsIGdldEVuY29kaW5nTW9kZSgpKTsNCi0gICAgICAgICAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgew0KLSAgICAgICAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBidWZmZXIgKz0gKEZYX1dDSEFSKTMxOw0KLSAgICBoYW5kbGVFT0QoY29udGV4dCwgYnVmZmVyLCBlKTsNCi19DQotdm9pZCBDQkNfRWRpZmFjdEVuY29kZXI6OmhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIENGWF9XaWRlU3RyaW5nIGJ1ZmZlciwgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChjb3VudCA9PSAwKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKGNvdW50ID09IDEpIHsNCi0gICAgICAgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGF2YWlsYWJsZSA9IGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpOw0KLSAgICAgICAgaW50MzJfdCByZW1haW5pbmcgPSBjb250ZXh0LmdldFJlbWFpbmluZ0NoYXJhY3RlcnMoKTsNCi0gICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCAmJiBhdmFpbGFibGUgPD0gMikgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoY291bnQgPiA0KSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVDb3VudE11c3ROb3RFeGNlZWQ0Ow0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgcmVzdENoYXJzID0gY291bnQgLSAxOw0KLSAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkID0gZW5jb2RlVG9Db2Rld29yZHMoYnVmZmVyLCAwLCBlKTsNCit2b2lkIENCQ19FZGlmYWN0RW5jb2Rlcjo6RW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgYnVmZmVyOw0KKyAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KKyAgICBGWF9XQ0hBUiBjID0gY29udGV4dC5nZXRDdXJyZW50Q2hhcigpOw0KKyAgICBlbmNvZGVDaGFyKGMsIGJ1ZmZlciwgZSk7DQogICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgY29udGV4dC5tX3BvcysrOw0KKyAgICBpbnQzMl90IGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOw0KKyAgICBpZiAoY291bnQgPj0gNCkgew0KKyAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZHMoZW5jb2RlVG9Db2Rld29yZHMoYnVmZmVyLCAwLCBlKSk7DQorICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBidWZmZXIuRGVsZXRlKDAsIDQpOw0KKyAgICAgIGludDMyX3QgbmV3TW9kZSA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpsb29rQWhlYWRUZXN0KA0KKyAgICAgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7DQorICAgICAgaWYgKG5ld01vZGUgIT0gZ2V0RW5jb2RpbmdNb2RlKCkpIHsNCisgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShBU0NJSV9FTkNPREFUSU9OKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGWF9CT09MIGVuZE9mU3ltYm9sUmVhY2hlZCA9ICFjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCk7DQotICAgIEZYX0JPT0wgcmVzdEluQXNjaWkgPSBlbmRPZlN5bWJvbFJlYWNoZWQgJiYgcmVzdENoYXJzIDw9IDI7DQotICAgIGlmIChyZXN0Q2hhcnMgPD0gMikgew0KLSAgICAgICAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpICsgcmVzdENoYXJzLCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGF2YWlsYWJsZSA9IGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpOw0KLSAgICAgICAgaWYgKGF2YWlsYWJsZSA+PSAzKSB7DQotICAgICAgICAgICAgcmVzdEluQXNjaWkgPSBGQUxTRTsNCi0gICAgICAgICAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyBlbmNvZGVkLkdldExlbmd0aCgpLCBlKTsNCi0gICAgICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHJlc3RJbkFzY2lpKSB7DQotICAgICAgICBjb250ZXh0LnJlc2V0U3ltYm9sSW5mbygpOw0KLSAgICAgICAgY29udGV4dC5tX3BvcyAtPSByZXN0Q2hhcnM7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmRzKGVuY29kZWQpOw0KLSAgICB9DQotICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShBU0NJSV9FTkNPREFUSU9OKTsNCisgIH0NCisgIGJ1ZmZlciArPSAoRlhfV0NIQVIpMzE7DQorICBoYW5kbGVFT0QoY29udGV4dCwgYnVmZmVyLCBlKTsNCiB9DQotdm9pZCBDQkNfRWRpZmFjdEVuY29kZXI6OmVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcgJnNiLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKGMgPj0gJyAnICYmIGMgPD0gJz8nKSB7DQotICAgICAgICBzYiArPSBjOw0KLSAgICB9IGVsc2UgaWYgKGMgPj0gJ0AnICYmIGMgPD0gJ14nKSB7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA2NCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aWxsZWdhbENoYXJhY3RlcihjLCBlKTsNCit2b2lkIENCQ19FZGlmYWN0RW5jb2Rlcjo6aGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7DQorICBpZiAoY291bnQgPT0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoY291bnQgPT0gMSkgew0KKyAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICByZXR1cm47DQogICAgIH0NCisgICAgaW50MzJfdCBhdmFpbGFibGUgPQ0KKyAgICAgICAgY29udGV4dC5tX3N5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5IC0gY29udGV4dC5nZXRDb2Rld29yZENvdW50KCk7DQorICAgIGludDMyX3QgcmVtYWluaW5nID0gY29udGV4dC5nZXRSZW1haW5pbmdDaGFyYWN0ZXJzKCk7DQorICAgIGlmIChyZW1haW5pbmcgPT0gMCAmJiBhdmFpbGFibGUgPD0gMikgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGNvdW50ID4gNCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVDb3VudE11c3ROb3RFeGNlZWQ0Ow0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IHJlc3RDaGFycyA9IGNvdW50IC0gMTsNCisgIENGWF9XaWRlU3RyaW5nIGVuY29kZWQgPSBlbmNvZGVUb0NvZGV3b3JkcyhidWZmZXIsIDAsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGVuZE9mU3ltYm9sUmVhY2hlZCA9ICFjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCk7DQorICBGWF9CT09MIHJlc3RJbkFzY2lpID0gZW5kT2ZTeW1ib2xSZWFjaGVkICYmIHJlc3RDaGFycyA8PSAyOw0KKyAgaWYgKHJlc3RDaGFycyA8PSAyKSB7DQorICAgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKSArIHJlc3RDaGFycywgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaW50MzJfdCBhdmFpbGFibGUgPQ0KKyAgICAgICAgY29udGV4dC5tX3N5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5IC0gY29udGV4dC5nZXRDb2Rld29yZENvdW50KCk7DQorICAgIGlmIChhdmFpbGFibGUgPj0gMykgew0KKyAgICAgIHJlc3RJbkFzY2lpID0gRkFMU0U7DQorICAgICAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpICsgZW5jb2RlZC5HZXRMZW5ndGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7DQorICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHJlc3RJbkFzY2lpKSB7DQorICAgIGNvbnRleHQucmVzZXRTeW1ib2xJbmZvKCk7DQorICAgIGNvbnRleHQubV9wb3MgLT0gcmVzdENoYXJzOw0KKyAgfSBlbHNlIHsNCisgICAgY29udGV4dC53cml0ZUNvZGV3b3JkcyhlbmNvZGVkKTsNCisgIH0NCisgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShBU0NJSV9FTkNPREFUSU9OKTsNCiB9DQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VkaWZhY3RFbmNvZGVyOjplbmNvZGVUb0NvZGV3b3JkcyhDRlhfV2lkZVN0cmluZyBzYiwgaW50MzJfdCBzdGFydFBvcywgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgbGVuID0gc2IuR2V0TGVuZ3RoKCkgLSBzdGFydFBvczsNCi0gICAgaWYgKGxlbiA9PSAwKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KLSAgICAgICAgcmV0dXJuIChGWF9XQ0hBUiopIiI7DQotICAgIH0NCi0gICAgRlhfV0NIQVIgYzEgPSBzYi5HZXRBdChzdGFydFBvcyk7DQotICAgIEZYX1dDSEFSIGMyID0gbGVuID49IDIgPyBzYi5HZXRBdChzdGFydFBvcyArIDEpIDogMDsNCi0gICAgRlhfV0NIQVIgYzMgPSBsZW4gPj0gMyA/IHNiLkdldEF0KHN0YXJ0UG9zICsgMikgOiAwOw0KLSAgICBGWF9XQ0hBUiBjNCA9IGxlbiA+PSA0ID8gc2IuR2V0QXQoc3RhcnRQb3MgKyAzKSA6IDA7DQotICAgIGludDMyX3QgdiA9IChjMSA8PCAxOCkgKyAoYzIgPDwgMTIpICsgKGMzIDw8IDYpICsgYzQ7DQotICAgIEZYX1dDSEFSIGN3MSA9IChGWF9XQ0hBUikgKCh2ID4+IDE2KSAmIDI1NSk7DQotICAgIEZYX1dDSEFSIGN3MiA9IChGWF9XQ0hBUikgKCh2ID4+IDgpICYgMjU1KTsNCi0gICAgRlhfV0NIQVIgY3czID0gKEZYX1dDSEFSKSAodiAmIDI1NSk7DQotICAgIENGWF9XaWRlU3RyaW5nIHJlczsNCi0gICAgcmVzICs9IGN3MTsNCi0gICAgaWYgKGxlbiA+PSAyKSB7DQotICAgICAgICByZXMgKz0gY3cyOw0KLSAgICB9DQotICAgIGlmIChsZW4gPj0gMykgew0KLSAgICAgICAgcmVzICs9IGN3MzsNCi0gICAgfQ0KLSAgICByZXR1cm4gcmVzOw0KK3ZvaWQgQ0JDX0VkaWZhY3RFbmNvZGVyOjplbmNvZGVDaGFyKEZYX1dDSEFSIGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjID49ICcgJyAmJiBjIDw9ICc/Jykgew0KKyAgICBzYiArPSBjOw0KKyAgfSBlbHNlIGlmIChjID49ICdAJyAmJiBjIDw9ICdeJykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA2NCk7DQorICB9IGVsc2Ugew0KKyAgICBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aWxsZWdhbENoYXJhY3RlcihjLCBlKTsNCisgIH0NCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VkaWZhY3RFbmNvZGVyOjplbmNvZGVUb0NvZGV3b3JkcyhDRlhfV2lkZVN0cmluZyBzYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGxlbiA9IHNiLkdldExlbmd0aCgpIC0gc3RhcnRQb3M7DQorICBpZiAobGVuID09IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTm9Db250ZW50czsNCisgICAgcmV0dXJuIChGWF9XQ0hBUiopIiI7DQorICB9DQorICBGWF9XQ0hBUiBjMSA9IHNiLkdldEF0KHN0YXJ0UG9zKTsNCisgIEZYX1dDSEFSIGMyID0gbGVuID49IDIgPyBzYi5HZXRBdChzdGFydFBvcyArIDEpIDogMDsNCisgIEZYX1dDSEFSIGMzID0gbGVuID49IDMgPyBzYi5HZXRBdChzdGFydFBvcyArIDIpIDogMDsNCisgIEZYX1dDSEFSIGM0ID0gbGVuID49IDQgPyBzYi5HZXRBdChzdGFydFBvcyArIDMpIDogMDsNCisgIGludDMyX3QgdiA9IChjMSA8PCAxOCkgKyAoYzIgPDwgMTIpICsgKGMzIDw8IDYpICsgYzQ7DQorICBGWF9XQ0hBUiBjdzEgPSAoRlhfV0NIQVIpKCh2ID4+IDE2KSAmIDI1NSk7DQorICBGWF9XQ0hBUiBjdzIgPSAoRlhfV0NIQVIpKCh2ID4+IDgpICYgMjU1KTsNCisgIEZYX1dDSEFSIGN3MyA9IChGWF9XQ0hBUikodiAmIDI1NSk7DQorICBDRlhfV2lkZVN0cmluZyByZXM7DQorICByZXMgKz0gY3cxOw0KKyAgaWYgKGxlbiA+PSAyKSB7DQorICAgIHJlcyArPSBjdzI7DQorICB9DQorICBpZiAobGVuID49IDMpIHsNCisgICAgcmVzICs9IGN3MzsNCisgIH0NCisgIHJldHVybiByZXM7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuaAppbmRleCA2YjEwMmM2Li43MzA5YzA3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FZGlmYWN0RW5jb2Rlci5oCkBAIC04LDE2ICs4LDIwIEBACiAjZGVmaW5lIF9CQ19FRElGQUNURU5DT0RFUl9IXw0KIGNsYXNzIENCQ19FbmNvZGVyQ29udGV4dDsNCiBjbGFzcyBDQkNfRWRpZmFjdEVuY29kZXI7DQotY2xhc3MgQ0JDX0VkaWZhY3RFbmNvZGVyIDogcHVibGljIENCQ19FbmNvZGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0VkaWZhY3RFbmNvZGVyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19FZGlmYWN0RW5jb2RlcigpOw0KLSAgICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpOw0KLSAgICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIGludDMyX3QgJmUpOw0KLXByaXZhdGU6DQotICAgIHN0YXRpYyB2b2lkIGhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIENGWF9XaWRlU3RyaW5nIGJ1ZmZlciwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIGVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcgJnNiLCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIENGWF9XaWRlU3RyaW5nIGVuY29kZVRvQ29kZXdvcmRzKENGWF9XaWRlU3RyaW5nIHNiLCBpbnQzMl90IHN0YXJ0UG9zLCBpbnQzMl90ICZlKTsNCitjbGFzcyBDQkNfRWRpZmFjdEVuY29kZXIgOiBwdWJsaWMgQ0JDX0VuY29kZXIgew0KKyBwdWJsaWM6DQorICBDQkNfRWRpZmFjdEVuY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19FZGlmYWN0RW5jb2RlcigpOw0KKyAgaW50MzJfdCBnZXRFbmNvZGluZ01vZGUoKTsNCisgIHZvaWQgRW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgdm9pZCBoYW5kbGVFT0QoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIGVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcmIHNiLCBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBlbmNvZGVUb0NvZGV3b3JkcyhDRlhfV2lkZVN0cmluZyBzYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0UG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5jcHAKaW5kZXggYWNhZTU1NS4uNDg1OGUxOSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuY3BwCkBAIC02LDkgKzYsNSBAQAogDQogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfRW5jb2Rlci5oIg0KLUNCQ19FbmNvZGVyOjpDQkNfRW5jb2RlcigpDQotew0KLX0NCi1DQkNfRW5jb2Rlcjo6fkNCQ19FbmNvZGVyKCkNCi17DQotfQ0KK0NCQ19FbmNvZGVyOjpDQkNfRW5jb2RlcigpIHt9DQorQ0JDX0VuY29kZXI6On5DQkNfRW5jb2RlcigpIHt9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaAppbmRleCA5YTUxYWYwLi43NmIwMjM1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaApAQCAtNywxMiArNywxMSBAQAogI2lmbmRlZiBfQkNfRU5DT0RFUl9IXw0KICNkZWZpbmUgX0JDX0VOQ09ERVJfSF8NCiBjbGFzcyBDQkNfRW5jb2RlckNvbnRleHQ7DQotY2xhc3MgQ0JDX0VuY29kZXINCi17DQotcHVibGljOg0KLSAgICBDQkNfRW5jb2RlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfRW5jb2RlcigpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQgRW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgaW50MzJfdCAmZSkgPSAwOw0KK2NsYXNzIENCQ19FbmNvZGVyIHsNCisgcHVibGljOg0KKyAgQ0JDX0VuY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19FbmNvZGVyKCk7DQorICB2aXJ0dWFsIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpID0gMDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5jcHAKaW5kZXggMDY2YjRiMi4uOGIzMDkzYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5jcHAKQEAgLTI4LDEwMCArMjgsODQgQEAKICNpbmNsdWRlICJCQ19TeW1ib2xTaGFwZUhpbnQuaCINCiAjaW5jbHVkZSAiQkNfU3ltYm9sSW5mby5oIg0KICNpbmNsdWRlICJCQ19FbmNvZGVyQ29udGV4dC5oIg0KLUNCQ19FbmNvZGVyQ29udGV4dDo6Q0JDX0VuY29kZXJDb250ZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nIG1zZywgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9CeXRlU3RyaW5nIGRzdHN0cjsNCi0gICAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVbmljb2RlVG9VVEY4KG1zZywgZHN0c3RyKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc2I7DQotICAgIGludDMyX3QgYyA9IGRzdHN0ci5HZXRMZW5ndGgoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYzsgaSsrKSB7DQotICAgICAgICBGWF9XQ0hBUiBjaCA9ICAoRlhfV0NIQVIpKGRzdHN0ci5HZXRBdChpKSAmIDB4ZmYpOw0KLSAgICAgICAgaWYgKGNoID09ICc/JyAmJiBkc3RzdHIuR2V0QXQoaSkgIT0gJz8nKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hhcmFjdGVyc091dHNpZGVJU084ODU5MUVuY29kaW5nOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc2IgKz0gY2g7DQorQ0JDX0VuY29kZXJDb250ZXh0OjpDQkNfRW5jb2RlckNvbnRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgZHN0c3RyOw0KKyAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVbmljb2RlVG9VVEY4KG1zZywgZHN0c3RyKTsNCisgIENGWF9XaWRlU3RyaW5nIHNiOw0KKyAgaW50MzJfdCBjID0gZHN0c3RyLkdldExlbmd0aCgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYzsgaSsrKSB7DQorICAgIEZYX1dDSEFSIGNoID0gKEZYX1dDSEFSKShkc3RzdHIuR2V0QXQoaSkgJiAweGZmKTsNCisgICAgaWYgKGNoID09ICc/JyAmJiBkc3RzdHIuR2V0QXQoaSkgIT0gJz8nKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hhcmFjdGVyc091dHNpZGVJU084ODU5MUVuY29kaW5nOw0KICAgICB9DQotICAgIG1fbXNnID0gc2I7DQotICAgIG1fc2hhcGUgPSBGT1JDRV9OT05FOw0KLSAgICBtX25ld0VuY29kaW5nID0gLTE7DQotICAgIG1fcG9zID0gMDsNCi0gICAgbV9zeW1ib2xJbmZvID0gTlVMTDsNCi0gICAgbV9za2lwQXRFbmQgPSAwOw0KLSAgICBtX21heFNpemUgPSBOVUxMOw0KLSAgICBtX21pblNpemUgPSBOVUxMOw0KKyAgICBzYiArPSBjaDsNCisgIH0NCisgIG1fbXNnID0gc2I7DQorICBtX3NoYXBlID0gRk9SQ0VfTk9ORTsNCisgIG1fbmV3RW5jb2RpbmcgPSAtMTsNCisgIG1fcG9zID0gMDsNCisgIG1fc3ltYm9sSW5mbyA9IE5VTEw7DQorICBtX3NraXBBdEVuZCA9IDA7DQorICBtX21heFNpemUgPSBOVUxMOw0KKyAgbV9taW5TaXplID0gTlVMTDsNCiB9DQotQ0JDX0VuY29kZXJDb250ZXh0Ojp+Q0JDX0VuY29kZXJDb250ZXh0KCkNCi17DQorQ0JDX0VuY29kZXJDb250ZXh0Ojp+Q0JDX0VuY29kZXJDb250ZXh0KCkge30NCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6c2V0U3ltYm9sU2hhcGUoU3ltYm9sU2hhcGVIaW50IHNoYXBlKSB7DQorICBtX3NoYXBlID0gc2hhcGU7DQogfQ0KLXZvaWQgQ0JDX0VuY29kZXJDb250ZXh0OjpzZXRTeW1ib2xTaGFwZShTeW1ib2xTaGFwZUhpbnQgc2hhcGUpDQotew0KLSAgICBtX3NoYXBlID0gc2hhcGU7DQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnNldFNpemVDb25zdHJhaW50cyhDQkNfRGltZW5zaW9uKiBtaW5TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSkgew0KKyAgbV9tYXhTaXplID0gbWF4U2l6ZTsNCisgIG1fbWluU2l6ZSA9IG1pblNpemU7DQogfQ0KLXZvaWQgQ0JDX0VuY29kZXJDb250ZXh0OjpzZXRTaXplQ29uc3RyYWludHMoQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSkNCi17DQotICAgIG1fbWF4U2l6ZSA9IG1heFNpemU7DQotICAgIG1fbWluU2l6ZSA9IG1pblNpemU7DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRNZXNzYWdlKCkgew0KKyAgcmV0dXJuIG1fbXNnOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDQkNfRW5jb2RlckNvbnRleHQ6OmdldE1lc3NhZ2UoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbXNnOw0KK3ZvaWQgQ0JDX0VuY29kZXJDb250ZXh0OjpzZXRTa2lwQXRFbmQoaW50MzJfdCBjb3VudCkgew0KKyAgbV9za2lwQXRFbmQgPSBjb3VudDsNCiB9DQotdm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnNldFNraXBBdEVuZChpbnQzMl90IGNvdW50KQ0KLXsNCi0gICAgbV9za2lwQXRFbmQgPSBjb3VudDsNCitGWF9XQ0hBUiBDQkNfRW5jb2RlckNvbnRleHQ6OmdldEN1cnJlbnRDaGFyKCkgew0KKyAgcmV0dXJuIG1fbXNnLkdldEF0KG1fcG9zKTsNCiB9DQotRlhfV0NIQVIgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRDdXJyZW50Q2hhcigpDQotew0KLSAgICByZXR1cm4gbV9tc2cuR2V0QXQobV9wb3MpOw0KK0ZYX1dDSEFSIENCQ19FbmNvZGVyQ29udGV4dDo6Z2V0Q3VycmVudCgpIHsNCisgIHJldHVybiBtX21zZy5HZXRBdChtX3Bvcyk7DQogfQ0KLUZYX1dDSEFSIENCQ19FbmNvZGVyQ29udGV4dDo6Z2V0Q3VycmVudCgpDQotew0KLSAgICByZXR1cm4gbV9tc2cuR2V0QXQobV9wb3MpOw0KK3ZvaWQgQ0JDX0VuY29kZXJDb250ZXh0Ojp3cml0ZUNvZGV3b3JkcyhDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMpIHsNCisgIG1fY29kZXdvcmRzICs9IGNvZGV3b3JkczsNCiB9DQotdm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OndyaXRlQ29kZXdvcmRzKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcykNCi17DQotICAgIG1fY29kZXdvcmRzICs9IGNvZGV3b3JkczsNCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6d3JpdGVDb2Rld29yZChGWF9XQ0hBUiBjb2Rld29yZCkgew0KKyAgbV9jb2Rld29yZHMgKz0gY29kZXdvcmQ7DQogfQ0KLXZvaWQgQ0JDX0VuY29kZXJDb250ZXh0Ojp3cml0ZUNvZGV3b3JkKEZYX1dDSEFSIGNvZGV3b3JkKQ0KLXsNCi0gICAgbV9jb2Rld29yZHMgKz0gY29kZXdvcmQ7DQoraW50MzJfdCBDQkNfRW5jb2RlckNvbnRleHQ6OmdldENvZGV3b3JkQ291bnQoKSB7DQorICByZXR1cm4gbV9jb2Rld29yZHMuR2V0TGVuZ3RoKCk7DQogfQ0KLWludDMyX3QgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRDb2Rld29yZENvdW50KCkNCi17DQotICAgIHJldHVybiBtX2NvZGV3b3Jkcy5HZXRMZW5ndGgoKTsNCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6c2lnbmFsRW5jb2RlckNoYW5nZShpbnQzMl90IGVuY29kaW5nKSB7DQorICBtX25ld0VuY29kaW5nID0gZW5jb2Rpbmc7DQogfQ0KLXZvaWQgQ0JDX0VuY29kZXJDb250ZXh0OjpzaWduYWxFbmNvZGVyQ2hhbmdlKGludDMyX3QgZW5jb2RpbmcpDQotew0KLSAgICBtX25ld0VuY29kaW5nID0gZW5jb2Rpbmc7DQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnJlc2V0RW5jb2RlclNpZ25hbCgpIHsNCisgIG1fbmV3RW5jb2RpbmcgPSAtMTsNCiB9DQotdm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnJlc2V0RW5jb2RlclNpZ25hbCgpDQotew0KLSAgICBtX25ld0VuY29kaW5nID0gLTE7DQorRlhfQk9PTCBDQkNfRW5jb2RlckNvbnRleHQ6Omhhc01vcmVDaGFyYWN0ZXJzKCkgew0KKyAgcmV0dXJuIG1fcG9zIDwgZ2V0VG90YWxNZXNzYWdlQ2hhckNvdW50KCk7DQogfQ0KLUZYX0JPT0wgQ0JDX0VuY29kZXJDb250ZXh0OjpoYXNNb3JlQ2hhcmFjdGVycygpDQotew0KLSAgICByZXR1cm4gbV9wb3MgPCBnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKTsNCitpbnQzMl90IENCQ19FbmNvZGVyQ29udGV4dDo6Z2V0UmVtYWluaW5nQ2hhcmFjdGVycygpIHsNCisgIHJldHVybiBnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKSAtIG1fcG9zOw0KIH0NCi1pbnQzMl90IENCQ19FbmNvZGVyQ29udGV4dDo6Z2V0UmVtYWluaW5nQ2hhcmFjdGVycygpDQotew0KLSAgICByZXR1cm4gZ2V0VG90YWxNZXNzYWdlQ2hhckNvdW50KCkgLSBtX3BvczsNCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6dXBkYXRlU3ltYm9sSW5mbyhpbnQzMl90JiBlKSB7DQorICB1cGRhdGVTeW1ib2xJbmZvKGdldENvZGV3b3JkQ291bnQoKSwgZSk7DQogfQ0KLXZvaWQgQ0JDX0VuY29kZXJDb250ZXh0Ojp1cGRhdGVTeW1ib2xJbmZvKGludDMyX3QgJmUpDQotew0KLSAgICB1cGRhdGVTeW1ib2xJbmZvKGdldENvZGV3b3JkQ291bnQoKSwgZSk7DQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCBsZW4sIGludDMyX3QmIGUpIHsNCisgIGlmIChtX3N5bWJvbEluZm8gPT0gTlVMTCB8fCBsZW4gPiBtX3N5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5KSB7DQorICAgIG1fc3ltYm9sSW5mbyA9DQorICAgICAgICBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGxlbiwgbV9zaGFwZSwgbV9taW5TaXplLCBtX21heFNpemUsIHRydWUsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCiB9DQotdm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCBsZW4sIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAobV9zeW1ib2xJbmZvID09IE5VTEwgfHwgbGVuID4gbV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSkgew0KLSAgICAgICAgbV9zeW1ib2xJbmZvID0gQ0JDX1N5bWJvbEluZm86Omxvb2t1cChsZW4sIG1fc2hhcGUsIG1fbWluU2l6ZSwgbV9tYXhTaXplLCB0cnVlLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnJlc2V0U3ltYm9sSW5mbygpIHsNCisgIG1fc2hhcGUgPSBGT1JDRV9OT05FOw0KIH0NCi12b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6cmVzZXRTeW1ib2xJbmZvKCkNCi17DQotICAgIG1fc2hhcGUgPSBGT1JDRV9OT05FOw0KLX0NCi1pbnQzMl90IENCQ19FbmNvZGVyQ29udGV4dDo6Z2V0VG90YWxNZXNzYWdlQ2hhckNvdW50KCkNCi17DQotICAgIHJldHVybiBtX21zZy5HZXRMZW5ndGgoKSAtIG1fc2tpcEF0RW5kOw0KK2ludDMyX3QgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKSB7DQorICByZXR1cm4gbV9tc2cuR2V0TGVuZ3RoKCkgLSBtX3NraXBBdEVuZDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5oCmluZGV4IGUyZGQwYjMuLjQ1YTIzMjggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgKQEAgLTEwLDM5ICsxMCw0MyBAQAogY2xhc3MgQ0JDX1N5bWJvbEluZm87DQogY2xhc3MgQ0JDX0RpbWVuc2lvbjsNCiBjbGFzcyBDQkNfRW5jb2RlckNvbnRleHQ7DQotY2xhc3MgQ0JDX0VuY29kZXJDb250ZXh0IDogcHVibGljIENCQ19TeW1ib2xTaGFwZUhpbnQNCi17DQotcHVibGljOg0KLSAgICBDQkNfRW5jb2RlckNvbnRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgbXNnLCBDRlhfV2lkZVN0cmluZyBlY0xldmVsLCBpbnQzMl90ICZlKTsNCi0gICAgdmlydHVhbCB+Q0JDX0VuY29kZXJDb250ZXh0KCk7DQotICAgIHZvaWQgc2V0U3ltYm9sU2hhcGUoU3ltYm9sU2hhcGVIaW50IHNoYXBlKTsNCi0gICAgdm9pZCBzZXRTaXplQ29uc3RyYWludHMoQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSk7DQotICAgIENGWF9XaWRlU3RyaW5nIGdldE1lc3NhZ2UoKTsNCi0gICAgdm9pZCBzZXRTa2lwQXRFbmQoaW50MzJfdCBjb3VudCk7DQotICAgIEZYX1dDSEFSIGdldEN1cnJlbnRDaGFyKCk7DQotICAgIEZYX1dDSEFSIGdldEN1cnJlbnQoKTsNCi0gICAgdm9pZCB3cml0ZUNvZGV3b3JkcyhDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMpOw0KLSAgICB2b2lkIHdyaXRlQ29kZXdvcmQoRlhfV0NIQVIgY29kZXdvcmQpOw0KLSAgICBpbnQzMl90IGdldENvZGV3b3JkQ291bnQoKTsNCi0gICAgdm9pZCBzaWduYWxFbmNvZGVyQ2hhbmdlKGludDMyX3QgZW5jb2RpbmcpOw0KLSAgICB2b2lkIHJlc2V0RW5jb2RlclNpZ25hbCgpOw0KLSAgICBGWF9CT09MIGhhc01vcmVDaGFyYWN0ZXJzKCk7DQotICAgIGludDMyX3QgZ2V0UmVtYWluaW5nQ2hhcmFjdGVycygpOw0KLSAgICB2b2lkIHVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCAmZSk7DQotICAgIHZvaWQgdXBkYXRlU3ltYm9sSW5mbyhpbnQzMl90IGxlbiwgaW50MzJfdCAmZSk7DQotICAgIHZvaWQgcmVzZXRTeW1ib2xJbmZvKCk7DQotcHVibGljOg0KLSAgICBDRlhfV2lkZVN0cmluZyBtX21zZzsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgbV9jb2Rld29yZHM7DQotICAgIGludDMyX3QgbV9wb3M7DQotICAgIGludDMyX3QgbV9uZXdFbmNvZGluZzsNCi0gICAgQ0JDX1N5bWJvbEluZm8qIG1fc3ltYm9sSW5mbzsNCi1wcml2YXRlOg0KLSAgICBpbnQzMl90IGdldFRvdGFsTWVzc2FnZUNoYXJDb3VudCgpOw0KLXByaXZhdGU6DQotICAgIFN5bWJvbFNoYXBlSGludCBtX3NoYXBlOw0KLSAgICBDQkNfRGltZW5zaW9uKiBtX21pblNpemU7DQotICAgIENCQ19EaW1lbnNpb24qIG1fbWF4U2l6ZTsNCi0gICAgaW50MzJfdCBtX3NraXBBdEVuZDsNCitjbGFzcyBDQkNfRW5jb2RlckNvbnRleHQgOiBwdWJsaWMgQ0JDX1N5bWJvbFNoYXBlSGludCB7DQorIHB1YmxpYzoNCisgIENCQ19FbmNvZGVyQ29udGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgfkNCQ19FbmNvZGVyQ29udGV4dCgpOw0KKyAgdm9pZCBzZXRTeW1ib2xTaGFwZShTeW1ib2xTaGFwZUhpbnQgc2hhcGUpOw0KKyAgdm9pZCBzZXRTaXplQ29uc3RyYWludHMoQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSk7DQorICBDRlhfV2lkZVN0cmluZyBnZXRNZXNzYWdlKCk7DQorICB2b2lkIHNldFNraXBBdEVuZChpbnQzMl90IGNvdW50KTsNCisgIEZYX1dDSEFSIGdldEN1cnJlbnRDaGFyKCk7DQorICBGWF9XQ0hBUiBnZXRDdXJyZW50KCk7DQorICB2b2lkIHdyaXRlQ29kZXdvcmRzKENGWF9XaWRlU3RyaW5nIGNvZGV3b3Jkcyk7DQorICB2b2lkIHdyaXRlQ29kZXdvcmQoRlhfV0NIQVIgY29kZXdvcmQpOw0KKyAgaW50MzJfdCBnZXRDb2Rld29yZENvdW50KCk7DQorICB2b2lkIHNpZ25hbEVuY29kZXJDaGFuZ2UoaW50MzJfdCBlbmNvZGluZyk7DQorICB2b2lkIHJlc2V0RW5jb2RlclNpZ25hbCgpOw0KKyAgRlhfQk9PTCBoYXNNb3JlQ2hhcmFjdGVycygpOw0KKyAgaW50MzJfdCBnZXRSZW1haW5pbmdDaGFyYWN0ZXJzKCk7DQorICB2b2lkIHVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCYgZSk7DQorICB2b2lkIHVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCBsZW4sIGludDMyX3QmIGUpOw0KKyAgdm9pZCByZXNldFN5bWJvbEluZm8oKTsNCisNCisgcHVibGljOg0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV9tc2c7DQorICBDRlhfV2lkZVN0cmluZyBtX2NvZGV3b3JkczsNCisgIGludDMyX3QgbV9wb3M7DQorICBpbnQzMl90IG1fbmV3RW5jb2Rpbmc7DQorICBDQkNfU3ltYm9sSW5mbyogbV9zeW1ib2xJbmZvOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKTsNCisNCisgcHJpdmF0ZToNCisgIFN5bWJvbFNoYXBlSGludCBtX3NoYXBlOw0KKyAgQ0JDX0RpbWVuc2lvbiogbV9taW5TaXplOw0KKyAgQ0JDX0RpbWVuc2lvbiogbV9tYXhTaXplOw0KKyAgaW50MzJfdCBtX3NraXBBdEVuZDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcAppbmRleCA5ODMzZjI4Li4zMmRkNDE2IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FcnJvckNvcnJlY3Rpb24uY3BwCkBAIC0yNSw3ICsyNSw4IEBACiAjaW5jbHVkZSAiQkNfU3ltYm9sU2hhcGVIaW50LmgiDQogI2luY2x1ZGUgIkJDX1N5bWJvbEluZm8uaCINCiAjaW5jbHVkZSAiQkNfRXJyb3JDb3JyZWN0aW9uLmgiDQotaW50MzJfdCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpGQUNUT1JfU0VUU1tdID0gezUsIDcsIDEwLCAxMSwgMTIsIDE0LCAxOCwgMjAsIDI0LCAyOCwgMzYsIDQyLCA0OCwgNTYsIDYyLCA2OH07DQoraW50MzJfdCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpGQUNUT1JfU0VUU1tdID0gezUsICA3LCAgMTAsIDExLCAxMiwgMTQsIDE4LCAyMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQsIDI4LCAzNiwgNDIsIDQ4LCA1NiwgNjIsIDY4fTsNCiBpbnQzMl90IENCQ19FcnJvckNvcnJlY3Rpb246OkZBQ1RPUlNbXVsxMDBdID0gew0KICAgICB7MjI4LCA0OCwgMTUsIDExMSwgNjJ9LA0KICAgICB7MjMsIDY4LCAxNDQsIDEzNCwgMjQwLCA5MiwgMjU0fSwNCkBAIC0zMywxNjIgKzM0LDE0OSBAQAogICAgIHsxNzUsIDEzOCwgMjA1LCAxMiwgMTk0LCAxNjgsIDM5LCAyNDUsIDYwLCA5NywgMTIwfSwNCiAgICAgezQxLCAxNTMsIDE1OCwgOTEsIDYxLCA0MiwgMTQyLCAyMTMsIDk3LCAxNzgsIDEwMCwgMjQyfSwNCiAgICAgezE1NiwgOTcsIDE5MiwgMjUyLCA5NSwgOSwgMTU3LCAxMTksIDEzOCwgNDUsIDE4LCAxODYsIDgzLCAxODV9LA0KLSAgICB7ODMsIDE5NSwgMTAwLCAzOSwgMTg4LCA3NSwgNjYsIDYxLCAyNDEsIDIxMywgMTA5LCAxMjksIDk0LCAyNTQsIDIyNSwgNDgsIDkwLCAxODh9LA0KLSAgICB7MTUsIDE5NSwgMjQ0LCA5LCAyMzMsIDcxLCAxNjgsIDIsIDE4OCwgMTYwLCAxNTMsIDE0NSwgMjUzLCA3OSwgMTA4LCA4MiwgMjcsIDE3NCwgMTg2LCAxNzJ9LA0KLSAgICB7DQotICAgICAgICA1MiwgMTkwLCA4OCwgMjA1LCAxMDksIDM5LCAxNzYsIDIxLCAxNTUsIDE5NywgMjUxLCAyMjMsIDE1NSwgMjEsIDUsIDE3MiwNCi0gICAgICAgIDI1NCwgMTI0LCAxMiwgMTgxLCAxODQsIDk2LCA1MCwgMTkzDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgIDIxMSwgMjMxLCA0MywgOTcsIDcxLCA5NiwgMTAzLCAxNzQsIDM3LCAxNTEsIDE3MCwgNTMsIDc1LCAzNCwgMjQ5LCAxMjEsDQotICAgICAgICAxNywgMTM4LCAxMTAsIDIxMywgMTQxLCAxMzYsIDEyMCwgMTUxLCAyMzMsIDE2OCwgOTMsIDI1NQ0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAyNDUsIDEyNywgMjQyLCAyMTgsIDEzMCwgMjUwLCAxNjIsIDE4MSwgMTAyLCAxMjAsIDg0LCAxNzksIDIyMCwgMjUxLCA4MCwgMTgyLA0KLSAgICAgICAgMjI5LCAxOCwgMiwgNCwgNjgsIDMzLCAxMDEsIDEzNywgOTUsIDExOSwgMTE1LCA0NCwgMTc1LCAxODQsIDU5LCAyNSwNCi0gICAgICAgIDIyNSwgOTgsIDgxLCAxMTINCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgNzcsIDE5MywgMTM3LCAzMSwgMTksIDM4LCAyMiwgMTUzLCAyNDcsIDEwNSwgMTIyLCAyLCAyNDUsIDEzMywgMjQyLCA4LA0KLSAgICAgICAgMTc1LCA5NSwgMTAwLCA5LCAxNjcsIDEwNSwgMjE0LCAxMTEsIDU3LCAxMjEsIDIxLCAxLCAyNTMsIDU3LCA1NCwgMTAxLA0KLSAgICAgICAgMjQ4LCAyMDIsIDY5LCA1MCwgMTUwLCAxNzcsIDIyNiwgNSwgOSwgNQ0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAyNDUsIDEzMiwgMTcyLCAyMjMsIDk2LCAzMiwgMTE3LCAyMiwgMjM4LCAxMzMsIDIzOCwgMjMxLCAyMDUsIDE4OCwgMjM3LCA4NywNCi0gICAgICAgIDE5MSwgMTA2LCAxNiwgMTQ3LCAxMTgsIDIzLCAzNywgOTAsIDE3MCwgMjA1LCAxMzEsIDg4LCAxMjAsIDEwMCwgNjYsIDEzOCwNCi0gICAgICAgIDE4NiwgMjQwLCA4MiwgNDQsIDE3NiwgODcsIDE4NywgMTQ3LCAxNjAsIDE3NSwgNjksIDIxMywgOTIsIDI1MywgMjI1LCAxOQ0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAxNzUsIDksIDIyMywgMjM4LCAxMiwgMTcsIDIyMCwgMjA4LCAxMDAsIDI5LCAxNzUsIDE3MCwgMjMwLCAxOTIsIDIxNSwgMjM1LA0KLSAgICAgICAgMTUwLCAxNTksIDM2LCAyMjMsIDM4LCAyMDAsIDEzMiwgNTQsIDIyOCwgMTQ2LCAyMTgsIDIzNCwgMTE3LCAyMDMsIDI5LCAyMzIsDQotICAgICAgICAxNDQsIDIzOCwgMjIsIDE1MCwgMjAxLCAxMTcsIDYyLCAyMDcsIDE2NCwgMTMsIDEzNywgMjQ1LCAxMjcsIDY3LCAyNDcsIDI4LA0KLSAgICAgICAgMTU1LCA0MywgMjAzLCAxMDcsIDIzMywgNTMsIDE0MywgNDYNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgMjQyLCA5MywgMTY5LCA1MCwgMTQ0LCAyMTAsIDM5LCAxMTgsIDIwMiwgMTg4LCAyMDEsIDE4OSwgMTQzLCAxMDgsIDE5NiwgMzcsDQotICAgICAgICAxODUsIDExMiwgMTM0LCAyMzAsIDI0NSwgNjMsIDE5NywgMTkwLCAyNTAsIDEwNiwgMTg1LCAyMjEsIDE3NSwgNjQsIDExNCwgNzEsDQotICAgICAgICAxNjEsIDQ0LCAxNDcsIDYsIDI3LCAyMTgsIDUxLCA2MywgODcsIDEwLCA0MCwgMTMwLCAxODgsIDE3LCAxNjMsIDMxLA0KLSAgICAgICAgMTc2LCAxNzAsIDQsIDEwNywgMjMyLCA3LCA5NCwgMTY2LCAyMjQsIDEyNCwgODYsIDQ3LCAxMSwgMjA0DQotICAgIH0sDQotICAgIHsNCi0gICAgICAgIDIyMCwgMjI4LCAxNzMsIDg5LCAyNTEsIDE0OSwgMTU5LCA1NiwgODksIDMzLCAxNDcsIDI0NCwgMTU0LCAzNiwgNzMsIDEyNywNCi0gICAgICAgIDIxMywgMTM2LCAyNDgsIDE4MCwgMjM0LCAxOTcsIDE1OCwgMTc3LCA2OCwgMTIyLCA5MywgMjEzLCAxNSwgMTYwLCAyMjcsIDIzNiwNCi0gICAgICAgIDY2LCAxMzksIDE1MywgMTg1LCAyMDIsIDE2NywgMTc5LCAyNSwgMjIwLCAyMzIsIDk2LCAyMTAsIDIzMSwgMTM2LCAyMjMsIDIzOSwNCi0gICAgICAgIDE4MSwgMjQxLCA1OSwgNTIsIDE3MiwgMjUsIDQ5LCAyMzIsIDIxMSwgMTg5LCA2NCwgNTQsIDEwOCwgMTUzLCAxMzIsIDYzLA0KLSAgICAgICAgOTYsIDEwMywgODIsIDE4Ng0KLSAgICB9DQotfTsNCisgICAgezgzLCAxOTUsIDEwMCwgMzksIDE4OCwgNzUsIDY2LCA2MSwgMjQxLCAyMTMsIDEwOSwgMTI5LCA5NCwgMjU0LCAyMjUsIDQ4LA0KKyAgICAgOTAsIDE4OH0sDQorICAgIHsxNSwgMTk1LCAyNDQsIDksIDIzMywgNzEsIDE2OCwgMiwgMTg4LCAxNjAsIDE1MywgMTQ1LCAyNTMsIDc5LCAxMDgsIDgyLCAyNywNCisgICAgIDE3NCwgMTg2LCAxNzJ9LA0KKyAgICB7NTIsIDE5MCwgODgsIDIwNSwgMTA5LCAzOSwgMTc2LCAyMSwgMTU1LCAxOTcsIDI1MSwgMjIzLCAxNTUsIDIxLCA1LCAxNzIsDQorICAgICAyNTQsIDEyNCwgMTIsIDE4MSwgMTg0LCA5NiwgNTAsIDE5M30sDQorICAgIHsyMTEsIDIzMSwgNDMsIDk3LCA3MSwgOTYsIDEwMywgMTc0LCAzNywgMTUxLCAxNzAsIDUzLCA3NSwgMzQsIDI0OSwgMTIxLCAxNywNCisgICAgIDEzOCwgMTEwLCAyMTMsIDE0MSwgMTM2LCAxMjAsIDE1MSwgMjMzLCAxNjgsIDkzLCAyNTV9LA0KKyAgICB7MjQ1LCAxMjcsIDI0MiwgMjE4LCAxMzAsIDI1MCwgMTYyLCAxODEsIDEwMiwgMTIwLCA4NCwgMTc5LCAyMjAsIDI1MSwgODAsDQorICAgICAxODIsIDIyOSwgMTgsIDIsIDQsIDY4LCAzMywgMTAxLCAxMzcsIDk1LCAxMTksIDExNSwgNDQsIDE3NSwgMTg0LCA1OSwgMjUsDQorICAgICAyMjUsIDk4LCA4MSwgMTEyfSwNCisgICAgezc3LCAxOTMsIDEzNywgMzEsIDE5LCAzOCwgMjIsIDE1MywgMjQ3LCAxMDUsIDEyMiwgMiwgMjQ1LCAxMzMsIDI0MiwgOCwgMTc1LA0KKyAgICAgOTUsIDEwMCwgOSwgMTY3LCAxMDUsIDIxNCwgMTExLCA1NywgMTIxLCAyMSwgMSwgMjUzLCA1NywgNTQsIDEwMSwgMjQ4LCAyMDIsDQorICAgICA2OSwgNTAsIDE1MCwgMTc3LCAyMjYsIDUsIDksIDV9LA0KKyAgICB7MjQ1LCAxMzIsIDE3MiwgMjIzLCA5NiwgMzIsIDExNywgMjIsIDIzOCwgMTMzLCAyMzgsIDIzMSwgMjA1LCAxODgsIDIzNywgODcsDQorICAgICAxOTEsIDEwNiwgMTYsIDE0NywgMTE4LCAyMywgMzcsIDkwLCAxNzAsIDIwNSwgMTMxLCA4OCwgMTIwLCAxMDAsIDY2LCAxMzgsDQorICAgICAxODYsIDI0MCwgODIsIDQ0LCAxNzYsIDg3LCAxODcsIDE0NywgMTYwLCAxNzUsIDY5LCAyMTMsIDkyLCAyNTMsIDIyNSwgMTl9LA0KKyAgICB7MTc1LCA5LCAyMjMsIDIzOCwgMTIsIDE3LCAyMjAsIDIwOCwgMTAwLCAyOSwgMTc1LCAxNzAsIDIzMCwgMTkyLCAyMTUsIDIzNSwNCisgICAgIDE1MCwgMTU5LCAzNiwgMjIzLCAzOCwgMjAwLCAxMzIsIDU0LCAyMjgsIDE0NiwgMjE4LCAyMzQsIDExNywgMjAzLCAyOSwgMjMyLA0KKyAgICAgMTQ0LCAyMzgsIDIyLCAxNTAsIDIwMSwgMTE3LCA2MiwgMjA3LCAxNjQsIDEzLCAxMzcsIDI0NSwgMTI3LCA2NywgMjQ3LCAyOCwNCisgICAgIDE1NSwgNDMsIDIwMywgMTA3LCAyMzMsIDUzLCAxNDMsIDQ2fSwNCisgICAgezI0MiwgOTMsIDE2OSwgNTAsIDE0NCwgMjEwLCAzOSwgMTE4LCAyMDIsIDE4OCwgMjAxLCAxODksIDE0MywgMTA4LCAxOTYsIDM3LA0KKyAgICAgMTg1LCAxMTIsIDEzNCwgMjMwLCAyNDUsIDYzLCAxOTcsIDE5MCwgMjUwLCAxMDYsIDE4NSwgMjIxLCAxNzUsIDY0LCAxMTQsDQorICAgICA3MSwgMTYxLCA0NCwgMTQ3LCA2LCAyNywgMjE4LCA1MSwgNjMsIDg3LCAxMCwgNDAsIDEzMCwgMTg4LCAxNywgMTYzLCAzMSwNCisgICAgIDE3NiwgMTcwLCA0LCAxMDcsIDIzMiwgNywgOTQsIDE2NiwgMjI0LCAxMjQsIDg2LCA0NywgMTEsIDIwNH0sDQorICAgIHsyMjAsIDIyOCwgMTczLCA4OSwgMjUxLCAxNDksIDE1OSwgNTYsIDg5LCAzMywgMTQ3LCAyNDQsIDE1NCwgMzYsIDczLCAxMjcsDQorICAgICAyMTMsIDEzNiwgMjQ4LCAxODAsIDIzNCwgMTk3LCAxNTgsIDE3NywgNjgsIDEyMiwgOTMsIDIxMywgMTUsIDE2MCwgMjI3LA0KKyAgICAgMjM2LCA2NiwgMTM5LCAxNTMsIDE4NSwgMjAyLCAxNjcsIDE3OSwgMjUsIDIyMCwgMjMyLCA5NiwgMjEwLCAyMzEsIDEzNiwNCisgICAgIDIyMywgMjM5LCAxODEsIDI0MSwgNTksIDUyLCAxNzIsIDI1LCA0OSwgMjMyLCAyMTEsIDE4OSwgNjQsIDU0LCAxMDgsIDE1MywNCisgICAgIDEzMiwgNjMsIDk2LCAxMDMsIDgyLCAxODZ9fTsNCiBpbnQzMl90IENCQ19FcnJvckNvcnJlY3Rpb246Ok1PRFVMT19WQUxVRSA9IDB4MTJEOw0KIGludDMyX3QgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6TE9HWzI1Nl0gPSB7MH07DQogaW50MzJfdCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpBTE9HWzI1Nl0gPSB7MH07DQotdm9pZCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKCkNCi17DQotICAgIGludDMyX3QgcCA9IDE7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI1NTsgaSsrKSB7DQotICAgICAgICBBTE9HW2ldID0gcDsNCi0gICAgICAgIExPR1twXSA9IGk7DQotICAgICAgICBwIDw8PSAxOw0KLSAgICAgICAgaWYgKHAgPj0gMjU2KSB7DQotICAgICAgICAgICAgcCBePSBNT0RVTE9fVkFMVUU7DQotICAgICAgICB9DQordm9pZCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKCkgew0KKyAgaW50MzJfdCBwID0gMTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI1NTsgaSsrKSB7DQorICAgIEFMT0dbaV0gPSBwOw0KKyAgICBMT0dbcF0gPSBpOw0KKyAgICBwIDw8PSAxOw0KKyAgICBpZiAocCA+PSAyNTYpIHsNCisgICAgICBwIF49IE1PRFVMT19WQUxVRTsNCiAgICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENCQ19FcnJvckNvcnJlY3Rpb246OkZpbmFsaXplKCkNCi17DQotfQ0KLUNCQ19FcnJvckNvcnJlY3Rpb246OkNCQ19FcnJvckNvcnJlY3Rpb24oKQ0KLXsNCi19DQotQ0JDX0Vycm9yQ29ycmVjdGlvbjo6fkNCQ19FcnJvckNvcnJlY3Rpb24oKQ0KLXsNCi19DQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6ZW5jb2RlRUNDMjAwKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoY29kZXdvcmRzLkdldExlbmd0aCgpICE9IHN5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5KSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQotICAgICAgICByZXR1cm4gKEZYX1dDSEFSKikiIjsNCit2b2lkIENCQ19FcnJvckNvcnJlY3Rpb246OkZpbmFsaXplKCkge30NCitDQkNfRXJyb3JDb3JyZWN0aW9uOjpDQkNfRXJyb3JDb3JyZWN0aW9uKCkge30NCitDQkNfRXJyb3JDb3JyZWN0aW9uOjp+Q0JDX0Vycm9yQ29ycmVjdGlvbigpIHt9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6ZW5jb2RlRUNDMjAwKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjb2Rld29yZHMuR2V0TGVuZ3RoKCkgIT0gc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICByZXR1cm4gKEZYX1dDSEFSKikiIjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHNiOw0KKyAgc2IgKz0gY29kZXdvcmRzOw0KKyAgaW50MzJfdCBibG9ja0NvdW50ID0gc3ltYm9sSW5mby0+Z2V0SW50ZXJsZWF2ZWRCbG9ja0NvdW50KCk7DQorICBpZiAoYmxvY2tDb3VudCA9PSAxKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIGVjYyA9DQorICAgICAgICBjcmVhdGVFQ0NCbG9jayhjb2Rld29yZHMsIHN5bWJvbEluZm8tPm1fZXJyb3JDb2Rld29yZHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX1dDSEFSKikiIik7DQorICAgIHNiICs9IGVjYzsNCisgIH0gZWxzZSB7DQorICAgIENGWF9JbnQzMkFycmF5IGRhdGFTaXplczsNCisgICAgZGF0YVNpemVzLlNldFNpemUoYmxvY2tDb3VudCk7DQorICAgIENGWF9JbnQzMkFycmF5IGVycm9yU2l6ZXM7DQorICAgIGVycm9yU2l6ZXMuU2V0U2l6ZShibG9ja0NvdW50KTsNCisgICAgQ0ZYX0ludDMyQXJyYXkgc3RhcnRQb3M7DQorICAgIHN0YXJ0UG9zLlNldFNpemUoYmxvY2tDb3VudCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJsb2NrQ291bnQ7IGkrKykgew0KKyAgICAgIGRhdGFTaXplc1tpXSA9IHN5bWJvbEluZm8tPmdldERhdGFMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGkgKyAxKTsNCisgICAgICBlcnJvclNpemVzW2ldID0gc3ltYm9sSW5mby0+Z2V0RXJyb3JMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGkgKyAxKTsNCisgICAgICBzdGFydFBvc1tpXSA9IDA7DQorICAgICAgaWYgKGkgPiAwKSB7DQorICAgICAgICBzdGFydFBvc1tpXSA9IHN0YXJ0UG9zW2kgLSAxXSArIGRhdGFTaXplc1tpXTsNCisgICAgICB9DQogICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc2I7DQotICAgIHNiICs9IGNvZGV3b3JkczsNCi0gICAgaW50MzJfdCBibG9ja0NvdW50ID0gc3ltYm9sSW5mby0+Z2V0SW50ZXJsZWF2ZWRCbG9ja0NvdW50KCk7DQotICAgIGlmIChibG9ja0NvdW50ID09IDEpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIGVjYyA9IGNyZWF0ZUVDQ0Jsb2NrKGNvZGV3b3Jkcywgc3ltYm9sSW5mby0+bV9lcnJvckNvZGV3b3JkcywgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX1dDSEFSKikiIik7DQotICAgICAgICBzYiArPSBlY2M7DQorICAgIGZvciAoaW50MzJfdCBibG9jayA9IDA7IGJsb2NrIDwgYmxvY2tDb3VudDsgYmxvY2srKykgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHRlbXA7DQorICAgICAgZm9yIChpbnQzMl90IGQgPSBibG9jazsgZCA8IHN5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5OyBkICs9IGJsb2NrQ291bnQpIHsNCisgICAgICAgIHRlbXAgKz0gKEZYX1dDSEFSKWNvZGV3b3Jkcy5HZXRBdChkKTsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgZWNjID0gY3JlYXRlRUNDQmxvY2sodGVtcCwgZXJyb3JTaXplc1tibG9ja10sIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAoRlhfV0NIQVIqKSIiKTsNCisgICAgICBpbnQzMl90IHBvcyA9IDA7DQorICAgICAgZm9yIChpbnQzMl90IGwgPSBibG9jazsgbCA8IGVycm9yU2l6ZXNbYmxvY2tdICogYmxvY2tDb3VudDsNCisgICAgICAgICAgIGwgKz0gYmxvY2tDb3VudCkgew0KKyAgICAgICAgc2IuU2V0QXQoc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgKyBsLCBlY2MuR2V0QXQocG9zKyspKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBzYjsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6Y3JlYXRlRUNDQmxvY2soQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNXb3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICByZXR1cm4gY3JlYXRlRUNDQmxvY2soY29kZXdvcmRzLCAwLCBjb2Rld29yZHMuR2V0TGVuZ3RoKCksIG51bUVDV29yZHMsIGUpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfRXJyb3JDb3JyZWN0aW9uOjpjcmVhdGVFQ0NCbG9jayhDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUVDV29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCB0YWJsZSA9IC0xOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZW9mKEZBQ1RPUl9TRVRTKSAvIHNpemVvZihpbnQzMl90KTsgaSsrKSB7DQorICAgIGlmIChGQUNUT1JfU0VUU1tpXSA9PSBudW1FQ1dvcmRzKSB7DQorICAgICAgdGFibGUgPSBpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAodGFibGUgPCAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuIChGWF9XQ0hBUiopIiI7DQorICB9DQorICBGWF9XT1JEKiBlY2MgPSBGWF9BbGxvYyhGWF9XT1JELCBudW1FQ1dvcmRzKTsNCisgIEZYU1lTX21lbXNldChlY2MsIDAsIG51bUVDV29yZHMgKiBzaXplb2YoRlhfV09SRCkpOw0KKyAgZm9yIChpbnQzMl90IGwgPSBzdGFydDsgbCA8IHN0YXJ0ICsgbGVuOyBsKyspIHsNCisgICAgdWludDhfdCBBID0gKHVpbnQ4X3QpY29kZXdvcmRzLkdldEF0KGwpOw0KKyAgICBGWF9XT1JEIEIgPSBlY2NbbnVtRUNXb3JkcyAtIDFdOw0KKyAgICBGWF9XT1JEIG0gPSBlY2NbbnVtRUNXb3JkcyAtIDFdIF4gY29kZXdvcmRzLkdldEF0KGwpOw0KKyAgICBmb3IgKGludDMyX3QgayA9IG51bUVDV29yZHMgLSAxOyBrID4gMDsgay0tKSB7DQorICAgICAgaWYgKG0gIT0gMCAmJiBGQUNUT1JTW3RhYmxlXVtrXSAhPSAwKSB7DQorICAgICAgICBpbnQzMl90IGEgPSBMT0dbRkFDVE9SU1t0YWJsZV1ba11dOw0KKyAgICAgICAgaW50MzJfdCBiID0gQUxPR1soTE9HW21dICsgTE9HW0ZBQ1RPUlNbdGFibGVdW2tdXSkgJSAyNTVdOw0KKyAgICAgICAgRlhfV09SRCBjID0gZWNjW2sgLSAxXTsNCisgICAgICAgIEZYX1dPUkQgRCA9DQorICAgICAgICAgICAgKGVjY1trIC0gMV0gXiBBTE9HWyhMT0dbbV0gKyBMT0dbRkFDVE9SU1t0YWJsZV1ba11dKSAlIDI1NV0pOw0KKyAgICAgICAgZWNjW2tdID0gKEZYX1dPUkQpKGVjY1trIC0gMV0gXg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dbKExPR1ttXSArIExPR1tGQUNUT1JTW3RhYmxlXVtrXV0pICUgMjU1XSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGVjY1trXSA9IGVjY1trIC0gMV07DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtICE9IDAgJiYgRkFDVE9SU1t0YWJsZV1bMF0gIT0gMCkgew0KKyAgICAgIGVjY1swXSA9IChGWF9XT1JEKUFMT0dbKExPR1ttXSArIExPR1tGQUNUT1JTW3RhYmxlXVswXV0pICUgMjU1XTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9JbnQzMkFycmF5IGRhdGFTaXplczsNCi0gICAgICAgIGRhdGFTaXplcy5TZXRTaXplKGJsb2NrQ291bnQpOw0KLSAgICAgICAgQ0ZYX0ludDMyQXJyYXkgZXJyb3JTaXplczsNCi0gICAgICAgIGVycm9yU2l6ZXMuU2V0U2l6ZShibG9ja0NvdW50KTsNCi0gICAgICAgIENGWF9JbnQzMkFycmF5IHN0YXJ0UG9zOw0KLSAgICAgICAgc3RhcnRQb3MuU2V0U2l6ZShibG9ja0NvdW50KTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJsb2NrQ291bnQ7IGkrKykgew0KLSAgICAgICAgICAgIGRhdGFTaXplc1tpXSA9IHN5bWJvbEluZm8tPmdldERhdGFMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGkgKyAxKTsNCi0gICAgICAgICAgICBlcnJvclNpemVzW2ldID0gc3ltYm9sSW5mby0+Z2V0RXJyb3JMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGkgKyAxKTsNCi0gICAgICAgICAgICBzdGFydFBvc1tpXSA9IDA7DQotICAgICAgICAgICAgaWYgKGkgPiAwKSB7DQotICAgICAgICAgICAgICAgIHN0YXJ0UG9zW2ldID0gc3RhcnRQb3NbaSAtIDFdICsgZGF0YVNpemVzW2ldOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZvciAoaW50MzJfdCBibG9jayA9IDA7IGJsb2NrIDwgYmxvY2tDb3VudDsgYmxvY2srKykgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHRlbXA7DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGQgPSBibG9jazsgZCA8IHN5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5OyBkICs9IGJsb2NrQ291bnQpIHsNCi0gICAgICAgICAgICAgICAgdGVtcCArPSAoRlhfV0NIQVIpY29kZXdvcmRzLkdldEF0KGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBlY2MgPSBjcmVhdGVFQ0NCbG9jayh0ZW1wLCBlcnJvclNpemVzW2Jsb2NrXSwgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIChGWF9XQ0hBUiopIiIpOw0KLSAgICAgICAgICAgIGludDMyX3QgcG9zID0gMDsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgbCA9IGJsb2NrOyBsIDwgZXJyb3JTaXplc1tibG9ja10gKiBibG9ja0NvdW50OyBsICs9IGJsb2NrQ291bnQpIHsNCi0gICAgICAgICAgICAgICAgc2IuU2V0QXQoc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgKyBsLCBlY2MuR2V0QXQocG9zKyspKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICAgICAgZWNjWzBdID0gMDsNCiAgICAgfQ0KLSAgICByZXR1cm4gc2I7DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19FcnJvckNvcnJlY3Rpb246OmNyZWF0ZUVDQ0Jsb2NrKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywgaW50MzJfdCBudW1FQ1dvcmRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgcmV0dXJuIGNyZWF0ZUVDQ0Jsb2NrKGNvZGV3b3JkcywgMCwgY29kZXdvcmRzLkdldExlbmd0aCgpLCBudW1FQ1dvcmRzLCBlKTsNCi19DQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6Y3JlYXRlRUNDQmxvY2soQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLCBpbnQzMl90IHN0YXJ0LCBpbnQzMl90IGxlbiwgaW50MzJfdCBudW1FQ1dvcmRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCB0YWJsZSA9IC0xOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplb2YoRkFDVE9SX1NFVFMpIC8gc2l6ZW9mKGludDMyX3QpOyBpKyspIHsNCi0gICAgICAgIGlmIChGQUNUT1JfU0VUU1tpXSA9PSBudW1FQ1dvcmRzKSB7DQotICAgICAgICAgICAgdGFibGUgPSBpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmICh0YWJsZSA8IDApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCi0gICAgICAgIHJldHVybiAoRlhfV0NIQVIqKSIiOw0KLSAgICB9DQotICAgIEZYX1dPUkQqIGVjYyA9IEZYX0FsbG9jKEZYX1dPUkQsIG51bUVDV29yZHMpOw0KLSAgICBGWFNZU19tZW1zZXQoZWNjLCAwLCBudW1FQ1dvcmRzICogc2l6ZW9mKEZYX1dPUkQpKTsNCi0gICAgZm9yIChpbnQzMl90IGwgPSBzdGFydDsgbCA8IHN0YXJ0ICsgbGVuOyBsKyspIHsNCi0gICAgICAgIHVpbnQ4X3QgQSA9ICh1aW50OF90KWNvZGV3b3Jkcy5HZXRBdChsKTsNCi0gICAgICAgIEZYX1dPUkQgQiA9IGVjY1tudW1FQ1dvcmRzIC0gMV07DQotICAgICAgICBGWF9XT1JEIG0gPSBlY2NbbnVtRUNXb3JkcyAtIDFdIF4gY29kZXdvcmRzLkdldEF0KGwpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGsgPSBudW1FQ1dvcmRzIC0gMTsgayA+IDA7IGstLSkgew0KLSAgICAgICAgICAgIGlmIChtICE9IDAgJiYgRkFDVE9SU1t0YWJsZV1ba10gIT0gMCkgew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGEgPSBMT0dbRkFDVE9SU1t0YWJsZV1ba11dOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGIgPSBBTE9HWyhMT0dbbV0gKyBMT0dbRkFDVE9SU1t0YWJsZV1ba11dKSAlIDI1NV07DQotICAgICAgICAgICAgICAgIEZYX1dPUkQgYyA9IGVjY1trIC0gMV07DQotICAgICAgICAgICAgICAgIEZYX1dPUkQgRCA9IChlY2NbayAtIDFdIF4gQUxPR1soTE9HW21dICsgTE9HW0ZBQ1RPUlNbdGFibGVdW2tdXSkgJSAyNTVdKTsNCi0gICAgICAgICAgICAgICAgZWNjW2tdID0gKEZYX1dPUkQgKSAoZWNjW2sgLSAxXSBeIEFMT0dbKExPR1ttXSArIExPR1tGQUNUT1JTW3RhYmxlXVtrXV0pICUgMjU1XSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZWNjW2tdID0gZWNjW2sgLSAxXTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAobSAhPSAwICYmIEZBQ1RPUlNbdGFibGVdWzBdICE9IDApIHsNCi0gICAgICAgICAgICBlY2NbMF0gPSAoRlhfV09SRCkgQUxPR1soTE9HW21dICsgTE9HW0ZBQ1RPUlNbdGFibGVdWzBdXSkgJSAyNTVdOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBlY2NbMF0gPSAwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHN0cmVjYzsNCi0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtRUNXb3JkczsgaisrKSB7DQotICAgICAgICBzdHJlY2MgKz0gKEZYX1dDSEFSKWVjY1tudW1FQ1dvcmRzIC0gaiAtIDFdOw0KLSAgICB9DQotICAgIEZYX0ZyZWUoZWNjKTsNCi0gICAgcmV0dXJuIHN0cmVjYzsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHN0cmVjYzsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG51bUVDV29yZHM7IGorKykgew0KKyAgICBzdHJlY2MgKz0gKEZYX1dDSEFSKWVjY1tudW1FQ1dvcmRzIC0gaiAtIDFdOw0KKyAgfQ0KKyAgRlhfRnJlZShlY2MpOw0KKyAgcmV0dXJuIHN0cmVjYzsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FcnJvckNvcnJlY3Rpb24uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmgKaW5kZXggMmVjN2IyNy4uNGY4YWNjMSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FcnJvckNvcnJlY3Rpb24uaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5oCkBAIC03LDIyICs3LDMxIEBACiAjaWZuZGVmIF9CQ19FUlJPUkNPUlJFQ1RJT05fSF8NCiAjZGVmaW5lIF9CQ19FUlJPUkNPUlJFQ1RJT05fSF8NCiBjbGFzcyBDQkNfU3ltYm9sSW5mbzsNCi1jbGFzcyBDQkNfRXJyb3JDb3JyZWN0aW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0Vycm9yQ29ycmVjdGlvbigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfRXJyb3JDb3JyZWN0aW9uKCk7DQotICAgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCi0gICAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCi0gICAgc3RhdGljIENGWF9XaWRlU3RyaW5nIGVuY29kZUVDQzIwMChDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsIENCQ19TeW1ib2xJbmZvKiBzeW1ib2xJbmZvLCBpbnQzMl90ICZlKTsNCi1wcml2YXRlOg0KLSAgICBzdGF0aWMgaW50MzJfdCBGQUNUT1JfU0VUU1tdOw0KLSAgICBzdGF0aWMgaW50MzJfdCBGQUNUT1JTW11bMTAwXTsNCi0gICAgc3RhdGljIGludDMyX3QgTU9EVUxPX1ZBTFVFOw0KLSAgICBzdGF0aWMgaW50MzJfdCBMT0dbMjU2XTsNCi0gICAgc3RhdGljIGludDMyX3QgQUxPR1syNTZdOw0KLXByaXZhdGU6DQotICAgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBjcmVhdGVFQ0NCbG9jayhDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsIGludDMyX3QgbnVtRUNXb3JkcywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBjcmVhdGVFQ0NCbG9jayhDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsIGludDMyX3Qgc3RhcnQsIGludDMyX3QgbGVuLCBpbnQzMl90IG51bUVDV29yZHMsIGludDMyX3QgJmUpOw0KK2NsYXNzIENCQ19FcnJvckNvcnJlY3Rpb24gew0KKyBwdWJsaWM6DQorICBDQkNfRXJyb3JDb3JyZWN0aW9uKCk7DQorICB2aXJ0dWFsIH5DQkNfRXJyb3JDb3JyZWN0aW9uKCk7DQorICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQorICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KKyAgc3RhdGljIENGWF9XaWRlU3RyaW5nIGVuY29kZUVDQzIwMChDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19TeW1ib2xJbmZvKiBzeW1ib2xJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBpbnQzMl90IEZBQ1RPUl9TRVRTW107DQorICBzdGF0aWMgaW50MzJfdCBGQUNUT1JTW11bMTAwXTsNCisgIHN0YXRpYyBpbnQzMl90IE1PRFVMT19WQUxVRTsNCisgIHN0YXRpYyBpbnQzMl90IExPR1syNTZdOw0KKyAgc3RhdGljIGludDMyX3QgQUxPR1syNTZdOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIENGWF9XaWRlU3RyaW5nIGNyZWF0ZUVDQ0Jsb2NrKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUVDV29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgY3JlYXRlRUNDQmxvY2soQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1FQ1dvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5jcHAKaW5kZXggM2FkZWQyZC4uOTg2ZDZiMiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuY3BwCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSAiQkNfQmFzZTI1NkVuY29kZXIuaCINCiAjaW5jbHVkZSAiQkNfQVNDSUlFbmNvZGVyLmgiDQogI2luY2x1ZGUgIkJDX0hpZ2hMZXZlbEVuY29kZXIuaCINCi0jZGVmaW5lICBJbnRlZ2VyX01BWF9WQUxVRSAgIDIxNDc0ODM2NDcNCisjZGVmaW5lIEludGVnZXJfTUFYX1ZBTFVFIDIxNDc0ODM2NDcNCiBGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQzQwID0gMjMwOw0KIEZYX1dDSEFSIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19CQVNFMjU2ID0gMjMxOw0KIEZYX1dDSEFSIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpVUFBFUl9TSElGVCA9IDIzNTsNCkBAIC01MCwzMTkgKzUwLDMyMiBAQAogY29uc3Qgd2NoYXJfdCogQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Ok1BQ1JPXzA1X0hFQURFUiA9IEwiWyk+HjA1IjsNCiBjb25zdCB3Y2hhcl90KiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TUFDUk9fMDZfSEVBREVSID0gTCJbKT4eMDYiOw0KIGNvbnN0IHdjaGFyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Ok1BQ1JPX1RSQUlMRVIgPSAweDAwMDQ7DQotQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkNCQ19IaWdoTGV2ZWxFbmNvZGVyKCkNCi17DQorQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkNCQ19IaWdoTGV2ZWxFbmNvZGVyKCkge30NCitDQkNfSGlnaExldmVsRW5jb2Rlcjo6fkNCQ19IaWdoTGV2ZWxFbmNvZGVyKCkge30NCitDRlhfQnl0ZUFycmF5JiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6Z2V0Qnl0ZXNGb3JNZXNzYWdlKENGWF9XaWRlU3RyaW5nIG1zZykgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZXN0cjsNCisgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChtc2csIGJ5dGVzdHIpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYnl0ZXN0ci5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIG1fYnl0ZWFycmF5LkFkZChieXRlc3RyLkdldEF0KGkpKTsNCisgIH0NCisgIHJldHVybiBtX2J5dGVhcnJheTsNCiB9DQotQ0JDX0hpZ2hMZXZlbEVuY29kZXI6On5DQkNfSGlnaExldmVsRW5jb2RlcigpDQotew0KK0NGWF9XaWRlU3RyaW5nIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVIaWdoTGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIHJldHVybiBlbmNvZGVIaWdoTGV2ZWwobXNnLCBlY0xldmVsLCBGT1JDRV9OT05FLCBOVUxMLCBOVUxMLCBlKTsNCiB9DQotQ0ZYX0J5dGVBcnJheSYgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmdldEJ5dGVzRm9yTWVzc2FnZShDRlhfV2lkZVN0cmluZyBtc2cpDQotew0KLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyOw0KLSAgICBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlVuaWNvZGVUb1VURjgobXNnLCBieXRlc3RyKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYnl0ZXN0ci5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICBtX2J5dGVhcnJheS5BZGQoYnl0ZXN0ci5HZXRBdChpKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fYnl0ZWFycmF5Ow0KLX0NCi1DRlhfV2lkZVN0cmluZyBDQkNfSGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlSGlnaExldmVsKENGWF9XaWRlU3RyaW5nIG1zZywgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwgaW50MzJfdCAmZSkNCi17DQotICAgIHJldHVybiBlbmNvZGVIaWdoTGV2ZWwobXNnLCBlY0xldmVsLCBGT1JDRV9OT05FLCBOVUxMLCBOVUxMLCBlKTsNCi19DQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUhpZ2hMZXZlbChDRlhfV2lkZVN0cmluZyBtc2csICBDRlhfV2lkZVN0cmluZyBlY0xldmVsLCBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsIENCQ19EaW1lbnNpb24qIG1pblNpemUsIENCQ19EaW1lbnNpb24qIG1heFNpemUsIGludDMyX3QgJmUpDQotew0KLSAgICBDQkNfRW5jb2RlckNvbnRleHQgY29udGV4dChtc2csIGVjTGV2ZWwsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX1dDSEFSKikiIik7DQotICAgIGNvbnRleHQuc2V0U3ltYm9sU2hhcGUoc2hhcGUpOw0KLSAgICBjb250ZXh0LnNldFNpemVDb25zdHJhaW50cyhtaW5TaXplLCBtYXhTaXplKTsNCi0gICAgaWYgKChtc2cuTWlkKDAsIDYpID09IE1BQ1JPXzA1X0hFQURFUikgJiYgKG1zZy5NaWQobXNnLkdldExlbmd0aCgpIC0gMSwgMSkgPT0gTUFDUk9fVFJBSUxFUikpIHsNCi0gICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChNQUNST18wNSk7DQotICAgICAgICBjb250ZXh0LnNldFNraXBBdEVuZCgyKTsNCi0gICAgICAgIGNvbnRleHQubV9wb3MgKz0gNjsNCi0gICAgfSBlbHNlIGlmICgobXNnLk1pZCgwLCA2KSA9PSBNQUNST18wNl9IRUFERVIpICYmIChtc2cuTWlkKG1zZy5HZXRMZW5ndGgoKSAtIDEsIDEpID09IE1BQ1JPX1RSQUlMRVIpKSB7DQotICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoTUFDUk9fMDYpOw0KLSAgICAgICAgY29udGV4dC5zZXRTa2lwQXRFbmQoMik7DQotICAgICAgICBjb250ZXh0Lm1fcG9zICs9IDY7DQotICAgIH0NCi0gICAgQ0ZYX1B0ckFycmF5IGVuY29kZXJzOw0KLSAgICBlbmNvZGVycy5BZGQoRlhfTkVXIENCQ19BU0NJSUVuY29kZXIoKSk7DQotICAgIGVuY29kZXJzLkFkZChGWF9ORVcgQ0JDX0M0MEVuY29kZXIoKSk7DQotICAgIGVuY29kZXJzLkFkZChGWF9ORVcgQ0JDX1RleHRFbmNvZGVyKCkpOw0KLSAgICBlbmNvZGVycy5BZGQoRlhfTkVXIENCQ19YMTJFbmNvZGVyKCkpOw0KLSAgICBlbmNvZGVycy5BZGQoRlhfTkVXIENCQ19FZGlmYWN0RW5jb2RlcigpKTsNCi0gICAgZW5jb2RlcnMuQWRkKEZYX05FVyBDQkNfQmFzZTI1NkVuY29kZXIoKSk7DQotICAgIGludDMyX3QgZW5jb2RpbmdNb2RlID0gQVNDSUlfRU5DT0RBVElPTjsNCi0gICAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KLSAgICAgICAgKChDQkNfRW5jb2RlciopZW5jb2RlcnMuR2V0QXQoZW5jb2RpbmdNb2RlKSktPkVuY29kZShjb250ZXh0LCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBlbmNvZGVycy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICBkZWxldGUgKENCQ19FbmNvZGVyKillbmNvZGVycy5HZXRBdChpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZW5jb2RlcnMuUmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgcmV0dXJuIChGWF9XQ0hBUiopIiI7DQotICAgICAgICB9DQotICAgICAgICBpZiAoY29udGV4dC5tX25ld0VuY29kaW5nID49IDApIHsNCi0gICAgICAgICAgICBlbmNvZGluZ01vZGUgPSBjb250ZXh0Lm1fbmV3RW5jb2Rpbmc7DQotICAgICAgICAgICAgY29udGV4dC5yZXNldEVuY29kZXJTaWduYWwoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpbnQzMl90IGxlbiA9IGNvbnRleHQubV9jb2Rld29yZHMuR2V0TGVuZ3RoKCk7DQotICAgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhlKTsNCitDRlhfV2lkZVN0cmluZyBDQkNfSGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlSGlnaExldmVsKENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfRGltZW5zaW9uKiBtaW5TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19FbmNvZGVyQ29udGV4dCBjb250ZXh0KG1zZywgZWNMZXZlbCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX1dDSEFSKikiIik7DQorICBjb250ZXh0LnNldFN5bWJvbFNoYXBlKHNoYXBlKTsNCisgIGNvbnRleHQuc2V0U2l6ZUNvbnN0cmFpbnRzKG1pblNpemUsIG1heFNpemUpOw0KKyAgaWYgKChtc2cuTWlkKDAsIDYpID09IE1BQ1JPXzA1X0hFQURFUikgJiYNCisgICAgICAobXNnLk1pZChtc2cuR2V0TGVuZ3RoKCkgLSAxLCAxKSA9PSBNQUNST19UUkFJTEVSKSkgew0KKyAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoTUFDUk9fMDUpOw0KKyAgICBjb250ZXh0LnNldFNraXBBdEVuZCgyKTsNCisgICAgY29udGV4dC5tX3BvcyArPSA2Ow0KKyAgfSBlbHNlIGlmICgobXNnLk1pZCgwLCA2KSA9PSBNQUNST18wNl9IRUFERVIpICYmDQorICAgICAgICAgICAgIChtc2cuTWlkKG1zZy5HZXRMZW5ndGgoKSAtIDEsIDEpID09IE1BQ1JPX1RSQUlMRVIpKSB7DQorICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChNQUNST18wNik7DQorICAgIGNvbnRleHQuc2V0U2tpcEF0RW5kKDIpOw0KKyAgICBjb250ZXh0Lm1fcG9zICs9IDY7DQorICB9DQorICBDRlhfUHRyQXJyYXkgZW5jb2RlcnM7DQorICBlbmNvZGVycy5BZGQoRlhfTkVXIENCQ19BU0NJSUVuY29kZXIoKSk7DQorICBlbmNvZGVycy5BZGQoRlhfTkVXIENCQ19DNDBFbmNvZGVyKCkpOw0KKyAgZW5jb2RlcnMuQWRkKEZYX05FVyBDQkNfVGV4dEVuY29kZXIoKSk7DQorICBlbmNvZGVycy5BZGQoRlhfTkVXIENCQ19YMTJFbmNvZGVyKCkpOw0KKyAgZW5jb2RlcnMuQWRkKEZYX05FVyBDQkNfRWRpZmFjdEVuY29kZXIoKSk7DQorICBlbmNvZGVycy5BZGQoRlhfTkVXIENCQ19CYXNlMjU2RW5jb2RlcigpKTsNCisgIGludDMyX3QgZW5jb2RpbmdNb2RlID0gQVNDSUlfRU5DT0RBVElPTjsNCisgIHdoaWxlIChjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsNCisgICAgKChDQkNfRW5jb2RlciopZW5jb2RlcnMuR2V0QXQoZW5jb2RpbmdNb2RlKSktPkVuY29kZShjb250ZXh0LCBlKTsNCiAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZW5jb2RlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBkZWxldGUgKENCQ19FbmNvZGVyKillbmNvZGVycy5HZXRBdChpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVuY29kZXJzLlJlbW92ZUFsbCgpOw0KLSAgICAgICAgcmV0dXJuIChGWF9XQ0hBUiopIiI7DQotICAgIH0NCi0gICAgaW50MzJfdCBjYXBhY2l0eSA9IGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eTsNCi0gICAgaWYgKGxlbiA8IGNhcGFjaXR5KSB7DQotICAgICAgICBpZiAoZW5jb2RpbmdNb2RlICE9IEFTQ0lJX0VOQ09EQVRJT04gJiYgZW5jb2RpbmdNb2RlICE9IEJBU0UyNTZfRU5DT0RBVElPTikgew0KLSAgICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZCgweDAwZmUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcyA9IGNvbnRleHQubV9jb2Rld29yZHM7DQotICAgIGlmIChjb2Rld29yZHMuR2V0TGVuZ3RoKCkgPCBjYXBhY2l0eSkgew0KLSAgICAgICAgY29kZXdvcmRzICs9IFBBRDsNCi0gICAgfQ0KLSAgICB3aGlsZSAoY29kZXdvcmRzLkdldExlbmd0aCgpIDwgY2FwYWNpdHkpIHsNCi0gICAgICAgIGNvZGV3b3JkcyArPSAocmFuZG9taXplMjUzU3RhdGUoUEFELCBjb2Rld29yZHMuR2V0TGVuZ3RoKCkgKyAxKSk7DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZW5jb2RlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBlbmNvZGVycy5HZXRTaXplKCk7IGkrKykgew0KICAgICAgICAgZGVsZXRlIChDQkNfRW5jb2RlciopZW5jb2RlcnMuR2V0QXQoaSk7DQorICAgICAgfQ0KKyAgICAgIGVuY29kZXJzLlJlbW92ZUFsbCgpOw0KKyAgICAgIHJldHVybiAoRlhfV0NIQVIqKSIiOw0KKyAgICB9DQorICAgIGlmIChjb250ZXh0Lm1fbmV3RW5jb2RpbmcgPj0gMCkgew0KKyAgICAgIGVuY29kaW5nTW9kZSA9IGNvbnRleHQubV9uZXdFbmNvZGluZzsNCisgICAgICBjb250ZXh0LnJlc2V0RW5jb2RlclNpZ25hbCgpOw0KKyAgICB9DQorICB9DQorICBpbnQzMl90IGxlbiA9IGNvbnRleHQubV9jb2Rld29yZHMuR2V0TGVuZ3RoKCk7DQorICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGVuY29kZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgZGVsZXRlIChDQkNfRW5jb2RlciopZW5jb2RlcnMuR2V0QXQoaSk7DQogICAgIH0NCiAgICAgZW5jb2RlcnMuUmVtb3ZlQWxsKCk7DQotICAgIHJldHVybiBjb2Rld29yZHM7DQotfQ0KLWludDMyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Omxvb2tBaGVhZFRlc3QoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBpbnQzMl90IHN0YXJ0cG9zLCBpbnQzMl90IGN1cnJlbnRNb2RlKQ0KLXsNCi0gICAgaWYgKHN0YXJ0cG9zID49IG1zZy5HZXRMZW5ndGgoKSkgew0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRNb2RlOw0KKyAgICByZXR1cm4gKEZYX1dDSEFSKikiIjsNCisgIH0NCisgIGludDMyX3QgY2FwYWNpdHkgPSBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHk7DQorICBpZiAobGVuIDwgY2FwYWNpdHkpIHsNCisgICAgaWYgKGVuY29kaW5nTW9kZSAhPSBBU0NJSV9FTkNPREFUSU9OICYmDQorICAgICAgICBlbmNvZGluZ01vZGUgIT0gQkFTRTI1Nl9FTkNPREFUSU9OKSB7DQorICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKDB4MDBmZSk7DQogICAgIH0NCi0gICAgQ0ZYX0Zsb2F0QXJyYXkgY2hhckNvdW50czsNCi0gICAgaWYgKGN1cnJlbnRNb2RlID09IEFTQ0lJX0VOQ09EQVRJT04pIHsNCi0gICAgICAgIGNoYXJDb3VudHMuQWRkKDApOw0KLSAgICAgICAgY2hhckNvdW50cy5BZGQoMSk7DQotICAgICAgICBjaGFyQ291bnRzLkFkZCgxKTsNCi0gICAgICAgIGNoYXJDb3VudHMuQWRkKDEpOw0KLSAgICAgICAgY2hhckNvdW50cy5BZGQoMSk7DQotICAgICAgICBjaGFyQ291bnRzLkFkZCgxLjI1Zik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMgPSBjb250ZXh0Lm1fY29kZXdvcmRzOw0KKyAgaWYgKGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSA8IGNhcGFjaXR5KSB7DQorICAgIGNvZGV3b3JkcyArPSBQQUQ7DQorICB9DQorICB3aGlsZSAoY29kZXdvcmRzLkdldExlbmd0aCgpIDwgY2FwYWNpdHkpIHsNCisgICAgY29kZXdvcmRzICs9IChyYW5kb21pemUyNTNTdGF0ZShQQUQsIGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSArIDEpKTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGVuY29kZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIGRlbGV0ZSAoQ0JDX0VuY29kZXIqKWVuY29kZXJzLkdldEF0KGkpOw0KKyAgfQ0KKyAgZW5jb2RlcnMuUmVtb3ZlQWxsKCk7DQorICByZXR1cm4gY29kZXdvcmRzOw0KK30NCitpbnQzMl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpsb29rQWhlYWRUZXN0KENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGN1cnJlbnRNb2RlKSB7DQorICBpZiAoc3RhcnRwb3MgPj0gbXNnLkdldExlbmd0aCgpKSB7DQorICAgIHJldHVybiBjdXJyZW50TW9kZTsNCisgIH0NCisgIENGWF9GbG9hdEFycmF5IGNoYXJDb3VudHM7DQorICBpZiAoY3VycmVudE1vZGUgPT0gQVNDSUlfRU5DT0RBVElPTikgew0KKyAgICBjaGFyQ291bnRzLkFkZCgwKTsNCisgICAgY2hhckNvdW50cy5BZGQoMSk7DQorICAgIGNoYXJDb3VudHMuQWRkKDEpOw0KKyAgICBjaGFyQ291bnRzLkFkZCgxKTsNCisgICAgY2hhckNvdW50cy5BZGQoMSk7DQorICAgIGNoYXJDb3VudHMuQWRkKDEuMjVmKTsNCisgIH0gZWxzZSB7DQorICAgIGNoYXJDb3VudHMuQWRkKDEpOw0KKyAgICBjaGFyQ291bnRzLkFkZCgyKTsNCisgICAgY2hhckNvdW50cy5BZGQoMik7DQorICAgIGNoYXJDb3VudHMuQWRkKDIpOw0KKyAgICBjaGFyQ291bnRzLkFkZCgyKTsNCisgICAgY2hhckNvdW50cy5BZGQoMi4yNWYpOw0KKyAgICBjaGFyQ291bnRzW2N1cnJlbnRNb2RlXSA9IDA7DQorICB9DQorICBpbnQzMl90IGNoYXJzUHJvY2Vzc2VkID0gMDsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGlmICgoc3RhcnRwb3MgKyBjaGFyc1Byb2Nlc3NlZCkgPT0gbXNnLkdldExlbmd0aCgpKSB7DQorICAgICAgRlhfRFdPUkQgbWluID0gSW50ZWdlcl9NQVhfVkFMVUU7DQorICAgICAgQ0ZYX0J5dGVBcnJheSBtaW5zOw0KKyAgICAgIG1pbnMuU2V0U2l6ZSg2KTsNCisgICAgICBDRlhfSW50MzJBcnJheSBpbnRDaGFyQ291bnRzOw0KKyAgICAgIGludENoYXJDb3VudHMuU2V0U2l6ZSg2KTsNCisgICAgICBtaW4gPSBmaW5kTWluaW11bXMoY2hhckNvdW50cywgaW50Q2hhckNvdW50cywgbWluLCBtaW5zKTsNCisgICAgICBpbnQzMl90IG1pbkNvdW50ID0gZ2V0TWluaW11bUNvdW50KG1pbnMpOw0KKyAgICAgIGlmIChpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dID09IG1pbikgew0KKyAgICAgICAgcmV0dXJuIEFTQ0lJX0VOQ09EQVRJT047DQorICAgICAgfQ0KKyAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbQkFTRTI1Nl9FTkNPREFUSU9OXSA+IDApIHsNCisgICAgICAgIHJldHVybiBCQVNFMjU2X0VOQ09EQVRJT047DQorICAgICAgfQ0KKyAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbRURJRkFDVF9FTkNPREFUSU9OXSA+IDApIHsNCisgICAgICAgIHJldHVybiBFRElGQUNUX0VOQ09EQVRJT047DQorICAgICAgfQ0KKyAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbVEVYVF9FTkNPREFUSU9OXSA+IDApIHsNCisgICAgICAgIHJldHVybiBURVhUX0VOQ09EQVRJT047DQorICAgICAgfQ0KKyAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbWDEyX0VOQ09EQVRJT05dID4gMCkgew0KKyAgICAgICAgcmV0dXJuIFgxMl9FTkNPREFUSU9OOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gQzQwX0VOQ09EQVRJT047DQorICAgIH0NCisgICAgRlhfV0NIQVIgYyA9IG1zZy5HZXRBdChzdGFydHBvcyArIGNoYXJzUHJvY2Vzc2VkKTsNCisgICAgY2hhcnNQcm9jZXNzZWQrKzsNCisgICAgaWYgKGlzRGlnaXQoYykpIHsNCisgICAgICBjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dICs9IDAuNTsNCisgICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsNCisgICAgICBjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dID0NCisgICAgICAgICAgKEZYX0ZMT0FUKWNlaWwoY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSk7DQorICAgICAgY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSArPSAyOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgY2hhckNvdW50cy5BZGQoMSk7DQotICAgICAgICBjaGFyQ291bnRzLkFkZCgyKTsNCi0gICAgICAgIGNoYXJDb3VudHMuQWRkKDIpOw0KLSAgICAgICAgY2hhckNvdW50cy5BZGQoMik7DQotICAgICAgICBjaGFyQ291bnRzLkFkZCgyKTsNCi0gICAgICAgIGNoYXJDb3VudHMuQWRkKDIuMjVmKTsNCi0gICAgICAgIGNoYXJDb3VudHNbY3VycmVudE1vZGVdID0gMDsNCisgICAgICBjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dID0NCisgICAgICAgICAgKEZYX0ZMT0FUKWNlaWwoY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSk7DQorICAgICAgY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSsrOw0KICAgICB9DQotICAgIGludDMyX3QgY2hhcnNQcm9jZXNzZWQgPSAwOw0KLSAgICB3aGlsZSAoVFJVRSkgew0KLSAgICAgICAgaWYgKChzdGFydHBvcyArIGNoYXJzUHJvY2Vzc2VkKSA9PSBtc2cuR2V0TGVuZ3RoKCkpIHsNCi0gICAgICAgICAgICBGWF9EV09SRCBtaW4gPSBJbnRlZ2VyX01BWF9WQUxVRTsNCi0gICAgICAgICAgICBDRlhfQnl0ZUFycmF5IG1pbnM7DQotICAgICAgICAgICAgbWlucy5TZXRTaXplKDYpOw0KLSAgICAgICAgICAgIENGWF9JbnQzMkFycmF5IGludENoYXJDb3VudHM7DQotICAgICAgICAgICAgaW50Q2hhckNvdW50cy5TZXRTaXplKDYpOw0KLSAgICAgICAgICAgIG1pbiA9IGZpbmRNaW5pbXVtcyhjaGFyQ291bnRzLCBpbnRDaGFyQ291bnRzLCBtaW4sIG1pbnMpOw0KLSAgICAgICAgICAgIGludDMyX3QgbWluQ291bnQgPSBnZXRNaW5pbXVtQ291bnQobWlucyk7DQotICAgICAgICAgICAgaWYgKGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPT0gbWluKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBBU0NJSV9FTkNPREFUSU9OOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAobWluQ291bnQgPT0gMSAmJiBtaW5zW0JBU0UyNTZfRU5DT0RBVElPTl0gPiAwKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBCQVNFMjU2X0VOQ09EQVRJT047DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbRURJRkFDVF9FTkNPREFUSU9OXSA+IDApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVESUZBQ1RfRU5DT0RBVElPTjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tURVhUX0VOQ09EQVRJT05dID4gMCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVEVYVF9FTkNPREFUSU9OOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAobWluQ291bnQgPT0gMSAmJiBtaW5zW1gxMl9FTkNPREFUSU9OXSA+IDApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFgxMl9FTkNPREFUSU9OOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gQzQwX0VOQ09EQVRJT047DQotICAgICAgICB9DQotICAgICAgICBGWF9XQ0hBUiBjID0gbXNnLkdldEF0KHN0YXJ0cG9zICsgY2hhcnNQcm9jZXNzZWQpOw0KLSAgICAgICAgY2hhcnNQcm9jZXNzZWQrKzsNCi0gICAgICAgIGlmIChpc0RpZ2l0KGMpKSB7DQotICAgICAgICAgICAgY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSArPSAwLjU7DQotICAgICAgICB9IGVsc2UgaWYgKGlzRXh0ZW5kZWRBU0NJSShjKSkgew0KLSAgICAgICAgICAgIGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPSAoRlhfRkxPQVQpIGNlaWwoY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSk7DQotICAgICAgICAgICAgY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSArPSAyOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dID0gKEZYX0ZMT0FUKSBjZWlsKGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0pOw0KLSAgICAgICAgICAgIGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0rKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpc05hdGl2ZUM0MChjKSkgew0KLSAgICAgICAgICAgIGNoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dICs9IDIuMGYgLyAzLjBmOw0KLSAgICAgICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsNCi0gICAgICAgICAgICBjaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArPSA4LjBmIC8gMy4wZjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgY2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKz0gNC4wZiAvIDMuMGY7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaXNOYXRpdmVUZXh0KGMpKSB7DQotICAgICAgICAgICAgY2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dICs9IDIuMGYgLyAzLjBmOw0KLSAgICAgICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsNCi0gICAgICAgICAgICBjaGFyQ291bnRzW1RFWFRfRU5DT0RBVElPTl0gKz0gOC4wZiAvIDMuMGY7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGNoYXJDb3VudHNbVEVYVF9FTkNPREFUSU9OXSArPSA0LjBmIC8gMy4wZjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpc05hdGl2ZVgxMihjKSkgew0KLSAgICAgICAgICAgIGNoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dICs9IDIuMGYgLyAzLjBmOw0KLSAgICAgICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsNCi0gICAgICAgICAgICBjaGFyQ291bnRzW1gxMl9FTkNPREFUSU9OXSArPSAxMy4wZiAvIDMuMGY7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGNoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dICs9IDEwLjBmIC8gMy4wZjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpc05hdGl2ZUVESUZBQ1QoYykpIHsNCi0gICAgICAgICAgICBjaGFyQ291bnRzW0VESUZBQ1RfRU5DT0RBVElPTl0gKz0gMy4wZiAvIDQuMGY7DQotICAgICAgICB9IGVsc2UgaWYgKGlzRXh0ZW5kZWRBU0NJSShjKSkgew0KLSAgICAgICAgICAgIGNoYXJDb3VudHNbRURJRkFDVF9FTkNPREFUSU9OXSArPSAxNy4wZiAvIDQuMGY7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGNoYXJDb3VudHNbRURJRkFDVF9FTkNPREFUSU9OXSArPSAxMy4wZiAvIDQuMGY7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaXNTcGVjaWFsQjI1NihjKSkgew0KLSAgICAgICAgICAgIGNoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXSArPSA0Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBjaGFyQ291bnRzW0JBU0UyNTZfRU5DT0RBVElPTl0rKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChjaGFyc1Byb2Nlc3NlZCA+PSA0KSB7DQotICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkgaW50Q2hhckNvdW50czsNCi0gICAgICAgICAgICBpbnRDaGFyQ291bnRzLlNldFNpemUoNik7DQotICAgICAgICAgICAgQ0ZYX0J5dGVBcnJheSBtaW5zOw0KLSAgICAgICAgICAgIG1pbnMuU2V0U2l6ZSg2KTsNCi0gICAgICAgICAgICBmaW5kTWluaW11bXMoY2hhckNvdW50cywgaW50Q2hhckNvdW50cywgSW50ZWdlcl9NQVhfVkFMVUUsIG1pbnMpOw0KLSAgICAgICAgICAgIGludDMyX3QgbWluQ291bnQgPSBnZXRNaW5pbXVtQ291bnQobWlucyk7DQotICAgICAgICAgICAgaWYgKGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW0JBU0UyNTZfRU5DT0RBVElPTl0NCi0gICAgICAgICAgICAgICAgICAgICYmIGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXQ0KLSAgICAgICAgICAgICAgICAgICAgJiYgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbVEVYVF9FTkNPREFUSU9OXQ0KLSAgICAgICAgICAgICAgICAgICAgJiYgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dDQotICAgICAgICAgICAgICAgICAgICAmJiBpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dIDwgaW50Q2hhckNvdW50c1tFRElGQUNUX0VOQ09EQVRJT05dKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBBU0NJSV9FTkNPREFUSU9OOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoaW50Q2hhckNvdW50c1tCQVNFMjU2X0VOQ09EQVRJT05dIDwgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXQ0KLSAgICAgICAgICAgICAgICAgICAgfHwgKG1pbnNbQzQwX0VOQ09EQVRJT05dICsgbWluc1tURVhUX0VOQ09EQVRJT05dICsgbWluc1tYMTJfRU5DT0RBVElPTl0gKyBtaW5zW0VESUZBQ1RfRU5DT0RBVElPTl0pID09IDApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJBU0UyNTZfRU5DT0RBVElPTjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tFRElGQUNUX0VOQ09EQVRJT05dID4gMCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRURJRkFDVF9FTkNPREFUSU9OOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAobWluQ291bnQgPT0gMSAmJiBtaW5zW1RFWFRfRU5DT0RBVElPTl0gPiAwKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBURVhUX0VOQ09EQVRJT047DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbWDEyX0VOQ09EQVRJT05dID4gMCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gWDEyX0VOQ09EQVRJT047DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArIDEgPCBpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dDQotICAgICAgICAgICAgICAgICAgICAmJiBpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArIDEgPCBpbnRDaGFyQ291bnRzW0JBU0UyNTZfRU5DT0RBVElPTl0NCi0gICAgICAgICAgICAgICAgICAgICYmIGludENoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dICsgMSA8IGludENoYXJDb3VudHNbRURJRkFDVF9FTkNPREFUSU9OXQ0KLSAgICAgICAgICAgICAgICAgICAgJiYgaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwgaW50Q2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dKSB7DQotICAgICAgICAgICAgICAgIGlmIChpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzQwX0VOQ09EQVRJT047DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGludENoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dID09IGludENoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dKSB7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHAgPSBzdGFydHBvcyArIGNoYXJzUHJvY2Vzc2VkICsgMTsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwIDwgbXNnLkdldExlbmd0aCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgdGMgPSBtc2cuR2V0QXQocCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzWDEyVGVybVNlcCh0YykpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFgxMl9FTkNPREFUSU9OOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmF0aXZlWDEyKHRjKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcCsrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgICBpZiAoaXNOYXRpdmVDNDAoYykpIHsNCisgICAgICBjaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArPSAyLjBmIC8gMy4wZjsNCisgICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsNCisgICAgICBjaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArPSA4LjBmIC8gMy4wZjsNCisgICAgfSBlbHNlIHsNCisgICAgICBjaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArPSA0LjBmIC8gMy4wZjsNCiAgICAgfQ0KLX0NCi1GWF9CT09MIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0RpZ2l0KEZYX1dDSEFSIGNoKQ0KLXsNCi0gICAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOSc7DQotfQ0KLUZYX0JPT0wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzRXh0ZW5kZWRBU0NJSShGWF9XQ0hBUiBjaCkNCi17DQotICAgIHJldHVybiBjaCA+PSAxMjggJiYgY2ggPD0gMjU1Ow0KLX0NCi1pbnQzMl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZURpZ2l0Q291bnQoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBpbnQzMl90IHN0YXJ0cG9zKQ0KLXsNCi0gICAgaW50MzJfdCBjb3VudCA9IDA7DQotICAgIGludDMyX3QgbGVuID0gbXNnLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOw0KLSAgICBpZiAoaWR4IDwgbGVuKSB7DQotICAgICAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChpZHgpOw0KLSAgICAgICAgd2hpbGUgKGlzRGlnaXQoY2gpICYmIGlkeCA8IGxlbikgew0KLSAgICAgICAgICAgIGNvdW50Kys7DQotICAgICAgICAgICAgaWR4Kys7DQotICAgICAgICAgICAgaWYgKGlkeCA8IGxlbikgew0KLSAgICAgICAgICAgICAgICBjaCA9IG1zZy5HZXRBdChpZHgpOw0KKyAgICBpZiAoaXNOYXRpdmVUZXh0KGMpKSB7DQorICAgICAgY2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dICs9IDIuMGYgLyAzLjBmOw0KKyAgICB9IGVsc2UgaWYgKGlzRXh0ZW5kZWRBU0NJSShjKSkgew0KKyAgICAgIGNoYXJDb3VudHNbVEVYVF9FTkNPREFUSU9OXSArPSA4LjBmIC8gMy4wZjsNCisgICAgfSBlbHNlIHsNCisgICAgICBjaGFyQ291bnRzW1RFWFRfRU5DT0RBVElPTl0gKz0gNC4wZiAvIDMuMGY7DQorICAgIH0NCisgICAgaWYgKGlzTmF0aXZlWDEyKGMpKSB7DQorICAgICAgY2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0gKz0gMi4wZiAvIDMuMGY7DQorICAgIH0gZWxzZSBpZiAoaXNFeHRlbmRlZEFTQ0lJKGMpKSB7DQorICAgICAgY2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0gKz0gMTMuMGYgLyAzLjBmOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dICs9IDEwLjBmIC8gMy4wZjsNCisgICAgfQ0KKyAgICBpZiAoaXNOYXRpdmVFRElGQUNUKGMpKSB7DQorICAgICAgY2hhckNvdW50c1tFRElGQUNUX0VOQ09EQVRJT05dICs9IDMuMGYgLyA0LjBmOw0KKyAgICB9IGVsc2UgaWYgKGlzRXh0ZW5kZWRBU0NJSShjKSkgew0KKyAgICAgIGNoYXJDb3VudHNbRURJRkFDVF9FTkNPREFUSU9OXSArPSAxNy4wZiAvIDQuMGY7DQorICAgIH0gZWxzZSB7DQorICAgICAgY2hhckNvdW50c1tFRElGQUNUX0VOQ09EQVRJT05dICs9IDEzLjBmIC8gNC4wZjsNCisgICAgfQ0KKyAgICBpZiAoaXNTcGVjaWFsQjI1NihjKSkgew0KKyAgICAgIGNoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXSArPSA0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXSsrOw0KKyAgICB9DQorICAgIGlmIChjaGFyc1Byb2Nlc3NlZCA+PSA0KSB7DQorICAgICAgQ0ZYX0ludDMyQXJyYXkgaW50Q2hhckNvdW50czsNCisgICAgICBpbnRDaGFyQ291bnRzLlNldFNpemUoNik7DQorICAgICAgQ0ZYX0J5dGVBcnJheSBtaW5zOw0KKyAgICAgIG1pbnMuU2V0U2l6ZSg2KTsNCisgICAgICBmaW5kTWluaW11bXMoY2hhckNvdW50cywgaW50Q2hhckNvdW50cywgSW50ZWdlcl9NQVhfVkFMVUUsIG1pbnMpOw0KKyAgICAgIGludDMyX3QgbWluQ291bnQgPSBnZXRNaW5pbXVtQ291bnQobWlucyk7DQorICAgICAgaWYgKGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW0JBU0UyNTZfRU5DT0RBVElPTl0gJiYNCisgICAgICAgICAgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dICYmDQorICAgICAgICAgIGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW1RFWFRfRU5DT0RBVElPTl0gJiYNCisgICAgICAgICAgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dICYmDQorICAgICAgICAgIGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW0VESUZBQ1RfRU5DT0RBVElPTl0pIHsNCisgICAgICAgIHJldHVybiBBU0NJSV9FTkNPREFUSU9OOw0KKyAgICAgIH0NCisgICAgICBpZiAoaW50Q2hhckNvdW50c1tCQVNFMjU2X0VOQ09EQVRJT05dIDwgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSB8fA0KKyAgICAgICAgICAobWluc1tDNDBfRU5DT0RBVElPTl0gKyBtaW5zW1RFWFRfRU5DT0RBVElPTl0gKyBtaW5zW1gxMl9FTkNPREFUSU9OXSArDQorICAgICAgICAgICBtaW5zW0VESUZBQ1RfRU5DT0RBVElPTl0pID09IDApIHsNCisgICAgICAgIHJldHVybiBCQVNFMjU2X0VOQ09EQVRJT047DQorICAgICAgfQ0KKyAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbRURJRkFDVF9FTkNPREFUSU9OXSA+IDApIHsNCisgICAgICAgIHJldHVybiBFRElGQUNUX0VOQ09EQVRJT047DQorICAgICAgfQ0KKyAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbVEVYVF9FTkNPREFUSU9OXSA+IDApIHsNCisgICAgICAgIHJldHVybiBURVhUX0VOQ09EQVRJT047DQorICAgICAgfQ0KKyAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbWDEyX0VOQ09EQVRJT05dID4gMCkgew0KKyAgICAgICAgcmV0dXJuIFgxMl9FTkNPREFUSU9OOw0KKyAgICAgIH0NCisgICAgICBpZiAoaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSAmJg0KKyAgICAgICAgICBpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArIDEgPA0KKyAgICAgICAgICAgICAgaW50Q2hhckNvdW50c1tCQVNFMjU2X0VOQ09EQVRJT05dICYmDQorICAgICAgICAgIGludENoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dICsgMSA8DQorICAgICAgICAgICAgICBpbnRDaGFyQ291bnRzW0VESUZBQ1RfRU5DT0RBVElPTl0gJiYNCisgICAgICAgICAgaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwgaW50Q2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dKSB7DQorICAgICAgICBpZiAoaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW1gxMl9FTkNPREFUSU9OXSkgew0KKyAgICAgICAgICByZXR1cm4gQzQwX0VOQ09EQVRJT047DQorICAgICAgICB9DQorICAgICAgICBpZiAoaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gPT0gaW50Q2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0pIHsNCisgICAgICAgICAgaW50MzJfdCBwID0gc3RhcnRwb3MgKyBjaGFyc1Byb2Nlc3NlZCArIDE7DQorICAgICAgICAgIHdoaWxlIChwIDwgbXNnLkdldExlbmd0aCgpKSB7DQorICAgICAgICAgICAgRlhfV0NIQVIgdGMgPSBtc2cuR2V0QXQocCk7DQorICAgICAgICAgICAgaWYgKGlzWDEyVGVybVNlcCh0YykpIHsNCisgICAgICAgICAgICAgIHJldHVybiBYMTJfRU5DT0RBVElPTjsNCiAgICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGNvdW50Ow0KLX0NCi12b2lkIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppbGxlZ2FsQ2hhcmFjdGVyKEZYX1dDSEFSIGMsIGludDMyX3QgJmUpDQotew0KLSAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQotfQ0KLUZYX1dDSEFSIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpyYW5kb21pemUyNTNTdGF0ZShGWF9XQ0hBUiBjaCwgaW50MzJfdCBjb2Rld29yZFBvc2l0aW9uKQ0KLXsNCi0gICAgaW50MzJfdCBwc2V1ZG9SYW5kb20gPSAoKDE0OSAqIGNvZGV3b3JkUG9zaXRpb24pICUgMjUzKSArIDE7DQotICAgIGludDMyX3QgdGVtcFZhcmlhYmxlID0gY2ggKyBwc2V1ZG9SYW5kb207DQotICAgIHJldHVybiB0ZW1wVmFyaWFibGUgPD0gMjU0ID8gKEZYX1dDSEFSKSB0ZW1wVmFyaWFibGUgOiAoRlhfV0NIQVIpICh0ZW1wVmFyaWFibGUgLSAyNTQpOw0KLX0NCi1pbnQzMl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpmaW5kTWluaW11bXMoQ0ZYX0Zsb2F0QXJyYXkgJmNoYXJDb3VudHMsIENGWF9JbnQzMkFycmF5ICZpbnRDaGFyQ291bnRzLCBpbnQzMl90IG1pbiwgQ0ZYX0J5dGVBcnJheSAmbWlucykNCi17DQotICAgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IG1pbnMuR2V0U2l6ZSgpOyBsKyspIHsNCi0gICAgICAgIG1pbnNbbF0gPSAodWludDhfdCkwOw0KLSAgICB9DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDY7IGkrKykgew0KLSAgICAgICAgaW50Q2hhckNvdW50c1tpXSA9IChpbnQzMl90KWNlaWwoY2hhckNvdW50c1tpXSk7DQotICAgICAgICBpbnQzMl90IGN1cnJlbnQgPSBpbnRDaGFyQ291bnRzW2ldOw0KLSAgICAgICAgaWYgKG1pbiA+IGN1cnJlbnQpIHsNCi0gICAgICAgICAgICBtaW4gPSBjdXJyZW50Ow0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG1pbnMuR2V0U2l6ZSgpOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgbWluc1tqXSA9ICh1aW50OF90KTA7DQorICAgICAgICAgICAgaWYgKCFpc05hdGl2ZVgxMih0YykpIHsNCisgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwKys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYgKG1pbiA9PSBjdXJyZW50KSB7DQotICAgICAgICAgICAgbWluc1tpXSsrOw0KLSAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gbWluOw0KKyAgfQ0KIH0NCi1pbnQzMl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpnZXRNaW5pbXVtQ291bnQoQ0ZYX0J5dGVBcnJheSAmbWlucykNCi17DQotICAgIGludDMyX3QgbWluQ291bnQgPSAwOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA2OyBpKyspIHsNCi0gICAgICAgIG1pbkNvdW50ICs9IG1pbnNbaV07DQorRlhfQk9PTCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNEaWdpdChGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOSc7DQorfQ0KK0ZYX0JPT0wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzRXh0ZW5kZWRBU0NJSShGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIGNoID49IDEyOCAmJiBjaCA8PSAyNTU7DQorfQ0KK2ludDMyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MpIHsNCisgIGludDMyX3QgY291bnQgPSAwOw0KKyAgaW50MzJfdCBsZW4gPSBtc2cuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOw0KKyAgaWYgKGlkeCA8IGxlbikgew0KKyAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChpZHgpOw0KKyAgICB3aGlsZSAoaXNEaWdpdChjaCkgJiYgaWR4IDwgbGVuKSB7DQorICAgICAgY291bnQrKzsNCisgICAgICBpZHgrKzsNCisgICAgICBpZiAoaWR4IDwgbGVuKSB7DQorICAgICAgICBjaCA9IG1zZy5HZXRBdChpZHgpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gbWluQ291bnQ7DQorICB9DQorICByZXR1cm4gY291bnQ7DQogfQ0KLUZYX0JPT0wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzTmF0aXZlQzQwKEZYX1dDSEFSIGNoKQ0KLXsNCi0gICAgcmV0dXJuIChjaCA9PSAnICcpIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJyk7DQordm9pZCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aWxsZWdhbENoYXJhY3RlcihGWF9XQ0hBUiBjLCBpbnQzMl90JiBlKSB7DQorICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQogfQ0KLUZYX0JPT0wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzTmF0aXZlVGV4dChGWF9XQ0hBUiBjaCkNCi17DQotICAgIHJldHVybiAoY2ggPT0gJyAnKSB8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgKGNoID49ICdhJyAmJiBjaCA8PSAneicpOw0KK0ZYX1dDSEFSIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpyYW5kb21pemUyNTNTdGF0ZShGWF9XQ0hBUiBjaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2Rld29yZFBvc2l0aW9uKSB7DQorICBpbnQzMl90IHBzZXVkb1JhbmRvbSA9ICgoMTQ5ICogY29kZXdvcmRQb3NpdGlvbikgJSAyNTMpICsgMTsNCisgIGludDMyX3QgdGVtcFZhcmlhYmxlID0gY2ggKyBwc2V1ZG9SYW5kb207DQorICByZXR1cm4gdGVtcFZhcmlhYmxlIDw9IDI1NCA/IChGWF9XQ0hBUil0ZW1wVmFyaWFibGUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKEZYX1dDSEFSKSh0ZW1wVmFyaWFibGUgLSAyNTQpOw0KIH0NCi1GWF9CT09MIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc05hdGl2ZVgxMihGWF9XQ0hBUiBjaCkNCi17DQotICAgIHJldHVybiBpc1gxMlRlcm1TZXAoY2gpIHx8IChjaCA9PSAnICcpIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJyk7DQoraW50MzJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6ZmluZE1pbmltdW1zKENGWF9GbG9hdEFycmF5JiBjaGFyQ291bnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgaW50Q2hhckNvdW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlQXJyYXkmIG1pbnMpIHsNCisgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IG1pbnMuR2V0U2l6ZSgpOyBsKyspIHsNCisgICAgbWluc1tsXSA9ICh1aW50OF90KTA7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA2OyBpKyspIHsNCisgICAgaW50Q2hhckNvdW50c1tpXSA9IChpbnQzMl90KWNlaWwoY2hhckNvdW50c1tpXSk7DQorICAgIGludDMyX3QgY3VycmVudCA9IGludENoYXJDb3VudHNbaV07DQorICAgIGlmIChtaW4gPiBjdXJyZW50KSB7DQorICAgICAgbWluID0gY3VycmVudDsNCisgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBtaW5zLkdldFNpemUoKTsgaisrKSB7DQorICAgICAgICBtaW5zW2pdID0gKHVpbnQ4X3QpMDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKG1pbiA9PSBjdXJyZW50KSB7DQorICAgICAgbWluc1tpXSsrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gbWluOw0KIH0NCi1GWF9CT09MIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc1gxMlRlcm1TZXAoRlhfV0NIQVIgY2gpDQotew0KLSAgICByZXR1cm4gKGNoID09ICdccicpIHx8IChjaCA9PSAnKicpIHx8IChjaCA9PSAnPicpOw0KK2ludDMyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmdldE1pbmltdW1Db3VudChDRlhfQnl0ZUFycmF5JiBtaW5zKSB7DQorICBpbnQzMl90IG1pbkNvdW50ID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDY7IGkrKykgew0KKyAgICBtaW5Db3VudCArPSBtaW5zW2ldOw0KKyAgfQ0KKyAgcmV0dXJuIG1pbkNvdW50Ow0KIH0NCi1GWF9CT09MIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc05hdGl2ZUVESUZBQ1QoRlhfV0NIQVIgY2gpDQotew0KLSAgICByZXR1cm4gY2ggPj0gJyAnICYmIGNoIDw9ICdeJzsNCitGWF9CT09MIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc05hdGl2ZUM0MChGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIChjaCA9PSAnICcpIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJyk7DQogfQ0KLUZYX0JPT0wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzU3BlY2lhbEIyNTYoRlhfV0NIQVIgY2gpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNOYXRpdmVUZXh0KEZYX1dDSEFSIGNoKSB7DQorICByZXR1cm4gKGNoID09ICcgJykgfHwgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHx8IChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKTsNCit9DQorRlhfQk9PTCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNOYXRpdmVYMTIoRlhfV0NIQVIgY2gpIHsNCisgIHJldHVybiBpc1gxMlRlcm1TZXAoY2gpIHx8IChjaCA9PSAnICcpIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fA0KKyAgICAgICAgIChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKTsNCit9DQorRlhfQk9PTCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNYMTJUZXJtU2VwKEZYX1dDSEFSIGNoKSB7DQorICByZXR1cm4gKGNoID09ICdccicpIHx8IChjaCA9PSAnKicpIHx8IChjaCA9PSAnPicpOw0KK30NCitGWF9CT09MIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc05hdGl2ZUVESUZBQ1QoRlhfV0NIQVIgY2gpIHsNCisgIHJldHVybiBjaCA+PSAnICcgJiYgY2ggPD0gJ14nOw0KK30NCitGWF9CT09MIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc1NwZWNpYWxCMjU2KEZYX1dDSEFSIGNoKSB7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgKaW5kZXggYzJiZmRjYy4uOGIyZmEyYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgKQEAgLTgsNTMgKzgsNjYgQEAKICNkZWZpbmUgX0JDX0hJR0hMRVZBTEVOQ09ERVJfSF8NCiBjbGFzcyBDQkNfU3ltYm9sU2hhcGVIaW50Ow0KIGNsYXNzIENCQ19IaWdoTGV2ZWxFbmNvZGVyOw0KLSNkZWZpbmUgIEFTQ0lJX0VOQ09EQVRJT04gICAgIDANCi0jZGVmaW5lICBDNDBfRU5DT0RBVElPTiAgICAgICAxDQotI2RlZmluZSAgVEVYVF9FTkNPREFUSU9OICAgICAgMg0KLSNkZWZpbmUgIFgxMl9FTkNPREFUSU9OICAgICAgIDMNCi0jZGVmaW5lICBFRElGQUNUX0VOQ09EQVRJT04gICA0DQotI2RlZmluZSAgQkFTRTI1Nl9FTkNPREFUSU9OICAgNQ0KLWNsYXNzIENCQ19IaWdoTGV2ZWxFbmNvZGVyIDogcHVibGljIENCQ19TeW1ib2xTaGFwZUhpbnQNCi17DQotcHVibGljOg0KLSAgICBDQkNfSGlnaExldmVsRW5jb2RlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfSGlnaExldmVsRW5jb2RlcigpOw0KLSAgICBDRlhfQnl0ZUFycmF5JiBnZXRCeXRlc0Zvck1lc3NhZ2UoQ0ZYX1dpZGVTdHJpbmcgbXNnKTsNCi0gICAgc3RhdGljIENGWF9XaWRlU3RyaW5nIGVuY29kZUhpZ2hMZXZlbChDRlhfV2lkZVN0cmluZyBtc2csIENGWF9XaWRlU3RyaW5nIGVjTGV2ZWwsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlSGlnaExldmVsKENGWF9XaWRlU3RyaW5nIG1zZywgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwgU3ltYm9sU2hhcGVIaW50IHNoYXBlLCBDQkNfRGltZW5zaW9uKiBtaW5TaXplLCBDQkNfRGltZW5zaW9uKiBtYXhTaXplLCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIGludDMyX3QgbG9va0FoZWFkVGVzdChDRlhfV2lkZVN0cmluZyBtc2csIGludDMyX3Qgc3RhcnRwb3MsIGludDMyX3QgY3VycmVudE1vZGUpOw0KLSAgICBzdGF0aWMgRlhfQk9PTCBpc0RpZ2l0KEZYX1dDSEFSIGNoKTsNCi0gICAgc3RhdGljIEZYX0JPT0wgaXNFeHRlbmRlZEFTQ0lJKEZYX1dDSEFSIGNoKTsNCi0gICAgc3RhdGljIGludDMyX3QgZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywgaW50MzJfdCBzdGFydHBvcyk7DQotICAgIHN0YXRpYyB2b2lkIGlsbGVnYWxDaGFyYWN0ZXIoRlhfV0NIQVIgYywgaW50MzJfdCAmZSk7DQorI2RlZmluZSBBU0NJSV9FTkNPREFUSU9OIDANCisjZGVmaW5lIEM0MF9FTkNPREFUSU9OIDENCisjZGVmaW5lIFRFWFRfRU5DT0RBVElPTiAyDQorI2RlZmluZSBYMTJfRU5DT0RBVElPTiAzDQorI2RlZmluZSBFRElGQUNUX0VOQ09EQVRJT04gNA0KKyNkZWZpbmUgQkFTRTI1Nl9FTkNPREFUSU9OIDUNCitjbGFzcyBDQkNfSGlnaExldmVsRW5jb2RlciA6IHB1YmxpYyBDQkNfU3ltYm9sU2hhcGVIaW50IHsNCisgcHVibGljOg0KKyAgQ0JDX0hpZ2hMZXZlbEVuY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19IaWdoTGV2ZWxFbmNvZGVyKCk7DQorICBDRlhfQnl0ZUFycmF5JiBnZXRCeXRlc0Zvck1lc3NhZ2UoQ0ZYX1dpZGVTdHJpbmcgbXNnKTsNCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBlbmNvZGVIaWdoTGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBlbmNvZGVIaWdoTGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1pblNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1heFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIGludDMyX3QgbG9va0FoZWFkVGVzdChDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3VycmVudE1vZGUpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNEaWdpdChGWF9XQ0hBUiBjaCk7DQorICBzdGF0aWMgRlhfQk9PTCBpc0V4dGVuZGVkQVNDSUkoRlhfV0NIQVIgY2gpOw0KKyAgc3RhdGljIGludDMyX3QgZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zKTsNCisgIHN0YXRpYyB2b2lkIGlsbGVnYWxDaGFyYWN0ZXIoRlhfV0NIQVIgYywgaW50MzJfdCYgZSk7DQogDQotcHVibGljOg0KLSAgICBzdGF0aWMgRlhfV0NIQVIgTEFUQ0hfVE9fQzQwOw0KLSAgICBzdGF0aWMgRlhfV0NIQVIgTEFUQ0hfVE9fQkFTRTI1NjsNCi0gICAgc3RhdGljIEZYX1dDSEFSIFVQUEVSX1NISUZUOw0KLSAgICBzdGF0aWMgRlhfV0NIQVIgTEFUQ0hfVE9fQU5TSVgxMjsNCi0gICAgc3RhdGljIEZYX1dDSEFSIExBVENIX1RPX1RFWFQ7DQotICAgIHN0YXRpYyBGWF9XQ0hBUiBMQVRDSF9UT19FRElGQUNUOw0KLSAgICBzdGF0aWMgRlhfV0NIQVIgQzQwX1VOTEFUQ0g7DQotICAgIHN0YXRpYyBGWF9XQ0hBUiBYMTJfVU5MQVRDSDsNCi1wcml2YXRlOg0KLSAgICBzdGF0aWMgRlhfV0NIQVIgUEFEOw0KLSAgICBzdGF0aWMgRlhfV0NIQVIgTUFDUk9fMDU7DQotICAgIHN0YXRpYyBGWF9XQ0hBUiBNQUNST18wNjsNCi0gICAgc3RhdGljIGNvbnN0IHdjaGFyX3QqIE1BQ1JPXzA1X0hFQURFUjsNCi0gICAgc3RhdGljIGNvbnN0IHdjaGFyX3QqIE1BQ1JPXzA2X0hFQURFUjsNCi0gICAgc3RhdGljIGNvbnN0IHdjaGFyX3QgTUFDUk9fVFJBSUxFUjsNCi0gICAgQ0ZYX0J5dGVBcnJheSBtX2J5dGVhcnJheTsNCi1wcml2YXRlOg0KLSAgICBzdGF0aWMgRlhfV0NIQVIgcmFuZG9taXplMjUzU3RhdGUoRlhfV0NIQVIgY2gsIGludDMyX3QgY29kZXdvcmRQb3NpdGlvbik7DQotICAgIHN0YXRpYyBpbnQzMl90IGZpbmRNaW5pbXVtcyhDRlhfRmxvYXRBcnJheSAmY2hhckNvdW50cywgQ0ZYX0ludDMyQXJyYXkgJmludENoYXJDb3VudHMsIGludDMyX3QgbWluLCBDRlhfQnl0ZUFycmF5ICZtaW5zKTsNCi0gICAgc3RhdGljIGludDMyX3QgZ2V0TWluaW11bUNvdW50KENGWF9CeXRlQXJyYXkgJm1pbnMpOw0KLSAgICBzdGF0aWMgRlhfQk9PTCBpc05hdGl2ZUM0MChGWF9XQ0hBUiBjaCk7DQotICAgIHN0YXRpYyBGWF9CT09MIGlzTmF0aXZlVGV4dChGWF9XQ0hBUiBjaCk7DQotICAgIHN0YXRpYyBGWF9CT09MIGlzTmF0aXZlWDEyKEZYX1dDSEFSIGNoKTsNCi0gICAgc3RhdGljIEZYX0JPT0wgaXNYMTJUZXJtU2VwKEZYX1dDSEFSIGNoKTsNCi0gICAgc3RhdGljIEZYX0JPT0wgaXNOYXRpdmVFRElGQUNUKEZYX1dDSEFSIGNoKTsNCi0gICAgc3RhdGljIEZYX0JPT0wgaXNTcGVjaWFsQjI1NihGWF9XQ0hBUiBjaCk7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBGWF9XQ0hBUiBMQVRDSF9UT19DNDA7DQorICBzdGF0aWMgRlhfV0NIQVIgTEFUQ0hfVE9fQkFTRTI1NjsNCisgIHN0YXRpYyBGWF9XQ0hBUiBVUFBFUl9TSElGVDsNCisgIHN0YXRpYyBGWF9XQ0hBUiBMQVRDSF9UT19BTlNJWDEyOw0KKyAgc3RhdGljIEZYX1dDSEFSIExBVENIX1RPX1RFWFQ7DQorICBzdGF0aWMgRlhfV0NIQVIgTEFUQ0hfVE9fRURJRkFDVDsNCisgIHN0YXRpYyBGWF9XQ0hBUiBDNDBfVU5MQVRDSDsNCisgIHN0YXRpYyBGWF9XQ0hBUiBYMTJfVU5MQVRDSDsNCiANCisgcHJpdmF0ZToNCisgIHN0YXRpYyBGWF9XQ0hBUiBQQUQ7DQorICBzdGF0aWMgRlhfV0NIQVIgTUFDUk9fMDU7DQorICBzdGF0aWMgRlhfV0NIQVIgTUFDUk9fMDY7DQorICBzdGF0aWMgY29uc3Qgd2NoYXJfdCogTUFDUk9fMDVfSEVBREVSOw0KKyAgc3RhdGljIGNvbnN0IHdjaGFyX3QqIE1BQ1JPXzA2X0hFQURFUjsNCisgIHN0YXRpYyBjb25zdCB3Y2hhcl90IE1BQ1JPX1RSQUlMRVI7DQorICBDRlhfQnl0ZUFycmF5IG1fYnl0ZWFycmF5Ow0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIEZYX1dDSEFSIHJhbmRvbWl6ZTI1M1N0YXRlKEZYX1dDSEFSIGNoLCBpbnQzMl90IGNvZGV3b3JkUG9zaXRpb24pOw0KKyAgc3RhdGljIGludDMyX3QgZmluZE1pbmltdW1zKENGWF9GbG9hdEFycmF5JiBjaGFyQ291bnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBpbnRDaGFyQ291bnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlQXJyYXkmIG1pbnMpOw0KKyAgc3RhdGljIGludDMyX3QgZ2V0TWluaW11bUNvdW50KENGWF9CeXRlQXJyYXkmIG1pbnMpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNOYXRpdmVDNDAoRlhfV0NIQVIgY2gpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNOYXRpdmVUZXh0KEZYX1dDSEFSIGNoKTsNCisgIHN0YXRpYyBGWF9CT09MIGlzTmF0aXZlWDEyKEZYX1dDSEFSIGNoKTsNCisgIHN0YXRpYyBGWF9CT09MIGlzWDEyVGVybVNlcChGWF9XQ0hBUiBjaCk7DQorICBzdGF0aWMgRlhfQk9PTCBpc05hdGl2ZUVESUZBQ1QoRlhfV0NIQVIgY2gpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNTcGVjaWFsQjI1NihGWF9XQ0hBUiBjaCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmNwcAppbmRleCA1ODdiZGQzLi4yZWQ0ZWUwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5jcHAKQEAgLTI3LDIxNiArMjcsMjM3IEBACiAjaW5jbHVkZSAiQkNfU3ltYm9sU2hhcGVIaW50LmgiDQogI2luY2x1ZGUgIkJDX1N5bWJvbEluZm8uaCINCiAjaW5jbHVkZSAiQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuaCINCi0jZGVmaW5lICBTWU1CT0xTX0NPVU5UICAzMA0KLUNCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bV9QUk9EX1NZTUJPTFNbMzBdID0ge05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9Ow0KLUNCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bV9zeW1ib2xzWzMwXSA9IHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsNCi12b2lkIENCQ19TeW1ib2xJbmZvOjpJbml0aWFsaXplKCkNCi17DQotICAgIG1fUFJPRF9TWU1CT0xTWzBdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAzLCA1LCA4LCA4LCAxKTsNCi0gICAgbV9QUk9EX1NZTUJPTFNbMV0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDUsIDcsIDEwLCAxMCwgMSk7DQotICAgIG1fUFJPRF9TWU1CT0xTWzJdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKFRSVUUsIDUsIDcsIDE2LCA2LCAxKTsNCi0gICAgbV9QUk9EX1NZTUJPTFNbM10gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDgsIDEwLCAxMiwgMTIsIDEpOw0KLSAgICBtX1BST0RfU1lNQk9MU1s0XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhUUlVFLCAxMCwgMTEsIDE0LCA2LCAyKTsNCi0gICAgbV9QUk9EX1NZTUJPTFNbNV0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDEyLCAxMiwgMTQsIDE0LCAxKTsNCi0gICAgbV9QUk9EX1NZTUJPTFNbNl0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oVFJVRSwgMTYsIDE0LCAyNCwgMTAsIDEpOw0KLSAgICBtX1BST0RfU1lNQk9MU1s3XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTgsIDE0LCAxNiwgMTYsIDEpOw0KLSAgICBtX1BST0RfU1lNQk9MU1s4XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMjIsIDE4LCAxOCwgMTgsIDEpOw0KLSAgICBtX1BST0RfU1lNQk9MU1s5XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhUUlVFLCAyMiwgMTgsIDE2LCAxMCwgMik7DQotICAgIG1fUFJPRF9TWU1CT0xTWzEwXSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMzAsIDIwLCAyMCwgMjAsIDEpOw0KLSAgICBtX1BST0RfU1lNQk9MU1sxMV0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oVFJVRSwgMzIsIDI0LCAxNiwgMTQsIDIpOw0KLSAgICBtX1BST0RfU1lNQk9MU1sxMl0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDM2LCAyNCwgMjIsIDIyLCAxKTsNCi0gICAgbV9QUk9EX1NZTUJPTFNbMTNdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCA0NCwgMjgsIDI0LCAyNCwgMSk7DQotICAgIG1fUFJPRF9TWU1CT0xTWzE0XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhUUlVFLCA0OSwgMjgsIDIyLCAxNCwgMik7DQotICAgIG1fUFJPRF9TWU1CT0xTWzE1XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgNjIsIDM2LCAxNCwgMTQsIDQpOw0KLSAgICBtX1BST0RfU1lNQk9MU1sxNl0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDg2LCA0MiwgMTYsIDE2LCA0KTsNCi0gICAgbV9QUk9EX1NZTUJPTFNbMTddID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxMTQsIDQ4LCAxOCwgMTgsIDQpOw0KLSAgICBtX1BST0RfU1lNQk9MU1sxOF0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDE0NCwgNTYsIDIwLCAyMCwgNCk7DQotICAgIG1fUFJPRF9TWU1CT0xTWzE5XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTc0LCA2OCwgMjIsIDIyLCA0KTsNCi0gICAgbV9QUk9EX1NZTUJPTFNbMjBdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAyMDQsIDg0LCAyNCwgMjQsIDQsIDEwMiwgNDIpOw0KLSAgICBtX1BST0RfU1lNQk9MU1syMV0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDI4MCwgMTEyLCAxNCwgMTQsIDE2LCAxNDAsIDU2KTsNCi0gICAgbV9QUk9EX1NZTUJPTFNbMjJdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAzNjgsIDE0NCwgMTYsIDE2LCAxNiwgOTIsIDM2KTsNCi0gICAgbV9QUk9EX1NZTUJPTFNbMjNdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCA0NTYsIDE5MiwgMTgsIDE4LCAxNiwgMTE0LCA0OCk7DQotICAgIG1fUFJPRF9TWU1CT0xTWzI0XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgNTc2LCAyMjQsIDIwLCAyMCwgMTYsIDE0NCwgNTYpOw0KLSAgICBtX1BST0RfU1lNQk9MU1syNV0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDY5NiwgMjcyLCAyMiwgMjIsIDE2LCAxNzQsIDY4KTsNCi0gICAgbV9QUk9EX1NZTUJPTFNbMjZdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCA4MTYsIDMzNiwgMjQsIDI0LCAxNiwgMTM2LCA1Nik7DQotICAgIG1fUFJPRF9TWU1CT0xTWzI3XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTA1MCwgNDA4LCAxOCwgMTgsIDM2LCAxNzUsIDY4KTsNCi0gICAgbV9QUk9EX1NZTUJPTFNbMjhdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxMzA0LCA0OTYsIDIwLCAyMCwgMzYsIDE2MywgNjIpOw0KLSAgICBtX1BST0RfU1lNQk9MU1syOV0gPSBGWF9ORVcgQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0KCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IFNZTUJPTFNfQ09VTlQ7IGkrKykgew0KLSAgICAgICAgbV9zeW1ib2xzW2ldID0gbV9QUk9EX1NZTUJPTFNbaV07DQotICAgIH0NCisjZGVmaW5lIFNZTUJPTFNfQ09VTlQgMzANCitDQkNfU3ltYm9sSW5mbyogQ0JDX1N5bWJvbEluZm86Om1fUFJPRF9TWU1CT0xTWzMwXSA9IHsNCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwNCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwNCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07DQorQ0JDX1N5bWJvbEluZm8qIENCQ19TeW1ib2xJbmZvOjptX3N5bWJvbHNbMzBdID0gew0KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLA0KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLA0KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsNCit2b2lkIENCQ19TeW1ib2xJbmZvOjpJbml0aWFsaXplKCkgew0KKyAgbV9QUk9EX1NZTUJPTFNbMF0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDMsIDUsIDgsIDgsIDEpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMV0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDUsIDcsIDEwLCAxMCwgMSk7DQorICBtX1BST0RfU1lNQk9MU1syXSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhUUlVFLCA1LCA3LCAxNiwgNiwgMSk7DQorICBtX1BST0RfU1lNQk9MU1szXSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgOCwgMTAsIDEyLCAxMiwgMSk7DQorICBtX1BST0RfU1lNQk9MU1s0XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhUUlVFLCAxMCwgMTEsIDE0LCA2LCAyKTsNCisgIG1fUFJPRF9TWU1CT0xTWzVdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxMiwgMTIsIDE0LCAxNCwgMSk7DQorICBtX1BST0RfU1lNQk9MU1s2XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhUUlVFLCAxNiwgMTQsIDI0LCAxMCwgMSk7DQorICBtX1BST0RfU1lNQk9MU1s3XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTgsIDE0LCAxNiwgMTYsIDEpOw0KKyAgbV9QUk9EX1NZTUJPTFNbOF0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDIyLCAxOCwgMTgsIDE4LCAxKTsNCisgIG1fUFJPRF9TWU1CT0xTWzldID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKFRSVUUsIDIyLCAxOCwgMTYsIDEwLCAyKTsNCisgIG1fUFJPRF9TWU1CT0xTWzEwXSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMzAsIDIwLCAyMCwgMjAsIDEpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMTFdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKFRSVUUsIDMyLCAyNCwgMTYsIDE0LCAyKTsNCisgIG1fUFJPRF9TWU1CT0xTWzEyXSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMzYsIDI0LCAyMiwgMjIsIDEpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMTNdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCA0NCwgMjgsIDI0LCAyNCwgMSk7DQorICBtX1BST0RfU1lNQk9MU1sxNF0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oVFJVRSwgNDksIDI4LCAyMiwgMTQsIDIpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMTVdID0gRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCA2MiwgMzYsIDE0LCAxNCwgNCk7DQorICBtX1BST0RfU1lNQk9MU1sxNl0gPSBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDg2LCA0MiwgMTYsIDE2LCA0KTsNCisgIG1fUFJPRF9TWU1CT0xTWzE3XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTE0LCA0OCwgMTgsIDE4LCA0KTsNCisgIG1fUFJPRF9TWU1CT0xTWzE4XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTQ0LCA1NiwgMjAsIDIwLCA0KTsNCisgIG1fUFJPRF9TWU1CT0xTWzE5XSA9IEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTc0LCA2OCwgMjIsIDIyLCA0KTsNCisgIG1fUFJPRF9TWU1CT0xTWzIwXSA9DQorICAgICAgRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAyMDQsIDg0LCAyNCwgMjQsIDQsIDEwMiwgNDIpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMjFdID0NCisgICAgICBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDI4MCwgMTEyLCAxNCwgMTQsIDE2LCAxNDAsIDU2KTsNCisgIG1fUFJPRF9TWU1CT0xTWzIyXSA9DQorICAgICAgRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAzNjgsIDE0NCwgMTYsIDE2LCAxNiwgOTIsIDM2KTsNCisgIG1fUFJPRF9TWU1CT0xTWzIzXSA9DQorICAgICAgRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCA0NTYsIDE5MiwgMTgsIDE4LCAxNiwgMTE0LCA0OCk7DQorICBtX1BST0RfU1lNQk9MU1syNF0gPQ0KKyAgICAgIEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgNTc2LCAyMjQsIDIwLCAyMCwgMTYsIDE0NCwgNTYpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMjVdID0NCisgICAgICBGWF9ORVcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDY5NiwgMjcyLCAyMiwgMjIsIDE2LCAxNzQsIDY4KTsNCisgIG1fUFJPRF9TWU1CT0xTWzI2XSA9DQorICAgICAgRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCA4MTYsIDMzNiwgMjQsIDI0LCAxNiwgMTM2LCA1Nik7DQorICBtX1BST0RfU1lNQk9MU1syN10gPQ0KKyAgICAgIEZYX05FVyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTA1MCwgNDA4LCAxOCwgMTgsIDM2LCAxNzUsIDY4KTsNCisgIG1fUFJPRF9TWU1CT0xTWzI4XSA9DQorICAgICAgRlhfTkVXIENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxMzA0LCA0OTYsIDIwLCAyMCwgMzYsIDE2MywgNjIpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMjldID0gRlhfTkVXIENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgU1lNQk9MU19DT1VOVDsgaSsrKSB7DQorICAgIG1fc3ltYm9sc1tpXSA9IG1fUFJPRF9TWU1CT0xTW2ldOw0KKyAgfQ0KIH0NCi12b2lkIENCQ19TeW1ib2xJbmZvOjpGaW5hbGl6ZSgpDQotew0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBTWU1CT0xTX0NPVU5UOyBpKyspIHsNCi0gICAgICAgIGRlbGV0ZSBtX1BST0RfU1lNQk9MU1tpXTsNCi0gICAgICAgIG1fUFJPRF9TWU1CT0xTW2ldID0gTlVMTDsNCi0gICAgICAgIG1fc3ltYm9sc1tpXSA9IE5VTEw7DQotICAgIH0NCit2b2lkIENCQ19TeW1ib2xJbmZvOjpGaW5hbGl6ZSgpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IFNZTUJPTFNfQ09VTlQ7IGkrKykgew0KKyAgICBkZWxldGUgbV9QUk9EX1NZTUJPTFNbaV07DQorICAgIG1fUFJPRF9TWU1CT0xTW2ldID0gTlVMTDsNCisgICAgbV9zeW1ib2xzW2ldID0gTlVMTDsNCisgIH0NCiB9DQotQ0JDX1N5bWJvbEluZm86OkNCQ19TeW1ib2xJbmZvKEZYX0JPT0wgcmVjdGFuZ3VsYXIsIGludDMyX3QgZGF0YUNhcGFjaXR5LCBpbnQzMl90IGVycm9yQ29kZXdvcmRzLCBpbnQzMl90IG1hdHJpeFdpZHRoLCBpbnQzMl90IG1hdHJpeEhlaWdodCwgaW50MzJfdCBkYXRhUmVnaW9ucykNCi17DQotICAgIG1fcmVjdGFuZ3VsYXIgPSByZWN0YW5ndWxhcjsNCi0gICAgbV9kYXRhQ2FwYWNpdHkgPSBkYXRhQ2FwYWNpdHk7DQotICAgIG1fZXJyb3JDb2Rld29yZHMgPSBlcnJvckNvZGV3b3JkczsNCi0gICAgbV9tYXRyaXhXaWR0aCA9IG1hdHJpeFdpZHRoOw0KLSAgICBtX21hdHJpeEhlaWdodCA9IG1hdHJpeEhlaWdodDsNCi0gICAgbV9kYXRhUmVnaW9ucyA9IGRhdGFSZWdpb25zOw0KLSAgICBtX3JzQmxvY2tEYXRhID0gZGF0YUNhcGFjaXR5Ow0KLSAgICBtX3JzQmxvY2tFcnJvciA9IGVycm9yQ29kZXdvcmRzOw0KK0NCQ19TeW1ib2xJbmZvOjpDQkNfU3ltYm9sSW5mbyhGWF9CT09MIHJlY3Rhbmd1bGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFDYXBhY2l0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXRyaXhXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXRyaXhIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVJlZ2lvbnMpIHsNCisgIG1fcmVjdGFuZ3VsYXIgPSByZWN0YW5ndWxhcjsNCisgIG1fZGF0YUNhcGFjaXR5ID0gZGF0YUNhcGFjaXR5Ow0KKyAgbV9lcnJvckNvZGV3b3JkcyA9IGVycm9yQ29kZXdvcmRzOw0KKyAgbV9tYXRyaXhXaWR0aCA9IG1hdHJpeFdpZHRoOw0KKyAgbV9tYXRyaXhIZWlnaHQgPSBtYXRyaXhIZWlnaHQ7DQorICBtX2RhdGFSZWdpb25zID0gZGF0YVJlZ2lvbnM7DQorICBtX3JzQmxvY2tEYXRhID0gZGF0YUNhcGFjaXR5Ow0KKyAgbV9yc0Jsb2NrRXJyb3IgPSBlcnJvckNvZGV3b3JkczsNCiB9DQotQ0JDX1N5bWJvbEluZm86OkNCQ19TeW1ib2xJbmZvKEZYX0JPT0wgcmVjdGFuZ3VsYXIsIGludDMyX3QgZGF0YUNhcGFjaXR5LCBpbnQzMl90IGVycm9yQ29kZXdvcmRzLCBpbnQzMl90IG1hdHJpeFdpZHRoLCBpbnQzMl90IG1hdHJpeEhlaWdodCwgaW50MzJfdCBkYXRhUmVnaW9ucywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByc0Jsb2NrRGF0YSwgaW50MzJfdCByc0Jsb2NrRXJyb3IpDQotew0KLSAgICBtX3JlY3Rhbmd1bGFyID0gcmVjdGFuZ3VsYXI7DQotICAgIG1fZGF0YUNhcGFjaXR5ID0gZGF0YUNhcGFjaXR5Ow0KLSAgICBtX2Vycm9yQ29kZXdvcmRzID0gZXJyb3JDb2Rld29yZHM7DQotICAgIG1fbWF0cml4V2lkdGggPSBtYXRyaXhXaWR0aDsNCi0gICAgbV9tYXRyaXhIZWlnaHQgPSBtYXRyaXhIZWlnaHQ7DQotICAgIG1fZGF0YVJlZ2lvbnMgPSBkYXRhUmVnaW9uczsNCi0gICAgbV9yc0Jsb2NrRGF0YSA9IHJzQmxvY2tEYXRhOw0KLSAgICBtX3JzQmxvY2tFcnJvciA9IHJzQmxvY2tFcnJvcjsNCitDQkNfU3ltYm9sSW5mbzo6Q0JDX1N5bWJvbEluZm8oRlhfQk9PTCByZWN0YW5ndWxhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhQ2FwYWNpdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFSZWdpb25zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tFcnJvcikgew0KKyAgbV9yZWN0YW5ndWxhciA9IHJlY3Rhbmd1bGFyOw0KKyAgbV9kYXRhQ2FwYWNpdHkgPSBkYXRhQ2FwYWNpdHk7DQorICBtX2Vycm9yQ29kZXdvcmRzID0gZXJyb3JDb2Rld29yZHM7DQorICBtX21hdHJpeFdpZHRoID0gbWF0cml4V2lkdGg7DQorICBtX21hdHJpeEhlaWdodCA9IG1hdHJpeEhlaWdodDsNCisgIG1fZGF0YVJlZ2lvbnMgPSBkYXRhUmVnaW9uczsNCisgIG1fcnNCbG9ja0RhdGEgPSByc0Jsb2NrRGF0YTsNCisgIG1fcnNCbG9ja0Vycm9yID0gcnNCbG9ja0Vycm9yOw0KIH0NCi1DQkNfU3ltYm9sSW5mbzo6fkNCQ19TeW1ib2xJbmZvKCkNCi17DQotfQ0KK0NCQ19TeW1ib2xJbmZvOjp+Q0JDX1N5bWJvbEluZm8oKSB7fQ0KIA0KLUNCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywgaW50MzJfdCAmZSkNCi17DQotICAgIHJldHVybiBsb29rdXAoZGF0YUNvZGV3b3JkcywgRk9SQ0VfTk9ORSwgVFJVRSwgZSk7DQorQ0JDX1N5bWJvbEluZm8qIENCQ19TeW1ib2xJbmZvOjpsb29rdXAoaW50MzJfdCBkYXRhQ29kZXdvcmRzLCBpbnQzMl90JiBlKSB7DQorICByZXR1cm4gbG9va3VwKGRhdGFDb2Rld29yZHMsIEZPUkNFX05PTkUsIFRSVUUsIGUpOw0KIH0NCi1DQkNfU3ltYm9sSW5mbyogQ0JDX1N5bWJvbEluZm86Omxvb2t1cChpbnQzMl90IGRhdGFDb2Rld29yZHMsIFN5bWJvbFNoYXBlSGludCBzaGFwZSwgaW50MzJfdCAmZSkNCi17DQotICAgIHJldHVybiBsb29rdXAoZGF0YUNvZGV3b3Jkcywgc2hhcGUsIFRSVUUsIGUpOw0KK0NCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgcmV0dXJuIGxvb2t1cChkYXRhQ29kZXdvcmRzLCBzaGFwZSwgVFJVRSwgZSk7DQogfQ0KLUNCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywgRlhfQk9PTCBhbGxvd1JlY3Rhbmd1bGFyLCBGWF9CT09MIGZhaWwsIGludDMyX3QgJmUpDQotew0KLSAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUgPSBhbGxvd1JlY3Rhbmd1bGFyID8gRk9SQ0VfTk9ORSA6IEZPUkNFX1NRVUFSRTsNCi0gICAgcmV0dXJuIGxvb2t1cChkYXRhQ29kZXdvcmRzLCBzaGFwZSwgZmFpbCwgZSk7DQorQ0JDX1N5bWJvbEluZm8qIENCQ19TeW1ib2xJbmZvOjpsb29rdXAoaW50MzJfdCBkYXRhQ29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYWxsb3dSZWN0YW5ndWxhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGZhaWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgU3ltYm9sU2hhcGVIaW50IHNoYXBlID0gYWxsb3dSZWN0YW5ndWxhciA/IEZPUkNFX05PTkUgOiBGT1JDRV9TUVVBUkU7DQorICByZXR1cm4gbG9va3VwKGRhdGFDb2Rld29yZHMsIHNoYXBlLCBmYWlsLCBlKTsNCiB9DQotQ0JDX1N5bWJvbEluZm8qIENCQ19TeW1ib2xJbmZvOjpsb29rdXAoaW50MzJfdCBkYXRhQ29kZXdvcmRzLCBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsIEZYX0JPT0wgZmFpbCwgaW50MzJfdCAmZSkNCi17DQotICAgIHJldHVybiBsb29rdXAoZGF0YUNvZGV3b3Jkcywgc2hhcGUsIE5VTEwsIE5VTEwsIGZhaWwsIGUpOw0KK0NCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBmYWlsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIHJldHVybiBsb29rdXAoZGF0YUNvZGV3b3Jkcywgc2hhcGUsIE5VTEwsIE5VTEwsIGZhaWwsIGUpOw0KIH0NCi1DQkNfU3ltYm9sSW5mbyogQ0JDX1N5bWJvbEluZm86Omxvb2t1cChpbnQzMl90IGRhdGFDb2Rld29yZHMsIFN5bWJvbFNoYXBlSGludCBzaGFwZSwgQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSwgRlhfQk9PTCBmYWlsLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgU1lNQk9MU19DT1VOVDsgaSsrKSB7DQotICAgICAgICBDQkNfU3ltYm9sSW5mbyogc3ltYm9sID0gbV9zeW1ib2xzW2ldOw0KLSAgICAgICAgaWYgKHNoYXBlID09IEZPUkNFX1NRVUFSRSAmJiBzeW1ib2wtPm1fcmVjdGFuZ3VsYXIpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChzaGFwZSA9PSBGT1JDRV9SRUNUQU5HTEUgJiYgIXN5bWJvbC0+bV9yZWN0YW5ndWxhcikgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG1pblNpemUgIT0gTlVMTCAmJiAoc3ltYm9sLT5nZXRTeW1ib2xXaWR0aChlKSA8IG1pblNpemUtPmdldFdpZHRoKCkgfHwgc3ltYm9sLT5nZXRTeW1ib2xIZWlnaHQoZSkgPCBtaW5TaXplLT5nZXRIZWlnaHQoKSkpIHsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAobWF4U2l6ZSAhPSBOVUxMICYmIChzeW1ib2wtPmdldFN5bWJvbFdpZHRoKGUpID4gbWF4U2l6ZS0+Z2V0V2lkdGgoKSB8fCBzeW1ib2wtPmdldFN5bWJvbEhlaWdodChlKSA+IG1heFNpemUtPmdldEhlaWdodCgpKSkgew0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChkYXRhQ29kZXdvcmRzIDw9IHN5bWJvbC0+bV9kYXRhQ2FwYWNpdHkpIHsNCi0gICAgICAgICAgICByZXR1cm4gc3ltYm9sOw0KLSAgICAgICAgfQ0KK0NCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfRGltZW5zaW9uKiBtYXhTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgZmFpbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBTWU1CT0xTX0NPVU5UOyBpKyspIHsNCisgICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbCA9IG1fc3ltYm9sc1tpXTsNCisgICAgaWYgKHNoYXBlID09IEZPUkNFX1NRVUFSRSAmJiBzeW1ib2wtPm1fcmVjdGFuZ3VsYXIpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBpZiAoZmFpbCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbERhdGFDb2Rld29yZHM7DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgaWYgKHNoYXBlID09IEZPUkNFX1JFQ1RBTkdMRSAmJiAhc3ltYm9sLT5tX3JlY3Rhbmd1bGFyKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCisgICAgaWYgKG1pblNpemUgIT0gTlVMTCAmJg0KKyAgICAgICAgKHN5bWJvbC0+Z2V0U3ltYm9sV2lkdGgoZSkgPCBtaW5TaXplLT5nZXRXaWR0aCgpIHx8DQorICAgICAgICAgc3ltYm9sLT5nZXRTeW1ib2xIZWlnaHQoZSkgPCBtaW5TaXplLT5nZXRIZWlnaHQoKSkpIHsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKG1heFNpemUgIT0gTlVMTCAmJg0KKyAgICAgICAgKHN5bWJvbC0+Z2V0U3ltYm9sV2lkdGgoZSkgPiBtYXhTaXplLT5nZXRXaWR0aCgpIHx8DQorICAgICAgICAgc3ltYm9sLT5nZXRTeW1ib2xIZWlnaHQoZSkgPiBtYXhTaXplLT5nZXRIZWlnaHQoKSkpIHsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGRhdGFDb2Rld29yZHMgPD0gc3ltYm9sLT5tX2RhdGFDYXBhY2l0eSkgew0KKyAgICAgIHJldHVybiBzeW1ib2w7DQorICAgIH0NCisgIH0NCisgIGlmIChmYWlsKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxEYXRhQ29kZXdvcmRzOw0KICAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1pbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRIb3Jpem9udGFsRGF0YVJlZ2lvbnMoaW50MzJfdCAmZSkNCi17DQotICAgIHN3aXRjaCAobV9kYXRhUmVnaW9ucykgew0KLSAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgIHJldHVybiAyOw0KLSAgICAgICAgY2FzZSAxNjoNCi0gICAgICAgICAgICByZXR1cm4gNDsNCi0gICAgICAgIGNhc2UgMzY6DQotICAgICAgICAgICAgcmV0dXJuIDY7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNhbm5vdEhhbmRsZVRoaXNOdW1iZXJPZkRhdGFSZWdpb25zOw0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICB9DQoraW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0SG9yaXpvbnRhbERhdGFSZWdpb25zKGludDMyX3QmIGUpIHsNCisgIHN3aXRjaCAobV9kYXRhUmVnaW9ucykgew0KKyAgICBjYXNlIDE6DQorICAgICAgcmV0dXJuIDE7DQorICAgIGNhc2UgMjoNCisgICAgICByZXR1cm4gMjsNCisgICAgY2FzZSA0Og0KKyAgICAgIHJldHVybiAyOw0KKyAgICBjYXNlIDE2Og0KKyAgICAgIHJldHVybiA0Ow0KKyAgICBjYXNlIDM2Og0KKyAgICAgIHJldHVybiA2Ow0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNhbm5vdEhhbmRsZVRoaXNOdW1iZXJPZkRhdGFSZWdpb25zOw0KKyAgICAgIHJldHVybiAwOw0KKyAgfQ0KIH0NCi1pbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRWZXJ0aWNhbERhdGFSZWdpb25zKGludDMyX3QgJmUpDQotew0KLSAgICBzd2l0Y2ggKG1fZGF0YVJlZ2lvbnMpIHsNCi0gICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICByZXR1cm4gMjsNCi0gICAgICAgIGNhc2UgMTY6DQotICAgICAgICAgICAgcmV0dXJuIDQ7DQotICAgICAgICBjYXNlIDM2Og0KLSAgICAgICAgICAgIHJldHVybiA2Ow0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25DYW5ub3RIYW5kbGVUaGlzTnVtYmVyT2ZEYXRhUmVnaW9uczsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KK2ludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoaW50MzJfdCYgZSkgew0KKyAgc3dpdGNoIChtX2RhdGFSZWdpb25zKSB7DQorICAgIGNhc2UgMToNCisgICAgICByZXR1cm4gMTsNCisgICAgY2FzZSAyOg0KKyAgICAgIHJldHVybiAxOw0KKyAgICBjYXNlIDQ6DQorICAgICAgcmV0dXJuIDI7DQorICAgIGNhc2UgMTY6DQorICAgICAgcmV0dXJuIDQ7DQorICAgIGNhc2UgMzY6DQorICAgICAgcmV0dXJuIDY7DQorICAgIGRlZmF1bHQ6DQorICAgICAgZSA9IEJDRXhjZXB0aW9uQ2Fubm90SGFuZGxlVGhpc051bWJlck9mRGF0YVJlZ2lvbnM7DQorICAgICAgcmV0dXJuIDA7DQorICB9DQogfQ0KLWludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldFN5bWJvbERhdGFXaWR0aChpbnQzMl90ICZlKQ0KLXsNCi0gICAgcmV0dXJuIGdldEhvcml6b250YWxEYXRhUmVnaW9ucyhlKSAqIG1fbWF0cml4V2lkdGg7DQoraW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0U3ltYm9sRGF0YVdpZHRoKGludDMyX3QmIGUpIHsNCisgIHJldHVybiBnZXRIb3Jpem9udGFsRGF0YVJlZ2lvbnMoZSkgKiBtX21hdHJpeFdpZHRoOw0KIH0NCi1pbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRTeW1ib2xEYXRhSGVpZ2h0KGludDMyX3QgJmUpDQotew0KLSAgICByZXR1cm4gZ2V0VmVydGljYWxEYXRhUmVnaW9ucyhlKSAqIG1fbWF0cml4SGVpZ2h0Ow0KK2ludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldFN5bWJvbERhdGFIZWlnaHQoaW50MzJfdCYgZSkgew0KKyAgcmV0dXJuIGdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoZSkgKiBtX21hdHJpeEhlaWdodDsNCiB9DQotaW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0U3ltYm9sV2lkdGgoaW50MzJfdCAmZSkNCi17DQotICAgIHJldHVybiBnZXRTeW1ib2xEYXRhV2lkdGgoZSkgKyAoZ2V0SG9yaXpvbnRhbERhdGFSZWdpb25zKGUpICogMik7DQoraW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0U3ltYm9sV2lkdGgoaW50MzJfdCYgZSkgew0KKyAgcmV0dXJuIGdldFN5bWJvbERhdGFXaWR0aChlKSArIChnZXRIb3Jpem9udGFsRGF0YVJlZ2lvbnMoZSkgKiAyKTsNCiB9DQotaW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0U3ltYm9sSGVpZ2h0KGludDMyX3QgJmUpDQotew0KLSAgICByZXR1cm4gZ2V0U3ltYm9sRGF0YUhlaWdodChlKSArIChnZXRWZXJ0aWNhbERhdGFSZWdpb25zKGUpICogMik7DQoraW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0U3ltYm9sSGVpZ2h0KGludDMyX3QmIGUpIHsNCisgIHJldHVybiBnZXRTeW1ib2xEYXRhSGVpZ2h0KGUpICsgKGdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoZSkgKiAyKTsNCiB9DQotaW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0Q29kZXdvcmRDb3VudCgpDQotew0KLSAgICByZXR1cm4gbV9kYXRhQ2FwYWNpdHkgKyBtX2Vycm9yQ29kZXdvcmRzOw0KK2ludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldENvZGV3b3JkQ291bnQoKSB7DQorICByZXR1cm4gbV9kYXRhQ2FwYWNpdHkgKyBtX2Vycm9yQ29kZXdvcmRzOw0KIH0NCi1pbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRJbnRlcmxlYXZlZEJsb2NrQ291bnQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fZGF0YUNhcGFjaXR5IC8gbV9yc0Jsb2NrRGF0YTsNCitpbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRJbnRlcmxlYXZlZEJsb2NrQ291bnQoKSB7DQorICByZXR1cm4gbV9kYXRhQ2FwYWNpdHkgLyBtX3JzQmxvY2tEYXRhOw0KIH0NCi1pbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KQ0KLXsNCi0gICAgcmV0dXJuIG1fcnNCbG9ja0RhdGE7DQoraW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0RGF0YUxlbmd0aEZvckludGVybGVhdmVkQmxvY2soaW50MzJfdCBpbmRleCkgew0KKyAgcmV0dXJuIG1fcnNCbG9ja0RhdGE7DQogfQ0KLWludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldEVycm9yTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KQ0KLXsNCi0gICAgcmV0dXJuIG1fcnNCbG9ja0Vycm9yOw0KK2ludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldEVycm9yTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KSB7DQorICByZXR1cm4gbV9yc0Jsb2NrRXJyb3I7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19TeW1ib2xJbmZvOjp0b1N0cmluZyhpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc2I7DQotICAgIHNiICs9IChGWF9XQ0hBUiopKG1fcmVjdGFuZ3VsYXIgPyAiUmVjdGFuZ3VsYXIgU3ltYm9sOiIgOiAiU3F1YXJlIFN5bWJvbDoiKTsNCi0gICAgc2IgKz0gKEZYX1dDSEFSKikiIGRhdGEgcmVnaW9uICI7DQotICAgIHNiICs9IG1fbWF0cml4V2lkdGg7DQotICAgIHNiICs9IChGWF9XQ0hBUikneCc7DQotICAgIHNiICs9IG1fbWF0cml4SGVpZ2h0Ow0KLSAgICBzYiArPSAoRlhfV0NIQVIqKSIsIHN5bWJvbCBzaXplICI7DQotICAgIHNiICs9IGdldFN5bWJvbFdpZHRoKGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX1dDSEFSKikiIik7DQotICAgIHNiICs9IChGWF9XQ0hBUikneCc7DQotICAgIHNiICs9IGdldFN5bWJvbEhlaWdodChlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIChGWF9XQ0hBUiopIiIpOw0KLSAgICBzYiArPSAoRlhfV0NIQVIqKSIsIHN5bWJvbCBkYXRhIHNpemUgIjsNCi0gICAgc2IgKz0gZ2V0U3ltYm9sRGF0YVdpZHRoKGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX1dDSEFSKikiIik7DQotICAgIHNiICs9IChGWF9XQ0hBUikneCc7DQotICAgIHNiICs9IGdldFN5bWJvbERhdGFIZWlnaHQoZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAoRlhfV0NIQVIqKSIiKTsNCi0gICAgc2IgKz0gKEZYX1dDSEFSKikiLCBjb2Rld29yZHMgIjsNCi0gICAgc2IgKz0gbV9kYXRhQ2FwYWNpdHk7DQotICAgIHNiICs9IChGWF9XQ0hBUiknKyc7DQotICAgIHNiICs9IG1fZXJyb3JDb2Rld29yZHM7DQotICAgIHJldHVybiBzYjsNCitDRlhfV2lkZVN0cmluZyBDQkNfU3ltYm9sSW5mbzo6dG9TdHJpbmcoaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgc2I7DQorICBzYiArPSAoRlhfV0NIQVIqKShtX3JlY3Rhbmd1bGFyID8gIlJlY3Rhbmd1bGFyIFN5bWJvbDoiIDogIlNxdWFyZSBTeW1ib2w6Iik7DQorICBzYiArPSAoRlhfV0NIQVIqKSIgZGF0YSByZWdpb24gIjsNCisgIHNiICs9IG1fbWF0cml4V2lkdGg7DQorICBzYiArPSAoRlhfV0NIQVIpJ3gnOw0KKyAgc2IgKz0gbV9tYXRyaXhIZWlnaHQ7DQorICBzYiArPSAoRlhfV0NIQVIqKSIsIHN5bWJvbCBzaXplICI7DQorICBzYiArPSBnZXRTeW1ib2xXaWR0aChlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAoRlhfV0NIQVIqKSIiKTsNCisgIHNiICs9IChGWF9XQ0hBUikneCc7DQorICBzYiArPSBnZXRTeW1ib2xIZWlnaHQoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX1dDSEFSKikiIik7DQorICBzYiArPSAoRlhfV0NIQVIqKSIsIHN5bWJvbCBkYXRhIHNpemUgIjsNCisgIHNiICs9IGdldFN5bWJvbERhdGFXaWR0aChlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAoRlhfV0NIQVIqKSIiKTsNCisgIHNiICs9IChGWF9XQ0hBUikneCc7DQorICBzYiArPSBnZXRTeW1ib2xEYXRhSGVpZ2h0KGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIChGWF9XQ0hBUiopIiIpOw0KKyAgc2IgKz0gKEZYX1dDSEFSKikiLCBjb2Rld29yZHMgIjsNCisgIHNiICs9IG1fZGF0YUNhcGFjaXR5Ow0KKyAgc2IgKz0gKEZYX1dDSEFSKScrJzsNCisgIHNiICs9IG1fZXJyb3JDb2Rld29yZHM7DQorICByZXR1cm4gc2I7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgKaW5kZXggNWFjZTU0Ny4uMjdiODEwYiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgKQEAgLTksNDUgKzksNzAgQEAKIGNsYXNzIENCQ19TeW1ib2xTaGFwZUhpbnQ7DQogY2xhc3MgQ0JDX0RpbWVuc2lvbjsNCiBjbGFzcyBDQkNfU3ltYm9sSW5mbzsNCi1jbGFzcyBDQkNfU3ltYm9sSW5mbyA6IHB1YmxpYyBDQkNfU3ltYm9sU2hhcGVIaW50DQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX1N5bWJvbEluZm8oRlhfQk9PTCByZWN0YW5ndWxhciwgaW50MzJfdCBkYXRhQ2FwYWNpdHksIGludDMyX3QgZXJyb3JDb2Rld29yZHMsDQotICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsIGludDMyX3QgbWF0cml4SGVpZ2h0LCBpbnQzMl90IGRhdGFSZWdpb25zKTsNCi0gICAgdmlydHVhbCB+Q0JDX1N5bWJvbEluZm8oKTsNCi0gICAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KLSAgICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KLSAgICBzdGF0aWMgdm9pZCBvdmVycmlkZVN5bWJvbFNldChDQkNfU3ltYm9sSW5mbyogb3ZlcnJpZGUpOw0KLSAgICBzdGF0aWMgQ0JDX1N5bWJvbEluZm8qIGxvb2t1cChpbnQzMl90IGRhdGFDb2Rld29yZHMsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0JDX1N5bWJvbEluZm8qIGxvb2t1cChpbnQzMl90IGRhdGFDb2Rld29yZHMsIFN5bWJvbFNoYXBlSGludCBzaGFwZSwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywgRlhfQk9PTCBhbGxvd1JlY3Rhbmd1bGFyLCBGWF9CT09MIGZhaWwsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0JDX1N5bWJvbEluZm8qIGxvb2t1cChpbnQzMl90IGRhdGFDb2Rld29yZHMsIFN5bWJvbFNoYXBlSGludCBzaGFwZSwgRlhfQk9PTCBmYWlsLCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIENCQ19TeW1ib2xJbmZvKiBsb29rdXAoaW50MzJfdCBkYXRhQ29kZXdvcmRzLCBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsIENCQ19EaW1lbnNpb24qIG1pblNpemUsIENCQ19EaW1lbnNpb24qIG1heFNpemUsIEZYX0JPT0wgZmFpbCwgaW50MzJfdCAmZSk7DQotICAgIGludDMyX3QgZ2V0SG9yaXpvbnRhbERhdGFSZWdpb25zKGludDMyX3QgJmUpOw0KLSAgICBpbnQzMl90IGdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoaW50MzJfdCAmZSk7DQotICAgIGludDMyX3QgZ2V0U3ltYm9sRGF0YVdpZHRoKGludDMyX3QgJmUpOw0KLSAgICBpbnQzMl90IGdldFN5bWJvbERhdGFIZWlnaHQoaW50MzJfdCAmZSk7DQotICAgIGludDMyX3QgZ2V0U3ltYm9sV2lkdGgoaW50MzJfdCAmZSk7DQotICAgIGludDMyX3QgZ2V0U3ltYm9sSGVpZ2h0KGludDMyX3QgJmUpOw0KLSAgICBpbnQzMl90IGdldENvZGV3b3JkQ291bnQoKTsNCi0gICAgaW50MzJfdCBnZXRJbnRlcmxlYXZlZEJsb2NrQ291bnQoKTsNCi0gICAgaW50MzJfdCBnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KTsNCi0gICAgaW50MzJfdCBnZXRFcnJvckxlbmd0aEZvckludGVybGVhdmVkQmxvY2soaW50MzJfdCBpbmRleCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHRvU3RyaW5nKGludDMyX3QgJmUpOw0KLXB1YmxpYzoNCi0gICAgaW50MzJfdCBtX2RhdGFDYXBhY2l0eTsNCi0gICAgaW50MzJfdCBtX2Vycm9yQ29kZXdvcmRzOw0KLSAgICBpbnQzMl90IG1fbWF0cml4V2lkdGg7DQotICAgIGludDMyX3QgbV9tYXRyaXhIZWlnaHQ7DQotICAgIGludDMyX3QgbV9yc0Jsb2NrRGF0YTsNCi0gICAgaW50MzJfdCBtX3JzQmxvY2tFcnJvcjsNCi0gICAgc3RhdGljIENCQ19TeW1ib2xJbmZvKiBtX1BST0RfU1lNQk9MU1szMF07DQotcHJpdmF0ZToNCi0gICAgc3RhdGljIENCQ19TeW1ib2xJbmZvKiBtX3N5bWJvbHNbMzBdOw0KLSAgICBGWF9CT09MIG1fcmVjdGFuZ3VsYXI7DQotICAgIGludDMyX3QgbV9kYXRhUmVnaW9uczsNCi1wcml2YXRlOg0KLSAgICBDQkNfU3ltYm9sSW5mbyhGWF9CT09MIHJlY3Rhbmd1bGFyLCBpbnQzMl90IGRhdGFDYXBhY2l0eSwgaW50MzJfdCBlcnJvckNvZGV3b3JkcywgaW50MzJfdCBtYXRyaXhXaWR0aCwgaW50MzJfdCBtYXRyaXhIZWlnaHQsIGludDMyX3QgZGF0YVJlZ2lvbnMsDQotICAgICAgICAgICAgICAgICAgIGludDMyX3QgcnNCbG9ja0RhdGEsIGludDMyX3QgcnNCbG9ja0Vycm9yKTsNCitjbGFzcyBDQkNfU3ltYm9sSW5mbyA6IHB1YmxpYyBDQkNfU3ltYm9sU2hhcGVIaW50IHsNCisgcHVibGljOg0KKyAgQ0JDX1N5bWJvbEluZm8oRlhfQk9PTCByZWN0YW5ndWxhciwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YUNhcGFjaXR5LA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IG1hdHJpeEhlaWdodCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVJlZ2lvbnMpOw0KKyAgdmlydHVhbCB+Q0JDX1N5bWJvbEluZm8oKTsNCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBzdGF0aWMgdm9pZCBvdmVycmlkZVN5bWJvbFNldChDQkNfU3ltYm9sSW5mbyogb3ZlcnJpZGUpOw0KKyAgc3RhdGljIENCQ19TeW1ib2xJbmZvKiBsb29rdXAoaW50MzJfdCBkYXRhQ29kZXdvcmRzLCBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFNoYXBlSGludCBzaGFwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENCQ19TeW1ib2xJbmZvKiBsb29rdXAoaW50MzJfdCBkYXRhQ29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBhbGxvd1JlY3Rhbmd1bGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBmYWlsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgQ0JDX1N5bWJvbEluZm8qIGxvb2t1cChpbnQzMl90IGRhdGFDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGZhaWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFNoYXBlSGludCBzaGFwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1pblNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfRGltZW5zaW9uKiBtYXhTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBmYWlsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBpbnQzMl90IGdldEhvcml6b250YWxEYXRhUmVnaW9ucyhpbnQzMl90JiBlKTsNCisgIGludDMyX3QgZ2V0VmVydGljYWxEYXRhUmVnaW9ucyhpbnQzMl90JiBlKTsNCisgIGludDMyX3QgZ2V0U3ltYm9sRGF0YVdpZHRoKGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBnZXRTeW1ib2xEYXRhSGVpZ2h0KGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBnZXRTeW1ib2xXaWR0aChpbnQzMl90JiBlKTsNCisgIGludDMyX3QgZ2V0U3ltYm9sSGVpZ2h0KGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBnZXRDb2Rld29yZENvdW50KCk7DQorICBpbnQzMl90IGdldEludGVybGVhdmVkQmxvY2tDb3VudCgpOw0KKyAgaW50MzJfdCBnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KTsNCisgIGludDMyX3QgZ2V0RXJyb3JMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGludDMyX3QgaW5kZXgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgdG9TdHJpbmcoaW50MzJfdCYgZSk7DQorDQorIHB1YmxpYzoNCisgIGludDMyX3QgbV9kYXRhQ2FwYWNpdHk7DQorICBpbnQzMl90IG1fZXJyb3JDb2Rld29yZHM7DQorICBpbnQzMl90IG1fbWF0cml4V2lkdGg7DQorICBpbnQzMl90IG1fbWF0cml4SGVpZ2h0Ow0KKyAgaW50MzJfdCBtX3JzQmxvY2tEYXRhOw0KKyAgaW50MzJfdCBtX3JzQmxvY2tFcnJvcjsNCisgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbV9QUk9EX1NZTUJPTFNbMzBdOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIENCQ19TeW1ib2xJbmZvKiBtX3N5bWJvbHNbMzBdOw0KKyAgRlhfQk9PTCBtX3JlY3Rhbmd1bGFyOw0KKyAgaW50MzJfdCBtX2RhdGFSZWdpb25zOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0JDX1N5bWJvbEluZm8oRlhfQk9PTCByZWN0YW5ndWxhciwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YUNhcGFjaXR5LA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IG1hdHJpeEhlaWdodCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVJlZ2lvbnMsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tEYXRhLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCByc0Jsb2NrRXJyb3IpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuY3BwCmluZGV4IGI3YjQ3NzUuLmQwZjBlNDUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5jcHAKQEAgLTIyLDkgKzIyLDUgQEAKIA0KICNpbmNsdWRlICIuLi9iYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX1N5bWJvbFNoYXBlSGludC5oIg0KLUNCQ19TeW1ib2xTaGFwZUhpbnQ6OkNCQ19TeW1ib2xTaGFwZUhpbnQoKQ0KLXsNCi19DQotQ0JDX1N5bWJvbFNoYXBlSGludDo6fkNCQ19TeW1ib2xTaGFwZUhpbnQoKQ0KLXsNCi19DQorQ0JDX1N5bWJvbFNoYXBlSGludDo6Q0JDX1N5bWJvbFNoYXBlSGludCgpIHt9DQorQ0JDX1N5bWJvbFNoYXBlSGludDo6fkNCQ19TeW1ib2xTaGFwZUhpbnQoKSB7fQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oCmluZGV4IGFkZGE4YzguLjI0NmI2YzIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuaApAQCAtNiwxNSArNiwxNCBAQAogDQogI2lmbmRlZiBfQkNfU1lNQk9MU0hBUEVISU5UX0hfDQogI2RlZmluZSBfQkNfU1lNQk9MU0hBUEVISU5UX0hfDQotY2xhc3MgQ0JDX1N5bWJvbFNoYXBlSGludA0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19TeW1ib2xTaGFwZUhpbnQoKTsNCi0gICAgdmlydHVhbCB+Q0JDX1N5bWJvbFNoYXBlSGludCgpOw0KLSAgICBlbnVtIFN5bWJvbFNoYXBlSGludCB7DQotICAgICAgICBGT1JDRV9OT05FLA0KLSAgICAgICAgRk9SQ0VfU1FVQVJFLA0KLSAgICAgICAgRk9SQ0VfUkVDVEFOR0xFLA0KLSAgICB9Ow0KK2NsYXNzIENCQ19TeW1ib2xTaGFwZUhpbnQgew0KKyBwdWJsaWM6DQorICBDQkNfU3ltYm9sU2hhcGVIaW50KCk7DQorICB2aXJ0dWFsIH5DQkNfU3ltYm9sU2hhcGVIaW50KCk7DQorICBlbnVtIFN5bWJvbFNoYXBlSGludCB7DQorICAgIEZPUkNFX05PTkUsDQorICAgIEZPUkNFX1NRVUFSRSwNCisgICAgRk9SQ0VfUkVDVEFOR0xFLA0KKyAgfTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5jcHAKaW5kZXggYWZjY2NlNS4uZWNkMjBjZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5jcHAKQEAgLTMwLDczICszMCw2OSBAQAogI2luY2x1ZGUgIkJDX0hpZ2hMZXZlbEVuY29kZXIuaCINCiAjaW5jbHVkZSAiQkNfQzQwRW5jb2Rlci5oIg0KICNpbmNsdWRlICJCQ19UZXh0RW5jb2Rlci5oIg0KLUNCQ19UZXh0RW5jb2Rlcjo6Q0JDX1RleHRFbmNvZGVyKCkNCi17DQorQ0JDX1RleHRFbmNvZGVyOjpDQkNfVGV4dEVuY29kZXIoKSB7fQ0KK0NCQ19UZXh0RW5jb2Rlcjo6fkNCQ19UZXh0RW5jb2RlcigpIHt9DQoraW50MzJfdCBDQkNfVGV4dEVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsNCisgIHJldHVybiBURVhUX0VOQ09EQVRJT047DQogfQ0KLUNCQ19UZXh0RW5jb2Rlcjo6fkNCQ19UZXh0RW5jb2RlcigpDQotew0KLX0NCi1pbnQzMl90IENCQ19UZXh0RW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkNCi17DQotICAgIHJldHVybiBURVhUX0VOQ09EQVRJT047DQotfQ0KLWludDMyX3QgQ0JDX1RleHRFbmNvZGVyOjplbmNvZGVDaGFyKEZYX1dDSEFSIGMsIENGWF9XaWRlU3RyaW5nICZzYiwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChjID09ICcgJykgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSdcMyc7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfQ0KLSAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUikgKGMgLSA0OCArIDQpOw0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0NCi0gICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpIChjIC0gOTcgKyAxNCk7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfQ0KLSAgICBpZiAoYyA+PSAnXDAnICYmIGMgPD0gMHgxZikgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSdcMCc7DQotICAgICAgICBzYiArPSBjOw0KLSAgICAgICAgcmV0dXJuIDI7DQotICAgIH0NCi0gICAgaWYgKGMgPj0gJyEnICYmIGMgPD0gJy8nKSB7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpICdcMSc7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpIChjIC0gMzMpOw0KLSAgICAgICAgcmV0dXJuIDI7DQotICAgIH0NCi0gICAgaWYgKGMgPj0gJzonICYmIGMgPD0gJ0AnKSB7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpJ1wxJzsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUikgKGMgLSA1OCArIDE1KTsNCi0gICAgICAgIHJldHVybiAyOw0KLSAgICB9DQotICAgIGlmIChjID49ICdbJyAmJiBjIDw9ICdfJykgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSAnXDEnOw0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSAoYyAtIDkxICsgMjIpOw0KLSAgICAgICAgcmV0dXJuIDI7DQotICAgIH0NCi0gICAgaWYgKGMgPT0gMHgwMDYwKSB7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpICdcMic7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpIChjIC0gOTYpOw0KLSAgICAgICAgcmV0dXJuIDI7DQotICAgIH0NCi0gICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpJ1wyJzsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUikgKGMgLSA2NSArIDEpOw0KLSAgICAgICAgcmV0dXJuIDI7DQotICAgIH0NCi0gICAgaWYgKGMgPj0gJ3snICYmIGMgPD0gMHgwMDdmKSB7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpJ1wyJzsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUikgKGMgLSAxMjMgKyAyNyk7DQotICAgICAgICByZXR1cm4gMjsNCi0gICAgfQ0KLSAgICBpZiAoYyA+PSAweDAwODApIHsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKTB4MDAxZTsNCi0gICAgICAgIGludDMyX3QgbGVuID0gMjsNCi0gICAgICAgIGxlbiArPSBlbmNvZGVDaGFyKChGWF9XQ0hBUikgKGMgLSAxMjgpLCBzYiwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KLSAgICAgICAgcmV0dXJuIGxlbjsNCi0gICAgfQ0KLSAgICBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aWxsZWdhbENoYXJhY3RlcihjLCBlKTsNCi0gICAgcmV0dXJuIC0xOw0KK2ludDMyX3QgQ0JDX1RleHRFbmNvZGVyOjplbmNvZGVDaGFyKEZYX1dDSEFSIGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjID09ICcgJykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wzJzsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNDggKyA0KTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gOTcgKyAxNCk7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgaWYgKGMgPj0gJ1wwJyAmJiBjIDw9IDB4MWYpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMCc7DQorICAgIHNiICs9IGM7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgaWYgKGMgPj0gJyEnICYmIGMgPD0gJy8nKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KKyAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSAzMyk7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgaWYgKGMgPj0gJzonICYmIGMgPD0gJ0AnKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KKyAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA1OCArIDE1KTsNCisgICAgcmV0dXJuIDI7DQorICB9DQorICBpZiAoYyA+PSAnWycgJiYgYyA8PSAnXycpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQorICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDkxICsgMjIpOw0KKyAgICByZXR1cm4gMjsNCisgIH0NCisgIGlmIChjID09IDB4MDA2MCkgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wyJzsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gOTYpOw0KKyAgICByZXR1cm4gMjsNCisgIH0NCisgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wyJzsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNjUgKyAxKTsNCisgICAgcmV0dXJuIDI7DQorICB9DQorICBpZiAoYyA+PSAneycgJiYgYyA8PSAweDAwN2YpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMic7DQorICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDEyMyArIDI3KTsNCisgICAgcmV0dXJuIDI7DQorICB9DQorICBpZiAoYyA+PSAweDAwODApIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQorICAgIHNiICs9IChGWF9XQ0hBUikweDAwMWU7DQorICAgIGludDMyX3QgbGVuID0gMjsNCisgICAgbGVuICs9IGVuY29kZUNoYXIoKEZYX1dDSEFSKShjIC0gMTI4KSwgc2IsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgICByZXR1cm4gbGVuOw0KKyAgfQ0KKyAgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlsbGVnYWxDaGFyYWN0ZXIoYywgZSk7DQorICByZXR1cm4gLTE7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuaAppbmRleCA3ZDQ2ZTkyLi5jOTNiMGRhIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1RleHRFbmNvZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5oCkBAIC03LDEyICs3LDExIEBACiAjaWZuZGVmIF9CQ19URVhURU5DT0RFUl9IXw0KICNkZWZpbmUgX0JDX1RFWFRFTkNPREVSX0hfDQogY2xhc3MgQ0JDX1RleHRFbmNvZGVyOw0KLWNsYXNzIENCQ19UZXh0RW5jb2RlciA6IHB1YmxpYyBDQkNfQzQwRW5jb2Rlcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19UZXh0RW5jb2RlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfVGV4dEVuY29kZXIoKTsNCi0gICAgaW50MzJfdCBnZXRFbmNvZGluZ01vZGUoKTsNCi0gICAgaW50MzJfdCBlbmNvZGVDaGFyKEZYX1dDSEFSIGMsIENGWF9XaWRlU3RyaW5nICZzYiwgaW50MzJfdCAmZSk7DQorY2xhc3MgQ0JDX1RleHRFbmNvZGVyIDogcHVibGljIENCQ19DNDBFbmNvZGVyIHsNCisgcHVibGljOg0KKyAgQ0JDX1RleHRFbmNvZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfVGV4dEVuY29kZXIoKTsNCisgIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCk7DQorICBpbnQzMl90IGVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcmIHNiLCBpbnQzMl90JiBlKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1gxMkVuY29kZXIuY3BwCmluZGV4IDdmNTZkZTcuLmExNTM2MmYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmNwcApAQCAtMzAsNzUgKzMwLDcxIEBACiAjaW5jbHVkZSAiQkNfSGlnaExldmVsRW5jb2Rlci5oIg0KICNpbmNsdWRlICJCQ19DNDBFbmNvZGVyLmgiDQogI2luY2x1ZGUgIkJDX1gxMkVuY29kZXIuaCINCi1DQkNfWDEyRW5jb2Rlcjo6Q0JDX1gxMkVuY29kZXIoKQ0KLXsNCitDQkNfWDEyRW5jb2Rlcjo6Q0JDX1gxMkVuY29kZXIoKSB7fQ0KK0NCQ19YMTJFbmNvZGVyOjp+Q0JDX1gxMkVuY29kZXIoKSB7fQ0KK2ludDMyX3QgQ0JDX1gxMkVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsNCisgIHJldHVybiBYMTJfRU5DT0RBVElPTjsNCiB9DQotQ0JDX1gxMkVuY29kZXI6On5DQkNfWDEyRW5jb2RlcigpDQotew0KLX0NCi1pbnQzMl90IENCQ19YMTJFbmNvZGVyOjpnZXRFbmNvZGluZ01vZGUoKQ0KLXsNCi0gICAgcmV0dXJuIFgxMl9FTkNPREFUSU9OOw0KLX0NCi12b2lkIENCQ19YMTJFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0ICZjb250ZXh0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgYnVmZmVyOw0KLSAgICB3aGlsZSAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQotICAgICAgICBGWF9XQ0hBUiBjID0gY29udGV4dC5nZXRDdXJyZW50Q2hhcigpOw0KLSAgICAgICAgY29udGV4dC5tX3BvcysrOw0KLSAgICAgICAgZW5jb2RlQ2hhcihjLCBidWZmZXIsIGUpOw0KLSAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7DQotICAgICAgICBpZiAoKGNvdW50ICUgMykgPT0gMCkgew0KLSAgICAgICAgICAgIHdyaXRlTmV4dFRyaXBsZXQoY29udGV4dCwgYnVmZmVyKTsNCi0gICAgICAgICAgICBpbnQzMl90IG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdChjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7DQotICAgICAgICAgICAgaWYgKG5ld01vZGUgIT0gZ2V0RW5jb2RpbmdNb2RlKCkpIHsNCi0gICAgICAgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKG5ld01vZGUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaGFuZGxlRU9EKGNvbnRleHQsIGJ1ZmZlciwgZSk7DQotfQ0KLXZvaWQgQ0JDX1gxMkVuY29kZXI6OmhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQgJmNvbnRleHQsIENGWF9XaWRlU3RyaW5nICZidWZmZXIsIGludDMyX3QgJmUpDQotew0KLSAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oZSk7DQordm9pZCBDQkNfWDEyRW5jb2Rlcjo6RW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgYnVmZmVyOw0KKyAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KKyAgICBGWF9XQ0hBUiBjID0gY29udGV4dC5nZXRDdXJyZW50Q2hhcigpOw0KKyAgICBjb250ZXh0Lm1fcG9zKys7DQorICAgIGVuY29kZUNoYXIoYywgYnVmZmVyLCBlKTsNCiAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KLSAgICBpbnQzMl90IGF2YWlsYWJsZSA9IGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpOw0KICAgICBpbnQzMl90IGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOw0KLSAgICBpZiAoY291bnQgPT0gMikgew0KLSAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpYMTJfVU5MQVRDSCk7DQotICAgICAgICBjb250ZXh0Lm1fcG9zIC09IDI7DQotICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7DQotICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMSkgew0KLSAgICAgICAgY29udGV4dC5tX3Bvcy0tOw0KLSAgICAgICAgaWYgKGF2YWlsYWJsZSA+IDEpIHsNCi0gICAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OlgxMl9VTkxBVENIKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShBU0NJSV9FTkNPREFUSU9OKTsNCisgICAgaWYgKChjb3VudCAlIDMpID09IDApIHsNCisgICAgICB3cml0ZU5leHRUcmlwbGV0KGNvbnRleHQsIGJ1ZmZlcik7DQorICAgICAgaW50MzJfdCBuZXdNb2RlID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Omxvb2tBaGVhZFRlc3QoDQorICAgICAgICAgIGNvbnRleHQubV9tc2csIGNvbnRleHQubV9wb3MsIGdldEVuY29kaW5nTW9kZSgpKTsNCisgICAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgew0KKyAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKG5ld01vZGUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KICAgICB9DQorICB9DQorICBoYW5kbGVFT0QoY29udGV4dCwgYnVmZmVyLCBlKTsNCiB9DQotaW50MzJfdCBDQkNfWDEyRW5jb2Rlcjo6ZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyAmc2IsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoYyA9PSAnXHInKSB7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpJ1wwJzsNCi0gICAgfSBlbHNlIGlmIChjID09ICcqJykgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQotICAgIH0gZWxzZSBpZiAoYyA9PSAnPicpIHsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUiknXDInOw0KLSAgICB9IGVsc2UgaWYgKGMgPT0gJyAnKSB7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpJ1wzJzsNCi0gICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5Jykgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSAoYyAtIDQ4ICsgNCk7DQotICAgIH0gZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsNCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUikgKGMgLSA2NSArIDE0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppbGxlZ2FsQ2hhcmFjdGVyKGMsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCit2b2lkIENCQ19YMTJFbmNvZGVyOjpoYW5kbGVFT0QoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgYnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgYXZhaWxhYmxlID0NCisgICAgICBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKTsNCisgIGludDMyX3QgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7DQorICBpZiAoY291bnQgPT0gMikgew0KKyAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OlgxMl9VTkxBVENIKTsNCisgICAgY29udGV4dC5tX3BvcyAtPSAyOw0KKyAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7DQorICB9IGVsc2UgaWYgKGNvdW50ID09IDEpIHsNCisgICAgY29udGV4dC5tX3Bvcy0tOw0KKyAgICBpZiAoYXZhaWxhYmxlID4gMSkgew0KKyAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6WDEyX1VOTEFUQ0gpOw0KICAgICB9DQotICAgIHJldHVybiAxOw0KKyAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7DQorICB9DQorfQ0KK2ludDMyX3QgQ0JDX1gxMkVuY29kZXI6OmVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcmIHNiLCBpbnQzMl90JiBlKSB7DQorICBpZiAoYyA9PSAnXHInKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUiknXDAnOw0KKyAgfSBlbHNlIGlmIChjID09ICcqJykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wxJzsNCisgIH0gZWxzZSBpZiAoYyA9PSAnPicpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMic7DQorICB9IGVsc2UgaWYgKGMgPT0gJyAnKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUiknXDMnOw0KKyAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5Jykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA0OCArIDQpOw0KKyAgfSBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA2NSArIDE0KTsNCisgIH0gZWxzZSB7DQorICAgIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppbGxlZ2FsQ2hhcmFjdGVyKGMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgfQ0KKyAgcmV0dXJuIDE7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmgKaW5kZXggMjEwZjA3YS4uZWEzZmQ5MiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmgKQEAgLTgsMTQgKzgsMTUgQEAKICNkZWZpbmUgX0JDX1gxMkVOQ09ERVJfSF8NCiBjbGFzcyBDQkNfQzQwRW5jb2RlcjsNCiBjbGFzcyBDQkNfWDEyRW5jb2RlcjsNCi1jbGFzcyBDQkNfWDEyRW5jb2RlciA6IHB1YmxpYyBDQkNfQzQwRW5jb2Rlcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19YMTJFbmNvZGVyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19YMTJFbmNvZGVyKCk7DQotICAgIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCk7DQotICAgIHZvaWQgRW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgaW50MzJfdCAmZSk7DQotICAgIHZvaWQgaGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCAmY29udGV4dCwgQ0ZYX1dpZGVTdHJpbmcgJmJ1ZmZlciwgaW50MzJfdCAmZSk7DQotICAgIGludDMyX3QgZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyAmc2IsIGludDMyX3QgJmUpOw0KK2NsYXNzIENCQ19YMTJFbmNvZGVyIDogcHVibGljIENCQ19DNDBFbmNvZGVyIHsNCisgcHVibGljOg0KKyAgQ0JDX1gxMkVuY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19YMTJFbmNvZGVyKCk7DQorICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpOw0KKyAgdm9pZCBFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKTsNCisgIHZvaWQgaGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwNCisgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIsDQorICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIGludDMyX3QgZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyYgc2IsIGludDMyX3QmIGUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEUmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5jcHAKaW5kZXggODEwYjJjNy4uMjMzOGQwZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEUmVhZGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURSZWFkZXIuY3BwCkBAIC0yNywxNTMgKzI3LDE2MCBAQAogI2luY2x1ZGUgIkJDX09uZURSZWFkZXIuaCINCiBjb25zdCBpbnQzMl90IENCQ19PbmVEUmVhZGVyOjpJTlRFR0VSX01BVEhfU0hJRlQgPSA4Ow0KIGNvbnN0IGludDMyX3QgQ0JDX09uZURSZWFkZXI6OlBBVFRFUk5fTUFUQ0hfUkVTVUxUX1NDQUxFX0ZBQ1RPUiA9IDEgPDwgODsNCi1DQkNfT25lRFJlYWRlcjo6Q0JDX09uZURSZWFkZXIoKQ0KLXsNCitDQkNfT25lRFJlYWRlcjo6Q0JDX09uZURSZWFkZXIoKSB7fQ0KK0NCQ19PbmVEUmVhZGVyOjp+Q0JDX09uZURSZWFkZXIoKSB7fQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVEUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIHN0cnRlbXAgPSBEZWNvZGUoaW1hZ2UsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIHJldHVybiBzdHJ0ZW1wOw0KIH0NCi1DQkNfT25lRFJlYWRlcjo6fkNCQ19PbmVEUmVhZGVyKCkNCi17DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZURSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyBzdHJ0ZW1wID0gRGVEZWNvZGUoaW1hZ2UsIGhpbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICByZXR1cm4gc3RydGVtcDsNCiB9DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZURSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9CeXRlU3RyaW5nIHN0cnRlbXAgPSBEZWNvZGUoaW1hZ2UsIDAsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICByZXR1cm4gc3RydGVtcDsNCi19DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZURSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9CeXRlU3RyaW5nIHN0cnRlbXAgPSBEZURlY29kZShpbWFnZSwgaGludHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICByZXR1cm4gc3RydGVtcDsNCi19DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZURSZWFkZXI6OkRlRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCB3aWR0aCA9IGltYWdlLT5HZXRXaWR0aCgpOw0KLSAgICBpbnQzMl90IGhlaWdodCA9IGltYWdlLT5HZXRIZWlnaHQoKTsNCi0gICAgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3cgPSBOVUxMOw0KLSAgICBpbnQzMl90IG1pZGRsZSA9IGhlaWdodCA+PiAxOw0KLSAgICBGWF9CT09MIHRyeUhhcmRlciA9IEZBTFNFOw0KLSAgICBpbnQzMl90IHJvd1N0ZXAgPSBGWF9NQVgoMSwgaGVpZ2h0ID4+ICh0cnlIYXJkZXIgPyA4IDogNSkpOw0KLSAgICBpbnQzMl90IG1heExpbmVzOw0KLSAgICBpZiAodHJ5SGFyZGVyKSB7DQotICAgICAgICBtYXhMaW5lcyA9IGhlaWdodDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG1heExpbmVzID0gMTU7DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZURSZWFkZXI6OkRlRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IHdpZHRoID0gaW1hZ2UtPkdldFdpZHRoKCk7DQorICBpbnQzMl90IGhlaWdodCA9IGltYWdlLT5HZXRIZWlnaHQoKTsNCisgIENCQ19Db21tb25CaXRBcnJheSogcm93ID0gTlVMTDsNCisgIGludDMyX3QgbWlkZGxlID0gaGVpZ2h0ID4+IDE7DQorICBGWF9CT09MIHRyeUhhcmRlciA9IEZBTFNFOw0KKyAgaW50MzJfdCByb3dTdGVwID0gRlhfTUFYKDEsIGhlaWdodCA+PiAodHJ5SGFyZGVyID8gOCA6IDUpKTsNCisgIGludDMyX3QgbWF4TGluZXM7DQorICBpZiAodHJ5SGFyZGVyKSB7DQorICAgIG1heExpbmVzID0gaGVpZ2h0Ow0KKyAgfSBlbHNlIHsNCisgICAgbWF4TGluZXMgPSAxNTsNCisgIH0NCisgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1heExpbmVzOyB4KyspIHsNCisgICAgaW50MzJfdCByb3dTdGVwc0Fib3ZlT3JCZWxvdyA9ICh4ICsgMSkgPj4gMTsNCisgICAgRlhfQk9PTCBpc0Fib3ZlID0gKHggJiAweDAxKSA9PSAwOw0KKyAgICBpbnQzMl90IHJvd051bWJlciA9DQorICAgICAgICBtaWRkbGUgKw0KKyAgICAgICAgcm93U3RlcCAqIChpc0Fib3ZlID8gcm93U3RlcHNBYm92ZU9yQmVsb3cgOiAtcm93U3RlcHNBYm92ZU9yQmVsb3cpOw0KKyAgICBpZiAocm93TnVtYmVyIDwgMCB8fCByb3dOdW1iZXIgPj0gaGVpZ2h0KSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbWF4TGluZXM7IHgrKykgew0KLSAgICAgICAgaW50MzJfdCByb3dTdGVwc0Fib3ZlT3JCZWxvdyA9ICh4ICsgMSkgPj4gMTsNCi0gICAgICAgIEZYX0JPT0wgaXNBYm92ZSA9ICh4ICYgMHgwMSkgPT0gMDsNCi0gICAgICAgIGludDMyX3Qgcm93TnVtYmVyID0gbWlkZGxlICsgcm93U3RlcCAqIChpc0Fib3ZlID8gcm93U3RlcHNBYm92ZU9yQmVsb3cgOiAtcm93U3RlcHNBYm92ZU9yQmVsb3cpOw0KLSAgICAgICAgaWYgKHJvd051bWJlciA8IDAgfHwgcm93TnVtYmVyID49IGhlaWdodCkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcm93ID0gaW1hZ2UtPkdldEJsYWNrUm93KHJvd051bWJlciwgTlVMTCwgZSk7DQotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTk87DQotICAgICAgICAgICAgaWYocm93ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHJvdzsNCi0gICAgICAgICAgICAgICAgcm93ID0gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBmb3IgKGludDMyX3QgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCAyOyBhdHRlbXB0KyspIHsNCi0gICAgICAgICAgICBpZiAoYXR0ZW1wdCA9PSAxKSB7DQotICAgICAgICAgICAgICAgIHJvdy0+UmV2ZXJzZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQgPSBEZWNvZGVSb3cocm93TnVtYmVyLCByb3csIGhpbnRzLCBlKTsNCi0gICAgICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5POw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYocm93ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHJvdzsNCi0gICAgICAgICAgICAgICAgcm93ID0gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKHJvdyAhPSBOVUxMKSB7DQotICAgICAgICAgICAgZGVsZXRlIHJvdzsNCi0gICAgICAgICAgICByb3cgPSBOVUxMOw0KLSAgICAgICAgfQ0KKyAgICByb3cgPSBpbWFnZS0+R2V0QmxhY2tSb3cocm93TnVtYmVyLCBOVUxMLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5POw0KKyAgICAgIGlmIChyb3cgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIHJvdzsNCisgICAgICAgIHJvdyA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQorICAgIGZvciAoaW50MzJfdCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDI7IGF0dGVtcHQrKykgew0KKyAgICAgIGlmIChhdHRlbXB0ID09IDEpIHsNCisgICAgICAgIHJvdy0+UmV2ZXJzZSgpOw0KKyAgICAgIH0NCisgICAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQgPSBEZWNvZGVSb3cocm93TnVtYmVyLCByb3csIGhpbnRzLCBlKTsNCisgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25OTzsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAocm93ICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSByb3c7DQorICAgICAgICByb3cgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorICAgIGlmIChyb3cgIT0gTlVMTCkgew0KKyAgICAgIGRlbGV0ZSByb3c7DQorICAgICAgcm93ID0gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICByZXR1cm4gIiI7DQorfQ0KK3ZvaWQgQ0JDX09uZURSZWFkZXI6OlJlY29yZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIGNvdW50ZXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBudW1Db3VudGVycyA9IGNvdW50ZXJzLT5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7DQorICAgICgqY291bnRlcnMpW2ldID0gMDsNCisgIH0NCisgIGludDMyX3QgZW5kID0gcm93LT5HZXRTaXplKCk7DQorICBpZiAoc3RhcnQgPj0gZW5kKSB7DQogICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KLSAgICByZXR1cm4gIiI7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgaXNXaGl0ZSA9ICFyb3ctPkdldChzdGFydCk7DQorICBpbnQzMl90IGNvdW50ZXJQb3NpdGlvbiA9IDA7DQorICBpbnQzMl90IGogPSBzdGFydDsNCisgIHdoaWxlIChqIDwgZW5kKSB7DQorICAgIEZYX0JPT0wgcGl4ZWwgPSByb3ctPkdldChqKTsNCisgICAgaWYgKHBpeGVsIF4gaXNXaGl0ZSkgew0KKyAgICAgICgqY291bnRlcnMpW2NvdW50ZXJQb3NpdGlvbl0rKzsNCisgICAgfSBlbHNlIHsNCisgICAgICBjb3VudGVyUG9zaXRpb24rKzsNCisgICAgICBpZiAoY291bnRlclBvc2l0aW9uID09IG51bUNvdW50ZXJzKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgKCpjb3VudGVycylbY291bnRlclBvc2l0aW9uXSA9IDE7DQorICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGorKzsNCisgIH0NCisgIGlmICghKGNvdW50ZXJQb3NpdGlvbiA9PSBudW1Db3VudGVycyB8fA0KKyAgICAgICAgKGNvdW50ZXJQb3NpdGlvbiA9PSBudW1Db3VudGVycyAtIDEgJiYgaiA9PSBlbmQpKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KIH0NCi12b2lkIENCQ19PbmVEUmVhZGVyOjpSZWNvcmRQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90IHN0YXJ0LCBDRlhfSW50MzJBcnJheSAqY291bnRlcnMsIGludDMyX3QgJmUpDQotew0KLSAgICBpbnQzMl90IG51bUNvdW50ZXJzID0gY291bnRlcnMtPkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykgew0KLSAgICAgICAgKCpjb3VudGVycylbaV0gPSAwOw0KK3ZvaWQgQ0JDX09uZURSZWFkZXI6OlJlY29yZFBhdHRlcm5JblJldmVyc2UoQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIGNvdW50ZXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBudW1UcmFuc2l0aW9uc0xlZnQgPSBjb3VudGVycy0+R2V0U2l6ZSgpOw0KKyAgRlhfQk9PTCBsYXN0ID0gcm93LT5HZXQoc3RhcnQpOw0KKyAgd2hpbGUgKHN0YXJ0ID4gMCAmJiBudW1UcmFuc2l0aW9uc0xlZnQgPj0gMCkgew0KKyAgICBpZiAocm93LT5HZXQoLS1zdGFydCkgIT0gbGFzdCkgew0KKyAgICAgIG51bVRyYW5zaXRpb25zTGVmdC0tOw0KKyAgICAgIGxhc3QgPSAhbGFzdDsNCiAgICAgfQ0KLSAgICBpbnQzMl90IGVuZCA9IHJvdy0+R2V0U2l6ZSgpOw0KLSAgICBpZiAoc3RhcnQgPj0gZW5kKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGlzV2hpdGUgPSAhcm93LT5HZXQoc3RhcnQpOw0KLSAgICBpbnQzMl90IGNvdW50ZXJQb3NpdGlvbiA9IDA7DQotICAgIGludDMyX3QgaiA9IHN0YXJ0Ow0KLSAgICB3aGlsZSAoaiA8IGVuZCkgew0KLSAgICAgICAgRlhfQk9PTCBwaXhlbCA9IHJvdy0+R2V0KGopOw0KLSAgICAgICAgaWYgKHBpeGVsIF4gaXNXaGl0ZSkgew0KLSAgICAgICAgICAgICgqY291bnRlcnMpW2NvdW50ZXJQb3NpdGlvbl0rKzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgY291bnRlclBvc2l0aW9uKys7DQotICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3NpdGlvbiA9PSBudW1Db3VudGVycykgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAoKmNvdW50ZXJzKVtjb3VudGVyUG9zaXRpb25dID0gMTsNCi0gICAgICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGorKzsNCi0gICAgfQ0KLSAgICBpZiAoIShjb3VudGVyUG9zaXRpb24gPT0gbnVtQ291bnRlcnMgfHwgKGNvdW50ZXJQb3NpdGlvbiA9PSBudW1Db3VudGVycyAtIDEgJiYgaiA9PSBlbmQpKSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCisgIH0NCisgIGlmIChudW1UcmFuc2l0aW9uc0xlZnQgPj0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgUmVjb3JkUGF0dGVybihyb3csIHN0YXJ0ICsgMSwgY291bnRlcnMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQogfQ0KLXZvaWQgQ0JDX09uZURSZWFkZXI6OlJlY29yZFBhdHRlcm5JblJldmVyc2UoQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIGludDMyX3Qgc3RhcnQsIENGWF9JbnQzMkFycmF5ICpjb3VudGVycywgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgbnVtVHJhbnNpdGlvbnNMZWZ0ID0gY291bnRlcnMtPkdldFNpemUoKTsNCi0gICAgRlhfQk9PTCBsYXN0ID0gcm93LT5HZXQoc3RhcnQpOw0KLSAgICB3aGlsZSAoc3RhcnQgPiAwICYmIG51bVRyYW5zaXRpb25zTGVmdCA+PSAwKSB7DQotICAgICAgICBpZiAocm93LT5HZXQoLS1zdGFydCkgIT0gbGFzdCkgew0KLSAgICAgICAgICAgIG51bVRyYW5zaXRpb25zTGVmdC0tOw0KLSAgICAgICAgICAgIGxhc3QgPSAhbGFzdDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAobnVtVHJhbnNpdGlvbnNMZWZ0ID49IDApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIFJlY29yZFBhdHRlcm4ocm93LCBzdGFydCArIDEsIGNvdW50ZXJzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotfQ0KLWludDMyX3QgQ0JDX09uZURSZWFkZXI6OlBhdHRlcm5NYXRjaFZhcmlhbmNlKENGWF9JbnQzMkFycmF5ICpjb3VudGVycywgY29uc3QgaW50MzJfdCAqcGF0dGVybiwgaW50MzJfdCBtYXhJbmRpdmlkdWFsVmFyaWFuY2UpDQotew0KLSAgICBpbnQzMl90IG51bUNvdW50ZXJzID0gY291bnRlcnMtPkdldFNpemUoKTsNCi0gICAgaW50MzJfdCB0b3RhbCA9IDA7DQotICAgIGludDMyX3QgcGF0dGVybkxlbmd0aCA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHsNCi0gICAgICAgIHRvdGFsICs9ICgqY291bnRlcnMpW2ldOw0KLSAgICAgICAgcGF0dGVybkxlbmd0aCArPSBwYXR0ZXJuW2ldOw0KLSAgICB9DQotICAgIGlmICh0b3RhbCA8IHBhdHRlcm5MZW5ndGgpIHsNCitpbnQzMl90IENCQ19PbmVEUmVhZGVyOjpQYXR0ZXJuTWF0Y2hWYXJpYW5jZShDRlhfSW50MzJBcnJheSogY291bnRlcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogcGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heEluZGl2aWR1YWxWYXJpYW5jZSkgew0KKyAgaW50MzJfdCBudW1Db3VudGVycyA9IGNvdW50ZXJzLT5HZXRTaXplKCk7DQorICBpbnQzMl90IHRvdGFsID0gMDsNCisgIGludDMyX3QgcGF0dGVybkxlbmd0aCA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7DQorICAgIHRvdGFsICs9ICgqY291bnRlcnMpW2ldOw0KKyAgICBwYXR0ZXJuTGVuZ3RoICs9IHBhdHRlcm5baV07DQorICB9DQorICBpZiAodG90YWwgPCBwYXR0ZXJuTGVuZ3RoKSB7DQogI3VuZGVmIG1heA0KLSAgICAgICAgcmV0dXJuIEZYU1lTX0ludE1heDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHVuaXRCYXJXaWR0aCA9ICh0b3RhbCA8PCBJTlRFR0VSX01BVEhfU0hJRlQpIC8gcGF0dGVybkxlbmd0aDsNCi0gICAgbWF4SW5kaXZpZHVhbFZhcmlhbmNlID0gKG1heEluZGl2aWR1YWxWYXJpYW5jZSAqIHVuaXRCYXJXaWR0aCkgPj4gSU5URUdFUl9NQVRIX1NISUZUOw0KLSAgICBpbnQzMl90IHRvdGFsVmFyaWFuY2UgPSAwOw0KLSAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBudW1Db3VudGVyczsgeCsrKSB7DQotICAgICAgICBpbnQzMl90IGNvdW50ZXIgPSAoKmNvdW50ZXJzKVt4XSA8PCBJTlRFR0VSX01BVEhfU0hJRlQ7DQotICAgICAgICBpbnQzMl90IHNjYWxlZFBhdHRlcm4gPSBwYXR0ZXJuW3hdICogdW5pdEJhcldpZHRoOw0KLSAgICAgICAgaW50MzJfdCB2YXJpYW5jZSA9IGNvdW50ZXIgPiBzY2FsZWRQYXR0ZXJuID8gY291bnRlciAtIHNjYWxlZFBhdHRlcm4gOiBzY2FsZWRQYXR0ZXJuIC0gY291bnRlcjsNCi0gICAgICAgIGlmICh2YXJpYW5jZSA+IG1heEluZGl2aWR1YWxWYXJpYW5jZSkgew0KKyAgICByZXR1cm4gRlhTWVNfSW50TWF4Ow0KKyAgfQ0KKyAgaW50MzJfdCB1bml0QmFyV2lkdGggPSAodG90YWwgPDwgSU5URUdFUl9NQVRIX1NISUZUKSAvIHBhdHRlcm5MZW5ndGg7DQorICBtYXhJbmRpdmlkdWFsVmFyaWFuY2UgPQ0KKyAgICAgIChtYXhJbmRpdmlkdWFsVmFyaWFuY2UgKiB1bml0QmFyV2lkdGgpID4+IElOVEVHRVJfTUFUSF9TSElGVDsNCisgIGludDMyX3QgdG90YWxWYXJpYW5jZSA9IDA7DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBudW1Db3VudGVyczsgeCsrKSB7DQorICAgIGludDMyX3QgY291bnRlciA9ICgqY291bnRlcnMpW3hdIDw8IElOVEVHRVJfTUFUSF9TSElGVDsNCisgICAgaW50MzJfdCBzY2FsZWRQYXR0ZXJuID0gcGF0dGVyblt4XSAqIHVuaXRCYXJXaWR0aDsNCisgICAgaW50MzJfdCB2YXJpYW5jZSA9IGNvdW50ZXIgPiBzY2FsZWRQYXR0ZXJuID8gY291bnRlciAtIHNjYWxlZFBhdHRlcm4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2NhbGVkUGF0dGVybiAtIGNvdW50ZXI7DQorICAgIGlmICh2YXJpYW5jZSA+IG1heEluZGl2aWR1YWxWYXJpYW5jZSkgew0KICN1bmRlZiBtYXgNCi0gICAgICAgICAgICByZXR1cm4gRlhTWVNfSW50TWF4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgdG90YWxWYXJpYW5jZSArPSB2YXJpYW5jZTsNCisgICAgICByZXR1cm4gRlhTWVNfSW50TWF4Ow0KICAgICB9DQotICAgIHJldHVybiB0b3RhbFZhcmlhbmNlIC8gdG90YWw7DQorICAgIHRvdGFsVmFyaWFuY2UgKz0gdmFyaWFuY2U7DQorICB9DQorICByZXR1cm4gdG90YWxWYXJpYW5jZSAvIHRvdGFsOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5oCmluZGV4IDA2NGY1ZWQuLmZjZmVhMWYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5oCkBAIC0xMCwyNSArMTAsMzcgQEAKIGNsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQogY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KIGNsYXNzIENCQ19PbmVEUmVhZGVyOw0KLWNsYXNzIENCQ19PbmVEUmVhZGVyIDogcHVibGljIENCQ19SZWFkZXINCi17DQotcHVibGljOg0KLSAgICBDQkNfT25lRFJlYWRlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfT25lRFJlYWRlcigpOw0KLSAgICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgaW50MzJfdCAmZSk7DQotICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKTsNCi0gICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi1wcml2YXRlOg0KLSAgICBDRlhfQnl0ZVN0cmluZyBEZURlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSk7DQorY2xhc3MgQ0JDX09uZURSZWFkZXIgOiBwdWJsaWMgQ0JDX1JlYWRlciB7DQorIHB1YmxpYzoNCisgIENCQ19PbmVEUmVhZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lRFJlYWRlcigpOw0KKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgICAgcmV0dXJuICIiOw0KKyAgfQ0KIA0KLXByb3RlY3RlZDoNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgSU5URUdFUl9NQVRIX1NISUZUOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBQQVRURVJOX01BVENIX1JFU1VMVF9TQ0FMRV9GQUNUT1I7DQotICAgIHZvaWQgUmVjb3JkUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgaW50MzJfdCBzdGFydCwgQ0ZYX0ludDMyQXJyYXkgKmNvdW50ZXJzLCBpbnQzMl90ICZlKTsNCi0gICAgdm9pZCBSZWNvcmRQYXR0ZXJuSW5SZXZlcnNlKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90IHN0YXJ0LCBDRlhfSW50MzJBcnJheSAqY291bnRlcnMsIGludDMyX3QgJmUpOw0KLSAgICBpbnQzMl90IFBhdHRlcm5NYXRjaFZhcmlhbmNlKENGWF9JbnQzMkFycmF5ICpjb3VudGVycywgY29uc3QgaW50MzJfdCAqcGF0dGVybiwgaW50MzJfdCBtYXhJbmRpdmlkdWFsVmFyaWFuY2UpOw0KKyBwcml2YXRlOg0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsIGludDMyX3QgaGludHMsIGludDMyX3QmIGUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBJTlRFR0VSX01BVEhfU0hJRlQ7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBQQVRURVJOX01BVENIX1JFU1VMVF9TQ0FMRV9GQUNUT1I7DQorICB2b2lkIFJlY29yZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydCwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogY291bnRlcnMsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2b2lkIFJlY29yZFBhdHRlcm5JblJldmVyc2UoQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogY291bnRlcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBpbnQzMl90IFBhdHRlcm5NYXRjaFZhcmlhbmNlKENGWF9JbnQzMkFycmF5KiBjb3VudGVycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogcGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhJbmRpdmlkdWFsVmFyaWFuY2UpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1SZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1SZWFkZXIuY3BwCmluZGV4IGEyZGQ3YTEuLmIwYWQwODggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltUmVhZGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVJlYWRlci5jcHAKQEAgLTMwLDIwNiArMzAsMTkxIEBACiBjb25zdCBpbnQzMl90IENCQ19PbmVEaW1SZWFkZXI6OlNUQVJUX0VORF9QQVRURVJOWzNdID0gezEsIDEsIDF9Ow0KIGNvbnN0IGludDMyX3QgQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bNV0gPSB7MSwgMSwgMSwgMSwgMX07DQogY29uc3QgaW50MzJfdCBDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TWzEwXVs0XSA9IHsNCi0gICAgezMsIDIsIDEsIDF9LA0KLSAgICB7MiwgMiwgMiwgMX0sDQotICAgIHsyLCAxLCAyLCAyfSwNCi0gICAgezEsIDQsIDEsIDF9LA0KLSAgICB7MSwgMSwgMywgMn0sDQotICAgIHsxLCAyLCAzLCAxfSwNCi0gICAgezEsIDEsIDEsIDR9LA0KLSAgICB7MSwgMywgMSwgMn0sDQotICAgIHsxLCAyLCAxLCAzfSwNCi0gICAgezMsIDEsIDEsIDJ9DQotfTsNCisgICAgezMsIDIsIDEsIDF9LCB7MiwgMiwgMiwgMX0sIHsyLCAxLCAyLCAyfSwgezEsIDQsIDEsIDF9LCB7MSwgMSwgMywgMn0sDQorICAgIHsxLCAyLCAzLCAxfSwgezEsIDEsIDEsIDR9LCB7MSwgMywgMSwgMn0sIHsxLCAyLCAxLCAzfSwgezMsIDEsIDEsIDJ9fTsNCiBjb25zdCBpbnQzMl90IENCQ19PbmVEaW1SZWFkZXI6OkxfQU5EX0dfUEFUVEVSTlNbMjBdWzRdID0gew0KLSAgICB7MywgMiwgMSwgMX0sDQotICAgIHsyLCAyLCAyLCAxfSwNCi0gICAgezIsIDEsIDIsIDJ9LA0KLSAgICB7MSwgNCwgMSwgMX0sDQotICAgIHsxLCAxLCAzLCAyfSwNCi0gICAgezEsIDIsIDMsIDF9LA0KLSAgICB7MSwgMSwgMSwgNH0sDQotICAgIHsxLCAzLCAxLCAyfSwNCi0gICAgezEsIDIsIDEsIDN9LA0KLSAgICB7MywgMSwgMSwgMn0sDQotICAgIHsxLCAxLCAyLCAzfSwNCi0gICAgezEsIDIsIDIsIDJ9LA0KLSAgICB7MiwgMiwgMSwgMn0sDQotICAgIHsxLCAxLCA0LCAxfSwNCi0gICAgezIsIDMsIDEsIDF9LA0KLSAgICB7MSwgMywgMiwgMX0sDQotICAgIHs0LCAxLCAxLCAxfSwNCi0gICAgezIsIDEsIDMsIDF9LA0KLSAgICB7MywgMSwgMiwgMX0sDQotICAgIHsyLCAxLCAxLCAzfQ0KLX07DQotQ0JDX09uZURpbVJlYWRlcjo6Q0JDX09uZURpbVJlYWRlcigpDQotew0KLX0NCi1DQkNfT25lRGltUmVhZGVyOjp+Q0JDX09uZURpbVJlYWRlcigpDQotew0KLX0NCi1DRlhfSW50MzJBcnJheSAqQ0JDX09uZURpbVJlYWRlcjo6RmluZFN0YXJ0R3VhcmRQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgRlhfQk9PTCBmb3VuZFN0YXJ0ID0gRkFMU0U7DQotICAgIENGWF9JbnQzMkFycmF5ICpzdGFydFJhbmdlID0gTlVMTDsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgc3RhcnRFbmRQYXR0ZXJuOw0KLSAgICBzdGFydEVuZFBhdHRlcm4uU2V0U2l6ZSgzKTsNCi0gICAgc3RhcnRFbmRQYXR0ZXJuWzBdID0gU1RBUlRfRU5EX1BBVFRFUk5bMF07DQotICAgIHN0YXJ0RW5kUGF0dGVyblsxXSA9IFNUQVJUX0VORF9QQVRURVJOWzFdOw0KLSAgICBzdGFydEVuZFBhdHRlcm5bMl0gPSBTVEFSVF9FTkRfUEFUVEVSTlsyXTsNCi0gICAgaW50MzJfdCBuZXh0U3RhcnQgPSAwOw0KLSAgICB3aGlsZSAoIWZvdW5kU3RhcnQpIHsNCi0gICAgICAgIGlmKHN0YXJ0UmFuZ2UgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBzdGFydFJhbmdlOw0KLSAgICAgICAgICAgIHN0YXJ0UmFuZ2UgPSBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3RhcnRSYW5nZSA9IEZpbmRHdWFyZFBhdHRlcm4ocm93LCBuZXh0U3RhcnQsIEZBTFNFLCAmc3RhcnRFbmRQYXR0ZXJuLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgIGludDMyX3Qgc3RhcnQgPSAoKnN0YXJ0UmFuZ2UpWzBdOw0KLSAgICAgICAgbmV4dFN0YXJ0ID0gKCpzdGFydFJhbmdlKVsxXTsNCi0gICAgICAgIGlmIChzdGFydCA8PSAxKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IHF1aWV0U3RhcnQgPSBzdGFydCAtIChuZXh0U3RhcnQgLSBzdGFydCk7DQotICAgICAgICBpZiAocXVpZXRTdGFydCA+PSAwKSB7DQotICAgICAgICAgICAgRlhfQk9PTCBib29UID0gcm93LT5Jc1JhbmdlKHF1aWV0U3RhcnQsIHN0YXJ0LCBGQUxTRSwgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgIGZvdW5kU3RhcnQgPSBib29UOw0KLSAgICAgICAgfQ0KKyAgICB7MywgMiwgMSwgMX0sIHsyLCAyLCAyLCAxfSwgezIsIDEsIDIsIDJ9LCB7MSwgNCwgMSwgMX0sIHsxLCAxLCAzLCAyfSwNCisgICAgezEsIDIsIDMsIDF9LCB7MSwgMSwgMSwgNH0sIHsxLCAzLCAxLCAyfSwgezEsIDIsIDEsIDN9LCB7MywgMSwgMSwgMn0sDQorICAgIHsxLCAxLCAyLCAzfSwgezEsIDIsIDIsIDJ9LCB7MiwgMiwgMSwgMn0sIHsxLCAxLCA0LCAxfSwgezIsIDMsIDEsIDF9LA0KKyAgICB7MSwgMywgMiwgMX0sIHs0LCAxLCAxLCAxfSwgezIsIDEsIDMsIDF9LCB7MywgMSwgMiwgMX0sIHsyLCAxLCAxLCAzfX07DQorQ0JDX09uZURpbVJlYWRlcjo6Q0JDX09uZURpbVJlYWRlcigpIHt9DQorQ0JDX09uZURpbVJlYWRlcjo6fkNCQ19PbmVEaW1SZWFkZXIoKSB7fQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfT25lRGltUmVhZGVyOjpGaW5kU3RhcnRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBGWF9CT09MIGZvdW5kU3RhcnQgPSBGQUxTRTsNCisgIENGWF9JbnQzMkFycmF5KiBzdGFydFJhbmdlID0gTlVMTDsNCisgIENGWF9JbnQzMkFycmF5IHN0YXJ0RW5kUGF0dGVybjsNCisgIHN0YXJ0RW5kUGF0dGVybi5TZXRTaXplKDMpOw0KKyAgc3RhcnRFbmRQYXR0ZXJuWzBdID0gU1RBUlRfRU5EX1BBVFRFUk5bMF07DQorICBzdGFydEVuZFBhdHRlcm5bMV0gPSBTVEFSVF9FTkRfUEFUVEVSTlsxXTsNCisgIHN0YXJ0RW5kUGF0dGVyblsyXSA9IFNUQVJUX0VORF9QQVRURVJOWzJdOw0KKyAgaW50MzJfdCBuZXh0U3RhcnQgPSAwOw0KKyAgd2hpbGUgKCFmb3VuZFN0YXJ0KSB7DQorICAgIGlmIChzdGFydFJhbmdlICE9IE5VTEwpIHsNCisgICAgICBkZWxldGUgc3RhcnRSYW5nZTsNCisgICAgICBzdGFydFJhbmdlID0gTlVMTDsNCiAgICAgfQ0KLSAgICByZXR1cm4gc3RhcnRSYW5nZTsNCi19DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZURpbVJlYWRlcjo6RGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9JbnQzMkFycmF5KiBTdGFydFBhdHRlcm4gPSBGaW5kU3RhcnRHdWFyZFBhdHRlcm4ocm93LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0ZYX0ludDMyQXJyYXkgPiByZXN1bHQoU3RhcnRQYXR0ZXJuKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgdGVtcCA9IERlY29kZVJvdyhyb3dOdW1iZXIsIHJvdywgcmVzdWx0LmdldCgpLCBoaW50cywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQotICAgIHJldHVybiB0ZW1wOw0KLX0NCi1DRlhfQnl0ZVN0cmluZyBDQkNfT25lRGltUmVhZGVyOjpEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqc3RhcnRHdWFyZFJhbmdlLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0Ow0KLSAgICBpbnQzMl90IGVuZFN0YXJ0ID0gRGVjb2RlTWlkZGxlKHJvdywgc3RhcnRHdWFyZFJhbmdlLCByZXN1bHQsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICBGWF9CT09MIGIgPSBDaGVja0NoZWNrc3VtKHJlc3VsdCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQotICAgIGlmICghYikgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi0gICAgcmV0dXJuIHJlc3VsdDsNCi19DQotRlhfQk9PTCBDQkNfT25lRGltUmVhZGVyOjpDaGVja0NoZWNrc3VtKENGWF9CeXRlU3RyaW5nICZzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgRlhfQk9PTCB0ZW1wID0gQ2hlY2tTdGFuZGFyZFVQQ0VBTkNoZWNrc3VtKHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gdGVtcDsNCi19DQotRlhfQk9PTCBDQkNfT25lRGltUmVhZGVyOjpDaGVja1N0YW5kYXJkVVBDRUFOQ2hlY2tzdW0oQ0ZYX0J5dGVTdHJpbmcgJnMsIGludDMyX3QgJmUpDQotew0KLSAgICBpbnQzMl90IGxlbmd0aCA9IHMuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChsZW5ndGggPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGludDMyX3Qgc3VtID0gMDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSBsZW5ndGggLSAyOyBpID49IDA7IGkgLT0gMikgew0KLSAgICAgICAgaW50MzJfdCBkaWdpdCA9IChpbnQzMl90KSBzW2ldIC0gKGludDMyX3QpICcwJzsNCi0gICAgICAgIGlmIChkaWdpdCA8IDAgfHwgZGlnaXQgPiA5KSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHN1bSArPSBkaWdpdDsNCi0gICAgfQ0KLSAgICBzdW0gKj0gMzsNCi0gICAgZm9yIChpbnQzMl90IGogPSBsZW5ndGggLSAxOyBqID49IDA7IGogLT0gMikgew0KLSAgICAgICAgaW50MzJfdCBkaWdpdCA9IChpbnQzMl90KSBzW2pdIC0gKGludDMyX3QpICcwJzsNCi0gICAgICAgIGlmIChkaWdpdCA8IDAgfHwgZGlnaXQgPiA5KSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHN1bSArPSBkaWdpdDsNCi0gICAgfQ0KLSAgICByZXR1cm4gc3VtICUgMTAgPT0gMDsNCi19DQotQ0ZYX0ludDMyQXJyYXkgKkNCQ19PbmVEaW1SZWFkZXI6OkRlY29kZUVuZChDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywgaW50MzJfdCBlbmRTdGFydCwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9JbnQzMkFycmF5IHN0YXJ0RW5kUGF0dGVybjsNCi0gICAgc3RhcnRFbmRQYXR0ZXJuLkFkZChTVEFSVF9FTkRfUEFUVEVSTlswXSk7DQotICAgIHN0YXJ0RW5kUGF0dGVybi5BZGQoU1RBUlRfRU5EX1BBVFRFUk5bMV0pOw0KLSAgICBzdGFydEVuZFBhdHRlcm4uQWRkKFNUQVJUX0VORF9QQVRURVJOWzJdKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkqIEZpbmRHdWFyZCA9IEZpbmRHdWFyZFBhdHRlcm4ocm93LCBlbmRTdGFydCwgRkFMU0UsICZzdGFydEVuZFBhdHRlcm4sIGUpOw0KKyAgICBzdGFydFJhbmdlID0gRmluZEd1YXJkUGF0dGVybihyb3csIG5leHRTdGFydCwgRkFMU0UsICZzdGFydEVuZFBhdHRlcm4sIGUpOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIHJldHVybiBGaW5kR3VhcmQ7DQorICAgIGludDMyX3Qgc3RhcnQgPSAoKnN0YXJ0UmFuZ2UpWzBdOw0KKyAgICBuZXh0U3RhcnQgPSAoKnN0YXJ0UmFuZ2UpWzFdOw0KKyAgICBpZiAoc3RhcnQgPD0gMSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGludDMyX3QgcXVpZXRTdGFydCA9IHN0YXJ0IC0gKG5leHRTdGFydCAtIHN0YXJ0KTsNCisgICAgaWYgKHF1aWV0U3RhcnQgPj0gMCkgew0KKyAgICAgIEZYX0JPT0wgYm9vVCA9IHJvdy0+SXNSYW5nZShxdWlldFN0YXJ0LCBzdGFydCwgRkFMU0UsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICBmb3VuZFN0YXJ0ID0gYm9vVDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHN0YXJ0UmFuZ2U7DQogfQ0KLUNGWF9JbnQzMkFycmF5ICpDQkNfT25lRGltUmVhZGVyOjpGaW5kR3VhcmRQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90IHJvd09mZnNldCwgRlhfQk9PTCB3aGl0ZUZpcnN0LCBDRlhfSW50MzJBcnJheSAqcGF0dGVybiwgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgcGF0dGVybkxlbmd0aCA9IHBhdHRlcm4tPkdldFNpemUoKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQotICAgIGNvdW50ZXJzLlNldFNpemUocGF0dGVybkxlbmd0aCk7DQotICAgIGludDMyX3Qgd2lkdGggPSByb3ctPkdldFNpemUoKTsNCi0gICAgRlhfQk9PTCBpc1doaXRlID0gRkFMU0U7DQotICAgIHdoaWxlIChyb3dPZmZzZXQgPCB3aWR0aCkgew0KLSAgICAgICAgaXNXaGl0ZSA9ICFyb3ctPkdldChyb3dPZmZzZXQpOw0KLSAgICAgICAgaWYgKHdoaXRlRmlyc3QgPT0gaXNXaGl0ZSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcm93T2Zmc2V0Kys7DQotICAgIH0NCi0gICAgaW50MzJfdCBjb3VudGVyUG9zaXRpb24gPSAwOw0KLSAgICBpbnQzMl90IHBhdHRlcm5TdGFydCA9IHJvd09mZnNldDsNCi0gICAgZm9yIChpbnQzMl90IHggPSByb3dPZmZzZXQ7IHggPCB3aWR0aDsgeCsrKSB7DQotICAgICAgICBGWF9CT09MIHBpeGVsID0gcm93LT5HZXQoeCk7DQotICAgICAgICBpZiAocGl4ZWwgXiBpc1doaXRlKSB7DQotICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc2l0aW9uXSsrOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoY291bnRlclBvc2l0aW9uID09IHBhdHRlcm5MZW5ndGggLSAxKSB7DQotICAgICAgICAgICAgICAgIGlmIChQYXR0ZXJuTWF0Y2hWYXJpYW5jZSgmY291bnRlcnMsICYoKnBhdHRlcm4pWzBdLCBNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRSkgPCBNQVhfQVZHX1ZBUklBTkNFKSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSAqcmVzdWx0ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5KCk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQtPlNldFNpemUoMik7DQotICAgICAgICAgICAgICAgICAgICAoKnJlc3VsdClbMF0gPSBwYXR0ZXJuU3RhcnQ7DQotICAgICAgICAgICAgICAgICAgICAoKnJlc3VsdClbMV0gPSB4Ow0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwYXR0ZXJuU3RhcnQgKz0gY291bnRlcnNbMF0gKyBjb3VudGVyc1sxXTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IHkgPSAyOyB5IDwgcGF0dGVybkxlbmd0aDsgeSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBjb3VudGVyc1t5IC0gMl0gPSBjb3VudGVyc1t5XTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjb3VudGVyc1twYXR0ZXJuTGVuZ3RoIC0gMl0gPSAwOw0KLSAgICAgICAgICAgICAgICBjb3VudGVyc1twYXR0ZXJuTGVuZ3RoIC0gMV0gPSAwOw0KLSAgICAgICAgICAgICAgICBjb3VudGVyUG9zaXRpb24tLTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjb3VudGVyUG9zaXRpb24rKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc2l0aW9uXSA9IDE7DQotICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIHJldHVybiBOVUxMOw0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVEaW1SZWFkZXI6OkRlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9JbnQzMkFycmF5KiBTdGFydFBhdHRlcm4gPSBGaW5kU3RhcnRHdWFyZFBhdHRlcm4ocm93LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheT4gcmVzdWx0KFN0YXJ0UGF0dGVybik7DQorICBDRlhfQnl0ZVN0cmluZyB0ZW1wID0gRGVjb2RlUm93KHJvd051bWJlciwgcm93LCByZXN1bHQuZ2V0KCksIGhpbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICByZXR1cm4gdGVtcDsNCiB9DQotaW50MzJfdCBDQkNfT25lRGltUmVhZGVyOjpEZWNvZGVEaWdpdChDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgQ0ZYX0ludDMyQXJyYXkgKmNvdW50ZXJzLCBpbnQzMl90IHJvd09mZnNldCwgY29uc3QgaW50MzJfdCogcGF0dGVybnMsIGludDMyX3QgcGF0dGVybkxlbmd0aCwgaW50MzJfdCAmZSkNCi17DQotICAgIFJlY29yZFBhdHRlcm4ocm93LCByb3dPZmZzZXQsIGNvdW50ZXJzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KLSAgICBpbnQzMl90IGJlc3RWYXJpYW5jZSA9IE1BWF9BVkdfVkFSSUFOQ0U7DQotICAgIGludDMyX3QgYmVzdE1hdGNoID0gLTE7DQotICAgIGludDMyX3QgbWF4ID0gcGF0dGVybkxlbmd0aDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgdmFyaWFuY2UgPSBQYXR0ZXJuTWF0Y2hWYXJpYW5jZShjb3VudGVycywgJnBhdHRlcm5zW2kgKiA0XSwgTUFYX0lORElWSURVQUxfVkFSSUFOQ0UpOw0KLSAgICAgICAgaWYgKHZhcmlhbmNlIDwgYmVzdFZhcmlhbmNlKSB7DQotICAgICAgICAgICAgYmVzdFZhcmlhbmNlID0gdmFyaWFuY2U7DQotICAgICAgICAgICAgYmVzdE1hdGNoID0gaTsNCi0gICAgICAgIH0NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lRGltUmVhZGVyOjpEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogc3RhcnRHdWFyZFJhbmdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICBpbnQzMl90IGVuZFN0YXJ0ID0gRGVjb2RlTWlkZGxlKHJvdywgc3RhcnRHdWFyZFJhbmdlLCByZXN1bHQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIEZYX0JPT0wgYiA9IENoZWNrQ2hlY2tzdW0ocmVzdWx0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBpZiAoIWIpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQorICAgIHJldHVybiAiIjsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZURpbVJlYWRlcjo6Q2hlY2tDaGVja3N1bShDRlhfQnl0ZVN0cmluZyYgcywgaW50MzJfdCYgZSkgew0KKyAgRlhfQk9PTCB0ZW1wID0gQ2hlY2tTdGFuZGFyZFVQQ0VBTkNoZWNrc3VtKHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiB0ZW1wOw0KK30NCitGWF9CT09MIENCQ19PbmVEaW1SZWFkZXI6OkNoZWNrU3RhbmRhcmRVUENFQU5DaGVja3N1bShDRlhfQnl0ZVN0cmluZyYgcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGxlbmd0aCA9IHMuR2V0TGVuZ3RoKCk7DQorICBpZiAobGVuZ3RoID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBzdW0gPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSBsZW5ndGggLSAyOyBpID49IDA7IGkgLT0gMikgew0KKyAgICBpbnQzMl90IGRpZ2l0ID0gKGludDMyX3Qpc1tpXSAtIChpbnQzMl90KScwJzsNCisgICAgaWYgKGRpZ2l0IDwgMCB8fCBkaWdpdCA+IDkpIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIGlmIChiZXN0TWF0Y2ggPj0gMCkgew0KLSAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDsNCisgICAgc3VtICs9IGRpZ2l0Ow0KKyAgfQ0KKyAgc3VtICo9IDM7DQorICBmb3IgKGludDMyX3QgaiA9IGxlbmd0aCAtIDE7IGogPj0gMDsgaiAtPSAyKSB7DQorICAgIGludDMyX3QgZGlnaXQgPSAoaW50MzJfdClzW2pdIC0gKGludDMyX3QpJzAnOw0KKyAgICBpZiAoZGlnaXQgPCAwIHx8IGRpZ2l0ID4gOSkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgc3VtICs9IGRpZ2l0Ow0KKyAgfQ0KKyAgcmV0dXJuIHN1bSAlIDEwID09IDA7DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfT25lRGltUmVhZGVyOjpEZWNvZGVFbmQoQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVuZFN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0ludDMyQXJyYXkgc3RhcnRFbmRQYXR0ZXJuOw0KKyAgc3RhcnRFbmRQYXR0ZXJuLkFkZChTVEFSVF9FTkRfUEFUVEVSTlswXSk7DQorICBzdGFydEVuZFBhdHRlcm4uQWRkKFNUQVJUX0VORF9QQVRURVJOWzFdKTsNCisgIHN0YXJ0RW5kUGF0dGVybi5BZGQoU1RBUlRfRU5EX1BBVFRFUk5bMl0pOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIEZpbmRHdWFyZCA9DQorICAgICAgRmluZEd1YXJkUGF0dGVybihyb3csIGVuZFN0YXJ0LCBGQUxTRSwgJnN0YXJ0RW5kUGF0dGVybiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gRmluZEd1YXJkOw0KK30NCitDRlhfSW50MzJBcnJheSogQ0JDX09uZURpbVJlYWRlcjo6RmluZEd1YXJkUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd09mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIHdoaXRlRmlyc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi0+R2V0U2l6ZSgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQorICBjb3VudGVycy5TZXRTaXplKHBhdHRlcm5MZW5ndGgpOw0KKyAgaW50MzJfdCB3aWR0aCA9IHJvdy0+R2V0U2l6ZSgpOw0KKyAgRlhfQk9PTCBpc1doaXRlID0gRkFMU0U7DQorICB3aGlsZSAocm93T2Zmc2V0IDwgd2lkdGgpIHsNCisgICAgaXNXaGl0ZSA9ICFyb3ctPkdldChyb3dPZmZzZXQpOw0KKyAgICBpZiAod2hpdGVGaXJzdCA9PSBpc1doaXRlKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcm93T2Zmc2V0Kys7DQorICB9DQorICBpbnQzMl90IGNvdW50ZXJQb3NpdGlvbiA9IDA7DQorICBpbnQzMl90IHBhdHRlcm5TdGFydCA9IHJvd09mZnNldDsNCisgIGZvciAoaW50MzJfdCB4ID0gcm93T2Zmc2V0OyB4IDwgd2lkdGg7IHgrKykgew0KKyAgICBGWF9CT09MIHBpeGVsID0gcm93LT5HZXQoeCk7DQorICAgIGlmIChwaXhlbCBeIGlzV2hpdGUpIHsNCisgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dKys7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCi0gICAgICAgIHJldHVybiAwOw0KKyAgICAgIGlmIChjb3VudGVyUG9zaXRpb24gPT0gcGF0dGVybkxlbmd0aCAtIDEpIHsNCisgICAgICAgIGlmIChQYXR0ZXJuTWF0Y2hWYXJpYW5jZSgmY291bnRlcnMsICYoKnBhdHRlcm4pWzBdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKSA8IE1BWF9BVkdfVkFSSUFOQ0UpIHsNCisgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHJlc3VsdCA9IEZYX05FVyBDRlhfSW50MzJBcnJheSgpOw0KKyAgICAgICAgICByZXN1bHQtPlNldFNpemUoMik7DQorICAgICAgICAgICgqcmVzdWx0KVswXSA9IHBhdHRlcm5TdGFydDsNCisgICAgICAgICAgKCpyZXN1bHQpWzFdID0geDsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyc1swXSArIGNvdW50ZXJzWzFdOw0KKyAgICAgICAgZm9yIChpbnQzMl90IHkgPSAyOyB5IDwgcGF0dGVybkxlbmd0aDsgeSsrKSB7DQorICAgICAgICAgIGNvdW50ZXJzW3kgLSAyXSA9IGNvdW50ZXJzW3ldOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY291bnRlcnNbcGF0dGVybkxlbmd0aCAtIDJdID0gMDsNCisgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAxXSA9IDA7DQorICAgICAgICBjb3VudGVyUG9zaXRpb24tLTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY291bnRlclBvc2l0aW9uKys7DQorICAgICAgfQ0KKyAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NpdGlvbl0gPSAxOw0KKyAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTsNCiAgICAgfQ0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDQkNfT25lRGltUmVhZGVyOjpEZWNvZGVEaWdpdChDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBjb3VudGVycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93T2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogcGF0dGVybnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhdHRlcm5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBSZWNvcmRQYXR0ZXJuKHJvdywgcm93T2Zmc2V0LCBjb3VudGVycywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICBpbnQzMl90IGJlc3RWYXJpYW5jZSA9IE1BWF9BVkdfVkFSSUFOQ0U7DQorICBpbnQzMl90IGJlc3RNYXRjaCA9IC0xOw0KKyAgaW50MzJfdCBtYXggPSBwYXR0ZXJuTGVuZ3RoOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCisgICAgaW50MzJfdCB2YXJpYW5jZSA9IFBhdHRlcm5NYXRjaFZhcmlhbmNlKGNvdW50ZXJzLCAmcGF0dGVybnNbaSAqIDRdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0lORElWSURVQUxfVkFSSUFOQ0UpOw0KKyAgICBpZiAodmFyaWFuY2UgPCBiZXN0VmFyaWFuY2UpIHsNCisgICAgICBiZXN0VmFyaWFuY2UgPSB2YXJpYW5jZTsNCisgICAgICBiZXN0TWF0Y2ggPSBpOw0KKyAgICB9DQorICB9DQorICBpZiAoYmVzdE1hdGNoID49IDApIHsNCisgICAgcmV0dXJuIGJlc3RNYXRjaDsNCisgIH0gZWxzZSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KICAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiAwOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVJlYWRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1SZWFkZXIuaAppbmRleCAyZTY0NGRlLi41YTZkZThkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVJlYWRlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltUmVhZGVyLmgKQEAgLTksMzEgKzksNTIgQEAKIGNsYXNzIENCQ19PbmVEUmVhZGVyOw0KIGNsYXNzIENCQ19Db21tb25CaXRBcnJheTsNCiBjbGFzcyBDQkNfT25lRGltUmVhZGVyOw0KLWNsYXNzIENCQ19PbmVEaW1SZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURSZWFkZXINCi17DQotcHJpdmF0ZToNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgTUFYX0FWR19WQVJJQU5DRTsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgTUFYX0lORElWSURVQUxfVkFSSUFOQ0U7DQorY2xhc3MgQ0JDX09uZURpbVJlYWRlciA6IHB1YmxpYyBDQkNfT25lRFJlYWRlciB7DQorIHByaXZhdGU6DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBNQVhfQVZHX1ZBUklBTkNFOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgTUFYX0lORElWSURVQUxfVkFSSUFOQ0U7DQogDQotICAgIEZYX0JPT0wgQ2hlY2tTdGFuZGFyZFVQQ0VBTkNoZWNrc3VtKENGWF9CeXRlU3RyaW5nICZzLCBpbnQzMl90ICZlKTsNCi1wdWJsaWM6DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFNUQVJUX0VORF9QQVRURVJOWzNdOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBNSURETEVfUEFUVEVSTls1XTsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgTF9QQVRURVJOU1sxMF1bNF07DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IExfQU5EX0dfUEFUVEVSTlNbMjBdWzRdOw0KLSAgICBDQkNfT25lRGltUmVhZGVyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19PbmVEaW1SZWFkZXIoKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSk7DQotICAgIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpzdGFydEd1YXJkUmFuZ2UsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX0ludDMyQXJyYXkgKkZpbmRTdGFydEd1YXJkUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgaW50MzJfdCAmZSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTCBDaGVja0NoZWNrc3VtKENGWF9CeXRlU3RyaW5nICZzLCBpbnQzMl90ICZlKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgKkZpbmRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIGludDMyX3Qgcm93T2Zmc2V0LCBGWF9CT09MIHdoaXRlRmlyc3QsIENGWF9JbnQzMkFycmF5ICpwYXR0ZXJuLCBpbnQzMl90ICZlKTsNCi0gICAgaW50MzJfdCBEZWNvZGVEaWdpdChDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgQ0ZYX0ludDMyQXJyYXkgKmNvdW50ZXJzLCBpbnQzMl90IHJvd09mZnNldCwgY29uc3QgaW50MzJfdCogcGF0dGVybnMsIGludDMyX3QgcGF0dGVybkxlbmd0aCwgaW50MzJfdCAmZSk7DQotICAgIHZpcnR1YWwgaW50MzJfdCBEZWNvZGVNaWRkbGUoQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpzdGFydFJhbmdlLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0UmVzdWx0LCBpbnQzMl90ICZlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIENGWF9JbnQzMkFycmF5ICpEZWNvZGVFbmQoQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIGludDMyX3QgZW5kU3RhcnQsIGludDMyX3QgJmUpOw0KKyAgRlhfQk9PTCBDaGVja1N0YW5kYXJkVVBDRUFOQ2hlY2tzdW0oQ0ZYX0J5dGVTdHJpbmcmIHMsIGludDMyX3QmIGUpOw0KKw0KKyBwdWJsaWM6DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBTVEFSVF9FTkRfUEFUVEVSTlszXTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IE1JRERMRV9QQVRURVJOWzVdOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgTF9QQVRURVJOU1sxMF1bNF07DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBMX0FORF9HX1BBVFRFUk5TWzIwXVs0XTsNCisgIENCQ19PbmVEaW1SZWFkZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19PbmVEaW1SZWFkZXIoKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBzdGFydEd1YXJkUmFuZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX0ludDMyQXJyYXkqIEZpbmRTdGFydEd1YXJkUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tDaGVja3N1bShDRlhfQnl0ZVN0cmluZyYgcywgaW50MzJfdCYgZSk7DQorICBDRlhfSW50MzJBcnJheSogRmluZEd1YXJkUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93T2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCB3aGl0ZUZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIGludDMyX3QgRGVjb2RlRGlnaXQoQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBjb3VudGVycywNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIHBhdHRlcm5zLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhdHRlcm5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCBpbnQzMl90IERlY29kZU1pZGRsZShDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHN0YXJ0UmFuZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHRSZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB2aXJ0dWFsIENGWF9JbnQzMkFycmF5KiBEZWNvZGVFbmQoQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmRTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmNwcAppbmRleCAzODJiODJhLi4wNmI3ZDc1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuY3BwCkBAIC0yNCwzOTIgKzI0LDQyMSBAQAogI2luY2x1ZGUgIi4uL0JDX1dyaXRlci5oIg0KICNpbmNsdWRlICIuLi9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQogI2luY2x1ZGUgIkJDX09uZURpbVdyaXRlci5oIg0KLUNCQ19PbmVEaW1Xcml0ZXI6OkNCQ19PbmVEaW1Xcml0ZXIoKQ0KLXsNCi0gICAgbV9sb2NUZXh0TG9jCQkJPSBCQ19URVhUX0xPQ19CRUxPV0VNQkVEOw0KLSAgICBtX2JQcmludENoZWNrc3VtCQk9IFRSVUU7DQotICAgIG1faURhdGFMZW50aAkJCT0gMDsNCi0gICAgbV9iQ2FsY0NoZWNrc3VtCQkJPSBGQUxTRTsNCi0gICAgbV9wRm9udAkJCQkJPSBOVUxMOw0KLSAgICBtX2ZGb250U2l6ZQkJCQk9IDEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOw0KLSAgICBtX2lGb250U3R5bGUJCQk9IDA7DQotICAgIG1fZm9udENvbG9yCQkJCT0gMHhmZjAwMDAwMDsNCi0gICAgbV9pQ29udGVudExlbgkJCT0gMDsNCi0gICAgbV9iTGVmdFBhZGRpbmcJCQk9IEZBTFNFOw0KLSAgICBtX2JSaWdodFBhZGRpbmcJCQk9IEZBTFNFOw0KLSAgICBtX291dHB1dCAgICAgICAgICAgICAgICA9IE5VTEw7DQorQ0JDX09uZURpbVdyaXRlcjo6Q0JDX09uZURpbVdyaXRlcigpIHsNCisgIG1fbG9jVGV4dExvYyA9IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQ7DQorICBtX2JQcmludENoZWNrc3VtID0gVFJVRTsNCisgIG1faURhdGFMZW50aCA9IDA7DQorICBtX2JDYWxjQ2hlY2tzdW0gPSBGQUxTRTsNCisgIG1fcEZvbnQgPSBOVUxMOw0KKyAgbV9mRm9udFNpemUgPSAxMDsNCisgIDsNCisgIG1faUZvbnRTdHlsZSA9IDA7DQorICBtX2ZvbnRDb2xvciA9IDB4ZmYwMDAwMDA7DQorICBtX2lDb250ZW50TGVuID0gMDsNCisgIG1fYkxlZnRQYWRkaW5nID0gRkFMU0U7DQorICBtX2JSaWdodFBhZGRpbmcgPSBGQUxTRTsNCisgIG1fb3V0cHV0ID0gTlVMTDsNCiB9DQotQ0JDX09uZURpbVdyaXRlcjo6fkNCQ19PbmVEaW1Xcml0ZXIoKQ0KLXsNCi0gICAgaWYgKG1fb3V0cHV0ICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBtX291dHB1dDsNCi0gICAgICAgIG1fb3V0cHV0ID0gTlVMTDsNCitDQkNfT25lRGltV3JpdGVyOjp+Q0JDX09uZURpbVdyaXRlcigpIHsNCisgIGlmIChtX291dHB1dCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX291dHB1dDsNCisgICAgbV9vdXRwdXQgPSBOVUxMOw0KKyAgfQ0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldFByaW50Q2hlY2tzdW0oRlhfQk9PTCBjaGVja3N1bSkgew0KKyAgbV9iUHJpbnRDaGVja3N1bSA9IGNoZWNrc3VtOw0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpIHsNCisgIG1faURhdGFMZW50aCA9IGxlbmd0aDsNCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXRDYWxjQ2hlY2tzdW0oaW50MzJfdCBzdGF0ZSkgew0KKyAgbV9iQ2FsY0NoZWNrc3VtID0gc3RhdGU7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZURpbVdyaXRlcjo6U2V0Rm9udChDRlhfRm9udCogY0ZvbnQpIHsNCisgIGlmIChjRm9udCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fcEZvbnQgPSBjRm9udDsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldEZvbnRTaXplKEZYX0ZMT0FUIHNpemUpIHsNCisgIG1fZkZvbnRTaXplID0gc2l6ZTsNCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSkgew0KKyAgbV9pRm9udFN0eWxlID0gc3R5bGU7DQorfQ0KK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpIHsNCisgIG1fZm9udENvbG9yID0gY29sb3I7DQorfQ0KK0ZYX1dDSEFSIENCQ19PbmVEaW1Xcml0ZXI6OlVwcGVyKEZYX1dDSEFSIGNoKSB7DQorICBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6Jykgew0KKyAgICBjaCA9IGNoIC0gKCdhJyAtICdBJyk7DQorICB9DQorICByZXR1cm4gY2g7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgdWludDhfdCogcmV0ID0gTlVMTDsNCisgIG91dEhlaWdodCA9IDE7DQorICBpZiAobV9XaWR0aCA+PSAyMCkgew0KKyAgICByZXQgPSBFbmNvZGUoY29udGVudHMsIG91dFdpZHRoLCBlKTsNCisgIH0gZWxzZSB7DQorICAgIHJldCA9IEVuY29kZShjb250ZW50cywgb3V0V2lkdGgsIGUpOw0KKyAgfQ0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHJldDsNCit9DQordWludDhfdCogQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICB1aW50OF90KiByZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcmV0Ow0KK30NCitpbnQzMl90IENCQ19PbmVEaW1Xcml0ZXI6OkFwcGVuZFBhdHRlcm4odWludDhfdCogdGFyZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogcGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0Q29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChzdGFydENvbG9yICE9IDAgJiYgc3RhcnRDb2xvciAhPSAxKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvblZhbHVlTXVzdEJlRWl0aGVyMG9yMTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB1aW50OF90IGNvbG9yID0gKHVpbnQ4X3Qpc3RhcnRDb2xvcjsNCisgIGludDMyX3QgbnVtQWRkZWQgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcGF0dGVybkxlbmd0aDsgaSsrKSB7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHBhdHRlcm5baV07IGorKykgew0KKyAgICAgIHRhcmdldFtwb3NdID0gY29sb3I7DQorICAgICAgcG9zICs9IDE7DQorICAgICAgbnVtQWRkZWQgKz0gMTsNCiAgICAgfQ0KKyAgICBjb2xvciBePSAxOw0KKyAgfQ0KKyAgcmV0dXJuIG51bUFkZGVkOw0KIH0NCi12b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldFByaW50Q2hlY2tzdW0oRlhfQk9PTCBjaGVja3N1bSkNCi17DQotICAgIG1fYlByaW50Q2hlY2tzdW0gPSBjaGVja3N1bTsNCi19DQotdm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKQ0KLXsNCi0gICAgbV9pRGF0YUxlbnRoID0gbGVuZ3RoOw0KLX0NCi12b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldENhbGNDaGVja3N1bShpbnQzMl90IHN0YXRlKQ0KLXsNCi0gICAgbV9iQ2FsY0NoZWNrc3VtID0gc3RhdGU7DQotfQ0KLUZYX0JPT0wJQ0JDX09uZURpbVdyaXRlcjo6U2V0Rm9udChDRlhfRm9udCAqIGNGb250KQ0KLXsNCi0gICAgaWYgKGNGb250ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX3BGb250ID0gY0ZvbnQ7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldEZvbnRTaXplKEZYX0ZMT0FUIHNpemUpDQotew0KLSAgICBtX2ZGb250U2l6ZSA9IHNpemU7DQotfQ0KLXZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpDQotew0KLSAgICBtX2lGb250U3R5bGUgPSBzdHlsZTsNCi19DQotdm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXRGb250Q29sb3IoRlhfQVJHQiBjb2xvcikNCi17DQotICAgIG1fZm9udENvbG9yID0gY29sb3I7DQotfQ0KLUZYX1dDSEFSIENCQ19PbmVEaW1Xcml0ZXI6OlVwcGVyKEZYX1dDSEFSIGNoKQ0KLXsNCi0gICAgaWYoY2ggPj0gJ2EnICYmIGNoIDw9ICd6Jykgew0KLSAgICAgICAgY2ggPSBjaCAtICgnYScgLSAnQScpOw0KLSAgICB9DQotICAgIHJldHVybiBjaDsNCi19DQotdWludDhfdCogQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgdWludDhfdCAqcmV0ID0gTlVMTDsNCi0gICAgb3V0SGVpZ2h0ID0gMTsNCi0gICAgaWYgKG1fV2lkdGggPj0gMjApIHsNCi0gICAgICAgIHJldCA9IEVuY29kZShjb250ZW50cywgb3V0V2lkdGgsIGUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBvdXRXaWR0aCwgZSk7DQotICAgIH0NCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gcmV0Ow0KLX0NCi11aW50OF90ICpDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgJmUpDQotew0KLSAgICB1aW50OF90ICpyZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgcmV0dXJuIHJldDsNCi19DQotaW50MzJfdCBDQkNfT25lRGltV3JpdGVyOjpBcHBlbmRQYXR0ZXJuKHVpbnQ4X3QqIHRhcmdldCwgaW50MzJfdCBwb3MsIGNvbnN0IGludDMyX3QqIHBhdHRlcm4gLCBpbnQzMl90IHBhdHRlcm5MZW5ndGgsIGludDMyX3Qgc3RhcnRDb2xvciwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChzdGFydENvbG9yICE9IDAgJiYgc3RhcnRDb2xvciAhPSAxKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25WYWx1ZU11c3RCZUVpdGhlcjBvcjE7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB1aW50OF90IGNvbG9yID0gKHVpbnQ4X3QpIHN0YXJ0Q29sb3I7DQotICAgIGludDMyX3QgbnVtQWRkZWQgPSAwOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwYXR0ZXJuTGVuZ3RoOyBpKyspIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHBhdHRlcm5baV07IGorKykgew0KLSAgICAgICAgICAgIHRhcmdldFtwb3NdID0gY29sb3I7DQotICAgICAgICAgICAgcG9zICs9IDE7DQotICAgICAgICAgICAgbnVtQWRkZWQgKz0gMTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNvbG9yIF49IDE7DQotICAgIH0NCi0gICAgcmV0dXJuIG51bUFkZGVkOw0KLX0NCi12b2lkIENCQ19PbmVEaW1Xcml0ZXI6OkNhbGNUZXh0SW5mbyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmdGV4dCwgRlhURVhUX0NIQVJQT1MgKmNoYXJQb3MsIENGWF9Gb250ICpjRm9udCwgRlhfRkxPQVQgZ2VXaWR0aCwgaW50MzJfdCBmb250U2l6ZSwgRlhfRkxPQVQgJmNoYXJzTGVuKQ0KLXsNCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OkNhbGNUZXh0SW5mbyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgdGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogY2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogY0ZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZ2VXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjaGFyc0xlbikgew0KICNpZmRlZiBGWEZNX0VOQ09ESU5HX05PTkUNCi0gICAgSUZYX0ZvbnRFbmNvZGluZ0V4KiBlbmNvZGluZyA9IEZYX0NyZWF0ZUZvbnRFbmNvZGluZ0V4KGNGb250KTsNCisgIElGWF9Gb250RW5jb2RpbmdFeCogZW5jb2RpbmcgPSBGWF9DcmVhdGVGb250RW5jb2RpbmdFeChjRm9udCk7DQogI2Vsc2UNCi0gICAgSUZYX0ZvbnRFbmNvZGluZyAqIGVuY29kaW5nID0gRlhHRV9DcmVhdGVVbmljb2RlRW5jb2RpbmcoY0ZvbnQpOw0KKyAgSUZYX0ZvbnRFbmNvZGluZyogZW5jb2RpbmcgPSBGWEdFX0NyZWF0ZVVuaWNvZGVFbmNvZGluZyhjRm9udCk7DQogI2VuZGlmDQotICAgIGludDMyX3QgbGVuZ3RoID0gdGV4dC5HZXRMZW5ndGgoKTsNCi0gICAgRlhfRFdPUkQgKnBDaGFyQ29kZSA9IEZYX0FsbG9jKEZYX0RXT1JELCB0ZXh0LkdldExlbmd0aCgpKTsNCi0gICAgRlhfRkxPQVQgY2hhcldpZHRoID0gMDsNCi0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgdGV4dC5HZXRMZW5ndGgoKTsgaisrKSB7DQotICAgICAgICBwQ2hhckNvZGVbal0gPSBlbmNvZGluZy0+Q2hhckNvZGVGcm9tVW5pY29kZSh0ZXh0W2pdKTsNCi0gICAgICAgIGludDMyX3QgZ2x5cF9jb2RlID0gZW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHBDaGFyQ29kZVtqXSk7DQotICAgICAgICBpbnQzMl90IGdseXBfdmFsdWUgPSBjRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwX2NvZGUpOw0KLSAgICAgICAgRlhfRkxPQVQgdGVtcCA9IChGWF9GTE9BVCkoKGdseXBfdmFsdWUpICogZm9udFNpemUgLyAxMDAwLjApOw0KLSAgICAgICAgY2hhcldpZHRoICs9IHRlbXA7DQotICAgIH0NCi0gICAgY2hhcnNMZW4gPSBjaGFyV2lkdGg7DQotICAgIEZYX0ZMT0FUIGxlZnRQb3NpdG9uID0gKEZYX0ZMT0FUKShnZVdpZHRoIC0gY2hhcnNMZW4pIC8gMi4wZjsNCi0gICAgaWYgKGxlZnRQb3NpdG9uIDwgMCAmJiBnZVdpZHRoID09IDApIHsNCi0gICAgICAgIGxlZnRQb3NpdG9uID0gMDsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBwZW5YID0gMC4wOw0KLSAgICBGWF9GTE9BVCBwZW5ZID0gKEZYX0ZMT0FUKUZYU1lTX2FicyhjRm9udC0+R2V0RGVzY2VudCgpKSAqIChGWF9GTE9BVClmb250U2l6ZSAvIDEwMDAuMGY7DQotICAgIEZYX0ZMT0FUIGxlZnQgPSBsZWZ0UG9zaXRvbjsNCi0gICAgRlhfRkxPQVQgdG9wICA9IDAuMDsNCi0gICAgY2hhclBvc1swXS5tX09yaWdpblggPSBwZW5YICsgbGVmdDsNCi0gICAgY2hhclBvc1swXS5tX09yaWdpblkgPSBwZW5ZICsgdG9wOw0KLSAgICBjaGFyUG9zWzBdLm1fR2x5cGhJbmRleCA9IGVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShwQ2hhckNvZGVbMF0pOw0KLSAgICBjaGFyUG9zWzBdLm1fRm9udENoYXJXaWR0aCA9IGNGb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbMF0ubV9HbHlwaEluZGV4KTsNCi0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfDQotICAgIGNoYXJQb3NbMF0ubV9FeHRHSUQgPSBjaGFyUG9zWzBdLm1fR2x5cGhJbmRleDsNCisgIGludDMyX3QgbGVuZ3RoID0gdGV4dC5HZXRMZW5ndGgoKTsNCisgIEZYX0RXT1JEKiBwQ2hhckNvZGUgPSBGWF9BbGxvYyhGWF9EV09SRCwgdGV4dC5HZXRMZW5ndGgoKSk7DQorICBGWF9GTE9BVCBjaGFyV2lkdGggPSAwOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgdGV4dC5HZXRMZW5ndGgoKTsgaisrKSB7DQorICAgIHBDaGFyQ29kZVtqXSA9IGVuY29kaW5nLT5DaGFyQ29kZUZyb21Vbmljb2RlKHRleHRbal0pOw0KKyAgICBpbnQzMl90IGdseXBfY29kZSA9IGVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShwQ2hhckNvZGVbal0pOw0KKyAgICBpbnQzMl90IGdseXBfdmFsdWUgPSBjRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwX2NvZGUpOw0KKyAgICBGWF9GTE9BVCB0ZW1wID0gKEZYX0ZMT0FUKSgoZ2x5cF92YWx1ZSkqZm9udFNpemUgLyAxMDAwLjApOw0KKyAgICBjaGFyV2lkdGggKz0gdGVtcDsNCisgIH0NCisgIGNoYXJzTGVuID0gY2hhcldpZHRoOw0KKyAgRlhfRkxPQVQgbGVmdFBvc2l0b24gPSAoRlhfRkxPQVQpKGdlV2lkdGggLSBjaGFyc0xlbikgLyAyLjBmOw0KKyAgaWYgKGxlZnRQb3NpdG9uIDwgMCAmJiBnZVdpZHRoID09IDApIHsNCisgICAgbGVmdFBvc2l0b24gPSAwOw0KKyAgfQ0KKyAgRlhfRkxPQVQgcGVuWCA9IDAuMDsNCisgIEZYX0ZMT0FUIHBlblkgPQ0KKyAgICAgIChGWF9GTE9BVClGWFNZU19hYnMoY0ZvbnQtPkdldERlc2NlbnQoKSkgKiAoRlhfRkxPQVQpZm9udFNpemUgLyAxMDAwLjBmOw0KKyAgRlhfRkxPQVQgbGVmdCA9IGxlZnRQb3NpdG9uOw0KKyAgRlhfRkxPQVQgdG9wID0gMC4wOw0KKyAgY2hhclBvc1swXS5tX09yaWdpblggPSBwZW5YICsgbGVmdDsNCisgIGNoYXJQb3NbMF0ubV9PcmlnaW5ZID0gcGVuWSArIHRvcDsNCisgIGNoYXJQb3NbMF0ubV9HbHlwaEluZGV4ID0gZW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHBDaGFyQ29kZVswXSk7DQorICBjaGFyUG9zWzBdLm1fRm9udENoYXJXaWR0aCA9IGNGb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbMF0ubV9HbHlwaEluZGV4KTsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8NCisgIGNoYXJQb3NbMF0ubV9FeHRHSUQgPSBjaGFyUG9zWzBdLm1fR2x5cGhJbmRleDsNCiAjZW5kaWYNCi0gICAgcGVuWCArPSAoRlhfRkxPQVQpKGNoYXJQb3NbMF0ubV9Gb250Q2hhcldpZHRoKSAqIChGWF9GTE9BVClmb250U2l6ZSAvIDEwMDAuMGY7DQotICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7DQotICAgICAgICBjaGFyUG9zW2ldLm1fT3JpZ2luWCA9IHBlblggKyBsZWZ0Ow0KLSAgICAgICAgY2hhclBvc1tpXS5tX09yaWdpblkgPSBwZW5ZICsgdG9wOw0KLSAgICAgICAgY2hhclBvc1tpXS5tX0dseXBoSW5kZXggPSBlbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUocENoYXJDb2RlW2ldKTsNCi0gICAgICAgIGNoYXJQb3NbaV0ubV9Gb250Q2hhcldpZHRoID0gY0ZvbnQtPkdldEdseXBoV2lkdGgoY2hhclBvc1tpXS5tX0dseXBoSW5kZXgpOw0KLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8NCi0gICAgICAgIGNoYXJQb3NbaV0ubV9FeHRHSUQgPSBjaGFyUG9zW2ldLm1fR2x5cGhJbmRleDsNCisgIHBlblggKz0gKEZYX0ZMT0FUKShjaGFyUG9zWzBdLm1fRm9udENoYXJXaWR0aCkgKiAoRlhfRkxPQVQpZm9udFNpemUgLyAxMDAwLjBmOw0KKyAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsNCisgICAgY2hhclBvc1tpXS5tX09yaWdpblggPSBwZW5YICsgbGVmdDsNCisgICAgY2hhclBvc1tpXS5tX09yaWdpblkgPSBwZW5ZICsgdG9wOw0KKyAgICBjaGFyUG9zW2ldLm1fR2x5cGhJbmRleCA9IGVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShwQ2hhckNvZGVbaV0pOw0KKyAgICBjaGFyUG9zW2ldLm1fRm9udENoYXJXaWR0aCA9IGNGb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4KTsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8NCisgICAgY2hhclBvc1tpXS5tX0V4dEdJRCA9IGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4Ow0KICNlbmRpZg0KLSAgICAgICAgcGVuWCArPSAoRlhfRkxPQVQpKGNoYXJQb3NbaV0ubV9Gb250Q2hhcldpZHRoKSAqIChGWF9GTE9BVClmb250U2l6ZSAvIDEwMDAuMGY7DQotICAgIH0NCi0gICAgRlhfRnJlZSAocENoYXJDb2RlKTsNCi0gICAgZGVsZXRlIGVuY29kaW5nOw0KLSAgICBlbmNvZGluZyA9IE5VTEw7DQorICAgIHBlblggKz0NCisgICAgICAgIChGWF9GTE9BVCkoY2hhclBvc1tpXS5tX0ZvbnRDaGFyV2lkdGgpICogKEZYX0ZMT0FUKWZvbnRTaXplIC8gMTAwMC4wZjsNCisgIH0NCisgIEZYX0ZyZWUocENoYXJDb2RlKTsNCisgIGRlbGV0ZSBlbmNvZGluZzsNCisgIGVuY29kaW5nID0gTlVMTDsNCiB9DQotdm9pZCBDQkNfT25lRGltV3JpdGVyOjpTaG93RGV2aWNlQ2hhcnMoQ0ZYX1JlbmRlckRldmljZSAqZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwgRlhfRkxPQVQgZ2VXaWR0aCwgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBGWF9GTE9BVCBsb2NYLCBGWF9GTE9BVCBsb2NZLCAgaW50MzJfdCBiYXJXaWR0aCkNCi17DQotICAgIGludDMyX3QgaUZvbnRTaXplID0gKGludDMyX3QpZmFicyhtX2ZGb250U2l6ZSk7DQotICAgIGludDMyX3QgaVRleHRIZWlnaHQgPSBpRm9udFNpemUgKyAxOw0KLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QoKEZYX0ZMT0FUKWxvY1gsIChGWF9GTE9BVClsb2NZLCAoRlhfRkxPQVQpKGxvY1ggKyBnZVdpZHRoKSwgKEZYX0ZMT0FUKShsb2NZICsgaVRleHRIZWlnaHQpKTsNCi0gICAgaWYgKGdlV2lkdGggIT0gbV9XaWR0aCkgew0KLSAgICAgICAgcmVjdC5yaWdodCAtPSAxOw0KLSAgICB9DQotICAgIG1hdHJpeC0+VHJhbnNmb3JtUmVjdChyZWN0KTsNCi0gICAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0dGVyUmVjdCgpOw0KLSAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KLSAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgoMS4wLCAwLjAsIDAuMCwgLTEuMCwgKEZYX0ZMT0FUKWxvY1gsIChGWF9GTE9BVCkobG9jWSArIGlGb250U2l6ZSkpOw0KLSAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCi0gICAgICAgIGFmZmluZV9tYXRyaXguQ29uY2F0KCptYXRyaXgpOw0KLSAgICB9DQotICAgIEZYX0JPT0wgcmV0ID0gZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChzdHIuR2V0TGVuZ3RoKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNob3dEZXZpY2VDaGFycyhDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBnZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxvY1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCkgew0KKyAgaW50MzJfdCBpRm9udFNpemUgPSAoaW50MzJfdClmYWJzKG1fZkZvbnRTaXplKTsNCisgIGludDMyX3QgaVRleHRIZWlnaHQgPSBpRm9udFNpemUgKyAxOw0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0KChGWF9GTE9BVClsb2NYLCAoRlhfRkxPQVQpbG9jWSwgKEZYX0ZMT0FUKShsb2NYICsgZ2VXaWR0aCksDQorICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShsb2NZICsgaVRleHRIZWlnaHQpKTsNCisgIGlmIChnZVdpZHRoICE9IG1fV2lkdGgpIHsNCisgICAgcmVjdC5yaWdodCAtPSAxOw0KKyAgfQ0KKyAgbWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJlY3QpOw0KKyAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0dGVyUmVjdCgpOw0KKyAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgIENGWF9NYXRyaXggYWZmaW5lX21hdHJpeCgxLjAsIDAuMCwgMC4wLCAtMS4wLCAoRlhfRkxPQVQpbG9jWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGxvY1kgKyBpRm9udFNpemUpKTsNCisgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICBhZmZpbmVfbWF0cml4LkNvbmNhdCgqbWF0cml4KTsNCisgIH0NCisgIEZYX0JPT0wgcmV0ID0gZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dCgNCisgICAgICBzdHIuR2V0TGVuZ3RoKCksIHBDaGFyUG9zLCBtX3BGb250LCBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplLCAoQ0ZYX0FmZmluZU1hdHJpeCopJmFmZmluZV9tYXRyaXgsIG1fZm9udENvbG9yLA0KKyAgICAgIEZYVEVYVF9DTEVBUlRZUEUpOw0KIH0NCi12b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNob3dCaXRtYXBDaGFycyhDRlhfRElCaXRtYXAgKnBPdXRCaXRtYXAsIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwgRlhfRkxPQVQgZ2VXaWR0aCwgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBGWF9GTE9BVCBsb2NYLCBGWF9GTE9BVCBsb2NZLCBpbnQzMl90IGJhcldpZHRoKQ0KLXsNCi0gICAgaW50MzJfdCBpRm9udFNpemUgPSAoaW50MzJfdClmYWJzKG1fZkZvbnRTaXplKTsNCi0gICAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7DQotICAgIENGWF9GeGdlRGV2aWNlIGdlOw0KLSAgICBnZS5DcmVhdGUoKGludClnZVdpZHRoLCBpVGV4dEhlaWdodCAsIG1fY29sb3JTcGFjZSk7DQotICAgIEZYX1JFQ1QgZ2VSZWN0KDAsIDAsIChpbnQpZ2VXaWR0aCwgaVRleHRIZWlnaHQpOw0KLSAgICBnZS5GaWxsUmVjdCgmZ2VSZWN0LCBtX2JhY2tncm91bmRDb2xvcik7DQotICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeCgxLjAsIDAuMCwgMC4wLCAtMS4wLCAwLjAsIChGWF9GTE9BVClpRm9udFNpemUpOw0KLSAgICBGWF9CT09MIHJldCA9IGdlLkRyYXdOb3JtYWxUZXh0KHN0ci5HZXRMZW5ndGgoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgJmFmZmluZV9tYXRyaXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KLSAgICBDRlhfRnhnZURldmljZSBnZUJpdG1hcDsNCi0gICAgZ2VCaXRtYXAuQXR0YWNoKHBPdXRCaXRtYXApOw0KLSAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIChpbnQpbG9jWCwgKGludClsb2NZKTsNCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNob3dCaXRtYXBDaGFycyhDRlhfRElCaXRtYXAqIHBPdXRCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgc3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGdlV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxvY1gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbG9jWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoKSB7DQorICBpbnQzMl90IGlGb250U2l6ZSA9IChpbnQzMl90KWZhYnMobV9mRm9udFNpemUpOw0KKyAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7DQorICBDRlhfRnhnZURldmljZSBnZTsNCisgIGdlLkNyZWF0ZSgoaW50KWdlV2lkdGgsIGlUZXh0SGVpZ2h0LCBtX2NvbG9yU3BhY2UpOw0KKyAgRlhfUkVDVCBnZVJlY3QoMCwgMCwgKGludClnZVdpZHRoLCBpVGV4dEhlaWdodCk7DQorICBnZS5GaWxsUmVjdCgmZ2VSZWN0LCBtX2JhY2tncm91bmRDb2xvcik7DQorICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgoMS4wLCAwLjAsIDAuMCwgLTEuMCwgMC4wLCAoRlhfRkxPQVQpaUZvbnRTaXplKTsNCisgIEZYX0JPT0wgcmV0ID0gZ2UuRHJhd05vcm1hbFRleHQoDQorICAgICAgc3RyLkdldExlbmd0aCgpLCBwQ2hhclBvcywgbV9wRm9udCwgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSwgKENGWF9BZmZpbmVNYXRyaXgqKSZhZmZpbmVfbWF0cml4LCBtX2ZvbnRDb2xvciwNCisgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgIENGWF9GeGdlRGV2aWNlIGdlQml0bWFwOw0KKyAgZ2VCaXRtYXAuQXR0YWNoKHBPdXRCaXRtYXApOw0KKyAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCAoaW50KWxvY1gsIChpbnQpbG9jWSk7DQogfQ0KLXZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2hvd0NoYXJzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIENGWF9ESUJpdG1hcCAqcE91dEJpdG1hcCwgQ0ZYX1JlbmRlckRldmljZSAqZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsIGludDMyX3QgYmFyV2lkdGgsIGludDMyX3QgbXVsdGlwbGUsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoZGV2aWNlID09IE5VTEwgJiYgcE91dEJpdG1hcCA9PSBOVUxMKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQotICAgICAgICByZXR1cm47DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPdXRCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGRldmljZSA9PSBOVUxMICYmIHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX3BGb250ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IEZYX1VURjhFbmNvZGUoY29udGVudHMpOw0KKyAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOw0KKyAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW4pOw0KKyAgaWYgKCFwQ2hhclBvcykgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWFNZU19tZW1zZXQocENoYXJQb3MsIDAsIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBpTGVuKTsNCisgIEZYX0ZMT0FUIGNoYXJzTGVuID0gMDsNCisgIEZYX0ZMT0FUIGdlV2lkdGggPSAwOw0KKyAgaWYgKG1fbG9jVGV4dExvYyA9PSBCQ19URVhUX0xPQ19BQk9WRUVNQkVEIHx8DQorICAgICAgbV9sb2NUZXh0TG9jID09IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQpIHsNCisgICAgZ2VXaWR0aCA9IDA7DQorICB9IGVsc2UgaWYgKG1fbG9jVGV4dExvYyA9PSBCQ19URVhUX0xPQ19BQk9WRSB8fA0KKyAgICAgICAgICAgICBtX2xvY1RleHRMb2MgPT0gQkNfVEVYVF9MT0NfQkVMT1cpIHsNCisgICAgZ2VXaWR0aCA9IChGWF9GTE9BVCliYXJXaWR0aDsNCisgIH0NCisgIGludDMyX3QgaUZvbnRTaXplID0gKGludDMyX3QpZmFicyhtX2ZGb250U2l6ZSk7DQorICBpbnQzMl90IGlUZXh0SGVpZ2h0ID0gaUZvbnRTaXplICsgMTsNCisgIENhbGNUZXh0SW5mbyhzdHIsIHBDaGFyUG9zLCBtX3BGb250LCBnZVdpZHRoLCBpRm9udFNpemUsIGNoYXJzTGVuKTsNCisgIGlmIChjaGFyc0xlbiA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBsb2NYID0gMDsNCisgIGludDMyX3QgbG9jWSA9IDA7DQorICBzd2l0Y2ggKG1fbG9jVGV4dExvYykgew0KKyAgICBjYXNlIEJDX1RFWFRfTE9DX0FCT1ZFRU1CRUQ6DQorICAgICAgbG9jWCA9IChpbnQzMl90KShiYXJXaWR0aCAtIGNoYXJzTGVuKSAvIDI7DQorICAgICAgbG9jWSA9IDA7DQorICAgICAgZ2VXaWR0aCA9IGNoYXJzTGVuOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEJDX1RFWFRfTE9DX0FCT1ZFOg0KKyAgICAgIGxvY1ggPSAwOw0KKyAgICAgIGxvY1kgPSAwOw0KKyAgICAgIGdlV2lkdGggPSAoRlhfRkxPQVQpYmFyV2lkdGg7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgQkNfVEVYVF9MT0NfQkVMT1dFTUJFRDoNCisgICAgICBsb2NYID0gKGludDMyX3QpKGJhcldpZHRoIC0gY2hhcnNMZW4pIC8gMjsNCisgICAgICBsb2NZID0gbV9IZWlnaHQgLSBpVGV4dEhlaWdodDsNCisgICAgICBnZVdpZHRoID0gY2hhcnNMZW47DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgQkNfVEVYVF9MT0NfQkVMT1c6DQorICAgIGRlZmF1bHQ6DQorICAgICAgbG9jWCA9IDA7DQorICAgICAgbG9jWSA9IG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQ7DQorICAgICAgZ2VXaWR0aCA9IChGWF9GTE9BVCliYXJXaWR0aDsNCisgICAgICBicmVhazsNCisgIH0NCisgIGlmIChkZXZpY2UgIT0gTlVMTCkgew0KKyAgICBTaG93RGV2aWNlQ2hhcnMoZGV2aWNlLCBtYXRyaXgsIHN0ciwgZ2VXaWR0aCwgcENoYXJQb3MsIChGWF9GTE9BVClsb2NYLA0KKyAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWxvY1ksIGJhcldpZHRoKTsNCisgIH0gZWxzZSB7DQorICAgIFNob3dCaXRtYXBDaGFycyhwT3V0Qml0bWFwLCBzdHIsIGdlV2lkdGgsIHBDaGFyUG9zLCAoRlhfRkxPQVQpbG9jWCwNCisgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClsb2NZLCBiYXJXaWR0aCk7DQorICB9DQorICBGWF9GcmVlKHBDaGFyUG9zKTsNCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJCaXRtYXBSZXN1bHQoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtX291dHB1dCA9PSBOVUxMKSB7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgcE91dEJpdG1hcCA9IENyZWF0ZURJQml0bWFwKG1fb3V0cHV0LT5HZXRXaWR0aCgpLCBtX291dHB1dC0+R2V0SGVpZ2h0KCkpOw0KKyAgcE91dEJpdG1hcC0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgaWYgKCFwT3V0Qml0bWFwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkZhaWxUb0NyZWF0ZUJpdG1hcDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbV9vdXRwdXQtPkdldFdpZHRoKCk7IHgrKykgew0KKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCk7IHkrKykgew0KKyAgICAgIGlmIChtX291dHB1dC0+R2V0KHgsIHkpKSB7DQorICAgICAgICBwT3V0Qml0bWFwLT5TZXRQaXhlbCh4LCB5LCBtX2JhckNvbG9yKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKG1fcEZvbnQgPT0gTlVMTCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQotICAgICAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yICg7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKQ0KKyAgICBpZiAoY29udGVudHMuR2V0QXQoaSkgIT0gJyAnKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gRlhfVVRGOEVuY29kZShjb250ZW50cyk7DQotICAgIGludDMyX3QgaUxlbiA9IHN0ci5HZXRMZW5ndGgoKTsNCi0gICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW4pOw0KLSAgICBpZiAoIXBDaGFyUG9zKSB7DQotICAgICAgICByZXR1cm47DQorICBpZiAobV9sb2NUZXh0TG9jICE9IEJDX1RFWFRfTE9DX05PTkUgJiYgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpKSB7DQorICAgIFNob3dDaGFycyhjb250ZW50cywgcE91dEJpdG1hcCwgTlVMTCwgTlVMTCwgbV9iYXJXaWR0aCwgbV9tdWx0aXBsZSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaEJpdG1hcCA9IHBPdXRCaXRtYXAtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7DQorICBpZiAocE91dEJpdG1hcCkgew0KKyAgICBkZWxldGUgcE91dEJpdG1hcDsNCisgIH0NCisgIHBPdXRCaXRtYXAgPSBwU3RyZXRjaEJpdG1hcDsNCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtX291dHB1dCA9PSBOVUxMKSB7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIHN0YXRlRGF0YTsNCisgIENGWF9QYXRoRGF0YSBwYXRoOw0KKyAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIChGWF9GTE9BVCltX1dpZHRoLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgZGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgbWF0cml4LCAmc3RhdGVEYXRhLCBtX2JhY2tncm91bmRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgbV9iYWNrZ3JvdW5kQ29sb3IsIEZYRklMTF9BTFRFUk5BVEUpOw0KKyAgQ0ZYX01hdHJpeCBtYXRyaShtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIChGWF9GTE9BVCltX0hlaWdodCwgMC4wLCAwLjApOw0KKyAgbWF0cmkuQ29uY2F0KCptYXRyaXgpOw0KKyAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbV9vdXRwdXQtPkdldFdpZHRoKCk7IHgrKykgew0KKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCk7IHkrKykgew0KKyAgICAgIENGWF9QYXRoRGF0YSByZWN0Ow0KKyAgICAgIHJlY3QuQXBwZW5kUmVjdCgoRlhfRkxPQVQpeCwgKEZYX0ZMT0FUKXksIChGWF9GTE9BVCkoeCArIDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKHkgKyAxKSk7DQorICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIHN0YXRlRGF0YTsNCisgICAgICBpZiAobV9vdXRwdXQtPkdldCh4LCB5KSkgew0KKyAgICAgICAgZGV2aWNlLT5EcmF3UGF0aCgmcmVjdCwgJm1hdHJpLCAmc3RhdGVEYXRhLCBtX2JhckNvbG9yLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORyk7DQorICAgICAgfQ0KICAgICB9DQotICAgIEZYU1lTX21lbXNldChwQ2hhclBvcywgMCwgc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSAqIGlMZW4pOw0KLSAgICBGWF9GTE9BVCBjaGFyc0xlbiA9IDA7DQotICAgIEZYX0ZMT0FUIGdlV2lkdGggPSAwOw0KLSAgICBpZiAoIG1fbG9jVGV4dExvYyA9PSBCQ19URVhUX0xPQ19BQk9WRUVNQkVEIHx8DQotICAgICAgICAgICAgbV9sb2NUZXh0TG9jID09IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQgKSB7DQotICAgICAgICBnZVdpZHRoID0gMDsNCi0gICAgfSBlbHNlIGlmICggbV9sb2NUZXh0TG9jID09IEJDX1RFWFRfTE9DX0FCT1ZFIHx8DQotICAgICAgICAgICAgICAgIG1fbG9jVGV4dExvYyA9PSBCQ19URVhUX0xPQ19CRUxPVyApIHsNCi0gICAgICAgIGdlV2lkdGggPSAoRlhfRkxPQVQpYmFyV2lkdGg7DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yICg7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKQ0KKyAgICBpZiAoY29udGVudHMuR2V0QXQoaSkgIT0gJyAnKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaW50MzJfdCBpRm9udFNpemUgPSAoaW50MzJfdClmYWJzKG1fZkZvbnRTaXplKTsNCi0gICAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7DQotICAgIENhbGNUZXh0SW5mbyhzdHIsIHBDaGFyUG9zLCBtX3BGb250LCBnZVdpZHRoLCBpRm9udFNpemUsIGNoYXJzTGVuKTsNCi0gICAgaWYgKGNoYXJzTGVuIDwgMSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgbG9jWCA9IDA7DQotICAgIGludDMyX3QgbG9jWSA9IDA7DQotICAgIHN3aXRjaCAobV9sb2NUZXh0TG9jKSB7DQotICAgICAgICBjYXNlIEJDX1RFWFRfTE9DX0FCT1ZFRU1CRUQ6DQotICAgICAgICAgICAgbG9jWCA9IChpbnQzMl90KShiYXJXaWR0aCAtIGNoYXJzTGVuKSAvIDI7DQotICAgICAgICAgICAgbG9jWSA9IDA7DQotICAgICAgICAgICAgZ2VXaWR0aCA9IGNoYXJzTGVuOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBCQ19URVhUX0xPQ19BQk9WRToNCi0gICAgICAgICAgICBsb2NYID0gMDsNCi0gICAgICAgICAgICBsb2NZID0gMDsNCi0gICAgICAgICAgICBnZVdpZHRoID0gKEZYX0ZMT0FUKWJhcldpZHRoOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBCQ19URVhUX0xPQ19CRUxPV0VNQkVEOg0KLSAgICAgICAgICAgIGxvY1ggPSAoaW50MzJfdCkoYmFyV2lkdGggLSBjaGFyc0xlbikgLyAyOw0KLSAgICAgICAgICAgIGxvY1kgPSBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0Ow0KLSAgICAgICAgICAgIGdlV2lkdGggPSBjaGFyc0xlbjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgQkNfVEVYVF9MT0NfQkVMT1c6DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGxvY1ggPSAwOw0KLSAgICAgICAgICAgIGxvY1kgPSBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0Ow0KLSAgICAgICAgICAgIGdlV2lkdGggPSAoRlhfRkxPQVQpYmFyV2lkdGg7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgaWYgKGRldmljZSAhPSBOVUxMKSB7DQotICAgICAgICBTaG93RGV2aWNlQ2hhcnMoZGV2aWNlLCBtYXRyaXgsIHN0ciwgZ2VXaWR0aCwgcENoYXJQb3MsIChGWF9GTE9BVClsb2NYLCAoRlhfRkxPQVQpbG9jWSwgYmFyV2lkdGgpOw0KKyAgaWYgKG1fbG9jVGV4dExvYyAhPSBCQ19URVhUX0xPQ19OT05FICYmIGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKSkgew0KKyAgICBTaG93Q2hhcnMoY29udGVudHMsIE5VTEwsIGRldmljZSwgbWF0cml4LCBtX2JhcldpZHRoLCBtX211bHRpcGxlLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY29kZUxlbmd0aCA8IDEpIHsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpZiAobV9Nb2R1bGVIZWlnaHQgPCAyMC4wKSB7DQorICAgIG1fTW9kdWxlSGVpZ2h0ID0gMjA7DQorICB9DQorICBpbnQzMl90IGNvZGVPbGRMZW5ndGggPSBjb2RlTGVuZ3RoOw0KKyAgaW50MzJfdCBsZWZ0UGFkZGluZyA9IDA7DQorICBpbnQzMl90IHJpZ2h0UGFkZGluZyA9IDA7DQorICBpZiAobV9iTGVmdFBhZGRpbmcpIHsNCisgICAgbGVmdFBhZGRpbmcgPSA3Ow0KKyAgfQ0KKyAgaWYgKG1fYlJpZ2h0UGFkZGluZykgew0KKyAgICByaWdodFBhZGRpbmcgPSA3Ow0KKyAgfQ0KKyAgY29kZUxlbmd0aCArPSBsZWZ0UGFkZGluZzsNCisgIGNvZGVMZW5ndGggKz0gcmlnaHRQYWRkaW5nOw0KKyAgbV9vdXRwdXRIU2NhbGUgPSAxLjA7DQorICBpZiAobV9XaWR0aCA+IDApIHsNCisgICAgbV9vdXRwdXRIU2NhbGUgPSAoRlhfRkxPQVQpbV9XaWR0aCAvIChGWF9GTE9BVCljb2RlTGVuZ3RoOw0KKyAgfQ0KKyAgaWYgKCFpc0RldmljZSkgew0KKyAgICBtX291dHB1dEhTY2FsZSA9IEZYX01BWChtX291dHB1dEhTY2FsZSwgbV9Nb2R1bGVXaWR0aCk7DQorICB9DQorICBGWF9GTE9BVCBkYXRhTGVuZ3RoU2NhbGUgPSAxLjA7DQorICBpZiAobV9pRGF0YUxlbnRoID4gMCAmJiBjb250ZW50cy5HZXRMZW5ndGgoKSAhPSAwKSB7DQorICAgIGRhdGFMZW5ndGhTY2FsZSA9IEZYX0ZMT0FUKGNvbnRlbnRzLkdldExlbmd0aCgpKSAvIEZYX0ZMT0FUKG1faURhdGFMZW50aCk7DQorICB9DQorICBpZiAobV9pRGF0YUxlbnRoID4gMCAmJiBjb250ZW50cy5HZXRMZW5ndGgoKSA9PSAwKSB7DQorICAgIGRhdGFMZW5ndGhTY2FsZSA9IEZYX0ZMT0FUKDEpIC8gRlhfRkxPQVQobV9pRGF0YUxlbnRoKTsNCisgIH0NCisgIG1fbXVsdGlwbGUgPSAxOw0KKyAgaWYgKCFpc0RldmljZSkgew0KKyAgICBtX211bHRpcGxlID0gKGludDMyX3QpY2VpbChtX291dHB1dEhTY2FsZSAqIGRhdGFMZW5ndGhTY2FsZSk7DQorICB9DQorICBpbnQzMl90IG91dHB1dEhlaWdodCA9IDE7DQorICBpZiAoIWlzRGV2aWNlKSB7DQorICAgIGlmIChtX0hlaWdodCA9PSAwKSB7DQorICAgICAgb3V0cHV0SGVpZ2h0ID0gRlhfTUFYKDIwLCBtX01vZHVsZUhlaWdodCk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBTaG93Qml0bWFwQ2hhcnMocE91dEJpdG1hcCwgc3RyLCBnZVdpZHRoLCBwQ2hhclBvcywgKEZYX0ZMT0FUKWxvY1gsIChGWF9GTE9BVClsb2NZLCBiYXJXaWR0aCk7DQorICAgICAgb3V0cHV0SGVpZ2h0ID0gbV9IZWlnaHQ7DQogICAgIH0NCi0gICAgRlhfRnJlZShwQ2hhclBvcyk7DQotfQ0KLXZvaWQgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyQml0bWFwUmVzdWx0KENGWF9ESUJpdG1hcCAqJnBPdXRCaXRtYXAsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAobV9vdXRwdXQgPT0gTlVMTCkgew0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpbnQzMl90IG91dHB1dFdpZHRoID0gY29kZUxlbmd0aDsNCisgIGlmICghaXNEZXZpY2UpIHsNCisgICAgb3V0cHV0V2lkdGggPSAoaW50MzJfdCkoY29kZUxlbmd0aCAqIG1fbXVsdGlwbGUgLyBkYXRhTGVuZ3RoU2NhbGUpOw0KKyAgfQ0KKyAgbV9iYXJXaWR0aCA9IG1fV2lkdGg7DQorICBpZiAoIWlzRGV2aWNlKSB7DQorICAgIG1fYmFyV2lkdGggPSBjb2RlTGVuZ3RoICogbV9tdWx0aXBsZTsNCisgIH0NCisgIG1fb3V0cHV0ID0gRlhfTkVXIENCQ19Db21tb25CaXRNYXRyaXg7DQorICBtX291dHB1dC0+SW5pdChvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsNCisgIGludDMyX3Qgb3V0cHV0WCA9IGxlZnRQYWRkaW5nICogbV9tdWx0aXBsZTsNCisgIGZvciAoaW50MzJfdCBpbnB1dFggPSAwOyBpbnB1dFggPCBjb2RlT2xkTGVuZ3RoOyBpbnB1dFgrKykgew0KKyAgICBpZiAoY29kZVtpbnB1dFhdID09IDEpIHsNCisgICAgICBpZiAob3V0cHV0WCA+PSBvdXRwdXRXaWR0aCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChvdXRwdXRYICsgbV9tdWx0aXBsZSA+IG91dHB1dFdpZHRoICYmIG91dHB1dFdpZHRoIC0gb3V0cHV0WCA+IDApIHsNCisgICAgICAgIG1fb3V0cHV0LT5TZXRSZWdpb24ob3V0cHV0WCwgMCwgb3V0cHV0V2lkdGggLSBvdXRwdXRYLCBvdXRwdXRIZWlnaHQsIGUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIG1fb3V0cHV0LT5TZXRSZWdpb24ob3V0cHV0WCwgMCwgbV9tdWx0aXBsZSwgb3V0cHV0SGVpZ2h0LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCiAgICAgfQ0KLSAgICBwT3V0Qml0bWFwID0gQ3JlYXRlRElCaXRtYXAobV9vdXRwdXQtPkdldFdpZHRoKCksIG1fb3V0cHV0LT5HZXRIZWlnaHQoKSk7DQotICAgIHBPdXRCaXRtYXAtPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCi0gICAgaWYgKCFwT3V0Qml0bWFwKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25GYWlsVG9DcmVhdGVCaXRtYXA7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbV9vdXRwdXQtPkdldFdpZHRoKCk7IHgrKykgew0KLSAgICAgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbV9vdXRwdXQtPkdldEhlaWdodCgpOyB5KyspIHsNCi0gICAgICAgICAgICBpZiAobV9vdXRwdXQtPkdldCh4LCB5KSkgew0KLSAgICAgICAgICAgICAgICBwT3V0Qml0bWFwLT5TZXRQaXhlbCh4LCB5LCBtX2JhckNvbG9yKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yICg7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKQ0KLSAgICAgICAgaWYgKGNvbnRlbnRzLkdldEF0KGkpICE9ICcgJykgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICBpZiAobV9sb2NUZXh0TG9jICE9IEJDX1RFWFRfTE9DX05PTkUgJiYgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpKSB7DQotICAgICAgICBTaG93Q2hhcnMoY29udGVudHMsIHBPdXRCaXRtYXAsIE5VTEwsIE5VTEwsIG1fYmFyV2lkdGgsIG1fbXVsdGlwbGUsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgQ0ZYX0RJQml0bWFwICogcFN0cmV0Y2hCaXRtYXAgPSBwT3V0Qml0bWFwLT5TdHJldGNoVG8obV9XaWR0aCwgbV9IZWlnaHQpOw0KLSAgICBpZiAocE91dEJpdG1hcCkgew0KLSAgICAgICAgZGVsZXRlIHBPdXRCaXRtYXA7DQotICAgIH0NCi0gICAgcE91dEJpdG1hcCA9IHBTdHJldGNoQml0bWFwOw0KLX0NCi12b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlckRldmljZVJlc3VsdChDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChtX291dHB1dCA9PSBOVUxMKSB7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLSAgICBDRlhfR3JhcGhTdGF0ZURhdGEgc3RhdGVEYXRhOw0KLSAgICBDRlhfUGF0aERhdGEgcGF0aDsNCi0gICAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIChGWF9GTE9BVCltX1dpZHRoLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KLSAgICBkZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBtYXRyaXgsICZzdGF0ZURhdGEsIG1fYmFja2dyb3VuZENvbG9yLCBtX2JhY2tncm91bmRDb2xvciwgRlhGSUxMX0FMVEVSTkFURSk7DQotICAgIENGWF9NYXRyaXggbWF0cmkobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAoRlhfRkxPQVQpbV9IZWlnaHQsIDAuMCwgMC4wKTsNCi0gICAgbWF0cmkuQ29uY2F0KCptYXRyaXgpOw0KLSAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtX291dHB1dC0+R2V0V2lkdGgoKTsgeCsrKSB7DQotICAgICAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCk7IHkrKykgew0KLSAgICAgICAgICAgIENGWF9QYXRoRGF0YSByZWN0Ow0KLSAgICAgICAgICAgIHJlY3QuQXBwZW5kUmVjdCgoRlhfRkxPQVQpeCwgKEZYX0ZMT0FUKXksIChGWF9GTE9BVCkoeCArIDEpLCAoRlhfRkxPQVQpKHkgKyAxKSk7DQotICAgICAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIHN0YXRlRGF0YTsNCi0gICAgICAgICAgICBpZiAobV9vdXRwdXQtPkdldCh4LCB5KSkgew0KLSAgICAgICAgICAgICAgICBkZXZpY2UtPkRyYXdQYXRoKCZyZWN0LCAmbWF0cmksICZzdGF0ZURhdGEsIG1fYmFyQ29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yICg7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKQ0KLSAgICAgICAgaWYgKGNvbnRlbnRzLkdldEF0KGkpICE9ICcgJykgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICBpZiAobV9sb2NUZXh0TG9jICE9IEJDX1RFWFRfTE9DX05PTkUgJiYgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpKSB7DQotICAgICAgICBTaG93Q2hhcnMoY29udGVudHMsIE5VTEwsIGRldmljZSwgbWF0cml4LCBtX2JhcldpZHRoLCBtX211bHRpcGxlLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIHVpbnQ4X3QqIGNvZGUsIGludDMyX3QgY29kZUxlbmd0aCwgIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoY29kZUxlbmd0aCA8IDEpIHsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotICAgIGlmIChtX01vZHVsZUhlaWdodCA8IDIwLjApIHsNCi0gICAgICAgIG1fTW9kdWxlSGVpZ2h0ID0gMjA7DQotICAgIH0NCi0gICAgaW50MzJfdCBjb2RlT2xkTGVuZ3RoID0gY29kZUxlbmd0aDsNCi0gICAgaW50MzJfdCBsZWZ0UGFkZGluZyA9IDA7DQotICAgIGludDMyX3QgcmlnaHRQYWRkaW5nID0gMDsNCi0gICAgaWYgKG1fYkxlZnRQYWRkaW5nKSB7DQotICAgICAgICBsZWZ0UGFkZGluZyA9IDc7DQotICAgIH0NCi0gICAgaWYgKG1fYlJpZ2h0UGFkZGluZykgew0KLSAgICAgICAgcmlnaHRQYWRkaW5nID0gNzsNCi0gICAgfQ0KLSAgICBjb2RlTGVuZ3RoICs9IGxlZnRQYWRkaW5nOw0KLSAgICBjb2RlTGVuZ3RoICs9IHJpZ2h0UGFkZGluZzsNCi0gICAgbV9vdXRwdXRIU2NhbGUgPSAxLjA7DQotICAgIGlmIChtX1dpZHRoID4gMCkgew0KLSAgICAgICAgbV9vdXRwdXRIU2NhbGUgPSAoRlhfRkxPQVQpbV9XaWR0aCAvIChGWF9GTE9BVCljb2RlTGVuZ3RoOw0KLSAgICB9DQotICAgIGlmICghaXNEZXZpY2UpIHsNCi0gICAgICAgIG1fb3V0cHV0SFNjYWxlID0gRlhfTUFYKG1fb3V0cHV0SFNjYWxlLCBtX01vZHVsZVdpZHRoKTsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBkYXRhTGVuZ3RoU2NhbGUgPSAxLjA7DQotICAgIGlmIChtX2lEYXRhTGVudGggPiAwICYmIGNvbnRlbnRzLkdldExlbmd0aCgpICE9IDApIHsNCi0gICAgICAgIGRhdGFMZW5ndGhTY2FsZSA9IEZYX0ZMT0FUKGNvbnRlbnRzLkdldExlbmd0aCgpKSAvIEZYX0ZMT0FUKG1faURhdGFMZW50aCk7DQotICAgIH0NCi0gICAgaWYgKG1faURhdGFMZW50aCA+IDAgJiYgY29udGVudHMuR2V0TGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgZGF0YUxlbmd0aFNjYWxlID0gRlhfRkxPQVQoMSkgLyBGWF9GTE9BVChtX2lEYXRhTGVudGgpOw0KLSAgICB9DQotICAgIG1fbXVsdGlwbGUgPSAxOw0KLSAgICBpZiAoIWlzRGV2aWNlKSB7DQotICAgICAgICBtX211bHRpcGxlID0gKGludDMyX3QpY2VpbChtX291dHB1dEhTY2FsZSAqIGRhdGFMZW5ndGhTY2FsZSk7DQotICAgIH0NCi0gICAgaW50MzJfdCBvdXRwdXRIZWlnaHQgPSAxOw0KLSAgICBpZiAoIWlzRGV2aWNlKSB7DQotICAgICAgICBpZiAobV9IZWlnaHQgPT0gMCkgew0KLSAgICAgICAgICAgIG91dHB1dEhlaWdodCA9IEZYX01BWCgyMCwgbV9Nb2R1bGVIZWlnaHQpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBvdXRwdXRIZWlnaHQgPSBtX0hlaWdodDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpbnQzMl90IG91dHB1dFdpZHRoID0gY29kZUxlbmd0aDsNCi0gICAgaWYgKCFpc0RldmljZSkgew0KLSAgICAgICAgb3V0cHV0V2lkdGggPSAoaW50MzJfdCkoY29kZUxlbmd0aCAqIG1fbXVsdGlwbGUgLyBkYXRhTGVuZ3RoU2NhbGUpOw0KLSAgICB9DQotICAgIG1fYmFyV2lkdGggPSBtX1dpZHRoOw0KLSAgICBpZiAoIWlzRGV2aWNlKSB7DQotICAgICAgICBtX2JhcldpZHRoID0gY29kZUxlbmd0aCAqIG1fbXVsdGlwbGU7DQotICAgIH0NCi0gICAgbV9vdXRwdXQgPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCi0gICAgbV9vdXRwdXQtPkluaXQob3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7DQotICAgIGludDMyX3Qgb3V0cHV0WCA9IGxlZnRQYWRkaW5nICogbV9tdWx0aXBsZTsNCi0gICAgZm9yIChpbnQzMl90IGlucHV0WCA9IDA7IGlucHV0WCA8IGNvZGVPbGRMZW5ndGg7IGlucHV0WCsrKSB7DQotICAgICAgICBpZiAoY29kZVtpbnB1dFhdID09IDEpIHsNCi0gICAgICAgICAgICBpZiAob3V0cHV0WCA+PSBvdXRwdXRXaWR0aCApIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChvdXRwdXRYICsgbV9tdWx0aXBsZSA+IG91dHB1dFdpZHRoICYmIG91dHB1dFdpZHRoIC0gb3V0cHV0WCA+IDApIHsNCi0gICAgICAgICAgICAgICAgbV9vdXRwdXQtPlNldFJlZ2lvbihvdXRwdXRYLCAwLCBvdXRwdXRXaWR0aCAtIG91dHB1dFggLCBvdXRwdXRIZWlnaHQsIGUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9vdXRwdXQtPlNldFJlZ2lvbihvdXRwdXRYLCAwLCBtX211bHRpcGxlLCBvdXRwdXRIZWlnaHQsIGUpOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgb3V0cHV0WCArPSBtX211bHRpcGxlOw0KLSAgICB9DQorICAgIG91dHB1dFggKz0gbV9tdWx0aXBsZTsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmgKaW5kZXggYjgwMTlmZS4uMDY0NWI0MCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oCkBAIC05LDYyICs5LDEwNSBAQAogY2xhc3MgQ0JDX1dyaXRlcjsNCiBjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KIGNsYXNzIENCQ19PbmVEaW1Xcml0ZXI7DQotY2xhc3MgQ0JDX09uZURpbVdyaXRlciA6IHB1YmxpYyBDQkNfV3JpdGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX09uZURpbVdyaXRlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfT25lRGltV3JpdGVyKCk7DQotICAgIHVpbnQ4X3QJCQkqRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90ICZlKTsNCi0gICAgdWludDhfdAkJCSpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpOw0KLSAgICB2aXJ0dWFsIHVpbnQ4X3QgKkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIGludDMyX3QgJm91dExlbmd0aCwgaW50MzJfdCAmZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH07DQotICAgIHZpcnR1YWwgdm9pZCAgICAgUmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIHVpbnQ4X3QqIGNvZGUsIGludDMyX3QgY29kZUxlbmd0aCwgIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QgJmUpOw0KLSAgICB2aXJ0dWFsIHZvaWQgICAgIFJlbmRlckJpdG1hcFJlc3VsdChDRlhfRElCaXRtYXAgKiZwT3V0Qml0bWFwLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBpbnQzMl90ICZlKTsNCi0gICAgdmlydHVhbCB2b2lkICAgICBSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIGludDMyX3QgJmUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfTsNCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCVJlbmRlclRleHRDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgY2hlY2tzdW0pOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0Q2FsY0NoZWNrc3VtKGludDMyX3Qgc3RhdGUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRGb250Q29sb3IoRlhfQVJHQiBjb2xvcik7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldEZvbnQoQ0ZYX0ZvbnQgKiBjRm9udCk7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9CT09MCQkJbV9iUHJpbnRDaGVja3N1bTsNCi0gICAgaW50MzJfdAkJbV9pRGF0YUxlbnRoOw0KLSAgICBGWF9CT09MCQkJbV9iQ2FsY0NoZWNrc3VtOw0KLSAgICBDRlhfRm9udCoJCW1fcEZvbnQ7DQotICAgIEZYX0ZMT0FUCQltX2ZGb250U2l6ZTsNCi0gICAgaW50MzJfdAkJbV9pRm9udFN0eWxlOw0KLSAgICBGWF9EV09SRAkJbV9mb250Q29sb3I7DQotICAgIEJDX1RFWFRfTE9DCQltX2xvY1RleHRMb2M7DQotICAgIGludDMyX3QJCW1faUNvbnRlbnRMZW47DQotICAgIEZYX0JPT0wgICAgICAgICBtX2JMZWZ0UGFkZGluZzsNCi0gICAgRlhfQk9PTCAgICAgICAgIG1fYlJpZ2h0UGFkZGluZzsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogICBtX291dHB1dDsNCi0gICAgaW50MzJfdCAgICAgICAgICAgICAgIG1fYmFyV2lkdGg7DQotICAgIGludDMyX3QgICAgICAgICAgICAgICBtX211bHRpcGxlOw0KLSAgICBGWF9GTE9BVCAgICAgICAgICAgICAgIG1fb3V0cHV0SFNjYWxlOw0KLSAgICB2b2lkCQkJQ2FsY1RleHRJbmZvKGNvbnN0IENGWF9CeXRlU3RyaW5nICZ0ZXh0LCBGWFRFWFRfQ0hBUlBPUyAqY2hhclBvcywgQ0ZYX0ZvbnQgKmNGb250LCBGWF9GTE9BVCBnZVdpZHRoLCBpbnQzMl90IGZvbnRTaXplLCBGWF9GTE9BVCAmY2hhcnNMZW4pOw0KLSAgICB2aXJ0dWFsIHZvaWQJU2hvd0NoYXJzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIENGWF9ESUJpdG1hcCAqcE91dEJpdG1hcCwgQ0ZYX1JlbmRlckRldmljZSAqZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsIGludDMyX3QgYmFyV2lkdGgsIGludDMyX3QgbXVsdGlwbGUsIGludDMyX3QgJmUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJU2hvd0JpdG1hcENoYXJzKENGWF9ESUJpdG1hcCAqcE91dEJpdG1hcCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgc3RyLCBGWF9GTE9BVCBnZVdpZHRoLCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIEZYX0ZMT0FUIGxvY1gsIEZYX0ZMT0FUIGxvY1ksIGludDMyX3QgYmFyV2lkdGgpOw0KLSAgICB2aXJ0dWFsIHZvaWQgICAgU2hvd0RldmljZUNoYXJzKENGWF9SZW5kZXJEZXZpY2UgKmRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LCBjb25zdCBDRlhfQnl0ZVN0cmluZyBzdHIsIEZYX0ZMT0FUIGdlV2lkdGgsIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgRlhfRkxPQVQgbG9jWCwgRlhfRkxPQVQgbG9jWSwgIGludDMyX3QgYmFyV2lkdGgpOw0KLSAgICBpbnQzMl90CQlBcHBlbmRQYXR0ZXJuKHVpbnQ4X3QqIHRhcmdldCwgaW50MzJfdCBwb3MsIGNvbnN0IGludDMyX3QqIHBhdHRlcm4sIGludDMyX3QgcGF0dGVybkxlbmd0aCwgaW50MzJfdCBzdGFydENvbG9yLCBpbnQzMl90ICZlKTsNCi0gICAgRlhfV0NIQVIJCVVwcGVyKEZYX1dDSEFSIGNoKTsNCitjbGFzcyBDQkNfT25lRGltV3JpdGVyIDogcHVibGljIENCQ19Xcml0ZXIgew0KKyBwdWJsaWM6DQorICBDQkNfT25lRGltV3JpdGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lRGltV3JpdGVyKCk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9Ow0KKyAgdmlydHVhbCB2b2lkIFJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlckJpdG1hcFJlc3VsdChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9Ow0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOw0KKyAgfQ0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBSZW5kZXJUZXh0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgY2hlY2tzdW0pOw0KKyAgdmlydHVhbCB2b2lkIFNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpOw0KKyAgdmlydHVhbCB2b2lkIFNldENhbGNDaGVja3N1bShpbnQzMl90IHN0YXRlKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvbnQoQ0ZYX0ZvbnQqIGNGb250KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBtX2JQcmludENoZWNrc3VtOw0KKyAgaW50MzJfdCBtX2lEYXRhTGVudGg7DQorICBGWF9CT09MIG1fYkNhbGNDaGVja3N1bTsNCisgIENGWF9Gb250KiBtX3BGb250Ow0KKyAgRlhfRkxPQVQgbV9mRm9udFNpemU7DQorICBpbnQzMl90IG1faUZvbnRTdHlsZTsNCisgIEZYX0RXT1JEIG1fZm9udENvbG9yOw0KKyAgQkNfVEVYVF9MT0MgbV9sb2NUZXh0TG9jOw0KKyAgaW50MzJfdCBtX2lDb250ZW50TGVuOw0KKyAgRlhfQk9PTCBtX2JMZWZ0UGFkZGluZzsNCisgIEZYX0JPT0wgbV9iUmlnaHRQYWRkaW5nOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9vdXRwdXQ7DQorICBpbnQzMl90IG1fYmFyV2lkdGg7DQorICBpbnQzMl90IG1fbXVsdGlwbGU7DQorICBGWF9GTE9BVCBtX291dHB1dEhTY2FsZTsNCisgIHZvaWQgQ2FsY1RleHRJbmZvKGNvbnN0IENGWF9CeXRlU3RyaW5nJiB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIGNoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogY0ZvbnQsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBnZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjaGFyc0xlbik7DQorICB2aXJ0dWFsIHZvaWQgU2hvd0NoYXJzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE91dEJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIFNob3dCaXRtYXBDaGFycyhDRlhfRElCaXRtYXAqIHBPdXRCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZ2VXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoKTsNCisgIHZpcnR1YWwgdm9pZCBTaG93RGV2aWNlQ2hhcnMoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZ2VXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoKTsNCisgIGludDMyX3QgQXBwZW5kUGF0dGVybih1aW50OF90KiB0YXJnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogcGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhdHRlcm5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfV0NIQVIgVXBwZXIoRlhfV0NIQVIgY2gpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhclJlYWRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyUmVhZGVyLmNwcAppbmRleCA3ZjdhNjljLi5lZDEyZjY3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyUmVhZGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyUmVhZGVyLmNwcApAQCAtMjYsMTgxICsyNiwxODIgQEAKICNpbmNsdWRlICIuLi9vbmVkL0JDX09uZURSZWFkZXIuaCINCiAjaW5jbHVkZSAiLi4vb25lZC9CQ19PbmVkQ29kZTM5UmVhZGVyLmgiDQogI2luY2x1ZGUgIi4uL29uZWQvQkNfT25lZENvZGFCYXJSZWFkZXIuaCINCi1jb25zdCBGWF9DSEFSKiBDQkNfT25lZENvZGFCYXJSZWFkZXI6OkFMUEhBQkVUX1NUUklORyA9ICIwMTIzNDU2Nzg5LSQ6Ly4rQUJDRFROIjsNCitjb25zdCBGWF9DSEFSKiBDQkNfT25lZENvZGFCYXJSZWFkZXI6OkFMUEhBQkVUX1NUUklORyA9DQorICAgICIwMTIzNDU2Nzg5LSQ6Ly4rQUJDRFROIjsNCiBjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kYUJhclJlYWRlcjo6Q0hBUkFDVEVSX0VOQ09ESU5HU1syMl0gPSB7DQotICAgIDB4MDAzLCAweDAwNiwgMHgwMDksIDB4MDYwLCAweDAxMiwgMHgwNDIsIDB4MDIxLCAweDAyNCwgMHgwMzAsIDB4MDQ4LA0KLSAgICAweDAwYywgMHgwMTgsIDB4MDQ1LCAweDA1MSwgMHgwNTQsIDB4MDE1LCAweDAxQSwgMHgwMjksIDB4MDBCLCAweDAwRSwNCi0gICAgMHgwMUEsIDB4MDI5DQotfTsNCisgICAgMHgwMDMsIDB4MDA2LCAweDAwOSwgMHgwNjAsIDB4MDEyLCAweDA0MiwgMHgwMjEsIDB4MDI0LA0KKyAgICAweDAzMCwgMHgwNDgsIDB4MDBjLCAweDAxOCwgMHgwNDUsIDB4MDUxLCAweDA1NCwgMHgwMTUsDQorICAgIDB4MDFBLCAweDAyOSwgMHgwMEIsIDB4MDBFLCAweDAxQSwgMHgwMjl9Ow0KIGNvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjptaW5DaGFyYWN0ZXJMZW5ndGggPSAzOw0KLWNvbnN0IEZYX0NIQVIgQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjpTVEFSVEVORF9FTkNPRElOR1s4XSA9IHsnRScsICcqJywgJ0EnLCAnQicsICdDJywgJ0QnLCAnVCcsICdOJ307DQotQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjpDQkNfT25lZENvZGFCYXJSZWFkZXIoKQ0KLXsNCi19DQotQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjp+Q0JDX09uZWRDb2RhQmFyUmVhZGVyKCkNCi17DQotfQ0KLUNGWF9CeXRlU3RyaW5nIENCQ19PbmVkQ29kYUJhclJlYWRlcjo6RGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9JbnQzMkFycmF5ICppbnQzMlB0ciA9IEZpbmRBc3Rlcmlza1BhdHRlcm4ocm93LCBlKTsNCitjb25zdCBGWF9DSEFSIENCQ19PbmVkQ29kYUJhclJlYWRlcjo6U1RBUlRFTkRfRU5DT0RJTkdbOF0gPSB7DQorICAgICdFJywgJyonLCAnQScsICdCJywgJ0MnLCAnRCcsICdUJywgJ04nfTsNCitDQkNfT25lZENvZGFCYXJSZWFkZXI6OkNCQ19PbmVkQ29kYUJhclJlYWRlcigpIHt9DQorQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjp+Q0JDX09uZWRDb2RhQmFyUmVhZGVyKCkge30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lZENvZGFCYXJSZWFkZXI6OkRlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9JbnQzMkFycmF5KiBpbnQzMlB0ciA9IEZpbmRBc3Rlcmlza1BhdHRlcm4ocm93LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheT4gc3RhcnQoaW50MzJQdHIpOw0KKyAgKCpzdGFydClbMV0gPSAwOw0KKyAgaW50MzJfdCBuZXh0U3RhcnQgPSAoKnN0YXJ0KVsxXTsNCisgIGludDMyX3QgZW5kID0gcm93LT5HZXRTaXplKCk7DQorICB3aGlsZSAobmV4dFN0YXJ0IDwgZW5kICYmICFyb3ctPkdldChuZXh0U3RhcnQpKSB7DQorICAgIG5leHRTdGFydCsrOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0Ow0KKyAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQorICBjb3VudGVycy5TZXRTaXplKDcpOw0KKyAgRlhfQ0hBUiBkZWNvZGVkQ2hhcjsNCisgIGludDMyX3QgbGFzdFN0YXJ0Ow0KKyAgZG8gew0KKyAgICBSZWNvcmRQYXR0ZXJuKHJvdywgbmV4dFN0YXJ0LCAmY291bnRlcnMsIGUpOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheT4gc3RhcnQoaW50MzJQdHIpOw0KLSAgICAoKnN0YXJ0KVsxXSA9IDA7DQotICAgIGludDMyX3QgbmV4dFN0YXJ0ID0gKCpzdGFydClbMV07DQotICAgIGludDMyX3QgZW5kID0gcm93LT5HZXRTaXplKCk7DQorICAgIGRlY29kZWRDaGFyID0gVG9OYXJyb3dXaWRlUGF0dGVybigmY291bnRlcnMpOw0KKyAgICBpZiAoZGVjb2RlZENoYXIgPT0gJyEnKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgcmV0dXJuICIiOw0KKyAgICB9DQorICAgIHJlc3VsdCArPSBkZWNvZGVkQ2hhcjsNCisgICAgbGFzdFN0YXJ0ID0gbmV4dFN0YXJ0Ow0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudGVycy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgIG5leHRTdGFydCArPSBjb3VudGVyc1tpXTsNCisgICAgfQ0KICAgICB3aGlsZSAobmV4dFN0YXJ0IDwgZW5kICYmICFyb3ctPkdldChuZXh0U3RhcnQpKSB7DQotICAgICAgICBuZXh0U3RhcnQrKzsNCisgICAgICBuZXh0U3RhcnQrKzsNCiAgICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQotICAgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KLSAgICBjb3VudGVycy5TZXRTaXplKDcpOw0KLSAgICBGWF9DSEFSIGRlY29kZWRDaGFyOw0KLSAgICBpbnQzMl90IGxhc3RTdGFydDsNCi0gICAgZG8gew0KLSAgICAgICAgUmVjb3JkUGF0dGVybihyb3csIG5leHRTdGFydCwgJmNvdW50ZXJzLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQotICAgICAgICBkZWNvZGVkQ2hhciA9IFRvTmFycm93V2lkZVBhdHRlcm4oJmNvdW50ZXJzKTsNCi0gICAgICAgIGlmIChkZWNvZGVkQ2hhciA9PSAnIScpIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCi0gICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICB9DQotICAgICAgICByZXN1bHQgKz0gZGVjb2RlZENoYXI7DQotICAgICAgICBsYXN0U3RhcnQgPSBuZXh0U3RhcnQ7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudGVycy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIG5leHRTdGFydCArPSBjb3VudGVyc1tpXTsNCi0gICAgICAgIH0NCi0gICAgICAgIHdoaWxlIChuZXh0U3RhcnQgPCBlbmQgJiYgIXJvdy0+R2V0KG5leHRTdGFydCkpIHsNCi0gICAgICAgICAgICBuZXh0U3RhcnQrKzsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAobmV4dFN0YXJ0IDwgZW5kKTsNCi0gICAgaW50MzJfdCBsYXN0UGF0dGVyblNpemUgPSAwOw0KLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBjb3VudGVycy5HZXRTaXplKCk7IGorKykgew0KLSAgICAgICAgbGFzdFBhdHRlcm5TaXplICs9IGNvdW50ZXJzW2pdOw0KLSAgICB9DQotICAgIGludDMyX3Qgd2hpdGVTcGFjZUFmdGVyRW5kID0gbmV4dFN0YXJ0IC0gbGFzdFN0YXJ0IC0gbGFzdFBhdHRlcm5TaXplOw0KLSAgICBpZiAobmV4dFN0YXJ0ICE9IGVuZCAmJiAod2hpdGVTcGFjZUFmdGVyRW5kIC8gMiA8IGxhc3RQYXR0ZXJuU2l6ZSkpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotICAgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPCAyKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLSAgICBGWF9DSEFSIHN0YXJ0Y2hhciA9IHJlc3VsdFswXTsNCi0gICAgaWYgKCFBcnJheUNvbnRhaW5zKFNUQVJURU5EX0VOQ09ESU5HLCBzdGFydGNoYXIpKSB7DQotICAgICAgICBlID0gIEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi0gICAgaW50MzJfdCBsZW4gPSByZXN1bHQuR2V0TGVuZ3RoKCk7DQotICAgIENGWF9CeXRlU3RyaW5nIHRlbXAgPSByZXN1bHQ7DQotICAgIGZvciAoaW50MzJfdCBrID0gMTsgayA8IHJlc3VsdC5HZXRMZW5ndGgoKTsgaysrKSB7DQotICAgICAgICBpZiAoQXJyYXlDb250YWlucyhTVEFSVEVORF9FTkNPRElORywgcmVzdWx0W2tdKSkgew0KLSAgICAgICAgICAgIGlmICgoayArIDEpICE9IHJlc3VsdC5HZXRMZW5ndGgoKSkgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuRGVsZXRlKDEsIGspOw0KLSAgICAgICAgICAgICAgICBrID0gMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA8IDUpIHsNCi0gICAgICAgIGludDMyX3QgaW5kZXggPSB0ZW1wLkZpbmQocmVzdWx0Lk1pZCgxLCByZXN1bHQuR2V0TGVuZ3RoKCkgLSAxKSk7DQotICAgICAgICBpZiAoaW5kZXggPT0gbGVuIC0gKHJlc3VsdC5HZXRMZW5ndGgoKSAtIDEpKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICAgICAgcmV0dXJuICIiOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPiBtaW5DaGFyYWN0ZXJMZW5ndGgpIHsNCi0gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5NaWQoMSwgcmVzdWx0LkdldExlbmd0aCgpIC0gMik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLSAgICByZXR1cm4gcmVzdWx0Ow0KLX0NCi1DRlhfSW50MzJBcnJheSAqQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjpGaW5kQXN0ZXJpc2tQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCB3aWR0aCA9IHJvdy0+R2V0U2l6ZSgpOw0KLSAgICBpbnQzMl90IHJvd09mZnNldCA9IDA7DQotICAgIHdoaWxlIChyb3dPZmZzZXQgPCB3aWR0aCkgew0KLSAgICAgICAgaWYgKHJvdy0+R2V0KHJvd09mZnNldCkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIHJvd09mZnNldCsrOw0KLSAgICB9DQotICAgIGludDMyX3QgY291bnRlclBvc2l0aW9uID0gMDsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQotICAgIGNvdW50ZXJzLlNldFNpemUoNyk7DQotICAgIGludDMyX3QgcGF0dGVyblN0YXJ0ID0gcm93T2Zmc2V0Ow0KLSAgICBGWF9CT09MIGlzV2hpdGUgPSBGQUxTRTsNCi0gICAgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoID0gY291bnRlcnMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IHJvd09mZnNldDsgaSA8IHdpZHRoOyBpKyspIHsNCi0gICAgICAgIEZYX0JPT0wgcGl4ZWwgPSByb3ctPkdldChpKTsNCi0gICAgICAgIGlmIChwaXhlbCBeIGlzV2hpdGUpIHsNCi0gICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dKys7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChjb3VudGVyUG9zaXRpb24gPT0gcGF0dGVybkxlbmd0aCAtIDEpIHsNCi0gICAgICAgICAgICAgICAgaWYgKEFycmF5Q29udGFpbnMoU1RBUlRFTkRfRU5DT0RJTkcsIFRvTmFycm93V2lkZVBhdHRlcm4oJmNvdW50ZXJzKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYnRlbXAzID0gcm93LT5Jc1JhbmdlKEZYX01BWCgwLCBwYXR0ZXJuU3RhcnQgLSAoaSAtIHBhdHRlcm5TdGFydCkgLyAyKSwgcGF0dGVyblN0YXJ0LCBGQUxTRSwgZSk7DQotICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoYnRlbXAzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkgKnJlc3VsdCA9IEZYX05FVyBDRlhfSW50MzJBcnJheSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+U2V0U2l6ZSgyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKnJlc3VsdClbMF0gPSBwYXR0ZXJuU3RhcnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bHQpWzFdID0gaTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyc1swXSArIGNvdW50ZXJzWzFdOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgeSA9IDI7IHkgPCBwYXR0ZXJuTGVuZ3RoOyB5KyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJzW3kgLSAyXSA9IGNvdW50ZXJzW3ldOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAyXSA9IDA7DQotICAgICAgICAgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAxXSA9IDA7DQotICAgICAgICAgICAgICAgIGNvdW50ZXJQb3NpdGlvbi0tOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGNvdW50ZXJQb3NpdGlvbisrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dID0gMTsNCi0gICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQotICAgICAgICB9DQotICAgIH0NCisgIH0gd2hpbGUgKG5leHRTdGFydCA8IGVuZCk7DQorICBpbnQzMl90IGxhc3RQYXR0ZXJuU2l6ZSA9IDA7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBjb3VudGVycy5HZXRTaXplKCk7IGorKykgew0KKyAgICBsYXN0UGF0dGVyblNpemUgKz0gY291bnRlcnNbal07DQorICB9DQorICBpbnQzMl90IHdoaXRlU3BhY2VBZnRlckVuZCA9IG5leHRTdGFydCAtIGxhc3RTdGFydCAtIGxhc3RQYXR0ZXJuU2l6ZTsNCisgIGlmIChuZXh0U3RhcnQgIT0gZW5kICYmICh3aGl0ZVNwYWNlQWZ0ZXJFbmQgLyAyIDwgbGFzdFBhdHRlcm5TaXplKSkgew0KICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCi0gICAgcmV0dXJuIE5VTEw7DQorICAgIHJldHVybiAiIjsNCisgIH0NCisgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPCAyKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICByZXR1cm4gIiI7DQorICB9DQorICBGWF9DSEFSIHN0YXJ0Y2hhciA9IHJlc3VsdFswXTsNCisgIGlmICghQXJyYXlDb250YWlucyhTVEFSVEVORF9FTkNPRElORywgc3RhcnRjaGFyKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuICIiOw0KKyAgfQ0KKyAgaW50MzJfdCBsZW4gPSByZXN1bHQuR2V0TGVuZ3RoKCk7DQorICBDRlhfQnl0ZVN0cmluZyB0ZW1wID0gcmVzdWx0Ow0KKyAgZm9yIChpbnQzMl90IGsgPSAxOyBrIDwgcmVzdWx0LkdldExlbmd0aCgpOyBrKyspIHsNCisgICAgaWYgKEFycmF5Q29udGFpbnMoU1RBUlRFTkRfRU5DT0RJTkcsIHJlc3VsdFtrXSkpIHsNCisgICAgICBpZiAoKGsgKyAxKSAhPSByZXN1bHQuR2V0TGVuZ3RoKCkpIHsNCisgICAgICAgIHJlc3VsdC5EZWxldGUoMSwgayk7DQorICAgICAgICBrID0gMTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPCA1KSB7DQorICAgIGludDMyX3QgaW5kZXggPSB0ZW1wLkZpbmQocmVzdWx0Lk1pZCgxLCByZXN1bHQuR2V0TGVuZ3RoKCkgLSAxKSk7DQorICAgIGlmIChpbmRleCA9PSBsZW4gLSAocmVzdWx0LkdldExlbmd0aCgpIC0gMSkpIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICByZXR1cm4gIiI7DQorICAgIH0NCisgIH0NCisgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPiBtaW5DaGFyYWN0ZXJMZW5ndGgpIHsNCisgICAgcmVzdWx0ID0gcmVzdWx0Lk1pZCgxLCByZXN1bHQuR2V0TGVuZ3RoKCkgLSAyKTsNCisgIH0gZWxzZSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICByZXR1cm4gIiI7DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KIH0NCi1GWF9CT09MIENCQ19PbmVkQ29kYUJhclJlYWRlcjo6QXJyYXlDb250YWlucyhjb25zdCBGWF9DSEFSIGFycmF5W10sIEZYX0NIQVIga2V5KQ0KLXsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCA4OyBpKyspIHsNCi0gICAgICAgIGlmKGFycmF5W2ldID09IGtleSkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfT25lZENvZGFCYXJSZWFkZXI6OkZpbmRBc3Rlcmlza1BhdHRlcm4oDQorICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IHdpZHRoID0gcm93LT5HZXRTaXplKCk7DQorICBpbnQzMl90IHJvd09mZnNldCA9IDA7DQorICB3aGlsZSAocm93T2Zmc2V0IDwgd2lkdGgpIHsNCisgICAgaWYgKHJvdy0+R2V0KHJvd09mZnNldCkpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQorICAgIHJvd09mZnNldCsrOw0KKyAgfQ0KKyAgaW50MzJfdCBjb3VudGVyUG9zaXRpb24gPSAwOw0KKyAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQorICBjb3VudGVycy5TZXRTaXplKDcpOw0KKyAgaW50MzJfdCBwYXR0ZXJuU3RhcnQgPSByb3dPZmZzZXQ7DQorICBGWF9CT09MIGlzV2hpdGUgPSBGQUxTRTsNCisgIGludDMyX3QgcGF0dGVybkxlbmd0aCA9IGNvdW50ZXJzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gcm93T2Zmc2V0OyBpIDwgd2lkdGg7IGkrKykgew0KKyAgICBGWF9CT09MIHBpeGVsID0gcm93LT5HZXQoaSk7DQorICAgIGlmIChwaXhlbCBeIGlzV2hpdGUpIHsNCisgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dKys7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGNvdW50ZXJQb3NpdGlvbiA9PSBwYXR0ZXJuTGVuZ3RoIC0gMSkgew0KKyAgICAgICAgaWYgKEFycmF5Q29udGFpbnMoU1RBUlRFTkRfRU5DT0RJTkcsIFRvTmFycm93V2lkZVBhdHRlcm4oJmNvdW50ZXJzKSkpIHsNCisgICAgICAgICAgRlhfQk9PTCBidGVtcDMgPQ0KKyAgICAgICAgICAgICAgcm93LT5Jc1JhbmdlKEZYX01BWCgwLCBwYXR0ZXJuU3RhcnQgLSAoaSAtIHBhdHRlcm5TdGFydCkgLyAyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuU3RhcnQsIEZBTFNFLCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICBpZiAoYnRlbXAzKSB7DQorICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHJlc3VsdCA9IEZYX05FVyBDRlhfSW50MzJBcnJheSgpOw0KKyAgICAgICAgICAgIHJlc3VsdC0+U2V0U2l6ZSgyKTsNCisgICAgICAgICAgICAoKnJlc3VsdClbMF0gPSBwYXR0ZXJuU3RhcnQ7DQorICAgICAgICAgICAgKCpyZXN1bHQpWzFdID0gaTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwYXR0ZXJuU3RhcnQgKz0gY291bnRlcnNbMF0gKyBjb3VudGVyc1sxXTsNCisgICAgICAgIGZvciAoaW50MzJfdCB5ID0gMjsgeSA8IHBhdHRlcm5MZW5ndGg7IHkrKykgew0KKyAgICAgICAgICBjb3VudGVyc1t5IC0gMl0gPSBjb3VudGVyc1t5XTsNCisgICAgICAgIH0NCisgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAyXSA9IDA7DQorICAgICAgICBjb3VudGVyc1twYXR0ZXJuTGVuZ3RoIC0gMV0gPSAwOw0KKyAgICAgICAgY291bnRlclBvc2l0aW9uLS07DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNvdW50ZXJQb3NpdGlvbisrOw0KKyAgICAgIH0NCisgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dID0gMTsNCisgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQorICAgIH0NCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLUZYX0NIQVIgQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjpUb05hcnJvd1dpZGVQYXR0ZXJuKENGWF9JbnQzMkFycmF5ICpjb3VudGVyKQ0KLXsNCi0gICAgaW50MzJfdCBudW1Db3VudGVycyA9IGNvdW50ZXItPkdldFNpemUoKTsNCi0gICAgaWYgKG51bUNvdW50ZXJzIDwgMSkgew0KLSAgICAgICAgcmV0dXJuICchJzsNCitGWF9CT09MIENCQ19PbmVkQ29kYUJhclJlYWRlcjo6QXJyYXlDb250YWlucyhjb25zdCBGWF9DSEFSIGFycmF5W10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUiBrZXkpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDg7IGkrKykgew0KKyAgICBpZiAoYXJyYXlbaV0gPT0ga2V5KSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi0gICAgaW50MzJfdCBhdmVyYWdlQ291bnRlciA9IDA7DQotICAgIGludDMyX3QgdG90YWxDb3VudGVycyA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHsNCi0gICAgICAgIHRvdGFsQ291bnRlcnMgKz0gKCpjb3VudGVyKVtpXTsNCi0gICAgfQ0KLSAgICBhdmVyYWdlQ291bnRlciA9IHRvdGFsQ291bnRlcnMgLyBudW1Db3VudGVyczsNCi0gICAgaW50MzJfdCBwYXR0ZXJuID0gMDsNCi0gICAgaW50MzJfdCB3aWRlQ291bnRlcnMgPSAwOw0KLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBudW1Db3VudGVyczsgaisrKSB7DQotICAgICAgICBpZiAoKCpjb3VudGVyKVtqXSA+IGF2ZXJhZ2VDb3VudGVyKSB7DQotICAgICAgICAgICAgcGF0dGVybiB8PSAxIDw8IChudW1Db3VudGVycyAtIDEgLSBqKTsNCi0gICAgICAgICAgICB3aWRlQ291bnRlcnMrKzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoKHdpZGVDb3VudGVycyA9PSAyKSB8fCAod2lkZUNvdW50ZXJzID09IDMpKSB7DQotICAgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCAyMjsgaysrKSB7DQotICAgICAgICAgICAgaWYgKENIQVJBQ1RFUl9FTkNPRElOR1Nba10gPT0gcGF0dGVybikgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gKEFMUEhBQkVUX1NUUklORylba107DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0NIQVIgQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjpUb05hcnJvd1dpZGVQYXR0ZXJuKENGWF9JbnQzMkFycmF5KiBjb3VudGVyKSB7DQorICBpbnQzMl90IG51bUNvdW50ZXJzID0gY291bnRlci0+R2V0U2l6ZSgpOw0KKyAgaWYgKG51bUNvdW50ZXJzIDwgMSkgew0KICAgICByZXR1cm4gJyEnOw0KKyAgfQ0KKyAgaW50MzJfdCBhdmVyYWdlQ291bnRlciA9IDA7DQorICBpbnQzMl90IHRvdGFsQ291bnRlcnMgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykgew0KKyAgICB0b3RhbENvdW50ZXJzICs9ICgqY291bnRlcilbaV07DQorICB9DQorICBhdmVyYWdlQ291bnRlciA9IHRvdGFsQ291bnRlcnMgLyBudW1Db3VudGVyczsNCisgIGludDMyX3QgcGF0dGVybiA9IDA7DQorICBpbnQzMl90IHdpZGVDb3VudGVycyA9IDA7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBudW1Db3VudGVyczsgaisrKSB7DQorICAgIGlmICgoKmNvdW50ZXIpW2pdID4gYXZlcmFnZUNvdW50ZXIpIHsNCisgICAgICBwYXR0ZXJuIHw9IDEgPDwgKG51bUNvdW50ZXJzIC0gMSAtIGopOw0KKyAgICAgIHdpZGVDb3VudGVycysrOw0KKyAgICB9DQorICB9DQorICBpZiAoKHdpZGVDb3VudGVycyA9PSAyKSB8fCAod2lkZUNvdW50ZXJzID09IDMpKSB7DQorICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IDIyOyBrKyspIHsNCisgICAgICBpZiAoQ0hBUkFDVEVSX0VOQ09ESU5HU1trXSA9PSBwYXR0ZXJuKSB7DQorICAgICAgICByZXR1cm4gKEFMUEhBQkVUX1NUUklORylba107DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gJyEnOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyUmVhZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyUmVhZGVyLmgKaW5kZXggZGJkMjU1OS4uNGFhZDMwNiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhclJlYWRlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJSZWFkZXIuaApAQCAtOSwyMiArOSwyMyBAQAogY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KIGNsYXNzIENCQ19PbmVEUmVhZGVyOw0KIGNsYXNzIENCQ19PbmVkQ29kYUJhclJlYWRlcjsNCi1jbGFzcyBDQkNfT25lZENvZGFCYXJSZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURSZWFkZXINCi17DQotcHVibGljOg0KLSAgICBDQkNfT25lZENvZGFCYXJSZWFkZXIoKTsNCi0gICAgdmlydHVhbCB+Q0JDX09uZWRDb2RhQmFyUmVhZGVyKCk7DQotICAgIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfSW50MzJBcnJheSAqRmluZEFzdGVyaXNrUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wgQXJyYXlDb250YWlucyhjb25zdCBGWF9DSEFSIGFycmF5W10sIEZYX0NIQVIga2V5KTsNCi0gICAgRlhfQ0hBUiBUb05hcnJvd1dpZGVQYXR0ZXJuKENGWF9JbnQzMkFycmF5ICpjb3VudGVyKTsNCi0gICAgc3RhdGljIGNvbnN0IEZYX0NIQVIqIEFMUEhBQkVUX1NUUklORzsNCitjbGFzcyBDQkNfT25lZENvZGFCYXJSZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURSZWFkZXIgew0KKyBwdWJsaWM6DQorICBDQkNfT25lZENvZGFCYXJSZWFkZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19PbmVkQ29kYUJhclJlYWRlcigpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDRlhfSW50MzJBcnJheSogRmluZEFzdGVyaXNrUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIEFycmF5Q29udGFpbnMoY29uc3QgRlhfQ0hBUiBhcnJheVtdLCBGWF9DSEFSIGtleSk7DQorICBGWF9DSEFSIFRvTmFycm93V2lkZVBhdHRlcm4oQ0ZYX0ludDMyQXJyYXkqIGNvdW50ZXIpOw0KKyAgc3RhdGljIGNvbnN0IEZYX0NIQVIqIEFMUEhBQkVUX1NUUklORzsNCiANCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENIQVJBQ1RFUl9FTkNPRElOR1NbMjJdOw0KIA0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBDSEFSQUNURVJfRU5DT0RJTkdTWzIyXTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IG1pbkNoYXJhY3Rlckxlbmd0aDsNCiANCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgbWluQ2hhcmFjdGVyTGVuZ3RoOw0KLQ0KLSAgICBjb25zdCBzdGF0aWMgRlhfQ0hBUiBTVEFSVEVORF9FTkNPRElOR1s4XTsNCisgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIFNUQVJURU5EX0VOQ09ESU5HWzhdOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhcldyaXRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcAppbmRleCA1ODRmN2JmLi5lZWY4MTBhIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcApAQCAtMjksMTk0ICsyOSwyMDEgQEAKICNpbmNsdWRlICJCQ19PbmVEaW1Xcml0ZXIuaCINCiAjaW5jbHVkZSAiQkNfT25lZENvZGFCYXJSZWFkZXIuaCINCiAjaW5jbHVkZSAiQkNfT25lZENvZGFCYXJXcml0ZXIuaCINCi1jb25zdCBGWF9DSEFSIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U1RBUlRfRU5EX0NIQVJTW10gPSB7J0EnLCAnQicsICdDJywgJ0QnLCAnVCcsICdOJywgJyonLCAnRScsICdhJywgJ2InLCAnYycsICdkJywgJ3QnLCAnbicsICdlJ307DQotY29uc3QgRlhfQ0hBUiBDQkNfT25lZENvZGFCYXJXcml0ZXI6OkNPTlRFTlRfQ0hBUlNbXSA9IHsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICctJywgJyQnLCAnLycsICc6JywgJysnLCAnLid9Ow0KLUNCQ19PbmVkQ29kYUJhcldyaXRlcjo6Q0JDX09uZWRDb2RhQmFyV3JpdGVyKCkNCi17DQotICAgIG1fY2hTdGFydAkJCT0gJ0EnOw0KLSAgICBtX2NoRW5kCQkJCT0gJ0InOw0KLSAgICBtX2lXaWRlTmFyclJhdGlvCT0gMjsNCitjb25zdCBGWF9DSEFSIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U1RBUlRfRU5EX0NIQVJTW10gPSB7DQorICAgICdBJywgJ0InLCAnQycsICdEJywgJ1QnLCAnTicsICcqJywgJ0UnLCAnYScsICdiJywgJ2MnLCAnZCcsICd0JywgJ24nLCAnZSd9Ow0KK2NvbnN0IEZYX0NIQVIgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpDT05URU5UX0NIQVJTW10gPSB7DQorICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLA0KKyAgICAnOCcsICc5JywgJy0nLCAnJCcsICcvJywgJzonLCAnKycsICcuJ307DQorQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpDQkNfT25lZENvZGFCYXJXcml0ZXIoKSB7DQorICBtX2NoU3RhcnQgPSAnQSc7DQorICBtX2NoRW5kID0gJ0InOw0KKyAgbV9pV2lkZU5hcnJSYXRpbyA9IDI7DQogfQ0KLUNCQ19PbmVkQ29kYUJhcldyaXRlcjo6fkNCQ19PbmVkQ29kYUJhcldyaXRlcigpDQotew0KK0NCQ19PbmVkQ29kYUJhcldyaXRlcjo6fkNCQ19PbmVkQ29kYUJhcldyaXRlcigpIHt9DQorRlhfQk9PTCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplb2YoU1RBUlRfRU5EX0NIQVJTKSAvIHNpemVvZihGWF9DSEFSKTsgaSsrKSB7DQorICAgIGlmIChTVEFSVF9FTkRfQ0hBUlNbaV0gPT0gc3RhcnQpIHsNCisgICAgICBtX2NoU3RhcnQgPSBzdGFydDsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U2V0U3RhcnRDaGFyKEZYX0NIQVIgc3RhcnQpDQotew0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplb2YoU1RBUlRfRU5EX0NIQVJTKSAvIHNpemVvZihGWF9DSEFSKTsgaSsrKSB7DQotICAgICAgICBpZiAoU1RBUlRfRU5EX0NIQVJTW2ldID09IHN0YXJ0KSB7DQotICAgICAgICAgICAgbV9jaFN0YXJ0ID0gc3RhcnQ7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQorRlhfQk9PTCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNldEVuZENoYXIoRlhfQ0hBUiBlbmQpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemVvZihTVEFSVF9FTkRfQ0hBUlMpIC8gc2l6ZW9mKEZYX0NIQVIpOyBpKyspIHsNCisgICAgaWYgKFNUQVJUX0VORF9DSEFSU1tpXSA9PSBlbmQpIHsNCisgICAgICBtX2NoRW5kID0gZW5kOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKSB7DQorICBtX2lEYXRhTGVudGggPSBsZW5ndGggKyAyOw0KK30NCitGWF9CT09MIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7DQorICBpZiAobG9jYXRpb24gPCBCQ19URVhUX0xPQ19OT05FIHx8IGxvY2F0aW9uID4gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pIHsNCisgIGlmIChyYXRpbyA8IDIgfHwgcmF0aW8gPiAzKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1faVdpZGVOYXJyUmF0aW8gPSByYXRpbzsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6RmluZENoYXIoRlhfV0NIQVIgY2gsIEZYX0JPT0wgaXNDb250ZW50KSB7DQorICBpZiAoaXNDb250ZW50KSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemVvZihDT05URU5UX0NIQVJTKSAvIHNpemVvZihGWF9DSEFSKTsgaSsrKSB7DQorICAgICAgaWYgKGNoID09IChGWF9XQ0hBUilDT05URU5UX0NIQVJTW2ldKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgc2l6ZW9mKFNUQVJUX0VORF9DSEFSUykgLyBzaXplb2YoRlhfQ0hBUik7IGorKykgew0KKyAgICAgIGlmIChjaCA9PSAoRlhfV0NIQVIpU1RBUlRfRU5EX0NIQVJTW2pdKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQogICAgIH0NCiAgICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U2V0RW5kQ2hhcihGWF9DSEFSIGVuZCkNCi17DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemVvZihTVEFSVF9FTkRfQ0hBUlMpIC8gc2l6ZW9mKEZYX0NIQVIpOyBpKyspIHsNCi0gICAgICAgIGlmIChTVEFSVF9FTkRfQ0hBUlNbaV0gPT0gZW5kKSB7DQotICAgICAgICAgICAgbV9jaEVuZCA9IGVuZDsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemVvZihDT05URU5UX0NIQVJTKSAvIHNpemVvZihGWF9DSEFSKTsgaSsrKSB7DQorICAgICAgaWYgKGNoID09IChGWF9XQ0hBUilDT05URU5UX0NIQVJTW2ldKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQogICAgIH0NCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KIH0NCi12b2lkIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U2V0RGF0YUxlbmd0aChpbnQzMl90IGxlbmd0aCkNCi17DQotICAgIG1faURhdGFMZW50aCA9IGxlbmd0aCArIDI7DQotfQ0KLUZYX0JPT0wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pDQotew0KLSAgICBpZiAoIGxvY2F0aW9uIDwgQkNfVEVYVF9MT0NfTk9ORSB8fCBsb2NhdGlvbiA+IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbykNCi17DQotICAgIGlmKHJhdGlvIDwgMiB8fCByYXRpbyA+IDMpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX2lXaWRlTmFyclJhdGlvID0gcmF0aW87DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6RmluZENoYXIoRlhfV0NIQVIgY2gsIEZYX0JPT0wgaXNDb250ZW50KQ0KLXsNCi0gICAgaWYoaXNDb250ZW50KSB7DQotICAgICAgICBmb3IoaW50MzJfdCBpID0gMCA7IGkgPCBzaXplb2YoQ09OVEVOVF9DSEFSUykgLyBzaXplb2YoRlhfQ0hBUikgOyBpKyspIHsNCi0gICAgICAgICAgICBpZihjaCA9PSAoRlhfV0NIQVIpQ09OVEVOVF9DSEFSU1tpXSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBmb3IoaW50MzJfdCBqID0gMCA7IGogPCBzaXplb2YoU1RBUlRfRU5EX0NIQVJTKSAvIHNpemVvZihGWF9DSEFSKSA7IGorKykgew0KLSAgICAgICAgICAgIGlmKGNoID09IChGWF9XQ0hBUilTVEFSVF9FTkRfQ0hBUlNbal0pIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgRlhfV0NIQVIgY2g7DQorICBpbnQzMl90IGluZGV4ID0gMDsNCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpbmRleCsrKSB7DQorICAgIGNoID0gY29udGVudHMuR2V0QXQoaW5kZXgpOw0KKyAgICBpZiAoRmluZENoYXIoY2gsIEZBTFNFKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgZm9yKGludDMyX3QgaSA9IDAgOyBpIDwgc2l6ZW9mKENPTlRFTlRfQ0hBUlMpIC8gc2l6ZW9mKEZYX0NIQVIpIDsgaSsrKSB7DQotICAgICAgICAgICAgaWYoY2ggPT0gKEZYX1dDSEFSKUNPTlRFTlRfQ0hBUlNbaV0pIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLXsNCi0gICAgRlhfV0NIQVIgY2g7DQotICAgIGludDMyX3QgaW5kZXggPSAwOw0KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaW5kZXgrKykgew0KLSAgICAgICAgY2ggPSBjb250ZW50cy5HZXRBdChpbmRleCk7DQotICAgICAgICBpZiAoRmluZENoYXIoY2gsIEZBTFNFKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpGaWx0ZXJDb250ZW50cygNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQorICBGWF9XQ0hBUiBjaDsNCisgIGZvciAoaW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGluZGV4KyspIHsNCisgICAgY2ggPSBjb250ZW50cy5HZXRBdChpbmRleCk7DQorICAgIGlmIChjaCA+IDE3NSkgew0KKyAgICAgIGluZGV4Kys7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6RmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzOw0KLSAgICBGWF9XQ0hBUiBjaDsNCi0gICAgZm9yIChpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaW5kZXggKyspIHsNCi0gICAgICAgIGNoID0gY29udGVudHMuR2V0QXQoaW5kZXgpOw0KLSAgICAgICAgaWYoY2ggPiAxNzUpIHsNCi0gICAgICAgICAgICBpbmRleCsrOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKEZpbmRDaGFyKGNoLCBUUlVFKSkgew0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCisgICAgaWYgKEZpbmRDaGFyKGNoLCBUUlVFKSkgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIHJldHVybiBmaWx0ZXJjb250ZW50czsNCisgIH0NCisgIHJldHVybiBmaWx0ZXJjb250ZW50czsNCiB9DQotdWludDhfdCAqQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgJmUpDQotew0KLSAgICB1aW50OF90ICpyZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCAsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIHJldHVybiByZXQ7DQordWludDhfdCogQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgdWludDhfdCogcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHJldDsNCiB9DQotdWludDhfdCAqQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihmb3JtYXQgIT0gQkNGT1JNQVRfQ09EQUJBUikgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uT25seUVuY29kZUNPREVCQVI7DQotICAgICAgICByZXR1cm4gTlVMTDsNCit1aW50OF90KiBDQkNfT25lZENvZGFCYXJXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChmb3JtYXQgIT0gQkNGT1JNQVRfQ09EQUJBUikgew0KKyAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERUJBUjsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB1aW50OF90KiByZXQgPQ0KKyAgICAgIENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcmV0Ow0KK30NCit1aW50OF90KiBDQkNfT25lZENvZGFCYXJXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19PbmVkQ29kYUJhclJlYWRlciBDb2RhQmFyUjsNCisgIENGWF9CeXRlU3RyaW5nIGRhdGEgPSBtX2NoU3RhcnQgKyBjb250ZW50cyArIG1fY2hFbmQ7DQorICBtX2lDb250ZW50TGVuID0gZGF0YS5HZXRMZW5ndGgoKTsNCisgIHVpbnQ4X3QqIHJlc3VsdCA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1faVdpZGVOYXJyUmF0aW8gKiA3ICogZGF0YS5HZXRMZW5ndGgoKSk7DQorICBGWF9DSEFSIGNoOw0KKyAgaW50MzJfdCBwb3NpdGlvbiA9IDA7DQorICBmb3IgKGludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGRhdGEuR2V0TGVuZ3RoKCk7IGluZGV4KyspIHsNCisgICAgY2ggPSBkYXRhLkdldEF0KGluZGV4KTsNCisgICAgaWYgKCgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ3onKSkpIHsNCisgICAgICBjaCA9IGNoIC0gMzI7DQogICAgIH0NCi0gICAgdWludDhfdCAqcmV0ID0gQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGhpbnRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gcmV0Ow0KLX0NCi11aW50OF90KiBDQkNfT25lZENvZGFCYXJXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIGludDMyX3QgJm91dExlbmd0aCwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19PbmVkQ29kYUJhclJlYWRlciBDb2RhQmFyUjsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgZGF0YSA9IG1fY2hTdGFydCArIGNvbnRlbnRzICsgbV9jaEVuZDsNCi0gICAgbV9pQ29udGVudExlbiA9IGRhdGEuR2V0TGVuZ3RoKCk7DQotICAgIHVpbnQ4X3QgKnJlc3VsdCA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1faVdpZGVOYXJyUmF0aW8gKiA3ICogZGF0YS5HZXRMZW5ndGgoKSk7DQotICAgIEZYX0NIQVIgY2g7DQotICAgIGludDMyX3QgcG9zaXRpb24gPSAwOw0KLSAgICBmb3IgKGludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGRhdGEuR2V0TGVuZ3RoKCk7IGluZGV4KyspIHsNCi0gICAgICAgIGNoID0gZGF0YS5HZXRBdChpbmRleCk7DQotICAgICAgICBpZiAoKChjaCA+PSAnYScpICYmIChjaCA8PSAneicpKSkgew0KLSAgICAgICAgICAgIGNoID0gY2ggLSAzMjsNCi0gICAgICAgIH0NCi0gICAgICAgIHN3aXRjaCAoY2gpIHsNCi0gICAgICAgICAgICBjYXNlICdUJzoNCi0gICAgICAgICAgICAgICAgY2ggPSAnQSc7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ04nOg0KLSAgICAgICAgICAgICAgICBjaCA9ICdCJzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnKic6DQotICAgICAgICAgICAgICAgIGNoID0gJ0MnOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICdFJzoNCi0gICAgICAgICAgICAgICAgY2ggPSAnRCc7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBjb2RlID0gMDsNCi0gICAgICAgIGludDMyX3QgbGVuID0gIChpbnQzMl90KXN0cmxlbihDb2RhQmFyUi5BTFBIQUJFVF9TVFJJTkcpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCi0gICAgICAgICAgICBpZiAoY2ggPT0gQ29kYUJhclIuQUxQSEFCRVRfU1RSSU5HW2ldKSB7DQotICAgICAgICAgICAgICAgIGNvZGUgPSBDb2RhQmFyUi5DSEFSQUNURVJfRU5DT0RJTkdTW2ldOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB1aW50OF90IGNvbG9yID0gMTsNCi0gICAgICAgIGludDMyX3QgY291bnRlciA9IDA7DQotICAgICAgICBpbnQzMl90IGJpdCA9IDA7DQotICAgICAgICB3aGlsZSAoYml0IDwgNykgew0KLSAgICAgICAgICAgIHJlc3VsdFtwb3NpdGlvbl0gPSBjb2xvcjsNCi0gICAgICAgICAgICBwb3NpdGlvbisrOw0KLSAgICAgICAgICAgIGlmICgoKGNvZGUgPj4gKDYgLSBiaXQpKSAmIDEpID09IDAgfHwgY291bnRlciA9PSBtX2lXaWRlTmFyclJhdGlvIC0gMSkgew0KLSAgICAgICAgICAgICAgICBjb2xvciA9ICFjb2xvcjsNCi0gICAgICAgICAgICAgICAgYml0Kys7DQotICAgICAgICAgICAgICAgIGNvdW50ZXIgPSAwOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGNvdW50ZXIrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoaW5kZXggPCBkYXRhLkdldExlbmd0aCgpIC0gMSkgew0KLSAgICAgICAgICAgIHJlc3VsdFtwb3NpdGlvbl0gPSAwOw0KLSAgICAgICAgICAgIHBvc2l0aW9uICsrOw0KLSAgICAgICAgfQ0KKyAgICBzd2l0Y2ggKGNoKSB7DQorICAgICAgY2FzZSAnVCc6DQorICAgICAgICBjaCA9ICdBJzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ04nOg0KKyAgICAgICAgY2ggPSAnQic7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcqJzoNCisgICAgICAgIGNoID0gJ0MnOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnRSc6DQorICAgICAgICBjaCA9ICdEJzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBvdXRMZW5ndGggPSBwb3NpdGlvbjsNCi0gICAgcmV0dXJuIHJlc3VsdDsNCisgICAgaW50MzJfdCBjb2RlID0gMDsNCisgICAgaW50MzJfdCBsZW4gPSAoaW50MzJfdClzdHJsZW4oQ29kYUJhclIuQUxQSEFCRVRfU1RSSU5HKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgICBpZiAoY2ggPT0gQ29kYUJhclIuQUxQSEFCRVRfU1RSSU5HW2ldKSB7DQorICAgICAgICBjb2RlID0gQ29kYUJhclIuQ0hBUkFDVEVSX0VOQ09ESU5HU1tpXTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICB1aW50OF90IGNvbG9yID0gMTsNCisgICAgaW50MzJfdCBjb3VudGVyID0gMDsNCisgICAgaW50MzJfdCBiaXQgPSAwOw0KKyAgICB3aGlsZSAoYml0IDwgNykgew0KKyAgICAgIHJlc3VsdFtwb3NpdGlvbl0gPSBjb2xvcjsNCisgICAgICBwb3NpdGlvbisrOw0KKyAgICAgIGlmICgoKGNvZGUgPj4gKDYgLSBiaXQpKSAmIDEpID09IDAgfHwgY291bnRlciA9PSBtX2lXaWRlTmFyclJhdGlvIC0gMSkgew0KKyAgICAgICAgY29sb3IgPSAhY29sb3I7DQorICAgICAgICBiaXQrKzsNCisgICAgICAgIGNvdW50ZXIgPSAwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBjb3VudGVyKys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpbmRleCA8IGRhdGEuR2V0TGVuZ3RoKCkgLSAxKSB7DQorICAgICAgcmVzdWx0W3Bvc2l0aW9uXSA9IDA7DQorICAgICAgcG9zaXRpb24rKzsNCisgICAgfQ0KKyAgfQ0KKyAgb3V0TGVuZ3RoID0gcG9zaXRpb247DQorICByZXR1cm4gcmVzdWx0Ow0KIH0NCi1DRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGFCYXJXcml0ZXI6OmVuY29kZWRDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyU3RhcnQobV9jaFN0YXJ0KTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyRW5kKG1fY2hFbmQpOw0KLSAgICByZXR1cm4gc3RyU3RhcnQgKyBjb250ZW50cyArIHN0ckVuZDsNCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGFCYXJXcml0ZXI6OmVuY29kZWRDb250ZW50cygNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyU3RhcnQobV9jaFN0YXJ0KTsNCisgIENGWF9XaWRlU3RyaW5nIHN0ckVuZChtX2NoRW5kKTsNCisgIHJldHVybiBzdHJTdGFydCArIGNvbnRlbnRzICsgc3RyRW5kOw0KIH0NCi12b2lkIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIHVpbnQ4X3QqIGNvZGUsIGludDMyX3QgY29kZUxlbmd0aCwgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChlbmNvZGVkQ29udGVudHMoY29udGVudHMpLCBjb2RlLCBjb2RlTGVuZ3RoLCBpc0RldmljZSwgZSk7DQordm9pZCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJSZXN1bHQoZW5jb2RlZENvbnRlbnRzKGNvbnRlbnRzKSwgY29kZSwgY29kZUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RldmljZSwgZSk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuaAppbmRleCAyOTkxMmNjLi4yNjYwYzBiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhcldyaXRlci5oCkBAIC05LDMwICs5LDQ0IEBACiBlbnVtIEJDX1RFWFRfTE9DOw0KIGNsYXNzIENCQ19PbmVEaW1Xcml0ZXI7DQogY2xhc3MgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOw0KLWNsYXNzIENCQ19PbmVkQ29kYUJhcldyaXRlciA6IHB1YmxpYyBDQkNfT25lRGltV3JpdGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX09uZWRDb2RhQmFyV3JpdGVyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19PbmVkQ29kYUJhcldyaXRlcigpOw0KLSAgICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBpbnQzMl90ICZvdXRMZW5ndGgsIGludDMyX3QgJmUpOw0KLSAgICB1aW50OF90ICpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgJmUpOw0KLSAgICB1aW50OF90ICpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfV2lkZVN0cmluZyAgICAgICAgICBlbmNvZGVkQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQotICAgIEZYX0JPT0wJCQkJCUNoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJCUZpbHRlckNvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KLSAgICBGWF9CT09MCQkJCQlTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydCk7DQotICAgIEZYX0JPT0wJCQkJCVNldEVuZENoYXIoRlhfQ0hBUiBlbmQpOw0KLSAgICB2b2lkCQkJCQlTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKTsNCi0gICAgRlhfQk9PTAkJCQkJU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsNCi0gICAgRlhfQk9PTAkJCQkJU2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pOw0KLSAgICBGWF9CT09MCQkJCQlGaW5kQ2hhcihGWF9XQ0hBUiBjaCwgRlhfQk9PTCBpc0NvbnRlbnQpOw0KLXByaXZhdGU6DQotICAgIHZvaWQgUmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIHVpbnQ4X3QqIGNvZGUsIGludDMyX3QgY29kZUxlbmd0aCwgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSk7DQotICAgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIFNUQVJUX0VORF9DSEFSU1tdOw0KLSAgICBjb25zdCBzdGF0aWMgRlhfQ0hBUiBDT05URU5UX0NIQVJTW107DQotICAgIEZYX0NIQVIJCQltX2NoU3RhcnQ7DQotICAgIEZYX0NIQVIJCQltX2NoRW5kOw0KLSAgICBpbnQzMl90CQltX2lXaWRlTmFyclJhdGlvOw0KK2NsYXNzIENCQ19PbmVkQ29kYUJhcldyaXRlciA6IHB1YmxpYyBDQkNfT25lRGltV3JpdGVyIHsNCisgcHVibGljOg0KKyAgQ0JDX09uZWRDb2RhQmFyV3JpdGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lZENvZGFCYXJXcml0ZXIoKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBGWF9CT09MIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBGWF9CT09MIFNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KTsNCisgIEZYX0JPT0wgU2V0RW5kQ2hhcihGWF9DSEFSIGVuZCk7DQorICB2b2lkIFNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpOw0KKyAgRlhfQk9PTCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOw0KKyAgRlhfQk9PTCBTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbyk7DQorICBGWF9CT09MIEZpbmRDaGFyKEZYX1dDSEFSIGNoLCBGWF9CT09MIGlzQ29udGVudCk7DQogDQorIHByaXZhdGU6DQorICB2b2lkIFJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIFNUQVJUX0VORF9DSEFSU1tdOw0KKyAgY29uc3Qgc3RhdGljIEZYX0NIQVIgQ09OVEVOVF9DSEFSU1tdOw0KKyAgRlhfQ0hBUiBtX2NoU3RhcnQ7DQorICBGWF9DSEFSIG1fY2hFbmQ7DQorICBpbnQzMl90IG1faVdpZGVOYXJyUmF0aW87DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4UmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhSZWFkZXIuY3BwCmluZGV4IGQxZjQ1MzMuLjRjZmZlOWQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhSZWFkZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhSZWFkZXIuY3BwCkBAIC0yNSwxMTcgKzI1LDQ2IEBACiAjaW5jbHVkZSAiLi4vY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiDQogI2luY2x1ZGUgIkJDX09uZURSZWFkZXIuaCINCiAjaW5jbHVkZSAiQkNfT25lZENvZGUxMjhSZWFkZXIuaCINCi1jb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1sxMDddWzddID0gIHsNCi0gICAgezIsIDEsIDIsIDIsIDIsIDIsIDB9LA0KLSAgICB7MiwgMiwgMiwgMSwgMiwgMiwgMH0sDQotICAgIHsyLCAyLCAyLCAyLCAyLCAxLCAwfSwNCi0gICAgezEsIDIsIDEsIDIsIDIsIDMsIDB9LA0KLSAgICB7MSwgMiwgMSwgMywgMiwgMiwgMH0sDQotICAgIHsxLCAzLCAxLCAyLCAyLCAyLCAwfSwNCi0gICAgezEsIDIsIDIsIDIsIDEsIDMsIDB9LA0KLSAgICB7MSwgMiwgMiwgMywgMSwgMiwgMH0sDQotICAgIHsxLCAzLCAyLCAyLCAxLCAyLCAwfSwNCi0gICAgezIsIDIsIDEsIDIsIDEsIDMsIDB9LA0KLSAgICB7MiwgMiwgMSwgMywgMSwgMiwgMH0sDQotICAgIHsyLCAzLCAxLCAyLCAxLCAyLCAwfSwNCi0gICAgezEsIDEsIDIsIDIsIDMsIDIsIDB9LA0KLSAgICB7MSwgMiwgMiwgMSwgMywgMiwgMH0sDQotICAgIHsxLCAyLCAyLCAyLCAzLCAxLCAwfSwNCi0gICAgezEsIDEsIDMsIDIsIDIsIDIsIDB9LA0KLSAgICB7MSwgMiwgMywgMSwgMiwgMiwgMH0sDQotICAgIHsxLCAyLCAzLCAyLCAyLCAxLCAwfSwNCi0gICAgezIsIDIsIDMsIDIsIDEsIDEsIDB9LA0KLSAgICB7MiwgMiwgMSwgMSwgMywgMiwgMH0sDQotICAgIHsyLCAyLCAxLCAyLCAzLCAxLCAwfSwNCi0gICAgezIsIDEsIDMsIDIsIDEsIDIsIDB9LA0KLSAgICB7MiwgMiwgMywgMSwgMSwgMiwgMH0sDQotICAgIHszLCAxLCAyLCAxLCAzLCAxLCAwfSwNCi0gICAgezMsIDEsIDEsIDIsIDIsIDIsIDB9LA0KLSAgICB7MywgMiwgMSwgMSwgMiwgMiwgMH0sDQotICAgIHszLCAyLCAxLCAyLCAyLCAxLCAwfSwNCi0gICAgezMsIDEsIDIsIDIsIDEsIDIsIDB9LA0KLSAgICB7MywgMiwgMiwgMSwgMSwgMiwgMH0sDQotICAgIHszLCAyLCAyLCAyLCAxLCAxLCAwfSwNCi0gICAgezIsIDEsIDIsIDEsIDIsIDMsIDB9LA0KLSAgICB7MiwgMSwgMiwgMywgMiwgMSwgMH0sDQotICAgIHsyLCAzLCAyLCAxLCAyLCAxLCAwfSwNCi0gICAgezEsIDEsIDEsIDMsIDIsIDMsIDB9LA0KLSAgICB7MSwgMywgMSwgMSwgMiwgMywgMH0sDQotICAgIHsxLCAzLCAxLCAzLCAyLCAxLCAwfSwNCi0gICAgezEsIDEsIDIsIDMsIDEsIDMsIDB9LA0KLSAgICB7MSwgMywgMiwgMSwgMSwgMywgMH0sDQotICAgIHsxLCAzLCAyLCAzLCAxLCAxLCAwfSwNCi0gICAgezIsIDEsIDEsIDMsIDEsIDMsIDB9LA0KLSAgICB7MiwgMywgMSwgMSwgMSwgMywgMH0sDQotICAgIHsyLCAzLCAxLCAzLCAxLCAxLCAwfSwNCi0gICAgezEsIDEsIDIsIDEsIDMsIDMsIDB9LA0KLSAgICB7MSwgMSwgMiwgMywgMywgMSwgMH0sDQotICAgIHsxLCAzLCAyLCAxLCAzLCAxLCAwfSwNCi0gICAgezEsIDEsIDMsIDEsIDIsIDMsIDB9LA0KLSAgICB7MSwgMSwgMywgMywgMiwgMSwgMH0sDQotICAgIHsxLCAzLCAzLCAxLCAyLCAxLCAwfSwNCi0gICAgezMsIDEsIDMsIDEsIDIsIDEsIDB9LA0KLSAgICB7MiwgMSwgMSwgMywgMywgMSwgMH0sDQotICAgIHsyLCAzLCAxLCAxLCAzLCAxLCAwfSwNCi0gICAgezIsIDEsIDMsIDEsIDEsIDMsIDB9LA0KLSAgICB7MiwgMSwgMywgMywgMSwgMSwgMH0sDQotICAgIHsyLCAxLCAzLCAxLCAzLCAxLCAwfSwNCi0gICAgezMsIDEsIDEsIDEsIDIsIDMsIDB9LA0KLSAgICB7MywgMSwgMSwgMywgMiwgMSwgMH0sDQotICAgIHszLCAzLCAxLCAxLCAyLCAxLCAwfSwNCi0gICAgezMsIDEsIDIsIDEsIDEsIDMsIDB9LA0KLSAgICB7MywgMSwgMiwgMywgMSwgMSwgMH0sDQotICAgIHszLCAzLCAyLCAxLCAxLCAxLCAwfSwNCi0gICAgezMsIDEsIDQsIDEsIDEsIDEsIDB9LA0KLSAgICB7MiwgMiwgMSwgNCwgMSwgMSwgMH0sDQotICAgIHs0LCAzLCAxLCAxLCAxLCAxLCAwfSwNCi0gICAgezEsIDEsIDEsIDIsIDIsIDQsIDB9LA0KLSAgICB7MSwgMSwgMSwgNCwgMiwgMiwgMH0sDQotICAgIHsxLCAyLCAxLCAxLCAyLCA0LCAwfSwNCi0gICAgezEsIDIsIDEsIDQsIDIsIDEsIDB9LA0KLSAgICB7MSwgNCwgMSwgMSwgMiwgMiwgMH0sDQotICAgIHsxLCA0LCAxLCAyLCAyLCAxLCAwfSwNCi0gICAgezEsIDEsIDIsIDIsIDEsIDQsIDB9LA0KLSAgICB7MSwgMSwgMiwgNCwgMSwgMiwgMH0sDQotICAgIHsxLCAyLCAyLCAxLCAxLCA0LCAwfSwNCi0gICAgezEsIDIsIDIsIDQsIDEsIDEsIDB9LA0KLSAgICB7MSwgNCwgMiwgMSwgMSwgMiwgMH0sDQotICAgIHsxLCA0LCAyLCAyLCAxLCAxLCAwfSwNCi0gICAgezIsIDQsIDEsIDIsIDEsIDEsIDB9LA0KLSAgICB7MiwgMiwgMSwgMSwgMSwgNCwgMH0sDQotICAgIHs0LCAxLCAzLCAxLCAxLCAxLCAwfSwNCi0gICAgezIsIDQsIDEsIDEsIDEsIDIsIDB9LA0KLSAgICB7MSwgMywgNCwgMSwgMSwgMSwgMH0sDQotICAgIHsxLCAxLCAxLCAyLCA0LCAyLCAwfSwNCi0gICAgezEsIDIsIDEsIDEsIDQsIDIsIDB9LA0KLSAgICB7MSwgMiwgMSwgMiwgNCwgMSwgMH0sDQotICAgIHsxLCAxLCA0LCAyLCAxLCAyLCAwfSwNCi0gICAgezEsIDIsIDQsIDEsIDEsIDIsIDB9LA0KLSAgICB7MSwgMiwgNCwgMiwgMSwgMSwgMH0sDQotICAgIHs0LCAxLCAxLCAyLCAxLCAyLCAwfSwNCi0gICAgezQsIDIsIDEsIDEsIDEsIDIsIDB9LA0KLSAgICB7NCwgMiwgMSwgMiwgMSwgMSwgMH0sDQotICAgIHsyLCAxLCAyLCAxLCA0LCAxLCAwfSwNCi0gICAgezIsIDEsIDQsIDEsIDIsIDEsIDB9LA0KLSAgICB7NCwgMSwgMiwgMSwgMiwgMSwgMH0sDQotICAgIHsxLCAxLCAxLCAxLCA0LCAzLCAwfSwNCi0gICAgezEsIDEsIDEsIDMsIDQsIDEsIDB9LA0KLSAgICB7MSwgMywgMSwgMSwgNCwgMSwgMH0sDQotICAgIHsxLCAxLCA0LCAxLCAxLCAzLCAwfSwNCi0gICAgezEsIDEsIDQsIDMsIDEsIDEsIDB9LA0KLSAgICB7NCwgMSwgMSwgMSwgMSwgMywgMH0sDQotICAgIHs0LCAxLCAxLCAzLCAxLCAxLCAwfSwNCi0gICAgezEsIDEsIDMsIDEsIDQsIDEsIDB9LA0KLSAgICB7MSwgMSwgNCwgMSwgMywgMSwgMH0sDQotICAgIHszLCAxLCAxLCAxLCA0LCAxLCAwfSwNCi0gICAgezQsIDEsIDEsIDEsIDMsIDEsIDB9LA0KLSAgICB7MiwgMSwgMSwgNCwgMSwgMiwgMH0sDQotICAgIHsyLCAxLCAxLCAyLCAxLCA0LCAwfSwNCi0gICAgezIsIDEsIDEsIDIsIDMsIDIsIDB9LA0KLSAgICB7MiwgMywgMywgMSwgMSwgMSwgMn0NCi19Ow0KLWNvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpNQVhfQVZHX1ZBUklBTkNFID0gKGludDMyX3QpICgyNTYgKiAwLjI1Zik7DQotY29uc3QgaW50MzJfdCBDQkNfT25lZENvZGUxMjhSZWFkZXI6Ok1BWF9JTkRJVklEVUFMX1ZBUklBTkNFID0gKGludDMyX3QpICgyNTYgKiAwLjdmKTsNCitjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1sxMDddWzddID0gew0KKyAgICB7MiwgMSwgMiwgMiwgMiwgMiwgMH0sIHsyLCAyLCAyLCAxLCAyLCAyLCAwfSwgezIsIDIsIDIsIDIsIDIsIDEsIDB9LA0KKyAgICB7MSwgMiwgMSwgMiwgMiwgMywgMH0sIHsxLCAyLCAxLCAzLCAyLCAyLCAwfSwgezEsIDMsIDEsIDIsIDIsIDIsIDB9LA0KKyAgICB7MSwgMiwgMiwgMiwgMSwgMywgMH0sIHsxLCAyLCAyLCAzLCAxLCAyLCAwfSwgezEsIDMsIDIsIDIsIDEsIDIsIDB9LA0KKyAgICB7MiwgMiwgMSwgMiwgMSwgMywgMH0sIHsyLCAyLCAxLCAzLCAxLCAyLCAwfSwgezIsIDMsIDEsIDIsIDEsIDIsIDB9LA0KKyAgICB7MSwgMSwgMiwgMiwgMywgMiwgMH0sIHsxLCAyLCAyLCAxLCAzLCAyLCAwfSwgezEsIDIsIDIsIDIsIDMsIDEsIDB9LA0KKyAgICB7MSwgMSwgMywgMiwgMiwgMiwgMH0sIHsxLCAyLCAzLCAxLCAyLCAyLCAwfSwgezEsIDIsIDMsIDIsIDIsIDEsIDB9LA0KKyAgICB7MiwgMiwgMywgMiwgMSwgMSwgMH0sIHsyLCAyLCAxLCAxLCAzLCAyLCAwfSwgezIsIDIsIDEsIDIsIDMsIDEsIDB9LA0KKyAgICB7MiwgMSwgMywgMiwgMSwgMiwgMH0sIHsyLCAyLCAzLCAxLCAxLCAyLCAwfSwgezMsIDEsIDIsIDEsIDMsIDEsIDB9LA0KKyAgICB7MywgMSwgMSwgMiwgMiwgMiwgMH0sIHszLCAyLCAxLCAxLCAyLCAyLCAwfSwgezMsIDIsIDEsIDIsIDIsIDEsIDB9LA0KKyAgICB7MywgMSwgMiwgMiwgMSwgMiwgMH0sIHszLCAyLCAyLCAxLCAxLCAyLCAwfSwgezMsIDIsIDIsIDIsIDEsIDEsIDB9LA0KKyAgICB7MiwgMSwgMiwgMSwgMiwgMywgMH0sIHsyLCAxLCAyLCAzLCAyLCAxLCAwfSwgezIsIDMsIDIsIDEsIDIsIDEsIDB9LA0KKyAgICB7MSwgMSwgMSwgMywgMiwgMywgMH0sIHsxLCAzLCAxLCAxLCAyLCAzLCAwfSwgezEsIDMsIDEsIDMsIDIsIDEsIDB9LA0KKyAgICB7MSwgMSwgMiwgMywgMSwgMywgMH0sIHsxLCAzLCAyLCAxLCAxLCAzLCAwfSwgezEsIDMsIDIsIDMsIDEsIDEsIDB9LA0KKyAgICB7MiwgMSwgMSwgMywgMSwgMywgMH0sIHsyLCAzLCAxLCAxLCAxLCAzLCAwfSwgezIsIDMsIDEsIDMsIDEsIDEsIDB9LA0KKyAgICB7MSwgMSwgMiwgMSwgMywgMywgMH0sIHsxLCAxLCAyLCAzLCAzLCAxLCAwfSwgezEsIDMsIDIsIDEsIDMsIDEsIDB9LA0KKyAgICB7MSwgMSwgMywgMSwgMiwgMywgMH0sIHsxLCAxLCAzLCAzLCAyLCAxLCAwfSwgezEsIDMsIDMsIDEsIDIsIDEsIDB9LA0KKyAgICB7MywgMSwgMywgMSwgMiwgMSwgMH0sIHsyLCAxLCAxLCAzLCAzLCAxLCAwfSwgezIsIDMsIDEsIDEsIDMsIDEsIDB9LA0KKyAgICB7MiwgMSwgMywgMSwgMSwgMywgMH0sIHsyLCAxLCAzLCAzLCAxLCAxLCAwfSwgezIsIDEsIDMsIDEsIDMsIDEsIDB9LA0KKyAgICB7MywgMSwgMSwgMSwgMiwgMywgMH0sIHszLCAxLCAxLCAzLCAyLCAxLCAwfSwgezMsIDMsIDEsIDEsIDIsIDEsIDB9LA0KKyAgICB7MywgMSwgMiwgMSwgMSwgMywgMH0sIHszLCAxLCAyLCAzLCAxLCAxLCAwfSwgezMsIDMsIDIsIDEsIDEsIDEsIDB9LA0KKyAgICB7MywgMSwgNCwgMSwgMSwgMSwgMH0sIHsyLCAyLCAxLCA0LCAxLCAxLCAwfSwgezQsIDMsIDEsIDEsIDEsIDEsIDB9LA0KKyAgICB7MSwgMSwgMSwgMiwgMiwgNCwgMH0sIHsxLCAxLCAxLCA0LCAyLCAyLCAwfSwgezEsIDIsIDEsIDEsIDIsIDQsIDB9LA0KKyAgICB7MSwgMiwgMSwgNCwgMiwgMSwgMH0sIHsxLCA0LCAxLCAxLCAyLCAyLCAwfSwgezEsIDQsIDEsIDIsIDIsIDEsIDB9LA0KKyAgICB7MSwgMSwgMiwgMiwgMSwgNCwgMH0sIHsxLCAxLCAyLCA0LCAxLCAyLCAwfSwgezEsIDIsIDIsIDEsIDEsIDQsIDB9LA0KKyAgICB7MSwgMiwgMiwgNCwgMSwgMSwgMH0sIHsxLCA0LCAyLCAxLCAxLCAyLCAwfSwgezEsIDQsIDIsIDIsIDEsIDEsIDB9LA0KKyAgICB7MiwgNCwgMSwgMiwgMSwgMSwgMH0sIHsyLCAyLCAxLCAxLCAxLCA0LCAwfSwgezQsIDEsIDMsIDEsIDEsIDEsIDB9LA0KKyAgICB7MiwgNCwgMSwgMSwgMSwgMiwgMH0sIHsxLCAzLCA0LCAxLCAxLCAxLCAwfSwgezEsIDEsIDEsIDIsIDQsIDIsIDB9LA0KKyAgICB7MSwgMiwgMSwgMSwgNCwgMiwgMH0sIHsxLCAyLCAxLCAyLCA0LCAxLCAwfSwgezEsIDEsIDQsIDIsIDEsIDIsIDB9LA0KKyAgICB7MSwgMiwgNCwgMSwgMSwgMiwgMH0sIHsxLCAyLCA0LCAyLCAxLCAxLCAwfSwgezQsIDEsIDEsIDIsIDEsIDIsIDB9LA0KKyAgICB7NCwgMiwgMSwgMSwgMSwgMiwgMH0sIHs0LCAyLCAxLCAyLCAxLCAxLCAwfSwgezIsIDEsIDIsIDEsIDQsIDEsIDB9LA0KKyAgICB7MiwgMSwgNCwgMSwgMiwgMSwgMH0sIHs0LCAxLCAyLCAxLCAyLCAxLCAwfSwgezEsIDEsIDEsIDEsIDQsIDMsIDB9LA0KKyAgICB7MSwgMSwgMSwgMywgNCwgMSwgMH0sIHsxLCAzLCAxLCAxLCA0LCAxLCAwfSwgezEsIDEsIDQsIDEsIDEsIDMsIDB9LA0KKyAgICB7MSwgMSwgNCwgMywgMSwgMSwgMH0sIHs0LCAxLCAxLCAxLCAxLCAzLCAwfSwgezQsIDEsIDEsIDMsIDEsIDEsIDB9LA0KKyAgICB7MSwgMSwgMywgMSwgNCwgMSwgMH0sIHsxLCAxLCA0LCAxLCAzLCAxLCAwfSwgezMsIDEsIDEsIDEsIDQsIDEsIDB9LA0KKyAgICB7NCwgMSwgMSwgMSwgMywgMSwgMH0sIHsyLCAxLCAxLCA0LCAxLCAyLCAwfSwgezIsIDEsIDEsIDIsIDEsIDQsIDB9LA0KKyAgICB7MiwgMSwgMSwgMiwgMywgMiwgMH0sIHsyLCAzLCAzLCAxLCAxLCAxLCAyfX07DQorY29uc3QgaW50MzJfdCBDQkNfT25lZENvZGUxMjhSZWFkZXI6Ok1BWF9BVkdfVkFSSUFOQ0UgPSAoaW50MzJfdCkoMjU2ICogMC4yNWYpOw0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRSA9DQorICAgIChpbnQzMl90KSgyNTYgKiAwLjdmKTsNCiBjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9TSElGVCA9IDk4Ow0KIGNvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX0NPREVfQyA9IDk5Ow0KIGNvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX0NPREVfQiA9IDEwMDsNCkBAIC0xNDksMjgyICs3OCwyODkgQEAKIGNvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1NUQVJUX0IgPSAxMDQ7DQogY29uc3QgaW50MzJfdCBDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfU1RBUlRfQyA9IDEwNTsNCiBjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9TVE9QID0gMTA2Ow0KLUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q0JDX09uZWRDb2RlMTI4UmVhZGVyKCkNCi17DQotfQ0KLUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6fkNCQ19PbmVkQ29kZTEyOFJlYWRlcigpDQotew0KLX0NCi1DRlhfSW50MzJBcnJheSAqQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpGaW5kU3RhcnRQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCB3aWR0aCA9IHJvdy0+R2V0U2l6ZSgpOw0KLSAgICBpbnQzMl90IHJvd09mZnNldCA9IDA7DQotICAgIHdoaWxlIChyb3dPZmZzZXQgPCB3aWR0aCkgew0KLSAgICAgICAgaWYgKHJvdy0+R2V0KHJvd09mZnNldCkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIHJvd09mZnNldCsrOw0KK0NCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q0JDX09uZWRDb2RlMTI4UmVhZGVyKCkge30NCitDQkNfT25lZENvZGUxMjhSZWFkZXI6On5DQkNfT25lZENvZGUxMjhSZWFkZXIoKSB7fQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfT25lZENvZGUxMjhSZWFkZXI6OkZpbmRTdGFydFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IHdpZHRoID0gcm93LT5HZXRTaXplKCk7DQorICBpbnQzMl90IHJvd09mZnNldCA9IDA7DQorICB3aGlsZSAocm93T2Zmc2V0IDwgd2lkdGgpIHsNCisgICAgaWYgKHJvdy0+R2V0KHJvd09mZnNldCkpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpbnQzMl90IGNvdW50ZXJQb3NpdGlvbiA9IDA7DQotICAgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KLSAgICBjb3VudGVycy5TZXRTaXplKDYpOw0KLSAgICBpbnQzMl90IHBhdHRlcm5TdGFydCA9IHJvd09mZnNldDsNCi0gICAgRlhfQk9PTCBpc1doaXRlID0gRkFMU0U7DQotICAgIGludDMyX3QgcGF0dGVybkxlbmd0aCA9IGNvdW50ZXJzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSByb3dPZmZzZXQ7IGkgPCB3aWR0aDsgaSsrKSB7DQotICAgICAgICBGWF9CT09MIHBpeGVsID0gcm93LT5HZXQoaSk7DQotICAgICAgICBpZiAocGl4ZWwgXiBpc1doaXRlKSB7DQotICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc2l0aW9uXSsrOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoY291bnRlclBvc2l0aW9uID09IHBhdHRlcm5MZW5ndGggLSAxKSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgYmVzdFZhcmlhbmNlID0gTUFYX0FWR19WQVJJQU5DRTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBiZXN0TWF0Y2ggPSAtMTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IHN0YXJ0Q29kZSA9IENPREVfU1RBUlRfQTsgc3RhcnRDb2RlIDw9IENPREVfU1RBUlRfQzsgc3RhcnRDb2RlKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFyaWFuY2UgPSBQYXR0ZXJuTWF0Y2hWYXJpYW5jZSgmY291bnRlcnMsICZDT0RFX1BBVFRFUk5TW3N0YXJ0Q29kZV1bMF0sIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYW5jZSA8IGJlc3RWYXJpYW5jZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RWYXJpYW5jZSA9IHZhcmlhbmNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IHN0YXJ0Q29kZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoYmVzdE1hdGNoID49IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYnRlbXAyID0gcm93LT5Jc1JhbmdlKEZYX01BWCgwLCBwYXR0ZXJuU3RhcnQgLSAoaSAtIHBhdHRlcm5TdGFydCkgLyAyKSwgcGF0dGVyblN0YXJ0LCBGQUxTRSwgZSk7DQotICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoYnRlbXAyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkgKnJlc3VsdCA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQtPlNldFNpemUoMyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bHQpWzBdID0gcGF0dGVyblN0YXJ0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcmVzdWx0KVsxXSA9IGk7DQotICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bHQpWzJdID0gYmVzdE1hdGNoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ICs9IGNvdW50ZXJzWzBdICsgY291bnRlcnNbMV07DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCB5ID0gMjsgeSA8IHBhdHRlcm5MZW5ndGg7IHkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgY291bnRlcnNbeSAtIDJdID0gY291bnRlcnNbeV07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY291bnRlcnNbcGF0dGVybkxlbmd0aCAtIDJdID0gMDsNCi0gICAgICAgICAgICAgICAgY291bnRlcnNbcGF0dGVybkxlbmd0aCAtIDFdID0gMDsNCi0gICAgICAgICAgICAgICAgY291bnRlclBvc2l0aW9uLS07DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgY291bnRlclBvc2l0aW9uKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NpdGlvbl0gPSAxOw0KLSAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLWludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpEZWNvZGVDb2RlKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqY291bnRlcnMsIGludDMyX3Qgcm93T2Zmc2V0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgUmVjb3JkUGF0dGVybihyb3csIHJvd09mZnNldCwgY291bnRlcnMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQotICAgIGludDMyX3QgYmVzdFZhcmlhbmNlID0gTUFYX0FWR19WQVJJQU5DRTsNCi0gICAgaW50MzJfdCBiZXN0TWF0Y2ggPSAtMTsNCi0gICAgZm9yIChpbnQzMl90IGQgPSAwOyBkIDwgMTA3OyBkKyspIHsNCi0gICAgICAgIGludDMyX3QgdmFyaWFuY2UgPSBQYXR0ZXJuTWF0Y2hWYXJpYW5jZShjb3VudGVycywgJkNPREVfUEFUVEVSTlNbZF1bMF0sIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKTsNCi0gICAgICAgIGlmICh2YXJpYW5jZSA8IGJlc3RWYXJpYW5jZSkgew0KLSAgICAgICAgICAgIGJlc3RWYXJpYW5jZSA9IHZhcmlhbmNlOw0KLSAgICAgICAgICAgIGJlc3RNYXRjaCA9IGQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGJlc3RNYXRjaCA+PSAwKSB7DQotICAgICAgICByZXR1cm4gYmVzdE1hdGNoOw0KKyAgICByb3dPZmZzZXQrKzsNCisgIH0NCisgIGludDMyX3QgY291bnRlclBvc2l0aW9uID0gMDsNCisgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgY291bnRlcnMuU2V0U2l6ZSg2KTsNCisgIGludDMyX3QgcGF0dGVyblN0YXJ0ID0gcm93T2Zmc2V0Ow0KKyAgRlhfQk9PTCBpc1doaXRlID0gRkFMU0U7DQorICBpbnQzMl90IHBhdHRlcm5MZW5ndGggPSBjb3VudGVycy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IHJvd09mZnNldDsgaSA8IHdpZHRoOyBpKyspIHsNCisgICAgRlhfQk9PTCBwaXhlbCA9IHJvdy0+R2V0KGkpOw0KKyAgICBpZiAocGl4ZWwgXiBpc1doaXRlKSB7DQorICAgICAgY291bnRlcnNbY291bnRlclBvc2l0aW9uXSsrOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICByZXR1cm4gMDsNCisgICAgICBpZiAoY291bnRlclBvc2l0aW9uID09IHBhdHRlcm5MZW5ndGggLSAxKSB7DQorICAgICAgICBpbnQzMl90IGJlc3RWYXJpYW5jZSA9IE1BWF9BVkdfVkFSSUFOQ0U7DQorICAgICAgICBpbnQzMl90IGJlc3RNYXRjaCA9IC0xOw0KKyAgICAgICAgZm9yIChpbnQzMl90IHN0YXJ0Q29kZSA9IENPREVfU1RBUlRfQTsgc3RhcnRDb2RlIDw9IENPREVfU1RBUlRfQzsNCisgICAgICAgICAgICAgc3RhcnRDb2RlKyspIHsNCisgICAgICAgICAgaW50MzJfdCB2YXJpYW5jZSA9IFBhdHRlcm5NYXRjaFZhcmlhbmNlKA0KKyAgICAgICAgICAgICAgJmNvdW50ZXJzLCAmQ09ERV9QQVRURVJOU1tzdGFydENvZGVdWzBdLCBNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRSk7DQorICAgICAgICAgIGlmICh2YXJpYW5jZSA8IGJlc3RWYXJpYW5jZSkgew0KKyAgICAgICAgICAgIGJlc3RWYXJpYW5jZSA9IHZhcmlhbmNlOw0KKyAgICAgICAgICAgIGJlc3RNYXRjaCA9IHN0YXJ0Q29kZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJlc3RNYXRjaCA+PSAwKSB7DQorICAgICAgICAgIEZYX0JPT0wgYnRlbXAyID0NCisgICAgICAgICAgICAgIHJvdy0+SXNSYW5nZShGWF9NQVgoMCwgcGF0dGVyblN0YXJ0IC0gKGkgLSBwYXR0ZXJuU3RhcnQpIC8gMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0LCBGQUxTRSwgZSk7DQorICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgaWYgKGJ0ZW1wMikgew0KKyAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiByZXN1bHQgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICAgICAgICAgICAgcmVzdWx0LT5TZXRTaXplKDMpOw0KKyAgICAgICAgICAgICgqcmVzdWx0KVswXSA9IHBhdHRlcm5TdGFydDsNCisgICAgICAgICAgICAoKnJlc3VsdClbMV0gPSBpOw0KKyAgICAgICAgICAgICgqcmVzdWx0KVsyXSA9IGJlc3RNYXRjaDsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwYXR0ZXJuU3RhcnQgKz0gY291bnRlcnNbMF0gKyBjb3VudGVyc1sxXTsNCisgICAgICAgIGZvciAoaW50MzJfdCB5ID0gMjsgeSA8IHBhdHRlcm5MZW5ndGg7IHkrKykgew0KKyAgICAgICAgICBjb3VudGVyc1t5IC0gMl0gPSBjb3VudGVyc1t5XTsNCisgICAgICAgIH0NCisgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAyXSA9IDA7DQorICAgICAgICBjb3VudGVyc1twYXR0ZXJuTGVuZ3RoIC0gMV0gPSAwOw0KKyAgICAgICAgY291bnRlclBvc2l0aW9uLS07DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNvdW50ZXJQb3NpdGlvbisrOw0KKyAgICAgIH0NCisgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dID0gMTsNCisgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQogICAgIH0NCi0gICAgcmV0dXJuIDA7DQorICB9DQorICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgIHJldHVybiBOVUxMOw0KIH0NCi1DRlhfQnl0ZVN0cmluZyBDQkNfT25lZENvZGUxMjhSZWFkZXI6OkRlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfSW50MzJBcnJheSAqc3RhcnRQYXR0ZXJuSW5mbyA9IEZpbmRTdGFydFBhdHRlcm4ocm93LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgaW50MzJfdCBzdGFydENvZGUgPSAoKnN0YXJ0UGF0dGVybkluZm8pWzJdOw0KLSAgICBpbnQzMl90IGNvZGVTZXQ7DQotICAgIHN3aXRjaCAoc3RhcnRDb2RlKSB7DQotICAgICAgICBjYXNlIDEwMzoNCi0gICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0E7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDEwNDoNCi0gICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0I7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDEwNToNCi0gICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0M7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGlmKHN0YXJ0UGF0dGVybkluZm8gIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBzdGFydFBhdHRlcm5JbmZvLT5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHN0YXJ0UGF0dGVybkluZm87DQotICAgICAgICAgICAgICAgIHN0YXJ0UGF0dGVybkluZm8gPSBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQotICAgICAgICAgICAgcmV0dXJuICIiOw0KK2ludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpEZWNvZGVDb2RlKENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBjb3VudGVycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd09mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBSZWNvcmRQYXR0ZXJuKHJvdywgcm93T2Zmc2V0LCBjb3VudGVycywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICBpbnQzMl90IGJlc3RWYXJpYW5jZSA9IE1BWF9BVkdfVkFSSUFOQ0U7DQorICBpbnQzMl90IGJlc3RNYXRjaCA9IC0xOw0KKyAgZm9yIChpbnQzMl90IGQgPSAwOyBkIDwgMTA3OyBkKyspIHsNCisgICAgaW50MzJfdCB2YXJpYW5jZSA9IFBhdHRlcm5NYXRjaFZhcmlhbmNlKGNvdW50ZXJzLCAmQ09ERV9QQVRURVJOU1tkXVswXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKTsNCisgICAgaWYgKHZhcmlhbmNlIDwgYmVzdFZhcmlhbmNlKSB7DQorICAgICAgYmVzdFZhcmlhbmNlID0gdmFyaWFuY2U7DQorICAgICAgYmVzdE1hdGNoID0gZDsNCiAgICAgfQ0KLSAgICBGWF9CT09MIGRvbmUgPSBGQUxTRTsNCi0gICAgRlhfQk9PTCBpc05leHRTaGlmdGVkID0gRkFMU0U7DQotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCi0gICAgaW50MzJfdCBsYXN0U3RhcnQgPSAoKnN0YXJ0UGF0dGVybkluZm8pWzBdOw0KLSAgICBpbnQzMl90IG5leHRTdGFydCA9ICgqc3RhcnRQYXR0ZXJuSW5mbylbMV07DQotICAgIGlmKHN0YXJ0UGF0dGVybkluZm8gIT0gTlVMTCkgew0KKyAgfQ0KKyAgaWYgKGJlc3RNYXRjaCA+PSAwKSB7DQorICAgIHJldHVybiBiZXN0TWF0Y2g7DQorICB9IGVsc2Ugew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfSW50MzJBcnJheSogc3RhcnRQYXR0ZXJuSW5mbyA9IEZpbmRTdGFydFBhdHRlcm4ocm93LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBpbnQzMl90IHN0YXJ0Q29kZSA9ICgqc3RhcnRQYXR0ZXJuSW5mbylbMl07DQorICBpbnQzMl90IGNvZGVTZXQ7DQorICBzd2l0Y2ggKHN0YXJ0Q29kZSkgew0KKyAgICBjYXNlIDEwMzoNCisgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0E7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTA0Og0KKyAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxMDU6DQorICAgICAgY29kZVNldCA9IENPREVfQ09ERV9DOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGlmIChzdGFydFBhdHRlcm5JbmZvICE9IE5VTEwpIHsNCiAgICAgICAgIHN0YXJ0UGF0dGVybkluZm8tPlJlbW92ZUFsbCgpOw0KICAgICAgICAgZGVsZXRlIHN0YXJ0UGF0dGVybkluZm87DQogICAgICAgICBzdGFydFBhdHRlcm5JbmZvID0gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfSW50MzJBcnJheSBjb3VudGVyczsNCi0gICAgY291bnRlcnMuU2V0U2l6ZSg2KTsNCi0gICAgaW50MzJfdCBsYXN0Q29kZSA9IDA7DQotICAgIGludDMyX3QgY29kZSA9IDA7DQotICAgIGludDMyX3QgY2hlY2tzdW1Ub3RhbCA9IHN0YXJ0Q29kZTsNCi0gICAgaW50MzJfdCBtdWx0aXBsaWVyID0gMDsNCi0gICAgRlhfQk9PTCBsYXN0Q2hhcmFjdGVyV2FzUHJpbnRhYmxlID0gVFJVRTsNCi0gICAgd2hpbGUgKCFkb25lKSB7DQotICAgICAgICBGWF9CT09MIHVuc2hpZnQgPSBpc05leHRTaGlmdGVkOw0KLSAgICAgICAgaXNOZXh0U2hpZnRlZCA9IEZBTFNFOw0KLSAgICAgICAgbGFzdENvZGUgPSBjb2RlOw0KLSAgICAgICAgY29kZSA9IERlY29kZUNvZGUocm93LCAmY291bnRlcnMsIG5leHRTdGFydCwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICAgICAgaWYgKGNvZGUgIT0gQ09ERV9TVE9QKSB7DQotICAgICAgICAgICAgbGFzdENoYXJhY3Rlcldhc1ByaW50YWJsZSA9IFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoY29kZSAhPSBDT0RFX1NUT1ApIHsNCi0gICAgICAgICAgICBtdWx0aXBsaWVyKys7DQotICAgICAgICAgICAgY2hlY2tzdW1Ub3RhbCArPSBtdWx0aXBsaWVyICogY29kZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGxhc3RTdGFydCA9IG5leHRTdGFydDsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgbmV4dFN0YXJ0ICs9IGNvdW50ZXJzW2ldOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3dpdGNoIChjb2RlKSB7DQotICAgICAgICAgICAgY2FzZSAxMDM6DQotICAgICAgICAgICAgY2FzZSAxMDQ6DQotICAgICAgICAgICAgY2FzZSAxMDU6DQotICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3dpdGNoIChjb2RlU2V0KSB7DQotICAgICAgICAgICAgY2FzZSAxMDE6DQotICAgICAgICAgICAgICAgIGlmIChjb2RlIDwgNjQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgKCcgJyArIGNvZGUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPCA5Nikgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSAoY29kZSAtIDY0KTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IENPREVfU1RPUCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaGFyYWN0ZXJXYXNQcmludGFibGUgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAyOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTc6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5NjoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5ODoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXh0U2hpZnRlZCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDA6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZVNldCA9IENPREVfQ09ERV9DOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwNjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgMTAwOg0KLSAgICAgICAgICAgICAgICBpZiAoY29kZSA8IDk2KSB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpICgnICcgKyBjb2RlKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IENPREVfU1RPUCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaGFyYWN0ZXJXYXNQcmludGFibGUgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAyOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTc6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5NjoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5ODoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXh0U2hpZnRlZCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDE6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZVNldCA9IENPREVfQ09ERV9DOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwNjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgOTk6DQotICAgICAgICAgICAgICAgIGlmIChjb2RlIDwgMTAwKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA8IDEwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcwJzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIEZYX0NIQVIgdGVtcFsxMjhdOw0KLSNpZiBkZWZpbmVkKF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8pDQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmX3ModGVtcCwgMTI4LCAiJWQiLCBjb2RlKTsNCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgc3ByaW50Zih0ZW1wLCAiJWQiLCBjb2RlKTsNCi0jZW5kaWYNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0ZW1wOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gQ09ERV9TVE9QKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENoYXJhY3Rlcldhc1ByaW50YWJsZSA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDI6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAxOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0E7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA2Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZiAodW5zaGlmdCkgew0KLSAgICAgICAgICAgIGNvZGVTZXQgPSBjb2RlU2V0ID09IENPREVfQ09ERV9BID8gQ09ERV9DT0RFX0IgOiBDT0RFX0NPREVfQTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpbnQzMl90IHdpZHRoID0gcm93LT5HZXRTaXplKCk7DQotICAgIHdoaWxlIChuZXh0U3RhcnQgPCB3aWR0aCAmJiByb3ctPkdldChuZXh0U3RhcnQpKSB7DQotICAgICAgICBuZXh0U3RhcnQrKzsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJvb2xUMSA9IHJvdy0+SXNSYW5nZShuZXh0U3RhcnQsIEZYX01JTih3aWR0aCwgbmV4dFN0YXJ0ICsgKG5leHRTdGFydCAtIGxhc3RTdGFydCkgLyAyKSwgRkFMU0UsIGUpOw0KKyAgICAgIH0NCisgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgcmV0dXJuICIiOw0KKyAgfQ0KKyAgRlhfQk9PTCBkb25lID0gRkFMU0U7DQorICBGWF9CT09MIGlzTmV4dFNoaWZ0ZWQgPSBGQUxTRTsNCisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCisgIGludDMyX3QgbGFzdFN0YXJ0ID0gKCpzdGFydFBhdHRlcm5JbmZvKVswXTsNCisgIGludDMyX3QgbmV4dFN0YXJ0ID0gKCpzdGFydFBhdHRlcm5JbmZvKVsxXTsNCisgIGlmIChzdGFydFBhdHRlcm5JbmZvICE9IE5VTEwpIHsNCisgICAgc3RhcnRQYXR0ZXJuSW5mby0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBzdGFydFBhdHRlcm5JbmZvOw0KKyAgICBzdGFydFBhdHRlcm5JbmZvID0gTlVMTDsNCisgIH0NCisgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgY291bnRlcnMuU2V0U2l6ZSg2KTsNCisgIGludDMyX3QgbGFzdENvZGUgPSAwOw0KKyAgaW50MzJfdCBjb2RlID0gMDsNCisgIGludDMyX3QgY2hlY2tzdW1Ub3RhbCA9IHN0YXJ0Q29kZTsNCisgIGludDMyX3QgbXVsdGlwbGllciA9IDA7DQorICBGWF9CT09MIGxhc3RDaGFyYWN0ZXJXYXNQcmludGFibGUgPSBUUlVFOw0KKyAgd2hpbGUgKCFkb25lKSB7DQorICAgIEZYX0JPT0wgdW5zaGlmdCA9IGlzTmV4dFNoaWZ0ZWQ7DQorICAgIGlzTmV4dFNoaWZ0ZWQgPSBGQUxTRTsNCisgICAgbGFzdENvZGUgPSBjb2RlOw0KKyAgICBjb2RlID0gRGVjb2RlQ29kZShyb3csICZjb3VudGVycywgbmV4dFN0YXJ0LCBlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgaWYgKCFib29sVDEpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KLSAgICAgICAgcmV0dXJuICIiOw0KKyAgICBpZiAoY29kZSAhPSBDT0RFX1NUT1ApIHsNCisgICAgICBsYXN0Q2hhcmFjdGVyV2FzUHJpbnRhYmxlID0gVFJVRTsNCiAgICAgfQ0KLSAgICBjaGVja3N1bVRvdGFsIC09IG11bHRpcGxpZXIgKiBsYXN0Q29kZTsNCi0gICAgaWYgKGNoZWNrc3VtVG90YWwgJSAxMDMgIT0gbGFzdENvZGUpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uOw0KLSAgICAgICAgcmV0dXJuICIiOw0KKyAgICBpZiAoY29kZSAhPSBDT0RFX1NUT1ApIHsNCisgICAgICBtdWx0aXBsaWVyKys7DQorICAgICAgY2hlY2tzdW1Ub3RhbCArPSBtdWx0aXBsaWVyICogY29kZTsNCiAgICAgfQ0KLSAgICBpbnQzMl90IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKHJlc3VsdExlbmd0aCA+IDAgJiYgbGFzdENoYXJhY3Rlcldhc1ByaW50YWJsZSkgew0KLSAgICAgICAgaWYgKGNvZGVTZXQgPT0gQ09ERV9DT0RFX0MpIHsNCi0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuTWlkKDAsIHJlc3VsdC5HZXRMZW5ndGgoKSAtIDIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuTWlkKDAsIHJlc3VsdC5HZXRMZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgfQ0KKyAgICBsYXN0U3RhcnQgPSBuZXh0U3RhcnQ7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgbmV4dFN0YXJ0ICs9IGNvdW50ZXJzW2ldOw0KICAgICB9DQotICAgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICBzd2l0Y2ggKGNvZGUpIHsNCisgICAgICBjYXNlIDEwMzoNCisgICAgICBjYXNlIDEwNDoNCisgICAgICBjYXNlIDEwNToNCiAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCiAgICAgICAgIHJldHVybiAiIjsNCiAgICAgfQ0KLSAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICBzd2l0Y2ggKGNvZGVTZXQpIHsNCisgICAgICBjYXNlIDEwMToNCisgICAgICAgIGlmIChjb2RlIDwgNjQpIHsNCisgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSgnICcgKyBjb2RlKTsNCisgICAgICAgIH0gZWxzZSBpZiAoY29kZSA8IDk2KSB7DQorICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikoY29kZSAtIDY0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChjb2RlICE9IENPREVfU1RPUCkgew0KKyAgICAgICAgICAgIGxhc3RDaGFyYWN0ZXJXYXNQcmludGFibGUgPSBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsNCisgICAgICAgICAgICBjYXNlIDEwMjoNCisgICAgICAgICAgICBjYXNlIDk3Og0KKyAgICAgICAgICAgIGNhc2UgOTY6DQorICAgICAgICAgICAgY2FzZSAxMDE6DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDk4Og0KKyAgICAgICAgICAgICAgaXNOZXh0U2hpZnRlZCA9IFRSVUU7DQorICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0I7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDEwMDoNCisgICAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQjsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgOTk6DQorICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0M7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDEwNjoNCisgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMTAwOg0KKyAgICAgICAgaWYgKGNvZGUgPCA5Nikgew0KKyAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpKCcgJyArIGNvZGUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGNvZGUgIT0gQ09ERV9TVE9QKSB7DQorICAgICAgICAgICAgbGFzdENoYXJhY3Rlcldhc1ByaW50YWJsZSA9IEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAoY29kZSkgew0KKyAgICAgICAgICAgIGNhc2UgMTAyOg0KKyAgICAgICAgICAgIGNhc2UgOTc6DQorICAgICAgICAgICAgY2FzZSA5NjoNCisgICAgICAgICAgICBjYXNlIDEwMDoNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgOTg6DQorICAgICAgICAgICAgICBpc05leHRTaGlmdGVkID0gVFJVRTsNCisgICAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMTAxOg0KKyAgICAgICAgICAgICAgY29kZVNldCA9IENPREVfQ09ERV9BOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSA5OToNCisgICAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQzsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMTA2Og0KKyAgICAgICAgICAgICAgZG9uZSA9IFRSVUU7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSA5OToNCisgICAgICAgIGlmIChjb2RlIDwgMTAwKSB7DQorICAgICAgICAgIGlmIChjb2RlIDwgMTApIHsNCisgICAgICAgICAgICByZXN1bHQgKz0gJzAnOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX0NIQVIgdGVtcFsxMjhdOw0KKyNpZiBkZWZpbmVkKF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8pDQorICAgICAgICAgIHNwcmludGZfcyh0ZW1wLCAxMjgsICIlZCIsIGNvZGUpOw0KKyNlbHNlDQorICAgICAgICAgIHNwcmludGYodGVtcCwgIiVkIiwgY29kZSk7DQorI2VuZGlmDQorICAgICAgICAgIHJlc3VsdCArPSB0ZW1wOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGNvZGUgIT0gQ09ERV9TVE9QKSB7DQorICAgICAgICAgICAgbGFzdENoYXJhY3Rlcldhc1ByaW50YWJsZSA9IEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN3aXRjaCAoY29kZSkgew0KKyAgICAgICAgICAgIGNhc2UgMTAyOg0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAxMDE6DQorICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0E7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDEwMDoNCisgICAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQjsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMTA2Og0KKyAgICAgICAgICAgICAgZG9uZSA9IFRSVUU7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKHVuc2hpZnQpIHsNCisgICAgICBjb2RlU2V0ID0gY29kZVNldCA9PSBDT0RFX0NPREVfQSA/IENPREVfQ09ERV9CIDogQ09ERV9DT0RFX0E7DQorICAgIH0NCisgIH0NCisgIGludDMyX3Qgd2lkdGggPSByb3ctPkdldFNpemUoKTsNCisgIHdoaWxlIChuZXh0U3RhcnQgPCB3aWR0aCAmJiByb3ctPkdldChuZXh0U3RhcnQpKSB7DQorICAgIG5leHRTdGFydCsrOw0KKyAgfQ0KKyAgRlhfQk9PTCBib29sVDEgPSByb3ctPklzUmFuZ2UoDQorICAgICAgbmV4dFN0YXJ0LCBGWF9NSU4od2lkdGgsIG5leHRTdGFydCArIChuZXh0U3RhcnQgLSBsYXN0U3RhcnQpIC8gMiksIEZBTFNFLA0KKyAgICAgIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIGlmICghYm9vbFQxKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICByZXR1cm4gIiI7DQorICB9DQorICBjaGVja3N1bVRvdGFsIC09IG11bHRpcGxpZXIgKiBsYXN0Q29kZTsNCisgIGlmIChjaGVja3N1bVRvdGFsICUgMTAzICE9IGxhc3RDb2RlKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uOw0KKyAgICByZXR1cm4gIiI7DQorICB9DQorICBpbnQzMl90IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5HZXRMZW5ndGgoKTsNCisgIGlmIChyZXN1bHRMZW5ndGggPiAwICYmIGxhc3RDaGFyYWN0ZXJXYXNQcmludGFibGUpIHsNCisgICAgaWYgKGNvZGVTZXQgPT0gQ09ERV9DT0RFX0MpIHsNCisgICAgICByZXN1bHQgPSByZXN1bHQuTWlkKDAsIHJlc3VsdC5HZXRMZW5ndGgoKSAtIDIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJlc3VsdCA9IHJlc3VsdC5NaWQoMCwgcmVzdWx0LkdldExlbmd0aCgpIC0gMSk7DQorICAgIH0NCisgIH0NCisgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgIHJldHVybiAiIjsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhSZWFkZXIuaAppbmRleCA1NThiMTExLi5kOTQ2YzBhIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4UmVhZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFJlYWRlci5oCkBAIC05LDMyICs5LDM4IEBACiBjbGFzcyBDQkNfT25lRFJlYWRlcjsNCiBjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7DQogY2xhc3MgQ0JDX09uZWRDb2RhMTI4UmVhZGVyOw0KLWNsYXNzIENCQ19PbmVkQ29kZTEyOFJlYWRlciA6IHB1YmxpYyBDQkNfT25lRFJlYWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19PbmVkQ29kZTEyOFJlYWRlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfT25lZENvZGUxMjhSZWFkZXIoKTsNCi0gICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKTsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9QQVRURVJOU1sxMDddWzddOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBNQVhfQVZHX1ZBUklBTkNFOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRTsNCitjbGFzcyBDQkNfT25lZENvZGUxMjhSZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURSZWFkZXIgew0KKyBwdWJsaWM6DQorICBDQkNfT25lZENvZGUxMjhSZWFkZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19PbmVkQ29kZTEyOFJlYWRlcigpOw0KKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfUEFUVEVSTlNbMTA3XVs3XTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IE1BWF9BVkdfVkFSSUFOQ0U7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRTsNCiANCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9TSElGVDsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9DT0RFX0M7DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfQ09ERV9COw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX0NPREVfQTsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9GTkNfMTsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9GTkNfMjsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9GTkNfMzsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9GTkNfNF9BOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX0ZOQ180X0IgOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9TSElGVDsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfQ09ERV9DOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9DT0RFX0I7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX0NPREVfQTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfRk5DXzE7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX0ZOQ18yOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9GTkNfMzsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfRk5DXzRfQTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfRk5DXzRfQjsNCiANCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9TVEFSVF9BOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX1NUQVJUX0I7DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfU1RBUlRfQzsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9TVE9QOw0KLXByaXZhdGU6DQotICAgIENGWF9JbnQzMkFycmF5ICpGaW5kU3RhcnRQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90ICZlKTsNCi0gICAgaW50MzJfdCBEZWNvZGVDb2RlKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqY291bnRlcnMsIGludDMyX3Qgcm93T2Zmc2V0LCBpbnQzMl90ICZlKTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfU1RBUlRfQTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfU1RBUlRfQjsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfU1RBUlRfQzsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfU1RPUDsNCisNCisgcHJpdmF0ZToNCisgIENGWF9JbnQzMkFycmF5KiBGaW5kU3RhcnRQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSogcm93LCBpbnQzMl90JiBlKTsNCisgIGludDMyX3QgRGVjb2RlQ29kZShDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogY291bnRlcnMsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwCmluZGV4IGEwNDQ3MTYuLjJjMzAwMjQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwCkBAIC0zMiwxOTkgKzMyLDIwNCBAQAogY29uc3QgaW50MzJfdCBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkNPREVfU1RBUlRfQiA9IDEwNDsNCiBjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6Q09ERV9TVEFSVF9DID0gMTA1Ow0KIGNvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpDT0RFX1NUT1AgPSAxMDY7DQotQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpDQkNfT25lZENvZGUxMjhXcml0ZXIoKQ0KLXsNCi0gICAgbV9jb2RlRm9ybWF0ID0gQkNfQ09ERTEyOF9COw0KK0NCQ19PbmVkQ29kZTEyOFdyaXRlcjo6Q0JDX09uZWRDb2RlMTI4V3JpdGVyKCkgew0KKyAgbV9jb2RlRm9ybWF0ID0gQkNfQ09ERTEyOF9COw0KIH0NCi1DQkNfT25lZENvZGUxMjhXcml0ZXI6OkNCQ19PbmVkQ29kZTEyOFdyaXRlcihCQ19UWVBFIHR5cGUpDQotew0KLSAgICBtX2NvZGVGb3JtYXQgPSB0eXBlOw0KK0NCQ19PbmVkQ29kZTEyOFdyaXRlcjo6Q0JDX09uZWRDb2RlMTI4V3JpdGVyKEJDX1RZUEUgdHlwZSkgew0KKyAgbV9jb2RlRm9ybWF0ID0gdHlwZTsNCiB9DQotQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjp+Q0JDX09uZWRDb2RlMTI4V3JpdGVyKCkNCi17DQorQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjp+Q0JDX09uZWRDb2RlMTI4V3JpdGVyKCkge30NCitCQ19UWVBFIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6R2V0VHlwZSgpIHsNCisgIHJldHVybiBtX2NvZGVGb3JtYXQ7DQogfQ0KLUJDX1RZUEUgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpHZXRUeXBlKCkNCi17DQotICAgIHJldHVybiBtX2NvZGVGb3JtYXQ7DQotfQ0KLUZYX0JPT0wJQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLXsNCi0gICAgRlhfQk9PTCByZXQgPSBUUlVFOw0KLSAgICBpbnQzMl90IHBvc2l0aW9uID0gMDsNCi0gICAgaW50MzJfdCBwYXR0ZXJuSW5kZXggPSAtMTsNCi0gICAgaWYgKG1fY29kZUZvcm1hdCA9PSBCQ19DT0RFMTI4X0IgfHwgbV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQykgew0KLSAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgY29udGVudHMuR2V0TGVuZ3RoKCkpIHsNCi0gICAgICAgICAgICBwYXR0ZXJuSW5kZXggPSAoaW50MzJfdCljb250ZW50cy5HZXRBdChwb3NpdGlvbik7DQotICAgICAgICAgICAgaWYgKHBhdHRlcm5JbmRleCA+PSAzMiAmJiBwYXR0ZXJuSW5kZXggPD0gMTI2ICYmIHBhdHRlcm5JbmRleCAhPSAzNCkgew0KLSAgICAgICAgICAgICAgICBwb3NpdGlvbisrOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICByZXQgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBvc2l0aW9uICsrOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgRlhfQk9PTCByZXQgPSBUUlVFOw0KKyAgaW50MzJfdCBwb3NpdGlvbiA9IDA7DQorICBpbnQzMl90IHBhdHRlcm5JbmRleCA9IC0xOw0KKyAgaWYgKG1fY29kZUZvcm1hdCA9PSBCQ19DT0RFMTI4X0IgfHwgbV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQykgew0KKyAgICB3aGlsZSAocG9zaXRpb24gPCBjb250ZW50cy5HZXRMZW5ndGgoKSkgew0KKyAgICAgIHBhdHRlcm5JbmRleCA9IChpbnQzMl90KWNvbnRlbnRzLkdldEF0KHBvc2l0aW9uKTsNCisgICAgICBpZiAocGF0dGVybkluZGV4ID49IDMyICYmIHBhdHRlcm5JbmRleCA8PSAxMjYgJiYgcGF0dGVybkluZGV4ICE9IDM0KSB7DQorICAgICAgICBwb3NpdGlvbisrOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfSBlbHNlIHsNCiAgICAgICAgIHJldCA9IEZBTFNFOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHBvc2l0aW9uKys7DQogICAgIH0NCi0gICAgcmV0dXJuIHJldDsNCisgIH0gZWxzZSB7DQorICAgIHJldCA9IEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIHJldDsNCiB9DQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyQ2hpbmVzZUNoYXI7DQotICAgIEZYX1dDSEFSIGNoOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KLSAgICAgICAgaWYoY2ggPiAxNzUpIHsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBmaWx0ZXJDaGluZXNlQ2hhciArPSBjaDsNCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkZpbHRlckNvbnRlbnRzKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJDaGluZXNlQ2hhcjsNCisgIEZYX1dDSEFSIGNoOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KKyAgICBpZiAoY2ggPiAxNzUpIHsNCisgICAgICBpKys7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQotICAgIGlmIChtX2NvZGVGb3JtYXQgPT0gQkNfQ09ERTEyOF9CKSB7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBmaWx0ZXJDaGluZXNlQ2hhci5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICAgICAgY2ggPSBmaWx0ZXJDaGluZXNlQ2hhci5HZXRBdChpKTsNCi0gICAgICAgICAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gMTI2KSB7DQotICAgICAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChtX2NvZGVGb3JtYXQgPT0gQkNfQ09ERTEyOF9DKSB7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBmaWx0ZXJDaGluZXNlQ2hhci5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICAgICAgY2ggPSBmaWx0ZXJDaGluZXNlQ2hhci5HZXRBdChpKTsNCi0gICAgICAgICAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gMTA2KSB7DQotICAgICAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgICAgZmlsdGVyQ2hpbmVzZUNoYXIgKz0gY2g7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50czsNCisgIGlmIChtX2NvZGVGb3JtYXQgPT0gQkNfQ09ERTEyOF9CKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGZpbHRlckNoaW5lc2VDaGFyLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICBjaCA9IGZpbHRlckNoaW5lc2VDaGFyLkdldEF0KGkpOw0KKyAgICAgIGlmIChjaCA+PSAzMiAmJiBjaCA8PSAxMjYpIHsNCisgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSBpZiAobV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQykgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBmaWx0ZXJDaGluZXNlQ2hhci5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgICAgY2ggPSBmaWx0ZXJDaGluZXNlQ2hhci5HZXRBdChpKTsNCisgICAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gMTA2KSB7DQorICAgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBmaWx0ZXJjb250ZW50cyA9IGNvbnRlbnRzOw0KKyAgfQ0KKyAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOw0KK30NCitGWF9CT09MIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7DQorICBpZiAobG9jYXRpb24gPCBCQ19URVhUX0xPQ19OT05FIHx8IGxvY2F0aW9uID4gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsNCisgIHJldHVybiBUUlVFOw0KK30NCit1aW50OF90KiBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChmb3JtYXQgIT0gQkNGT1JNQVRfQ09ERV8xMjgpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uT25seUVuY29kZUNPREVfMTI4Ow0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHVpbnQ4X3QqIHJldCA9DQorICAgICAgQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGhpbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiByZXQ7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIHVpbnQ4X3QqIHJldCA9IEVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiByZXQ7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpJc0RpZ2l0cyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoKSB7DQorICBpbnQzMl90IGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOw0KKyAgZm9yIChpbnQzMl90IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7DQorICAgIGlmIChjb250ZW50c1tpXSA8ICcwJyB8fCBjb250ZW50c1tpXSA+ICc5Jykgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBsZW5ndGggPSBjb250ZW50cy5HZXRMZW5ndGgoKTsNCisgIGlmIChjb250ZW50cy5HZXRMZW5ndGgoKSA8IDEgfHwgY29udGVudHMuR2V0TGVuZ3RoKCkgPiA4MCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Db250ZW50c0xlbmd0aFNob3VsZEJldHdlZW4xYW5kODA7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5IHBhdHRlcm5zOw0KKyAgaW50MzJfdCBjaGVja1N1bSA9IDA7DQorICBpZiAobV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQikgew0KKyAgICBjaGVja1N1bSA9IEVuY29kZTEyOEIoY29udGVudHMsIHBhdHRlcm5zKTsNCisgIH0gZWxzZSBpZiAobV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQykgew0KKyAgICBjaGVja1N1bSA9IEVuY29kZTEyOEMoY29udGVudHMsIHBhdHRlcm5zKTsNCisgIH0gZWxzZSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBjaGVja1N1bSAlPSAxMDM7DQorICBwYXR0ZXJucy5BZGQoKGludDMyX3QqKUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1tjaGVja1N1bV0pOw0KKyAgcGF0dGVybnMuQWRkKChpbnQzMl90KilDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfUEFUVEVSTlNbQ09ERV9TVE9QXSk7DQorICBtX2lDb250ZW50TGVuID0gY29udGVudHMuR2V0TGVuZ3RoKCkgKyAzOw0KKyAgaW50MzJfdCBjb2RlV2lkdGggPSAwOw0KKyAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgcGF0dGVybnMuR2V0U2l6ZSgpOyBrKyspIHsNCisgICAgaW50MzJfdCogcGF0dGVybiA9IChpbnQzMl90KilwYXR0ZXJuc1trXTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgNzsgaisrKSB7DQorICAgICAgY29kZVdpZHRoICs9IHBhdHRlcm5bal07DQorICAgIH0NCisgIH0NCisgIG91dExlbmd0aCA9IGNvZGVXaWR0aDsNCisgIHVpbnQ4X3QqIHJlc3VsdCA9IEZYX0FsbG9jKHVpbnQ4X3QsIG91dExlbmd0aCk7DQorICBpbnQzMl90IHBvcyA9IDA7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBwYXR0ZXJucy5HZXRTaXplKCk7IGorKykgew0KKyAgICBpbnQzMl90KiBwYXR0ZXJuID0gKGludDMyX3QqKXBhdHRlcm5zW2pdOw0KKyAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgcGF0dGVybiwgNywgMSwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK2ludDMyX3QgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpFbmNvZGUxMjhCKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkmIHBhdHRlcm5zKSB7DQorICBpbnQzMl90IGNoZWNrU3VtID0gMDsNCisgIGludDMyX3QgY2hlY2tXZWlnaHQgPSAxOw0KKyAgaW50MzJfdCBwb3NpdGlvbiA9IDA7DQorICBwYXR0ZXJucy5BZGQoKGludDMyX3QqKUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1tDT0RFX1NUQVJUX0JdKTsNCisgIGNoZWNrU3VtICs9IENPREVfU1RBUlRfQiAqIGNoZWNrV2VpZ2h0Ow0KKyAgd2hpbGUgKHBvc2l0aW9uIDwgY29udGVudHMuR2V0TGVuZ3RoKCkpIHsNCisgICAgaW50MzJfdCBwYXR0ZXJuSW5kZXggPSAwOw0KKyAgICBwYXR0ZXJuSW5kZXggPSBjb250ZW50c1twb3NpdGlvbl0gLSAnICc7DQorICAgIHBvc2l0aW9uICs9IDE7DQorICAgIHBhdHRlcm5zLkFkZCgoaW50MzJfdCopQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1BBVFRFUk5TW3BhdHRlcm5JbmRleF0pOw0KKyAgICBjaGVja1N1bSArPSBwYXR0ZXJuSW5kZXggKiBjaGVja1dlaWdodDsNCisgICAgaWYgKHBvc2l0aW9uICE9IDApIHsNCisgICAgICBjaGVja1dlaWdodCsrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gY2hlY2tTdW07DQorfQ0KK2ludDMyX3QgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpFbmNvZGUxMjhDKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkmIHBhdHRlcm5zKSB7DQorICBpbnQzMl90IGNoZWNrU3VtID0gMDsNCisgIGludDMyX3QgY2hlY2tXZWlnaHQgPSAxOw0KKyAgaW50MzJfdCBwb3NpdGlvbiA9IDA7DQorICBwYXR0ZXJucy5BZGQoKGludDMyX3QqKUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1tDT0RFX1NUQVJUX0NdKTsNCisgIGNoZWNrU3VtICs9IENPREVfU1RBUlRfQyAqIGNoZWNrV2VpZ2h0Ow0KKyAgd2hpbGUgKHBvc2l0aW9uIDwgY29udGVudHMuR2V0TGVuZ3RoKCkpIHsNCisgICAgaW50MzJfdCBwYXR0ZXJuSW5kZXggPSAwOw0KKyAgICBGWF9DSEFSIGNoID0gY29udGVudHMuR2V0QXQocG9zaXRpb24pOw0KKyAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpIHsNCisgICAgICBwYXR0ZXJuSW5kZXggPSAoaW50MzJfdCljaDsNCisgICAgICBwb3NpdGlvbisrOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgZmlsdGVyY29udGVudHMgPSBjb250ZW50czsNCi0gICAgfQ0KLSAgICByZXR1cm4gZmlsdGVyY29udGVudHM7DQotfQ0KLUZYX0JPT0wgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pDQotew0KLSAgICBpZiAoIGxvY2F0aW9uIDwgQkNfVEVYVF9MT0NfTk9ORSB8fCBsb2NhdGlvbiA+IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXVpbnQ4X3QgKkNCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYoZm9ybWF0ICE9IEJDRk9STUFUX0NPREVfMTI4KSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERV8xMjg7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICB1aW50OF90ICpyZXQgPSBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgaGludHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIHJldHVybiByZXQ7DQotfQ0KLXVpbnQ4X3QgKkNCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgdWludDhfdCAqcmV0ID0gIEVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gcmV0Ow0KLX0NCi1GWF9CT09MIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6SXNEaWdpdHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBpbnQzMl90IHN0YXJ0LCBpbnQzMl90IGxlbmd0aCkNCi17DQotICAgIGludDMyX3QgZW5kID0gc3RhcnQgKyBsZW5ndGg7DQotICAgIGZvciAoaW50MzJfdCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgew0KLSAgICAgICAgaWYgKGNvbnRlbnRzW2ldIDwgJzAnIHx8IGNvbnRlbnRzW2ldID4gJzknKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi11aW50OF90ICpDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIGludDMyX3QgJm91dExlbmd0aCwgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgbGVuZ3RoID0gY29udGVudHMuR2V0TGVuZ3RoKCk7DQotICAgIGlmKGNvbnRlbnRzLkdldExlbmd0aCgpIDwgMSB8fCBjb250ZW50cy5HZXRMZW5ndGgoKSA+IDgwKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Db250ZW50c0xlbmd0aFNob3VsZEJldHdlZW4xYW5kODA7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfUHRyQXJyYXkgcGF0dGVybnM7DQotICAgIGludDMyX3QgY2hlY2tTdW0gPSAwOw0KLSAgICBpZiAobV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQikgew0KLSAgICAgICAgY2hlY2tTdW0gPSBFbmNvZGUxMjhCKGNvbnRlbnRzLCBwYXR0ZXJucyk7DQotICAgIH0gZWxzZSBpZiAobV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQykgCXsNCi0gICAgICAgIGNoZWNrU3VtID0gRW5jb2RlMTI4Qyhjb250ZW50cywgcGF0dGVybnMpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgY2hlY2tTdW0gJT0gMTAzOw0KLSAgICBwYXR0ZXJucy5BZGQoKGludDMyX3QqKUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1tjaGVja1N1bV0pOw0KLSAgICBwYXR0ZXJucy5BZGQoKGludDMyX3QqKUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1tDT0RFX1NUT1BdKTsNCi0gICAgbV9pQ29udGVudExlbiA9IGNvbnRlbnRzLkdldExlbmd0aCgpICsgMzsNCi0gICAgaW50MzJfdCBjb2RlV2lkdGggPSAwOw0KLSAgICBmb3IoaW50MzJfdCBrID0gMDsgayA8IHBhdHRlcm5zLkdldFNpemUoKTsgaysrKSB7DQotICAgICAgICBpbnQzMl90ICpwYXR0ZXJuID0gKGludDMyX3QqKXBhdHRlcm5zW2tdOw0KLSAgICAgICAgZm9yKGludDMyX3QgaiA9IDA7IGogPCA3OyBqKyspIHsNCi0gICAgICAgICAgICBjb2RlV2lkdGggKz0gcGF0dGVybltqXTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBvdXRMZW5ndGggPSBjb2RlV2lkdGg7DQotICAgIHVpbnQ4X3QgKnJlc3VsdCA9IEZYX0FsbG9jKHVpbnQ4X3QsIG91dExlbmd0aCk7DQotICAgIGludDMyX3QgcG9zID0gMDsNCi0gICAgZm9yKGludDMyX3QgaiA9IDA7IGogPCBwYXR0ZXJucy5HZXRTaXplKCk7IGorKykgew0KLSAgICAgICAgaW50MzJfdCogcGF0dGVybiA9IChpbnQzMl90KilwYXR0ZXJuc1tqXTsNCi0gICAgICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBwYXR0ZXJuLCA3LCAxLCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiByZXN1bHQ7DQotfQ0KLWludDMyX3QgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpFbmNvZGUxMjhCKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgIENGWF9QdHJBcnJheSAmcGF0dGVybnMpDQotew0KLSAgICBpbnQzMl90IGNoZWNrU3VtID0gMDsNCi0gICAgaW50MzJfdCBjaGVja1dlaWdodCA9IDE7DQotICAgIGludDMyX3QgcG9zaXRpb24gPSAwOw0KLSAgICBwYXR0ZXJucy5BZGQoKGludDMyX3QqKUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1tDT0RFX1NUQVJUX0JdKTsNCi0gICAgY2hlY2tTdW0gKz0gQ09ERV9TVEFSVF9CICogY2hlY2tXZWlnaHQ7DQotICAgIHdoaWxlIChwb3NpdGlvbiA8IGNvbnRlbnRzLkdldExlbmd0aCgpKSB7DQotICAgICAgICBpbnQzMl90IHBhdHRlcm5JbmRleCA9IDA7DQotICAgICAgICBwYXR0ZXJuSW5kZXggPSBjb250ZW50c1twb3NpdGlvbl0gLSAnICc7DQorICAgICAgcGF0dGVybkluZGV4ID0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQocG9zaXRpb24sIDIpKTsNCisgICAgICBpZiAoY29udGVudHMuR2V0QXQocG9zaXRpb24gKyAxKSA8ICcwJyB8fA0KKyAgICAgICAgICBjb250ZW50cy5HZXRBdChwb3NpdGlvbiArIDEpID4gJzknKSB7DQogICAgICAgICBwb3NpdGlvbiArPSAxOw0KLSAgICAgICAgcGF0dGVybnMuQWRkKChpbnQzMl90KilDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfUEFUVEVSTlNbcGF0dGVybkluZGV4XSk7DQotICAgICAgICBjaGVja1N1bSArPSBwYXR0ZXJuSW5kZXggKiBjaGVja1dlaWdodDsNCi0gICAgICAgIGlmIChwb3NpdGlvbiAhPSAwKSB7DQotICAgICAgICAgICAgY2hlY2tXZWlnaHQrKzsNCi0gICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcG9zaXRpb24gKz0gMjsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIGNoZWNrU3VtOw0KLX0NCi1pbnQzMl90IENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlMTI4Qyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsICBDRlhfUHRyQXJyYXkgJnBhdHRlcm5zKQ0KLXsNCi0gICAgaW50MzJfdCBjaGVja1N1bSA9IDA7DQotICAgIGludDMyX3QgY2hlY2tXZWlnaHQgPSAxOw0KLSAgICBpbnQzMl90IHBvc2l0aW9uID0gMDsNCi0gICAgcGF0dGVybnMuQWRkKChpbnQzMl90KilDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfUEFUVEVSTlNbQ09ERV9TVEFSVF9DXSk7DQotICAgIGNoZWNrU3VtICs9IENPREVfU1RBUlRfQyAqIGNoZWNrV2VpZ2h0Ow0KLSAgICB3aGlsZSAocG9zaXRpb24gPCBjb250ZW50cy5HZXRMZW5ndGgoKSkgew0KLSAgICAgICAgaW50MzJfdCBwYXR0ZXJuSW5kZXggPSAwOw0KLSAgICAgICAgRlhfQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KHBvc2l0aW9uKTsNCi0gICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5Jykgew0KLSAgICAgICAgICAgIHBhdHRlcm5JbmRleCA9IChpbnQzMl90KWNoOw0KLSAgICAgICAgICAgIHBvc2l0aW9uKys7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBhdHRlcm5JbmRleCA9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKHBvc2l0aW9uLCAyKSk7DQotICAgICAgICAgICAgaWYgKGNvbnRlbnRzLkdldEF0KHBvc2l0aW9uICsgMSkgPCAnMCcgfHwgY29udGVudHMuR2V0QXQocG9zaXRpb24gKyAxKSA+ICc5Jykgew0KLSAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSAxOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IDI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcGF0dGVybnMuQWRkKChpbnQzMl90KilDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfUEFUVEVSTlNbcGF0dGVybkluZGV4XSk7DQotICAgICAgICBjaGVja1N1bSArPSBwYXR0ZXJuSW5kZXggKiBjaGVja1dlaWdodDsNCi0gICAgICAgIGlmIChwb3NpdGlvbiAhPSAwKSB7DQotICAgICAgICAgICAgY2hlY2tXZWlnaHQrKzsNCi0gICAgICAgIH0NCisgICAgcGF0dGVybnMuQWRkKChpbnQzMl90KilDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfUEFUVEVSTlNbcGF0dGVybkluZGV4XSk7DQorICAgIGNoZWNrU3VtICs9IHBhdHRlcm5JbmRleCAqIGNoZWNrV2VpZ2h0Ow0KKyAgICBpZiAocG9zaXRpb24gIT0gMCkgew0KKyAgICAgIGNoZWNrV2VpZ2h0Kys7DQogICAgIH0NCi0gICAgcmV0dXJuIGNoZWNrU3VtOw0KKyAgfQ0KKyAgcmV0dXJuIGNoZWNrU3VtOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmgKaW5kZXggOGE4OWYyNi4uOTRmNzgyYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuaApAQCAtOCwzMCArOCw0MSBAQAogI2RlZmluZSBfQkNfT05FRENPREExMjhXUklURVJfSF8NCiBjbGFzcyBDQkNfT25lRGltV3JpdGVyOw0KIGNsYXNzIENCQ19PbmVkQ29kYTEyOFdyaXRlcjsNCi1jbGFzcyBDQkNfT25lZENvZGUxMjhXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19PbmVkQ29kZTEyOFdyaXRlcigpOw0KLSAgICBDQkNfT25lZENvZGUxMjhXcml0ZXIoQkNfVFlQRSB0eXBlKTsNCi0gICAgdmlydHVhbCB+Q0JDX09uZWRDb2RlMTI4V3JpdGVyKCk7DQotICAgIHVpbnQ4X3QgKgkJCQkJRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpOw0KLSAgICB1aW50OF90ICoJCQkJCUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90ICZlKTsNCi0gICAgdWludDhfdCAqCQkJCQlFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBpbnQzMl90ICZvdXRMZW5ndGggLCBpbnQzMl90ICZlKTsNCi0gICAgRlhfQk9PTAkJCQkJCUNoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJCQlGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCi0gICAgRlhfQk9PTAkJCQkJCVNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbik7DQotICAgIEJDX1RZUEUJCQkJCQlHZXRUeXBlKCk7DQotcHJpdmF0ZToNCi0gICAgRlhfQk9PTCBJc0RpZ2l0cyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIGludDMyX3Qgc3RhcnQsIGludDMyX3QgbGVuZ3RoKTsNCi0gICAgaW50MzJfdCBFbmNvZGUxMjhCKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQ0ZYX1B0ckFycmF5ICZwYXR0ZXJucyk7DQotICAgIGludDMyX3QgRW5jb2RlMTI4Qyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIENGWF9QdHJBcnJheSAmcGF0dGVybnMpOw0KLSAgICBCQ19UWVBFCQkJCQkJbV9jb2RlRm9ybWF0Ow0KLSAgICBjb25zdCBzdGF0aWMJaW50MzJfdAlDT0RFX1NUQVJUX0I7DQotICAgIGNvbnN0IHN0YXRpYwlpbnQzMl90CUNPREVfU1RBUlRfQzsNCi0gICAgY29uc3Qgc3RhdGljCWludDMyX3QJQ09ERV9DT0RFX0I7DQotICAgIGNvbnN0IHN0YXRpYwlpbnQzMl90CUNPREVfQ09ERV9DOw0KLSAgICBjb25zdCBzdGF0aWMJaW50MzJfdAlDT0RFX1NUT1A7DQorY2xhc3MgQ0JDX09uZWRDb2RlMTI4V3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXIgew0KKyBwdWJsaWM6DQorICBDQkNfT25lZENvZGUxMjhXcml0ZXIoKTsNCisgIENCQ19PbmVkQ29kZTEyOFdyaXRlcihCQ19UWVBFIHR5cGUpOw0KKyAgdmlydHVhbCB+Q0JDX09uZWRDb2RlMTI4V3JpdGVyKCk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIENGWF9XaWRlU3RyaW5nIEZpbHRlckNvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgRlhfQk9PTCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOw0KKyAgQkNfVFlQRSBHZXRUeXBlKCk7DQorDQorIHByaXZhdGU6DQorICBGWF9CT09MIElzRGlnaXRzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydCwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgpOw0KKyAgaW50MzJfdCBFbmNvZGUxMjhCKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywgQ0ZYX1B0ckFycmF5JiBwYXR0ZXJucyk7DQorICBpbnQzMl90IEVuY29kZTEyOEMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLCBDRlhfUHRyQXJyYXkmIHBhdHRlcm5zKTsNCisgIEJDX1RZUEUgbV9jb2RlRm9ybWF0Ow0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9TVEFSVF9COw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9TVEFSVF9DOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9DT0RFX0I7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX0NPREVfQzsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfU1RPUDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVJlYWRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlSZWFkZXIuY3BwCmluZGV4IGE2NzgzMzguLjM2NzgyNjAgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVJlYWRlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5UmVhZGVyLmNwcApAQCAtMjUsMjY5ICsyNSwyNjkgQEAKICNpbmNsdWRlICIuLi9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCINCiAjaW5jbHVkZSAiQkNfT25lRFJlYWRlci5oIg0KICNpbmNsdWRlICJCQ19PbmVkQ29kZTM5UmVhZGVyLmgiDQotY29uc3QgRlhfQ0hBUiogQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkFMUEhBQkVUX1NUUklORyA9ICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVotLiAqJC8rJSI7DQotY29uc3QgRlhfQ0hBUiogQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNIRUNLU1VNX1NUUklORyA9ICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVotLiAkLyslIjsNCitjb25zdCBGWF9DSEFSKiBDQkNfT25lZENvZGUzOVJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HID0NCisgICAgIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi0uICokLyslIjsNCitjb25zdCBGWF9DSEFSKiBDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0hFQ0tTVU1fU1RSSU5HID0NCisgICAgIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi0uICQvKyUiOw0KIGNvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNIQVJBQ1RFUl9FTkNPRElOR1NbNDRdID0gew0KLSAgICAweDAzNCwgMHgxMjEsIDB4MDYxLCAweDE2MCwgMHgwMzEsIDB4MTMwLCAweDA3MCwgMHgwMjUsIDB4MTI0LCAweDA2NCwNCi0gICAgMHgxMDksIDB4MDQ5LCAweDE0OCwgMHgwMTksIDB4MTE4LCAweDA1OCwgMHgwMEQsIDB4MTBDLCAweDA0QywgMHgwMUMsDQotICAgIDB4MTAzLCAweDA0MywgMHgxNDIsIDB4MDEzLCAweDExMiwgMHgwNTIsIDB4MDA3LCAweDEwNiwgMHgwNDYsIDB4MDE2LA0KLSAgICAweDE4MSwgMHgwQzEsIDB4MUMwLCAweDA5MSwgMHgxOTAsIDB4MEQwLCAweDA4NSwgMHgxODQsIDB4MEM0LCAweDA5NCwNCi0gICAgMHgwQTgsIDB4MEEyLCAweDA4QSwgMHgwMkENCi19Ow0KKyAgICAweDAzNCwgMHgxMjEsIDB4MDYxLCAweDE2MCwgMHgwMzEsIDB4MTMwLCAweDA3MCwgMHgwMjUsIDB4MTI0LA0KKyAgICAweDA2NCwgMHgxMDksIDB4MDQ5LCAweDE0OCwgMHgwMTksIDB4MTE4LCAweDA1OCwgMHgwMEQsIDB4MTBDLA0KKyAgICAweDA0QywgMHgwMUMsIDB4MTAzLCAweDA0MywgMHgxNDIsIDB4MDEzLCAweDExMiwgMHgwNTIsIDB4MDA3LA0KKyAgICAweDEwNiwgMHgwNDYsIDB4MDE2LCAweDE4MSwgMHgwQzEsIDB4MUMwLCAweDA5MSwgMHgxOTAsIDB4MEQwLA0KKyAgICAweDA4NSwgMHgxODQsIDB4MEM0LCAweDA5NCwgMHgwQTgsIDB4MEEyLCAweDA4QSwgMHgwMkF9Ow0KIGNvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkFTVEVSSVNLX0VOQ09ESU5HID0gMHgwOTQ7DQotQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNCQ19PbmVkQ29kZTM5UmVhZGVyKCk6IG1fZXh0ZW5kZWRNb2RlKEZBTFNFKSwgbV91c2luZ0NoZWNrRGlnaXQoRkFMU0UpDQotew0KK0NCQ19PbmVkQ29kZTM5UmVhZGVyOjpDQkNfT25lZENvZGUzOVJlYWRlcigpDQorICAgIDogbV9leHRlbmRlZE1vZGUoRkFMU0UpLCBtX3VzaW5nQ2hlY2tEaWdpdChGQUxTRSkge30NCitDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0JDX09uZWRDb2RlMzlSZWFkZXIoRlhfQk9PTCB1c2luZ0NoZWNrRGlnaXQpIHsNCisgIG1fdXNpbmdDaGVja0RpZ2l0ID0gdXNpbmdDaGVja0RpZ2l0Ow0KKyAgbV9leHRlbmRlZE1vZGUgPSBGQUxTRTsNCiB9DQotQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNCQ19PbmVkQ29kZTM5UmVhZGVyKEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0KQ0KLXsNCi0gICAgbV91c2luZ0NoZWNrRGlnaXQgPSB1c2luZ0NoZWNrRGlnaXQ7DQotICAgIG1fZXh0ZW5kZWRNb2RlID0gRkFMU0U7DQorQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNCQ19PbmVkQ29kZTM5UmVhZGVyKEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGV4dGVuZGVkTW9kZSkgew0KKyAgbV9leHRlbmRlZE1vZGUgPSBleHRlbmRlZE1vZGU7DQorICBtX3VzaW5nQ2hlY2tEaWdpdCA9IHVzaW5nQ2hlY2tEaWdpdDsNCiB9DQotQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNCQ19PbmVkQ29kZTM5UmVhZGVyKEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0LCBGWF9CT09MIGV4dGVuZGVkTW9kZSkNCi17DQotICAgIG1fZXh0ZW5kZWRNb2RlID0gZXh0ZW5kZWRNb2RlOw0KLSAgICBtX3VzaW5nQ2hlY2tEaWdpdCA9IHVzaW5nQ2hlY2tEaWdpdDsNCi19DQotQ0JDX09uZWRDb2RlMzlSZWFkZXI6On5DQkNfT25lZENvZGUzOVJlYWRlcigpDQotew0KLX0NCi1DRlhfQnl0ZVN0cmluZyBDQkNfT25lZENvZGUzOVJlYWRlcjo6RGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9JbnQzMkFycmF5ICpzdGFydCA9IEZpbmRBc3Rlcmlza1BhdHRlcm4ocm93LCBlKTsNCitDQkNfT25lZENvZGUzOVJlYWRlcjo6fkNCQ19PbmVkQ29kZTM5UmVhZGVyKCkge30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lZENvZGUzOVJlYWRlcjo6RGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0ludDMyQXJyYXkqIHN0YXJ0ID0gRmluZEFzdGVyaXNrUGF0dGVybihyb3csIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIGludDMyX3QgbmV4dFN0YXJ0ID0gKCpzdGFydClbMV07DQorICBpZiAoc3RhcnQgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgc3RhcnQ7DQorICAgIHN0YXJ0ID0gTlVMTDsNCisgIH0NCisgIGludDMyX3QgZW5kID0gcm93LT5HZXRTaXplKCk7DQorICB3aGlsZSAobmV4dFN0YXJ0IDwgZW5kICYmICFyb3ctPkdldChuZXh0U3RhcnQpKSB7DQorICAgIG5leHRTdGFydCsrOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0Ow0KKyAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQorICBjb3VudGVycy5TZXRTaXplKDkpOw0KKyAgRlhfQ0hBUiBkZWNvZGVkQ2hhcjsNCisgIGludDMyX3QgbGFzdFN0YXJ0Ow0KKyAgZG8gew0KKyAgICBSZWNvcmRQYXR0ZXJuKHJvdywgbmV4dFN0YXJ0LCAmY291bnRlcnMsIGUpOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICBpbnQzMl90IG5leHRTdGFydCA9ICgqc3RhcnQpWzFdOw0KLSAgICBpZihzdGFydCAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgc3RhcnQ7DQotICAgICAgICBzdGFydCA9IE5VTEw7DQorICAgIGludDMyX3QgcGF0dGVybiA9IFRvTmFycm93V2lkZVBhdHRlcm4oJmNvdW50ZXJzKTsNCisgICAgaWYgKHBhdHRlcm4gPCAwKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgcmV0dXJuICIiOw0KICAgICB9DQotICAgIGludDMyX3QgZW5kID0gcm93LT5HZXRTaXplKCk7DQorICAgIGRlY29kZWRDaGFyID0gUGF0dGVyblRvQ2hhcihwYXR0ZXJuLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgICAgcmVzdWx0ICs9IGRlY29kZWRDaGFyOw0KKyAgICBsYXN0U3RhcnQgPSBuZXh0U3RhcnQ7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgbmV4dFN0YXJ0ICs9IGNvdW50ZXJzW2ldOw0KKyAgICB9DQogICAgIHdoaWxlIChuZXh0U3RhcnQgPCBlbmQgJiYgIXJvdy0+R2V0KG5leHRTdGFydCkpIHsNCi0gICAgICAgIG5leHRTdGFydCsrOw0KKyAgICAgIG5leHRTdGFydCsrOw0KICAgICB9DQotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQotICAgIGNvdW50ZXJzLlNldFNpemUoOSk7DQotICAgIEZYX0NIQVIgZGVjb2RlZENoYXI7DQotICAgIGludDMyX3QgbGFzdFN0YXJ0Ow0KLSAgICBkbyB7DQotICAgICAgICBSZWNvcmRQYXR0ZXJuKHJvdywgbmV4dFN0YXJ0LCAmY291bnRlcnMsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgICAgIGludDMyX3QgcGF0dGVybiA9IFRvTmFycm93V2lkZVBhdHRlcm4oJmNvdW50ZXJzKTsNCi0gICAgICAgIGlmIChwYXR0ZXJuIDwgMCkgew0KLSAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KLSAgICAgICAgICAgIHJldHVybiAiIjsNCisgIH0gd2hpbGUgKGRlY29kZWRDaGFyICE9ICcqJyk7DQorICByZXN1bHQgPSByZXN1bHQuTWlkKDAsIHJlc3VsdC5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgaW50MzJfdCBsYXN0UGF0dGVyblNpemUgPSAwOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgY291bnRlcnMuR2V0U2l6ZSgpOyBqKyspIHsNCisgICAgbGFzdFBhdHRlcm5TaXplICs9IGNvdW50ZXJzW2pdOw0KKyAgfQ0KKyAgaW50MzJfdCB3aGl0ZVNwYWNlQWZ0ZXJFbmQgPSBuZXh0U3RhcnQgLSBsYXN0U3RhcnQgLSBsYXN0UGF0dGVyblNpemU7DQorICBpZiAobV91c2luZ0NoZWNrRGlnaXQpIHsNCisgICAgaW50MzJfdCBtYXggPSByZXN1bHQuR2V0TGVuZ3RoKCkgLSAxOw0KKyAgICBpbnQzMl90IHRvdGFsID0gMDsNCisgICAgaW50MzJfdCBsZW4gPSAoaW50MzJfdClzdHJsZW4oQUxQSEFCRVRfU1RSSU5HKTsNCisgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbWF4OyBrKyspIHsNCisgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBsZW47IGorKykNCisgICAgICAgIGlmIChBTFBIQUJFVF9TVFJJTkdbal0gPT0gcmVzdWx0W2tdKSB7DQorICAgICAgICAgIHRvdGFsICs9IGo7DQogICAgICAgICB9DQotICAgICAgICBkZWNvZGVkQ2hhciA9IFBhdHRlcm5Ub0NoYXIocGF0dGVybiwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICAgICAgcmVzdWx0ICs9IGRlY29kZWRDaGFyOw0KLSAgICAgICAgbGFzdFN0YXJ0ID0gbmV4dFN0YXJ0Ow0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnRlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBuZXh0U3RhcnQgKz0gY291bnRlcnNbaV07DQotICAgICAgICB9DQotICAgICAgICB3aGlsZSAobmV4dFN0YXJ0IDwgZW5kICYmICFyb3ctPkdldChuZXh0U3RhcnQpKSB7DQotICAgICAgICAgICAgbmV4dFN0YXJ0Kys7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGRlY29kZWRDaGFyICE9ICcqJyk7DQorICAgIH0NCisgICAgaWYgKHJlc3VsdFttYXhdICE9IChBTFBIQUJFVF9TVFJJTkcpW3RvdGFsICUgNDNdKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQorICAgICAgcmV0dXJuICIiOw0KKyAgICB9DQogICAgIHJlc3VsdCA9IHJlc3VsdC5NaWQoMCwgcmVzdWx0LkdldExlbmd0aCgpIC0gMSk7DQotICAgIGludDMyX3QgbGFzdFBhdHRlcm5TaXplID0gMDsNCi0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgY291bnRlcnMuR2V0U2l6ZSgpOyBqKyspIHsNCi0gICAgICAgIGxhc3RQYXR0ZXJuU2l6ZSArPSBjb3VudGVyc1tqXTsNCisgIH0NCisgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuICIiOw0KKyAgfQ0KKyAgaWYgKG1fZXh0ZW5kZWRNb2RlKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHIgPSBEZWNvZGVFeHRlbmRlZChyZXN1bHQsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICByZXR1cm4gYnl0ZXN0cjsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfT25lZENvZGUzOVJlYWRlcjo6RmluZEFzdGVyaXNrUGF0dGVybigNCisgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgd2lkdGggPSByb3ctPkdldFNpemUoKTsNCisgIGludDMyX3Qgcm93T2Zmc2V0ID0gMDsNCisgIHdoaWxlIChyb3dPZmZzZXQgPCB3aWR0aCkgew0KKyAgICBpZiAocm93LT5HZXQocm93T2Zmc2V0KSkgew0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGludDMyX3Qgd2hpdGVTcGFjZUFmdGVyRW5kID0gbmV4dFN0YXJ0IC0gbGFzdFN0YXJ0IC0gbGFzdFBhdHRlcm5TaXplOw0KLSAgICBpZihtX3VzaW5nQ2hlY2tEaWdpdCkgew0KLSAgICAgICAgaW50MzJfdCBtYXggPSByZXN1bHQuR2V0TGVuZ3RoKCkgLSAxOw0KLSAgICAgICAgaW50MzJfdCB0b3RhbCA9IDA7DQotICAgICAgICBpbnQzMl90IGxlbiA9IChpbnQzMl90KXN0cmxlbihBTFBIQUJFVF9TVFJJTkcpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbWF4OyBrKyspIHsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBsZW47IGorKykNCi0gICAgICAgICAgICAgICAgaWYgKEFMUEhBQkVUX1NUUklOR1tqXSA9PSByZXN1bHRba10pIHsNCi0gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGo7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChyZXN1bHRbbWF4XSAhPSAoQUxQSEFCRVRfU1RSSU5HKVt0b3RhbCAlIDQzXSkgew0KLSAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uOw0KLSAgICAgICAgICAgIHJldHVybiAiIjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5NaWQoMCwgcmVzdWx0LkdldExlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0gICAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICBlICA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi0gICAgaWYobV9leHRlbmRlZE1vZGUpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHIgPSBEZWNvZGVFeHRlbmRlZChyZXN1bHQsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgICAgIHJldHVybiBieXRlc3RyOw0KKyAgICByb3dPZmZzZXQrKzsNCisgIH0NCisgIGludDMyX3QgY291bnRlclBvc2l0aW9uID0gMDsNCisgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgY291bnRlcnMuU2V0U2l6ZSg5KTsNCisgIGludDMyX3QgcGF0dGVyblN0YXJ0ID0gcm93T2Zmc2V0Ow0KKyAgRlhfQk9PTCBpc1doaXRlID0gRkFMU0U7DQorICBpbnQzMl90IHBhdHRlcm5MZW5ndGggPSBjb3VudGVycy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IHJvd09mZnNldDsgaSA8IHdpZHRoOyBpKyspIHsNCisgICAgRlhfQk9PTCBwaXhlbCA9IHJvdy0+R2V0KGkpOw0KKyAgICBpZiAocGl4ZWwgXiBpc1doaXRlKSB7DQorICAgICAgY291bnRlcnNbY291bnRlclBvc2l0aW9uXSsrOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLX0NCi1DRlhfSW50MzJBcnJheSAqQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkZpbmRBc3Rlcmlza1BhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIGludDMyX3QgJmUpDQotew0KLSAgICBpbnQzMl90IHdpZHRoID0gcm93LT5HZXRTaXplKCk7DQotICAgIGludDMyX3Qgcm93T2Zmc2V0ID0gMDsNCi0gICAgd2hpbGUgKHJvd09mZnNldCA8IHdpZHRoKSB7DQotICAgICAgICBpZiAocm93LT5HZXQocm93T2Zmc2V0KSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgIGlmIChjb3VudGVyUG9zaXRpb24gPT0gcGF0dGVybkxlbmd0aCAtIDEpIHsNCisgICAgICAgIGlmIChUb05hcnJvd1dpZGVQYXR0ZXJuKCZjb3VudGVycykgPT0gQVNURVJJU0tfRU5DT0RJTkcpIHsNCisgICAgICAgICAgRlhfQk9PTCBiVDEgPQ0KKyAgICAgICAgICAgICAgcm93LT5Jc1JhbmdlKEZYX01BWCgwLCBwYXR0ZXJuU3RhcnQgLSAoaSAtIHBhdHRlcm5TdGFydCkgLyAyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuU3RhcnQsIEZBTFNFLCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICBpZiAoYlQxKSB7DQorICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHJlc3VsdCA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCisgICAgICAgICAgICByZXN1bHQtPlNldFNpemUoMik7DQorICAgICAgICAgICAgKCpyZXN1bHQpWzBdID0gcGF0dGVyblN0YXJ0Ow0KKyAgICAgICAgICAgICgqcmVzdWx0KVsxXSA9IGk7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgcm93T2Zmc2V0Kys7DQotICAgIH0NCi0gICAgaW50MzJfdCBjb3VudGVyUG9zaXRpb24gPSAwOw0KLSAgICBDRlhfSW50MzJBcnJheSBjb3VudGVyczsNCi0gICAgY291bnRlcnMuU2V0U2l6ZSg5KTsNCi0gICAgaW50MzJfdCBwYXR0ZXJuU3RhcnQgPSByb3dPZmZzZXQ7DQotICAgIEZYX0JPT0wgaXNXaGl0ZSA9IEZBTFNFOw0KLSAgICBpbnQzMl90IHBhdHRlcm5MZW5ndGggPSBjb3VudGVycy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gcm93T2Zmc2V0OyBpIDwgd2lkdGg7IGkrKykgew0KLSAgICAgICAgRlhfQk9PTCBwaXhlbCA9IHJvdy0+R2V0KGkpOw0KLSAgICAgICAgaWYgKHBpeGVsIF4gaXNXaGl0ZSkgew0KLSAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NpdGlvbl0rKzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3NpdGlvbiA9PSBwYXR0ZXJuTGVuZ3RoIC0gMSkgew0KLSAgICAgICAgICAgICAgICBpZiAoVG9OYXJyb3dXaWRlUGF0dGVybigmY291bnRlcnMpID09IEFTVEVSSVNLX0VOQ09ESU5HKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUMSA9ICByb3ctPklzUmFuZ2UoRlhfTUFYKDAsIHBhdHRlcm5TdGFydCAtIChpIC0gcGF0dGVyblN0YXJ0KSAvIDIpLCBwYXR0ZXJuU3RhcnQsIEZBTFNFLCBlKTsNCi0gICAgICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiVDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSAqcmVzdWx0ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+U2V0U2l6ZSgyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKnJlc3VsdClbMF0gPSBwYXR0ZXJuU3RhcnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bHQpWzFdID0gaTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyc1swXSArIGNvdW50ZXJzWzFdOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgeSA9IDI7IHkgPCBwYXR0ZXJuTGVuZ3RoOyB5KyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJzW3kgLSAyXSA9IGNvdW50ZXJzW3ldOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAyXSA9IDA7DQotICAgICAgICAgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAxXSA9IDA7DQotICAgICAgICAgICAgICAgIGNvdW50ZXJQb3NpdGlvbi0tOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGNvdW50ZXJQb3NpdGlvbisrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dID0gMTsNCi0gICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQorICAgICAgICBwYXR0ZXJuU3RhcnQgKz0gY291bnRlcnNbMF0gKyBjb3VudGVyc1sxXTsNCisgICAgICAgIGZvciAoaW50MzJfdCB5ID0gMjsgeSA8IHBhdHRlcm5MZW5ndGg7IHkrKykgew0KKyAgICAgICAgICBjb3VudGVyc1t5IC0gMl0gPSBjb3VudGVyc1t5XTsNCiAgICAgICAgIH0NCisgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAyXSA9IDA7DQorICAgICAgICBjb3VudGVyc1twYXR0ZXJuTGVuZ3RoIC0gMV0gPSAwOw0KKyAgICAgICAgY291bnRlclBvc2l0aW9uLS07DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNvdW50ZXJQb3NpdGlvbisrOw0KKyAgICAgIH0NCisgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dID0gMTsNCisgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQogICAgIH0NCi0gICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICByZXR1cm4gTlVMTDsNCiB9DQotaW50MzJfdCBDQkNfT25lZENvZGUzOVJlYWRlcjo6VG9OYXJyb3dXaWRlUGF0dGVybihDRlhfSW50MzJBcnJheSAqY291bnRlcnMpDQotew0KLSAgICBpbnQzMl90IG51bUNvdW50ZXJzID0gY291bnRlcnMtPkdldFNpemUoKTsNCi0gICAgaW50MzJfdCBtYXhOYXJyb3dDb3VudGVyID0gMDsNCi0gICAgaW50MzJfdCB3aWRlQ291bnRlcnM7DQotICAgIGRvIHsNCitpbnQzMl90IENCQ19PbmVkQ29kZTM5UmVhZGVyOjpUb05hcnJvd1dpZGVQYXR0ZXJuKENGWF9JbnQzMkFycmF5KiBjb3VudGVycykgew0KKyAgaW50MzJfdCBudW1Db3VudGVycyA9IGNvdW50ZXJzLT5HZXRTaXplKCk7DQorICBpbnQzMl90IG1heE5hcnJvd0NvdW50ZXIgPSAwOw0KKyAgaW50MzJfdCB3aWRlQ291bnRlcnM7DQorICBkbyB7DQogI3VuZGVmIG1heA0KLSAgICAgICAgaW50MzJfdCBtaW5Db3VudGVyID0gRlhTWVNfSW50TWF4Ow0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykgew0KLSAgICAgICAgICAgIGludDMyX3QgY291bnRlciA9ICgqY291bnRlcnMpW2ldOw0KLSAgICAgICAgICAgIGlmIChjb3VudGVyIDwgbWluQ291bnRlciAmJiBjb3VudGVyID4gbWF4TmFycm93Q291bnRlcikgew0KLSAgICAgICAgICAgICAgICBtaW5Db3VudGVyID0gY291bnRlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBtYXhOYXJyb3dDb3VudGVyID0gbWluQ291bnRlcjsNCi0gICAgICAgIHdpZGVDb3VudGVycyA9IDA7DQotICAgICAgICBpbnQzMl90IHRvdGFsV2lkZUNvdW50ZXJzV2lkdGggPSAwOw0KLSAgICAgICAgaW50MzJfdCBwYXR0ZXJuID0gMDsNCi0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG51bUNvdW50ZXJzOyBqKyspIHsNCi0gICAgICAgICAgICBpbnQzMl90IGNvdW50ZXIgPSAoKmNvdW50ZXJzKVtqXTsNCi0gICAgICAgICAgICBpZiAoKCpjb3VudGVycylbal0gPiBtYXhOYXJyb3dDb3VudGVyKSB7DQotICAgICAgICAgICAgICAgIHBhdHRlcm4gfD0gMSA8PCAobnVtQ291bnRlcnMgLSAxIC0gaik7DQotICAgICAgICAgICAgICAgIHdpZGVDb3VudGVycysrOw0KLSAgICAgICAgICAgICAgICB0b3RhbFdpZGVDb3VudGVyc1dpZHRoICs9IGNvdW50ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdpZGVDb3VudGVycyA9PSAzKSB7DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbnVtQ291bnRlcnMgJiYgd2lkZUNvdW50ZXJzID4gMDsgaysrKSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgY291bnRlciA9ICgqY291bnRlcnMpW2tdOw0KLSAgICAgICAgICAgICAgICBpZiAoKCpjb3VudGVycylba10gPiBtYXhOYXJyb3dDb3VudGVyKSB7DQotICAgICAgICAgICAgICAgICAgICB3aWRlQ291bnRlcnMtLTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgoY291bnRlciA8PCAxKSA+PSB0b3RhbFdpZGVDb3VudGVyc1dpZHRoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuOw0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlICh3aWRlQ291bnRlcnMgPiAzKTsNCi0gICAgcmV0dXJuIC0xOw0KLX0NCi1GWF9DSEFSIENCQ19PbmVkQ29kZTM5UmVhZGVyOjpQYXR0ZXJuVG9DaGFyKGludDMyX3QgcGF0dGVybiwgaW50MzJfdCAmZSkNCi17DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDQ0OyBpKyspIHsNCi0gICAgICAgIGlmIChDSEFSQUNURVJfRU5DT0RJTkdTW2ldID09IHBhdHRlcm4pIHsNCi0gICAgICAgICAgICByZXR1cm4gKEFMUEhBQkVUX1NUUklORylbaV07DQotICAgICAgICB9DQorICAgIGludDMyX3QgbWluQ291bnRlciA9IEZYU1lTX0ludE1heDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykgew0KKyAgICAgIGludDMyX3QgY291bnRlciA9ICgqY291bnRlcnMpW2ldOw0KKyAgICAgIGlmIChjb3VudGVyIDwgbWluQ291bnRlciAmJiBjb3VudGVyID4gbWF4TmFycm93Q291bnRlcikgew0KKyAgICAgICAgbWluQ291bnRlciA9IGNvdW50ZXI7DQorICAgICAgfQ0KICAgICB9DQotICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KLSAgICByZXR1cm4gMDsNCi19DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkRlY29kZUV4dGVuZGVkKENGWF9CeXRlU3RyaW5nICZlbmNvZGVkLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBsZW5ndGggPSBlbmNvZGVkLkdldExlbmd0aCgpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBkZWNvZGVkOw0KLSAgICBGWF9DSEFSIGMsIG5leHQ7DQotICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCi0gICAgICAgIGMgPSBlbmNvZGVkW2ldOw0KLSAgICAgICAgaWYoYyA9PSAnKycgfHwgYyA9PSAnJCcgfHwgYyA9PSAnJScgfHwgYyA9PSAnLycpIHsNCi0gICAgICAgICAgICBuZXh0ID0gZW5jb2RlZFtpICsgMV07DQotICAgICAgICAgICAgRlhfQ0hBUiBkZWNvZGVkQ2hhciA9ICdcMCc7DQotICAgICAgICAgICAgc3dpdGNoIChjKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgJysnOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPj0gJ0EnICYmIG5leHQgPD0gJ1onKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikgKG5leHQgKyAzMik7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnJCc6DQotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA+PSAnQScgJiYgbmV4dCA8PSAnWicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKSAobmV4dCAtIDY0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICclJzoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID49ICdBJyAmJiBuZXh0IDw9ICdFJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpIChuZXh0IC0gMzgpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID49ICdGJyAmJiBuZXh0IDw9ICdKJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpIChuZXh0IC0gMTEpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID49ICdLJyAmJiBuZXh0IDw9ICdPJyAmJiBuZXh0ICE9ICdNJyAmJiBuZXh0ICE9ICdOJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpIChuZXh0ICsgMTYpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID49ICdQJyAmJiBuZXh0IDw9ICdTJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpIChuZXh0ICsgNDMpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID09ICdVJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpIDA7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT0gJ1YnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikgNjQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT0gJ1cnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikgOTY7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT0gJ1QnIHx8IG5leHQgPT0gJ1gnIHx8IG5leHQgPT0gJ1knIHx8IG5leHQgPT0gJ1onKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikgMTI3Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgJy8nOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPj0gJ0EnICYmIG5leHQgPD0gJ08nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikgKG5leHQgLSAzMik7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT0gJ1onKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAnOic7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZGVjb2RlZCArPSBkZWNvZGVkQ2hhcjsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGRlY29kZWQgKz0gYzsNCi0gICAgICAgIH0NCisgICAgbWF4TmFycm93Q291bnRlciA9IG1pbkNvdW50ZXI7DQorICAgIHdpZGVDb3VudGVycyA9IDA7DQorICAgIGludDMyX3QgdG90YWxXaWRlQ291bnRlcnNXaWR0aCA9IDA7DQorICAgIGludDMyX3QgcGF0dGVybiA9IDA7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG51bUNvdW50ZXJzOyBqKyspIHsNCisgICAgICBpbnQzMl90IGNvdW50ZXIgPSAoKmNvdW50ZXJzKVtqXTsNCisgICAgICBpZiAoKCpjb3VudGVycylbal0gPiBtYXhOYXJyb3dDb3VudGVyKSB7DQorICAgICAgICBwYXR0ZXJuIHw9IDEgPDwgKG51bUNvdW50ZXJzIC0gMSAtIGopOw0KKyAgICAgICAgd2lkZUNvdW50ZXJzKys7DQorICAgICAgICB0b3RhbFdpZGVDb3VudGVyc1dpZHRoICs9IGNvdW50ZXI7DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiBkZWNvZGVkOw0KKyAgICBpZiAod2lkZUNvdW50ZXJzID09IDMpIHsNCisgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBudW1Db3VudGVycyAmJiB3aWRlQ291bnRlcnMgPiAwOyBrKyspIHsNCisgICAgICAgIGludDMyX3QgY291bnRlciA9ICgqY291bnRlcnMpW2tdOw0KKyAgICAgICAgaWYgKCgqY291bnRlcnMpW2tdID4gbWF4TmFycm93Q291bnRlcikgew0KKyAgICAgICAgICB3aWRlQ291bnRlcnMtLTsNCisgICAgICAgICAgaWYgKChjb3VudGVyIDw8IDEpID49IHRvdGFsV2lkZUNvdW50ZXJzV2lkdGgpIHsNCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIHBhdHRlcm47DQorICAgIH0NCisgIH0gd2hpbGUgKHdpZGVDb3VudGVycyA+IDMpOw0KKyAgcmV0dXJuIC0xOw0KK30NCitGWF9DSEFSIENCQ19PbmVkQ29kZTM5UmVhZGVyOjpQYXR0ZXJuVG9DaGFyKGludDMyX3QgcGF0dGVybiwgaW50MzJfdCYgZSkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNDQ7IGkrKykgew0KKyAgICBpZiAoQ0hBUkFDVEVSX0VOQ09ESU5HU1tpXSA9PSBwYXR0ZXJuKSB7DQorICAgICAgcmV0dXJuIChBTFBIQUJFVF9TVFJJTkcpW2ldOw0KKyAgICB9DQorICB9DQorICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgIHJldHVybiAwOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lZENvZGUzOVJlYWRlcjo6RGVjb2RlRXh0ZW5kZWQoQ0ZYX0J5dGVTdHJpbmcmIGVuY29kZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgbGVuZ3RoID0gZW5jb2RlZC5HZXRMZW5ndGgoKTsNCisgIENGWF9CeXRlU3RyaW5nIGRlY29kZWQ7DQorICBGWF9DSEFSIGMsIG5leHQ7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KKyAgICBjID0gZW5jb2RlZFtpXTsNCisgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJyQnIHx8IGMgPT0gJyUnIHx8IGMgPT0gJy8nKSB7DQorICAgICAgbmV4dCA9IGVuY29kZWRbaSArIDFdOw0KKyAgICAgIEZYX0NIQVIgZGVjb2RlZENoYXIgPSAnXDAnOw0KKyAgICAgIHN3aXRjaCAoYykgew0KKyAgICAgICAgY2FzZSAnKyc6DQorICAgICAgICAgIGlmIChuZXh0ID49ICdBJyAmJiBuZXh0IDw9ICdaJykgew0KKyAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpKG5leHQgKyAzMik7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgIHJldHVybiAiIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJyQnOg0KKyAgICAgICAgICBpZiAobmV4dCA+PSAnQScgJiYgbmV4dCA8PSAnWicpIHsNCisgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKShuZXh0IC0gNjQpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgICByZXR1cm4gIiI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICclJzoNCisgICAgICAgICAgaWYgKG5leHQgPj0gJ0EnICYmIG5leHQgPD0gJ0UnKSB7DQorICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikobmV4dCAtIDM4KTsNCisgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID49ICdGJyAmJiBuZXh0IDw9ICdKJykgew0KKyAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpKG5leHQgLSAxMSk7DQorICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA+PSAnSycgJiYgbmV4dCA8PSAnTycgJiYgbmV4dCAhPSAnTScgJiYgbmV4dCAhPSAnTicpIHsNCisgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKShuZXh0ICsgMTYpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPj0gJ1AnICYmIG5leHQgPD0gJ1MnKSB7DQorICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikobmV4dCArIDQzKTsNCisgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID09ICdVJykgew0KKyAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpMDsNCisgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID09ICdWJykgew0KKyAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpNjQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PSAnVycpIHsNCisgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKTk2Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT0gJ1QnIHx8IG5leHQgPT0gJ1gnIHx8IG5leHQgPT0gJ1knIHx8IG5leHQgPT0gJ1onKSB7DQorICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikxMjc7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgIHJldHVybiAiIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJy8nOg0KKyAgICAgICAgICBpZiAobmV4dCA+PSAnQScgJiYgbmV4dCA8PSAnTycpIHsNCisgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKShuZXh0IC0gMzIpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT0gJ1onKSB7DQorICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAnOic7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgIHJldHVybiAiIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZGVjb2RlZCArPSBkZWNvZGVkQ2hhcjsNCisgICAgICBpKys7DQorICAgIH0gZWxzZSB7DQorICAgICAgZGVjb2RlZCArPSBjOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZGVjb2RlZDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5UmVhZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlSZWFkZXIuaAppbmRleCBmYTFlMmUyLi5hN2JjNjNkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlSZWFkZXIuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlSZWFkZXIuaApAQCAtOSwyNCArOSwyNyBAQAogY2xhc3MgQ0JDX09uZURSZWFkZXI7DQogY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KIGNsYXNzIENCQ19PbmVkQ29kYTM5UmVhZGVyOw0KLWNsYXNzIENCQ19PbmVkQ29kZTM5UmVhZGVyIDogcHVibGljIENCQ19PbmVEUmVhZGVyDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIGNvbnN0IEZYX0NIQVIqIEFMUEhBQkVUX1NUUklORzsNCi0gICAgc3RhdGljIGNvbnN0IEZYX0NIQVIqIENIRUNLU1VNX1NUUklORzsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgQ0hBUkFDVEVSX0VOQ09ESU5HU1s0NF07DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEFTVEVSSVNLX0VOQ09ESU5HOw0KLSAgICBDQkNfT25lZENvZGUzOVJlYWRlcigpOw0KLSAgICBDQkNfT25lZENvZGUzOVJlYWRlcihGWF9CT09MIHVzaW5nQ2hlY2tEaWdpdCk7DQotICAgIENCQ19PbmVkQ29kZTM5UmVhZGVyKEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0LCBGWF9CT09MIGV4dGVuZGVkTW9kZSk7DQotICAgIHZpcnR1YWwgfkNCQ19PbmVkQ29kZTM5UmVhZGVyKCk7DQotICAgIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpOw0KLXByaXZhdGU6DQotICAgIEZYX0JPT0wgbV91c2luZ0NoZWNrRGlnaXQ7DQotICAgIEZYX0JPT0wgbV9leHRlbmRlZE1vZGU7DQotICAgIENGWF9JbnQzMkFycmF5ICpGaW5kQXN0ZXJpc2tQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90ICZlKTsNCi0gICAgaW50MzJfdCBUb05hcnJvd1dpZGVQYXR0ZXJuKENGWF9JbnQzMkFycmF5ICpjb3VudGVycyk7DQotICAgIEZYX0NIQVIgUGF0dGVyblRvQ2hhcihpbnQzMl90IHBhdHRlcm4sIGludDMyX3QgJmUpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGVFeHRlbmRlZChDRlhfQnl0ZVN0cmluZyAmZW5jb2RlZCwgaW50MzJfdCAmZSk7DQorY2xhc3MgQ0JDX09uZWRDb2RlMzlSZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURSZWFkZXIgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgY29uc3QgRlhfQ0hBUiogQUxQSEFCRVRfU1RSSU5HOw0KKyAgc3RhdGljIGNvbnN0IEZYX0NIQVIqIENIRUNLU1VNX1NUUklORzsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENIQVJBQ1RFUl9FTkNPRElOR1NbNDRdOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQVNURVJJU0tfRU5DT0RJTkc7DQorICBDQkNfT25lZENvZGUzOVJlYWRlcigpOw0KKyAgQ0JDX09uZWRDb2RlMzlSZWFkZXIoRlhfQk9PTCB1c2luZ0NoZWNrRGlnaXQpOw0KKyAgQ0JDX09uZWRDb2RlMzlSZWFkZXIoRlhfQk9PTCB1c2luZ0NoZWNrRGlnaXQsIEZYX0JPT0wgZXh0ZW5kZWRNb2RlKTsNCisgIHZpcnR1YWwgfkNCQ19PbmVkQ29kZTM5UmVhZGVyKCk7DQorICBDRlhfQnl0ZVN0cmluZyBEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIEZYX0JPT0wgbV91c2luZ0NoZWNrRGlnaXQ7DQorICBGWF9CT09MIG1fZXh0ZW5kZWRNb2RlOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIEZpbmRBc3Rlcmlza1BhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBUb05hcnJvd1dpZGVQYXR0ZXJuKENGWF9JbnQzMkFycmF5KiBjb3VudGVycyk7DQorICBGWF9DSEFSIFBhdHRlcm5Ub0NoYXIoaW50MzJfdCBwYXR0ZXJuLCBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZUV4dGVuZGVkKENGWF9CeXRlU3RyaW5nJiBlbmNvZGVkLCBpbnQzMl90JiBlKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuY3BwCmluZGV4IDBkMDJkMWUuLmNkMDFkOTMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5V3JpdGVyLmNwcApAQCAtMjgsMzI0ICsyOCwzMzcgQEAKICNpbmNsdWRlICJCQ19PbmVEaW1Xcml0ZXIuaCINCiAjaW5jbHVkZSAiQkNfT25lZENvZGUzOVJlYWRlci5oIg0KICNpbmNsdWRlICJCQ19PbmVkQ29kZTM5V3JpdGVyLmgiDQotQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkNCQ19PbmVkQ29kZTM5V3JpdGVyKCkNCi17DQotICAgIG1fZXh0ZW5kZWRNb2RlID0gRkFMU0U7DQotICAgIG1faVdpZGVOYXJyUmF0aW8gPSAzOw0KK0NCQ19PbmVkQ29kZTM5V3JpdGVyOjpDQkNfT25lZENvZGUzOVdyaXRlcigpIHsNCisgIG1fZXh0ZW5kZWRNb2RlID0gRkFMU0U7DQorICBtX2lXaWRlTmFyclJhdGlvID0gMzsNCiB9DQotQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkNCQ19PbmVkQ29kZTM5V3JpdGVyKEZYX0JPT0wgZXh0ZW5kZWRNb2RlKQ0KLXsNCi0gICAgbV9pV2lkZU5hcnJSYXRpbyA9IDM7DQotICAgIG1fZXh0ZW5kZWRNb2RlID0gZXh0ZW5kZWRNb2RlOw0KK0NCQ19PbmVkQ29kZTM5V3JpdGVyOjpDQkNfT25lZENvZGUzOVdyaXRlcihGWF9CT09MIGV4dGVuZGVkTW9kZSkgew0KKyAgbV9pV2lkZU5hcnJSYXRpbyA9IDM7DQorICBtX2V4dGVuZGVkTW9kZSA9IGV4dGVuZGVkTW9kZTsNCiB9DQotQ0JDX09uZWRDb2RlMzlXcml0ZXI6On5DQkNfT25lZENvZGUzOVdyaXRlcigpDQotew0KLX0NCi1GWF9CT09MCUNCQ19PbmVkQ29kZTM5V3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLXsNCi0gICAgaWYgKG1fZXh0ZW5kZWRNb2RlKSB7DQotICAgICAgICByZXR1cm4gQ2hlY2tFeHRlbmRlZENvbnRlbnRWYWxpZGl0eShjb250ZW50cyk7DQorQ0JDX09uZWRDb2RlMzlXcml0ZXI6On5DQkNfT25lZENvZGUzOVdyaXRlcigpIHt9DQorRlhfQk9PTCBDQkNfT25lZENvZGUzOVdyaXRlcjo6Q2hlY2tDb250ZW50VmFsaWRpdHkoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgIGlmIChtX2V4dGVuZGVkTW9kZSkgew0KKyAgICByZXR1cm4gQ2hlY2tFeHRlbmRlZENvbnRlbnRWYWxpZGl0eShjb250ZW50cyk7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgIGlmICgoY2ggPj0gKEZYX1dDSEFSKScwJyAmJiBjaCA8PSAoRlhfV0NIQVIpJzknKSB8fA0KKyAgICAgICAgKGNoID49IChGWF9XQ0hBUiknQScgJiYgY2ggPD0gKEZYX1dDSEFSKSdaJykgfHwgY2ggPT0gKEZYX1dDSEFSKSctJyB8fA0KKyAgICAgICAgY2ggPT0gKEZYX1dDSEFSKScuJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyAnIHx8IGNoID09IChGWF9XQ0hBUiknKicgfHwNCisgICAgICAgIGNoID09IChGWF9XQ0hBUiknJCcgfHwgY2ggPT0gKEZYX1dDSEFSKScvJyB8fCBjaCA9PSAoRlhfV0NIQVIpJysnIHx8DQorICAgICAgICBjaCA9PSAoRlhfV0NIQVIpJyUnKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICBGWF9XQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KLSAgICAgICAgaWYgKChjaCA+PSAoRlhfV0NIQVIpJzAnICYmIGNoIDw9IChGWF9XQ0hBUiknOScpIHx8IChjaCA+PSAoRlhfV0NIQVIpJ0EnICYmIGNoIDw9IChGWF9XQ0hBUiknWicpDQotICAgICAgICAgICAgICAgIHx8IGNoID09IChGWF9XQ0hBUiknLScgfHwgY2ggPT0gKEZYX1dDSEFSKScuJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyAnIHx8IGNoID09IChGWF9XQ0hBUiknKicNCi0gICAgICAgICAgICAgICAgfHwgY2ggPT0gKEZYX1dDSEFSKSckJyB8fCBjaCA9PSAoRlhfV0NIQVIpJy8nIHx8IGNoID09IChGWF9XQ0hBUiknKycgfHwgY2ggPT0gKEZYX1dDSEFSKSclJykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAlDQkNfT25lZENvZGUzOVdyaXRlcjo6Q2hlY2tFeHRlbmRlZENvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLXsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICBGWF9XQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KLSAgICAgICAgaWYgKGNoID4gMTI3KSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkNoZWNrRXh0ZW5kZWRDb250ZW50VmFsaWRpdHkoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgRlhfV0NIQVIgY2ggPSBjb250ZW50cy5HZXRBdChpKTsNCisgICAgaWYgKGNoID4gMTI3KSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLXsNCi0gICAgaWYgKG1fZXh0ZW5kZWRNb2RlKSB7DQotICAgICAgICByZXR1cm4gRmlsdGVyRXh0ZW5kZWRDb250ZW50cyhjb250ZW50cyk7DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkZpbHRlckNvbnRlbnRzKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBpZiAobV9leHRlbmRlZE1vZGUpIHsNCisgICAgcmV0dXJuIEZpbHRlckV4dGVuZGVkQ29udGVudHMoY29udGVudHMpOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgIGlmIChjaCA9PSAoRlhfV0NIQVIpJyonICYmIChpID09IDAgfHwgaSA9PSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDEpKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQotICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KLSAgICAgICAgRlhfV0NIQVIgY2ggPSBjb250ZW50cy5HZXRBdChpKTsNCi0gICAgICAgIGlmICggY2ggPT0gKEZYX1dDSEFSKScqJyAmJiAoaSA9PSAwIHx8IGkgPT0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxKSApIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGNoID4gMTc1KSB7DQotICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICBpZiAoY2ggPiAxNzUpIHsNCisgICAgICBpKys7DQorICAgICAgY29udGludWU7DQorICAgIH0gZWxzZSB7DQorICAgICAgY2ggPSBVcHBlcihjaCk7DQorICAgIH0NCisgICAgaWYgKChjaCA+PSAoRlhfV0NIQVIpJzAnICYmIGNoIDw9IChGWF9XQ0hBUiknOScpIHx8DQorICAgICAgICAoY2ggPj0gKEZYX1dDSEFSKSdBJyAmJiBjaCA8PSAoRlhfV0NIQVIpJ1onKSB8fCBjaCA9PSAoRlhfV0NIQVIpJy0nIHx8DQorICAgICAgICBjaCA9PSAoRlhfV0NIQVIpJy4nIHx8IGNoID09IChGWF9XQ0hBUiknICcgfHwgY2ggPT0gKEZYX1dDSEFSKScqJyB8fA0KKyAgICAgICAgY2ggPT0gKEZYX1dDSEFSKSckJyB8fCBjaCA9PSAoRlhfV0NIQVIpJy8nIHx8IGNoID09IChGWF9XQ0hBUiknKycgfHwNCisgICAgICAgIGNoID09IChGWF9XQ0hBUiknJScpIHsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGUzOVdyaXRlcjo6RmlsdGVyRXh0ZW5kZWRDb250ZW50cygNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgIGlmIChjaCA9PSAoRlhfV0NIQVIpJyonICYmIChpID09IDAgfHwgaSA9PSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDEpKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGNoID4gMTc1KSB7DQorICAgICAgaSsrOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChjaCA+IDEyNyAmJiBjaCA8IDE3Nikgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChjaCA9PSAwKSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gJyUnOw0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICdVJzsNCisgICAgfSBlbHNlIGlmIChjaCA+PSAxICYmIGNoIDw9IDI2KSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gJyQnOw0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9IChjaCArIDY0KTsNCisgICAgfSBlbHNlIGlmIChjaCA+PSAyNyAmJiBjaCA8PSAzMSkgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAoY2ggKyAzOCk7DQorICAgIH0gZWxzZSBpZiAoY2ggPj0gMzMgJiYgY2ggPD0gNDcgJiYgY2ggIT0gNDUgJiYgY2ggIT0gNDYpIHsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAnLyc7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gKGNoICsgMzIpOw0KKyAgICB9IGVsc2UgaWYgKGNoID09IDU4KSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gJy8nOw0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICdaJzsNCisgICAgfSBlbHNlIGlmIChjaCA+PSA1OSAmJiBjaCA8PSA2Mykgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaCArIDExOw0KKyAgICB9IGVsc2UgaWYgKGNoID09IDY0KSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gJyUnOw0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICdWJzsNCisgICAgfSBlbHNlIGlmIChjaCA+PSA5MSAmJiBjaCA8PSA5NSkgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaCAtIDE2Ow0KKyAgICB9IGVsc2UgaWYgKGNoID09IDk2KSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gJyUnOw0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICdXJzsNCisgICAgfSBlbHNlIGlmIChjaCA+PSA5NyAmJiBjaCA8PSAxMjIpIHsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAnKyc7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gY2ggLSAzMjsNCisgICAgfSBlbHNlIGlmIChjaCA+PSAxMjMgJiYgY2ggPD0gMTI2KSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gJyUnOw0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoIC0gNDM7DQorICAgIH0gZWxzZSBpZiAoY2ggPT0gMTI3KSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gJyUnOw0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICdUJzsNCisgICAgfSBlbHNlIHsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGUzOVdyaXRlcjo6UmVuZGVyVGV4dENvbnRlbnRzKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBpZiAobV9leHRlbmRlZE1vZGUpIHsNCisgICAgcmV0dXJuIFJlbmRlckV4dGVuZGVkVGV4dENvbnRlbnRzKGNvbnRlbnRzKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHJlbmRlckNvbnRlbnRzOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBGWF9XQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KKyAgICBpZiAoY2ggPT0gKEZYX1dDSEFSKScqJyAmJiAoaSA9PSAwIHx8IGkgPT0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChjaCA+IDE3NSkgew0KKyAgICAgIGkrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoKGNoID49IChGWF9XQ0hBUiknMCcgJiYgY2ggPD0gKEZYX1dDSEFSKSc5JykgfHwNCisgICAgICAgIChjaCA+PSAoRlhfV0NIQVIpJ0EnICYmIGNoIDw9IChGWF9XQ0hBUiknWicpIHx8DQorICAgICAgICAoY2ggPj0gKEZYX1dDSEFSKSdhJyAmJiBjaCA8PSAoRlhfV0NIQVIpJ3onKSB8fCBjaCA9PSAoRlhfV0NIQVIpJy0nIHx8DQorICAgICAgICBjaCA9PSAoRlhfV0NIQVIpJy4nIHx8IGNoID09IChGWF9XQ0hBUiknICcgfHwgY2ggPT0gKEZYX1dDSEFSKScqJyB8fA0KKyAgICAgICAgY2ggPT0gKEZYX1dDSEFSKSckJyB8fCBjaCA9PSAoRlhfV0NIQVIpJy8nIHx8IGNoID09IChGWF9XQ0hBUiknKycgfHwNCisgICAgICAgIGNoID09IChGWF9XQ0hBUiknJScpIHsNCisgICAgICByZW5kZXJDb250ZW50cyArPSBjaDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHJlbmRlckNvbnRlbnRzOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGUzOVdyaXRlcjo6UmVuZGVyRXh0ZW5kZWRUZXh0Q29udGVudHMoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgIENGWF9XaWRlU3RyaW5nIHJlbmRlckNvbnRlbnRzOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBGWF9XQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KKyAgICBpZiAoY2ggPT0gKEZYX1dDSEFSKScqJyAmJiAoaSA9PSAwIHx8IGkgPT0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChjaCA+IDE3NSkgew0KKyAgICAgIGkrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoY2ggPiAxMjcgJiYgY2ggPCAxNzYpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICByZW5kZXJDb250ZW50cyArPSBjaDsNCisgIH0NCisgIHJldHVybiByZW5kZXJDb250ZW50czsNCit9DQorRlhfQk9PTCBDQkNfT25lZENvZGUzOVdyaXRlcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7DQorICBpZiAobG9jYXRpb24gPCBCQ19URVhUX0xPQ19OT05FIHx8IGxvY2F0aW9uID4gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbykgew0KKyAgaWYgKHJhdGlvIDwgMiB8fCByYXRpbyA+IDMpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9pV2lkZU5hcnJSYXRpbyA9IHJhdGlvOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICB1aW50OF90KiByZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcmV0Ow0KK30NCit1aW50OF90KiBDQkNfT25lZENvZGUzOVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChmb3JtYXQgIT0gQkNGT1JNQVRfQ09ERV8zOSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERV8zOTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB1aW50OF90KiByZXQgPQ0KKyAgICAgIENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcmV0Ow0KK30NCit2b2lkIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpUb0ludEFycmF5KGludDMyX3QgYSwgaW50MzJfdCogdG9SZXR1cm4pIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDk7IGkrKykgew0KKyAgICB0b1JldHVybltpXSA9IChhICYgKDEgPDwgaSkpID09IDAgPyAxIDogbV9pV2lkZU5hcnJSYXRpbzsNCisgIH0NCit9DQorRlhfQ0hBUiBDQkNfT25lZENvZGUzOVdyaXRlcjo6Q2FsY0NoZWNrU3VtKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBsZW5ndGggPSBjb250ZW50cy5HZXRMZW5ndGgoKTsNCisgIGlmIChsZW5ndGggPiA4MCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Db250ZW50c0xlbmd0aFNob3VsZEJldHdlZW4xYW5kODA7DQorICAgIHJldHVybiAnKic7DQorICB9DQorICBpbnQzMl90IGNoZWNrc3VtID0gMDsNCisgIGludDMyX3QgbGVuID0gKGludDMyX3Qpc3RybGVuKENCQ19PbmVkQ29kZTM5UmVhZGVyOjpBTFBIQUJFVF9TVFJJTkcpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBpbnQzMl90IGogPSAwOw0KKyAgICBmb3IgKDsgaiA8IGxlbjsgaisrKSB7DQorICAgICAgaWYgKENCQ19PbmVkQ29kZTM5UmVhZGVyOjpBTFBIQUJFVF9TVFJJTkdbal0gPT0gY29udGVudHNbaV0pIHsNCisgICAgICAgIGlmIChjb250ZW50c1tpXSAhPSAnKicpIHsNCisgICAgICAgICAgY2hlY2tzdW0gKz0gajsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGNoID0gVXBwZXIoY2gpOw0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmICgoY2ggPj0gKEZYX1dDSEFSKScwJyAmJiBjaCA8PSAoRlhfV0NIQVIpJzknKSB8fCAoY2ggPj0gKEZYX1dDSEFSKSdBJyAmJiBjaCA8PSAoRlhfV0NIQVIpJ1onKQ0KLSAgICAgICAgICAgICAgICB8fCBjaCA9PSAoRlhfV0NIQVIpJy0nIHx8IGNoID09IChGWF9XQ0hBUiknLicgfHwgY2ggPT0gKEZYX1dDSEFSKScgJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyonDQotICAgICAgICAgICAgICAgIHx8IGNoID09IChGWF9XQ0hBUiknJCcgfHwgY2ggPT0gKEZYX1dDSEFSKScvJyB8fCBjaCA9PSAoRlhfV0NIQVIpJysnIHx8IGNoID09IChGWF9XQ0hBUiknJScpIHsNCi0gICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaDsNCi0gICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOw0KKyAgICBpZiAoaiA+PSBsZW4pIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25VblN1cHBvcnRlZFN0cmluZzsNCisgICAgICByZXR1cm4gJyonOw0KKyAgICB9DQorICB9DQorICBjaGVja3N1bSA9IGNoZWNrc3VtICUgNDM7DQorICByZXR1cm4gQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNIRUNLU1VNX1NUUklOR1tjaGVja3N1bV07DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpGaWx0ZXJFeHRlbmRlZENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50czsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICBGWF9XQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KLSAgICAgICAgaWYgKCBjaCA9PSAoRlhfV0NIQVIpJyonICYmIChpID09IDAgfHwgaSA9PSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDEpICkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KK3VpbnQ4X3QqIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0bGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgRlhfQ0hBUiBjaGVja3N1bSA9IENhbGNDaGVja1N1bShjb250ZW50cywgZSk7DQorICBpZiAoY2hlY2tzdW0gPT0gJyonKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCB3aWR0aHNbOV0gPSB7MH07DQorICBpbnQzMl90IHdpZGVTdHJpZGVOdW0gPSAzOw0KKyAgaW50MzJfdCBuYXJyU3RyaWRlTnVtID0gOSAtIHdpZGVTdHJpZGVOdW07DQorICBDRlhfQnl0ZVN0cmluZyBlbmNvZGVkQ29udGVudHMgPSBjb250ZW50czsNCisgIGlmIChtX2JDYWxjQ2hlY2tzdW0pIHsNCisgICAgZW5jb2RlZENvbnRlbnRzICs9IGNoZWNrc3VtOw0KKyAgfQ0KKyAgbV9pQ29udGVudExlbiA9IGVuY29kZWRDb250ZW50cy5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgY29kZVdpZHRoID0gKHdpZGVTdHJpZGVOdW0gKiBtX2lXaWRlTmFyclJhdGlvICsgbmFyclN0cmlkZU51bSkgKiAyICsNCisgICAgICAgICAgICAgICAgICAgICAgMSArIG1faUNvbnRlbnRMZW47DQorICBpbnQzMl90IGxlbiA9IChpbnQzMl90KXN0cmxlbihDQkNfT25lZENvZGUzOVJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG1faUNvbnRlbnRMZW47IGorKykgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KKyAgICAgIGlmIChDQkNfT25lZENvZGUzOVJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HW2ldID09IGVuY29kZWRDb250ZW50c1tqXSkgew0KKyAgICAgICAgVG9JbnRBcnJheShDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0hBUkFDVEVSX0VOQ09ESU5HU1tpXSwgd2lkdGhzKTsNCisgICAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IDk7IGsrKykgew0KKyAgICAgICAgICBjb2RlV2lkdGggKz0gd2lkdGhzW2tdOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYoY2ggPiAxNzUpIHsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBvdXRsZW5ndGggPSBjb2RlV2lkdGg7DQorICB1aW50OF90KiByZXN1bHQgPSBGWF9BbGxvYyh1aW50OF90LCBjb2RlV2lkdGgpOw0KKyAgVG9JbnRBcnJheShDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0hBUkFDVEVSX0VOQ09ESU5HU1szOV0sIHdpZHRocyk7DQorICBpbnQzMl90IHBvcyA9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCAwLCB3aWR0aHMsIDksIDEsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBuYXJyb3dXaGl0ZVtdID0gezF9Ow0KKyAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIG5hcnJvd1doaXRlLCAxLCAwLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgRlhfRnJlZShyZXN1bHQpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGZvciAoaW50MzJfdCBsID0gbV9pQ29udGVudExlbiAtIDE7IGwgPj0gMDsgbC0tKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgICAgaWYgKENCQ19PbmVkQ29kZTM5UmVhZGVyOjpBTFBIQUJFVF9TVFJJTkdbaV0gPT0gZW5jb2RlZENvbnRlbnRzW2xdKSB7DQorICAgICAgICBUb0ludEFycmF5KENCQ19PbmVkQ29kZTM5UmVhZGVyOjpDSEFSQUNURVJfRU5DT0RJTkdTW2ldLCB3aWR0aHMpOw0KKyAgICAgICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIHdpZHRocywgOSwgMSwgZSk7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgIEZYX0ZyZWUocmVzdWx0KTsNCisgICAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgICAgICB9DQotICAgICAgICBpZiAoY2ggPiAxMjcgJiYgY2ggPCAxNzYpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChjaCA9PSAwKSB7DQotICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJyUnOw0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICdVJzsNCi0gICAgICAgIH0gZWxzZSBpZihjaCA+PSAxICYmIGNoIDw9IDI2KSB7DQotICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJyQnOw0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IChjaCArIDY0KTsNCi0gICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMjcgJiYgY2ggPD0gMzEpIHsNCi0gICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAnJSc7DQotICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gKGNoICsgMzgpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAzMyAmJiBjaCA8PSA0NyAmJiBjaCAhPSA0NSAmJiBjaCAhPSA0Nikgew0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICcvJzsNCi0gICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAoY2ggKyAzMik7DQotICAgICAgICB9IGVsc2UgaWYgKGNoID09IDU4KSB7DQotICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJy8nOw0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICdaJzsNCi0gICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gNTkgJiYgY2ggPD0gNjMpIHsNCi0gICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAnJSc7DQotICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gY2ggKyAxMTsNCi0gICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gNjQpIHsNCi0gICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAnJSc7DQotICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJ1YnOw0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA+PSA5MSAmJiBjaCA8PSA5NSkgew0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCi0gICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaCAtIDE2Ow0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSA5Nikgew0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCi0gICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAnVyc7DQotICAgICAgICB9IGVsc2UgaWYgKGNoID49IDk3ICYmIGNoIDw9IDEyMikgew0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICcrJzsNCi0gICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaCAtIDMyOw0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAxMjMgJiYgY2ggPD0gMTI2KSB7DQotICAgICAgICAgICAgZmlsdGVyY29udGVudHMgKz0gJyUnOw0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoIC0gNDM7DQotICAgICAgICB9IGVsc2UgaWYgKGNoID09IDEyNykgew0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCi0gICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSAnVCc7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KLSAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gZmlsdGVyY29udGVudHM7DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpSZW5kZXJUZXh0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykNCi17DQotICAgIGlmIChtX2V4dGVuZGVkTW9kZSkgew0KLSAgICAgICAgcmV0dXJuIFJlbmRlckV4dGVuZGVkVGV4dENvbnRlbnRzKGNvbnRlbnRzKTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb250ZW50czsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICBGWF9XQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KLSAgICAgICAgaWYgKCBjaCA9PSAoRlhfV0NIQVIpJyonICYmIChpID09IDAgfHwgaSA9PSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDEpICkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoY2ggPiAxNzUpIHsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoKGNoID49IChGWF9XQ0hBUiknMCcgJiYgY2ggPD0gKEZYX1dDSEFSKSc5JykgfHwgKGNoID49IChGWF9XQ0hBUiknQScgJiYgY2ggPD0gKEZYX1dDSEFSKSdaJykNCi0gICAgICAgICAgICAgICAgfHwgKGNoID49IChGWF9XQ0hBUiknYScgJiYgY2ggPD0gKEZYX1dDSEFSKSd6JykgfHwgY2ggPT0gKEZYX1dDSEFSKSctJyB8fCBjaCA9PSAoRlhfV0NIQVIpJy4nDQotICAgICAgICAgICAgICAgIHx8IGNoID09IChGWF9XQ0hBUiknICcgfHwgY2ggPT0gKEZYX1dDSEFSKScqJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyQnIHx8IGNoID09IChGWF9XQ0hBUiknLycNCi0gICAgICAgICAgICAgICAgfHwgY2ggPT0gKEZYX1dDSEFSKScrJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyUnKSB7DQotICAgICAgICAgICAgcmVuZGVyQ29udGVudHMgKz0gY2g7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIHJlbmRlckNvbnRlbnRzOw0KLX0NCi1DRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGUzOVdyaXRlcjo6UmVuZGVyRXh0ZW5kZWRUZXh0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHJlbmRlckNvbnRlbnRzOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCi0gICAgICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQotICAgICAgICBpZiAoIGNoID09IChGWF9XQ0hBUiknKicgJiYgKGkgPT0gMCB8fCBpID09IGNvbnRlbnRzLkdldExlbmd0aCgpIC0gMSkgKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZihjaCA+IDE3NSkgew0KLSAgICAgICAgICAgIGkrKzsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChjaCA+IDEyNyAmJiBjaCA8IDE3Nikgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmVuZGVyQ29udGVudHMgKz0gY2g7DQotICAgIH0NCi0gICAgcmV0dXJuIHJlbmRlckNvbnRlbnRzOw0KLX0NCi1GWF9CT09MIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pDQotew0KLSAgICBpZiAoIGxvY2F0aW9uIDwgQkNfVEVYVF9MT0NfTk9ORSB8fCBsb2NhdGlvbiA+IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OlNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKQ0KLXsNCi0gICAgaWYgKCByYXRpbyA8IDIgfHwgcmF0aW8gPiAzKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgbV9pV2lkZU5hcnJSYXRpbyA9IHJhdGlvOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdWludDhfdCAqQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCAmZSkNCi17DQotICAgIHVpbnQ4X3QgKnJldCA9IEVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwICwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgcmV0dXJuIHJldDsNCi19DQotdWludDhfdCAqQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKGZvcm1hdCAhPSBCQ0ZPUk1BVF9DT0RFXzM5KSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERV8zOTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHVpbnQ4X3QgKnJldCA9IENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBoaW50cywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgcmV0dXJuIHJldDsNCi19DQotdm9pZCBDQkNfT25lZENvZGUzOVdyaXRlcjo6VG9JbnRBcnJheShpbnQzMl90IGEsIGludDMyX3QgKnRvUmV0dXJuKQ0KLXsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCA5OyBpKyspIHsNCi0gICAgICAgIHRvUmV0dXJuW2ldID0gKGEgJiAoMSA8PCBpKSApID09IDAgPyAxIDogbV9pV2lkZU5hcnJSYXRpbzsNCi0gICAgfQ0KLX0NCi1GWF9DSEFSIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpDYWxjQ2hlY2tTdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBsZW5ndGggPSBjb250ZW50cy5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGxlbmd0aCA+IDgwKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Db250ZW50c0xlbmd0aFNob3VsZEJldHdlZW4xYW5kODA7DQotICAgICAgICByZXR1cm4gJyonOw0KLSAgICB9DQotICAgIGludDMyX3QgY2hlY2tzdW0gPSAwOw0KLSAgICBpbnQzMl90IGxlbiA9IChpbnQzMl90KXN0cmxlbihDQkNfT25lZENvZGUzOVJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HKTsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICBpbnQzMl90IGogPSAwOw0KLSAgICAgICAgZm9yICg7IGogPCBsZW47IGorKykgew0KLSAgICAgICAgICAgIGlmIChDQkNfT25lZENvZGUzOVJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HW2pdID09IGNvbnRlbnRzW2ldKSB7DQotICAgICAgICAgICAgICAgIGlmKGNvbnRlbnRzW2ldICE9ICcqJykgew0KLSAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0gKz0gajsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoaiA+PSBsZW4pIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25VblN1cHBvcnRlZFN0cmluZzsNCi0gICAgICAgICAgICByZXR1cm4gJyonOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gJSA0MzsNCi0gICAgcmV0dXJuIENCQ19PbmVkQ29kZTM5UmVhZGVyOjpDSEVDS1NVTV9TVFJJTkdbY2hlY2tzdW1dOw0KLX0NCi11aW50OF90ICpDQkNfT25lZENvZGUzOVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgaW50MzJfdCAmb3V0bGVuZ3RoICwgaW50MzJfdCAmZSkNCi17DQotICAgIEZYX0NIQVIgY2hlY2tzdW0gPSBDYWxjQ2hlY2tTdW0oY29udGVudHMsIGUpOw0KLSAgICBpZiAoY2hlY2tzdW0gPT0gJyonKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHdpZHRoc1s5XSA9IHswfTsNCi0gICAgaW50MzJfdCB3aWRlU3RyaWRlTnVtID0gMzsNCi0gICAgaW50MzJfdCBuYXJyU3RyaWRlTnVtID0gOSAtIHdpZGVTdHJpZGVOdW07DQotICAgIENGWF9CeXRlU3RyaW5nIGVuY29kZWRDb250ZW50cyA9IGNvbnRlbnRzOw0KLSAgICBpZiAoIG1fYkNhbGNDaGVja3N1bSApIHsNCi0gICAgICAgIGVuY29kZWRDb250ZW50cyArPSBjaGVja3N1bTsNCi0gICAgfQ0KLSAgICBtX2lDb250ZW50TGVuID0gZW5jb2RlZENvbnRlbnRzLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IGNvZGVXaWR0aCA9ICh3aWRlU3RyaWRlTnVtICogbV9pV2lkZU5hcnJSYXRpbyArIG5hcnJTdHJpZGVOdW0pICogMiArIDEgKyBtX2lDb250ZW50TGVuOw0KLSAgICBpbnQzMl90IGxlbiA9IChpbnQzMl90KXN0cmxlbihDQkNfT25lZENvZGUzOVJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HKTsNCi0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbV9pQ29udGVudExlbjsgaisrKSB7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KLSAgICAgICAgICAgIGlmIChDQkNfT25lZENvZGUzOVJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HW2ldID09IGVuY29kZWRDb250ZW50c1tqXSkgew0KLSAgICAgICAgICAgICAgICBUb0ludEFycmF5KENCQ19PbmVkQ29kZTM5UmVhZGVyOjpDSEFSQUNURVJfRU5DT0RJTkdTW2ldLCB3aWR0aHMpOw0KLSAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBrID0gMDsgayA8IDk7IGsrKykgew0KLSAgICAgICAgICAgICAgICAgICAgY29kZVdpZHRoICs9IHdpZHRoc1trXTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBvdXRsZW5ndGggPSBjb2RlV2lkdGg7DQotICAgIHVpbnQ4X3QgKnJlc3VsdCA9IEZYX0FsbG9jKHVpbnQ4X3QsIGNvZGVXaWR0aCk7DQotICAgIFRvSW50QXJyYXkoQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNIQVJBQ1RFUl9FTkNPRElOR1NbMzldLCB3aWR0aHMpOw0KLSAgICBpbnQzMl90IHBvcyA9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCAwLCB3aWR0aHMsIDksIDEgLCBlKTsNCi0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGludDMyX3QgbmFycm93V2hpdGVbXSA9IHsxfTsNCiAgICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIG5hcnJvd1doaXRlLCAxLCAwLCBlKTsNCiAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIEZYX0ZyZWUocmVzdWx0KTsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICBmb3IoaW50MzJfdCBsID0gbV9pQ29udGVudExlbiAtIDE7IGwgPj0gMDsgbC0tKSB7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KLSAgICAgICAgICAgIGlmIChDQkNfT25lZENvZGUzOVJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HW2ldID09IGVuY29kZWRDb250ZW50c1tsXSkgew0KLSAgICAgICAgICAgICAgICBUb0ludEFycmF5KENCQ19PbmVkQ29kZTM5UmVhZGVyOjpDSEFSQUNURVJfRU5DT0RJTkdTW2ldLCB3aWR0aHMpOw0KLSAgICAgICAgICAgICAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgd2lkdGhzLCA5LCAxLCBlKTsNCi0gICAgICAgICAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIG5hcnJvd1doaXRlLCAxLCAwLCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIFRvSW50QXJyYXkoQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNIQVJBQ1RFUl9FTkNPRElOR1NbMzldLCB3aWR0aHMpOw0KLSAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgd2lkdGhzLCA5LCAxLCBlKTsNCi0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvZGVXaWR0aCAvIDI7IGkrKykgew0KLSAgICAgICAgcmVzdWx0W2ldIF49IHJlc3VsdFtjb2RlV2lkdGggLSAxIC0gaV07DQotICAgICAgICByZXN1bHRbY29kZVdpZHRoIC0gMSAtIGldIF49IHJlc3VsdFtpXTsNCi0gICAgICAgIHJlc3VsdFtpXSBePSByZXN1bHRbY29kZVdpZHRoIC0gMSAtIGldOw0KLSAgICB9DQotICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorICBUb0ludEFycmF5KENCQ19PbmVkQ29kZTM5UmVhZGVyOjpDSEFSQUNURVJfRU5DT0RJTkdTWzM5XSwgd2lkdGhzKTsNCisgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCB3aWR0aHMsIDksIDEsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29kZVdpZHRoIC8gMjsgaSsrKSB7DQorICAgIHJlc3VsdFtpXSBePSByZXN1bHRbY29kZVdpZHRoIC0gMSAtIGldOw0KKyAgICByZXN1bHRbY29kZVdpZHRoIC0gMSAtIGldIF49IHJlc3VsdFtpXTsNCisgICAgcmVzdWx0W2ldIF49IHJlc3VsdFtjb2RlV2lkdGggLSAxIC0gaV07DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KIH0NCi1DRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGUzOVdyaXRlcjo6ZW5jb2RlZENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkQ29udGVudHMgPSBjb250ZW50czsNCi0gICAgaWYgKG1fYkNhbGNDaGVja3N1bSAmJiBtX2JQcmludENoZWNrc3VtKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyBjaGVja3N1bUNvbnRlbnQgPSBGaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBjaGVja3N1bUNvbnRlbnQuVVRGOEVuY29kZSgpOw0KLSAgICAgICAgRlhfQ0hBUiBjaGVja3N1bTsNCi0gICAgICAgIGNoZWNrc3VtID0gQ2FsY0NoZWNrU3VtKHN0ciwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQotICAgICAgICBzdHIgKz0gY2hlY2tzdW07DQotICAgICAgICBlbmNvZGVkQ29udGVudHMgKz0gY2hlY2tzdW07DQotICAgIH0NCi0gICAgcmV0dXJuIGVuY29kZWRDb250ZW50czsNCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGUzOVdyaXRlcjo6ZW5jb2RlZENvbnRlbnRzKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkQ29udGVudHMgPSBjb250ZW50czsNCisgIGlmIChtX2JDYWxjQ2hlY2tzdW0gJiYgbV9iUHJpbnRDaGVja3N1bSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyBjaGVja3N1bUNvbnRlbnQgPSBGaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQorICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IGNoZWNrc3VtQ29udGVudC5VVEY4RW5jb2RlKCk7DQorICAgIEZYX0NIQVIgY2hlY2tzdW07DQorICAgIGNoZWNrc3VtID0gQ2FsY0NoZWNrU3VtKHN0ciwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGWF9XU1RSQyhMIiIpKTsNCisgICAgc3RyICs9IGNoZWNrc3VtOw0KKyAgICBlbmNvZGVkQ29udGVudHMgKz0gY2hlY2tzdW07DQorICB9DQorICByZXR1cm4gZW5jb2RlZENvbnRlbnRzOw0KIH0NCi12b2lkIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgdWludDhfdCogY29kZSwgaW50MzJfdCBjb2RlTGVuZ3RoLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlZENvbiA9IGVuY29kZWRDb250ZW50cyhjb250ZW50cywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJSZXN1bHQoZW5jb2RlZENvbiwgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOw0KK3ZvaWQgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OlJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIGVuY29kZWRDb24gPSBlbmNvZGVkQ29udGVudHMoY29udGVudHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJSZXN1bHQoZW5jb2RlZENvbiwgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oCmluZGV4IDY3OWQ0ZjYuLjM1MDhlYzggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oCkBAIC05LDI5ICs5LDQ0IEBACiBlbnVtIEJDX1RFWFRfTE9DOw0KIGNsYXNzIENCQ19PbmVEaW1Xcml0ZXI7DQogY2xhc3MgQ0JDX09uZWRDb2RhMzlXcml0ZXI7DQotY2xhc3MgQ0JDX09uZWRDb2RlMzlXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19PbmVkQ29kZTM5V3JpdGVyKCk7DQotICAgIENCQ19PbmVkQ29kZTM5V3JpdGVyKEZYX0JPT0wgZXh0ZW5kZWRNb2RlKTsNCi0gICAgdmlydHVhbCB+Q0JDX09uZWRDb2RlMzlXcml0ZXIoKTsNCi0gICAgdWludDhfdAkJCSpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgJmUpOw0KLSAgICB1aW50OF90CQkJKkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSk7DQotICAgIHVpbnQ4X3QJCQkqRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgaW50MzJfdCAmb3V0TGVuZ3RoLCBpbnQzMl90ICZlKTsNCi0gICAgdm9pZAkJCVJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCB1aW50OF90KiBjb2RlLCBpbnQzMl90IGNvZGVMZW5ndGgsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfV2lkZVN0cmluZyAgZW5jb2RlZENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIGludDMyX3QgJmUpOw0KLSAgICBGWF9CT09MCQkJQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQotICAgIEZYX0JPT0wgICAgICAgICBDaGVja0V4dGVuZGVkQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KLSAgICBDRlhfV2lkZVN0cmluZwlGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgIEZpbHRlckV4dGVuZGVkQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQotICAgIENGWF9XaWRlU3RyaW5nICBSZW5kZXJUZXh0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQotICAgIENGWF9XaWRlU3RyaW5nICBSZW5kZXJFeHRlbmRlZFRleHRDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCi0gICAgRlhfQk9PTAkJCVNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2N0aW9uKTsNCi0gICAgRlhfQk9PTAkJCVNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKTsNCi1wcml2YXRlOg0KLSAgICB2b2lkCQkJVG9JbnRBcnJheShpbnQzMl90IGEsIGludDMyX3QgKnRvUmV0dXJuKTsNCi0gICAgRlhfQ0hBUgkJCUNhbGNDaGVja1N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIGludDMyX3QgJmUpOw0KLSAgICBpbnQzMl90CQltX2lXaWRlTmFyclJhdGlvOw0KLSAgICBGWF9CT09MICAgICAgICAgbV9leHRlbmRlZE1vZGU7DQorY2xhc3MgQ0JDX09uZWRDb2RlMzlXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlciB7DQorIHB1YmxpYzoNCisgIENCQ19PbmVkQ29kZTM5V3JpdGVyKCk7DQorICBDQkNfT25lZENvZGUzOVdyaXRlcihGWF9CT09MIGV4dGVuZGVkTW9kZSk7DQorICB2aXJ0dWFsIH5DQkNfT25lZENvZGUzOVdyaXRlcigpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZvaWQgUmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlZENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIEZYX0JPT0wgQ2hlY2tFeHRlbmRlZENvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIENGWF9XaWRlU3RyaW5nIEZpbHRlckNvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRmlsdGVyRXh0ZW5kZWRDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIENGWF9XaWRlU3RyaW5nIFJlbmRlclRleHRDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIENGWF9XaWRlU3RyaW5nIFJlbmRlckV4dGVuZGVkVGV4dENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgRlhfQk9PTCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jdGlvbik7DQorICBGWF9CT09MIFNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgVG9JbnRBcnJheShpbnQzMl90IGEsIGludDMyX3QqIHRvUmV0dXJuKTsNCisgIEZYX0NIQVIgQ2FsY0NoZWNrU3VtKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywgaW50MzJfdCYgZSk7DQorICBpbnQzMl90IG1faVdpZGVOYXJyUmF0aW87DQorICBGWF9CT09MIG1fZXh0ZW5kZWRNb2RlOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNSZWFkZXIuY3BwCmluZGV4IDI4OGFhY2UuLjc0YzRjZDkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzUmVhZGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1JlYWRlci5jcHAKQEAgLTI3LDY4ICsyNyw3MSBAQAogI2luY2x1ZGUgIkJDX09uZURpbVJlYWRlci5oIg0KICNpbmNsdWRlICJCQ19PbmVkRUFOMTNSZWFkZXIuaCINCiBjb25zdCBpbnQzMl90IENCQ19PbmVkRUFOMTNSZWFkZXI6OkZJUlNUX0RJR0lUX0VOQ09ESU5HU1sxMF0gPSB7DQotICAgIDB4MDAsIDB4MEIsIDB4MEQsIDB4RSwgMHgxMywgMHgxOSwgMHgxQywgMHgxNSwgMHgxNiwgMHgxQQ0KLX07DQotQ0JDX09uZWRFQU4xM1JlYWRlcjo6Q0JDX09uZWRFQU4xM1JlYWRlcigpDQotew0KLX0NCi1DQkNfT25lZEVBTjEzUmVhZGVyOjp+Q0JDX09uZWRFQU4xM1JlYWRlcigpDQotew0KLX0NCi12b2lkIENCQ19PbmVkRUFOMTNSZWFkZXI6OkRldGVybWluZUZpcnN0RGlnaXQoQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgaW50MzJfdCBsZ1BhdHRlcm5Gb3VuZCwgaW50MzJfdCAmZSkNCi17DQotICAgIGZvciAoaW50MzJfdCBkID0gMDsgZCA8IDEwOyBkKyspIHsNCi0gICAgICAgIGlmIChsZ1BhdHRlcm5Gb3VuZCA9PSBGSVJTVF9ESUdJVF9FTkNPRElOR1NbZF0pIHsNCi0gICAgICAgICAgICByZXN1bHQuSW5zZXJ0KDAsIChGWF9DSEFSKSAoJzAnICsgZCkpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCisgICAgMHgwMCwgMHgwQiwgMHgwRCwgMHhFLCAweDEzLCAweDE5LCAweDFDLCAweDE1LCAweDE2LCAweDFBfTsNCitDQkNfT25lZEVBTjEzUmVhZGVyOjpDQkNfT25lZEVBTjEzUmVhZGVyKCkge30NCitDQkNfT25lZEVBTjEzUmVhZGVyOjp+Q0JDX09uZWRFQU4xM1JlYWRlcigpIHt9DQordm9pZCBDQkNfT25lZEVBTjEzUmVhZGVyOjpEZXRlcm1pbmVGaXJzdERpZ2l0KENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGdQYXR0ZXJuRm91bmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGZvciAoaW50MzJfdCBkID0gMDsgZCA8IDEwOyBkKyspIHsNCisgICAgaWYgKGxnUGF0dGVybkZvdW5kID09IEZJUlNUX0RJR0lUX0VOQ09ESU5HU1tkXSkgew0KKyAgICAgIHJlc3VsdC5JbnNlcnQoMCwgKEZYX0NIQVIpKCcwJyArIGQpKTsNCisgICAgICByZXR1cm47DQogICAgIH0NCi0gICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCiB9DQotaW50MzJfdCBDQkNfT25lZEVBTjEzUmVhZGVyOjpEZWNvZGVNaWRkbGUoQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpzdGFydFJhbmdlLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0U3RyaW5nLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQotICAgIGNvdW50ZXJzLkFkZCgwKTsNCi0gICAgY291bnRlcnMuQWRkKDApOw0KLSAgICBjb3VudGVycy5BZGQoMCk7DQotICAgIGNvdW50ZXJzLkFkZCgwKTsNCi0gICAgaW50MzJfdCBlbmQgPSByb3ctPkdldFNpemUoKTsNCi0gICAgaW50MzJfdCByb3dPZmZzZXQgPSAoKnN0YXJ0UmFuZ2UpWzFdOw0KLSAgICBpbnQzMl90IGxnUGF0dGVybkZvdW5kID0gMDsNCi0gICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgNiAmJiByb3dPZmZzZXQgPCBlbmQ7IHgrKykgew0KLSAgICAgICAgaW50MzJfdCBiZXN0TWF0Y2ggPSBEZWNvZGVEaWdpdChyb3csICZjb3VudGVycywgcm93T2Zmc2V0LCAmKENCQ19PbmVEaW1SZWFkZXI6OkxfQU5EX0dfUEFUVEVSTlNbMF1bMF0pLCAyMCwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQotICAgICAgICByZXN1bHRTdHJpbmcgKz0gKEZYX0NIQVIpICgnMCcgKyBiZXN0TWF0Y2ggJSAxMCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudGVycy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIHJvd09mZnNldCArPSBjb3VudGVyc1tpXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiZXN0TWF0Y2ggPj0gMTApIHsNCi0gICAgICAgICAgICBsZ1BhdHRlcm5Gb3VuZCB8PSAxIDw8ICg1IC0geCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgRGV0ZXJtaW5lRmlyc3REaWdpdChyZXN1bHRTdHJpbmcsIGxnUGF0dGVybkZvdW5kLCBlKTsNCitpbnQzMl90IENCQ19PbmVkRUFOMTNSZWFkZXI6OkRlY29kZU1pZGRsZShDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogc3RhcnRSYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0U3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgY291bnRlcnMuQWRkKDApOw0KKyAgY291bnRlcnMuQWRkKDApOw0KKyAgY291bnRlcnMuQWRkKDApOw0KKyAgY291bnRlcnMuQWRkKDApOw0KKyAgaW50MzJfdCBlbmQgPSByb3ctPkdldFNpemUoKTsNCisgIGludDMyX3Qgcm93T2Zmc2V0ID0gKCpzdGFydFJhbmdlKVsxXTsNCisgIGludDMyX3QgbGdQYXR0ZXJuRm91bmQgPSAwOw0KKyAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgNiAmJiByb3dPZmZzZXQgPCBlbmQ7IHgrKykgew0KKyAgICBpbnQzMl90IGJlc3RNYXRjaCA9DQorICAgICAgICBEZWNvZGVEaWdpdChyb3csICZjb3VudGVycywgcm93T2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgJihDQkNfT25lRGltUmVhZGVyOjpMX0FORF9HX1BBVFRFUk5TWzBdWzBdKSwgMjAsIGUpOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQotICAgIENGWF9JbnQzMkFycmF5IHJlc3VsdDsNCi0gICAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlswXSk7DQotICAgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bMV0pOw0KLSAgICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzJdKTsNCi0gICAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlszXSk7DQotICAgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bNF0pOw0KLSAgICBDRlhfSW50MzJBcnJheSAqbWlkZGxlUmFuZ2UgPSBGaW5kR3VhcmRQYXR0ZXJuKHJvdywgcm93T2Zmc2V0LCBUUlVFLCAmcmVzdWx0LCBlKTsNCisgICAgcmVzdWx0U3RyaW5nICs9IChGWF9DSEFSKSgnMCcgKyBiZXN0TWF0Y2ggJSAxMCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgcm93T2Zmc2V0ICs9IGNvdW50ZXJzW2ldOw0KKyAgICB9DQorICAgIGlmIChiZXN0TWF0Y2ggPj0gMTApIHsNCisgICAgICBsZ1BhdHRlcm5Gb3VuZCB8PSAxIDw8ICg1IC0geCk7DQorICAgIH0NCisgIH0NCisgIERldGVybWluZUZpcnN0RGlnaXQocmVzdWx0U3RyaW5nLCBsZ1BhdHRlcm5Gb3VuZCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICBDRlhfSW50MzJBcnJheSByZXN1bHQ7DQorICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzBdKTsNCisgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bMV0pOw0KKyAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlsyXSk7DQorICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzNdKTsNCisgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bNF0pOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIG1pZGRsZVJhbmdlID0NCisgICAgICBGaW5kR3VhcmRQYXR0ZXJuKHJvdywgcm93T2Zmc2V0LCBUUlVFLCAmcmVzdWx0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgIHJvd09mZnNldCA9ICgqbWlkZGxlUmFuZ2UpWzFdOw0KKyAgaWYgKG1pZGRsZVJhbmdlICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1pZGRsZVJhbmdlOw0KKyAgICBtaWRkbGVSYW5nZSA9IE5VTEw7DQorICB9DQorICBmb3IgKGludDMyX3QgWSA9IDA7IFkgPCA2ICYmIHJvd09mZnNldCA8IGVuZDsgWSsrKSB7DQorICAgIGludDMyX3QgYmVzdE1hdGNoID0NCisgICAgICAgIERlY29kZURpZ2l0KHJvdywgJmNvdW50ZXJzLCByb3dPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAmKENCQ19PbmVEaW1SZWFkZXI6OkxfUEFUVEVSTlNbMF1bMF0pLCAxMCwgZSk7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgcm93T2Zmc2V0ID0gKCptaWRkbGVSYW5nZSlbMV07DQotICAgIGlmKG1pZGRsZVJhbmdlICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBtaWRkbGVSYW5nZTsNCi0gICAgICAgIG1pZGRsZVJhbmdlID0gTlVMTDsNCisgICAgcmVzdWx0U3RyaW5nICs9IChGWF9DSEFSKSgnMCcgKyBiZXN0TWF0Y2gpOw0KKyAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBjb3VudGVycy5HZXRTaXplKCk7IGsrKykgew0KKyAgICAgIHJvd09mZnNldCArPSBjb3VudGVyc1trXTsNCiAgICAgfQ0KLSAgICBmb3IgKGludDMyX3QgWSA9IDA7IFkgPCA2ICYmIHJvd09mZnNldCA8IGVuZDsgWSsrKSB7DQotICAgICAgICBpbnQzMl90IGJlc3RNYXRjaCA9IERlY29kZURpZ2l0KHJvdywgJmNvdW50ZXJzLCByb3dPZmZzZXQsICYoQ0JDX09uZURpbVJlYWRlcjo6TF9QQVRURVJOU1swXVswXSksIDEwLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgICAgIHJlc3VsdFN0cmluZyArPSAoRlhfQ0hBUikgKCcwJyArIGJlc3RNYXRjaCk7DQotICAgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBjb3VudGVycy5HZXRTaXplKCk7IGsrKykgew0KLSAgICAgICAgICAgIHJvd09mZnNldCArPSBjb3VudGVyc1trXTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcm93T2Zmc2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIHJvd09mZnNldDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzUmVhZGVyLmgKaW5kZXggN2MzMWZkNC4uNjI0MGE2OCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNSZWFkZXIuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1JlYWRlci5oCkBAIC05LDE2ICs5LDIyIEBACiBjbGFzcyBDQkNfT25lRGltUmVhZGVyOw0KIGNsYXNzIENCQ19Db21tb25CaXRBcnJheTsNCiBjbGFzcyBDQkNfT25lZEVBTjEzUmVhZGVyOw0KLWNsYXNzIENCQ19PbmVkRUFOMTNSZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURpbVJlYWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEZJUlNUX0RJR0lUX0VOQ09ESU5HU1sxMF07DQotICAgIENCQ19PbmVkRUFOMTNSZWFkZXIoKTsNCi0gICAgdmlydHVhbCB+Q0JDX09uZWRFQU4xM1JlYWRlcigpOw0KLXByaXZhdGU6DQotICAgIHZvaWQgRGV0ZXJtaW5lRmlyc3REaWdpdChDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCAgaW50MzJfdCBsZ1BhdHRlcm5Gb3VuZCwgaW50MzJfdCAmZSk7DQotcHJvdGVjdGVkOg0KLSAgICBpbnQzMl90IERlY29kZU1pZGRsZShDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgQ0ZYX0ludDMyQXJyYXkgKnN0YXJ0UmFuZ2UsIENGWF9CeXRlU3RyaW5nICZyZXN1bHRTdHJpbmcsIGludDMyX3QgJmUpOw0KLSAgICBmcmllbmQgY2xhc3MgQ0JDX09uZWRVUENBUmVhZGVyOw0KK2NsYXNzIENCQ19PbmVkRUFOMTNSZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURpbVJlYWRlciB7DQorIHB1YmxpYzoNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEZJUlNUX0RJR0lUX0VOQ09ESU5HU1sxMF07DQorICBDQkNfT25lZEVBTjEzUmVhZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lZEVBTjEzUmVhZGVyKCk7DQorDQorIHByaXZhdGU6DQorICB2b2lkIERldGVybWluZUZpcnN0RGlnaXQoQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxnUGF0dGVybkZvdW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBpbnQzMl90IERlY29kZU1pZGRsZShDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBzdGFydFJhbmdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgZnJpZW5kIGNsYXNzIENCQ19PbmVkVVBDQVJlYWRlcjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmNwcAppbmRleCA3NzUzZDFlLi5kNGY5MGE1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuY3BwCkBAIC0yOCwyNjcgKzI4LDI4MCBAQAogI2luY2x1ZGUgIkJDX09uZURpbVdyaXRlci5oIg0KICNpbmNsdWRlICJCQ19PbmVkRUFOMTNSZWFkZXIuaCINCiAjaW5jbHVkZSAiQkNfT25lZEVBTjEzV3JpdGVyLmgiDQotQ0JDX09uZWRFQU4xM1dyaXRlcjo6Q0JDX09uZWRFQU4xM1dyaXRlcigpDQotew0KLSAgICBtX2JMZWZ0UGFkZGluZyA9IFRSVUU7DQotICAgIG1fY29kZVdpZHRoID0gMyArDQotICAgICAgICAgICAgICAgICAgKDcgKiA2KSArDQotICAgICAgICAgICAgICAgICAgNSArDQotICAgICAgICAgICAgICAgICAgKDcgKiA2KSArDQotICAgICAgICAgICAgICAgICAgMzsNCitDQkNfT25lZEVBTjEzV3JpdGVyOjpDQkNfT25lZEVBTjEzV3JpdGVyKCkgew0KKyAgbV9iTGVmdFBhZGRpbmcgPSBUUlVFOw0KKyAgbV9jb2RlV2lkdGggPSAzICsgKDcgKiA2KSArIDUgKyAoNyAqIDYpICsgMzsNCiB9DQotQ0JDX09uZWRFQU4xM1dyaXRlcjo6fkNCQ19PbmVkRUFOMTNXcml0ZXIoKQ0KLXsNCi19DQotRlhfQk9PTAlDQkNfT25lZEVBTjEzV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KLSAgICAgICAgaWYgKGNvbnRlbnRzLkdldEF0KGkpID49ICcwJyAmJiBjb250ZW50cy5HZXRBdChpKSA8PSAnOScpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1DRlhfV2lkZVN0cmluZwlDQkNfT25lZEVBTjEzV3JpdGVyOjpGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQotICAgIEZYX1dDSEFSIGNoOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KLSAgICAgICAgaWYoY2ggPiAxNzUpIHsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jykgew0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBmaWx0ZXJjb250ZW50czsNCi19DQotaW50MzJfdCBDQkNfT25lZEVBTjEzV3JpdGVyOjpDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBvZGQgPSAwOw0KLSAgICBpbnQzMl90IGV2ZW4gPSAwOw0KLSAgICBpbnQzMl90IGogPSAxOw0KLSAgICBmb3IoaW50MzJfdCBpID0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgew0KLSAgICAgICAgaWYoaiAlIDIpIHsNCi0gICAgICAgICAgICBvZGQgKz0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBldmVuICs9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGorKzsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGNoZWNrc3VtID0gKG9kZCAqIDMgKyBldmVuKSAlIDEwOw0KLSAgICBjaGVja3N1bSA9ICgxMCAtIGNoZWNrc3VtKSAlIDEwOw0KLSAgICByZXR1cm4gKGNoZWNrc3VtKTsNCi19DQotdWludDhfdCAqQ0JDX09uZWRFQU4xM1dyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgdWludDhfdCAqcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIDAsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIHJldHVybiByZXQ7DQotfQ0KLXVpbnQ4X3QgKkNCQ19PbmVkRUFOMTNXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKGZvcm1hdCAhPSBCQ0ZPUk1BVF9FQU5fMTMpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVFQU5fMTM7DQotICAgIH0NCi0gICAgdWludDhfdCAqcmV0ID0gQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGhpbnRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gcmV0Ow0KLX0NCi11aW50OF90ICpDQkNfT25lZEVBTjEzV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBpbnQzMl90ICZvdXRMZW5ndGgsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoY29udGVudHMuR2V0TGVuZ3RoKCkgIT0gMTMpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoU2hvdWxkMTM7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBtX2lEYXRhTGVudGggPSAxMzsNCi0gICAgaW50MzJfdCBmaXJzdERpZ2l0ID0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoMCwgMSkpOw0KLSAgICBpbnQzMl90IHBhcml0aWVzID0gQ0JDX09uZWRFQU4xM1JlYWRlcjo6RklSU1RfRElHSVRfRU5DT0RJTkdTW2ZpcnN0RGlnaXRdOw0KLSAgICBvdXRMZW5ndGggPSBtX2NvZGVXaWR0aDsNCi0gICAgdWludDhfdCAqcmVzdWx0ID0gRlhfQWxsb2ModWludDhfdCwgbV9jb2RlV2lkdGgpOw0KLSAgICBpbnQzMl90IHBvcyA9IDA7DQotICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpTVEFSVF9FTkRfUEFUVEVSTiwgMywgMSwgZSk7DQotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIEZYX0ZyZWUgKHJlc3VsdCk7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBmb3IgKCBpID0gMTsgaSA8PSA2OyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQotICAgICAgICBpZiAoKHBhcml0aWVzID4+ICg2IC0gaSkgJiAxKSA9PSAxKSB7DQotICAgICAgICAgICAgZGlnaXQgKz0gMTA7DQotICAgICAgICB9DQotICAgICAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6TF9BTkRfR19QQVRURVJOU1tkaWdpdF0sIDQsIDAsIGUpOw0KLSAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgICAgIEZYX0ZyZWUgKHJlc3VsdCk7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOLCA1LCAwLCBlKTsNCi0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGZvciAoaSA9IDc7IGkgPD0gMTI7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBkaWdpdCA9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCi0gICAgICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TW2RpZ2l0XSwgNCwgMSwgZSk7DQotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6U1RBUlRfRU5EX1BBVFRFUk4sIDMsIDEsIGUpOw0KLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHJlc3VsdDsNCi19DQotdm9pZCBDQkNfT25lZEVBTjEzV3JpdGVyOjpTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgQ0ZYX0RJQml0bWFwICpwT3V0Qml0bWFwLCBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwgaW50MzJfdCBiYXJXaWR0aCwgaW50MzJfdCBtdWx0aXBsZSwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChkZXZpY2UgPT0gTlVMTCAmJiBwT3V0Qml0bWFwID09IE5VTEwpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGxlZnRQYWRkaW5nID0gNyAqIG11bHRpcGxlOw0KLSAgICBpbnQzMl90IGxlZnRQb3NpdGlvbiA9IDMgKiBtdWx0aXBsZSArIGxlZnRQYWRkaW5nOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBGWF9VVEY4RW5jb2RlKGNvbnRlbnRzKTsNCi0gICAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOw0KLSAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgaUxlbik7DQotICAgIGlmICghcENoYXJQb3MpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWFNZU19tZW1zZXQocENoYXJQb3MsIDAsIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBpTGVuKTsNCi0gICAgQ0ZYX0Z4Z2VEZXZpY2UgZ2VCaXRtYXA7DQotICAgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCi0gICAgICAgIGdlQml0bWFwLkF0dGFjaChwT3V0Qml0bWFwKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlGb250U2l6ZSA9IChpbnQzMl90KWZhYnMobV9mRm9udFNpemUpOw0KLSAgICBpbnQzMl90IGlUZXh0SGVpZ2h0ID0gaUZvbnRTaXplICsgMTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgdGVtcFN0ciA9IHN0ci5NaWQoMSwgNik7DQotICAgIGludDMyX3Qgc3RyV2lkdGggPSBtdWx0aXBsZSAqIDQyOw0KLSAgICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQotICAgICAgICBDRlhfTWF0cml4IG1hdHIobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsNCi0gICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdCgoRlhfRkxPQVQpbGVmdFBvc2l0aW9uLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLCAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIHN0cldpZHRoIC0gMC41KSwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCi0gICAgICAgIG1hdHIuQ29uY2F0KCptYXRyaXgpOw0KLSAgICAgICAgbWF0ci5UcmFuc2Zvcm1SZWN0KHJlY3QpOw0KLSAgICAgICAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0dGVyUmVjdCgpOw0KLSAgICAgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCi0gICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdDEoKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA0NyAqIG11bHRpcGxlKSwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA0NyAqIG11bHRpcGxlICsgc3RyV2lkdGggLSAwLjUpLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KLSAgICAgICAgQ0ZYX01hdHJpeCBtYXRyMShtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOw0KLSAgICAgICAgbWF0cjEuQ29uY2F0KCptYXRyaXgpOw0KLSAgICAgICAgbWF0cjEuVHJhbnNmb3JtUmVjdChyZWN0MSk7DQotICAgICAgICByZSA9IHJlY3QxLkdldE91dHRlclJlY3QoKTsNCi0gICAgICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQotICAgICAgICBpbnQzMl90IHN0cldpZHRoMSA9IG11bHRpcGxlICogNzsNCi0gICAgICAgIENGWF9NYXRyaXggbWF0cjIobV9vdXRwdXRIU2NhbGUsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYpOw0KLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0MigwLjBmLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLCAoRlhfRkxPQVQpc3RyV2lkdGgxIC0gMC41ZiwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCi0gICAgICAgIG1hdHIyLkNvbmNhdCgqbWF0cml4KTsNCi0gICAgICAgIG1hdHIyLlRyYW5zZm9ybVJlY3QocmVjdDIpOw0KLSAgICAgICAgcmUgPSByZWN0Mi5HZXRPdXR0ZXJSZWN0KCk7DQotICAgICAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGJsYW5rID0gMC4wOw0KLSAgICBGWF9GTE9BVCBjaGFyc1dpZHRoID0gMDsNCi0gICAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCi0gICAgICAgIHN0cldpZHRoID0gKGludDMyX3QpKHN0cldpZHRoICogbV9vdXRwdXRIU2NhbGUpOw0KLSAgICB9DQotICAgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcyArIDEsIG1fcEZvbnQsIChGWF9GTE9BVClzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQotICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeCgxLjAsIDAuMCwgMC4wLCAtMS4wLCAwLjAsIChGWF9GTE9BVClpRm9udFNpemUpOw0KLSAgICBDRlhfRnhnZURldmljZSBnZTsNCi0gICAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KLSAgICAgICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQotICAgICAgICBGWF9SRUNUIHJlY3QoMCwgMCwgc3RyV2lkdGgsIGlUZXh0SGVpZ2h0KTsNCi0gICAgICAgIGdlLkZpbGxSZWN0KCZyZWN0LCBtX2JhY2tncm91bmRDb2xvcik7DQotICAgICAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MgKyAxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgbGVmdFBvc2l0aW9uLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCitDQkNfT25lZEVBTjEzV3JpdGVyOjp+Q0JDX09uZWRFQU4xM1dyaXRlcigpIHt9DQorRlhfQk9PTCBDQkNfT25lZEVBTjEzV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBpZiAoY29udGVudHMuR2V0QXQoaSkgPj0gJzAnICYmIGNvbnRlbnRzLkdldEF0KGkpIDw9ICc5Jykgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBhZmZpbmVfbWF0cml4MSgxLjAsIDAuMCwgMC4wLCAtMS4wLCAoRlhfRkxPQVQpbGVmdFBvc2l0aW9uICogbV9vdXRwdXRIU2NhbGUsIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCkgKyBpRm9udFNpemUpOw0KLSAgICAgICAgaWYgKG1hdHJpeCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcyArIDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplICwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgJmFmZmluZV9tYXRyaXgxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIHRlbXBTdHIgPSBzdHIuTWlkKDcsIDYpOw0KLSAgICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsNCi0gICAgY2hhcnNXaWR0aCA9IDAuMGY7DQotICAgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcyArIDcsIG1fcEZvbnQsIChGWF9GTE9BVClzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQotICAgIGlmKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KLSAgICAgICAgRlhfUkVDVCByZWN0MSgwLCAwLCBzdHJXaWR0aCwgaVRleHRIZWlnaHQpOw0KLSAgICAgICAgZ2UuRmlsbFJlY3QoJnJlY3QxLCBtX2JhY2tncm91bmRDb2xvcik7DQotICAgICAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MgKyA3LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgbGVmdFBvc2l0aW9uICsgNDcgKiBtdWx0aXBsZSwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgNDcgKiBtdWx0aXBsZSkgKiBtX291dHB1dEhTY2FsZSwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQotICAgICAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQotICAgICAgICB9DQotICAgICAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zICsgNywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUgLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgfQ0KLSAgICB0ZW1wU3RyID0gc3RyLk1pZCgwLCAxKTsNCi0gICAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQotICAgIHN0cldpZHRoID0gbXVsdGlwbGUgKiA3Ow0KLSAgICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQotICAgICAgICBzdHJXaWR0aCA9IChpbnQzMl90KShzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlKTsNCi0gICAgfQ0KLSAgICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MsIG1fcEZvbnQsIChGWF9GTE9BVClzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQotICAgIGlmKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIGdlLkdldEJpdG1hcCgpOw0KLSAgICAgICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQotICAgICAgICBnZS5HZXRCaXRtYXAoKS0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOw0KLSAgICAgICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgMCwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQotICAgICAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQotICAgICAgICB9DQotICAgICAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4MSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KLSAgICB9DQotICAgIEZYX0ZyZWUocENoYXJQb3MpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ0JDX09uZWRFQU4xM1dyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIHVpbnQ4X3QqIGNvZGUsIGludDMyX3QgY29kZUxlbmd0aCwgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChjb250ZW50cywgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOw0KK0NGWF9XaWRlU3RyaW5nIENCQ19PbmVkRUFOMTNXcml0ZXI6OkZpbHRlckNvbnRlbnRzKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50czsNCisgIEZYX1dDSEFSIGNoOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KKyAgICBpZiAoY2ggPiAxNzUpIHsNCisgICAgICBpKys7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOw0KK30NCitpbnQzMl90IENCQ19PbmVkRUFOMTNXcml0ZXI6OkNhbGNDaGVja3N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMpIHsNCisgIGludDMyX3Qgb2RkID0gMDsNCisgIGludDMyX3QgZXZlbiA9IDA7DQorICBpbnQzMl90IGogPSAxOw0KKyAgZm9yIChpbnQzMl90IGkgPSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorICAgIGlmIChqICUgMikgew0KKyAgICAgIG9kZCArPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZXZlbiArPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIH0NCisgICAgaisrOw0KKyAgfQ0KKyAgaW50MzJfdCBjaGVja3N1bSA9IChvZGQgKiAzICsgZXZlbikgJSAxMDsNCisgIGNoZWNrc3VtID0gKDEwIC0gY2hlY2tzdW0pICUgMTA7DQorICByZXR1cm4gKGNoZWNrc3VtKTsNCit9DQordWludDhfdCogQ0JDX09uZWRFQU4xM1dyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICB1aW50OF90KiByZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcmV0Ow0KK30NCit1aW50OF90KiBDQkNfT25lZEVBTjEzV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChmb3JtYXQgIT0gQkNGT1JNQVRfRUFOXzEzKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVFQU5fMTM7DQorICB9DQorICB1aW50OF90KiByZXQgPQ0KKyAgICAgIENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcmV0Ow0KK30NCit1aW50OF90KiBDQkNfT25lZEVBTjEzV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjb250ZW50cy5HZXRMZW5ndGgoKSAhPSAxMykgew0KKyAgICBlID0gQkNFeGNlcHRpb25EaWdpdExlbmd0aFNob3VsZDEzOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIG1faURhdGFMZW50aCA9IDEzOw0KKyAgaW50MzJfdCBmaXJzdERpZ2l0ID0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoMCwgMSkpOw0KKyAgaW50MzJfdCBwYXJpdGllcyA9IENCQ19PbmVkRUFOMTNSZWFkZXI6OkZJUlNUX0RJR0lUX0VOQ09ESU5HU1tmaXJzdERpZ2l0XTsNCisgIG91dExlbmd0aCA9IG1fY29kZVdpZHRoOw0KKyAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2ModWludDhfdCwgbV9jb2RlV2lkdGgpOw0KKyAgaW50MzJfdCBwb3MgPSAwOw0KKyAgcG9zICs9DQorICAgICAgQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6U1RBUlRfRU5EX1BBVFRFUk4sIDMsIDEsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDE7IGkgPD0gNjsgaSsrKSB7DQorICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIGlmICgocGFyaXRpZXMgPj4gKDYgLSBpKSAmIDEpID09IDEpIHsNCisgICAgICBkaWdpdCArPSAxMDsNCisgICAgfQ0KKyAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6TF9BTkRfR19QQVRURVJOU1tkaWdpdF0sDQorICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDAsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgRlhfRnJlZShyZXN1bHQpOw0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICB9DQorICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk4sIDUsIDAsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgZm9yIChpID0gNzsgaSA8PSAxMjsgaSsrKSB7DQorICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TW2RpZ2l0XSwgNCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgIH0NCisgIHBvcyArPQ0KKyAgICAgIEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIENCQ19PbmVEaW1SZWFkZXI6OlNUQVJUX0VORF9QQVRURVJOLCAzLCAxLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgRlhfRnJlZShyZXN1bHQpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK3ZvaWQgQ0JDX09uZWRFQU4xM1dyaXRlcjo6U2hvd0NoYXJzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3V0Qml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChkZXZpY2UgPT0gTlVMTCAmJiBwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGxlZnRQYWRkaW5nID0gNyAqIG11bHRpcGxlOw0KKyAgaW50MzJfdCBsZWZ0UG9zaXRpb24gPSAzICogbXVsdGlwbGUgKyBsZWZ0UGFkZGluZzsNCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IEZYX1VURjhFbmNvZGUoY29udGVudHMpOw0KKyAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOw0KKyAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW4pOw0KKyAgaWYgKCFwQ2hhclBvcykgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWFNZU19tZW1zZXQocENoYXJQb3MsIDAsIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBpTGVuKTsNCisgIENGWF9GeGdlRGV2aWNlIGdlQml0bWFwOw0KKyAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICBnZUJpdG1hcC5BdHRhY2gocE91dEJpdG1hcCk7DQorICB9DQorICBpbnQzMl90IGlGb250U2l6ZSA9IChpbnQzMl90KWZhYnMobV9mRm9udFNpemUpOw0KKyAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7DQorICBDRlhfQnl0ZVN0cmluZyB0ZW1wU3RyID0gc3RyLk1pZCgxLCA2KTsNCisgIGludDMyX3Qgc3RyV2lkdGggPSBtdWx0aXBsZSAqIDQyOw0KKyAgaWYgKHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KKyAgICBDRlhfTWF0cml4IG1hdHIobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsNCisgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0KA0KKyAgICAgICAgKEZYX0ZMT0FUKWxlZnRQb3NpdGlvbiwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwNCisgICAgICAgIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgc3RyV2lkdGggLSAwLjUpLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgICBtYXRyLkNvbmNhdCgqbWF0cml4KTsNCisgICAgbWF0ci5UcmFuc2Zvcm1SZWN0KHJlY3QpOw0KKyAgICBGWF9SRUNUIHJlID0gcmVjdC5HZXRPdXR0ZXJSZWN0KCk7DQorICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQorICAgIENGWF9GbG9hdFJlY3QgcmVjdDEoDQorICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDQ3ICogbXVsdGlwbGUpLA0KKyAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwNCisgICAgICAgIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgNDcgKiBtdWx0aXBsZSArIHN0cldpZHRoIC0gMC41KSwNCisgICAgICAgIChGWF9GTE9BVCltX0hlaWdodCk7DQorICAgIENGWF9NYXRyaXggbWF0cjEobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsNCisgICAgbWF0cjEuQ29uY2F0KCptYXRyaXgpOw0KKyAgICBtYXRyMS5UcmFuc2Zvcm1SZWN0KHJlY3QxKTsNCisgICAgcmUgPSByZWN0MS5HZXRPdXR0ZXJSZWN0KCk7DQorICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQorICAgIGludDMyX3Qgc3RyV2lkdGgxID0gbXVsdGlwbGUgKiA3Ow0KKyAgICBDRlhfTWF0cml4IG1hdHIyKG1fb3V0cHV0SFNjYWxlLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmKTsNCisgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0MigwLjBmLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClzdHJXaWR0aDEgLSAwLjVmLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgICBtYXRyMi5Db25jYXQoKm1hdHJpeCk7DQorICAgIG1hdHIyLlRyYW5zZm9ybVJlY3QocmVjdDIpOw0KKyAgICByZSA9IHJlY3QyLkdldE91dHRlclJlY3QoKTsNCisgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgIH0NCisgIEZYX0ZMT0FUIGJsYW5rID0gMC4wOw0KKyAgRlhfRkxPQVQgY2hhcnNXaWR0aCA9IDA7DQorICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsNCisgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgc3RyV2lkdGggPSAoaW50MzJfdCkoc3RyV2lkdGggKiBtX291dHB1dEhTY2FsZSk7DQorICB9DQorICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyAxLCBtX3BGb250LCAoRlhfRkxPQVQpc3RyV2lkdGgsIGlGb250U2l6ZSwNCisgICAgICAgICAgICAgICBibGFuayk7DQorICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgoMS4wLCAwLjAsIDAuMCwgLTEuMCwgMC4wLCAoRlhfRkxPQVQpaUZvbnRTaXplKTsNCisgIENGWF9GeGdlRGV2aWNlIGdlOw0KKyAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICBnZS5DcmVhdGUoc3RyV2lkdGgsIGlUZXh0SGVpZ2h0LCBGWERJQl9BcmdiKTsNCisgICAgRlhfUkVDVCByZWN0KDAsIDAsIHN0cldpZHRoLCBpVGV4dEhlaWdodCk7DQorICAgIGdlLkZpbGxSZWN0KCZyZWN0LCBtX2JhY2tncm91bmRDb2xvcik7DQorICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zICsgMSwgbV9wRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksIChGWF9GTE9BVClpRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4KikmYWZmaW5lX21hdHJpeCwgbV9mb250Q29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIGxlZnRQb3NpdGlvbiwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKA0KKyAgICAgICAgMS4wLCAwLjAsIDAuMCwgLTEuMCwgKEZYX0ZMT0FUKWxlZnRQb3NpdGlvbiAqIG1fb3V0cHV0SFNjYWxlLA0KKyAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSArIGlGb250U2l6ZSk7DQorICAgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgfQ0KKyAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KA0KKyAgICAgICAgaUxlbiwgcENoYXJQb3MgKyAxLCBtX3BGb250LCBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsIChDRlhfQWZmaW5lTWF0cml4KikmYWZmaW5lX21hdHJpeDEsIG1fZm9udENvbG9yLA0KKyAgICAgICAgRlhURVhUX0NMRUFSVFlQRSk7DQorICB9DQorICB0ZW1wU3RyID0gc3RyLk1pZCg3LCA2KTsNCisgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KKyAgY2hhcnNXaWR0aCA9IDAuMGY7DQorICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyA3LCBtX3BGb250LCAoRlhfRkxPQVQpc3RyV2lkdGgsIGlGb250U2l6ZSwNCisgICAgICAgICAgICAgICBibGFuayk7DQorICBpZiAocE91dEJpdG1hcCAhPSBOVUxMKSB7DQorICAgIEZYX1JFQ1QgcmVjdDEoMCwgMCwgc3RyV2lkdGgsIGlUZXh0SGVpZ2h0KTsNCisgICAgZ2UuRmlsbFJlY3QoJnJlY3QxLCBtX2JhY2tncm91bmRDb2xvcik7DQorICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zICsgNywgbV9wRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksIChGWF9GTE9BVClpRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4KikmYWZmaW5lX21hdHJpeCwgbV9mb250Q29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIGxlZnRQb3NpdGlvbiArIDQ3ICogbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICAgICAgICBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeDEoDQorICAgICAgICAxLjAsIDAuMCwgMC4wLCAtMS4wLA0KKyAgICAgICAgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA0NyAqIG11bHRpcGxlKSAqIG1fb3V0cHV0SFNjYWxlLA0KKyAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQorICAgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgfQ0KKyAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KA0KKyAgICAgICAgaUxlbiwgcENoYXJQb3MgKyA3LCBtX3BGb250LCBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsIChDRlhfQWZmaW5lTWF0cml4KikmYWZmaW5lX21hdHJpeDEsIG1fZm9udENvbG9yLA0KKyAgICAgICAgRlhURVhUX0NMRUFSVFlQRSk7DQorICB9DQorICB0ZW1wU3RyID0gc3RyLk1pZCgwLCAxKTsNCisgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KKyAgc3RyV2lkdGggPSBtdWx0aXBsZSAqIDc7DQorICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQorICAgIHN0cldpZHRoID0gKGludDMyX3QpKHN0cldpZHRoICogbV9vdXRwdXRIU2NhbGUpOw0KKyAgfQ0KKyAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zLCBtX3BGb250LCAoRlhfRkxPQVQpc3RyV2lkdGgsIGlGb250U2l6ZSwNCisgICAgICAgICAgICAgICBibGFuayk7DQorICBpZiAocE91dEJpdG1hcCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsNCisgICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgIGdlLkdldEJpdG1hcCgpLT5DbGVhcihtX2JhY2tncm91bmRDb2xvcik7DQorICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zLCBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwgKEZYX0ZMT0FUKWlGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXgqKSZhZmZpbmVfbWF0cml4LCBtX2ZvbnRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NMRUFSVFlQRSk7DQorICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgMCwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKA0KKyAgICAgICAgMS4wLCAwLjAsIDAuMCwgLTEuMCwgMC4wLA0KKyAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQorICAgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgfQ0KKyAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KA0KKyAgICAgICAgaUxlbiwgcENoYXJQb3MsIG1fcEZvbnQsIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSwgKENGWF9BZmZpbmVNYXRyaXgqKSZhZmZpbmVfbWF0cml4MSwgbV9mb250Q29sb3IsDQorICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgIH0NCisgIEZYX0ZyZWUocENoYXJQb3MpOw0KK30NCit2b2lkIENCQ19PbmVkRUFOMTNXcml0ZXI6OlJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnRlbnRzLCBjb2RlLCBjb2RlTGVuZ3RoLCBpc0RldmljZSwgZSk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5oCmluZGV4IDM1N2RiNzUuLjExMDg2MmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaApAQCAtOCwyNCArOCw0NCBAQAogI2RlZmluZSBfQkNfT05FREVBTjEzV1JJVEVSX0hfDQogY2xhc3MgQ0JDX09uZURpbVdyaXRlcjsNCiBjbGFzcyBDQkNfT25lZEVBTjEzV3JpdGVyOw0KLWNsYXNzIENCQ19PbmVkRUFOMTNXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlcg0KLXsNCi1wcml2YXRlOg0KLSAgICBpbnQzMl90IG1fY29kZVdpZHRoOw0KLXB1YmxpYzoNCi0gICAgQ0JDX09uZWRFQU4xM1dyaXRlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfT25lZEVBTjEzV3JpdGVyKCk7DQorY2xhc3MgQ0JDX09uZWRFQU4xM1dyaXRlciA6IHB1YmxpYyBDQkNfT25lRGltV3JpdGVyIHsNCisgcHJpdmF0ZToNCisgIGludDMyX3QgbV9jb2RlV2lkdGg7DQogDQotICAgIHVpbnQ4X3QqCUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwNCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgJmUpOw0KLSAgICB1aW50OF90KglFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsDQotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKTsNCi0gICAgdWludDhfdCoJRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgaW50MzJfdCAmb3V0TGVuZ3RoLCBpbnQzMl90ICZlKTsNCi0gICAgdm9pZAkJUmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIHVpbnQ4X3QqIGNvZGUsIGludDMyX3QgY29kZUxlbmd0aCwgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wJCQlDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQotICAgIGludDMyX3QJCUNhbGNDaGVja3N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAkJU2hvd0NoYXJzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIENGWF9ESUJpdG1hcCAqcE91dEJpdG1hcCwgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsIGludDMyX3QgYmFyV2lkdGgsIGludDMyX3QgbXVsdGlwbGUsIGludDMyX3QgJmUpOw0KKyBwdWJsaWM6DQorICBDQkNfT25lZEVBTjEzV3JpdGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lZEVBTjEzV3JpdGVyKCk7DQorDQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdm9pZCBSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBpbnQzMl90IENhbGNDaGVja3N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIFNob3dDaGFycyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3V0Qml0bWFwLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFJlYWRlci5jcHAKaW5kZXggNGI1ZGU3Mi4uZDg2MGJiZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFJlYWRlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFJlYWRlci5jcHAKQEAgLTI2LDU2ICsyNiw1OSBAQAogI2luY2x1ZGUgIkJDX09uZURSZWFkZXIuaCINCiAjaW5jbHVkZSAiQkNfT25lRGltUmVhZGVyLmgiDQogI2luY2x1ZGUgIkJDX09uZWRFQU44UmVhZGVyLmgiDQotQ0JDX09uZWRFQU44UmVhZGVyOjpDQkNfT25lZEVBTjhSZWFkZXIoKQ0KLXsNCi19DQotQ0JDX09uZWRFQU44UmVhZGVyOjp+Q0JDX09uZWRFQU44UmVhZGVyKCkNCi17DQotfQ0KLWludDMyX3QgQ0JDX09uZWRFQU44UmVhZGVyOjpEZWNvZGVNaWRkbGUoQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpzdGFydFJhbmdlLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0UmVzdWx0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQotICAgIGNvdW50ZXJzLkFkZCgwKTsNCi0gICAgY291bnRlcnMuQWRkKDApOw0KLSAgICBjb3VudGVycy5BZGQoMCk7DQotICAgIGNvdW50ZXJzLkFkZCgwKTsNCi0gICAgaW50MzJfdCBlbmQgPSByb3ctPkdldFNpemUoKTsNCi0gICAgaW50MzJfdCByb3dPZmZzZXQgPSAoKnN0YXJ0UmFuZ2UpWzFdOw0KLSAgICBpbnQzMl90IHJvd09mZnNldExlZnQgPSByb3dPZmZzZXQ7DQotICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IDQgJiYgcm93T2Zmc2V0IDwgZW5kOyB4KyspIHsNCi0gICAgICAgIGludDMyX3QgYmVzdE1hdGNoID0gRGVjb2RlRGlnaXQocm93LCAmY291bnRlcnMsIHJvd09mZnNldCwgJihDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TWzBdWzBdKSwgMTAsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KLSAgICAgICAgcmVzdWx0UmVzdWx0ICs9IChGWF9DSEFSKSAoJzAnICsgYmVzdE1hdGNoKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgcm93T2Zmc2V0ICs9IGNvdW50ZXJzW2ldOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGludDMyX3QgUm93T2Zmc2V0TGVuID0gKHJvd09mZnNldCAtIHJvd09mZnNldExlZnQpIC8gNDsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgcmVzdWx0Ow0KLSAgICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzBdKTsNCi0gICAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlsxXSk7DQotICAgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bMl0pOw0KLSAgICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzNdKTsNCi0gICAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTls0XSk7DQotICAgIENGWF9JbnQzMkFycmF5ICptaWRkbGVSYW5nZSA9IEZpbmRHdWFyZFBhdHRlcm4ocm93LCByb3dPZmZzZXQsIFRSVUUsICZyZXN1bHQsIGUpOw0KK0NCQ19PbmVkRUFOOFJlYWRlcjo6Q0JDX09uZWRFQU44UmVhZGVyKCkge30NCitDQkNfT25lZEVBTjhSZWFkZXI6On5DQkNfT25lZEVBTjhSZWFkZXIoKSB7fQ0KK2ludDMyX3QgQ0JDX09uZWRFQU44UmVhZGVyOjpEZWNvZGVNaWRkbGUoQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogc3RhcnRSYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHRSZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfSW50MzJBcnJheSBjb3VudGVyczsNCisgIGNvdW50ZXJzLkFkZCgwKTsNCisgIGNvdW50ZXJzLkFkZCgwKTsNCisgIGNvdW50ZXJzLkFkZCgwKTsNCisgIGNvdW50ZXJzLkFkZCgwKTsNCisgIGludDMyX3QgZW5kID0gcm93LT5HZXRTaXplKCk7DQorICBpbnQzMl90IHJvd09mZnNldCA9ICgqc3RhcnRSYW5nZSlbMV07DQorICBpbnQzMl90IHJvd09mZnNldExlZnQgPSByb3dPZmZzZXQ7DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCA0ICYmIHJvd09mZnNldCA8IGVuZDsgeCsrKSB7DQorICAgIGludDMyX3QgYmVzdE1hdGNoID0NCisgICAgICAgIERlY29kZURpZ2l0KHJvdywgJmNvdW50ZXJzLCByb3dPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAmKENCQ19PbmVEaW1SZWFkZXI6OkxfUEFUVEVSTlNbMF1bMF0pLCAxMCwgZSk7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgaW50MzJfdCByb3dPZmZzZXRNaWQgPSByb3dPZmZzZXQ7DQotICAgIHJvd09mZnNldCA9ICgqbWlkZGxlUmFuZ2UpWzFdOw0KLSAgICBpZigocm93T2Zmc2V0IC0gcm93T2Zmc2V0TWlkKSA+IFJvd09mZnNldExlbikgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgIHJlc3VsdFJlc3VsdCArPSAoRlhfQ0hBUikoJzAnICsgYmVzdE1hdGNoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnRlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICByb3dPZmZzZXQgKz0gY291bnRlcnNbaV07DQogICAgIH0NCi0gICAgaWYobWlkZGxlUmFuZ2UgIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIG1pZGRsZVJhbmdlOw0KLSAgICAgICAgbWlkZGxlUmFuZ2UgPSBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBSb3dPZmZzZXRMZW4gPSAocm93T2Zmc2V0IC0gcm93T2Zmc2V0TGVmdCkgLyA0Ow0KKyAgQ0ZYX0ludDMyQXJyYXkgcmVzdWx0Ow0KKyAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlswXSk7DQorICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzFdKTsNCisgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bMl0pOw0KKyAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlszXSk7DQorICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzRdKTsNCisgIENGWF9JbnQzMkFycmF5KiBtaWRkbGVSYW5nZSA9DQorICAgICAgRmluZEd1YXJkUGF0dGVybihyb3csIHJvd09mZnNldCwgVFJVRSwgJnJlc3VsdCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICBpbnQzMl90IHJvd09mZnNldE1pZCA9IHJvd09mZnNldDsNCisgIHJvd09mZnNldCA9ICgqbWlkZGxlUmFuZ2UpWzFdOw0KKyAgaWYgKChyb3dPZmZzZXQgLSByb3dPZmZzZXRNaWQpID4gUm93T2Zmc2V0TGVuKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICB9DQorICBpZiAobWlkZGxlUmFuZ2UgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbWlkZGxlUmFuZ2U7DQorICAgIG1pZGRsZVJhbmdlID0gTlVMTDsNCisgIH0NCisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IDQgJiYgcm93T2Zmc2V0IDwgZW5kOyB5KyspIHsNCisgICAgaW50MzJfdCBiZXN0TWF0Y2ggPQ0KKyAgICAgICAgRGVjb2RlRGlnaXQocm93LCAmY291bnRlcnMsIHJvd09mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICYoQ0JDX09uZURpbVJlYWRlcjo6TF9QQVRURVJOU1swXVswXSksIDEwLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICByZXN1bHRSZXN1bHQgKz0gKEZYX0NIQVIpKCcwJyArIGJlc3RNYXRjaCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgcm93T2Zmc2V0ICs9IGNvdW50ZXJzW2ldOw0KICAgICB9DQotICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IDQgJiYgcm93T2Zmc2V0IDwgZW5kOyB5KyspIHsNCi0gICAgICAgIGludDMyX3QgYmVzdE1hdGNoID0gRGVjb2RlRGlnaXQocm93LCAmIGNvdW50ZXJzLCByb3dPZmZzZXQsICYoQ0JDX09uZURpbVJlYWRlcjo6TF9QQVRURVJOU1swXVswXSksIDEwLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgICAgIHJlc3VsdFJlc3VsdCArPSAoRlhfQ0hBUikgKCcwJyArIGJlc3RNYXRjaCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudGVycy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIHJvd09mZnNldCArPSBjb3VudGVyc1tpXTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcm93T2Zmc2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIHJvd09mZnNldDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFJlYWRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFJlYWRlci5oCmluZGV4IGYyYWE5M2MuLjY2ZDYxMDkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhSZWFkZXIuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44UmVhZGVyLmgKQEAgLTksMTIgKzksMTUgQEAKIGNsYXNzIENCQ19PbmVEaW1SZWFkZXI7DQogY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KIGNsYXNzIENCQ19PbmVkRUFOOFJlYWRlcjsNCi1jbGFzcyBDQkNfT25lZEVBTjhSZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURpbVJlYWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19PbmVkRUFOOFJlYWRlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfT25lZEVBTjhSZWFkZXIoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIGludDMyX3QgRGVjb2RlTWlkZGxlKENCQ19Db21tb25CaXRBcnJheSosIENGWF9JbnQzMkFycmF5ICpzdGFydFJhbmdlLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90ICZlKTsNCitjbGFzcyBDQkNfT25lZEVBTjhSZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURpbVJlYWRlciB7DQorIHB1YmxpYzoNCisgIENCQ19PbmVkRUFOOFJlYWRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX09uZWRFQU44UmVhZGVyKCk7DQorDQorIHByb3RlY3RlZDoNCisgIGludDMyX3QgRGVjb2RlTWlkZGxlKENCQ19Db21tb25CaXRBcnJheSosDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogc3RhcnRSYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5jcHAKaW5kZXggYTI0N2EwNi4uMGM1NTFjYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5jcHAKQEAgLTI4LDIzNCArMjgsMjQ2IEBACiAjaW5jbHVkZSAiQkNfT25lRGltV3JpdGVyLmgiDQogI2luY2x1ZGUgIkJDX09uZURpbVJlYWRlci5oIg0KICNpbmNsdWRlICJCQ19PbmVkRUFOOFdyaXRlci5oIg0KLUNCQ19PbmVkRUFOOFdyaXRlcjo6Q0JDX09uZWRFQU44V3JpdGVyKCkNCi17DQotICAgIG1faURhdGFMZW50aCA9IDg7DQotICAgIG1fY29kZVdpZHRoID0gMyArDQotICAgICAgICAgICAgICAgICAgKDcgKiA0KSArDQotICAgICAgICAgICAgICAgICAgNSArDQotICAgICAgICAgICAgICAgICAgKDcgKiA0KSArDQotICAgICAgICAgICAgICAgICAgMzsNCitDQkNfT25lZEVBTjhXcml0ZXI6OkNCQ19PbmVkRUFOOFdyaXRlcigpIHsNCisgIG1faURhdGFMZW50aCA9IDg7DQorICBtX2NvZGVXaWR0aCA9IDMgKyAoNyAqIDQpICsgNSArICg3ICogNCkgKyAzOw0KIH0NCi1DQkNfT25lZEVBTjhXcml0ZXI6On5DQkNfT25lZEVBTjhXcml0ZXIoKQ0KLXsNCitDQkNfT25lZEVBTjhXcml0ZXI6On5DQkNfT25lZEVBTjhXcml0ZXIoKSB7fQ0KK3ZvaWQgQ0JDX09uZWRFQU44V3JpdGVyOjpTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKSB7DQorICBtX2lEYXRhTGVudGggPSA4Ow0KIH0NCi12b2lkIENCQ19PbmVkRUFOOFdyaXRlcjo6U2V0RGF0YUxlbmd0aChpbnQzMl90IGxlbmd0aCkNCi17DQotICAgIG1faURhdGFMZW50aCA9IDg7DQotfQ0KLUZYX0JPT0wgQ0JDX09uZWRFQU44V3JpdGVyOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pDQotew0KLSAgICBpZiAoIGxvY2F0aW9uID09IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQpIHsNCi0gICAgICAgIG1fbG9jVGV4dExvYyA9IGxvY2F0aW9uOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MCUNCQ19PbmVkRUFOOFdyaXRlcjo6Q2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykNCi17DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCi0gICAgICAgIGlmIChjb250ZW50cy5HZXRBdChpKSA+PSAnMCcgJiYgY29udGVudHMuR2V0QXQoaSkgPD0gJzknKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KK0ZYX0JPT0wgQ0JDX09uZWRFQU44V3JpdGVyOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pIHsNCisgIGlmIChsb2NhdGlvbiA9PSBCQ19URVhUX0xPQ19CRUxPV0VNQkVEKSB7DQorICAgIG1fbG9jVGV4dExvYyA9IGxvY2F0aW9uOw0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotQ0ZYX1dpZGVTdHJpbmcJQ0JDX09uZWRFQU44V3JpdGVyOjpGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQotICAgIEZYX1dDSEFSIGNoOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KLSAgICAgICAgaWYoY2ggPiAxNzUpIHsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jykgew0KLSAgICAgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBmaWx0ZXJjb250ZW50czsNCi19DQotaW50MzJfdCBDQkNfT25lZEVBTjhXcml0ZXI6OkNhbGNDaGVja3N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMpDQotew0KLSAgICBpbnQzMl90IG9kZCA9IDA7DQotICAgIGludDMyX3QgZXZlbiA9IDA7DQotICAgIGludDMyX3QgaiA9IDE7DQotICAgIGZvcihpbnQzMl90IGkgPSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQotICAgICAgICBpZihqICUgMikgew0KLSAgICAgICAgICAgIG9kZCArPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGV2ZW4gKz0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaisrOw0KLSAgICB9DQotICAgIGludDMyX3QgY2hlY2tzdW0gPSAob2RkICogMyArIGV2ZW4pICUgMTA7DQotICAgIGNoZWNrc3VtID0gKDEwIC0gY2hlY2tzdW0pICUgMTA7DQotICAgIHJldHVybiAoY2hlY2tzdW0pOw0KLX0NCi11aW50OF90ICpDQkNfT25lZEVBTjhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCAsIGludDMyX3QgJmUpDQotew0KLSAgICB1aW50OF90ICpyZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgcmV0dXJuIHJldDsNCi19DQotdWludDhfdCAqQ0JDX09uZWRFQU44V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCBoaW50cyAsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoZm9ybWF0ICE9IEJDRk9STUFUX0VBTl84KSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlRUFOXzg7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICB1aW50OF90ICpyZXQgPSBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgaGludHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIHJldHVybiByZXQ7DQotfQ0KLXVpbnQ4X3QgKkNCQ19PbmVkRUFOOFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgaW50MzJfdCAmb3V0TGVuZ3RoICwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChjb250ZW50cy5HZXRMZW5ndGgoKSAhPSA4KSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25EaWdpdExlbmd0aE11c3RCZTg7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBvdXRMZW5ndGggPSBtX2NvZGVXaWR0aDsNCi0gICAgdWludDhfdCAqcmVzdWx0ID0gRlhfQWxsb2ModWludDhfdCwgbV9jb2RlV2lkdGgpOw0KLSAgICBpbnQzMl90IHBvcyA9IDA7DQotICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpTVEFSVF9FTkRfUEFUVEVSTiwgMywgMSwgZSk7DQotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIEZYX0ZyZWUgKHJlc3VsdCk7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBkaWdpdCA9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCi0gICAgICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TW2RpZ2l0XSwgNCwgMCwgZSk7DQotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk4sIDUsIDAsIGUpOw0KLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICBGWF9GcmVlIChyZXN1bHQpOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgZm9yIChpID0gNDsgaSA8PSA3OyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQotICAgICAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6TF9QQVRURVJOU1tkaWdpdF0sIDQsIDEsIGUpOw0KLSAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgICAgIEZYX0ZyZWUgKHJlc3VsdCk7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIENCQ19PbmVEaW1SZWFkZXI6OlNUQVJUX0VORF9QQVRURVJOLCAzLCAxLCBlKTsNCi0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgRlhfRnJlZSAocmVzdWx0KTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiByZXN1bHQ7DQotfQ0KLXZvaWQgQ0JDX09uZWRFQU44V3JpdGVyOjpTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgQ0ZYX0RJQml0bWFwICpwT3V0Qml0bWFwLCBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwgaW50MzJfdCBiYXJXaWR0aCwgaW50MzJfdCBtdWx0aXBsZSwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChkZXZpY2UgPT0gTlVMTCAmJiBwT3V0Qml0bWFwID09IE5VTEwpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGxlZnRQb3NpdGlvbiA9IDMgKiBtdWx0aXBsZTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gRlhfVVRGOEVuY29kZShjb250ZW50cyk7DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHN0ci5HZXRMZW5ndGgoKTsNCi0gICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW5ndGgpOw0KLSAgICBpZiAoIXBDaGFyUG9zKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhTWVNfbWVtc2V0KHBDaGFyUG9zLCAwLCBzaXplb2YoRlhURVhUX0NIQVJQT1MpICogaUxlbmd0aCk7DQotICAgIENGWF9CeXRlU3RyaW5nIHRlbXBTdHIgPSBzdHIuTWlkKDAsIDQpOw0KLSAgICBpbnQzMl90IGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IHN0cldpZHRoID0gNyAqIG11bHRpcGxlICogNDsNCi0gICAgRlhfRkxPQVQgYmxhbmsgPSAwLjA7DQotICAgIENGWF9GeGdlRGV2aWNlIGdlQml0bWFwOw0KLSAgICBpZiAocE91dEJpdG1hcCAhPSBOVUxMKSB7DQotICAgICAgICBnZUJpdG1hcC5BdHRhY2gocE91dEJpdG1hcCk7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgY2hhcnNXaWR0aCA9IDA7DQotICAgIGludDMyX3QgaUZvbnRTaXplID0gKGludDMyX3QpZmFicyhtX2ZGb250U2l6ZSk7DQotICAgIGludDMyX3QgaVRleHRIZWlnaHQgPSBpRm9udFNpemUgKyAxOw0KLSAgICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQotICAgICAgICBDRlhfTWF0cml4IG1hdHIobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsNCi0gICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdCgoRlhfRkxPQVQpbGVmdFBvc2l0aW9uLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLCAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIHN0cldpZHRoIC0gMC41KSwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCi0gICAgICAgIG1hdHIuQ29uY2F0KCptYXRyaXgpOw0KLSAgICAgICAgbWF0ci5UcmFuc2Zvcm1SZWN0KHJlY3QpOw0KLSAgICAgICAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0dGVyUmVjdCgpOw0KLSAgICAgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCi0gICAgICAgIENGWF9NYXRyaXggbWF0cjEobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsNCi0gICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdDEoKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyAzMyAqIG11bHRpcGxlKSwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyAzMyAqIG11bHRpcGxlICsgc3RyV2lkdGggLSAwLjUpLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KLSAgICAgICAgbWF0cjEuQ29uY2F0KCptYXRyaXgpOw0KLSAgICAgICAgbWF0cjEuVHJhbnNmb3JtUmVjdChyZWN0MSk7DQotICAgICAgICByZSA9IHJlY3QxLkdldE91dHRlclJlY3QoKTsNCi0gICAgICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQotICAgIH0NCi0gICAgaWYgKHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KLSAgICAgICAgc3RyV2lkdGggPSAoaW50MzJfdCkoc3RyV2lkdGggKiBtX291dHB1dEhTY2FsZSk7DQotICAgIH0NCi0gICAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zLCBtX3BGb250LCAoRlhfRkxPQVQpc3RyV2lkdGgsIGlGb250U2l6ZSwgYmxhbmspOw0KLSAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgoMS4wLCAwLjAsIDAuMCwgLTEuMCwgMC4wLCAoRlhfRkxPQVQpaUZvbnRTaXplKTsNCi0gICAgQ0ZYX0Z4Z2VEZXZpY2UgZ2U7DQotICAgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsNCi0gICAgICAgIGdlLkNyZWF0ZShzdHJXaWR0aCwgaVRleHRIZWlnaHQsIEZYRElCX0FyZ2IpOw0KLSAgICAgICAgZ2UuR2V0Qml0bWFwKCktPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCi0gICAgICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUgLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgJmFmZmluZV9tYXRyaXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7DQotICAgICAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIGxlZnRQb3NpdGlvbiwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQorRlhfQk9PTCBDQkNfT25lZEVBTjhXcml0ZXI6OkNoZWNrQ29udGVudFZhbGlkaXR5KA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIGlmIChjb250ZW50cy5HZXRBdChpKSA+PSAnMCcgJiYgY29udGVudHMuR2V0QXQoaSkgPD0gJzknKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIChGWF9GTE9BVClsZWZ0UG9zaXRpb24gKiBtX291dHB1dEhTY2FsZSwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQotICAgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQotICAgICAgICBGWF9CT09MIHJldCA9IGRldmljZS0+RHJhd05vcm1hbFRleHQoaUxlbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgJmFmZmluZV9tYXRyaXgxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgdGVtcFN0ciA9IHN0ci5NaWQoNCwgNCk7DQotICAgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KLSAgICBjaGFyc1dpZHRoID0gMC4wZjsNCi0gICAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zICsgNCwgbV9wRm9udCwgKEZYX0ZMT0FUKXN0cldpZHRoLCBpRm9udFNpemUsIGJsYW5rKTsNCi0gICAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIGdlLkdldEJpdG1hcCgpOw0KLSAgICAgICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQotICAgICAgICBnZS5HZXRCaXRtYXAoKS0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOw0KLSAgICAgICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zICsgNCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUgLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgJmFmZmluZV9tYXRyaXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7DQotICAgICAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIGxlZnRQb3NpdGlvbiArIDMzICogbXVsdGlwbGUsIG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBhZmZpbmVfbWF0cml4MSgxLjAsIDAuMCwgMC4wLCAtMS4wLCAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDMzICogbXVsdGlwbGUpICogbV9vdXRwdXRIU2NhbGUsIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOw0KLSAgICAgICAgaWYgKG1hdHJpeCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfQk9PTCByZXQgPSBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MgKyA0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgJmFmZmluZV9tYXRyaXgxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgfQ0KLSAgICBGWF9GcmVlKHBDaGFyUG9zKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCi12b2lkIENCQ19PbmVkRUFOOFdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIHVpbnQ4X3QqIGNvZGUsIGludDMyX3QgY29kZUxlbmd0aCwgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChjb250ZW50cywgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOw0KK0NGWF9XaWRlU3RyaW5nIENCQ19PbmVkRUFOOFdyaXRlcjo6RmlsdGVyQ29udGVudHMoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzOw0KKyAgRlhfV0NIQVIgY2g7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgIGlmIChjaCA+IDE3NSkgew0KKyAgICAgIGkrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jykgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZmlsdGVyY29udGVudHM7DQorfQ0KK2ludDMyX3QgQ0JDX09uZWRFQU44V3JpdGVyOjpDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzKSB7DQorICBpbnQzMl90IG9kZCA9IDA7DQorICBpbnQzMl90IGV2ZW4gPSAwOw0KKyAgaW50MzJfdCBqID0gMTsNCisgIGZvciAoaW50MzJfdCBpID0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgew0KKyAgICBpZiAoaiAlIDIpIHsNCisgICAgICBvZGQgKz0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGV2ZW4gKz0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkpOw0KKyAgICB9DQorICAgIGorKzsNCisgIH0NCisgIGludDMyX3QgY2hlY2tzdW0gPSAob2RkICogMyArIGV2ZW4pICUgMTA7DQorICBjaGVja3N1bSA9ICgxMCAtIGNoZWNrc3VtKSAlIDEwOw0KKyAgcmV0dXJuIChjaGVja3N1bSk7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkRUFOOFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIHVpbnQ4X3QqIHJldCA9IEVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiByZXQ7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkRUFOOFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGZvcm1hdCAhPSBCQ0ZPUk1BVF9FQU5fOCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlRUFOXzg7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgdWludDhfdCogcmV0ID0NCisgICAgICBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgaGludHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHJldDsNCit9DQordWludDhfdCogQ0JDX09uZWRFQU44V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY29udGVudHMuR2V0TGVuZ3RoKCkgIT0gOCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25EaWdpdExlbmd0aE11c3RCZTg7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgb3V0TGVuZ3RoID0gbV9jb2RlV2lkdGg7DQorICB1aW50OF90KiByZXN1bHQgPSBGWF9BbGxvYyh1aW50OF90LCBtX2NvZGVXaWR0aCk7DQorICBpbnQzMl90IHBvcyA9IDA7DQorICBwb3MgKz0NCisgICAgICBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpTVEFSVF9FTkRfUEFUVEVSTiwgMywgMSwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIEZYX0ZyZWUocmVzdWx0KTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8PSAzOyBpKyspIHsNCisgICAgaW50MzJfdCBkaWdpdCA9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCisgICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIENCQ19PbmVEaW1SZWFkZXI6OkxfUEFUVEVSTlNbZGlnaXRdLCA0LCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIEZYX0ZyZWUocmVzdWx0KTsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOLCA1LCAwLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgRlhfRnJlZShyZXN1bHQpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGZvciAoaSA9IDQ7IGkgPD0gNzsgaSsrKSB7DQorICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TW2RpZ2l0XSwgNCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgIH0NCisgIHBvcyArPQ0KKyAgICAgIEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIENCQ19PbmVEaW1SZWFkZXI6OlNUQVJUX0VORF9QQVRURVJOLCAzLCAxLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgRlhfRnJlZShyZXN1bHQpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK3ZvaWQgQ0JDX09uZWRFQU44V3JpdGVyOjpTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE91dEJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGRldmljZSA9PSBOVUxMICYmIHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgbGVmdFBvc2l0aW9uID0gMyAqIG11bHRpcGxlOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gRlhfVVRGOEVuY29kZShjb250ZW50cyk7DQorICBpbnQzMl90IGlMZW5ndGggPSBzdHIuR2V0TGVuZ3RoKCk7DQorICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgaUxlbmd0aCk7DQorICBpZiAoIXBDaGFyUG9zKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYU1lTX21lbXNldChwQ2hhclBvcywgMCwgc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSAqIGlMZW5ndGgpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdGVtcFN0ciA9IHN0ci5NaWQoMCwgNCk7DQorICBpbnQzMl90IGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBzdHJXaWR0aCA9IDcgKiBtdWx0aXBsZSAqIDQ7DQorICBGWF9GTE9BVCBibGFuayA9IDAuMDsNCisgIENGWF9GeGdlRGV2aWNlIGdlQml0bWFwOw0KKyAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICBnZUJpdG1hcC5BdHRhY2gocE91dEJpdG1hcCk7DQorICB9DQorICBGWF9GTE9BVCBjaGFyc1dpZHRoID0gMDsNCisgIGludDMyX3QgaUZvbnRTaXplID0gKGludDMyX3QpZmFicyhtX2ZGb250U2l6ZSk7DQorICBpbnQzMl90IGlUZXh0SGVpZ2h0ID0gaUZvbnRTaXplICsgMTsNCisgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgQ0ZYX01hdHJpeCBtYXRyKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQorICAgIENGWF9GbG9hdFJlY3QgcmVjdCgNCisgICAgICAgIChGWF9GTE9BVClsZWZ0UG9zaXRpb24sIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksDQorICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIHN0cldpZHRoIC0gMC41KSwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCisgICAgbWF0ci5Db25jYXQoKm1hdHJpeCk7DQorICAgIG1hdHIuVHJhbnNmb3JtUmVjdChyZWN0KTsNCisgICAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICBDRlhfTWF0cml4IG1hdHIxKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQorICAgIENGWF9GbG9hdFJlY3QgcmVjdDEoDQorICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDMzICogbXVsdGlwbGUpLA0KKyAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwNCisgICAgICAgIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgMzMgKiBtdWx0aXBsZSArIHN0cldpZHRoIC0gMC41KSwNCisgICAgICAgIChGWF9GTE9BVCltX0hlaWdodCk7DQorICAgIG1hdHIxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgbWF0cjEuVHJhbnNmb3JtUmVjdChyZWN0MSk7DQorICAgIHJlID0gcmVjdDEuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgfQ0KKyAgaWYgKHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KKyAgICBzdHJXaWR0aCA9IChpbnQzMl90KShzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlKTsNCisgIH0NCisgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcywgbV9wRm9udCwgKEZYX0ZMT0FUKXN0cldpZHRoLCBpRm9udFNpemUsDQorICAgICAgICAgICAgICAgYmxhbmspOw0KKyAgQ0ZYX0FmZmluZU1hdHJpeCBhZmZpbmVfbWF0cml4KDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwgKEZYX0ZMT0FUKWlGb250U2l6ZSk7DQorICBDRlhfRnhnZURldmljZSBnZTsNCisgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIGdlLkdldEJpdG1hcCgpOw0KKyAgICBnZS5DcmVhdGUoc3RyV2lkdGgsIGlUZXh0SGVpZ2h0LCBGWERJQl9BcmdiKTsNCisgICAgZ2UuR2V0Qml0bWFwKCktPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MsIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLCAoRlhfRkxPQVQpaUZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCopJmFmZmluZV9tYXRyaXgsIG1fZm9udENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24sIG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX0FmZmluZU1hdHJpeCBhZmZpbmVfbWF0cml4MSgNCisgICAgICAgIDEuMCwgMC4wLCAwLjAsIC0xLjAsIChGWF9GTE9BVClsZWZ0UG9zaXRpb24gKiBtX291dHB1dEhTY2FsZSwNCisgICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOw0KKyAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQorICAgIEZYX0JPT0wgcmV0ID0gZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dCgNCisgICAgICAgIGlMZW4sIHBDaGFyUG9zLCBtX3BGb250LCBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsIChDRlhfQWZmaW5lTWF0cml4KikmYWZmaW5lX21hdHJpeDEsIG1fZm9udENvbG9yLA0KKyAgICAgICAgRlhURVhUX0NMRUFSVFlQRSk7DQorICB9DQorICB0ZW1wU3RyID0gc3RyLk1pZCg0LCA0KTsNCisgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KKyAgY2hhcnNXaWR0aCA9IDAuMGY7DQorICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyA0LCBtX3BGb250LCAoRlhfRkxPQVQpc3RyV2lkdGgsIGlGb250U2l6ZSwNCisgICAgICAgICAgICAgICBibGFuayk7DQorICBpZiAocE91dEJpdG1hcCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsNCisgICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgIGdlLkdldEJpdG1hcCgpLT5DbGVhcihtX2JhY2tncm91bmRDb2xvcik7DQorICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zICsgNCwgbV9wRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksIChGWF9GTE9BVClpRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4KikmYWZmaW5lX21hdHJpeCwgbV9mb250Q29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIGxlZnRQb3NpdGlvbiArIDMzICogbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICAgICAgICBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeDEoDQorICAgICAgICAxLjAsIDAuMCwgMC4wLCAtMS4wLA0KKyAgICAgICAgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyAzMyAqIG11bHRpcGxlKSAqIG1fb3V0cHV0SFNjYWxlLA0KKyAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQorICAgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgfQ0KKyAgICBGWF9CT09MIHJldCA9IGRldmljZS0+RHJhd05vcm1hbFRleHQoDQorICAgICAgICBpTGVuLCBwQ2hhclBvcyArIDQsIG1fcEZvbnQsIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSwgKENGWF9BZmZpbmVNYXRyaXgqKSZhZmZpbmVfbWF0cml4MSwgbV9mb250Q29sb3IsDQorICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgIH0NCisgIEZYX0ZyZWUocENoYXJQb3MpOw0KK30NCit2b2lkIENCQ19PbmVkRUFOOFdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChjb250ZW50cywgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmgKaW5kZXggOWY3MTQ5Zi4uZDNkMWM4YSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXIuaApAQCAtOSwyNCArOSw0NSBAQAogZW51bSBCQ19URVhUX0xPQzsNCiBjbGFzcyBDQkNfT25lRGltV3JpdGVyOw0KIGNsYXNzIENCQ19PbmVkRUFOOFdyaXRlcjsNCi1jbGFzcyBDQkNfT25lZEVBTjhXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlcg0KLXsNCi1wcml2YXRlOg0KLSAgICBpbnQzMl90IG1fY29kZVdpZHRoOw0KLXB1YmxpYzoNCi0gICAgQ0JDX09uZWRFQU44V3JpdGVyKCk7DQotICAgIHZpcnR1YWwJCX5DQkNfT25lZEVBTjhXcml0ZXIoKTsNCi0gICAgdWludDhfdAkqCQlFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQgLCBpbnQzMl90ICZlKTsNCi0gICAgdWludDhfdCAqCQlFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgaGludHMgLCBpbnQzMl90ICZlKTsNCi0gICAgdWludDhfdCAqCQlFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBpbnQzMl90ICZvdXRMZW5ndGgsIGludDMyX3QgJmUpOw0KLSAgICB2b2lkCQkJUmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIHVpbnQ4X3QqIGNvZGUsIGludDMyX3QgY29kZUxlbmd0aCwgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wJCQlDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQotICAgIHZvaWQJCQlTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKTsNCi0gICAgRlhfQk9PTAkJCVNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbik7DQotICAgIGludDMyX3QJCUNhbGNDaGVja3N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMpOw0KLXByb3RlY3RlZDoNCitjbGFzcyBDQkNfT25lZEVBTjhXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlciB7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fY29kZVdpZHRoOw0KIA0KLSAgICB2b2lkCQlTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgQ0ZYX0RJQml0bWFwICpwT3V0Qml0bWFwLCBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwgaW50MzJfdCBiYXJXaWR0aCwgaW50MzJfdCBtdWx0aXBsZSwgaW50MzJfdCAmZSk7DQorIHB1YmxpYzoNCisgIENCQ19PbmVkRUFOOFdyaXRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX09uZWRFQU44V3JpdGVyKCk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdm9pZCBSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICB2b2lkIFNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpOw0KKyAgRlhfQk9PTCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOw0KKyAgaW50MzJfdCBDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE91dEJpdG1hcCwNCisgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBUmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FSZWFkZXIuY3BwCmluZGV4IDAxNTZiYTQuLmZkNDI3ZWEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FSZWFkZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FSZWFkZXIuY3BwCkBAIC0yMCw3NCArMjAsNzkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KICAqLw0KIA0KLQ0KICNpbmNsdWRlICIuLi9iYXJjb2RlLmgiDQogI2luY2x1ZGUgIi4uL0JDX1JlYWRlci5oIg0KICNpbmNsdWRlICJCQ19PbmVEUmVhZGVyLmgiDQogI2luY2x1ZGUgIkJDX09uZURpbVJlYWRlci5oIg0KICNpbmNsdWRlICJCQ19PbmVkRUFOMTNSZWFkZXIuaCINCiAjaW5jbHVkZSAiQkNfT25lZFVQQ0FSZWFkZXIuaCINCi1DQkNfT25lZFVQQ0FSZWFkZXI6OkNCQ19PbmVkVVBDQVJlYWRlcigpDQotew0KLSAgICBtX2VhbjEzUmVhZGVyID0gTlVMTDsNCitDQkNfT25lZFVQQ0FSZWFkZXI6OkNCQ19PbmVkVVBDQVJlYWRlcigpIHsNCisgIG1fZWFuMTNSZWFkZXIgPSBOVUxMOw0KIH0NCi12b2lkIENCQ19PbmVkVVBDQVJlYWRlcjo6SW5pdCgpDQotew0KLSAgICBtX2VhbjEzUmVhZGVyID0gRlhfTkVXIENCQ19PbmVkRUFOMTNSZWFkZXI7DQordm9pZCBDQkNfT25lZFVQQ0FSZWFkZXI6OkluaXQoKSB7DQorICBtX2VhbjEzUmVhZGVyID0gRlhfTkVXIENCQ19PbmVkRUFOMTNSZWFkZXI7DQogfQ0KLUNCQ19PbmVkVVBDQVJlYWRlcjo6fkNCQ19PbmVkVVBDQVJlYWRlcigpDQotew0KLSAgICBpZihtX2VhbjEzUmVhZGVyICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBtX2VhbjEzUmVhZGVyOw0KLSAgICB9DQotICAgIG1fZWFuMTNSZWFkZXIgPSBOVUxMOw0KK0NCQ19PbmVkVVBDQVJlYWRlcjo6fkNCQ19PbmVkVVBDQVJlYWRlcigpIHsNCisgIGlmIChtX2VhbjEzUmVhZGVyICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fZWFuMTNSZWFkZXI7DQorICB9DQorICBtX2VhbjEzUmVhZGVyID0gTlVMTDsNCiB9DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRVUENBUmVhZGVyOjpEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsIENCQ19Db21tb25CaXRBcnJheSAqcm93LCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZXN0cmluZyA9IG1fZWFuMTNSZWFkZXItPkRlY29kZVJvdyhyb3dOdW1iZXIsIHJvdywgaGludHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyB0ZW1wID0gTWF5YmVSZXR1cm5SZXN1bHQoYnl0ZXN0cmluZywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQotICAgIHJldHVybiB0ZW1wOw0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVkVVBDQVJlYWRlcjo6RGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZXN0cmluZyA9DQorICAgICAgbV9lYW4xM1JlYWRlci0+RGVjb2RlUm93KHJvd051bWJlciwgcm93LCBoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdGVtcCA9IE1heWJlUmV0dXJuUmVzdWx0KGJ5dGVzdHJpbmcsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIHJldHVybiB0ZW1wOw0KIH0NCi1DRlhfQnl0ZVN0cmluZyBDQkNfT25lZFVQQ0FSZWFkZXI6OkRlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpzdGFydEd1YXJkUmFuZ2UsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nID0gbV9lYW4xM1JlYWRlci0+RGVjb2RlUm93KHJvd051bWJlciwgcm93LCBzdGFydEd1YXJkUmFuZ2UsIGhpbnRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgdGVtcCA9IE1heWJlUmV0dXJuUmVzdWx0KGJ5dGVzdHJpbmcsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICByZXR1cm4gdGVtcDsNCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lZFVQQ0FSZWFkZXI6OkRlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogc3RhcnRHdWFyZFJhbmdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZXN0cmluZyA9DQorICAgICAgbV9lYW4xM1JlYWRlci0+RGVjb2RlUm93KHJvd051bWJlciwgcm93LCBzdGFydEd1YXJkUmFuZ2UsIGhpbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBDRlhfQnl0ZVN0cmluZyB0ZW1wID0gTWF5YmVSZXR1cm5SZXN1bHQoYnl0ZXN0cmluZywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgcmV0dXJuIHRlbXA7DQogfQ0KLUNGWF9CeXRlU3RyaW5nIENCQ19PbmVkVVBDQVJlYWRlcjo6RGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZXN0cmluZyA9IG1fZWFuMTNSZWFkZXItPkRlY29kZShpbWFnZSwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQotICAgIENGWF9CeXRlU3RyaW5nIHRlbXAgPSBNYXliZVJldHVyblJlc3VsdChieXRlc3RyaW5nLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgcmV0dXJuIHRlbXA7DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRVUENBUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHJpbmcgPSBtX2VhbjEzUmVhZGVyLT5EZWNvZGUoaW1hZ2UsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIENGWF9CeXRlU3RyaW5nIHRlbXAgPSBNYXliZVJldHVyblJlc3VsdChieXRlc3RyaW5nLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICByZXR1cm4gdGVtcDsNCiB9DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRVUENBUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nID0gbV9lYW4xM1JlYWRlci0+RGVjb2RlKGltYWdlLCBoaW50cywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQotICAgIENGWF9CeXRlU3RyaW5nIHRlbXAgPSBNYXliZVJldHVyblJlc3VsdChieXRlc3RyaW5nLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgcmV0dXJuIHRlbXA7DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRVUENBUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nID0gbV9lYW4xM1JlYWRlci0+RGVjb2RlKGltYWdlLCBoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdGVtcCA9IE1heWJlUmV0dXJuUmVzdWx0KGJ5dGVzdHJpbmcsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIHJldHVybiB0ZW1wOw0KIH0NCi1pbnQzMl90IENCQ19PbmVkVVBDQVJlYWRlcjo6RGVjb2RlTWlkZGxlKENCQ19Db21tb25CaXRBcnJheSAqcm93LCBDRlhfSW50MzJBcnJheSAqc3RhcnRSYW5nZSwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdFN0cmluZywgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgdGVtcCA9IG1fZWFuMTNSZWFkZXItPkRlY29kZU1pZGRsZShyb3csIHN0YXJ0UmFuZ2UsIHJlc3VsdFN0cmluZywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgcmV0dXJuIHRlbXA7DQoraW50MzJfdCBDQkNfT25lZFVQQ0FSZWFkZXI6OkRlY29kZU1pZGRsZShDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBzdGFydFJhbmdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgdGVtcCA9IG1fZWFuMTNSZWFkZXItPkRlY29kZU1pZGRsZShyb3csIHN0YXJ0UmFuZ2UsIHJlc3VsdFN0cmluZywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICByZXR1cm4gdGVtcDsNCiB9DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRVUENBUmVhZGVyOjpNYXliZVJldHVyblJlc3VsdChDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYocmVzdWx0WzBdID09ICcwJykgew0KLSAgICAgICAgcmVzdWx0LkRlbGV0ZSgwKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lZFVQQ0FSZWFkZXI6Ok1heWJlUmV0dXJuUmVzdWx0KENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAocmVzdWx0WzBdID09ICcwJykgew0KKyAgICByZXN1bHQuRGVsZXRlKDApOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfSBlbHNlIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KICAgICByZXR1cm4gIiI7DQorICB9DQorICByZXR1cm4gIiI7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FSZWFkZXIuaAppbmRleCBjMWVjY2I1Li4yNDliODIwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBUmVhZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVJlYWRlci5oCkBAIC0xMSwyMCArMTEsMzEgQEAKIGNsYXNzIENCQ19PbmVEaW1SZWFkZXI7DQogY2xhc3MgQ0JDX09uZWRFQU4xM1JlYWRlcjsNCiBjbGFzcyBDQkNfT25lZFVQQ0FSZWFkZXI7DQotY2xhc3MgQ0JDX09uZWRVUENBUmVhZGVyIDogcHVibGljIENCQ19PbmVEaW1SZWFkZXINCi17DQotcHJpdmF0ZToNCi0gICAgQ0JDX09uZWRFQU4xM1JlYWRlciAqbV9lYW4xM1JlYWRlcjsNCi1wdWJsaWM6DQotICAgIENCQ19PbmVkVVBDQVJlYWRlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfT25lZFVQQ0FSZWFkZXIoKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLCBDQkNfQ29tbW9uQml0QXJyYXkgKnJvdywgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSk7DQotICAgIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwgQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpzdGFydEd1YXJkUmFuZ2UsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpOw0KLSAgICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KLXByb3RlY3RlZDoNCi0gICAgaW50MzJfdCBEZWNvZGVNaWRkbGUoQ0JDX0NvbW1vbkJpdEFycmF5ICpyb3csIENGWF9JbnQzMkFycmF5ICpzdGFydFJhbmdlLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0U3RyaW5nLCBpbnQzMl90ICZlKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgTWF5YmVSZXR1cm5SZXN1bHQoQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgaW50MzJfdCAmZSk7DQorY2xhc3MgQ0JDX09uZWRVUENBUmVhZGVyIDogcHVibGljIENCQ19PbmVEaW1SZWFkZXIgew0KKyBwcml2YXRlOg0KKyAgQ0JDX09uZWRFQU4xM1JlYWRlciogbV9lYW4xM1JlYWRlcjsNCisNCisgcHVibGljOg0KKyAgQ0JDX09uZWRVUENBUmVhZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lZFVQQ0FSZWFkZXIoKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBzdGFydEd1YXJkUmFuZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgaW50MzJfdCYgZSk7DQorICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsIGludDMyX3QgaGludHMsIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgaW50MzJfdCBEZWNvZGVNaWRkbGUoQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogc3RhcnRSYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHRTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlU3RyaW5nIE1heWJlUmV0dXJuUmVzdWx0KENGWF9CeXRlU3RyaW5nJiByZXN1bHQsIGludDMyX3QmIGUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmNwcAppbmRleCAzNjZkYzljLi42NmM3YzJhIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmNwcApAQCAtMjUsMjYxICsyNSwyNzAgQEAKICNpbmNsdWRlICJCQ19PbmVEaW1Xcml0ZXIuaCINCiAjaW5jbHVkZSAiQkNfT25lZEVBTjEzV3JpdGVyLmgiDQogI2luY2x1ZGUgIkJDX09uZWRVUENBV3JpdGVyLmgiDQotQ0JDX09uZWRVUENBV3JpdGVyOjpDQkNfT25lZFVQQ0FXcml0ZXIoKQ0KLXsNCi0gICAgbV9zdWJXcml0ZXIgPSBOVUxMOw0KLSAgICBtX2JMZWZ0UGFkZGluZyA9IFRSVUU7DQotICAgIG1fYlJpZ2h0UGFkZGluZyA9IFRSVUU7DQorQ0JDX09uZWRVUENBV3JpdGVyOjpDQkNfT25lZFVQQ0FXcml0ZXIoKSB7DQorICBtX3N1YldyaXRlciA9IE5VTEw7DQorICBtX2JMZWZ0UGFkZGluZyA9IFRSVUU7DQorICBtX2JSaWdodFBhZGRpbmcgPSBUUlVFOw0KIH0NCi12b2lkIENCQ19PbmVkVVBDQVdyaXRlcjo6SW5pdCgpDQotew0KLSAgICBtX3N1YldyaXRlciA9IEZYX05FVyBDQkNfT25lZEVBTjEzV3JpdGVyOw0KK3ZvaWQgQ0JDX09uZWRVUENBV3JpdGVyOjpJbml0KCkgew0KKyAgbV9zdWJXcml0ZXIgPSBGWF9ORVcgQ0JDX09uZWRFQU4xM1dyaXRlcjsNCiB9DQotQ0JDX09uZWRVUENBV3JpdGVyOjp+Q0JDX09uZWRVUENBV3JpdGVyKCkNCi17DQotICAgIGlmKG1fc3ViV3JpdGVyICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3N1YldyaXRlcjsNCi0gICAgfQ0KLSAgICBtX3N1YldyaXRlciA9IE5VTEw7DQorQ0JDX09uZWRVUENBV3JpdGVyOjp+Q0JDX09uZWRVUENBV3JpdGVyKCkgew0KKyAgaWYgKG1fc3ViV3JpdGVyICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fc3ViV3JpdGVyOw0KKyAgfQ0KKyAgbV9zdWJXcml0ZXIgPSBOVUxMOw0KIH0NCi1GWF9CT09MCUNCQ19PbmVkVVBDQVdyaXRlcjo6Q2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykNCi17DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICBpZiAoY29udGVudHMuR2V0QXQoaSkgPj0gJzAnICYmIGNvbnRlbnRzLkdldEF0KGkpIDw9ICc5Jykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUNGWF9XaWRlU3RyaW5nCUNCQ19PbmVkVVBDQVdyaXRlcjo6RmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzOw0KLSAgICBGWF9XQ0hBUiBjaDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KLSAgICAgICAgY2ggPSBjb250ZW50cy5HZXRBdChpKTsNCi0gICAgICAgIGlmKGNoID4gMTc1KSB7DQotICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsNCi0gICAgICAgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gZmlsdGVyY29udGVudHM7DQotfQ0KLWludDMyX3QgQ0JDX09uZWRVUENBV3JpdGVyOjpDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBvZGQgPSAwOw0KLSAgICBpbnQzMl90IGV2ZW4gPSAwOw0KLSAgICBpbnQzMl90IGogPSAxOw0KLSAgICBmb3IoaW50MzJfdCBpID0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgew0KLSAgICAgICAgaWYoaiAlIDIpIHsNCi0gICAgICAgICAgICBvZGQgKz0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBldmVuICs9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGorKzsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGNoZWNrc3VtID0gKG9kZCAqIDMgKyBldmVuKSAlIDEwOw0KLSAgICBjaGVja3N1bSA9ICgxMCAtIGNoZWNrc3VtKSAlIDEwOw0KLSAgICByZXR1cm4gKGNoZWNrc3VtKTsNCi19DQotdWludDhfdCAqQ0JDX09uZWRVUENBV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgJmUpDQotew0KLSAgICB1aW50OF90ICpyZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgcmV0dXJuIHJldDsNCi19DQotdWludDhfdCAqQ0JDX09uZWRVUENBV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoZm9ybWF0ICE9IEJDRk9STUFUX1VQQ19BKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlVVBDX0E7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZyB0b0VBTjEzU3RyaW5nID0gJzAnICsgY29udGVudHM7DQotICAgIG1faURhdGFMZW50aCA9IDEzOw0KLSAgICB1aW50OF90ICpyZXQgPSBtX3N1YldyaXRlci0+RW5jb2RlKHRvRUFOMTNTdHJpbmcsIEJDRk9STUFUX0VBTl8xMywgb3V0V2lkdGgsIG91dEhlaWdodCwgaGludHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIHJldHVybiByZXQ7DQotfQ0KLXZvaWQgQ0JDX09uZWRVUENBV3JpdGVyOjpTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgQ0ZYX0RJQml0bWFwICpwT3V0Qml0bWFwLCBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwgaW50MzJfdCBiYXJXaWR0aCwgaW50MzJfdCBtdWx0aXBsZSwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChkZXZpY2UgPT0gTlVMTCAmJiBwT3V0Qml0bWFwID09IE5VTEwpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGxlZnRQYWRkaW5nID0gNyAqIG11bHRpcGxlOw0KLSAgICBpbnQzMl90IGxlZnRQb3NpdGlvbiA9IDEwICogbXVsdGlwbGUgKyBsZWZ0UGFkZGluZzsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gRlhfVVRGOEVuY29kZShjb250ZW50cyk7DQotICAgIGludDMyX3QgaUxlbiA9IHN0ci5HZXRMZW5ndGgoKTsNCi0gICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW4pOw0KLSAgICBpZiAoIXBDaGFyUG9zKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhTWVNfbWVtc2V0KHBDaGFyUG9zLCAwLCBzaXplb2YoRlhURVhUX0NIQVJQT1MpICogaUxlbik7DQotICAgIENGWF9CeXRlU3RyaW5nIHRlbXBTdHIgPSBzdHIuTWlkKDEsIDUpOw0KLSAgICBGWF9GTE9BVCBzdHJXaWR0aCA9IChGWF9GTE9BVCkzNSAqIG11bHRpcGxlOw0KLSAgICBGWF9GTE9BVCBibGFuayA9IDAuMDsNCi0gICAgQ0ZYX0Z4Z2VEZXZpY2UgZ2VCaXRtYXA7DQotICAgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCi0gICAgICAgIGdlQml0bWFwLkF0dGFjaChwT3V0Qml0bWFwKTsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBjaGFyc1dpZHRoID0gMDsNCi0gICAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQotICAgIGludDMyX3QgaUZvbnRTaXplID0gKGludDMyX3QpZmFicyhtX2ZGb250U2l6ZSk7DQotICAgIGludDMyX3QgaVRleHRIZWlnaHQgPSBpRm9udFNpemUgKyAxOw0KLSAgICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQotICAgICAgICBDRlhfTWF0cml4IG1hdHIobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsNCi0gICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdCgoRlhfRkxPQVQpbGVmdFBvc2l0aW9uLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLCAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiAgKyBzdHJXaWR0aCAtIDAuNSksIChGWF9GTE9BVCltX0hlaWdodCk7DQotICAgICAgICBtYXRyLkNvbmNhdCgqbWF0cml4KTsNCi0gICAgICAgIG1hdHIuVHJhbnNmb3JtUmVjdChyZWN0KTsNCi0gICAgICAgIEZYX1JFQ1QgcmUgPSByZWN0LkdldE91dHRlclJlY3QoKTsNCi0gICAgICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQotICAgICAgICBDRlhfTWF0cml4IG1hdHIxKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQotICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3QxKChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgNDAgKiBtdWx0aXBsZSksIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksIChGWF9GTE9BVCkoKGxlZnRQb3NpdGlvbiArIDQwICogbXVsdGlwbGUpICsgc3RyV2lkdGggLSAwLjUpLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KLSAgICAgICAgbWF0cjEuQ29uY2F0KCptYXRyaXgpOw0KLSAgICAgICAgbWF0cjEuVHJhbnNmb3JtUmVjdChyZWN0MSk7DQotICAgICAgICByZSA9IHJlY3QxLkdldE91dHRlclJlY3QoKTsNCi0gICAgICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQotICAgICAgICBGWF9GTE9BVCBzdHJXaWR0aDEgPSAoRlhfRkxPQVQpbXVsdGlwbGUgKiA3Ow0KLSAgICAgICAgQ0ZYX01hdHJpeCBtYXRyMihtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOw0KLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0MigwLjAsIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksIChGWF9GTE9BVClzdHJXaWR0aDEgLSAxLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KLSAgICAgICAgbWF0cjIuQ29uY2F0KCptYXRyaXgpOw0KLSAgICAgICAgbWF0cjIuVHJhbnNmb3JtUmVjdChyZWN0Mik7DQotICAgICAgICByZSA9IHJlY3QyLkdldE91dHRlclJlY3QoKTsNCi0gICAgICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQotICAgICAgICBDRlhfTWF0cml4IG1hdHIzKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQotICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3QzKChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgODUgKiBtdWx0aXBsZSksIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksIChGWF9GTE9BVCkoKGxlZnRQb3NpdGlvbiArIDg1ICogbXVsdGlwbGUpICsgc3RyV2lkdGgxIC0gMC41KSwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCi0gICAgICAgIG1hdHIzLkNvbmNhdCgqbWF0cml4KTsNCi0gICAgICAgIG1hdHIzLlRyYW5zZm9ybVJlY3QocmVjdDMpOw0KLSAgICAgICAgcmUgPSByZWN0My5HZXRPdXR0ZXJSZWN0KCk7DQotICAgICAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KLSAgICB9DQotICAgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCi0gICAgICAgIHN0cldpZHRoID0gc3RyV2lkdGggKiBtX291dHB1dEhTY2FsZTsNCi0gICAgfQ0KLSAgICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyAxLCBtX3BGb250LCBzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQotICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeCgxLjAsIDAuMCwgMC4wLCAtMS4wLCAwLjAsIChGWF9GTE9BVClpRm9udFNpemUpOw0KLSAgICBDRlhfRnhnZURldmljZSBnZTsNCi0gICAgaWYocE91dEJpdG1hcCAhPSBOVUxMKSB7DQotICAgICAgICBnZS5DcmVhdGUoKGludClzdHJXaWR0aCwgaVRleHRIZWlnaHQsIEZYRElCX0FyZ2IpOw0KLSAgICAgICAgZ2UuR2V0Qml0bWFwKCktPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCi0gICAgICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcyArIDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplICwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZhZmZpbmVfbWF0cml4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KLSAgICAgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24sIG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpOw0KK0ZYX0JPT0wgQ0JDX09uZWRVUENBV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIGlmIChjb250ZW50cy5HZXRBdChpKSA+PSAnMCcgJiYgY29udGVudHMuR2V0QXQoaSkgPD0gJzknKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIChGWF9GTE9BVClsZWZ0UG9zaXRpb24gKiBtX291dHB1dEhTY2FsZSwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQotICAgICAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQotICAgICAgICB9DQotICAgICAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zICsgMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUgLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgdGVtcFN0ciA9IHN0ci5NaWQoNiwgNSk7DQotICAgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KLSAgICBjaGFyc1dpZHRoID0gMC4wZjsNCi0gICAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zICsgNiwgbV9wRm9udCwgc3RyV2lkdGgsIGlGb250U2l6ZSwgYmxhbmspOw0KLSAgICBpZihwT3V0Qml0bWFwICE9IE5VTEwpIHsNCi0gICAgICAgIEZYX1JFQ1QgcmVjdDIoMCwgMCwgKGludClzdHJXaWR0aCwgaVRleHRIZWlnaHQpOw0KLSAgICAgICAgZ2UuRmlsbFJlY3QoJnJlY3QyLCBtX2JhY2tncm91bmRDb2xvcik7DQotICAgICAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYXJQb3MgKyA2LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgbGVmdFBvc2l0aW9uICsgNDAgKiBtdWx0aXBsZSwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgNDAgKiBtdWx0aXBsZSkgKiBtX291dHB1dEhTY2FsZSwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQotICAgICAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQotICAgICAgICB9DQotICAgICAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zICsgNiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUgLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgfQ0KLSAgICB0ZW1wU3RyID0gc3RyLk1pZCgwLCAxKTsNCi0gICAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQotICAgIHN0cldpZHRoID0gKEZYX0ZMT0FUKW11bHRpcGxlICogNzsNCi0gICAgaWYgKHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KLSAgICAgICAgc3RyV2lkdGggPSBzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlOw0KLSAgICB9DQotICAgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcywgbV9wRm9udCwgc3RyV2lkdGgsIGlGb250U2l6ZSwgYmxhbmspOw0KLSAgICBpZihwT3V0Qml0bWFwICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsNCi0gICAgICAgIGdlLkNyZWF0ZSgoaW50KXN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQotICAgICAgICBnZS5HZXRCaXRtYXAoKS0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOw0KLSAgICAgICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgMCwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAsIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOw0KLSAgICAgICAgaWYgKG1hdHJpeCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUgLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgfQ0KLSAgICB0ZW1wU3RyID0gc3RyLk1pZCgxMSwgMSk7DQotICAgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KLSAgICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyAxMSwgbV9wRm9udCwgc3RyV2lkdGgsIGlGb250U2l6ZSwgYmxhbmspOw0KLSAgICBpZiAocE91dEJpdG1hcCAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgZ2UuR2V0Qml0bWFwKCk7DQotICAgICAgICBnZS5DcmVhdGUoKGludClzdHJXaWR0aCwgaVRleHRIZWlnaHQsIEZYRElCX0FyZ2IpOw0KLSAgICAgICAgZ2UuR2V0Qml0bWFwKCktPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCi0gICAgICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhclBvcyArIDExLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmYWZmaW5lX21hdHJpeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgbGVmdFBvc2l0aW9uICsgODUgKiBtdWx0aXBsZSwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgODUgKiBtdWx0aXBsZSkgKiBtX291dHB1dEhTY2FsZSwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQotICAgICAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQotICAgICAgICB9DQotICAgICAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFyUG9zICsgMTEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplICwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXggKikgJmFmZmluZV9tYXRyaXgxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7DQotICAgIH0NCi0gICAgRlhfRnJlZShwQ2hhclBvcyk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDQkNfT25lZFVQQ0FXcml0ZXI6OlJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCB1aW50OF90KiBjb2RlLCBpbnQzMl90IGNvZGVMZW5ndGgsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QgJmUpDQotew0KLSAgICBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJSZXN1bHQoY29udGVudHMsIGNvZGUsIGNvZGVMZW5ndGgsIGlzRGV2aWNlLCBlKTsNCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZFVQQ0FXcml0ZXI6OkZpbHRlckNvbnRlbnRzKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50czsNCisgIEZYX1dDSEFSIGNoOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KKyAgICBpZiAoY2ggPiAxNzUpIHsNCisgICAgICBpKys7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOw0KIH0NCi0NCitpbnQzMl90IENCQ19PbmVkVVBDQVdyaXRlcjo6Q2FsY0NoZWNrc3VtKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cykgew0KKyAgaW50MzJfdCBvZGQgPSAwOw0KKyAgaW50MzJfdCBldmVuID0gMDsNCisgIGludDMyX3QgaiA9IDE7DQorICBmb3IgKGludDMyX3QgaSA9IGNvbnRlbnRzLkdldExlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsNCisgICAgaWYgKGogJSAyKSB7DQorICAgICAgb2RkICs9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBldmVuICs9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCisgICAgfQ0KKyAgICBqKys7DQorICB9DQorICBpbnQzMl90IGNoZWNrc3VtID0gKG9kZCAqIDMgKyBldmVuKSAlIDEwOw0KKyAgY2hlY2tzdW0gPSAoMTAgLSBjaGVja3N1bSkgJSAxMDsNCisgIHJldHVybiAoY2hlY2tzdW0pOw0KK30NCit1aW50OF90KiBDQkNfT25lZFVQQ0FXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICB1aW50OF90KiByZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcmV0Ow0KK30NCit1aW50OF90KiBDQkNfT25lZFVQQ0FXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChmb3JtYXQgIT0gQkNGT1JNQVRfVVBDX0EpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uT25seUVuY29kZVVQQ19BOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIHRvRUFOMTNTdHJpbmcgPSAnMCcgKyBjb250ZW50czsNCisgIG1faURhdGFMZW50aCA9IDEzOw0KKyAgdWludDhfdCogcmV0ID0gbV9zdWJXcml0ZXItPkVuY29kZSh0b0VBTjEzU3RyaW5nLCBCQ0ZPUk1BVF9FQU5fMTMsIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWlnaHQsIGhpbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiByZXQ7DQorfQ0KK3ZvaWQgQ0JDX09uZWRVUENBV3JpdGVyOjpTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE91dEJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGRldmljZSA9PSBOVUxMICYmIHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgbGVmdFBhZGRpbmcgPSA3ICogbXVsdGlwbGU7DQorICBpbnQzMl90IGxlZnRQb3NpdGlvbiA9IDEwICogbXVsdGlwbGUgKyBsZWZ0UGFkZGluZzsNCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IEZYX1VURjhFbmNvZGUoY29udGVudHMpOw0KKyAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOw0KKyAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW4pOw0KKyAgaWYgKCFwQ2hhclBvcykgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWFNZU19tZW1zZXQocENoYXJQb3MsIDAsIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBpTGVuKTsNCisgIENGWF9CeXRlU3RyaW5nIHRlbXBTdHIgPSBzdHIuTWlkKDEsIDUpOw0KKyAgRlhfRkxPQVQgc3RyV2lkdGggPSAoRlhfRkxPQVQpMzUgKiBtdWx0aXBsZTsNCisgIEZYX0ZMT0FUIGJsYW5rID0gMC4wOw0KKyAgQ0ZYX0Z4Z2VEZXZpY2UgZ2VCaXRtYXA7DQorICBpZiAocE91dEJpdG1hcCAhPSBOVUxMKSB7DQorICAgIGdlQml0bWFwLkF0dGFjaChwT3V0Qml0bWFwKTsNCisgIH0NCisgIEZYX0ZMT0FUIGNoYXJzV2lkdGggPSAwOw0KKyAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IGlGb250U2l6ZSA9IChpbnQzMl90KWZhYnMobV9mRm9udFNpemUpOw0KKyAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7DQorICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQorICAgIENGWF9NYXRyaXggbWF0cihtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOw0KKyAgICBDRlhfRmxvYXRSZWN0IHJlY3QoDQorICAgICAgICAoRlhfRkxPQVQpbGVmdFBvc2l0aW9uLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLA0KKyAgICAgICAgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyBzdHJXaWR0aCAtIDAuNSksIChGWF9GTE9BVCltX0hlaWdodCk7DQorICAgIG1hdHIuQ29uY2F0KCptYXRyaXgpOw0KKyAgICBtYXRyLlRyYW5zZm9ybVJlY3QocmVjdCk7DQorICAgIEZYX1JFQ1QgcmUgPSByZWN0LkdldE91dHRlclJlY3QoKTsNCisgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgQ0ZYX01hdHJpeCBtYXRyMShtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOw0KKyAgICBDRlhfRmxvYXRSZWN0IHJlY3QxKA0KKyAgICAgICAgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA0MCAqIG11bHRpcGxlKSwNCisgICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksDQorICAgICAgICAoRlhfRkxPQVQpKChsZWZ0UG9zaXRpb24gKyA0MCAqIG11bHRpcGxlKSArIHN0cldpZHRoIC0gMC41KSwNCisgICAgICAgIChGWF9GTE9BVCltX0hlaWdodCk7DQorICAgIG1hdHIxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgbWF0cjEuVHJhbnNmb3JtUmVjdChyZWN0MSk7DQorICAgIHJlID0gcmVjdDEuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICBGWF9GTE9BVCBzdHJXaWR0aDEgPSAoRlhfRkxPQVQpbXVsdGlwbGUgKiA3Ow0KKyAgICBDRlhfTWF0cml4IG1hdHIyKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQorICAgIENGWF9GbG9hdFJlY3QgcmVjdDIoMC4wLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClzdHJXaWR0aDEgLSAxLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgICBtYXRyMi5Db25jYXQoKm1hdHJpeCk7DQorICAgIG1hdHIyLlRyYW5zZm9ybVJlY3QocmVjdDIpOw0KKyAgICByZSA9IHJlY3QyLkdldE91dHRlclJlY3QoKTsNCisgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgQ0ZYX01hdHJpeCBtYXRyMyhtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOw0KKyAgICBDRlhfRmxvYXRSZWN0IHJlY3QzKA0KKyAgICAgICAgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA4NSAqIG11bHRpcGxlKSwNCisgICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksDQorICAgICAgICAoRlhfRkxPQVQpKChsZWZ0UG9zaXRpb24gKyA4NSAqIG11bHRpcGxlKSArIHN0cldpZHRoMSAtIDAuNSksDQorICAgICAgICAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgICBtYXRyMy5Db25jYXQoKm1hdHJpeCk7DQorICAgIG1hdHIzLlRyYW5zZm9ybVJlY3QocmVjdDMpOw0KKyAgICByZSA9IHJlY3QzLkdldE91dHRlclJlY3QoKTsNCisgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgIH0NCisgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgc3RyV2lkdGggPSBzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlOw0KKyAgfQ0KKyAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zICsgMSwgbV9wRm9udCwgc3RyV2lkdGgsIGlGb250U2l6ZSwgYmxhbmspOw0KKyAgQ0ZYX0FmZmluZU1hdHJpeCBhZmZpbmVfbWF0cml4KDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwgKEZYX0ZMT0FUKWlGb250U2l6ZSk7DQorICBDRlhfRnhnZURldmljZSBnZTsNCisgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCisgICAgZ2UuQ3JlYXRlKChpbnQpc3RyV2lkdGgsIGlUZXh0SGVpZ2h0LCBGWERJQl9BcmdiKTsNCisgICAgZ2UuR2V0Qml0bWFwKCktPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MgKyAxLCBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwgKEZYX0ZMT0FUKWlGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgKENGWF9BZmZpbmVNYXRyaXgqKSZhZmZpbmVfbWF0cml4LCBtX2ZvbnRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NMRUFSVFlQRSk7DQorICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgbGVmdFBvc2l0aW9uLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeDEoDQorICAgICAgICAxLjAsIDAuMCwgMC4wLCAtMS4wLCAoRlhfRkxPQVQpbGVmdFBvc2l0aW9uICogbV9vdXRwdXRIU2NhbGUsDQorICAgICAgICAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsNCisgICAgaWYgKG1hdHJpeCAhPSBOVUxMKSB7DQorICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOw0KKyAgICB9DQorICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoDQorICAgICAgICBpTGVuLCBwQ2hhclBvcyArIDEsIG1fcEZvbnQsIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSwgKENGWF9BZmZpbmVNYXRyaXgqKSZhZmZpbmVfbWF0cml4MSwgbV9mb250Q29sb3IsDQorICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgIH0NCisgIHRlbXBTdHIgPSBzdHIuTWlkKDYsIDUpOw0KKyAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQorICBjaGFyc1dpZHRoID0gMC4wZjsNCisgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcyArIDYsIG1fcEZvbnQsIHN0cldpZHRoLCBpRm9udFNpemUsIGJsYW5rKTsNCisgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCisgICAgRlhfUkVDVCByZWN0MigwLCAwLCAoaW50KXN0cldpZHRoLCBpVGV4dEhlaWdodCk7DQorICAgIGdlLkZpbGxSZWN0KCZyZWN0MiwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDYsIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLCAoRlhfRkxPQVQpaUZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCopJmFmZmluZV9tYXRyaXgsIG1fZm9udENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24gKyA0MCAqIG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKA0KKyAgICAgICAgMS4wLCAwLjAsIDAuMCwgLTEuMCwNCisgICAgICAgIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgNDAgKiBtdWx0aXBsZSkgKiBtX291dHB1dEhTY2FsZSwNCisgICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOw0KKyAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCisgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQorICAgIH0NCisgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dCgNCisgICAgICAgIGlMZW4sIHBDaGFyUG9zICsgNiwgbV9wRm9udCwgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplLCAoQ0ZYX0FmZmluZU1hdHJpeCopJmFmZmluZV9tYXRyaXgxLCBtX2ZvbnRDb2xvciwNCisgICAgICAgIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgfQ0KKyAgdGVtcFN0ciA9IHN0ci5NaWQoMCwgMSk7DQorICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsNCisgIHN0cldpZHRoID0gKEZYX0ZMT0FUKW11bHRpcGxlICogNzsNCisgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgc3RyV2lkdGggPSBzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlOw0KKyAgfQ0KKyAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zLCBtX3BGb250LCBzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQorICBpZiAocE91dEJpdG1hcCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsNCisgICAgZ2UuQ3JlYXRlKChpbnQpc3RyV2lkdGgsIGlUZXh0SGVpZ2h0LCBGWERJQl9BcmdiKTsNCisgICAgZ2UuR2V0Qml0bWFwKCktPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MsIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLCAoRlhfRkxPQVQpaUZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCopJmFmZmluZV9tYXRyaXgsIG1fZm9udENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCAwLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9BZmZpbmVNYXRyaXggYWZmaW5lX21hdHJpeDEoDQorICAgICAgICAxLjAsIDAuMCwgMC4wLCAtMS4wLCAwLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsNCisgICAgaWYgKG1hdHJpeCAhPSBOVUxMKSB7DQorICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOw0KKyAgICB9DQorICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoDQorICAgICAgICBpTGVuLCBwQ2hhclBvcywgbV9wRm9udCwgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplLCAoQ0ZYX0FmZmluZU1hdHJpeCopJmFmZmluZV9tYXRyaXgxLCBtX2ZvbnRDb2xvciwNCisgICAgICAgIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgfQ0KKyAgdGVtcFN0ciA9IHN0ci5NaWQoMTEsIDEpOw0KKyAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQorICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyAxMSwgbV9wRm9udCwgc3RyV2lkdGgsIGlGb250U2l6ZSwgYmxhbmspOw0KKyAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgZ2UuR2V0Qml0bWFwKCk7DQorICAgIGdlLkNyZWF0ZSgoaW50KXN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgIGdlLkdldEJpdG1hcCgpLT5DbGVhcihtX2JhY2tncm91bmRDb2xvcik7DQorICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zICsgMTEsIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLCAoRlhfRkxPQVQpaUZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCopJmFmZmluZV9tYXRyaXgsIG1fZm9udENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24gKyA4NSAqIG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfQWZmaW5lTWF0cml4IGFmZmluZV9tYXRyaXgxKA0KKyAgICAgICAgMS4wLCAwLjAsIDAuMCwgLTEuMCwNCisgICAgICAgIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgODUgKiBtdWx0aXBsZSkgKiBtX291dHB1dEhTY2FsZSwNCisgICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOw0KKyAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCisgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQorICAgIH0NCisgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dCgNCisgICAgICAgIGlMZW4sIHBDaGFyUG9zICsgMTEsIG1fcEZvbnQsIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSwgKENGWF9BZmZpbmVNYXRyaXgqKSZhZmZpbmVfbWF0cml4MSwgbV9mb250Q29sb3IsDQorICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgIH0NCisgIEZYX0ZyZWUocENoYXJQb3MpOw0KK30NCit2b2lkIENCQ19PbmVkVVBDQVdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChjb250ZW50cywgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmgKaW5kZXggN2JhM2I5Ni4uODg2MTY0YyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuaApAQCAtOSwyMyArOSw0MSBAQAogY2xhc3MgQ0JDX1dyaXRlcjsNCiBjbGFzcyBDQkNfT25lZEVBTjEzV3JpdGVyOw0KIGNsYXNzIENCQ19PbmVkVVBDQVdyaXRlcjsNCi1jbGFzcyBDQkNfT25lZFVQQ0FXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlcg0KLXsNCi1wcml2YXRlOg0KLSAgICBDQkNfT25lZEVBTjEzV3JpdGVyICptX3N1YldyaXRlcjsNCi1wdWJsaWM6DQotICAgIENCQ19PbmVkVVBDQVdyaXRlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfT25lZFVQQ0FXcml0ZXIoKTsNCi0gICAgdmlydHVhbCB2b2lkIEluaXQoKTsNCi0gICAgdWludDhfdCoJRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90ICZlKTsNCi0gICAgdWludDhfdCoJRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKTsNCi0gICAgdm9pZAkJUmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIHVpbnQ4X3QqIGNvZGUsIGludDMyX3QgY29kZUxlbmd0aCwgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wJCQlDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQotICAgIGludDMyX3QJQ2FsY0NoZWNrc3VtKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cyk7DQorY2xhc3MgQ0JDX09uZWRVUENBV3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXIgew0KKyBwcml2YXRlOg0KKyAgQ0JDX09uZWRFQU4xM1dyaXRlciogbV9zdWJXcml0ZXI7DQogDQotcHJvdGVjdGVkOg0KKyBwdWJsaWM6DQorICBDQkNfT25lZFVQQ0FXcml0ZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19PbmVkVVBDQVdyaXRlcigpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdm9pZCBSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBpbnQzMl90IENhbGNDaGVja3N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMpOw0KIA0KLSAgICB2b2lkCQlTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgQ0ZYX0RJQml0bWFwICpwT3V0Qml0bWFwLCBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwgaW50MzJfdCBiYXJXaWR0aCwgaW50MzJfdCBtdWx0aXBsZSwgaW50MzJfdCAmZSk7DQorIHByb3RlY3RlZDoNCisgIHZvaWQgU2hvd0NoYXJzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPdXRCaXRtYXAsDQorICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBtdWx0aXBsZSwNCisgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmNwcAppbmRleCAzNjZiMTcyLi5jMzFlYmY2IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmNwcApAQCAtMzAsNjYzICszMCw1NTcgQEAKIGludDMyX3QgQ0JDX1BERjQxNzo6U1RBUlRfUEFUVEVSTiA9IDB4MWZlYTg7DQogaW50MzJfdCBDQkNfUERGNDE3OjpTVE9QX1BBVFRFUk4gPSAweDNmYTI5Ow0KIGludDMyX3QgQ0JDX1BERjQxNzo6Q09ERVdPUkRfVEFCTEVbXVsxMDAwXSA9IHsNCi0gICAgew0KLSAgICAgICAgMHgxZDVjMCwgMHgxZWFmMCwgMHgxZjU3YywgMHgxZDRlMCwgMHgxZWE3OCwgMHgxZjUzZSwNCi0gICAgICAgIDB4MWE4YzAsIDB4MWQ0NzAsIDB4MWE4NjAsIDB4MTUwNDAsIDB4MWE4MzAsIDB4MTUwMjAsDQotICAgICAgICAweDFhZGMwLCAweDFkNmYwLCAweDFlYjdjLCAweDFhY2UwLCAweDFkNjc4LCAweDFlYjNlLA0KLSAgICAgICAgMHgxNThjMCwgMHgxYWM3MCwgMHgxNTg2MCwgMHgxNWRjMCwgMHgxYWVmMCwgMHgxZDc3YywNCi0gICAgICAgIDB4MTVjZTAsIDB4MWFlNzgsIDB4MWQ3M2UsIDB4MTVjNzAsIDB4MWFlM2MsIDB4MTVlZjAsDQotICAgICAgICAweDFhZjdjLCAweDE1ZTc4LCAweDFhZjNlLCAweDE1ZjdjLCAweDFmNWZhLCAweDFkMmUwLA0KLSAgICAgICAgMHgxZTk3OCwgMHgxZjRiZSwgMHgxYTRjMCwgMHgxZDI3MCwgMHgxZTkzYywgMHgxYTQ2MCwNCi0gICAgICAgIDB4MWQyMzgsIDB4MTQ4NDAsIDB4MWE0MzAsIDB4MWQyMWMsIDB4MTQ4MjAsIDB4MWE0MTgsDQotICAgICAgICAweDE0ODEwLCAweDFhNmUwLCAweDFkMzc4LCAweDFlOWJlLCAweDE0Y2MwLCAweDFhNjcwLA0KLSAgICAgICAgMHgxZDMzYywgMHgxNGM2MCwgMHgxYTYzOCwgMHgxZDMxZSwgMHgxNGMzMCwgMHgxYTYxYywNCi0gICAgICAgIDB4MTRlZTAsIDB4MWE3NzgsIDB4MWQzYmUsIDB4MTRlNzAsIDB4MWE3M2MsIDB4MTRlMzgsDQotICAgICAgICAweDFhNzFlLCAweDE0Zjc4LCAweDFhN2JlLCAweDE0ZjNjLCAweDE0ZjFlLCAweDFhMmMwLA0KLSAgICAgICAgMHgxZDE3MCwgMHgxZThiYywgMHgxYTI2MCwgMHgxZDEzOCwgMHgxZTg5ZSwgMHgxNDQ0MCwNCi0gICAgICAgIDB4MWEyMzAsIDB4MWQxMWMsIDB4MTQ0MjAsIDB4MWEyMTgsIDB4MTQ0MTAsIDB4MTQ0MDgsDQotICAgICAgICAweDE0NmMwLCAweDFhMzcwLCAweDFkMWJjLCAweDE0NjYwLCAweDFhMzM4LCAweDFkMTllLA0KLSAgICAgICAgMHgxNDYzMCwgMHgxYTMxYywgMHgxNDYxOCwgMHgxNDYwYywgMHgxNDc3MCwgMHgxYTNiYywNCi0gICAgICAgIDB4MTQ3MzgsIDB4MWEzOWUsIDB4MTQ3MWMsIDB4MTQ3YmMsIDB4MWExNjAsIDB4MWQwYjgsDQotICAgICAgICAweDFlODVlLCAweDE0MjQwLCAweDFhMTMwLCAweDFkMDljLCAweDE0MjIwLCAweDFhMTE4LA0KLSAgICAgICAgMHgxZDA4ZSwgMHgxNDIxMCwgMHgxYTEwYywgMHgxNDIwOCwgMHgxYTEwNiwgMHgxNDM2MCwNCi0gICAgICAgIDB4MWExYjgsIDB4MWQwZGUsIDB4MTQzMzAsIDB4MWExOWMsIDB4MTQzMTgsIDB4MWExOGUsDQotICAgICAgICAweDE0MzBjLCAweDE0MzA2LCAweDFhMWRlLCAweDE0MzhlLCAweDE0MTQwLCAweDFhMGIwLA0KLSAgICAgICAgMHgxZDA1YywgMHgxNDEyMCwgMHgxYTA5OCwgMHgxZDA0ZSwgMHgxNDExMCwgMHgxYTA4YywNCi0gICAgICAgIDB4MTQxMDgsIDB4MWEwODYsIDB4MTQxMDQsIDB4MTQxYjAsIDB4MTQxOTgsIDB4MTQxOGMsDQotICAgICAgICAweDE0MGEwLCAweDFkMDJlLCAweDFhMDRjLCAweDFhMDQ2LCAweDE0MDgyLCAweDFjYWUwLA0KLSAgICAgICAgMHgxZTU3OCwgMHgxZjJiZSwgMHgxOTRjMCwgMHgxY2E3MCwgMHgxZTUzYywgMHgxOTQ2MCwNCi0gICAgICAgIDB4MWNhMzgsIDB4MWU1MWUsIDB4MTI4NDAsIDB4MTk0MzAsIDB4MTI4MjAsIDB4MTk2ZTAsDQotICAgICAgICAweDFjYjc4LCAweDFlNWJlLCAweDEyY2MwLCAweDE5NjcwLCAweDFjYjNjLCAweDEyYzYwLA0KLSAgICAgICAgMHgxOTYzOCwgMHgxMmMzMCwgMHgxMmMxOCwgMHgxMmVlMCwgMHgxOTc3OCwgMHgxY2JiZSwNCi0gICAgICAgIDB4MTJlNzAsIDB4MTk3M2MsIDB4MTJlMzgsIDB4MTJlMWMsIDB4MTJmNzgsIDB4MTk3YmUsDQotICAgICAgICAweDEyZjNjLCAweDEyZmJlLCAweDFkYWMwLCAweDFlZDcwLCAweDFmNmJjLCAweDFkYTYwLA0KLSAgICAgICAgMHgxZWQzOCwgMHgxZjY5ZSwgMHgxYjQ0MCwgMHgxZGEzMCwgMHgxZWQxYywgMHgxYjQyMCwNCi0gICAgICAgIDB4MWRhMTgsIDB4MWVkMGUsIDB4MWI0MTAsIDB4MWRhMGMsIDB4MTkyYzAsIDB4MWM5NzAsDQotICAgICAgICAweDFlNGJjLCAweDFiNmMwLCAweDE5MjYwLCAweDFjOTM4LCAweDFlNDllLCAweDFiNjYwLA0KLSAgICAgICAgMHgxZGIzOCwgMHgxZWQ5ZSwgMHgxNmM0MCwgMHgxMjQyMCwgMHgxOTIxOCwgMHgxYzkwZSwNCi0gICAgICAgIDB4MTZjMjAsIDB4MWI2MTgsIDB4MTZjMTAsIDB4MTI2YzAsIDB4MTkzNzAsIDB4MWM5YmMsDQotICAgICAgICAweDE2ZWMwLCAweDEyNjYwLCAweDE5MzM4LCAweDFjOTllLCAweDE2ZTYwLCAweDFiNzM4LA0KLSAgICAgICAgMHgxZGI5ZSwgMHgxNmUzMCwgMHgxMjYxOCwgMHgxNmUxOCwgMHgxMjc3MCwgMHgxOTNiYywNCi0gICAgICAgIDB4MTZmNzAsIDB4MTI3MzgsIDB4MTkzOWUsIDB4MTZmMzgsIDB4MWI3OWUsIDB4MTZmMWMsDQotICAgICAgICAweDEyN2JjLCAweDE2ZmJjLCAweDEyNzllLCAweDE2ZjllLCAweDFkOTYwLCAweDFlY2I4LA0KLSAgICAgICAgMHgxZjY1ZSwgMHgxYjI0MCwgMHgxZDkzMCwgMHgxZWM5YywgMHgxYjIyMCwgMHgxZDkxOCwNCi0gICAgICAgIDB4MWVjOGUsIDB4MWIyMTAsIDB4MWQ5MGMsIDB4MWIyMDgsIDB4MWIyMDQsIDB4MTkxNjAsDQotICAgICAgICAweDFjOGI4LCAweDFlNDVlLCAweDFiMzYwLCAweDE5MTMwLCAweDFjODljLCAweDE2NjQwLA0KLSAgICAgICAgMHgxMjIyMCwgMHgxZDk5YywgMHgxYzg4ZSwgMHgxNjYyMCwgMHgxMjIxMCwgMHgxOTEwYywNCi0gICAgICAgIDB4MTY2MTAsIDB4MWIzMGMsIDB4MTkxMDYsIDB4MTIyMDQsIDB4MTIzNjAsIDB4MTkxYjgsDQotICAgICAgICAweDFjOGRlLCAweDE2NzYwLCAweDEyMzMwLCAweDE5MTljLCAweDE2NzMwLCAweDFiMzljLA0KLSAgICAgICAgMHgxOTE4ZSwgMHgxNjcxOCwgMHgxMjMwYywgMHgxMjMwNiwgMHgxMjNiOCwgMHgxOTFkZSwNCi0gICAgICAgIDB4MTY3YjgsIDB4MTIzOWMsIDB4MTY3OWMsIDB4MTIzOGUsIDB4MTY3OGUsIDB4MTY3ZGUsDQotICAgICAgICAweDFiMTQwLCAweDFkOGIwLCAweDFlYzVjLCAweDFiMTIwLCAweDFkODk4LCAweDFlYzRlLA0KLSAgICAgICAgMHgxYjExMCwgMHgxZDg4YywgMHgxYjEwOCwgMHgxZDg4NiwgMHgxYjEwNCwgMHgxYjEwMiwNCi0gICAgICAgIDB4MTIxNDAsIDB4MTkwYjAsIDB4MWM4NWMsIDB4MTYzNDAsIDB4MTIxMjAsIDB4MTkwOTgsDQotICAgICAgICAweDFjODRlLCAweDE2MzIwLCAweDFiMTk4LCAweDFkOGNlLCAweDE2MzEwLCAweDEyMTA4LA0KLSAgICAgICAgMHgxOTA4NiwgMHgxNjMwOCwgMHgxYjE4NiwgMHgxNjMwNCwgMHgxMjFiMCwgMHgxOTBkYywNCi0gICAgICAgIDB4MTYzYjAsIDB4MTIxOTgsIDB4MTkwY2UsIDB4MTYzOTgsIDB4MWIxY2UsIDB4MTYzOGMsDQotICAgICAgICAweDEyMTg2LCAweDE2Mzg2LCAweDE2M2RjLCAweDE2M2NlLCAweDFiMGEwLCAweDFkODU4LA0KLSAgICAgICAgMHgxZWMyZSwgMHgxYjA5MCwgMHgxZDg0YywgMHgxYjA4OCwgMHgxZDg0NiwgMHgxYjA4NCwNCi0gICAgICAgIDB4MWIwODIsIDB4MTIwYTAsIDB4MTkwNTgsIDB4MWM4MmUsIDB4MTYxYTAsIDB4MTIwOTAsDQotICAgICAgICAweDE5MDRjLCAweDE2MTkwLCAweDFiMGNjLCAweDE5MDQ2LCAweDE2MTg4LCAweDEyMDg0LA0KLSAgICAgICAgMHgxNjE4NCwgMHgxMjA4MiwgMHgxMjBkOCwgMHgxNjFkOCwgMHgxNjFjYywgMHgxNjFjNiwNCi0gICAgICAgIDB4MWQ4MmMsIDB4MWQ4MjYsIDB4MWIwNDIsIDB4MTkwMmMsIDB4MTIwNDgsIDB4MTYwYzgsDQotICAgICAgICAweDE2MGM0LCAweDE2MGMyLCAweDE4YWMwLCAweDFjNTcwLCAweDFlMmJjLCAweDE4YTYwLA0KLSAgICAgICAgMHgxYzUzOCwgMHgxMTQ0MCwgMHgxOGEzMCwgMHgxYzUxYywgMHgxMTQyMCwgMHgxOGExOCwNCi0gICAgICAgIDB4MTE0MTAsIDB4MTE0MDgsIDB4MTE2YzAsIDB4MThiNzAsIDB4MWM1YmMsIDB4MTE2NjAsDQotICAgICAgICAweDE4YjM4LCAweDFjNTllLCAweDExNjMwLCAweDE4YjFjLCAweDExNjE4LCAweDExNjBjLA0KLSAgICAgICAgMHgxMTc3MCwgMHgxOGJiYywgMHgxMTczOCwgMHgxOGI5ZSwgMHgxMTcxYywgMHgxMTdiYywNCi0gICAgICAgIDB4MTE3OWUsIDB4MWNkNjAsIDB4MWU2YjgsIDB4MWYzNWUsIDB4MTlhNDAsIDB4MWNkMzAsDQotICAgICAgICAweDFlNjljLCAweDE5YTIwLCAweDFjZDE4LCAweDFlNjhlLCAweDE5YTEwLCAweDFjZDBjLA0KLSAgICAgICAgMHgxOWEwOCwgMHgxY2QwNiwgMHgxODk2MCwgMHgxYzRiOCwgMHgxZTI1ZSwgMHgxOWI2MCwNCi0gICAgICAgIDB4MTg5MzAsIDB4MWM0OWMsIDB4MTM2NDAsIDB4MTEyMjAsIDB4MWNkOWMsIDB4MWM0OGUsDQotICAgICAgICAweDEzNjIwLCAweDE5YjE4LCAweDE4OTBjLCAweDEzNjEwLCAweDExMjA4LCAweDEzNjA4LA0KLSAgICAgICAgMHgxMTM2MCwgMHgxODliOCwgMHgxYzRkZSwgMHgxMzc2MCwgMHgxMTMzMCwgMHgxY2RkZSwNCi0gICAgICAgIDB4MTM3MzAsIDB4MTliOWMsIDB4MTg5OGUsIDB4MTM3MTgsIDB4MTEzMGMsIDB4MTM3MGMsDQotICAgICAgICAweDExM2I4LCAweDE4OWRlLCAweDEzN2I4LCAweDExMzljLCAweDEzNzljLCAweDExMzhlLA0KLSAgICAgICAgMHgxMTNkZSwgMHgxMzdkZSwgMHgxZGQ0MCwgMHgxZWViMCwgMHgxZjc1YywgMHgxZGQyMCwNCi0gICAgICAgIDB4MWVlOTgsIDB4MWY3NGUsIDB4MWRkMTAsIDB4MWVlOGMsIDB4MWRkMDgsIDB4MWVlODYsDQotICAgICAgICAweDFkZDA0LCAweDE5OTQwLCAweDFjY2IwLCAweDFlNjVjLCAweDFiYjQwLCAweDE5OTIwLA0KLSAgICAgICAgMHgxZWVkYywgMHgxZTY0ZSwgMHgxYmIyMCwgMHgxZGQ5OCwgMHgxZWVjZSwgMHgxYmIxMCwNCi0gICAgICAgIDB4MTk5MDgsIDB4MWNjODYsIDB4MWJiMDgsIDB4MWRkODYsIDB4MTk5MDIsIDB4MTExNDAsDQotICAgICAgICAweDE4OGIwLCAweDFjNDVjLCAweDEzMzQwLCAweDExMTIwLCAweDE4ODk4LCAweDFjNDRlLA0KLSAgICAgICAgMHgxNzc0MCwgMHgxMzMyMCwgMHgxOTk5OCwgMHgxY2NjZSwgMHgxNzcyMCwgMHgxYmI5OCwNCi0gICAgICAgIDB4MWRkY2UsIDB4MTg4ODYsIDB4MTc3MTAsIDB4MTMzMDgsIDB4MTk5ODYsIDB4MTc3MDgsDQotICAgICAgICAweDExMTAyLCAweDExMWIwLCAweDE4OGRjLCAweDEzM2IwLCAweDExMTk4LCAweDE4OGNlLA0KLSAgICAgICAgMHgxNzdiMCwgMHgxMzM5OCwgMHgxOTljZSwgMHgxNzc5OCwgMHgxYmJjZSwgMHgxMTE4NiwNCi0gICAgICAgIDB4MTMzODYsIDB4MTExZGMsIDB4MTMzZGMsIDB4MTExY2UsIDB4MTc3ZGMsIDB4MTMzY2UsDQotICAgICAgICAweDFkY2EwLCAweDFlZTU4LCAweDFmNzJlLCAweDFkYzkwLCAweDFlZTRjLCAweDFkYzg4LA0KLSAgICAgICAgMHgxZWU0NiwgMHgxZGM4NCwgMHgxZGM4MiwgMHgxOThhMCwgMHgxY2M1OCwgMHgxZTYyZSwNCi0gICAgICAgIDB4MWI5YTAsIDB4MTk4OTAsIDB4MWVlNmUsIDB4MWI5OTAsIDB4MWRjY2MsIDB4MWNjNDYsDQotICAgICAgICAweDFiOTg4LCAweDE5ODg0LCAweDFiOTg0LCAweDE5ODgyLCAweDFiOTgyLCAweDExMGEwLA0KLSAgICAgICAgMHgxODg1OCwgMHgxYzQyZSwgMHgxMzFhMCwgMHgxMTA5MCwgMHgxODg0YywgMHgxNzNhMCwNCi0gICAgICAgIDB4MTMxOTAsIDB4MTk4Y2MsIDB4MTg4NDYsIDB4MTczOTAsIDB4MWI5Y2MsIDB4MTEwODQsDQotICAgICAgICAweDE3Mzg4LCAweDEzMTg0LCAweDExMDgyLCAweDEzMTgyLCAweDExMGQ4LCAweDE4ODZlLA0KLSAgICAgICAgMHgxMzFkOCwgMHgxMTBjYywgMHgxNzNkOCwgMHgxMzFjYywgMHgxMTBjNiwgMHgxNzNjYywNCi0gICAgICAgIDB4MTMxYzYsIDB4MTEwZWUsIDB4MTczZWUsIDB4MWRjNTAsIDB4MWVlMmMsIDB4MWRjNDgsDQotICAgICAgICAweDFlZTI2LCAweDFkYzQ0LCAweDFkYzQyLCAweDE5ODUwLCAweDFjYzJjLCAweDFiOGQwLA0KLSAgICAgICAgMHgxOTg0OCwgMHgxY2MyNiwgMHgxYjhjOCwgMHgxZGM2NiwgMHgxYjhjNCwgMHgxOTg0MiwNCi0gICAgICAgIDB4MWI4YzIsIDB4MTEwNTAsIDB4MTg4MmMsIDB4MTMwZDAsIDB4MTEwNDgsIDB4MTg4MjYsDQotICAgICAgICAweDE3MWQwLCAweDEzMGM4LCAweDE5ODY2LCAweDE3MWM4LCAweDFiOGU2LCAweDExMDQyLA0KLSAgICAgICAgMHgxNzFjNCwgMHgxMzBjMiwgMHgxNzFjMiwgMHgxMzBlYywgMHgxNzFlYywgMHgxNzFlNiwNCi0gICAgICAgIDB4MWVlMTYsIDB4MWRjMjIsIDB4MWNjMTYsIDB4MTk4MjQsIDB4MTk4MjIsIDB4MTEwMjgsDQotICAgICAgICAweDEzMDY4LCAweDE3MGU4LCAweDExMDIyLCAweDEzMDYyLCAweDE4NTYwLCAweDEwYTQwLA0KLSAgICAgICAgMHgxODUzMCwgMHgxMGEyMCwgMHgxODUxOCwgMHgxYzI4ZSwgMHgxMGExMCwgMHgxODUwYywNCi0gICAgICAgIDB4MTBhMDgsIDB4MTg1MDYsIDB4MTBiNjAsIDB4MTg1YjgsIDB4MWMyZGUsIDB4MTBiMzAsDQotICAgICAgICAweDE4NTljLCAweDEwYjE4LCAweDE4NThlLCAweDEwYjBjLCAweDEwYjA2LCAweDEwYmI4LA0KLSAgICAgICAgMHgxODVkZSwgMHgxMGI5YywgMHgxMGI4ZSwgMHgxMGJkZSwgMHgxOGQ0MCwgMHgxYzZiMCwNCi0gICAgICAgIDB4MWUzNWMsIDB4MThkMjAsIDB4MWM2OTgsIDB4MThkMTAsIDB4MWM2OGMsIDB4MThkMDgsDQotICAgICAgICAweDFjNjg2LCAweDE4ZDA0LCAweDEwOTQwLCAweDE4NGIwLCAweDFjMjVjLCAweDExYjQwLA0KLSAgICAgICAgMHgxMDkyMCwgMHgxYzZkYywgMHgxYzI0ZSwgMHgxMWIyMCwgMHgxOGQ5OCwgMHgxYzZjZSwNCi0gICAgICAgIDB4MTFiMTAsIDB4MTA5MDgsIDB4MTg0ODYsIDB4MTFiMDgsIDB4MThkODYsIDB4MTA5MDIsDQotICAgICAgICAweDEwOWIwLCAweDE4NGRjLCAweDExYmIwLCAweDEwOTk4LCAweDE4NGNlLCAweDExYjk4LA0KLSAgICAgICAgMHgxOGRjZSwgMHgxMWI4YywgMHgxMDk4NiwgMHgxMDlkYywgMHgxMWJkYywgMHgxMDljZSwNCi0gICAgICAgIDB4MTFiY2UsIDB4MWNlYTAsIDB4MWU3NTgsIDB4MWYzYWUsIDB4MWNlOTAsIDB4MWU3NGMsDQotICAgICAgICAweDFjZTg4LCAweDFlNzQ2LCAweDFjZTg0LCAweDFjZTgyLCAweDE4Y2EwLCAweDFjNjU4LA0KLSAgICAgICAgMHgxOWRhMCwgMHgxOGM5MCwgMHgxYzY0YywgMHgxOWQ5MCwgMHgxY2VjYywgMHgxYzY0NiwNCi0gICAgICAgIDB4MTlkODgsIDB4MThjODQsIDB4MTlkODQsIDB4MThjODIsIDB4MTlkODIsIDB4MTA4YTAsDQotICAgICAgICAweDE4NDU4LCAweDExOWEwLCAweDEwODkwLCAweDFjNjZlLCAweDEzYmEwLCAweDExOTkwLA0KLSAgICAgICAgMHgxOGNjYywgMHgxODQ0NiwgMHgxM2I5MCwgMHgxOWRjYywgMHgxMDg4NCwgMHgxM2I4OCwNCi0gICAgICAgIDB4MTE5ODQsIDB4MTA4ODIsIDB4MTE5ODIsIDB4MTA4ZDgsIDB4MTg0NmUsIDB4MTE5ZDgsDQotICAgICAgICAweDEwOGNjLCAweDEzYmQ4LCAweDExOWNjLCAweDEwOGM2LCAweDEzYmNjLCAweDExOWM2LA0KLSAgICAgICAgMHgxMDhlZSwgMHgxMTllZSwgMHgxM2JlZSwgMHgxZWY1MCwgMHgxZjdhYywgMHgxZWY0OCwNCi0gICAgICAgIDB4MWY3YTYsIDB4MWVmNDQsIDB4MWVmNDIsIDB4MWNlNTAsIDB4MWU3MmMsIDB4MWRlZDAsDQotICAgICAgICAweDFlZjZjLCAweDFlNzI2LCAweDFkZWM4LCAweDFlZjY2LCAweDFkZWM0LCAweDFjZTQyLA0KLSAgICAgICAgMHgxZGVjMiwgMHgxOGM1MCwgMHgxYzYyYywgMHgxOWNkMCwgMHgxOGM0OCwgMHgxYzYyNiwNCi0gICAgICAgIDB4MWJkZDAsIDB4MTljYzgsIDB4MWNlNjYsIDB4MWJkYzgsIDB4MWRlZTYsIDB4MThjNDIsDQotICAgICAgICAweDFiZGM0LCAweDE5Y2MyLCAweDFiZGMyLCAweDEwODUwLCAweDE4NDJjLCAweDExOGQwLA0KLSAgICAgICAgMHgxMDg0OCwgMHgxODQyNiwgMHgxMzlkMCwgMHgxMThjOCwgMHgxOGM2NiwgMHgxN2JkMCwNCi0gICAgICAgIDB4MTM5YzgsIDB4MTljZTYsIDB4MTA4NDIsIDB4MTdiYzgsIDB4MWJkZTYsIDB4MTE4YzIsDQotICAgICAgICAweDE3YmM0LCAweDEwODZjLCAweDExOGVjLCAweDEwODY2LCAweDEzOWVjLCAweDExOGU2LA0KLSAgICAgICAgMHgxN2JlYywgMHgxMzllNiwgMHgxN2JlNiwgMHgxZWYyOCwgMHgxZjc5NiwgMHgxZWYyNCwNCi0gICAgICAgIDB4MWVmMjIsIDB4MWNlMjgsIDB4MWU3MTYsIDB4MWRlNjgsIDB4MWVmMzYsIDB4MWRlNjQsDQotICAgICAgICAweDFjZTIyLCAweDFkZTYyLCAweDE4YzI4LCAweDFjNjE2LCAweDE5YzY4LCAweDE4YzI0LA0KLSAgICAgICAgMHgxYmNlOCwgMHgxOWM2NCwgMHgxOGMyMiwgMHgxYmNlNCwgMHgxOWM2MiwgMHgxYmNlMiwNCi0gICAgICAgIDB4MTA4MjgsIDB4MTg0MTYsIDB4MTE4NjgsIDB4MThjMzYsIDB4MTM4ZTgsIDB4MTE4NjQsDQotICAgICAgICAweDEwODIyLCAweDE3OWU4LCAweDEzOGU0LCAweDExODYyLCAweDE3OWU0LCAweDEzOGUyLA0KLSAgICAgICAgMHgxNzllMiwgMHgxMTg3NiwgMHgxNzlmNiwgMHgxZWYxMiwgMHgxZGUzNCwgMHgxZGUzMiwNCi0gICAgICAgIDB4MTljMzQsIDB4MWJjNzQsIDB4MWJjNzIsIDB4MTE4MzQsIDB4MTM4NzQsIDB4MTc4ZjQsDQotICAgICAgICAweDE3OGYyLCAweDEwNTQwLCAweDEwNTIwLCAweDE4Mjk4LCAweDEwNTEwLCAweDEwNTA4LA0KLSAgICAgICAgMHgxMDUwNCwgMHgxMDViMCwgMHgxMDU5OCwgMHgxMDU4YywgMHgxMDU4NiwgMHgxMDVkYywNCi0gICAgICAgIDB4MTA1Y2UsIDB4MTg2YTAsIDB4MTg2OTAsIDB4MWMzNGMsIDB4MTg2ODgsIDB4MWMzNDYsDQotICAgICAgICAweDE4Njg0LCAweDE4NjgyLCAweDEwNGEwLCAweDE4MjU4LCAweDEwZGEwLCAweDE4NmQ4LA0KLSAgICAgICAgMHgxODI0YywgMHgxMGQ5MCwgMHgxODZjYywgMHgxMGQ4OCwgMHgxODZjNiwgMHgxMGQ4NCwNCi0gICAgICAgIDB4MTA0ODIsIDB4MTBkODIsIDB4MTA0ZDgsIDB4MTgyNmUsIDB4MTBkZDgsIDB4MTg2ZWUsDQotICAgICAgICAweDEwZGNjLCAweDEwNGM2LCAweDEwZGM2LCAweDEwNGVlLCAweDEwZGVlLCAweDFjNzUwLA0KLSAgICAgICAgMHgxYzc0OCwgMHgxYzc0NCwgMHgxYzc0MiwgMHgxODY1MCwgMHgxOGVkMCwgMHgxYzc2YywNCi0gICAgICAgIDB4MWMzMjYsIDB4MThlYzgsIDB4MWM3NjYsIDB4MThlYzQsIDB4MTg2NDIsIDB4MThlYzIsDQotICAgICAgICAweDEwNDUwLCAweDEwY2QwLCAweDEwNDQ4LCAweDE4MjI2LCAweDExZGQwLCAweDEwY2M4LA0KLSAgICAgICAgMHgxMDQ0NCwgMHgxMWRjOCwgMHgxMGNjNCwgMHgxMDQ0MiwgMHgxMWRjNCwgMHgxMGNjMiwNCi0gICAgICAgIDB4MTA0NmMsIDB4MTBjZWMsIDB4MTA0NjYsIDB4MTFkZWMsIDB4MTBjZTYsIDB4MTFkZTYsDQotICAgICAgICAweDFlN2E4LCAweDFlN2E0LCAweDFlN2EyLCAweDFjNzI4LCAweDFjZjY4LCAweDFlN2I2LA0KLSAgICAgICAgMHgxY2Y2NCwgMHgxYzcyMiwgMHgxY2Y2MiwgMHgxODYyOCwgMHgxYzMxNiwgMHgxOGU2OCwNCi0gICAgICAgIDB4MWM3MzYsIDB4MTllZTgsIDB4MThlNjQsIDB4MTg2MjIsIDB4MTllZTQsIDB4MThlNjIsDQotICAgICAgICAweDE5ZWUyLCAweDEwNDI4LCAweDE4MjE2LCAweDEwYzY4LCAweDE4NjM2LCAweDExY2U4LA0KLSAgICAgICAgMHgxMGM2NCwgMHgxMDQyMiwgMHgxM2RlOCwgMHgxMWNlNCwgMHgxMGM2MiwgMHgxM2RlNCwNCi0gICAgICAgIDB4MTFjZTIsIDB4MTA0MzYsIDB4MTBjNzYsIDB4MTFjZjYsIDB4MTNkZjYsIDB4MWY3ZDQsDQotICAgICAgICAweDFmN2QyLCAweDFlNzk0LCAweDFlZmI0LCAweDFlNzkyLCAweDFlZmIyLCAweDFjNzE0LA0KLSAgICAgICAgMHgxY2YzNCwgMHgxYzcxMiwgMHgxZGY3NCwgMHgxY2YzMiwgMHgxZGY3MiwgMHgxODYxNCwNCi0gICAgICAgIDB4MThlMzQsIDB4MTg2MTIsIDB4MTllNzQsIDB4MThlMzIsIDB4MWJlZjQNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgMHgxZjU2MCwgMHgxZmFiOCwgMHgxZWE0MCwgMHgxZjUzMCwgMHgxZmE5YywgMHgxZWEyMCwNCi0gICAgICAgIDB4MWY1MTgsIDB4MWZhOGUsIDB4MWVhMTAsIDB4MWY1MGMsIDB4MWVhMDgsIDB4MWY1MDYsDQotICAgICAgICAweDFlYTA0LCAweDFlYjYwLCAweDFmNWI4LCAweDFmYWRlLCAweDFkNjQwLCAweDFlYjMwLA0KLSAgICAgICAgMHgxZjU5YywgMHgxZDYyMCwgMHgxZWIxOCwgMHgxZjU4ZSwgMHgxZDYxMCwgMHgxZWIwYywNCi0gICAgICAgIDB4MWQ2MDgsIDB4MWViMDYsIDB4MWQ2MDQsIDB4MWQ3NjAsIDB4MWViYjgsIDB4MWY1ZGUsDQotICAgICAgICAweDFhZTQwLCAweDFkNzMwLCAweDFlYjljLCAweDFhZTIwLCAweDFkNzE4LCAweDFlYjhlLA0KLSAgICAgICAgMHgxYWUxMCwgMHgxZDcwYywgMHgxYWUwOCwgMHgxZDcwNiwgMHgxYWUwNCwgMHgxYWY2MCwNCi0gICAgICAgIDB4MWQ3YjgsIDB4MWViZGUsIDB4MTVlNDAsIDB4MWFmMzAsIDB4MWQ3OWMsIDB4MTVlMjAsDQotICAgICAgICAweDFhZjE4LCAweDFkNzhlLCAweDE1ZTEwLCAweDFhZjBjLCAweDE1ZTA4LCAweDFhZjA2LA0KLSAgICAgICAgMHgxNWY2MCwgMHgxYWZiOCwgMHgxZDdkZSwgMHgxNWYzMCwgMHgxYWY5YywgMHgxNWYxOCwNCi0gICAgICAgIDB4MWFmOGUsIDB4MTVmMGMsIDB4MTVmYjgsIDB4MWFmZGUsIDB4MTVmOWMsIDB4MTVmOGUsDQotICAgICAgICAweDFlOTQwLCAweDFmNGIwLCAweDFmYTVjLCAweDFlOTIwLCAweDFmNDk4LCAweDFmYTRlLA0KLSAgICAgICAgMHgxZTkxMCwgMHgxZjQ4YywgMHgxZTkwOCwgMHgxZjQ4NiwgMHgxZTkwNCwgMHgxZTkwMiwNCi0gICAgICAgIDB4MWQzNDAsIDB4MWU5YjAsIDB4MWY0ZGMsIDB4MWQzMjAsIDB4MWU5OTgsIDB4MWY0Y2UsDQotICAgICAgICAweDFkMzEwLCAweDFlOThjLCAweDFkMzA4LCAweDFlOTg2LCAweDFkMzA0LCAweDFkMzAyLA0KLSAgICAgICAgMHgxYTc0MCwgMHgxZDNiMCwgMHgxZTlkYywgMHgxYTcyMCwgMHgxZDM5OCwgMHgxZTljZSwNCi0gICAgICAgIDB4MWE3MTAsIDB4MWQzOGMsIDB4MWE3MDgsIDB4MWQzODYsIDB4MWE3MDQsIDB4MWE3MDIsDQotICAgICAgICAweDE0ZjQwLCAweDFhN2IwLCAweDFkM2RjLCAweDE0ZjIwLCAweDFhNzk4LCAweDFkM2NlLA0KLSAgICAgICAgMHgxNGYxMCwgMHgxYTc4YywgMHgxNGYwOCwgMHgxYTc4NiwgMHgxNGYwNCwgMHgxNGZiMCwNCi0gICAgICAgIDB4MWE3ZGMsIDB4MTRmOTgsIDB4MWE3Y2UsIDB4MTRmOGMsIDB4MTRmODYsIDB4MTRmZGMsDQotICAgICAgICAweDE0ZmNlLCAweDFlOGEwLCAweDFmNDU4LCAweDFmYTJlLCAweDFlODkwLCAweDFmNDRjLA0KLSAgICAgICAgMHgxZTg4OCwgMHgxZjQ0NiwgMHgxZTg4NCwgMHgxZTg4MiwgMHgxZDFhMCwgMHgxZThkOCwNCi0gICAgICAgIDB4MWY0NmUsIDB4MWQxOTAsIDB4MWU4Y2MsIDB4MWQxODgsIDB4MWU4YzYsIDB4MWQxODQsDQotICAgICAgICAweDFkMTgyLCAweDFhM2EwLCAweDFkMWQ4LCAweDFlOGVlLCAweDFhMzkwLCAweDFkMWNjLA0KLSAgICAgICAgMHgxYTM4OCwgMHgxZDFjNiwgMHgxYTM4NCwgMHgxYTM4MiwgMHgxNDdhMCwgMHgxYTNkOCwNCi0gICAgICAgIDB4MWQxZWUsIDB4MTQ3OTAsIDB4MWEzY2MsIDB4MTQ3ODgsIDB4MWEzYzYsIDB4MTQ3ODQsDQotICAgICAgICAweDE0NzgyLCAweDE0N2Q4LCAweDFhM2VlLCAweDE0N2NjLCAweDE0N2M2LCAweDE0N2VlLA0KLSAgICAgICAgMHgxZTg1MCwgMHgxZjQyYywgMHgxZTg0OCwgMHgxZjQyNiwgMHgxZTg0NCwgMHgxZTg0MiwNCi0gICAgICAgIDB4MWQwZDAsIDB4MWU4NmMsIDB4MWQwYzgsIDB4MWU4NjYsIDB4MWQwYzQsIDB4MWQwYzIsDQotICAgICAgICAweDFhMWQwLCAweDFkMGVjLCAweDFhMWM4LCAweDFkMGU2LCAweDFhMWM0LCAweDFhMWMyLA0KLSAgICAgICAgMHgxNDNkMCwgMHgxYTFlYywgMHgxNDNjOCwgMHgxYTFlNiwgMHgxNDNjNCwgMHgxNDNjMiwNCi0gICAgICAgIDB4MTQzZWMsIDB4MTQzZTYsIDB4MWU4MjgsIDB4MWY0MTYsIDB4MWU4MjQsIDB4MWU4MjIsDQotICAgICAgICAweDFkMDY4LCAweDFlODM2LCAweDFkMDY0LCAweDFkMDYyLCAweDFhMGU4LCAweDFkMDc2LA0KLSAgICAgICAgMHgxYTBlNCwgMHgxYTBlMiwgMHgxNDFlOCwgMHgxYTBmNiwgMHgxNDFlNCwgMHgxNDFlMiwNCi0gICAgICAgIDB4MWU4MTQsIDB4MWU4MTIsIDB4MWQwMzQsIDB4MWQwMzIsIDB4MWEwNzQsIDB4MWEwNzIsDQotICAgICAgICAweDFlNTQwLCAweDFmMmIwLCAweDFmOTVjLCAweDFlNTIwLCAweDFmMjk4LCAweDFmOTRlLA0KLSAgICAgICAgMHgxZTUxMCwgMHgxZjI4YywgMHgxZTUwOCwgMHgxZjI4NiwgMHgxZTUwNCwgMHgxZTUwMiwNCi0gICAgICAgIDB4MWNiNDAsIDB4MWU1YjAsIDB4MWYyZGMsIDB4MWNiMjAsIDB4MWU1OTgsIDB4MWYyY2UsDQotICAgICAgICAweDFjYjEwLCAweDFlNThjLCAweDFjYjA4LCAweDFlNTg2LCAweDFjYjA0LCAweDFjYjAyLA0KLSAgICAgICAgMHgxOTc0MCwgMHgxY2JiMCwgMHgxZTVkYywgMHgxOTcyMCwgMHgxY2I5OCwgMHgxZTVjZSwNCi0gICAgICAgIDB4MTk3MTAsIDB4MWNiOGMsIDB4MTk3MDgsIDB4MWNiODYsIDB4MTk3MDQsIDB4MTk3MDIsDQotICAgICAgICAweDEyZjQwLCAweDE5N2IwLCAweDFjYmRjLCAweDEyZjIwLCAweDE5Nzk4LCAweDFjYmNlLA0KLSAgICAgICAgMHgxMmYxMCwgMHgxOTc4YywgMHgxMmYwOCwgMHgxOTc4NiwgMHgxMmYwNCwgMHgxMmZiMCwNCi0gICAgICAgIDB4MTk3ZGMsIDB4MTJmOTgsIDB4MTk3Y2UsIDB4MTJmOGMsIDB4MTJmODYsIDB4MTJmZGMsDQotICAgICAgICAweDEyZmNlLCAweDFmNmEwLCAweDFmYjU4LCAweDE2YmYwLCAweDFmNjkwLCAweDFmYjRjLA0KLSAgICAgICAgMHgxNjlmOCwgMHgxZjY4OCwgMHgxZmI0NiwgMHgxNjhmYywgMHgxZjY4NCwgMHgxZjY4MiwNCi0gICAgICAgIDB4MWU0YTAsIDB4MWYyNTgsIDB4MWY5MmUsIDB4MWVkYTAsIDB4MWU0OTAsIDB4MWZiNmUsDQotICAgICAgICAweDFlZDkwLCAweDFmNmNjLCAweDFmMjQ2LCAweDFlZDg4LCAweDFlNDg0LCAweDFlZDg0LA0KLSAgICAgICAgMHgxZTQ4MiwgMHgxZWQ4MiwgMHgxYzlhMCwgMHgxZTRkOCwgMHgxZjI2ZSwgMHgxZGJhMCwNCi0gICAgICAgIDB4MWM5OTAsIDB4MWU0Y2MsIDB4MWRiOTAsIDB4MWVkY2MsIDB4MWU0YzYsIDB4MWRiODgsDQotICAgICAgICAweDFjOTg0LCAweDFkYjg0LCAweDFjOTgyLCAweDFkYjgyLCAweDE5M2EwLCAweDFjOWQ4LA0KLSAgICAgICAgMHgxZTRlZSwgMHgxYjdhMCwgMHgxOTM5MCwgMHgxYzljYywgMHgxYjc5MCwgMHgxZGJjYywNCi0gICAgICAgIDB4MWM5YzYsIDB4MWI3ODgsIDB4MTkzODQsIDB4MWI3ODQsIDB4MTkzODIsIDB4MWI3ODIsDQotICAgICAgICAweDEyN2EwLCAweDE5M2Q4LCAweDFjOWVlLCAweDE2ZmEwLCAweDEyNzkwLCAweDE5M2NjLA0KLSAgICAgICAgMHgxNmY5MCwgMHgxYjdjYywgMHgxOTNjNiwgMHgxNmY4OCwgMHgxMjc4NCwgMHgxNmY4NCwNCi0gICAgICAgIDB4MTI3ODIsIDB4MTI3ZDgsIDB4MTkzZWUsIDB4MTZmZDgsIDB4MTI3Y2MsIDB4MTZmY2MsDQotICAgICAgICAweDEyN2M2LCAweDE2ZmM2LCAweDEyN2VlLCAweDFmNjUwLCAweDFmYjJjLCAweDE2NWY4LA0KLSAgICAgICAgMHgxZjY0OCwgMHgxZmIyNiwgMHgxNjRmYywgMHgxZjY0NCwgMHgxNjQ3ZSwgMHgxZjY0MiwNCi0gICAgICAgIDB4MWU0NTAsIDB4MWYyMmMsIDB4MWVjZDAsIDB4MWU0NDgsIDB4MWYyMjYsIDB4MWVjYzgsDQotICAgICAgICAweDFmNjY2LCAweDFlY2M0LCAweDFlNDQyLCAweDFlY2MyLCAweDFjOGQwLCAweDFlNDZjLA0KLSAgICAgICAgMHgxZDlkMCwgMHgxYzhjOCwgMHgxZTQ2NiwgMHgxZDljOCwgMHgxZWNlNiwgMHgxZDljNCwNCi0gICAgICAgIDB4MWM4YzIsIDB4MWQ5YzIsIDB4MTkxZDAsIDB4MWM4ZWMsIDB4MWIzZDAsIDB4MTkxYzgsDQotICAgICAgICAweDFjOGU2LCAweDFiM2M4LCAweDFkOWU2LCAweDFiM2M0LCAweDE5MWMyLCAweDFiM2MyLA0KLSAgICAgICAgMHgxMjNkMCwgMHgxOTFlYywgMHgxNjdkMCwgMHgxMjNjOCwgMHgxOTFlNiwgMHgxNjdjOCwNCi0gICAgICAgIDB4MWIzZTYsIDB4MTY3YzQsIDB4MTIzYzIsIDB4MTY3YzIsIDB4MTIzZWMsIDB4MTY3ZWMsDQotICAgICAgICAweDEyM2U2LCAweDE2N2U2LCAweDFmNjI4LCAweDFmYjE2LCAweDE2MmZjLCAweDFmNjI0LA0KLSAgICAgICAgMHgxNjI3ZSwgMHgxZjYyMiwgMHgxZTQyOCwgMHgxZjIxNiwgMHgxZWM2OCwgMHgxZjYzNiwNCi0gICAgICAgIDB4MWVjNjQsIDB4MWU0MjIsIDB4MWVjNjIsIDB4MWM4NjgsIDB4MWU0MzYsIDB4MWQ4ZTgsDQotICAgICAgICAweDFjODY0LCAweDFkOGU0LCAweDFjODYyLCAweDFkOGUyLCAweDE5MGU4LCAweDFjODc2LA0KLSAgICAgICAgMHgxYjFlOCwgMHgxZDhmNiwgMHgxYjFlNCwgMHgxOTBlMiwgMHgxYjFlMiwgMHgxMjFlOCwNCi0gICAgICAgIDB4MTkwZjYsIDB4MTYzZTgsIDB4MTIxZTQsIDB4MTYzZTQsIDB4MTIxZTIsIDB4MTYzZTIsDQotICAgICAgICAweDEyMWY2LCAweDE2M2Y2LCAweDFmNjE0LCAweDE2MTdlLCAweDFmNjEyLCAweDFlNDE0LA0KLSAgICAgICAgMHgxZWMzNCwgMHgxZTQxMiwgMHgxZWMzMiwgMHgxYzgzNCwgMHgxZDg3NCwgMHgxYzgzMiwNCi0gICAgICAgIDB4MWQ4NzIsIDB4MTkwNzQsIDB4MWIwZjQsIDB4MTkwNzIsIDB4MWIwZjIsIDB4MTIwZjQsDQotICAgICAgICAweDE2MWY0LCAweDEyMGYyLCAweDE2MWYyLCAweDFmNjBhLCAweDFlNDBhLCAweDFlYzFhLA0KLSAgICAgICAgMHgxYzgxYSwgMHgxZDgzYSwgMHgxOTAzYSwgMHgxYjA3YSwgMHgxZTJhMCwgMHgxZjE1OCwNCi0gICAgICAgIDB4MWY4YWUsIDB4MWUyOTAsIDB4MWYxNGMsIDB4MWUyODgsIDB4MWYxNDYsIDB4MWUyODQsDQotICAgICAgICAweDFlMjgyLCAweDFjNWEwLCAweDFlMmQ4LCAweDFmMTZlLCAweDFjNTkwLCAweDFlMmNjLA0KLSAgICAgICAgMHgxYzU4OCwgMHgxZTJjNiwgMHgxYzU4NCwgMHgxYzU4MiwgMHgxOGJhMCwgMHgxYzVkOCwNCi0gICAgICAgIDB4MWUyZWUsIDB4MThiOTAsIDB4MWM1Y2MsIDB4MThiODgsIDB4MWM1YzYsIDB4MThiODQsDQotICAgICAgICAweDE4YjgyLCAweDExN2EwLCAweDE4YmQ4LCAweDFjNWVlLCAweDExNzkwLCAweDE4YmNjLA0KLSAgICAgICAgMHgxMTc4OCwgMHgxOGJjNiwgMHgxMTc4NCwgMHgxMTc4MiwgMHgxMTdkOCwgMHgxOGJlZSwNCi0gICAgICAgIDB4MTE3Y2MsIDB4MTE3YzYsIDB4MTE3ZWUsIDB4MWYzNTAsIDB4MWY5YWMsIDB4MTM1ZjgsDQotICAgICAgICAweDFmMzQ4LCAweDFmOWE2LCAweDEzNGZjLCAweDFmMzQ0LCAweDEzNDdlLCAweDFmMzQyLA0KLSAgICAgICAgMHgxZTI1MCwgMHgxZjEyYywgMHgxZTZkMCwgMHgxZTI0OCwgMHgxZjEyNiwgMHgxZTZjOCwNCi0gICAgICAgIDB4MWYzNjYsIDB4MWU2YzQsIDB4MWUyNDIsIDB4MWU2YzIsIDB4MWM0ZDAsIDB4MWUyNmMsDQotICAgICAgICAweDFjZGQwLCAweDFjNGM4LCAweDFlMjY2LCAweDFjZGM4LCAweDFlNmU2LCAweDFjZGM0LA0KLSAgICAgICAgMHgxYzRjMiwgMHgxY2RjMiwgMHgxODlkMCwgMHgxYzRlYywgMHgxOWJkMCwgMHgxODljOCwNCi0gICAgICAgIDB4MWM0ZTYsIDB4MTliYzgsIDB4MWNkZTYsIDB4MTliYzQsIDB4MTg5YzIsIDB4MTliYzIsDQotICAgICAgICAweDExM2QwLCAweDE4OWVjLCAweDEzN2QwLCAweDExM2M4LCAweDE4OWU2LCAweDEzN2M4LA0KLSAgICAgICAgMHgxOWJlNiwgMHgxMzdjNCwgMHgxMTNjMiwgMHgxMzdjMiwgMHgxMTNlYywgMHgxMzdlYywNCi0gICAgICAgIDB4MTEzZTYsIDB4MTM3ZTYsIDB4MWZiYTgsIDB4MTc1ZjAsIDB4MWJhZmMsIDB4MWZiYTQsDQotICAgICAgICAweDE3NGY4LCAweDFiYTdlLCAweDFmYmEyLCAweDE3NDdjLCAweDE3NDNlLCAweDFmMzI4LA0KLSAgICAgICAgMHgxZjk5NiwgMHgxMzJmYywgMHgxZjc2OCwgMHgxZmJiNiwgMHgxNzZmYywgMHgxMzI3ZSwNCi0gICAgICAgIDB4MWY3NjQsIDB4MWYzMjIsIDB4MTc2N2UsIDB4MWY3NjIsIDB4MWUyMjgsIDB4MWYxMTYsDQotICAgICAgICAweDFlNjY4LCAweDFlMjI0LCAweDFlZWU4LCAweDFmNzc2LCAweDFlMjIyLCAweDFlZWU0LA0KLSAgICAgICAgMHgxZTY2MiwgMHgxZWVlMiwgMHgxYzQ2OCwgMHgxZTIzNiwgMHgxY2NlOCwgMHgxYzQ2NCwNCi0gICAgICAgIDB4MWRkZTgsIDB4MWNjZTQsIDB4MWM0NjIsIDB4MWRkZTQsIDB4MWNjZTIsIDB4MWRkZTIsDQotICAgICAgICAweDE4OGU4LCAweDFjNDc2LCAweDE5OWU4LCAweDE4OGU0LCAweDFiYmU4LCAweDE5OWU0LA0KLSAgICAgICAgMHgxODhlMiwgMHgxYmJlNCwgMHgxOTllMiwgMHgxYmJlMiwgMHgxMTFlOCwgMHgxODhmNiwNCi0gICAgICAgIDB4MTMzZTgsIDB4MTExZTQsIDB4MTc3ZTgsIDB4MTMzZTQsIDB4MTExZTIsIDB4MTc3ZTQsDQotICAgICAgICAweDEzM2UyLCAweDE3N2UyLCAweDExMWY2LCAweDEzM2Y2LCAweDFmYjk0LCAweDE3MmY4LA0KLSAgICAgICAgMHgxYjk3ZSwgMHgxZmI5MiwgMHgxNzI3YywgMHgxNzIzZSwgMHgxZjMxNCwgMHgxMzE3ZSwNCi0gICAgICAgIDB4MWY3MzQsIDB4MWYzMTIsIDB4MTczN2UsIDB4MWY3MzIsIDB4MWUyMTQsIDB4MWU2MzQsDQotICAgICAgICAweDFlMjEyLCAweDFlZTc0LCAweDFlNjMyLCAweDFlZTcyLCAweDFjNDM0LCAweDFjYzc0LA0KLSAgICAgICAgMHgxYzQzMiwgMHgxZGNmNCwgMHgxY2M3MiwgMHgxZGNmMiwgMHgxODg3NCwgMHgxOThmNCwNCi0gICAgICAgIDB4MTg4NzIsIDB4MWI5ZjQsIDB4MTk4ZjIsIDB4MWI5ZjIsIDB4MTEwZjQsIDB4MTMxZjQsDQotICAgICAgICAweDExMGYyLCAweDE3M2Y0LCAweDEzMWYyLCAweDE3M2YyLCAweDFmYjhhLCAweDE3MTdjLA0KLSAgICAgICAgMHgxNzEzZSwgMHgxZjMwYSwgMHgxZjcxYSwgMHgxZTIwYSwgMHgxZTYxYSwgMHgxZWUzYSwNCi0gICAgICAgIDB4MWM0MWEsIDB4MWNjM2EsIDB4MWRjN2EsIDB4MTg4M2EsIDB4MTk4N2EsIDB4MWI4ZmEsDQotICAgICAgICAweDExMDdhLCAweDEzMGZhLCAweDE3MWZhLCAweDE3MGJlLCAweDFlMTUwLCAweDFmMGFjLA0KLSAgICAgICAgMHgxZTE0OCwgMHgxZjBhNiwgMHgxZTE0NCwgMHgxZTE0MiwgMHgxYzJkMCwgMHgxZTE2YywNCi0gICAgICAgIDB4MWMyYzgsIDB4MWUxNjYsIDB4MWMyYzQsIDB4MWMyYzIsIDB4MTg1ZDAsIDB4MWMyZWMsDQotICAgICAgICAweDE4NWM4LCAweDFjMmU2LCAweDE4NWM0LCAweDE4NWMyLCAweDEwYmQwLCAweDE4NWVjLA0KLSAgICAgICAgMHgxMGJjOCwgMHgxODVlNiwgMHgxMGJjNCwgMHgxMGJjMiwgMHgxMGJlYywgMHgxMGJlNiwNCi0gICAgICAgIDB4MWYxYTgsIDB4MWY4ZDYsIDB4MTFhZmMsIDB4MWYxYTQsIDB4MTFhN2UsIDB4MWYxYTIsDQotICAgICAgICAweDFlMTI4LCAweDFmMDk2LCAweDFlMzY4LCAweDFlMTI0LCAweDFlMzY0LCAweDFlMTIyLA0KLSAgICAgICAgMHgxZTM2MiwgMHgxYzI2OCwgMHgxZTEzNiwgMHgxYzZlOCwgMHgxYzI2NCwgMHgxYzZlNCwNCi0gICAgICAgIDB4MWMyNjIsIDB4MWM2ZTIsIDB4MTg0ZTgsIDB4MWMyNzYsIDB4MThkZTgsIDB4MTg0ZTQsDQotICAgICAgICAweDE4ZGU0LCAweDE4NGUyLCAweDE4ZGUyLCAweDEwOWU4LCAweDE4NGY2LCAweDExYmU4LA0KLSAgICAgICAgMHgxMDllNCwgMHgxMWJlNCwgMHgxMDllMiwgMHgxMWJlMiwgMHgxMDlmNiwgMHgxMWJmNiwNCi0gICAgICAgIDB4MWY5ZDQsIDB4MTNhZjgsIDB4MTlkN2UsIDB4MWY5ZDIsIDB4MTNhN2MsIDB4MTNhM2UsDQotICAgICAgICAweDFmMTk0LCAweDExOTdlLCAweDFmM2I0LCAweDFmMTkyLCAweDEzYjdlLCAweDFmM2IyLA0KLSAgICAgICAgMHgxZTExNCwgMHgxZTMzNCwgMHgxZTExMiwgMHgxZTc3NCwgMHgxZTMzMiwgMHgxZTc3MiwNCi0gICAgICAgIDB4MWMyMzQsIDB4MWM2NzQsIDB4MWMyMzIsIDB4MWNlZjQsIDB4MWM2NzIsIDB4MWNlZjIsDQotICAgICAgICAweDE4NDc0LCAweDE4Y2Y0LCAweDE4NDcyLCAweDE5ZGY0LCAweDE4Y2YyLCAweDE5ZGYyLA0KLSAgICAgICAgMHgxMDhmNCwgMHgxMTlmNCwgMHgxMDhmMiwgMHgxM2JmNCwgMHgxMTlmMiwgMHgxM2JmMiwNCi0gICAgICAgIDB4MTdhZjAsIDB4MWJkN2MsIDB4MTdhNzgsIDB4MWJkM2UsIDB4MTdhM2MsIDB4MTdhMWUsDQotICAgICAgICAweDFmOWNhLCAweDEzOTdjLCAweDFmYmRhLCAweDE3YjdjLCAweDEzOTNlLCAweDE3YjNlLA0KLSAgICAgICAgMHgxZjE4YSwgMHgxZjM5YSwgMHgxZjdiYSwgMHgxZTEwYSwgMHgxZTMxYSwgMHgxZTczYSwNCi0gICAgICAgIDB4MWVmN2EsIDB4MWMyMWEsIDB4MWM2M2EsIDB4MWNlN2EsIDB4MWRlZmEsIDB4MTg0M2EsDQotICAgICAgICAweDE4YzdhLCAweDE5Y2ZhLCAweDFiZGZhLCAweDEwODdhLCAweDExOGZhLCAweDEzOWZhLA0KLSAgICAgICAgMHgxNzk3OCwgMHgxYmNiZSwgMHgxNzkzYywgMHgxNzkxZSwgMHgxMzhiZSwgMHgxNzliZSwNCi0gICAgICAgIDB4MTc4YmMsIDB4MTc4OWUsIDB4MTc4NWUsIDB4MWUwYTgsIDB4MWUwYTQsIDB4MWUwYTIsDQotICAgICAgICAweDFjMTY4LCAweDFlMGI2LCAweDFjMTY0LCAweDFjMTYyLCAweDE4MmU4LCAweDFjMTc2LA0KLSAgICAgICAgMHgxODJlNCwgMHgxODJlMiwgMHgxMDVlOCwgMHgxODJmNiwgMHgxMDVlNCwgMHgxMDVlMiwNCi0gICAgICAgIDB4MTA1ZjYsIDB4MWYwZDQsIDB4MTBkN2UsIDB4MWYwZDIsIDB4MWUwOTQsIDB4MWUxYjQsDQotICAgICAgICAweDFlMDkyLCAweDFlMWIyLCAweDFjMTM0LCAweDFjMzc0LCAweDFjMTMyLCAweDFjMzcyLA0KLSAgICAgICAgMHgxODI3NCwgMHgxODZmNCwgMHgxODI3MiwgMHgxODZmMiwgMHgxMDRmNCwgMHgxMGRmNCwNCi0gICAgICAgIDB4MTA0ZjIsIDB4MTBkZjIsIDB4MWY4ZWEsIDB4MTFkN2MsIDB4MTFkM2UsIDB4MWYwY2EsDQotICAgICAgICAweDFmMWRhLCAweDFlMDhhLCAweDFlMTlhLCAweDFlM2JhLCAweDFjMTFhLCAweDFjMzNhLA0KLSAgICAgICAgMHgxYzc3YSwgMHgxODIzYSwgMHgxODY3YSwgMHgxOGVmYSwgMHgxMDQ3YSwgMHgxMGNmYSwNCi0gICAgICAgIDB4MTFkZmEsIDB4MTNkNzgsIDB4MTllYmUsIDB4MTNkM2MsIDB4MTNkMWUsIDB4MTFjYmUsDQotICAgICAgICAweDEzZGJlLCAweDE3ZDcwLCAweDFiZWJjLCAweDE3ZDM4LCAweDFiZTllLCAweDE3ZDFjLA0KLSAgICAgICAgMHgxN2QwZSwgMHgxM2NiYywgMHgxN2RiYywgMHgxM2M5ZSwgMHgxN2Q5ZSwgMHgxN2NiOCwNCi0gICAgICAgIDB4MWJlNWUsIDB4MTdjOWMsIDB4MTdjOGUsIDB4MTNjNWUsIDB4MTdjZGUsIDB4MTdjNWMsDQotICAgICAgICAweDE3YzRlLCAweDE3YzJlLCAweDFjMGI0LCAweDFjMGIyLCAweDE4MTc0LCAweDE4MTcyLA0KLSAgICAgICAgMHgxMDJmNCwgMHgxMDJmMiwgMHgxZTBkYSwgMHgxYzA5YSwgMHgxYzFiYSwgMHgxODEzYSwNCi0gICAgICAgIDB4MTgzN2EsIDB4MTAyN2EsIDB4MTA2ZmEsIDB4MTBlYmUsIDB4MTFlYmMsIDB4MTFlOWUsDQotICAgICAgICAweDEzZWI4LCAweDE5ZjVlLCAweDEzZTljLCAweDEzZThlLCAweDExZTVlLCAweDEzZWRlLA0KLSAgICAgICAgMHgxN2ViMCwgMHgxYmY1YywgMHgxN2U5OCwgMHgxYmY0ZSwgMHgxN2U4YywgMHgxN2U4NiwNCi0gICAgICAgIDB4MTNlNWMsIDB4MTdlZGMsIDB4MTNlNGUsIDB4MTdlY2UsIDB4MTdlNTgsIDB4MWJmMmUsDQotICAgICAgICAweDE3ZTRjLCAweDE3ZTQ2LCAweDEzZTJlLCAweDE3ZTZlLCAweDE3ZTJjLCAweDE3ZTI2LA0KLSAgICAgICAgMHgxMGY1ZSwgMHgxMWY1YywgMHgxMWY0ZSwgMHgxM2Y1OCwgMHgxOWZhZSwgMHgxM2Y0YywNCi0gICAgICAgIDB4MTNmNDYsIDB4MTFmMmUsIDB4MTNmNmUsIDB4MTNmMmMsIDB4MTNmMjYNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgMHgxYWJlMCwgMHgxZDVmOCwgMHgxNTNjMCwgMHgxYTlmMCwgMHgxZDRmYywgMHgxNTFlMCwNCi0gICAgICAgIDB4MWE4ZjgsIDB4MWQ0N2UsIDB4MTUwZjAsIDB4MWE4N2MsIDB4MTUwNzgsIDB4MWZhZDAsDQotICAgICAgICAweDE1YmUwLCAweDFhZGY4LCAweDFmYWM4LCAweDE1OWYwLCAweDFhY2ZjLCAweDFmYWM0LA0KLSAgICAgICAgMHgxNThmOCwgMHgxYWM3ZSwgMHgxZmFjMiwgMHgxNTg3YywgMHgxZjVkMCwgMHgxZmFlYywNCi0gICAgICAgIDB4MTVkZjgsIDB4MWY1YzgsIDB4MWZhZTYsIDB4MTVjZmMsIDB4MWY1YzQsIDB4MTVjN2UsDQotICAgICAgICAweDFmNWMyLCAweDFlYmQwLCAweDFmNWVjLCAweDFlYmM4LCAweDFmNWU2LCAweDFlYmM0LA0KLSAgICAgICAgMHgxZWJjMiwgMHgxZDdkMCwgMHgxZWJlYywgMHgxZDdjOCwgMHgxZWJlNiwgMHgxZDdjNCwNCi0gICAgICAgIDB4MWQ3YzIsIDB4MWFmZDAsIDB4MWQ3ZWMsIDB4MWFmYzgsIDB4MWQ3ZTYsIDB4MWFmYzQsDQotICAgICAgICAweDE0YmMwLCAweDFhNWYwLCAweDFkMmZjLCAweDE0OWUwLCAweDFhNGY4LCAweDFkMjdlLA0KLSAgICAgICAgMHgxNDhmMCwgMHgxYTQ3YywgMHgxNDg3OCwgMHgxYTQzZSwgMHgxNDgzYywgMHgxZmE2OCwNCi0gICAgICAgIDB4MTRkZjAsIDB4MWE2ZmMsIDB4MWZhNjQsIDB4MTRjZjgsIDB4MWE2N2UsIDB4MWZhNjIsDQotICAgICAgICAweDE0YzdjLCAweDE0YzNlLCAweDFmNGU4LCAweDFmYTc2LCAweDE0ZWZjLCAweDFmNGU0LA0KLSAgICAgICAgMHgxNGU3ZSwgMHgxZjRlMiwgMHgxZTllOCwgMHgxZjRmNiwgMHgxZTllNCwgMHgxZTllMiwNCi0gICAgICAgIDB4MWQzZTgsIDB4MWU5ZjYsIDB4MWQzZTQsIDB4MWQzZTIsIDB4MWE3ZTgsIDB4MWQzZjYsDQotICAgICAgICAweDFhN2U0LCAweDFhN2UyLCAweDE0NWUwLCAweDFhMmY4LCAweDFkMTdlLCAweDE0NGYwLA0KLSAgICAgICAgMHgxYTI3YywgMHgxNDQ3OCwgMHgxYTIzZSwgMHgxNDQzYywgMHgxNDQxZSwgMHgxZmEzNCwNCi0gICAgICAgIDB4MTQ2ZjgsIDB4MWEzN2UsIDB4MWZhMzIsIDB4MTQ2N2MsIDB4MTQ2M2UsIDB4MWY0NzQsDQotICAgICAgICAweDE0NzdlLCAweDFmNDcyLCAweDFlOGY0LCAweDFlOGYyLCAweDFkMWY0LCAweDFkMWYyLA0KLSAgICAgICAgMHgxYTNmNCwgMHgxYTNmMiwgMHgxNDJmMCwgMHgxYTE3YywgMHgxNDI3OCwgMHgxYTEzZSwNCi0gICAgICAgIDB4MTQyM2MsIDB4MTQyMWUsIDB4MWZhMWEsIDB4MTQzN2MsIDB4MTQzM2UsIDB4MWY0M2EsDQotICAgICAgICAweDFlODdhLCAweDFkMGZhLCAweDE0MTc4LCAweDFhMGJlLCAweDE0MTNjLCAweDE0MTFlLA0KLSAgICAgICAgMHgxNDFiZSwgMHgxNDBiYywgMHgxNDA5ZSwgMHgxMmJjMCwgMHgxOTVmMCwgMHgxY2FmYywNCi0gICAgICAgIDB4MTI5ZTAsIDB4MTk0ZjgsIDB4MWNhN2UsIDB4MTI4ZjAsIDB4MTk0N2MsIDB4MTI4NzgsDQotICAgICAgICAweDE5NDNlLCAweDEyODNjLCAweDFmOTY4LCAweDEyZGYwLCAweDE5NmZjLCAweDFmOTY0LA0KLSAgICAgICAgMHgxMmNmOCwgMHgxOTY3ZSwgMHgxZjk2MiwgMHgxMmM3YywgMHgxMmMzZSwgMHgxZjJlOCwNCi0gICAgICAgIDB4MWY5NzYsIDB4MTJlZmMsIDB4MWYyZTQsIDB4MTJlN2UsIDB4MWYyZTIsIDB4MWU1ZTgsDQotICAgICAgICAweDFmMmY2LCAweDFlNWU0LCAweDFlNWUyLCAweDFjYmU4LCAweDFlNWY2LCAweDFjYmU0LA0KLSAgICAgICAgMHgxY2JlMiwgMHgxOTdlOCwgMHgxY2JmNiwgMHgxOTdlNCwgMHgxOTdlMiwgMHgxYjVlMCwNCi0gICAgICAgIDB4MWRhZjgsIDB4MWVkN2UsIDB4MTY5YzAsIDB4MWI0ZjAsIDB4MWRhN2MsIDB4MTY4ZTAsDQotICAgICAgICAweDFiNDc4LCAweDFkYTNlLCAweDE2ODcwLCAweDFiNDNjLCAweDE2ODM4LCAweDFiNDFlLA0KLSAgICAgICAgMHgxNjgxYywgMHgxMjVlMCwgMHgxOTJmOCwgMHgxYzk3ZSwgMHgxNmRlMCwgMHgxMjRmMCwNCi0gICAgICAgIDB4MTkyN2MsIDB4MTZjZjAsIDB4MWI2N2MsIDB4MTkyM2UsIDB4MTZjNzgsIDB4MTI0M2MsDQotICAgICAgICAweDE2YzNjLCAweDEyNDFlLCAweDE2YzFlLCAweDFmOTM0LCAweDEyNmY4LCAweDE5MzdlLA0KLSAgICAgICAgMHgxZmI3NCwgMHgxZjkzMiwgMHgxNmVmOCwgMHgxMjY3YywgMHgxZmI3MiwgMHgxNmU3YywNCi0gICAgICAgIDB4MTI2M2UsIDB4MTZlM2UsIDB4MWYyNzQsIDB4MTI3N2UsIDB4MWY2ZjQsIDB4MWYyNzIsDQotICAgICAgICAweDE2ZjdlLCAweDFmNmYyLCAweDFlNGY0LCAweDFlZGY0LCAweDFlNGYyLCAweDFlZGYyLA0KLSAgICAgICAgMHgxYzlmNCwgMHgxZGJmNCwgMHgxYzlmMiwgMHgxZGJmMiwgMHgxOTNmNCwgMHgxOTNmMiwNCi0gICAgICAgIDB4MTY1YzAsIDB4MWIyZjAsIDB4MWQ5N2MsIDB4MTY0ZTAsIDB4MWIyNzgsIDB4MWQ5M2UsDQotICAgICAgICAweDE2NDcwLCAweDFiMjNjLCAweDE2NDM4LCAweDFiMjFlLCAweDE2NDFjLCAweDE2NDBlLA0KLSAgICAgICAgMHgxMjJmMCwgMHgxOTE3YywgMHgxNjZmMCwgMHgxMjI3OCwgMHgxOTEzZSwgMHgxNjY3OCwNCi0gICAgICAgIDB4MWIzM2UsIDB4MTY2M2MsIDB4MTIyMWUsIDB4MTY2MWUsIDB4MWY5MWEsIDB4MTIzN2MsDQotICAgICAgICAweDFmYjNhLCAweDE2NzdjLCAweDEyMzNlLCAweDE2NzNlLCAweDFmMjNhLCAweDFmNjdhLA0KLSAgICAgICAgMHgxZTQ3YSwgMHgxZWNmYSwgMHgxYzhmYSwgMHgxZDlmYSwgMHgxOTFmYSwgMHgxNjJlMCwNCi0gICAgICAgIDB4MWIxNzgsIDB4MWQ4YmUsIDB4MTYyNzAsIDB4MWIxM2MsIDB4MTYyMzgsIDB4MWIxMWUsDQotICAgICAgICAweDE2MjFjLCAweDE2MjBlLCAweDEyMTc4LCAweDE5MGJlLCAweDE2Mzc4LCAweDEyMTNjLA0KLSAgICAgICAgMHgxNjMzYywgMHgxMjExZSwgMHgxNjMxZSwgMHgxMjFiZSwgMHgxNjNiZSwgMHgxNjE3MCwNCi0gICAgICAgIDB4MWIwYmMsIDB4MTYxMzgsIDB4MWIwOWUsIDB4MTYxMWMsIDB4MTYxMGUsIDB4MTIwYmMsDQotICAgICAgICAweDE2MWJjLCAweDEyMDllLCAweDE2MTllLCAweDE2MGI4LCAweDFiMDVlLCAweDE2MDljLA0KLSAgICAgICAgMHgxNjA4ZSwgMHgxMjA1ZSwgMHgxNjBkZSwgMHgxNjA1YywgMHgxNjA0ZSwgMHgxMTVlMCwNCi0gICAgICAgIDB4MThhZjgsIDB4MWM1N2UsIDB4MTE0ZjAsIDB4MThhN2MsIDB4MTE0NzgsIDB4MThhM2UsDQotICAgICAgICAweDExNDNjLCAweDExNDFlLCAweDFmOGI0LCAweDExNmY4LCAweDE4YjdlLCAweDFmOGIyLA0KLSAgICAgICAgMHgxMTY3YywgMHgxMTYzZSwgMHgxZjE3NCwgMHgxMTc3ZSwgMHgxZjE3MiwgMHgxZTJmNCwNCi0gICAgICAgIDB4MWUyZjIsIDB4MWM1ZjQsIDB4MWM1ZjIsIDB4MThiZjQsIDB4MThiZjIsIDB4MTM1YzAsDQotICAgICAgICAweDE5YWYwLCAweDFjZDdjLCAweDEzNGUwLCAweDE5YTc4LCAweDFjZDNlLCAweDEzNDcwLA0KLSAgICAgICAgMHgxOWEzYywgMHgxMzQzOCwgMHgxOWExZSwgMHgxMzQxYywgMHgxMzQwZSwgMHgxMTJmMCwNCi0gICAgICAgIDB4MTg5N2MsIDB4MTM2ZjAsIDB4MTEyNzgsIDB4MTg5M2UsIDB4MTM2NzgsIDB4MTliM2UsDQotICAgICAgICAweDEzNjNjLCAweDExMjFlLCAweDEzNjFlLCAweDFmODlhLCAweDExMzdjLCAweDFmOWJhLA0KLSAgICAgICAgMHgxMzc3YywgMHgxMTMzZSwgMHgxMzczZSwgMHgxZjEzYSwgMHgxZjM3YSwgMHgxZTI3YSwNCi0gICAgICAgIDB4MWU2ZmEsIDB4MWM0ZmEsIDB4MWNkZmEsIDB4MTg5ZmEsIDB4MWJhZTAsIDB4MWRkNzgsDQotICAgICAgICAweDFlZWJlLCAweDE3NGMwLCAweDFiYTcwLCAweDFkZDNjLCAweDE3NDYwLCAweDFiYTM4LA0KLSAgICAgICAgMHgxZGQxZSwgMHgxNzQzMCwgMHgxYmExYywgMHgxNzQxOCwgMHgxYmEwZSwgMHgxNzQwYywNCi0gICAgICAgIDB4MTMyZTAsIDB4MTk5NzgsIDB4MWNjYmUsIDB4MTc2ZTAsIDB4MTMyNzAsIDB4MTk5M2MsDQotICAgICAgICAweDE3NjcwLCAweDFiYjNjLCAweDE5OTFlLCAweDE3NjM4LCAweDEzMjFjLCAweDE3NjFjLA0KLSAgICAgICAgMHgxMzIwZSwgMHgxNzYwZSwgMHgxMTE3OCwgMHgxODhiZSwgMHgxMzM3OCwgMHgxMTEzYywNCi0gICAgICAgIDB4MTc3NzgsIDB4MTMzM2MsIDB4MTExMWUsIDB4MTc3M2MsIDB4MTMzMWUsIDB4MTc3MWUsDQotICAgICAgICAweDExMWJlLCAweDEzM2JlLCAweDE3N2JlLCAweDE3MmMwLCAweDFiOTcwLCAweDFkY2JjLA0KLSAgICAgICAgMHgxNzI2MCwgMHgxYjkzOCwgMHgxZGM5ZSwgMHgxNzIzMCwgMHgxYjkxYywgMHgxNzIxOCwNCi0gICAgICAgIDB4MWI5MGUsIDB4MTcyMGMsIDB4MTcyMDYsIDB4MTMxNzAsIDB4MTk4YmMsIDB4MTczNzAsDQotICAgICAgICAweDEzMTM4LCAweDE5ODllLCAweDE3MzM4LCAweDFiOTllLCAweDE3MzFjLCAweDEzMTBlLA0KLSAgICAgICAgMHgxNzMwZSwgMHgxMTBiYywgMHgxMzFiYywgMHgxMTA5ZSwgMHgxNzNiYywgMHgxMzE5ZSwNCi0gICAgICAgIDB4MTczOWUsIDB4MTcxNjAsIDB4MWI4YjgsIDB4MWRjNWUsIDB4MTcxMzAsIDB4MWI4OWMsDQotICAgICAgICAweDE3MTE4LCAweDFiODhlLCAweDE3MTBjLCAweDE3MTA2LCAweDEzMGI4LCAweDE5ODVlLA0KLSAgICAgICAgMHgxNzFiOCwgMHgxMzA5YywgMHgxNzE5YywgMHgxMzA4ZSwgMHgxNzE4ZSwgMHgxMTA1ZSwNCi0gICAgICAgIDB4MTMwZGUsIDB4MTcxZGUsIDB4MTcwYjAsIDB4MWI4NWMsIDB4MTcwOTgsIDB4MWI4NGUsDQotICAgICAgICAweDE3MDhjLCAweDE3MDg2LCAweDEzMDVjLCAweDE3MGRjLCAweDEzMDRlLCAweDE3MGNlLA0KLSAgICAgICAgMHgxNzA1OCwgMHgxYjgyZSwgMHgxNzA0YywgMHgxNzA0NiwgMHgxMzAyZSwgMHgxNzA2ZSwNCi0gICAgICAgIDB4MTcwMmMsIDB4MTcwMjYsIDB4MTBhZjAsIDB4MTg1N2MsIDB4MTBhNzgsIDB4MTg1M2UsDQotICAgICAgICAweDEwYTNjLCAweDEwYTFlLCAweDEwYjdjLCAweDEwYjNlLCAweDFmMGJhLCAweDFlMTdhLA0KLSAgICAgICAgMHgxYzJmYSwgMHgxODVmYSwgMHgxMWFlMCwgMHgxOGQ3OCwgMHgxYzZiZSwgMHgxMWE3MCwNCi0gICAgICAgIDB4MThkM2MsIDB4MTFhMzgsIDB4MThkMWUsIDB4MTFhMWMsIDB4MTFhMGUsIDB4MTA5NzgsDQotICAgICAgICAweDE4NGJlLCAweDExYjc4LCAweDEwOTNjLCAweDExYjNjLCAweDEwOTFlLCAweDExYjFlLA0KLSAgICAgICAgMHgxMDliZSwgMHgxMWJiZSwgMHgxM2FjMCwgMHgxOWQ3MCwgMHgxY2ViYywgMHgxM2E2MCwNCi0gICAgICAgIDB4MTlkMzgsIDB4MWNlOWUsIDB4MTNhMzAsIDB4MTlkMWMsIDB4MTNhMTgsIDB4MTlkMGUsDQotICAgICAgICAweDEzYTBjLCAweDEzYTA2LCAweDExOTcwLCAweDE4Y2JjLCAweDEzYjcwLCAweDExOTM4LA0KLSAgICAgICAgMHgxOGM5ZSwgMHgxM2IzOCwgMHgxMTkxYywgMHgxM2IxYywgMHgxMTkwZSwgMHgxM2IwZSwNCi0gICAgICAgIDB4MTA4YmMsIDB4MTE5YmMsIDB4MTA4OWUsIDB4MTNiYmMsIDB4MTE5OWUsIDB4MTNiOWUsDQotICAgICAgICAweDFiZDYwLCAweDFkZWI4LCAweDFlZjVlLCAweDE3YTQwLCAweDFiZDMwLCAweDFkZTljLA0KLSAgICAgICAgMHgxN2EyMCwgMHgxYmQxOCwgMHgxZGU4ZSwgMHgxN2ExMCwgMHgxYmQwYywgMHgxN2EwOCwNCi0gICAgICAgIDB4MWJkMDYsIDB4MTdhMDQsIDB4MTM5NjAsIDB4MTljYjgsIDB4MWNlNWUsIDB4MTdiNjAsDQotICAgICAgICAweDEzOTMwLCAweDE5YzljLCAweDE3YjMwLCAweDFiZDljLCAweDE5YzhlLCAweDE3YjE4LA0KLSAgICAgICAgMHgxMzkwYywgMHgxN2IwYywgMHgxMzkwNiwgMHgxN2IwNiwgMHgxMThiOCwgMHgxOGM1ZSwNCi0gICAgICAgIDB4MTM5YjgsIDB4MTE4OWMsIDB4MTdiYjgsIDB4MTM5OWMsIDB4MTE4OGUsIDB4MTdiOWMsDQotICAgICAgICAweDEzOThlLCAweDE3YjhlLCAweDEwODVlLCAweDExOGRlLCAweDEzOWRlLCAweDE3YmRlLA0KLSAgICAgICAgMHgxNzk0MCwgMHgxYmNiMCwgMHgxZGU1YywgMHgxNzkyMCwgMHgxYmM5OCwgMHgxZGU0ZSwNCi0gICAgICAgIDB4MTc5MTAsIDB4MWJjOGMsIDB4MTc5MDgsIDB4MWJjODYsIDB4MTc5MDQsIDB4MTc5MDIsDQotICAgICAgICAweDEzOGIwLCAweDE5YzVjLCAweDE3OWIwLCAweDEzODk4LCAweDE5YzRlLCAweDE3OTk4LA0KLSAgICAgICAgMHgxYmNjZSwgMHgxNzk4YywgMHgxMzg4NiwgMHgxNzk4NiwgMHgxMTg1YywgMHgxMzhkYywNCi0gICAgICAgIDB4MTE4NGUsIDB4MTc5ZGMsIDB4MTM4Y2UsIDB4MTc5Y2UsIDB4MTc4YTAsIDB4MWJjNTgsDQotICAgICAgICAweDFkZTJlLCAweDE3ODkwLCAweDFiYzRjLCAweDE3ODg4LCAweDFiYzQ2LCAweDE3ODg0LA0KLSAgICAgICAgMHgxNzg4MiwgMHgxMzg1OCwgMHgxOWMyZSwgMHgxNzhkOCwgMHgxMzg0YywgMHgxNzhjYywNCi0gICAgICAgIDB4MTM4NDYsIDB4MTc4YzYsIDB4MTE4MmUsIDB4MTM4NmUsIDB4MTc4ZWUsIDB4MTc4NTAsDQotICAgICAgICAweDFiYzJjLCAweDE3ODQ4LCAweDFiYzI2LCAweDE3ODQ0LCAweDE3ODQyLCAweDEzODJjLA0KLSAgICAgICAgMHgxNzg2YywgMHgxMzgyNiwgMHgxNzg2NiwgMHgxNzgyOCwgMHgxYmMxNiwgMHgxNzgyNCwNCi0gICAgICAgIDB4MTc4MjIsIDB4MTM4MTYsIDB4MTc4MzYsIDB4MTA1NzgsIDB4MTgyYmUsIDB4MTA1M2MsDQotICAgICAgICAweDEwNTFlLCAweDEwNWJlLCAweDEwZDcwLCAweDE4NmJjLCAweDEwZDM4LCAweDE4NjllLA0KLSAgICAgICAgMHgxMGQxYywgMHgxMGQwZSwgMHgxMDRiYywgMHgxMGRiYywgMHgxMDQ5ZSwgMHgxMGQ5ZSwNCi0gICAgICAgIDB4MTFkNjAsIDB4MThlYjgsIDB4MWM3NWUsIDB4MTFkMzAsIDB4MThlOWMsIDB4MTFkMTgsDQotICAgICAgICAweDE4ZThlLCAweDExZDBjLCAweDExZDA2LCAweDEwY2I4LCAweDE4NjVlLCAweDExZGI4LA0KLSAgICAgICAgMHgxMGM5YywgMHgxMWQ5YywgMHgxMGM4ZSwgMHgxMWQ4ZSwgMHgxMDQ1ZSwgMHgxMGNkZSwNCi0gICAgICAgIDB4MTFkZGUsIDB4MTNkNDAsIDB4MTllYjAsIDB4MWNmNWMsIDB4MTNkMjAsIDB4MTllOTgsDQotICAgICAgICAweDFjZjRlLCAweDEzZDEwLCAweDE5ZThjLCAweDEzZDA4LCAweDE5ZTg2LCAweDEzZDA0LA0KLSAgICAgICAgMHgxM2QwMiwgMHgxMWNiMCwgMHgxOGU1YywgMHgxM2RiMCwgMHgxMWM5OCwgMHgxOGU0ZSwNCi0gICAgICAgIDB4MTNkOTgsIDB4MTllY2UsIDB4MTNkOGMsIDB4MTFjODYsIDB4MTNkODYsIDB4MTBjNWMsDQotICAgICAgICAweDExY2RjLCAweDEwYzRlLCAweDEzZGRjLCAweDExY2NlLCAweDEzZGNlLCAweDFiZWEwLA0KLSAgICAgICAgMHgxZGY1OCwgMHgxZWZhZSwgMHgxYmU5MCwgMHgxZGY0YywgMHgxYmU4OCwgMHgxZGY0NiwNCi0gICAgICAgIDB4MWJlODQsIDB4MWJlODIsIDB4MTNjYTAsIDB4MTllNTgsIDB4MWNmMmUsIDB4MTdkYTAsDQotICAgICAgICAweDEzYzkwLCAweDE5ZTRjLCAweDE3ZDkwLCAweDFiZWNjLCAweDE5ZTQ2LCAweDE3ZDg4LA0KLSAgICAgICAgMHgxM2M4NCwgMHgxN2Q4NCwgMHgxM2M4MiwgMHgxN2Q4MiwgMHgxMWM1OCwgMHgxOGUyZSwNCi0gICAgICAgIDB4MTNjZDgsIDB4MTFjNGMsIDB4MTdkZDgsIDB4MTNjY2MsIDB4MTFjNDYsIDB4MTdkY2MsDQotICAgICAgICAweDEzY2M2LCAweDE3ZGM2LCAweDEwYzJlLCAweDExYzZlLCAweDEzY2VlLCAweDE3ZGVlLA0KLSAgICAgICAgMHgxYmU1MCwgMHgxZGYyYywgMHgxYmU0OCwgMHgxZGYyNiwgMHgxYmU0NCwgMHgxYmU0MiwNCi0gICAgICAgIDB4MTNjNTAsIDB4MTllMmMsIDB4MTdjZDAsIDB4MTNjNDgsIDB4MTllMjYsIDB4MTdjYzgsDQotICAgICAgICAweDFiZTY2LCAweDE3Y2M0LCAweDEzYzQyLCAweDE3Y2MyLCAweDExYzJjLCAweDEzYzZjLA0KLSAgICAgICAgMHgxMWMyNiwgMHgxN2NlYywgMHgxM2M2NiwgMHgxN2NlNiwgMHgxYmUyOCwgMHgxZGYxNiwNCi0gICAgICAgIDB4MWJlMjQsIDB4MWJlMjIsIDB4MTNjMjgsIDB4MTllMTYsIDB4MTdjNjgsIDB4MTNjMjQsDQotICAgICAgICAweDE3YzY0LCAweDEzYzIyLCAweDE3YzYyLCAweDExYzE2LCAweDEzYzM2LCAweDE3Yzc2LA0KLSAgICAgICAgMHgxYmUxNCwgMHgxYmUxMiwgMHgxM2MxNCwgMHgxN2MzNCwgMHgxM2MxMiwgMHgxN2MzMiwNCi0gICAgICAgIDB4MTAyYmMsIDB4MTAyOWUsIDB4MTA2YjgsIDB4MTgzNWUsIDB4MTA2OWMsIDB4MTA2OGUsDQotICAgICAgICAweDEwMjVlLCAweDEwNmRlLCAweDEwZWIwLCAweDE4NzVjLCAweDEwZTk4LCAweDE4NzRlLA0KLSAgICAgICAgMHgxMGU4YywgMHgxMGU4NiwgMHgxMDY1YywgMHgxMGVkYywgMHgxMDY0ZSwgMHgxMGVjZSwNCi0gICAgICAgIDB4MTFlYTAsIDB4MThmNTgsIDB4MWM3YWUsIDB4MTFlOTAsIDB4MThmNGMsIDB4MTFlODgsDQotICAgICAgICAweDE4ZjQ2LCAweDExZTg0LCAweDExZTgyLCAweDEwZTU4LCAweDE4NzJlLCAweDExZWQ4LA0KLSAgICAgICAgMHgxOGY2ZSwgMHgxMWVjYywgMHgxMGU0NiwgMHgxMWVjNiwgMHgxMDYyZSwgMHgxMGU2ZSwNCi0gICAgICAgIDB4MTFlZWUsIDB4MTlmNTAsIDB4MWNmYWMsIDB4MTlmNDgsIDB4MWNmYTYsIDB4MTlmNDQsDQotICAgICAgICAweDE5ZjQyLCAweDExZTUwLCAweDE4ZjJjLCAweDEzZWQwLCAweDE5ZjZjLCAweDE4ZjI2LA0KLSAgICAgICAgMHgxM2VjOCwgMHgxMWU0NCwgMHgxM2VjNCwgMHgxMWU0MiwgMHgxM2VjMiwgMHgxMGUyYywNCi0gICAgICAgIDB4MTFlNmMsIDB4MTBlMjYsIDB4MTNlZWMsIDB4MTFlNjYsIDB4MTNlZTYsIDB4MWRmYTgsDQotICAgICAgICAweDFlZmQ2LCAweDFkZmE0LCAweDFkZmEyLCAweDE5ZjI4LCAweDFjZjk2LCAweDFiZjY4LA0KLSAgICAgICAgMHgxOWYyNCwgMHgxYmY2NCwgMHgxOWYyMiwgMHgxYmY2MiwgMHgxMWUyOCwgMHgxOGYxNiwNCi0gICAgICAgIDB4MTNlNjgsIDB4MTFlMjQsIDB4MTdlZTgsIDB4MTNlNjQsIDB4MTFlMjIsIDB4MTdlZTQsDQotICAgICAgICAweDEzZTYyLCAweDE3ZWUyLCAweDEwZTE2LCAweDExZTM2LCAweDEzZTc2LCAweDE3ZWY2LA0KLSAgICAgICAgMHgxZGY5NCwgMHgxZGY5MiwgMHgxOWYxNCwgMHgxYmYzNCwgMHgxOWYxMiwgMHgxYmYzMiwNCi0gICAgICAgIDB4MTFlMTQsIDB4MTNlMzQsIDB4MTFlMTIsIDB4MTdlNzQsIDB4MTNlMzIsIDB4MTdlNzIsDQotICAgICAgICAweDFkZjhhLCAweDE5ZjBhLCAweDFiZjFhLCAweDExZTBhLCAweDEzZTFhLCAweDE3ZTNhLA0KLSAgICAgICAgMHgxMDM1YywgMHgxMDM0ZSwgMHgxMDc1OCwgMHgxODNhZSwgMHgxMDc0YywgMHgxMDc0NiwNCi0gICAgICAgIDB4MTAzMmUsIDB4MTA3NmUsIDB4MTBmNTAsIDB4MTg3YWMsIDB4MTBmNDgsIDB4MTg3YTYsDQotICAgICAgICAweDEwZjQ0LCAweDEwZjQyLCAweDEwNzJjLCAweDEwZjZjLCAweDEwNzI2LCAweDEwZjY2LA0KLSAgICAgICAgMHgxOGZhOCwgMHgxYzdkNiwgMHgxOGZhNCwgMHgxOGZhMiwgMHgxMGYyOCwgMHgxODc5NiwNCi0gICAgICAgIDB4MTFmNjgsIDB4MThmYjYsIDB4MTFmNjQsIDB4MTBmMjIsIDB4MTFmNjIsIDB4MTA3MTYsDQotICAgICAgICAweDEwZjM2LCAweDExZjc2LCAweDFjZmQ0LCAweDFjZmQyLCAweDE4Zjk0LCAweDE5ZmI0LA0KLSAgICAgICAgMHgxOGY5MiwgMHgxOWZiMiwgMHgxMGYxNCwgMHgxMWYzNCwgMHgxMGYxMiwgMHgxM2Y3NCwNCi0gICAgICAgIDB4MTFmMzIsIDB4MTNmNzIsIDB4MWNmY2EsIDB4MThmOGEsIDB4MTlmOWEsIDB4MTBmMGEsDQotICAgICAgICAweDExZjFhLCAweDEzZjNhLCAweDEwM2FjLCAweDEwM2E2LCAweDEwN2E4LCAweDE4M2Q2LA0KLSAgICAgICAgMHgxMDdhNCwgMHgxMDdhMiwgMHgxMDM5NiwgMHgxMDdiNiwgMHgxODdkNCwgMHgxODdkMiwNCi0gICAgICAgIDB4MTA3OTQsIDB4MTBmYjQsIDB4MTA3OTIsIDB4MTBmYjIsIDB4MWM3ZWENCi0gICAgfQ0KLX07DQorICAgIHsweDFkNWMwLCAweDFlYWYwLCAweDFmNTdjLCAweDFkNGUwLCAweDFlYTc4LCAweDFmNTNlLCAweDFhOGMwLCAweDFkNDcwLA0KKyAgICAgMHgxYTg2MCwgMHgxNTA0MCwgMHgxYTgzMCwgMHgxNTAyMCwgMHgxYWRjMCwgMHgxZDZmMCwgMHgxZWI3YywgMHgxYWNlMCwNCisgICAgIDB4MWQ2NzgsIDB4MWViM2UsIDB4MTU4YzAsIDB4MWFjNzAsIDB4MTU4NjAsIDB4MTVkYzAsIDB4MWFlZjAsIDB4MWQ3N2MsDQorICAgICAweDE1Y2UwLCAweDFhZTc4LCAweDFkNzNlLCAweDE1YzcwLCAweDFhZTNjLCAweDE1ZWYwLCAweDFhZjdjLCAweDE1ZTc4LA0KKyAgICAgMHgxYWYzZSwgMHgxNWY3YywgMHgxZjVmYSwgMHgxZDJlMCwgMHgxZTk3OCwgMHgxZjRiZSwgMHgxYTRjMCwgMHgxZDI3MCwNCisgICAgIDB4MWU5M2MsIDB4MWE0NjAsIDB4MWQyMzgsIDB4MTQ4NDAsIDB4MWE0MzAsIDB4MWQyMWMsIDB4MTQ4MjAsIDB4MWE0MTgsDQorICAgICAweDE0ODEwLCAweDFhNmUwLCAweDFkMzc4LCAweDFlOWJlLCAweDE0Y2MwLCAweDFhNjcwLCAweDFkMzNjLCAweDE0YzYwLA0KKyAgICAgMHgxYTYzOCwgMHgxZDMxZSwgMHgxNGMzMCwgMHgxYTYxYywgMHgxNGVlMCwgMHgxYTc3OCwgMHgxZDNiZSwgMHgxNGU3MCwNCisgICAgIDB4MWE3M2MsIDB4MTRlMzgsIDB4MWE3MWUsIDB4MTRmNzgsIDB4MWE3YmUsIDB4MTRmM2MsIDB4MTRmMWUsIDB4MWEyYzAsDQorICAgICAweDFkMTcwLCAweDFlOGJjLCAweDFhMjYwLCAweDFkMTM4LCAweDFlODllLCAweDE0NDQwLCAweDFhMjMwLCAweDFkMTFjLA0KKyAgICAgMHgxNDQyMCwgMHgxYTIxOCwgMHgxNDQxMCwgMHgxNDQwOCwgMHgxNDZjMCwgMHgxYTM3MCwgMHgxZDFiYywgMHgxNDY2MCwNCisgICAgIDB4MWEzMzgsIDB4MWQxOWUsIDB4MTQ2MzAsIDB4MWEzMWMsIDB4MTQ2MTgsIDB4MTQ2MGMsIDB4MTQ3NzAsIDB4MWEzYmMsDQorICAgICAweDE0NzM4LCAweDFhMzllLCAweDE0NzFjLCAweDE0N2JjLCAweDFhMTYwLCAweDFkMGI4LCAweDFlODVlLCAweDE0MjQwLA0KKyAgICAgMHgxYTEzMCwgMHgxZDA5YywgMHgxNDIyMCwgMHgxYTExOCwgMHgxZDA4ZSwgMHgxNDIxMCwgMHgxYTEwYywgMHgxNDIwOCwNCisgICAgIDB4MWExMDYsIDB4MTQzNjAsIDB4MWExYjgsIDB4MWQwZGUsIDB4MTQzMzAsIDB4MWExOWMsIDB4MTQzMTgsIDB4MWExOGUsDQorICAgICAweDE0MzBjLCAweDE0MzA2LCAweDFhMWRlLCAweDE0MzhlLCAweDE0MTQwLCAweDFhMGIwLCAweDFkMDVjLCAweDE0MTIwLA0KKyAgICAgMHgxYTA5OCwgMHgxZDA0ZSwgMHgxNDExMCwgMHgxYTA4YywgMHgxNDEwOCwgMHgxYTA4NiwgMHgxNDEwNCwgMHgxNDFiMCwNCisgICAgIDB4MTQxOTgsIDB4MTQxOGMsIDB4MTQwYTAsIDB4MWQwMmUsIDB4MWEwNGMsIDB4MWEwNDYsIDB4MTQwODIsIDB4MWNhZTAsDQorICAgICAweDFlNTc4LCAweDFmMmJlLCAweDE5NGMwLCAweDFjYTcwLCAweDFlNTNjLCAweDE5NDYwLCAweDFjYTM4LCAweDFlNTFlLA0KKyAgICAgMHgxMjg0MCwgMHgxOTQzMCwgMHgxMjgyMCwgMHgxOTZlMCwgMHgxY2I3OCwgMHgxZTViZSwgMHgxMmNjMCwgMHgxOTY3MCwNCisgICAgIDB4MWNiM2MsIDB4MTJjNjAsIDB4MTk2MzgsIDB4MTJjMzAsIDB4MTJjMTgsIDB4MTJlZTAsIDB4MTk3NzgsIDB4MWNiYmUsDQorICAgICAweDEyZTcwLCAweDE5NzNjLCAweDEyZTM4LCAweDEyZTFjLCAweDEyZjc4LCAweDE5N2JlLCAweDEyZjNjLCAweDEyZmJlLA0KKyAgICAgMHgxZGFjMCwgMHgxZWQ3MCwgMHgxZjZiYywgMHgxZGE2MCwgMHgxZWQzOCwgMHgxZjY5ZSwgMHgxYjQ0MCwgMHgxZGEzMCwNCisgICAgIDB4MWVkMWMsIDB4MWI0MjAsIDB4MWRhMTgsIDB4MWVkMGUsIDB4MWI0MTAsIDB4MWRhMGMsIDB4MTkyYzAsIDB4MWM5NzAsDQorICAgICAweDFlNGJjLCAweDFiNmMwLCAweDE5MjYwLCAweDFjOTM4LCAweDFlNDllLCAweDFiNjYwLCAweDFkYjM4LCAweDFlZDllLA0KKyAgICAgMHgxNmM0MCwgMHgxMjQyMCwgMHgxOTIxOCwgMHgxYzkwZSwgMHgxNmMyMCwgMHgxYjYxOCwgMHgxNmMxMCwgMHgxMjZjMCwNCisgICAgIDB4MTkzNzAsIDB4MWM5YmMsIDB4MTZlYzAsIDB4MTI2NjAsIDB4MTkzMzgsIDB4MWM5OWUsIDB4MTZlNjAsIDB4MWI3MzgsDQorICAgICAweDFkYjllLCAweDE2ZTMwLCAweDEyNjE4LCAweDE2ZTE4LCAweDEyNzcwLCAweDE5M2JjLCAweDE2ZjcwLCAweDEyNzM4LA0KKyAgICAgMHgxOTM5ZSwgMHgxNmYzOCwgMHgxYjc5ZSwgMHgxNmYxYywgMHgxMjdiYywgMHgxNmZiYywgMHgxMjc5ZSwgMHgxNmY5ZSwNCisgICAgIDB4MWQ5NjAsIDB4MWVjYjgsIDB4MWY2NWUsIDB4MWIyNDAsIDB4MWQ5MzAsIDB4MWVjOWMsIDB4MWIyMjAsIDB4MWQ5MTgsDQorICAgICAweDFlYzhlLCAweDFiMjEwLCAweDFkOTBjLCAweDFiMjA4LCAweDFiMjA0LCAweDE5MTYwLCAweDFjOGI4LCAweDFlNDVlLA0KKyAgICAgMHgxYjM2MCwgMHgxOTEzMCwgMHgxYzg5YywgMHgxNjY0MCwgMHgxMjIyMCwgMHgxZDk5YywgMHgxYzg4ZSwgMHgxNjYyMCwNCisgICAgIDB4MTIyMTAsIDB4MTkxMGMsIDB4MTY2MTAsIDB4MWIzMGMsIDB4MTkxMDYsIDB4MTIyMDQsIDB4MTIzNjAsIDB4MTkxYjgsDQorICAgICAweDFjOGRlLCAweDE2NzYwLCAweDEyMzMwLCAweDE5MTljLCAweDE2NzMwLCAweDFiMzljLCAweDE5MThlLCAweDE2NzE4LA0KKyAgICAgMHgxMjMwYywgMHgxMjMwNiwgMHgxMjNiOCwgMHgxOTFkZSwgMHgxNjdiOCwgMHgxMjM5YywgMHgxNjc5YywgMHgxMjM4ZSwNCisgICAgIDB4MTY3OGUsIDB4MTY3ZGUsIDB4MWIxNDAsIDB4MWQ4YjAsIDB4MWVjNWMsIDB4MWIxMjAsIDB4MWQ4OTgsIDB4MWVjNGUsDQorICAgICAweDFiMTEwLCAweDFkODhjLCAweDFiMTA4LCAweDFkODg2LCAweDFiMTA0LCAweDFiMTAyLCAweDEyMTQwLCAweDE5MGIwLA0KKyAgICAgMHgxYzg1YywgMHgxNjM0MCwgMHgxMjEyMCwgMHgxOTA5OCwgMHgxYzg0ZSwgMHgxNjMyMCwgMHgxYjE5OCwgMHgxZDhjZSwNCisgICAgIDB4MTYzMTAsIDB4MTIxMDgsIDB4MTkwODYsIDB4MTYzMDgsIDB4MWIxODYsIDB4MTYzMDQsIDB4MTIxYjAsIDB4MTkwZGMsDQorICAgICAweDE2M2IwLCAweDEyMTk4LCAweDE5MGNlLCAweDE2Mzk4LCAweDFiMWNlLCAweDE2MzhjLCAweDEyMTg2LCAweDE2Mzg2LA0KKyAgICAgMHgxNjNkYywgMHgxNjNjZSwgMHgxYjBhMCwgMHgxZDg1OCwgMHgxZWMyZSwgMHgxYjA5MCwgMHgxZDg0YywgMHgxYjA4OCwNCisgICAgIDB4MWQ4NDYsIDB4MWIwODQsIDB4MWIwODIsIDB4MTIwYTAsIDB4MTkwNTgsIDB4MWM4MmUsIDB4MTYxYTAsIDB4MTIwOTAsDQorICAgICAweDE5MDRjLCAweDE2MTkwLCAweDFiMGNjLCAweDE5MDQ2LCAweDE2MTg4LCAweDEyMDg0LCAweDE2MTg0LCAweDEyMDgyLA0KKyAgICAgMHgxMjBkOCwgMHgxNjFkOCwgMHgxNjFjYywgMHgxNjFjNiwgMHgxZDgyYywgMHgxZDgyNiwgMHgxYjA0MiwgMHgxOTAyYywNCisgICAgIDB4MTIwNDgsIDB4MTYwYzgsIDB4MTYwYzQsIDB4MTYwYzIsIDB4MThhYzAsIDB4MWM1NzAsIDB4MWUyYmMsIDB4MThhNjAsDQorICAgICAweDFjNTM4LCAweDExNDQwLCAweDE4YTMwLCAweDFjNTFjLCAweDExNDIwLCAweDE4YTE4LCAweDExNDEwLCAweDExNDA4LA0KKyAgICAgMHgxMTZjMCwgMHgxOGI3MCwgMHgxYzViYywgMHgxMTY2MCwgMHgxOGIzOCwgMHgxYzU5ZSwgMHgxMTYzMCwgMHgxOGIxYywNCisgICAgIDB4MTE2MTgsIDB4MTE2MGMsIDB4MTE3NzAsIDB4MThiYmMsIDB4MTE3MzgsIDB4MThiOWUsIDB4MTE3MWMsIDB4MTE3YmMsDQorICAgICAweDExNzllLCAweDFjZDYwLCAweDFlNmI4LCAweDFmMzVlLCAweDE5YTQwLCAweDFjZDMwLCAweDFlNjljLCAweDE5YTIwLA0KKyAgICAgMHgxY2QxOCwgMHgxZTY4ZSwgMHgxOWExMCwgMHgxY2QwYywgMHgxOWEwOCwgMHgxY2QwNiwgMHgxODk2MCwgMHgxYzRiOCwNCisgICAgIDB4MWUyNWUsIDB4MTliNjAsIDB4MTg5MzAsIDB4MWM0OWMsIDB4MTM2NDAsIDB4MTEyMjAsIDB4MWNkOWMsIDB4MWM0OGUsDQorICAgICAweDEzNjIwLCAweDE5YjE4LCAweDE4OTBjLCAweDEzNjEwLCAweDExMjA4LCAweDEzNjA4LCAweDExMzYwLCAweDE4OWI4LA0KKyAgICAgMHgxYzRkZSwgMHgxMzc2MCwgMHgxMTMzMCwgMHgxY2RkZSwgMHgxMzczMCwgMHgxOWI5YywgMHgxODk4ZSwgMHgxMzcxOCwNCisgICAgIDB4MTEzMGMsIDB4MTM3MGMsIDB4MTEzYjgsIDB4MTg5ZGUsIDB4MTM3YjgsIDB4MTEzOWMsIDB4MTM3OWMsIDB4MTEzOGUsDQorICAgICAweDExM2RlLCAweDEzN2RlLCAweDFkZDQwLCAweDFlZWIwLCAweDFmNzVjLCAweDFkZDIwLCAweDFlZTk4LCAweDFmNzRlLA0KKyAgICAgMHgxZGQxMCwgMHgxZWU4YywgMHgxZGQwOCwgMHgxZWU4NiwgMHgxZGQwNCwgMHgxOTk0MCwgMHgxY2NiMCwgMHgxZTY1YywNCisgICAgIDB4MWJiNDAsIDB4MTk5MjAsIDB4MWVlZGMsIDB4MWU2NGUsIDB4MWJiMjAsIDB4MWRkOTgsIDB4MWVlY2UsIDB4MWJiMTAsDQorICAgICAweDE5OTA4LCAweDFjYzg2LCAweDFiYjA4LCAweDFkZDg2LCAweDE5OTAyLCAweDExMTQwLCAweDE4OGIwLCAweDFjNDVjLA0KKyAgICAgMHgxMzM0MCwgMHgxMTEyMCwgMHgxODg5OCwgMHgxYzQ0ZSwgMHgxNzc0MCwgMHgxMzMyMCwgMHgxOTk5OCwgMHgxY2NjZSwNCisgICAgIDB4MTc3MjAsIDB4MWJiOTgsIDB4MWRkY2UsIDB4MTg4ODYsIDB4MTc3MTAsIDB4MTMzMDgsIDB4MTk5ODYsIDB4MTc3MDgsDQorICAgICAweDExMTAyLCAweDExMWIwLCAweDE4OGRjLCAweDEzM2IwLCAweDExMTk4LCAweDE4OGNlLCAweDE3N2IwLCAweDEzMzk4LA0KKyAgICAgMHgxOTljZSwgMHgxNzc5OCwgMHgxYmJjZSwgMHgxMTE4NiwgMHgxMzM4NiwgMHgxMTFkYywgMHgxMzNkYywgMHgxMTFjZSwNCisgICAgIDB4MTc3ZGMsIDB4MTMzY2UsIDB4MWRjYTAsIDB4MWVlNTgsIDB4MWY3MmUsIDB4MWRjOTAsIDB4MWVlNGMsIDB4MWRjODgsDQorICAgICAweDFlZTQ2LCAweDFkYzg0LCAweDFkYzgyLCAweDE5OGEwLCAweDFjYzU4LCAweDFlNjJlLCAweDFiOWEwLCAweDE5ODkwLA0KKyAgICAgMHgxZWU2ZSwgMHgxYjk5MCwgMHgxZGNjYywgMHgxY2M0NiwgMHgxYjk4OCwgMHgxOTg4NCwgMHgxYjk4NCwgMHgxOTg4MiwNCisgICAgIDB4MWI5ODIsIDB4MTEwYTAsIDB4MTg4NTgsIDB4MWM0MmUsIDB4MTMxYTAsIDB4MTEwOTAsIDB4MTg4NGMsIDB4MTczYTAsDQorICAgICAweDEzMTkwLCAweDE5OGNjLCAweDE4ODQ2LCAweDE3MzkwLCAweDFiOWNjLCAweDExMDg0LCAweDE3Mzg4LCAweDEzMTg0LA0KKyAgICAgMHgxMTA4MiwgMHgxMzE4MiwgMHgxMTBkOCwgMHgxODg2ZSwgMHgxMzFkOCwgMHgxMTBjYywgMHgxNzNkOCwgMHgxMzFjYywNCisgICAgIDB4MTEwYzYsIDB4MTczY2MsIDB4MTMxYzYsIDB4MTEwZWUsIDB4MTczZWUsIDB4MWRjNTAsIDB4MWVlMmMsIDB4MWRjNDgsDQorICAgICAweDFlZTI2LCAweDFkYzQ0LCAweDFkYzQyLCAweDE5ODUwLCAweDFjYzJjLCAweDFiOGQwLCAweDE5ODQ4LCAweDFjYzI2LA0KKyAgICAgMHgxYjhjOCwgMHgxZGM2NiwgMHgxYjhjNCwgMHgxOTg0MiwgMHgxYjhjMiwgMHgxMTA1MCwgMHgxODgyYywgMHgxMzBkMCwNCisgICAgIDB4MTEwNDgsIDB4MTg4MjYsIDB4MTcxZDAsIDB4MTMwYzgsIDB4MTk4NjYsIDB4MTcxYzgsIDB4MWI4ZTYsIDB4MTEwNDIsDQorICAgICAweDE3MWM0LCAweDEzMGMyLCAweDE3MWMyLCAweDEzMGVjLCAweDE3MWVjLCAweDE3MWU2LCAweDFlZTE2LCAweDFkYzIyLA0KKyAgICAgMHgxY2MxNiwgMHgxOTgyNCwgMHgxOTgyMiwgMHgxMTAyOCwgMHgxMzA2OCwgMHgxNzBlOCwgMHgxMTAyMiwgMHgxMzA2MiwNCisgICAgIDB4MTg1NjAsIDB4MTBhNDAsIDB4MTg1MzAsIDB4MTBhMjAsIDB4MTg1MTgsIDB4MWMyOGUsIDB4MTBhMTAsIDB4MTg1MGMsDQorICAgICAweDEwYTA4LCAweDE4NTA2LCAweDEwYjYwLCAweDE4NWI4LCAweDFjMmRlLCAweDEwYjMwLCAweDE4NTljLCAweDEwYjE4LA0KKyAgICAgMHgxODU4ZSwgMHgxMGIwYywgMHgxMGIwNiwgMHgxMGJiOCwgMHgxODVkZSwgMHgxMGI5YywgMHgxMGI4ZSwgMHgxMGJkZSwNCisgICAgIDB4MThkNDAsIDB4MWM2YjAsIDB4MWUzNWMsIDB4MThkMjAsIDB4MWM2OTgsIDB4MThkMTAsIDB4MWM2OGMsIDB4MThkMDgsDQorICAgICAweDFjNjg2LCAweDE4ZDA0LCAweDEwOTQwLCAweDE4NGIwLCAweDFjMjVjLCAweDExYjQwLCAweDEwOTIwLCAweDFjNmRjLA0KKyAgICAgMHgxYzI0ZSwgMHgxMWIyMCwgMHgxOGQ5OCwgMHgxYzZjZSwgMHgxMWIxMCwgMHgxMDkwOCwgMHgxODQ4NiwgMHgxMWIwOCwNCisgICAgIDB4MThkODYsIDB4MTA5MDIsIDB4MTA5YjAsIDB4MTg0ZGMsIDB4MTFiYjAsIDB4MTA5OTgsIDB4MTg0Y2UsIDB4MTFiOTgsDQorICAgICAweDE4ZGNlLCAweDExYjhjLCAweDEwOTg2LCAweDEwOWRjLCAweDExYmRjLCAweDEwOWNlLCAweDExYmNlLCAweDFjZWEwLA0KKyAgICAgMHgxZTc1OCwgMHgxZjNhZSwgMHgxY2U5MCwgMHgxZTc0YywgMHgxY2U4OCwgMHgxZTc0NiwgMHgxY2U4NCwgMHgxY2U4MiwNCisgICAgIDB4MThjYTAsIDB4MWM2NTgsIDB4MTlkYTAsIDB4MThjOTAsIDB4MWM2NGMsIDB4MTlkOTAsIDB4MWNlY2MsIDB4MWM2NDYsDQorICAgICAweDE5ZDg4LCAweDE4Yzg0LCAweDE5ZDg0LCAweDE4YzgyLCAweDE5ZDgyLCAweDEwOGEwLCAweDE4NDU4LCAweDExOWEwLA0KKyAgICAgMHgxMDg5MCwgMHgxYzY2ZSwgMHgxM2JhMCwgMHgxMTk5MCwgMHgxOGNjYywgMHgxODQ0NiwgMHgxM2I5MCwgMHgxOWRjYywNCisgICAgIDB4MTA4ODQsIDB4MTNiODgsIDB4MTE5ODQsIDB4MTA4ODIsIDB4MTE5ODIsIDB4MTA4ZDgsIDB4MTg0NmUsIDB4MTE5ZDgsDQorICAgICAweDEwOGNjLCAweDEzYmQ4LCAweDExOWNjLCAweDEwOGM2LCAweDEzYmNjLCAweDExOWM2LCAweDEwOGVlLCAweDExOWVlLA0KKyAgICAgMHgxM2JlZSwgMHgxZWY1MCwgMHgxZjdhYywgMHgxZWY0OCwgMHgxZjdhNiwgMHgxZWY0NCwgMHgxZWY0MiwgMHgxY2U1MCwNCisgICAgIDB4MWU3MmMsIDB4MWRlZDAsIDB4MWVmNmMsIDB4MWU3MjYsIDB4MWRlYzgsIDB4MWVmNjYsIDB4MWRlYzQsIDB4MWNlNDIsDQorICAgICAweDFkZWMyLCAweDE4YzUwLCAweDFjNjJjLCAweDE5Y2QwLCAweDE4YzQ4LCAweDFjNjI2LCAweDFiZGQwLCAweDE5Y2M4LA0KKyAgICAgMHgxY2U2NiwgMHgxYmRjOCwgMHgxZGVlNiwgMHgxOGM0MiwgMHgxYmRjNCwgMHgxOWNjMiwgMHgxYmRjMiwgMHgxMDg1MCwNCisgICAgIDB4MTg0MmMsIDB4MTE4ZDAsIDB4MTA4NDgsIDB4MTg0MjYsIDB4MTM5ZDAsIDB4MTE4YzgsIDB4MThjNjYsIDB4MTdiZDAsDQorICAgICAweDEzOWM4LCAweDE5Y2U2LCAweDEwODQyLCAweDE3YmM4LCAweDFiZGU2LCAweDExOGMyLCAweDE3YmM0LCAweDEwODZjLA0KKyAgICAgMHgxMThlYywgMHgxMDg2NiwgMHgxMzllYywgMHgxMThlNiwgMHgxN2JlYywgMHgxMzllNiwgMHgxN2JlNiwgMHgxZWYyOCwNCisgICAgIDB4MWY3OTYsIDB4MWVmMjQsIDB4MWVmMjIsIDB4MWNlMjgsIDB4MWU3MTYsIDB4MWRlNjgsIDB4MWVmMzYsIDB4MWRlNjQsDQorICAgICAweDFjZTIyLCAweDFkZTYyLCAweDE4YzI4LCAweDFjNjE2LCAweDE5YzY4LCAweDE4YzI0LCAweDFiY2U4LCAweDE5YzY0LA0KKyAgICAgMHgxOGMyMiwgMHgxYmNlNCwgMHgxOWM2MiwgMHgxYmNlMiwgMHgxMDgyOCwgMHgxODQxNiwgMHgxMTg2OCwgMHgxOGMzNiwNCisgICAgIDB4MTM4ZTgsIDB4MTE4NjQsIDB4MTA4MjIsIDB4MTc5ZTgsIDB4MTM4ZTQsIDB4MTE4NjIsIDB4MTc5ZTQsIDB4MTM4ZTIsDQorICAgICAweDE3OWUyLCAweDExODc2LCAweDE3OWY2LCAweDFlZjEyLCAweDFkZTM0LCAweDFkZTMyLCAweDE5YzM0LCAweDFiYzc0LA0KKyAgICAgMHgxYmM3MiwgMHgxMTgzNCwgMHgxMzg3NCwgMHgxNzhmNCwgMHgxNzhmMiwgMHgxMDU0MCwgMHgxMDUyMCwgMHgxODI5OCwNCisgICAgIDB4MTA1MTAsIDB4MTA1MDgsIDB4MTA1MDQsIDB4MTA1YjAsIDB4MTA1OTgsIDB4MTA1OGMsIDB4MTA1ODYsIDB4MTA1ZGMsDQorICAgICAweDEwNWNlLCAweDE4NmEwLCAweDE4NjkwLCAweDFjMzRjLCAweDE4Njg4LCAweDFjMzQ2LCAweDE4Njg0LCAweDE4NjgyLA0KKyAgICAgMHgxMDRhMCwgMHgxODI1OCwgMHgxMGRhMCwgMHgxODZkOCwgMHgxODI0YywgMHgxMGQ5MCwgMHgxODZjYywgMHgxMGQ4OCwNCisgICAgIDB4MTg2YzYsIDB4MTBkODQsIDB4MTA0ODIsIDB4MTBkODIsIDB4MTA0ZDgsIDB4MTgyNmUsIDB4MTBkZDgsIDB4MTg2ZWUsDQorICAgICAweDEwZGNjLCAweDEwNGM2LCAweDEwZGM2LCAweDEwNGVlLCAweDEwZGVlLCAweDFjNzUwLCAweDFjNzQ4LCAweDFjNzQ0LA0KKyAgICAgMHgxYzc0MiwgMHgxODY1MCwgMHgxOGVkMCwgMHgxYzc2YywgMHgxYzMyNiwgMHgxOGVjOCwgMHgxYzc2NiwgMHgxOGVjNCwNCisgICAgIDB4MTg2NDIsIDB4MThlYzIsIDB4MTA0NTAsIDB4MTBjZDAsIDB4MTA0NDgsIDB4MTgyMjYsIDB4MTFkZDAsIDB4MTBjYzgsDQorICAgICAweDEwNDQ0LCAweDExZGM4LCAweDEwY2M0LCAweDEwNDQyLCAweDExZGM0LCAweDEwY2MyLCAweDEwNDZjLCAweDEwY2VjLA0KKyAgICAgMHgxMDQ2NiwgMHgxMWRlYywgMHgxMGNlNiwgMHgxMWRlNiwgMHgxZTdhOCwgMHgxZTdhNCwgMHgxZTdhMiwgMHgxYzcyOCwNCisgICAgIDB4MWNmNjgsIDB4MWU3YjYsIDB4MWNmNjQsIDB4MWM3MjIsIDB4MWNmNjIsIDB4MTg2MjgsIDB4MWMzMTYsIDB4MThlNjgsDQorICAgICAweDFjNzM2LCAweDE5ZWU4LCAweDE4ZTY0LCAweDE4NjIyLCAweDE5ZWU0LCAweDE4ZTYyLCAweDE5ZWUyLCAweDEwNDI4LA0KKyAgICAgMHgxODIxNiwgMHgxMGM2OCwgMHgxODYzNiwgMHgxMWNlOCwgMHgxMGM2NCwgMHgxMDQyMiwgMHgxM2RlOCwgMHgxMWNlNCwNCisgICAgIDB4MTBjNjIsIDB4MTNkZTQsIDB4MTFjZTIsIDB4MTA0MzYsIDB4MTBjNzYsIDB4MTFjZjYsIDB4MTNkZjYsIDB4MWY3ZDQsDQorICAgICAweDFmN2QyLCAweDFlNzk0LCAweDFlZmI0LCAweDFlNzkyLCAweDFlZmIyLCAweDFjNzE0LCAweDFjZjM0LCAweDFjNzEyLA0KKyAgICAgMHgxZGY3NCwgMHgxY2YzMiwgMHgxZGY3MiwgMHgxODYxNCwgMHgxOGUzNCwgMHgxODYxMiwgMHgxOWU3NCwgMHgxOGUzMiwNCisgICAgIDB4MWJlZjR9LA0KKyAgICB7MHgxZjU2MCwgMHgxZmFiOCwgMHgxZWE0MCwgMHgxZjUzMCwgMHgxZmE5YywgMHgxZWEyMCwgMHgxZjUxOCwgMHgxZmE4ZSwNCisgICAgIDB4MWVhMTAsIDB4MWY1MGMsIDB4MWVhMDgsIDB4MWY1MDYsIDB4MWVhMDQsIDB4MWViNjAsIDB4MWY1YjgsIDB4MWZhZGUsDQorICAgICAweDFkNjQwLCAweDFlYjMwLCAweDFmNTljLCAweDFkNjIwLCAweDFlYjE4LCAweDFmNThlLCAweDFkNjEwLCAweDFlYjBjLA0KKyAgICAgMHgxZDYwOCwgMHgxZWIwNiwgMHgxZDYwNCwgMHgxZDc2MCwgMHgxZWJiOCwgMHgxZjVkZSwgMHgxYWU0MCwgMHgxZDczMCwNCisgICAgIDB4MWViOWMsIDB4MWFlMjAsIDB4MWQ3MTgsIDB4MWViOGUsIDB4MWFlMTAsIDB4MWQ3MGMsIDB4MWFlMDgsIDB4MWQ3MDYsDQorICAgICAweDFhZTA0LCAweDFhZjYwLCAweDFkN2I4LCAweDFlYmRlLCAweDE1ZTQwLCAweDFhZjMwLCAweDFkNzljLCAweDE1ZTIwLA0KKyAgICAgMHgxYWYxOCwgMHgxZDc4ZSwgMHgxNWUxMCwgMHgxYWYwYywgMHgxNWUwOCwgMHgxYWYwNiwgMHgxNWY2MCwgMHgxYWZiOCwNCisgICAgIDB4MWQ3ZGUsIDB4MTVmMzAsIDB4MWFmOWMsIDB4MTVmMTgsIDB4MWFmOGUsIDB4MTVmMGMsIDB4MTVmYjgsIDB4MWFmZGUsDQorICAgICAweDE1ZjljLCAweDE1ZjhlLCAweDFlOTQwLCAweDFmNGIwLCAweDFmYTVjLCAweDFlOTIwLCAweDFmNDk4LCAweDFmYTRlLA0KKyAgICAgMHgxZTkxMCwgMHgxZjQ4YywgMHgxZTkwOCwgMHgxZjQ4NiwgMHgxZTkwNCwgMHgxZTkwMiwgMHgxZDM0MCwgMHgxZTliMCwNCisgICAgIDB4MWY0ZGMsIDB4MWQzMjAsIDB4MWU5OTgsIDB4MWY0Y2UsIDB4MWQzMTAsIDB4MWU5OGMsIDB4MWQzMDgsIDB4MWU5ODYsDQorICAgICAweDFkMzA0LCAweDFkMzAyLCAweDFhNzQwLCAweDFkM2IwLCAweDFlOWRjLCAweDFhNzIwLCAweDFkMzk4LCAweDFlOWNlLA0KKyAgICAgMHgxYTcxMCwgMHgxZDM4YywgMHgxYTcwOCwgMHgxZDM4NiwgMHgxYTcwNCwgMHgxYTcwMiwgMHgxNGY0MCwgMHgxYTdiMCwNCisgICAgIDB4MWQzZGMsIDB4MTRmMjAsIDB4MWE3OTgsIDB4MWQzY2UsIDB4MTRmMTAsIDB4MWE3OGMsIDB4MTRmMDgsIDB4MWE3ODYsDQorICAgICAweDE0ZjA0LCAweDE0ZmIwLCAweDFhN2RjLCAweDE0Zjk4LCAweDFhN2NlLCAweDE0ZjhjLCAweDE0Zjg2LCAweDE0ZmRjLA0KKyAgICAgMHgxNGZjZSwgMHgxZThhMCwgMHgxZjQ1OCwgMHgxZmEyZSwgMHgxZTg5MCwgMHgxZjQ0YywgMHgxZTg4OCwgMHgxZjQ0NiwNCisgICAgIDB4MWU4ODQsIDB4MWU4ODIsIDB4MWQxYTAsIDB4MWU4ZDgsIDB4MWY0NmUsIDB4MWQxOTAsIDB4MWU4Y2MsIDB4MWQxODgsDQorICAgICAweDFlOGM2LCAweDFkMTg0LCAweDFkMTgyLCAweDFhM2EwLCAweDFkMWQ4LCAweDFlOGVlLCAweDFhMzkwLCAweDFkMWNjLA0KKyAgICAgMHgxYTM4OCwgMHgxZDFjNiwgMHgxYTM4NCwgMHgxYTM4MiwgMHgxNDdhMCwgMHgxYTNkOCwgMHgxZDFlZSwgMHgxNDc5MCwNCisgICAgIDB4MWEzY2MsIDB4MTQ3ODgsIDB4MWEzYzYsIDB4MTQ3ODQsIDB4MTQ3ODIsIDB4MTQ3ZDgsIDB4MWEzZWUsIDB4MTQ3Y2MsDQorICAgICAweDE0N2M2LCAweDE0N2VlLCAweDFlODUwLCAweDFmNDJjLCAweDFlODQ4LCAweDFmNDI2LCAweDFlODQ0LCAweDFlODQyLA0KKyAgICAgMHgxZDBkMCwgMHgxZTg2YywgMHgxZDBjOCwgMHgxZTg2NiwgMHgxZDBjNCwgMHgxZDBjMiwgMHgxYTFkMCwgMHgxZDBlYywNCisgICAgIDB4MWExYzgsIDB4MWQwZTYsIDB4MWExYzQsIDB4MWExYzIsIDB4MTQzZDAsIDB4MWExZWMsIDB4MTQzYzgsIDB4MWExZTYsDQorICAgICAweDE0M2M0LCAweDE0M2MyLCAweDE0M2VjLCAweDE0M2U2LCAweDFlODI4LCAweDFmNDE2LCAweDFlODI0LCAweDFlODIyLA0KKyAgICAgMHgxZDA2OCwgMHgxZTgzNiwgMHgxZDA2NCwgMHgxZDA2MiwgMHgxYTBlOCwgMHgxZDA3NiwgMHgxYTBlNCwgMHgxYTBlMiwNCisgICAgIDB4MTQxZTgsIDB4MWEwZjYsIDB4MTQxZTQsIDB4MTQxZTIsIDB4MWU4MTQsIDB4MWU4MTIsIDB4MWQwMzQsIDB4MWQwMzIsDQorICAgICAweDFhMDc0LCAweDFhMDcyLCAweDFlNTQwLCAweDFmMmIwLCAweDFmOTVjLCAweDFlNTIwLCAweDFmMjk4LCAweDFmOTRlLA0KKyAgICAgMHgxZTUxMCwgMHgxZjI4YywgMHgxZTUwOCwgMHgxZjI4NiwgMHgxZTUwNCwgMHgxZTUwMiwgMHgxY2I0MCwgMHgxZTViMCwNCisgICAgIDB4MWYyZGMsIDB4MWNiMjAsIDB4MWU1OTgsIDB4MWYyY2UsIDB4MWNiMTAsIDB4MWU1OGMsIDB4MWNiMDgsIDB4MWU1ODYsDQorICAgICAweDFjYjA0LCAweDFjYjAyLCAweDE5NzQwLCAweDFjYmIwLCAweDFlNWRjLCAweDE5NzIwLCAweDFjYjk4LCAweDFlNWNlLA0KKyAgICAgMHgxOTcxMCwgMHgxY2I4YywgMHgxOTcwOCwgMHgxY2I4NiwgMHgxOTcwNCwgMHgxOTcwMiwgMHgxMmY0MCwgMHgxOTdiMCwNCisgICAgIDB4MWNiZGMsIDB4MTJmMjAsIDB4MTk3OTgsIDB4MWNiY2UsIDB4MTJmMTAsIDB4MTk3OGMsIDB4MTJmMDgsIDB4MTk3ODYsDQorICAgICAweDEyZjA0LCAweDEyZmIwLCAweDE5N2RjLCAweDEyZjk4LCAweDE5N2NlLCAweDEyZjhjLCAweDEyZjg2LCAweDEyZmRjLA0KKyAgICAgMHgxMmZjZSwgMHgxZjZhMCwgMHgxZmI1OCwgMHgxNmJmMCwgMHgxZjY5MCwgMHgxZmI0YywgMHgxNjlmOCwgMHgxZjY4OCwNCisgICAgIDB4MWZiNDYsIDB4MTY4ZmMsIDB4MWY2ODQsIDB4MWY2ODIsIDB4MWU0YTAsIDB4MWYyNTgsIDB4MWY5MmUsIDB4MWVkYTAsDQorICAgICAweDFlNDkwLCAweDFmYjZlLCAweDFlZDkwLCAweDFmNmNjLCAweDFmMjQ2LCAweDFlZDg4LCAweDFlNDg0LCAweDFlZDg0LA0KKyAgICAgMHgxZTQ4MiwgMHgxZWQ4MiwgMHgxYzlhMCwgMHgxZTRkOCwgMHgxZjI2ZSwgMHgxZGJhMCwgMHgxYzk5MCwgMHgxZTRjYywNCisgICAgIDB4MWRiOTAsIDB4MWVkY2MsIDB4MWU0YzYsIDB4MWRiODgsIDB4MWM5ODQsIDB4MWRiODQsIDB4MWM5ODIsIDB4MWRiODIsDQorICAgICAweDE5M2EwLCAweDFjOWQ4LCAweDFlNGVlLCAweDFiN2EwLCAweDE5MzkwLCAweDFjOWNjLCAweDFiNzkwLCAweDFkYmNjLA0KKyAgICAgMHgxYzljNiwgMHgxYjc4OCwgMHgxOTM4NCwgMHgxYjc4NCwgMHgxOTM4MiwgMHgxYjc4MiwgMHgxMjdhMCwgMHgxOTNkOCwNCisgICAgIDB4MWM5ZWUsIDB4MTZmYTAsIDB4MTI3OTAsIDB4MTkzY2MsIDB4MTZmOTAsIDB4MWI3Y2MsIDB4MTkzYzYsIDB4MTZmODgsDQorICAgICAweDEyNzg0LCAweDE2Zjg0LCAweDEyNzgyLCAweDEyN2Q4LCAweDE5M2VlLCAweDE2ZmQ4LCAweDEyN2NjLCAweDE2ZmNjLA0KKyAgICAgMHgxMjdjNiwgMHgxNmZjNiwgMHgxMjdlZSwgMHgxZjY1MCwgMHgxZmIyYywgMHgxNjVmOCwgMHgxZjY0OCwgMHgxZmIyNiwNCisgICAgIDB4MTY0ZmMsIDB4MWY2NDQsIDB4MTY0N2UsIDB4MWY2NDIsIDB4MWU0NTAsIDB4MWYyMmMsIDB4MWVjZDAsIDB4MWU0NDgsDQorICAgICAweDFmMjI2LCAweDFlY2M4LCAweDFmNjY2LCAweDFlY2M0LCAweDFlNDQyLCAweDFlY2MyLCAweDFjOGQwLCAweDFlNDZjLA0KKyAgICAgMHgxZDlkMCwgMHgxYzhjOCwgMHgxZTQ2NiwgMHgxZDljOCwgMHgxZWNlNiwgMHgxZDljNCwgMHgxYzhjMiwgMHgxZDljMiwNCisgICAgIDB4MTkxZDAsIDB4MWM4ZWMsIDB4MWIzZDAsIDB4MTkxYzgsIDB4MWM4ZTYsIDB4MWIzYzgsIDB4MWQ5ZTYsIDB4MWIzYzQsDQorICAgICAweDE5MWMyLCAweDFiM2MyLCAweDEyM2QwLCAweDE5MWVjLCAweDE2N2QwLCAweDEyM2M4LCAweDE5MWU2LCAweDE2N2M4LA0KKyAgICAgMHgxYjNlNiwgMHgxNjdjNCwgMHgxMjNjMiwgMHgxNjdjMiwgMHgxMjNlYywgMHgxNjdlYywgMHgxMjNlNiwgMHgxNjdlNiwNCisgICAgIDB4MWY2MjgsIDB4MWZiMTYsIDB4MTYyZmMsIDB4MWY2MjQsIDB4MTYyN2UsIDB4MWY2MjIsIDB4MWU0MjgsIDB4MWYyMTYsDQorICAgICAweDFlYzY4LCAweDFmNjM2LCAweDFlYzY0LCAweDFlNDIyLCAweDFlYzYyLCAweDFjODY4LCAweDFlNDM2LCAweDFkOGU4LA0KKyAgICAgMHgxYzg2NCwgMHgxZDhlNCwgMHgxYzg2MiwgMHgxZDhlMiwgMHgxOTBlOCwgMHgxYzg3NiwgMHgxYjFlOCwgMHgxZDhmNiwNCisgICAgIDB4MWIxZTQsIDB4MTkwZTIsIDB4MWIxZTIsIDB4MTIxZTgsIDB4MTkwZjYsIDB4MTYzZTgsIDB4MTIxZTQsIDB4MTYzZTQsDQorICAgICAweDEyMWUyLCAweDE2M2UyLCAweDEyMWY2LCAweDE2M2Y2LCAweDFmNjE0LCAweDE2MTdlLCAweDFmNjEyLCAweDFlNDE0LA0KKyAgICAgMHgxZWMzNCwgMHgxZTQxMiwgMHgxZWMzMiwgMHgxYzgzNCwgMHgxZDg3NCwgMHgxYzgzMiwgMHgxZDg3MiwgMHgxOTA3NCwNCisgICAgIDB4MWIwZjQsIDB4MTkwNzIsIDB4MWIwZjIsIDB4MTIwZjQsIDB4MTYxZjQsIDB4MTIwZjIsIDB4MTYxZjIsIDB4MWY2MGEsDQorICAgICAweDFlNDBhLCAweDFlYzFhLCAweDFjODFhLCAweDFkODNhLCAweDE5MDNhLCAweDFiMDdhLCAweDFlMmEwLCAweDFmMTU4LA0KKyAgICAgMHgxZjhhZSwgMHgxZTI5MCwgMHgxZjE0YywgMHgxZTI4OCwgMHgxZjE0NiwgMHgxZTI4NCwgMHgxZTI4MiwgMHgxYzVhMCwNCisgICAgIDB4MWUyZDgsIDB4MWYxNmUsIDB4MWM1OTAsIDB4MWUyY2MsIDB4MWM1ODgsIDB4MWUyYzYsIDB4MWM1ODQsIDB4MWM1ODIsDQorICAgICAweDE4YmEwLCAweDFjNWQ4LCAweDFlMmVlLCAweDE4YjkwLCAweDFjNWNjLCAweDE4Yjg4LCAweDFjNWM2LCAweDE4Yjg0LA0KKyAgICAgMHgxOGI4MiwgMHgxMTdhMCwgMHgxOGJkOCwgMHgxYzVlZSwgMHgxMTc5MCwgMHgxOGJjYywgMHgxMTc4OCwgMHgxOGJjNiwNCisgICAgIDB4MTE3ODQsIDB4MTE3ODIsIDB4MTE3ZDgsIDB4MThiZWUsIDB4MTE3Y2MsIDB4MTE3YzYsIDB4MTE3ZWUsIDB4MWYzNTAsDQorICAgICAweDFmOWFjLCAweDEzNWY4LCAweDFmMzQ4LCAweDFmOWE2LCAweDEzNGZjLCAweDFmMzQ0LCAweDEzNDdlLCAweDFmMzQyLA0KKyAgICAgMHgxZTI1MCwgMHgxZjEyYywgMHgxZTZkMCwgMHgxZTI0OCwgMHgxZjEyNiwgMHgxZTZjOCwgMHgxZjM2NiwgMHgxZTZjNCwNCisgICAgIDB4MWUyNDIsIDB4MWU2YzIsIDB4MWM0ZDAsIDB4MWUyNmMsIDB4MWNkZDAsIDB4MWM0YzgsIDB4MWUyNjYsIDB4MWNkYzgsDQorICAgICAweDFlNmU2LCAweDFjZGM0LCAweDFjNGMyLCAweDFjZGMyLCAweDE4OWQwLCAweDFjNGVjLCAweDE5YmQwLCAweDE4OWM4LA0KKyAgICAgMHgxYzRlNiwgMHgxOWJjOCwgMHgxY2RlNiwgMHgxOWJjNCwgMHgxODljMiwgMHgxOWJjMiwgMHgxMTNkMCwgMHgxODllYywNCisgICAgIDB4MTM3ZDAsIDB4MTEzYzgsIDB4MTg5ZTYsIDB4MTM3YzgsIDB4MTliZTYsIDB4MTM3YzQsIDB4MTEzYzIsIDB4MTM3YzIsDQorICAgICAweDExM2VjLCAweDEzN2VjLCAweDExM2U2LCAweDEzN2U2LCAweDFmYmE4LCAweDE3NWYwLCAweDFiYWZjLCAweDFmYmE0LA0KKyAgICAgMHgxNzRmOCwgMHgxYmE3ZSwgMHgxZmJhMiwgMHgxNzQ3YywgMHgxNzQzZSwgMHgxZjMyOCwgMHgxZjk5NiwgMHgxMzJmYywNCisgICAgIDB4MWY3NjgsIDB4MWZiYjYsIDB4MTc2ZmMsIDB4MTMyN2UsIDB4MWY3NjQsIDB4MWYzMjIsIDB4MTc2N2UsIDB4MWY3NjIsDQorICAgICAweDFlMjI4LCAweDFmMTE2LCAweDFlNjY4LCAweDFlMjI0LCAweDFlZWU4LCAweDFmNzc2LCAweDFlMjIyLCAweDFlZWU0LA0KKyAgICAgMHgxZTY2MiwgMHgxZWVlMiwgMHgxYzQ2OCwgMHgxZTIzNiwgMHgxY2NlOCwgMHgxYzQ2NCwgMHgxZGRlOCwgMHgxY2NlNCwNCisgICAgIDB4MWM0NjIsIDB4MWRkZTQsIDB4MWNjZTIsIDB4MWRkZTIsIDB4MTg4ZTgsIDB4MWM0NzYsIDB4MTk5ZTgsIDB4MTg4ZTQsDQorICAgICAweDFiYmU4LCAweDE5OWU0LCAweDE4OGUyLCAweDFiYmU0LCAweDE5OWUyLCAweDFiYmUyLCAweDExMWU4LCAweDE4OGY2LA0KKyAgICAgMHgxMzNlOCwgMHgxMTFlNCwgMHgxNzdlOCwgMHgxMzNlNCwgMHgxMTFlMiwgMHgxNzdlNCwgMHgxMzNlMiwgMHgxNzdlMiwNCisgICAgIDB4MTExZjYsIDB4MTMzZjYsIDB4MWZiOTQsIDB4MTcyZjgsIDB4MWI5N2UsIDB4MWZiOTIsIDB4MTcyN2MsIDB4MTcyM2UsDQorICAgICAweDFmMzE0LCAweDEzMTdlLCAweDFmNzM0LCAweDFmMzEyLCAweDE3MzdlLCAweDFmNzMyLCAweDFlMjE0LCAweDFlNjM0LA0KKyAgICAgMHgxZTIxMiwgMHgxZWU3NCwgMHgxZTYzMiwgMHgxZWU3MiwgMHgxYzQzNCwgMHgxY2M3NCwgMHgxYzQzMiwgMHgxZGNmNCwNCisgICAgIDB4MWNjNzIsIDB4MWRjZjIsIDB4MTg4NzQsIDB4MTk4ZjQsIDB4MTg4NzIsIDB4MWI5ZjQsIDB4MTk4ZjIsIDB4MWI5ZjIsDQorICAgICAweDExMGY0LCAweDEzMWY0LCAweDExMGYyLCAweDE3M2Y0LCAweDEzMWYyLCAweDE3M2YyLCAweDFmYjhhLCAweDE3MTdjLA0KKyAgICAgMHgxNzEzZSwgMHgxZjMwYSwgMHgxZjcxYSwgMHgxZTIwYSwgMHgxZTYxYSwgMHgxZWUzYSwgMHgxYzQxYSwgMHgxY2MzYSwNCisgICAgIDB4MWRjN2EsIDB4MTg4M2EsIDB4MTk4N2EsIDB4MWI4ZmEsIDB4MTEwN2EsIDB4MTMwZmEsIDB4MTcxZmEsIDB4MTcwYmUsDQorICAgICAweDFlMTUwLCAweDFmMGFjLCAweDFlMTQ4LCAweDFmMGE2LCAweDFlMTQ0LCAweDFlMTQyLCAweDFjMmQwLCAweDFlMTZjLA0KKyAgICAgMHgxYzJjOCwgMHgxZTE2NiwgMHgxYzJjNCwgMHgxYzJjMiwgMHgxODVkMCwgMHgxYzJlYywgMHgxODVjOCwgMHgxYzJlNiwNCisgICAgIDB4MTg1YzQsIDB4MTg1YzIsIDB4MTBiZDAsIDB4MTg1ZWMsIDB4MTBiYzgsIDB4MTg1ZTYsIDB4MTBiYzQsIDB4MTBiYzIsDQorICAgICAweDEwYmVjLCAweDEwYmU2LCAweDFmMWE4LCAweDFmOGQ2LCAweDExYWZjLCAweDFmMWE0LCAweDExYTdlLCAweDFmMWEyLA0KKyAgICAgMHgxZTEyOCwgMHgxZjA5NiwgMHgxZTM2OCwgMHgxZTEyNCwgMHgxZTM2NCwgMHgxZTEyMiwgMHgxZTM2MiwgMHgxYzI2OCwNCisgICAgIDB4MWUxMzYsIDB4MWM2ZTgsIDB4MWMyNjQsIDB4MWM2ZTQsIDB4MWMyNjIsIDB4MWM2ZTIsIDB4MTg0ZTgsIDB4MWMyNzYsDQorICAgICAweDE4ZGU4LCAweDE4NGU0LCAweDE4ZGU0LCAweDE4NGUyLCAweDE4ZGUyLCAweDEwOWU4LCAweDE4NGY2LCAweDExYmU4LA0KKyAgICAgMHgxMDllNCwgMHgxMWJlNCwgMHgxMDllMiwgMHgxMWJlMiwgMHgxMDlmNiwgMHgxMWJmNiwgMHgxZjlkNCwgMHgxM2FmOCwNCisgICAgIDB4MTlkN2UsIDB4MWY5ZDIsIDB4MTNhN2MsIDB4MTNhM2UsIDB4MWYxOTQsIDB4MTE5N2UsIDB4MWYzYjQsIDB4MWYxOTIsDQorICAgICAweDEzYjdlLCAweDFmM2IyLCAweDFlMTE0LCAweDFlMzM0LCAweDFlMTEyLCAweDFlNzc0LCAweDFlMzMyLCAweDFlNzcyLA0KKyAgICAgMHgxYzIzNCwgMHgxYzY3NCwgMHgxYzIzMiwgMHgxY2VmNCwgMHgxYzY3MiwgMHgxY2VmMiwgMHgxODQ3NCwgMHgxOGNmNCwNCisgICAgIDB4MTg0NzIsIDB4MTlkZjQsIDB4MThjZjIsIDB4MTlkZjIsIDB4MTA4ZjQsIDB4MTE5ZjQsIDB4MTA4ZjIsIDB4MTNiZjQsDQorICAgICAweDExOWYyLCAweDEzYmYyLCAweDE3YWYwLCAweDFiZDdjLCAweDE3YTc4LCAweDFiZDNlLCAweDE3YTNjLCAweDE3YTFlLA0KKyAgICAgMHgxZjljYSwgMHgxMzk3YywgMHgxZmJkYSwgMHgxN2I3YywgMHgxMzkzZSwgMHgxN2IzZSwgMHgxZjE4YSwgMHgxZjM5YSwNCisgICAgIDB4MWY3YmEsIDB4MWUxMGEsIDB4MWUzMWEsIDB4MWU3M2EsIDB4MWVmN2EsIDB4MWMyMWEsIDB4MWM2M2EsIDB4MWNlN2EsDQorICAgICAweDFkZWZhLCAweDE4NDNhLCAweDE4YzdhLCAweDE5Y2ZhLCAweDFiZGZhLCAweDEwODdhLCAweDExOGZhLCAweDEzOWZhLA0KKyAgICAgMHgxNzk3OCwgMHgxYmNiZSwgMHgxNzkzYywgMHgxNzkxZSwgMHgxMzhiZSwgMHgxNzliZSwgMHgxNzhiYywgMHgxNzg5ZSwNCisgICAgIDB4MTc4NWUsIDB4MWUwYTgsIDB4MWUwYTQsIDB4MWUwYTIsIDB4MWMxNjgsIDB4MWUwYjYsIDB4MWMxNjQsIDB4MWMxNjIsDQorICAgICAweDE4MmU4LCAweDFjMTc2LCAweDE4MmU0LCAweDE4MmUyLCAweDEwNWU4LCAweDE4MmY2LCAweDEwNWU0LCAweDEwNWUyLA0KKyAgICAgMHgxMDVmNiwgMHgxZjBkNCwgMHgxMGQ3ZSwgMHgxZjBkMiwgMHgxZTA5NCwgMHgxZTFiNCwgMHgxZTA5MiwgMHgxZTFiMiwNCisgICAgIDB4MWMxMzQsIDB4MWMzNzQsIDB4MWMxMzIsIDB4MWMzNzIsIDB4MTgyNzQsIDB4MTg2ZjQsIDB4MTgyNzIsIDB4MTg2ZjIsDQorICAgICAweDEwNGY0LCAweDEwZGY0LCAweDEwNGYyLCAweDEwZGYyLCAweDFmOGVhLCAweDExZDdjLCAweDExZDNlLCAweDFmMGNhLA0KKyAgICAgMHgxZjFkYSwgMHgxZTA4YSwgMHgxZTE5YSwgMHgxZTNiYSwgMHgxYzExYSwgMHgxYzMzYSwgMHgxYzc3YSwgMHgxODIzYSwNCisgICAgIDB4MTg2N2EsIDB4MThlZmEsIDB4MTA0N2EsIDB4MTBjZmEsIDB4MTFkZmEsIDB4MTNkNzgsIDB4MTllYmUsIDB4MTNkM2MsDQorICAgICAweDEzZDFlLCAweDExY2JlLCAweDEzZGJlLCAweDE3ZDcwLCAweDFiZWJjLCAweDE3ZDM4LCAweDFiZTllLCAweDE3ZDFjLA0KKyAgICAgMHgxN2QwZSwgMHgxM2NiYywgMHgxN2RiYywgMHgxM2M5ZSwgMHgxN2Q5ZSwgMHgxN2NiOCwgMHgxYmU1ZSwgMHgxN2M5YywNCisgICAgIDB4MTdjOGUsIDB4MTNjNWUsIDB4MTdjZGUsIDB4MTdjNWMsIDB4MTdjNGUsIDB4MTdjMmUsIDB4MWMwYjQsIDB4MWMwYjIsDQorICAgICAweDE4MTc0LCAweDE4MTcyLCAweDEwMmY0LCAweDEwMmYyLCAweDFlMGRhLCAweDFjMDlhLCAweDFjMWJhLCAweDE4MTNhLA0KKyAgICAgMHgxODM3YSwgMHgxMDI3YSwgMHgxMDZmYSwgMHgxMGViZSwgMHgxMWViYywgMHgxMWU5ZSwgMHgxM2ViOCwgMHgxOWY1ZSwNCisgICAgIDB4MTNlOWMsIDB4MTNlOGUsIDB4MTFlNWUsIDB4MTNlZGUsIDB4MTdlYjAsIDB4MWJmNWMsIDB4MTdlOTgsIDB4MWJmNGUsDQorICAgICAweDE3ZThjLCAweDE3ZTg2LCAweDEzZTVjLCAweDE3ZWRjLCAweDEzZTRlLCAweDE3ZWNlLCAweDE3ZTU4LCAweDFiZjJlLA0KKyAgICAgMHgxN2U0YywgMHgxN2U0NiwgMHgxM2UyZSwgMHgxN2U2ZSwgMHgxN2UyYywgMHgxN2UyNiwgMHgxMGY1ZSwgMHgxMWY1YywNCisgICAgIDB4MTFmNGUsIDB4MTNmNTgsIDB4MTlmYWUsIDB4MTNmNGMsIDB4MTNmNDYsIDB4MTFmMmUsIDB4MTNmNmUsIDB4MTNmMmMsDQorICAgICAweDEzZjI2fSwNCisgICAgezB4MWFiZTAsIDB4MWQ1ZjgsIDB4MTUzYzAsIDB4MWE5ZjAsIDB4MWQ0ZmMsIDB4MTUxZTAsIDB4MWE4ZjgsIDB4MWQ0N2UsDQorICAgICAweDE1MGYwLCAweDFhODdjLCAweDE1MDc4LCAweDFmYWQwLCAweDE1YmUwLCAweDFhZGY4LCAweDFmYWM4LCAweDE1OWYwLA0KKyAgICAgMHgxYWNmYywgMHgxZmFjNCwgMHgxNThmOCwgMHgxYWM3ZSwgMHgxZmFjMiwgMHgxNTg3YywgMHgxZjVkMCwgMHgxZmFlYywNCisgICAgIDB4MTVkZjgsIDB4MWY1YzgsIDB4MWZhZTYsIDB4MTVjZmMsIDB4MWY1YzQsIDB4MTVjN2UsIDB4MWY1YzIsIDB4MWViZDAsDQorICAgICAweDFmNWVjLCAweDFlYmM4LCAweDFmNWU2LCAweDFlYmM0LCAweDFlYmMyLCAweDFkN2QwLCAweDFlYmVjLCAweDFkN2M4LA0KKyAgICAgMHgxZWJlNiwgMHgxZDdjNCwgMHgxZDdjMiwgMHgxYWZkMCwgMHgxZDdlYywgMHgxYWZjOCwgMHgxZDdlNiwgMHgxYWZjNCwNCisgICAgIDB4MTRiYzAsIDB4MWE1ZjAsIDB4MWQyZmMsIDB4MTQ5ZTAsIDB4MWE0ZjgsIDB4MWQyN2UsIDB4MTQ4ZjAsIDB4MWE0N2MsDQorICAgICAweDE0ODc4LCAweDFhNDNlLCAweDE0ODNjLCAweDFmYTY4LCAweDE0ZGYwLCAweDFhNmZjLCAweDFmYTY0LCAweDE0Y2Y4LA0KKyAgICAgMHgxYTY3ZSwgMHgxZmE2MiwgMHgxNGM3YywgMHgxNGMzZSwgMHgxZjRlOCwgMHgxZmE3NiwgMHgxNGVmYywgMHgxZjRlNCwNCisgICAgIDB4MTRlN2UsIDB4MWY0ZTIsIDB4MWU5ZTgsIDB4MWY0ZjYsIDB4MWU5ZTQsIDB4MWU5ZTIsIDB4MWQzZTgsIDB4MWU5ZjYsDQorICAgICAweDFkM2U0LCAweDFkM2UyLCAweDFhN2U4LCAweDFkM2Y2LCAweDFhN2U0LCAweDFhN2UyLCAweDE0NWUwLCAweDFhMmY4LA0KKyAgICAgMHgxZDE3ZSwgMHgxNDRmMCwgMHgxYTI3YywgMHgxNDQ3OCwgMHgxYTIzZSwgMHgxNDQzYywgMHgxNDQxZSwgMHgxZmEzNCwNCisgICAgIDB4MTQ2ZjgsIDB4MWEzN2UsIDB4MWZhMzIsIDB4MTQ2N2MsIDB4MTQ2M2UsIDB4MWY0NzQsIDB4MTQ3N2UsIDB4MWY0NzIsDQorICAgICAweDFlOGY0LCAweDFlOGYyLCAweDFkMWY0LCAweDFkMWYyLCAweDFhM2Y0LCAweDFhM2YyLCAweDE0MmYwLCAweDFhMTdjLA0KKyAgICAgMHgxNDI3OCwgMHgxYTEzZSwgMHgxNDIzYywgMHgxNDIxZSwgMHgxZmExYSwgMHgxNDM3YywgMHgxNDMzZSwgMHgxZjQzYSwNCisgICAgIDB4MWU4N2EsIDB4MWQwZmEsIDB4MTQxNzgsIDB4MWEwYmUsIDB4MTQxM2MsIDB4MTQxMWUsIDB4MTQxYmUsIDB4MTQwYmMsDQorICAgICAweDE0MDllLCAweDEyYmMwLCAweDE5NWYwLCAweDFjYWZjLCAweDEyOWUwLCAweDE5NGY4LCAweDFjYTdlLCAweDEyOGYwLA0KKyAgICAgMHgxOTQ3YywgMHgxMjg3OCwgMHgxOTQzZSwgMHgxMjgzYywgMHgxZjk2OCwgMHgxMmRmMCwgMHgxOTZmYywgMHgxZjk2NCwNCisgICAgIDB4MTJjZjgsIDB4MTk2N2UsIDB4MWY5NjIsIDB4MTJjN2MsIDB4MTJjM2UsIDB4MWYyZTgsIDB4MWY5NzYsIDB4MTJlZmMsDQorICAgICAweDFmMmU0LCAweDEyZTdlLCAweDFmMmUyLCAweDFlNWU4LCAweDFmMmY2LCAweDFlNWU0LCAweDFlNWUyLCAweDFjYmU4LA0KKyAgICAgMHgxZTVmNiwgMHgxY2JlNCwgMHgxY2JlMiwgMHgxOTdlOCwgMHgxY2JmNiwgMHgxOTdlNCwgMHgxOTdlMiwgMHgxYjVlMCwNCisgICAgIDB4MWRhZjgsIDB4MWVkN2UsIDB4MTY5YzAsIDB4MWI0ZjAsIDB4MWRhN2MsIDB4MTY4ZTAsIDB4MWI0NzgsIDB4MWRhM2UsDQorICAgICAweDE2ODcwLCAweDFiNDNjLCAweDE2ODM4LCAweDFiNDFlLCAweDE2ODFjLCAweDEyNWUwLCAweDE5MmY4LCAweDFjOTdlLA0KKyAgICAgMHgxNmRlMCwgMHgxMjRmMCwgMHgxOTI3YywgMHgxNmNmMCwgMHgxYjY3YywgMHgxOTIzZSwgMHgxNmM3OCwgMHgxMjQzYywNCisgICAgIDB4MTZjM2MsIDB4MTI0MWUsIDB4MTZjMWUsIDB4MWY5MzQsIDB4MTI2ZjgsIDB4MTkzN2UsIDB4MWZiNzQsIDB4MWY5MzIsDQorICAgICAweDE2ZWY4LCAweDEyNjdjLCAweDFmYjcyLCAweDE2ZTdjLCAweDEyNjNlLCAweDE2ZTNlLCAweDFmMjc0LCAweDEyNzdlLA0KKyAgICAgMHgxZjZmNCwgMHgxZjI3MiwgMHgxNmY3ZSwgMHgxZjZmMiwgMHgxZTRmNCwgMHgxZWRmNCwgMHgxZTRmMiwgMHgxZWRmMiwNCisgICAgIDB4MWM5ZjQsIDB4MWRiZjQsIDB4MWM5ZjIsIDB4MWRiZjIsIDB4MTkzZjQsIDB4MTkzZjIsIDB4MTY1YzAsIDB4MWIyZjAsDQorICAgICAweDFkOTdjLCAweDE2NGUwLCAweDFiMjc4LCAweDFkOTNlLCAweDE2NDcwLCAweDFiMjNjLCAweDE2NDM4LCAweDFiMjFlLA0KKyAgICAgMHgxNjQxYywgMHgxNjQwZSwgMHgxMjJmMCwgMHgxOTE3YywgMHgxNjZmMCwgMHgxMjI3OCwgMHgxOTEzZSwgMHgxNjY3OCwNCisgICAgIDB4MWIzM2UsIDB4MTY2M2MsIDB4MTIyMWUsIDB4MTY2MWUsIDB4MWY5MWEsIDB4MTIzN2MsIDB4MWZiM2EsIDB4MTY3N2MsDQorICAgICAweDEyMzNlLCAweDE2NzNlLCAweDFmMjNhLCAweDFmNjdhLCAweDFlNDdhLCAweDFlY2ZhLCAweDFjOGZhLCAweDFkOWZhLA0KKyAgICAgMHgxOTFmYSwgMHgxNjJlMCwgMHgxYjE3OCwgMHgxZDhiZSwgMHgxNjI3MCwgMHgxYjEzYywgMHgxNjIzOCwgMHgxYjExZSwNCisgICAgIDB4MTYyMWMsIDB4MTYyMGUsIDB4MTIxNzgsIDB4MTkwYmUsIDB4MTYzNzgsIDB4MTIxM2MsIDB4MTYzM2MsIDB4MTIxMWUsDQorICAgICAweDE2MzFlLCAweDEyMWJlLCAweDE2M2JlLCAweDE2MTcwLCAweDFiMGJjLCAweDE2MTM4LCAweDFiMDllLCAweDE2MTFjLA0KKyAgICAgMHgxNjEwZSwgMHgxMjBiYywgMHgxNjFiYywgMHgxMjA5ZSwgMHgxNjE5ZSwgMHgxNjBiOCwgMHgxYjA1ZSwgMHgxNjA5YywNCisgICAgIDB4MTYwOGUsIDB4MTIwNWUsIDB4MTYwZGUsIDB4MTYwNWMsIDB4MTYwNGUsIDB4MTE1ZTAsIDB4MThhZjgsIDB4MWM1N2UsDQorICAgICAweDExNGYwLCAweDE4YTdjLCAweDExNDc4LCAweDE4YTNlLCAweDExNDNjLCAweDExNDFlLCAweDFmOGI0LCAweDExNmY4LA0KKyAgICAgMHgxOGI3ZSwgMHgxZjhiMiwgMHgxMTY3YywgMHgxMTYzZSwgMHgxZjE3NCwgMHgxMTc3ZSwgMHgxZjE3MiwgMHgxZTJmNCwNCisgICAgIDB4MWUyZjIsIDB4MWM1ZjQsIDB4MWM1ZjIsIDB4MThiZjQsIDB4MThiZjIsIDB4MTM1YzAsIDB4MTlhZjAsIDB4MWNkN2MsDQorICAgICAweDEzNGUwLCAweDE5YTc4LCAweDFjZDNlLCAweDEzNDcwLCAweDE5YTNjLCAweDEzNDM4LCAweDE5YTFlLCAweDEzNDFjLA0KKyAgICAgMHgxMzQwZSwgMHgxMTJmMCwgMHgxODk3YywgMHgxMzZmMCwgMHgxMTI3OCwgMHgxODkzZSwgMHgxMzY3OCwgMHgxOWIzZSwNCisgICAgIDB4MTM2M2MsIDB4MTEyMWUsIDB4MTM2MWUsIDB4MWY4OWEsIDB4MTEzN2MsIDB4MWY5YmEsIDB4MTM3N2MsIDB4MTEzM2UsDQorICAgICAweDEzNzNlLCAweDFmMTNhLCAweDFmMzdhLCAweDFlMjdhLCAweDFlNmZhLCAweDFjNGZhLCAweDFjZGZhLCAweDE4OWZhLA0KKyAgICAgMHgxYmFlMCwgMHgxZGQ3OCwgMHgxZWViZSwgMHgxNzRjMCwgMHgxYmE3MCwgMHgxZGQzYywgMHgxNzQ2MCwgMHgxYmEzOCwNCisgICAgIDB4MWRkMWUsIDB4MTc0MzAsIDB4MWJhMWMsIDB4MTc0MTgsIDB4MWJhMGUsIDB4MTc0MGMsIDB4MTMyZTAsIDB4MTk5NzgsDQorICAgICAweDFjY2JlLCAweDE3NmUwLCAweDEzMjcwLCAweDE5OTNjLCAweDE3NjcwLCAweDFiYjNjLCAweDE5OTFlLCAweDE3NjM4LA0KKyAgICAgMHgxMzIxYywgMHgxNzYxYywgMHgxMzIwZSwgMHgxNzYwZSwgMHgxMTE3OCwgMHgxODhiZSwgMHgxMzM3OCwgMHgxMTEzYywNCisgICAgIDB4MTc3NzgsIDB4MTMzM2MsIDB4MTExMWUsIDB4MTc3M2MsIDB4MTMzMWUsIDB4MTc3MWUsIDB4MTExYmUsIDB4MTMzYmUsDQorICAgICAweDE3N2JlLCAweDE3MmMwLCAweDFiOTcwLCAweDFkY2JjLCAweDE3MjYwLCAweDFiOTM4LCAweDFkYzllLCAweDE3MjMwLA0KKyAgICAgMHgxYjkxYywgMHgxNzIxOCwgMHgxYjkwZSwgMHgxNzIwYywgMHgxNzIwNiwgMHgxMzE3MCwgMHgxOThiYywgMHgxNzM3MCwNCisgICAgIDB4MTMxMzgsIDB4MTk4OWUsIDB4MTczMzgsIDB4MWI5OWUsIDB4MTczMWMsIDB4MTMxMGUsIDB4MTczMGUsIDB4MTEwYmMsDQorICAgICAweDEzMWJjLCAweDExMDllLCAweDE3M2JjLCAweDEzMTllLCAweDE3MzllLCAweDE3MTYwLCAweDFiOGI4LCAweDFkYzVlLA0KKyAgICAgMHgxNzEzMCwgMHgxYjg5YywgMHgxNzExOCwgMHgxYjg4ZSwgMHgxNzEwYywgMHgxNzEwNiwgMHgxMzBiOCwgMHgxOTg1ZSwNCisgICAgIDB4MTcxYjgsIDB4MTMwOWMsIDB4MTcxOWMsIDB4MTMwOGUsIDB4MTcxOGUsIDB4MTEwNWUsIDB4MTMwZGUsIDB4MTcxZGUsDQorICAgICAweDE3MGIwLCAweDFiODVjLCAweDE3MDk4LCAweDFiODRlLCAweDE3MDhjLCAweDE3MDg2LCAweDEzMDVjLCAweDE3MGRjLA0KKyAgICAgMHgxMzA0ZSwgMHgxNzBjZSwgMHgxNzA1OCwgMHgxYjgyZSwgMHgxNzA0YywgMHgxNzA0NiwgMHgxMzAyZSwgMHgxNzA2ZSwNCisgICAgIDB4MTcwMmMsIDB4MTcwMjYsIDB4MTBhZjAsIDB4MTg1N2MsIDB4MTBhNzgsIDB4MTg1M2UsIDB4MTBhM2MsIDB4MTBhMWUsDQorICAgICAweDEwYjdjLCAweDEwYjNlLCAweDFmMGJhLCAweDFlMTdhLCAweDFjMmZhLCAweDE4NWZhLCAweDExYWUwLCAweDE4ZDc4LA0KKyAgICAgMHgxYzZiZSwgMHgxMWE3MCwgMHgxOGQzYywgMHgxMWEzOCwgMHgxOGQxZSwgMHgxMWExYywgMHgxMWEwZSwgMHgxMDk3OCwNCisgICAgIDB4MTg0YmUsIDB4MTFiNzgsIDB4MTA5M2MsIDB4MTFiM2MsIDB4MTA5MWUsIDB4MTFiMWUsIDB4MTA5YmUsIDB4MTFiYmUsDQorICAgICAweDEzYWMwLCAweDE5ZDcwLCAweDFjZWJjLCAweDEzYTYwLCAweDE5ZDM4LCAweDFjZTllLCAweDEzYTMwLCAweDE5ZDFjLA0KKyAgICAgMHgxM2ExOCwgMHgxOWQwZSwgMHgxM2EwYywgMHgxM2EwNiwgMHgxMTk3MCwgMHgxOGNiYywgMHgxM2I3MCwgMHgxMTkzOCwNCisgICAgIDB4MThjOWUsIDB4MTNiMzgsIDB4MTE5MWMsIDB4MTNiMWMsIDB4MTE5MGUsIDB4MTNiMGUsIDB4MTA4YmMsIDB4MTE5YmMsDQorICAgICAweDEwODllLCAweDEzYmJjLCAweDExOTllLCAweDEzYjllLCAweDFiZDYwLCAweDFkZWI4LCAweDFlZjVlLCAweDE3YTQwLA0KKyAgICAgMHgxYmQzMCwgMHgxZGU5YywgMHgxN2EyMCwgMHgxYmQxOCwgMHgxZGU4ZSwgMHgxN2ExMCwgMHgxYmQwYywgMHgxN2EwOCwNCisgICAgIDB4MWJkMDYsIDB4MTdhMDQsIDB4MTM5NjAsIDB4MTljYjgsIDB4MWNlNWUsIDB4MTdiNjAsIDB4MTM5MzAsIDB4MTljOWMsDQorICAgICAweDE3YjMwLCAweDFiZDljLCAweDE5YzhlLCAweDE3YjE4LCAweDEzOTBjLCAweDE3YjBjLCAweDEzOTA2LCAweDE3YjA2LA0KKyAgICAgMHgxMThiOCwgMHgxOGM1ZSwgMHgxMzliOCwgMHgxMTg5YywgMHgxN2JiOCwgMHgxMzk5YywgMHgxMTg4ZSwgMHgxN2I5YywNCisgICAgIDB4MTM5OGUsIDB4MTdiOGUsIDB4MTA4NWUsIDB4MTE4ZGUsIDB4MTM5ZGUsIDB4MTdiZGUsIDB4MTc5NDAsIDB4MWJjYjAsDQorICAgICAweDFkZTVjLCAweDE3OTIwLCAweDFiYzk4LCAweDFkZTRlLCAweDE3OTEwLCAweDFiYzhjLCAweDE3OTA4LCAweDFiYzg2LA0KKyAgICAgMHgxNzkwNCwgMHgxNzkwMiwgMHgxMzhiMCwgMHgxOWM1YywgMHgxNzliMCwgMHgxMzg5OCwgMHgxOWM0ZSwgMHgxNzk5OCwNCisgICAgIDB4MWJjY2UsIDB4MTc5OGMsIDB4MTM4ODYsIDB4MTc5ODYsIDB4MTE4NWMsIDB4MTM4ZGMsIDB4MTE4NGUsIDB4MTc5ZGMsDQorICAgICAweDEzOGNlLCAweDE3OWNlLCAweDE3OGEwLCAweDFiYzU4LCAweDFkZTJlLCAweDE3ODkwLCAweDFiYzRjLCAweDE3ODg4LA0KKyAgICAgMHgxYmM0NiwgMHgxNzg4NCwgMHgxNzg4MiwgMHgxMzg1OCwgMHgxOWMyZSwgMHgxNzhkOCwgMHgxMzg0YywgMHgxNzhjYywNCisgICAgIDB4MTM4NDYsIDB4MTc4YzYsIDB4MTE4MmUsIDB4MTM4NmUsIDB4MTc4ZWUsIDB4MTc4NTAsIDB4MWJjMmMsIDB4MTc4NDgsDQorICAgICAweDFiYzI2LCAweDE3ODQ0LCAweDE3ODQyLCAweDEzODJjLCAweDE3ODZjLCAweDEzODI2LCAweDE3ODY2LCAweDE3ODI4LA0KKyAgICAgMHgxYmMxNiwgMHgxNzgyNCwgMHgxNzgyMiwgMHgxMzgxNiwgMHgxNzgzNiwgMHgxMDU3OCwgMHgxODJiZSwgMHgxMDUzYywNCisgICAgIDB4MTA1MWUsIDB4MTA1YmUsIDB4MTBkNzAsIDB4MTg2YmMsIDB4MTBkMzgsIDB4MTg2OWUsIDB4MTBkMWMsIDB4MTBkMGUsDQorICAgICAweDEwNGJjLCAweDEwZGJjLCAweDEwNDllLCAweDEwZDllLCAweDExZDYwLCAweDE4ZWI4LCAweDFjNzVlLCAweDExZDMwLA0KKyAgICAgMHgxOGU5YywgMHgxMWQxOCwgMHgxOGU4ZSwgMHgxMWQwYywgMHgxMWQwNiwgMHgxMGNiOCwgMHgxODY1ZSwgMHgxMWRiOCwNCisgICAgIDB4MTBjOWMsIDB4MTFkOWMsIDB4MTBjOGUsIDB4MTFkOGUsIDB4MTA0NWUsIDB4MTBjZGUsIDB4MTFkZGUsIDB4MTNkNDAsDQorICAgICAweDE5ZWIwLCAweDFjZjVjLCAweDEzZDIwLCAweDE5ZTk4LCAweDFjZjRlLCAweDEzZDEwLCAweDE5ZThjLCAweDEzZDA4LA0KKyAgICAgMHgxOWU4NiwgMHgxM2QwNCwgMHgxM2QwMiwgMHgxMWNiMCwgMHgxOGU1YywgMHgxM2RiMCwgMHgxMWM5OCwgMHgxOGU0ZSwNCisgICAgIDB4MTNkOTgsIDB4MTllY2UsIDB4MTNkOGMsIDB4MTFjODYsIDB4MTNkODYsIDB4MTBjNWMsIDB4MTFjZGMsIDB4MTBjNGUsDQorICAgICAweDEzZGRjLCAweDExY2NlLCAweDEzZGNlLCAweDFiZWEwLCAweDFkZjU4LCAweDFlZmFlLCAweDFiZTkwLCAweDFkZjRjLA0KKyAgICAgMHgxYmU4OCwgMHgxZGY0NiwgMHgxYmU4NCwgMHgxYmU4MiwgMHgxM2NhMCwgMHgxOWU1OCwgMHgxY2YyZSwgMHgxN2RhMCwNCisgICAgIDB4MTNjOTAsIDB4MTllNGMsIDB4MTdkOTAsIDB4MWJlY2MsIDB4MTllNDYsIDB4MTdkODgsIDB4MTNjODQsIDB4MTdkODQsDQorICAgICAweDEzYzgyLCAweDE3ZDgyLCAweDExYzU4LCAweDE4ZTJlLCAweDEzY2Q4LCAweDExYzRjLCAweDE3ZGQ4LCAweDEzY2NjLA0KKyAgICAgMHgxMWM0NiwgMHgxN2RjYywgMHgxM2NjNiwgMHgxN2RjNiwgMHgxMGMyZSwgMHgxMWM2ZSwgMHgxM2NlZSwgMHgxN2RlZSwNCisgICAgIDB4MWJlNTAsIDB4MWRmMmMsIDB4MWJlNDgsIDB4MWRmMjYsIDB4MWJlNDQsIDB4MWJlNDIsIDB4MTNjNTAsIDB4MTllMmMsDQorICAgICAweDE3Y2QwLCAweDEzYzQ4LCAweDE5ZTI2LCAweDE3Y2M4LCAweDFiZTY2LCAweDE3Y2M0LCAweDEzYzQyLCAweDE3Y2MyLA0KKyAgICAgMHgxMWMyYywgMHgxM2M2YywgMHgxMWMyNiwgMHgxN2NlYywgMHgxM2M2NiwgMHgxN2NlNiwgMHgxYmUyOCwgMHgxZGYxNiwNCisgICAgIDB4MWJlMjQsIDB4MWJlMjIsIDB4MTNjMjgsIDB4MTllMTYsIDB4MTdjNjgsIDB4MTNjMjQsIDB4MTdjNjQsIDB4MTNjMjIsDQorICAgICAweDE3YzYyLCAweDExYzE2LCAweDEzYzM2LCAweDE3Yzc2LCAweDFiZTE0LCAweDFiZTEyLCAweDEzYzE0LCAweDE3YzM0LA0KKyAgICAgMHgxM2MxMiwgMHgxN2MzMiwgMHgxMDJiYywgMHgxMDI5ZSwgMHgxMDZiOCwgMHgxODM1ZSwgMHgxMDY5YywgMHgxMDY4ZSwNCisgICAgIDB4MTAyNWUsIDB4MTA2ZGUsIDB4MTBlYjAsIDB4MTg3NWMsIDB4MTBlOTgsIDB4MTg3NGUsIDB4MTBlOGMsIDB4MTBlODYsDQorICAgICAweDEwNjVjLCAweDEwZWRjLCAweDEwNjRlLCAweDEwZWNlLCAweDExZWEwLCAweDE4ZjU4LCAweDFjN2FlLCAweDExZTkwLA0KKyAgICAgMHgxOGY0YywgMHgxMWU4OCwgMHgxOGY0NiwgMHgxMWU4NCwgMHgxMWU4MiwgMHgxMGU1OCwgMHgxODcyZSwgMHgxMWVkOCwNCisgICAgIDB4MThmNmUsIDB4MTFlY2MsIDB4MTBlNDYsIDB4MTFlYzYsIDB4MTA2MmUsIDB4MTBlNmUsIDB4MTFlZWUsIDB4MTlmNTAsDQorICAgICAweDFjZmFjLCAweDE5ZjQ4LCAweDFjZmE2LCAweDE5ZjQ0LCAweDE5ZjQyLCAweDExZTUwLCAweDE4ZjJjLCAweDEzZWQwLA0KKyAgICAgMHgxOWY2YywgMHgxOGYyNiwgMHgxM2VjOCwgMHgxMWU0NCwgMHgxM2VjNCwgMHgxMWU0MiwgMHgxM2VjMiwgMHgxMGUyYywNCisgICAgIDB4MTFlNmMsIDB4MTBlMjYsIDB4MTNlZWMsIDB4MTFlNjYsIDB4MTNlZTYsIDB4MWRmYTgsIDB4MWVmZDYsIDB4MWRmYTQsDQorICAgICAweDFkZmEyLCAweDE5ZjI4LCAweDFjZjk2LCAweDFiZjY4LCAweDE5ZjI0LCAweDFiZjY0LCAweDE5ZjIyLCAweDFiZjYyLA0KKyAgICAgMHgxMWUyOCwgMHgxOGYxNiwgMHgxM2U2OCwgMHgxMWUyNCwgMHgxN2VlOCwgMHgxM2U2NCwgMHgxMWUyMiwgMHgxN2VlNCwNCisgICAgIDB4MTNlNjIsIDB4MTdlZTIsIDB4MTBlMTYsIDB4MTFlMzYsIDB4MTNlNzYsIDB4MTdlZjYsIDB4MWRmOTQsIDB4MWRmOTIsDQorICAgICAweDE5ZjE0LCAweDFiZjM0LCAweDE5ZjEyLCAweDFiZjMyLCAweDExZTE0LCAweDEzZTM0LCAweDExZTEyLCAweDE3ZTc0LA0KKyAgICAgMHgxM2UzMiwgMHgxN2U3MiwgMHgxZGY4YSwgMHgxOWYwYSwgMHgxYmYxYSwgMHgxMWUwYSwgMHgxM2UxYSwgMHgxN2UzYSwNCisgICAgIDB4MTAzNWMsIDB4MTAzNGUsIDB4MTA3NTgsIDB4MTgzYWUsIDB4MTA3NGMsIDB4MTA3NDYsIDB4MTAzMmUsIDB4MTA3NmUsDQorICAgICAweDEwZjUwLCAweDE4N2FjLCAweDEwZjQ4LCAweDE4N2E2LCAweDEwZjQ0LCAweDEwZjQyLCAweDEwNzJjLCAweDEwZjZjLA0KKyAgICAgMHgxMDcyNiwgMHgxMGY2NiwgMHgxOGZhOCwgMHgxYzdkNiwgMHgxOGZhNCwgMHgxOGZhMiwgMHgxMGYyOCwgMHgxODc5NiwNCisgICAgIDB4MTFmNjgsIDB4MThmYjYsIDB4MTFmNjQsIDB4MTBmMjIsIDB4MTFmNjIsIDB4MTA3MTYsIDB4MTBmMzYsIDB4MTFmNzYsDQorICAgICAweDFjZmQ0LCAweDFjZmQyLCAweDE4Zjk0LCAweDE5ZmI0LCAweDE4ZjkyLCAweDE5ZmIyLCAweDEwZjE0LCAweDExZjM0LA0KKyAgICAgMHgxMGYxMiwgMHgxM2Y3NCwgMHgxMWYzMiwgMHgxM2Y3MiwgMHgxY2ZjYSwgMHgxOGY4YSwgMHgxOWY5YSwgMHgxMGYwYSwNCisgICAgIDB4MTFmMWEsIDB4MTNmM2EsIDB4MTAzYWMsIDB4MTAzYTYsIDB4MTA3YTgsIDB4MTgzZDYsIDB4MTA3YTQsIDB4MTA3YTIsDQorICAgICAweDEwMzk2LCAweDEwN2I2LCAweDE4N2Q0LCAweDE4N2QyLCAweDEwNzk0LCAweDEwZmI0LCAweDEwNzkyLCAweDEwZmIyLA0KKyAgICAgMHgxYzdlYX19Ow0KIEZYX0ZMT0FUIENCQ19QREY0MTc6OlBSRUZFUlJFRF9SQVRJTyA9IDMuMGY7DQogRlhfRkxPQVQgQ0JDX1BERjQxNzo6REVGQVVMVF9NT0RVTEVfV0lEVEggPSAwLjM1N2Y7DQogRlhfRkxPQVQgQ0JDX1BERjQxNzo6SEVJR0hUID0gMi4wZjsNCi1DQkNfUERGNDE3OjpDQkNfUERGNDE3KCkNCi17DQotICAgIG1fY29tcGFjdCA9IEZBTFNFOw0KLSAgICBtX2NvbXBhY3Rpb24gPSBBVVRPOw0KLSAgICBtX21pbkNvbHMgPSAxOw0KLSAgICBtX21heENvbHMgPSAzMDsNCi0gICAgbV9tYXhSb3dzID0gOTA7DQotICAgIG1fbWluUm93cyA9IDM7DQotICAgIG1fYmFyY29kZU1hdHJpeCA9IE5VTEw7DQorQ0JDX1BERjQxNzo6Q0JDX1BERjQxNygpIHsNCisgIG1fY29tcGFjdCA9IEZBTFNFOw0KKyAgbV9jb21wYWN0aW9uID0gQVVUTzsNCisgIG1fbWluQ29scyA9IDE7DQorICBtX21heENvbHMgPSAzMDsNCisgIG1fbWF4Um93cyA9IDkwOw0KKyAgbV9taW5Sb3dzID0gMzsNCisgIG1fYmFyY29kZU1hdHJpeCA9IE5VTEw7DQogfQ0KLUNCQ19QREY0MTc6OkNCQ19QREY0MTcoRlhfQk9PTCBjb21wYWN0KQ0KLXsNCi0gICAgbV9jb21wYWN0ID0gY29tcGFjdDsNCi0gICAgbV9jb21wYWN0aW9uID0gQVVUTzsNCi0gICAgbV9taW5Db2xzID0gMTsNCi0gICAgbV9tYXhDb2xzID0gMzA7DQotICAgIG1fbWF4Um93cyA9IDkwOw0KLSAgICBtX21pblJvd3MgPSAzOw0KLSAgICBtX2JhcmNvZGVNYXRyaXggPSBOVUxMOw0KK0NCQ19QREY0MTc6OkNCQ19QREY0MTcoRlhfQk9PTCBjb21wYWN0KSB7DQorICBtX2NvbXBhY3QgPSBjb21wYWN0Ow0KKyAgbV9jb21wYWN0aW9uID0gQVVUTzsNCisgIG1fbWluQ29scyA9IDE7DQorICBtX21heENvbHMgPSAzMDsNCisgIG1fbWF4Um93cyA9IDkwOw0KKyAgbV9taW5Sb3dzID0gMzsNCisgIG1fYmFyY29kZU1hdHJpeCA9IE5VTEw7DQogfQ0KLUNCQ19QREY0MTc6On5DQkNfUERGNDE3KCkNCi17DQotICAgIGlmIChtX2JhcmNvZGVNYXRyaXgpIHsNCi0gICAgICAgIGRlbGV0ZSBtX2JhcmNvZGVNYXRyaXg7DQorQ0JDX1BERjQxNzo6fkNCQ19QREY0MTcoKSB7DQorICBpZiAobV9iYXJjb2RlTWF0cml4KSB7DQorICAgIGRlbGV0ZSBtX2JhcmNvZGVNYXRyaXg7DQorICB9DQorfQ0KK0NCQ19CYXJjb2RlTWF0cml4KiBDQkNfUERGNDE3OjpnZXRCYXJjb2RlTWF0cml4KCkgew0KKyAgcmV0dXJuIG1fYmFyY29kZU1hdHJpeDsNCit9DQordm9pZCBDQkNfUERGNDE3OjpnZW5lcmF0ZUJhcmNvZGVMb2dpYyhDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25Db2RlV29yZHMgPQ0KKyAgICAgIENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdldEVycm9yQ29ycmVjdGlvbkNvZGV3b3JkQ291bnQoDQorICAgICAgICAgIGVycm9yQ29ycmVjdGlvbkxldmVsLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgaGlnaExldmVsID0NCisgICAgICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlSGlnaExldmVsKG1zZywgbV9jb21wYWN0aW9uLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgaW50MzJfdCBzb3VyY2VDb2RlV29yZHMgPSBoaWdoTGV2ZWwuR2V0TGVuZ3RoKCk7DQorICBDRlhfSW50MzJBcnJheSogZGltZW5zaW9uID0NCisgICAgICBkZXRlcm1pbmVEaW1lbnNpb25zKHNvdXJjZUNvZGVXb3JkcywgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgaW50MzJfdCBjb2xzID0gZGltZW5zaW9uLT5HZXRBdCgwKTsNCisgIGludDMyX3Qgcm93cyA9IGRpbWVuc2lvbi0+R2V0QXQoMSk7DQorICBkZWxldGUgZGltZW5zaW9uOw0KKyAgaW50MzJfdCBwYWQgPSBnZXROdW1iZXJPZlBhZENvZGV3b3Jkcyhzb3VyY2VDb2RlV29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgY29scywgcm93cyk7DQorICBpZiAoc291cmNlQ29kZVdvcmRzICsgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzICsgMSA+IDkyOSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25FbmNvZGVkTWVzc2FnZUNvbnRhaW5zVG9vTWFueUNvZGVXb3JkczsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBuID0gc291cmNlQ29kZVdvcmRzICsgcGFkICsgMTsNCisgIENGWF9XaWRlU3RyaW5nIHNiOw0KKyAgc2IgKz0gKEZYX1dDSEFSKW47DQorICBzYiArPSBoaWdoTGV2ZWw7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwYWQ7IGkrKykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpOTAwOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgZGF0YUNvZGV3b3JkcyhzYik7DQorICBDRlhfV2lkZVN0cmluZyBlYyA9IENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdlbmVyYXRlRXJyb3JDb3JyZWN0aW9uKA0KKyAgICAgIGRhdGFDb2Rld29yZHMsIGVycm9yQ29ycmVjdGlvbkxldmVsLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgZnVsbENvZGV3b3JkcyA9IGRhdGFDb2Rld29yZHMgKyBlYzsNCisgIG1fYmFyY29kZU1hdHJpeCA9IEZYX05FVyBDQkNfQmFyY29kZU1hdHJpeChyb3dzLCBjb2xzKTsNCisgIGVuY29kZUxvd0xldmVsKGZ1bGxDb2Rld29yZHMsIGNvbHMsIHJvd3MsIGVycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgICAgICAgICAgICAgICAgbV9iYXJjb2RlTWF0cml4KTsNCit9DQordm9pZCBDQkNfUERGNDE3OjpzZXREaW1lbnNpb25zKGludDMyX3QgbWF4Q29scywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Db2xzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heFJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluUm93cykgew0KKyAgbV9tYXhDb2xzID0gbWF4Q29sczsNCisgIG1fbWluQ29scyA9IG1pbkNvbHM7DQorICBtX21heFJvd3MgPSBtYXhSb3dzOw0KKyAgbV9taW5Sb3dzID0gbWluUm93czsNCit9DQordm9pZCBDQkNfUERGNDE3OjpzZXRDb21wYWN0aW9uKENvbXBhY3Rpb24gY29tcGFjdGlvbikgew0KKyAgbV9jb21wYWN0aW9uID0gY29tcGFjdGlvbjsNCit9DQordm9pZCBDQkNfUERGNDE3OjpzZXRDb21wYWN0KEZYX0JPT0wgY29tcGFjdCkgew0KKyAgbV9jb21wYWN0ID0gY29tcGFjdDsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3OjpjYWxjdWxhdGVOdW1iZXJPZlJvd3MoaW50MzJfdCBtLCBpbnQzMl90IGssIGludDMyX3QgYykgew0KKyAgaW50MzJfdCByID0gKChtICsgMSArIGspIC8gYykgKyAxOw0KKyAgaWYgKGMgKiByID49IChtICsgMSArIGsgKyBjKSkgew0KKyAgICByLS07DQorICB9DQorICByZXR1cm4gcjsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3OjpnZXROdW1iZXJPZlBhZENvZGV3b3JkcyhpbnQzMl90IG0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHIpIHsNCisgIGludDMyX3QgbiA9IGMgKiByIC0gazsNCisgIHJldHVybiBuID4gbSArIDEgPyBuIC0gbSAtIDEgOiAwOw0KK30NCit2b2lkIENCQ19QREY0MTc6OmVuY29kZUNoYXIoaW50MzJfdCBwYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0JhcmNvZGVSb3cqIGxvZ2ljKSB7DQorICBpbnQzMl90IG1hcCA9IDEgPDwgKGxlbiAtIDEpOw0KKyAgRlhfQk9PTCBsYXN0ID0gKChwYXR0ZXJuICYgbWFwKSAhPSAwKTsNCisgIGludDMyX3Qgd2lkdGggPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgRlhfQk9PTCBibGFjayA9ICgocGF0dGVybiAmIG1hcCkgIT0gMCk7DQorICAgIGlmIChsYXN0ID09IGJsYWNrKSB7DQorICAgICAgd2lkdGgrKzsNCisgICAgfSBlbHNlIHsNCisgICAgICBsb2dpYy0+YWRkQmFyKGxhc3QsIHdpZHRoKTsNCisgICAgICBsYXN0ID0gYmxhY2s7DQorICAgICAgd2lkdGggPSAxOw0KICAgICB9DQorICAgIG1hcCA+Pj0gMTsNCisgIH0NCisgIGxvZ2ljLT5hZGRCYXIobGFzdCwgd2lkdGgpOw0KIH0NCi1DQkNfQmFyY29kZU1hdHJpeCogQ0JDX1BERjQxNzo6Z2V0QmFyY29kZU1hdHJpeCgpDQotew0KLSAgICByZXR1cm4gbV9iYXJjb2RlTWF0cml4Ow0KLX0NCi12b2lkIENCQ19QREY0MTc6OmdlbmVyYXRlQmFyY29kZUxvZ2ljKENGWF9XaWRlU3RyaW5nIG1zZywgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzID0gQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Z2V0RXJyb3JDb3JyZWN0aW9uQ29kZXdvcmRDb3VudChlcnJvckNvcnJlY3Rpb25MZXZlbCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBDRlhfV2lkZVN0cmluZyBoaWdoTGV2ZWwgPSBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlSGlnaExldmVsKG1zZywgbV9jb21wYWN0aW9uLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIGludDMyX3Qgc291cmNlQ29kZVdvcmRzID0gaGlnaExldmVsLkdldExlbmd0aCgpOw0KLSAgICBDRlhfSW50MzJBcnJheSogZGltZW5zaW9uID0gZGV0ZXJtaW5lRGltZW5zaW9ucyhzb3VyY2VDb2RlV29yZHMsIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBpbnQzMl90IGNvbHMgPSBkaW1lbnNpb24tPkdldEF0KDApOw0KLSAgICBpbnQzMl90IHJvd3MgPSBkaW1lbnNpb24tPkdldEF0KDEpOw0KLSAgICBkZWxldGUgZGltZW5zaW9uOw0KLSAgICBpbnQzMl90IHBhZCA9IGdldE51bWJlck9mUGFkQ29kZXdvcmRzKHNvdXJjZUNvZGVXb3JkcywgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzLCBjb2xzLCByb3dzKTsNCi0gICAgaWYgKHNvdXJjZUNvZGVXb3JkcyArIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcyArIDEgPiA5MjkpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkVuY29kZWRNZXNzYWdlQ29udGFpbnNUb29NYW55Q29kZVdvcmRzOw0KLSAgICAgICAgcmV0dXJuOw0KK3ZvaWQgQ0JDX1BERjQxNzo6ZW5jb2RlTG93TGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgZnVsbENvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQmFyY29kZU1hdHJpeCogbG9naWMpIHsNCisgIGludDMyX3QgaWR4ID0gMDsNCisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IHI7IHkrKykgew0KKyAgICBpbnQzMl90IGNsdXN0ZXIgPSB5ICUgMzsNCisgICAgbG9naWMtPnN0YXJ0Um93KCk7DQorICAgIGludDMyX3QgYSA9IFNUQVJUX1BBVFRFUk47DQorICAgIGVuY29kZUNoYXIoU1RBUlRfUEFUVEVSTiwgMTcsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOw0KKyAgICBpbnQzMl90IGxlZnQ7DQorICAgIGludDMyX3QgcmlnaHQ7DQorICAgIGlmIChjbHVzdGVyID09IDApIHsNCisgICAgICBsZWZ0ID0gKDMwICogKHkgLyAzKSkgKyAoKHIgLSAxKSAvIDMpOw0KKyAgICAgIHJpZ2h0ID0gKDMwICogKHkgLyAzKSkgKyAoYyAtIDEpOw0KKyAgICB9IGVsc2UgaWYgKGNsdXN0ZXIgPT0gMSkgew0KKyAgICAgIGxlZnQgPSAoMzAgKiAoeSAvIDMpKSArIChlcnJvckNvcnJlY3Rpb25MZXZlbCAqIDMpICsgKChyIC0gMSkgJSAzKTsNCisgICAgICByaWdodCA9ICgzMCAqICh5IC8gMykpICsgKChyIC0gMSkgLyAzKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBsZWZ0ID0gKDMwICogKHkgLyAzKSkgKyAoYyAtIDEpOw0KKyAgICAgIHJpZ2h0ID0gKDMwICogKHkgLyAzKSkgKyAoZXJyb3JDb3JyZWN0aW9uTGV2ZWwgKiAzKSArICgociAtIDEpICUgMyk7DQogICAgIH0NCi0gICAgaW50MzJfdCBuID0gc291cmNlQ29kZVdvcmRzICsgcGFkICsgMTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc2I7DQotICAgIHNiICs9IChGWF9XQ0hBUikgbjsNCi0gICAgc2IgKz0gaGlnaExldmVsOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwYWQ7IGkrKykgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSA5MDA7DQorICAgIGludDMyX3QgcGF0dGVybiA9IENPREVXT1JEX1RBQkxFW2NsdXN0ZXJdW2xlZnRdOw0KKyAgICBlbmNvZGVDaGFyKHBhdHRlcm4sIDE3LCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsNCisgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgYzsgeCsrKSB7DQorICAgICAgcGF0dGVybiA9IENPREVXT1JEX1RBQkxFW2NsdXN0ZXJdW2Z1bGxDb2Rld29yZHMuR2V0QXQoaWR4KV07DQorICAgICAgZW5jb2RlQ2hhcihwYXR0ZXJuLCAxNywgbG9naWMtPmdldEN1cnJlbnRSb3coKSk7DQorICAgICAgaWR4Kys7DQogICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZGF0YUNvZGV3b3JkcyhzYik7DQotICAgIENGWF9XaWRlU3RyaW5nIGVjID0gQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Z2VuZXJhdGVFcnJvckNvcnJlY3Rpb24oZGF0YUNvZGV3b3JkcywgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZnVsbENvZGV3b3JkcyA9IGRhdGFDb2Rld29yZHMgKyBlYzsNCi0gICAgbV9iYXJjb2RlTWF0cml4ID0gRlhfTkVXIENCQ19CYXJjb2RlTWF0cml4KHJvd3MsIGNvbHMpOw0KLSAgICBlbmNvZGVMb3dMZXZlbChmdWxsQ29kZXdvcmRzLCBjb2xzLCByb3dzLCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgbV9iYXJjb2RlTWF0cml4KTsNCi19DQotdm9pZCBDQkNfUERGNDE3OjpzZXREaW1lbnNpb25zKGludDMyX3QgbWF4Q29scywgaW50MzJfdCBtaW5Db2xzLCBpbnQzMl90IG1heFJvd3MsIGludDMyX3QgbWluUm93cykNCi17DQotICAgIG1fbWF4Q29scyA9IG1heENvbHM7DQotICAgIG1fbWluQ29scyA9IG1pbkNvbHM7DQotICAgIG1fbWF4Um93cyA9IG1heFJvd3M7DQotICAgIG1fbWluUm93cyA9IG1pblJvd3M7DQotfQ0KLXZvaWQgQ0JDX1BERjQxNzo6c2V0Q29tcGFjdGlvbihDb21wYWN0aW9uIGNvbXBhY3Rpb24pDQotew0KLSAgICBtX2NvbXBhY3Rpb24gPSBjb21wYWN0aW9uOw0KLX0NCi12b2lkIENCQ19QREY0MTc6OnNldENvbXBhY3QoRlhfQk9PTCBjb21wYWN0KQ0KLXsNCi0gICAgbV9jb21wYWN0ID0gY29tcGFjdDsNCi19DQotaW50MzJfdCBDQkNfUERGNDE3OjpjYWxjdWxhdGVOdW1iZXJPZlJvd3MoaW50MzJfdCBtLCBpbnQzMl90IGssIGludDMyX3QgYykNCi17DQotICAgIGludDMyX3QgciA9ICgobSArIDEgKyBrKSAvIGMpICsgMTsNCi0gICAgaWYgKGMgKiByID49IChtICsgMSArIGsgKyBjKSkgew0KLSAgICAgICAgci0tOw0KKyAgICBpZiAobV9jb21wYWN0KSB7DQorICAgICAgZW5jb2RlQ2hhcihTVE9QX1BBVFRFUk4sIDEsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBhdHRlcm4gPSBDT0RFV09SRF9UQUJMRVtjbHVzdGVyXVtyaWdodF07DQorICAgICAgZW5jb2RlQ2hhcihwYXR0ZXJuLCAxNywgbG9naWMtPmdldEN1cnJlbnRSb3coKSk7DQorICAgICAgZW5jb2RlQ2hhcihTVE9QX1BBVFRFUk4sIDE4LCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gcjsNCisgIH0NCiB9DQotaW50MzJfdCBDQkNfUERGNDE3OjpnZXROdW1iZXJPZlBhZENvZGV3b3JkcyhpbnQzMl90IG0sIGludDMyX3QgaywgaW50MzJfdCBjLCBpbnQzMl90IHIpDQotew0KLSAgICBpbnQzMl90IG4gPSBjICogciAtIGs7DQotICAgIHJldHVybiBuID4gbSArIDEgPyBuIC0gbSAtIDEgOiAwOw0KLX0NCi12b2lkIENCQ19QREY0MTc6OmVuY29kZUNoYXIoaW50MzJfdCBwYXR0ZXJuLCBpbnQzMl90IGxlbiwgQ0JDX0JhcmNvZGVSb3cqIGxvZ2ljKQ0KLXsNCi0gICAgaW50MzJfdCBtYXAgPSAxIDw8IChsZW4gLSAxKTsNCi0gICAgRlhfQk9PTCBsYXN0ID0gKChwYXR0ZXJuICYgbWFwKSAhPSAwKTsNCi0gICAgaW50MzJfdCB3aWR0aCA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQotICAgICAgICBGWF9CT09MIGJsYWNrID0gKChwYXR0ZXJuICYgbWFwKSAhPSAwKTsNCi0gICAgICAgIGlmIChsYXN0ID09IGJsYWNrKSB7DQotICAgICAgICAgICAgd2lkdGgrKzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbG9naWMtPmFkZEJhcihsYXN0LCB3aWR0aCk7DQotICAgICAgICAgICAgbGFzdCA9IGJsYWNrOw0KLSAgICAgICAgICAgIHdpZHRoID0gMTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1hcCA+Pj0gMTsNCitDRlhfSW50MzJBcnJheSogQ0JDX1BERjQxNzo6ZGV0ZXJtaW5lRGltZW5zaW9ucygNCisgICAgaW50MzJfdCBzb3VyY2VDb2RlV29yZHMsDQorICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBGWF9GTE9BVCByYXRpbyA9IDAuMGY7DQorICBDRlhfSW50MzJBcnJheSogZGltZW5zaW9uID0gTlVMTDsNCisgIGZvciAoaW50MzJfdCBjb2xzID0gbV9taW5Db2xzOyBjb2xzIDw9IG1fbWF4Q29sczsgY29scysrKSB7DQorICAgIGludDMyX3Qgcm93cyA9DQorICAgICAgICBjYWxjdWxhdGVOdW1iZXJPZlJvd3Moc291cmNlQ29kZVdvcmRzLCBlcnJvckNvcnJlY3Rpb25Db2RlV29yZHMsIGNvbHMpOw0KKyAgICBpZiAocm93cyA8IG1fbWluUm93cykgew0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGxvZ2ljLT5hZGRCYXIobGFzdCwgd2lkdGgpOw0KLX0NCi12b2lkIENCQ19QREY0MTc6OmVuY29kZUxvd0xldmVsKENGWF9XaWRlU3RyaW5nIGZ1bGxDb2Rld29yZHMsIGludDMyX3QgYywgaW50MzJfdCByLCBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLCBDQkNfQmFyY29kZU1hdHJpeCogbG9naWMpDQotew0KLSAgICBpbnQzMl90IGlkeCA9IDA7DQotICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IHI7IHkrKykgew0KLSAgICAgICAgaW50MzJfdCBjbHVzdGVyID0geSAlIDM7DQotICAgICAgICBsb2dpYy0+c3RhcnRSb3coKTsNCi0gICAgICAgIGludDMyX3QgYSA9IFNUQVJUX1BBVFRFUk47DQotICAgICAgICBlbmNvZGVDaGFyKFNUQVJUX1BBVFRFUk4sIDE3LCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsNCi0gICAgICAgIGludDMyX3QgbGVmdDsNCi0gICAgICAgIGludDMyX3QgcmlnaHQ7DQotICAgICAgICBpZiAoY2x1c3RlciA9PSAwKSB7DQotICAgICAgICAgICAgbGVmdCA9ICgzMCAqICh5IC8gMykpICsgKChyIC0gMSkgLyAzKTsNCi0gICAgICAgICAgICByaWdodCA9ICgzMCAqICh5IC8gMykpICsgKGMgLSAxKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoY2x1c3RlciA9PSAxKSB7DQotICAgICAgICAgICAgbGVmdCA9ICgzMCAqICh5IC8gMykpICsgKGVycm9yQ29ycmVjdGlvbkxldmVsICogMykgKyAoKHIgLSAxKSAlIDMpOw0KLSAgICAgICAgICAgIHJpZ2h0ID0gKDMwICogKHkgLyAzKSkgKyAoKHIgLSAxKSAvIDMpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBsZWZ0ID0gKDMwICogKHkgLyAzKSkgKyAoYyAtIDEpOw0KLSAgICAgICAgICAgIHJpZ2h0ID0gKDMwICogKHkgLyAzKSkgKyAoZXJyb3JDb3JyZWN0aW9uTGV2ZWwgKiAzKSArICgociAtIDEpICUgMyk7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IHBhdHRlcm4gPSBDT0RFV09SRF9UQUJMRVtjbHVzdGVyXVtsZWZ0XTsNCi0gICAgICAgIGVuY29kZUNoYXIocGF0dGVybiwgMTcsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgYzsgeCsrKSB7DQotICAgICAgICAgICAgcGF0dGVybiA9IENPREVXT1JEX1RBQkxFW2NsdXN0ZXJdW2Z1bGxDb2Rld29yZHMuR2V0QXQoaWR4KV07DQotICAgICAgICAgICAgZW5jb2RlQ2hhcihwYXR0ZXJuLCAxNywgbG9naWMtPmdldEN1cnJlbnRSb3coKSk7DQotICAgICAgICAgICAgaWR4Kys7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9jb21wYWN0KSB7DQotICAgICAgICAgICAgZW5jb2RlQ2hhcihTVE9QX1BBVFRFUk4sIDEsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwYXR0ZXJuID0gQ09ERVdPUkRfVEFCTEVbY2x1c3Rlcl1bcmlnaHRdOw0KLSAgICAgICAgICAgIGVuY29kZUNoYXIocGF0dGVybiwgMTcsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOw0KLSAgICAgICAgICAgIGVuY29kZUNoYXIoU1RPUF9QQVRURVJOLCAxOCwgbG9naWMtPmdldEN1cnJlbnRSb3coKSk7DQotICAgICAgICB9DQorICAgIGlmIChyb3dzID4gbV9tYXhSb3dzKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi19DQotQ0ZYX0ludDMyQXJyYXkqIENCQ19QREY0MTc6OmRldGVybWluZURpbWVuc2lvbnMoaW50MzJfdCBzb3VyY2VDb2RlV29yZHMsIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgRlhfRkxPQVQgcmF0aW8gPSAwLjBmOw0KLSAgICBDRlhfSW50MzJBcnJheSogZGltZW5zaW9uID0gTlVMTDsNCi0gICAgZm9yIChpbnQzMl90IGNvbHMgPSBtX21pbkNvbHM7IGNvbHMgPD0gbV9tYXhDb2xzOyBjb2xzKyspIHsNCi0gICAgICAgIGludDMyX3Qgcm93cyA9IGNhbGN1bGF0ZU51bWJlck9mUm93cyhzb3VyY2VDb2RlV29yZHMsIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgY29scyk7DQotICAgICAgICBpZiAocm93cyA8IG1fbWluUm93cykgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHJvd3MgPiBtX21heFJvd3MpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZMT0FUIG5ld1JhdGlvID0gKCgxNyAqIGNvbHMgKyA2OSkgKiBERUZBVUxUX01PRFVMRV9XSURUSCkgLyAocm93cyAqIEhFSUdIVCk7DQotICAgICAgICBpZiAoZGltZW5zaW9uICE9IE5VTEwgJiYgZmFic2YobmV3UmF0aW8gLSBQUkVGRVJSRURfUkFUSU8pID4gZmFic2YocmF0aW8gLSBQUkVGRVJSRURfUkFUSU8pKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICByYXRpbyA9IG5ld1JhdGlvOw0KLSAgICAgICAgaWYgKGRpbWVuc2lvbikgew0KLSAgICAgICAgICAgIGRlbGV0ZSBkaW1lbnNpb247DQotICAgICAgICB9DQotICAgICAgICBkaW1lbnNpb24gPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQotICAgICAgICBkaW1lbnNpb24tPkFkZChjb2xzKTsNCi0gICAgICAgIGRpbWVuc2lvbi0+QWRkKHJvd3MpOw0KKyAgICBGWF9GTE9BVCBuZXdSYXRpbyA9DQorICAgICAgICAoKDE3ICogY29scyArIDY5KSAqIERFRkFVTFRfTU9EVUxFX1dJRFRIKSAvIChyb3dzICogSEVJR0hUKTsNCisgICAgaWYgKGRpbWVuc2lvbiAhPSBOVUxMICYmDQorICAgICAgICBmYWJzZihuZXdSYXRpbyAtIFBSRUZFUlJFRF9SQVRJTykgPiBmYWJzZihyYXRpbyAtIFBSRUZFUlJFRF9SQVRJTykpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBpZiAoZGltZW5zaW9uID09IE5VTEwpIHsNCi0gICAgICAgIGludDMyX3Qgcm93cyA9IGNhbGN1bGF0ZU51bWJlck9mUm93cyhzb3VyY2VDb2RlV29yZHMsIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgbV9taW5Db2xzKTsNCi0gICAgICAgIGlmIChyb3dzIDwgbV9taW5Sb3dzKSB7DQotICAgICAgICAgICAgZGltZW5zaW9uID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KLSAgICAgICAgICAgIGRpbWVuc2lvbi0+QWRkKG1fbWluQ29scyk7DQotICAgICAgICAgICAgZGltZW5zaW9uLT5BZGQobV9taW5Sb3dzKTsNCi0gICAgICAgIH0gZWxzZSBpZiAocm93cyA+PSAzICYmIHJvd3MgPD0gOTApIHsNCi0gICAgICAgICAgICBkaW1lbnNpb24gPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQotICAgICAgICAgICAgZGltZW5zaW9uLT5BZGQobV9taW5Db2xzKTsNCi0gICAgICAgICAgICBkaW1lbnNpb24tPkFkZChyb3dzKTsNCi0gICAgICAgIH0NCisgICAgcmF0aW8gPSBuZXdSYXRpbzsNCisgICAgaWYgKGRpbWVuc2lvbikgew0KKyAgICAgIGRlbGV0ZSBkaW1lbnNpb247DQogICAgIH0NCi0gICAgaWYgKGRpbWVuc2lvbiA9PSBOVUxMKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25VbmFibGVUb0ZpdE1lc3NhZ2VJbkNvbHVtbnM7DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgZGltZW5zaW9uID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgICBkaW1lbnNpb24tPkFkZChjb2xzKTsNCisgICAgZGltZW5zaW9uLT5BZGQocm93cyk7DQorICB9DQorICBpZiAoZGltZW5zaW9uID09IE5VTEwpIHsNCisgICAgaW50MzJfdCByb3dzID0gY2FsY3VsYXRlTnVtYmVyT2ZSb3dzKHNvdXJjZUNvZGVXb3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgbV9taW5Db2xzKTsNCisgICAgaWYgKHJvd3MgPCBtX21pblJvd3MpIHsNCisgICAgICBkaW1lbnNpb24gPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICAgICAgZGltZW5zaW9uLT5BZGQobV9taW5Db2xzKTsNCisgICAgICBkaW1lbnNpb24tPkFkZChtX21pblJvd3MpOw0KKyAgICB9IGVsc2UgaWYgKHJvd3MgPj0gMyAmJiByb3dzIDw9IDkwKSB7DQorICAgICAgZGltZW5zaW9uID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgICAgIGRpbWVuc2lvbi0+QWRkKG1fbWluQ29scyk7DQorICAgICAgZGltZW5zaW9uLT5BZGQocm93cyk7DQogICAgIH0NCi0gICAgcmV0dXJuIGRpbWVuc2lvbjsNCisgIH0NCisgIGlmIChkaW1lbnNpb24gPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25VbmFibGVUb0ZpdE1lc3NhZ2VJbkNvbHVtbnM7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIGRpbWVuc2lvbjsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5oCmluZGV4IDIxZDkwMmUuLmQzMjBhNjkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmgKQEAgLTksMzYgKzksNTEgQEAKIGNsYXNzIENCQ19Db21wYWN0aW9uOw0KIGNsYXNzIENCQ19CYXJjb2RlUm93Ow0KIGNsYXNzIENCQ19CYXJjb2RlTWF0cml4Ow0KLWNsYXNzIENCQ19QREY0MTcNCi17DQotcHVibGljOg0KLSAgICBDQkNfUERGNDE3KCk7DQotICAgIENCQ19QREY0MTcoRlhfQk9PTCBjb21wYWN0KTsNCi0gICAgdmlydHVhbCB+Q0JDX1BERjQxNygpOw0KLSAgICBDQkNfQmFyY29kZU1hdHJpeCogZ2V0QmFyY29kZU1hdHJpeCgpOw0KLSAgICB2b2lkIGdlbmVyYXRlQmFyY29kZUxvZ2ljKENGWF9XaWRlU3RyaW5nIG1zZywgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgaW50MzJfdCAmZSk7DQotICAgIHZvaWQgc2V0RGltZW5zaW9ucyhpbnQzMl90IG1heENvbHMsIGludDMyX3QgbWluQ29scywgaW50MzJfdCBtYXhSb3dzLCBpbnQzMl90IG1pblJvd3MpOw0KLSAgICB2b2lkIHNldENvbXBhY3Rpb24oQ29tcGFjdGlvbiBjb21wYWN0aW9uKTsNCi0gICAgdm9pZCBzZXRDb21wYWN0KEZYX0JPT0wgY29tcGFjdCk7DQotcHJpdmF0ZToNCi0gICAgc3RhdGljIGludDMyX3QgU1RBUlRfUEFUVEVSTjsNCi0gICAgc3RhdGljIGludDMyX3QgU1RPUF9QQVRURVJOOw0KLSAgICBzdGF0aWMgaW50MzJfdCBDT0RFV09SRF9UQUJMRVtdWzEwMDBdOw0KLSAgICBzdGF0aWMgRlhfRkxPQVQgUFJFRkVSUkVEX1JBVElPOw0KLSAgICBzdGF0aWMgRlhfRkxPQVQgREVGQVVMVF9NT0RVTEVfV0lEVEg7DQotICAgIHN0YXRpYyBGWF9GTE9BVCBIRUlHSFQ7DQotICAgIENCQ19CYXJjb2RlTWF0cml4KiBtX2JhcmNvZGVNYXRyaXg7DQotICAgIEZYX0JPT0wgbV9jb21wYWN0Ow0KLSAgICBDb21wYWN0aW9uIG1fY29tcGFjdGlvbjsNCi0gICAgaW50MzJfdCBtX21pbkNvbHM7DQotICAgIGludDMyX3QgbV9tYXhDb2xzOw0KLSAgICBpbnQzMl90IG1fbWF4Um93czsNCi0gICAgaW50MzJfdCBtX21pblJvd3M7DQotcHJpdmF0ZToNCi0gICAgc3RhdGljIGludDMyX3QgY2FsY3VsYXRlTnVtYmVyT2ZSb3dzKGludDMyX3QgbSwgaW50MzJfdCBrLCBpbnQzMl90IGMpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBnZXROdW1iZXJPZlBhZENvZGV3b3JkcyhpbnQzMl90IG0sIGludDMyX3QgaywgaW50MzJfdCBjLCBpbnQzMl90IHIpOw0KLSAgICBzdGF0aWMgdm9pZCBlbmNvZGVDaGFyKGludDMyX3QgcGF0dGVybiwgaW50MzJfdCBsZW4sIENCQ19CYXJjb2RlUm93KiBsb2dpYyk7DQotICAgIHZvaWQgZW5jb2RlTG93TGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgZnVsbENvZGV3b3JkcywgaW50MzJfdCBjLCBpbnQzMl90IHIsIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIENCQ19CYXJjb2RlTWF0cml4KiBsb2dpYyk7DQotICAgIENGWF9JbnQzMkFycmF5KiBkZXRlcm1pbmVEaW1lbnNpb25zKGludDMyX3Qgc291cmNlQ29kZVdvcmRzLCBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgaW50MzJfdCAmZSk7DQorY2xhc3MgQ0JDX1BERjQxNyB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTcoKTsNCisgIENCQ19QREY0MTcoRlhfQk9PTCBjb21wYWN0KTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTcoKTsNCisgIENCQ19CYXJjb2RlTWF0cml4KiBnZXRCYXJjb2RlTWF0cml4KCk7DQorICB2b2lkIGdlbmVyYXRlQmFyY29kZUxvZ2ljKENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2b2lkIHNldERpbWVuc2lvbnMoaW50MzJfdCBtYXhDb2xzLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluQ29scywNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heFJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Sb3dzKTsNCisgIHZvaWQgc2V0Q29tcGFjdGlvbihDb21wYWN0aW9uIGNvbXBhY3Rpb24pOw0KKyAgdm9pZCBzZXRDb21wYWN0KEZYX0JPT0wgY29tcGFjdCk7DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgaW50MzJfdCBTVEFSVF9QQVRURVJOOw0KKyAgc3RhdGljIGludDMyX3QgU1RPUF9QQVRURVJOOw0KKyAgc3RhdGljIGludDMyX3QgQ09ERVdPUkRfVEFCTEVbXVsxMDAwXTsNCisgIHN0YXRpYyBGWF9GTE9BVCBQUkVGRVJSRURfUkFUSU87DQorICBzdGF0aWMgRlhfRkxPQVQgREVGQVVMVF9NT0RVTEVfV0lEVEg7DQorICBzdGF0aWMgRlhfRkxPQVQgSEVJR0hUOw0KKyAgQ0JDX0JhcmNvZGVNYXRyaXgqIG1fYmFyY29kZU1hdHJpeDsNCisgIEZYX0JPT0wgbV9jb21wYWN0Ow0KKyAgQ29tcGFjdGlvbiBtX2NvbXBhY3Rpb247DQorICBpbnQzMl90IG1fbWluQ29sczsNCisgIGludDMyX3QgbV9tYXhDb2xzOw0KKyAgaW50MzJfdCBtX21heFJvd3M7DQorICBpbnQzMl90IG1fbWluUm93czsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBpbnQzMl90IGNhbGN1bGF0ZU51bWJlck9mUm93cyhpbnQzMl90IG0sIGludDMyX3QgaywgaW50MzJfdCBjKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldE51bWJlck9mUGFkQ29kZXdvcmRzKGludDMyX3QgbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcik7DQorICBzdGF0aWMgdm9pZCBlbmNvZGVDaGFyKGludDMyX3QgcGF0dGVybiwgaW50MzJfdCBsZW4sIENCQ19CYXJjb2RlUm93KiBsb2dpYyk7DQorICB2b2lkIGVuY29kZUxvd0xldmVsKENGWF9XaWRlU3RyaW5nIGZ1bGxDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYywNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICBDQkNfQmFyY29kZU1hdHJpeCogbG9naWMpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGRldGVybWluZURpbWVuc2lvbnMoaW50MzJfdCBzb3VyY2VDb2RlV29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguY3BwCmluZGV4IGFhMzBlMjUuLjU4M2E4NmUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5jcHAKQEAgLTIzLDc2ICsyMyw2OCBAQAogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3QmFyY29kZVJvdy5oIg0KICNpbmNsdWRlICJCQ19QREY0MTdCYXJjb2RlTWF0cml4LmgiDQotQ0JDX0JhcmNvZGVNYXRyaXg6OkNCQ19CYXJjb2RlTWF0cml4KGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHdpZHRoKQ0KLXsNCi0gICAgbV9tYXRyaXguU2V0U2l6ZShoZWlnaHQgKyAyKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwLCBtYXRyaXhMZW5ndGggPSBtX21hdHJpeC5HZXRTaXplKCk7IGkgPCBtYXRyaXhMZW5ndGg7IGkrKykgew0KLSAgICAgICAgbV9tYXRyaXhbaV0gPSBGWF9ORVcgQ0JDX0JhcmNvZGVSb3coKHdpZHRoICsgNCkgKiAxNyArIDEpOw0KK0NCQ19CYXJjb2RlTWF0cml4OjpDQkNfQmFyY29kZU1hdHJpeChpbnQzMl90IGhlaWdodCwgaW50MzJfdCB3aWR0aCkgew0KKyAgbV9tYXRyaXguU2V0U2l6ZShoZWlnaHQgKyAyKTsNCisgIGZvciAoaW50MzJfdCBpID0gMCwgbWF0cml4TGVuZ3RoID0gbV9tYXRyaXguR2V0U2l6ZSgpOyBpIDwgbWF0cml4TGVuZ3RoOw0KKyAgICAgICBpKyspIHsNCisgICAgbV9tYXRyaXhbaV0gPSBGWF9ORVcgQ0JDX0JhcmNvZGVSb3coKHdpZHRoICsgNCkgKiAxNyArIDEpOw0KKyAgfQ0KKyAgbV93aWR0aCA9IHdpZHRoICogMTc7DQorICBtX2hlaWdodCA9IGhlaWdodCArIDI7DQorICBtX2N1cnJlbnRSb3cgPSAwOw0KKyAgbV9vdXRIZWlnaHQgPSAwOw0KKyAgbV9vdXRXaWR0aCA9IDA7DQorfQ0KK0NCQ19CYXJjb2RlTWF0cml4Ojp+Q0JDX0JhcmNvZGVNYXRyaXgoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX21hdHJpeC5HZXRTaXplKCk7IGkrKykgew0KKyAgICBkZWxldGUgKENCQ19CYXJjb2RlUm93KiltX21hdHJpeC5HZXRBdChpKTsNCisgIH0NCisgIG1fbWF0cml4LlJlbW92ZUFsbCgpOw0KKyAgbV9tYXRyaXhPdXQuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0JDX0JhcmNvZGVNYXRyaXg6OnNldChpbnQzMl90IHgsIGludDMyX3QgeSwgdWludDhfdCB2YWx1ZSkgew0KKyAgKChDQkNfQmFyY29kZVJvdyopbV9tYXRyaXhbeV0pLT5zZXQoeCwgdmFsdWUpOw0KK30NCit2b2lkIENCQ19CYXJjb2RlTWF0cml4OjpzZXRNYXRyaXgoaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0JPT0wgYmxhY2spIHsNCisgIHNldCh4LCB5LCAodWludDhfdCkoYmxhY2sgPyAxIDogMCkpOw0KK30NCit2b2lkIENCQ19CYXJjb2RlTWF0cml4OjpzdGFydFJvdygpIHsNCisgICsrbV9jdXJyZW50Um93Ow0KK30NCitDQkNfQmFyY29kZVJvdyogQ0JDX0JhcmNvZGVNYXRyaXg6OmdldEN1cnJlbnRSb3coKSB7DQorICByZXR1cm4gKENCQ19CYXJjb2RlUm93KiltX21hdHJpeFttX2N1cnJlbnRSb3ddOw0KK30NCitpbnQzMl90IENCQ19CYXJjb2RlTWF0cml4OjpnZXRXaWR0aCgpIHsNCisgIHJldHVybiBtX291dFdpZHRoOw0KK30NCitpbnQzMl90IENCQ19CYXJjb2RlTWF0cml4OjpnZXRIZWlnaHQoKSB7DQorICByZXR1cm4gbV9vdXRIZWlnaHQ7DQorfQ0KK0NGWF9CeXRlQXJyYXkmIENCQ19CYXJjb2RlTWF0cml4OjpnZXRNYXRyaXgoKSB7DQorICByZXR1cm4gZ2V0U2NhbGVkTWF0cml4KDEsIDEpOw0KK30NCitDRlhfQnl0ZUFycmF5JiBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0U2NhbGVkTWF0cml4KGludDMyX3Qgc2NhbGUpIHsNCisgIHJldHVybiBnZXRTY2FsZWRNYXRyaXgoc2NhbGUsIHNjYWxlKTsNCit9DQorQ0ZYX0J5dGVBcnJheSYgQ0JDX0JhcmNvZGVNYXRyaXg6OmdldFNjYWxlZE1hdHJpeChpbnQzMl90IHhTY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeVNjYWxlKSB7DQorICBpbnQzMl90IHlNYXggPSBtX2hlaWdodCAqIHlTY2FsZTsNCisgIENGWF9CeXRlQXJyYXkgYnl0ZWFycmF5Ow0KKyAgYnl0ZWFycmF5LkNvcHkoKChDQkNfQmFyY29kZVJvdyopbV9tYXRyaXhbMF0pLT5nZXRTY2FsZWRSb3coeFNjYWxlKSk7DQorICBpbnQzMl90IHhNYXggPSBieXRlYXJyYXkuR2V0U2l6ZSgpOw0KKyAgbV9tYXRyaXhPdXQuU2V0U2l6ZSh4TWF4ICogeU1heCk7DQorICBtX291dFdpZHRoID0geE1heDsNCisgIG1fb3V0SGVpZ2h0ID0geU1heDsNCisgIGludDMyX3QgayA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCB5TWF4OyBpKyspIHsNCisgICAgaWYgKGkgIT0gMCkgew0KKyAgICAgIGJ5dGVhcnJheS5Db3B5KA0KKyAgICAgICAgICAoKENCQ19CYXJjb2RlUm93KiltX21hdHJpeFtpIC8geVNjYWxlXSktPmdldFNjYWxlZFJvdyh4U2NhbGUpKTsNCiAgICAgfQ0KLSAgICBtX3dpZHRoID0gd2lkdGggKiAxNzsNCi0gICAgbV9oZWlnaHQgPSBoZWlnaHQgKyAyOw0KLSAgICBtX2N1cnJlbnRSb3cgPSAwOw0KLSAgICBtX291dEhlaWdodCA9IDA7DQotICAgIG1fb3V0V2lkdGggPSAwOw0KLX0NCi1DQkNfQmFyY29kZU1hdHJpeDo6fkNCQ19CYXJjb2RlTWF0cml4KCkNCi17DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fbWF0cml4LkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICBkZWxldGUgKENCQ19CYXJjb2RlUm93KiltX21hdHJpeC5HZXRBdChpKTsNCisgICAgayA9IGkgKiB4TWF4Ow0KKyAgICBmb3IgKGludDMyX3QgbCA9IDA7IGwgPCB4TWF4OyBsKyspIHsNCisgICAgICBtX21hdHJpeE91dFtrICsgbF0gPSBieXRlYXJyYXkuR2V0QXQobCk7DQogICAgIH0NCi0gICAgbV9tYXRyaXguUmVtb3ZlQWxsKCk7DQotICAgIG1fbWF0cml4T3V0LlJlbW92ZUFsbCgpOw0KLX0NCi12b2lkIENCQ19CYXJjb2RlTWF0cml4OjpzZXQoaW50MzJfdCB4LCBpbnQzMl90IHksIHVpbnQ4X3QgdmFsdWUpDQotew0KLSAgICAoKENCQ19CYXJjb2RlUm93KiltX21hdHJpeFt5XSktPnNldCh4LCB2YWx1ZSk7DQotfQ0KLXZvaWQgQ0JDX0JhcmNvZGVNYXRyaXg6OnNldE1hdHJpeChpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfQk9PTCBibGFjaykNCi17DQotICAgIHNldCh4LCB5LCAodWludDhfdCkgKGJsYWNrID8gMSA6IDApKTsNCi19DQotdm9pZCBDQkNfQmFyY29kZU1hdHJpeDo6c3RhcnRSb3coKQ0KLXsNCi0gICAgKyttX2N1cnJlbnRSb3c7DQotfQ0KLUNCQ19CYXJjb2RlUm93KiBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0Q3VycmVudFJvdygpDQotew0KLSAgICByZXR1cm4gKENCQ19CYXJjb2RlUm93KiltX21hdHJpeFttX2N1cnJlbnRSb3ddOw0KLX0NCi1pbnQzMl90IENCQ19CYXJjb2RlTWF0cml4OjpnZXRXaWR0aCgpDQotew0KLSAgICByZXR1cm4gbV9vdXRXaWR0aDsNCi19DQotaW50MzJfdCBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0SGVpZ2h0KCkNCi17DQotICAgIHJldHVybiBtX291dEhlaWdodDsNCi19DQotQ0ZYX0J5dGVBcnJheSYgQ0JDX0JhcmNvZGVNYXRyaXg6OmdldE1hdHJpeCgpDQotew0KLSAgICByZXR1cm4gZ2V0U2NhbGVkTWF0cml4KDEsIDEpOw0KLX0NCi1DRlhfQnl0ZUFycmF5JiBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0U2NhbGVkTWF0cml4KGludDMyX3Qgc2NhbGUpDQotew0KLSAgICByZXR1cm4gZ2V0U2NhbGVkTWF0cml4KHNjYWxlLCBzY2FsZSk7DQotfQ0KLUNGWF9CeXRlQXJyYXkmIENCQ19CYXJjb2RlTWF0cml4OjpnZXRTY2FsZWRNYXRyaXgoaW50MzJfdCB4U2NhbGUsIGludDMyX3QgeVNjYWxlKQ0KLXsNCi0gICAgaW50MzJfdCB5TWF4ID0gbV9oZWlnaHQgKiB5U2NhbGU7DQotICAgIENGWF9CeXRlQXJyYXkgYnl0ZWFycmF5Ow0KLSAgICBieXRlYXJyYXkuQ29weSgoKENCQ19CYXJjb2RlUm93KiltX21hdHJpeFswXSktPmdldFNjYWxlZFJvdyh4U2NhbGUpKTsNCi0gICAgaW50MzJfdCB4TWF4ID0gYnl0ZWFycmF5LkdldFNpemUoKTsNCi0gICAgbV9tYXRyaXhPdXQuU2V0U2l6ZSh4TWF4ICogeU1heCk7DQotICAgIG1fb3V0V2lkdGggPSB4TWF4Ow0KLSAgICBtX291dEhlaWdodCA9IHlNYXg7DQotICAgIGludDMyX3QgayA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHlNYXg7IGkrKykgew0KLSAgICAgICAgaWYgKGkgIT0gMCkgew0KLSAgICAgICAgICAgIGJ5dGVhcnJheS5Db3B5KCgoQ0JDX0JhcmNvZGVSb3cqKW1fbWF0cml4W2kgLyB5U2NhbGVdKS0+Z2V0U2NhbGVkUm93KHhTY2FsZSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgayA9IGkgKiB4TWF4Ow0KLSAgICAgICAgZm9yIChpbnQzMl90IGwgPSAwOyBsIDwgeE1heDsgbCsrKSB7DQotICAgICAgICAgICAgbV9tYXRyaXhPdXRbayArIGxdID0gYnl0ZWFycmF5LkdldEF0KGwpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBtX21hdHJpeE91dDsNCisgIH0NCisgIHJldHVybiBtX21hdHJpeE91dDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmgKaW5kZXggZjVmMDM1ZC4uN2RlOGM0MyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oCkBAIC03LDI4ICs3LDI4IEBACiAjaWZuZGVmIF9CQ19CQVJDT0RFTUFUUklYX0hfDQogI2RlZmluZSBfQkNfQkFSQ09ERU1BVFJJWF9IXw0KIGNsYXNzIENCQ19CYXJjb2RlUm93Ow0KLWNsYXNzIENCQ19CYXJjb2RlTWF0cml4DQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0JhcmNvZGVNYXRyaXgoKTsNCi0gICAgQ0JDX0JhcmNvZGVNYXRyaXgoaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgd2lkdGgpOw0KLSAgICB2aXJ0dWFsIH5DQkNfQmFyY29kZU1hdHJpeCgpOw0KLSAgICB2b2lkIHNldChpbnQzMl90IHgsIGludDMyX3QgeSwgdWludDhfdCB2YWx1ZSk7DQotICAgIHZvaWQgc2V0TWF0cml4KGludDMyX3QgeCwgaW50MzJfdCB5LCBGWF9CT09MIGJsYWNrKTsNCi0gICAgdm9pZCBzdGFydFJvdygpOw0KLSAgICBDQkNfQmFyY29kZVJvdyogZ2V0Q3VycmVudFJvdygpOw0KLSAgICBDRlhfQnl0ZUFycmF5JiBnZXRNYXRyaXgoKTsNCi0gICAgQ0ZYX0J5dGVBcnJheSYgZ2V0U2NhbGVkTWF0cml4KGludDMyX3Qgc2NhbGUpOw0KLSAgICBDRlhfQnl0ZUFycmF5JiBnZXRTY2FsZWRNYXRyaXgoaW50MzJfdCB4U2NhbGUsIGludDMyX3QgeVNjYWxlKTsNCi0gICAgaW50MzJfdCBnZXRXaWR0aCgpOw0KLSAgICBpbnQzMl90IGdldEhlaWdodCgpOw0KLXByaXZhdGU6DQotICAgIENGWF9QdHJBcnJheSBtX21hdHJpeDsNCi0gICAgQ0ZYX0J5dGVBcnJheSBtX21hdHJpeE91dDsNCi0gICAgaW50MzJfdCBtX2N1cnJlbnRSb3c7DQotICAgIGludDMyX3QgbV9oZWlnaHQ7DQotICAgIGludDMyX3QgbV93aWR0aDsNCi0gICAgaW50MzJfdCBtX291dFdpZHRoOw0KLSAgICBpbnQzMl90IG1fb3V0SGVpZ2h0Ow0KK2NsYXNzIENCQ19CYXJjb2RlTWF0cml4IHsNCisgcHVibGljOg0KKyAgQ0JDX0JhcmNvZGVNYXRyaXgoKTsNCisgIENCQ19CYXJjb2RlTWF0cml4KGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHdpZHRoKTsNCisgIHZpcnR1YWwgfkNCQ19CYXJjb2RlTWF0cml4KCk7DQorICB2b2lkIHNldChpbnQzMl90IHgsIGludDMyX3QgeSwgdWludDhfdCB2YWx1ZSk7DQorICB2b2lkIHNldE1hdHJpeChpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfQk9PTCBibGFjayk7DQorICB2b2lkIHN0YXJ0Um93KCk7DQorICBDQkNfQmFyY29kZVJvdyogZ2V0Q3VycmVudFJvdygpOw0KKyAgQ0ZYX0J5dGVBcnJheSYgZ2V0TWF0cml4KCk7DQorICBDRlhfQnl0ZUFycmF5JiBnZXRTY2FsZWRNYXRyaXgoaW50MzJfdCBzY2FsZSk7DQorICBDRlhfQnl0ZUFycmF5JiBnZXRTY2FsZWRNYXRyaXgoaW50MzJfdCB4U2NhbGUsIGludDMyX3QgeVNjYWxlKTsNCisgIGludDMyX3QgZ2V0V2lkdGgoKTsNCisgIGludDMyX3QgZ2V0SGVpZ2h0KCk7DQorDQorIHByaXZhdGU6DQorICBDRlhfUHRyQXJyYXkgbV9tYXRyaXg7DQorICBDRlhfQnl0ZUFycmF5IG1fbWF0cml4T3V0Ow0KKyAgaW50MzJfdCBtX2N1cnJlbnRSb3c7DQorICBpbnQzMl90IG1faGVpZ2h0Ow0KKyAgaW50MzJfdCBtX3dpZHRoOw0KKyAgaW50MzJfdCBtX291dFdpZHRoOw0KKyAgaW50MzJfdCBtX291dEhlaWdodDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5jcHAKaW5kZXggZmMzZjI1NS4uNDRkNzFhYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5jcHAKQEAgLTIyLDM0ICsyMiwyOSBAQAogDQogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3QmFyY29kZU1ldGFkYXRhLmgiDQotQ0JDX0JhcmNvZGVNZXRhZGF0YTo6Q0JDX0JhcmNvZGVNZXRhZGF0YShpbnQzMl90IGNvbHVtbkNvdW50LCBpbnQzMl90IHJvd0NvdW50VXBwZXJQYXJ0LCBpbnQzMl90IHJvd0NvdW50TG93ZXJQYXJ0LCBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsKQ0KLXsNCi0gICAgbV9jb2x1bW5Db3VudCA9IGNvbHVtbkNvdW50Ow0KLSAgICBtX3Jvd0NvdW50VXBwZXJQYXJ0ID0gcm93Q291bnRVcHBlclBhcnQ7DQotICAgIG1fcm93Q291bnRMb3dlclBhcnQgPSByb3dDb3VudExvd2VyUGFydDsNCi0gICAgbV9lcnJvckNvcnJlY3Rpb25MZXZlbCA9IGVycm9yQ29ycmVjdGlvbkxldmVsOw0KLSAgICBtX3Jvd0NvdW50ID0gbV9yb3dDb3VudFVwcGVyUGFydCArIG1fcm93Q291bnRMb3dlclBhcnQ7DQorQ0JDX0JhcmNvZGVNZXRhZGF0YTo6Q0JDX0JhcmNvZGVNZXRhZGF0YShpbnQzMl90IGNvbHVtbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dDb3VudFVwcGVyUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93Q291bnRMb3dlclBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsKSB7DQorICBtX2NvbHVtbkNvdW50ID0gY29sdW1uQ291bnQ7DQorICBtX3Jvd0NvdW50VXBwZXJQYXJ0ID0gcm93Q291bnRVcHBlclBhcnQ7DQorICBtX3Jvd0NvdW50TG93ZXJQYXJ0ID0gcm93Q291bnRMb3dlclBhcnQ7DQorICBtX2Vycm9yQ29ycmVjdGlvbkxldmVsID0gZXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQorICBtX3Jvd0NvdW50ID0gbV9yb3dDb3VudFVwcGVyUGFydCArIG1fcm93Q291bnRMb3dlclBhcnQ7DQogfQ0KLUNCQ19CYXJjb2RlTWV0YWRhdGE6On5DQkNfQmFyY29kZU1ldGFkYXRhKCkNCi17DQorQ0JDX0JhcmNvZGVNZXRhZGF0YTo6fkNCQ19CYXJjb2RlTWV0YWRhdGEoKSB7fQ0KK2ludDMyX3QgQ0JDX0JhcmNvZGVNZXRhZGF0YTo6Z2V0Q29sdW1uQ291bnQoKSB7DQorICByZXR1cm4gbV9jb2x1bW5Db3VudDsNCiB9DQotaW50MzJfdCBDQkNfQmFyY29kZU1ldGFkYXRhOjpnZXRDb2x1bW5Db3VudCgpDQotew0KLSAgICByZXR1cm4gbV9jb2x1bW5Db3VudDsNCitpbnQzMl90IENCQ19CYXJjb2RlTWV0YWRhdGE6OmdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgew0KKyAgcmV0dXJuIG1fZXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQogfQ0KLWludDMyX3QgQ0JDX0JhcmNvZGVNZXRhZGF0YTo6Z2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKQ0KLXsNCi0gICAgcmV0dXJuIG1fZXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQoraW50MzJfdCBDQkNfQmFyY29kZU1ldGFkYXRhOjpnZXRSb3dDb3VudCgpIHsNCisgIHJldHVybiBtX3Jvd0NvdW50Ow0KIH0NCi1pbnQzMl90IENCQ19CYXJjb2RlTWV0YWRhdGE6OmdldFJvd0NvdW50KCkNCi17DQotICAgIHJldHVybiBtX3Jvd0NvdW50Ow0KK2ludDMyX3QgQ0JDX0JhcmNvZGVNZXRhZGF0YTo6Z2V0Um93Q291bnRVcHBlclBhcnQoKSB7DQorICByZXR1cm4gbV9yb3dDb3VudFVwcGVyUGFydDsNCiB9DQotaW50MzJfdCBDQkNfQmFyY29kZU1ldGFkYXRhOjpnZXRSb3dDb3VudFVwcGVyUGFydCgpDQotew0KLSAgICByZXR1cm4gbV9yb3dDb3VudFVwcGVyUGFydDsNCi19DQotaW50MzJfdCBDQkNfQmFyY29kZU1ldGFkYXRhOjpnZXRSb3dDb3VudExvd2VyUGFydCgpDQotew0KLSAgICByZXR1cm4gbV9yb3dDb3VudExvd2VyUGFydDsNCitpbnQzMl90IENCQ19CYXJjb2RlTWV0YWRhdGE6OmdldFJvd0NvdW50TG93ZXJQYXJ0KCkgew0KKyAgcmV0dXJuIG1fcm93Q291bnRMb3dlclBhcnQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuaAppbmRleCBmMjVlMzdjLi5kY2QyNjE3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1ldGFkYXRhLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5oCkBAIC03LDIxICs3LDI0IEBACiAjaWZuZGVmIF9CQ19CQVJDT0RFTUVUQURBVEFfSF8NCiAjZGVmaW5lIF9CQ19CQVJDT0RFTUVUQURBVEFfSF8NCiBjbGFzcyBDQkNfQmFyY29kZU1ldGFkYXRhOw0KLWNsYXNzIENCQ19CYXJjb2RlTWV0YWRhdGENCi17DQotcHVibGljOg0KLSAgICBDQkNfQmFyY29kZU1ldGFkYXRhKGludDMyX3QgY29sdW1uQ291bnQsIGludDMyX3Qgcm93Q291bnRVcHBlclBhcnQsIGludDMyX3Qgcm93Q291bnRMb3dlclBhcnQsIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwpOw0KLSAgICB2aXJ0dWFsIH5DQkNfQmFyY29kZU1ldGFkYXRhKCk7DQotICAgIGludDMyX3QgZ2V0Q29sdW1uQ291bnQoKTsNCi0gICAgaW50MzJfdCBnZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpOw0KLSAgICBpbnQzMl90IGdldFJvd0NvdW50KCk7DQotICAgIGludDMyX3QgZ2V0Um93Q291bnRVcHBlclBhcnQoKTsNCi0gICAgaW50MzJfdCBnZXRSb3dDb3VudExvd2VyUGFydCgpOw0KLXByaXZhdGU6DQotICAgIGludDMyX3QgbV9jb2x1bW5Db3VudDsNCi0gICAgaW50MzJfdCBtX2Vycm9yQ29ycmVjdGlvbkxldmVsOw0KLSAgICBpbnQzMl90IG1fcm93Q291bnRVcHBlclBhcnQ7DQotICAgIGludDMyX3QgbV9yb3dDb3VudExvd2VyUGFydDsNCi0gICAgaW50MzJfdCBtX3Jvd0NvdW50Ow0KK2NsYXNzIENCQ19CYXJjb2RlTWV0YWRhdGEgew0KKyBwdWJsaWM6DQorICBDQkNfQmFyY29kZU1ldGFkYXRhKGludDMyX3QgY29sdW1uQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93Q291bnRVcHBlclBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93Q291bnRMb3dlclBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwpOw0KKyAgdmlydHVhbCB+Q0JDX0JhcmNvZGVNZXRhZGF0YSgpOw0KKyAgaW50MzJfdCBnZXRDb2x1bW5Db3VudCgpOw0KKyAgaW50MzJfdCBnZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpOw0KKyAgaW50MzJfdCBnZXRSb3dDb3VudCgpOw0KKyAgaW50MzJfdCBnZXRSb3dDb3VudFVwcGVyUGFydCgpOw0KKyAgaW50MzJfdCBnZXRSb3dDb3VudExvd2VyUGFydCgpOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBtX2NvbHVtbkNvdW50Ow0KKyAgaW50MzJfdCBtX2Vycm9yQ29ycmVjdGlvbkxldmVsOw0KKyAgaW50MzJfdCBtX3Jvd0NvdW50VXBwZXJQYXJ0Ow0KKyAgaW50MzJfdCBtX3Jvd0NvdW50TG93ZXJQYXJ0Ow0KKyAgaW50MzJfdCBtX3Jvd0NvdW50Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuY3BwCmluZGV4IDg5MThkMzIuLjgyZTU4MzQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVJvdy5jcHAKQEAgLTIyLDM5ICsyMiwzMiBAQAogDQogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3QmFyY29kZVJvdy5oIg0KLUNCQ19CYXJjb2RlUm93OjpDQkNfQmFyY29kZVJvdyhpbnQzMl90IHdpZHRoKQ0KLXsNCi0gICAgbV9yb3cuU2V0U2l6ZSh3aWR0aCk7DQotICAgIG1fY3VycmVudExvY2F0aW9uID0gMDsNCitDQkNfQmFyY29kZVJvdzo6Q0JDX0JhcmNvZGVSb3coaW50MzJfdCB3aWR0aCkgew0KKyAgbV9yb3cuU2V0U2l6ZSh3aWR0aCk7DQorICBtX2N1cnJlbnRMb2NhdGlvbiA9IDA7DQogfQ0KLUNCQ19CYXJjb2RlUm93Ojp+Q0JDX0JhcmNvZGVSb3coKQ0KLXsNCi0gICAgbV9vdXRwdXQuUmVtb3ZlQWxsKCk7DQotICAgIG1fcm93LlJlbW92ZUFsbCgpOw0KK0NCQ19CYXJjb2RlUm93Ojp+Q0JDX0JhcmNvZGVSb3coKSB7DQorICBtX291dHB1dC5SZW1vdmVBbGwoKTsNCisgIG1fcm93LlJlbW92ZUFsbCgpOw0KIH0NCi12b2lkIENCQ19CYXJjb2RlUm93OjpzZXQoaW50MzJfdCB4LCB1aW50OF90IHZhbHVlKQ0KLXsNCi0gICAgbV9yb3cuU2V0QXQoeCwgdmFsdWUpOw0KK3ZvaWQgQ0JDX0JhcmNvZGVSb3c6OnNldChpbnQzMl90IHgsIHVpbnQ4X3QgdmFsdWUpIHsNCisgIG1fcm93LlNldEF0KHgsIHZhbHVlKTsNCiB9DQotdm9pZCBDQkNfQmFyY29kZVJvdzo6c2V0KGludDMyX3QgeCwgRlhfQk9PTCBibGFjaykNCi17DQotICAgIG1fcm93LlNldEF0KHgsICh1aW50OF90KSAoYmxhY2sgPyAxIDogMCkpOw0KK3ZvaWQgQ0JDX0JhcmNvZGVSb3c6OnNldChpbnQzMl90IHgsIEZYX0JPT0wgYmxhY2spIHsNCisgIG1fcm93LlNldEF0KHgsICh1aW50OF90KShibGFjayA/IDEgOiAwKSk7DQogfQ0KLXZvaWQgQ0JDX0JhcmNvZGVSb3c6OmFkZEJhcihGWF9CT09MIGJsYWNrLCBpbnQzMl90IHdpZHRoKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGlpID0gMDsgaWkgPCB3aWR0aDsgaWkrKykgew0KLSAgICAgICAgc2V0KG1fY3VycmVudExvY2F0aW9uKyssIGJsYWNrKTsNCi0gICAgfQ0KK3ZvaWQgQ0JDX0JhcmNvZGVSb3c6OmFkZEJhcihGWF9CT09MIGJsYWNrLCBpbnQzMl90IHdpZHRoKSB7DQorICBmb3IgKGludDMyX3QgaWkgPSAwOyBpaSA8IHdpZHRoOyBpaSsrKSB7DQorICAgIHNldChtX2N1cnJlbnRMb2NhdGlvbisrLCBibGFjayk7DQorICB9DQogfQ0KLUNGWF9CeXRlQXJyYXkmIENCQ19CYXJjb2RlUm93OjpnZXRSb3coKQ0KLXsNCi0gICAgcmV0dXJuIG1fcm93Ow0KK0NGWF9CeXRlQXJyYXkmIENCQ19CYXJjb2RlUm93OjpnZXRSb3coKSB7DQorICByZXR1cm4gbV9yb3c7DQogfQ0KLUNGWF9CeXRlQXJyYXkmIENCQ19CYXJjb2RlUm93OjpnZXRTY2FsZWRSb3coaW50MzJfdCBzY2FsZSkNCi17DQotICAgIG1fb3V0cHV0LlNldFNpemUobV9yb3cuR2V0U2l6ZSgpICogc2NhbGUpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX291dHB1dC5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgbV9vdXRwdXRbaV0gPSAobV9yb3dbaSAvIHNjYWxlXSk7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fb3V0cHV0Ow0KK0NGWF9CeXRlQXJyYXkmIENCQ19CYXJjb2RlUm93OjpnZXRTY2FsZWRSb3coaW50MzJfdCBzY2FsZSkgew0KKyAgbV9vdXRwdXQuU2V0U2l6ZShtX3Jvdy5HZXRTaXplKCkgKiBzY2FsZSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX291dHB1dC5HZXRTaXplKCk7IGkrKykgew0KKyAgICBtX291dHB1dFtpXSA9IChtX3Jvd1tpIC8gc2NhbGVdKTsNCisgIH0NCisgIHJldHVybiBtX291dHB1dDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmgKaW5kZXggMGZkMTAwMy4uNWUwOTA1YSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVJvdy5oCkBAIC02LDE5ICs2LDE5IEBACiANCiAjaWZuZGVmIF9CQ19CQVJDT0RFUk9XX0hfDQogI2RlZmluZSBfQkNfQkFSQ09ERVJPV19IXw0KLWNsYXNzIENCQ19CYXJjb2RlUm93DQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX0JhcmNvZGVSb3coaW50MzJfdCB3aWR0aCk7DQotICAgIHZpcnR1YWwgfkNCQ19CYXJjb2RlUm93KCk7DQotICAgIHZvaWQgc2V0KGludDMyX3QgeCwgdWludDhfdCB2YWx1ZSk7DQotICAgIHZvaWQgc2V0KGludDMyX3QgeCwgRlhfQk9PTCBibGFjayk7DQotICAgIHZvaWQgYWRkQmFyKEZYX0JPT0wgYmxhY2ssIGludDMyX3Qgd2lkdGgpOw0KLSAgICBDRlhfQnl0ZUFycmF5JiBnZXRSb3coKTsNCi0gICAgQ0ZYX0J5dGVBcnJheSYgZ2V0U2NhbGVkUm93KGludDMyX3Qgc2NhbGUpOw0KLXByaXZhdGU6DQotICAgIENGWF9CeXRlQXJyYXkgbV9yb3c7DQotICAgIENGWF9CeXRlQXJyYXkgbV9vdXRwdXQ7DQotICAgIGludDMyX3QgbV9jdXJyZW50TG9jYXRpb247DQorY2xhc3MgQ0JDX0JhcmNvZGVSb3cgew0KKyBwdWJsaWM6DQorICBDQkNfQmFyY29kZVJvdyhpbnQzMl90IHdpZHRoKTsNCisgIHZpcnR1YWwgfkNCQ19CYXJjb2RlUm93KCk7DQorICB2b2lkIHNldChpbnQzMl90IHgsIHVpbnQ4X3QgdmFsdWUpOw0KKyAgdm9pZCBzZXQoaW50MzJfdCB4LCBGWF9CT09MIGJsYWNrKTsNCisgIHZvaWQgYWRkQmFyKEZYX0JPT0wgYmxhY2ssIGludDMyX3Qgd2lkdGgpOw0KKyAgQ0ZYX0J5dGVBcnJheSYgZ2V0Um93KCk7DQorICBDRlhfQnl0ZUFycmF5JiBnZXRTY2FsZWRSb3coaW50MzJfdCBzY2FsZSk7DQorDQorIHByaXZhdGU6DQorICBDRlhfQnl0ZUFycmF5IG1fcm93Ow0KKyAgQ0ZYX0J5dGVBcnJheSBtX291dHB1dDsNCisgIGludDMyX3QgbV9jdXJyZW50TG9jYXRpb247DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVZhbHVlLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlVmFsdWUuY3BwCmluZGV4IDkwZmJlYTkuLjUzOTdjNGYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlVmFsdWUuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlVmFsdWUuY3BwCkBAIC0yMyw0NiArMjMsMzkgQEAKICNpbmNsdWRlICIuLi9iYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX1BERjQxN0NvbW1vbi5oIg0KICNpbmNsdWRlICJCQ19QREY0MTdCYXJjb2RlVmFsdWUuaCINCi1DQkNfQmFyY29kZVZhbHVlOjpDQkNfQmFyY29kZVZhbHVlKCkNCi17DQotfQ0KLUNCQ19CYXJjb2RlVmFsdWU6On5DQkNfQmFyY29kZVZhbHVlKCkNCi17DQotfQ0KLXZvaWQgQ0JDX0JhcmNvZGVWYWx1ZTo6c2V0VmFsdWUoaW50MzJfdCB2YWx1ZSkNCi17DQotICAgIGludDMyX3QgY29uZmlkZW5jZSA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fa2V5cy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgaWYgKG1fa2V5cy5HZXRBdChpKSA9PSB2YWx1ZSkgew0KLSAgICAgICAgICAgIGNvbmZpZGVuY2UgPSBtX3ZhbHVlcy5HZXRBdChpKTsNCi0gICAgICAgICAgICBtX3ZhbHVlcy5TZXRBdChpLCBjb25maWRlbmNlICsgMSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KK0NCQ19CYXJjb2RlVmFsdWU6OkNCQ19CYXJjb2RlVmFsdWUoKSB7fQ0KK0NCQ19CYXJjb2RlVmFsdWU6On5DQkNfQmFyY29kZVZhbHVlKCkge30NCit2b2lkIENCQ19CYXJjb2RlVmFsdWU6OnNldFZhbHVlKGludDMyX3QgdmFsdWUpIHsNCisgIGludDMyX3QgY29uZmlkZW5jZSA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2tleXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgaWYgKG1fa2V5cy5HZXRBdChpKSA9PSB2YWx1ZSkgew0KKyAgICAgIGNvbmZpZGVuY2UgPSBtX3ZhbHVlcy5HZXRBdChpKTsNCisgICAgICBtX3ZhbHVlcy5TZXRBdChpLCBjb25maWRlbmNlICsgMSk7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQotICAgIGNvbmZpZGVuY2UgPSAxOw0KLSAgICBtX2tleXMuQWRkKHZhbHVlKTsNCi0gICAgbV92YWx1ZXMuQWRkKGNvbmZpZGVuY2UpOw0KKyAgfQ0KKyAgY29uZmlkZW5jZSA9IDE7DQorICBtX2tleXMuQWRkKHZhbHVlKTsNCisgIG1fdmFsdWVzLkFkZChjb25maWRlbmNlKTsNCiB9DQotQ0ZYX0ludDMyQXJyYXkqIENCQ19CYXJjb2RlVmFsdWU6OmdldFZhbHVlKCkNCi17DQotICAgIGludDMyX3QgbWF4Q29uZmlkZW5jZSA9IC0xOw0KLSAgICBDRlhfSW50MzJBcnJheSogcmVzdWx0ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2tleXMuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIGlmIChtX3ZhbHVlcy5HZXRBdChpKSA+IG1heENvbmZpZGVuY2UpIHsNCi0gICAgICAgICAgICBtYXhDb25maWRlbmNlID0gbV92YWx1ZXMuR2V0QXQoaSk7DQotICAgICAgICAgICAgcmVzdWx0LT5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICByZXN1bHQtPkFkZChtX2tleXMuR2V0QXQoaSkpOw0KLSAgICAgICAgfSBlbHNlIGlmIChtX3ZhbHVlcy5HZXRBdChpKSA9PSBtYXhDb25maWRlbmNlKSB7DQotICAgICAgICAgICAgcmVzdWx0LT5BZGQobV9rZXlzLkdldEF0KGkpKTsNCi0gICAgICAgIH0NCitDRlhfSW50MzJBcnJheSogQ0JDX0JhcmNvZGVWYWx1ZTo6Z2V0VmFsdWUoKSB7DQorICBpbnQzMl90IG1heENvbmZpZGVuY2UgPSAtMTsNCisgIENGWF9JbnQzMkFycmF5KiByZXN1bHQgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2tleXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgaWYgKG1fdmFsdWVzLkdldEF0KGkpID4gbWF4Q29uZmlkZW5jZSkgew0KKyAgICAgIG1heENvbmZpZGVuY2UgPSBtX3ZhbHVlcy5HZXRBdChpKTsNCisgICAgICByZXN1bHQtPlJlbW92ZUFsbCgpOw0KKyAgICAgIHJlc3VsdC0+QWRkKG1fa2V5cy5HZXRBdChpKSk7DQorICAgIH0gZWxzZSBpZiAobV92YWx1ZXMuR2V0QXQoaSkgPT0gbWF4Q29uZmlkZW5jZSkgew0KKyAgICAgIHJlc3VsdC0+QWRkKG1fa2V5cy5HZXRBdChpKSk7DQogICAgIH0NCi0gICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQogfQ0KLWludDMyX3QgQ0JDX0JhcmNvZGVWYWx1ZTo6Z2V0Q29uZmlkZW5jZShpbnQzMl90IHZhbHVlKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9rZXlzLkdldFNpemUoKTsgaSsrKQ0KLSAgICAgICAgaWYgKG1fa2V5cy5HZXRBdChpKSA9PSB2YWx1ZSkgew0KLSAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlcy5HZXRBdChpKTsNCi0gICAgICAgIH0NCi0gICAgcmV0dXJuIC0xOw0KK2ludDMyX3QgQ0JDX0JhcmNvZGVWYWx1ZTo6Z2V0Q29uZmlkZW5jZShpbnQzMl90IHZhbHVlKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2tleXMuR2V0U2l6ZSgpOyBpKyspDQorICAgIGlmIChtX2tleXMuR2V0QXQoaSkgPT0gdmFsdWUpIHsNCisgICAgICByZXR1cm4gbV92YWx1ZXMuR2V0QXQoaSk7DQorICAgIH0NCisgIHJldHVybiAtMTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5oCmluZGV4IDc3MjllMDQuLjMwOGM1NGUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlVmFsdWUuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVZhbHVlLmgKQEAgLTYsMTYgKzYsMTYgQEAKIA0KICNpZm5kZWYgX0JDX0JBUkNPREVWQUxVRV9IXw0KICNkZWZpbmUgX0JDX0JBUkNPREVWQUxVRV9IXw0KLWNsYXNzIENCQ19CYXJjb2RlVmFsdWUNCi17DQotcHVibGljOg0KLSAgICBDQkNfQmFyY29kZVZhbHVlKCk7DQotICAgIHZpcnR1YWwgfkNCQ19CYXJjb2RlVmFsdWUoKTsNCi0gICAgdm9pZCBzZXRWYWx1ZShpbnQzMl90IHZhbHVlKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkqIGdldFZhbHVlKCk7DQotICAgIGludDMyX3QgZ2V0Q29uZmlkZW5jZShpbnQzMl90IHZhbHVlKTsNCi1wcml2YXRlOg0KLSAgICBDRlhfSW50MzJBcnJheSBtX2tleXM7DQotICAgIENGWF9JbnQzMkFycmF5IG1fdmFsdWVzOw0KK2NsYXNzIENCQ19CYXJjb2RlVmFsdWUgew0KKyBwdWJsaWM6DQorICBDQkNfQmFyY29kZVZhbHVlKCk7DQorICB2aXJ0dWFsIH5DQkNfQmFyY29kZVZhbHVlKCk7DQorICB2b2lkIHNldFZhbHVlKGludDMyX3QgdmFsdWUpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGdldFZhbHVlKCk7DQorICBpbnQzMl90IGdldENvbmZpZGVuY2UoaW50MzJfdCB2YWx1ZSk7DQorDQorIHByaXZhdGU6DQorICBDRlhfSW50MzJBcnJheSBtX2tleXM7DQorICBDRlhfSW50MzJBcnJheSBtX3ZhbHVlczsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCb3VuZGluZ0JveC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Qm91bmRpbmdCb3guY3BwCmluZGV4IGZlYzRhYmMuLjA4MDFiYmMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCb3VuZGluZ0JveC5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JvdW5kaW5nQm94LmNwcApAQCAtMjQsMTcxICsyNCwxODYgQEAKICNpbmNsdWRlICIuLi9CQ19SZXN1bHRQb2ludC5oIg0KICNpbmNsdWRlICIuLi9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQogI2luY2x1ZGUgIkJDX1BERjQxN0JvdW5kaW5nQm94LmgiDQotQ0JDX0JvdW5kaW5nQm94OjpDQkNfQm91bmRpbmdCb3goQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LCBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LCBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKCh0b3BMZWZ0ID09IE5VTEwgJiYgdG9wUmlnaHQgPT0gTlVMTCkgfHwNCi0gICAgICAgICAgICAoYm90dG9tTGVmdCA9PSBOVUxMICYmIGJvdHRvbVJpZ2h0ID09IE5VTEwpIHx8DQotICAgICAgICAgICAgKHRvcExlZnQgIT0gTlVMTCAmJiBib3R0b21MZWZ0ID09IE5VTEwpIHx8DQotICAgICAgICAgICAgKHRvcFJpZ2h0ICE9IE5VTEwgJiYgYm90dG9tUmlnaHQgPT0gTlVMTCkpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kSW5zdGFuY2U7DQotICAgIH0NCi0gICAgaW5pdChpbWFnZSwgdG9wTGVmdCwgYm90dG9tTGVmdCwgdG9wUmlnaHQsIGJvdHRvbVJpZ2h0KTsNCitDQkNfQm91bmRpbmdCb3g6OkNCQ19Cb3VuZGluZ0JveChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21SaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoKHRvcExlZnQgPT0gTlVMTCAmJiB0b3BSaWdodCA9PSBOVUxMKSB8fA0KKyAgICAgIChib3R0b21MZWZ0ID09IE5VTEwgJiYgYm90dG9tUmlnaHQgPT0gTlVMTCkgfHwNCisgICAgICAodG9wTGVmdCAhPSBOVUxMICYmIGJvdHRvbUxlZnQgPT0gTlVMTCkgfHwNCisgICAgICAodG9wUmlnaHQgIT0gTlVMTCAmJiBib3R0b21SaWdodCA9PSBOVUxMKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZEluc3RhbmNlOw0KKyAgfQ0KKyAgaW5pdChpbWFnZSwgdG9wTGVmdCwgYm90dG9tTGVmdCwgdG9wUmlnaHQsIGJvdHRvbVJpZ2h0KTsNCiB9DQotQ0JDX0JvdW5kaW5nQm94OjpDQkNfQm91bmRpbmdCb3goQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCkNCi17DQotICAgIGluaXQoYm91bmRpbmdCb3gtPm1faW1hZ2UsIGJvdW5kaW5nQm94LT5tX3RvcExlZnQsIGJvdW5kaW5nQm94LT5tX2JvdHRvbUxlZnQsIGJvdW5kaW5nQm94LT5tX3RvcFJpZ2h0LCBib3VuZGluZ0JveC0+bV9ib3R0b21SaWdodCk7DQorQ0JDX0JvdW5kaW5nQm94OjpDQkNfQm91bmRpbmdCb3goQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCkgew0KKyAgaW5pdChib3VuZGluZ0JveC0+bV9pbWFnZSwgYm91bmRpbmdCb3gtPm1fdG9wTGVmdCwgYm91bmRpbmdCb3gtPm1fYm90dG9tTGVmdCwNCisgICAgICAgYm91bmRpbmdCb3gtPm1fdG9wUmlnaHQsIGJvdW5kaW5nQm94LT5tX2JvdHRvbVJpZ2h0KTsNCiB9DQotQ0JDX0JvdW5kaW5nQm94Ojp+Q0JDX0JvdW5kaW5nQm94KCkNCi17DQotICAgIGlmIChtX3RvcExlZnQpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3RvcExlZnQ7DQotICAgIH0NCi0gICAgaWYgKG1fYm90dG9tTGVmdCkgew0KLSAgICAgICAgZGVsZXRlIG1fYm90dG9tTGVmdDsNCi0gICAgfQ0KLSAgICBpZiAobV90b3BSaWdodCkgew0KLSAgICAgICAgZGVsZXRlIG1fdG9wUmlnaHQ7DQotICAgIH0NCi0gICAgaWYgKG1fYm90dG9tUmlnaHQpIHsNCi0gICAgICAgIGRlbGV0ZSBtX2JvdHRvbVJpZ2h0Ow0KLSAgICB9DQorQ0JDX0JvdW5kaW5nQm94Ojp+Q0JDX0JvdW5kaW5nQm94KCkgew0KKyAgaWYgKG1fdG9wTGVmdCkgew0KKyAgICBkZWxldGUgbV90b3BMZWZ0Ow0KKyAgfQ0KKyAgaWYgKG1fYm90dG9tTGVmdCkgew0KKyAgICBkZWxldGUgbV9ib3R0b21MZWZ0Ow0KKyAgfQ0KKyAgaWYgKG1fdG9wUmlnaHQpIHsNCisgICAgZGVsZXRlIG1fdG9wUmlnaHQ7DQorICB9DQorICBpZiAobV9ib3R0b21SaWdodCkgew0KKyAgICBkZWxldGUgbV9ib3R0b21SaWdodDsNCisgIH0NCiB9DQotQ0JDX0JvdW5kaW5nQm94KiBDQkNfQm91bmRpbmdCb3g6Om1lcmdlKENCQ19Cb3VuZGluZ0JveCogbGVmdEJveCwgQ0JDX0JvdW5kaW5nQm94KiByaWdodEJveCwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3ggPSBOVUxMOw0KLSAgICBpZiAobGVmdEJveCA9PSBOVUxMKSB7DQotICAgICAgICBib3VuZGluZ0JveCA9IEZYX05FVyBDQkNfQm91bmRpbmdCb3gocmlnaHRCb3gpOw0KLSAgICAgICAgcmV0dXJuIGJvdW5kaW5nQm94Ow0KLSAgICB9DQotICAgIGlmIChyaWdodEJveCA9PSBOVUxMKSB7DQotICAgICAgICBib3VuZGluZ0JveCA9IEZYX05FVyBDQkNfQm91bmRpbmdCb3gobGVmdEJveCk7DQotICAgICAgICByZXR1cm4gYm91bmRpbmdCb3g7DQotICAgIH0NCi0gICAgYm91bmRpbmdCb3ggPSBGWF9ORVcgQ0JDX0JvdW5kaW5nQm94KGxlZnRCb3gtPm1faW1hZ2UsIGxlZnRCb3gtPm1fdG9wTGVmdCwgbGVmdEJveC0+bV9ib3R0b21MZWZ0LCByaWdodEJveC0+bV90b3BSaWdodCwgcmlnaHRCb3gtPm1fYm90dG9tUmlnaHQsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorQ0JDX0JvdW5kaW5nQm94KiBDQkNfQm91bmRpbmdCb3g6Om1lcmdlKENCQ19Cb3VuZGluZ0JveCogbGVmdEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0JvdW5kaW5nQm94KiByaWdodEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9IE5VTEw7DQorICBpZiAobGVmdEJveCA9PSBOVUxMKSB7DQorICAgIGJvdW5kaW5nQm94ID0gRlhfTkVXIENCQ19Cb3VuZGluZ0JveChyaWdodEJveCk7DQogICAgIHJldHVybiBib3VuZGluZ0JveDsNCi19DQotQ0JDX0JvdW5kaW5nQm94KiBDQkNfQm91bmRpbmdCb3g6OmFkZE1pc3NpbmdSb3dzKGludDMyX3QgbWlzc2luZ1N0YXJ0Um93cywgaW50MzJfdCBtaXNzaW5nRW5kUm93cywgRlhfQk9PTCBpc0xlZnQsIGludDMyX3QgJmUpDQotew0KLSAgICBDQkNfUmVzdWx0UG9pbnQqIG5ld1RvcExlZnQgPSBtX3RvcExlZnQ7DQotICAgIENCQ19SZXN1bHRQb2ludCogbmV3Qm90dG9tTGVmdCA9IG1fYm90dG9tTGVmdDsNCi0gICAgQ0JDX1Jlc3VsdFBvaW50KiBuZXdUb3BSaWdodCA9IG1fdG9wUmlnaHQ7DQotICAgIENCQ19SZXN1bHRQb2ludCogbmV3Qm90dG9tUmlnaHQgPSBtX2JvdHRvbVJpZ2h0Ow0KLSAgICBDQkNfUmVzdWx0UG9pbnQqIG5ld1RvcCA9IE5VTEw7DQotICAgIENCQ19SZXN1bHRQb2ludCogbmV3Qm90dG9tID0gTlVMTDsNCi0gICAgaWYgKG1pc3NpbmdTdGFydFJvd3MgPiAwKSB7DQotICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcCA9IGlzTGVmdCA/IG1fdG9wTGVmdCA6IG1fdG9wUmlnaHQ7DQotICAgICAgICBpbnQzMl90IG5ld01pblkgPSAoaW50MzJfdCkgdG9wLT5HZXRZKCkgLSBtaXNzaW5nU3RhcnRSb3dzOw0KLSAgICAgICAgaWYgKG5ld01pblkgPCAwKSB7DQotICAgICAgICAgICAgbmV3TWluWSA9IDA7DQotICAgICAgICB9DQotICAgICAgICBuZXdUb3AgPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KChGWF9GTE9BVCl0b3AtPkdldFgoKSwgKEZYX0ZMT0FUKW5ld01pblkpOw0KLSAgICAgICAgaWYgKGlzTGVmdCkgew0KLSAgICAgICAgICAgIG5ld1RvcExlZnQgPSBuZXdUb3A7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG5ld1RvcFJpZ2h0ID0gbmV3VG9wOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChtaXNzaW5nRW5kUm93cyA+IDApIHsNCi0gICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tID0gaXNMZWZ0ID8gbV9ib3R0b21MZWZ0IDogbV9ib3R0b21SaWdodDsNCi0gICAgICAgIGludDMyX3QgbmV3TWF4WSA9IChpbnQzMl90KSBib3R0b20tPkdldFkoKSArIG1pc3NpbmdFbmRSb3dzOw0KLSAgICAgICAgaWYgKG5ld01heFkgPj0gbV9pbWFnZS0+R2V0SGVpZ2h0KCkpIHsNCi0gICAgICAgICAgICBuZXdNYXhZID0gbV9pbWFnZS0+R2V0SGVpZ2h0KCkgLSAxOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbmV3Qm90dG9tID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCgoRlhfRkxPQVQpYm90dG9tLT5HZXRYKCksIChGWF9GTE9BVCluZXdNYXhZKTsNCi0gICAgICAgIGlmIChpc0xlZnQpIHsNCi0gICAgICAgICAgICBuZXdCb3R0b21MZWZ0ID0gbmV3Qm90dG9tOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBuZXdCb3R0b21SaWdodCA9IG5ld0JvdHRvbTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBjYWxjdWxhdGVNaW5NYXhWYWx1ZXMoKTsNCi0gICAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9IEZYX05FVyBDQkNfQm91bmRpbmdCb3gobV9pbWFnZSwgbmV3VG9wTGVmdCwgbmV3Qm90dG9tTGVmdCwgbmV3VG9wUmlnaHQsIG5ld0JvdHRvbVJpZ2h0LCBlKTsNCi0gICAgZGVsZXRlIG5ld1RvcDsNCi0gICAgZGVsZXRlIG5ld0JvdHRvbTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgaWYgKHJpZ2h0Qm94ID09IE5VTEwpIHsNCisgICAgYm91bmRpbmdCb3ggPSBGWF9ORVcgQ0JDX0JvdW5kaW5nQm94KGxlZnRCb3gpOw0KICAgICByZXR1cm4gYm91bmRpbmdCb3g7DQorICB9DQorICBib3VuZGluZ0JveCA9IEZYX05FVyBDQkNfQm91bmRpbmdCb3goDQorICAgICAgbGVmdEJveC0+bV9pbWFnZSwgbGVmdEJveC0+bV90b3BMZWZ0LCBsZWZ0Qm94LT5tX2JvdHRvbUxlZnQsDQorICAgICAgcmlnaHRCb3gtPm1fdG9wUmlnaHQsIHJpZ2h0Qm94LT5tX2JvdHRvbVJpZ2h0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiBib3VuZGluZ0JveDsNCiB9DQotdm9pZCBDQkNfQm91bmRpbmdCb3g6OnNldFRvcFJpZ2h0KENCQ19SZXN1bHRQb2ludCB0b3BSaWdodCkNCi17DQotICAgIGlmIChtX3RvcFJpZ2h0KSB7DQotICAgICAgICBkZWxldGUgbV90b3BSaWdodDsNCitDQkNfQm91bmRpbmdCb3gqIENCQ19Cb3VuZGluZ0JveDo6YWRkTWlzc2luZ1Jvd3MoaW50MzJfdCBtaXNzaW5nU3RhcnRSb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pc3NpbmdFbmRSb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBuZXdUb3BMZWZ0ID0gbV90b3BMZWZ0Ow0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBuZXdCb3R0b21MZWZ0ID0gbV9ib3R0b21MZWZ0Ow0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBuZXdUb3BSaWdodCA9IG1fdG9wUmlnaHQ7DQorICBDQkNfUmVzdWx0UG9pbnQqIG5ld0JvdHRvbVJpZ2h0ID0gbV9ib3R0b21SaWdodDsNCisgIENCQ19SZXN1bHRQb2ludCogbmV3VG9wID0gTlVMTDsNCisgIENCQ19SZXN1bHRQb2ludCogbmV3Qm90dG9tID0gTlVMTDsNCisgIGlmIChtaXNzaW5nU3RhcnRSb3dzID4gMCkgew0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcCA9IGlzTGVmdCA/IG1fdG9wTGVmdCA6IG1fdG9wUmlnaHQ7DQorICAgIGludDMyX3QgbmV3TWluWSA9IChpbnQzMl90KXRvcC0+R2V0WSgpIC0gbWlzc2luZ1N0YXJ0Um93czsNCisgICAgaWYgKG5ld01pblkgPCAwKSB7DQorICAgICAgbmV3TWluWSA9IDA7DQogICAgIH0NCi0gICAgbV90b3BSaWdodCA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQodG9wUmlnaHQuR2V0WCgpLCB0b3BSaWdodC5HZXRZKCkpOw0KLSAgICBjYWxjdWxhdGVNaW5NYXhWYWx1ZXMoKTsNCi19DQotdm9pZCBDQkNfQm91bmRpbmdCb3g6OnNldEJvdHRvbVJpZ2h0KENCQ19SZXN1bHRQb2ludCBib3R0b21SaWdodCkNCi17DQotICAgIGlmIChtX2JvdHRvbVJpZ2h0KSB7DQotICAgICAgICBkZWxldGUgbV9ib3R0b21SaWdodDsNCisgICAgbmV3VG9wID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCgoRlhfRkxPQVQpdG9wLT5HZXRYKCksIChGWF9GTE9BVCluZXdNaW5ZKTsNCisgICAgaWYgKGlzTGVmdCkgew0KKyAgICAgIG5ld1RvcExlZnQgPSBuZXdUb3A7DQorICAgIH0gZWxzZSB7DQorICAgICAgbmV3VG9wUmlnaHQgPSBuZXdUb3A7DQogICAgIH0NCi0gICAgbV9ib3R0b21SaWdodCA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoYm90dG9tUmlnaHQuR2V0WCgpLCBib3R0b21SaWdodC5HZXRZKCkpOw0KLSAgICBjYWxjdWxhdGVNaW5NYXhWYWx1ZXMoKTsNCi19DQotaW50MzJfdCBDQkNfQm91bmRpbmdCb3g6OmdldE1pblgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbWluWDsNCi19DQotaW50MzJfdCBDQkNfQm91bmRpbmdCb3g6OmdldE1heFgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbWF4WDsNCi19DQotaW50MzJfdCBDQkNfQm91bmRpbmdCb3g6OmdldE1pblkoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbWluWTsNCi19DQotaW50MzJfdCBDQkNfQm91bmRpbmdCb3g6OmdldE1heFkoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbWF4WTsNCi19DQotQ0JDX1Jlc3VsdFBvaW50KiBDQkNfQm91bmRpbmdCb3g6OmdldFRvcExlZnQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fdG9wTGVmdDsNCi19DQotQ0JDX1Jlc3VsdFBvaW50KiBDQkNfQm91bmRpbmdCb3g6OmdldFRvcFJpZ2h0KCkNCi17DQotICAgIHJldHVybiBtX3RvcFJpZ2h0Ow0KLX0NCi1DQkNfUmVzdWx0UG9pbnQqIENCQ19Cb3VuZGluZ0JveDo6Z2V0Qm90dG9tTGVmdCgpDQotew0KLSAgICByZXR1cm4gbV9ib3R0b21MZWZ0Ow0KLX0NCi1DQkNfUmVzdWx0UG9pbnQqIENCQ19Cb3VuZGluZ0JveDo6Z2V0Qm90dG9tUmlnaHQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYm90dG9tUmlnaHQ7DQotfQ0KLXZvaWQgQ0JDX0JvdW5kaW5nQm94Ojppbml0KENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLCBDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiB0b3BSaWdodCwgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21SaWdodCkNCi17DQotICAgIG1fdG9wTGVmdCA9IE5VTEw7DQotICAgIG1fYm90dG9tTGVmdCA9IE5VTEw7DQotICAgIG1fdG9wUmlnaHQgPSBOVUxMOw0KLSAgICBtX2JvdHRvbVJpZ2h0ID0gTlVMTDsNCi0gICAgbV9pbWFnZSA9IGltYWdlOw0KLSAgICBpZiAodG9wTGVmdCkgew0KLSAgICAgICAgbV90b3BMZWZ0ID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCh0b3BMZWZ0LT5HZXRYKCksIHRvcExlZnQtPkdldFkoKSk7DQorICB9DQorICBpZiAobWlzc2luZ0VuZFJvd3MgPiAwKSB7DQorICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tID0gaXNMZWZ0ID8gbV9ib3R0b21MZWZ0IDogbV9ib3R0b21SaWdodDsNCisgICAgaW50MzJfdCBuZXdNYXhZID0gKGludDMyX3QpYm90dG9tLT5HZXRZKCkgKyBtaXNzaW5nRW5kUm93czsNCisgICAgaWYgKG5ld01heFkgPj0gbV9pbWFnZS0+R2V0SGVpZ2h0KCkpIHsNCisgICAgICBuZXdNYXhZID0gbV9pbWFnZS0+R2V0SGVpZ2h0KCkgLSAxOw0KICAgICB9DQotICAgIGlmIChib3R0b21MZWZ0KSB7DQotICAgICAgICBtX2JvdHRvbUxlZnQgPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KGJvdHRvbUxlZnQtPkdldFgoKSwgYm90dG9tTGVmdC0+R2V0WSgpKTsNCisgICAgbmV3Qm90dG9tID0NCisgICAgICAgIEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKWJvdHRvbS0+R2V0WCgpLCAoRlhfRkxPQVQpbmV3TWF4WSk7DQorICAgIGlmIChpc0xlZnQpIHsNCisgICAgICBuZXdCb3R0b21MZWZ0ID0gbmV3Qm90dG9tOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5ld0JvdHRvbVJpZ2h0ID0gbmV3Qm90dG9tOw0KICAgICB9DQotICAgIGlmICh0b3BSaWdodCkgew0KLSAgICAgICAgbV90b3BSaWdodCA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQodG9wUmlnaHQtPkdldFgoKSwgdG9wUmlnaHQtPkdldFkoKSk7DQotICAgIH0NCi0gICAgaWYgKGJvdHRvbVJpZ2h0KSB7DQotICAgICAgICBtX2JvdHRvbVJpZ2h0ID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludChib3R0b21SaWdodC0+R2V0WCgpLCBib3R0b21SaWdodC0+R2V0WSgpKTsNCi0gICAgfQ0KLSAgICBjYWxjdWxhdGVNaW5NYXhWYWx1ZXMoKTsNCisgIH0NCisgIGNhbGN1bGF0ZU1pbk1heFZhbHVlcygpOw0KKyAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9IEZYX05FVyBDQkNfQm91bmRpbmdCb3goDQorICAgICAgbV9pbWFnZSwgbmV3VG9wTGVmdCwgbmV3Qm90dG9tTGVmdCwgbmV3VG9wUmlnaHQsIG5ld0JvdHRvbVJpZ2h0LCBlKTsNCisgIGRlbGV0ZSBuZXdUb3A7DQorICBkZWxldGUgbmV3Qm90dG9tOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIGJvdW5kaW5nQm94Ow0KIH0NCi12b2lkIENCQ19Cb3VuZGluZ0JveDo6Y2FsY3VsYXRlTWluTWF4VmFsdWVzKCkNCi17DQotICAgIGlmIChtX3RvcExlZnQgPT0gTlVMTCkgew0KLSAgICAgICAgbV90b3BMZWZ0ID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCgwLCBtX3RvcFJpZ2h0LT5HZXRZKCkpOw0KLSAgICAgICAgbV9ib3R0b21MZWZ0ID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCgwLCBtX2JvdHRvbVJpZ2h0LT5HZXRZKCkpOw0KLSAgICB9IGVsc2UgaWYgKG1fdG9wUmlnaHQgPT0gTlVMTCkgew0KLSAgICAgICAgbV90b3BSaWdodCA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKW1faW1hZ2UtPkdldFdpZHRoKCkgLSAxLCAoRlhfRkxPQVQpbV90b3BMZWZ0LT5HZXRZKCkpOw0KLSAgICAgICAgbV9ib3R0b21SaWdodCA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKW1faW1hZ2UtPkdldFdpZHRoKCkgLSAxLCAoRlhfRkxPQVQpbV9ib3R0b21MZWZ0LT5HZXRZKCkpOw0KLSAgICB9DQotICAgIG1fbWluWCA9IChpbnQzMl90KSAobV90b3BMZWZ0LT5HZXRYKCkgPCBtX2JvdHRvbUxlZnQtPkdldFgoKSA/IG1fdG9wTGVmdC0+R2V0WCgpIDogbV9ib3R0b21MZWZ0LT5HZXRYKCkpOw0KLSAgICBtX21heFggPSAoaW50MzJfdCkgKG1fdG9wUmlnaHQtPkdldFgoKSA+IG1fYm90dG9tUmlnaHQtPkdldFgoKSA/IG1fdG9wUmlnaHQtPkdldFgoKSA6IG1fYm90dG9tUmlnaHQtPkdldFgoKSk7DQotICAgIG1fbWluWSA9IChpbnQzMl90KSAobV90b3BMZWZ0LT5HZXRZKCkgPCAgbV90b3BSaWdodC0+R2V0WSgpID8gbV90b3BMZWZ0LT5HZXRZKCkgOiBtX3RvcFJpZ2h0LT5HZXRZKCkpOw0KLSAgICBtX21heFkgPSAoaW50MzJfdCkgKG1fYm90dG9tTGVmdC0+R2V0WSgpID4gIG1fYm90dG9tUmlnaHQtPkdldFkoKSA/IG1fYm90dG9tTGVmdC0+R2V0WSgpIDogbV9ib3R0b21SaWdodC0+R2V0WSgpKTsNCit2b2lkIENCQ19Cb3VuZGluZ0JveDo6c2V0VG9wUmlnaHQoQ0JDX1Jlc3VsdFBvaW50IHRvcFJpZ2h0KSB7DQorICBpZiAobV90b3BSaWdodCkgew0KKyAgICBkZWxldGUgbV90b3BSaWdodDsNCisgIH0NCisgIG1fdG9wUmlnaHQgPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHRvcFJpZ2h0LkdldFgoKSwgdG9wUmlnaHQuR2V0WSgpKTsNCisgIGNhbGN1bGF0ZU1pbk1heFZhbHVlcygpOw0KK30NCit2b2lkIENCQ19Cb3VuZGluZ0JveDo6c2V0Qm90dG9tUmlnaHQoQ0JDX1Jlc3VsdFBvaW50IGJvdHRvbVJpZ2h0KSB7DQorICBpZiAobV9ib3R0b21SaWdodCkgew0KKyAgICBkZWxldGUgbV9ib3R0b21SaWdodDsNCisgIH0NCisgIG1fYm90dG9tUmlnaHQgPQ0KKyAgICAgIEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoYm90dG9tUmlnaHQuR2V0WCgpLCBib3R0b21SaWdodC5HZXRZKCkpOw0KKyAgY2FsY3VsYXRlTWluTWF4VmFsdWVzKCk7DQorfQ0KK2ludDMyX3QgQ0JDX0JvdW5kaW5nQm94OjpnZXRNaW5YKCkgew0KKyAgcmV0dXJuIG1fbWluWDsNCit9DQoraW50MzJfdCBDQkNfQm91bmRpbmdCb3g6OmdldE1heFgoKSB7DQorICByZXR1cm4gbV9tYXhYOw0KK30NCitpbnQzMl90IENCQ19Cb3VuZGluZ0JveDo6Z2V0TWluWSgpIHsNCisgIHJldHVybiBtX21pblk7DQorfQ0KK2ludDMyX3QgQ0JDX0JvdW5kaW5nQm94OjpnZXRNYXhZKCkgew0KKyAgcmV0dXJuIG1fbWF4WTsNCit9DQorQ0JDX1Jlc3VsdFBvaW50KiBDQkNfQm91bmRpbmdCb3g6OmdldFRvcExlZnQoKSB7DQorICByZXR1cm4gbV90b3BMZWZ0Ow0KK30NCitDQkNfUmVzdWx0UG9pbnQqIENCQ19Cb3VuZGluZ0JveDo6Z2V0VG9wUmlnaHQoKSB7DQorICByZXR1cm4gbV90b3BSaWdodDsNCit9DQorQ0JDX1Jlc3VsdFBvaW50KiBDQkNfQm91bmRpbmdCb3g6OmdldEJvdHRvbUxlZnQoKSB7DQorICByZXR1cm4gbV9ib3R0b21MZWZ0Ow0KK30NCitDQkNfUmVzdWx0UG9pbnQqIENCQ19Cb3VuZGluZ0JveDo6Z2V0Qm90dG9tUmlnaHQoKSB7DQorICByZXR1cm4gbV9ib3R0b21SaWdodDsNCit9DQordm9pZCBDQkNfQm91bmRpbmdCb3g6OmluaXQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tUmlnaHQpIHsNCisgIG1fdG9wTGVmdCA9IE5VTEw7DQorICBtX2JvdHRvbUxlZnQgPSBOVUxMOw0KKyAgbV90b3BSaWdodCA9IE5VTEw7DQorICBtX2JvdHRvbVJpZ2h0ID0gTlVMTDsNCisgIG1faW1hZ2UgPSBpbWFnZTsNCisgIGlmICh0b3BMZWZ0KSB7DQorICAgIG1fdG9wTGVmdCA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQodG9wTGVmdC0+R2V0WCgpLCB0b3BMZWZ0LT5HZXRZKCkpOw0KKyAgfQ0KKyAgaWYgKGJvdHRvbUxlZnQpIHsNCisgICAgbV9ib3R0b21MZWZ0ID0NCisgICAgICAgIEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoYm90dG9tTGVmdC0+R2V0WCgpLCBib3R0b21MZWZ0LT5HZXRZKCkpOw0KKyAgfQ0KKyAgaWYgKHRvcFJpZ2h0KSB7DQorICAgIG1fdG9wUmlnaHQgPSBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KHRvcFJpZ2h0LT5HZXRYKCksIHRvcFJpZ2h0LT5HZXRZKCkpOw0KKyAgfQ0KKyAgaWYgKGJvdHRvbVJpZ2h0KSB7DQorICAgIG1fYm90dG9tUmlnaHQgPQ0KKyAgICAgICAgRlhfTkVXIENCQ19SZXN1bHRQb2ludChib3R0b21SaWdodC0+R2V0WCgpLCBib3R0b21SaWdodC0+R2V0WSgpKTsNCisgIH0NCisgIGNhbGN1bGF0ZU1pbk1heFZhbHVlcygpOw0KK30NCit2b2lkIENCQ19Cb3VuZGluZ0JveDo6Y2FsY3VsYXRlTWluTWF4VmFsdWVzKCkgew0KKyAgaWYgKG1fdG9wTGVmdCA9PSBOVUxMKSB7DQorICAgIG1fdG9wTGVmdCA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoMCwgbV90b3BSaWdodC0+R2V0WSgpKTsNCisgICAgbV9ib3R0b21MZWZ0ID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCgwLCBtX2JvdHRvbVJpZ2h0LT5HZXRZKCkpOw0KKyAgfSBlbHNlIGlmIChtX3RvcFJpZ2h0ID09IE5VTEwpIHsNCisgICAgbV90b3BSaWdodCA9IEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKW1faW1hZ2UtPkdldFdpZHRoKCkgLSAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpbV90b3BMZWZ0LT5HZXRZKCkpOw0KKyAgICBtX2JvdHRvbVJpZ2h0ID0gRlhfTkVXIENCQ19SZXN1bHRQb2ludCgoRlhfRkxPQVQpbV9pbWFnZS0+R2V0V2lkdGgoKSAtIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCltX2JvdHRvbUxlZnQtPkdldFkoKSk7DQorICB9DQorICBtX21pblggPSAoaW50MzJfdCkobV90b3BMZWZ0LT5HZXRYKCkgPCBtX2JvdHRvbUxlZnQtPkdldFgoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fdG9wTGVmdC0+R2V0WCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9ib3R0b21MZWZ0LT5HZXRYKCkpOw0KKyAgbV9tYXhYID0gKGludDMyX3QpKG1fdG9wUmlnaHQtPkdldFgoKSA+IG1fYm90dG9tUmlnaHQtPkdldFgoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fdG9wUmlnaHQtPkdldFgoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fYm90dG9tUmlnaHQtPkdldFgoKSk7DQorICBtX21pblkgPQ0KKyAgICAgIChpbnQzMl90KShtX3RvcExlZnQtPkdldFkoKSA8IG1fdG9wUmlnaHQtPkdldFkoKSA/IG1fdG9wTGVmdC0+R2V0WSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV90b3BSaWdodC0+R2V0WSgpKTsNCisgIG1fbWF4WSA9IChpbnQzMl90KShtX2JvdHRvbUxlZnQtPkdldFkoKSA+IG1fYm90dG9tUmlnaHQtPkdldFkoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fYm90dG9tTGVmdC0+R2V0WSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9ib3R0b21SaWdodC0+R2V0WSgpKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JvdW5kaW5nQm94LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Qm91bmRpbmdCb3guaAppbmRleCA5N2Q4NDA2Li42MWVhOGExIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Qm91bmRpbmdCb3guaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Qm91bmRpbmdCb3guaApAQCAtOCwzNSArOCw0OSBAQAogI2RlZmluZSBfQkNfQk9VTkRJTkdCT1hfSF8NCiBjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KIGNsYXNzIENCQ19SZXN1bHRQb2ludDsNCi1jbGFzcyBDQkNfQm91bmRpbmdCb3gNCi17DQotcHVibGljOg0KLSAgICBDQkNfQm91bmRpbmdCb3goQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LCBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LCBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0LCBpbnQzMl90ICZlKTsNCi0gICAgQ0JDX0JvdW5kaW5nQm94KENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpOw0KLSAgICB2aXJ0dWFsIH5DQkNfQm91bmRpbmdCb3goKTsNCi0gICAgc3RhdGljIENCQ19Cb3VuZGluZ0JveCogbWVyZ2UoQ0JDX0JvdW5kaW5nQm94KiBsZWZ0Qm94LCBDQkNfQm91bmRpbmdCb3gqIHJpZ2h0Qm94LCBpbnQzMl90ICZlKTsNCi0gICAgQ0JDX0JvdW5kaW5nQm94KiBhZGRNaXNzaW5nUm93cyhpbnQzMl90IG1pc3NpbmdTdGFydFJvd3MsIGludDMyX3QgbWlzc2luZ0VuZFJvd3MsIEZYX0JPT0wgaXNMZWZ0LCBpbnQzMl90ICZlKTsNCi0gICAgdm9pZCBzZXRUb3BSaWdodChDQkNfUmVzdWx0UG9pbnQgdG9wUmlnaHQpOw0KLSAgICB2b2lkIHNldEJvdHRvbVJpZ2h0KENCQ19SZXN1bHRQb2ludCBib3R0b21SaWdodCk7DQotICAgIGludDMyX3QgZ2V0TWluWCgpOw0KLSAgICBpbnQzMl90IGdldE1heFgoKTsNCi0gICAgaW50MzJfdCBnZXRNaW5ZKCk7DQotICAgIGludDMyX3QgZ2V0TWF4WSgpOw0KLSAgICBDQkNfUmVzdWx0UG9pbnQqIGdldFRvcExlZnQoKTsNCi0gICAgQ0JDX1Jlc3VsdFBvaW50KiBnZXRUb3BSaWdodCgpOw0KLSAgICBDQkNfUmVzdWx0UG9pbnQqIGdldEJvdHRvbUxlZnQoKTsNCi0gICAgQ0JDX1Jlc3VsdFBvaW50KiBnZXRCb3R0b21SaWdodCgpOw0KLXByaXZhdGU6DQotICAgIENCQ19Db21tb25CaXRNYXRyaXgqIG1faW1hZ2U7DQotICAgIENCQ19SZXN1bHRQb2ludCogbV90b3BMZWZ0Ow0KLSAgICBDQkNfUmVzdWx0UG9pbnQqIG1fYm90dG9tTGVmdDsNCi0gICAgQ0JDX1Jlc3VsdFBvaW50KiBtX3RvcFJpZ2h0Ow0KLSAgICBDQkNfUmVzdWx0UG9pbnQqIG1fYm90dG9tUmlnaHQ7DQotICAgIGludDMyX3QgbV9taW5YOw0KLSAgICBpbnQzMl90IG1fbWF4WDsNCi0gICAgaW50MzJfdCBtX21pblk7DQotICAgIGludDMyX3QgbV9tYXhZOw0KLSAgICB2b2lkIGluaXQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LCBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LCBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0KTsNCi0gICAgdm9pZCBjYWxjdWxhdGVNaW5NYXhWYWx1ZXMoKTsNCitjbGFzcyBDQkNfQm91bmRpbmdCb3ggew0KKyBwdWJsaWM6DQorICBDQkNfQm91bmRpbmdCb3goQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwNCisgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tUmlnaHQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDQkNfQm91bmRpbmdCb3goQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCk7DQorICB2aXJ0dWFsIH5DQkNfQm91bmRpbmdCb3goKTsNCisgIHN0YXRpYyBDQkNfQm91bmRpbmdCb3gqIG1lcmdlKENCQ19Cb3VuZGluZ0JveCogbGVmdEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Cb3VuZGluZ0JveCogcmlnaHRCb3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENCQ19Cb3VuZGluZ0JveCogYWRkTWlzc2luZ1Jvd3MoaW50MzJfdCBtaXNzaW5nU3RhcnRSb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pc3NpbmdFbmRSb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2b2lkIHNldFRvcFJpZ2h0KENCQ19SZXN1bHRQb2ludCB0b3BSaWdodCk7DQorICB2b2lkIHNldEJvdHRvbVJpZ2h0KENCQ19SZXN1bHRQb2ludCBib3R0b21SaWdodCk7DQorICBpbnQzMl90IGdldE1pblgoKTsNCisgIGludDMyX3QgZ2V0TWF4WCgpOw0KKyAgaW50MzJfdCBnZXRNaW5ZKCk7DQorICBpbnQzMl90IGdldE1heFkoKTsNCisgIENCQ19SZXN1bHRQb2ludCogZ2V0VG9wTGVmdCgpOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBnZXRUb3BSaWdodCgpOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBnZXRCb3R0b21MZWZ0KCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIGdldEJvdHRvbVJpZ2h0KCk7DQorDQorIHByaXZhdGU6DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBtX2ltYWdlOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBtX3RvcExlZnQ7DQorICBDQkNfUmVzdWx0UG9pbnQqIG1fYm90dG9tTGVmdDsNCisgIENCQ19SZXN1bHRQb2ludCogbV90b3BSaWdodDsNCisgIENCQ19SZXN1bHRQb2ludCogbV9ib3R0b21SaWdodDsNCisgIGludDMyX3QgbV9taW5YOw0KKyAgaW50MzJfdCBtX21heFg7DQorICBpbnQzMl90IG1fbWluWTsNCisgIGludDMyX3QgbV9tYXhZOw0KKyAgdm9pZCBpbml0KENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwNCisgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbUxlZnQsDQorICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BSaWdodCwNCisgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0KTsNCisgIHZvaWQgY2FsY3VsYXRlTWluTWF4VmFsdWVzKCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmQuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkLmNwcAppbmRleCA4NDQ5YTdlLi5iNGU2MWEzIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmQuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZC5jcHAKQEAgLTIzLDU4ICsyMyw0OCBAQAogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3Q29kZXdvcmQuaCINCiBpbnQzMl90IENCQ19Db2Rld29yZDo6QkFSQ09ERV9ST1dfVU5LTk9XTiA9IC0xOw0KLUNCQ19Db2Rld29yZDo6Q0JDX0NvZGV3b3JkKGludDMyX3Qgc3RhcnRYLCBpbnQzMl90IGVuZFgsIGludDMyX3QgYnVja2V0LCBpbnQzMl90IGN2YWx1ZSkNCi17DQotICAgIG1fc3RhcnRYID0gc3RhcnRYOw0KLSAgICBtX2VuZFggPSBlbmRYOw0KLSAgICBtX2J1Y2tldCA9IGJ1Y2tldDsNCi0gICAgbV92YWx1ZSA9IGN2YWx1ZTsNCi0gICAgbV9yb3dOdW1iZXIgPSBCQVJDT0RFX1JPV19VTktOT1dOOw0KK0NCQ19Db2Rld29yZDo6Q0JDX0NvZGV3b3JkKGludDMyX3Qgc3RhcnRYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZW5kWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ1Y2tldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGN2YWx1ZSkgew0KKyAgbV9zdGFydFggPSBzdGFydFg7DQorICBtX2VuZFggPSBlbmRYOw0KKyAgbV9idWNrZXQgPSBidWNrZXQ7DQorICBtX3ZhbHVlID0gY3ZhbHVlOw0KKyAgbV9yb3dOdW1iZXIgPSBCQVJDT0RFX1JPV19VTktOT1dOOw0KIH0NCi1DQkNfQ29kZXdvcmQ6On5DQkNfQ29kZXdvcmQoKQ0KLXsNCitDQkNfQ29kZXdvcmQ6On5DQkNfQ29kZXdvcmQoKSB7fQ0KK0ZYX0JPT0wgQ0JDX0NvZGV3b3JkOjpoYXNWYWxpZFJvd051bWJlcigpIHsNCisgIHJldHVybiBpc1ZhbGlkUm93TnVtYmVyKG1fcm93TnVtYmVyKTsNCiB9DQotRlhfQk9PTCBDQkNfQ29kZXdvcmQ6Omhhc1ZhbGlkUm93TnVtYmVyKCkNCi17DQotICAgIHJldHVybiBpc1ZhbGlkUm93TnVtYmVyKG1fcm93TnVtYmVyKTsNCitGWF9CT09MIENCQ19Db2Rld29yZDo6aXNWYWxpZFJvd051bWJlcihpbnQzMl90IHJvd051bWJlcikgew0KKyAgcmV0dXJuIG1fcm93TnVtYmVyICE9IEJBUkNPREVfUk9XX1VOS05PV04gJiYNCisgICAgICAgICBtX2J1Y2tldCA9PSAobV9yb3dOdW1iZXIgJSAzKSAqIDM7DQogfQ0KLUZYX0JPT0wgQ0JDX0NvZGV3b3JkOjppc1ZhbGlkUm93TnVtYmVyKGludDMyX3Qgcm93TnVtYmVyKQ0KLXsNCi0gICAgcmV0dXJuIG1fcm93TnVtYmVyICE9IEJBUkNPREVfUk9XX1VOS05PV04gJiYgbV9idWNrZXQgPT0gKG1fcm93TnVtYmVyICUgMykgKiAzOw0KK3ZvaWQgQ0JDX0NvZGV3b3JkOjpzZXRSb3dOdW1iZXJBc1Jvd0luZGljYXRvckNvbHVtbigpIHsNCisgIG1fcm93TnVtYmVyID0gKG1fdmFsdWUgLyAzMCkgKiAzICsgbV9idWNrZXQgLyAzOw0KIH0NCi12b2lkIENCQ19Db2Rld29yZDo6c2V0Um93TnVtYmVyQXNSb3dJbmRpY2F0b3JDb2x1bW4oKQ0KLXsNCi0gICAgbV9yb3dOdW1iZXIgPSAobV92YWx1ZSAvIDMwKSAqIDMgKyBtX2J1Y2tldCAvIDM7DQoraW50MzJfdCBDQkNfQ29kZXdvcmQ6OmdldFdpZHRoKCkgew0KKyAgcmV0dXJuIG1fZW5kWCAtIG1fc3RhcnRYOw0KIH0NCi1pbnQzMl90IENCQ19Db2Rld29yZDo6Z2V0V2lkdGgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fZW5kWCAtIG1fc3RhcnRYOw0KK2ludDMyX3QgQ0JDX0NvZGV3b3JkOjpnZXRTdGFydFgoKSB7DQorICByZXR1cm4gbV9zdGFydFg7DQogfQ0KLWludDMyX3QgQ0JDX0NvZGV3b3JkOjpnZXRTdGFydFgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fc3RhcnRYOw0KK2ludDMyX3QgQ0JDX0NvZGV3b3JkOjpnZXRFbmRYKCkgew0KKyAgcmV0dXJuIG1fZW5kWDsNCiB9DQotaW50MzJfdCBDQkNfQ29kZXdvcmQ6OmdldEVuZFgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fZW5kWDsNCitpbnQzMl90IENCQ19Db2Rld29yZDo6Z2V0QnVja2V0KCkgew0KKyAgcmV0dXJuIG1fYnVja2V0Ow0KIH0NCi1pbnQzMl90IENCQ19Db2Rld29yZDo6Z2V0QnVja2V0KCkNCi17DQotICAgIHJldHVybiBtX2J1Y2tldDsNCitpbnQzMl90IENCQ19Db2Rld29yZDo6Z2V0VmFsdWUoKSB7DQorICByZXR1cm4gbV92YWx1ZTsNCiB9DQotaW50MzJfdCBDQkNfQ29kZXdvcmQ6OmdldFZhbHVlKCkNCi17DQotICAgIHJldHVybiBtX3ZhbHVlOw0KK2ludDMyX3QgQ0JDX0NvZGV3b3JkOjpnZXRSb3dOdW1iZXIoKSB7DQorICByZXR1cm4gbV9yb3dOdW1iZXI7DQogfQ0KLWludDMyX3QgQ0JDX0NvZGV3b3JkOjpnZXRSb3dOdW1iZXIoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcm93TnVtYmVyOw0KK3ZvaWQgQ0JDX0NvZGV3b3JkOjpzZXRSb3dOdW1iZXIoaW50MzJfdCByb3dOdW1iZXIpIHsNCisgIG1fcm93TnVtYmVyID0gcm93TnVtYmVyOw0KIH0NCi12b2lkIENCQ19Db2Rld29yZDo6c2V0Um93TnVtYmVyKGludDMyX3Qgcm93TnVtYmVyKQ0KLXsNCi0gICAgbV9yb3dOdW1iZXIgPSByb3dOdW1iZXI7DQotfQ0KLUNGWF9CeXRlU3RyaW5nIENCQ19Db2Rld29yZDo6dG9TdHJpbmcoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcm93TnVtYmVyICsgKEZYX0NIQVIpJ3wnICsgbV92YWx1ZTsNCitDRlhfQnl0ZVN0cmluZyBDQkNfQ29kZXdvcmQ6OnRvU3RyaW5nKCkgew0KKyAgcmV0dXJuIG1fcm93TnVtYmVyICsgKEZYX0NIQVIpJ3wnICsgbV92YWx1ZTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmQuaAppbmRleCBlZjVlMGFlLi41MzJkMDhiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmQuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmQuaApAQCAtNiwyOCArNiwyOCBAQAogDQogI2lmbmRlZiBfQkNfQ09ERVdPUkRfSF8NCiAjZGVmaW5lIF9CQ19DT0RFV09SRF9IXw0KLWNsYXNzIENCQ19Db2Rld29yZA0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19Db2Rld29yZChpbnQzMl90IHN0YXJ0WCwgaW50MzJfdCBlbmRYLCBpbnQzMl90IGJ1Y2tldCwgaW50MzJfdCB2YWx1ZSk7DQotICAgIHZpcnR1YWwgfkNCQ19Db2Rld29yZCgpOw0KLSAgICBGWF9CT09MIGhhc1ZhbGlkUm93TnVtYmVyKCkgOw0KLSAgICBGWF9CT09MIGlzVmFsaWRSb3dOdW1iZXIoaW50MzJfdCByb3dOdW1iZXIpOw0KLSAgICB2b2lkIHNldFJvd051bWJlckFzUm93SW5kaWNhdG9yQ29sdW1uKCk7DQotICAgIGludDMyX3QgZ2V0V2lkdGgoKTsNCi0gICAgaW50MzJfdCBnZXRTdGFydFgoKTsNCi0gICAgaW50MzJfdCBnZXRFbmRYKCk7DQotICAgIGludDMyX3QgZ2V0QnVja2V0KCk7DQotICAgIGludDMyX3QgZ2V0VmFsdWUoKTsNCi0gICAgaW50MzJfdCBnZXRSb3dOdW1iZXIoKTsNCi0gICAgdm9pZCBzZXRSb3dOdW1iZXIoaW50MzJfdCByb3dOdW1iZXIpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyB0b1N0cmluZygpOw0KLXByaXZhdGU6DQotICAgIHN0YXRpYyBpbnQzMl90IEJBUkNPREVfUk9XX1VOS05PV047DQotICAgIGludDMyX3QgbV9zdGFydFg7DQotICAgIGludDMyX3QgbV9lbmRYOw0KLSAgICBpbnQzMl90IG1fYnVja2V0Ow0KLSAgICBpbnQzMl90IG1fdmFsdWU7DQotICAgIGludDMyX3QgbV9yb3dOdW1iZXI7DQorY2xhc3MgQ0JDX0NvZGV3b3JkIHsNCisgcHVibGljOg0KKyAgQ0JDX0NvZGV3b3JkKGludDMyX3Qgc3RhcnRYLCBpbnQzMl90IGVuZFgsIGludDMyX3QgYnVja2V0LCBpbnQzMl90IHZhbHVlKTsNCisgIHZpcnR1YWwgfkNCQ19Db2Rld29yZCgpOw0KKyAgRlhfQk9PTCBoYXNWYWxpZFJvd051bWJlcigpOw0KKyAgRlhfQk9PTCBpc1ZhbGlkUm93TnVtYmVyKGludDMyX3Qgcm93TnVtYmVyKTsNCisgIHZvaWQgc2V0Um93TnVtYmVyQXNSb3dJbmRpY2F0b3JDb2x1bW4oKTsNCisgIGludDMyX3QgZ2V0V2lkdGgoKTsNCisgIGludDMyX3QgZ2V0U3RhcnRYKCk7DQorICBpbnQzMl90IGdldEVuZFgoKTsNCisgIGludDMyX3QgZ2V0QnVja2V0KCk7DQorICBpbnQzMl90IGdldFZhbHVlKCk7DQorICBpbnQzMl90IGdldFJvd051bWJlcigpOw0KKyAgdm9pZCBzZXRSb3dOdW1iZXIoaW50MzJfdCByb3dOdW1iZXIpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdG9TdHJpbmcoKTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBpbnQzMl90IEJBUkNPREVfUk9XX1VOS05PV047DQorICBpbnQzMl90IG1fc3RhcnRYOw0KKyAgaW50MzJfdCBtX2VuZFg7DQorICBpbnQzMl90IG1fYnVja2V0Ow0KKyAgaW50MzJfdCBtX3ZhbHVlOw0KKyAgaW50MzJfdCBtX3Jvd051bWJlcjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5jcHAKaW5kZXggODIyYTQ3YS4uNmU3ZDI2YiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5jcHAKQEAgLTIzLDk2ICsyMyw5MiBAQAogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3Q29tbW9uLmgiDQogI2luY2x1ZGUgIkJDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5oIg0KLSNkZWZpbmUgICAgIFNZTUJPTF9UQUJMRV9MZW5ndGggICAgICAgMjc4Nw0KLSNkZWZpbmUgICAgIEZsb2F0X01BWF9WQUxVRSAgICAgICAgICAgMjE0NzQ4MzY0Nw0KKyNkZWZpbmUgU1lNQk9MX1RBQkxFX0xlbmd0aCAyNzg3DQorI2RlZmluZSBGbG9hdF9NQVhfVkFMVUUgMjE0NzQ4MzY0Nw0KIEZYX0ZMT0FUIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OlJBVElPU19UQUJMRVsyNzg3XVs4XSA9IHswfTsNCi1DQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyOjpDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyKCkNCi17DQotfQ0KLUNCQ19QREY0MTdDb2Rld29yZERlY29kZXI6On5DQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyKCkNCi17DQotfQ0KLXZvaWQgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6SW5pdGlhbGl6ZSgpDQotew0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBTWU1CT0xfVEFCTEVfTGVuZ3RoOyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgY3VycmVudFN5bWJvbCA9IENCQ19QREY0MTdDb21tb246OlNZTUJPTF9UQUJMRVtpXTsNCi0gICAgICAgIGludDMyX3QgY3VycmVudEJpdCA9IGN1cnJlbnRTeW1ib2wgJiAweDE7DQotICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBDQkNfUERGNDE3Q29tbW9uOjpCQVJTX0lOX01PRFVMRTsgaisrKSB7DQotICAgICAgICAgICAgRlhfRkxPQVQgc2l6ZSA9IDAuMGY7DQotICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50U3ltYm9sICYgMHgxKSA9PSBjdXJyZW50Qml0KSB7DQotICAgICAgICAgICAgICAgIHNpemUgKz0gMS4wZjsNCi0gICAgICAgICAgICAgICAgY3VycmVudFN5bWJvbCA+Pj0gMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY3VycmVudEJpdCA9IGN1cnJlbnRTeW1ib2wgJiAweDE7DQotICAgICAgICAgICAgUkFUSU9TX1RBQkxFW2ldW0NCQ19QREY0MTdDb21tb246OkJBUlNfSU5fTU9EVUxFIC0gaiAtIDFdID0gc2l6ZSAvIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fQ09ERVdPUkQ7DQotICAgICAgICB9DQorQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6Q0JDX1BERjQxN0NvZGV3b3JkRGVjb2RlcigpIHt9DQorQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6fkNCQ19QREY0MTdDb2Rld29yZERlY29kZXIoKSB7fQ0KK3ZvaWQgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6SW5pdGlhbGl6ZSgpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IFNZTUJPTF9UQUJMRV9MZW5ndGg7IGkrKykgew0KKyAgICBpbnQzMl90IGN1cnJlbnRTeW1ib2wgPSBDQkNfUERGNDE3Q29tbW9uOjpTWU1CT0xfVEFCTEVbaV07DQorICAgIGludDMyX3QgY3VycmVudEJpdCA9IGN1cnJlbnRTeW1ib2wgJiAweDE7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IENCQ19QREY0MTdDb21tb246OkJBUlNfSU5fTU9EVUxFOyBqKyspIHsNCisgICAgICBGWF9GTE9BVCBzaXplID0gMC4wZjsNCisgICAgICB3aGlsZSAoKGN1cnJlbnRTeW1ib2wgJiAweDEpID09IGN1cnJlbnRCaXQpIHsNCisgICAgICAgIHNpemUgKz0gMS4wZjsNCisgICAgICAgIGN1cnJlbnRTeW1ib2wgPj49IDE7DQorICAgICAgfQ0KKyAgICAgIGN1cnJlbnRCaXQgPSBjdXJyZW50U3ltYm9sICYgMHgxOw0KKyAgICAgIFJBVElPU19UQUJMRVtpXVtDQkNfUERGNDE3Q29tbW9uOjpCQVJTX0lOX01PRFVMRSAtIGogLSAxXSA9DQorICAgICAgICAgIHNpemUgLyBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEOw0KICAgICB9DQorICB9DQogfQ0KLXZvaWQgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6RmluYWxpemUoKQ0KLXsNCit2b2lkIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OkZpbmFsaXplKCkge30NCitpbnQzMl90IENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OmdldERlY29kZWRWYWx1ZSgNCisgICAgQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KSB7DQorICBDRlhfSW50MzJBcnJheSogYXJyYXkgPSBzYW1wbGVCaXRDb3VudHMobW9kdWxlQml0Q291bnQpOw0KKyAgaW50MzJfdCBkZWNvZGVkVmFsdWUgPSBnZXREZWNvZGVkQ29kZXdvcmRWYWx1ZSgqYXJyYXkpOw0KKyAgZGVsZXRlIGFycmF5Ow0KKyAgaWYgKGRlY29kZWRWYWx1ZSAhPSAtMSkgew0KKyAgICByZXR1cm4gZGVjb2RlZFZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIGdldENsb3Nlc3REZWNvZGVkVmFsdWUobW9kdWxlQml0Q291bnQpOw0KIH0NCi1pbnQzMl90IENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OmdldERlY29kZWRWYWx1ZShDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpDQotew0KLSAgICBDRlhfSW50MzJBcnJheSogYXJyYXkgPSBzYW1wbGVCaXRDb3VudHMobW9kdWxlQml0Q291bnQpOw0KLSAgICBpbnQzMl90IGRlY29kZWRWYWx1ZSA9IGdldERlY29kZWRDb2Rld29yZFZhbHVlKCphcnJheSk7DQotICAgIGRlbGV0ZSBhcnJheTsNCi0gICAgaWYgKGRlY29kZWRWYWx1ZSAhPSAtMSkgew0KLSAgICAgICAgcmV0dXJuIGRlY29kZWRWYWx1ZTsNCitDRlhfSW50MzJBcnJheSogQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6c2FtcGxlQml0Q291bnRzKA0KKyAgICBDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpIHsNCisgIEZYX0ZMT0FUIGJpdENvdW50U3VtID0NCisgICAgICAoRlhfRkxPQVQpQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Qml0Q291bnRTdW0obW9kdWxlQml0Q291bnQpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGJpdENvdW50ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5KCk7DQorICBiaXRDb3VudC0+U2V0U2l6ZShDQkNfUERGNDE3Q29tbW9uOjpCQVJTX0lOX01PRFVMRSk7DQorICBpbnQzMl90IGJpdENvdW50SW5kZXggPSAwOw0KKyAgaW50MzJfdCBzdW1QcmV2aW91c0JpdHMgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRDsgaSsrKSB7DQorICAgIEZYX0ZMT0FUIHNhbXBsZUluZGV4ID0NCisgICAgICAgIGJpdENvdW50U3VtIC8gKDIgKiBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEKSArDQorICAgICAgICAoaSAqIGJpdENvdW50U3VtKSAvIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fQ09ERVdPUkQ7DQorICAgIGlmIChzdW1QcmV2aW91c0JpdHMgKyBtb2R1bGVCaXRDb3VudC5HZXRBdChiaXRDb3VudEluZGV4KSA8PSBzYW1wbGVJbmRleCkgew0KKyAgICAgIHN1bVByZXZpb3VzQml0cyArPSBtb2R1bGVCaXRDb3VudC5HZXRBdChiaXRDb3VudEluZGV4KTsNCisgICAgICBiaXRDb3VudEluZGV4Kys7DQogICAgIH0NCi0gICAgcmV0dXJuIGdldENsb3Nlc3REZWNvZGVkVmFsdWUobW9kdWxlQml0Q291bnQpOw0KKyAgICBiaXRDb3VudC0+U2V0QXQoYml0Q291bnRJbmRleCwgYml0Q291bnQtPkdldEF0KGJpdENvdW50SW5kZXgpICsgMSk7DQorICB9DQorICByZXR1cm4gYml0Q291bnQ7DQogfQ0KLUNGWF9JbnQzMkFycmF5KiBDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyOjpzYW1wbGVCaXRDb3VudHMoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KQ0KLXsNCi0gICAgRlhfRkxPQVQgYml0Q291bnRTdW0gPSAoRlhfRkxPQVQpQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Qml0Q291bnRTdW0obW9kdWxlQml0Q291bnQpOw0KLSAgICBDRlhfSW50MzJBcnJheSogYml0Q291bnQgPSBGWF9ORVcgQ0ZYX0ludDMyQXJyYXkoKTsNCi0gICAgYml0Q291bnQtPlNldFNpemUoQ0JDX1BERjQxN0NvbW1vbjo6QkFSU19JTl9NT0RVTEUpOw0KLSAgICBpbnQzMl90IGJpdENvdW50SW5kZXggPSAwOw0KLSAgICBpbnQzMl90IHN1bVByZXZpb3VzQml0cyA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fQ09ERVdPUkQ7IGkrKykgew0KLSAgICAgICAgRlhfRkxPQVQgc2FtcGxlSW5kZXggPSBiaXRDb3VudFN1bSAvICgyICogQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRCkgKyAoaSAqIGJpdENvdW50U3VtKSAvIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fQ09ERVdPUkQ7DQotICAgICAgICBpZiAoc3VtUHJldmlvdXNCaXRzICsgbW9kdWxlQml0Q291bnQuR2V0QXQoYml0Q291bnRJbmRleCkgPD0gc2FtcGxlSW5kZXgpIHsNCi0gICAgICAgICAgICBzdW1QcmV2aW91c0JpdHMgKz0gbW9kdWxlQml0Q291bnQuR2V0QXQoYml0Q291bnRJbmRleCk7DQotICAgICAgICAgICAgYml0Q291bnRJbmRleCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYml0Q291bnQtPlNldEF0KGJpdENvdW50SW5kZXgsIGJpdENvdW50LT5HZXRBdChiaXRDb3VudEluZGV4KSArIDEpOw0KLSAgICB9DQotICAgIHJldHVybiBiaXRDb3VudDsNCitpbnQzMl90IENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OmdldERlY29kZWRDb2Rld29yZFZhbHVlKA0KKyAgICBDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpIHsNCisgIGludDMyX3QgZGVjb2RlZFZhbHVlID0gZ2V0Qml0VmFsdWUobW9kdWxlQml0Q291bnQpOw0KKyAgcmV0dXJuIENCQ19QREY0MTdDb21tb246OmdldENvZGV3b3JkKGRlY29kZWRWYWx1ZSkgPT0gLTEgPyAtMSA6IGRlY29kZWRWYWx1ZTsNCiB9DQotaW50MzJfdCBDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyOjpnZXREZWNvZGVkQ29kZXdvcmRWYWx1ZShDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpDQotew0KLSAgICBpbnQzMl90IGRlY29kZWRWYWx1ZSA9IGdldEJpdFZhbHVlKG1vZHVsZUJpdENvdW50KTsNCi0gICAgcmV0dXJuIENCQ19QREY0MTdDb21tb246OmdldENvZGV3b3JkKGRlY29kZWRWYWx1ZSkgPT0gLTEgPyAtMSA6IGRlY29kZWRWYWx1ZTsNCitpbnQzMl90IENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OmdldEJpdFZhbHVlKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCkgew0KKyAgaW50NjRfdCByZXN1bHQgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbW9kdWxlQml0Q291bnQuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgZm9yIChpbnQzMl90IGJpdCA9IDA7IGJpdCA8IG1vZHVsZUJpdENvdW50LkdldEF0KGkpOyBiaXQrKykgew0KKyAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgMSkgfCAoaSAlIDIgPT0gMCA/IDEgOiAwKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIChpbnQzMl90KXJlc3VsdDsNCiB9DQotaW50MzJfdCBDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyOjpnZXRCaXRWYWx1ZShDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpDQotew0KLSAgICBpbnQ2NF90IHJlc3VsdCA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1vZHVsZUJpdENvdW50LkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICBmb3IgKGludDMyX3QgYml0ID0gMDsgYml0IDwgbW9kdWxlQml0Q291bnQuR2V0QXQoaSk7IGJpdCsrKSB7DQotICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCAxKSB8IChpICUgMiA9PSAwID8gMSA6IDApOw0KLSAgICAgICAgfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6Z2V0Q2xvc2VzdERlY29kZWRWYWx1ZSgNCisgICAgQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KSB7DQorICBpbnQzMl90IGJpdENvdW50U3VtID0gQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Qml0Q291bnRTdW0obW9kdWxlQml0Q291bnQpOw0KKyAgQ0ZYX0Zsb2F0QXJyYXkgYml0Q291bnRSYXRpb3M7DQorICBiaXRDb3VudFJhdGlvcy5TZXRTaXplKENCQ19QREY0MTdDb21tb246OkJBUlNfSU5fTU9EVUxFKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJpdENvdW50UmF0aW9zLkdldFNpemUoKTsgaSsrKSB7DQorICAgIGJpdENvdW50UmF0aW9zW2ldID0gbW9kdWxlQml0Q291bnQuR2V0QXQoaSkgLyAoRlhfRkxPQVQpYml0Q291bnRTdW07DQorICB9DQorICBGWF9GTE9BVCBiZXN0TWF0Y2hFcnJvciA9IChGWF9GTE9BVClGbG9hdF9NQVhfVkFMVUU7DQorICBpbnQzMl90IGJlc3RNYXRjaCA9IC0xOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgU1lNQk9MX1RBQkxFX0xlbmd0aDsgaisrKSB7DQorICAgIEZYX0ZMT0FUIGVycm9yID0gMC4wZjsNCisgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgQ0JDX1BERjQxN0NvbW1vbjo6QkFSU19JTl9NT0RVTEU7IGsrKykgew0KKyAgICAgIEZYX0ZMT0FUIGRpZmYgPSBSQVRJT1NfVEFCTEVbal1ba10gLSBiaXRDb3VudFJhdGlvc1trXTsNCisgICAgICBlcnJvciArPSBkaWZmICogZGlmZjsNCiAgICAgfQ0KLSAgICByZXR1cm4gKGludDMyX3QpIHJlc3VsdDsNCi19DQotaW50MzJfdCBDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyOjpnZXRDbG9zZXN0RGVjb2RlZFZhbHVlKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCkNCi17DQotICAgIGludDMyX3QgYml0Q291bnRTdW0gPSBDQkNfUERGNDE3Q29tbW9uOjpnZXRCaXRDb3VudFN1bShtb2R1bGVCaXRDb3VudCk7DQotICAgIENGWF9GbG9hdEFycmF5IGJpdENvdW50UmF0aW9zOw0KLSAgICBiaXRDb3VudFJhdGlvcy5TZXRTaXplKENCQ19QREY0MTdDb21tb246OkJBUlNfSU5fTU9EVUxFKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYml0Q291bnRSYXRpb3MuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIGJpdENvdW50UmF0aW9zW2ldID0gbW9kdWxlQml0Q291bnQuR2V0QXQoaSkgLyAoRlhfRkxPQVQpIGJpdENvdW50U3VtOw0KKyAgICBpZiAoZXJyb3IgPCBiZXN0TWF0Y2hFcnJvcikgew0KKyAgICAgIGJlc3RNYXRjaEVycm9yID0gZXJyb3I7DQorICAgICAgYmVzdE1hdGNoID0gQ0JDX1BERjQxN0NvbW1vbjo6U1lNQk9MX1RBQkxFW2pdOw0KICAgICB9DQotICAgIEZYX0ZMT0FUIGJlc3RNYXRjaEVycm9yID0gKEZYX0ZMT0FUKUZsb2F0X01BWF9WQUxVRTsNCi0gICAgaW50MzJfdCBiZXN0TWF0Y2ggPSAtMTsNCi0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgU1lNQk9MX1RBQkxFX0xlbmd0aDsgaisrKSB7DQotICAgICAgICBGWF9GTE9BVCBlcnJvciA9IDAuMGY7DQotICAgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBDQkNfUERGNDE3Q29tbW9uOjpCQVJTX0lOX01PRFVMRTsgaysrKSB7DQotICAgICAgICAgICAgRlhfRkxPQVQgZGlmZiA9IFJBVElPU19UQUJMRVtqXVtrXSAtIGJpdENvdW50UmF0aW9zW2tdOw0KLSAgICAgICAgICAgIGVycm9yICs9IGRpZmYgKiBkaWZmOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGVycm9yIDwgYmVzdE1hdGNoRXJyb3IpIHsNCi0gICAgICAgICAgICBiZXN0TWF0Y2hFcnJvciA9IGVycm9yOw0KLSAgICAgICAgICAgIGJlc3RNYXRjaCA9IENCQ19QREY0MTdDb21tb246OlNZTUJPTF9UQUJMRVtqXTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gYmVzdE1hdGNoOw0KKyAgfQ0KKyAgcmV0dXJuIGJlc3RNYXRjaDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5oCmluZGV4IDQyNGQzMWIuLjVmMzFmOTEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyLmgKQEAgLTcsMjEgKzcsMjEgQEAKICNpZm5kZWYgX0JDX1BERjQxN0NPREVXT1JEREVDT0RFUl9IXw0KICNkZWZpbmUgX0JDX1BERjQxN0NPREVXT1JEREVDT0RFUl9IXw0KIGNsYXNzIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI7DQotI2RlZmluZSAgICBjb2x1bW4gICAgIDgNCisjZGVmaW5lIGNvbHVtbiA4DQogY2xhc3MgQ0JDX1BERjQxN0NvbW1vbjsNCi1jbGFzcyBDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2RlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyKCk7DQotICAgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCi0gICAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCi0gICAgc3RhdGljIGludDMyX3QgZ2V0RGVjb2RlZFZhbHVlKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCk7DQotcHJpdmF0ZToNCi0gICAgc3RhdGljIEZYX0ZMT0FUIFJBVElPU19UQUJMRVtdWzhdOw0KLSAgICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIHNhbXBsZUJpdENvdW50cyhDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBnZXREZWNvZGVkQ29kZXdvcmRWYWx1ZShDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBnZXRCaXRWYWx1ZShDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBnZXRDbG9zZXN0RGVjb2RlZFZhbHVlKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCk7DQorY2xhc3MgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2RlciB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdDb2Rld29yZERlY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdDb2Rld29yZERlY29kZXIoKTsNCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBzdGF0aWMgaW50MzJfdCBnZXREZWNvZGVkVmFsdWUoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBGWF9GTE9BVCBSQVRJT1NfVEFCTEVbXVs4XTsNCisgIHN0YXRpYyBDRlhfSW50MzJBcnJheSogc2FtcGxlQml0Q291bnRzKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCk7DQorICBzdGF0aWMgaW50MzJfdCBnZXREZWNvZGVkQ29kZXdvcmRWYWx1ZShDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpOw0KKyAgc3RhdGljIGludDMyX3QgZ2V0Qml0VmFsdWUoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCisgIHN0YXRpYyBpbnQzMl90IGdldENsb3Nlc3REZWNvZGVkVmFsdWUoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21tb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbW1vbi5jcHAKaW5kZXggNzU4ZmVkNi4uMWEzYzNlYiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbW1vbi5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbW1vbi5jcHAKQEAgLTMyLDQxOSArMzIsNjE5IEBACiBpbnQzMl90IENCQ19QREY0MTdDb21tb246OkJBUlNfSU5fTU9EVUxFID0gODsNCiBDRlhfSW50MzJBcnJheSogQ0JDX1BERjQxN0NvbW1vbjo6RU1QVFlfSU5UX0FSUkFZID0gTlVMTDsNCiBpbnQzMl90IENCQ19QREY0MTdDb21tb246OlNZTUJPTF9UQUJMRVtdID0gew0KLSAgICAweDEwMjVlLCAweDEwMjdhLCAweDEwMjllLCAweDEwMmJjLCAweDEwMmYyLCAweDEwMmY0LCAweDEwMzJlLCAweDEwMzRlLCAweDEwMzVjLCAweDEwMzk2LCAweDEwM2E2LCAweDEwM2FjLA0KLSAgICAweDEwNDIyLCAweDEwNDI4LCAweDEwNDM2LCAweDEwNDQyLCAweDEwNDQ0LCAweDEwNDQ4LCAweDEwNDUwLCAweDEwNDVlLCAweDEwNDY2LCAweDEwNDZjLCAweDEwNDdhLCAweDEwNDgyLA0KLSAgICAweDEwNDllLCAweDEwNGEwLCAweDEwNGJjLCAweDEwNGM2LCAweDEwNGQ4LCAweDEwNGVlLCAweDEwNGYyLCAweDEwNGY0LCAweDEwNTA0LCAweDEwNTA4LCAweDEwNTEwLCAweDEwNTFlLA0KLSAgICAweDEwNTIwLCAweDEwNTNjLCAweDEwNTQwLCAweDEwNTc4LCAweDEwNTg2LCAweDEwNThjLCAweDEwNTk4LCAweDEwNWIwLCAweDEwNWJlLCAweDEwNWNlLCAweDEwNWRjLCAweDEwNWUyLA0KLSAgICAweDEwNWU0LCAweDEwNWU4LCAweDEwNWY2LCAweDEwNjJlLCAweDEwNjRlLCAweDEwNjVjLCAweDEwNjhlLCAweDEwNjljLCAweDEwNmI4LCAweDEwNmRlLCAweDEwNmZhLCAweDEwNzE2LA0KLSAgICAweDEwNzI2LCAweDEwNzJjLCAweDEwNzQ2LCAweDEwNzRjLCAweDEwNzU4LCAweDEwNzZlLCAweDEwNzkyLCAweDEwNzk0LCAweDEwN2EyLCAweDEwN2E0LCAweDEwN2E4LCAweDEwN2I2LA0KLSAgICAweDEwODIyLCAweDEwODI4LCAweDEwODQyLCAweDEwODQ4LCAweDEwODUwLCAweDEwODVlLCAweDEwODY2LCAweDEwODZjLCAweDEwODdhLCAweDEwODgyLCAweDEwODg0LCAweDEwODkwLA0KLSAgICAweDEwODllLCAweDEwOGEwLCAweDEwOGJjLCAweDEwOGM2LCAweDEwOGNjLCAweDEwOGQ4LCAweDEwOGVlLCAweDEwOGYyLCAweDEwOGY0LCAweDEwOTAyLCAweDEwOTA4LCAweDEwOTFlLA0KLSAgICAweDEwOTIwLCAweDEwOTNjLCAweDEwOTQwLCAweDEwOTc4LCAweDEwOTg2LCAweDEwOTk4LCAweDEwOWIwLCAweDEwOWJlLCAweDEwOWNlLCAweDEwOWRjLCAweDEwOWUyLCAweDEwOWU0LA0KLSAgICAweDEwOWU4LCAweDEwOWY2LCAweDEwYTA4LCAweDEwYTEwLCAweDEwYTFlLCAweDEwYTIwLCAweDEwYTNjLCAweDEwYTQwLCAweDEwYTc4LCAweDEwYWYwLCAweDEwYjA2LCAweDEwYjBjLA0KLSAgICAweDEwYjE4LCAweDEwYjMwLCAweDEwYjNlLCAweDEwYjYwLCAweDEwYjdjLCAweDEwYjhlLCAweDEwYjljLCAweDEwYmI4LCAweDEwYmMyLCAweDEwYmM0LCAweDEwYmM4LCAweDEwYmQwLA0KLSAgICAweDEwYmRlLCAweDEwYmU2LCAweDEwYmVjLCAweDEwYzJlLCAweDEwYzRlLCAweDEwYzVjLCAweDEwYzYyLCAweDEwYzY0LCAweDEwYzY4LCAweDEwYzc2LCAweDEwYzhlLCAweDEwYzljLA0KLSAgICAweDEwY2I4LCAweDEwY2MyLCAweDEwY2M0LCAweDEwY2M4LCAweDEwY2QwLCAweDEwY2RlLCAweDEwY2U2LCAweDEwY2VjLCAweDEwY2ZhLCAweDEwZDBlLCAweDEwZDFjLCAweDEwZDM4LA0KLSAgICAweDEwZDcwLCAweDEwZDdlLCAweDEwZDgyLCAweDEwZDg0LCAweDEwZDg4LCAweDEwZDkwLCAweDEwZDllLCAweDEwZGEwLCAweDEwZGJjLCAweDEwZGM2LCAweDEwZGNjLCAweDEwZGQ4LA0KLSAgICAweDEwZGVlLCAweDEwZGYyLCAweDEwZGY0LCAweDEwZTE2LCAweDEwZTI2LCAweDEwZTJjLCAweDEwZTQ2LCAweDEwZTU4LCAweDEwZTZlLCAweDEwZTg2LCAweDEwZThjLCAweDEwZTk4LA0KLSAgICAweDEwZWIwLCAweDEwZWJlLCAweDEwZWNlLCAweDEwZWRjLCAweDEwZjBhLCAweDEwZjEyLCAweDEwZjE0LCAweDEwZjIyLCAweDEwZjI4LCAweDEwZjM2LCAweDEwZjQyLCAweDEwZjQ0LA0KLSAgICAweDEwZjQ4LCAweDEwZjUwLCAweDEwZjVlLCAweDEwZjY2LCAweDEwZjZjLCAweDEwZmIyLCAweDEwZmI0LCAweDExMDIyLCAweDExMDI4LCAweDExMDQyLCAweDExMDQ4LCAweDExMDUwLA0KLSAgICAweDExMDVlLCAweDExMDdhLCAweDExMDgyLCAweDExMDg0LCAweDExMDkwLCAweDExMDllLCAweDExMGEwLCAweDExMGJjLCAweDExMGM2LCAweDExMGNjLCAweDExMGQ4LCAweDExMGVlLA0KLSAgICAweDExMGYyLCAweDExMGY0LCAweDExMTAyLCAweDExMTFlLCAweDExMTIwLCAweDExMTNjLCAweDExMTQwLCAweDExMTc4LCAweDExMTg2LCAweDExMTk4LCAweDExMWIwLCAweDExMWJlLA0KLSAgICAweDExMWNlLCAweDExMWRjLCAweDExMWUyLCAweDExMWU0LCAweDExMWU4LCAweDExMWY2LCAweDExMjA4LCAweDExMjFlLCAweDExMjIwLCAweDExMjc4LCAweDExMmYwLCAweDExMzBjLA0KLSAgICAweDExMzMwLCAweDExMzNlLCAweDExMzYwLCAweDExMzdjLCAweDExMzhlLCAweDExMzljLCAweDExM2I4LCAweDExM2MyLCAweDExM2M4LCAweDExM2QwLCAweDExM2RlLCAweDExM2U2LA0KLSAgICAweDExM2VjLCAweDExNDA4LCAweDExNDEwLCAweDExNDFlLCAweDExNDIwLCAweDExNDNjLCAweDExNDQwLCAweDExNDc4LCAweDExNGYwLCAweDExNWUwLCAweDExNjBjLCAweDExNjE4LA0KLSAgICAweDExNjMwLCAweDExNjNlLCAweDExNjYwLCAweDExNjdjLCAweDExNmMwLCAweDExNmY4LCAweDExNzFjLCAweDExNzM4LCAweDExNzcwLCAweDExNzdlLCAweDExNzgyLCAweDExNzg0LA0KLSAgICAweDExNzg4LCAweDExNzkwLCAweDExNzllLCAweDExN2EwLCAweDExN2JjLCAweDExN2M2LCAweDExN2NjLCAweDExN2Q4LCAweDExN2VlLCAweDExODJlLCAweDExODM0LCAweDExODRlLA0KLSAgICAweDExODVjLCAweDExODYyLCAweDExODY0LCAweDExODY4LCAweDExODc2LCAweDExODhlLCAweDExODljLCAweDExOGI4LCAweDExOGMyLCAweDExOGM4LCAweDExOGQwLCAweDExOGRlLA0KLSAgICAweDExOGU2LCAweDExOGVjLCAweDExOGZhLCAweDExOTBlLCAweDExOTFjLCAweDExOTM4LCAweDExOTcwLCAweDExOTdlLCAweDExOTgyLCAweDExOTg0LCAweDExOTkwLCAweDExOTllLA0KLSAgICAweDExOWEwLCAweDExOWJjLCAweDExOWM2LCAweDExOWNjLCAweDExOWQ4LCAweDExOWVlLCAweDExOWYyLCAweDExOWY0LCAweDExYTBlLCAweDExYTFjLCAweDExYTM4LCAweDExYTcwLA0KLSAgICAweDExYTdlLCAweDExYWUwLCAweDExYWZjLCAweDExYjA4LCAweDExYjEwLCAweDExYjFlLCAweDExYjIwLCAweDExYjNjLCAweDExYjQwLCAweDExYjc4LCAweDExYjhjLCAweDExYjk4LA0KLSAgICAweDExYmIwLCAweDExYmJlLCAweDExYmNlLCAweDExYmRjLCAweDExYmUyLCAweDExYmU0LCAweDExYmU4LCAweDExYmY2LCAweDExYzE2LCAweDExYzI2LCAweDExYzJjLCAweDExYzQ2LA0KLSAgICAweDExYzRjLCAweDExYzU4LCAweDExYzZlLCAweDExYzg2LCAweDExYzk4LCAweDExY2IwLCAweDExY2JlLCAweDExY2NlLCAweDExY2RjLCAweDExY2UyLCAweDExY2U0LCAweDExY2U4LA0KLSAgICAweDExY2Y2LCAweDExZDA2LCAweDExZDBjLCAweDExZDE4LCAweDExZDMwLCAweDExZDNlLCAweDExZDYwLCAweDExZDdjLCAweDExZDhlLCAweDExZDljLCAweDExZGI4LCAweDExZGM0LA0KLSAgICAweDExZGM4LCAweDExZGQwLCAweDExZGRlLCAweDExZGU2LCAweDExZGVjLCAweDExZGZhLCAweDExZTBhLCAweDExZTEyLCAweDExZTE0LCAweDExZTIyLCAweDExZTI0LCAweDExZTI4LA0KLSAgICAweDExZTM2LCAweDExZTQyLCAweDExZTQ0LCAweDExZTUwLCAweDExZTVlLCAweDExZTY2LCAweDExZTZjLCAweDExZTgyLCAweDExZTg0LCAweDExZTg4LCAweDExZTkwLCAweDExZTllLA0KLSAgICAweDExZWEwLCAweDExZWJjLCAweDExZWM2LCAweDExZWNjLCAweDExZWQ4LCAweDExZWVlLCAweDExZjFhLCAweDExZjJlLCAweDExZjMyLCAweDExZjM0LCAweDExZjRlLCAweDExZjVjLA0KLSAgICAweDExZjYyLCAweDExZjY0LCAweDExZjY4LCAweDExZjc2LCAweDEyMDQ4LCAweDEyMDVlLCAweDEyMDgyLCAweDEyMDg0LCAweDEyMDkwLCAweDEyMDllLCAweDEyMGEwLCAweDEyMGJjLA0KLSAgICAweDEyMGQ4LCAweDEyMGYyLCAweDEyMGY0LCAweDEyMTA4LCAweDEyMTFlLCAweDEyMTIwLCAweDEyMTNjLCAweDEyMTQwLCAweDEyMTc4LCAweDEyMTg2LCAweDEyMTk4LCAweDEyMWIwLA0KLSAgICAweDEyMWJlLCAweDEyMWUyLCAweDEyMWU0LCAweDEyMWU4LCAweDEyMWY2LCAweDEyMjA0LCAweDEyMjEwLCAweDEyMjFlLCAweDEyMjIwLCAweDEyMjc4LCAweDEyMmYwLCAweDEyMzA2LA0KLSAgICAweDEyMzBjLCAweDEyMzMwLCAweDEyMzNlLCAweDEyMzYwLCAweDEyMzdjLCAweDEyMzhlLCAweDEyMzljLCAweDEyM2I4LCAweDEyM2MyLCAweDEyM2M4LCAweDEyM2QwLCAweDEyM2U2LA0KLSAgICAweDEyM2VjLCAweDEyNDFlLCAweDEyNDIwLCAweDEyNDNjLCAweDEyNGYwLCAweDEyNWUwLCAweDEyNjE4LCAweDEyNjNlLCAweDEyNjYwLCAweDEyNjdjLCAweDEyNmMwLCAweDEyNmY4LA0KLSAgICAweDEyNzM4LCAweDEyNzcwLCAweDEyNzdlLCAweDEyNzgyLCAweDEyNzg0LCAweDEyNzkwLCAweDEyNzllLCAweDEyN2EwLCAweDEyN2JjLCAweDEyN2M2LCAweDEyN2NjLCAweDEyN2Q4LA0KLSAgICAweDEyN2VlLCAweDEyODIwLCAweDEyODNjLCAweDEyODQwLCAweDEyODc4LCAweDEyOGYwLCAweDEyOWUwLCAweDEyYmMwLCAweDEyYzE4LCAweDEyYzMwLCAweDEyYzNlLCAweDEyYzYwLA0KLSAgICAweDEyYzdjLCAweDEyY2MwLCAweDEyY2Y4LCAweDEyZGYwLCAweDEyZTFjLCAweDEyZTM4LCAweDEyZTcwLCAweDEyZTdlLCAweDEyZWUwLCAweDEyZWZjLCAweDEyZjA0LCAweDEyZjA4LA0KLSAgICAweDEyZjEwLCAweDEyZjIwLCAweDEyZjNjLCAweDEyZjQwLCAweDEyZjc4LCAweDEyZjg2LCAweDEyZjhjLCAweDEyZjk4LCAweDEyZmIwLCAweDEyZmJlLCAweDEyZmNlLCAweDEyZmRjLA0KLSAgICAweDEzMDJlLCAweDEzMDRlLCAweDEzMDVjLCAweDEzMDYyLCAweDEzMDY4LCAweDEzMDhlLCAweDEzMDljLCAweDEzMGI4LCAweDEzMGMyLCAweDEzMGM4LCAweDEzMGQwLCAweDEzMGRlLA0KLSAgICAweDEzMGVjLCAweDEzMGZhLCAweDEzMTBlLCAweDEzMTM4LCAweDEzMTcwLCAweDEzMTdlLCAweDEzMTgyLCAweDEzMTg0LCAweDEzMTkwLCAweDEzMTllLCAweDEzMWEwLCAweDEzMWJjLA0KLSAgICAweDEzMWM2LCAweDEzMWNjLCAweDEzMWQ4LCAweDEzMWYyLCAweDEzMWY0LCAweDEzMjBlLCAweDEzMjFjLCAweDEzMjcwLCAweDEzMjdlLCAweDEzMmUwLCAweDEzMmZjLCAweDEzMzA4LA0KLSAgICAweDEzMzFlLCAweDEzMzIwLCAweDEzMzNjLCAweDEzMzQwLCAweDEzMzc4LCAweDEzMzg2LCAweDEzMzk4LCAweDEzM2IwLCAweDEzM2JlLCAweDEzM2NlLCAweDEzM2RjLCAweDEzM2UyLA0KLSAgICAweDEzM2U0LCAweDEzM2U4LCAweDEzM2Y2LCAweDEzNDBlLCAweDEzNDFjLCAweDEzNDM4LCAweDEzNDcwLCAweDEzNDdlLCAweDEzNGUwLCAweDEzNGZjLCAweDEzNWMwLCAweDEzNWY4LA0KLSAgICAweDEzNjA4LCAweDEzNjEwLCAweDEzNjFlLCAweDEzNjIwLCAweDEzNjNjLCAweDEzNjQwLCAweDEzNjc4LCAweDEzNmYwLCAweDEzNzBjLCAweDEzNzE4LCAweDEzNzMwLCAweDEzNzNlLA0KLSAgICAweDEzNzYwLCAweDEzNzdjLCAweDEzNzljLCAweDEzN2I4LCAweDEzN2MyLCAweDEzN2M0LCAweDEzN2M4LCAweDEzN2QwLCAweDEzN2RlLCAweDEzN2U2LCAweDEzN2VjLCAweDEzODE2LA0KLSAgICAweDEzODI2LCAweDEzODJjLCAweDEzODQ2LCAweDEzODRjLCAweDEzODU4LCAweDEzODZlLCAweDEzODc0LCAweDEzODg2LCAweDEzODk4LCAweDEzOGIwLCAweDEzOGJlLCAweDEzOGNlLA0KLSAgICAweDEzOGRjLCAweDEzOGUyLCAweDEzOGU0LCAweDEzOGU4LCAweDEzOTA2LCAweDEzOTBjLCAweDEzOTMwLCAweDEzOTNlLCAweDEzOTYwLCAweDEzOTdjLCAweDEzOThlLCAweDEzOTljLA0KLSAgICAweDEzOWI4LCAweDEzOWM4LCAweDEzOWQwLCAweDEzOWRlLCAweDEzOWU2LCAweDEzOWVjLCAweDEzOWZhLCAweDEzYTA2LCAweDEzYTBjLCAweDEzYTE4LCAweDEzYTMwLCAweDEzYTNlLA0KLSAgICAweDEzYTYwLCAweDEzYTdjLCAweDEzYWMwLCAweDEzYWY4LCAweDEzYjBlLCAweDEzYjFjLCAweDEzYjM4LCAweDEzYjcwLCAweDEzYjdlLCAweDEzYjg4LCAweDEzYjkwLCAweDEzYjllLA0KLSAgICAweDEzYmEwLCAweDEzYmJjLCAweDEzYmNjLCAweDEzYmQ4LCAweDEzYmVlLCAweDEzYmYyLCAweDEzYmY0LCAweDEzYzEyLCAweDEzYzE0LCAweDEzYzIyLCAweDEzYzI0LCAweDEzYzI4LA0KLSAgICAweDEzYzM2LCAweDEzYzQyLCAweDEzYzQ4LCAweDEzYzUwLCAweDEzYzVlLCAweDEzYzY2LCAweDEzYzZjLCAweDEzYzgyLCAweDEzYzg0LCAweDEzYzkwLCAweDEzYzllLCAweDEzY2EwLA0KLSAgICAweDEzY2JjLCAweDEzY2M2LCAweDEzY2NjLCAweDEzY2Q4LCAweDEzY2VlLCAweDEzZDAyLCAweDEzZDA0LCAweDEzZDA4LCAweDEzZDEwLCAweDEzZDFlLCAweDEzZDIwLCAweDEzZDNjLA0KLSAgICAweDEzZDQwLCAweDEzZDc4LCAweDEzZDg2LCAweDEzZDhjLCAweDEzZDk4LCAweDEzZGIwLCAweDEzZGJlLCAweDEzZGNlLCAweDEzZGRjLCAweDEzZGU0LCAweDEzZGU4LCAweDEzZGY2LA0KLSAgICAweDEzZTFhLCAweDEzZTJlLCAweDEzZTMyLCAweDEzZTM0LCAweDEzZTRlLCAweDEzZTVjLCAweDEzZTYyLCAweDEzZTY0LCAweDEzZTY4LCAweDEzZTc2LCAweDEzZThlLCAweDEzZTljLA0KLSAgICAweDEzZWI4LCAweDEzZWMyLCAweDEzZWM0LCAweDEzZWM4LCAweDEzZWQwLCAweDEzZWRlLCAweDEzZWU2LCAweDEzZWVjLCAweDEzZjI2LCAweDEzZjJjLCAweDEzZjNhLCAweDEzZjQ2LA0KLSAgICAweDEzZjRjLCAweDEzZjU4LCAweDEzZjZlLCAweDEzZjcyLCAweDEzZjc0LCAweDE0MDgyLCAweDE0MDllLCAweDE0MGEwLCAweDE0MGJjLCAweDE0MTA0LCAweDE0MTA4LCAweDE0MTEwLA0KLSAgICAweDE0MTFlLCAweDE0MTIwLCAweDE0MTNjLCAweDE0MTQwLCAweDE0MTc4LCAweDE0MThjLCAweDE0MTk4LCAweDE0MWIwLCAweDE0MWJlLCAweDE0MWUyLCAweDE0MWU0LCAweDE0MWU4LA0KLSAgICAweDE0MjA4LCAweDE0MjEwLCAweDE0MjFlLCAweDE0MjIwLCAweDE0MjNjLCAweDE0MjQwLCAweDE0Mjc4LCAweDE0MmYwLCAweDE0MzA2LCAweDE0MzBjLCAweDE0MzE4LCAweDE0MzMwLA0KLSAgICAweDE0MzNlLCAweDE0MzYwLCAweDE0MzdjLCAweDE0MzhlLCAweDE0M2MyLCAweDE0M2M0LCAweDE0M2M4LCAweDE0M2QwLCAweDE0M2U2LCAweDE0M2VjLCAweDE0NDA4LCAweDE0NDEwLA0KLSAgICAweDE0NDFlLCAweDE0NDIwLCAweDE0NDNjLCAweDE0NDQwLCAweDE0NDc4LCAweDE0NGYwLCAweDE0NWUwLCAweDE0NjBjLCAweDE0NjE4LCAweDE0NjMwLCAweDE0NjNlLCAweDE0NjYwLA0KLSAgICAweDE0NjdjLCAweDE0NmMwLCAweDE0NmY4LCAweDE0NzFjLCAweDE0NzM4LCAweDE0NzcwLCAweDE0NzdlLCAweDE0NzgyLCAweDE0Nzg0LCAweDE0Nzg4LCAweDE0NzkwLCAweDE0N2EwLA0KLSAgICAweDE0N2JjLCAweDE0N2M2LCAweDE0N2NjLCAweDE0N2Q4LCAweDE0N2VlLCAweDE0ODEwLCAweDE0ODIwLCAweDE0ODNjLCAweDE0ODQwLCAweDE0ODc4LCAweDE0OGYwLCAweDE0OWUwLA0KLSAgICAweDE0YmMwLCAweDE0YzMwLCAweDE0YzNlLCAweDE0YzYwLCAweDE0YzdjLCAweDE0Y2MwLCAweDE0Y2Y4LCAweDE0ZGYwLCAweDE0ZTM4LCAweDE0ZTcwLCAweDE0ZTdlLCAweDE0ZWUwLA0KLSAgICAweDE0ZWZjLCAweDE0ZjA0LCAweDE0ZjA4LCAweDE0ZjEwLCAweDE0ZjFlLCAweDE0ZjIwLCAweDE0ZjNjLCAweDE0ZjQwLCAweDE0Zjc4LCAweDE0Zjg2LCAweDE0ZjhjLCAweDE0Zjk4LA0KLSAgICAweDE0ZmIwLCAweDE0ZmNlLCAweDE0ZmRjLCAweDE1MDIwLCAweDE1MDQwLCAweDE1MDc4LCAweDE1MGYwLCAweDE1MWUwLCAweDE1M2MwLCAweDE1ODYwLCAweDE1ODdjLCAweDE1OGMwLA0KLSAgICAweDE1OGY4LCAweDE1OWYwLCAweDE1YmUwLCAweDE1YzcwLCAweDE1YzdlLCAweDE1Y2UwLCAweDE1Y2ZjLCAweDE1ZGMwLCAweDE1ZGY4LCAweDE1ZTA4LCAweDE1ZTEwLCAweDE1ZTIwLA0KLSAgICAweDE1ZTQwLCAweDE1ZTc4LCAweDE1ZWYwLCAweDE1ZjBjLCAweDE1ZjE4LCAweDE1ZjMwLCAweDE1ZjYwLCAweDE1ZjdjLCAweDE1ZjhlLCAweDE1ZjljLCAweDE1ZmI4LCAweDE2MDRlLA0KLSAgICAweDE2MDVjLCAweDE2MDhlLCAweDE2MDljLCAweDE2MGI4LCAweDE2MGMyLCAweDE2MGM0LCAweDE2MGM4LCAweDE2MGRlLCAweDE2MTBlLCAweDE2MTFjLCAweDE2MTM4LCAweDE2MTcwLA0KLSAgICAweDE2MTdlLCAweDE2MTg0LCAweDE2MTg4LCAweDE2MTkwLCAweDE2MTllLCAweDE2MWEwLCAweDE2MWJjLCAweDE2MWM2LCAweDE2MWNjLCAweDE2MWQ4LCAweDE2MWYyLCAweDE2MWY0LA0KLSAgICAweDE2MjBlLCAweDE2MjFjLCAweDE2MjM4LCAweDE2MjcwLCAweDE2MjdlLCAweDE2MmUwLCAweDE2MmZjLCAweDE2MzA0LCAweDE2MzA4LCAweDE2MzEwLCAweDE2MzFlLCAweDE2MzIwLA0KLSAgICAweDE2MzNjLCAweDE2MzQwLCAweDE2Mzc4LCAweDE2Mzg2LCAweDE2MzhjLCAweDE2Mzk4LCAweDE2M2IwLCAweDE2M2JlLCAweDE2M2NlLCAweDE2M2RjLCAweDE2M2UyLCAweDE2M2U0LA0KLSAgICAweDE2M2U4LCAweDE2M2Y2LCAweDE2NDBlLCAweDE2NDFjLCAweDE2NDM4LCAweDE2NDcwLCAweDE2NDdlLCAweDE2NGUwLCAweDE2NGZjLCAweDE2NWMwLCAweDE2NWY4LCAweDE2NjEwLA0KLSAgICAweDE2NjFlLCAweDE2NjIwLCAweDE2NjNjLCAweDE2NjQwLCAweDE2Njc4LCAweDE2NmYwLCAweDE2NzE4LCAweDE2NzMwLCAweDE2NzNlLCAweDE2NzYwLCAweDE2NzdjLCAweDE2NzhlLA0KLSAgICAweDE2NzljLCAweDE2N2I4LCAweDE2N2MyLCAweDE2N2M0LCAweDE2N2M4LCAweDE2N2QwLCAweDE2N2RlLCAweDE2N2U2LCAweDE2N2VjLCAweDE2ODFjLCAweDE2ODM4LCAweDE2ODcwLA0KLSAgICAweDE2OGUwLCAweDE2OGZjLCAweDE2OWMwLCAweDE2OWY4LCAweDE2YmYwLCAweDE2YzEwLCAweDE2YzFlLCAweDE2YzIwLCAweDE2YzNjLCAweDE2YzQwLCAweDE2Yzc4LCAweDE2Y2YwLA0KLSAgICAweDE2ZGUwLCAweDE2ZTE4LCAweDE2ZTMwLCAweDE2ZTNlLCAweDE2ZTYwLCAweDE2ZTdjLCAweDE2ZWMwLCAweDE2ZWY4LCAweDE2ZjFjLCAweDE2ZjM4LCAweDE2ZjcwLCAweDE2ZjdlLA0KLSAgICAweDE2Zjg0LCAweDE2Zjg4LCAweDE2ZjkwLCAweDE2ZjllLCAweDE2ZmEwLCAweDE2ZmJjLCAweDE2ZmM2LCAweDE2ZmNjLCAweDE2ZmQ4LCAweDE3MDI2LCAweDE3MDJjLCAweDE3MDQ2LA0KLSAgICAweDE3MDRjLCAweDE3MDU4LCAweDE3MDZlLCAweDE3MDg2LCAweDE3MDhjLCAweDE3MDk4LCAweDE3MGIwLCAweDE3MGJlLCAweDE3MGNlLCAweDE3MGRjLCAweDE3MGU4LCAweDE3MTA2LA0KLSAgICAweDE3MTBjLCAweDE3MTE4LCAweDE3MTMwLCAweDE3MTNlLCAweDE3MTYwLCAweDE3MTdjLCAweDE3MThlLCAweDE3MTljLCAweDE3MWI4LCAweDE3MWMyLCAweDE3MWM0LCAweDE3MWM4LA0KLSAgICAweDE3MWQwLCAweDE3MWRlLCAweDE3MWU2LCAweDE3MWVjLCAweDE3MWZhLCAweDE3MjA2LCAweDE3MjBjLCAweDE3MjE4LCAweDE3MjMwLCAweDE3MjNlLCAweDE3MjYwLCAweDE3MjdjLA0KLSAgICAweDE3MmMwLCAweDE3MmY4LCAweDE3MzBlLCAweDE3MzFjLCAweDE3MzM4LCAweDE3MzcwLCAweDE3MzdlLCAweDE3Mzg4LCAweDE3MzkwLCAweDE3MzllLCAweDE3M2EwLCAweDE3M2JjLA0KLSAgICAweDE3M2NjLCAweDE3M2Q4LCAweDE3M2VlLCAweDE3M2YyLCAweDE3M2Y0LCAweDE3NDBjLCAweDE3NDE4LCAweDE3NDMwLCAweDE3NDNlLCAweDE3NDYwLCAweDE3NDdjLCAweDE3NGMwLA0KLSAgICAweDE3NGY4LCAweDE3NWYwLCAweDE3NjBlLCAweDE3NjFjLCAweDE3NjM4LCAweDE3NjcwLCAweDE3NjdlLCAweDE3NmUwLCAweDE3NmZjLCAweDE3NzA4LCAweDE3NzEwLCAweDE3NzFlLA0KLSAgICAweDE3NzIwLCAweDE3NzNjLCAweDE3NzQwLCAweDE3Nzc4LCAweDE3Nzk4LCAweDE3N2IwLCAweDE3N2JlLCAweDE3N2RjLCAweDE3N2UyLCAweDE3N2U0LCAweDE3N2U4LCAweDE3ODIyLA0KLSAgICAweDE3ODI0LCAweDE3ODI4LCAweDE3ODM2LCAweDE3ODQyLCAweDE3ODQ0LCAweDE3ODQ4LCAweDE3ODUwLCAweDE3ODVlLCAweDE3ODY2LCAweDE3ODZjLCAweDE3ODgyLCAweDE3ODg0LA0KLSAgICAweDE3ODg4LCAweDE3ODkwLCAweDE3ODllLCAweDE3OGEwLCAweDE3OGJjLCAweDE3OGM2LCAweDE3OGNjLCAweDE3OGQ4LCAweDE3OGVlLCAweDE3OGYyLCAweDE3OGY0LCAweDE3OTAyLA0KLSAgICAweDE3OTA0LCAweDE3OTA4LCAweDE3OTEwLCAweDE3OTFlLCAweDE3OTIwLCAweDE3OTNjLCAweDE3OTQwLCAweDE3OTc4LCAweDE3OTg2LCAweDE3OThjLCAweDE3OTk4LCAweDE3OWIwLA0KLSAgICAweDE3OWJlLCAweDE3OWNlLCAweDE3OWRjLCAweDE3OWUyLCAweDE3OWU0LCAweDE3OWU4LCAweDE3OWY2LCAweDE3YTA0LCAweDE3YTA4LCAweDE3YTEwLCAweDE3YTFlLCAweDE3YTIwLA0KLSAgICAweDE3YTNjLCAweDE3YTQwLCAweDE3YTc4LCAweDE3YWYwLCAweDE3YjA2LCAweDE3YjBjLCAweDE3YjE4LCAweDE3YjMwLCAweDE3YjNlLCAweDE3YjYwLCAweDE3YjdjLCAweDE3YjhlLA0KLSAgICAweDE3YjljLCAweDE3YmI4LCAweDE3YmM0LCAweDE3YmM4LCAweDE3YmQwLCAweDE3YmRlLCAweDE3YmU2LCAweDE3YmVjLCAweDE3YzJlLCAweDE3YzMyLCAweDE3YzM0LCAweDE3YzRlLA0KLSAgICAweDE3YzVjLCAweDE3YzYyLCAweDE3YzY0LCAweDE3YzY4LCAweDE3Yzc2LCAweDE3YzhlLCAweDE3YzljLCAweDE3Y2I4LCAweDE3Y2MyLCAweDE3Y2M0LCAweDE3Y2M4LCAweDE3Y2QwLA0KLSAgICAweDE3Y2RlLCAweDE3Y2U2LCAweDE3Y2VjLCAweDE3ZDBlLCAweDE3ZDFjLCAweDE3ZDM4LCAweDE3ZDcwLCAweDE3ZDgyLCAweDE3ZDg0LCAweDE3ZDg4LCAweDE3ZDkwLCAweDE3ZDllLA0KLSAgICAweDE3ZGEwLCAweDE3ZGJjLCAweDE3ZGM2LCAweDE3ZGNjLCAweDE3ZGQ4LCAweDE3ZGVlLCAweDE3ZTI2LCAweDE3ZTJjLCAweDE3ZTNhLCAweDE3ZTQ2LCAweDE3ZTRjLCAweDE3ZTU4LA0KLSAgICAweDE3ZTZlLCAweDE3ZTcyLCAweDE3ZTc0LCAweDE3ZTg2LCAweDE3ZThjLCAweDE3ZTk4LCAweDE3ZWIwLCAweDE3ZWNlLCAweDE3ZWRjLCAweDE3ZWUyLCAweDE3ZWU0LCAweDE3ZWU4LA0KLSAgICAweDE3ZWY2LCAweDE4MTNhLCAweDE4MTcyLCAweDE4MTc0LCAweDE4MjE2LCAweDE4MjI2LCAweDE4MjNhLCAweDE4MjRjLCAweDE4MjU4LCAweDE4MjZlLCAweDE4MjcyLCAweDE4Mjc0LA0KLSAgICAweDE4Mjk4LCAweDE4MmJlLCAweDE4MmUyLCAweDE4MmU0LCAweDE4MmU4LCAweDE4MmY2LCAweDE4MzVlLCAweDE4MzdhLCAweDE4M2FlLCAweDE4M2Q2LCAweDE4NDE2LCAweDE4NDI2LA0KLSAgICAweDE4NDJjLCAweDE4NDNhLCAweDE4NDQ2LCAweDE4NDU4LCAweDE4NDZlLCAweDE4NDcyLCAweDE4NDc0LCAweDE4NDg2LCAweDE4NGIwLCAweDE4NGJlLCAweDE4NGNlLCAweDE4NGRjLA0KLSAgICAweDE4NGUyLCAweDE4NGU0LCAweDE4NGU4LCAweDE4NGY2LCAweDE4NTA2LCAweDE4NTBjLCAweDE4NTE4LCAweDE4NTMwLCAweDE4NTNlLCAweDE4NTYwLCAweDE4NTdjLCAweDE4NThlLA0KLSAgICAweDE4NTljLCAweDE4NWI4LCAweDE4NWMyLCAweDE4NWM0LCAweDE4NWM4LCAweDE4NWQwLCAweDE4NWRlLCAweDE4NWU2LCAweDE4NWVjLCAweDE4NWZhLCAweDE4NjEyLCAweDE4NjE0LA0KLSAgICAweDE4NjIyLCAweDE4NjI4LCAweDE4NjM2LCAweDE4NjQyLCAweDE4NjUwLCAweDE4NjVlLCAweDE4NjdhLCAweDE4NjgyLCAweDE4Njg0LCAweDE4Njg4LCAweDE4NjkwLCAweDE4NjllLA0KLSAgICAweDE4NmEwLCAweDE4NmJjLCAweDE4NmM2LCAweDE4NmNjLCAweDE4NmQ4LCAweDE4NmVlLCAweDE4NmYyLCAweDE4NmY0LCAweDE4NzJlLCAweDE4NzRlLCAweDE4NzVjLCAweDE4Nzk2LA0KLSAgICAweDE4N2E2LCAweDE4N2FjLCAweDE4N2QyLCAweDE4N2Q0LCAweDE4ODI2LCAweDE4ODJjLCAweDE4ODNhLCAweDE4ODQ2LCAweDE4ODRjLCAweDE4ODU4LCAweDE4ODZlLCAweDE4ODcyLA0KLSAgICAweDE4ODc0LCAweDE4ODg2LCAweDE4ODk4LCAweDE4OGIwLCAweDE4OGJlLCAweDE4OGNlLCAweDE4OGRjLCAweDE4OGUyLCAweDE4OGU0LCAweDE4OGU4LCAweDE4OGY2LCAweDE4OTBjLA0KLSAgICAweDE4OTMwLCAweDE4OTNlLCAweDE4OTYwLCAweDE4OTdjLCAweDE4OThlLCAweDE4OWI4LCAweDE4OWMyLCAweDE4OWM4LCAweDE4OWQwLCAweDE4OWRlLCAweDE4OWU2LCAweDE4OWVjLA0KLSAgICAweDE4OWZhLCAweDE4YTE4LCAweDE4YTMwLCAweDE4YTNlLCAweDE4YTYwLCAweDE4YTdjLCAweDE4YWMwLCAweDE4YWY4LCAweDE4YjFjLCAweDE4YjM4LCAweDE4YjcwLCAweDE4YjdlLA0KLSAgICAweDE4YjgyLCAweDE4Yjg0LCAweDE4Yjg4LCAweDE4YjkwLCAweDE4YjllLCAweDE4YmEwLCAweDE4YmJjLCAweDE4YmM2LCAweDE4YmNjLCAweDE4YmQ4LCAweDE4YmVlLCAweDE4YmYyLA0KLSAgICAweDE4YmY0LCAweDE4YzIyLCAweDE4YzI0LCAweDE4YzI4LCAweDE4YzM2LCAweDE4YzQyLCAweDE4YzQ4LCAweDE4YzUwLCAweDE4YzVlLCAweDE4YzY2LCAweDE4YzdhLCAweDE4YzgyLA0KLSAgICAweDE4Yzg0LCAweDE4YzkwLCAweDE4YzllLCAweDE4Y2EwLCAweDE4Y2JjLCAweDE4Y2NjLCAweDE4Y2YyLCAweDE4Y2Y0LCAweDE4ZDA0LCAweDE4ZDA4LCAweDE4ZDEwLCAweDE4ZDFlLA0KLSAgICAweDE4ZDIwLCAweDE4ZDNjLCAweDE4ZDQwLCAweDE4ZDc4LCAweDE4ZDg2LCAweDE4ZDk4LCAweDE4ZGNlLCAweDE4ZGUyLCAweDE4ZGU0LCAweDE4ZGU4LCAweDE4ZTJlLCAweDE4ZTMyLA0KLSAgICAweDE4ZTM0LCAweDE4ZTRlLCAweDE4ZTVjLCAweDE4ZTYyLCAweDE4ZTY0LCAweDE4ZTY4LCAweDE4ZThlLCAweDE4ZTljLCAweDE4ZWI4LCAweDE4ZWMyLCAweDE4ZWM0LCAweDE4ZWM4LA0KLSAgICAweDE4ZWQwLCAweDE4ZWZhLCAweDE4ZjE2LCAweDE4ZjI2LCAweDE4ZjJjLCAweDE4ZjQ2LCAweDE4ZjRjLCAweDE4ZjU4LCAweDE4ZjZlLCAweDE4ZjhhLCAweDE4ZjkyLCAweDE4Zjk0LA0KLSAgICAweDE4ZmEyLCAweDE4ZmE0LCAweDE4ZmE4LCAweDE4ZmI2LCAweDE5MDJjLCAweDE5MDNhLCAweDE5MDQ2LCAweDE5MDRjLCAweDE5MDU4LCAweDE5MDcyLCAweDE5MDc0LCAweDE5MDg2LA0KLSAgICAweDE5MDk4LCAweDE5MGIwLCAweDE5MGJlLCAweDE5MGNlLCAweDE5MGRjLCAweDE5MGUyLCAweDE5MGU4LCAweDE5MGY2LCAweDE5MTA2LCAweDE5MTBjLCAweDE5MTMwLCAweDE5MTNlLA0KLSAgICAweDE5MTYwLCAweDE5MTdjLCAweDE5MThlLCAweDE5MTljLCAweDE5MWI4LCAweDE5MWMyLCAweDE5MWM4LCAweDE5MWQwLCAweDE5MWRlLCAweDE5MWU2LCAweDE5MWVjLCAweDE5MWZhLA0KLSAgICAweDE5MjE4LCAweDE5MjNlLCAweDE5MjYwLCAweDE5MjdjLCAweDE5MmMwLCAweDE5MmY4LCAweDE5MzM4LCAweDE5MzcwLCAweDE5MzdlLCAweDE5MzgyLCAweDE5Mzg0LCAweDE5MzkwLA0KLSAgICAweDE5MzllLCAweDE5M2EwLCAweDE5M2JjLCAweDE5M2M2LCAweDE5M2NjLCAweDE5M2Q4LCAweDE5M2VlLCAweDE5M2YyLCAweDE5M2Y0LCAweDE5NDMwLCAweDE5NDNlLCAweDE5NDYwLA0KLSAgICAweDE5NDdjLCAweDE5NGMwLCAweDE5NGY4LCAweDE5NWYwLCAweDE5NjM4LCAweDE5NjcwLCAweDE5NjdlLCAweDE5NmUwLCAweDE5NmZjLCAweDE5NzAyLCAweDE5NzA0LCAweDE5NzA4LA0KLSAgICAweDE5NzEwLCAweDE5NzIwLCAweDE5NzNjLCAweDE5NzQwLCAweDE5Nzc4LCAweDE5Nzg2LCAweDE5NzhjLCAweDE5Nzk4LCAweDE5N2IwLCAweDE5N2JlLCAweDE5N2NlLCAweDE5N2RjLA0KLSAgICAweDE5N2UyLCAweDE5N2U0LCAweDE5N2U4LCAweDE5ODIyLCAweDE5ODI0LCAweDE5ODQyLCAweDE5ODQ4LCAweDE5ODUwLCAweDE5ODVlLCAweDE5ODY2LCAweDE5ODdhLCAweDE5ODgyLA0KLSAgICAweDE5ODg0LCAweDE5ODkwLCAweDE5ODllLCAweDE5OGEwLCAweDE5OGJjLCAweDE5OGNjLCAweDE5OGYyLCAweDE5OGY0LCAweDE5OTAyLCAweDE5OTA4LCAweDE5OTFlLCAweDE5OTIwLA0KLSAgICAweDE5OTNjLCAweDE5OTQwLCAweDE5OTc4LCAweDE5OTg2LCAweDE5OTk4LCAweDE5OWNlLCAweDE5OWUyLCAweDE5OWU0LCAweDE5OWU4LCAweDE5YTA4LCAweDE5YTEwLCAweDE5YTFlLA0KLSAgICAweDE5YTIwLCAweDE5YTNjLCAweDE5YTQwLCAweDE5YTc4LCAweDE5YWYwLCAweDE5YjE4LCAweDE5YjNlLCAweDE5YjYwLCAweDE5YjljLCAweDE5YmMyLCAweDE5YmM0LCAweDE5YmM4LA0KLSAgICAweDE5YmQwLCAweDE5YmU2LCAweDE5YzJlLCAweDE5YzM0LCAweDE5YzRlLCAweDE5YzVjLCAweDE5YzYyLCAweDE5YzY0LCAweDE5YzY4LCAweDE5YzhlLCAweDE5YzljLCAweDE5Y2I4LA0KLSAgICAweDE5Y2MyLCAweDE5Y2M4LCAweDE5Y2QwLCAweDE5Y2U2LCAweDE5Y2ZhLCAweDE5ZDBlLCAweDE5ZDFjLCAweDE5ZDM4LCAweDE5ZDcwLCAweDE5ZDdlLCAweDE5ZDgyLCAweDE5ZDg0LA0KLSAgICAweDE5ZDg4LCAweDE5ZDkwLCAweDE5ZGEwLCAweDE5ZGNjLCAweDE5ZGYyLCAweDE5ZGY0LCAweDE5ZTE2LCAweDE5ZTI2LCAweDE5ZTJjLCAweDE5ZTQ2LCAweDE5ZTRjLCAweDE5ZTU4LA0KLSAgICAweDE5ZTc0LCAweDE5ZTg2LCAweDE5ZThjLCAweDE5ZTk4LCAweDE5ZWIwLCAweDE5ZWJlLCAweDE5ZWNlLCAweDE5ZWUyLCAweDE5ZWU0LCAweDE5ZWU4LCAweDE5ZjBhLCAweDE5ZjEyLA0KLSAgICAweDE5ZjE0LCAweDE5ZjIyLCAweDE5ZjI0LCAweDE5ZjI4LCAweDE5ZjQyLCAweDE5ZjQ0LCAweDE5ZjQ4LCAweDE5ZjUwLCAweDE5ZjVlLCAweDE5ZjZjLCAweDE5ZjlhLCAweDE5ZmFlLA0KLSAgICAweDE5ZmIyLCAweDE5ZmI0LCAweDFhMDQ2LCAweDFhMDRjLCAweDFhMDcyLCAweDFhMDc0LCAweDFhMDg2LCAweDFhMDhjLCAweDFhMDk4LCAweDFhMGIwLCAweDFhMGJlLCAweDFhMGUyLA0KLSAgICAweDFhMGU0LCAweDFhMGU4LCAweDFhMGY2LCAweDFhMTA2LCAweDFhMTBjLCAweDFhMTE4LCAweDFhMTMwLCAweDFhMTNlLCAweDFhMTYwLCAweDFhMTdjLCAweDFhMThlLCAweDFhMTljLA0KLSAgICAweDFhMWI4LCAweDFhMWMyLCAweDFhMWM0LCAweDFhMWM4LCAweDFhMWQwLCAweDFhMWRlLCAweDFhMWU2LCAweDFhMWVjLCAweDFhMjE4LCAweDFhMjMwLCAweDFhMjNlLCAweDFhMjYwLA0KLSAgICAweDFhMjdjLCAweDFhMmMwLCAweDFhMmY4LCAweDFhMzFjLCAweDFhMzM4LCAweDFhMzcwLCAweDFhMzdlLCAweDFhMzgyLCAweDFhMzg0LCAweDFhMzg4LCAweDFhMzkwLCAweDFhMzllLA0KLSAgICAweDFhM2EwLCAweDFhM2JjLCAweDFhM2M2LCAweDFhM2NjLCAweDFhM2Q4LCAweDFhM2VlLCAweDFhM2YyLCAweDFhM2Y0LCAweDFhNDE4LCAweDFhNDMwLCAweDFhNDNlLCAweDFhNDYwLA0KLSAgICAweDFhNDdjLCAweDFhNGMwLCAweDFhNGY4LCAweDFhNWYwLCAweDFhNjFjLCAweDFhNjM4LCAweDFhNjcwLCAweDFhNjdlLCAweDFhNmUwLCAweDFhNmZjLCAweDFhNzAyLCAweDFhNzA0LA0KLSAgICAweDFhNzA4LCAweDFhNzEwLCAweDFhNzFlLCAweDFhNzIwLCAweDFhNzNjLCAweDFhNzQwLCAweDFhNzc4LCAweDFhNzg2LCAweDFhNzhjLCAweDFhNzk4LCAweDFhN2IwLCAweDFhN2JlLA0KLSAgICAweDFhN2NlLCAweDFhN2RjLCAweDFhN2UyLCAweDFhN2U0LCAweDFhN2U4LCAweDFhODMwLCAweDFhODYwLCAweDFhODdjLCAweDFhOGMwLCAweDFhOGY4LCAweDFhOWYwLCAweDFhYmUwLA0KLSAgICAweDFhYzcwLCAweDFhYzdlLCAweDFhY2UwLCAweDFhY2ZjLCAweDFhZGMwLCAweDFhZGY4LCAweDFhZTA0LCAweDFhZTA4LCAweDFhZTEwLCAweDFhZTIwLCAweDFhZTNjLCAweDFhZTQwLA0KLSAgICAweDFhZTc4LCAweDFhZWYwLCAweDFhZjA2LCAweDFhZjBjLCAweDFhZjE4LCAweDFhZjMwLCAweDFhZjNlLCAweDFhZjYwLCAweDFhZjdjLCAweDFhZjhlLCAweDFhZjljLCAweDFhZmI4LA0KLSAgICAweDFhZmM0LCAweDFhZmM4LCAweDFhZmQwLCAweDFhZmRlLCAweDFiMDQyLCAweDFiMDVlLCAweDFiMDdhLCAweDFiMDgyLCAweDFiMDg0LCAweDFiMDg4LCAweDFiMDkwLCAweDFiMDllLA0KLSAgICAweDFiMGEwLCAweDFiMGJjLCAweDFiMGNjLCAweDFiMGYyLCAweDFiMGY0LCAweDFiMTAyLCAweDFiMTA0LCAweDFiMTA4LCAweDFiMTEwLCAweDFiMTFlLCAweDFiMTIwLCAweDFiMTNjLA0KLSAgICAweDFiMTQwLCAweDFiMTc4LCAweDFiMTg2LCAweDFiMTk4LCAweDFiMWNlLCAweDFiMWUyLCAweDFiMWU0LCAweDFiMWU4LCAweDFiMjA0LCAweDFiMjA4LCAweDFiMjEwLCAweDFiMjFlLA0KLSAgICAweDFiMjIwLCAweDFiMjNjLCAweDFiMjQwLCAweDFiMjc4LCAweDFiMmYwLCAweDFiMzBjLCAweDFiMzNlLCAweDFiMzYwLCAweDFiMzljLCAweDFiM2MyLCAweDFiM2M0LCAweDFiM2M4LA0KLSAgICAweDFiM2QwLCAweDFiM2U2LCAweDFiNDEwLCAweDFiNDFlLCAweDFiNDIwLCAweDFiNDNjLCAweDFiNDQwLCAweDFiNDc4LCAweDFiNGYwLCAweDFiNWUwLCAweDFiNjE4LCAweDFiNjYwLA0KLSAgICAweDFiNjdjLCAweDFiNmMwLCAweDFiNzM4LCAweDFiNzgyLCAweDFiNzg0LCAweDFiNzg4LCAweDFiNzkwLCAweDFiNzllLCAweDFiN2EwLCAweDFiN2NjLCAweDFiODJlLCAweDFiODRlLA0KLSAgICAweDFiODVjLCAweDFiODhlLCAweDFiODljLCAweDFiOGI4LCAweDFiOGMyLCAweDFiOGM0LCAweDFiOGM4LCAweDFiOGQwLCAweDFiOGU2LCAweDFiOGZhLCAweDFiOTBlLCAweDFiOTFjLA0KLSAgICAweDFiOTM4LCAweDFiOTcwLCAweDFiOTdlLCAweDFiOTgyLCAweDFiOTg0LCAweDFiOTg4LCAweDFiOTkwLCAweDFiOTllLCAweDFiOWEwLCAweDFiOWNjLCAweDFiOWYyLCAweDFiOWY0LA0KLSAgICAweDFiYTBlLCAweDFiYTFjLCAweDFiYTM4LCAweDFiYTcwLCAweDFiYTdlLCAweDFiYWUwLCAweDFiYWZjLCAweDFiYjA4LCAweDFiYjEwLCAweDFiYjIwLCAweDFiYjNjLCAweDFiYjQwLA0KLSAgICAweDFiYjk4LCAweDFiYmNlLCAweDFiYmUyLCAweDFiYmU0LCAweDFiYmU4LCAweDFiYzE2LCAweDFiYzI2LCAweDFiYzJjLCAweDFiYzQ2LCAweDFiYzRjLCAweDFiYzU4LCAweDFiYzcyLA0KLSAgICAweDFiYzc0LCAweDFiYzg2LCAweDFiYzhjLCAweDFiYzk4LCAweDFiY2IwLCAweDFiY2JlLCAweDFiY2NlLCAweDFiY2UyLCAweDFiY2U0LCAweDFiY2U4LCAweDFiZDA2LCAweDFiZDBjLA0KLSAgICAweDFiZDE4LCAweDFiZDMwLCAweDFiZDNlLCAweDFiZDYwLCAweDFiZDdjLCAweDFiZDljLCAweDFiZGMyLCAweDFiZGM0LCAweDFiZGM4LCAweDFiZGQwLCAweDFiZGU2LCAweDFiZGZhLA0KLSAgICAweDFiZTEyLCAweDFiZTE0LCAweDFiZTIyLCAweDFiZTI0LCAweDFiZTI4LCAweDFiZTQyLCAweDFiZTQ0LCAweDFiZTQ4LCAweDFiZTUwLCAweDFiZTVlLCAweDFiZTY2LCAweDFiZTgyLA0KLSAgICAweDFiZTg0LCAweDFiZTg4LCAweDFiZTkwLCAweDFiZTllLCAweDFiZWEwLCAweDFiZWJjLCAweDFiZWNjLCAweDFiZWY0LCAweDFiZjFhLCAweDFiZjJlLCAweDFiZjMyLCAweDFiZjM0LA0KLSAgICAweDFiZjRlLCAweDFiZjVjLCAweDFiZjYyLCAweDFiZjY0LCAweDFiZjY4LCAweDFjMDlhLCAweDFjMGIyLCAweDFjMGI0LCAweDFjMTFhLCAweDFjMTMyLCAweDFjMTM0LCAweDFjMTYyLA0KLSAgICAweDFjMTY0LCAweDFjMTY4LCAweDFjMTc2LCAweDFjMWJhLCAweDFjMjFhLCAweDFjMjMyLCAweDFjMjM0LCAweDFjMjRlLCAweDFjMjVjLCAweDFjMjYyLCAweDFjMjY0LCAweDFjMjY4LA0KLSAgICAweDFjMjc2LCAweDFjMjhlLCAweDFjMmMyLCAweDFjMmM0LCAweDFjMmM4LCAweDFjMmQwLCAweDFjMmRlLCAweDFjMmU2LCAweDFjMmVjLCAweDFjMmZhLCAweDFjMzE2LCAweDFjMzI2LA0KLSAgICAweDFjMzNhLCAweDFjMzQ2LCAweDFjMzRjLCAweDFjMzcyLCAweDFjMzc0LCAweDFjNDFhLCAweDFjNDJlLCAweDFjNDMyLCAweDFjNDM0LCAweDFjNDRlLCAweDFjNDVjLCAweDFjNDYyLA0KLSAgICAweDFjNDY0LCAweDFjNDY4LCAweDFjNDc2LCAweDFjNDhlLCAweDFjNDljLCAweDFjNGI4LCAweDFjNGMyLCAweDFjNGM4LCAweDFjNGQwLCAweDFjNGRlLCAweDFjNGU2LCAweDFjNGVjLA0KLSAgICAweDFjNGZhLCAweDFjNTFjLCAweDFjNTM4LCAweDFjNTcwLCAweDFjNTdlLCAweDFjNTgyLCAweDFjNTg0LCAweDFjNTg4LCAweDFjNTkwLCAweDFjNTllLCAweDFjNWEwLCAweDFjNWJjLA0KLSAgICAweDFjNWM2LCAweDFjNWNjLCAweDFjNWQ4LCAweDFjNWVlLCAweDFjNWYyLCAweDFjNWY0LCAweDFjNjE2LCAweDFjNjI2LCAweDFjNjJjLCAweDFjNjNhLCAweDFjNjQ2LCAweDFjNjRjLA0KLSAgICAweDFjNjU4LCAweDFjNjZlLCAweDFjNjcyLCAweDFjNjc0LCAweDFjNjg2LCAweDFjNjhjLCAweDFjNjk4LCAweDFjNmIwLCAweDFjNmJlLCAweDFjNmNlLCAweDFjNmRjLCAweDFjNmUyLA0KLSAgICAweDFjNmU0LCAweDFjNmU4LCAweDFjNzEyLCAweDFjNzE0LCAweDFjNzIyLCAweDFjNzI4LCAweDFjNzM2LCAweDFjNzQyLCAweDFjNzQ0LCAweDFjNzQ4LCAweDFjNzUwLCAweDFjNzVlLA0KLSAgICAweDFjNzY2LCAweDFjNzZjLCAweDFjNzdhLCAweDFjN2FlLCAweDFjN2Q2LCAweDFjN2VhLCAweDFjODFhLCAweDFjODJlLCAweDFjODMyLCAweDFjODM0LCAweDFjODRlLCAweDFjODVjLA0KLSAgICAweDFjODYyLCAweDFjODY0LCAweDFjODY4LCAweDFjODc2LCAweDFjODhlLCAweDFjODljLCAweDFjOGI4LCAweDFjOGMyLCAweDFjOGM4LCAweDFjOGQwLCAweDFjOGRlLCAweDFjOGU2LA0KLSAgICAweDFjOGVjLCAweDFjOGZhLCAweDFjOTBlLCAweDFjOTM4LCAweDFjOTcwLCAweDFjOTdlLCAweDFjOTgyLCAweDFjOTg0LCAweDFjOTkwLCAweDFjOTllLCAweDFjOWEwLCAweDFjOWJjLA0KLSAgICAweDFjOWM2LCAweDFjOWNjLCAweDFjOWQ4LCAweDFjOWVlLCAweDFjOWYyLCAweDFjOWY0LCAweDFjYTM4LCAweDFjYTcwLCAweDFjYTdlLCAweDFjYWUwLCAweDFjYWZjLCAweDFjYjAyLA0KLSAgICAweDFjYjA0LCAweDFjYjA4LCAweDFjYjEwLCAweDFjYjIwLCAweDFjYjNjLCAweDFjYjQwLCAweDFjYjc4LCAweDFjYjg2LCAweDFjYjhjLCAweDFjYjk4LCAweDFjYmIwLCAweDFjYmJlLA0KLSAgICAweDFjYmNlLCAweDFjYmRjLCAweDFjYmUyLCAweDFjYmU0LCAweDFjYmU4LCAweDFjYmY2LCAweDFjYzE2LCAweDFjYzI2LCAweDFjYzJjLCAweDFjYzNhLCAweDFjYzQ2LCAweDFjYzU4LA0KLSAgICAweDFjYzcyLCAweDFjYzc0LCAweDFjYzg2LCAweDFjY2IwLCAweDFjY2JlLCAweDFjY2NlLCAweDFjY2UyLCAweDFjY2U0LCAweDFjY2U4LCAweDFjZDA2LCAweDFjZDBjLCAweDFjZDE4LA0KLSAgICAweDFjZDMwLCAweDFjZDNlLCAweDFjZDYwLCAweDFjZDdjLCAweDFjZDljLCAweDFjZGMyLCAweDFjZGM0LCAweDFjZGM4LCAweDFjZGQwLCAweDFjZGRlLCAweDFjZGU2LCAweDFjZGZhLA0KLSAgICAweDFjZTIyLCAweDFjZTI4LCAweDFjZTQyLCAweDFjZTUwLCAweDFjZTVlLCAweDFjZTY2LCAweDFjZTdhLCAweDFjZTgyLCAweDFjZTg0LCAweDFjZTg4LCAweDFjZTkwLCAweDFjZTllLA0KLSAgICAweDFjZWEwLCAweDFjZWJjLCAweDFjZWNjLCAweDFjZWYyLCAweDFjZWY0LCAweDFjZjJlLCAweDFjZjMyLCAweDFjZjM0LCAweDFjZjRlLCAweDFjZjVjLCAweDFjZjYyLCAweDFjZjY0LA0KLSAgICAweDFjZjY4LCAweDFjZjk2LCAweDFjZmE2LCAweDFjZmFjLCAweDFjZmNhLCAweDFjZmQyLCAweDFjZmQ0LCAweDFkMDJlLCAweDFkMDMyLCAweDFkMDM0LCAweDFkMDRlLCAweDFkMDVjLA0KLSAgICAweDFkMDYyLCAweDFkMDY0LCAweDFkMDY4LCAweDFkMDc2LCAweDFkMDhlLCAweDFkMDljLCAweDFkMGI4LCAweDFkMGMyLCAweDFkMGM0LCAweDFkMGM4LCAweDFkMGQwLCAweDFkMGRlLA0KLSAgICAweDFkMGU2LCAweDFkMGVjLCAweDFkMGZhLCAweDFkMTFjLCAweDFkMTM4LCAweDFkMTcwLCAweDFkMTdlLCAweDFkMTgyLCAweDFkMTg0LCAweDFkMTg4LCAweDFkMTkwLCAweDFkMTllLA0KLSAgICAweDFkMWEwLCAweDFkMWJjLCAweDFkMWM2LCAweDFkMWNjLCAweDFkMWQ4LCAweDFkMWVlLCAweDFkMWYyLCAweDFkMWY0LCAweDFkMjFjLCAweDFkMjM4LCAweDFkMjcwLCAweDFkMjdlLA0KLSAgICAweDFkMmUwLCAweDFkMmZjLCAweDFkMzAyLCAweDFkMzA0LCAweDFkMzA4LCAweDFkMzEwLCAweDFkMzFlLCAweDFkMzIwLCAweDFkMzNjLCAweDFkMzQwLCAweDFkMzc4LCAweDFkMzg2LA0KLSAgICAweDFkMzhjLCAweDFkMzk4LCAweDFkM2IwLCAweDFkM2JlLCAweDFkM2NlLCAweDFkM2RjLCAweDFkM2UyLCAweDFkM2U0LCAweDFkM2U4LCAweDFkM2Y2LCAweDFkNDcwLCAweDFkNDdlLA0KLSAgICAweDFkNGUwLCAweDFkNGZjLCAweDFkNWMwLCAweDFkNWY4LCAweDFkNjA0LCAweDFkNjA4LCAweDFkNjEwLCAweDFkNjIwLCAweDFkNjQwLCAweDFkNjc4LCAweDFkNmYwLCAweDFkNzA2LA0KLSAgICAweDFkNzBjLCAweDFkNzE4LCAweDFkNzMwLCAweDFkNzNlLCAweDFkNzYwLCAweDFkNzdjLCAweDFkNzhlLCAweDFkNzljLCAweDFkN2I4LCAweDFkN2MyLCAweDFkN2M0LCAweDFkN2M4LA0KLSAgICAweDFkN2QwLCAweDFkN2RlLCAweDFkN2U2LCAweDFkN2VjLCAweDFkODI2LCAweDFkODJjLCAweDFkODNhLCAweDFkODQ2LCAweDFkODRjLCAweDFkODU4LCAweDFkODcyLCAweDFkODc0LA0KLSAgICAweDFkODg2LCAweDFkODhjLCAweDFkODk4LCAweDFkOGIwLCAweDFkOGJlLCAweDFkOGNlLCAweDFkOGUyLCAweDFkOGU0LCAweDFkOGU4LCAweDFkOGY2LCAweDFkOTBjLCAweDFkOTE4LA0KLSAgICAweDFkOTMwLCAweDFkOTNlLCAweDFkOTYwLCAweDFkOTdjLCAweDFkOTljLCAweDFkOWMyLCAweDFkOWM0LCAweDFkOWM4LCAweDFkOWQwLCAweDFkOWU2LCAweDFkOWZhLCAweDFkYTBjLA0KLSAgICAweDFkYTE4LCAweDFkYTMwLCAweDFkYTNlLCAweDFkYTYwLCAweDFkYTdjLCAweDFkYWMwLCAweDFkYWY4LCAweDFkYjM4LCAweDFkYjgyLCAweDFkYjg0LCAweDFkYjg4LCAweDFkYjkwLA0KLSAgICAweDFkYjllLCAweDFkYmEwLCAweDFkYmNjLCAweDFkYmYyLCAweDFkYmY0LCAweDFkYzIyLCAweDFkYzQyLCAweDFkYzQ0LCAweDFkYzQ4LCAweDFkYzUwLCAweDFkYzVlLCAweDFkYzY2LA0KLSAgICAweDFkYzdhLCAweDFkYzgyLCAweDFkYzg0LCAweDFkYzg4LCAweDFkYzkwLCAweDFkYzllLCAweDFkY2EwLCAweDFkY2JjLCAweDFkY2NjLCAweDFkY2YyLCAweDFkY2Y0LCAweDFkZDA0LA0KLSAgICAweDFkZDA4LCAweDFkZDEwLCAweDFkZDFlLCAweDFkZDIwLCAweDFkZDNjLCAweDFkZDQwLCAweDFkZDc4LCAweDFkZDg2LCAweDFkZDk4LCAweDFkZGNlLCAweDFkZGUyLCAweDFkZGU0LA0KLSAgICAweDFkZGU4LCAweDFkZTJlLCAweDFkZTMyLCAweDFkZTM0LCAweDFkZTRlLCAweDFkZTVjLCAweDFkZTYyLCAweDFkZTY0LCAweDFkZTY4LCAweDFkZThlLCAweDFkZTljLCAweDFkZWI4LA0KLSAgICAweDFkZWMyLCAweDFkZWM0LCAweDFkZWM4LCAweDFkZWQwLCAweDFkZWU2LCAweDFkZWZhLCAweDFkZjE2LCAweDFkZjI2LCAweDFkZjJjLCAweDFkZjQ2LCAweDFkZjRjLCAweDFkZjU4LA0KLSAgICAweDFkZjcyLCAweDFkZjc0LCAweDFkZjhhLCAweDFkZjkyLCAweDFkZjk0LCAweDFkZmEyLCAweDFkZmE0LCAweDFkZmE4LCAweDFlMDhhLCAweDFlMDkyLCAweDFlMDk0LCAweDFlMGEyLA0KLSAgICAweDFlMGE0LCAweDFlMGE4LCAweDFlMGI2LCAweDFlMGRhLCAweDFlMTBhLCAweDFlMTEyLCAweDFlMTE0LCAweDFlMTIyLCAweDFlMTI0LCAweDFlMTI4LCAweDFlMTM2LCAweDFlMTQyLA0KLSAgICAweDFlMTQ0LCAweDFlMTQ4LCAweDFlMTUwLCAweDFlMTY2LCAweDFlMTZjLCAweDFlMTdhLCAweDFlMTlhLCAweDFlMWIyLCAweDFlMWI0LCAweDFlMjBhLCAweDFlMjEyLCAweDFlMjE0LA0KLSAgICAweDFlMjIyLCAweDFlMjI0LCAweDFlMjI4LCAweDFlMjM2LCAweDFlMjQyLCAweDFlMjQ4LCAweDFlMjUwLCAweDFlMjVlLCAweDFlMjY2LCAweDFlMjZjLCAweDFlMjdhLCAweDFlMjgyLA0KLSAgICAweDFlMjg0LCAweDFlMjg4LCAweDFlMjkwLCAweDFlMmEwLCAweDFlMmJjLCAweDFlMmM2LCAweDFlMmNjLCAweDFlMmQ4LCAweDFlMmVlLCAweDFlMmYyLCAweDFlMmY0LCAweDFlMzFhLA0KLSAgICAweDFlMzMyLCAweDFlMzM0LCAweDFlMzVjLCAweDFlMzYyLCAweDFlMzY0LCAweDFlMzY4LCAweDFlM2JhLCAweDFlNDBhLCAweDFlNDEyLCAweDFlNDE0LCAweDFlNDIyLCAweDFlNDI4LA0KLSAgICAweDFlNDM2LCAweDFlNDQyLCAweDFlNDQ4LCAweDFlNDUwLCAweDFlNDVlLCAweDFlNDY2LCAweDFlNDZjLCAweDFlNDdhLCAweDFlNDgyLCAweDFlNDg0LCAweDFlNDkwLCAweDFlNDllLA0KLSAgICAweDFlNGEwLCAweDFlNGJjLCAweDFlNGM2LCAweDFlNGNjLCAweDFlNGQ4LCAweDFlNGVlLCAweDFlNGYyLCAweDFlNGY0LCAweDFlNTAyLCAweDFlNTA0LCAweDFlNTA4LCAweDFlNTEwLA0KLSAgICAweDFlNTFlLCAweDFlNTIwLCAweDFlNTNjLCAweDFlNTQwLCAweDFlNTc4LCAweDFlNTg2LCAweDFlNThjLCAweDFlNTk4LCAweDFlNWIwLCAweDFlNWJlLCAweDFlNWNlLCAweDFlNWRjLA0KLSAgICAweDFlNWUyLCAweDFlNWU0LCAweDFlNWU4LCAweDFlNWY2LCAweDFlNjFhLCAweDFlNjJlLCAweDFlNjMyLCAweDFlNjM0LCAweDFlNjRlLCAweDFlNjVjLCAweDFlNjYyLCAweDFlNjY4LA0KLSAgICAweDFlNjhlLCAweDFlNjljLCAweDFlNmI4LCAweDFlNmMyLCAweDFlNmM0LCAweDFlNmM4LCAweDFlNmQwLCAweDFlNmU2LCAweDFlNmZhLCAweDFlNzE2LCAweDFlNzI2LCAweDFlNzJjLA0KLSAgICAweDFlNzNhLCAweDFlNzQ2LCAweDFlNzRjLCAweDFlNzU4LCAweDFlNzcyLCAweDFlNzc0LCAweDFlNzkyLCAweDFlNzk0LCAweDFlN2EyLCAweDFlN2E0LCAweDFlN2E4LCAweDFlN2I2LA0KLSAgICAweDFlODEyLCAweDFlODE0LCAweDFlODIyLCAweDFlODI0LCAweDFlODI4LCAweDFlODM2LCAweDFlODQyLCAweDFlODQ0LCAweDFlODQ4LCAweDFlODUwLCAweDFlODVlLCAweDFlODY2LA0KLSAgICAweDFlODZjLCAweDFlODdhLCAweDFlODgyLCAweDFlODg0LCAweDFlODg4LCAweDFlODkwLCAweDFlODllLCAweDFlOGEwLCAweDFlOGJjLCAweDFlOGM2LCAweDFlOGNjLCAweDFlOGQ4LA0KLSAgICAweDFlOGVlLCAweDFlOGYyLCAweDFlOGY0LCAweDFlOTAyLCAweDFlOTA0LCAweDFlOTA4LCAweDFlOTEwLCAweDFlOTIwLCAweDFlOTNjLCAweDFlOTQwLCAweDFlOTc4LCAweDFlOTg2LA0KLSAgICAweDFlOThjLCAweDFlOTk4LCAweDFlOWIwLCAweDFlOWJlLCAweDFlOWNlLCAweDFlOWRjLCAweDFlOWUyLCAweDFlOWU0LCAweDFlOWU4LCAweDFlOWY2LCAweDFlYTA0LCAweDFlYTA4LA0KLSAgICAweDFlYTEwLCAweDFlYTIwLCAweDFlYTQwLCAweDFlYTc4LCAweDFlYWYwLCAweDFlYjA2LCAweDFlYjBjLCAweDFlYjE4LCAweDFlYjMwLCAweDFlYjNlLCAweDFlYjYwLCAweDFlYjdjLA0KLSAgICAweDFlYjhlLCAweDFlYjljLCAweDFlYmI4LCAweDFlYmMyLCAweDFlYmM0LCAweDFlYmM4LCAweDFlYmQwLCAweDFlYmRlLCAweDFlYmU2LCAweDFlYmVjLCAweDFlYzFhLCAweDFlYzJlLA0KLSAgICAweDFlYzMyLCAweDFlYzM0LCAweDFlYzRlLCAweDFlYzVjLCAweDFlYzYyLCAweDFlYzY0LCAweDFlYzY4LCAweDFlYzhlLCAweDFlYzljLCAweDFlY2I4LCAweDFlY2MyLCAweDFlY2M0LA0KLSAgICAweDFlY2M4LCAweDFlY2QwLCAweDFlY2U2LCAweDFlY2ZhLCAweDFlZDBlLCAweDFlZDFjLCAweDFlZDM4LCAweDFlZDcwLCAweDFlZDdlLCAweDFlZDgyLCAweDFlZDg0LCAweDFlZDg4LA0KLSAgICAweDFlZDkwLCAweDFlZDllLCAweDFlZGEwLCAweDFlZGNjLCAweDFlZGYyLCAweDFlZGY0LCAweDFlZTE2LCAweDFlZTI2LCAweDFlZTJjLCAweDFlZTNhLCAweDFlZTQ2LCAweDFlZTRjLA0KLSAgICAweDFlZTU4LCAweDFlZTZlLCAweDFlZTcyLCAweDFlZTc0LCAweDFlZTg2LCAweDFlZThjLCAweDFlZTk4LCAweDFlZWIwLCAweDFlZWJlLCAweDFlZWNlLCAweDFlZWRjLCAweDFlZWUyLA0KLSAgICAweDFlZWU0LCAweDFlZWU4LCAweDFlZjEyLCAweDFlZjIyLCAweDFlZjI0LCAweDFlZjI4LCAweDFlZjM2LCAweDFlZjQyLCAweDFlZjQ0LCAweDFlZjQ4LCAweDFlZjUwLCAweDFlZjVlLA0KLSAgICAweDFlZjY2LCAweDFlZjZjLCAweDFlZjdhLCAweDFlZmFlLCAweDFlZmIyLCAweDFlZmI0LCAweDFlZmQ2LCAweDFmMDk2LCAweDFmMGE2LCAweDFmMGFjLCAweDFmMGJhLCAweDFmMGNhLA0KLSAgICAweDFmMGQyLCAweDFmMGQ0LCAweDFmMTE2LCAweDFmMTI2LCAweDFmMTJjLCAweDFmMTNhLCAweDFmMTQ2LCAweDFmMTRjLCAweDFmMTU4LCAweDFmMTZlLCAweDFmMTcyLCAweDFmMTc0LA0KLSAgICAweDFmMThhLCAweDFmMTkyLCAweDFmMTk0LCAweDFmMWEyLCAweDFmMWE0LCAweDFmMWE4LCAweDFmMWRhLCAweDFmMjE2LCAweDFmMjI2LCAweDFmMjJjLCAweDFmMjNhLCAweDFmMjQ2LA0KLSAgICAweDFmMjU4LCAweDFmMjZlLCAweDFmMjcyLCAweDFmMjc0LCAweDFmMjg2LCAweDFmMjhjLCAweDFmMjk4LCAweDFmMmIwLCAweDFmMmJlLCAweDFmMmNlLCAweDFmMmRjLCAweDFmMmUyLA0KLSAgICAweDFmMmU0LCAweDFmMmU4LCAweDFmMmY2LCAweDFmMzBhLCAweDFmMzEyLCAweDFmMzE0LCAweDFmMzIyLCAweDFmMzI4LCAweDFmMzQyLCAweDFmMzQ0LCAweDFmMzQ4LCAweDFmMzUwLA0KLSAgICAweDFmMzVlLCAweDFmMzY2LCAweDFmMzdhLCAweDFmMzlhLCAweDFmM2FlLCAweDFmM2IyLCAweDFmM2I0LCAweDFmNDE2LCAweDFmNDI2LCAweDFmNDJjLCAweDFmNDNhLCAweDFmNDQ2LA0KLSAgICAweDFmNDRjLCAweDFmNDU4LCAweDFmNDZlLCAweDFmNDcyLCAweDFmNDc0LCAweDFmNDg2LCAweDFmNDhjLCAweDFmNDk4LCAweDFmNGIwLCAweDFmNGJlLCAweDFmNGNlLCAweDFmNGRjLA0KLSAgICAweDFmNGUyLCAweDFmNGU0LCAweDFmNGU4LCAweDFmNGY2LCAweDFmNTA2LCAweDFmNTBjLCAweDFmNTE4LCAweDFmNTMwLCAweDFmNTNlLCAweDFmNTYwLCAweDFmNTdjLCAweDFmNThlLA0KLSAgICAweDFmNTljLCAweDFmNWI4LCAweDFmNWMyLCAweDFmNWM0LCAweDFmNWM4LCAweDFmNWQwLCAweDFmNWRlLCAweDFmNWU2LCAweDFmNWVjLCAweDFmNWZhLCAweDFmNjBhLCAweDFmNjEyLA0KLSAgICAweDFmNjE0LCAweDFmNjIyLCAweDFmNjI0LCAweDFmNjI4LCAweDFmNjM2LCAweDFmNjQyLCAweDFmNjQ0LCAweDFmNjQ4LCAweDFmNjUwLCAweDFmNjVlLCAweDFmNjY2LCAweDFmNjdhLA0KLSAgICAweDFmNjgyLCAweDFmNjg0LCAweDFmNjg4LCAweDFmNjkwLCAweDFmNjllLCAweDFmNmEwLCAweDFmNmJjLCAweDFmNmNjLCAweDFmNmYyLCAweDFmNmY0LCAweDFmNzFhLCAweDFmNzJlLA0KLSAgICAweDFmNzMyLCAweDFmNzM0LCAweDFmNzRlLCAweDFmNzVjLCAweDFmNzYyLCAweDFmNzY0LCAweDFmNzY4LCAweDFmNzc2LCAweDFmNzk2LCAweDFmN2E2LCAweDFmN2FjLCAweDFmN2JhLA0KLSAgICAweDFmN2QyLCAweDFmN2Q0LCAweDFmODlhLCAweDFmOGFlLCAweDFmOGIyLCAweDFmOGI0LCAweDFmOGQ2LCAweDFmOGVhLCAweDFmOTFhLCAweDFmOTJlLCAweDFmOTMyLCAweDFmOTM0LA0KLSAgICAweDFmOTRlLCAweDFmOTVjLCAweDFmOTYyLCAweDFmOTY0LCAweDFmOTY4LCAweDFmOTc2LCAweDFmOTk2LCAweDFmOWE2LCAweDFmOWFjLCAweDFmOWJhLCAweDFmOWNhLCAweDFmOWQyLA0KLSAgICAweDFmOWQ0LCAweDFmYTFhLCAweDFmYTJlLCAweDFmYTMyLCAweDFmYTM0LCAweDFmYTRlLCAweDFmYTVjLCAweDFmYTYyLCAweDFmYTY0LCAweDFmYTY4LCAweDFmYTc2LCAweDFmYThlLA0KLSAgICAweDFmYTljLCAweDFmYWI4LCAweDFmYWMyLCAweDFmYWM0LCAweDFmYWM4LCAweDFmYWQwLCAweDFmYWRlLCAweDFmYWU2LCAweDFmYWVjLCAweDFmYjE2LCAweDFmYjI2LCAweDFmYjJjLA0KLSAgICAweDFmYjNhLCAweDFmYjQ2LCAweDFmYjRjLCAweDFmYjU4LCAweDFmYjZlLCAweDFmYjcyLCAweDFmYjc0LCAweDFmYjhhLCAweDFmYjkyLCAweDFmYjk0LCAweDFmYmEyLCAweDFmYmE0LA0KLSAgICAweDFmYmE4LCAweDFmYmI2LCAweDFmYmRhDQotfTsNCisgICAgMHgxMDI1ZSwgMHgxMDI3YSwgMHgxMDI5ZSwgMHgxMDJiYywgMHgxMDJmMiwgMHgxMDJmNCwgMHgxMDMyZSwgMHgxMDM0ZSwNCisgICAgMHgxMDM1YywgMHgxMDM5NiwgMHgxMDNhNiwgMHgxMDNhYywgMHgxMDQyMiwgMHgxMDQyOCwgMHgxMDQzNiwgMHgxMDQ0MiwNCisgICAgMHgxMDQ0NCwgMHgxMDQ0OCwgMHgxMDQ1MCwgMHgxMDQ1ZSwgMHgxMDQ2NiwgMHgxMDQ2YywgMHgxMDQ3YSwgMHgxMDQ4MiwNCisgICAgMHgxMDQ5ZSwgMHgxMDRhMCwgMHgxMDRiYywgMHgxMDRjNiwgMHgxMDRkOCwgMHgxMDRlZSwgMHgxMDRmMiwgMHgxMDRmNCwNCisgICAgMHgxMDUwNCwgMHgxMDUwOCwgMHgxMDUxMCwgMHgxMDUxZSwgMHgxMDUyMCwgMHgxMDUzYywgMHgxMDU0MCwgMHgxMDU3OCwNCisgICAgMHgxMDU4NiwgMHgxMDU4YywgMHgxMDU5OCwgMHgxMDViMCwgMHgxMDViZSwgMHgxMDVjZSwgMHgxMDVkYywgMHgxMDVlMiwNCisgICAgMHgxMDVlNCwgMHgxMDVlOCwgMHgxMDVmNiwgMHgxMDYyZSwgMHgxMDY0ZSwgMHgxMDY1YywgMHgxMDY4ZSwgMHgxMDY5YywNCisgICAgMHgxMDZiOCwgMHgxMDZkZSwgMHgxMDZmYSwgMHgxMDcxNiwgMHgxMDcyNiwgMHgxMDcyYywgMHgxMDc0NiwgMHgxMDc0YywNCisgICAgMHgxMDc1OCwgMHgxMDc2ZSwgMHgxMDc5MiwgMHgxMDc5NCwgMHgxMDdhMiwgMHgxMDdhNCwgMHgxMDdhOCwgMHgxMDdiNiwNCisgICAgMHgxMDgyMiwgMHgxMDgyOCwgMHgxMDg0MiwgMHgxMDg0OCwgMHgxMDg1MCwgMHgxMDg1ZSwgMHgxMDg2NiwgMHgxMDg2YywNCisgICAgMHgxMDg3YSwgMHgxMDg4MiwgMHgxMDg4NCwgMHgxMDg5MCwgMHgxMDg5ZSwgMHgxMDhhMCwgMHgxMDhiYywgMHgxMDhjNiwNCisgICAgMHgxMDhjYywgMHgxMDhkOCwgMHgxMDhlZSwgMHgxMDhmMiwgMHgxMDhmNCwgMHgxMDkwMiwgMHgxMDkwOCwgMHgxMDkxZSwNCisgICAgMHgxMDkyMCwgMHgxMDkzYywgMHgxMDk0MCwgMHgxMDk3OCwgMHgxMDk4NiwgMHgxMDk5OCwgMHgxMDliMCwgMHgxMDliZSwNCisgICAgMHgxMDljZSwgMHgxMDlkYywgMHgxMDllMiwgMHgxMDllNCwgMHgxMDllOCwgMHgxMDlmNiwgMHgxMGEwOCwgMHgxMGExMCwNCisgICAgMHgxMGExZSwgMHgxMGEyMCwgMHgxMGEzYywgMHgxMGE0MCwgMHgxMGE3OCwgMHgxMGFmMCwgMHgxMGIwNiwgMHgxMGIwYywNCisgICAgMHgxMGIxOCwgMHgxMGIzMCwgMHgxMGIzZSwgMHgxMGI2MCwgMHgxMGI3YywgMHgxMGI4ZSwgMHgxMGI5YywgMHgxMGJiOCwNCisgICAgMHgxMGJjMiwgMHgxMGJjNCwgMHgxMGJjOCwgMHgxMGJkMCwgMHgxMGJkZSwgMHgxMGJlNiwgMHgxMGJlYywgMHgxMGMyZSwNCisgICAgMHgxMGM0ZSwgMHgxMGM1YywgMHgxMGM2MiwgMHgxMGM2NCwgMHgxMGM2OCwgMHgxMGM3NiwgMHgxMGM4ZSwgMHgxMGM5YywNCisgICAgMHgxMGNiOCwgMHgxMGNjMiwgMHgxMGNjNCwgMHgxMGNjOCwgMHgxMGNkMCwgMHgxMGNkZSwgMHgxMGNlNiwgMHgxMGNlYywNCisgICAgMHgxMGNmYSwgMHgxMGQwZSwgMHgxMGQxYywgMHgxMGQzOCwgMHgxMGQ3MCwgMHgxMGQ3ZSwgMHgxMGQ4MiwgMHgxMGQ4NCwNCisgICAgMHgxMGQ4OCwgMHgxMGQ5MCwgMHgxMGQ5ZSwgMHgxMGRhMCwgMHgxMGRiYywgMHgxMGRjNiwgMHgxMGRjYywgMHgxMGRkOCwNCisgICAgMHgxMGRlZSwgMHgxMGRmMiwgMHgxMGRmNCwgMHgxMGUxNiwgMHgxMGUyNiwgMHgxMGUyYywgMHgxMGU0NiwgMHgxMGU1OCwNCisgICAgMHgxMGU2ZSwgMHgxMGU4NiwgMHgxMGU4YywgMHgxMGU5OCwgMHgxMGViMCwgMHgxMGViZSwgMHgxMGVjZSwgMHgxMGVkYywNCisgICAgMHgxMGYwYSwgMHgxMGYxMiwgMHgxMGYxNCwgMHgxMGYyMiwgMHgxMGYyOCwgMHgxMGYzNiwgMHgxMGY0MiwgMHgxMGY0NCwNCisgICAgMHgxMGY0OCwgMHgxMGY1MCwgMHgxMGY1ZSwgMHgxMGY2NiwgMHgxMGY2YywgMHgxMGZiMiwgMHgxMGZiNCwgMHgxMTAyMiwNCisgICAgMHgxMTAyOCwgMHgxMTA0MiwgMHgxMTA0OCwgMHgxMTA1MCwgMHgxMTA1ZSwgMHgxMTA3YSwgMHgxMTA4MiwgMHgxMTA4NCwNCisgICAgMHgxMTA5MCwgMHgxMTA5ZSwgMHgxMTBhMCwgMHgxMTBiYywgMHgxMTBjNiwgMHgxMTBjYywgMHgxMTBkOCwgMHgxMTBlZSwNCisgICAgMHgxMTBmMiwgMHgxMTBmNCwgMHgxMTEwMiwgMHgxMTExZSwgMHgxMTEyMCwgMHgxMTEzYywgMHgxMTE0MCwgMHgxMTE3OCwNCisgICAgMHgxMTE4NiwgMHgxMTE5OCwgMHgxMTFiMCwgMHgxMTFiZSwgMHgxMTFjZSwgMHgxMTFkYywgMHgxMTFlMiwgMHgxMTFlNCwNCisgICAgMHgxMTFlOCwgMHgxMTFmNiwgMHgxMTIwOCwgMHgxMTIxZSwgMHgxMTIyMCwgMHgxMTI3OCwgMHgxMTJmMCwgMHgxMTMwYywNCisgICAgMHgxMTMzMCwgMHgxMTMzZSwgMHgxMTM2MCwgMHgxMTM3YywgMHgxMTM4ZSwgMHgxMTM5YywgMHgxMTNiOCwgMHgxMTNjMiwNCisgICAgMHgxMTNjOCwgMHgxMTNkMCwgMHgxMTNkZSwgMHgxMTNlNiwgMHgxMTNlYywgMHgxMTQwOCwgMHgxMTQxMCwgMHgxMTQxZSwNCisgICAgMHgxMTQyMCwgMHgxMTQzYywgMHgxMTQ0MCwgMHgxMTQ3OCwgMHgxMTRmMCwgMHgxMTVlMCwgMHgxMTYwYywgMHgxMTYxOCwNCisgICAgMHgxMTYzMCwgMHgxMTYzZSwgMHgxMTY2MCwgMHgxMTY3YywgMHgxMTZjMCwgMHgxMTZmOCwgMHgxMTcxYywgMHgxMTczOCwNCisgICAgMHgxMTc3MCwgMHgxMTc3ZSwgMHgxMTc4MiwgMHgxMTc4NCwgMHgxMTc4OCwgMHgxMTc5MCwgMHgxMTc5ZSwgMHgxMTdhMCwNCisgICAgMHgxMTdiYywgMHgxMTdjNiwgMHgxMTdjYywgMHgxMTdkOCwgMHgxMTdlZSwgMHgxMTgyZSwgMHgxMTgzNCwgMHgxMTg0ZSwNCisgICAgMHgxMTg1YywgMHgxMTg2MiwgMHgxMTg2NCwgMHgxMTg2OCwgMHgxMTg3NiwgMHgxMTg4ZSwgMHgxMTg5YywgMHgxMThiOCwNCisgICAgMHgxMThjMiwgMHgxMThjOCwgMHgxMThkMCwgMHgxMThkZSwgMHgxMThlNiwgMHgxMThlYywgMHgxMThmYSwgMHgxMTkwZSwNCisgICAgMHgxMTkxYywgMHgxMTkzOCwgMHgxMTk3MCwgMHgxMTk3ZSwgMHgxMTk4MiwgMHgxMTk4NCwgMHgxMTk5MCwgMHgxMTk5ZSwNCisgICAgMHgxMTlhMCwgMHgxMTliYywgMHgxMTljNiwgMHgxMTljYywgMHgxMTlkOCwgMHgxMTllZSwgMHgxMTlmMiwgMHgxMTlmNCwNCisgICAgMHgxMWEwZSwgMHgxMWExYywgMHgxMWEzOCwgMHgxMWE3MCwgMHgxMWE3ZSwgMHgxMWFlMCwgMHgxMWFmYywgMHgxMWIwOCwNCisgICAgMHgxMWIxMCwgMHgxMWIxZSwgMHgxMWIyMCwgMHgxMWIzYywgMHgxMWI0MCwgMHgxMWI3OCwgMHgxMWI4YywgMHgxMWI5OCwNCisgICAgMHgxMWJiMCwgMHgxMWJiZSwgMHgxMWJjZSwgMHgxMWJkYywgMHgxMWJlMiwgMHgxMWJlNCwgMHgxMWJlOCwgMHgxMWJmNiwNCisgICAgMHgxMWMxNiwgMHgxMWMyNiwgMHgxMWMyYywgMHgxMWM0NiwgMHgxMWM0YywgMHgxMWM1OCwgMHgxMWM2ZSwgMHgxMWM4NiwNCisgICAgMHgxMWM5OCwgMHgxMWNiMCwgMHgxMWNiZSwgMHgxMWNjZSwgMHgxMWNkYywgMHgxMWNlMiwgMHgxMWNlNCwgMHgxMWNlOCwNCisgICAgMHgxMWNmNiwgMHgxMWQwNiwgMHgxMWQwYywgMHgxMWQxOCwgMHgxMWQzMCwgMHgxMWQzZSwgMHgxMWQ2MCwgMHgxMWQ3YywNCisgICAgMHgxMWQ4ZSwgMHgxMWQ5YywgMHgxMWRiOCwgMHgxMWRjNCwgMHgxMWRjOCwgMHgxMWRkMCwgMHgxMWRkZSwgMHgxMWRlNiwNCisgICAgMHgxMWRlYywgMHgxMWRmYSwgMHgxMWUwYSwgMHgxMWUxMiwgMHgxMWUxNCwgMHgxMWUyMiwgMHgxMWUyNCwgMHgxMWUyOCwNCisgICAgMHgxMWUzNiwgMHgxMWU0MiwgMHgxMWU0NCwgMHgxMWU1MCwgMHgxMWU1ZSwgMHgxMWU2NiwgMHgxMWU2YywgMHgxMWU4MiwNCisgICAgMHgxMWU4NCwgMHgxMWU4OCwgMHgxMWU5MCwgMHgxMWU5ZSwgMHgxMWVhMCwgMHgxMWViYywgMHgxMWVjNiwgMHgxMWVjYywNCisgICAgMHgxMWVkOCwgMHgxMWVlZSwgMHgxMWYxYSwgMHgxMWYyZSwgMHgxMWYzMiwgMHgxMWYzNCwgMHgxMWY0ZSwgMHgxMWY1YywNCisgICAgMHgxMWY2MiwgMHgxMWY2NCwgMHgxMWY2OCwgMHgxMWY3NiwgMHgxMjA0OCwgMHgxMjA1ZSwgMHgxMjA4MiwgMHgxMjA4NCwNCisgICAgMHgxMjA5MCwgMHgxMjA5ZSwgMHgxMjBhMCwgMHgxMjBiYywgMHgxMjBkOCwgMHgxMjBmMiwgMHgxMjBmNCwgMHgxMjEwOCwNCisgICAgMHgxMjExZSwgMHgxMjEyMCwgMHgxMjEzYywgMHgxMjE0MCwgMHgxMjE3OCwgMHgxMjE4NiwgMHgxMjE5OCwgMHgxMjFiMCwNCisgICAgMHgxMjFiZSwgMHgxMjFlMiwgMHgxMjFlNCwgMHgxMjFlOCwgMHgxMjFmNiwgMHgxMjIwNCwgMHgxMjIxMCwgMHgxMjIxZSwNCisgICAgMHgxMjIyMCwgMHgxMjI3OCwgMHgxMjJmMCwgMHgxMjMwNiwgMHgxMjMwYywgMHgxMjMzMCwgMHgxMjMzZSwgMHgxMjM2MCwNCisgICAgMHgxMjM3YywgMHgxMjM4ZSwgMHgxMjM5YywgMHgxMjNiOCwgMHgxMjNjMiwgMHgxMjNjOCwgMHgxMjNkMCwgMHgxMjNlNiwNCisgICAgMHgxMjNlYywgMHgxMjQxZSwgMHgxMjQyMCwgMHgxMjQzYywgMHgxMjRmMCwgMHgxMjVlMCwgMHgxMjYxOCwgMHgxMjYzZSwNCisgICAgMHgxMjY2MCwgMHgxMjY3YywgMHgxMjZjMCwgMHgxMjZmOCwgMHgxMjczOCwgMHgxMjc3MCwgMHgxMjc3ZSwgMHgxMjc4MiwNCisgICAgMHgxMjc4NCwgMHgxMjc5MCwgMHgxMjc5ZSwgMHgxMjdhMCwgMHgxMjdiYywgMHgxMjdjNiwgMHgxMjdjYywgMHgxMjdkOCwNCisgICAgMHgxMjdlZSwgMHgxMjgyMCwgMHgxMjgzYywgMHgxMjg0MCwgMHgxMjg3OCwgMHgxMjhmMCwgMHgxMjllMCwgMHgxMmJjMCwNCisgICAgMHgxMmMxOCwgMHgxMmMzMCwgMHgxMmMzZSwgMHgxMmM2MCwgMHgxMmM3YywgMHgxMmNjMCwgMHgxMmNmOCwgMHgxMmRmMCwNCisgICAgMHgxMmUxYywgMHgxMmUzOCwgMHgxMmU3MCwgMHgxMmU3ZSwgMHgxMmVlMCwgMHgxMmVmYywgMHgxMmYwNCwgMHgxMmYwOCwNCisgICAgMHgxMmYxMCwgMHgxMmYyMCwgMHgxMmYzYywgMHgxMmY0MCwgMHgxMmY3OCwgMHgxMmY4NiwgMHgxMmY4YywgMHgxMmY5OCwNCisgICAgMHgxMmZiMCwgMHgxMmZiZSwgMHgxMmZjZSwgMHgxMmZkYywgMHgxMzAyZSwgMHgxMzA0ZSwgMHgxMzA1YywgMHgxMzA2MiwNCisgICAgMHgxMzA2OCwgMHgxMzA4ZSwgMHgxMzA5YywgMHgxMzBiOCwgMHgxMzBjMiwgMHgxMzBjOCwgMHgxMzBkMCwgMHgxMzBkZSwNCisgICAgMHgxMzBlYywgMHgxMzBmYSwgMHgxMzEwZSwgMHgxMzEzOCwgMHgxMzE3MCwgMHgxMzE3ZSwgMHgxMzE4MiwgMHgxMzE4NCwNCisgICAgMHgxMzE5MCwgMHgxMzE5ZSwgMHgxMzFhMCwgMHgxMzFiYywgMHgxMzFjNiwgMHgxMzFjYywgMHgxMzFkOCwgMHgxMzFmMiwNCisgICAgMHgxMzFmNCwgMHgxMzIwZSwgMHgxMzIxYywgMHgxMzI3MCwgMHgxMzI3ZSwgMHgxMzJlMCwgMHgxMzJmYywgMHgxMzMwOCwNCisgICAgMHgxMzMxZSwgMHgxMzMyMCwgMHgxMzMzYywgMHgxMzM0MCwgMHgxMzM3OCwgMHgxMzM4NiwgMHgxMzM5OCwgMHgxMzNiMCwNCisgICAgMHgxMzNiZSwgMHgxMzNjZSwgMHgxMzNkYywgMHgxMzNlMiwgMHgxMzNlNCwgMHgxMzNlOCwgMHgxMzNmNiwgMHgxMzQwZSwNCisgICAgMHgxMzQxYywgMHgxMzQzOCwgMHgxMzQ3MCwgMHgxMzQ3ZSwgMHgxMzRlMCwgMHgxMzRmYywgMHgxMzVjMCwgMHgxMzVmOCwNCisgICAgMHgxMzYwOCwgMHgxMzYxMCwgMHgxMzYxZSwgMHgxMzYyMCwgMHgxMzYzYywgMHgxMzY0MCwgMHgxMzY3OCwgMHgxMzZmMCwNCisgICAgMHgxMzcwYywgMHgxMzcxOCwgMHgxMzczMCwgMHgxMzczZSwgMHgxMzc2MCwgMHgxMzc3YywgMHgxMzc5YywgMHgxMzdiOCwNCisgICAgMHgxMzdjMiwgMHgxMzdjNCwgMHgxMzdjOCwgMHgxMzdkMCwgMHgxMzdkZSwgMHgxMzdlNiwgMHgxMzdlYywgMHgxMzgxNiwNCisgICAgMHgxMzgyNiwgMHgxMzgyYywgMHgxMzg0NiwgMHgxMzg0YywgMHgxMzg1OCwgMHgxMzg2ZSwgMHgxMzg3NCwgMHgxMzg4NiwNCisgICAgMHgxMzg5OCwgMHgxMzhiMCwgMHgxMzhiZSwgMHgxMzhjZSwgMHgxMzhkYywgMHgxMzhlMiwgMHgxMzhlNCwgMHgxMzhlOCwNCisgICAgMHgxMzkwNiwgMHgxMzkwYywgMHgxMzkzMCwgMHgxMzkzZSwgMHgxMzk2MCwgMHgxMzk3YywgMHgxMzk4ZSwgMHgxMzk5YywNCisgICAgMHgxMzliOCwgMHgxMzljOCwgMHgxMzlkMCwgMHgxMzlkZSwgMHgxMzllNiwgMHgxMzllYywgMHgxMzlmYSwgMHgxM2EwNiwNCisgICAgMHgxM2EwYywgMHgxM2ExOCwgMHgxM2EzMCwgMHgxM2EzZSwgMHgxM2E2MCwgMHgxM2E3YywgMHgxM2FjMCwgMHgxM2FmOCwNCisgICAgMHgxM2IwZSwgMHgxM2IxYywgMHgxM2IzOCwgMHgxM2I3MCwgMHgxM2I3ZSwgMHgxM2I4OCwgMHgxM2I5MCwgMHgxM2I5ZSwNCisgICAgMHgxM2JhMCwgMHgxM2JiYywgMHgxM2JjYywgMHgxM2JkOCwgMHgxM2JlZSwgMHgxM2JmMiwgMHgxM2JmNCwgMHgxM2MxMiwNCisgICAgMHgxM2MxNCwgMHgxM2MyMiwgMHgxM2MyNCwgMHgxM2MyOCwgMHgxM2MzNiwgMHgxM2M0MiwgMHgxM2M0OCwgMHgxM2M1MCwNCisgICAgMHgxM2M1ZSwgMHgxM2M2NiwgMHgxM2M2YywgMHgxM2M4MiwgMHgxM2M4NCwgMHgxM2M5MCwgMHgxM2M5ZSwgMHgxM2NhMCwNCisgICAgMHgxM2NiYywgMHgxM2NjNiwgMHgxM2NjYywgMHgxM2NkOCwgMHgxM2NlZSwgMHgxM2QwMiwgMHgxM2QwNCwgMHgxM2QwOCwNCisgICAgMHgxM2QxMCwgMHgxM2QxZSwgMHgxM2QyMCwgMHgxM2QzYywgMHgxM2Q0MCwgMHgxM2Q3OCwgMHgxM2Q4NiwgMHgxM2Q4YywNCisgICAgMHgxM2Q5OCwgMHgxM2RiMCwgMHgxM2RiZSwgMHgxM2RjZSwgMHgxM2RkYywgMHgxM2RlNCwgMHgxM2RlOCwgMHgxM2RmNiwNCisgICAgMHgxM2UxYSwgMHgxM2UyZSwgMHgxM2UzMiwgMHgxM2UzNCwgMHgxM2U0ZSwgMHgxM2U1YywgMHgxM2U2MiwgMHgxM2U2NCwNCisgICAgMHgxM2U2OCwgMHgxM2U3NiwgMHgxM2U4ZSwgMHgxM2U5YywgMHgxM2ViOCwgMHgxM2VjMiwgMHgxM2VjNCwgMHgxM2VjOCwNCisgICAgMHgxM2VkMCwgMHgxM2VkZSwgMHgxM2VlNiwgMHgxM2VlYywgMHgxM2YyNiwgMHgxM2YyYywgMHgxM2YzYSwgMHgxM2Y0NiwNCisgICAgMHgxM2Y0YywgMHgxM2Y1OCwgMHgxM2Y2ZSwgMHgxM2Y3MiwgMHgxM2Y3NCwgMHgxNDA4MiwgMHgxNDA5ZSwgMHgxNDBhMCwNCisgICAgMHgxNDBiYywgMHgxNDEwNCwgMHgxNDEwOCwgMHgxNDExMCwgMHgxNDExZSwgMHgxNDEyMCwgMHgxNDEzYywgMHgxNDE0MCwNCisgICAgMHgxNDE3OCwgMHgxNDE4YywgMHgxNDE5OCwgMHgxNDFiMCwgMHgxNDFiZSwgMHgxNDFlMiwgMHgxNDFlNCwgMHgxNDFlOCwNCisgICAgMHgxNDIwOCwgMHgxNDIxMCwgMHgxNDIxZSwgMHgxNDIyMCwgMHgxNDIzYywgMHgxNDI0MCwgMHgxNDI3OCwgMHgxNDJmMCwNCisgICAgMHgxNDMwNiwgMHgxNDMwYywgMHgxNDMxOCwgMHgxNDMzMCwgMHgxNDMzZSwgMHgxNDM2MCwgMHgxNDM3YywgMHgxNDM4ZSwNCisgICAgMHgxNDNjMiwgMHgxNDNjNCwgMHgxNDNjOCwgMHgxNDNkMCwgMHgxNDNlNiwgMHgxNDNlYywgMHgxNDQwOCwgMHgxNDQxMCwNCisgICAgMHgxNDQxZSwgMHgxNDQyMCwgMHgxNDQzYywgMHgxNDQ0MCwgMHgxNDQ3OCwgMHgxNDRmMCwgMHgxNDVlMCwgMHgxNDYwYywNCisgICAgMHgxNDYxOCwgMHgxNDYzMCwgMHgxNDYzZSwgMHgxNDY2MCwgMHgxNDY3YywgMHgxNDZjMCwgMHgxNDZmOCwgMHgxNDcxYywNCisgICAgMHgxNDczOCwgMHgxNDc3MCwgMHgxNDc3ZSwgMHgxNDc4MiwgMHgxNDc4NCwgMHgxNDc4OCwgMHgxNDc5MCwgMHgxNDdhMCwNCisgICAgMHgxNDdiYywgMHgxNDdjNiwgMHgxNDdjYywgMHgxNDdkOCwgMHgxNDdlZSwgMHgxNDgxMCwgMHgxNDgyMCwgMHgxNDgzYywNCisgICAgMHgxNDg0MCwgMHgxNDg3OCwgMHgxNDhmMCwgMHgxNDllMCwgMHgxNGJjMCwgMHgxNGMzMCwgMHgxNGMzZSwgMHgxNGM2MCwNCisgICAgMHgxNGM3YywgMHgxNGNjMCwgMHgxNGNmOCwgMHgxNGRmMCwgMHgxNGUzOCwgMHgxNGU3MCwgMHgxNGU3ZSwgMHgxNGVlMCwNCisgICAgMHgxNGVmYywgMHgxNGYwNCwgMHgxNGYwOCwgMHgxNGYxMCwgMHgxNGYxZSwgMHgxNGYyMCwgMHgxNGYzYywgMHgxNGY0MCwNCisgICAgMHgxNGY3OCwgMHgxNGY4NiwgMHgxNGY4YywgMHgxNGY5OCwgMHgxNGZiMCwgMHgxNGZjZSwgMHgxNGZkYywgMHgxNTAyMCwNCisgICAgMHgxNTA0MCwgMHgxNTA3OCwgMHgxNTBmMCwgMHgxNTFlMCwgMHgxNTNjMCwgMHgxNTg2MCwgMHgxNTg3YywgMHgxNThjMCwNCisgICAgMHgxNThmOCwgMHgxNTlmMCwgMHgxNWJlMCwgMHgxNWM3MCwgMHgxNWM3ZSwgMHgxNWNlMCwgMHgxNWNmYywgMHgxNWRjMCwNCisgICAgMHgxNWRmOCwgMHgxNWUwOCwgMHgxNWUxMCwgMHgxNWUyMCwgMHgxNWU0MCwgMHgxNWU3OCwgMHgxNWVmMCwgMHgxNWYwYywNCisgICAgMHgxNWYxOCwgMHgxNWYzMCwgMHgxNWY2MCwgMHgxNWY3YywgMHgxNWY4ZSwgMHgxNWY5YywgMHgxNWZiOCwgMHgxNjA0ZSwNCisgICAgMHgxNjA1YywgMHgxNjA4ZSwgMHgxNjA5YywgMHgxNjBiOCwgMHgxNjBjMiwgMHgxNjBjNCwgMHgxNjBjOCwgMHgxNjBkZSwNCisgICAgMHgxNjEwZSwgMHgxNjExYywgMHgxNjEzOCwgMHgxNjE3MCwgMHgxNjE3ZSwgMHgxNjE4NCwgMHgxNjE4OCwgMHgxNjE5MCwNCisgICAgMHgxNjE5ZSwgMHgxNjFhMCwgMHgxNjFiYywgMHgxNjFjNiwgMHgxNjFjYywgMHgxNjFkOCwgMHgxNjFmMiwgMHgxNjFmNCwNCisgICAgMHgxNjIwZSwgMHgxNjIxYywgMHgxNjIzOCwgMHgxNjI3MCwgMHgxNjI3ZSwgMHgxNjJlMCwgMHgxNjJmYywgMHgxNjMwNCwNCisgICAgMHgxNjMwOCwgMHgxNjMxMCwgMHgxNjMxZSwgMHgxNjMyMCwgMHgxNjMzYywgMHgxNjM0MCwgMHgxNjM3OCwgMHgxNjM4NiwNCisgICAgMHgxNjM4YywgMHgxNjM5OCwgMHgxNjNiMCwgMHgxNjNiZSwgMHgxNjNjZSwgMHgxNjNkYywgMHgxNjNlMiwgMHgxNjNlNCwNCisgICAgMHgxNjNlOCwgMHgxNjNmNiwgMHgxNjQwZSwgMHgxNjQxYywgMHgxNjQzOCwgMHgxNjQ3MCwgMHgxNjQ3ZSwgMHgxNjRlMCwNCisgICAgMHgxNjRmYywgMHgxNjVjMCwgMHgxNjVmOCwgMHgxNjYxMCwgMHgxNjYxZSwgMHgxNjYyMCwgMHgxNjYzYywgMHgxNjY0MCwNCisgICAgMHgxNjY3OCwgMHgxNjZmMCwgMHgxNjcxOCwgMHgxNjczMCwgMHgxNjczZSwgMHgxNjc2MCwgMHgxNjc3YywgMHgxNjc4ZSwNCisgICAgMHgxNjc5YywgMHgxNjdiOCwgMHgxNjdjMiwgMHgxNjdjNCwgMHgxNjdjOCwgMHgxNjdkMCwgMHgxNjdkZSwgMHgxNjdlNiwNCisgICAgMHgxNjdlYywgMHgxNjgxYywgMHgxNjgzOCwgMHgxNjg3MCwgMHgxNjhlMCwgMHgxNjhmYywgMHgxNjljMCwgMHgxNjlmOCwNCisgICAgMHgxNmJmMCwgMHgxNmMxMCwgMHgxNmMxZSwgMHgxNmMyMCwgMHgxNmMzYywgMHgxNmM0MCwgMHgxNmM3OCwgMHgxNmNmMCwNCisgICAgMHgxNmRlMCwgMHgxNmUxOCwgMHgxNmUzMCwgMHgxNmUzZSwgMHgxNmU2MCwgMHgxNmU3YywgMHgxNmVjMCwgMHgxNmVmOCwNCisgICAgMHgxNmYxYywgMHgxNmYzOCwgMHgxNmY3MCwgMHgxNmY3ZSwgMHgxNmY4NCwgMHgxNmY4OCwgMHgxNmY5MCwgMHgxNmY5ZSwNCisgICAgMHgxNmZhMCwgMHgxNmZiYywgMHgxNmZjNiwgMHgxNmZjYywgMHgxNmZkOCwgMHgxNzAyNiwgMHgxNzAyYywgMHgxNzA0NiwNCisgICAgMHgxNzA0YywgMHgxNzA1OCwgMHgxNzA2ZSwgMHgxNzA4NiwgMHgxNzA4YywgMHgxNzA5OCwgMHgxNzBiMCwgMHgxNzBiZSwNCisgICAgMHgxNzBjZSwgMHgxNzBkYywgMHgxNzBlOCwgMHgxNzEwNiwgMHgxNzEwYywgMHgxNzExOCwgMHgxNzEzMCwgMHgxNzEzZSwNCisgICAgMHgxNzE2MCwgMHgxNzE3YywgMHgxNzE4ZSwgMHgxNzE5YywgMHgxNzFiOCwgMHgxNzFjMiwgMHgxNzFjNCwgMHgxNzFjOCwNCisgICAgMHgxNzFkMCwgMHgxNzFkZSwgMHgxNzFlNiwgMHgxNzFlYywgMHgxNzFmYSwgMHgxNzIwNiwgMHgxNzIwYywgMHgxNzIxOCwNCisgICAgMHgxNzIzMCwgMHgxNzIzZSwgMHgxNzI2MCwgMHgxNzI3YywgMHgxNzJjMCwgMHgxNzJmOCwgMHgxNzMwZSwgMHgxNzMxYywNCisgICAgMHgxNzMzOCwgMHgxNzM3MCwgMHgxNzM3ZSwgMHgxNzM4OCwgMHgxNzM5MCwgMHgxNzM5ZSwgMHgxNzNhMCwgMHgxNzNiYywNCisgICAgMHgxNzNjYywgMHgxNzNkOCwgMHgxNzNlZSwgMHgxNzNmMiwgMHgxNzNmNCwgMHgxNzQwYywgMHgxNzQxOCwgMHgxNzQzMCwNCisgICAgMHgxNzQzZSwgMHgxNzQ2MCwgMHgxNzQ3YywgMHgxNzRjMCwgMHgxNzRmOCwgMHgxNzVmMCwgMHgxNzYwZSwgMHgxNzYxYywNCisgICAgMHgxNzYzOCwgMHgxNzY3MCwgMHgxNzY3ZSwgMHgxNzZlMCwgMHgxNzZmYywgMHgxNzcwOCwgMHgxNzcxMCwgMHgxNzcxZSwNCisgICAgMHgxNzcyMCwgMHgxNzczYywgMHgxNzc0MCwgMHgxNzc3OCwgMHgxNzc5OCwgMHgxNzdiMCwgMHgxNzdiZSwgMHgxNzdkYywNCisgICAgMHgxNzdlMiwgMHgxNzdlNCwgMHgxNzdlOCwgMHgxNzgyMiwgMHgxNzgyNCwgMHgxNzgyOCwgMHgxNzgzNiwgMHgxNzg0MiwNCisgICAgMHgxNzg0NCwgMHgxNzg0OCwgMHgxNzg1MCwgMHgxNzg1ZSwgMHgxNzg2NiwgMHgxNzg2YywgMHgxNzg4MiwgMHgxNzg4NCwNCisgICAgMHgxNzg4OCwgMHgxNzg5MCwgMHgxNzg5ZSwgMHgxNzhhMCwgMHgxNzhiYywgMHgxNzhjNiwgMHgxNzhjYywgMHgxNzhkOCwNCisgICAgMHgxNzhlZSwgMHgxNzhmMiwgMHgxNzhmNCwgMHgxNzkwMiwgMHgxNzkwNCwgMHgxNzkwOCwgMHgxNzkxMCwgMHgxNzkxZSwNCisgICAgMHgxNzkyMCwgMHgxNzkzYywgMHgxNzk0MCwgMHgxNzk3OCwgMHgxNzk4NiwgMHgxNzk4YywgMHgxNzk5OCwgMHgxNzliMCwNCisgICAgMHgxNzliZSwgMHgxNzljZSwgMHgxNzlkYywgMHgxNzllMiwgMHgxNzllNCwgMHgxNzllOCwgMHgxNzlmNiwgMHgxN2EwNCwNCisgICAgMHgxN2EwOCwgMHgxN2ExMCwgMHgxN2ExZSwgMHgxN2EyMCwgMHgxN2EzYywgMHgxN2E0MCwgMHgxN2E3OCwgMHgxN2FmMCwNCisgICAgMHgxN2IwNiwgMHgxN2IwYywgMHgxN2IxOCwgMHgxN2IzMCwgMHgxN2IzZSwgMHgxN2I2MCwgMHgxN2I3YywgMHgxN2I4ZSwNCisgICAgMHgxN2I5YywgMHgxN2JiOCwgMHgxN2JjNCwgMHgxN2JjOCwgMHgxN2JkMCwgMHgxN2JkZSwgMHgxN2JlNiwgMHgxN2JlYywNCisgICAgMHgxN2MyZSwgMHgxN2MzMiwgMHgxN2MzNCwgMHgxN2M0ZSwgMHgxN2M1YywgMHgxN2M2MiwgMHgxN2M2NCwgMHgxN2M2OCwNCisgICAgMHgxN2M3NiwgMHgxN2M4ZSwgMHgxN2M5YywgMHgxN2NiOCwgMHgxN2NjMiwgMHgxN2NjNCwgMHgxN2NjOCwgMHgxN2NkMCwNCisgICAgMHgxN2NkZSwgMHgxN2NlNiwgMHgxN2NlYywgMHgxN2QwZSwgMHgxN2QxYywgMHgxN2QzOCwgMHgxN2Q3MCwgMHgxN2Q4MiwNCisgICAgMHgxN2Q4NCwgMHgxN2Q4OCwgMHgxN2Q5MCwgMHgxN2Q5ZSwgMHgxN2RhMCwgMHgxN2RiYywgMHgxN2RjNiwgMHgxN2RjYywNCisgICAgMHgxN2RkOCwgMHgxN2RlZSwgMHgxN2UyNiwgMHgxN2UyYywgMHgxN2UzYSwgMHgxN2U0NiwgMHgxN2U0YywgMHgxN2U1OCwNCisgICAgMHgxN2U2ZSwgMHgxN2U3MiwgMHgxN2U3NCwgMHgxN2U4NiwgMHgxN2U4YywgMHgxN2U5OCwgMHgxN2ViMCwgMHgxN2VjZSwNCisgICAgMHgxN2VkYywgMHgxN2VlMiwgMHgxN2VlNCwgMHgxN2VlOCwgMHgxN2VmNiwgMHgxODEzYSwgMHgxODE3MiwgMHgxODE3NCwNCisgICAgMHgxODIxNiwgMHgxODIyNiwgMHgxODIzYSwgMHgxODI0YywgMHgxODI1OCwgMHgxODI2ZSwgMHgxODI3MiwgMHgxODI3NCwNCisgICAgMHgxODI5OCwgMHgxODJiZSwgMHgxODJlMiwgMHgxODJlNCwgMHgxODJlOCwgMHgxODJmNiwgMHgxODM1ZSwgMHgxODM3YSwNCisgICAgMHgxODNhZSwgMHgxODNkNiwgMHgxODQxNiwgMHgxODQyNiwgMHgxODQyYywgMHgxODQzYSwgMHgxODQ0NiwgMHgxODQ1OCwNCisgICAgMHgxODQ2ZSwgMHgxODQ3MiwgMHgxODQ3NCwgMHgxODQ4NiwgMHgxODRiMCwgMHgxODRiZSwgMHgxODRjZSwgMHgxODRkYywNCisgICAgMHgxODRlMiwgMHgxODRlNCwgMHgxODRlOCwgMHgxODRmNiwgMHgxODUwNiwgMHgxODUwYywgMHgxODUxOCwgMHgxODUzMCwNCisgICAgMHgxODUzZSwgMHgxODU2MCwgMHgxODU3YywgMHgxODU4ZSwgMHgxODU5YywgMHgxODViOCwgMHgxODVjMiwgMHgxODVjNCwNCisgICAgMHgxODVjOCwgMHgxODVkMCwgMHgxODVkZSwgMHgxODVlNiwgMHgxODVlYywgMHgxODVmYSwgMHgxODYxMiwgMHgxODYxNCwNCisgICAgMHgxODYyMiwgMHgxODYyOCwgMHgxODYzNiwgMHgxODY0MiwgMHgxODY1MCwgMHgxODY1ZSwgMHgxODY3YSwgMHgxODY4MiwNCisgICAgMHgxODY4NCwgMHgxODY4OCwgMHgxODY5MCwgMHgxODY5ZSwgMHgxODZhMCwgMHgxODZiYywgMHgxODZjNiwgMHgxODZjYywNCisgICAgMHgxODZkOCwgMHgxODZlZSwgMHgxODZmMiwgMHgxODZmNCwgMHgxODcyZSwgMHgxODc0ZSwgMHgxODc1YywgMHgxODc5NiwNCisgICAgMHgxODdhNiwgMHgxODdhYywgMHgxODdkMiwgMHgxODdkNCwgMHgxODgyNiwgMHgxODgyYywgMHgxODgzYSwgMHgxODg0NiwNCisgICAgMHgxODg0YywgMHgxODg1OCwgMHgxODg2ZSwgMHgxODg3MiwgMHgxODg3NCwgMHgxODg4NiwgMHgxODg5OCwgMHgxODhiMCwNCisgICAgMHgxODhiZSwgMHgxODhjZSwgMHgxODhkYywgMHgxODhlMiwgMHgxODhlNCwgMHgxODhlOCwgMHgxODhmNiwgMHgxODkwYywNCisgICAgMHgxODkzMCwgMHgxODkzZSwgMHgxODk2MCwgMHgxODk3YywgMHgxODk4ZSwgMHgxODliOCwgMHgxODljMiwgMHgxODljOCwNCisgICAgMHgxODlkMCwgMHgxODlkZSwgMHgxODllNiwgMHgxODllYywgMHgxODlmYSwgMHgxOGExOCwgMHgxOGEzMCwgMHgxOGEzZSwNCisgICAgMHgxOGE2MCwgMHgxOGE3YywgMHgxOGFjMCwgMHgxOGFmOCwgMHgxOGIxYywgMHgxOGIzOCwgMHgxOGI3MCwgMHgxOGI3ZSwNCisgICAgMHgxOGI4MiwgMHgxOGI4NCwgMHgxOGI4OCwgMHgxOGI5MCwgMHgxOGI5ZSwgMHgxOGJhMCwgMHgxOGJiYywgMHgxOGJjNiwNCisgICAgMHgxOGJjYywgMHgxOGJkOCwgMHgxOGJlZSwgMHgxOGJmMiwgMHgxOGJmNCwgMHgxOGMyMiwgMHgxOGMyNCwgMHgxOGMyOCwNCisgICAgMHgxOGMzNiwgMHgxOGM0MiwgMHgxOGM0OCwgMHgxOGM1MCwgMHgxOGM1ZSwgMHgxOGM2NiwgMHgxOGM3YSwgMHgxOGM4MiwNCisgICAgMHgxOGM4NCwgMHgxOGM5MCwgMHgxOGM5ZSwgMHgxOGNhMCwgMHgxOGNiYywgMHgxOGNjYywgMHgxOGNmMiwgMHgxOGNmNCwNCisgICAgMHgxOGQwNCwgMHgxOGQwOCwgMHgxOGQxMCwgMHgxOGQxZSwgMHgxOGQyMCwgMHgxOGQzYywgMHgxOGQ0MCwgMHgxOGQ3OCwNCisgICAgMHgxOGQ4NiwgMHgxOGQ5OCwgMHgxOGRjZSwgMHgxOGRlMiwgMHgxOGRlNCwgMHgxOGRlOCwgMHgxOGUyZSwgMHgxOGUzMiwNCisgICAgMHgxOGUzNCwgMHgxOGU0ZSwgMHgxOGU1YywgMHgxOGU2MiwgMHgxOGU2NCwgMHgxOGU2OCwgMHgxOGU4ZSwgMHgxOGU5YywNCisgICAgMHgxOGViOCwgMHgxOGVjMiwgMHgxOGVjNCwgMHgxOGVjOCwgMHgxOGVkMCwgMHgxOGVmYSwgMHgxOGYxNiwgMHgxOGYyNiwNCisgICAgMHgxOGYyYywgMHgxOGY0NiwgMHgxOGY0YywgMHgxOGY1OCwgMHgxOGY2ZSwgMHgxOGY4YSwgMHgxOGY5MiwgMHgxOGY5NCwNCisgICAgMHgxOGZhMiwgMHgxOGZhNCwgMHgxOGZhOCwgMHgxOGZiNiwgMHgxOTAyYywgMHgxOTAzYSwgMHgxOTA0NiwgMHgxOTA0YywNCisgICAgMHgxOTA1OCwgMHgxOTA3MiwgMHgxOTA3NCwgMHgxOTA4NiwgMHgxOTA5OCwgMHgxOTBiMCwgMHgxOTBiZSwgMHgxOTBjZSwNCisgICAgMHgxOTBkYywgMHgxOTBlMiwgMHgxOTBlOCwgMHgxOTBmNiwgMHgxOTEwNiwgMHgxOTEwYywgMHgxOTEzMCwgMHgxOTEzZSwNCisgICAgMHgxOTE2MCwgMHgxOTE3YywgMHgxOTE4ZSwgMHgxOTE5YywgMHgxOTFiOCwgMHgxOTFjMiwgMHgxOTFjOCwgMHgxOTFkMCwNCisgICAgMHgxOTFkZSwgMHgxOTFlNiwgMHgxOTFlYywgMHgxOTFmYSwgMHgxOTIxOCwgMHgxOTIzZSwgMHgxOTI2MCwgMHgxOTI3YywNCisgICAgMHgxOTJjMCwgMHgxOTJmOCwgMHgxOTMzOCwgMHgxOTM3MCwgMHgxOTM3ZSwgMHgxOTM4MiwgMHgxOTM4NCwgMHgxOTM5MCwNCisgICAgMHgxOTM5ZSwgMHgxOTNhMCwgMHgxOTNiYywgMHgxOTNjNiwgMHgxOTNjYywgMHgxOTNkOCwgMHgxOTNlZSwgMHgxOTNmMiwNCisgICAgMHgxOTNmNCwgMHgxOTQzMCwgMHgxOTQzZSwgMHgxOTQ2MCwgMHgxOTQ3YywgMHgxOTRjMCwgMHgxOTRmOCwgMHgxOTVmMCwNCisgICAgMHgxOTYzOCwgMHgxOTY3MCwgMHgxOTY3ZSwgMHgxOTZlMCwgMHgxOTZmYywgMHgxOTcwMiwgMHgxOTcwNCwgMHgxOTcwOCwNCisgICAgMHgxOTcxMCwgMHgxOTcyMCwgMHgxOTczYywgMHgxOTc0MCwgMHgxOTc3OCwgMHgxOTc4NiwgMHgxOTc4YywgMHgxOTc5OCwNCisgICAgMHgxOTdiMCwgMHgxOTdiZSwgMHgxOTdjZSwgMHgxOTdkYywgMHgxOTdlMiwgMHgxOTdlNCwgMHgxOTdlOCwgMHgxOTgyMiwNCisgICAgMHgxOTgyNCwgMHgxOTg0MiwgMHgxOTg0OCwgMHgxOTg1MCwgMHgxOTg1ZSwgMHgxOTg2NiwgMHgxOTg3YSwgMHgxOTg4MiwNCisgICAgMHgxOTg4NCwgMHgxOTg5MCwgMHgxOTg5ZSwgMHgxOThhMCwgMHgxOThiYywgMHgxOThjYywgMHgxOThmMiwgMHgxOThmNCwNCisgICAgMHgxOTkwMiwgMHgxOTkwOCwgMHgxOTkxZSwgMHgxOTkyMCwgMHgxOTkzYywgMHgxOTk0MCwgMHgxOTk3OCwgMHgxOTk4NiwNCisgICAgMHgxOTk5OCwgMHgxOTljZSwgMHgxOTllMiwgMHgxOTllNCwgMHgxOTllOCwgMHgxOWEwOCwgMHgxOWExMCwgMHgxOWExZSwNCisgICAgMHgxOWEyMCwgMHgxOWEzYywgMHgxOWE0MCwgMHgxOWE3OCwgMHgxOWFmMCwgMHgxOWIxOCwgMHgxOWIzZSwgMHgxOWI2MCwNCisgICAgMHgxOWI5YywgMHgxOWJjMiwgMHgxOWJjNCwgMHgxOWJjOCwgMHgxOWJkMCwgMHgxOWJlNiwgMHgxOWMyZSwgMHgxOWMzNCwNCisgICAgMHgxOWM0ZSwgMHgxOWM1YywgMHgxOWM2MiwgMHgxOWM2NCwgMHgxOWM2OCwgMHgxOWM4ZSwgMHgxOWM5YywgMHgxOWNiOCwNCisgICAgMHgxOWNjMiwgMHgxOWNjOCwgMHgxOWNkMCwgMHgxOWNlNiwgMHgxOWNmYSwgMHgxOWQwZSwgMHgxOWQxYywgMHgxOWQzOCwNCisgICAgMHgxOWQ3MCwgMHgxOWQ3ZSwgMHgxOWQ4MiwgMHgxOWQ4NCwgMHgxOWQ4OCwgMHgxOWQ5MCwgMHgxOWRhMCwgMHgxOWRjYywNCisgICAgMHgxOWRmMiwgMHgxOWRmNCwgMHgxOWUxNiwgMHgxOWUyNiwgMHgxOWUyYywgMHgxOWU0NiwgMHgxOWU0YywgMHgxOWU1OCwNCisgICAgMHgxOWU3NCwgMHgxOWU4NiwgMHgxOWU4YywgMHgxOWU5OCwgMHgxOWViMCwgMHgxOWViZSwgMHgxOWVjZSwgMHgxOWVlMiwNCisgICAgMHgxOWVlNCwgMHgxOWVlOCwgMHgxOWYwYSwgMHgxOWYxMiwgMHgxOWYxNCwgMHgxOWYyMiwgMHgxOWYyNCwgMHgxOWYyOCwNCisgICAgMHgxOWY0MiwgMHgxOWY0NCwgMHgxOWY0OCwgMHgxOWY1MCwgMHgxOWY1ZSwgMHgxOWY2YywgMHgxOWY5YSwgMHgxOWZhZSwNCisgICAgMHgxOWZiMiwgMHgxOWZiNCwgMHgxYTA0NiwgMHgxYTA0YywgMHgxYTA3MiwgMHgxYTA3NCwgMHgxYTA4NiwgMHgxYTA4YywNCisgICAgMHgxYTA5OCwgMHgxYTBiMCwgMHgxYTBiZSwgMHgxYTBlMiwgMHgxYTBlNCwgMHgxYTBlOCwgMHgxYTBmNiwgMHgxYTEwNiwNCisgICAgMHgxYTEwYywgMHgxYTExOCwgMHgxYTEzMCwgMHgxYTEzZSwgMHgxYTE2MCwgMHgxYTE3YywgMHgxYTE4ZSwgMHgxYTE5YywNCisgICAgMHgxYTFiOCwgMHgxYTFjMiwgMHgxYTFjNCwgMHgxYTFjOCwgMHgxYTFkMCwgMHgxYTFkZSwgMHgxYTFlNiwgMHgxYTFlYywNCisgICAgMHgxYTIxOCwgMHgxYTIzMCwgMHgxYTIzZSwgMHgxYTI2MCwgMHgxYTI3YywgMHgxYTJjMCwgMHgxYTJmOCwgMHgxYTMxYywNCisgICAgMHgxYTMzOCwgMHgxYTM3MCwgMHgxYTM3ZSwgMHgxYTM4MiwgMHgxYTM4NCwgMHgxYTM4OCwgMHgxYTM5MCwgMHgxYTM5ZSwNCisgICAgMHgxYTNhMCwgMHgxYTNiYywgMHgxYTNjNiwgMHgxYTNjYywgMHgxYTNkOCwgMHgxYTNlZSwgMHgxYTNmMiwgMHgxYTNmNCwNCisgICAgMHgxYTQxOCwgMHgxYTQzMCwgMHgxYTQzZSwgMHgxYTQ2MCwgMHgxYTQ3YywgMHgxYTRjMCwgMHgxYTRmOCwgMHgxYTVmMCwNCisgICAgMHgxYTYxYywgMHgxYTYzOCwgMHgxYTY3MCwgMHgxYTY3ZSwgMHgxYTZlMCwgMHgxYTZmYywgMHgxYTcwMiwgMHgxYTcwNCwNCisgICAgMHgxYTcwOCwgMHgxYTcxMCwgMHgxYTcxZSwgMHgxYTcyMCwgMHgxYTczYywgMHgxYTc0MCwgMHgxYTc3OCwgMHgxYTc4NiwNCisgICAgMHgxYTc4YywgMHgxYTc5OCwgMHgxYTdiMCwgMHgxYTdiZSwgMHgxYTdjZSwgMHgxYTdkYywgMHgxYTdlMiwgMHgxYTdlNCwNCisgICAgMHgxYTdlOCwgMHgxYTgzMCwgMHgxYTg2MCwgMHgxYTg3YywgMHgxYThjMCwgMHgxYThmOCwgMHgxYTlmMCwgMHgxYWJlMCwNCisgICAgMHgxYWM3MCwgMHgxYWM3ZSwgMHgxYWNlMCwgMHgxYWNmYywgMHgxYWRjMCwgMHgxYWRmOCwgMHgxYWUwNCwgMHgxYWUwOCwNCisgICAgMHgxYWUxMCwgMHgxYWUyMCwgMHgxYWUzYywgMHgxYWU0MCwgMHgxYWU3OCwgMHgxYWVmMCwgMHgxYWYwNiwgMHgxYWYwYywNCisgICAgMHgxYWYxOCwgMHgxYWYzMCwgMHgxYWYzZSwgMHgxYWY2MCwgMHgxYWY3YywgMHgxYWY4ZSwgMHgxYWY5YywgMHgxYWZiOCwNCisgICAgMHgxYWZjNCwgMHgxYWZjOCwgMHgxYWZkMCwgMHgxYWZkZSwgMHgxYjA0MiwgMHgxYjA1ZSwgMHgxYjA3YSwgMHgxYjA4MiwNCisgICAgMHgxYjA4NCwgMHgxYjA4OCwgMHgxYjA5MCwgMHgxYjA5ZSwgMHgxYjBhMCwgMHgxYjBiYywgMHgxYjBjYywgMHgxYjBmMiwNCisgICAgMHgxYjBmNCwgMHgxYjEwMiwgMHgxYjEwNCwgMHgxYjEwOCwgMHgxYjExMCwgMHgxYjExZSwgMHgxYjEyMCwgMHgxYjEzYywNCisgICAgMHgxYjE0MCwgMHgxYjE3OCwgMHgxYjE4NiwgMHgxYjE5OCwgMHgxYjFjZSwgMHgxYjFlMiwgMHgxYjFlNCwgMHgxYjFlOCwNCisgICAgMHgxYjIwNCwgMHgxYjIwOCwgMHgxYjIxMCwgMHgxYjIxZSwgMHgxYjIyMCwgMHgxYjIzYywgMHgxYjI0MCwgMHgxYjI3OCwNCisgICAgMHgxYjJmMCwgMHgxYjMwYywgMHgxYjMzZSwgMHgxYjM2MCwgMHgxYjM5YywgMHgxYjNjMiwgMHgxYjNjNCwgMHgxYjNjOCwNCisgICAgMHgxYjNkMCwgMHgxYjNlNiwgMHgxYjQxMCwgMHgxYjQxZSwgMHgxYjQyMCwgMHgxYjQzYywgMHgxYjQ0MCwgMHgxYjQ3OCwNCisgICAgMHgxYjRmMCwgMHgxYjVlMCwgMHgxYjYxOCwgMHgxYjY2MCwgMHgxYjY3YywgMHgxYjZjMCwgMHgxYjczOCwgMHgxYjc4MiwNCisgICAgMHgxYjc4NCwgMHgxYjc4OCwgMHgxYjc5MCwgMHgxYjc5ZSwgMHgxYjdhMCwgMHgxYjdjYywgMHgxYjgyZSwgMHgxYjg0ZSwNCisgICAgMHgxYjg1YywgMHgxYjg4ZSwgMHgxYjg5YywgMHgxYjhiOCwgMHgxYjhjMiwgMHgxYjhjNCwgMHgxYjhjOCwgMHgxYjhkMCwNCisgICAgMHgxYjhlNiwgMHgxYjhmYSwgMHgxYjkwZSwgMHgxYjkxYywgMHgxYjkzOCwgMHgxYjk3MCwgMHgxYjk3ZSwgMHgxYjk4MiwNCisgICAgMHgxYjk4NCwgMHgxYjk4OCwgMHgxYjk5MCwgMHgxYjk5ZSwgMHgxYjlhMCwgMHgxYjljYywgMHgxYjlmMiwgMHgxYjlmNCwNCisgICAgMHgxYmEwZSwgMHgxYmExYywgMHgxYmEzOCwgMHgxYmE3MCwgMHgxYmE3ZSwgMHgxYmFlMCwgMHgxYmFmYywgMHgxYmIwOCwNCisgICAgMHgxYmIxMCwgMHgxYmIyMCwgMHgxYmIzYywgMHgxYmI0MCwgMHgxYmI5OCwgMHgxYmJjZSwgMHgxYmJlMiwgMHgxYmJlNCwNCisgICAgMHgxYmJlOCwgMHgxYmMxNiwgMHgxYmMyNiwgMHgxYmMyYywgMHgxYmM0NiwgMHgxYmM0YywgMHgxYmM1OCwgMHgxYmM3MiwNCisgICAgMHgxYmM3NCwgMHgxYmM4NiwgMHgxYmM4YywgMHgxYmM5OCwgMHgxYmNiMCwgMHgxYmNiZSwgMHgxYmNjZSwgMHgxYmNlMiwNCisgICAgMHgxYmNlNCwgMHgxYmNlOCwgMHgxYmQwNiwgMHgxYmQwYywgMHgxYmQxOCwgMHgxYmQzMCwgMHgxYmQzZSwgMHgxYmQ2MCwNCisgICAgMHgxYmQ3YywgMHgxYmQ5YywgMHgxYmRjMiwgMHgxYmRjNCwgMHgxYmRjOCwgMHgxYmRkMCwgMHgxYmRlNiwgMHgxYmRmYSwNCisgICAgMHgxYmUxMiwgMHgxYmUxNCwgMHgxYmUyMiwgMHgxYmUyNCwgMHgxYmUyOCwgMHgxYmU0MiwgMHgxYmU0NCwgMHgxYmU0OCwNCisgICAgMHgxYmU1MCwgMHgxYmU1ZSwgMHgxYmU2NiwgMHgxYmU4MiwgMHgxYmU4NCwgMHgxYmU4OCwgMHgxYmU5MCwgMHgxYmU5ZSwNCisgICAgMHgxYmVhMCwgMHgxYmViYywgMHgxYmVjYywgMHgxYmVmNCwgMHgxYmYxYSwgMHgxYmYyZSwgMHgxYmYzMiwgMHgxYmYzNCwNCisgICAgMHgxYmY0ZSwgMHgxYmY1YywgMHgxYmY2MiwgMHgxYmY2NCwgMHgxYmY2OCwgMHgxYzA5YSwgMHgxYzBiMiwgMHgxYzBiNCwNCisgICAgMHgxYzExYSwgMHgxYzEzMiwgMHgxYzEzNCwgMHgxYzE2MiwgMHgxYzE2NCwgMHgxYzE2OCwgMHgxYzE3NiwgMHgxYzFiYSwNCisgICAgMHgxYzIxYSwgMHgxYzIzMiwgMHgxYzIzNCwgMHgxYzI0ZSwgMHgxYzI1YywgMHgxYzI2MiwgMHgxYzI2NCwgMHgxYzI2OCwNCisgICAgMHgxYzI3NiwgMHgxYzI4ZSwgMHgxYzJjMiwgMHgxYzJjNCwgMHgxYzJjOCwgMHgxYzJkMCwgMHgxYzJkZSwgMHgxYzJlNiwNCisgICAgMHgxYzJlYywgMHgxYzJmYSwgMHgxYzMxNiwgMHgxYzMyNiwgMHgxYzMzYSwgMHgxYzM0NiwgMHgxYzM0YywgMHgxYzM3MiwNCisgICAgMHgxYzM3NCwgMHgxYzQxYSwgMHgxYzQyZSwgMHgxYzQzMiwgMHgxYzQzNCwgMHgxYzQ0ZSwgMHgxYzQ1YywgMHgxYzQ2MiwNCisgICAgMHgxYzQ2NCwgMHgxYzQ2OCwgMHgxYzQ3NiwgMHgxYzQ4ZSwgMHgxYzQ5YywgMHgxYzRiOCwgMHgxYzRjMiwgMHgxYzRjOCwNCisgICAgMHgxYzRkMCwgMHgxYzRkZSwgMHgxYzRlNiwgMHgxYzRlYywgMHgxYzRmYSwgMHgxYzUxYywgMHgxYzUzOCwgMHgxYzU3MCwNCisgICAgMHgxYzU3ZSwgMHgxYzU4MiwgMHgxYzU4NCwgMHgxYzU4OCwgMHgxYzU5MCwgMHgxYzU5ZSwgMHgxYzVhMCwgMHgxYzViYywNCisgICAgMHgxYzVjNiwgMHgxYzVjYywgMHgxYzVkOCwgMHgxYzVlZSwgMHgxYzVmMiwgMHgxYzVmNCwgMHgxYzYxNiwgMHgxYzYyNiwNCisgICAgMHgxYzYyYywgMHgxYzYzYSwgMHgxYzY0NiwgMHgxYzY0YywgMHgxYzY1OCwgMHgxYzY2ZSwgMHgxYzY3MiwgMHgxYzY3NCwNCisgICAgMHgxYzY4NiwgMHgxYzY4YywgMHgxYzY5OCwgMHgxYzZiMCwgMHgxYzZiZSwgMHgxYzZjZSwgMHgxYzZkYywgMHgxYzZlMiwNCisgICAgMHgxYzZlNCwgMHgxYzZlOCwgMHgxYzcxMiwgMHgxYzcxNCwgMHgxYzcyMiwgMHgxYzcyOCwgMHgxYzczNiwgMHgxYzc0MiwNCisgICAgMHgxYzc0NCwgMHgxYzc0OCwgMHgxYzc1MCwgMHgxYzc1ZSwgMHgxYzc2NiwgMHgxYzc2YywgMHgxYzc3YSwgMHgxYzdhZSwNCisgICAgMHgxYzdkNiwgMHgxYzdlYSwgMHgxYzgxYSwgMHgxYzgyZSwgMHgxYzgzMiwgMHgxYzgzNCwgMHgxYzg0ZSwgMHgxYzg1YywNCisgICAgMHgxYzg2MiwgMHgxYzg2NCwgMHgxYzg2OCwgMHgxYzg3NiwgMHgxYzg4ZSwgMHgxYzg5YywgMHgxYzhiOCwgMHgxYzhjMiwNCisgICAgMHgxYzhjOCwgMHgxYzhkMCwgMHgxYzhkZSwgMHgxYzhlNiwgMHgxYzhlYywgMHgxYzhmYSwgMHgxYzkwZSwgMHgxYzkzOCwNCisgICAgMHgxYzk3MCwgMHgxYzk3ZSwgMHgxYzk4MiwgMHgxYzk4NCwgMHgxYzk5MCwgMHgxYzk5ZSwgMHgxYzlhMCwgMHgxYzliYywNCisgICAgMHgxYzljNiwgMHgxYzljYywgMHgxYzlkOCwgMHgxYzllZSwgMHgxYzlmMiwgMHgxYzlmNCwgMHgxY2EzOCwgMHgxY2E3MCwNCisgICAgMHgxY2E3ZSwgMHgxY2FlMCwgMHgxY2FmYywgMHgxY2IwMiwgMHgxY2IwNCwgMHgxY2IwOCwgMHgxY2IxMCwgMHgxY2IyMCwNCisgICAgMHgxY2IzYywgMHgxY2I0MCwgMHgxY2I3OCwgMHgxY2I4NiwgMHgxY2I4YywgMHgxY2I5OCwgMHgxY2JiMCwgMHgxY2JiZSwNCisgICAgMHgxY2JjZSwgMHgxY2JkYywgMHgxY2JlMiwgMHgxY2JlNCwgMHgxY2JlOCwgMHgxY2JmNiwgMHgxY2MxNiwgMHgxY2MyNiwNCisgICAgMHgxY2MyYywgMHgxY2MzYSwgMHgxY2M0NiwgMHgxY2M1OCwgMHgxY2M3MiwgMHgxY2M3NCwgMHgxY2M4NiwgMHgxY2NiMCwNCisgICAgMHgxY2NiZSwgMHgxY2NjZSwgMHgxY2NlMiwgMHgxY2NlNCwgMHgxY2NlOCwgMHgxY2QwNiwgMHgxY2QwYywgMHgxY2QxOCwNCisgICAgMHgxY2QzMCwgMHgxY2QzZSwgMHgxY2Q2MCwgMHgxY2Q3YywgMHgxY2Q5YywgMHgxY2RjMiwgMHgxY2RjNCwgMHgxY2RjOCwNCisgICAgMHgxY2RkMCwgMHgxY2RkZSwgMHgxY2RlNiwgMHgxY2RmYSwgMHgxY2UyMiwgMHgxY2UyOCwgMHgxY2U0MiwgMHgxY2U1MCwNCisgICAgMHgxY2U1ZSwgMHgxY2U2NiwgMHgxY2U3YSwgMHgxY2U4MiwgMHgxY2U4NCwgMHgxY2U4OCwgMHgxY2U5MCwgMHgxY2U5ZSwNCisgICAgMHgxY2VhMCwgMHgxY2ViYywgMHgxY2VjYywgMHgxY2VmMiwgMHgxY2VmNCwgMHgxY2YyZSwgMHgxY2YzMiwgMHgxY2YzNCwNCisgICAgMHgxY2Y0ZSwgMHgxY2Y1YywgMHgxY2Y2MiwgMHgxY2Y2NCwgMHgxY2Y2OCwgMHgxY2Y5NiwgMHgxY2ZhNiwgMHgxY2ZhYywNCisgICAgMHgxY2ZjYSwgMHgxY2ZkMiwgMHgxY2ZkNCwgMHgxZDAyZSwgMHgxZDAzMiwgMHgxZDAzNCwgMHgxZDA0ZSwgMHgxZDA1YywNCisgICAgMHgxZDA2MiwgMHgxZDA2NCwgMHgxZDA2OCwgMHgxZDA3NiwgMHgxZDA4ZSwgMHgxZDA5YywgMHgxZDBiOCwgMHgxZDBjMiwNCisgICAgMHgxZDBjNCwgMHgxZDBjOCwgMHgxZDBkMCwgMHgxZDBkZSwgMHgxZDBlNiwgMHgxZDBlYywgMHgxZDBmYSwgMHgxZDExYywNCisgICAgMHgxZDEzOCwgMHgxZDE3MCwgMHgxZDE3ZSwgMHgxZDE4MiwgMHgxZDE4NCwgMHgxZDE4OCwgMHgxZDE5MCwgMHgxZDE5ZSwNCisgICAgMHgxZDFhMCwgMHgxZDFiYywgMHgxZDFjNiwgMHgxZDFjYywgMHgxZDFkOCwgMHgxZDFlZSwgMHgxZDFmMiwgMHgxZDFmNCwNCisgICAgMHgxZDIxYywgMHgxZDIzOCwgMHgxZDI3MCwgMHgxZDI3ZSwgMHgxZDJlMCwgMHgxZDJmYywgMHgxZDMwMiwgMHgxZDMwNCwNCisgICAgMHgxZDMwOCwgMHgxZDMxMCwgMHgxZDMxZSwgMHgxZDMyMCwgMHgxZDMzYywgMHgxZDM0MCwgMHgxZDM3OCwgMHgxZDM4NiwNCisgICAgMHgxZDM4YywgMHgxZDM5OCwgMHgxZDNiMCwgMHgxZDNiZSwgMHgxZDNjZSwgMHgxZDNkYywgMHgxZDNlMiwgMHgxZDNlNCwNCisgICAgMHgxZDNlOCwgMHgxZDNmNiwgMHgxZDQ3MCwgMHgxZDQ3ZSwgMHgxZDRlMCwgMHgxZDRmYywgMHgxZDVjMCwgMHgxZDVmOCwNCisgICAgMHgxZDYwNCwgMHgxZDYwOCwgMHgxZDYxMCwgMHgxZDYyMCwgMHgxZDY0MCwgMHgxZDY3OCwgMHgxZDZmMCwgMHgxZDcwNiwNCisgICAgMHgxZDcwYywgMHgxZDcxOCwgMHgxZDczMCwgMHgxZDczZSwgMHgxZDc2MCwgMHgxZDc3YywgMHgxZDc4ZSwgMHgxZDc5YywNCisgICAgMHgxZDdiOCwgMHgxZDdjMiwgMHgxZDdjNCwgMHgxZDdjOCwgMHgxZDdkMCwgMHgxZDdkZSwgMHgxZDdlNiwgMHgxZDdlYywNCisgICAgMHgxZDgyNiwgMHgxZDgyYywgMHgxZDgzYSwgMHgxZDg0NiwgMHgxZDg0YywgMHgxZDg1OCwgMHgxZDg3MiwgMHgxZDg3NCwNCisgICAgMHgxZDg4NiwgMHgxZDg4YywgMHgxZDg5OCwgMHgxZDhiMCwgMHgxZDhiZSwgMHgxZDhjZSwgMHgxZDhlMiwgMHgxZDhlNCwNCisgICAgMHgxZDhlOCwgMHgxZDhmNiwgMHgxZDkwYywgMHgxZDkxOCwgMHgxZDkzMCwgMHgxZDkzZSwgMHgxZDk2MCwgMHgxZDk3YywNCisgICAgMHgxZDk5YywgMHgxZDljMiwgMHgxZDljNCwgMHgxZDljOCwgMHgxZDlkMCwgMHgxZDllNiwgMHgxZDlmYSwgMHgxZGEwYywNCisgICAgMHgxZGExOCwgMHgxZGEzMCwgMHgxZGEzZSwgMHgxZGE2MCwgMHgxZGE3YywgMHgxZGFjMCwgMHgxZGFmOCwgMHgxZGIzOCwNCisgICAgMHgxZGI4MiwgMHgxZGI4NCwgMHgxZGI4OCwgMHgxZGI5MCwgMHgxZGI5ZSwgMHgxZGJhMCwgMHgxZGJjYywgMHgxZGJmMiwNCisgICAgMHgxZGJmNCwgMHgxZGMyMiwgMHgxZGM0MiwgMHgxZGM0NCwgMHgxZGM0OCwgMHgxZGM1MCwgMHgxZGM1ZSwgMHgxZGM2NiwNCisgICAgMHgxZGM3YSwgMHgxZGM4MiwgMHgxZGM4NCwgMHgxZGM4OCwgMHgxZGM5MCwgMHgxZGM5ZSwgMHgxZGNhMCwgMHgxZGNiYywNCisgICAgMHgxZGNjYywgMHgxZGNmMiwgMHgxZGNmNCwgMHgxZGQwNCwgMHgxZGQwOCwgMHgxZGQxMCwgMHgxZGQxZSwgMHgxZGQyMCwNCisgICAgMHgxZGQzYywgMHgxZGQ0MCwgMHgxZGQ3OCwgMHgxZGQ4NiwgMHgxZGQ5OCwgMHgxZGRjZSwgMHgxZGRlMiwgMHgxZGRlNCwNCisgICAgMHgxZGRlOCwgMHgxZGUyZSwgMHgxZGUzMiwgMHgxZGUzNCwgMHgxZGU0ZSwgMHgxZGU1YywgMHgxZGU2MiwgMHgxZGU2NCwNCisgICAgMHgxZGU2OCwgMHgxZGU4ZSwgMHgxZGU5YywgMHgxZGViOCwgMHgxZGVjMiwgMHgxZGVjNCwgMHgxZGVjOCwgMHgxZGVkMCwNCisgICAgMHgxZGVlNiwgMHgxZGVmYSwgMHgxZGYxNiwgMHgxZGYyNiwgMHgxZGYyYywgMHgxZGY0NiwgMHgxZGY0YywgMHgxZGY1OCwNCisgICAgMHgxZGY3MiwgMHgxZGY3NCwgMHgxZGY4YSwgMHgxZGY5MiwgMHgxZGY5NCwgMHgxZGZhMiwgMHgxZGZhNCwgMHgxZGZhOCwNCisgICAgMHgxZTA4YSwgMHgxZTA5MiwgMHgxZTA5NCwgMHgxZTBhMiwgMHgxZTBhNCwgMHgxZTBhOCwgMHgxZTBiNiwgMHgxZTBkYSwNCisgICAgMHgxZTEwYSwgMHgxZTExMiwgMHgxZTExNCwgMHgxZTEyMiwgMHgxZTEyNCwgMHgxZTEyOCwgMHgxZTEzNiwgMHgxZTE0MiwNCisgICAgMHgxZTE0NCwgMHgxZTE0OCwgMHgxZTE1MCwgMHgxZTE2NiwgMHgxZTE2YywgMHgxZTE3YSwgMHgxZTE5YSwgMHgxZTFiMiwNCisgICAgMHgxZTFiNCwgMHgxZTIwYSwgMHgxZTIxMiwgMHgxZTIxNCwgMHgxZTIyMiwgMHgxZTIyNCwgMHgxZTIyOCwgMHgxZTIzNiwNCisgICAgMHgxZTI0MiwgMHgxZTI0OCwgMHgxZTI1MCwgMHgxZTI1ZSwgMHgxZTI2NiwgMHgxZTI2YywgMHgxZTI3YSwgMHgxZTI4MiwNCisgICAgMHgxZTI4NCwgMHgxZTI4OCwgMHgxZTI5MCwgMHgxZTJhMCwgMHgxZTJiYywgMHgxZTJjNiwgMHgxZTJjYywgMHgxZTJkOCwNCisgICAgMHgxZTJlZSwgMHgxZTJmMiwgMHgxZTJmNCwgMHgxZTMxYSwgMHgxZTMzMiwgMHgxZTMzNCwgMHgxZTM1YywgMHgxZTM2MiwNCisgICAgMHgxZTM2NCwgMHgxZTM2OCwgMHgxZTNiYSwgMHgxZTQwYSwgMHgxZTQxMiwgMHgxZTQxNCwgMHgxZTQyMiwgMHgxZTQyOCwNCisgICAgMHgxZTQzNiwgMHgxZTQ0MiwgMHgxZTQ0OCwgMHgxZTQ1MCwgMHgxZTQ1ZSwgMHgxZTQ2NiwgMHgxZTQ2YywgMHgxZTQ3YSwNCisgICAgMHgxZTQ4MiwgMHgxZTQ4NCwgMHgxZTQ5MCwgMHgxZTQ5ZSwgMHgxZTRhMCwgMHgxZTRiYywgMHgxZTRjNiwgMHgxZTRjYywNCisgICAgMHgxZTRkOCwgMHgxZTRlZSwgMHgxZTRmMiwgMHgxZTRmNCwgMHgxZTUwMiwgMHgxZTUwNCwgMHgxZTUwOCwgMHgxZTUxMCwNCisgICAgMHgxZTUxZSwgMHgxZTUyMCwgMHgxZTUzYywgMHgxZTU0MCwgMHgxZTU3OCwgMHgxZTU4NiwgMHgxZTU4YywgMHgxZTU5OCwNCisgICAgMHgxZTViMCwgMHgxZTViZSwgMHgxZTVjZSwgMHgxZTVkYywgMHgxZTVlMiwgMHgxZTVlNCwgMHgxZTVlOCwgMHgxZTVmNiwNCisgICAgMHgxZTYxYSwgMHgxZTYyZSwgMHgxZTYzMiwgMHgxZTYzNCwgMHgxZTY0ZSwgMHgxZTY1YywgMHgxZTY2MiwgMHgxZTY2OCwNCisgICAgMHgxZTY4ZSwgMHgxZTY5YywgMHgxZTZiOCwgMHgxZTZjMiwgMHgxZTZjNCwgMHgxZTZjOCwgMHgxZTZkMCwgMHgxZTZlNiwNCisgICAgMHgxZTZmYSwgMHgxZTcxNiwgMHgxZTcyNiwgMHgxZTcyYywgMHgxZTczYSwgMHgxZTc0NiwgMHgxZTc0YywgMHgxZTc1OCwNCisgICAgMHgxZTc3MiwgMHgxZTc3NCwgMHgxZTc5MiwgMHgxZTc5NCwgMHgxZTdhMiwgMHgxZTdhNCwgMHgxZTdhOCwgMHgxZTdiNiwNCisgICAgMHgxZTgxMiwgMHgxZTgxNCwgMHgxZTgyMiwgMHgxZTgyNCwgMHgxZTgyOCwgMHgxZTgzNiwgMHgxZTg0MiwgMHgxZTg0NCwNCisgICAgMHgxZTg0OCwgMHgxZTg1MCwgMHgxZTg1ZSwgMHgxZTg2NiwgMHgxZTg2YywgMHgxZTg3YSwgMHgxZTg4MiwgMHgxZTg4NCwNCisgICAgMHgxZTg4OCwgMHgxZTg5MCwgMHgxZTg5ZSwgMHgxZThhMCwgMHgxZThiYywgMHgxZThjNiwgMHgxZThjYywgMHgxZThkOCwNCisgICAgMHgxZThlZSwgMHgxZThmMiwgMHgxZThmNCwgMHgxZTkwMiwgMHgxZTkwNCwgMHgxZTkwOCwgMHgxZTkxMCwgMHgxZTkyMCwNCisgICAgMHgxZTkzYywgMHgxZTk0MCwgMHgxZTk3OCwgMHgxZTk4NiwgMHgxZTk4YywgMHgxZTk5OCwgMHgxZTliMCwgMHgxZTliZSwNCisgICAgMHgxZTljZSwgMHgxZTlkYywgMHgxZTllMiwgMHgxZTllNCwgMHgxZTllOCwgMHgxZTlmNiwgMHgxZWEwNCwgMHgxZWEwOCwNCisgICAgMHgxZWExMCwgMHgxZWEyMCwgMHgxZWE0MCwgMHgxZWE3OCwgMHgxZWFmMCwgMHgxZWIwNiwgMHgxZWIwYywgMHgxZWIxOCwNCisgICAgMHgxZWIzMCwgMHgxZWIzZSwgMHgxZWI2MCwgMHgxZWI3YywgMHgxZWI4ZSwgMHgxZWI5YywgMHgxZWJiOCwgMHgxZWJjMiwNCisgICAgMHgxZWJjNCwgMHgxZWJjOCwgMHgxZWJkMCwgMHgxZWJkZSwgMHgxZWJlNiwgMHgxZWJlYywgMHgxZWMxYSwgMHgxZWMyZSwNCisgICAgMHgxZWMzMiwgMHgxZWMzNCwgMHgxZWM0ZSwgMHgxZWM1YywgMHgxZWM2MiwgMHgxZWM2NCwgMHgxZWM2OCwgMHgxZWM4ZSwNCisgICAgMHgxZWM5YywgMHgxZWNiOCwgMHgxZWNjMiwgMHgxZWNjNCwgMHgxZWNjOCwgMHgxZWNkMCwgMHgxZWNlNiwgMHgxZWNmYSwNCisgICAgMHgxZWQwZSwgMHgxZWQxYywgMHgxZWQzOCwgMHgxZWQ3MCwgMHgxZWQ3ZSwgMHgxZWQ4MiwgMHgxZWQ4NCwgMHgxZWQ4OCwNCisgICAgMHgxZWQ5MCwgMHgxZWQ5ZSwgMHgxZWRhMCwgMHgxZWRjYywgMHgxZWRmMiwgMHgxZWRmNCwgMHgxZWUxNiwgMHgxZWUyNiwNCisgICAgMHgxZWUyYywgMHgxZWUzYSwgMHgxZWU0NiwgMHgxZWU0YywgMHgxZWU1OCwgMHgxZWU2ZSwgMHgxZWU3MiwgMHgxZWU3NCwNCisgICAgMHgxZWU4NiwgMHgxZWU4YywgMHgxZWU5OCwgMHgxZWViMCwgMHgxZWViZSwgMHgxZWVjZSwgMHgxZWVkYywgMHgxZWVlMiwNCisgICAgMHgxZWVlNCwgMHgxZWVlOCwgMHgxZWYxMiwgMHgxZWYyMiwgMHgxZWYyNCwgMHgxZWYyOCwgMHgxZWYzNiwgMHgxZWY0MiwNCisgICAgMHgxZWY0NCwgMHgxZWY0OCwgMHgxZWY1MCwgMHgxZWY1ZSwgMHgxZWY2NiwgMHgxZWY2YywgMHgxZWY3YSwgMHgxZWZhZSwNCisgICAgMHgxZWZiMiwgMHgxZWZiNCwgMHgxZWZkNiwgMHgxZjA5NiwgMHgxZjBhNiwgMHgxZjBhYywgMHgxZjBiYSwgMHgxZjBjYSwNCisgICAgMHgxZjBkMiwgMHgxZjBkNCwgMHgxZjExNiwgMHgxZjEyNiwgMHgxZjEyYywgMHgxZjEzYSwgMHgxZjE0NiwgMHgxZjE0YywNCisgICAgMHgxZjE1OCwgMHgxZjE2ZSwgMHgxZjE3MiwgMHgxZjE3NCwgMHgxZjE4YSwgMHgxZjE5MiwgMHgxZjE5NCwgMHgxZjFhMiwNCisgICAgMHgxZjFhNCwgMHgxZjFhOCwgMHgxZjFkYSwgMHgxZjIxNiwgMHgxZjIyNiwgMHgxZjIyYywgMHgxZjIzYSwgMHgxZjI0NiwNCisgICAgMHgxZjI1OCwgMHgxZjI2ZSwgMHgxZjI3MiwgMHgxZjI3NCwgMHgxZjI4NiwgMHgxZjI4YywgMHgxZjI5OCwgMHgxZjJiMCwNCisgICAgMHgxZjJiZSwgMHgxZjJjZSwgMHgxZjJkYywgMHgxZjJlMiwgMHgxZjJlNCwgMHgxZjJlOCwgMHgxZjJmNiwgMHgxZjMwYSwNCisgICAgMHgxZjMxMiwgMHgxZjMxNCwgMHgxZjMyMiwgMHgxZjMyOCwgMHgxZjM0MiwgMHgxZjM0NCwgMHgxZjM0OCwgMHgxZjM1MCwNCisgICAgMHgxZjM1ZSwgMHgxZjM2NiwgMHgxZjM3YSwgMHgxZjM5YSwgMHgxZjNhZSwgMHgxZjNiMiwgMHgxZjNiNCwgMHgxZjQxNiwNCisgICAgMHgxZjQyNiwgMHgxZjQyYywgMHgxZjQzYSwgMHgxZjQ0NiwgMHgxZjQ0YywgMHgxZjQ1OCwgMHgxZjQ2ZSwgMHgxZjQ3MiwNCisgICAgMHgxZjQ3NCwgMHgxZjQ4NiwgMHgxZjQ4YywgMHgxZjQ5OCwgMHgxZjRiMCwgMHgxZjRiZSwgMHgxZjRjZSwgMHgxZjRkYywNCisgICAgMHgxZjRlMiwgMHgxZjRlNCwgMHgxZjRlOCwgMHgxZjRmNiwgMHgxZjUwNiwgMHgxZjUwYywgMHgxZjUxOCwgMHgxZjUzMCwNCisgICAgMHgxZjUzZSwgMHgxZjU2MCwgMHgxZjU3YywgMHgxZjU4ZSwgMHgxZjU5YywgMHgxZjViOCwgMHgxZjVjMiwgMHgxZjVjNCwNCisgICAgMHgxZjVjOCwgMHgxZjVkMCwgMHgxZjVkZSwgMHgxZjVlNiwgMHgxZjVlYywgMHgxZjVmYSwgMHgxZjYwYSwgMHgxZjYxMiwNCisgICAgMHgxZjYxNCwgMHgxZjYyMiwgMHgxZjYyNCwgMHgxZjYyOCwgMHgxZjYzNiwgMHgxZjY0MiwgMHgxZjY0NCwgMHgxZjY0OCwNCisgICAgMHgxZjY1MCwgMHgxZjY1ZSwgMHgxZjY2NiwgMHgxZjY3YSwgMHgxZjY4MiwgMHgxZjY4NCwgMHgxZjY4OCwgMHgxZjY5MCwNCisgICAgMHgxZjY5ZSwgMHgxZjZhMCwgMHgxZjZiYywgMHgxZjZjYywgMHgxZjZmMiwgMHgxZjZmNCwgMHgxZjcxYSwgMHgxZjcyZSwNCisgICAgMHgxZjczMiwgMHgxZjczNCwgMHgxZjc0ZSwgMHgxZjc1YywgMHgxZjc2MiwgMHgxZjc2NCwgMHgxZjc2OCwgMHgxZjc3NiwNCisgICAgMHgxZjc5NiwgMHgxZjdhNiwgMHgxZjdhYywgMHgxZjdiYSwgMHgxZjdkMiwgMHgxZjdkNCwgMHgxZjg5YSwgMHgxZjhhZSwNCisgICAgMHgxZjhiMiwgMHgxZjhiNCwgMHgxZjhkNiwgMHgxZjhlYSwgMHgxZjkxYSwgMHgxZjkyZSwgMHgxZjkzMiwgMHgxZjkzNCwNCisgICAgMHgxZjk0ZSwgMHgxZjk1YywgMHgxZjk2MiwgMHgxZjk2NCwgMHgxZjk2OCwgMHgxZjk3NiwgMHgxZjk5NiwgMHgxZjlhNiwNCisgICAgMHgxZjlhYywgMHgxZjliYSwgMHgxZjljYSwgMHgxZjlkMiwgMHgxZjlkNCwgMHgxZmExYSwgMHgxZmEyZSwgMHgxZmEzMiwNCisgICAgMHgxZmEzNCwgMHgxZmE0ZSwgMHgxZmE1YywgMHgxZmE2MiwgMHgxZmE2NCwgMHgxZmE2OCwgMHgxZmE3NiwgMHgxZmE4ZSwNCisgICAgMHgxZmE5YywgMHgxZmFiOCwgMHgxZmFjMiwgMHgxZmFjNCwgMHgxZmFjOCwgMHgxZmFkMCwgMHgxZmFkZSwgMHgxZmFlNiwNCisgICAgMHgxZmFlYywgMHgxZmIxNiwgMHgxZmIyNiwgMHgxZmIyYywgMHgxZmIzYSwgMHgxZmI0NiwgMHgxZmI0YywgMHgxZmI1OCwNCisgICAgMHgxZmI2ZSwgMHgxZmI3MiwgMHgxZmI3NCwgMHgxZmI4YSwgMHgxZmI5MiwgMHgxZmI5NCwgMHgxZmJhMiwgMHgxZmJhNCwNCisgICAgMHgxZmJhOCwgMHgxZmJiNiwgMHgxZmJkYX07DQogaW50MzJfdCBDQkNfUERGNDE3Q29tbW9uOjpDT0RFV09SRF9UQUJMRVtdID0gew0KLSAgICAyNjI3LCAxODE5LCAyNjIyLCAyNjIxLCAxODEzLCAxODEyLCAyNzI5LCAyNzI0LCAyNzIzLCAyNzc5LCAyNzc0LCAyNzczLCA5MDIsIDg5NiwgOTA4LCA4NjgsIDg2NSwgODYxLCA4NTksIDI1MTEsDQotICAgIDg3MywgODcxLCAxNzgwLCA4MzUsIDI0OTMsIDgyNSwgMjQ5MSwgODQyLCA4MzcsIDg0NCwgMTc2NCwgMTc2MiwgODExLCA4MTAsIDgwOSwgMjQ4MywgODA3LCAyNDgyLCA4MDYsIDI0ODAsIDgxNSwNCi0gICAgODE0LCA4MTMsIDgxMiwgMjQ4NCwgODE3LCA4MTYsIDE3NDUsIDE3NDQsIDE3NDIsIDE3NDYsIDI2NTUsIDI2MzcsIDI2MzUsIDI2MjYsIDI2MjUsIDI2MjMsIDI2MjgsIDE4MjAsIDI3NTIsDQotICAgIDI3MzksIDI3MzcsIDI3MjgsIDI3MjcsIDI3MjUsIDI3MzAsIDI3ODUsIDI3ODMsIDI3NzgsIDI3NzcsIDI3NzUsIDI3ODAsIDc4NywgNzgxLCA3NDcsIDczOSwgNzM2LCAyNDEzLCA3NTQsIDc1MiwNCi0gICAgMTcxOSwgNjkyLCA2ODksIDY4MSwgMjM3MSwgNjc4LCAyMzY5LCA3MDAsIDY5NywgNjk0LCA3MDMsIDE2ODgsIDE2ODYsIDY0MiwgNjM4LCAyMzQzLCA2MzEsIDIzNDEsIDYyNywgMjMzOCwgNjUxLA0KLSAgICA2NDYsIDY0MywgMjM0NSwgNjU0LCA2NTIsIDE2NTIsIDE2NTAsIDE2NDcsIDE2NTQsIDYwMSwgNTk5LCAyMzIyLCA1OTYsIDIzMjEsIDU5NCwgMjMxOSwgMjMxNywgNjExLCA2MTAsIDYwOCwgNjA2LA0KLSAgICAyMzI0LCA2MDMsIDIzMjMsIDYxNSwgNjE0LCA2MTIsIDE2MTcsIDE2MTYsIDE2MTQsIDE2MTIsIDYxNiwgMTYxOSwgMTYxOCwgMjU3NSwgMjUzOCwgMjUzNiwgOTA1LCA5MDEsIDg5OCwgOTA5LA0KLSAgICAyNTA5LCAyNTA3LCAyNTA0LCA4NzAsIDg2NywgODY0LCA4NjAsIDI1MTIsIDg3NSwgODcyLCAxNzgxLCAyNDkwLCAyNDg5LCAyNDg3LCAyNDg1LCAxNzQ4LCA4MzYsIDgzNCwgODMyLCA4MzAsDQotICAgIDI0OTQsIDgyNywgMjQ5MiwgODQzLCA4NDEsIDgzOSwgODQ1LCAxNzY1LCAxNzYzLCAyNzAxLCAyNjc2LCAyNjc0LCAyNjUzLCAyNjQ4LCAyNjU2LCAyNjM0LCAyNjMzLCAyNjMxLCAyNjI5LA0KLSAgICAxODIxLCAyNjM4LCAyNjM2LCAyNzcwLCAyNzYzLCAyNzYxLCAyNzUwLCAyNzQ1LCAyNzUzLCAyNzM2LCAyNzM1LCAyNzMzLCAyNzMxLCAxODQ4LCAyNzQwLCAyNzM4LCAyNzg2LCAyNzg0LCA1OTEsDQotICAgIDU4OCwgNTc2LCA1NjksIDU2NiwgMjI5NiwgMTU5MCwgNTM3LCA1MzQsIDUyNiwgMjI3NiwgNTIyLCAyMjc0LCA1NDUsIDU0MiwgNTM5LCA1NDgsIDE1NzIsIDE1NzAsIDQ4MSwgMjI0NSwgNDY2LA0KLSAgICAyMjQyLCA0NjIsIDIyMzksIDQ5MiwgNDg1LCA0ODIsIDIyNDksIDQ5NiwgNDk0LCAxNTM0LCAxNTMxLCAxNTI4LCAxNTM4LCA0MTMsIDIxOTYsIDQwNiwgMjE5MSwgMjE4OCwgNDI1LCA0MTksDQotICAgIDIyMDIsIDQxNSwgMjE5OSwgNDMyLCA0MzAsIDQyNywgMTQ3MiwgMTQ2NywgMTQ2NCwgNDMzLCAxNDc2LCAxNDc0LCAzNjgsIDM2NywgMjE2MCwgMzY1LCAyMTU5LCAzNjIsIDIxNTcsIDIxNTUsDQotICAgIDIxNTIsIDM3OCwgMzc3LCAzNzUsIDIxNjYsIDM3MiwgMjE2NSwgMzY5LCAyMTYyLCAzODMsIDM4MSwgMzc5LCAyMTY4LCAxNDE5LCAxNDE4LCAxNDE2LCAxNDE0LCAzODUsIDE0MTEsIDM4NCwNCi0gICAgMTQyMywgMTQyMiwgMTQyMCwgMTQyNCwgMjQ2MSwgODAyLCAyNDQxLCAyNDM5LCA3OTAsIDc4NiwgNzgzLCA3OTQsIDI0MDksIDI0MDYsIDI0MDMsIDc1MCwgNzQyLCA3MzgsIDI0MTQsIDc1NiwNCi0gICAgNzUzLCAxNzIwLCAyMzY3LCAyMzY1LCAyMzYyLCAyMzU5LCAxNjYzLCA2OTMsIDY5MSwgNjg0LCAyMzczLCA2ODAsIDIzNzAsIDcwMiwgNjk5LCA2OTYsIDcwNCwgMTY5MCwgMTY4NywgMjMzNywNCi0gICAgMjMzNiwgMjMzNCwgMjMzMiwgMTYyNCwgMjMyOSwgMTYyMiwgNjQwLCA2MzcsIDIzNDQsIDYzNCwgMjM0MiwgNjMwLCAyMzQwLCA2NTAsIDY0OCwgNjQ1LCAyMzQ2LCA2NTUsIDY1MywgMTY1MywNCi0gICAgMTY1MSwgMTY0OSwgMTY1NSwgMjYxMiwgMjU5NywgMjU5NSwgMjU3MSwgMjU2OCwgMjU2NSwgMjU3NiwgMjUzNCwgMjUyOSwgMjUyNiwgMTc4NywgMjU0MCwgMjUzNywgOTA3LCA5MDQsIDkwMCwNCi0gICAgOTEwLCAyNTAzLCAyNTAyLCAyNTAwLCAyNDk4LCAxNzY4LCAyNDk1LCAxNzY3LCAyNTEwLCAyNTA4LCAyNTA2LCA4NjksIDg2NiwgODYzLCAyNTEzLCA4NzYsIDg3NCwgMTc4MiwgMjcyMCwgMjcxMywNCi0gICAgMjcxMSwgMjY5NywgMjY5NCwgMjY5MSwgMjcwMiwgMjY3MiwgMjY3MCwgMjY2NCwgMTgyOCwgMjY3OCwgMjY3NSwgMjY0NywgMjY0NiwgMjY0NCwgMjY0MiwgMTgyMywgMjYzOSwgMTgyMiwgMjY1NCwNCi0gICAgMjY1MiwgMjY1MCwgMjY1NywgMjc3MSwgMTg1NSwgMjc2NSwgMjc2MiwgMTg1MCwgMTg0OSwgMjc1MSwgMjc0OSwgMjc0NywgMjc1NCwgMzUzLCAyMTQ4LCAzNDQsIDM0MiwgMzM2LCAyMTQyLA0KLSAgICAzMzIsIDIxNDAsIDM0NSwgMTM3NSwgMTM3MywgMzA2LCAyMTMwLCAyOTksIDIxMjgsIDI5NSwgMjEyNSwgMzE5LCAzMTQsIDMxMSwgMjEzMiwgMTM1NCwgMTM1MiwgMTM0OSwgMTM1NiwgMjYyLA0KLSAgICAyNTcsIDIxMDEsIDI1MywgMjA5NiwgMjA5MywgMjc0LCAyNzMsIDI2NywgMjEwNywgMjYzLCAyMTA0LCAyODAsIDI3OCwgMjc1LCAxMzE2LCAxMzExLCAxMzA4LCAxMzIwLCAxMzE4LCAyMDUyLA0KLSAgICAyMDIsIDIwNTAsIDIwNDQsIDIwNDAsIDIxOSwgMjA2MywgMjEyLCAyMDYwLCAyMDgsIDIwNTUsIDIyNCwgMjIxLCAyMDY2LCAxMjYwLCAxMjU4LCAxMjUyLCAyMzEsIDEyNDgsIDIyOSwgMTI2NiwNCi0gICAgMTI2NCwgMTI2MSwgMTI2OCwgMTU1LCAxOTk4LCAxNTMsIDE5OTYsIDE5OTQsIDE5OTEsIDE5ODgsIDE2NSwgMTY0LCAyMDA3LCAxNjIsIDIwMDYsIDE1OSwgMjAwMywgMjAwMCwgMTcyLCAxNzEsDQotICAgIDE2OSwgMjAxMiwgMTY2LCAyMDEwLCAxMTg2LCAxMTg0LCAxMTgyLCAxMTc5LCAxNzUsIDExNzYsIDE3MywgMTE5MiwgMTE5MSwgMTE4OSwgMTE4NywgMTc2LCAxMTk0LCAxMTkzLCAyMzEzLA0KLSAgICAyMzA3LCAyMzA1LCA1OTIsIDU4OSwgMjI5NCwgMjI5MiwgMjI4OSwgNTc4LCA1NzIsIDU2OCwgMjI5NywgNTgwLCAxNTkxLCAyMjcyLCAyMjY3LCAyMjY0LCAxNTQ3LCA1MzgsIDUzNiwgNTI5LA0KLSAgICAyMjc4LCA1MjUsIDIyNzUsIDU0NywgNTQ0LCA1NDEsIDE1NzQsIDE1NzEsIDIyMzcsIDIyMzUsIDIyMjksIDE0OTMsIDIyMjUsIDE0ODksIDQ3OCwgMjI0NywgNDcwLCAyMjQ0LCA0NjUsIDIyNDEsDQotICAgIDQ5MywgNDg4LCA0ODQsIDIyNTAsIDQ5OCwgNDk1LCAxNTM2LCAxNTMzLCAxNTMwLCAxNTM5LCAyMTg3LCAyMTg2LCAyMTg0LCAyMTgyLCAxNDMyLCAyMTc5LCAxNDMwLCAyMTc2LCAxNDI3LCA0MTQsDQotICAgIDQxMiwgMjE5NywgNDA5LCAyMTk1LCA0MDUsIDIxOTMsIDIxOTAsIDQyNiwgNDI0LCA0MjEsIDIyMDMsIDQxOCwgMjIwMSwgNDMxLCA0MjksIDE0NzMsIDE0NzEsIDE0NjksIDE0NjYsIDQzNCwNCi0gICAgMTQ3NywgMTQ3NSwgMjQ3OCwgMjQ3MiwgMjQ3MCwgMjQ1OSwgMjQ1NywgMjQ1NCwgMjQ2MiwgODAzLCAyNDM3LCAyNDMyLCAyNDI5LCAxNzI2LCAyNDQzLCAyNDQwLCA3OTIsIDc4OSwgNzg1LA0KLSAgICAyNDAxLCAyMzk5LCAyMzkzLCAxNzAyLCAyMzg5LCAxNjk5LCAyNDExLCAyNDA4LCAyNDA1LCA3NDUsIDc0MSwgMjQxNSwgNzU4LCA3NTUsIDE3MjEsIDIzNTgsIDIzNTcsIDIzNTUsIDIzNTMsDQotICAgIDE2NjEsIDIzNTAsIDE2NjAsIDIzNDcsIDE2NTcsIDIzNjgsIDIzNjYsIDIzNjQsIDIzNjEsIDE2NjYsIDY5MCwgNjg3LCAyMzc0LCA2ODMsIDIzNzIsIDcwMSwgNjk4LCA3MDUsIDE2OTEsIDE2ODksDQotICAgIDI2MTksIDI2MTcsIDI2MTAsIDI2MDgsIDI2MDUsIDI2MTMsIDI1OTMsIDI1ODgsIDI1ODUsIDE4MDMsIDI1OTksIDI1OTYsIDI1NjMsIDI1NjEsIDI1NTUsIDE3OTcsIDI1NTEsIDE3OTUsIDI1NzMsDQotICAgIDI1NzAsIDI1NjcsIDI1NzcsIDI1MjUsIDI1MjQsIDI1MjIsIDI1MjAsIDE3ODYsIDI1MTcsIDE3ODUsIDI1MTQsIDE3ODMsIDI1MzUsIDI1MzMsIDI1MzEsIDI1MjgsIDE3ODgsIDI1NDEsIDI1MzksDQotICAgIDkwNiwgOTAzLCA5MTEsIDI3MjEsIDE4NDQsIDI3MTUsIDI3MTIsIDE4MzgsIDE4MzYsIDI2OTksIDI2OTYsIDI2OTMsIDI3MDMsIDE4MjcsIDE4MjYsIDE4MjQsIDI2NzMsIDI2NzEsIDI2NjksDQotICAgIDI2NjYsIDE4MjksIDI2NzksIDI2NzcsIDE4NTgsIDE4NTcsIDI3NzIsIDE4NTQsIDE4NTMsIDE4NTEsIDE4NTYsIDI3NjYsIDI3NjQsIDE0MywgMTk4NywgMTM5LCAxOTg2LCAxMzUsIDEzMywNCi0gICAgMTMxLCAxOTg0LCAxMjgsIDE5ODMsIDEyNSwgMTk4MSwgMTM4LCAxMzcsIDEzNiwgMTk4NSwgMTEzMywgMTEzMiwgMTEzMCwgMTEyLCAxMTAsIDE5NzQsIDEwNywgMTk3MywgMTA0LCAxOTcxLA0KLSAgICAxOTY5LCAxMjIsIDEyMSwgMTE5LCAxMTcsIDE5NzcsIDExNCwgMTk3NiwgMTI0LCAxMTE1LCAxMTE0LCAxMTEyLCAxMTEwLCAxMTE3LCAxMTE2LCA4NCwgODMsIDE5NTMsIDgxLCAxOTUyLCA3OCwNCi0gICAgMTk1MCwgMTk0OCwgMTk0NSwgOTQsIDkzLCA5MSwgMTk1OSwgODgsIDE5NTgsIDg1LCAxOTU1LCA5OSwgOTcsIDk1LCAxOTYxLCAxMDg2LCAxMDg1LCAxMDgzLCAxMDgxLCAxMDc4LCAxMDAsDQotICAgIDEwOTAsIDEwODksIDEwODcsIDEwOTEsIDQ5LCA0NywgMTkxNywgNDQsIDE5MTUsIDE5MTMsIDE5MTAsIDE5MDcsIDU5LCAxOTI2LCA1NiwgMTkyNSwgNTMsIDE5MjIsIDE5MTksIDY2LCA2NCwNCi0gICAgMTkzMSwgNjEsIDE5MjksIDEwNDIsIDEwNDAsIDEwMzgsIDcxLCAxMDM1LCA3MCwgMTAzMiwgNjgsIDEwNDgsIDEwNDcsIDEwNDUsIDEwNDMsIDEwNTAsIDEwNDksIDEyLCAxMCwgMTg2OSwgMTg2NywNCi0gICAgMTg2NCwgMTg2MSwgMjEsIDE4ODAsIDE5LCAxODc3LCAxODc0LCAxODcxLCAyOCwgMTg4OCwgMjUsIDE4ODYsIDIyLCAxODgzLCA5ODIsIDk4MCwgOTc3LCA5NzQsIDMyLCAzMCwgOTkxLCA5ODksDQotICAgIDk4NywgOTg0LCAzNCwgOTk1LCA5OTQsIDk5MiwgMjE1MSwgMjE1MCwgMjE0NywgMjE0NiwgMjE0NCwgMzU2LCAzNTUsIDM1NCwgMjE0OSwgMjEzOSwgMjEzOCwgMjEzNiwgMjEzNCwgMTM1OSwNCi0gICAgMzQzLCAzNDEsIDMzOCwgMjE0MywgMzM1LCAyMTQxLCAzNDgsIDM0NywgMzQ2LCAxMzc2LCAxMzc0LCAyMTI0LCAyMTIzLCAyMTIxLCAyMTE5LCAxMzI2LCAyMTE2LCAxMzI0LCAzMTAsIDMwOCwNCi0gICAgMzA1LCAyMTMxLCAzMDIsIDIxMjksIDI5OCwgMjEyNywgMzIwLCAzMTgsIDMxNiwgMzEzLCAyMTMzLCAzMjIsIDMyMSwgMTM1NSwgMTM1MywgMTM1MSwgMTM1NywgMjA5MiwgMjA5MSwgMjA4OSwNCi0gICAgMjA4NywgMTI3NiwgMjA4NCwgMTI3NCwgMjA4MSwgMTI3MSwgMjU5LCAyMTAyLCAyNTYsIDIxMDAsIDI1MiwgMjA5OCwgMjA5NSwgMjcyLCAyNjksIDIxMDgsIDI2NiwgMjEwNiwgMjgxLCAyNzksDQotICAgIDI3NywgMTMxNywgMTMxNSwgMTMxMywgMTMxMCwgMjgyLCAxMzIxLCAxMzE5LCAyMDM5LCAyMDM3LCAyMDM1LCAyMDMyLCAxMjAzLCAyMDI5LCAxMjAwLCAxMTk3LCAyMDcsIDIwNTMsIDIwNSwNCi0gICAgMjA1MSwgMjAxLCAyMDQ5LCAyMDQ2LCAyMDQzLCAyMjAsIDIxOCwgMjA2NCwgMjE1LCAyMDYyLCAyMTEsIDIwNTksIDIyOCwgMjI2LCAyMjMsIDIwNjksIDEyNTksIDEyNTcsIDEyNTQsIDIzMiwNCi0gICAgMTI1MSwgMjMwLCAxMjY3LCAxMjY1LCAxMjYzLCAyMzE2LCAyMzE1LCAyMzEyLCAyMzExLCAyMzA5LCAyMzE0LCAyMzA0LCAyMzAzLCAyMzAxLCAyMjk5LCAxNTkzLCAyMzA4LCAyMzA2LCA1OTAsDQotICAgIDIyODgsIDIyODcsIDIyODUsIDIyODMsIDE1NzgsIDIyODAsIDE1NzcsIDIyOTUsIDIyOTMsIDIyOTEsIDU3OSwgNTc3LCA1NzQsIDU3MSwgMjI5OCwgNTgyLCA1ODEsIDE1OTIsIDIyNjMsIDIyNjIsDQotICAgIDIyNjAsIDIyNTgsIDE1NDUsIDIyNTUsIDE1NDQsIDIyNTIsIDE1NDEsIDIyNzMsIDIyNzEsIDIyNjksIDIyNjYsIDE1NTAsIDUzNSwgNTMyLCAyMjc5LCA1MjgsIDIyNzcsIDU0NiwgNTQzLCA1NDksDQotICAgIDE1NzUsIDE1NzMsIDIyMjQsIDIyMjIsIDIyMjAsIDE0ODYsIDIyMTcsIDE0ODUsIDIyMTQsIDE0ODIsIDE0NzksIDIyMzgsIDIyMzYsIDIyMzQsIDIyMzEsIDE0OTYsIDIyMjgsIDE0OTIsIDQ4MCwNCi0gICAgNDc3LCAyMjQ4LCA0NzMsIDIyNDYsIDQ2OSwgMjI0MywgNDkwLCA0ODcsIDIyNTEsIDQ5NywgMTUzNywgMTUzNSwgMTUzMiwgMjQ3NywgMjQ3NiwgMjQ3NCwgMjQ3OSwgMjQ2OSwgMjQ2OCwgMjQ2NiwNCi0gICAgMjQ2NCwgMTczMCwgMjQ3MywgMjQ3MSwgMjQ1MywgMjQ1MiwgMjQ1MCwgMjQ0OCwgMTcyOSwgMjQ0NSwgMTcyOCwgMjQ2MCwgMjQ1OCwgMjQ1NiwgMjQ2MywgODA1LCA4MDQsIDI0MjgsIDI0MjcsDQotICAgIDI0MjUsIDI0MjMsIDE3MjUsIDI0MjAsIDE3MjQsIDI0MTcsIDE3MjIsIDI0MzgsIDI0MzYsIDI0MzQsIDI0MzEsIDE3MjcsIDI0NDQsIDI0NDIsIDc5MywgNzkxLCA3ODgsIDc5NSwgMjM4OCwNCi0gICAgMjM4NiwgMjM4NCwgMTY5NywgMjM4MSwgMTY5NiwgMjM3OCwgMTY5NCwgMTY5MiwgMjQwMiwgMjQwMCwgMjM5OCwgMjM5NSwgMTcwMywgMjM5MiwgMTcwMSwgMjQxMiwgMjQxMCwgMjQwNywgNzUxLA0KLSAgICA3NDgsIDc0NCwgMjQxNiwgNzU5LCA3NTcsIDE4MDcsIDI2MjAsIDI2MTgsIDE4MDYsIDE4MDUsIDI2MTEsIDI2MDksIDI2MDcsIDI2MTQsIDE4MDIsIDE4MDEsIDE3OTksIDI1OTQsIDI1OTIsDQotICAgIDI1OTAsIDI1ODcsIDE4MDQsIDI2MDAsIDI1OTgsIDE3OTQsIDE3OTMsIDE3OTEsIDE3ODksIDI1NjQsIDI1NjIsIDI1NjAsIDI1NTcsIDE3OTgsIDI1NTQsIDE3OTYsIDI1NzQsIDI1NzIsIDI1NjksDQotICAgIDI1NzgsIDE4NDcsIDE4NDYsIDI3MjIsIDE4NDMsIDE4NDIsIDE4NDAsIDE4NDUsIDI3MTYsIDI3MTQsIDE4MzUsIDE4MzQsIDE4MzIsIDE4MzAsIDE4MzksIDE4MzcsIDI3MDAsIDI2OTgsIDI2OTUsDQotICAgIDI3MDQsIDE4MTcsIDE4MTEsIDE4MTAsIDg5NywgODYyLCAxNzc3LCA4MjksIDgyNiwgODM4LCAxNzYwLCAxNzU4LCA4MDgsIDI0ODEsIDE3NDEsIDE3NDAsIDE3MzgsIDE3NDMsIDI2MjQsIDE4MTgsDQotICAgIDI3MjYsIDI3NzYsIDc4MiwgNzQwLCA3MzcsIDE3MTUsIDY4NiwgNjc5LCA2OTUsIDE2ODIsIDE2ODAsIDYzOSwgNjI4LCAyMzM5LCA2NDcsIDY0NCwgMTY0NSwgMTY0MywgMTY0MCwgMTY0OCwNCi0gICAgNjAyLCA2MDAsIDU5NywgNTk1LCAyMzIwLCA1OTMsIDIzMTgsIDYwOSwgNjA3LCA2MDQsIDE2MTEsIDE2MTAsIDE2MDgsIDE2MDYsIDYxMywgMTYxNSwgMTYxMywgMjMyOCwgOTI2LCA5MjQsIDg5MiwNCi0gICAgODg2LCA4OTksIDg1NywgODUwLCAyNTA1LCAxNzc4LCA4MjQsIDgyMywgODIxLCA4MTksIDI0ODgsIDgxOCwgMjQ4NiwgODMzLCA4MzEsIDgyOCwgODQwLCAxNzYxLCAxNzU5LCAyNjQ5LCAyNjMyLA0KLSAgICAyNjMwLCAyNzQ2LCAyNzM0LCAyNzMyLCAyNzgyLCAyNzgxLCA1NzAsIDU2NywgMTU4NywgNTMxLCA1MjcsIDUyMywgNTQwLCAxNTY2LCAxNTY0LCA0NzYsIDQ2NywgNDYzLCAyMjQwLCA0ODYsDQotICAgIDQ4MywgMTUyNCwgMTUyMSwgMTUxOCwgMTUyOSwgNDExLCA0MDMsIDIxOTIsIDM5OSwgMjE4OSwgNDIzLCA0MTYsIDE0NjIsIDE0NTcsIDE0NTQsIDQyOCwgMTQ2OCwgMTQ2NSwgMjIxMCwgMzY2LA0KLSAgICAzNjMsIDIxNTgsIDM2MCwgMjE1NiwgMzU3LCAyMTUzLCAzNzYsIDM3MywgMzcwLCAyMTYzLCAxNDEwLCAxNDA5LCAxNDA3LCAxNDA1LCAzODIsIDE0MDIsIDM4MCwgMTQxNywgMTQxNSwgMTQxMiwNCi0gICAgMTQyMSwgMjE3NSwgMjE3NCwgNzc3LCA3NzQsIDc3MSwgNzg0LCA3MzIsIDcyNSwgNzIyLCAyNDA0LCA3NDMsIDE3MTYsIDY3NiwgNjc0LCA2NjgsIDIzNjMsIDY2NSwgMjM2MCwgNjg1LCAxNjg0LA0KLSAgICAxNjgxLCA2MjYsIDYyNCwgNjIyLCAyMzM1LCA2MjAsIDIzMzMsIDYxNywgMjMzMCwgNjQxLCA2MzUsIDY0OSwgMTY0NiwgMTY0NCwgMTY0MiwgMjU2NiwgOTI4LCA5MjUsIDI1MzAsIDI1MjcsDQotICAgIDg5NCwgODkxLCA4ODgsIDI1MDEsIDI0OTksIDI0OTYsIDg1OCwgODU2LCA4NTQsIDg1MSwgMTc3OSwgMjY5MiwgMjY2OCwgMjY2NSwgMjY0NSwgMjY0MywgMjY0MCwgMjY1MSwgMjc2OCwgMjc1OSwNCi0gICAgMjc1NywgMjc0NCwgMjc0MywgMjc0MSwgMjc0OCwgMzUyLCAxMzgyLCAzNDAsIDMzNywgMzMzLCAxMzcxLCAxMzY5LCAzMDcsIDMwMCwgMjk2LCAyMTI2LCAzMTUsIDMxMiwgMTM0NywgMTM0MiwNCi0gICAgMTM1MCwgMjYxLCAyNTgsIDI1MCwgMjA5NywgMjQ2LCAyMDk0LCAyNzEsIDI2OCwgMjY0LCAxMzA2LCAxMzAxLCAxMjk4LCAyNzYsIDEzMTIsIDEzMDksIDIxMTUsIDIwMywgMjA0OCwgMTk1LA0KLSAgICAyMDQ1LCAxOTEsIDIwNDEsIDIxMywgMjA5LCAyMDU2LCAxMjQ2LCAxMjQ0LCAxMjM4LCAyMjUsIDEyMzQsIDIyMiwgMTI1NiwgMTI1MywgMTI0OSwgMTI2MiwgMjA4MCwgMjA3OSwgMTU0LCAxOTk3LA0KLSAgICAxNTAsIDE5OTUsIDE0NywgMTk5MiwgMTk4OSwgMTYzLCAxNjAsIDIwMDQsIDE1NiwgMjAwMSwgMTE3NSwgMTE3NCwgMTE3MiwgMTE3MCwgMTE2NywgMTcwLCAxMTY0LCAxNjcsIDExODUsIDExODMsDQotICAgIDExODAsIDExNzcsIDE3NCwgMTE5MCwgMTE4OCwgMjAyNSwgMjAyNCwgMjAyMiwgNTg3LCA1ODYsIDU2NCwgNTU5LCA1NTYsIDIyOTAsIDU3MywgMTU4OCwgNTIwLCA1MTgsIDUxMiwgMjI2OCwNCi0gICAgNTA4LCAyMjY1LCA1MzAsIDE1NjgsIDE1NjUsIDQ2MSwgNDU3LCAyMjMzLCA0NTAsIDIyMzAsIDQ0NiwgMjIyNiwgNDc5LCA0NzEsIDQ4OSwgMTUyNiwgMTUyMywgMTUyMCwgMzk3LCAzOTUsDQotICAgIDIxODUsIDM5MiwgMjE4MywgMzg5LCAyMTgwLCAyMTc3LCA0MTAsIDIxOTQsIDQwMiwgNDIyLCAxNDYzLCAxNDYxLCAxNDU5LCAxNDU2LCAxNDcwLCAyNDU1LCA3OTksIDI0MzMsIDI0MzAsIDc3OSwNCi0gICAgNzc2LCA3NzMsIDIzOTcsIDIzOTQsIDIzOTAsIDczNCwgNzI4LCA3MjQsIDc0NiwgMTcxNywgMjM1NiwgMjM1NCwgMjM1MSwgMjM0OCwgMTY1OCwgNjc3LCA2NzUsIDY3MywgNjcwLCA2NjcsIDY4OCwNCi0gICAgMTY4NSwgMTY4MywgMjYwNiwgMjU4OSwgMjU4NiwgMjU1OSwgMjU1NiwgMjU1MiwgOTI3LCAyNTIzLCAyNTIxLCAyNTE4LCAyNTE1LCAxNzg0LCAyNTMyLCA4OTUsIDg5MywgODkwLCAyNzE4LA0KLSAgICAyNzA5LCAyNzA3LCAyNjg5LCAyNjg3LCAyNjg0LCAyNjYzLCAyNjYyLCAyNjYwLCAyNjU4LCAxODI1LCAyNjY3LCAyNzY5LCAxODUyLCAyNzYwLCAyNzU4LCAxNDIsIDE0MSwgMTEzOSwgMTEzOCwNCi0gICAgMTM0LCAxMzIsIDEyOSwgMTI2LCAxOTgyLCAxMTI5LCAxMTI4LCAxMTI2LCAxMTMxLCAxMTMsIDExMSwgMTA4LCAxMDUsIDE5NzIsIDEwMSwgMTk3MCwgMTIwLCAxMTgsIDExNSwgMTEwOSwgMTEwOCwNCi0gICAgMTEwNiwgMTEwNCwgMTIzLCAxMTEzLCAxMTExLCA4MiwgNzksIDE5NTEsIDc1LCAxOTQ5LCA3MiwgMTk0NiwgOTIsIDg5LCA4NiwgMTk1NiwgMTA3NywgMTA3NiwgMTA3NCwgMTA3MiwgOTgsDQotICAgIDEwNjksIDk2LCAxMDg0LCAxMDgyLCAxMDc5LCAxMDg4LCAxOTY4LCAxOTY3LCA0OCwgNDUsIDE5MTYsIDQyLCAxOTE0LCAzOSwgMTkxMSwgMTkwOCwgNjAsIDU3LCA1NCwgMTkyMywgNTAsIDE5MjAsDQotICAgIDEwMzEsIDEwMzAsIDEwMjgsIDEwMjYsIDY3LCAxMDIzLCA2NSwgMTAyMCwgNjIsIDEwNDEsIDEwMzksIDEwMzYsIDEwMzMsIDY5LCAxMDQ2LCAxMDQ0LCAxOTQ0LCAxOTQzLCAxOTQxLCAxMSwgOSwNCi0gICAgMTg2OCwgNywgMTg2NSwgMTg2MiwgMTg1OSwgMjAsIDE4NzgsIDE2LCAxODc1LCAxMywgMTg3MiwgOTcwLCA5NjgsIDk2NiwgOTYzLCAyOSwgOTYwLCAyNiwgMjMsIDk4MywgOTgxLCA5NzgsIDk3NSwNCi0gICAgMzMsIDk3MSwgMzEsIDk5MCwgOTg4LCA5ODUsIDE5MDYsIDE5MDQsIDE5MDIsIDk5MywgMzUxLCAyMTQ1LCAxMzgzLCAzMzEsIDMzMCwgMzI4LCAzMjYsIDIxMzcsIDMyMywgMjEzNSwgMzM5LA0KLSAgICAxMzcyLCAxMzcwLCAyOTQsIDI5MywgMjkxLCAyODksIDIxMjIsIDI4NiwgMjEyMCwgMjgzLCAyMTE3LCAzMDksIDMwMywgMzE3LCAxMzQ4LCAxMzQ2LCAxMzQ0LCAyNDUsIDI0NCwgMjQyLCAyMDkwLA0KLSAgICAyMzksIDIwODgsIDIzNiwgMjA4NSwgMjA4MiwgMjYwLCAyMDk5LCAyNDksIDI3MCwgMTMwNywgMTMwNSwgMTMwMywgMTMwMCwgMTMxNCwgMTg5LCAyMDM4LCAxODYsIDIwMzYsIDE4MywgMjAzMywNCi0gICAgMjAzMCwgMjAyNiwgMjA2LCAxOTgsIDIwNDcsIDE5NCwgMjE2LCAxMjQ3LCAxMjQ1LCAxMjQzLCAxMjQwLCAyMjcsIDEyMzcsIDEyNTUsIDIzMTAsIDIzMDIsIDIzMDAsIDIyODYsIDIyODQsDQotICAgIDIyODEsIDU2NSwgNTYzLCA1NjEsIDU1OCwgNTc1LCAxNTg5LCAyMjYxLCAyMjU5LCAyMjU2LCAyMjUzLCAxNTQyLCA1MjEsIDUxOSwgNTE3LCA1MTQsIDIyNzAsIDUxMSwgNTMzLCAxNTY5LA0KLSAgICAxNTY3LCAyMjIzLCAyMjIxLCAyMjE4LCAyMjE1LCAxNDgzLCAyMjExLCAxNDgwLCA0NTksIDQ1NiwgNDUzLCAyMjMyLCA0NDksIDQ3NCwgNDkxLCAxNTI3LCAxNTI1LCAxNTIyLCAyNDc1LCAyNDY3LA0KLSAgICAyNDY1LCAyNDUxLCAyNDQ5LCAyNDQ2LCA4MDEsIDgwMCwgMjQyNiwgMjQyNCwgMjQyMSwgMjQxOCwgMTcyMywgMjQzNSwgNzgwLCA3NzgsIDc3NSwgMjM4NywgMjM4NSwgMjM4MiwgMjM3OSwNCi0gICAgMTY5NSwgMjM3NSwgMTY5MywgMjM5NiwgNzM1LCA3MzMsIDczMCwgNzI3LCA3NDksIDE3MTgsIDI2MTYsIDI2MTUsIDI2MDQsIDI2MDMsIDI2MDEsIDI1ODQsIDI1ODMsIDI1ODEsIDI1NzksDQotICAgIDE4MDAsIDI1OTEsIDI1NTAsIDI1NDksIDI1NDcsIDI1NDUsIDE3OTIsIDI1NDIsIDE3OTAsIDI1NTgsIDkyOSwgMjcxOSwgMTg0MSwgMjcxMCwgMjcwOCwgMTgzMywgMTgzMSwgMjY5MCwgMjY4OCwNCi0gICAgMjY4NiwgMTgxNSwgMTgwOSwgMTgwOCwgMTc3NCwgMTc1NiwgMTc1NCwgMTczNywgMTczNiwgMTczNCwgMTczOSwgMTgxNiwgMTcxMSwgMTY3NiwgMTY3NCwgNjMzLCA2MjksIDE2MzgsIDE2MzYsDQotICAgIDE2MzMsIDE2NDEsIDU5OCwgMTYwNSwgMTYwNCwgMTYwMiwgMTYwMCwgNjA1LCAxNjA5LCAxNjA3LCAyMzI3LCA4ODcsIDg1MywgMTc3NSwgODIyLCA4MjAsIDE3NTcsIDE3NTUsIDE1ODQsIDUyNCwNCi0gICAgMTU2MCwgMTU1OCwgNDY4LCA0NjQsIDE1MTQsIDE1MTEsIDE1MDgsIDE1MTksIDQwOCwgNDA0LCA0MDAsIDE0NTIsIDE0NDcsIDE0NDQsIDQxNywgMTQ1OCwgMTQ1NSwgMjIwOCwgMzY0LCAzNjEsDQotICAgIDM1OCwgMjE1NCwgMTQwMSwgMTQwMCwgMTM5OCwgMTM5NiwgMzc0LCAxMzkzLCAzNzEsIDE0MDgsIDE0MDYsIDE0MDMsIDE0MTMsIDIxNzMsIDIxNzIsIDc3MiwgNzI2LCA3MjMsIDE3MTIsIDY3MiwNCi0gICAgNjY5LCA2NjYsIDY4MiwgMTY3OCwgMTY3NSwgNjI1LCA2MjMsIDYyMSwgNjE4LCAyMzMxLCA2MzYsIDYzMiwgMTYzOSwgMTYzNywgMTYzNSwgOTIwLCA5MTgsIDg4NCwgODgwLCA4ODksIDg0OSwNCi0gICAgODQ4LCA4NDcsIDg0NiwgMjQ5NywgODU1LCA4NTIsIDE3NzYsIDI2NDEsIDI3NDIsIDI3ODcsIDEzODAsIDMzNCwgMTM2NywgMTM2NSwgMzAxLCAyOTcsIDEzNDAsIDEzMzgsIDEzMzUsIDEzNDMsDQotICAgIDI1NSwgMjUxLCAyNDcsIDEyOTYsIDEyOTEsIDEyODgsIDI2NSwgMTMwMiwgMTI5OSwgMjExMywgMjA0LCAxOTYsIDE5MiwgMjA0MiwgMTIzMiwgMTIzMCwgMTIyNCwgMjE0LCAxMjIwLCAyMTAsDQotICAgIDEyNDIsIDEyMzksIDEyMzUsIDEyNTAsIDIwNzcsIDIwNzUsIDE1MSwgMTQ4LCAxOTkzLCAxNDQsIDE5OTAsIDExNjMsIDExNjIsIDExNjAsIDExNTgsIDExNTUsIDE2MSwgMTE1MiwgMTU3LA0KLSAgICAxMTczLCAxMTcxLCAxMTY4LCAxMTY1LCAxNjgsIDExODEsIDExNzgsIDIwMjEsIDIwMjAsIDIwMTgsIDIwMjMsIDU4NSwgNTYwLCA1NTcsIDE1ODUsIDUxNiwgNTA5LCAxNTYyLCAxNTU5LCA0NTgsDQotICAgIDQ0NywgMjIyNywgNDcyLCAxNTE2LCAxNTEzLCAxNTEwLCAzOTgsIDM5NiwgMzkzLCAzOTAsIDIxODEsIDM4NiwgMjE3OCwgNDA3LCAxNDUzLCAxNDUxLCAxNDQ5LCAxNDQ2LCA0MjAsIDE0NjAsDQotICAgIDIyMDksIDc2OSwgNzY0LCA3MjAsIDcxMiwgMjM5MSwgNzI5LCAxNzEzLCA2NjQsIDY2MywgNjYxLCA2NTksIDIzNTIsIDY1NiwgMjM0OSwgNjcxLCAxNjc5LCAxNjc3LCAyNTUzLCA5MjIsIDkxOSwNCi0gICAgMjUxOSwgMjUxNiwgODg1LCA4ODMsIDg4MSwgMjY4NSwgMjY2MSwgMjY1OSwgMjc2NywgMjc1NiwgMjc1NSwgMTQwLCAxMTM3LCAxMTM2LCAxMzAsIDEyNywgMTEyNSwgMTEyNCwgMTEyMiwgMTEyNywNCi0gICAgMTA5LCAxMDYsIDEwMiwgMTEwMywgMTEwMiwgMTEwMCwgMTA5OCwgMTE2LCAxMTA3LCAxMTA1LCAxOTgwLCA4MCwgNzYsIDczLCAxOTQ3LCAxMDY4LCAxMDY3LCAxMDY1LCAxMDYzLCA5MCwgMTA2MCwNCi0gICAgODcsIDEwNzUsIDEwNzMsIDEwNzAsIDEwODAsIDE5NjYsIDE5NjUsIDQ2LCA0MywgNDAsIDE5MTIsIDM2LCAxOTA5LCAxMDE5LCAxMDE4LCAxMDE2LCAxMDE0LCA1OCwgMTAxMSwgNTUsIDEwMDgsDQotICAgIDUxLCAxMDI5LCAxMDI3LCAxMDI0LCAxMDIxLCA2MywgMTAzNywgMTAzNCwgMTk0MCwgMTkzOSwgMTkzNywgMTk0MiwgOCwgMTg2NiwgNCwgMTg2MywgMSwgMTg2MCwgOTU2LCA5NTQsIDk1MiwNCi0gICAgOTQ5LCA5NDYsIDE3LCAxNCwgOTY5LCA5NjcsIDk2NCwgOTYxLCAyNywgOTU3LCAyNCwgOTc5LCA5NzYsIDk3MiwgMTkwMSwgMTkwMCwgMTg5OCwgMTg5NiwgOTg2LCAxOTA1LCAxOTAzLCAzNTAsDQotICAgIDM0OSwgMTM4MSwgMzI5LCAzMjcsIDMyNCwgMTM2OCwgMTM2NiwgMjkyLCAyOTAsIDI4NywgMjg0LCAyMTE4LCAzMDQsIDEzNDEsIDEzMzksIDEzMzcsIDEzNDUsIDI0MywgMjQwLCAyMzcsIDIwODYsDQotICAgIDIzMywgMjA4MywgMjU0LCAxMjk3LCAxMjk1LCAxMjkzLCAxMjkwLCAxMzA0LCAyMTE0LCAxOTAsIDE4NywgMTg0LCAyMDM0LCAxODAsIDIwMzEsIDE3NywgMjAyNywgMTk5LCAxMjMzLCAxMjMxLA0KLSAgICAxMjI5LCAxMjI2LCAyMTcsIDEyMjMsIDEyNDEsIDIwNzgsIDIwNzYsIDU4NCwgNTU1LCA1NTQsIDU1MiwgNTUwLCAyMjgyLCA1NjIsIDE1ODYsIDUwNywgNTA2LCA1MDQsIDUwMiwgMjI1NywgNDk5LA0KLSAgICAyMjU0LCA1MTUsIDE1NjMsIDE1NjEsIDQ0NSwgNDQzLCA0NDEsIDIyMTksIDQzOCwgMjIxNiwgNDM1LCAyMjEyLCA0NjAsIDQ1NCwgNDc1LCAxNTE3LCAxNTE1LCAxNTEyLCAyNDQ3LCA3OTgsDQotICAgIDc5NywgMjQyMiwgMjQxOSwgNzcwLCA3NjgsIDc2NiwgMjM4MywgMjM4MCwgMjM3NiwgNzIxLCA3MTksIDcxNywgNzE0LCA3MzEsIDE3MTQsIDI2MDIsIDI1ODIsIDI1ODAsIDI1NDgsIDI1NDYsDQotICAgIDI1NDMsIDkyMywgOTIxLCAyNzE3LCAyNzA2LCAyNzA1LCAyNjgzLCAyNjgyLCAyNjgwLCAxNzcxLCAxNzUyLCAxNzUwLCAxNzMzLCAxNzMyLCAxNzMxLCAxNzM1LCAxODE0LCAxNzA3LCAxNjcwLA0KLSAgICAxNjY4LCAxNjMxLCAxNjI5LCAxNjI2LCAxNjM0LCAxNTk5LCAxNTk4LCAxNTk2LCAxNTk0LCAxNjAzLCAxNjAxLCAyMzI2LCAxNzcyLCAxNzUzLCAxNzUxLCAxNTgxLCAxNTU0LCAxNTUyLCAxNTA0LA0KLSAgICAxNTAxLCAxNDk4LCAxNTA5LCAxNDQyLCAxNDM3LCAxNDM0LCA0MDEsIDE0NDgsIDE0NDUsIDIyMDYsIDEzOTIsIDEzOTEsIDEzODksIDEzODcsIDEzODQsIDM1OSwgMTM5OSwgMTM5NywgMTM5NCwNCi0gICAgMTQwNCwgMjE3MSwgMjE3MCwgMTcwOCwgMTY3MiwgMTY2OSwgNjE5LCAxNjMyLCAxNjMwLCAxNjI4LCAxNzczLCAxMzc4LCAxMzYzLCAxMzYxLCAxMzMzLCAxMzI4LCAxMzM2LCAxMjg2LCAxMjgxLA0KLSAgICAxMjc4LCAyNDgsIDEyOTIsIDEyODksIDIxMTEsIDEyMTgsIDEyMTYsIDEyMTAsIDE5NywgMTIwNiwgMTkzLCAxMjI4LCAxMjI1LCAxMjIxLCAxMjM2LCAyMDczLCAyMDcxLCAxMTUxLCAxMTUwLA0KLSAgICAxMTQ4LCAxMTQ2LCAxNTIsIDExNDMsIDE0OSwgMTE0MCwgMTQ1LCAxMTYxLCAxMTU5LCAxMTU2LCAxMTUzLCAxNTgsIDExNjksIDExNjYsIDIwMTcsIDIwMTYsIDIwMTQsIDIwMTksIDE1ODIsDQotICAgIDUxMCwgMTU1NiwgMTU1MywgNDUyLCA0NDgsIDE1MDYsIDE1MDAsIDM5NCwgMzkxLCAzODcsIDE0NDMsIDE0NDEsIDE0MzksIDE0MzYsIDE0NTAsIDIyMDcsIDc2NSwgNzE2LCA3MTMsIDE3MDksDQotICAgIDY2MiwgNjYwLCA2NTcsIDE2NzMsIDE2NzEsIDkxNiwgOTE0LCA4NzksIDg3OCwgODc3LCA4ODIsIDExMzUsIDExMzQsIDExMjEsIDExMjAsIDExMTgsIDExMjMsIDEwOTcsIDEwOTYsIDEwOTQsDQotICAgIDEwOTIsIDEwMywgMTEwMSwgMTA5OSwgMTk3OSwgMTA1OSwgMTA1OCwgMTA1NiwgMTA1NCwgNzcsIDEwNTEsIDc0LCAxMDY2LCAxMDY0LCAxMDYxLCAxMDcxLCAxOTY0LCAxOTYzLCAxMDA3LA0KLSAgICAxMDA2LCAxMDA0LCAxMDAyLCA5OTksIDQxLCA5OTYsIDM3LCAxMDE3LCAxMDE1LCAxMDEyLCAxMDA5LCA1MiwgMTAyNSwgMTAyMiwgMTkzNiwgMTkzNSwgMTkzMywgMTkzOCwgOTQyLCA5NDAsDQotICAgIDkzOCwgOTM1LCA5MzIsIDUsIDIsIDk1NSwgOTUzLCA5NTAsIDk0NywgMTgsIDk0MywgMTUsIDk2NSwgOTYyLCA5NTgsIDE4OTUsIDE4OTQsIDE4OTIsIDE4OTAsIDk3MywgMTg5OSwgMTg5NywNCi0gICAgMTM3OSwgMzI1LCAxMzY0LCAxMzYyLCAyODgsIDI4NSwgMTMzNCwgMTMzMiwgMTMzMCwgMjQxLCAyMzgsIDIzNCwgMTI4NywgMTI4NSwgMTI4MywgMTI4MCwgMTI5NCwgMjExMiwgMTg4LCAxODUsDQotICAgIDE4MSwgMTc4LCAyMDI4LCAxMjE5LCAxMjE3LCAxMjE1LCAxMjEyLCAyMDAsIDEyMDksIDEyMjcsIDIwNzQsIDIwNzIsIDU4MywgNTUzLCA1NTEsIDE1ODMsIDUwNSwgNTAzLCA1MDAsIDUxMywNCi0gICAgMTU1NywgMTU1NSwgNDQ0LCA0NDIsIDQzOSwgNDM2LCAyMjEzLCA0NTUsIDQ1MSwgMTUwNywgMTUwNSwgMTUwMiwgNzk2LCA3NjMsIDc2MiwgNzYwLCA3NjcsIDcxMSwgNzEwLCA3MDgsIDcwNiwNCi0gICAgMjM3NywgNzE4LCA3MTUsIDE3MTAsIDI1NDQsIDkxNywgOTE1LCAyNjgxLCAxNjI3LCAxNTk3LCAxNTk1LCAyMzI1LCAxNzY5LCAxNzQ5LCAxNzQ3LCAxNDk5LCAxNDM4LCAxNDM1LCAyMjA0LA0KLSAgICAxMzkwLCAxMzg4LCAxMzg1LCAxMzk1LCAyMTY5LCAyMTY3LCAxNzA0LCAxNjY1LCAxNjYyLCAxNjI1LCAxNjIzLCAxNjIwLCAxNzcwLCAxMzI5LCAxMjgyLCAxMjc5LCAyMTA5LCAxMjE0LCAxMjA3LA0KLSAgICAxMjIyLCAyMDY4LCAyMDY1LCAxMTQ5LCAxMTQ3LCAxMTQ0LCAxMTQxLCAxNDYsIDExNTcsIDExNTQsIDIwMTMsIDIwMTEsIDIwMDgsIDIwMTUsIDE1NzksIDE1NDksIDE1NDYsIDE0OTUsIDE0ODcsDQotICAgIDE0MzMsIDE0MzEsIDE0MjgsIDE0MjUsIDM4OCwgMTQ0MCwgMjIwNSwgMTcwNSwgNjU4LCAxNjY3LCAxNjY0LCAxMTE5LCAxMDk1LCAxMDkzLCAxOTc4LCAxMDU3LCAxMDU1LCAxMDUyLCAxMDYyLA0KLSAgICAxOTYyLCAxOTYwLCAxMDA1LCAxMDAzLCAxMDAwLCA5OTcsIDM4LCAxMDEzLCAxMDEwLCAxOTMyLCAxOTMwLCAxOTI3LCAxOTM0LCA5NDEsIDkzOSwgOTM2LCA5MzMsIDYsIDkzMCwgMywgOTUxLA0KLSAgICA5NDgsIDk0NCwgMTg4OSwgMTg4NywgMTg4NCwgMTg4MSwgOTU5LCAxODkzLCAxODkxLCAzNSwgMTM3NywgMTM2MCwgMTM1OCwgMTMyNywgMTMyNSwgMTMyMiwgMTMzMSwgMTI3NywgMTI3NSwNCi0gICAgMTI3MiwgMTI2OSwgMjM1LCAxMjg0LCAyMTEwLCAxMjA1LCAxMjA0LCAxMjAxLCAxMTk4LCAxODIsIDExOTUsIDE3OSwgMTIxMywgMjA3MCwgMjA2NywgMTU4MCwgNTAxLCAxNTUxLCAxNTQ4LA0KLSAgICA0NDAsIDQzNywgMTQ5NywgMTQ5NCwgMTQ5MCwgMTUwMywgNzYxLCA3MDksIDcwNywgMTcwNiwgOTEzLCA5MTIsIDIxOTgsIDEzODYsIDIxNjQsIDIxNjEsIDE2MjEsIDE3NjYsIDIxMDMsIDEyMDgsDQotICAgIDIwNTgsIDIwNTQsIDExNDUsIDExNDIsIDIwMDUsIDIwMDIsIDE5OTksIDIwMDksIDE0ODgsIDE0MjksIDE0MjYsIDIyMDAsIDE2OTgsIDE2NTksIDE2NTYsIDE5NzUsIDEwNTMsIDE5NTcsIDE5NTQsDQotICAgIDEwMDEsIDk5OCwgMTkyNCwgMTkyMSwgMTkxOCwgMTkyOCwgOTM3LCA5MzQsIDkzMSwgMTg3OSwgMTg3NiwgMTg3MywgMTg3MCwgOTQ1LCAxODg1LCAxODgyLCAxMzIzLCAxMjczLCAxMjcwLA0KLSAgICAyMTA1LCAxMjAyLCAxMTk5LCAxMTk2LCAxMjExLCAyMDYxLCAyMDU3LCAxNTc2LCAxNTQzLCAxNTQwLCAxNDg0LCAxNDgxLCAxNDc4LCAxNDkxLCAxNzAwDQotfTsNCi1DQkNfUERGNDE3Q29tbW9uOjpDQkNfUERGNDE3Q29tbW9uKCkNCi17DQorICAgIDI2MjcsIDE4MTksIDI2MjIsIDI2MjEsIDE4MTMsIDE4MTIsIDI3MjksIDI3MjQsIDI3MjMsIDI3NzksIDI3NzQsIDI3NzMsDQorICAgIDkwMiwgIDg5NiwgIDkwOCwgIDg2OCwgIDg2NSwgIDg2MSwgIDg1OSwgIDI1MTEsIDg3MywgIDg3MSwgIDE3ODAsIDgzNSwNCisgICAgMjQ5MywgODI1LCAgMjQ5MSwgODQyLCAgODM3LCAgODQ0LCAgMTc2NCwgMTc2MiwgODExLCAgODEwLCAgODA5LCAgMjQ4MywNCisgICAgODA3LCAgMjQ4MiwgODA2LCAgMjQ4MCwgODE1LCAgODE0LCAgODEzLCAgODEyLCAgMjQ4NCwgODE3LCAgODE2LCAgMTc0NSwNCisgICAgMTc0NCwgMTc0MiwgMTc0NiwgMjY1NSwgMjYzNywgMjYzNSwgMjYyNiwgMjYyNSwgMjYyMywgMjYyOCwgMTgyMCwgMjc1MiwNCisgICAgMjczOSwgMjczNywgMjcyOCwgMjcyNywgMjcyNSwgMjczMCwgMjc4NSwgMjc4MywgMjc3OCwgMjc3NywgMjc3NSwgMjc4MCwNCisgICAgNzg3LCAgNzgxLCAgNzQ3LCAgNzM5LCAgNzM2LCAgMjQxMywgNzU0LCAgNzUyLCAgMTcxOSwgNjkyLCAgNjg5LCAgNjgxLA0KKyAgICAyMzcxLCA2NzgsICAyMzY5LCA3MDAsICA2OTcsICA2OTQsICA3MDMsICAxNjg4LCAxNjg2LCA2NDIsICA2MzgsICAyMzQzLA0KKyAgICA2MzEsICAyMzQxLCA2MjcsICAyMzM4LCA2NTEsICA2NDYsICA2NDMsICAyMzQ1LCA2NTQsICA2NTIsICAxNjUyLCAxNjUwLA0KKyAgICAxNjQ3LCAxNjU0LCA2MDEsICA1OTksICAyMzIyLCA1OTYsICAyMzIxLCA1OTQsICAyMzE5LCAyMzE3LCA2MTEsICA2MTAsDQorICAgIDYwOCwgIDYwNiwgIDIzMjQsIDYwMywgIDIzMjMsIDYxNSwgIDYxNCwgIDYxMiwgIDE2MTcsIDE2MTYsIDE2MTQsIDE2MTIsDQorICAgIDYxNiwgIDE2MTksIDE2MTgsIDI1NzUsIDI1MzgsIDI1MzYsIDkwNSwgIDkwMSwgIDg5OCwgIDkwOSwgIDI1MDksIDI1MDcsDQorICAgIDI1MDQsIDg3MCwgIDg2NywgIDg2NCwgIDg2MCwgIDI1MTIsIDg3NSwgIDg3MiwgIDE3ODEsIDI0OTAsIDI0ODksIDI0ODcsDQorICAgIDI0ODUsIDE3NDgsIDgzNiwgIDgzNCwgIDgzMiwgIDgzMCwgIDI0OTQsIDgyNywgIDI0OTIsIDg0MywgIDg0MSwgIDgzOSwNCisgICAgODQ1LCAgMTc2NSwgMTc2MywgMjcwMSwgMjY3NiwgMjY3NCwgMjY1MywgMjY0OCwgMjY1NiwgMjYzNCwgMjYzMywgMjYzMSwNCisgICAgMjYyOSwgMTgyMSwgMjYzOCwgMjYzNiwgMjc3MCwgMjc2MywgMjc2MSwgMjc1MCwgMjc0NSwgMjc1MywgMjczNiwgMjczNSwNCisgICAgMjczMywgMjczMSwgMTg0OCwgMjc0MCwgMjczOCwgMjc4NiwgMjc4NCwgNTkxLCAgNTg4LCAgNTc2LCAgNTY5LCAgNTY2LA0KKyAgICAyMjk2LCAxNTkwLCA1MzcsICA1MzQsICA1MjYsICAyMjc2LCA1MjIsICAyMjc0LCA1NDUsICA1NDIsICA1MzksICA1NDgsDQorICAgIDE1NzIsIDE1NzAsIDQ4MSwgIDIyNDUsIDQ2NiwgIDIyNDIsIDQ2MiwgIDIyMzksIDQ5MiwgIDQ4NSwgIDQ4MiwgIDIyNDksDQorICAgIDQ5NiwgIDQ5NCwgIDE1MzQsIDE1MzEsIDE1MjgsIDE1MzgsIDQxMywgIDIxOTYsIDQwNiwgIDIxOTEsIDIxODgsIDQyNSwNCisgICAgNDE5LCAgMjIwMiwgNDE1LCAgMjE5OSwgNDMyLCAgNDMwLCAgNDI3LCAgMTQ3MiwgMTQ2NywgMTQ2NCwgNDMzLCAgMTQ3NiwNCisgICAgMTQ3NCwgMzY4LCAgMzY3LCAgMjE2MCwgMzY1LCAgMjE1OSwgMzYyLCAgMjE1NywgMjE1NSwgMjE1MiwgMzc4LCAgMzc3LA0KKyAgICAzNzUsICAyMTY2LCAzNzIsICAyMTY1LCAzNjksICAyMTYyLCAzODMsICAzODEsICAzNzksICAyMTY4LCAxNDE5LCAxNDE4LA0KKyAgICAxNDE2LCAxNDE0LCAzODUsICAxNDExLCAzODQsICAxNDIzLCAxNDIyLCAxNDIwLCAxNDI0LCAyNDYxLCA4MDIsICAyNDQxLA0KKyAgICAyNDM5LCA3OTAsICA3ODYsICA3ODMsICA3OTQsICAyNDA5LCAyNDA2LCAyNDAzLCA3NTAsICA3NDIsICA3MzgsICAyNDE0LA0KKyAgICA3NTYsICA3NTMsICAxNzIwLCAyMzY3LCAyMzY1LCAyMzYyLCAyMzU5LCAxNjYzLCA2OTMsICA2OTEsICA2ODQsICAyMzczLA0KKyAgICA2ODAsICAyMzcwLCA3MDIsICA2OTksICA2OTYsICA3MDQsICAxNjkwLCAxNjg3LCAyMzM3LCAyMzM2LCAyMzM0LCAyMzMyLA0KKyAgICAxNjI0LCAyMzI5LCAxNjIyLCA2NDAsICA2MzcsICAyMzQ0LCA2MzQsICAyMzQyLCA2MzAsICAyMzQwLCA2NTAsICA2NDgsDQorICAgIDY0NSwgIDIzNDYsIDY1NSwgIDY1MywgIDE2NTMsIDE2NTEsIDE2NDksIDE2NTUsIDI2MTIsIDI1OTcsIDI1OTUsIDI1NzEsDQorICAgIDI1NjgsIDI1NjUsIDI1NzYsIDI1MzQsIDI1MjksIDI1MjYsIDE3ODcsIDI1NDAsIDI1MzcsIDkwNywgIDkwNCwgIDkwMCwNCisgICAgOTEwLCAgMjUwMywgMjUwMiwgMjUwMCwgMjQ5OCwgMTc2OCwgMjQ5NSwgMTc2NywgMjUxMCwgMjUwOCwgMjUwNiwgODY5LA0KKyAgICA4NjYsICA4NjMsICAyNTEzLCA4NzYsICA4NzQsICAxNzgyLCAyNzIwLCAyNzEzLCAyNzExLCAyNjk3LCAyNjk0LCAyNjkxLA0KKyAgICAyNzAyLCAyNjcyLCAyNjcwLCAyNjY0LCAxODI4LCAyNjc4LCAyNjc1LCAyNjQ3LCAyNjQ2LCAyNjQ0LCAyNjQyLCAxODIzLA0KKyAgICAyNjM5LCAxODIyLCAyNjU0LCAyNjUyLCAyNjUwLCAyNjU3LCAyNzcxLCAxODU1LCAyNzY1LCAyNzYyLCAxODUwLCAxODQ5LA0KKyAgICAyNzUxLCAyNzQ5LCAyNzQ3LCAyNzU0LCAzNTMsICAyMTQ4LCAzNDQsICAzNDIsICAzMzYsICAyMTQyLCAzMzIsICAyMTQwLA0KKyAgICAzNDUsICAxMzc1LCAxMzczLCAzMDYsICAyMTMwLCAyOTksICAyMTI4LCAyOTUsICAyMTI1LCAzMTksICAzMTQsICAzMTEsDQorICAgIDIxMzIsIDEzNTQsIDEzNTIsIDEzNDksIDEzNTYsIDI2MiwgIDI1NywgIDIxMDEsIDI1MywgIDIwOTYsIDIwOTMsIDI3NCwNCisgICAgMjczLCAgMjY3LCAgMjEwNywgMjYzLCAgMjEwNCwgMjgwLCAgMjc4LCAgMjc1LCAgMTMxNiwgMTMxMSwgMTMwOCwgMTMyMCwNCisgICAgMTMxOCwgMjA1MiwgMjAyLCAgMjA1MCwgMjA0NCwgMjA0MCwgMjE5LCAgMjA2MywgMjEyLCAgMjA2MCwgMjA4LCAgMjA1NSwNCisgICAgMjI0LCAgMjIxLCAgMjA2NiwgMTI2MCwgMTI1OCwgMTI1MiwgMjMxLCAgMTI0OCwgMjI5LCAgMTI2NiwgMTI2NCwgMTI2MSwNCisgICAgMTI2OCwgMTU1LCAgMTk5OCwgMTUzLCAgMTk5NiwgMTk5NCwgMTk5MSwgMTk4OCwgMTY1LCAgMTY0LCAgMjAwNywgMTYyLA0KKyAgICAyMDA2LCAxNTksICAyMDAzLCAyMDAwLCAxNzIsICAxNzEsICAxNjksICAyMDEyLCAxNjYsICAyMDEwLCAxMTg2LCAxMTg0LA0KKyAgICAxMTgyLCAxMTc5LCAxNzUsICAxMTc2LCAxNzMsICAxMTkyLCAxMTkxLCAxMTg5LCAxMTg3LCAxNzYsICAxMTk0LCAxMTkzLA0KKyAgICAyMzEzLCAyMzA3LCAyMzA1LCA1OTIsICA1ODksICAyMjk0LCAyMjkyLCAyMjg5LCA1NzgsICA1NzIsICA1NjgsICAyMjk3LA0KKyAgICA1ODAsICAxNTkxLCAyMjcyLCAyMjY3LCAyMjY0LCAxNTQ3LCA1MzgsICA1MzYsICA1MjksICAyMjc4LCA1MjUsICAyMjc1LA0KKyAgICA1NDcsICA1NDQsICA1NDEsICAxNTc0LCAxNTcxLCAyMjM3LCAyMjM1LCAyMjI5LCAxNDkzLCAyMjI1LCAxNDg5LCA0NzgsDQorICAgIDIyNDcsIDQ3MCwgIDIyNDQsIDQ2NSwgIDIyNDEsIDQ5MywgIDQ4OCwgIDQ4NCwgIDIyNTAsIDQ5OCwgIDQ5NSwgIDE1MzYsDQorICAgIDE1MzMsIDE1MzAsIDE1MzksIDIxODcsIDIxODYsIDIxODQsIDIxODIsIDE0MzIsIDIxNzksIDE0MzAsIDIxNzYsIDE0MjcsDQorICAgIDQxNCwgIDQxMiwgIDIxOTcsIDQwOSwgIDIxOTUsIDQwNSwgIDIxOTMsIDIxOTAsIDQyNiwgIDQyNCwgIDQyMSwgIDIyMDMsDQorICAgIDQxOCwgIDIyMDEsIDQzMSwgIDQyOSwgIDE0NzMsIDE0NzEsIDE0NjksIDE0NjYsIDQzNCwgIDE0NzcsIDE0NzUsIDI0NzgsDQorICAgIDI0NzIsIDI0NzAsIDI0NTksIDI0NTcsIDI0NTQsIDI0NjIsIDgwMywgIDI0MzcsIDI0MzIsIDI0MjksIDE3MjYsIDI0NDMsDQorICAgIDI0NDAsIDc5MiwgIDc4OSwgIDc4NSwgIDI0MDEsIDIzOTksIDIzOTMsIDE3MDIsIDIzODksIDE2OTksIDI0MTEsIDI0MDgsDQorICAgIDI0MDUsIDc0NSwgIDc0MSwgIDI0MTUsIDc1OCwgIDc1NSwgIDE3MjEsIDIzNTgsIDIzNTcsIDIzNTUsIDIzNTMsIDE2NjEsDQorICAgIDIzNTAsIDE2NjAsIDIzNDcsIDE2NTcsIDIzNjgsIDIzNjYsIDIzNjQsIDIzNjEsIDE2NjYsIDY5MCwgIDY4NywgIDIzNzQsDQorICAgIDY4MywgIDIzNzIsIDcwMSwgIDY5OCwgIDcwNSwgIDE2OTEsIDE2ODksIDI2MTksIDI2MTcsIDI2MTAsIDI2MDgsIDI2MDUsDQorICAgIDI2MTMsIDI1OTMsIDI1ODgsIDI1ODUsIDE4MDMsIDI1OTksIDI1OTYsIDI1NjMsIDI1NjEsIDI1NTUsIDE3OTcsIDI1NTEsDQorICAgIDE3OTUsIDI1NzMsIDI1NzAsIDI1NjcsIDI1NzcsIDI1MjUsIDI1MjQsIDI1MjIsIDI1MjAsIDE3ODYsIDI1MTcsIDE3ODUsDQorICAgIDI1MTQsIDE3ODMsIDI1MzUsIDI1MzMsIDI1MzEsIDI1MjgsIDE3ODgsIDI1NDEsIDI1MzksIDkwNiwgIDkwMywgIDkxMSwNCisgICAgMjcyMSwgMTg0NCwgMjcxNSwgMjcxMiwgMTgzOCwgMTgzNiwgMjY5OSwgMjY5NiwgMjY5MywgMjcwMywgMTgyNywgMTgyNiwNCisgICAgMTgyNCwgMjY3MywgMjY3MSwgMjY2OSwgMjY2NiwgMTgyOSwgMjY3OSwgMjY3NywgMTg1OCwgMTg1NywgMjc3MiwgMTg1NCwNCisgICAgMTg1MywgMTg1MSwgMTg1NiwgMjc2NiwgMjc2NCwgMTQzLCAgMTk4NywgMTM5LCAgMTk4NiwgMTM1LCAgMTMzLCAgMTMxLA0KKyAgICAxOTg0LCAxMjgsICAxOTgzLCAxMjUsICAxOTgxLCAxMzgsICAxMzcsICAxMzYsICAxOTg1LCAxMTMzLCAxMTMyLCAxMTMwLA0KKyAgICAxMTIsICAxMTAsICAxOTc0LCAxMDcsICAxOTczLCAxMDQsICAxOTcxLCAxOTY5LCAxMjIsICAxMjEsICAxMTksICAxMTcsDQorICAgIDE5NzcsIDExNCwgIDE5NzYsIDEyNCwgIDExMTUsIDExMTQsIDExMTIsIDExMTAsIDExMTcsIDExMTYsIDg0LCAgIDgzLA0KKyAgICAxOTUzLCA4MSwgICAxOTUyLCA3OCwgICAxOTUwLCAxOTQ4LCAxOTQ1LCA5NCwgICA5MywgICA5MSwgICAxOTU5LCA4OCwNCisgICAgMTk1OCwgODUsICAgMTk1NSwgOTksICAgOTcsICAgOTUsICAgMTk2MSwgMTA4NiwgMTA4NSwgMTA4MywgMTA4MSwgMTA3OCwNCisgICAgMTAwLCAgMTA5MCwgMTA4OSwgMTA4NywgMTA5MSwgNDksICAgNDcsICAgMTkxNywgNDQsICAgMTkxNSwgMTkxMywgMTkxMCwNCisgICAgMTkwNywgNTksICAgMTkyNiwgNTYsICAgMTkyNSwgNTMsICAgMTkyMiwgMTkxOSwgNjYsICAgNjQsICAgMTkzMSwgNjEsDQorICAgIDE5MjksIDEwNDIsIDEwNDAsIDEwMzgsIDcxLCAgIDEwMzUsIDcwLCAgIDEwMzIsIDY4LCAgIDEwNDgsIDEwNDcsIDEwNDUsDQorICAgIDEwNDMsIDEwNTAsIDEwNDksIDEyLCAgIDEwLCAgIDE4NjksIDE4NjcsIDE4NjQsIDE4NjEsIDIxLCAgIDE4ODAsIDE5LA0KKyAgICAxODc3LCAxODc0LCAxODcxLCAyOCwgICAxODg4LCAyNSwgICAxODg2LCAyMiwgICAxODgzLCA5ODIsICA5ODAsICA5NzcsDQorICAgIDk3NCwgIDMyLCAgIDMwLCAgIDk5MSwgIDk4OSwgIDk4NywgIDk4NCwgIDM0LCAgIDk5NSwgIDk5NCwgIDk5MiwgIDIxNTEsDQorICAgIDIxNTAsIDIxNDcsIDIxNDYsIDIxNDQsIDM1NiwgIDM1NSwgIDM1NCwgIDIxNDksIDIxMzksIDIxMzgsIDIxMzYsIDIxMzQsDQorICAgIDEzNTksIDM0MywgIDM0MSwgIDMzOCwgIDIxNDMsIDMzNSwgIDIxNDEsIDM0OCwgIDM0NywgIDM0NiwgIDEzNzYsIDEzNzQsDQorICAgIDIxMjQsIDIxMjMsIDIxMjEsIDIxMTksIDEzMjYsIDIxMTYsIDEzMjQsIDMxMCwgIDMwOCwgIDMwNSwgIDIxMzEsIDMwMiwNCisgICAgMjEyOSwgMjk4LCAgMjEyNywgMzIwLCAgMzE4LCAgMzE2LCAgMzEzLCAgMjEzMywgMzIyLCAgMzIxLCAgMTM1NSwgMTM1MywNCisgICAgMTM1MSwgMTM1NywgMjA5MiwgMjA5MSwgMjA4OSwgMjA4NywgMTI3NiwgMjA4NCwgMTI3NCwgMjA4MSwgMTI3MSwgMjU5LA0KKyAgICAyMTAyLCAyNTYsICAyMTAwLCAyNTIsICAyMDk4LCAyMDk1LCAyNzIsICAyNjksICAyMTA4LCAyNjYsICAyMTA2LCAyODEsDQorICAgIDI3OSwgIDI3NywgIDEzMTcsIDEzMTUsIDEzMTMsIDEzMTAsIDI4MiwgIDEzMjEsIDEzMTksIDIwMzksIDIwMzcsIDIwMzUsDQorICAgIDIwMzIsIDEyMDMsIDIwMjksIDEyMDAsIDExOTcsIDIwNywgIDIwNTMsIDIwNSwgIDIwNTEsIDIwMSwgIDIwNDksIDIwNDYsDQorICAgIDIwNDMsIDIyMCwgIDIxOCwgIDIwNjQsIDIxNSwgIDIwNjIsIDIxMSwgIDIwNTksIDIyOCwgIDIyNiwgIDIyMywgIDIwNjksDQorICAgIDEyNTksIDEyNTcsIDEyNTQsIDIzMiwgIDEyNTEsIDIzMCwgIDEyNjcsIDEyNjUsIDEyNjMsIDIzMTYsIDIzMTUsIDIzMTIsDQorICAgIDIzMTEsIDIzMDksIDIzMTQsIDIzMDQsIDIzMDMsIDIzMDEsIDIyOTksIDE1OTMsIDIzMDgsIDIzMDYsIDU5MCwgIDIyODgsDQorICAgIDIyODcsIDIyODUsIDIyODMsIDE1NzgsIDIyODAsIDE1NzcsIDIyOTUsIDIyOTMsIDIyOTEsIDU3OSwgIDU3NywgIDU3NCwNCisgICAgNTcxLCAgMjI5OCwgNTgyLCAgNTgxLCAgMTU5MiwgMjI2MywgMjI2MiwgMjI2MCwgMjI1OCwgMTU0NSwgMjI1NSwgMTU0NCwNCisgICAgMjI1MiwgMTU0MSwgMjI3MywgMjI3MSwgMjI2OSwgMjI2NiwgMTU1MCwgNTM1LCAgNTMyLCAgMjI3OSwgNTI4LCAgMjI3NywNCisgICAgNTQ2LCAgNTQzLCAgNTQ5LCAgMTU3NSwgMTU3MywgMjIyNCwgMjIyMiwgMjIyMCwgMTQ4NiwgMjIxNywgMTQ4NSwgMjIxNCwNCisgICAgMTQ4MiwgMTQ3OSwgMjIzOCwgMjIzNiwgMjIzNCwgMjIzMSwgMTQ5NiwgMjIyOCwgMTQ5MiwgNDgwLCAgNDc3LCAgMjI0OCwNCisgICAgNDczLCAgMjI0NiwgNDY5LCAgMjI0MywgNDkwLCAgNDg3LCAgMjI1MSwgNDk3LCAgMTUzNywgMTUzNSwgMTUzMiwgMjQ3NywNCisgICAgMjQ3NiwgMjQ3NCwgMjQ3OSwgMjQ2OSwgMjQ2OCwgMjQ2NiwgMjQ2NCwgMTczMCwgMjQ3MywgMjQ3MSwgMjQ1MywgMjQ1MiwNCisgICAgMjQ1MCwgMjQ0OCwgMTcyOSwgMjQ0NSwgMTcyOCwgMjQ2MCwgMjQ1OCwgMjQ1NiwgMjQ2MywgODA1LCAgODA0LCAgMjQyOCwNCisgICAgMjQyNywgMjQyNSwgMjQyMywgMTcyNSwgMjQyMCwgMTcyNCwgMjQxNywgMTcyMiwgMjQzOCwgMjQzNiwgMjQzNCwgMjQzMSwNCisgICAgMTcyNywgMjQ0NCwgMjQ0MiwgNzkzLCAgNzkxLCAgNzg4LCAgNzk1LCAgMjM4OCwgMjM4NiwgMjM4NCwgMTY5NywgMjM4MSwNCisgICAgMTY5NiwgMjM3OCwgMTY5NCwgMTY5MiwgMjQwMiwgMjQwMCwgMjM5OCwgMjM5NSwgMTcwMywgMjM5MiwgMTcwMSwgMjQxMiwNCisgICAgMjQxMCwgMjQwNywgNzUxLCAgNzQ4LCAgNzQ0LCAgMjQxNiwgNzU5LCAgNzU3LCAgMTgwNywgMjYyMCwgMjYxOCwgMTgwNiwNCisgICAgMTgwNSwgMjYxMSwgMjYwOSwgMjYwNywgMjYxNCwgMTgwMiwgMTgwMSwgMTc5OSwgMjU5NCwgMjU5MiwgMjU5MCwgMjU4NywNCisgICAgMTgwNCwgMjYwMCwgMjU5OCwgMTc5NCwgMTc5MywgMTc5MSwgMTc4OSwgMjU2NCwgMjU2MiwgMjU2MCwgMjU1NywgMTc5OCwNCisgICAgMjU1NCwgMTc5NiwgMjU3NCwgMjU3MiwgMjU2OSwgMjU3OCwgMTg0NywgMTg0NiwgMjcyMiwgMTg0MywgMTg0MiwgMTg0MCwNCisgICAgMTg0NSwgMjcxNiwgMjcxNCwgMTgzNSwgMTgzNCwgMTgzMiwgMTgzMCwgMTgzOSwgMTgzNywgMjcwMCwgMjY5OCwgMjY5NSwNCisgICAgMjcwNCwgMTgxNywgMTgxMSwgMTgxMCwgODk3LCAgODYyLCAgMTc3NywgODI5LCAgODI2LCAgODM4LCAgMTc2MCwgMTc1OCwNCisgICAgODA4LCAgMjQ4MSwgMTc0MSwgMTc0MCwgMTczOCwgMTc0MywgMjYyNCwgMTgxOCwgMjcyNiwgMjc3NiwgNzgyLCAgNzQwLA0KKyAgICA3MzcsICAxNzE1LCA2ODYsICA2NzksICA2OTUsICAxNjgyLCAxNjgwLCA2MzksICA2MjgsICAyMzM5LCA2NDcsICA2NDQsDQorICAgIDE2NDUsIDE2NDMsIDE2NDAsIDE2NDgsIDYwMiwgIDYwMCwgIDU5NywgIDU5NSwgIDIzMjAsIDU5MywgIDIzMTgsIDYwOSwNCisgICAgNjA3LCAgNjA0LCAgMTYxMSwgMTYxMCwgMTYwOCwgMTYwNiwgNjEzLCAgMTYxNSwgMTYxMywgMjMyOCwgOTI2LCAgOTI0LA0KKyAgICA4OTIsICA4ODYsICA4OTksICA4NTcsICA4NTAsICAyNTA1LCAxNzc4LCA4MjQsICA4MjMsICA4MjEsICA4MTksICAyNDg4LA0KKyAgICA4MTgsICAyNDg2LCA4MzMsICA4MzEsICA4MjgsICA4NDAsICAxNzYxLCAxNzU5LCAyNjQ5LCAyNjMyLCAyNjMwLCAyNzQ2LA0KKyAgICAyNzM0LCAyNzMyLCAyNzgyLCAyNzgxLCA1NzAsICA1NjcsICAxNTg3LCA1MzEsICA1MjcsICA1MjMsICA1NDAsICAxNTY2LA0KKyAgICAxNTY0LCA0NzYsICA0NjcsICA0NjMsICAyMjQwLCA0ODYsICA0ODMsICAxNTI0LCAxNTIxLCAxNTE4LCAxNTI5LCA0MTEsDQorICAgIDQwMywgIDIxOTIsIDM5OSwgIDIxODksIDQyMywgIDQxNiwgIDE0NjIsIDE0NTcsIDE0NTQsIDQyOCwgIDE0NjgsIDE0NjUsDQorICAgIDIyMTAsIDM2NiwgIDM2MywgIDIxNTgsIDM2MCwgIDIxNTYsIDM1NywgIDIxNTMsIDM3NiwgIDM3MywgIDM3MCwgIDIxNjMsDQorICAgIDE0MTAsIDE0MDksIDE0MDcsIDE0MDUsIDM4MiwgIDE0MDIsIDM4MCwgIDE0MTcsIDE0MTUsIDE0MTIsIDE0MjEsIDIxNzUsDQorICAgIDIxNzQsIDc3NywgIDc3NCwgIDc3MSwgIDc4NCwgIDczMiwgIDcyNSwgIDcyMiwgIDI0MDQsIDc0MywgIDE3MTYsIDY3NiwNCisgICAgNjc0LCAgNjY4LCAgMjM2MywgNjY1LCAgMjM2MCwgNjg1LCAgMTY4NCwgMTY4MSwgNjI2LCAgNjI0LCAgNjIyLCAgMjMzNSwNCisgICAgNjIwLCAgMjMzMywgNjE3LCAgMjMzMCwgNjQxLCAgNjM1LCAgNjQ5LCAgMTY0NiwgMTY0NCwgMTY0MiwgMjU2NiwgOTI4LA0KKyAgICA5MjUsICAyNTMwLCAyNTI3LCA4OTQsICA4OTEsICA4ODgsICAyNTAxLCAyNDk5LCAyNDk2LCA4NTgsICA4NTYsICA4NTQsDQorICAgIDg1MSwgIDE3NzksIDI2OTIsIDI2NjgsIDI2NjUsIDI2NDUsIDI2NDMsIDI2NDAsIDI2NTEsIDI3NjgsIDI3NTksIDI3NTcsDQorICAgIDI3NDQsIDI3NDMsIDI3NDEsIDI3NDgsIDM1MiwgIDEzODIsIDM0MCwgIDMzNywgIDMzMywgIDEzNzEsIDEzNjksIDMwNywNCisgICAgMzAwLCAgMjk2LCAgMjEyNiwgMzE1LCAgMzEyLCAgMTM0NywgMTM0MiwgMTM1MCwgMjYxLCAgMjU4LCAgMjUwLCAgMjA5NywNCisgICAgMjQ2LCAgMjA5NCwgMjcxLCAgMjY4LCAgMjY0LCAgMTMwNiwgMTMwMSwgMTI5OCwgMjc2LCAgMTMxMiwgMTMwOSwgMjExNSwNCisgICAgMjAzLCAgMjA0OCwgMTk1LCAgMjA0NSwgMTkxLCAgMjA0MSwgMjEzLCAgMjA5LCAgMjA1NiwgMTI0NiwgMTI0NCwgMTIzOCwNCisgICAgMjI1LCAgMTIzNCwgMjIyLCAgMTI1NiwgMTI1MywgMTI0OSwgMTI2MiwgMjA4MCwgMjA3OSwgMTU0LCAgMTk5NywgMTUwLA0KKyAgICAxOTk1LCAxNDcsICAxOTkyLCAxOTg5LCAxNjMsICAxNjAsICAyMDA0LCAxNTYsICAyMDAxLCAxMTc1LCAxMTc0LCAxMTcyLA0KKyAgICAxMTcwLCAxMTY3LCAxNzAsICAxMTY0LCAxNjcsICAxMTg1LCAxMTgzLCAxMTgwLCAxMTc3LCAxNzQsICAxMTkwLCAxMTg4LA0KKyAgICAyMDI1LCAyMDI0LCAyMDIyLCA1ODcsICA1ODYsICA1NjQsICA1NTksICA1NTYsICAyMjkwLCA1NzMsICAxNTg4LCA1MjAsDQorICAgIDUxOCwgIDUxMiwgIDIyNjgsIDUwOCwgIDIyNjUsIDUzMCwgIDE1NjgsIDE1NjUsIDQ2MSwgIDQ1NywgIDIyMzMsIDQ1MCwNCisgICAgMjIzMCwgNDQ2LCAgMjIyNiwgNDc5LCAgNDcxLCAgNDg5LCAgMTUyNiwgMTUyMywgMTUyMCwgMzk3LCAgMzk1LCAgMjE4NSwNCisgICAgMzkyLCAgMjE4MywgMzg5LCAgMjE4MCwgMjE3NywgNDEwLCAgMjE5NCwgNDAyLCAgNDIyLCAgMTQ2MywgMTQ2MSwgMTQ1OSwNCisgICAgMTQ1NiwgMTQ3MCwgMjQ1NSwgNzk5LCAgMjQzMywgMjQzMCwgNzc5LCAgNzc2LCAgNzczLCAgMjM5NywgMjM5NCwgMjM5MCwNCisgICAgNzM0LCAgNzI4LCAgNzI0LCAgNzQ2LCAgMTcxNywgMjM1NiwgMjM1NCwgMjM1MSwgMjM0OCwgMTY1OCwgNjc3LCAgNjc1LA0KKyAgICA2NzMsICA2NzAsICA2NjcsICA2ODgsICAxNjg1LCAxNjgzLCAyNjA2LCAyNTg5LCAyNTg2LCAyNTU5LCAyNTU2LCAyNTUyLA0KKyAgICA5MjcsICAyNTIzLCAyNTIxLCAyNTE4LCAyNTE1LCAxNzg0LCAyNTMyLCA4OTUsICA4OTMsICA4OTAsICAyNzE4LCAyNzA5LA0KKyAgICAyNzA3LCAyNjg5LCAyNjg3LCAyNjg0LCAyNjYzLCAyNjYyLCAyNjYwLCAyNjU4LCAxODI1LCAyNjY3LCAyNzY5LCAxODUyLA0KKyAgICAyNzYwLCAyNzU4LCAxNDIsICAxNDEsICAxMTM5LCAxMTM4LCAxMzQsICAxMzIsICAxMjksICAxMjYsICAxOTgyLCAxMTI5LA0KKyAgICAxMTI4LCAxMTI2LCAxMTMxLCAxMTMsICAxMTEsICAxMDgsICAxMDUsICAxOTcyLCAxMDEsICAxOTcwLCAxMjAsICAxMTgsDQorICAgIDExNSwgIDExMDksIDExMDgsIDExMDYsIDExMDQsIDEyMywgIDExMTMsIDExMTEsIDgyLCAgIDc5LCAgIDE5NTEsIDc1LA0KKyAgICAxOTQ5LCA3MiwgICAxOTQ2LCA5MiwgICA4OSwgICA4NiwgICAxOTU2LCAxMDc3LCAxMDc2LCAxMDc0LCAxMDcyLCA5OCwNCisgICAgMTA2OSwgOTYsICAgMTA4NCwgMTA4MiwgMTA3OSwgMTA4OCwgMTk2OCwgMTk2NywgNDgsICAgNDUsICAgMTkxNiwgNDIsDQorICAgIDE5MTQsIDM5LCAgIDE5MTEsIDE5MDgsIDYwLCAgIDU3LCAgIDU0LCAgIDE5MjMsIDUwLCAgIDE5MjAsIDEwMzEsIDEwMzAsDQorICAgIDEwMjgsIDEwMjYsIDY3LCAgIDEwMjMsIDY1LCAgIDEwMjAsIDYyLCAgIDEwNDEsIDEwMzksIDEwMzYsIDEwMzMsIDY5LA0KKyAgICAxMDQ2LCAxMDQ0LCAxOTQ0LCAxOTQzLCAxOTQxLCAxMSwgICA5LCAgICAxODY4LCA3LCAgICAxODY1LCAxODYyLCAxODU5LA0KKyAgICAyMCwgICAxODc4LCAxNiwgICAxODc1LCAxMywgICAxODcyLCA5NzAsICA5NjgsICA5NjYsICA5NjMsICAyOSwgICA5NjAsDQorICAgIDI2LCAgIDIzLCAgIDk4MywgIDk4MSwgIDk3OCwgIDk3NSwgIDMzLCAgIDk3MSwgIDMxLCAgIDk5MCwgIDk4OCwgIDk4NSwNCisgICAgMTkwNiwgMTkwNCwgMTkwMiwgOTkzLCAgMzUxLCAgMjE0NSwgMTM4MywgMzMxLCAgMzMwLCAgMzI4LCAgMzI2LCAgMjEzNywNCisgICAgMzIzLCAgMjEzNSwgMzM5LCAgMTM3MiwgMTM3MCwgMjk0LCAgMjkzLCAgMjkxLCAgMjg5LCAgMjEyMiwgMjg2LCAgMjEyMCwNCisgICAgMjgzLCAgMjExNywgMzA5LCAgMzAzLCAgMzE3LCAgMTM0OCwgMTM0NiwgMTM0NCwgMjQ1LCAgMjQ0LCAgMjQyLCAgMjA5MCwNCisgICAgMjM5LCAgMjA4OCwgMjM2LCAgMjA4NSwgMjA4MiwgMjYwLCAgMjA5OSwgMjQ5LCAgMjcwLCAgMTMwNywgMTMwNSwgMTMwMywNCisgICAgMTMwMCwgMTMxNCwgMTg5LCAgMjAzOCwgMTg2LCAgMjAzNiwgMTgzLCAgMjAzMywgMjAzMCwgMjAyNiwgMjA2LCAgMTk4LA0KKyAgICAyMDQ3LCAxOTQsICAyMTYsICAxMjQ3LCAxMjQ1LCAxMjQzLCAxMjQwLCAyMjcsICAxMjM3LCAxMjU1LCAyMzEwLCAyMzAyLA0KKyAgICAyMzAwLCAyMjg2LCAyMjg0LCAyMjgxLCA1NjUsICA1NjMsICA1NjEsICA1NTgsICA1NzUsICAxNTg5LCAyMjYxLCAyMjU5LA0KKyAgICAyMjU2LCAyMjUzLCAxNTQyLCA1MjEsICA1MTksICA1MTcsICA1MTQsICAyMjcwLCA1MTEsICA1MzMsICAxNTY5LCAxNTY3LA0KKyAgICAyMjIzLCAyMjIxLCAyMjE4LCAyMjE1LCAxNDgzLCAyMjExLCAxNDgwLCA0NTksICA0NTYsICA0NTMsICAyMjMyLCA0NDksDQorICAgIDQ3NCwgIDQ5MSwgIDE1MjcsIDE1MjUsIDE1MjIsIDI0NzUsIDI0NjcsIDI0NjUsIDI0NTEsIDI0NDksIDI0NDYsIDgwMSwNCisgICAgODAwLCAgMjQyNiwgMjQyNCwgMjQyMSwgMjQxOCwgMTcyMywgMjQzNSwgNzgwLCAgNzc4LCAgNzc1LCAgMjM4NywgMjM4NSwNCisgICAgMjM4MiwgMjM3OSwgMTY5NSwgMjM3NSwgMTY5MywgMjM5NiwgNzM1LCAgNzMzLCAgNzMwLCAgNzI3LCAgNzQ5LCAgMTcxOCwNCisgICAgMjYxNiwgMjYxNSwgMjYwNCwgMjYwMywgMjYwMSwgMjU4NCwgMjU4MywgMjU4MSwgMjU3OSwgMTgwMCwgMjU5MSwgMjU1MCwNCisgICAgMjU0OSwgMjU0NywgMjU0NSwgMTc5MiwgMjU0MiwgMTc5MCwgMjU1OCwgOTI5LCAgMjcxOSwgMTg0MSwgMjcxMCwgMjcwOCwNCisgICAgMTgzMywgMTgzMSwgMjY5MCwgMjY4OCwgMjY4NiwgMTgxNSwgMTgwOSwgMTgwOCwgMTc3NCwgMTc1NiwgMTc1NCwgMTczNywNCisgICAgMTczNiwgMTczNCwgMTczOSwgMTgxNiwgMTcxMSwgMTY3NiwgMTY3NCwgNjMzLCAgNjI5LCAgMTYzOCwgMTYzNiwgMTYzMywNCisgICAgMTY0MSwgNTk4LCAgMTYwNSwgMTYwNCwgMTYwMiwgMTYwMCwgNjA1LCAgMTYwOSwgMTYwNywgMjMyNywgODg3LCAgODUzLA0KKyAgICAxNzc1LCA4MjIsICA4MjAsICAxNzU3LCAxNzU1LCAxNTg0LCA1MjQsICAxNTYwLCAxNTU4LCA0NjgsICA0NjQsICAxNTE0LA0KKyAgICAxNTExLCAxNTA4LCAxNTE5LCA0MDgsICA0MDQsICA0MDAsICAxNDUyLCAxNDQ3LCAxNDQ0LCA0MTcsICAxNDU4LCAxNDU1LA0KKyAgICAyMjA4LCAzNjQsICAzNjEsICAzNTgsICAyMTU0LCAxNDAxLCAxNDAwLCAxMzk4LCAxMzk2LCAzNzQsICAxMzkzLCAzNzEsDQorICAgIDE0MDgsIDE0MDYsIDE0MDMsIDE0MTMsIDIxNzMsIDIxNzIsIDc3MiwgIDcyNiwgIDcyMywgIDE3MTIsIDY3MiwgIDY2OSwNCisgICAgNjY2LCAgNjgyLCAgMTY3OCwgMTY3NSwgNjI1LCAgNjIzLCAgNjIxLCAgNjE4LCAgMjMzMSwgNjM2LCAgNjMyLCAgMTYzOSwNCisgICAgMTYzNywgMTYzNSwgOTIwLCAgOTE4LCAgODg0LCAgODgwLCAgODg5LCAgODQ5LCAgODQ4LCAgODQ3LCAgODQ2LCAgMjQ5NywNCisgICAgODU1LCAgODUyLCAgMTc3NiwgMjY0MSwgMjc0MiwgMjc4NywgMTM4MCwgMzM0LCAgMTM2NywgMTM2NSwgMzAxLCAgMjk3LA0KKyAgICAxMzQwLCAxMzM4LCAxMzM1LCAxMzQzLCAyNTUsICAyNTEsICAyNDcsICAxMjk2LCAxMjkxLCAxMjg4LCAyNjUsICAxMzAyLA0KKyAgICAxMjk5LCAyMTEzLCAyMDQsICAxOTYsICAxOTIsICAyMDQyLCAxMjMyLCAxMjMwLCAxMjI0LCAyMTQsICAxMjIwLCAyMTAsDQorICAgIDEyNDIsIDEyMzksIDEyMzUsIDEyNTAsIDIwNzcsIDIwNzUsIDE1MSwgIDE0OCwgIDE5OTMsIDE0NCwgIDE5OTAsIDExNjMsDQorICAgIDExNjIsIDExNjAsIDExNTgsIDExNTUsIDE2MSwgIDExNTIsIDE1NywgIDExNzMsIDExNzEsIDExNjgsIDExNjUsIDE2OCwNCisgICAgMTE4MSwgMTE3OCwgMjAyMSwgMjAyMCwgMjAxOCwgMjAyMywgNTg1LCAgNTYwLCAgNTU3LCAgMTU4NSwgNTE2LCAgNTA5LA0KKyAgICAxNTYyLCAxNTU5LCA0NTgsICA0NDcsICAyMjI3LCA0NzIsICAxNTE2LCAxNTEzLCAxNTEwLCAzOTgsICAzOTYsICAzOTMsDQorICAgIDM5MCwgIDIxODEsIDM4NiwgIDIxNzgsIDQwNywgIDE0NTMsIDE0NTEsIDE0NDksIDE0NDYsIDQyMCwgIDE0NjAsIDIyMDksDQorICAgIDc2OSwgIDc2NCwgIDcyMCwgIDcxMiwgIDIzOTEsIDcyOSwgIDE3MTMsIDY2NCwgIDY2MywgIDY2MSwgIDY1OSwgIDIzNTIsDQorICAgIDY1NiwgIDIzNDksIDY3MSwgIDE2NzksIDE2NzcsIDI1NTMsIDkyMiwgIDkxOSwgIDI1MTksIDI1MTYsIDg4NSwgIDg4MywNCisgICAgODgxLCAgMjY4NSwgMjY2MSwgMjY1OSwgMjc2NywgMjc1NiwgMjc1NSwgMTQwLCAgMTEzNywgMTEzNiwgMTMwLCAgMTI3LA0KKyAgICAxMTI1LCAxMTI0LCAxMTIyLCAxMTI3LCAxMDksICAxMDYsICAxMDIsICAxMTAzLCAxMTAyLCAxMTAwLCAxMDk4LCAxMTYsDQorICAgIDExMDcsIDExMDUsIDE5ODAsIDgwLCAgIDc2LCAgIDczLCAgIDE5NDcsIDEwNjgsIDEwNjcsIDEwNjUsIDEwNjMsIDkwLA0KKyAgICAxMDYwLCA4NywgICAxMDc1LCAxMDczLCAxMDcwLCAxMDgwLCAxOTY2LCAxOTY1LCA0NiwgICA0MywgICA0MCwgICAxOTEyLA0KKyAgICAzNiwgICAxOTA5LCAxMDE5LCAxMDE4LCAxMDE2LCAxMDE0LCA1OCwgICAxMDExLCA1NSwgICAxMDA4LCA1MSwgICAxMDI5LA0KKyAgICAxMDI3LCAxMDI0LCAxMDIxLCA2MywgICAxMDM3LCAxMDM0LCAxOTQwLCAxOTM5LCAxOTM3LCAxOTQyLCA4LCAgICAxODY2LA0KKyAgICA0LCAgICAxODYzLCAxLCAgICAxODYwLCA5NTYsICA5NTQsICA5NTIsICA5NDksICA5NDYsICAxNywgICAxNCwgICA5NjksDQorICAgIDk2NywgIDk2NCwgIDk2MSwgIDI3LCAgIDk1NywgIDI0LCAgIDk3OSwgIDk3NiwgIDk3MiwgIDE5MDEsIDE5MDAsIDE4OTgsDQorICAgIDE4OTYsIDk4NiwgIDE5MDUsIDE5MDMsIDM1MCwgIDM0OSwgIDEzODEsIDMyOSwgIDMyNywgIDMyNCwgIDEzNjgsIDEzNjYsDQorICAgIDI5MiwgIDI5MCwgIDI4NywgIDI4NCwgIDIxMTgsIDMwNCwgIDEzNDEsIDEzMzksIDEzMzcsIDEzNDUsIDI0MywgIDI0MCwNCisgICAgMjM3LCAgMjA4NiwgMjMzLCAgMjA4MywgMjU0LCAgMTI5NywgMTI5NSwgMTI5MywgMTI5MCwgMTMwNCwgMjExNCwgMTkwLA0KKyAgICAxODcsICAxODQsICAyMDM0LCAxODAsICAyMDMxLCAxNzcsICAyMDI3LCAxOTksICAxMjMzLCAxMjMxLCAxMjI5LCAxMjI2LA0KKyAgICAyMTcsICAxMjIzLCAxMjQxLCAyMDc4LCAyMDc2LCA1ODQsICA1NTUsICA1NTQsICA1NTIsICA1NTAsICAyMjgyLCA1NjIsDQorICAgIDE1ODYsIDUwNywgIDUwNiwgIDUwNCwgIDUwMiwgIDIyNTcsIDQ5OSwgIDIyNTQsIDUxNSwgIDE1NjMsIDE1NjEsIDQ0NSwNCisgICAgNDQzLCAgNDQxLCAgMjIxOSwgNDM4LCAgMjIxNiwgNDM1LCAgMjIxMiwgNDYwLCAgNDU0LCAgNDc1LCAgMTUxNywgMTUxNSwNCisgICAgMTUxMiwgMjQ0NywgNzk4LCAgNzk3LCAgMjQyMiwgMjQxOSwgNzcwLCAgNzY4LCAgNzY2LCAgMjM4MywgMjM4MCwgMjM3NiwNCisgICAgNzIxLCAgNzE5LCAgNzE3LCAgNzE0LCAgNzMxLCAgMTcxNCwgMjYwMiwgMjU4MiwgMjU4MCwgMjU0OCwgMjU0NiwgMjU0MywNCisgICAgOTIzLCAgOTIxLCAgMjcxNywgMjcwNiwgMjcwNSwgMjY4MywgMjY4MiwgMjY4MCwgMTc3MSwgMTc1MiwgMTc1MCwgMTczMywNCisgICAgMTczMiwgMTczMSwgMTczNSwgMTgxNCwgMTcwNywgMTY3MCwgMTY2OCwgMTYzMSwgMTYyOSwgMTYyNiwgMTYzNCwgMTU5OSwNCisgICAgMTU5OCwgMTU5NiwgMTU5NCwgMTYwMywgMTYwMSwgMjMyNiwgMTc3MiwgMTc1MywgMTc1MSwgMTU4MSwgMTU1NCwgMTU1MiwNCisgICAgMTUwNCwgMTUwMSwgMTQ5OCwgMTUwOSwgMTQ0MiwgMTQzNywgMTQzNCwgNDAxLCAgMTQ0OCwgMTQ0NSwgMjIwNiwgMTM5MiwNCisgICAgMTM5MSwgMTM4OSwgMTM4NywgMTM4NCwgMzU5LCAgMTM5OSwgMTM5NywgMTM5NCwgMTQwNCwgMjE3MSwgMjE3MCwgMTcwOCwNCisgICAgMTY3MiwgMTY2OSwgNjE5LCAgMTYzMiwgMTYzMCwgMTYyOCwgMTc3MywgMTM3OCwgMTM2MywgMTM2MSwgMTMzMywgMTMyOCwNCisgICAgMTMzNiwgMTI4NiwgMTI4MSwgMTI3OCwgMjQ4LCAgMTI5MiwgMTI4OSwgMjExMSwgMTIxOCwgMTIxNiwgMTIxMCwgMTk3LA0KKyAgICAxMjA2LCAxOTMsICAxMjI4LCAxMjI1LCAxMjIxLCAxMjM2LCAyMDczLCAyMDcxLCAxMTUxLCAxMTUwLCAxMTQ4LCAxMTQ2LA0KKyAgICAxNTIsICAxMTQzLCAxNDksICAxMTQwLCAxNDUsICAxMTYxLCAxMTU5LCAxMTU2LCAxMTUzLCAxNTgsICAxMTY5LCAxMTY2LA0KKyAgICAyMDE3LCAyMDE2LCAyMDE0LCAyMDE5LCAxNTgyLCA1MTAsICAxNTU2LCAxNTUzLCA0NTIsICA0NDgsICAxNTA2LCAxNTAwLA0KKyAgICAzOTQsICAzOTEsICAzODcsICAxNDQzLCAxNDQxLCAxNDM5LCAxNDM2LCAxNDUwLCAyMjA3LCA3NjUsICA3MTYsICA3MTMsDQorICAgIDE3MDksIDY2MiwgIDY2MCwgIDY1NywgIDE2NzMsIDE2NzEsIDkxNiwgIDkxNCwgIDg3OSwgIDg3OCwgIDg3NywgIDg4MiwNCisgICAgMTEzNSwgMTEzNCwgMTEyMSwgMTEyMCwgMTExOCwgMTEyMywgMTA5NywgMTA5NiwgMTA5NCwgMTA5MiwgMTAzLCAgMTEwMSwNCisgICAgMTA5OSwgMTk3OSwgMTA1OSwgMTA1OCwgMTA1NiwgMTA1NCwgNzcsICAgMTA1MSwgNzQsICAgMTA2NiwgMTA2NCwgMTA2MSwNCisgICAgMTA3MSwgMTk2NCwgMTk2MywgMTAwNywgMTAwNiwgMTAwNCwgMTAwMiwgOTk5LCAgNDEsICAgOTk2LCAgMzcsICAgMTAxNywNCisgICAgMTAxNSwgMTAxMiwgMTAwOSwgNTIsICAgMTAyNSwgMTAyMiwgMTkzNiwgMTkzNSwgMTkzMywgMTkzOCwgOTQyLCAgOTQwLA0KKyAgICA5MzgsICA5MzUsICA5MzIsICA1LCAgICAyLCAgICA5NTUsICA5NTMsICA5NTAsICA5NDcsICAxOCwgICA5NDMsICAxNSwNCisgICAgOTY1LCAgOTYyLCAgOTU4LCAgMTg5NSwgMTg5NCwgMTg5MiwgMTg5MCwgOTczLCAgMTg5OSwgMTg5NywgMTM3OSwgMzI1LA0KKyAgICAxMzY0LCAxMzYyLCAyODgsICAyODUsICAxMzM0LCAxMzMyLCAxMzMwLCAyNDEsICAyMzgsICAyMzQsICAxMjg3LCAxMjg1LA0KKyAgICAxMjgzLCAxMjgwLCAxMjk0LCAyMTEyLCAxODgsICAxODUsICAxODEsICAxNzgsICAyMDI4LCAxMjE5LCAxMjE3LCAxMjE1LA0KKyAgICAxMjEyLCAyMDAsICAxMjA5LCAxMjI3LCAyMDc0LCAyMDcyLCA1ODMsICA1NTMsICA1NTEsICAxNTgzLCA1MDUsICA1MDMsDQorICAgIDUwMCwgIDUxMywgIDE1NTcsIDE1NTUsIDQ0NCwgIDQ0MiwgIDQzOSwgIDQzNiwgIDIyMTMsIDQ1NSwgIDQ1MSwgIDE1MDcsDQorICAgIDE1MDUsIDE1MDIsIDc5NiwgIDc2MywgIDc2MiwgIDc2MCwgIDc2NywgIDcxMSwgIDcxMCwgIDcwOCwgIDcwNiwgIDIzNzcsDQorICAgIDcxOCwgIDcxNSwgIDE3MTAsIDI1NDQsIDkxNywgIDkxNSwgIDI2ODEsIDE2MjcsIDE1OTcsIDE1OTUsIDIzMjUsIDE3NjksDQorICAgIDE3NDksIDE3NDcsIDE0OTksIDE0MzgsIDE0MzUsIDIyMDQsIDEzOTAsIDEzODgsIDEzODUsIDEzOTUsIDIxNjksIDIxNjcsDQorICAgIDE3MDQsIDE2NjUsIDE2NjIsIDE2MjUsIDE2MjMsIDE2MjAsIDE3NzAsIDEzMjksIDEyODIsIDEyNzksIDIxMDksIDEyMTQsDQorICAgIDEyMDcsIDEyMjIsIDIwNjgsIDIwNjUsIDExNDksIDExNDcsIDExNDQsIDExNDEsIDE0NiwgIDExNTcsIDExNTQsIDIwMTMsDQorICAgIDIwMTEsIDIwMDgsIDIwMTUsIDE1NzksIDE1NDksIDE1NDYsIDE0OTUsIDE0ODcsIDE0MzMsIDE0MzEsIDE0MjgsIDE0MjUsDQorICAgIDM4OCwgIDE0NDAsIDIyMDUsIDE3MDUsIDY1OCwgIDE2NjcsIDE2NjQsIDExMTksIDEwOTUsIDEwOTMsIDE5NzgsIDEwNTcsDQorICAgIDEwNTUsIDEwNTIsIDEwNjIsIDE5NjIsIDE5NjAsIDEwMDUsIDEwMDMsIDEwMDAsIDk5NywgIDM4LCAgIDEwMTMsIDEwMTAsDQorICAgIDE5MzIsIDE5MzAsIDE5MjcsIDE5MzQsIDk0MSwgIDkzOSwgIDkzNiwgIDkzMywgIDYsICAgIDkzMCwgIDMsICAgIDk1MSwNCisgICAgOTQ4LCAgOTQ0LCAgMTg4OSwgMTg4NywgMTg4NCwgMTg4MSwgOTU5LCAgMTg5MywgMTg5MSwgMzUsICAgMTM3NywgMTM2MCwNCisgICAgMTM1OCwgMTMyNywgMTMyNSwgMTMyMiwgMTMzMSwgMTI3NywgMTI3NSwgMTI3MiwgMTI2OSwgMjM1LCAgMTI4NCwgMjExMCwNCisgICAgMTIwNSwgMTIwNCwgMTIwMSwgMTE5OCwgMTgyLCAgMTE5NSwgMTc5LCAgMTIxMywgMjA3MCwgMjA2NywgMTU4MCwgNTAxLA0KKyAgICAxNTUxLCAxNTQ4LCA0NDAsICA0MzcsICAxNDk3LCAxNDk0LCAxNDkwLCAxNTAzLCA3NjEsICA3MDksICA3MDcsICAxNzA2LA0KKyAgICA5MTMsICA5MTIsICAyMTk4LCAxMzg2LCAyMTY0LCAyMTYxLCAxNjIxLCAxNzY2LCAyMTAzLCAxMjA4LCAyMDU4LCAyMDU0LA0KKyAgICAxMTQ1LCAxMTQyLCAyMDA1LCAyMDAyLCAxOTk5LCAyMDA5LCAxNDg4LCAxNDI5LCAxNDI2LCAyMjAwLCAxNjk4LCAxNjU5LA0KKyAgICAxNjU2LCAxOTc1LCAxMDUzLCAxOTU3LCAxOTU0LCAxMDAxLCA5OTgsICAxOTI0LCAxOTIxLCAxOTE4LCAxOTI4LCA5MzcsDQorICAgIDkzNCwgIDkzMSwgIDE4NzksIDE4NzYsIDE4NzMsIDE4NzAsIDk0NSwgIDE4ODUsIDE4ODIsIDEzMjMsIDEyNzMsIDEyNzAsDQorICAgIDIxMDUsIDEyMDIsIDExOTksIDExOTYsIDEyMTEsIDIwNjEsIDIwNTcsIDE1NzYsIDE1NDMsIDE1NDAsIDE0ODQsIDE0ODEsDQorICAgIDE0NzgsIDE0OTEsIDE3MDB9Ow0KK0NCQ19QREY0MTdDb21tb246OkNCQ19QREY0MTdDb21tb24oKSB7fQ0KK0NCQ19QREY0MTdDb21tb246On5DQkNfUERGNDE3Q29tbW9uKCkge30NCitpbnQzMl90IENCQ19QREY0MTdDb21tb246OmdldEJpdENvdW50U3VtKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCkgew0KKyAgaW50MzJfdCBiaXRDb3VudFN1bSA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtb2R1bGVCaXRDb3VudC5HZXRTaXplKCk7IGkrKykgew0KKyAgICBpbnQzMl90IGNvdW50ID0gbW9kdWxlQml0Q291bnQuR2V0QXQoaSk7DQorICAgIGJpdENvdW50U3VtICs9IGNvdW50Ow0KKyAgfQ0KKyAgcmV0dXJuIGJpdENvdW50U3VtOw0KIH0NCi1DQkNfUERGNDE3Q29tbW9uOjp+Q0JDX1BERjQxN0NvbW1vbigpDQotew0KLX0NCi1pbnQzMl90IENCQ19QREY0MTdDb21tb246OmdldEJpdENvdW50U3VtKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCkNCi17DQotICAgIGludDMyX3QgYml0Q291bnRTdW0gPSAwOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtb2R1bGVCaXRDb3VudC5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBjb3VudCA9IG1vZHVsZUJpdENvdW50LkdldEF0KGkpOw0KLSAgICAgICAgYml0Q291bnRTdW0gKz0gY291bnQ7DQotICAgIH0NCi0gICAgcmV0dXJuIGJpdENvdW50U3VtOw0KLX0NCi1pbnQzMl90IENCQ19QREY0MTdDb21tb246OmdldENvZGV3b3JkKEZYX0RXT1JEIHN5bWJvbCkNCi17DQotICAgIEZYX0RXT1JEIHN5bSA9IHN5bWJvbCAmIDB4M0ZGRkY7DQotICAgIGludDMyX3QgaSA9IGZpbmRDb2Rld29yZEluZGV4KHN5bSk7DQotICAgIGlmIChpID09IC0xKSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgcmV0dXJuIChDT0RFV09SRF9UQUJMRVtpXSAtIDEpICUgTlVNQkVSX09GX0NPREVXT1JEUzsNCi19DQotaW50MzJfdCBDQkNfUERGNDE3Q29tbW9uOjpmaW5kQ29kZXdvcmRJbmRleChGWF9EV09SRCBzeW1ib2wpDQotew0KLSAgICBpbnQzMl90IGZpcnN0ID0gMDsNCi0gICAgaW50MzJfdCB1cHRvID0gc2l6ZW9mKFNZTUJPTF9UQUJMRSkgLyBzaXplb2YoU1lNQk9MX1RBQkxFWzBdKTsNCi0gICAgd2hpbGUgKGZpcnN0IDwgdXB0bykgew0KLSAgICAgICAgaW50MzJfdCBtaWQgPSAoKEZYX0RXT1JEKShmaXJzdCArIHVwdG8pKSA+PiAxOw0KLSAgICAgICAgaWYgKHN5bWJvbCA8IChGWF9EV09SRClTWU1CT0xfVEFCTEVbbWlkXSkgew0KLSAgICAgICAgICAgIHVwdG8gPSBtaWQ7DQotICAgICAgICB9IGVsc2UgaWYgKHN5bWJvbCA+IChGWF9EV09SRClTWU1CT0xfVEFCTEVbbWlkXSkgew0KLSAgICAgICAgICAgIGZpcnN0ID0gbWlkICsgMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIG1pZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Q29kZXdvcmQoRlhfRFdPUkQgc3ltYm9sKSB7DQorICBGWF9EV09SRCBzeW0gPSBzeW1ib2wgJiAweDNGRkZGOw0KKyAgaW50MzJfdCBpID0gZmluZENvZGV3b3JkSW5kZXgoc3ltKTsNCisgIGlmIChpID09IC0xKSB7DQogICAgIHJldHVybiAtMTsNCisgIH0NCisgIHJldHVybiAoQ09ERVdPUkRfVEFCTEVbaV0gLSAxKSAlIE5VTUJFUl9PRl9DT0RFV09SRFM7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0NvbW1vbjo6ZmluZENvZGV3b3JkSW5kZXgoRlhfRFdPUkQgc3ltYm9sKSB7DQorICBpbnQzMl90IGZpcnN0ID0gMDsNCisgIGludDMyX3QgdXB0byA9IHNpemVvZihTWU1CT0xfVEFCTEUpIC8gc2l6ZW9mKFNZTUJPTF9UQUJMRVswXSk7DQorICB3aGlsZSAoZmlyc3QgPCB1cHRvKSB7DQorICAgIGludDMyX3QgbWlkID0gKChGWF9EV09SRCkoZmlyc3QgKyB1cHRvKSkgPj4gMTsNCisgICAgaWYgKHN5bWJvbCA8IChGWF9EV09SRClTWU1CT0xfVEFCTEVbbWlkXSkgew0KKyAgICAgIHVwdG8gPSBtaWQ7DQorICAgIH0gZWxzZSBpZiAoc3ltYm9sID4gKEZYX0RXT1JEKVNZTUJPTF9UQUJMRVttaWRdKSB7DQorICAgICAgZmlyc3QgPSBtaWQgKyAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBtaWQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAtMTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbW1vbi5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbW1vbi5oCmluZGV4IGE5N2Q4NGIuLmExM2VkZTMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21tb24uaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tbW9uLmgKQEAgLTYsMjUgKzYsMjUgQEAKIA0KICNpZm5kZWYgX0JDX1BERjQxN0NPTU1PTl9IXw0KICNkZWZpbmUgX0JDX1BERjQxN0NPTU1PTl9IXw0KLWNsYXNzIENCQ19QREY0MTdDb21tb24NCi17DQotcHVibGljOg0KLSAgICBDQkNfUERGNDE3Q29tbW9uKCk7DQotICAgIHZpcnR1YWwgfkNCQ19QREY0MTdDb21tb24oKTsNCi0gICAgc3RhdGljIGludDMyX3QgZ2V0Qml0Q291bnRTdW0oQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCi0gICAgc3RhdGljIGludDMyX3QgZ2V0Q29kZXdvcmQoRlhfRFdPUkQgc3ltYm9sKTsNCi0gICAgc3RhdGljIGludDMyX3QgTlVNQkVSX09GX0NPREVXT1JEUzsNCi0gICAgc3RhdGljIGludDMyX3QgTUFYX0NPREVXT1JEU19JTl9CQVJDT0RFOw0KLSAgICBzdGF0aWMgaW50MzJfdCBNSU5fUk9XU19JTl9CQVJDT0RFOw0KLSAgICBzdGF0aWMgaW50MzJfdCBNQVhfUk9XU19JTl9CQVJDT0RFOw0KLSAgICBzdGF0aWMgaW50MzJfdCBNQVhfQ09ERVdPUkRTX0lOX1JPVzsNCi0gICAgc3RhdGljIGludDMyX3QgTU9EVUxFU19JTl9DT0RFV09SRDsNCi0gICAgc3RhdGljIGludDMyX3QgTU9EVUxFU19JTl9TVE9QX1BBVFRFUk47DQotICAgIHN0YXRpYyBpbnQzMl90IEJBUlNfSU5fTU9EVUxFOw0KLSAgICBzdGF0aWMgaW50MzJfdCBTWU1CT0xfVEFCTEVbXTsNCi0gICAgc3RhdGljIGludDMyX3QgQ09ERVdPUkRfVEFCTEVbXTsNCi1wcml2YXRlOg0KLSAgICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIEVNUFRZX0lOVF9BUlJBWTsNCi0gICAgc3RhdGljIGludDMyX3QgZmluZENvZGV3b3JkSW5kZXgoRlhfRFdPUkQgc3ltYm9sKTsNCitjbGFzcyBDQkNfUERGNDE3Q29tbW9uIHsNCisgcHVibGljOg0KKyAgQ0JDX1BERjQxN0NvbW1vbigpOw0KKyAgdmlydHVhbCB+Q0JDX1BERjQxN0NvbW1vbigpOw0KKyAgc3RhdGljIGludDMyX3QgZ2V0Qml0Q291bnRTdW0oQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCisgIHN0YXRpYyBpbnQzMl90IGdldENvZGV3b3JkKEZYX0RXT1JEIHN5bWJvbCk7DQorICBzdGF0aWMgaW50MzJfdCBOVU1CRVJfT0ZfQ09ERVdPUkRTOw0KKyAgc3RhdGljIGludDMyX3QgTUFYX0NPREVXT1JEU19JTl9CQVJDT0RFOw0KKyAgc3RhdGljIGludDMyX3QgTUlOX1JPV1NfSU5fQkFSQ09ERTsNCisgIHN0YXRpYyBpbnQzMl90IE1BWF9ST1dTX0lOX0JBUkNPREU7DQorICBzdGF0aWMgaW50MzJfdCBNQVhfQ09ERVdPUkRTX0lOX1JPVzsNCisgIHN0YXRpYyBpbnQzMl90IE1PRFVMRVNfSU5fQ09ERVdPUkQ7DQorICBzdGF0aWMgaW50MzJfdCBNT0RVTEVTX0lOX1NUT1BfUEFUVEVSTjsNCisgIHN0YXRpYyBpbnQzMl90IEJBUlNfSU5fTU9EVUxFOw0KKyAgc3RhdGljIGludDMyX3QgU1lNQk9MX1RBQkxFW107DQorICBzdGF0aWMgaW50MzJfdCBDT0RFV09SRF9UQUJMRVtdOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIENGWF9JbnQzMkFycmF5KiBFTVBUWV9JTlRfQVJSQVk7DQorICBzdGF0aWMgaW50MzJfdCBmaW5kQ29kZXdvcmRJbmRleChGWF9EV09SRCBzeW1ib2wpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uY3BwCmluZGV4IDZhZDhjMTMuLjI2MWQwN2EgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5jcHAKQEAgLTIyLDkgKzIyLDUgQEAKIA0KICNpbmNsdWRlICIuLi9iYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX1BERjQxN0NvbXBhY3Rpb24uaCINCi1DQkNfQ29tcGFjdGlvbjo6Q0JDX0NvbXBhY3Rpb24oKQ0KLXsNCi19DQotQ0JDX0NvbXBhY3Rpb246On5DQkNfQ29tcGFjdGlvbigpDQotew0KLX0NCitDQkNfQ29tcGFjdGlvbjo6Q0JDX0NvbXBhY3Rpb24oKSB7fQ0KK0NCQ19Db21wYWN0aW9uOjp+Q0JDX0NvbXBhY3Rpb24oKSB7fQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5oCmluZGV4IDM0YWY0YWMuLjc2OTA5ODMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uaApAQCAtNywxNiArNywxMCBAQAogI2lmbmRlZiBfQkNfQ09NUEFDVElPTl9IXw0KICNkZWZpbmUgX0JDX0NPTVBBQ1RJT05fSF8NCiBjbGFzcyBDQkNfQ29tcGFjdGlvbjsNCi1lbnVtIENvbXBhY3Rpb24gew0KLSAgICBBVVRPLA0KLSAgICBURVhULA0KLSAgICBCWVRFUywNCi0gICAgTlVNRVJJQw0KLX07DQotY2xhc3MgQ0JDX0NvbXBhY3Rpb24NCi17DQotcHVibGljOg0KLSAgICBDQkNfQ29tcGFjdGlvbigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfQ29tcGFjdGlvbigpOw0KK2VudW0gQ29tcGFjdGlvbiB7IEFVVE8sIFRFWFQsIEJZVEVTLCBOVU1FUklDIH07DQorY2xhc3MgQ0JDX0NvbXBhY3Rpb24gew0KKyBwdWJsaWM6DQorICBDQkNfQ29tcGFjdGlvbigpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbXBhY3Rpb24oKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcAppbmRleCAyODFjNzhhLi41MDAyYTk5IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuY3BwCkBAIC0yNywxNCArMjcsMTQgQEAKICNpbmNsdWRlICIuLi8uLi8uLi8uLi90aGlyZF9wYXJ0eS9iaWdpbnQvQmlnSW50ZWdlckxpYnJhcnkuaGgiDQogI2luY2x1ZGUgIkJDX1BERjQxN1Jlc3VsdE1ldGFkYXRhLmgiDQogI2luY2x1ZGUgIkJDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCi0jZGVmaW5lICAgIFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIICAgICAgICAgICAgOTAwDQotI2RlZmluZSAgICBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCAgICAgICAgICAgIDkwMQ0KLSNkZWZpbmUgICAgTlVNRVJJQ19DT01QQUNUSU9OX01PREVfTEFUQ0ggICAgICAgICA5MDINCi0jZGVmaW5lICAgIEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzYgICAgICAgICAgOTI0DQotI2RlZmluZSAgICBCRUdJTl9NQUNST19QREY0MTdfQ09OVFJPTF9CTE9DSyAgICAgIDkyOA0KLSNkZWZpbmUgICAgQkVHSU5fTUFDUk9fUERGNDE3X09QVElPTkFMX0ZJRUxEICAgICA5MjMNCi0jZGVmaW5lICAgIE1BQ1JPX1BERjQxN19URVJNSU5BVE9SICAgICAgICAgICAgICAgOTIyDQotI2RlZmluZSAgICBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFICAgIDkxMw0KKyNkZWZpbmUgVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0ggOTAwDQorI2RlZmluZSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCA5MDENCisjZGVmaW5lIE5VTUVSSUNfQ09NUEFDVElPTl9NT0RFX0xBVENIIDkwMg0KKyNkZWZpbmUgQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0hfNiA5MjQNCisjZGVmaW5lIEJFR0lOX01BQ1JPX1BERjQxN19DT05UUk9MX0JMT0NLIDkyOA0KKyNkZWZpbmUgQkVHSU5fTUFDUk9fUERGNDE3X09QVElPTkFMX0ZJRUxEIDkyMw0KKyNkZWZpbmUgTUFDUk9fUERGNDE3X1RFUk1JTkFUT1IgOTIyDQorI2RlZmluZSBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFIDkxMw0KIA0KIGludDMyX3QgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6TUFYX05VTUVSSUNfQ09ERVdPUkRTID0gMTU7DQogaW50MzJfdCBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpOVU1CRVJfT0ZfU0VRVUVOQ0VfQ09ERVdPUkRTID0gMjsNCkBAIC00Niw0NDAgKzQ2LDQ0NCBAQAogaW50MzJfdCBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpQUyA9IDI5Ow0KIGludDMyX3QgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6UEFMID0gMjk7DQogRlhfQ0hBUiBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpQVU5DVF9DSEFSU1syOV0gPSB7DQotICAgICc7JywgJzwnLCAnPicsICdAJywgJ1snLCAnXFwnLCAnfScsICdfJywgJ2AnLCAnficsICchJywNCi0gICAgJ1xyJywgJ1x0JywgJywnLCAnOicsICdcbicsICctJywgJy4nLCAnJCcsICcvJywgJyInLCAnfCcsICcqJywNCi0gICAgJygnLCAnKScsICc/JywgJ3snLCAnfScsICdcJycNCi19Ow0KKyAgICAnOycsICc8JywgICc+JywgICdAJywgJ1snLCAnXFwnLCAnfScsICdfJywgJ2AnLCAnficsDQorICAgICchJywgJ1xyJywgJ1x0JywgJywnLCAnOicsICdcbicsICctJywgJy4nLCAnJCcsICcvJywNCisgICAgJyInLCAnfCcsICAnKicsICAnKCcsICcpJywgJz8nLCAgJ3snLCAnfScsICdcJyd9Ow0KIEZYX0NIQVIgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6TUlYRURfQ0hBUlNbMzBdID0gew0KLSAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcmJywNCi0gICAgJ1xyJywgJ1x0JywgJywnLCAnOicsICcjJywgJy0nLCAnLicsICckJywgJy8nLCAnKycsICclJywgJyonLA0KLSAgICAnPScsICdeJw0KLX07DQotdm9pZCBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpJbml0aWFsaXplKCkNCi17DQorICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJyYnLCAnXHInLCAnXHQnLA0KKyAgICAnLCcsICc6JywgJyMnLCAnLScsICcuJywgJyQnLCAnLycsICcrJywgJyUnLCAnKicsICc9JywgJ14nfTsNCit2b2lkIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OkluaXRpYWxpemUoKSB7fQ0KK3ZvaWQgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6RmluYWxpemUoKSB7fQ0KK0NCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OkNCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXIoKSB7fQ0KK0NCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6On5DQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyKCkge30NCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6ZGVjb2RlKA0KKyAgICBDRlhfSW50MzJBcnJheSYgY29kZXdvcmRzLA0KKyAgICBDRlhfQnl0ZVN0cmluZyBlY0xldmVsLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICBpbnQzMl90IGNvZGVJbmRleCA9IDE7DQorICBpbnQzMl90IGNvZGUgPSBjb2Rld29yZHMuR2V0QXQoY29kZUluZGV4KTsNCisgIGNvZGVJbmRleCsrOw0KKyAgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKiByZXN1bHRNZXRhZGF0YSA9IEZYX05FVyBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE7DQorICB3aGlsZSAoY29kZUluZGV4IDwgY29kZXdvcmRzWzBdKSB7DQorICAgIHN3aXRjaCAoY29kZSkgew0KKyAgICAgIGNhc2UgVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0g6DQorICAgICAgICBjb2RlSW5kZXggPSB0ZXh0Q29tcGFjdGlvbihjb2Rld29yZHMsIGNvZGVJbmRleCwgcmVzdWx0KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0g6DQorICAgICAgICBjb2RlSW5kZXggPSBieXRlQ29tcGFjdGlvbihjb2RlLCBjb2Rld29yZHMsIGNvZGVJbmRleCwgcmVzdWx0KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgTlVNRVJJQ19DT01QQUNUSU9OX01PREVfTEFUQ0g6DQorICAgICAgICBjb2RlSW5kZXggPSBudW1lcmljQ29tcGFjdGlvbihjb2Rld29yZHMsIGNvZGVJbmRleCwgcmVzdWx0LCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgTU9ERV9TSElGVF9UT19CWVRFX0NPTVBBQ1RJT05fTU9ERToNCisgICAgICAgIGNvZGVJbmRleCA9IGJ5dGVDb21wYWN0aW9uKGNvZGUsIGNvZGV3b3JkcywgY29kZUluZGV4LCByZXN1bHQpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSF82Og0KKyAgICAgICAgY29kZUluZGV4ID0gYnl0ZUNvbXBhY3Rpb24oY29kZSwgY29kZXdvcmRzLCBjb2RlSW5kZXgsIHJlc3VsdCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEJFR0lOX01BQ1JPX1BERjQxN19DT05UUk9MX0JMT0NLOg0KKyAgICAgICAgY29kZUluZGV4ID0gZGVjb2RlTWFjcm9CbG9jayhjb2Rld29yZHMsIGNvZGVJbmRleCwgcmVzdWx0TWV0YWRhdGEsIGUpOw0KKyAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICBkZWxldGUgcmVzdWx0TWV0YWRhdGE7DQorICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgY29kZUluZGV4ID0gdGV4dENvbXBhY3Rpb24oY29kZXdvcmRzLCBjb2RlSW5kZXgsIHJlc3VsdCk7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoY29kZUluZGV4IDwgY29kZXdvcmRzLkdldFNpemUoKSkgew0KKyAgICAgIGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlOw0KKyAgICAgIGRlbGV0ZSByZXN1bHRNZXRhZGF0YTsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA9PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlOw0KKyAgICBkZWxldGUgcmVzdWx0TWV0YWRhdGE7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVBcnJheSByYXdCeXRlczsNCisgIENGWF9QdHJBcnJheSBieXRlU2VnbWVudHM7DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogdGVtcENkID0gRlhfTkVXIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KCk7DQorICB0ZW1wQ2QtPkluaXQocmF3Qnl0ZXMsIHJlc3VsdCwgYnl0ZVNlZ21lbnRzLCBlY0xldmVsLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZGVsZXRlIHJlc3VsdE1ldGFkYXRhOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHRlbXBDZC0+c2V0T3RoZXIocmVzdWx0TWV0YWRhdGEpOw0KKyAgcmV0dXJuIHRlbXBDZDsNCiB9DQotdm9pZCBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpGaW5hbGl6ZSgpDQotew0KLX0NCi1DQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyKCkNCi17DQotfQ0KLUNCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6On5DQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyKCkNCi17DQotfQ0KLUNCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpkZWNvZGUoQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgQ0ZYX0J5dGVTdHJpbmcgZWNMZXZlbCwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCi0gICAgaW50MzJfdCBjb2RlSW5kZXggPSAxOw0KLSAgICBpbnQzMl90IGNvZGUgPSBjb2Rld29yZHMuR2V0QXQoY29kZUluZGV4KTsNCitpbnQzMl90IENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OmRlY29kZU1hY3JvQmxvY2soDQorICAgIENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgIGludDMyX3QgY29kZUluZGV4LA0KKyAgICBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEqIHJlc3VsdE1ldGFkYXRhLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY29kZUluZGV4ICsgTlVNQkVSX09GX1NFUVVFTkNFX0NPREVXT1JEUyA+IGNvZGV3b3Jkc1swXSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgc2VnbWVudEluZGV4QXJyYXk7DQorICBzZWdtZW50SW5kZXhBcnJheS5TZXRTaXplKE5VTUJFUl9PRl9TRVFVRU5DRV9DT0RFV09SRFMpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgTlVNQkVSX09GX1NFUVVFTkNFX0NPREVXT1JEUzsgaSsrLCBjb2RlSW5kZXgrKykgew0KKyAgICBzZWdtZW50SW5kZXhBcnJheS5TZXRBdChpLCBjb2Rld29yZHNbY29kZUluZGV4XSk7DQorICB9DQorICBDRlhfQnl0ZVN0cmluZyBzdHIgPQ0KKyAgICAgIGRlY29kZUJhc2U5MDB0b0Jhc2UxMChzZWdtZW50SW5kZXhBcnJheSwgTlVNQkVSX09GX1NFUVVFTkNFX0NPREVXT1JEUywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgcmVzdWx0TWV0YWRhdGEtPnNldFNlZ21lbnRJbmRleChhdG9pKHN0ci5HZXRCdWZmZXIoc3RyLkdldExlbmd0aCgpKSkpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgZmlsZUlkOw0KKyAgY29kZUluZGV4ID0gdGV4dENvbXBhY3Rpb24oY29kZXdvcmRzLCBjb2RlSW5kZXgsIGZpbGVJZCk7DQorICByZXN1bHRNZXRhZGF0YS0+c2V0RmlsZUlkKGZpbGVJZCk7DQorICBpZiAoY29kZXdvcmRzW2NvZGVJbmRleF0gPT0gQkVHSU5fTUFDUk9fUERGNDE3X09QVElPTkFMX0ZJRUxEKSB7DQogICAgIGNvZGVJbmRleCsrOw0KLSAgICBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEqIHJlc3VsdE1ldGFkYXRhID0gRlhfTkVXIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTsNCi0gICAgd2hpbGUgKGNvZGVJbmRleCA8IGNvZGV3b3Jkc1swXSkgew0KLSAgICAgICAgc3dpdGNoIChjb2RlKSB7DQotICAgICAgICAgICAgY2FzZSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSDoNCi0gICAgICAgICAgICAgICAgY29kZUluZGV4ID0gdGV4dENvbXBhY3Rpb24oY29kZXdvcmRzLCBjb2RlSW5kZXgsIHJlc3VsdCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0g6DQotICAgICAgICAgICAgICAgIGNvZGVJbmRleCA9IGJ5dGVDb21wYWN0aW9uKGNvZGUsIGNvZGV3b3JkcywgY29kZUluZGV4LCByZXN1bHQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIE5VTUVSSUNfQ09NUEFDVElPTl9NT0RFX0xBVENIOg0KLSAgICAgICAgICAgICAgICBjb2RlSW5kZXggPSBudW1lcmljQ29tcGFjdGlvbihjb2Rld29yZHMsIGNvZGVJbmRleCwgcmVzdWx0LCBlKTsNCi0gICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREU6DQotICAgICAgICAgICAgICAgIGNvZGVJbmRleCA9IGJ5dGVDb21wYWN0aW9uKGNvZGUsIGNvZGV3b3JkcywgY29kZUluZGV4LCByZXN1bHQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzY6DQotICAgICAgICAgICAgICAgIGNvZGVJbmRleCA9IGJ5dGVDb21wYWN0aW9uKGNvZGUsIGNvZGV3b3JkcywgY29kZUluZGV4LCByZXN1bHQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEJFR0lOX01BQ1JPX1BERjQxN19DT05UUk9MX0JMT0NLOg0KLSAgICAgICAgICAgICAgICBjb2RlSW5kZXggPSBkZWNvZGVNYWNyb0Jsb2NrKGNvZGV3b3JkcywgY29kZUluZGV4LCByZXN1bHRNZXRhZGF0YSwgZSk7DQotICAgICAgICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHRNZXRhZGF0YTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGNvZGVJbmRleC0tOw0KLSAgICAgICAgICAgICAgICBjb2RlSW5kZXggPSB0ZXh0Q29tcGFjdGlvbihjb2Rld29yZHMsIGNvZGVJbmRleCwgcmVzdWx0KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZiAoY29kZUluZGV4IDwgY29kZXdvcmRzLkdldFNpemUoKSkgew0KLSAgICAgICAgICAgIGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCi0gICAgICAgICAgICBkZWxldGUgcmVzdWx0TWV0YWRhdGE7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCi0gICAgICAgIGRlbGV0ZSByZXN1bHRNZXRhZGF0YTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENGWF9CeXRlQXJyYXkgcmF3Qnl0ZXM7DQotICAgIENGWF9QdHJBcnJheSBieXRlU2VnbWVudHM7DQotICAgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0ICp0ZW1wQ2QgPSBGWF9ORVcgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKTsNCi0gICAgdGVtcENkLT5Jbml0KHJhd0J5dGVzLCByZXN1bHQsIGJ5dGVTZWdtZW50cywgZWNMZXZlbCwgZSk7DQotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIGRlbGV0ZSByZXN1bHRNZXRhZGF0YTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHRlbXBDZC0+c2V0T3RoZXIocmVzdWx0TWV0YWRhdGEpOw0KLSAgICByZXR1cm4gdGVtcENkOw0KLX0NCi1pbnQzMl90IENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OmRlY29kZU1hY3JvQmxvY2soQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgaW50MzJfdCBjb2RlSW5kZXgsIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSogcmVzdWx0TWV0YWRhdGEsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoY29kZUluZGV4ICsgTlVNQkVSX09GX1NFUVVFTkNFX0NPREVXT1JEUyA+IGNvZGV3b3Jkc1swXSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgQ0ZYX0ludDMyQXJyYXkgc2VnbWVudEluZGV4QXJyYXk7DQotICAgIHNlZ21lbnRJbmRleEFycmF5LlNldFNpemUoTlVNQkVSX09GX1NFUVVFTkNFX0NPREVXT1JEUyk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IE5VTUJFUl9PRl9TRVFVRU5DRV9DT0RFV09SRFM7IGkrKywgY29kZUluZGV4KyspIHsNCi0gICAgICAgIHNlZ21lbnRJbmRleEFycmF5LlNldEF0KGksIGNvZGV3b3Jkc1tjb2RlSW5kZXhdKTsNCi0gICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBkZWNvZGVCYXNlOTAwdG9CYXNlMTAoc2VnbWVudEluZGV4QXJyYXksIE5VTUJFUl9PRl9TRVFVRU5DRV9DT0RFV09SRFMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KLSAgICByZXN1bHRNZXRhZGF0YS0+c2V0U2VnbWVudEluZGV4KGF0b2koc3RyLkdldEJ1ZmZlcihzdHIuR2V0TGVuZ3RoKCkpKSk7DQotICAgIENGWF9CeXRlU3RyaW5nIGZpbGVJZDsNCi0gICAgY29kZUluZGV4ID0gdGV4dENvbXBhY3Rpb24oY29kZXdvcmRzLCBjb2RlSW5kZXgsIGZpbGVJZCk7DQotICAgIHJlc3VsdE1ldGFkYXRhLT5zZXRGaWxlSWQoZmlsZUlkKTsNCi0gICAgaWYgKGNvZGV3b3Jkc1tjb2RlSW5kZXhdID09IEJFR0lOX01BQ1JPX1BERjQxN19PUFRJT05BTF9GSUVMRCkgew0KLSAgICAgICAgY29kZUluZGV4Kys7DQotICAgICAgICBDRlhfSW50MzJBcnJheSBhZGRpdGlvbmFsT3B0aW9uQ29kZVdvcmRzOw0KLSAgICAgICAgYWRkaXRpb25hbE9wdGlvbkNvZGVXb3Jkcy5TZXRTaXplKGNvZGV3b3Jkc1swXSAtIGNvZGVJbmRleCk7DQotICAgICAgICBpbnQzMl90IGFkZGl0aW9uYWxPcHRpb25Db2RlV29yZHNJbmRleCA9IDA7DQotICAgICAgICBGWF9CT09MIGVuZCA9IEZBTFNFOw0KLSAgICAgICAgd2hpbGUgKChjb2RlSW5kZXggPCBjb2Rld29yZHNbMF0pICYmICFlbmQpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KLSAgICAgICAgICAgIGlmIChjb2RlIDwgVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCi0gICAgICAgICAgICAgICAgYWRkaXRpb25hbE9wdGlvbkNvZGVXb3Jkc1thZGRpdGlvbmFsT3B0aW9uQ29kZVdvcmRzSW5kZXgrK10gPSBjb2RlOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNQUNST19QREY0MTdfVEVSTUlOQVRPUjoNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRNZXRhZGF0YS0+c2V0TGFzdFNlZ21lbnQoVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZUluZGV4Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX0ludDMyQXJyYXkgYXJyYXk7DQotICAgICAgICBhcnJheS5TZXRTaXplKGFkZGl0aW9uYWxPcHRpb25Db2RlV29yZHNJbmRleCk7DQotICAgICAgICBhcnJheS5Db3B5KGFkZGl0aW9uYWxPcHRpb25Db2RlV29yZHMpOw0KLSAgICAgICAgcmVzdWx0TWV0YWRhdGEtPnNldE9wdGlvbmFsRGF0YShhcnJheSk7DQotICAgIH0gZWxzZSBpZiAoY29kZXdvcmRzW2NvZGVJbmRleF0gPT0gTUFDUk9fUERGNDE3X1RFUk1JTkFUT1IpIHsNCi0gICAgICAgIHJlc3VsdE1ldGFkYXRhLT5zZXRMYXN0U2VnbWVudChUUlVFKTsNCi0gICAgICAgIGNvZGVJbmRleCsrOw0KLSAgICB9DQotICAgIHJldHVybiBjb2RlSW5kZXg7DQotfQ0KLWludDMyX3QgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6dGV4dENvbXBhY3Rpb24oQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgaW50MzJfdCBjb2RlSW5kZXgsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQpDQotew0KLSAgICBDRlhfSW50MzJBcnJheSB0ZXh0Q29tcGFjdGlvbkRhdGE7DQotICAgIHRleHRDb21wYWN0aW9uRGF0YS5TZXRTaXplKChjb2Rld29yZHNbMF0gLSBjb2RlSW5kZXgpIDw8IDEpOw0KLSAgICBDRlhfSW50MzJBcnJheSBieXRlQ29tcGFjdGlvbkRhdGE7DQotICAgIGJ5dGVDb21wYWN0aW9uRGF0YS5TZXRTaXplKChjb2Rld29yZHNbMF0gLSBjb2RlSW5kZXgpIDw8IDEpOw0KLSAgICBpbnQzMl90IGluZGV4ID0gMDsNCisgICAgQ0ZYX0ludDMyQXJyYXkgYWRkaXRpb25hbE9wdGlvbkNvZGVXb3JkczsNCisgICAgYWRkaXRpb25hbE9wdGlvbkNvZGVXb3Jkcy5TZXRTaXplKGNvZGV3b3Jkc1swXSAtIGNvZGVJbmRleCk7DQorICAgIGludDMyX3QgYWRkaXRpb25hbE9wdGlvbkNvZGVXb3Jkc0luZGV4ID0gMDsNCiAgICAgRlhfQk9PTCBlbmQgPSBGQUxTRTsNCiAgICAgd2hpbGUgKChjb2RlSW5kZXggPCBjb2Rld29yZHNbMF0pICYmICFlbmQpIHsNCi0gICAgICAgIGludDMyX3QgY29kZSA9IGNvZGV3b3Jkc1tjb2RlSW5kZXgrK107DQotICAgICAgICBpZiAoY29kZSA8IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQotICAgICAgICAgICAgdGV4dENvbXBhY3Rpb25EYXRhW2luZGV4XSA9IGNvZGUgLyAzMDsNCi0gICAgICAgICAgICB0ZXh0Q29tcGFjdGlvbkRhdGFbaW5kZXggKyAxXSA9IGNvZGUgJSAzMDsNCi0gICAgICAgICAgICBpbmRleCArPSAyOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSDoNCi0gICAgICAgICAgICAgICAgICAgIHRleHRDb21wYWN0aW9uRGF0YVtpbmRleCsrXSA9IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0g6DQotICAgICAgICAgICAgICAgICAgICBjb2RlSW5kZXgtLTsNCi0gICAgICAgICAgICAgICAgICAgIGVuZCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBOVU1FUklDX0NPTVBBQ1RJT05fTU9ERV9MQVRDSDoNCi0gICAgICAgICAgICAgICAgICAgIGNvZGVJbmRleC0tOw0KLSAgICAgICAgICAgICAgICAgICAgZW5kID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEJFR0lOX01BQ1JPX1BERjQxN19DT05UUk9MX0JMT0NLOg0KLSAgICAgICAgICAgICAgICAgICAgY29kZUluZGV4LS07DQotICAgICAgICAgICAgICAgICAgICBlbmQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgQkVHSU5fTUFDUk9fUERGNDE3X09QVElPTkFMX0ZJRUxEOg0KLSAgICAgICAgICAgICAgICAgICAgY29kZUluZGV4LS07DQotICAgICAgICAgICAgICAgICAgICBlbmQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgTUFDUk9fUERGNDE3X1RFUk1JTkFUT1I6DQotICAgICAgICAgICAgICAgICAgICBjb2RlSW5kZXgtLTsNCi0gICAgICAgICAgICAgICAgICAgIGVuZCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFOg0KLSAgICAgICAgICAgICAgICAgICAgdGV4dENvbXBhY3Rpb25EYXRhW2luZGV4XSA9IE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREU7DQotICAgICAgICAgICAgICAgICAgICBjb2RlID0gY29kZXdvcmRzW2NvZGVJbmRleCsrXTsNCi0gICAgICAgICAgICAgICAgICAgIGJ5dGVDb21wYWN0aW9uRGF0YVtpbmRleF0gPSBjb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzY6DQotICAgICAgICAgICAgICAgICAgICBjb2RlSW5kZXgtLTsNCi0gICAgICAgICAgICAgICAgICAgIGVuZCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZGVjb2RlVGV4dENvbXBhY3Rpb24odGV4dENvbXBhY3Rpb25EYXRhLCBieXRlQ29tcGFjdGlvbkRhdGEsIGluZGV4LCByZXN1bHQpOw0KLSAgICByZXR1cm4gY29kZUluZGV4Ow0KLX0NCi12b2lkIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OmRlY29kZVRleHRDb21wYWN0aW9uKENGWF9JbnQzMkFycmF5ICZ0ZXh0Q29tcGFjdGlvbkRhdGEsIENGWF9JbnQzMkFycmF5ICZieXRlQ29tcGFjdGlvbkRhdGEsIGludDMyX3QgbGVuZ3RoLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0KQ0KLXsNCi0gICAgTW9kZSBzdWJNb2RlID0gQUxQSEE7DQotICAgIE1vZGUgcHJpb3JUb1NoaWZ0TW9kZSA9IEFMUEhBOw0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICB3aGlsZSAoaSA8IGxlbmd0aCkgew0KLSAgICAgICAgaW50MzJfdCBzdWJNb2RlQ2ggPSB0ZXh0Q29tcGFjdGlvbkRhdGFbaV07DQotICAgICAgICBGWF9DSEFSIGNoID0gMDsNCi0gICAgICAgIHN3aXRjaCAoc3ViTW9kZSkgew0KLSAgICAgICAgICAgIGNhc2UgQUxQSEE6DQotICAgICAgICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPCAyNikgew0KLSAgICAgICAgICAgICAgICAgICAgY2ggPSAoRlhfQ0hBUikgKCdBJyArIHN1Yk1vZGVDaCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZUNoID09IDI2KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAnICc7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBMT1dFUjsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IE1MKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IE1JWEVEOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gUFMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmlvclRvU2hpZnRNb2RlID0gc3ViTW9kZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gUFVOQ1RfU0hJRlQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSBieXRlQ29tcGFjdGlvbkRhdGFbaV07DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBBTFBIQTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIExPV0VSOg0KLSAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZUNoIDwgMjYpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNoID0gKEZYX0NIQVIpICgnYScgKyBzdWJNb2RlQ2gpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA9PSAyNikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gJyAnOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gQVMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmlvclRvU2hpZnRNb2RlID0gc3ViTW9kZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEFfU0hJRlQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBNTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBNSVhFRDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IFBTKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JUb1NoaWZ0TW9kZSA9IHN1Yk1vZGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IFBVTkNUX1NISUZUOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gTU9ERV9TSElGVF9UT19CWVRFX0NPTVBBQ1RJT05fTU9ERSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgYnl0ZUNvbXBhY3Rpb25EYXRhW2ldOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBNSVhFRDoNCi0gICAgICAgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA8IFBMKSB7DQotICAgICAgICAgICAgICAgICAgICBjaCA9IE1JWEVEX0NIQVJTW3N1Yk1vZGVDaF07DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZUNoID09IFBMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IFBVTkNUOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gMjYpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaCA9ICcgJzsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IExMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IExPV0VSOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gQUwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBQUykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yVG9TaGlmdE1vZGUgPSBzdWJNb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBQVU5DVF9TSElGVDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpIGJ5dGVDb21wYWN0aW9uRGF0YVtpXTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgUFVOQ1Q6DQotICAgICAgICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPCBQQUwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNoID0gUFVOQ1RfQ0hBUlNbc3ViTW9kZUNoXTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPT0gUEFMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gTU9ERV9TSElGVF9UT19CWVRFX0NPTVBBQ1RJT05fTU9ERSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgYnl0ZUNvbXBhY3Rpb25EYXRhW2ldOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBBTFBIQV9TSElGVDoNCi0gICAgICAgICAgICAgICAgc3ViTW9kZSA9IHByaW9yVG9TaGlmdE1vZGU7DQotICAgICAgICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPCAyNikgew0KLSAgICAgICAgICAgICAgICAgICAgY2ggPSAoRlhfQ0hBUikgKCdBJyArIHN1Yk1vZGVDaCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZUNoID09IDI2KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAnICc7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBBTFBIQTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFBVTkNUX1NISUZUOg0KLSAgICAgICAgICAgICAgICBzdWJNb2RlID0gcHJpb3JUb1NoaWZ0TW9kZTsNCi0gICAgICAgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA8IFBBTCkgew0KLSAgICAgICAgICAgICAgICAgICAgY2ggPSBQVU5DVF9DSEFSU1tzdWJNb2RlQ2hdOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA9PSBQQUwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSBieXRlQ29tcGFjdGlvbkRhdGFbaV07DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk1vZGUgPSBBTFBIQTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChjaCAhPSAwKSB7DQotICAgICAgICAgICAgcmVzdWx0ICs9IGNoOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaSsrOw0KLSAgICB9DQotfQ0KLWludDMyX3QgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6Ynl0ZUNvbXBhY3Rpb24oaW50MzJfdCBtb2RlLCBDRlhfSW50MzJBcnJheSAmY29kZXdvcmRzLCBpbnQzMl90IGNvZGVJbmRleCwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCkNCi17DQotICAgIGlmIChtb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQotICAgICAgICBpbnQzMl90IGNvdW50ID0gMDsNCi0gICAgICAgIGludDY0X3QgdmFsdWUgPSAwOw0KLSAgICAgICAgRlhfV09SRCogZGVjb2RlZERhdGEgPSBGWF9BbGxvYyhGWF9XT1JELCA2ICogc2l6ZW9mKEZYX1dPUkQpKTsNCi0gICAgICAgIENGWF9JbnQzMkFycmF5IGJ5dGVDb21wYWN0ZWRDb2Rld29yZHM7DQotICAgICAgICBieXRlQ29tcGFjdGVkQ29kZXdvcmRzLlNldFNpemUoNik7DQotICAgICAgICBGWF9CT09MIGVuZCA9IEZBTFNFOw0KLSAgICAgICAgaW50MzJfdCBuZXh0Q29kZSA9IGNvZGV3b3Jkc1tjb2RlSW5kZXgrK107DQotICAgICAgICB3aGlsZSAoKGNvZGVJbmRleCA8IGNvZGV3b3Jkc1swXSkgJiYgIWVuZCkgew0KLSAgICAgICAgICAgIGJ5dGVDb21wYWN0ZWRDb2Rld29yZHNbY291bnQrK10gPSBuZXh0Q29kZTsNCi0gICAgICAgICAgICB2YWx1ZSA9IDkwMCAqIHZhbHVlICsgbmV4dENvZGU7DQotICAgICAgICAgICAgbmV4dENvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KLSAgICAgICAgICAgIGlmIChuZXh0Q29kZSA9PSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCB8fA0KLSAgICAgICAgICAgICAgICAgICAgbmV4dENvZGUgPT0gQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0ggfHwNCi0gICAgICAgICAgICAgICAgICAgIG5leHRDb2RlID09IE5VTUVSSUNfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQotICAgICAgICAgICAgICAgICAgICBuZXh0Q29kZSA9PSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSF82IHx8DQotICAgICAgICAgICAgICAgICAgICBuZXh0Q29kZSA9PSBCRUdJTl9NQUNST19QREY0MTdfQ09OVFJPTF9CTE9DSyB8fA0KLSAgICAgICAgICAgICAgICAgICAgbmV4dENvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X09QVElPTkFMX0ZJRUxEIHx8DQotICAgICAgICAgICAgICAgICAgICBuZXh0Q29kZSA9PSBNQUNST19QREY0MTdfVEVSTUlOQVRPUikgew0KLSAgICAgICAgICAgICAgICBjb2RlSW5kZXgtLTsNCi0gICAgICAgICAgICAgICAgZW5kID0gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZiAoKGNvdW50ICUgNSA9PSAwKSAmJiAoY291bnQgPiAwKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBqID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgNjsgKytqKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZERhdGFbNSAtIGpdID0gKEZYX1dPUkQpICh2YWx1ZSAlIDI1Nik7DQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPj49IDg7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjsgKytqKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKWRlY29kZWREYXRhW2pdOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY291bnQgPSAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRnJlZShkZWNvZGVkRGF0YSk7DQotICAgICAgICBpZiAoY29kZUluZGV4ID09IGNvZGV3b3Jkc1swXSAmJiBuZXh0Q29kZSA8IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQotICAgICAgICAgICAgYnl0ZUNvbXBhY3RlZENvZGV3b3Jkc1tjb3VudCsrXSA9IG5leHRDb2RlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KLSAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikoRlhfV09SRCkgYnl0ZUNvbXBhY3RlZENvZGV3b3Jkc1tpXTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChtb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzYpIHsNCi0gICAgICAgIGludDMyX3QgY291bnQgPSAwOw0KLSAgICAgICAgaW50NjRfdCB2YWx1ZSA9IDA7DQotICAgICAgICBGWF9CT09MIGVuZCA9IEZBTFNFOw0KLSAgICAgICAgd2hpbGUgKGNvZGVJbmRleCA8IGNvZGV3b3Jkc1swXSAmJiAhZW5kKSB7DQotICAgICAgICAgICAgaW50MzJfdCBjb2RlID0gY29kZXdvcmRzW2NvZGVJbmRleCsrXTsNCi0gICAgICAgICAgICBpZiAoY29kZSA8IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQotICAgICAgICAgICAgICAgIGNvdW50Kys7DQotICAgICAgICAgICAgICAgIHZhbHVlID0gOTAwICogdmFsdWUgKyBjb2RlOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmIChjb2RlID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gTlVNRVJJQ19DT01QQUNUSU9OX01PREVfTEFUQ0ggfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzYgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID09IEJFR0lOX01BQ1JPX1BERjQxN19DT05UUk9MX0JMT0NLIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBCRUdJTl9NQUNST19QREY0MTdfT1BUSU9OQUxfRklFTEQgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID09IE1BQ1JPX1BERjQxN19URVJNSU5BVE9SKSB7DQotICAgICAgICAgICAgICAgICAgICBjb2RlSW5kZXgtLTsNCi0gICAgICAgICAgICAgICAgICAgIGVuZCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKChjb3VudCAlIDUgPT0gMCkgJiYgKGNvdW50ID4gMCkpIHsNCi0gICAgICAgICAgICAgICAgRlhfV09SRCogZGVjb2RlZERhdGEgPSBGWF9BbGxvYyhGWF9XT1JELCA2ICogc2l6ZW9mKEZYX1dPUkQpKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBqID0gMDsNCi0gICAgICAgICAgICAgICAgZm9yICg7IGogPCA2OyArK2opIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlY29kZWREYXRhWzUgLSBqXSA9IChGWF9XT1JEKSAodmFsdWUgJiAweEZGKTsNCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlID4+PSA4Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2OyArK2opIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUilkZWNvZGVkRGF0YVtqXTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjb3VudCA9IDA7DQotICAgICAgICAgICAgICAgIEZYX0ZyZWUoZGVjb2RlZERhdGEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gY29kZUluZGV4Ow0KLX0NCi1pbnQzMl90IENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6Om51bWVyaWNDb21wYWN0aW9uKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIGludDMyX3QgY29kZUluZGV4LCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBjb3VudCA9IDA7DQotICAgIEZYX0JPT0wgZW5kID0gRkFMU0U7DQotICAgIENGWF9JbnQzMkFycmF5IG51bWVyaWNDb2Rld29yZHM7DQotICAgIG51bWVyaWNDb2Rld29yZHMuU2V0U2l6ZShNQVhfTlVNRVJJQ19DT0RFV09SRFMpOw0KLSAgICB3aGlsZSAoY29kZUluZGV4IDwgY29kZXdvcmRzWzBdICYmICFlbmQpIHsNCi0gICAgICAgIGludDMyX3QgY29kZSA9IGNvZGV3b3Jkc1tjb2RlSW5kZXgrK107DQotICAgICAgICBpZiAoY29kZUluZGV4ID09IGNvZGV3b3Jkc1swXSkgew0KKyAgICAgIGludDMyX3QgY29kZSA9IGNvZGV3b3Jkc1tjb2RlSW5kZXgrK107DQorICAgICAgaWYgKGNvZGUgPCBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICAgICAgYWRkaXRpb25hbE9wdGlvbkNvZGVXb3Jkc1thZGRpdGlvbmFsT3B0aW9uQ29kZVdvcmRzSW5kZXgrK10gPSBjb2RlOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBzd2l0Y2ggKGNvZGUpIHsNCisgICAgICAgICAgY2FzZSBNQUNST19QREY0MTdfVEVSTUlOQVRPUjoNCisgICAgICAgICAgICByZXN1bHRNZXRhZGF0YS0+c2V0TGFzdFNlZ21lbnQoVFJVRSk7DQorICAgICAgICAgICAgY29kZUluZGV4Kys7DQogICAgICAgICAgICAgZW5kID0gVFJVRTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCisgICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgICB9DQotICAgICAgICBpZiAoY29kZSA8IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQotICAgICAgICAgICAgbnVtZXJpY0NvZGV3b3Jkc1tjb3VudF0gPSBjb2RlOw0KLSAgICAgICAgICAgIGNvdW50Kys7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChjb2RlID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQotICAgICAgICAgICAgICAgICAgICBjb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQotICAgICAgICAgICAgICAgICAgICBjb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzYgfHwNCi0gICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X0NPTlRST0xfQkxPQ0sgfHwNCi0gICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X09QVElPTkFMX0ZJRUxEIHx8DQotICAgICAgICAgICAgICAgICAgICBjb2RlID09IE1BQ1JPX1BERjQxN19URVJNSU5BVE9SKSB7DQotICAgICAgICAgICAgICAgIGNvZGVJbmRleC0tOw0KLSAgICAgICAgICAgICAgICBlbmQgPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChjb3VudCAlIE1BWF9OVU1FUklDX0NPREVXT1JEUyA9PSAwIHx8DQotICAgICAgICAgICAgICAgIGNvZGUgPT0gTlVNRVJJQ19DT01QQUNUSU9OX01PREVfTEFUQ0ggfHwNCi0gICAgICAgICAgICAgICAgZW5kKSB7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcyA9IGRlY29kZUJhc2U5MDB0b0Jhc2UxMChudW1lcmljQ29kZXdvcmRzLCBjb3VudCwgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCi0gICAgICAgICAgICByZXN1bHQgKz0gczsNCi0gICAgICAgICAgICBjb3VudCA9IDA7DQotICAgICAgICB9DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiBjb2RlSW5kZXg7DQorICAgIENGWF9JbnQzMkFycmF5IGFycmF5Ow0KKyAgICBhcnJheS5TZXRTaXplKGFkZGl0aW9uYWxPcHRpb25Db2RlV29yZHNJbmRleCk7DQorICAgIGFycmF5LkNvcHkoYWRkaXRpb25hbE9wdGlvbkNvZGVXb3Jkcyk7DQorICAgIHJlc3VsdE1ldGFkYXRhLT5zZXRPcHRpb25hbERhdGEoYXJyYXkpOw0KKyAgfSBlbHNlIGlmIChjb2Rld29yZHNbY29kZUluZGV4XSA9PSBNQUNST19QREY0MTdfVEVSTUlOQVRPUikgew0KKyAgICByZXN1bHRNZXRhZGF0YS0+c2V0TGFzdFNlZ21lbnQoVFJVRSk7DQorICAgIGNvZGVJbmRleCsrOw0KKyAgfQ0KKyAgcmV0dXJuIGNvZGVJbmRleDsNCiB9DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6ZGVjb2RlQmFzZTkwMHRvQmFzZTEwKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIGludDMyX3QgY291bnQsIGludDMyX3QgJmUpDQotew0KLSAgICBCaWdJbnRlZ2VyIHJlc3VsdCA9IDA7DQotICAgIEJpZ0ludGVnZXIgbmluZUh1bmRyZWQoOTAwKTsNCitpbnQzMl90IENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OnRleHRDb21wYWN0aW9uKENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQpIHsNCisgIENGWF9JbnQzMkFycmF5IHRleHRDb21wYWN0aW9uRGF0YTsNCisgIHRleHRDb21wYWN0aW9uRGF0YS5TZXRTaXplKChjb2Rld29yZHNbMF0gLSBjb2RlSW5kZXgpIDw8IDEpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgYnl0ZUNvbXBhY3Rpb25EYXRhOw0KKyAgYnl0ZUNvbXBhY3Rpb25EYXRhLlNldFNpemUoKGNvZGV3b3Jkc1swXSAtIGNvZGVJbmRleCkgPDwgMSk7DQorICBpbnQzMl90IGluZGV4ID0gMDsNCisgIEZYX0JPT0wgZW5kID0gRkFMU0U7DQorICB3aGlsZSAoKGNvZGVJbmRleCA8IGNvZGV3b3Jkc1swXSkgJiYgIWVuZCkgew0KKyAgICBpbnQzMl90IGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KKyAgICBpZiAoY29kZSA8IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgdGV4dENvbXBhY3Rpb25EYXRhW2luZGV4XSA9IGNvZGUgLyAzMDsNCisgICAgICB0ZXh0Q29tcGFjdGlvbkRhdGFbaW5kZXggKyAxXSA9IGNvZGUgJSAzMDsNCisgICAgICBpbmRleCArPSAyOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHN3aXRjaCAoY29kZSkgew0KKyAgICAgICAgY2FzZSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSDoNCisgICAgICAgICAgdGV4dENvbXBhY3Rpb25EYXRhW2luZGV4KytdID0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0g7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSDoNCisgICAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBOVU1FUklDX0NPTVBBQ1RJT05fTU9ERV9MQVRDSDoNCisgICAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCRUdJTl9NQUNST19QREY0MTdfQ09OVFJPTF9CTE9DSzoNCisgICAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCRUdJTl9NQUNST19QREY0MTdfT1BUSU9OQUxfRklFTEQ6DQorICAgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTUFDUk9fUERGNDE3X1RFUk1JTkFUT1I6DQorICAgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTU9ERV9TSElGVF9UT19CWVRFX0NPTVBBQ1RJT05fTU9ERToNCisgICAgICAgICAgdGV4dENvbXBhY3Rpb25EYXRhW2luZGV4XSA9IE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREU7DQorICAgICAgICAgIGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KKyAgICAgICAgICBieXRlQ29tcGFjdGlvbkRhdGFbaW5kZXhdID0gY29kZTsNCisgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzY6DQorICAgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGRlY29kZVRleHRDb21wYWN0aW9uKHRleHRDb21wYWN0aW9uRGF0YSwgYnl0ZUNvbXBhY3Rpb25EYXRhLCBpbmRleCwgcmVzdWx0KTsNCisgIHJldHVybiBjb2RlSW5kZXg7DQorfQ0KK3ZvaWQgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6ZGVjb2RlVGV4dENvbXBhY3Rpb24oDQorICAgIENGWF9JbnQzMkFycmF5JiB0ZXh0Q29tcGFjdGlvbkRhdGEsDQorICAgIENGWF9JbnQzMkFycmF5JiBieXRlQ29tcGFjdGlvbkRhdGEsDQorICAgIGludDMyX3QgbGVuZ3RoLA0KKyAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KSB7DQorICBNb2RlIHN1Yk1vZGUgPSBBTFBIQTsNCisgIE1vZGUgcHJpb3JUb1NoaWZ0TW9kZSA9IEFMUEhBOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQorICAgIGludDMyX3Qgc3ViTW9kZUNoID0gdGV4dENvbXBhY3Rpb25EYXRhW2ldOw0KKyAgICBGWF9DSEFSIGNoID0gMDsNCisgICAgc3dpdGNoIChzdWJNb2RlKSB7DQorICAgICAgY2FzZSBBTFBIQToNCisgICAgICAgIGlmIChzdWJNb2RlQ2ggPCAyNikgew0KKyAgICAgICAgICBjaCA9IChGWF9DSEFSKSgnQScgKyBzdWJNb2RlQ2gpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA9PSAyNikgew0KKyAgICAgICAgICAgIGNoID0gJyAnOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBMTCkgew0KKyAgICAgICAgICAgIHN1Yk1vZGUgPSBMT1dFUjsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gTUwpIHsNCisgICAgICAgICAgICBzdWJNb2RlID0gTUlYRUQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IFBTKSB7DQorICAgICAgICAgICAgcHJpb3JUb1NoaWZ0TW9kZSA9IHN1Yk1vZGU7DQorICAgICAgICAgICAgc3ViTW9kZSA9IFBVTkNUX1NISUZUOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFKSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKWJ5dGVDb21wYWN0aW9uRGF0YVtpXTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCisgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgTE9XRVI6DQorICAgICAgICBpZiAoc3ViTW9kZUNoIDwgMjYpIHsNCisgICAgICAgICAgY2ggPSAoRlhfQ0hBUikoJ2EnICsgc3ViTW9kZUNoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPT0gMjYpIHsNCisgICAgICAgICAgICBjaCA9ICcgJzsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gQVMpIHsNCisgICAgICAgICAgICBwcmlvclRvU2hpZnRNb2RlID0gc3ViTW9kZTsNCisgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEFfU0hJRlQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IE1MKSB7DQorICAgICAgICAgICAgc3ViTW9kZSA9IE1JWEVEOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBQUykgew0KKyAgICAgICAgICAgIHByaW9yVG9TaGlmdE1vZGUgPSBzdWJNb2RlOw0KKyAgICAgICAgICAgIHN1Yk1vZGUgPSBQVU5DVF9TSElGVDsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gTU9ERV9TSElGVF9UT19CWVRFX0NPTVBBQ1RJT05fTU9ERSkgew0KKyAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUilieXRlQ29tcGFjdGlvbkRhdGFbaV07DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIE1JWEVEOg0KKyAgICAgICAgaWYgKHN1Yk1vZGVDaCA8IFBMKSB7DQorICAgICAgICAgIGNoID0gTUlYRURfQ0hBUlNbc3ViTW9kZUNoXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPT0gUEwpIHsNCisgICAgICAgICAgICBzdWJNb2RlID0gUFVOQ1Q7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IDI2KSB7DQorICAgICAgICAgICAgY2ggPSAnICc7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IExMKSB7DQorICAgICAgICAgICAgc3ViTW9kZSA9IExPV0VSOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBBTCkgew0KKyAgICAgICAgICAgIHN1Yk1vZGUgPSBBTFBIQTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gUFMpIHsNCisgICAgICAgICAgICBwcmlvclRvU2hpZnRNb2RlID0gc3ViTW9kZTsNCisgICAgICAgICAgICBzdWJNb2RlID0gUFVOQ1RfU0hJRlQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREUpIHsNCisgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpYnl0ZUNvbXBhY3Rpb25EYXRhW2ldOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICAgICAgICAgIHN1Yk1vZGUgPSBBTFBIQTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBQVU5DVDoNCisgICAgICAgIGlmIChzdWJNb2RlQ2ggPCBQQUwpIHsNCisgICAgICAgICAgY2ggPSBQVU5DVF9DSEFSU1tzdWJNb2RlQ2hdOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA9PSBQQUwpIHsNCisgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREUpIHsNCisgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpYnl0ZUNvbXBhY3Rpb25EYXRhW2ldOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICAgICAgICAgIHN1Yk1vZGUgPSBBTFBIQTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBBTFBIQV9TSElGVDoNCisgICAgICAgIHN1Yk1vZGUgPSBwcmlvclRvU2hpZnRNb2RlOw0KKyAgICAgICAgaWYgKHN1Yk1vZGVDaCA8IDI2KSB7DQorICAgICAgICAgIGNoID0gKEZYX0NIQVIpKCdBJyArIHN1Yk1vZGVDaCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpZiAoc3ViTW9kZUNoID09IDI2KSB7DQorICAgICAgICAgICAgY2ggPSAnICc7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFBVTkNUX1NISUZUOg0KKyAgICAgICAgc3ViTW9kZSA9IHByaW9yVG9TaGlmdE1vZGU7DQorICAgICAgICBpZiAoc3ViTW9kZUNoIDwgUEFMKSB7DQorICAgICAgICAgIGNoID0gUFVOQ1RfQ0hBUlNbc3ViTW9kZUNoXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPT0gUEFMKSB7DQorICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFKSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKWJ5dGVDb21wYWN0aW9uRGF0YVtpXTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCisgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChjaCAhPSAwKSB7DQorICAgICAgcmVzdWx0ICs9IGNoOw0KKyAgICB9DQorICAgIGkrKzsNCisgIH0NCit9DQoraW50MzJfdCBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpieXRlQ29tcGFjdGlvbihpbnQzMl90IG1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KSB7DQorICBpZiAobW9kZSA9PSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICBpbnQzMl90IGNvdW50ID0gMDsNCisgICAgaW50NjRfdCB2YWx1ZSA9IDA7DQorICAgIEZYX1dPUkQqIGRlY29kZWREYXRhID0gRlhfQWxsb2MoRlhfV09SRCwgNiAqIHNpemVvZihGWF9XT1JEKSk7DQorICAgIENGWF9JbnQzMkFycmF5IGJ5dGVDb21wYWN0ZWRDb2Rld29yZHM7DQorICAgIGJ5dGVDb21wYWN0ZWRDb2Rld29yZHMuU2V0U2l6ZSg2KTsNCisgICAgRlhfQk9PTCBlbmQgPSBGQUxTRTsNCisgICAgaW50MzJfdCBuZXh0Q29kZSA9IGNvZGV3b3Jkc1tjb2RlSW5kZXgrK107DQorICAgIHdoaWxlICgoY29kZUluZGV4IDwgY29kZXdvcmRzWzBdKSAmJiAhZW5kKSB7DQorICAgICAgYnl0ZUNvbXBhY3RlZENvZGV3b3Jkc1tjb3VudCsrXSA9IG5leHRDb2RlOw0KKyAgICAgIHZhbHVlID0gOTAwICogdmFsdWUgKyBuZXh0Q29kZTsNCisgICAgICBuZXh0Q29kZSA9IGNvZGV3b3Jkc1tjb2RlSW5kZXgrK107DQorICAgICAgaWYgKG5leHRDb2RlID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgIG5leHRDb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgIG5leHRDb2RlID09IE5VTUVSSUNfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgIG5leHRDb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzYgfHwNCisgICAgICAgICAgbmV4dENvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X0NPTlRST0xfQkxPQ0sgfHwNCisgICAgICAgICAgbmV4dENvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X09QVElPTkFMX0ZJRUxEIHx8DQorICAgICAgICAgIG5leHRDb2RlID09IE1BQ1JPX1BERjQxN19URVJNSU5BVE9SKSB7DQorICAgICAgICBjb2RlSW5kZXgtLTsNCisgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmICgoY291bnQgJSA1ID09IDApICYmIChjb3VudCA+IDApKSB7DQorICAgICAgICAgIGludDMyX3QgaiA9IDA7DQorICAgICAgICAgIGZvciAoOyBqIDwgNjsgKytqKSB7DQorICAgICAgICAgICAgZGVjb2RlZERhdGFbNSAtIGpdID0gKEZYX1dPUkQpKHZhbHVlICUgMjU2KTsNCisgICAgICAgICAgICB2YWx1ZSA+Pj0gODsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjsgKytqKSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKWRlY29kZWREYXRhW2pdOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNvdW50ID0gMDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgRlhfRnJlZShkZWNvZGVkRGF0YSk7DQorICAgIGlmIChjb2RlSW5kZXggPT0gY29kZXdvcmRzWzBdICYmIG5leHRDb2RlIDwgVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCisgICAgICBieXRlQ29tcGFjdGVkQ29kZXdvcmRzW2NvdW50KytdID0gbmV4dENvZGU7DQorICAgIH0NCiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICogbmluZUh1bmRyZWQgKyBCaWdJbnRlZ2VyKGNvZGV3b3Jkc1tpXSk7DQorICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKShGWF9XT1JEKWJ5dGVDb21wYWN0ZWRDb2Rld29yZHNbaV07DQogICAgIH0NCi0gICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0U3RyaW5nKGJpZ0ludGVnZXJUb1N0cmluZyhyZXN1bHQpLmNfc3RyKCkpOw0KLSAgICBpZiAocmVzdWx0U3RyaW5nLkdldEF0KDApICE9ICcxJykgew0KLSAgICAgICAgZSA9ICBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlOw0KLSAgICAgICAgcmV0dXJuICcgJzsNCisgIH0gZWxzZSBpZiAobW9kZSA9PSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSF82KSB7DQorICAgIGludDMyX3QgY291bnQgPSAwOw0KKyAgICBpbnQ2NF90IHZhbHVlID0gMDsNCisgICAgRlhfQk9PTCBlbmQgPSBGQUxTRTsNCisgICAgd2hpbGUgKGNvZGVJbmRleCA8IGNvZGV3b3Jkc1swXSAmJiAhZW5kKSB7DQorICAgICAgaW50MzJfdCBjb2RlID0gY29kZXdvcmRzW2NvZGVJbmRleCsrXTsNCisgICAgICBpZiAoY29kZSA8IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgICBjb3VudCsrOw0KKyAgICAgICAgdmFsdWUgPSA5MDAgKiB2YWx1ZSArIGNvZGU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChjb2RlID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgICAgY29kZSA9PSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCB8fA0KKyAgICAgICAgICAgIGNvZGUgPT0gTlVNRVJJQ19DT01QQUNUSU9OX01PREVfTEFUQ0ggfHwNCisgICAgICAgICAgICBjb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzYgfHwNCisgICAgICAgICAgICBjb2RlID09IEJFR0lOX01BQ1JPX1BERjQxN19DT05UUk9MX0JMT0NLIHx8DQorICAgICAgICAgICAgY29kZSA9PSBCRUdJTl9NQUNST19QREY0MTdfT1BUSU9OQUxfRklFTEQgfHwNCisgICAgICAgICAgICBjb2RlID09IE1BQ1JPX1BERjQxN19URVJNSU5BVE9SKSB7DQorICAgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoKGNvdW50ICUgNSA9PSAwKSAmJiAoY291bnQgPiAwKSkgew0KKyAgICAgICAgRlhfV09SRCogZGVjb2RlZERhdGEgPSBGWF9BbGxvYyhGWF9XT1JELCA2ICogc2l6ZW9mKEZYX1dPUkQpKTsNCisgICAgICAgIGludDMyX3QgaiA9IDA7DQorICAgICAgICBmb3IgKDsgaiA8IDY7ICsraikgew0KKyAgICAgICAgICBkZWNvZGVkRGF0YVs1IC0gal0gPSAoRlhfV09SRCkodmFsdWUgJiAweEZGKTsNCisgICAgICAgICAgdmFsdWUgPj49IDg7DQorICAgICAgICB9DQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjsgKytqKSB7DQorICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUilkZWNvZGVkRGF0YVtqXTsNCisgICAgICAgIH0NCisgICAgICAgIGNvdW50ID0gMDsNCisgICAgICAgIEZYX0ZyZWUoZGVjb2RlZERhdGEpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gcmVzdWx0U3RyaW5nLk1pZCgxLCByZXN1bHRTdHJpbmcuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIH0NCisgIHJldHVybiBjb2RlSW5kZXg7DQorfQ0KK2ludDMyX3QgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6bnVtZXJpY0NvbXBhY3Rpb24oQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgY291bnQgPSAwOw0KKyAgRlhfQk9PTCBlbmQgPSBGQUxTRTsNCisgIENGWF9JbnQzMkFycmF5IG51bWVyaWNDb2Rld29yZHM7DQorICBudW1lcmljQ29kZXdvcmRzLlNldFNpemUoTUFYX05VTUVSSUNfQ09ERVdPUkRTKTsNCisgIHdoaWxlIChjb2RlSW5kZXggPCBjb2Rld29yZHNbMF0gJiYgIWVuZCkgew0KKyAgICBpbnQzMl90IGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KKyAgICBpZiAoY29kZUluZGV4ID09IGNvZGV3b3Jkc1swXSkgew0KKyAgICAgIGVuZCA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKGNvZGUgPCBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICAgIG51bWVyaWNDb2Rld29yZHNbY291bnRdID0gY29kZTsNCisgICAgICBjb3VudCsrOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChjb2RlID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgIGNvZGUgPT0gQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0ggfHwNCisgICAgICAgICAgY29kZSA9PSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSF82IHx8DQorICAgICAgICAgIGNvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X0NPTlRST0xfQkxPQ0sgfHwNCisgICAgICAgICAgY29kZSA9PSBCRUdJTl9NQUNST19QREY0MTdfT1BUSU9OQUxfRklFTEQgfHwNCisgICAgICAgICAgY29kZSA9PSBNQUNST19QREY0MTdfVEVSTUlOQVRPUikgew0KKyAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoY291bnQgJSBNQVhfTlVNRVJJQ19DT0RFV09SRFMgPT0gMCB8fA0KKyAgICAgICAgY29kZSA9PSBOVU1FUklDX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCB8fCBlbmQpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzID0gZGVjb2RlQmFzZTkwMHRvQmFzZTEwKG51bWVyaWNDb2Rld29yZHMsIGNvdW50LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgICAgIHJlc3VsdCArPSBzOw0KKyAgICAgIGNvdW50ID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGNvZGVJbmRleDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6ZGVjb2RlQmFzZTkwMHRvQmFzZTEwKA0KKyAgICBDRlhfSW50MzJBcnJheSYgY29kZXdvcmRzLA0KKyAgICBpbnQzMl90IGNvdW50LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBCaWdJbnRlZ2VyIHJlc3VsdCA9IDA7DQorICBCaWdJbnRlZ2VyIG5pbmVIdW5kcmVkKDkwMCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgIHJlc3VsdCA9IHJlc3VsdCAqIG5pbmVIdW5kcmVkICsgQmlnSW50ZWdlcihjb2Rld29yZHNbaV0pOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0U3RyaW5nKGJpZ0ludGVnZXJUb1N0cmluZyhyZXN1bHQpLmNfc3RyKCkpOw0KKyAgaWYgKHJlc3VsdFN0cmluZy5HZXRBdCgwKSAhPSAnMScpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQorICAgIHJldHVybiAnICc7DQorICB9DQorICByZXR1cm4gcmVzdWx0U3RyaW5nLk1pZCgxLCByZXN1bHRTdHJpbmcuR2V0TGVuZ3RoKCkgLSAxKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgKaW5kZXggMjA4MzFiNC4uZjYwZDNlYiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oCkBAIC04LDQwICs4LDUwIEBACiAjZGVmaW5lIF9CQ19ERUNPREVEQklUU1RSRUFNUEFSU0VSX0hfDQogY2xhc3MgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ7DQogY2xhc3MgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOw0KLWNsYXNzIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXINCi17DQotcHVibGljOg0KLSAgICBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXIoKTsNCi0gICAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KLSAgICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KLSAgICBzdGF0aWMgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIGRlY29kZShDRlhfSW50MzJBcnJheSAmY29kZXdvcmRzLCBDRlhfQnl0ZVN0cmluZyBlY0xldmVsLCBpbnQzMl90ICZlKTsNCitjbGFzcyBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyIHsNCisgcHVibGljOg0KKyAgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcigpOw0KKyAgdmlydHVhbCB+Q0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcigpOw0KKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KKyAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogZGVjb2RlKENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQogDQotcHJpdmF0ZToNCi0gICAgZW51bSBNb2RlIHsNCi0gICAgICAgIEFMUEhBLA0KLSAgICAgICAgTE9XRVIsDQotICAgICAgICBNSVhFRCwNCi0gICAgICAgIFBVTkNULA0KLSAgICAgICAgQUxQSEFfU0hJRlQsDQotICAgICAgICBQVU5DVF9TSElGVA0KLSAgICB9Ow0KLSAgICBzdGF0aWMgaW50MzJfdCBNQVhfTlVNRVJJQ19DT0RFV09SRFM7DQotICAgIHN0YXRpYyBpbnQzMl90IFBMOw0KLSAgICBzdGF0aWMgaW50MzJfdCBMTDsNCi0gICAgc3RhdGljIGludDMyX3QgQVM7DQotICAgIHN0YXRpYyBpbnQzMl90IE1MOw0KLSAgICBzdGF0aWMgaW50MzJfdCBBTDsNCi0gICAgc3RhdGljIGludDMyX3QgUFM7DQotICAgIHN0YXRpYyBpbnQzMl90IFBBTDsNCi0gICAgc3RhdGljIEZYX0NIQVIgUFVOQ1RfQ0hBUlNbMjldOw0KLSAgICBzdGF0aWMgRlhfQ0hBUiBNSVhFRF9DSEFSU1szMF07DQotICAgIHN0YXRpYyBpbnQzMl90IE5VTUJFUl9PRl9TRVFVRU5DRV9DT0RFV09SRFM7DQotICAgIHN0YXRpYyBpbnQzMl90IGRlY29kZU1hY3JvQmxvY2soQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgaW50MzJfdCBjb2RlSW5kZXgsIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSogcmVzdWx0TWV0YWRhdGEsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgaW50MzJfdCB0ZXh0Q29tcGFjdGlvbihDRlhfSW50MzJBcnJheSAmY29kZXdvcmRzLCBpbnQzMl90IGNvZGVJbmRleCwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCk7DQotICAgIHN0YXRpYyB2b2lkIGRlY29kZVRleHRDb21wYWN0aW9uKENGWF9JbnQzMkFycmF5ICZ0ZXh0Q29tcGFjdGlvbkRhdGEsIENGWF9JbnQzMkFycmF5ICZieXRlQ29tcGFjdGlvbkRhdGEsIGludDMyX3QgbGVuZ3RoLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0KTsNCi0gICAgc3RhdGljIGludDMyX3QgYnl0ZUNvbXBhY3Rpb24oaW50MzJfdCBtb2RlLCBDRlhfSW50MzJBcnJheSAmY29kZXdvcmRzLCBpbnQzMl90IGNvZGVJbmRleCwgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCk7DQotICAgIHN0YXRpYyBpbnQzMl90IG51bWVyaWNDb21wYWN0aW9uKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIGludDMyX3QgY29kZUluZGV4LCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIENGWF9CeXRlU3RyaW5nIGRlY29kZUJhc2U5MDB0b0Jhc2UxMChDRlhfSW50MzJBcnJheSAmY29kZXdvcmRzLCBpbnQzMl90IGNvdW50LCBpbnQzMl90ICZlKTsNCisgcHJpdmF0ZToNCisgIGVudW0gTW9kZSB7IEFMUEhBLCBMT1dFUiwgTUlYRUQsIFBVTkNULCBBTFBIQV9TSElGVCwgUFVOQ1RfU0hJRlQgfTsNCisgIHN0YXRpYyBpbnQzMl90IE1BWF9OVU1FUklDX0NPREVXT1JEUzsNCisgIHN0YXRpYyBpbnQzMl90IFBMOw0KKyAgc3RhdGljIGludDMyX3QgTEw7DQorICBzdGF0aWMgaW50MzJfdCBBUzsNCisgIHN0YXRpYyBpbnQzMl90IE1MOw0KKyAgc3RhdGljIGludDMyX3QgQUw7DQorICBzdGF0aWMgaW50MzJfdCBQUzsNCisgIHN0YXRpYyBpbnQzMl90IFBBTDsNCisgIHN0YXRpYyBGWF9DSEFSIFBVTkNUX0NIQVJTWzI5XTsNCisgIHN0YXRpYyBGWF9DSEFSIE1JWEVEX0NIQVJTWzMwXTsNCisgIHN0YXRpYyBpbnQzMl90IE5VTUJFUl9PRl9TRVFVRU5DRV9DT0RFV09SRFM7DQorICBzdGF0aWMgaW50MzJfdCBkZWNvZGVNYWNyb0Jsb2NrKENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEqIHJlc3VsdE1ldGFkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBpbnQzMl90IHRleHRDb21wYWN0aW9uKENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQpOw0KKyAgc3RhdGljIHZvaWQgZGVjb2RlVGV4dENvbXBhY3Rpb24oQ0ZYX0ludDMyQXJyYXkmIHRleHRDb21wYWN0aW9uRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBieXRlQ29tcGFjdGlvbkRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQpOw0KKyAgc3RhdGljIGludDMyX3QgYnl0ZUNvbXBhY3Rpb24oaW50MzJfdCBtb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCk7DQorICBzdGF0aWMgaW50MzJfdCBudW1lcmljQ29tcGFjdGlvbihDRlhfSW50MzJBcnJheSYgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgZGVjb2RlQmFzZTkwMHRvQmFzZTEwKENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmNwcAppbmRleCBjNDk2Njk0Li40N2I2Nzk0IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmNwcApAQCAtMjksMjU1ICsyOSwzMTAgQEAKICNpbmNsdWRlICJCQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4uaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmgiDQogaW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpBREpVU1RfUk9XX05VTUJFUl9TS0lQID0gMjsNCi1DQkNfRGV0ZWN0aW9uUmVzdWx0OjpDQkNfRGV0ZWN0aW9uUmVzdWx0KENCQ19CYXJjb2RlTWV0YWRhdGEqIGJhcmNvZGVNZXRhZGF0YSwgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCkNCi17DQotICAgIG1fYmFyY29kZU1ldGFkYXRhID0gYmFyY29kZU1ldGFkYXRhOw0KLSAgICBtX2JhcmNvZGVDb2x1bW5Db3VudCA9IGJhcmNvZGVNZXRhZGF0YS0+Z2V0Q29sdW1uQ291bnQoKTsNCi0gICAgbV9ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94Ow0KLSAgICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnMuU2V0U2l6ZShtX2JhcmNvZGVDb2x1bW5Db3VudCArIDIpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2JhcmNvZGVDb2x1bW5Db3VudCArIDI7IGkrKykgew0KLSAgICAgICAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2ldID0gTlVMTDsNCitDQkNfRGV0ZWN0aW9uUmVzdWx0OjpDQkNfRGV0ZWN0aW9uUmVzdWx0KENCQ19CYXJjb2RlTWV0YWRhdGEqIGJhcmNvZGVNZXRhZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpIHsNCisgIG1fYmFyY29kZU1ldGFkYXRhID0gYmFyY29kZU1ldGFkYXRhOw0KKyAgbV9iYXJjb2RlQ29sdW1uQ291bnQgPSBiYXJjb2RlTWV0YWRhdGEtPmdldENvbHVtbkNvdW50KCk7DQorICBtX2JvdW5kaW5nQm94ID0gYm91bmRpbmdCb3g7DQorICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnMuU2V0U2l6ZShtX2JhcmNvZGVDb2x1bW5Db3VudCArIDIpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAyOyBpKyspIHsNCisgICAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2ldID0gTlVMTDsNCisgIH0NCit9DQorQ0JDX0RldGVjdGlvblJlc3VsdDo6fkNCQ19EZXRlY3Rpb25SZXN1bHQoKSB7DQorICBkZWxldGUgbV9ib3VuZGluZ0JveDsNCisgIGRlbGV0ZSBtX2JhcmNvZGVNZXRhZGF0YTsNCisgIG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5SZW1vdmVBbGwoKTsNCit9DQorQ0ZYX1B0ckFycmF5JiBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpnZXREZXRlY3Rpb25SZXN1bHRDb2x1bW5zKCkgew0KKyAgYWRqdXN0SW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycygNCisgICAgICAoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zLkdldEF0KDApKTsNCisgIGFkanVzdEluZGljYXRvckNvbHVtblJvd051bWJlcnMoDQorICAgICAgKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5HZXRBdCgNCisgICAgICAgICAgbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxKSk7DQorICBpbnQzMl90IHVuYWRqdXN0ZWRDb2Rld29yZENvdW50ID0gQ0JDX1BERjQxN0NvbW1vbjo6TUFYX0NPREVXT1JEU19JTl9CQVJDT0RFOw0KKyAgaW50MzJfdCBwcmV2aW91c1VuYWRqdXN0ZWRDb3VudDsNCisgIGRvIHsNCisgICAgcHJldmlvdXNVbmFkanVzdGVkQ291bnQgPSB1bmFkanVzdGVkQ29kZXdvcmRDb3VudDsNCisgICAgdW5hZGp1c3RlZENvZGV3b3JkQ291bnQgPSBhZGp1c3RSb3dOdW1iZXJzKCk7DQorICB9IHdoaWxlICh1bmFkanVzdGVkQ29kZXdvcmRDb3VudCA+IDAgJiYNCisgICAgICAgICAgIHVuYWRqdXN0ZWRDb2Rld29yZENvdW50IDwgcHJldmlvdXNVbmFkanVzdGVkQ291bnQpOw0KKyAgcmV0dXJuIG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uczsNCit9DQordm9pZCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpzZXRCb3VuZGluZ0JveChDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94KSB7DQorICBtX2JvdW5kaW5nQm94ID0gYm91bmRpbmdCb3g7DQorfQ0KK0NCQ19Cb3VuZGluZ0JveCogQ0JDX0RldGVjdGlvblJlc3VsdDo6Z2V0Qm91bmRpbmdCb3goKSB7DQorICByZXR1cm4gbV9ib3VuZGluZ0JveDsNCit9DQordm9pZCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpzZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oDQorICAgIGludDMyX3QgYmFyY29kZUNvbHVtbiwNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiogZGV0ZWN0aW9uUmVzdWx0Q29sdW1uKSB7DQorICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0gPSBkZXRlY3Rpb25SZXN1bHRDb2x1bW47DQorfQ0KK0NCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmdldERldGVjdGlvblJlc3VsdENvbHVtbigNCisgICAgaW50MzJfdCBiYXJjb2RlQ29sdW1uKSB7DQorICByZXR1cm4gKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1tiYXJjb2RlQ29sdW1uXTsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX0RldGVjdGlvblJlc3VsdDo6dG9TdHJpbmcoKSB7DQorICBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiByb3dJbmRpY2F0b3JDb2x1bW4gPQ0KKyAgICAgIChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbMF07DQorICBpZiAocm93SW5kaWNhdG9yQ29sdW1uID09IE5VTEwpIHsNCisgICAgcm93SW5kaWNhdG9yQ29sdW1uID0gKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKQ0KKyAgICAgICAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW21fYmFyY29kZUNvbHVtbkNvdW50ICsgMV07DQorICB9DQorICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICBmb3IgKGludDMyX3QgY29kZXdvcmRzUm93ID0gMDsNCisgICAgICAgY29kZXdvcmRzUm93IDwgcm93SW5kaWNhdG9yQ29sdW1uLT5nZXRDb2Rld29yZHMoKS0+R2V0U2l6ZSgpOw0KKyAgICAgICBjb2Rld29yZHNSb3crKykgew0KKyAgICByZXN1bHQgKz0gKEZYX0NIQVIpY29kZXdvcmRzUm93Ow0KKyAgICBmb3IgKGludDMyX3QgYmFyY29kZUNvbHVtbiA9IDA7IGJhcmNvZGVDb2x1bW4gPCBtX2JhcmNvZGVDb2x1bW5Db3VudCArIDI7DQorICAgICAgICAgYmFyY29kZUNvbHVtbisrKSB7DQorICAgICAgaWYgKG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1tiYXJjb2RlQ29sdW1uXSA9PSBOVUxMKSB7DQorICAgICAgICByZXN1bHQgKz0gIiAgICB8ICAgIjsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0NCisgICAgICAgICAgKENCQ19Db2Rld29yZCopKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0pDQorICAgICAgICAgICAgICAtPmdldENvZGV3b3JkcygpDQorICAgICAgICAgICAgICAtPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQorICAgICAgaWYgKGNvZGV3b3JkID09IE5VTEwpIHsNCisgICAgICAgIHJlc3VsdCArPSAiICAgIHwgICAiOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIHJlc3VsdCArPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCk7DQorICAgICAgcmVzdWx0ICs9IGNvZGV3b3JkLT5nZXRWYWx1ZSgpOw0KICAgICB9DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KIH0NCi1DQkNfRGV0ZWN0aW9uUmVzdWx0Ojp+Q0JDX0RldGVjdGlvblJlc3VsdCgpDQotew0KLSAgICBkZWxldGUgbV9ib3VuZGluZ0JveDsNCi0gICAgZGVsZXRlIG1fYmFyY29kZU1ldGFkYXRhOw0KLSAgICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnMuUmVtb3ZlQWxsKCk7DQordm9pZCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjphZGp1c3RJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKA0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBkZXRlY3Rpb25SZXN1bHRDb2x1bW4pIHsNCisgIGlmIChkZXRlY3Rpb25SZXN1bHRDb2x1bW4gIT0gTlVMTCkgew0KKyAgICAoKENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qKWRldGVjdGlvblJlc3VsdENvbHVtbikNCisgICAgICAgIC0+YWRqdXN0Q29tcGxldGVJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKCptX2JhcmNvZGVNZXRhZGF0YSk7DQorICB9DQogfQ0KLUNGWF9QdHJBcnJheSYgQ0JDX0RldGVjdGlvblJlc3VsdDo6Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1ucygpDQotew0KLSAgICBhZGp1c3RJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnMuR2V0QXQoMCkpOw0KLSAgICBhZGp1c3RJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnMuR2V0QXQobV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxKSk7DQotICAgIGludDMyX3QgdW5hZGp1c3RlZENvZGV3b3JkQ291bnQgPSBDQkNfUERGNDE3Q29tbW9uOjpNQVhfQ09ERVdPUkRTX0lOX0JBUkNPREU7DQotICAgIGludDMyX3QgcHJldmlvdXNVbmFkanVzdGVkQ291bnQ7DQotICAgIGRvIHsNCi0gICAgICAgIHByZXZpb3VzVW5hZGp1c3RlZENvdW50ID0gdW5hZGp1c3RlZENvZGV3b3JkQ291bnQ7DQotICAgICAgICB1bmFkanVzdGVkQ29kZXdvcmRDb3VudCA9IGFkanVzdFJvd051bWJlcnMoKTsNCi0gICAgfSB3aGlsZSAodW5hZGp1c3RlZENvZGV3b3JkQ291bnQgPiAwICYmIHVuYWRqdXN0ZWRDb2Rld29yZENvdW50IDwgcHJldmlvdXNVbmFkanVzdGVkQ291bnQpOw0KLSAgICByZXR1cm4gbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zOw0KLX0NCi12b2lkIENCQ19EZXRlY3Rpb25SZXN1bHQ6OnNldEJvdW5kaW5nQm94KENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpDQotew0KLSAgICBtX2JvdW5kaW5nQm94ID0gYm91bmRpbmdCb3g7DQotfQ0KLUNCQ19Cb3VuZGluZ0JveCogQ0JDX0RldGVjdGlvblJlc3VsdDo6Z2V0Qm91bmRpbmdCb3goKQ0KLXsNCi0gICAgcmV0dXJuIG1fYm91bmRpbmdCb3g7DQotfQ0KLXZvaWQgQ0JDX0RldGVjdGlvblJlc3VsdDo6c2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGludDMyX3QgYmFyY29kZUNvbHVtbiwgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiogZGV0ZWN0aW9uUmVzdWx0Q29sdW1uKQ0KLXsNCi0gICAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dID0gZGV0ZWN0aW9uUmVzdWx0Q29sdW1uOw0KLX0NCi1DQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpnZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oaW50MzJfdCBiYXJjb2RlQ29sdW1uKQ0KLXsNCi0gICAgcmV0dXJuIChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl07DQotfQ0KLUNGWF9CeXRlU3RyaW5nIENCQ19EZXRlY3Rpb25SZXN1bHQ6OnRvU3RyaW5nKCkNCi17DQotICAgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qIHJvd0luZGljYXRvckNvbHVtbiA9IChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbMF07DQotICAgIGlmIChyb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTCkgew0KLSAgICAgICAgcm93SW5kaWNhdG9yQ29sdW1uID0gKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1ttX2JhcmNvZGVDb2x1bW5Db3VudCArIDFdOw0KLSAgICB9DQotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCi0gICAgZm9yIChpbnQzMl90IGNvZGV3b3Jkc1JvdyA9IDA7IGNvZGV3b3Jkc1JvdyA8IHJvd0luZGljYXRvckNvbHVtbi0+Z2V0Q29kZXdvcmRzKCktPkdldFNpemUoKTsgY29kZXdvcmRzUm93KyspIHsNCi0gICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikgY29kZXdvcmRzUm93Ow0KLSAgICAgICAgZm9yIChpbnQzMl90IGJhcmNvZGVDb2x1bW4gPSAwOyBiYXJjb2RlQ29sdW1uIDwgbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAyOyBiYXJjb2RlQ29sdW1uKyspIHsNCi0gICAgICAgICAgICBpZiAobV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgICAgfCAgICI7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0pLT5nZXRDb2Rld29yZHMoKS0+R2V0QXQoY29kZXdvcmRzUm93KTsNCi0gICAgICAgICAgICBpZiAoY29kZXdvcmQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiAgICB8ICAgIjsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdCArPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCk7DQotICAgICAgICAgICAgcmVzdWx0ICs9IGNvZGV3b3JkLT5nZXRWYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiByZXN1bHQ7DQotfQ0KLXZvaWQgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0SW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycyhDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBkZXRlY3Rpb25SZXN1bHRDb2x1bW4pDQotew0KLSAgICBpZiAoZGV0ZWN0aW9uUmVzdWx0Q29sdW1uICE9IE5VTEwpIHsNCi0gICAgICAgICgoQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiopZGV0ZWN0aW9uUmVzdWx0Q29sdW1uKS0+YWRqdXN0Q29tcGxldGVJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKCptX2JhcmNvZGVNZXRhZGF0YSk7DQotICAgIH0NCi19DQotaW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjphZGp1c3RSb3dOdW1iZXJzKCkNCi17DQotICAgIGludDMyX3QgdW5hZGp1c3RlZENvdW50ID0gYWRqdXN0Um93TnVtYmVyc0J5Um93KCk7DQotICAgIGlmICh1bmFkanVzdGVkQ291bnQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IGJhcmNvZGVDb2x1bW4gPSAxOyBiYXJjb2RlQ29sdW1uIDwgbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxOyBiYXJjb2RlQ29sdW1uKyspIHsNCi0gICAgICAgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0gKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0pLT5nZXRDb2Rld29yZHMoKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBjb2Rld29yZHNSb3cgPSAwOyBjb2Rld29yZHNSb3cgPCBjb2Rld29yZHMtPkdldFNpemUoKTsgY29kZXdvcmRzUm93KyspIHsNCi0gICAgICAgICAgICBpZiAoY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghKChDQkNfQ29kZXdvcmQqKWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSktPmhhc1ZhbGlkUm93TnVtYmVyKCkpIHsNCi0gICAgICAgICAgICAgICAgYWRqdXN0Um93TnVtYmVycyhiYXJjb2RlQ29sdW1uLCBjb2Rld29yZHNSb3csIGNvZGV3b3Jkcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiB1bmFkanVzdGVkQ291bnQ7DQotfQ0KLWludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0Um93TnVtYmVyc0J5Um93KCkNCi17DQotICAgIGFkanVzdFJvd051bWJlcnNGcm9tQm90aFJJKCk7DQotICAgIGludDMyX3QgdW5hZGp1c3RlZENvdW50ID0gYWRqdXN0Um93TnVtYmVyc0Zyb21MUkkoKTsNCi0gICAgcmV0dXJuIHVuYWRqdXN0ZWRDb3VudCArIGFkanVzdFJvd051bWJlcnNGcm9tUlJJKCk7DQotfQ0KLWludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0Um93TnVtYmVyc0Zyb21Cb3RoUkkoKQ0KLXsNCi0gICAgaWYgKG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1swXSA9PSBOVUxMIHx8IG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1ttX2JhcmNvZGVDb2x1bW5Db3VudCArIDFdID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIENGWF9QdHJBcnJheSogTFJJY29kZXdvcmRzID0gKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbMF0pLT5nZXRDb2Rld29yZHMoKTsNCi0gICAgQ0ZYX1B0ckFycmF5KiBSUkljb2Rld29yZHMgPSAoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1ttX2JhcmNvZGVDb2x1bW5Db3VudCArIDFdKS0+Z2V0Q29kZXdvcmRzKCk7DQotICAgIGZvciAoaW50MzJfdCBjb2Rld29yZHNSb3cgPSAwOyBjb2Rld29yZHNSb3cgPCBMUkljb2Rld29yZHMtPkdldFNpemUoKTsgY29kZXdvcmRzUm93KyspIHsNCi0gICAgICAgIGlmIChMUkljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykgIT0gTlVMTCAmJg0KLSAgICAgICAgICAgICAgICBSUkljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykgIT0gTlVMTCAmJg0KLSAgICAgICAgICAgICAgICAoKENCQ19Db2Rld29yZCopTFJJY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpKS0+Z2V0Um93TnVtYmVyKCkgPT0gKChDQkNfQ29kZXdvcmQqKVJSSWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSktPmdldFJvd051bWJlcigpKSB7DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGJhcmNvZGVDb2x1bW4gPSAxOyBiYXJjb2RlQ29sdW1uIDw9IG1fYmFyY29kZUNvbHVtbkNvdW50OyBiYXJjb2RlQ29sdW1uKyspIHsNCi0gICAgICAgICAgICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKSgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dKS0+Z2V0Q29kZXdvcmRzKCktPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQotICAgICAgICAgICAgICAgIGlmIChjb2Rld29yZCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjb2Rld29yZC0+c2V0Um93TnVtYmVyKCgoQ0JDX0NvZGV3b3JkKilMUkljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpLT5nZXRSb3dOdW1iZXIoKSk7DQotICAgICAgICAgICAgICAgIGlmICghY29kZXdvcmQtPmhhc1ZhbGlkUm93TnVtYmVyKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dKS0+Z2V0Q29kZXdvcmRzKCktPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCitpbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcnMoKSB7DQorICBpbnQzMl90IHVuYWRqdXN0ZWRDb3VudCA9IGFkanVzdFJvd051bWJlcnNCeVJvdygpOw0KKyAgaWYgKHVuYWRqdXN0ZWRDb3VudCA9PSAwKSB7DQogICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGJhcmNvZGVDb2x1bW4gPSAxOyBiYXJjb2RlQ29sdW1uIDwgbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxOw0KKyAgICAgICBiYXJjb2RlQ29sdW1uKyspIHsNCisgICAgQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMgPQ0KKyAgICAgICAgKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0pDQorICAgICAgICAgICAgLT5nZXRDb2Rld29yZHMoKTsNCisgICAgZm9yIChpbnQzMl90IGNvZGV3b3Jkc1JvdyA9IDA7IGNvZGV3b3Jkc1JvdyA8IGNvZGV3b3Jkcy0+R2V0U2l6ZSgpOw0KKyAgICAgICAgIGNvZGV3b3Jkc1JvdysrKSB7DQorICAgICAgaWYgKGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSA9PSBOVUxMKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKCEoKENCQ19Db2Rld29yZCopY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpKQ0KKyAgICAgICAgICAgICAgIC0+aGFzVmFsaWRSb3dOdW1iZXIoKSkgew0KKyAgICAgICAgYWRqdXN0Um93TnVtYmVycyhiYXJjb2RlQ29sdW1uLCBjb2Rld29yZHNSb3csIGNvZGV3b3Jkcyk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gdW5hZGp1c3RlZENvdW50Ow0KIH0NCi1pbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcnNGcm9tUlJJKCkNCi17DQotICAgIGlmIChtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxXSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHVuYWRqdXN0ZWRDb3VudCA9IDA7DQotICAgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0gKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKikgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zLkdldEF0KG1fYmFyY29kZUNvbHVtbkNvdW50ICsgMSkpLT5nZXRDb2Rld29yZHMoKTsNCi0gICAgZm9yIChpbnQzMl90IGNvZGV3b3Jkc1JvdyA9IDA7IGNvZGV3b3Jkc1JvdyA8IGNvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBjb2Rld29yZHNSb3crKykgew0KLSAgICAgICAgaWYgKGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IHJvd0luZGljYXRvclJvd051bWJlciA9ICgoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpLT5nZXRSb3dOdW1iZXIoKTsNCi0gICAgICAgIGludDMyX3QgaW52YWxpZFJvd0NvdW50cyA9IDA7DQotICAgICAgICBmb3IgKGludDMyX3QgYmFyY29kZUNvbHVtbiA9IG1fYmFyY29kZUNvbHVtbkNvdW50ICsgMTsgYmFyY29kZUNvbHVtbiA+IDAgJiYgaW52YWxpZFJvd0NvdW50cyA8IEFESlVTVF9ST1dfTlVNQkVSX1NLSVA7IGJhcmNvZGVDb2x1bW4tLSkgew0KLSAgICAgICAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKikoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5HZXRBdChiYXJjb2RlQ29sdW1uKSktPmdldENvZGV3b3JkcygpLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KLSAgICAgICAgICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGludmFsaWRSb3dDb3VudHMgPSBhZGp1c3RSb3dOdW1iZXJJZlZhbGlkKHJvd0luZGljYXRvclJvd051bWJlciwgaW52YWxpZFJvd0NvdW50cywgY29kZXdvcmQpOw0KLSAgICAgICAgICAgICAgICBpZiAoIWNvZGV3b3JkLT5oYXNWYWxpZFJvd051bWJlcigpKSB7DQotICAgICAgICAgICAgICAgICAgICB1bmFkanVzdGVkQ291bnQrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gdW5hZGp1c3RlZENvdW50Ow0KK2ludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0Um93TnVtYmVyc0J5Um93KCkgew0KKyAgYWRqdXN0Um93TnVtYmVyc0Zyb21Cb3RoUkkoKTsNCisgIGludDMyX3QgdW5hZGp1c3RlZENvdW50ID0gYWRqdXN0Um93TnVtYmVyc0Zyb21MUkkoKTsNCisgIHJldHVybiB1bmFkanVzdGVkQ291bnQgKyBhZGp1c3RSb3dOdW1iZXJzRnJvbVJSSSgpOw0KIH0NCi1pbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcnNGcm9tTFJJKCkNCi17DQotICAgIGlmIChtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbMF0gPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaW50MzJfdCB1bmFkanVzdGVkQ291bnQgPSAwOw0KLSAgICBDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcyA9ICgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zLkdldEF0KDApKS0+Z2V0Q29kZXdvcmRzKCk7DQotICAgIGZvciAoaW50MzJfdCBjb2Rld29yZHNSb3cgPSAwOyBjb2Rld29yZHNSb3cgPCBjb2Rld29yZHMtPkdldFNpemUoKTsgY29kZXdvcmRzUm93KyspIHsNCi0gICAgICAgIGlmIChjb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KK2ludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0Um93TnVtYmVyc0Zyb21Cb3RoUkkoKSB7DQorICBpZiAobV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zWzBdID09IE5VTEwgfHwNCisgICAgICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxXSA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiBMUkljb2Rld29yZHMgPQ0KKyAgICAgICgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zWzBdKS0+Z2V0Q29kZXdvcmRzKCk7DQorICBDRlhfUHRyQXJyYXkqIFJSSWNvZGV3b3JkcyA9DQorICAgICAgKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKikNCisgICAgICAgICAgIG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1ttX2JhcmNvZGVDb2x1bW5Db3VudCArIDFdKQ0KKyAgICAgICAgICAtPmdldENvZGV3b3JkcygpOw0KKyAgZm9yIChpbnQzMl90IGNvZGV3b3Jkc1JvdyA9IDA7IGNvZGV3b3Jkc1JvdyA8IExSSWNvZGV3b3Jkcy0+R2V0U2l6ZSgpOw0KKyAgICAgICBjb2Rld29yZHNSb3crKykgew0KKyAgICBpZiAoTFJJY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpICE9IE5VTEwgJiYNCisgICAgICAgIFJSSWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSAhPSBOVUxMICYmDQorICAgICAgICAoKENCQ19Db2Rld29yZCopTFJJY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpKS0+Z2V0Um93TnVtYmVyKCkgPT0NCisgICAgICAgICAgICAoKENCQ19Db2Rld29yZCopUlJJY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpKQ0KKyAgICAgICAgICAgICAgICAtPmdldFJvd051bWJlcigpKSB7DQorICAgICAgZm9yIChpbnQzMl90IGJhcmNvZGVDb2x1bW4gPSAxOyBiYXJjb2RlQ29sdW1uIDw9IG1fYmFyY29kZUNvbHVtbkNvdW50Ow0KKyAgICAgICAgICAgYmFyY29kZUNvbHVtbisrKSB7DQorICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0NCisgICAgICAgICAgICAoQ0JDX0NvZGV3b3JkKikoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dKQ0KKyAgICAgICAgICAgICAgICAtPmdldENvZGV3b3JkcygpDQorICAgICAgICAgICAgICAgIC0+R2V0QXQoY29kZXdvcmRzUm93KTsNCisgICAgICAgIGlmIChjb2Rld29yZCA9PSBOVUxMKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCByb3dJbmRpY2F0b3JSb3dOdW1iZXIgPSAoKENCQ19Db2Rld29yZCopY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpKS0+Z2V0Um93TnVtYmVyKCk7DQotICAgICAgICBpbnQzMl90IGludmFsaWRSb3dDb3VudHMgPSAwOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGJhcmNvZGVDb2x1bW4gPSAxOyBiYXJjb2RlQ29sdW1uIDwgbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxICYmIGludmFsaWRSb3dDb3VudHMgPCBBREpVU1RfUk9XX05VTUJFUl9TS0lQOyBiYXJjb2RlQ29sdW1uKyspIHsNCi0gICAgICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0pLT5nZXRDb2Rld29yZHMoKS0+R2V0QXQoY29kZXdvcmRzUm93KTsNCi0gICAgICAgICAgICBpZiAoY29kZXdvcmQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBpbnZhbGlkUm93Q291bnRzID0gYWRqdXN0Um93TnVtYmVySWZWYWxpZChyb3dJbmRpY2F0b3JSb3dOdW1iZXIsIGludmFsaWRSb3dDb3VudHMsIGNvZGV3b3JkKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFjb2Rld29yZC0+aGFzVmFsaWRSb3dOdW1iZXIoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdW5hZGp1c3RlZENvdW50Kys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQorICAgICAgICBjb2Rld29yZC0+c2V0Um93TnVtYmVyKA0KKyAgICAgICAgICAgICgoQ0JDX0NvZGV3b3JkKilMUkljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpLT5nZXRSb3dOdW1iZXIoKSk7DQorICAgICAgICBpZiAoIWNvZGV3b3JkLT5oYXNWYWxpZFJvd051bWJlcigpKSB7DQorICAgICAgICAgICgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dKQ0KKyAgICAgICAgICAgICAgLT5nZXRDb2Rld29yZHMoKQ0KKyAgICAgICAgICAgICAgLT5TZXRBdChjb2Rld29yZHNSb3csIE5VTEwpOw0KICAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gdW5hZGp1c3RlZENvdW50Ow0KKyAgfQ0KKyAgcmV0dXJuIDA7DQogfQ0KLWludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0Um93TnVtYmVySWZWYWxpZChpbnQzMl90IHJvd0luZGljYXRvclJvd051bWJlciwgaW50MzJfdCBpbnZhbGlkUm93Q291bnRzLCBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkKQ0KLXsNCi0gICAgaWYgKGNvZGV3b3JkID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBpbnZhbGlkUm93Q291bnRzOw0KK2ludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0Um93TnVtYmVyc0Zyb21SUkkoKSB7DQorICBpZiAobV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW21fYmFyY29kZUNvbHVtbkNvdW50ICsgMV0gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgdW5hZGp1c3RlZENvdW50ID0gMDsNCisgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0NCisgICAgICAoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5HZXRBdCgNCisgICAgICAgICAgIG1fYmFyY29kZUNvbHVtbkNvdW50ICsgMSkpDQorICAgICAgICAgIC0+Z2V0Q29kZXdvcmRzKCk7DQorICBmb3IgKGludDMyX3QgY29kZXdvcmRzUm93ID0gMDsgY29kZXdvcmRzUm93IDwgY29kZXdvcmRzLT5HZXRTaXplKCk7DQorICAgICAgIGNvZGV3b3Jkc1JvdysrKSB7DQorICAgIGlmIChjb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykgPT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIGlmICghY29kZXdvcmQtPmhhc1ZhbGlkUm93TnVtYmVyKCkpIHsNCi0gICAgICAgIGlmIChjb2Rld29yZC0+aXNWYWxpZFJvd051bWJlcihyb3dJbmRpY2F0b3JSb3dOdW1iZXIpKSB7DQotICAgICAgICAgICAgY29kZXdvcmQtPnNldFJvd051bWJlcihyb3dJbmRpY2F0b3JSb3dOdW1iZXIpOw0KLSAgICAgICAgICAgIGludmFsaWRSb3dDb3VudHMgPSAwOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICArK2ludmFsaWRSb3dDb3VudHM7DQorICAgIGludDMyX3Qgcm93SW5kaWNhdG9yUm93TnVtYmVyID0NCisgICAgICAgICgoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgaW50MzJfdCBpbnZhbGlkUm93Q291bnRzID0gMDsNCisgICAgZm9yIChpbnQzMl90IGJhcmNvZGVDb2x1bW4gPSBtX2JhcmNvZGVDb2x1bW5Db3VudCArIDE7DQorICAgICAgICAgYmFyY29kZUNvbHVtbiA+IDAgJiYgaW52YWxpZFJvd0NvdW50cyA8IEFESlVTVF9ST1dfTlVNQkVSX1NLSVA7DQorICAgICAgICAgYmFyY29kZUNvbHVtbi0tKSB7DQorICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9DQorICAgICAgICAgIChDQkNfQ29kZXdvcmQqKSgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zLkdldEF0KGJhcmNvZGVDb2x1bW4pKQ0KKyAgICAgICAgICAgICAgLT5nZXRDb2Rld29yZHMoKQ0KKyAgICAgICAgICAgICAgLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KKyAgICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgICAgICBpbnZhbGlkUm93Q291bnRzID0gYWRqdXN0Um93TnVtYmVySWZWYWxpZChyb3dJbmRpY2F0b3JSb3dOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUm93Q291bnRzLCBjb2Rld29yZCk7DQorICAgICAgICBpZiAoIWNvZGV3b3JkLT5oYXNWYWxpZFJvd051bWJlcigpKSB7DQorICAgICAgICAgIHVuYWRqdXN0ZWRDb3VudCsrOw0KICAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHVuYWRqdXN0ZWRDb3VudDsNCit9DQoraW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjphZGp1c3RSb3dOdW1iZXJzRnJvbUxSSSgpIHsNCisgIGlmIChtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbMF0gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgdW5hZGp1c3RlZENvdW50ID0gMDsNCisgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0NCisgICAgICAoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5HZXRBdCgwKSkNCisgICAgICAgICAgLT5nZXRDb2Rld29yZHMoKTsNCisgIGZvciAoaW50MzJfdCBjb2Rld29yZHNSb3cgPSAwOyBjb2Rld29yZHNSb3cgPCBjb2Rld29yZHMtPkdldFNpemUoKTsNCisgICAgICAgY29kZXdvcmRzUm93KyspIHsNCisgICAgaWYgKGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSA9PSBOVUxMKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaW50MzJfdCByb3dJbmRpY2F0b3JSb3dOdW1iZXIgPQ0KKyAgICAgICAgKChDQkNfQ29kZXdvcmQqKWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSktPmdldFJvd051bWJlcigpOw0KKyAgICBpbnQzMl90IGludmFsaWRSb3dDb3VudHMgPSAwOw0KKyAgICBmb3IgKGludDMyX3QgYmFyY29kZUNvbHVtbiA9IDE7IGJhcmNvZGVDb2x1bW4gPCBtX2JhcmNvZGVDb2x1bW5Db3VudCArIDEgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUm93Q291bnRzIDwgQURKVVNUX1JPV19OVU1CRVJfU0tJUDsNCisgICAgICAgICBiYXJjb2RlQ29sdW1uKyspIHsNCisgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0NCisgICAgICAgICAgKENCQ19Db2Rld29yZCopKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0pDQorICAgICAgICAgICAgICAtPmdldENvZGV3b3JkcygpDQorICAgICAgICAgICAgICAtPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQorICAgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICAgIGludmFsaWRSb3dDb3VudHMgPSBhZGp1c3RSb3dOdW1iZXJJZlZhbGlkKHJvd0luZGljYXRvclJvd051bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRSb3dDb3VudHMsIGNvZGV3b3JkKTsNCisgICAgICAgIGlmICghY29kZXdvcmQtPmhhc1ZhbGlkUm93TnVtYmVyKCkpIHsNCisgICAgICAgICAgdW5hZGp1c3RlZENvdW50Kys7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gdW5hZGp1c3RlZENvdW50Ow0KK30NCitpbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcklmVmFsaWQoDQorICAgIGludDMyX3Qgcm93SW5kaWNhdG9yUm93TnVtYmVyLA0KKyAgICBpbnQzMl90IGludmFsaWRSb3dDb3VudHMsDQorICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQpIHsNCisgIGlmIChjb2Rld29yZCA9PSBOVUxMKSB7DQogICAgIHJldHVybiBpbnZhbGlkUm93Q291bnRzOw0KKyAgfQ0KKyAgaWYgKCFjb2Rld29yZC0+aGFzVmFsaWRSb3dOdW1iZXIoKSkgew0KKyAgICBpZiAoY29kZXdvcmQtPmlzVmFsaWRSb3dOdW1iZXIocm93SW5kaWNhdG9yUm93TnVtYmVyKSkgew0KKyAgICAgIGNvZGV3b3JkLT5zZXRSb3dOdW1iZXIocm93SW5kaWNhdG9yUm93TnVtYmVyKTsNCisgICAgICBpbnZhbGlkUm93Q291bnRzID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICArK2ludmFsaWRSb3dDb3VudHM7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpbnZhbGlkUm93Q291bnRzOw0KIH0NCi12b2lkIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcnMoaW50MzJfdCBiYXJjb2RlQ29sdW1uLCBpbnQzMl90IGNvZGV3b3Jkc1JvdywgQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMpDQotew0KLSAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KLSAgICBDRlhfUHRyQXJyYXkqIHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzID0gKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnMuR2V0QXQoYmFyY29kZUNvbHVtbiAtIDEpKS0+Z2V0Q29kZXdvcmRzKCk7DQotICAgIENGWF9QdHJBcnJheSogbmV4dENvbHVtbkNvZGV3b3JkcyA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzOw0KLSAgICBpZiAobV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW4gKyAxXSAhPSBOVUxMKSB7DQotICAgICAgICBuZXh0Q29sdW1uQ29kZXdvcmRzID0gKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbiArIDFdKS0+Z2V0Q29kZXdvcmRzKCk7DQordm9pZCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjphZGp1c3RSb3dOdW1iZXJzKGludDMyX3QgYmFyY29kZUNvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2Rld29yZHNSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogY29kZXdvcmRzKSB7DQorICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KKyAgQ0ZYX1B0ckFycmF5KiBwcmV2aW91c0NvbHVtbkNvZGV3b3JkcyA9DQorICAgICAgKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnMuR2V0QXQoDQorICAgICAgICAgICBiYXJjb2RlQ29sdW1uIC0gMSkpDQorICAgICAgICAgIC0+Z2V0Q29kZXdvcmRzKCk7DQorICBDRlhfUHRyQXJyYXkqIG5leHRDb2x1bW5Db2Rld29yZHMgPSBwcmV2aW91c0NvbHVtbkNvZGV3b3JkczsNCisgIGlmIChtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbiArIDFdICE9IE5VTEwpIHsNCisgICAgbmV4dENvbHVtbkNvZGV3b3JkcyA9ICgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1tiYXJjb2RlQ29sdW1uICsgMV0pDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRDb2Rld29yZHMoKTsNCisgIH0NCisgIENGWF9QdHJBcnJheSBvdGhlckNvZGV3b3JkczsNCisgIG90aGVyQ29kZXdvcmRzLlNldFNpemUoMTQpOw0KKyAgb3RoZXJDb2Rld29yZHNbMl0gPSBwcmV2aW91c0NvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KTsNCisgIG90aGVyQ29kZXdvcmRzWzNdID0gbmV4dENvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KTsNCisgIGlmIChjb2Rld29yZHNSb3cgPiAwKSB7DQorICAgIG90aGVyQ29kZXdvcmRzWzBdID0gY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAxKTsNCisgICAgb3RoZXJDb2Rld29yZHNbNF0gPSBwcmV2aW91c0NvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93IC0gMSk7DQorICAgIG90aGVyQ29kZXdvcmRzWzVdID0gbmV4dENvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93IC0gMSk7DQorICB9DQorICBpZiAoY29kZXdvcmRzUm93ID4gMSkgew0KKyAgICBvdGhlckNvZGV3b3Jkc1s4XSA9IGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93IC0gMik7DQorICAgIG90aGVyQ29kZXdvcmRzWzEwXSA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAyKTsNCisgICAgb3RoZXJDb2Rld29yZHNbMTFdID0gbmV4dENvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93IC0gMik7DQorICB9DQorICBpZiAoY29kZXdvcmRzUm93IDwgY29kZXdvcmRzLT5HZXRTaXplKCkgLSAxKSB7DQorICAgIG90aGVyQ29kZXdvcmRzWzFdID0gY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgKyAxKTsNCisgICAgb3RoZXJDb2Rld29yZHNbNl0gPSBwcmV2aW91c0NvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93ICsgMSk7DQorICAgIG90aGVyQ29kZXdvcmRzWzddID0gbmV4dENvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93ICsgMSk7DQorICB9DQorICBpZiAoY29kZXdvcmRzUm93IDwgY29kZXdvcmRzLT5HZXRTaXplKCkgLSAyKSB7DQorICAgIG90aGVyQ29kZXdvcmRzWzldID0gY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgKyAyKTsNCisgICAgb3RoZXJDb2Rld29yZHNbMTJdID0gcHJldmlvdXNDb2x1bW5Db2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdyArIDIpOw0KKyAgICBvdGhlckNvZGV3b3Jkc1sxM10gPSBuZXh0Q29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgKyAyKTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG90aGVyQ29kZXdvcmRzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIENCQ19Db2Rld29yZCogb3RoZXJDb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKW90aGVyQ29kZXdvcmRzLkdldEF0KGkpOw0KKyAgICBpZiAoYWRqdXN0Um93TnVtYmVyKGNvZGV3b3JkLCBvdGhlckNvZGV3b3JkKSkgew0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KLSAgICBDRlhfUHRyQXJyYXkgb3RoZXJDb2Rld29yZHM7DQotICAgIG90aGVyQ29kZXdvcmRzLlNldFNpemUoMTQpOw0KLSAgICBvdGhlckNvZGV3b3Jkc1syXSA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KLSAgICBvdGhlckNvZGV3b3Jkc1szXSA9IG5leHRDb2x1bW5Db2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQotICAgIGlmIChjb2Rld29yZHNSb3cgPiAwKSB7DQotICAgICAgICBvdGhlckNvZGV3b3Jkc1swXSA9IGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93IC0gMSk7DQotICAgICAgICBvdGhlckNvZGV3b3Jkc1s0XSA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAxKTsNCi0gICAgICAgIG90aGVyQ29kZXdvcmRzWzVdID0gbmV4dENvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93IC0gMSk7DQotICAgIH0NCi0gICAgaWYgKGNvZGV3b3Jkc1JvdyA+IDEpIHsNCi0gICAgICAgIG90aGVyQ29kZXdvcmRzWzhdID0gY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAyKTsNCi0gICAgICAgIG90aGVyQ29kZXdvcmRzWzEwXSA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAyKTsNCi0gICAgICAgIG90aGVyQ29kZXdvcmRzWzExXSA9IG5leHRDb2x1bW5Db2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdyAtIDIpOw0KLSAgICB9DQotICAgIGlmIChjb2Rld29yZHNSb3cgPCBjb2Rld29yZHMtPkdldFNpemUoKSAtIDEpIHsNCi0gICAgICAgIG90aGVyQ29kZXdvcmRzWzFdID0gY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgKyAxKTsNCi0gICAgICAgIG90aGVyQ29kZXdvcmRzWzZdID0gcHJldmlvdXNDb2x1bW5Db2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdyArIDEpOw0KLSAgICAgICAgb3RoZXJDb2Rld29yZHNbN10gPSBuZXh0Q29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgKyAxKTsNCi0gICAgfQ0KLSAgICBpZiAoY29kZXdvcmRzUm93IDwgY29kZXdvcmRzLT5HZXRTaXplKCkgLSAyKSB7DQotICAgICAgICBvdGhlckNvZGV3b3Jkc1s5XSA9IGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93ICsgMik7DQotICAgICAgICBvdGhlckNvZGV3b3Jkc1sxMl0gPSBwcmV2aW91c0NvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93ICsgMik7DQotICAgICAgICBvdGhlckNvZGV3b3Jkc1sxM10gPSBuZXh0Q29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgKyAyKTsNCi0gICAgfQ0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBvdGhlckNvZGV3b3Jkcy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgQ0JDX0NvZGV3b3JkKiBvdGhlckNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopb3RoZXJDb2Rld29yZHMuR2V0QXQoaSk7DQotICAgICAgICBpZiAoYWRqdXN0Um93TnVtYmVyKGNvZGV3b3JkLCBvdGhlckNvZGV3b3JkKSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KKyAgfQ0KIH0NCi1GWF9CT09MIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcihDQkNfQ29kZXdvcmQqIGNvZGV3b3JkLCBDQkNfQ29kZXdvcmQqIG90aGVyQ29kZXdvcmQpDQotew0KLSAgICBpZiAob3RoZXJDb2Rld29yZCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG90aGVyQ29kZXdvcmQtPmhhc1ZhbGlkUm93TnVtYmVyKCkgJiYgb3RoZXJDb2Rld29yZC0+Z2V0QnVja2V0KCkgPT0gY29kZXdvcmQtPmdldEJ1Y2tldCgpKSB7DQotICAgICAgICBjb2Rld29yZC0+c2V0Um93TnVtYmVyKG90aGVyQ29kZXdvcmQtPmdldFJvd051bWJlcigpKTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQorRlhfQk9PTCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjphZGp1c3RSb3dOdW1iZXIoQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29kZXdvcmQqIG90aGVyQ29kZXdvcmQpIHsNCisgIGlmIChvdGhlckNvZGV3b3JkID09IE5VTEwpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKG90aGVyQ29kZXdvcmQtPmhhc1ZhbGlkUm93TnVtYmVyKCkgJiYNCisgICAgICBvdGhlckNvZGV3b3JkLT5nZXRCdWNrZXQoKSA9PSBjb2Rld29yZC0+Z2V0QnVja2V0KCkpIHsNCisgICAgY29kZXdvcmQtPnNldFJvd051bWJlcihvdGhlckNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1pbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHQ6OmdldEJhcmNvZGVDb2x1bW5Db3VudCgpDQotew0KLSAgICByZXR1cm4gbV9iYXJjb2RlQ29sdW1uQ291bnQ7DQoraW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpnZXRCYXJjb2RlQ29sdW1uQ291bnQoKSB7DQorICByZXR1cm4gbV9iYXJjb2RlQ29sdW1uQ291bnQ7DQogfQ0KLWludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdDo6Z2V0QmFyY29kZVJvd0NvdW50KCkNCi17DQotICAgIHJldHVybiBtX2JhcmNvZGVNZXRhZGF0YS0+Z2V0Um93Q291bnQoKTsNCitpbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHQ6OmdldEJhcmNvZGVSb3dDb3VudCgpIHsNCisgIHJldHVybiBtX2JhcmNvZGVNZXRhZGF0YS0+Z2V0Um93Q291bnQoKTsNCiB9DQotaW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpnZXRCYXJjb2RlRUNMZXZlbCgpDQotew0KLSAgICByZXR1cm4gbV9iYXJjb2RlTWV0YWRhdGEtPmdldEVycm9yQ29ycmVjdGlvbkxldmVsKCk7DQoraW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpnZXRCYXJjb2RlRUNMZXZlbCgpIHsNCisgIHJldHVybiBtX2JhcmNvZGVNZXRhZGF0YS0+Z2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdC5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdC5oCmluZGV4IDM0ZGE5MDAuLjdmMDY1ZWIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHQuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmgKQEAgLTEwLDM4ICsxMCw0NiBAQAogY2xhc3MgQ0JDX0JvdW5kaW5nQm94Ow0KIGNsYXNzIENCQ19Db2Rld29yZDsNCiBjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOw0KLWNsYXNzIENCQ19EZXRlY3Rpb25SZXN1bHQNCi17DQotcHVibGljOg0KLSAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0KENCQ19CYXJjb2RlTWV0YWRhdGEqIGJhcmNvZGVNZXRhZGF0YSwgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCk7DQotICAgIHZpcnR1YWwgfkNCQ19EZXRlY3Rpb25SZXN1bHQoKTsNCi0gICAgQ0ZYX1B0ckFycmF5JiBnZXREZXRlY3Rpb25SZXN1bHRDb2x1bW5zKCk7DQotICAgIHZvaWQgc2V0Qm91bmRpbmdCb3goQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCk7DQotICAgIENCQ19Cb3VuZGluZ0JveCogZ2V0Qm91bmRpbmdCb3goKTsNCi0gICAgdm9pZCBzZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oaW50MzJfdCBiYXJjb2RlQ29sdW1uLCBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBkZXRlY3Rpb25SZXN1bHRDb2x1bW4pOw0KLSAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBnZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oaW50MzJfdCBiYXJjb2RlQ29sdW1uKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgdG9TdHJpbmcoKTsNCitjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0IHsNCisgcHVibGljOg0KKyAgQ0JDX0RldGVjdGlvblJlc3VsdChDQkNfQmFyY29kZU1ldGFkYXRhKiBiYXJjb2RlTWV0YWRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpOw0KKyAgdmlydHVhbCB+Q0JDX0RldGVjdGlvblJlc3VsdCgpOw0KKyAgQ0ZYX1B0ckFycmF5JiBnZXREZXRlY3Rpb25SZXN1bHRDb2x1bW5zKCk7DQorICB2b2lkIHNldEJvdW5kaW5nQm94KENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpOw0KKyAgQ0JDX0JvdW5kaW5nQm94KiBnZXRCb3VuZGluZ0JveCgpOw0KKyAgdm9pZCBzZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oDQorICAgICAgaW50MzJfdCBiYXJjb2RlQ29sdW1uLA0KKyAgICAgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qIGRldGVjdGlvblJlc3VsdENvbHVtbik7DQorICBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBnZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oaW50MzJfdCBiYXJjb2RlQ29sdW1uKTsNCisgIENGWF9CeXRlU3RyaW5nIHRvU3RyaW5nKCk7DQogDQotICAgIGludDMyX3QgZ2V0QmFyY29kZUNvbHVtbkNvdW50KCk7DQotICAgIGludDMyX3QgZ2V0QmFyY29kZVJvd0NvdW50KCk7DQotICAgIGludDMyX3QgZ2V0QmFyY29kZUVDTGV2ZWwoKTsNCi1wcml2YXRlOg0KLSAgICBzdGF0aWMgaW50MzJfdCBBREpVU1RfUk9XX05VTUJFUl9TS0lQOw0KLSAgICBDQkNfQmFyY29kZU1ldGFkYXRhKiBtX2JhcmNvZGVNZXRhZGF0YTsNCi0gICAgQ0ZYX1B0ckFycmF5IG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uczsNCi0gICAgQ0JDX0JvdW5kaW5nQm94KiBtX2JvdW5kaW5nQm94Ow0KLSAgICBpbnQzMl90IG1fYmFyY29kZUNvbHVtbkNvdW50Ow0KLXByaXZhdGU6DQotICAgIHZvaWQgYWRqdXN0SW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycyhDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBkZXRlY3Rpb25SZXN1bHRDb2x1bW4pOw0KLSAgICBpbnQzMl90IGFkanVzdFJvd051bWJlcnMoKTsNCi0gICAgaW50MzJfdCBhZGp1c3RSb3dOdW1iZXJzQnlSb3coKTsNCi0gICAgaW50MzJfdCBhZGp1c3RSb3dOdW1iZXJzRnJvbUJvdGhSSSgpOw0KLSAgICBpbnQzMl90IGFkanVzdFJvd051bWJlcnNGcm9tUlJJKCk7DQotICAgIGludDMyX3QgYWRqdXN0Um93TnVtYmVyc0Zyb21MUkkoKTsNCi0gICAgc3RhdGljIGludDMyX3QgYWRqdXN0Um93TnVtYmVySWZWYWxpZChpbnQzMl90IHJvd0luZGljYXRvclJvd051bWJlciwgaW50MzJfdCBpbnZhbGlkUm93Q291bnRzLCBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkKTsNCi0gICAgdm9pZCBhZGp1c3RSb3dOdW1iZXJzKGludDMyX3QgYmFyY29kZUNvbHVtbiwgaW50MzJfdCBjb2Rld29yZHNSb3csIENGWF9QdHJBcnJheSogY29kZXdvcmRzKTsNCi0gICAgc3RhdGljIEZYX0JPT0wgYWRqdXN0Um93TnVtYmVyKENCQ19Db2Rld29yZCogY29kZXdvcmQsIENCQ19Db2Rld29yZCogb3RoZXJDb2Rld29yZCk7DQorICBpbnQzMl90IGdldEJhcmNvZGVDb2x1bW5Db3VudCgpOw0KKyAgaW50MzJfdCBnZXRCYXJjb2RlUm93Q291bnQoKTsNCisgIGludDMyX3QgZ2V0QmFyY29kZUVDTGV2ZWwoKTsNCiANCisgcHJpdmF0ZToNCisgIHN0YXRpYyBpbnQzMl90IEFESlVTVF9ST1dfTlVNQkVSX1NLSVA7DQorICBDQkNfQmFyY29kZU1ldGFkYXRhKiBtX2JhcmNvZGVNZXRhZGF0YTsNCisgIENGWF9QdHJBcnJheSBtX2RldGVjdGlvblJlc3VsdENvbHVtbnM7DQorICBDQkNfQm91bmRpbmdCb3gqIG1fYm91bmRpbmdCb3g7DQorICBpbnQzMl90IG1fYmFyY29kZUNvbHVtbkNvdW50Ow0KIA0KKyBwcml2YXRlOg0KKyAgdm9pZCBhZGp1c3RJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKA0KKyAgICAgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qIGRldGVjdGlvblJlc3VsdENvbHVtbik7DQorICBpbnQzMl90IGFkanVzdFJvd051bWJlcnMoKTsNCisgIGludDMyX3QgYWRqdXN0Um93TnVtYmVyc0J5Um93KCk7DQorICBpbnQzMl90IGFkanVzdFJvd051bWJlcnNGcm9tQm90aFJJKCk7DQorICBpbnQzMl90IGFkanVzdFJvd051bWJlcnNGcm9tUlJJKCk7DQorICBpbnQzMl90IGFkanVzdFJvd051bWJlcnNGcm9tTFJJKCk7DQorICBzdGF0aWMgaW50MzJfdCBhZGp1c3RSb3dOdW1iZXJJZlZhbGlkKGludDMyX3Qgcm93SW5kaWNhdG9yUm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGludmFsaWRSb3dDb3VudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQpOw0KKyAgdm9pZCBhZGp1c3RSb3dOdW1iZXJzKGludDMyX3QgYmFyY29kZUNvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGV3b3Jkc1JvdywNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIGNvZGV3b3Jkcyk7DQorICBzdGF0aWMgRlhfQk9PTCBhZGp1c3RSb3dOdW1iZXIoQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29kZXdvcmQqIG90aGVyQ29kZXdvcmQpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmNwcAppbmRleCBmNGRhNTQyLi5kNTgyMjBmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmNwcApAQCAtMjUsODMgKzI1LDc2IEBACiAjaW5jbHVkZSAiQkNfUERGNDE3Qm91bmRpbmdCb3guaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmgiDQogaW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpNQVhfTkVBUkJZX0RJU1RBTkNFID0gNTsNCi1DQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpDQotew0KLSAgICBtX2JvdW5kaW5nQm94ID0gYm91bmRpbmdCb3g7DQotICAgIG1fY29kZXdvcmRzID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCi0gICAgbV9jb2Rld29yZHMtPlNldFNpemUoYm91bmRpbmdCb3gtPmdldE1heFkoKSAtIGJvdW5kaW5nQm94LT5nZXRNaW5ZKCkgKyAxKTsNCitDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKA0KKyAgICBDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94KSB7DQorICBtX2JvdW5kaW5nQm94ID0gYm91bmRpbmdCb3g7DQorICBtX2NvZGV3b3JkcyA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQorICBtX2NvZGV3b3Jkcy0+U2V0U2l6ZShib3VuZGluZ0JveC0+Z2V0TWF4WSgpIC0gYm91bmRpbmdCb3gtPmdldE1pblkoKSArIDEpOw0KIH0NCi1DQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjp+Q0JDX0RldGVjdGlvblJlc3VsdENvbHVtbigpDQotew0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIGRlbGV0ZSAoQ0JDX0NvZGV3b3JkKiltX2NvZGV3b3Jkcy0+R2V0QXQoaSk7DQotICAgIH0NCi0gICAgbV9jb2Rld29yZHMtPlJlbW92ZUFsbCgpOw0KLSAgICBkZWxldGUgbV9jb2Rld29yZHM7DQorQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6fkNCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4oKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgZGVsZXRlIChDQkNfQ29kZXdvcmQqKW1fY29kZXdvcmRzLT5HZXRBdChpKTsNCisgIH0NCisgIG1fY29kZXdvcmRzLT5SZW1vdmVBbGwoKTsNCisgIGRlbGV0ZSBtX2NvZGV3b3JkczsNCiB9DQotQ0JDX0NvZGV3b3JkKiBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpnZXRDb2Rld29yZE5lYXJieShpbnQzMl90IGltYWdlUm93KQ0KLXsNCi0gICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IGdldENvZGV3b3JkKGltYWdlUm93KTsNCi0gICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCitDQkNfQ29kZXdvcmQqIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW46OmdldENvZGV3b3JkTmVhcmJ5KGludDMyX3QgaW1hZ2VSb3cpIHsNCisgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSBnZXRDb2Rld29yZChpbWFnZVJvdyk7DQorICBpZiAoY29kZXdvcmQgIT0gTlVMTCkgew0KKyAgICByZXR1cm4gY29kZXdvcmQ7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBNQVhfTkVBUkJZX0RJU1RBTkNFOyBpKyspIHsNCisgICAgaW50MzJfdCBuZWFySW1hZ2VSb3cgPSBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleChpbWFnZVJvdykgLSBpOw0KKyAgICBpZiAobmVhckltYWdlUm93ID49IDApIHsNCisgICAgICBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKW1fY29kZXdvcmRzLT5HZXRBdChuZWFySW1hZ2VSb3cpOw0KKyAgICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQogICAgICAgICByZXR1cm4gY29kZXdvcmQ7DQorICAgICAgfQ0KICAgICB9DQotICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IE1BWF9ORUFSQllfRElTVEFOQ0U7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBuZWFySW1hZ2VSb3cgPSBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleChpbWFnZVJvdykgLSBpOw0KLSAgICAgICAgaWYgKG5lYXJJbWFnZVJvdyA+PSAwKSB7DQotICAgICAgICAgICAgY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiltX2NvZGV3b3Jkcy0+R2V0QXQobmVhckltYWdlUm93KTsNCi0gICAgICAgICAgICBpZiAoY29kZXdvcmQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY29kZXdvcmQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgbmVhckltYWdlUm93ID0gaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoaW1hZ2VSb3cpICsgaTsNCi0gICAgICAgIGlmIChuZWFySW1hZ2VSb3cgPCBtX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpKSB7DQotICAgICAgICAgICAgY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiltX2NvZGV3b3Jkcy0+R2V0QXQobmVhckltYWdlUm93KTsNCi0gICAgICAgICAgICBpZiAoY29kZXdvcmQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY29kZXdvcmQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgICBuZWFySW1hZ2VSb3cgPSBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleChpbWFnZVJvdykgKyBpOw0KKyAgICBpZiAobmVhckltYWdlUm93IDwgbV9jb2Rld29yZHMtPkdldFNpemUoKSkgew0KKyAgICAgIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopbV9jb2Rld29yZHMtPkdldEF0KG5lYXJJbWFnZVJvdyk7DQorICAgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBjb2Rld29yZDsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotaW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjppbWFnZVJvd1RvQ29kZXdvcmRJbmRleChpbnQzMl90IGltYWdlUm93KQ0KLXsNCi0gICAgcmV0dXJuIGltYWdlUm93IC0gbV9ib3VuZGluZ0JveC0+Z2V0TWluWSgpOw0KK2ludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6aW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoaW50MzJfdCBpbWFnZVJvdykgew0KKyAgcmV0dXJuIGltYWdlUm93IC0gbV9ib3VuZGluZ0JveC0+Z2V0TWluWSgpOw0KIH0NCi1pbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW46OmNvZGV3b3JkSW5kZXhUb0ltYWdlUm93KGludDMyX3QgY29kZXdvcmRJbmRleCkNCi17DQotICAgIHJldHVybiBtX2JvdW5kaW5nQm94LT5nZXRNaW5ZKCkgKyBjb2Rld29yZEluZGV4Ow0KK2ludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6Y29kZXdvcmRJbmRleFRvSW1hZ2VSb3coDQorICAgIGludDMyX3QgY29kZXdvcmRJbmRleCkgew0KKyAgcmV0dXJuIG1fYm91bmRpbmdCb3gtPmdldE1pblkoKSArIGNvZGV3b3JkSW5kZXg7DQogfQ0KLXZvaWQgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6c2V0Q29kZXdvcmQoaW50MzJfdCBpbWFnZVJvdywgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCkNCi17DQotICAgIG1fY29kZXdvcmRzLT5TZXRBdChpbWFnZVJvd1RvQ29kZXdvcmRJbmRleChpbWFnZVJvdyksIGNvZGV3b3JkKTsNCit2b2lkIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW46OnNldENvZGV3b3JkKGludDMyX3QgaW1hZ2VSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkKSB7DQorICBtX2NvZGV3b3Jkcy0+U2V0QXQoaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoaW1hZ2VSb3cpLCBjb2Rld29yZCk7DQogfQ0KLUNCQ19Db2Rld29yZCogQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6Z2V0Q29kZXdvcmQoaW50MzJfdCBpbWFnZVJvdykNCi17DQotICAgIHJldHVybiAoQ0JDX0NvZGV3b3JkKiltX2NvZGV3b3Jkcy0+R2V0QXQoaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoaW1hZ2VSb3cpKTsNCitDQkNfQ29kZXdvcmQqIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW46OmdldENvZGV3b3JkKGludDMyX3QgaW1hZ2VSb3cpIHsNCisgIHJldHVybiAoQ0JDX0NvZGV3b3JkKiltX2NvZGV3b3Jkcy0+R2V0QXQoaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoaW1hZ2VSb3cpKTsNCiB9DQotQ0JDX0JvdW5kaW5nQm94KiBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpnZXRCb3VuZGluZ0JveCgpDQotew0KLSAgICByZXR1cm4gbV9ib3VuZGluZ0JveDsNCitDQkNfQm91bmRpbmdCb3gqIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW46OmdldEJvdW5kaW5nQm94KCkgew0KKyAgcmV0dXJuIG1fYm91bmRpbmdCb3g7DQogfQ0KLUNGWF9QdHJBcnJheSogQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6Z2V0Q29kZXdvcmRzKCkNCi17DQotICAgIHJldHVybiBtX2NvZGV3b3JkczsNCitDRlhfUHRyQXJyYXkqIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW46OmdldENvZGV3b3JkcygpIHsNCisgIHJldHVybiBtX2NvZGV3b3JkczsNCiB9DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6dG9TdHJpbmcoKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0Ow0KLSAgICBpbnQzMl90IHJvdyA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fY29kZXdvcmRzLT5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKW1fY29kZXdvcmRzLT5HZXRBdChpKTsNCi0gICAgICAgIGlmIChjb2Rld29yZCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSByb3c7DQotICAgICAgICAgICAgcm93Kys7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpIHJvdzsNCi0gICAgICAgIHJlc3VsdCArPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCk7DQotICAgICAgICByZXN1bHQgKz0gY29kZXdvcmQtPmdldFZhbHVlKCk7DQotICAgICAgICByb3crKzsNCitDRlhfQnl0ZVN0cmluZyBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjp0b1N0cmluZygpIHsNCisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCisgIGludDMyX3Qgcm93ID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fY29kZXdvcmRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopbV9jb2Rld29yZHMtPkdldEF0KGkpOw0KKyAgICBpZiAoY29kZXdvcmQgPT0gTlVMTCkgew0KKyAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUilyb3c7DQorICAgICAgcm93Kys7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgcmV0dXJuIHJlc3VsdDsNCisgICAgcmVzdWx0ICs9IChGWF9DSEFSKXJvdzsNCisgICAgcmVzdWx0ICs9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgcmVzdWx0ICs9IGNvZGV3b3JkLT5nZXRWYWx1ZSgpOw0KKyAgICByb3crKzsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaAppbmRleCA5OTQwOTk4Li40NThhMWU4IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5oCkBAIC04LDIzICs4LDI0IEBACiAjZGVmaW5lIF9CQ19ERVRFQ1RJT05SRVNVTFRDT0xVTU5fSF8NCiBjbGFzcyBDQkNfQ29kZXdvcmQ7DQogY2xhc3MgQ0JDX0JvdW5kaW5nQm94Ow0KLWNsYXNzIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4NCi17DQotcHVibGljOg0KLSAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpOw0KLSAgICB2aXJ0dWFsIH5DQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKCk7DQotICAgIENCQ19Db2Rld29yZCogZ2V0Q29kZXdvcmROZWFyYnkoaW50MzJfdCBpbWFnZVJvdyk7DQotICAgIGludDMyX3QgaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoaW50MzJfdCBpbWFnZVJvdyk7DQotICAgIGludDMyX3QgY29kZXdvcmRJbmRleFRvSW1hZ2VSb3coaW50MzJfdCBjb2Rld29yZEluZGV4KTsNCi0gICAgdm9pZCBzZXRDb2Rld29yZChpbnQzMl90IGltYWdlUm93LCBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkKTsNCi0gICAgQ0JDX0NvZGV3b3JkKiBnZXRDb2Rld29yZChpbnQzMl90IGltYWdlUm93KTsNCi0gICAgQ0JDX0JvdW5kaW5nQm94KiBnZXRCb3VuZGluZ0JveCgpOw0KLSAgICBDRlhfUHRyQXJyYXkqIGdldENvZGV3b3JkcygpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyB0b1N0cmluZygpOw0KLXB1YmxpYzoNCi0gICAgQ0JDX0JvdW5kaW5nQm94KiBtX2JvdW5kaW5nQm94Ow0KLSAgICBDRlhfUHRyQXJyYXkqIG1fY29kZXdvcmRzOw0KLXByaXZhdGU6DQotICAgIHN0YXRpYyBpbnQzMl90IE1BWF9ORUFSQllfRElTVEFOQ0U7DQorY2xhc3MgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiB7DQorIHB1YmxpYzoNCisgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4oQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCk7DQorICB2aXJ0dWFsIH5DQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKCk7DQorICBDQkNfQ29kZXdvcmQqIGdldENvZGV3b3JkTmVhcmJ5KGludDMyX3QgaW1hZ2VSb3cpOw0KKyAgaW50MzJfdCBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleChpbnQzMl90IGltYWdlUm93KTsNCisgIGludDMyX3QgY29kZXdvcmRJbmRleFRvSW1hZ2VSb3coaW50MzJfdCBjb2Rld29yZEluZGV4KTsNCisgIHZvaWQgc2V0Q29kZXdvcmQoaW50MzJfdCBpbWFnZVJvdywgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCk7DQorICBDQkNfQ29kZXdvcmQqIGdldENvZGV3b3JkKGludDMyX3QgaW1hZ2VSb3cpOw0KKyAgQ0JDX0JvdW5kaW5nQm94KiBnZXRCb3VuZGluZ0JveCgpOw0KKyAgQ0ZYX1B0ckFycmF5KiBnZXRDb2Rld29yZHMoKTsNCisgIENGWF9CeXRlU3RyaW5nIHRvU3RyaW5nKCk7DQorDQorIHB1YmxpYzoNCisgIENCQ19Cb3VuZGluZ0JveCogbV9ib3VuZGluZ0JveDsNCisgIENGWF9QdHJBcnJheSogbV9jb2Rld29yZHM7DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgaW50MzJfdCBNQVhfTkVBUkJZX0RJU1RBTkNFOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmNwcAppbmRleCAxMjYyMmMzLi44NDNlOGE5IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmNwcApAQCAtMjksMjEzICsyOSwyMzcgQEAKICNpbmNsdWRlICJCQ19QREY0MTdDb21tb24uaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmgiDQogI2luY2x1ZGUgIkJDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5oIg0KLUNCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OkNCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4oQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCwgRlhfQk9PTCBpc0xlZnQpDQotICAgIDogQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbihib3VuZGluZ0JveCkNCi17DQotICAgIG1faXNMZWZ0ID0gaXNMZWZ0Ow0KK0NCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OkNCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4oDQorICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gsDQorICAgIEZYX0JPT0wgaXNMZWZ0KQ0KKyAgICA6IENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4oYm91bmRpbmdCb3gpIHsNCisgIG1faXNMZWZ0ID0gaXNMZWZ0Ow0KIH0NCi1DQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOjp+Q0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbigpDQotew0KLX0NCi12b2lkIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OnNldFJvd051bWJlcnMoKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9jb2Rld29yZHMtPkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICBDQkNfQ29kZXdvcmQgKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKW1fY29kZXdvcmRzLT5HZXRBdChpKTsNCi0gICAgICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgY29kZXdvcmQtPnNldFJvd051bWJlckFzUm93SW5kaWNhdG9yQ29sdW1uKCk7DQotICAgICAgICB9DQorQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbjo6DQorICAgIH5DQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKCkge30NCit2b2lkIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OnNldFJvd051bWJlcnMoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKW1fY29kZXdvcmRzLT5HZXRBdChpKTsNCisgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICBjb2Rld29yZC0+c2V0Um93TnVtYmVyQXNSb3dJbmRpY2F0b3JDb2x1bW4oKTsNCiAgICAgfQ0KKyAgfQ0KIH0NCi1pbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OmFkanVzdENvbXBsZXRlSW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycyhDQkNfQmFyY29kZU1ldGFkYXRhIGJhcmNvZGVNZXRhZGF0YSkNCi17DQotICAgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0gZ2V0Q29kZXdvcmRzKCk7DQotICAgIHNldFJvd051bWJlcnMoKTsNCi0gICAgcmVtb3ZlSW5jb3JyZWN0Q29kZXdvcmRzKGNvZGV3b3JkcywgYmFyY29kZU1ldGFkYXRhKTsNCi0gICAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9IGdldEJvdW5kaW5nQm94KCk7DQotICAgIENCQ19SZXN1bHRQb2ludCogdG9wID0gbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0VG9wTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldFRvcFJpZ2h0KCk7DQotICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tID0gbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0Qm90dG9tTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldEJvdHRvbVJpZ2h0KCk7DQotICAgIGludDMyX3QgZmlyc3RSb3cgPSBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleCgoaW50MzJfdCkgdG9wLT5HZXRZKCkpOw0KLSAgICBpbnQzMl90IGxhc3RSb3cgPSBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleCgoaW50MzJfdCkgYm90dG9tLT5HZXRZKCkpOw0KLSAgICBGWF9GTE9BVCBhdmVyYWdlUm93SGVpZ2h0ID0gKGxhc3RSb3cgLSBmaXJzdFJvdykgLyAoRlhfRkxPQVQpIGJhcmNvZGVNZXRhZGF0YS5nZXRSb3dDb3VudCgpOw0KLSAgICBpbnQzMl90IGJhcmNvZGVSb3cgPSAtMTsNCi0gICAgaW50MzJfdCBtYXhSb3dIZWlnaHQgPSAxOw0KLSAgICBpbnQzMl90IGN1cnJlbnRSb3dIZWlnaHQgPSAwOw0KLSAgICBmb3IgKGludDMyX3QgY29kZXdvcmRzUm93ID0gZmlyc3RSb3c7IGNvZGV3b3Jkc1JvdyA8IGxhc3RSb3c7IGNvZGV3b3Jkc1JvdysrKSB7DQotICAgICAgICBpZiAoY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpID09IE5VTEwpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQotICAgICAgICBpbnQzMl90IHJvd0RpZmZlcmVuY2UgPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkgLSBiYXJjb2RlUm93Ow0KLSAgICAgICAgaWYgKHJvd0RpZmZlcmVuY2UgPT0gMCkgew0KLSAgICAgICAgICAgIGN1cnJlbnRSb3dIZWlnaHQrKzsNCi0gICAgICAgIH0gZWxzZSBpZiAocm93RGlmZmVyZW5jZSA9PSAxKSB7DQotICAgICAgICAgICAgbWF4Um93SGVpZ2h0ID0gbWF4Um93SGVpZ2h0ID4gY3VycmVudFJvd0hlaWdodCA/IG1heFJvd0hlaWdodCA6IGN1cnJlbnRSb3dIZWlnaHQ7DQotICAgICAgICAgICAgY3VycmVudFJvd0hlaWdodCA9IDE7DQotICAgICAgICAgICAgYmFyY29kZVJvdyA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAocm93RGlmZmVyZW5jZSA8IDApIHsNCi0gICAgICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQotICAgICAgICB9IGVsc2UgaWYgKGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSA+PSBiYXJjb2RlTWV0YWRhdGEuZ2V0Um93Q291bnQoKSkgew0KLSAgICAgICAgICAgIGNvZGV3b3Jkcy0+U2V0QXQoY29kZXdvcmRzUm93LCBOVUxMKTsNCi0gICAgICAgIH0gZWxzZSBpZiAocm93RGlmZmVyZW5jZSA+IGNvZGV3b3Jkc1Jvdykgew0KLSAgICAgICAgICAgIGNvZGV3b3Jkcy0+U2V0QXQoY29kZXdvcmRzUm93LCBOVUxMKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaW50MzJfdCBjaGVja2VkUm93czsNCi0gICAgICAgICAgICBpZiAobWF4Um93SGVpZ2h0ID4gMikgew0KLSAgICAgICAgICAgICAgICBjaGVja2VkUm93cyA9IChtYXhSb3dIZWlnaHQgLSAyKSAqIHJvd0RpZmZlcmVuY2U7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgY2hlY2tlZFJvd3MgPSByb3dEaWZmZXJlbmNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWF9CT09MIGNsb3NlUHJldmlvdXNDb2Rld29yZEZvdW5kID0gY2hlY2tlZFJvd3MgPj0gY29kZXdvcmRzUm93Ow0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8PSBjaGVja2VkUm93cyAmJiAhY2xvc2VQcmV2aW91c0NvZGV3b3JkRm91bmQ7IGkrKykgew0KLSAgICAgICAgICAgICAgICBjbG9zZVByZXZpb3VzQ29kZXdvcmRGb3VuZCA9IGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93IC0gaSkgIT0gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGNsb3NlUHJldmlvdXNDb2Rld29yZEZvdW5kKSB7DQotICAgICAgICAgICAgICAgIGNvZGV3b3Jkcy0+U2V0QXQoY29kZXdvcmRzUm93LCBOVUxMKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBiYXJjb2RlUm93ID0gY29kZXdvcmQtPmdldFJvd051bWJlcigpOw0KLSAgICAgICAgICAgICAgICBjdXJyZW50Um93SGVpZ2h0ID0gMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQoraW50MzJfdA0KK0NCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OmFkanVzdENvbXBsZXRlSW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycygNCisgICAgQ0JDX0JhcmNvZGVNZXRhZGF0YSBiYXJjb2RlTWV0YWRhdGEpIHsNCisgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0gZ2V0Q29kZXdvcmRzKCk7DQorICBzZXRSb3dOdW1iZXJzKCk7DQorICByZW1vdmVJbmNvcnJlY3RDb2Rld29yZHMoY29kZXdvcmRzLCBiYXJjb2RlTWV0YWRhdGEpOw0KKyAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9IGdldEJvdW5kaW5nQm94KCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIHRvcCA9DQorICAgICAgbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0VG9wTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldFRvcFJpZ2h0KCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbSA9DQorICAgICAgbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0Qm90dG9tTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldEJvdHRvbVJpZ2h0KCk7DQorICBpbnQzMl90IGZpcnN0Um93ID0gaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoKGludDMyX3QpdG9wLT5HZXRZKCkpOw0KKyAgaW50MzJfdCBsYXN0Um93ID0gaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoKGludDMyX3QpYm90dG9tLT5HZXRZKCkpOw0KKyAgRlhfRkxPQVQgYXZlcmFnZVJvd0hlaWdodCA9DQorICAgICAgKGxhc3RSb3cgLSBmaXJzdFJvdykgLyAoRlhfRkxPQVQpYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCk7DQorICBpbnQzMl90IGJhcmNvZGVSb3cgPSAtMTsNCisgIGludDMyX3QgbWF4Um93SGVpZ2h0ID0gMTsNCisgIGludDMyX3QgY3VycmVudFJvd0hlaWdodCA9IDA7DQorICBmb3IgKGludDMyX3QgY29kZXdvcmRzUm93ID0gZmlyc3RSb3c7IGNvZGV3b3Jkc1JvdyA8IGxhc3RSb3c7DQorICAgICAgIGNvZGV3b3Jkc1JvdysrKSB7DQorICAgIGlmIChjb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykgPT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIHJldHVybiAoaW50MzJfdCkgKGF2ZXJhZ2VSb3dIZWlnaHQgKyAwLjUpOw0KKyAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KKyAgICBpbnQzMl90IHJvd0RpZmZlcmVuY2UgPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkgLSBiYXJjb2RlUm93Ow0KKyAgICBpZiAocm93RGlmZmVyZW5jZSA9PSAwKSB7DQorICAgICAgY3VycmVudFJvd0hlaWdodCsrOw0KKyAgICB9IGVsc2UgaWYgKHJvd0RpZmZlcmVuY2UgPT0gMSkgew0KKyAgICAgIG1heFJvd0hlaWdodCA9DQorICAgICAgICAgIG1heFJvd0hlaWdodCA+IGN1cnJlbnRSb3dIZWlnaHQgPyBtYXhSb3dIZWlnaHQgOiBjdXJyZW50Um93SGVpZ2h0Ow0KKyAgICAgIGN1cnJlbnRSb3dIZWlnaHQgPSAxOw0KKyAgICAgIGJhcmNvZGVSb3cgPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCk7DQorICAgIH0gZWxzZSBpZiAocm93RGlmZmVyZW5jZSA8IDApIHsNCisgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQorICAgIH0gZWxzZSBpZiAoY29kZXdvcmQtPmdldFJvd051bWJlcigpID49IGJhcmNvZGVNZXRhZGF0YS5nZXRSb3dDb3VudCgpKSB7DQorICAgICAgY29kZXdvcmRzLT5TZXRBdChjb2Rld29yZHNSb3csIE5VTEwpOw0KKyAgICB9IGVsc2UgaWYgKHJvd0RpZmZlcmVuY2UgPiBjb2Rld29yZHNSb3cpIHsNCisgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaW50MzJfdCBjaGVja2VkUm93czsNCisgICAgICBpZiAobWF4Um93SGVpZ2h0ID4gMikgew0KKyAgICAgICAgY2hlY2tlZFJvd3MgPSAobWF4Um93SGVpZ2h0IC0gMikgKiByb3dEaWZmZXJlbmNlOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBjaGVja2VkUm93cyA9IHJvd0RpZmZlcmVuY2U7DQorICAgICAgfQ0KKyAgICAgIEZYX0JPT0wgY2xvc2VQcmV2aW91c0NvZGV3b3JkRm91bmQgPSBjaGVja2VkUm93cyA+PSBjb2Rld29yZHNSb3c7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDw9IGNoZWNrZWRSb3dzICYmICFjbG9zZVByZXZpb3VzQ29kZXdvcmRGb3VuZDsNCisgICAgICAgICAgIGkrKykgew0KKyAgICAgICAgY2xvc2VQcmV2aW91c0NvZGV3b3JkRm91bmQgPSBjb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdyAtIGkpICE9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGlmIChjbG9zZVByZXZpb3VzQ29kZXdvcmRGb3VuZCkgew0KKyAgICAgICAgY29kZXdvcmRzLT5TZXRBdChjb2Rld29yZHNSb3csIE5VTEwpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBiYXJjb2RlUm93ID0gY29kZXdvcmQtPmdldFJvd051bWJlcigpOw0KKyAgICAgICAgY3VycmVudFJvd0hlaWdodCA9IDE7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gKGludDMyX3QpKGF2ZXJhZ2VSb3dIZWlnaHQgKyAwLjUpOw0KIH0NCi1DRlhfSW50MzJBcnJheSogQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbjo6Z2V0Um93SGVpZ2h0cyhpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX0JhcmNvZGVNZXRhZGF0YSogYmFyY29kZU1ldGFkYXRhID0gZ2V0QmFyY29kZU1ldGFkYXRhKCk7DQotICAgIGlmIChiYXJjb2RlTWV0YWRhdGEgPT0gTlVMTCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2Fubm90TWV0YWRhdGE7DQotICAgICAgICByZXR1cm4gTlVMTDsNCitDRlhfSW50MzJBcnJheSogQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbjo6Z2V0Um93SGVpZ2h0cygNCisgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0JhcmNvZGVNZXRhZGF0YSogYmFyY29kZU1ldGFkYXRhID0gZ2V0QmFyY29kZU1ldGFkYXRhKCk7DQorICBpZiAoYmFyY29kZU1ldGFkYXRhID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQ2Fubm90TWV0YWRhdGE7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgYWRqdXN0SW5jb21wbGV0ZUluZGljYXRvckNvbHVtblJvd051bWJlcnMoKmJhcmNvZGVNZXRhZGF0YSk7DQorICBDRlhfSW50MzJBcnJheSogcmVzdWx0ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgcmVzdWx0LT5TZXRTaXplKGJhcmNvZGVNZXRhZGF0YS0+Z2V0Um93Q291bnQoKSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBnZXRDb2Rld29yZHMoKS0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKWdldENvZGV3b3JkcygpLT5HZXRBdChpKTsNCisgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICByZXN1bHQtPlNldEF0KGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSwNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+R2V0QXQoY29kZXdvcmQtPmdldFJvd051bWJlcigpKSArIDEpOw0KICAgICB9DQotICAgIGFkanVzdEluY29tcGxldGVJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKCpiYXJjb2RlTWV0YWRhdGEpOw0KLSAgICBDRlhfSW50MzJBcnJheSogcmVzdWx0ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KLSAgICByZXN1bHQtPlNldFNpemUoYmFyY29kZU1ldGFkYXRhLT5nZXRSb3dDb3VudCgpKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZ2V0Q29kZXdvcmRzKCktPkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopZ2V0Q29kZXdvcmRzKCktPkdldEF0KGkpOw0KLSAgICAgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCi0gICAgICAgICAgICByZXN1bHQtPlNldEF0KGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSwgIHJlc3VsdC0+R2V0QXQoY29kZXdvcmQtPmdldFJvd051bWJlcigpKSArIDEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KIH0NCi1pbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OmFkanVzdEluY29tcGxldGVJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKENCQ19CYXJjb2RlTWV0YWRhdGEgYmFyY29kZU1ldGFkYXRhKQ0KLXsNCi0gICAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9IGdldEJvdW5kaW5nQm94KCk7DQotICAgIENCQ19SZXN1bHRQb2ludCogdG9wID0gbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0VG9wTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldFRvcFJpZ2h0KCk7DQotICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tID0gbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0Qm90dG9tTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldEJvdHRvbVJpZ2h0KCk7DQotICAgIGludDMyX3QgZmlyc3RSb3cgPSBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleCgoaW50MzJfdCkgdG9wLT5HZXRZKCkpOw0KLSAgICBpbnQzMl90IGxhc3RSb3cgPSBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleCgoaW50MzJfdCkgYm90dG9tLT5HZXRZKCkpOw0KLSAgICBGWF9GTE9BVCBhdmVyYWdlUm93SGVpZ2h0ID0gKGxhc3RSb3cgLSBmaXJzdFJvdykgLyAoRlhfRkxPQVQpIGJhcmNvZGVNZXRhZGF0YS5nZXRSb3dDb3VudCgpOw0KLSAgICBDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcyA9IGdldENvZGV3b3JkcygpOw0KLSAgICBpbnQzMl90IGJhcmNvZGVSb3cgPSAtMTsNCi0gICAgaW50MzJfdCBtYXhSb3dIZWlnaHQgPSAxOw0KLSAgICBpbnQzMl90IGN1cnJlbnRSb3dIZWlnaHQgPSAwOw0KLSAgICBmb3IgKGludDMyX3QgY29kZXdvcmRzUm93ID0gZmlyc3RSb3c7IGNvZGV3b3Jkc1JvdyA8IGxhc3RSb3c7IGNvZGV3b3Jkc1JvdysrKSB7DQotICAgICAgICBpZiAoY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpID09IE5VTEwpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQotICAgICAgICBjb2Rld29yZC0+c2V0Um93TnVtYmVyQXNSb3dJbmRpY2F0b3JDb2x1bW4oKTsNCi0gICAgICAgIGludDMyX3Qgcm93RGlmZmVyZW5jZSA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSAtIGJhcmNvZGVSb3c7DQotICAgICAgICBpZiAocm93RGlmZmVyZW5jZSA9PSAwKSB7DQotICAgICAgICAgICAgY3VycmVudFJvd0hlaWdodCsrOw0KLSAgICAgICAgfSBlbHNlIGlmIChyb3dEaWZmZXJlbmNlID09IDEpIHsNCi0gICAgICAgICAgICBtYXhSb3dIZWlnaHQgPSBtYXhSb3dIZWlnaHQgPiBjdXJyZW50Um93SGVpZ2h0ID8gbWF4Um93SGVpZ2h0IDogY3VycmVudFJvd0hlaWdodDsNCi0gICAgICAgICAgICBjdXJyZW50Um93SGVpZ2h0ID0gMTsNCi0gICAgICAgICAgICBiYXJjb2RlUm93ID0gY29kZXdvcmQtPmdldFJvd051bWJlcigpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkgPj0gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCkpIHsNCi0gICAgICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGJhcmNvZGVSb3cgPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCk7DQotICAgICAgICAgICAgY3VycmVudFJvd0hlaWdodCA9IDE7DQotICAgICAgICB9DQoraW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOjoNCisgICAgYWRqdXN0SW5jb21wbGV0ZUluZGljYXRvckNvbHVtblJvd051bWJlcnMoDQorICAgICAgICBDQkNfQmFyY29kZU1ldGFkYXRhIGJhcmNvZGVNZXRhZGF0YSkgew0KKyAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9IGdldEJvdW5kaW5nQm94KCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIHRvcCA9DQorICAgICAgbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0VG9wTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldFRvcFJpZ2h0KCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbSA9DQorICAgICAgbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0Qm90dG9tTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldEJvdHRvbVJpZ2h0KCk7DQorICBpbnQzMl90IGZpcnN0Um93ID0gaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoKGludDMyX3QpdG9wLT5HZXRZKCkpOw0KKyAgaW50MzJfdCBsYXN0Um93ID0gaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoKGludDMyX3QpYm90dG9tLT5HZXRZKCkpOw0KKyAgRlhfRkxPQVQgYXZlcmFnZVJvd0hlaWdodCA9DQorICAgICAgKGxhc3RSb3cgLSBmaXJzdFJvdykgLyAoRlhfRkxPQVQpYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCk7DQorICBDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcyA9IGdldENvZGV3b3JkcygpOw0KKyAgaW50MzJfdCBiYXJjb2RlUm93ID0gLTE7DQorICBpbnQzMl90IG1heFJvd0hlaWdodCA9IDE7DQorICBpbnQzMl90IGN1cnJlbnRSb3dIZWlnaHQgPSAwOw0KKyAgZm9yIChpbnQzMl90IGNvZGV3b3Jkc1JvdyA9IGZpcnN0Um93OyBjb2Rld29yZHNSb3cgPCBsYXN0Um93Ow0KKyAgICAgICBjb2Rld29yZHNSb3crKykgew0KKyAgICBpZiAoY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpID09IE5VTEwpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICByZXR1cm4gKGludDMyX3QpIChhdmVyYWdlUm93SGVpZ2h0ICsgMC41KTsNCi19DQotQ0JDX0JhcmNvZGVNZXRhZGF0YSogQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbjo6Z2V0QmFyY29kZU1ldGFkYXRhKCkNCi17DQotICAgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0gZ2V0Q29kZXdvcmRzKCk7DQotICAgIENCQ19CYXJjb2RlVmFsdWUgYmFyY29kZUNvbHVtbkNvdW50Ow0KLSAgICBDQkNfQmFyY29kZVZhbHVlIGJhcmNvZGVSb3dDb3VudFVwcGVyUGFydDsNCi0gICAgQ0JDX0JhcmNvZGVWYWx1ZSBiYXJjb2RlUm93Q291bnRMb3dlclBhcnQ7DQotICAgIENCQ19CYXJjb2RlVmFsdWUgYmFyY29kZUVDTGV2ZWw7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGkpOw0KLSAgICAgICAgaWYgKGNvZGV3b3JkID09IE5VTEwpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNvZGV3b3JkLT5zZXRSb3dOdW1iZXJBc1Jvd0luZGljYXRvckNvbHVtbigpOw0KLSAgICAgICAgaW50MzJfdCByb3dJbmRpY2F0b3JWYWx1ZSA9IGNvZGV3b3JkLT5nZXRWYWx1ZSgpICUgMzA7DQotICAgICAgICBpbnQzMl90IGNvZGV3b3JkUm93TnVtYmVyID0gY29kZXdvcmQtPmdldFJvd051bWJlcigpOw0KLSAgICAgICAgaWYgKCFtX2lzTGVmdCkgew0KLSAgICAgICAgICAgIGNvZGV3b3JkUm93TnVtYmVyICs9IDI7DQotICAgICAgICB9DQotICAgICAgICBzd2l0Y2ggKGNvZGV3b3JkUm93TnVtYmVyICUgMykgew0KLSAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgYmFyY29kZVJvd0NvdW50VXBwZXJQYXJ0LnNldFZhbHVlKHJvd0luZGljYXRvclZhbHVlICogMyArIDEpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgIGJhcmNvZGVFQ0xldmVsLnNldFZhbHVlKHJvd0luZGljYXRvclZhbHVlIC8gMyk7DQotICAgICAgICAgICAgICAgIGJhcmNvZGVSb3dDb3VudExvd2VyUGFydC5zZXRWYWx1ZShyb3dJbmRpY2F0b3JWYWx1ZSAlIDMpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgIGJhcmNvZGVDb2x1bW5Db3VudC5zZXRWYWx1ZShyb3dJbmRpY2F0b3JWYWx1ZSArIDEpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCisgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KTsNCisgICAgY29kZXdvcmQtPnNldFJvd051bWJlckFzUm93SW5kaWNhdG9yQ29sdW1uKCk7DQorICAgIGludDMyX3Qgcm93RGlmZmVyZW5jZSA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSAtIGJhcmNvZGVSb3c7DQorICAgIGlmIChyb3dEaWZmZXJlbmNlID09IDApIHsNCisgICAgICBjdXJyZW50Um93SGVpZ2h0Kys7DQorICAgIH0gZWxzZSBpZiAocm93RGlmZmVyZW5jZSA9PSAxKSB7DQorICAgICAgbWF4Um93SGVpZ2h0ID0NCisgICAgICAgICAgbWF4Um93SGVpZ2h0ID4gY3VycmVudFJvd0hlaWdodCA/IG1heFJvd0hlaWdodCA6IGN1cnJlbnRSb3dIZWlnaHQ7DQorICAgICAgY3VycmVudFJvd0hlaWdodCA9IDE7DQorICAgICAgYmFyY29kZVJvdyA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgfSBlbHNlIGlmIChjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkgPj0gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCkpIHsNCisgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgYmFyY29kZVJvdyA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgICBjdXJyZW50Um93SGVpZ2h0ID0gMTsNCiAgICAgfQ0KLSAgICBpZiAoKGJhcmNvZGVDb2x1bW5Db3VudC5nZXRWYWx1ZSgpLT5HZXRTaXplKCkgPT0gMCkgfHwNCi0gICAgICAgICAgICAoYmFyY29kZVJvd0NvdW50VXBwZXJQYXJ0LmdldFZhbHVlKCktPkdldFNpemUoKSA9PSAwKSB8fA0KLSAgICAgICAgICAgIChiYXJjb2RlUm93Q291bnRMb3dlclBhcnQuZ2V0VmFsdWUoKS0+R2V0U2l6ZSgpID09IDApIHx8DQotICAgICAgICAgICAgKGJhcmNvZGVFQ0xldmVsLmdldFZhbHVlKCktPkdldFNpemUoKSA9PSAwKSB8fA0KLSAgICAgICAgICAgIGJhcmNvZGVDb2x1bW5Db3VudC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSA8IDEgfHwNCi0gICAgICAgICAgICBiYXJjb2RlUm93Q291bnRVcHBlclBhcnQuZ2V0VmFsdWUoKS0+R2V0QXQoMCkgKyBiYXJjb2RlUm93Q291bnRMb3dlclBhcnQuZ2V0VmFsdWUoKS0+R2V0QXQoMCkgPCBDQkNfUERGNDE3Q29tbW9uOjpNSU5fUk9XU19JTl9CQVJDT0RFIHx8DQotICAgICAgICAgICAgYmFyY29kZVJvd0NvdW50VXBwZXJQYXJ0LmdldFZhbHVlKCktPkdldEF0KDApICsgYmFyY29kZVJvd0NvdW50TG93ZXJQYXJ0LmdldFZhbHVlKCktPkdldEF0KDApID4gQ0JDX1BERjQxN0NvbW1vbjo6TUFYX1JPV1NfSU5fQkFSQ09ERSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gKGludDMyX3QpKGF2ZXJhZ2VSb3dIZWlnaHQgKyAwLjUpOw0KK30NCitDQkNfQmFyY29kZU1ldGFkYXRhKg0KK0NCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OmdldEJhcmNvZGVNZXRhZGF0YSgpIHsNCisgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0gZ2V0Q29kZXdvcmRzKCk7DQorICBDQkNfQmFyY29kZVZhbHVlIGJhcmNvZGVDb2x1bW5Db3VudDsNCisgIENCQ19CYXJjb2RlVmFsdWUgYmFyY29kZVJvd0NvdW50VXBwZXJQYXJ0Ow0KKyAgQ0JDX0JhcmNvZGVWYWx1ZSBiYXJjb2RlUm93Q291bnRMb3dlclBhcnQ7DQorICBDQkNfQmFyY29kZVZhbHVlIGJhcmNvZGVFQ0xldmVsOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29kZXdvcmRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopY29kZXdvcmRzLT5HZXRBdChpKTsNCisgICAgaWYgKGNvZGV3b3JkID09IE5VTEwpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBDQkNfQmFyY29kZU1ldGFkYXRhKiBiYXJjb2RlTWV0YWRhdGEgPSBGWF9ORVcgQ0JDX0JhcmNvZGVNZXRhZGF0YShiYXJjb2RlQ29sdW1uQ291bnQuZ2V0VmFsdWUoKS0+R2V0QXQoMCksIGJhcmNvZGVSb3dDb3VudFVwcGVyUGFydC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSwgYmFyY29kZVJvd0NvdW50TG93ZXJQYXJ0LmdldFZhbHVlKCktPkdldEF0KDApLCBiYXJjb2RlRUNMZXZlbC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSk7DQotICAgIHJlbW92ZUluY29ycmVjdENvZGV3b3Jkcyhjb2Rld29yZHMsICpiYXJjb2RlTWV0YWRhdGEpOw0KLSAgICByZXR1cm4gYmFyY29kZU1ldGFkYXRhOw0KLX0NCi1GWF9CT09MIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OmlzTGVmdCgpDQotew0KLSAgICByZXR1cm4gbV9pc0xlZnQ7DQotfQ0KLUNGWF9CeXRlU3RyaW5nIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OnRvU3RyaW5nKCkNCi17DQotICAgIHJldHVybiAoQ0ZYX0J5dGVTdHJpbmcpIklzTGVmdDogIiArIChDRlhfQnl0ZVN0cmluZyltX2lzTGVmdCArICdcbicgKyBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjp0b1N0cmluZygpOw0KLX0NCi12b2lkIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OnJlbW92ZUluY29ycmVjdENvZGV3b3JkcyhDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcywgQ0JDX0JhcmNvZGVNZXRhZGF0YSBiYXJjb2RlTWV0YWRhdGEpDQotew0KLSAgICBmb3IgKGludDMyX3QgY29kZXdvcmRSb3cgPSAwOyBjb2Rld29yZFJvdyA8IGNvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBjb2Rld29yZFJvdysrKSB7DQotICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZFJvdyk7DQotICAgICAgICBpZiAoY29kZXdvcmQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCByb3dJbmRpY2F0b3JWYWx1ZSA9IGNvZGV3b3JkLT5nZXRWYWx1ZSgpICUgMzA7DQotICAgICAgICBpbnQzMl90IGNvZGV3b3JkUm93TnVtYmVyID0gY29kZXdvcmQtPmdldFJvd051bWJlcigpOw0KLSAgICAgICAgaWYgKGNvZGV3b3JkUm93TnVtYmVyID4gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCkpIHsNCi0gICAgICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3JkUm93LCBOVUxMKTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghbV9pc0xlZnQpIHsNCi0gICAgICAgICAgICBjb2Rld29yZFJvd051bWJlciArPSAyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3dpdGNoIChjb2Rld29yZFJvd051bWJlciAlIDMpIHsNCi0gICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgIGlmIChyb3dJbmRpY2F0b3JWYWx1ZSAqIDMgKyAxICE9IGJhcmNvZGVNZXRhZGF0YS5nZXRSb3dDb3VudFVwcGVyUGFydCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3JkUm93LCBOVUxMKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgIGlmIChyb3dJbmRpY2F0b3JWYWx1ZSAvIDMgIT0gYmFyY29kZU1ldGFkYXRhLmdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRpY2F0b3JWYWx1ZSAlIDMgIT0gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50TG93ZXJQYXJ0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvZGV3b3Jkcy0+U2V0QXQoY29kZXdvcmRSb3csIE5VTEwpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgaWYgKHJvd0luZGljYXRvclZhbHVlICsgMSAhPSBiYXJjb2RlTWV0YWRhdGEuZ2V0Q29sdW1uQ291bnQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29kZXdvcmRzLT5TZXRBdChjb2Rld29yZFJvdywgTlVMTCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQorICAgIGNvZGV3b3JkLT5zZXRSb3dOdW1iZXJBc1Jvd0luZGljYXRvckNvbHVtbigpOw0KKyAgICBpbnQzMl90IHJvd0luZGljYXRvclZhbHVlID0gY29kZXdvcmQtPmdldFZhbHVlKCkgJSAzMDsNCisgICAgaW50MzJfdCBjb2Rld29yZFJvd051bWJlciA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgaWYgKCFtX2lzTGVmdCkgew0KKyAgICAgIGNvZGV3b3JkUm93TnVtYmVyICs9IDI7DQogICAgIH0NCisgICAgc3dpdGNoIChjb2Rld29yZFJvd051bWJlciAlIDMpIHsNCisgICAgICBjYXNlIDA6DQorICAgICAgICBiYXJjb2RlUm93Q291bnRVcHBlclBhcnQuc2V0VmFsdWUocm93SW5kaWNhdG9yVmFsdWUgKiAzICsgMSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDE6DQorICAgICAgICBiYXJjb2RlRUNMZXZlbC5zZXRWYWx1ZShyb3dJbmRpY2F0b3JWYWx1ZSAvIDMpOw0KKyAgICAgICAgYmFyY29kZVJvd0NvdW50TG93ZXJQYXJ0LnNldFZhbHVlKHJvd0luZGljYXRvclZhbHVlICUgMyk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDI6DQorICAgICAgICBiYXJjb2RlQ29sdW1uQ291bnQuc2V0VmFsdWUocm93SW5kaWNhdG9yVmFsdWUgKyAxKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoKGJhcmNvZGVDb2x1bW5Db3VudC5nZXRWYWx1ZSgpLT5HZXRTaXplKCkgPT0gMCkgfHwNCisgICAgICAoYmFyY29kZVJvd0NvdW50VXBwZXJQYXJ0LmdldFZhbHVlKCktPkdldFNpemUoKSA9PSAwKSB8fA0KKyAgICAgIChiYXJjb2RlUm93Q291bnRMb3dlclBhcnQuZ2V0VmFsdWUoKS0+R2V0U2l6ZSgpID09IDApIHx8DQorICAgICAgKGJhcmNvZGVFQ0xldmVsLmdldFZhbHVlKCktPkdldFNpemUoKSA9PSAwKSB8fA0KKyAgICAgIGJhcmNvZGVDb2x1bW5Db3VudC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSA8IDEgfHwNCisgICAgICBiYXJjb2RlUm93Q291bnRVcHBlclBhcnQuZ2V0VmFsdWUoKS0+R2V0QXQoMCkgKw0KKyAgICAgICAgICAgICAgYmFyY29kZVJvd0NvdW50TG93ZXJQYXJ0LmdldFZhbHVlKCktPkdldEF0KDApIDwNCisgICAgICAgICAgQ0JDX1BERjQxN0NvbW1vbjo6TUlOX1JPV1NfSU5fQkFSQ09ERSB8fA0KKyAgICAgIGJhcmNvZGVSb3dDb3VudFVwcGVyUGFydC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSArDQorICAgICAgICAgICAgICBiYXJjb2RlUm93Q291bnRMb3dlclBhcnQuZ2V0VmFsdWUoKS0+R2V0QXQoMCkgPg0KKyAgICAgICAgICBDQkNfUERGNDE3Q29tbW9uOjpNQVhfUk9XU19JTl9CQVJDT0RFKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0JDX0JhcmNvZGVNZXRhZGF0YSogYmFyY29kZU1ldGFkYXRhID0NCisgICAgICBGWF9ORVcgQ0JDX0JhcmNvZGVNZXRhZGF0YShiYXJjb2RlQ29sdW1uQ291bnQuZ2V0VmFsdWUoKS0+R2V0QXQoMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyY29kZVJvd0NvdW50VXBwZXJQYXJ0LmdldFZhbHVlKCktPkdldEF0KDApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmNvZGVSb3dDb3VudExvd2VyUGFydC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJjb2RlRUNMZXZlbC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSk7DQorICByZW1vdmVJbmNvcnJlY3RDb2Rld29yZHMoY29kZXdvcmRzLCAqYmFyY29kZU1ldGFkYXRhKTsNCisgIHJldHVybiBiYXJjb2RlTWV0YWRhdGE7DQorfQ0KK0ZYX0JPT0wgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbjo6aXNMZWZ0KCkgew0KKyAgcmV0dXJuIG1faXNMZWZ0Ow0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOjp0b1N0cmluZygpIHsNCisgIHJldHVybiAoQ0ZYX0J5dGVTdHJpbmcpICJJc0xlZnQ6ICIgKyAoQ0ZYX0J5dGVTdHJpbmcpbV9pc0xlZnQgKyAnXG4nICsNCisgICAgICAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjp0b1N0cmluZygpOw0KK30NCit2b2lkIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OnJlbW92ZUluY29ycmVjdENvZGV3b3JkcygNCisgICAgQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMsDQorICAgIENCQ19CYXJjb2RlTWV0YWRhdGEgYmFyY29kZU1ldGFkYXRhKSB7DQorICBmb3IgKGludDMyX3QgY29kZXdvcmRSb3cgPSAwOyBjb2Rld29yZFJvdyA8IGNvZGV3b3Jkcy0+R2V0U2l6ZSgpOw0KKyAgICAgICBjb2Rld29yZFJvdysrKSB7DQorICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3JkUm93KTsNCisgICAgaWYgKGNvZGV3b3JkID09IE5VTEwpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpbnQzMl90IHJvd0luZGljYXRvclZhbHVlID0gY29kZXdvcmQtPmdldFZhbHVlKCkgJSAzMDsNCisgICAgaW50MzJfdCBjb2Rld29yZFJvd051bWJlciA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgaWYgKGNvZGV3b3JkUm93TnVtYmVyID4gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCkpIHsNCisgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3JkUm93LCBOVUxMKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoIW1faXNMZWZ0KSB7DQorICAgICAgY29kZXdvcmRSb3dOdW1iZXIgKz0gMjsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKGNvZGV3b3JkUm93TnVtYmVyICUgMykgew0KKyAgICAgIGNhc2UgMDoNCisgICAgICAgIGlmIChyb3dJbmRpY2F0b3JWYWx1ZSAqIDMgKyAxICE9DQorICAgICAgICAgICAgYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50VXBwZXJQYXJ0KCkpIHsNCisgICAgICAgICAgY29kZXdvcmRzLT5TZXRBdChjb2Rld29yZFJvdywgTlVMTCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDE6DQorICAgICAgICBpZiAocm93SW5kaWNhdG9yVmFsdWUgLyAzICE9DQorICAgICAgICAgICAgICAgIGJhcmNvZGVNZXRhZGF0YS5nZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpIHx8DQorICAgICAgICAgICAgcm93SW5kaWNhdG9yVmFsdWUgJSAzICE9IGJhcmNvZGVNZXRhZGF0YS5nZXRSb3dDb3VudExvd2VyUGFydCgpKSB7DQorICAgICAgICAgIGNvZGV3b3Jkcy0+U2V0QXQoY29kZXdvcmRSb3csIE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAyOg0KKyAgICAgICAgaWYgKHJvd0luZGljYXRvclZhbHVlICsgMSAhPSBiYXJjb2RlTWV0YWRhdGEuZ2V0Q29sdW1uQ291bnQoKSkgew0KKyAgICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3JkUm93LCBOVUxMKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4uaAppbmRleCBmODA5MjMxLi4zZGFlMGU4IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5oCkBAIC05LDIwICs5LDI0IEBACiBjbGFzcyBDQkNfQmFyY29kZU1ldGFkYXRhOw0KIGNsYXNzIENCQ19Cb3VuZGluZ0JveDsNCiBjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOw0KLWNsYXNzIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4gOiBwdWJsaWMgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4oQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCwgRlhfQk9PTCBpc0xlZnQpOw0KLSAgICB2aXJ0dWFsIH5DQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKCk7DQotICAgIHZvaWQgc2V0Um93TnVtYmVycygpOw0KLSAgICBpbnQzMl90IGFkanVzdENvbXBsZXRlSW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycyhDQkNfQmFyY29kZU1ldGFkYXRhIGJhcmNvZGVNZXRhZGF0YSk7DQotICAgIENGWF9JbnQzMkFycmF5KiBnZXRSb3dIZWlnaHRzKGludDMyX3QgJmUpOw0KLSAgICBpbnQzMl90IGFkanVzdEluY29tcGxldGVJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKENCQ19CYXJjb2RlTWV0YWRhdGEgYmFyY29kZU1ldGFkYXRhKTsNCi0gICAgQ0JDX0JhcmNvZGVNZXRhZGF0YSogZ2V0QmFyY29kZU1ldGFkYXRhKCk7DQotICAgIEZYX0JPT0wgaXNMZWZ0KCk7DQotICAgIENGWF9CeXRlU3RyaW5nIHRvU3RyaW5nKCk7DQotcHJpdmF0ZToNCi0gICAgRlhfQk9PTCBtX2lzTGVmdDsNCi0gICAgdm9pZCByZW1vdmVJbmNvcnJlY3RDb2Rld29yZHMoQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMsIENCQ19CYXJjb2RlTWV0YWRhdGEgYmFyY29kZU1ldGFkYXRhKTsNCitjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uIDogcHVibGljIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4gew0KKyBwdWJsaWM6DQorICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNMZWZ0KTsNCisgIHZpcnR1YWwgfkNCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4oKTsNCisgIHZvaWQgc2V0Um93TnVtYmVycygpOw0KKyAgaW50MzJfdCBhZGp1c3RDb21wbGV0ZUluZGljYXRvckNvbHVtblJvd051bWJlcnMoDQorICAgICAgQ0JDX0JhcmNvZGVNZXRhZGF0YSBiYXJjb2RlTWV0YWRhdGEpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGdldFJvd0hlaWdodHMoaW50MzJfdCYgZSk7DQorICBpbnQzMl90IGFkanVzdEluY29tcGxldGVJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKA0KKyAgICAgIENCQ19CYXJjb2RlTWV0YWRhdGEgYmFyY29kZU1ldGFkYXRhKTsNCisgIENCQ19CYXJjb2RlTWV0YWRhdGEqIGdldEJhcmNvZGVNZXRhZGF0YSgpOw0KKyAgRlhfQk9PTCBpc0xlZnQoKTsNCisgIENGWF9CeXRlU3RyaW5nIHRvU3RyaW5nKCk7DQorDQorIHByaXZhdGU6DQorICBGWF9CT09MIG1faXNMZWZ0Ow0KKyAgdm9pZCByZW1vdmVJbmNvcnJlY3RDb2Rld29yZHMoQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQmFyY29kZU1ldGFkYXRhIGJhcmNvZGVNZXRhZGF0YSk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3IuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yLmNwcAppbmRleCA3MjZlMGVjLi4yNGVmOTM1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3IuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rvci5jcHAKQEAgLTI3LDEzICsyNywxNiBAQAogI2luY2x1ZGUgIi4uL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5oIg0KICNpbmNsdWRlICJCQ19QREY0MTdEZXRlY3RvclJlc3VsdC5oIg0KICNpbmNsdWRlICJCQ19QREY0MTdEZXRlY3Rvci5oIg0KLSNkZWZpbmUgIElOVEVSR0VSX01BWCAgICAgMjE0NzQ4MzY0Nw0KKyNkZWZpbmUgSU5URVJHRVJfTUFYIDIxNDc0ODM2NDcNCiBpbnQzMl90IENCQ19EZXRlY3Rvcjo6SU5ERVhFU19TVEFSVF9QQVRURVJOW10gPSB7MCwgNCwgMSwgNX07DQogaW50MzJfdCBDQkNfRGV0ZWN0b3I6OklOREVYRVNfU1RPUF9QQVRURVJOW10gPSB7NiwgMiwgNywgM307DQogaW50MzJfdCBDQkNfRGV0ZWN0b3I6OklOVEVHRVJfTUFUSF9TSElGVCA9IDg7DQotaW50MzJfdCBDQkNfRGV0ZWN0b3I6OlBBVFRFUk5fTUFUQ0hfUkVTVUxUX1NDQUxFX0ZBQ1RPUiA9IDEgPDwgSU5URUdFUl9NQVRIX1NISUZUOw0KLWludDMyX3QgQ0JDX0RldGVjdG9yOjpNQVhfQVZHX1ZBUklBTkNFID0gKGludDMyX3QpIChQQVRURVJOX01BVENIX1JFU1VMVF9TQ0FMRV9GQUNUT1IgKiAwLjQyZik7DQotaW50MzJfdCBDQkNfRGV0ZWN0b3I6Ok1BWF9JTkRJVklEVUFMX1ZBUklBTkNFID0gKGludDMyX3QpIChQQVRURVJOX01BVENIX1JFU1VMVF9TQ0FMRV9GQUNUT1IgKiAwLjhmKTsNCitpbnQzMl90IENCQ19EZXRlY3Rvcjo6UEFUVEVSTl9NQVRDSF9SRVNVTFRfU0NBTEVfRkFDVE9SID0gMQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJTlRFR0VSX01BVEhfU0hJRlQ7DQoraW50MzJfdCBDQkNfRGV0ZWN0b3I6Ok1BWF9BVkdfVkFSSUFOQ0UgPQ0KKyAgICAoaW50MzJfdCkoUEFUVEVSTl9NQVRDSF9SRVNVTFRfU0NBTEVfRkFDVE9SICogMC40MmYpOw0KK2ludDMyX3QgQ0JDX0RldGVjdG9yOjpNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRSA9DQorICAgIChpbnQzMl90KShQQVRURVJOX01BVENIX1JFU1VMVF9TQ0FMRV9GQUNUT1IgKiAwLjhmKTsNCiBpbnQzMl90IENCQ19EZXRlY3Rvcjo6U1RBUlRfUEFUVEVSTltdID0gezgsIDEsIDEsIDEsIDEsIDEsIDEsIDN9Ow0KIGludDMyX3QgQ0JDX0RldGVjdG9yOjpTVE9QX1BBVFRFUk5bXSA9IHs3LCAxLCAxLCAzLCAxLCAxLCAxLCAyLCAxfTsNCiBpbnQzMl90IENCQ19EZXRlY3Rvcjo6TUFYX1BJWEVMX0RSSUZUID0gMzsNCkBAIC00MSwyNzEgKzQ0LDMwNyBAQAogaW50MzJfdCBDQkNfRGV0ZWN0b3I6OlNLSVBQRURfUk9XX0NPVU5UX01BWCA9IDI1Ow0KIGludDMyX3QgQ0JDX0RldGVjdG9yOjpST1dfU1RFUCA9IDU7DQogaW50MzJfdCBDQkNfRGV0ZWN0b3I6OkJBUkNPREVfTUlOX0hFSUdIVCA9IDEwOw0KLUNCQ19EZXRlY3Rvcjo6Q0JDX0RldGVjdG9yKCkNCi17DQotfQ0KLUNCQ19EZXRlY3Rvcjo6fkNCQ19EZXRlY3RvcigpDQotew0KLX0NCi1DQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQqIENCQ19EZXRlY3Rvcjo6ZGV0ZWN0KENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLCBpbnQzMl90IGhpbnRzLCBGWF9CT09MIG11bHRpcGxlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0TWF0cml4ID0gaW1hZ2UtPkdldEJsYWNrTWF0cml4KGUpOw0KK0NCQ19EZXRlY3Rvcjo6Q0JDX0RldGVjdG9yKCkge30NCitDQkNfRGV0ZWN0b3I6On5DQkNfRGV0ZWN0b3IoKSB7fQ0KK0NCQ19QREY0MTdEZXRlY3RvclJlc3VsdCogQ0JDX0RldGVjdG9yOjpkZXRlY3QoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBtdWx0aXBsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCA9IGltYWdlLT5HZXRCbGFja01hdHJpeChlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENGWF9QdHJBcnJheSogYmFyY29kZUNvb3JkaW5hdGVzID0gZGV0ZWN0KG11bHRpcGxlLCBiaXRNYXRyaXgpOw0KKyAgaWYgKGJhcmNvZGVDb29yZGluYXRlcy0+R2V0U2l6ZSgpID09IDApIHsNCisgICAgcm90YXRlMTgwKGJpdE1hdHJpeCk7DQorICAgIGJhcmNvZGVDb29yZGluYXRlcyA9IGRldGVjdChtdWx0aXBsZSwgYml0TWF0cml4KTsNCisgIH0NCisgIGlmIChiYXJjb2RlQ29vcmRpbmF0ZXMtPkdldFNpemUoKSA9PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvblVuU3VwcG9ydGVkQmFyY29kZTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDRlhfUHRyQXJyYXkqIGJhcmNvZGVDb29yZGluYXRlcyA9IGRldGVjdChtdWx0aXBsZSwgYml0TWF0cml4KTsNCi0gICAgaWYgKGJhcmNvZGVDb29yZGluYXRlcy0+R2V0U2l6ZSgpID09IDApIHsNCi0gICAgICAgIHJvdGF0ZTE4MChiaXRNYXRyaXgpOw0KLSAgICAgICAgYmFyY29kZUNvb3JkaW5hdGVzID0gZGV0ZWN0KG11bHRpcGxlLCBiaXRNYXRyaXgpOw0KLSAgICB9DQotICAgIGlmIChiYXJjb2RlQ29vcmRpbmF0ZXMtPkdldFNpemUoKSA9PSAwKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25VblN1cHBvcnRlZEJhcmNvZGU7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIH0NCi0gICAgQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0KiBkZXRlY3RvclJlc3VsdCA9IEZYX05FVyBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQoYml0TWF0cml4LCBiYXJjb2RlQ29vcmRpbmF0ZXMpOw0KLSAgICByZXR1cm4gZGV0ZWN0b3JSZXN1bHQ7DQorICB9DQorICBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQqIGRldGVjdG9yUmVzdWx0ID0NCisgICAgICBGWF9ORVcgQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0KGJpdE1hdHJpeCwgYmFyY29kZUNvb3JkaW5hdGVzKTsNCisgIHJldHVybiBkZXRlY3RvclJlc3VsdDsNCiB9DQotdm9pZCBDQkNfRGV0ZWN0b3I6OnJvdGF0ZTE4MChDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRNYXRyaXgpDQotew0KLSAgICBpbnQzMl90IHdpZHRoID0gYml0TWF0cml4LT5HZXRXaWR0aCgpOw0KLSAgICBpbnQzMl90IGhlaWdodCA9IGJpdE1hdHJpeC0+R2V0SGVpZ2h0KCk7DQotICAgIENCQ19Db21tb25CaXRBcnJheSogZmlyc3RSb3dCaXRBcnJheSA9IEZYX05FVyBDQkNfQ29tbW9uQml0QXJyYXkod2lkdGgpOw0KLSAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHNlY29uZFJvd0JpdEFycmF5ID0gRlhfTkVXIENCQ19Db21tb25CaXRBcnJheSh3aWR0aCk7DQotICAgIENCQ19Db21tb25CaXRBcnJheSogdG1wQml0QXJyYXkgPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdEFycmF5KHdpZHRoKTsNCi0gICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpID4+IDE7IHkrKykgew0KLSAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiB0ZW1wID0gYml0TWF0cml4LT5HZXRSb3coaGVpZ2h0IC0gMSAtIHksIHNlY29uZFJvd0JpdEFycmF5KTsNCi0gICAgICAgIENCQ19Db21tb25CaXRBcnJheSogdGVtcGZpcnN0Um93ID0gZmlyc3RSb3dCaXRBcnJheTsNCi0gICAgICAgIGZpcnN0Um93Qml0QXJyYXkgPSBiaXRNYXRyaXgtPkdldFJvdyh5LCB0ZW1wZmlyc3RSb3cpOw0KLSAgICAgICAgZGVsZXRlIHRlbXBmaXJzdFJvdzsNCi0gICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93ID0gbWlycm9yKHRlbXAsIHRtcEJpdEFycmF5KTsNCi0gICAgICAgIGRlbGV0ZSB0ZW1wOw0KLSAgICAgICAgYml0TWF0cml4LT5TZXRSb3coeSwgcm93KTsNCi0gICAgICAgIGRlbGV0ZSByb3c7DQotICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvd2ZpcnN0Um93ID0gbWlycm9yKGZpcnN0Um93Qml0QXJyYXksIHRtcEJpdEFycmF5KTsNCi0gICAgICAgIGJpdE1hdHJpeC0+U2V0Um93KGhlaWdodCAtIDEgLSB5LCByb3dmaXJzdFJvdyk7DQotICAgICAgICBkZWxldGUgcm93Zmlyc3RSb3c7DQotICAgIH0NCi0gICAgZGVsZXRlIHRtcEJpdEFycmF5Ow0KLSAgICBkZWxldGUgZmlyc3RSb3dCaXRBcnJheTsNCi0gICAgZGVsZXRlIHNlY29uZFJvd0JpdEFycmF5Ow0KK3ZvaWQgQ0JDX0RldGVjdG9yOjpyb3RhdGUxODAoQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0TWF0cml4KSB7DQorICBpbnQzMl90IHdpZHRoID0gYml0TWF0cml4LT5HZXRXaWR0aCgpOw0KKyAgaW50MzJfdCBoZWlnaHQgPSBiaXRNYXRyaXgtPkdldEhlaWdodCgpOw0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KiBmaXJzdFJvd0JpdEFycmF5ID0gRlhfTkVXIENCQ19Db21tb25CaXRBcnJheSh3aWR0aCk7DQorICBDQkNfQ29tbW9uQml0QXJyYXkqIHNlY29uZFJvd0JpdEFycmF5ID0gRlhfTkVXIENCQ19Db21tb25CaXRBcnJheSh3aWR0aCk7DQorICBDQkNfQ29tbW9uQml0QXJyYXkqIHRtcEJpdEFycmF5ID0gRlhfTkVXIENCQ19Db21tb25CaXRBcnJheSh3aWR0aCk7DQorICBmb3IgKGludDMyX3QgeSA9IDA7IHk8KGhlaWdodCArIDEpPj4gMTsgeSsrKSB7DQorICAgIENCQ19Db21tb25CaXRBcnJheSogdGVtcCA9DQorICAgICAgICBiaXRNYXRyaXgtPkdldFJvdyhoZWlnaHQgLSAxIC0geSwgc2Vjb25kUm93Qml0QXJyYXkpOw0KKyAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHRlbXBmaXJzdFJvdyA9IGZpcnN0Um93Qml0QXJyYXk7DQorICAgIGZpcnN0Um93Qml0QXJyYXkgPSBiaXRNYXRyaXgtPkdldFJvdyh5LCB0ZW1wZmlyc3RSb3cpOw0KKyAgICBkZWxldGUgdGVtcGZpcnN0Um93Ow0KKyAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdyA9IG1pcnJvcih0ZW1wLCB0bXBCaXRBcnJheSk7DQorICAgIGRlbGV0ZSB0ZW1wOw0KKyAgICBiaXRNYXRyaXgtPlNldFJvdyh5LCByb3cpOw0KKyAgICBkZWxldGUgcm93Ow0KKyAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvd2ZpcnN0Um93ID0gbWlycm9yKGZpcnN0Um93Qml0QXJyYXksIHRtcEJpdEFycmF5KTsNCisgICAgYml0TWF0cml4LT5TZXRSb3coaGVpZ2h0IC0gMSAtIHksIHJvd2ZpcnN0Um93KTsNCisgICAgZGVsZXRlIHJvd2ZpcnN0Um93Ow0KKyAgfQ0KKyAgZGVsZXRlIHRtcEJpdEFycmF5Ow0KKyAgZGVsZXRlIGZpcnN0Um93Qml0QXJyYXk7DQorICBkZWxldGUgc2Vjb25kUm93Qml0QXJyYXk7DQogfQ0KLUNCQ19Db21tb25CaXRBcnJheSogQ0JDX0RldGVjdG9yOjptaXJyb3IoQ0JDX0NvbW1vbkJpdEFycmF5KiBpbnB1dCwgQ0JDX0NvbW1vbkJpdEFycmF5KiByZXN1bHQpDQotew0KLSAgICBDQkNfQ29tbW9uQml0QXJyYXkqIGFycmF5ID0gRlhfTkVXIENCQ19Db21tb25CaXRBcnJheShyZXN1bHQtPkdldFNpemUoKSk7DQotICAgIGFycmF5LT5DbGVhcigpOw0KLSAgICBpbnQzMl90IHNpemUgPSBpbnB1dC0+R2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCi0gICAgICAgIGlmIChpbnB1dC0+R2V0KGkpKSB7DQotICAgICAgICAgICAgYXJyYXktPlNldChzaXplIC0gMSAtIGkpOw0KLSAgICAgICAgfQ0KK0NCQ19Db21tb25CaXRBcnJheSogQ0JDX0RldGVjdG9yOjptaXJyb3IoQ0JDX0NvbW1vbkJpdEFycmF5KiBpbnB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcmVzdWx0KSB7DQorICBDQkNfQ29tbW9uQml0QXJyYXkqIGFycmF5ID0gRlhfTkVXIENCQ19Db21tb25CaXRBcnJheShyZXN1bHQtPkdldFNpemUoKSk7DQorICBhcnJheS0+Q2xlYXIoKTsNCisgIGludDMyX3Qgc2l6ZSA9IGlucHV0LT5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisgICAgaWYgKGlucHV0LT5HZXQoaSkpIHsNCisgICAgICBhcnJheS0+U2V0KHNpemUgLSAxIC0gaSk7DQogICAgIH0NCi0gICAgcmV0dXJuIGFycmF5Ow0KKyAgfQ0KKyAgcmV0dXJuIGFycmF5Ow0KIH0NCi1DRlhfUHRyQXJyYXkqIENCQ19EZXRlY3Rvcjo6ZGV0ZWN0KEZYX0JPT0wgbXVsdGlwbGUsIENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCkNCi17DQotICAgIENGWF9QdHJBcnJheSogYmFyY29kZUNvb3JkaW5hdGVzID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCi0gICAgaW50MzJfdCByb3cgPSAwOw0KLSAgICBpbnQzMl90IGNvbHVtbiA9IDA7DQotICAgIEZYX0JPT0wgZm91bmRCYXJjb2RlSW5Sb3cgPSBGQUxTRTsNCi0gICAgd2hpbGUgKHJvdyA8IGJpdE1hdHJpeC0+R2V0SGVpZ2h0KCkpIHsNCi0gICAgICAgIENGWF9QdHJBcnJheSogdmVydGljZXMgPSBmaW5kVmVydGljZXMoYml0TWF0cml4LCByb3csIGNvbHVtbik7DQotICAgICAgICBpZiAodmVydGljZXMtPkdldEF0KDApID09IE5VTEwgJiYgdmVydGljZXMtPkdldEF0KDMpID09IE5VTEwpIHsNCi0gICAgICAgICAgICBpZiAoIWZvdW5kQmFyY29kZUluUm93KSB7DQotICAgICAgICAgICAgICAgIGlmICh2ZXJ0aWNlcykgew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlKHZlcnRpY2VzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZm91bmRCYXJjb2RlSW5Sb3cgPSBGQUxTRTsNCi0gICAgICAgICAgICBjb2x1bW4gPSAwOw0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJhcmNvZGVDb29yZGluYXRlcy0+R2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBiYXJjb2RlQ29vcmRpbmF0ZSA9IChDRlhfUHRyQXJyYXkqKWJhcmNvZGVDb29yZGluYXRlcy0+R2V0QXQoaSk7DQotICAgICAgICAgICAgICAgIGlmIChiYXJjb2RlQ29vcmRpbmF0ZS0+R2V0QXQoMSkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgcm93ID0gcm93ID4gKChDQkNfUmVzdWx0UG9pbnQqKWJhcmNvZGVDb29yZGluYXRlLT5HZXRBdCgxKSktPkdldFkoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoYmFyY29kZUNvb3JkaW5hdGUtPkdldEF0KDMpICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJvdyA9IHJvdyA+ICgoQ0JDX1Jlc3VsdFBvaW50KiliYXJjb2RlQ29vcmRpbmF0ZS0+R2V0QXQoMykpLT5HZXRZKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcm93ICs9IFJPV19TVEVQOw0KLSAgICAgICAgICAgIGlmICh2ZXJ0aWNlcykgew0KLSAgICAgICAgICAgICAgICBkZWxldGUodmVydGljZXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb250aW51ZTsNCitDRlhfUHRyQXJyYXkqIENCQ19EZXRlY3Rvcjo6ZGV0ZWN0KEZYX0JPT0wgbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRNYXRyaXgpIHsNCisgIENGWF9QdHJBcnJheSogYmFyY29kZUNvb3JkaW5hdGVzID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgIGludDMyX3Qgcm93ID0gMDsNCisgIGludDMyX3QgY29sdW1uID0gMDsNCisgIEZYX0JPT0wgZm91bmRCYXJjb2RlSW5Sb3cgPSBGQUxTRTsNCisgIHdoaWxlIChyb3cgPCBiaXRNYXRyaXgtPkdldEhlaWdodCgpKSB7DQorICAgIENGWF9QdHJBcnJheSogdmVydGljZXMgPSBmaW5kVmVydGljZXMoYml0TWF0cml4LCByb3csIGNvbHVtbik7DQorICAgIGlmICh2ZXJ0aWNlcy0+R2V0QXQoMCkgPT0gTlVMTCAmJiB2ZXJ0aWNlcy0+R2V0QXQoMykgPT0gTlVMTCkgew0KKyAgICAgIGlmICghZm91bmRCYXJjb2RlSW5Sb3cpIHsNCisgICAgICAgIGlmICh2ZXJ0aWNlcykgew0KKyAgICAgICAgICBkZWxldGUgKHZlcnRpY2VzKTsNCiAgICAgICAgIH0NCi0gICAgICAgIGZvdW5kQmFyY29kZUluUm93ID0gVFJVRTsNCi0gICAgICAgIGJhcmNvZGVDb29yZGluYXRlcy0+QWRkKHZlcnRpY2VzKTsNCi0gICAgICAgIGlmICghbXVsdGlwbGUpIHsNCi0gICAgICAgICAgICBicmVhazsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBmb3VuZEJhcmNvZGVJblJvdyA9IEZBTFNFOw0KKyAgICAgIGNvbHVtbiA9IDA7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYmFyY29kZUNvb3JkaW5hdGVzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgQ0ZYX1B0ckFycmF5KiBiYXJjb2RlQ29vcmRpbmF0ZSA9DQorICAgICAgICAgICAgKENGWF9QdHJBcnJheSopYmFyY29kZUNvb3JkaW5hdGVzLT5HZXRBdChpKTsNCisgICAgICAgIGlmIChiYXJjb2RlQ29vcmRpbmF0ZS0+R2V0QXQoMSkgIT0gTlVMTCkgew0KKyAgICAgICAgICByb3cgPSByb3cgPiAoKENCQ19SZXN1bHRQb2ludCopYmFyY29kZUNvb3JkaW5hdGUtPkdldEF0KDEpKS0+R2V0WSgpOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYgKHZlcnRpY2VzLT5HZXRBdCgyKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgY29sdW1uID0gKGludDMyX3QpICgoQ0JDX1Jlc3VsdFBvaW50Kil2ZXJ0aWNlcy0+R2V0QXQoMikpLT5HZXRYKCk7DQotICAgICAgICAgICAgcm93ID0gKGludDMyX3QpICgoQ0JDX1Jlc3VsdFBvaW50Kil2ZXJ0aWNlcy0+R2V0QXQoMikpLT5HZXRZKCk7DQorICAgICAgICBpZiAoYmFyY29kZUNvb3JkaW5hdGUtPkdldEF0KDMpICE9IE5VTEwpIHsNCisgICAgICAgICAgcm93ID0gcm93ID4gKChDQkNfUmVzdWx0UG9pbnQqKWJhcmNvZGVDb29yZGluYXRlLT5HZXRBdCgzKSktPkdldFkoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcm93ICs9IFJPV19TVEVQOw0KKyAgICAgIGlmICh2ZXJ0aWNlcykgew0KKyAgICAgICAgZGVsZXRlICh2ZXJ0aWNlcyk7DQorICAgICAgfQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGZvdW5kQmFyY29kZUluUm93ID0gVFJVRTsNCisgICAgYmFyY29kZUNvb3JkaW5hdGVzLT5BZGQodmVydGljZXMpOw0KKyAgICBpZiAoIW11bHRpcGxlKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKHZlcnRpY2VzLT5HZXRBdCgyKSAhPSBOVUxMKSB7DQorICAgICAgY29sdW1uID0gKGludDMyX3QpKChDQkNfUmVzdWx0UG9pbnQqKXZlcnRpY2VzLT5HZXRBdCgyKSktPkdldFgoKTsNCisgICAgICByb3cgPSAoaW50MzJfdCkoKENCQ19SZXN1bHRQb2ludCopdmVydGljZXMtPkdldEF0KDIpKS0+R2V0WSgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNvbHVtbiA9IChpbnQzMl90KSgoQ0JDX1Jlc3VsdFBvaW50Kil2ZXJ0aWNlcy0+R2V0QXQoNCkpLT5HZXRYKCk7DQorICAgICAgcm93ID0gKGludDMyX3QpKChDQkNfUmVzdWx0UG9pbnQqKXZlcnRpY2VzLT5HZXRBdCg0KSktPkdldFkoKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGJhcmNvZGVDb29yZGluYXRlczsNCit9DQorQ0ZYX1B0ckFycmF5KiBDQkNfRGV0ZWN0b3I6OmZpbmRWZXJ0aWNlcyhDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0Um93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydENvbHVtbikgew0KKyAgaW50MzJfdCBoZWlnaHQgPSBtYXRyaXgtPkdldEhlaWdodCgpOw0KKyAgaW50MzJfdCB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCisgIENGWF9QdHJBcnJheSogcmVzdWx0ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgIHJlc3VsdC0+U2V0U2l6ZSg4KTsNCisgIENGWF9QdHJBcnJheSogc3RhcnRwdHIgPSBmaW5kUm93c1dpdGhQYXR0ZXJuKA0KKyAgICAgIG1hdHJpeCwgaGVpZ2h0LCB3aWR0aCwgc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBTVEFSVF9QQVRURVJOLA0KKyAgICAgIHNpemVvZihTVEFSVF9QQVRURVJOKSAvIHNpemVvZihTVEFSVF9QQVRURVJOWzBdKSk7DQorICBjb3B5VG9SZXN1bHQoDQorICAgICAgcmVzdWx0LCBzdGFydHB0ciwgSU5ERVhFU19TVEFSVF9QQVRURVJOLA0KKyAgICAgIHNpemVvZihJTkRFWEVTX1NUQVJUX1BBVFRFUk4pIC8gc2l6ZW9mKElOREVYRVNfU1RBUlRfUEFUVEVSTlswXSkpOw0KKyAgc3RhcnRwdHItPlJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIHN0YXJ0cHRyOw0KKyAgaWYgKHJlc3VsdC0+R2V0QXQoNCkgIT0gTlVMTCkgew0KKyAgICBzdGFydENvbHVtbiA9IChpbnQzMl90KSgoQ0JDX1Jlc3VsdFBvaW50KilyZXN1bHQtPkdldEF0KDQpKS0+R2V0WCgpOw0KKyAgICBzdGFydFJvdyA9IChpbnQzMl90KSgoQ0JDX1Jlc3VsdFBvaW50KilyZXN1bHQtPkdldEF0KDQpKS0+R2V0WSgpOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiBzdG9wcHRyID0gZmluZFJvd3NXaXRoUGF0dGVybigNCisgICAgICBtYXRyaXgsIGhlaWdodCwgd2lkdGgsIHN0YXJ0Um93LCBzdGFydENvbHVtbiwgU1RPUF9QQVRURVJOLA0KKyAgICAgIHNpemVvZihTVE9QX1BBVFRFUk4pIC8gc2l6ZW9mKFNUT1BfUEFUVEVSTlswXSkpOw0KKyAgY29weVRvUmVzdWx0KHJlc3VsdCwgc3RvcHB0ciwgSU5ERVhFU19TVE9QX1BBVFRFUk4sDQorICAgICAgICAgICAgICAgc2l6ZW9mKElOREVYRVNfU1RPUF9QQVRURVJOKSAvIHNpemVvZihJTkRFWEVTX1NUT1BfUEFUVEVSTlswXSkpOw0KKyAgc3RvcHB0ci0+UmVtb3ZlQWxsKCk7DQorICBkZWxldGUgc3RvcHB0cjsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK3ZvaWQgQ0JDX0RldGVjdG9yOjpjb3B5VG9SZXN1bHQoQ0ZYX1B0ckFycmF5KiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHRtcFJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGRlc3RpbmF0aW9uSW5kZXhlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVzdGluYXRpb25MZW5ndGgpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRlc3RpbmF0aW9uTGVuZ3RoOyBpKyspIHsNCisgICAgcmVzdWx0LT5TZXRBdChkZXN0aW5hdGlvbkluZGV4ZXNbaV0sIHRtcFJlc3VsdC0+R2V0QXQoaSkpOw0KKyAgfQ0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19EZXRlY3Rvcjo6ZmluZFJvd3NXaXRoUGF0dGVybihDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0Um93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRDb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhdHRlcm5MZW5ndGgpIHsNCisgIENGWF9QdHJBcnJheSogcmVzdWx0ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgIHJlc3VsdC0+U2V0U2l6ZSg0KTsNCisgIEZYX0JPT0wgZm91bmQgPSBGQUxTRTsNCisgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgY291bnRlcnMuU2V0U2l6ZShwYXR0ZXJuTGVuZ3RoKTsNCisgIGZvciAoOyBzdGFydFJvdyA8IGhlaWdodDsgc3RhcnRSb3cgKz0gUk9XX1NURVApIHsNCisgICAgQ0ZYX0ludDMyQXJyYXkqIGxvYyA9DQorICAgICAgICBmaW5kR3VhcmRQYXR0ZXJuKG1hdHJpeCwgc3RhcnRDb2x1bW4sIHN0YXJ0Um93LCB3aWR0aCwgRkFMU0UsIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5MZW5ndGgsIGNvdW50ZXJzKTsNCisgICAgaWYgKGxvYyAhPSBOVUxMKSB7DQorICAgICAgd2hpbGUgKHN0YXJ0Um93ID4gMCkgew0KKyAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHByZXZpb3VzUm93TG9jID0NCisgICAgICAgICAgICBmaW5kR3VhcmRQYXR0ZXJuKG1hdHJpeCwgc3RhcnRDb2x1bW4sIC0tc3RhcnRSb3csIHdpZHRoLCBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4sIHBhdHRlcm5MZW5ndGgsIGNvdW50ZXJzKTsNCisgICAgICAgIGlmIChwcmV2aW91c1Jvd0xvYyAhPSBOVUxMKSB7DQorICAgICAgICAgIGRlbGV0ZSBsb2M7DQorICAgICAgICAgIGxvYyA9IHByZXZpb3VzUm93TG9jOw0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBjb2x1bW4gPSAoaW50MzJfdCkgKChDQkNfUmVzdWx0UG9pbnQqKXZlcnRpY2VzLT5HZXRBdCg0KSktPkdldFgoKTsNCi0gICAgICAgICAgICByb3cgPSAoaW50MzJfdCkgKChDQkNfUmVzdWx0UG9pbnQqKXZlcnRpY2VzLT5HZXRBdCg0KSktPkdldFkoKTsNCisgICAgICAgICAgc3RhcnRSb3crKzsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJlc3VsdC0+U2V0QXQoMCwgRlhfTkVXIENCQ19SZXN1bHRQb2ludCgoRlhfRkxPQVQpbG9jLT5HZXRBdCgwKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXN0YXJ0Um93KSk7DQorICAgICAgcmVzdWx0LT5TZXRBdCgxLCBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KChGWF9GTE9BVClsb2MtPkdldEF0KDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpc3RhcnRSb3cpKTsNCisgICAgICBmb3VuZCA9IFRSVUU7DQorICAgICAgZGVsZXRlIGxvYzsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gYmFyY29kZUNvb3JkaW5hdGVzOw0KLX0NCi1DRlhfUHRyQXJyYXkqIENCQ19EZXRlY3Rvcjo6ZmluZFZlcnRpY2VzKENCQ19Db21tb25CaXRNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCBzdGFydFJvdywgaW50MzJfdCBzdGFydENvbHVtbikNCi17DQotICAgIGludDMyX3QgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsNCi0gICAgaW50MzJfdCB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCi0gICAgQ0ZYX1B0ckFycmF5KiByZXN1bHQgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5Ow0KLSAgICByZXN1bHQtPlNldFNpemUoOCk7DQotICAgIENGWF9QdHJBcnJheSogc3RhcnRwdHIgPSAgZmluZFJvd3NXaXRoUGF0dGVybihtYXRyaXgsIGhlaWdodCwgd2lkdGgsIHN0YXJ0Um93LCBzdGFydENvbHVtbiwgU1RBUlRfUEFUVEVSTiwgc2l6ZW9mKFNUQVJUX1BBVFRFUk4pIC8gc2l6ZW9mKFNUQVJUX1BBVFRFUk5bMF0pKTsNCi0gICAgY29weVRvUmVzdWx0KHJlc3VsdCwgc3RhcnRwdHIsIElOREVYRVNfU1RBUlRfUEFUVEVSTiwgc2l6ZW9mKElOREVYRVNfU1RBUlRfUEFUVEVSTikgLyBzaXplb2YoSU5ERVhFU19TVEFSVF9QQVRURVJOWzBdKSk7DQotICAgIHN0YXJ0cHRyLT5SZW1vdmVBbGwoKTsNCi0gICAgZGVsZXRlIHN0YXJ0cHRyOw0KLSAgICBpZiAocmVzdWx0LT5HZXRBdCg0KSAhPSBOVUxMKSB7DQotICAgICAgICBzdGFydENvbHVtbiA9IChpbnQzMl90KSAoKENCQ19SZXN1bHRQb2ludCopcmVzdWx0LT5HZXRBdCg0KSktPkdldFgoKTsNCi0gICAgICAgIHN0YXJ0Um93ID0gKGludDMyX3QpICgoQ0JDX1Jlc3VsdFBvaW50KilyZXN1bHQtPkdldEF0KDQpKS0+R2V0WSgpOw0KLSAgICB9DQotICAgIENGWF9QdHJBcnJheSogIHN0b3BwdHIgPSBmaW5kUm93c1dpdGhQYXR0ZXJuKG1hdHJpeCwgaGVpZ2h0LCB3aWR0aCwgc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBTVE9QX1BBVFRFUk4sIHNpemVvZihTVE9QX1BBVFRFUk4pIC8gc2l6ZW9mKFNUT1BfUEFUVEVSTlswXSkpOw0KLSAgICBjb3B5VG9SZXN1bHQocmVzdWx0LCBzdG9wcHRyLCBJTkRFWEVTX1NUT1BfUEFUVEVSTiwgc2l6ZW9mKElOREVYRVNfU1RPUF9QQVRURVJOKSAvIHNpemVvZihJTkRFWEVTX1NUT1BfUEFUVEVSTlswXSkpOw0KLSAgICBzdG9wcHRyLT5SZW1vdmVBbGwoKTsNCi0gICAgZGVsZXRlIHN0b3BwdHI7DQotICAgIHJldHVybiByZXN1bHQ7DQotfQ0KLXZvaWQgQ0JDX0RldGVjdG9yOjpjb3B5VG9SZXN1bHQoQ0ZYX1B0ckFycmF5ICpyZXN1bHQsIENGWF9QdHJBcnJheSogdG1wUmVzdWx0LCBpbnQzMl90KiBkZXN0aW5hdGlvbkluZGV4ZXMsIGludDMyX3QgZGVzdGluYXRpb25MZW5ndGgpDQotew0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkZXN0aW5hdGlvbkxlbmd0aDsgaSsrKSB7DQotICAgICAgICByZXN1bHQtPlNldEF0KGRlc3RpbmF0aW9uSW5kZXhlc1tpXSwgdG1wUmVzdWx0LT5HZXRBdChpKSk7DQotICAgIH0NCi19DQotQ0ZYX1B0ckFycmF5KiBDQkNfRGV0ZWN0b3I6OmZpbmRSb3dzV2l0aFBhdHRlcm4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogbWF0cml4LCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBzdGFydFJvdywgaW50MzJfdCBzdGFydENvbHVtbiwgaW50MzJfdCogcGF0dGVybiwgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoKQ0KLXsNCi0gICAgQ0ZYX1B0ckFycmF5KiByZXN1bHQgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5Ow0KLSAgICByZXN1bHQtPlNldFNpemUoNCk7DQotICAgIEZYX0JPT0wgZm91bmQgPSBGQUxTRTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQotICAgIGNvdW50ZXJzLlNldFNpemUocGF0dGVybkxlbmd0aCk7DQotICAgIGZvciAoOyBzdGFydFJvdyA8IGhlaWdodDsgc3RhcnRSb3cgKz0gUk9XX1NURVApIHsNCi0gICAgICAgIENGWF9JbnQzMkFycmF5KiBsb2MgPSBmaW5kR3VhcmRQYXR0ZXJuKG1hdHJpeCwgc3RhcnRDb2x1bW4sIHN0YXJ0Um93LCB3aWR0aCwgRkFMU0UsIHBhdHRlcm4sIHBhdHRlcm5MZW5ndGgsIGNvdW50ZXJzKTsNCi0gICAgICAgIGlmIChsb2MgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIHdoaWxlIChzdGFydFJvdyA+IDApIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHByZXZpb3VzUm93TG9jID0gZmluZEd1YXJkUGF0dGVybihtYXRyaXgsIHN0YXJ0Q29sdW1uLCAtLXN0YXJ0Um93LCB3aWR0aCwgRkFMU0UsIHBhdHRlcm4sIHBhdHRlcm5MZW5ndGgsIGNvdW50ZXJzKTsNCi0gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzUm93TG9jICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsb2M7DQotICAgICAgICAgICAgICAgICAgICBsb2MgPSBwcmV2aW91c1Jvd0xvYzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0Um93Kys7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHQtPlNldEF0KDAsIEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKWxvYy0+R2V0QXQoMCksIChGWF9GTE9BVClzdGFydFJvdykpOw0KLSAgICAgICAgICAgIHJlc3VsdC0+U2V0QXQoMSwgRlhfTkVXIENCQ19SZXN1bHRQb2ludCgoRlhfRkxPQVQpbG9jLT5HZXRBdCgxKSwgKEZYX0ZMT0FUKXN0YXJ0Um93KSk7DQotICAgICAgICAgICAgZm91bmQgPSBUUlVFOw0KLSAgICAgICAgICAgIGRlbGV0ZSBsb2M7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBzdG9wUm93ID0gc3RhcnRSb3cgKyAxOw0KLSAgICBpZiAoZm91bmQpIHsNCi0gICAgICAgIGludDMyX3Qgc2tpcHBlZFJvd0NvdW50ID0gMDsNCi0gICAgICAgIENGWF9JbnQzMkFycmF5IHByZXZpb3VzUm93TG9jOw0KLSAgICAgICAgcHJldmlvdXNSb3dMb2MuQWRkKChpbnQzMl90KSgoQ0JDX1Jlc3VsdFBvaW50KilyZXN1bHQtPkdldEF0KDApKS0+R2V0WCgpKTsNCi0gICAgICAgIHByZXZpb3VzUm93TG9jLkFkZCgoaW50MzJfdCkoKENCQ19SZXN1bHRQb2ludCopcmVzdWx0LT5HZXRBdCgxKSktPkdldFgoKSk7DQotICAgICAgICBmb3IgKDsgc3RvcFJvdyA8IGhlaWdodDsgc3RvcFJvdysrKSB7DQotICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIGxvYyA9IGZpbmRHdWFyZFBhdHRlcm4obWF0cml4LCBwcmV2aW91c1Jvd0xvY1swXSwgc3RvcFJvdywgd2lkdGgsIEZBTFNFLCBwYXR0ZXJuLCBwYXR0ZXJuTGVuZ3RoLCBjb3VudGVycyk7DQotICAgICAgICAgICAgaWYgKGxvYyAhPSBOVUxMICYmDQotICAgICAgICAgICAgICAgICAgICBhYnMocHJldmlvdXNSb3dMb2NbMF0gLSBsb2MtPkdldEF0KDApKSA8IE1BWF9QQVRURVJOX0RSSUZUICYmDQotICAgICAgICAgICAgICAgICAgICBhYnMocHJldmlvdXNSb3dMb2NbMV0gLSBsb2MtPkdldEF0KDEpKSA8IE1BWF9QQVRURVJOX0RSSUZUKSB7DQotICAgICAgICAgICAgICAgIHByZXZpb3VzUm93TG9jLkNvcHkoKmxvYyk7DQotICAgICAgICAgICAgICAgIHNraXBwZWRSb3dDb3VudCA9IDA7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKHNraXBwZWRSb3dDb3VudCA+IFNLSVBQRURfUk9XX0NPVU5UX01BWCkgew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxvYzsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgc2tpcHBlZFJvd0NvdW50Kys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZGVsZXRlIGxvYzsNCi0gICAgICAgIH0NCi0gICAgICAgIHN0b3BSb3cgLT0gc2tpcHBlZFJvd0NvdW50ICsgMTsNCi0gICAgICAgIHJlc3VsdC0+U2V0QXQoMiwgRlhfTkVXIENCQ19SZXN1bHRQb2ludCgoRlhfRkxPQVQpcHJldmlvdXNSb3dMb2MuR2V0QXQoMCksIChGWF9GTE9BVClzdG9wUm93KSk7DQotICAgICAgICByZXN1bHQtPlNldEF0KDMsIEZYX05FVyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKXByZXZpb3VzUm93TG9jLkdldEF0KDEpLCAoRlhfRkxPQVQpc3RvcFJvdykpOw0KLSAgICB9DQotICAgIGlmIChzdG9wUm93IC0gc3RhcnRSb3cgPCBCQVJDT0RFX01JTl9IRUlHSFQpIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHJlc3VsdC0+R2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICByZXN1bHQtPlNldEF0KGksIE5VTEwpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiByZXN1bHQ7DQotfQ0KLUNGWF9JbnQzMkFycmF5KiBDQkNfRGV0ZWN0b3I6OmZpbmRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogbWF0cml4LCBpbnQzMl90IGNvbHVtbiwgaW50MzJfdCByb3csIGludDMyX3Qgd2lkdGgsIEZYX0JPT0wgd2hpdGVGaXJzdCwgaW50MzJfdCogcGF0dGVybiwgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoLCBDRlhfSW50MzJBcnJheSAmY291bnRlcnMpDQotew0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudGVycy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgY291bnRlcnMuU2V0QXQoaSwgMCk7DQotICAgIH0NCi0gICAgRlhfQk9PTCBpc1doaXRlID0gd2hpdGVGaXJzdDsNCi0gICAgaW50MzJfdCBwYXR0ZXJuU3RhcnQgPSBjb2x1bW47DQotICAgIGludDMyX3QgcGl4ZWxEcmlmdCA9IDA7DQotICAgIENGWF9JbnQzMkFycmF5KiBpbnRhcnJheSA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCi0gICAgd2hpbGUgKG1hdHJpeC0+R2V0KHBhdHRlcm5TdGFydCwgcm93KSAmJiBwYXR0ZXJuU3RhcnQgPiAwICYmIHBpeGVsRHJpZnQrKyA8IE1BWF9QSVhFTF9EUklGVCkgew0KLSAgICAgICAgcGF0dGVyblN0YXJ0LS07DQotICAgIH0NCi0gICAgaW50MzJfdCB4ID0gcGF0dGVyblN0YXJ0Ow0KLSAgICBpbnQzMl90IGNvdW50ZXJQb3NpdGlvbiA9IDA7DQotICAgIGZvciAoOyB4IDwgd2lkdGg7IHgrKykgew0KLSAgICAgICAgRlhfQk9PTCBwaXhlbCA9IG1hdHJpeC0+R2V0KHgsIHJvdyk7DQotICAgICAgICBpZiAocGl4ZWwgXiBpc1doaXRlKSB7DQotICAgICAgICAgICAgY291bnRlcnNbY291bnRlclBvc2l0aW9uXSsrOw0KKyAgfQ0KKyAgaW50MzJfdCBzdG9wUm93ID0gc3RhcnRSb3cgKyAxOw0KKyAgaWYgKGZvdW5kKSB7DQorICAgIGludDMyX3Qgc2tpcHBlZFJvd0NvdW50ID0gMDsNCisgICAgQ0ZYX0ludDMyQXJyYXkgcHJldmlvdXNSb3dMb2M7DQorICAgIHByZXZpb3VzUm93TG9jLkFkZCgoaW50MzJfdCkoKENCQ19SZXN1bHRQb2ludCopcmVzdWx0LT5HZXRBdCgwKSktPkdldFgoKSk7DQorICAgIHByZXZpb3VzUm93TG9jLkFkZCgoaW50MzJfdCkoKENCQ19SZXN1bHRQb2ludCopcmVzdWx0LT5HZXRBdCgxKSktPkdldFgoKSk7DQorICAgIGZvciAoOyBzdG9wUm93IDwgaGVpZ2h0OyBzdG9wUm93KyspIHsNCisgICAgICBDRlhfSW50MzJBcnJheSogbG9jID0NCisgICAgICAgICAgZmluZEd1YXJkUGF0dGVybihtYXRyaXgsIHByZXZpb3VzUm93TG9jWzBdLCBzdG9wUm93LCB3aWR0aCwgRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiwgcGF0dGVybkxlbmd0aCwgY291bnRlcnMpOw0KKyAgICAgIGlmIChsb2MgIT0gTlVMTCAmJg0KKyAgICAgICAgICBhYnMocHJldmlvdXNSb3dMb2NbMF0gLSBsb2MtPkdldEF0KDApKSA8IE1BWF9QQVRURVJOX0RSSUZUICYmDQorICAgICAgICAgIGFicyhwcmV2aW91c1Jvd0xvY1sxXSAtIGxvYy0+R2V0QXQoMSkpIDwgTUFYX1BBVFRFUk5fRFJJRlQpIHsNCisgICAgICAgIHByZXZpb3VzUm93TG9jLkNvcHkoKmxvYyk7DQorICAgICAgICBza2lwcGVkUm93Q291bnQgPSAwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoc2tpcHBlZFJvd0NvdW50ID4gU0tJUFBFRF9ST1dfQ09VTlRfTUFYKSB7DQorICAgICAgICAgIGRlbGV0ZSBsb2M7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoY291bnRlclBvc2l0aW9uID09IHBhdHRlcm5MZW5ndGggLSAxKSB7DQotICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuTWF0Y2hWYXJpYW5jZShjb3VudGVycywgcGF0dGVybiwgTUFYX0lORElWSURVQUxfVkFSSUFOQ0UpIDwgTUFYX0FWR19WQVJJQU5DRSkgew0KLSAgICAgICAgICAgICAgICAgICAgaW50YXJyYXktPkFkZChwYXR0ZXJuU3RhcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgaW50YXJyYXktPkFkZCh4KTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRhcnJheTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwYXR0ZXJuU3RhcnQgKz0gY291bnRlcnNbMF0gKyBjb3VudGVyc1sxXTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGwgPSAyLCBrID0gMDsgbCA8IHBhdHRlcm5MZW5ndGg7IGwrKywgaysrKSB7DQotICAgICAgICAgICAgICAgICAgICBjb3VudGVycy5TZXRBdChrLCBjb3VudGVycy5HZXRBdChsKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY291bnRlcnMuU2V0QXQocGF0dGVybkxlbmd0aCAtIDIsIDApOw0KLSAgICAgICAgICAgICAgICBjb3VudGVycy5TZXRBdChwYXR0ZXJuTGVuZ3RoIC0gMSwgMCk7DQotICAgICAgICAgICAgICAgIGNvdW50ZXJQb3NpdGlvbi0tOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGNvdW50ZXJQb3NpdGlvbisrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dID0gMTsNCi0gICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQorICAgICAgICAgIHNraXBwZWRSb3dDb3VudCsrOw0KICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBkZWxldGUgbG9jOw0KICAgICB9DQotICAgIGlmIChjb3VudGVyUG9zaXRpb24gPT0gcGF0dGVybkxlbmd0aCAtIDEpIHsNCi0gICAgICAgIGlmIChwYXR0ZXJuTWF0Y2hWYXJpYW5jZShjb3VudGVycywgcGF0dGVybiwgTUFYX0lORElWSURVQUxfVkFSSUFOQ0UpIDwgTUFYX0FWR19WQVJJQU5DRSkgew0KLSAgICAgICAgICAgIGludGFycmF5LT5BZGQocGF0dGVyblN0YXJ0KTsNCi0gICAgICAgICAgICBpbnRhcnJheS0+QWRkKHggLSAxKTsNCi0gICAgICAgICAgICByZXR1cm4gaW50YXJyYXk7DQotICAgICAgICB9DQorICAgIHN0b3BSb3cgLT0gc2tpcHBlZFJvd0NvdW50ICsgMTsNCisgICAgcmVzdWx0LT5TZXRBdCgyLCBGWF9ORVcgQ0JDX1Jlc3VsdFBvaW50KChGWF9GTE9BVClwcmV2aW91c1Jvd0xvYy5HZXRBdCgwKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClzdG9wUm93KSk7DQorICAgIHJlc3VsdC0+U2V0QXQoMywgRlhfTkVXIENCQ19SZXN1bHRQb2ludCgoRlhfRkxPQVQpcHJldmlvdXNSb3dMb2MuR2V0QXQoMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpc3RvcFJvdykpOw0KKyAgfQ0KKyAgaWYgKHN0b3BSb3cgLSBzdGFydFJvdyA8IEJBUkNPREVfTUlOX0hFSUdIVCkgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCByZXN1bHQtPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgcmVzdWx0LT5TZXRBdChpLCBOVUxMKTsNCiAgICAgfQ0KLSAgICBkZWxldGUgaW50YXJyYXk7DQotICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCiB9DQotaW50MzJfdCBDQkNfRGV0ZWN0b3I6OnBhdHRlcm5NYXRjaFZhcmlhbmNlKENGWF9JbnQzMkFycmF5ICZjb3VudGVycywgaW50MzJfdCogcGF0dGVybiwgaW50MzJfdCBtYXhJbmRpdmlkdWFsVmFyaWFuY2UpDQotew0KLSAgICBpbnQzMl90IG51bUNvdW50ZXJzID0gY291bnRlcnMuR2V0U2l6ZSgpOw0KLSAgICBpbnQzMl90IHRvdGFsID0gMDsNCi0gICAgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoID0gMDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykgew0KLSAgICAgICAgdG90YWwgKz0gY291bnRlcnNbaV07DQotICAgICAgICBwYXR0ZXJuTGVuZ3RoICs9IHBhdHRlcm5baV07DQotICAgIH0NCi0gICAgaWYgKHRvdGFsIDwgcGF0dGVybkxlbmd0aCkgew0KLSAgICAgICAgcmV0dXJuIElOVEVSR0VSX01BWDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHVuaXRCYXJXaWR0aCA9ICh0b3RhbCA8PCBJTlRFR0VSX01BVEhfU0hJRlQpIC8gcGF0dGVybkxlbmd0aDsNCi0gICAgbWF4SW5kaXZpZHVhbFZhcmlhbmNlID0gKG1heEluZGl2aWR1YWxWYXJpYW5jZSAqIHVuaXRCYXJXaWR0aCkgPj4gSU5URUdFUl9NQVRIX1NISUZUOw0KLSAgICBpbnQzMl90IHRvdGFsVmFyaWFuY2UgPSAwOw0KLSAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBudW1Db3VudGVyczsgeCsrKSB7DQotICAgICAgICBpbnQzMl90IGNvdW50ZXIgPSBjb3VudGVyc1t4XSA8PCBJTlRFR0VSX01BVEhfU0hJRlQ7DQotICAgICAgICBpbnQzMl90IHNjYWxlZFBhdHRlcm4gPSBwYXR0ZXJuW3hdICogdW5pdEJhcldpZHRoOw0KLSAgICAgICAgaW50MzJfdCB2YXJpYW5jZSA9IGNvdW50ZXIgPiBzY2FsZWRQYXR0ZXJuID8gY291bnRlciAtIHNjYWxlZFBhdHRlcm4gOiBzY2FsZWRQYXR0ZXJuIC0gY291bnRlcjsNCi0gICAgICAgIGlmICh2YXJpYW5jZSA+IG1heEluZGl2aWR1YWxWYXJpYW5jZSkgew0KLSAgICAgICAgICAgIHJldHVybiBJTlRFUkdFUl9NQVg7DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19EZXRlY3Rvcjo6ZmluZEd1YXJkUGF0dGVybihDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgd2hpdGVGaXJzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhdHRlcm5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgY291bnRlcnMpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIGNvdW50ZXJzLlNldEF0KGksIDApOw0KKyAgfQ0KKyAgRlhfQk9PTCBpc1doaXRlID0gd2hpdGVGaXJzdDsNCisgIGludDMyX3QgcGF0dGVyblN0YXJ0ID0gY29sdW1uOw0KKyAgaW50MzJfdCBwaXhlbERyaWZ0ID0gMDsNCisgIENGWF9JbnQzMkFycmF5KiBpbnRhcnJheSA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCisgIHdoaWxlIChtYXRyaXgtPkdldChwYXR0ZXJuU3RhcnQsIHJvdykgJiYgcGF0dGVyblN0YXJ0ID4gMCAmJg0KKyAgICAgICAgIHBpeGVsRHJpZnQrKyA8IE1BWF9QSVhFTF9EUklGVCkgew0KKyAgICBwYXR0ZXJuU3RhcnQtLTsNCisgIH0NCisgIGludDMyX3QgeCA9IHBhdHRlcm5TdGFydDsNCisgIGludDMyX3QgY291bnRlclBvc2l0aW9uID0gMDsNCisgIGZvciAoOyB4IDwgd2lkdGg7IHgrKykgew0KKyAgICBGWF9CT09MIHBpeGVsID0gbWF0cml4LT5HZXQoeCwgcm93KTsNCisgICAgaWYgKHBpeGVsIF4gaXNXaGl0ZSkgew0KKyAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NpdGlvbl0rKzsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoY291bnRlclBvc2l0aW9uID09IHBhdHRlcm5MZW5ndGggLSAxKSB7DQorICAgICAgICBpZiAocGF0dGVybk1hdGNoVmFyaWFuY2UoY291bnRlcnMsIHBhdHRlcm4sIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKSA8DQorICAgICAgICAgICAgTUFYX0FWR19WQVJJQU5DRSkgew0KKyAgICAgICAgICBpbnRhcnJheS0+QWRkKHBhdHRlcm5TdGFydCk7DQorICAgICAgICAgIGludGFycmF5LT5BZGQoeCk7DQorICAgICAgICAgIHJldHVybiBpbnRhcnJheTsNCiAgICAgICAgIH0NCi0gICAgICAgIHRvdGFsVmFyaWFuY2UgKz0gdmFyaWFuY2U7DQorICAgICAgICBwYXR0ZXJuU3RhcnQgKz0gY291bnRlcnNbMF0gKyBjb3VudGVyc1sxXTsNCisgICAgICAgIGZvciAoaW50MzJfdCBsID0gMiwgayA9IDA7IGwgPCBwYXR0ZXJuTGVuZ3RoOyBsKyssIGsrKykgew0KKyAgICAgICAgICBjb3VudGVycy5TZXRBdChrLCBjb3VudGVycy5HZXRBdChsKSk7DQorICAgICAgICB9DQorICAgICAgICBjb3VudGVycy5TZXRBdChwYXR0ZXJuTGVuZ3RoIC0gMiwgMCk7DQorICAgICAgICBjb3VudGVycy5TZXRBdChwYXR0ZXJuTGVuZ3RoIC0gMSwgMCk7DQorICAgICAgICBjb3VudGVyUG9zaXRpb24tLTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY291bnRlclBvc2l0aW9uKys7DQorICAgICAgfQ0KKyAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NpdGlvbl0gPSAxOw0KKyAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTsNCiAgICAgfQ0KLSAgICByZXR1cm4gdG90YWxWYXJpYW5jZSAvIHRvdGFsOw0KKyAgfQ0KKyAgaWYgKGNvdW50ZXJQb3NpdGlvbiA9PSBwYXR0ZXJuTGVuZ3RoIC0gMSkgew0KKyAgICBpZiAocGF0dGVybk1hdGNoVmFyaWFuY2UoY291bnRlcnMsIHBhdHRlcm4sIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKSA8DQorICAgICAgICBNQVhfQVZHX1ZBUklBTkNFKSB7DQorICAgICAgaW50YXJyYXktPkFkZChwYXR0ZXJuU3RhcnQpOw0KKyAgICAgIGludGFycmF5LT5BZGQoeCAtIDEpOw0KKyAgICAgIHJldHVybiBpbnRhcnJheTsNCisgICAgfQ0KKyAgfQ0KKyAgZGVsZXRlIGludGFycmF5Ow0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLQ0KK2ludDMyX3QgQ0JDX0RldGVjdG9yOjpwYXR0ZXJuTWF0Y2hWYXJpYW5jZShDRlhfSW50MzJBcnJheSYgY291bnRlcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4SW5kaXZpZHVhbFZhcmlhbmNlKSB7DQorICBpbnQzMl90IG51bUNvdW50ZXJzID0gY291bnRlcnMuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCB0b3RhbCA9IDA7DQorICBpbnQzMl90IHBhdHRlcm5MZW5ndGggPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykgew0KKyAgICB0b3RhbCArPSBjb3VudGVyc1tpXTsNCisgICAgcGF0dGVybkxlbmd0aCArPSBwYXR0ZXJuW2ldOw0KKyAgfQ0KKyAgaWYgKHRvdGFsIDwgcGF0dGVybkxlbmd0aCkgew0KKyAgICByZXR1cm4gSU5URVJHRVJfTUFYOw0KKyAgfQ0KKyAgaW50MzJfdCB1bml0QmFyV2lkdGggPSAodG90YWwgPDwgSU5URUdFUl9NQVRIX1NISUZUKSAvIHBhdHRlcm5MZW5ndGg7DQorICBtYXhJbmRpdmlkdWFsVmFyaWFuY2UgPQ0KKyAgICAgIChtYXhJbmRpdmlkdWFsVmFyaWFuY2UgKiB1bml0QmFyV2lkdGgpID4+IElOVEVHRVJfTUFUSF9TSElGVDsNCisgIGludDMyX3QgdG90YWxWYXJpYW5jZSA9IDA7DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBudW1Db3VudGVyczsgeCsrKSB7DQorICAgIGludDMyX3QgY291bnRlciA9IGNvdW50ZXJzW3hdIDw8IElOVEVHRVJfTUFUSF9TSElGVDsNCisgICAgaW50MzJfdCBzY2FsZWRQYXR0ZXJuID0gcGF0dGVyblt4XSAqIHVuaXRCYXJXaWR0aDsNCisgICAgaW50MzJfdCB2YXJpYW5jZSA9IGNvdW50ZXIgPiBzY2FsZWRQYXR0ZXJuID8gY291bnRlciAtIHNjYWxlZFBhdHRlcm4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2NhbGVkUGF0dGVybiAtIGNvdW50ZXI7DQorICAgIGlmICh2YXJpYW5jZSA+IG1heEluZGl2aWR1YWxWYXJpYW5jZSkgew0KKyAgICAgIHJldHVybiBJTlRFUkdFUl9NQVg7DQorICAgIH0NCisgICAgdG90YWxWYXJpYW5jZSArPSB2YXJpYW5jZTsNCisgIH0NCisgIHJldHVybiB0b3RhbFZhcmlhbmNlIC8gdG90YWw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rvci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yLmgKaW5kZXggOTNkNWZmOC4uMTMzZGQwMiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yLmgKQEAgLTEwLDMzICsxMCw1NyBAQAogY2xhc3MgQ0JDX0JpbmFyeUJpdG1hcDsNCiBjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KIGNsYXNzIENCQ19Db21tb25CaXRBcnJheTsNCi1jbGFzcyBDQkNfRGV0ZWN0b3INCi17DQotcHVibGljOg0KLSAgICBDQkNfRGV0ZWN0b3IoKTsNCi0gICAgdmlydHVhbCB+Q0JDX0RldGVjdG9yKCk7DQotICAgIHN0YXRpYyBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQqIGRldGVjdChDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgaW50MzJfdCBoaW50cywgRlhfQk9PTCBtdWx0aXBsZSwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIHJvdGF0ZTE4MChDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRNYXRyaXgpOw0KLSAgICBzdGF0aWMgQ0JDX0NvbW1vbkJpdEFycmF5KiBtaXJyb3IoQ0JDX0NvbW1vbkJpdEFycmF5KiBpbnB1dCwgQ0JDX0NvbW1vbkJpdEFycmF5KiByZXN1bHQpOw0KLXByaXZhdGU6DQotICAgIHN0YXRpYyBpbnQzMl90IElOREVYRVNfU1RBUlRfUEFUVEVSTltdOw0KLSAgICBzdGF0aWMgaW50MzJfdCBJTkRFWEVTX1NUT1BfUEFUVEVSTltdOw0KLSAgICBzdGF0aWMgaW50MzJfdCBJTlRFR0VSX01BVEhfU0hJRlQ7DQotICAgIHN0YXRpYyBpbnQzMl90IFBBVFRFUk5fTUFUQ0hfUkVTVUxUX1NDQUxFX0ZBQ1RPUjsNCi0gICAgc3RhdGljIGludDMyX3QgTUFYX0FWR19WQVJJQU5DRTsNCi0gICAgc3RhdGljIGludDMyX3QgTUFYX0lORElWSURVQUxfVkFSSUFOQ0U7DQotICAgIHN0YXRpYyBpbnQzMl90IFNUQVJUX1BBVFRFUk5bXTsNCi0gICAgc3RhdGljIGludDMyX3QgU1RPUF9QQVRURVJOW107DQotICAgIHN0YXRpYyBpbnQzMl90IE1BWF9QSVhFTF9EUklGVDsNCi0gICAgc3RhdGljIGludDMyX3QgTUFYX1BBVFRFUk5fRFJJRlQ7DQotICAgIHN0YXRpYyBpbnQzMl90IFNLSVBQRURfUk9XX0NPVU5UX01BWDsNCi0gICAgc3RhdGljIGludDMyX3QgUk9XX1NURVA7DQotICAgIHN0YXRpYyBpbnQzMl90IEJBUkNPREVfTUlOX0hFSUdIVDsNCi0gICAgc3RhdGljIENGWF9QdHJBcnJheSogZGV0ZWN0KEZYX0JPT0wgbXVsdGlwbGUsIENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCk7DQotICAgIHN0YXRpYyBDRlhfUHRyQXJyYXkqIGZpbmRWZXJ0aWNlcyhDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsIGludDMyX3Qgc3RhcnRSb3csIGludDMyX3Qgc3RhcnRDb2x1bW4pOw0KLSAgICBzdGF0aWMgdm9pZCBjb3B5VG9SZXN1bHQoQ0ZYX1B0ckFycmF5KiByZXN1bHQsIENGWF9QdHJBcnJheSogdG1wUmVzdWx0LCBpbnQzMl90KiBkZXN0aW5hdGlvbkluZGV4ZXMsIGludDMyX3QgZGVzdGluYXRpb25MZW5ndGgpOw0KLSAgICBzdGF0aWMgQ0ZYX1B0ckFycmF5KiBmaW5kUm93c1dpdGhQYXR0ZXJuKENCQ19Db21tb25CaXRNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgd2lkdGgsIGludDMyX3Qgc3RhcnRSb3csIGludDMyX3Qgc3RhcnRDb2x1bW4sIGludDMyX3QqIHBhdHRlcm4sIGludDMyX3QgcGF0dGVybkxlbmd0aCk7DQotICAgIHN0YXRpYyBDRlhfSW50MzJBcnJheSogZmluZEd1YXJkUGF0dGVybihDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsIGludDMyX3QgY29sdW1uLCBpbnQzMl90IHJvdywgaW50MzJfdCB3aWR0aCwgRlhfQk9PTCB3aGl0ZUZpcnN0LCBpbnQzMl90KiBwYXR0ZXJuLCBpbnQzMl90IHBhdHRlcm5MZW5ndGgsIENGWF9JbnQzMkFycmF5ICZjb3VudGVycyk7DQotICAgIHN0YXRpYyBpbnQzMl90IHBhdHRlcm5NYXRjaFZhcmlhbmNlKENGWF9JbnQzMkFycmF5ICZjb3VudGVycywgaW50MzJfdCogcGF0dGVybiwgaW50MzJfdCBtYXhJbmRpdmlkdWFsVmFyaWFuY2UpOw0KK2NsYXNzIENCQ19EZXRlY3RvciB7DQorIHB1YmxpYzoNCisgIENCQ19EZXRlY3RvcigpOw0KKyAgdmlydHVhbCB+Q0JDX0RldGVjdG9yKCk7DQorICBzdGF0aWMgQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0KiBkZXRlY3QoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgcm90YXRlMTgwKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCk7DQorICBzdGF0aWMgQ0JDX0NvbW1vbkJpdEFycmF5KiBtaXJyb3IoQ0JDX0NvbW1vbkJpdEFycmF5KiBpbnB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJlc3VsdCk7DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgaW50MzJfdCBJTkRFWEVTX1NUQVJUX1BBVFRFUk5bXTsNCisgIHN0YXRpYyBpbnQzMl90IElOREVYRVNfU1RPUF9QQVRURVJOW107DQorICBzdGF0aWMgaW50MzJfdCBJTlRFR0VSX01BVEhfU0hJRlQ7DQorICBzdGF0aWMgaW50MzJfdCBQQVRURVJOX01BVENIX1JFU1VMVF9TQ0FMRV9GQUNUT1I7DQorICBzdGF0aWMgaW50MzJfdCBNQVhfQVZHX1ZBUklBTkNFOw0KKyAgc3RhdGljIGludDMyX3QgTUFYX0lORElWSURVQUxfVkFSSUFOQ0U7DQorICBzdGF0aWMgaW50MzJfdCBTVEFSVF9QQVRURVJOW107DQorICBzdGF0aWMgaW50MzJfdCBTVE9QX1BBVFRFUk5bXTsNCisgIHN0YXRpYyBpbnQzMl90IE1BWF9QSVhFTF9EUklGVDsNCisgIHN0YXRpYyBpbnQzMl90IE1BWF9QQVRURVJOX0RSSUZUOw0KKyAgc3RhdGljIGludDMyX3QgU0tJUFBFRF9ST1dfQ09VTlRfTUFYOw0KKyAgc3RhdGljIGludDMyX3QgUk9XX1NURVA7DQorICBzdGF0aWMgaW50MzJfdCBCQVJDT0RFX01JTl9IRUlHSFQ7DQorICBzdGF0aWMgQ0ZYX1B0ckFycmF5KiBkZXRlY3QoRlhfQk9PTCBtdWx0aXBsZSwgQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0TWF0cml4KTsNCisgIHN0YXRpYyBDRlhfUHRyQXJyYXkqIGZpbmRWZXJ0aWNlcyhDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0Q29sdW1uKTsNCisgIHN0YXRpYyB2b2lkIGNvcHlUb1Jlc3VsdChDRlhfUHRyQXJyYXkqIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHRtcFJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBkZXN0aW5hdGlvbkluZGV4ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXN0aW5hdGlvbkxlbmd0aCk7DQorICBzdGF0aWMgQ0ZYX1B0ckFycmF5KiBmaW5kUm93c1dpdGhQYXR0ZXJuKENCQ19Db21tb25CaXRNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRDb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGF0dGVybkxlbmd0aCk7DQorICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIGZpbmRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCB3aGl0ZUZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBjb3VudGVycyk7DQorICBzdGF0aWMgaW50MzJfdCBwYXR0ZXJuTWF0Y2hWYXJpYW5jZShDRlhfSW50MzJBcnJheSYgY291bnRlcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhJbmRpdmlkdWFsVmFyaWFuY2UpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5jcHAKaW5kZXggN2Y2NWUwNC4uNmY2YjNhOCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuY3BwCkBAIC0yNCwzMCArMjQsMjcgQEAKICNpbmNsdWRlICIuLi9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQogI2luY2x1ZGUgIi4uL0JDX1Jlc3VsdFBvaW50LmgiDQogI2luY2x1ZGUgIkJDX1BERjQxN0RldGVjdG9yUmVzdWx0LmgiDQotQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0OjpDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0cywgQ0ZYX1B0ckFycmF5KiBwb2ludHMpDQotew0KLSAgICBtX2JpdHMgPSBiaXRzOw0KLSAgICBtX3BvaW50cyA9IHBvaW50czsNCitDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQ6OkNCQ19QREY0MTdEZXRlY3RvclJlc3VsdChDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogcG9pbnRzKSB7DQorICBtX2JpdHMgPSBiaXRzOw0KKyAgbV9wb2ludHMgPSBwb2ludHM7DQogfQ0KLUNCQ19QREY0MTdEZXRlY3RvclJlc3VsdDo6fkNCQ19QREY0MTdEZXRlY3RvclJlc3VsdCgpDQotew0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX3BvaW50cy0+R2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIENGWF9QdHJBcnJheSogdGVtcCA9IChDRlhfUHRyQXJyYXkqKW1fcG9pbnRzLT5HZXRBdChpKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHRlbXAtPkdldFNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgZGVsZXRlIChDQkNfUmVzdWx0UG9pbnQqKXRlbXAtPkdldEF0KGopOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGVtcC0+UmVtb3ZlQWxsKCk7DQotICAgICAgICBkZWxldGUgdGVtcDsNCitDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQ6On5DQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX3BvaW50cy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0ZYX1B0ckFycmF5KiB0ZW1wID0gKENGWF9QdHJBcnJheSopbV9wb2ludHMtPkdldEF0KGkpOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCB0ZW1wLT5HZXRTaXplKCk7IGorKykgew0KKyAgICAgIGRlbGV0ZSAoQ0JDX1Jlc3VsdFBvaW50Kil0ZW1wLT5HZXRBdChqKTsNCiAgICAgfQ0KLSAgICBtX3BvaW50cy0+UmVtb3ZlQWxsKCk7DQotICAgIGRlbGV0ZSBtX3BvaW50czsNCisgICAgdGVtcC0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSB0ZW1wOw0KKyAgfQ0KKyAgbV9wb2ludHMtPlJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIG1fcG9pbnRzOw0KIH0NCi1DQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQ6OmdldEJpdHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYml0czsNCitDQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQ6OmdldEJpdHMoKSB7DQorICByZXR1cm4gbV9iaXRzOw0KIH0NCiANCi1DRlhfUHRyQXJyYXkqIENCQ19QREY0MTdEZXRlY3RvclJlc3VsdDo6Z2V0UG9pbnRzKCkNCi17DQotICAgIHJldHVybiBtX3BvaW50czsNCitDRlhfUHRyQXJyYXkqIENCQ19QREY0MTdEZXRlY3RvclJlc3VsdDo6Z2V0UG9pbnRzKCkgew0KKyAgcmV0dXJuIG1fcG9pbnRzOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5oCmluZGV4IGRhYmZmZTQuLmUwZTMzODggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5oCkBAIC03LDE1ICs3LDE1IEBACiAjaWZuZGVmIF9CQ19QREY0MTdERVRFQ1RPUlJFU1VMVF9IXw0KICNkZWZpbmUgX0JDX1BERjQxN0RFVEVDVE9SUkVTVUxUX0hfDQogY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCi1jbGFzcyBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQNCi17DQotcHVibGljOg0KLSAgICBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0cywgQ0ZYX1B0ckFycmF5KiBwb2ludHMpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQoKTsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogZ2V0Qml0cygpIDsNCi0gICAgQ0ZYX1B0ckFycmF5KiBnZXRQb2ludHMoKTsNCi1wcml2YXRlOg0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBtX2JpdHM7DQotICAgIENGWF9QdHJBcnJheSogbV9wb2ludHM7DQorY2xhc3MgQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0IHsNCisgcHVibGljOg0KKyAgQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0KENCQ19Db21tb25CaXRNYXRyaXgqIGJpdHMsIENGWF9QdHJBcnJheSogcG9pbnRzKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdEZXRlY3RvclJlc3VsdCgpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogZ2V0Qml0cygpOw0KKyAgQ0ZYX1B0ckFycmF5KiBnZXRQb2ludHMoKTsNCisNCisgcHJpdmF0ZToNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1fYml0czsNCisgIENGWF9QdHJBcnJheSogbV9wb2ludHM7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGltZW5zaW9ucy5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGltZW5zaW9ucy5jcHAKaW5kZXggMTg5ZWQwOC4uMjc0NmViZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RpbWVuc2lvbnMuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEaW1lbnNpb25zLmNwcApAQCAtMjAsMzIgKzIwLDI3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiAgKi8NCiANCi0NCiAjaW5jbHVkZSAiLi4vYmFyY29kZS5oIg0KICNpbmNsdWRlICJCQ19QREY0MTdEaW1lbnNpb25zLmgiDQotQ0JDX0RpbWVuc2lvbnM6OkNCQ19EaW1lbnNpb25zKGludDMyX3QgbWluQ29scywgaW50MzJfdCBtYXhDb2xzLCBpbnQzMl90IG1pblJvd3MsIGludDMyX3QgbWF4Um93cykNCi17DQotICAgIG1fbWluQ29scyA9IG1pbkNvbHM7DQotICAgIG1fbWF4Q29scyA9IG1heENvbHM7DQotICAgIG1fbWluUm93cyA9IG1pblJvd3M7DQotICAgIG1fbWF4Um93cyA9IG1heFJvd3M7DQorQ0JDX0RpbWVuc2lvbnM6OkNCQ19EaW1lbnNpb25zKGludDMyX3QgbWluQ29scywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhDb2xzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pblJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4Um93cykgew0KKyAgbV9taW5Db2xzID0gbWluQ29sczsNCisgIG1fbWF4Q29scyA9IG1heENvbHM7DQorICBtX21pblJvd3MgPSBtaW5Sb3dzOw0KKyAgbV9tYXhSb3dzID0gbWF4Um93czsNCiB9DQotQ0JDX0RpbWVuc2lvbnM6On5DQkNfRGltZW5zaW9ucygpDQotew0KK0NCQ19EaW1lbnNpb25zOjp+Q0JDX0RpbWVuc2lvbnMoKSB7fQ0KK2ludDMyX3QgQ0JDX0RpbWVuc2lvbnM6OmdldE1pbkNvbHMoKSB7DQorICByZXR1cm4gbV9taW5Db2xzOw0KIH0NCi1pbnQzMl90IENCQ19EaW1lbnNpb25zOjpnZXRNaW5Db2xzKCkNCi17DQotICAgIHJldHVybiBtX21pbkNvbHM7DQoraW50MzJfdCBDQkNfRGltZW5zaW9uczo6Z2V0TWF4Q29scygpIHsNCisgIHJldHVybiBtX21heENvbHM7DQogfQ0KLWludDMyX3QgQ0JDX0RpbWVuc2lvbnM6OmdldE1heENvbHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbWF4Q29sczsNCitpbnQzMl90IENCQ19EaW1lbnNpb25zOjpnZXRNaW5Sb3dzKCkgew0KKyAgcmV0dXJuIG1fbWluUm93czsNCiB9DQotaW50MzJfdCBDQkNfRGltZW5zaW9uczo6Z2V0TWluUm93cygpDQotew0KLSAgICByZXR1cm4gbV9taW5Sb3dzOw0KLX0NCi1pbnQzMl90IENCQ19EaW1lbnNpb25zOjpnZXRNYXhSb3dzKCkNCi17DQotICAgIHJldHVybiBtX21heFJvd3M7DQoraW50MzJfdCBDQkNfRGltZW5zaW9uczo6Z2V0TWF4Um93cygpIHsNCisgIHJldHVybiBtX21heFJvd3M7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEaW1lbnNpb25zLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGltZW5zaW9ucy5oCmluZGV4IGI3NWI5OTguLjY5ZDQ2ZGMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEaW1lbnNpb25zLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RpbWVuc2lvbnMuaApAQCAtNiwxOSArNiwyMiBAQAogDQogI2lmbmRlZiBfQkNfRElNRU5TSU9OU19IXw0KICNkZWZpbmUgX0JDX0RJTUVOU0lPTlNfSF8NCi1jbGFzcyBDQkNfRGltZW5zaW9ucw0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19EaW1lbnNpb25zKGludDMyX3QgbWluQ29scywgaW50MzJfdCBtYXhDb2xzLCBpbnQzMl90IG1pblJvd3MsIGludDMyX3QgbWF4Um93cyk7DQotICAgIHZpcnR1YWwgfkNCQ19EaW1lbnNpb25zKCk7DQotICAgIGludDMyX3QgZ2V0TWluQ29scygpOw0KLSAgICBpbnQzMl90IGdldE1heENvbHMoKTsNCi0gICAgaW50MzJfdCBnZXRNaW5Sb3dzKCk7DQotICAgIGludDMyX3QgZ2V0TWF4Um93cygpOw0KLXByaXZhdGU6DQotICAgIGludDMyX3QgbV9taW5Db2xzOw0KLSAgICBpbnQzMl90IG1fbWF4Q29sczsNCi0gICAgaW50MzJfdCBtX21pblJvd3M7DQotICAgIGludDMyX3QgbV9tYXhSb3dzOw0KK2NsYXNzIENCQ19EaW1lbnNpb25zIHsNCisgcHVibGljOg0KKyAgQ0JDX0RpbWVuc2lvbnMoaW50MzJfdCBtaW5Db2xzLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhDb2xzLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Sb3dzLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhSb3dzKTsNCisgIHZpcnR1YWwgfkNCQ19EaW1lbnNpb25zKCk7DQorICBpbnQzMl90IGdldE1pbkNvbHMoKTsNCisgIGludDMyX3QgZ2V0TWF4Q29scygpOw0KKyAgaW50MzJfdCBnZXRNaW5Sb3dzKCk7DQorICBpbnQzMl90IGdldE1heFJvd3MoKTsNCisNCisgcHJpdmF0ZToNCisgIGludDMyX3QgbV9taW5Db2xzOw0KKyAgaW50MzJfdCBtX21heENvbHM7DQorICBpbnQzMl90IG1fbWluUm93czsNCisgIGludDMyX3QgbV9tYXhSb3dzOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbi5jcHAKaW5kZXggZDgwYTdmOC4uMzQ0ZTRiOCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24uY3BwCkBAIC0yNiwzNDQgKzI2LDM2MyBAQAogI2luY2x1ZGUgIkJDX1BERjQxN0VDTW9kdWx1c0dGLmgiDQogI2luY2x1ZGUgIkJDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmgiDQogQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246Om1fZmllbGQgPSBOVUxMOw0KLXZvaWQgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKGludDMyX3QgJmUpDQotew0KLSAgICBtX2ZpZWxkID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNHRihDQkNfUERGNDE3Q29tbW9uOjpOVU1CRVJfT0ZfQ09ERVdPUkRTLCAzLCBlKTsNCit2b2lkIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6SW5pdGlhbGl6ZShpbnQzMl90JiBlKSB7DQorICBtX2ZpZWxkID0NCisgICAgICBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c0dGKENCQ19QREY0MTdDb21tb246Ok5VTUJFUl9PRl9DT0RFV09SRFMsIDMsIGUpOw0KIH0NCi12b2lkIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6RmluYWxpemUoKQ0KLXsNCi0gICAgZGVsZXRlIG1fZmllbGQ7DQordm9pZCBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246OkZpbmFsaXplKCkgew0KKyAgZGVsZXRlIG1fZmllbGQ7DQogfQ0KLUNCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6Q0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uKCkNCi17DQotfQ0KLUNCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6fkNCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbigpDQotew0KLX0NCi1pbnQzMl90IENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6ZGVjb2RlKENGWF9JbnQzMkFycmF5ICZyZWNlaXZlZCwgaW50MzJfdCBudW1FQ0NvZGV3b3JkcywgQ0ZYX0ludDMyQXJyYXkgJmVyYXN1cmVzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkgcG9seShtX2ZpZWxkLCByZWNlaXZlZCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAtMSk7DQotICAgIENGWF9JbnQzMkFycmF5IFM7DQotICAgIFMuU2V0U2l6ZShudW1FQ0NvZGV3b3Jkcyk7DQotICAgIEZYX0JPT0wgZXJyb3IgPSBGQUxTRTsNCi0gICAgZm9yIChpbnQzMl90IGwgPSBudW1FQ0NvZGV3b3JkczsgbCA+IDA7IGwtLSkgew0KLSAgICAgICAgaW50MzJfdCBldmFsID0gcG9seS5ldmFsdWF0ZUF0KG1fZmllbGQtPmV4cChsKSk7DQotICAgICAgICBTW251bUVDQ29kZXdvcmRzIC0gbF0gPSBldmFsOw0KLSAgICAgICAgaWYgKGV2YWwgIT0gMCkgew0KLSAgICAgICAgICAgIGVycm9yID0gVFJVRTsNCi0gICAgICAgIH0NCitDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246OkNCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbigpIHt9DQorQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjp+Q0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uKCkge30NCitpbnQzMl90IENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6ZGVjb2RlKENGWF9JbnQzMkFycmF5JiByZWNlaXZlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgZXJhc3VyZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSBwb2x5KG1fZmllbGQsIHJlY2VpdmVkLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAtMSk7DQorICBDRlhfSW50MzJBcnJheSBTOw0KKyAgUy5TZXRTaXplKG51bUVDQ29kZXdvcmRzKTsNCisgIEZYX0JPT0wgZXJyb3IgPSBGQUxTRTsNCisgIGZvciAoaW50MzJfdCBsID0gbnVtRUNDb2Rld29yZHM7IGwgPiAwOyBsLS0pIHsNCisgICAgaW50MzJfdCBldmFsID0gcG9seS5ldmFsdWF0ZUF0KG1fZmllbGQtPmV4cChsKSk7DQorICAgIFNbbnVtRUNDb2Rld29yZHMgLSBsXSA9IGV2YWw7DQorICAgIGlmIChldmFsICE9IDApIHsNCisgICAgICBlcnJvciA9IFRSVUU7DQogICAgIH0NCi0gICAgaWYgKCFlcnJvcikgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHN5bmRyb21lID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIFMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KLSAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYnVpbGRtb25vbWlhbCA9IG1fZmllbGQtPmJ1aWxkTW9ub21pYWwobnVtRUNDb2Rld29yZHMsIDEsIGUpOw0KLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICBkZWxldGUgc3luZHJvbWU7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgQ0ZYX1B0ckFycmF5KiBzaWdtYU9tZWdhID0gcnVuRXVjbGlkZWFuQWxnb3JpdGhtKGJ1aWxkbW9ub21pYWwsIHN5bmRyb21lLCBudW1FQ0NvZGV3b3JkcywgZSk7DQotICAgIGRlbGV0ZSBidWlsZG1vbm9taWFsOw0KKyAgfQ0KKyAgaWYgKCFlcnJvcikgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBzeW5kcm9tZSA9DQorICAgICAgRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIFMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBidWlsZG1vbm9taWFsID0NCisgICAgICBtX2ZpZWxkLT5idWlsZE1vbm9taWFsKG51bUVDQ29kZXdvcmRzLCAxLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCiAgICAgZGVsZXRlIHN5bmRyb21lOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KLSAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogc2lnbWEgPSAoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqKXNpZ21hT21lZ2EtPkdldEF0KDApOw0KLSAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogb21lZ2EgPSAoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqKXNpZ21hT21lZ2EtPkdldEF0KDEpOw0KLSAgICBDRlhfSW50MzJBcnJheSogZXJyb3JMb2NhdGlvbnMgPSBmaW5kRXJyb3JMb2NhdGlvbnMoc2lnbWEsIGUpOw0KLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaWdtYU9tZWdhLT5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIGRlbGV0ZSAoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqKXNpZ21hT21lZ2EtPkdldEF0KGkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc2lnbWFPbWVnYS0+UmVtb3ZlQWxsKCk7DQotICAgICAgICBkZWxldGUgc2lnbWFPbWVnYTsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBDRlhfSW50MzJBcnJheSogZXJyb3JNYWduaXR1ZGVzID0gZmluZEVycm9yTWFnbml0dWRlcyhvbWVnYSwgc2lnbWEsICplcnJvckxvY2F0aW9ucywgZSk7DQotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIGRlbGV0ZSBlcnJvckxvY2F0aW9uczsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpZ21hT21lZ2EtPkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgZGVsZXRlIChDQkNfUERGNDE3RUNNb2R1bHVzUG9seSopc2lnbWFPbWVnYS0+R2V0QXQoaSk7DQotICAgICAgICB9DQotICAgICAgICBzaWdtYU9tZWdhLT5SZW1vdmVBbGwoKTsNCi0gICAgICAgIGRlbGV0ZSBzaWdtYU9tZWdhOw0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGVycm9yTG9jYXRpb25zLT5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBsb2cgPSBtX2ZpZWxkLT5sb2coZXJyb3JMb2NhdGlvbnMtPkdldEF0KGkpLCBlKTs7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KLSAgICAgICAgaW50MzJfdCBwb3NpdGlvbiA9IHJlY2VpdmVkLkdldFNpemUoKSAtIDEgLSBsb2c7DQotICAgICAgICBpZiAocG9zaXRpb24gPCAwKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQotICAgICAgICAgICAgZGVsZXRlIGVycm9yTG9jYXRpb25zOw0KLSAgICAgICAgICAgIGRlbGV0ZSBlcnJvck1hZ25pdHVkZXM7DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgc2lnbWFPbWVnYS0+R2V0U2l6ZSgpOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIChDQkNfUERGNDE3RUNNb2R1bHVzUG9seSopc2lnbWFPbWVnYS0+R2V0QXQoaik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHNpZ21hT21lZ2EtPlJlbW92ZUFsbCgpOw0KLSAgICAgICAgICAgIGRlbGV0ZSBzaWdtYU9tZWdhOw0KLSAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJlY2VpdmVkW3Bvc2l0aW9uXSA9IG1fZmllbGQtPnN1YnRyYWN0KHJlY2VpdmVkW3Bvc2l0aW9uXSwgZXJyb3JNYWduaXR1ZGVzLT5HZXRBdChpKSk7DQotICAgIH0NCi0gICAgaW50MzJfdCByZXN1bHQgPSBlcnJvckxvY2F0aW9ucy0+R2V0U2l6ZSgpOw0KLSAgICBkZWxldGUgZXJyb3JMb2NhdGlvbnM7DQotICAgIGRlbGV0ZSBlcnJvck1hZ25pdHVkZXM7DQotICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHNpZ21hT21lZ2EtPkdldFNpemUoKTsgaysrKSB7DQotICAgICAgICBkZWxldGUgKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KilzaWdtYU9tZWdhLT5HZXRBdChrKTsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiBzaWdtYU9tZWdhID0NCisgICAgICBydW5FdWNsaWRlYW5BbGdvcml0aG0oYnVpbGRtb25vbWlhbCwgc3luZHJvbWUsIG51bUVDQ29kZXdvcmRzLCBlKTsNCisgIGRlbGV0ZSBidWlsZG1vbm9taWFsOw0KKyAgZGVsZXRlIHN5bmRyb21lOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBzaWdtYSA9DQorICAgICAgKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KilzaWdtYU9tZWdhLT5HZXRBdCgwKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvbWVnYSA9DQorICAgICAgKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KilzaWdtYU9tZWdhLT5HZXRBdCgxKTsNCisgIENGWF9JbnQzMkFycmF5KiBlcnJvckxvY2F0aW9ucyA9IGZpbmRFcnJvckxvY2F0aW9ucyhzaWdtYSwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpZ21hT21lZ2EtPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgZGVsZXRlIChDQkNfUERGNDE3RUNNb2R1bHVzUG9seSopc2lnbWFPbWVnYS0+R2V0QXQoaSk7DQogICAgIH0NCiAgICAgc2lnbWFPbWVnYS0+UmVtb3ZlQWxsKCk7DQogICAgIGRlbGV0ZSBzaWdtYU9tZWdhOw0KLSAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBDRlhfSW50MzJBcnJheSogZXJyb3JNYWduaXR1ZGVzID0NCisgICAgICBmaW5kRXJyb3JNYWduaXR1ZGVzKG9tZWdhLCBzaWdtYSwgKmVycm9yTG9jYXRpb25zLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZGVsZXRlIGVycm9yTG9jYXRpb25zOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaWdtYU9tZWdhLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgIGRlbGV0ZSAoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqKXNpZ21hT21lZ2EtPkdldEF0KGkpOw0KKyAgICB9DQorICAgIHNpZ21hT21lZ2EtPlJlbW92ZUFsbCgpOw0KKyAgICBkZWxldGUgc2lnbWFPbWVnYTsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZXJyb3JMb2NhdGlvbnMtPkdldFNpemUoKTsgaSsrKSB7DQorICAgIGludDMyX3QgbG9nID0gbV9maWVsZC0+bG9nKGVycm9yTG9jYXRpb25zLT5HZXRBdChpKSwgZSk7DQorICAgIDsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCisgICAgaW50MzJfdCBwb3NpdGlvbiA9IHJlY2VpdmVkLkdldFNpemUoKSAtIDEgLSBsb2c7DQorICAgIGlmIChwb3NpdGlvbiA8IDApIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUV4Y2VwdGlvbjsNCisgICAgICBkZWxldGUgZXJyb3JMb2NhdGlvbnM7DQorICAgICAgZGVsZXRlIGVycm9yTWFnbml0dWRlczsNCisgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBzaWdtYU9tZWdhLT5HZXRTaXplKCk7IGorKykgew0KKyAgICAgICAgZGVsZXRlIChDQkNfUERGNDE3RUNNb2R1bHVzUG9seSopc2lnbWFPbWVnYS0+R2V0QXQoaik7DQorICAgICAgfQ0KKyAgICAgIHNpZ21hT21lZ2EtPlJlbW92ZUFsbCgpOw0KKyAgICAgIGRlbGV0ZSBzaWdtYU9tZWdhOw0KKyAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICByZWNlaXZlZFtwb3NpdGlvbl0gPQ0KKyAgICAgICAgbV9maWVsZC0+c3VidHJhY3QocmVjZWl2ZWRbcG9zaXRpb25dLCBlcnJvck1hZ25pdHVkZXMtPkdldEF0KGkpKTsNCisgIH0NCisgIGludDMyX3QgcmVzdWx0ID0gZXJyb3JMb2NhdGlvbnMtPkdldFNpemUoKTsNCisgIGRlbGV0ZSBlcnJvckxvY2F0aW9uczsNCisgIGRlbGV0ZSBlcnJvck1hZ25pdHVkZXM7DQorICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBzaWdtYU9tZWdhLT5HZXRTaXplKCk7IGsrKykgew0KKyAgICBkZWxldGUgKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KilzaWdtYU9tZWdhLT5HZXRBdChrKTsNCisgIH0NCisgIHNpZ21hT21lZ2EtPlJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIHNpZ21hT21lZ2E7DQorICByZXR1cm4gcmVzdWx0Ow0KIH0NCi1DRlhfUHRyQXJyYXkqIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6cnVuRXVjbGlkZWFuQWxnb3JpdGhtKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBhLCBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYiwgaW50MzJfdCBSLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKGEtPmdldERlZ3JlZSgpIDwgYi0+Z2V0RGVncmVlKCkpIHsNCi0gICAgICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiB0ZW1wID0gYTsNCi0gICAgICAgIGEgPSBiOw0KLSAgICAgICAgYiA9IHRlbXA7DQotICAgIH0NCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHJMYXN0ID0gYTsNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHIgPSBiOw0KLSAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogdExhc3QgPSBtX2ZpZWxkLT5nZXRaZXJvKCk7DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiB0ID0gbV9maWVsZC0+Z2V0T25lKCk7DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBxdGVtcCA9IE5VTEw7DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBydGVtcCA9IE5VTEw7DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiB0dGVtcCA9IE5VTEw7DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGludDMyX3QgaiA9IDA7DQotICAgIGludDMyX3QgbSA9IDA7DQotICAgIGludDMyX3QgbiA9IDA7DQotICAgIHdoaWxlIChyLT5nZXREZWdyZWUoKSA+PSBSIC8gMikgew0KLSAgICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHJMYXN0TGFzdCA9IHJMYXN0Ow0KLSAgICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHRMYXN0TGFzdCA9IHRMYXN0Ow0KLSAgICAgICAgckxhc3QgPSByOw0KLSAgICAgICAgdExhc3QgPSB0Ow0KLSAgICAgICAgbSA9IGk7DQotICAgICAgICBuID0gajsNCi0gICAgICAgIGlmIChyTGFzdC0+aXNaZXJvKCkpIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUV4Y2VwdGlvbjsNCi0gICAgICAgICAgICBpZiAocXRlbXApIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHF0ZW1wOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocnRlbXApIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAodHRlbXApIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHR0ZW1wOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHIgPSByTGFzdExhc3Q7DQotICAgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogcSA9IG1fZmllbGQtPmdldFplcm8oKTsNCi0gICAgICAgIGludDMyX3QgZGVub21pbmF0b3JMZWFkaW5nVGVybSA9IHJMYXN0LT5nZXRDb2VmZmljaWVudChyTGFzdC0+Z2V0RGVncmVlKCkpOw0KLSAgICAgICAgaW50MzJfdCBkbHRJbnZlcnNlID0gbV9maWVsZC0+aW52ZXJzZShkZW5vbWluYXRvckxlYWRpbmdUZXJtLCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBpZiAocXRlbXApIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHF0ZW1wOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocnRlbXApIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAodHRlbXApIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHR0ZW1wOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHdoaWxlIChyLT5nZXREZWdyZWUoKSA+PSByTGFzdC0+Z2V0RGVncmVlKCkgJiYgIXItPmlzWmVybygpKSB7DQotICAgICAgICAgICAgaW50MzJfdCBkZWdyZWVEaWZmID0gci0+Z2V0RGVncmVlKCkgLSByTGFzdC0+Z2V0RGVncmVlKCk7DQotICAgICAgICAgICAgaW50MzJfdCBzY2FsZSA9IG1fZmllbGQtPm11bHRpcGx5KHItPmdldENvZWZmaWNpZW50KHItPmdldERlZ3JlZSgpKSwgZGx0SW52ZXJzZSk7DQotICAgICAgICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGJ1aWxkbW9ub21pYWwgPSBtX2ZpZWxkLT5idWlsZE1vbm9taWFsKGRlZ3JlZURpZmYsIHNjYWxlLCBlKTsNCi0gICAgICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgICAgIGlmIChxdGVtcCkgew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF0ZW1wOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChydGVtcCkgew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmICh0dGVtcCkgew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHR0ZW1wOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBxID0gcS0+YWRkKGJ1aWxkbW9ub21pYWwsIGUpOw0KLSAgICAgICAgICAgIGRlbGV0ZSBidWlsZG1vbm9taWFsOw0KLSAgICAgICAgICAgIGlmIChxdGVtcCkgew0KLSAgICAgICAgICAgICAgICBkZWxldGUgcXRlbXA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICAgICAgaWYgKHJ0ZW1wKSB7DQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcnRlbXA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHR0ZW1wKSB7DQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgdHRlbXA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHF0ZW1wID0gcTsNCi0gICAgICAgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbXVsdGlwbHkgID0gckxhc3QtPm11bHRpcGx5QnlNb25vbWlhbChkZWdyZWVEaWZmLCBzY2FsZSwgZSk7DQotICAgICAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgICAgICAgICBpZiAocXRlbXApIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBxdGVtcDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAocnRlbXApIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBydGVtcDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAodHRlbXApIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0dGVtcDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHRlbXAgPSByOw0KLSAgICAgICAgICAgIHIgPSB0ZW1wLT5zdWJ0cmFjdChtdWx0aXBseSwgZSk7DQotICAgICAgICAgICAgZGVsZXRlIG11bHRpcGx5Ow0KLSAgICAgICAgICAgIGlmIChtID4gMSAmJiBpID4gbSkgew0KLSAgICAgICAgICAgICAgICBkZWxldGUgdGVtcDsNCi0gICAgICAgICAgICAgICAgdGVtcCA9IE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICAgICAgaWYgKHF0ZW1wKSB7DQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcXRlbXA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHJ0ZW1wKSB7DQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcnRlbXA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHR0ZW1wKSB7DQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgdHRlbXA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJ0ZW1wID0gcjsNCi0gICAgICAgICAgICBpID0gbSArIDE7DQotICAgICAgICB9DQotICAgICAgICB0dGVtcCA9IHEtPm11bHRpcGx5KHRMYXN0LCBlKTsNCi0gICAgICAgIGlmIChxdGVtcCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBxdGVtcDsNCi0gICAgICAgICAgICBxdGVtcCA9IE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgaWYgKHJ0ZW1wKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBydGVtcDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHR0ZW1wKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSB0dGVtcDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICB0ID0gdHRlbXAtPnN1YnRyYWN0KHRMYXN0TGFzdCwgZSk7DQotICAgICAgICBpZiAobiA+IDEgJiYgaiA+IG4pIHsNCi0gICAgICAgICAgICBkZWxldGUgdExhc3RMYXN0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZGVsZXRlIHR0ZW1wOw0KLSAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgICAgIGlmIChydGVtcCkgew0KLSAgICAgICAgICAgICAgICBkZWxldGUgcnRlbXA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdHRlbXAgPSB0Ow0KLSAgICAgICAgdCA9IHR0ZW1wLT5uZWdhdGl2ZShlKTsNCi0gICAgICAgIGRlbGV0ZSB0dGVtcDsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBpZiAocnRlbXApIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHR0ZW1wID0gdDsNCi0gICAgICAgIGorKzsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGFhID0gdC0+Z2V0Q29lZmZpY2llbnQoMSk7DQotICAgIGludDMyX3Qgc2lnbWFUaWxkZUF0WmVybyA9IHQtPmdldENvZWZmaWNpZW50KDApOw0KLSAgICBpZiAoc2lnbWFUaWxkZUF0WmVybyA9PSAwKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUV4Y2VwdGlvbjsNCi0gICAgICAgIGlmIChydGVtcCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBydGVtcDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh0dGVtcCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSB0dGVtcDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGludDMyX3QgaW52ZXJzZSA9IG1fZmllbGQtPmludmVyc2Uoc2lnbWFUaWxkZUF0WmVybywgZSk7DQotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIGlmIChydGVtcCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBydGVtcDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh0dGVtcCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSB0dGVtcDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBzaWdtYSA9IHQtPm11bHRpcGx5KGludmVyc2UsIGUpOw0KLSAgICBpZiAodHRlbXApIHsNCi0gICAgICAgIGRlbGV0ZSB0dGVtcDsNCi0gICAgfQ0KLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICBpZiAocnRlbXApIHsNCi0gICAgICAgICAgICBkZWxldGUgcnRlbXA7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogb21lZ2EgPSByLT5tdWx0aXBseShpbnZlcnNlLCBlKTsNCi0gICAgaWYgKHJ0ZW1wKSB7DQorQ0ZYX1B0ckFycmF5KiBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246OnJ1bkV1Y2xpZGVhbkFsZ29yaXRobSgNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGEsDQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBiLA0KKyAgICBpbnQzMl90IFIsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChhLT5nZXREZWdyZWUoKSA8IGItPmdldERlZ3JlZSgpKSB7DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiB0ZW1wID0gYTsNCisgICAgYSA9IGI7DQorICAgIGIgPSB0ZW1wOw0KKyAgfQ0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHJMYXN0ID0gYTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiByID0gYjsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiB0TGFzdCA9IG1fZmllbGQtPmdldFplcm8oKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiB0ID0gbV9maWVsZC0+Z2V0T25lKCk7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogcXRlbXAgPSBOVUxMOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHJ0ZW1wID0gTlVMTDsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiB0dGVtcCA9IE5VTEw7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaW50MzJfdCBqID0gMDsNCisgIGludDMyX3QgbSA9IDA7DQorICBpbnQzMl90IG4gPSAwOw0KKyAgd2hpbGUgKHItPmdldERlZ3JlZSgpID49IFIgLyAyKSB7DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiByTGFzdExhc3QgPSByTGFzdDsNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHRMYXN0TGFzdCA9IHRMYXN0Ow0KKyAgICByTGFzdCA9IHI7DQorICAgIHRMYXN0ID0gdDsNCisgICAgbSA9IGk7DQorICAgIG4gPSBqOw0KKyAgICBpZiAockxhc3QtPmlzWmVybygpKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQorICAgICAgaWYgKHF0ZW1wKSB7DQorICAgICAgICBkZWxldGUgcXRlbXA7DQorICAgICAgfQ0KKyAgICAgIGlmIChydGVtcCkgew0KICAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KKyAgICAgIH0NCisgICAgICBpZiAodHRlbXApIHsNCisgICAgICAgIGRlbGV0ZSB0dGVtcDsNCisgICAgICB9DQorICAgICAgcmV0dXJuIE5VTEw7DQogICAgIH0NCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDRlhfUHRyQXJyYXkqIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCi0gICAgbW9kdWx1c1BvbHktPkFkZChzaWdtYSk7DQotICAgIG1vZHVsdXNQb2x5LT5BZGQob21lZ2EpOw0KLSAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQotfQ0KLUNGWF9JbnQzMkFycmF5KiBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246OmZpbmRFcnJvckxvY2F0aW9ucyhDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZXJyb3JMb2NhdG9yLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBudW1FcnJvcnMgPSBlcnJvckxvY2F0b3ItPmdldERlZ3JlZSgpOw0KLSAgICBDRlhfSW50MzJBcnJheSogcmVzdWx0ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KLSAgICByZXN1bHQtPlNldFNpemUobnVtRXJyb3JzKTsNCi0gICAgaW50MzJfdCBlZSA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IG1fZmllbGQtPmdldFNpemUoKSAmJiBlZSA8IG51bUVycm9yczsgaSsrKSB7DQotICAgICAgICBpZiAoZXJyb3JMb2NhdG9yLT5ldmFsdWF0ZUF0KGkpID09IDApIHsNCi0gICAgICAgICAgICByZXN1bHQtPlNldEF0KGVlLCBtX2ZpZWxkLT5pbnZlcnNlKGksIGUpKTsNCi0gICAgICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlZSsrOw0KKyAgICByID0gckxhc3RMYXN0Ow0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogcSA9IG1fZmllbGQtPmdldFplcm8oKTsNCisgICAgaW50MzJfdCBkZW5vbWluYXRvckxlYWRpbmdUZXJtID0gckxhc3QtPmdldENvZWZmaWNpZW50KHJMYXN0LT5nZXREZWdyZWUoKSk7DQorICAgIGludDMyX3QgZGx0SW52ZXJzZSA9IG1fZmllbGQtPmludmVyc2UoZGVub21pbmF0b3JMZWFkaW5nVGVybSwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBpZiAocXRlbXApIHsNCisgICAgICAgIGRlbGV0ZSBxdGVtcDsNCisgICAgICB9DQorICAgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgICBkZWxldGUgcnRlbXA7DQorICAgICAgfQ0KKyAgICAgIGlmICh0dGVtcCkgew0KKyAgICAgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICB3aGlsZSAoci0+Z2V0RGVncmVlKCkgPj0gckxhc3QtPmdldERlZ3JlZSgpICYmICFyLT5pc1plcm8oKSkgew0KKyAgICAgIGludDMyX3QgZGVncmVlRGlmZiA9IHItPmdldERlZ3JlZSgpIC0gckxhc3QtPmdldERlZ3JlZSgpOw0KKyAgICAgIGludDMyX3Qgc2NhbGUgPQ0KKyAgICAgICAgICBtX2ZpZWxkLT5tdWx0aXBseShyLT5nZXRDb2VmZmljaWVudChyLT5nZXREZWdyZWUoKSksIGRsdEludmVyc2UpOw0KKyAgICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBidWlsZG1vbm9taWFsID0NCisgICAgICAgICAgbV9maWVsZC0+YnVpbGRNb25vbWlhbChkZWdyZWVEaWZmLCBzY2FsZSwgZSk7DQorICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgaWYgKHF0ZW1wKSB7DQorICAgICAgICAgIGRlbGV0ZSBxdGVtcDsNCiAgICAgICAgIH0NCisgICAgICAgIGlmIChydGVtcCkgew0KKyAgICAgICAgICBkZWxldGUgcnRlbXA7DQorICAgICAgICB9DQorICAgICAgICBpZiAodHRlbXApIHsNCisgICAgICAgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIHEgPSBxLT5hZGQoYnVpbGRtb25vbWlhbCwgZSk7DQorICAgICAgZGVsZXRlIGJ1aWxkbW9ub21pYWw7DQorICAgICAgaWYgKHF0ZW1wKSB7DQorICAgICAgICBkZWxldGUgcXRlbXA7DQorICAgICAgfQ0KKyAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIGlmIChydGVtcCkgew0KKyAgICAgICAgICBkZWxldGUgcnRlbXA7DQorICAgICAgICB9DQorICAgICAgICBpZiAodHRlbXApIHsNCisgICAgICAgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIHF0ZW1wID0gcTsNCisgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbXVsdGlwbHkgPQ0KKyAgICAgICAgICByTGFzdC0+bXVsdGlwbHlCeU1vbm9taWFsKGRlZ3JlZURpZmYsIHNjYWxlLCBlKTsNCisgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBpZiAocXRlbXApIHsNCisgICAgICAgICAgZGVsZXRlIHF0ZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh0dGVtcCkgew0KKyAgICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHRlbXAgPSByOw0KKyAgICAgIHIgPSB0ZW1wLT5zdWJ0cmFjdChtdWx0aXBseSwgZSk7DQorICAgICAgZGVsZXRlIG11bHRpcGx5Ow0KKyAgICAgIGlmIChtID4gMSAmJiBpID4gbSkgew0KKyAgICAgICAgZGVsZXRlIHRlbXA7DQorICAgICAgICB0ZW1wID0gTlVMTDsNCisgICAgICB9DQorICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgaWYgKHF0ZW1wKSB7DQorICAgICAgICAgIGRlbGV0ZSBxdGVtcDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChydGVtcCkgew0KKyAgICAgICAgICBkZWxldGUgcnRlbXA7DQorICAgICAgICB9DQorICAgICAgICBpZiAodHRlbXApIHsNCisgICAgICAgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIHJ0ZW1wID0gcjsNCisgICAgICBpID0gbSArIDE7DQogICAgIH0NCi0gICAgaWYgKGVlICE9IG51bUVycm9ycykgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQorICAgIHR0ZW1wID0gcS0+bXVsdGlwbHkodExhc3QsIGUpOw0KKyAgICBpZiAocXRlbXApIHsNCisgICAgICBkZWxldGUgcXRlbXA7DQorICAgICAgcXRlbXAgPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBpZiAocnRlbXApIHsNCisgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICB9DQorICAgICAgaWYgKHR0ZW1wKSB7DQorICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHQgPSB0dGVtcC0+c3VidHJhY3QodExhc3RMYXN0LCBlKTsNCisgICAgaWYgKG4gPiAxICYmIGogPiBuKSB7DQorICAgICAgZGVsZXRlIHRMYXN0TGFzdDsNCisgICAgfQ0KKyAgICBkZWxldGUgdHRlbXA7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBpZiAocnRlbXApIHsNCisgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICB9DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgdHRlbXAgPSB0Ow0KKyAgICB0ID0gdHRlbXAtPm5lZ2F0aXZlKGUpOw0KKyAgICBkZWxldGUgdHRlbXA7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBpZiAocnRlbXApIHsNCisgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICB9DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgdHRlbXAgPSB0Ow0KKyAgICBqKys7DQorICB9DQorICBpbnQzMl90IGFhID0gdC0+Z2V0Q29lZmZpY2llbnQoMSk7DQorICBpbnQzMl90IHNpZ21hVGlsZGVBdFplcm8gPSB0LT5nZXRDb2VmZmljaWVudCgwKTsNCisgIGlmIChzaWdtYVRpbGRlQXRaZXJvID09IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQorICAgIGlmIChydGVtcCkgew0KKyAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgfQ0KKyAgICBpZiAodHRlbXApIHsNCisgICAgICBkZWxldGUgdHRlbXA7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IGludmVyc2UgPSBtX2ZpZWxkLT5pbnZlcnNlKHNpZ21hVGlsZGVBdFplcm8sIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBpZiAocnRlbXApIHsNCisgICAgICBkZWxldGUgcnRlbXA7DQorICAgIH0NCisgICAgaWYgKHR0ZW1wKSB7DQorICAgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHNpZ21hID0gdC0+bXVsdGlwbHkoaW52ZXJzZSwgZSk7DQorICBpZiAodHRlbXApIHsNCisgICAgZGVsZXRlIHR0ZW1wOw0KKyAgfQ0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBpZiAocnRlbXApIHsNCisgICAgICBkZWxldGUgcnRlbXA7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogb21lZ2EgPSByLT5tdWx0aXBseShpbnZlcnNlLCBlKTsNCisgIGlmIChydGVtcCkgew0KKyAgICBkZWxldGUgcnRlbXA7DQorICB9DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDRlhfUHRyQXJyYXkqIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgIG1vZHVsdXNQb2x5LT5BZGQoc2lnbWEpOw0KKyAgbW9kdWx1c1BvbHktPkFkZChvbWVnYSk7DQorICByZXR1cm4gbW9kdWx1c1BvbHk7DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246OmZpbmRFcnJvckxvY2F0aW9ucygNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGVycm9yTG9jYXRvciwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBudW1FcnJvcnMgPSBlcnJvckxvY2F0b3ItPmdldERlZ3JlZSgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIHJlc3VsdCA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCisgIHJlc3VsdC0+U2V0U2l6ZShudW1FcnJvcnMpOw0KKyAgaW50MzJfdCBlZSA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBtX2ZpZWxkLT5nZXRTaXplKCkgJiYgZWUgPCBudW1FcnJvcnM7IGkrKykgew0KKyAgICBpZiAoZXJyb3JMb2NhdG9yLT5ldmFsdWF0ZUF0KGkpID09IDApIHsNCisgICAgICByZXN1bHQtPlNldEF0KGVlLCBtX2ZpZWxkLT5pbnZlcnNlKGksIGUpKTsNCisgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQogICAgICAgICBkZWxldGUgcmVzdWx0Ow0KICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGVlKys7DQogICAgIH0NCi0gICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisgIGlmIChlZSAhPSBudW1FcnJvcnMpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQorICAgIGRlbGV0ZSByZXN1bHQ7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCiB9DQotQ0ZYX0ludDMyQXJyYXkqIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6ZmluZEVycm9yTWFnbml0dWRlcyhDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZXJyb3JFdmFsdWF0b3IsIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBlcnJvckxvY2F0b3IsIENGWF9JbnQzMkFycmF5ICZlcnJvckxvY2F0aW9ucywgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgZXJyb3JMb2NhdG9yRGVncmVlID0gZXJyb3JMb2NhdG9yLT5nZXREZWdyZWUoKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50czsNCi0gICAgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50cy5TZXRTaXplKGVycm9yTG9jYXRvckRlZ3JlZSk7DQotICAgIGZvciAoaW50MzJfdCBsID0gMTsgbCA8PSBlcnJvckxvY2F0b3JEZWdyZWU7IGwrKykgew0KLSAgICAgICAgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50c1tlcnJvckxvY2F0b3JEZWdyZWUgLSBsXSA9IG1fZmllbGQtPm11bHRpcGx5KGwsIGVycm9yTG9jYXRvci0+Z2V0Q29lZmZpY2llbnQobCkpOw0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246OmZpbmRFcnJvck1hZ25pdHVkZXMoDQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBlcnJvckV2YWx1YXRvciwNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGVycm9yTG9jYXRvciwNCisgICAgQ0ZYX0ludDMyQXJyYXkmIGVycm9yTG9jYXRpb25zLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGVycm9yTG9jYXRvckRlZ3JlZSA9IGVycm9yTG9jYXRvci0+Z2V0RGVncmVlKCk7DQorICBDRlhfSW50MzJBcnJheSBmb3JtYWxEZXJpdmF0aXZlQ29lZmZpY2llbnRzOw0KKyAgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50cy5TZXRTaXplKGVycm9yTG9jYXRvckRlZ3JlZSk7DQorICBmb3IgKGludDMyX3QgbCA9IDE7IGwgPD0gZXJyb3JMb2NhdG9yRGVncmVlOyBsKyspIHsNCisgICAgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50c1tlcnJvckxvY2F0b3JEZWdyZWUgLSBsXSA9DQorICAgICAgICBtX2ZpZWxkLT5tdWx0aXBseShsLCBlcnJvckxvY2F0b3ItPmdldENvZWZmaWNpZW50KGwpKTsNCisgIH0NCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5IGZvcm1hbERlcml2YXRpdmUobV9maWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBpbnQzMl90IHMgPSBlcnJvckxvY2F0aW9ucy5HZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSogcmVzdWx0ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgcmVzdWx0LT5TZXRTaXplKHMpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgczsgaSsrKSB7DQorICAgIGludDMyX3QgeGlJbnZlcnNlID0gbV9maWVsZC0+aW52ZXJzZShlcnJvckxvY2F0aW9uc1tpXSwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBkZWxldGUgcmVzdWx0Ow0KKyAgICAgIHJldHVybiBOVUxMOw0KICAgICB9DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5IGZvcm1hbERlcml2YXRpdmUobV9maWVsZCwgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50cywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgaW50MzJfdCBzID0gZXJyb3JMb2NhdGlvbnMuR2V0U2l6ZSgpOw0KLSAgICBDRlhfSW50MzJBcnJheSogcmVzdWx0ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KLSAgICByZXN1bHQtPlNldFNpemUocyk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHM7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCB4aUludmVyc2UgPSBtX2ZpZWxkLT5pbnZlcnNlKGVycm9yTG9jYXRpb25zW2ldLCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBkZWxldGUgcmVzdWx0Ow0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBudW1lcmF0b3IgPSBtX2ZpZWxkLT5zdWJ0cmFjdCgwLCBlcnJvckV2YWx1YXRvci0+ZXZhbHVhdGVBdCh4aUludmVyc2UpKTsNCi0gICAgICAgIGludDMyX3QgZGVub21pbmF0b3IgPSBtX2ZpZWxkLT5pbnZlcnNlKGZvcm1hbERlcml2YXRpdmUuZXZhbHVhdGVBdCh4aUludmVyc2UpLCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBkZWxldGUgcmVzdWx0Ow0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmVzdWx0LT5TZXRBdChpLCBtX2ZpZWxkLT5tdWx0aXBseShudW1lcmF0b3IsIGRlbm9taW5hdG9yKSk7DQorICAgIGludDMyX3QgbnVtZXJhdG9yID0NCisgICAgICAgIG1fZmllbGQtPnN1YnRyYWN0KDAsIGVycm9yRXZhbHVhdG9yLT5ldmFsdWF0ZUF0KHhpSW52ZXJzZSkpOw0KKyAgICBpbnQzMl90IGRlbm9taW5hdG9yID0NCisgICAgICAgIG1fZmllbGQtPmludmVyc2UoZm9ybWFsRGVyaXZhdGl2ZS5ldmFsdWF0ZUF0KHhpSW52ZXJzZSksIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgZGVsZXRlIHJlc3VsdDsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICByZXN1bHQtPlNldEF0KGksIG1fZmllbGQtPm11bHRpcGx5KG51bWVyYXRvciwgZGVub21pbmF0b3IpKTsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbi5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmgKaW5kZXggYzhhMjA1OC4uYWE4NjA3NyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmgKQEAgLTgsMTggKzgsMzAgQEAKICNkZWZpbmUgX0JDX1BERjQxN0VDRVJST1JDT1JSRUNUSU9OX0hfDQogY2xhc3MgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOw0KIGNsYXNzIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5Ow0KLWNsYXNzIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24oKTsNCi0gICAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZShpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCi0gICAgc3RhdGljIGludDMyX3QgZGVjb2RlKENGWF9JbnQzMkFycmF5ICZyZWNlaXZlZCwgaW50MzJfdCBudW1FQ0NvZGV3b3JkcywgQ0ZYX0ludDMyQXJyYXkgJmVyYXN1cmVzLCBpbnQzMl90ICZlKTsNCi1wcml2YXRlOg0KLSAgICBzdGF0aWMgQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBtX2ZpZWxkOw0KLSAgICBzdGF0aWMgQ0ZYX1B0ckFycmF5KiBydW5FdWNsaWRlYW5BbGdvcml0aG0oQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGEsIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBiLCBpbnQzMl90IFIsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIGZpbmRFcnJvckxvY2F0aW9ucyhDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZXJyb3JMb2NhdG9yLCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIENGWF9JbnQzMkFycmF5KiBmaW5kRXJyb3JNYWduaXR1ZGVzKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBlcnJvckV2YWx1YXRvciwgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGVycm9yTG9jYXRvciwgQ0ZYX0ludDMyQXJyYXkgJmVycm9yTG9jYXRpb25zLCBpbnQzMl90ICZlKTsNCitjbGFzcyBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24gew0KKyBwdWJsaWM6DQorICBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24oKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbigpOw0KKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZShpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBzdGF0aWMgaW50MzJfdCBkZWNvZGUoQ0ZYX0ludDMyQXJyYXkmIHJlY2VpdmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGVyYXN1cmVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIENCQ19QREY0MTdFQ01vZHVsdXNHRiogbV9maWVsZDsNCisgIHN0YXRpYyBDRlhfUHRyQXJyYXkqIHJ1bkV1Y2xpZGVhbkFsZ29yaXRobShDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IFIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIGZpbmRFcnJvckxvY2F0aW9ucygNCisgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZXJyb3JMb2NhdG9yLA0KKyAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENGWF9JbnQzMkFycmF5KiBmaW5kRXJyb3JNYWduaXR1ZGVzKA0KKyAgICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBlcnJvckV2YWx1YXRvciwNCisgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZXJyb3JMb2NhdG9yLA0KKyAgICAgIENGWF9JbnQzMkFycmF5JiBlcnJvckxvY2F0aW9ucywNCisgICAgICBpbnQzMl90JiBlKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNHRi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNNb2R1bHVzR0YuY3BwCmluZGV4IDFiNDE0NzQuLjAyOWE1ZTUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNHRi5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDTW9kdWx1c0dGLmNwcApAQCAtMjUsMTAyICsyNSw5NSBAQAogI2luY2x1ZGUgIkJDX1BERjQxN0VDTW9kdWx1c1BvbHkuaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3RUNNb2R1bHVzR0YuaCINCiBDQkNfUERGNDE3RUNNb2R1bHVzR0YqIENCQ19QREY0MTdFQ01vZHVsdXNHRjo6UERGNDE3X0dGID0gTlVMTDsNCi12b2lkIENCQ19QREY0MTdFQ01vZHVsdXNHRjo6SW5pdGlhbGl6ZShpbnQzMl90ICZlKQ0KLXsNCi0gICAgUERGNDE3X0dGID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNHRihDQkNfUERGNDE3Q29tbW9uOjpOVU1CRVJfT0ZfQ09ERVdPUkRTLCAzLCBlKTsNCit2b2lkIENCQ19QREY0MTdFQ01vZHVsdXNHRjo6SW5pdGlhbGl6ZShpbnQzMl90JiBlKSB7DQorICBQREY0MTdfR0YgPQ0KKyAgICAgIEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzR0YoQ0JDX1BERjQxN0NvbW1vbjo6TlVNQkVSX09GX0NPREVXT1JEUywgMywgZSk7DQogfQ0KLXZvaWQgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpGaW5hbGl6ZSgpDQotew0KLSAgICBkZWxldGUgUERGNDE3X0dGOw0KK3ZvaWQgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpGaW5hbGl6ZSgpIHsNCisgIGRlbGV0ZSBQREY0MTdfR0Y7DQogfQ0KLUNCQ19QREY0MTdFQ01vZHVsdXNHRjo6Q0JDX1BERjQxN0VDTW9kdWx1c0dGKGludDMyX3QgbW9kdWx1cywgaW50MzJfdCBnZW5lcmF0b3IsIGludDMyX3QgJmUpDQotew0KLSAgICBtX21vZHVsdXMgPSBtb2R1bHVzOw0KLSAgICBtX2V4cFRhYmxlLlNldFNpemUobW9kdWx1cyk7DQotICAgIG1fbG9nVGFibGUuU2V0U2l6ZShtb2R1bHVzKTsNCi0gICAgaW50MzJfdCB4ID0gMTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbW9kdWx1czsgaSsrKSB7DQotICAgICAgICBtX2V4cFRhYmxlW2ldID0geDsNCi0gICAgICAgIHggPSAoeCAqIGdlbmVyYXRvcikgJSBtb2R1bHVzOw0KLSAgICB9DQotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG1vZHVsdXMgLSAxOyBqKyspIHsNCi0gICAgICAgIG1fbG9nVGFibGVbbV9leHBUYWJsZVtqXV0gPSBqOw0KLSAgICB9DQotICAgIENGWF9JbnQzMkFycmF5IHplcm87DQotICAgIHplcm8uQWRkKDApOw0KLSAgICBtX3plcm8gPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkodGhpcywgemVybywgZSk7DQotICAgIENGWF9JbnQzMkFycmF5IG9uZTsNCi0gICAgb25lLkFkZCgxKTsNCi0gICAgbV9vbmUgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkodGhpcywgb25lLCBlKTsNCitDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OkNCQ19QREY0MTdFQ01vZHVsdXNHRihpbnQzMl90IG1vZHVsdXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgbV9tb2R1bHVzID0gbW9kdWx1czsNCisgIG1fZXhwVGFibGUuU2V0U2l6ZShtb2R1bHVzKTsNCisgIG1fbG9nVGFibGUuU2V0U2l6ZShtb2R1bHVzKTsNCisgIGludDMyX3QgeCA9IDE7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtb2R1bHVzOyBpKyspIHsNCisgICAgbV9leHBUYWJsZVtpXSA9IHg7DQorICAgIHggPSAoeCAqIGdlbmVyYXRvcikgJSBtb2R1bHVzOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbW9kdWx1cyAtIDE7IGorKykgew0KKyAgICBtX2xvZ1RhYmxlW21fZXhwVGFibGVbal1dID0gajsNCisgIH0NCisgIENGWF9JbnQzMkFycmF5IHplcm87DQorICB6ZXJvLkFkZCgwKTsNCisgIG1femVybyA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSh0aGlzLCB6ZXJvLCBlKTsNCisgIENGWF9JbnQzMkFycmF5IG9uZTsNCisgIG9uZS5BZGQoMSk7DQorICBtX29uZSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSh0aGlzLCBvbmUsIGUpOw0KIH0NCi1DQkNfUERGNDE3RUNNb2R1bHVzR0Y6On5DQkNfUERGNDE3RUNNb2R1bHVzR0YoKQ0KLXsNCi0gICAgZGVsZXRlIG1femVybzsNCi0gICAgZGVsZXRlIG1fb25lOw0KK0NCQ19QREY0MTdFQ01vZHVsdXNHRjo6fkNCQ19QREY0MTdFQ01vZHVsdXNHRigpIHsNCisgIGRlbGV0ZSBtX3plcm87DQorICBkZWxldGUgbV9vbmU7DQogfQ0KLUNCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OmdldFplcm8oKQ0KLXsNCi0gICAgcmV0dXJuIG1femVybzsNCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpnZXRaZXJvKCkgew0KKyAgcmV0dXJuIG1femVybzsNCiB9DQotQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIENCQ19QREY0MTdFQ01vZHVsdXNHRjo6Z2V0T25lKCkNCi17DQotICAgIHJldHVybiBtX29uZTsNCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpnZXRPbmUoKSB7DQorICByZXR1cm4gbV9vbmU7DQogfQ0KLUNCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OmJ1aWxkTW9ub21pYWwoaW50MzJfdCBkZWdyZWUsIGludDMyX3QgY29lZmZpY2llbnQsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoZGVncmVlIDwgMCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG1vZHVsdXNQb2x5ID0gTlVMTDsNCi0gICAgaWYgKGNvZWZmaWNpZW50ID09IDApIHsNCi0gICAgICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1femVyby0+Z2V0RmllbGQoKSwgbV96ZXJvLT5nZXRDb2VmZmljaWVudHMoKSwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQotICAgIH0NCi0gICAgQ0ZYX0ludDMyQXJyYXkgY29lZmZpY2llbnRzOw0KLSAgICBjb2VmZmljaWVudHMuU2V0U2l6ZShkZWdyZWUgKyAxKTsNCi0gICAgY29lZmZpY2llbnRzWzBdID0gY29lZmZpY2llbnQ7DQotICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KHRoaXMsIGNvZWZmaWNpZW50cywgZSk7DQorQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIENCQ19QREY0MTdFQ01vZHVsdXNHRjo6YnVpbGRNb25vbWlhbCgNCisgICAgaW50MzJfdCBkZWdyZWUsDQorICAgIGludDMyX3QgY29lZmZpY2llbnQsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChkZWdyZWUgPCAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbW9kdWx1c1BvbHkgPSBOVUxMOw0KKyAgaWYgKGNvZWZmaWNpZW50ID09IDApIHsNCisgICAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV96ZXJvLT5nZXRGaWVsZCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3plcm8tPmdldENvZWZmaWNpZW50cygpLCBlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KICAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQorICB9DQorICBDRlhfSW50MzJBcnJheSBjb2VmZmljaWVudHM7DQorICBjb2VmZmljaWVudHMuU2V0U2l6ZShkZWdyZWUgKyAxKTsNCisgIGNvZWZmaWNpZW50c1swXSA9IGNvZWZmaWNpZW50Ow0KKyAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkodGhpcywgY29lZmZpY2llbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiBtb2R1bHVzUG9seTsNCiB9DQotaW50MzJfdCBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OmFkZChpbnQzMl90IGEsIGludDMyX3QgYikNCi17DQotICAgIHJldHVybiAoYSArIGIpICUgbV9tb2R1bHVzOw0KK2ludDMyX3QgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjphZGQoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsNCisgIHJldHVybiAoYSArIGIpICUgbV9tb2R1bHVzOw0KIH0NCi1pbnQzMl90IENCQ19QREY0MTdFQ01vZHVsdXNHRjo6c3VidHJhY3QoaW50MzJfdCBhLCBpbnQzMl90IGIpDQotew0KLSAgICByZXR1cm4gKG1fbW9kdWx1cyArIGEgLSBiKSAlIG1fbW9kdWx1czsNCitpbnQzMl90IENCQ19QREY0MTdFQ01vZHVsdXNHRjo6c3VidHJhY3QoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsNCisgIHJldHVybiAobV9tb2R1bHVzICsgYSAtIGIpICUgbV9tb2R1bHVzOw0KIH0NCi1pbnQzMl90IENCQ19QREY0MTdFQ01vZHVsdXNHRjo6ZXhwKGludDMyX3QgYSkNCi17DQotICAgIHJldHVybiBtX2V4cFRhYmxlW2FdOw0KK2ludDMyX3QgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpleHAoaW50MzJfdCBhKSB7DQorICByZXR1cm4gbV9leHBUYWJsZVthXTsNCiB9DQotaW50MzJfdCBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OmxvZyhpbnQzMl90IGEsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoYSA9PSAwKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fbG9nVGFibGVbYV07DQoraW50MzJfdCBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OmxvZyhpbnQzMl90IGEsIGludDMyX3QmIGUpIHsNCisgIGlmIChhID09IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICByZXR1cm4gbV9sb2dUYWJsZVthXTsNCiB9DQotaW50MzJfdCBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OmludmVyc2UoaW50MzJfdCBhLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKGEgPT0gMCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIHJldHVybiBtX2V4cFRhYmxlW21fbW9kdWx1cyAtIG1fbG9nVGFibGVbYV0gLSAxXTsNCitpbnQzMl90IENCQ19QREY0MTdFQ01vZHVsdXNHRjo6aW52ZXJzZShpbnQzMl90IGEsIGludDMyX3QmIGUpIHsNCisgIGlmIChhID09IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICByZXR1cm4gbV9leHBUYWJsZVttX21vZHVsdXMgLSBtX2xvZ1RhYmxlW2FdIC0gMV07DQogfQ0KLWludDMyX3QgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjptdWx0aXBseShpbnQzMl90IGEsIGludDMyX3QgYikNCi17DQotICAgIGlmIChhID09IDAgfHwgYiA9PSAwKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9leHBUYWJsZVsobV9sb2dUYWJsZVthXSArIG1fbG9nVGFibGVbYl0pICUgKG1fbW9kdWx1cyAtIDEpXTsNCitpbnQzMl90IENCQ19QREY0MTdFQ01vZHVsdXNHRjo6bXVsdGlwbHkoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsNCisgIGlmIChhID09IDAgfHwgYiA9PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcmV0dXJuIG1fZXhwVGFibGVbKG1fbG9nVGFibGVbYV0gKyBtX2xvZ1RhYmxlW2JdKSAlIChtX21vZHVsdXMgLSAxKV07DQogfQ0KLWludDMyX3QgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpnZXRTaXplKCkNCi17DQotICAgIHJldHVybiBtX21vZHVsdXM7DQoraW50MzJfdCBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OmdldFNpemUoKSB7DQorICByZXR1cm4gbV9tb2R1bHVzOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNNb2R1bHVzR0YuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNHRi5oCmluZGV4IGVlMTkxMTcuLjRiZmY3NTMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNHRi5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNHRi5oCkBAIC04LDI5ICs4LDMxIEBACiAjZGVmaW5lIF9CQ19QREY0MTdFQ01PRFVMVVNHRl9IXw0KIGNsYXNzIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5Ow0KIGNsYXNzIENCQ19QREY0MTdDb21tb247DQotY2xhc3MgQ0JDX1BERjQxN0VDTW9kdWx1c0dGDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c0dGKGludDMyX3QgbW9kdWx1cywgaW50MzJfdCBnZW5lcmF0b3IsIGludDMyX3QgJmUpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUERGNDE3RUNNb2R1bHVzR0YoKTsNCi0gICAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZShpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGdldFplcm8oKTsNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGdldE9uZSgpOw0KLSAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYnVpbGRNb25vbWlhbChpbnQzMl90IGRlZ3JlZSwgaW50MzJfdCBjb2VmZmljaWVudCwgaW50MzJfdCAmZSk7DQotICAgIGludDMyX3QgYWRkKGludDMyX3QgYSwgaW50MzJfdCBiKTsNCi0gICAgaW50MzJfdCBzdWJ0cmFjdChpbnQzMl90IGEsIGludDMyX3QgYik7DQotICAgIGludDMyX3QgZXhwKGludDMyX3QgYSk7DQotICAgIGludDMyX3QgbG9nKGludDMyX3QgYSwgaW50MzJfdCAmZSk7DQotICAgIGludDMyX3QgaW52ZXJzZShpbnQzMl90IGEsIGludDMyX3QgJmUpOw0KLSAgICBpbnQzMl90IG11bHRpcGx5KGludDMyX3QgYSwgaW50MzJfdCBiKTsNCi0gICAgaW50MzJfdCBnZXRTaXplKCk7DQotICAgIHN0YXRpYyBDQkNfUERGNDE3RUNNb2R1bHVzR0YqIFBERjQxN19HRjsNCi1wcml2YXRlOg0KLSAgICBDRlhfSW50MzJBcnJheSBtX2V4cFRhYmxlOw0KLSAgICBDRlhfSW50MzJBcnJheSBtX2xvZ1RhYmxlOw0KLSAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbV96ZXJvOw0KLSAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbV9vbmU7DQotICAgIGludDMyX3QgbV9tb2R1bHVzOw0KK2NsYXNzIENCQ19QREY0MTdFQ01vZHVsdXNHRiB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdFQ01vZHVsdXNHRihpbnQzMl90IG1vZHVsdXMsIGludDMyX3QgZ2VuZXJhdG9yLCBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdFQ01vZHVsdXNHRigpOw0KKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZShpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZ2V0WmVybygpOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGdldE9uZSgpOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGJ1aWxkTW9ub21pYWwoaW50MzJfdCBkZWdyZWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZWZmaWNpZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBpbnQzMl90IGFkZChpbnQzMl90IGEsIGludDMyX3QgYik7DQorICBpbnQzMl90IHN1YnRyYWN0KGludDMyX3QgYSwgaW50MzJfdCBiKTsNCisgIGludDMyX3QgZXhwKGludDMyX3QgYSk7DQorICBpbnQzMl90IGxvZyhpbnQzMl90IGEsIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBpbnZlcnNlKGludDMyX3QgYSwgaW50MzJfdCYgZSk7DQorICBpbnQzMl90IG11bHRpcGx5KGludDMyX3QgYSwgaW50MzJfdCBiKTsNCisgIGludDMyX3QgZ2V0U2l6ZSgpOw0KKyAgc3RhdGljIENCQ19QREY0MTdFQ01vZHVsdXNHRiogUERGNDE3X0dGOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX0ludDMyQXJyYXkgbV9leHBUYWJsZTsNCisgIENGWF9JbnQzMkFycmF5IG1fbG9nVGFibGU7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbV96ZXJvOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG1fb25lOw0KKyAgaW50MzJfdCBtX21vZHVsdXM7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNNb2R1bHVzUG9seS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNNb2R1bHVzUG9seS5jcHAKaW5kZXggNjg2YjJiYS4uZjA1YTRhMCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNQb2x5LmNwcApAQCAtMjQsMjkzICsyNCwzMDggQEAKICNpbmNsdWRlICJCQ19QREY0MTdDb21tb24uaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3RUNNb2R1bHVzR0YuaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3RUNNb2R1bHVzUG9seS5oIg0KLUNCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpDQkNfUERGNDE3RUNNb2R1bHVzUG9seShDQkNfUERGNDE3RUNNb2R1bHVzR0YqIGZpZWxkLCBDRlhfSW50MzJBcnJheSAmY29lZmZpY2llbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKGNvZWZmaWNpZW50cy5HZXRTaXplKCkgPT0gMCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KK0NCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpDQkNfUERGNDE3RUNNb2R1bHVzUG9seShDQkNfUERGNDE3RUNNb2R1bHVzR0YqIGZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgY29lZmZpY2llbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY29lZmZpY2llbnRzLkdldFNpemUoKSA9PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgIH0NCisgIG1fZmllbGQgPSBmaWVsZDsNCisgIGludDMyX3QgY29lZmZpY2llbnRzTGVuZ3RoID0gY29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIGlmIChjb2VmZmljaWVudHNMZW5ndGggPiAxICYmIGNvZWZmaWNpZW50c1swXSA9PSAwKSB7DQorICAgIGludDMyX3QgZmlyc3ROb25aZXJvID0gMTsNCisgICAgd2hpbGUgKGZpcnN0Tm9uWmVybyA8IGNvZWZmaWNpZW50c0xlbmd0aCAmJg0KKyAgICAgICAgICAgY29lZmZpY2llbnRzW2ZpcnN0Tm9uWmVyb10gPT0gMCkgew0KKyAgICAgIGZpcnN0Tm9uWmVybysrOw0KICAgICB9DQotICAgIG1fZmllbGQgPSBmaWVsZDsNCi0gICAgaW50MzJfdCBjb2VmZmljaWVudHNMZW5ndGggPSBjb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoY29lZmZpY2llbnRzTGVuZ3RoID4gMSAmJiBjb2VmZmljaWVudHNbMF0gPT0gMCkgew0KLSAgICAgICAgaW50MzJfdCBmaXJzdE5vblplcm8gPSAxOw0KLSAgICAgICAgd2hpbGUgKGZpcnN0Tm9uWmVybyA8IGNvZWZmaWNpZW50c0xlbmd0aCAmJiBjb2VmZmljaWVudHNbZmlyc3ROb25aZXJvXSA9PSAwKSB7DQotICAgICAgICAgICAgZmlyc3ROb25aZXJvKys7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZmlyc3ROb25aZXJvID09IGNvZWZmaWNpZW50c0xlbmd0aCkgew0KLSAgICAgICAgICAgIG1fY29lZmZpY2llbnRzID0gZmllbGQtPmdldFplcm8oKS0+bV9jb2VmZmljaWVudHM7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1fY29lZmZpY2llbnRzLlNldFNpemUoY29lZmZpY2llbnRzTGVuZ3RoIC0gZmlyc3ROb25aZXJvKTsNCi0gICAgICAgICAgICBpbnQzMl90IGwgPSAwOw0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gZmlyc3ROb25aZXJvOyBpIDwgZmlyc3ROb25aZXJvICsgbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgbV9jb2VmZmljaWVudHMuU2V0QXQobCwgY29lZmZpY2llbnRzLkdldEF0KGkpKTsNCi0gICAgICAgICAgICAgICAgbCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgICAgaWYgKGZpcnN0Tm9uWmVybyA9PSBjb2VmZmljaWVudHNMZW5ndGgpIHsNCisgICAgICBtX2NvZWZmaWNpZW50cyA9IGZpZWxkLT5nZXRaZXJvKCktPm1fY29lZmZpY2llbnRzOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9jb2VmZmljaWVudHMuQ29weShjb2VmZmljaWVudHMpOw0KKyAgICAgIG1fY29lZmZpY2llbnRzLlNldFNpemUoY29lZmZpY2llbnRzTGVuZ3RoIC0gZmlyc3ROb25aZXJvKTsNCisgICAgICBpbnQzMl90IGwgPSAwOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gZmlyc3ROb25aZXJvOw0KKyAgICAgICAgICAgaSA8IGZpcnN0Tm9uWmVybyArIG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBtX2NvZWZmaWNpZW50cy5TZXRBdChsLCBjb2VmZmljaWVudHMuR2V0QXQoaSkpOw0KKyAgICAgICAgbCsrOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgbV9jb2VmZmljaWVudHMuQ29weShjb2VmZmljaWVudHMpOw0KKyAgfQ0KIH0NCi1DQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6fkNCQ19QREY0MTdFQ01vZHVsdXNQb2x5KCkNCi17DQorQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6On5DQkNfUERGNDE3RUNNb2R1bHVzUG9seSgpIHt9DQorQ0ZYX0ludDMyQXJyYXkmIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpnZXRDb2VmZmljaWVudHMoKSB7DQorICByZXR1cm4gbV9jb2VmZmljaWVudHM7DQogfQ0KLUNGWF9JbnQzMkFycmF5JiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6Z2V0Q29lZmZpY2llbnRzKCkNCi17DQotICAgIHJldHVybiBtX2NvZWZmaWNpZW50czsNCitDQkNfUERGNDE3RUNNb2R1bHVzR0YqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpnZXRGaWVsZCgpIHsNCisgIHJldHVybiBtX2ZpZWxkOw0KIH0NCi1DQkNfUERGNDE3RUNNb2R1bHVzR0YqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpnZXRGaWVsZCgpDQotew0KLSAgICByZXR1cm4gbV9maWVsZDsNCitpbnQzMl90IENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpnZXREZWdyZWUoKSB7DQorICByZXR1cm4gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpIC0gMTsNCiB9DQotaW50MzJfdCBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6Z2V0RGVncmVlKCkNCi17DQotICAgIHJldHVybiBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCkgLSAxOw0KK0ZYX0JPT0wgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6OmlzWmVybygpIHsNCisgIHJldHVybiBtX2NvZWZmaWNpZW50c1swXSA9PSAwOw0KIH0NCi1GWF9CT09MIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5Ojppc1plcm8oKQ0KLXsNCi0gICAgcmV0dXJuIG1fY29lZmZpY2llbnRzWzBdID09IDA7DQoraW50MzJfdCBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6Z2V0Q29lZmZpY2llbnQoaW50MzJfdCBkZWdyZWUpIHsNCisgIHJldHVybiBtX2NvZWZmaWNpZW50c1ttX2NvZWZmaWNpZW50cy5HZXRTaXplKCkgLSAxIC0gZGVncmVlXTsNCiB9DQotaW50MzJfdCBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6Z2V0Q29lZmZpY2llbnQoaW50MzJfdCBkZWdyZWUpDQotew0KLSAgICByZXR1cm4gbV9jb2VmZmljaWVudHNbbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpIC0gMSAtIGRlZ3JlZV07DQotfQ0KLWludDMyX3QgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6OmV2YWx1YXRlQXQoaW50MzJfdCBhKQ0KLXsNCi0gICAgaWYgKGEgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIGdldENvZWZmaWNpZW50KDApOw0KLSAgICB9DQotICAgIGludDMyX3Qgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCi0gICAgaWYgKGEgPT0gMSkgew0KLSAgICAgICAgaW50MzJfdCByZXN1bHQgPSAwOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGwgPSAwOyBsIDwgbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOyBsKyspIHsNCi0gICAgICAgICAgICBpbnQzMl90IGNvZWZmaWNpZW50ID0gbV9jb2VmZmljaWVudHMuR2V0QXQobCk7DQotICAgICAgICAgICAgcmVzdWx0ID0gbV9maWVsZC0+YWRkKHJlc3VsdCwgY29lZmZpY2llbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHJlc3VsdCA9IG1fY29lZmZpY2llbnRzWzBdOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsNCi0gICAgICAgIHJlc3VsdCA9IG1fZmllbGQtPmFkZChtX2ZpZWxkLT5tdWx0aXBseShhLCByZXN1bHQpLCBtX2NvZWZmaWNpZW50c1tpXSk7DQoraW50MzJfdCBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6ZXZhbHVhdGVBdChpbnQzMl90IGEpIHsNCisgIGlmIChhID09IDApIHsNCisgICAgcmV0dXJuIGdldENvZWZmaWNpZW50KDApOw0KKyAgfQ0KKyAgaW50MzJfdCBzaXplID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgaWYgKGEgPT0gMSkgew0KKyAgICBpbnQzMl90IHJlc3VsdCA9IDA7DQorICAgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsgbCsrKSB7DQorICAgICAgaW50MzJfdCBjb2VmZmljaWVudCA9IG1fY29lZmZpY2llbnRzLkdldEF0KGwpOw0KKyAgICAgIHJlc3VsdCA9IG1fZmllbGQtPmFkZChyZXN1bHQsIGNvZWZmaWNpZW50KTsNCiAgICAgfQ0KICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKyAgaW50MzJfdCByZXN1bHQgPSBtX2NvZWZmaWNpZW50c1swXTsNCisgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IHNpemU7IGkrKykgew0KKyAgICByZXN1bHQgPSBtX2ZpZWxkLT5hZGQobV9maWVsZC0+bXVsdGlwbHkoYSwgcmVzdWx0KSwgbV9jb2VmZmljaWVudHNbaV0pOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCiB9DQotQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjphZGQoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG1vZHVsdXNQb2x5ID0gTlVMTDsNCi0gICAgaWYgKGlzWmVybygpKSB7DQotICAgICAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShvdGhlci0+Z2V0RmllbGQoKSwgb3RoZXItPmdldENvZWZmaWNpZW50cygpLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgIHJldHVybiBtb2R1bHVzUG9seTsNCi0gICAgfQ0KLSAgICBpZiAob3RoZXItPmlzWmVybygpKSB7DQotICAgICAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLCBtX2NvZWZmaWNpZW50cywgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQotICAgIH0NCi0gICAgQ0ZYX0ludDMyQXJyYXkgc21hbGxlckNvZWZmaWNpZW50czsNCi0gICAgc21hbGxlckNvZWZmaWNpZW50cy5Db3B5KG1fY29lZmZpY2llbnRzKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgbGFyZ2VyQ29lZmZpY2llbnRzOw0KLSAgICBsYXJnZXJDb2VmZmljaWVudHMuQ29weShvdGhlci0+bV9jb2VmZmljaWVudHMpOw0KLSAgICBpZiAoc21hbGxlckNvZWZmaWNpZW50cy5HZXRTaXplKCkgPiBsYXJnZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpKSB7DQotICAgICAgICBDRlhfSW50MzJBcnJheSB0ZW1wOw0KLSAgICAgICAgdGVtcC5Db3B5KHNtYWxsZXJDb2VmZmljaWVudHMpOw0KLSAgICAgICAgc21hbGxlckNvZWZmaWNpZW50cy5Db3B5KGxhcmdlckNvZWZmaWNpZW50cyk7DQotICAgICAgICBsYXJnZXJDb2VmZmljaWVudHMuQ29weSh0ZW1wKTsNCi0gICAgfQ0KLSAgICBDRlhfSW50MzJBcnJheSBzdW1EaWZmOw0KLSAgICBzdW1EaWZmLlNldFNpemUobGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKSk7DQotICAgIGludDMyX3QgbGVuZ3RoRGlmZiA9IGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCkgLSBzbWFsbGVyQ29lZmZpY2llbnRzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGwgPSAwOyBsIDwgbGVuZ3RoRGlmZjsgbCsrKSB7DQotICAgICAgICBzdW1EaWZmLlNldEF0KGwsIGxhcmdlckNvZWZmaWNpZW50cy5HZXRBdChsKSk7DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IGkgPSBsZW5ndGhEaWZmOyBpIDwgbGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICBzdW1EaWZmW2ldID0gbV9maWVsZC0+YWRkKHNtYWxsZXJDb2VmZmljaWVudHNbaSAtIGxlbmd0aERpZmZdLCBsYXJnZXJDb2VmZmljaWVudHNbaV0pOw0KLSAgICB9DQotICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIHN1bURpZmYsIGUpOw0KK0NCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6YWRkKA0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogb3RoZXIsDQorICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9IE5VTEw7DQorICBpZiAoaXNaZXJvKCkpIHsNCisgICAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkob3RoZXItPmdldEZpZWxkKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLT5nZXRDb2VmZmljaWVudHMoKSwgZSk7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCiAgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KLX0NCi1DQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6OnN1YnRyYWN0KENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvdGhlciwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9IE5VTEw7DQotICAgIGlmIChvdGhlci0+aXNaZXJvKCkpIHsNCi0gICAgICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIG1fY29lZmZpY2llbnRzLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgIHJldHVybiBtb2R1bHVzUG9seTsNCi0gICAgfQ0KLSAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogcG9seSAgPSBvdGhlci0+bmVnYXRpdmUoZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgbW9kdWx1c1BvbHkgPSBhZGQocG9seSwgZSk7DQotICAgIGRlbGV0ZSBwb2x5Ow0KKyAgfQ0KKyAgaWYgKG90aGVyLT5pc1plcm8oKSkgew0KKyAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLCBtX2NvZWZmaWNpZW50cywgZSk7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCiAgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgc21hbGxlckNvZWZmaWNpZW50czsNCisgIHNtYWxsZXJDb2VmZmljaWVudHMuQ29weShtX2NvZWZmaWNpZW50cyk7DQorICBDRlhfSW50MzJBcnJheSBsYXJnZXJDb2VmZmljaWVudHM7DQorICBsYXJnZXJDb2VmZmljaWVudHMuQ29weShvdGhlci0+bV9jb2VmZmljaWVudHMpOw0KKyAgaWYgKHNtYWxsZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpID4gbGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKSkgew0KKyAgICBDRlhfSW50MzJBcnJheSB0ZW1wOw0KKyAgICB0ZW1wLkNvcHkoc21hbGxlckNvZWZmaWNpZW50cyk7DQorICAgIHNtYWxsZXJDb2VmZmljaWVudHMuQ29weShsYXJnZXJDb2VmZmljaWVudHMpOw0KKyAgICBsYXJnZXJDb2VmZmljaWVudHMuQ29weSh0ZW1wKTsNCisgIH0NCisgIENGWF9JbnQzMkFycmF5IHN1bURpZmY7DQorICBzdW1EaWZmLlNldFNpemUobGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKSk7DQorICBpbnQzMl90IGxlbmd0aERpZmYgPQ0KKyAgICAgIGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCkgLSBzbWFsbGVyQ29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IGxlbmd0aERpZmY7IGwrKykgew0KKyAgICBzdW1EaWZmLlNldEF0KGwsIGxhcmdlckNvZWZmaWNpZW50cy5HZXRBdChsKSk7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IGxlbmd0aERpZmY7IGkgPCBsYXJnZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgc3VtRGlmZltpXSA9IG1fZmllbGQtPmFkZChzbWFsbGVyQ29lZmZpY2llbnRzW2kgLSBsZW5ndGhEaWZmXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXJnZXJDb2VmZmljaWVudHNbaV0pOw0KKyAgfQ0KKyAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZCwgc3VtRGlmZiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gbW9kdWx1c1BvbHk7DQogfQ0KLUNCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6bXVsdGlwbHkoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG1vZHVsdXNQb2x5ID0gTlVMTDsNCi0gICAgaWYgKGlzWmVybygpIHx8IG90aGVyLT5pc1plcm8oKSkgew0KLSAgICAgICAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZC0+Z2V0WmVybygpLT5nZXRGaWVsZCgpLCBtX2ZpZWxkLT5nZXRaZXJvKCktPmdldENvZWZmaWNpZW50cygpLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgIHJldHVybiBtb2R1bHVzUG9seTsNCi0gICAgfQ0KLSAgICBDRlhfSW50MzJBcnJheSBhQ29lZmZpY2llbnRzOw0KLSAgICBhQ29lZmZpY2llbnRzLkNvcHkobV9jb2VmZmljaWVudHMpOw0KLSAgICBpbnQzMl90IGFMZW5ndGggPSBhQ29lZmZpY2llbnRzLkdldFNpemUoKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgYkNvZWZmaWNpZW50czsNCi0gICAgYkNvZWZmaWNpZW50cy5Db3B5KG90aGVyLT5tX2NvZWZmaWNpZW50cyk7DQotICAgIGludDMyX3QgYkxlbmd0aCA9IGJDb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KLSAgICBDRlhfSW50MzJBcnJheSBwcm9kdWN0Ow0KLSAgICBwcm9kdWN0LlNldFNpemUoYUxlbmd0aCArIGJMZW5ndGggLSAxKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYUxlbmd0aDsgaSsrKSB7DQotICAgICAgICBpbnQzMl90IGFDb2VmZiA9IGFDb2VmZmljaWVudHNbaV07DQotICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBiTGVuZ3RoOyBqKyspIHsNCi0gICAgICAgICAgICBwcm9kdWN0W2kgKyBqXSA9IG1fZmllbGQtPmFkZChwcm9kdWN0W2kgKyBqXSwgbV9maWVsZC0+bXVsdGlwbHkoYUNvZWZmLCBiQ29lZmZpY2llbnRzW2pdKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZCwgcHJvZHVjdCwgZSk7DQorQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpzdWJ0cmFjdCgNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbW9kdWx1c1BvbHkgPSBOVUxMOw0KKyAgaWYgKG90aGVyLT5pc1plcm8oKSkgew0KKyAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLCBtX2NvZWZmaWNpZW50cywgZSk7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCiAgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KKyAgfQ0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHBvbHkgPSBvdGhlci0+bmVnYXRpdmUoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBtb2R1bHVzUG9seSA9IGFkZChwb2x5LCBlKTsNCisgIGRlbGV0ZSBwb2x5Ow0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KIH0NCi1DQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6Om5lZ2F0aXZlKGludDMyX3QgJmUpDQotew0KLSAgICBpbnQzMl90IHNpemUgPSBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCk7DQotICAgIENGWF9JbnQzMkFycmF5IG5lZ2F0aXZlQ29lZmZpY2llbnRzOw0KLSAgICBuZWdhdGl2ZUNvZWZmaWNpZW50cy5TZXRTaXplKHNpemUpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCi0gICAgICAgIG5lZ2F0aXZlQ29lZmZpY2llbnRzW2ldID0gbV9maWVsZC0+c3VidHJhY3QoMCwgbV9jb2VmZmljaWVudHNbaV0pOw0KLSAgICB9DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLCBuZWdhdGl2ZUNvZWZmaWNpZW50cywgZSk7DQorQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjptdWx0aXBseSgNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbW9kdWx1c1BvbHkgPSBOVUxMOw0KKyAgaWYgKGlzWmVybygpIHx8IG90aGVyLT5pc1plcm8oKSkgew0KKyAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSgNCisgICAgICAgIG1fZmllbGQtPmdldFplcm8oKS0+Z2V0RmllbGQoKSwgbV9maWVsZC0+Z2V0WmVybygpLT5nZXRDb2VmZmljaWVudHMoKSwNCisgICAgICAgIGUpOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQogICAgIHJldHVybiBtb2R1bHVzUG9seTsNCisgIH0NCisgIENGWF9JbnQzMkFycmF5IGFDb2VmZmljaWVudHM7DQorICBhQ29lZmZpY2llbnRzLkNvcHkobV9jb2VmZmljaWVudHMpOw0KKyAgaW50MzJfdCBhTGVuZ3RoID0gYUNvZWZmaWNpZW50cy5HZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSBiQ29lZmZpY2llbnRzOw0KKyAgYkNvZWZmaWNpZW50cy5Db3B5KG90aGVyLT5tX2NvZWZmaWNpZW50cyk7DQorICBpbnQzMl90IGJMZW5ndGggPSBiQ29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIENGWF9JbnQzMkFycmF5IHByb2R1Y3Q7DQorICBwcm9kdWN0LlNldFNpemUoYUxlbmd0aCArIGJMZW5ndGggLSAxKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFMZW5ndGg7IGkrKykgew0KKyAgICBpbnQzMl90IGFDb2VmZiA9IGFDb2VmZmljaWVudHNbaV07DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGJMZW5ndGg7IGorKykgew0KKyAgICAgIHByb2R1Y3RbaSArIGpdID0gbV9maWVsZC0+YWRkKA0KKyAgICAgICAgICBwcm9kdWN0W2kgKyBqXSwgbV9maWVsZC0+bXVsdGlwbHkoYUNvZWZmLCBiQ29lZmZpY2llbnRzW2pdKSk7DQorICAgIH0NCisgIH0NCisgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIHByb2R1Y3QsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KIH0NCi1DQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6Om11bHRpcGx5KGludDMyX3Qgc2NhbGFyLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG1vZHVsdXNQb2x5ID0gTlVMTDsNCi0gICAgaWYgKHNjYWxhciA9PSAwKSB7DQotICAgICAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLT5nZXRaZXJvKCktPmdldEZpZWxkKCksIG1fZmllbGQtPmdldFplcm8oKS0+Z2V0Q29lZmZpY2llbnRzKCksIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KLSAgICB9DQotICAgIGlmIChzY2FsYXIgPT0gMSkgew0KLSAgICAgICAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZCwgbV9jb2VmZmljaWVudHMsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KLSAgICB9DQotICAgIGludDMyX3Qgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgcHJvZHVjdDsNCi0gICAgcHJvZHVjdC5TZXRTaXplKHNpemUpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCi0gICAgICAgIHByb2R1Y3RbaV0gPSBtX2ZpZWxkLT5tdWx0aXBseShtX2NvZWZmaWNpZW50c1tpXSwgc2NhbGFyKTsNCi0gICAgfQ0KLSAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLCBwcm9kdWN0LCBlKTsNCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6Om5lZ2F0aXZlKGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIENGWF9JbnQzMkFycmF5IG5lZ2F0aXZlQ29lZmZpY2llbnRzOw0KKyAgbmVnYXRpdmVDb2VmZmljaWVudHMuU2V0U2l6ZShzaXplKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKyAgICBuZWdhdGl2ZUNvZWZmaWNpZW50c1tpXSA9IG1fZmllbGQtPnN1YnRyYWN0KDAsIG1fY29lZmZpY2llbnRzW2ldKTsNCisgIH0NCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9DQorICAgICAgRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIG5lZ2F0aXZlQ29lZmZpY2llbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiBtb2R1bHVzUG9seTsNCit9DQorQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjptdWx0aXBseShpbnQzMl90IHNjYWxhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9IE5VTEw7DQorICBpZiAoc2NhbGFyID09IDApIHsNCisgICAgbW9kdWx1c1BvbHkgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkoDQorICAgICAgICBtX2ZpZWxkLT5nZXRaZXJvKCktPmdldEZpZWxkKCksIG1fZmllbGQtPmdldFplcm8oKS0+Z2V0Q29lZmZpY2llbnRzKCksDQorICAgICAgICBlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KICAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQotfQ0KLUNCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6bXVsdGlwbHlCeU1vbm9taWFsKGludDMyX3QgZGVncmVlLCBpbnQzMl90IGNvZWZmaWNpZW50LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKGRlZ3JlZSA8IDApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9IE5VTEw7DQotICAgIGlmIChjb2VmZmljaWVudCA9PSAwKSB7DQotICAgICAgICBtb2R1bHVzUG9seSA9IEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLT5nZXRaZXJvKCktPm1fZmllbGQsIG1fZmllbGQtPmdldFplcm8oKS0+bV9jb2VmZmljaWVudHMsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KLSAgICB9DQotICAgIGludDMyX3Qgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgcHJvZHVjdDsNCi0gICAgcHJvZHVjdC5TZXRTaXplKHNpemUgKyBkZWdyZWUpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCi0gICAgICAgIHByb2R1Y3RbaV0gPSBtX2ZpZWxkLT5tdWx0aXBseShtX2NvZWZmaWNpZW50c1tpXSwgY29lZmZpY2llbnQpOw0KLSAgICB9DQotICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIHByb2R1Y3QsIGUpOw0KKyAgfQ0KKyAgaWYgKHNjYWxhciA9PSAxKSB7DQorICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIG1fY29lZmZpY2llbnRzLCBlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KICAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQorICB9DQorICBpbnQzMl90IHNpemUgPSBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSBwcm9kdWN0Ow0KKyAgcHJvZHVjdC5TZXRTaXplKHNpemUpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7DQorICAgIHByb2R1Y3RbaV0gPSBtX2ZpZWxkLT5tdWx0aXBseShtX2NvZWZmaWNpZW50c1tpXSwgc2NhbGFyKTsNCisgIH0NCisgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIHByb2R1Y3QsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KIH0NCi1DRlhfUHRyQXJyYXkqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpkaXZpZGUoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKG90aGVyLT5pc1plcm8oKSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uRGl2aWRlQnlaZXJvOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHF1b3RpZW50ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQtPmdldFplcm8oKS0+bV9maWVsZCwgbV9maWVsZC0+Z2V0WmVybygpLT5tX2NvZWZmaWNpZW50cywgZSk7DQorQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjptdWx0aXBseUJ5TW9ub21pYWwoDQorICAgIGludDMyX3QgZGVncmVlLA0KKyAgICBpbnQzMl90IGNvZWZmaWNpZW50LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoZGVncmVlIDwgMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG1vZHVsdXNQb2x5ID0gTlVMTDsNCisgIGlmIChjb2VmZmljaWVudCA9PSAwKSB7DQorICAgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KA0KKyAgICAgICAgbV9maWVsZC0+Z2V0WmVybygpLT5tX2ZpZWxkLCBtX2ZpZWxkLT5nZXRaZXJvKCktPm1fY29lZmZpY2llbnRzLCBlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogcmVtYWluZGVyID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIG1fY29lZmZpY2llbnRzLCBlKTsNCisgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KKyAgfQ0KKyAgaW50MzJfdCBzaXplID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgcHJvZHVjdDsNCisgIHByb2R1Y3QuU2V0U2l6ZShzaXplICsgZGVncmVlKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKyAgICBwcm9kdWN0W2ldID0gbV9maWVsZC0+bXVsdGlwbHkobV9jb2VmZmljaWVudHNbaV0sIGNvZWZmaWNpZW50KTsNCisgIH0NCisgIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIHByb2R1Y3QsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpkaXZpZGUoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAob3RoZXItPmlzWmVybygpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkRpdmlkZUJ5WmVybzsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogcXVvdGllbnQgPSBGWF9ORVcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkoDQorICAgICAgbV9maWVsZC0+Z2V0WmVybygpLT5tX2ZpZWxkLCBtX2ZpZWxkLT5nZXRaZXJvKCktPm1fY29lZmZpY2llbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiByZW1haW5kZXIgPQ0KKyAgICAgIEZYX05FVyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLCBtX2NvZWZmaWNpZW50cywgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGRlbGV0ZSBxdW90aWVudDsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPSBvdGhlci0+Z2V0Q29lZmZpY2llbnQob3RoZXItPmdldERlZ3JlZSgpKTsNCisgIGludDMyX3QgaW52ZXJzZURlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPQ0KKyAgICAgIG1fZmllbGQtPmludmVyc2UoZGVub21pbmF0b3JMZWFkaW5nVGVybSwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGRlbGV0ZSBxdW90aWVudDsNCisgICAgZGVsZXRlIHJlbWFpbmRlcjsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB3aGlsZSAocmVtYWluZGVyLT5nZXREZWdyZWUoKSA+PSBvdGhlci0+Z2V0RGVncmVlKCkgJiYgIXJlbWFpbmRlci0+aXNaZXJvKCkpIHsNCisgICAgaW50MzJfdCBkZWdyZWVEaWZmZXJlbmNlID0gcmVtYWluZGVyLT5nZXREZWdyZWUoKSAtIG90aGVyLT5nZXREZWdyZWUoKTsNCisgICAgaW50MzJfdCBzY2FsZSA9DQorICAgICAgICBtX2ZpZWxkLT5tdWx0aXBseShyZW1haW5kZXItPmdldENvZWZmaWNpZW50KHJlbWFpbmRlci0+Z2V0RGVncmVlKCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZURlbm9taW5hdG9yTGVhZGluZ1Rlcm0pOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogdGVybSA9DQorICAgICAgICBvdGhlci0+bXVsdGlwbHlCeU1vbm9taWFsKGRlZ3JlZURpZmZlcmVuY2UsIHNjYWxlLCBlKTsNCiAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgZGVsZXRlIHF1b3RpZW50Ow0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgZGVsZXRlIHF1b3RpZW50Ow0KKyAgICAgIGRlbGV0ZSByZW1haW5kZXI7DQorICAgICAgcmV0dXJuIE5VTEw7DQogICAgIH0NCi0gICAgaW50MzJfdCBkZW5vbWluYXRvckxlYWRpbmdUZXJtID0gb3RoZXItPmdldENvZWZmaWNpZW50KG90aGVyLT5nZXREZWdyZWUoKSk7DQotICAgIGludDMyX3QgaW52ZXJzZURlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPSBtX2ZpZWxkLT5pbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0sIGUpOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogaXRlcmF0aW9uUXVvdGllbnQgPQ0KKyAgICAgICAgbV9maWVsZC0+YnVpbGRNb25vbWlhbChkZWdyZWVEaWZmZXJlbmNlLCBzY2FsZSwgZSk7DQogICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIGRlbGV0ZSBxdW90aWVudDsNCi0gICAgICAgIGRlbGV0ZSByZW1haW5kZXI7DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICBkZWxldGUgcXVvdGllbnQ7DQorICAgICAgZGVsZXRlIHJlbWFpbmRlcjsNCisgICAgICBkZWxldGUgdGVybTsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICB3aGlsZSAocmVtYWluZGVyLT5nZXREZWdyZWUoKSA+PSBvdGhlci0+Z2V0RGVncmVlKCkgJiYgIXJlbWFpbmRlci0+aXNaZXJvKCkpIHsNCi0gICAgICAgIGludDMyX3QgZGVncmVlRGlmZmVyZW5jZSA9IHJlbWFpbmRlci0+Z2V0RGVncmVlKCkgLSBvdGhlci0+Z2V0RGVncmVlKCk7DQotICAgICAgICBpbnQzMl90IHNjYWxlID0gbV9maWVsZC0+bXVsdGlwbHkocmVtYWluZGVyLT5nZXRDb2VmZmljaWVudChyZW1haW5kZXItPmdldERlZ3JlZSgpKSwgaW52ZXJzZURlbm9taW5hdG9yTGVhZGluZ1Rlcm0pOw0KLSAgICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHRlcm0gPSBvdGhlci0+bXVsdGlwbHlCeU1vbm9taWFsKGRlZ3JlZURpZmZlcmVuY2UsIHNjYWxlLCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBkZWxldGUgcXVvdGllbnQ7DQotICAgICAgICAgICAgZGVsZXRlIHJlbWFpbmRlcjsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBpdGVyYXRpb25RdW90aWVudCA9IG1fZmllbGQtPmJ1aWxkTW9ub21pYWwoZGVncmVlRGlmZmVyZW5jZSwgc2NhbGUsIGUpOw0KLSAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgICAgIGRlbGV0ZSBxdW90aWVudDsNCi0gICAgICAgICAgICBkZWxldGUgcmVtYWluZGVyOw0KLSAgICAgICAgICAgIGRlbGV0ZSB0ZXJtOw0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHRlbXAgPSBxdW90aWVudDsNCi0gICAgICAgIHF1b3RpZW50ID0gdGVtcC0+YWRkKGl0ZXJhdGlvblF1b3RpZW50LCBlKTsNCi0gICAgICAgIGRlbGV0ZSBpdGVyYXRpb25RdW90aWVudDsNCi0gICAgICAgIGRlbGV0ZSB0ZW1wOw0KLSAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgICAgIGRlbGV0ZSByZW1haW5kZXI7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICB0ZW1wID0gcmVtYWluZGVyOw0KLSAgICAgICAgcmVtYWluZGVyID0gdGVtcC0+c3VidHJhY3QodGVybSwgZSk7DQotICAgICAgICBkZWxldGUgdGVybTsNCi0gICAgICAgIGRlbGV0ZSB0ZW1wOw0KLSAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgICAgIGRlbGV0ZSBxdW90aWVudDsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHRlbXAgPSBxdW90aWVudDsNCisgICAgcXVvdGllbnQgPSB0ZW1wLT5hZGQoaXRlcmF0aW9uUXVvdGllbnQsIGUpOw0KKyAgICBkZWxldGUgaXRlcmF0aW9uUXVvdGllbnQ7DQorICAgIGRlbGV0ZSB0ZW1wOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgZGVsZXRlIHJlbWFpbmRlcjsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICBDRlhfUHRyQXJyYXkqIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCi0gICAgbW9kdWx1c1BvbHktPkFkZChxdW90aWVudCk7DQotICAgIG1vZHVsdXNQb2x5LT5BZGQocmVtYWluZGVyKTsNCi0gICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KKyAgICB0ZW1wID0gcmVtYWluZGVyOw0KKyAgICByZW1haW5kZXIgPSB0ZW1wLT5zdWJ0cmFjdCh0ZXJtLCBlKTsNCisgICAgZGVsZXRlIHRlcm07DQorICAgIGRlbGV0ZSB0ZW1wOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgZGVsZXRlIHF1b3RpZW50Ow0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICB9DQorICBDRlhfUHRyQXJyYXkqIG1vZHVsdXNQb2x5ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgIG1vZHVsdXNQb2x5LT5BZGQocXVvdGllbnQpOw0KKyAgbW9kdWx1c1BvbHktPkFkZChyZW1haW5kZXIpOw0KKyAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KIH0NCi1DRlhfQnl0ZVN0cmluZyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6dG9TdHJpbmcoKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0Ow0KLSAgICBmb3IgKGludDMyX3QgZGVncmVlID0gZ2V0RGVncmVlKCk7IGRlZ3JlZSA+PSAwOyBkZWdyZWUtLSkgew0KLSAgICAgICAgaW50MzJfdCBjb2VmZmljaWVudCA9IGdldENvZWZmaWNpZW50KGRlZ3JlZSk7DQotICAgICAgICBpZiAoY29lZmZpY2llbnQgIT0gMCkgew0KLSAgICAgICAgICAgIGlmIChjb2VmZmljaWVudCA8IDApIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgLSAiOw0KLSAgICAgICAgICAgICAgICBjb2VmZmljaWVudCA9IC1jb2VmZmljaWVudDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LkdldExlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgKyAiOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChkZWdyZWUgPT0gMCB8fCBjb2VmZmljaWVudCAhPSAxKSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjb2VmZmljaWVudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGRlZ3JlZSAhPSAwKSB7DQotICAgICAgICAgICAgICAgIGlmIChkZWdyZWUgPT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICd4JzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAieF4iOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGRlZ3JlZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCitDRlhfQnl0ZVN0cmluZyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6dG9TdHJpbmcoKSB7DQorICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICBmb3IgKGludDMyX3QgZGVncmVlID0gZ2V0RGVncmVlKCk7IGRlZ3JlZSA+PSAwOyBkZWdyZWUtLSkgew0KKyAgICBpbnQzMl90IGNvZWZmaWNpZW50ID0gZ2V0Q29lZmZpY2llbnQoZGVncmVlKTsNCisgICAgaWYgKGNvZWZmaWNpZW50ICE9IDApIHsNCisgICAgICBpZiAoY29lZmZpY2llbnQgPCAwKSB7DQorICAgICAgICByZXN1bHQgKz0gIiAtICI7DQorICAgICAgICBjb2VmZmljaWVudCA9IC1jb2VmZmljaWVudDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgICAgICAgcmVzdWx0ICs9ICIgKyAiOw0KICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoZGVncmVlID09IDAgfHwgY29lZmZpY2llbnQgIT0gMSkgew0KKyAgICAgICAgcmVzdWx0ICs9IGNvZWZmaWNpZW50Ow0KKyAgICAgIH0NCisgICAgICBpZiAoZGVncmVlICE9IDApIHsNCisgICAgICAgIGlmIChkZWdyZWUgPT0gMSkgew0KKyAgICAgICAgICByZXN1bHQgKz0gJ3gnOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0ICs9ICJ4XiI7DQorICAgICAgICAgIHJlc3VsdCArPSBkZWdyZWU7DQorICAgICAgICB9DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNNb2R1bHVzUG9seS5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuaAppbmRleCA3MmM4ZDNlLi45ZTIyNWE4IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNNb2R1bHVzUG9seS5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNQb2x5LmgKQEAgLTcsMjcgKzcsMzEgQEAKICNpZm5kZWYgX0JDX1BERjQxN0VDTU9EVUxVU1BPTFlfSF8NCiAjZGVmaW5lIF9CQ19QREY0MTdFQ01PRFVMVVNQT0xZX0hfDQogY2xhc3MgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOw0KLWNsYXNzIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5DQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkoQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBmaWVsZCwgQ0ZYX0ludDMyQXJyYXkgJmNvZWZmaWNpZW50cywgaW50MzJfdCAmZSk7DQotICAgIHZpcnR1YWwgfkNCQ19QREY0MTdFQ01vZHVsdXNQb2x5KCk7DQotICAgIENGWF9JbnQzMkFycmF5JiBnZXRDb2VmZmljaWVudHMoKTsNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBnZXRGaWVsZCgpOw0KLSAgICBpbnQzMl90IGdldERlZ3JlZSgpOw0KLSAgICBGWF9CT09MIGlzWmVybygpOw0KLSAgICBpbnQzMl90IGdldENvZWZmaWNpZW50KGludDMyX3QgZGVncmVlKTsNCi0gICAgaW50MzJfdCBldmFsdWF0ZUF0KGludDMyX3QgYSk7DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBhZGQoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLCBpbnQzMl90ICZlKTsNCi0gICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHN1YnRyYWN0KENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvdGhlciwgaW50MzJfdCAmZSk7DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtdWx0aXBseShDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogb3RoZXIsIGludDMyX3QgJmUpOw0KLSAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbmVnYXRpdmUoaW50MzJfdCAmZSk7DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtdWx0aXBseShpbnQzMl90IHNjYWxhciwgaW50MzJfdCAmZSk7DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtdWx0aXBseUJ5TW9ub21pYWwoaW50MzJfdCBkZWdyZWUsIGludDMyX3QgY29lZmZpY2llbnQsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfUHRyQXJyYXkqIGRpdmlkZShDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogb3RoZXIsIGludDMyX3QgJmUpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyB0b1N0cmluZygpOw0KLXByaXZhdGU6DQotICAgIENCQ19QREY0MTdFQ01vZHVsdXNHRiogbV9maWVsZDsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgbV9jb2VmZmljaWVudHM7DQorY2xhc3MgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkgew0KKyBwdWJsaWM6DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShDQkNfUERGNDE3RUNNb2R1bHVzR0YqIGZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGNvZWZmaWNpZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB+Q0JDX1BERjQxN0VDTW9kdWx1c1BvbHkoKTsNCisgIENGWF9JbnQzMkFycmF5JiBnZXRDb2VmZmljaWVudHMoKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNHRiogZ2V0RmllbGQoKTsNCisgIGludDMyX3QgZ2V0RGVncmVlKCk7DQorICBGWF9CT09MIGlzWmVybygpOw0KKyAgaW50MzJfdCBnZXRDb2VmZmljaWVudChpbnQzMl90IGRlZ3JlZSk7DQorICBpbnQzMl90IGV2YWx1YXRlQXQoaW50MzJfdCBhKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBhZGQoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLCBpbnQzMl90JiBlKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBzdWJ0cmFjdChDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogb3RoZXIsIGludDMyX3QmIGUpOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG11bHRpcGx5KENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvdGhlciwgaW50MzJfdCYgZSk7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbmVnYXRpdmUoaW50MzJfdCYgZSk7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbXVsdGlwbHkoaW50MzJfdCBzY2FsYXIsIGludDMyX3QmIGUpOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG11bHRpcGx5QnlNb25vbWlhbChpbnQzMl90IGRlZ3JlZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2VmZmljaWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDRlhfUHRyQXJyYXkqIGRpdmlkZShDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogb3RoZXIsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdG9TdHJpbmcoKTsNCisNCisgcHJpdmF0ZToNCisgIENCQ19QREY0MTdFQ01vZHVsdXNHRiogbV9maWVsZDsNCisgIENGWF9JbnQzMkFycmF5IG1fY29lZmZpY2llbnRzOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmNwcAppbmRleCBlOTQwYTRiLi4wZmQyNzVjIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmNwcApAQCAtMjYsMTY4ICsyNiwxMzggQEAKICAgICB7MjcsIDkxN30sDQogICAgIHs1MjIsIDU2OCwgNzIzLCA4MDl9LA0KICAgICB7MjM3LCAzMDgsIDQzNiwgMjg0LCA2NDYsIDY1MywgNDI4LCAzNzl9LA0KLSAgICB7DQotICAgICAgICAyNzQsIDU2MiwgMjMyLCA3NTUsIDU5OSwgNTI0LCA4MDEsIDEzMiwgMjk1LCAxMTYsIDQ0MiwgNDI4LCAyOTUsDQotICAgICAgICA0MiwgMTc2LCA2NQ0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAzNjEsIDU3NSwgOTIyLCA1MjUsIDE3NiwgNTg2LCA2NDAsIDMyMSwgNTM2LCA3NDIsIDY3NywgNzQyLCA2ODcsDQotICAgICAgICAyODQsIDE5MywgNTE3LCAyNzMsIDQ5NCwgMjYzLCAxNDcsIDU5MywgODAwLCA1NzEsIDMyMCwgODAzLA0KLSAgICAgICAgMTMzLCAyMzEsIDM5MCwgNjg1LCAzMzAsIDYzLCA0MTANCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgNTM5LCA0MjIsIDYsIDkzLCA4NjIsIDc3MSwgNDUzLCAxMDYsIDYxMCwgMjg3LCAxMDcsIDUwNSwgNzMzLA0KLSAgICAgICAgODc3LCAzODEsIDYxMiwgNzIzLCA0NzYsIDQ2MiwgMTcyLCA0MzAsIDYwOSwgODU4LCA4MjIsIDU0MywNCi0gICAgICAgIDM3NiwgNTExLCA0MDAsIDY3MiwgNzYyLCAyODMsIDE4NCwgNDQwLCAzNSwgNTE5LCAzMSwgNDYwLA0KLSAgICAgICAgNTk0LCAyMjUsIDUzNSwgNTE3LCAzNTIsIDYwNSwgMTU4LCA2NTEsIDIwMSwgNDg4LCA1MDIsIDY0OCwNCi0gICAgICAgIDczMywgNzE3LCA4MywgNDA0LCA5NywgMjgwLCA3NzEsIDg0MCwgNjI5LCA0LCAzODEsIDg0MywNCi0gICAgICAgIDYyMywgMjY0LCA1NDMNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgNTIxLCAzMTAsIDg2NCwgNTQ3LCA4NTgsIDU4MCwgMjk2LCAzNzksIDUzLCA3NzksIDg5NywgNDQ0LCA0MDAsDQotICAgICAgICA5MjUsIDc0OSwgNDE1LCA4MjIsIDkzLCAyMTcsIDIwOCwgOTI4LCAyNDQsIDU4MywgNjIwLCAyNDYsDQotICAgICAgICAxNDgsIDQ0NywgNjMxLCAyOTIsIDkwOCwgNDkwLCA3MDQsIDUxNiwgMjU4LCA0NTcsIDkwNywgNTk0LA0KLSAgICAgICAgNzIzLCA2NzQsIDI5MiwgMjcyLCA5NiwgNjg0LCA0MzIsIDY4NiwgNjA2LCA4NjAsIDU2OSwgMTkzLA0KLSAgICAgICAgMjE5LCAxMjksIDE4NiwgMjM2LCAyODcsIDE5MiwgNzc1LCAyNzgsIDE3MywgNDAsIDM3OSwgNzEyLA0KLSAgICAgICAgNDYzLCA2NDYsIDc3NiwgMTcxLCA0OTEsIDI5NywgNzYzLCAxNTYsIDczMiwgOTUsIDI3MCwgNDQ3LA0KLSAgICAgICAgOTAsIDUwNywgNDgsIDIyOCwgODIxLCA4MDgsIDg5OCwgNzg0LCA2NjMsIDYyNywgMzc4LCAzODIsDQotICAgICAgICAyNjIsIDM4MCwgNjAyLCA3NTQsIDMzNiwgODksIDYxNCwgODcsIDQzMiwgNjcwLCA2MTYsIDE1NywNCi0gICAgICAgIDM3NCwgMjQyLCA3MjYsIDYwMCwgMjY5LCAzNzUsIDg5OCwgODQ1LCA0NTQsIDM1NCwgMTMwLCA4MTQsDQotICAgICAgICA1ODcsIDgwNCwgMzQsIDIxMSwgMzMwLCA1MzksIDI5NywgODI3LCA4NjUsIDM3LCA1MTcsIDgzNCwNCi0gICAgICAgIDMxNSwgNTUwLCA4NiwgODAxLCA0LCAxMDgsIDUzOQ0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICA1MjQsIDg5NCwgNzUsIDc2NiwgODgyLCA4NTcsIDc0LCAyMDQsIDgyLCA1ODYsIDcwOCwgMjUwLCA5MDUsDQotICAgICAgICA3ODYsIDEzOCwgNzIwLCA4NTgsIDE5NCwgMzExLCA5MTMsIDI3NSwgMTkwLCAzNzUsIDg1MCwgNDM4LA0KLSAgICAgICAgNzMzLCAxOTQsIDI4MCwgMjAxLCAyODAsIDgyOCwgNzU3LCA3MTAsIDgxNCwgOTE5LCA4OSwgNjgsDQotICAgICAgICA1NjksIDExLCAyMDQsIDc5NiwgNjA1LCA1NDAsIDkxMywgODAxLCA3MDAsIDc5OSwgMTM3LCA0MzksDQotICAgICAgICA0MTgsIDU5MiwgNjY4LCAzNTMsIDg1OSwgMzcwLCA2OTQsIDMyNSwgMjQwLCAyMTYsIDI1NywgMjg0LA0KLSAgICAgICAgNTQ5LCAyMDksIDg4NCwgMzE1LCA3MCwgMzI5LCA3OTMsIDQ5MCwgMjc0LCA4NzcsIDE2MiwgNzQ5LA0KLSAgICAgICAgODEyLCA2ODQsIDQ2MSwgMzM0LCAzNzYsIDg0OSwgNTIxLCAzMDcsIDI5MSwgODAzLCA3MTIsIDE5LA0KLSAgICAgICAgMzU4LCAzOTksIDkwOCwgMTAzLCA1MTEsIDUxLCA4LCA1MTcsIDIyNSwgMjg5LCA0NzAsIDYzNywNCi0gICAgICAgIDczMSwgNjYsIDI1NSwgOTE3LCAyNjksIDQ2MywgODMwLCA3MzAsIDQzMywgODQ4LCA1ODUsIDEzNiwNCi0gICAgICAgIDUzOCwgOTA2LCA5MCwgMiwgMjkwLCA3NDMsIDE5OSwgNjU1LCA5MDMsIDMyOSwgNDksIDgwMiwNCi0gICAgICAgIDU4MCwgMzU1LCA1ODgsIDE4OCwgNDYyLCAxMCwgMTM0LCA2MjgsIDMyMCwgNDc5LCAxMzAsIDczOSwNCi0gICAgICAgIDcxLCAyNjMsIDMxOCwgMzc0LCA2MDEsIDE5MiwgNjA1LCAxNDIsIDY3MywgNjg3LCAyMzQsIDcyMiwNCi0gICAgICAgIDM4NCwgMTc3LCA3NTIsIDYwNywgNjQwLCA0NTUsIDE5MywgNjg5LCA3MDcsIDgwNSwgNjQxLCA0OCwNCi0gICAgICAgIDYwLCA3MzIsIDYyMSwgODk1LCA1NDQsIDI2MSwgODUyLCA2NTUsIDMwOSwgNjk3LCA3NTUsIDc1NiwNCi0gICAgICAgIDYwLCAyMzEsIDc3MywgNDM0LCA0MjEsIDcyNiwgNTI4LCA1MDMsIDExOCwgNDksIDc5NSwgMzIsDQotICAgICAgICAxNDQsIDUwMCwgMjM4LCA4MzYsIDM5NCwgMjgwLCA1NjYsIDMxOSwgOSwgNjQ3LCA1NTAsIDczLA0KLSAgICAgICAgOTE0LCAzNDIsIDEyNiwgMzIsIDY4MSwgMzMxLCA3OTIsIDYyMCwgNjAsIDYwOSwgNDQxLCAxODAsDQotICAgICAgICA3OTEsIDg5MywgNzU0LCA2MDUsIDM4MywgMjI4LCA3NDksIDc2MCwgMjEzLCA1NCwgMjk3LCAxMzQsDQotICAgICAgICA1NCwgODM0LCAyOTksIDkyMiwgMTkxLCA5MTAsIDUzMiwgNjA5LCA4MjksIDE4OSwgMjAsIDE2NywNCi0gICAgICAgIDI5LCA4NzIsIDQ0OSwgODMsIDQwMiwgNDEsIDY1NiwgNTA1LCA1NzksIDQ4MSwgMTczLCA0MDQsDQotICAgICAgICAyNTEsIDY4OCwgOTUsIDQ5NywgNTU1LCA2NDIsIDU0MywgMzA3LCAxNTksIDkyNCwgNTU4LCA2NDgsDQotICAgICAgICA1NSwgNDk3LCAxMA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAzNTIsIDc3LCAzNzMsIDUwNCwgMzUsIDU5OSwgNDI4LCAyMDcsIDQwOSwgNTc0LCAxMTgsIDQ5OCwgMjg1LA0KLSAgICAgICAgMzgwLCAzNTAsIDQ5MiwgMTk3LCAyNjUsIDkyMCwgMTU1LCA5MTQsIDI5OSwgMjI5LCA2NDMsIDI5NCwNCi0gICAgICAgIDg3MSwgMzA2LCA4OCwgODcsIDE5MywgMzUyLCA3ODEsIDg0NiwgNzUsIDMyNywgNTIwLCA0MzUsDQotICAgICAgICA1NDMsIDIwMywgNjY2LCAyNDksIDM0NiwgNzgxLCA2MjEsIDY0MCwgMjY4LCA3OTQsIDUzNCwgNTM5LA0KLSAgICAgICAgNzgxLCA0MDgsIDM5MCwgNjQ0LCAxMDIsIDQ3NiwgNDk5LCAyOTAsIDYzMiwgNTQ1LCAzNywgODU4LA0KLSAgICAgICAgOTE2LCA1NTIsIDQxLCA1NDIsIDI4OSwgMTIyLCAyNzIsIDM4MywgODAwLCA0ODUsIDk4LCA3NTIsDQotICAgICAgICA0NzIsIDc2MSwgMTA3LCA3ODQsIDg2MCwgNjU4LCA3NDEsIDI5MCwgMjA0LCA2ODEsIDQwNywgODU1LA0KLSAgICAgICAgODUsIDk5LCA2MiwgNDgyLCAxODAsIDIwLCAyOTcsIDQ1MSwgNTkzLCA5MTMsIDE0MiwgODA4LA0KLSAgICAgICAgNjg0LCAyODcsIDUzNiwgNTYxLCA3NiwgNjUzLCA4OTksIDcyOSwgNTY3LCA3NDQsIDM5MCwgNTEzLA0KLSAgICAgICAgMTkyLCA1MTYsIDI1OCwgMjQwLCA1MTgsIDc5NCwgMzk1LCA3NjgsIDg0OCwgNTEsIDYxMCwgMzg0LA0KLSAgICAgICAgMTY4LCAxOTAsIDgyNiwgMzI4LCA1OTYsIDc4NiwgMzAzLCA1NzAsIDM4MSwgNDE1LCA2NDEsIDE1NiwNCi0gICAgICAgIDIzNywgMTUxLCA0MjksIDUzMSwgMjA3LCA2NzYsIDcxMCwgODksIDE2OCwgMzA0LCA0MDIsIDQwLA0KLSAgICAgICAgNzA4LCA1NzUsIDE2MiwgODY0LCAyMjksIDY1LCA4NjEsIDg0MSwgNTEyLCAxNjQsIDQ3NywgMjIxLA0KLSAgICAgICAgOTIsIDM1OCwgNzg1LCAyODgsIDM1NywgODUwLCA4MzYsIDgyNywgNzM2LCA3MDcsIDk0LCA4LA0KLSAgICAgICAgNDk0LCAxMTQsIDUyMSwgMiwgNDk5LCA4NTEsIDU0MywgMTUyLCA3MjksIDc3MSwgOTUsIDI0OCwNCi0gICAgICAgIDM2MSwgNTc4LCAzMjMsIDg1NiwgNzk3LCAyODksIDUxLCA2ODQsIDQ2NiwgNTMzLCA4MjAsIDY2OSwNCi0gICAgICAgIDQ1LCA5MDIsIDQ1MiwgMTY3LCAzNDIsIDI0NCwgMTczLCAzNSwgNDYzLCA2NTEsIDUxLCA2OTksDQotICAgICAgICA1OTEsIDQ1MiwgNTc4LCAzNywgMTI0LCAyOTgsIDMzMiwgNTUyLCA0MywgNDI3LCAxMTksIDY2MiwNCi0gICAgICAgIDc3NywgNDc1LCA4NTAsIDc2NCwgMzY0LCA1NzgsIDkxMSwgMjgzLCA3MTEsIDQ3MiwgNDIwLCAyNDUsDQotICAgICAgICAyODgsIDU5NCwgMzk0LCA1MTEsIDMyNywgNTg5LCA3NzcsIDY5OSwgNjg4LCA0MywgNDA4LCA4NDIsDQotICAgICAgICAzODMsIDcyMSwgNTIxLCA1NjAsIDY0NCwgNzE0LCA1NTksIDYyLCAxNDUsIDg3MywgNjYzLCA3MTMsDQotICAgICAgICAxNTksIDY3MiwgNzI5LCA2MjQsIDU5LCAxOTMsIDQxNywgMTU4LCAyMDksIDU2MywgNTY0LCAzNDMsDQotICAgICAgICA2OTMsIDEwOSwgNjA4LCA1NjMsIDM2NSwgMTgxLCA3NzIsIDY3NywgMzEwLCAyNDgsIDM1MywgNzA4LA0KLSAgICAgICAgNDEwLCA1NzksIDg3MCwgNjE3LCA4NDEsIDYzMiwgODYwLCAyODksIDUzNiwgMzUsIDc3NywgNjE4LA0KLSAgICAgICAgNTg2LCA0MjQsIDgzMywgNzcsIDU5NywgMzQ2LCAyNjksIDc1NywgNjMyLCA2OTUsIDc1MSwgMzMxLA0KLSAgICAgICAgMjQ3LCAxODQsIDQ1LCA3ODcsIDY4MCwgMTgsIDY2LCA0MDcsIDM2OSwgNTQsIDQ5MiwgMjI4LA0KLSAgICAgICAgNjEzLCA4MzAsIDkyMiwgNDM3LCA1MTksIDY0NCwgOTA1LCA3ODksIDQyMCwgMzA1LCA0NDEsIDIwNywNCi0gICAgICAgIDMwMCwgODkyLCA4MjcsIDE0MSwgNTM3LCAzODEsIDY2MiwgNTEzLCA1NiwgMjUyLCAzNDEsIDI0MiwNCi0gICAgICAgIDc5NywgODM4LCA4MzcsIDcyMCwgMjI0LCAzMDcsIDYzMSwgNjEsIDg3LCA1NjAsIDMxMCwgNzU2LA0KLSAgICAgICAgNjY1LCAzOTcsIDgwOCwgODUxLCAzMDksIDQ3MywgNzk1LCAzNzgsIDMxLCA2NDcsIDkxNSwgNDU5LA0KLSAgICAgICAgODA2LCA1OTAsIDczMSwgNDI1LCAyMTYsIDU0OCwgMjQ5LCAzMjEsIDg4MSwgNjk5LCA1MzUsIDY3MywNCi0gICAgICAgIDc4MiwgMjEwLCA4MTUsIDkwNSwgMzAzLCA4NDMsIDkyMiwgMjgxLCA3MywgNDY5LCA3OTEsIDY2MCwNCi0gICAgICAgIDE2MiwgNDk4LCAzMDgsIDE1NSwgNDIyLCA5MDcsIDgxNywgMTg3LCA2MiwgMTYsIDQyNSwgNTM1LA0KLSAgICAgICAgMzM2LCAyODYsIDQzNywgMzc1LCAyNzMsIDYxMCwgMjk2LCAxODMsIDkyMywgMTE2LCA2NjcsIDc1MSwNCi0gICAgICAgIDM1MywgNjIsIDM2NiwgNjkxLCAzNzksIDY4NywgODQyLCAzNywgMzU3LCA3MjAsIDc0MiwgMzMwLA0KLSAgICAgICAgNSwgMzksIDkyMywgMzExLCA0MjQsIDI0MiwgNzQ5LCAzMjEsIDU0LCA2NjksIDMxNiwgMzQyLA0KLSAgICAgICAgMjk5LCA1MzQsIDEwNSwgNjY3LCA0ODgsIDY0MCwgNjcyLCA1NzYsIDU0MCwgMzE2LCA0ODYsIDcyMSwNCi0gICAgICAgIDYxMCwgNDYsIDY1NiwgNDQ3LCAxNzEsIDYxNiwgNDY0LCAxOTAsIDUzMSwgMjk3LCAzMjEsIDc2MiwNCi0gICAgICAgIDc1MiwgNTMzLCAxNzUsIDEzNCwgMTQsIDM4MSwgNDMzLCA3MTcsIDQ1LCAxMTEsIDIwLCA1OTYsDQotICAgICAgICAyODQsIDczNiwgMTM4LCA2NDYsIDQxMSwgODc3LCA2NjksIDE0MSwgOTE5LCA0NSwgNzgwLCA0MDcsDQotICAgICAgICAxNjQsIDMzMiwgODk5LCAxNjUsIDcyNiwgNjAwLCAzMjUsIDQ5OCwgNjU1LCAzNTcsIDc1MiwgNzY4LA0KLSAgICAgICAgMjIzLCA4NDksIDY0NywgNjMsIDMxMCwgODYzLCAyNTEsIDM2NiwgMzA0LCAyODIsIDczOCwgNjc1LA0KLSAgICAgICAgNDEwLCAzODksIDI0NCwgMzEsIDEyMSwgMzAzLCAyNjMNCi0gICAgfQ0KLX07DQotQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Q0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbigpDQotew0KLX0NCi1DQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjp+Q0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbigpDQotew0KLX0NCi1pbnQzMl90IENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdldEVycm9yQ29ycmVjdGlvbkNvZGV3b3JkQ291bnQoaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChlcnJvckNvcnJlY3Rpb25MZXZlbCA8IDAgfHwgZXJyb3JDb3JyZWN0aW9uTGV2ZWwgPiA4KSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25FcnJvckNvcnJlY3Rpb25MZXZlbE11c3RCZUJldHdlZW4wQW5kODsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICByZXR1cm4gMSA8PCAoZXJyb3JDb3JyZWN0aW9uTGV2ZWwgKyAxKTsNCi19DQotaW50MzJfdCBDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjpnZXRSZWNvbW1lbmRlZE1pbmltdW1FcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IG4sIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAobiA8PSAwKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnRuTXVzdEJlQWJvdmUwOw0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIGlmIChuIDw9IDQwKSB7DQotICAgICAgICByZXR1cm4gMjsNCi0gICAgfQ0KLSAgICBpZiAobiA8PSAxNjApIHsNCi0gICAgICAgIHJldHVybiAzOw0KLSAgICB9DQotICAgIGlmIChuIDw9IDMyMCkgew0KLSAgICAgICAgcmV0dXJuIDQ7DQotICAgIH0NCi0gICAgaWYgKG4gPD0gODYzKSB7DQotICAgICAgICByZXR1cm4gNTsNCi0gICAgfQ0KLSAgICBlID0gQkNFeGNlcHRpb25Ob1JlY29tbWVuZGF0aW9uUG9zc2libGU7DQorICAgIHsyNzQsIDU2MiwgMjMyLCA3NTUsIDU5OSwgNTI0LCA4MDEsIDEzMiwgMjk1LCAxMTYsIDQ0MiwgNDI4LCAyOTUsIDQyLCAxNzYsDQorICAgICA2NX0sDQorICAgIHszNjEsIDU3NSwgOTIyLCA1MjUsIDE3NiwgNTg2LCA2NDAsIDMyMSwgNTM2LCA3NDIsIDY3NywgNzQyLCA2ODcsIDI4NCwgMTkzLA0KKyAgICAgNTE3LCAyNzMsIDQ5NCwgMjYzLCAxNDcsIDU5MywgODAwLCA1NzEsIDMyMCwgODAzLCAxMzMsIDIzMSwgMzkwLCA2ODUsIDMzMCwNCisgICAgIDYzLCA0MTB9LA0KKyAgICB7NTM5LCA0MjIsIDYsIDkzLCA4NjIsIDc3MSwgNDUzLCAxMDYsIDYxMCwgMjg3LCAxMDcsIDUwNSwgNzMzLCA4NzcsIDM4MSwNCisgICAgIDYxMiwgNzIzLCA0NzYsIDQ2MiwgMTcyLCA0MzAsIDYwOSwgODU4LCA4MjIsIDU0MywgMzc2LCA1MTEsIDQwMCwgNjcyLCA3NjIsDQorICAgICAyODMsIDE4NCwgNDQwLCAzNSwgNTE5LCAzMSwgNDYwLCA1OTQsIDIyNSwgNTM1LCA1MTcsIDM1MiwgNjA1LCAxNTgsIDY1MSwNCisgICAgIDIwMSwgNDg4LCA1MDIsIDY0OCwgNzMzLCA3MTcsIDgzLCA0MDQsIDk3LCAyODAsIDc3MSwgODQwLCA2MjksIDQsIDM4MSwgODQzLA0KKyAgICAgNjIzLCAyNjQsIDU0M30sDQorICAgIHs1MjEsIDMxMCwgODY0LCA1NDcsIDg1OCwgNTgwLCAyOTYsIDM3OSwgNTMsIDc3OSwgODk3LCA0NDQsIDQwMCwgOTI1LCA3NDksDQorICAgICA0MTUsIDgyMiwgOTMsIDIxNywgMjA4LCA5MjgsIDI0NCwgNTgzLCA2MjAsIDI0NiwgMTQ4LCA0NDcsIDYzMSwgMjkyLCA5MDgsDQorICAgICA0OTAsIDcwNCwgNTE2LCAyNTgsIDQ1NywgOTA3LCA1OTQsIDcyMywgNjc0LCAyOTIsIDI3MiwgOTYsIDY4NCwgNDMyLCA2ODYsDQorICAgICA2MDYsIDg2MCwgNTY5LCAxOTMsIDIxOSwgMTI5LCAxODYsIDIzNiwgMjg3LCAxOTIsIDc3NSwgMjc4LCAxNzMsIDQwLCAzNzksDQorICAgICA3MTIsIDQ2MywgNjQ2LCA3NzYsIDE3MSwgNDkxLCAyOTcsIDc2MywgMTU2LCA3MzIsIDk1LCAyNzAsIDQ0NywgOTAsIDUwNywNCisgICAgIDQ4LCAyMjgsIDgyMSwgODA4LCA4OTgsIDc4NCwgNjYzLCA2MjcsIDM3OCwgMzgyLCAyNjIsIDM4MCwgNjAyLCA3NTQsIDMzNiwNCisgICAgIDg5LCA2MTQsIDg3LCA0MzIsIDY3MCwgNjE2LCAxNTcsIDM3NCwgMjQyLCA3MjYsIDYwMCwgMjY5LCAzNzUsIDg5OCwgODQ1LA0KKyAgICAgNDU0LCAzNTQsIDEzMCwgODE0LCA1ODcsIDgwNCwgMzQsIDIxMSwgMzMwLCA1MzksIDI5NywgODI3LCA4NjUsIDM3LCA1MTcsDQorICAgICA4MzQsIDMxNSwgNTUwLCA4NiwgODAxLCA0LCAxMDgsIDUzOX0sDQorICAgIHs1MjQsIDg5NCwgNzUsIDc2NiwgODgyLCA4NTcsIDc0LCAyMDQsIDgyLCA1ODYsIDcwOCwgMjUwLCA5MDUsIDc4NiwgMTM4LA0KKyAgICAgNzIwLCA4NTgsIDE5NCwgMzExLCA5MTMsIDI3NSwgMTkwLCAzNzUsIDg1MCwgNDM4LCA3MzMsIDE5NCwgMjgwLCAyMDEsIDI4MCwNCisgICAgIDgyOCwgNzU3LCA3MTAsIDgxNCwgOTE5LCA4OSwgNjgsIDU2OSwgMTEsIDIwNCwgNzk2LCA2MDUsIDU0MCwgOTEzLCA4MDEsDQorICAgICA3MDAsIDc5OSwgMTM3LCA0MzksIDQxOCwgNTkyLCA2NjgsIDM1MywgODU5LCAzNzAsIDY5NCwgMzI1LCAyNDAsIDIxNiwgMjU3LA0KKyAgICAgMjg0LCA1NDksIDIwOSwgODg0LCAzMTUsIDcwLCAzMjksIDc5MywgNDkwLCAyNzQsIDg3NywgMTYyLCA3NDksIDgxMiwgNjg0LA0KKyAgICAgNDYxLCAzMzQsIDM3NiwgODQ5LCA1MjEsIDMwNywgMjkxLCA4MDMsIDcxMiwgMTksIDM1OCwgMzk5LCA5MDgsIDEwMywgNTExLA0KKyAgICAgNTEsIDgsIDUxNywgMjI1LCAyODksIDQ3MCwgNjM3LCA3MzEsIDY2LCAyNTUsIDkxNywgMjY5LCA0NjMsIDgzMCwgNzMwLCA0MzMsDQorICAgICA4NDgsIDU4NSwgMTM2LCA1MzgsIDkwNiwgOTAsIDIsIDI5MCwgNzQzLCAxOTksIDY1NSwgOTAzLCAzMjksIDQ5LCA4MDIsIDU4MCwNCisgICAgIDM1NSwgNTg4LCAxODgsIDQ2MiwgMTAsIDEzNCwgNjI4LCAzMjAsIDQ3OSwgMTMwLCA3MzksIDcxLCAyNjMsIDMxOCwgMzc0LA0KKyAgICAgNjAxLCAxOTIsIDYwNSwgMTQyLCA2NzMsIDY4NywgMjM0LCA3MjIsIDM4NCwgMTc3LCA3NTIsIDYwNywgNjQwLCA0NTUsIDE5MywNCisgICAgIDY4OSwgNzA3LCA4MDUsIDY0MSwgNDgsIDYwLCA3MzIsIDYyMSwgODk1LCA1NDQsIDI2MSwgODUyLCA2NTUsIDMwOSwgNjk3LA0KKyAgICAgNzU1LCA3NTYsIDYwLCAyMzEsIDc3MywgNDM0LCA0MjEsIDcyNiwgNTI4LCA1MDMsIDExOCwgNDksIDc5NSwgMzIsIDE0NCwNCisgICAgIDUwMCwgMjM4LCA4MzYsIDM5NCwgMjgwLCA1NjYsIDMxOSwgOSwgNjQ3LCA1NTAsIDczLCA5MTQsIDM0MiwgMTI2LCAzMiwgNjgxLA0KKyAgICAgMzMxLCA3OTIsIDYyMCwgNjAsIDYwOSwgNDQxLCAxODAsIDc5MSwgODkzLCA3NTQsIDYwNSwgMzgzLCAyMjgsIDc0OSwgNzYwLA0KKyAgICAgMjEzLCA1NCwgMjk3LCAxMzQsIDU0LCA4MzQsIDI5OSwgOTIyLCAxOTEsIDkxMCwgNTMyLCA2MDksIDgyOSwgMTg5LCAyMCwNCisgICAgIDE2NywgMjksIDg3MiwgNDQ5LCA4MywgNDAyLCA0MSwgNjU2LCA1MDUsIDU3OSwgNDgxLCAxNzMsIDQwNCwgMjUxLCA2ODgsIDk1LA0KKyAgICAgNDk3LCA1NTUsIDY0MiwgNTQzLCAzMDcsIDE1OSwgOTI0LCA1NTgsIDY0OCwgNTUsIDQ5NywgMTB9LA0KKyAgICB7MzUyLCA3NywgMzczLCA1MDQsIDM1LCA1OTksIDQyOCwgMjA3LCA0MDksIDU3NCwgMTE4LCA0OTgsIDI4NSwgMzgwLCAzNTAsDQorICAgICA0OTIsIDE5NywgMjY1LCA5MjAsIDE1NSwgOTE0LCAyOTksIDIyOSwgNjQzLCAyOTQsIDg3MSwgMzA2LCA4OCwgODcsIDE5MywNCisgICAgIDM1MiwgNzgxLCA4NDYsIDc1LCAzMjcsIDUyMCwgNDM1LCA1NDMsIDIwMywgNjY2LCAyNDksIDM0NiwgNzgxLCA2MjEsIDY0MCwNCisgICAgIDI2OCwgNzk0LCA1MzQsIDUzOSwgNzgxLCA0MDgsIDM5MCwgNjQ0LCAxMDIsIDQ3NiwgNDk5LCAyOTAsIDYzMiwgNTQ1LCAzNywNCisgICAgIDg1OCwgOTE2LCA1NTIsIDQxLCA1NDIsIDI4OSwgMTIyLCAyNzIsIDM4MywgODAwLCA0ODUsIDk4LCA3NTIsIDQ3MiwgNzYxLA0KKyAgICAgMTA3LCA3ODQsIDg2MCwgNjU4LCA3NDEsIDI5MCwgMjA0LCA2ODEsIDQwNywgODU1LCA4NSwgOTksIDYyLCA0ODIsIDE4MCwgMjAsDQorICAgICAyOTcsIDQ1MSwgNTkzLCA5MTMsIDE0MiwgODA4LCA2ODQsIDI4NywgNTM2LCA1NjEsIDc2LCA2NTMsIDg5OSwgNzI5LCA1NjcsDQorICAgICA3NDQsIDM5MCwgNTEzLCAxOTIsIDUxNiwgMjU4LCAyNDAsIDUxOCwgNzk0LCAzOTUsIDc2OCwgODQ4LCA1MSwgNjEwLCAzODQsDQorICAgICAxNjgsIDE5MCwgODI2LCAzMjgsIDU5NiwgNzg2LCAzMDMsIDU3MCwgMzgxLCA0MTUsIDY0MSwgMTU2LCAyMzcsIDE1MSwgNDI5LA0KKyAgICAgNTMxLCAyMDcsIDY3NiwgNzEwLCA4OSwgMTY4LCAzMDQsIDQwMiwgNDAsIDcwOCwgNTc1LCAxNjIsIDg2NCwgMjI5LCA2NSwNCisgICAgIDg2MSwgODQxLCA1MTIsIDE2NCwgNDc3LCAyMjEsIDkyLCAzNTgsIDc4NSwgMjg4LCAzNTcsIDg1MCwgODM2LCA4MjcsIDczNiwNCisgICAgIDcwNywgOTQsIDgsIDQ5NCwgMTE0LCA1MjEsIDIsIDQ5OSwgODUxLCA1NDMsIDE1MiwgNzI5LCA3NzEsIDk1LCAyNDgsIDM2MSwNCisgICAgIDU3OCwgMzIzLCA4NTYsIDc5NywgMjg5LCA1MSwgNjg0LCA0NjYsIDUzMywgODIwLCA2NjksIDQ1LCA5MDIsIDQ1MiwgMTY3LA0KKyAgICAgMzQyLCAyNDQsIDE3MywgMzUsIDQ2MywgNjUxLCA1MSwgNjk5LCA1OTEsIDQ1MiwgNTc4LCAzNywgMTI0LCAyOTgsIDMzMiwNCisgICAgIDU1MiwgNDMsIDQyNywgMTE5LCA2NjIsIDc3NywgNDc1LCA4NTAsIDc2NCwgMzY0LCA1NzgsIDkxMSwgMjgzLCA3MTEsIDQ3MiwNCisgICAgIDQyMCwgMjQ1LCAyODgsIDU5NCwgMzk0LCA1MTEsIDMyNywgNTg5LCA3NzcsIDY5OSwgNjg4LCA0MywgNDA4LCA4NDIsIDM4MywNCisgICAgIDcyMSwgNTIxLCA1NjAsIDY0NCwgNzE0LCA1NTksIDYyLCAxNDUsIDg3MywgNjYzLCA3MTMsIDE1OSwgNjcyLCA3MjksIDYyNCwNCisgICAgIDU5LCAxOTMsIDQxNywgMTU4LCAyMDksIDU2MywgNTY0LCAzNDMsIDY5MywgMTA5LCA2MDgsIDU2MywgMzY1LCAxODEsIDc3MiwNCisgICAgIDY3NywgMzEwLCAyNDgsIDM1MywgNzA4LCA0MTAsIDU3OSwgODcwLCA2MTcsIDg0MSwgNjMyLCA4NjAsIDI4OSwgNTM2LCAzNSwNCisgICAgIDc3NywgNjE4LCA1ODYsIDQyNCwgODMzLCA3NywgNTk3LCAzNDYsIDI2OSwgNzU3LCA2MzIsIDY5NSwgNzUxLCAzMzEsIDI0NywNCisgICAgIDE4NCwgNDUsIDc4NywgNjgwLCAxOCwgNjYsIDQwNywgMzY5LCA1NCwgNDkyLCAyMjgsIDYxMywgODMwLCA5MjIsIDQzNywgNTE5LA0KKyAgICAgNjQ0LCA5MDUsIDc4OSwgNDIwLCAzMDUsIDQ0MSwgMjA3LCAzMDAsIDg5MiwgODI3LCAxNDEsIDUzNywgMzgxLCA2NjIsIDUxMywNCisgICAgIDU2LCAyNTIsIDM0MSwgMjQyLCA3OTcsIDgzOCwgODM3LCA3MjAsIDIyNCwgMzA3LCA2MzEsIDYxLCA4NywgNTYwLCAzMTAsDQorICAgICA3NTYsIDY2NSwgMzk3LCA4MDgsIDg1MSwgMzA5LCA0NzMsIDc5NSwgMzc4LCAzMSwgNjQ3LCA5MTUsIDQ1OSwgODA2LCA1OTAsDQorICAgICA3MzEsIDQyNSwgMjE2LCA1NDgsIDI0OSwgMzIxLCA4ODEsIDY5OSwgNTM1LCA2NzMsIDc4MiwgMjEwLCA4MTUsIDkwNSwgMzAzLA0KKyAgICAgODQzLCA5MjIsIDI4MSwgNzMsIDQ2OSwgNzkxLCA2NjAsIDE2MiwgNDk4LCAzMDgsIDE1NSwgNDIyLCA5MDcsIDgxNywgMTg3LA0KKyAgICAgNjIsIDE2LCA0MjUsIDUzNSwgMzM2LCAyODYsIDQzNywgMzc1LCAyNzMsIDYxMCwgMjk2LCAxODMsIDkyMywgMTE2LCA2NjcsDQorICAgICA3NTEsIDM1MywgNjIsIDM2NiwgNjkxLCAzNzksIDY4NywgODQyLCAzNywgMzU3LCA3MjAsIDc0MiwgMzMwLCA1LCAzOSwgOTIzLA0KKyAgICAgMzExLCA0MjQsIDI0MiwgNzQ5LCAzMjEsIDU0LCA2NjksIDMxNiwgMzQyLCAyOTksIDUzNCwgMTA1LCA2NjcsIDQ4OCwgNjQwLA0KKyAgICAgNjcyLCA1NzYsIDU0MCwgMzE2LCA0ODYsIDcyMSwgNjEwLCA0NiwgNjU2LCA0NDcsIDE3MSwgNjE2LCA0NjQsIDE5MCwgNTMxLA0KKyAgICAgMjk3LCAzMjEsIDc2MiwgNzUyLCA1MzMsIDE3NSwgMTM0LCAxNCwgMzgxLCA0MzMsIDcxNywgNDUsIDExMSwgMjAsIDU5NiwNCisgICAgIDI4NCwgNzM2LCAxMzgsIDY0NiwgNDExLCA4NzcsIDY2OSwgMTQxLCA5MTksIDQ1LCA3ODAsIDQwNywgMTY0LCAzMzIsIDg5OSwNCisgICAgIDE2NSwgNzI2LCA2MDAsIDMyNSwgNDk4LCA2NTUsIDM1NywgNzUyLCA3NjgsIDIyMywgODQ5LCA2NDcsIDYzLCAzMTAsIDg2MywNCisgICAgIDI1MSwgMzY2LCAzMDQsIDI4MiwgNzM4LCA2NzUsIDQxMCwgMzg5LCAyNDQsIDMxLCAxMjEsIDMwMywgMjYzfX07DQorQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Q0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbigpIHt9DQorQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6fkNCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24oKSB7fQ0KK2ludDMyX3QgQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Z2V0RXJyb3JDb3JyZWN0aW9uQ29kZXdvcmRDb3VudCgNCisgICAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGVycm9yQ29ycmVjdGlvbkxldmVsIDwgMCB8fCBlcnJvckNvcnJlY3Rpb25MZXZlbCA+IDgpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRXJyb3JDb3JyZWN0aW9uTGV2ZWxNdXN0QmVCZXR3ZWVuMEFuZDg7DQogICAgIHJldHVybiAtMTsNCisgIH0NCisgIHJldHVybiAxIDw8IChlcnJvckNvcnJlY3Rpb25MZXZlbCArIDEpOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjpnZW5lcmF0ZUVycm9yQ29ycmVjdGlvbihDRlhfV2lkZVN0cmluZyBkYXRhQ29kZXdvcmRzLCBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBrID0gZ2V0RXJyb3JDb3JyZWN0aW9uQ29kZXdvcmRDb3VudChlcnJvckNvcnJlY3Rpb25MZXZlbCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAgKEZYX1dDSEFSKScgJyk7DQotICAgIEZYX1dDSEFSKiBlY2ggPSBGWF9BbGxvYyhGWF9XQ0hBUiwgayAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICBGWFNZU19tZW1zZXQoZWNoLCAwLCBrICogc2l6ZW9mKEZYX1dDSEFSKSk7DQotICAgIGludDMyX3Qgc2xkID0gZGF0YUNvZGV3b3Jkcy5HZXRMZW5ndGgoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2xkOyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgdDEgPSAoZGF0YUNvZGV3b3Jkcy5HZXRBdChpKSArIGVjaFtrIC0gMV0pICUgOTI5Ow0KLSAgICAgICAgaW50MzJfdCB0MjsNCi0gICAgICAgIGludDMyX3QgdDM7DQotICAgICAgICBmb3IgKGludDMyX3QgaiA9IGsgLSAxOyBqID49IDE7IGotLSkgew0KLSAgICAgICAgICAgIHQyID0gKHQxICogRUNfQ09FRkZJQ0lFTlRTW2Vycm9yQ29ycmVjdGlvbkxldmVsXVtqXSkgJSA5Mjk7DQotICAgICAgICAgICAgdDMgPSA5MjkgLSB0MjsNCi0gICAgICAgICAgICBlY2hbal0gPSAoRlhfV0NIQVIpICgoZWNoW2ogLSAxXSArIHQzKSAlIDkyOSk7DQotICAgICAgICB9DQotICAgICAgICB0MiA9ICh0MSAqIEVDX0NPRUZGSUNJRU5UU1tlcnJvckNvcnJlY3Rpb25MZXZlbF1bMF0pICUgOTI5Ow0KLSAgICAgICAgdDMgPSA5MjkgLSB0MjsNCi0gICAgICAgIGVjaFswXSA9IChGWF9XQ0hBUikgKHQzICUgOTI5KTsNCitpbnQzMl90IENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdldFJlY29tbWVuZGVkTWluaW11bUVycm9yQ29ycmVjdGlvbkxldmVsKA0KKyAgICBpbnQzMl90IG4sDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChuIDw9IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50bk11c3RCZUFib3ZlMDsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaWYgKG4gPD0gNDApIHsNCisgICAgcmV0dXJuIDI7DQorICB9DQorICBpZiAobiA8PSAxNjApIHsNCisgICAgcmV0dXJuIDM7DQorICB9DQorICBpZiAobiA8PSAzMjApIHsNCisgICAgcmV0dXJuIDQ7DQorICB9DQorICBpZiAobiA8PSA4NjMpIHsNCisgICAgcmV0dXJuIDU7DQorICB9DQorICBlID0gQkNFeGNlcHRpb25Ob1JlY29tbWVuZGF0aW9uUG9zc2libGU7DQorICByZXR1cm4gLTE7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdlbmVyYXRlRXJyb3JDb3JyZWN0aW9uKA0KKyAgICBDRlhfV2lkZVN0cmluZyBkYXRhQ29kZXdvcmRzLA0KKyAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGsgPSBnZXRFcnJvckNvcnJlY3Rpb25Db2Rld29yZENvdW50KGVycm9yQ29ycmVjdGlvbkxldmVsLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAoRlhfV0NIQVIpJyAnKTsNCisgIEZYX1dDSEFSKiBlY2ggPSBGWF9BbGxvYyhGWF9XQ0hBUiwgayAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgRlhTWVNfbWVtc2V0KGVjaCwgMCwgayAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgaW50MzJfdCBzbGQgPSBkYXRhQ29kZXdvcmRzLkdldExlbmd0aCgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2xkOyBpKyspIHsNCisgICAgaW50MzJfdCB0MSA9IChkYXRhQ29kZXdvcmRzLkdldEF0KGkpICsgZWNoW2sgLSAxXSkgJSA5Mjk7DQorICAgIGludDMyX3QgdDI7DQorICAgIGludDMyX3QgdDM7DQorICAgIGZvciAoaW50MzJfdCBqID0gayAtIDE7IGogPj0gMTsgai0tKSB7DQorICAgICAgdDIgPSAodDEgKiBFQ19DT0VGRklDSUVOVFNbZXJyb3JDb3JyZWN0aW9uTGV2ZWxdW2pdKSAlIDkyOTsNCisgICAgICB0MyA9IDkyOSAtIHQyOw0KKyAgICAgIGVjaFtqXSA9IChGWF9XQ0hBUikoKGVjaFtqIC0gMV0gKyB0MykgJSA5MjkpOw0KICAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHNiOw0KLSAgICBmb3IgKGludDMyX3QgaiA9IGsgLSAxOyBqID49IDA7IGotLSkgew0KLSAgICAgICAgaWYgKGVjaFtqXSAhPSAwKSB7DQotICAgICAgICAgICAgZWNoW2pdID0gKEZYX1dDSEFSKSAoOTI5IC0gZWNoW2pdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHNiICs9IChGWF9XQ0hBUillY2hbal07DQorICAgIHQyID0gKHQxICogRUNfQ09FRkZJQ0lFTlRTW2Vycm9yQ29ycmVjdGlvbkxldmVsXVswXSkgJSA5Mjk7DQorICAgIHQzID0gOTI5IC0gdDI7DQorICAgIGVjaFswXSA9IChGWF9XQ0hBUikodDMgJSA5MjkpOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgc2I7DQorICBmb3IgKGludDMyX3QgaiA9IGsgLSAxOyBqID49IDA7IGotLSkgew0KKyAgICBpZiAoZWNoW2pdICE9IDApIHsNCisgICAgICBlY2hbal0gPSAoRlhfV0NIQVIpKDkyOSAtIGVjaFtqXSk7DQogICAgIH0NCi0gICAgRlhfRnJlZSAoZWNoKTsNCi0gICAgcmV0dXJuIHNiOw0KKyAgICBzYiArPSAoRlhfV0NIQVIpZWNoW2pdOw0KKyAgfQ0KKyAgRlhfRnJlZShlY2gpOw0KKyAgcmV0dXJuIHNiOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmgKaW5kZXggNGU1ZGVlMC4uMGQ1OTRkNiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uaApAQCAtNiwxNSArNiwxOSBAQAogDQogI2lmbmRlZiBfQkNfUERGNDE3RVJST1JDT1JSRUNUSU9OX0hfDQogI2RlZmluZSBfQkNfUERGNDE3RVJST1JDT1JSRUNUSU9OX0hfDQotY2xhc3MgQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24oKTsNCi0gICAgdmlydHVhbCB+Q0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbigpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBnZXRFcnJvckNvcnJlY3Rpb25Db2Rld29yZENvdW50KGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBnZXRSZWNvbW1lbmRlZE1pbmltdW1FcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IG4sIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZ2VuZXJhdGVFcnJvckNvcnJlY3Rpb24oQ0ZYX1dpZGVTdHJpbmcgZGF0YUNvZGV3b3JkcywgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgaW50MzJfdCAmZSk7DQotcHJpdmF0ZToNCi0gICAgc3RhdGljIGludDMyX3QgRUNfQ09FRkZJQ0lFTlRTW11bMjUwMF07DQorY2xhc3MgQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbiB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24oKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24oKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldEVycm9yQ29ycmVjdGlvbkNvZGV3b3JkQ291bnQoaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgaW50MzJfdCBnZXRSZWNvbW1lbmRlZE1pbmltdW1FcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IG4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBnZW5lcmF0ZUVycm9yQ29ycmVjdGlvbihDRlhfV2lkZVN0cmluZyBkYXRhQ29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgaW50MzJfdCBFQ19DT0VGRklDSUVOVFNbXVsyNTAwXTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmNwcAppbmRleCAzOGVmZTkzLi44MDY5NGI5IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuY3BwCkBAIC0yNSw5ICsyNSw5IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vLi4vdGhpcmRfcGFydHkvYmlnaW50L0JpZ0ludGVnZXJMaWJyYXJ5LmhoIg0KICNpbmNsdWRlICJCQ19QREY0MTdDb21wYWN0aW9uLmgiDQogI2luY2x1ZGUgIkJDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuaCINCi0jZGVmaW5lICBTVUJNT0RFX0FMUEhBICAwDQotI2RlZmluZSAgU1VCTU9ERV9MT1dFUiAgMQ0KLSNkZWZpbmUgIFNVQk1PREVfTUlYRUQgIDINCisjZGVmaW5lIFNVQk1PREVfQUxQSEEgMA0KKyNkZWZpbmUgU1VCTU9ERV9MT1dFUiAxDQorI2RlZmluZSBTVUJNT0RFX01JWEVEIDINCiBpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpURVhUX0NPTVBBQ1RJT04gPSAwOw0KIGludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkJZVEVfQ09NUEFDVElPTiA9IDE7DQogaW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TlVNRVJJQ19DT01QQUNUSU9OID0gMjsNCkBAIC0zNywzODQgKzM3LDM5MiBAQAogaW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fTlVNRVJJQyA9IDkwMjsNCiBpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpTSElGVF9UT19CWVRFID0gOTEzOw0KIGludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0JZVEUgPSA5MjQ7DQotdWludDhfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9NSVhFRF9SQVdbXSA9IHs0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgMzgsIDEzLCA5LCA0NCwgNTgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNSwgNDUsIDQ2LCAzNiwgNDcsIDQzLCAzNywgNDIsIDYxLCA5NCwgMCwgMzIsIDAsIDAsIDANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCi11aW50OF90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpURVhUX1BVTkNUVUFUSU9OX1JBV1tdID0gezU5LCA2MCwgNjIsIDY0LCA5MSwgOTIsIDkzLCA5NSwgOTYsIDEyNiwgMzMsIDEzLCA5LCA0NCwgNTgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgNDUsIDQ2LCAzNiwgNDcsIDM0LCAxMjQsIDQyLCA0MCwgNDEsIDYzLCAxMjMsIDEyNSwgMzksIDANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCit1aW50OF90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpURVhUX01JWEVEX1JBV1tdID0gew0KKyAgICA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgMzgsIDEzLCA5LCA0NCwgNTgsDQorICAgIDM1LCA0NSwgNDYsIDM2LCA0NywgNDMsIDM3LCA0MiwgNjEsIDk0LCAwLCAgMzIsIDAsIDAsICAwfTsNCit1aW50OF90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpURVhUX1BVTkNUVUFUSU9OX1JBV1tdID0gew0KKyAgICA1OSwgNjAsIDYyLCA2NCwgOTEsIDkyLCA5MywgIDk1LCA5NiwgMTI2LCAzMywgMTMsICA5LCAgIDQ0LCA1OCwNCisgICAgMTAsIDQ1LCA0NiwgMzYsIDQ3LCAzNCwgMTI0LCA0MiwgNDAsIDQxLCAgNjMsIDEyMywgMTI1LCAzOSwgMH07DQogaW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TUlYRURbMTI4XSA9IHswfTsNCiBpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpQVU5DVFVBVElPTlsxMjhdID0gezB9Ow0KLXZvaWQgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgSW52ZXJzZSgpOw0KK3ZvaWQgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKSB7DQorICBJbnZlcnNlKCk7DQogfQ0KLXZvaWQgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCkNCi17DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVIaWdoTGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgd2lkZU1zZywgQ29tcGFjdGlvbiBjb21wYWN0aW9uLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZXM7DQotICAgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOCh3aWRlTXNnLCBieXRlcyk7DQotICAgIENGWF9XaWRlU3RyaW5nIG1zZzsNCi0gICAgaW50MzJfdCBsZW4gPSBieXRlcy5HZXRMZW5ndGgoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCi0gICAgICAgIEZYX1dDSEFSIGNoID0gIChGWF9XQ0hBUikoYnl0ZXMuR2V0QXQoaSkgJiAweGZmKTsNCi0gICAgICAgIGlmIChjaCA9PSAnPycgJiYgYnl0ZXMuR2V0QXQoaSkgIT0gJz8nKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hhcmFjdGVyc091dHNpZGVJU084ODU5MUVuY29kaW5nOw0KLSAgICAgICAgICAgIHJldHVybiAoRlhfV0NIQVIqKSIiOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbXNnICs9IGNoOw0KK3ZvaWQgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCkge30NCitDRlhfV2lkZVN0cmluZyBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlSGlnaExldmVsKA0KKyAgICBDRlhfV2lkZVN0cmluZyB3aWRlTXNnLA0KKyAgICBDb21wYWN0aW9uIGNvbXBhY3Rpb24sDQorICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIGJ5dGVzOw0KKyAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVbmljb2RlVG9VVEY4KHdpZGVNc2csIGJ5dGVzKTsNCisgIENGWF9XaWRlU3RyaW5nIG1zZzsNCisgIGludDMyX3QgbGVuID0gYnl0ZXMuR2V0TGVuZ3RoKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KKyAgICBGWF9XQ0hBUiBjaCA9IChGWF9XQ0hBUikoYnl0ZXMuR2V0QXQoaSkgJiAweGZmKTsNCisgICAgaWYgKGNoID09ICc/JyAmJiBieXRlcy5HZXRBdChpKSAhPSAnPycpIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25DaGFyYWN0ZXJzT3V0c2lkZUlTTzg4NTkxRW5jb2Rpbmc7DQorICAgICAgcmV0dXJuIChGWF9XQ0hBUiopIiI7DQogICAgIH0NCi0gICAgQ0ZYX0J5dGVBcnJheSBieXRlQXJyOw0KLSAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBieXRlcy5HZXRMZW5ndGgoKTsgaysrKSB7DQotICAgICAgICBieXRlQXJyLkFkZChieXRlcy5HZXRBdChrKSk7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc2I7DQotICAgIGxlbiA9IG1zZy5HZXRMZW5ndGgoKTsNCi0gICAgaW50MzJfdCBwID0gMDsNCi0gICAgaW50MzJfdCB0ZXh0U3ViTW9kZSA9IFNVQk1PREVfQUxQSEE7DQotICAgIGlmIChjb21wYWN0aW9uID09IFRFWFQpIHsNCi0gICAgICAgIGVuY29kZVRleHQobXNnLCBwLCBsZW4sIHNiLCB0ZXh0U3ViTW9kZSk7DQotICAgIH0gZWxzZSBpZiAoY29tcGFjdGlvbiA9PSBCWVRFUykgew0KLSAgICAgICAgZW5jb2RlQmluYXJ5KCZieXRlQXJyLCBwLCBieXRlQXJyLkdldFNpemUoKSwgQllURV9DT01QQUNUSU9OLCBzYik7DQotICAgIH0gZWxzZSBpZiAoY29tcGFjdGlvbiA9PSBOVU1FUklDKSB7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpIExBVENIX1RPX05VTUVSSUM7DQotICAgICAgICBlbmNvZGVOdW1lcmljKG1zZywgcCwgbGVuLCBzYik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpbnQzMl90IGVuY29kaW5nTW9kZSA9IExBVENIX1RPX1RFWFQ7DQotICAgICAgICB3aGlsZSAocCA8IGxlbikgew0KLSAgICAgICAgICAgIGludDMyX3QgbiA9IGRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChtc2csIHApOw0KLSAgICAgICAgICAgIGlmIChuID49IDEzKSB7DQotICAgICAgICAgICAgICAgIHNiICs9IChGWF9XQ0hBUikgTEFUQ0hfVE9fTlVNRVJJQzsNCi0gICAgICAgICAgICAgICAgZW5jb2RpbmdNb2RlID0gTlVNRVJJQ19DT01QQUNUSU9OOw0KLSAgICAgICAgICAgICAgICB0ZXh0U3ViTW9kZSA9IFNVQk1PREVfQUxQSEE7DQotICAgICAgICAgICAgICAgIGVuY29kZU51bWVyaWMobXNnLCBwLCBuLCBzYik7DQotICAgICAgICAgICAgICAgIHAgKz0gbjsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHQgPSBkZXRlcm1pbmVDb25zZWN1dGl2ZVRleHRDb3VudChtc2csIHApOw0KLSAgICAgICAgICAgICAgICBpZiAodCA+PSA1IHx8IG4gPT0gbGVuKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdNb2RlICE9IFRFWFRfQ09NUEFDVElPTikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNiICs9IChGWF9XQ0hBUikgTEFUQ0hfVE9fVEVYVDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ01vZGUgPSBURVhUX0NPTVBBQ1RJT047DQotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN1Yk1vZGUgPSBTVUJNT0RFX0FMUEhBOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgdGV4dFN1Yk1vZGUgPSBlbmNvZGVUZXh0KG1zZywgcCwgdCwgc2IsIHRleHRTdWJNb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIHAgKz0gdDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgYiA9IGRldGVybWluZUNvbnNlY3V0aXZlQmluYXJ5Q291bnQobXNnLCAmYnl0ZUFyciwgcCwgZSk7DQotICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIChGWF9XQ0hBUiknICcpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gMSAmJiBlbmNvZGluZ01vZGUgPT0gVEVYVF9DT01QQUNUSU9OKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlQmluYXJ5KCZieXRlQXJyLCBwLCAxLCBURVhUX0NPTVBBQ1RJT04sIHNiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlQmluYXJ5KCZieXRlQXJyLCBwLCBiLCBlbmNvZGluZ01vZGUsIHNiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ01vZGUgPSBCWVRFX0NPTVBBQ1RJT047DQotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN1Yk1vZGUgPSBTVUJNT0RFX0FMUEhBOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcCArPSBiOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBzYjsNCi19DQotdm9pZCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6SW52ZXJzZSgpDQotew0KLSAgICB1aW50OF90IGkgPSAwOw0KLSAgICBpbnQzMl90IGwgPSAwOw0KLSAgICBmb3IgKGwgPSAwOyBsIDwgc2l6ZW9mKE1JWEVEKSAvIHNpemVvZihNSVhFRFswXSk7IGwrKykgew0KLSAgICAgICAgTUlYRURbbF0gPSAtMTsNCi0gICAgfQ0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKFRFWFRfTUlYRURfUkFXKSAvIHNpemVvZihURVhUX01JWEVEX1JBV1swXSk7IGkrKykgew0KLSAgICAgICAgdWludDhfdCBiID0gVEVYVF9NSVhFRF9SQVdbaV07DQotICAgICAgICBpZiAoYiA+IDApIHsNCi0gICAgICAgICAgICBNSVhFRFtiXSA9IGk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZm9yIChsID0gMDsgbCA8IHNpemVvZihQVU5DVFVBVElPTikgLyBzaXplb2YoUFVOQ1RVQVRJT05bMF0pOyBsKyspIHsNCi0gICAgICAgIFBVTkNUVUFUSU9OW2xdID0gLTE7DQotICAgIH0NCi0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihURVhUX1BVTkNUVUFUSU9OX1JBVykgLyBzaXplb2YoVEVYVF9QVU5DVFVBVElPTl9SQVdbMF0pOyBpKyspIHsNCi0gICAgICAgIHVpbnQ4X3QgYiA9IFRFWFRfUFVOQ1RVQVRJT05fUkFXW2ldOw0KLSAgICAgICAgaWYgKGIgPiAwKSB7DQotICAgICAgICAgICAgUFVOQ1RVQVRJT05bYl0gPSBpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLWludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZVRleHQoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBpbnQzMl90IHN0YXJ0cG9zLCBpbnQzMl90IGNvdW50LCBDRlhfV2lkZVN0cmluZyAmc2IsIGludDMyX3QgaW5pdGlhbFN1Ym1vZGUpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB0bXA7DQotICAgIGludDMyX3Qgc3VibW9kZSA9IGluaXRpYWxTdWJtb2RlOw0KLSAgICBpbnQzMl90IGlkeCA9IDA7DQotICAgIHdoaWxlIChUUlVFKSB7DQotICAgICAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChzdGFydHBvcyArIGlkeCk7DQotICAgICAgICBzd2l0Y2ggKHN1Ym1vZGUpIHsNCi0gICAgICAgICAgICBjYXNlIFNVQk1PREVfQUxQSEE6DQotICAgICAgICAgICAgICAgIGlmIChpc0FscGhhVXBwZXIoY2gpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgMjY7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpIChjaCAtIDY1KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0FscGhhTG93ZXIoY2gpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfTE9XRVI7DQotICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgMjc7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTWl4ZWQoY2gpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfTUlYRUQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgMjg7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpIDI5Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSBQVU5DVFVBVElPTltjaF07DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBTVUJNT0RFX0xPV0VSOg0KLSAgICAgICAgICAgICAgICBpZiAoaXNBbHBoYUxvd2VyKGNoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcgJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpIDI2Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAoY2ggLSA5Nyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNBbHBoYVVwcGVyKGNoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpIDI3Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpIChjaCAtIDY1KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNNaXhlZChjaCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJtb2RlID0gU1VCTU9ERV9NSVhFRDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAyODsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgMjk7DQotICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IFBVTkNUVUFUSU9OW2NoXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFNVQk1PREVfTUlYRUQ6DQotICAgICAgICAgICAgICAgIGlmIChpc01peGVkKGNoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgYSA9ICBNSVhFRFtjaF07DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGIgPSAoaW50MzJfdClhOw0KLSAgICAgICAgICAgICAgICAgICAgdG1wICs9IE1JWEVEW2NoXTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0FscGhhVXBwZXIoY2gpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfQUxQSEE7DQotICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgMjg7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQWxwaGFMb3dlcihjaCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJtb2RlID0gU1VCTU9ERV9MT1dFUjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAyNzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0cG9zICsgaWR4ICsgMSA8IGNvdW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIG5leHQgPSBtc2cuR2V0QXQoc3RhcnRwb3MgKyBpZHggKyAxKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHVuY3R1YXRpb24obmV4dCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX1BVTkNUVUFUSU9OOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgMjU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKSAyOTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgKz0gUFVOQ1RVQVRJT05bY2hdOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGlmIChpc1B1bmN0dWF0aW9uKGNoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdG1wICs9IFBVTkNUVUFUSU9OW2NoXTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX0FMUEhBOw0KLSAgICAgICAgICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikgMjk7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWR4Kys7DQotICAgICAgICBpZiAoaWR4ID49IGNvdW50KSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgRlhfV0NIQVIgaCA9IDA7DQotICAgIGludDMyX3QgbGVuID0gdG1wLkdldExlbmd0aCgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KLSAgICAgICAgRlhfQk9PTCBvZGQgPSAoaSAlIDIpICE9IDA7DQotICAgICAgICBpZiAob2RkKSB7DQotICAgICAgICAgICAgaCA9IChGWF9XQ0hBUikgKChoICogMzApICsgdG1wLkdldEF0KGkpKTsNCi0gICAgICAgICAgICBzYiArPSBoOw0KKyAgICBtc2cgKz0gY2g7DQorICB9DQorICBDRlhfQnl0ZUFycmF5IGJ5dGVBcnI7DQorICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBieXRlcy5HZXRMZW5ndGgoKTsgaysrKSB7DQorICAgIGJ5dGVBcnIuQWRkKGJ5dGVzLkdldEF0KGspKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHNiOw0KKyAgbGVuID0gbXNnLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBwID0gMDsNCisgIGludDMyX3QgdGV4dFN1Yk1vZGUgPSBTVUJNT0RFX0FMUEhBOw0KKyAgaWYgKGNvbXBhY3Rpb24gPT0gVEVYVCkgew0KKyAgICBlbmNvZGVUZXh0KG1zZywgcCwgbGVuLCBzYiwgdGV4dFN1Yk1vZGUpOw0KKyAgfSBlbHNlIGlmIChjb21wYWN0aW9uID09IEJZVEVTKSB7DQorICAgIGVuY29kZUJpbmFyeSgmYnl0ZUFyciwgcCwgYnl0ZUFyci5HZXRTaXplKCksIEJZVEVfQ09NUEFDVElPTiwgc2IpOw0KKyAgfSBlbHNlIGlmIChjb21wYWN0aW9uID09IE5VTUVSSUMpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKUxBVENIX1RPX05VTUVSSUM7DQorICAgIGVuY29kZU51bWVyaWMobXNnLCBwLCBsZW4sIHNiKTsNCisgIH0gZWxzZSB7DQorICAgIGludDMyX3QgZW5jb2RpbmdNb2RlID0gTEFUQ0hfVE9fVEVYVDsNCisgICAgd2hpbGUgKHAgPCBsZW4pIHsNCisgICAgICBpbnQzMl90IG4gPSBkZXRlcm1pbmVDb25zZWN1dGl2ZURpZ2l0Q291bnQobXNnLCBwKTsNCisgICAgICBpZiAobiA+PSAxMykgew0KKyAgICAgICAgc2IgKz0gKEZYX1dDSEFSKUxBVENIX1RPX05VTUVSSUM7DQorICAgICAgICBlbmNvZGluZ01vZGUgPSBOVU1FUklDX0NPTVBBQ1RJT047DQorICAgICAgICB0ZXh0U3ViTW9kZSA9IFNVQk1PREVfQUxQSEE7DQorICAgICAgICBlbmNvZGVOdW1lcmljKG1zZywgcCwgbiwgc2IpOw0KKyAgICAgICAgcCArPSBuOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpbnQzMl90IHQgPSBkZXRlcm1pbmVDb25zZWN1dGl2ZVRleHRDb3VudChtc2csIHApOw0KKyAgICAgICAgaWYgKHQgPj0gNSB8fCBuID09IGxlbikgew0KKyAgICAgICAgICBpZiAoZW5jb2RpbmdNb2RlICE9IFRFWFRfQ09NUEFDVElPTikgew0KKyAgICAgICAgICAgIHNiICs9IChGWF9XQ0hBUilMQVRDSF9UT19URVhUOw0KKyAgICAgICAgICAgIGVuY29kaW5nTW9kZSA9IFRFWFRfQ09NUEFDVElPTjsNCisgICAgICAgICAgICB0ZXh0U3ViTW9kZSA9IFNVQk1PREVfQUxQSEE7DQorICAgICAgICAgIH0NCisgICAgICAgICAgdGV4dFN1Yk1vZGUgPSBlbmNvZGVUZXh0KG1zZywgcCwgdCwgc2IsIHRleHRTdWJNb2RlKTsNCisgICAgICAgICAgcCArPSB0Ow0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBoID0gdG1wLkdldEF0KGkpOw0KKyAgICAgICAgICBpbnQzMl90IGIgPSBkZXRlcm1pbmVDb25zZWN1dGl2ZUJpbmFyeUNvdW50KG1zZywgJmJ5dGVBcnIsIHAsIGUpOw0KKyAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX1dDSEFSKScgJyk7DQorICAgICAgICAgIGlmIChiID09IDApIHsNCisgICAgICAgICAgICBiID0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYiA9PSAxICYmIGVuY29kaW5nTW9kZSA9PSBURVhUX0NPTVBBQ1RJT04pIHsNCisgICAgICAgICAgICBlbmNvZGVCaW5hcnkoJmJ5dGVBcnIsIHAsIDEsIFRFWFRfQ09NUEFDVElPTiwgc2IpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGVuY29kZUJpbmFyeSgmYnl0ZUFyciwgcCwgYiwgZW5jb2RpbmdNb2RlLCBzYik7DQorICAgICAgICAgICAgZW5jb2RpbmdNb2RlID0gQllURV9DT01QQUNUSU9OOw0KKyAgICAgICAgICAgIHRleHRTdWJNb2RlID0gU1VCTU9ERV9BTFBIQTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwICs9IGI7DQogICAgICAgICB9DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmICgobGVuICUgMikgIT0gMCkgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSAoKGggKiAzMCkgKyAyOSk7DQorICB9DQorICByZXR1cm4gc2I7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkludmVyc2UoKSB7DQorICB1aW50OF90IGkgPSAwOw0KKyAgaW50MzJfdCBsID0gMDsNCisgIGZvciAobCA9IDA7IGwgPCBzaXplb2YoTUlYRUQpIC8gc2l6ZW9mKE1JWEVEWzBdKTsgbCsrKSB7DQorICAgIE1JWEVEW2xdID0gLTE7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKFRFWFRfTUlYRURfUkFXKSAvIHNpemVvZihURVhUX01JWEVEX1JBV1swXSk7IGkrKykgew0KKyAgICB1aW50OF90IGIgPSBURVhUX01JWEVEX1JBV1tpXTsNCisgICAgaWYgKGIgPiAwKSB7DQorICAgICAgTUlYRURbYl0gPSBpOw0KICAgICB9DQotICAgIHJldHVybiBzdWJtb2RlOw0KLX0NCi12b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVCaW5hcnkoQ0ZYX0J5dGVBcnJheSogYnl0ZXMsIGludDMyX3Qgc3RhcnRwb3MsIGludDMyX3QgY291bnQsIGludDMyX3Qgc3RhcnRtb2RlLCBDRlhfV2lkZVN0cmluZyAmc2IpDQotew0KLSAgICBpZiAoY291bnQgPT0gMSAmJiBzdGFydG1vZGUgPT0gVEVYVF9DT01QQUNUSU9OKSB7DQotICAgICAgICBzYiArPSAoRlhfV0NIQVIpIFNISUZUX1RPX0JZVEU7DQorICB9DQorICBmb3IgKGwgPSAwOyBsIDwgc2l6ZW9mKFBVTkNUVUFUSU9OKSAvIHNpemVvZihQVU5DVFVBVElPTlswXSk7IGwrKykgew0KKyAgICBQVU5DVFVBVElPTltsXSA9IC0xOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsNCisgICAgICAgaSA8IHNpemVvZihURVhUX1BVTkNUVUFUSU9OX1JBVykgLyBzaXplb2YoVEVYVF9QVU5DVFVBVElPTl9SQVdbMF0pOw0KKyAgICAgICBpKyspIHsNCisgICAgdWludDhfdCBiID0gVEVYVF9QVU5DVFVBVElPTl9SQVdbaV07DQorICAgIGlmIChiID4gMCkgew0KKyAgICAgIFBVTkNUVUFUSU9OW2JdID0gaTsNCiAgICAgfQ0KLSAgICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOw0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBpZiAoY291bnQgPj0gNikgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSBMQVRDSF9UT19CWVRFOw0KLSAgICAgICAgRlhfV0NIQVIgY2hhcnNbNV07DQotICAgICAgICB3aGlsZSAoKHN0YXJ0cG9zICsgY291bnQgLSBpZHgpID49IDYpIHsNCi0gICAgICAgICAgICBpbnQ2NF90IHQgPSAwOw0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsNCi0gICAgICAgICAgICAgICAgdCA8PD0gODsNCi0gICAgICAgICAgICAgICAgdCArPSBieXRlcy0+R2V0QXQoaWR4ICsgaSkgJiAweGZmOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIGNoYXJzW2ldID0gKEZYX1dDSEFSKSAodCAlIDkwMCk7DQotICAgICAgICAgICAgICAgIHQgLz0gOTAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmb3IgKGkgPSA0OyBpID49IDA7IGktLSkgew0KLSAgICAgICAgICAgICAgICBzYiArPSAoY2hhcnNbaV0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZHggKz0gNjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoaWR4IDwgc3RhcnRwb3MgKyBjb3VudCkgew0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSBMQVRDSF9UT19CWVRFX1BBRERFRDsNCi0gICAgfQ0KLSAgICBmb3IgKGkgPSBpZHg7IGkgPCBzdGFydHBvcyArIGNvdW50OyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgY2ggPSBieXRlcy0+R2V0QXQoaSkgJiAweGZmOw0KLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKSBjaDsNCi0gICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVOdW1lcmljKENGWF9XaWRlU3RyaW5nIG1zZywgaW50MzJfdCBzdGFydHBvcywgaW50MzJfdCBjb3VudCwgQ0ZYX1dpZGVTdHJpbmcgJnNiKQ0KLXsNCi0gICAgaW50MzJfdCBpZHggPSAwOw0KLSAgICBCaWdJbnRlZ2VyIG51bTkwMCA9IDkwMDsNCi0gICAgd2hpbGUgKGlkeCA8IGNvdW50KSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB0bXA7DQotICAgICAgICBpbnQzMl90IGxlbiA9IDQ0IDwgY291bnQgLSBpZHggPyA0NCA6IGNvdW50IC0gaWR4Ow0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcGFydCA9ICgoRlhfV0NIQVIpJzEnICsgbXNnLk1pZChzdGFydHBvcyArIGlkeCwgbGVuKSkuVVRGOEVuY29kZSgpOw0KLSAgICAgICAgQmlnSW50ZWdlciBiaWdpbnQgPSBzdHJpbmdUb0JpZ0ludGVnZXIocGFydC5jX3N0cigpKTsNCi0gICAgICAgIGRvIHsNCi0gICAgICAgICAgICBpbnQzMl90IGMgPSAoYmlnaW50ICUgbnVtOTAwKS50b0ludCgpOw0KLSAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpKGMpOw0KLSAgICAgICAgICAgIGJpZ2ludCA9IGJpZ2ludCAvIG51bTkwMDsNCi0gICAgICAgIH0gd2hpbGUgKCFiaWdpbnQuaXNaZXJvKCkpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSB0bXAuR2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgew0KLSAgICAgICAgICAgIHNiICs9IHRtcC5HZXRBdChpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlkeCArPSBsZW47DQotICAgIH0NCi19DQotRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNEaWdpdChGWF9XQ0hBUiBjaCkNCi17DQotICAgIHJldHVybiBjaCA+PSAnMCcgJiYgY2ggPD0gJzknOw0KLX0NCi1GWF9CT09MIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjppc0FscGhhVXBwZXIoRlhfV0NIQVIgY2gpDQotew0KLSAgICByZXR1cm4gY2ggPT0gJyAnIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKTsNCi19DQotRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNBbHBoYUxvd2VyKEZYX1dDSEFSIGNoKQ0KLXsNCi0gICAgcmV0dXJuIGNoID09ICcgJyB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6Jyk7DQotfQ0KLUZYX0JPT0wgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmlzTWl4ZWQoRlhfV0NIQVIgY2gpDQotew0KLSAgICByZXR1cm4gTUlYRURbY2hdICE9IC0xOw0KLX0NCi1GWF9CT09MIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjppc1B1bmN0dWF0aW9uKEZYX1dDSEFSIGNoKQ0KLXsNCi0gICAgcmV0dXJuIFBVTkNUVUFUSU9OW2NoXSAhPSAtMTsNCi19DQotRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNUZXh0KEZYX1dDSEFSIGNoKQ0KLXsNCi0gICAgcmV0dXJuIGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IChjaCA+PSAzMiAmJiBjaCA8PSAxMjYpOw0KLX0NCi1pbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZURpZ2l0Q291bnQoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBpbnQzMl90IHN0YXJ0cG9zKQ0KLXsNCi0gICAgaW50MzJfdCBjb3VudCA9IDA7DQotICAgIGludDMyX3QgbGVuID0gbXNnLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOw0KLSAgICBpZiAoaWR4IDwgbGVuKSB7DQotICAgICAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChpZHgpOw0KLSAgICAgICAgd2hpbGUgKGlzRGlnaXQoY2gpICYmIGlkeCA8IGxlbikgew0KLSAgICAgICAgICAgIGNvdW50Kys7DQotICAgICAgICAgICAgaWR4Kys7DQotICAgICAgICAgICAgaWYgKGlkeCA8IGxlbikgew0KLSAgICAgICAgICAgICAgICBjaCA9IG1zZy5HZXRBdChpZHgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gY291bnQ7DQotfQ0KLWludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlVGV4dENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywgaW50MzJfdCBzdGFydHBvcykNCi17DQotICAgIGludDMyX3QgbGVuID0gbXNnLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOw0KLSAgICB3aGlsZSAoaWR4IDwgbGVuKSB7DQotICAgICAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChpZHgpOw0KLSAgICAgICAgaW50MzJfdCBudW1lcmljQ291bnQgPSAwOw0KLSAgICAgICAgd2hpbGUgKG51bWVyaWNDb3VudCA8IDEzICYmIGlzRGlnaXQoY2gpICYmIGlkeCA8IGxlbikgew0KLSAgICAgICAgICAgIG51bWVyaWNDb3VudCsrOw0KLSAgICAgICAgICAgIGlkeCsrOw0KLSAgICAgICAgICAgIGlmIChpZHggPCBsZW4pIHsNCi0gICAgICAgICAgICAgICAgY2ggPSBtc2cuR2V0QXQoaWR4KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAobnVtZXJpY0NvdW50ID49IDEzKSB7DQotICAgICAgICAgICAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zIC0gbnVtZXJpY0NvdW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG51bWVyaWNDb3VudCA+IDApIHsNCitpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVUZXh0KENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbml0aWFsU3VibW9kZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgdG1wOw0KKyAgaW50MzJfdCBzdWJtb2RlID0gaW5pdGlhbFN1Ym1vZGU7DQorICBpbnQzMl90IGlkeCA9IDA7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChzdGFydHBvcyArIGlkeCk7DQorICAgIHN3aXRjaCAoc3VibW9kZSkgew0KKyAgICAgIGNhc2UgU1VCTU9ERV9BTFBIQToNCisgICAgICAgIGlmIChpc0FscGhhVXBwZXIoY2gpKSB7DQorICAgICAgICAgIGlmIChjaCA9PSAnICcpIHsNCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI2Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpKGNoIC0gNjUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpZiAoaXNBbHBoYUxvd2VyKGNoKSkgew0KKyAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX0xPV0VSOw0KKyAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjc7DQogICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBjaCA9IG1zZy5HZXRBdChpZHgpOw0KLSAgICAgICAgaWYgKCFpc1RleHQoY2gpKSB7DQorICAgICAgICAgIH0gZWxzZSBpZiAoaXNNaXhlZChjaCkpIHsNCisgICAgICAgICAgICBzdWJtb2RlID0gU1VCTU9ERV9NSVhFRDsNCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI4Ow0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjk7DQorICAgICAgICAgICAgdG1wICs9IFBVTkNUVUFUSU9OW2NoXTsNCiAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgaWR4Kys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFNVQk1PREVfTE9XRVI6DQorICAgICAgICBpZiAoaXNBbHBoYUxvd2VyKGNoKSkgew0KKyAgICAgICAgICBpZiAoY2ggPT0gJyAnKSB7DQorICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikyNjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKShjaCAtIDk3KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGlzQWxwaGFVcHBlcihjaCkpIHsNCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI3Ow0KKyAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpKGNoIC0gNjUpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGlzTWl4ZWQoY2gpKSB7DQorICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfTUlYRUQ7DQorICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikyODsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI5Ow0KKyAgICAgICAgICAgIHRtcCArPSBQVU5DVFVBVElPTltjaF07DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgU1VCTU9ERV9NSVhFRDoNCisgICAgICAgIGlmIChpc01peGVkKGNoKSkgew0KKyAgICAgICAgICBGWF9XQ0hBUiBhID0gTUlYRURbY2hdOw0KKyAgICAgICAgICBpbnQzMl90IGIgPSAoaW50MzJfdClhOw0KKyAgICAgICAgICB0bXAgKz0gTUlYRURbY2hdOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGlzQWxwaGFVcHBlcihjaCkpIHsNCisgICAgICAgICAgICBzdWJtb2RlID0gU1VCTU9ERV9BTFBIQTsNCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI4Ow0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGlzQWxwaGFMb3dlcihjaCkpIHsNCisgICAgICAgICAgICBzdWJtb2RlID0gU1VCTU9ERV9MT1dFUjsNCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI3Ow0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChzdGFydHBvcyArIGlkeCArIDEgPCBjb3VudCkgew0KKyAgICAgICAgICAgICAgRlhfV0NIQVIgbmV4dCA9IG1zZy5HZXRBdChzdGFydHBvcyArIGlkeCArIDEpOw0KKyAgICAgICAgICAgICAgaWYgKGlzUHVuY3R1YXRpb24obmV4dCkpIHsNCisgICAgICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfUFVOQ1RVQVRJT047DQorICAgICAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjU7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI5Ow0KKyAgICAgICAgICAgIHRtcCArPSBQVU5DVFVBVElPTltjaF07DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBpZiAoaXNQdW5jdHVhdGlvbihjaCkpIHsNCisgICAgICAgICAgdG1wICs9IFBVTkNUVUFUSU9OW2NoXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX0FMUEhBOw0KKyAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI5Ow0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gaWR4IC0gc3RhcnRwb3M7DQorICAgIGlkeCsrOw0KKyAgICBpZiAoaWR4ID49IGNvdW50KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIEZYX1dDSEFSIGggPSAwOw0KKyAgaW50MzJfdCBsZW4gPSB0bXAuR2V0TGVuZ3RoKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KKyAgICBGWF9CT09MIG9kZCA9IChpICUgMikgIT0gMDsNCisgICAgaWYgKG9kZCkgew0KKyAgICAgIGggPSAoRlhfV0NIQVIpKChoICogMzApICsgdG1wLkdldEF0KGkpKTsNCisgICAgICBzYiArPSBoOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGggPSB0bXAuR2V0QXQoaSk7DQorICAgIH0NCisgIH0NCisgIGlmICgobGVuICUgMikgIT0gMCkgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpKChoICogMzApICsgMjkpOw0KKyAgfQ0KKyAgcmV0dXJuIHN1Ym1vZGU7DQogfQ0KLWludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlQmluYXJ5Q291bnQoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBDRlhfQnl0ZUFycmF5KiBieXRlcywgaW50MzJfdCBzdGFydHBvcywgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgbGVuID0gbXNnLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOw0KLSAgICB3aGlsZSAoaWR4IDwgbGVuKSB7DQotICAgICAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChpZHgpOw0KLSAgICAgICAgaW50MzJfdCBudW1lcmljQ291bnQgPSAwOw0KLSAgICAgICAgd2hpbGUgKG51bWVyaWNDb3VudCA8IDEzICYmIGlzRGlnaXQoY2gpKSB7DQotICAgICAgICAgICAgbnVtZXJpY0NvdW50Kys7DQotICAgICAgICAgICAgaW50MzJfdCBpID0gaWR4ICsgbnVtZXJpY0NvdW50Ow0KLSAgICAgICAgICAgIGlmIChpID49IGxlbikgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2ggPSBtc2cuR2V0QXQoaSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobnVtZXJpY0NvdW50ID49IDEzKSB7DQotICAgICAgICAgICAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCB0ZXh0Q291bnQgPSAwOw0KLSAgICAgICAgd2hpbGUgKHRleHRDb3VudCA8IDUgJiYgaXNUZXh0KGNoKSkgew0KLSAgICAgICAgICAgIHRleHRDb3VudCsrOw0KLSAgICAgICAgICAgIGludDMyX3QgaSA9IGlkeCArIHRleHRDb3VudDsNCi0gICAgICAgICAgICBpZiAoaSA+PSBsZW4pIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNoID0gbXNnLkdldEF0KGkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHRleHRDb3VudCA+PSA1KSB7DQotICAgICAgICAgICAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2ggPSBtc2cuR2V0QXQoaWR4KTsNCi0gICAgICAgIGlmIChieXRlcy0+R2V0QXQoaWR4KSA9PSA2MyAmJiBjaCAhPSAnPycpIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Ob25FbmNvZGFibGVDaGFyYWN0ZXJEZXRlY3RlZDsNCi0gICAgICAgICAgICByZXR1cm4gLTE7DQotICAgICAgICB9DQotICAgICAgICBpZHgrKzsNCit2b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVCaW5hcnkoQ0ZYX0J5dGVBcnJheSogYnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRtb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc2IpIHsNCisgIGlmIChjb3VudCA9PSAxICYmIHN0YXJ0bW9kZSA9PSBURVhUX0NPTVBBQ1RJT04pIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKVNISUZUX1RPX0JZVEU7DQorICB9DQorICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGlmIChjb3VudCA+PSA2KSB7DQorICAgIHNiICs9IChGWF9XQ0hBUilMQVRDSF9UT19CWVRFOw0KKyAgICBGWF9XQ0hBUiBjaGFyc1s1XTsNCisgICAgd2hpbGUgKChzdGFydHBvcyArIGNvdW50IC0gaWR4KSA+PSA2KSB7DQorICAgICAgaW50NjRfdCB0ID0gMDsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7DQorICAgICAgICB0IDw8PSA4Ow0KKyAgICAgICAgdCArPSBieXRlcy0+R2V0QXQoaWR4ICsgaSkgJiAweGZmOw0KKyAgICAgIH0NCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7DQorICAgICAgICBjaGFyc1tpXSA9IChGWF9XQ0hBUikodCAlIDkwMCk7DQorICAgICAgICB0IC89IDkwMDsNCisgICAgICB9DQorICAgICAgZm9yIChpID0gNDsgaSA+PSAwOyBpLS0pIHsNCisgICAgICAgIHNiICs9IChjaGFyc1tpXSk7DQorICAgICAgfQ0KKyAgICAgIGlkeCArPSA2Ow0KICAgICB9DQotICAgIHJldHVybiBpZHggLSBzdGFydHBvczsNCisgIH0NCisgIGlmIChpZHggPCBzdGFydHBvcyArIGNvdW50KSB7DQorICAgIHNiICs9IChGWF9XQ0hBUilMQVRDSF9UT19CWVRFX1BBRERFRDsNCisgIH0NCisgIGZvciAoaSA9IGlkeDsgaSA8IHN0YXJ0cG9zICsgY291bnQ7IGkrKykgew0KKyAgICBpbnQzMl90IGNoID0gYnl0ZXMtPkdldEF0KGkpICYgMHhmZjsNCisgICAgc2IgKz0gKEZYX1dDSEFSKWNoOw0KKyAgfQ0KK30NCit2b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVOdW1lcmljKENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiKSB7DQorICBpbnQzMl90IGlkeCA9IDA7DQorICBCaWdJbnRlZ2VyIG51bTkwMCA9IDkwMDsNCisgIHdoaWxlIChpZHggPCBjb3VudCkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB0bXA7DQorICAgIGludDMyX3QgbGVuID0gNDQgPCBjb3VudCAtIGlkeCA/IDQ0IDogY291bnQgLSBpZHg7DQorICAgIENGWF9CeXRlU3RyaW5nIHBhcnQgPQ0KKyAgICAgICAgKChGWF9XQ0hBUiknMScgKyBtc2cuTWlkKHN0YXJ0cG9zICsgaWR4LCBsZW4pKS5VVEY4RW5jb2RlKCk7DQorICAgIEJpZ0ludGVnZXIgYmlnaW50ID0gc3RyaW5nVG9CaWdJbnRlZ2VyKHBhcnQuY19zdHIoKSk7DQorICAgIGRvIHsNCisgICAgICBpbnQzMl90IGMgPSAoYmlnaW50ICUgbnVtOTAwKS50b0ludCgpOw0KKyAgICAgIHRtcCArPSAoRlhfV0NIQVIpKGMpOw0KKyAgICAgIGJpZ2ludCA9IGJpZ2ludCAvIG51bTkwMDsNCisgICAgfSB3aGlsZSAoIWJpZ2ludC5pc1plcm8oKSk7DQorICAgIGZvciAoaW50MzJfdCBpID0gdG1wLkdldExlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsNCisgICAgICBzYiArPSB0bXAuR2V0QXQoaSk7DQorICAgIH0NCisgICAgaWR4ICs9IGxlbjsNCisgIH0NCit9DQorRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNEaWdpdChGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOSc7DQorfQ0KK0ZYX0JPT0wgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmlzQWxwaGFVcHBlcihGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIGNoID09ICcgJyB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJyk7DQorfQ0KK0ZYX0JPT0wgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmlzQWxwaGFMb3dlcihGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIGNoID09ICcgJyB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6Jyk7DQorfQ0KK0ZYX0JPT0wgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmlzTWl4ZWQoRlhfV0NIQVIgY2gpIHsNCisgIHJldHVybiBNSVhFRFtjaF0gIT0gLTE7DQorfQ0KK0ZYX0JPT0wgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmlzUHVuY3R1YXRpb24oRlhfV0NIQVIgY2gpIHsNCisgIHJldHVybiBQVU5DVFVBVElPTltjaF0gIT0gLTE7DQorfQ0KK0ZYX0JPT0wgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmlzVGV4dChGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IChjaCA+PSAzMiAmJiBjaCA8PSAxMjYpOw0KK30NCitpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZURpZ2l0Q291bnQoDQorICAgIENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgaW50MzJfdCBzdGFydHBvcykgew0KKyAgaW50MzJfdCBjb3VudCA9IDA7DQorICBpbnQzMl90IGxlbiA9IG1zZy5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgaWR4ID0gc3RhcnRwb3M7DQorICBpZiAoaWR4IDwgbGVuKSB7DQorICAgIEZYX1dDSEFSIGNoID0gbXNnLkdldEF0KGlkeCk7DQorICAgIHdoaWxlIChpc0RpZ2l0KGNoKSAmJiBpZHggPCBsZW4pIHsNCisgICAgICBjb3VudCsrOw0KKyAgICAgIGlkeCsrOw0KKyAgICAgIGlmIChpZHggPCBsZW4pIHsNCisgICAgICAgIGNoID0gbXNnLkdldEF0KGlkeCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gY291bnQ7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlVGV4dENvdW50KA0KKyAgICBDRlhfV2lkZVN0cmluZyBtc2csDQorICAgIGludDMyX3Qgc3RhcnRwb3MpIHsNCisgIGludDMyX3QgbGVuID0gbXNnLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpZHggPSBzdGFydHBvczsNCisgIHdoaWxlIChpZHggPCBsZW4pIHsNCisgICAgRlhfV0NIQVIgY2ggPSBtc2cuR2V0QXQoaWR4KTsNCisgICAgaW50MzJfdCBudW1lcmljQ291bnQgPSAwOw0KKyAgICB3aGlsZSAobnVtZXJpY0NvdW50IDwgMTMgJiYgaXNEaWdpdChjaCkgJiYgaWR4IDwgbGVuKSB7DQorICAgICAgbnVtZXJpY0NvdW50Kys7DQorICAgICAgaWR4Kys7DQorICAgICAgaWYgKGlkeCA8IGxlbikgew0KKyAgICAgICAgY2ggPSBtc2cuR2V0QXQoaWR4KTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKG51bWVyaWNDb3VudCA+PSAxMykgew0KKyAgICAgIHJldHVybiBpZHggLSBzdGFydHBvcyAtIG51bWVyaWNDb3VudDsNCisgICAgfQ0KKyAgICBpZiAobnVtZXJpY0NvdW50ID4gMCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGNoID0gbXNnLkdldEF0KGlkeCk7DQorICAgIGlmICghaXNUZXh0KGNoKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlkeCsrOw0KKyAgfQ0KKyAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zOw0KK30NCitpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZUJpbmFyeUNvdW50KA0KKyAgICBDRlhfV2lkZVN0cmluZyBtc2csDQorICAgIENGWF9CeXRlQXJyYXkqIGJ5dGVzLA0KKyAgICBpbnQzMl90IHN0YXJ0cG9zLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGxlbiA9IG1zZy5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgaWR4ID0gc3RhcnRwb3M7DQorICB3aGlsZSAoaWR4IDwgbGVuKSB7DQorICAgIEZYX1dDSEFSIGNoID0gbXNnLkdldEF0KGlkeCk7DQorICAgIGludDMyX3QgbnVtZXJpY0NvdW50ID0gMDsNCisgICAgd2hpbGUgKG51bWVyaWNDb3VudCA8IDEzICYmIGlzRGlnaXQoY2gpKSB7DQorICAgICAgbnVtZXJpY0NvdW50Kys7DQorICAgICAgaW50MzJfdCBpID0gaWR4ICsgbnVtZXJpY0NvdW50Ow0KKyAgICAgIGlmIChpID49IGxlbikgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNoID0gbXNnLkdldEF0KGkpOw0KKyAgICB9DQorICAgIGlmIChudW1lcmljQ291bnQgPj0gMTMpIHsNCisgICAgICByZXR1cm4gaWR4IC0gc3RhcnRwb3M7DQorICAgIH0NCisgICAgaW50MzJfdCB0ZXh0Q291bnQgPSAwOw0KKyAgICB3aGlsZSAodGV4dENvdW50IDwgNSAmJiBpc1RleHQoY2gpKSB7DQorICAgICAgdGV4dENvdW50Kys7DQorICAgICAgaW50MzJfdCBpID0gaWR4ICsgdGV4dENvdW50Ow0KKyAgICAgIGlmIChpID49IGxlbikgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNoID0gbXNnLkdldEF0KGkpOw0KKyAgICB9DQorICAgIGlmICh0ZXh0Q291bnQgPj0gNSkgew0KKyAgICAgIHJldHVybiBpZHggLSBzdGFydHBvczsNCisgICAgfQ0KKyAgICBjaCA9IG1zZy5HZXRBdChpZHgpOw0KKyAgICBpZiAoYnl0ZXMtPkdldEF0KGlkeCkgPT0gNjMgJiYgY2ggIT0gJz8nKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uTm9uRW5jb2RhYmxlQ2hhcmFjdGVyRGV0ZWN0ZWQ7DQorICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIGlkeCsrOw0KKyAgfQ0KKyAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuaAppbmRleCAxNzc1MDdjLi5lMTFmMGE1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmgKQEAgLTksNDYgKzksNjQgQEAKIA0KICNpbmNsdWRlICJCQ19QREY0MTdDb21wYWN0aW9uLmgiDQogDQotY2xhc3MgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXINCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlSGlnaExldmVsKENGWF9XaWRlU3RyaW5nIG1zZywgQ29tcGFjdGlvbiBjb21wYWN0aW9uLCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgSW52ZXJzZSgpOw0KLSAgICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQotICAgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQotcHJpdmF0ZToNCi0gICAgc3RhdGljIGludDMyX3QgVEVYVF9DT01QQUNUSU9OOw0KLSAgICBzdGF0aWMgaW50MzJfdCBCWVRFX0NPTVBBQ1RJT047DQotICAgIHN0YXRpYyBpbnQzMl90IE5VTUVSSUNfQ09NUEFDVElPTjsNCi0gICAgc3RhdGljIGludDMyX3QgU1VCTU9ERV9QVU5DVFVBVElPTjsNCi0gICAgc3RhdGljIGludDMyX3QgTEFUQ0hfVE9fVEVYVDsNCi0gICAgc3RhdGljIGludDMyX3QgTEFUQ0hfVE9fQllURV9QQURERUQ7DQotICAgIHN0YXRpYyBpbnQzMl90IExBVENIX1RPX05VTUVSSUM7DQotICAgIHN0YXRpYyBpbnQzMl90IFNISUZUX1RPX0JZVEU7DQotICAgIHN0YXRpYyBpbnQzMl90IExBVENIX1RPX0JZVEU7DQotICAgIHN0YXRpYyB1aW50OF90IFRFWFRfTUlYRURfUkFXW107DQotICAgIHN0YXRpYyB1aW50OF90IFRFWFRfUFVOQ1RVQVRJT05fUkFXW107DQotICAgIHN0YXRpYyBpbnQzMl90IE1JWEVEWzEyOF07DQotICAgIHN0YXRpYyBpbnQzMl90IFBVTkNUVUFUSU9OWzEyOF07DQotICAgIHN0YXRpYyBpbnQzMl90IGVuY29kZVRleHQoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBpbnQzMl90IHN0YXJ0cG9zLCBpbnQzMl90IGNvdW50LCBDRlhfV2lkZVN0cmluZyAmc2IsIGludDMyX3QgaW5pdGlhbFN1Ym1vZGUpOw0KLSAgICBzdGF0aWMgdm9pZCBlbmNvZGVCaW5hcnkoQ0ZYX0J5dGVBcnJheSogYnl0ZXMsIGludDMyX3Qgc3RhcnRwb3MsIGludDMyX3QgY291bnQsIGludDMyX3Qgc3RhcnRtb2RlLCBDRlhfV2lkZVN0cmluZyAmc2IpOw0KLSAgICBzdGF0aWMgdm9pZCBlbmNvZGVOdW1lcmljKENGWF9XaWRlU3RyaW5nIG1zZywgaW50MzJfdCBzdGFydHBvcywgaW50MzJfdCBjb3VudCwgQ0ZYX1dpZGVTdHJpbmcgJnNiKTsNCi0gICAgc3RhdGljIEZYX0JPT0wgaXNEaWdpdChGWF9XQ0hBUiBjaCk7DQotICAgIHN0YXRpYyBGWF9CT09MIGlzQWxwaGFVcHBlcihGWF9XQ0hBUiBjaCk7DQotICAgIHN0YXRpYyBGWF9CT09MIGlzQWxwaGFMb3dlcihGWF9XQ0hBUiBjaCk7DQotICAgIHN0YXRpYyBGWF9CT09MIGlzTWl4ZWQoRlhfV0NIQVIgY2gpOw0KLSAgICBzdGF0aWMgRlhfQk9PTCBpc1B1bmN0dWF0aW9uKEZYX1dDSEFSIGNoKTsNCi0gICAgc3RhdGljIEZYX0JPT0wgaXNUZXh0KEZYX1dDSEFSIGNoKTsNCi0gICAgc3RhdGljIGludDMyX3QgZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywgaW50MzJfdCBzdGFydHBvcyk7DQotICAgIHN0YXRpYyBpbnQzMl90IGRldGVybWluZUNvbnNlY3V0aXZlVGV4dENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywgaW50MzJfdCBzdGFydHBvcyk7DQotICAgIHN0YXRpYyBpbnQzMl90IGRldGVybWluZUNvbnNlY3V0aXZlQmluYXJ5Q291bnQoQ0ZYX1dpZGVTdHJpbmcgbXNnLCBDRlhfQnl0ZUFycmF5KiBieXRlcywgaW50MzJfdCBzdGFydHBvcywgaW50MzJfdCAmZSk7DQorY2xhc3MgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlSGlnaExldmVsKENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbiBjb21wYWN0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEludmVyc2UoKTsNCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQogDQotICAgIGZyaWVuZCBjbGFzcyBQREY0MTdIaWdoTGV2ZWxFbmNvZGVyX0VuY29kZU51bWVyaWNfVGVzdDsNCi0gICAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfRW5jb2RlQmluYXJ5X1Rlc3Q7DQotICAgIGZyaWVuZCBjbGFzcyBQREY0MTdIaWdoTGV2ZWxFbmNvZGVyX0VuY29kZVRleHRfVGVzdDsNCi0gICAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfQ29uc2VjdXRpdmVEaWdpdENvdW50X1Rlc3Q7DQotICAgIGZyaWVuZCBjbGFzcyBQREY0MTdIaWdoTGV2ZWxFbmNvZGVyX0NvbnNlY3V0aXZlVGV4dENvdW50X1Rlc3Q7DQotICAgIGZyaWVuZCBjbGFzcyBQREY0MTdIaWdoTGV2ZWxFbmNvZGVyX0NvbnNlY3V0aXZlQmluYXJ5Q291bnRfVGVzdDsNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBpbnQzMl90IFRFWFRfQ09NUEFDVElPTjsNCisgIHN0YXRpYyBpbnQzMl90IEJZVEVfQ09NUEFDVElPTjsNCisgIHN0YXRpYyBpbnQzMl90IE5VTUVSSUNfQ09NUEFDVElPTjsNCisgIHN0YXRpYyBpbnQzMl90IFNVQk1PREVfUFVOQ1RVQVRJT047DQorICBzdGF0aWMgaW50MzJfdCBMQVRDSF9UT19URVhUOw0KKyAgc3RhdGljIGludDMyX3QgTEFUQ0hfVE9fQllURV9QQURERUQ7DQorICBzdGF0aWMgaW50MzJfdCBMQVRDSF9UT19OVU1FUklDOw0KKyAgc3RhdGljIGludDMyX3QgU0hJRlRfVE9fQllURTsNCisgIHN0YXRpYyBpbnQzMl90IExBVENIX1RPX0JZVEU7DQorICBzdGF0aWMgdWludDhfdCBURVhUX01JWEVEX1JBV1tdOw0KKyAgc3RhdGljIHVpbnQ4X3QgVEVYVF9QVU5DVFVBVElPTl9SQVdbXTsNCisgIHN0YXRpYyBpbnQzMl90IE1JWEVEWzEyOF07DQorICBzdGF0aWMgaW50MzJfdCBQVU5DVFVBVElPTlsxMjhdOw0KKyAgc3RhdGljIGludDMyX3QgZW5jb2RlVGV4dChDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbml0aWFsU3VibW9kZSk7DQorICBzdGF0aWMgdm9pZCBlbmNvZGVCaW5hcnkoQ0ZYX0J5dGVBcnJheSogYnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRtb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzYik7DQorICBzdGF0aWMgdm9pZCBlbmNvZGVOdW1lcmljKENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiKTsNCisgIHN0YXRpYyBGWF9CT09MIGlzRGlnaXQoRlhfV0NIQVIgY2gpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNBbHBoYVVwcGVyKEZYX1dDSEFSIGNoKTsNCisgIHN0YXRpYyBGWF9CT09MIGlzQWxwaGFMb3dlcihGWF9XQ0hBUiBjaCk7DQorICBzdGF0aWMgRlhfQk9PTCBpc01peGVkKEZYX1dDSEFSIGNoKTsNCisgIHN0YXRpYyBGWF9CT09MIGlzUHVuY3R1YXRpb24oRlhfV0NIQVIgY2gpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNUZXh0KEZYX1dDSEFSIGNoKTsNCisgIHN0YXRpYyBpbnQzMl90IGRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcyk7DQorICBzdGF0aWMgaW50MzJfdCBkZXRlcm1pbmVDb25zZWN1dGl2ZVRleHRDb3VudChDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zKTsNCisgIHN0YXRpYyBpbnQzMl90IGRldGVybWluZUNvbnNlY3V0aXZlQmluYXJ5Q291bnQoQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZUFycmF5KiBieXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorDQorICBmcmllbmQgY2xhc3MgUERGNDE3SGlnaExldmVsRW5jb2Rlcl9FbmNvZGVOdW1lcmljX1Rlc3Q7DQorICBmcmllbmQgY2xhc3MgUERGNDE3SGlnaExldmVsRW5jb2Rlcl9FbmNvZGVCaW5hcnlfVGVzdDsNCisgIGZyaWVuZCBjbGFzcyBQREY0MTdIaWdoTGV2ZWxFbmNvZGVyX0VuY29kZVRleHRfVGVzdDsNCisgIGZyaWVuZCBjbGFzcyBQREY0MTdIaWdoTGV2ZWxFbmNvZGVyX0NvbnNlY3V0aXZlRGlnaXRDb3VudF9UZXN0Ow0KKyAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfQ29uc2VjdXRpdmVUZXh0Q291bnRfVGVzdDsNCisgIGZyaWVuZCBjbGFzcyBQREY0MTdIaWdoTGV2ZWxFbmNvZGVyX0NvbnNlY3V0aXZlQmluYXJ5Q291bnRfVGVzdDsNCiB9Ow0KIA0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyX3VuaXR0ZXN0LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyX3VuaXR0ZXN0LmNwcAppbmRleCAwMTgzM2NmLi4zOTkwMmI4IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcl91bml0dGVzdC5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXJfdW5pdHRlc3QuY3BwCkBAIC0yNCwxOSArMjQsMjAgQEAKICAgICBjb25zdCB3Y2hhcl90KiBleHBlY3RlZDsKICAgICBpbnQgZXhwZWN0ZWRfbGVuZ3RoOwogICB9IGVuY29kZV9iaW5hcnlfY2FzZXNbXSA9IHsKLSAgICAvLyBFbXB0eSBzdHJpbmcgZW5jb2RlcyBhcyBlbXB0eSBzdHJpbmcuCi0gICAgeyAiIiwgMCwgMCwgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlRFWFRfQ09NUEFDVElPTiwgTCIiLCAwIH0sCisgICAgICAvLyBFbXB0eSBzdHJpbmcgZW5jb2RlcyBhcyBlbXB0eSBzdHJpbmcuCisgICAgICB7IiIsIDAsIDAsIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpURVhUX0NPTVBBQ1RJT04sIEwiIiwgMH0sCiAKLSAgICAvLyBGZXdlciB0aGFuIDYgY2hhcmFjdGVycyBlbmNvZGVzIGFzIHByZWZpeCB3aXRob3V0IGNvbXBhY3Rpb24uCi0gICAgeyAieHh4eHgiLCAwLCA1LCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9DT01QQUNUSU9OLCBMIlx4MDM4NXh4eHh4IiwgNiB9LAorICAgICAgLy8gRmV3ZXIgdGhhbiA2IGNoYXJhY3RlcnMgZW5jb2RlcyBhcyBwcmVmaXggd2l0aG91dCBjb21wYWN0aW9uLgorICAgICAgeyJ4eHh4eCIsIDAsIDUsIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpURVhUX0NPTVBBQ1RJT04sCisgICAgICAgTCJceDAzODV4eHh4eCIsIDZ9LAogCi0gICAgLy8gNiBjaGFyY3RlcnMgdHJpZ2dlcnN0IHRleHQgZW5jb2RpbmcgY29tcGFjdGlvbi4KLSAgICB7ICJ4eHh4eHgiLCAwLCA2LCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9DT01QQUNUSU9OLAotICAgICAgTCJcdTAzOWNcdTAwYzlcdTAzMWZcdTAxMmFcdTAwZDJcdTAyZDAiLCA2IH0sCisgICAgICAvLyA2IGNoYXJjdGVycyB0cmlnZ2Vyc3QgdGV4dCBlbmNvZGluZyBjb21wYWN0aW9uLgorICAgICAgeyJ4eHh4eHgiLCAwLCA2LCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9DT01QQUNUSU9OLAorICAgICAgIEwiXHUwMzljXHUwMGM5XHUwMzFmXHUwMTJhXHUwMGQyXHUwMmQwIiwgNn0sCiAKLSAgICAvLyBTYW1lIHJlc3VsdCBpZiBpbml0aWFsbHkgaW4gbnVtZXJpYyBjb21wYWN0aW9uIG1vZGUuCi0gICAgeyAieHh4eHh4IiwgMCwgNiwgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6Ok5VTUVSSUNfQ09NUEFDVElPTiwKLSAgICAgIEwiXHUwMzljXHUwMGM5XHUwMzFmXHUwMTJhXHUwMGQyXHUwMmQwIiwgNiB9LAorICAgICAgLy8gU2FtZSByZXN1bHQgaWYgaW5pdGlhbGx5IGluIG51bWVyaWMgY29tcGFjdGlvbiBtb2RlLgorICAgICAgeyJ4eHh4eHgiLCAwLCA2LCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TlVNRVJJQ19DT01QQUNUSU9OLAorICAgICAgIEwiXHUwMzljXHUwMGM5XHUwMzFmXHUwMTJhXHUwMGQyXHUwMmQwIiwgNn0sCiAgIH07CiAKICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKTsKQEAgLTY1LDM5ICs2Niw0OSBAQAogICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkOwogICAgIGludCBleHBlY3RlZF9sZW5ndGg7CiAgIH0gZW5jb2RlX251bWVyaWNfY2FzZXNbXSA9IHsKLSAgICAvLyBFbXB0eSBzdHJpbmcgZW5jb2RlcyBhcyBlbXB0eSBzdHJpbmcuCi0gICAgeyBMIiIsIDAsIDAsIEwiIiwgMCB9LAorICAgICAgLy8gRW1wdHkgc3RyaW5nIGVuY29kZXMgYXMgZW1wdHkgc3RyaW5nLgorICAgICAge0wiIiwgMCwgMCwgTCIiLCAwfSwKIAotICAgIC8vIEJsYW5rIHN0cmluZyBlbmNvZGVzIGFzIGVtcHR5IHN0cmluZy4KLSAgICB7IEwiICIsIDAsIDEsIEwiIiwgMCB9LAorICAgICAgLy8gQmxhbmsgc3RyaW5nIGVuY29kZXMgYXMgZW1wdHkgc3RyaW5nLgorICAgICAge0wiICIsIDAsIDEsIEwiIiwgMH0sCiAKLSAgICAvLyBTaW5nbGUgMCBzaG91bGQgZW5jb2RlIGFzIDEwIGJhc2UtOTAwID09IDEwLgotICAgIHsgTCIwIiwgMCwgMSwgTCIiLCAwIH0sIC8vIHdyb25nIC0gc2hvdWxkIGJlIFx1MDAwYT8KKyAgICAgIC8vIFNpbmdsZSAwIHNob3VsZCBlbmNvZGUgYXMgMTAgYmFzZS05MDAgPT0gMTAuCisgICAgICB7TCIwIiwgMCwgMSwgTCIiLCAwfSwgIC8vIHdyb25nIC0gc2hvdWxkIGJlIFx1MDAwYT8KIAotICAgIC8vIDgwMCBzaG91bGQgZW5jb2RlIGFzIDE4MDAgYmFzZS05MDAgPT0gMiwwLgotICAgIHsgTCI4MDAiLCAwLCAzLCBMIlx4MDAwMlx4MDAwMCIsIDIgfSwKKyAgICAgIC8vIDgwMCBzaG91bGQgZW5jb2RlIGFzIDE4MDAgYmFzZS05MDAgPT0gMiwwLgorICAgICAge0wiODAwIiwgMCwgMywgTCJceDAwMDJceDAwMDAiLCAyfSwKIAotICAgIC8vIFRlc3QgbG9uZ2VyIHN0cmluZ3MgYW5kIHN1Yi1zdHJpbmdzLgotICAgIHsgTCIxMjM0NTYiLCAwLCA2LCBMIlx4MDAwMVx4MDE1Y1x4MDEwMCIsIDMgfSwKLSAgICB7IEwiMTIzNDU2IiwgMCwgNSwgTCJceDAwN2NceDAyZTkiLCAyIH0sCi0gICAgeyBMIjEyMzQ1NiIsIDEsIDUsIEwiXHgwMDg5XHgwMDljIiwgMiB9LAotICAgIHsgTCIxMjM0NTYiLCAyLCAyLCBMIlx4MDA4NiIsIDEgfSwKKyAgICAgIC8vIFRlc3QgbG9uZ2VyIHN0cmluZ3MgYW5kIHN1Yi1zdHJpbmdzLgorICAgICAge0wiMTIzNDU2IiwgMCwgNiwgTCJceDAwMDFceDAxNWNceDAxMDAiLCAzfSwKKyAgICAgIHtMIjEyMzQ1NiIsIDAsIDUsIEwiXHgwMDdjXHgwMmU5IiwgMn0sCisgICAgICB7TCIxMjM0NTYiLCAxLCA1LCBMIlx4MDA4OVx4MDA5YyIsIDJ9LAorICAgICAge0wiMTIzNDU2IiwgMiwgMiwgTCJceDAwODYiLCAxfSwKIAotICAgIC8vIFVwIHRvIDQ0IGNoYXJhY3RlcnMgZW5jb2RlcyBhcyAxNSBiYXNlLTkwMCB3b3Jkcy4KLSAgICB7IEwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAwLCA0NCwKLSAgICAgIEwiXHgwMWI1XHgwMDZmXHgwMmNjXHgwMDg0XHgwMWJjXHgwMDc2XHgwMGIzXHgwMDVjXHgwMWYwXHgwMzRmXHgwMWU2XHgwMDkwXHgwMjBiXHgwMTliXHgwMDY0IiwgMTUgfSwKKyAgICAgIC8vIFVwIHRvIDQ0IGNoYXJhY3RlcnMgZW5jb2RlcyBhcyAxNSBiYXNlLTkwMCB3b3Jkcy4KKyAgICAgIHtMIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgMCwgNDQsCisgICAgICAgTCJceDAxYjVceDAwNmZceDAyY2NceDAwODRceDAxYmNceDAwNzZceDAwYjNceDAwNWNceDAxZjBceDAzNGZceDAxZTYiCisgICAgICAgTCJceDAwOTBceDAyMGJceDAxOWJceDAwNjQiLAorICAgICAgIDE1fSwKIAotICAgIC8vIDQ1IGNoYXJhY3RlcnMgc2hvdWxkIGVuY29kZSBhcyBzYW1lIDE1IHdvcmRzIGZvbGxvd2VkIGJ5IG9uZSBhZGRpdGlvbmFsIHdvcmQuCi0gICAgeyBMIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIDAsIDQ1LAotICAgICAgTCJceDAxYjVceDAwNmZceDAyY2NceDAwODRceDAxYmNceDAwNzZceDAwYjNceDAwNWNceDAxZjBceDAzNGZceDAxZTZceDAwOTBceDAyMGJceDAxOWJceDAwNjRceDAwMGEiLCAxNiB9LAorICAgICAgLy8gNDUgY2hhcmFjdGVycyBzaG91bGQgZW5jb2RlIGFzIHNhbWUgMTUgd29yZHMgZm9sbG93ZWQgYnkgb25lIGFkZGl0aW9uYWwKKyAgICAgIC8vIHdvcmQuCisgICAgICB7TCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAwLCA0NSwKKyAgICAgICBMIlx4MDFiNVx4MDA2Zlx4MDJjY1x4MDA4NFx4MDFiY1x4MDA3Nlx4MDBiM1x4MDA1Y1x4MDFmMFx4MDM0Zlx4MDFlNiIKKyAgICAgICBMIlx4MDA5MFx4MDIwYlx4MDE5Ylx4MDA2NFx4MDAwYSIsCisgICAgICAgMTZ9LAogCi0gICAgLy8gNDQgY2hhcmFjdGVycyBmb2xsb3dlZCBieSA4MDAgc2hvdWxkIGVuY29kZSBhcyAxNSB3b3JkcyBmb2xsb3dlZCBieSAxODAwIGJhc2UtOTAwID09IDIsMC4KLSAgICB7IEwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MDAiLCAwLCA0NywKLSAgICAgIEwiXHgwMWI1XHgwMDZmXHgwMmNjXHgwMDg0XHgwMWJjXHgwMDc2XHgwMGIzXHgwMDVjXHgwMWYwXHgwMzRmXHgwMWU2XHgwMDkwXHgwMjBiXHgwMTliXHgwMDY0XHgwMDAyXHgwMDAwIiwgMTcgfSwKKyAgICAgIC8vIDQ0IGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgODAwIHNob3VsZCBlbmNvZGUgYXMgMTUgd29yZHMgZm9sbG93ZWQgYnkKKyAgICAgIC8vIDE4MDAgYmFzZS05MDAgPT0gMiwwLgorICAgICAge0wiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MDAiLCAwLCA0NywKKyAgICAgICBMIlx4MDFiNVx4MDA2Zlx4MDJjY1x4MDA4NFx4MDFiY1x4MDA3Nlx4MDBiM1x4MDA1Y1x4MDFmMFx4MDM0Zlx4MDFlNiIKKyAgICAgICBMIlx4MDA5MFx4MDIwYlx4MDE5Ylx4MDA2NFx4MDAwMlx4MDAwMCIsCisgICAgICAgMTd9LAogCi0gICAgLy8gRXZlbiBsb25nZXIgaW5wdXQuCi0gICAgeyBMIjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgMCwgNTAsCi0gICAgICBMIlx4MDFlMFx4MDJmMFx4MDM2ZFx4MDJhZFx4MDI5Y1x4MDFlYVx4MDAxMVx4MDAwYlx4MDJkNlx4MDIzY1x4MDEwOFx4MDJiYlx4MDAyM1x4MDJkMlx4MDBjOFx4MDAwMVx4MDBkM1x4MDA2NCIsIDE4IH0sCisgICAgICAvLyBFdmVuIGxvbmdlciBpbnB1dC4KKyAgICAgIHtMIjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgMCwgNTAsCisgICAgICAgTCJceDAxZTBceDAyZjBceDAzNmRceDAyYWRceDAyOWNceDAxZWFceDAwMTFceDAwMGJceDAyZDZceDAyM2NceDAxMDgiCisgICAgICAgTCJceDAyYmJceDAwMjNceDAyZDJceDAwYzhceDAwMDFceDAwZDNceDAwNjQiLAorICAgICAgIDE4fSwKICAgfTsKIAogICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6SW5pdGlhbGl6ZSgpOwpAQCAtMTA2LDggKzExNyw4IEBACiAgICAgQ0ZYX1dpZGVTdHJpbmcgaW5wdXQocHRyLT5pbnB1dCk7CiAgICAgQ0ZYX1dpZGVTdHJpbmcgZXhwZWN0ZWQocHRyLT5leHBlY3RlZCwgcHRyLT5leHBlY3RlZF9sZW5ndGgpOwogICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlTnVtZXJpYygKLSAgICAgICAgaW5wdXQsIHB0ci0+b2Zmc2V0LCBwdHItPmNvdW50LCByZXN1bHQpOworICAgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVOdW1lcmljKGlucHV0LCBwdHItPm9mZnNldCwgcHRyLT5jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOwogICAgIEVYUEVDVF9FUShleHBlY3RlZCwgcmVzdWx0KSA8PCAiIGZvciBjYXNlIG51bWJlciAiIDw8IGk7CiAgIH0KICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCk7CkBAIC0xMTksMzkgKzEzMCw0MSBAQAogICAgIGludCBvZmZzZXQ7CiAgICAgaW50IGV4cGVjdGVkX2NvdW50OwogICB9IGNvbnNlY3V0aXZlX2RpZ2l0X2Nhc2VzW10gPSB7Ci0gICAgLy8gRW1wdHkgc3RyaW5nIGNvbnRhaW5zIDAgY29uc2VjdWl0dmUgZGlnaXRzLgotICAgIHsgTCIiLCAwLCAwIH0sCisgICAgICAvLyBFbXB0eSBzdHJpbmcgY29udGFpbnMgMCBjb25zZWN1aXR2ZSBkaWdpdHMuCisgICAgICB7TCIiLCAwLCAwfSwKIAotICAgIC8vIFNpbmdsZSBub24tZGlnaXQgY2hhcmFjdGVyIGNvbnRhaW5zIDAgY29uc2VjdXRpdmUgZGlnaXRzLgotICAgIHsgTCJYIiwgMCwgMCB9LAorICAgICAgLy8gU2luZ2xlIG5vbi1kaWdpdCBjaGFyYWN0ZXIgY29udGFpbnMgMCBjb25zZWN1dGl2ZSBkaWdpdHMuCisgICAgICB7TCJYIiwgMCwgMH0sCiAKLSAgICAvLyBMZWFkaW5nIG5vbi1kaWdpdCBmb2xsb3dlZCBieSBkaWdpdHMgY29udGFpbnMgMCBjb25zZWN1dGl2ZS4KLSAgICB7IEwiWDEyMyIsIDAsIDAgfSwKKyAgICAgIC8vIExlYWRpbmcgbm9uLWRpZ2l0IGZvbGxvd2VkIGJ5IGRpZ2l0cyBjb250YWlucyAwIGNvbnNlY3V0aXZlLgorICAgICAge0wiWDEyMyIsIDAsIDB9LAogCi0gICAgLy8gU2luZ2xlIGRpZ2l0IGNvbnRhaW5zIDEgY29uc2VjdXRpdmUgZGlnaXQuCi0gICAgeyBMIjEiLCAwLCAxIH0sCisgICAgICAvLyBTaW5nbGUgZGlnaXQgY29udGFpbnMgMSBjb25zZWN1dGl2ZSBkaWdpdC4KKyAgICAgIHtMIjEiLCAwLCAxfSwKIAotICAgIC8vIFNpbmdsZSBkaWdpdCBmb2xsb3dlIGJ5IG5vbi1kaWdpdCBjb250YWlucyAxIGNvbnNlY3V0aXZlIGRpZ2l0LgotICAgIHsgTCIxWiIsIDAsIDEgfSwKKyAgICAgIC8vIFNpbmdsZSBkaWdpdCBmb2xsb3dlIGJ5IG5vbi1kaWdpdCBjb250YWlucyAxIGNvbnNlY3V0aXZlIGRpZ2l0LgorICAgICAge0wiMVoiLCAwLCAxfSwKIAotICAgIC8vIFRlc3QgbG9uZ2VyIHN0cmluZ3MuCi0gICAgeyBMIjEyM0ZPTzQ1Njc4IiwgMCwgMyB9LAorICAgICAgLy8gVGVzdCBsb25nZXIgc3RyaW5ncy4KKyAgICAgIHtMIjEyM0ZPTzQ1Njc4IiwgMCwgM30sCiAKLSAgICAvLyBUZXN0IHN1YnRyaW5nIHN0YXJ0aW5nIGluIGRpZ2l0cyBmaWVsZC4KLSAgICB7IEwiMTIzRk9PNDU2NzgiLCAzLCAwIH0sCisgICAgICAvLyBUZXN0IHN1YnRyaW5nIHN0YXJ0aW5nIGluIGRpZ2l0cyBmaWVsZC4KKyAgICAgIHtMIjEyM0ZPTzQ1Njc4IiwgMywgMH0sCiAKLSAgICAvLyBUZXN0IHN1YnRyaW5nIHN0YXJ0aW5nIGluIG5vbi1kaWdpdHMgZmllbGQuCi0gICAgeyBMIjEyM0ZPTzQ1Njc4IiwgMywgMCB9LAorICAgICAgLy8gVGVzdCBzdWJ0cmluZyBzdGFydGluZyBpbiBub24tZGlnaXRzIGZpZWxkLgorICAgICAge0wiMTIzRk9PNDU2NzgiLCAzLCAwfSwKIAotICAgIC8vIFRlc3Qgc3Vic3RyaW5nIHN0YXJ0aW5nIGluIGRpZ2l0cyBmaWVsZCBmb2xsb3dpbmcgbm9uLWRpZ2l0IGZpZWxkLgotICAgIHsgTCIxMjNGT080NTY3OCIsIDYsIDUgfSwKKyAgICAgIC8vIFRlc3Qgc3Vic3RyaW5nIHN0YXJ0aW5nIGluIGRpZ2l0cyBmaWVsZCBmb2xsb3dpbmcgbm9uLWRpZ2l0IGZpZWxkLgorICAgICAge0wiMTIzRk9PNDU2NzgiLCA2LCA1fSwKICAgfTsKIAogICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6SW5pdGlhbGl6ZSgpOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShjb25zZWN1dGl2ZV9kaWdpdF9jYXNlcyk7ICsraSkgewogICAgIENvbnNlY3V0aXZlRGlnaXRDYXNlKiBwdHIgPSAmY29uc2VjdXRpdmVfZGlnaXRfY2FzZXNbaV07CiAgICAgQ0ZYX1dpZGVTdHJpbmcgaW5wdXQocHRyLT5pbnB1dCk7Ci0gICAgaW50IGFjdHVhbF9jb3VudCA9IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZURpZ2l0Q291bnQoaW5wdXQsIHB0ci0+b2Zmc2V0KTsKKyAgICBpbnQgYWN0dWFsX2NvdW50ID0KKyAgICAgICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPm9mZnNldCk7CiAgICAgRVhQRUNUX0VRKHB0ci0+ZXhwZWN0ZWRfY291bnQsIGFjdHVhbF9jb3VudCkgPDwgIiBmb3IgY2FzZSBudW1iZXIgIiA8PCBpOwogICB9CiAgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpGaW5hbGl6ZSgpOwpAQCAtMTYzLDU5ICsxNzYsNTkgQEAKICAgICBpbnQgb2Zmc2V0OwogICAgIGludCBleHBlY3RlZF9jb3VudDsKICAgfSBjb25zZWN1dGl2ZV90ZXh0X2Nhc2VzW10gPSB7Ci0gICAgLy8gRW1wdHkgc3RyaW5nIGNvbnRhaW5zIDAgY29uc2VjdXRpdmUgdGV4dCBjaGFyYWN0ZXJzLgotICAgIHsgTCIiLCAwLCAwIH0sCisgICAgICAvLyBFbXB0eSBzdHJpbmcgY29udGFpbnMgMCBjb25zZWN1dGl2ZSB0ZXh0IGNoYXJhY3RlcnMuCisgICAgICB7TCIiLCAwLCAwfSwKIAotICAgIC8vIFNpbmdsZSB0ZXh0IGNoYXJhY3RlciBpcyAxIGNvbnNlY3V0aXZlIHRleHQgY2hhcmFjdGVycy4KLSAgICB7IEwiWCIsIDAsIDEgfSwKKyAgICAgIC8vIFNpbmdsZSB0ZXh0IGNoYXJhY3RlciBpcyAxIGNvbnNlY3V0aXZlIHRleHQgY2hhcmFjdGVycy4KKyAgICAgIHtMIlgiLCAwLCAxfSwKIAotICAgIC8vIFRyYWlsaW5nIG51bWJlcnMgY291bnQgYXMgdGV4dCBjaGFyYWN0ZXJzLgotICAgIHsgTCJYMTIzIiwgMCwgNCB9LAorICAgICAgLy8gVHJhaWxpbmcgbnVtYmVycyBjb3VudCBhcyB0ZXh0IGNoYXJhY3RlcnMuCisgICAgICB7TCJYMTIzIiwgMCwgNH0sCiAKLSAgICAvLyBMZWFkaW5nIG51bWJlcnMgY291bnQgYXMgdGV4dCBjaGFyYWN0ZXJzLgotICAgIHsgTCIxMjNYIiwgMCwgNCB9LAorICAgICAgLy8gTGVhZGluZyBudW1iZXJzIGNvdW50IGFzIHRleHQgY2hhcmFjdGVycy4KKyAgICAgIHtMIjEyM1giLCAwLCA0fSwKIAotICAgIC8vIEVtYmVkZGVkIGxvLXZhbHVlIGJpbmFyeSBjaGFyYWN0ZXJzIHRlcm1pbmF0ZSB0ZXh0IHJ1bnMuCi0gICAgeyBMIkFCQ1x4MDAwMVhYWFgiLCAwLCAzIH0sCisgICAgICAvLyBFbWJlZGRlZCBsby12YWx1ZSBiaW5hcnkgY2hhcmFjdGVycyB0ZXJtaW5hdGUgdGV4dCBydW5zLgorICAgICAge0wiQUJDXHgwMDAxWFhYWCIsIDAsIDN9LAogCi0gICAgLy8gRW1iZWRkZWQgaGktdmFsdWUgYmluYXJ5IGNoYXJhY3RlcnMgdGVybWluYXRlIHRleHQgcnVucy4KLSAgICB7IEwiQUJDXHgwMTAwWFhYWCIsIDAsIDMgfSwKKyAgICAgIC8vIEVtYmVkZGVkIGhpLXZhbHVlIGJpbmFyeSBjaGFyYWN0ZXJzIHRlcm1pbmF0ZSB0ZXh0IHJ1bnMuCisgICAgICB7TCJBQkNceDAxMDBYWFhYIiwgMCwgM30sCiAKLSAgICAvLyBUZXh0IHJ1biBzdGlsbCBmb3VuZCBhZnRlciBpbmRleGluZyBwYXN0IGxvLXZhbHVlIGNoYXJhY3Rlci4KLSAgICB7IEwiQUJDXHgwMDAxWFhYWCIsIDQsIDQgfSwKKyAgICAgIC8vIFRleHQgcnVuIHN0aWxsIGZvdW5kIGFmdGVyIGluZGV4aW5nIHBhc3QgbG8tdmFsdWUgY2hhcmFjdGVyLgorICAgICAge0wiQUJDXHgwMDAxWFhYWCIsIDQsIDR9LAogCi0gICAgLy8gVGV4dCBydW4gc3RpbGwgZm91bmQgYWZ0ZXIgaW5kZXhpbmcgcGFzdCBoaS12YWx1ZSBjaGFyYWN0ZXIuCi0gICAgeyBMIkFCQ1x4MDEwMFhYWFgiLCA0LCA0IH0sCisgICAgICAvLyBUZXh0IHJ1biBzdGlsbCBmb3VuZCBhZnRlciBpbmRleGluZyBwYXN0IGhpLXZhbHVlIGNoYXJhY3Rlci4KKyAgICAgIHtMIkFCQ1x4MDEwMFhYWFgiLCA0LCA0fSwKIAotICAgIC8vIExlYWRpbmcgaGktdmFsdWUgY2hhcmFjdGVyIHJlc3VsdHMgaW4gMCBjb25zZWN1dGl2ZSBjaGFyYWN0ZXJzLgotICAgIHsgTCJceDAxMDBYWFgiLCAwLCAwIH0sCisgICAgICAvLyBMZWFkaW5nIGhpLXZhbHVlIGNoYXJhY3RlciByZXN1bHRzIGluIDAgY29uc2VjdXRpdmUgY2hhcmFjdGVycy4KKyAgICAgIHtMIlx4MDEwMFhYWCIsIDAsIDB9LAogCi0gICAgLy8gVXAgdG8gMTIgbnVtYmVycyBjb3VudCBhcyB0ZXh0LgotICAgIHsgTCIxMjM0NTY3ODkwMTIiLCAwLCAxMiB9LAorICAgICAgLy8gVXAgdG8gMTIgbnVtYmVycyBjb3VudCBhcyB0ZXh0LgorICAgICAge0wiMTIzNDU2Nzg5MDEyIiwgMCwgMTJ9LAogCi0gICAgLy8gMTMgb3IgbW9yZSBudW1iZXJzIGFyZSBjb21wcmVzc3NlZCB1c2luZyBudW1lcmljIGNvbXByZXNzaW9uLCBub3QgdGV4dC4KLSAgICB7IEwiMTIzNDU2Nzg5MDEyMyIsIDAsIDAgfSwKKyAgICAgIC8vIDEzIG9yIG1vcmUgbnVtYmVycyBhcmUgY29tcHJlc3NzZWQgdXNpbmcgbnVtZXJpYyBjb21wcmVzc2lvbiwgbm90IHRleHQuCisgICAgICB7TCIxMjM0NTY3ODkwMTIzIiwgMCwgMH0sCiAKLSAgICAvLyBMZWFkaW5nIFRleHQgY2hhcmFjdGVyIGRvZXNuJ3QgYWZmZWN0IHRoZSAxMiBjaGFyYWN0ZXIgY2FzZS4KLSAgICB7IEwiWDEyMzQ1Njc4OTAxMiIsIDAsIDEzIH0sCisgICAgICAvLyBMZWFkaW5nIFRleHQgY2hhcmFjdGVyIGRvZXNuJ3QgYWZmZWN0IHRoZSAxMiBjaGFyYWN0ZXIgY2FzZS4KKyAgICAgIHtMIlgxMjM0NTY3ODkwMTIiLCAwLCAxM30sCiAKLSAgICAvLyBMZWFkaW5nIFRleHQgY2hhcmFjdGVyIGRvZXNuJ3QgYWZmZWN0IHRoZSAxMyBjaGFyYWN0ZXIgY2FzZS4KLSAgICB7IEwiWDEyMzQ1Njc4OTAxMjMiLCAwLCAxIH0sCisgICAgICAvLyBMZWFkaW5nIFRleHQgY2hhcmFjdGVyIGRvZXNuJ3QgYWZmZWN0IHRoZSAxMyBjaGFyYWN0ZXIgY2FzZS4KKyAgICAgIHtMIlgxMjM0NTY3ODkwMTIzIiwgMCwgMX0sCiAKLSAgICAvLyBKdW1waW5nIGJldHdlZW4gbnVtYmVycyBhbmQgbGV0dGVycyB3b3JrcyBwcm9wZXJseS4KLSAgICB7IEwiWFhYMTIxWFhYMTIzNDU2Nzg5MDEyMzQiLCAwLCA5IH0sCisgICAgICAvLyBKdW1waW5nIGJldHdlZW4gbnVtYmVycyBhbmQgbGV0dGVycyB3b3JrcyBwcm9wZXJseS4KKyAgICAgIHtMIlhYWDEyMVhYWDEyMzQ1Njc4OTAxMjM0IiwgMCwgOX0sCiAgIH07CiAKICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKTsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoY29uc2VjdXRpdmVfdGV4dF9jYXNlcyk7ICsraSkgewogICAgIENvbnNlY3V0aXZlVGV4dENhc2UqIHB0ciA9ICZjb25zZWN1dGl2ZV90ZXh0X2Nhc2VzW2ldOwogICAgIENGWF9XaWRlU3RyaW5nIGlucHV0KHB0ci0+aW5wdXQpOwotICAgIGludCBhY3R1YWxfY291bnQgPSBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVUZXh0Q291bnQoaW5wdXQsIHB0ci0+b2Zmc2V0KTsKKyAgICBpbnQgYWN0dWFsX2NvdW50ID0KKyAgICAgICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlVGV4dENvdW50KGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5vZmZzZXQpOwogICAgIEVYUEVDVF9FUShwdHItPmV4cGVjdGVkX2NvdW50LCBhY3R1YWxfY291bnQpIDw8ICIgZm9yIGNhc2UgbnVtYmVyICIgPDwgaTsKICAgfQogICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6RmluYWxpemUoKTsKIH0KIAotVEVTVChQREY0MTdIaWdoTGV2ZWxFbmNvZGVyLCBDb25zZWN1dGl2ZUJpbmFyeUNvdW50KSB7Ci0KLX0KK1RFU1QoUERGNDE3SGlnaExldmVsRW5jb2RlciwgQ29uc2VjdXRpdmVCaW5hcnlDb3VudCkge30KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1JlYWRlci5jcHAKaW5kZXggYTg4MDMxNy4uZjk3MGQ3MCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1JlYWRlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1JlYWRlci5jcHAKQEAgLTUwLDcwICs1MCw5OCBAQAogI2luY2x1ZGUgIkJDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyLmgiDQogI2luY2x1ZGUgIkJDX1BERjQxN1JlYWRlci5oIg0KLSNkZWZpbmUgICAgSW50ZWdlcl9NQVhfVkFMVUUgICAyMTQ3NDgzNjQ3DQotQ0JDX1BERjQxN1JlYWRlcjo6Q0JDX1BERjQxN1JlYWRlcigpDQotew0KKyNkZWZpbmUgSW50ZWdlcl9NQVhfVkFMVUUgMjE0NzQ4MzY0Nw0KK0NCQ19QREY0MTdSZWFkZXI6OkNCQ19QREY0MTdSZWFkZXIoKSB7fQ0KK0NCQ19QREY0MTdSZWFkZXI6On5DQkNfUERGNDE3UmVhZGVyKCkge30NCitDRlhfQnl0ZVN0cmluZyBDQkNfUERGNDE3UmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsIGludDMyX3QmIGUpIHsNCisgIHJldHVybiBEZWNvZGUoaW1hZ2UsIDAsIGUpOw0KIH0NCi1DQkNfUERGNDE3UmVhZGVyOjp+Q0JDX1BERjQxN1JlYWRlcigpDQotew0KLX0NCi1DRlhfQnl0ZVN0cmluZyBDQkNfUERGNDE3UmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIGludDMyX3QgJmUpDQotew0KLSAgICByZXR1cm4gRGVjb2RlKGltYWdlLCAwLCBlKTsNCi19DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX1BERjQxN1JlYWRlcjo6RGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBGWF9CT09MIG11bHRpcGxlLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0czsNCi0gICAgQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0KiBkZXRlY3RvclJlc3VsdCA9IENCQ19EZXRlY3Rvcjo6ZGV0ZWN0KGltYWdlLCBoaW50cywgbXVsdGlwbGUsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkZXRlY3RvclJlc3VsdC0+Z2V0UG9pbnRzKCktPkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICBDRlhfUHRyQXJyYXkqIHBvaW50cyA9IChDRlhfUHRyQXJyYXkqKWRldGVjdG9yUmVzdWx0LT5nZXRQb2ludHMoKS0+R2V0QXQoaSk7DQotICAgICAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogUmVzdWx0VGVtcCA9IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmRlY29kZShkZXRlY3RvclJlc3VsdC0+Z2V0Qml0cygpLCAoQ0JDX1Jlc3VsdFBvaW50Kilwb2ludHMtPkdldEF0KDQpLCAoQ0JDX1Jlc3VsdFBvaW50Kilwb2ludHMtPkdldEF0KDUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50Kilwb2ludHMtPkdldEF0KDYpLCAoQ0JDX1Jlc3VsdFBvaW50Kilwb2ludHMtPkdldEF0KDcpLCBnZXRNaW5Db2Rld29yZFdpZHRoKCpwb2ludHMpLCBnZXRNYXhDb2Rld29yZFdpZHRoKCpwb2ludHMpLCBlKTsNCi0gICAgICAgIGlmIChSZXN1bHRUZW1wID09IE5VTEwpIHsNCi0gICAgICAgICAgICBkZWxldGUgZGV0ZWN0b3JSZXN1bHQ7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9udE5vdEZvdW5kSW5zdGFuY2U7DQotICAgICAgICAgICAgcmV0dXJuICIiOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmVzdWx0cyArPSBSZXN1bHRUZW1wLT5HZXRUZXh0KCk7DQotICAgICAgICBkZWxldGUgUmVzdWx0VGVtcDsNCitDRlhfQnl0ZVN0cmluZyBDQkNfUERGNDE3UmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdHM7DQorICBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQqIGRldGVjdG9yUmVzdWx0ID0NCisgICAgICBDQkNfRGV0ZWN0b3I6OmRldGVjdChpbWFnZSwgaGludHMsIG11bHRpcGxlLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkZXRlY3RvclJlc3VsdC0+Z2V0UG9pbnRzKCktPkdldFNpemUoKTsgaSsrKSB7DQorICAgIENGWF9QdHJBcnJheSogcG9pbnRzID0gKENGWF9QdHJBcnJheSopZGV0ZWN0b3JSZXN1bHQtPmdldFBvaW50cygpLT5HZXRBdChpKTsNCisgICAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIFJlc3VsdFRlbXAgPSBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpkZWNvZGUoDQorICAgICAgICBkZXRlY3RvclJlc3VsdC0+Z2V0Qml0cygpLCAoQ0JDX1Jlc3VsdFBvaW50Kilwb2ludHMtPkdldEF0KDQpLA0KKyAgICAgICAgKENCQ19SZXN1bHRQb2ludCopcG9pbnRzLT5HZXRBdCg1KSwgKENCQ19SZXN1bHRQb2ludCopcG9pbnRzLT5HZXRBdCg2KSwNCisgICAgICAgIChDQkNfUmVzdWx0UG9pbnQqKXBvaW50cy0+R2V0QXQoNyksIGdldE1pbkNvZGV3b3JkV2lkdGgoKnBvaW50cyksDQorICAgICAgICBnZXRNYXhDb2Rld29yZFdpZHRoKCpwb2ludHMpLCBlKTsNCisgICAgaWYgKFJlc3VsdFRlbXAgPT0gTlVMTCkgew0KKyAgICAgIGRlbGV0ZSBkZXRlY3RvclJlc3VsdDsNCisgICAgICBlID0gQkNFeGNlcHRpb250Tm90Rm91bmRJbnN0YW5jZTsNCisgICAgICByZXR1cm4gIiI7DQogICAgIH0NCi0gICAgZGVsZXRlIGRldGVjdG9yUmVzdWx0Ow0KLSAgICByZXR1cm4gcmVzdWx0czsNCisgICAgcmVzdWx0cyArPSBSZXN1bHRUZW1wLT5HZXRUZXh0KCk7DQorICAgIGRlbGV0ZSBSZXN1bHRUZW1wOw0KKyAgfQ0KKyAgZGVsZXRlIGRldGVjdG9yUmVzdWx0Ow0KKyAgcmV0dXJuIHJlc3VsdHM7DQogfQ0KLUNGWF9CeXRlU3RyaW5nIENCQ19QREY0MTdSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9CeXRlU3RyaW5nIGJzID0gRGVjb2RlKGltYWdlLCBGQUxTRSwgMCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQotICAgIHJldHVybiBiczsNCitDRlhfQnl0ZVN0cmluZyBDQkNfUERGNDE3UmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIGJzID0gRGVjb2RlKGltYWdlLCBGQUxTRSwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgcmV0dXJuIGJzOw0KIH0NCi1pbnQzMl90IENCQ19QREY0MTdSZWFkZXI6OmdldE1heFdpZHRoKENCQ19SZXN1bHRQb2ludCogcDEsIENCQ19SZXN1bHRQb2ludCogcDIpDQotew0KLSAgICBpZiAocDEgPT0gTlVMTCB8fCBwMiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICByZXR1cm4gKGludDMyX3QpIEZYU1lTX2ZhYnMocDEtPkdldFgoKSAtIHAyLT5HZXRYKCkpOw0KK2ludDMyX3QgQ0JDX1BERjQxN1JlYWRlcjo6Z2V0TWF4V2lkdGgoQ0JDX1Jlc3VsdFBvaW50KiBwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogcDIpIHsNCisgIGlmIChwMSA9PSBOVUxMIHx8IHAyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gKGludDMyX3QpRlhTWVNfZmFicyhwMS0+R2V0WCgpIC0gcDItPkdldFgoKSk7DQogfQ0KLWludDMyX3QgQ0JDX1BERjQxN1JlYWRlcjo6Z2V0TWluV2lkdGgoQ0JDX1Jlc3VsdFBvaW50KiBwMSwgQ0JDX1Jlc3VsdFBvaW50KiBwMikNCi17DQotICAgIGlmIChwMSA9PSBOVUxMIHx8IHAyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBJbnRlZ2VyX01BWF9WQUxVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gKGludDMyX3QpIEZYU1lTX2ZhYnMocDEtPkdldFgoKSAtIHAyLT5HZXRYKCkpOw0KK2ludDMyX3QgQ0JDX1BERjQxN1JlYWRlcjo6Z2V0TWluV2lkdGgoQ0JDX1Jlc3VsdFBvaW50KiBwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogcDIpIHsNCisgIGlmIChwMSA9PSBOVUxMIHx8IHAyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEludGVnZXJfTUFYX1ZBTFVFOw0KKyAgfQ0KKyAgcmV0dXJuIChpbnQzMl90KUZYU1lTX2ZhYnMocDEtPkdldFgoKSAtIHAyLT5HZXRYKCkpOw0KIH0NCi1pbnQzMl90IENCQ19QREY0MTdSZWFkZXI6OmdldE1heENvZGV3b3JkV2lkdGgoQ0ZYX1B0ckFycmF5JiBwKQ0KLXsNCi0gICAgaW50MzJfdCBhID0gZ2V0TWF4V2lkdGgoKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg2KSwgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCgyKSkgKiBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEIC8gQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9TVE9QX1BBVFRFUk47DQotICAgIGludDMyX3QgYiA9IGdldE1heFdpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNyksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMykpICogQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRCAvIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fU1RPUF9QQVRURVJOOw0KLSAgICBpbnQzMl90IGMgPSBnZXRNYXhXaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDApLCAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDQpKSA8IGEgPyBnZXRNYXhXaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDApLCAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDQpKSA6IGE7DQotICAgIGludDMyX3QgZCA9IGdldE1heFdpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNSkpIDwgYiA/IGdldE1heFdpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNSkpIDogYjsNCi0gICAgcmV0dXJuIGMgPCBkID8gYyA6IGQ7DQoraW50MzJfdCBDQkNfUERGNDE3UmVhZGVyOjpnZXRNYXhDb2Rld29yZFdpZHRoKENGWF9QdHJBcnJheSYgcCkgew0KKyAgaW50MzJfdCBhID0NCisgICAgICBnZXRNYXhXaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDYpLCAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDIpKSAqDQorICAgICAgQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRCAvDQorICAgICAgQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9TVE9QX1BBVFRFUk47DQorICBpbnQzMl90IGIgPQ0KKyAgICAgIGdldE1heFdpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNyksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMykpICoNCisgICAgICBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEIC8NCisgICAgICBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX1NUT1BfUEFUVEVSTjsNCisgIGludDMyX3QgYyA9IGdldE1heFdpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDQpKSA8IGENCisgICAgICAgICAgICAgICAgICA/IGdldE1heFdpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDQpKQ0KKyAgICAgICAgICAgICAgICAgIDogYTsNCisgIGludDMyX3QgZCA9IGdldE1heFdpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDUpKSA8IGINCisgICAgICAgICAgICAgICAgICA/IGdldE1heFdpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDUpKQ0KKyAgICAgICAgICAgICAgICAgIDogYjsNCisgIHJldHVybiBjIDwgZCA/IGMgOiBkOw0KIH0NCi1pbnQzMl90IENCQ19QREY0MTdSZWFkZXI6OmdldE1pbkNvZGV3b3JkV2lkdGgoQ0ZYX1B0ckFycmF5JiBwKQ0KLXsNCi0gICAgaW50MzJfdCBhID0gZ2V0TWluV2lkdGgoKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg2KSwgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCgyKSkgKiBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEIC8gQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9TVE9QX1BBVFRFUk47DQotICAgIGludDMyX3QgYiA9IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNyksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMykpICogQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRCAvIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fU1RPUF9QQVRURVJOOw0KLSAgICBpbnQzMl90IGMgPSBnZXRNaW5XaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDApLCAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDQpKSA8IGEgPyBnZXRNaW5XaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDApLCAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDQpKSA6IGE7DQotICAgIGludDMyX3QgZCA9IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNSkpIDwgYiA/IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNSkpIDogYjsNCi0gICAgcmV0dXJuIGMgPCBkID8gYyA6IGQ7DQoraW50MzJfdCBDQkNfUERGNDE3UmVhZGVyOjpnZXRNaW5Db2Rld29yZFdpZHRoKENGWF9QdHJBcnJheSYgcCkgew0KKyAgaW50MzJfdCBhID0NCisgICAgICBnZXRNaW5XaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDYpLCAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDIpKSAqDQorICAgICAgQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRCAvDQorICAgICAgQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9TVE9QX1BBVFRFUk47DQorICBpbnQzMl90IGIgPQ0KKyAgICAgIGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNyksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMykpICoNCisgICAgICBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEIC8NCisgICAgICBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX1NUT1BfUEFUVEVSTjsNCisgIGludDMyX3QgYyA9IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDQpKSA8IGENCisgICAgICAgICAgICAgICAgICA/IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDQpKQ0KKyAgICAgICAgICAgICAgICAgIDogYTsNCisgIGludDMyX3QgZCA9IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDUpKSA8IGINCisgICAgICAgICAgICAgICAgICA/IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDUpKQ0KKyAgICAgICAgICAgICAgICAgIDogYjsNCisgIHJldHVybiBjIDwgZCA/IGMgOiBkOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVhZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVhZGVyLmgKaW5kZXggMDMxODI5ZC4uMDk5YjkzNSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1JlYWRlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZWFkZXIuaApAQCAtOSwxOCArOSwyMSBAQAogY2xhc3MgQ0JDX0JpbmFyeUJpdG1hcDsNCiBjbGFzcyBDQkNfUmVzdWx0UG9pbnQ7DQogY2xhc3MgQ0JDX1BERjQxN1JlYWRlcjsNCi1jbGFzcyBDQkNfUERGNDE3UmVhZGVyIDogcHVibGljIENCQ19SZWFkZXINCi17DQotcHVibGljOg0KLSAgICBDQkNfUERGNDE3UmVhZGVyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19QREY0MTdSZWFkZXIoKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBpbnQzMl90ICZlKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBGWF9CT09MIG11bHRpcGxlLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKTsNCi1wcml2YXRlOg0KLSAgICBzdGF0aWMgaW50MzJfdCBnZXRNYXhXaWR0aChDQkNfUmVzdWx0UG9pbnQqIHAxLCBDQkNfUmVzdWx0UG9pbnQqIHAyKTsNCi0gICAgc3RhdGljIGludDMyX3QgZ2V0TWluV2lkdGgoQ0JDX1Jlc3VsdFBvaW50KiBwMSwgQ0JDX1Jlc3VsdFBvaW50KiBwMik7DQotICAgIHN0YXRpYyBpbnQzMl90IGdldE1heENvZGV3b3JkV2lkdGgoQ0ZYX1B0ckFycmF5JiBwKTsNCi0gICAgc3RhdGljIGludDMyX3QgZ2V0TWluQ29kZXdvcmRXaWR0aChDRlhfUHRyQXJyYXkmIHApOw0KK2NsYXNzIENCQ19QREY0MTdSZWFkZXIgOiBwdWJsaWMgQ0JDX1JlYWRlciB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdSZWFkZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdSZWFkZXIoKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgaW50MzJfdCYgZSk7DQorICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBtdWx0aXBsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBpbnQzMl90IGdldE1heFdpZHRoKENCQ19SZXN1bHRQb2ludCogcDEsIENCQ19SZXN1bHRQb2ludCogcDIpOw0KKyAgc3RhdGljIGludDMyX3QgZ2V0TWluV2lkdGgoQ0JDX1Jlc3VsdFBvaW50KiBwMSwgQ0JDX1Jlc3VsdFBvaW50KiBwMik7DQorICBzdGF0aWMgaW50MzJfdCBnZXRNYXhDb2Rld29yZFdpZHRoKENGWF9QdHJBcnJheSYgcCk7DQorICBzdGF0aWMgaW50MzJfdCBnZXRNaW5Db2Rld29yZFdpZHRoKENGWF9QdHJBcnJheSYgcCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhLmNwcAppbmRleCBkOTljZWZkLi4yY2Q1YjI1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5jcHAKQEAgLTIyLDQxICsyMiwyOSBAQAogDQogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuaCINCi1DQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6OkNCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSgpDQotew0KK0NCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6Q0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKCkge30NCitDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6On5DQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEoKSB7fQ0KK2ludDMyX3QgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOjpnZXRTZWdtZW50SW5kZXgoKSB7DQorICByZXR1cm4gbV9zZWdtZW50SW5kZXg7DQogfQ0KLUNCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6fkNCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSgpDQotew0KK3ZvaWQgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOjpzZXRTZWdtZW50SW5kZXgoaW50MzJfdCBzZWdtZW50SW5kZXgpIHsNCisgIG1fc2VnbWVudEluZGV4ID0gc2VnbWVudEluZGV4Ow0KIH0NCi1pbnQzMl90IENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6Z2V0U2VnbWVudEluZGV4KCkNCi17DQotICAgIHJldHVybiBtX3NlZ21lbnRJbmRleDsNCitDRlhfQnl0ZVN0cmluZyBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6OmdldEZpbGVJZCgpIHsNCisgIHJldHVybiBtX2ZpbGVJZDsNCiB9DQotdm9pZCBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6OnNldFNlZ21lbnRJbmRleChpbnQzMl90IHNlZ21lbnRJbmRleCkNCi17DQotICAgIG1fc2VnbWVudEluZGV4ID0gc2VnbWVudEluZGV4Ow0KK3ZvaWQgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOjpzZXRGaWxlSWQoQ0ZYX0J5dGVTdHJpbmcgZmlsZUlkKSB7DQorICBtX2ZpbGVJZCA9IGZpbGVJZDsNCiB9DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOjpnZXRGaWxlSWQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fZmlsZUlkOw0KK0NGWF9JbnQzMkFycmF5JiBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6OmdldE9wdGlvbmFsRGF0YSgpIHsNCisgIHJldHVybiBtX29wdGlvbmFsRGF0YTsNCiB9DQotdm9pZCBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6OnNldEZpbGVJZChDRlhfQnl0ZVN0cmluZyBmaWxlSWQpDQotew0KLSAgICBtX2ZpbGVJZCA9IGZpbGVJZDsNCit2b2lkIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6c2V0T3B0aW9uYWxEYXRhKENGWF9JbnQzMkFycmF5JiBvcHRpb25hbERhdGEpIHsNCisgIG1fb3B0aW9uYWxEYXRhLkNvcHkob3B0aW9uYWxEYXRhKTsNCiB9DQotQ0ZYX0ludDMyQXJyYXkmIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6Z2V0T3B0aW9uYWxEYXRhKCkNCi17DQotICAgIHJldHVybiBtX29wdGlvbmFsRGF0YTsNCitGWF9CT09MIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6aXNMYXN0U2VnbWVudCgpIHsNCisgIHJldHVybiBtX2xhc3RTZWdtZW50Ow0KIH0NCi12b2lkIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6c2V0T3B0aW9uYWxEYXRhKENGWF9JbnQzMkFycmF5ICZvcHRpb25hbERhdGEpDQotew0KLSAgICBtX29wdGlvbmFsRGF0YS5Db3B5KG9wdGlvbmFsRGF0YSk7DQotfQ0KLUZYX0JPT0wgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOjppc0xhc3RTZWdtZW50KCkNCi17DQotICAgIHJldHVybiBtX2xhc3RTZWdtZW50Ow0KLX0NCi12b2lkIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6c2V0TGFzdFNlZ21lbnQoRlhfQk9PTCBsYXN0U2VnbWVudCkNCi17DQotICAgIG1fbGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudDsNCit2b2lkIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6c2V0TGFzdFNlZ21lbnQoRlhfQk9PTCBsYXN0U2VnbWVudCkgew0KKyAgbV9sYXN0U2VnbWVudCA9IGxhc3RTZWdtZW50Ow0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oCmluZGV4IGQ2MzUxMzcuLmEzNDUzMDYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oCkBAIC02LDIzICs2LDIzIEBACiANCiAjaWZuZGVmIF9CQ19QREY0MTdSRUFERVJfSF8NCiAjZGVmaW5lIF9CQ19QREY0MTdSRUFERVJfSF8NCi1jbGFzcyBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGENCi17DQotcHVibGljOg0KLSAgICBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEoKTsNCi0gICAgdmlydHVhbCB+Q0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKCk7DQotICAgIGludDMyX3QgZ2V0U2VnbWVudEluZGV4KCk7DQotICAgIHZvaWQgc2V0U2VnbWVudEluZGV4KGludDMyX3Qgc2VnbWVudEluZGV4KTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgZ2V0RmlsZUlkKCk7DQotICAgIHZvaWQgc2V0RmlsZUlkKENGWF9CeXRlU3RyaW5nIGZpbGVJZCk7DQotICAgIENGWF9JbnQzMkFycmF5JiBnZXRPcHRpb25hbERhdGEoKTsNCi0gICAgdm9pZCBzZXRPcHRpb25hbERhdGEoQ0ZYX0ludDMyQXJyYXkgJm9wdGlvbmFsRGF0YSk7DQotICAgIEZYX0JPT0wgaXNMYXN0U2VnbWVudCgpOw0KLSAgICB2b2lkIHNldExhc3RTZWdtZW50KEZYX0JPT0wgbGFzdFNlZ21lbnQpOw0KLXByaXZhdGU6DQotICAgIGludDMyX3QgbV9zZWdtZW50SW5kZXg7DQotICAgIENGWF9CeXRlU3RyaW5nIG1fZmlsZUlkOw0KLSAgICBDRlhfSW50MzJBcnJheSBtX29wdGlvbmFsRGF0YTsNCi0gICAgRlhfQk9PTCBtX2xhc3RTZWdtZW50Ow0KK2NsYXNzIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSgpOw0KKyAgdmlydHVhbCB+Q0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKCk7DQorICBpbnQzMl90IGdldFNlZ21lbnRJbmRleCgpOw0KKyAgdm9pZCBzZXRTZWdtZW50SW5kZXgoaW50MzJfdCBzZWdtZW50SW5kZXgpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgZ2V0RmlsZUlkKCk7DQorICB2b2lkIHNldEZpbGVJZChDRlhfQnl0ZVN0cmluZyBmaWxlSWQpOw0KKyAgQ0ZYX0ludDMyQXJyYXkmIGdldE9wdGlvbmFsRGF0YSgpOw0KKyAgdm9pZCBzZXRPcHRpb25hbERhdGEoQ0ZYX0ludDMyQXJyYXkmIG9wdGlvbmFsRGF0YSk7DQorICBGWF9CT09MIGlzTGFzdFNlZ21lbnQoKTsNCisgIHZvaWQgc2V0TGFzdFNlZ21lbnQoRlhfQk9PTCBsYXN0U2VnbWVudCk7DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fc2VnbWVudEluZGV4Ow0KKyAgQ0ZYX0J5dGVTdHJpbmcgbV9maWxlSWQ7DQorICBDRlhfSW50MzJBcnJheSBtX29wdGlvbmFsRGF0YTsNCisgIEZYX0JPT0wgbV9sYXN0U2VnbWVudDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdTY2FubmluZ0RlY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5jcHAKaW5kZXggZGU0M2U2NS4uNzgxZmRiOCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5jcHAKQEAgLTQ0LDU1MyArNDQsNzA5IEBACiBpbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6Ok1BWF9FUlJPUlMgPSAzOw0KIGludDMyX3QgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6TUFYX0VDX0NPREVXT1JEUyA9IDUxMjsNCiBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24qIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmVycm9yQ29ycmVjdGlvbiA9IE5VTEw7DQotQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Q0JDX1BERjQxN1NjYW5uaW5nRGVjb2RlcigpDQotew0KK0NCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OkNCQ19QREY0MTdTY2FubmluZ0RlY29kZXIoKSB7fQ0KK0NCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6On5DQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyKCkge30NCit2b2lkIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OkluaXRpYWxpemUoKSB7DQorICBlcnJvckNvcnJlY3Rpb24gPSBGWF9ORVcgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOw0KIH0NCi1DQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjp+Q0JDX1BERjQxN1NjYW5uaW5nRGVjb2RlcigpDQotew0KK3ZvaWQgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6RmluYWxpemUoKSB7DQorICBkZWxldGUgZXJyb3JDb3JyZWN0aW9uOw0KIH0NCi12b2lkIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgZXJyb3JDb3JyZWN0aW9uID0gRlhfTkVXIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjsNCi19DQotdm9pZCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpGaW5hbGl6ZSgpDQotew0KLSAgICBkZWxldGUgZXJyb3JDb3JyZWN0aW9uOw0KLX0NCi1DQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6ZGVjb2RlKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLCBDQkNfUmVzdWx0UG9pbnQqIGltYWdlVG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBpbWFnZUJvdHRvbUxlZnQsIENCQ19SZXN1bHRQb2ludCogaW1hZ2VUb3BSaWdodCwNCi0gICAgICAgIENCQ19SZXN1bHRQb2ludCogaW1hZ2VCb3R0b21SaWdodCwgaW50MzJfdCBtaW5Db2Rld29yZFdpZHRoLCBpbnQzMl90IG1heENvZGV3b3JkV2lkdGgsIGludDMyX3QgJmUpDQotew0KLSAgICBDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94ID0gRlhfTkVXIENCQ19Cb3VuZGluZ0JveChpbWFnZSwgaW1hZ2VUb3BMZWZ0LCBpbWFnZUJvdHRvbUxlZnQsIGltYWdlVG9wUmlnaHQsIGltYWdlQm90dG9tUmlnaHQsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4gPSBOVUxMOw0KLSAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByaWdodFJvd0luZGljYXRvckNvbHVtbiA9IE5VTEw7DQotICAgIENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCA9IE5VTEw7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykgew0KLSAgICAgICAgaWYgKGltYWdlVG9wTGVmdCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgbGVmdFJvd0luZGljYXRvckNvbHVtbiA9IGdldFJvd0luZGljYXRvckNvbHVtbihpbWFnZSwgYm91bmRpbmdCb3gsICppbWFnZVRvcExlZnQsIFRSVUUsIG1pbkNvZGV3b3JkV2lkdGgsIG1heENvZGV3b3JkV2lkdGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGltYWdlVG9wUmlnaHQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uID0gZ2V0Um93SW5kaWNhdG9yQ29sdW1uKGltYWdlLCBib3VuZGluZ0JveCwgKmltYWdlVG9wUmlnaHQsIEZBTFNFLCBtaW5Db2Rld29yZFdpZHRoLCBtYXhDb2Rld29yZFdpZHRoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRldGVjdGlvblJlc3VsdCA9IG1lcmdlKGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4sIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uLCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb250Tm90Rm91bmRJbnN0YW5jZTsNCi0gICAgICAgICAgICBkZWxldGUgbGVmdFJvd0luZGljYXRvckNvbHVtbjsNCi0gICAgICAgICAgICBkZWxldGUgcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW47DQotICAgICAgICAgICAgZGVsZXRlIGJvdW5kaW5nQm94Ow0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGkgPT0gMCAmJiAoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCb3VuZGluZ0JveCgpLT5nZXRNaW5ZKCkgPCBib3VuZGluZ0JveC0+Z2V0TWluWSgpIHx8IGRldGVjdGlvblJlc3VsdC0+Z2V0Qm91bmRpbmdCb3goKS0+Z2V0TWF4WSgpID4gYm91bmRpbmdCb3gtPmdldE1heFkoKSkpIHsNCi0gICAgICAgICAgICBkZWxldGUgYm91bmRpbmdCb3g7DQotICAgICAgICAgICAgYm91bmRpbmdCb3ggPSBkZXRlY3Rpb25SZXN1bHQtPmdldEJvdW5kaW5nQm94KCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGRldGVjdGlvblJlc3VsdC0+c2V0Qm91bmRpbmdCb3goYm91bmRpbmdCb3gpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpkZWNvZGUoDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIGltYWdlVG9wTGVmdCwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBpbWFnZUJvdHRvbUxlZnQsDQorICAgIENCQ19SZXN1bHRQb2ludCogaW1hZ2VUb3BSaWdodCwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBpbWFnZUJvdHRvbVJpZ2h0LA0KKyAgICBpbnQzMl90IG1pbkNvZGV3b3JkV2lkdGgsDQorICAgIGludDMyX3QgbWF4Q29kZXdvcmRXaWR0aCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9IEZYX05FVyBDQkNfQm91bmRpbmdCb3goDQorICAgICAgaW1hZ2UsIGltYWdlVG9wTGVmdCwgaW1hZ2VCb3R0b21MZWZ0LCBpbWFnZVRvcFJpZ2h0LCBpbWFnZUJvdHRvbVJpZ2h0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4gPSBOVUxMOw0KKyAgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4gPSBOVUxMOw0KKyAgQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0ID0gTlVMTDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykgew0KKyAgICBpZiAoaW1hZ2VUb3BMZWZ0ICE9IE5VTEwpIHsNCisgICAgICBsZWZ0Um93SW5kaWNhdG9yQ29sdW1uID0NCisgICAgICAgICAgZ2V0Um93SW5kaWNhdG9yQ29sdW1uKGltYWdlLCBib3VuZGluZ0JveCwgKmltYWdlVG9wTGVmdCwgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkNvZGV3b3JkV2lkdGgsIG1heENvZGV3b3JkV2lkdGgpOw0KICAgICB9DQotICAgIGludDMyX3QgbWF4QmFyY29kZUNvbHVtbiA9IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCkgKyAxOw0KLSAgICBkZXRlY3Rpb25SZXN1bHQtPnNldERldGVjdGlvblJlc3VsdENvbHVtbigwLCBsZWZ0Um93SW5kaWNhdG9yQ29sdW1uKTsNCi0gICAgZGV0ZWN0aW9uUmVzdWx0LT5zZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4obWF4QmFyY29kZUNvbHVtbiwgcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4pOw0KLSAgICBGWF9CT09MIGxlZnRUb1JpZ2h0ID0gbGVmdFJvd0luZGljYXRvckNvbHVtbiAhPSBOVUxMOw0KLSAgICBmb3IgKGludDMyX3QgYmFyY29kZUNvbHVtbkNvdW50ID0gMTsgYmFyY29kZUNvbHVtbkNvdW50IDw9IG1heEJhcmNvZGVDb2x1bW47IGJhcmNvZGVDb2x1bW5Db3VudCsrKSB7DQotICAgICAgICBpbnQzMl90IGJhcmNvZGVDb2x1bW4gPSBsZWZ0VG9SaWdodCA/IGJhcmNvZGVDb2x1bW5Db3VudCA6IG1heEJhcmNvZGVDb2x1bW4gLSBiYXJjb2RlQ29sdW1uQ291bnQ7DQotICAgICAgICBpZiAoZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oYmFyY29kZUNvbHVtbikgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiogZGV0ZWN0aW9uUmVzdWx0Q29sdW1uID0gTlVMTDsNCi0gICAgICAgIGlmIChiYXJjb2RlQ29sdW1uID09IDAgfHwgYmFyY29kZUNvbHVtbiA9PSBtYXhCYXJjb2RlQ29sdW1uKSB7DQotICAgICAgICAgICAgZGV0ZWN0aW9uUmVzdWx0Q29sdW1uID0gRlhfTkVXIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4oYm91bmRpbmdCb3gsIGJhcmNvZGVDb2x1bW4gPT0gMCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGRldGVjdGlvblJlc3VsdENvbHVtbiA9IEZYX05FVyBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJvdW5kaW5nQm94KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRldGVjdGlvblJlc3VsdC0+c2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJhcmNvZGVDb2x1bW4sIGRldGVjdGlvblJlc3VsdENvbHVtbik7DQotICAgICAgICBpbnQzMl90IHN0YXJ0Q29sdW1uID0gLTE7DQotICAgICAgICBpbnQzMl90IHByZXZpb3VzU3RhcnRDb2x1bW4gPSBzdGFydENvbHVtbjsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpbWFnZVJvdyA9IGJvdW5kaW5nQm94LT5nZXRNaW5ZKCk7IGltYWdlUm93IDw9IGJvdW5kaW5nQm94LT5nZXRNYXhZKCk7IGltYWdlUm93KyspIHsNCi0gICAgICAgICAgICBzdGFydENvbHVtbiA9IGdldFN0YXJ0Q29sdW1uKGRldGVjdGlvblJlc3VsdCwgYmFyY29kZUNvbHVtbiwgaW1hZ2VSb3csIGxlZnRUb1JpZ2h0KTsNCi0gICAgICAgICAgICBpZiAoc3RhcnRDb2x1bW4gPCAwIHx8IHN0YXJ0Q29sdW1uID4gYm91bmRpbmdCb3gtPmdldE1heFgoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNTdGFydENvbHVtbiA9PSAtMSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgc3RhcnRDb2x1bW4gPSBwcmV2aW91c1N0YXJ0Q29sdW1uOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gZGV0ZWN0Q29kZXdvcmQoaW1hZ2UsIGJvdW5kaW5nQm94LT5nZXRNaW5YKCksIGJvdW5kaW5nQm94LT5nZXRNYXhYKCksIGxlZnRUb1JpZ2h0LCBzdGFydENvbHVtbiwgaW1hZ2VSb3csIG1pbkNvZGV3b3JkV2lkdGgsIG1heENvZGV3b3JkV2lkdGgpOw0KLSAgICAgICAgICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGRldGVjdGlvblJlc3VsdENvbHVtbi0+c2V0Q29kZXdvcmQoaW1hZ2VSb3csIGNvZGV3b3JkKTsNCi0gICAgICAgICAgICAgICAgcHJldmlvdXNTdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOw0KLSAgICAgICAgICAgICAgICBtaW5Db2Rld29yZFdpZHRoID0gbWluQ29kZXdvcmRXaWR0aCA8IGNvZGV3b3JkLT5nZXRXaWR0aCgpID8gbWluQ29kZXdvcmRXaWR0aCA6IGNvZGV3b3JkLT5nZXRXaWR0aCgpOw0KLSAgICAgICAgICAgICAgICBtYXhDb2Rld29yZFdpZHRoID0gbWF4Q29kZXdvcmRXaWR0aCA+IGNvZGV3b3JkLT5nZXRXaWR0aCgpID8gbWF4Q29kZXdvcmRXaWR0aCA6IGNvZGV3b3JkLT5nZXRXaWR0aCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgICAgaWYgKGltYWdlVG9wUmlnaHQgIT0gTlVMTCkgew0KKyAgICAgIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uID0NCisgICAgICAgICAgZ2V0Um93SW5kaWNhdG9yQ29sdW1uKGltYWdlLCBib3VuZGluZ0JveCwgKmltYWdlVG9wUmlnaHQsIEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluQ29kZXdvcmRXaWR0aCwgbWF4Q29kZXdvcmRXaWR0aCk7DQogICAgIH0NCi0gICAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIGRlY29kZXJyZXN1bHQgPSBjcmVhdGVEZWNvZGVyUmVzdWx0KGRldGVjdGlvblJlc3VsdCwgZSk7DQorICAgIGRldGVjdGlvblJlc3VsdCA9IG1lcmdlKGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4sIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uLCBlKTsNCiAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgZGVsZXRlIGRldGVjdGlvblJlc3VsdDsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbnROb3RGb3VuZEluc3RhbmNlOw0KKyAgICAgIGRlbGV0ZSBsZWZ0Um93SW5kaWNhdG9yQ29sdW1uOw0KKyAgICAgIGRlbGV0ZSByaWdodFJvd0luZGljYXRvckNvbHVtbjsNCisgICAgICBkZWxldGUgYm91bmRpbmdCb3g7DQorICAgICAgcmV0dXJuIE5VTEw7DQogICAgIH0NCi0gICAgcmV0dXJuIGRlY29kZXJyZXN1bHQ7DQotfQ0KLUNGWF9CeXRlU3RyaW5nIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OnRvU3RyaW5nKENGWF9QdHJBcnJheSogYmFyY29kZU1hdHJpeCkNCi17DQotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCi0gICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IGJhcmNvZGVNYXRyaXgtPkdldFNpemUoKTsgcm93KyspIHsNCi0gICAgICAgIHJlc3VsdCArPSByb3c7DQotICAgICAgICBpbnQzMl90IGwgPSAwOw0KLSAgICAgICAgZm9yICg7IGwgPCAoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQocm93KSktPkdldFNpemUoKTsgbCsrKSB7DQotICAgICAgICAgICAgQ0JDX0JhcmNvZGVWYWx1ZSogYmFyY29kZVZhbHVlID0gKENCQ19CYXJjb2RlVmFsdWUqKSgoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdChyb3cpKS0+R2V0QXQobCk7DQotICAgICAgICAgICAgaWYgKGJhcmNvZGVWYWx1ZS0+Z2V0VmFsdWUoKS0+R2V0U2l6ZSgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICAiIjsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gYmFyY29kZVZhbHVlLT5nZXRWYWx1ZSgpLT5HZXRBdCgwKTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGJhcmNvZGVWYWx1ZS0+Z2V0Q29uZmlkZW5jZShiYXJjb2RlVmFsdWUtPmdldFZhbHVlKCktPkdldEF0KDApKTsNCi0gICAgICAgICAgICB9DQorICAgIGlmIChpID09IDAgJiYgKGRldGVjdGlvblJlc3VsdC0+Z2V0Qm91bmRpbmdCb3goKS0+Z2V0TWluWSgpIDwNCisgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kaW5nQm94LT5nZXRNaW5ZKCkgfHwNCisgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uUmVzdWx0LT5nZXRCb3VuZGluZ0JveCgpLT5nZXRNYXhZKCkgPg0KKyAgICAgICAgICAgICAgICAgICAgICAgYm91bmRpbmdCb3gtPmdldE1heFkoKSkpIHsNCisgICAgICBkZWxldGUgYm91bmRpbmdCb3g7DQorICAgICAgYm91bmRpbmdCb3ggPSBkZXRlY3Rpb25SZXN1bHQtPmdldEJvdW5kaW5nQm94KCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZGV0ZWN0aW9uUmVzdWx0LT5zZXRCb3VuZGluZ0JveChib3VuZGluZ0JveCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgbWF4QmFyY29kZUNvbHVtbiA9IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCkgKyAxOw0KKyAgZGV0ZWN0aW9uUmVzdWx0LT5zZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oMCwgbGVmdFJvd0luZGljYXRvckNvbHVtbik7DQorICBkZXRlY3Rpb25SZXN1bHQtPnNldERldGVjdGlvblJlc3VsdENvbHVtbihtYXhCYXJjb2RlQ29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4pOw0KKyAgRlhfQk9PTCBsZWZ0VG9SaWdodCA9IGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4gIT0gTlVMTDsNCisgIGZvciAoaW50MzJfdCBiYXJjb2RlQ29sdW1uQ291bnQgPSAxOyBiYXJjb2RlQ29sdW1uQ291bnQgPD0gbWF4QmFyY29kZUNvbHVtbjsNCisgICAgICAgYmFyY29kZUNvbHVtbkNvdW50KyspIHsNCisgICAgaW50MzJfdCBiYXJjb2RlQ29sdW1uID0gbGVmdFRvUmlnaHQgPyBiYXJjb2RlQ29sdW1uQ291bnQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtYXhCYXJjb2RlQ29sdW1uIC0gYmFyY29kZUNvbHVtbkNvdW50Ow0KKyAgICBpZiAoZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oYmFyY29kZUNvbHVtbikgIT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qIGRldGVjdGlvblJlc3VsdENvbHVtbiA9IE5VTEw7DQorICAgIGlmIChiYXJjb2RlQ29sdW1uID09IDAgfHwgYmFyY29kZUNvbHVtbiA9PSBtYXhCYXJjb2RlQ29sdW1uKSB7DQorICAgICAgZGV0ZWN0aW9uUmVzdWx0Q29sdW1uID0gRlhfTkVXIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4oDQorICAgICAgICAgIGJvdW5kaW5nQm94LCBiYXJjb2RlQ29sdW1uID09IDApOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGRldGVjdGlvblJlc3VsdENvbHVtbiA9IEZYX05FVyBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJvdW5kaW5nQm94KTsNCisgICAgfQ0KKyAgICBkZXRlY3Rpb25SZXN1bHQtPnNldERldGVjdGlvblJlc3VsdENvbHVtbihiYXJjb2RlQ29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb25SZXN1bHRDb2x1bW4pOw0KKyAgICBpbnQzMl90IHN0YXJ0Q29sdW1uID0gLTE7DQorICAgIGludDMyX3QgcHJldmlvdXNTdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOw0KKyAgICBmb3IgKGludDMyX3QgaW1hZ2VSb3cgPSBib3VuZGluZ0JveC0+Z2V0TWluWSgpOw0KKyAgICAgICAgIGltYWdlUm93IDw9IGJvdW5kaW5nQm94LT5nZXRNYXhZKCk7IGltYWdlUm93KyspIHsNCisgICAgICBzdGFydENvbHVtbiA9DQorICAgICAgICAgIGdldFN0YXJ0Q29sdW1uKGRldGVjdGlvblJlc3VsdCwgYmFyY29kZUNvbHVtbiwgaW1hZ2VSb3csIGxlZnRUb1JpZ2h0KTsNCisgICAgICBpZiAoc3RhcnRDb2x1bW4gPCAwIHx8IHN0YXJ0Q29sdW1uID4gYm91bmRpbmdCb3gtPmdldE1heFgoKSkgew0KKyAgICAgICAgaWYgKHByZXZpb3VzU3RhcnRDb2x1bW4gPT0gLTEpIHsNCisgICAgICAgICAgY29udGludWU7DQogICAgICAgICB9DQorICAgICAgICBzdGFydENvbHVtbiA9IHByZXZpb3VzU3RhcnRDb2x1bW47DQorICAgICAgfQ0KKyAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSBkZXRlY3RDb2Rld29yZCgNCisgICAgICAgICAgaW1hZ2UsIGJvdW5kaW5nQm94LT5nZXRNaW5YKCksIGJvdW5kaW5nQm94LT5nZXRNYXhYKCksIGxlZnRUb1JpZ2h0LA0KKyAgICAgICAgICBzdGFydENvbHVtbiwgaW1hZ2VSb3csIG1pbkNvZGV3b3JkV2lkdGgsIG1heENvZGV3b3JkV2lkdGgpOw0KKyAgICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgICAgICBkZXRlY3Rpb25SZXN1bHRDb2x1bW4tPnNldENvZGV3b3JkKGltYWdlUm93LCBjb2Rld29yZCk7DQorICAgICAgICBwcmV2aW91c1N0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47DQorICAgICAgICBtaW5Db2Rld29yZFdpZHRoID0gbWluQ29kZXdvcmRXaWR0aCA8IGNvZGV3b3JkLT5nZXRXaWR0aCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbWluQ29kZXdvcmRXaWR0aA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvZGV3b3JkLT5nZXRXaWR0aCgpOw0KKyAgICAgICAgbWF4Q29kZXdvcmRXaWR0aCA9IG1heENvZGV3b3JkV2lkdGggPiBjb2Rld29yZC0+Z2V0V2lkdGgoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1heENvZGV3b3JkV2lkdGgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2Rld29yZC0+Z2V0V2lkdGgoKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBkZWNvZGVycmVzdWx0ID0NCisgICAgICBjcmVhdGVEZWNvZGVyUmVzdWx0KGRldGVjdGlvblJlc3VsdCwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGRlbGV0ZSBkZXRlY3Rpb25SZXN1bHQ7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIGRlY29kZXJyZXN1bHQ7DQogfQ0KLUNCQ19EZXRlY3Rpb25SZXN1bHQqIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6Om1lcmdlKENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4sIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTCAmJiByaWdodFJvd0luZGljYXRvckNvbHVtbiA9PSBOVUxMKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQotICAgICAgICByZXR1cm4gTlVMTDsNCitDRlhfQnl0ZVN0cmluZyBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjp0b1N0cmluZygNCisgICAgQ0ZYX1B0ckFycmF5KiBiYXJjb2RlTWF0cml4KSB7DQorICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgYmFyY29kZU1hdHJpeC0+R2V0U2l6ZSgpOyByb3crKykgew0KKyAgICByZXN1bHQgKz0gcm93Ow0KKyAgICBpbnQzMl90IGwgPSAwOw0KKyAgICBmb3IgKDsgbCA8ICgoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdChyb3cpKS0+R2V0U2l6ZSgpOyBsKyspIHsNCisgICAgICBDQkNfQmFyY29kZVZhbHVlKiBiYXJjb2RlVmFsdWUgPQ0KKyAgICAgICAgICAoQ0JDX0JhcmNvZGVWYWx1ZSopKChDRlhfUHRyQXJyYXkqKWJhcmNvZGVNYXRyaXgtPkdldEF0KHJvdykpDQorICAgICAgICAgICAgICAtPkdldEF0KGwpOw0KKyAgICAgIGlmIChiYXJjb2RlVmFsdWUtPmdldFZhbHVlKCktPkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICByZXN1bHQgKz0gIiI7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJlc3VsdCArPSBiYXJjb2RlVmFsdWUtPmdldFZhbHVlKCktPkdldEF0KDApOw0KKyAgICAgICAgcmVzdWx0ICs9DQorICAgICAgICAgICAgYmFyY29kZVZhbHVlLT5nZXRDb25maWRlbmNlKGJhcmNvZGVWYWx1ZS0+Z2V0VmFsdWUoKS0+R2V0QXQoMCkpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBDQkNfQmFyY29kZU1ldGFkYXRhKiBiYXJjb2RlTWV0YWRhdGEgPSBnZXRCYXJjb2RlTWV0YWRhdGEobGVmdFJvd0luZGljYXRvckNvbHVtbiwgcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4pOw0KLSAgICBpZiAoYmFyY29kZU1ldGFkYXRhID09IE5VTEwpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNhbm5vdE1ldGFkYXRhOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0JDX0JvdW5kaW5nQm94KiBsZWZ0Ym91bmRpbmdCb3ggPSBhZGp1c3RCb3VuZGluZ0JveChsZWZ0Um93SW5kaWNhdG9yQ29sdW1uLCBlKTsNCi0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgZGVsZXRlIGJhcmNvZGVNZXRhZGF0YTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENCQ19Cb3VuZGluZ0JveCogcmlnaHRib3VuZGluZ0JveCA9IGFkanVzdEJvdW5kaW5nQm94KHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uLCBlKTsNCi0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgZGVsZXRlIGJhcmNvZGVNZXRhZGF0YTsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3ggPSBDQkNfQm91bmRpbmdCb3g6Om1lcmdlKGxlZnRib3VuZGluZ0JveCwgcmlnaHRib3VuZGluZ0JveCwgZSk7DQotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIGRlbGV0ZSBiYXJjb2RlTWV0YWRhdGE7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25yZXN1bHQgPSBGWF9ORVcgQ0JDX0RldGVjdGlvblJlc3VsdChiYXJjb2RlTWV0YWRhdGEsIGJvdW5kaW5nQm94KTsNCi0gICAgcmV0dXJuIGRldGVjdGlvbnJlc3VsdDsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQogfQ0KLUNCQ19Cb3VuZGluZ0JveCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6YWRqdXN0Qm91bmRpbmdCb3goQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogcm93SW5kaWNhdG9yQ29sdW1uLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKHJvd0luZGljYXRvckNvbHVtbiA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfSW50MzJBcnJheSogcm93SGVpZ2h0cyA9IHJvd0luZGljYXRvckNvbHVtbi0+Z2V0Um93SGVpZ2h0cyhlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBpbnQzMl90IG1heFJvd0hlaWdodCA9IGdldE1heCgqcm93SGVpZ2h0cyk7DQotICAgIGludDMyX3QgbWlzc2luZ1N0YXJ0Um93cyA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHJvd0hlaWdodHMtPkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICBpbnQzMl90IHJvd0hlaWdodCA9IHJvd0hlaWdodHMtPkdldEF0KGkpOw0KLSAgICAgICAgbWlzc2luZ1N0YXJ0Um93cyArPSBtYXhSb3dIZWlnaHQgLSByb3dIZWlnaHQ7DQotICAgICAgICBpZiAocm93SGVpZ2h0ID4gMCkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0gcm93SW5kaWNhdG9yQ29sdW1uLT5nZXRDb2Rld29yZHMoKTsNCi0gICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IG1pc3NpbmdTdGFydFJvd3MgPiAwICYmIGNvZGV3b3Jkcy0+R2V0QXQocm93KSA9PSBOVUxMOyByb3crKykgew0KLSAgICAgICAgbWlzc2luZ1N0YXJ0Um93cy0tOw0KLSAgICB9DQotICAgIGludDMyX3QgbWlzc2luZ0VuZFJvd3MgPSAwOw0KLSAgICBmb3IgKGludDMyX3Qgcm93MSA9IHJvd0hlaWdodHMtPkdldFNpemUoKSAtIDE7IHJvdzEgPj0gMDsgcm93MS0tKSB7DQotICAgICAgICBtaXNzaW5nRW5kUm93cyArPSBtYXhSb3dIZWlnaHQgLSByb3dIZWlnaHRzLT5HZXRBdChyb3cxKTsNCi0gICAgICAgIGlmIChyb3dIZWlnaHRzLT5HZXRBdChyb3cxKSA+IDApIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBmb3IgKGludDMyX3Qgcm93MiA9IGNvZGV3b3Jkcy0+R2V0U2l6ZSgpIC0gMTsgbWlzc2luZ0VuZFJvd3MgPiAwICYmIGNvZGV3b3Jkcy0+R2V0QXQocm93MikgPT0gTlVMTDsgcm93Mi0tKSB7DQotICAgICAgICBtaXNzaW5nRW5kUm93cy0tOw0KLSAgICB9DQotICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3ggPSByb3dJbmRpY2F0b3JDb2x1bW4tPmdldEJvdW5kaW5nQm94KCktPmFkZE1pc3NpbmdSb3dzKG1pc3NpbmdTdGFydFJvd3MsIG1pc3NpbmdFbmRSb3dzLCByb3dJbmRpY2F0b3JDb2x1bW4tPmlzTGVmdCgpLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gYm91bmRpbmdCb3g7DQorQ0JDX0RldGVjdGlvblJlc3VsdCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6bWVyZ2UoDQorICAgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4sDQorICAgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobGVmdFJvd0luZGljYXRvckNvbHVtbiA9PSBOVUxMICYmIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENCQ19CYXJjb2RlTWV0YWRhdGEqIGJhcmNvZGVNZXRhZGF0YSA9DQorICAgICAgZ2V0QmFyY29kZU1ldGFkYXRhKGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4sIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uKTsNCisgIGlmIChiYXJjb2RlTWV0YWRhdGEgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25DYW5ub3RNZXRhZGF0YTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDQkNfQm91bmRpbmdCb3gqIGxlZnRib3VuZGluZ0JveCA9DQorICAgICAgYWRqdXN0Qm91bmRpbmdCb3gobGVmdFJvd0luZGljYXRvckNvbHVtbiwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGRlbGV0ZSBiYXJjb2RlTWV0YWRhdGE7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0JDX0JvdW5kaW5nQm94KiByaWdodGJvdW5kaW5nQm94ID0NCisgICAgICBhZGp1c3RCb3VuZGluZ0JveChyaWdodFJvd0luZGljYXRvckNvbHVtbiwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGRlbGV0ZSBiYXJjb2RlTWV0YWRhdGE7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9DQorICAgICAgQ0JDX0JvdW5kaW5nQm94OjptZXJnZShsZWZ0Ym91bmRpbmdCb3gsIHJpZ2h0Ym91bmRpbmdCb3gsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBkZWxldGUgYmFyY29kZU1ldGFkYXRhOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvbnJlc3VsdCA9DQorICAgICAgRlhfTkVXIENCQ19EZXRlY3Rpb25SZXN1bHQoYmFyY29kZU1ldGFkYXRhLCBib3VuZGluZ0JveCk7DQorICByZXR1cm4gZGV0ZWN0aW9ucmVzdWx0Ow0KIH0NCi1pbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldE1heChDRlhfSW50MzJBcnJheSYgdmFsdWVzKQ0KLXsNCi0gICAgaW50MzJfdCBtYXhWYWx1ZSA9IC0xOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCB2YWx1ZXMuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgdmFsdWUgPSB2YWx1ZXMuR2V0QXQoaSk7DQotICAgICAgICBtYXhWYWx1ZSA9IG1heFZhbHVlID4gdmFsdWUgPyBtYXhWYWx1ZSA6IHZhbHVlOw0KK0NCQ19Cb3VuZGluZ0JveCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6YWRqdXN0Qm91bmRpbmdCb3goDQorICAgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIHJvd0luZGljYXRvckNvbHVtbiwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKHJvd0luZGljYXRvckNvbHVtbiA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkqIHJvd0hlaWdodHMgPSByb3dJbmRpY2F0b3JDb2x1bW4tPmdldFJvd0hlaWdodHMoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBpbnQzMl90IG1heFJvd0hlaWdodCA9IGdldE1heCgqcm93SGVpZ2h0cyk7DQorICBpbnQzMl90IG1pc3NpbmdTdGFydFJvd3MgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcm93SGVpZ2h0cy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgaW50MzJfdCByb3dIZWlnaHQgPSByb3dIZWlnaHRzLT5HZXRBdChpKTsNCisgICAgbWlzc2luZ1N0YXJ0Um93cyArPSBtYXhSb3dIZWlnaHQgLSByb3dIZWlnaHQ7DQorICAgIGlmIChyb3dIZWlnaHQgPiAwKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIG1heFZhbHVlOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMgPSByb3dJbmRpY2F0b3JDb2x1bW4tPmdldENvZGV3b3JkcygpOw0KKyAgZm9yIChpbnQzMl90IHJvdyA9IDA7IG1pc3NpbmdTdGFydFJvd3MgPiAwICYmIGNvZGV3b3Jkcy0+R2V0QXQocm93KSA9PSBOVUxMOw0KKyAgICAgICByb3crKykgew0KKyAgICBtaXNzaW5nU3RhcnRSb3dzLS07DQorICB9DQorICBpbnQzMl90IG1pc3NpbmdFbmRSb3dzID0gMDsNCisgIGZvciAoaW50MzJfdCByb3cxID0gcm93SGVpZ2h0cy0+R2V0U2l6ZSgpIC0gMTsgcm93MSA+PSAwOyByb3cxLS0pIHsNCisgICAgbWlzc2luZ0VuZFJvd3MgKz0gbWF4Um93SGVpZ2h0IC0gcm93SGVpZ2h0cy0+R2V0QXQocm93MSk7DQorICAgIGlmIChyb3dIZWlnaHRzLT5HZXRBdChyb3cxKSA+IDApIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IHJvdzIgPSBjb2Rld29yZHMtPkdldFNpemUoKSAtIDE7DQorICAgICAgIG1pc3NpbmdFbmRSb3dzID4gMCAmJiBjb2Rld29yZHMtPkdldEF0KHJvdzIpID09IE5VTEw7IHJvdzItLSkgew0KKyAgICBtaXNzaW5nRW5kUm93cy0tOw0KKyAgfQ0KKyAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9DQorICAgICAgcm93SW5kaWNhdG9yQ29sdW1uLT5nZXRCb3VuZGluZ0JveCgpLT5hZGRNaXNzaW5nUm93cygNCisgICAgICAgICAgbWlzc2luZ1N0YXJ0Um93cywgbWlzc2luZ0VuZFJvd3MsIHJvd0luZGljYXRvckNvbHVtbi0+aXNMZWZ0KCksIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIGJvdW5kaW5nQm94Ow0KIH0NCi1DQkNfQmFyY29kZU1ldGFkYXRhKiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpnZXRCYXJjb2RlTWV0YWRhdGEoQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiwNCi0gICAgICAgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uKQ0KLXsNCi0gICAgQ0JDX0JhcmNvZGVNZXRhZGF0YSogbGVmdEJhcmNvZGVNZXRhZGF0YSA9IE5VTEw7DQotICAgIENCQ19CYXJjb2RlTWV0YWRhdGEqIHJpZ2h0QmFyY29kZU1ldGFkYXRhID0gTlVMTDsNCi0gICAgaWYgKGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTCB8fCAobGVmdEJhcmNvZGVNZXRhZGF0YSA9IGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4tPmdldEJhcmNvZGVNZXRhZGF0YSgpKSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTCA/IE5VTEwgOiByaWdodFJvd0luZGljYXRvckNvbHVtbi0+Z2V0QmFyY29kZU1ldGFkYXRhKCk7DQotICAgIH0NCi0gICAgaWYgKHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uID09IE5VTEwgfHwgKHJpZ2h0QmFyY29kZU1ldGFkYXRhID0gcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4tPmdldEJhcmNvZGVNZXRhZGF0YSgpKSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gbGVmdFJvd0luZGljYXRvckNvbHVtbiA9PSBOVUxMID8gTlVMTCA6IGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4tPmdldEJhcmNvZGVNZXRhZGF0YSgpOw0KLSAgICB9DQotICAgIGlmIChsZWZ0QmFyY29kZU1ldGFkYXRhLT5nZXRDb2x1bW5Db3VudCgpICE9IHJpZ2h0QmFyY29kZU1ldGFkYXRhLT5nZXRDb2x1bW5Db3VudCgpICYmDQotICAgICAgICAgICAgbGVmdEJhcmNvZGVNZXRhZGF0YS0+Z2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSAhPSByaWdodEJhcmNvZGVNZXRhZGF0YS0+Z2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSAmJg0KLSAgICAgICAgICAgIGxlZnRCYXJjb2RlTWV0YWRhdGEtPmdldFJvd0NvdW50KCkgIT0gcmlnaHRCYXJjb2RlTWV0YWRhdGEtPmdldFJvd0NvdW50KCkpIHsNCi0gICAgICAgIGRlbGV0ZSBsZWZ0QmFyY29kZU1ldGFkYXRhOw0KLSAgICAgICAgZGVsZXRlIHJpZ2h0QmFyY29kZU1ldGFkYXRhOw0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCitpbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldE1heChDRlhfSW50MzJBcnJheSYgdmFsdWVzKSB7DQorICBpbnQzMl90IG1heFZhbHVlID0gLTE7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCB2YWx1ZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgaW50MzJfdCB2YWx1ZSA9IHZhbHVlcy5HZXRBdChpKTsNCisgICAgbWF4VmFsdWUgPSBtYXhWYWx1ZSA+IHZhbHVlID8gbWF4VmFsdWUgOiB2YWx1ZTsNCisgIH0NCisgIHJldHVybiBtYXhWYWx1ZTsNCit9DQorQ0JDX0JhcmNvZGVNZXRhZGF0YSogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Z2V0QmFyY29kZU1ldGFkYXRhKA0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiBsZWZ0Um93SW5kaWNhdG9yQ29sdW1uLA0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByaWdodFJvd0luZGljYXRvckNvbHVtbikgew0KKyAgQ0JDX0JhcmNvZGVNZXRhZGF0YSogbGVmdEJhcmNvZGVNZXRhZGF0YSA9IE5VTEw7DQorICBDQkNfQmFyY29kZU1ldGFkYXRhKiByaWdodEJhcmNvZGVNZXRhZGF0YSA9IE5VTEw7DQorICBpZiAobGVmdFJvd0luZGljYXRvckNvbHVtbiA9PSBOVUxMIHx8DQorICAgICAgKGxlZnRCYXJjb2RlTWV0YWRhdGEgPSBsZWZ0Um93SW5kaWNhdG9yQ29sdW1uLT5nZXRCYXJjb2RlTWV0YWRhdGEoKSkgPT0NCisgICAgICAgICAgTlVMTCkgew0KKyAgICByZXR1cm4gcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTA0KKyAgICAgICAgICAgICAgID8gTlVMTA0KKyAgICAgICAgICAgICAgIDogcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4tPmdldEJhcmNvZGVNZXRhZGF0YSgpOw0KKyAgfQ0KKyAgaWYgKHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uID09IE5VTEwgfHwNCisgICAgICAocmlnaHRCYXJjb2RlTWV0YWRhdGEgPSByaWdodFJvd0luZGljYXRvckNvbHVtbi0+Z2V0QmFyY29kZU1ldGFkYXRhKCkpID09DQorICAgICAgICAgIE5VTEwpIHsNCisgICAgcmV0dXJuIGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTA0KKyAgICAgICAgICAgICAgID8gTlVMTA0KKyAgICAgICAgICAgICAgIDogbGVmdFJvd0luZGljYXRvckNvbHVtbi0+Z2V0QmFyY29kZU1ldGFkYXRhKCk7DQorICB9DQorICBpZiAobGVmdEJhcmNvZGVNZXRhZGF0YS0+Z2V0Q29sdW1uQ291bnQoKSAhPQ0KKyAgICAgICAgICByaWdodEJhcmNvZGVNZXRhZGF0YS0+Z2V0Q29sdW1uQ291bnQoKSAmJg0KKyAgICAgIGxlZnRCYXJjb2RlTWV0YWRhdGEtPmdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgIT0NCisgICAgICAgICAgcmlnaHRCYXJjb2RlTWV0YWRhdGEtPmdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgJiYNCisgICAgICBsZWZ0QmFyY29kZU1ldGFkYXRhLT5nZXRSb3dDb3VudCgpICE9DQorICAgICAgICAgIHJpZ2h0QmFyY29kZU1ldGFkYXRhLT5nZXRSb3dDb3VudCgpKSB7DQorICAgIGRlbGV0ZSBsZWZ0QmFyY29kZU1ldGFkYXRhOw0KICAgICBkZWxldGUgcmlnaHRCYXJjb2RlTWV0YWRhdGE7DQotICAgIHJldHVybiBsZWZ0QmFyY29kZU1ldGFkYXRhOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGRlbGV0ZSByaWdodEJhcmNvZGVNZXRhZGF0YTsNCisgIHJldHVybiBsZWZ0QmFyY29kZU1ldGFkYXRhOw0KIH0NCi1DQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpnZXRSb3dJbmRpY2F0b3JDb2x1bW4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gsIENCQ19SZXN1bHRQb2ludCBzdGFydFBvaW50LA0KLSAgICAgICAgRlhfQk9PTCBsZWZ0VG9SaWdodCwgaW50MzJfdCBtaW5Db2Rld29yZFdpZHRoLCBpbnQzMl90IG1heENvZGV3b3JkV2lkdGgpDQotew0KLSAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByb3dJbmRpY2F0b3JDb2x1bW4gPSBGWF9ORVcgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbihib3VuZGluZ0JveCwgbGVmdFRvUmlnaHQpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyOyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgaW5jcmVtZW50ID0gaSA9PSAwID8gMSA6IC0xOw0KLSAgICAgICAgaW50MzJfdCBzdGFydENvbHVtbiA9IChpbnQzMl90KSBzdGFydFBvaW50LkdldFgoKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpbWFnZVJvdyA9IChpbnQzMl90KSBzdGFydFBvaW50LkdldFkoKTsgaW1hZ2VSb3cgPD0gYm91bmRpbmdCb3gtPmdldE1heFkoKSAmJiBpbWFnZVJvdyA+PSBib3VuZGluZ0JveC0+Z2V0TWluWSgpOyBpbWFnZVJvdyArPSBpbmNyZW1lbnQpIHsNCi0gICAgICAgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gZGV0ZWN0Q29kZXdvcmQoaW1hZ2UsIDAsIGltYWdlLT5HZXRXaWR0aCgpLCBsZWZ0VG9SaWdodCwgc3RhcnRDb2x1bW4sIGltYWdlUm93LCBtaW5Db2Rld29yZFdpZHRoLCBtYXhDb2Rld29yZFdpZHRoKTsNCi0gICAgICAgICAgICBpZiAoY29kZXdvcmQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICByb3dJbmRpY2F0b3JDb2x1bW4tPnNldENvZGV3b3JkKGltYWdlUm93LCBjb2Rld29yZCk7DQotICAgICAgICAgICAgICAgIGlmIChsZWZ0VG9SaWdodCkgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnRDb2x1bW4gPSBjb2Rld29yZC0+Z2V0U3RhcnRYKCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydENvbHVtbiA9IGNvZGV3b3JkLT5nZXRFbmRYKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQorQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbioNCitDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpnZXRSb3dJbmRpY2F0b3JDb2x1bW4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCBzdGFydFBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGxlZnRUb1JpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbkNvZGV3b3JkV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4Q29kZXdvcmRXaWR0aCkgew0KKyAgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogcm93SW5kaWNhdG9yQ29sdW1uID0NCisgICAgICBGWF9ORVcgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbihib3VuZGluZ0JveCwgbGVmdFRvUmlnaHQpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjsgaSsrKSB7DQorICAgIGludDMyX3QgaW5jcmVtZW50ID0gaSA9PSAwID8gMSA6IC0xOw0KKyAgICBpbnQzMl90IHN0YXJ0Q29sdW1uID0gKGludDMyX3Qpc3RhcnRQb2ludC5HZXRYKCk7DQorICAgIGZvciAoaW50MzJfdCBpbWFnZVJvdyA9IChpbnQzMl90KXN0YXJ0UG9pbnQuR2V0WSgpOw0KKyAgICAgICAgIGltYWdlUm93IDw9IGJvdW5kaW5nQm94LT5nZXRNYXhZKCkgJiYNCisgICAgICAgICBpbWFnZVJvdyA+PSBib3VuZGluZ0JveC0+Z2V0TWluWSgpOw0KKyAgICAgICAgIGltYWdlUm93ICs9IGluY3JlbWVudCkgew0KKyAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPQ0KKyAgICAgICAgICBkZXRlY3RDb2Rld29yZChpbWFnZSwgMCwgaW1hZ2UtPkdldFdpZHRoKCksIGxlZnRUb1JpZ2h0LCBzdGFydENvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VSb3csIG1pbkNvZGV3b3JkV2lkdGgsIG1heENvZGV3b3JkV2lkdGgpOw0KKyAgICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgICAgICByb3dJbmRpY2F0b3JDb2x1bW4tPnNldENvZGV3b3JkKGltYWdlUm93LCBjb2Rld29yZCk7DQorICAgICAgICBpZiAobGVmdFRvUmlnaHQpIHsNCisgICAgICAgICAgc3RhcnRDb2x1bW4gPSBjb2Rld29yZC0+Z2V0U3RhcnRYKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBzdGFydENvbHVtbiA9IGNvZGV3b3JkLT5nZXRFbmRYKCk7DQogICAgICAgICB9DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiByb3dJbmRpY2F0b3JDb2x1bW47DQorICB9DQorICByZXR1cm4gcm93SW5kaWNhdG9yQ29sdW1uOw0KIH0NCi12b2lkIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmFkanVzdENvZGV3b3JkQ291bnQoQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LCBDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXgsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfSW50MzJBcnJheSogbnVtYmVyT2ZDb2Rld29yZHMgPSAoKENCQ19CYXJjb2RlVmFsdWUqKSgoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdCgwKSktPkdldEF0KDEpKS0+Z2V0VmFsdWUoKTsNCi0gICAgaW50MzJfdCBjYWxjdWxhdGVkTnVtYmVyT2ZDb2Rld29yZHMgPSBkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVDb2x1bW5Db3VudCgpICogZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlUm93Q291bnQoKSAtIGdldE51bWJlck9mRUNDb2RlV29yZHMoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlRUNMZXZlbCgpKTsNCi0gICAgaWYgKG51bWJlck9mQ29kZXdvcmRzLT5HZXRTaXplKCkgPT0gMCkgew0KLSAgICAgICAgaWYgKGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3JkcyA8IDEgfHwgY2FsY3VsYXRlZE51bWJlck9mQ29kZXdvcmRzID4gQ0JDX1BERjQxN0NvbW1vbjo6TUFYX0NPREVXT1JEU19JTl9CQVJDT0RFKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9udE5vdEZvdW5kSW5zdGFuY2U7DQotICAgICAgICAgICAgZGVsZXRlIG51bWJlck9mQ29kZXdvcmRzOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgKChDQkNfQmFyY29kZVZhbHVlKikoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQoMCkpLT5HZXRBdCgxKSktPnNldFZhbHVlKGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3Jkcyk7DQotICAgIH0gZWxzZSBpZiAobnVtYmVyT2ZDb2Rld29yZHMtPkdldEF0KDApICE9IGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3Jkcykgew0KLSAgICAgICAgKChDQkNfQmFyY29kZVZhbHVlKikoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQoMCkpLT5HZXRBdCgxKSktPnNldFZhbHVlKGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3Jkcyk7DQordm9pZCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjphZGp1c3RDb2Rld29yZENvdW50KA0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25SZXN1bHQsDQorICAgIENGWF9QdHJBcnJheSogYmFyY29kZU1hdHJpeCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0ludDMyQXJyYXkqIG51bWJlck9mQ29kZXdvcmRzID0NCisgICAgICAoKENCQ19CYXJjb2RlVmFsdWUqKSgoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdCgwKSktPkdldEF0KDEpKQ0KKyAgICAgICAgICAtPmdldFZhbHVlKCk7DQorICBpbnQzMl90IGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3JkcyA9DQorICAgICAgZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlQ29sdW1uQ291bnQoKSAqDQorICAgICAgICAgIGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZVJvd0NvdW50KCkgLQ0KKyAgICAgIGdldE51bWJlck9mRUNDb2RlV29yZHMoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlRUNMZXZlbCgpKTsNCisgIGlmIChudW1iZXJPZkNvZGV3b3Jkcy0+R2V0U2l6ZSgpID09IDApIHsNCisgICAgaWYgKGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3JkcyA8IDEgfHwNCisgICAgICAgIGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3JkcyA+DQorICAgICAgICAgICAgQ0JDX1BERjQxN0NvbW1vbjo6TUFYX0NPREVXT1JEU19JTl9CQVJDT0RFKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9udE5vdEZvdW5kSW5zdGFuY2U7DQorICAgICAgZGVsZXRlIG51bWJlck9mQ29kZXdvcmRzOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KICAgICB9DQotICAgIGRlbGV0ZSBudW1iZXJPZkNvZGV3b3JkczsNCisgICAgKChDQkNfQmFyY29kZVZhbHVlKikoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQoMCkpLT5HZXRBdCgxKSkNCisgICAgICAgIC0+c2V0VmFsdWUoY2FsY3VsYXRlZE51bWJlck9mQ29kZXdvcmRzKTsNCisgIH0gZWxzZSBpZiAobnVtYmVyT2ZDb2Rld29yZHMtPkdldEF0KDApICE9IGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3Jkcykgew0KKyAgICAoKENCQ19CYXJjb2RlVmFsdWUqKSgoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdCgwKSktPkdldEF0KDEpKQ0KKyAgICAgICAgLT5zZXRWYWx1ZShjYWxjdWxhdGVkTnVtYmVyT2ZDb2Rld29yZHMpOw0KKyAgfQ0KKyAgZGVsZXRlIG51bWJlck9mQ29kZXdvcmRzOw0KIH0NCi1DQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Y3JlYXRlRGVjb2RlclJlc3VsdChDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25SZXN1bHQsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXggPSBjcmVhdGVCYXJjb2RlTWF0cml4KGRldGVjdGlvblJlc3VsdCk7DQotICAgIGFkanVzdENvZGV3b3JkQ291bnQoZGV0ZWN0aW9uUmVzdWx0LCBiYXJjb2RlTWF0cml4LCBlKTsNCi0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYmFyY29kZU1hdHJpeC0+R2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHRlbXAgPSAoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdChpKTsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCB0ZW1wLT5HZXRTaXplKCk7IGorKykgew0KLSAgICAgICAgICAgICAgICBkZWxldGUgKENCQ19CYXJjb2RlVmFsdWUqKXRlbXAtPkdldEF0KGopOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0ZW1wLT5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICBkZWxldGUgdGVtcDsNCi0gICAgICAgIH0NCi0gICAgICAgIGJhcmNvZGVNYXRyaXgtPlJlbW92ZUFsbCgpOw0KLSAgICAgICAgZGVsZXRlIGJhcmNvZGVNYXRyaXg7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfSW50MzJBcnJheSBlcmFzdXJlczsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgY29kZXdvcmRzOw0KLSAgICBjb2Rld29yZHMuU2V0U2l6ZShkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVSb3dDb3VudCgpICogZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlQ29sdW1uQ291bnQoKSk7DQotICAgIENGWF9QdHJBcnJheSBhbWJpZ3VvdXNJbmRleFZhbHVlc0xpc3Q7DQotICAgIENGWF9JbnQzMkFycmF5IGFtYmlndW91c0luZGV4ZXNMaXN0Ow0KLSAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlUm93Q291bnQoKTsgcm93KyspIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCk7IGwrKykgew0KLSAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiB2YWx1ZXMgPSAoKENCQ19CYXJjb2RlVmFsdWUqKSgoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdChyb3cpKS0+R2V0QXQobCArIDEpKS0+Z2V0VmFsdWUoKTsNCi0gICAgICAgICAgICBpbnQzMl90IGNvZGV3b3JkSW5kZXggPSByb3cgKiBkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVDb2x1bW5Db3VudCgpICsgbDsNCi0gICAgICAgICAgICBpZiAodmFsdWVzLT5HZXRTaXplKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICBlcmFzdXJlcy5BZGQoY29kZXdvcmRJbmRleCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZXMtPkdldFNpemUoKSA9PSAxKSB7DQotICAgICAgICAgICAgICAgIGNvZGV3b3Jkc1tjb2Rld29yZEluZGV4XSA9IHZhbHVlcy0+R2V0QXQoMCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgYW1iaWd1b3VzSW5kZXhlc0xpc3QuQWRkKGNvZGV3b3JkSW5kZXgpOw0KLSAgICAgICAgICAgICAgICBhbWJpZ3VvdXNJbmRleFZhbHVlc0xpc3QuQWRkKHZhbHVlcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIENGWF9QdHJBcnJheSBhbWJpZ3VvdXNJbmRleFZhbHVlczsNCi0gICAgYW1iaWd1b3VzSW5kZXhWYWx1ZXMuU2V0U2l6ZShhbWJpZ3VvdXNJbmRleFZhbHVlc0xpc3QuR2V0U2l6ZSgpKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYW1iaWd1b3VzSW5kZXhWYWx1ZXMuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIGFtYmlndW91c0luZGV4VmFsdWVzLlNldEF0KGksIGFtYmlndW91c0luZGV4VmFsdWVzTGlzdC5HZXRBdChpKSk7DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IGwgPSAwOyBsIDwgYmFyY29kZU1hdHJpeC0+R2V0U2l6ZSgpOyBsKyspIHsNCi0gICAgICAgIENGWF9QdHJBcnJheSogdGVtcCA9IChDRlhfUHRyQXJyYXkqKWJhcmNvZGVNYXRyaXgtPkdldEF0KGwpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgdGVtcC0+R2V0U2l6ZSgpOyBqKyspIHsNCi0gICAgICAgICAgICBkZWxldGUgKENCQ19CYXJjb2RlVmFsdWUqKXRlbXAtPkdldEF0KGopOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGVtcC0+UmVtb3ZlQWxsKCk7DQotICAgICAgICBkZWxldGUgdGVtcDsNCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Y3JlYXRlRGVjb2RlclJlc3VsdCgNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXggPSBjcmVhdGVCYXJjb2RlTWF0cml4KGRldGVjdGlvblJlc3VsdCk7DQorICBhZGp1c3RDb2Rld29yZENvdW50KGRldGVjdGlvblJlc3VsdCwgYmFyY29kZU1hdHJpeCwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJhcmNvZGVNYXRyaXgtPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgQ0ZYX1B0ckFycmF5KiB0ZW1wID0gKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQoaSk7DQorICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgdGVtcC0+R2V0U2l6ZSgpOyBqKyspIHsNCisgICAgICAgIGRlbGV0ZSAoQ0JDX0JhcmNvZGVWYWx1ZSopdGVtcC0+R2V0QXQoaik7DQorICAgICAgfQ0KKyAgICAgIHRlbXAtPlJlbW92ZUFsbCgpOw0KKyAgICAgIGRlbGV0ZSB0ZW1wOw0KICAgICB9DQogICAgIGJhcmNvZGVNYXRyaXgtPlJlbW92ZUFsbCgpOw0KICAgICBkZWxldGUgYmFyY29kZU1hdHJpeDsNCi0gICAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIGRlY29kZXJSZXN1bHQgPSBjcmVhdGVEZWNvZGVyUmVzdWx0RnJvbUFtYmlndW91c1ZhbHVlcyhkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVFQ0xldmVsKCksIGNvZGV3b3JkcywgZXJhc3VyZXMsIGFtYmlndW91c0luZGV4ZXNMaXN0LCBhbWJpZ3VvdXNJbmRleFZhbHVlcywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgcmV0dXJuIGRlY29kZXJSZXN1bHQ7DQotfQ0KLUNCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpjcmVhdGVEZWNvZGVyUmVzdWx0RnJvbUFtYmlndW91c1ZhbHVlcyhpbnQzMl90IGVjTGV2ZWwsIENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIENGWF9JbnQzMkFycmF5ICZlcmFzdXJlQXJyYXksIENGWF9JbnQzMkFycmF5ICZhbWJpZ3VvdXNJbmRleGVzLA0KLSAgICAgICAgQ0ZYX1B0ckFycmF5JiBhbWJpZ3VvdXNJbmRleFZhbHVlcywgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9JbnQzMkFycmF5IGFtYmlndW91c0luZGV4Q291bnQ7DQotICAgIGFtYmlndW91c0luZGV4Q291bnQuU2V0U2l6ZShhbWJpZ3VvdXNJbmRleGVzLkdldFNpemUoKSk7DQotICAgIGludDMyX3QgdHJpZXMgPSAxMDA7DQotICAgIHdoaWxlICh0cmllcy0tID4gMCkgew0KLSAgICAgICAgZm9yIChpbnQzMl90IGwgPSAwOyBsIDwgYW1iaWd1b3VzSW5kZXhDb3VudC5HZXRTaXplKCk7IGwrKykgew0KLSAgICAgICAgICAgIGNvZGV3b3Jkc1thbWJpZ3VvdXNJbmRleGVzW2xdXSA9ICgoQ0ZYX0ludDMyQXJyYXkqKWFtYmlndW91c0luZGV4VmFsdWVzLkdldEF0KGwpKS0+R2V0QXQoYW1iaWd1b3VzSW5kZXhDb3VudFtsXSk7DQotICAgICAgICB9DQotICAgICAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogZGVjb2RlclJlc3VsdCA9IGRlY29kZUNvZGV3b3Jkcyhjb2Rld29yZHMsIGVjTGV2ZWwsIGVyYXN1cmVBcnJheSwgZSk7DQotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTk87DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVyUmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGFtYmlndW91c0luZGV4Q291bnQuR2V0U2l6ZSgpID09IDApIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUluc3RhbmNlOw0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYW1iaWd1b3VzSW5kZXhDb3VudC5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIGlmIChhbWJpZ3VvdXNJbmRleENvdW50W2ldIDwgKChDRlhfSW50MzJBcnJheSopKGFtYmlndW91c0luZGV4VmFsdWVzLkdldEF0KGkpKSktPkdldFNpemUoKSAtIDEpIHsNCi0gICAgICAgICAgICAgICAgYW1iaWd1b3VzSW5kZXhDb3VudFtpXSsrOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBhbWJpZ3VvdXNJbmRleENvdW50W2ldID0gMDsNCi0gICAgICAgICAgICAgICAgaWYgKGkgPT0gYW1iaWd1b3VzSW5kZXhDb3VudC5HZXRTaXplKCkgLSAxKSB7DQotICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUluc3RhbmNlOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1JbnN0YW5jZTsNCiAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfSW50MzJBcnJheSBlcmFzdXJlczsNCisgIENGWF9JbnQzMkFycmF5IGNvZGV3b3JkczsNCisgIGNvZGV3b3Jkcy5TZXRTaXplKGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZVJvd0NvdW50KCkgKg0KKyAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlQ29sdW1uQ291bnQoKSk7DQorICBDRlhfUHRyQXJyYXkgYW1iaWd1b3VzSW5kZXhWYWx1ZXNMaXN0Ow0KKyAgQ0ZYX0ludDMyQXJyYXkgYW1iaWd1b3VzSW5kZXhlc0xpc3Q7DQorICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlUm93Q291bnQoKTsgcm93KyspIHsNCisgICAgZm9yIChpbnQzMl90IGwgPSAwOyBsIDwgZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlQ29sdW1uQ291bnQoKTsgbCsrKSB7DQorICAgICAgQ0ZYX0ludDMyQXJyYXkqIHZhbHVlcyA9DQorICAgICAgICAgICgoQ0JDX0JhcmNvZGVWYWx1ZSopKChDRlhfUHRyQXJyYXkqKWJhcmNvZGVNYXRyaXgtPkdldEF0KHJvdykpDQorICAgICAgICAgICAgICAgLT5HZXRBdChsICsgMSkpDQorICAgICAgICAgICAgICAtPmdldFZhbHVlKCk7DQorICAgICAgaW50MzJfdCBjb2Rld29yZEluZGV4ID0NCisgICAgICAgICAgcm93ICogZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlQ29sdW1uQ291bnQoKSArIGw7DQorICAgICAgaWYgKHZhbHVlcy0+R2V0U2l6ZSgpID09IDApIHsNCisgICAgICAgIGVyYXN1cmVzLkFkZChjb2Rld29yZEluZGV4KTsNCisgICAgICB9IGVsc2UgaWYgKHZhbHVlcy0+R2V0U2l6ZSgpID09IDEpIHsNCisgICAgICAgIGNvZGV3b3Jkc1tjb2Rld29yZEluZGV4XSA9IHZhbHVlcy0+R2V0QXQoMCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGFtYmlndW91c0luZGV4ZXNMaXN0LkFkZChjb2Rld29yZEluZGV4KTsNCisgICAgICAgIGFtYmlndW91c0luZGV4VmFsdWVzTGlzdC5BZGQodmFsdWVzKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIENGWF9QdHJBcnJheSBhbWJpZ3VvdXNJbmRleFZhbHVlczsNCisgIGFtYmlndW91c0luZGV4VmFsdWVzLlNldFNpemUoYW1iaWd1b3VzSW5kZXhWYWx1ZXNMaXN0LkdldFNpemUoKSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhbWJpZ3VvdXNJbmRleFZhbHVlcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICBhbWJpZ3VvdXNJbmRleFZhbHVlcy5TZXRBdChpLCBhbWJpZ3VvdXNJbmRleFZhbHVlc0xpc3QuR2V0QXQoaSkpOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGwgPSAwOyBsIDwgYmFyY29kZU1hdHJpeC0+R2V0U2l6ZSgpOyBsKyspIHsNCisgICAgQ0ZYX1B0ckFycmF5KiB0ZW1wID0gKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQobCk7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHRlbXAtPkdldFNpemUoKTsgaisrKSB7DQorICAgICAgZGVsZXRlIChDQkNfQmFyY29kZVZhbHVlKil0ZW1wLT5HZXRBdChqKTsNCisgICAgfQ0KKyAgICB0ZW1wLT5SZW1vdmVBbGwoKTsNCisgICAgZGVsZXRlIHRlbXA7DQorICB9DQorICBiYXJjb2RlTWF0cml4LT5SZW1vdmVBbGwoKTsNCisgIGRlbGV0ZSBiYXJjb2RlTWF0cml4Ow0KKyAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIGRlY29kZXJSZXN1bHQgPQ0KKyAgICAgIGNyZWF0ZURlY29kZXJSZXN1bHRGcm9tQW1iaWd1b3VzVmFsdWVzKA0KKyAgICAgICAgICBkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVFQ0xldmVsKCksIGNvZGV3b3JkcywgZXJhc3VyZXMsDQorICAgICAgICAgIGFtYmlndW91c0luZGV4ZXNMaXN0LCBhbWJpZ3VvdXNJbmRleFZhbHVlcywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gZGVjb2RlclJlc3VsdDsNCiB9DQotQ0ZYX1B0ckFycmF5KiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpjcmVhdGVCYXJjb2RlTWF0cml4KENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCkNCi17DQotICAgIENGWF9QdHJBcnJheSogYmFyY29kZU1hdHJpeCA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQotICAgIGJhcmNvZGVNYXRyaXgtPlNldFNpemUoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlUm93Q291bnQoKSk7DQotICAgIENGWF9QdHJBcnJheSogdGVtcCA9IE5VTEw7DQotICAgIGludDMyX3QgY29sdW1lID0gMDsNCi0gICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IGJhcmNvZGVNYXRyaXgtPkdldFNpemUoKTsgcm93KyspIHsNCi0gICAgICAgIHRlbXAgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5Ow0KLSAgICAgICAgdGVtcC0+U2V0U2l6ZShkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVDb2x1bW5Db3VudCgpICsgMik7DQotICAgICAgICBmb3IgKGNvbHVtZSA9IDA7IGNvbHVtZSA8IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCkgKyAyOyBjb2x1bWUrKykgew0KLSAgICAgICAgICAgIHRlbXAtPlNldEF0KGNvbHVtZSwgRlhfTkVXIENCQ19CYXJjb2RlVmFsdWUoKSk7DQotICAgICAgICB9DQotICAgICAgICBiYXJjb2RlTWF0cml4LT5TZXRBdChyb3csIHRlbXApOw0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0Kg0KK0NCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmNyZWF0ZURlY29kZXJSZXN1bHRGcm9tQW1iaWd1b3VzVmFsdWVzKA0KKyAgICBpbnQzMl90IGVjTGV2ZWwsDQorICAgIENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgIENGWF9JbnQzMkFycmF5JiBlcmFzdXJlQXJyYXksDQorICAgIENGWF9JbnQzMkFycmF5JiBhbWJpZ3VvdXNJbmRleGVzLA0KKyAgICBDRlhfUHRyQXJyYXkmIGFtYmlndW91c0luZGV4VmFsdWVzLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfSW50MzJBcnJheSBhbWJpZ3VvdXNJbmRleENvdW50Ow0KKyAgYW1iaWd1b3VzSW5kZXhDb3VudC5TZXRTaXplKGFtYmlndW91c0luZGV4ZXMuR2V0U2l6ZSgpKTsNCisgIGludDMyX3QgdHJpZXMgPSAxMDA7DQorICB3aGlsZSAodHJpZXMtLSA+IDApIHsNCisgICAgZm9yIChpbnQzMl90IGwgPSAwOyBsIDwgYW1iaWd1b3VzSW5kZXhDb3VudC5HZXRTaXplKCk7IGwrKykgew0KKyAgICAgIGNvZGV3b3Jkc1thbWJpZ3VvdXNJbmRleGVzW2xdXSA9DQorICAgICAgICAgICgoQ0ZYX0ludDMyQXJyYXkqKWFtYmlndW91c0luZGV4VmFsdWVzLkdldEF0KGwpKQ0KKyAgICAgICAgICAgICAgLT5HZXRBdChhbWJpZ3VvdXNJbmRleENvdW50W2xdKTsNCiAgICAgfQ0KLSAgICBjb2x1bWUgPSAtMTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW5zKCkuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qIGRldGVjdGlvblJlc3VsdENvbHVtbiA9IChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKikgZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW5zKCkuR2V0QXQoaSk7DQotICAgICAgICBjb2x1bWUrKzsNCi0gICAgICAgIGlmIChkZXRlY3Rpb25SZXN1bHRDb2x1bW4gPT0gTlVMTCkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1B0ckFycmF5KiB0ZW1wID0gZGV0ZWN0aW9uUmVzdWx0Q29sdW1uLT5nZXRDb2Rld29yZHMoKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IHRlbXAtPkdldFNpemUoKTsgbCsrKSB7DQotICAgICAgICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKSB0ZW1wLT5HZXRBdChsKTsNCi0gICAgICAgICAgICBpZiAoY29kZXdvcmQgPT0gTlVMTCB8fCBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkgPT0gLTEpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICgoQ0JDX0JhcmNvZGVWYWx1ZSopKChDRlhfUHRyQXJyYXkqKWJhcmNvZGVNYXRyaXgtPkdldEF0KGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSkpLT5HZXRBdChjb2x1bWUpKS0+c2V0VmFsdWUoY29kZXdvcmQtPmdldFZhbHVlKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBiYXJjb2RlTWF0cml4Ow0KLX0NCi1GWF9CT09MIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmlzVmFsaWRCYXJjb2RlQ29sdW1uKENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCwgaW50MzJfdCBiYXJjb2RlQ29sdW1uKQ0KLXsNCi0gICAgcmV0dXJuIGJhcmNvZGVDb2x1bW4gPj0gMCAmJiBiYXJjb2RlQ29sdW1uIDw9IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCkgKyAxOw0KLX0NCi1pbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldFN0YXJ0Q29sdW1uKENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCwgaW50MzJfdCBiYXJjb2RlQ29sdW1uLCBpbnQzMl90IGltYWdlUm93LCBGWF9CT09MIGxlZnRUb1JpZ2h0KQ0KLXsNCi0gICAgaW50MzJfdCBvZmZzZXQgPSBsZWZ0VG9SaWdodCA/IDEgOiAtMTsNCi0gICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IE5VTEw7DQotICAgIGlmIChpc1ZhbGlkQmFyY29kZUNvbHVtbihkZXRlY3Rpb25SZXN1bHQsIGJhcmNvZGVDb2x1bW4gLSBvZmZzZXQpKSB7DQotICAgICAgICBjb2Rld29yZCA9IGRldGVjdGlvblJlc3VsdC0+Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJhcmNvZGVDb2x1bW4gLSBvZmZzZXQpLT5nZXRDb2Rld29yZChpbWFnZVJvdyk7DQotICAgIH0NCi0gICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBsZWZ0VG9SaWdodCA/IGNvZGV3b3JkLT5nZXRFbmRYKCkgOiBjb2Rld29yZC0+Z2V0U3RhcnRYKCk7DQotICAgIH0NCi0gICAgY29kZXdvcmQgPSBkZXRlY3Rpb25SZXN1bHQtPmdldERldGVjdGlvblJlc3VsdENvbHVtbihiYXJjb2RlQ29sdW1uKS0+Z2V0Q29kZXdvcmROZWFyYnkoaW1hZ2VSb3cpOw0KLSAgICBpZiAoY29kZXdvcmQgIT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIGxlZnRUb1JpZ2h0ID8gY29kZXdvcmQtPmdldFN0YXJ0WCgpIDogY29kZXdvcmQtPmdldEVuZFgoKTsNCi0gICAgfQ0KLSAgICBpZiAoaXNWYWxpZEJhcmNvZGVDb2x1bW4oZGV0ZWN0aW9uUmVzdWx0LCBiYXJjb2RlQ29sdW1uIC0gb2Zmc2V0KSkgew0KLSAgICAgICAgY29kZXdvcmQgPSBkZXRlY3Rpb25SZXN1bHQtPmdldERldGVjdGlvblJlc3VsdENvbHVtbihiYXJjb2RlQ29sdW1uIC0gb2Zmc2V0KS0+Z2V0Q29kZXdvcmROZWFyYnkoaW1hZ2VSb3cpOw0KLSAgICB9DQotICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gbGVmdFRvUmlnaHQgPyBjb2Rld29yZC0+Z2V0RW5kWCgpIDogY29kZXdvcmQtPmdldFN0YXJ0WCgpOw0KLSAgICB9DQotICAgIGludDMyX3Qgc2tpcHBlZENvbHVtbnMgPSAwOw0KLSAgICB3aGlsZSAoaXNWYWxpZEJhcmNvZGVDb2x1bW4oZGV0ZWN0aW9uUmVzdWx0LCBiYXJjb2RlQ29sdW1uIC0gb2Zmc2V0KSkgew0KLSAgICAgICAgYmFyY29kZUNvbHVtbiAtPSBvZmZzZXQ7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkZXRlY3Rpb25SZXN1bHQtPmdldERldGVjdGlvblJlc3VsdENvbHVtbihiYXJjb2RlQ29sdW1uKS0+Z2V0Q29kZXdvcmRzKCktPkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgQ0JDX0NvZGV3b3JkKiBwcmV2aW91c1Jvd0NvZGV3b3JkID0gKENCQ19Db2Rld29yZCopIGRldGVjdGlvblJlc3VsdC0+Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJhcmNvZGVDb2x1bW4pLT5nZXRDb2Rld29yZHMoKS0+R2V0QXQoaSk7DQotICAgICAgICAgICAgaWYgKHByZXZpb3VzUm93Q29kZXdvcmQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gKGxlZnRUb1JpZ2h0ID8gcHJldmlvdXNSb3dDb2Rld29yZC0+Z2V0RW5kWCgpIDogcHJldmlvdXNSb3dDb2Rld29yZC0+Z2V0U3RhcnRYKCkpICsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAqIHNraXBwZWRDb2x1bW5zICogKHByZXZpb3VzUm93Q29kZXdvcmQtPmdldEVuZFgoKSAtIHByZXZpb3VzUm93Q29kZXdvcmQtPmdldFN0YXJ0WCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBza2lwcGVkQ29sdW1ucysrOw0KLSAgICB9DQotICAgIHJldHVybiBsZWZ0VG9SaWdodCA/IGRldGVjdGlvblJlc3VsdC0+Z2V0Qm91bmRpbmdCb3goKS0+Z2V0TWluWCgpIDogZGV0ZWN0aW9uUmVzdWx0LT5nZXRCb3VuZGluZ0JveCgpLT5nZXRNYXhYKCk7DQotfQ0KLUNCQ19Db2Rld29yZCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6ZGV0ZWN0Q29kZXdvcmQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIGludDMyX3QgbWluQ29sdW1uLCBpbnQzMl90IG1heENvbHVtbiwgRlhfQk9PTCBsZWZ0VG9SaWdodCwgaW50MzJfdCBzdGFydENvbHVtbiwNCi0gICAgICAgIGludDMyX3QgaW1hZ2VSb3csIGludDMyX3QgbWluQ29kZXdvcmRXaWR0aCwgaW50MzJfdCBtYXhDb2Rld29yZFdpZHRoKQ0KLXsNCi0gICAgc3RhcnRDb2x1bW4gPSBhZGp1c3RDb2Rld29yZFN0YXJ0Q29sdW1uKGltYWdlLCBtaW5Db2x1bW4sIG1heENvbHVtbiwgbGVmdFRvUmlnaHQsIHN0YXJ0Q29sdW1uLCBpbWFnZVJvdyk7DQotICAgIENGWF9JbnQzMkFycmF5KiBtb2R1bGVCaXRDb3VudCA9IGdldE1vZHVsZUJpdENvdW50KGltYWdlLCBtaW5Db2x1bW4sIG1heENvbHVtbiwgbGVmdFRvUmlnaHQsIHN0YXJ0Q29sdW1uLCBpbWFnZVJvdyk7DQotICAgIGlmIChtb2R1bGVCaXRDb3VudCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGVuZENvbHVtbjsNCi0gICAgaW50MzJfdCBjb2Rld29yZEJpdENvdW50ID0gQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Qml0Q291bnRTdW0oKm1vZHVsZUJpdENvdW50KTsNCi0gICAgaWYgKGxlZnRUb1JpZ2h0KSB7DQotICAgICAgICBlbmRDb2x1bW4gPSBzdGFydENvbHVtbiArIGNvZGV3b3JkQml0Q291bnQ7DQorICAgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBkZWNvZGVyUmVzdWx0ID0NCisgICAgICAgIGRlY29kZUNvZGV3b3Jkcyhjb2Rld29yZHMsIGVjTGV2ZWwsIGVyYXN1cmVBcnJheSwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25OTzsNCisgICAgICBjb250aW51ZTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1vZHVsZUJpdENvdW50LT5HZXRTaXplKCkgPj4gMTsgaSsrKSB7DQotICAgICAgICAgICAgaW50MzJfdCB0bXBDb3VudCA9IG1vZHVsZUJpdENvdW50LT5HZXRBdChpKTsNCi0gICAgICAgICAgICBtb2R1bGVCaXRDb3VudC0+U2V0QXQoaSwgbW9kdWxlQml0Q291bnQtPkdldEF0KG1vZHVsZUJpdENvdW50LT5HZXRTaXplKCkgLSAxIC0gaSkpOw0KLSAgICAgICAgICAgIG1vZHVsZUJpdENvdW50LT5TZXRBdChtb2R1bGVCaXRDb3VudC0+R2V0U2l6ZSgpIC0gMSAtIGksIHRtcENvdW50KTsNCisgICAgICByZXR1cm4gZGVjb2RlclJlc3VsdDsNCisgICAgfQ0KKyAgICBpZiAoYW1iaWd1b3VzSW5kZXhDb3VudC5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtSW5zdGFuY2U7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYW1iaWd1b3VzSW5kZXhDb3VudC5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgIGlmIChhbWJpZ3VvdXNJbmRleENvdW50W2ldIDwNCisgICAgICAgICAgKChDRlhfSW50MzJBcnJheSopKGFtYmlndW91c0luZGV4VmFsdWVzLkdldEF0KGkpKSktPkdldFNpemUoKSAtIDEpIHsNCisgICAgICAgIGFtYmlndW91c0luZGV4Q291bnRbaV0rKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBhbWJpZ3VvdXNJbmRleENvdW50W2ldID0gMDsNCisgICAgICAgIGlmIChpID09IGFtYmlndW91c0luZGV4Q291bnQuR2V0U2l6ZSgpIC0gMSkgew0KKyAgICAgICAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUluc3RhbmNlOw0KKyAgICAgICAgICByZXR1cm4gTlVMTDsNCiAgICAgICAgIH0NCi0gICAgICAgIGVuZENvbHVtbiA9IHN0YXJ0Q29sdW1uOw0KLSAgICAgICAgc3RhcnRDb2x1bW4gPSBlbmRDb2x1bW4gLSBjb2Rld29yZEJpdENvdW50Ow0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpbnQzMl90IGRlY29kZWRWYWx1ZSA9IENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OmdldERlY29kZWRWYWx1ZSgqbW9kdWxlQml0Q291bnQpOw0KLSAgICBpbnQzMl90IGNvZGV3b3JkID0gQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Q29kZXdvcmQoZGVjb2RlZFZhbHVlKTsNCi0gICAgZGVsZXRlIG1vZHVsZUJpdENvdW50Ow0KLSAgICBpZiAoY29kZXdvcmQgPT0gLTEpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBGWF9ORVcgQ0JDX0NvZGV3b3JkKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4sIGdldENvZGV3b3JkQnVja2V0TnVtYmVyKGRlY29kZWRWYWx1ZSksIGNvZGV3b3JkKTsNCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtSW5zdGFuY2U7DQorICByZXR1cm4gTlVMTDsNCiB9DQotQ0ZYX0ludDMyQXJyYXkqIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldE1vZHVsZUJpdENvdW50KENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLCBpbnQzMl90IG1pbkNvbHVtbiwgaW50MzJfdCBtYXhDb2x1bW4sIEZYX0JPT0wgbGVmdFRvUmlnaHQsIGludDMyX3Qgc3RhcnRDb2x1bW4sIGludDMyX3QgaW1hZ2VSb3cpDQotew0KLSAgICBpbnQzMl90IGltYWdlQ29sdW1uID0gc3RhcnRDb2x1bW47DQotICAgIENGWF9JbnQzMkFycmF5KiBtb2R1bGVCaXRDb3VudCA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCi0gICAgbW9kdWxlQml0Q291bnQtPlNldFNpemUoOCk7DQotICAgIGludDMyX3QgbW9kdWxlTnVtYmVyID0gMDsNCi0gICAgaW50MzJfdCBpbmNyZW1lbnQgPSBsZWZ0VG9SaWdodCA/IDEgOiAtMTsNCi0gICAgRlhfQk9PTCBwcmV2aW91c1BpeGVsVmFsdWUgPSBsZWZ0VG9SaWdodDsNCi0gICAgd2hpbGUgKCgobGVmdFRvUmlnaHQgJiYgaW1hZ2VDb2x1bW4gPCBtYXhDb2x1bW4pIHx8ICghbGVmdFRvUmlnaHQgJiYgaW1hZ2VDb2x1bW4gPj0gbWluQ29sdW1uKSkgJiYgbW9kdWxlTnVtYmVyIDwgbW9kdWxlQml0Q291bnQtPkdldFNpemUoKSkgew0KLSAgICAgICAgaWYgKGltYWdlLT5HZXQoaW1hZ2VDb2x1bW4sIGltYWdlUm93KSA9PSBwcmV2aW91c1BpeGVsVmFsdWUpIHsNCi0gICAgICAgICAgICBtb2R1bGVCaXRDb3VudC0+U2V0QXQobW9kdWxlTnVtYmVyLCBtb2R1bGVCaXRDb3VudC0+R2V0QXQobW9kdWxlTnVtYmVyKSArIDEpOw0KLSAgICAgICAgICAgIGltYWdlQ29sdW1uICs9IGluY3JlbWVudDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbW9kdWxlTnVtYmVyKys7DQotICAgICAgICAgICAgcHJldmlvdXNQaXhlbFZhbHVlID0gIXByZXZpb3VzUGl4ZWxWYWx1ZTsNCi0gICAgICAgIH0NCitDRlhfUHRyQXJyYXkqIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmNyZWF0ZUJhcmNvZGVNYXRyaXgoDQorICAgIENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCkgew0KKyAgQ0ZYX1B0ckFycmF5KiBiYXJjb2RlTWF0cml4ID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgIGJhcmNvZGVNYXRyaXgtPlNldFNpemUoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlUm93Q291bnQoKSk7DQorICBDRlhfUHRyQXJyYXkqIHRlbXAgPSBOVUxMOw0KKyAgaW50MzJfdCBjb2x1bWUgPSAwOw0KKyAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IGJhcmNvZGVNYXRyaXgtPkdldFNpemUoKTsgcm93KyspIHsNCisgICAgdGVtcCA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQorICAgIHRlbXAtPlNldFNpemUoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlQ29sdW1uQ291bnQoKSArIDIpOw0KKyAgICBmb3IgKGNvbHVtZSA9IDA7IGNvbHVtZSA8IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCkgKyAyOw0KKyAgICAgICAgIGNvbHVtZSsrKSB7DQorICAgICAgdGVtcC0+U2V0QXQoY29sdW1lLCBGWF9ORVcgQ0JDX0JhcmNvZGVWYWx1ZSgpKTsNCiAgICAgfQ0KLSAgICBpZiAobW9kdWxlTnVtYmVyID09IG1vZHVsZUJpdENvdW50LT5HZXRTaXplKCkgfHwgKCgobGVmdFRvUmlnaHQgJiYgaW1hZ2VDb2x1bW4gPT0gbWF4Q29sdW1uKSB8fCAoIWxlZnRUb1JpZ2h0ICYmIGltYWdlQ29sdW1uID09IG1pbkNvbHVtbikpICYmIG1vZHVsZU51bWJlciA9PSBtb2R1bGVCaXRDb3VudC0+R2V0U2l6ZSgpIC0gMSkpIHsNCi0gICAgICAgIHJldHVybiBtb2R1bGVCaXRDb3VudDsNCisgICAgYmFyY29kZU1hdHJpeC0+U2V0QXQocm93LCB0ZW1wKTsNCisgIH0NCisgIGNvbHVtZSA9IC0xOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOw0KKyAgICAgICBpIDwgZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW5zKCkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiogZGV0ZWN0aW9uUmVzdWx0Q29sdW1uID0NCisgICAgICAgIChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKilkZXRlY3Rpb25SZXN1bHQtPmdldERldGVjdGlvblJlc3VsdENvbHVtbnMoKQ0KKyAgICAgICAgICAgIC5HZXRBdChpKTsNCisgICAgY29sdW1lKys7DQorICAgIGlmIChkZXRlY3Rpb25SZXN1bHRDb2x1bW4gPT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIGRlbGV0ZSBtb2R1bGVCaXRDb3VudDsNCisgICAgQ0ZYX1B0ckFycmF5KiB0ZW1wID0gZGV0ZWN0aW9uUmVzdWx0Q29sdW1uLT5nZXRDb2Rld29yZHMoKTsNCisgICAgZm9yIChpbnQzMl90IGwgPSAwOyBsIDwgdGVtcC0+R2V0U2l6ZSgpOyBsKyspIHsNCisgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopdGVtcC0+R2V0QXQobCk7DQorICAgICAgaWYgKGNvZGV3b3JkID09IE5VTEwgfHwgY29kZXdvcmQtPmdldFJvd051bWJlcigpID09IC0xKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgKChDQkNfQmFyY29kZVZhbHVlKikoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSkpDQorICAgICAgICAgICAtPkdldEF0KGNvbHVtZSkpDQorICAgICAgICAgIC0+c2V0VmFsdWUoY29kZXdvcmQtPmdldFZhbHVlKCkpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gYmFyY29kZU1hdHJpeDsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjppc1ZhbGlkQmFyY29kZUNvbHVtbigNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LA0KKyAgICBpbnQzMl90IGJhcmNvZGVDb2x1bW4pIHsNCisgIHJldHVybiBiYXJjb2RlQ29sdW1uID49IDAgJiYNCisgICAgICAgICBiYXJjb2RlQ29sdW1uIDw9IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCkgKyAxOw0KK30NCitpbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldFN0YXJ0Q29sdW1uKA0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25SZXN1bHQsDQorICAgIGludDMyX3QgYmFyY29kZUNvbHVtbiwNCisgICAgaW50MzJfdCBpbWFnZVJvdywNCisgICAgRlhfQk9PTCBsZWZ0VG9SaWdodCkgew0KKyAgaW50MzJfdCBvZmZzZXQgPSBsZWZ0VG9SaWdodCA/IDEgOiAtMTsNCisgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSBOVUxMOw0KKyAgaWYgKGlzVmFsaWRCYXJjb2RlQ29sdW1uKGRldGVjdGlvblJlc3VsdCwgYmFyY29kZUNvbHVtbiAtIG9mZnNldCkpIHsNCisgICAgY29kZXdvcmQgPSBkZXRlY3Rpb25SZXN1bHQtPmdldERldGVjdGlvblJlc3VsdENvbHVtbihiYXJjb2RlQ29sdW1uIC0gb2Zmc2V0KQ0KKyAgICAgICAgICAgICAgICAgICAtPmdldENvZGV3b3JkKGltYWdlUm93KTsNCisgIH0NCisgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBsZWZ0VG9SaWdodCA/IGNvZGV3b3JkLT5nZXRFbmRYKCkgOiBjb2Rld29yZC0+Z2V0U3RhcnRYKCk7DQorICB9DQorICBjb2Rld29yZCA9IGRldGVjdGlvblJlc3VsdC0+Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJhcmNvZGVDb2x1bW4pDQorICAgICAgICAgICAgICAgICAtPmdldENvZGV3b3JkTmVhcmJ5KGltYWdlUm93KTsNCisgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBsZWZ0VG9SaWdodCA/IGNvZGV3b3JkLT5nZXRTdGFydFgoKSA6IGNvZGV3b3JkLT5nZXRFbmRYKCk7DQorICB9DQorICBpZiAoaXNWYWxpZEJhcmNvZGVDb2x1bW4oZGV0ZWN0aW9uUmVzdWx0LCBiYXJjb2RlQ29sdW1uIC0gb2Zmc2V0KSkgew0KKyAgICBjb2Rld29yZCA9IGRldGVjdGlvblJlc3VsdC0+Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJhcmNvZGVDb2x1bW4gLSBvZmZzZXQpDQorICAgICAgICAgICAgICAgICAgIC0+Z2V0Q29kZXdvcmROZWFyYnkoaW1hZ2VSb3cpOw0KKyAgfQ0KKyAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIGxlZnRUb1JpZ2h0ID8gY29kZXdvcmQtPmdldEVuZFgoKSA6IGNvZGV3b3JkLT5nZXRTdGFydFgoKTsNCisgIH0NCisgIGludDMyX3Qgc2tpcHBlZENvbHVtbnMgPSAwOw0KKyAgd2hpbGUgKGlzVmFsaWRCYXJjb2RlQ29sdW1uKGRldGVjdGlvblJlc3VsdCwgYmFyY29kZUNvbHVtbiAtIG9mZnNldCkpIHsNCisgICAgYmFyY29kZUNvbHVtbiAtPSBvZmZzZXQ7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsNCisgICAgICAgICBpIDwgZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oYmFyY29kZUNvbHVtbikNCisgICAgICAgICAgICAgICAgIC0+Z2V0Q29kZXdvcmRzKCkNCisgICAgICAgICAgICAgICAgIC0+R2V0U2l6ZSgpOw0KKyAgICAgICAgIGkrKykgew0KKyAgICAgIENCQ19Db2Rld29yZCogcHJldmlvdXNSb3dDb2Rld29yZCA9DQorICAgICAgICAgIChDQkNfQ29kZXdvcmQqKWRldGVjdGlvblJlc3VsdC0+Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyY29kZUNvbHVtbikNCisgICAgICAgICAgICAgIC0+Z2V0Q29kZXdvcmRzKCkNCisgICAgICAgICAgICAgIC0+R2V0QXQoaSk7DQorICAgICAgaWYgKHByZXZpb3VzUm93Q29kZXdvcmQgIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIChsZWZ0VG9SaWdodCA/IHByZXZpb3VzUm93Q29kZXdvcmQtPmdldEVuZFgoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHByZXZpb3VzUm93Q29kZXdvcmQtPmdldFN0YXJ0WCgpKSArDQorICAgICAgICAgICAgICAgb2Zmc2V0ICogc2tpcHBlZENvbHVtbnMgKiAocHJldmlvdXNSb3dDb2Rld29yZC0+Z2V0RW5kWCgpIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1Jvd0NvZGV3b3JkLT5nZXRTdGFydFgoKSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHNraXBwZWRDb2x1bW5zKys7DQorICB9DQorICByZXR1cm4gbGVmdFRvUmlnaHQgPyBkZXRlY3Rpb25SZXN1bHQtPmdldEJvdW5kaW5nQm94KCktPmdldE1pblgoKQ0KKyAgICAgICAgICAgICAgICAgICAgIDogZGV0ZWN0aW9uUmVzdWx0LT5nZXRCb3VuZGluZ0JveCgpLT5nZXRNYXhYKCk7DQorfQ0KK0NCQ19Db2Rld29yZCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6ZGV0ZWN0Q29kZXdvcmQoDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICBpbnQzMl90IG1pbkNvbHVtbiwNCisgICAgaW50MzJfdCBtYXhDb2x1bW4sDQorICAgIEZYX0JPT0wgbGVmdFRvUmlnaHQsDQorICAgIGludDMyX3Qgc3RhcnRDb2x1bW4sDQorICAgIGludDMyX3QgaW1hZ2VSb3csDQorICAgIGludDMyX3QgbWluQ29kZXdvcmRXaWR0aCwNCisgICAgaW50MzJfdCBtYXhDb2Rld29yZFdpZHRoKSB7DQorICBzdGFydENvbHVtbiA9IGFkanVzdENvZGV3b3JkU3RhcnRDb2x1bW4oaW1hZ2UsIG1pbkNvbHVtbiwgbWF4Q29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRUb1JpZ2h0LCBzdGFydENvbHVtbiwgaW1hZ2VSb3cpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIG1vZHVsZUJpdENvdW50ID0gZ2V0TW9kdWxlQml0Q291bnQoDQorICAgICAgaW1hZ2UsIG1pbkNvbHVtbiwgbWF4Q29sdW1uLCBsZWZ0VG9SaWdodCwgc3RhcnRDb2x1bW4sIGltYWdlUm93KTsNCisgIGlmIChtb2R1bGVCaXRDb3VudCA9PSBOVUxMKSB7DQogICAgIHJldHVybiBOVUxMOw0KLX0NCi1pbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldE51bWJlck9mRUNDb2RlV29yZHMoaW50MzJfdCBiYXJjb2RlRUNMZXZlbCkNCi17DQotICAgIHJldHVybiAyIDw8IGJhcmNvZGVFQ0xldmVsOw0KLX0NCi1pbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmFkanVzdENvZGV3b3JkU3RhcnRDb2x1bW4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIGludDMyX3QgbWluQ29sdW1uLCBpbnQzMl90IG1heENvbHVtbiwgRlhfQk9PTCBsZWZ0VG9SaWdodCwgaW50MzJfdCBjb2Rld29yZFN0YXJ0Q29sdW1uLCBpbnQzMl90IGltYWdlUm93KQ0KLXsNCi0gICAgaW50MzJfdCBjb3JyZWN0ZWRTdGFydENvbHVtbiA9IGNvZGV3b3JkU3RhcnRDb2x1bW47DQotICAgIGludDMyX3QgaW5jcmVtZW50ID0gbGVmdFRvUmlnaHQgPyAtMSA6IDE7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykgew0KLSAgICAgICAgRlhfQk9PTCBsID0gaW1hZ2UtPkdldChjb3JyZWN0ZWRTdGFydENvbHVtbiwgaW1hZ2VSb3cpOw0KLSAgICAgICAgd2hpbGUgKCgobGVmdFRvUmlnaHQgJiYgY29ycmVjdGVkU3RhcnRDb2x1bW4gPj0gbWluQ29sdW1uKSB8fCAoIWxlZnRUb1JpZ2h0ICYmIGNvcnJlY3RlZFN0YXJ0Q29sdW1uIDwgbWF4Q29sdW1uKSkgJiYgbGVmdFRvUmlnaHQgPT0gaW1hZ2UtPkdldChjb3JyZWN0ZWRTdGFydENvbHVtbiwgaW1hZ2VSb3cpKSB7DQotICAgICAgICAgICAgaWYgKGFicyhjb2Rld29yZFN0YXJ0Q29sdW1uIC0gY29ycmVjdGVkU3RhcnRDb2x1bW4pID4gQ09ERVdPUkRfU0tFV19TSVpFKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb2Rld29yZFN0YXJ0Q29sdW1uOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb3JyZWN0ZWRTdGFydENvbHVtbiArPSBpbmNyZW1lbnQ7DQotICAgICAgICB9DQotICAgICAgICBpbmNyZW1lbnQgPSAtaW5jcmVtZW50Ow0KLSAgICAgICAgbGVmdFRvUmlnaHQgPSAhbGVmdFRvUmlnaHQ7DQorICB9DQorICBpbnQzMl90IGVuZENvbHVtbjsNCisgIGludDMyX3QgY29kZXdvcmRCaXRDb3VudCA9IENCQ19QREY0MTdDb21tb246OmdldEJpdENvdW50U3VtKCptb2R1bGVCaXRDb3VudCk7DQorICBpZiAobGVmdFRvUmlnaHQpIHsNCisgICAgZW5kQ29sdW1uID0gc3RhcnRDb2x1bW4gKyBjb2Rld29yZEJpdENvdW50Ow0KKyAgfSBlbHNlIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpPG1vZHVsZUJpdENvdW50LT5HZXRTaXplKCk+PiAxOyBpKyspIHsNCisgICAgICBpbnQzMl90IHRtcENvdW50ID0gbW9kdWxlQml0Q291bnQtPkdldEF0KGkpOw0KKyAgICAgIG1vZHVsZUJpdENvdW50LT5TZXRBdCgNCisgICAgICAgICAgaSwgbW9kdWxlQml0Q291bnQtPkdldEF0KG1vZHVsZUJpdENvdW50LT5HZXRTaXplKCkgLSAxIC0gaSkpOw0KKyAgICAgIG1vZHVsZUJpdENvdW50LT5TZXRBdChtb2R1bGVCaXRDb3VudC0+R2V0U2l6ZSgpIC0gMSAtIGksIHRtcENvdW50KTsNCiAgICAgfQ0KLSAgICByZXR1cm4gY29ycmVjdGVkU3RhcnRDb2x1bW47DQorICAgIGVuZENvbHVtbiA9IHN0YXJ0Q29sdW1uOw0KKyAgICBzdGFydENvbHVtbiA9IGVuZENvbHVtbiAtIGNvZGV3b3JkQml0Q291bnQ7DQorICB9DQorICBpbnQzMl90IGRlY29kZWRWYWx1ZSA9DQorICAgICAgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6Z2V0RGVjb2RlZFZhbHVlKCptb2R1bGVCaXRDb3VudCk7DQorICBpbnQzMl90IGNvZGV3b3JkID0gQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Q29kZXdvcmQoZGVjb2RlZFZhbHVlKTsNCisgIGRlbGV0ZSBtb2R1bGVCaXRDb3VudDsNCisgIGlmIChjb2Rld29yZCA9PSAtMSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBGWF9ORVcgQ0JDX0NvZGV3b3JkKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb2Rld29yZEJ1Y2tldE51bWJlcihkZWNvZGVkVmFsdWUpLCBjb2Rld29yZCk7DQogfQ0KLUZYX0JPT0wgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Y2hlY2tDb2Rld29yZFNrZXcoaW50MzJfdCBjb2Rld29yZFNpemUsIGludDMyX3QgbWluQ29kZXdvcmRXaWR0aCwgaW50MzJfdCBtYXhDb2Rld29yZFdpZHRoKQ0KLXsNCi0gICAgcmV0dXJuIG1pbkNvZGV3b3JkV2lkdGggLSBDT0RFV09SRF9TS0VXX1NJWkUgPD0gY29kZXdvcmRTaXplICYmIGNvZGV3b3JkU2l6ZSA8PSBtYXhDb2Rld29yZFdpZHRoICsgQ09ERVdPUkRfU0tFV19TSVpFOw0KLX0NCi1DQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6ZGVjb2RlQ29kZXdvcmRzKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIGludDMyX3QgZWNMZXZlbCwgQ0ZYX0ludDMyQXJyYXkgJmVyYXN1cmVzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKGNvZGV3b3Jkcy5HZXRTaXplKCkgPT0gMCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQotICAgICAgICByZXR1cm4gTlVMTDsNCitDRlhfSW50MzJBcnJheSogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Z2V0TW9kdWxlQml0Q291bnQoDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICBpbnQzMl90IG1pbkNvbHVtbiwNCisgICAgaW50MzJfdCBtYXhDb2x1bW4sDQorICAgIEZYX0JPT0wgbGVmdFRvUmlnaHQsDQorICAgIGludDMyX3Qgc3RhcnRDb2x1bW4sDQorICAgIGludDMyX3QgaW1hZ2VSb3cpIHsNCisgIGludDMyX3QgaW1hZ2VDb2x1bW4gPSBzdGFydENvbHVtbjsNCisgIENGWF9JbnQzMkFycmF5KiBtb2R1bGVCaXRDb3VudCA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCisgIG1vZHVsZUJpdENvdW50LT5TZXRTaXplKDgpOw0KKyAgaW50MzJfdCBtb2R1bGVOdW1iZXIgPSAwOw0KKyAgaW50MzJfdCBpbmNyZW1lbnQgPSBsZWZ0VG9SaWdodCA/IDEgOiAtMTsNCisgIEZYX0JPT0wgcHJldmlvdXNQaXhlbFZhbHVlID0gbGVmdFRvUmlnaHQ7DQorICB3aGlsZSAoKChsZWZ0VG9SaWdodCAmJiBpbWFnZUNvbHVtbiA8IG1heENvbHVtbikgfHwNCisgICAgICAgICAgKCFsZWZ0VG9SaWdodCAmJiBpbWFnZUNvbHVtbiA+PSBtaW5Db2x1bW4pKSAmJg0KKyAgICAgICAgIG1vZHVsZU51bWJlciA8IG1vZHVsZUJpdENvdW50LT5HZXRTaXplKCkpIHsNCisgICAgaWYgKGltYWdlLT5HZXQoaW1hZ2VDb2x1bW4sIGltYWdlUm93KSA9PSBwcmV2aW91c1BpeGVsVmFsdWUpIHsNCisgICAgICBtb2R1bGVCaXRDb3VudC0+U2V0QXQobW9kdWxlTnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVCaXRDb3VudC0+R2V0QXQobW9kdWxlTnVtYmVyKSArIDEpOw0KKyAgICAgIGltYWdlQ29sdW1uICs9IGluY3JlbWVudDsNCisgICAgfSBlbHNlIHsNCisgICAgICBtb2R1bGVOdW1iZXIrKzsNCisgICAgICBwcmV2aW91c1BpeGVsVmFsdWUgPSAhcHJldmlvdXNQaXhlbFZhbHVlOw0KICAgICB9DQotICAgIGludDMyX3QgbnVtRUNDb2Rld29yZHMgPSAxIDw8IChlY0xldmVsICsgMSk7DQotICAgIGludDMyX3QgY29ycmVjdGVkRXJyb3JzQ291bnQgPSBjb3JyZWN0RXJyb3JzKGNvZGV3b3JkcywgZXJhc3VyZXMsIG51bUVDQ29kZXdvcmRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUgLCBOVUxMKTsNCi0gICAgdmVyaWZ5Q29kZXdvcmRDb3VudChjb2Rld29yZHMsIG51bUVDQ29kZXdvcmRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nOw0KLSAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogZGVjb2RlclJlc3VsdCA9IENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OmRlY29kZShjb2Rld29yZHMsIGJ5dGVzdHJpbmcuRm9ybWF0SW50ZWdlcihlY0xldmVsKSwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgcmV0dXJuIGRlY29kZXJSZXN1bHQ7DQorICB9DQorICBpZiAobW9kdWxlTnVtYmVyID09IG1vZHVsZUJpdENvdW50LT5HZXRTaXplKCkgfHwNCisgICAgICAoKChsZWZ0VG9SaWdodCAmJiBpbWFnZUNvbHVtbiA9PSBtYXhDb2x1bW4pIHx8DQorICAgICAgICAoIWxlZnRUb1JpZ2h0ICYmIGltYWdlQ29sdW1uID09IG1pbkNvbHVtbikpICYmDQorICAgICAgIG1vZHVsZU51bWJlciA9PSBtb2R1bGVCaXRDb3VudC0+R2V0U2l6ZSgpIC0gMSkpIHsNCisgICAgcmV0dXJuIG1vZHVsZUJpdENvdW50Ow0KKyAgfQ0KKyAgZGVsZXRlIG1vZHVsZUJpdENvdW50Ow0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLWludDMyX3QgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Y29ycmVjdEVycm9ycyhDRlhfSW50MzJBcnJheSAmY29kZXdvcmRzLCBDRlhfSW50MzJBcnJheSAmZXJhc3VyZXMsIGludDMyX3QgbnVtRUNDb2Rld29yZHMsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoKGVyYXN1cmVzLkdldFNpemUoKSAhPSAwICYmIGVyYXN1cmVzLkdldFNpemUoKSA+IChudW1FQ0NvZGV3b3JkcyAvIDIgKyBNQVhfRVJST1JTKSkgfHwgbnVtRUNDb2Rld29yZHMgPCAwIHx8IG51bUVDQ29kZXdvcmRzID4gTUFYX0VDX0NPREVXT1JEUykgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1JbnN0YW5jZTsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHJlc3VsdCA9IENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6ZGVjb2RlKGNvZGV3b3JkcywgbnVtRUNDb2Rld29yZHMsIGVyYXN1cmVzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCi0gICAgcmV0dXJuIHJlc3VsdDsNCitpbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldE51bWJlck9mRUNDb2RlV29yZHMoDQorICAgIGludDMyX3QgYmFyY29kZUVDTGV2ZWwpIHsNCisgIHJldHVybiAyIDw8IGJhcmNvZGVFQ0xldmVsOw0KIH0NCi12b2lkIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OnZlcmlmeUNvZGV3b3JkQ291bnQoQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgaW50MzJfdCBudW1FQ0NvZGV3b3JkcywgaW50MzJfdCAmZSkNCi17DQotICAgIGlmIChjb2Rld29yZHMuR2V0U2l6ZSgpIDwgNCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQotICAgICAgICByZXR1cm47DQoraW50MzJfdCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjphZGp1c3RDb2Rld29yZFN0YXJ0Q29sdW1uKA0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgaW50MzJfdCBtaW5Db2x1bW4sDQorICAgIGludDMyX3QgbWF4Q29sdW1uLA0KKyAgICBGWF9CT09MIGxlZnRUb1JpZ2h0LA0KKyAgICBpbnQzMl90IGNvZGV3b3JkU3RhcnRDb2x1bW4sDQorICAgIGludDMyX3QgaW1hZ2VSb3cpIHsNCisgIGludDMyX3QgY29ycmVjdGVkU3RhcnRDb2x1bW4gPSBjb2Rld29yZFN0YXJ0Q29sdW1uOw0KKyAgaW50MzJfdCBpbmNyZW1lbnQgPSBsZWZ0VG9SaWdodCA/IC0xIDogMTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykgew0KKyAgICBGWF9CT09MIGwgPSBpbWFnZS0+R2V0KGNvcnJlY3RlZFN0YXJ0Q29sdW1uLCBpbWFnZVJvdyk7DQorICAgIHdoaWxlICgoKGxlZnRUb1JpZ2h0ICYmIGNvcnJlY3RlZFN0YXJ0Q29sdW1uID49IG1pbkNvbHVtbikgfHwNCisgICAgICAgICAgICAoIWxlZnRUb1JpZ2h0ICYmIGNvcnJlY3RlZFN0YXJ0Q29sdW1uIDwgbWF4Q29sdW1uKSkgJiYNCisgICAgICAgICAgIGxlZnRUb1JpZ2h0ID09IGltYWdlLT5HZXQoY29ycmVjdGVkU3RhcnRDb2x1bW4sIGltYWdlUm93KSkgew0KKyAgICAgIGlmIChhYnMoY29kZXdvcmRTdGFydENvbHVtbiAtIGNvcnJlY3RlZFN0YXJ0Q29sdW1uKSA+DQorICAgICAgICAgIENPREVXT1JEX1NLRVdfU0laRSkgew0KKyAgICAgICAgcmV0dXJuIGNvZGV3b3JkU3RhcnRDb2x1bW47DQorICAgICAgfQ0KKyAgICAgIGNvcnJlY3RlZFN0YXJ0Q29sdW1uICs9IGluY3JlbWVudDsNCiAgICAgfQ0KLSAgICBpbnQzMl90IG51bWJlck9mQ29kZXdvcmRzID0gY29kZXdvcmRzLkdldEF0KDApOw0KLSAgICBpZiAobnVtYmVyT2ZDb2Rld29yZHMgPiBjb2Rld29yZHMuR2V0U2l6ZSgpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAobnVtYmVyT2ZDb2Rld29yZHMgPT0gMCkgew0KLSAgICAgICAgaWYgKG51bUVDQ29kZXdvcmRzIDwgY29kZXdvcmRzLkdldFNpemUoKSkgew0KLSAgICAgICAgICAgIGNvZGV3b3Jkc1swXSA9IGNvZGV3b3Jkcy5HZXRTaXplKCkgLSBudW1FQ0NvZGV3b3JkczsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICAgIGluY3JlbWVudCA9IC1pbmNyZW1lbnQ7DQorICAgIGxlZnRUb1JpZ2h0ID0gIWxlZnRUb1JpZ2h0Ow0KKyAgfQ0KKyAgcmV0dXJuIGNvcnJlY3RlZFN0YXJ0Q29sdW1uOw0KIH0NCi1DRlhfSW50MzJBcnJheSogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Z2V0Qml0Q291bnRGb3JDb2Rld29yZChpbnQzMl90IGNvZGV3b3JkKQ0KLXsNCi0gICAgQ0ZYX0ludDMyQXJyYXkqIHJlc3VsdCA9IEZYX05FVyBDRlhfSW50MzJBcnJheTsNCi0gICAgcmVzdWx0LT5TZXRTaXplKDgpOw0KLSAgICBpbnQzMl90IHByZXZpb3VzVmFsdWUgPSAwOw0KLSAgICBpbnQzMl90IGkgPSByZXN1bHQtPkdldFNpemUoKSAtIDE7DQotICAgIHdoaWxlIChUUlVFKSB7DQotICAgICAgICBpZiAoKGNvZGV3b3JkICYgMHgxKSAhPSBwcmV2aW91c1ZhbHVlKSB7DQotICAgICAgICAgICAgcHJldmlvdXNWYWx1ZSA9IGNvZGV3b3JkICYgMHgxOw0KLSAgICAgICAgICAgIGktLTsNCi0gICAgICAgICAgICBpZiAoaSA8IDApIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmVzdWx0LT5TZXRBdChpLCByZXN1bHQtPkdldEF0KGkpICsgMSk7DQotICAgICAgICBjb2Rld29yZCA+Pj0gMTsNCitGWF9CT09MIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmNoZWNrQ29kZXdvcmRTa2V3KGludDMyX3QgY29kZXdvcmRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Db2Rld29yZFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhDb2Rld29yZFdpZHRoKSB7DQorICByZXR1cm4gbWluQ29kZXdvcmRXaWR0aCAtIENPREVXT1JEX1NLRVdfU0laRSA8PSBjb2Rld29yZFNpemUgJiYNCisgICAgICAgICBjb2Rld29yZFNpemUgPD0gbWF4Q29kZXdvcmRXaWR0aCArIENPREVXT1JEX1NLRVdfU0laRTsNCit9DQorQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmRlY29kZUNvZGV3b3JkcygNCisgICAgQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgaW50MzJfdCBlY0xldmVsLA0KKyAgICBDRlhfSW50MzJBcnJheSYgZXJhc3VyZXMsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjb2Rld29yZHMuR2V0U2l6ZSgpID09IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBudW1FQ0NvZGV3b3JkcyA9IDEgPDwgKGVjTGV2ZWwgKyAxKTsNCisgIGludDMyX3QgY29ycmVjdGVkRXJyb3JzQ291bnQgPQ0KKyAgICAgIGNvcnJlY3RFcnJvcnMoY29kZXdvcmRzLCBlcmFzdXJlcywgbnVtRUNDb2Rld29yZHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgdmVyaWZ5Q29kZXdvcmRDb3VudChjb2Rld29yZHMsIG51bUVDQ29kZXdvcmRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHJpbmc7DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogZGVjb2RlclJlc3VsdCA9IENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OmRlY29kZSgNCisgICAgICBjb2Rld29yZHMsIGJ5dGVzdHJpbmcuRm9ybWF0SW50ZWdlcihlY0xldmVsKSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gZGVjb2RlclJlc3VsdDsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpjb3JyZWN0RXJyb3JzKENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBlcmFzdXJlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1FQ0NvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKChlcmFzdXJlcy5HZXRTaXplKCkgIT0gMCAmJg0KKyAgICAgICBlcmFzdXJlcy5HZXRTaXplKCkgPiAobnVtRUNDb2Rld29yZHMgLyAyICsgTUFYX0VSUk9SUykpIHx8DQorICAgICAgbnVtRUNDb2Rld29yZHMgPCAwIHx8IG51bUVDQ29kZXdvcmRzID4gTUFYX0VDX0NPREVXT1JEUykgew0KKyAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUluc3RhbmNlOw0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpbnQzMl90IHJlc3VsdCA9IENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6ZGVjb2RlKA0KKyAgICAgIGNvZGV3b3JkcywgbnVtRUNDb2Rld29yZHMsIGVyYXN1cmVzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAtMSk7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCit2b2lkIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OnZlcmlmeUNvZGV3b3JkQ291bnQoQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1FQ0NvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvZGV3b3Jkcy5HZXRTaXplKCkgPCA0KSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IG51bWJlck9mQ29kZXdvcmRzID0gY29kZXdvcmRzLkdldEF0KDApOw0KKyAgaWYgKG51bWJlck9mQ29kZXdvcmRzID4gY29kZXdvcmRzLkdldFNpemUoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG51bWJlck9mQ29kZXdvcmRzID09IDApIHsNCisgICAgaWYgKG51bUVDQ29kZXdvcmRzIDwgY29kZXdvcmRzLkdldFNpemUoKSkgew0KKyAgICAgIGNvZGV3b3Jkc1swXSA9IGNvZGV3b3Jkcy5HZXRTaXplKCkgLSBudW1FQ0NvZGV3b3JkczsNCisgICAgfSBlbHNlIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCisgICAgICByZXR1cm47DQogICAgIH0NCi0gICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCiB9DQotaW50MzJfdCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpnZXRDb2Rld29yZEJ1Y2tldE51bWJlcihpbnQzMl90IGNvZGV3b3JkKQ0KLXsNCi0gICAgQ0ZYX0ludDMyQXJyYXkqIGFycmF5ID0gZ2V0Qml0Q291bnRGb3JDb2Rld29yZChjb2Rld29yZCk7DQotICAgIGludDMyX3QgcmVzdWx0ID0gZ2V0Q29kZXdvcmRCdWNrZXROdW1iZXIoKmFycmF5KTsNCi0gICAgZGVsZXRlIGFycmF5Ow0KLSAgICByZXR1cm4gcmVzdWx0Ow0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpnZXRCaXRDb3VudEZvckNvZGV3b3JkKA0KKyAgICBpbnQzMl90IGNvZGV3b3JkKSB7DQorICBDRlhfSW50MzJBcnJheSogcmVzdWx0ID0gRlhfTkVXIENGWF9JbnQzMkFycmF5Ow0KKyAgcmVzdWx0LT5TZXRTaXplKDgpOw0KKyAgaW50MzJfdCBwcmV2aW91c1ZhbHVlID0gMDsNCisgIGludDMyX3QgaSA9IHJlc3VsdC0+R2V0U2l6ZSgpIC0gMTsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGlmICgoY29kZXdvcmQgJiAweDEpICE9IHByZXZpb3VzVmFsdWUpIHsNCisgICAgICBwcmV2aW91c1ZhbHVlID0gY29kZXdvcmQgJiAweDE7DQorICAgICAgaS0tOw0KKyAgICAgIGlmIChpIDwgMCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJlc3VsdC0+U2V0QXQoaSwgcmVzdWx0LT5HZXRBdChpKSArIDEpOw0KKyAgICBjb2Rld29yZCA+Pj0gMTsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQogfQ0KLWludDMyX3QgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Z2V0Q29kZXdvcmRCdWNrZXROdW1iZXIoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KQ0KLXsNCi0gICAgcmV0dXJuIChtb2R1bGVCaXRDb3VudC5HZXRBdCgwKSAtIG1vZHVsZUJpdENvdW50LkdldEF0KDIpICsgbW9kdWxlQml0Q291bnQuR2V0QXQoNCkgLSBtb2R1bGVCaXRDb3VudC5HZXRBdCg2KSArIDkpICUgOTsNCitpbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldENvZGV3b3JkQnVja2V0TnVtYmVyKGludDMyX3QgY29kZXdvcmQpIHsNCisgIENGWF9JbnQzMkFycmF5KiBhcnJheSA9IGdldEJpdENvdW50Rm9yQ29kZXdvcmQoY29kZXdvcmQpOw0KKyAgaW50MzJfdCByZXN1bHQgPSBnZXRDb2Rld29yZEJ1Y2tldE51bWJlcigqYXJyYXkpOw0KKyAgZGVsZXRlIGFycmF5Ow0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpnZXRDb2Rld29yZEJ1Y2tldE51bWJlcigNCisgICAgQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KSB7DQorICByZXR1cm4gKG1vZHVsZUJpdENvdW50LkdldEF0KDApIC0gbW9kdWxlQml0Q291bnQuR2V0QXQoMikgKw0KKyAgICAgICAgICBtb2R1bGVCaXRDb3VudC5HZXRBdCg0KSAtIG1vZHVsZUJpdENvdW50LkdldEF0KDYpICsgOSkgJQ0KKyAgICAgICAgIDk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdTY2FubmluZ0RlY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdTY2FubmluZ0RlY29kZXIuaAppbmRleCAxMDIyMjg4Li5lOGFjMmI0IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5oCkBAIC0xNyw0NSArMTcsMTAzIEBACiBjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0Ow0KIGNsYXNzIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW47DQogDQotY2xhc3MgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXIoKTsNCi0gICAgdmlydHVhbCB+Q0JDX1BERjQxN1NjYW5uaW5nRGVjb2RlcigpOw0KLSAgICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQotICAgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQotICAgIHN0YXRpYyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogZGVjb2RlKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLCBDQkNfUmVzdWx0UG9pbnQqIGltYWdlVG9wTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBpbWFnZUJvdHRvbUxlZnQsIENCQ19SZXN1bHRQb2ludCogaW1hZ2VUb3BSaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBpbWFnZUJvdHRvbVJpZ2h0LCBpbnQzMl90IG1pbkNvZGV3b3JkV2lkdGgsIGludDMyX3QgbWF4Q29kZXdvcmRXaWR0aCwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyB0b1N0cmluZyhDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXgpOw0KLXByaXZhdGU6DQotICAgIHN0YXRpYyBpbnQzMl90IENPREVXT1JEX1NLRVdfU0laRTsNCi0gICAgc3RhdGljIGludDMyX3QgTUFYX0VSUk9SUzsNCi0gICAgc3RhdGljIGludDMyX3QgTUFYX0VDX0NPREVXT1JEUzsNCi0gICAgc3RhdGljIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbiogZXJyb3JDb3JyZWN0aW9uOw0KLSAgICBzdGF0aWMgQ0JDX0RldGVjdGlvblJlc3VsdCogbWVyZ2UoQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiwgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4sIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0JDX0JvdW5kaW5nQm94KiBhZGp1c3RCb3VuZGluZ0JveChDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByb3dJbmRpY2F0b3JDb2x1bW4sIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBnZXRNYXgoQ0ZYX0ludDMyQXJyYXkmIHZhbHVlcyk7DQotICAgIHN0YXRpYyBDQkNfQmFyY29kZU1ldGFkYXRhKiBnZXRCYXJjb2RlTWV0YWRhdGEoQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiwgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4pOw0KLSAgICBzdGF0aWMgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogZ2V0Um93SW5kaWNhdG9yQ29sdW1uKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLCBDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94LCBDQkNfUmVzdWx0UG9pbnQgc3RhcnRQb2ludCwNCi0gICAgICAgICAgICBGWF9CT09MIGxlZnRUb1JpZ2h0LCBpbnQzMl90IG1pbkNvZGV3b3JkV2lkdGgsIGludDMyX3QgbWF4Q29kZXdvcmRXaWR0aCk7DQotICAgIHN0YXRpYyB2b2lkIGFkanVzdENvZGV3b3JkQ291bnQoQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LCBDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXgsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIGNyZWF0ZURlY29kZXJSZXN1bHQoQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBjcmVhdGVEZWNvZGVyUmVzdWx0RnJvbUFtYmlndW91c1ZhbHVlcyhpbnQzMl90IGVjTGV2ZWwsIENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIENGWF9JbnQzMkFycmF5ICZlcmFzdXJlQXJyYXksIENGWF9JbnQzMkFycmF5ICZhbWJpZ3VvdXNJbmRleGVzLA0KLSAgICAgICAgICAgIENGWF9QdHJBcnJheSYgYW1iaWd1b3VzSW5kZXhWYWx1ZXMsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0ZYX1B0ckFycmF5KiBjcmVhdGVCYXJjb2RlTWF0cml4KENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCk7DQotICAgIHN0YXRpYyBGWF9CT09MIGlzVmFsaWRCYXJjb2RlQ29sdW1uKENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCwgaW50MzJfdCBiYXJjb2RlQ29sdW1uKTsNCi0gICAgc3RhdGljIGludDMyX3QgZ2V0U3RhcnRDb2x1bW4oQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LCBpbnQzMl90IGJhcmNvZGVDb2x1bW4sIGludDMyX3QgaW1hZ2VSb3csIEZYX0JPT0wgbGVmdFRvUmlnaHQpOw0KLSAgICBzdGF0aWMgQ0JDX0NvZGV3b3JkKiBkZXRlY3RDb2Rld29yZChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwgaW50MzJfdCBtaW5Db2x1bW4sIGludDMyX3QgbWF4Q29sdW1uLCBGWF9CT09MIGxlZnRUb1JpZ2h0LCBpbnQzMl90IHN0YXJ0Q29sdW1uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGltYWdlUm93LCBpbnQzMl90IG1pbkNvZGV3b3JkV2lkdGgsIGludDMyX3QgbWF4Q29kZXdvcmRXaWR0aCk7DQotICAgIHN0YXRpYyBDRlhfSW50MzJBcnJheSogZ2V0TW9kdWxlQml0Q291bnQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIGludDMyX3QgbWluQ29sdW1uLCBpbnQzMl90IG1heENvbHVtbiwgRlhfQk9PTCBsZWZ0VG9SaWdodCwgaW50MzJfdCBzdGFydENvbHVtbiwgaW50MzJfdCBpbWFnZVJvdyk7DQotICAgIHN0YXRpYyBpbnQzMl90IGdldE51bWJlck9mRUNDb2RlV29yZHMoaW50MzJfdCBiYXJjb2RlRUNMZXZlbCk7DQotICAgIHN0YXRpYyBpbnQzMl90IGFkanVzdENvZGV3b3JkU3RhcnRDb2x1bW4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsIGludDMyX3QgbWluQ29sdW1uLCBpbnQzMl90IG1heENvbHVtbiwgRlhfQk9PTCBsZWZ0VG9SaWdodCwgaW50MzJfdCBjb2Rld29yZFN0YXJ0Q29sdW1uLCBpbnQzMl90IGltYWdlUm93KTsNCi0gICAgc3RhdGljIEZYX0JPT0wgY2hlY2tDb2Rld29yZFNrZXcoaW50MzJfdCBjb2Rld29yZFNpemUsIGludDMyX3QgbWluQ29kZXdvcmRXaWR0aCwgaW50MzJfdCBtYXhDb2Rld29yZFdpZHRoKTsNCi0gICAgc3RhdGljIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBkZWNvZGVDb2Rld29yZHMoQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgaW50MzJfdCBlY0xldmVsLCBDRlhfSW50MzJBcnJheSAmZXJhc3VyZXMsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBjb3JyZWN0RXJyb3JzKENGWF9JbnQzMkFycmF5ICZjb2Rld29yZHMsIENGWF9JbnQzMkFycmF5ICZlcmFzdXJlcywgaW50MzJfdCBudW1FQ0NvZGV3b3JkcywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIHZlcmlmeUNvZGV3b3JkQ291bnQoQ0ZYX0ludDMyQXJyYXkgJmNvZGV3b3JkcywgaW50MzJfdCBudW1FQ0NvZGV3b3JkcywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyBDRlhfSW50MzJBcnJheSogZ2V0Qml0Q291bnRGb3JDb2Rld29yZChpbnQzMl90IGNvZGV3b3JkKTsNCi0gICAgc3RhdGljIGludDMyX3QgZ2V0Q29kZXdvcmRCdWNrZXROdW1iZXIoaW50MzJfdCBjb2Rld29yZCk7DQotICAgIHN0YXRpYyBpbnQzMl90IGdldENvZGV3b3JkQnVja2V0TnVtYmVyKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCk7DQorY2xhc3MgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2RlciB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdTY2FubmluZ0RlY29kZXIoKTsNCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBzdGF0aWMgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIGRlY29kZShDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogaW1hZ2VUb3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBpbWFnZUJvdHRvbUxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGltYWdlVG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGltYWdlQm90dG9tUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbkNvZGV3b3JkV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heENvZGV3b3JkV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyB0b1N0cmluZyhDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXgpOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIGludDMyX3QgQ09ERVdPUkRfU0tFV19TSVpFOw0KKyAgc3RhdGljIGludDMyX3QgTUFYX0VSUk9SUzsNCisgIHN0YXRpYyBpbnQzMl90IE1BWF9FQ19DT0RFV09SRFM7DQorICBzdGF0aWMgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uKiBlcnJvckNvcnJlY3Rpb247DQorICBzdGF0aWMgQ0JDX0RldGVjdGlvblJlc3VsdCogbWVyZ2UoDQorICAgICAgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiwNCisgICAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByaWdodFJvd0luZGljYXRvckNvbHVtbiwNCisgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDQkNfQm91bmRpbmdCb3gqIGFkanVzdEJvdW5kaW5nQm94KA0KKyAgICAgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIHJvd0luZGljYXRvckNvbHVtbiwNCisgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldE1heChDRlhfSW50MzJBcnJheSYgdmFsdWVzKTsNCisgIHN0YXRpYyBDQkNfQmFyY29kZU1ldGFkYXRhKiBnZXRCYXJjb2RlTWV0YWRhdGEoDQorICAgICAgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiwNCisgICAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByaWdodFJvd0luZGljYXRvckNvbHVtbik7DQorICBzdGF0aWMgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogZ2V0Um93SW5kaWNhdG9yQ29sdW1uKA0KKyAgICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gsDQorICAgICAgQ0JDX1Jlc3VsdFBvaW50IHN0YXJ0UG9pbnQsDQorICAgICAgRlhfQk9PTCBsZWZ0VG9SaWdodCwNCisgICAgICBpbnQzMl90IG1pbkNvZGV3b3JkV2lkdGgsDQorICAgICAgaW50MzJfdCBtYXhDb2Rld29yZFdpZHRoKTsNCisgIHN0YXRpYyB2b2lkIGFkanVzdENvZGV3b3JkQ291bnQoQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBjcmVhdGVEZWNvZGVyUmVzdWx0KA0KKyAgICAgIENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCwNCisgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogY3JlYXRlRGVjb2RlclJlc3VsdEZyb21BbWJpZ3VvdXNWYWx1ZXMoDQorICAgICAgaW50MzJfdCBlY0xldmVsLA0KKyAgICAgIENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgQ0ZYX0ludDMyQXJyYXkmIGVyYXN1cmVBcnJheSwNCisgICAgICBDRlhfSW50MzJBcnJheSYgYW1iaWd1b3VzSW5kZXhlcywNCisgICAgICBDRlhfUHRyQXJyYXkmIGFtYmlndW91c0luZGV4VmFsdWVzLA0KKyAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENGWF9QdHJBcnJheSogY3JlYXRlQmFyY29kZU1hdHJpeCgNCisgICAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25SZXN1bHQpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNWYWxpZEJhcmNvZGVDb2x1bW4oQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJjb2RlQ29sdW1uKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldFN0YXJ0Q29sdW1uKENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyY29kZUNvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW1hZ2VSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGxlZnRUb1JpZ2h0KTsNCisgIHN0YXRpYyBDQkNfQ29kZXdvcmQqIGRldGVjdENvZGV3b3JkKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Db2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heENvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgbGVmdFRvUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0Q29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbWFnZVJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluQ29kZXdvcmRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4Q29kZXdvcmRXaWR0aCk7DQorICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIGdldE1vZHVsZUJpdENvdW50KENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbkNvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhDb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgbGVmdFRvUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRDb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW1hZ2VSb3cpOw0KKyAgc3RhdGljIGludDMyX3QgZ2V0TnVtYmVyT2ZFQ0NvZGVXb3JkcyhpbnQzMl90IGJhcmNvZGVFQ0xldmVsKTsNCisgIHN0YXRpYyBpbnQzMl90IGFkanVzdENvZGV3b3JkU3RhcnRDb2x1bW4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluQ29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heENvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBsZWZ0VG9SaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2Rld29yZFN0YXJ0Q29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGltYWdlUm93KTsNCisgIHN0YXRpYyBGWF9CT09MIGNoZWNrQ29kZXdvcmRTa2V3KGludDMyX3QgY29kZXdvcmRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Db2Rld29yZFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhDb2Rld29yZFdpZHRoKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogZGVjb2RlQ29kZXdvcmRzKENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgZXJhc3VyZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBpbnQzMl90IGNvcnJlY3RFcnJvcnMoQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGVyYXN1cmVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUVDQ29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIHZlcmlmeUNvZGV3b3JkQ291bnQoQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1FQ0NvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIGdldEJpdENvdW50Rm9yQ29kZXdvcmQoaW50MzJfdCBjb2Rld29yZCk7DQorICBzdGF0aWMgaW50MzJfdCBnZXRDb2Rld29yZEJ1Y2tldE51bWJlcihpbnQzMl90IGNvZGV3b3JkKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldENvZGV3b3JkQnVja2V0TnVtYmVyKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3V3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuY3BwCmluZGV4IDZkZDRhODIuLmIzMjYzZjUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuY3BwCkBAIC0yOCw5OSArMjgsMTA3IEBACiAjaW5jbHVkZSAiQkNfUERGNDE3LmgiDQogI2luY2x1ZGUgIkJDX1BERjQxN0JhcmNvZGVNYXRyaXguaCINCiAjaW5jbHVkZSAiQkNfUERGNDE3V3JpdGVyLmgiDQotQ0JDX1BERjQxN1dyaXRlcjo6Q0JDX1BERjQxN1dyaXRlcigpDQotew0KLSAgICBtX2JGaXhlZFNpemUgPSBGQUxTRTsNCitDQkNfUERGNDE3V3JpdGVyOjpDQkNfUERGNDE3V3JpdGVyKCkgew0KKyAgbV9iRml4ZWRTaXplID0gRkFMU0U7DQogfQ0KLUNCQ19QREY0MTdXcml0ZXI6On5DQkNfUERGNDE3V3JpdGVyKCkNCi17DQotICAgIG1fYlRydW5jYXRlZCA9IFRSVUU7DQorQ0JDX1BERjQxN1dyaXRlcjo6fkNCQ19QREY0MTdXcml0ZXIoKSB7DQorICBtX2JUcnVuY2F0ZWQgPSBUUlVFOw0KIH0NCi1GWF9CT09MCUNCQ19QREY0MTdXcml0ZXI6OiBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKQ0KLXsNCi0gICAgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IDgpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX2lDb3JyZWN0TGV2ZWwgPSBsZXZlbDsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDQkNfUERGNDE3V3JpdGVyOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSB7DQorICBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gOCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2lDb3JyZWN0TGV2ZWwgPSBsZXZlbDsNCisgIHJldHVybiBUUlVFOw0KIH0NCi12b2lkIENCQ19QREY0MTdXcml0ZXI6OlNldFRydW5jYXRlZChGWF9CT09MIHRydW5jYXRlZCkNCi17DQotICAgIG1fYlRydW5jYXRlZCA9IHRydW5jYXRlZDsNCit2b2lkIENCQ19QREY0MTdXcml0ZXI6OlNldFRydW5jYXRlZChGWF9CT09MIHRydW5jYXRlZCkgew0KKyAgbV9iVHJ1bmNhdGVkID0gdHJ1bmNhdGVkOw0KIH0NCi11aW50OF90KiBDQkNfUERGNDE3V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgJmUpDQotew0KLSAgICBpZiAoIGZvcm1hdCAhPSBCQ0ZPUk1BVF9QREZfNDE3KSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9IGNvbnRlbnRzLlVURjhEZWNvZGUoKTsNCi0gICAgcmV0dXJuIEVuY29kZShlbmNvZGVDb250ZW50cywgb3V0V2lkdGgsIG91dEhlaWdodCwgZSApOw0KLX0NCi11aW50OF90KiBDQkNfUERGNDE3V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnRzLCBCQ0ZPUk1BVCBmb3JtYXQsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpDQotew0KK3VpbnQ4X3QqIENCQ19QREY0MTdXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGZvcm1hdCAhPSBCQ0ZPUk1BVF9QREZfNDE3KSB7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPSBjb250ZW50cy5VVEY4RGVjb2RlKCk7DQorICByZXR1cm4gRW5jb2RlKGVuY29kZUNvbnRlbnRzLCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCiB9DQotdWludDhfdCogQ0JDX1BERjQxN1dyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZjb250ZW50cywgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19QREY0MTcgZW5jb2RlcjsNCi0gICAgaW50MzJfdCBjb2wgPSAobV9XaWR0aCAvIG1fTW9kdWxlV2lkdGggLSA2OSkgLyAxNzsNCi0gICAgaW50MzJfdCByb3cgPSBtX0hlaWdodCAvIChtX01vZHVsZVdpZHRoICogMjApOw0KLSAgICBpZiAocm93ID49IDMgJiYgcm93IDw9IDkwICYmIGNvbCA+PSAxICYmIGNvbCA8PSAzMCkgew0KLSAgICAgICAgZW5jb2Rlci5zZXREaW1lbnNpb25zKGNvbCwgY29sLCByb3csIHJvdyk7DQotICAgIH0gZWxzZSBpZiAoY29sID49IDEgJiYgY29sIDw9IDMwKSB7DQotICAgICAgICBlbmNvZGVyLnNldERpbWVuc2lvbnMoY29sLCBjb2wsIDkwLCAzKTsNCi0gICAgfSBlbHNlIGlmIChyb3cgPj0gMyAmJiByb3cgPD0gOTApIHsNCi0gICAgICAgIGVuY29kZXIuc2V0RGltZW5zaW9ucygzMCwgMSwgcm93LCByb3cpOw0KLSAgICB9DQotICAgIGVuY29kZXIuZ2VuZXJhdGVCYXJjb2RlTG9naWMoY29udGVudHMsIG1faUNvcnJlY3RMZXZlbCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAgTlVMTCk7DQotICAgIGludDMyX3QgbGluZVRoaWNrbmVzcyA9IDI7DQotICAgIGludDMyX3QgYXNwZWN0UmF0aW8gPSA0Ow0KLSAgICBDQkNfQmFyY29kZU1hdHJpeCogYmFyY29kZU1hdHJpeCA9IGVuY29kZXIuZ2V0QmFyY29kZU1hdHJpeCgpOw0KLSAgICBDRlhfQnl0ZUFycmF5IG9yaWdpbmFsU2NhbGU7DQotICAgIG9yaWdpbmFsU2NhbGUuQ29weShiYXJjb2RlTWF0cml4LT5nZXRTY2FsZWRNYXRyaXgobGluZVRoaWNrbmVzcywgYXNwZWN0UmF0aW8gKiBsaW5lVGhpY2tuZXNzKSk7DQotICAgIGludDMyX3Qgd2lkdGggPSBvdXRXaWR0aDsNCi0gICAgaW50MzJfdCBoZWlnaHQgPSBvdXRIZWlnaHQ7DQotICAgIG91dFdpZHRoID0gYmFyY29kZU1hdHJpeC0+Z2V0V2lkdGgoKTsNCi0gICAgb3V0SGVpZ2h0ID0gYmFyY29kZU1hdHJpeC0+Z2V0SGVpZ2h0KCk7DQotICAgIEZYX0JPT0wgcm90YXRlZCA9IEZBTFNFOw0KLSAgICBpZiAoKGhlaWdodCA+IHdpZHRoKSBeIChvdXRXaWR0aCA8IG91dEhlaWdodCkpIHsNCi0gICAgICAgIHJvdGF0ZUFycmF5KG9yaWdpbmFsU2NhbGUsIG91dEhlaWdodCwgb3V0V2lkdGgpOw0KLSAgICAgICAgcm90YXRlZCA9IFRSVUU7DQotICAgICAgICBpbnQzMl90IHRlbXAgPSBvdXRIZWlnaHQ7DQotICAgICAgICBvdXRIZWlnaHQgPSBvdXRXaWR0aDsNCi0gICAgICAgIG91dFdpZHRoID0gdGVtcDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHNjYWxlWCA9IHdpZHRoIC8gb3V0V2lkdGg7DQotICAgIGludDMyX3Qgc2NhbGVZID0gaGVpZ2h0IC8gb3V0SGVpZ2h0Ow0KLSAgICBpbnQzMl90IHNjYWxlOw0KLSAgICBpZiAoc2NhbGVYIDwgc2NhbGVZKSB7DQotICAgICAgICBzY2FsZSA9IHNjYWxlWDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHNjYWxlID0gc2NhbGVZOw0KLSAgICB9DQotICAgIGlmIChzY2FsZSA+IDEpIHsNCi0gICAgICAgIG9yaWdpbmFsU2NhbGUuUmVtb3ZlQWxsKCk7DQotICAgICAgICBvcmlnaW5hbFNjYWxlLkNvcHkoYmFyY29kZU1hdHJpeC0+Z2V0U2NhbGVkTWF0cml4KHNjYWxlICogbGluZVRoaWNrbmVzcywgc2NhbGUgKiBhc3BlY3RSYXRpbyAqIGxpbmVUaGlja25lc3MpKTsNCi0gICAgICAgIGlmIChyb3RhdGVkKSB7DQotICAgICAgICAgICAgcm90YXRlQXJyYXkob3JpZ2luYWxTY2FsZSwgb3V0SGVpZ2h0LCBvdXRXaWR0aCk7DQotICAgICAgICAgICAgaW50MzJfdCB0ZW1wID0gb3V0SGVpZ2h0Ow0KLSAgICAgICAgICAgIG91dEhlaWdodCA9IG91dFdpZHRoOw0KLSAgICAgICAgICAgIG91dFdpZHRoID0gdGVtcDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB1aW50OF90KiByZXN1bHQgPSAodWludDhfdCopRlhfQWxsb2ModWludDhfdCwgb3V0SGVpZ2h0ICogb3V0V2lkdGgpOw0KLSAgICBGWFNZU19tZW1jcHkocmVzdWx0LCBvcmlnaW5hbFNjYWxlLkdldERhdGEoKSwgb3V0SGVpZ2h0ICogb3V0V2lkdGgpOw0KLSAgICByZXR1cm4gcmVzdWx0Ow0KK3VpbnQ4X3QqIENCQ19QREY0MTdXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLXZvaWQgQ0JDX1BERjQxN1dyaXRlcjo6cm90YXRlQXJyYXkoQ0ZYX0J5dGVBcnJheSYgYml0YXJyYXksIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHdpZHRoKQ0KLXsNCi0gICAgQ0ZYX0J5dGVBcnJheSB0ZW1wOw0KLSAgICB0ZW1wLkNvcHkoYml0YXJyYXkpOw0KLSAgICBmb3IgKGludDMyX3QgaWkgPSAwOyBpaSA8IGhlaWdodDsgaWkrKykgew0KLSAgICAgICAgaW50MzJfdCBpbnZlcnNlaWkgPSBoZWlnaHQgLSBpaSAtIDE7DQotICAgICAgICBmb3IgKGludDMyX3QgamogPSAwOyBqaiA8IHdpZHRoOyBqaisrKSB7DQotICAgICAgICAgICAgYml0YXJyYXlbamogKiBoZWlnaHQgKyBpbnZlcnNlaWldID0gdGVtcFtpaSAqIHdpZHRoICsgampdOw0KLSAgICAgICAgfQ0KK3VpbnQ4X3QqIENCQ19QREY0MTdXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19QREY0MTcgZW5jb2RlcjsNCisgIGludDMyX3QgY29sID0gKG1fV2lkdGggLyBtX01vZHVsZVdpZHRoIC0gNjkpIC8gMTc7DQorICBpbnQzMl90IHJvdyA9IG1fSGVpZ2h0IC8gKG1fTW9kdWxlV2lkdGggKiAyMCk7DQorICBpZiAocm93ID49IDMgJiYgcm93IDw9IDkwICYmIGNvbCA+PSAxICYmIGNvbCA8PSAzMCkgew0KKyAgICBlbmNvZGVyLnNldERpbWVuc2lvbnMoY29sLCBjb2wsIHJvdywgcm93KTsNCisgIH0gZWxzZSBpZiAoY29sID49IDEgJiYgY29sIDw9IDMwKSB7DQorICAgIGVuY29kZXIuc2V0RGltZW5zaW9ucyhjb2wsIGNvbCwgOTAsIDMpOw0KKyAgfSBlbHNlIGlmIChyb3cgPj0gMyAmJiByb3cgPD0gOTApIHsNCisgICAgZW5jb2Rlci5zZXREaW1lbnNpb25zKDMwLCAxLCByb3csIHJvdyk7DQorICB9DQorICBlbmNvZGVyLmdlbmVyYXRlQmFyY29kZUxvZ2ljKGNvbnRlbnRzLCBtX2lDb3JyZWN0TGV2ZWwsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgaW50MzJfdCBsaW5lVGhpY2tuZXNzID0gMjsNCisgIGludDMyX3QgYXNwZWN0UmF0aW8gPSA0Ow0KKyAgQ0JDX0JhcmNvZGVNYXRyaXgqIGJhcmNvZGVNYXRyaXggPSBlbmNvZGVyLmdldEJhcmNvZGVNYXRyaXgoKTsNCisgIENGWF9CeXRlQXJyYXkgb3JpZ2luYWxTY2FsZTsNCisgIG9yaWdpbmFsU2NhbGUuQ29weShiYXJjb2RlTWF0cml4LT5nZXRTY2FsZWRNYXRyaXgoDQorICAgICAgbGluZVRoaWNrbmVzcywgYXNwZWN0UmF0aW8gKiBsaW5lVGhpY2tuZXNzKSk7DQorICBpbnQzMl90IHdpZHRoID0gb3V0V2lkdGg7DQorICBpbnQzMl90IGhlaWdodCA9IG91dEhlaWdodDsNCisgIG91dFdpZHRoID0gYmFyY29kZU1hdHJpeC0+Z2V0V2lkdGgoKTsNCisgIG91dEhlaWdodCA9IGJhcmNvZGVNYXRyaXgtPmdldEhlaWdodCgpOw0KKyAgRlhfQk9PTCByb3RhdGVkID0gRkFMU0U7DQorICBpZiAoKGhlaWdodCA+IHdpZHRoKSBeIChvdXRXaWR0aCA8IG91dEhlaWdodCkpIHsNCisgICAgcm90YXRlQXJyYXkob3JpZ2luYWxTY2FsZSwgb3V0SGVpZ2h0LCBvdXRXaWR0aCk7DQorICAgIHJvdGF0ZWQgPSBUUlVFOw0KKyAgICBpbnQzMl90IHRlbXAgPSBvdXRIZWlnaHQ7DQorICAgIG91dEhlaWdodCA9IG91dFdpZHRoOw0KKyAgICBvdXRXaWR0aCA9IHRlbXA7DQorICB9DQorICBpbnQzMl90IHNjYWxlWCA9IHdpZHRoIC8gb3V0V2lkdGg7DQorICBpbnQzMl90IHNjYWxlWSA9IGhlaWdodCAvIG91dEhlaWdodDsNCisgIGludDMyX3Qgc2NhbGU7DQorICBpZiAoc2NhbGVYIDwgc2NhbGVZKSB7DQorICAgIHNjYWxlID0gc2NhbGVYOw0KKyAgfSBlbHNlIHsNCisgICAgc2NhbGUgPSBzY2FsZVk7DQorICB9DQorICBpZiAoc2NhbGUgPiAxKSB7DQorICAgIG9yaWdpbmFsU2NhbGUuUmVtb3ZlQWxsKCk7DQorICAgIG9yaWdpbmFsU2NhbGUuQ29weShiYXJjb2RlTWF0cml4LT5nZXRTY2FsZWRNYXRyaXgoDQorICAgICAgICBzY2FsZSAqIGxpbmVUaGlja25lc3MsIHNjYWxlICogYXNwZWN0UmF0aW8gKiBsaW5lVGhpY2tuZXNzKSk7DQorICAgIGlmIChyb3RhdGVkKSB7DQorICAgICAgcm90YXRlQXJyYXkob3JpZ2luYWxTY2FsZSwgb3V0SGVpZ2h0LCBvdXRXaWR0aCk7DQorICAgICAgaW50MzJfdCB0ZW1wID0gb3V0SGVpZ2h0Ow0KKyAgICAgIG91dEhlaWdodCA9IG91dFdpZHRoOw0KKyAgICAgIG91dFdpZHRoID0gdGVtcDsNCiAgICAgfQ0KKyAgfQ0KKyAgdWludDhfdCogcmVzdWx0ID0gKHVpbnQ4X3QqKUZYX0FsbG9jKHVpbnQ4X3QsIG91dEhlaWdodCAqIG91dFdpZHRoKTsNCisgIEZYU1lTX21lbWNweShyZXN1bHQsIG9yaWdpbmFsU2NhbGUuR2V0RGF0YSgpLCBvdXRIZWlnaHQgKiBvdXRXaWR0aCk7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCit2b2lkIENCQ19QREY0MTdXcml0ZXI6OnJvdGF0ZUFycmF5KENGWF9CeXRlQXJyYXkmIGJpdGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoKSB7DQorICBDRlhfQnl0ZUFycmF5IHRlbXA7DQorICB0ZW1wLkNvcHkoYml0YXJyYXkpOw0KKyAgZm9yIChpbnQzMl90IGlpID0gMDsgaWkgPCBoZWlnaHQ7IGlpKyspIHsNCisgICAgaW50MzJfdCBpbnZlcnNlaWkgPSBoZWlnaHQgLSBpaSAtIDE7DQorICAgIGZvciAoaW50MzJfdCBqaiA9IDA7IGpqIDwgd2lkdGg7IGpqKyspIHsNCisgICAgICBiaXRhcnJheVtqaiAqIGhlaWdodCArIGludmVyc2VpaV0gPSB0ZW1wW2lpICogd2lkdGggKyBqal07DQorICAgIH0NCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5oCmluZGV4IGU0NDk1OWYuLjllYzViY2QgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3V3JpdGVyLmgKQEAgLTgsMTkgKzgsMzEgQEAKICNkZWZpbmUgX0JDX1BERjQxN1dSSVRFUl9IXw0KIGNsYXNzIENCQ19Ud29EaW1Xcml0ZXI7DQogY2xhc3MgQ0JDX1BERjQxN1dyaXRlcjsNCi1jbGFzcyBDQkNfUERGNDE3V3JpdGVyIDogcHVibGljIENCQ19Ud29EaW1Xcml0ZXINCi17DQotcHVibGljOg0KLSAgICBDQkNfUERGNDE3V3JpdGVyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19QREY0MTdXcml0ZXIoKTsNCi0gICAgdWludDhfdCAqCUVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyAmY29udGVudHMsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgJmUpOw0KK2NsYXNzIENCQ19QREY0MTdXcml0ZXIgOiBwdWJsaWMgQ0JDX1R3b0RpbVdyaXRlciB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdXcml0ZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdXcml0ZXIoKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KIA0KLSAgICB1aW50OF90ICoJRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90ICZlKTsNCi0gICAgdWludDhfdCAqCUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wJCVNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpOw0KLSAgICB2b2lkCQlTZXRUcnVuY2F0ZWQoRlhfQk9PTCB0cnVuY2F0ZWQpOw0KLXByaXZhdGU6DQotICAgIHZvaWQJCXJvdGF0ZUFycmF5KENGWF9CeXRlQXJyYXkmIGJpdGFycmF5LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7DQotICAgIEZYX0JPT0wJCW1fYlRydW5jYXRlZDsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKTsNCisgIHZvaWQgU2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgcm90YXRlQXJyYXkoQ0ZYX0J5dGVBcnJheSYgYml0YXJyYXksIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsNCisgIEZYX0JPT0wgbV9iVHJ1bmNhdGVkOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19GaW5kZXJQYXR0ZXJuSW5mby5jcHAKaW5kZXggYjNjNmYzZi4uMTZlOGE5YSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfRmluZGVyUGF0dGVybkluZm8uY3BwCkBAIC0yMCwyOSArMjAsMjIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KICAqLw0KIA0KLQ0KICNpbmNsdWRlICIuLi9iYXJjb2RlLmgiDQogI2luY2x1ZGUgIi4uL0JDX1Jlc3VsdFBvaW50LmgiDQogI2luY2x1ZGUgIkJDX1FSRmluZGVyUGF0dGVybi5oIg0KICNpbmNsdWRlICJCQ19GaW5kZXJQYXR0ZXJuSW5mby5oIg0KLUNCQ19RUkZpbmRlclBhdHRlcm5JbmZvOjpDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbyhDRlhfUHRyQXJyYXkgKnBhdHRlcm5DZW50ZXJzKQ0KLXsNCi0gICAgbV9ib3R0b21MZWZ0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4qKSgqcGF0dGVybkNlbnRlcnMpWzBdOw0KLSAgICBtX3RvcExlZnQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopKCpwYXR0ZXJuQ2VudGVycylbMV07DQotICAgIG1fdG9wUmlnaHQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopKCpwYXR0ZXJuQ2VudGVycylbMl07DQorQ0JDX1FSRmluZGVyUGF0dGVybkluZm86OkNCQ19RUkZpbmRlclBhdHRlcm5JbmZvKENGWF9QdHJBcnJheSogcGF0dGVybkNlbnRlcnMpIHsNCisgIG1fYm90dG9tTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5DZW50ZXJzKVswXTsNCisgIG1fdG9wTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5DZW50ZXJzKVsxXTsNCisgIG1fdG9wUmlnaHQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopKCpwYXR0ZXJuQ2VudGVycylbMl07DQogfQ0KLUNCQ19RUkZpbmRlclBhdHRlcm5JbmZvOjp+Q0JDX1FSRmluZGVyUGF0dGVybkluZm8oKQ0KLXsNCitDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbzo6fkNCQ19RUkZpbmRlclBhdHRlcm5JbmZvKCkge30NCitDQkNfUVJGaW5kZXJQYXR0ZXJuKiBDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbzo6R2V0Qm90dG9tTGVmdCgpIHsNCisgIHJldHVybiBtX2JvdHRvbUxlZnQ7DQogfQ0KLUNCQ19RUkZpbmRlclBhdHRlcm4qIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvOjpHZXRCb3R0b21MZWZ0KCkNCi17DQotICAgIHJldHVybiBtX2JvdHRvbUxlZnQ7DQorQ0JDX1FSRmluZGVyUGF0dGVybiogQ0JDX1FSRmluZGVyUGF0dGVybkluZm86OkdldFRvcExlZnQoKSB7DQorICByZXR1cm4gbV90b3BMZWZ0Ow0KIH0NCi1DQkNfUVJGaW5kZXJQYXR0ZXJuKiBDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbzo6R2V0VG9wTGVmdCgpDQotew0KLSAgICByZXR1cm4gbV90b3BMZWZ0Ow0KLX0NCi1DQkNfUVJGaW5kZXJQYXR0ZXJuKiBDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbzo6R2V0VG9wUmlnaHQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fdG9wUmlnaHQ7DQorQ0JDX1FSRmluZGVyUGF0dGVybiogQ0JDX1FSRmluZGVyUGF0dGVybkluZm86OkdldFRvcFJpZ2h0KCkgew0KKyAgcmV0dXJuIG1fdG9wUmlnaHQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19GaW5kZXJQYXR0ZXJuSW5mby5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmgKaW5kZXggOGU0Y2IxMy4uMTg4YTdhZiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmgKQEAgLTcsMTcgKzcsMTcgQEAKICNpZm5kZWYgX0JDX0ZJTkRFUlBBVFRFUk5JTkZPX0hfDQogI2RlZmluZSBfQkNfRklOREVSUEFUVEVSTklORk9fSF8NCiBjbGFzcyBDQkNfUVJGaW5kZXJQYXR0ZXJuOw0KLWNsYXNzIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvDQotew0KLXByaXZhdGU6DQotICAgIENCQ19RUkZpbmRlclBhdHRlcm4gKm1fYm90dG9tTGVmdDsNCi0gICAgQ0JDX1FSRmluZGVyUGF0dGVybiAqbV90b3BMZWZ0Ow0KLSAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuICptX3RvcFJpZ2h0Ow0KLXB1YmxpYzoNCi0gICAgQ0JDX1FSRmluZGVyUGF0dGVybkluZm8oQ0ZYX1B0ckFycmF5ICpwYXR0ZXJuQ2VudGVycyk7DQotICAgIHZpcnR1YWwgfkNCQ19RUkZpbmRlclBhdHRlcm5JbmZvKCk7DQotICAgIENCQ19RUkZpbmRlclBhdHRlcm4qIEdldEJvdHRvbUxlZnQoKTsNCi0gICAgQ0JDX1FSRmluZGVyUGF0dGVybiogR2V0VG9wTGVmdCgpOw0KLSAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiBHZXRUb3BSaWdodCgpOw0KK2NsYXNzIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvIHsNCisgcHJpdmF0ZToNCisgIENCQ19RUkZpbmRlclBhdHRlcm4qIG1fYm90dG9tTGVmdDsNCisgIENCQ19RUkZpbmRlclBhdHRlcm4qIG1fdG9wTGVmdDsNCisgIENCQ19RUkZpbmRlclBhdHRlcm4qIG1fdG9wUmlnaHQ7DQorDQorIHB1YmxpYzoNCisgIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvKENGWF9QdHJBcnJheSogcGF0dGVybkNlbnRlcnMpOw0KKyAgdmlydHVhbCB+Q0JDX1FSRmluZGVyUGF0dGVybkluZm8oKTsNCisgIENCQ19RUkZpbmRlclBhdHRlcm4qIEdldEJvdHRvbUxlZnQoKTsNCisgIENCQ19RUkZpbmRlclBhdHRlcm4qIEdldFRvcExlZnQoKTsNCisgIENCQ19RUkZpbmRlclBhdHRlcm4qIEdldFRvcFJpZ2h0KCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm4uY3BwCmluZGV4IGUxZWUxNjguLjcyNzM4Y2QgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm4uY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm4uY3BwCkBAIC0yMywzMCArMjMsMjcgQEAKICNpbmNsdWRlICIuLi9iYXJjb2RlLmgiDQogI2luY2x1ZGUgIi4uL0JDX1Jlc3VsdFBvaW50LmgiDQogI2luY2x1ZGUgIkJDX1FSQWxpZ25tZW50UGF0dGVybi5oIg0KLUNCQ19RUkFsaWdubWVudFBhdHRlcm46OkNCQ19RUkFsaWdubWVudFBhdHRlcm4oRlhfRkxPQVQgcG9zWCwgRlhfRkxPQVQgcG9zWSwgRlhfRkxPQVQgZXN0aW1hdGVNb2R1bGVTaXplKToNCi0gICAgQ0JDX1Jlc3VsdFBvaW50KHBvc1gsIHBvc1kpLCBtX21vZHVsZVNpemUoZXN0aW1hdGVNb2R1bGVTaXplKQ0KLXsNCitDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuOjpDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKEZYX0ZMT0FUIHBvc1gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwb3NZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZXN0aW1hdGVNb2R1bGVTaXplKQ0KKyAgICA6IENCQ19SZXN1bHRQb2ludChwb3NYLCBwb3NZKSwgbV9tb2R1bGVTaXplKGVzdGltYXRlTW9kdWxlU2l6ZSkge30NCitDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuOjp+Q0JDX1FSQWxpZ25tZW50UGF0dGVybigpIHt9DQorRlhfRkxPQVQgQ0JDX1FSQWxpZ25tZW50UGF0dGVybjo6R2V0WCgpIHsNCisgIHJldHVybiBtX3g7DQogfQ0KLUNCQ19RUkFsaWdubWVudFBhdHRlcm46On5DQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKCkNCi17DQorRlhfRkxPQVQgQ0JDX1FSQWxpZ25tZW50UGF0dGVybjo6R2V0WSgpIHsNCisgIHJldHVybiBtX3k7DQogfQ0KLUZYX0ZMT0FUIENCQ19RUkFsaWdubWVudFBhdHRlcm46OkdldFgoKQ0KLXsNCi0gICAgcmV0dXJuIG1feDsNCitGWF9CT09MIENCQ19RUkFsaWdubWVudFBhdHRlcm46OkFib3V0RXF1YWxzKEZYX0ZMT0FUIG1vZHVsZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaikgew0KKyAgaWYgKChGWFNZU19mYWJzKGkgLSBHZXRZKCkpIDw9IG1vZHVsZVNpemUpICYmDQorICAgICAgKEZYU1lTX2ZhYnMoaiAtIEdldFgoKSkgPD0gbW9kdWxlU2l6ZSkpIHsNCisgICAgRlhfRkxPQVQgbW9kdWxlU2l6ZURpZmYgPSBGWFNZU19mYWJzKG1vZHVsZVNpemUgLSBtX21vZHVsZVNpemUpOw0KKyAgICByZXR1cm4gKG1vZHVsZVNpemVEaWZmIDw9IDEuMGYpIHx8IChtb2R1bGVTaXplRGlmZiAvIG1fbW9kdWxlU2l6ZSA8PSAxLjBmKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfRkxPQVQgQ0JDX1FSQWxpZ25tZW50UGF0dGVybjo6R2V0WSgpDQotew0KLSAgICByZXR1cm4gbV95Ow0KLX0NCi1GWF9CT09MIENCQ19RUkFsaWdubWVudFBhdHRlcm46OkFib3V0RXF1YWxzKEZYX0ZMT0FUIG1vZHVsZVNpemUsIEZYX0ZMT0FUIGksIEZYX0ZMT0FUIGopDQotew0KLSAgICBpZiAoKEZYU1lTX2ZhYnMoaSAtIEdldFkoKSkgPD0gbW9kdWxlU2l6ZSkgJiYgKEZYU1lTX2ZhYnMoaiAtIEdldFgoKSkgPD0gbW9kdWxlU2l6ZSkpIHsNCi0gICAgICAgIEZYX0ZMT0FUIG1vZHVsZVNpemVEaWZmID0gRlhTWVNfZmFicyhtb2R1bGVTaXplIC0gbV9tb2R1bGVTaXplKTsNCi0gICAgICAgIHJldHVybiAobW9kdWxlU2l6ZURpZmYgPD0gMS4wZikgfHwgKG1vZHVsZVNpemVEaWZmIC8gbV9tb2R1bGVTaXplIDw9IDEuMGYpOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotQ0JDX1FSQWxpZ25tZW50UGF0dGVybiAqQ0JDX1FSQWxpZ25tZW50UGF0dGVybjo6Q2xvbmUoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKG1feCwgbV95LCBtX21vZHVsZVNpemUpOw0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm4qIENCQ19RUkFsaWdubWVudFBhdHRlcm46OkNsb25lKCkgew0KKyAgcmV0dXJuIEZYX05FVyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKG1feCwgbV95LCBtX21vZHVsZVNpemUpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmgKaW5kZXggYTUyNjg3Yi4uZmY4NWNhNSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQWxpZ25tZW50UGF0dGVybi5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm4uaApAQCAtOSwxNiArOSwxOCBAQAogY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KIGNsYXNzIENCQ19SZXN1bHRQb2ludDsNCiBjbGFzcyBDQkNfUkVBSTAxM3gweDF4RGVjb2RlcjsNCi1jbGFzcyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuICA6IHB1YmxpYyBDQkNfUmVzdWx0UG9pbnQNCi17DQotcHJpdmF0ZToNCi0gICAgRlhfRkxPQVQgbV9tb2R1bGVTaXplOw0KLXB1YmxpYzoNCi0gICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybihGWF9GTE9BVCBwb3NYLCBGWF9GTE9BVCBwb3NZLCBGWF9GTE9BVCBlc3RpbWF0ZU1vZHVsZVNpemUpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKCk7DQotICAgIEZYX0JPT0wgQWJvdXRFcXVhbHMoRlhfRkxPQVQgbW9kdWxlU2l6ZSwgRlhfRkxPQVQgaSwgRlhfRkxPQVQgaik7DQotICAgIEZYX0ZMT0FUIEdldFgoKTsNCi0gICAgRlhfRkxPQVQgR2V0WSgpOw0KLSAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuICpDbG9uZSgpOw0KK2NsYXNzIENCQ19RUkFsaWdubWVudFBhdHRlcm4gOiBwdWJsaWMgQ0JDX1Jlc3VsdFBvaW50IHsNCisgcHJpdmF0ZToNCisgIEZYX0ZMT0FUIG1fbW9kdWxlU2l6ZTsNCisNCisgcHVibGljOg0KKyAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybihGWF9GTE9BVCBwb3NYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwb3NZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlc3RpbWF0ZU1vZHVsZVNpemUpOw0KKyAgdmlydHVhbCB+Q0JDX1FSQWxpZ25tZW50UGF0dGVybigpOw0KKyAgRlhfQk9PTCBBYm91dEVxdWFscyhGWF9GTE9BVCBtb2R1bGVTaXplLCBGWF9GTE9BVCBpLCBGWF9GTE9BVCBqKTsNCisgIEZYX0ZMT0FUIEdldFgoKTsNCisgIEZYX0ZMT0FUIEdldFkoKTsNCisgIENCQ19RUkFsaWdubWVudFBhdHRlcm4qIENsb25lKCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIuY3BwCmluZGV4IGZhNzVjZDguLjZjMDhmNDIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIuY3BwCkBAIC0yNSwxNjMgKzI1LDE3OSBAQAogI2luY2x1ZGUgIi4uL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCiAjaW5jbHVkZSAiQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmgiDQogI2luY2x1ZGUgIkJDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlci5oIg0KLUNCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXI6OkNCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UsDQotICAgICAgICBpbnQzMl90IHN0YXJ0WCwNCi0gICAgICAgIGludDMyX3Qgc3RhcnRZLA0KLSAgICAgICAgaW50MzJfdCB3aWR0aCwNCi0gICAgICAgIGludDMyX3QgaGVpZ2h0LA0KLSAgICAgICAgRlhfRkxPQVQgbW9kdWxlU2l6ZSk6IG1faW1hZ2UoaW1hZ2UpLA0KLSAgICBtX3N0YXJ0WChzdGFydFgpLA0KLSAgICBtX3N0YXJ0WShzdGFydFkpLA0KLSAgICBtX3dpZHRoKHdpZHRoKSwNCi0gICAgbV9oZWlnaHQoaGVpZ2h0KSwNCi0gICAgbV9tb2R1bGVTaXplKG1vZHVsZVNpemUpDQorQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjo6Q0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcigNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgIGludDMyX3Qgc3RhcnRYLA0KKyAgICBpbnQzMl90IHN0YXJ0WSwNCisgICAgaW50MzJfdCB3aWR0aCwNCisgICAgaW50MzJfdCBoZWlnaHQsDQorICAgIEZYX0ZMT0FUIG1vZHVsZVNpemUpDQorICAgIDogbV9pbWFnZShpbWFnZSksDQorICAgICAgbV9zdGFydFgoc3RhcnRYKSwNCisgICAgICBtX3N0YXJ0WShzdGFydFkpLA0KKyAgICAgIG1fd2lkdGgod2lkdGgpLA0KKyAgICAgIG1faGVpZ2h0KGhlaWdodCksDQorICAgICAgbV9tb2R1bGVTaXplKG1vZHVsZVNpemUpDQogDQogew0KLSAgICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50LlNldFNpemUoMyk7DQorICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50LlNldFNpemUoMyk7DQogfQ0KLUNCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXI6On5DQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyKCkNCi17DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICBkZWxldGUgKENCQ19RUkFsaWdubWVudFBhdHRlcm4qKW1fcG9zc2libGVDZW50ZXJzW2ldOw0KLSAgICB9DQotICAgIG1fcG9zc2libGVDZW50ZXJzLlJlbW92ZUFsbCgpOw0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXI6On5DQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgZGVsZXRlIChDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1tpXTsNCisgIH0NCisgIG1fcG9zc2libGVDZW50ZXJzLlJlbW92ZUFsbCgpOw0KIH0NCi1DQkNfUVJBbGlnbm1lbnRQYXR0ZXJuICAqQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjo6RmluZChpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBzdGFydFggPSBtX3N0YXJ0WDsNCi0gICAgaW50MzJfdCBoZWlnaHQgPSBtX2hlaWdodDsNCi0gICAgaW50MzJfdCBtYXhKID0gc3RhcnRYICsgbV93aWR0aDsNCi0gICAgaW50MzJfdCBtaWRkbGVJID0gbV9zdGFydFkgKyAoaGVpZ2h0ID4+IDEpOw0KLSAgICBDRlhfSW50MzJBcnJheSBzdGF0ZUNvdW50Ow0KLSAgICBzdGF0ZUNvdW50LlNldFNpemUoMyk7DQotICAgIGZvciAoaW50MzJfdCBpR2VuID0gMDsgaUdlbiA8IGhlaWdodDsgaUdlbisrKSB7DQotICAgICAgICBpbnQzMl90IGkgPSBtaWRkbGVJICsgKChpR2VuICYgMHgwMSkgPT0gMCA/ICgoaUdlbiArIDEpID4+IDEpIDogLSgoaUdlbiArIDEpID4+IDEpKTsNCi0gICAgICAgIHN0YXRlQ291bnRbMF0gPSAwOw0KLSAgICAgICAgc3RhdGVDb3VudFsxXSA9IDA7DQotICAgICAgICBzdGF0ZUNvdW50WzJdID0gMDsNCi0gICAgICAgIGludDMyX3QgaiA9IHN0YXJ0WDsNCi0gICAgICAgIHdoaWxlIChqIDwgbWF4SiAmJiAhbV9pbWFnZS0+R2V0KGosIGkpKSB7DQotICAgICAgICAgICAgaisrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBjdXJyZW50U3RhdGUgPSAwOw0KLSAgICAgICAgd2hpbGUgKGogPCBtYXhKKSB7DQotICAgICAgICAgICAgaWYgKG1faW1hZ2UtPkdldChqLCBpKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlID09IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbY3VycmVudFN0YXRlXSsrOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSAyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkFsaWdubWVudFBhdHRlcm4gICpjb25maXJtZWQgPSBIYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBqKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpcm1lZCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlybWVkOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMF0gPSBzdGF0ZUNvdW50WzJdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMV0gPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMl0gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IDE7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbKytjdXJyZW50U3RhdGVdKys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlID09IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbY3VycmVudFN0YXRlXSsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBqKys7DQotICAgICAgICB9DQotICAgICAgICBpZiAoRm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkpIHsNCi0gICAgICAgICAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuICpjb25maXJtZWQgPSBIYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBtYXhKKTsNCi0gICAgICAgICAgICBpZiAoY29uZmlybWVkICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpcm1lZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKSAhPSAwKSB7DQotICAgICAgICByZXR1cm4JKChDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKikgKG1fcG9zc2libGVDZW50ZXJzWzBdKSApLT5DbG9uZSgpOw0KLSAgICB9DQotICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUZYX0ZMT0FUIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXI6OkNlbnRlckZyb21FbmQoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQsIGludDMyX3QgZW5kKQ0KLXsNCi0gICAgcmV0dXJuIChGWF9GTE9BVCkgKGVuZCAtIHN0YXRlQ291bnRbMl0pIC0gc3RhdGVDb3VudFsxXSAvIDIuMGY7DQotfQ0KLUZYX0JPT0wgQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjo6Rm91bmRQYXR0ZXJuQ3Jvc3MoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQpDQotew0KLSAgICBGWF9GTE9BVCBtb2R1bGVTaXplID0gbV9tb2R1bGVTaXplOw0KLSAgICBGWF9GTE9BVCBtYXhWYXJpYW5jZSA9IG1vZHVsZVNpemUgLyAyLjBmOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCi0gICAgICAgIGlmIChmYWJzKG1vZHVsZVNpemUgLSBzdGF0ZUNvdW50W2ldKSA+PSBtYXhWYXJpYW5jZSkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfRkxPQVQgQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjo6Q3Jvc3NDaGVja1ZlcnRpY2FsKGludDMyX3Qgc3RhcnRJLCBpbnQzMl90IGNlbnRlckosIGludDMyX3QgbWF4Q291bnQsIGludDMyX3Qgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpDQotew0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSA9IG1faW1hZ2U7DQotICAgIGludDMyX3QgbWF4SSA9IG1faW1hZ2UtPkdldEhlaWdodCgpOw0KLSAgICBDRlhfSW50MzJBcnJheSBzdGF0ZUNvdW50Ow0KLSAgICBzdGF0ZUNvdW50LkNvcHkobV9jcm9zc0NoZWNrU3RhdGVDb3VudCk7DQorQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjo6RmluZChpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IHN0YXJ0WCA9IG1fc3RhcnRYOw0KKyAgaW50MzJfdCBoZWlnaHQgPSBtX2hlaWdodDsNCisgIGludDMyX3QgbWF4SiA9IHN0YXJ0WCArIG1fd2lkdGg7DQorICBpbnQzMl90IG1pZGRsZUkgPSBtX3N0YXJ0WSArIChoZWlnaHQgPj4gMSk7DQorICBDRlhfSW50MzJBcnJheSBzdGF0ZUNvdW50Ow0KKyAgc3RhdGVDb3VudC5TZXRTaXplKDMpOw0KKyAgZm9yIChpbnQzMl90IGlHZW4gPSAwOyBpR2VuIDwgaGVpZ2h0OyBpR2VuKyspIHsNCisgICAgaW50MzJfdCBpID0NCisgICAgICAgIG1pZGRsZUkgKyAoKGlHZW4gJiAweDAxKSA9PSAwID8gKChpR2VuICsgMSkgPj4gMSkgOiAtKChpR2VuICsgMSkgPj4gMSkpOw0KICAgICBzdGF0ZUNvdW50WzBdID0gMDsNCiAgICAgc3RhdGVDb3VudFsxXSA9IDA7DQogICAgIHN0YXRlQ291bnRbMl0gPSAwOw0KLSAgICBpbnQzMl90IGkgPSBzdGFydEk7DQotICAgIHdoaWxlIChpID49IDAgJiYgbV9pbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbMV0gPD0gbWF4Q291bnQpIHsNCi0gICAgICAgIHN0YXRlQ291bnRbMV0rKzsNCi0gICAgICAgIGktLTsNCisgICAgaW50MzJfdCBqID0gc3RhcnRYOw0KKyAgICB3aGlsZSAoaiA8IG1heEogJiYgIW1faW1hZ2UtPkdldChqLCBpKSkgew0KKyAgICAgIGorKzsNCiAgICAgfQ0KLSAgICBpZiAoaSA8IDAgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KSB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQotICAgIH0NCi0gICAgd2hpbGUgKGkgPj0gMCAmJiAhbV9pbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbMF0gPD0gbWF4Q291bnQpIHsNCi0gICAgICAgIHN0YXRlQ291bnRbMF0rKzsNCi0gICAgICAgIGktLTsNCi0gICAgfQ0KLSAgICBpZiAoc3RhdGVDb3VudFswXSA+IG1heENvdW50KSB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQotICAgIH0NCi0gICAgaSA9IHN0YXJ0SSArIDE7DQotICAgIHdoaWxlIChpIDwgbWF4SSAmJiBtX2ltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkgew0KLSAgICAgICAgc3RhdGVDb3VudFsxXSsrOw0KLSAgICAgICAgaSsrOw0KLSAgICB9DQotICAgIGlmIChpID09IG1heEkgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KSB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQotICAgIH0NCi0gICAgd2hpbGUgKGkgPCBtYXhJICYmICFtX2ltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsyXSA8PSBtYXhDb3VudCkgew0KLSAgICAgICAgc3RhdGVDb3VudFsyXSsrOw0KLSAgICAgICAgaSsrOw0KLSAgICB9DQotICAgIGlmIChzdGF0ZUNvdW50WzJdID4gbWF4Q291bnQpIHsNCi0gICAgICAgIHJldHVybiBGWFNZU19uYW4oKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXTsNCi0gICAgaWYgKDUgKiBhYnMoc3RhdGVDb3VudFRvdGFsIC0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpID49IG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpID8gQ2VudGVyRnJvbUVuZChzdGF0ZUNvdW50LCBpKSA6IEZYU1lTX25hbigpOw0KLX0NCi1DQkNfUVJBbGlnbm1lbnRQYXR0ZXJuICpDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyOjpIYW5kbGVQb3NzaWJsZUNlbnRlcihjb25zdCBDRlhfSW50MzJBcnJheSAmc3RhdGVDb3VudCwgaW50MzJfdCBpLCBpbnQzMl90IGopDQotew0KLSAgICBpbnQzMl90IHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXTsNCi0gICAgRlhfRkxPQVQgY2VudGVySiA9IENlbnRlckZyb21FbmQoc3RhdGVDb3VudCwgaik7DQotICAgIEZYX0ZMT0FUIGNlbnRlckkgPSBDcm9zc0NoZWNrVmVydGljYWwoaSwgKGludDMyX3QpIGNlbnRlckosIDIgKiBzdGF0ZUNvdW50WzFdLCBzdGF0ZUNvdW50VG90YWwpOw0KLSAgICBpZiAoIUZYU1lTX2lzbmFuKGNlbnRlckkpKSB7DQotICAgICAgICBGWF9GTE9BVCBlc3RpbWF0ZWRNb2R1bGVTaXplID0gKEZYX0ZMT0FUKSAoc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdKSAvIDMuMGY7DQotICAgICAgICBpbnQzMl90IG1heCA9IG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7DQotICAgICAgICAgICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiAqY2VudGVyID0gKENCQ19RUkFsaWdubWVudFBhdHRlcm4gKikobV9wb3NzaWJsZUNlbnRlcnNbaW5kZXhdKTsNCi0gICAgICAgICAgICBpZiAoY2VudGVyLT5BYm91dEVxdWFscyhlc3RpbWF0ZWRNb2R1bGVTaXplLCBjZW50ZXJJLCBjZW50ZXJKKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19RUkFsaWdubWVudFBhdHRlcm4oY2VudGVySiwgY2VudGVySSwgZXN0aW1hdGVkTW9kdWxlU2l6ZSk7DQorICAgIGludDMyX3QgY3VycmVudFN0YXRlID0gMDsNCisgICAgd2hpbGUgKGogPCBtYXhKKSB7DQorICAgICAgaWYgKG1faW1hZ2UtPkdldChqLCBpKSkgew0KKyAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSAxKSB7DQorICAgICAgICAgIHN0YXRlQ291bnRbY3VycmVudFN0YXRlXSsrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSAyKSB7DQorICAgICAgICAgICAgaWYgKEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpKSB7DQorICAgICAgICAgICAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKiBjb25maXJtZWQgPQ0KKyAgICAgICAgICAgICAgICAgIEhhbmRsZVBvc3NpYmxlQ2VudGVyKHN0YXRlQ291bnQsIGksIGopOw0KKyAgICAgICAgICAgICAgaWYgKGNvbmZpcm1lZCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBjb25maXJtZWQ7DQorICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHN0YXRlQ291bnRbMF0gPSBzdGF0ZUNvdW50WzJdOw0KKyAgICAgICAgICAgIHN0YXRlQ291bnRbMV0gPSAxOw0KKyAgICAgICAgICAgIHN0YXRlQ291bnRbMl0gPSAwOw0KKyAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IDE7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgc3RhdGVDb3VudFsrK2N1cnJlbnRTdGF0ZV0rKzsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgbV9wb3NzaWJsZUNlbnRlcnMuQWRkKEZYX05FVyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKGNlbnRlckosIGNlbnRlckksIGVzdGltYXRlZE1vZHVsZVNpemUpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSAxKSB7DQorICAgICAgICAgIGN1cnJlbnRTdGF0ZSsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGVDb3VudFtjdXJyZW50U3RhdGVdKys7DQorICAgICAgfQ0KKyAgICAgIGorKzsNCiAgICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCisgICAgaWYgKEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpKSB7DQorICAgICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogY29uZmlybWVkID0NCisgICAgICAgICAgSGFuZGxlUG9zc2libGVDZW50ZXIoc3RhdGVDb3VudCwgaSwgbWF4Sik7DQorICAgICAgaWYgKGNvbmZpcm1lZCAhPSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gY29uZmlybWVkOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKSAhPSAwKSB7DQorICAgIHJldHVybiAoKENCQ19RUkFsaWdubWVudFBhdHRlcm4qKShtX3Bvc3NpYmxlQ2VudGVyc1swXSkpLT5DbG9uZSgpOw0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9GTE9BVCBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyOjpDZW50ZXJGcm9tRW5kKA0KKyAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgc3RhdGVDb3VudCwNCisgICAgaW50MzJfdCBlbmQpIHsNCisgIHJldHVybiAoRlhfRkxPQVQpKGVuZCAtIHN0YXRlQ291bnRbMl0pIC0gc3RhdGVDb3VudFsxXSAvIDIuMGY7DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjo6Rm91bmRQYXR0ZXJuQ3Jvc3MoDQorICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBzdGF0ZUNvdW50KSB7DQorICBGWF9GTE9BVCBtb2R1bGVTaXplID0gbV9tb2R1bGVTaXplOw0KKyAgRlhfRkxPQVQgbWF4VmFyaWFuY2UgPSBtb2R1bGVTaXplIC8gMi4wZjsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICBpZiAoZmFicyhtb2R1bGVTaXplIC0gc3RhdGVDb3VudFtpXSkgPj0gbWF4VmFyaWFuY2UpIHsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9GTE9BVCBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyOjpDcm9zc0NoZWNrVmVydGljYWwoDQorICAgIGludDMyX3Qgc3RhcnRJLA0KKyAgICBpbnQzMl90IGNlbnRlckosDQorICAgIGludDMyX3QgbWF4Q291bnQsDQorICAgIGludDMyX3Qgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpIHsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlID0gbV9pbWFnZTsNCisgIGludDMyX3QgbWF4SSA9IG1faW1hZ2UtPkdldEhlaWdodCgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgc3RhdGVDb3VudDsNCisgIHN0YXRlQ291bnQuQ29weShtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50KTsNCisgIHN0YXRlQ291bnRbMF0gPSAwOw0KKyAgc3RhdGVDb3VudFsxXSA9IDA7DQorICBzdGF0ZUNvdW50WzJdID0gMDsNCisgIGludDMyX3QgaSA9IHN0YXJ0STsNCisgIHdoaWxlIChpID49IDAgJiYgbV9pbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbMV0gPD0gbWF4Q291bnQpIHsNCisgICAgc3RhdGVDb3VudFsxXSsrOw0KKyAgICBpLS07DQorICB9DQorICBpZiAoaSA8IDAgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KSB7DQorICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgIH0NCisgIHdoaWxlIChpID49IDAgJiYgIW1faW1hZ2UtPkdldChjZW50ZXJKLCBpKSAmJiBzdGF0ZUNvdW50WzBdIDw9IG1heENvdW50KSB7DQorICAgIHN0YXRlQ291bnRbMF0rKzsNCisgICAgaS0tOw0KKyAgfQ0KKyAgaWYgKHN0YXRlQ291bnRbMF0gPiBtYXhDb3VudCkgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICBpID0gc3RhcnRJICsgMTsNCisgIHdoaWxlIChpIDwgbWF4SSAmJiBtX2ltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkgew0KKyAgICBzdGF0ZUNvdW50WzFdKys7DQorICAgIGkrKzsNCisgIH0NCisgIGlmIChpID09IG1heEkgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KSB7DQorICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgIH0NCisgIHdoaWxlIChpIDwgbWF4SSAmJiAhbV9pbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbMl0gPD0gbWF4Q291bnQpIHsNCisgICAgc3RhdGVDb3VudFsyXSsrOw0KKyAgICBpKys7DQorICB9DQorICBpZiAoc3RhdGVDb3VudFsyXSA+IG1heENvdW50KSB7DQorICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgIH0NCisgIGludDMyX3Qgc3RhdGVDb3VudFRvdGFsID0gc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdOw0KKyAgaWYgKDUgKiBhYnMoc3RhdGVDb3VudFRvdGFsIC0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpID49DQorICAgICAgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgcmV0dXJuIEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpID8gQ2VudGVyRnJvbUVuZChzdGF0ZUNvdW50LCBpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhTWVNfbmFuKCk7DQorfQ0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm4qIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXI6OkhhbmRsZVBvc3NpYmxlQ2VudGVyKA0KKyAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgc3RhdGVDb3VudCwNCisgICAgaW50MzJfdCBpLA0KKyAgICBpbnQzMl90IGopIHsNCisgIGludDMyX3Qgc3RhdGVDb3VudFRvdGFsID0gc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdOw0KKyAgRlhfRkxPQVQgY2VudGVySiA9IENlbnRlckZyb21FbmQoc3RhdGVDb3VudCwgaik7DQorICBGWF9GTE9BVCBjZW50ZXJJID0gQ3Jvc3NDaGVja1ZlcnRpY2FsKGksIChpbnQzMl90KWNlbnRlckosIDIgKiBzdGF0ZUNvdW50WzFdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50VG90YWwpOw0KKyAgaWYgKCFGWFNZU19pc25hbihjZW50ZXJJKSkgew0KKyAgICBGWF9GTE9BVCBlc3RpbWF0ZWRNb2R1bGVTaXplID0NCisgICAgICAgIChGWF9GTE9BVCkoc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdKSAvIDMuMGY7DQorICAgIGludDMyX3QgbWF4ID0gbV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IG1heDsgaW5kZXgrKykgew0KKyAgICAgIENCQ19RUkFsaWdubWVudFBhdHRlcm4qIGNlbnRlciA9DQorICAgICAgICAgIChDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKikobV9wb3NzaWJsZUNlbnRlcnNbaW5kZXhdKTsNCisgICAgICBpZiAoY2VudGVyLT5BYm91dEVxdWFscyhlc3RpbWF0ZWRNb2R1bGVTaXplLCBjZW50ZXJJLCBjZW50ZXJKKSkgew0KKyAgICAgICAgcmV0dXJuIEZYX05FVyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKGNlbnRlckosIGNlbnRlckksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkTW9kdWxlU2l6ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG1fcG9zc2libGVDZW50ZXJzLkFkZCgNCisgICAgICAgIEZYX05FVyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKGNlbnRlckosIGNlbnRlckksIGVzdGltYXRlZE1vZHVsZVNpemUpKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmgKaW5kZXggYjE2NTE3ZS4uNzYwZmFiYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIuaApAQCAtOCwyNCArOCwzNCBAQAogI2RlZmluZSBfQkNfUVJBTElHTk1FTlRQQVRURVJORklOREVSX0hfDQogY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCiBjbGFzcyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuOw0KLWNsYXNzIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXINCi17DQotcHJpdmF0ZToNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqbV9pbWFnZTsNCi0gICAgQ0ZYX1B0ckFycmF5IG1fcG9zc2libGVDZW50ZXJzOw0KLSAgICBpbnQzMl90IG1fc3RhcnRYOw0KLSAgICBpbnQzMl90IG1fc3RhcnRZOw0KLSAgICBpbnQzMl90IG1fd2lkdGg7DQotICAgIGludDMyX3QgbV9oZWlnaHQ7DQotICAgIEZYX0ZMT0FUIG1fbW9kdWxlU2l6ZTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgbV9jcm9zc0NoZWNrU3RhdGVDb3VudDsNCi1wdWJsaWM6DQotICAgIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UsIGludDMyX3Qgc3RhcnRYLCBpbnQzMl90IHN0YXJ0WSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIEZYX0ZMT0FUIG1vZHVsZVNpemUpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyKCk7DQotICAgIEZYX0JPT0wgRm91bmRQYXR0ZXJuQ3Jvc3MoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQpOw0KLSAgICBGWF9GTE9BVCBDcm9zc0NoZWNrVmVydGljYWwoaW50MzJfdCBzdGFydEksIGludDMyX3Qgc3RhcnRKLCBpbnQzMl90IG1heENvdW50LCBpbnQzMl90IG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKTsNCi0gICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogRmluZChpbnQzMl90ICZlKTsNCi0gICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiAqSGFuZGxlUG9zc2libGVDZW50ZXIoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQsIGludDMyX3QgaSwgaW50MzJfdCBqKTsNCi0gICAgc3RhdGljIEZYX0ZMT0FUIENlbnRlckZyb21FbmQoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQsIGludDMyX3QgZW5kKTsNCitjbGFzcyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyIHsNCisgcHJpdmF0ZToNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1faW1hZ2U7DQorICBDRlhfUHRyQXJyYXkgbV9wb3NzaWJsZUNlbnRlcnM7DQorICBpbnQzMl90IG1fc3RhcnRYOw0KKyAgaW50MzJfdCBtX3N0YXJ0WTsNCisgIGludDMyX3QgbV93aWR0aDsNCisgIGludDMyX3QgbV9oZWlnaHQ7DQorICBGWF9GTE9BVCBtX21vZHVsZVNpemU7DQorICBDRlhfSW50MzJBcnJheSBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50Ow0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0WCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydFksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtb2R1bGVTaXplKTsNCisgIHZpcnR1YWwgfkNCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIoKTsNCisgIEZYX0JPT0wgRm91bmRQYXR0ZXJuQ3Jvc3MoY29uc3QgQ0ZYX0ludDMyQXJyYXkmIHN0YXRlQ291bnQpOw0KKyAgRlhfRkxPQVQgQ3Jvc3NDaGVja1ZlcnRpY2FsKGludDMyX3Qgc3RhcnRJLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRKLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4Q291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCk7DQorICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKiBGaW5kKGludDMyX3QmIGUpOw0KKyAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogSGFuZGxlUG9zc2libGVDZW50ZXIoY29uc3QgQ0ZYX0ludDMyQXJyYXkmIHN0YXRlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGopOw0KKyAgc3RhdGljIEZYX0ZMT0FUIENlbnRlckZyb21FbmQoY29uc3QgQ0ZYX0ludDMyQXJyYXkmIHN0YXRlQ291bnQsIGludDMyX3QgZW5kKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkJpdE1hdHJpeFBhcnNlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJCaXRNYXRyaXhQYXJzZXIuY3BwCmluZGV4IGJhNTY2MmIuLmYwZTAzZTYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkJpdE1hdHJpeFBhcnNlci5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQml0TWF0cml4UGFyc2VyLmNwcApAQCAtMjYsMTYwICsyNiwxNTkgQEAKICNpbmNsdWRlICJCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uaCINCiAjaW5jbHVkZSAiQkNfUVJEYXRhTWFzay5oIg0KICNpbmNsdWRlICJCQ19RUkJpdE1hdHJpeFBhcnNlci5oIg0KLUNCQ19RUkJpdE1hdHJpeFBhcnNlcjo6Q0JDX1FSQml0TWF0cml4UGFyc2VyKCkNCi17DQotfQ0KLXZvaWQgQ0JDX1FSQml0TWF0cml4UGFyc2VyOjpJbml0KENCQ19Db21tb25CaXRNYXRyaXggKmJpdE1hdHJpeCwgaW50MzJfdCAmZSkNCi17DQotICAgIG1fZGltZW5zaW9uID0gYml0TWF0cml4LT5HZXREaW1lbnNpb24oZSk7DQorQ0JDX1FSQml0TWF0cml4UGFyc2VyOjpDQkNfUVJCaXRNYXRyaXhQYXJzZXIoKSB7fQ0KK3ZvaWQgQ0JDX1FSQml0TWF0cml4UGFyc2VyOjpJbml0KENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCwgaW50MzJfdCYgZSkgew0KKyAgbV9kaW1lbnNpb24gPSBiaXRNYXRyaXgtPkdldERpbWVuc2lvbihlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgbV90ZW1wQml0TWF0cml4ID0gYml0TWF0cml4Ow0KKyAgaWYgKG1fZGltZW5zaW9uIDwgMjEgfHwgKG1fZGltZW5zaW9uICYgMHgwMykgIT0gMSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgbV90ZW1wQml0TWF0cml4ID0gYml0TWF0cml4Ow0KLSAgICBpZihtX2RpbWVuc2lvbiA8IDIxIHx8IChtX2RpbWVuc2lvbiAmIDB4MDMpICE9IDEpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLSAgICBtX2JpdE1hdHJpeCA9IG1fdGVtcEJpdE1hdHJpeDsNCisgIH0NCisgIG1fYml0TWF0cml4ID0gbV90ZW1wQml0TWF0cml4Ow0KKyAgbV9wYXJzZWRGb3JtYXRJbmZvID0gTlVMTDsNCisgIG1fdmVyc2lvbiA9IE5VTEw7DQorfQ0KK0NCQ19RUkJpdE1hdHJpeFBhcnNlcjo6fkNCQ19RUkJpdE1hdHJpeFBhcnNlcigpIHsNCisgIGlmIChtX3BhcnNlZEZvcm1hdEluZm8gIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9wYXJzZWRGb3JtYXRJbmZvOw0KICAgICBtX3BhcnNlZEZvcm1hdEluZm8gPSBOVUxMOw0KLSAgICBtX3ZlcnNpb24gPSBOVUxMOw0KKyAgfQ0KKyAgbV92ZXJzaW9uID0gTlVMTDsNCiB9DQotQ0JDX1FSQml0TWF0cml4UGFyc2VyOjp+Q0JDX1FSQml0TWF0cml4UGFyc2VyKCkNCi17DQotICAgIGlmKG1fcGFyc2VkRm9ybWF0SW5mbyAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgbV9wYXJzZWRGb3JtYXRJbmZvOw0KLSAgICAgICAgbV9wYXJzZWRGb3JtYXRJbmZvID0gTlVMTDsNCi0gICAgfQ0KLSAgICBtX3ZlcnNpb24gPSBOVUxMOw0KK0NCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24qIENCQ19RUkJpdE1hdHJpeFBhcnNlcjo6UmVhZEZvcm1hdEluZm9ybWF0aW9uKA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobV9wYXJzZWRGb3JtYXRJbmZvICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIG1fcGFyc2VkRm9ybWF0SW5mbzsNCisgIH0NCisgIGludDMyX3QgZm9ybWF0SW5mb0JpdHMgPSAwOw0KKyAgaW50MzJfdCBqOw0KKyAgZm9yIChqID0gMDsgaiA8IDY7IGorKykgew0KKyAgICBmb3JtYXRJbmZvQml0cyA9IENvcHlCaXQoOCwgaiwgZm9ybWF0SW5mb0JpdHMpOw0KKyAgfQ0KKyAgZm9ybWF0SW5mb0JpdHMgPSBDb3B5Qml0KDgsIDcsIGZvcm1hdEluZm9CaXRzKTsNCisgIGZvcm1hdEluZm9CaXRzID0gQ29weUJpdCg4LCA4LCBmb3JtYXRJbmZvQml0cyk7DQorICBmb3JtYXRJbmZvQml0cyA9IENvcHlCaXQoNywgOCwgZm9ybWF0SW5mb0JpdHMpOw0KKyAgZm9yIChpbnQzMl90IGkgPSA1OyBpID49IDA7IGktLSkgew0KKyAgICBmb3JtYXRJbmZvQml0cyA9IENvcHlCaXQoaSwgOCwgZm9ybWF0SW5mb0JpdHMpOw0KKyAgfQ0KKyAgbV9wYXJzZWRGb3JtYXRJbmZvID0NCisgICAgICBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpEZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihmb3JtYXRJbmZvQml0cyk7DQorICBpZiAobV9wYXJzZWRGb3JtYXRJbmZvICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIG1fcGFyc2VkRm9ybWF0SW5mbzsNCisgIH0NCisgIGludDMyX3QgZGltZW5zaW9uID0gbV9iaXRNYXRyaXgtPkdldERpbWVuc2lvbihlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIGZvcm1hdEluZm9CaXRzID0gMDsNCisgIGludDMyX3QgaU1pbiA9IGRpbWVuc2lvbiAtIDg7DQorICBmb3IgKGogPSBkaW1lbnNpb24gLSAxOyBqID49IGlNaW47IGotLSkgew0KKyAgICBmb3JtYXRJbmZvQml0cyA9IENvcHlCaXQoaiwgOCwgZm9ybWF0SW5mb0JpdHMpOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGsgPSBkaW1lbnNpb24gLSA3OyBrIDwgZGltZW5zaW9uOyBrKyspIHsNCisgICAgZm9ybWF0SW5mb0JpdHMgPSBDb3B5Qml0KDgsIGssIGZvcm1hdEluZm9CaXRzKTsNCisgIH0NCisgIG1fcGFyc2VkRm9ybWF0SW5mbyA9DQorICAgICAgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6RGVjb2RlRm9ybWF0SW5mb3JtYXRpb24oZm9ybWF0SW5mb0JpdHMpOw0KKyAgaWYgKG1fcGFyc2VkRm9ybWF0SW5mbyAhPSBOVUxMKSB7DQorICAgIHJldHVybiBtX3BhcnNlZEZvcm1hdEluZm87DQorICB9DQorICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLUNCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24qIENCQ19RUkJpdE1hdHJpeFBhcnNlcjo6UmVhZEZvcm1hdEluZm9ybWF0aW9uKGludDMyX3QgJmUpDQotew0KLSAgICBpZihtX3BhcnNlZEZvcm1hdEluZm8gIT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIG1fcGFyc2VkRm9ybWF0SW5mbzsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGZvcm1hdEluZm9CaXRzID0gMDsNCi0gICAgaW50MzJfdCBqOw0KLSAgICBmb3IoIGogPSAwOyBqIDwgNjsgaisrKSB7DQotICAgICAgICBmb3JtYXRJbmZvQml0cyA9IENvcHlCaXQoOCwgaiwgZm9ybWF0SW5mb0JpdHMpOw0KLSAgICB9DQotICAgIGZvcm1hdEluZm9CaXRzID0gQ29weUJpdCg4LCA3LCBmb3JtYXRJbmZvQml0cyk7DQotICAgIGZvcm1hdEluZm9CaXRzID0gQ29weUJpdCg4LCA4LCBmb3JtYXRJbmZvQml0cyk7DQotICAgIGZvcm1hdEluZm9CaXRzID0gQ29weUJpdCg3LCA4LCBmb3JtYXRJbmZvQml0cyk7DQotICAgIGZvcihpbnQzMl90IGkgPSA1OyBpID49IDA7IGktLSkgew0KLSAgICAgICAgZm9ybWF0SW5mb0JpdHMgPSBDb3B5Qml0KGksIDgsIGZvcm1hdEluZm9CaXRzKTsNCi0gICAgfQ0KLSAgICBtX3BhcnNlZEZvcm1hdEluZm8gPSBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpEZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihmb3JtYXRJbmZvQml0cyk7DQotICAgIGlmKG1fcGFyc2VkRm9ybWF0SW5mbyAhPSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gbV9wYXJzZWRGb3JtYXRJbmZvOw0KLSAgICB9DQotICAgIGludDMyX3QgZGltZW5zaW9uID0gbV9iaXRNYXRyaXgtPkdldERpbWVuc2lvbihlKTsNCitDQkNfUVJDb2RlclZlcnNpb24qIENCQ19RUkJpdE1hdHJpeFBhcnNlcjo6UmVhZFZlcnNpb24oaW50MzJfdCYgZSkgew0KKyAgaWYgKG1fdmVyc2lvbiAhPSBOVUxMKSB7DQorICAgIHJldHVybiBtX3ZlcnNpb247DQorICB9DQorICBpbnQzMl90IGRpbWVuc2lvbiA9IG1fYml0TWF0cml4LT5HZXREaW1lbnNpb24oZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBpbnQzMl90IHByb3Zpc2lvblZlcnNpb24gPSAoZGltZW5zaW9uIC0gMTcpID4+IDI7DQorICBpZiAocHJvdmlzaW9uVmVyc2lvbiA8PSA2KSB7DQorICAgIENCQ19RUkNvZGVyVmVyc2lvbiogcXJ2ID0NCisgICAgICAgIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0VmVyc2lvbkZvck51bWJlcihwcm92aXNpb25WZXJzaW9uLCBlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBmb3JtYXRJbmZvQml0cyA9IDA7DQotICAgIGludDMyX3QgaU1pbiA9IGRpbWVuc2lvbiAtIDg7DQotICAgIGZvcihqID0gZGltZW5zaW9uIC0gMTsgaiA+PSBpTWluOyBqLS0pIHsNCi0gICAgICAgIGZvcm1hdEluZm9CaXRzID0gQ29weUJpdChqLCA4LCBmb3JtYXRJbmZvQml0cyk7DQorICAgIHJldHVybiBxcnY7DQorICB9DQorICBpbnQzMl90IHZlcnNpb25CaXRzID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gNTsgaSA+PSAwOyBpLS0pIHsNCisgICAgaW50MzJfdCBqTWluID0gZGltZW5zaW9uIC0gMTE7DQorICAgIGZvciAoaW50MzJfdCBqID0gZGltZW5zaW9uIC0gOTsgaiA+PSBqTWluOyBqLS0pIHsNCisgICAgICB2ZXJzaW9uQml0cyA9IENvcHlCaXQoaSwgaiwgdmVyc2lvbkJpdHMpOw0KICAgICB9DQotICAgIGZvcihpbnQzMl90IGsgPSBkaW1lbnNpb24gLSA3OyBrIDwgZGltZW5zaW9uOyBrKyspIHsNCi0gICAgICAgIGZvcm1hdEluZm9CaXRzID0gQ29weUJpdCg4LCBrICwgZm9ybWF0SW5mb0JpdHMpOw0KKyAgfQ0KKyAgbV92ZXJzaW9uID0gQ0JDX1FSQ29kZXJWZXJzaW9uOjpEZWNvZGVWZXJzaW9uSW5mb3JtYXRpb24odmVyc2lvbkJpdHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgaWYgKG1fdmVyc2lvbiAhPSBOVUxMICYmIG1fdmVyc2lvbi0+R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpID09IGRpbWVuc2lvbikgew0KKyAgICByZXR1cm4gbV92ZXJzaW9uOw0KKyAgfQ0KKyAgdmVyc2lvbkJpdHMgPSAwOw0KKyAgZm9yIChpbnQzMl90IGogPSA1OyBqID49IDA7IGotLSkgew0KKyAgICBpbnQzMl90IGlNaW4gPSBkaW1lbnNpb24gLSAxMTsNCisgICAgZm9yIChpbnQzMl90IGkgPSBkaW1lbnNpb24gLSA5OyBpID49IGlNaW47IGktLSkgew0KKyAgICAgIHZlcnNpb25CaXRzID0gQ29weUJpdChpLCBqLCB2ZXJzaW9uQml0cyk7DQogICAgIH0NCi0gICAgbV9wYXJzZWRGb3JtYXRJbmZvID0gQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6RGVjb2RlRm9ybWF0SW5mb3JtYXRpb24oZm9ybWF0SW5mb0JpdHMpOw0KLSAgICBpZihtX3BhcnNlZEZvcm1hdEluZm8gIT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIG1fcGFyc2VkRm9ybWF0SW5mbzsNCisgIH0NCisgIG1fdmVyc2lvbiA9IENCQ19RUkNvZGVyVmVyc2lvbjo6RGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uKHZlcnNpb25CaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIGlmIChtX3ZlcnNpb24gIT0gTlVMTCAmJiBtX3ZlcnNpb24tPkdldERpbWVuc2lvbkZvclZlcnNpb24oKSA9PSBkaW1lbnNpb24pIHsNCisgICAgcmV0dXJuIG1fdmVyc2lvbjsNCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDQkNfUVJCaXRNYXRyaXhQYXJzZXI6OkNvcHlCaXQoaW50MzJfdCBpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb25CaXRzKSB7DQorICByZXR1cm4gbV9iaXRNYXRyaXgtPkdldChqLCBpKSA/ICh2ZXJzaW9uQml0cyA8PCAxKSB8IDB4MSA6IHZlcnNpb25CaXRzIDw8IDE7DQorfQ0KK0NGWF9CeXRlQXJyYXkqIENCQ19RUkJpdE1hdHJpeFBhcnNlcjo6UmVhZENvZGV3b3JkcyhpbnQzMl90JiBlKSB7DQorICBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKiBmb3JtYXRJbmZvID0gUmVhZEZvcm1hdEluZm9ybWF0aW9uKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpIENCQ19RUkNvZGVyVmVyc2lvbiogdmVyc2lvbiA9DQorICAgICAgUmVhZFZlcnNpb24oZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfUVJEYXRhTWFzayogZGF0YU1hc2sgPQ0KKyAgICAgIENCQ19RUkRhdGFNYXNrOjpGb3JSZWZlcmVuY2UoKGludDMyX3QpKGZvcm1hdEluZm8tPkdldERhdGFNYXNrKCkpLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIGludDMyX3QgZGltZW5zaW9uID0gbV9iaXRNYXRyaXgtPkdldERpbWVuc2lvbihlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIGRhdGFNYXNrLT5Vbm1hc2tCaXRNYXRpcngobV9iaXRNYXRyaXgsIGRpbWVuc2lvbik7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBjYm0gPSB2ZXJzaW9uLT5CdWlsZEZ1bmN0aW9uUGF0dGVybihlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENCQ19Db21tb25CaXRNYXRyaXg+IGZ1bmN0aW9uUGF0dGVybihjYm0pOw0KKyAgRlhfQk9PTCByZWFkaW5nVXAgPSBUUlVFOw0KKyAgQ0ZYX0J5dGVBcnJheSogdGVtcCA9IEZYX05FVyBDRlhfQnl0ZUFycmF5Ow0KKyAgdGVtcC0+U2V0U2l6ZSh2ZXJzaW9uLT5HZXRUb3RhbENvZGVXb3JkcygpKTsNCisgIENCQ19BdXRvUHRyPENGWF9CeXRlQXJyYXk+IHJlc3VsdCh0ZW1wKTsNCisgIGludDMyX3QgcmVzdWx0T2Zmc2V0ID0gMDsNCisgIGludDMyX3QgY3VycmVudEJ5dGUgPSAwOw0KKyAgaW50MzJfdCBiaXRzUmVhZCA9IDA7DQorICBmb3IgKGludDMyX3QgaiA9IGRpbWVuc2lvbiAtIDE7IGogPiAwOyBqIC09IDIpIHsNCisgICAgaWYgKGogPT0gNikgew0KKyAgICAgIGotLTsNCiAgICAgfQ0KKyAgICBmb3IgKGludDMyX3QgY291bnQgPSAwOyBjb3VudCA8IGRpbWVuc2lvbjsgY291bnQrKykgew0KKyAgICAgIGludDMyX3QgaSA9IHJlYWRpbmdVcCA/IGRpbWVuc2lvbiAtIDEgLSBjb3VudCA6IGNvdW50Ow0KKyAgICAgIGZvciAoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCAyOyBjb2wrKykgew0KKyAgICAgICAgaWYgKCFmdW5jdGlvblBhdHRlcm4tPkdldChqIC0gY29sLCBpKSkgew0KKyAgICAgICAgICBiaXRzUmVhZCsrOw0KKyAgICAgICAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgICAgICAgICAgaWYgKG1fYml0TWF0cml4LT5HZXQoaiAtIGNvbCwgaSkpIHsNCisgICAgICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChiaXRzUmVhZCA9PSA4KSB7DQorICAgICAgICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9ICh1aW50OF90KWN1cnJlbnRCeXRlOw0KKyAgICAgICAgICAgIGJpdHNSZWFkID0gMDsNCisgICAgICAgICAgICBjdXJyZW50Qnl0ZSA9IDA7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgcmVhZGluZ1VwIF49IFRSVUU7DQorICB9DQorICBpZiAocmVzdWx0T2Zmc2V0ICE9IHZlcnNpb24tPkdldFRvdGFsQ29kZVdvcmRzKCkpIHsNCiAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotQ0JDX1FSQ29kZXJWZXJzaW9uKiBDQkNfUVJCaXRNYXRyaXhQYXJzZXI6OlJlYWRWZXJzaW9uKGludDMyX3QgJmUpDQotew0KLSAgICBpZihtX3ZlcnNpb24gIT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIG1fdmVyc2lvbjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGRpbWVuc2lvbiA9IG1fYml0TWF0cml4LT5HZXREaW1lbnNpb24oZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgaW50MzJfdCBwcm92aXNpb25WZXJzaW9uID0gKGRpbWVuc2lvbiAtIDE3KSA+PiAyOw0KLSAgICBpZihwcm92aXNpb25WZXJzaW9uIDw9IDYpIHsNCi0gICAgICAgIENCQ19RUkNvZGVyVmVyc2lvbiogcXJ2ID0gQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRWZXJzaW9uRm9yTnVtYmVyKHByb3Zpc2lvblZlcnNpb24sIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgcmV0dXJuIHFydjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHZlcnNpb25CaXRzID0gMDsNCi0gICAgZm9yIChpbnQzMl90IGkgPSA1OyBpID49IDA7IGktLSkgew0KLSAgICAgICAgaW50MzJfdCBqTWluID0gZGltZW5zaW9uIC0gMTE7DQotICAgICAgICBmb3IgKGludDMyX3QgaiA9IGRpbWVuc2lvbiAtIDk7IGogPj0gak1pbjsgai0tKSB7DQotICAgICAgICAgICAgdmVyc2lvbkJpdHMgPSBDb3B5Qml0KGksIGosIHZlcnNpb25CaXRzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX3ZlcnNpb24gPSBDQkNfUVJDb2RlclZlcnNpb246OkRlY29kZVZlcnNpb25JbmZvcm1hdGlvbih2ZXJzaW9uQml0cywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgaWYgKG1fdmVyc2lvbiAhPSBOVUxMICYmIG1fdmVyc2lvbi0+R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpID09IGRpbWVuc2lvbikgew0KLSAgICAgICAgcmV0dXJuIG1fdmVyc2lvbjsNCi0gICAgfQ0KLSAgICB2ZXJzaW9uQml0cyA9IDA7DQotICAgIGZvciAoaW50MzJfdCBqID0gNTsgaiA+PSAwOyBqLS0pIHsNCi0gICAgICAgIGludDMyX3QgaU1pbiA9IGRpbWVuc2lvbiAtIDExOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSBkaW1lbnNpb24gLSA5OyBpID49IGlNaW47IGktLSkgew0KLSAgICAgICAgICAgIHZlcnNpb25CaXRzID0gQ29weUJpdChpLCBqLCB2ZXJzaW9uQml0cyk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV92ZXJzaW9uID0gQ0JDX1FSQ29kZXJWZXJzaW9uOjpEZWNvZGVWZXJzaW9uSW5mb3JtYXRpb24odmVyc2lvbkJpdHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIGlmIChtX3ZlcnNpb24gIT0gTlVMTCAmJiBtX3ZlcnNpb24tPkdldERpbWVuc2lvbkZvclZlcnNpb24oKSA9PSBkaW1lbnNpb24pIHsNCi0gICAgICAgIHJldHVybiBtX3ZlcnNpb247DQotICAgIH0NCi0gICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotaW50MzJfdCBDQkNfUVJCaXRNYXRyaXhQYXJzZXI6OkNvcHlCaXQoaW50MzJfdCBpLCBpbnQzMl90IGosIGludDMyX3QgdmVyc2lvbkJpdHMpDQotew0KLSAgICByZXR1cm4gbV9iaXRNYXRyaXgtPkdldChqLCBpKSA/ICh2ZXJzaW9uQml0cyA8PCAxKSB8IDB4MSA6IHZlcnNpb25CaXRzIDw8IDE7DQotfQ0KLUNGWF9CeXRlQXJyYXkqIENCQ19RUkJpdE1hdHJpeFBhcnNlcjo6UmVhZENvZGV3b3JkcyhpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiAqZm9ybWF0SW5mbyAgID0gUmVhZEZvcm1hdEluZm9ybWF0aW9uKGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCkNCi0gICAgQ0JDX1FSQ29kZXJWZXJzaW9uCQkJICAqdmVyc2lvbgkJPSBSZWFkVmVyc2lvbihlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDQkNfUVJEYXRhTWFzawkJICAqZGF0YU1hc2sJCT0gQ0JDX1FSRGF0YU1hc2s6OkZvclJlZmVyZW5jZSgoaW50MzJfdCkoZm9ybWF0SW5mby0+R2V0RGF0YU1hc2soKSksIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIGludDMyX3QJCQkJICBkaW1lbnNpb24JCT0gbV9iaXRNYXRyaXgtPkdldERpbWVuc2lvbihlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBkYXRhTWFzay0+VW5tYXNrQml0TWF0aXJ4KG1fYml0TWF0cml4LCBkaW1lbnNpb24pOw0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBjYm0gPSB2ZXJzaW9uLT5CdWlsZEZ1bmN0aW9uUGF0dGVybihlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQml0TWF0cml4ID4gZnVuY3Rpb25QYXR0ZXJuKGNibSk7DQotICAgIEZYX0JPT0wJCQkgIHJlYWRpbmdVcAkJPSBUUlVFOw0KLSAgICBDRlhfQnl0ZUFycmF5ICogdGVtcCA9IEZYX05FVyBDRlhfQnl0ZUFycmF5Ow0KLSAgICB0ZW1wLT5TZXRTaXplKHZlcnNpb24tPkdldFRvdGFsQ29kZVdvcmRzKCkpOw0KLSAgICBDQkNfQXV0b1B0cjxDRlhfQnl0ZUFycmF5PiByZXN1bHQodGVtcCk7DQotICAgIGludDMyX3QJCQkJICAgcmVzdWx0T2Zmc2V0ID0gMDsNCi0gICAgaW50MzJfdAkJCQkgICBjdXJyZW50Qnl0ZQk9IDA7DQotICAgIGludDMyX3QJCQkJICAgYml0c1JlYWQJCT0gMDsNCi0gICAgZm9yKGludDMyX3QgaiA9IGRpbWVuc2lvbiAtIDE7IGogPiAwOyBqIC09IDIpIHsNCi0gICAgICAgIGlmKGogPT0gNikgew0KLSAgICAgICAgICAgIGotLTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZvcihpbnQzMl90IGNvdW50ID0gMDsgY291bnQgPCBkaW1lbnNpb247IGNvdW50KyspIHsNCi0gICAgICAgICAgICBpbnQzMl90IGkgPSByZWFkaW5nVXAgPyBkaW1lbnNpb24gLSAxIC0gY291bnQgOiBjb3VudDsNCi0gICAgICAgICAgICBmb3IoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCAyOyBjb2wrKykgew0KLSAgICAgICAgICAgICAgICBpZighZnVuY3Rpb25QYXR0ZXJuLT5HZXQoaiAtIGNvbCwgaSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJpdHNSZWFkKys7DQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Qnl0ZSA8PD0gMTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKG1fYml0TWF0cml4LT5HZXQoaiAtIGNvbCwgaSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoYml0c1JlYWQgPT0gOCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcmVzdWx0KVtyZXN1bHRPZmZzZXQrK10gPSAodWludDhfdCkgY3VycmVudEJ5dGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgYml0c1JlYWQgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCeXRlID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJlYWRpbmdVcCBePSBUUlVFOw0KLSAgICB9DQotICAgIGlmKHJlc3VsdE9mZnNldCAhPSB2ZXJzaW9uLT5HZXRUb3RhbENvZGVXb3JkcygpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICB9DQotICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkJpdE1hdHJpeFBhcnNlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQml0TWF0cml4UGFyc2VyLmgKaW5kZXggNmYzNzhmZi4uODI2OTg2ZiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQml0TWF0cml4UGFyc2VyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQml0TWF0cml4UGFyc2VyLmgKQEAgLTYsMjUgKzYsMjUgQEAKIA0KICNpZm5kZWYgX0JDX1FSQUJJVE1BVFJJWFBBUlNFUl9IXw0KICNkZWZpbmUgX0JDX1FSQUJJVE1BVFJJWFBBUlNFUl9IXw0KLWNsYXNzIENCQ19Db21tb25CaXRNYXRyaXggOw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQogY2xhc3MgQ0JDX1FSQ29kZXJWZXJzaW9uOw0KIGNsYXNzIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb247DQogY2xhc3MgQ0JDX1FSRGF0YU1hc2s7DQotY2xhc3MgQ0JDX1FSQml0TWF0cml4UGFyc2VyDQotew0KLXByaXZhdGU6DQotICAgIENCQ19Db21tb25CaXRNYXRyaXggKm1fYml0TWF0cml4Ow0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4ICptX3RlbXBCaXRNYXRyaXg7DQotICAgIENCQ19RUkNvZGVyVmVyc2lvbiAgICptX3ZlcnNpb247DQotICAgIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24gKm1fcGFyc2VkRm9ybWF0SW5mbzsNCi0gICAgaW50MzJfdCBtX2RpbWVuc2lvbjsNCi1wdWJsaWM6DQotICAgIENCQ19RUkJpdE1hdHJpeFBhcnNlcigpOw0KLSAgICB2aXJ0dWFsIH5DQkNfUVJCaXRNYXRyaXhQYXJzZXIoKTsNCi0gICAgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiAqUmVhZEZvcm1hdEluZm9ybWF0aW9uKGludDMyX3QgJmUpOw0KLSAgICBDQkNfUVJDb2RlclZlcnNpb24JCQkgICpSZWFkVmVyc2lvbihpbnQzMl90ICZlKTsNCi0gICAgaW50MzJfdAkJCQkgICBDb3B5Qml0KGludDMyX3QgaSwgaW50MzJfdCBqLCBpbnQzMl90IHZlcnNpb25CaXRzKTsNCi0gICAgQ0ZYX0J5dGVBcnJheQkgICpSZWFkQ29kZXdvcmRzKGludDMyX3QgJmUpOw0KLSAgICB2aXJ0dWFsIHZvaWQgSW5pdChDQkNfQ29tbW9uQml0TWF0cml4ICpiaXRNYXRyaXgsIGludDMyX3QgJmUpOw0KK2NsYXNzIENCQ19RUkJpdE1hdHJpeFBhcnNlciB7DQorIHByaXZhdGU6DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBtX2JpdE1hdHJpeDsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1fdGVtcEJpdE1hdHJpeDsNCisgIENCQ19RUkNvZGVyVmVyc2lvbiogbV92ZXJzaW9uOw0KKyAgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiogbV9wYXJzZWRGb3JtYXRJbmZvOw0KKyAgaW50MzJfdCBtX2RpbWVuc2lvbjsNCisNCisgcHVibGljOg0KKyAgQ0JDX1FSQml0TWF0cml4UGFyc2VyKCk7DQorICB2aXJ0dWFsIH5DQkNfUVJCaXRNYXRyaXhQYXJzZXIoKTsNCisgIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24qIFJlYWRGb3JtYXRJbmZvcm1hdGlvbihpbnQzMl90JiBlKTsNCisgIENCQ19RUkNvZGVyVmVyc2lvbiogUmVhZFZlcnNpb24oaW50MzJfdCYgZSk7DQorICBpbnQzMl90IENvcHlCaXQoaW50MzJfdCBpLCBpbnQzMl90IGosIGludDMyX3QgdmVyc2lvbkJpdHMpOw0KKyAgQ0ZYX0J5dGVBcnJheSogUmVhZENvZGV3b3JkcyhpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgdm9pZCBJbml0KENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCwgaW50MzJfdCYgZSk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlUmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVSZWFkZXIuY3BwCmluZGV4IGFiMjhmMzQuLmYzZWE3ZWEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVSZWFkZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVSZWFkZXIuY3BwCkBAIC00MCw3MiArNDAsNzIgQEAKICNpbmNsdWRlICJCQ19RUkRhdGFNYXNrLmgiDQogI2luY2x1ZGUgIkJDX1FSQ29kZVJlYWRlci5oIg0KICNpbmNsdWRlICJCQ19RUkNvZGVyVmVyc2lvbi5oIg0KLUNCQ19RUkNvZGVSZWFkZXI6OkNCQ19RUkNvZGVSZWFkZXIoKTogbV9kZWNvZGVyKE5VTEwpDQotew0KK0NCQ19RUkNvZGVSZWFkZXI6OkNCQ19RUkNvZGVSZWFkZXIoKSA6IG1fZGVjb2RlcihOVUxMKSB7fQ0KK3ZvaWQgQ0JDX1FSQ29kZVJlYWRlcjo6SW5pdCgpIHsNCisgIG1fZGVjb2RlciA9IEZYX05FVyBDQkNfUVJDb2RlckRlY29kZXI7DQorICBtX2RlY29kZXItPkluaXQoKTsNCiB9DQotdm9pZCBDQkNfUVJDb2RlUmVhZGVyOjpJbml0KCkNCi17DQotICAgIG1fZGVjb2RlciA9IEZYX05FVyBDQkNfUVJDb2RlckRlY29kZXI7DQotICAgIG1fZGVjb2Rlci0+SW5pdCgpOw0KK0NCQ19RUkNvZGVSZWFkZXI6On5DQkNfUVJDb2RlUmVhZGVyKCkgew0KKyAgaWYgKG1fZGVjb2RlciAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX2RlY29kZXI7DQorICB9DQorICBtX2RlY29kZXIgPSBOVUxMOw0KIH0NCi1DQkNfUVJDb2RlUmVhZGVyOjp+Q0JDX1FSQ29kZVJlYWRlcigpDQotew0KLSAgICBpZihtX2RlY29kZXIgIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIG1fZGVjb2RlcjsNCi0gICAgfQ0KLSAgICBtX2RlY29kZXIgPSBOVUxMOw0KK0NGWF9CeXRlU3RyaW5nIENCQ19RUkNvZGVSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbWF0cml4ID0gaW1hZ2UtPkdldE1hdHJpeChlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBDQkNfUVJEZXRlY3RvciBkZXRlY3RvcihtYXRyaXgpOw0KKyAgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQqIHFkciA9IGRldGVjdG9yLkRldGVjdChoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1FSRGV0ZWN0b3JSZXN1bHQ+IGRldGVjdG9yUmVzdWx0KHFkcik7DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogcWRyMiA9DQorICAgICAgbV9kZWNvZGVyLT5EZWNvZGUoZGV0ZWN0b3JSZXN1bHQtPkdldEJpdHMoKSwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ+IGRlY29kZVJlc3VsdChxZHIyKTsNCisgIHJldHVybiAoZGVjb2RlUmVzdWx0LT5HZXRUZXh0KCkpOw0KIH0NCi1DRlhfQnl0ZVN0cmluZyBDQkNfUVJDb2RlUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCAqaW1hZ2UsIGludDMyX3QgaGludHMsIGludDMyX3QgJmUpDQotew0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4ICptYXRyaXggPSBpbWFnZS0+R2V0TWF0cml4KGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICBDQkNfUVJEZXRlY3RvciBkZXRlY3RvcihtYXRyaXgpOw0KLSAgICBDQkNfUVJEZXRlY3RvclJlc3VsdCogcWRyID0gZGV0ZWN0b3IuRGV0ZWN0KGhpbnRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1FSRGV0ZWN0b3JSZXN1bHQ+IGRldGVjdG9yUmVzdWx0KHFkcik7DQotICAgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBxZHIyID0gbV9kZWNvZGVyLT5EZWNvZGUoZGV0ZWN0b3JSZXN1bHQtPkdldEJpdHMoKSwgMCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQotICAgIENCQ19BdXRvUHRyPENCQ19Db21tb25EZWNvZGVyUmVzdWx0PiBkZWNvZGVSZXN1bHQocWRyMik7DQotICAgIHJldHVybiAoZGVjb2RlUmVzdWx0LT5HZXRUZXh0KCkpOw0KK0NGWF9CeXRlU3RyaW5nIENCQ19RUkNvZGVSZWFkZXI6OkRlY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZU1vZGVEZWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShmaWxlbmFtZSk7DQorICBzb3VyY2UuSW5pdChlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgIENCQ19CaW5hcnlCaXRtYXAgYml0bWFwKCZiaW5hcml6ZXIpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSBEZWNvZGUoJmJpdG1hcCwgaGludHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIHJldHVybiBiczsNCiB9DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX1FSQ29kZVJlYWRlcjo6RGVjb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZmaWxlbmFtZSwgaW50MzJfdCBoaW50cywgaW50MzJfdCBieXRlTW9kZURlY29kZSwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShmaWxlbmFtZSk7DQotICAgIHNvdXJjZS5Jbml0KGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCi0gICAgQ0JDX0JpbmFyeUJpdG1hcCBiaXRtYXAoJmJpbmFyaXplcik7DQotICAgIENGWF9CeXRlU3RyaW5nIGJzID0gRGVjb2RlKCZiaXRtYXAsIGhpbnRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgcmV0dXJuIGJzOw0KK0NGWF9CeXRlU3RyaW5nIENCQ19RUkNvZGVSZWFkZXI6OkRlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZU1vZGVEZWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCisgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgYmluYXJpemVyKCZzb3VyY2UpOw0KKyAgQ0JDX0JpbmFyeUJpdG1hcCBiaXRtYXAoJmJpbmFyaXplcik7DQorICBDRlhfQnl0ZVN0cmluZyBicyA9IERlY29kZSgmYml0bWFwLCBoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgcmV0dXJuIGJzOw0KIH0NCi1DRlhfQnl0ZVN0cmluZyBDQkNfUVJDb2RlUmVhZGVyOjpEZWNvZGUoQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90IGJ5dGVNb2RlRGVjb2RlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KLSAgICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCi0gICAgQ0JDX0JpbmFyeUJpdG1hcCBiaXRtYXAoJmJpbmFyaXplcik7DQotICAgIENGWF9CeXRlU3RyaW5nIGJzID0gRGVjb2RlKCZiaXRtYXAsIGhpbnRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCi0gICAgcmV0dXJuIGJzOw0KK0NGWF9CeXRlU3RyaW5nIENCQ19RUkNvZGVSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSBEZWNvZGUoaW1hZ2UsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIHJldHVybiBiczsNCiB9DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX1FSQ29kZVJlYWRlcjo6RGVjb2RlKENCQ19CaW5hcnlCaXRtYXAgKmltYWdlLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSBEZWNvZGUoaW1hZ2UsIDAsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KLSAgICByZXR1cm4gYnM7DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZVJlYWRlcjo6UmVsZWFzZUFsbCgpDQotew0KLSAgICBpZihDQkNfUmVlZFNvbG9tb25HRjI1NiA6OlFSQ29kZUZpbGQpIHsNCi0gICAgICAgIGRlbGV0ZSBDQkNfUmVlZFNvbG9tb25HRjI1NiA6OlFSQ29kZUZpbGQ7DQotICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NiA6OlFSQ29kZUZpbGQgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKENCQ19SZWVkU29sb21vbkdGMjU2IDo6RGF0YU1hdHJpeEZpZWxkKSB7DQotICAgICAgICBkZWxldGUgQ0JDX1JlZWRTb2xvbW9uR0YyNTYgOjpEYXRhTWF0cml4RmllbGQ7DQotICAgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NiA6OkRhdGFNYXRyaXhGaWVsZCA9IE5VTEw7DQotICAgIH0NCi0gICAgQ0JDX1FSQ29kZXJNb2RlOjpEZXN0cm95KCk7DQotICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkRlc3Ryb3koKTsNCi0gICAgQ0JDX1FSRGF0YU1hc2s6OkRlc3Ryb3koKTsNCi0gICAgQ0JDX1FSQ29kZXJWZXJzaW9uOjpEZXN0cm95KCk7DQordm9pZCBDQkNfUVJDb2RlUmVhZGVyOjpSZWxlYXNlQWxsKCkgew0KKyAgaWYgKENCQ19SZWVkU29sb21vbkdGMjU2OjpRUkNvZGVGaWxkKSB7DQorICAgIGRlbGV0ZSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6UVJDb2RlRmlsZDsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OlFSQ29kZUZpbGQgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKENCQ19SZWVkU29sb21vbkdGMjU2OjpEYXRhTWF0cml4RmllbGQpIHsNCisgICAgZGVsZXRlIENCQ19SZWVkU29sb21vbkdGMjU2OjpEYXRhTWF0cml4RmllbGQ7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2OjpEYXRhTWF0cml4RmllbGQgPSBOVUxMOw0KKyAgfQ0KKyAgQ0JDX1FSQ29kZXJNb2RlOjpEZXN0cm95KCk7DQorICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpEZXN0cm95KCk7DQorICBDQkNfUVJEYXRhTWFzazo6RGVzdHJveSgpOw0KKyAgQ0JDX1FSQ29kZXJWZXJzaW9uOjpEZXN0cm95KCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVSZWFkZXIuaAppbmRleCA3M2I4M2QzLi41OWJkNjcxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlUmVhZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVJlYWRlci5oCkBAIC0xOCwxOCArMTgsMjQgQEAKIGNsYXNzIENCQ19RUkNvZGVyTW9kZTsNCiBjbGFzcyBDQkNfUVJEYXRhTWFzazsNCiBjbGFzcyBDQkNfUVJDb2RlUmVhZGVyOw0KLWNsYXNzIENCQ19RUkNvZGVSZWFkZXIgIDogcHVibGljIENCQ19SZWFkZXINCi17DQotcHJpdmF0ZToNCi0gICAgQ0JDX1FSQ29kZXJEZWNvZGVyICptX2RlY29kZXI7DQotcHVibGljOg0KLSAgICBDQkNfUVJDb2RlUmVhZGVyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVSZWFkZXIoKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCAqcEJpdG1hcCwgaW50MzJfdCBoaW50cywgaW50MzJfdCBieXRlTW9kZURlY29kZSwgaW50MzJfdCAmZSk7DQotICAgIENGWF9CeXRlU3RyaW5nIERlY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyAmZmlsZW5hbWUsIGludDMyX3QgaGludHMsIGludDMyX3QgYnl0ZU1vZGVEZWNvZGUsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBSZWxlYXNlQWxsKCk7DQotICAgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgaW50MzJfdCBoaW50cywgaW50MzJfdCAmZSk7DQotICAgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwICppbWFnZSwgaW50MzJfdCAmZSk7DQotICAgIHZpcnR1YWwgdm9pZCBJbml0KCk7DQorY2xhc3MgQ0JDX1FSQ29kZVJlYWRlciA6IHB1YmxpYyBDQkNfUmVhZGVyIHsNCisgcHJpdmF0ZToNCisgIENCQ19RUkNvZGVyRGVjb2RlciogbV9kZWNvZGVyOw0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJDb2RlUmVhZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfUVJDb2RlUmVhZGVyKCk7DQorICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlTW9kZURlY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVNb2RlRGVjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgUmVsZWFzZUFsbCgpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmNwcAppbmRleCBjNTJlYzhlLi42NTg5MWE1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmNwcApAQCAtMjksNzUgKzI5LDc5IEBACiAjaW5jbHVkZSAiQkNfUVJDb2Rlci5oIg0KICNpbmNsdWRlICJCQ19RUkNvZGVSZWFkZXIuaCINCiAjaW5jbHVkZSAiQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiDQotQ0JDX1FSQ29kZVdyaXRlcjo6Q0JDX1FSQ29kZVdyaXRlcigpDQotew0KLSAgICBtX2JGaXhlZFNpemUgPSBUUlVFOw0KLSAgICBtX2lDb3JyZWN0TGV2ZWwgPSAxOw0KLSAgICBtX2lWZXJzaW9uID0gMDsNCitDQkNfUVJDb2RlV3JpdGVyOjpDQkNfUVJDb2RlV3JpdGVyKCkgew0KKyAgbV9iRml4ZWRTaXplID0gVFJVRTsNCisgIG1faUNvcnJlY3RMZXZlbCA9IDE7DQorICBtX2lWZXJzaW9uID0gMDsNCiB9DQotQ0JDX1FSQ29kZVdyaXRlcjo6fkNCQ19RUkNvZGVXcml0ZXIoKQ0KLXsNCitDQkNfUVJDb2RlV3JpdGVyOjp+Q0JDX1FSQ29kZVdyaXRlcigpIHt9DQordm9pZCBDQkNfUVJDb2RlV3JpdGVyOjpSZWxlYXNlQWxsKCkgew0KKyAgQ0JDX1FSQ29kZVJlYWRlcjo6UmVsZWFzZUFsbCgpOw0KIH0NCi12b2lkIENCQ19RUkNvZGVXcml0ZXI6OlJlbGVhc2VBbGwoKQ0KLXsNCi0gICAgQ0JDX1FSQ29kZVJlYWRlcjo6UmVsZWFzZUFsbCgpOw0KK0ZYX0JPT0wgQ0JDX1FSQ29kZVdyaXRlcjo6U2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pIHsNCisgIGlmICh2ZXJzaW9uIDwgMCB8fCB2ZXJzaW9uID4gNDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9pVmVyc2lvbiA9IHZlcnNpb247DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDQkNfUVJDb2RlV3JpdGVyOjpTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbikNCi17DQotICAgIGlmICh2ZXJzaW9uIDwgMCB8fCB2ZXJzaW9uID4gNDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENCQ19RUkNvZGVXcml0ZXI6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpIHsNCisgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiAzKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1faUNvcnJlY3RMZXZlbCA9IGxldmVsOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3VpbnQ4X3QqIENCQ19RUkNvZGVXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWMgPSBOVUxMOw0KKyAgc3dpdGNoIChlY0xldmVsKSB7DQorICAgIGNhc2UgMDoNCisgICAgICBlYyA9IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Okw7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMToNCisgICAgICBlYyA9IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Ok07DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjoNCisgICAgICBlYyA9IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OlE7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzoNCisgICAgICBlYyA9IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Okg7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBlID0gQkNFeGNlcHRpb25VblN1cHBvcnRFY2xldmVsOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCiAgICAgfQ0KLSAgICBtX2lWZXJzaW9uID0gdmVyc2lvbjsNCi0gICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDQkNfUVJDb2RlciBxcjsNCisgIGlmIChtX2lWZXJzaW9uID4gMCAmJiBtX2lWZXJzaW9uIDwgNDEpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0ciA9IGNvbnRlbnRzLlVURjhFbmNvZGUoKTsNCisgICAgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGUoYnl0ZVN0ciwgZWMsICZxciwgZSwgbV9pVmVyc2lvbik7DQorICB9IGVsc2Ugew0KKyAgICBDQkNfUVJDb2RlckVuY29kZXI6OkVuY29kZShjb250ZW50cywgZWMsICZxciwgZSk7DQorICB9DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBvdXRXaWR0aCA9IHFyLkdldE1hdHJpeFdpZHRoKCk7DQorICBvdXRIZWlnaHQgPSBxci5HZXRNYXRyaXhXaWR0aCgpOw0KKyAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2ModWludDhfdCwgb3V0V2lkdGggKiBvdXRXaWR0aCk7DQorICBGWFNZU19tZW1jcHkocmVzdWx0LCBxci5HZXRNYXRyaXgoKS0+R2V0QXJyYXkoKSwgb3V0V2lkdGggKiBvdXRIZWlnaHQpOw0KKyAgcmV0dXJuIHJlc3VsdDsNCiB9DQotRlhfQk9PTCBDQkNfUVJDb2RlV3JpdGVyOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKQ0KLXsNCi0gICAgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IDMpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX2lDb3JyZWN0TGV2ZWwgPSBsZXZlbDsNCi0gICAgcmV0dXJuIFRSVUU7DQordWludDhfdCogQ0JDX1FSQ29kZVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICByZXR1cm4gTlVMTDsNCiB9DQotdWludDhfdCogQ0JDX1FSQ29kZVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjb250ZW50cywgaW50MzJfdCBlY0xldmVsLCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCAqZWMgPSBOVUxMOw0KLSAgICBzd2l0Y2goZWNMZXZlbCkgew0KLSAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgIGVjID0gQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6TDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICBlYyA9IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Ok07DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgZWMgPSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpROw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgIGVjID0gQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6SDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uVW5TdXBwb3J0RWNsZXZlbDsNCi0gICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBDQkNfUVJDb2RlciBxcjsNCi0gICAgaWYgKG1faVZlcnNpb24gPiAwICYmIG1faVZlcnNpb24gPCA0MSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0ciA9IGNvbnRlbnRzLlVURjhFbmNvZGUoKTsNCi0gICAgICAgIENCQ19RUkNvZGVyRW5jb2Rlcjo6RW5jb2RlKGJ5dGVTdHIsIGVjLCAmcXIsIGUsIG1faVZlcnNpb24pOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGUoY29udGVudHMsIGVjLCAmcXIsIGUpOw0KLSAgICB9DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgb3V0V2lkdGggPSBxci5HZXRNYXRyaXhXaWR0aCgpOw0KLSAgICBvdXRIZWlnaHQgPSBxci5HZXRNYXRyaXhXaWR0aCgpOw0KLSAgICB1aW50OF90KiByZXN1bHQgPSBGWF9BbGxvYyh1aW50OF90LCBvdXRXaWR0aCAqIG91dFdpZHRoKTsNCi0gICAgRlhTWVNfbWVtY3B5KHJlc3VsdCwgcXIuR2V0TWF0cml4KCktPkdldEFycmF5KCksIG91dFdpZHRoICogb3V0SGVpZ2h0KTsNCi0gICAgcmV0dXJuIHJlc3VsdDsNCi19DQotdWludDhfdCAqQ0JDX1FSQ29kZVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLXVpbnQ4X3QqIENCQ19RUkNvZGVXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsIEJDRk9STUFUIGZvcm1hdCwgaW50MzJfdCAmb3V0V2lkdGgsIGludDMyX3QgJm91dEhlaWdodCwgaW50MzJfdCAmZSkNCi17DQotICAgIHJldHVybiBOVUxMOw0KK3VpbnQ4X3QqIENCQ19RUkNvZGVXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuaAppbmRleCA3Y2ZkOTc4Li41MTI3MmY2IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5oCkBAIC0xMCwxOSArMTAsMzEgQEAKIGNsYXNzIENCQ19Ud29EaW1Xcml0ZXI7DQogY2xhc3MgQ0JDX011bHRpQmFyQ29kZXM7DQogY2xhc3MgQ0JDX1FSQ29kZXJXcml0ZXI7DQotY2xhc3MgQ0JDX1FSQ29kZVdyaXRlciAgOiBwdWJsaWMgQ0JDX1R3b0RpbVdyaXRlcg0KLXsNCi1wdWJsaWM6DQotICAgIENCQ19RUkNvZGVXcml0ZXIoKTsNCi0gICAgdmlydHVhbCB+Q0JDX1FSQ29kZVdyaXRlcigpOw0KLSAgICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNvbnRlbnRzLCBpbnQzMl90IGVjTGV2ZWwsIGludDMyX3QgJm91dFdpZHRoLCBpbnQzMl90ICZvdXRIZWlnaHQsIGludDMyX3QgICZlKTsNCi0gICAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKTsNCi0gICAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywgQkNGT1JNQVQgZm9ybWF0LCBpbnQzMl90ICZvdXRXaWR0aCwgaW50MzJfdCAmb3V0SGVpZ2h0LCBpbnQzMl90ICZlKTsNCi0gICAgRlhfQk9PTCBTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbik7DQotICAgIEZYX0JPT0wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCk7DQotICAgIHN0YXRpYyB2b2lkIFJlbGVhc2VBbGwoKTsNCi1wcml2YXRlOg0KK2NsYXNzIENCQ19RUkNvZGVXcml0ZXIgOiBwdWJsaWMgQ0JDX1R3b0RpbVdyaXRlciB7DQorIHB1YmxpYzoNCisgIENCQ19RUkNvZGVXcml0ZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGVXcml0ZXIoKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbik7DQorICBGWF9CT09MIFNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpOw0KKyAgc3RhdGljIHZvaWQgUmVsZWFzZUFsbCgpOw0KIA0KLSAgICBpbnQzMl90IG1faVZlcnNpb247DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1faVZlcnNpb247DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5jcHAKaW5kZXggMWY2NDIwMS4uMzU2OWMxYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmNwcApAQCAtMjUsMTQ0ICsyNSwxMTEgQEAKICNpbmNsdWRlICJCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCiAjaW5jbHVkZSAiQkNfUVJDb2Rlck1vZGUuaCINCiAjaW5jbHVkZSAiQkNfUVJDb2Rlci5oIg0KLUNCQ19RUkNvZGVyOjpDQkNfUVJDb2RlcigpDQotew0KLSAgICBtX21vZGUgPSBOVUxMOw0KLSAgICBtX2VjTGV2ZWwgPSBOVUxMOw0KLSAgICBtX3ZlcnNpb24gPSAtMTsNCi0gICAgbV9tYXRyaXhXaWR0aCA9IC0xOw0KLSAgICBtX21hc2tQYXR0ZXJuID0gLTE7DQotICAgIG1fbnVtVG90YWxCeXRlcyA9IC0xOw0KLSAgICBtX251bURhdGFCeXRlcyA9IC0xOw0KLSAgICBtX251bUVDQnl0ZXMgPSAtMTsNCi0gICAgbV9udW1SU0Jsb2NrcyA9IC0xOw0KK0NCQ19RUkNvZGVyOjpDQkNfUVJDb2RlcigpIHsNCisgIG1fbW9kZSA9IE5VTEw7DQorICBtX2VjTGV2ZWwgPSBOVUxMOw0KKyAgbV92ZXJzaW9uID0gLTE7DQorICBtX21hdHJpeFdpZHRoID0gLTE7DQorICBtX21hc2tQYXR0ZXJuID0gLTE7DQorICBtX251bVRvdGFsQnl0ZXMgPSAtMTsNCisgIG1fbnVtRGF0YUJ5dGVzID0gLTE7DQorICBtX251bUVDQnl0ZXMgPSAtMTsNCisgIG1fbnVtUlNCbG9ja3MgPSAtMTsNCisgIG1fbWF0cml4ID0gTlVMTDsNCit9DQorQ0JDX1FSQ29kZXI6On5DQkNfUVJDb2RlcigpIHsNCisgIGlmIChtX21hdHJpeCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX21hdHJpeDsNCiAgICAgbV9tYXRyaXggPSBOVUxMOw0KKyAgfQ0KKyAgbV9tb2RlID0gTlVMTDsNCisgIG1fZWNMZXZlbCA9IE5VTEw7DQorICBtX3ZlcnNpb24gPSAtMTsNCisgIG1fbWF0cml4V2lkdGggPSAtMTsNCisgIG1fbWFza1BhdHRlcm4gPSAtMTsNCisgIG1fbnVtVG90YWxCeXRlcyA9IC0xOw0KKyAgbV9udW1EYXRhQnl0ZXMgPSAtMTsNCisgIG1fbnVtRUNCeXRlcyA9IC0xOw0KKyAgbV9udW1SU0Jsb2NrcyA9IC0xOw0KIH0NCi1DQkNfUVJDb2Rlcjo6fkNCQ19RUkNvZGVyKCkNCi17DQotICAgIGlmKG1fbWF0cml4ICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBtX21hdHJpeDsNCi0gICAgICAgIG1fbWF0cml4ID0gTlVMTDsNCi0gICAgfQ0KLSAgICBtX21vZGUgPSBOVUxMOw0KLSAgICBtX2VjTGV2ZWwgPSBOVUxMOw0KLSAgICBtX3ZlcnNpb24gPSAtMTsNCi0gICAgbV9tYXRyaXhXaWR0aCA9IC0xOw0KLSAgICBtX21hc2tQYXR0ZXJuID0gLTE7DQotICAgIG1fbnVtVG90YWxCeXRlcyA9IC0xOw0KLSAgICBtX251bURhdGFCeXRlcyA9IC0xOw0KLSAgICBtX251bUVDQnl0ZXMgPSAtMTsNCi0gICAgbV9udW1SU0Jsb2NrcyA9IC0xOw0KK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXI6OkdldE1vZGUoKSB7DQorICByZXR1cm4gbV9tb2RlOw0KIH0NCi1DQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyOjpHZXRNb2RlKCkNCi17DQotICAgIHJldHVybiBtX21vZGU7DQorQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX1FSQ29kZXI6OkdldEVDTGV2ZWwoKSB7DQorICByZXR1cm4gbV9lY0xldmVsOw0KIH0NCi1DQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2Rlcjo6R2V0RUNMZXZlbCgpDQotew0KLSAgICByZXR1cm4gbV9lY0xldmVsOw0KK2ludDMyX3QgQ0JDX1FSQ29kZXI6OkdldFZlcnNpb24oKSB7DQorICByZXR1cm4gbV92ZXJzaW9uOw0KIH0NCi1pbnQzMl90IENCQ19RUkNvZGVyOjpHZXRWZXJzaW9uKCkNCi17DQotICAgIHJldHVybiBtX3ZlcnNpb247DQoraW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TWF0cml4V2lkdGgoKSB7DQorICByZXR1cm4gbV9tYXRyaXhXaWR0aDsNCiB9DQotaW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TWF0cml4V2lkdGgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbWF0cml4V2lkdGg7DQoraW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TWFza1BhdHRlcm4oKSB7DQorICByZXR1cm4gbV9tYXNrUGF0dGVybjsNCiB9DQotaW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TWFza1BhdHRlcm4oKQ0KLXsNCi0gICAgcmV0dXJuIG1fbWFza1BhdHRlcm47DQoraW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TnVtVG90YWxCeXRlcygpIHsNCisgIHJldHVybiBtX251bVRvdGFsQnl0ZXM7DQogfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXI6OkdldE51bVRvdGFsQnl0ZXMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbnVtVG90YWxCeXRlczsNCitpbnQzMl90IENCQ19RUkNvZGVyOjpHZXROdW1EYXRhQnl0ZXMoKSB7DQorICByZXR1cm4gbV9udW1EYXRhQnl0ZXM7DQogfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXI6OkdldE51bURhdGFCeXRlcygpDQotew0KLSAgICByZXR1cm4gbV9udW1EYXRhQnl0ZXM7DQoraW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TnVtRUNCeXRlcygpIHsNCisgIHJldHVybiBtX251bUVDQnl0ZXM7DQogfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXI6OkdldE51bUVDQnl0ZXMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbnVtRUNCeXRlczsNCitpbnQzMl90IENCQ19RUkNvZGVyOjpHZXROdW1SU0Jsb2NrcygpIHsNCisgIHJldHVybiBtX251bVJTQmxvY2tzOw0KIH0NCi1pbnQzMl90IENCQ19RUkNvZGVyOjpHZXROdW1SU0Jsb2NrcygpDQotew0KLSAgICByZXR1cm4gbV9udW1SU0Jsb2NrczsNCitDQkNfQ29tbW9uQnl0ZU1hdHJpeCogQ0JDX1FSQ29kZXI6OkdldE1hdHJpeCgpIHsNCisgIHJldHVybiBtX21hdHJpeDsNCiB9DQotQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIENCQ19RUkNvZGVyOjpHZXRNYXRyaXgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fbWF0cml4Ow0KK2ludDMyX3QgQ0JDX1FSQ29kZXI6OkF0KGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IHZhbHVlID0gbV9tYXRyaXgtPkdldCh4LCB5KTsNCisgIGlmICghKHZhbHVlID09IDAgfHwgdmFsdWUgPT0gMSkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uVmFsdWVNdXN0QmVFaXRoZXIwb3IxOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICB9DQorICByZXR1cm4gdmFsdWU7DQogfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXI6OkF0KGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCB2YWx1ZSA9IG1fbWF0cml4LT5HZXQoeCwgeSk7DQotICAgIGlmKCEodmFsdWUgPT0gMCB8fCB2YWx1ZSA9PSAxKSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uVmFsdWVNdXN0QmVFaXRoZXIwb3IxOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KLSAgICB9DQotICAgIHJldHVybiB2YWx1ZTsNCitGWF9CT09MIENCQ19RUkNvZGVyOjpJc1ZhbGlkKCkgew0KKyAgcmV0dXJuIG1fbW9kZSAhPSBOVUxMICYmIG1fZWNMZXZlbCAhPSBOVUxMICYmIG1fdmVyc2lvbiAhPSAtMSAmJg0KKyAgICAgICAgIG1fbWF0cml4V2lkdGggIT0gLTEgJiYgbV9tYXNrUGF0dGVybiAhPSAtMSAmJiBtX251bVRvdGFsQnl0ZXMgIT0gLTEgJiYNCisgICAgICAgICBtX251bURhdGFCeXRlcyAhPSAtMSAmJiBtX251bUVDQnl0ZXMgIT0gLTEgJiYgbV9udW1SU0Jsb2NrcyAhPSAtMSAmJg0KKyAgICAgICAgIElzVmFsaWRNYXNrUGF0dGVybihtX21hc2tQYXR0ZXJuKSAmJg0KKyAgICAgICAgIG1fbnVtVG90YWxCeXRlcyA9PSBtX251bURhdGFCeXRlcyArIG1fbnVtRUNCeXRlcyAmJiBtX21hdHJpeCAhPSBOVUxMICYmDQorICAgICAgICAgbV9tYXRyaXhXaWR0aCA9PSBtX21hdHJpeC0+R2V0V2lkdGgoKSAmJg0KKyAgICAgICAgIG1fbWF0cml4LT5HZXRXaWR0aCgpID09IG1fbWF0cml4LT5HZXRIZWlnaHQoKTsNCiB9DQotRlhfQk9PTCBDQkNfUVJDb2Rlcjo6SXNWYWxpZCgpDQotew0KLSAgICByZXR1cm4NCi0gICAgICAgIG1fbW9kZSAhPSBOVUxMICYmDQotICAgICAgICBtX2VjTGV2ZWwgIT0gTlVMTCAmJg0KLSAgICAgICAgbV92ZXJzaW9uICE9IC0xICYmDQotICAgICAgICBtX21hdHJpeFdpZHRoICE9IC0xICYmDQotICAgICAgICBtX21hc2tQYXR0ZXJuICE9IC0xICYmDQotICAgICAgICBtX251bVRvdGFsQnl0ZXMgIT0gLTEgJiYNCi0gICAgICAgIG1fbnVtRGF0YUJ5dGVzICE9IC0xICYmDQotICAgICAgICBtX251bUVDQnl0ZXMgIT0gLTEgJiYNCi0gICAgICAgIG1fbnVtUlNCbG9ja3MgIT0gLTEgJiYNCi0gICAgICAgIElzVmFsaWRNYXNrUGF0dGVybihtX21hc2tQYXR0ZXJuKSAmJg0KLSAgICAgICAgbV9udW1Ub3RhbEJ5dGVzID09IG1fbnVtRGF0YUJ5dGVzICsgbV9udW1FQ0J5dGVzICYmDQotICAgICAgICBtX21hdHJpeCAhPSBOVUxMICYmDQotICAgICAgICBtX21hdHJpeFdpZHRoID09IG1fbWF0cml4LT5HZXRXaWR0aCgpICYmDQotICAgICAgICBtX21hdHJpeC0+R2V0V2lkdGgoKSA9PSBtX21hdHJpeC0+R2V0SGVpZ2h0KCk7DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TW9kZShDQkNfUVJDb2Rlck1vZGUqIHZhbHVlKSB7DQorICBtX21vZGUgPSB2YWx1ZTsNCiB9DQotdm9pZCBDQkNfUVJDb2Rlcjo6U2V0TW9kZShDQkNfUVJDb2Rlck1vZGUqIHZhbHVlKQ0KLXsNCi0gICAgbV9tb2RlID0gdmFsdWU7DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0RUNMZXZlbChDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsKSB7DQorICBtX2VjTGV2ZWwgPSBlY0xldmVsOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyOjpTZXRFQ0xldmVsKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwpDQotew0KLSAgICBtX2VjTGV2ZWwgPSBlY0xldmVsOw0KK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKSB7DQorICBtX3ZlcnNpb24gPSB2ZXJzaW9uOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyOjpTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbikNCi17DQotICAgIG1fdmVyc2lvbiA9IHZlcnNpb247DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TWF0cml4V2lkdGgoaW50MzJfdCB3aWR0aCkgew0KKyAgbV9tYXRyaXhXaWR0aCA9IHdpZHRoOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyOjpTZXRNYXRyaXhXaWR0aChpbnQzMl90IHdpZHRoKQ0KLXsNCi0gICAgbV9tYXRyaXhXaWR0aCA9IHdpZHRoOw0KK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldE1hc2tQYXR0ZXJuKGludDMyX3QgcGF0dGVybikgew0KKyAgbV9tYXNrUGF0dGVybiA9IHBhdHRlcm47DQogfQ0KLXZvaWQgQ0JDX1FSQ29kZXI6OlNldE1hc2tQYXR0ZXJuKGludDMyX3QgcGF0dGVybikNCi17DQotICAgIG1fbWFza1BhdHRlcm4gPSBwYXR0ZXJuOw0KK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldE51bURhdGFCeXRlcyhpbnQzMl90IGJ5dGVzKSB7DQorICBtX251bURhdGFCeXRlcyA9IGJ5dGVzOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyOjpTZXROdW1EYXRhQnl0ZXMoaW50MzJfdCBieXRlcykNCi17DQotICAgIG1fbnVtRGF0YUJ5dGVzID0gYnl0ZXM7DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtVG90YWxCeXRlcyhpbnQzMl90IHZhbHVlKSB7DQorICBtX251bVRvdGFsQnl0ZXMgPSB2YWx1ZTsNCiB9DQotdm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtVG90YWxCeXRlcyhpbnQzMl90IHZhbHVlKQ0KLXsNCi0gICAgbV9udW1Ub3RhbEJ5dGVzID0gdmFsdWU7DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtUlNCbG9ja3MoaW50MzJfdCBibG9jaykgew0KKyAgbV9udW1SU0Jsb2NrcyA9IGJsb2NrOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyOjpTZXROdW1SU0Jsb2NrcyhpbnQzMl90IGJsb2NrKQ0KLXsNCi0gICAgbV9udW1SU0Jsb2NrcyA9IGJsb2NrOw0KK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldE51bUVDQnl0ZXMoaW50MzJfdCB2YWx1ZSkgew0KKyAgbV9udW1FQ0J5dGVzID0gdmFsdWU7DQogfQ0KLXZvaWQgQ0JDX1FSQ29kZXI6OlNldE51bUVDQnl0ZXMoaW50MzJfdCB2YWx1ZSkNCi17DQotICAgIG1fbnVtRUNCeXRlcyA9IHZhbHVlOw0KK0ZYX0JPT0wgQ0JDX1FSQ29kZXI6OklzVmFsaWRNYXNrUGF0dGVybihpbnQzMl90IG1hc2tQYXR0ZXJuKSB7DQorICByZXR1cm4gbWFza1BhdHRlcm4gPj0gMCAmJiBtYXNrUGF0dGVybiA8IE5VTV9NQVNLX1BBVFRFUk5TOw0KIH0NCi1GWF9CT09MIENCQ19RUkNvZGVyOjpJc1ZhbGlkTWFza1BhdHRlcm4oaW50MzJfdCBtYXNrUGF0dGVybikNCi17DQotICAgIHJldHVybiBtYXNrUGF0dGVybiA+PSAwICYmIG1hc2tQYXR0ZXJuIDwgTlVNX01BU0tfUEFUVEVSTlM7DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXI6OlNldE1hdHJpeChDQkNfQ29tbW9uQnl0ZU1hdHJpeCogdmFsdWUpDQotew0KLSAgICBtX21hdHJpeCA9IHZhbHVlOw0KK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldE1hdHJpeChDQkNfQ29tbW9uQnl0ZU1hdHJpeCogdmFsdWUpIHsNCisgIG1fbWF0cml4ID0gdmFsdWU7DQogfQ0KIGNvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXI6Ok5VTV9NQVNLX1BBVFRFUk5TID0gODsNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuaAppbmRleCA3MmRiMmZlLi43NThjNDgwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmgKQEAgLTYsNTAgKzYsNTAgQEAKIA0KICNpZm5kZWYgX0JDX1FSQ09ERVJfSF8NCiAjZGVmaW5lIF9CQ19RUkNPREVSX0hfDQotY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCA7DQorY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsNCiBjbGFzcyBDQkNfUVJDb2Rlck1vZGU7DQogY2xhc3MgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg7DQogDQotY2xhc3MgQ0JDX1FSQ29kZXINCi17DQotcHJpdmF0ZToNCi0gICAgQ0JDX1FSQ29kZXJNb2RlKiBtX21vZGU7DQotICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIG1fZWNMZXZlbDsNCi0gICAgaW50MzJfdCBtX3ZlcnNpb247DQotICAgIGludDMyX3QgbV9tYXRyaXhXaWR0aDsNCi0gICAgaW50MzJfdCBtX21hc2tQYXR0ZXJuOw0KLSAgICBpbnQzMl90IG1fbnVtVG90YWxCeXRlczsNCi0gICAgaW50MzJfdCBtX251bURhdGFCeXRlczsNCi0gICAgaW50MzJfdCBtX251bUVDQnl0ZXM7DQotICAgIGludDMyX3QgbV9udW1SU0Jsb2NrczsNCi0gICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1fbWF0cml4Ow0KLXB1YmxpYzoNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgTlVNX01BU0tfUEFUVEVSTlM7DQotICAgIENCQ19RUkNvZGVyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyKCk7DQotICAgIENCQ19RUkNvZGVyTW9kZSogR2V0TW9kZSgpOw0KLSAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBHZXRFQ0xldmVsKCk7DQotICAgIGludDMyX3QgR2V0VmVyc2lvbigpOw0KLSAgICBpbnQzMl90IEdldE1hdHJpeFdpZHRoKCk7DQotICAgIGludDMyX3QgR2V0TWFza1BhdHRlcm4oKTsNCi0gICAgaW50MzJfdCBHZXROdW1Ub3RhbEJ5dGVzKCk7DQotICAgIGludDMyX3QgR2V0TnVtRGF0YUJ5dGVzKCk7DQotICAgIGludDMyX3QgR2V0TnVtRUNCeXRlcygpOw0KLSAgICBpbnQzMl90IEdldE51bVJTQmxvY2tzKCk7DQotICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBHZXRNYXRyaXgoKTsNCi0gICAgaW50MzJfdCBBdChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCAmZSk7DQotICAgIEZYX0JPT0wgSXNWYWxpZCgpOw0KK2NsYXNzIENCQ19RUkNvZGVyIHsNCisgcHJpdmF0ZToNCisgIENCQ19RUkNvZGVyTW9kZSogbV9tb2RlOw0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogbV9lY0xldmVsOw0KKyAgaW50MzJfdCBtX3ZlcnNpb247DQorICBpbnQzMl90IG1fbWF0cml4V2lkdGg7DQorICBpbnQzMl90IG1fbWFza1BhdHRlcm47DQorICBpbnQzMl90IG1fbnVtVG90YWxCeXRlczsNCisgIGludDMyX3QgbV9udW1EYXRhQnl0ZXM7DQorICBpbnQzMl90IG1fbnVtRUNCeXRlczsNCisgIGludDMyX3QgbV9udW1SU0Jsb2NrczsNCisgIENCQ19Db21tb25CeXRlTWF0cml4KiBtX21hdHJpeDsNCiANCi0gICAgdm9pZCBTZXRNb2RlKENCQ19RUkNvZGVyTW9kZSogdmFsdWUpOw0KLSAgICB2b2lkIFNldEVDTGV2ZWwoQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCk7DQotICAgIHZvaWQgU2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pOw0KLSAgICB2b2lkIFNldE1hdHJpeFdpZHRoKGludDMyX3Qgd2lkdGgpOw0KLSAgICB2b2lkIFNldE1hc2tQYXR0ZXJuKGludDMyX3QgcGF0dGVybik7DQotICAgIHZvaWQgU2V0TnVtRGF0YUJ5dGVzKGludDMyX3QgYnl0ZXMpOw0KLSAgICB2b2lkIFNldE51bVRvdGFsQnl0ZXMoaW50MzJfdCB2YWx1ZSk7DQotICAgIHZvaWQgU2V0TnVtRUNCeXRlcyhpbnQzMl90IHZhbHVlKTsNCi0gICAgdm9pZCBTZXROdW1SU0Jsb2NrcyhpbnQzMl90IGJsb2NrKTsNCi0gICAgdm9pZCBTZXRNYXRyaXgoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIHZhbHVlKTsNCi0gICAgc3RhdGljIEZYX0JPT0wgSXNWYWxpZE1hc2tQYXR0ZXJuKGludDMyX3QgbWFza1BhdHRlcm4pOw0KKyBwdWJsaWM6DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBOVU1fTUFTS19QQVRURVJOUzsNCisgIENCQ19RUkNvZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfUVJDb2RlcigpOw0KKyAgQ0JDX1FSQ29kZXJNb2RlKiBHZXRNb2RlKCk7DQorICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBHZXRFQ0xldmVsKCk7DQorICBpbnQzMl90IEdldFZlcnNpb24oKTsNCisgIGludDMyX3QgR2V0TWF0cml4V2lkdGgoKTsNCisgIGludDMyX3QgR2V0TWFza1BhdHRlcm4oKTsNCisgIGludDMyX3QgR2V0TnVtVG90YWxCeXRlcygpOw0KKyAgaW50MzJfdCBHZXROdW1EYXRhQnl0ZXMoKTsNCisgIGludDMyX3QgR2V0TnVtRUNCeXRlcygpOw0KKyAgaW50MzJfdCBHZXROdW1SU0Jsb2NrcygpOw0KKyAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIEdldE1hdHJpeCgpOw0KKyAgaW50MzJfdCBBdChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIElzVmFsaWQoKTsNCisNCisgIHZvaWQgU2V0TW9kZShDQkNfUVJDb2Rlck1vZGUqIHZhbHVlKTsNCisgIHZvaWQgU2V0RUNMZXZlbChDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsKTsNCisgIHZvaWQgU2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pOw0KKyAgdm9pZCBTZXRNYXRyaXhXaWR0aChpbnQzMl90IHdpZHRoKTsNCisgIHZvaWQgU2V0TWFza1BhdHRlcm4oaW50MzJfdCBwYXR0ZXJuKTsNCisgIHZvaWQgU2V0TnVtRGF0YUJ5dGVzKGludDMyX3QgYnl0ZXMpOw0KKyAgdm9pZCBTZXROdW1Ub3RhbEJ5dGVzKGludDMyX3QgdmFsdWUpOw0KKyAgdm9pZCBTZXROdW1FQ0J5dGVzKGludDMyX3QgdmFsdWUpOw0KKyAgdm9pZCBTZXROdW1SU0Jsb2NrcyhpbnQzMl90IGJsb2NrKTsNCisgIHZvaWQgU2V0TWF0cml4KENCQ19Db21tb25CeXRlTWF0cml4KiB2YWx1ZSk7DQorICBzdGF0aWMgRlhfQk9PTCBJc1ZhbGlkTWFza1BhdHRlcm4oaW50MzJfdCBtYXNrUGF0dGVybik7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5jcHAKaW5kZXggOGJmNWJhMy4uMjFjMmYwOSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmNwcApAQCAtMjIsMTIwICsyMiwxMTAgQEAKIA0KICNpbmNsdWRlICIuLi9iYXJjb2RlLmgiDQogI2luY2x1ZGUgIkJDX1FSQ29kZXJCaXRWZWN0b3IuaCINCi1DQkNfUVJDb2RlckJpdFZlY3Rvcjo6Q0JDX1FSQ29kZXJCaXRWZWN0b3IoKQ0KLXsNCi0gICAgbV9zaXplSW5CaXRzID0gMDsNCi0gICAgbV9zaXplID0gMzI7DQorQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkNCQ19RUkNvZGVyQml0VmVjdG9yKCkgew0KKyAgbV9zaXplSW5CaXRzID0gMDsNCisgIG1fc2l6ZSA9IDMyOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpJbml0KCkNCi17DQotICAgIG1fYXJyYXkgPSBGWF9BbGxvYyh1aW50OF90LCBtX3NpemUpOw0KK3ZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkluaXQoKSB7DQorICBtX2FycmF5ID0gRlhfQWxsb2ModWludDhfdCwgbV9zaXplKTsNCiB9DQotQ0JDX1FSQ29kZXJCaXRWZWN0b3I6On5DQkNfUVJDb2RlckJpdFZlY3RvcigpDQotew0KLSAgICBpZihtX2FycmF5ICE9IE5VTEwpIHsNCi0gICAgICAgIEZYX0ZyZWUobV9hcnJheSk7DQorQ0JDX1FSQ29kZXJCaXRWZWN0b3I6On5DQkNfUVJDb2RlckJpdFZlY3RvcigpIHsNCisgIGlmIChtX2FycmF5ICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShtX2FycmF5KTsNCisgIH0NCisgIG1fc2l6ZSA9IDA7DQorICBtX3NpemVJbkJpdHMgPSAwOw0KK30NCit2b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpDbGVhcigpIHsNCisgIGlmIChtX2FycmF5ICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShtX2FycmF5KTsNCisgICAgbV9hcnJheSA9IE5VTEw7DQorICB9DQorICBtX3NpemVJbkJpdHMgPSAwOw0KKyAgbV9zaXplID0gMzI7DQorICBtX2FycmF5ID0gRlhfQWxsb2ModWludDhfdCwgbV9zaXplKTsNCit9DQoraW50MzJfdCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6QXQoaW50MzJfdCBpbmRleCwgaW50MzJfdCYgZSkgew0KKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX3NpemVJbkJpdHMpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQmFkSW5kZXhFeGNlcHRpb247DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgIH0NCisgIGludDMyX3QgdmFsdWUgPSBtX2FycmF5W2luZGV4ID4+IDNdICYgMHhmZjsNCisgIHJldHVybiAodmFsdWUgPj4gKDcgLSAoaW5kZXggJiAweDcpKSkgJiAxOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyQml0VmVjdG9yOjpzaXplSW5CeXRlcygpIHsNCisgIHJldHVybiAobV9zaXplSW5CaXRzICsgNykgPj4gMzsNCit9DQoraW50MzJfdCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6U2l6ZSgpIHsNCisgIHJldHVybiBtX3NpemVJbkJpdHM7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkFwcGVuZEJpdChpbnQzMl90IGJpdCwgaW50MzJfdCYgZSkgew0KKyAgaWYgKCEoYml0ID09IDAgfHwgYml0ID09IDEpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkJhZFZhbHVlRXhjZXB0aW9uOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGludDMyX3QgbnVtQml0c0luTGFzdEJ5dGUgPSBtX3NpemVJbkJpdHMgJiAweDc7DQorICBpZiAobnVtQml0c0luTGFzdEJ5dGUgPT0gMCkgew0KKyAgICBBcHBlbmRCeXRlKDApOw0KKyAgICBtX3NpemVJbkJpdHMgLT0gODsNCisgIH0NCisgIG1fYXJyYXlbbV9zaXplSW5CaXRzID4+IDNdIHw9IChiaXQgPDwgKDcgLSBudW1CaXRzSW5MYXN0Qnl0ZSkpOw0KKyAgKyttX3NpemVJbkJpdHM7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkFwcGVuZEJpdHMoaW50MzJfdCB2YWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtQml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChudW1CaXRzIDwgMCB8fCBudW1CaXRzID4gMzIpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQmFkTnVtQml0c0V4Y2VwdGlvbjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpbnQzMl90IG51bUJpdHNMZWZ0ID0gbnVtQml0czsNCisgIHdoaWxlIChudW1CaXRzTGVmdCA+IDApIHsNCisgICAgaWYgKChtX3NpemVJbkJpdHMgJiAweDcpID09IDAgJiYgbnVtQml0c0xlZnQgPj0gOCkgew0KKyAgICAgIGludDMyX3QgbmV3Qnl0ZSA9ICh2YWx1ZSA+PiAobnVtQml0c0xlZnQgLSA4KSkgJiAweGZmOw0KKyAgICAgIEFwcGVuZEJ5dGUobmV3Qnl0ZSk7DQorICAgICAgbnVtQml0c0xlZnQgLT0gODsNCisgICAgfSBlbHNlIHsNCisgICAgICBpbnQzMl90IGJpdCA9ICh2YWx1ZSA+PiAobnVtQml0c0xlZnQgLSAxKSkgJiAxOw0KKyAgICAgIEFwcGVuZEJpdChiaXQsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIC0tbnVtQml0c0xlZnQ7DQogICAgIH0NCi0gICAgbV9zaXplID0gMDsNCi0gICAgbV9zaXplSW5CaXRzID0gMDsNCisgIH0NCiB9DQotdm9pZCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6Q2xlYXIoKQ0KLXsNCi0gICAgaWYobV9hcnJheSAhPSBOVUxMKSB7DQotICAgICAgICBGWF9GcmVlKG1fYXJyYXkpOw0KLSAgICAgICAgbV9hcnJheSA9IE5VTEw7DQotICAgIH0NCi0gICAgbV9zaXplSW5CaXRzID0gMDsNCi0gICAgbV9zaXplID0gMzI7DQotICAgIG1fYXJyYXkgPSBGWF9BbGxvYyh1aW50OF90LCBtX3NpemUpOw0KK3ZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkFwcGVuZEJpdFZlY3RvcihDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBzaXplID0gYml0cy0+U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7DQorICAgIGludDMyX3QgbnVtID0gYml0cy0+QXQoaSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBBcHBlbmRCaXQobnVtLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCisgIH0NCiB9DQotaW50MzJfdCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6QXQoaW50MzJfdCBpbmRleCwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX3NpemVJbkJpdHMpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkJhZEluZGV4RXhjZXB0aW9uOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KLSAgICB9DQotICAgIGludDMyX3QgdmFsdWUgPSBtX2FycmF5W2luZGV4ID4+IDNdICYgMHhmZjsNCi0gICAgcmV0dXJuICh2YWx1ZSA+PiAoNyAtIChpbmRleCAmIDB4NykpKSAmIDE7DQordm9pZCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6WE9SKENCQ19RUkNvZGVyQml0VmVjdG9yKiBvdGhlciwgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1fc2l6ZUluQml0cyAhPSBvdGhlci0+U2l6ZSgpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbmNhbk5vdE9wZXJhdGV4b3JPcGVyYXRvcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpbnQzMl90IHNpemVJbkJ5dGVzID0gKG1fc2l6ZUluQml0cyArIDcpID4+IDM7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplSW5CeXRlczsgKytpKSB7DQorICAgIG1fYXJyYXlbaV0gXj0gKG90aGVyLT5HZXRBcnJheSgpKVtpXTsNCisgIH0NCiB9DQotaW50MzJfdCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6c2l6ZUluQnl0ZXMoKQ0KLXsNCi0gICAgcmV0dXJuIChtX3NpemVJbkJpdHMgKyA3KSA+PiAzOw0KK3VpbnQ4X3QqIENCQ19RUkNvZGVyQml0VmVjdG9yOjpHZXRBcnJheSgpIHsNCisgIHJldHVybiBtX2FycmF5Ow0KIH0NCi1pbnQzMl90IENCQ19RUkNvZGVyQml0VmVjdG9yOjpTaXplKCkNCi17DQotICAgIHJldHVybiBtX3NpemVJbkJpdHM7DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkFwcGVuZEJpdChpbnQzMl90IGJpdCwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKCEoYml0ID09IDAgfHwgYml0ID09IDEpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25CYWRWYWx1ZUV4Y2VwdGlvbjsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK3ZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkFwcGVuZEJ5dGUoaW50MzJfdCB2YWx1ZSkgew0KKyAgaWYgKChtX3NpemVJbkJpdHMgPj4gMykgPT0gbV9zaXplKSB7DQorICAgIHVpbnQ4X3QqIG5ld0FycmF5ID0gRlhfQWxsb2ModWludDhfdCwgbV9zaXplIDw8IDEpOw0KKyAgICBGWFNZU19tZW1jcHkobmV3QXJyYXksIG1fYXJyYXksIG1fc2l6ZSk7DQorICAgIGlmIChtX2FycmF5ICE9IE5VTEwpIHsNCisgICAgICBGWF9GcmVlKG1fYXJyYXkpOw0KICAgICB9DQotICAgIGludDMyX3QgbnVtQml0c0luTGFzdEJ5dGUgPSBtX3NpemVJbkJpdHMgJiAweDc7DQotICAgIGlmKG51bUJpdHNJbkxhc3RCeXRlID09IDApIHsNCi0gICAgICAgIEFwcGVuZEJ5dGUoMCk7DQotICAgICAgICBtX3NpemVJbkJpdHMgLT0gODsNCi0gICAgfQ0KLSAgICBtX2FycmF5W21fc2l6ZUluQml0cyA+PiAzXSB8PSAoYml0IDw8ICg3IC0gbnVtQml0c0luTGFzdEJ5dGUpKTsNCi0gICAgKyttX3NpemVJbkJpdHM7DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkFwcGVuZEJpdHMoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCBudW1CaXRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYgKG51bUJpdHMgPCAwIHx8IG51bUJpdHMgPiAzMikgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uQmFkTnVtQml0c0V4Y2VwdGlvbjsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotICAgIGludDMyX3QgbnVtQml0c0xlZnQgPSBudW1CaXRzOw0KLSAgICB3aGlsZSAobnVtQml0c0xlZnQgPiAwKSB7DQotICAgICAgICBpZiAoKG1fc2l6ZUluQml0cyAmIDB4NykgPT0gMCAmJiBudW1CaXRzTGVmdCA+PSA4KSB7DQotICAgICAgICAgICAgaW50MzJfdCBuZXdCeXRlID0gKHZhbHVlID4+IChudW1CaXRzTGVmdCAtIDgpKSAmIDB4ZmY7DQotICAgICAgICAgICAgQXBwZW5kQnl0ZShuZXdCeXRlKTsNCi0gICAgICAgICAgICBudW1CaXRzTGVmdCAtPSA4Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpbnQzMl90IGJpdCA9ICh2YWx1ZSA+PiAobnVtQml0c0xlZnQgLSAxKSkgJiAxOw0KLSAgICAgICAgICAgIEFwcGVuZEJpdChiaXQsIGUpOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgICAgIC0tbnVtQml0c0xlZnQ7DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6QXBwZW5kQml0VmVjdG9yKENCQ19RUkNvZGVyQml0VmVjdG9yICpiaXRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBzaXplID0gYml0cy0+U2l6ZSgpOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBudW0gPSBiaXRzLT5BdChpLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgQXBwZW5kQml0KG51bSwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKQ0KLSAgICB9DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OlhPUihDQkNfUVJDb2RlckJpdFZlY3RvciAqb3RoZXIsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihtX3NpemVJbkJpdHMgIT0gb3RoZXItPlNpemUoKSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uY2FuTm90T3BlcmF0ZXhvck9wZXJhdG9yOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgaW50MzJfdCBzaXplSW5CeXRlcyA9IChtX3NpemVJbkJpdHMgKyA3KSA+PiAzOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IHNpemVJbkJ5dGVzOyArK2kpIHsNCi0gICAgICAgIG1fYXJyYXlbaV0gXj0gKG90aGVyLT5HZXRBcnJheSgpKVtpXTsNCi0gICAgfQ0KLX0NCi11aW50OF90KiBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6R2V0QXJyYXkoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYXJyYXk7DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkFwcGVuZEJ5dGUoaW50MzJfdCB2YWx1ZSkNCi17DQotICAgIGlmKChtX3NpemVJbkJpdHMgPj4gMykgPT0gbV9zaXplKSB7DQotICAgICAgICB1aW50OF90KiBuZXdBcnJheSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fc2l6ZSA8PCAxKTsNCi0gICAgICAgIEZYU1lTX21lbWNweShuZXdBcnJheSwgbV9hcnJheSwgbV9zaXplKTsNCi0gICAgICAgIGlmKG1fYXJyYXkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIEZYX0ZyZWUobV9hcnJheSk7DQotICAgICAgICB9DQotICAgICAgICBtX2FycmF5ID0gbmV3QXJyYXk7DQotICAgICAgICBtX3NpemUgPSBtX3NpemUgPDwgMTsNCi0gICAgfQ0KLSAgICBtX2FycmF5W21fc2l6ZUluQml0cyA+PiAzXSA9ICh1aW50OF90KSB2YWx1ZTsNCi0gICAgbV9zaXplSW5CaXRzICs9IDg7DQorICAgIG1fYXJyYXkgPSBuZXdBcnJheTsNCisgICAgbV9zaXplID0gbV9zaXplIDw8IDE7DQorICB9DQorICBtX2FycmF5W21fc2l6ZUluQml0cyA+PiAzXSA9ICh1aW50OF90KXZhbHVlOw0KKyAgbV9zaXplSW5CaXRzICs9IDg7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5oCmluZGV4IDQ5NTQ5YmEuLjQ5OTljNmIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaApAQCAtNiwyNiArNiwyNiBAQAogDQogI2lmbmRlZiBfQkNfUVJFQ09ERVJCSVRWRUNUT1JfSF8NCiAjZGVmaW5lIF9CQ19RUkVDT0RFUkJJVFZFQ1RPUl9IXw0KLWNsYXNzIENCQ19RUkNvZGVyQml0VmVjdG9yDQotew0KLXByaXZhdGU6DQotICAgIGludDMyX3QgbV9zaXplSW5CaXRzOw0KLSAgICB1aW50OF90ICptX2FycmF5Ow0KLSAgICBpbnQzMl90IG1fc2l6ZTsNCitjbGFzcyBDQkNfUVJDb2RlckJpdFZlY3RvciB7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fc2l6ZUluQml0czsNCisgIHVpbnQ4X3QqIG1fYXJyYXk7DQorICBpbnQzMl90IG1fc2l6ZTsNCiANCi0gICAgdm9pZCBBcHBlbmRCeXRlKGludDMyX3QgdmFsdWUpOw0KLXB1YmxpYzoNCi0gICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IoKTsNCi0gICAgdmlydHVhbCB+Q0JDX1FSQ29kZXJCaXRWZWN0b3IoKTsNCi0gICAgaW50MzJfdCBBdChpbnQzMl90IGluZGV4LCBpbnQzMl90ICZlKTsNCi0gICAgaW50MzJfdCBTaXplKCk7DQotICAgIGludDMyX3Qgc2l6ZUluQnl0ZXMoKTsNCi0gICAgdm9pZCBBcHBlbmRCaXQoaW50MzJfdCBiaXQsIGludDMyX3QgJmUpOw0KLSAgICB2b2lkIEFwcGVuZEJpdHMoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCBudW1CaXRzLCBpbnQzMl90ICZlKTsNCi0gICAgdm9pZCBBcHBlbmRCaXRWZWN0b3IoQ0JDX1FSQ29kZXJCaXRWZWN0b3IgKmJpdHMsIGludDMyX3QgJmUpOw0KLSAgICB2b2lkIFhPUihDQkNfUVJDb2RlckJpdFZlY3RvciAqb3RoZXIsIGludDMyX3QgJmUpOw0KLSAgICB1aW50OF90KiBHZXRBcnJheSgpOw0KLSAgICB2b2lkIENsZWFyKCk7DQotICAgIHZpcnR1YWwgdm9pZCBJbml0KCk7DQorICB2b2lkIEFwcGVuZEJ5dGUoaW50MzJfdCB2YWx1ZSk7DQorDQorIHB1YmxpYzoNCisgIENCQ19RUkNvZGVyQml0VmVjdG9yKCk7DQorICB2aXJ0dWFsIH5DQkNfUVJDb2RlckJpdFZlY3RvcigpOw0KKyAgaW50MzJfdCBBdChpbnQzMl90IGluZGV4LCBpbnQzMl90JiBlKTsNCisgIGludDMyX3QgU2l6ZSgpOw0KKyAgaW50MzJfdCBzaXplSW5CeXRlcygpOw0KKyAgdm9pZCBBcHBlbmRCaXQoaW50MzJfdCBiaXQsIGludDMyX3QmIGUpOw0KKyAgdm9pZCBBcHBlbmRCaXRzKGludDMyX3QgdmFsdWUsIGludDMyX3QgbnVtQml0cywgaW50MzJfdCYgZSk7DQorICB2b2lkIEFwcGVuZEJpdFZlY3RvcihDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgaW50MzJfdCYgZSk7DQorICB2b2lkIFhPUihDQkNfUVJDb2RlckJpdFZlY3Rvciogb3RoZXIsIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogR2V0QXJyYXkoKTsNCisgIHZvaWQgQ2xlYXIoKTsNCisgIHZpcnR1YWwgdm9pZCBJbml0KCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5jcHAKaW5kZXggZGE3ZThhNS4uN2MyM2NlNiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQmxvY2tQYWlyLmNwcApAQCAtMjMsMjcgKzIzLDI1IEBACiAjaW5jbHVkZSAiLi4vYmFyY29kZS5oIg0KICNpbmNsdWRlICIuLi9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmgiDQogI2luY2x1ZGUgIkJDX1FSQ29kZXJCbG9ja1BhaXIuaCINCi1DQkNfUVJDb2RlckJsb2NrUGFpcjo6Q0JDX1FSQ29kZXJCbG9ja1BhaXIoQ0JDX0NvbW1vbkJ5dGVBcnJheSogZGF0YSwgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZXJyb3JDb3JyZWN0aW9uKQ0KLXsNCi0gICAgbV9kYXRhQnl0ZXMgPSBkYXRhOw0KLSAgICBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzID0gZXJyb3JDb3JyZWN0aW9uOw0KK0NCQ19RUkNvZGVyQmxvY2tQYWlyOjpDQkNfUVJDb2RlckJsb2NrUGFpcigNCisgICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZGF0YSwNCisgICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZXJyb3JDb3JyZWN0aW9uKSB7DQorICBtX2RhdGFCeXRlcyA9IGRhdGE7DQorICBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzID0gZXJyb3JDb3JyZWN0aW9uOw0KIH0NCi1DQkNfUVJDb2RlckJsb2NrUGFpcjo6fkNCQ19RUkNvZGVyQmxvY2tQYWlyKCkNCi17DQotICAgIGlmKG1fZGF0YUJ5dGVzICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBtX2RhdGFCeXRlczsNCi0gICAgICAgIG1fZGF0YUJ5dGVzID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZihtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzICE9IE5VTEwpIHsNCi0gICAgICAgIGRlbGV0ZSBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzOw0KLSAgICAgICAgbV9lcnJvckNvcnJlY3Rpb25CeXRlcyA9IE5VTEw7DQotICAgIH0NCitDQkNfUVJDb2RlckJsb2NrUGFpcjo6fkNCQ19RUkNvZGVyQmxvY2tQYWlyKCkgew0KKyAgaWYgKG1fZGF0YUJ5dGVzICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fZGF0YUJ5dGVzOw0KKyAgICBtX2RhdGFCeXRlcyA9IE5VTEw7DQorICB9DQorICBpZiAobV9lcnJvckNvcnJlY3Rpb25CeXRlcyAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzOw0KKyAgICBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzID0gTlVMTDsNCisgIH0NCiB9DQotQ0JDX0NvbW1vbkJ5dGVBcnJheSogQ0JDX1FSQ29kZXJCbG9ja1BhaXI6OkdldERhdGFCeXRlcygpDQotew0KLSAgICByZXR1cm4gbV9kYXRhQnl0ZXM7DQorQ0JDX0NvbW1vbkJ5dGVBcnJheSogQ0JDX1FSQ29kZXJCbG9ja1BhaXI6OkdldERhdGFCeXRlcygpIHsNCisgIHJldHVybiBtX2RhdGFCeXRlczsNCiB9DQotQ0JDX0NvbW1vbkJ5dGVBcnJheSogQ0JDX1FSQ29kZXJCbG9ja1BhaXI6OkdldEVycm9yQ29ycmVjdGlvbkJ5dGVzKCkNCi17DQotICAgIHJldHVybiBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzOw0KK0NCQ19Db21tb25CeXRlQXJyYXkqIENCQ19RUkNvZGVyQmxvY2tQYWlyOjpHZXRFcnJvckNvcnJlY3Rpb25CeXRlcygpIHsNCisgIHJldHVybiBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuaAppbmRleCA2ZmI3OWJiLi5iZTEwZDQ1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQmxvY2tQYWlyLmgKQEAgLTcsMTYgKzcsMTcgQEAKICNpZm5kZWYgX0JDX1FSQ09ERVJCTE9DS1BBSVJfSF8NCiAjZGVmaW5lIF9CQ19RUkNPREVSQkxPQ0tQQUlSX0hfDQogY2xhc3MgQ0JDX0NvbW1vbkJ5dGVBcnJheTsNCi1jbGFzcyBDQkNfUVJDb2RlckJsb2NrUGFpcg0KLXsNCi1wcml2YXRlOg0KLSAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBtX2RhdGFCeXRlczsNCi0gICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogbV9lcnJvckNvcnJlY3Rpb25CeXRlczsNCi1wdWJsaWM6DQotICAgIENCQ19RUkNvZGVyQmxvY2tQYWlyKENCQ19Db21tb25CeXRlQXJyYXkqIGRhdGEsIENCQ19Db21tb25CeXRlQXJyYXkqIGVycm9yQ29ycmVjdGlvbik7DQotICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyQmxvY2tQYWlyKCk7DQorY2xhc3MgQ0JDX1FSQ29kZXJCbG9ja1BhaXIgew0KKyBwcml2YXRlOg0KKyAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogbV9kYXRhQnl0ZXM7DQorICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzOw0KIA0KLSAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBHZXREYXRhQnl0ZXMoKTsNCi0gICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogR2V0RXJyb3JDb3JyZWN0aW9uQnl0ZXMoKTsNCisgcHVibGljOg0KKyAgQ0JDX1FSQ29kZXJCbG9ja1BhaXIoQ0JDX0NvbW1vbkJ5dGVBcnJheSogZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlQXJyYXkqIGVycm9yQ29ycmVjdGlvbik7DQorICB2aXJ0dWFsIH5DQkNfUVJDb2RlckJsb2NrUGFpcigpOw0KKw0KKyAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogR2V0RGF0YUJ5dGVzKCk7DQorICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBHZXRFcnJvckNvcnJlY3Rpb25CeXRlcygpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJEZWNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRGVjb2Rlci5jcHAKaW5kZXggZTg2Njg3My4uZjAzYWRmNSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJEZWNvZGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckRlY29kZXIuY3BwCkBAIC0zMSw5OCArMzEsMTAxIEBACiAjaW5jbHVkZSAiQkNfUVJDb2RlclZlcnNpb24uaCINCiAjaW5jbHVkZSAiQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmgiDQogI2luY2x1ZGUgIkJDX1FSQ29kZXJEZWNvZGVyLmgiDQotQ0JDX1FSQ29kZXJEZWNvZGVyOjpDQkNfUVJDb2RlckRlY29kZXIoKQ0KLXsNCi0gICAgbV9yc0RlY29kZXIgPSBOVUxMOw0KK0NCQ19RUkNvZGVyRGVjb2Rlcjo6Q0JDX1FSQ29kZXJEZWNvZGVyKCkgew0KKyAgbV9yc0RlY29kZXIgPSBOVUxMOw0KIH0NCiANCi12b2lkIENCQ19RUkNvZGVyRGVjb2Rlcjo6SW5pdCgpDQotew0KLSAgICBtX3JzRGVjb2RlciA9IEZYX05FVyBDQkNfUmVlZFNvbG9tb25EZWNvZGVyKENCQ19SZWVkU29sb21vbkdGMjU2OjpRUkNvZGVGaWxkKTsNCit2b2lkIENCQ19RUkNvZGVyRGVjb2Rlcjo6SW5pdCgpIHsNCisgIG1fcnNEZWNvZGVyID0gRlhfTkVXIENCQ19SZWVkU29sb21vbkRlY29kZXIoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OlFSQ29kZUZpbGQpOw0KIH0NCi1DQkNfUVJDb2RlckRlY29kZXI6On5DQkNfUVJDb2RlckRlY29kZXIoKQ0KLXsNCi0gICAgaWYobV9yc0RlY29kZXIgIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIG1fcnNEZWNvZGVyOw0KLSAgICB9DQotICAgIG1fcnNEZWNvZGVyID0gTlVMTDsNCitDQkNfUVJDb2RlckRlY29kZXI6On5DQkNfUVJDb2RlckRlY29kZXIoKSB7DQorICBpZiAobV9yc0RlY29kZXIgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9yc0RlY29kZXI7DQorICB9DQorICBtX3JzRGVjb2RlciA9IE5VTEw7DQogfQ0KLUNCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfUVJDb2RlckRlY29kZXI6OkRlY29kZShGWF9CT09MKiBpbWFnZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgJmUpDQotew0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4ICBiaXRzOw0KLSAgICBiaXRzLkluaXQod2lkdGgpOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsNCi0gICAgICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsNCi0gICAgICAgICAgICBpZihpbWFnZVtpICogd2lkdGggKyBqXSkgew0KLSAgICAgICAgICAgICAgICBiaXRzLlNldChqLCBpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIENCQ19RUkNvZGVyRGVjb2Rlcjo6RGVjb2RlKEZYX0JPT0wqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCBiaXRzOw0KKyAgYml0cy5Jbml0KHdpZHRoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsNCisgICAgICBpZiAoaW1hZ2VbaSAqIHdpZHRoICsgal0pIHsNCisgICAgICAgIGJpdHMuU2V0KGosIGkpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogY2RyID0gRGVjb2RlKCZiaXRzLCBoZWlnaHQsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIHJldHVybiBjZHI7DQorICB9DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogY2RyID0gRGVjb2RlKCZiaXRzLCBoZWlnaHQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIGNkcjsNCiB9DQotQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIENCQ19RUkNvZGVyRGVjb2Rlcjo6RGVjb2RlKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdHMsIGludDMyX3QgYnl0ZU1vZGVEZWNvZGUsIGludDMyX3QgJmUpDQotew0KLSAgICBDQkNfUVJCaXRNYXRyaXhQYXJzZXIgcGFyc2VyOw0KLSAgICBwYXJzZXIuSW5pdChiaXRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDQkNfUVJDb2RlclZlcnNpb24gKnZlcnNpb24gPSBwYXJzZXIuUmVhZFZlcnNpb24oZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiogdGVtcCA9IHBhcnNlci5SZWFkRm9ybWF0SW5mb3JtYXRpb24oZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCA9IHRlbXAtPkdldEVycm9yQ29ycmVjdGlvbkxldmVsKCk7DQotICAgIENGWF9CeXRlQXJyYXkqIGJhID0gcGFyc2VyLlJlYWRDb2Rld29yZHMoZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0ZYX0J5dGVBcnJheSA+IGNvZGV3b3JkcyhiYSk7DQotICAgIENGWF9QdHJBcnJheSAqZGF0YUJsb2NrcyA9IENCQ19RUkRhdGFCbG9jazo6R2V0RGF0YUJsb2Nrcyhjb2Rld29yZHMuZ2V0KCksIHZlcnNpb24sIGVjTGV2ZWwsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIGludDMyX3QgdG90YWxCeXRlcyA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRhdGFCbG9ja3MtPkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICB0b3RhbEJ5dGVzICs9ICgoQ0JDX1FSRGF0YUJsb2NrKikgKCgqZGF0YUJsb2NrcylbaV0pKS0+R2V0TnVtRGF0YUNvZGV3b3JkcygpOw0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfUVJDb2RlckRlY29kZXI6OkRlY29kZShDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVNb2RlRGVjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfUVJCaXRNYXRyaXhQYXJzZXIgcGFyc2VyOw0KKyAgcGFyc2VyLkluaXQoYml0cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfUVJDb2RlclZlcnNpb24qIHZlcnNpb24gPSBwYXJzZXIuUmVhZFZlcnNpb24oZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKiB0ZW1wID0gcGFyc2VyLlJlYWRGb3JtYXRJbmZvcm1hdGlvbihlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwgPSB0ZW1wLT5HZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpOw0KKyAgQ0ZYX0J5dGVBcnJheSogYmEgPSBwYXJzZXIuUmVhZENvZGV3b3JkcyhlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENGWF9CeXRlQXJyYXk+IGNvZGV3b3JkcyhiYSk7DQorICBDRlhfUHRyQXJyYXkqIGRhdGFCbG9ja3MgPQ0KKyAgICAgIENCQ19RUkRhdGFCbG9jazo6R2V0RGF0YUJsb2Nrcyhjb2Rld29yZHMuZ2V0KCksIHZlcnNpb24sIGVjTGV2ZWwsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgaW50MzJfdCB0b3RhbEJ5dGVzID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRhdGFCbG9ja3MtPkdldFNpemUoKTsgaSsrKSB7DQorICAgIHRvdGFsQnl0ZXMgKz0gKChDQkNfUVJEYXRhQmxvY2sqKSgoKmRhdGFCbG9ja3MpW2ldKSktPkdldE51bURhdGFDb2Rld29yZHMoKTsNCisgIH0NCisgIENGWF9CeXRlQXJyYXkgcmVzdWx0Qnl0ZXM7DQorICBpbnQzMl90IHJlc3VsdE9mZnNldCA9IDA7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBkYXRhQmxvY2tzLT5HZXRTaXplKCk7IGorKykgew0KKyAgICBDQkNfUVJEYXRhQmxvY2sqIGRhdGFCbG9jayA9IChDQkNfUVJEYXRhQmxvY2sqKSgoKmRhdGFCbG9ja3MpW2pdKTsNCisgICAgQ0ZYX0J5dGVBcnJheSogY29kZXdvcmRCeXRlcyA9IGRhdGFCbG9jay0+R2V0Q29kZXdvcmRzKCk7DQorICAgIGludDMyX3QgbnVtRGF0YUNvZGV3b3JkcyA9IGRhdGFCbG9jay0+R2V0TnVtRGF0YUNvZGV3b3JkcygpOw0KKyAgICBDb3JyZWN0RXJyb3JzKGNvZGV3b3JkQnl0ZXMsIG51bURhdGFDb2Rld29yZHMsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgZGF0YUJsb2Nrcy0+R2V0U2l6ZSgpOyBrKyspIHsNCisgICAgICAgIGRlbGV0ZSAoQ0JDX1FSRGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2tdOw0KKyAgICAgIH0NCisgICAgICBkYXRhQmxvY2tzLT5SZW1vdmVBbGwoKTsNCisgICAgICBkZWxldGUgZGF0YUJsb2NrczsNCisgICAgICBkYXRhQmxvY2tzID0gTlVMTDsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICBDRlhfQnl0ZUFycmF5IHJlc3VsdEJ5dGVzOw0KLSAgICBpbnQzMl90IHJlc3VsdE9mZnNldCA9IDA7DQotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGRhdGFCbG9ja3MtPkdldFNpemUoKTsgaisrKSB7DQotICAgICAgICBDQkNfUVJEYXRhQmxvY2sgKmRhdGFCbG9jayA9IChDQkNfUVJEYXRhQmxvY2sgKikoKCpkYXRhQmxvY2tzKVtqXSk7DQotICAgICAgICBDRlhfQnl0ZUFycmF5KiBjb2Rld29yZEJ5dGVzID0gZGF0YUJsb2NrLT5HZXRDb2Rld29yZHMoKTsNCi0gICAgICAgIGludDMyX3QgbnVtRGF0YUNvZGV3b3JkcyA9IGRhdGFCbG9jay0+R2V0TnVtRGF0YUNvZGV3b3JkcygpOw0KLSAgICAgICAgQ29ycmVjdEVycm9ycyhjb2Rld29yZEJ5dGVzLCBudW1EYXRhQ29kZXdvcmRzLCBlKTsNCi0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBmb3IoaW50MzJfdCBrID0gMDsgayA8IGRhdGFCbG9ja3MtPkdldFNpemUoKTsgaysrKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSAoQ0JDX1FSRGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2tdOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkYXRhQmxvY2tzLT5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICBkZWxldGUgZGF0YUJsb2NrczsNCi0gICAgICAgICAgICBkYXRhQmxvY2tzID0gTlVMTDsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgbnVtRGF0YUNvZGV3b3JkczsgaSsrKSB7DQotICAgICAgICAgICAgcmVzdWx0Qnl0ZXMuQWRkKCgqY29kZXdvcmRCeXRlcylbaV0pOw0KLSAgICAgICAgfQ0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1EYXRhQ29kZXdvcmRzOyBpKyspIHsNCisgICAgICByZXN1bHRCeXRlcy5BZGQoKCpjb2Rld29yZEJ5dGVzKVtpXSk7DQogICAgIH0NCi0gICAgZm9yKGludDMyX3QgayA9IDA7IGsgPCBkYXRhQmxvY2tzLT5HZXRTaXplKCk7IGsrKykgew0KLSAgICAgICAgZGVsZXRlICAoQ0JDX1FSRGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2tdIDsNCi0gICAgfQ0KLSAgICBkYXRhQmxvY2tzLT5SZW1vdmVBbGwoKTsNCi0gICAgZGVsZXRlIGRhdGFCbG9ja3M7DQotICAgIGRhdGFCbG9ja3MgPSBOVUxMOw0KLSAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogY2RyID0gQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlKCZyZXN1bHRCeXRlcywgdmVyc2lvbiwgZWNMZXZlbCwgYnl0ZU1vZGVEZWNvZGUsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIHJldHVybiBjZHI7DQorICB9DQorICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBkYXRhQmxvY2tzLT5HZXRTaXplKCk7IGsrKykgew0KKyAgICBkZWxldGUgKENCQ19RUkRhdGFCbG9jayopKCpkYXRhQmxvY2tzKVtrXTsNCisgIH0NCisgIGRhdGFCbG9ja3MtPlJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIGRhdGFCbG9ja3M7DQorICBkYXRhQmxvY2tzID0gTlVMTDsNCisgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBjZHIgPSBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGUoDQorICAgICAgJnJlc3VsdEJ5dGVzLCB2ZXJzaW9uLCBlY0xldmVsLCBieXRlTW9kZURlY29kZSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gY2RyOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyRGVjb2Rlcjo6Q29ycmVjdEVycm9ycyhDRlhfQnl0ZUFycmF5KiBjb2Rld29yZEJ5dGVzLCBpbnQzMl90IG51bURhdGFDb2Rld29yZHMsIGludDMyX3QgJmUpDQotew0KLSAgICBpbnQzMl90IG51bUNvZGV3b3JkcyA9IGNvZGV3b3JkQnl0ZXMtPkdldFNpemUoKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgY29kZXdvcmRzSW50czsNCi0gICAgY29kZXdvcmRzSW50cy5TZXRTaXplKG51bUNvZGV3b3Jkcyk7DQotICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ29kZXdvcmRzOyBpKyspIHsNCi0gICAgICAgIGNvZGV3b3Jkc0ludHNbaV0gPSAoaW50MzJfdCkoKCpjb2Rld29yZEJ5dGVzKVtpXSAmIDB4ZmYpOw0KLSAgICB9DQotICAgIGludDMyX3QgbnVtRUNDb2Rld29yZHMgPSBjb2Rld29yZEJ5dGVzLT5HZXRTaXplKCkgLSBudW1EYXRhQ29kZXdvcmRzOw0KLSAgICBtX3JzRGVjb2Rlci0+RGVjb2RlKCZjb2Rld29yZHNJbnRzLCBudW1FQ0NvZGV3b3JkcywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBmb3IoaW50MzJfdCBrID0gMDsgayA8IG51bURhdGFDb2Rld29yZHM7IGsrKykgew0KLSAgICAgICAgKCpjb2Rld29yZEJ5dGVzKVtrXSA9ICh1aW50OF90KSBjb2Rld29yZHNJbnRzW2tdOw0KLSAgICB9DQordm9pZCBDQkNfUVJDb2RlckRlY29kZXI6OkNvcnJlY3RFcnJvcnMoQ0ZYX0J5dGVBcnJheSogY29kZXdvcmRCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bURhdGFDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBudW1Db2Rld29yZHMgPSBjb2Rld29yZEJ5dGVzLT5HZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSBjb2Rld29yZHNJbnRzOw0KKyAgY29kZXdvcmRzSW50cy5TZXRTaXplKG51bUNvZGV3b3Jkcyk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1Db2Rld29yZHM7IGkrKykgew0KKyAgICBjb2Rld29yZHNJbnRzW2ldID0gKGludDMyX3QpKCgqY29kZXdvcmRCeXRlcylbaV0gJiAweGZmKTsNCisgIH0NCisgIGludDMyX3QgbnVtRUNDb2Rld29yZHMgPSBjb2Rld29yZEJ5dGVzLT5HZXRTaXplKCkgLSBudW1EYXRhQ29kZXdvcmRzOw0KKyAgbV9yc0RlY29kZXItPkRlY29kZSgmY29kZXdvcmRzSW50cywgbnVtRUNDb2Rld29yZHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBudW1EYXRhQ29kZXdvcmRzOyBrKyspIHsNCisgICAgKCpjb2Rld29yZEJ5dGVzKVtrXSA9ICh1aW50OF90KWNvZGV3b3Jkc0ludHNba107DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRGVjb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJEZWNvZGVyLmgKaW5kZXggNzc0N2M3Yi4uZjBjZTI0NSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJEZWNvZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJEZWNvZGVyLmgKQEAgLTEyLDE3ICsxMiwyNCBAQAogY2xhc3MgQ0JDX1FSQml0TWF0cml4UGFyc2VyOw0KIGNsYXNzIENCQ19RUkNvZGVyVmVyc2lvbjsNCiBjbGFzcyBDQkNfUVJEYXRhQmxvY2s7DQotY2xhc3MgQ0JDX1FSQ29kZXJEZWNvZGVyDQotew0KLXByaXZhdGU6DQotICAgIENCQ19SZWVkU29sb21vbkRlY29kZXIgKm1fcnNEZWNvZGVyOw0KLXB1YmxpYzoNCi0gICAgQ0JDX1FSQ29kZXJEZWNvZGVyKCk7DQotICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyRGVjb2RlcigpOw0KK2NsYXNzIENCQ19RUkNvZGVyRGVjb2RlciB7DQorIHByaXZhdGU6DQorICBDQkNfUmVlZFNvbG9tb25EZWNvZGVyKiBtX3JzRGVjb2RlcjsNCiANCi0gICAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIERlY29kZShGWF9CT09MKiBpbWFnZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgJmUpOw0KLSAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogRGVjb2RlKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdHMsIGludDMyX3QgYnl0ZU1vZGVEZWNvZGUsIGludDMyX3QgJmUpOw0KLSAgICB2b2lkIENvcnJlY3RFcnJvcnMoQ0ZYX0J5dGVBcnJheSogY29kZXdvcmRCeXRlcywgaW50MzJfdCBudW1EYXRhQ29kZXdvcmRzLCBpbnQzMl90ICZlKTsNCi0gICAgdmlydHVhbCB2b2lkIEluaXQoKTsNCisgcHVibGljOg0KKyAgQ0JDX1FSQ29kZXJEZWNvZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfUVJDb2RlckRlY29kZXIoKTsNCisNCisgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBEZWNvZGUoRlhfQk9PTCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBEZWNvZGUoQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlTW9kZURlY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2b2lkIENvcnJlY3RFcnJvcnMoQ0ZYX0J5dGVBcnJheSogY29kZXdvcmRCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bURhdGFDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0IuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0IuY3BwCmluZGV4IDdkZmVmOTMuLmMzNjMzYWYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQi5jcHAKQEAgLTIyLDE5ICsyMiwxNCBAQAogDQogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfUVJDb2RlckVDQi5oIg0KLUNCQ19RUkNvZGVyRUNCOjpDQkNfUVJDb2RlckVDQihpbnQzMl90IGNvdW50LCBpbnQzMl90IGRhdGFDb2RlV29yZHMpDQotew0KLSAgICBtX2RhdGFDb2RlV29yZHMgPSBkYXRhQ29kZVdvcmRzOw0KLSAgICBtX2NvdW50ID0gY291bnQ7DQorQ0JDX1FSQ29kZXJFQ0I6OkNCQ19RUkNvZGVyRUNCKGludDMyX3QgY291bnQsIGludDMyX3QgZGF0YUNvZGVXb3Jkcykgew0KKyAgbV9kYXRhQ29kZVdvcmRzID0gZGF0YUNvZGVXb3JkczsNCisgIG1fY291bnQgPSBjb3VudDsNCiB9DQotQ0JDX1FSQ29kZXJFQ0I6On5DQkNfUVJDb2RlckVDQigpDQotew0KK0NCQ19RUkNvZGVyRUNCOjp+Q0JDX1FSQ29kZXJFQ0IoKSB7fQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJFQ0I6OkdldENvdW50KCkgew0KKyAgcmV0dXJuIG1fY291bnQ7DQogfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXJFQ0I6OkdldENvdW50KCkNCi17DQotICAgIHJldHVybiBtX2NvdW50Ow0KLX0NCi1pbnQzMl90IENCQ19RUkNvZGVyRUNCOjpHZXREYXRhQ29kZVdvcmRzKCkNCi17DQotICAgIHJldHVybiBtX2RhdGFDb2RlV29yZHM7DQoraW50MzJfdCBDQkNfUVJDb2RlckVDQjo6R2V0RGF0YUNvZGVXb3JkcygpIHsNCisgIHJldHVybiBtX2RhdGFDb2RlV29yZHM7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQi5oCmluZGV4IDVhOWMyNWIuLjRjNDdmNzggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0IuaApAQCAtNiwxNSArNiwxNSBAQAogDQogI2lmbmRlZiBfQkNfUVJDT0RFUkVDQl9IXw0KICNkZWZpbmUgX0JDX1FSQ09ERVJFQ0JfSF8NCi1jbGFzcyBDQkNfUVJDb2RlckVDQg0KLXsNCi1wcml2YXRlOg0KLSAgICBpbnQzMl90IG1fY291bnQ7DQotICAgIGludDMyX3QgbV9kYXRhQ29kZVdvcmRzOw0KLXB1YmxpYzoNCi0gICAgQ0JDX1FSQ29kZXJFQ0IoaW50MzJfdCBjb3VudCwgaW50MzJfdCBkYXRhQ29kZVdvcmRzKTsNCi0gICAgdmlydHVhbCB+Q0JDX1FSQ29kZXJFQ0IoKTsNCi0gICAgaW50MzJfdCBHZXRDb3VudCgpOw0KLSAgICBpbnQzMl90IEdldERhdGFDb2RlV29yZHMoKTsNCitjbGFzcyBDQkNfUVJDb2RlckVDQiB7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fY291bnQ7DQorICBpbnQzMl90IG1fZGF0YUNvZGVXb3JkczsNCisNCisgcHVibGljOg0KKyAgQ0JDX1FSQ29kZXJFQ0IoaW50MzJfdCBjb3VudCwgaW50MzJfdCBkYXRhQ29kZVdvcmRzKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGVyRUNCKCk7DQorICBpbnQzMl90IEdldENvdW50KCk7DQorICBpbnQzMl90IEdldERhdGFDb2RlV29yZHMoKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCbG9ja3MuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5jcHAKaW5kZXggM2M0MGNmZC4uODQ4OTEwNiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5jcHAKQEAgLTIzLDQzICsyMywzNyBAQAogI2luY2x1ZGUgIi4uL2JhcmNvZGUuaCINCiAjaW5jbHVkZSAiQkNfUVJDb2RlckVDQi5oIg0KICNpbmNsdWRlICJCQ19RUkNvZGVyRUNCbG9ja3MuaCINCi1DQkNfUVJDb2RlckVDQmxvY2tzOjpDQkNfUVJDb2RlckVDQmxvY2tzKGludDMyX3QgZWNDb2RlV29yZHNQZXJCbG9jaywgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2tzKQ0KLXsNCi0gICAgbV9lY0NvZGVXb3Jkc1BlckJsb2NrID0gZWNDb2RlV29yZHNQZXJCbG9jazsNCi0gICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MpOw0KK0NCQ19RUkNvZGVyRUNCbG9ja3M6OkNCQ19RUkNvZGVyRUNCbG9ja3MoaW50MzJfdCBlY0NvZGVXb3Jkc1BlckJsb2NrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2tzKSB7DQorICBtX2VjQ29kZVdvcmRzUGVyQmxvY2sgPSBlY0NvZGVXb3Jkc1BlckJsb2NrOw0KKyAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MpOw0KIH0NCiBDQkNfUVJDb2RlckVDQmxvY2tzOjpDQkNfUVJDb2RlckVDQmxvY2tzKGludDMyX3QgZWNDb2RlV29yZHNQZXJCbG9jaywNCi0gICAgICAgIENCQ19RUkNvZGVyRUNCKiBlY0Jsb2NrczEsDQotICAgICAgICBDQkNfUVJDb2RlckVDQiogZWNCbG9ja3MyKQ0KLXsNCi0gICAgbV9lY0NvZGVXb3Jkc1BlckJsb2NrID0gZWNDb2RlV29yZHNQZXJCbG9jazsNCi0gICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MxKTsNCi0gICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCKiBlY0Jsb2NrczEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQiogZWNCbG9ja3MyKSB7DQorICBtX2VjQ29kZVdvcmRzUGVyQmxvY2sgPSBlY0NvZGVXb3Jkc1BlckJsb2NrOw0KKyAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MxKTsNCisgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzMik7DQogfQ0KLUNCQ19RUkNvZGVyRUNCbG9ja3M6On5DQkNfUVJDb2RlckVDQmxvY2tzKCkNCi17DQotICAgIGZvciAoaW50MzJfdCBpID0gMCA7IGkgPCBtX2VjQmxvY2tzLkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICBkZWxldGUgKCAoQ0JDX1FSQ29kZXJFQ0IqKShtX2VjQmxvY2tzW2ldKSApIDsNCi0gICAgfQ0KLSAgICBtX2VjQmxvY2tzLlJlbW92ZUFsbCgpOw0KK0NCQ19RUkNvZGVyRUNCbG9ja3M6On5DQkNfUVJDb2RlckVDQmxvY2tzKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9lY0Jsb2Nrcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICBkZWxldGUgKChDQkNfUVJDb2RlckVDQiopKG1fZWNCbG9ja3NbaV0pKTsNCisgIH0NCisgIG1fZWNCbG9ja3MuUmVtb3ZlQWxsKCk7DQogfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpDQotew0KLSAgICByZXR1cm4gbV9lY0NvZGVXb3Jkc1BlckJsb2NrOw0KK2ludDMyX3QgQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpIHsNCisgIHJldHVybiBtX2VjQ29kZVdvcmRzUGVyQmxvY2s7DQogfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0TnVtQmxvY2tzKCkNCi17DQotICAgIGludDMyX3QgdG90YWwgPSAwOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IG1fZWNCbG9ja3MuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIHRvdGFsICs9ICggKENCQ19RUkNvZGVyRUNCKikobV9lY0Jsb2Nrc1tpXSkgKS0+R2V0Q291bnQoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gdG90YWw7DQoraW50MzJfdCBDQkNfUVJDb2RlckVDQmxvY2tzOjpHZXROdW1CbG9ja3MoKSB7DQorICBpbnQzMl90IHRvdGFsID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fZWNCbG9ja3MuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgdG90YWwgKz0gKChDQkNfUVJDb2RlckVDQiopKG1fZWNCbG9ja3NbaV0pKS0+R2V0Q291bnQoKTsNCisgIH0NCisgIHJldHVybiB0b3RhbDsNCiB9DQotaW50MzJfdCBDQkNfUVJDb2RlckVDQmxvY2tzOjpHZXRUb3RhbEVDQ29kZVdvcmRzKCkNCi17DQotICAgIHJldHVybiBtX2VjQ29kZVdvcmRzUGVyQmxvY2sgKiBHZXROdW1CbG9ja3MoKTsNCitpbnQzMl90IENCQ19RUkNvZGVyRUNCbG9ja3M6OkdldFRvdGFsRUNDb2RlV29yZHMoKSB7DQorICByZXR1cm4gbV9lY0NvZGVXb3Jkc1BlckJsb2NrICogR2V0TnVtQmxvY2tzKCk7DQogfQ0KLUNGWF9QdHJBcnJheSogQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0RUNCbG9ja3MoKQ0KLXsNCi0gICAgcmV0dXJuICZtX2VjQmxvY2tzOw0KK0NGWF9QdHJBcnJheSogQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0RUNCbG9ja3MoKSB7DQorICByZXR1cm4gJm1fZWNCbG9ja3M7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCbG9ja3MuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCbG9ja3MuaAppbmRleCA4YTk2MmUxLi45ZTI2ZmI3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oCkBAIC03LDE4ICs3LDIwIEBACiAjaWZuZGVmIF9CQ19RUkNPREVSRUNCTE9DS1NfSF8NCiAjZGVmaW5lIF9CQ19RUkNPREVSRUNCTE9DS1NfSF8NCiBjbGFzcyBDQkNfUVJDb2RlckVDQjsNCi1jbGFzcyBDQkNfUVJDb2RlckVDQmxvY2tzDQotew0KLXByaXZhdGU6DQotICAgIGludDMyX3QgbV9lY0NvZGVXb3Jkc1BlckJsb2NrOw0KLSAgICBDRlhfUHRyQXJyYXkgbV9lY0Jsb2NrczsNCi1wdWJsaWM6DQotICAgIENCQ19RUkNvZGVyRUNCbG9ja3MoaW50MzJfdCBlY0NvZGVXb3Jkc1BlckJsb2NrLCBDQkNfUVJDb2RlckVDQiogZWNCbG9ja3MpOw0KLSAgICBDQkNfUVJDb2RlckVDQmxvY2tzKGludDMyX3QgZWNDb2RlV29yZHNQZXJCbG9jaywgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2tzMSwgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2tzMik7DQotICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyRUNCbG9ja3MoKTsNCi0gICAgaW50MzJfdCBHZXRFQ0NvZGVXb3Jkc1BlckJsb2NrKCk7DQotICAgIGludDMyX3QgR2V0TnVtQmxvY2tzKCk7DQotICAgIGludDMyX3QgR2V0VG90YWxFQ0NvZGVXb3JkcygpOw0KLSAgICBDRlhfUHRyQXJyYXkqIEdldEVDQmxvY2tzKCk7DQorY2xhc3MgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyB7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fZWNDb2RlV29yZHNQZXJCbG9jazsNCisgIENGWF9QdHJBcnJheSBtX2VjQmxvY2tzOw0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJDb2RlckVDQmxvY2tzKGludDMyX3QgZWNDb2RlV29yZHNQZXJCbG9jaywgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2tzKTsNCisgIENCQ19RUkNvZGVyRUNCbG9ja3MoaW50MzJfdCBlY0NvZGVXb3Jkc1BlckJsb2NrLA0KKyAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQiogZWNCbG9ja3MxLA0KKyAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQiogZWNCbG9ja3MyKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGVyRUNCbG9ja3MoKTsNCisgIGludDMyX3QgR2V0RUNDb2RlV29yZHNQZXJCbG9jaygpOw0KKyAgaW50MzJfdCBHZXROdW1CbG9ja3MoKTsNCisgIGludDMyX3QgR2V0VG90YWxFQ0NvZGVXb3JkcygpOw0KKyAgQ0ZYX1B0ckFycmF5KiBHZXRFQ0Jsb2NrcygpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5jcHAKaW5kZXggMmVjNDkwZi4uODI2MzY0MCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVuY29kZXIuY3BwCkBAIC00MCw4MzcgKzQwLDkyMSBAQAogICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLA0KICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwNCiAgICAgMzYsIC0xLCAtMSwgLTEsIDM3LCAzOCwgLTEsIC0xLCAtMSwgLTEsIDM5LCA0MCwgLTEsIDQxLCA0MiwgNDMsDQotICAgIDAsICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCA0NCwgLTEsIC0xLCAtMSwgLTEsIC0xLA0KKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgNDQsIC0xLCAtMSwgLTEsIC0xLCAtMSwNCiAgICAgLTEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsDQotICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgLTEsIC0xLCAtMSwgLTEsIC0xDQorICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsNCitDQkNfUVJDb2RlckVuY29kZXI6OkNCQ19RUkNvZGVyRW5jb2RlcigpIHt9DQorQ0JDX1FSQ29kZXJFbmNvZGVyOjp+Q0JDX1FSQ29kZXJFbmNvZGVyKCkge30NCitjbGFzcyBNYWtlX1BhaXIgew0KKyBwdWJsaWM6DQorICBDQkNfUVJDb2Rlck1vZGUqIG1fbW9kZTsNCisgIENGWF9CeXRlU3RyaW5nIG1fc3RyaW5nOw0KKw0KKyBwcml2YXRlOg0KKyAgTWFrZV9QYWlyKGNvbnN0IE1ha2VfUGFpciYgbW9kZV9zdHJpbmcpIHt9DQorICBNYWtlX1BhaXImIG9wZXJhdG9yPShNYWtlX1BhaXImIG1vZGVfc3RyaW5nKSB7DQorICAgIGlmICh0aGlzID09ICZtb2RlX3N0cmluZykgew0KKyAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKyAgICBtX21vZGUgPSBtb2RlX3N0cmluZy5tX21vZGU7DQorICAgIG1fc3RyaW5nID0gbW9kZV9zdHJpbmcubV9zdHJpbmc7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisNCisgcHVibGljOg0KKyAgTWFrZV9QYWlyKENCQ19RUkNvZGVyTW9kZSogbW9kZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikNCisgICAgICA6IG1fbW9kZShtb2RlKSwgbV9zdHJpbmcoc3RyKSB7fQ0KKyAgfk1ha2VfUGFpcigpIHt9DQogfTsNCi1DQkNfUVJDb2RlckVuY29kZXI6OkNCQ19RUkNvZGVyRW5jb2RlcigpDQotew0KLX0NCi1DQkNfUVJDb2RlckVuY29kZXI6On5DQkNfUVJDb2RlckVuY29kZXIoKQ0KLXsNCi19DQotY2xhc3MgTWFrZV9QYWlyDQotew0KLXB1YmxpYzoNCi0gICAgQ0JDX1FSQ29kZXJNb2RlKiBtX21vZGU7DQotICAgIENGWF9CeXRlU3RyaW5nIG1fc3RyaW5nOw0KLXByaXZhdGU6DQotICAgIE1ha2VfUGFpcihjb25zdCBNYWtlX1BhaXIgJm1vZGVfc3RyaW5nKSB7fQ0KLSAgICBNYWtlX1BhaXIgJm9wZXJhdG9yID0gKE1ha2VfUGFpciAmbW9kZV9zdHJpbmcpDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09ICZtb2RlX3N0cmluZykgew0KLSAgICAgICAgICAgIHJldHVybiAqdGhpczsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fbW9kZSA9IG1vZGVfc3RyaW5nLm1fbW9kZTsNCi0gICAgICAgIG1fc3RyaW5nID0gbW9kZV9zdHJpbmcubV9zdHJpbmc7DQotICAgICAgICByZXR1cm4gKnRoaXM7DQotICAgIH0NCi1wdWJsaWM6DQotICAgIE1ha2VfUGFpcihDQkNfUVJDb2Rlck1vZGUgKm1vZGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nICZzdHIpOiBtX21vZGUobW9kZSksIG1fc3RyaW5nKHN0cikge30NCi0gICAgfk1ha2VfUGFpcigpIHt9DQotfTsNCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIgKnFyQ29kZSwgaW50MzJfdCAmZSwgaW50MzJfdCB2ZXJzaW9uU3BlY2lmeSkNCi17DQotICAgIGlmKHZlcnNpb25TcGVjaWZ5ID09IDApIHsNCi0gICAgICAgIEVuY29kZVdpdGhBdXRvVmVyc2lvbihjb250ZW50LCBlY0xldmVsLCBxckNvZGUsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCi0gICAgfSBlbHNlIGlmKHZlcnNpb25TcGVjaWZ5ID4gMCAmJiB2ZXJzaW9uU3BlY2lmeSA8PSA0MCkgew0KLSAgICAgICAgRW5jb2RlV2l0aFNwZWNpZnlWZXJzaW9uKGNvbnRlbnQsIGVjTGV2ZWwsIHFyQ29kZSwgdmVyc2lvblNwZWNpZnksIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25WZXJzaW9uTXVzdDFfNDA7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLX0NCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kRUNJKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzKQ0KLXsNCi19DQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZERhdGFNb2RlTGVuZ2hJbmZvKENGWF9QdHJBcnJheSAmc3BsaXRSZXN1bHQsIENCQ19RUkNvZGVyQml0VmVjdG9yICZoZWFkZXJBbmREYXRhQml0cywNCi0gICAgICAgIENCQ19RUkNvZGVyTW9kZSAqdGVtcE1vZGUsIENCQ19RUkNvZGVyICpxckNvZGUsIENGWF9CeXRlU3RyaW5nICZlbmNvZGluZywgaW50MzJfdCAmZSkNCi17DQotICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIHRlbXBNb2RlID0gKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9tb2RlOw0KLSAgICAgICAgaWYodGVtcE1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKSB7DQotICAgICAgICAgICAgQXBwZW5kTW9kZUluZm8odGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICAgICAgQXBwZW5kTGVuZ3RoSW5mbygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZy5HZXRMZW5ndGgoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgICAgIEFwcGVuZEJ5dGVzKCgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fc3RyaW5nLCB0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlbmNvZGluZywgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICB9IGVsc2UgaWYodGVtcE1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgew0KLSAgICAgICAgICAgIENGWF9CeXRlQXJyYXkgYnl0ZXM7DQotICAgICAgICAgICAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpMb2NhbGVUb1V0ZjgoKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcsIGJ5dGVzKTsNCi0gICAgICAgICAgICBBcHBlbmRNb2RlSW5mbyh0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgICAgICBBcHBlbmRMZW5ndGhJbmZvKGJ5dGVzLkdldFNpemUoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgICAgIEFwcGVuZDhCaXRCeXRlcyhieXRlcywgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIH0gZWxzZSBpZih0ZW1wTW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMpIHsNCi0gICAgICAgICAgICBBcHBlbmRNb2RlSW5mbyh0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgICAgICBBcHBlbmRMZW5ndGhJbmZvKCgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fc3RyaW5nLkdldExlbmd0aCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwgdGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICAgICAgQXBwZW5kQnl0ZXMoKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcsIHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGVuY29kaW5nLCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIH0gZWxzZSBpZih0ZW1wTW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKSB7DQotICAgICAgICAgICAgQXBwZW5kTW9kZUluZm8odGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICAgICAgQXBwZW5kTGVuZ3RoSW5mbygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZy5HZXRMZW5ndGgoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgICAgIEFwcGVuZEJ5dGVzKCgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fc3RyaW5nLCB0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlbmNvZGluZywgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblVua25vd247DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OlNwbGl0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDRlhfUHRyQXJyYXkgJnJlc3VsdCkNCi17DQotICAgIGludDMyX3QgaW5kZXggPSAwLCBmbGFnID0gMDsNCi0gICAgd2hpbGUoKCgodWludDhfdCljb250ZW50W2luZGV4XSA+PSAweEExICYmICh1aW50OF90KWNvbnRlbnRbaW5kZXhdIDw9IDB4QUEpIHx8DQotICAgICAgICAgICAgKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdID49IDB4QjAgJiYgKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPD0gMHhGQSkpICYmIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpKSB7DQotICAgICAgICBpbmRleCArPSAyOw0KLSAgICB9DQotICAgIGlmKGluZGV4ICE9IGZsYWcpIHsNCi0gICAgICAgIHJlc3VsdC5BZGQoRlhfTkVXIE1ha2VfUGFpcihDQkNfUVJDb2Rlck1vZGU6OnNHQkssIGNvbnRlbnQuTWlkKGZsYWcsIGluZGV4IC0gZmxhZykpKTsNCi0gICAgfQ0KLSAgICBmbGFnID0gaW5kZXg7DQotICAgIGlmKGluZGV4ID49IGNvbnRlbnQuR2V0TGVuZ3RoKCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICB3aGlsZShHZXRBbHBoYU51bWVyaWNDb2RlKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdKSA9PSAtMQ0KLSAgICAgICAgICAgICYmICEoKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdID49IDB4QTEgJiYgKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPD0gMHhBQSkgfHwNCi0gICAgICAgICAgICAgICAgICgodWludDhfdCljb250ZW50W2luZGV4XSA+PSAweEIwICYmICh1aW50OF90KWNvbnRlbnRbaW5kZXhdIDw9IDB4RkEpKQ0KLSAgICAgICAgICAgICYmIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpKSB7DQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgICAgIGlmKElzREJDU0xlYWRCeXRlKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdKSkNCi0jZWxzZQ0KLSAgICAgICAgaWYoKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPiAxMjcpDQotI2VuZGlmDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5kZXggKz0gMjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaW5kZXgrKzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZihpbmRleCAhPSBmbGFnKSB7DQotICAgICAgICByZXN1bHQuQWRkKEZYX05FVyBNYWtlX1BhaXIoQ0JDX1FSQ29kZXJNb2RlOjpzQllURSwgY29udGVudC5NaWQoZmxhZywgaW5kZXggLSBmbGFnKSkpOw0KLSAgICB9DQotICAgIGZsYWcgPSBpbmRleDsNCi0gICAgaWYoaW5kZXggPj0gY29udGVudC5HZXRMZW5ndGgoKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIHdoaWxlKEZYU1lTX0lzZGlnaXQoKHVpbnQ4X3QpY29udGVudFtpbmRleF0pICYmIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpKSB7DQotICAgICAgICBpbmRleCsrOw0KLSAgICB9DQotICAgIGlmKGluZGV4ICE9IGZsYWcpIHsNCi0gICAgICAgIHJlc3VsdC5BZGQoRlhfTkVXIE1ha2VfUGFpcihDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDLCBjb250ZW50Lk1pZChmbGFnLCBpbmRleCAtIGZsYWcpKSk7DQotICAgIH0NCi0gICAgZmxhZyA9IGluZGV4Ow0KLSAgICBpZihpbmRleCA+PSBjb250ZW50LkdldExlbmd0aCgpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgd2hpbGUoR2V0QWxwaGFOdW1lcmljQ29kZSgodWludDhfdCljb250ZW50W2luZGV4XSkgIT0gLTEgICYmIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpKSB7DQotICAgICAgICBpbmRleCsrOw0KLSAgICB9DQotICAgIGlmKGluZGV4ICE9IGZsYWcpIHsNCi0gICAgICAgIHJlc3VsdC5BZGQoRlhfTkVXIE1ha2VfUGFpcihDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMsIGNvbnRlbnQuTWlkKGZsYWcsIGluZGV4IC0gZmxhZykpKTsNCi0gICAgfQ0KLSAgICBmbGFnID0gaW5kZXg7DQotICAgIGlmKGluZGV4ID49IGNvbnRlbnQuR2V0TGVuZ3RoKCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBTcGxpdFN0cmluZyhjb250ZW50Lk1pZChpbmRleCwgY29udGVudC5HZXRMZW5ndGgoKSAtIGluZGV4KSwgcmVzdWx0KTsNCi19DQotaW50MzJfdCBDQkNfUVJDb2RlckVuY29kZXI6OkdldFNwYW5CeVZlcnNpb24oQ0JDX1FSQ29kZXJNb2RlICptb2RlRmlyc3QsIENCQ19RUkNvZGVyTW9kZSAqbW9kZVNlY29uZCwgaW50MzJfdCB2ZXJzaW9uTnVtLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYodmVyc2lvbk51bSA9PSAwKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpZigobW9kZUZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykNCi0gICAgICAgICAgICAmJiAobW9kZVNlY29uZCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSkgew0KLSAgICAgICAgaWYodmVyc2lvbk51bSA+PSAxICYmIHZlcnNpb25OdW0gPD0gOSkgew0KLSAgICAgICAgICAgIHJldHVybiAxMTsNCi0gICAgICAgIH0gZWxzZSBpZih2ZXJzaW9uTnVtID49IDEwICYmIHZlcnNpb25OdW0gPD0gMjYpIHsNCi0gICAgICAgICAgICByZXR1cm4gMTU7DQotICAgICAgICB9IGVsc2UgaWYodmVyc2lvbk51bSA+PSAyNyAmJiB2ZXJzaW9uTnVtIDw9IDQwKSB7DQotICAgICAgICAgICAgcmV0dXJuIDE2Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Ob1N1Y2hWZXJzaW9uOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmKChtb2RlU2Vjb25kID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykNCi0gICAgICAgICAgICAgICYmIChtb2RlRmlyc3QgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQykpIHsNCi0gICAgICAgIGlmKHZlcnNpb25OdW0gPj0gMSAmJiB2ZXJzaW9uTnVtIDw9IDkpIHsNCi0gICAgICAgICAgICByZXR1cm4gMTM7DQotICAgICAgICB9IGVsc2UgaWYodmVyc2lvbk51bSA+PSAxMCAmJiB2ZXJzaW9uTnVtIDw9IDI2KSB7DQotICAgICAgICAgICAgcmV0dXJuIDE1Ow0KLSAgICAgICAgfSBlbHNlIGlmKHZlcnNpb25OdW0gPj0gMjcgJiYgdmVyc2lvbk51bSA8PSA0MCkgew0KLSAgICAgICAgICAgIHJldHVybiAxNzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uTm9TdWNoVmVyc2lvbjsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZigobW9kZVNlY29uZCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKQ0KLSAgICAgICAgICAgICAgJiYgKG1vZGVGaXJzdCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKSkgew0KLSAgICAgICAgaWYodmVyc2lvbk51bSA+PSAxICYmIHZlcnNpb25OdW0gPD0gOSkgew0KLSAgICAgICAgICAgIHJldHVybiA2Ow0KLSAgICAgICAgfSBlbHNlIGlmKHZlcnNpb25OdW0gPj0gMTAgJiYgdmVyc2lvbk51bSA8PSAyNikgew0KLSAgICAgICAgICAgIHJldHVybiA4Ow0KLSAgICAgICAgfSBlbHNlIGlmKHZlcnNpb25OdW0gPj0gMjcgJiYgdmVyc2lvbk51bSA8PSA0MCkgew0KLSAgICAgICAgICAgIHJldHVybiA5Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Ob1N1Y2hWZXJzaW9uOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gLTE7DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpNZXJnZVN0cmluZyhDRlhfUHRyQXJyYXkgJnJlc3VsdCwgaW50MzJfdCB2ZXJzaW9uTnVtLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgTWFrZV9QYWlyICpmaXJzdCA9IE5VTEw7DQotICAgIE1ha2VfUGFpciAqc2Vjb25kID0gTlVMTDsNCi0gICAgc2l6ZV90IG1lcmdlTnVtID0gMDsNCi0gICAgaW50MzJfdCBpOw0KLSAgICBmb3IoaSA9IDA7ICgoaSA8IHJlc3VsdC5HZXRTaXplKCkpICYmIChpICsgMSA8IHJlc3VsdC5HZXRTaXplKCkpKTsgaSsrKSB7DQotICAgICAgICBmaXJzdCA9IChNYWtlX1BhaXIqKXJlc3VsdFtpXTsNCi0gICAgICAgIHNlY29uZCA9IChNYWtlX1BhaXIqKXJlc3VsdFtpICsgMV07DQotICAgICAgICBpZihmaXJzdC0+bV9tb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykgew0KLSAgICAgICAgICAgIGludDMyX3QgdG1wID0gR2V0U3BhbkJ5VmVyc2lvbihDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMsIENCQ19RUkNvZGVyTW9kZTo6c0JZVEUsIHZlcnNpb25OdW0sIGUpOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgICAgIGlmKChzZWNvbmQtPm1fbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKQ0KLSAgICAgICAgICAgICAgICAgICAgJiYgKGZpcnN0LT5tX3N0cmluZy5HZXRMZW5ndGgoKSA8IHRtcCkpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gZmlyc3QtPm1fc3RyaW5nICsgc2Vjb25kLT5tX3N0cmluZzsNCi0gICAgICAgICAgICAgICAgc2Vjb25kLT5tX3N0cmluZyA9IHN0cjsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIGZpcnN0Ow0KLSAgICAgICAgICAgICAgICByZXN1bHQuUmVtb3ZlQXQoaSk7DQotICAgICAgICAgICAgICAgIGktLTsNCi0gICAgICAgICAgICAgICAgbWVyZ2VOdW0rKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYoZmlyc3QtPm1fbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSB7DQotICAgICAgICAgICAgaWYoc2Vjb25kLT5tX21vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgew0KLSAgICAgICAgICAgICAgICBmaXJzdC0+bV9zdHJpbmcgKz0gc2Vjb25kLT5tX3N0cmluZzsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHNlY29uZDsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LlJlbW92ZUF0KGkgKyAxKTsNCi0gICAgICAgICAgICAgICAgaS0tOw0KLSAgICAgICAgICAgICAgICBtZXJnZU51bSsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZihmaXJzdC0+bV9tb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMpIHsNCi0gICAgICAgICAgICBpbnQzMl90IHRtcCA9IEdldFNwYW5CeVZlcnNpb24oQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQywgQ0JDX1FSQ29kZXJNb2RlOjpzQllURSwgdmVyc2lvbk51bSwgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICAgICAgaWYoKHNlY29uZC0+bV9tb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpDQotICAgICAgICAgICAgICAgICAgICAmJiAoZmlyc3QtPm1fc3RyaW5nLkdldExlbmd0aCgpIDwgdG1wKSkgew0KLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBmaXJzdC0+bV9zdHJpbmcgKyBzZWNvbmQtPm1fc3RyaW5nOw0KLSAgICAgICAgICAgICAgICBzZWNvbmQtPm1fc3RyaW5nID0gc3RyOw0KLSAgICAgICAgICAgICAgICBkZWxldGUgZmlyc3Q7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5SZW1vdmVBdChpKTsNCi0gICAgICAgICAgICAgICAgaS0tOw0KLSAgICAgICAgICAgICAgICBtZXJnZU51bSsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0bXAgPSBHZXRTcGFuQnlWZXJzaW9uKENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMsIENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQywgdmVyc2lvbk51bSwgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICAgICAgaWYoKHNlY29uZC0+bV9tb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykNCi0gICAgICAgICAgICAgICAgICAgICYmIChmaXJzdC0+bV9zdHJpbmcuR2V0TGVuZ3RoKCkgPCB0bXApKSB7DQotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IGZpcnN0LT5tX3N0cmluZyArIHNlY29uZC0+bV9zdHJpbmc7DQotICAgICAgICAgICAgICAgIHNlY29uZC0+bV9zdHJpbmcgPSBzdHI7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBmaXJzdDsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LlJlbW92ZUF0KGkpOw0KLSAgICAgICAgICAgICAgICBpLS07DQotICAgICAgICAgICAgICAgIG1lcmdlTnVtKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmKG1lcmdlTnVtID09IDApIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBNZXJnZVN0cmluZyhyZXN1bHQsIHZlcnNpb25OdW0sIGUpOw0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb25TcGVjaWZ5KSB7DQorICBpZiAodmVyc2lvblNwZWNpZnkgPT0gMCkgew0KKyAgICBFbmNvZGVXaXRoQXV0b1ZlcnNpb24oY29udGVudCwgZWNMZXZlbCwgcXJDb2RlLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCisgIH0gZWxzZSBpZiAodmVyc2lvblNwZWNpZnkgPiAwICYmIHZlcnNpb25TcGVjaWZ5IDw9IDQwKSB7DQorICAgIEVuY29kZVdpdGhTcGVjaWZ5VmVyc2lvbihjb250ZW50LCBlY0xldmVsLCBxckNvZGUsIHZlcnNpb25TcGVjaWZ5LCBlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9IGVsc2Ugew0KKyAgICBlID0gQkNFeGNlcHRpb25WZXJzaW9uTXVzdDFfNDA7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KIH0NCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6SW5pdFFSQ29kZShpbnQzMl90IG51bUlucHV0Qnl0ZXMsIGludDMyX3QgdmVyc2lvbk51bWJlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLCBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsIENCQ19RUkNvZGVyKiBxckNvZGUsIGludDMyX3QgJmUpDQotew0KLSAgICBxckNvZGUtPlNldEVDTGV2ZWwoZWNMZXZlbCk7DQotICAgIHFyQ29kZS0+U2V0TW9kZShtb2RlKTsNCi0gICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uID0gQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRWZXJzaW9uRm9yTnVtYmVyKHZlcnNpb25OdW1iZXIsIGUpOw0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRFQ0koQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMpIHt9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZERhdGFNb2RlTGVuZ2hJbmZvKA0KKyAgICBDRlhfUHRyQXJyYXkmIHNwbGl0UmVzdWx0LA0KKyAgICBDQkNfUVJDb2RlckJpdFZlY3RvciYgaGVhZGVyQW5kRGF0YUJpdHMsDQorICAgIENCQ19RUkNvZGVyTW9kZSogdGVtcE1vZGUsDQorICAgIENCQ19RUkNvZGVyKiBxckNvZGUsDQorICAgIENGWF9CeXRlU3RyaW5nJiBlbmNvZGluZywNCisgICAgaW50MzJfdCYgZSkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgdGVtcE1vZGUgPSAoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX21vZGU7DQorICAgIGlmICh0ZW1wTW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNHQkspIHsNCisgICAgICBBcHBlbmRNb2RlSW5mbyh0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICBBcHBlbmRMZW5ndGhJbmZvKCgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fc3RyaW5nLkdldExlbmd0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXRWZXJzaW9uKCksIHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIEFwcGVuZEJ5dGVzKCgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fc3RyaW5nLCB0ZW1wTW9kZSwNCisgICAgICAgICAgICAgICAgICAmaGVhZGVyQW5kRGF0YUJpdHMsIGVuY29kaW5nLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfSBlbHNlIGlmICh0ZW1wTW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSB7DQorICAgICAgQ0ZYX0J5dGVBcnJheSBieXRlczsNCisgICAgICBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OkxvY2FsZVRvVXRmOCgNCisgICAgICAgICAgKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcsIGJ5dGVzKTsNCisgICAgICBBcHBlbmRNb2RlSW5mbyh0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICBBcHBlbmRMZW5ndGhJbmZvKGJ5dGVzLkdldFNpemUoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIHRlbXBNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICBBcHBlbmQ4Qml0Qnl0ZXMoYnl0ZXMsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0gZWxzZSBpZiAodGVtcE1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDKSB7DQorICAgICAgQXBwZW5kTW9kZUluZm8odGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgQXBwZW5kTGVuZ3RoSW5mbygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZy5HZXRMZW5ndGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0VmVyc2lvbigpLCB0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICBBcHBlbmRCeXRlcygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZywgdGVtcE1vZGUsDQorICAgICAgICAgICAgICAgICAgJmhlYWRlckFuZERhdGFCaXRzLCBlbmNvZGluZywgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0gZWxzZSBpZiAodGVtcE1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQykgew0KKyAgICAgIEFwcGVuZE1vZGVJbmZvKHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIEFwcGVuZExlbmd0aEluZm8oKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcuR2V0TGVuZ3RoKCksDQorICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldFZlcnNpb24oKSwgdGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgQXBwZW5kQnl0ZXMoKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcsIHRlbXBNb2RlLA0KKyAgICAgICAgICAgICAgICAgICZoZWFkZXJBbmREYXRhQml0cywgZW5jb2RpbmcsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvblVua25vd247DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OlNwbGl0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkmIHJlc3VsdCkgew0KKyAgaW50MzJfdCBpbmRleCA9IDAsIGZsYWcgPSAwOw0KKyAgd2hpbGUgKA0KKyAgICAgICgoKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPj0gMHhBMSAmJiAodWludDhfdCljb250ZW50W2luZGV4XSA8PSAweEFBKSB8fA0KKyAgICAgICAoKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPj0gMHhCMCAmJiAodWludDhfdCljb250ZW50W2luZGV4XSA8PSAweEZBKSkgJiYNCisgICAgICAoaW5kZXggPCBjb250ZW50LkdldExlbmd0aCgpKSkgew0KKyAgICBpbmRleCArPSAyOw0KKyAgfQ0KKyAgaWYgKGluZGV4ICE9IGZsYWcpIHsNCisgICAgcmVzdWx0LkFkZChGWF9ORVcgTWFrZV9QYWlyKENCQ19RUkNvZGVyTW9kZTo6c0dCSywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuTWlkKGZsYWcsIGluZGV4IC0gZmxhZykpKTsNCisgIH0NCisgIGZsYWcgPSBpbmRleDsNCisgIGlmIChpbmRleCA+PSBjb250ZW50LkdldExlbmd0aCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHdoaWxlICgNCisgICAgICBHZXRBbHBoYU51bWVyaWNDb2RlKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdKSA9PSAtMSAmJg0KKyAgICAgICEoKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdID49IDB4QTEgJiYgKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPD0gMHhBQSkgfHwNCisgICAgICAgICgodWludDhfdCljb250ZW50W2luZGV4XSA+PSAweEIwICYmICh1aW50OF90KWNvbnRlbnRbaW5kZXhdIDw9IDB4RkEpKSAmJg0KKyAgICAgIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpKSB7DQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgaWYgKElzREJDU0xlYWRCeXRlKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdKSkNCisjZWxzZQ0KKyAgICBpZiAoKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPiAxMjcpDQorI2VuZGlmDQorICAgIHsNCisgICAgICBpbmRleCArPSAyOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGluZGV4Kys7DQorICAgIH0NCisgIH0NCisgIGlmIChpbmRleCAhPSBmbGFnKSB7DQorICAgIHJlc3VsdC5BZGQoRlhfTkVXIE1ha2VfUGFpcihDQkNfUVJDb2Rlck1vZGU6OnNCWVRFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5NaWQoZmxhZywgaW5kZXggLSBmbGFnKSkpOw0KKyAgfQ0KKyAgZmxhZyA9IGluZGV4Ow0KKyAgaWYgKGluZGV4ID49IGNvbnRlbnQuR2V0TGVuZ3RoKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgd2hpbGUgKEZYU1lTX0lzZGlnaXQoKHVpbnQ4X3QpY29udGVudFtpbmRleF0pICYmDQorICAgICAgICAgKGluZGV4IDwgY29udGVudC5HZXRMZW5ndGgoKSkpIHsNCisgICAgaW5kZXgrKzsNCisgIH0NCisgIGlmIChpbmRleCAhPSBmbGFnKSB7DQorICAgIHJlc3VsdC5BZGQoRlhfTkVXIE1ha2VfUGFpcihDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5NaWQoZmxhZywgaW5kZXggLSBmbGFnKSkpOw0KKyAgfQ0KKyAgZmxhZyA9IGluZGV4Ow0KKyAgaWYgKGluZGV4ID49IGNvbnRlbnQuR2V0TGVuZ3RoKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgd2hpbGUgKEdldEFscGhhTnVtZXJpY0NvZGUoKHVpbnQ4X3QpY29udGVudFtpbmRleF0pICE9IC0xICYmDQorICAgICAgICAgKGluZGV4IDwgY29udGVudC5HZXRMZW5ndGgoKSkpIHsNCisgICAgaW5kZXgrKzsNCisgIH0NCisgIGlmIChpbmRleCAhPSBmbGFnKSB7DQorICAgIHJlc3VsdC5BZGQoRlhfTkVXIE1ha2VfUGFpcihDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Lk1pZChmbGFnLCBpbmRleCAtIGZsYWcpKSk7DQorICB9DQorICBmbGFnID0gaW5kZXg7DQorICBpZiAoaW5kZXggPj0gY29udGVudC5HZXRMZW5ndGgoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBTcGxpdFN0cmluZyhjb250ZW50Lk1pZChpbmRleCwgY29udGVudC5HZXRMZW5ndGgoKSAtIGluZGV4KSwgcmVzdWx0KTsNCit9DQoraW50MzJfdCBDQkNfUVJDb2RlckVuY29kZXI6OkdldFNwYW5CeVZlcnNpb24oQ0JDX1FSQ29kZXJNb2RlKiBtb2RlRmlyc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlU2Vjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbk51bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAodmVyc2lvbk51bSA9PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKChtb2RlRmlyc3QgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDKSAmJg0KKyAgICAgIChtb2RlU2Vjb25kID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpKSB7DQorICAgIGlmICh2ZXJzaW9uTnVtID49IDEgJiYgdmVyc2lvbk51bSA8PSA5KSB7DQorICAgICAgcmV0dXJuIDExOw0KKyAgICB9IGVsc2UgaWYgKHZlcnNpb25OdW0gPj0gMTAgJiYgdmVyc2lvbk51bSA8PSAyNikgew0KKyAgICAgIHJldHVybiAxNTsNCisgICAgfSBlbHNlIGlmICh2ZXJzaW9uTnVtID49IDI3ICYmIHZlcnNpb25OdW0gPD0gNDApIHsNCisgICAgICByZXR1cm4gMTY7DQorICAgIH0gZWxzZSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uTm9TdWNoVmVyc2lvbjsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoKG1vZGVTZWNvbmQgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDKSAmJg0KKyAgICAgICAgICAgICAobW9kZUZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMpKSB7DQorICAgIGlmICh2ZXJzaW9uTnVtID49IDEgJiYgdmVyc2lvbk51bSA8PSA5KSB7DQorICAgICAgcmV0dXJuIDEzOw0KKyAgICB9IGVsc2UgaWYgKHZlcnNpb25OdW0gPj0gMTAgJiYgdmVyc2lvbk51bSA8PSAyNikgew0KKyAgICAgIHJldHVybiAxNTsNCisgICAgfSBlbHNlIGlmICh2ZXJzaW9uTnVtID49IDI3ICYmIHZlcnNpb25OdW0gPD0gNDApIHsNCisgICAgICByZXR1cm4gMTc7DQorICAgIH0gZWxzZSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uTm9TdWNoVmVyc2lvbjsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoKG1vZGVTZWNvbmQgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgJiYNCisgICAgICAgICAgICAgKG1vZGVGaXJzdCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKSkgew0KKyAgICBpZiAodmVyc2lvbk51bSA+PSAxICYmIHZlcnNpb25OdW0gPD0gOSkgew0KKyAgICAgIHJldHVybiA2Ow0KKyAgICB9IGVsc2UgaWYgKHZlcnNpb25OdW0gPj0gMTAgJiYgdmVyc2lvbk51bSA8PSAyNikgew0KKyAgICAgIHJldHVybiA4Ow0KKyAgICB9IGVsc2UgaWYgKHZlcnNpb25OdW0gPj0gMjcgJiYgdmVyc2lvbk51bSA8PSA0MCkgew0KKyAgICAgIHJldHVybiA5Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vU3VjaFZlcnNpb247DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gLTE7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpNZXJnZVN0cmluZyhDRlhfUHRyQXJyYXkmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uTnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBNYWtlX1BhaXIqIGZpcnN0ID0gTlVMTDsNCisgIE1ha2VfUGFpciogc2Vjb25kID0gTlVMTDsNCisgIHNpemVfdCBtZXJnZU51bSA9IDA7DQorICBpbnQzMl90IGk7DQorICBmb3IgKGkgPSAwOyAoKGkgPCByZXN1bHQuR2V0U2l6ZSgpKSAmJiAoaSArIDEgPCByZXN1bHQuR2V0U2l6ZSgpKSk7IGkrKykgew0KKyAgICBmaXJzdCA9IChNYWtlX1BhaXIqKXJlc3VsdFtpXTsNCisgICAgc2Vjb25kID0gKE1ha2VfUGFpciopcmVzdWx0W2kgKyAxXTsNCisgICAgaWYgKGZpcnN0LT5tX21vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDKSB7DQorICAgICAgaW50MzJfdCB0bXAgPSBHZXRTcGFuQnlWZXJzaW9uKENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlOjpzQllURSwgdmVyc2lvbk51bSwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgaWYgKChzZWNvbmQtPm1fbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSAmJg0KKyAgICAgICAgICAoZmlyc3QtPm1fc3RyaW5nLkdldExlbmd0aCgpIDwgdG1wKSkgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gZmlyc3QtPm1fc3RyaW5nICsgc2Vjb25kLT5tX3N0cmluZzsNCisgICAgICAgIHNlY29uZC0+bV9zdHJpbmcgPSBzdHI7DQorICAgICAgICBkZWxldGUgZmlyc3Q7DQorICAgICAgICByZXN1bHQuUmVtb3ZlQXQoaSk7DQorICAgICAgICBpLS07DQorICAgICAgICBtZXJnZU51bSsrOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChmaXJzdC0+bV9tb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpIHsNCisgICAgICBpZiAoc2Vjb25kLT5tX21vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgew0KKyAgICAgICAgZmlyc3QtPm1fc3RyaW5nICs9IHNlY29uZC0+bV9zdHJpbmc7DQorICAgICAgICBkZWxldGUgc2Vjb25kOw0KKyAgICAgICAgcmVzdWx0LlJlbW92ZUF0KGkgKyAxKTsNCisgICAgICAgIGktLTsNCisgICAgICAgIG1lcmdlTnVtKys7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGZpcnN0LT5tX21vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQykgew0KKyAgICAgIGludDMyX3QgdG1wID0gR2V0U3BhbkJ5VmVyc2lvbihDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFLCB2ZXJzaW9uTnVtLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICBpZiAoKHNlY29uZC0+bV9tb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpICYmDQorICAgICAgICAgIChmaXJzdC0+bV9zdHJpbmcuR2V0TGVuZ3RoKCkgPCB0bXApKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBmaXJzdC0+bV9zdHJpbmcgKyBzZWNvbmQtPm1fc3RyaW5nOw0KKyAgICAgICAgc2Vjb25kLT5tX3N0cmluZyA9IHN0cjsNCisgICAgICAgIGRlbGV0ZSBmaXJzdDsNCisgICAgICAgIHJlc3VsdC5SZW1vdmVBdChpKTsNCisgICAgICAgIGktLTsNCisgICAgICAgIG1lcmdlTnVtKys7DQorICAgICAgfQ0KKyAgICAgIHRtcCA9IEdldFNwYW5CeVZlcnNpb24oQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQywgdmVyc2lvbk51bSwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgaWYgKChzZWNvbmQtPm1fbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMpICYmDQorICAgICAgICAgIChmaXJzdC0+bV9zdHJpbmcuR2V0TGVuZ3RoKCkgPCB0bXApKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBmaXJzdC0+bV9zdHJpbmcgKyBzZWNvbmQtPm1fc3RyaW5nOw0KKyAgICAgICAgc2Vjb25kLT5tX3N0cmluZyA9IHN0cjsNCisgICAgICAgIGRlbGV0ZSBmaXJzdDsNCisgICAgICAgIHJlc3VsdC5SZW1vdmVBdChpKTsNCisgICAgICAgIGktLTsNCisgICAgICAgIG1lcmdlTnVtKys7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAobWVyZ2VOdW0gPT0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBNZXJnZVN0cmluZyhyZXN1bHQsIHZlcnNpb25OdW0sIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpJbml0UVJDb2RlKGludDMyX3QgbnVtSW5wdXRCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb25OdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBxckNvZGUtPlNldEVDTGV2ZWwoZWNMZXZlbCk7DQorICBxckNvZGUtPlNldE1vZGUobW9kZSk7DQorICBDQkNfUVJDb2RlclZlcnNpb24qIHZlcnNpb24gPQ0KKyAgICAgIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0VmVyc2lvbkZvck51bWJlcih2ZXJzaW9uTnVtYmVyLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgaW50MzJfdCBudW1CeXRlcyA9IHZlcnNpb24tPkdldFRvdGFsQ29kZVdvcmRzKCk7DQorICBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrcyA9IHZlcnNpb24tPkdldEVDQmxvY2tzRm9yTGV2ZWwoZWNMZXZlbCk7DQorICBpbnQzMl90IG51bUVjQnl0ZXMgPSBlY0Jsb2Nrcy0+R2V0VG90YWxFQ0NvZGVXb3JkcygpOw0KKyAgaW50MzJfdCBudW1SU0Jsb2NrcyA9IGVjQmxvY2tzLT5HZXROdW1CbG9ja3MoKTsNCisgIGludDMyX3QgbnVtRGF0YUJ5dGVzID0gbnVtQnl0ZXMgLSBudW1FY0J5dGVzOw0KKyAgaWYgKG51bURhdGFCeXRlcyA+PSBudW1JbnB1dEJ5dGVzICsgMykgew0KKyAgICBxckNvZGUtPlNldFZlcnNpb24odmVyc2lvbk51bWJlcik7DQorICAgIHFyQ29kZS0+U2V0TnVtVG90YWxCeXRlcyhudW1CeXRlcyk7DQorICAgIHFyQ29kZS0+U2V0TnVtRGF0YUJ5dGVzKG51bURhdGFCeXRlcyk7DQorICAgIHFyQ29kZS0+U2V0TnVtUlNCbG9ja3MobnVtUlNCbG9ja3MpOw0KKyAgICBxckNvZGUtPlNldE51bUVDQnl0ZXMobnVtRWNCeXRlcyk7DQorICAgIHFyQ29kZS0+U2V0TWF0cml4V2lkdGgodmVyc2lvbi0+R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uQ2Fubm90RmluZEJsb2NrSW5mbzsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6RW5jb2RlV2l0aFNwZWNpZnlWZXJzaW9uKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwNCisgICAgaW50MzJfdCB2ZXJzaW9uU3BlY2lmeSwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcgPSAidXRmOCI7DQorICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUgPSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFOw0KKyAgQ0ZYX1B0ckFycmF5IHNwbGl0UmVzdWx0Ow0KKyAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZGF0YUJpdHM7DQorICBkYXRhQml0cy5Jbml0KCk7DQorICBTcGxpdFN0cmluZyhjb250ZW50LCBzcGxpdFJlc3VsdCk7DQorICBNZXJnZVN0cmluZyhzcGxpdFJlc3VsdCwgdmVyc2lvblNwZWNpZnksIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkgQ0JDX1FSQ29kZXJNb2RlKiB0ZW1wTW9kZSA9IE5VTEw7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGkrKykgew0KKyAgICBBcHBlbmRCeXRlcygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZywNCisgICAgICAgICAgICAgICAgKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9tb2RlLCAmZGF0YUJpdHMsIGVuY29kaW5nLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgeSsrKSB7DQorICAgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbeV07DQorICAgICAgfQ0KKyAgICAgIHNwbGl0UmVzdWx0LlJlbW92ZUFsbCgpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBudW1JbnB1dEJ5dGVzID0gZGF0YUJpdHMuc2l6ZUluQnl0ZXMoKTsNCisgIENCQ19RUkNvZGVyQml0VmVjdG9yIGhlYWRlckFuZERhdGFCaXRzOw0KKyAgaGVhZGVyQW5kRGF0YUJpdHMuSW5pdCgpOw0KKyAgSW5pdFFSQ29kZShudW1JbnB1dEJ5dGVzLCB2ZXJzaW9uU3BlY2lmeSwgZWNMZXZlbCwgbW9kZSwgcXJDb2RlLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBrKyspIHsNCisgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRba107DQorICAgIH0NCisgICAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEFwcGVuZERhdGFNb2RlTGVuZ2hJbmZvKHNwbGl0UmVzdWx0LCBoZWFkZXJBbmREYXRhQml0cywgdGVtcE1vZGUsIHFyQ29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBrKyspIHsNCisgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRba107DQorICAgIH0NCisgICAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIG51bUlucHV0Qnl0ZXMgPSBoZWFkZXJBbmREYXRhQml0cy5zaXplSW5CeXRlcygpOw0KKyAgVGVybWluYXRlQml0cyhxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGsrKykgew0KKyAgICAgIGRlbGV0ZSAoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtrXTsNCisgICAgfQ0KKyAgICBzcGxpdFJlc3VsdC5SZW1vdmVBbGwoKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBqKyspIHsNCisgICAgZGVsZXRlIChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2pdOw0KKyAgfQ0KKyAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQorICBDQkNfUVJDb2RlckJpdFZlY3RvciBmaW5hbEJpdHM7DQorICBmaW5hbEJpdHMuSW5pdCgpOw0KKyAgSW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKCZoZWFkZXJBbmREYXRhQml0cywgcXJDb2RlLT5HZXROdW1Ub3RhbEJ5dGVzKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXROdW1EYXRhQnl0ZXMoKSwgcXJDb2RlLT5HZXROdW1SU0Jsb2NrcygpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICZmaW5hbEJpdHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogcERlY29kZXIgPSBGWF9ORVcgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgoDQorICAgICAgcXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpLCBxckNvZGUtPkdldE1hdHJpeFdpZHRoKCkpOw0KKyAgcERlY29kZXItPkluaXQoKTsNCisgIENCQ19BdXRvUHRyPENCQ19Db21tb25CeXRlTWF0cml4PiBtYXRyaXgocERlY29kZXIpOw0KKyAgaW50MzJfdCBtYXNrUGF0dGVybiA9IENob29zZU1hc2tQYXR0ZXJuKA0KKyAgICAgICZmaW5hbEJpdHMsIHFyQ29kZS0+R2V0RUNMZXZlbCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwgbWF0cml4LmdldCgpLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgcXJDb2RlLT5TZXRNYXNrUGF0dGVybihtYXNrUGF0dGVybik7DQorICBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkJ1aWxkTWF0cml4KCZmaW5hbEJpdHMsIHFyQ29kZS0+R2V0RUNMZXZlbCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldFZlcnNpb24oKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXRNYXNrUGF0dGVybigpLCBtYXRyaXguZ2V0KCksIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBxckNvZGUtPlNldE1hdHJpeChtYXRyaXgucmVsZWFzZSgpKTsNCisgIGlmICghcXJDb2RlLT5Jc1ZhbGlkKCkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZFFSQ29kZTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGVXaXRoQXV0b1ZlcnNpb24oDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICBDQkNfUVJDb2RlciogcXJDb2RlLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZyA9ICJ1dGY4IjsNCisgIENCQ19RUkNvZGVyTW9kZSogbW9kZSA9IENCQ19RUkNvZGVyTW9kZTo6c0JZVEU7DQorICBDRlhfUHRyQXJyYXkgc3BsaXRSZXN1bHQ7DQorICBDQkNfUVJDb2RlckJpdFZlY3RvciBkYXRhQml0czsNCisgIGRhdGFCaXRzLkluaXQoKTsNCisgIFNwbGl0U3RyaW5nKGNvbnRlbnQsIHNwbGl0UmVzdWx0KTsNCisgIE1lcmdlU3RyaW5nKHNwbGl0UmVzdWx0LCA4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0JDX1FSQ29kZXJNb2RlKiB0ZW1wTW9kZSA9IE5VTEw7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGkrKykgew0KKyAgICBBcHBlbmRCeXRlcygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZywNCisgICAgICAgICAgICAgICAgKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9tb2RlLCAmZGF0YUJpdHMsIGVuY29kaW5nLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgbCsrKSB7DQorICAgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbbF07DQorICAgICAgfQ0KKyAgICAgIHNwbGl0UmVzdWx0LlJlbW92ZUFsbCgpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBudW1JbnB1dEJ5dGVzID0gZGF0YUJpdHMuc2l6ZUluQnl0ZXMoKTsNCisgIEluaXRRUkNvZGUobnVtSW5wdXRCeXRlcywgZWNMZXZlbCwgbW9kZSwgcXJDb2RlLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpIENCQ19RUkNvZGVyQml0VmVjdG9yIGhlYWRlckFuZERhdGFCaXRzOw0KKyAgaGVhZGVyQW5kRGF0YUJpdHMuSW5pdCgpOw0KKyAgdGVtcE1vZGUgPSBOVUxMOw0KKyAgaW50MzJfdCB2ZXJzaW9uTnVtID0gcXJDb2RlLT5HZXRWZXJzaW9uKCk7DQorc2lnbjoNCisgIEFwcGVuZERhdGFNb2RlTGVuZ2hJbmZvKHNwbGl0UmVzdWx0LCBoZWFkZXJBbmREYXRhQml0cywgdGVtcE1vZGUsIHFyQ29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZ290byBjYXRjaEV4Y2VwdGlvbjsNCisgIH0NCisgIG51bUlucHV0Qnl0ZXMgPSBoZWFkZXJBbmREYXRhQml0cy5zaXplSW5CeXRlcygpOw0KKyAgVGVybWluYXRlQml0cyhxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBnb3RvIGNhdGNoRXhjZXB0aW9uOw0KKyAgfQ0KK2NhdGNoRXhjZXB0aW9uOg0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBpbnQzMl90IGUxID0gQkNFeGNlcHRpb25OTzsNCisgICAgSW5pdFFSQ29kZShudW1JbnB1dEJ5dGVzLCBlY0xldmVsLCBtb2RlLCBxckNvZGUsIGUxKTsNCisgICAgaWYgKGUxICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBlID0gZTE7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHZlcnNpb25OdW0rKzsNCisgICAgaWYgKHZlcnNpb25OdW0gPD0gNDApIHsNCisgICAgICBoZWFkZXJBbmREYXRhQml0cy5DbGVhcigpOw0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5POw0KKyAgICAgIGdvdG8gc2lnbjsNCisgICAgfSBlbHNlIHsNCisgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGorKykgew0KKyAgICAgICAgZGVsZXRlIChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2pdOw0KKyAgICAgIH0NCisgICAgICBzcGxpdFJlc3VsdC5SZW1vdmVBbGwoKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgaysrKSB7DQorICAgIGRlbGV0ZSAoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtrXTsNCisgIH0NCisgIHNwbGl0UmVzdWx0LlJlbW92ZUFsbCgpOw0KKyAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZmluYWxCaXRzOw0KKyAgZmluYWxCaXRzLkluaXQoKTsNCisgIEludGVybGVhdmVXaXRoRUNCeXRlcygmaGVhZGVyQW5kRGF0YUJpdHMsIHFyQ29kZS0+R2V0TnVtVG90YWxCeXRlcygpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0TnVtRGF0YUJ5dGVzKCksIHFyQ29kZS0+R2V0TnVtUlNCbG9ja3MoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAmZmluYWxCaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIHBEZWNvZGVyID0gRlhfTkVXIENCQ19Db21tb25CeXRlTWF0cml4KA0KKyAgICAgIHFyQ29kZS0+R2V0TWF0cml4V2lkdGgoKSwgcXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpKTsNCisgIHBEZWNvZGVyLT5Jbml0KCk7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQnl0ZU1hdHJpeD4gbWF0cml4KHBEZWNvZGVyKTsNCisgIGludDMyX3QgbWFza1BhdHRlcm4gPSBDaG9vc2VNYXNrUGF0dGVybigNCisgICAgICAmZmluYWxCaXRzLCBxckNvZGUtPkdldEVDTGV2ZWwoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIG1hdHJpeC5nZXQoKSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIHFyQ29kZS0+U2V0TWFza1BhdHRlcm4obWFza1BhdHRlcm4pOw0KKyAgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpCdWlsZE1hdHJpeCgmZmluYWxCaXRzLCBxckNvZGUtPkdldEVDTGV2ZWwoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXRWZXJzaW9uKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0TWFza1BhdHRlcm4oKSwgbWF0cml4LmdldCgpLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpIHFyQ29kZS0+U2V0TWF0cml4KG1hdHJpeC5yZWxlYXNlKCkpOw0KKyAgaWYgKCFxckNvZGUtPklzVmFsaWQoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkUVJDb2RlOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlciogcXJDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcgPSAidXRmOCI7DQorICBDRlhfQnl0ZVN0cmluZyB1dGY4RGF0YTsNCisgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChjb250ZW50LCB1dGY4RGF0YSk7DQorICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUgPSBDaG9vc2VNb2RlKHV0ZjhEYXRhLCBlbmNvZGluZyk7DQorICBDQkNfUVJDb2RlckJpdFZlY3RvciBkYXRhQml0czsNCisgIGRhdGFCaXRzLkluaXQoKTsNCisgIEFwcGVuZEJ5dGVzKHV0ZjhEYXRhLCBtb2RlLCAmZGF0YUJpdHMsIGVuY29kaW5nLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgaW50MzJfdCBudW1JbnB1dEJ5dGVzID0gZGF0YUJpdHMuc2l6ZUluQnl0ZXMoKTsNCisgIEluaXRRUkNvZGUobnVtSW5wdXRCeXRlcywgZWNMZXZlbCwgbW9kZSwgcXJDb2RlLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgaGVhZGVyQW5kRGF0YUJpdHM7DQorICBoZWFkZXJBbmREYXRhQml0cy5Jbml0KCk7DQorICBBcHBlbmRNb2RlSW5mbyhtb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBpbnQzMl90IG51bUxldHRlcnMgPSBtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUgPyBkYXRhQml0cy5zaXplSW5CeXRlcygpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb250ZW50LkdldExlbmd0aCgpOw0KKyAgQXBwZW5kTGVuZ3RoSW5mbyhudW1MZXR0ZXJzLCBxckNvZGUtPkdldFZlcnNpb24oKSwgbW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLA0KKyAgICAgICAgICAgICAgICAgICBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgaGVhZGVyQW5kRGF0YUJpdHMuQXBwZW5kQml0VmVjdG9yKCZkYXRhQml0cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKQ0KKyAgICAgIFRlcm1pbmF0ZUJpdHMocXJDb2RlLT5HZXROdW1EYXRhQnl0ZXMoKSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZmluYWxCaXRzOw0KKyAgZmluYWxCaXRzLkluaXQoKTsNCisgIEludGVybGVhdmVXaXRoRUNCeXRlcygmaGVhZGVyQW5kRGF0YUJpdHMsIHFyQ29kZS0+R2V0TnVtVG90YWxCeXRlcygpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0TnVtRGF0YUJ5dGVzKCksIHFyQ29kZS0+R2V0TnVtUlNCbG9ja3MoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAmZmluYWxCaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIHBEZWNvZGVyID0gRlhfTkVXIENCQ19Db21tb25CeXRlTWF0cml4KA0KKyAgICAgIHFyQ29kZS0+R2V0TWF0cml4V2lkdGgoKSwgcXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpKTsNCisgIHBEZWNvZGVyLT5Jbml0KCk7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQnl0ZU1hdHJpeD4gbWF0cml4KHBEZWNvZGVyKTsNCisgIGludDMyX3QgbWFza1BhdHRlcm4gPSBDaG9vc2VNYXNrUGF0dGVybigNCisgICAgICAmZmluYWxCaXRzLCBxckNvZGUtPkdldEVDTGV2ZWwoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIG1hdHJpeC5nZXQoKSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIHFyQ29kZS0+U2V0TWFza1BhdHRlcm4obWFza1BhdHRlcm4pOw0KKyAgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpCdWlsZE1hdHJpeCgmZmluYWxCaXRzLCBxckNvZGUtPkdldEVDTGV2ZWwoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXRWZXJzaW9uKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0TWFza1BhdHRlcm4oKSwgbWF0cml4LmdldCgpLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpIHFyQ29kZS0+U2V0TWF0cml4KG1hdHJpeC5yZWxlYXNlKCkpOw0KKyAgaWYgKCFxckNvZGUtPklzVmFsaWQoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkUVJDb2RlOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OlRlcm1pbmF0ZUJpdHMoaW50MzJfdCBudW1EYXRhQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBjYXBhY2l0eSA9IG51bURhdGFCeXRlcyA8PCAzOw0KKyAgaWYgKGJpdHMtPlNpemUoKSA+IGNhcGFjaXR5KSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkRhdGFUb29NYW55Ow0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDQgJiYgYml0cy0+U2l6ZSgpIDwgY2FwYWNpdHk7ICsraSkgew0KKyAgICBiaXRzLT5BcHBlbmRCaXQoMCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgaW50MzJfdCBudW1CaXRzSW5MYXN0Qnl0ZSA9IGJpdHMtPlNpemUoKSAlIDg7DQorICBpZiAobnVtQml0c0luTGFzdEJ5dGUgPiAwKSB7DQorICAgIGludDMyX3QgbnVtUGFkZGluZ0JpdHMgPSA4IC0gbnVtQml0c0luTGFzdEJ5dGU7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG51bVBhZGRpbmdCaXRzOyArK2opIHsNCisgICAgICBiaXRzLT5BcHBlbmRCaXQoMCwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJpdHMtPlNpemUoKSAlIDggIT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25EaWdpdExlbmd0aE11c3RCZTg7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgaW50MzJfdCBudW1QYWRkaW5nQnl0ZXMgPSBudW1EYXRhQnl0ZXMgLSBiaXRzLT5zaXplSW5CeXRlcygpOw0KKyAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbnVtUGFkZGluZ0J5dGVzOyArK2spIHsNCisgICAgaWYgKGsgJSAyID09IDApIHsNCisgICAgICBiaXRzLT5BcHBlbmRCaXRzKDB4ZWMsIDgsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJpdHMtPkFwcGVuZEJpdHMoMHgxMSwgOCwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgIH0NCisgIGlmIChiaXRzLT5TaXplKCkgIT0gY2FwYWNpdHkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQml0c05vdEVxdWFsQ2FjaXR5Ow0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCit9DQoraW50MzJfdCBDQkNfUVJDb2RlckVuY29kZXI6OkNob29zZU1hc2tQYXR0ZXJuKA0KKyAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgaW50MzJfdCB2ZXJzaW9uLA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IG1pblBlbmFsdHkgPSA2NTUzNTsNCisgIGludDMyX3QgYmVzdE1hc2tQYXR0ZXJuID0gLTE7DQorICBmb3IgKGludDMyX3QgbWFza1BhdHRlcm4gPSAwOyBtYXNrUGF0dGVybiA8IENCQ19RUkNvZGVyOjpOVU1fTUFTS19QQVRURVJOUzsNCisgICAgICAgbWFza1BhdHRlcm4rKykgew0KKyAgICBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkJ1aWxkTWF0cml4KGJpdHMsIGVjTGV2ZWwsIHZlcnNpb24sIG1hc2tQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgaW50MzJfdCBwZW5hbHR5ID0gQ2FsY3VsYXRlTWFza1BlbmFsdHkobWF0cml4KTsNCisgICAgaWYgKHBlbmFsdHkgPCBtaW5QZW5hbHR5KSB7DQorICAgICAgbWluUGVuYWx0eSA9IHBlbmFsdHk7DQorICAgICAgYmVzdE1hc2tQYXR0ZXJuID0gbWFza1BhdHRlcm47DQorICAgIH0NCisgIH0NCisgIHJldHVybiBiZXN0TWFza1BhdHRlcm47DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJFbmNvZGVyOjpDYWxjdWxhdGVNYXNrUGVuYWx0eShDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KSB7DQorICBpbnQzMl90IHBlbmFsdHkgPSAwOw0KKyAgcGVuYWx0eSArPSBDQkNfUVJDb2Rlck1hc2tVdGlsOjpBcHBseU1hc2tQZW5hbHR5UnVsZTEobWF0cml4KTsNCisgIHBlbmFsdHkgKz0gQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUyKG1hdHJpeCk7DQorICBwZW5hbHR5ICs9IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMyhtYXRyaXgpOw0KKyAgcGVuYWx0eSArPSBDQkNfUVJDb2Rlck1hc2tVdGlsOjpBcHBseU1hc2tQZW5hbHR5UnVsZTQobWF0cml4KTsNCisgIHJldHVybiBwZW5hbHR5Ow0KK30NCitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyRW5jb2Rlcjo6Q2hvb3NlTW9kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZykgew0KKyAgaWYgKGVuY29kaW5nLkNvbXBhcmUoIlNISUZUX0pJUyIpID09IDApIHsNCisgICAgcmV0dXJuIENCQ19RUkNvZGVyTW9kZTo6c0tBTkpJOw0KKyAgfQ0KKyAgRlhfQk9PTCBoYXNOdW1lcmljID0gRkFMU0U7DQorICBGWF9CT09MIGhhc0FscGhhTnVtZXJpYyA9IEZBTFNFOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudC5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIGlmIChpc2RpZ2l0KCh1aW50OF90KWNvbnRlbnRbaV0pKSB7DQorICAgICAgaGFzTnVtZXJpYyA9IFRSVUU7DQorICAgIH0gZWxzZSBpZiAoR2V0QWxwaGFOdW1lcmljQ29kZSgodWludDhfdCljb250ZW50W2ldKSAhPSAtMSkgew0KKyAgICAgIGhhc0FscGhhTnVtZXJpYyA9IFRSVUU7DQorICAgIH0gZWxzZSB7DQorICAgICAgcmV0dXJuIENCQ19RUkNvZGVyTW9kZTo6c0JZVEU7DQorICAgIH0NCisgIH0NCisgIGlmIChoYXNBbHBoYU51bWVyaWMpIHsNCisgICAgcmV0dXJuIENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQzsNCisgIH0gZWxzZSBpZiAoaGFzTnVtZXJpYykgew0KKyAgICByZXR1cm4gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQzsNCisgIH0NCisgIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyRW5jb2Rlcjo6R2V0QWxwaGFOdW1lcmljQ29kZShpbnQzMl90IGNvZGUpIHsNCisgIGlmIChjb2RlIDwgOTYgJiYgY29kZSA+PSAwKSB7DQorICAgIHJldHVybiBtX2FscGhhTnVtYmVyaWNUYWJsZVtjb2RlXTsNCisgIH0NCisgIHJldHVybiAtMTsNCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZEJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQykgew0KKyAgICBBcHBlbmROdW1lcmljQnl0ZXMoY29udGVudCwgYml0cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfSBlbHNlIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykgew0KKyAgICBBcHBlbmRBbHBoYU51bWVyaWNCeXRlcyhjb250ZW50LCBiaXRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9IGVsc2UgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgew0KKyAgICBBcHBlbmQ4Qml0Qnl0ZXMoY29udGVudCwgYml0cywgZW5jb2RpbmcsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0gZWxzZSBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNLQU5KSSkgew0KKyAgICBBcHBlbmRLYW5qaUJ5dGVzKGNvbnRlbnQsIGJpdHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0gZWxzZSBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNHQkspIHsNCisgICAgQXBwZW5kR0JLQnl0ZXMoY29udGVudCwgYml0cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfSBlbHNlIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uVW5zdXBwb3J0ZWRNb2RlOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZE51bWVyaWNCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBsZW5ndGggPSBjb250ZW50LkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQorICAgIGludDMyX3QgbnVtMSA9IGNvbnRlbnRbaV0gLSAnMCc7DQorICAgIGlmIChpICsgMiA8IGxlbmd0aCkgew0KKyAgICAgIGludDMyX3QgbnVtMiA9IGNvbnRlbnRbaSArIDFdIC0gJzAnOw0KKyAgICAgIGludDMyX3QgbnVtMyA9IGNvbnRlbnRbaSArIDJdIC0gJzAnOw0KKyAgICAgIGJpdHMtPkFwcGVuZEJpdHMobnVtMSAqIDEwMCArIG51bTIgKiAxMCArIG51bTMsIDEwLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKSBpICs9IDM7DQorICAgIH0gZWxzZSBpZiAoaSArIDEgPCBsZW5ndGgpIHsNCisgICAgICBpbnQzMl90IG51bTIgPSBjb250ZW50W2kgKyAxXSAtICcwJzsNCisgICAgICBiaXRzLT5BcHBlbmRCaXRzKG51bTEgKiAxMCArIG51bTIsIDcsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpIGkgKz0gMjsNCisgICAgfSBlbHNlIHsNCisgICAgICBiaXRzLT5BcHBlbmRCaXRzKG51bTEsIDQsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIGkrKzsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kQWxwaGFOdW1lcmljQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGxlbmd0aCA9IGNvbnRlbnQuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgd2hpbGUgKGkgPCBsZW5ndGgpIHsNCisgICAgaW50MzJfdCBjb2RlMSA9IEdldEFscGhhTnVtZXJpY0NvZGUoY29udGVudFtpXSk7DQorICAgIGlmIChjb2RlMSA9PSAtMSkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVDaGFyYWN0ZXI7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7DQorICAgICAgaW50MzJfdCBjb2RlMiA9IEdldEFscGhhTnVtZXJpY0NvZGUoY29udGVudFtpICsgMV0pOw0KKyAgICAgIGlmIChjb2RlMiA9PSAtMSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlcjsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIH0NCisgICAgICBiaXRzLT5BcHBlbmRCaXRzKGNvZGUxICogNDUgKyBjb2RlMiwgMTEsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIGkgKz0gMjsNCisgICAgfSBlbHNlIHsNCisgICAgICBiaXRzLT5BcHBlbmRCaXRzKGNvZGUxLCA2LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKSBpKys7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZEdCS0J5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBsZW5ndGggPSBjb250ZW50LkdldExlbmd0aCgpOw0KKyAgRlhfRFdPUkQgdmFsdWUgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHsNCisgICAgdmFsdWUgPSAoRlhfRFdPUkQpKCh1aW50OF90KWNvbnRlbnRbaV0gPDwgOCB8ICh1aW50OF90KWNvbnRlbnRbaSArIDFdKTsNCisgICAgaWYgKHZhbHVlIDw9IDB4QUFGRSAmJiB2YWx1ZSA+PSAweEExQTEpIHsNCisgICAgICB2YWx1ZSAtPSAweEExQTE7DQorICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMHhGQUZFICYmIHZhbHVlID49IDB4QjBBMSkgew0KKyAgICAgIHZhbHVlIC09IDB4QTZBMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlQ2hhcmFjdGVyOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIHZhbHVlID0gKEZYX0RXT1JEKSgodmFsdWUgPj4gOCkgKiAweDYwKSArIChGWF9EV09SRCkodmFsdWUgJiAweGZmKTsNCisgICAgYml0cy0+QXBwZW5kQml0cyh2YWx1ZSwgMTMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZDhCaXRCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50LkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgYml0cy0+QXBwZW5kQml0cyhjb250ZW50W2ldLCA4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmQ4Qml0Qnl0ZXMoQ0ZYX0J5dGVBcnJheSYgYnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJ5dGVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIGJpdHMtPkFwcGVuZEJpdHMoYnl0ZXNbaV0sIDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZEthbmppQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVBcnJheSBieXRlczsNCisgIEZYX0RXT1JEIHZhbHVlID0gMCwgaCA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBieXRlcy5HZXRTaXplKCk7IGkgKz0gMikgew0KKyAgICB2YWx1ZSA9IChGWF9EV09SRCkoKHVpbnQ4X3QpKGNvbnRlbnRbaV0gPDwgOCkgfCAodWludDhfdCljb250ZW50W2kgKyAxXSk7DQorICAgIGlmICh2YWx1ZSA8PSAweDlmZmMgJiYgdmFsdWUgPj0gMHg4MTQwKSB7DQorICAgICAgdmFsdWUgLT0gMHg4MTQwOw0KKyAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDB4ZWJiZiAmJiB2YWx1ZSA+PSAweGUwNDApIHsNCisgICAgICB2YWx1ZSAtPSAweGMxNDA7DQorICAgIH0gZWxzZSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlcjsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICB2YWx1ZSA9IChGWF9EV09SRCkoKHZhbHVlID4+IDgpICogMHhjMCkgKyAoRlhfRFdPUkQpKHZhbHVlICYgMHhmZik7DQorICAgIGJpdHMtPkFwcGVuZEJpdHModmFsdWUsIDEzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpJbml0UVJDb2RlKGludDMyX3QgbnVtSW5wdXRCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZSogbW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlciogcXJDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIHFyQ29kZS0+U2V0RUNMZXZlbChlY0xldmVsKTsNCisgIHFyQ29kZS0+U2V0TW9kZShtb2RlKTsNCisgIGZvciAoaW50MzJfdCB2ZXJzaW9uTnVtID0gMTsgdmVyc2lvbk51bSA8PSA0MDsgdmVyc2lvbk51bSsrKSB7DQorICAgIENCQ19RUkNvZGVyVmVyc2lvbiogdmVyc2lvbiA9DQorICAgICAgICBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbk51bSwgZSk7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KICAgICBpbnQzMl90IG51bUJ5dGVzID0gdmVyc2lvbi0+R2V0VG90YWxDb2RlV29yZHMoKTsNCiAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3MgPSB2ZXJzaW9uLT5HZXRFQ0Jsb2Nrc0ZvckxldmVsKGVjTGV2ZWwpOw0KICAgICBpbnQzMl90IG51bUVjQnl0ZXMgPSBlY0Jsb2Nrcy0+R2V0VG90YWxFQ0NvZGVXb3JkcygpOw0KICAgICBpbnQzMl90IG51bVJTQmxvY2tzID0gZWNCbG9ja3MtPkdldE51bUJsb2NrcygpOw0KICAgICBpbnQzMl90IG51bURhdGFCeXRlcyA9IG51bUJ5dGVzIC0gbnVtRWNCeXRlczsNCi0gICAgaWYobnVtRGF0YUJ5dGVzID49IG51bUlucHV0Qnl0ZXMgKyAzKSB7DQotICAgICAgICBxckNvZGUtPlNldFZlcnNpb24odmVyc2lvbk51bWJlcik7DQotICAgICAgICBxckNvZGUtPlNldE51bVRvdGFsQnl0ZXMobnVtQnl0ZXMpOw0KLSAgICAgICAgcXJDb2RlLT5TZXROdW1EYXRhQnl0ZXMobnVtRGF0YUJ5dGVzKTsNCi0gICAgICAgIHFyQ29kZS0+U2V0TnVtUlNCbG9ja3MobnVtUlNCbG9ja3MpOw0KLSAgICAgICAgcXJDb2RlLT5TZXROdW1FQ0J5dGVzKG51bUVjQnl0ZXMpOw0KLSAgICAgICAgcXJDb2RlLT5TZXRNYXRyaXhXaWR0aCh2ZXJzaW9uLT5HZXREaW1lbnNpb25Gb3JWZXJzaW9uKCkpOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgICBpZiAobnVtRGF0YUJ5dGVzID49IG51bUlucHV0Qnl0ZXMgKyAzKSB7DQorICAgICAgcXJDb2RlLT5TZXRWZXJzaW9uKHZlcnNpb25OdW0pOw0KKyAgICAgIHFyQ29kZS0+U2V0TnVtVG90YWxCeXRlcyhudW1CeXRlcyk7DQorICAgICAgcXJDb2RlLT5TZXROdW1EYXRhQnl0ZXMobnVtRGF0YUJ5dGVzKTsNCisgICAgICBxckNvZGUtPlNldE51bVJTQmxvY2tzKG51bVJTQmxvY2tzKTsNCisgICAgICBxckNvZGUtPlNldE51bUVDQnl0ZXMobnVtRWNCeXRlcyk7DQorICAgICAgcXJDb2RlLT5TZXRNYXRyaXhXaWR0aCh2ZXJzaW9uLT5HZXREaW1lbnNpb25Gb3JWZXJzaW9uKCkpOw0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KLSAgICBlID0gQkNFeGNlcHRpb25DYW5ub3RGaW5kQmxvY2tJbmZvOw0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uQ2Fubm90RmluZEJsb2NrSW5mbzsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kTW9kZUluZm8oQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgYml0cy0+QXBwZW5kQml0cyhtb2RlLT5HZXRCaXRzKCksIDQsIGUpOw0KKyAgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKSB7DQorICAgIGJpdHMtPkFwcGVuZEJpdHMoMSwgNCwgZSk7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KIH0NCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6RW5jb2RlV2l0aFNwZWNpZnlWZXJzaW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KLSAgICAgICAgQ0JDX1FSQ29kZXIgKnFyQ29kZSwgaW50MzJfdCB2ZXJzaW9uU3BlY2lmeSwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nID0gInV0ZjgiOw0KLSAgICBDQkNfUVJDb2Rlck1vZGUgKm1vZGUgPSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFOw0KLSAgICBDRlhfUHRyQXJyYXkgc3BsaXRSZXN1bHQ7DQotICAgIENCQ19RUkNvZGVyQml0VmVjdG9yIGRhdGFCaXRzOw0KLSAgICBkYXRhQml0cy5Jbml0KCk7DQotICAgIFNwbGl0U3RyaW5nKGNvbnRlbnQsIHNwbGl0UmVzdWx0KTsNCi0gICAgTWVyZ2VTdHJpbmcoc3BsaXRSZXN1bHQsIHZlcnNpb25TcGVjaWZ5LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCi0gICAgQ0JDX1FSQ29kZXJNb2RlICp0ZW1wTW9kZSA9IE5VTEw7DQotICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIEFwcGVuZEJ5dGVzKCgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fc3RyaW5nLCAoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX21vZGUsICZkYXRhQml0cywgZW5jb2RpbmcsIGUpOw0KLSAgICAgICAgaWYoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IHkrKykgew0KLSAgICAgICAgICAgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbeV07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHNwbGl0UmVzdWx0LlJlbW92ZUFsbCgpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpbnQzMl90IG51bUlucHV0Qnl0ZXMgPSBkYXRhQml0cy5zaXplSW5CeXRlcygpOw0KLSAgICBDQkNfUVJDb2RlckJpdFZlY3RvciBoZWFkZXJBbmREYXRhQml0czsNCi0gICAgaGVhZGVyQW5kRGF0YUJpdHMuSW5pdCgpOw0KLSAgICBJbml0UVJDb2RlKG51bUlucHV0Qnl0ZXMsIHZlcnNpb25TcGVjaWZ5LCBlY0xldmVsLCBtb2RlLCBxckNvZGUsIGUpOw0KLSAgICBpZihlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIGZvcihpbnQzMl90IGsgPSAwOyBrIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBrKyspIHsNCi0gICAgICAgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRba107DQotICAgICAgICB9DQotICAgICAgICBzcGxpdFJlc3VsdC5SZW1vdmVBbGwoKTsNCi0gICAgICAgIHJldHVybiA7DQotICAgIH0NCi0gICAgQXBwZW5kRGF0YU1vZGVMZW5naEluZm8oc3BsaXRSZXN1bHQsIGhlYWRlckFuZERhdGFCaXRzLCB0ZW1wTW9kZSwgcXJDb2RlLCBlbmNvZGluZywgZSk7DQotICAgIGlmKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgZm9yKGludDMyX3QgayA9IDA7IGsgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGsrKykgew0KLSAgICAgICAgICAgIGRlbGV0ZSAoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtrXTsNCi0gICAgICAgIH0NCi0gICAgICAgIHNwbGl0UmVzdWx0LlJlbW92ZUFsbCgpOw0KLSAgICAgICAgcmV0dXJuIDsNCi0gICAgfQ0KLSAgICBudW1JbnB1dEJ5dGVzID0gaGVhZGVyQW5kRGF0YUJpdHMuc2l6ZUluQnl0ZXMoKTsNCi0gICAgVGVybWluYXRlQml0cyhxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KLSAgICBpZihlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIGZvcihpbnQzMl90IGsgPSAwOyBrIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBrKyspIHsNCi0gICAgICAgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRba107DQotICAgICAgICB9DQotICAgICAgICBzcGxpdFJlc3VsdC5SZW1vdmVBbGwoKTsNCi0gICAgICAgIHJldHVybiA7DQotICAgIH0NCi0gICAgZm9yKGludDMyX3QgaiA9IDA7IGogPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGorKykgew0KLSAgICAgICAgZGVsZXRlIChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2pdOw0KLSAgICB9DQotICAgIHNwbGl0UmVzdWx0LlJlbW92ZUFsbCgpOw0KLSAgICBDQkNfUVJDb2RlckJpdFZlY3RvciBmaW5hbEJpdHMgOw0KLSAgICBmaW5hbEJpdHMuSW5pdCgpOw0KLSAgICBJbnRlcmxlYXZlV2l0aEVDQnl0ZXMoJmhlYWRlckFuZERhdGFCaXRzLCBxckNvZGUtPkdldE51bVRvdGFsQnl0ZXMoKSwgcXJDb2RlLT5HZXROdW1EYXRhQnl0ZXMoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0TnVtUlNCbG9ja3MoKSwgJmZpbmFsQml0cywgZSk7DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZExlbmd0aEluZm8oaW50MzJfdCBudW1MZXR0ZXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGludDMyX3QgbnVtQml0cyA9IG1vZGUtPkdldENoYXJhY3RlckNvdW50Qml0cyhxY3YsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBpZiAobnVtQml0cyA+ICgoMSA8PCBudW1CaXRzKSAtIDEpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykgew0KKyAgICBiaXRzLT5BcHBlbmRCaXRzKG51bUxldHRlcnMgLyAyLCBudW1CaXRzLCBlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBwRGVjb2RlciA9IEZYX05FVyBDQkNfQ29tbW9uQnl0ZU1hdHJpeChxckNvZGUtPkdldE1hdHJpeFdpZHRoKCksIHFyQ29kZS0+R2V0TWF0cml4V2lkdGgoKSk7DQotICAgIHBEZWNvZGVyLT5Jbml0KCk7DQotICAgIENCQ19BdXRvUHRyPENCQ19Db21tb25CeXRlTWF0cml4PiBtYXRyaXgocERlY29kZXIpOw0KLSAgICBpbnQzMl90IG1hc2tQYXR0ZXJuID0gQ2hvb3NlTWFza1BhdHRlcm4oJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksIHFyQ29kZS0+R2V0VmVyc2lvbigpLCBtYXRyaXguZ2V0KCksIGUpOw0KKyAgfQ0KKyAgYml0cy0+QXBwZW5kQml0cyhudW1MZXR0ZXJzLCBudW1CaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6SW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Ub3RhbEJ5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1EYXRhQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVJTQmxvY2tzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChiaXRzLT5zaXplSW5CeXRlcygpICE9IG51bURhdGFCeXRlcykgew0KKyAgICBlID0gQkNFeGNlcHRpb25CaXRzQnl0ZXNOb3RNYXRjaDsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIHFyQ29kZS0+U2V0TWFza1BhdHRlcm4obWFza1BhdHRlcm4pOw0KLSAgICBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkJ1aWxkTWF0cml4KCZmaW5hbEJpdHMsIHFyQ29kZS0+R2V0RUNMZXZlbCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwgcXJDb2RlLT5HZXRNYXNrUGF0dGVybigpLCBtYXRyaXguZ2V0KCksIGUpOw0KKyAgfQ0KKyAgaW50MzJfdCBkYXRhQnl0ZXNPZmZzZXQgPSAwOw0KKyAgaW50MzJfdCBtYXhOdW1EYXRhQnl0ZXMgPSAwOw0KKyAgaW50MzJfdCBtYXhOdW1FY0J5dGVzID0gMDsNCisgIENGWF9QdHJBcnJheSBibG9ja3M7DQorICBpbnQzMl90IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgbnVtUlNCbG9ja3M7IGkrKykgew0KKyAgICBpbnQzMl90IG51bURhdGFCeXRlc0luQmxvY2s7DQorICAgIGludDMyX3QgbnVtRWNCeXRlc0luQmxvc2s7DQorICAgIEdldE51bURhdGFCeXRlc0FuZE51bUVDQnl0ZXNGb3JCbG9ja0lEKG51bVRvdGFsQnl0ZXMsIG51bURhdGFCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUlNCbG9ja3MsIGksIG51bURhdGFCeXRlc0luQmxvY2ssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUVjQnl0ZXNJbkJsb3NrKTsNCisgICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZGF0YUJ5dGVzID0gRlhfTkVXIENCQ19Db21tb25CeXRlQXJyYXk7DQorICAgIGRhdGFCeXRlcy0+U2V0KGJpdHMtPkdldEFycmF5KCksIGRhdGFCeXRlc09mZnNldCwgbnVtRGF0YUJ5dGVzSW5CbG9jayk7DQorICAgIENCQ19Db21tb25CeXRlQXJyYXkqIGVjQnl0ZXMgPQ0KKyAgICAgICAgR2VuZXJhdGVFQ0J5dGVzKGRhdGFCeXRlcywgbnVtRWNCeXRlc0luQmxvc2ssIGUpOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgcXJDb2RlLT5TZXRNYXRyaXgobWF0cml4LnJlbGVhc2UoKSk7DQotICAgIGlmKCFxckNvZGUtPklzVmFsaWQoKSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZFFSQ29kZTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGVXaXRoQXV0b1ZlcnNpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnQsIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIENCQ19RUkNvZGVyICpxckNvZGUsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZyA9ICJ1dGY4IjsNCi0gICAgQ0JDX1FSQ29kZXJNb2RlICptb2RlID0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsNCi0gICAgQ0ZYX1B0ckFycmF5IHNwbGl0UmVzdWx0Ow0KLSAgICBDQkNfUVJDb2RlckJpdFZlY3RvciBkYXRhQml0czsNCi0gICAgZGF0YUJpdHMuSW5pdCgpOw0KLSAgICBTcGxpdFN0cmluZyhjb250ZW50LCBzcGxpdFJlc3VsdCk7DQotICAgIE1lcmdlU3RyaW5nKHNwbGl0UmVzdWx0LCA4LCBlKTsNCisgICAgYmxvY2tzLkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJCbG9ja1BhaXIoZGF0YUJ5dGVzLCBlY0J5dGVzKSk7DQorICAgIG1heE51bURhdGFCeXRlcyA9IEZYX01BWChtYXhOdW1EYXRhQnl0ZXMsIGRhdGFCeXRlcy0+U2l6ZSgpKTsNCisgICAgbWF4TnVtRWNCeXRlcyA9IEZYX01BWChtYXhOdW1FY0J5dGVzLCBlY0J5dGVzLT5TaXplKCkpOw0KKyAgICBkYXRhQnl0ZXNPZmZzZXQgKz0gbnVtRGF0YUJ5dGVzSW5CbG9jazsNCisgIH0NCisgIGlmIChudW1EYXRhQnl0ZXMgIT0gZGF0YUJ5dGVzT2Zmc2V0KSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkJ5dGVzTm90TWF0Y2hPZmZzZXQ7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBDQkNfUVJDb2Rlck1vZGUgKnRlbXBNb2RlID0gTlVMTDsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgQXBwZW5kQnl0ZXMoKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcsICgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fbW9kZSwgJmRhdGFCaXRzLCBlbmNvZGluZywgZSk7DQotICAgICAgICBpZihlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgICAgICBmb3IoaW50MzJfdCBsID0gMDsgbCA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgbCsrKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSAoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtsXTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbWF4TnVtRGF0YUJ5dGVzOyB4KyspIHsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgYmxvY2tzLkdldFNpemUoKTsgaisrKSB7DQorICAgICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZGF0YUJ5dGVzID0NCisgICAgICAgICAgKChDQkNfUVJDb2RlckJsb2NrUGFpciopYmxvY2tzW2pdKS0+R2V0RGF0YUJ5dGVzKCk7DQorICAgICAgaWYgKHggPCBkYXRhQnl0ZXMtPlNpemUoKSkgew0KKyAgICAgICAgcmVzdWx0LT5BcHBlbmRCaXRzKGRhdGFCeXRlcy0+QXQoeCksIDgsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgfQ0KICAgICB9DQotICAgIGludDMyX3QgbnVtSW5wdXRCeXRlcyA9IGRhdGFCaXRzLnNpemVJbkJ5dGVzKCk7DQotICAgIEluaXRRUkNvZGUobnVtSW5wdXRCeXRlcywgZWNMZXZlbCwgbW9kZSwgcXJDb2RlLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCi0gICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgaGVhZGVyQW5kRGF0YUJpdHM7DQotICAgIGhlYWRlckFuZERhdGFCaXRzLkluaXQoKTsNCi0gICAgdGVtcE1vZGUgPSBOVUxMOw0KLSAgICBpbnQzMl90IHZlcnNpb25OdW0gPSBxckNvZGUtPkdldFZlcnNpb24oKTsNCi1zaWduOg0KLSAgICBBcHBlbmREYXRhTW9kZUxlbmdoSW5mbyhzcGxpdFJlc3VsdCwgaGVhZGVyQW5kRGF0YUJpdHMsIHRlbXBNb2RlLCBxckNvZGUsIGVuY29kaW5nLCBlKTsNCi0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KLSAgICAgICAgZ290byBjYXRjaEV4Y2VwdGlvbjsNCisgIH0NCisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1heE51bUVjQnl0ZXM7IHkrKykgew0KKyAgICBmb3IgKGludDMyX3QgbCA9IDA7IGwgPCBibG9ja3MuR2V0U2l6ZSgpOyBsKyspIHsNCisgICAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBlY0J5dGVzID0NCisgICAgICAgICAgKChDQkNfUVJDb2RlckJsb2NrUGFpciopYmxvY2tzW2xdKS0+R2V0RXJyb3JDb3JyZWN0aW9uQnl0ZXMoKTsNCisgICAgICBpZiAoeSA8IGVjQnl0ZXMtPlNpemUoKSkgew0KKyAgICAgICAgcmVzdWx0LT5BcHBlbmRCaXRzKGVjQnl0ZXMtPkF0KHkpLCA4LCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBudW1JbnB1dEJ5dGVzID0gaGVhZGVyQW5kRGF0YUJpdHMuc2l6ZUluQnl0ZXMoKTsNCi0gICAgVGVybWluYXRlQml0cyhxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICBnb3RvIGNhdGNoRXhjZXB0aW9uOw0KLSAgICB9DQotY2F0Y2hFeGNlcHRpb246DQotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCi0gICAgICAgIGludDMyX3QgZTEgPSBCQ0V4Y2VwdGlvbk5POw0KLSAgICAgICAgSW5pdFFSQ29kZShudW1JbnB1dEJ5dGVzLCBlY0xldmVsLCBtb2RlLCBxckNvZGUsIGUxKTsNCi0gICAgICAgIGlmIChlMSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQotICAgICAgICAgICAgZSA9IGUxOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHZlcnNpb25OdW0rKzsNCi0gICAgICAgIGlmICh2ZXJzaW9uTnVtIDw9IDQwKSB7DQotICAgICAgICAgICAgaGVhZGVyQW5kRGF0YUJpdHMuQ2xlYXIoKTsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25OTzsNCi0gICAgICAgICAgICBnb3RvIHNpZ247DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSAoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtqXTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgaysrKSB7DQotICAgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRba107DQotICAgIH0NCi0gICAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQotICAgIENCQ19RUkNvZGVyQml0VmVjdG9yIGZpbmFsQml0cyA7DQotICAgIGZpbmFsQml0cy5Jbml0KCk7DQotICAgIEludGVybGVhdmVXaXRoRUNCeXRlcygmaGVhZGVyQW5kRGF0YUJpdHMsIHFyQ29kZS0+R2V0TnVtVG90YWxCeXRlcygpLCBxckNvZGUtPkdldE51bURhdGFCeXRlcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXROdW1SU0Jsb2NrcygpLCAmZmluYWxCaXRzLCBlKTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IGJsb2Nrcy5HZXRTaXplKCk7IGsrKykgew0KKyAgICBkZWxldGUgKENCQ19RUkNvZGVyQmxvY2tQYWlyKilibG9ja3Nba107DQorICB9DQorICBpZiAobnVtVG90YWxCeXRlcyAhPSByZXN1bHQtPnNpemVJbkJ5dGVzKCkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uU2l6ZUluQnl0ZXNEaWZmZXI7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogcERlY29kZXIgPSBGWF9ORVcgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgocXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpLCBxckNvZGUtPkdldE1hdHJpeFdpZHRoKCkpOw0KLSAgICBwRGVjb2Rlci0+SW5pdCgpOw0KLSAgICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQnl0ZU1hdHJpeD4gbWF0cml4KHBEZWNvZGVyKTsNCi0gICAgaW50MzJfdCBtYXNrUGF0dGVybiA9IENob29zZU1hc2tQYXR0ZXJuKCZmaW5hbEJpdHMsIHFyQ29kZS0+R2V0RUNMZXZlbCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwgbWF0cml4LmdldCgpLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIHFyQ29kZS0+U2V0TWFza1BhdHRlcm4obWFza1BhdHRlcm4pOw0KLSAgICBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkJ1aWxkTWF0cml4KCZmaW5hbEJpdHMsIHFyQ29kZS0+R2V0RUNMZXZlbCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwgcXJDb2RlLT5HZXRNYXNrUGF0dGVybigpLCBtYXRyaXguZ2V0KCksIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKQ0KLSAgICBxckNvZGUtPlNldE1hdHJpeChtYXRyaXgucmVsZWFzZSgpKTsNCi0gICAgaWYoIXFyQ29kZS0+SXNWYWxpZCgpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkUVJDb2RlOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCisgIH0NCiB9DQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgQ0JDX1FSQ29kZXIgKnFyQ29kZSwgaW50MzJfdCAmZSkNCi17DQotICAgIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nID0gInV0ZjgiOw0KLSAgICBDRlhfQnl0ZVN0cmluZyB1dGY4RGF0YTsNCi0gICAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVbmljb2RlVG9VVEY4KGNvbnRlbnQsIHV0ZjhEYXRhKTsNCi0gICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlID0gQ2hvb3NlTW9kZSh1dGY4RGF0YSwgZW5jb2RpbmcpOw0KLSAgICBDQkNfUVJDb2RlckJpdFZlY3RvciBkYXRhQml0czsNCi0gICAgZGF0YUJpdHMuSW5pdCgpOw0KLSAgICBBcHBlbmRCeXRlcyh1dGY4RGF0YSwgbW9kZSwgJmRhdGFCaXRzLCBlbmNvZGluZywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBpbnQzMl90IG51bUlucHV0Qnl0ZXMgPSBkYXRhQml0cy5zaXplSW5CeXRlcygpOw0KLSAgICBJbml0UVJDb2RlKG51bUlucHV0Qnl0ZXMsIGVjTGV2ZWwsIG1vZGUsIHFyQ29kZSwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBDQkNfUVJDb2RlckJpdFZlY3RvciBoZWFkZXJBbmREYXRhQml0czsNCi0gICAgaGVhZGVyQW5kRGF0YUJpdHMuSW5pdCgpOw0KLSAgICBBcHBlbmRNb2RlSW5mbyhtb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgaW50MzJfdCBudW1MZXR0ZXJzID0gbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFID8gZGF0YUJpdHMuc2l6ZUluQnl0ZXMoKSA6IGNvbnRlbnQuR2V0TGVuZ3RoKCk7DQotICAgIEFwcGVuZExlbmd0aEluZm8obnVtTGV0dGVycywgcXJDb2RlLT5HZXRWZXJzaW9uKCksIG1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBoZWFkZXJBbmREYXRhQml0cy5BcHBlbmRCaXRWZWN0b3IoJmRhdGFCaXRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCi0gICAgVGVybWluYXRlQml0cyhxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZmluYWxCaXRzIDsNCi0gICAgZmluYWxCaXRzLkluaXQoKTsNCi0gICAgSW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKCZoZWFkZXJBbmREYXRhQml0cywgcXJDb2RlLT5HZXROdW1Ub3RhbEJ5dGVzKCksIHFyQ29kZS0+R2V0TnVtRGF0YUJ5dGVzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE51bVJTQmxvY2tzKCksICZmaW5hbEJpdHMsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIHBEZWNvZGVyID0gRlhfTkVXIENCQ19Db21tb25CeXRlTWF0cml4KHFyQ29kZS0+R2V0TWF0cml4V2lkdGgoKSwgcXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpKTsNCi0gICAgcERlY29kZXItPkluaXQoKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJ5dGVNYXRyaXg+IG1hdHJpeChwRGVjb2Rlcik7DQotICAgIGludDMyX3QgbWFza1BhdHRlcm4gPSBDaG9vc2VNYXNrUGF0dGVybigmZmluYWxCaXRzLCBxckNvZGUtPkdldEVDTGV2ZWwoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIG1hdHJpeC5nZXQoKSwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBxckNvZGUtPlNldE1hc2tQYXR0ZXJuKG1hc2tQYXR0ZXJuKTsNCi0gICAgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpCdWlsZE1hdHJpeCgmZmluYWxCaXRzLCBxckNvZGUtPkdldEVDTGV2ZWwoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIHFyQ29kZS0+R2V0TWFza1BhdHRlcm4oKSwgbWF0cml4LmdldCgpLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCi0gICAgcXJDb2RlLT5TZXRNYXRyaXgobWF0cml4LnJlbGVhc2UoKSk7DQotICAgIGlmKCFxckNvZGUtPklzVmFsaWQoKSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZFFSQ29kZTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkdldE51bURhdGFCeXRlc0FuZE51bUVDQnl0ZXNGb3JCbG9ja0lEKA0KKyAgICBpbnQzMl90IG51bVRvdGFsQnl0ZXMsDQorICAgIGludDMyX3QgbnVtRGF0YUJ5dGVzLA0KKyAgICBpbnQzMl90IG51bVJTQmxvY2tzLA0KKyAgICBpbnQzMl90IGJsb2NrSUQsDQorICAgIGludDMyX3QmIG51bURhdGFCeXRlc0luQmxvY2ssDQorICAgIGludDMyX3QmIG51bUVDQnl0ZXNJbkJsb2NrKSB7DQorICBpZiAoYmxvY2tJRCA+PSBudW1SU0Jsb2Nrcykgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IG51bVJzQmxvY2tzSW5Hcm91cDIgPSBudW1Ub3RhbEJ5dGVzICUgbnVtUlNCbG9ja3M7DQorICBpbnQzMl90IG51bVJzQmxvY2tzSW5Hcm91cDEgPSBudW1SU0Jsb2NrcyAtIG51bVJzQmxvY2tzSW5Hcm91cDI7DQorICBpbnQzMl90IG51bVRvdGFsQnl0ZXNJbkdyb3VwMSA9IG51bVRvdGFsQnl0ZXMgLyBudW1SU0Jsb2NrczsNCisgIGludDMyX3QgbnVtVG90YWxCeXRlc0luR3JvdXAyID0gbnVtVG90YWxCeXRlc0luR3JvdXAxICsgMTsNCisgIGludDMyX3QgbnVtRGF0YUJ5dGVzSW5Hcm91cDEgPSBudW1EYXRhQnl0ZXMgLyBudW1SU0Jsb2NrczsNCisgIGludDMyX3QgbnVtRGF0YUJ5dGVzSW5Hcm91cDIgPSBudW1EYXRhQnl0ZXNJbkdyb3VwMSArIDE7DQorICBpbnQzMl90IG51bUVjQnl0ZXNJbkdyb3VwMSA9IG51bVRvdGFsQnl0ZXNJbkdyb3VwMSAtIG51bURhdGFCeXRlc0luR3JvdXAxOw0KKyAgaW50MzJfdCBudW1FY0J5dGVzSW5Hcm91cDIgPSBudW1Ub3RhbEJ5dGVzSW5Hcm91cDIgLSBudW1EYXRhQnl0ZXNJbkdyb3VwMjsNCisgIGlmIChibG9ja0lEIDwgbnVtUnNCbG9ja3NJbkdyb3VwMSkgew0KKyAgICBudW1EYXRhQnl0ZXNJbkJsb2NrID0gbnVtRGF0YUJ5dGVzSW5Hcm91cDE7DQorICAgIG51bUVDQnl0ZXNJbkJsb2NrID0gbnVtRWNCeXRlc0luR3JvdXAxOw0KKyAgfSBlbHNlIHsNCisgICAgbnVtRGF0YUJ5dGVzSW5CbG9jayA9IG51bURhdGFCeXRlc0luR3JvdXAyOw0KKyAgICBudW1FQ0J5dGVzSW5CbG9jayA9IG51bUVjQnl0ZXNJbkdyb3VwMjsNCisgIH0NCiB9DQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OlRlcm1pbmF0ZUJpdHMoaW50MzJfdCBudW1EYXRhQnl0ZXMsIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBjYXBhY2l0eSA9IG51bURhdGFCeXRlcyA8PCAzOw0KLSAgICBpZihiaXRzLT5TaXplKCkgPiBjYXBhY2l0eSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uRGF0YVRvb01hbnk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA0ICYmIGJpdHMtPlNpemUoKSA8IGNhcGFjaXR5OyArK2kpIHsNCi0gICAgICAgIGJpdHMtPkFwcGVuZEJpdCgwLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotICAgIGludDMyX3QgbnVtQml0c0luTGFzdEJ5dGUgPSBiaXRzLT5TaXplKCkgJSA4Ow0KLSAgICBpZiAobnVtQml0c0luTGFzdEJ5dGUgPiAwKSB7DQotICAgICAgICBpbnQzMl90IG51bVBhZGRpbmdCaXRzID0gOCAtIG51bUJpdHNJbkxhc3RCeXRlOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtUGFkZGluZ0JpdHM7ICsraikgew0KLSAgICAgICAgICAgIGJpdHMtPkFwcGVuZEJpdCgwLCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChiaXRzLT5TaXplKCkgJSA4ICE9IDApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoTXVzdEJlODsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotICAgIGludDMyX3QgbnVtUGFkZGluZ0J5dGVzID0gbnVtRGF0YUJ5dGVzIC0gYml0cy0+c2l6ZUluQnl0ZXMoKTsNCi0gICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbnVtUGFkZGluZ0J5dGVzOyArK2spIHsNCi0gICAgICAgIGlmIChrICUgMiA9PSAwKSB7DQotICAgICAgICAgICAgYml0cy0+QXBwZW5kQml0cygweGVjLCA4LCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgYml0cy0+QXBwZW5kQml0cygweDExLCA4LCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoYml0cy0+U2l6ZSgpICE9IGNhcGFjaXR5KSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25CaXRzTm90RXF1YWxDYWNpdHk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLX0NCi1pbnQzMl90IENCQ19RUkNvZGVyRW5jb2Rlcjo6Q2hvb3NlTWFza1BhdHRlcm4oQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIGludDMyX3QgdmVyc2lvbiwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgbWluUGVuYWx0eSA9IDY1NTM1Ow0KLSAgICBpbnQzMl90IGJlc3RNYXNrUGF0dGVybiA9IC0xOw0KLSAgICBmb3IoaW50MzJfdCBtYXNrUGF0dGVybiA9IDA7IG1hc2tQYXR0ZXJuIDwgQ0JDX1FSQ29kZXI6Ok5VTV9NQVNLX1BBVFRFUk5TOyBtYXNrUGF0dGVybisrKSB7DQotICAgICAgICBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkJ1aWxkTWF0cml4KGJpdHMsIGVjTGV2ZWwsIHZlcnNpb24sIG1hc2tQYXR0ZXJuLCBtYXRyaXgsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KLSAgICAgICAgaW50MzJfdCBwZW5hbHR5ID0gQ2FsY3VsYXRlTWFza1BlbmFsdHkobWF0cml4KTsNCi0gICAgICAgIGlmKHBlbmFsdHkgPCBtaW5QZW5hbHR5KSB7DQotICAgICAgICAgICAgbWluUGVuYWx0eSA9IHBlbmFsdHk7DQotICAgICAgICAgICAgYmVzdE1hc2tQYXR0ZXJuID0gbWFza1BhdHRlcm47DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGJlc3RNYXNrUGF0dGVybjsNCi19DQotaW50MzJfdCBDQkNfUVJDb2RlckVuY29kZXI6OkNhbGN1bGF0ZU1hc2tQZW5hbHR5KENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpDQotew0KLSAgICBpbnQzMl90IHBlbmFsdHkgPSAwOw0KLSAgICBwZW5hbHR5ICs9IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMShtYXRyaXgpOw0KLSAgICBwZW5hbHR5ICs9IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMihtYXRyaXgpOw0KLSAgICBwZW5hbHR5ICs9IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMyhtYXRyaXgpOw0KLSAgICBwZW5hbHR5ICs9IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlNChtYXRyaXgpOw0KLSAgICByZXR1cm4gcGVuYWx0eTsNCi19DQotQ0JDX1FSQ29kZXJNb2RlICpDQkNfUVJDb2RlckVuY29kZXI6OkNob29zZU1vZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnQsIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nKQ0KLXsNCi0gICAgaWYoZW5jb2RpbmcuQ29tcGFyZSgiU0hJRlRfSklTIikgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIENCQ19RUkNvZGVyTW9kZTo6c0tBTkpJOw0KLSAgICB9DQotICAgIEZYX0JPT0wgaGFzTnVtZXJpYyA9IEZBTFNFOw0KLSAgICBGWF9CT09MIGhhc0FscGhhTnVtZXJpYyA9IEZBTFNFOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnQuR2V0TGVuZ3RoKCk7IGkrKykgew0KLSAgICAgICAgaWYoaXNkaWdpdCgodWludDhfdCljb250ZW50W2ldKSkgew0KLSAgICAgICAgICAgIGhhc051bWVyaWMgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIGlmKEdldEFscGhhTnVtZXJpY0NvZGUoKHVpbnQ4X3QpY29udGVudFtpXSkgIT0gLTEpIHsNCi0gICAgICAgICAgICBoYXNBbHBoYU51bWVyaWMgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZihoYXNBbHBoYU51bWVyaWMpIHsNCi0gICAgICAgIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUM7DQotICAgIH0gZWxzZSBpZihoYXNOdW1lcmljKSB7DQotICAgICAgICByZXR1cm4gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQzsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsNCi19DQotaW50MzJfdCBDQkNfUVJDb2RlckVuY29kZXI6OkdldEFscGhhTnVtZXJpY0NvZGUoaW50MzJfdCBjb2RlKQ0KLXsNCi0gICAgaWYoY29kZSA8IDk2ICYmIGNvZGUgPj0gMCkgew0KLSAgICAgICAgcmV0dXJuIG1fYWxwaGFOdW1iZXJpY1RhYmxlW2NvZGVdOw0KLSAgICB9DQotICAgIHJldHVybiAtMTsNCi19DQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZEJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZywgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQykgew0KLSAgICAgICAgQXBwZW5kTnVtZXJpY0J5dGVzKGNvbnRlbnQsIGJpdHMsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0gZWxzZSBpZihtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykgew0KLSAgICAgICAgQXBwZW5kQWxwaGFOdW1lcmljQnl0ZXMoY29udGVudCwgYml0cywgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfSBlbHNlIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgew0KLSAgICAgICAgQXBwZW5kOEJpdEJ5dGVzKGNvbnRlbnQsIGJpdHMsIGVuY29kaW5nLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9IGVsc2UgaWYobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNLQU5KSSkgew0KLSAgICAgICAgQXBwZW5kS2FuamlCeXRlcyhjb250ZW50LCBiaXRzLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9IGVsc2UgaWYobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNHQkspIHsNCi0gICAgICAgIEFwcGVuZEdCS0J5dGVzKGNvbnRlbnQsIGJpdHMsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25VbnN1cHBvcnRlZE1vZGU7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLX0NCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kTnVtZXJpY0J5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgbGVuZ3RoID0gY29udGVudC5HZXRMZW5ndGgoKTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgd2hpbGUoaSA8IGxlbmd0aCkgew0KLSAgICAgICAgaW50MzJfdCBudW0xID0gY29udGVudFtpXSAtICcwJzsNCi0gICAgICAgIGlmKGkgKyAyIDwgbGVuZ3RoKSB7DQotICAgICAgICAgICAgaW50MzJfdCBudW0yID0gY29udGVudFtpICsgMV0gLSAnMCc7DQotICAgICAgICAgICAgaW50MzJfdCBudW0zID0gY29udGVudFtpICsgMl0gLSAnMCc7DQotICAgICAgICAgICAgYml0cy0+QXBwZW5kQml0cyhudW0xICogMTAwICsgbnVtMiAqIDEwICsgbnVtMywgMTAsIGUpOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpDQotICAgICAgICAgICAgaSArPSAzOw0KLSAgICAgICAgfSBlbHNlIGlmKGkgKyAxIDwgbGVuZ3RoKSB7DQotICAgICAgICAgICAgaW50MzJfdCBudW0yID0gY29udGVudFtpICsgMV0gLSAnMCc7DQotICAgICAgICAgICAgYml0cy0+QXBwZW5kQml0cyhudW0xICogMTAgKyBudW0yLCA3LCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKQ0KLSAgICAgICAgICAgIGkgKz0gMjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgYml0cy0+QXBwZW5kQml0cyhudW0xLCA0LCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZEFscGhhTnVtZXJpY0J5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgbGVuZ3RoID0gY29udGVudC5HZXRMZW5ndGgoKTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgd2hpbGUoaSA8IGxlbmd0aCkgew0KLSAgICAgICAgaW50MzJfdCBjb2RlMSA9IEdldEFscGhhTnVtZXJpY0NvZGUoY29udGVudFtpXSk7DQotICAgICAgICBpZihjb2RlMSA9PSAtMSkgew0KLSAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVDaGFyYWN0ZXI7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICB9DQotICAgICAgICBpZihpICsgMSA8IGxlbmd0aCkgew0KLSAgICAgICAgICAgIGludDMyX3QgY29kZTIgPSBHZXRBbHBoYU51bWVyaWNDb2RlKGNvbnRlbnRbaSArIDFdKTsNCi0gICAgICAgICAgICBpZihjb2RlMiA9PSAtMSkgew0KLSAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlQ2hhcmFjdGVyOw0KLSAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYml0cy0+QXBwZW5kQml0cyhjb2RlMSAqIDQ1ICsgY29kZTIsIDExLCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgICAgICBpICs9IDI7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGJpdHMtPkFwcGVuZEJpdHMoY29kZTEsIDYsIGUpOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpDQotICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRHQktCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIGludDMyX3QgJmUpDQotew0KLSAgICBpbnQzMl90IGxlbmd0aCA9IGNvbnRlbnQuR2V0TGVuZ3RoKCk7DQotICAgIEZYX0RXT1JEIHZhbHVlID0gMDsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMikgew0KLSAgICAgICAgdmFsdWUgPSAoRlhfRFdPUkQpKCh1aW50OF90KWNvbnRlbnRbaV0gPDwgOCB8ICh1aW50OF90KWNvbnRlbnRbaSArIDFdKTsNCi0gICAgICAgIGlmKHZhbHVlIDw9IDB4QUFGRSAmJiB2YWx1ZSA+PSAweEExQTEpIHsNCi0gICAgICAgICAgICB2YWx1ZSAtPSAweEExQTE7DQotICAgICAgICB9IGVsc2UgaWYodmFsdWUgPD0gMHhGQUZFICYmIHZhbHVlID49IDB4QjBBMSkgew0KLSAgICAgICAgICAgIHZhbHVlIC09IDB4QTZBMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlcjsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHZhbHVlID0gKEZYX0RXT1JEKSgodmFsdWUgPj4gOCApICogMHg2MCkgKyAoRlhfRFdPUkQpKHZhbHVlICYgMHhmZik7DQotICAgICAgICBiaXRzLT5BcHBlbmRCaXRzKHZhbHVlLCAxMywgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLX0NCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kOEJpdEJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcsIGludDMyX3QgJmUpDQotew0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnQuR2V0TGVuZ3RoKCk7IGkrKykgew0KLSAgICAgICAgYml0cy0+QXBwZW5kQml0cyhjb250ZW50W2ldLCA4LCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmQ4Qml0Qnl0ZXMoQ0ZYX0J5dGVBcnJheSAmYnl0ZXMsIENCQ19RUkNvZGVyQml0VmVjdG9yICpiaXRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBieXRlcy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgYml0cy0+QXBwZW5kQml0cyhieXRlc1tpXSwgOCwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLX0NCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kS2FuamlCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIGludDMyX3QgJmUpDQotew0KLSAgICBDRlhfQnl0ZUFycmF5IGJ5dGVzOw0KLSAgICBGWF9EV09SRCB2YWx1ZSA9IDAsIGggPSAwOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGJ5dGVzLkdldFNpemUoKTsgaSArPSAyKSB7DQotICAgICAgICB2YWx1ZSA9IChGWF9EV09SRCkoKHVpbnQ4X3QpKGNvbnRlbnRbaV0gPDwgOCkgfCAodWludDhfdCljb250ZW50W2kgKyAxXSk7DQotICAgICAgICBpZih2YWx1ZSA8PSAweDlmZmMgJiYgdmFsdWUgPj0gMHg4MTQwKSB7DQotICAgICAgICAgICAgdmFsdWUgLT0gMHg4MTQwOw0KLSAgICAgICAgfSBlbHNlIGlmKHZhbHVlIDw9IDB4ZWJiZiAmJiB2YWx1ZSA+PSAweGUwNDApIHsNCi0gICAgICAgICAgICB2YWx1ZSAtPSAweGMxNDA7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVDaGFyYWN0ZXI7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICB9DQotICAgICAgICB2YWx1ZSA9IChGWF9EV09SRCkoKHZhbHVlID4+IDggKSAqIDB4YzApICsgKEZYX0RXT1JEKSh2YWx1ZSAmIDB4ZmYpOw0KLSAgICAgICAgYml0cy0+QXBwZW5kQml0cyh2YWx1ZSwgMTMsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi19DQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkluaXRRUkNvZGUoaW50MzJfdCBudW1JbnB1dEJ5dGVzLCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZSogbW9kZSwgQ0JDX1FSQ29kZXIqIHFyQ29kZSwgaW50MzJfdCAmZSkNCi17DQotICAgIHFyQ29kZS0+U2V0RUNMZXZlbChlY0xldmVsKTsNCi0gICAgcXJDb2RlLT5TZXRNb2RlKG1vZGUpOw0KLSAgICBmb3IoaW50MzJfdCB2ZXJzaW9uTnVtID0gMTsgdmVyc2lvbk51bSA8PSA0MDsgdmVyc2lvbk51bSsrKSB7DQotICAgICAgICBDQkNfUVJDb2RlclZlcnNpb24qIHZlcnNpb24gPSBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbk51bSwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPSB2ZXJzaW9uLT5HZXRUb3RhbENvZGVXb3JkcygpOw0KLSAgICAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3MgPSB2ZXJzaW9uLT5HZXRFQ0Jsb2Nrc0ZvckxldmVsKGVjTGV2ZWwpOw0KLSAgICAgICAgaW50MzJfdCBudW1FY0J5dGVzID0gZWNCbG9ja3MtPkdldFRvdGFsRUNDb2RlV29yZHMoKTsNCi0gICAgICAgIGludDMyX3QgbnVtUlNCbG9ja3MgPSBlY0Jsb2Nrcy0+R2V0TnVtQmxvY2tzKCk7DQotICAgICAgICBpbnQzMl90IG51bURhdGFCeXRlcyA9IG51bUJ5dGVzIC0gbnVtRWNCeXRlczsNCi0gICAgICAgIGlmKG51bURhdGFCeXRlcyA+PSBudW1JbnB1dEJ5dGVzICsgMykgew0KLSAgICAgICAgICAgIHFyQ29kZS0+U2V0VmVyc2lvbih2ZXJzaW9uTnVtKTsNCi0gICAgICAgICAgICBxckNvZGUtPlNldE51bVRvdGFsQnl0ZXMobnVtQnl0ZXMpOw0KLSAgICAgICAgICAgIHFyQ29kZS0+U2V0TnVtRGF0YUJ5dGVzKG51bURhdGFCeXRlcyk7DQotICAgICAgICAgICAgcXJDb2RlLT5TZXROdW1SU0Jsb2NrcyhudW1SU0Jsb2Nrcyk7DQotICAgICAgICAgICAgcXJDb2RlLT5TZXROdW1FQ0J5dGVzKG51bUVjQnl0ZXMpOw0KLSAgICAgICAgICAgIHFyQ29kZS0+U2V0TWF0cml4V2lkdGgodmVyc2lvbi0+R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZSA9IEJDRXhjZXB0aW9uQ2Fubm90RmluZEJsb2NrSW5mbzsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRNb2RlSW5mbyhDQkNfUVJDb2Rlck1vZGUqIG1vZGUsIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgYml0cy0+QXBwZW5kQml0cyhtb2RlLT5HZXRCaXRzKCksIDQsIGUpOw0KLSAgICBpZihtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykgew0KLSAgICAgICAgYml0cy0+QXBwZW5kQml0cygxLCA0LCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRMZW5ndGhJbmZvKGludDMyX3QgbnVtTGV0dGVycywgaW50MzJfdCB2ZXJzaW9uLCBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbiwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBpbnQzMl90IG51bUJpdHMgPSBtb2RlLT5HZXRDaGFyYWN0ZXJDb3VudEJpdHMocWN2LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIGlmKG51bUJpdHMgPiAoKDEgPDwgbnVtQml0cykgLSAxKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKSB7DQotICAgICAgICBiaXRzLT5BcHBlbmRCaXRzKG51bUxldHRlcnMgLyAyLCBudW1CaXRzLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotICAgIGJpdHMtPkFwcGVuZEJpdHMobnVtTGV0dGVycywgbnVtQml0cywgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLX0NCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6SW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBpbnQzMl90IG51bVRvdGFsQnl0ZXMsIGludDMyX3QgbnVtRGF0YUJ5dGVzLCBpbnQzMl90IG51bVJTQmxvY2tzLCBDQkNfUVJDb2RlckJpdFZlY3RvciogcmVzdWx0LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYoYml0cy0+c2l6ZUluQnl0ZXMoKSAhPSBudW1EYXRhQnl0ZXMpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkJpdHNCeXRlc05vdE1hdGNoOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgaW50MzJfdCBkYXRhQnl0ZXNPZmZzZXQgPSAwOw0KLSAgICBpbnQzMl90IG1heE51bURhdGFCeXRlcyA9IDA7DQotICAgIGludDMyX3QgbWF4TnVtRWNCeXRlcyA9IDA7DQotICAgIENGWF9QdHJBcnJheSBibG9ja3M7DQotICAgIGludDMyX3QgaTsNCi0gICAgZm9yKGkgPSAwOyBpIDwgbnVtUlNCbG9ja3M7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBudW1EYXRhQnl0ZXNJbkJsb2NrOw0KLSAgICAgICAgaW50MzJfdCBudW1FY0J5dGVzSW5CbG9zazsNCi0gICAgICAgIEdldE51bURhdGFCeXRlc0FuZE51bUVDQnl0ZXNGb3JCbG9ja0lEKG51bVRvdGFsQnl0ZXMsIG51bURhdGFCeXRlcywgbnVtUlNCbG9ja3MsIGksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1EYXRhQnl0ZXNJbkJsb2NrLCBudW1FY0J5dGVzSW5CbG9zayk7DQotICAgICAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBkYXRhQnl0ZXMgPSBGWF9ORVcgQ0JDX0NvbW1vbkJ5dGVBcnJheTsNCi0gICAgICAgIGRhdGFCeXRlcy0+U2V0KGJpdHMtPkdldEFycmF5KCksIGRhdGFCeXRlc09mZnNldCwgbnVtRGF0YUJ5dGVzSW5CbG9jayk7DQotICAgICAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBlY0J5dGVzID0gR2VuZXJhdGVFQ0J5dGVzKGRhdGFCeXRlcywgbnVtRWNCeXRlc0luQmxvc2ssIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICBibG9ja3MuQWRkKEZYX05FVyBDQkNfUVJDb2RlckJsb2NrUGFpcihkYXRhQnl0ZXMsIGVjQnl0ZXMpKTsNCi0gICAgICAgIG1heE51bURhdGFCeXRlcyA9IEZYX01BWChtYXhOdW1EYXRhQnl0ZXMsIGRhdGFCeXRlcy0+U2l6ZSgpKTsNCi0gICAgICAgIG1heE51bUVjQnl0ZXMgPSBGWF9NQVgobWF4TnVtRWNCeXRlcywgZWNCeXRlcy0+U2l6ZSgpKTsNCi0gICAgICAgIGRhdGFCeXRlc09mZnNldCArPSBudW1EYXRhQnl0ZXNJbkJsb2NrOw0KLSAgICB9DQotICAgIGlmKG51bURhdGFCeXRlcyAhPSBkYXRhQnl0ZXNPZmZzZXQpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkJ5dGVzTm90TWF0Y2hPZmZzZXQ7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLSAgICBmb3IoaW50MzJfdCB4ID0gMDsgeCA8IG1heE51bURhdGFCeXRlczsgeCsrKSB7DQotICAgICAgICBmb3IoaW50MzJfdCBqID0gMDsgaiA8IGJsb2Nrcy5HZXRTaXplKCk7IGorKykgew0KLSAgICAgICAgICAgIENCQ19Db21tb25CeXRlQXJyYXkqIGRhdGFCeXRlcyA9ICgoQ0JDX1FSQ29kZXJCbG9ja1BhaXIqKWJsb2Nrc1tqXSktPkdldERhdGFCeXRlcygpOw0KLSAgICAgICAgICAgIGlmKHggPCBkYXRhQnl0ZXMtPlNpemUoKSkgew0KLSAgICAgICAgICAgICAgICByZXN1bHQtPkFwcGVuZEJpdHMoZGF0YUJ5dGVzLT5BdCh4KSwgOCwgZSk7DQotICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBmb3IoaW50MzJfdCB5ID0gMDsgeSA8IG1heE51bUVjQnl0ZXM7IHkrKykgew0KLSAgICAgICAgZm9yKGludDMyX3QgbCA9IDA7IGwgPCBibG9ja3MuR2V0U2l6ZSgpOyBsKyspIHsNCi0gICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBlY0J5dGVzID0gKChDQkNfUVJDb2RlckJsb2NrUGFpciopYmxvY2tzW2xdKS0+R2V0RXJyb3JDb3JyZWN0aW9uQnl0ZXMoKTsNCi0gICAgICAgICAgICBpZih5IDwgZWNCeXRlcy0+U2l6ZSgpKSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC0+QXBwZW5kQml0cyhlY0J5dGVzLT5BdCh5KSwgOCwgZSk7DQotICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBmb3IoaW50MzJfdCBrID0gMDsgayA8IGJsb2Nrcy5HZXRTaXplKCk7IGsrKykgew0KLSAgICAgICAgZGVsZXRlIChDQkNfUVJDb2RlckJsb2NrUGFpciopYmxvY2tzW2tdOw0KLSAgICB9DQotICAgIGlmKG51bVRvdGFsQnl0ZXMgIT0gcmVzdWx0LT5zaXplSW5CeXRlcygpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25TaXplSW5CeXRlc0RpZmZlcjsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpHZXROdW1EYXRhQnl0ZXNBbmROdW1FQ0J5dGVzRm9yQmxvY2tJRChpbnQzMl90IG51bVRvdGFsQnl0ZXMsIGludDMyX3QgbnVtRGF0YUJ5dGVzLA0KLSAgICAgICAgaW50MzJfdCBudW1SU0Jsb2NrcywgaW50MzJfdCBibG9ja0lELA0KLSAgICAgICAgaW50MzJfdCAmbnVtRGF0YUJ5dGVzSW5CbG9jaywgaW50MzJfdCYgbnVtRUNCeXRlc0luQmxvY2spDQotew0KLSAgICBpZihibG9ja0lEID49IG51bVJTQmxvY2tzKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBudW1Sc0Jsb2Nrc0luR3JvdXAyID0gbnVtVG90YWxCeXRlcyAlIG51bVJTQmxvY2tzOw0KLSAgICBpbnQzMl90IG51bVJzQmxvY2tzSW5Hcm91cDEgPSBudW1SU0Jsb2NrcyAtIG51bVJzQmxvY2tzSW5Hcm91cDI7DQotICAgIGludDMyX3QgbnVtVG90YWxCeXRlc0luR3JvdXAxID0gbnVtVG90YWxCeXRlcyAvIG51bVJTQmxvY2tzOw0KLSAgICBpbnQzMl90IG51bVRvdGFsQnl0ZXNJbkdyb3VwMiA9IG51bVRvdGFsQnl0ZXNJbkdyb3VwMSArIDE7DQotICAgIGludDMyX3QgbnVtRGF0YUJ5dGVzSW5Hcm91cDEgPSBudW1EYXRhQnl0ZXMgLyBudW1SU0Jsb2NrczsNCi0gICAgaW50MzJfdCBudW1EYXRhQnl0ZXNJbkdyb3VwMiA9IG51bURhdGFCeXRlc0luR3JvdXAxICsgMTsNCi0gICAgaW50MzJfdCBudW1FY0J5dGVzSW5Hcm91cDEgPSBudW1Ub3RhbEJ5dGVzSW5Hcm91cDEgLSBudW1EYXRhQnl0ZXNJbkdyb3VwMTsNCi0gICAgaW50MzJfdCBudW1FY0J5dGVzSW5Hcm91cDIgPSBudW1Ub3RhbEJ5dGVzSW5Hcm91cDIgLSBudW1EYXRhQnl0ZXNJbkdyb3VwMjsNCi0gICAgaWYgKGJsb2NrSUQgPCBudW1Sc0Jsb2Nrc0luR3JvdXAxKSB7DQotICAgICAgICBudW1EYXRhQnl0ZXNJbkJsb2NrID0gbnVtRGF0YUJ5dGVzSW5Hcm91cDE7DQotICAgICAgICBudW1FQ0J5dGVzSW5CbG9jayA9IG51bUVjQnl0ZXNJbkdyb3VwMTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIG51bURhdGFCeXRlc0luQmxvY2sgPSBudW1EYXRhQnl0ZXNJbkdyb3VwMjsNCi0gICAgICAgIG51bUVDQnl0ZXNJbkJsb2NrID0gbnVtRWNCeXRlc0luR3JvdXAyOw0KLSAgICB9DQotfQ0KLUNCQ19Db21tb25CeXRlQXJyYXkqIENCQ19RUkNvZGVyRW5jb2Rlcjo6R2VuZXJhdGVFQ0J5dGVzKENCQ19Db21tb25CeXRlQXJyYXkqIGRhdGFCeXRlcywgaW50MzJfdCBudW1FY0J5dGVzSW5CbG9jaywgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3QgbnVtRGF0YUJ5dGVzID0gZGF0YUJ5dGVzLT5TaXplKCk7DQotICAgIENGWF9JbnQzMkFycmF5IHRvRW5jb2RlOw0KLSAgICB0b0VuY29kZS5TZXRTaXplKG51bURhdGFCeXRlcyArIG51bUVjQnl0ZXNJbkJsb2NrKTsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBudW1EYXRhQnl0ZXM7IGkrKykgew0KLSAgICAgICAgdG9FbmNvZGVbaV0gPSAoZGF0YUJ5dGVzLT5BdChpKSk7DQotICAgIH0NCi0gICAgQ0JDX1JlZWRTb2xvbW9uRW5jb2RlciBlbmNvZGUoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OlFSQ29kZUZpbGQpOw0KLSAgICBlbmNvZGUuSW5pdCgpOw0KLSAgICBlbmNvZGUuRW5jb2RlKCZ0b0VuY29kZSwgbnVtRWNCeXRlc0luQmxvY2ssIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIENCQ19Db21tb25CeXRlQXJyYXkqIGVjQnl0ZXMgPSBGWF9ORVcgQ0JDX0NvbW1vbkJ5dGVBcnJheShudW1FY0J5dGVzSW5CbG9jayk7DQotICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgbnVtRWNCeXRlc0luQmxvY2s7IGorKykgew0KLSAgICAgICAgZWNCeXRlcy0+U2V0KGosIHRvRW5jb2RlW251bURhdGFCeXRlcyArIGpdKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gZWNCeXRlczsNCitDQkNfQ29tbW9uQnl0ZUFycmF5KiBDQkNfUVJDb2RlckVuY29kZXI6OkdlbmVyYXRlRUNCeXRlcygNCisgICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZGF0YUJ5dGVzLA0KKyAgICBpbnQzMl90IG51bUVjQnl0ZXNJbkJsb2NrLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IG51bURhdGFCeXRlcyA9IGRhdGFCeXRlcy0+U2l6ZSgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgdG9FbmNvZGU7DQorICB0b0VuY29kZS5TZXRTaXplKG51bURhdGFCeXRlcyArIG51bUVjQnl0ZXNJbkJsb2NrKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bURhdGFCeXRlczsgaSsrKSB7DQorICAgIHRvRW5jb2RlW2ldID0gKGRhdGFCeXRlcy0+QXQoaSkpOw0KKyAgfQ0KKyAgQ0JDX1JlZWRTb2xvbW9uRW5jb2RlciBlbmNvZGUoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OlFSQ29kZUZpbGQpOw0KKyAgZW5jb2RlLkluaXQoKTsNCisgIGVuY29kZS5FbmNvZGUoJnRvRW5jb2RlLCBudW1FY0J5dGVzSW5CbG9jaywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBlY0J5dGVzID0gRlhfTkVXIENCQ19Db21tb25CeXRlQXJyYXkobnVtRWNCeXRlc0luQmxvY2spOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtRWNCeXRlc0luQmxvY2s7IGorKykgew0KKyAgICBlY0J5dGVzLT5TZXQoaiwgdG9FbmNvZGVbbnVtRGF0YUJ5dGVzICsgal0pOw0KKyAgfQ0KKyAgcmV0dXJuIGVjQnl0ZXM7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmgKaW5kZXggMzAzZGJjYi4uMjYwMjJmNSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmgKQEAgLTE0LDQ3ICsxNCwxMTYgQEAKIGNsYXNzIENCQ19Db21tb25CeXRlQXJyYXk7DQogY2xhc3MgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg7DQogY2xhc3MgQ0JDX1FSQ29kZXJFbmNvZGVyOw0KLWNsYXNzIENCQ19RUkNvZGVyRW5jb2Rlcg0KLXsNCi1wcml2YXRlOg0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBtX2FscGhhTnVtYmVyaWNUYWJsZVs5Nl07DQotcHVibGljOg0KLSAgICBDQkNfUVJDb2RlckVuY29kZXIoKTsNCi0gICAgdmlydHVhbCB+Q0JDX1FSQ29kZXJFbmNvZGVyKCk7DQorY2xhc3MgQ0JDX1FSQ29kZXJFbmNvZGVyIHsNCisgcHJpdmF0ZToNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IG1fYWxwaGFOdW1iZXJpY1RhYmxlWzk2XTsNCiANCi0gICAgc3RhdGljIHZvaWQgRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLCBDQkNfUVJDb2RlciAqcXJDb2RlLCBpbnQzMl90ICZlLCBpbnQzMl90IHZlcnNpb25TcGVjaWZ5ID0gMCk7DQotICAgIHN0YXRpYyB2b2lkIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgQ0JDX1FSQ29kZXIgKnFyQ29kZSwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIEVuY29kZVdpdGhTcGVjaWZ5VmVyc2lvbihjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyICpxckNvZGUsIGludDMyX3QgdmVyc2lvblNwZWNpZnksIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBFbmNvZGVXaXRoQXV0b1ZlcnNpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnQsIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIENCQ19RUkNvZGVyICpxckNvZGUsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBDaG9vc2VNb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nICYgY29udGVudCwgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBHZXRBbHBoYU51bWVyaWNDb2RlKGludDMyX3QgY29kZSk7DQotICAgIHN0YXRpYyB2b2lkIEFwcGVuZEVDSShDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cyk7DQotICAgIHN0YXRpYyB2b2lkIEFwcGVuZEJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIEFwcGVuZE51bWVyaWNCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBBcHBlbmRBbHBoYU51bWVyaWNCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmY29udGVudCwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBBcHBlbmQ4Qml0Qnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJmNvbnRlbnQsIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIEFwcGVuZDhCaXRCeXRlcyhDRlhfQnl0ZUFycmF5ICZieXRlcywgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgKmJpdHMsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBBcHBlbmRLYW5qaUJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIEFwcGVuZEdCS0J5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIEluaXRRUkNvZGUoaW50MzJfdCBudW1JbnB1dEJ5dGVzLCBpbnQzMl90IHZlcnNpb25OdW1iZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLCBDQkNfUVJDb2RlciogcXJDb2RlLCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgSW5pdFFSQ29kZShpbnQzMl90IG51bUlucHV0Qnl0ZXMsIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIENCQ19RUkNvZGVyTW9kZSogbW9kZSwgQ0JDX1FSQ29kZXIqIHFyQ29kZSwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIEFwcGVuZE1vZGVJbmZvKENCQ19RUkNvZGVyTW9kZSogbW9kZSwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBBcHBlbmRMZW5ndGhJbmZvKGludDMyX3QgbnVtTGV0dGVycywgaW50MzJfdCB2ZXJzaW9uLCBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBpbnQzMl90ICZlKTsNCisgcHVibGljOg0KKyAgQ0JDX1FSQ29kZXJFbmNvZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfUVJDb2RlckVuY29kZXIoKTsNCiANCi0gICAgc3RhdGljIHZvaWQgSW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBpbnQzMl90IG51bVRvdGFsQnl0ZXMsIGludDMyX3QgbnVtRGF0YUJ5dGVzLCBpbnQzMl90IG51bVJTQmxvY2tzLCBDQkNfUVJDb2RlckJpdFZlY3RvciogcmVzdWx0LCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgR2V0TnVtRGF0YUJ5dGVzQW5kTnVtRUNCeXRlc0ZvckJsb2NrSUQoaW50MzJfdCBudW1Ub3RhbEJ5dGVzLCBpbnQzMl90IG51bURhdGFCeXRlcywNCi0gICAgICAgICAgICBpbnQzMl90IG51bVJTQmxvY2tzLCBpbnQzMl90IGJsb2NrSUQsDQotICAgICAgICAgICAgaW50MzJfdCAmbnVtRGF0YUJ5dGVzSW5CbG9jaywgaW50MzJfdCYgbnVtRUNCeXRlc0luQmxvY2tzKTsNCi0gICAgc3RhdGljIENCQ19Db21tb25CeXRlQXJyYXkqIEdlbmVyYXRlRUNCeXRlcyhDQkNfQ29tbW9uQnl0ZUFycmF5KiBkYXRhQnl0ZXMsIGludDMyX3QgbnVtRWNCeXRlc0luQmxvY2ssIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBDaG9vc2VNYXNrUGF0dGVybihDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyBpbnQzMl90IENhbGN1bGF0ZU1hc2tQZW5hbHR5KENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KLSAgICBzdGF0aWMgdm9pZCBUZXJtaW5hdGVCaXRzKGludDMyX3QgbnVtRGF0YUJ5dGVzLCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyBpbnQzMl90IEdldFNwYW5CeVZlcnNpb24oQ0JDX1FSQ29kZXJNb2RlICptb2RlRmlyc3QsIENCQ19RUkNvZGVyTW9kZSAqbW9kZVNlY29uZCwgaW50MzJfdCB2ZXJzaW9uTnVtLCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgTWVyZ2VTdHJpbmcoQ0ZYX1B0ckFycmF5ICZyZXN1bHQsIGludDMyX3QgdmVyc2lvbk51bSwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIFNwbGl0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nICZjb250ZW50LCBDRlhfUHRyQXJyYXkgJnJlc3VsdCk7DQotICAgIHN0YXRpYyB2b2lkIEFwcGVuZERhdGFNb2RlTGVuZ2hJbmZvKENGWF9QdHJBcnJheSAmc3BsaXRSZXN1bHQsIENCQ19RUkNvZGVyQml0VmVjdG9yICZoZWFkZXJBbmREYXRhQml0cywJQ0JDX1FSQ29kZXJNb2RlICp0ZW1wTW9kZSwgQ0JDX1FSQ29kZXIgKnFyQ29kZSwgQ0ZYX0J5dGVTdHJpbmcgJmVuY29kaW5nLCBpbnQzMl90ICZlKTsNCisgIHN0YXRpYyB2b2lkIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSwNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb25TcGVjaWZ5ID0gMCk7DQorICBzdGF0aWMgdm9pZCBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlciogcXJDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRW5jb2RlV2l0aFNwZWNpZnlWZXJzaW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb25TcGVjaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRW5jb2RlV2l0aEF1dG9WZXJzaW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIENob29zZU1vZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nKTsNCisgIHN0YXRpYyBpbnQzMl90IEdldEFscGhhTnVtZXJpY0NvZGUoaW50MzJfdCBjb2RlKTsNCisgIHN0YXRpYyB2b2lkIEFwcGVuZEVDSShDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cyk7DQorICBzdGF0aWMgdm9pZCBBcHBlbmRCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZSogbW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEFwcGVuZE51bWVyaWNCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEFwcGVuZEFscGhhTnVtZXJpY0J5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEFwcGVuZDhCaXRCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEFwcGVuZDhCaXRCeXRlcyhDRlhfQnl0ZUFycmF5JiBieXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEFwcGVuZEthbmppQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEFwcGVuZEdCS0J5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEluaXRRUkNvZGUoaW50MzJfdCBudW1JbnB1dEJ5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb25OdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZSogbW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBJbml0UVJDb2RlKGludDMyX3QgbnVtSW5wdXRCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlciogcXJDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEFwcGVuZE1vZGVJbmZvKENCQ19RUkNvZGVyTW9kZSogbW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBBcHBlbmRMZW5ndGhJbmZvKGludDMyX3QgbnVtTGV0dGVycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisNCisgIHN0YXRpYyB2b2lkIEludGVybGVhdmVXaXRoRUNCeXRlcyhDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVRvdGFsQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1EYXRhQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1SU0Jsb2NrcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogcmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgR2V0TnVtRGF0YUJ5dGVzQW5kTnVtRUNCeXRlc0ZvckJsb2NrSUQoDQorICAgICAgaW50MzJfdCBudW1Ub3RhbEJ5dGVzLA0KKyAgICAgIGludDMyX3QgbnVtRGF0YUJ5dGVzLA0KKyAgICAgIGludDMyX3QgbnVtUlNCbG9ja3MsDQorICAgICAgaW50MzJfdCBibG9ja0lELA0KKyAgICAgIGludDMyX3QmIG51bURhdGFCeXRlc0luQmxvY2ssDQorICAgICAgaW50MzJfdCYgbnVtRUNCeXRlc0luQmxvY2tzKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uQnl0ZUFycmF5KiBHZW5lcmF0ZUVDQnl0ZXMoQ0JDX0NvbW1vbkJ5dGVBcnJheSogZGF0YUJ5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUVjQnl0ZXNJbkJsb2NrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBpbnQzMl90IENob29zZU1hc2tQYXR0ZXJuKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBpbnQzMl90IENhbGN1bGF0ZU1hc2tQZW5hbHR5KENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KKyAgc3RhdGljIHZvaWQgVGVybWluYXRlQml0cyhpbnQzMl90IG51bURhdGFCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIGludDMyX3QgR2V0U3BhbkJ5VmVyc2lvbihDQkNfUVJDb2Rlck1vZGUqIG1vZGVGaXJzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlU2Vjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb25OdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgTWVyZ2VTdHJpbmcoQ0ZYX1B0ckFycmF5JiByZXN1bHQsIGludDMyX3QgdmVyc2lvbk51bSwgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBTcGxpdFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwgQ0ZYX1B0ckFycmF5JiByZXN1bHQpOw0KKyAgc3RhdGljIHZvaWQgQXBwZW5kRGF0YU1vZGVMZW5naEluZm8oQ0ZYX1B0ckFycmF5JiBzcGxpdFJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yJiBoZWFkZXJBbmREYXRhQml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZSogdGVtcE1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlciogcXJDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGVuY29kaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuY3BwCmluZGV4IGNjY2FmODYuLjBmNDNhYjIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuY3BwCkBAIC0yNiw3MiArMjYsNjYgQEAKIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Ok0gPSBOVUxMOw0KIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OlEgPSBOVUxMOw0KIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkggPSBOVUxMOw0KLUNCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkNCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBvcmRpbmFsLCBpbnQzMl90IGJpdHMsIEZYX0NIQVIqIG5hbWUpDQotew0KLSAgICBtX25hbWUgKz0gbmFtZTsNCi0gICAgbV9vcmRpbmFsID0gb3JkaW5hbDsNCi0gICAgbV9iaXRzID0gYml0czsNCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKA0KKyAgICBpbnQzMl90IG9yZGluYWwsDQorICAgIGludDMyX3QgYml0cywNCisgICAgRlhfQ0hBUiogbmFtZSkgew0KKyAgbV9uYW1lICs9IG5hbWU7DQorICBtX29yZGluYWwgPSBvcmRpbmFsOw0KKyAgbV9iaXRzID0gYml0czsNCiB9DQotQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6fkNCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoKQ0KLXsNCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjp+Q0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgpIHt9DQordm9pZCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpJbml0aWFsaXplKCkgew0KKyAgTCA9IEZYX05FVyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKDAsIDB4MDEsIChGWF9DSEFSKikiTCIpOw0KKyAgTSA9IEZYX05FVyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKDEsIDB4MDAsIChGWF9DSEFSKikiTSIpOw0KKyAgUSA9IEZYX05FVyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKDIsIDB4MDMsIChGWF9DSEFSKikiUSIpOw0KKyAgSCA9IEZYX05FVyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKDMsIDB4MDIsIChGWF9DSEFSKikiSCIpOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgTCA9IEZYX05FVyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKDAsIDB4MDEsIChGWF9DSEFSKikiTCIpOw0KLSAgICBNID0gRlhfTkVXIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoMSwgMHgwMCwgKEZYX0NIQVIqKSJNIik7DQotICAgIFEgPSBGWF9ORVcgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgyLCAweDAzLCAoRlhfQ0hBUiopIlEiKTsNCi0gICAgSCA9IEZYX05FVyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKDMsIDB4MDIsIChGWF9DSEFSKikiSCIpOw0KK3ZvaWQgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6RmluYWxpemUoKSB7DQorICBkZWxldGUgTDsNCisgIGRlbGV0ZSBNOw0KKyAgZGVsZXRlIFE7DQorICBkZWxldGUgSDsNCiB9DQotdm9pZCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpGaW5hbGl6ZSgpDQotew0KLSAgICBkZWxldGUgTDsNCi0gICAgZGVsZXRlIE07DQotICAgIGRlbGV0ZSBROw0KLSAgICBkZWxldGUgSDsNCitpbnQzMl90IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Ok9yZGluYWwoKSB7DQorICByZXR1cm4gbV9vcmRpbmFsOw0KIH0NCi1pbnQzMl90IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Ok9yZGluYWwoKQ0KLXsNCi0gICAgcmV0dXJuIG1fb3JkaW5hbDsNCitpbnQzMl90IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkdldEJpdHMoKSB7DQorICByZXR1cm4gbV9iaXRzOw0KIH0NCi1pbnQzMl90IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkdldEJpdHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYml0czsNCitDRlhfQnl0ZVN0cmluZyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpHZXROYW1lKCkgew0KKyAgcmV0dXJuIG1fbmFtZTsNCiB9DQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6R2V0TmFtZSgpDQotew0KLSAgICByZXR1cm4gbV9uYW1lOw0KK0NCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkZvckJpdHMoDQorICAgIGludDMyX3QgYml0cykgew0KKyAgc3dpdGNoIChiaXRzKSB7DQorICAgIGNhc2UgMHgwMDoNCisgICAgICByZXR1cm4gTTsNCisgICAgY2FzZSAweDAxOg0KKyAgICAgIHJldHVybiBMOw0KKyAgICBjYXNlIDB4MDI6DQorICAgICAgcmV0dXJuIEg7DQorICAgIGNhc2UgMHgwMzoNCisgICAgICByZXR1cm4gUTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gTlVMTDsNCisgIH0NCiB9DQotQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6Rm9yQml0cyhpbnQzMl90IGJpdHMpDQotew0KLSAgICBzd2l0Y2goYml0cykgew0KLSAgICAgICAgY2FzZSAweDAwOg0KLSAgICAgICAgICAgIHJldHVybiBNOw0KLSAgICAgICAgY2FzZSAweDAxOg0KLSAgICAgICAgICAgIHJldHVybiBMOw0KLSAgICAgICAgY2FzZSAweDAyOg0KLSAgICAgICAgICAgIHJldHVybiBIOw0KLSAgICAgICAgY2FzZSAweDAzOg0KLSAgICAgICAgICAgIHJldHVybiBROw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLX0NCi12b2lkIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkRlc3Ryb3koKQ0KLXsNCi0gICAgaWYoTCkgew0KLSAgICAgICAgZGVsZXRlIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Okw7DQotICAgICAgICBMID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZihNKSB7DQotICAgICAgICBkZWxldGUgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6TTsNCi0gICAgICAgIE0gPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKEgpIHsNCi0gICAgICAgIGRlbGV0ZSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpIOw0KLSAgICAgICAgSCA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYoUSkgew0KLSAgICAgICAgZGVsZXRlIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OlE7DQotICAgICAgICBRID0gTlVMTDsNCi0gICAgfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6RGVzdHJveSgpIHsNCisgIGlmIChMKSB7DQorICAgIGRlbGV0ZSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpMOw0KKyAgICBMID0gTlVMTDsNCisgIH0NCisgIGlmIChNKSB7DQorICAgIGRlbGV0ZSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpNOw0KKyAgICBNID0gTlVMTDsNCisgIH0NCisgIGlmIChIKSB7DQorICAgIGRlbGV0ZSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpIOw0KKyAgICBIID0gTlVMTDsNCisgIH0NCisgIGlmIChRKSB7DQorICAgIGRlbGV0ZSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpROw0KKyAgICBRID0gTlVMTDsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oCmluZGV4IGUzOGFiYmMuLmQwODAxMGMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgKQEAgLTYsMjYgKzYsMjYgQEAKIA0KICNpZm5kZWYgX0JDX1FSQ09ERVJFUlJPUkNPUlJFQ1RJT05MRVZFTF9IXw0KICNkZWZpbmUgX0JDX1FSQ09ERVJFUlJPUkNPUlJFQ1RJT05MRVZFTF9IXw0KLWNsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwNCi17DQotcHJpdmF0ZToNCi0gICAgaW50MzJfdCBtX29yZGluYWw7DQotICAgIGludDMyX3QgbV9iaXRzOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBtX25hbWU7DQotICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBvcmRpbmFsLCBpbnQzMl90IGJpdHMsIEZYX0NIQVIqIG5hbWUpOw0KLSAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKCk7DQotcHVibGljOg0KLSAgICBzdGF0aWMgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogTDsNCi0gICAgc3RhdGljIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIE07DQotICAgIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBROw0KLSAgICBzdGF0aWMgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogSDsNCi0gICAgdmlydHVhbCB+Q0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgpOw0KLSAgICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQotICAgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQotICAgIGludDMyX3QgT3JkaW5hbCgpOw0KLSAgICBpbnQzMl90IEdldEJpdHMoKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7DQotICAgIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBGb3JCaXRzKGludDMyX3QgYml0cyk7DQorY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCB7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fb3JkaW5hbDsNCisgIGludDMyX3QgbV9iaXRzOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgbV9uYW1lOw0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IG9yZGluYWwsIGludDMyX3QgYml0cywgRlhfQ0hBUiogbmFtZSk7DQorICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKCk7DQorDQorIHB1YmxpYzoNCisgIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBMOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIE07DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogUTsNCisgIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBIOw0KKyAgdmlydHVhbCB+Q0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgpOw0KKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KKyAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisgIGludDMyX3QgT3JkaW5hbCgpOw0KKyAgaW50MzJfdCBHZXRCaXRzKCk7DQorICBDRlhfQnl0ZVN0cmluZyBHZXROYW1lKCk7DQorICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogRm9yQml0cyhpbnQzMl90IGJpdHMpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmNwcAppbmRleCA5YzcyMTQwLi4wN2Q4ZDcxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmNwcApAQCAtMjUsOTUgKzI1LDcwIEBACiAjaW5jbHVkZSAiQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmgiDQogY29uc3QgaW50MzJfdCBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpGT1JNQVRfSU5GT19NQVNLX1FSID0gMFg1NDEyOw0KIGNvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6Rk9STUFUX0lORk9fREVDT0RFX0xPT0tVUFszMl1bMl0gPSB7DQotICAgIHsweDU0MTIsIDB4MDB9LA0KLSAgICB7MHg1MTI1LCAweDAxfSwNCi0gICAgezB4NUU3QywgMHgwMn0sDQotICAgIHsweDVCNEIsIDB4MDN9LA0KLSAgICB7MHg0NUY5LCAweDA0fSwNCi0gICAgezB4NDBDRSwgMHgwNX0sDQotICAgIHsweDRGOTcsIDB4MDZ9LA0KLSAgICB7MHg0QUEwLCAweDA3fSwNCi0gICAgezB4NzdDNCwgMHgwOH0sDQotICAgIHsweDcyRjMsIDB4MDl9LA0KLSAgICB7MHg3REFBLCAweDBBfSwNCi0gICAgezB4Nzg5RCwgMHgwQn0sDQotICAgIHsweDY2MkYsIDB4MEN9LA0KLSAgICB7MHg2MzE4LCAweDBEfSwNCi0gICAgezB4NkM0MSwgMHgwRX0sDQotICAgIHsweDY5NzYsIDB4MEZ9LA0KLSAgICB7MHgxNjg5LCAweDEwfSwNCi0gICAgezB4MTNCRSwgMHgxMX0sDQotICAgIHsweDFDRTcsIDB4MTJ9LA0KLSAgICB7MHgxOUQwLCAweDEzfSwNCi0gICAgezB4MDc2MiwgMHgxNH0sDQotICAgIHsweDAyNTUsIDB4MTV9LA0KLSAgICB7MHgwRDBDLCAweDE2fSwNCi0gICAgezB4MDgzQiwgMHgxN30sDQotICAgIHsweDM1NUYsIDB4MTh9LA0KLSAgICB7MHgzMDY4LCAweDE5fSwNCi0gICAgezB4M0YzMSwgMHgxQX0sDQotICAgIHsweDNBMDYsIDB4MUJ9LA0KLSAgICB7MHgyNEI0LCAweDFDfSwNCi0gICAgezB4MjE4MywgMHgxRH0sDQotICAgIHsweDJFREEsIDB4MUV9LA0KLSAgICB7MHgyQkVELCAweDFGfSwNCisgICAgezB4NTQxMiwgMHgwMH0sIHsweDUxMjUsIDB4MDF9LCB7MHg1RTdDLCAweDAyfSwgezB4NUI0QiwgMHgwM30sDQorICAgIHsweDQ1RjksIDB4MDR9LCB7MHg0MENFLCAweDA1fSwgezB4NEY5NywgMHgwNn0sIHsweDRBQTAsIDB4MDd9LA0KKyAgICB7MHg3N0M0LCAweDA4fSwgezB4NzJGMywgMHgwOX0sIHsweDdEQUEsIDB4MEF9LCB7MHg3ODlELCAweDBCfSwNCisgICAgezB4NjYyRiwgMHgwQ30sIHsweDYzMTgsIDB4MER9LCB7MHg2QzQxLCAweDBFfSwgezB4Njk3NiwgMHgwRn0sDQorICAgIHsweDE2ODksIDB4MTB9LCB7MHgxM0JFLCAweDExfSwgezB4MUNFNywgMHgxMn0sIHsweDE5RDAsIDB4MTN9LA0KKyAgICB7MHgwNzYyLCAweDE0fSwgezB4MDI1NSwgMHgxNX0sIHsweDBEMEMsIDB4MTZ9LCB7MHgwODNCLCAweDE3fSwNCisgICAgezB4MzU1RiwgMHgxOH0sIHsweDMwNjgsIDB4MTl9LCB7MHgzRjMxLCAweDFBfSwgezB4M0EwNiwgMHgxQn0sDQorICAgIHsweDI0QjQsIDB4MUN9LCB7MHgyMTgzLCAweDFEfSwgezB4MkVEQSwgMHgxRX0sIHsweDJCRUQsIDB4MUZ9LA0KIH07DQotY29uc3QgaW50MzJfdCBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpCSVRTX1NFVF9JTl9IQUxGX0JZVEVbXSA9DQotezAsIDEsIDEsIDIsIDEsIDIsIDIsIDMsIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDR9Ow0KLUNCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkNCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24oaW50MzJfdCBmb3JtYXRJbmZvKQ0KLXsNCi0gICAgbV9lcnJvckNvcnJlY3RMZXZsID0gQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6Rm9yQml0cygoZm9ybWF0SW5mbyA+PiAzKSAmIDB4MDMpOw0KLSAgICBtX2RhdGFNYXNrID0gKHVpbnQ4X3QpIChmb3JtYXRJbmZvICYgMHgwNyk7DQorY29uc3QgaW50MzJfdCBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpCSVRTX1NFVF9JTl9IQUxGX0JZVEVbXSA9IHsNCisgICAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNH07DQorQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6Q0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbihpbnQzMl90IGZvcm1hdEluZm8pIHsNCisgIG1fZXJyb3JDb3JyZWN0TGV2bCA9DQorICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6Rm9yQml0cygoZm9ybWF0SW5mbyA+PiAzKSAmIDB4MDMpOw0KKyAgbV9kYXRhTWFzayA9ICh1aW50OF90KShmb3JtYXRJbmZvICYgMHgwNyk7DQogfQ0KLUNCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246On5DQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKCkNCi17DQorQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6fkNCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24oKSB7fQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6TnVtQml0c0RpZmZlcmluZyhpbnQzMl90IGEsIGludDMyX3QgYikgew0KKyAgYSBePSBiOw0KKyAgcmV0dXJuIEJJVFNfU0VUX0lOX0hBTEZfQllURVthICYgMHgwRl0gKw0KKyAgICAgICAgIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoYSA+PiA0KSAmIDB4MEZdICsNCisgICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gOCkgJiAweDBGXSArDQorICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDEyKSAmIDB4MEZdICsNCisgICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gMTYpICYgMHgwRl0gKw0KKyAgICAgICAgIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoYSA+PiAyMCkgJiAweDBGXSArDQorICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDI0KSAmIDB4MEZdICsNCisgICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gMjgpICYgMHgwRl07DQogfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6TnVtQml0c0RpZmZlcmluZyhpbnQzMl90IGEsIGludDMyX3QgYikNCi17DQotICAgIGEgXj0gYjsNCi0gICAgcmV0dXJuIEJJVFNfU0VUX0lOX0hBTEZfQllURVthICYgMHgwRl0gKw0KLSAgICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDQpICYgMHgwRl0gKw0KLSAgICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDgpICYgMHgwRl0gKw0KLSAgICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDEyKSAmIDB4MEZdICsNCi0gICAgICAgICAgIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoYSA+PiAxNikgJiAweDBGXSArDQotICAgICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gMjApICYgMHgwRl0gKw0KLSAgICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDI0KSAmIDB4MEZdICsNCi0gICAgICAgICAgIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoYSA+PiAyOCkgJiAweDBGXTsNCit1aW50OF90IENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkdldERhdGFNYXNrKCkgew0KKyAgcmV0dXJuIG1fZGF0YU1hc2s7DQogfQ0KLXVpbnQ4X3QgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6R2V0RGF0YU1hc2soKQ0KLXsNCi0gICAgcmV0dXJuIG1fZGF0YU1hc2s7DQorQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCoNCitDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpHZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpIHsNCisgIHJldHVybiBtX2Vycm9yQ29ycmVjdExldmw7DQogfQ0KLUNCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwgKkNCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkNCi17DQotICAgIHJldHVybiBtX2Vycm9yQ29ycmVjdExldmw7DQorQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbioNCitDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpEZWNvZGVGb3JtYXRJbmZvcm1hdGlvbigNCisgICAgaW50MzJfdCBtYXNrZWRGb3JtYXRJbmZvKSB7DQorICBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKiBmb3JtYXRJbmZvID0NCisgICAgICBEb0RlY29kZUZvcm1hdEluZm9ybWF0aW9uKG1hc2tlZEZvcm1hdEluZm8pOw0KKyAgaWYgKGZvcm1hdEluZm8gIT0gTlVMTCkgew0KKyAgICByZXR1cm4gZm9ybWF0SW5mbzsNCisgIH0NCisgIHJldHVybiBEb0RlY29kZUZvcm1hdEluZm9ybWF0aW9uKG1hc2tlZEZvcm1hdEluZm8gXiBGT1JNQVRfSU5GT19NQVNLX1FSKTsNCiB9DQotQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiogQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6RGVjb2RlRm9ybWF0SW5mb3JtYXRpb24oaW50MzJfdCBtYXNrZWRGb3JtYXRJbmZvKQ0KLXsNCi0gICAgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiogZm9ybWF0SW5mbyA9IERvRGVjb2RlRm9ybWF0SW5mb3JtYXRpb24obWFza2VkRm9ybWF0SW5mbyk7DQotICAgIGlmKGZvcm1hdEluZm8gIT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIGZvcm1hdEluZm87DQorQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbioNCitDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpEb0RlY29kZUZvcm1hdEluZm9ybWF0aW9uKA0KKyAgICBpbnQzMl90IG1hc2tlZEZvcm1hdEluZm8pIHsNCisgIGludDMyX3QgYmVzdERpZmZlcmVuY2UgPSAoaW50MzJfdClGWFNZU19uYW4oKTsNCisgIGludDMyX3QgYmVzdEZvcm1hdEluZm8gPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzI7IGkrKykgew0KKyAgICBpbnQzMl90IGNvbnN0KiBkZWNvZGVJbmZvID0gJkZPUk1BVF9JTkZPX0RFQ09ERV9MT09LVVBbaV1bMF07DQorICAgIGludDMyX3QgdGFyZ2V0SW5mbyA9IGRlY29kZUluZm9bMF07DQorICAgIGlmICh0YXJnZXRJbmZvID09IG1hc2tlZEZvcm1hdEluZm8pIHsNCisgICAgICByZXR1cm4gRlhfTkVXIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24oZGVjb2RlSW5mb1sxXSk7DQogICAgIH0NCi0gICAgcmV0dXJuIERvRGVjb2RlRm9ybWF0SW5mb3JtYXRpb24obWFza2VkRm9ybWF0SW5mbyBeIEZPUk1BVF9JTkZPX01BU0tfUVIpOw0KLX0NCi1DQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKiBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpEb0RlY29kZUZvcm1hdEluZm9ybWF0aW9uKGludDMyX3QgbWFza2VkRm9ybWF0SW5mbykNCi17DQotICAgIGludDMyX3QgYmVzdERpZmZlcmVuY2UgPSAoaW50MzJfdClGWFNZU19uYW4oKTsNCi0gICAgaW50MzJfdCBiZXN0Rm9ybWF0SW5mbyA9IDA7DQotICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgMzI7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBjb25zdCogZGVjb2RlSW5mbyA9ICZGT1JNQVRfSU5GT19ERUNPREVfTE9PS1VQW2ldWzBdOw0KLSAgICAgICAgaW50MzJfdCB0YXJnZXRJbmZvID0gZGVjb2RlSW5mb1swXTsNCi0gICAgICAgIGlmKHRhcmdldEluZm8gPT0gbWFza2VkRm9ybWF0SW5mbykgew0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbihkZWNvZGVJbmZvWzFdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgYml0c0RpZmZlcmVuY2UgPSBOdW1CaXRzRGlmZmVyaW5nKG1hc2tlZEZvcm1hdEluZm8sIHRhcmdldEluZm8pOw0KLSAgICAgICAgaWYoYml0c0RpZmZlcmVuY2UgPCBiZXN0RGlmZmVyZW5jZSkgew0KLSAgICAgICAgICAgIGJlc3RGb3JtYXRJbmZvID0gZGVjb2RlSW5mb1sxXTsNCi0gICAgICAgICAgICBiZXN0RGlmZmVyZW5jZSA9IGJpdHNEaWZmZXJlbmNlOw0KLSAgICAgICAgfQ0KKyAgICBpbnQzMl90IGJpdHNEaWZmZXJlbmNlID0gTnVtQml0c0RpZmZlcmluZyhtYXNrZWRGb3JtYXRJbmZvLCB0YXJnZXRJbmZvKTsNCisgICAgaWYgKGJpdHNEaWZmZXJlbmNlIDwgYmVzdERpZmZlcmVuY2UpIHsNCisgICAgICBiZXN0Rm9ybWF0SW5mbyA9IGRlY29kZUluZm9bMV07DQorICAgICAgYmVzdERpZmZlcmVuY2UgPSBiaXRzRGlmZmVyZW5jZTsNCiAgICAgfQ0KLSAgICBpZihiZXN0RGlmZmVyZW5jZSA8PSAzKSB7DQotICAgICAgICByZXR1cm4gRlhfTkVXIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24oYmVzdEZvcm1hdEluZm8pOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKGJlc3REaWZmZXJlbmNlIDw9IDMpIHsNCisgICAgcmV0dXJuIEZYX05FVyBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKGJlc3RGb3JtYXRJbmZvKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmgKaW5kZXggNWEwZjE1MC4uY2Q1ZmQyYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbi5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uaApAQCAtNywyMiArNywyNCBAQAogI2lmbmRlZiBfQkNfUVJDT0RFUkZPUk1BVElORk9STUFUSU9OX0hfDQogI2RlZmluZSBfQkNfUVJDT0RFUkZPUk1BVElORk9STUFUSU9OX0hfDQogY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsNCi1jbGFzcyBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uDQotew0KLXByaXZhdGU6DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEZPUk1BVF9JTkZPX01BU0tfUVI7DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEZPUk1BVF9JTkZPX0RFQ09ERV9MT09LVVBbMzJdWzJdOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbMTZdOw0KLSAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBtX2Vycm9yQ29ycmVjdExldmw7DQotICAgIHVpbnQ4X3QgbV9kYXRhTWFzazsNCi1wdWJsaWM6DQotICAgIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24oaW50MzJfdCBmb3JtYXRJbmZvKTsNCi0gICAgdmlydHVhbCB+Q0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbigpOw0KLSAgICB1aW50OF90IEdldERhdGFNYXNrKCk7DQotICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIEdldEVycm9yQ29ycmVjdGlvbkxldmVsKCk7DQorY2xhc3MgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiB7DQorIHByaXZhdGU6DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBGT1JNQVRfSU5GT19NQVNLX1FSOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgRk9STUFUX0lORk9fREVDT0RFX0xPT0tVUFszMl1bMl07DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbMTZdOw0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogbV9lcnJvckNvcnJlY3RMZXZsOw0KKyAgdWludDhfdCBtX2RhdGFNYXNrOw0KIA0KLSAgICBzdGF0aWMgaW50MzJfdCBOdW1CaXRzRGlmZmVyaW5nKGludDMyX3QgYSwgaW50MzJfdCBiKTsNCi0gICAgc3RhdGljIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24qIERlY29kZUZvcm1hdEluZm9ybWF0aW9uKGludDMyX3QgbWFza2VkRm9ybWF0SW5mbyk7DQotICAgIHN0YXRpYyBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKiBEb0RlY29kZUZvcm1hdEluZm9ybWF0aW9uKGludDMyX3QgbWFza2VkRm9ybWF0SW5mbyk7DQorIHB1YmxpYzoNCisgIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24oaW50MzJfdCBmb3JtYXRJbmZvKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24oKTsNCisgIHVpbnQ4X3QgR2V0RGF0YU1hc2soKTsNCisgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIEdldEVycm9yQ29ycmVjdGlvbkxldmVsKCk7DQorDQorICBzdGF0aWMgaW50MzJfdCBOdW1CaXRzRGlmZmVyaW5nKGludDMyX3QgYSwgaW50MzJfdCBiKTsNCisgIHN0YXRpYyBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKiBEZWNvZGVGb3JtYXRJbmZvcm1hdGlvbigNCisgICAgICBpbnQzMl90IG1hc2tlZEZvcm1hdEluZm8pOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24qIERvRGVjb2RlRm9ybWF0SW5mb3JtYXRpb24oDQorICAgICAgaW50MzJfdCBtYXNrZWRGb3JtYXRJbmZvKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5jcHAKaW5kZXggZjBlNzc3Yy4uZTYzZjAyMyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5jcHAKQEAgLTI1LDE4NCArMjUsMTcxIEBACiAjaW5jbHVkZSAiQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiDQogI2luY2x1ZGUgIkJDX1FSQ29kZXIuaCINCiAjaW5jbHVkZSAiQkNfUVJDb2Rlck1hc2tVdGlsLmgiDQotQ0JDX1FSQ29kZXJNYXNrVXRpbDo6Q0JDX1FSQ29kZXJNYXNrVXRpbCgpDQotew0KK0NCQ19RUkNvZGVyTWFza1V0aWw6OkNCQ19RUkNvZGVyTWFza1V0aWwoKSB7fQ0KK0NCQ19RUkNvZGVyTWFza1V0aWw6On5DQkNfUVJDb2Rlck1hc2tVdGlsKCkge30NCitpbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMSgNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCkgew0KKyAgcmV0dXJuIEFwcGx5TWFza1BlbmFsdHlSdWxlMUludGVybmFsKG1hdHJpeCwgVFJVRSkgKw0KKyAgICAgICAgIEFwcGx5TWFza1BlbmFsdHlSdWxlMUludGVybmFsKG1hdHJpeCwgRkFMU0UpOw0KIH0NCi1DQkNfUVJDb2Rlck1hc2tVdGlsOjp+Q0JDX1FSQ29kZXJNYXNrVXRpbCgpDQotew0KK2ludDMyX3QgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUyKA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KSB7DQorICBpbnQzMl90IHBlbmFsdHkgPSAwOw0KKyAgdWludDhfdCogYXJyYXkgPSBtYXRyaXgtPkdldEFycmF5KCk7DQorICBpbnQzMl90IHdpZHRoID0gbWF0cml4LT5HZXRXaWR0aCgpOw0KKyAgaW50MzJfdCBoZWlnaHQgPSBtYXRyaXgtPkdldEhlaWdodCgpOw0KKyAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0IC0gMTsgeSsrKSB7DQorICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoIC0gMTsgeCsrKSB7DQorICAgICAgaW50MzJfdCB2YWx1ZSA9IGFycmF5W3kgKiB3aWR0aCArIHhdOw0KKyAgICAgIGlmICh2YWx1ZSA9PSBhcnJheVt5ICogd2lkdGggKyB4ICsgMV0gJiYNCisgICAgICAgICAgdmFsdWUgPT0gYXJyYXlbKHkgKyAxKSAqIHdpZHRoICsgeF0gJiYNCisgICAgICAgICAgdmFsdWUgPT0gYXJyYXlbKHkgKyAxKSAqIHdpZHRoICsgeCArIDFdKSB7DQorICAgICAgICBwZW5hbHR5Kys7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gMyAqIHBlbmFsdHk7DQogfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUxKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpDQotew0KLSAgICByZXR1cm4gQXBwbHlNYXNrUGVuYWx0eVJ1bGUxSW50ZXJuYWwobWF0cml4LCBUUlVFKSArDQotICAgICAgICAgICBBcHBseU1hc2tQZW5hbHR5UnVsZTFJbnRlcm5hbChtYXRyaXgsIEZBTFNFKTsNCitpbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMygNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCkgew0KKyAgaW50MzJfdCBwZW5hbHR5ID0gMDsNCisgIHVpbnQ4X3QqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOw0KKyAgaW50MzJfdCB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCisgIGludDMyX3QgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsNCisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7DQorICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsNCisgICAgICBpZiAoeCA9PSAwICYmDQorICAgICAgICAgICgoeSA+PSAwICYmIHkgPD0gNikgfHwgKHkgPj0gaGVpZ2h0IC0gNyAmJiB5IDw9IGhlaWdodCAtIDEpKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmICh4ID09IHdpZHRoIC0gNyAmJiAoeSA+PSAwICYmIHkgPD0gNikpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoeSA9PSAwICYmDQorICAgICAgICAgICgoeCA+PSAwICYmIHggPD0gNikgfHwgKHggPj0gd2lkdGggLSA3ICYmIHggPD0gd2lkdGggLSAxKSkpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoeSA9PSBoZWlnaHQgLSA3ICYmICh4ID49IDAgJiYgeCA8PSA2KSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmICh4ICsgNiA8IHdpZHRoICYmIGFycmF5W3kgKiB3aWR0aCArIHhdID09IDEgJiYNCisgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDFdID09IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCArIDJdID09IDEgJiYNCisgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDNdID09IDEgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCArIDRdID09IDEgJiYNCisgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDVdID09IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCArIDZdID09IDEgJiYNCisgICAgICAgICAgKCh4ICsgMTAgPCB3aWR0aCAmJiBhcnJheVt5ICogd2lkdGggKyB4ICsgN10gPT0gMCAmJg0KKyAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyA4XSA9PSAwICYmIGFycmF5W3kgKiB3aWR0aCArIHggKyA5XSA9PSAwICYmDQorICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDEwXSA9PSAwKSB8fA0KKyAgICAgICAgICAgKHggLSA0ID49IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCAtIDFdID09IDAgJiYNCisgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4IC0gMl0gPT0gMCAmJiBhcnJheVt5ICogd2lkdGggKyB4IC0gM10gPT0gMCAmJg0KKyAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggLSA0XSA9PSAwKSkpIHsNCisgICAgICAgIHBlbmFsdHkgKz0gNDA7DQorICAgICAgfQ0KKyAgICAgIGlmICh5ICsgNiA8IGhlaWdodCAmJiBhcnJheVt5ICogd2lkdGggKyB4XSA9PSAxICYmDQorICAgICAgICAgIGFycmF5Wyh5ICsgMSkgKiB3aWR0aCArIHhdID09IDAgJiYgYXJyYXlbKHkgKyAyKSAqIHdpZHRoICsgeF0gPT0gMSAmJg0KKyAgICAgICAgICBhcnJheVsoeSArIDMpICogd2lkdGggKyB4XSA9PSAxICYmIGFycmF5Wyh5ICsgNCkgKiB3aWR0aCArIHhdID09IDEgJiYNCisgICAgICAgICAgYXJyYXlbKHkgKyA1KSAqIHdpZHRoICsgeF0gPT0gMCAmJiBhcnJheVsoeSArIDYpICogd2lkdGggKyB4XSA9PSAxICYmDQorICAgICAgICAgICgoeSArIDEwIDwgaGVpZ2h0ICYmIGFycmF5Wyh5ICsgNykgKiB3aWR0aCArIHhdID09IDAgJiYNCisgICAgICAgICAgICBhcnJheVsoeSArIDgpICogd2lkdGggKyB4XSA9PSAwICYmDQorICAgICAgICAgICAgYXJyYXlbKHkgKyA5KSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KKyAgICAgICAgICAgIGFycmF5Wyh5ICsgMTApICogd2lkdGggKyB4XSA9PSAwKSB8fA0KKyAgICAgICAgICAgKHkgLSA0ID49IDAgJiYgYXJyYXlbKHkgLSAxKSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KKyAgICAgICAgICAgIGFycmF5Wyh5IC0gMikgKiB3aWR0aCArIHhdID09IDAgJiYNCisgICAgICAgICAgICBhcnJheVsoeSAtIDMpICogd2lkdGggKyB4XSA9PSAwICYmDQorICAgICAgICAgICAgYXJyYXlbKHkgLSA0KSAqIHdpZHRoICsgeF0gPT0gMCkpKSB7DQorICAgICAgICBwZW5hbHR5ICs9IDQwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBlbmFsdHk7DQogfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUyKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpDQotew0KLSAgICBpbnQzMl90IHBlbmFsdHkgPSAwOw0KLSAgICB1aW50OF90KiBhcnJheSA9IG1hdHJpeC0+R2V0QXJyYXkoKTsNCi0gICAgaW50MzJfdCB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCi0gICAgaW50MzJfdCBoZWlnaHQgPSBtYXRyaXgtPkdldEhlaWdodCgpOw0KLSAgICBmb3IoaW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodCAtIDE7IHkrKykgew0KLSAgICAgICAgZm9yKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aCAtIDE7IHgrKykgew0KLSAgICAgICAgICAgIGludDMyX3QgdmFsdWUgPSBhcnJheVt5ICogd2lkdGggKyB4XTsNCi0gICAgICAgICAgICBpZih2YWx1ZSA9PSBhcnJheVt5ICogd2lkdGggKyB4ICsgMV0gJiYNCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlID09IGFycmF5Wyh5ICsgMSkgKiB3aWR0aCArIHhdICYmDQotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9PSBhcnJheVsoeSArIDEpICogd2lkdGggKyB4ICsgMV0pIHsNCi0gICAgICAgICAgICAgICAgcGVuYWx0eSArKzsNCi0gICAgICAgICAgICB9DQoraW50MzJfdCBDQkNfUVJDb2Rlck1hc2tVdGlsOjpBcHBseU1hc2tQZW5hbHR5UnVsZTQoDQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpIHsNCisgIGludDMyX3QgbnVtRGFya0NlbGxzID0gMDsNCisgIHVpbnQ4X3QqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOw0KKyAgaW50MzJfdCB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCisgIGludDMyX3QgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsNCisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7DQorICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsNCisgICAgICBpZiAoYXJyYXlbeSAqIHdpZHRoICsgeF0gPT0gMSkgew0KKyAgICAgICAgbnVtRGFya0NlbGxzICs9IDE7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpbnQzMl90IG51bVRvdGFsQ2VsbHMgPSBtYXRyaXgtPkdldEhlaWdodCgpICogbWF0cml4LT5HZXRXaWR0aCgpOw0KKyAgZG91YmxlIGRhcmtSYXRpbyA9IChkb3VibGUpbnVtRGFya0NlbGxzIC8gbnVtVG90YWxDZWxsczsNCisgIHJldHVybiBhYnMoKGludDMyX3QpKGRhcmtSYXRpbyAqIDEwMCAtIDUwKSAvIDUpICogNSAqIDEwOw0KK30NCitGWF9CT09MIENCQ19RUkNvZGVyTWFza1V0aWw6OkdldERhdGFNYXNrQml0KGludDMyX3QgbWFza1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoIUNCQ19RUkNvZGVyOjpJc1ZhbGlkTWFza1BhdHRlcm4obWFza1BhdHRlcm4pKSB7DQorICAgIGUgPSAoQkNFeGNlcHRpb25JbnZhbGlkYXRlTWFza1BhdHRlcm4pOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgfQ0KKyAgaW50MzJfdCBpbnRlcm1lZGlhdGUgPSAwLCB0ZW1wID0gMDsNCisgIHN3aXRjaCAobWFza1BhdHRlcm4pIHsNCisgICAgY2FzZSAwOg0KKyAgICAgIGludGVybWVkaWF0ZSA9ICh5ICsgeCkgJiAweDE7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMToNCisgICAgICBpbnRlcm1lZGlhdGUgPSB5ICYgMHgxOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDI6DQorICAgICAgaW50ZXJtZWRpYXRlID0geCAlIDM7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzoNCisgICAgICBpbnRlcm1lZGlhdGUgPSAoeSArIHgpICUgMzsNCisgICAgICBicmVhazsNCisgICAgY2FzZSA0Og0KKyAgICAgIGludGVybWVkaWF0ZSA9ICgoeSA+PiAxKSArICh4IC8gMykpICYgMHgxOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDU6DQorICAgICAgdGVtcCA9IHkgKiB4Ow0KKyAgICAgIGludGVybWVkaWF0ZSA9ICh0ZW1wICYgMHgxKSArICh0ZW1wICUgMyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgNjoNCisgICAgICB0ZW1wID0geSAqIHg7DQorICAgICAgaW50ZXJtZWRpYXRlID0gKCgodGVtcCAmIDB4MSkgKyAodGVtcCAlIDMpKSAmIDB4MSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgNzoNCisgICAgICB0ZW1wID0geSAqIHg7DQorICAgICAgaW50ZXJtZWRpYXRlID0gKCgodGVtcCAlIDMpICsgKCh5ICsgeCkgJiAweDEpKSAmIDB4MSk7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlTWFza1BhdHRlcm47DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGludGVybWVkaWF0ZSA9PSAwOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMUludGVybmFsKA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICBGWF9CT09MIGlzSG9yaXpvbnRhbCkgew0KKyAgaW50MzJfdCBwZW5hbHR5ID0gMDsNCisgIGludDMyX3QgbnVtU2FtZUJpdENlbGxzID0gMDsNCisgIGludDMyX3QgcHJldkJpdCA9IC0xOw0KKyAgaW50MzJfdCB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCisgIGludDMyX3QgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsNCisgIGludDMyX3QgaUxpbWl0ID0gaXNIb3Jpem9udGFsID8gaGVpZ2h0IDogd2lkdGg7DQorICBpbnQzMl90IGpMaW1pdCA9IGlzSG9yaXpvbnRhbCA/IHdpZHRoIDogaGVpZ2h0Ow0KKyAgdWludDhfdCogYXJyYXkgPSBtYXRyaXgtPkdldEFycmF5KCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGltaXQ7ICsraSkgew0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBqTGltaXQ7ICsraikgew0KKyAgICAgIGludDMyX3QgYml0ID0gaXNIb3Jpem9udGFsID8gYXJyYXlbaSAqIHdpZHRoICsgal0gOiBhcnJheVtqICogd2lkdGggKyBpXTsNCisgICAgICBpZiAoYml0ID09IHByZXZCaXQpIHsNCisgICAgICAgIG51bVNhbWVCaXRDZWxscyArPSAxOw0KKyAgICAgICAgaWYgKG51bVNhbWVCaXRDZWxscyA9PSA1KSB7DQorICAgICAgICAgIHBlbmFsdHkgKz0gMzsNCisgICAgICAgIH0gZWxzZSBpZiAobnVtU2FtZUJpdENlbGxzID4gNSkgew0KKyAgICAgICAgICBwZW5hbHR5ICs9IDE7DQogICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG51bVNhbWVCaXRDZWxscyA9IDE7DQorICAgICAgICBwcmV2Qml0ID0gYml0Ow0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gMyAqIHBlbmFsdHk7DQotfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUzKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpDQotew0KLSAgICBpbnQzMl90IHBlbmFsdHkgPSAwOw0KLSAgICB1aW50OF90KiBhcnJheSA9IG1hdHJpeC0+R2V0QXJyYXkoKTsNCi0gICAgaW50MzJfdCB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCi0gICAgaW50MzJfdCBoZWlnaHQgPSBtYXRyaXgtPkdldEhlaWdodCgpOw0KLSAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgew0KLSAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgew0KLSAgICAgICAgICAgIGlmICh4ID09IDAgJiYgKCh5ID49IDAgJiYgeSA8PSA2KSB8fCAoeSA+PSBoZWlnaHQgLSA3ICYmIHkgPD0gaGVpZ2h0IC0gMSkpKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoeCA9PSB3aWR0aCAtIDcgJiYgKHkgPj0gMCAmJiB5IDw9IDYpKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoeSA9PSAwICYmICgoeCA+PSAwICYmIHggPD0gNikgfHwgKHggPj0gd2lkdGggLSA3ICYmIHggPD0gd2lkdGggLSAxKSkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICh5ID09IGhlaWdodCAtIDcgJiYgKHggPj0gMCAmJiB4IDw9IDYpKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoeCArIDYgPCB3aWR0aCAmJg0KLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeF0gPT0gMSAmJg0KLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArICAxXSA9PSAwICYmDQotICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4ICsgIDJdID09IDEgJiYNCi0gICAgICAgICAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyAgM10gPT0gMSAmJg0KLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArICA0XSA9PSAxICYmDQotICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4ICsgIDVdID09IDAgJiYNCi0gICAgICAgICAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyAgNl0gPT0gMSAmJg0KLSAgICAgICAgICAgICAgICAgICAgKCh4ICsgMTAgPCB3aWR0aCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4ICsgIDddID09IDAgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArICA4XSA9PSAwICYmDQotICAgICAgICAgICAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyAgOV0gPT0gMCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4ICsgMTBdID09IDApIHx8DQotICAgICAgICAgICAgICAgICAgICAgKHggLSA0ID49IDAgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCAtICAxXSA9PSAwICYmDQotICAgICAgICAgICAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggLSAgMl0gPT0gMCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4IC0gIDNdID09IDAgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCAtICA0XSA9PSAwKSkpIHsNCi0gICAgICAgICAgICAgICAgcGVuYWx0eSArPSA0MDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHkgKyA2IDwgaGVpZ2h0ICYmDQotICAgICAgICAgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4XSA9PSAxICAmJg0KLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbKHkgKyAgMSkgKiB3aWR0aCArIHhdID09IDAgICYmDQotICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArICAyKSAqIHdpZHRoICsgeF0gPT0gMSAgJiYNCi0gICAgICAgICAgICAgICAgICAgIGFycmF5Wyh5ICsgIDMpICogd2lkdGggKyB4XSA9PSAxICAmJg0KLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbKHkgKyAgNCkgKiB3aWR0aCArIHhdID09IDEgICYmDQotICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArICA1KSAqIHdpZHRoICsgeF0gPT0gMCAgJiYNCi0gICAgICAgICAgICAgICAgICAgIGFycmF5Wyh5ICsgIDYpICogd2lkdGggKyB4XSA9PSAxICYmDQotICAgICAgICAgICAgICAgICAgICAoKHkgKyAxMCA8IGhlaWdodCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArICA3KSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArICA4KSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArICA5KSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSArIDEwKSAqIHdpZHRoICsgeF0gPT0gMCkgfHwNCi0gICAgICAgICAgICAgICAgICAgICAoeSAtIDQgPj0gMCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSAtICAxKSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSAtICAyKSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSAtICAzKSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICBhcnJheVsoeSAtICA0KSAqIHdpZHRoICsgeF0gPT0gMCkpKSB7DQotICAgICAgICAgICAgICAgIHBlbmFsdHkgKz0gNDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBwZW5hbHR5Ow0KLX0NCi1pbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlNChDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KQ0KLXsNCi0gICAgaW50MzJfdCBudW1EYXJrQ2VsbHMgPSAwOw0KLSAgICB1aW50OF90KiBhcnJheSA9IG1hdHJpeC0+R2V0QXJyYXkoKTsNCi0gICAgaW50MzJfdCB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCi0gICAgaW50MzJfdCBoZWlnaHQgPSBtYXRyaXgtPkdldEhlaWdodCgpOw0KLSAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgew0KLSAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgew0KLSAgICAgICAgICAgIGlmIChhcnJheVt5ICogd2lkdGggKyB4XSA9PSAxKSB7DQotICAgICAgICAgICAgICAgIG51bURhcmtDZWxscyArPSAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpbnQzMl90IG51bVRvdGFsQ2VsbHMgPSBtYXRyaXgtPkdldEhlaWdodCgpICogbWF0cml4LT5HZXRXaWR0aCgpOw0KLSAgICBkb3VibGUgZGFya1JhdGlvID0gKGRvdWJsZSkgbnVtRGFya0NlbGxzIC8gbnVtVG90YWxDZWxsczsNCi0gICAgcmV0dXJuIGFicyggKGludDMyX3QpIChkYXJrUmF0aW8gKiAxMDAgLSA1MCkgLyA1ICkgKiA1ICogMTA7DQotfQ0KLUZYX0JPT0wgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6R2V0RGF0YU1hc2tCaXQoaW50MzJfdCBtYXNrUGF0dGVybiwgaW50MzJfdCB4LCBpbnQzMl90IHksIGludDMyX3QgJmUpDQotew0KLSAgICBpZighQ0JDX1FSQ29kZXI6OklzVmFsaWRNYXNrUGF0dGVybihtYXNrUGF0dGVybikpIHsNCi0gICAgICAgIGUgPSAoQkNFeGNlcHRpb25JbnZhbGlkYXRlTWFza1BhdHRlcm4pOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGludGVybWVkaWF0ZSA9IDAsIHRlbXAgPSAwOw0KLSAgICBzd2l0Y2gobWFza1BhdHRlcm4pIHsNCi0gICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICBpbnRlcm1lZGlhdGUgPSAoeSArIHgpICYgMHgxOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgIGludGVybWVkaWF0ZSA9IHkgJiAweDE7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgaW50ZXJtZWRpYXRlID0geCAlIDM7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgaW50ZXJtZWRpYXRlID0gKHkgKyB4KSAlIDM7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgaW50ZXJtZWRpYXRlID0gKCh5ID4+IDEpICsgKHggLyAzKSkgJiAweDE7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgdGVtcCA9IHkgKiB4Ow0KLSAgICAgICAgICAgIGludGVybWVkaWF0ZSA9ICh0ZW1wICYgMHgxKSArICh0ZW1wICUgMyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgdGVtcCA9IHkgKiB4Ow0KLSAgICAgICAgICAgIGludGVybWVkaWF0ZSA9ICgoKHRlbXAgJiAweDEpICsgKHRlbXAgJSAzKSkgJiAweDEpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSA3Og0KLSAgICAgICAgICAgIHRlbXAgPSB5ICogeDsNCi0gICAgICAgICAgICBpbnRlcm1lZGlhdGUgPSAoKCh0ZW1wICUgMykgKyAoKHkgKyB4KSAmIDB4MSkpICYgMHgxKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZU1hc2tQYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaW50ZXJtZWRpYXRlID09IDA7DQotfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUxSW50ZXJuYWwoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgRlhfQk9PTCBpc0hvcml6b250YWwpDQotew0KLSAgICBpbnQzMl90IHBlbmFsdHkgPSAwOw0KLSAgICBpbnQzMl90IG51bVNhbWVCaXRDZWxscyA9IDA7DQotICAgIGludDMyX3QgcHJldkJpdCA9IC0xOw0KLSAgICBpbnQzMl90IHdpZHRoID0gbWF0cml4LT5HZXRXaWR0aCgpOw0KLSAgICBpbnQzMl90IGhlaWdodCA9IG1hdHJpeC0+R2V0SGVpZ2h0KCk7DQotICAgIGludDMyX3QgaUxpbWl0ID0gaXNIb3Jpem9udGFsID8gaGVpZ2h0IDogd2lkdGg7DQotICAgIGludDMyX3QgakxpbWl0ID0gaXNIb3Jpem9udGFsID8gd2lkdGggOiBoZWlnaHQ7DQotICAgIHVpbnQ4X3QqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGltaXQ7ICsraSkgew0KLSAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgakxpbWl0OyArK2opIHsNCi0gICAgICAgICAgICBpbnQzMl90IGJpdCA9IGlzSG9yaXpvbnRhbCA/IGFycmF5W2kgKiB3aWR0aCArIGpdIDogYXJyYXlbaiAqIHdpZHRoICsgaV07DQotICAgICAgICAgICAgaWYgKGJpdCA9PSBwcmV2Qml0KSB7DQotICAgICAgICAgICAgICAgIG51bVNhbWVCaXRDZWxscyArPSAxOw0KLSAgICAgICAgICAgICAgICBpZiAobnVtU2FtZUJpdENlbGxzID09IDUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBlbmFsdHkgKz0gMzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1TYW1lQml0Q2VsbHMgPiA1KSB7DQotICAgICAgICAgICAgICAgICAgICBwZW5hbHR5ICs9IDE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBudW1TYW1lQml0Q2VsbHMgPSAxOw0KLSAgICAgICAgICAgICAgICBwcmV2Qml0ID0gYml0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIG51bVNhbWVCaXRDZWxscyA9IDA7DQotICAgIH0NCi0gICAgcmV0dXJuIHBlbmFsdHk7DQorICAgIG51bVNhbWVCaXRDZWxscyA9IDA7DQorICB9DQorICByZXR1cm4gcGVuYWx0eTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5oCmluZGV4IDEwZmY5NjQuLmVmYjI5OGQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmgKQEAgLTcsMTcgKzcsMjAgQEAKICNpZm5kZWYgX0JDX1FSQ09ERVJNQVNLVVRJTF9IXw0KICNkZWZpbmUgX0JDX1FSQ09ERVJNQVNLVVRJTF9IXw0KIGNsYXNzIENCQ19Db21tb25CeXRlTWF0cml4Ow0KLWNsYXNzIENCQ19RUkNvZGVyTWFza1V0aWwNCi17DQotcHVibGljOg0KLSAgICBDQkNfUVJDb2Rlck1hc2tVdGlsKCk7DQotICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyTWFza1V0aWwoKTsNCi0gICAgc3RhdGljIEZYX0JPT0wgR2V0RGF0YU1hc2tCaXQoaW50MzJfdCBtYXNrUGF0dGVybiwgaW50MzJfdCB4LCBpbnQzMl90IHksIGludDMyX3QgJmUpOw0KK2NsYXNzIENCQ19RUkNvZGVyTWFza1V0aWwgew0KKyBwdWJsaWM6DQorICBDQkNfUVJDb2Rlck1hc2tVdGlsKCk7DQorICB2aXJ0dWFsIH5DQkNfUVJDb2Rlck1hc2tVdGlsKCk7DQorICBzdGF0aWMgRlhfQk9PTCBHZXREYXRhTWFza0JpdChpbnQzMl90IG1hc2tQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQogDQotICAgIHN0YXRpYyBpbnQzMl90IEFwcGx5TWFza1BlbmFsdHlSdWxlMShDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KTsNCi0gICAgc3RhdGljIGludDMyX3QgQXBwbHlNYXNrUGVuYWx0eVJ1bGUyKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBBcHBseU1hc2tQZW5hbHR5UnVsZTMoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCk7DQotICAgIHN0YXRpYyBpbnQzMl90IEFwcGx5TWFza1BlbmFsdHlSdWxlNChDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KTsNCi0gICAgc3RhdGljIGludDMyX3QgQXBwbHlNYXNrUGVuYWx0eVJ1bGUxSW50ZXJuYWwoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgRlhfQk9PTCBpc0hvcml6b250YWwpOw0KKyAgc3RhdGljIGludDMyX3QgQXBwbHlNYXNrUGVuYWx0eVJ1bGUxKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KKyAgc3RhdGljIGludDMyX3QgQXBwbHlNYXNrUGVuYWx0eVJ1bGUyKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KKyAgc3RhdGljIGludDMyX3QgQXBwbHlNYXNrUGVuYWx0eVJ1bGUzKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KKyAgc3RhdGljIGludDMyX3QgQXBwbHlNYXNrUGVuYWx0eVJ1bGU0KENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOw0KKyAgc3RhdGljIGludDMyX3QgQXBwbHlNYXNrUGVuYWx0eVJ1bGUxSW50ZXJuYWwoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNIb3Jpem9udGFsKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuY3BwCmluZGV4IDdjYWE2YjUuLjgzZTY0ZGIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5jcHAKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXRyaXhVdGlsLmNwcApAQCAtMjgsNDYzICsyOCw0MzkgQEAKICNpbmNsdWRlICJCQ19RUkNvZGVyTWF0cml4VXRpbC5oIg0KICNpbmNsdWRlICJCQ19RUkNvZGVyQml0VmVjdG9yLmgiDQogY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlBPU0lUSU9OX0RFVEVDVElPTl9QQVRURVJOWzddWzddID0gew0KLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLA0KLSAgICAxLCAwLCAwLCAwLCAwLCAwLCAxLA0KLSAgICAxLCAwLCAxLCAxLCAxLCAwLCAxLA0KLSAgICAxLCAwLCAxLCAxLCAxLCAwLCAxLA0KLSAgICAxLCAwLCAxLCAxLCAxLCAwLCAxLA0KLSAgICAxLCAwLCAwLCAwLCAwLCAwLCAxLA0KLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxDQotfTsNCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMCwgMSwgMSwgMCwgMSwgMSwNCisgICAgMSwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07DQogY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkhPUklaT05UQUxfU0VQQVJBVElPTl9QQVRURVJOWzFdWzhdID0gew0KLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwDQotfTsNCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07DQogY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlZFUlRJQ0FMX1NFUEFSQVRJT05fUEFUVEVSTls3XVsxXSA9IHsNCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMA0KLX07DQorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDB9Ow0KIGNvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpQT1NJVElPTl9BREpVU1RNRU5UX1BBVFRFUk5bNV1bNV0gPSB7DQotICAgIDEsIDEsIDEsIDEsIDEsDQotICAgIDEsIDAsIDAsIDAsIDEsDQotICAgIDEsIDAsIDEsIDAsIDEsDQotICAgIDEsIDAsIDAsIDAsIDEsDQotICAgIDEsIDEsIDEsIDEsIDENCi19Ow0KLWNvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpQT1NJVElPTl9BREpVU1RNRU5UX1BBVFRFUk5fQ09PUkRJTkFURV9UQUJMRVs0MF1bN10gPSB7DQotICAgIHsgLTEsIC0xLCAtMSwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDE4LCAtMSwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDIyLCAtMSwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDI2LCAtMSwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDMwLCAtMSwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDM0LCAtMSwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDIyLCAzOCwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDI0LCA0MiwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDI2LCA0NiwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDI4LCA1MCwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDMwLCA1NCwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDMyLCA1OCwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDM0LCA2MiwgLTEsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDI2LCA0NiwgNjYsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDI2LCA0OCwgNzAsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDI2LCA1MCwgNzQsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDMwLCA1NCwgNzgsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDMwLCA1NiwgODIsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDMwLCA1OCwgODYsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDM0LCA2MiwgOTAsICAtMSwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDI4LCA1MCwgNzIsICA5NCwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDI2LCA1MCwgNzQsICA5OCwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDMwLCA1NCwgNzgsIDEwMiwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDI4LCA1NCwgODAsIDEwNiwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDMyLCA1OCwgODQsIDExMCwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDMwLCA1OCwgODYsIDExNCwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDM0LCA2MiwgOTAsIDExOCwgIC0xLCAgLTF9LA0KLSAgICB7IDYsIDI2LCA1MCwgNzQsICA5OCwgMTIyLCAgLTF9LA0KLSAgICB7IDYsIDMwLCA1NCwgNzgsIDEwMiwgMTI2LCAgLTF9LA0KLSAgICB7IDYsIDI2LCA1MiwgNzgsIDEwNCwgMTMwLCAgLTF9LA0KLSAgICB7IDYsIDMwLCA1NiwgODIsIDEwOCwgMTM0LCAgLTF9LA0KLSAgICB7IDYsIDM0LCA2MCwgODYsIDExMiwgMTM4LCAgLTF9LA0KLSAgICB7IDYsIDMwLCA1OCwgODYsIDExNCwgMTQyLCAgLTF9LA0KLSAgICB7IDYsIDM0LCA2MiwgOTAsIDExOCwgMTQ2LCAgLTF9LA0KLSAgICB7IDYsIDMwLCA1NCwgNzgsIDEwMiwgMTI2LCAxNTB9LA0KLSAgICB7IDYsIDI0LCA1MCwgNzYsIDEwMiwgMTI4LCAxNTR9LA0KLSAgICB7IDYsIDI4LCA1NCwgODAsIDEwNiwgMTMyLCAxNTh9LA0KLSAgICB7IDYsIDMyLCA1OCwgODQsIDExMCwgMTM2LCAxNjJ9LA0KLSAgICB7IDYsIDI2LCA1NCwgODIsIDExMCwgMTM4LCAxNjZ9LA0KLSAgICB7IDYsIDMwLCA1OCwgODYsIDExNCwgMTQyLCAxNzB9LA0KKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAwLCAxLCAwLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxfTsNCitjb25zdCBpbnQzMl90DQorICAgIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6UE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbNDBdWzddID0NCisgICAgICAgIHsNCisgICAgICAgICAgICB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCAgIHs2LCAxOCwgLTEsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMjIsIC0xLCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNiwgLTEsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIC0xLCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAzNCwgLTEsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMjIsIDM4LCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNCwgNDIsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMjYsIDQ2LCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyOCwgNTAsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU0LCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAzMiwgNTgsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzQsIDYyLCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNiwgNDYsIDY2LCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMjYsIDQ4LCA3MCwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNiwgNTAsIDc0LCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU0LCA3OCwgLTEsIC0xLCAtMX0sICAgIHs2LCAzMCwgNTYsIDgyLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU4LCA4NiwgLTEsIC0xLCAtMX0sICAgIHs2LCAzNCwgNjIsIDkwLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMjgsIDUwLCA3MiwgOTQsIC0xLCAtMX0sICAgIHs2LCAyNiwgNTAsIDc0LCA5OCwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU0LCA3OCwgMTAyLCAtMSwgLTF9LCAgIHs2LCAyOCwgNTQsIDgwLCAxMDYsIC0xLCAtMX0sDQorICAgICAgICAgICAgezYsIDMyLCA1OCwgODQsIDExMCwgLTEsIC0xfSwgICB7NiwgMzAsIDU4LCA4NiwgMTE0LCAtMSwgLTF9LA0KKyAgICAgICAgICAgIHs2LCAzNCwgNjIsIDkwLCAxMTgsIC0xLCAtMX0sICAgezYsIDI2LCA1MCwgNzQsIDk4LCAxMjIsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU0LCA3OCwgMTAyLCAxMjYsIC0xfSwgIHs2LCAyNiwgNTIsIDc4LCAxMDQsIDEzMCwgLTF9LA0KKyAgICAgICAgICAgIHs2LCAzMCwgNTYsIDgyLCAxMDgsIDEzNCwgLTF9LCAgezYsIDM0LCA2MCwgODYsIDExMiwgMTM4LCAtMX0sDQorICAgICAgICAgICAgezYsIDMwLCA1OCwgODYsIDExNCwgMTQyLCAtMX0sICB7NiwgMzQsIDYyLCA5MCwgMTE4LCAxNDYsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU0LCA3OCwgMTAyLCAxMjYsIDE1MH0sIHs2LCAyNCwgNTAsIDc2LCAxMDIsIDEyOCwgMTU0fSwNCisgICAgICAgICAgICB7NiwgMjgsIDU0LCA4MCwgMTA2LCAxMzIsIDE1OH0sIHs2LCAzMiwgNTgsIDg0LCAxMTAsIDEzNiwgMTYyfSwNCisgICAgICAgICAgICB7NiwgMjYsIDU0LCA4MiwgMTEwLCAxMzgsIDE2Nn0sIHs2LCAzMCwgNTgsIDg2LCAxMTQsIDE0MiwgMTcwfSwNCiB9Ow0KIGNvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpUWVBFX0lORk9fQ09PUkRJTkFURVNbMTVdWzJdID0gew0KLSAgICB7OCwgMH0sDQotICAgIHs4LCAxfSwNCi0gICAgezgsIDJ9LA0KLSAgICB7OCwgM30sDQotICAgIHs4LCA0fSwNCi0gICAgezgsIDV9LA0KLSAgICB7OCwgN30sDQotICAgIHs4LCA4fSwNCi0gICAgezcsIDh9LA0KLSAgICB7NSwgOH0sDQotICAgIHs0LCA4fSwNCi0gICAgezMsIDh9LA0KLSAgICB7MiwgOH0sDQotICAgIHsxLCA4fSwNCi0gICAgezAsIDh9LA0KKyAgICB7OCwgMH0sIHs4LCAxfSwgezgsIDJ9LCB7OCwgM30sIHs4LCA0fSwgezgsIDV9LCB7OCwgN30sIHs4LCA4fSwNCisgICAgezcsIDh9LCB7NSwgOH0sIHs0LCA4fSwgezMsIDh9LCB7MiwgOH0sIHsxLCA4fSwgezAsIDh9LA0KIH07DQogY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlZFUlNJT05fSU5GT19QT0xZID0gMHgxZjI1Ow0KIGNvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpUWVBFX0lORk9fUE9MWSA9IDB4MDUzNzsNCiBjb25zdCBpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6VFlQRV9JTkZPX01BU0tfUEFUVEVSTiA9IDB4NTQxMjsNCi12b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6Q2xlYXJNYXRyaXgoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKG1hdHJpeCA9PSBOVUxMKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotICAgIG1hdHJpeC0+Y2xlYXIoKHVpbnQ4X3QpIC0gMSk7DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkNsZWFyTWF0cml4KENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtYXRyaXggPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBtYXRyaXgtPmNsZWFyKCh1aW50OF90KS0xKTsNCiB9DQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkJ1aWxkTWF0cml4KENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uLCBpbnQzMl90IG1hc2tQYXR0ZXJuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYobWF0cml4ID09IE5VTEwpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgQ2xlYXJNYXRyaXgobWF0cml4LCBlKTsNCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoDQorICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgaW50MzJfdCB2ZXJzaW9uLA0KKyAgICBpbnQzMl90IG1hc2tQYXR0ZXJuLA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBFbWJlZEJhc2ljUGF0dGVybnModmVyc2lvbiwgbWF0cml4LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIEVtYmVkVHlwZUluZm8oZWNMZXZlbCwgbWFza1BhdHRlcm4sIG1hdHJpeCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBNYXliZUVtYmVkVmVyc2lvbkluZm8odmVyc2lvbiwgbWF0cml4LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIEVtYmVkRGF0YUJpdHMoZGF0YUJpdHMsIG1hc2tQYXR0ZXJuLCBtYXRyaXgsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIENsZWFyTWF0cml4KG1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIEVtYmVkQmFzaWNQYXR0ZXJucyh2ZXJzaW9uLCBtYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBFbWJlZFR5cGVJbmZvKGVjTGV2ZWwsIG1hc2tQYXR0ZXJuLCBtYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBNYXliZUVtYmVkVmVyc2lvbkluZm8odmVyc2lvbiwgbWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgRW1iZWREYXRhQml0cyhkYXRhQml0cywgbWFza1BhdHRlcm4sIG1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCiB9DQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkQmFzaWNQYXR0ZXJucyhpbnQzMl90IHZlcnNpb24sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihtYXRyaXggPT0gTlVMTCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLSAgICBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybnNBbmRTZXBhcmF0b3JzKG1hdHJpeCwgZSk7DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkQmFzaWNQYXR0ZXJucyhpbnQzMl90IHZlcnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgRW1iZWREYXJrRG90QXRMZWZ0Qm90dG9tQ29ybmVyKG1hdHJpeCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBNYXliZUVtYmVkUG9zaXRpb25BZGp1c3RtZW50UGF0dGVybnModmVyc2lvbiwgbWF0cml4LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIEVtYmVkVGltaW5nUGF0dGVybnMobWF0cml4LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybnNBbmRTZXBhcmF0b3JzKG1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIEVtYmVkRGFya0RvdEF0TGVmdEJvdHRvbUNvcm5lcihtYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBNYXliZUVtYmVkUG9zaXRpb25BZGp1c3RtZW50UGF0dGVybnModmVyc2lvbiwgbWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgRW1iZWRUaW1pbmdQYXR0ZXJucyhtYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQogfQ0KLXZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFR5cGVJbmZvKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQotICAgICAgICBpbnQzMl90IG1hc2tQYXR0ZXJuLCBDQkNfQ29tbW9uQnl0ZU1hdHJpeCAqbWF0cml4LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYobWF0cml4ID09IE5VTEwpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgdHlwZUluZm9CaXRzOw0KLSAgICB0eXBlSW5mb0JpdHMuSW5pdCgpOw0KLSAgICBNYWtlVHlwZUluZm9CaXRzKGVjTGV2ZWwsIG1hc2tQYXR0ZXJuLCAmdHlwZUluZm9CaXRzLCBlKTsNCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRUeXBlSW5mbygNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgaW50MzJfdCBtYXNrUGF0dGVybiwNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCB0eXBlSW5mb0JpdHMuU2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgYml0ID0gdHlwZUluZm9CaXRzLkF0KHR5cGVJbmZvQml0cy5TaXplKCkgLSAxIC0gaSwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIGludDMyX3QgeDEgPSBUWVBFX0lORk9fQ09PUkRJTkFURVNbaV1bMF07DQotICAgICAgICBpbnQzMl90IHkxID0gVFlQRV9JTkZPX0NPT1JESU5BVEVTW2ldWzFdOw0KLSAgICAgICAgbWF0cml4LT5TZXQoeDEsIHkxLCBiaXQpOw0KLSAgICAgICAgaWYoaSA8IDgpIHsNCi0gICAgICAgICAgICBpbnQzMl90IHgyID0gbWF0cml4LT5HZXRXaWR0aCgpIC0gaSAtIDE7DQotICAgICAgICAgICAgaW50MzJfdCB5MiA9IDg7DQotICAgICAgICAgICAgbWF0cml4LT5TZXQoeDIsIHkyLCBiaXQpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpbnQzMl90IHgyID0gODsNCi0gICAgICAgICAgICBpbnQzMl90IHkyID0gbWF0cml4LT5HZXRIZWlnaHQoKSAtIDcgKyAoaSAtIDgpOw0KLSAgICAgICAgICAgIG1hdHJpeC0+U2V0KHgyLCB5MiwgYml0KTsNCi0gICAgICAgIH0NCisgIH0NCisgIENCQ19RUkNvZGVyQml0VmVjdG9yIHR5cGVJbmZvQml0czsNCisgIHR5cGVJbmZvQml0cy5Jbml0KCk7DQorICBNYWtlVHlwZUluZm9CaXRzKGVjTGV2ZWwsIG1hc2tQYXR0ZXJuLCAmdHlwZUluZm9CaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdHlwZUluZm9CaXRzLlNpemUoKTsgaSsrKSB7DQorICAgIGludDMyX3QgYml0ID0gdHlwZUluZm9CaXRzLkF0KHR5cGVJbmZvQml0cy5TaXplKCkgLSAxIC0gaSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBpbnQzMl90IHgxID0gVFlQRV9JTkZPX0NPT1JESU5BVEVTW2ldWzBdOw0KKyAgICBpbnQzMl90IHkxID0gVFlQRV9JTkZPX0NPT1JESU5BVEVTW2ldWzFdOw0KKyAgICBtYXRyaXgtPlNldCh4MSwgeTEsIGJpdCk7DQorICAgIGlmIChpIDwgOCkgew0KKyAgICAgIGludDMyX3QgeDIgPSBtYXRyaXgtPkdldFdpZHRoKCkgLSBpIC0gMTsNCisgICAgICBpbnQzMl90IHkyID0gODsNCisgICAgICBtYXRyaXgtPlNldCh4MiwgeTIsIGJpdCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaW50MzJfdCB4MiA9IDg7DQorICAgICAgaW50MzJfdCB5MiA9IG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSA3ICsgKGkgLSA4KTsNCisgICAgICBtYXRyaXgtPlNldCh4MiwgeTIsIGJpdCk7DQogICAgIH0NCisgIH0NCiB9DQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6Ok1heWJlRW1iZWRWZXJzaW9uSW5mbyhpbnQzMl90IHZlcnNpb24sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihtYXRyaXggPT0gTlVMTCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLSAgICBpZih2ZXJzaW9uIDwgNykgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENCQ19RUkNvZGVyQml0VmVjdG9yIHZlcnNpb25JbmZvQml0czsNCi0gICAgdmVyc2lvbkluZm9CaXRzLkluaXQoKTsNCi0gICAgTWFrZVZlcnNpb25JbmZvQml0cyh2ZXJzaW9uLCAmdmVyc2lvbkluZm9CaXRzLCBlKTsNCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6TWF5YmVFbWJlZFZlcnNpb25JbmZvKGludDMyX3QgdmVyc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBpbnQzMl90IGJpdEluZGV4ID0gNiAqIDMgLSAxOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IDY7IGkrKykgew0KLSAgICAgICAgZm9yKGludDMyX3QgaiA9IDA7IGogPCAzOyBqKyspIHsNCi0gICAgICAgICAgICBpbnQzMl90IGJpdCA9IHZlcnNpb25JbmZvQml0cy5BdChiaXRJbmRleCwgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICAgICAgYml0SW5kZXgtLTsNCi0gICAgICAgICAgICBtYXRyaXgtPlNldChpLCBtYXRyaXgtPkdldEhlaWdodCgpIC0gMTEgKyBqLCBiaXQpOw0KLSAgICAgICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSAxMSArIGosIGksIGJpdCk7DQotICAgICAgICB9DQorICB9DQorICBpZiAodmVyc2lvbiA8IDcpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgdmVyc2lvbkluZm9CaXRzOw0KKyAgdmVyc2lvbkluZm9CaXRzLkluaXQoKTsNCisgIE1ha2VWZXJzaW9uSW5mb0JpdHModmVyc2lvbiwgJnZlcnNpb25JbmZvQml0cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGludDMyX3QgYml0SW5kZXggPSA2ICogMyAtIDE7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA2OyBpKyspIHsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgMzsgaisrKSB7DQorICAgICAgaW50MzJfdCBiaXQgPSB2ZXJzaW9uSW5mb0JpdHMuQXQoYml0SW5kZXgsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIGJpdEluZGV4LS07DQorICAgICAgbWF0cml4LT5TZXQoaSwgbWF0cml4LT5HZXRIZWlnaHQoKSAtIDExICsgaiwgYml0KTsNCisgICAgICBtYXRyaXgtPlNldChtYXRyaXgtPkdldEhlaWdodCgpIC0gMTEgKyBqLCBpLCBiaXQpOw0KICAgICB9DQorICB9DQogfQ0KIHZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZERhdGFCaXRzKENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywNCi0gICAgICAgIGludDMyX3QgbWFza1BhdHRlcm4sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihtYXRyaXggPT0gTlVMTCB8fCBkYXRhQml0cyA9PSBOVUxMKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWFza1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwgfHwgZGF0YUJpdHMgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpbnQzMl90IGJpdEluZGV4ID0gMDsNCisgIGludDMyX3QgZGlyZWN0aW9uID0gLTE7DQorICBpbnQzMl90IHggPSBtYXRyaXgtPkdldFdpZHRoKCkgLSAxOw0KKyAgaW50MzJfdCB5ID0gbWF0cml4LT5HZXRIZWlnaHQoKSAtIDE7DQorICB3aGlsZSAoeCA+IDApIHsNCisgICAgaWYgKHggPT0gNikgew0KKyAgICAgIHggLT0gMTsNCiAgICAgfQ0KLSAgICBpbnQzMl90IGJpdEluZGV4ID0gMDsNCi0gICAgaW50MzJfdCBkaXJlY3Rpb24gPSAtMTsNCi0gICAgaW50MzJfdCB4ID0gbWF0cml4LT5HZXRXaWR0aCgpIC0gMTsNCi0gICAgaW50MzJfdCB5ID0gbWF0cml4LT5HZXRIZWlnaHQoKSAtIDE7DQotICAgIHdoaWxlKHggPiAwKSB7DQotICAgICAgICBpZiAoeCA9PSA2KSB7DQotICAgICAgICAgICAgeCAtPSAxOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2hpbGUoeSA+PSAwICYmIHkgPCBtYXRyaXgtPkdldEhlaWdodCgpKSB7DQotICAgICAgICAgICAgaWYgKHkgPT0gNikgew0KLSAgICAgICAgICAgICAgICB5ICs9IGRpcmVjdGlvbjsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgMjsgaSsrKSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgeHggPSB4IC0gaTsNCi0gICAgICAgICAgICAgICAgaWYoIUlzRW1wdHkobWF0cml4LT5HZXQoeHgsIHkpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaW50MzJfdCBiaXQ7DQotICAgICAgICAgICAgICAgIGlmKGJpdEluZGV4IDwgZGF0YUJpdHMtPlNpemUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYml0ID0gZGF0YUJpdHMtPkF0KGJpdEluZGV4LCBlKTsNCi0gICAgICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgYml0SW5kZXgrKzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGJpdCA9IDA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYoIG1hc2tQYXR0ZXJuICE9IC0xKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJvbCA9IENCQ19RUkNvZGVyTWFza1V0aWw6OkdldERhdGFNYXNrQml0KG1hc2tQYXR0ZXJuLCB4eCwgeSwgZSk7DQotICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGJvbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJpdCBePSAweDAxOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1hdHJpeC0+U2V0KHh4LCB5LCBiaXQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB5ICs9IGRpcmVjdGlvbjsNCi0gICAgICAgIH0NCi0gICAgICAgIGRpcmVjdGlvbiA9IC1kaXJlY3Rpb247DQorICAgIHdoaWxlICh5ID49IDAgJiYgeSA8IG1hdHJpeC0+R2V0SGVpZ2h0KCkpIHsNCisgICAgICBpZiAoeSA9PSA2KSB7DQogICAgICAgICB5ICs9IGRpcmVjdGlvbjsNCi0gICAgICAgIHggLT0gMjsNCi0gICAgfQ0KLSAgICBpZihiaXRJbmRleCAhPSBkYXRhQml0cy0+U2l6ZSgpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi19DQotaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkNhbGN1bGF0ZUJDSENvZGUoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCBwb2x5KQ0KLXsNCi0gICAgaW50MzJfdCBtc2JTZXRJblBvbHkgPSBGaW5kTVNCU2V0KHBvbHkpOw0KLSAgICB2YWx1ZSA8PD0gbXNiU2V0SW5Qb2x5IC0gMTsNCi0gICAgd2hpbGUoRmluZE1TQlNldCh2YWx1ZSkgPj0gbXNiU2V0SW5Qb2x5KSB7DQotICAgICAgICB2YWx1ZSBePSBwb2x5IDw8IChGaW5kTVNCU2V0KHZhbHVlKSAtIG1zYlNldEluUG9seSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHZhbHVlOw0KLX0NCi12b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6TWFrZVR5cGVJbmZvQml0cyhDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KLSAgICAgICAgaW50MzJfdCBtYXNrUGF0dGVybiwgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihiaXRzID09IE5VTEwpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgaWYoIUNCQ19RUkNvZGVyOjpJc1ZhbGlkTWFza1BhdHRlcm4obWFza1BhdHRlcm4pKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25CYWRNYXNrOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgaW50MzJfdCB0eXBlSW5mbyA9IChlY0xldmVsLT5HZXRCaXRzKCkgPDwgMykgfCBtYXNrUGF0dGVybjsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIGJpdHMtPkFwcGVuZEJpdHModHlwZUluZm8sIDUsIGUpOw0KLSAgICBpbnQzMl90IGJjaENvZGUgPSBDYWxjdWxhdGVCQ0hDb2RlKHR5cGVJbmZvLCBUWVBFX0lORk9fUE9MWSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBiaXRzLT5BcHBlbmRCaXRzKGJjaENvZGUsIDEwLCBlKTsNCi0gICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgbWFza0JpdHM7DQotICAgIG1hc2tCaXRzLkluaXQoKTsNCi0gICAgbWFza0JpdHMuQXBwZW5kQml0cyhUWVBFX0lORk9fTUFTS19QQVRURVJOLCAxNSwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBiaXRzLT5YT1IoJm1hc2tCaXRzLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIGlmKGJpdHMtPlNpemUoKSAhPSAxNSkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uQml0U2l6ZU5vdDE1Ow0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi19DQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6Ok1ha2VWZXJzaW9uSW5mb0JpdHMoaW50MzJfdCB2ZXJzaW9uLCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKGJpdHMgPT0gTlVMTCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLSAgICBiaXRzLT5BcHBlbmRCaXRzKHZlcnNpb24sIDYsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgaW50MzJfdCBiY2hDb2RlID0gQ2FsY3VsYXRlQkNIQ29kZSh2ZXJzaW9uLCBWRVJTSU9OX0lORk9fUE9MWSk7DQotICAgIGJpdHMtPkFwcGVuZEJpdHMoYmNoQ29kZSwgMTIsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgaWYoYml0cy0+U2l6ZSgpICE9IDE4KSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25CaXRTaXplTm90MTg7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6SXNFbXB0eShpbnQzMl90IHZhbHVlKQ0KLXsNCi0gICAgcmV0dXJuICh1aW50OF90KXZhbHVlID09IDB4ZmY7DQotfQ0KLUZYX0JPT0wgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpJc1ZhbGlkVmFsdWUoaW50MzJfdCB2YWx1ZSkNCi17DQotICAgIHJldHVybiAoKHVpbnQ4X3QpdmFsdWUgPT0gMHhmZiB8fCAodWludDhfdCl2YWx1ZSA9PSAweDAwIHx8ICh1aW50OF90KXZhbHVlID09IDB4MDEpOw0KLX0NCi12b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRUaW1pbmdQYXR0ZXJucyhDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYobWF0cml4ID09IE5VTEwpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgZm9yKGludDMyX3QgaSA9IDg7IGkgPCBtYXRyaXgtPkdldFdpZHRoKCkgLSA4OyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgYml0ID0gKGkgKyAxKSAlIDI7DQotICAgICAgICBpZighSXNWYWxpZFZhbHVlKG1hdHJpeC0+R2V0KGksIDYpKSkgew0KLSAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVJbWFnZURhdGE7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjsgaSsrKSB7DQorICAgICAgICBpbnQzMl90IHh4ID0geCAtIGk7DQorICAgICAgICBpZiAoIUlzRW1wdHkobWF0cml4LT5HZXQoeHgsIHkpKSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmKElzRW1wdHkobWF0cml4LT5HZXQoaSAsIDYpKSkgew0KLSAgICAgICAgICAgIG1hdHJpeC0+U2V0KGksIDYsIGJpdCk7DQorICAgICAgICBpbnQzMl90IGJpdDsNCisgICAgICAgIGlmIChiaXRJbmRleCA8IGRhdGFCaXRzLT5TaXplKCkpIHsNCisgICAgICAgICAgYml0ID0gZGF0YUJpdHMtPkF0KGJpdEluZGV4LCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICAgIGJpdEluZGV4Kys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiaXQgPSAwOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYoIUlzVmFsaWRWYWx1ZShtYXRyaXgtPkdldCg2LCBpKSkpIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlSW1hZ2VEYXRhOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgaWYgKG1hc2tQYXR0ZXJuICE9IC0xKSB7DQorICAgICAgICAgIEZYX0JPT0wgYm9sID0NCisgICAgICAgICAgICAgIENCQ19RUkNvZGVyTWFza1V0aWw6OkdldERhdGFNYXNrQml0KG1hc2tQYXR0ZXJuLCB4eCwgeSwgZSk7DQorICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgICAgICBpZiAoYm9sKSB7DQorICAgICAgICAgICAgYml0IF49IDB4MDE7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCi0gICAgICAgIGlmKElzRW1wdHkobWF0cml4LT5HZXQoNiwgaSkpKSB7DQotICAgICAgICAgICAgbWF0cml4LT5TZXQoNiwgaSwgYml0KTsNCi0gICAgICAgIH0NCisgICAgICAgIG1hdHJpeC0+U2V0KHh4LCB5LCBiaXQpOw0KKyAgICAgIH0NCisgICAgICB5ICs9IGRpcmVjdGlvbjsNCiAgICAgfQ0KKyAgICBkaXJlY3Rpb24gPSAtZGlyZWN0aW9uOw0KKyAgICB5ICs9IGRpcmVjdGlvbjsNCisgICAgeCAtPSAyOw0KKyAgfQ0KKyAgaWYgKGJpdEluZGV4ICE9IGRhdGFCaXRzLT5TaXplKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KIH0NCi12b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWREYXJrRG90QXRMZWZ0Qm90dG9tQ29ybmVyKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihtYXRyaXggPT0gTlVMTCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQoraW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkNhbGN1bGF0ZUJDSENvZGUoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCBwb2x5KSB7DQorICBpbnQzMl90IG1zYlNldEluUG9seSA9IEZpbmRNU0JTZXQocG9seSk7DQorICB2YWx1ZSA8PD0gbXNiU2V0SW5Qb2x5IC0gMTsNCisgIHdoaWxlIChGaW5kTVNCU2V0KHZhbHVlKSA+PSBtc2JTZXRJblBvbHkpIHsNCisgICAgdmFsdWUgXj0gcG9seSA8PCAoRmluZE1TQlNldCh2YWx1ZSkgLSBtc2JTZXRJblBvbHkpOw0KKyAgfQ0KKyAgcmV0dXJuIHZhbHVlOw0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6TWFrZVR5cGVJbmZvQml0cygNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgaW50MzJfdCBtYXNrUGF0dGVybiwNCisgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChiaXRzID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgaWYgKCFDQkNfUVJDb2Rlcjo6SXNWYWxpZE1hc2tQYXR0ZXJuKG1hc2tQYXR0ZXJuKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25CYWRNYXNrOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGludDMyX3QgdHlwZUluZm8gPSAoZWNMZXZlbC0+R2V0Qml0cygpIDw8IDMpIHwgbWFza1BhdHRlcm47DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGJpdHMtPkFwcGVuZEJpdHModHlwZUluZm8sIDUsIGUpOw0KKyAgaW50MzJfdCBiY2hDb2RlID0gQ2FsY3VsYXRlQkNIQ29kZSh0eXBlSW5mbywgVFlQRV9JTkZPX1BPTFkpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBiaXRzLT5BcHBlbmRCaXRzKGJjaENvZGUsIDEwLCBlKTsNCisgIENCQ19RUkNvZGVyQml0VmVjdG9yIG1hc2tCaXRzOw0KKyAgbWFza0JpdHMuSW5pdCgpOw0KKyAgbWFza0JpdHMuQXBwZW5kQml0cyhUWVBFX0lORk9fTUFTS19QQVRURVJOLCAxNSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGJpdHMtPlhPUigmbWFza0JpdHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBpZiAoYml0cy0+U2l6ZSgpICE9IDE1KSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkJpdFNpemVOb3QxNTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpNYWtlVmVyc2lvbkluZm9CaXRzKGludDMyX3QgdmVyc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoYml0cyA9PSBOVUxMKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGJpdHMtPkFwcGVuZEJpdHModmVyc2lvbiwgNiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGludDMyX3QgYmNoQ29kZSA9IENhbGN1bGF0ZUJDSENvZGUodmVyc2lvbiwgVkVSU0lPTl9JTkZPX1BPTFkpOw0KKyAgYml0cy0+QXBwZW5kQml0cyhiY2hDb2RlLCAxMiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGlmIChiaXRzLT5TaXplKCkgIT0gMTgpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQml0U2l6ZU5vdDE4Ow0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCit9DQorRlhfQk9PTCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OklzRW1wdHkoaW50MzJfdCB2YWx1ZSkgew0KKyAgcmV0dXJuICh1aW50OF90KXZhbHVlID09IDB4ZmY7DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpJc1ZhbGlkVmFsdWUoaW50MzJfdCB2YWx1ZSkgew0KKyAgcmV0dXJuICgodWludDhfdCl2YWx1ZSA9PSAweGZmIHx8ICh1aW50OF90KXZhbHVlID09IDB4MDAgfHwNCisgICAgICAgICAgKHVpbnQ4X3QpdmFsdWUgPT0gMHgwMSk7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFRpbWluZ1BhdHRlcm5zKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gODsgaSA8IG1hdHJpeC0+R2V0V2lkdGgoKSAtIDg7IGkrKykgew0KKyAgICBpbnQzMl90IGJpdCA9IChpICsgMSkgJSAyOw0KKyAgICBpZiAoIUlzVmFsaWRWYWx1ZShtYXRyaXgtPkdldChpLCA2KSkpIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlSW1hZ2VEYXRhOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIGlmIChJc0VtcHR5KG1hdHJpeC0+R2V0KGksIDYpKSkgew0KKyAgICAgIG1hdHJpeC0+U2V0KGksIDYsIGJpdCk7DQorICAgIH0NCisgICAgaWYgKCFJc1ZhbGlkVmFsdWUobWF0cml4LT5HZXQoNiwgaSkpKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUltYWdlRGF0YTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBpZiAoSXNFbXB0eShtYXRyaXgtPkdldCg2LCBpKSkpIHsNCisgICAgICBtYXRyaXgtPlNldCg2LCBpLCBiaXQpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZERhcmtEb3RBdExlZnRCb3R0b21Db3JuZXIoDQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtYXRyaXggPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpZiAobWF0cml4LT5HZXQoOCwgbWF0cml4LT5HZXRIZWlnaHQoKSAtIDgpID09IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSGVpZ2h0XzhCZVplcm87DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgbWF0cml4LT5TZXQoOCwgbWF0cml4LT5HZXRIZWlnaHQoKSAtIDgsIDEpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4oDQorICAgIGludDMyX3QgeFN0YXJ0LA0KKyAgICBpbnQzMl90IHlTdGFydCwNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IDg7IHgrKykgew0KKyAgICBpZiAoIUlzRW1wdHkobWF0cml4LT5HZXQoeFN0YXJ0ICsgeCwgeVN0YXJ0KSkpIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlRGF0YTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKQ0KKyAgICB9DQorICAgIG1hdHJpeC0+U2V0KHhTdGFydCArIHgsIHlTdGFydCwgSE9SSVpPTlRBTF9TRVBBUkFUSU9OX1BBVFRFUk5bMF1beF0pOw0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRWZXJ0aWNhbFNlcGFyYXRpb25QYXR0ZXJuKA0KKyAgICBpbnQzMl90IHhTdGFydCwNCisgICAgaW50MzJfdCB5U3RhcnQsDQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtYXRyaXggPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCA3OyB5KyspIHsNCisgICAgaWYgKCFJc0VtcHR5KG1hdHJpeC0+R2V0KHhTdGFydCwgeVN0YXJ0ICsgeSkpKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGE7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgbWF0cml4LT5TZXQoeFN0YXJ0LCB5U3RhcnQgKyB5LCBWRVJUSUNBTF9TRVBBUkFUSU9OX1BBVFRFUk5beV1bMF0pOw0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJuKA0KKyAgICBpbnQzMl90IHhTdGFydCwNCisgICAgaW50MzJfdCB5U3RhcnQsDQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtYXRyaXggPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCA1OyB5KyspIHsNCisgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgNTsgeCsrKSB7DQorICAgICAgaWYgKCFJc0VtcHR5KG1hdHJpeC0+R2V0KHhTdGFydCArIHgsIHkgKyB5U3RhcnQpKSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGE7DQogICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICB9DQorICAgICAgbWF0cml4LT5TZXQoeFN0YXJ0ICsgeCwgeVN0YXJ0ICsgeSwgUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOW3ldW3hdKTsNCiAgICAgfQ0KLSAgICBpZihtYXRyaXgtPkdldCg4LCBtYXRyaXgtPkdldEhlaWdodCgpIC0gOCkgPT0gMCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSGVpZ2h0XzhCZVplcm87DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybigNCisgICAgaW50MzJfdCB4U3RhcnQsDQorICAgIGludDMyX3QgeVN0YXJ0LA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgNzsgeSsrKSB7DQorICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IDc7IHgrKykgew0KKyAgICAgIGlmICghSXNFbXB0eShtYXRyaXgtPkdldCh4U3RhcnQgKyB4LCB5U3RhcnQgKyB5KSkpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVEYXRhOw0KICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgfQ0KKyAgICAgIG1hdHJpeC0+U2V0KHhTdGFydCArIHgsIHlTdGFydCArIHksIFBPU0lUSU9OX0RFVEVDVElPTl9QQVRURVJOW3ldW3hdKTsNCiAgICAgfQ0KLSAgICBtYXRyaXgtPlNldCg4LCBtYXRyaXgtPkdldEhlaWdodCgpIC0gOCwgMSk7DQorICB9DQogfQ0KLXZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZEhvcml6b250YWxTZXBhcmF0aW9uUGF0dGVybihpbnQzMl90IHhTdGFydCwgaW50MzJfdCB5U3RhcnQsDQotICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYobWF0cml4ID09IE5VTEwpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybnNBbmRTZXBhcmF0b3JzKA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgaW50MzJfdCBwZHBXaWR0aCA9IDc7DQorICBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybigwLCAwLCBtYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybihtYXRyaXgtPkdldFdpZHRoKCkgLSBwZHBXaWR0aCwgMCwgbWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4oMCwgbWF0cml4LT5HZXRXaWR0aCgpIC0gcGRwV2lkdGgsIG1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGludDMyX3QgaHNwV2lkdGggPSA4Ow0KKyAgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4oMCwgaHNwV2lkdGggLSAxLCBtYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBFbWJlZEhvcml6b250YWxTZXBhcmF0aW9uUGF0dGVybihtYXRyaXgtPkdldFdpZHRoKCkgLSBoc3BXaWR0aCwgaHNwV2lkdGggLSAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4oMCwgbWF0cml4LT5HZXRXaWR0aCgpIC0gaHNwV2lkdGgsIG1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGludDMyX3QgdnNwU2l6ZSA9IDc7DQorICBFbWJlZFZlcnRpY2FsU2VwYXJhdGlvblBhdHRlcm4odnNwU2l6ZSwgMCwgbWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgRW1iZWRWZXJ0aWNhbFNlcGFyYXRpb25QYXR0ZXJuKG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSB2c3BTaXplIC0gMSwgMCwgbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBFbWJlZFZlcnRpY2FsU2VwYXJhdGlvblBhdHRlcm4odnNwU2l6ZSwgbWF0cml4LT5HZXRIZWlnaHQoKSAtIHZzcFNpemUsIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6TWF5YmVFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm5zKA0KKyAgICBpbnQzMl90IHZlcnNpb24sDQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtYXRyaXggPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpZiAodmVyc2lvbiA8IDIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpbmRleCA9IHZlcnNpb24gLSAxOw0KKyAgaW50MzJfdCBjb25zdCogY29vcmRpbmF0ZXMgPQ0KKyAgICAgICYoUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbaW5kZXhdWzBdKTsNCisgIGludDMyX3QgbnVtQ29vcmRpbmF0ZSA9IDc7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1Db29yZGluYXRlOyBpKyspIHsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtQ29vcmRpbmF0ZTsgaisrKSB7DQorICAgICAgaW50MzJfdCB5ID0gY29vcmRpbmF0ZXNbaV07DQorICAgICAgaW50MzJfdCB4ID0gY29vcmRpbmF0ZXNbal07DQorICAgICAgaWYgKHggPT0gLTEgfHwgeSA9PSAtMSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChJc0VtcHR5KG1hdHJpeC0+R2V0KHgsIHkpKSkgew0KKyAgICAgICAgRW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJuKHggLSAyLCB5IC0gMiwgbWF0cml4LCBlKTsNCiAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBmb3IoaW50MzJfdCB4ID0gMDsgeCA8IDg7IHgrKykgew0KLSAgICAgICAgaWYoIUlzRW1wdHkobWF0cml4LT5HZXQoeFN0YXJ0ICsgeCwgeVN0YXJ0KSkpIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlRGF0YTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKQ0KLSAgICAgICAgfQ0KLSAgICAgICAgbWF0cml4LT5TZXQoeFN0YXJ0ICsgeCwgeVN0YXJ0LCBIT1JJWk9OVEFMX1NFUEFSQVRJT05fUEFUVEVSTlswXVt4XSk7DQotICAgIH0NCisgIH0NCiB9DQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybihpbnQzMl90IHhTdGFydCwgaW50MzJfdCB5U3RhcnQsDQotICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYobWF0cml4ID09IE5VTEwpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCA3OyB5KyspIHsNCi0gICAgICAgIGlmKCFJc0VtcHR5KG1hdHJpeC0+R2V0KHhTdGFydCwgeVN0YXJ0ICsgeSkpKSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGE7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICB9DQotICAgICAgICBtYXRyaXgtPlNldCh4U3RhcnQsIHlTdGFydCArIHksIFZFUlRJQ0FMX1NFUEFSQVRJT05fUEFUVEVSTlt5XVswXSk7DQotICAgIH0NCitpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RmluZE1TQlNldChpbnQzMl90IHZhbHVlKSB7DQorICBpbnQzMl90IG51bURpZ2l0cyA9IDA7DQorICB3aGlsZSAodmFsdWUgIT0gMCkgew0KKyAgICB2YWx1ZSA+Pj0gMTsNCisgICAgKytudW1EaWdpdHM7DQorICB9DQorICByZXR1cm4gbnVtRGlnaXRzOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJuKGludDMyX3QgeFN0YXJ0LCBpbnQzMl90IHlTdGFydCwNCi0gICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihtYXRyaXggPT0gTlVMTCkgew0KLSAgICAgICAgZSAgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCA1OyB5KyspIHsNCi0gICAgICAgIGZvcihpbnQzMl90IHggPSAwOyB4IDwgNTsgeCsrKSB7DQotICAgICAgICAgICAgaWYoIUlzRW1wdHkobWF0cml4LT5HZXQoeFN0YXJ0ICsgeCwgeSArIHlTdGFydCkpKSB7DQotICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVEYXRhOw0KLSAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbWF0cml4LT5TZXQoeFN0YXJ0ICsgeCwgeVN0YXJ0ICsgeSwgUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOW3ldW3hdKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4gKGludDMyX3QgeFN0YXJ0LCBpbnQzMl90IHlTdGFydCwNCi0gICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihtYXRyaXggPT0gTlVMTCkgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLSAgICBmb3IoaW50MzJfdCB5ID0gMDsgeSA8IDc7IHkrKykgew0KLSAgICAgICAgZm9yKGludDMyX3QgeCA9IDA7IHggPCA3OyB4KyspIHsNCi0gICAgICAgICAgICBpZighSXNFbXB0eShtYXRyaXgtPkdldCh4U3RhcnQgKyB4LCB5U3RhcnQgKyB5KSkpIHsNCi0gICAgICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGE7DQotICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtYXRyaXgtPlNldCh4U3RhcnQgKyB4LCB5U3RhcnQgKyB5LCBQT1NJVElPTl9ERVRFQ1RJT05fUEFUVEVSTlt5XVt4XSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkUG9zaXRpb25EZXRlY3Rpb25QYXR0ZXJuc0FuZFNlcGFyYXRvcnMoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKG1hdHJpeCA9PSBOVUxMKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotICAgIGludDMyX3QgcGRwV2lkdGggPSA3Ow0KLSAgICBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybigwLCAwLCBtYXRyaXgsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4obWF0cml4LT5HZXRXaWR0aCgpIC0gcGRwV2lkdGgsIDAsIG1hdHJpeCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybigwLCBtYXRyaXgtPkdldFdpZHRoKCkgLSBwZHBXaWR0aCwgbWF0cml4LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIGludDMyX3QgaHNwV2lkdGggPSA4Ow0KLSAgICBFbWJlZEhvcml6b250YWxTZXBhcmF0aW9uUGF0dGVybigwLCBoc3BXaWR0aCAtIDEsIG1hdHJpeCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBFbWJlZEhvcml6b250YWxTZXBhcmF0aW9uUGF0dGVybihtYXRyaXgtPkdldFdpZHRoKCkgLSBoc3BXaWR0aCwgaHNwV2lkdGggLSAxLCBtYXRyaXgsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4oMCwgbWF0cml4LT5HZXRXaWR0aCgpIC0gaHNwV2lkdGgsIG1hdHJpeCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBpbnQzMl90IHZzcFNpemUgPSA3Ow0KLSAgICBFbWJlZFZlcnRpY2FsU2VwYXJhdGlvblBhdHRlcm4odnNwU2l6ZSwgMCwgbWF0cml4LCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIEVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybihtYXRyaXgtPkdldEhlaWdodCgpIC0gdnNwU2l6ZSAtIDEsIDAsIG1hdHJpeCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICBFbWJlZFZlcnRpY2FsU2VwYXJhdGlvblBhdHRlcm4odnNwU2l6ZSwgbWF0cml4LT5HZXRIZWlnaHQoKSAtIHZzcFNpemUsIG1hdHJpeCwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLX0NCi12b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6TWF5YmVFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm5zKGludDMyX3QgdmVyc2lvbiwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKG1hdHJpeCA9PSBOVUxMKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICB9DQotICAgIGlmKHZlcnNpb24gPCAyKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBpbmRleCA9IHZlcnNpb24gLSAxOw0KLSAgICBpbnQzMl90IGNvbnN0KiBjb29yZGluYXRlcyA9ICYoUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbaW5kZXhdWzBdKTsNCi0gICAgaW50MzJfdCBudW1Db29yZGluYXRlID0gNzsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBudW1Db29yZGluYXRlOyBpKyspIHsNCi0gICAgICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgbnVtQ29vcmRpbmF0ZTsgaisrKSB7DQotICAgICAgICAgICAgaW50MzJfdCB5ID0gY29vcmRpbmF0ZXNbaV07DQotICAgICAgICAgICAgaW50MzJfdCB4ID0gY29vcmRpbmF0ZXNbal07DQotICAgICAgICAgICAgaWYoeCA9PSAtMSB8fCB5ID09IC0xKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihJc0VtcHR5KG1hdHJpeC0+R2V0KHgsIHkpKSkgew0KLSAgICAgICAgICAgICAgICBFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm4oeCAtIDIsIHkgLSAyLCBtYXRyaXgsIGUpOw0KLSAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQotaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkZpbmRNU0JTZXQoaW50MzJfdCB2YWx1ZSkNCi17DQotICAgIGludDMyX3QgbnVtRGlnaXRzID0gMDsNCi0gICAgd2hpbGUodmFsdWUgIT0gMCkgew0KLSAgICAgICAgdmFsdWUgPj49IDE7DQotICAgICAgICArK251bURpZ2l0czsNCi0gICAgfQ0KLSAgICByZXR1cm4gbnVtRGlnaXRzOw0KLX0NCi1DQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkNCQ19RUkNvZGVyTWF0cml4VXRpbCgpDQotew0KLX0NCi1DQkNfUVJDb2Rlck1hdHJpeFV0aWw6On5DQkNfUVJDb2Rlck1hdHJpeFV0aWwoKQ0KLXsNCi19DQorQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpDQkNfUVJDb2Rlck1hdHJpeFV0aWwoKSB7fQ0KK0NCQ19RUkNvZGVyTWF0cml4VXRpbDo6fkNCQ19RUkNvZGVyTWF0cml4VXRpbCgpIHt9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXRyaXhVdGlsLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuaAppbmRleCA1ZGEzMjQ0Li4yZWZjY2FkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuaApAQCAtOSw0MSArOSw3NyBAQAogY2xhc3MgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg7DQogY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsNCiBjbGFzcyBDQkNfUVJDb2RlckJpdFZlY3RvcjsNCi1jbGFzcyBDQkNfUVJDb2Rlck1hdHJpeFV0aWwNCi17DQotcHJpdmF0ZToNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgUE9TSVRJT05fREVURUNUSU9OX1BBVFRFUk5bN11bN107DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFZFUlRJQ0FMX1NFUEFSQVRJT05fUEFUVEVSTls3XVsxXTsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgSE9SSVpPTlRBTF9TRVBBUkFUSU9OX1BBVFRFUk5bMV1bOF07DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFBPU0lUSU9OX0FESlVTVE1FTlRfUEFUVEVSTls1XVs1XTsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbNDBdWzddOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBUWVBFX0lORk9fQ09PUkRJTkFURVNbMTVdWzJdOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBWRVJTSU9OX0lORk9fUE9MWTsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgVFlQRV9JTkZPX1BPTFk7DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFRZUEVfSU5GT19NQVNLX1BBVFRFUk47DQotcHVibGljOg0KLSAgICBDQkNfUVJDb2Rlck1hdHJpeFV0aWwoKTsNCi0gICAgdmlydHVhbCB+Q0JDX1FSQ29kZXJNYXRyaXhVdGlsKCk7DQotICAgIHN0YXRpYyB2b2lkIENsZWFyTWF0cml4KENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBCdWlsZE1hdHJpeChDQkNfUVJDb2RlckJpdFZlY3RvciogZGF0YUJpdHMsIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiwgaW50MzJfdCBtYXNrUGF0dGVybiwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIEVtYmVkQmFzaWNQYXR0ZXJucyhpbnQzMl90IHZlcnNpb24sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBFbWJlZFR5cGVJbmZvKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIGludDMyX3QgbWFza1BhdHRlcm4sIENCQ19Db21tb25CeXRlTWF0cml4ICptYXRyaXgsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBFbWJlZERhdGFCaXRzKENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywgaW50MzJfdCBtYXNrUGF0dGVybiwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIE1heWJlRW1iZWRWZXJzaW9uSW5mbyhpbnQzMl90IHZlcnNpb24sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBGaW5kTVNCU2V0KGludDMyX3QgdmFsdWUpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBDYWxjdWxhdGVCQ0hDb2RlKGludDMyX3QgY29kZSwgaW50MzJfdCBwb2x5KTsNCi0gICAgc3RhdGljIHZvaWQgTWFrZVR5cGVJbmZvQml0cyhDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLCBpbnQzMl90IG1hc2tQYXR0ZXJuLCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIE1ha2VWZXJzaW9uSW5mb0JpdHMoaW50MzJfdCB2ZXJzaW9uLCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyBGWF9CT09MIElzRW1wdHkoaW50MzJfdCB2YWx1ZSk7DQotICAgIHN0YXRpYyBGWF9CT09MIElzVmFsaWRWYWx1ZShpbnQzMl90IHZhbHVlKTsNCi0gICAgc3RhdGljIHZvaWQgRW1iZWRUaW1pbmdQYXR0ZXJucyhDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgRW1iZWREYXJrRG90QXRMZWZ0Qm90dG9tQ29ybmVyKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBFbWJlZEhvcml6b250YWxTZXBhcmF0aW9uUGF0dGVybihpbnQzMl90IHhTdGFydCwgaW50MzJfdCB5U3RhcnQsIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBFbWJlZFZlcnRpY2FsU2VwYXJhdGlvblBhdHRlcm4oaW50MzJfdCB4U3RhcnQsIGludDMyX3QgeVN0YXJ0LCBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgRW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJuKGludDMyX3QgeFN0YXJ0LCBpbnQzMl90IHlTdGFydCwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIEVtYmVkUG9zaXRpb25EZXRlY3Rpb25QYXR0ZXJuKGludDMyX3QgeFN0YXJ0LCBpbnQzMl90IHlTdGFydCwgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIEVtYmVkUG9zaXRpb25EZXRlY3Rpb25QYXR0ZXJuc0FuZFNlcGFyYXRvcnMoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIE1heWJlRW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJucyhpbnQzMl90IHZlcnNpb24sIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsIGludDMyX3QgJmUpOw0KK2NsYXNzIENCQ19RUkNvZGVyTWF0cml4VXRpbCB7DQorIHByaXZhdGU6DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBQT1NJVElPTl9ERVRFQ1RJT05fUEFUVEVSTls3XVs3XTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFZFUlRJQ0FMX1NFUEFSQVRJT05fUEFUVEVSTls3XVsxXTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEhPUklaT05UQUxfU0VQQVJBVElPTl9QQVRURVJOWzFdWzhdOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOWzVdWzVdOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbNDBdWzddOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgVFlQRV9JTkZPX0NPT1JESU5BVEVTWzE1XVsyXTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFZFUlNJT05fSU5GT19QT0xZOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgVFlQRV9JTkZPX1BPTFk7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBUWVBFX0lORk9fTUFTS19QQVRURVJOOw0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJDb2Rlck1hdHJpeFV0aWwoKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGVyTWF0cml4VXRpbCgpOw0KKyAgc3RhdGljIHZvaWQgQ2xlYXJNYXRyaXgoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBCdWlsZE1hdHJpeChDQkNfUVJDb2RlckJpdFZlY3RvciogZGF0YUJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXNrUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEVtYmVkQmFzaWNQYXR0ZXJucyhpbnQzMl90IHZlcnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEVtYmVkVHlwZUluZm8oQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXNrUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBFbWJlZERhdGFCaXRzKENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXNrUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBNYXliZUVtYmVkVmVyc2lvbkluZm8oaW50MzJfdCB2ZXJzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgaW50MzJfdCBGaW5kTVNCU2V0KGludDMyX3QgdmFsdWUpOw0KKyAgc3RhdGljIGludDMyX3QgQ2FsY3VsYXRlQkNIQ29kZShpbnQzMl90IGNvZGUsIGludDMyX3QgcG9seSk7DQorICBzdGF0aWMgdm9pZCBNYWtlVHlwZUluZm9CaXRzKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWFza1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIE1ha2VWZXJzaW9uSW5mb0JpdHMoaW50MzJfdCB2ZXJzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgRlhfQk9PTCBJc0VtcHR5KGludDMyX3QgdmFsdWUpOw0KKyAgc3RhdGljIEZYX0JPT0wgSXNWYWxpZFZhbHVlKGludDMyX3QgdmFsdWUpOw0KKyAgc3RhdGljIHZvaWQgRW1iZWRUaW1pbmdQYXR0ZXJucyhDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEVtYmVkRGFya0RvdEF0TGVmdEJvdHRvbUNvcm5lcihDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4oaW50MzJfdCB4U3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHlTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybihpbnQzMl90IHhTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHlTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJuKGludDMyX3QgeFN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeVN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybihpbnQzMl90IHhTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeVN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm5zQW5kU2VwYXJhdG9ycygNCisgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgTWF5YmVFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm5zKGludDMyX3QgdmVyc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5jcHAKaW5kZXggNWJjMmZlMC4uNTQyYzhkYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuY3BwCkBAIC0zMywxNDYgKzMzLDE0OCBAQAogQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX0ZJUlNUX1BPU0lUSU9OID0gTlVMTDsNCiBDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c0ZOQzFfU0VDT05EX1BPU0lUSU9OID0gTlVMTDsNCiBDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c1NUUlVDVFVSRURfQVBQRU5EID0gTlVMTDsNCi1DQkNfUVJDb2Rlck1vZGU6OkNCQ19RUkNvZGVyTW9kZShpbnQzMl90ICpjaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9ucywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgxLCBpbnQzMl90IHgyLCBpbnQzMl90IHgzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYml0cywgQ0ZYX0J5dGVTdHJpbmcgbmFtZSkNCi17DQotICAgIG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMgPSBjaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uczsNCi0gICAgaWYgKG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMgIT0gTlVMTCkgew0KLSAgICAgICAgbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uc1swXSA9IHgxOw0KLSAgICAgICAgbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uc1sxXSA9IHgyOw0KLSAgICAgICAgbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uc1syXSA9IHgzOw0KLSAgICB9DQotICAgIG1fbmFtZSArPSBuYW1lOw0KLSAgICBtX2JpdHMgPSBiaXRzOw0KK0NCQ19RUkNvZGVyTW9kZTo6Q0JDX1FSQ29kZXJNb2RlKGludDMyX3QqIGNoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lKSB7DQorICBtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zID0gY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnM7DQorICBpZiAobV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9ucyAhPSBOVUxMKSB7DQorICAgIG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnNbMF0gPSB4MTsNCisgICAgbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uc1sxXSA9IHgyOw0KKyAgICBtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zWzJdID0geDM7DQorICB9DQorICBtX25hbWUgKz0gbmFtZTsNCisgIG1fYml0cyA9IGJpdHM7DQogfQ0KLUNCQ19RUkNvZGVyTW9kZTo6fkNCQ19RUkNvZGVyTW9kZSgpDQotew0KLSAgICBpZihtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zICE9IE5VTEwpIHsNCi0gICAgICAgIEZYX0ZyZWUobV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9ucyk7DQotICAgIH0NCitDQkNfUVJDb2Rlck1vZGU6On5DQkNfUVJDb2Rlck1vZGUoKSB7DQorICBpZiAobV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9ucyAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUobV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9ucyk7DQorICB9DQogfQ0KLXZvaWQgQ0JDX1FSQ29kZXJNb2RlOjpJbml0aWFsaXplKCkNCi17DQotICAgIHNCWVRFID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShGWF9BbGxvYyhpbnQzMl90LCAzKSwgOCwgMTYsIDE2LCAweDQsICJCWVRFIik7DQotICAgIHNBTFBIQU5VTUVSSUMgPSBGWF9ORVcgQ0JDX1FSQ29kZXJNb2RlKEZYX0FsbG9jKGludDMyX3QsIDMpLCA5LCAxMSwgMTMsIDB4MiwgIkFMUEhBTlVNRVJJQyIpOw0KLSAgICBzRUNJID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShOVUxMLCAwLCAwLCAwLCAweDcsICJFQ0kiKTsNCi0gICAgc0tBTkpJID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShGWF9BbGxvYyhpbnQzMl90LCAzKSwgOCwgMTAsIDEyLCAweDgsICJLQU5KSSIpOw0KLSAgICBzTlVNRVJJQyA9IEZYX05FVyBDQkNfUVJDb2Rlck1vZGUoRlhfQWxsb2MoaW50MzJfdCwgMyksIDEwLCAxMiwgMTQsIDB4MSwgIk5VTUVSSUMiKTsNCi0gICAgc0dCSyA9IEZYX05FVyBDQkNfUVJDb2Rlck1vZGUoRlhfQWxsb2MoaW50MzJfdCwgMyksIDgsIDEwLCAxMiwgMHgwRCwgIkdCSyIpOw0KLSAgICBzVEVSTUlOQVRPUiA9IEZYX05FVyBDQkNfUVJDb2Rlck1vZGUoRlhfQWxsb2MoaW50MzJfdCwgMyksIDAsIDAsIDAsIDB4MDAsICJURVJNSU5BVE9SIik7DQotICAgIHNGTkMxX0ZJUlNUX1BPU0lUSU9OID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShOVUxMLCAwLCAwLCAwLCAweDA1LCAiRk5DMV9GSVJTVF9QT1NJVElPTiIpOw0KLSAgICBzRk5DMV9TRUNPTkRfUE9TSVRJT04gPSBGWF9ORVcgQ0JDX1FSQ29kZXJNb2RlKE5VTEwsIDAsIDAsIDAsIDB4MDksICJGTkMxX1NFQ09ORF9QT1NJVElPTiIpOw0KLSAgICBzU1RSVUNUVVJFRF9BUFBFTkQgPSBGWF9ORVcgQ0JDX1FSQ29kZXJNb2RlKEZYX0FsbG9jKGludDMyX3QsIDMpLCAwLCAwLCAwLCAweDAzLCAiU1RSVUNUVVJFRF9BUFBFTkQiKTsNCit2b2lkIENCQ19RUkNvZGVyTW9kZTo6SW5pdGlhbGl6ZSgpIHsNCisgIHNCWVRFID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShGWF9BbGxvYyhpbnQzMl90LCAzKSwgOCwgMTYsIDE2LCAweDQsICJCWVRFIik7DQorICBzQUxQSEFOVU1FUklDID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShGWF9BbGxvYyhpbnQzMl90LCAzKSwgOSwgMTEsIDEzLCAweDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxQSEFOVU1FUklDIik7DQorICBzRUNJID0gRlhfTkVXIENCQ19RUkNvZGVyTW9kZShOVUxMLCAwLCAwLCAwLCAweDcsICJFQ0kiKTsNCisgIHNLQU5KSSA9DQorICAgICAgRlhfTkVXIENCQ19RUkNvZGVyTW9kZShGWF9BbGxvYyhpbnQzMl90LCAzKSwgOCwgMTAsIDEyLCAweDgsICJLQU5KSSIpOw0KKyAgc05VTUVSSUMgPQ0KKyAgICAgIEZYX05FVyBDQkNfUVJDb2Rlck1vZGUoRlhfQWxsb2MoaW50MzJfdCwgMyksIDEwLCAxMiwgMTQsIDB4MSwgIk5VTUVSSUMiKTsNCisgIHNHQksgPSBGWF9ORVcgQ0JDX1FSQ29kZXJNb2RlKEZYX0FsbG9jKGludDMyX3QsIDMpLCA4LCAxMCwgMTIsIDB4MEQsICJHQksiKTsNCisgIHNURVJNSU5BVE9SID0NCisgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJNb2RlKEZYX0FsbG9jKGludDMyX3QsIDMpLCAwLCAwLCAwLCAweDAwLCAiVEVSTUlOQVRPUiIpOw0KKyAgc0ZOQzFfRklSU1RfUE9TSVRJT04gPQ0KKyAgICAgIEZYX05FVyBDQkNfUVJDb2Rlck1vZGUoTlVMTCwgMCwgMCwgMCwgMHgwNSwgIkZOQzFfRklSU1RfUE9TSVRJT04iKTsNCisgIHNGTkMxX1NFQ09ORF9QT1NJVElPTiA9DQorICAgICAgRlhfTkVXIENCQ19RUkNvZGVyTW9kZShOVUxMLCAwLCAwLCAwLCAweDA5LCAiRk5DMV9TRUNPTkRfUE9TSVRJT04iKTsNCisgIHNTVFJVQ1RVUkVEX0FQUEVORCA9IEZYX05FVyBDQkNfUVJDb2Rlck1vZGUoRlhfQWxsb2MoaW50MzJfdCwgMyksIDAsIDAsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMsICJTVFJVQ1RVUkVEX0FQUEVORCIpOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyTW9kZTo6RmluYWxpemUoKQ0KLXsNCi0gICAgZGVsZXRlIHNCWVRFOw0KLSAgICBkZWxldGUgc0FMUEhBTlVNRVJJQzsNCi0gICAgZGVsZXRlIHNFQ0k7DQotICAgIGRlbGV0ZSBzS0FOSkk7DQotICAgIGRlbGV0ZSBzTlVNRVJJQzsNCi0gICAgZGVsZXRlIHNHQks7DQotICAgIGRlbGV0ZSBzVEVSTUlOQVRPUjsNCi0gICAgZGVsZXRlIHNGTkMxX0ZJUlNUX1BPU0lUSU9OOw0KLSAgICBkZWxldGUgc0ZOQzFfU0VDT05EX1BPU0lUSU9OOw0KLSAgICBkZWxldGUgc1NUUlVDVFVSRURfQVBQRU5EOw0KK3ZvaWQgQ0JDX1FSQ29kZXJNb2RlOjpGaW5hbGl6ZSgpIHsNCisgIGRlbGV0ZSBzQllURTsNCisgIGRlbGV0ZSBzQUxQSEFOVU1FUklDOw0KKyAgZGVsZXRlIHNFQ0k7DQorICBkZWxldGUgc0tBTkpJOw0KKyAgZGVsZXRlIHNOVU1FUklDOw0KKyAgZGVsZXRlIHNHQks7DQorICBkZWxldGUgc1RFUk1JTkFUT1I7DQorICBkZWxldGUgc0ZOQzFfRklSU1RfUE9TSVRJT047DQorICBkZWxldGUgc0ZOQzFfU0VDT05EX1BPU0lUSU9OOw0KKyAgZGVsZXRlIHNTVFJVQ1RVUkVEX0FQUEVORDsNCiB9DQotQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OkZvckJpdHMoaW50MzJfdCBiaXRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgc3dpdGNoIChiaXRzKSB7DQotICAgICAgICBjYXNlIDB4MDoNCi0gICAgICAgICAgICByZXR1cm4gc1RFUk1JTkFUT1I7DQotICAgICAgICBjYXNlIDB4MToNCi0gICAgICAgICAgICByZXR1cm4gc05VTUVSSUM7DQotICAgICAgICBjYXNlIDB4MjoNCi0gICAgICAgICAgICByZXR1cm4gc0FMUEhBTlVNRVJJQzsNCi0gICAgICAgIGNhc2UgMHgzOg0KLSAgICAgICAgICAgIHJldHVybiBzU1RSVUNUVVJFRF9BUFBFTkQ7DQotICAgICAgICBjYXNlIDB4NDoNCi0gICAgICAgICAgICByZXR1cm4gc0JZVEU7DQotICAgICAgICBjYXNlIDB4NToNCi0gICAgICAgICAgICByZXR1cm4gc0ZOQzFfRklSU1RfUE9TSVRJT047DQotICAgICAgICBjYXNlIDB4NzoNCi0gICAgICAgICAgICByZXR1cm4gc0VDSTsNCi0gICAgICAgIGNhc2UgMHg4Og0KLSAgICAgICAgICAgIHJldHVybiBzS0FOSkk7DQotICAgICAgICBjYXNlIDB4OToNCi0gICAgICAgICAgICByZXR1cm4gc0ZOQzFfU0VDT05EX1BPU0lUSU9OOw0KLSAgICAgICAgY2FzZSAweDBEOg0KLSAgICAgICAgICAgIHJldHVybiBzR0JLOw0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25VbnN1cHBvcnRlZE1vZGU7DQotICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgICAgICB9DQorQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OkZvckJpdHMoaW50MzJfdCBiaXRzLCBpbnQzMl90JiBlKSB7DQorICBzd2l0Y2ggKGJpdHMpIHsNCisgICAgY2FzZSAweDA6DQorICAgICAgcmV0dXJuIHNURVJNSU5BVE9SOw0KKyAgICBjYXNlIDB4MToNCisgICAgICByZXR1cm4gc05VTUVSSUM7DQorICAgIGNhc2UgMHgyOg0KKyAgICAgIHJldHVybiBzQUxQSEFOVU1FUklDOw0KKyAgICBjYXNlIDB4MzoNCisgICAgICByZXR1cm4gc1NUUlVDVFVSRURfQVBQRU5EOw0KKyAgICBjYXNlIDB4NDoNCisgICAgICByZXR1cm4gc0JZVEU7DQorICAgIGNhc2UgMHg1Og0KKyAgICAgIHJldHVybiBzRk5DMV9GSVJTVF9QT1NJVElPTjsNCisgICAgY2FzZSAweDc6DQorICAgICAgcmV0dXJuIHNFQ0k7DQorICAgIGNhc2UgMHg4Og0KKyAgICAgIHJldHVybiBzS0FOSkk7DQorICAgIGNhc2UgMHg5Og0KKyAgICAgIHJldHVybiBzRk5DMV9TRUNPTkRfUE9TSVRJT047DQorICAgIGNhc2UgMHgwRDoNCisgICAgICByZXR1cm4gc0dCSzsNCisgICAgZGVmYXVsdDogew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvblVuc3VwcG9ydGVkTW9kZTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotaW50MzJfdCBDQkNfUVJDb2Rlck1vZGU6OkdldEJpdHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYml0czsNCitpbnQzMl90IENCQ19RUkNvZGVyTW9kZTo6R2V0Qml0cygpIHsNCisgIHJldHVybiBtX2JpdHM7DQogfQ0KLUNGWF9CeXRlU3RyaW5nIENCQ19RUkNvZGVyTW9kZTo6R2V0TmFtZSgpDQotew0KLSAgICByZXR1cm4gbV9uYW1lOw0KK0NGWF9CeXRlU3RyaW5nIENCQ19RUkNvZGVyTW9kZTo6R2V0TmFtZSgpIHsNCisgIHJldHVybiBtX25hbWU7DQogfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXJNb2RlOjpHZXRDaGFyYWN0ZXJDb3VudEJpdHMoQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYobV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9ucyA9PSBOVUxMKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25DaGFyYWN0ZXJOb3RUaGlzTW9kZTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IG51bWJlciA9IHZlcnNpb24tPkdldFZlcnNpb25OdW1iZXIoKTsNCi0gICAgaW50MzJfdCBvZmZzZXQ7DQotICAgIGlmKG51bWJlciA8PSA5KSB7DQotICAgICAgICBvZmZzZXQgPSAwOw0KLSAgICB9IGVsc2UgaWYobnVtYmVyIDw9IDI2KSB7DQotICAgICAgICBvZmZzZXQgPSAxOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgb2Zmc2V0ID0gMjsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uc1tvZmZzZXRdOw0KK2ludDMyX3QgQ0JDX1FSQ29kZXJNb2RlOjpHZXRDaGFyYWN0ZXJDb3VudEJpdHMoQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25DaGFyYWN0ZXJOb3RUaGlzTW9kZTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgfQ0KKyAgaW50MzJfdCBudW1iZXIgPSB2ZXJzaW9uLT5HZXRWZXJzaW9uTnVtYmVyKCk7DQorICBpbnQzMl90IG9mZnNldDsNCisgIGlmIChudW1iZXIgPD0gOSkgew0KKyAgICBvZmZzZXQgPSAwOw0KKyAgfSBlbHNlIGlmIChudW1iZXIgPD0gMjYpIHsNCisgICAgb2Zmc2V0ID0gMTsNCisgIH0gZWxzZSB7DQorICAgIG9mZnNldCA9IDI7DQorICB9DQorICByZXR1cm4gbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uc1tvZmZzZXRdOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyTW9kZTo6RGVzdHJveSgpDQotew0KLSAgICBpZihzQllURSkgew0KLSAgICAgICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c0JZVEU7DQotICAgICAgICBzQllURSA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYoc05VTUVSSUMpIHsNCi0gICAgICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDOw0KLSAgICAgICAgc05VTUVSSUMgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKHNBTFBIQU5VTUVSSUMpIHsNCi0gICAgICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUM7DQotICAgICAgICBzQUxQSEFOVU1FUklDID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZihzS0FOSkkpIHsNCi0gICAgICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNLQU5KSTsNCi0gICAgICAgIHNLQU5KSSA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYoc0VDSSkgew0KLSAgICAgICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c0VDSTsNCi0gICAgICAgIHNFQ0kgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKHNHQkspIHsNCi0gICAgICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNHQks7DQotICAgICAgICBzR0JLID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZihzVEVSTUlOQVRPUikgew0KLSAgICAgICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c1RFUk1JTkFUT1I7DQotICAgICAgICBzVEVSTUlOQVRPUiA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYoc0ZOQzFfRklSU1RfUE9TSVRJT04pIHsNCi0gICAgICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX0ZJUlNUX1BPU0lUSU9OOw0KLSAgICAgICAgc0ZOQzFfRklSU1RfUE9TSVRJT04gPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKHNGTkMxX1NFQ09ORF9QT1NJVElPTikgew0KLSAgICAgICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c0ZOQzFfU0VDT05EX1BPU0lUSU9OOw0KLSAgICAgICAgc0ZOQzFfU0VDT05EX1BPU0lUSU9OID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZihzU1RSVUNUVVJFRF9BUFBFTkQpIHsNCi0gICAgICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNTVFJVQ1RVUkVEX0FQUEVORDsNCi0gICAgICAgIHNTVFJVQ1RVUkVEX0FQUEVORCA9IE5VTEw7DQotICAgIH0NCit2b2lkIENCQ19RUkNvZGVyTW9kZTo6RGVzdHJveSgpIHsNCisgIGlmIChzQllURSkgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsNCisgICAgc0JZVEUgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKHNOVU1FUklDKSB7DQorICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDOw0KKyAgICBzTlVNRVJJQyA9IE5VTEw7DQorICB9DQorICBpZiAoc0FMUEhBTlVNRVJJQykgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDOw0KKyAgICBzQUxQSEFOVU1FUklDID0gTlVMTDsNCisgIH0NCisgIGlmIChzS0FOSkkpIHsNCisgICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c0tBTkpJOw0KKyAgICBzS0FOSkkgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKHNFQ0kpIHsNCisgICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c0VDSTsNCisgICAgc0VDSSA9IE5VTEw7DQorICB9DQorICBpZiAoc0dCSykgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzR0JLOw0KKyAgICBzR0JLID0gTlVMTDsNCisgIH0NCisgIGlmIChzVEVSTUlOQVRPUikgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzVEVSTUlOQVRPUjsNCisgICAgc1RFUk1JTkFUT1IgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKHNGTkMxX0ZJUlNUX1BPU0lUSU9OKSB7DQorICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX0ZJUlNUX1BPU0lUSU9OOw0KKyAgICBzRk5DMV9GSVJTVF9QT1NJVElPTiA9IE5VTEw7DQorICB9DQorICBpZiAoc0ZOQzFfU0VDT05EX1BPU0lUSU9OKSB7DQorICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX1NFQ09ORF9QT1NJVElPTjsNCisgICAgc0ZOQzFfU0VDT05EX1BPU0lUSU9OID0gTlVMTDsNCisgIH0NCisgIGlmIChzU1RSVUNUVVJFRF9BUFBFTkQpIHsNCisgICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c1NUUlVDVFVSRURfQVBQRU5EOw0KKyAgICBzU1RSVUNUVVJFRF9BUFBFTkQgPSBOVUxMOw0KKyAgfQ0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5oCmluZGV4IDQ3MmQzYjEuLjg0ZjRjNDUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5oCkBAIC03LDMzICs3LDM4IEBACiAjaWZuZGVmIF9CQ19RUkNPREVSTU9ERV9IXw0KICNkZWZpbmUgX0JDX1FSQ09ERVJNT0RFX0hfDQogY2xhc3MgQ0JDX1FSQ29kZXJWZXJzaW9uOw0KLWNsYXNzIENCQ19RUkNvZGVyTW9kZQ0KLXsNCi1wcml2YXRlOg0KLSAgICBpbnQzMl90KiBtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zOw0KLSAgICBpbnQzMl90IG1fYml0czsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgbV9uYW1lOw0KLSAgICBDQkNfUVJDb2Rlck1vZGUoaW50MzJfdCAqY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMsIGludDMyX3QgeDEsIGludDMyX3QgeDIsIGludDMyX3QgeDMsIGludDMyX3QgYml0cywgQ0ZYX0J5dGVTdHJpbmcgbmFtZSk7DQotICAgIENCQ19RUkNvZGVyTW9kZSgpOw0KLXB1YmxpYzoNCi0gICAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0JZVEU7DQotICAgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNOVU1FUklDOw0KLSAgICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzQUxQSEFOVU1FUklDOw0KLSAgICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzS0FOSkk7DQotICAgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNFQ0k7DQotICAgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNHQks7DQotICAgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNURVJNSU5BVE9SOw0KLSAgICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzRk5DMV9GSVJTVF9QT1NJVElPTjsNCi0gICAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0ZOQzFfU0VDT05EX1BPU0lUSU9OOw0KLSAgICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzU1RSVUNUVVJFRF9BUFBFTkQ7DQotICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyTW9kZSgpOw0KK2NsYXNzIENCQ19RUkNvZGVyTW9kZSB7DQorIHByaXZhdGU6DQorICBpbnQzMl90KiBtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zOw0KKyAgaW50MzJfdCBtX2JpdHM7DQorICBDRlhfQnl0ZVN0cmluZyBtX25hbWU7DQorICBDQkNfUVJDb2Rlck1vZGUoaW50MzJfdCogY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCB4MSwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IHgyLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgeDMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBiaXRzLA0KKyAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUpOw0KKyAgQ0JDX1FSQ29kZXJNb2RlKCk7DQogDQotICAgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCi0gICAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCi0gICAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogRm9yQml0cyhpbnQzMl90IGJpdHMsIGludDMyX3QgJmUpOw0KLSAgICBpbnQzMl90IEdldENoYXJhY3RlckNvdW50Qml0cyhDQkNfUVJDb2RlclZlcnNpb24qIHZlcnNpb24sIGludDMyX3QgJmUpOw0KLSAgICBpbnQzMl90IEdldEJpdHMoKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNCWVRFOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc05VTUVSSUM7DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzQUxQSEFOVU1FUklDOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0tBTkpJOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0VDSTsNCisgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNHQks7DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzVEVSTUlOQVRPUjsNCisgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNGTkMxX0ZJUlNUX1BPU0lUSU9OOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0ZOQzFfU0VDT05EX1BPU0lUSU9OOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc1NUUlVDVFVSRURfQVBQRU5EOw0KKyAgdmlydHVhbCB+Q0JDX1FSQ29kZXJNb2RlKCk7DQorDQorICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQorICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogRm9yQml0cyhpbnQzMl90IGJpdHMsIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBHZXRDaGFyYWN0ZXJDb3VudEJpdHMoQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uLCBpbnQzMl90JiBlKTsNCisgIGludDMyX3QgR2V0Qml0cygpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZSgpOw0KKyAgc3RhdGljIHZvaWQgRGVzdHJveSgpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5jcHAKaW5kZXggZTBhY2Y0Ni4uNmEzZjEyMiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uY3BwCkBAIC0zMCw3NDggKzMwLDczOSBAQAogI2luY2x1ZGUgIkJDX1FSQ29kZXJFQ0Jsb2Nrcy5oIg0KICNpbmNsdWRlICJCQ19RUkNvZGVyVmVyc2lvbi5oIg0KIGNvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXJWZXJzaW9uOjpWRVJTSU9OX0RFQ09ERV9JTkZPW10gPSB7DQotICAgIDB4MDdDOTQsIDB4MDg1QkMsIDB4MDlBOTksIDB4MEE0RDMsIDB4MEJCRjYsDQotICAgIDB4MEM3NjIsIDB4MEQ4NDcsIDB4MEU2MEQsIDB4MEY5MjgsIDB4MTBCNzgsDQotICAgIDB4MTE0NUQsIDB4MTJBMTcsIDB4MTM1MzIsIDB4MTQ5QTYsIDB4MTU2ODMsDQotICAgIDB4MTY4QzksIDB4MTc3RUMsIDB4MThFQzQsIDB4MTkxRTEsIDB4MUFGQUIsDQotICAgIDB4MUIwOEUsIDB4MUNDMUEsIDB4MUQzM0YsIDB4MUVENzUsIDB4MUYyNTAsDQotICAgIDB4MjA5RDUsIDB4MjE2RjAsIDB4MjI4QkEsIDB4MjM3OUYsIDB4MjRCMEIsDQotICAgIDB4MjU0MkUsIDB4MjZBNjQsIDB4Mjc1NDEsIDB4MjhDNjkNCi19Ow0KLUNGWF9QdHJBcnJheSAqQ0JDX1FSQ29kZXJWZXJzaW9uOjpWRVJTSU9OID0gTlVMTDsNCi12b2lkIENCQ19RUkNvZGVyVmVyc2lvbjo6SW5pdGlhbGl6ZSgpDQotew0KLSAgICBWRVJTSU9OID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KKyAgICAweDA3Qzk0LCAweDA4NUJDLCAweDA5QTk5LCAweDBBNEQzLCAweDBCQkY2LCAweDBDNzYyLCAweDBEODQ3LA0KKyAgICAweDBFNjBELCAweDBGOTI4LCAweDEwQjc4LCAweDExNDVELCAweDEyQTE3LCAweDEzNTMyLCAweDE0OUE2LA0KKyAgICAweDE1NjgzLCAweDE2OEM5LCAweDE3N0VDLCAweDE4RUM0LCAweDE5MUUxLCAweDFBRkFCLCAweDFCMDhFLA0KKyAgICAweDFDQzFBLCAweDFEMzNGLCAweDFFRDc1LCAweDFGMjUwLCAweDIwOUQ1LCAweDIxNkYwLCAweDIyOEJBLA0KKyAgICAweDIzNzlGLCAweDI0QjBCLCAweDI1NDJFLCAweDI2QTY0LCAweDI3NTQxLCAweDI4QzY5fTsNCitDRlhfUHRyQXJyYXkqIENCQ19RUkNvZGVyVmVyc2lvbjo6VkVSU0lPTiA9IE5VTEw7DQordm9pZCBDQkNfUVJDb2RlclZlcnNpb246OkluaXRpYWxpemUoKSB7DQorICBWRVJTSU9OID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KIH0NCi12b2lkIENCQ19RUkNvZGVyVmVyc2lvbjo6RmluYWxpemUoKQ0KLXsNCi0gICAgZm9yKGludDMyX3QgaSA9IDAgOyBpIDwgVkVSU0lPTi0+R2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIENCQ19RUkNvZGVyVmVyc2lvbiogdiA9IChDQkNfUVJDb2RlclZlcnNpb24qKShWRVJTSU9OLT5HZXRBdChpKSk7DQotICAgICAgICBkZWxldGUgdjsNCi0gICAgfQ0KLSAgICBkZWxldGUgVkVSU0lPTjsNCit2b2lkIENCQ19RUkNvZGVyVmVyc2lvbjo6RmluYWxpemUoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBWRVJTSU9OLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICBDQkNfUVJDb2RlclZlcnNpb24qIHYgPSAoQ0JDX1FSQ29kZXJWZXJzaW9uKikoVkVSU0lPTi0+R2V0QXQoaSkpOw0KKyAgICBkZWxldGUgdjsNCisgIH0NCisgIGRlbGV0ZSBWRVJTSU9OOw0KIH0NCiBDQkNfUVJDb2RlclZlcnNpb246OkNCQ19RUkNvZGVyVmVyc2lvbihpbnQzMl90IHZlcnNpb25OdW1iZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3MxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrczMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3M0KQ0KLXsNCi0gICAgbV92ZXJzaW9uTnVtYmVyID0gdmVyc2lvbk51bWJlcjsNCi0gICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MxKTsNCi0gICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MyKTsNCi0gICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MzKTsNCi0gICAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3M0KTsNCi0gICAgaW50MzJfdCB0b3RhbCA9IDA7DQotICAgIGludDMyX3QgZWNDb2RlV29yZHMgPSBlY0Jsb2NrczEtPkdldEVDQ29kZVdvcmRzUGVyQmxvY2soKTsNCi0gICAgQ0ZYX1B0ckFycmF5KiBlY2JBcnJheSA9IGVjQmxvY2tzMS0+R2V0RUNCbG9ja3MoKTsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBlY2JBcnJheS0+R2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIENCQ19RUkNvZGVyRUNCKiBlY0Jsb2NrID0gKENCQ19RUkNvZGVyRUNCKikoKCplY2JBcnJheSlbaV0pOw0KLSAgICAgICAgdG90YWwgKz0gZWNCbG9jay0+R2V0Q291bnQoKSAqIChlY0Jsb2NrLT5HZXREYXRhQ29kZVdvcmRzKCkgKyBlY0NvZGVXb3Jkcyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3M0KSB7DQorICBtX3ZlcnNpb25OdW1iZXIgPSB2ZXJzaW9uTnVtYmVyOw0KKyAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MxKTsNCisgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzMik7DQorICBtX2VjQmxvY2tzLkFkZChlY0Jsb2NrczMpOw0KKyAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3M0KTsNCisgIGludDMyX3QgdG90YWwgPSAwOw0KKyAgaW50MzJfdCBlY0NvZGVXb3JkcyA9IGVjQmxvY2tzMS0+R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpOw0KKyAgQ0ZYX1B0ckFycmF5KiBlY2JBcnJheSA9IGVjQmxvY2tzMS0+R2V0RUNCbG9ja3MoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGVjYkFycmF5LT5HZXRTaXplKCk7IGkrKykgew0KKyAgICBDQkNfUVJDb2RlckVDQiogZWNCbG9jayA9IChDQkNfUVJDb2RlckVDQiopKCgqZWNiQXJyYXkpW2ldKTsNCisgICAgdG90YWwgKz0gZWNCbG9jay0+R2V0Q291bnQoKSAqIChlY0Jsb2NrLT5HZXREYXRhQ29kZVdvcmRzKCkgKyBlY0NvZGVXb3Jkcyk7DQorICB9DQorICBtX3RvdGFsQ29kZVdvcmRzID0gdG90YWw7DQorICBzd2l0Y2ggKHZlcnNpb25OdW1iZXIpIHsNCisgICAgY2FzZSAxOg0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDI6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDM6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDQ6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDU6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDY6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDc6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjIpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM4KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSA4Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg0Mik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgOToNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNDYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDEwOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1MCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTE6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxMjoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzMik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDEzOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2Mik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTQ6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDQ2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2Nik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTU6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDQ4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3MCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTY6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3NCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTc6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3OCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTg6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Mik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTk6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjA6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg5MCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjE6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3Mik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoOTQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDIyOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1MCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDk4KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyMzoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzMCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMDIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDI0Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwNik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjU6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzIpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4NCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTEwKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyNjoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzMCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMTQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDI3Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2Mik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoOTApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExOCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjg6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3NCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoOTgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEyMik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjk6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3OCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTAyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMjYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDMwOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1Mik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwNCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTMwKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAzMToNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzMCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDgyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMDgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEzNCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzI6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTEyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDMzOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1OCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExNCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTQyKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAzNDoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzNCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNjIpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDkwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMTgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE0Nik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzU6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3OCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTAyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMjYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE1MCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzY6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3Nik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTAyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMjgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE1NCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzc6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4MCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTA2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzIpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE1OCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzg6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzIpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4NCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTEwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE2Mik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzk6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Mik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTEwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE2Nik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgNDA6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNDIpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE3MCk7DQorICAgICAgYnJlYWs7DQorICB9DQorfQ0KK0NCQ19RUkNvZGVyVmVyc2lvbjo6fkNCQ19RUkNvZGVyVmVyc2lvbigpIHsNCisgIGlmIChtX2VjQmxvY2tzLkdldFNpemUoKSAhPSAwKSB7DQorICAgIGludDMyX3QgaXRCZWcgPSAwOw0KKyAgICBpbnQzMl90IGl0RW5kID0gbV9lY0Jsb2Nrcy5HZXRTaXplKCk7DQorICAgIHdoaWxlIChpdEJlZyAhPSBpdEVuZCkgew0KKyAgICAgIGRlbGV0ZSAoKENCQ19RUkNvZGVyRUNCbG9ja3MqKShtX2VjQmxvY2tzW2l0QmVnXSkpOw0KKyAgICAgIGl0QmVnKys7DQogICAgIH0NCi0gICAgbV90b3RhbENvZGVXb3JkcyA9IHRvdGFsOw0KLSAgICBzd2l0Y2godmVyc2lvbk51bWJlcikgew0KLSAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE4KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyMik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgNjoNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzNCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDc6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjIpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM4KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNDIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSA5Og0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg0Nik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDEwOg0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI4KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1MCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDExOg0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDEyOg0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMyKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1OCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDEzOg0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2Mik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDE0Og0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg0Nik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNjYpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAxNToNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNDgpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDcwKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMTY6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3NCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDE3Og0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzgpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAxODoNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzMCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDgyKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMTk6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDIwOg0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2Mik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoOTApOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAyMToNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyOCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTApOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDcyKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg5NCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDIyOg0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1MCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzQpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDk4KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjM6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3NCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTAyKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjQ6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjgpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4MCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTA2KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjU6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzIpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4NCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTEwKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjY6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE0KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjc6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzQpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYyKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg5MCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE4KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjg6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3NCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoOTgpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEyMik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDI5Og0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzgpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwMik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTI2KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMzA6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUyKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3OCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTA0KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzApOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAzMToNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzMCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDgyKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMDgpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEzNCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDMyOg0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2MCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExMik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTM4KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMzM6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE0KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNDIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAzNDoNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzNCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNjIpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDkwKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMTgpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE0Nik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDM1Og0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzgpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwMik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTI2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNTApOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAzNjoNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTApOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMDIpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEyOCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTU0KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMzc6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjgpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4MCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTA2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzIpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE1OCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDM4Og0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMyKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1OCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODQpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExMCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTM2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNjIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAzOToNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTQpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDgyKTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMTApOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEzOCk7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTY2KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgNDA6DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQotICAgICAgICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE0KTsNCi0gICAgICAgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNDIpOw0KLSAgICAgICAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE3MCk7DQotICAgICAgICAgICAgYnJlYWs7DQorICB9DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRWZXJzaW9uTnVtYmVyKCkgew0KKyAgcmV0dXJuIG1fdmVyc2lvbk51bWJlcjsNCit9DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0QWxpZ25tZW50UGF0dGVybkNlbnRlcnMoKSB7DQorICByZXR1cm4gJm1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnM7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRUb3RhbENvZGVXb3JkcygpIHsNCisgIHJldHVybiBtX3RvdGFsQ29kZVdvcmRzOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpIHsNCisgIHJldHVybiAxNyArIDQgKiBtX3ZlcnNpb25OdW1iZXI7DQorfQ0KK0NCQ19RUkNvZGVyRUNCbG9ja3MqIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0RUNCbG9ja3NGb3JMZXZlbCgNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCkgew0KKyAgcmV0dXJuIChDQkNfUVJDb2RlckVDQmxvY2tzKiltX2VjQmxvY2tzW2VjTGV2ZWwtPk9yZGluYWwoKV07DQorfQ0KK0NCQ19RUkNvZGVyVmVyc2lvbiogQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRQcm92aXNpb25hbFZlcnNpb25Gb3JEaW1lbnNpb24oDQorICAgIGludDMyX3QgZGltZW5zaW9uLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoKGRpbWVuc2lvbiAlIDQpICE9IDEpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBHZXRWZXJzaW9uRm9yTnVtYmVyKChkaW1lbnNpb24gLSAxNykgPj4gMiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcWN2Ow0KK30NCitDQkNfUVJDb2RlclZlcnNpb24qIENCQ19RUkNvZGVyVmVyc2lvbjo6RGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uKA0KKyAgICBpbnQzMl90IHZlcnNpb25CaXRzLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGJlc3REaWZmZXJlbmNlID0gRlhTWVNfSW50TWF4Ow0KKyAgaW50MzJfdCBiZXN0VmVyc2lvbiA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzNDsgaSsrKSB7DQorICAgIGludDMyX3QgdGFyZ2V0VmVyc2lvbiA9IFZFUlNJT05fREVDT0RFX0lORk9baV07DQorICAgIGlmICh0YXJnZXRWZXJzaW9uID09IHZlcnNpb25CaXRzKSB7DQorICAgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBHZXRWZXJzaW9uRm9yTnVtYmVyKGkgKyA3LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgcmV0dXJuIHFjdjsNCiAgICAgfQ0KLX0NCi1DQkNfUVJDb2RlclZlcnNpb246On5DQkNfUVJDb2RlclZlcnNpb24oKQ0KLXsNCi0gICAgaWYobV9lY0Jsb2Nrcy5HZXRTaXplKCkgIT0gMCkgew0KLSAgICAgICAgaW50MzJfdCBpdEJlZyA9IDA7DQotICAgICAgICBpbnQzMl90IGl0RW5kID0gbV9lY0Jsb2Nrcy5HZXRTaXplKCk7DQotICAgICAgICB3aGlsZShpdEJlZyAhPSBpdEVuZCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSAoIChDQkNfUVJDb2RlckVDQmxvY2tzKikobV9lY0Jsb2Nrc1tpdEJlZ10pICk7DQotICAgICAgICAgICAgaXRCZWcrKzsNCi0gICAgICAgIH0NCisgICAgaW50MzJfdCBiaXRzRGlmZmVyZW5jZSA9IENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246Ok51bUJpdHNEaWZmZXJpbmcoDQorICAgICAgICB2ZXJzaW9uQml0cywgdGFyZ2V0VmVyc2lvbik7DQorICAgIGlmIChiaXRzRGlmZmVyZW5jZSA8IGJlc3REaWZmZXJlbmNlKSB7DQorICAgICAgYmVzdFZlcnNpb24gPSBpICsgNzsNCisgICAgICBiZXN0RGlmZmVyZW5jZSA9IGJpdHNEaWZmZXJlbmNlOw0KICAgICB9DQotfQ0KLWludDMyX3QgQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRWZXJzaW9uTnVtYmVyKCkNCi17DQotICAgIHJldHVybiBtX3ZlcnNpb25OdW1iZXI7DQotfQ0KLUNGWF9JbnQzMkFycmF5KiBDQkNfUVJDb2RlclZlcnNpb246OkdldEFsaWdubWVudFBhdHRlcm5DZW50ZXJzKCkNCi17DQotICAgIHJldHVybiAmbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVyczsNCi19DQotaW50MzJfdCBDQkNfUVJDb2RlclZlcnNpb246OkdldFRvdGFsQ29kZVdvcmRzKCkNCi17DQotICAgIHJldHVybiBtX3RvdGFsQ29kZVdvcmRzOw0KLX0NCi1pbnQzMl90IENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpDQotew0KLSAgICByZXR1cm4gMTcgKyA0ICogbV92ZXJzaW9uTnVtYmVyOw0KLX0NCi1DQkNfUVJDb2RlckVDQmxvY2tzKiBDQkNfUVJDb2RlclZlcnNpb246OkdldEVDQmxvY2tzRm9yTGV2ZWwoQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCAqZWNMZXZlbCkNCi17DQotICAgIHJldHVybiAoQ0JDX1FSQ29kZXJFQ0Jsb2NrcyopbV9lY0Jsb2Nrc1tlY0xldmVsLT5PcmRpbmFsKCldOw0KLX0NCi1DQkNfUVJDb2RlclZlcnNpb24qIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0UHJvdmlzaW9uYWxWZXJzaW9uRm9yRGltZW5zaW9uKGludDMyX3QgZGltZW5zaW9uLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaWYoKGRpbWVuc2lvbiAlIDQpICE9IDEpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIH0NCi0gICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBHZXRWZXJzaW9uRm9yTnVtYmVyKChkaW1lbnNpb24gLSAxNykgPj4gMiwgZSk7DQorICB9DQorICBpZiAoYmVzdERpZmZlcmVuY2UgPD0gMykgew0KKyAgICBDQkNfUVJDb2RlclZlcnNpb24qIHFjdiA9IEdldFZlcnNpb25Gb3JOdW1iZXIoYmVzdFZlcnNpb24sIGUpOw0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQogICAgIHJldHVybiBxY3Y7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotQ0JDX1FSQ29kZXJWZXJzaW9uKiBDQkNfUVJDb2RlclZlcnNpb246OkRlY29kZVZlcnNpb25JbmZvcm1hdGlvbihpbnQzMl90IHZlcnNpb25CaXRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBiZXN0RGlmZmVyZW5jZSA9IEZYU1lTX0ludE1heDsNCi0gICAgaW50MzJfdCBiZXN0VmVyc2lvbiA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM0OyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgdGFyZ2V0VmVyc2lvbiA9IFZFUlNJT05fREVDT0RFX0lORk9baV07DQotICAgICAgICBpZih0YXJnZXRWZXJzaW9uID09IHZlcnNpb25CaXRzKSB7DQotICAgICAgICAgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBHZXRWZXJzaW9uRm9yTnVtYmVyKGkgKyA3LCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgcmV0dXJuIHFjdjsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgYml0c0RpZmZlcmVuY2UgPSBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpOdW1CaXRzRGlmZmVyaW5nKHZlcnNpb25CaXRzLCB0YXJnZXRWZXJzaW9uKTsNCi0gICAgICAgIGlmKGJpdHNEaWZmZXJlbmNlIDwgYmVzdERpZmZlcmVuY2UpIHsNCi0gICAgICAgICAgICBiZXN0VmVyc2lvbiA9IGkgKyA3Ow0KLSAgICAgICAgICAgIGJlc3REaWZmZXJlbmNlID0gYml0c0RpZmZlcmVuY2U7DQotICAgICAgICB9DQorQ0JDX0NvbW1vbkJpdE1hdHJpeCogQ0JDX1FSQ29kZXJWZXJzaW9uOjpCdWlsZEZ1bmN0aW9uUGF0dGVybihpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGRpbWVuc2lvbiA9IEdldERpbWVuc2lvbkZvclZlcnNpb24oKTsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCA9IEZYX05FVyBDQkNfQ29tbW9uQml0TWF0cml4KCk7DQorICBiaXRNYXRyaXgtPkluaXQoZGltZW5zaW9uKTsNCisgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDAsIDAsIDksIDksIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgYml0TWF0cml4LT5TZXRSZWdpb24oZGltZW5zaW9uIC0gOCwgMCwgOCwgOSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBiaXRNYXRyaXgtPlNldFJlZ2lvbigwLCBkaW1lbnNpb24gLSA4LCA5LCA4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIGludDMyX3QgbWF4ID0gbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtYXg7IHgrKykgew0KKyAgICBpbnQzMl90IGkgPSBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzW3hdIC0gMjsNCisgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbWF4OyB5KyspIHsNCisgICAgICBpZiAoKHggPT0gMCAmJiAoeSA9PSAwIHx8IHkgPT0gbWF4IC0gMSkpIHx8ICh4ID09IG1heCAtIDEgJiYgeSA9PSAwKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnNbeV0gLSAyLCBpLCA1LCA1LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQogICAgIH0NCi0gICAgaWYoYmVzdERpZmZlcmVuY2UgPD0gMykgew0KLSAgICAgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBHZXRWZXJzaW9uRm9yTnVtYmVyKGJlc3RWZXJzaW9uLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgIHJldHVybiBxY3Y7DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBiaXRNYXRyaXgtPlNldFJlZ2lvbig2LCA5LCAxLCBkaW1lbnNpb24gLSAxNywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBiaXRNYXRyaXgtPlNldFJlZ2lvbig5LCA2LCBkaW1lbnNpb24gLSAxNywgMSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBpZiAobV92ZXJzaW9uTnVtYmVyID4gNikgew0KKyAgICBiaXRNYXRyaXgtPlNldFJlZ2lvbihkaW1lbnNpb24gLSAxMSwgMCwgMywgNiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgYml0TWF0cml4LT5TZXRSZWdpb24oMCwgZGltZW5zaW9uIC0gMTEsIDYsIDMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICByZXR1cm4gYml0TWF0cml4Ow0KIH0NCi1DQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfUVJDb2RlclZlcnNpb246OkJ1aWxkRnVuY3Rpb25QYXR0ZXJuKGludDMyX3QgJmUpDQotew0KLSAgICBpbnQzMl90IGRpbWVuc2lvbiA9IEdldERpbWVuc2lvbkZvclZlcnNpb24oKTsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0TWF0cml4ID0gRlhfTkVXIENCQ19Db21tb25CaXRNYXRyaXgoKTsNCi0gICAgYml0TWF0cml4LT5Jbml0KGRpbWVuc2lvbik7DQotICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDAsIDAgLCA5LCA5LCBlKTsNCitDQkNfUVJDb2RlclZlcnNpb24qIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0VmVyc2lvbkZvck51bWJlcigNCisgICAgaW50MzJfdCB2ZXJzaW9uTnVtYmVyLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoVkVSU0lPTi0+R2V0U2l6ZSgpID09IDApIHsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAxLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2Nrcyg3LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTkpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDEwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTYpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDEzLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTMpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE3LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgOSkpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMTAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAzNCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMTYsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAyOCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjIsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAyMikpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMywgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMTUsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCA1NSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCA0NCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMTgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAxNykpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjIsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAxMykpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCA4MCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMTgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAzMikpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAyNCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMTYsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA5KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICA1LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDEwOCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCA0MykpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMTgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTYpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDEyKSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICA2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDY4KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDI3KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE5KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE1KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICA3LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDc4KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDMxKSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDE0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxNSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxMyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTQpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDgsIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgOTcpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMzgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDM5KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE4KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAxOSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTUpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDksIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTE2KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDM2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAzNykpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxNiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTcpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEzKSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAxMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMTgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCA2OCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDY5KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDQzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCA0NCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxOSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMjApKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDE2KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAxMSwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA4MSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCA1MCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgNTEpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDIzKSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDEyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig4LCAxMykpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMTIsIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgOTIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCA5MykpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjIsIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAzNiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMzcpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDIxKSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDE0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxNSkpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMTMsIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTA3KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDgsIDM3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAzOCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIEZYX05FVyBDQkNfUVJDb2RlckVDQig4LCAyMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjEpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTIsIDExKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxMikpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMTQsIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgMTE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTE2KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDQwKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig1LCA0MSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMSwgMTYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDE3KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDExLCAxMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTMpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDE1LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDg3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgODgpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgNDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDQyKSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig3LCAyNSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMSwgMTIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDEzKSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAxNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIEZYX05FVyBDQkNfUVJDb2RlckVDQig1LCA5OCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDk5KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDQ1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCA0NikpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNSwgMTkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDIwKSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMywgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDE3LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDEwNyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDEwOCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMCwgNDYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDQ3KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDIyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNSwgMjMpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE3LCAxNSkpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMTgsIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTIwKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTIxKSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDksIDQzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA0NCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNywgMjIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDIzKSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDE0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxOSwgMTUpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDE5LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDExMyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDExNCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCA0NCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTEsIDQ1KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE3LCAyMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjIpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOSwgMTMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE2LCAxNCkpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMjAsIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgMTA3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTA4KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDQxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMywgNDIpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig1LCAyNSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNSwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMjEsIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTE2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTE3KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE3LCA0MikpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNywgMjIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDIzKSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE5LCAxNiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTcpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDExMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDExMikpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNywgNDYpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE2LCAyNSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzNCwgMTMpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDIzLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEyMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDEyMikpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA0NyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDQ4KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDExLCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDI1KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE2LCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDE2KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxMTcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxMTgpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNiwgNDUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCA0NikpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMSwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE2LCAyNSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzMCwgMTYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDE3KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAyNSwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQig4LCAxMDYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxMDcpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOCwgNDcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCA0OCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig3LCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjIsIDI1KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIyLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTMsIDE2KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMCwgMTE0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTE1KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE5LCA0NiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgNDcpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjgsIDIyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAyMykpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzMywgMTYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE3KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAyNywgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig4LCAxMjIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxMjMpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjIsIDQ1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCA0NikpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig4LCAyMyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjYsIDI0KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEyLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjgsIDE2KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCAxMTcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMCwgMTE4KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDQ1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyMywgNDYpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMxLCAyNSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMSwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMxLCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMjksIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgMTE2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgMTE3KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIxLCA0NSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgNDYpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDM3LCAyNCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxOSwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI2LCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDExNikpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxOSwgNDcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCA0OCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNSwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI1LCAyNSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyMywgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI1LCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMzEsIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTMsIDExNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDExNikpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCA0NiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjksIDQ3KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQyLCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjUpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyOCwgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDMyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE3LCAxMTUpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDQ2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyMywgNDcpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzNSwgMjUpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTksIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzNSwgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDMzLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE3LCAxMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAxMTYpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDQ2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyMSwgNDcpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjksIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxOSwgMjUpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTEsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0NiwgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDM0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCAxMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxMTYpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDQ2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyMywgNDcpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNDQsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig3LCAyNSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig1OSwgMTYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDE3KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAzNSwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMiwgMTIxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgMTIyKSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEyLCA0NyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjYsIDQ4KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDM5LCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDI1KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIyLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNDEsIDE2KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAzNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxMjEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNCwgMTIyKSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDQ3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzNCwgNDgpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNDYsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMCwgMjUpKSwNCisgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDY0LCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMzcsIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDEyMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEyMykpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyOSwgNDYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCA0NykpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0OSwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAyNSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyNCwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQ2LCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMzgsIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTIyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTgsIDEyMykpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMywgNDYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMyLCA0NykpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0OCwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCAyNSkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0MiwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMyLCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMzksIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjAsIDExNyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDExOCkpLA0KKyAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0MCwgNDcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDQ4KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQzLCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjIsIDI1KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNjcsIDE2KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICA0MCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxOSwgMTE4KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTE5KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE4LCA0NyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMzEsIDQ4KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDM0LCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMzQsIDI1KSksDQorICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIwLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNjEsIDE2KSkpKTsNCisgIH0NCisgIGlmICh2ZXJzaW9uTnVtYmVyIDwgMSB8fCB2ZXJzaW9uTnVtYmVyID4gNDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKGRpbWVuc2lvbiAtIDgsIDAsIDgsIDksIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDAsIGRpbWVuc2lvbiAtIDgsIDksIDgsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIGludDMyX3QgbWF4ID0gbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1heDsgeCsrKSB7DQotICAgICAgICBpbnQzMl90IGkgPSBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzW3hdIC0gMjsNCi0gICAgICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1heDsgeSsrKSB7DQotICAgICAgICAgICAgaWYgKCh4ID09IDAgJiYgKHkgPT0gMCB8fCB5ID09IG1heCAtIDEpKSB8fCAoeCA9PSBtYXggLSAxICYmIHkgPT0gMCkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnNbeV0gLSAyLCBpLCA1LCA1LCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgYml0TWF0cml4LT5TZXRSZWdpb24oNiwgOSwgMSwgZGltZW5zaW9uIC0gMTcsIGUpOw0KLSAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDksIDYsIGRpbWVuc2lvbiAtIDE3LCAxLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBpZiAobV92ZXJzaW9uTnVtYmVyID4gNikgew0KLSAgICAgICAgYml0TWF0cml4LT5TZXRSZWdpb24oZGltZW5zaW9uIC0gMTEsIDAsIDMsIDYsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgYml0TWF0cml4LT5TZXRSZWdpb24oMCwgZGltZW5zaW9uIC0gMTEsIDYsIDMsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICB9DQotICAgIHJldHVybiBiaXRNYXRyaXg7DQorICB9DQorICByZXR1cm4gKENCQ19RUkNvZGVyVmVyc2lvbiopKCpWRVJTSU9OKVt2ZXJzaW9uTnVtYmVyIC0gMV07DQogfQ0KLUNCQ19RUkNvZGVyVmVyc2lvbiogQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRWZXJzaW9uRm9yTnVtYmVyKGludDMyX3QgdmVyc2lvbk51bWJlciwgaW50MzJfdCAmZSkNCi17DQotICAgIGlmKFZFUlNJT04tPkdldFNpemUoKSA9PSAwKSB7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoNywgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDE5KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDE2KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxMywgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDEzKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxNywgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDkpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDEwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMzQpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjIpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTYpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE1LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgNTUpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgNDQpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTcpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTMpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oNCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgODApKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMzIpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMjQpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgOSkpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbig1LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAxMDgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgNDMpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTYpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTEpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTIpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oNiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgNjgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjcpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTkpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTUpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oNywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgNzgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMzEpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTUpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTMpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTQpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oOCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgOTcpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMzgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMzkpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTkpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTUpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oOSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTE2KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDM2KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDM3KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE2KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE3KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEyKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEzKSkpKTsNCi0gICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDEwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMTgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCA2OCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCA2OSkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA0MyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCA0NCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxOSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAyMCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxNSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAxNikpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigxMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgODEpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgNTApLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgNTEpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjMpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgMTIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOCwgMTMpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMTIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDkyKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDkzKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDM2KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDM3KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDIwKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDIxKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDE0KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE1KSkpKTsNCi0gICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDEzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxMDcpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOCwgMzcpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMzgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOCwgMjApLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjEpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTIsIDExKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEyKSkpKTsNCi0gICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDE0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCAxMTUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTE2KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDQwKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDQxKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDExLCAxNiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig1LCAxNykpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMSwgMTIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTMpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMTUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDg3KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDg4KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDQxKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDQyKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDI0KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDI1KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDExLCAxMiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig3LCAxMykpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigxNiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgOTgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgOTkpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgNDUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgNDYpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDE5KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDIwKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDE1KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCAxNikpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigxNywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTA3KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDEwOCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMCwgNDYpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgNDcpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDIzKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDE0KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE3LCAxNSkpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigxOCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTIwKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEsIDEyMSkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQig5LCA0MyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA0NCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNywgMjIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjMpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTksIDE1KSkpKTsNCi0gICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDE5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCAxMTMpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTE0KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDQ0KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDExLCA0NSkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNywgMjEpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjIpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOSwgMTMpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTYsIDE0KSkpKTsNCi0gICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDIwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCAxMDcpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTA4KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMsIDQxKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCA0MikpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNSwgMjQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMjUpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDE1KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAxNikpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigyMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTE2KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDExNykpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNywgNDIpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDIyKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDIzKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE5LCAxNiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxNykpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigyMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTExKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDExMikpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNywgNDYpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgMjQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTYsIDI1KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDM0LCAxMykpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigyMywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTIxKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDUsIDEyMikpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA0NyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNCwgNDgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTEsIDI0KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCAyNSkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNiwgMTUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDE2KSkpKTsNCi0gICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDI0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig2LCAxMTcpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTE4KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDQ1KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCA0NikpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMSwgMjQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTYsIDI1KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMwLCAxNiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyLCAxNykpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigyNSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoOCwgMTA2KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEwNykpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQig4LCA0NyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMywgNDgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgMjQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjIsIDI1KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIyLCAxNSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMywgMTYpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMjYsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAxMTQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTE1KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE5LCA0NiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCA0NykpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyOCwgMjIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNiwgMjMpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMzMsIDE2KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDE3KSkpKTsNCi0gICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDI3LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig4LCAxMjIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTIzKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIyLCA0NSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzLCA0NikpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig4LCAyMyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyNiwgMjQpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTIsIDE1KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI4LCAxNikpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigyOCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgMTE3KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAxMTgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgNDUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDQ2KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDI0KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDMxLCAyNSkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMSwgMTUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMzEsIDE2KSkpKTsNCi0gICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDI5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig3LCAxMTYpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgMTE3KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIxLCA0NSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig3LCA0NikpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAyMyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzNywgMjQpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTksIDE1KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI2LCAxNikpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigzMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTE1KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAxMTYpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTksIDQ3KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCA0OCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNSwgMjQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjUsIDI1KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIzLCAxNSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyNSwgMTYpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMzEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCAxMTUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMywgMTE2KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDQ2KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI5LCA0NykpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0MiwgMjQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjUpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDE1KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI4LCAxNikpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigzMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDExNSkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMCwgNDYpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDQ3KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEwLCAyNCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzNSwgMjUpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTksIDE1KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDM1LCAxNikpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigzMywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDExNSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAxMTYpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDQ2KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIxLCA0NykpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyOSwgMjQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTksIDI1KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDExLCAxNSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0NiwgMTYpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMzQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCAxMTUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTE2KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCA0NiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigyMywgNDcpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNDQsIDI0KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDcsIDI1KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDU5LCAxNiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxLCAxNykpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigzNSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTIsIDEyMSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig3LCAxMjIpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTIsIDQ3KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI2LCA0OCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigzOSwgMjQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDI1KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIyLCAxNSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0MSwgMTYpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMzYsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDEyMSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxNCwgMTIyKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDQ3KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDM0LCA0OCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0NiwgMjQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDI1KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIsIDE1KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDY0LCAxNikpKSk7DQotICAgICAgICBWRVJTSU9OLT5BZGQoRlhfTkVXIENCQ19RUkNvZGVyVmVyc2lvbigzNywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDEyMiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0LCAxMjMpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjksIDQ2KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCA0NykpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0OSwgMjQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDI1KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDI0LCAxNSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQig0NiwgMTYpKSkpOw0KLSAgICAgICAgVkVSU0lPTi0+QWRkKEZYX05FVyBDQkNfUVJDb2RlclZlcnNpb24oMzgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDEyMiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigxOCwgMTIzKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDEzLCA0NiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzMiwgNDcpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNDgsIDI0KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDE0LCAyNSkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0MiwgMTUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMzIsIDE2KSkpKTsNCi0gICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDM5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigyMCwgMTE3KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDQsIDExOCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQig0MCwgNDcpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNywgNDgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNDMsIDI0KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDIyLCAyNSkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxMCwgMTUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoNjcsIDE2KSkpKTsNCi0gICAgICAgIFZFUlNJT04tPkFkZChGWF9ORVcgQ0JDX1FSQ29kZXJWZXJzaW9uKDQwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxOSwgMTE4KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYsIDExOSkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIEZYX05FVyBDQkNfUVJDb2RlckVDQigxOCwgNDcpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMzEsIDQ4KSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDM0LCAyNCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQigzNCwgMjUpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBGWF9ORVcgQ0JDX1FSQ29kZXJFQ0IoMjAsIDE1KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTkVXIENCQ19RUkNvZGVyRUNCKDYxLCAxNikpKSk7DQotICAgIH0NCi0gICAgaWYodmVyc2lvbk51bWJlciA8IDEgfHwgdmVyc2lvbk51bWJlciA+IDQwKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIH0NCi0gICAgcmV0dXJuICAoQ0JDX1FSQ29kZXJWZXJzaW9uKikoKlZFUlNJT04pW3ZlcnNpb25OdW1iZXIgLSAxXTsNCi19DQotdm9pZCBDQkNfUVJDb2RlclZlcnNpb246OkRlc3Ryb3koKQ0KLXsNCi0gICAgaW50MzJfdCBpOw0KLSAgICBmb3IoaSA9IDA7IGkgPCBWRVJTSU9OLT5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgZGVsZXRlICggKENCQ19RUkNvZGVyVmVyc2lvbiopKCpWRVJTSU9OKVtpXSApOw0KLSAgICB9DQordm9pZCBDQkNfUVJDb2RlclZlcnNpb246OkRlc3Ryb3koKSB7DQorICBpbnQzMl90IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgVkVSU0lPTi0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgZGVsZXRlICgoQ0JDX1FSQ29kZXJWZXJzaW9uKikoKlZFUlNJT04pW2ldKTsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uaAppbmRleCA0NmE4MGM4Li4xNGY1MWUxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uaApAQCAtOSwzMyArOSw0MSBAQAogY2xhc3MgQ0JDX1FSQ29kZXJFQ0Jsb2NrczsNCiBjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KIGNsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQotY2xhc3MgQ0JDX1FSQ29kZXJWZXJzaW9uDQotew0KLXByaXZhdGU6DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFZFUlNJT05fREVDT0RFX0lORk9bMzRdOw0KLSAgICBzdGF0aWMgQ0ZYX1B0ckFycmF5ICpWRVJTSU9OOw0KLSAgICBpbnQzMl90IG1fdmVyc2lvbk51bWJlcjsNCi0gICAgaW50MzJfdCBtX3RvdGFsQ29kZVdvcmRzOw0KLSAgICBDRlhfSW50MzJBcnJheSBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzOw0KLSAgICBDRlhfUHRyQXJyYXkgbV9lY0Jsb2NrczsNCitjbGFzcyBDQkNfUVJDb2RlclZlcnNpb24gew0KKyBwcml2YXRlOg0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgVkVSU0lPTl9ERUNPREVfSU5GT1szNF07DQorICBzdGF0aWMgQ0ZYX1B0ckFycmF5KiBWRVJTSU9OOw0KKyAgaW50MzJfdCBtX3ZlcnNpb25OdW1iZXI7DQorICBpbnQzMl90IG1fdG90YWxDb2RlV29yZHM7DQorICBDRlhfSW50MzJBcnJheSBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzOw0KKyAgQ0ZYX1B0ckFycmF5IG1fZWNCbG9ja3M7DQogDQotICAgIENCQ19RUkNvZGVyVmVyc2lvbigpOw0KLSAgICBDQkNfUVJDb2RlclZlcnNpb24oaW50MzJfdCB2ZXJzaW9uTnVtYmVyLCBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrczEsIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMiwNCi0gICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMywgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3M0KTsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfkNCQ19RUkNvZGVyVmVyc2lvbigpOw0KLSAgICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQotICAgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBDQkNfUVJDb2RlclZlcnNpb24oKTsNCisgIENCQ19RUkNvZGVyVmVyc2lvbihpbnQzMl90IHZlcnNpb25OdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3MxLA0KKyAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMiwNCisgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrczMsDQorICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3M0KTsNCiANCi0gICAgaW50MzJfdCBHZXRWZXJzaW9uTnVtYmVyKCk7DQotICAgIGludDMyX3QgR2V0VG90YWxDb2RlV29yZHMoKTsNCi0gICAgaW50MzJfdCBHZXREaW1lbnNpb25Gb3JWZXJzaW9uKCk7DQotICAgIENCQ19Db21tb25CaXRNYXRyaXggKkJ1aWxkRnVuY3Rpb25QYXR0ZXJuKGludDMyX3QgJmUpOw0KLSAgICBDRlhfSW50MzJBcnJheSogR2V0QWxpZ25tZW50UGF0dGVybkNlbnRlcnMoKTsNCi0gICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogR2V0RUNCbG9ja3NGb3JMZXZlbChDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsICplY0xldmVsKTsNCi0gICAgc3RhdGljIENCQ19RUkNvZGVyVmVyc2lvbiogR2V0VmVyc2lvbkZvck51bWJlcihpbnQzMl90IHZlcnNpb25OdW1iZXIsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0JDX1FSQ29kZXJWZXJzaW9uKiBHZXRQcm92aXNpb25hbFZlcnNpb25Gb3JEaW1lbnNpb24oaW50MzJfdCBkaW1lbnNpb24sIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgQ0JDX1FSQ29kZXJWZXJzaW9uKiBEZWNvZGVWZXJzaW9uSW5mb3JtYXRpb24oaW50MzJfdCB2ZXJzaW9uQml0cywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIERlc3Ryb3koKTsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+Q0JDX1FSQ29kZXJWZXJzaW9uKCk7DQorICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQorICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KKw0KKyAgaW50MzJfdCBHZXRWZXJzaW9uTnVtYmVyKCk7DQorICBpbnQzMl90IEdldFRvdGFsQ29kZVdvcmRzKCk7DQorICBpbnQzMl90IEdldERpbWVuc2lvbkZvclZlcnNpb24oKTsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIEJ1aWxkRnVuY3Rpb25QYXR0ZXJuKGludDMyX3QmIGUpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIEdldEFsaWdubWVudFBhdHRlcm5DZW50ZXJzKCk7DQorICBDQkNfUVJDb2RlckVDQmxvY2tzKiBHZXRFQ0Jsb2Nrc0ZvckxldmVsKA0KKyAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwpOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyVmVyc2lvbiogR2V0VmVyc2lvbkZvck51bWJlcihpbnQzMl90IHZlcnNpb25OdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyVmVyc2lvbiogR2V0UHJvdmlzaW9uYWxWZXJzaW9uRm9yRGltZW5zaW9uKA0KKyAgICAgIGludDMyX3QgZGltZW5zaW9uLA0KKyAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyVmVyc2lvbiogRGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uKGludDMyX3QgdmVyc2lvbkJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhQmxvY2suY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YUJsb2NrLmNwcAppbmRleCAyODc3ZDJmLi5jMDQ1NTUyIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhQmxvY2suY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRhdGFCbG9jay5jcHAKQEAgLTI1LDgwICsyNSw4NyBAQAogI2luY2x1ZGUgIkJDX1FSQ29kZXJFQ0IuaCINCiAjaW5jbHVkZSAiQkNfUVJEYXRhQmxvY2suaCINCiAjaW5jbHVkZSAiQkNfUVJDb2RlclZlcnNpb24uaCINCi1DQkNfUVJEYXRhQmxvY2s6OkNCQ19RUkRhdGFCbG9jayhpbnQzMl90IG51bURhdGFDb2Rld29yZHMsIENGWF9CeXRlQXJyYXkgKmNvZGV3b3JkcykNCi0gICAgOiBtX251bURhdGFDb2Rld29yZHMobnVtRGF0YUNvZGV3b3JkcykNCi0gICAgLCBtX2NvZGV3b3Jkcyhjb2Rld29yZHMpDQotew0KK0NCQ19RUkRhdGFCbG9jazo6Q0JDX1FSRGF0YUJsb2NrKGludDMyX3QgbnVtRGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZUFycmF5KiBjb2Rld29yZHMpDQorICAgIDogbV9udW1EYXRhQ29kZXdvcmRzKG51bURhdGFDb2Rld29yZHMpLCBtX2NvZGV3b3Jkcyhjb2Rld29yZHMpIHt9DQorQ0JDX1FSRGF0YUJsb2NrOjp+Q0JDX1FSRGF0YUJsb2NrKCkgew0KKyAgaWYgKG1fY29kZXdvcmRzICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fY29kZXdvcmRzOw0KKyAgICBtX2NvZGV3b3JkcyA9IE5VTEw7DQorICB9DQogfQ0KLUNCQ19RUkRhdGFCbG9jazo6fkNCQ19RUkRhdGFCbG9jaygpDQotew0KLSAgICBpZihtX2NvZGV3b3JkcyAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgbV9jb2Rld29yZHM7DQotICAgICAgICBtX2NvZGV3b3JkcyA9IE5VTEw7DQotICAgIH0NCitpbnQzMl90IENCQ19RUkRhdGFCbG9jazo6R2V0TnVtRGF0YUNvZGV3b3JkcygpIHsNCisgIHJldHVybiBtX251bURhdGFDb2Rld29yZHM7DQogfQ0KLWludDMyX3QgQ0JDX1FSRGF0YUJsb2NrOjpHZXROdW1EYXRhQ29kZXdvcmRzKCkNCi17DQotICAgIHJldHVybiBtX251bURhdGFDb2Rld29yZHM7DQorQ0ZYX0J5dGVBcnJheSogQ0JDX1FSRGF0YUJsb2NrOjpHZXRDb2Rld29yZHMoKSB7DQorICByZXR1cm4gbV9jb2Rld29yZHM7DQogfQ0KLUNGWF9CeXRlQXJyYXkgKkNCQ19RUkRhdGFCbG9jazo6R2V0Q29kZXdvcmRzKCkNCi17DQotICAgIHJldHVybiBtX2NvZGV3b3JkczsNCi19DQotQ0ZYX1B0ckFycmF5ICpDQkNfUVJEYXRhQmxvY2s6OkdldERhdGFCbG9ja3MoQ0ZYX0J5dGVBcnJheSogcmF3Q29kZXdvcmRzLCBDQkNfUVJDb2RlclZlcnNpb24gKnZlcnNpb24sIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihyYXdDb2Rld29yZHMtPkdldFNpemUoKSAhPSB2ZXJzaW9uLT5HZXRUb3RhbENvZGVXb3JkcygpKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorQ0ZYX1B0ckFycmF5KiBDQkNfUVJEYXRhQmxvY2s6OkdldERhdGFCbG9ja3MoDQorICAgIENGWF9CeXRlQXJyYXkqIHJhd0NvZGV3b3JkcywNCisgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uLA0KKyAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAocmF3Q29kZXdvcmRzLT5HZXRTaXplKCkgIT0gdmVyc2lvbi0+R2V0VG90YWxDb2RlV29yZHMoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzID0gdmVyc2lvbi0+R2V0RUNCbG9ja3NGb3JMZXZlbChlY0xldmVsKTsNCisgIGludDMyX3QgdG90YWxCbG9ja3MgPSAwOw0KKyAgQ0ZYX1B0ckFycmF5KiBlY0Jsb2NrQXJyYXkgPSBlY0Jsb2Nrcy0+R2V0RUNCbG9ja3MoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgZWNCbG9ja0FycmF5LT5HZXRTaXplKCk7IGkrKykgew0KKyAgICB0b3RhbEJsb2NrcyArPSAoKENCQ19RUkNvZGVyRUNCKikoKmVjQmxvY2tBcnJheSlbaV0pLT5HZXRDb3VudCgpOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiBkYXRhYmxvY2sgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5KCk7DQorICBkYXRhYmxvY2stPlNldFNpemUodG90YWxCbG9ja3MpOw0KKyAgQ0JDX0F1dG9QdHI8Q0ZYX1B0ckFycmF5PiByZXN1bHQoZGF0YWJsb2NrKTsNCisgIGludDMyX3QgbnVtUmVzdWx0QmxvY2tzID0gMDsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGVjQmxvY2tBcnJheS0+R2V0U2l6ZSgpOyBqKyspIHsNCisgICAgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2sgPSAoQ0JDX1FSQ29kZXJFQ0IqKSgqZWNCbG9ja0FycmF5KVtqXTsNCisgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgZWNCbG9jay0+R2V0Q291bnQoKTsgaysrKSB7DQorICAgICAgaW50MzJfdCBudW1EYXRhQ29kZXdvcmRzID0gZWNCbG9jay0+R2V0RGF0YUNvZGVXb3JkcygpOw0KKyAgICAgIGludDMyX3QgbnVtQmxvY2tDb2Rld29yZHMgPQ0KKyAgICAgICAgICBlY0Jsb2Nrcy0+R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpICsgbnVtRGF0YUNvZGV3b3JkczsNCisgICAgICBDRlhfQnl0ZUFycmF5KiBieXRlYXJyYXkgPSBGWF9ORVcgQ0ZYX0J5dGVBcnJheSgpOw0KKyAgICAgIGJ5dGVhcnJheS0+U2V0U2l6ZShudW1CbG9ja0NvZGV3b3Jkcyk7DQorICAgICAgKCpyZXN1bHQpW251bVJlc3VsdEJsb2NrcysrXSA9DQorICAgICAgICAgIEZYX05FVyBDQkNfUVJEYXRhQmxvY2sobnVtRGF0YUNvZGV3b3JkcywgYnl0ZWFycmF5KTsNCiAgICAgfQ0KLSAgICBDQkNfUVJDb2RlckVDQmxvY2tzICplY0Jsb2NrcyA9IHZlcnNpb24tPkdldEVDQmxvY2tzRm9yTGV2ZWwoZWNMZXZlbCk7DQotICAgIGludDMyX3QgdG90YWxCbG9ja3MgPSAwOw0KLSAgICBDRlhfUHRyQXJyYXkqIGVjQmxvY2tBcnJheSA9IGVjQmxvY2tzLT5HZXRFQ0Jsb2NrcygpOw0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBmb3IoaSA9IDA7IGkgPCBlY0Jsb2NrQXJyYXktPkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICB0b3RhbEJsb2NrcyArPSAoKENCQ19RUkNvZGVyRUNCKikoKmVjQmxvY2tBcnJheSlbaV0pLT5HZXRDb3VudCgpOw0KKyAgfQ0KKyAgaW50MzJfdCBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMgPQ0KKyAgICAgICgoQ0JDX1FSRGF0YUJsb2NrKikoKnJlc3VsdClbMF0pLT5tX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBsb25nZXJCbG9ja3NTdGFydEF0ID0gcmVzdWx0LT5HZXRTaXplKCkgLSAxOw0KKyAgd2hpbGUgKGxvbmdlckJsb2Nrc1N0YXJ0QXQgPj0gMCkgew0KKyAgICBpbnQzMl90IG51bUNvZGV3b3JkcyA9ICgoQ0JDX1FSRGF0YUJsb2NrKikoKnJlc3VsdClbbG9uZ2VyQmxvY2tzU3RhcnRBdF0pDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bV9jb2Rld29yZHMtPkdldFNpemUoKTsNCisgICAgaWYgKG51bUNvZGV3b3JkcyA9PSBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBDRlhfUHRyQXJyYXkgKmRhdGFibG9jayA9IEZYX05FVyBDRlhfUHRyQXJyYXkoKTsNCi0gICAgZGF0YWJsb2NrLT5TZXRTaXplKHRvdGFsQmxvY2tzKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0ZYX1B0ckFycmF5ID4gcmVzdWx0KGRhdGFibG9jayk7DQotICAgIGludDMyX3QgbnVtUmVzdWx0QmxvY2tzID0gMDsNCi0gICAgZm9yKGludDMyX3QgaiA9IDA7IGogPCBlY0Jsb2NrQXJyYXktPkdldFNpemUoKTsgaisrKSB7DQotICAgICAgICBDQkNfUVJDb2RlckVDQiAqZWNCbG9jayA9IChDQkNfUVJDb2RlckVDQiopKCplY0Jsb2NrQXJyYXkpW2pdOw0KLSAgICAgICAgZm9yKGludDMyX3QgayA9IDA7IGsgPCBlY0Jsb2NrLT5HZXRDb3VudCgpOyBrKyspIHsNCi0gICAgICAgICAgICBpbnQzMl90IG51bURhdGFDb2Rld29yZHMgPSBlY0Jsb2NrLT5HZXREYXRhQ29kZVdvcmRzKCk7DQotICAgICAgICAgICAgaW50MzJfdCBudW1CbG9ja0NvZGV3b3JkcyA9IGVjQmxvY2tzLT5HZXRFQ0NvZGVXb3Jkc1BlckJsb2NrKCkgKyBudW1EYXRhQ29kZXdvcmRzOw0KLSAgICAgICAgICAgIENGWF9CeXRlQXJyYXkgKmJ5dGVhcnJheSA9IEZYX05FVyBDRlhfQnl0ZUFycmF5KCk7DQotICAgICAgICAgICAgYnl0ZWFycmF5LT5TZXRTaXplKG51bUJsb2NrQ29kZXdvcmRzKTsNCi0gICAgICAgICAgICAoKnJlc3VsdClbbnVtUmVzdWx0QmxvY2tzKytdID0gRlhfTkVXIENCQ19RUkRhdGFCbG9jayhudW1EYXRhQ29kZXdvcmRzLCBieXRlYXJyYXkpOw0KLSAgICAgICAgfQ0KKyAgICBsb25nZXJCbG9ja3NTdGFydEF0LS07DQorICB9DQorICBsb25nZXJCbG9ja3NTdGFydEF0Kys7DQorICBpbnQzMl90IHNob3J0ZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzID0NCisgICAgICBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMgLSBlY0Jsb2Nrcy0+R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpOw0KKyAgaW50MzJfdCByYXdDb2Rld29yZHNPZmZzZXQgPSAwOw0KKyAgaW50MzJfdCB4ID0gMDsNCisgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHNob3J0ZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzOyBrKyspIHsNCisgICAgZm9yICh4ID0gMDsgeCA8IG51bVJlc3VsdEJsb2NrczsgeCsrKSB7DQorICAgICAgKCooKChDQkNfUVJEYXRhQmxvY2sqKSgqcmVzdWx0KVt4XSktPm1fY29kZXdvcmRzKSlba10gPQ0KKyAgICAgICAgICAoKnJhd0NvZGV3b3JkcylbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KICAgICB9DQotICAgIGludDMyX3Qgc2hvcnRlckJsb2Nrc1RvdGFsQ29kZXdvcmRzID0gKChDQkNfUVJEYXRhQmxvY2sqKSgqcmVzdWx0KVswXSktPm1fY29kZXdvcmRzLT5HZXRTaXplKCk7DQotICAgIGludDMyX3QgbG9uZ2VyQmxvY2tzU3RhcnRBdCA9IHJlc3VsdC0+R2V0U2l6ZSgpIC0gMTsNCi0gICAgd2hpbGUobG9uZ2VyQmxvY2tzU3RhcnRBdCA+PSAwKSB7DQotICAgICAgICBpbnQzMl90IG51bUNvZGV3b3JkcyA9ICgoQ0JDX1FSRGF0YUJsb2NrKikoKnJlc3VsdClbbG9uZ2VyQmxvY2tzU3RhcnRBdF0pLT5tX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOw0KLSAgICAgICAgaWYobnVtQ29kZXdvcmRzID09IHNob3J0ZXJCbG9ja3NUb3RhbENvZGV3b3Jkcykgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbG9uZ2VyQmxvY2tzU3RhcnRBdC0tOw0KKyAgfQ0KKyAgZm9yICh4ID0gbG9uZ2VyQmxvY2tzU3RhcnRBdDsgeCA8IG51bVJlc3VsdEJsb2NrczsgeCsrKSB7DQorICAgICgqKCgoQ0JDX1FSRGF0YUJsb2NrKikoKnJlc3VsdClbeF0pDQorICAgICAgICAgICAtPm1fY29kZXdvcmRzKSlbc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHNdID0NCisgICAgICAgICgqcmF3Q29kZXdvcmRzKVtyYXdDb2Rld29yZHNPZmZzZXQrK107DQorICB9DQorICBpbnQzMl90IG1heCA9ICgoQ0JDX1FSRGF0YUJsb2NrKikoKnJlc3VsdClbMF0pLT5tX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOw0KKyAgZm9yIChpID0gc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkgPCBtYXg7IGkrKykgew0KKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBudW1SZXN1bHRCbG9ja3M7IHkrKykgew0KKyAgICAgIGludDMyX3QgaU9mZnNldCA9IHkgPCBsb25nZXJCbG9ja3NTdGFydEF0ID8gaSA6IGkgKyAxOw0KKyAgICAgICgqKCgoQ0JDX1FSRGF0YUJsb2NrKikoKnJlc3VsdClbeV0pLT5tX2NvZGV3b3JkcykpW2lPZmZzZXRdID0NCisgICAgICAgICAgKCpyYXdDb2Rld29yZHMpW3Jhd0NvZGV3b3Jkc09mZnNldCsrXTsNCiAgICAgfQ0KLSAgICBsb25nZXJCbG9ja3NTdGFydEF0Kys7DQotICAgIGludDMyX3Qgc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHMgPSBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMgLSBlY0Jsb2Nrcy0+R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpOw0KLSAgICBpbnQzMl90IHJhd0NvZGV3b3Jkc09mZnNldCA9IDA7DQotICAgIGludDMyX3QgeCA9IDA7DQotICAgIGZvcihpbnQzMl90IGsgPSAwOyBrIDwgc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGsrKykgew0KLSAgICAgICAgZm9yKHggPSAwOyB4IDwgbnVtUmVzdWx0QmxvY2tzOyB4KyspIHsNCi0gICAgICAgICAgICAoKigoKENCQ19RUkRhdGFCbG9jayopKCpyZXN1bHQpW3hdKS0+bV9jb2Rld29yZHMpKVtrXSA9ICgqcmF3Q29kZXdvcmRzKVtyYXdDb2Rld29yZHNPZmZzZXQrK107DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZm9yKHggPSBsb25nZXJCbG9ja3NTdGFydEF0OyB4IDwgbnVtUmVzdWx0QmxvY2tzOyB4KyspIHsNCi0gICAgICAgICgqKCgoQ0JDX1FSRGF0YUJsb2NrKikoKnJlc3VsdClbeF0pLT5tX2NvZGV3b3JkcykpW3Nob3J0ZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzXSA9ICgqcmF3Q29kZXdvcmRzKVtyYXdDb2Rld29yZHNPZmZzZXQrK107DQotICAgIH0NCi0gICAgaW50MzJfdCBtYXggPSAoKENCQ19RUkRhdGFCbG9jayopKCpyZXN1bHQpWzBdKS0+bV9jb2Rld29yZHMtPkdldFNpemUoKTsNCi0gICAgZm9yKGkgPSBzaG9ydGVyQmxvY2tzTnVtRGF0YUNvZGV3b3JkczsgaSA8IG1heDsgaSsrKSB7DQotICAgICAgICBmb3IoaW50MzJfdCB5ID0gMDsgeSA8IG51bVJlc3VsdEJsb2NrczsgeSsrKSB7DQotICAgICAgICAgICAgaW50MzJfdCBpT2Zmc2V0ID0geSA8IGxvbmdlckJsb2Nrc1N0YXJ0QXQgPyBpIDogaSArIDE7DQotICAgICAgICAgICAgKCooKChDQkNfUVJEYXRhQmxvY2sqKSgqcmVzdWx0KVt5XSktPm1fY29kZXdvcmRzKSlbaU9mZnNldF0gPSAoKnJhd0NvZGV3b3JkcylbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRhdGFCbG9jay5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YUJsb2NrLmgKaW5kZXggNDUwMjM5OC4uMDhmMWFkYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YUJsb2NrLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YUJsb2NrLmgKQEAgLTEwLDE3ICsxMCwxOSBAQAogY2xhc3MgQ0JDX1FSQ29kZXJFQ0Jsb2NrczsNCiBjbGFzcyBDQkNfUVJDb2RlckVDQjsNCiBjbGFzcyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOw0KLWNsYXNzIENCQ19RUkRhdGFCbG9jaw0KLXsNCi1wcml2YXRlOg0KLSAgICBpbnQzMl90IG1fbnVtRGF0YUNvZGV3b3JkczsNCi0gICAgQ0ZYX0J5dGVBcnJheSAqbV9jb2Rld29yZHM7DQotICAgIENCQ19RUkRhdGFCbG9jayhpbnQzMl90IG51bURhdGFDb2Rld29yZHMsIENGWF9CeXRlQXJyYXkgKmNvZGV3b3Jkcyk7DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5DQkNfUVJEYXRhQmxvY2soKTsNCi0gICAgaW50MzJfdCBHZXROdW1EYXRhQ29kZXdvcmRzKCk7DQotICAgIENGWF9CeXRlQXJyYXkqIEdldENvZGV3b3JkcygpOw0KLSAgICBzdGF0aWMgQ0ZYX1B0ckFycmF5ICpHZXREYXRhQmxvY2tzKENGWF9CeXRlQXJyYXkqIHJhd0NvZGV3b3JkcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlclZlcnNpb24gKnZlcnNpb24sIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsIGludDMyX3QgJmUpOw0KK2NsYXNzIENCQ19RUkRhdGFCbG9jayB7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fbnVtRGF0YUNvZGV3b3JkczsNCisgIENGWF9CeXRlQXJyYXkqIG1fY29kZXdvcmRzOw0KKyAgQ0JDX1FSRGF0YUJsb2NrKGludDMyX3QgbnVtRGF0YUNvZGV3b3JkcywgQ0ZYX0J5dGVBcnJheSogY29kZXdvcmRzKTsNCisNCisgcHVibGljOg0KKyAgdmlydHVhbCB+Q0JDX1FSRGF0YUJsb2NrKCk7DQorICBpbnQzMl90IEdldE51bURhdGFDb2Rld29yZHMoKTsNCisgIENGWF9CeXRlQXJyYXkqIEdldENvZGV3b3JkcygpOw0KKyAgc3RhdGljIENGWF9QdHJBcnJheSogR2V0RGF0YUJsb2NrcyhDRlhfQnl0ZUFycmF5KiByYXdDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyVmVyc2lvbiogdmVyc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhTWFzay5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhTWFzay5jcHAKaW5kZXggYmZlYThlMi4uYTQyYjY3YiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YU1hc2suY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRhdGFNYXNrLmNwcApAQCAtMjUsMTI1ICsyNSw5MiBAQAogI2luY2x1ZGUgIkJDX1FSRGF0YU1hc2suaCINCiBzdGF0aWMgaW50MzJfdCBOX0RBVEFfTUFTS1MgPSAwOw0KIENGWF9QdHJBcnJheSogQ0JDX1FSRGF0YU1hc2s6OkRBVEFfTUFTS1MgPSBOVUxMOw0KLXZvaWQgQ0JDX1FSRGF0YU1hc2s6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgREFUQV9NQVNLUyA9IEZYX05FVyBDRlhfUHRyQXJyYXkoKTsNCi0gICAgTl9EQVRBX01BU0tTID0gQnVpbGREYXRhTWFza3MoKTsNCit2b2lkIENCQ19RUkRhdGFNYXNrOjpJbml0aWFsaXplKCkgew0KKyAgREFUQV9NQVNLUyA9IEZYX05FVyBDRlhfUHRyQXJyYXkoKTsNCisgIE5fREFUQV9NQVNLUyA9IEJ1aWxkRGF0YU1hc2tzKCk7DQogfQ0KLXZvaWQgQ0JDX1FSRGF0YU1hc2s6OkZpbmFsaXplKCkNCi17DQotICAgIERlc3Ryb3koKTsNCi0gICAgZGVsZXRlIERBVEFfTUFTS1M7DQordm9pZCBDQkNfUVJEYXRhTWFzazo6RmluYWxpemUoKSB7DQorICBEZXN0cm95KCk7DQorICBkZWxldGUgREFUQV9NQVNLUzsNCiB9DQotdm9pZCBDQkNfUVJEYXRhTWFzazo6RGVzdHJveSgpDQotew0KLSAgICBpbnQzMl90IGk7DQotICAgIGZvcihpID0gMDsgaSA8IE5fREFUQV9NQVNLUzsgaSsrKSB7DQotICAgICAgICBDQkNfUVJEYXRhTWFzayogcCA9IChDQkNfUVJEYXRhTWFzayopKCpEQVRBX01BU0tTKVtpXTsNCi0gICAgICAgIGlmIChwKSB7DQotICAgICAgICAgICAgZGVsZXRlIHA7DQotICAgICAgICB9DQordm9pZCBDQkNfUVJEYXRhTWFzazo6RGVzdHJveSgpIHsNCisgIGludDMyX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBOX0RBVEFfTUFTS1M7IGkrKykgew0KKyAgICBDQkNfUVJEYXRhTWFzayogcCA9IChDQkNfUVJEYXRhTWFzayopKCpEQVRBX01BU0tTKVtpXTsNCisgICAgaWYgKHApIHsNCisgICAgICBkZWxldGUgcDsNCiAgICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENCQ19RUkRhdGFNYXNrOjpVbm1hc2tCaXRNYXRpcngoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqYml0cywgaW50MzJfdCBkaW1lbnNpb24pDQotew0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGRpbWVuc2lvbjsgaSsrKSB7DQotICAgICAgICBmb3IoaW50MzJfdCBqID0gMDsgaiA8IGRpbWVuc2lvbjsgaisrKSB7DQotICAgICAgICAgICAgaWYoSXNNYXNrZWQoaSwgaikpIHsNCi0gICAgICAgICAgICAgICAgYml0cy0+RmxpcChqLCBpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQordm9pZCBDQkNfUVJEYXRhTWFzazo6VW5tYXNrQml0TWF0aXJ4KENCQ19Db21tb25CaXRNYXRyaXgqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGltZW5zaW9uKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkaW1lbnNpb247IGkrKykgew0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBkaW1lbnNpb247IGorKykgew0KKyAgICAgIGlmIChJc01hc2tlZChpLCBqKSkgew0KKyAgICAgICAgYml0cy0+RmxpcChqLCBpKTsNCisgICAgICB9DQogICAgIH0NCisgIH0NCiB9DQotQ0JDX1FSRGF0YU1hc2sqIENCQ19RUkRhdGFNYXNrOjpGb3JSZWZlcmVuY2UoaW50MzJfdCByZWZlcmVuY2UsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihyZWZlcmVuY2UgPCAwIHx8IHJlZmVyZW5jZSA+IDcpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlZmVyZW5jZU11c3RCZUJldHdlZW4wQW5kNzsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gKENCQ19RUkRhdGFNYXNrKikoKkRBVEFfTUFTS1MpW3JlZmVyZW5jZV07DQorQ0JDX1FSRGF0YU1hc2sqIENCQ19RUkRhdGFNYXNrOjpGb3JSZWZlcmVuY2UoaW50MzJfdCByZWZlcmVuY2UsIGludDMyX3QmIGUpIHsNCisgIGlmIChyZWZlcmVuY2UgPCAwIHx8IHJlZmVyZW5jZSA+IDcpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uUmVmZXJlbmNlTXVzdEJlQmV0d2VlbjBBbmQ3Ow0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICByZXR1cm4gKENCQ19RUkRhdGFNYXNrKikoKkRBVEFfTUFTS1MpW3JlZmVyZW5jZV07DQogfQ0KLWNsYXNzIERhdGFNYXNrMDAwIDogcHVibGljIENCQ19RUkRhdGFNYXNrDQotew0KLXB1YmxpYzoNCi0gICAgRlhfQk9PTCBJc01hc2tlZChpbnQzMl90IHgsIGludDMyX3QgeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoeCArIHkpICUgMikgPT0gMDsNCi0gICAgfQ0KK2NsYXNzIERhdGFNYXNrMDAwIDogcHVibGljIENCQ19RUkRhdGFNYXNrIHsNCisgcHVibGljOg0KKyAgRlhfQk9PTCBJc01hc2tlZChpbnQzMl90IHgsIGludDMyX3QgeSkgeyByZXR1cm4gKCh4ICsgeSkgJSAyKSA9PSAwOyB9DQogfTsNCi1jbGFzcyBEYXRhTWFzazAwMSA6IHB1YmxpYyBDQkNfUVJEYXRhTWFzaw0KLXsNCi1wdWJsaWM6DQotICAgIEZYX0JPT0wgSXNNYXNrZWQoaW50MzJfdCB4LCBpbnQzMl90IHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoeCAlIDIpID09IDA7DQotICAgIH0NCitjbGFzcyBEYXRhTWFzazAwMSA6IHB1YmxpYyBDQkNfUVJEYXRhTWFzayB7DQorIHB1YmxpYzoNCisgIEZYX0JPT0wgSXNNYXNrZWQoaW50MzJfdCB4LCBpbnQzMl90IHkpIHsgcmV0dXJuICh4ICUgMikgPT0gMDsgfQ0KIH07DQotY2xhc3MgRGF0YU1hc2swMTAgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sNCi17DQotcHVibGljOg0KLSAgICBGWF9CT09MIElzTWFza2VkKGludDMyX3QgeCwgaW50MzJfdCB5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4geSAlIDMgPT0gMDsNCi0gICAgfQ0KK2NsYXNzIERhdGFNYXNrMDEwIDogcHVibGljIENCQ19RUkRhdGFNYXNrIHsNCisgcHVibGljOg0KKyAgRlhfQk9PTCBJc01hc2tlZChpbnQzMl90IHgsIGludDMyX3QgeSkgeyByZXR1cm4geSAlIDMgPT0gMDsgfQ0KIH07DQotY2xhc3MgRGF0YU1hc2swMTEgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sNCi17DQotcHVibGljOg0KLSAgICBGWF9CT09MIElzTWFza2VkKGludDMyX3QgeCwgaW50MzJfdCB5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHggKyB5KSAlIDMgPT0gMDsNCi0gICAgfQ0KK2NsYXNzIERhdGFNYXNrMDExIDogcHVibGljIENCQ19RUkRhdGFNYXNrIHsNCisgcHVibGljOg0KKyAgRlhfQk9PTCBJc01hc2tlZChpbnQzMl90IHgsIGludDMyX3QgeSkgeyByZXR1cm4gKHggKyB5KSAlIDMgPT0gMDsgfQ0KIH07DQotY2xhc3MgRGF0YU1hc2sxMDAgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sNCi17DQotcHVibGljOg0KLSAgICBGWF9CT09MIElzTWFza2VkKGludDMyX3QgeCwgaW50MzJfdCB5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKCgoeCA+PiAxKSArICh5IC8gMykpICUgMikgPT0gMDsNCi0gICAgfQ0KK2NsYXNzIERhdGFNYXNrMTAwIDogcHVibGljIENCQ19RUkRhdGFNYXNrIHsNCisgcHVibGljOg0KKyAgRlhfQk9PTCBJc01hc2tlZChpbnQzMl90IHgsIGludDMyX3QgeSkgew0KKyAgICByZXR1cm4gKCgoeCA+PiAxKSArICh5IC8gMykpICUgMikgPT0gMDsNCisgIH0NCiB9Ow0KLWNsYXNzIERhdGFNYXNrMTAxIDogcHVibGljIENCQ19RUkRhdGFNYXNrDQotew0KLXB1YmxpYzoNCi0gICAgRlhfQk9PTCBJc01hc2tlZChpbnQzMl90IHgsIGludDMyX3QgeSkNCi0gICAgew0KLSAgICAgICAgc2l6ZV90IHRlbXAgPSB4ICogeTsNCi0gICAgICAgIHJldHVybiAodGVtcCAlIDIpICsgKHRlbXAgJSAzKSA9PSAwOw0KLSAgICB9DQorY2xhc3MgRGF0YU1hc2sxMDEgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sgew0KKyBwdWJsaWM6DQorICBGWF9CT09MIElzTWFza2VkKGludDMyX3QgeCwgaW50MzJfdCB5KSB7DQorICAgIHNpemVfdCB0ZW1wID0geCAqIHk7DQorICAgIHJldHVybiAodGVtcCAlIDIpICsgKHRlbXAgJSAzKSA9PSAwOw0KKyAgfQ0KIH07DQotY2xhc3MgRGF0YU1hc2sxMTAgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sNCi17DQotcHVibGljOg0KLSAgICBGWF9CT09MIElzTWFza2VkKGludDMyX3QgeCwgaW50MzJfdCB5KQ0KLSAgICB7DQotICAgICAgICBzaXplX3QgdGVtcCA9IHggKiB5Ow0KLSAgICAgICAgcmV0dXJuICgoKHRlbXAgJSAyKSArICh0ZW1wICUgMykpICUgMikgPT0gMDsNCi0gICAgfQ0KK2NsYXNzIERhdGFNYXNrMTEwIDogcHVibGljIENCQ19RUkRhdGFNYXNrIHsNCisgcHVibGljOg0KKyAgRlhfQk9PTCBJc01hc2tlZChpbnQzMl90IHgsIGludDMyX3QgeSkgew0KKyAgICBzaXplX3QgdGVtcCA9IHggKiB5Ow0KKyAgICByZXR1cm4gKCgodGVtcCAlIDIpICsgKHRlbXAgJSAzKSkgJSAyKSA9PSAwOw0KKyAgfQ0KIH07DQotY2xhc3MgRGF0YU1hc2sxMTEgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sNCi17DQotcHVibGljOg0KLSAgICBGWF9CT09MIElzTWFza2VkKGludDMyX3QgeCwgaW50MzJfdCB5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKCgoKHggKyB5KSAlIDIpICsgKCh4ICogeSkgJSAzKSkgJSAyKSA9PSAwOw0KLSAgICB9DQorY2xhc3MgRGF0YU1hc2sxMTEgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sgew0KKyBwdWJsaWM6DQorICBGWF9CT09MIElzTWFza2VkKGludDMyX3QgeCwgaW50MzJfdCB5KSB7DQorICAgIHJldHVybiAoKCgoeCArIHkpICUgMikgKyAoKHggKiB5KSAlIDMpKSAlIDIpID09IDA7DQorICB9DQogfTsNCi1pbnQzMl90IENCQ19RUkRhdGFNYXNrOjpCdWlsZERhdGFNYXNrcygpDQotew0KLSAgICBEQVRBX01BU0tTLT5BZGQoRlhfTkVXIERhdGFNYXNrMDAwKTsNCi0gICAgREFUQV9NQVNLUy0+QWRkKEZYX05FVyBEYXRhTWFzazAwMSk7DQotICAgIERBVEFfTUFTS1MtPkFkZChGWF9ORVcgRGF0YU1hc2swMTApOw0KLSAgICBEQVRBX01BU0tTLT5BZGQoRlhfTkVXIERhdGFNYXNrMDExKTsNCi0gICAgREFUQV9NQVNLUy0+QWRkKEZYX05FVyBEYXRhTWFzazEwMCk7DQotICAgIERBVEFfTUFTS1MtPkFkZChGWF9ORVcgRGF0YU1hc2sxMDEpOw0KLSAgICBEQVRBX01BU0tTLT5BZGQoRlhfTkVXIERhdGFNYXNrMTEwKTsNCi0gICAgREFUQV9NQVNLUy0+QWRkKEZYX05FVyBEYXRhTWFzazExMSk7DQotICAgIHJldHVybiBEQVRBX01BU0tTLT5HZXRTaXplKCk7DQoraW50MzJfdCBDQkNfUVJEYXRhTWFzazo6QnVpbGREYXRhTWFza3MoKSB7DQorICBEQVRBX01BU0tTLT5BZGQoRlhfTkVXIERhdGFNYXNrMDAwKTsNCisgIERBVEFfTUFTS1MtPkFkZChGWF9ORVcgRGF0YU1hc2swMDEpOw0KKyAgREFUQV9NQVNLUy0+QWRkKEZYX05FVyBEYXRhTWFzazAxMCk7DQorICBEQVRBX01BU0tTLT5BZGQoRlhfTkVXIERhdGFNYXNrMDExKTsNCisgIERBVEFfTUFTS1MtPkFkZChGWF9ORVcgRGF0YU1hc2sxMDApOw0KKyAgREFUQV9NQVNLUy0+QWRkKEZYX05FVyBEYXRhTWFzazEwMSk7DQorICBEQVRBX01BU0tTLT5BZGQoRlhfTkVXIERhdGFNYXNrMTEwKTsNCisgIERBVEFfTUFTS1MtPkFkZChGWF9ORVcgRGF0YU1hc2sxMTEpOw0KKyAgcmV0dXJuIERBVEFfTUFTS1MtPkdldFNpemUoKTsNCiB9DQotQ0JDX1FSRGF0YU1hc2s6OkNCQ19RUkRhdGFNYXNrKCkNCi17DQotfQ0KLUNCQ19RUkRhdGFNYXNrOjp+Q0JDX1FSRGF0YU1hc2soKQ0KLXsNCi19DQorQ0JDX1FSRGF0YU1hc2s6OkNCQ19RUkRhdGFNYXNrKCkge30NCitDQkNfUVJEYXRhTWFzazo6fkNCQ19RUkRhdGFNYXNrKCkge30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhTWFzay5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YU1hc2suaAppbmRleCA3OWFlNDkwLi4zOGUwMzI0IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhTWFzay5oCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRhdGFNYXNrLmgKQEAgLTcsMTggKzcsMTcgQEAKICNpZm5kZWYgX0JDX1FSREFUQU1BU0tfSF8NCiAjZGVmaW5lIF9CQ19RUkRBVEFNQVNLX0hfDQogY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCi1jbGFzcyBDQkNfUVJEYXRhTWFzaw0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBDRlhfUHRyQXJyYXkgKkRBVEFfTUFTS1M7DQotICAgIENCQ19RUkRhdGFNYXNrKCk7DQotICAgIHZpcnR1YWwgfkNCQ19RUkRhdGFNYXNrKCk7DQotICAgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCi0gICAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MIElzTWFza2VkKGludDMyX3QgaSwgaW50MzJfdCBqKSA9IDA7DQotICAgIHZvaWQgVW5tYXNrQml0TWF0aXJ4KENCQ19Db21tb25CaXRNYXRyaXggKmJpdHMsIGludDMyX3QgZGltZW5zaW9uKTsNCi0gICAgc3RhdGljIENCQ19RUkRhdGFNYXNrKiBGb3JSZWZlcmVuY2UoaW50MzJfdCByZWZlcmVuY2UsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBCdWlsZERhdGFNYXNrcygpOw0KLSAgICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7DQorY2xhc3MgQ0JDX1FSRGF0YU1hc2sgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZYX1B0ckFycmF5KiBEQVRBX01BU0tTOw0KKyAgQ0JDX1FSRGF0YU1hc2soKTsNCisgIHZpcnR1YWwgfkNCQ19RUkRhdGFNYXNrKCk7DQorICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQorICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzTWFza2VkKGludDMyX3QgaSwgaW50MzJfdCBqKSA9IDA7DQorICB2b2lkIFVubWFza0JpdE1hdGlyeChDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzLCBpbnQzMl90IGRpbWVuc2lvbik7DQorICBzdGF0aWMgQ0JDX1FSRGF0YU1hc2sqIEZvclJlZmVyZW5jZShpbnQzMl90IHJlZmVyZW5jZSwgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgaW50MzJfdCBCdWlsZERhdGFNYXNrcygpOw0KKyAgc3RhdGljIHZvaWQgRGVzdHJveSgpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcAppbmRleCA3YzZlYTY3Li43M2Y3YzMwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcApAQCAtMzAsMjI1ICszMCwyNDQgQEAKICNpbmNsdWRlICJCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCiBjb25zdCBGWF9DSEFSKiBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpVVEZfOCA9ICJ1dGY4IjsNCiBjb25zdCBGWF9DSEFSIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkFMUEhBTlVNRVJJQ19DSEFSU1s0NV0gPSB7DQotICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsDQotICAgICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsDQotICAgICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsDQotICAgICcgJywgJyQnLCAnJScsICcqJywgJysnLCAnLScsICcuJywgJy8nLCAnOicNCi19Ow0KLUNCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkNCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIoKQ0KLXsNCi19DQotQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6fkNCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIoKQ0KLXsNCi19DQotQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZShDRlhfQnl0ZUFycmF5ICpieXRlcywgQ0JDX1FSQ29kZXJWZXJzaW9uICp2ZXJzaW9uLA0KLSAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgaW50MzJfdCBieXRlTW9kZURlY29kZSwgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19Db21tb25CaXRTb3VyY2UgYml0cyhieXRlcyk7DQotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCi0gICAgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSogY3VycmVudENoYXJhY3RlclNldEVDSSA9IE5VTEw7DQotICAgIEZYX0JPT0wgZmMxSW5mYWN0ID0gRkFMU0U7DQotICAgIENGWF9JbnQzMkFycmF5IGJ5dGVTZWdtZW50czsNCi0gICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlID0gTlVMTDsNCi0gICAgZG8gew0KLSAgICAgICAgaWYoYml0cy5BdmFpbGFibGUoKSA8IDQpIHsNCi0gICAgICAgICAgICBtb2RlID0gQ0JDX1FSQ29kZXJNb2RlOjpzVEVSTUlOQVRPUjsNCisgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywNCisgICAgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywNCisgICAgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywgJyAnLCAnJCcsICclJywgJyonLCAnKycsICctJywgJy4nLCAnLycsICc6J307DQorQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6Q0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcigpIHt9DQorQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6fkNCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIoKSB7fQ0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGUoDQorICAgIENGWF9CeXRlQXJyYXkqIGJ5dGVzLA0KKyAgICBDQkNfUVJDb2RlclZlcnNpb24qIHZlcnNpb24sDQorICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgIGludDMyX3QgYnl0ZU1vZGVEZWNvZGUsDQorICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19Db21tb25CaXRTb3VyY2UgYml0cyhieXRlcyk7DQorICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKiBjdXJyZW50Q2hhcmFjdGVyU2V0RUNJID0gTlVMTDsNCisgIEZYX0JPT0wgZmMxSW5mYWN0ID0gRkFMU0U7DQorICBDRlhfSW50MzJBcnJheSBieXRlU2VnbWVudHM7DQorICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUgPSBOVUxMOw0KKyAgZG8gew0KKyAgICBpZiAoYml0cy5BdmFpbGFibGUoKSA8IDQpIHsNCisgICAgICBtb2RlID0gQ0JDX1FSQ29kZXJNb2RlOjpzVEVSTUlOQVRPUjsNCisgICAgfSBlbHNlIHsNCisgICAgICBpbnQzMl90IGlUZW1wMSA9IGJpdHMuUmVhZEJpdHMoNCwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgIG1vZGUgPSBDQkNfUVJDb2Rlck1vZGU6OkZvckJpdHMoaVRlbXAxLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgaWYgKG1vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uVW5TdXBwb3J0TW9kZTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCEobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNURVJNSU5BVE9SKSkgew0KKyAgICAgIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0ZOQzFfRklSU1RfUE9TSVRJT04gfHwNCisgICAgICAgICAgbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX1NFQ09ORF9QT1NJVElPTikgew0KKyAgICAgICAgZmMxSW5mYWN0ID0gVFJVRTsNCisgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzU1RSVUNUVVJFRF9BUFBFTkQpIHsNCisgICAgICAgIGJpdHMuUmVhZEJpdHMoMTYsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNFQ0kpIHsNCisgICAgICAgIGludDMyX3QgdmFsdWUgPSBQYXJzZUVDSVZhbHVlKCZiaXRzLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIGN1cnJlbnRDaGFyYWN0ZXJTZXRFQ0kgPQ0KKyAgICAgICAgICAgIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0k6OkdldENoYXJhY3RlclNldEVDSUJ5VmFsdWUodmFsdWUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNHQkspIHsNCisgICAgICAgICAgYml0cy5SZWFkQml0cyg0LCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaW50MzJfdCBudW1CaXRzID0gbW9kZS0+R2V0Q2hhcmFjdGVyQ291bnRCaXRzKHZlcnNpb24sIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgaW50MzJfdCBjb3VudCA9IGJpdHMuUmVhZEJpdHMobnVtQml0cywgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKSB7DQorICAgICAgICAgIERlY29kZU51bWVyaWNTZWdtZW50KCZiaXRzLCByZXN1bHQsIGNvdW50LCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykgew0KKyAgICAgICAgICBEZWNvZGVBbHBoYW51bWVyaWNTZWdtZW50KCZiaXRzLCByZXN1bHQsIGNvdW50LCBmYzFJbmZhY3QsIGUpOw0KKyAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgew0KKyAgICAgICAgICBEZWNvZGVCeXRlU2VnbWVudCgmYml0cywgcmVzdWx0LCBjb3VudCwgY3VycmVudENoYXJhY3RlclNldEVDSSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVTZWdtZW50cywgYnl0ZU1vZGVEZWNvZGUsIGUpOw0KKyAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKSB7DQorICAgICAgICAgIERlY29kZUdCS1NlZ21lbnQoJmJpdHMsIHJlc3VsdCwgY291bnQsIGUpOw0KKyAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzS0FOSkkpIHsNCisgICAgICAgICAgRGVjb2RlS2FuamlTZWdtZW50KCZiaXRzLCByZXN1bHQsIGNvdW50LCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlUZW1wMSA9IGJpdHMuUmVhZEJpdHMoNCwgZSk7DQotICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgIG1vZGUgPSBDQkNfUVJDb2Rlck1vZGU6OkZvckJpdHMoaVRlbXAxLCBlKTsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgaWYobW9kZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblVuU3VwcG9ydE1vZGU7DQotICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgICAgICB9DQorICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblVuU3VwcG9ydE1vZGU7DQorICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmKCEobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNURVJNSU5BVE9SKSkgew0KLSAgICAgICAgICAgIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzRk5DMV9GSVJTVF9QT1NJVElPTiB8fCBtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0ZOQzFfU0VDT05EX1BPU0lUSU9OKSB7DQotICAgICAgICAgICAgICAgIGZjMUluZmFjdCA9IFRSVUU7DQotICAgICAgICAgICAgfSBlbHNlIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzU1RSVUNUVVJFRF9BUFBFTkQpIHsNCi0gICAgICAgICAgICAgICAgYml0cy5SZWFkQml0cygxNiwgZSk7DQotICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNFQ0kpIHsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSA9IFBhcnNlRUNJVmFsdWUoJmJpdHMsIGUpOw0KLSAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRDaGFyYWN0ZXJTZXRFQ0kgPSBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjpHZXRDaGFyYWN0ZXJTZXRFQ0lCeVZhbHVlKHZhbHVlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZihtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykgew0KLSAgICAgICAgICAgICAgICAgICAgYml0cy5SZWFkQml0cyg0LCBlKTsNCi0gICAgICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpbnQzMl90IG51bUJpdHMgPSBtb2RlLT5HZXRDaGFyYWN0ZXJDb3VudEJpdHModmVyc2lvbiwgZSk7DQotICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCA9IGJpdHMuUmVhZEJpdHMobnVtQml0cywgZSk7DQotICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgICAgICAgICAgaWYobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKSB7DQotICAgICAgICAgICAgICAgICAgICBEZWNvZGVOdW1lcmljU2VnbWVudCgmYml0cywgcmVzdWx0LCBjb3VudCwgZSk7DQotICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykgew0KLSAgICAgICAgICAgICAgICAgICAgRGVjb2RlQWxwaGFudW1lcmljU2VnbWVudCgmYml0cywgcmVzdWx0LCBjb3VudCwgZmMxSW5mYWN0LCBlKTsNCi0gICAgICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgew0KLSAgICAgICAgICAgICAgICAgICAgRGVjb2RlQnl0ZVNlZ21lbnQoJmJpdHMsIHJlc3VsdCwgY291bnQsIGN1cnJlbnRDaGFyYWN0ZXJTZXRFQ0ksICZieXRlU2VnbWVudHMsIGJ5dGVNb2RlRGVjb2RlLCBlKTsNCi0gICAgICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKSB7DQotICAgICAgICAgICAgICAgICAgICBEZWNvZGVHQktTZWdtZW50KCZiaXRzLCByZXN1bHQsIGNvdW50LCBlKTsNCi0gICAgICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzS0FOSkkpIHsNCi0gICAgICAgICAgICAgICAgICAgIERlY29kZUthbmppU2VnbWVudCgmYml0cywgcmVzdWx0LCBjb3VudCwgZSk7DQotICAgICAgICAgICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25VblN1cHBvcnRNb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlICghKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzVEVSTUlOQVRPUikpOw0KLSAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCAqdGVtcENkID0gRlhfTkVXIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KCk7DQotICAgIHRlbXBDZC0+SW5pdCgqYnl0ZXMsIHJlc3VsdCwgYnl0ZVNlZ21lbnRzLCBlY0xldmVsLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gdGVtcENkOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSB3aGlsZSAoIShtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c1RFUk1JTkFUT1IpKTsNCisgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiB0ZW1wQ2QgPSBGWF9ORVcgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKTsNCisgIHRlbXBDZC0+SW5pdCgqYnl0ZXMsIHJlc3VsdCwgYnl0ZVNlZ21lbnRzLCBlY0xldmVsLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiB0ZW1wQ2Q7DQogfQ0KLXZvaWQgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlR0JLU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90IGNvdW50LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyOw0KLSAgICBpbnQzMl90IG9mZnNldCA9IDA7DQotICAgIHdoaWxlIChjb3VudCA+IDApIHsNCi0gICAgICAgIGludDMyX3QgdHdvQnl0ZXMgPSBiaXRzLT5SZWFkQml0cygxMywgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIGludDMyX3QgYXNzZW1ibGVkVHdvQnl0ZXMgPSAoKHR3b0J5dGVzIC8gMHgwNjApIDw8IDgpIHwgKHR3b0J5dGVzICUgMHgwNjApOw0KLSAgICAgICAgaWYgKGFzc2VtYmxlZFR3b0J5dGVzIDw9IDB4MDA5NWQpIHsNCi0gICAgICAgICAgICBhc3NlbWJsZWRUd29CeXRlcyArPSAweDBhMWExOw0KK3ZvaWQgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlR0JLU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyBidWZmZXI7DQorICBpbnQzMl90IG9mZnNldCA9IDA7DQorICB3aGlsZSAoY291bnQgPiAwKSB7DQorICAgIGludDMyX3QgdHdvQnl0ZXMgPSBiaXRzLT5SZWFkQml0cygxMywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBpbnQzMl90IGFzc2VtYmxlZFR3b0J5dGVzID0gKCh0d29CeXRlcyAvIDB4MDYwKSA8PCA4KSB8ICh0d29CeXRlcyAlIDB4MDYwKTsNCisgICAgaWYgKGFzc2VtYmxlZFR3b0J5dGVzIDw9IDB4MDA5NWQpIHsNCisgICAgICBhc3NlbWJsZWRUd29CeXRlcyArPSAweDBhMWExOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGFzc2VtYmxlZFR3b0J5dGVzICs9IDB4MGE2YTE7DQorICAgIH0NCisgICAgYnVmZmVyICs9ICh1aW50OF90KShhc3NlbWJsZWRUd29CeXRlcyA+PiA4KTsNCisgICAgYnVmZmVyICs9ICh1aW50OF90KWFzc2VtYmxlZFR3b0J5dGVzOw0KKyAgICBjb3VudC0tOw0KKyAgfQ0KKyAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpMb2NhbGVUb1V0ZjgoYnVmZmVyLCByZXN1bHQpOw0KK30NCit2b2lkIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZUthbmppU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyBidWZmZXI7DQorICB3aGlsZSAoY291bnQgPiAwKSB7DQorICAgIGludDMyX3QgdHdvQnl0ZXMgPSBiaXRzLT5SZWFkQml0cygxMywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBpbnQzMl90IGFzc2VtYmxlZFR3b0J5dGVzID0gKCh0d29CeXRlcyAvIDB4MGMwKSA8PCA4KSB8ICh0d29CeXRlcyAlIDB4MGMwKTsNCisgICAgaWYgKGFzc2VtYmxlZFR3b0J5dGVzIDw9IDB4MDFmMDApIHsNCisgICAgICBhc3NlbWJsZWRUd29CeXRlcyArPSAweDA4MTQwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGFzc2VtYmxlZFR3b0J5dGVzICs9IDB4MGMxNDA7DQorICAgIH0NCisgICAgYnVmZmVyICs9ICh1aW50OF90KShhc3NlbWJsZWRUd29CeXRlcyA+PiA4KTsNCisgICAgYnVmZmVyICs9ICh1aW50OF90KWFzc2VtYmxlZFR3b0J5dGVzOw0KKyAgICBjb3VudC0tOw0KKyAgfQ0KKyAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpMb2NhbGVUb1V0ZjgoYnVmZmVyLCByZXN1bHQpOw0KK30NCit2b2lkIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZUJ5dGVTZWdtZW50KA0KKyAgICBDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLA0KKyAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0LA0KKyAgICBpbnQzMl90IGNvdW50LA0KKyAgICBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKiBjdXJyZW50Q2hhcmFjdGVyU2V0RUNJLA0KKyAgICBDRlhfSW50MzJBcnJheSogYnl0ZVNlZ21lbnRzLA0KKyAgICBpbnQzMl90IGJ5dGVNb2RlRGVjb2RlLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY291bnQgPCAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGlmICgoY291bnQgPDwgMykgPiBiaXRzLT5BdmFpbGFibGUoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIHVpbnQ4X3QqIHJlYWRCeXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIGNvdW50KTsNCisgIEZYU1lTX21lbXNldChyZWFkQnl0ZXMsIDB4MDAsIGNvdW50KTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsNCisgICAgcmVhZEJ5dGVzW2ldID0gKHVpbnQ4X3QpYml0cy0+UmVhZEJpdHMoOCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnMocmVhZEJ5dGVzLCBjb3VudCk7DQorICByZXN1bHQgKz0gYnM7DQorICBGWF9GcmVlKHJlYWRCeXRlcyk7DQorfQ0KK3ZvaWQgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlQWxwaGFudW1lcmljU2VnbWVudCgNCisgICAgQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgaW50MzJfdCBjb3VudCwNCisgICAgRlhfQk9PTCBmYWMxSW5FZmZlY3QsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgc3RhcnQgPSByZXN1bHQuR2V0TGVuZ3RoKCk7DQorICB3aGlsZSAoY291bnQgPiAxKSB7DQorICAgIGludDMyX3QgbmV4dFR3b0NoYXJzQml0cyA9IGJpdHMtPlJlYWRCaXRzKDExLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFOVU1FUklDX0NIQVJTW25leHRUd29DaGFyc0JpdHMgLyA0NV0pOw0KKyAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBTlVNRVJJQ19DSEFSU1tuZXh0VHdvQ2hhcnNCaXRzICUgNDVdKTsNCisgICAgY291bnQgLT0gMjsNCisgIH0NCisgIGlmIChjb3VudCA9PSAxKSB7DQorICAgIGludDMyX3QgaXRlbXAgPSBiaXRzLT5SZWFkQml0cyg2LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgQUxQSEFOVU1FUklDX0NIQVJTW2l0ZW1wXSk7DQorICB9DQorICBpZiAoZmFjMUluRWZmZWN0KSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gc3RhcnQ7IGkgPCByZXN1bHQuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICAgIGlmIChyZXN1bHRbaV0gPT0gJyUnKSB7DQorICAgICAgICBpZiAoKGkgPCByZXN1bHQuR2V0TGVuZ3RoKCkgLSAxKSAmJiByZXN1bHRbaSArIDFdID09ICclJykgew0KKyAgICAgICAgICByZXN1bHQuRGVsZXRlKGkgKyAxLCAxKTsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgYXNzZW1ibGVkVHdvQnl0ZXMgKz0gMHgwYTZhMTsNCisgICAgICAgICAgcmVzdWx0LlNldEF0KGksIChGWF9DSEFSKTB4MWQpOw0KICAgICAgICAgfQ0KLSAgICAgICAgYnVmZmVyICs9ICh1aW50OF90KSAoYXNzZW1ibGVkVHdvQnl0ZXMgPj4gOCk7DQotICAgICAgICBidWZmZXIgKz0gKHVpbnQ4X3QpIGFzc2VtYmxlZFR3b0J5dGVzOw0KLSAgICAgICAgY291bnQtLTsNCisgICAgICB9DQogICAgIH0NCi0gICAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpMb2NhbGVUb1V0ZjgoYnVmZmVyLCByZXN1bHQpOw0KKyAgfQ0KIH0NCi12b2lkIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZUthbmppU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90IGNvdW50LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyOw0KLSAgICB3aGlsZSAoY291bnQgPiAwKSB7DQotICAgICAgICBpbnQzMl90IHR3b0J5dGVzID0gYml0cy0+UmVhZEJpdHMoMTMsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICBpbnQzMl90IGFzc2VtYmxlZFR3b0J5dGVzID0gKCh0d29CeXRlcyAvIDB4MGMwKSA8PCA4KSB8ICh0d29CeXRlcyAlIDB4MGMwKTsNCi0gICAgICAgIGlmIChhc3NlbWJsZWRUd29CeXRlcyA8PSAweDAxZjAwKSB7DQotICAgICAgICAgICAgYXNzZW1ibGVkVHdvQnl0ZXMgKz0gMHgwODE0MDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgYXNzZW1ibGVkVHdvQnl0ZXMgKz0gMHgwYzE0MDsNCi0gICAgICAgIH0NCi0gICAgICAgIGJ1ZmZlciArPSAodWludDhfdCkgKGFzc2VtYmxlZFR3b0J5dGVzID4+IDgpOw0KLSAgICAgICAgYnVmZmVyICs9ICh1aW50OF90KSBhc3NlbWJsZWRUd29CeXRlczsNCi0gICAgICAgIGNvdW50LS07DQordm9pZCBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVOdW1lcmljU2VnbWVudCgNCisgICAgQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgaW50MzJfdCBjb3VudCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgd2hpbGUgKGNvdW50ID49IDMpIHsNCisgICAgaW50MzJfdCB0aHJlZURpZ2l0c0JpdHMgPSBiaXRzLT5SZWFkQml0cygxMCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBpZiAodGhyZWVEaWdpdHNCaXRzID49IDEwMDApIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KICAgICB9DQotICAgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6TG9jYWxlVG9VdGY4KGJ1ZmZlciwgcmVzdWx0KTsNCisgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQU5VTUVSSUNfQ0hBUlNbdGhyZWVEaWdpdHNCaXRzIC8gMTAwXSk7DQorICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFOVU1FUklDX0NIQVJTWyh0aHJlZURpZ2l0c0JpdHMgLyAxMCkgJSAxMF0pOw0KKyAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBTlVNRVJJQ19DSEFSU1t0aHJlZURpZ2l0c0JpdHMgJSAxMF0pOw0KKyAgICBjb3VudCAtPSAzOw0KKyAgfQ0KKyAgaWYgKGNvdW50ID09IDIpIHsNCisgICAgaW50MzJfdCB0d29EaWdpdEJpdHMgPSBiaXRzLT5SZWFkQml0cyg3LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIGlmICh0d29EaWdpdEJpdHMgPj0gMTAwKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsIEFMUEhBTlVNRVJJQ19DSEFSU1t0d29EaWdpdEJpdHMgLyAxMF0pOw0KKyAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsIEFMUEhBTlVNRVJJQ19DSEFSU1t0d29EaWdpdEJpdHMgJSAxMF0pOw0KKyAgfSBlbHNlIGlmIChjb3VudCA9PSAxKSB7DQorICAgIGludDMyX3QgZGlnaXRCaXRzID0gYml0cy0+UmVhZEJpdHMoNCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBpZiAoZGlnaXRCaXRzID49IDEwKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsIEFMUEhBTlVNRVJJQ19DSEFSU1tkaWdpdEJpdHNdKTsNCisgIH0NCiB9DQotdm9pZCBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVCeXRlU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90IGNvdW50LA0KLSAgICAgICAgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSAqY3VycmVudENoYXJhY3RlclNldEVDSSwNCi0gICAgICAgIENGWF9JbnQzMkFycmF5ICpieXRlU2VnbWVudHMsIGludDMyX3QgYnl0ZU1vZGVEZWNvZGUsIGludDMyX3QgJmUpDQotew0KLSAgICBpZihjb3VudCA8IDApIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgIH0NCi0gICAgaWYoKGNvdW50IDw8IDMpID4gYml0cy0+QXZhaWxhYmxlKCkpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLSAgICB1aW50OF90ICpyZWFkQnl0ZXMgPSBGWF9BbGxvYyh1aW50OF90LCBjb3VudCk7DQotICAgIEZYU1lTX21lbXNldChyZWFkQnl0ZXMsIDB4MDAsIGNvdW50KTsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQotICAgICAgICByZWFkQnl0ZXNbaV0gPSAodWludDhfdCkgYml0cy0+UmVhZEJpdHMoOCwgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZyBicyhyZWFkQnl0ZXMsIGNvdW50KTsNCi0gICAgcmVzdWx0ICs9IGJzOw0KLSAgICBGWF9GcmVlKHJlYWRCeXRlcyk7DQorY29uc3QgQ0ZYX0J5dGVTdHJpbmcgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6R3Vlc3NFbmNvZGluZygNCisgICAgQ0ZYX0J5dGVBcnJheSogYnl0ZXMpIHsNCisgIHJldHVybiAqVVRGXzg7DQogfQ0KLXZvaWQgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlQWxwaGFudW1lcmljU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLA0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgaW50MzJfdCBjb3VudCwgRlhfQk9PTCBmYWMxSW5FZmZlY3QsIGludDMyX3QgJmUpDQotew0KLSAgICBpbnQzMl90IHN0YXJ0ID0gcmVzdWx0LkdldExlbmd0aCgpOw0KLSAgICB3aGlsZShjb3VudCA+IDEpIHsNCi0gICAgICAgIGludDMyX3QgbmV4dFR3b0NoYXJzQml0cyA9IGJpdHMtPlJlYWRCaXRzKDExLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCBBTFBIQU5VTUVSSUNfQ0hBUlNbbmV4dFR3b0NoYXJzQml0cyAvIDQ1XSk7DQotICAgICAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsIEFMUEhBTlVNRVJJQ19DSEFSU1tuZXh0VHdvQ2hhcnNCaXRzICUgNDVdKTsNCi0gICAgICAgIGNvdW50IC09IDI7DQotICAgIH0NCi0gICAgaWYoY291bnQgPT0gMSkgew0KLSAgICAgICAgaW50MzJfdCBpdGVtcCA9IGJpdHMtPlJlYWRCaXRzKDYsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsICAxLCBBTFBIQU5VTUVSSUNfQ0hBUlNbaXRlbXBdKTsNCi0gICAgfQ0KLSAgICBpZihmYWMxSW5FZmZlY3QpIHsNCi0gICAgICAgIGZvcihpbnQzMl90IGkgPSBzdGFydDsgaSA8IHJlc3VsdC5HZXRMZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICAgICAgaWYocmVzdWx0W2ldID09ICclJykgew0KLSAgICAgICAgICAgICAgICBpZigoaSA8IHJlc3VsdC5HZXRMZW5ndGgoKSAtIDEpICYmIHJlc3VsdFtpICsgMV0gPT0gJyUnKSB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuRGVsZXRlKGkgKyAxLCAxKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5TZXRBdChpLCAoRlhfQ0hBUikweDFkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZU51bWVyaWNTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsIENGWF9CeXRlU3RyaW5nICZyZXN1bHQsIGludDMyX3QgY291bnQsIGludDMyX3QgJmUpDQotew0KLSAgICB3aGlsZShjb3VudCA+PSAzKSB7DQotICAgICAgICBpbnQzMl90IHRocmVlRGlnaXRzQml0cyA9IGJpdHMtPlJlYWRCaXRzKDEwLCBlKTsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgaWYodGhyZWVEaWdpdHNCaXRzID49IDEwMDApIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCBBTFBIQU5VTUVSSUNfQ0hBUlNbdGhyZWVEaWdpdHNCaXRzIC8gMTAwXSk7DQotICAgICAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsIEFMUEhBTlVNRVJJQ19DSEFSU1sodGhyZWVEaWdpdHNCaXRzIC8gMTApICUgMTBdKTsNCi0gICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgQUxQSEFOVU1FUklDX0NIQVJTW3RocmVlRGlnaXRzQml0cyAlIDEwXSk7DQotICAgICAgICBjb3VudCAtPSAzOw0KLSAgICB9DQotICAgIGlmKGNvdW50ID09IDIpIHsNCi0gICAgICAgIGludDMyX3QgdHdvRGlnaXRCaXRzID0gYml0cy0+UmVhZEJpdHMoNywgZSk7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIGlmKHR3b0RpZ2l0Qml0cyA+PSAxMDApIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCBBTFBIQU5VTUVSSUNfQ0hBUlNbdHdvRGlnaXRCaXRzIC8gMTBdKTsNCi0gICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgQUxQSEFOVU1FUklDX0NIQVJTW3R3b0RpZ2l0Qml0cyAlIDEwXSk7DQotICAgIH0gZWxzZSBpZihjb3VudCA9PSAxKSB7DQotICAgICAgICBpbnQzMl90IGRpZ2l0Qml0cyA9IGJpdHMtPlJlYWRCaXRzKDQsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQotICAgICAgICBpZihkaWdpdEJpdHMgPj0gMTApIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCBBTFBIQU5VTUVSSUNfQ0hBUlNbZGlnaXRCaXRzXSk7DQotICAgIH0NCi19DQotY29uc3QgQ0ZYX0J5dGVTdHJpbmcgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6R3Vlc3NFbmNvZGluZyhDRlhfQnl0ZUFycmF5ICpieXRlcykNCi17DQotICAgIHJldHVybiAqVVRGXzg7DQotfQ0KLWludDMyX3QgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6UGFyc2VFQ0lWYWx1ZShDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBmaXJzdEJ5dGUgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCitpbnQzMl90IENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlBhcnNlRUNJVmFsdWUoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBmaXJzdEJ5dGUgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgIGlmICgoZmlyc3RCeXRlICYgMHg4MCkgPT0gMCkgew0KKyAgICByZXR1cm4gZmlyc3RCeXRlICYgMHg3ZjsNCisgIH0gZWxzZSBpZiAoKGZpcnN0Qnl0ZSAmIDB4YzApID09IDB4ODApIHsNCisgICAgaW50MzJfdCBzZWNvbmRCeXRlID0gYml0cy0+UmVhZEJpdHMoOCwgZSk7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgaWYoKGZpcnN0Qnl0ZSAmIDB4ODApID09IDApIHsNCi0gICAgICAgIHJldHVybiBmaXJzdEJ5dGUgJiAweDdmOw0KLSAgICB9IGVsc2UgaWYoKGZpcnN0Qnl0ZSAmIDB4YzApID09IDB4ODApIHsNCi0gICAgICAgIGludDMyX3Qgc2Vjb25kQnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KLSAgICAgICAgcmV0dXJuICgoZmlyc3RCeXRlICYgMHgzZikgPDwgOCkgfCBzZWNvbmRCeXRlOw0KLSAgICB9IGVsc2UgaWYoKGZpcnN0Qnl0ZSAmIDB4ZTApID09IDB4YzApIHsNCi0gICAgICAgIGludDMyX3Qgc2Vjb25kVGhpcmRCeXRlID0gYml0cy0+UmVhZEJpdHMoMTYsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KLSAgICAgICAgcmV0dXJuICgoZmlyc3RCeXRlICYgMHgxZikgPDwgMTYpIHwgc2Vjb25kVGhpcmRCeXRlOw0KLSAgICB9DQotICAgIGUgPSBCQ0V4Y2VwdGlvbkJhZEVDSTsNCisgICAgcmV0dXJuICgoZmlyc3RCeXRlICYgMHgzZikgPDwgOCkgfCBzZWNvbmRCeXRlOw0KKyAgfSBlbHNlIGlmICgoZmlyc3RCeXRlICYgMHhlMCkgPT0gMHhjMCkgew0KKyAgICBpbnQzMl90IHNlY29uZFRoaXJkQnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDE2LCBlKTsNCiAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KLSAgICByZXR1cm4gMDsNCisgICAgcmV0dXJuICgoZmlyc3RCeXRlICYgMHgxZikgPDwgMTYpIHwgc2Vjb25kVGhpcmRCeXRlOw0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uQmFkRUNJOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgcmV0dXJuIDA7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuaAppbmRleCBlNmI1NTZlLi44NDkxNmZhIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oCkBAIC0xMSwyNCArMTEsNDcgQEAKIGNsYXNzIENCQ19Db21tb25CaXRTb3VyY2U7DQogY2xhc3MgQ0JDX1FSQ29kZXJWZXJzaW9uOw0KIGNsYXNzIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0k7DQotY2xhc3MgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcg0KLXsNCi1wcml2YXRlOg0KLSAgICBjb25zdCBzdGF0aWMgRlhfQ0hBUiBBTFBIQU5VTUVSSUNfQ0hBUlNbNDVdOw0KLSAgICBzdGF0aWMgY29uc3QgRlhfQ0hBUiogVVRGXzg7DQotICAgIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIoKTsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfkNCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIoKTsNCi0gICAgc3RhdGljIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBEZWNvZGUoQ0ZYX0J5dGVBcnJheSAqYnl0ZXMsIENCQ19RUkNvZGVyVmVyc2lvbiAqdmVyc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwgaW50MzJfdCBieXRlTW9kZURlY29kZSwgaW50MzJfdCAmZSk7DQorY2xhc3MgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlciB7DQorIHByaXZhdGU6DQorICBjb25zdCBzdGF0aWMgRlhfQ0hBUiBBTFBIQU5VTUVSSUNfQ0hBUlNbNDVdOw0KKyAgc3RhdGljIGNvbnN0IEZYX0NIQVIqIFVURl84Ow0KKyAgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcigpOw0KIA0KLSAgICBzdGF0aWMgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgR3Vlc3NFbmNvZGluZyhDRlhfQnl0ZUFycmF5KiBieXRlcyk7DQotICAgIHN0YXRpYyBpbnQzMl90IFBhcnNlRUNJVmFsdWUoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIERlY29kZUdCS1NlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgaW50MzJfdCBjb3VudCwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIERlY29kZUthbmppU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90IGNvdW50LCBpbnQzMl90ICZlKTsNCi0gICAgc3RhdGljIHZvaWQgRGVjb2RlTnVtZXJpY1NlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgaW50MzJfdCBjb3VudCwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyB2b2lkIERlY29kZUFscGhhbnVtZXJpY1NlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgQ0ZYX0J5dGVTdHJpbmcgJnJlc3VsdCwgaW50MzJfdCBjb3VudCwgRlhfQk9PTCBmYWMxSW5FZmZlY3QsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgdm9pZCBEZWNvZGVCeXRlU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLCBDRlhfQnl0ZVN0cmluZyAmcmVzdWx0LCBpbnQzMl90IGNvdW50LCBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJICpjdXJyZW50Q2hhcmFjdGVyU2V0RUNJLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSAqYnl0ZVNlZ21lbnRzLCBpbnQzMl90IGJ5dGVNb2RlRGVjb2RlLCBpbnQzMl90ICZlKTsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+Q0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcigpOw0KKyAgc3RhdGljIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBEZWNvZGUoDQorICAgICAgQ0ZYX0J5dGVBcnJheSogYnl0ZXMsDQorICAgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uLA0KKyAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgaW50MzJfdCBieXRlTW9kZURlY29kZSwNCisgICAgICBpbnQzMl90JiBlKTsNCisNCisgIHN0YXRpYyBjb25zdCBDRlhfQnl0ZVN0cmluZyBHdWVzc0VuY29kaW5nKENGWF9CeXRlQXJyYXkqIGJ5dGVzKTsNCisgIHN0YXRpYyBpbnQzMl90IFBhcnNlRUNJVmFsdWUoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBEZWNvZGVHQktTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRGVjb2RlS2FuamlTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRGVjb2RlTnVtZXJpY1NlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBEZWNvZGVBbHBoYW51bWVyaWNTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgZmFjMUluRWZmZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIERlY29kZUJ5dGVTZWdtZW50KA0KKyAgICAgIENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kqIGN1cnJlbnRDaGFyYWN0ZXJTZXRFQ0ksDQorICAgICAgQ0ZYX0ludDMyQXJyYXkqIGJ5dGVTZWdtZW50cywNCisgICAgICBpbnQzMl90IGJ5dGVNb2RlRGVjb2RlLA0KKyAgICAgIGludDMyX3QmIGUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGV0ZWN0b3IuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGV0ZWN0b3IuY3BwCmluZGV4IDBiNzVkYTcuLjBhOTVkZGMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZXRlY3Rvci5jcHAKQEAgLTMxLDIzNCArMzEsMjQ1IEBACiAjaW5jbHVkZSAiQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyLmgiDQogI2luY2x1ZGUgIkJDX1FSRGV0ZWN0b3JSZXN1bHQuaCINCiAjaW5jbHVkZSAiQkNfUVJEZXRlY3Rvci5oIg0KLUNCQ19RUkRldGVjdG9yOjpDQkNfUVJEZXRlY3RvcihDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSk6IG1faW1hZ2UoaW1hZ2UpDQotew0KK0NCQ19RUkRldGVjdG9yOjpDQkNfUVJEZXRlY3RvcihDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSkgOiBtX2ltYWdlKGltYWdlKSB7fQ0KK0NCQ19RUkRldGVjdG9yOjp+Q0JDX1FSRGV0ZWN0b3IoKSB7fQ0KK0NCQ19RUkRldGVjdG9yUmVzdWx0KiBDQkNfUVJEZXRlY3Rvcjo6RGV0ZWN0KGludDMyX3QgaGludHMsIGludDMyX3QmIGUpIHsNCisgIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIgZmluZGVyKG1faW1hZ2UpOw0KKyAgQ0JDX1FSRmluZGVyUGF0dGVybkluZm8qIHFwaSA9IGZpbmRlci5GaW5kKGhpbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENCQ19RUkZpbmRlclBhdHRlcm5JbmZvPiBpbmZvKHFwaSk7DQorICBDQkNfUVJEZXRlY3RvclJlc3VsdCogcWRyID0gUHJvY2Vzc0ZpbmRlclBhdHRlcm5JbmZvKGluZm8uZ2V0KCksIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHFkcjsNCiB9DQotQ0JDX1FSRGV0ZWN0b3I6On5DQkNfUVJEZXRlY3RvcigpDQotew0KLX0NCi1DQkNfUVJEZXRlY3RvclJlc3VsdCAqQ0JDX1FSRGV0ZWN0b3I6OkRldGVjdChpbnQzMl90IGhpbnRzLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlciBmaW5kZXIobV9pbWFnZSk7DQotICAgIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvKiBxcGkgPSBmaW5kZXIuRmluZChoaW50cywgZSk7DQorQ0JDX1FSRGV0ZWN0b3JSZXN1bHQqIENCQ19RUkRldGVjdG9yOjpQcm9jZXNzRmluZGVyUGF0dGVybkluZm8oDQorICAgIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvKiBpbmZvLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQXV0b1B0cjxDQkNfUVJGaW5kZXJQYXR0ZXJuPiB0b3BMZWZ0KGluZm8tPkdldFRvcExlZnQoKSk7DQorICBDQkNfQXV0b1B0cjxDQkNfUVJGaW5kZXJQYXR0ZXJuPiB0b3BSaWdodChpbmZvLT5HZXRUb3BSaWdodCgpKTsNCisgIENCQ19BdXRvUHRyPENCQ19RUkZpbmRlclBhdHRlcm4+IGJvdHRvbUxlZnQoaW5mby0+R2V0Qm90dG9tTGVmdCgpKTsNCisgIEZYX0ZMT0FUIG1vZHVsZVNpemUgPQ0KKyAgICAgIENhbGN1bGF0ZU1vZHVsZVNpemUodG9wTGVmdC5nZXQoKSwgdG9wUmlnaHQuZ2V0KCksIGJvdHRvbUxlZnQuZ2V0KCkpOw0KKyAgaWYgKG1vZHVsZVNpemUgPCAxLjBmKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1FSRmluZGVyUGF0dGVybkluZm8+IGluZm8ocXBpKTsNCi0gICAgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQqIHFkciA9IFByb2Nlc3NGaW5kZXJQYXR0ZXJuSW5mbyhpbmZvLmdldCgpLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICByZXR1cm4gcWRyOw0KLX0NCi1DQkNfUVJEZXRlY3RvclJlc3VsdCogQ0JDX1FSRGV0ZWN0b3I6OlByb2Nlc3NGaW5kZXJQYXR0ZXJuSW5mbyhDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbyAqaW5mbywgaW50MzJfdCAmZSkNCi17DQotICAgIENCQ19BdXRvUHRyPENCQ19RUkZpbmRlclBhdHRlcm4+IHRvcExlZnQoaW5mby0+R2V0VG9wTGVmdCgpKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX1FSRmluZGVyUGF0dGVybj4gdG9wUmlnaHQoaW5mby0+R2V0VG9wUmlnaHQoKSk7DQotICAgIENCQ19BdXRvUHRyPENCQ19RUkZpbmRlclBhdHRlcm4+IGJvdHRvbUxlZnQoaW5mby0+R2V0Qm90dG9tTGVmdCgpKTsNCi0gICAgRlhfRkxPQVQgbW9kdWxlU2l6ZSA9IENhbGN1bGF0ZU1vZHVsZVNpemUodG9wTGVmdC5nZXQoKSwgdG9wUmlnaHQuZ2V0KCksIGJvdHRvbUxlZnQuZ2V0KCkpOw0KLSAgICBpZihtb2R1bGVTaXplIDwgMS4wZikgew0KLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCi0gICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIGludDMyX3QgZGltZW5zaW9uID0gQ29tcHV0ZURpbWVuc2lvbih0b3BMZWZ0LmdldCgpLCB0b3BSaWdodC5nZXQoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b21MZWZ0LmdldCgpLCBtb2R1bGVTaXplLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19RUkNvZGVyVmVyc2lvbiogcHJvdmlzaW9uYWxWZXJzaW9uID0NCisgICAgICBDQkNfUVJDb2RlclZlcnNpb246OkdldFByb3Zpc2lvbmFsVmVyc2lvbkZvckRpbWVuc2lvbihkaW1lbnNpb24sIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgaW50MzJfdCBtb2R1bGVzQmV0d2VlbkZQQ2VudGVycyA9DQorICAgICAgcHJvdmlzaW9uYWxWZXJzaW9uLT5HZXREaW1lbnNpb25Gb3JWZXJzaW9uKCkgLSA3Ow0KKyAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogYWxpZ25tZW50UGF0dGVybiA9IE5VTEw7DQorICBpZiAocHJvdmlzaW9uYWxWZXJzaW9uLT5HZXRBbGlnbm1lbnRQYXR0ZXJuQ2VudGVycygpLT5HZXRTaXplKCkgPiAwKSB7DQorICAgIEZYX0ZMT0FUIGJvdHRvbVJpZ2h0WCA9DQorICAgICAgICB0b3BSaWdodC0+R2V0WCgpIC0gdG9wTGVmdC0+R2V0WCgpICsgYm90dG9tTGVmdC0+R2V0WCgpOw0KKyAgICBGWF9GTE9BVCBib3R0b21SaWdodFkgPQ0KKyAgICAgICAgdG9wUmlnaHQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSArIGJvdHRvbUxlZnQtPkdldFkoKTsNCisgICAgRlhfRkxPQVQgY29ycmVjdGlvblRvVG9wTGVmdCA9DQorICAgICAgICAxLjBmIC0gMy4wZiAvIChGWF9GTE9BVCltb2R1bGVzQmV0d2VlbkZQQ2VudGVyczsNCisgICAgRlhfRkxPQVQgeHRlbXAgPSAodG9wTGVmdC0+R2V0WCgpICsNCisgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGlvblRvVG9wTGVmdCAqIChib3R0b21SaWdodFggLSB0b3BMZWZ0LT5HZXRYKCkpKTsNCisgICAgaW50MzJfdCBlc3RBbGlnbm1lbnRYID0gKGludDMyX3QpeHRlbXA7DQorICAgIEZYX0ZMT0FUIHl0ZW1wID0gKHRvcExlZnQtPkdldFkoKSArDQorICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25Ub1RvcExlZnQgKiAoYm90dG9tUmlnaHRZIC0gdG9wTGVmdC0+R2V0WSgpKSk7DQorICAgIGludDMyX3QgZXN0QWxpZ25tZW50WSA9IChpbnQzMl90KXl0ZW1wOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDQ7IGkgPD0gMTY7IGkgPDw9IDEpIHsNCisgICAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKiB0ZW1wID0gRmluZEFsaWdubWVudEluUmVnaW9uKA0KKyAgICAgICAgICBtb2R1bGVTaXplLCBlc3RBbGlnbm1lbnRYLCBlc3RBbGlnbm1lbnRZLCAoRlhfRkxPQVQpaSwgZSk7DQorICAgICAgYWxpZ25tZW50UGF0dGVybiA9IHRlbXA7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaW50MzJfdCBkaW1lbnNpb24gPSBDb21wdXRlRGltZW5zaW9uKHRvcExlZnQuZ2V0KCksIHRvcFJpZ2h0LmdldCgpLCBib3R0b21MZWZ0LmdldCgpLCBtb2R1bGVTaXplLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDQkNfUVJDb2RlclZlcnNpb24gKnByb3Zpc2lvbmFsVmVyc2lvbiA9IENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0UHJvdmlzaW9uYWxWZXJzaW9uRm9yRGltZW5zaW9uKGRpbWVuc2lvbiwgZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgaW50MzJfdCBtb2R1bGVzQmV0d2VlbkZQQ2VudGVycyA9IHByb3Zpc2lvbmFsVmVyc2lvbi0+R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpIC0gNzsNCi0gICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiAqIGFsaWdubWVudFBhdHRlcm4gPSBOVUxMOw0KLSAgICBpZihwcm92aXNpb25hbFZlcnNpb24tPkdldEFsaWdubWVudFBhdHRlcm5DZW50ZXJzKCktPkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgIEZYX0ZMT0FUICBib3R0b21SaWdodFggPSB0b3BSaWdodC0+R2V0WCgpIC0gdG9wTGVmdC0+R2V0WCgpICsgYm90dG9tTGVmdC0+R2V0WCgpOw0KLSAgICAgICAgRlhfRkxPQVQgYm90dG9tUmlnaHRZID0gdG9wUmlnaHQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSArIGJvdHRvbUxlZnQtPkdldFkoKTsNCi0gICAgICAgIEZYX0ZMT0FUIGNvcnJlY3Rpb25Ub1RvcExlZnQgPSAxLjBmIC0gMy4wZiAvIChGWF9GTE9BVCkgbW9kdWxlc0JldHdlZW5GUENlbnRlcnM7DQotICAgICAgICBGWF9GTE9BVCB4dGVtcCA9ICh0b3BMZWZ0LT5HZXRYKCkgKyBjb3JyZWN0aW9uVG9Ub3BMZWZ0ICogKGJvdHRvbVJpZ2h0WCAtIHRvcExlZnQtPkdldFgoKSkpOw0KLSAgICAgICAgaW50MzJfdCBlc3RBbGlnbm1lbnRYID0gKGludDMyX3QpeHRlbXAgOw0KLSAgICAgICAgRlhfRkxPQVQgeXRlbXAgPSAgKHRvcExlZnQtPkdldFkoKSArIGNvcnJlY3Rpb25Ub1RvcExlZnQgKiAoYm90dG9tUmlnaHRZIC0gdG9wTGVmdC0+R2V0WSgpKSk7DQotICAgICAgICBpbnQzMl90IGVzdEFsaWdubWVudFkgPSAoaW50MzJfdCl5dGVtcDsNCi0gICAgICAgIGZvcihpbnQzMl90IGkgPSA0OyBpIDw9IDE2OyBpIDw8PSAxKSB7DQotICAgICAgICAgICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiAqdGVtcCA9IEZpbmRBbGlnbm1lbnRJblJlZ2lvbihtb2R1bGVTaXplLCBlc3RBbGlnbm1lbnRYLCBlc3RBbGlnbm1lbnRZLCAoRlhfRkxPQVQpIGksIGUpOw0KLSAgICAgICAgICAgIGFsaWdubWVudFBhdHRlcm4gPSB0ZW1wOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0cyA9DQorICAgICAgU2FtcGxlR3JpZChtX2ltYWdlLCB0b3BMZWZ0LmdldCgpLCB0b3BSaWdodC5nZXQoKSwgYm90dG9tTGVmdC5nZXQoKSwNCisgICAgICAgICAgICAgICAgIChDQkNfUmVzdWx0UG9pbnQqKShhbGlnbm1lbnRQYXR0ZXJuKSwgZGltZW5zaW9uLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENGWF9QdHJBcnJheSogcG9pbnRzID0gRlhfTkVXIENGWF9QdHJBcnJheTsNCisgIGlmIChhbGlnbm1lbnRQYXR0ZXJuID09IE5VTEwpIHsNCisgICAgcG9pbnRzLT5BZGQoYm90dG9tTGVmdC5yZWxlYXNlKCkpOw0KKyAgICBwb2ludHMtPkFkZCh0b3BMZWZ0LnJlbGVhc2UoKSk7DQorICAgIHBvaW50cy0+QWRkKHRvcFJpZ2h0LnJlbGVhc2UoKSk7DQorICB9IGVsc2Ugew0KKyAgICBwb2ludHMtPkFkZChib3R0b21MZWZ0LnJlbGVhc2UoKSk7DQorICAgIHBvaW50cy0+QWRkKHRvcExlZnQucmVsZWFzZSgpKTsNCisgICAgcG9pbnRzLT5BZGQodG9wUmlnaHQucmVsZWFzZSgpKTsNCisgICAgcG9pbnRzLT5BZGQoYWxpZ25tZW50UGF0dGVybik7DQorICB9DQorICByZXR1cm4gRlhfTkVXIENCQ19RUkRldGVjdG9yUmVzdWx0KGJpdHMsIHBvaW50cyk7DQorfQ0KK0NCQ19Db21tb25CaXRNYXRyaXgqIENCQ19RUkRldGVjdG9yOjpTYW1wbGVHcmlkKA0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbUxlZnQsDQorICAgIENCQ19SZXN1bHRQb2ludCogYWxpZ25tZW50UGF0dGVybiwNCisgICAgaW50MzJfdCBkaW1lbnNpb24sDQorICAgIGludDMyX3QmIGUpIHsNCisgIEZYX0ZMT0FUIGRpbU1pbnVzVGhyZWUgPSAoRlhfRkxPQVQpZGltZW5zaW9uIC0gMy41ZjsNCisgIEZYX0ZMT0FUIGJvdHRvbVJpZ2h0WDsNCisgIEZYX0ZMT0FUIGJvdHRvbVJpZ2h0WTsNCisgIEZYX0ZMT0FUIHNvdXJjZUJvdHRvbVJpZ2h0WDsNCisgIEZYX0ZMT0FUIHNvdXJjZUJvdHRvbVJpZ2h0WTsNCisgIGlmIChhbGlnbm1lbnRQYXR0ZXJuICE9IE5VTEwpIHsNCisgICAgYm90dG9tUmlnaHRYID0gYWxpZ25tZW50UGF0dGVybi0+R2V0WCgpOw0KKyAgICBib3R0b21SaWdodFkgPSBhbGlnbm1lbnRQYXR0ZXJuLT5HZXRZKCk7DQorICAgIHNvdXJjZUJvdHRvbVJpZ2h0WCA9IHNvdXJjZUJvdHRvbVJpZ2h0WSA9IGRpbU1pbnVzVGhyZWUgLSAzLjBmOw0KKyAgfSBlbHNlIHsNCisgICAgYm90dG9tUmlnaHRYID0gKHRvcFJpZ2h0LT5HZXRYKCkgLSB0b3BMZWZ0LT5HZXRYKCkpICsgYm90dG9tTGVmdC0+R2V0WCgpOw0KKyAgICBib3R0b21SaWdodFkgPSAodG9wUmlnaHQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSkgKyBib3R0b21MZWZ0LT5HZXRZKCk7DQorICAgIHNvdXJjZUJvdHRvbVJpZ2h0WCA9IHNvdXJjZUJvdHRvbVJpZ2h0WSA9IGRpbU1pbnVzVGhyZWU7DQorICB9DQorICBDQkNfUVJHcmlkU2FtcGxlciYgc2FtcGxlciA9IENCQ19RUkdyaWRTYW1wbGVyOjpHZXRJbnN0YW5jZSgpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogY2JtID0gc2FtcGxlci5TYW1wbGVHcmlkKA0KKyAgICAgIGltYWdlLCBkaW1lbnNpb24sIGRpbWVuc2lvbiwgMy41ZiwgMy41ZiwgZGltTWludXNUaHJlZSwgMy41ZiwNCisgICAgICBzb3VyY2VCb3R0b21SaWdodFgsIHNvdXJjZUJvdHRvbVJpZ2h0WSwgMy41ZiwgZGltTWludXNUaHJlZSwNCisgICAgICB0b3BMZWZ0LT5HZXRYKCksIHRvcExlZnQtPkdldFkoKSwgdG9wUmlnaHQtPkdldFgoKSwgdG9wUmlnaHQtPkdldFkoKSwNCisgICAgICBib3R0b21SaWdodFgsIGJvdHRvbVJpZ2h0WSwgYm90dG9tTGVmdC0+R2V0WCgpLCBib3R0b21MZWZ0LT5HZXRZKCksIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIGNibTsNCit9DQoraW50MzJfdCBDQkNfUVJEZXRlY3Rvcjo6Q29tcHV0ZURpbWVuc2lvbihDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbW9kdWxlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgdGx0ckNlbnRlcnNEaW1lbnNpb24gPSBSb3VuZCgNCisgICAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpEaXN0YW5jZSh0b3BMZWZ0LCB0b3BSaWdodCkgLyBtb2R1bGVTaXplKTsNCisgIGludDMyX3QgdGxibENlbnRlcnNEaW1lbnNpb24gPSBSb3VuZCgNCisgICAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpEaXN0YW5jZSh0b3BMZWZ0LCBib3R0b21MZWZ0KSAvIG1vZHVsZVNpemUpOw0KKyAgaW50MzJfdCBkaW1lbnNpb24gPSAoKHRsdHJDZW50ZXJzRGltZW5zaW9uICsgdGxibENlbnRlcnNEaW1lbnNpb24pID4+IDEpICsgNzsNCisgIHN3aXRjaCAoZGltZW5zaW9uICYgMHgwMykgew0KKyAgICBjYXNlIDA6DQorICAgICAgZGltZW5zaW9uKys7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjoNCisgICAgICBkaW1lbnNpb24tLTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAzOiB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQogICAgIH0NCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqYml0cyA9IFNhbXBsZUdyaWQobV9pbWFnZSwgdG9wTGVmdC5nZXQoKSwgdG9wUmlnaHQuZ2V0KCksIGJvdHRvbUxlZnQuZ2V0KCksIChDQkNfUmVzdWx0UG9pbnQqKShhbGlnbm1lbnRQYXR0ZXJuKSwgZGltZW5zaW9uLCBlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDRlhfUHRyQXJyYXkgKnBvaW50cyA9IEZYX05FVyBDRlhfUHRyQXJyYXk7DQotICAgIGlmKGFsaWdubWVudFBhdHRlcm4gPT0gTlVMTCkgew0KLSAgICAgICAgcG9pbnRzLT5BZGQoYm90dG9tTGVmdC5yZWxlYXNlKCkpOw0KLSAgICAgICAgcG9pbnRzLT5BZGQodG9wTGVmdC5yZWxlYXNlKCkpOw0KLSAgICAgICAgcG9pbnRzLT5BZGQodG9wUmlnaHQucmVsZWFzZSgpKTsNCisgIH0NCisgIHJldHVybiBkaW1lbnNpb247DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkRldGVjdG9yOjpDYWxjdWxhdGVNb2R1bGVTaXplKENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCkgew0KKyAgcmV0dXJuIChDYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5KHRvcExlZnQsIHRvcFJpZ2h0KSArDQorICAgICAgICAgIENhbGN1bGF0ZU1vZHVsZVNpemVPbmVXYXkodG9wTGVmdCwgYm90dG9tTGVmdCkpIC8NCisgICAgICAgICAyLjBmOw0KK30NCitGWF9GTE9BVCBDQkNfUVJEZXRlY3Rvcjo6Q2FsY3VsYXRlTW9kdWxlU2l6ZU9uZVdheSgNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBwYXR0ZXJuLA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIG90aGVyUGF0dGVybikgew0KKyAgRlhfRkxPQVQgbW9kdWxlU2l6ZUVzdDEgPSBTaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cygNCisgICAgICAoaW50MzJfdClwYXR0ZXJuLT5HZXRYKCksIChpbnQzMl90KXBhdHRlcm4tPkdldFkoKSwNCisgICAgICAoaW50MzJfdClvdGhlclBhdHRlcm4tPkdldFgoKSwgKGludDMyX3Qpb3RoZXJQYXR0ZXJuLT5HZXRZKCkpOw0KKyAgRlhfRkxPQVQgbW9kdWxlU2l6ZUVzdDIgPSBTaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cygNCisgICAgICAoaW50MzJfdClvdGhlclBhdHRlcm4tPkdldFgoKSwgKGludDMyX3Qpb3RoZXJQYXR0ZXJuLT5HZXRZKCksDQorICAgICAgKGludDMyX3QpcGF0dGVybi0+R2V0WCgpLCAoaW50MzJfdClwYXR0ZXJuLT5HZXRZKCkpOw0KKyAgaWYgKEZYU1lTX2lzbmFuKG1vZHVsZVNpemVFc3QxKSkgew0KKyAgICByZXR1cm4gbW9kdWxlU2l6ZUVzdDI7DQorICB9DQorICBpZiAoRlhTWVNfaXNuYW4obW9kdWxlU2l6ZUVzdDIpKSB7DQorICAgIHJldHVybiBtb2R1bGVTaXplRXN0MTsNCisgIH0NCisgIHJldHVybiAobW9kdWxlU2l6ZUVzdDEgKyBtb2R1bGVTaXplRXN0MikgLyAxNC4wZjsNCit9DQoraW50MzJfdCBDQkNfUVJEZXRlY3Rvcjo6Um91bmQoRlhfRkxPQVQgZCkgew0KKyAgcmV0dXJuIChpbnQzMl90KShkICsgMC41Zik7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkRldGVjdG9yOjpTaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cyhpbnQzMl90IGZyb21YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyb21ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRvWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0b1kpIHsNCisgIEZYX0ZMT0FUIHJlc3VsdCA9IFNpemVPZkJsYWNrV2hpdGVCbGFja1J1bihmcm9tWCwgZnJvbVksIHRvWCwgdG9ZKTsNCisgIGludDMyX3Qgb3RoZXJUb1ggPSBmcm9tWCAtICh0b1ggLSBmcm9tWCk7DQorICBpZiAob3RoZXJUb1ggPCAwKSB7DQorICAgIG90aGVyVG9YID0gLTE7DQorICB9IGVsc2UgaWYgKG90aGVyVG9YID49IG1faW1hZ2UtPkdldFdpZHRoKCkpIHsNCisgICAgb3RoZXJUb1ggPSBtX2ltYWdlLT5HZXRXaWR0aCgpOw0KKyAgfQ0KKyAgaW50MzJfdCBvdGhlclRvWSA9IGZyb21ZIC0gKHRvWSAtIGZyb21ZKTsNCisgIGlmIChvdGhlclRvWSA8IDApIHsNCisgICAgb3RoZXJUb1kgPSAtMTsNCisgIH0gZWxzZSBpZiAob3RoZXJUb1kgPj0gbV9pbWFnZS0+R2V0SGVpZ2h0KCkpIHsNCisgICAgb3RoZXJUb1kgPSBtX2ltYWdlLT5HZXRIZWlnaHQoKTsNCisgIH0NCisgIHJlc3VsdCArPSBTaXplT2ZCbGFja1doaXRlQmxhY2tSdW4oZnJvbVgsIGZyb21ZLCBvdGhlclRvWCwgb3RoZXJUb1kpOw0KKyAgcmV0dXJuIHJlc3VsdCAtIDEuMGY7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkRldGVjdG9yOjpTaXplT2ZCbGFja1doaXRlQmxhY2tSdW4oaW50MzJfdCBmcm9tWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJvbVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRvWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9ZKSB7DQorICBGWF9CT09MIHN0ZWVwID0gRlhTWVNfYWJzKHRvWSAtIGZyb21ZKSA+IEZYU1lTX2Ficyh0b1ggLSBmcm9tWCk7DQorICBpZiAoc3RlZXApIHsNCisgICAgaW50MzJfdCB0ZW1wID0gZnJvbVg7DQorICAgIGZyb21YID0gZnJvbVk7DQorICAgIGZyb21ZID0gdGVtcDsNCisgICAgdGVtcCA9IHRvWDsNCisgICAgdG9YID0gdG9ZOw0KKyAgICB0b1kgPSB0ZW1wOw0KKyAgfQ0KKyAgaW50MzJfdCBkeCA9IEZYU1lTX2Ficyh0b1ggLSBmcm9tWCk7DQorICBpbnQzMl90IGR5ID0gRlhTWVNfYWJzKHRvWSAtIGZyb21ZKTsNCisgIGludDMyX3QgZXJyb3IgPSAtZHggPj4gMTsNCisgIGludDMyX3QgeXN0ZXAgPSBmcm9tWSA8IHRvWSA/IDEgOiAtMTsNCisgIGludDMyX3QgeHN0ZXAgPSBmcm9tWCA8IHRvWCA/IDEgOiAtMTsNCisgIGludDMyX3Qgc3RhdGUgPSAwOw0KKyAgZm9yIChpbnQzMl90IHggPSBmcm9tWCwgeSA9IGZyb21ZOyB4ICE9IHRvWDsgeCArPSB4c3RlcCkgew0KKyAgICBpbnQzMl90IHJlYWxYID0gc3RlZXAgPyB5IDogeDsNCisgICAgaW50MzJfdCByZWFsWSA9IHN0ZWVwID8geCA6IHk7DQorICAgIGlmIChzdGF0ZSA9PSAxKSB7DQorICAgICAgaWYgKG1faW1hZ2UtPkdldChyZWFsWCwgcmVhbFkpKSB7DQorICAgICAgICBzdGF0ZSsrOw0KKyAgICAgIH0NCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIHBvaW50cy0+QWRkKGJvdHRvbUxlZnQucmVsZWFzZSgpKTsNCi0gICAgICAgIHBvaW50cy0+QWRkKHRvcExlZnQucmVsZWFzZSgpKTsNCi0gICAgICAgIHBvaW50cy0+QWRkKHRvcFJpZ2h0LnJlbGVhc2UoKSk7DQotICAgICAgICBwb2ludHMtPkFkZChhbGlnbm1lbnRQYXR0ZXJuKTsNCisgICAgICBpZiAoIW1faW1hZ2UtPkdldChyZWFsWCwgcmVhbFkpKSB7DQorICAgICAgICBzdGF0ZSsrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gRlhfTkVXIENCQ19RUkRldGVjdG9yUmVzdWx0KGJpdHMsIHBvaW50cyk7DQorICAgIGlmIChzdGF0ZSA9PSAzKSB7DQorICAgICAgaW50MzJfdCBkaWZmWCA9IHggLSBmcm9tWDsNCisgICAgICBpbnQzMl90IGRpZmZZID0geSAtIGZyb21ZOw0KKyAgICAgIHJldHVybiAoRlhfRkxPQVQpc3FydCgoZG91YmxlKShkaWZmWCAqIGRpZmZYICsgZGlmZlkgKiBkaWZmWSkpOw0KKyAgICB9DQorICAgIGVycm9yICs9IGR5Ow0KKyAgICBpZiAoZXJyb3IgPiAwKSB7DQorICAgICAgeSArPSB5c3RlcDsNCisgICAgICBlcnJvciAtPSBkeDsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBkaWZmWCA9IHRvWCAtIGZyb21YOw0KKyAgaW50MzJfdCBkaWZmWSA9IHRvWSAtIGZyb21ZOw0KKyAgcmV0dXJuIChGWF9GTE9BVClzcXJ0KChkb3VibGUpKGRpZmZYICogZGlmZlggKyBkaWZmWSAqIGRpZmZZKSk7DQogfQ0KLUNCQ19Db21tb25CaXRNYXRyaXggKkNCQ19RUkRldGVjdG9yOjpTYW1wbGVHcmlkKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlLCBDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsDQotICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbUxlZnQsIENCQ19SZXN1bHRQb2ludCogYWxpZ25tZW50UGF0dGVybiwNCi0gICAgICAgIGludDMyX3QgZGltZW5zaW9uLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgRlhfRkxPQVQgZGltTWludXNUaHJlZSA9IChGWF9GTE9BVCkgZGltZW5zaW9uIC0gMy41ZjsNCi0gICAgRlhfRkxPQVQgYm90dG9tUmlnaHRYOw0KLSAgICBGWF9GTE9BVCBib3R0b21SaWdodFk7DQotICAgIEZYX0ZMT0FUIHNvdXJjZUJvdHRvbVJpZ2h0WDsNCi0gICAgRlhfRkxPQVQgc291cmNlQm90dG9tUmlnaHRZOw0KLSAgICBpZiAoYWxpZ25tZW50UGF0dGVybiAhPSBOVUxMKSB7DQotICAgICAgICBib3R0b21SaWdodFggPSBhbGlnbm1lbnRQYXR0ZXJuLT5HZXRYKCk7DQotICAgICAgICBib3R0b21SaWdodFkgPSBhbGlnbm1lbnRQYXR0ZXJuLT5HZXRZKCk7DQotICAgICAgICBzb3VyY2VCb3R0b21SaWdodFggPSBzb3VyY2VCb3R0b21SaWdodFkgPSBkaW1NaW51c1RocmVlIC0gMy4wZjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGJvdHRvbVJpZ2h0WCA9ICh0b3BSaWdodC0+R2V0WCgpIC0gdG9wTGVmdC0+R2V0WCgpKSArIGJvdHRvbUxlZnQtPkdldFgoKTsNCi0gICAgICAgIGJvdHRvbVJpZ2h0WSA9ICh0b3BSaWdodC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpKSArIGJvdHRvbUxlZnQtPkdldFkoKTsNCi0gICAgICAgIHNvdXJjZUJvdHRvbVJpZ2h0WCA9IHNvdXJjZUJvdHRvbVJpZ2h0WSA9IGRpbU1pbnVzVGhyZWU7DQotICAgIH0NCi0gICAgQ0JDX1FSR3JpZFNhbXBsZXIgJnNhbXBsZXIgPSBDQkNfUVJHcmlkU2FtcGxlcjo6R2V0SW5zdGFuY2UoKTsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogY2JtID0gc2FtcGxlci5TYW1wbGVHcmlkKGltYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb24sIGRpbWVuc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy41ZiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy41ZiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltTWludXNUaHJlZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy41ZiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQm90dG9tUmlnaHRYLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VCb3R0b21SaWdodFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNWYsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbU1pbnVzVGhyZWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcExlZnQtPkdldFgoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGVmdC0+R2V0WSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BSaWdodC0+R2V0WCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BSaWdodC0+R2V0WSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b21SaWdodFgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0WSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tTGVmdC0+R2V0WCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b21MZWZ0LT5HZXRZKCksIGUpOw0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm4qIENCQ19RUkRldGVjdG9yOjpGaW5kQWxpZ25tZW50SW5SZWdpb24oDQorICAgIEZYX0ZMT0FUIG92ZXJhbGxFc3RNb2R1bGVTaXplLA0KKyAgICBpbnQzMl90IGVzdEFsaWdubWVudFgsDQorICAgIGludDMyX3QgZXN0QWxpZ25tZW50WSwNCisgICAgRlhfRkxPQVQgYWxsb3dhbmNlRmFjdG9yLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGFsbG93YW5jZSA9IChpbnQzMl90KShhbGxvd2FuY2VGYWN0b3IgKiBvdmVyYWxsRXN0TW9kdWxlU2l6ZSk7DQorICBpbnQzMl90IGFsaWdubWVudEFyZWFMZWZ0WCA9IEZYX01BWCgwLCBlc3RBbGlnbm1lbnRYIC0gYWxsb3dhbmNlKTsNCisgIGludDMyX3QgYWxpZ25tZW50QXJlYVJpZ2h0WCA9DQorICAgICAgRlhfTUlOKG1faW1hZ2UtPkdldFdpZHRoKCkgLSAxLCBlc3RBbGlnbm1lbnRYICsgYWxsb3dhbmNlKTsNCisgIGlmIChhbGlnbm1lbnRBcmVhUmlnaHRYIC0gYWxpZ25tZW50QXJlYUxlZnRYIDwgb3ZlcmFsbEVzdE1vZHVsZVNpemUgKiAzKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQogICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgcmV0dXJuIGNibTsNCi19DQotaW50MzJfdCBDQkNfUVJEZXRlY3Rvcjo6Q29tcHV0ZURpbWVuc2lvbihDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsDQotICAgICAgICBDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbUxlZnQsIEZYX0ZMT0FUIG1vZHVsZVNpemUsIGludDMyX3QgJmUpDQotew0KLSAgICBpbnQzMl90IHRsdHJDZW50ZXJzRGltZW5zaW9uID0gUm91bmQoQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6RGlzdGFuY2UodG9wTGVmdCwgdG9wUmlnaHQpIC8gbW9kdWxlU2l6ZSk7DQotICAgIGludDMyX3QgdGxibENlbnRlcnNEaW1lbnNpb24gPSBSb3VuZChDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpEaXN0YW5jZSh0b3BMZWZ0LCBib3R0b21MZWZ0KSAvIG1vZHVsZVNpemUpOw0KLSAgICBpbnQzMl90IGRpbWVuc2lvbiA9ICgodGx0ckNlbnRlcnNEaW1lbnNpb24gKyB0bGJsQ2VudGVyc0RpbWVuc2lvbikgPj4gMSkgKyA3Ow0KLSAgICBzd2l0Y2goZGltZW5zaW9uICYgMHgwMykgew0KLSAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgIGRpbWVuc2lvbisrOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgIGRpbWVuc2lvbi0tOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAzOiB7DQotICAgICAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQotICAgICAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGRpbWVuc2lvbjsNCi19DQotRlhfRkxPQVQgQ0JDX1FSRGV0ZWN0b3I6OkNhbGN1bGF0ZU1vZHVsZVNpemUoQ0JDX1Jlc3VsdFBvaW50ICp0b3BMZWZ0LCBDQkNfUmVzdWx0UG9pbnQgKnRvcFJpZ2h0LCBDQkNfUmVzdWx0UG9pbnQgKmJvdHRvbUxlZnQpDQotew0KLSAgICByZXR1cm4gKENhbGN1bGF0ZU1vZHVsZVNpemVPbmVXYXkodG9wTGVmdCwgdG9wUmlnaHQpICsgQ2FsY3VsYXRlTW9kdWxlU2l6ZU9uZVdheSh0b3BMZWZ0LCBib3R0b21MZWZ0KSkgLyAyLjBmOw0KLX0NCi1GWF9GTE9BVCBDQkNfUVJEZXRlY3Rvcjo6Q2FsY3VsYXRlTW9kdWxlU2l6ZU9uZVdheShDQkNfUmVzdWx0UG9pbnQgKnBhdHRlcm4sIENCQ19SZXN1bHRQb2ludCAqb3RoZXJQYXR0ZXJuKQ0KLXsNCi0gICAgRlhfRkxPQVQgbW9kdWxlU2l6ZUVzdDEgPSBTaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cygoaW50MzJfdCkgcGF0dGVybi0+R2V0WCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSBwYXR0ZXJuLT5HZXRZKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpIG90aGVyUGF0dGVybi0+R2V0WCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSBvdGhlclBhdHRlcm4tPkdldFkoKSk7DQotICAgIEZYX0ZMT0FUIG1vZHVsZVNpemVFc3QyID0gU2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuQm90aFdheXMoKGludDMyX3QpIG90aGVyUGF0dGVybi0+R2V0WCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSBvdGhlclBhdHRlcm4tPkdldFkoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkgcGF0dGVybi0+R2V0WCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSBwYXR0ZXJuLT5HZXRZKCkpOw0KLSAgICBpZiAoRlhTWVNfaXNuYW4obW9kdWxlU2l6ZUVzdDEpKSB7DQotICAgICAgICByZXR1cm4gbW9kdWxlU2l6ZUVzdDI7DQotICAgIH0NCi0gICAgaWYgKEZYU1lTX2lzbmFuKG1vZHVsZVNpemVFc3QyKSkgew0KLSAgICAgICAgcmV0dXJuIG1vZHVsZVNpemVFc3QxOw0KLSAgICB9DQotICAgIHJldHVybiAobW9kdWxlU2l6ZUVzdDEgKyBtb2R1bGVTaXplRXN0MikgLyAxNC4wZjsNCi19DQotaW50MzJfdCBDQkNfUVJEZXRlY3Rvcjo6Um91bmQoRlhfRkxPQVQgZCkNCi17DQotICAgIHJldHVybiAoaW50MzJfdCkoZCArIDAuNWYpOw0KLX0NCi1GWF9GTE9BVCBDQkNfUVJEZXRlY3Rvcjo6U2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuQm90aFdheXMoaW50MzJfdCBmcm9tWCwgaW50MzJfdCBmcm9tWSwgaW50MzJfdCB0b1gsIGludDMyX3QgdG9ZKQ0KLXsNCi0gICAgRlhfRkxPQVQgcmVzdWx0ID0gU2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuKGZyb21YLCBmcm9tWSwgdG9YLCB0b1kpOw0KLSAgICBpbnQzMl90IG90aGVyVG9YID0gZnJvbVggLSAodG9YIC0gZnJvbVgpOw0KLSAgICBpZiAob3RoZXJUb1ggPCAwKSB7DQotICAgICAgICBvdGhlclRvWCA9IC0xOw0KLSAgICB9IGVsc2UgaWYgKG90aGVyVG9YID49IG1faW1hZ2UtPkdldFdpZHRoKCkpIHsNCi0gICAgICAgIG90aGVyVG9YID0gbV9pbWFnZS0+R2V0V2lkdGgoKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IG90aGVyVG9ZID0gZnJvbVkgLSAodG9ZIC0gZnJvbVkpOw0KLSAgICBpZiAob3RoZXJUb1kgPCAwKSB7DQotICAgICAgICBvdGhlclRvWSA9IC0xOw0KLSAgICB9IGVsc2UgaWYgKG90aGVyVG9ZID49IG1faW1hZ2UtPkdldEhlaWdodCgpKSB7DQotICAgICAgICBvdGhlclRvWSA9IG1faW1hZ2UtPkdldEhlaWdodCgpOw0KLSAgICB9DQotICAgIHJlc3VsdCArPSBTaXplT2ZCbGFja1doaXRlQmxhY2tSdW4oZnJvbVgsIGZyb21ZLCBvdGhlclRvWCwgb3RoZXJUb1kpOw0KLSAgICByZXR1cm4gcmVzdWx0IC0gMS4wZjsNCi19DQotRlhfRkxPQVQgQ0JDX1FSRGV0ZWN0b3I6OlNpemVPZkJsYWNrV2hpdGVCbGFja1J1bihpbnQzMl90IGZyb21YLCBpbnQzMl90IGZyb21ZLCBpbnQzMl90IHRvWCwgaW50MzJfdCB0b1kpDQotew0KLSAgICBGWF9CT09MIHN0ZWVwID0gRlhTWVNfYWJzKHRvWSAtIGZyb21ZKSA+IEZYU1lTX2Ficyh0b1ggLSBmcm9tWCk7DQotICAgIGlmIChzdGVlcCkgew0KLSAgICAgICAgaW50MzJfdCB0ZW1wID0gZnJvbVg7DQotICAgICAgICBmcm9tWCA9IGZyb21ZOw0KLSAgICAgICAgZnJvbVkgPSB0ZW1wOw0KLSAgICAgICAgdGVtcCA9IHRvWDsNCi0gICAgICAgIHRvWCA9IHRvWTsNCi0gICAgICAgIHRvWSA9IHRlbXA7DQotICAgIH0NCi0gICAgaW50MzJfdCBkeCA9IEZYU1lTX2Ficyh0b1ggLSBmcm9tWCk7DQotICAgIGludDMyX3QgZHkgPSBGWFNZU19hYnModG9ZIC0gZnJvbVkpOw0KLSAgICBpbnQzMl90IGVycm9yID0gLWR4ID4+IDE7DQotICAgIGludDMyX3QgeXN0ZXAgPSBmcm9tWSA8IHRvWSA/IDEgOiAtMTsNCi0gICAgaW50MzJfdCB4c3RlcCA9IGZyb21YIDwgdG9YID8gMSA6IC0xOw0KLSAgICBpbnQzMl90IHN0YXRlID0gMDsNCi0gICAgZm9yIChpbnQzMl90IHggPSBmcm9tWCwgeSA9IGZyb21ZOyB4ICE9IHRvWDsgeCArPSB4c3RlcCkgew0KLSAgICAgICAgaW50MzJfdCByZWFsWCA9IHN0ZWVwID8geSA6IHg7DQotICAgICAgICBpbnQzMl90IHJlYWxZID0gc3RlZXAgPyB4IDogeTsNCi0gICAgICAgIGlmIChzdGF0ZSA9PSAxKSB7DQotICAgICAgICAgICAgaWYgKG1faW1hZ2UtPkdldChyZWFsWCwgcmVhbFkpKSB7DQotICAgICAgICAgICAgICAgIHN0YXRlKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoIW1faW1hZ2UtPkdldChyZWFsWCwgcmVhbFkpKSB7DQotICAgICAgICAgICAgICAgIHN0YXRlKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHN0YXRlID09IDMpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGRpZmZYID0geCAtIGZyb21YOw0KLSAgICAgICAgICAgIGludDMyX3QgZGlmZlkgPSB5IC0gZnJvbVk7DQotICAgICAgICAgICAgcmV0dXJuIChGWF9GTE9BVCkgc3FydCgoZG91YmxlKSAoZGlmZlggKiBkaWZmWCArIGRpZmZZICogZGlmZlkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVycm9yICs9IGR5Ow0KLSAgICAgICAgaWYgKGVycm9yID4gMCkgew0KLSAgICAgICAgICAgIHkgKz0geXN0ZXA7DQotICAgICAgICAgICAgZXJyb3IgLT0gZHg7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBkaWZmWCA9IHRvWCAtIGZyb21YOw0KLSAgICBpbnQzMl90IGRpZmZZID0gdG9ZIC0gZnJvbVk7DQotICAgIHJldHVybiAoRlhfRkxPQVQpIHNxcnQoKGRvdWJsZSkgKGRpZmZYICogZGlmZlggKyBkaWZmWSAqIGRpZmZZKSk7DQotfQ0KLUNCQ19RUkFsaWdubWVudFBhdHRlcm4gKkNCQ19RUkRldGVjdG9yOjpGaW5kQWxpZ25tZW50SW5SZWdpb24oRlhfRkxPQVQgb3ZlcmFsbEVzdE1vZHVsZVNpemUsIGludDMyX3QgZXN0QWxpZ25tZW50WCwNCi0gICAgICAgIGludDMyX3QgZXN0QWxpZ25tZW50WSwgRlhfRkxPQVQgYWxsb3dhbmNlRmFjdG9yLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBhbGxvd2FuY2UgPSAoaW50MzJfdCkgKGFsbG93YW5jZUZhY3RvciAqIG92ZXJhbGxFc3RNb2R1bGVTaXplKTsNCi0gICAgaW50MzJfdCBhbGlnbm1lbnRBcmVhTGVmdFggPSBGWF9NQVgoMCwgZXN0QWxpZ25tZW50WCAtIGFsbG93YW5jZSk7DQotICAgIGludDMyX3QgYWxpZ25tZW50QXJlYVJpZ2h0WCA9IEZYX01JTihtX2ltYWdlLT5HZXRXaWR0aCgpIC0gMSwgZXN0QWxpZ25tZW50WCArIGFsbG93YW5jZSk7DQotICAgIGlmIChhbGlnbm1lbnRBcmVhUmlnaHRYIC0gYWxpZ25tZW50QXJlYUxlZnRYIDwgb3ZlcmFsbEVzdE1vZHVsZVNpemUgKiAzKSB7DQotICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICB9DQotICAgIGludDMyX3QgYWxpZ25tZW50QXJlYVRvcFkgPSBGWF9NQVgoMCwgZXN0QWxpZ25tZW50WSAtIGFsbG93YW5jZSk7DQotICAgIGludDMyX3QgYWxpZ25tZW50QXJlYUJvdHRvbVkgPSBGWF9NSU4obV9pbWFnZS0+R2V0SGVpZ2h0KCkgLSAxLCBlc3RBbGlnbm1lbnRZICsgYWxsb3dhbmNlKTsNCi0gICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlciBhbGlnbm1lbnRGaW5kZXIobV9pbWFnZSwNCi0gICAgICAgICAgICBhbGlnbm1lbnRBcmVhTGVmdFgsDQotICAgICAgICAgICAgYWxpZ25tZW50QXJlYVRvcFksDQotICAgICAgICAgICAgYWxpZ25tZW50QXJlYVJpZ2h0WCAtIGFsaWdubWVudEFyZWFMZWZ0WCwNCi0gICAgICAgICAgICBhbGlnbm1lbnRBcmVhQm90dG9tWSAtIGFsaWdubWVudEFyZWFUb3BZLA0KLSAgICAgICAgICAgIG92ZXJhbGxFc3RNb2R1bGVTaXplKTsNCi0gICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiAqcWFwID0gYWxpZ25tZW50RmluZGVyLkZpbmQoZSk7DQotICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCi0gICAgcmV0dXJuIHFhcDsNCisgIH0NCisgIGludDMyX3QgYWxpZ25tZW50QXJlYVRvcFkgPSBGWF9NQVgoMCwgZXN0QWxpZ25tZW50WSAtIGFsbG93YW5jZSk7DQorICBpbnQzMl90IGFsaWdubWVudEFyZWFCb3R0b21ZID0NCisgICAgICBGWF9NSU4obV9pbWFnZS0+R2V0SGVpZ2h0KCkgLSAxLCBlc3RBbGlnbm1lbnRZICsgYWxsb3dhbmNlKTsNCisgIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIgYWxpZ25tZW50RmluZGVyKA0KKyAgICAgIG1faW1hZ2UsIGFsaWdubWVudEFyZWFMZWZ0WCwgYWxpZ25tZW50QXJlYVRvcFksDQorICAgICAgYWxpZ25tZW50QXJlYVJpZ2h0WCAtIGFsaWdubWVudEFyZWFMZWZ0WCwNCisgICAgICBhbGlnbm1lbnRBcmVhQm90dG9tWSAtIGFsaWdubWVudEFyZWFUb3BZLCBvdmVyYWxsRXN0TW9kdWxlU2l6ZSk7DQorICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKiBxYXAgPSBhbGlnbm1lbnRGaW5kZXIuRmluZChlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiBxYXA7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZXRlY3Rvci5oCmluZGV4IDI5OGNjZjQuLjIwNTk0ODIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGV0ZWN0b3IuaApAQCAtMTcsMjUgKzE3LDQ4IEBACiBjbGFzcyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyOw0KIGNsYXNzIENCQ19RUkFsaWdubWVudFBhdHRlcm47DQogY2xhc3MgQ0JDX1FSRGV0ZWN0b3I7DQotY2xhc3MgQ0JDX1FSRGV0ZWN0b3INCi17DQotcHJpdmF0ZToNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqbV9pbWFnZTsNCi1wdWJsaWM6DQotICAgIENCQ19RUkRldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlKTsNCi0gICAgdmlydHVhbCB+Q0JDX1FSRGV0ZWN0b3IoKTsNCitjbGFzcyBDQkNfUVJEZXRlY3RvciB7DQorIHByaXZhdGU6DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBtX2ltYWdlOw0KIA0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBHZXRJbWFnZSgpOw0KLSAgICBDQkNfUVJEZXRlY3RvclJlc3VsdCogRGV0ZWN0KGludDMyX3QgaGludHMsIGludDMyX3QgJmUpOw0KLSAgICBDQkNfUVJEZXRlY3RvclJlc3VsdCogUHJvY2Vzc0ZpbmRlclBhdHRlcm5JbmZvKENCQ19RUkZpbmRlclBhdHRlcm5JbmZvICppbmZvLCBpbnQzMl90ICZlKTsNCi0gICAgRlhfRkxPQVQgQ2FsY3VsYXRlTW9kdWxlU2l6ZShDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsIENCQ19SZXN1bHRQb2ludCAqYm90dG9tTGVmdCk7DQotICAgIEZYX0ZMT0FUIENhbGN1bGF0ZU1vZHVsZVNpemVPbmVXYXkoQ0JDX1Jlc3VsdFBvaW50ICpwYXR0ZXJuLCBDQkNfUmVzdWx0UG9pbnQgKm90aGVyUGF0dGVybik7DQotICAgIEZYX0ZMT0FUIFNpemVPZkJsYWNrV2hpdGVCbGFja1J1bkJvdGhXYXlzKGludDMyX3QgZnJvbVgsIGludDMyX3QgZnJvbVksIGludDMyX3QgdG9YLCBpbnQzMl90IHRvWSk7DQotICAgIEZYX0ZMT0FUIFNpemVPZkJsYWNrV2hpdGVCbGFja1J1bihpbnQzMl90IGZyb21YLCBpbnQzMl90IGZyb21ZLCBpbnQzMl90IHRvWCwgaW50MzJfdCB0b1kpOw0KLSAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKiBGaW5kQWxpZ25tZW50SW5SZWdpb24oRlhfRkxPQVQgb3ZlcmFsbEVzdE1vZHVsZVNpemUsIGludDMyX3QgZXN0QWxpZ25tZW50WCwgaW50MzJfdCBlc3RBbGlnbm1lbnRZLCBGWF9GTE9BVCBhbGxvd2FuY2VGYWN0b3IsIGludDMyX3QgJmUpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBSb3VuZChGWF9GTE9BVCBkKTsNCi0gICAgc3RhdGljIGludDMyX3QgQ29tcHV0ZURpbWVuc2lvbihDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsIENCQ19SZXN1bHRQb2ludCAqYm90dG9tTGVmdCwgRlhfRkxPQVQgbW9kdWxlU2l6ZSwgaW50MzJfdCAmZSk7DQotICAgIHN0YXRpYyBDQkNfQ29tbW9uQml0TWF0cml4KiBTYW1wbGVHcmlkKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlLCBDQkNfUmVzdWx0UG9pbnQgKnRvcExlZnQsIENCQ19SZXN1bHRQb2ludCAqdG9wUmlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCAqYm90dG9tTGVmdCwgQ0JDX1Jlc3VsdFBvaW50KiBhbGlnbm1lbnRQYXR0ZXJuLCBpbnQzMl90IGRpbWVuc2lvbiwgaW50MzJfdCAmZSk7DQorIHB1YmxpYzoNCisgIENCQ19RUkRldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlKTsNCisgIHZpcnR1YWwgfkNCQ19RUkRldGVjdG9yKCk7DQorDQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBHZXRJbWFnZSgpOw0KKyAgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQqIERldGVjdChpbnQzMl90IGhpbnRzLCBpbnQzMl90JiBlKTsNCisgIENCQ19RUkRldGVjdG9yUmVzdWx0KiBQcm9jZXNzRmluZGVyUGF0dGVybkluZm8oQ0JDX1FSRmluZGVyUGF0dGVybkluZm8qIGluZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfRkxPQVQgQ2FsY3VsYXRlTW9kdWxlU2l6ZShDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCk7DQorICBGWF9GTE9BVCBDYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5KENCQ19SZXN1bHRQb2ludCogcGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBvdGhlclBhdHRlcm4pOw0KKyAgRlhfRkxPQVQgU2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuQm90aFdheXMoaW50MzJfdCBmcm9tWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJvbVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRvWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9ZKTsNCisgIEZYX0ZMT0FUIFNpemVPZkJsYWNrV2hpdGVCbGFja1J1bihpbnQzMl90IGZyb21YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJvbVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0b1gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0b1kpOw0KKyAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogRmluZEFsaWdubWVudEluUmVnaW9uKEZYX0ZMT0FUIG92ZXJhbGxFc3RNb2R1bGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXN0QWxpZ25tZW50WCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVzdEFsaWdubWVudFksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYWxsb3dhbmNlRmFjdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIGludDMyX3QgUm91bmQoRlhfRkxPQVQgZCk7DQorICBzdGF0aWMgaW50MzJfdCBDb21wdXRlRGltZW5zaW9uKENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BSaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtb2R1bGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uQml0TWF0cml4KiBTYW1wbGVHcmlkKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BSaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYWxpZ25tZW50UGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGltZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZXRlY3RvclJlc3VsdC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZXRlY3RvclJlc3VsdC5jcHAKaW5kZXggMzczNGZhYi4uNTYxYzEwYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGV0ZWN0b3JSZXN1bHQuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yUmVzdWx0LmNwcApAQCAtMjQsMjggKzI0LDI0IEBACiAjaW5jbHVkZSAiLi4vQkNfUmVzdWx0UG9pbnQuaCINCiAjaW5jbHVkZSAiLi4vY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KICNpbmNsdWRlICJCQ19RUkRldGVjdG9yUmVzdWx0LmgiDQotQ0JDX1FSRGV0ZWN0b3JSZXN1bHQ6OkNCQ19RUkRldGVjdG9yUmVzdWx0KENCQ19Db21tb25CaXRNYXRyaXggKmJpdHMsIENGWF9QdHJBcnJheSAqcG9pbnRzKToNCi0gICAgbV9iaXRzKGJpdHMpLCBtX3BvaW50cyhwb2ludHMpDQotew0KK0NCQ19RUkRldGVjdG9yUmVzdWx0OjpDQkNfUVJEZXRlY3RvclJlc3VsdChDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBvaW50cykNCisgICAgOiBtX2JpdHMoYml0cyksIG1fcG9pbnRzKHBvaW50cykge30NCitDQkNfUVJEZXRlY3RvclJlc3VsdDo6fkNCQ19RUkRldGVjdG9yUmVzdWx0KCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9wb2ludHMtPkdldFNpemUoKTsgaSsrKSB7DQorICAgIGRlbGV0ZSAoQ0JDX1Jlc3VsdFBvaW50KikoKm1fcG9pbnRzKVtpXTsNCisgIH0NCisgIG1fcG9pbnRzLT5SZW1vdmVBbGwoKTsNCisgIGRlbGV0ZSBtX3BvaW50czsNCisgIG1fcG9pbnRzID0gTlVMTDsNCisgIGlmIChtX2JpdHMgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9iaXRzOw0KKyAgfQ0KKyAgbV9iaXRzID0gTlVMTDsNCiB9DQotQ0JDX1FSRGV0ZWN0b3JSZXN1bHQ6On5DQkNfUVJEZXRlY3RvclJlc3VsdCgpDQotew0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IG1fcG9pbnRzLT5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgZGVsZXRlIChDQkNfUmVzdWx0UG9pbnQqKSAoKm1fcG9pbnRzKVtpXTsNCi0gICAgfQ0KLSAgICBtX3BvaW50cy0+UmVtb3ZlQWxsKCk7DQotICAgIGRlbGV0ZSBtX3BvaW50czsNCi0gICAgbV9wb2ludHMgPSBOVUxMOw0KLSAgICBpZihtX2JpdHMgIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIG1fYml0czsNCi0gICAgfQ0KLSAgICBtX2JpdHMgPSBOVUxMOw0KK0NCQ19Db21tb25CaXRNYXRyaXgqIENCQ19RUkRldGVjdG9yUmVzdWx0OjpHZXRCaXRzKCkgew0KKyAgcmV0dXJuIG1fYml0czsNCiB9DQotQ0JDX0NvbW1vbkJpdE1hdHJpeCogQ0JDX1FSRGV0ZWN0b3JSZXN1bHQ6OkdldEJpdHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYml0czsNCi19DQotQ0ZYX1B0ckFycmF5ICpDQkNfUVJEZXRlY3RvclJlc3VsdDo6R2V0UG9pbnRzKCkNCi17DQotICAgIHJldHVybiBtX3BvaW50czsNCitDRlhfUHRyQXJyYXkqIENCQ19RUkRldGVjdG9yUmVzdWx0OjpHZXRQb2ludHMoKSB7DQorICByZXR1cm4gbV9wb2ludHM7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yUmVzdWx0LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZXRlY3RvclJlc3VsdC5oCmluZGV4IGY2YjM4ZTUuLjJkNDBiZDkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yUmVzdWx0LmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGV0ZWN0b3JSZXN1bHQuaApAQCAtOCwxNSArOCwxNSBAQAogI2RlZmluZSBfQkNfUVJERVRFQ1RPUlJFU1VMVF9IXw0KIGNsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQogY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KLWNsYXNzIENCQ19RUkRldGVjdG9yUmVzdWx0DQotew0KLXByaXZhdGU6DQotICAgIENCQ19Db21tb25CaXRNYXRyaXggKm1fYml0czsNCi0gICAgQ0ZYX1B0ckFycmF5ICptX3BvaW50czsNCi1wdWJsaWM6DQotICAgIENCQ19RUkRldGVjdG9yUmVzdWx0KENCQ19Db21tb25CaXRNYXRyaXggKmJpdHMsIENGWF9QdHJBcnJheSAqcG9pbnRzKTsNCi0gICAgdmlydHVhbCB+Q0JDX1FSRGV0ZWN0b3JSZXN1bHQoKTsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqR2V0Qml0cygpOw0KLSAgICBDRlhfUHRyQXJyYXkgKkdldFBvaW50cygpOw0KK2NsYXNzIENCQ19RUkRldGVjdG9yUmVzdWx0IHsNCisgcHJpdmF0ZToNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1fYml0czsNCisgIENGWF9QdHJBcnJheSogbV9wb2ludHM7DQorDQorIHB1YmxpYzoNCisgIENCQ19RUkRldGVjdG9yUmVzdWx0KENCQ19Db21tb25CaXRNYXRyaXgqIGJpdHMsIENGWF9QdHJBcnJheSogcG9pbnRzKTsNCisgIHZpcnR1YWwgfkNCQ19RUkRldGVjdG9yUmVzdWx0KCk7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBHZXRCaXRzKCk7DQorICBDRlhfUHRyQXJyYXkqIEdldFBvaW50cygpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuLmNwcAppbmRleCBkYzA4ZmMxLi44MGVjMzRmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuLmNwcApAQCAtMjMsNDkgKzIzLDQ2IEBACiAjaW5jbHVkZSAiLi4vYmFyY29kZS5oIg0KICNpbmNsdWRlICIuLi9CQ19SZXN1bHRQb2ludC5oIg0KICNpbmNsdWRlICJCQ19RUkZpbmRlclBhdHRlcm4uaCINCi1DQkNfUVJGaW5kZXJQYXR0ZXJuOjpDQkNfUVJGaW5kZXJQYXR0ZXJuKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHBvc1ksIEZYX0ZMT0FUIGVzdGltYXRlZE1vZHVsZVNpemUpOg0KLSAgICBDQkNfUmVzdWx0UG9pbnQoeCwgcG9zWSksDQotICAgIG1fZXN0aW1hdGVkTW9kdWxlU2l6ZShlc3RpbWF0ZWRNb2R1bGVTaXplKSwgbV9jb3VudCgxKQ0KLXsNCitDQkNfUVJGaW5kZXJQYXR0ZXJuOjpDQkNfUVJGaW5kZXJQYXR0ZXJuKEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwb3NZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZXN0aW1hdGVkTW9kdWxlU2l6ZSkNCisgICAgOiBDQkNfUmVzdWx0UG9pbnQoeCwgcG9zWSksDQorICAgICAgbV9lc3RpbWF0ZWRNb2R1bGVTaXplKGVzdGltYXRlZE1vZHVsZVNpemUpLA0KKyAgICAgIG1fY291bnQoMSkge30NCitDQkNfUVJGaW5kZXJQYXR0ZXJuOjp+Q0JDX1FSRmluZGVyUGF0dGVybigpIHsNCisgIG1fY291bnQgPSAwOw0KKyAgbV94ID0gMC4wZjsNCisgIG1feSA9IDAuMGY7DQorICBtX2VzdGltYXRlZE1vZHVsZVNpemUgPSAwLjBmOw0KIH0NCi1DQkNfUVJGaW5kZXJQYXR0ZXJuOjp+Q0JDX1FSRmluZGVyUGF0dGVybigpDQotew0KLSAgICBtX2NvdW50ID0gMDsNCi0gICAgbV94ID0gMC4wZjsNCi0gICAgbV95ID0gMC4wZjsNCi0gICAgbV9lc3RpbWF0ZWRNb2R1bGVTaXplID0gMC4wZjsNCitDQkNfUVJGaW5kZXJQYXR0ZXJuKiBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpDbG9uZSgpIHsNCisgIENCQ19RUkZpbmRlclBhdHRlcm4qIHRlbXAgPQ0KKyAgICAgIEZYX05FVyBDQkNfUVJGaW5kZXJQYXR0ZXJuKG1feCwgbV95LCBtX2VzdGltYXRlZE1vZHVsZVNpemUpOw0KKyAgdGVtcC0+bV9jb3VudCA9IG1fY291bnQ7DQorICByZXR1cm4gdGVtcDsNCiB9DQotQ0JDX1FSRmluZGVyUGF0dGVybiAqQ0JDX1FSRmluZGVyUGF0dGVybjo6Q2xvbmUoKQ0KLXsNCi0gICAgQ0JDX1FSRmluZGVyUGF0dGVybiAqdGVtcCA9IEZYX05FVyBDQkNfUVJGaW5kZXJQYXR0ZXJuKG1feCwgbV95LCBtX2VzdGltYXRlZE1vZHVsZVNpemUpOw0KLSAgICB0ZW1wLT5tX2NvdW50ID0gbV9jb3VudDsNCi0gICAgcmV0dXJuIHRlbXA7DQorRlhfRkxPQVQgQ0JDX1FSRmluZGVyUGF0dGVybjo6R2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpIHsNCisgIHJldHVybiBtX2VzdGltYXRlZE1vZHVsZVNpemU7DQogfQ0KLUZYX0ZMT0FUIENCQ19RUkZpbmRlclBhdHRlcm46OkdldEVzdGltYXRlZE1vZHVsZVNpemUoKQ0KLXsNCi0gICAgcmV0dXJuIG1fZXN0aW1hdGVkTW9kdWxlU2l6ZTsNCitpbnQzMl90IENCQ19RUkZpbmRlclBhdHRlcm46OkdldENvdW50KCkgew0KKyAgcmV0dXJuIG1fY291bnQ7DQogfQ0KLWludDMyX3QgQ0JDX1FSRmluZGVyUGF0dGVybjo6R2V0Q291bnQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fY291bnQ7DQordm9pZCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpJbmNyZW1lbnRDb3VudCgpIHsNCisgIG1fY291bnQrKzsNCiB9DQotdm9pZCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpJbmNyZW1lbnRDb3VudCgpDQotew0KLSAgICBtX2NvdW50Kys7DQorRlhfQk9PTCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpBYm91dEVxdWFscyhGWF9GTE9BVCBtb2R1bGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGopIHsNCisgIGlmICgoZmFicyhpIC0gR2V0WSgpKSA8PSBtb2R1bGVTaXplKSAmJiAoZmFicyhqIC0gR2V0WCgpKSA8PSBtb2R1bGVTaXplKSkgew0KKyAgICBGWF9GTE9BVCBtb2R1bGVTaXplRGlmZiA9IGZhYnMobW9kdWxlU2l6ZSAtIG1fZXN0aW1hdGVkTW9kdWxlU2l6ZSk7DQorICAgIHJldHVybiAobW9kdWxlU2l6ZURpZmYgPD0gMS4wZikgfHwNCisgICAgICAgICAgIChtb2R1bGVTaXplRGlmZiAvIG1fZXN0aW1hdGVkTW9kdWxlU2l6ZSA8PSAxLjBmKTsNCisgIH0NCisgIHJldHVybiBmYWxzZTsNCiB9DQotRlhfQk9PTCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpBYm91dEVxdWFscyhGWF9GTE9BVCBtb2R1bGVTaXplLCBGWF9GTE9BVCBpLCBGWF9GTE9BVCBqKQ0KLXsNCi0gICAgaWYoKGZhYnMoaSAtIEdldFkoKSkgPD0gbW9kdWxlU2l6ZSkgJiYgKGZhYnMoaiAtIEdldFgoKSkgPD0gbW9kdWxlU2l6ZSkpIHsNCi0gICAgICAgIEZYX0ZMT0FUIG1vZHVsZVNpemVEaWZmID0gZmFicyhtb2R1bGVTaXplIC0gbV9lc3RpbWF0ZWRNb2R1bGVTaXplKTsNCi0gICAgICAgIHJldHVybiAobW9kdWxlU2l6ZURpZmYgPD0gMS4wZikgfHwgKG1vZHVsZVNpemVEaWZmIC8gbV9lc3RpbWF0ZWRNb2R1bGVTaXplIDw9IDEuMGYpOw0KLSAgICB9DQotICAgIHJldHVybiBmYWxzZTsNCitGWF9GTE9BVCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpHZXRYKCkgew0KKyAgcmV0dXJuIG1feDsNCiB9DQotRlhfRkxPQVQgQ0JDX1FSRmluZGVyUGF0dGVybjo6R2V0WCgpDQotew0KLSAgICByZXR1cm4gbV94Ow0KLX0NCi1GWF9GTE9BVCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpHZXRZKCkNCi17DQotICAgIHJldHVybiBtX3k7DQorRlhfRkxPQVQgQ0JDX1FSRmluZGVyUGF0dGVybjo6R2V0WSgpIHsNCisgIHJldHVybiBtX3k7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm4uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm4uaAppbmRleCA5MTliMGMxLi5lNDViZjdiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybi5oCkBAIC04LDIyICs4LDIyIEBACiAjZGVmaW5lIF9CQ19RUkZJTkRFUlBBVFRFUk5fSF8NCiBjbGFzcyBDQkNfUmVzdWx0UG9pbnQ7DQogY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybjsNCi1jbGFzcyBDQkNfUVJGaW5kZXJQYXR0ZXJuIDogcHVibGljIENCQ19SZXN1bHRQb2ludA0KLXsNCi1wcml2YXRlOg0KLSAgICBGWF9GTE9BVCBtX2VzdGltYXRlZE1vZHVsZVNpemU7DQotICAgIGludDMyX3QgbV9jb3VudDsNCi1wdWJsaWM6DQotICAgIENCQ19RUkZpbmRlclBhdHRlcm4oRlhfRkxPQVQgeCwgRlhfRkxPQVQgcG9zWSwgRlhfRkxPQVQgZXN0aW1hdGVkTW9kdWxlU2l6ZSk7DQotICAgIHZpcnR1YWwgfkNCQ19RUkZpbmRlclBhdHRlcm4oKTsNCitjbGFzcyBDQkNfUVJGaW5kZXJQYXR0ZXJuIDogcHVibGljIENCQ19SZXN1bHRQb2ludCB7DQorIHByaXZhdGU6DQorICBGWF9GTE9BVCBtX2VzdGltYXRlZE1vZHVsZVNpemU7DQorICBpbnQzMl90IG1fY291bnQ7DQogDQotICAgIGludDMyX3QgR2V0Q291bnQoKTsNCi0gICAgRlhfRkxPQVQgR2V0WCgpOw0KLSAgICBGWF9GTE9BVCBHZXRZKCk7DQotICAgIEZYX0ZMT0FUIEdldEVzdGltYXRlZE1vZHVsZVNpemUoKTsNCi0gICAgdm9pZCBJbmNyZW1lbnRDb3VudCgpOw0KLSAgICBGWF9CT09MIEFib3V0RXF1YWxzKEZYX0ZMT0FUIG1vZHVsZVNpemUsIEZYX0ZMT0FUIGksIEZYX0ZMT0FUIGopOw0KLSAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuICpDbG9uZSgpOw0KKyBwdWJsaWM6DQorICBDQkNfUVJGaW5kZXJQYXR0ZXJuKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHBvc1ksIEZYX0ZMT0FUIGVzdGltYXRlZE1vZHVsZVNpemUpOw0KKyAgdmlydHVhbCB+Q0JDX1FSRmluZGVyUGF0dGVybigpOw0KKw0KKyAgaW50MzJfdCBHZXRDb3VudCgpOw0KKyAgRlhfRkxPQVQgR2V0WCgpOw0KKyAgRlhfRkxPQVQgR2V0WSgpOw0KKyAgRlhfRkxPQVQgR2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpOw0KKyAgdm9pZCBJbmNyZW1lbnRDb3VudCgpOw0KKyAgRlhfQk9PTCBBYm91dEVxdWFscyhGWF9GTE9BVCBtb2R1bGVTaXplLCBGWF9GTE9BVCBpLCBGWF9GTE9BVCBqKTsNCisgIENCQ19RUkZpbmRlclBhdHRlcm4qIENsb25lKCk7DQogfTsNCiB0eXBlZGVmIENCQ19RUkZpbmRlclBhdHRlcm4gRmluZGVyUGF0dGVybjsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuY3BwCmluZGV4IDBmZjIyYzcuLjE3NTc5ZjQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuY3BwCkBAIC0zMCw0MjIgKzMwLDQ0MyBAQAogY29uc3QgaW50MzJfdCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpNSU5fU0tJUCA9IDM7DQogY29uc3QgaW50MzJfdCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpNQVhfTU9EVUxFUyA9IDU3Ow0KIGNvbnN0IGludDMyX3QgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6SU5URUdFUl9NQVRIX1NISUZUID0gODsNCi1DQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlKQ0KLXsNCi0gICAgbV9pbWFnZSA9IGltYWdlOw0KLSAgICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50LlNldFNpemUoNSk7DQotICAgIG1faGFzU2tpcHBlZCA9IEZBTFNFOw0KK0NCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkNCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIoDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlKSB7DQorICBtX2ltYWdlID0gaW1hZ2U7DQorICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50LlNldFNpemUoNSk7DQorICBtX2hhc1NraXBwZWQgPSBGQUxTRTsNCiB9DQotQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6fkNCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIoKQ0KLXsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgZGVsZXRlIChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1tpXTsNCi0gICAgfQ0KLSAgICBtX3Bvc3NpYmxlQ2VudGVycy5SZW1vdmVBbGwoKTsNCitDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjp+Q0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcigpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIGRlbGV0ZSAoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbaV07DQorICB9DQorICBtX3Bvc3NpYmxlQ2VudGVycy5SZW1vdmVBbGwoKTsNCiB9DQotY2xhc3MgQ2xvc2VzdFRvQXZlcmFnZUNvbXBhcmF0b3INCi17DQotcHJpdmF0ZToNCi0gICAgRlhfRkxPQVQgbV9hdmVyYWdlTW9kdWxlU2l6ZTsNCi1wdWJsaWM6DQotICAgIENsb3Nlc3RUb0F2ZXJhZ2VDb21wYXJhdG9yKEZYX0ZMT0FUIGF2ZXJhZ2VNb2R1bGVTaXplKSA6IG1fYXZlcmFnZU1vZHVsZVNpemUoYXZlcmFnZU1vZHVsZVNpemUpDQotICAgIHsNCi0gICAgfQ0KLSAgICBpbnQzMl90IG9wZXJhdG9yKCkoRmluZGVyUGF0dGVybiAqYSwgRmluZGVyUGF0dGVybiAqYikNCi0gICAgew0KLSAgICAgICAgRlhfRkxPQVQgZEEgPSAoRlhfRkxPQVQpZmFicyhhLT5HZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCkgLSBtX2F2ZXJhZ2VNb2R1bGVTaXplKTsNCi0gICAgICAgIEZYX0ZMT0FUIGRCID0gKEZYX0ZMT0FUKWZhYnMoYi0+R2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpIC0gbV9hdmVyYWdlTW9kdWxlU2l6ZSk7DQotICAgICAgICByZXR1cm4gZEEgPCBkQiA/IC0xIDogZEEgPiBkQiA/IDEgOiAwOw0KLSAgICB9DQorY2xhc3MgQ2xvc2VzdFRvQXZlcmFnZUNvbXBhcmF0b3Igew0KKyBwcml2YXRlOg0KKyAgRlhfRkxPQVQgbV9hdmVyYWdlTW9kdWxlU2l6ZTsNCisNCisgcHVibGljOg0KKyAgQ2xvc2VzdFRvQXZlcmFnZUNvbXBhcmF0b3IoRlhfRkxPQVQgYXZlcmFnZU1vZHVsZVNpemUpDQorICAgICAgOiBtX2F2ZXJhZ2VNb2R1bGVTaXplKGF2ZXJhZ2VNb2R1bGVTaXplKSB7fQ0KKyAgaW50MzJfdCBvcGVyYXRvcigpKEZpbmRlclBhdHRlcm4qIGEsIEZpbmRlclBhdHRlcm4qIGIpIHsNCisgICAgRlhfRkxPQVQgZEEgPQ0KKyAgICAgICAgKEZYX0ZMT0FUKWZhYnMoYS0+R2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpIC0gbV9hdmVyYWdlTW9kdWxlU2l6ZSk7DQorICAgIEZYX0ZMT0FUIGRCID0NCisgICAgICAgIChGWF9GTE9BVClmYWJzKGItPkdldEVzdGltYXRlZE1vZHVsZVNpemUoKSAtIG1fYXZlcmFnZU1vZHVsZVNpemUpOw0KKyAgICByZXR1cm4gZEEgPCBkQiA/IC0xIDogZEEgPiBkQiA/IDEgOiAwOw0KKyAgfQ0KIH07DQotY2xhc3MgQ2VudGVyQ29tcGFyYXRvcg0KLXsNCi1wdWJsaWM6DQotICAgIGludDMyX3Qgb3BlcmF0b3IoKShGaW5kZXJQYXR0ZXJuICphLCBGaW5kZXJQYXR0ZXJuICpiKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYi0+R2V0Q291bnQoKSAtIGEtPkdldENvdW50KCk7DQotICAgIH0NCitjbGFzcyBDZW50ZXJDb21wYXJhdG9yIHsNCisgcHVibGljOg0KKyAgaW50MzJfdCBvcGVyYXRvcigpKEZpbmRlclBhdHRlcm4qIGEsIEZpbmRlclBhdHRlcm4qIGIpIHsNCisgICAgcmV0dXJuIGItPkdldENvdW50KCkgLSBhLT5HZXRDb3VudCgpOw0KKyAgfQ0KIH07DQotQ0JDX0NvbW1vbkJpdE1hdHJpeCAqQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6R2V0SW1hZ2UoKQ0KLXsNCi0gICAgcmV0dXJuIG1faW1hZ2U7DQorQ0JDX0NvbW1vbkJpdE1hdHJpeCogQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6R2V0SW1hZ2UoKSB7DQorICByZXR1cm4gbV9pbWFnZTsNCiB9DQotQ0ZYX0ludDMyQXJyYXkgJkNCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkdldENyb3NzQ2hlY2tTdGF0ZUNvdW50KCkNCi17DQotICAgIG1fY3Jvc3NDaGVja1N0YXRlQ291bnRbMF0gPSAwOw0KLSAgICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50WzFdID0gMDsNCi0gICAgbV9jcm9zc0NoZWNrU3RhdGVDb3VudFsyXSA9IDA7DQotICAgIG1fY3Jvc3NDaGVja1N0YXRlQ291bnRbM10gPSAwOw0KLSAgICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50WzRdID0gMDsNCi0gICAgcmV0dXJuIG1fY3Jvc3NDaGVja1N0YXRlQ291bnQ7DQorQ0ZYX0ludDMyQXJyYXkmIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkdldENyb3NzQ2hlY2tTdGF0ZUNvdW50KCkgew0KKyAgbV9jcm9zc0NoZWNrU3RhdGVDb3VudFswXSA9IDA7DQorICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50WzFdID0gMDsNCisgIG1fY3Jvc3NDaGVja1N0YXRlQ291bnRbMl0gPSAwOw0KKyAgbV9jcm9zc0NoZWNrU3RhdGVDb3VudFszXSA9IDA7DQorICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50WzRdID0gMDsNCisgIHJldHVybiBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50Ow0KIH0NCi1DRlhfUHRyQXJyYXkgKkNCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkdldFBvc3NpYmxlQ2VudGVycygpDQotew0KLSAgICByZXR1cm4gJm1fcG9zc2libGVDZW50ZXJzOw0KK0NGWF9QdHJBcnJheSogQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6R2V0UG9zc2libGVDZW50ZXJzKCkgew0KKyAgcmV0dXJuICZtX3Bvc3NpYmxlQ2VudGVyczsNCiB9DQotQ0JDX1FSRmluZGVyUGF0dGVybkluZm8qIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkZpbmQoaW50MzJfdCBoaW50LCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBtYXhJID0gbV9pbWFnZS0+R2V0SGVpZ2h0KCk7DQotICAgIGludDMyX3QgbWF4SiA9IG1faW1hZ2UtPkdldFdpZHRoKCk7DQotICAgIGludDMyX3QgaVNraXAgPSAoMyAqIG1heEkpIC8gKDQgKiBNQVhfTU9EVUxFUyk7DQotICAgIGlmKGlTa2lwIDwgTUlOX1NLSVAgfHwgMCkgew0KLSAgICAgICAgaVNraXAgPSBNSU5fU0tJUDsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGRvbmUgPSBGQUxTRTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgc3RhdGVDb3VudDsNCi0gICAgc3RhdGVDb3VudC5TZXRTaXplKDUpOw0KLSAgICBmb3IoaW50MzJfdCBpID0gaVNraXAgLSAxOyBpIDwgbWF4SSAmJiAhZG9uZTsgaSArPSBpU2tpcCkgew0KLSAgICAgICAgc3RhdGVDb3VudFswXSA9IDA7DQotICAgICAgICBzdGF0ZUNvdW50WzFdID0gMDsNCi0gICAgICAgIHN0YXRlQ291bnRbMl0gPSAwOw0KLSAgICAgICAgc3RhdGVDb3VudFszXSA9IDA7DQotICAgICAgICBzdGF0ZUNvdW50WzRdID0gMDsNCi0gICAgICAgIGludDMyX3QgY3VycmVudFN0YXRlID0gMDsNCi0gICAgICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgbWF4SjsgaisrKSB7DQotICAgICAgICAgICAgaWYobV9pbWFnZS0+R2V0KGosIGkpKSB7DQotICAgICAgICAgICAgICAgIGlmKChjdXJyZW50U3RhdGUgJiAxKSA9PSAxKSB7DQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBzdGF0ZUNvdW50W2N1cnJlbnRTdGF0ZV0rKzsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZigoY3VycmVudFN0YXRlICYgMSkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoY3VycmVudFN0YXRlID09IDQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihGb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGNvbmZpcm1lZCA9IEhhbmRsZVBvc3NpYmxlQ2VudGVyKHN0YXRlQ291bnQsIGksIGopOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb25maXJtZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTa2lwID0gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1faGFzU2tpcHBlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBIYXZlTXVsdGlwbHlDb25maXJtZWRDZW50ZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93U2tpcCA9IEZpbmRSb3dTa2lwKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocm93U2tpcCA+IHN0YXRlQ291bnRbMl0pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSByb3dTa2lwIC0gc3RhdGVDb3VudFsyXSAtIGlTa2lwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbWF4SiAtIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGogPCBtYXhKICYmICFtX2ltYWdlLT5HZXQoaiwgaSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgai0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMF0gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzFdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFsyXSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbM10gPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzRdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzBdID0gc3RhdGVDb3VudFsyXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFsxXSA9IHN0YXRlQ291bnRbM107DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMl0gPSBzdGF0ZUNvdW50WzRdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzNdID0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFs0XSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IDM7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WysrY3VycmVudFN0YXRlXSsrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KK0NCQ19RUkZpbmRlclBhdHRlcm5JbmZvKiBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpGaW5kKGludDMyX3QgaGludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IG1heEkgPSBtX2ltYWdlLT5HZXRIZWlnaHQoKTsNCisgIGludDMyX3QgbWF4SiA9IG1faW1hZ2UtPkdldFdpZHRoKCk7DQorICBpbnQzMl90IGlTa2lwID0gKDMgKiBtYXhJKSAvICg0ICogTUFYX01PRFVMRVMpOw0KKyAgaWYgKGlTa2lwIDwgTUlOX1NLSVAgfHwgMCkgew0KKyAgICBpU2tpcCA9IE1JTl9TS0lQOw0KKyAgfQ0KKyAgRlhfQk9PTCBkb25lID0gRkFMU0U7DQorICBDRlhfSW50MzJBcnJheSBzdGF0ZUNvdW50Ow0KKyAgc3RhdGVDb3VudC5TZXRTaXplKDUpOw0KKyAgZm9yIChpbnQzMl90IGkgPSBpU2tpcCAtIDE7IGkgPCBtYXhJICYmICFkb25lOyBpICs9IGlTa2lwKSB7DQorICAgIHN0YXRlQ291bnRbMF0gPSAwOw0KKyAgICBzdGF0ZUNvdW50WzFdID0gMDsNCisgICAgc3RhdGVDb3VudFsyXSA9IDA7DQorICAgIHN0YXRlQ291bnRbM10gPSAwOw0KKyAgICBzdGF0ZUNvdW50WzRdID0gMDsNCisgICAgaW50MzJfdCBjdXJyZW50U3RhdGUgPSAwOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBtYXhKOyBqKyspIHsNCisgICAgICBpZiAobV9pbWFnZS0+R2V0KGosIGkpKSB7DQorICAgICAgICBpZiAoKGN1cnJlbnRTdGF0ZSAmIDEpID09IDEpIHsNCisgICAgICAgICAgY3VycmVudFN0YXRlKys7DQorICAgICAgICB9DQorICAgICAgICBzdGF0ZUNvdW50W2N1cnJlbnRTdGF0ZV0rKzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKChjdXJyZW50U3RhdGUgJiAxKSA9PSAwKSB7DQorICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT0gNCkgew0KKyAgICAgICAgICAgIGlmIChGb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSkgew0KKyAgICAgICAgICAgICAgRlhfQk9PTCBjb25maXJtZWQgPSBIYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBqKTsNCisgICAgICAgICAgICAgIGlmIChjb25maXJtZWQpIHsNCisgICAgICAgICAgICAgICAgaVNraXAgPSAyOw0KKyAgICAgICAgICAgICAgICBpZiAobV9oYXNTa2lwcGVkKSB7DQorICAgICAgICAgICAgICAgICAgZG9uZSA9IEhhdmVNdWx0aXBseUNvbmZpcm1lZENlbnRlcnMoKTsNCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbY3VycmVudFN0YXRlXSsrOw0KKyAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93U2tpcCA9IEZpbmRSb3dTa2lwKCk7DQorICAgICAgICAgICAgICAgICAgaWYgKHJvd1NraXAgPiBzdGF0ZUNvdW50WzJdKSB7DQorICAgICAgICAgICAgICAgICAgICBpICs9IHJvd1NraXAgLSBzdGF0ZUNvdW50WzJdIC0gaVNraXA7DQorICAgICAgICAgICAgICAgICAgICBqID0gbWF4SiAtIDE7DQorICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoRm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkpIHsNCi0gICAgICAgICAgICBGWF9CT09MIGNvbmZpcm1lZCA9IEhhbmRsZVBvc3NpYmxlQ2VudGVyKHN0YXRlQ291bnQsIGksIG1heEopOw0KLSAgICAgICAgICAgIGlmKGNvbmZpcm1lZCkgew0KLSAgICAgICAgICAgICAgICBpU2tpcCA9IHN0YXRlQ291bnRbMF07DQotICAgICAgICAgICAgICAgIGlmKG1faGFzU2tpcHBlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgZG9uZSA9IEhhdmVNdWx0aXBseUNvbmZpcm1lZENlbnRlcnMoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBDRlhfUHRyQXJyYXkqIHB0ciA9IFNlbGVjdEJlc3RwYXR0ZXJucyhlKTsNCi0gICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICBDQkNfQXV0b1B0cjxDRlhfUHRyQXJyYXkgPiBwYXR0ZXJuSW5mbyhwdHIpOw0KLSAgICBPcmRlckJlc3RQYXR0ZXJucyhwYXR0ZXJuSW5mby5nZXQoKSk7DQotICAgIHJldHVybiBuZXcgQ0JDX1FSRmluZGVyUGF0dGVybkluZm8ocGF0dGVybkluZm8uZ2V0KCkpOw0KLX0NCi12b2lkIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6Ok9yZGVyQmVzdFBhdHRlcm5zKENGWF9QdHJBcnJheSAqcGF0dGVybnMpDQotew0KLSAgICBGWF9GTE9BVCBhYkRpc3RhbmNlID0gRGlzdGFuY2UoKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMF0sIChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzFdKTsNCi0gICAgRlhfRkxPQVQgYmNEaXN0YW5jZSA9IERpc3RhbmNlKChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzFdLCAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXSk7DQotICAgIEZYX0ZMT0FUIGFjRGlzdGFuY2UgPSBEaXN0YW5jZSgoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVswXSwgKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl0pOw0KLSAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuICp0b3BMZWZ0LCAqdG9wUmlnaHQsICpib3R0b21MZWZ0Ow0KLSAgICBpZiAoYmNEaXN0YW5jZSA+PSBhYkRpc3RhbmNlICYmIGJjRGlzdGFuY2UgPj0gYWNEaXN0YW5jZSkgew0KLSAgICAgICAgdG9wTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuICopKCpwYXR0ZXJucylbMF07DQotICAgICAgICB0b3BSaWdodCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuICopKCpwYXR0ZXJucylbMV07DQotICAgICAgICBib3R0b21MZWZ0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4gKikoKnBhdHRlcm5zKVsyXTsNCi0gICAgfSBlbHNlIGlmIChhY0Rpc3RhbmNlID49IGJjRGlzdGFuY2UgJiYgYWNEaXN0YW5jZSA+PSBhYkRpc3RhbmNlKSB7DQotICAgICAgICB0b3BMZWZ0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4gKikoKnBhdHRlcm5zKVsxXTsNCi0gICAgICAgIHRvcFJpZ2h0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4gKikoKnBhdHRlcm5zKVswXTsNCi0gICAgICAgIGJvdHRvbUxlZnQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiAqKSgqcGF0dGVybnMpWzJdOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgdG9wTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuICopKCpwYXR0ZXJucylbMl07DQotICAgICAgICB0b3BSaWdodCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuICopKCpwYXR0ZXJucylbMF07DQotICAgICAgICBib3R0b21MZWZ0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4gKikoKnBhdHRlcm5zKVsxXTsNCi0gICAgfQ0KLSAgICBpZiAoKGJvdHRvbUxlZnQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSkgKiAodG9wUmlnaHQtPkdldFgoKSAtIHRvcExlZnQtPkdldFgoKSkgPCAoYm90dG9tTGVmdC0+R2V0WCgpDQotICAgICAgICAgICAgLSB0b3BMZWZ0LT5HZXRYKCkpICogKHRvcFJpZ2h0LT5HZXRZKCkgLSB0b3BMZWZ0LT5HZXRZKCkpKSB7DQotICAgICAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiB0ZW1wID0gdG9wUmlnaHQ7DQotICAgICAgICB0b3BSaWdodCA9IGJvdHRvbUxlZnQ7DQotICAgICAgICBib3R0b21MZWZ0ID0gdGVtcDsNCi0gICAgfQ0KLSAgICAoKnBhdHRlcm5zKVswXSA9IGJvdHRvbUxlZnQ7DQotICAgICgqcGF0dGVybnMpWzFdID0gdG9wTGVmdDsNCi0gICAgKCpwYXR0ZXJucylbMl0gPSB0b3BSaWdodDsNCi19DQotRlhfRkxPQVQgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6RGlzdGFuY2UoQ0JDX1Jlc3VsdFBvaW50KiBwb2ludDEsIENCQ19SZXN1bHRQb2ludCogcG9pbnQyKQ0KLXsNCi0gICAgRlhfRkxPQVQgZHggPSBwb2ludDEtPkdldFgoKSAtIHBvaW50Mi0+R2V0WCgpOw0KLSAgICBGWF9GTE9BVCBkeSA9IHBvaW50MS0+R2V0WSgpIC0gcG9pbnQyLT5HZXRZKCk7DQotICAgIHJldHVybiAoRlhfRkxPQVQpRlhTWVNfc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7DQotfQ0KLUZYX0ZMT0FUIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkNlbnRlckZyb21FbmQoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQsIGludDMyX3QgZW5kKQ0KLXsNCi0gICAgcmV0dXJuIChGWF9GTE9BVCkoZW5kIC0gc3RhdGVDb3VudFs0XSAtIHN0YXRlQ291bnRbM10pIC0gc3RhdGVDb3VudFsyXSAvIDIuMGY7DQotfQ0KLUZYX0JPT0wgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6Rm91bmRQYXR0ZXJuQ3Jvc3MoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQpDQotew0KLSAgICBpbnQzMl90IHRvdGFsTW9kdWxlU2l6ZSA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDU7IGkrKykgew0KLSAgICAgICAgaW50MzJfdCBjb3VudCA9IHN0YXRlQ291bnRbaV07DQotICAgICAgICBpZiAoY291bnQgPT0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRvdGFsTW9kdWxlU2l6ZSArPSBjb3VudDsNCi0gICAgfQ0KLSAgICBpZiAodG90YWxNb2R1bGVTaXplIDwgNykgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGludDMyX3QgbW9kdWxlU2l6ZSA9ICh0b3RhbE1vZHVsZVNpemUgPDwgSU5URUdFUl9NQVRIX1NISUZUKSAvIDc7DQotICAgIGludDMyX3QgbWF4VmFyaWFuY2UgPSBtb2R1bGVTaXplIC8gMjsNCi0gICAgcmV0dXJuIEZYU1lTX2Ficyhtb2R1bGVTaXplIC0gKHN0YXRlQ291bnRbMF0gPDwgSU5URUdFUl9NQVRIX1NISUZUKSkgPCBtYXhWYXJpYW5jZSAmJg0KLSAgICAgICAgICAgRlhTWVNfYWJzKG1vZHVsZVNpemUgLSAoc3RhdGVDb3VudFsxXSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpKSA8IG1heFZhcmlhbmNlICYmDQotICAgICAgICAgICBGWFNZU19hYnMoMyAqIG1vZHVsZVNpemUgLSAoc3RhdGVDb3VudFsyXSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpKSA8IDMgKiBtYXhWYXJpYW5jZSAmJg0KLSAgICAgICAgICAgRlhTWVNfYWJzKG1vZHVsZVNpemUgLSAoc3RhdGVDb3VudFszXSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpKSA8IG1heFZhcmlhbmNlICYmDQotICAgICAgICAgICBGWFNZU19hYnMobW9kdWxlU2l6ZSAtIChzdGF0ZUNvdW50WzRdIDw8IElOVEVHRVJfTUFUSF9TSElGVCkpIDwgbWF4VmFyaWFuY2U7DQotfQ0KLUZYX0ZMT0FUIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkNyb3NzQ2hlY2tWZXJ0aWNhbChpbnQzMl90IHN0YXJ0SSwgaW50MzJfdCBjZW50ZXJKLCBpbnQzMl90IG1heENvdW50LA0KLSAgICAgICAgaW50MzJfdCBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkNCi17DQotICAgIENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlID0gbV9pbWFnZTsNCi0gICAgaW50MzJfdCBtYXhJID0gaW1hZ2UtPkdldEhlaWdodCgpOw0KLSAgICBDRlhfSW50MzJBcnJheSAmc3RhdGVDb3VudCA9IEdldENyb3NzQ2hlY2tTdGF0ZUNvdW50KCk7DQotICAgIGludDMyX3QgaSA9IHN0YXJ0STsNCi0gICAgd2hpbGUoaSA+PSAwICYmIGltYWdlLT5HZXQoY2VudGVySiwgaSkpIHsNCi0gICAgICAgIHN0YXRlQ291bnRbMl0rKzsNCi0gICAgICAgIGktLTsNCi0gICAgfQ0KLSAgICBpZihpIDwgMCkgew0KLSAgICAgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KLSAgICB9DQotICAgIHdoaWxlKGkgPj0gMCAmJiAhaW1hZ2UtPkdldChjZW50ZXJKLCBpKSAmJiBzdGF0ZUNvdW50WzFdIDw9IG1heENvdW50KSB7DQotICAgICAgICBzdGF0ZUNvdW50WzFdKys7DQotICAgICAgICBpLS07DQotICAgIH0NCi0gICAgaWYoaSA8IDAgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KSB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQotICAgIH0NCi0gICAgd2hpbGUoaSA+PSAwICYmIGltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFswXSA8PSBtYXhDb3VudCkgew0KLSAgICAgICAgc3RhdGVDb3VudFswXSsrOw0KLSAgICAgICAgaS0tOw0KLSAgICB9DQotICAgIGlmKHN0YXRlQ291bnRbMF0gPiBtYXhDb3VudCkgew0KLSAgICAgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KLSAgICB9DQotICAgIGkgPSBzdGFydEkgKyAxOw0KLSAgICB3aGlsZShpIDwgbWF4SSAmJiBpbWFnZS0+R2V0KGNlbnRlckosIGkpKSB7DQotICAgICAgICBzdGF0ZUNvdW50WzJdKys7DQotICAgICAgICBpKys7DQotICAgIH0NCi0gICAgaWYoaSA9PSBtYXhJKSB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQotICAgIH0NCi0gICAgd2hpbGUgKGkgPCBtYXhJICYmICFpbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbM10gPCBtYXhDb3VudCkgew0KLSAgICAgICAgc3RhdGVDb3VudFszXSsrOw0KLSAgICAgICAgaSsrOw0KLSAgICB9DQotICAgIGlmIChpID09IG1heEkgfHwgc3RhdGVDb3VudFszXSA+PSBtYXhDb3VudCkgew0KLSAgICAgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KLSAgICB9DQotICAgIHdoaWxlIChpIDwgbWF4SSAmJiBpbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbNF0gPCBtYXhDb3VudCkgew0KLSAgICAgICAgc3RhdGVDb3VudFs0XSsrOw0KLSAgICAgICAgaSsrOw0KLSAgICB9DQotICAgIGlmIChzdGF0ZUNvdW50WzRdID49IG1heENvdW50KSB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQotICAgIH0NCi0gICAgaW50MzJfdCBzdGF0ZUNvdW50VG90YWwgPSBzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl0gKyBzdGF0ZUNvdW50WzNdICsgc3RhdGVDb3VudFs0XTsNCi0gICAgaWYgKDUgKiBGWFNZU19hYnMoc3RhdGVDb3VudFRvdGFsIC0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpID49IG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpID8gQ2VudGVyRnJvbUVuZChzdGF0ZUNvdW50LCBpKSA6IEZYU1lTX25hbigpOw0KLX0NCi1GWF9GTE9BVCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpDcm9zc0NoZWNrSG9yaXpvbnRhbChpbnQzMl90IHN0YXJ0SiwgaW50MzJfdCBjZW50ZXJJLCBpbnQzMl90IG1heENvdW50LCBpbnQzMl90IG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKQ0KLXsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UgPSBtX2ltYWdlOw0KLSAgICBpbnQzMl90IG1heEogPSBpbWFnZS0+R2V0V2lkdGgoKTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQgPSBHZXRDcm9zc0NoZWNrU3RhdGVDb3VudCgpOw0KLSAgICBpbnQzMl90IGogPSBzdGFydEo7DQotICAgIHdoaWxlIChqID49IDAgJiYgaW1hZ2UtPkdldChqLCBjZW50ZXJJKSkgew0KLSAgICAgICAgc3RhdGVDb3VudFsyXSsrOw0KLSAgICAgICAgai0tOw0KLSAgICB9DQotICAgIGlmIChqIDwgMCkgew0KLSAgICAgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KLSAgICB9DQotICAgIHdoaWxlIChqID49IDAgJiYgIWltYWdlLT5HZXQoaiwgY2VudGVySSkgJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkgew0KLSAgICAgICAgc3RhdGVDb3VudFsxXSsrOw0KLSAgICAgICAgai0tOw0KLSAgICB9DQotICAgIGlmIChqIDwgMCB8fCBzdGF0ZUNvdW50WzFdID4gbWF4Q291bnQpIHsNCi0gICAgICAgIHJldHVybiBGWFNZU19uYW4oKTsNCi0gICAgfQ0KLSAgICB3aGlsZSAoaiA+PSAwICYmIGltYWdlLT5HZXQoaiwgY2VudGVySSkgJiYgc3RhdGVDb3VudFswXSA8PSBtYXhDb3VudCkgew0KLSAgICAgICAgc3RhdGVDb3VudFswXSsrOw0KLSAgICAgICAgai0tOw0KLSAgICB9DQotICAgIGlmIChzdGF0ZUNvdW50WzBdID4gbWF4Q291bnQpIHsNCi0gICAgICAgIHJldHVybiBGWFNZU19uYW4oKTsNCi0gICAgfQ0KLSAgICBqID0gc3RhcnRKICsgMTsNCi0gICAgd2hpbGUgKGogPCBtYXhKICYmIGltYWdlLT5HZXQoaiwgY2VudGVySSkpIHsNCi0gICAgICAgIHN0YXRlQ291bnRbMl0rKzsNCi0gICAgICAgIGorKzsNCi0gICAgfQ0KLSAgICBpZiAoaiA9PSBtYXhKKSB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQotICAgIH0NCi0gICAgd2hpbGUgKGogPCBtYXhKICYmICFpbWFnZS0+R2V0KGosIGNlbnRlckkpICYmIHN0YXRlQ291bnRbM10gPCBtYXhDb3VudCkgew0KLSAgICAgICAgc3RhdGVDb3VudFszXSsrOw0KLSAgICAgICAgaisrOw0KLSAgICB9DQotICAgIGlmIChqID09IG1heEogfHwgc3RhdGVDb3VudFszXSA+PSBtYXhDb3VudCkgew0KLSAgICAgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KLSAgICB9DQotICAgIHdoaWxlIChqIDwgbWF4SiAmJiBpbWFnZS0+R2V0KGosIGNlbnRlckkpICYmIHN0YXRlQ291bnRbNF0gPCBtYXhDb3VudCkgew0KLSAgICAgICAgc3RhdGVDb3VudFs0XSsrOw0KLSAgICAgICAgaisrOw0KLSAgICB9DQotICAgIGlmIChzdGF0ZUNvdW50WzRdID49IG1heENvdW50KSB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQotICAgIH0NCi0gICAgaW50MzJfdCBzdGF0ZUNvdW50VG90YWwgPSBzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbMl0gKyBzdGF0ZUNvdW50WzNdICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFs0XTsNCi0gICAgaWYgKDUgKiBGWFNZU19hYnMoc3RhdGVDb3VudFRvdGFsIC0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpID49IG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSB7DQotICAgICAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpID8gQ2VudGVyRnJvbUVuZChzdGF0ZUNvdW50LCBqKSA6IEZYU1lTX25hbigpOw0KLX0NCi1GWF9CT09MIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkhhbmRsZVBvc3NpYmxlQ2VudGVyKGNvbnN0IENGWF9JbnQzMkFycmF5ICZzdGF0ZUNvdW50LCBpbnQzMl90IGksIGludDMyX3QgaikNCi17DQotICAgIGludDMyX3Qgc3RhdGVDb3VudFRvdGFsID0gc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdICsgc3RhdGVDb3VudFszXSArIHN0YXRlQ291bnRbNF07DQotICAgIEZYX0ZMT0FUIGNlbnRlckogPSBDZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGopOw0KLSAgICBGWF9GTE9BVCBjZW50ZXJJID0gQ3Jvc3NDaGVja1ZlcnRpY2FsKGksIChpbnQzMl90KSBjZW50ZXJKLCBzdGF0ZUNvdW50WzJdLCBzdGF0ZUNvdW50VG90YWwpOw0KLSAgICBpZighRlhTWVNfaXNuYW4oY2VudGVySSkpIHsNCi0gICAgICAgIGNlbnRlckogPSBDcm9zc0NoZWNrSG9yaXpvbnRhbCgoaW50MzJfdCkgY2VudGVySiwgKGludDMyX3QpIGNlbnRlckksIHN0YXRlQ291bnRbMl0sIHN0YXRlQ291bnRUb3RhbCk7DQotICAgICAgICBpZighRlhTWVNfaXNuYW4oY2VudGVySikpIHsNCi0gICAgICAgICAgICBGWF9GTE9BVCBlc3RpbWF0ZWRNb2R1bGVTaXplID0gKEZYX0ZMT0FUKSBzdGF0ZUNvdW50VG90YWwgLyA3LjBmOw0KLSAgICAgICAgICAgIEZYX0JPT0wgZm91bmQgPSBGQUxTRTsNCi0gICAgICAgICAgICBpbnQzMl90IG1heCA9IG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKTsNCi0gICAgICAgICAgICBmb3IoaW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7DQotICAgICAgICAgICAgICAgIENCQ19RUkZpbmRlclBhdHRlcm4gKmNlbnRlciA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikobV9wb3NzaWJsZUNlbnRlcnNbaW5kZXhdKTsNCi0gICAgICAgICAgICAgICAgaWYoY2VudGVyLT5BYm91dEVxdWFscyhlc3RpbWF0ZWRNb2R1bGVTaXplLCBjZW50ZXJJLCBjZW50ZXJKKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2VudGVyLT5JbmNyZW1lbnRDb3VudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoIWZvdW5kKSB7DQotICAgICAgICAgICAgICAgIG1fcG9zc2libGVDZW50ZXJzLkFkZChGWF9ORVcgQ0JDX1FSRmluZGVyUGF0dGVybihjZW50ZXJKLCBjZW50ZXJJLCBlc3RpbWF0ZWRNb2R1bGVTaXplKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotaW50MzJfdCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpGaW5kUm93U2tpcCgpDQotew0KLSAgICBpbnQzMl90IG1heCA9IG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKTsNCi0gICAgaWYgKG1heCA8PSAxKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBGaW5kZXJQYXR0ZXJuICpmaXJzdENvbmZpcm1lZENlbnRlciA9IE5VTEw7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1heDsgaSsrKSB7DQotICAgICAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuICpjZW50ZXIgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbaV07DQotICAgICAgICBpZiAoY2VudGVyLT5HZXRDb3VudCgpID49IENFTlRFUl9RVU9SVU0pIHsNCi0gICAgICAgICAgICBpZiAoZmlyc3RDb25maXJtZWRDZW50ZXIgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBmaXJzdENvbmZpcm1lZENlbnRlciA9IGNlbnRlcjsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtX2hhc1NraXBwZWQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpICgoZmFicyhmaXJzdENvbmZpcm1lZENlbnRlci0+R2V0WCgpIC0gY2VudGVyLT5HZXRYKCkpIC0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWJzKGZpcnN0Q29uZmlybWVkQ2VudGVyLT5HZXRZKCkgLSBjZW50ZXItPkdldFkoKSkpIC8gMik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiAwOw0KLX0NCi1GWF9CT09MIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkhhdmVNdWx0aXBseUNvbmZpcm1lZENlbnRlcnMoKQ0KLXsNCi0gICAgaW50MzJfdCBjb25maXJtZWRDb3VudCA9IDA7DQotICAgIEZYX0ZMT0FUIHRvdGFsTW9kdWxlU2l6ZSA9IDAuMGY7DQotICAgIGludDMyX3QgbWF4ID0gbV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpOw0KLSAgICBpbnQzMl90IGk7DQotICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KLSAgICAgICAgQ0JDX1FSRmluZGVyUGF0dGVybiAqcGF0dGVybiA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1tpXTsNCi0gICAgICAgIGlmIChwYXR0ZXJuLT5HZXRDb3VudCgpID49IENFTlRFUl9RVU9SVU0pIHsNCi0gICAgICAgICAgICBjb25maXJtZWRDb3VudCsrOw0KLSAgICAgICAgICAgIHRvdGFsTW9kdWxlU2l6ZSArPSBwYXR0ZXJuLT5HZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGNvbmZpcm1lZENvdW50IDwgMykgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGF2ZXJhZ2UgPSB0b3RhbE1vZHVsZVNpemUgLyAoRlhfRkxPQVQpIG1heDsNCi0gICAgRlhfRkxPQVQgdG90YWxEZXZpYXRpb24gPSAwLjBmOw0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCi0gICAgICAgIENCQ19RUkZpbmRlclBhdHRlcm4gKnBhdHRlcm4gPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbaV07DQotICAgICAgICB0b3RhbERldmlhdGlvbiArPSBmYWJzKHBhdHRlcm4tPkdldEVzdGltYXRlZE1vZHVsZVNpemUoKSAtIGF2ZXJhZ2UpOw0KLSAgICB9DQotICAgIHJldHVybiB0b3RhbERldmlhdGlvbiA8PSAwLjA1ZiAqIHRvdGFsTW9kdWxlU2l6ZTsNCi19DQotaW5saW5lIEZYX0JPT0wgY2VudGVyQ29tcGFyYXRvcih2b2lkKiBhLCB2b2lkKiBiKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0JDX1FSRmluZGVyUGF0dGVybiopYiktPkdldENvdW50KCkgPCAoKENCQ19RUkZpbmRlclBhdHRlcm4qKWEpLT5HZXRDb3VudCgpOw0KLX0NCi1DRlhfUHRyQXJyYXkgKkNCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OlNlbGVjdEJlc3RwYXR0ZXJucyhpbnQzMl90ICZlKQ0KLXsNCi0gICAgaW50MzJfdCBzdGFydFNpemUgPSBtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCk7DQotICAgIGlmKG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKSA8IDMpIHsNCi0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQotICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgYXZlcmFnZSA9IDAuMGY7DQotICAgIGlmKHN0YXJ0U2l6ZSA+IDMpIHsNCi0gICAgICAgIEZYX0ZMT0FUIHRvdGFsTW9kdWxlU2l6ZSA9IDAuMGY7DQotICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IHN0YXJ0U2l6ZTsgaSsrKSB7DQotICAgICAgICAgICAgdG90YWxNb2R1bGVTaXplICs9ICgoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbaV0pLT5HZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCk7DQotICAgICAgICB9DQotICAgICAgICBhdmVyYWdlID0gdG90YWxNb2R1bGVTaXplIC8gKEZYX0ZMT0FUKXN0YXJ0U2l6ZTsNCi0gICAgICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgbV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpICYmIG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKSA+IDM7IGorKykgew0KLSAgICAgICAgICAgIENCQ19RUkZpbmRlclBhdHRlcm4gKnBhdHRlcm4gPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbal07DQotICAgICAgICAgICAgaWYoZmFicyhwYXR0ZXJuLT5HZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCkgLSBhdmVyYWdlKSA+IDAuMmYgKiBhdmVyYWdlKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICBtX3Bvc3NpYmxlQ2VudGVycy5SZW1vdmVBdChqKTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGRvIHsNCisgICAgICAgICAgICAgICAgICBqKys7DQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKGogPCBtYXhKICYmICFtX2ltYWdlLT5HZXQoaiwgaSkpOw0KICAgICAgICAgICAgICAgICBqLS07DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSAwOw0KKyAgICAgICAgICAgICAgc3RhdGVDb3VudFswXSA9IDA7DQorICAgICAgICAgICAgICBzdGF0ZUNvdW50WzFdID0gMDsNCisgICAgICAgICAgICAgIHN0YXRlQ291bnRbMl0gPSAwOw0KKyAgICAgICAgICAgICAgc3RhdGVDb3VudFszXSA9IDA7DQorICAgICAgICAgICAgICBzdGF0ZUNvdW50WzRdID0gMDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgc3RhdGVDb3VudFswXSA9IHN0YXRlQ291bnRbMl07DQorICAgICAgICAgICAgICBzdGF0ZUNvdW50WzFdID0gc3RhdGVDb3VudFszXTsNCisgICAgICAgICAgICAgIHN0YXRlQ291bnRbMl0gPSBzdGF0ZUNvdW50WzRdOw0KKyAgICAgICAgICAgICAgc3RhdGVDb3VudFszXSA9IDE7DQorICAgICAgICAgICAgICBzdGF0ZUNvdW50WzRdID0gMDsNCisgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IDM7DQogICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN0YXRlQ291bnRbKytjdXJyZW50U3RhdGVdKys7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHN0YXRlQ291bnRbY3VycmVudFN0YXRlXSsrOw0KICAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZihtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCkgPiAzKSB7DQotICAgICAgICBCQ19GWF9QdHJBcnJheV9Tb3J0KG1fcG9zc2libGVDZW50ZXJzLCBjZW50ZXJDb21wYXJhdG9yKTsNCisgICAgaWYgKEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpKSB7DQorICAgICAgRlhfQk9PTCBjb25maXJtZWQgPSBIYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBtYXhKKTsNCisgICAgICBpZiAoY29uZmlybWVkKSB7DQorICAgICAgICBpU2tpcCA9IHN0YXRlQ291bnRbMF07DQorICAgICAgICBpZiAobV9oYXNTa2lwcGVkKSB7DQorICAgICAgICAgIGRvbmUgPSBIYXZlTXVsdGlwbHlDb25maXJtZWRDZW50ZXJzKCk7DQorICAgICAgICB9DQorICAgICAgfQ0KICAgICB9DQotICAgIENGWF9QdHJBcnJheSAqdmVjID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KLSAgICB2ZWMtPlNldFNpemUoMyk7DQotICAgICgqdmVjKVswXSA9ICgoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbMF0pLT5DbG9uZSgpOw0KLSAgICAoKnZlYylbMV0gPSAoKENCQ19RUkZpbmRlclBhdHRlcm4qKW1fcG9zc2libGVDZW50ZXJzWzFdKS0+Q2xvbmUoKTsNCi0gICAgKCp2ZWMpWzJdID0gKChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1syXSktPkNsb25lKCk7DQotICAgIHJldHVybiB2ZWM7DQorICB9DQorICBDRlhfUHRyQXJyYXkqIHB0ciA9IFNlbGVjdEJlc3RwYXR0ZXJucyhlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENGWF9QdHJBcnJheT4gcGF0dGVybkluZm8ocHRyKTsNCisgIE9yZGVyQmVzdFBhdHRlcm5zKHBhdHRlcm5JbmZvLmdldCgpKTsNCisgIHJldHVybiBuZXcgQ0JDX1FSRmluZGVyUGF0dGVybkluZm8ocGF0dGVybkluZm8uZ2V0KCkpOw0KK30NCit2b2lkIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6Ok9yZGVyQmVzdFBhdHRlcm5zKENGWF9QdHJBcnJheSogcGF0dGVybnMpIHsNCisgIEZYX0ZMT0FUIGFiRGlzdGFuY2UgPSBEaXN0YW5jZSgoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVswXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsxXSk7DQorICBGWF9GTE9BVCBiY0Rpc3RhbmNlID0gRGlzdGFuY2UoKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl0pOw0KKyAgRlhfRkxPQVQgYWNEaXN0YW5jZSA9IERpc3RhbmNlKChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzBdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzJdKTsNCisgIENCQ19RUkZpbmRlclBhdHRlcm4gKnRvcExlZnQsICp0b3BSaWdodCwgKmJvdHRvbUxlZnQ7DQorICBpZiAoYmNEaXN0YW5jZSA+PSBhYkRpc3RhbmNlICYmIGJjRGlzdGFuY2UgPj0gYWNEaXN0YW5jZSkgew0KKyAgICB0b3BMZWZ0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4qKSgqcGF0dGVybnMpWzBdOw0KKyAgICB0b3BSaWdodCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5zKVsxXTsNCisgICAgYm90dG9tTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5zKVsyXTsNCisgIH0gZWxzZSBpZiAoYWNEaXN0YW5jZSA+PSBiY0Rpc3RhbmNlICYmIGFjRGlzdGFuY2UgPj0gYWJEaXN0YW5jZSkgew0KKyAgICB0b3BMZWZ0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4qKSgqcGF0dGVybnMpWzFdOw0KKyAgICB0b3BSaWdodCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5zKVswXTsNCisgICAgYm90dG9tTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5zKVsyXTsNCisgIH0gZWxzZSB7DQorICAgIHRvcExlZnQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopKCpwYXR0ZXJucylbMl07DQorICAgIHRvcFJpZ2h0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4qKSgqcGF0dGVybnMpWzBdOw0KKyAgICBib3R0b21MZWZ0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4qKSgqcGF0dGVybnMpWzFdOw0KKyAgfQ0KKyAgaWYgKChib3R0b21MZWZ0LT5HZXRZKCkgLSB0b3BMZWZ0LT5HZXRZKCkpICoNCisgICAgICAgICAgKHRvcFJpZ2h0LT5HZXRYKCkgLSB0b3BMZWZ0LT5HZXRYKCkpIDwNCisgICAgICAoYm90dG9tTGVmdC0+R2V0WCgpIC0gdG9wTGVmdC0+R2V0WCgpKSAqDQorICAgICAgICAgICh0b3BSaWdodC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpKSkgew0KKyAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiB0ZW1wID0gdG9wUmlnaHQ7DQorICAgIHRvcFJpZ2h0ID0gYm90dG9tTGVmdDsNCisgICAgYm90dG9tTGVmdCA9IHRlbXA7DQorICB9DQorICAoKnBhdHRlcm5zKVswXSA9IGJvdHRvbUxlZnQ7DQorICAoKnBhdHRlcm5zKVsxXSA9IHRvcExlZnQ7DQorICAoKnBhdHRlcm5zKVsyXSA9IHRvcFJpZ2h0Ow0KK30NCitGWF9GTE9BVCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpEaXN0YW5jZShDQkNfUmVzdWx0UG9pbnQqIHBvaW50MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHBvaW50Mikgew0KKyAgRlhfRkxPQVQgZHggPSBwb2ludDEtPkdldFgoKSAtIHBvaW50Mi0+R2V0WCgpOw0KKyAgRlhfRkxPQVQgZHkgPSBwb2ludDEtPkdldFkoKSAtIHBvaW50Mi0+R2V0WSgpOw0KKyAgcmV0dXJuIChGWF9GTE9BVClGWFNZU19zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsNCit9DQorRlhfRkxPQVQgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6Q2VudGVyRnJvbUVuZCgNCisgICAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIHN0YXRlQ291bnQsDQorICAgIGludDMyX3QgZW5kKSB7DQorICByZXR1cm4gKEZYX0ZMT0FUKShlbmQgLSBzdGF0ZUNvdW50WzRdIC0gc3RhdGVDb3VudFszXSkgLSBzdGF0ZUNvdW50WzJdIC8gMi4wZjsNCit9DQorRlhfQk9PTCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpGb3VuZFBhdHRlcm5Dcm9zcygNCisgICAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIHN0YXRlQ291bnQpIHsNCisgIGludDMyX3QgdG90YWxNb2R1bGVTaXplID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDU7IGkrKykgew0KKyAgICBpbnQzMl90IGNvdW50ID0gc3RhdGVDb3VudFtpXTsNCisgICAgaWYgKGNvdW50ID09IDApIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgdG90YWxNb2R1bGVTaXplICs9IGNvdW50Ow0KKyAgfQ0KKyAgaWYgKHRvdGFsTW9kdWxlU2l6ZSA8IDcpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBtb2R1bGVTaXplID0gKHRvdGFsTW9kdWxlU2l6ZSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpIC8gNzsNCisgIGludDMyX3QgbWF4VmFyaWFuY2UgPSBtb2R1bGVTaXplIC8gMjsNCisgIHJldHVybiBGWFNZU19hYnMobW9kdWxlU2l6ZSAtIChzdGF0ZUNvdW50WzBdIDw8IElOVEVHRVJfTUFUSF9TSElGVCkpIDwNCisgICAgICAgICAgICAgbWF4VmFyaWFuY2UgJiYNCisgICAgICAgICBGWFNZU19hYnMobW9kdWxlU2l6ZSAtIChzdGF0ZUNvdW50WzFdIDw8IElOVEVHRVJfTUFUSF9TSElGVCkpIDwNCisgICAgICAgICAgICAgbWF4VmFyaWFuY2UgJiYNCisgICAgICAgICBGWFNZU19hYnMoMyAqIG1vZHVsZVNpemUgLSAoc3RhdGVDb3VudFsyXSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpKSA8DQorICAgICAgICAgICAgIDMgKiBtYXhWYXJpYW5jZSAmJg0KKyAgICAgICAgIEZYU1lTX2Ficyhtb2R1bGVTaXplIC0gKHN0YXRlQ291bnRbM10gPDwgSU5URUdFUl9NQVRIX1NISUZUKSkgPA0KKyAgICAgICAgICAgICBtYXhWYXJpYW5jZSAmJg0KKyAgICAgICAgIEZYU1lTX2Ficyhtb2R1bGVTaXplIC0gKHN0YXRlQ291bnRbNF0gPDwgSU5URUdFUl9NQVRIX1NISUZUKSkgPA0KKyAgICAgICAgICAgICBtYXhWYXJpYW5jZTsNCit9DQorRlhfRkxPQVQgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6Q3Jvc3NDaGVja1ZlcnRpY2FsKA0KKyAgICBpbnQzMl90IHN0YXJ0SSwNCisgICAgaW50MzJfdCBjZW50ZXJKLA0KKyAgICBpbnQzMl90IG1heENvdW50LA0KKyAgICBpbnQzMl90IG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSB7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSA9IG1faW1hZ2U7DQorICBpbnQzMl90IG1heEkgPSBpbWFnZS0+R2V0SGVpZ2h0KCk7DQorICBDRlhfSW50MzJBcnJheSYgc3RhdGVDb3VudCA9IEdldENyb3NzQ2hlY2tTdGF0ZUNvdW50KCk7DQorICBpbnQzMl90IGkgPSBzdGFydEk7DQorICB3aGlsZSAoaSA+PSAwICYmIGltYWdlLT5HZXQoY2VudGVySiwgaSkpIHsNCisgICAgc3RhdGVDb3VudFsyXSsrOw0KKyAgICBpLS07DQorICB9DQorICBpZiAoaSA8IDApIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgd2hpbGUgKGkgPj0gMCAmJiAhaW1hZ2UtPkdldChjZW50ZXJKLCBpKSAmJiBzdGF0ZUNvdW50WzFdIDw9IG1heENvdW50KSB7DQorICAgIHN0YXRlQ291bnRbMV0rKzsNCisgICAgaS0tOw0KKyAgfQ0KKyAgaWYgKGkgPCAwIHx8IHN0YXRlQ291bnRbMV0gPiBtYXhDb3VudCkgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICB3aGlsZSAoaSA+PSAwICYmIGltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFswXSA8PSBtYXhDb3VudCkgew0KKyAgICBzdGF0ZUNvdW50WzBdKys7DQorICAgIGktLTsNCisgIH0NCisgIGlmIChzdGF0ZUNvdW50WzBdID4gbWF4Q291bnQpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgaSA9IHN0YXJ0SSArIDE7DQorICB3aGlsZSAoaSA8IG1heEkgJiYgaW1hZ2UtPkdldChjZW50ZXJKLCBpKSkgew0KKyAgICBzdGF0ZUNvdW50WzJdKys7DQorICAgIGkrKzsNCisgIH0NCisgIGlmIChpID09IG1heEkpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgd2hpbGUgKGkgPCBtYXhJICYmICFpbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbM10gPCBtYXhDb3VudCkgew0KKyAgICBzdGF0ZUNvdW50WzNdKys7DQorICAgIGkrKzsNCisgIH0NCisgIGlmIChpID09IG1heEkgfHwgc3RhdGVDb3VudFszXSA+PSBtYXhDb3VudCkgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICB3aGlsZSAoaSA8IG1heEkgJiYgaW1hZ2UtPkdldChjZW50ZXJKLCBpKSAmJiBzdGF0ZUNvdW50WzRdIDwgbWF4Q291bnQpIHsNCisgICAgc3RhdGVDb3VudFs0XSsrOw0KKyAgICBpKys7DQorICB9DQorICBpZiAoc3RhdGVDb3VudFs0XSA+PSBtYXhDb3VudCkgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICBpbnQzMl90IHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbM10gKyBzdGF0ZUNvdW50WzRdOw0KKyAgaWYgKDUgKiBGWFNZU19hYnMoc3RhdGVDb3VudFRvdGFsIC0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpID49DQorICAgICAgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgcmV0dXJuIEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpID8gQ2VudGVyRnJvbUVuZChzdGF0ZUNvdW50LCBpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhTWVNfbmFuKCk7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkNyb3NzQ2hlY2tIb3Jpem9udGFsKA0KKyAgICBpbnQzMl90IHN0YXJ0SiwNCisgICAgaW50MzJfdCBjZW50ZXJJLA0KKyAgICBpbnQzMl90IG1heENvdW50LA0KKyAgICBpbnQzMl90IG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSB7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSA9IG1faW1hZ2U7DQorICBpbnQzMl90IG1heEogPSBpbWFnZS0+R2V0V2lkdGgoKTsNCisgIENGWF9JbnQzMkFycmF5JiBzdGF0ZUNvdW50ID0gR2V0Q3Jvc3NDaGVja1N0YXRlQ291bnQoKTsNCisgIGludDMyX3QgaiA9IHN0YXJ0SjsNCisgIHdoaWxlIChqID49IDAgJiYgaW1hZ2UtPkdldChqLCBjZW50ZXJJKSkgew0KKyAgICBzdGF0ZUNvdW50WzJdKys7DQorICAgIGotLTsNCisgIH0NCisgIGlmIChqIDwgMCkgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICB3aGlsZSAoaiA+PSAwICYmICFpbWFnZS0+R2V0KGosIGNlbnRlckkpICYmIHN0YXRlQ291bnRbMV0gPD0gbWF4Q291bnQpIHsNCisgICAgc3RhdGVDb3VudFsxXSsrOw0KKyAgICBqLS07DQorICB9DQorICBpZiAoaiA8IDAgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KSB7DQorICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgIH0NCisgIHdoaWxlIChqID49IDAgJiYgaW1hZ2UtPkdldChqLCBjZW50ZXJJKSAmJiBzdGF0ZUNvdW50WzBdIDw9IG1heENvdW50KSB7DQorICAgIHN0YXRlQ291bnRbMF0rKzsNCisgICAgai0tOw0KKyAgfQ0KKyAgaWYgKHN0YXRlQ291bnRbMF0gPiBtYXhDb3VudCkgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICBqID0gc3RhcnRKICsgMTsNCisgIHdoaWxlIChqIDwgbWF4SiAmJiBpbWFnZS0+R2V0KGosIGNlbnRlckkpKSB7DQorICAgIHN0YXRlQ291bnRbMl0rKzsNCisgICAgaisrOw0KKyAgfQ0KKyAgaWYgKGogPT0gbWF4Sikgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICB3aGlsZSAoaiA8IG1heEogJiYgIWltYWdlLT5HZXQoaiwgY2VudGVySSkgJiYgc3RhdGVDb3VudFszXSA8IG1heENvdW50KSB7DQorICAgIHN0YXRlQ291bnRbM10rKzsNCisgICAgaisrOw0KKyAgfQ0KKyAgaWYgKGogPT0gbWF4SiB8fCBzdGF0ZUNvdW50WzNdID49IG1heENvdW50KSB7DQorICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgIH0NCisgIHdoaWxlIChqIDwgbWF4SiAmJiBpbWFnZS0+R2V0KGosIGNlbnRlckkpICYmIHN0YXRlQ291bnRbNF0gPCBtYXhDb3VudCkgew0KKyAgICBzdGF0ZUNvdW50WzRdKys7DQorICAgIGorKzsNCisgIH0NCisgIGlmIChzdGF0ZUNvdW50WzRdID49IG1heENvdW50KSB7DQorICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgIH0NCisgIGludDMyX3Qgc3RhdGVDb3VudFRvdGFsID0gc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFszXSArIHN0YXRlQ291bnRbNF07DQorICBpZiAoNSAqIEZYU1lTX2FicyhzdGF0ZUNvdW50VG90YWwgLSBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgPj0NCisgICAgICBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICByZXR1cm4gRm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkgPyBDZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGopDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWFNZU19uYW4oKTsNCit9DQorRlhfQk9PTCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpIYW5kbGVQb3NzaWJsZUNlbnRlcigNCisgICAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIHN0YXRlQ291bnQsDQorICAgIGludDMyX3QgaSwNCisgICAgaW50MzJfdCBqKSB7DQorICBpbnQzMl90IHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbM10gKyBzdGF0ZUNvdW50WzRdOw0KKyAgRlhfRkxPQVQgY2VudGVySiA9IENlbnRlckZyb21FbmQoc3RhdGVDb3VudCwgaik7DQorICBGWF9GTE9BVCBjZW50ZXJJID0NCisgICAgICBDcm9zc0NoZWNrVmVydGljYWwoaSwgKGludDMyX3QpY2VudGVySiwgc3RhdGVDb3VudFsyXSwgc3RhdGVDb3VudFRvdGFsKTsNCisgIGlmICghRlhTWVNfaXNuYW4oY2VudGVySSkpIHsNCisgICAgY2VudGVySiA9IENyb3NzQ2hlY2tIb3Jpem9udGFsKChpbnQzMl90KWNlbnRlckosIChpbnQzMl90KWNlbnRlckksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzJdLCBzdGF0ZUNvdW50VG90YWwpOw0KKyAgICBpZiAoIUZYU1lTX2lzbmFuKGNlbnRlckopKSB7DQorICAgICAgRlhfRkxPQVQgZXN0aW1hdGVkTW9kdWxlU2l6ZSA9IChGWF9GTE9BVClzdGF0ZUNvdW50VG90YWwgLyA3LjBmOw0KKyAgICAgIEZYX0JPT0wgZm91bmQgPSBGQUxTRTsNCisgICAgICBpbnQzMl90IG1heCA9IG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKTsNCisgICAgICBmb3IgKGludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IG1heDsgaW5kZXgrKykgew0KKyAgICAgICAgQ0JDX1FSRmluZGVyUGF0dGVybiogY2VudGVyID0NCisgICAgICAgICAgICAoQ0JDX1FSRmluZGVyUGF0dGVybiopKG1fcG9zc2libGVDZW50ZXJzW2luZGV4XSk7DQorICAgICAgICBpZiAoY2VudGVyLT5BYm91dEVxdWFscyhlc3RpbWF0ZWRNb2R1bGVTaXplLCBjZW50ZXJJLCBjZW50ZXJKKSkgew0KKyAgICAgICAgICBjZW50ZXItPkluY3JlbWVudENvdW50KCk7DQorICAgICAgICAgIGZvdW5kID0gVFJVRTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmICghZm91bmQpIHsNCisgICAgICAgIG1fcG9zc2libGVDZW50ZXJzLkFkZCgNCisgICAgICAgICAgICBGWF9ORVcgQ0JDX1FSRmluZGVyUGF0dGVybihjZW50ZXJKLCBjZW50ZXJJLCBlc3RpbWF0ZWRNb2R1bGVTaXplKSk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK2ludDMyX3QgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6RmluZFJvd1NraXAoKSB7DQorICBpbnQzMl90IG1heCA9IG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKTsNCisgIGlmIChtYXggPD0gMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZpbmRlclBhdHRlcm4qIGZpcnN0Q29uZmlybWVkQ2VudGVyID0gTlVMTDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1heDsgaSsrKSB7DQorICAgIENCQ19RUkZpbmRlclBhdHRlcm4qIGNlbnRlciA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1tpXTsNCisgICAgaWYgKGNlbnRlci0+R2V0Q291bnQoKSA+PSBDRU5URVJfUVVPUlVNKSB7DQorICAgICAgaWYgKGZpcnN0Q29uZmlybWVkQ2VudGVyID09IE5VTEwpIHsNCisgICAgICAgIGZpcnN0Q29uZmlybWVkQ2VudGVyID0gY2VudGVyOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX2hhc1NraXBwZWQgPSBUUlVFOw0KKyAgICAgICAgcmV0dXJuIChpbnQzMl90KSgoZmFicyhmaXJzdENvbmZpcm1lZENlbnRlci0+R2V0WCgpIC0gY2VudGVyLT5HZXRYKCkpIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhYnMoZmlyc3RDb25maXJtZWRDZW50ZXItPkdldFkoKSAtIGNlbnRlci0+R2V0WSgpKSkgLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAyKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiAwOw0KK30NCitGWF9CT09MIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkhhdmVNdWx0aXBseUNvbmZpcm1lZENlbnRlcnMoKSB7DQorICBpbnQzMl90IGNvbmZpcm1lZENvdW50ID0gMDsNCisgIEZYX0ZMT0FUIHRvdGFsTW9kdWxlU2l6ZSA9IDAuMGY7DQorICBpbnQzMl90IG1heCA9IG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKTsNCisgIGludDMyX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KKyAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiBwYXR0ZXJuID0gKENCQ19RUkZpbmRlclBhdHRlcm4qKW1fcG9zc2libGVDZW50ZXJzW2ldOw0KKyAgICBpZiAocGF0dGVybi0+R2V0Q291bnQoKSA+PSBDRU5URVJfUVVPUlVNKSB7DQorICAgICAgY29uZmlybWVkQ291bnQrKzsNCisgICAgICB0b3RhbE1vZHVsZVNpemUgKz0gcGF0dGVybi0+R2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpOw0KKyAgICB9DQorICB9DQorICBpZiAoY29uZmlybWVkQ291bnQgPCAzKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0ZMT0FUIGF2ZXJhZ2UgPSB0b3RhbE1vZHVsZVNpemUgLyAoRlhfRkxPQVQpbWF4Ow0KKyAgRlhfRkxPQVQgdG90YWxEZXZpYXRpb24gPSAwLjBmOw0KKyAgZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7DQorICAgIENCQ19RUkZpbmRlclBhdHRlcm4qIHBhdHRlcm4gPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbaV07DQorICAgIHRvdGFsRGV2aWF0aW9uICs9IGZhYnMocGF0dGVybi0+R2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpIC0gYXZlcmFnZSk7DQorICB9DQorICByZXR1cm4gdG90YWxEZXZpYXRpb24gPD0gMC4wNWYgKiB0b3RhbE1vZHVsZVNpemU7DQorfQ0KK2lubGluZSBGWF9CT09MIGNlbnRlckNvbXBhcmF0b3Iodm9pZCogYSwgdm9pZCogYikgew0KKyAgcmV0dXJuICgoQ0JDX1FSRmluZGVyUGF0dGVybiopYiktPkdldENvdW50KCkgPA0KKyAgICAgICAgICgoQ0JDX1FSRmluZGVyUGF0dGVybiopYSktPkdldENvdW50KCk7DQorfQ0KK0NGWF9QdHJBcnJheSogQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6U2VsZWN0QmVzdHBhdHRlcm5zKGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgc3RhcnRTaXplID0gbV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpOw0KKyAgaWYgKG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKSA8IDMpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgRlhfRkxPQVQgYXZlcmFnZSA9IDAuMGY7DQorICBpZiAoc3RhcnRTaXplID4gMykgew0KKyAgICBGWF9GTE9BVCB0b3RhbE1vZHVsZVNpemUgPSAwLjBmOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzdGFydFNpemU7IGkrKykgew0KKyAgICAgIHRvdGFsTW9kdWxlU2l6ZSArPSAoKENCQ19RUkZpbmRlclBhdHRlcm4qKW1fcG9zc2libGVDZW50ZXJzW2ldKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCk7DQorICAgIH0NCisgICAgYXZlcmFnZSA9IHRvdGFsTW9kdWxlU2l6ZSAvIChGWF9GTE9BVClzdGFydFNpemU7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsNCisgICAgICAgICBqIDwgbV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpICYmIG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKSA+IDM7DQorICAgICAgICAgaisrKSB7DQorICAgICAgQ0JDX1FSRmluZGVyUGF0dGVybiogcGF0dGVybiA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1tqXTsNCisgICAgICBpZiAoZmFicyhwYXR0ZXJuLT5HZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCkgLSBhdmVyYWdlKSA+IDAuMmYgKiBhdmVyYWdlKSB7DQorICAgICAgICBkZWxldGUgcGF0dGVybjsNCisgICAgICAgIG1fcG9zc2libGVDZW50ZXJzLlJlbW92ZUF0KGopOw0KKyAgICAgICAgai0tOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKSA+IDMpIHsNCisgICAgQkNfRlhfUHRyQXJyYXlfU29ydChtX3Bvc3NpYmxlQ2VudGVycywgY2VudGVyQ29tcGFyYXRvcik7DQorICB9DQorICBDRlhfUHRyQXJyYXkqIHZlYyA9IEZYX05FVyBDRlhfUHRyQXJyYXkoKTsNCisgIHZlYy0+U2V0U2l6ZSgzKTsNCisgICgqdmVjKVswXSA9ICgoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbMF0pLT5DbG9uZSgpOw0KKyAgKCp2ZWMpWzFdID0gKChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1sxXSktPkNsb25lKCk7DQorICAoKnZlYylbMl0gPSAoKENCQ19RUkZpbmRlclBhdHRlcm4qKW1fcG9zc2libGVDZW50ZXJzWzJdKS0+Q2xvbmUoKTsNCisgIHJldHVybiB2ZWM7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuaAppbmRleCBmMjRkMjJiLi5iYzZhOTQxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyLmgKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybkZpbmRlci5oCkBAIC0xMSwzNSArMTEsNDMgQEAKIGNsYXNzIENCQ19SZXN1bHRQb2ludDsNCiBjbGFzcyBDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbzsNCiANCi1jbGFzcyBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyDQotew0KLXByaXZhdGU6DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENFTlRFUl9RVU9SVU07DQotICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IE1JTl9TS0lQOw0KLSAgICBjb25zdCBzdGF0aWMgaW50MzJfdCBNQVhfTU9EVUxFUzsNCi0gICAgY29uc3Qgc3RhdGljIGludDMyX3QgSU5URUdFUl9NQVRIX1NISUZUOw0KLSAgICBGWF9CT09MIG1faGFzU2tpcHBlZDsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9pbWFnZTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgbV9jcm9zc0NoZWNrU3RhdGVDb3VudDsNCi0gICAgQ0ZYX1B0ckFycmF5IG1fcG9zc2libGVDZW50ZXJzOw0KLXB1YmxpYzoNCi0gICAgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcihDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSk7DQotICAgIHZpcnR1YWwgfkNCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIoKTsNCi0gICAgaW50MzJfdCBGaW5kUm93U2tpcCgpOw0KLSAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBHZXRJbWFnZSgpOw0KLSAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbyogRmluZChpbnQzMl90IGhpbnQsIGludDMyX3QgJmUpOw0KK2NsYXNzIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIgew0KKyBwcml2YXRlOg0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ0VOVEVSX1FVT1JVTTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IE1JTl9TS0lQOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgTUFYX01PRFVMRVM7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBJTlRFR0VSX01BVEhfU0hJRlQ7DQorICBGWF9CT09MIG1faGFzU2tpcHBlZDsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1faW1hZ2U7DQorICBDRlhfSW50MzJBcnJheSBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50Ow0KKyAgQ0ZYX1B0ckFycmF5IG1fcG9zc2libGVDZW50ZXJzOw0KIA0KLSAgICBDRlhfSW50MzJBcnJheSAmR2V0Q3Jvc3NDaGVja1N0YXRlQ291bnQoKTsNCi0gICAgQ0ZYX1B0ckFycmF5ICpHZXRQb3NzaWJsZUNlbnRlcnMoKTsNCi0gICAgQ0ZYX1B0ckFycmF5ICpTZWxlY3RCZXN0cGF0dGVybnMoaW50MzJfdCAmZSk7DQorIHB1YmxpYzoNCisgIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UpOw0KKyAgdmlydHVhbCB+Q0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcigpOw0KKyAgaW50MzJfdCBGaW5kUm93U2tpcCgpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogR2V0SW1hZ2UoKTsNCisgIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvKiBGaW5kKGludDMyX3QgaGludCwgaW50MzJfdCYgZSk7DQogDQotICAgIEZYX0JPT0wgSGFuZGxlUG9zc2libGVDZW50ZXIoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQsIGludDMyX3QgaSwgaW50MzJfdCBqKTsNCi0gICAgRlhfQk9PTCBIYXZlTXVsdGlwbHlDb25maXJtZWRDZW50ZXJzKCk7DQotICAgIEZYX0ZMT0FUIENlbnRlckZyb21FbmQoY29uc3QgQ0ZYX0ludDMyQXJyYXkgJnN0YXRlQ291bnQsIGludDMyX3QgZW5kKTsNCi0gICAgRlhfRkxPQVQgQ3Jvc3NDaGVja1ZlcnRpY2FsKGludDMyX3Qgc3RhcnRJLCBpbnQzMl90IGNlbnRlckosIGludDMyX3QgbWF4Q291bnQsIGludDMyX3Qgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpOw0KLSAgICBGWF9GTE9BVCBDcm9zc0NoZWNrSG9yaXpvbnRhbChpbnQzMl90IHN0YXJ0SiwgaW50MzJfdCBDZW50ZXJJLCBpbnQzMl90IG1heENPdW50LCBpbnQzMl90IG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKTsNCi0gICAgc3RhdGljIHZvaWQgT3JkZXJCZXN0UGF0dGVybnMoQ0ZYX1B0ckFycmF5ICpwYXR0ZXJucyk7DQotICAgIHN0YXRpYyBGWF9CT09MIEZvdW5kUGF0dGVybkNyb3NzKGNvbnN0IENGWF9JbnQzMkFycmF5ICZzdGF0ZUNvdW50KTsNCi0gICAgc3RhdGljIEZYX0ZMT0FUIERpc3RhbmNlKENCQ19SZXN1bHRQb2ludCogcG9pbnQxLCBDQkNfUmVzdWx0UG9pbnQqIHBvaW50Mik7DQorICBDRlhfSW50MzJBcnJheSYgR2V0Q3Jvc3NDaGVja1N0YXRlQ291bnQoKTsNCisgIENGWF9QdHJBcnJheSogR2V0UG9zc2libGVDZW50ZXJzKCk7DQorICBDRlhfUHRyQXJyYXkqIFNlbGVjdEJlc3RwYXR0ZXJucyhpbnQzMl90JiBlKTsNCisNCisgIEZYX0JPT0wgSGFuZGxlUG9zc2libGVDZW50ZXIoY29uc3QgQ0ZYX0ludDMyQXJyYXkmIHN0YXRlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBqKTsNCisgIEZYX0JPT0wgSGF2ZU11bHRpcGx5Q29uZmlybWVkQ2VudGVycygpOw0KKyAgRlhfRkxPQVQgQ2VudGVyRnJvbUVuZChjb25zdCBDRlhfSW50MzJBcnJheSYgc3RhdGVDb3VudCwgaW50MzJfdCBlbmQpOw0KKyAgRlhfRkxPQVQgQ3Jvc3NDaGVja1ZlcnRpY2FsKGludDMyX3Qgc3RhcnRJLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2VudGVySiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heENvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpOw0KKyAgRlhfRkxPQVQgQ3Jvc3NDaGVja0hvcml6b250YWwoaW50MzJfdCBzdGFydEosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IENlbnRlckksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heENPdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCk7DQorICBzdGF0aWMgdm9pZCBPcmRlckJlc3RQYXR0ZXJucyhDRlhfUHRyQXJyYXkqIHBhdHRlcm5zKTsNCisgIHN0YXRpYyBGWF9CT09MIEZvdW5kUGF0dGVybkNyb3NzKGNvbnN0IENGWF9JbnQzMkFycmF5JiBzdGF0ZUNvdW50KTsNCisgIHN0YXRpYyBGWF9GTE9BVCBEaXN0YW5jZShDQkNfUmVzdWx0UG9pbnQqIHBvaW50MSwgQ0JDX1Jlc3VsdFBvaW50KiBwb2ludDIpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSR3JpZFNhbXBsZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSR3JpZFNhbXBsZXIuY3BwCmluZGV4IGE1ZTQ3OGUuLjUwZmZhMTAgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkdyaWRTYW1wbGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJHcmlkU2FtcGxlci5jcHAKQEAgLTI1LDEwNCArMjUsMTExIEBACiAjaW5jbHVkZSAiLi4vY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KICNpbmNsdWRlICJCQ19RUkdyaWRTYW1wbGVyLmgiDQogQ0JDX1FSR3JpZFNhbXBsZXIgQ0JDX1FSR3JpZFNhbXBsZXI6Om1fZ3JpZFNhbXBsZXI7DQotQ0JDX1FSR3JpZFNhbXBsZXI6OkNCQ19RUkdyaWRTYW1wbGVyKCkNCi17DQorQ0JDX1FSR3JpZFNhbXBsZXI6OkNCQ19RUkdyaWRTYW1wbGVyKCkge30NCitDQkNfUVJHcmlkU2FtcGxlcjo6fkNCQ19RUkdyaWRTYW1wbGVyKCkge30NCitDQkNfUVJHcmlkU2FtcGxlciYgQ0JDX1FSR3JpZFNhbXBsZXI6OkdldEluc3RhbmNlKCkgew0KKyAgcmV0dXJuIG1fZ3JpZFNhbXBsZXI7DQogfQ0KLUNCQ19RUkdyaWRTYW1wbGVyOjp+Q0JDX1FSR3JpZFNhbXBsZXIoKQ0KLXsNCi19DQotQ0JDX1FSR3JpZFNhbXBsZXIgJkNCQ19RUkdyaWRTYW1wbGVyOjpHZXRJbnN0YW5jZSgpDQotew0KLSAgICByZXR1cm4gbV9ncmlkU2FtcGxlcjsNCi19DQotdm9pZCBDQkNfUVJHcmlkU2FtcGxlcjo6Q2hlY2tBbmROdWRnZVBvaW50cyhDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSwgQ0ZYX0Zsb2F0QXJyYXkgKnBvaW50cywgaW50MzJfdCAmZSkNCi17DQotICAgIGludDMyX3Qgd2lkdGggPSBpbWFnZS0+R2V0V2lkdGgoKTsNCi0gICAgaW50MzJfdCBoZWlnaHQgPSBpbWFnZS0+R2V0SGVpZ2h0KCk7DQotICAgIEZYX0JPT0wgbnVkZ2VkID0gVFJVRTsNCi0gICAgaW50MzJfdCBvZmZzZXQ7DQotICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgcG9pbnRzLT5HZXRTaXplKCkgJiYgbnVkZ2VkOyBvZmZzZXQgKz0gMikgew0KLSAgICAgICAgaW50MzJfdCB4ID0gKGludDMyX3QpICgqcG9pbnRzKVtvZmZzZXRdOw0KLSAgICAgICAgaW50MzJfdCB5ID0gKGludDMyX3QpICgqcG9pbnRzKVtvZmZzZXQgKyAxXTsNCi0gICAgICAgIGlmICh4IDwgLTEgfHwgeCA+IHdpZHRoIHx8IHkgPCAtMSB8fCB5ID4gaGVpZ2h0KSB7DQotICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCi0gICAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG51ZGdlZCA9IEZBTFNFOw0KLSAgICAgICAgaWYgKHggPT0gLTEpIHsNCi0gICAgICAgICAgICAoKnBvaW50cylbb2Zmc2V0XSA9IDAuMGY7DQotICAgICAgICAgICAgbnVkZ2VkID0gVFJVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAoeCA9PSB3aWR0aCkgew0KLSAgICAgICAgICAgICgqcG9pbnRzKVtvZmZzZXRdID0gKEZYX0ZMT0FUKSh3aWR0aCAtIDEpOw0KLSAgICAgICAgICAgIG51ZGdlZCA9IFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoeSA9PSAtMSkgew0KLSAgICAgICAgICAgICgqcG9pbnRzKVtvZmZzZXQgKyAxXSA9IDAuMGY7DQotICAgICAgICAgICAgbnVkZ2VkID0gVFJVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAoeSA9PSBoZWlnaHQpIHsNCi0gICAgICAgICAgICAoKnBvaW50cylbb2Zmc2V0ICsgMV0gPSAoRlhfRkxPQVQpKGhlaWdodCAtIDEpOw0KLSAgICAgICAgICAgIG51ZGdlZCA9IFRSVUU7DQotICAgICAgICB9DQordm9pZCBDQkNfUVJHcmlkU2FtcGxlcjo6Q2hlY2tBbmROdWRnZVBvaW50cyhDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9GbG9hdEFycmF5KiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IHdpZHRoID0gaW1hZ2UtPkdldFdpZHRoKCk7DQorICBpbnQzMl90IGhlaWdodCA9IGltYWdlLT5HZXRIZWlnaHQoKTsNCisgIEZYX0JPT0wgbnVkZ2VkID0gVFJVRTsNCisgIGludDMyX3Qgb2Zmc2V0Ow0KKyAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBwb2ludHMtPkdldFNpemUoKSAmJiBudWRnZWQ7IG9mZnNldCArPSAyKSB7DQorICAgIGludDMyX3QgeCA9IChpbnQzMl90KSgqcG9pbnRzKVtvZmZzZXRdOw0KKyAgICBpbnQzMl90IHkgPSAoaW50MzJfdCkoKnBvaW50cylbb2Zmc2V0ICsgMV07DQorICAgIGlmICh4IDwgLTEgfHwgeCA+IHdpZHRoIHx8IHkgPCAtMSB8fCB5ID4gaGVpZ2h0KSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCiAgICAgfQ0KLSAgICBudWRnZWQgPSBUUlVFOw0KLSAgICBmb3IgKG9mZnNldCA9ICgqcG9pbnRzKS5HZXRTaXplKCkgLSAyOyBvZmZzZXQgPj0gMCAmJiBudWRnZWQ7IG9mZnNldCAtPSAyKSB7DQotICAgICAgICBpbnQzMl90IHggPSAoaW50MzJfdCkgKCpwb2ludHMpW29mZnNldF07DQotICAgICAgICBpbnQzMl90IHkgPSAoaW50MzJfdCkgKCpwb2ludHMpW29mZnNldCArIDFdOw0KLSAgICAgICAgaWYgKHggPCAtMSB8fCB4ID4gd2lkdGggfHwgeSA8IC0xIHx8IHkgPiBoZWlnaHQpIHsNCi0gICAgICAgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KLSAgICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbnVkZ2VkID0gRkFMU0U7DQotICAgICAgICBpZiAoeCA9PSAtMSkgew0KLSAgICAgICAgICAgICgqcG9pbnRzKVtvZmZzZXRdID0gMC4wZjsNCi0gICAgICAgICAgICBudWRnZWQgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIGlmICh4ID09IHdpZHRoKSB7DQotICAgICAgICAgICAgKCpwb2ludHMpW29mZnNldF0gPSAoRlhfRkxPQVQpKHdpZHRoIC0gMSk7DQotICAgICAgICAgICAgbnVkZ2VkID0gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh5ID09IC0xKSB7DQotICAgICAgICAgICAgKCpwb2ludHMpW29mZnNldCArIDFdID0gMC4wZjsNCi0gICAgICAgICAgICBudWRnZWQgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIGlmICh5ID09IGhlaWdodCkgew0KLSAgICAgICAgICAgICgqcG9pbnRzKVtvZmZzZXQgKyAxXSA9IChGWF9GTE9BVCkoaGVpZ2h0IC0gMSk7DQotICAgICAgICAgICAgbnVkZ2VkID0gVFJVRTsNCi0gICAgICAgIH0NCisgICAgbnVkZ2VkID0gRkFMU0U7DQorICAgIGlmICh4ID09IC0xKSB7DQorICAgICAgKCpwb2ludHMpW29mZnNldF0gPSAwLjBmOw0KKyAgICAgIG51ZGdlZCA9IFRSVUU7DQorICAgIH0gZWxzZSBpZiAoeCA9PSB3aWR0aCkgew0KKyAgICAgICgqcG9pbnRzKVtvZmZzZXRdID0gKEZYX0ZMT0FUKSh3aWR0aCAtIDEpOw0KKyAgICAgIG51ZGdlZCA9IFRSVUU7DQogICAgIH0NCisgICAgaWYgKHkgPT0gLTEpIHsNCisgICAgICAoKnBvaW50cylbb2Zmc2V0ICsgMV0gPSAwLjBmOw0KKyAgICAgIG51ZGdlZCA9IFRSVUU7DQorICAgIH0gZWxzZSBpZiAoeSA9PSBoZWlnaHQpIHsNCisgICAgICAoKnBvaW50cylbb2Zmc2V0ICsgMV0gPSAoRlhfRkxPQVQpKGhlaWdodCAtIDEpOw0KKyAgICAgIG51ZGdlZCA9IFRSVUU7DQorICAgIH0NCisgIH0NCisgIG51ZGdlZCA9IFRSVUU7DQorICBmb3IgKG9mZnNldCA9ICgqcG9pbnRzKS5HZXRTaXplKCkgLSAyOyBvZmZzZXQgPj0gMCAmJiBudWRnZWQ7IG9mZnNldCAtPSAyKSB7DQorICAgIGludDMyX3QgeCA9IChpbnQzMl90KSgqcG9pbnRzKVtvZmZzZXRdOw0KKyAgICBpbnQzMl90IHkgPSAoaW50MzJfdCkoKnBvaW50cylbb2Zmc2V0ICsgMV07DQorICAgIGlmICh4IDwgLTEgfHwgeCA+IHdpZHRoIHx8IHkgPCAtMSB8fCB5ID4gaGVpZ2h0KSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBudWRnZWQgPSBGQUxTRTsNCisgICAgaWYgKHggPT0gLTEpIHsNCisgICAgICAoKnBvaW50cylbb2Zmc2V0XSA9IDAuMGY7DQorICAgICAgbnVkZ2VkID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICh4ID09IHdpZHRoKSB7DQorICAgICAgKCpwb2ludHMpW29mZnNldF0gPSAoRlhfRkxPQVQpKHdpZHRoIC0gMSk7DQorICAgICAgbnVkZ2VkID0gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoeSA9PSAtMSkgew0KKyAgICAgICgqcG9pbnRzKVtvZmZzZXQgKyAxXSA9IDAuMGY7DQorICAgICAgbnVkZ2VkID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICh5ID09IGhlaWdodCkgew0KKyAgICAgICgqcG9pbnRzKVtvZmZzZXQgKyAxXSA9IChGWF9GTE9BVCkoaGVpZ2h0IC0gMSk7DQorICAgICAgbnVkZ2VkID0gVFJVRTsNCisgICAgfQ0KKyAgfQ0KIH0NCi1DQkNfQ29tbW9uQml0TWF0cml4ICpDQkNfUVJHcmlkU2FtcGxlcjo6U2FtcGxlR3JpZChDQkNfQ29tbW9uQml0TWF0cml4ICppbWFnZSwgaW50MzJfdCBkaW1lbnNpb25YLCBpbnQzMl90IGRpbWVuc2lvblksDQotICAgICAgICBGWF9GTE9BVCBwMVRvWCwgRlhfRkxPQVQgcDFUb1ksDQotICAgICAgICBGWF9GTE9BVCBwMlRvWCwgRlhfRkxPQVQgcDJUb1ksDQotICAgICAgICBGWF9GTE9BVCBwM1RvWCwgRlhfRkxPQVQgcDNUb1ksDQotICAgICAgICBGWF9GTE9BVCBwNFRvWCwgRlhfRkxPQVQgcDRUb1ksDQotICAgICAgICBGWF9GTE9BVCBwMUZyb21YLCBGWF9GTE9BVCBwMUZyb21ZLA0KLSAgICAgICAgRlhfRkxPQVQgcDJGcm9tWCwgRlhfRkxPQVQgcDJGcm9tWSwNCi0gICAgICAgIEZYX0ZMT0FUIHAzRnJvbVgsIEZYX0ZMT0FUIHAzRnJvbVksDQotICAgICAgICBGWF9GTE9BVCBwNEZyb21YLCBGWF9GTE9BVCBwNEZyb21ZLCBpbnQzMl90ICZlKQ0KLXsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtPiB0cmFuc2Zvcm0oQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOjpRdWFkcmlsYXRlcmFsVG9RdWFkcmlsYXRlcmFsKA0KLSAgICAgICAgICAgICAgICBwMVRvWCwgcDFUb1ksIHAyVG9YLCBwMlRvWSwgcDNUb1gsIHAzVG9ZLCBwNFRvWCwgcDRUb1ksDQotICAgICAgICAgICAgICAgIHAxRnJvbVgsIHAxRnJvbVksIHAyRnJvbVgsIHAyRnJvbVksIHAzRnJvbVgsIHAzRnJvbVksIHA0RnJvbVgsIHA0RnJvbVkpKTsNCi0gICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCAqdGVtcEJpdE0gPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdE1hdHJpeCgpOw0KLSAgICB0ZW1wQml0TS0+SW5pdChkaW1lbnNpb25YLCBkaW1lbnNpb25ZKTsNCi0gICAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJpdE1hdHJpeD4gYml0cyh0ZW1wQml0TSk7DQotICAgIENGWF9GbG9hdEFycmF5IHBvaW50czsNCi0gICAgcG9pbnRzLlNldFNpemUoZGltZW5zaW9uWCA8PCAxKTsNCi0gICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgZGltZW5zaW9uWTsgeSsrKSB7DQotICAgICAgICBpbnQzMl90IG1heCA9IHBvaW50cy5HZXRTaXplKCk7DQotICAgICAgICBGWF9GTE9BVCBpVmFsdWUgPSAoRlhfRkxPQVQpICh5ICsgMC41Zik7DQotICAgICAgICBpbnQzMl90IHg7DQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgbWF4OyB4ICs9IDIpIHsNCi0gICAgICAgICAgICBwb2ludHNbeF0gPSAoRlhfRkxPQVQpICgoeCA+PiAxKSArIDAuNWYpOw0KLSAgICAgICAgICAgIHBvaW50c1t4ICsgMV0gPSBpVmFsdWU7DQotICAgICAgICB9DQotICAgICAgICB0cmFuc2Zvcm0tPlRyYW5zZm9ybVBvaW50cygmcG9pbnRzKTsNCi0gICAgICAgIENoZWNrQW5kTnVkZ2VQb2ludHMoaW1hZ2UsICZwb2ludHMsIGUpOw0KLSAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IG1heDsgeCArPSAyKSB7DQotICAgICAgICAgICAgaWYgKGltYWdlLT5HZXQoKGludDMyX3QpIHBvaW50c1t4XSwgKGludDMyX3QpIHBvaW50c1t4ICsgMV0pKSB7DQotICAgICAgICAgICAgICAgIGJpdHMtPlNldCh4ID4+IDEsIHkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCitDQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfUVJHcmlkU2FtcGxlcjo6U2FtcGxlR3JpZChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpbWVuc2lvblgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaW1lbnNpb25ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAzVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAzVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0VG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0VG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxRnJvbVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDFGcm9tWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwMkZyb21YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyRnJvbVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDNGcm9tWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwM0Zyb21ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0RnJvbVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDRGcm9tWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0+IHRyYW5zZm9ybSgNCisgICAgICBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OlF1YWRyaWxhdGVyYWxUb1F1YWRyaWxhdGVyYWwoDQorICAgICAgICAgIHAxVG9YLCBwMVRvWSwgcDJUb1gsIHAyVG9ZLCBwM1RvWCwgcDNUb1ksIHA0VG9YLCBwNFRvWSwgcDFGcm9tWCwNCisgICAgICAgICAgcDFGcm9tWSwgcDJGcm9tWCwgcDJGcm9tWSwgcDNGcm9tWCwgcDNGcm9tWSwgcDRGcm9tWCwgcDRGcm9tWSkpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogdGVtcEJpdE0gPSBGWF9ORVcgQ0JDX0NvbW1vbkJpdE1hdHJpeCgpOw0KKyAgdGVtcEJpdE0tPkluaXQoZGltZW5zaW9uWCwgZGltZW5zaW9uWSk7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQml0TWF0cml4PiBiaXRzKHRlbXBCaXRNKTsNCisgIENGWF9GbG9hdEFycmF5IHBvaW50czsNCisgIHBvaW50cy5TZXRTaXplKGRpbWVuc2lvblggPDwgMSk7DQorICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBkaW1lbnNpb25ZOyB5KyspIHsNCisgICAgaW50MzJfdCBtYXggPSBwb2ludHMuR2V0U2l6ZSgpOw0KKyAgICBGWF9GTE9BVCBpVmFsdWUgPSAoRlhfRkxPQVQpKHkgKyAwLjVmKTsNCisgICAgaW50MzJfdCB4Ow0KKyAgICBmb3IgKHggPSAwOyB4IDwgbWF4OyB4ICs9IDIpIHsNCisgICAgICBwb2ludHNbeF0gPSAoRlhfRkxPQVQpKCh4ID4+IDEpICsgMC41Zik7DQorICAgICAgcG9pbnRzW3ggKyAxXSA9IGlWYWx1ZTsNCiAgICAgfQ0KLSAgICByZXR1cm4gYml0cy5yZWxlYXNlKCk7DQorICAgIHRyYW5zZm9ybS0+VHJhbnNmb3JtUG9pbnRzKCZwb2ludHMpOw0KKyAgICBDaGVja0FuZE51ZGdlUG9pbnRzKGltYWdlLCAmcG9pbnRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBmb3IgKHggPSAwOyB4IDwgbWF4OyB4ICs9IDIpIHsNCisgICAgICBpZiAoaW1hZ2UtPkdldCgoaW50MzJfdClwb2ludHNbeF0sIChpbnQzMl90KXBvaW50c1t4ICsgMV0pKSB7DQorICAgICAgICBiaXRzLT5TZXQoeCA+PiAxLCB5KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBiaXRzLnJlbGVhc2UoKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSR3JpZFNhbXBsZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkdyaWRTYW1wbGVyLmgKaW5kZXggYzdhYmY3NS4uYjk1ZTI1ZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSR3JpZFNhbXBsZXIuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJHcmlkU2FtcGxlci5oCkBAIC0xMCwyNCArMTAsMzcgQEAKIGNsYXNzIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTsNCiBjbGFzcyBDQkNfQ29tbW9uRGVmYXVsdEdyaWRTYW1wbGVyOw0KIGNsYXNzIENCQ19RUkdyaWRTYW1wbGVyOw0KLWNsYXNzIENCQ19RUkdyaWRTYW1wbGVyDQotew0KLXByaXZhdGU6DQotICAgIHN0YXRpYyBDQkNfUVJHcmlkU2FtcGxlciBtX2dyaWRTYW1wbGVyOw0KLXB1YmxpYzoNCi0gICAgQ0JDX1FSR3JpZFNhbXBsZXIoKTsNCi0gICAgdmlydHVhbCB+Q0JDX1FSR3JpZFNhbXBsZXIoKTsNCi0gICAgdmlydHVhbCBDQkNfQ29tbW9uQml0TWF0cml4KiBTYW1wbGVHcmlkKENCQ19Db21tb25CaXRNYXRyaXggKmltYWdlLCBpbnQzMl90IGRpbWVuc2lvblgsIGludDMyX3QgZGltZW5zaW9uWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxVG9YLCBGWF9GTE9BVCBwMVRvWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyVG9YLCBGWF9GTE9BVCBwMlRvWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAzVG9YLCBGWF9GTE9BVCBwM1RvWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0VG9YLCBGWF9GTE9BVCBwNFRvWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxRnJvbVgsIEZYX0ZMT0FUIHAxRnJvbVksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwMkZyb21YLCBGWF9GTE9BVCBwMkZyb21ZLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDNGcm9tWCwgRlhfRkxPQVQgcDNGcm9tWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0RnJvbVgsIEZYX0ZMT0FUIHA0RnJvbVksIGludDMyX3QgJmUpOw0KK2NsYXNzIENCQ19RUkdyaWRTYW1wbGVyIHsNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBDQkNfUVJHcmlkU2FtcGxlciBtX2dyaWRTYW1wbGVyOw0KIA0KLSAgICBzdGF0aWMgQ0JDX1FSR3JpZFNhbXBsZXIgJkdldEluc3RhbmNlKCk7DQotICAgIHN0YXRpYyB2b2lkIENoZWNrQW5kTnVkZ2VQb2ludHMoQ0JDX0NvbW1vbkJpdE1hdHJpeCAqaW1hZ2UsIENGWF9GbG9hdEFycmF5ICpwb2ludHMsIGludDMyX3QgJmUpOw0KKyBwdWJsaWM6DQorICBDQkNfUVJHcmlkU2FtcGxlcigpOw0KKyAgdmlydHVhbCB+Q0JDX1FSR3JpZFNhbXBsZXIoKTsNCisgIHZpcnR1YWwgQ0JDX0NvbW1vbkJpdE1hdHJpeCogU2FtcGxlR3JpZChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpbWVuc2lvblgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaW1lbnNpb25ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAzVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAzVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0VG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0VG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxRnJvbVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDFGcm9tWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwMkZyb21YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyRnJvbVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDNGcm9tWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwM0Zyb21ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0RnJvbVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDRGcm9tWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisNCisgIHN0YXRpYyBDQkNfUVJHcmlkU2FtcGxlciYgR2V0SW5zdGFuY2UoKTsNCisgIHN0YXRpYyB2b2lkIENoZWNrQW5kTnVkZ2VQb2ludHMoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9GbG9hdEFycmF5KiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvdXRpbHMuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3V0aWxzLmgKaW5kZXggOTViNWZmMC4uZTdkZjA3MyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGJhcmNvZGUvdXRpbHMuaAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS91dGlscy5oCkBAIC03LDk0ICs3LDg3IEBACiAjaWZuZGVmIF9CQ19VVElMU19IXw0KICNkZWZpbmUgX0JDX1VUSUxTX0hfDQogdHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8dm9pZCosIGludDMyX3Q+IENGWF9QdHJUb0ludDMyOw0KLUZYX0JPT0wgQkNfRlhfQnl0ZVN0cmluZ19SZXBsYWNlKENGWF9CeXRlU3RyaW5nICZkc3QsIEZYX0RXT1JEIGZpcnN0LCBGWF9EV09SRCBsYXN0LCBpbnQzMl90IGNvdW50LCBGWF9DSEFSIGMpOw0KLXZvaWQgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQoQ0ZYX0J5dGVTdHJpbmcgJmRzdCwgaW50MzJfdCBjb3VudCwgRlhfQ0hBUiBjKTsNCi12b2lkIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKENGWF9CeXRlU3RyaW5nICZkc3QsIGNvbnN0IENGWF9CeXRlQXJyYXkgJmJhKTsNCitGWF9CT09MIEJDX0ZYX0J5dGVTdHJpbmdfUmVwbGFjZShDRlhfQnl0ZVN0cmluZyYgZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGxhc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIGMpOw0KK3ZvaWQgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQoQ0ZYX0J5dGVTdHJpbmcmIGRzdCwgaW50MzJfdCBjb3VudCwgRlhfQ0hBUiBjKTsNCit2b2lkIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKENGWF9CeXRlU3RyaW5nJiBkc3QsIGNvbnN0IENGWF9CeXRlQXJyYXkmIGJhKTsNCiB0eXBlZGVmIEZYX0JPT0wgKCpCQ19QdHJBcnJheUNvbXBhcmVDYWxsYmFjaykodm9pZCogbCwgdm9pZCogcik7DQotdm9pZCBCQ19GWF9QdHJBcnJheV9Tb3J0KENGWF9QdHJBcnJheSAmc3JjLCBCQ19QdHJBcnJheUNvbXBhcmVDYWxsYmFjayBmdW4pOw0KLXRlbXBsYXRlPGNsYXNzIF9UeT4NCi1jbGFzcyBDQkNfQXV0b1B0cg0KLXsNCi1wdWJsaWM6DQotICAgIHR5cGVkZWYgX1R5IGVsZW1lbnRfdHlwZTsNCi0gICAgZXhwbGljaXQgQ0JDX0F1dG9QdHIoX1R5ICpfUCA9IDApDQotICAgICAgICA6IF9Pd25zKF9QICE9IDApLCBfUHRyKF9QKSB7fQ0KLSAgICBDQkNfQXV0b1B0cihjb25zdCBDQkNfQXV0b1B0cjxfVHk+JiBfWSkNCi0gICAgICAgIDogX093bnMoX1kuX093bnMpLCBfUHRyKF9ZLnJlbGVhc2UoKSkge30NCi0gICAgQ0JDX0F1dG9QdHI8X1R5PiYgb3BlcmF0b3I9KGNvbnN0IENCQ19BdXRvUHRyPF9UeT4mIF9ZKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyAhPSAmX1kpIHsNCi0gICAgICAgICAgICBpZiAoX1B0ciAhPSBfWS5nZXQoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoX093bnMpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBfUHRyOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIF9Pd25zID0gX1kuX093bnM7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChfWS5fT3ducykgew0KLSAgICAgICAgICAgICAgICBfT3ducyA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIF9QdHIgPSBfWS5yZWxlYXNlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gKCp0aGlzKTsNCi0gICAgfQ0KLSAgICB+Q0JDX0F1dG9QdHIoKQ0KLSAgICB7DQordm9pZCBCQ19GWF9QdHJBcnJheV9Tb3J0KENGWF9QdHJBcnJheSYgc3JjLCBCQ19QdHJBcnJheUNvbXBhcmVDYWxsYmFjayBmdW4pOw0KK3RlbXBsYXRlIDxjbGFzcyBfVHk+DQorY2xhc3MgQ0JDX0F1dG9QdHIgew0KKyBwdWJsaWM6DQorICB0eXBlZGVmIF9UeSBlbGVtZW50X3R5cGU7DQorICBleHBsaWNpdCBDQkNfQXV0b1B0cihfVHkqIF9QID0gMCkgOiBfT3ducyhfUCAhPSAwKSwgX1B0cihfUCkge30NCisgIENCQ19BdXRvUHRyKGNvbnN0IENCQ19BdXRvUHRyPF9UeT4mIF9ZKQ0KKyAgICAgIDogX093bnMoX1kuX093bnMpLCBfUHRyKF9ZLnJlbGVhc2UoKSkge30NCisgIENCQ19BdXRvUHRyPF9UeT4mIG9wZXJhdG9yPShjb25zdCBDQkNfQXV0b1B0cjxfVHk+JiBfWSkgew0KKyAgICBpZiAodGhpcyAhPSAmX1kpIHsNCisgICAgICBpZiAoX1B0ciAhPSBfWS5nZXQoKSkgew0KICAgICAgICAgaWYgKF9Pd25zKSB7DQotICAgICAgICAgICAgZGVsZXRlIF9QdHI7DQorICAgICAgICAgIGRlbGV0ZSBfUHRyOw0KICAgICAgICAgfQ0KKyAgICAgICAgX093bnMgPSBfWS5fT3duczsNCisgICAgICB9IGVsc2UgaWYgKF9ZLl9Pd25zKSB7DQorICAgICAgICBfT3ducyA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIF9QdHIgPSBfWS5yZWxlYXNlKCk7DQogICAgIH0NCi0gICAgX1R5JiBvcGVyYXRvciooKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKCpnZXQoKSk7DQorICAgIHJldHVybiAoKnRoaXMpOw0KKyAgfQ0KKyAgfkNCQ19BdXRvUHRyKCkgew0KKyAgICBpZiAoX093bnMpIHsNCisgICAgICBkZWxldGUgX1B0cjsNCiAgICAgfQ0KLSAgICBfVHkgKm9wZXJhdG9yLT4oKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKGdldCgpKTsNCi0gICAgfQ0KLSAgICBfVHkgKmdldCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoX1B0cik7DQotICAgIH0NCi0gICAgX1R5ICpyZWxlYXNlKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgKChDQkNfQXV0b1B0cjxfVHk+ICopdGhpcyktPl9Pd25zID0gRkFMU0U7DQotICAgICAgICByZXR1cm4gKF9QdHIpOw0KLSAgICB9DQotcHJpdmF0ZToNCi0gICAgRlhfQk9PTCBfT3duczsNCi0gICAgX1R5ICpfUHRyOw0KKyAgfQ0KKyAgX1R5JiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAoKmdldCgpKTsgfQ0KKyAgX1R5KiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKGdldCgpKTsgfQ0KKyAgX1R5KiBnZXQoKSBjb25zdCB7IHJldHVybiAoX1B0cik7IH0NCisgIF9UeSogcmVsZWFzZSgpIGNvbnN0IHsNCisgICAgKChDQkNfQXV0b1B0cjxfVHk+Kil0aGlzKS0+X093bnMgPSBGQUxTRTsNCisgICAgcmV0dXJuIChfUHRyKTsNCisgIH0NCisNCisgcHJpdmF0ZToNCisgIEZYX0JPT0wgX093bnM7DQorICBfVHkqIF9QdHI7DQogfTsNCiAjaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0XykNCiAjaW5jbHVkZSA8bGltaXRzPg0KLSNlbGlmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfIHx8IF9GWF9PU18gPT0gX0ZYX0xJTlVYX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX0lPU18pDQorI2VsaWYoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXyB8fCBfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXyB8fCBcDQorICAgICAgX0ZYX09TXyA9PSBfRlhfSU9TXykNCiAjaW5jbHVkZSA8bGltaXRzLmg+DQogI2VuZGlmDQogI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8pDQogI2RlZmluZSBGWFNZU19pc25hbih4KSBfaXNuYW4oeCkNCi0jZWxpZiAoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXyB8fCBfRlhfT1NfID09IF9GWF9JT1NfKQ0KKyNlbGlmKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8gfHwgX0ZYX09TXyA9PSBfRlhfSU9TXykNCiAjaW5jbHVkZSA8bWF0aC5oPg0KICNkZWZpbmUgRlhTWVNfaXNuYW4oeCkgc3RkOjppc25hbih4KQ0KLSNlbGlmIChfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9BTkRST0lEXykNCisjZWxpZihfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9BTkRST0lEXykNCiAjaW5jbHVkZSA8bWF0aC5oPg0KICNkZWZpbmUgRlhTWVNfaXNuYW4oeCkgaXNuYW4oeCkNCiAjZW5kaWYNCiAjaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0XykNCiAjZGVmaW5lIEZYU1lTX25hbigpIChzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6cXVpZXRfTmFOKCkpDQotI2VsaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8gfHwgX0ZYX09TXyA9PSBfRlhfTElOVVhfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfSU9TXyB8fCBfRlhfT1NfID09IF9GWF9BTkRST0lEXykNCisjZWxpZihfRlhfT1NfID09IF9GWF9NQUNPU1hfIHx8IF9GWF9PU18gPT0gX0ZYX0xJTlVYX0RFU0tUT1BfIHx8IFwNCisgICAgICBfRlhfT1NfID09IF9GWF9JT1NfIHx8IF9GWF9PU18gPT0gX0ZYX0FORFJPSURfKQ0KICNkZWZpbmUgRlhTWVNfbmFuKCkgTkFODQogI2VuZGlmDQogZW51bSBCQ0ZPUk1BVCB7DQotICAgIEJDRk9STUFUX1VOU1BFQ0lGWSA9IC0xLA0KLSAgICBCQ0ZPUk1BVF9DT0RBQkFSLA0KLSAgICBCQ0ZPUk1BVF9DT0RFXzM5LA0KLSAgICBCQ0ZPUk1BVF9DT0RFXzEyOCwNCi0gICAgQkNGT1JNQVRfQ09ERV8xMjhCLA0KLSAgICBCQ0ZPUk1BVF9DT0RFXzEyOEMsDQotICAgIEJDRk9STUFUX0VBTl84LA0KLSAgICBCQ0ZPUk1BVF9VUENfQSwNCi0gICAgQkNGT1JNQVRfRUFOXzEzLA0KLSAgICBCQ0ZPUk1BVF9QREZfNDE3LA0KLSAgICBCQ0ZPUk1BVF9EQVRBTUFUUklYLA0KLSAgICBCQ0ZPUk1BVF9RUl9DT0RFDQorICBCQ0ZPUk1BVF9VTlNQRUNJRlkgPSAtMSwNCisgIEJDRk9STUFUX0NPREFCQVIsDQorICBCQ0ZPUk1BVF9DT0RFXzM5LA0KKyAgQkNGT1JNQVRfQ09ERV8xMjgsDQorICBCQ0ZPUk1BVF9DT0RFXzEyOEIsDQorICBCQ0ZPUk1BVF9DT0RFXzEyOEMsDQorICBCQ0ZPUk1BVF9FQU5fOCwNCisgIEJDRk9STUFUX1VQQ19BLA0KKyAgQkNGT1JNQVRfRUFOXzEzLA0KKyAgQkNGT1JNQVRfUERGXzQxNywNCisgIEJDRk9STUFUX0RBVEFNQVRSSVgsDQorICBCQ0ZPUk1BVF9RUl9DT0RFDQogfTsNCiAjZGVmaW5lIEJDRk9STUFUX0VDTEVWRUxfTCAwDQogI2RlZmluZSBCQ0ZPUk1BVF9FQ0xFVkVMX00gMQ0KQEAgLTEwMywxMTcgKzk2LDEyMSBAQAogI2luY2x1ZGUgPGN0eXBlLmg+DQogI2RlZmluZSBGWFNZU19JbnRNYXggSU5UX01BWA0KICNkZWZpbmUgRlhTWVNfSXNkaWdpdCBpc2RpZ2l0DQotI2RlZmluZQlCQ0V4Y2VwdGlvbk5PCQkJCQkJCQkJCQkgICAgICAgICAgIDANCi0jZGVmaW5lCUJDRXhjZXB0aW9uTm90Rm91bmQJCQkJCQkJCQkJICAgICAgICAgICAxDQotI2RlZmluZQlCQ0V4Y2VwdGlvbkVuZExlc3NUaGFuU3RhcnQJCQkJCQkJCSAgICAgICAgICAgMg0KLSNkZWZpbmUJQkNFeGNlcHRpb25Vbmtub3duRGVjb2RlcgkJCQkJCQkJICAgICAgICAgICAzDQotI2RlZmluZQlCQ0V4Y2VwdGlvblJvdGF0ZU5vdFN1cHBvcnRlZAkJCQkJCQkgICAgICAgICAgIDQNCi0jZGVmaW5lCUJDRXhjZXB0aW9uSGVpZ2h0QW5kV2lkdGhNdXN0QmVBdExlYXN0MQkJCQkJICAgICAgICAgICA1DQotI2RlZmluZQlCQ0V4Y2VwdGlvblJlZ2lvbk11c3RGaXRJbnNpZGVNYXRyaXgJCQkJICAgICAgICAgICAgICAgNg0KLSNkZWZpbmUJQkNFeGNlcHRpb25DYW5Ob3RDYWxsR2V0RGltZW5zaW9uT25Ob25TcXVhcmVNYXRyaXgJCSAgICAgICAgICAgNw0KLSNkZWZpbmUJQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb24JCQkJCQkJCSAgICAgICAgICAgOA0KLSNkZWZpbmUJQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnRNdXN0TWF0Y2hWZXJzaW9uU2l6ZQkJICAgICAgICAgICAgICAgOQ0KLSNkZWZpbmUJQkNFeGNlcHRpb25DaGVja3N1bUV4Y2VwdGlvbgkJCQkJCQkgICAgICAgICAgMTANCi0jZGVmaW5lCUJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50SW52YWxpZEZpcnN0RGlnaXQJCQkgICAgICAgICAgICAgIDExDQotI2RlZmluZQlCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudEludmFsaWRTZWNvbmREaWdpdAkJCSAgICAgICAgICAxMg0KLSNkZWZpbmUJQkNFeGNlcHRpb25SdW50aW1lRGVjb2RpbmdJbnZhbGlkSVNPX0lFQwkJCQkgICAgICAgICAgMTMNCi0jZGVmaW5lCUJDRXhjZXB0aW9uUnVudGltZURlY29kaW5nSW52YWxpZEFscGhhbnVtZXJpYwkJCSAgICAgICAgICAxNA0KLSNkZWZpbmUJQkNFeGNlcHRpb25MZWZ0QW5kVG9wTXVzdEJlTm9ubmVnYXRpdmUJCQkJCSAgICAgICAgICAxNQ0KLSNkZWZpbmUJQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQJCQkJCQkJCSAgICAgICAgICAxNg0KLSNkZWZpbmUJQkNFeGNlcHRpb25CYWRFQ0kJCQkJCQkJCQkJICAgICAgICAgIDE3DQotI2RlZmluZQlCQ0V4Y2VwdGlvblVuU3VwcG9ydGVkQmFyY29kZQkJCQkJCQkgICAgICAgICAgMTgNCi0jZGVmaW5lCUJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRTdHJpbmcJCQkJCQkJICAgICAgICAgIDE5DQotI2RlZmluZQlCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoTXVzdEJlOAkJCQkJCQkgICAgICAgICAgMjANCi0jZGVmaW5lCUJDRXhjZXB0aW9uRGF0YUNoZWNrRXhjZXB0aW9uCQkJCQkJCSAgICAgICAgICAyMQ0KLSNkZWZpbmUgQkNFeGNlcHRpb25FeHRyYWN0TnVtYmVyVmFsdWVGcm9tQml0QXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgMjINCi0jZGVmaW5lIEJDRXhjZXB0aW9uUmVhZAkJCQkJCQkJCQkJICAgICAgICAgIDIzDQotI2RlZmluZSBCQ0V4Y2VwdGlvblJlcXVlc3RlZFJvd0lzT3V0U2l6ZVRoZUltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAyNA0KLSNkZWZpbmUgQkNFeGNlcHRpb25Ob0NvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYNCi0jZGVmaW5lIEJDRXhjZXB0aW9uVW5TdXBwb3J0RWNsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3DQotI2RlZmluZSBCQ0V4Y2VwdGlvblVuU3VwcG9ydE1vZGUJCQkJCQkJCSAgICAgICAgICAyOA0KLSNkZWZpbmUgQkNFeGNlcHRpb25SZWZlcmVuY2VNdXN0QmVCZXR3ZWVuMEFuZDcJCQkJCSAgICAgICAgICAyOQ0KLSNkZWZpbmUgQkNFeGNlcHRpb25CYWRFcnJvckxvY2F0aW9uCQkJCQkJCQkgICAgICAgICAgMzANCi0jZGVmaW5lIEJDRXhjZXB0aW9uRGVncmVlSXNOZWdhdGl2ZQkJCQkJCQkgCSAgICAgICAgICAzMQ0KLSNkZWZpbmUgQkNFeGNlcHRpb25EaXZpZGVCeVplcm8JCQkJCQkJCQkgICAgICAgICAgMzINCi0jZGVmaW5lIEJDRXhjZXB0aW9uQ29lZmZpY2llbnRzU2l6ZUlzTnVsbAkJCQkJCSAgICAgICAgICAzMw0KLSNkZWZpbmUgQkNFeGNlcHRpb25Ob0NvcnJlY3Rpb25CeXRlcwkJCQkJCQkgICAgICAgICAgMzQNCi0jZGVmaW5lIEJDRXhjZXB0aW9uTm9EYXRhQnl0ZXNQcm92aWRlZAkJCQkJCSAgICAgICAgICAgICAgMzUNCi0jZGVmaW5lIEJDRXhjZXB0aW9uUl9JXzFJc1plcm8JCQkJCQkJCQkgICAgICAgICAgMzYNCi0jZGVmaW5lIEJDRXhjZXB0aW9uQUlzWmVybwkJCQkJCQkJCQkgICAgICAgICAgMzcNCi0jZGVmaW5lIEJDRXhjZXB0aW9uSXNaZXJvCQkJCQkJCQkJCSAgICAgICAgICAzOA0KLSNkZWZpbmUgQkNFeGNlcHRpb25EZWdyZWVOb3RNYXRjaFJvb3RzCQkJCQkgICAgICAgICAgICAgICAgICAzOQ0KLSNkZWZpbmUJQkNFeGNlcHRpb25Db250ZW50c0xlbmd0aFNob3VsZEJldHdlZW4xYW5kODAJICAgICAgICAgICAgICAgICAgNDANCi0jZGVmaW5lCUJDRXhjZXB0aW9uT25seUVuY29kZUNPREVfMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxDQotI2RlZmluZQlCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVDT0RFXzM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mg0KLSNkZWZpbmUJQkNFeGNlcHRpb25Pbmx5RW5jb2RlRUFOXzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMNCi0jZGVmaW5lCUJDRXhjZXB0aW9uT25seUVuY29kZUVBTl84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0DQotI2RlZmluZQlCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVJVEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NQ0KLSNkZWZpbmUJQkNFeGNlcHRpb25EaWdpdExlbmd0aFNob3VsZDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYNCi0jZGVmaW5lCUJDRXhjZXB0aW9uRGlnaXRMZW5ndGhNdXN0QmU2b3I4b3IxMG9yMTJvcjE0b3IxNm9yMjBvcjI0b3I0NCAgICAgIDQ3DQotI2RlZmluZQlCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVVUENfQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OA0KLSNkZWZpbmUgQkNFeGNlcHRpb25EaWdpdExlbmd0aFNob3VsZEJlMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDkNCi0jZGVmaW5lIEJDRXhjZXB0aW9uVmFsdWVNdXN0QmVFaXRoZXIwb3IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwDQotI2RlZmluZSBCQ0V4Y2VwdGlvblJlZWRzb2xvbW5EZWNvZGVFeGNlcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MQ0KLSNkZWZpbmUgQkNFeGNlcHRpb25CYWRJbmRleEV4Y2VwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTINCi0jZGVmaW5lIEJDRXhjZXB0aW9uQmFkVmFsdWVFeGNlcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzDQotI2RlZmluZSBCQ0V4Y2VwdGlvbkJhZE51bUJpdHNFeGNlcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NA0KLSNkZWZpbmUgQkNFeGNlcHRpb25jYW5Ob3RPcGVyYXRleG9yT3BlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUNCi0jZGVmaW5lIEJDRXhjZXB0aW9uVmVyc2lvbk11c3QxXzQwCQkJCQkJCQkJCSAgNTYNCi0jZGVmaW5lIEJDRXhjZXB0aW9uVW5rbm93bgkJCQkJCQkJCQkJCSAgNTcNCi0jZGVmaW5lIEJDRXhjZXB0aW9uTm9TdWNoVmVyc2lvbgkJCQkJCSAgICAJCSAgICAgIDU4DQotI2RlZmluZSBCQ0V4Y2VwdGlvbkNhbm5vdEZpbmRCbG9ja0luZm8JCQkJCQkJCQkgIDU5DQotI2RlZmluZSBCQ0V4Y2VwdGlvbkRhdGFUb29CaWcJCQkJCQkJICAgICAgICAgCQkgIDYwDQotI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRRUkNvZGUJCQkJCQkJCQkJICA2MQ0KLSNkZWZpbmUgQkNFeGNlcHRpb25EYXRhVG9vTWFueQkJCQkJCQkJCQkJICA2Mg0KLSNkZWZpbmUgQkNFeGNlcHRpb25CaXRzTm90RXF1YWxDYWNpdHkJCQkJCQkJCSAgICAgIDYzDQotI2RlZmluZSBCQ0V4Y2VwdGlvblVuc3VwcG9ydGVkTW9kZQkJCQkJCQkJCQkgIDY0DQotI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVDaGFyYWN0ZXIJCQkJCSAgICAgICAgICAgICAgICAgIDY1DQotI2RlZmluZSBCQ0V4Y2VwdGlvbkJ5dGVzTm90TWF0Y2hPZmZzZXQJCQkJCQkJCSAgICAgIDY2DQotI2RlZmluZSBCQ0V4Y2VwdGlvblNpemVJbkJ5dGVzRGlmZmVyCQkJICAgICAgIAkJCQkJICA2Nw0KLSNkZWZpbmUgQkNFeGNlcHRpb25JbnZhbGlkYXRlTWFza1BhdHRlcm4JCQkJCQkJCSAgNjgNCi0jZGVmaW5lIEJDRXhjZXB0aW9uTnVsbFBvaW50ZXIgCQkJCQkJCQkJCQkgIDY5DQotI2RlZmluZSBCQ0V4Y2VwdGlvbkJhZE1hc2sgCQkJCQkJCQkJCQkgICAgICA3MA0KLSNkZWZpbmUgQkNFeGNlcHRpb25CaXRTaXplTm90MTUJCQkJCQkJCQkJICAgICAgNzENCi0jZGVmaW5lIEJDRXhjZXB0aW9uQml0U2l6ZU5vdDE4CQkJCQkJCQkJCQkgIDcyDQotI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVJbWFnZURhdGEJCQkJCQkJCQkgIDczDQotI2RlZmluZSBCQ0V4Y2VwdGlvbkhlaWdodF84QmVaZXJvCQkJCQkJCQkJCSAgNzQNCi0jZGVmaW5lIEJDRXhjZXB0aW9uQ2hhcmFjdGVyTm90VGhpc01vZGUJCQkJCQkJCQkgIDc1DQotI2RlZmluZSBCQ0V4Y2VwdGlvbkJpdHNCeXRlc05vdE1hdGNoCQkJCQkJCQkJICA3Ng0KLSNkZWZpbmUgQkNFeGNlcHRpb25JbnZhbGlkYXRlRGF0YQkJCQkJCQkJCQkgIDc3DQotI2RlZmluZSBCQ0V4Y2VwdGlvbkxvYWRGaWxlCQkJCQkJCQkJCQkJICA3OA0KLSNkZWZpbmUgQkNFeGNlcHRpb25QREY0MTdFbmNvZGVGYWlsCQkJCQkJCQkgICAgICAgICAgNzkNCi0jZGVmaW5lIEJDRXhjZXB0aW9uRmFpbFRvQ3JlYXRlQml0bWFwCQkJCQkJCQkJICA4MA0KLSNkZWZpbmUgQkNFeGNlcHRpb25Mb2FkRm9udEZhaWwJCQkJCQkJCQkJCSAgODENCi0jZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZUNPREVCQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgyDQotI2RlZmluZSBCQ0V4Y2VwdGlvbkNvZGFiYXJTaG91bGRTdGFydFdpdGhPbmVPZkFCQ0QgICAgICAgICAgICAgICAgICAgICAgICA4Mw0KLSNkZWZpbmUgQkNFeGNlcHRpb25Db2RhYmFyU2hvdWxkRW5kV2l0aE9uZU9mVE5FICAgICAgICAgICAgICAgICAgICAgICAgICAgODQNCi0jZGVmaW5lIEJDRXhjZXB0aW9uQ29kYWJhckVuY29kZUNoYXJzSW52YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg1DQotI2RlZmluZSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVEQVRBTUFUUklYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Ng0KLSNkZWZpbmUgQkNFeGNlcHRpb25DaGFyYWN0ZXJzT3V0c2lkZUlTTzg4NTkxRW5jb2RpbmcgICAgICAgICAgICAgICAgICAgICAgODcNCi0jZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbERhdGFDb2Rld29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4DQotI2RlZmluZSBCQ0V4Y2VwdGlvbkNhbm5vdEhhbmRsZVRoaXNOdW1iZXJPZkRhdGFSZWdpb25zICAgICAgICAgICAgICAgICAgICA4OQ0KLSNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVVbmV4cGVjdGVkQ2FzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTANCi0jZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlQ291bnRNdXN0Tm90RXhjZWVkNCAgICAgICAgICAgICAgICAgICAgICAgIDkxDQotI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZU1lc3NhZ2VMZW5ndGhJbnZhbGlkICAgICAgICAgICAgICAgICAgICAgICA5Mg0KLSNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnROb3RHaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTMNCi0jZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlSWxsZWdhbE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk0DQotI2RlZmluZQlCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVQREY0MTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NQ0KLSNkZWZpbmUJQkNFeGNlcHRpb25Ob25FbmNvZGFibGVDaGFyYWN0ZXJEZXRlY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgOTYNCi0jZGVmaW5lCUJDRXhjZXB0aW9uRXJyb3JDb3JyZWN0aW9uTGV2ZWxNdXN0QmVCZXR3ZWVuMEFuZDggICAgICAgICAgICAgICAgIDk3DQotI2RlZmluZQlCQ0V4Y2VwdGlvbk5vUmVjb21tZW5kYXRpb25Qb3NzaWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OA0KLSNkZWZpbmUJQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnRuTXVzdEJlQWJvdmUwICAgICAgICAgICAgICAgICAgICAgICAgICAgOTkNCi0jZGVmaW5lCUJDRXhjZXB0aW9uVW5hYmxlVG9GaXRNZXNzYWdlSW5Db2x1bW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMA0KLSNkZWZpbmUJQkNFeGNlcHRpb25FbmNvZGVkTWVzc2FnZUNvbnRhaW5zVG9vTWFueUNvZGVXb3JkcyAgICAgICAgICAgICAgICAgMTAxDQotI2RlZmluZSBCQ0V4Y2VwdGlvbkJpdG1hcFNpemVFcnJvcgkJCQkJCQkJCQkgIDEwMg0KLSNkZWZpbmUgQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyDQotI2RlZmluZSBCQ0V4Y2VwdGlvbkNoZWNrc3VtSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDMNCi0jZGVmaW5lIEJDRXhjZXB0aW9udE5vdEZvdW5kSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNA0KLSNkZWZpbmUgQkNFeGNlcHRpb25Ob3RGb3VuZEluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA1DQotI2RlZmluZSBCQ0V4Y2VwdGlvbkNhbm5vdE1ldGFkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDYNCi0jZGVmaW5lIFRXT19ESUdJVF9EQVRBX0xFTkdUSF9TSVpFCQkJCQkyNA0KLSNkZWZpbmUgVEhSRUVfRElHSVRfREFUQV9MRU5HVEhfU0laRQkJCQkyMw0KLSNkZWZpbmUgVEhSRUVfRElHSVRfUExVU19ESUdJVF9EQVRBX0xFTkdUSF9TSVpFCQk1Nw0KLSNkZWZpbmUgRk9VUl9ESUdJVF9EQVRBX0xFTkdUSF9TSVpFCQkJCQkxNw0KLSNkZWZpbmUgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgcmV0dXJuOw0KLSNkZWZpbmUgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIHYpIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHJldHVybiB2Ow0KKyNkZWZpbmUgQkNFeGNlcHRpb25OTyAwDQorI2RlZmluZSBCQ0V4Y2VwdGlvbk5vdEZvdW5kIDENCisjZGVmaW5lIEJDRXhjZXB0aW9uRW5kTGVzc1RoYW5TdGFydCAyDQorI2RlZmluZSBCQ0V4Y2VwdGlvblVua25vd25EZWNvZGVyIDMNCisjZGVmaW5lIEJDRXhjZXB0aW9uUm90YXRlTm90U3VwcG9ydGVkIDQNCisjZGVmaW5lIEJDRXhjZXB0aW9uSGVpZ2h0QW5kV2lkdGhNdXN0QmVBdExlYXN0MSA1DQorI2RlZmluZSBCQ0V4Y2VwdGlvblJlZ2lvbk11c3RGaXRJbnNpZGVNYXRyaXggNg0KKyNkZWZpbmUgQkNFeGNlcHRpb25DYW5Ob3RDYWxsR2V0RGltZW5zaW9uT25Ob25TcXVhcmVNYXRyaXggNw0KKyNkZWZpbmUgQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb24gOA0KKyNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnRNdXN0TWF0Y2hWZXJzaW9uU2l6ZSA5DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uIDEwDQorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudEludmFsaWRGaXJzdERpZ2l0IDExDQorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudEludmFsaWRTZWNvbmREaWdpdCAxMg0KKyNkZWZpbmUgQkNFeGNlcHRpb25SdW50aW1lRGVjb2RpbmdJbnZhbGlkSVNPX0lFQyAxMw0KKyNkZWZpbmUgQkNFeGNlcHRpb25SdW50aW1lRGVjb2RpbmdJbnZhbGlkQWxwaGFudW1lcmljIDE0DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkxlZnRBbmRUb3BNdXN0QmVOb25uZWdhdGl2ZSAxNQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQgMTYNCisjZGVmaW5lIEJDRXhjZXB0aW9uQmFkRUNJIDE3DQorI2RlZmluZSBCQ0V4Y2VwdGlvblVuU3VwcG9ydGVkQmFyY29kZSAxOA0KKyNkZWZpbmUgQkNFeGNlcHRpb25VblN1cHBvcnRlZFN0cmluZyAxOQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25EaWdpdExlbmd0aE11c3RCZTggMjANCisjZGVmaW5lIEJDRXhjZXB0aW9uRGF0YUNoZWNrRXhjZXB0aW9uIDIxDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkV4dHJhY3ROdW1iZXJWYWx1ZUZyb21CaXRBcnJheSAyMg0KKyNkZWZpbmUgQkNFeGNlcHRpb25SZWFkIDIzDQorI2RlZmluZSBCQ0V4Y2VwdGlvblJlcXVlc3RlZFJvd0lzT3V0U2l6ZVRoZUltYWdlIDI0DQorI2RlZmluZSBCQ0V4Y2VwdGlvbk5vQ29udGVudHMgMjYNCisjZGVmaW5lIEJDRXhjZXB0aW9uVW5TdXBwb3J0RWNsZXZlbCAyNw0KKyNkZWZpbmUgQkNFeGNlcHRpb25VblN1cHBvcnRNb2RlIDI4DQorI2RlZmluZSBCQ0V4Y2VwdGlvblJlZmVyZW5jZU11c3RCZUJldHdlZW4wQW5kNyAyOQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25CYWRFcnJvckxvY2F0aW9uIDMwDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkRlZ3JlZUlzTmVnYXRpdmUgMzENCisjZGVmaW5lIEJDRXhjZXB0aW9uRGl2aWRlQnlaZXJvIDMyDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNvZWZmaWNpZW50c1NpemVJc051bGwgMzMNCisjZGVmaW5lIEJDRXhjZXB0aW9uTm9Db3JyZWN0aW9uQnl0ZXMgMzQNCisjZGVmaW5lIEJDRXhjZXB0aW9uTm9EYXRhQnl0ZXNQcm92aWRlZCAzNQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25SX0lfMUlzWmVybyAzNg0KKyNkZWZpbmUgQkNFeGNlcHRpb25BSXNaZXJvIDM3DQorI2RlZmluZSBCQ0V4Y2VwdGlvbklzWmVybyAzOA0KKyNkZWZpbmUgQkNFeGNlcHRpb25EZWdyZWVOb3RNYXRjaFJvb3RzIDM5DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNvbnRlbnRzTGVuZ3RoU2hvdWxkQmV0d2VlbjFhbmQ4MCA0MA0KKyNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERV8xMjggNDENCisjZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZUNPREVfMzkgNDINCisjZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZUVBTl8xMyA0Mw0KKyNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlRUFOXzggNDQNCisjZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZUlURiA0NQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25EaWdpdExlbmd0aFNob3VsZDEzIDQ2DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoTXVzdEJlNm9yOG9yMTBvcjEyb3IxNG9yMTZvcjIwb3IyNG9yNDQgNDcNCisjZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZVVQQ19BIDQ4DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoU2hvdWxkQmUxMiA0OQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25WYWx1ZU11c3RCZUVpdGhlcjBvcjEgNTANCisjZGVmaW5lIEJDRXhjZXB0aW9uUmVlZHNvbG9tbkRlY29kZUV4Y2VwdGlvbiA1MQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25CYWRJbmRleEV4Y2VwdGlvbiA1Mg0KKyNkZWZpbmUgQkNFeGNlcHRpb25CYWRWYWx1ZUV4Y2VwdGlvbiA1Mw0KKyNkZWZpbmUgQkNFeGNlcHRpb25CYWROdW1CaXRzRXhjZXB0aW9uIDU0DQorI2RlZmluZSBCQ0V4Y2VwdGlvbmNhbk5vdE9wZXJhdGV4b3JPcGVyYXRvciA1NQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25WZXJzaW9uTXVzdDFfNDAgNTYNCisjZGVmaW5lIEJDRXhjZXB0aW9uVW5rbm93biA1Nw0KKyNkZWZpbmUgQkNFeGNlcHRpb25Ob1N1Y2hWZXJzaW9uIDU4DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNhbm5vdEZpbmRCbG9ja0luZm8gNTkNCisjZGVmaW5lIEJDRXhjZXB0aW9uRGF0YVRvb0JpZyA2MA0KKyNkZWZpbmUgQkNFeGNlcHRpb25JbnZhbGlkUVJDb2RlIDYxDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkRhdGFUb29NYW55IDYyDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJpdHNOb3RFcXVhbENhY2l0eSA2Mw0KKyNkZWZpbmUgQkNFeGNlcHRpb25VbnN1cHBvcnRlZE1vZGUgNjQNCisjZGVmaW5lIEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlciA2NQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25CeXRlc05vdE1hdGNoT2Zmc2V0IDY2DQorI2RlZmluZSBCQ0V4Y2VwdGlvblNpemVJbkJ5dGVzRGlmZmVyIDY3DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVNYXNrUGF0dGVybiA2OA0KKyNkZWZpbmUgQkNFeGNlcHRpb25OdWxsUG9pbnRlciA2OQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25CYWRNYXNrIDcwDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJpdFNpemVOb3QxNSA3MQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25CaXRTaXplTm90MTggNzINCisjZGVmaW5lIEJDRXhjZXB0aW9uSW52YWxpZGF0ZUltYWdlRGF0YSA3Mw0KKyNkZWZpbmUgQkNFeGNlcHRpb25IZWlnaHRfOEJlWmVybyA3NA0KKyNkZWZpbmUgQkNFeGNlcHRpb25DaGFyYWN0ZXJOb3RUaGlzTW9kZSA3NQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25CaXRzQnl0ZXNOb3RNYXRjaCA3Ng0KKyNkZWZpbmUgQkNFeGNlcHRpb25JbnZhbGlkYXRlRGF0YSA3Nw0KKyNkZWZpbmUgQkNFeGNlcHRpb25Mb2FkRmlsZSA3OA0KKyNkZWZpbmUgQkNFeGNlcHRpb25QREY0MTdFbmNvZGVGYWlsIDc5DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkZhaWxUb0NyZWF0ZUJpdG1hcCA4MA0KKyNkZWZpbmUgQkNFeGNlcHRpb25Mb2FkRm9udEZhaWwgODENCisjZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZUNPREVCQVIgODINCisjZGVmaW5lIEJDRXhjZXB0aW9uQ29kYWJhclNob3VsZFN0YXJ0V2l0aE9uZU9mQUJDRCA4Mw0KKyNkZWZpbmUgQkNFeGNlcHRpb25Db2RhYmFyU2hvdWxkRW5kV2l0aE9uZU9mVE5FIDg0DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNvZGFiYXJFbmNvZGVDaGFyc0ludmFsaWQgODUNCisjZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZURBVEFNQVRSSVggODYNCisjZGVmaW5lIEJDRXhjZXB0aW9uQ2hhcmFjdGVyc091dHNpZGVJU084ODU5MUVuY29kaW5nIDg3DQorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxEYXRhQ29kZXdvcmRzIDg4DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNhbm5vdEhhbmRsZVRoaXNOdW1iZXJPZkRhdGFSZWdpb25zIDg5DQorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZVVuZXhwZWN0ZWRDYXNlIDkwDQorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZUNvdW50TXVzdE5vdEV4Y2VlZDQgOTENCisjZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlTWVzc2FnZUxlbmd0aEludmFsaWQgOTINCisjZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Tm90R2lnaXRzIDkzDQorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZUlsbGVnYWxNb2RlIDk0DQorI2RlZmluZSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVQREY0MTcgOTUNCisjZGVmaW5lIEJDRXhjZXB0aW9uTm9uRW5jb2RhYmxlQ2hhcmFjdGVyRGV0ZWN0ZWQgOTYNCisjZGVmaW5lIEJDRXhjZXB0aW9uRXJyb3JDb3JyZWN0aW9uTGV2ZWxNdXN0QmVCZXR3ZWVuMEFuZDggOTcNCisjZGVmaW5lIEJDRXhjZXB0aW9uTm9SZWNvbW1lbmRhdGlvblBvc3NpYmxlIDk4DQorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudG5NdXN0QmVBYm92ZTAgOTkNCisjZGVmaW5lIEJDRXhjZXB0aW9uVW5hYmxlVG9GaXRNZXNzYWdlSW5Db2x1bW5zIDEwMA0KKyNkZWZpbmUgQkNFeGNlcHRpb25FbmNvZGVkTWVzc2FnZUNvbnRhaW5zVG9vTWFueUNvZGVXb3JkcyAxMDENCisjZGVmaW5lIEJDRXhjZXB0aW9uQml0bWFwU2l6ZUVycm9yIDEwMg0KKyNkZWZpbmUgQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZSAxMDINCisjZGVmaW5lIEJDRXhjZXB0aW9uQ2hlY2tzdW1JbnN0YW5jZSAxMDMNCisjZGVmaW5lIEJDRXhjZXB0aW9udE5vdEZvdW5kSW5zdGFuY2UgMTA0DQorI2RlZmluZSBCQ0V4Y2VwdGlvbk5vdEZvdW5kSW5zdGFuY2UgMTA1DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNhbm5vdE1ldGFkYXRhIDEwNg0KKyNkZWZpbmUgVFdPX0RJR0lUX0RBVEFfTEVOR1RIX1NJWkUgMjQNCisjZGVmaW5lIFRIUkVFX0RJR0lUX0RBVEFfTEVOR1RIX1NJWkUgMjMNCisjZGVmaW5lIFRIUkVFX0RJR0lUX1BMVVNfRElHSVRfREFUQV9MRU5HVEhfU0laRSA1Nw0KKyNkZWZpbmUgRk9VUl9ESUdJVF9EQVRBX0xFTkdUSF9TSVpFIDE3DQorI2RlZmluZSBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKSBcDQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSAgICAgICAgICAgICAgICBcDQorICAgIHJldHVybjsNCisjZGVmaW5lIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCB2KSBcDQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSAgICAgICAgICAgICAgICAgICAgXA0KKyAgICByZXR1cm4gdjsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfY2hlY2tzdW0uY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2NoZWNrc3VtLmNwcAppbmRleCAyMDU0NmRmLi5jNGYwZTE1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfY2hlY2tzdW0uY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9jaGVja3N1bS5jcHAKQEAgLTcsMTk3ICs3LDE5NCBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL2ZveGl0bGliLmgiDQogI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfY29tbW9uLmgiDQogI2luY2x1ZGUgInhmYV9jaGVja3N1bS5oIg0KLUNYRkFfU0FYUmVhZGVySGFuZGxlcjo6Q1hGQV9TQVhSZWFkZXJIYW5kbGVyKENYRkFfQ2hlY2tzdW1Db250ZXh0ICpwQ29udGV4dCkNCi0gICAgOiBtX3BDb250ZXh0KHBDb250ZXh0KQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcENvbnRleHQpOw0KK0NYRkFfU0FYUmVhZGVySGFuZGxlcjo6Q1hGQV9TQVhSZWFkZXJIYW5kbGVyKENYRkFfQ2hlY2tzdW1Db250ZXh0KiBwQ29udGV4dCkNCisgICAgOiBtX3BDb250ZXh0KHBDb250ZXh0KSB7DQorICBGWFNZU19hc3NlcnQobV9wQ29udGV4dCk7DQogfQ0KLUNYRkFfU0FYUmVhZGVySGFuZGxlcjo6fkNYRkFfU0FYUmVhZGVySGFuZGxlcigpDQotew0KK0NYRkFfU0FYUmVhZGVySGFuZGxlcjo6fkNYRkFfU0FYUmVhZGVySGFuZGxlcigpIHt9DQordm9pZCogQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjpPblRhZ0VudGVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUYWdOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXJ0UG9zKSB7DQorICBVcGRhdGVDaGVja3N1bShUUlVFKTsNCisgIGlmIChlVHlwZSAhPSBGWF9TQVhOT0RFX1RhZyAmJiBlVHlwZSAhPSBGWF9TQVhOT0RFX0luc3RydWN0aW9uKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgbV9TQVhDb250ZXh0Lm1fZU5vZGUgPSBlVHlwZTsNCisgIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZiA9IG1fU0FYQ29udGV4dC5tX1RleHRCdWY7DQorICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCI8Iik7DQorICBpZiAoZVR5cGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCI/Iik7DQorICB9DQorICB0ZXh0QnVmIDw8IGJzVGFnTmFtZTsNCisgIG1fU0FYQ29udGV4dC5tX2JzVGFnTmFtZSA9IGJzVGFnTmFtZTsNCisgIHJldHVybiAmbV9TQVhDb250ZXh0Ow0KIH0NCi12b2lkKiBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnRW50ZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RhZ05hbWUsIEZYX1NBWE5PREUgZVR5cGUsIEZYX0RXT1JEIGR3U3RhcnRQb3MpDQotew0KLSAgICBVcGRhdGVDaGVja3N1bShUUlVFKTsNCi0gICAgaWYgKGVUeXBlICE9IEZYX1NBWE5PREVfVGFnICYmIGVUeXBlICE9IEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24pIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIG1fU0FYQ29udGV4dC5tX2VOb2RlID0gZVR5cGU7DQotICAgIENGWF9CeXRlVGV4dEJ1ZiAmdGV4dEJ1ZiA9IG1fU0FYQ29udGV4dC5tX1RleHRCdWY7DQotICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIjwiKTsNCi0gICAgaWYgKGVUeXBlID09IEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24pIHsNCi0gICAgICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIj8iKTsNCi0gICAgfQ0KLSAgICB0ZXh0QnVmIDw8IGJzVGFnTmFtZTsNCi0gICAgbV9TQVhDb250ZXh0Lm1fYnNUYWdOYW1lID0gYnNUYWdOYW1lOw0KLSAgICByZXR1cm4gJm1fU0FYQ29udGV4dDsNCit2b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdBdHRyaWJ1dGUodm9pZCogcFRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0F0dHJpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVmFsdWUpIHsNCisgIGlmIChwVGFnID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmID0gKChDWEZBX1NBWENvbnRleHQqKXBUYWcpLT5tX1RleHRCdWY7DQorICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCIgIik7DQorICB0ZXh0QnVmIDw8IGJzQXR0cmk7DQorICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCI9XCIiKTsNCisgIHRleHRCdWYgPDwgYnNWYWx1ZTsNCisgIHRleHRCdWYgPDwgRlhfQlNUUkMoIlwiIik7DQogfQ0KLXZvaWQgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjpPblRhZ0F0dHJpYnV0ZSh2b2lkKiBwVGFnLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzQXR0cmksIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNWYWx1ZSkNCi17DQotICAgIGlmIChwVGFnID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfQnl0ZVRleHRCdWYgJnRleHRCdWYgPSAoKENYRkFfU0FYQ29udGV4dCopcFRhZyktPm1fVGV4dEJ1ZjsNCi0gICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiICIpOw0KLSAgICB0ZXh0QnVmIDw8IGJzQXR0cmk7DQotICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIj1cIiIpOw0KLSAgICB0ZXh0QnVmIDw8IGJzVmFsdWU7DQotICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIlwiIik7DQordm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnQnJlYWsodm9pZCogcFRhZykgew0KKyAgaWYgKHBUYWcgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYgPSAoKENYRkFfU0FYQ29udGV4dCopcFRhZyktPm1fVGV4dEJ1ZjsNCisgIHRleHRCdWYgPDwgRlhfQlNUUkMoIj4iKTsNCisgIFVwZGF0ZUNoZWNrc3VtKEZBTFNFKTsNCiB9DQotdm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnQnJlYWsodm9pZCogcFRhZykNCi17DQotICAgIGlmIChwVGFnID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfQnl0ZVRleHRCdWYgJnRleHRCdWYgPSAoKENYRkFfU0FYQ29udGV4dCopcFRhZyktPm1fVGV4dEJ1ZjsNCit2b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdEYXRhKHZvaWQqIHBUYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXJ0UG9zKSB7DQorICBpZiAocFRhZyA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZiA9ICgoQ1hGQV9TQVhDb250ZXh0KilwVGFnKS0+bV9UZXh0QnVmOw0KKyAgaWYgKGVUeXBlID09IEZYX1NBWE5PREVfQ2hhckRhdGEpIHsNCisgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPCFbQ0RBVEFbIik7DQorICB9DQorICB0ZXh0QnVmIDw8IGJzRGF0YTsNCisgIGlmIChlVHlwZSA9PSBGWF9TQVhOT0RFX0NoYXJEYXRhKSB7DQorICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIl1dPiIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdDbG9zZSh2b2lkKiBwVGFnLCBGWF9EV09SRCBkd0VuZFBvcykgew0KKyAgaWYgKHBUYWcgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX1NBWENvbnRleHQqIHBTQVhDb250ZXh0ID0gKENYRkFfU0FYQ29udGV4dCopcFRhZzsNCisgIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZiA9IHBTQVhDb250ZXh0LT5tX1RleHRCdWY7DQorICBpZiAocFNBWENvbnRleHQtPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCI/PiIpOw0KKyAgfSBlbHNlIGlmIChwU0FYQ29udGV4dC0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZykgew0KKyAgICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCI+PC8iKTsNCisgICAgdGV4dEJ1ZiA8PCBwU0FYQ29udGV4dC0+bV9ic1RhZ05hbWU7DQogICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIj4iKTsNCi0gICAgVXBkYXRlQ2hlY2tzdW0oRkFMU0UpOw0KKyAgfQ0KKyAgVXBkYXRlQ2hlY2tzdW0oRkFMU0UpOw0KIH0NCi12b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdEYXRhKHZvaWQqIHBUYWcsIEZYX1NBWE5PREUgZVR5cGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEYXRhLCBGWF9EV09SRCBkd1N0YXJ0UG9zKQ0KLXsNCi0gICAgaWYgKHBUYWcgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9CeXRlVGV4dEJ1ZiAmdGV4dEJ1ZiA9ICgoQ1hGQV9TQVhDb250ZXh0KilwVGFnKS0+bV9UZXh0QnVmOw0KLSAgICBpZiAoZVR5cGUgPT0gRlhfU0FYTk9ERV9DaGFyRGF0YSkgew0KLSAgICAgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPCFbQ0RBVEFbIik7DQotICAgIH0NCit2b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdFbmQodm9pZCogcFRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RhZ05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RW5kUG9zKSB7DQorICBpZiAocFRhZyA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZiA9ICgoQ1hGQV9TQVhDb250ZXh0KilwVGFnKS0+bV9UZXh0QnVmOw0KKyAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPC8iKTsNCisgIHRleHRCdWYgPDwgYnNUYWdOYW1lOw0KKyAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPiIpOw0KKyAgVXBkYXRlQ2hlY2tzdW0oRkFMU0UpOw0KK30NCit2b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYXJnZXREYXRhKHZvaWQqIHBUYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXJ0UG9zKSB7DQorICBpZiAocFRhZyA9PSBOVUxMICYmIGVUeXBlICE9IEZYX1NBWE5PREVfQ29tbWVudCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoZVR5cGUgPT0gRlhfU0FYTk9ERV9Db21tZW50KSB7DQorICAgIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZiA9IG1fU0FYQ29udGV4dC5tX1RleHRCdWY7DQorICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIjwhLS0iKTsNCiAgICAgdGV4dEJ1ZiA8PCBic0RhdGE7DQotICAgIGlmIChlVHlwZSA9PSBGWF9TQVhOT0RFX0NoYXJEYXRhKSB7DQotICAgICAgICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCJdXT4iKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdDbG9zZSh2b2lkKiBwVGFnLCBGWF9EV09SRCBkd0VuZFBvcykNCi17DQotICAgIGlmIChwVGFnID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX1NBWENvbnRleHQgKnBTQVhDb250ZXh0ID0gKENYRkFfU0FYQ29udGV4dCopcFRhZzsNCi0gICAgQ0ZYX0J5dGVUZXh0QnVmICZ0ZXh0QnVmID0gcFNBWENvbnRleHQtPm1fVGV4dEJ1ZjsNCi0gICAgaWYgKHBTQVhDb250ZXh0LT5tX2VOb2RlID09IEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24pIHsNCi0gICAgICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIj8+Iik7DQotICAgIH0gZWxzZSBpZiAocFNBWENvbnRleHQtPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9UYWcpIHsNCi0gICAgICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIj48LyIpOw0KLSAgICAgICAgdGV4dEJ1ZiA8PCBwU0FYQ29udGV4dC0+bV9ic1RhZ05hbWU7DQotICAgICAgICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCI+Iik7DQotICAgIH0NCisgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiLS0+Iik7DQogICAgIFVwZGF0ZUNoZWNrc3VtKEZBTFNFKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZiA9ICgoQ1hGQV9TQVhDb250ZXh0KilwVGFnKS0+bV9UZXh0QnVmOw0KKyAgICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCIgIik7DQorICAgIHRleHRCdWYgPDwgYnNEYXRhOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdFbmQodm9pZCogcFRhZywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RhZ05hbWUsIEZYX0RXT1JEIGR3RW5kUG9zKQ0KLXsNCi0gICAgaWYgKHBUYWcgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KK3ZvaWQgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjpVcGRhdGVDaGVja3N1bShGWF9CT09MIGJDaGVja1NwYWNlKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBtX1NBWENvbnRleHQubV9UZXh0QnVmLkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHVpbnQ4X3QqIHBCdWZmZXIgPSBtX1NBWENvbnRleHQubV9UZXh0QnVmLkdldEJ1ZmZlcigpOw0KKyAgRlhfQk9PTCBiVXBkYXRhID0gVFJVRTsNCisgIGlmIChiQ2hlY2tTcGFjZSkgew0KKyAgICBiVXBkYXRhID0gRkFMU0U7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICAgIGJVcGRhdGEgPSAocEJ1ZmZlcltpXSA+IDB4MjApOw0KKyAgICAgIGlmIChiVXBkYXRhKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQogICAgIH0NCi0gICAgQ0ZYX0J5dGVUZXh0QnVmICZ0ZXh0QnVmID0gKChDWEZBX1NBWENvbnRleHQqKXBUYWcpLT5tX1RleHRCdWY7DQotICAgIHRleHRCdWYgPDwgRlhfQlNUUkMoIjwvIik7DQotICAgIHRleHRCdWYgPDwgYnNUYWdOYW1lOw0KLSAgICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCI+Iik7DQotICAgIFVwZGF0ZUNoZWNrc3VtKEZBTFNFKTsNCisgIH0NCisgIGlmIChiVXBkYXRhKSB7DQorICAgIG1fcENvbnRleHQtPlVwZGF0ZShDRlhfQnl0ZVN0cmluZ0MocEJ1ZmZlciwgaUxlbmd0aCkpOw0KKyAgfQ0KKyAgbV9TQVhDb250ZXh0Lm1fVGV4dEJ1Zi5DbGVhcigpOw0KIH0NCi12b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYXJnZXREYXRhKHZvaWQqIHBUYWcsIEZYX1NBWE5PREUgZVR5cGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEYXRhLCBGWF9EV09SRCBkd1N0YXJ0UG9zKQ0KLXsNCi0gICAgaWYgKHBUYWcgPT0gTlVMTCAmJiBlVHlwZSAhPSBGWF9TQVhOT0RFX0NvbW1lbnQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoZVR5cGUgPT0gRlhfU0FYTk9ERV9Db21tZW50KSB7DQotICAgICAgICBDRlhfQnl0ZVRleHRCdWYgJnRleHRCdWYgPSBtX1NBWENvbnRleHQubV9UZXh0QnVmOw0KLSAgICAgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiPCEtLSIpOw0KLSAgICAgICAgdGV4dEJ1ZiA8PCBic0RhdGE7DQotICAgICAgICB0ZXh0QnVmIDw8IEZYX0JTVFJDKCItLT4iKTsNCi0gICAgICAgIFVwZGF0ZUNoZWNrc3VtKEZBTFNFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9CeXRlVGV4dEJ1ZiAmdGV4dEJ1ZiA9ICgoQ1hGQV9TQVhDb250ZXh0KilwVGFnKS0+bV9UZXh0QnVmOw0KLSAgICAgICAgdGV4dEJ1ZiA8PCBGWF9CU1RSQygiICIpOw0KLSAgICAgICAgdGV4dEJ1ZiA8PCBic0RhdGE7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6OlVwZGF0ZUNoZWNrc3VtKEZYX0JPT0wgYkNoZWNrU3BhY2UpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBtX1NBWENvbnRleHQubV9UZXh0QnVmLkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCA8IDEpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICB1aW50OF90KiBwQnVmZmVyID0gbV9TQVhDb250ZXh0Lm1fVGV4dEJ1Zi5HZXRCdWZmZXIoKTsNCi0gICAgRlhfQk9PTCBiVXBkYXRhID0gVFJVRTsNCi0gICAgaWYgKGJDaGVja1NwYWNlKSB7DQotICAgICAgICBiVXBkYXRhID0gRkFMU0U7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBiVXBkYXRhID0gKHBCdWZmZXJbaV0gPiAweDIwKTsNCi0gICAgICAgICAgICBpZiAoYlVwZGF0YSkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGJVcGRhdGEpIHsNCi0gICAgICAgIG1fcENvbnRleHQtPlVwZGF0ZShDRlhfQnl0ZVN0cmluZ0MocEJ1ZmZlciwgaUxlbmd0aCkpOw0KLSAgICB9DQotICAgIG1fU0FYQ29udGV4dC5tX1RleHRCdWYuQ2xlYXIoKTsNCi19DQotSVhGQV9DaGVja3N1bUNvbnRleHQqIFhGQV9DaGVja3N1bV9DcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDWEZBX0NoZWNrc3VtQ29udGV4dDsNCitJWEZBX0NoZWNrc3VtQ29udGV4dCogWEZBX0NoZWNrc3VtX0NyZWF0ZSgpIHsNCisgIHJldHVybiBGWF9ORVcgQ1hGQV9DaGVja3N1bUNvbnRleHQ7DQogfQ0KIENYRkFfQ2hlY2tzdW1Db250ZXh0OjpDWEZBX0NoZWNrc3VtQ29udGV4dCgpDQotICAgIDogbV9wU0FYUmVhZGVyKE5VTEwpDQotICAgICwgbV9wQnl0ZUNvbnRleHQoTlVMTCkNCi17DQorICAgIDogbV9wU0FYUmVhZGVyKE5VTEwpLCBtX3BCeXRlQ29udGV4dChOVUxMKSB7fQ0KK0NYRkFfQ2hlY2tzdW1Db250ZXh0Ojp+Q1hGQV9DaGVja3N1bUNvbnRleHQoKSB7DQorICBGaW5pc2hDaGVja3N1bSgpOw0KIH0NCi1DWEZBX0NoZWNrc3VtQ29udGV4dDo6fkNYRkFfQ2hlY2tzdW1Db250ZXh0KCkNCi17DQotICAgIEZpbmlzaENoZWNrc3VtKCk7DQorRlhfQk9PTCBDWEZBX0NoZWNrc3VtQ29udGV4dDo6U3RhcnRDaGVja3N1bSgpIHsNCisgIEZpbmlzaENoZWNrc3VtKCk7DQorICBtX3BCeXRlQ29udGV4dCA9IEZYX0FsbG9jKHVpbnQ4X3QsIDEyOCk7DQorICBGWFNZU19hc3NlcnQobV9wQnl0ZUNvbnRleHQgIT0gTlVMTCk7DQorICBDUllQVF9TSEExU3RhcnQobV9wQnl0ZUNvbnRleHQpOw0KKyAgbV9ic0NoZWNrc3VtLkVtcHR5KCk7DQorICBtX3BTQVhSZWFkZXIgPSBGWF9TQVhSZWFkZXJfQ3JlYXRlKCk7DQorICByZXR1cm4gbV9wU0FYUmVhZGVyICE9IE5VTEw7DQogfQ0KLUZYX0JPT0wgQ1hGQV9DaGVja3N1bUNvbnRleHQ6OlN0YXJ0Q2hlY2tzdW0oKQ0KLXsNCi0gICAgRmluaXNoQ2hlY2tzdW0oKTsNCi0gICAgbV9wQnl0ZUNvbnRleHQgPSBGWF9BbGxvYyh1aW50OF90LCAxMjgpOw0KLSAgICBGWFNZU19hc3NlcnQobV9wQnl0ZUNvbnRleHQgIT0gTlVMTCk7DQotICAgIENSWVBUX1NIQTFTdGFydChtX3BCeXRlQ29udGV4dCk7DQotICAgIG1fYnNDaGVja3N1bS5FbXB0eSgpOw0KLSAgICBtX3BTQVhSZWFkZXIgPSBGWF9TQVhSZWFkZXJfQ3JlYXRlKCk7DQotICAgIHJldHVybiBtX3BTQVhSZWFkZXIgIT0gTlVMTDsNCitGWF9CT09MIENYRkFfQ2hlY2tzdW1Db250ZXh0OjpVcGRhdGVDaGVja3N1bShJRlhfRmlsZVJlYWQqIHBTcmNGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgew0KKyAgaWYgKG1fcFNBWFJlYWRlciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwU3JjRmlsZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChzaXplIDwgMSkgew0KKyAgICBzaXplID0gcFNyY0ZpbGUtPkdldFNpemUoKTsNCisgIH0NCisgIENYRkFfU0FYUmVhZGVySGFuZGxlciBoYW5kbGVyKHRoaXMpOw0KKyAgbV9wU0FYUmVhZGVyLT5TZXRIYW5kbGVyKCZoYW5kbGVyKTsNCisgIGlmIChtX3BTQVhSZWFkZXItPlN0YXJ0UGFyc2UoDQorICAgICAgICAgIHBTcmNGaWxlLCAoRlhfRFdPUkQpb2Zmc2V0LCAoRlhfRFdPUkQpc2l6ZSwNCisgICAgICAgICAgRlhfU0FYUEFSU0VNT0RFX05vdFNraXBTcGFjZSB8IEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2FtcCB8DQorICAgICAgICAgICAgICBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9sdCB8IEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2d0IHwNCisgICAgICAgICAgICAgIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X3NoYXJwKSA8IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcFNBWFJlYWRlci0+Q29udGludWVQYXJzZShOVUxMKSA+IDk5Ow0KIH0NCi1GWF9CT09MIENYRkFfQ2hlY2tzdW1Db250ZXh0OjpVcGRhdGVDaGVja3N1bShJRlhfRmlsZVJlYWQgKnBTcmNGaWxlLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQ0KLXsNCi0gICAgaWYgKG1fcFNBWFJlYWRlciA9PSBOVUxMKQl7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKHBTcmNGaWxlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoc2l6ZSA8IDEpIHsNCi0gICAgICAgIHNpemUgPSBwU3JjRmlsZS0+R2V0U2l6ZSgpOw0KLSAgICB9DQotICAgIENYRkFfU0FYUmVhZGVySGFuZGxlciBoYW5kbGVyKHRoaXMpOw0KLSAgICBtX3BTQVhSZWFkZXItPlNldEhhbmRsZXIoJmhhbmRsZXIpOw0KLSAgICBpZiAobV9wU0FYUmVhZGVyLT5TdGFydFBhcnNlKHBTcmNGaWxlLCAoRlhfRFdPUkQpb2Zmc2V0LCAoRlhfRFdPUkQpc2l6ZSwgRlhfU0FYUEFSU0VNT0RFX05vdFNraXBTcGFjZSB8IEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2FtcCB8IEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2x0IHwgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfZ3QgfCBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9zaGFycCkgPCAwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcFNBWFJlYWRlci0+Q29udGludWVQYXJzZShOVUxMKSA+IDk5Ow0KK3ZvaWQgQ1hGQV9DaGVja3N1bUNvbnRleHQ6OkZpbmlzaENoZWNrc3VtKCkgew0KKyAgaWYgKG1fcFNBWFJlYWRlciAhPSBOVUxMKSB7DQorICAgIG1fcFNBWFJlYWRlci0+UmVsZWFzZSgpOw0KKyAgICBtX3BTQVhSZWFkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEJ5dGVDb250ZXh0KSB7DQorICAgIHVpbnQ4X3QgZGlnZXN0WzIwXTsNCisgICAgRlhTWVNfbWVtc2V0KGRpZ2VzdCwgMCwgMjApOw0KKyAgICBDUllQVF9TSEExRmluaXNoKG1fcEJ5dGVDb250ZXh0LCBkaWdlc3QpOw0KKyAgICBpbnQzMl90IG5MZW4gPSBGWF9CYXNlNjRFbmNvZGVBKGRpZ2VzdCwgMjAsIE5VTEwpOw0KKyAgICBGWF9DSEFSKiBwQnVmZmVyID0gbV9ic0NoZWNrc3VtLkdldEJ1ZmZlcihuTGVuKTsNCisgICAgRlhfQmFzZTY0RW5jb2RlQShkaWdlc3QsIDIwLCBwQnVmZmVyKTsNCisgICAgbV9ic0NoZWNrc3VtLlJlbGVhc2VCdWZmZXIobkxlbik7DQorICAgIEZYX0ZyZWUobV9wQnl0ZUNvbnRleHQpOw0KKyAgICBtX3BCeXRlQ29udGV4dCA9IE5VTEw7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9DaGVja3N1bUNvbnRleHQ6OkZpbmlzaENoZWNrc3VtKCkNCi17DQotICAgIGlmIChtX3BTQVhSZWFkZXIgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wU0FYUmVhZGVyLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BTQVhSZWFkZXIgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3BCeXRlQ29udGV4dCkgew0KLSAgICAgICAgdWludDhfdCBkaWdlc3RbMjBdOw0KLSAgICAgICAgRlhTWVNfbWVtc2V0KGRpZ2VzdCwgMCwgMjApOw0KLSAgICAgICAgQ1JZUFRfU0hBMUZpbmlzaChtX3BCeXRlQ29udGV4dCwgZGlnZXN0KTsNCi0gICAgICAgIGludDMyX3QgbkxlbiA9IEZYX0Jhc2U2NEVuY29kZUEoZGlnZXN0LCAyMCwgTlVMTCk7DQotICAgICAgICBGWF9DSEFSKiBwQnVmZmVyID0gbV9ic0NoZWNrc3VtLkdldEJ1ZmZlcihuTGVuKTsNCi0gICAgICAgIEZYX0Jhc2U2NEVuY29kZUEoZGlnZXN0LCAyMCwgcEJ1ZmZlcik7DQotICAgICAgICBtX2JzQ2hlY2tzdW0uUmVsZWFzZUJ1ZmZlcihuTGVuKTsNCi0gICAgICAgIEZYX0ZyZWUobV9wQnl0ZUNvbnRleHQpOw0KLSAgICAgICAgbV9wQnl0ZUNvbnRleHQgPSBOVUxMOw0KLSAgICB9DQordm9pZCBDWEZBX0NoZWNrc3VtQ29udGV4dDo6R2V0Q2hlY2tzdW0oQ0ZYX0J5dGVTdHJpbmcmIGJzQ2hlY2tzdW0pIHsNCisgIGJzQ2hlY2tzdW0gPSBtX2JzQ2hlY2tzdW07DQogfQ0KLXZvaWQgQ1hGQV9DaGVja3N1bUNvbnRleHQ6OkdldENoZWNrc3VtKENGWF9CeXRlU3RyaW5nICZic0NoZWNrc3VtKQ0KLXsNCi0gICAgYnNDaGVja3N1bSA9IG1fYnNDaGVja3N1bTsNCi19DQotdm9pZCBDWEZBX0NoZWNrc3VtQ29udGV4dDo6VXBkYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUZXh0KQ0KLXsNCi0gICAgaWYgKG1fcEJ5dGVDb250ZXh0ICE9IE5VTEwpIHsNCi0gICAgICAgIENSWVBUX1NIQTFVcGRhdGUobV9wQnl0ZUNvbnRleHQsIGJzVGV4dC5HZXRQdHIoKSwgYnNUZXh0LkdldExlbmd0aCgpKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9DaGVja3N1bUNvbnRleHQ6OlVwZGF0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGV4dCkgew0KKyAgaWYgKG1fcEJ5dGVDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgQ1JZUFRfU0hBMVVwZGF0ZShtX3BCeXRlQ29udGV4dCwgYnNUZXh0LkdldFB0cigpLCBic1RleHQuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfY2hlY2tzdW0uaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9jaGVja3N1bS5oCmluZGV4IDYyZTQzOWYuLjFkNGQ5NDMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9jaGVja3N1bS5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9jaGVja3N1bS5oCkBAIC00LDU1ICs0LDYzIEBACiANCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KIA0KLSNpZm5kZWYJX0ZYRkFfRk9STUZJTExFUl9DSEVDS1NVTV9JTVBfSA0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9DSEVDS1NVTV9JTVBfSA0KICNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9DSEVDS1NVTV9JTVBfSA0KIGNsYXNzIENYRkFfU0FYUmVhZGVySGFuZGxlcjsNCiBjbGFzcyBDWEZBX0NoZWNrc3VtQ29udGV4dDsNCi1jbGFzcyBDWEZBX1NBWENvbnRleHQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX1NBWENvbnRleHQoKSA6IG1fZU5vZGUoRlhfU0FYTk9ERV9Vbmtub3duKQ0KLSAgICB7DQotICAgIH0NCi0gICAgQ0ZYX0J5dGVUZXh0QnVmCQltX1RleHRCdWY7DQotICAgIENGWF9CeXRlU3RyaW5nCQltX2JzVGFnTmFtZTsNCi0gICAgRlhfU0FYTk9ERQkJCW1fZU5vZGU7DQorY2xhc3MgQ1hGQV9TQVhDb250ZXh0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9TQVhDb250ZXh0KCkgOiBtX2VOb2RlKEZYX1NBWE5PREVfVW5rbm93bikge30NCisgIENGWF9CeXRlVGV4dEJ1ZiBtX1RleHRCdWY7DQorICBDRlhfQnl0ZVN0cmluZyBtX2JzVGFnTmFtZTsNCisgIEZYX1NBWE5PREUgbV9lTm9kZTsNCiB9Ow0KLWNsYXNzIENYRkFfU0FYUmVhZGVySGFuZGxlciA6IHB1YmxpYyBJRlhfU0FYUmVhZGVySGFuZGxlcg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfU0FYUmVhZGVySGFuZGxlcihDWEZBX0NoZWNrc3VtQ29udGV4dCAqcENvbnRleHQpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX1NBWFJlYWRlckhhbmRsZXIoKTsNCi0gICAgdmlydHVhbCB2b2lkKglPblRhZ0VudGVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUYWdOYW1lLCBGWF9TQVhOT0RFIGVUeXBlLCBGWF9EV09SRCBkd1N0YXJ0UG9zKTsNCi0gICAgdmlydHVhbCB2b2lkCQlPblRhZ0F0dHJpYnV0ZSh2b2lkKiBwVGFnLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzQXR0cmksIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNWYWx1ZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJT25UYWdCcmVhayh2b2lkKiBwVGFnKTsNCi0gICAgdmlydHVhbCB2b2lkCQlPblRhZ0RhdGEodm9pZCogcFRhZywgRlhfU0FYTk9ERSBlVHlwZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RhdGEsIEZYX0RXT1JEIGR3U3RhcnRQb3MpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCU9uVGFnQ2xvc2Uodm9pZCogcFRhZywgRlhfRFdPUkQgZHdFbmRQb3MpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCU9uVGFnRW5kKHZvaWQqIHBUYWcsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUYWdOYW1lLCBGWF9EV09SRCBkd0VuZFBvcyk7DQorY2xhc3MgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyIDogcHVibGljIElGWF9TQVhSZWFkZXJIYW5kbGVyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyKENYRkFfQ2hlY2tzdW1Db250ZXh0KiBwQ29udGV4dCk7DQorICB2aXJ0dWFsIH5DWEZBX1NBWFJlYWRlckhhbmRsZXIoKTsNCisgIHZpcnR1YWwgdm9pZCogT25UYWdFbnRlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhcnRQb3MpOw0KKyAgdmlydHVhbCB2b2lkIE9uVGFnQXR0cmlidXRlKHZvaWQqIHBUYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0F0dHJpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNWYWx1ZSk7DQorICB2aXJ0dWFsIHZvaWQgT25UYWdCcmVhayh2b2lkKiBwVGFnKTsNCisgIHZpcnR1YWwgdm9pZCBPblRhZ0RhdGEodm9pZCogcFRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU0FYTk9ERSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhcnRQb3MpOw0KKyAgdmlydHVhbCB2b2lkIE9uVGFnQ2xvc2Uodm9pZCogcFRhZywgRlhfRFdPUkQgZHdFbmRQb3MpOw0KKyAgdmlydHVhbCB2b2lkIE9uVGFnRW5kKHZvaWQqIHBUYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RhZ05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdFbmRQb3MpOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCU9uVGFyZ2V0RGF0YSh2b2lkKiBwVGFnLCBGWF9TQVhOT0RFIGVUeXBlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRGF0YSwgRlhfRFdPUkQgZHdTdGFydFBvcyk7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQkJCVVwZGF0ZUNoZWNrc3VtKEZYX0JPT0wgYkNoZWNrU3BhY2UpOw0KLSAgICBDWEZBX0NoZWNrc3VtQ29udGV4dAkqbV9wQ29udGV4dDsNCi0gICAgQ1hGQV9TQVhDb250ZXh0CQkJbV9TQVhDb250ZXh0Ow0KKyAgdmlydHVhbCB2b2lkIE9uVGFyZ2V0RGF0YSh2b2lkKiBwVGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGFydFBvcyk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgVXBkYXRlQ2hlY2tzdW0oRlhfQk9PTCBiQ2hlY2tTcGFjZSk7DQorICBDWEZBX0NoZWNrc3VtQ29udGV4dCogbV9wQ29udGV4dDsNCisgIENYRkFfU0FYQ29udGV4dCBtX1NBWENvbnRleHQ7DQogfTsNCi1jbGFzcyBDWEZBX0NoZWNrc3VtQ29udGV4dCA6IHB1YmxpYyBJWEZBX0NoZWNrc3VtQ29udGV4dA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfQ2hlY2tzdW1Db250ZXh0KCk7DQotICAgIHZpcnR1YWwgfkNYRkFfQ2hlY2tzdW1Db250ZXh0KCk7DQotICAgIHZpcnR1YWwJdm9pZAkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU3RhcnRDaGVja3N1bSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVVwZGF0ZUNoZWNrc3VtKElGWF9GaWxlUmVhZCAqcFNyY0ZpbGUsIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gMCk7DQotICAgIHZpcnR1YWwgdm9pZAkJRmluaXNoQ2hlY2tzdW0oKTsNCi0gICAgdmlydHVhbCB2b2lkCQlHZXRDaGVja3N1bShDRlhfQnl0ZVN0cmluZyAmYnNDaGVja3N1bSk7DQotICAgIHZvaWQJCQkJVXBkYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUZXh0KTsNCi1wcm90ZWN0ZWQ6DQotICAgIElGWF9TQVhSZWFkZXIJCSptX3BTQVhSZWFkZXI7DQotICAgIHVpbnQ4X3QqCQkJbV9wQnl0ZUNvbnRleHQ7DQotICAgIENGWF9CeXRlU3RyaW5nCQltX2JzQ2hlY2tzdW07DQorY2xhc3MgQ1hGQV9DaGVja3N1bUNvbnRleHQgOiBwdWJsaWMgSVhGQV9DaGVja3N1bUNvbnRleHQgew0KKyBwdWJsaWM6DQorICBDWEZBX0NoZWNrc3VtQ29udGV4dCgpOw0KKyAgdmlydHVhbCB+Q1hGQV9DaGVja3N1bUNvbnRleHQoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIFN0YXJ0Q2hlY2tzdW0oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVcGRhdGVDaGVja3N1bShJRlhfRmlsZVJlYWQqIHBTcmNGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAwKTsNCisgIHZpcnR1YWwgdm9pZCBGaW5pc2hDaGVja3N1bSgpOw0KKyAgdmlydHVhbCB2b2lkIEdldENoZWNrc3VtKENGWF9CeXRlU3RyaW5nJiBic0NoZWNrc3VtKTsNCisgIHZvaWQgVXBkYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUZXh0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZYX1NBWFJlYWRlciogbV9wU0FYUmVhZGVyOw0KKyAgdWludDhfdCogbV9wQnl0ZUNvbnRleHQ7DQorICBDRlhfQnl0ZVN0cmluZyBtX2JzQ2hlY2tzdW07DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZDb25maWdBY2MuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmQ29uZmlnQWNjLmNwcAppbmRleCBhZDY4ODEyLi5kMTcyYjZiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZDb25maWdBY2MuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZkNvbmZpZ0FjYy5jcHAKQEAgLTcsNTkgKzcsNTUgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9mb3hpdGxpYi5oIg0KICNpbmNsdWRlICIuLi9jb21tb24veGZhX2NvbW1vbi5oIg0KICNpbmNsdWRlICJ4ZmFfZmZDb25maWdBY2MuaCINCi1DWEZBX0ZGQ29uZmlnQWNjOjpDWEZBX0ZGQ29uZmlnQWNjKENYRkFfTm9kZSAqcE5vZGUpDQotICAgIDogbV9wTm9kZShwTm9kZSkNCi0gICAgLCBtX3BQc01hcE5vZGUoTlVMTCkNCi17DQorQ1hGQV9GRkNvbmZpZ0FjYzo6Q1hGQV9GRkNvbmZpZ0FjYyhDWEZBX05vZGUqIHBOb2RlKQ0KKyAgICA6IG1fcE5vZGUocE5vZGUpLCBtX3BQc01hcE5vZGUoTlVMTCkge30NCitDWEZBX0ZGQ29uZmlnQWNjOjp+Q1hGQV9GRkNvbmZpZ0FjYygpIHt9DQoraW50MzJfdCBDWEZBX0ZGQ29uZmlnQWNjOjpDb3VudENoaWxkcmVuKCkgew0KKyAgR2V0UHNNYXBOb2RlKCk7DQorICBpZiAobV9wUHNNYXBOb2RlID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wUHNNYXBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICBmb3IgKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgaUNvdW50Kys7DQorICB9DQorICByZXR1cm4gaUNvdW50Ow0KIH0NCi1DWEZBX0ZGQ29uZmlnQWNjOjp+Q1hGQV9GRkNvbmZpZ0FjYygpDQotew0KK0ZYX0JPT0wgQ1hGQV9GRkNvbmZpZ0FjYzo6R2V0Rm9udEluZm8oaW50MzJfdCBpbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQc05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCb2xkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljKSB7DQorICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IENvdW50Q2hpbGRyZW4oKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBGb250Tm9kZSA9IG1fcFBzTWFwTm9kZS0+R2V0Q2hpbGQoaW5kZXgsIFhGQV9FTEVNRU5UX0ZvbnQpOw0KKyAgaWYgKHBGb250Tm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHdzRm9udEZhbWlseS5FbXB0eSgpOw0KKyAgd3NQc05hbWUuRW1wdHkoKTsNCisgIGJCb2xkID0gRkFMU0U7DQorICBiSXRhbGljID0gRkFMU0U7DQorICBwRm9udE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1R5cGVmYWNlLCB3c0ZvbnRGYW1pbHkpOw0KKyAgcEZvbnROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Qc05hbWUsIHdzUHNOYW1lKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBwRm9udE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1dlaWdodCwgd3NWYWx1ZSk7DQorICB3c1ZhbHVlLk1ha2VMb3dlcigpOw0KKyAgaWYgKHdzVmFsdWUgPT0gRlhfV1NUUkMoTCJib2xkIikpIHsNCisgICAgYkJvbGQgPSBUUlVFOw0KKyAgfQ0KKyAgcEZvbnROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Qb3N0dXJlLCB3c1ZhbHVlKTsNCisgIHdzVmFsdWUuTWFrZUxvd2VyKCk7DQorICBpZiAod3NWYWx1ZSA9PSBGWF9XU1RSQyhMIml0YWxpYyIpKSB7DQorICAgIGJJdGFsaWMgPSBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIHdzRm9udEZhbWlseS5HZXRMZW5ndGgoKSA+IDA7DQogfQ0KLWludDMyX3QgQ1hGQV9GRkNvbmZpZ0FjYzo6Q291bnRDaGlsZHJlbigpDQotew0KLSAgICBHZXRQc01hcE5vZGUoKTsNCi0gICAgaWYgKG1fcFBzTWFwTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BQc01hcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpQ291bnQrKzsNCi0gICAgfQ0KLSAgICByZXR1cm4gaUNvdW50Ow0KLX0NCi1GWF9CT09MIENYRkFfRkZDb25maWdBY2M6OkdldEZvbnRJbmZvKGludDMyX3QgaW5kZXgsIENGWF9XaWRlU3RyaW5nICZ3c0ZvbnRGYW1pbHksIENGWF9XaWRlU3RyaW5nICZ3c1BzTmFtZSwgRlhfQk9PTCBiQm9sZCwgRlhfQk9PTCBiSXRhbGljKQ0KLXsNCi0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBDb3VudENoaWxkcmVuKCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUgKnBGb250Tm9kZSA9IG1fcFBzTWFwTm9kZS0+R2V0Q2hpbGQoaW5kZXgsIFhGQV9FTEVNRU5UX0ZvbnQpOw0KLSAgICBpZiAocEZvbnROb2RlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB3c0ZvbnRGYW1pbHkuRW1wdHkoKTsNCi0gICAgd3NQc05hbWUuRW1wdHkoKTsNCi0gICAgYkJvbGQgID0gRkFMU0U7DQotICAgIGJJdGFsaWMgPSBGQUxTRTsNCi0gICAgcEZvbnROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwgd3NGb250RmFtaWx5KTsNCi0gICAgcEZvbnROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Qc05hbWUsIHdzUHNOYW1lKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCi0gICAgcEZvbnROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9XZWlnaHQsIHdzVmFsdWUpOw0KLSAgICB3c1ZhbHVlLk1ha2VMb3dlcigpOw0KLSAgICBpZiAod3NWYWx1ZSA9PSBGWF9XU1RSQyhMImJvbGQiKSkgew0KLSAgICAgICAgYkJvbGQgPSBUUlVFOw0KLSAgICB9DQotICAgIHBGb250Tm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfUG9zdHVyZSwgd3NWYWx1ZSk7DQotICAgIHdzVmFsdWUuTWFrZUxvd2VyKCk7DQotICAgIGlmICh3c1ZhbHVlID09IEZYX1dTVFJDKEwiaXRhbGljIikpIHsNCi0gICAgICAgIGJJdGFsaWMgPSBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiB3c0ZvbnRGYW1pbHkuR2V0TGVuZ3RoKCkgPiAwOw0KLX0NCi12b2lkIENYRkFfRkZDb25maWdBY2M6OkdldFBzTWFwTm9kZSgpDQotew0KLSAgICBpZiAobV9wTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgbV9wUHNNYXBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUHNNYXApOw0KK3ZvaWQgQ1hGQV9GRkNvbmZpZ0FjYzo6R2V0UHNNYXBOb2RlKCkgew0KKyAgaWYgKG1fcE5vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BQc01hcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Qc01hcCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZkNvbmZpZ0FjYy5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmQ29uZmlnQWNjLmgKaW5kZXggNWEyMWZkMy4uODBjN2NiNyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmQ29uZmlnQWNjLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmQ29uZmlnQWNjLmgKQEAgLTYsMTYgKzYsMjAgQEAKIA0KICNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUkNPTkZJR0FDQ19JTVBfSA0KICNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUkNPTkZJR0FDQ19JTVBfSA0KLWNsYXNzIENYRkFfRkZDb25maWdBY2MNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGQ29uZmlnQWNjKENYRkFfTm9kZSAqcE5vZGUpOw0KLSAgICB+Q1hGQV9GRkNvbmZpZ0FjYygpOw0KLSAgICBpbnQzMl90CQlDb3VudENoaWxkcmVuKCk7DQotICAgIEZYX0JPT0wJCQlHZXRGb250SW5mbyhpbnQzMl90IGluZGV4LCBDRlhfV2lkZVN0cmluZyAmd3NGb250RmFtaWx5LCBDRlhfV2lkZVN0cmluZyAmd3NQc05hbWUsIEZYX0JPT0wgYkJvbGQsIEZYX0JPT0wgYkl0YWxpYyk7DQotcHJpdmF0ZToNCi0gICAgdm9pZAkJCUdldFBzTWFwTm9kZSgpOw0KLSAgICBDWEZBX05vZGUJCSptX3BOb2RlOw0KLSAgICBDWEZBX05vZGUJCSptX3BQc01hcE5vZGU7DQorY2xhc3MgQ1hGQV9GRkNvbmZpZ0FjYyB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZDb25maWdBY2MoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB+Q1hGQV9GRkNvbmZpZ0FjYygpOw0KKyAgaW50MzJfdCBDb3VudENoaWxkcmVuKCk7DQorICBGWF9CT09MIEdldEZvbnRJbmZvKGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQm9sZCwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljKTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgR2V0UHNNYXBOb2RlKCk7DQorICBDWEZBX05vZGUqIG1fcE5vZGU7DQorICBDWEZBX05vZGUqIG1fcFBzTWFwTm9kZTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmFwcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuY3BwCmluZGV4IGJlYTY0ZGEuLmIzMDNmYmQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmFwcC5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmYXBwLmNwcApAQCAtMTMsMjk0ICsxMywyODEgQEAKICNpbmNsdWRlICJ4ZmFfZndsdGhlbWUuaCINCiAjaW5jbHVkZSAieGZhX2ZvbnRtZ3IuaCINCiAjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0aGFuZGxlci5oIg0KLUNYRkFfRmlsZVJlYWQ6OkNYRkFfRmlsZVJlYWQoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9TdHJlYW0qPiAmc3RyZWFtcykNCi0gICAgOiBtX2R3U2l6ZSgwKQ0KLXsNCi0gICAgbV9TdHJlYW1zLkNvcHkoc3RyZWFtcyk7DQorQ1hGQV9GaWxlUmVhZDo6Q1hGQV9GaWxlUmVhZChjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1N0cmVhbSo+JiBzdHJlYW1zKQ0KKyAgICA6IG1fZHdTaXplKDApIHsNCisgIG1fU3RyZWFtcy5Db3B5KHN0cmVhbXMpOw0KIH0NCi1DWEZBX0ZpbGVSZWFkOjp+Q1hGQV9GaWxlUmVhZCgpDQotew0KLSAgICBtX1N0cmVhbXMuUmVtb3ZlQWxsKCk7DQotICAgIG1fU3RyZWFtU2l6ZS5SZW1vdmVBbGwoKTsNCitDWEZBX0ZpbGVSZWFkOjp+Q1hGQV9GaWxlUmVhZCgpIHsNCisgIG1fU3RyZWFtcy5SZW1vdmVBbGwoKTsNCisgIG1fU3RyZWFtU2l6ZS5SZW1vdmVBbGwoKTsNCiB9DQotRlhfRklMRVNJWkUgQ1hGQV9GaWxlUmVhZDo6R2V0U2l6ZSgpDQotew0KLSAgICBpZiAobV9TdHJlYW1TaXplLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgIHJldHVybiBtX2R3U2l6ZTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fU3RyZWFtcy5HZXRTaXplKCk7DQotICAgIEZYX0RXT1JEIGlCdWZmZXJTaXplID0gNDA5NjsNCi0gICAgdWludDhfdCogcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlCdWZmZXJTaXplKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgIENQREZfU3RyZWFtRmlsdGVyKiBwU3RyZWFtRmlsdGVyID0gbV9TdHJlYW1zW2ldLT5HZXRTdHJlYW1GaWx0ZXIoRkFMU0UpOw0KLSAgICAgICAgRlhfRFdPUkQgZHdDdXJTaXplID0gMDsNCi0gICAgICAgIHdoaWxlIChUUlVFKSB7DQotICAgICAgICAgICAgRlhfRFdPUkQgZHdSZWFkID0gcFN0cmVhbUZpbHRlci0+UmVhZEJsb2NrKHBCdWYsIGlCdWZmZXJTaXplKTsNCi0gICAgICAgICAgICBkd0N1clNpemUgKz0gZHdSZWFkOw0KLSAgICAgICAgICAgIGlmIChkd1JlYWQgPCBpQnVmZmVyU2l6ZSkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBtX2R3U2l6ZSArPSBkd0N1clNpemU7DQotICAgICAgICBtX1N0cmVhbVNpemUuQWRkKGR3Q3VyU2l6ZSk7DQotICAgICAgICBkZWxldGUgcFN0cmVhbUZpbHRlcjsNCi0gICAgfQ0KLSAgICBGWF9GcmVlKHBCdWYpOw0KK0ZYX0ZJTEVTSVpFIENYRkFfRmlsZVJlYWQ6OkdldFNpemUoKSB7DQorICBpZiAobV9TdHJlYW1TaXplLkdldFNpemUoKSA+IDApIHsNCiAgICAgcmV0dXJuIG1fZHdTaXplOw0KLX0NCi1GWF9CT09MIENYRkFfRmlsZVJlYWQ6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpDQotew0KLSAgICBGWF9GSUxFU0laRSBkd0xlbiA9IDA7DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9TdHJlYW1zLkdldFNpemUoKTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yICg7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgZHdMZW4gKz0gbV9TdHJlYW1TaXplW2ldOw0KLSAgICAgICAgaWYgKGR3TGVuID4gb2Zmc2V0KSB7DQotICAgICAgICAgICAgZHdMZW4gLT0gbV9TdHJlYW1TaXplW2ldOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChpID49IGlDb3VudCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IG1fU3RyZWFtcy5HZXRTaXplKCk7DQorICBGWF9EV09SRCBpQnVmZmVyU2l6ZSA9IDQwOTY7DQorICB1aW50OF90KiBwQnVmID0gRlhfQWxsb2ModWludDhfdCwgaUJ1ZmZlclNpemUpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCiAgICAgQ1BERl9TdHJlYW1GaWx0ZXIqIHBTdHJlYW1GaWx0ZXIgPSBtX1N0cmVhbXNbaV0tPkdldFN0cmVhbUZpbHRlcihGQUxTRSk7DQotICAgIGlmICgob2Zmc2V0IC09IGR3TGVuKSA+IDApIHsNCi0gICAgICAgIHVpbnQ4X3QqIHBCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBvZmZzZXQpOw0KLSAgICAgICAgRlhfRFdPUkQgZHdSZWFkID0gcFN0cmVhbUZpbHRlci0+UmVhZEJsb2NrKHBCdWYsIG9mZnNldCk7DQotICAgICAgICBGWF9GcmVlKHBCdWYpOw0KKyAgICBGWF9EV09SRCBkd0N1clNpemUgPSAwOw0KKyAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgIEZYX0RXT1JEIGR3UmVhZCA9IHBTdHJlYW1GaWx0ZXItPlJlYWRCbG9jayhwQnVmLCBpQnVmZmVyU2l6ZSk7DQorICAgICAgZHdDdXJTaXplICs9IGR3UmVhZDsNCisgICAgICBpZiAoZHdSZWFkIDwgaUJ1ZmZlclNpemUpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGWF9EV09SRCBkd0hhZFJlYWQgPSBwU3RyZWFtRmlsdGVyLT5SZWFkQmxvY2soKHVpbnQ4X3QqKWJ1ZmZlciwgc2l6ZSk7DQorICAgIG1fZHdTaXplICs9IGR3Q3VyU2l6ZTsNCisgICAgbV9TdHJlYW1TaXplLkFkZChkd0N1clNpemUpOw0KKyAgICBkZWxldGUgcFN0cmVhbUZpbHRlcjsNCisgIH0NCisgIEZYX0ZyZWUocEJ1Zik7DQorICByZXR1cm4gbV9kd1NpemU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GaWxlUmVhZDo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsNCisgIEZYX0ZJTEVTSVpFIGR3TGVuID0gMDsNCisgIGludDMyX3QgaUNvdW50ID0gbV9TdHJlYW1zLkdldFNpemUoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIGR3TGVuICs9IG1fU3RyZWFtU2l6ZVtpXTsNCisgICAgaWYgKGR3TGVuID4gb2Zmc2V0KSB7DQorICAgICAgZHdMZW4gLT0gbV9TdHJlYW1TaXplW2ldOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoaSA+PSBpQ291bnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1BERl9TdHJlYW1GaWx0ZXIqIHBTdHJlYW1GaWx0ZXIgPSBtX1N0cmVhbXNbaV0tPkdldFN0cmVhbUZpbHRlcihGQUxTRSk7DQorICBpZiAoKG9mZnNldCAtPSBkd0xlbikgPiAwKSB7DQorICAgIHVpbnQ4X3QqIHBCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBvZmZzZXQpOw0KKyAgICBGWF9EV09SRCBkd1JlYWQgPSBwU3RyZWFtRmlsdGVyLT5SZWFkQmxvY2socEJ1Ziwgb2Zmc2V0KTsNCisgICAgRlhfRnJlZShwQnVmKTsNCisgIH0NCisgIEZYX0RXT1JEIGR3SGFkUmVhZCA9IHBTdHJlYW1GaWx0ZXItPlJlYWRCbG9jaygodWludDhfdCopYnVmZmVyLCBzaXplKTsNCisgIGRlbGV0ZSBwU3RyZWFtRmlsdGVyOw0KKyAgc2l6ZSAtPSBkd0hhZFJlYWQ7DQorICBpZiAoc2l6ZSA8PSAwKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdSZWFkU2l6ZSA9IGR3SGFkUmVhZDsNCisgIGZvciAoaW50MzJfdCBpU3RhcnQgPSBpICsgMTsgaVN0YXJ0IDwgaUNvdW50OyBpU3RhcnQrKykgew0KKyAgICBDUERGX1N0cmVhbUZpbHRlciogcFN0cmVhbUZpbHRlciA9DQorICAgICAgICBtX1N0cmVhbXNbaVN0YXJ0XS0+R2V0U3RyZWFtRmlsdGVyKEZBTFNFKTsNCisgICAgRlhfRFdPUkQgZHdIYWRSZWFkID0NCisgICAgICAgIHBTdHJlYW1GaWx0ZXItPlJlYWRCbG9jaygoKHVpbnQ4X3QqKWJ1ZmZlcikgKyBkd1JlYWRTaXplLCBzaXplKTsNCiAgICAgZGVsZXRlIHBTdHJlYW1GaWx0ZXI7DQogICAgIHNpemUgLT0gZHdIYWRSZWFkOw0KICAgICBpZiAoc2l6ZSA8PSAwKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICByZXR1cm4gVFJVRTsNCiAgICAgfQ0KLSAgICBGWF9EV09SRCBkd1JlYWRTaXplID0gZHdIYWRSZWFkOw0KLSAgICBmb3IgKGludDMyX3QgaVN0YXJ0ID0gaSArIDE7IGlTdGFydCA8IGlDb3VudDsgaVN0YXJ0KyspIHsNCi0gICAgICAgIENQREZfU3RyZWFtRmlsdGVyKiBwU3RyZWFtRmlsdGVyID0gbV9TdHJlYW1zW2lTdGFydF0tPkdldFN0cmVhbUZpbHRlcihGQUxTRSk7DQotICAgICAgICBGWF9EV09SRCBkd0hhZFJlYWQgPSBwU3RyZWFtRmlsdGVyLT5SZWFkQmxvY2soKCh1aW50OF90KilidWZmZXIpICsgZHdSZWFkU2l6ZSwgc2l6ZSk7DQotICAgICAgICBkZWxldGUgcFN0cmVhbUZpbHRlcjsNCi0gICAgICAgIHNpemUgLT0gZHdIYWRSZWFkOw0KLSAgICAgICAgaWYgKHNpemUgPD0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZHdSZWFkU2l6ZSArPSBkd0hhZFJlYWQ7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KKyAgICBkd1JlYWRTaXplICs9IGR3SGFkUmVhZDsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotQ1hGQV9GaWxlUmVhZDI6OkNYRkFfRmlsZVJlYWQyKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RyZWFtKj4gJnN0cmVhbXMpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IHN0cmVhbXMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgQ1BERl9TdHJlYW1BY2MgJmFjYyA9IG1fRGF0YS5BZGQoKTsNCi0gICAgICAgIGFjYy5Mb2FkQWxsRGF0YShzdHJlYW1zW2ldKTsNCi0gICAgfQ0KK0NYRkFfRmlsZVJlYWQyOjpDWEZBX0ZpbGVSZWFkMihjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1N0cmVhbSo+JiBzdHJlYW1zKSB7DQorICBpbnQzMl90IGlDb3VudCA9IHN0cmVhbXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ1BERl9TdHJlYW1BY2MmIGFjYyA9IG1fRGF0YS5BZGQoKTsNCisgICAgYWNjLkxvYWRBbGxEYXRhKHN0cmVhbXNbaV0pOw0KKyAgfQ0KIH0NCi1GWF9GSUxFU0laRSBDWEZBX0ZpbGVSZWFkMjo6R2V0U2l6ZSgpDQotew0KLSAgICBGWF9EV09SRCBkd1NpemUgPSAwOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fRGF0YS5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICBDUERGX1N0cmVhbUFjYyAmYWNjID0gbV9EYXRhW2ldOw0KLSAgICAgICAgZHdTaXplICs9IGFjYy5HZXRTaXplKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGR3U2l6ZTsNCitGWF9GSUxFU0laRSBDWEZBX0ZpbGVSZWFkMjo6R2V0U2l6ZSgpIHsNCisgIEZYX0RXT1JEIGR3U2l6ZSA9IDA7DQorICBpbnQzMl90IGlDb3VudCA9IG1fRGF0YS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDUERGX1N0cmVhbUFjYyYgYWNjID0gbV9EYXRhW2ldOw0KKyAgICBkd1NpemUgKz0gYWNjLkdldFNpemUoKTsNCisgIH0NCisgIHJldHVybiBkd1NpemU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GaWxlUmVhZDI6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fRGF0YS5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaW5kZXggPSAwOw0KLSAgICB3aGlsZSAoaW5kZXggPCBpQ291bnQpIHsNCi0gICAgICAgIENQREZfU3RyZWFtQWNjICZhY2MgPSBtX0RhdGFbaW5kZXhdOw0KLSAgICAgICAgRlhfRklMRVNJWkUgZHdTaXplID0gYWNjLkdldFNpemUoKTsNCi0gICAgICAgIGlmIChvZmZzZXQgPCBkd1NpemUpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIG9mZnNldCAtPSBkd1NpemU7DQotICAgICAgICBpbmRleCsrOw0KK0ZYX0JPT0wgQ1hGQV9GaWxlUmVhZDI6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9EYXRhLkdldFNpemUoKTsNCisgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgd2hpbGUgKGluZGV4IDwgaUNvdW50KSB7DQorICAgIENQREZfU3RyZWFtQWNjJiBhY2MgPSBtX0RhdGFbaW5kZXhdOw0KKyAgICBGWF9GSUxFU0laRSBkd1NpemUgPSBhY2MuR2V0U2l6ZSgpOw0KKyAgICBpZiAob2Zmc2V0IDwgZHdTaXplKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgd2hpbGUgKGluZGV4IDwgaUNvdW50KSB7DQotICAgICAgICBDUERGX1N0cmVhbUFjYyAmYWNjID0gbV9EYXRhW2luZGV4XTsNCi0gICAgICAgIEZYX0RXT1JEIGR3U2l6ZSA9IGFjYy5HZXRTaXplKCk7DQotICAgICAgICBGWF9EV09SRCBkd1JlYWQgPSBGWF9NSU4oc2l6ZSwgZHdTaXplIC0gb2Zmc2V0KTsNCi0gICAgICAgIEZYU1lTX21lbWNweShidWZmZXIsIGFjYy5HZXREYXRhKCkgKyBvZmZzZXQsIGR3UmVhZCk7DQotICAgICAgICBzaXplIC09IGR3UmVhZDsNCi0gICAgICAgIGlmIChzaXplID09IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGJ1ZmZlciA9ICh1aW50OF90KilidWZmZXIgKyBkd1JlYWQ7DQotICAgICAgICBvZmZzZXQgPSAwOw0KLSAgICAgICAgaW5kZXgrKzsNCisgICAgb2Zmc2V0IC09IGR3U2l6ZTsNCisgICAgaW5kZXgrKzsNCisgIH0NCisgIHdoaWxlIChpbmRleCA8IGlDb3VudCkgew0KKyAgICBDUERGX1N0cmVhbUFjYyYgYWNjID0gbV9EYXRhW2luZGV4XTsNCisgICAgRlhfRFdPUkQgZHdTaXplID0gYWNjLkdldFNpemUoKTsNCisgICAgRlhfRFdPUkQgZHdSZWFkID0gRlhfTUlOKHNpemUsIGR3U2l6ZSAtIG9mZnNldCk7DQorICAgIEZYU1lTX21lbWNweShidWZmZXIsIGFjYy5HZXREYXRhKCkgKyBvZmZzZXQsIGR3UmVhZCk7DQorICAgIHNpemUgLT0gZHdSZWFkOw0KKyAgICBpZiAoc2l6ZSA9PSAwKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KKyAgICBidWZmZXIgPSAodWludDhfdCopYnVmZmVyICsgZHdSZWFkOw0KKyAgICBvZmZzZXQgPSAwOw0KKyAgICBpbmRleCsrOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCiAvLyBzdGF0aWMNCi1JWEZBX0FwcCogSVhGQV9BcHA6OkNyZWF0ZShJWEZBX0FwcFByb3ZpZGVyKiBwUHJvdmlkZXIpDQotew0KLSAgICByZXR1cm4gbmV3IENYRkFfRkZBcHAocFByb3ZpZGVyKTsNCitJWEZBX0FwcCogSVhGQV9BcHA6OkNyZWF0ZShJWEZBX0FwcFByb3ZpZGVyKiBwUHJvdmlkZXIpIHsNCisgIHJldHVybiBuZXcgQ1hGQV9GRkFwcChwUHJvdmlkZXIpOw0KIH0NCiAvLyB2aXJ0dWFsDQotSVhGQV9BcHA6On5JWEZBX0FwcCgpDQotew0KLX0NCitJWEZBX0FwcDo6fklYRkFfQXBwKCkge30NCiBDWEZBX0ZGQXBwOjpDWEZBX0ZGQXBwKElYRkFfQXBwUHJvdmlkZXIqIHBQcm92aWRlcikNCi0gICAgOiBtX3BEb2NIYW5kbGVyKE5VTEwpDQotICAgICwgbV9wRldMVGhlbWUoTlVMTCkNCi0gICAgLCBtX3BQcm92aWRlcihwUHJvdmlkZXIpDQotICAgICwgbV9wRm9udE1ncihOVUxMKQ0KLSAgICAsIG1fcEFkYXB0ZXJXaWRnZXRNZ3IoTlVMTCkNCi0gICAgLCBtX3BGREVGb250TWdyKE5VTEwpDQotICAgICwgbV9wTWVudUhhbmRsZXIoTlVMTCkNCi0gICAgLCBtX3BBZGFwdGVyVGhyZWFkTWdyKE5VTEwpDQorICAgIDogbV9wRG9jSGFuZGxlcihOVUxMKSwNCisgICAgICBtX3BGV0xUaGVtZShOVUxMKSwNCisgICAgICBtX3BQcm92aWRlcihwUHJvdmlkZXIpLA0KKyAgICAgIG1fcEZvbnRNZ3IoTlVMTCksDQorICAgICAgbV9wQWRhcHRlcldpZGdldE1ncihOVUxMKSwNCisgICAgICBtX3BGREVGb250TWdyKE5VTEwpLA0KKyAgICAgIG1fcE1lbnVIYW5kbGVyKE5VTEwpLA0KKyAgICAgIG1fcEFkYXB0ZXJUaHJlYWRNZ3IoTlVMTCkNCiAjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KLSAgICAsIG1fcEZvbnRTb3VyY2UoTlVMTCkNCisgICAgICAsDQorICAgICAgbV9wRm9udFNvdXJjZShOVUxMKQ0KICNlbmRpZg0KIHsNCi0gICAgbV9wRldMQXBwID0gSUZXTF9BcHA6OkNyZWF0ZSh0aGlzKTsNCi0gICAgRldMX1NldEFwcChtX3BGV0xBcHApOw0KLSAgICBtX3BGV0xBcHAtPkluaXRpYWxpemUoKTsNCi0gICAgSVhGQV9UaW1lWm9uZVByb3ZpZGVyOjpDcmVhdGUoKTsNCisgIG1fcEZXTEFwcCA9IElGV0xfQXBwOjpDcmVhdGUodGhpcyk7DQorICBGV0xfU2V0QXBwKG1fcEZXTEFwcCk7DQorICBtX3BGV0xBcHAtPkluaXRpYWxpemUoKTsNCisgIElYRkFfVGltZVpvbmVQcm92aWRlcjo6Q3JlYXRlKCk7DQogfQ0KLUNYRkFfRkZBcHA6On5DWEZBX0ZGQXBwKCkNCi17DQotICAgIGlmIChtX3BEb2NIYW5kbGVyKSB7DQotICAgICAgICBkZWxldGUgbV9wRG9jSGFuZGxlcjsNCi0gICAgfQ0KLSAgICBpZiAobV9wRldMQXBwKSB7DQotICAgICAgICBtX3BGV0xBcHAtPkZpbmFsaXplKCk7DQotICAgICAgICBtX3BGV0xBcHAtPlJlbGVhc2UoKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wRldMVGhlbWUpIHsNCi0gICAgICAgIG1fcEZXTFRoZW1lLT5SZWxlYXNlKCk7DQotICAgIH0NCi0gICAgaWYgKG1fcEFkYXB0ZXJXaWRnZXRNZ3IpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BBZGFwdGVyV2lkZ2V0TWdyOw0KLSAgICB9DQotICAgIGlmIChtX3BBZGFwdGVyVGhyZWFkTWdyKSB7DQotICAgICAgICBkZWxldGUgbV9wQWRhcHRlclRocmVhZE1ncjsNCi0gICAgICAgIG1fcEFkYXB0ZXJUaHJlYWRNZ3IgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3BNZW51SGFuZGxlcikgew0KLSAgICAgICAgZGVsZXRlIG1fcE1lbnVIYW5kbGVyOw0KLSAgICAgICAgbV9wTWVudUhhbmRsZXIgPSBOVUxMOw0KLSAgICB9DQotICAgIElYRkFfVGltZVpvbmVQcm92aWRlcjo6RGVzdHJveSgpOw0KLSAgICBpZiAobV9wRm9udE1nciAhPSBOVUxMKSB7DQotICAgICAgICBkZWxldGUgbV9wRm9udE1ncjsNCi0gICAgICAgIG1fcEZvbnRNZ3IgPSBOVUxMOw0KLSAgICB9DQorQ1hGQV9GRkFwcDo6fkNYRkFfRkZBcHAoKSB7DQorICBpZiAobV9wRG9jSGFuZGxlcikgew0KKyAgICBkZWxldGUgbV9wRG9jSGFuZGxlcjsNCisgIH0NCisgIGlmIChtX3BGV0xBcHApIHsNCisgICAgbV9wRldMQXBwLT5GaW5hbGl6ZSgpOw0KKyAgICBtX3BGV0xBcHAtPlJlbGVhc2UoKTsNCisgIH0NCisgIGlmIChtX3BGV0xUaGVtZSkgew0KKyAgICBtX3BGV0xUaGVtZS0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgaWYgKG1fcEFkYXB0ZXJXaWRnZXRNZ3IpIHsNCisgICAgZGVsZXRlIG1fcEFkYXB0ZXJXaWRnZXRNZ3I7DQorICB9DQorICBpZiAobV9wQWRhcHRlclRocmVhZE1ncikgew0KKyAgICBkZWxldGUgbV9wQWRhcHRlclRocmVhZE1ncjsNCisgICAgbV9wQWRhcHRlclRocmVhZE1nciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wTWVudUhhbmRsZXIpIHsNCisgICAgZGVsZXRlIG1fcE1lbnVIYW5kbGVyOw0KKyAgICBtX3BNZW51SGFuZGxlciA9IE5VTEw7DQorICB9DQorICBJWEZBX1RpbWVab25lUHJvdmlkZXI6OkRlc3Ryb3koKTsNCisgIGlmIChtX3BGb250TWdyICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fcEZvbnRNZ3I7DQorICAgIG1fcEZvbnRNZ3IgPSBOVUxMOw0KKyAgfQ0KICNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQotICAgIGlmKG1fcEZvbnRTb3VyY2UgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wRm9udFNvdXJjZS0+UmVsZWFzZSgpOw0KLSAgICB9DQorICBpZiAobV9wRm9udFNvdXJjZSAhPSBOVUxMKSB7DQorICAgIG1fcEZvbnRTb3VyY2UtPlJlbGVhc2UoKTsNCisgIH0NCiAjZW5kaWYNCi0gICAgaWYgKG1fcEZERUZvbnRNZ3IpIHsNCi0gICAgICAgIG1fcEZERUZvbnRNZ3ItPlJlbGVhc2UoKTsNCi0gICAgfQ0KKyAgaWYgKG1fcEZERUZvbnRNZ3IpIHsNCisgICAgbV9wRkRFRm9udE1nci0+UmVsZWFzZSgpOw0KKyAgfQ0KIH0NCi1JWEZBX01lbnVIYW5kbGVyKiBDWEZBX0ZGQXBwOjpHZXRNZW51SGFuZGxlcigpDQotew0KLSAgICBpZiAoIW1fcE1lbnVIYW5kbGVyKSB7DQotICAgICAgICBtX3BNZW51SGFuZGxlciA9IEZYX05FVyBDWEZBX0ZGTWVudUhhbmRsZXI7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcE1lbnVIYW5kbGVyOw0KK0lYRkFfTWVudUhhbmRsZXIqIENYRkFfRkZBcHA6OkdldE1lbnVIYW5kbGVyKCkgew0KKyAgaWYgKCFtX3BNZW51SGFuZGxlcikgew0KKyAgICBtX3BNZW51SGFuZGxlciA9IEZYX05FVyBDWEZBX0ZGTWVudUhhbmRsZXI7DQorICB9DQorICByZXR1cm4gbV9wTWVudUhhbmRsZXI7DQogfQ0KLUlYRkFfRG9jSGFuZGxlciogQ1hGQV9GRkFwcDo6R2V0RG9jSGFuZGxlcigpDQotew0KLSAgICBpZiAoIW1fcERvY0hhbmRsZXIpIHsNCi0gICAgICAgIG1fcERvY0hhbmRsZXIgPSBGWF9ORVcgQ1hGQV9GRkRvY0hhbmRsZXI7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcERvY0hhbmRsZXI7DQorSVhGQV9Eb2NIYW5kbGVyKiBDWEZBX0ZGQXBwOjpHZXREb2NIYW5kbGVyKCkgew0KKyAgaWYgKCFtX3BEb2NIYW5kbGVyKSB7DQorICAgIG1fcERvY0hhbmRsZXIgPSBGWF9ORVcgQ1hGQV9GRkRvY0hhbmRsZXI7DQorICB9DQorICByZXR1cm4gbV9wRG9jSGFuZGxlcjsNCiB9DQotSVhGQV9Eb2MqIENYRkFfRkZBcHA6OkNyZWF0ZURvYyhJWEZBX0RvY1Byb3ZpZGVyKiBwUHJvdmlkZXIsIElGWF9GaWxlUmVhZCogcFN0cmVhbSwgRlhfQk9PTCBiVGFrZU92ZXJGaWxlKQ0KLXsNCi0gICAgQ1hGQV9GRkRvYyogcERvYyA9IEZYX05FVyBDWEZBX0ZGRG9jKHRoaXMsIHBQcm92aWRlcik7DQotICAgIGlmICghcERvYykgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiU3VjY2VzcyA9IHBEb2MtPk9wZW5Eb2MocFN0cmVhbSwgYlRha2VPdmVyRmlsZSk7DQotICAgIGlmICghYlN1Y2Nlc3MpIHsNCi0gICAgICAgIGRlbGV0ZSBwRG9jOw0KLSAgICAgICAgcERvYyA9IE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHBEb2M7DQorSVhGQV9Eb2MqIENYRkFfRkZBcHA6OkNyZWF0ZURvYyhJWEZBX0RvY1Byb3ZpZGVyKiBwUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUYWtlT3ZlckZpbGUpIHsNCisgIENYRkFfRkZEb2MqIHBEb2MgPSBGWF9ORVcgQ1hGQV9GRkRvYyh0aGlzLCBwUHJvdmlkZXIpOw0KKyAgaWYgKCFwRG9jKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhfQk9PTCBiU3VjY2VzcyA9IHBEb2MtPk9wZW5Eb2MocFN0cmVhbSwgYlRha2VPdmVyRmlsZSk7DQorICBpZiAoIWJTdWNjZXNzKSB7DQorICAgIGRlbGV0ZSBwRG9jOw0KKyAgICBwRG9jID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBwRG9jOw0KIH0NCi1JWEZBX0RvYyogQ1hGQV9GRkFwcDo6Q3JlYXRlRG9jKElYRkFfRG9jUHJvdmlkZXIqIHBQcm92aWRlciwgQ1BERl9Eb2N1bWVudCAqcFBERkRvYykNCi17DQotICAgIGlmIChwUERGRG9jID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENYRkFfRkZEb2MqIHBEb2MgPSBGWF9ORVcgQ1hGQV9GRkRvYyh0aGlzLCBwUHJvdmlkZXIpOw0KLSAgICBpZiAoIXBEb2MpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYlN1Y2Nlc3MgPSBwRG9jLT5PcGVuRG9jKHBQREZEb2MpOw0KLSAgICBpZiAoIWJTdWNjZXNzKSB7DQotICAgICAgICBkZWxldGUgcERvYzsNCi0gICAgICAgIHBEb2MgPSBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBwRG9jOw0KK0lYRkFfRG9jKiBDWEZBX0ZGQXBwOjpDcmVhdGVEb2MoSVhGQV9Eb2NQcm92aWRlciogcFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcFBERkRvYykgew0KKyAgaWYgKHBQREZEb2MgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENYRkFfRkZEb2MqIHBEb2MgPSBGWF9ORVcgQ1hGQV9GRkRvYyh0aGlzLCBwUHJvdmlkZXIpOw0KKyAgaWYgKCFwRG9jKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhfQk9PTCBiU3VjY2VzcyA9IHBEb2MtPk9wZW5Eb2MocFBERkRvYyk7DQorICBpZiAoIWJTdWNjZXNzKSB7DQorICAgIGRlbGV0ZSBwRG9jOw0KKyAgICBwRG9jID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBwRG9jOw0KIH0NCiANCi12b2lkIENYRkFfRkZBcHA6OlNldERlZmF1bHRGb250TWdyKElYRkFfRm9udE1nciogcEZvbnRNZ3IpDQotew0KLSAgICBpZiAoIW1fcEZvbnRNZ3IpIHsNCi0gICAgICAgIG1fcEZvbnRNZ3IgPSBGWF9ORVcgQ1hGQV9Gb250TWdyKCk7DQotICAgIH0NCi0gICAgbV9wRm9udE1nci0+U2V0RGVmRm9udE1ncihwRm9udE1ncik7DQordm9pZCBDWEZBX0ZGQXBwOjpTZXREZWZhdWx0Rm9udE1ncihJWEZBX0ZvbnRNZ3IqIHBGb250TWdyKSB7DQorICBpZiAoIW1fcEZvbnRNZ3IpIHsNCisgICAgbV9wRm9udE1nciA9IEZYX05FVyBDWEZBX0ZvbnRNZ3IoKTsNCisgIH0NCisgIG1fcEZvbnRNZ3ItPlNldERlZkZvbnRNZ3IocEZvbnRNZ3IpOw0KIH0NCi1DWEZBX0ZvbnRNZ3IqIENYRkFfRkZBcHA6OkdldFhGQUZvbnRNZ3IoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcEZvbnRNZ3I7DQorQ1hGQV9Gb250TWdyKiBDWEZBX0ZGQXBwOjpHZXRYRkFGb250TWdyKCkgew0KKyAgcmV0dXJuIG1fcEZvbnRNZ3I7DQogfQ0KLUlGWF9Gb250TWdyKiBDWEZBX0ZGQXBwOjpHZXRGREVGb250TWdyKCkNCi17DQotICAgIGlmICghbV9wRkRFRm9udE1ncikgew0KK0lGWF9Gb250TWdyKiBDWEZBX0ZGQXBwOjpHZXRGREVGb250TWdyKCkgew0KKyAgaWYgKCFtX3BGREVGb250TWdyKSB7DQogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgICAgIG1fcEZERUZvbnRNZ3IgPSBJRlhfRm9udE1ncjo6Q3JlYXRlKEZYX0dldERlZkZvbnRFbnVtZXJhdG9yKCkpOw0KKyAgICBtX3BGREVGb250TWdyID0gSUZYX0ZvbnRNZ3I6OkNyZWF0ZShGWF9HZXREZWZGb250RW51bWVyYXRvcigpKTsNCiAjZWxzZQ0KLSAgICAgICAgbV9wRm9udFNvdXJjZSA9IEZYX0NyZWF0ZURlZmF1bHRGb250U291cmNlRW51bSgpOw0KLSAgICAgICAgbV9wRkRFRm9udE1nciA9IElGWF9Gb250TWdyOjpDcmVhdGUobV9wRm9udFNvdXJjZSk7DQorICAgIG1fcEZvbnRTb3VyY2UgPSBGWF9DcmVhdGVEZWZhdWx0Rm9udFNvdXJjZUVudW0oKTsNCisgICAgbV9wRkRFRm9udE1nciA9IElGWF9Gb250TWdyOjpDcmVhdGUobV9wRm9udFNvdXJjZSk7DQogI2VuZGlmDQotICAgIH0NCi0gICAgcmV0dXJuIG1fcEZERUZvbnRNZ3I7DQorICB9DQorICByZXR1cm4gbV9wRkRFRm9udE1ncjsNCiB9DQotQ1hGQV9GV0xUaGVtZSogQ1hGQV9GRkFwcDo6R2V0RldMVGhlbWUoKQ0KLXsNCi0gICAgaWYgKCFtX3BGV0xUaGVtZSkgew0KLSAgICAgICAgbV9wRldMVGhlbWUgPSBGWF9ORVcgQ1hGQV9GV0xUaGVtZSh0aGlzKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wRldMVGhlbWU7DQorQ1hGQV9GV0xUaGVtZSogQ1hGQV9GRkFwcDo6R2V0RldMVGhlbWUoKSB7DQorICBpZiAoIW1fcEZXTFRoZW1lKSB7DQorICAgIG1fcEZXTFRoZW1lID0gRlhfTkVXIENYRkFfRldMVGhlbWUodGhpcyk7DQorICB9DQorICByZXR1cm4gbV9wRldMVGhlbWU7DQogfQ0KLUlGV0xfQWRhcHRlcldpZGdldE1nciogQ1hGQV9GRkFwcDo6R2V0V2lkZ2V0TWdyKElGV0xfV2lkZ2V0TWdyRGVsZWdhdGUgKnBEZWxlZ2F0ZSkNCi17DQotICAgIGlmICghbV9wQWRhcHRlcldpZGdldE1ncikgew0KLSAgICAgICAgbV9wQWRhcHRlcldpZGdldE1nciA9IEZYX05FVyBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3I7DQotICAgICAgICBwRGVsZWdhdGUtPk9uU2V0Q2FwYWJpbGl0eShGV0xfV0dUTUdSX0Rpc2FibGVUaHJlYWQgfCBGV0xfV0dUTUdSX0Rpc2FibGVGb3JtKTsNCi0gICAgICAgIG1fcFdpZGdldE1nckRlbGVnYXRlID0gcERlbGVnYXRlOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BBZGFwdGVyV2lkZ2V0TWdyOw0KK0lGV0xfQWRhcHRlcldpZGdldE1nciogQ1hGQV9GRkFwcDo6R2V0V2lkZ2V0TWdyKA0KKyAgICBJRldMX1dpZGdldE1nckRlbGVnYXRlKiBwRGVsZWdhdGUpIHsNCisgIGlmICghbV9wQWRhcHRlcldpZGdldE1ncikgew0KKyAgICBtX3BBZGFwdGVyV2lkZ2V0TWdyID0gRlhfTkVXIENYRkFfRldMQWRhcHRlcldpZGdldE1ncjsNCisgICAgcERlbGVnYXRlLT5PblNldENhcGFiaWxpdHkoRldMX1dHVE1HUl9EaXNhYmxlVGhyZWFkIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1dHVE1HUl9EaXNhYmxlRm9ybSk7DQorICAgIG1fcFdpZGdldE1nckRlbGVnYXRlID0gcERlbGVnYXRlOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEFkYXB0ZXJXaWRnZXRNZ3I7DQogfQ0KLUlGV0xfQWRhcHRlclRocmVhZE1nciogQ1hGQV9GRkFwcDo6R2V0VGhyZWFkTWdyKCkNCi17DQotICAgIGlmICghbV9wQWRhcHRlclRocmVhZE1ncikgew0KLSAgICAgICAgbV9wQWRhcHRlclRocmVhZE1nciA9IEZYX05FVyBDRldMX1NEQWRhcHRlclRocmVhZE1ncjsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wQWRhcHRlclRocmVhZE1ncjsNCitJRldMX0FkYXB0ZXJUaHJlYWRNZ3IqIENYRkFfRkZBcHA6OkdldFRocmVhZE1ncigpIHsNCisgIGlmICghbV9wQWRhcHRlclRocmVhZE1ncikgew0KKyAgICBtX3BBZGFwdGVyVGhyZWFkTWdyID0gRlhfTkVXIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEFkYXB0ZXJUaHJlYWRNZ3I7DQogfQ0KLUlGV0xfQWRhcHRlclRpbWVyTWdyKiBDWEZBX0ZGQXBwOjpHZXRUaW1lck1ncigpDQotew0KLSAgICByZXR1cm4gbV9wUHJvdmlkZXItPkdldFRpbWVyTWdyKCk7DQorSUZXTF9BZGFwdGVyVGltZXJNZ3IqIENYRkFfRkZBcHA6OkdldFRpbWVyTWdyKCkgew0KKyAgcmV0dXJuIG1fcFByb3ZpZGVyLT5HZXRUaW1lck1ncigpOw0KIH0NCi1JRldMX0FkYXB0ZXJDdXJzb3JNZ3IqCUNYRkFfRkZBcHA6OkdldEN1cnNvck1ncigpDQotew0KLSAgICByZXR1cm4gTlVMTDsNCitJRldMX0FkYXB0ZXJDdXJzb3JNZ3IqIENYRkFfRkZBcHA6OkdldEN1cnNvck1ncigpIHsNCisgIHJldHVybiBOVUxMOw0KIH0NCi1JRldMX0FkYXB0ZXJNb25pdG9yTWdyKiBDWEZBX0ZGQXBwOjpHZXRNb25pdG9yTWdyKCkNCi17DQotICAgIHJldHVybiBOVUxMOw0KK0lGV0xfQWRhcHRlck1vbml0b3JNZ3IqIENYRkFfRkZBcHA6OkdldE1vbml0b3JNZ3IoKSB7DQorICByZXR1cm4gTlVMTDsNCiB9DQotSUZXTF9BZGFwdGVyQ2xpcGJvYXJkTWdyKiBDWEZBX0ZGQXBwOjpHZXRDbGlwYm9hcmRNZ3IoKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQorSUZXTF9BZGFwdGVyQ2xpcGJvYXJkTWdyKiBDWEZBX0ZGQXBwOjpHZXRDbGlwYm9hcmRNZ3IoKSB7DQorICByZXR1cm4gTlVMTDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmYXBwLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuaAppbmRleCAxOWViMzQ3Li4zMTM3YjBkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuaApAQCAtNyw4NSArNyw3OCBAQAogI2lmbmRlZiBYRkFfRkZBUFBfSF8NCiAjZGVmaW5lIFhGQV9GRkFQUF9IXw0KIA0KLWNsYXNzIENYRkFfRmlsZVJlYWQgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GaWxlUmVhZChjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1N0cmVhbSo+ICZzdHJlYW1zKTsNCi0gICAgfkNYRkFfRmlsZVJlYWQoKTsNCi0gICAgdmlydHVhbCBGWF9GSUxFU0laRQlHZXRTaXplKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1N0cmVhbSo+CQkJbV9TdHJlYW1zOw0KLSAgICBDRlhfRFdvcmRBcnJheQkJCQkJCQltX1N0cmVhbVNpemU7DQotICAgIEZYX0RXT1JECQkJCQkJCQltX2R3U2l6ZTsNCitjbGFzcyBDWEZBX0ZpbGVSZWFkIDogcHVibGljIElGWF9GaWxlUmVhZCB7DQorIHB1YmxpYzoNCisgIENYRkFfRmlsZVJlYWQoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9TdHJlYW0qPiYgc3RyZWFtcyk7DQorICB+Q1hGQV9GaWxlUmVhZCgpOw0KKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRTaXplKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9TdHJlYW0qPiBtX1N0cmVhbXM7DQorICBDRlhfRFdvcmRBcnJheSBtX1N0cmVhbVNpemU7DQorICBGWF9EV09SRCBtX2R3U2l6ZTsNCiB9Ow0KLWNsYXNzIENYRkFfRmlsZVJlYWQyIDogcHVibGljIElGWF9GaWxlUmVhZA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRmlsZVJlYWQyKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RyZWFtKj4gJnN0cmVhbXMpOw0KK2NsYXNzIENYRkFfRmlsZVJlYWQyIDogcHVibGljIElGWF9GaWxlUmVhZCB7DQorIHB1YmxpYzoNCisgIENYRkFfRmlsZVJlYWQyKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RyZWFtKj4mIHN0cmVhbXMpOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFNpemUoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpOw0KKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRTaXplKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7DQogDQotICAgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KIA0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX09iamVjdEFycmF5PENQREZfU3RyZWFtQWNjPgkJCW1fRGF0YTsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX09iamVjdEFycmF5PENQREZfU3RyZWFtQWNjPiBtX0RhdGE7DQogfTsNCiBjbGFzcyBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3I7DQogY2xhc3MgQ1hGQV9GV0xUaGVtZTsNCiBjbGFzcyBDWEZBX0ZGRG9jSGFuZGxlcjsNCiBjbGFzcyBDWEZBX0ZGTWVudUhhbmRsZXI7DQogY2xhc3MgQ1hGQV9Gb250TWdyOw0KLWNsYXNzIENYRkFfRkZBcHAgOiBwdWJsaWMgSVhGQV9BcHAsIHB1YmxpYyBJRldMX0FkYXB0ZXJOYXRpdmUNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGQXBwKElYRkFfQXBwUHJvdmlkZXIqIHBQcm92aWRlcik7DQotICAgIH5DWEZBX0ZGQXBwKCkgb3ZlcnJpZGU7DQorY2xhc3MgQ1hGQV9GRkFwcCA6IHB1YmxpYyBJWEZBX0FwcCwgcHVibGljIElGV0xfQWRhcHRlck5hdGl2ZSB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZBcHAoSVhGQV9BcHBQcm92aWRlciogcFByb3ZpZGVyKTsNCisgIH5DWEZBX0ZGQXBwKCkgb3ZlcnJpZGU7DQogDQotICAgIHZpcnR1YWwgSVhGQV9Eb2NIYW5kbGVyKglHZXREb2NIYW5kbGVyKCk7DQotICAgIHZpcnR1YWwgSVhGQV9Eb2MqCQkJQ3JlYXRlRG9jKElYRkFfRG9jUHJvdmlkZXIqIHBQcm92aWRlciwgSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLCBGWF9CT09MIGJUYWtlT3ZlckZpbGUpOw0KLSAgICB2aXJ0dWFsIElYRkFfRG9jKgkJCUNyZWF0ZURvYyhJWEZBX0RvY1Byb3ZpZGVyKiBwUHJvdmlkZXIsIENQREZfRG9jdW1lbnQqIHBQREZEb2MpOw0KLSAgICB2aXJ0dWFsCUlYRkFfQXBwUHJvdmlkZXIqCUdldEFwcFByb3ZpZGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcFByb3ZpZGVyOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXREZWZhdWx0Rm9udE1ncihJWEZBX0ZvbnRNZ3IqIHBGb250TWdyKTsNCi0gICAgdmlydHVhbCBJWEZBX01lbnVIYW5kbGVyKglHZXRNZW51SGFuZGxlcigpOw0KLSAgICB2aXJ0dWFsIElGV0xfQWRhcHRlcldpZGdldE1ncioJR2V0V2lkZ2V0TWdyKElGV0xfV2lkZ2V0TWdyRGVsZWdhdGUqIHBEZWxlZ2F0ZSk7DQotICAgIHZpcnR1YWwgSUZXTF9BZGFwdGVyVGhyZWFkTWdyKglHZXRUaHJlYWRNZ3IoKTsNCi0gICAgdmlydHVhbCBJRldMX0FkYXB0ZXJUaW1lck1ncioJR2V0VGltZXJNZ3IoKTsNCi0gICAgdmlydHVhbCBJRldMX0FkYXB0ZXJDdXJzb3JNZ3IqCUdldEN1cnNvck1ncigpOw0KLSAgICB2aXJ0dWFsIElGV0xfQWRhcHRlck1vbml0b3JNZ3IqIEdldE1vbml0b3JNZ3IoKTsNCi0gICAgdmlydHVhbAlJRldMX0FkYXB0ZXJDbGlwYm9hcmRNZ3IqIEdldENsaXBib2FyZE1ncigpOw0KLSAgICBDWEZBX0ZvbnRNZ3IqCQlHZXRYRkFGb250TWdyKCk7DQotICAgIElGWF9Gb250TWdyKgkJR2V0RkRFRm9udE1ncigpOw0KLSAgICBDWEZBX0ZXTFRoZW1lKgkJR2V0RldMVGhlbWUoKTsNCi0gICAgSUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSogR2V0V2lkZ2V0TWdyRGVsZWdhdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wV2lkZ2V0TWdyRGVsZWdhdGU7DQotICAgIH0NCi1wcm90ZWN0ZWQ6DQotICAgIENYRkFfRkZEb2NIYW5kbGVyKgkJbV9wRG9jSGFuZGxlcjsNCi0gICAgSUZXTF9BcHAqCQkJCW1fcEZXTEFwcDsNCi0gICAgQ1hGQV9GV0xUaGVtZSoJCQltX3BGV0xUaGVtZTsNCi0gICAgSVhGQV9BcHBQcm92aWRlcioJCW1fcFByb3ZpZGVyOw0KLSAgICBDWEZBX0ZvbnRNZ3IqCQkJbV9wRm9udE1ncjsNCisgIHZpcnR1YWwgSVhGQV9Eb2NIYW5kbGVyKiBHZXREb2NIYW5kbGVyKCk7DQorICB2aXJ0dWFsIElYRkFfRG9jKiBDcmVhdGVEb2MoSVhGQV9Eb2NQcm92aWRlciogcFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUYWtlT3ZlckZpbGUpOw0KKyAgdmlydHVhbCBJWEZBX0RvYyogQ3JlYXRlRG9jKElYRkFfRG9jUHJvdmlkZXIqIHBQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwUERGRG9jKTsNCisgIHZpcnR1YWwgSVhGQV9BcHBQcm92aWRlciogR2V0QXBwUHJvdmlkZXIoKSB7IHJldHVybiBtX3BQcm92aWRlcjsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldERlZmF1bHRGb250TWdyKElYRkFfRm9udE1nciogcEZvbnRNZ3IpOw0KKyAgdmlydHVhbCBJWEZBX01lbnVIYW5kbGVyKiBHZXRNZW51SGFuZGxlcigpOw0KKyAgdmlydHVhbCBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIEdldFdpZGdldE1ncigNCisgICAgICBJRldMX1dpZGdldE1nckRlbGVnYXRlKiBwRGVsZWdhdGUpOw0KKyAgdmlydHVhbCBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IqIEdldFRocmVhZE1ncigpOw0KKyAgdmlydHVhbCBJRldMX0FkYXB0ZXJUaW1lck1nciogR2V0VGltZXJNZ3IoKTsNCisgIHZpcnR1YWwgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyKiBHZXRDdXJzb3JNZ3IoKTsNCisgIHZpcnR1YWwgSUZXTF9BZGFwdGVyTW9uaXRvck1nciogR2V0TW9uaXRvck1ncigpOw0KKyAgdmlydHVhbCBJRldMX0FkYXB0ZXJDbGlwYm9hcmRNZ3IqIEdldENsaXBib2FyZE1ncigpOw0KKyAgQ1hGQV9Gb250TWdyKiBHZXRYRkFGb250TWdyKCk7DQorICBJRlhfRm9udE1nciogR2V0RkRFRm9udE1ncigpOw0KKyAgQ1hGQV9GV0xUaGVtZSogR2V0RldMVGhlbWUoKTsNCisgIElGV0xfV2lkZ2V0TWdyRGVsZWdhdGUqIEdldFdpZGdldE1nckRlbGVnYXRlKCkgew0KKyAgICByZXR1cm4gbV9wV2lkZ2V0TWdyRGVsZWdhdGU7DQorICB9DQorDQorIHByb3RlY3RlZDoNCisgIENYRkFfRkZEb2NIYW5kbGVyKiBtX3BEb2NIYW5kbGVyOw0KKyAgSUZXTF9BcHAqIG1fcEZXTEFwcDsNCisgIENYRkFfRldMVGhlbWUqIG1fcEZXTFRoZW1lOw0KKyAgSVhGQV9BcHBQcm92aWRlciogbV9wUHJvdmlkZXI7DQorICBDWEZBX0ZvbnRNZ3IqIG1fcEZvbnRNZ3I7DQogI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCi0gICAgSUZYX0ZvbnRTb3VyY2VFbnVtKgkJbV9wRm9udFNvdXJjZTsNCisgIElGWF9Gb250U291cmNlRW51bSogbV9wRm9udFNvdXJjZTsNCiAjZW5kaWYNCi0gICAgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyKiBtX3BBZGFwdGVyV2lkZ2V0TWdyOw0KLSAgICBJRldMX1dpZGdldE1nckRlbGVnYXRlKgltX3BXaWRnZXRNZ3JEZWxlZ2F0ZTsNCi0gICAgSUZYX0ZvbnRNZ3IqCQkJbV9wRkRFRm9udE1ncjsNCi0gICAgQ1hGQV9GRk1lbnVIYW5kbGVyKgkJbV9wTWVudUhhbmRsZXI7DQotICAgIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyKiBtX3BBZGFwdGVyVGhyZWFkTWdyOw0KKyAgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyKiBtX3BBZGFwdGVyV2lkZ2V0TWdyOw0KKyAgSUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSogbV9wV2lkZ2V0TWdyRGVsZWdhdGU7DQorICBJRlhfRm9udE1nciogbV9wRkRFRm9udE1ncjsNCisgIENYRkFfRkZNZW51SGFuZGxlciogbV9wTWVudUhhbmRsZXI7DQorICBDRldMX1NEQWRhcHRlclRocmVhZE1nciogbV9wQWRhcHRlclRocmVhZE1ncjsNCiB9Ow0KIA0KICNlbmRpZiAgLy8gWEZBX0ZGQVBQX0hfDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmYmFyY29kZS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZiYXJjb2RlLmNwcAppbmRleCAzYjA0YTI3Li5iNWM2MGIyIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZiYXJjb2RlLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZiYXJjb2RlLmNwcApAQCAtMTIsMTI4ICsxMiwxMjkgQEAKICNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KICNpbmNsdWRlICJ4ZmFfZmZ0ZXh0ZWRpdC5oIg0KICNpbmNsdWRlICJ4ZmFfZmZiYXJjb2RlLmgiDQotc3RhdGljIFhGQV9MUENCQVJDT0RFVFlQRUVOVU1JTkZPIFhGQV9HZXRCYXJjb2RlVHlwZUJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSk7DQotQ1hGQV9GRkJhcmNvZGU6OkNYRkFfRkZCYXJjb2RlKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQotICAgIDogQ1hGQV9GRlRleHRFZGl0KHBQYWdlVmlldywgcERhdGFBY2MpDQotew0KK3N0YXRpYyBYRkFfTFBDQkFSQ09ERVRZUEVFTlVNSU5GTyBYRkFfR2V0QmFyY29kZVR5cGVCeU5hbWUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsNCitDWEZBX0ZGQmFyY29kZTo6Q1hGQV9GRkJhcmNvZGUoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGVGV4dEVkaXQocFBhZ2VWaWV3LCBwRGF0YUFjYykge30NCitDWEZBX0ZGQmFyY29kZTo6fkNYRkFfRkZCYXJjb2RlKCkge30NCitGWF9CT09MIENYRkFfRkZCYXJjb2RlOjpMb2FkV2lkZ2V0KCkgew0KKyAgQ0ZXTF9CYXJjb2RlKiBwRldMQmFyY29kZSA9IENGV0xfQmFyY29kZTo6Q3JlYXRlKCk7DQorICBpZiAocEZXTEJhcmNvZGUpIHsNCisgICAgcEZXTEJhcmNvZGUtPkluaXRpYWxpemUoKTsNCisgIH0NCisgIG1fcE5vcm1hbFdpZGdldCA9IHBGV0xCYXJjb2RlOw0KKyAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCisgIElGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCisgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQsIHBXaWRnZXQpOw0KKyAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICBwRldMQmFyY29kZS0+U2V0VGV4dCh3c1RleHQpOw0KKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQogfQ0KLUNYRkFfRkZCYXJjb2RlOjp+Q1hGQV9GRkJhcmNvZGUoKQ0KLXsNCit2b2lkIENYRkFfRkZCYXJjb2RlOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUpIHsNCisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9NYXRyaXggbXRSb3RhdGU7DQorICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOw0KKyAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KKyAgRHJhd0JvcmRlcihwR1MsIGJvcmRlclVJLCBtX3J0VUksICZtdFJvdGF0ZSk7DQorICBSZW5kZXJDYXB0aW9uKHBHUywgJm10Um90YXRlKTsNCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICBDRlhfTWF0cml4IG10Ow0KKyAgbXQuU2V0KDEsIDAsIDAsIDEsIHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCk7DQorICBtdC5Db25jYXQobXRSb3RhdGUpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5EcmF3V2lkZ2V0KHBHUywgJm10KTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGQmFyY29kZTo6TG9hZFdpZGdldCgpDQotew0KLSAgICBDRldMX0JhcmNvZGUqIHBGV0xCYXJjb2RlID0gQ0ZXTF9CYXJjb2RlOjpDcmVhdGUoKTsNCi0gICAgaWYocEZXTEJhcmNvZGUpCXsNCi0gICAgICAgIHBGV0xCYXJjb2RlLT5Jbml0aWFsaXplKCk7DQotICAgIH0NCi0gICAgbV9wTm9ybWFsV2lkZ2V0ID0gcEZXTEJhcmNvZGU7DQotICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCi0gICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0LCBwV2lkZ2V0KTsNCi0gICAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQotICAgIHBGV0xCYXJjb2RlLT5TZXRUZXh0KHdzVGV4dCk7DQotICAgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQotICAgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit2b2lkIENYRkFfRkZCYXJjb2RlOjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsNCisgIENYRkFfRkZUZXh0RWRpdDo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIENGV0xfQmFyY29kZSogcEJhckNvZGVXaWRnZXQgPSAoQ0ZXTF9CYXJjb2RlKiltX3BOb3JtYWxXaWRnZXQ7DQorICBDRlhfV2lkZVN0cmluZyB3c1R5cGUgPSBHZXREYXRhQWNjKCktPkdldEJhcmNvZGVUeXBlKCk7DQorICBYRkFfTFBDQkFSQ09ERVRZUEVFTlVNSU5GTyBwQmFyY29kZVR5cGVJbmZvID0NCisgICAgICBYRkFfR2V0QmFyY29kZVR5cGVCeU5hbWUod3NUeXBlKTsNCisgIHBCYXJDb2RlV2lkZ2V0LT5TZXRUeXBlKHBCYXJjb2RlVHlwZUluZm8tPmVCQ1R5cGUpOw0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBHZXREYXRhQWNjKCk7DQorICBpbnQzMl90IGludFZhbDsNCisgIEZYX0NIQVIgY2hhclZhbDsNCisgIEZYX0JPT0wgYm9vbFZhbDsNCisgIEZYX0ZMT0FUIGZsb2F0VmFsOw0KKyAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfQ2hhckVuY29kaW5nKGludFZhbCkpIHsNCisgICAgcEJhckNvZGVXaWRnZXQtPlNldENoYXJFbmNvZGluZygoQkNfQ0hBUl9FTkNPRElORylpbnRWYWwpOw0KKyAgfQ0KKyAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfQ2hlY2tzdW0oaW50VmFsKSkgew0KKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0Q2FsQ2hlY2tzdW0oaW50VmFsKTsNCisgIH0NCisgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX0RhdGFMZW5ndGgoaW50VmFsKSkgew0KKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0RGF0YUxlbmd0aChpbnRWYWwpOw0KKyAgfQ0KKyAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfU3RhcnRDaGFyKGNoYXJWYWwpKSB7DQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRTdGFydENoYXIoY2hhclZhbCk7DQorICB9DQorICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9FbmRDaGFyKGNoYXJWYWwpKSB7DQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRFbmRDaGFyKGNoYXJWYWwpOw0KKyAgfQ0KKyAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfRUNMZXZlbChpbnRWYWwpKSB7DQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnRWYWwpOw0KKyAgfQ0KKyAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlV2lkdGgoaW50VmFsKSkgew0KKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0TW9kdWxlV2lkdGgoaW50VmFsKTsNCisgIH0NCisgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX01vZHVsZUhlaWdodChpbnRWYWwpKSB7DQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRNb2R1bGVIZWlnaHQoaW50VmFsKTsNCisgIH0NCisgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX1ByaW50Q2hlY2tzdW0oYm9vbFZhbCkpIHsNCisgICAgcEJhckNvZGVXaWRnZXQtPlNldFByaW50Q2hlY2tzdW0oYm9vbFZhbCk7DQorICB9DQorICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9UZXh0TG9jYXRpb24oaW50VmFsKSkgew0KKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0VGV4dExvY2F0aW9uKChCQ19URVhUX0xPQylpbnRWYWwpOw0KKyAgfQ0KKyAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfVHJ1bmNhdGUoYm9vbFZhbCkpIHsNCisgICAgcEJhckNvZGVXaWRnZXQtPlNldFRydW5jYXRlZChib29sVmFsKTsNCisgIH0NCisgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX1dpZGVOYXJyb3dSYXRpbyhmbG9hdFZhbCkpIHsNCisgICAgcEJhckNvZGVXaWRnZXQtPlNldFdpZGVOYXJyb3dSYXRpbygoaW50MzJfdClmbG9hdFZhbCk7DQorICB9DQorICBpZiAocEJhcmNvZGVUeXBlSW5mby0+ZU5hbWUgPT0gWEZBX0JBUkNPREVUWVBFX2NvZGUzT2Y5IHx8DQorICAgICAgcEJhcmNvZGVUeXBlSW5mby0+ZU5hbWUgPT0gWEZBX0JBUkNPREVUWVBFX2VhbjggfHwNCisgICAgICBwQmFyY29kZVR5cGVJbmZvLT5lTmFtZSA9PSBYRkFfQkFSQ09ERVRZUEVfZWFuMTMgfHwNCisgICAgICBwQmFyY29kZVR5cGVJbmZvLT5lTmFtZSA9PSBYRkFfQkFSQ09ERVRZUEVfdXBjQSkgew0KKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0UHJpbnRDaGVja3N1bShUUlVFKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZGQmFyY29kZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ICwgRlhfRFdPUkQgZHdTdGF0dXMgLCBpbnQzMl90IGlSb3RhdGUgKQ0KLXsNCi0gICAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfTWF0cml4IG10Um90YXRlOw0KLSAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCi0gICAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KLSAgICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlKTsNCi0gICAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQotICAgIENGWF9SZWN0RiBydFdpZGdldDsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCi0gICAgQ0ZYX01hdHJpeCBtdDsNCi0gICAgbXQuU2V0KDEsIDAsIDAsIDEsIHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCk7DQotICAgIG10LkNvbmNhdChtdFJvdGF0ZSk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+RHJhd1dpZGdldChwR1MsICZtdCk7DQorRlhfQk9PTCBDWEZBX0ZGQmFyY29kZTo6T25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgQ0ZXTF9CYXJjb2RlKiBwQmFyQ29kZVdpZGdldCA9IChDRldMX0JhcmNvZGUqKW1fcE5vcm1hbFdpZGdldDsNCisgIGlmICghcEJhckNvZGVXaWRnZXQgfHwgcEJhckNvZGVXaWRnZXQtPklzUHJvdGVjdGVkVHlwZSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBDWEZBX0ZGVGV4dEVkaXQ6Ok9uTEJ1dHRvbkRvd24oZHdGbGFncywgZngsIGZ5KTsNCiB9DQotdm9pZCBDWEZBX0ZGQmFyY29kZTo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKQ0KLXsNCi0gICAgQ1hGQV9GRlRleHRFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KLSAgICBDRldMX0JhcmNvZGUqIHBCYXJDb2RlV2lkZ2V0ID0gKENGV0xfQmFyY29kZSopbV9wTm9ybWFsV2lkZ2V0Ow0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1R5cGUgPSBHZXREYXRhQWNjKCktPkdldEJhcmNvZGVUeXBlKCk7DQotICAgIFhGQV9MUENCQVJDT0RFVFlQRUVOVU1JTkZPIHBCYXJjb2RlVHlwZUluZm8gPSBYRkFfR2V0QmFyY29kZVR5cGVCeU5hbWUod3NUeXBlKTsNCi0gICAgcEJhckNvZGVXaWRnZXQtPlNldFR5cGUocEJhcmNvZGVUeXBlSW5mby0+ZUJDVHlwZSk7DQotICAgIENYRkFfV2lkZ2V0QWNjICpwQWNjID0gR2V0RGF0YUFjYygpOw0KLSAgICBpbnQzMl90IGludFZhbDsNCi0gICAgRlhfQ0hBUiAgY2hhclZhbDsNCi0gICAgRlhfQk9PTCAgYm9vbFZhbDsNCi0gICAgRlhfRkxPQVQgZmxvYXRWYWw7DQotICAgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX0NoYXJFbmNvZGluZyhpbnRWYWwpKSB7DQotICAgICAgICBwQmFyQ29kZVdpZGdldC0+U2V0Q2hhckVuY29kaW5nKChCQ19DSEFSX0VOQ09ESU5HKWludFZhbCk7DQotICAgIH0NCi0gICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfQ2hlY2tzdW0oaW50VmFsKSkgew0KLSAgICAgICAgcEJhckNvZGVXaWRnZXQtPlNldENhbENoZWNrc3VtKGludFZhbCk7DQotICAgIH0NCi0gICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfRGF0YUxlbmd0aChpbnRWYWwpKSB7DQotICAgICAgICBwQmFyQ29kZVdpZGdldC0+U2V0RGF0YUxlbmd0aChpbnRWYWwpOw0KLSAgICB9DQotICAgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX1N0YXJ0Q2hhcihjaGFyVmFsKSkgew0KLSAgICAgICAgcEJhckNvZGVXaWRnZXQtPlNldFN0YXJ0Q2hhcihjaGFyVmFsKTsNCi0gICAgfQ0KLSAgICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9FbmRDaGFyKGNoYXJWYWwpKSB7DQotICAgICAgICBwQmFyQ29kZVdpZGdldC0+U2V0RW5kQ2hhcihjaGFyVmFsKTsNCi0gICAgfQ0KLSAgICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9FQ0xldmVsKGludFZhbCkpIHsNCi0gICAgICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnRWYWwpOw0KLSAgICB9DQotICAgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX01vZHVsZVdpZHRoKGludFZhbCkpIHsNCi0gICAgICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRNb2R1bGVXaWR0aChpbnRWYWwpOw0KLSAgICB9DQotICAgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX01vZHVsZUhlaWdodChpbnRWYWwpKSB7DQotICAgICAgICBwQmFyQ29kZVdpZGdldC0+U2V0TW9kdWxlSGVpZ2h0KGludFZhbCk7DQotICAgIH0NCi0gICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfUHJpbnRDaGVja3N1bShib29sVmFsKSkgew0KLSAgICAgICAgcEJhckNvZGVXaWRnZXQtPlNldFByaW50Q2hlY2tzdW0oYm9vbFZhbCk7DQotICAgIH0NCi0gICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfVGV4dExvY2F0aW9uKGludFZhbCkpIHsNCi0gICAgICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRUZXh0TG9jYXRpb24oKEJDX1RFWFRfTE9DKWludFZhbCk7DQotICAgIH0NCi0gICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfVHJ1bmNhdGUoYm9vbFZhbCkpIHsNCi0gICAgICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRUcnVuY2F0ZWQoYm9vbFZhbCk7DQotICAgIH0NCi0gICAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfV2lkZU5hcnJvd1JhdGlvKGZsb2F0VmFsKSkJew0KLSAgICAgICAgcEJhckNvZGVXaWRnZXQtPlNldFdpZGVOYXJyb3dSYXRpbygoaW50MzJfdClmbG9hdFZhbCk7DQotICAgIH0NCi0gICAgaWYgKHBCYXJjb2RlVHlwZUluZm8tPmVOYW1lID09IFhGQV9CQVJDT0RFVFlQRV9jb2RlM09mOQ0KLSAgICAgICAgICAgIHx8IHBCYXJjb2RlVHlwZUluZm8tPmVOYW1lID09IFhGQV9CQVJDT0RFVFlQRV9lYW44DQotICAgICAgICAgICAgfHwgcEJhcmNvZGVUeXBlSW5mby0+ZU5hbWUgPT0gWEZBX0JBUkNPREVUWVBFX2VhbjEzDQotICAgICAgICAgICAgfHwgcEJhcmNvZGVUeXBlSW5mby0+ZU5hbWUgPT0gWEZBX0JBUkNPREVUWVBFX3VwY0EpIHsNCi0gICAgICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRQcmludENoZWNrc3VtKFRSVUUpOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wJQ1hGQV9GRkJhcmNvZGU6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgQ0ZXTF9CYXJjb2RlKiBwQmFyQ29kZVdpZGdldCA9IChDRldMX0JhcmNvZGUqKW1fcE5vcm1hbFdpZGdldDsNCi0gICAgaWYgKCFwQmFyQ29kZVdpZGdldCB8fCBwQmFyQ29kZVdpZGdldC0+SXNQcm90ZWN0ZWRUeXBlKCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBDWEZBX0ZGVGV4dEVkaXQ6Ok9uTEJ1dHRvbkRvd24oZHdGbGFncywgZngsIGZ5KTsNCi19DQotRlhfQk9PTAlDWEZBX0ZGQmFyY29kZTo6T25SQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBDRldMX0JhcmNvZGUqIHBCYXJDb2RlV2lkZ2V0ID0gKENGV0xfQmFyY29kZSopbV9wTm9ybWFsV2lkZ2V0Ow0KLSAgICBpZiAoIXBCYXJDb2RlV2lkZ2V0IHx8IHBCYXJDb2RlV2lkZ2V0LT5Jc1Byb3RlY3RlZFR5cGUoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUkJ1dHRvbkRvd24oZHdGbGFncywgZngsIGZ5KTsNCitGWF9CT09MIENYRkFfRkZCYXJjb2RlOjpPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBDRldMX0JhcmNvZGUqIHBCYXJDb2RlV2lkZ2V0ID0gKENGV0xfQmFyY29kZSopbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgaWYgKCFwQmFyQ29kZVdpZGdldCB8fCBwQmFyQ29kZVdpZGdldC0+SXNQcm90ZWN0ZWRUeXBlKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIENYRkFfRkZUZXh0RWRpdDo6T25SQnV0dG9uRG93bihkd0ZsYWdzLCBmeCwgZnkpOw0KIH0NCiBleHRlcm4gY29uc3QgWEZBX0JBUkNPREVUWVBFRU5VTUlORk8gZ19YRkFCYXJDb2RlVHlwZUVudW1EYXRhW10gPSB7DQogICAgIHsweDdmYjRhMTgsIEwiZWFuMTMiLCBYRkFfQkFSQ09ERVRZUEVfZWFuMTMsIEJDX0VBTjEzfSwNCkBAIC0xNTcsMjUgKzE1OCwzMCBAQAogICAgIHsweDM5OGVkZGFmLCBMImRhdGFNYXRyaXgiLCBYRkFfQkFSQ09ERVRZUEVfZGF0YU1hdHJpeCwgQkNfREFUQU1BVFJJWH0sDQogICAgIHsweDNjZmY2MGE4LCBMInVwY0VhZGQyIiwgWEZBX0JBUkNPREVUWVBFX3VwY0VhZGQyLCBCQ19VTktOT1dOfSwNCiAgICAgezB4M2NmZjYwYWIsIEwidXBjRWFkZDUiLCBYRkFfQkFSQ09ERVRZUEVfdXBjRWFkZDUsIEJDX1VOS05PV059LA0KLSAgICB7MHg0MDJjYjE4OCwgTCJjb2RlMk9mNVN0YW5kYXJkIiwgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1U3RhbmRhcmQsIEJDX1VOS05PV059LA0KKyAgICB7MHg0MDJjYjE4OCwgTCJjb2RlMk9mNVN0YW5kYXJkIiwgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1U3RhbmRhcmQsDQorICAgICBCQ19VTktOT1dOfSwNCiAgICAgezB4NDExNzY0ZjcsIEwiYXp0ZWMiLCBYRkFfQkFSQ09ERVRZUEVfYXp0ZWMsIEJDX1VOS05PV059LA0KICAgICB7MHg0NGQ0ZTg0YywgTCJlYW44IiwgWEZBX0JBUkNPREVUWVBFX2VhbjgsIEJDX0VBTjh9LA0KICAgICB7MHg0ODQ2ODkwMiwgTCJ1Y2MxMjhzc2NjIiwgWEZBX0JBUkNPREVUWVBFX3VjYzEyOHNzY2MsIEJDX1VOS05PV059LA0KICAgICB7MHg0ODgwYWVhNCwgTCJ1cGNBYWRkMiIsIFhGQV9CQVJDT0RFVFlQRV91cGNBYWRkMiwgQkNfVU5LTk9XTn0sDQogICAgIHsweDQ4ODBhZWE3LCBMInVwY0FhZGQ1IiwgWEZBX0JBUkNPREVUWVBFX3VwY0FhZGQ1LCBCQ19VTktOT1dOfSwNCi0gICAgezB4NTRmMTgyNTYsIEwiY29kZTJPZjVJbmR1c3RyaWFsIiwgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1SW5kdXN0cmlhbCwgQkNfVU5LTk9XTn0sDQorICAgIHsweDU0ZjE4MjU2LCBMImNvZGUyT2Y1SW5kdXN0cmlhbCIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNUluZHVzdHJpYWwsDQorICAgICBCQ19VTktOT1dOfSwNCiAgICAgezB4NThlMTVmMjUsIEwicnNzMTRMaW1pdGVkIiwgWEZBX0JBUkNPREVUWVBFX3JzczE0TGltaXRlZCwgQkNfVU5LTk9XTn0sDQotICAgIHsweDVjMDhkMWI5LCBMInBvc3RBVVNSZXBseVBhaWQiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU1JlcGx5UGFpZCwgQkNfVU5LTk9XTn0sDQorICAgIHsweDVjMDhkMWI5LCBMInBvc3RBVVNSZXBseVBhaWQiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU1JlcGx5UGFpZCwNCisgICAgIEJDX1VOS05PV059LA0KICAgICB7MHg1ZmE3MDBiZCwgTCJyc3MxNCIsIFhGQV9CQVJDT0RFVFlQRV9yc3MxNCwgQkNfVU5LTk9XTn0sDQogICAgIHsweDYzMWE3ZTM1LCBMImxvZ21hcnMiLCBYRkFfQkFSQ09ERVRZUEVfbG9nbWFycywgQkNfVU5LTk9XTn0sDQogICAgIHsweDZhMjM2MjM2LCBMInBkZjQxNyIsIFhGQV9CQVJDT0RFVFlQRV9wZGY0MTcsIEJDX1BERjQxN30sDQogICAgIHsweDZkMDk4ZWNlLCBMInVwY2VhbjIiLCBYRkFfQkFSQ09ERVRZUEVfdXBjZWFuMiwgQkNfVU5LTk9XTn0sDQogICAgIHsweDZkMDk4ZWQxLCBMInVwY2VhbjUiLCBYRkFfQkFSQ09ERVRZUEVfdXBjZWFuNSwgQkNfVU5LTk9XTn0sDQotICAgIHsweDc2YjA0ZWVkLCBMImNvZGUzT2Y5ZXh0ZW5kZWQiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTNPZjlleHRlbmRlZCwgQkNfVU5LTk9XTn0sDQorICAgIHsweDc2YjA0ZWVkLCBMImNvZGUzT2Y5ZXh0ZW5kZWQiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTNPZjlleHRlbmRlZCwNCisgICAgIEJDX1VOS05PV059LA0KICAgICB7MHg3YzdkYjg0YSwgTCJtYXhpY29kZSIsIFhGQV9CQVJDT0RFVFlQRV9tYXhpY29kZSwgQkNfVU5LTk9XTn0sDQogICAgIHsweDgyNjZmN2Y3LCBMInVjYzEyOHJhbmRvbSIsIFhGQV9CQVJDT0RFVFlQRV91Y2MxMjhyYW5kb20sIEJDX1VOS05PV059LA0KICAgICB7MHg4M2VjYTE0NywgTCJwb3N0VVNEUEJDIiwgWEZBX0JBUkNPREVUWVBFX3Bvc3RVU0RQQkMsIEJDX1VOS05PV059LA0KLSAgICB7MHg4ZGQ3MWRlMCwgTCJwb3N0QVVTU3RhbmRhcmQiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU1N0YW5kYXJkLCBCQ19VTktOT1dOfSwNCisgICAgezB4OGRkNzFkZTAsIEwicG9zdEFVU1N0YW5kYXJkIiwgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNTdGFuZGFyZCwNCisgICAgIEJDX1VOS05PV059LA0KICAgICB7MHg5OGFkYWQ4NSwgTCJwbGVzc2V5IiwgWEZBX0JBUkNPREVUWVBFX3BsZXNzZXksIEJDX1VOS05PV059LA0KICAgICB7MHg5Zjg0Y2NlNiwgTCJlYW4xM3B3Y2QiLCBYRkFfQkFSQ09ERVRZUEVfZWFuMTNwd2NkLCBCQ19VTktOT1dOfSwNCiAgICAgezB4YjUxNGZiZTksIEwidXBjQSIsIFhGQV9CQVJDT0RFVFlQRV91cGNBLCBCQ19VUENBfSwNCkBAIC0xODYsNyArMTkyLDggQEAKICAgICB7MHhiYWQzNGIyMiwgTCJjb2RlMTI4U1NDQyIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4U1NDQywgQkNfVU5LTk9XTn0sDQogICAgIHsweGJmYmUwY2Y2LCBMInBvc3RVUzVaaXAiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdFVTNVppcCwgQkNfVU5LTk9XTn0sDQogICAgIHsweGM1NjYxOGU4LCBMInBkZjQxN21hY3JvIiwgWEZBX0JBUkNPREVUWVBFX3BkZjQxN21hY3JvLCBCQ19VTktOT1dOfSwNCi0gICAgezB4Y2E3MzBmOGEsIEwiY29kZTJPZjVJbnRlcmxlYXZlZCIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNUludGVybGVhdmVkLCBCQ19VTktOT1dOfSwNCisgICAgezB4Y2E3MzBmOGEsIEwiY29kZTJPZjVJbnRlcmxlYXZlZCIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNUludGVybGVhdmVkLA0KKyAgICAgQkNfVU5LTk9XTn0sDQogICAgIHsweGQwMDk3YWM2LCBMInJzczE0RXhwYW5kZWQiLCBYRkFfQkFSQ09ERVRZUEVfcnNzMTRFeHBhbmRlZCwgQkNfVU5LTk9XTn0sDQogICAgIHsweGQyNWEwMjQwLCBMInBvc3RBVVNDdXN0MiIsIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTQ3VzdDIsIEJDX1VOS05PV059LA0KICAgICB7MHhkMjVhMDI0MSwgTCJwb3N0QVVTQ3VzdDMiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU0N1c3QzLCBCQ19VTktOT1dOfSwNCkBAIC0xOTQsMzAgKzIwMSwzMiBAQAogICAgIHsweGU3MmJjZDU3LCBMImNvZGUxMjhBIiwgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjhBLCBCQ19VTktOT1dOfSwNCiAgICAgezB4ZTcyYmNkNTgsIEwiY29kZTEyOEIiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOEIsIEJDX0NPREUxMjhfQn0sDQogICAgIHsweGU3MmJjZDU5LCBMImNvZGUxMjhDIiwgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjhDLCBCQ19DT0RFMTI4X0N9LA0KLSAgICB7MHhlZTgzYzUwZiwgTCJyc3MxNFN0YWNrZWRPbW5pIiwgWEZBX0JBUkNPREVUWVBFX3JzczE0U3RhY2tlZE9tbmksIEJDX1VOS05PV059LA0KKyAgICB7MHhlZTgzYzUwZiwgTCJyc3MxNFN0YWNrZWRPbW5pIiwgWEZBX0JBUkNPREVUWVBFX3JzczE0U3RhY2tlZE9tbmksDQorICAgICBCQ19VTktOT1dOfSwNCiAgICAgezB4ZjJhMThmN2UsIEwiUVJDb2RlIiwgWEZBX0JBUkNPREVUWVBFX1FSQ29kZSwgQkNfUVJfQ09ERX0sDQogICAgIHsweGZhZWFmMzdmLCBMInBvc3RVU1N0YW5kYXJkIiwgWEZBX0JBUkNPREVUWVBFX3Bvc3RVU1N0YW5kYXJkLCBCQ19VTktOT1dOfSwNCiAgICAgezB4ZmI0ODE1NWMsIEwiY29kZTNPZjkiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTNPZjksIEJDX0NPREUzOX0sDQogfTsNCi1leHRlcm4gY29uc3QgaW50MzJfdCBnX2lYRkFCYXJjb2RlVHlwZUNvdW50ID0gc2l6ZW9mKGdfWEZBQmFyQ29kZVR5cGVFbnVtRGF0YSkgLyBzaXplb2YoWEZBX0JBUkNPREVUWVBFRU5VTUlORk8pOw0KLXN0YXRpYyBYRkFfTFBDQkFSQ09ERVRZUEVFTlVNSU5GTyBYRkFfR2V0QmFyY29kZVR5cGVCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSB3c05hbWUuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoID09IDApIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCBpTGVuZ3RoLCBUUlVFKTsNCi0gICAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gZ19pWEZBQmFyY29kZVR5cGVDb3VudCAtIDE7DQotICAgIGRvIHsNCi0gICAgICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICBYRkFfTFBDQkFSQ09ERVRZUEVFTlVNSU5GTyBwSW5mbyA9IGdfWEZBQmFyQ29kZVR5cGVFbnVtRGF0YSArIGlNaWQ7DQotICAgICAgICBpZiAodUhhc2ggPT0gcEluZm8tPnVIYXNoKSB7DQotICAgICAgICAgICAgcmV0dXJuIHBJbmZvOw0KLSAgICAgICAgfSBlbHNlIGlmICh1SGFzaCA8IHBJbmZvLT51SGFzaCkgew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCitleHRlcm4gY29uc3QgaW50MzJfdCBnX2lYRkFCYXJjb2RlVHlwZUNvdW50ID0NCisgICAgc2l6ZW9mKGdfWEZBQmFyQ29kZVR5cGVFbnVtRGF0YSkgLyBzaXplb2YoWEZBX0JBUkNPREVUWVBFRU5VTUlORk8pOw0KK3N0YXRpYyBYRkFfTFBDQkFSQ09ERVRZUEVFTlVNSU5GTyBYRkFfR2V0QmFyY29kZVR5cGVCeU5hbWUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSB3c05hbWUuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA9PSAwKSB7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIGlMZW5ndGgsIFRSVUUpOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gZ19pWEZBQmFyY29kZVR5cGVDb3VudCAtIDE7DQorICBkbyB7DQorICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIFhGQV9MUENCQVJDT0RFVFlQRUVOVU1JTkZPIHBJbmZvID0gZ19YRkFCYXJDb2RlVHlwZUVudW1EYXRhICsgaU1pZDsNCisgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgIHJldHVybiBwSW5mbzsNCisgICAgfSBlbHNlIGlmICh1SGFzaCA8IHBJbmZvLT51SGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmJhcmNvZGUuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmJhcmNvZGUuaAppbmRleCAyMGFlOWMyLi5kZjM4MzQzIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZiYXJjb2RlLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmYmFyY29kZS5oCkBAIC03LDg3ICs3LDg5IEBACiAjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfQkFSQ09ERV9JTVBfSA0KICNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9CQVJDT0RFX0lNUF9IDQogY2xhc3MgQ1hGQV9GRlRleHRFZGl0Ow0KLWNsYXNzIENYRkFfRkZCYXJjb2RlIDogcHVibGljIENYRkFfRkZUZXh0RWRpdA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZCYXJjb2RlKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZGQmFyY29kZSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJTG9hZFdpZGdldCgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLCBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCi0gICAgdmlydHVhbCB2b2lkCVVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorY2xhc3MgQ1hGQV9GRkJhcmNvZGUgOiBwdWJsaWMgQ1hGQV9GRlRleHRFZGl0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkJhcmNvZGUoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGQmFyY29kZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cyA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCiB9Ow0KIGVudW0gWEZBX0JBUkNPREVUWVBFRU5VTSB7DQotICAgIFhGQV9CQVJDT0RFVFlQRV9henRlYywNCi0gICAgWEZBX0JBUkNPREVUWVBFX2NvZGFiYXIsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTEsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4LA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOEEsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4QiwNCi0gICAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjhDLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOFNTQ0MsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNUluZHVzdHJpYWwsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNUludGVybGVhdmVkLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfY29kZTJPZjVNYXRyaXgsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNVN0YW5kYXJkLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfY29kZTNPZjksDQotICAgIFhGQV9CQVJDT0RFVFlQRV9jb2RlM09mOWV4dGVuZGVkLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfY29kZTQ5LA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfY29kZTkzLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfZGF0YU1hdHJpeCwNCi0gICAgWEZBX0JBUkNPREVUWVBFX2VhbjEzLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfZWFuMTNhZGQyLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfZWFuMTNhZGQ1LA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfZWFuMTNwd2NkLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfZWFuOCwNCi0gICAgWEZBX0JBUkNPREVUWVBFX2VhbjhhZGQyLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfZWFuOGFkZDUsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9maW0sDQotICAgIFhGQV9CQVJDT0RFVFlQRV9sb2dtYXJzLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfbWF4aWNvZGUsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9tc2ksDQotICAgIFhGQV9CQVJDT0RFVFlQRV9wZGY0MTcsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9wZGY0MTdtYWNybywNCi0gICAgWEZBX0JBUkNPREVUWVBFX3BsZXNzZXksDQotICAgIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTQ3VzdDIsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTQ3VzdDMsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTUmVwbHlQYWlkLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU1N0YW5kYXJkLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfcG9zdFVLUk00U0NDLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfcG9zdFVTNVppcCwNCi0gICAgWEZBX0JBUkNPREVUWVBFX3Bvc3RVU0RQQkMsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVNJTUIsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVNTdGFuZGFyZCwNCi0gICAgWEZBX0JBUkNPREVUWVBFX1FSQ29kZSwNCi0gICAgWEZBX0JBUkNPREVUWVBFX3JmaWQsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9yc3MxNCwNCi0gICAgWEZBX0JBUkNPREVUWVBFX3JzczE0RXhwYW5kZWQsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9yc3MxNExpbWl0ZWQsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9yc3MxNFN0YWNrZWQsDQotICAgIFhGQV9CQVJDT0RFVFlQRV9yc3MxNFN0YWNrZWRPbW5pLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfcnNzMTRUcnVuY2F0ZWQsDQotICAgIFhGQV9CQVJDT0RFVFlQRV90ZWxlcGVuLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfdWNjMTI4LA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfdWNjMTI4cmFuZG9tLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfdWNjMTI4c3NjYywNCi0gICAgWEZBX0JBUkNPREVUWVBFX3VwY0EsDQotICAgIFhGQV9CQVJDT0RFVFlQRV91cGNBYWRkMiwNCi0gICAgWEZBX0JBUkNPREVUWVBFX3VwY0FhZGQ1LA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfdXBjQXB3Y2QsDQotICAgIFhGQV9CQVJDT0RFVFlQRV91cGNFLA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfdXBjRWFkZDIsDQotICAgIFhGQV9CQVJDT0RFVFlQRV91cGNFYWRkNSwNCi0gICAgWEZBX0JBUkNPREVUWVBFX3VwY2VhbjIsDQotICAgIFhGQV9CQVJDT0RFVFlQRV91cGNlYW41LA0KLSAgICBYRkFfQkFSQ09ERVRZUEVfdXBzTWF4aWNvZGUNCisgIFhGQV9CQVJDT0RFVFlQRV9henRlYywNCisgIFhGQV9CQVJDT0RFVFlQRV9jb2RhYmFyLA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMSwNCisgIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4LA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjhBLA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjhCLA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjhDLA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjhTU0NDLA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1SW5kdXN0cmlhbCwNCisgIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNUludGVybGVhdmVkLA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1TWF0cml4LA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1U3RhbmRhcmQsDQorICBYRkFfQkFSQ09ERVRZUEVfY29kZTNPZjksDQorICBYRkFfQkFSQ09ERVRZUEVfY29kZTNPZjlleHRlbmRlZCwNCisgIFhGQV9CQVJDT0RFVFlQRV9jb2RlNDksDQorICBYRkFfQkFSQ09ERVRZUEVfY29kZTkzLA0KKyAgWEZBX0JBUkNPREVUWVBFX2RhdGFNYXRyaXgsDQorICBYRkFfQkFSQ09ERVRZUEVfZWFuMTMsDQorICBYRkFfQkFSQ09ERVRZUEVfZWFuMTNhZGQyLA0KKyAgWEZBX0JBUkNPREVUWVBFX2VhbjEzYWRkNSwNCisgIFhGQV9CQVJDT0RFVFlQRV9lYW4xM3B3Y2QsDQorICBYRkFfQkFSQ09ERVRZUEVfZWFuOCwNCisgIFhGQV9CQVJDT0RFVFlQRV9lYW44YWRkMiwNCisgIFhGQV9CQVJDT0RFVFlQRV9lYW44YWRkNSwNCisgIFhGQV9CQVJDT0RFVFlQRV9maW0sDQorICBYRkFfQkFSQ09ERVRZUEVfbG9nbWFycywNCisgIFhGQV9CQVJDT0RFVFlQRV9tYXhpY29kZSwNCisgIFhGQV9CQVJDT0RFVFlQRV9tc2ksDQorICBYRkFfQkFSQ09ERVRZUEVfcGRmNDE3LA0KKyAgWEZBX0JBUkNPREVUWVBFX3BkZjQxN21hY3JvLA0KKyAgWEZBX0JBUkNPREVUWVBFX3BsZXNzZXksDQorICBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU0N1c3QyLA0KKyAgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNDdXN0MywNCisgIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTUmVwbHlQYWlkLA0KKyAgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNTdGFuZGFyZCwNCisgIFhGQV9CQVJDT0RFVFlQRV9wb3N0VUtSTTRTQ0MsDQorICBYRkFfQkFSQ09ERVRZUEVfcG9zdFVTNVppcCwNCisgIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVNEUEJDLA0KKyAgWEZBX0JBUkNPREVUWVBFX3Bvc3RVU0lNQiwNCisgIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVNTdGFuZGFyZCwNCisgIFhGQV9CQVJDT0RFVFlQRV9RUkNvZGUsDQorICBYRkFfQkFSQ09ERVRZUEVfcmZpZCwNCisgIFhGQV9CQVJDT0RFVFlQRV9yc3MxNCwNCisgIFhGQV9CQVJDT0RFVFlQRV9yc3MxNEV4cGFuZGVkLA0KKyAgWEZBX0JBUkNPREVUWVBFX3JzczE0TGltaXRlZCwNCisgIFhGQV9CQVJDT0RFVFlQRV9yc3MxNFN0YWNrZWQsDQorICBYRkFfQkFSQ09ERVRZUEVfcnNzMTRTdGFja2VkT21uaSwNCisgIFhGQV9CQVJDT0RFVFlQRV9yc3MxNFRydW5jYXRlZCwNCisgIFhGQV9CQVJDT0RFVFlQRV90ZWxlcGVuLA0KKyAgWEZBX0JBUkNPREVUWVBFX3VjYzEyOCwNCisgIFhGQV9CQVJDT0RFVFlQRV91Y2MxMjhyYW5kb20sDQorICBYRkFfQkFSQ09ERVRZUEVfdWNjMTI4c3NjYywNCisgIFhGQV9CQVJDT0RFVFlQRV91cGNBLA0KKyAgWEZBX0JBUkNPREVUWVBFX3VwY0FhZGQyLA0KKyAgWEZBX0JBUkNPREVUWVBFX3VwY0FhZGQ1LA0KKyAgWEZBX0JBUkNPREVUWVBFX3VwY0Fwd2NkLA0KKyAgWEZBX0JBUkNPREVUWVBFX3VwY0UsDQorICBYRkFfQkFSQ09ERVRZUEVfdXBjRWFkZDIsDQorICBYRkFfQkFSQ09ERVRZUEVfdXBjRWFkZDUsDQorICBYRkFfQkFSQ09ERVRZUEVfdXBjZWFuMiwNCisgIFhGQV9CQVJDT0RFVFlQRV91cGNlYW41LA0KKyAgWEZBX0JBUkNPREVUWVBFX3Vwc01heGljb2RlDQogfTsNCiBzdHJ1Y3QgWEZBX0JBUkNPREVUWVBFRU5VTUlORk8gew0KLSAgICB1aW50MzJfdAkJCQkJdUhhc2g7DQotICAgIGNvbnN0IEZYX1dDSEFSKgkJCQkJcE5hbWU7DQotICAgIFhGQV9CQVJDT0RFVFlQRUVOVU0JCQllTmFtZTsNCi0gICAgQkNfVFlQRQkJCQkJCWVCQ1R5cGU7DQorICB1aW50MzJfdCB1SGFzaDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsNCisgIFhGQV9CQVJDT0RFVFlQRUVOVU0gZU5hbWU7DQorICBCQ19UWVBFIGVCQ1R5cGU7DQogfTsNCi10eXBlZGVmIFhGQV9CQVJDT0RFVFlQRUVOVU1JTkZPIGNvbnN0ICogWEZBX0xQQ0JBUkNPREVUWVBFRU5VTUlORk87DQordHlwZWRlZiBYRkFfQkFSQ09ERVRZUEVFTlVNSU5GTyBjb25zdCogWEZBX0xQQ0JBUkNPREVUWVBFRU5VTUlORk87DQogZXh0ZXJuIGNvbnN0IFhGQV9CQVJDT0RFVFlQRUVOVU1JTkZPIGdfWEZBQmFyQ29kZVR5cGVFbnVtRGF0YVtdOw0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmNwcAppbmRleCAzY2IzNjI4Li40N2VlY2JjIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hlY2tidXR0b24uY3BwCkBAIC0xNCwzMjggKzE0LDMyMCBAQAogI2luY2x1ZGUgInhmYV9mZmRvY3ZpZXcuaCINCiAjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQogI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KLUNYRkFfRkZDaGVja0J1dHRvbjo6Q1hGQV9GRkNoZWNrQnV0dG9uKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQotICAgIDogQ1hGQV9GRkZpZWxkKHBQYWdlVmlldywgcERhdGFBY2MpDQotICAgICwgbV9wT2xkRGVsZWdhdGUoTlVMTCkNCi17DQotICAgIG1fcnRDaGVja0JveC5TZXQoMCwgMCwgMCwgMCk7DQorQ1hGQV9GRkNoZWNrQnV0dG9uOjpDWEZBX0ZGQ2hlY2tCdXR0b24oQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZGaWVsZChwUGFnZVZpZXcsIHBEYXRhQWNjKSwgbV9wT2xkRGVsZWdhdGUoTlVMTCkgew0KKyAgbV9ydENoZWNrQm94LlNldCgwLCAwLCAwLCAwKTsNCiB9DQotQ1hGQV9GRkNoZWNrQnV0dG9uOjp+Q1hGQV9GRkNoZWNrQnV0dG9uKCkNCi17DQorQ1hGQV9GRkNoZWNrQnV0dG9uOjp+Q1hGQV9GRkNoZWNrQnV0dG9uKCkge30NCitGWF9CT09MIENYRkFfRkZDaGVja0J1dHRvbjo6TG9hZFdpZGdldCgpIHsNCisgIENGV0xfQ2hlY2tCb3gqIHBDaGVja0JveCA9IENGV0xfQ2hlY2tCb3g6OkNyZWF0ZSgpOw0KKyAgcENoZWNrQm94LT5Jbml0aWFsaXplKCk7DQorICBtX3BOb3JtYWxXaWRnZXQgPSBwQ2hlY2tCb3g7DQorICBJRldMX1dpZGdldCogcFdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocFdpZGdldCwgcFdpZGdldCk7DQorICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICBpZiAobV9wRGF0YUFjYy0+SXNSYWRpb0J1dHRvbigpKSB7DQorICAgIHBDaGVja0JveC0+TW9kaWZ5U3R5bGVzRXgoRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbiwgMHhGRkZGRkZGRik7DQorICB9DQorICBtX3BOb3JtYWxXaWRnZXQgPSAoQ0ZXTF9XaWRnZXQqKXBDaGVja0JveDsNCisgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgdGhpcywgTlVMTCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCisgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICBYRkFfQ0hFQ0tTVEFURSBlU3RhdGUgPSBtX3BEYXRhQWNjLT5HZXRDaGVja1N0YXRlKCk7DQorICBTZXRGV0xDaGVja1N0YXRlKGVTdGF0ZSk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOw0KKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KIH0NCi1GWF9CT09MIENYRkFfRkZDaGVja0J1dHRvbjo6TG9hZFdpZGdldCgpDQotew0KLSAgICBDRldMX0NoZWNrQm94KiBwQ2hlY2tCb3ggPSBDRldMX0NoZWNrQm94OjpDcmVhdGUoKTsNCi0gICAgcENoZWNrQm94LT5Jbml0aWFsaXplKCk7DQotICAgIG1fcE5vcm1hbFdpZGdldCA9IHBDaGVja0JveDsNCi0gICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBXaWRnZXQsIHRoaXMsIE5VTEwpOw0KLSAgICBJRldMX05vdGVEcml2ZXIgKnBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQotICAgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQsIHBXaWRnZXQpOw0KLSAgICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQotICAgIGlmIChtX3BEYXRhQWNjLT5Jc1JhZGlvQnV0dG9uKCkpIHsNCi0gICAgICAgIHBDaGVja0JveC0+TW9kaWZ5U3R5bGVzRXgoRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbiwgMHhGRkZGRkZGRik7DQotICAgIH0NCi0gICAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwQ2hlY2tCb3g7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgdGhpcywgTlVMTCk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KLSAgICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KLSAgICBYRkFfQ0hFQ0tTVEFURSBlU3RhdGUgPSBtX3BEYXRhQWNjLT5HZXRDaGVja1N0YXRlKCk7DQotICAgIFNldEZXTENoZWNrU3RhdGUoZVN0YXRlKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsNCi0gICAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KK3ZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsNCisgIENGV0xfQ2hlY2tCb3gqIHBDaGVja0JveCA9IChDRldMX0NoZWNrQm94KiltX3BOb3JtYWxXaWRnZXQ7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCBmU2l6ZSA9IG1fcERhdGFBY2MtPkdldENoZWNrQnV0dG9uU2l6ZSgpOw0KKyAgcENoZWNrQm94LT5TZXRCb3hTaXplKGZTaXplKTsNCisgIEZYX0RXT1JEIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ3Jvc3M7DQorICBpbnQzMl90IGlDaGVja01hcmsgPSBtX3BEYXRhQWNjLT5HZXRDaGVja0J1dHRvbk1hcmsoKTsNCisgIHN3aXRjaCAoaUNoZWNrTWFyaykgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NoZWNrOg0KKyAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2hlY2s7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2lyY2xlOg0KKyAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2lyY2xlOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzOg0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RpYW1vbmQ6DQorICAgICAgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVEaWFtb25kOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZToNCisgICAgICBkd1N0eWxlRXggPSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVNxdWFyZTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9TdGFyOg0KKyAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlU3RhcjsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDogew0KKyAgICAgIGludDMyX3QgaVNoYXBlID0gbV9wRGF0YUFjYy0+R2V0Q2hlY2tCdXR0b25TaGFwZSgpOw0KKyAgICAgIGlmIChpU2hhcGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm91bmQpIHsNCisgICAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2lyY2xlOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgIH0NCisgIGlmIChtX3BEYXRhQWNjLT5Jc0FsbG93TmV1dHJhbCgpKSB7DQorICAgIGR3U3R5bGVFeCB8PSBGV0xfU1RZTEVFWFRfQ0tCXzNTdGF0ZTsNCisgIH0NCisgIHBDaGVja0JveC0+TW9kaWZ5U3R5bGVzRXgoDQorICAgICAgZHdTdHlsZUV4LCBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZU1hc2sgfCBGV0xfU1RZTEVFWFRfQ0tCXzNTdGF0ZSk7DQogfQ0KLXZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpDQotew0KLSAgICBDRldMX0NoZWNrQm94KiBwQ2hlY2tCb3ggPSAoQ0ZXTF9DaGVja0JveCopbV9wTm9ybWFsV2lkZ2V0Ow0KLSAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuOw0KK0ZYX0JPT0wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpMYXlvdXRXaWRnZXQoKSB7DQorICBDWEZBX0ZGV2lkZ2V0OjpMYXlvdXRXaWRnZXQoKTsNCisgIEZYX0ZMT0FUIGZDaGVja1NpemUgPSBtX3BEYXRhQWNjLT5HZXRDaGVja0J1dHRvblNpemUoKTsNCisgIENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCk7DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydFdpZGdldCk7DQorICBpZiAobWdXaWRnZXQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihydFdpZGdldCwgbWdXaWRnZXQpOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ2FwUGxhY2VtZW50ID0gLTE7DQorICBGWF9GTE9BVCBmQ2FwUmVzZXJ2ZSA9IDA7DQorICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsNCisgIGlmIChjYXB0aW9uLklzRXhpc3RJblhNTCgpICYmIGNhcHRpb24uR2V0UHJlc2VuY2UoKSkgew0KKyAgICBtX3J0Q2FwdGlvbi5TZXQocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LmhlaWdodCk7DQorICAgIGlDYXBQbGFjZW1lbnQgPSBjYXB0aW9uLkdldFBsYWNlbWVudFR5cGUoKTsNCisgICAgZkNhcFJlc2VydmUgPSBjYXB0aW9uLkdldFJlc2VydmUoKTsNCisgICAgaWYgKGZDYXBSZXNlcnZlIDw9IDApIHsNCisgICAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ub3AgfHwNCisgICAgICAgICAgaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20pIHsNCisgICAgICAgIGZDYXBSZXNlcnZlID0gcnRXaWRnZXQuaGVpZ2h0IC0gZkNoZWNrU2l6ZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZkNhcFJlc2VydmUgPSBydFdpZGdldC53aWR0aCAtIGZDaGVja1NpemU7DQorICAgICAgfQ0KICAgICB9DQotICAgIEZYX0ZMT0FUIGZTaXplID0gbV9wRGF0YUFjYy0+R2V0Q2hlY2tCdXR0b25TaXplKCk7DQotICAgIHBDaGVja0JveC0+U2V0Qm94U2l6ZShmU2l6ZSk7DQotICAgIEZYX0RXT1JEIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ3Jvc3M7DQotICAgIGludDMyX3QgaUNoZWNrTWFyayA9IG1fcERhdGFBY2MtPkdldENoZWNrQnV0dG9uTWFyaygpOw0KLSAgICBzd2l0Y2goaUNoZWNrTWFyaykgew0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DaGVjazoNCi0gICAgICAgICAgICBkd1N0eWxlRXggPSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNoZWNrOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DaXJjbGU6DQotICAgICAgICAgICAgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaXJjbGU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzOg0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EaWFtb25kOg0KLSAgICAgICAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlRGlhbW9uZDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlOg0KLSAgICAgICAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlU3F1YXJlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9TdGFyOg0KLSAgICAgICAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlU3RhcjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpU2hhcGUgPSBtX3BEYXRhQWNjLT5HZXRDaGVja0J1dHRvblNoYXBlKCk7DQotICAgICAgICAgICAgICAgIGlmIChpU2hhcGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm91bmQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2lyY2xlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaW50MzJfdCBpSG9yekFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdDsNCisgIGludDMyX3QgaVZlcnRBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsNCisgIGlmIChDWEZBX1BhcmEgcGFyYSA9IG1fcERhdGFBY2MtPkdldFBhcmEoKSkgew0KKyAgICBpSG9yekFsaWduID0gcGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKTsNCisgICAgaVZlcnRBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KKyAgfQ0KKyAgbV9ydFVJID0gcnRXaWRnZXQ7DQorICBDWEZBX01hcmdpbiBtZ0NhcCA9IGNhcHRpb24uR2V0TWFyZ2luKCk7DQorICBzd2l0Y2ggKGlDYXBQbGFjZW1lbnQpIHsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0OiB7DQorICAgICAgbV9ydENhcHRpb24ud2lkdGggPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQobWdDYXApOw0KKyAgICAgIG1fcnRVSS53aWR0aCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBtX3J0VUkubGVmdCArPSBmQ2FwUmVzZXJ2ZTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6IHsNCisgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ0NhcCk7DQorICAgICAgbV9ydFVJLmhlaWdodCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBtX3J0VUkudG9wICs9IGZDYXBSZXNlcnZlOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OiB7DQorICAgICAgbV9ydENhcHRpb24ubGVmdCA9IG1fcnRDYXB0aW9uLnJpZ2h0KCkgLSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBtX3J0Q2FwdGlvbi53aWR0aCA9IGZDYXBSZXNlcnZlOw0KKyAgICAgIENhcExlZnRSaWdodFBsYWNlbWVudChtZ0NhcCk7DQorICAgICAgbV9ydFVJLndpZHRoIC09IGZDYXBSZXNlcnZlOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogew0KKyAgICAgIG1fcnRDYXB0aW9uLnRvcCA9IG1fcnRDYXB0aW9uLmJvdHRvbSgpIC0gZkNhcFJlc2VydmU7DQorICAgICAgbV9ydENhcHRpb24uaGVpZ2h0ID0gZkNhcFJlc2VydmU7DQorICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihtX3J0Q2FwdGlvbiwgbWdDYXApOw0KKyAgICAgIG1fcnRVSS5oZWlnaHQgLT0gZkNhcFJlc2VydmU7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lOg0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGlIb3J6QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDsNCisgICAgICBicmVhazsNCisgIH0NCisgIGlmIChpSG9yekFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcikgew0KKyAgICBtX3J0VUkubGVmdCArPSAobV9ydFVJLndpZHRoIC0gZkNoZWNrU2l6ZSkgLyAyOw0KKyAgfSBlbHNlIGlmIChpSG9yekFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgIG1fcnRVSS5sZWZ0ID0gbV9ydFVJLnJpZ2h0KCkgLSBmQ2hlY2tTaXplOw0KKyAgfQ0KKyAgaWYgKGlWZXJ0QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlKSB7DQorICAgIG1fcnRVSS50b3AgKz0gKG1fcnRVSS5oZWlnaHQgLSBmQ2hlY2tTaXplKSAvIDI7DQorICB9IGVsc2UgaWYgKGlWZXJ0QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQorICAgIG1fcnRVSS50b3AgPSBtX3J0VUkuYm90dG9tKCkgLSBmQ2hlY2tTaXplOw0KKyAgfQ0KKyAgbV9ydFVJLndpZHRoID0gZkNoZWNrU2l6ZTsNCisgIG1fcnRVSS5oZWlnaHQgPSBmQ2hlY2tTaXplOw0KKyAgQWRkVUlNYXJnaW4oaUNhcFBsYWNlbWVudCk7DQorICBtX3J0Q2hlY2tCb3ggPSBtX3J0VUk7DQorICBDWEZBX0JvcmRlciBib3JkZXJVSSA9IG1fcERhdGFBY2MtPkdldFVJQm9yZGVyKCk7DQorICBpZiAoYm9yZGVyVUkpIHsNCisgICAgQ1hGQV9NYXJnaW4gbWFyZ2luID0gYm9yZGVyVUkuR2V0TWFyZ2luKCk7DQorICAgIGlmIChtYXJnaW4uSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRVSSwgbWFyZ2luKTsNCiAgICAgfQ0KLSAgICBpZiAobV9wRGF0YUFjYy0+SXNBbGxvd05ldXRyYWwoKSkgew0KLSAgICAgICAgZHdTdHlsZUV4IHw9IEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlOw0KLSAgICB9DQotICAgIHBDaGVja0JveC0+TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZUV4LCBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZU1hc2sgfCBGV0xfU1RZTEVFWFRfQ0tCXzNTdGF0ZSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpMYXlvdXRXaWRnZXQoKQ0KLXsNCi0gICAgQ1hGQV9GRldpZGdldDo6TGF5b3V0V2lkZ2V0KCk7DQotICAgIEZYX0ZMT0FUIGZDaGVja1NpemUgPSBtX3BEYXRhQWNjLT5HZXRDaGVja0J1dHRvblNpemUoKTsNCi0gICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KLSAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydFdpZGdldCk7DQotICAgIGlmIChtZ1dpZGdldC5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihydFdpZGdldCwgbWdXaWRnZXQpOw0KLSAgICB9DQotICAgIGludDMyX3QgaUNhcFBsYWNlbWVudCA9IC0xOw0KLSAgICBGWF9GTE9BVCBmQ2FwUmVzZXJ2ZSA9IDA7DQotICAgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvbigpOw0KLSAgICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJiBjYXB0aW9uLkdldFByZXNlbmNlKCkpIHsNCi0gICAgICAgIG1fcnRDYXB0aW9uLlNldChydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIHJ0V2lkZ2V0LndpZHRoLCBydFdpZGdldC5oZWlnaHQpOw0KLSAgICAgICAgaUNhcFBsYWNlbWVudCA9IGNhcHRpb24uR2V0UGxhY2VtZW50VHlwZSgpOw0KLSAgICAgICAgZkNhcFJlc2VydmUgPSBjYXB0aW9uLkdldFJlc2VydmUoKTsNCi0gICAgICAgIGlmIChmQ2FwUmVzZXJ2ZSA8PSAwKSB7DQotICAgICAgICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVG9wIHx8IGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQotICAgICAgICAgICAgICAgIGZDYXBSZXNlcnZlID0gcnRXaWRnZXQuaGVpZ2h0IC0gZkNoZWNrU2l6ZTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBmQ2FwUmVzZXJ2ZSA9IHJ0V2lkZ2V0LndpZHRoIC0gZkNoZWNrU2l6ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBpSG9yekFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdDsNCi0gICAgaW50MzJfdCBpVmVydEFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fVG9wOw0KLSAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBtX3BEYXRhQWNjLT5HZXRQYXJhKCkpIHsNCi0gICAgICAgIGlIb3J6QWxpZ24gPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KLSAgICAgICAgaVZlcnRBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KLSAgICB9DQotICAgIG1fcnRVSSA9IHJ0V2lkZ2V0Ow0KLSAgICBDWEZBX01hcmdpbiBtZ0NhcCA9IGNhcHRpb24uR2V0TWFyZ2luKCk7DQotICAgIHN3aXRjaChpQ2FwUGxhY2VtZW50KSB7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6IHsNCi0gICAgICAgICAgICAgICAgbV9ydENhcHRpb24ud2lkdGggPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICAgICAgQ2FwTGVmdFJpZ2h0UGxhY2VtZW50KG1nQ2FwKTsNCi0gICAgICAgICAgICAgICAgbV9ydFVJLndpZHRoIC09IGZDYXBSZXNlcnZlOw0KLSAgICAgICAgICAgICAgICBtX3J0VUkubGVmdCArPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDogew0KLSAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihtX3J0Q2FwdGlvbiwgbWdDYXApOw0KLSAgICAgICAgICAgICAgICBtX3J0VUkuaGVpZ2h0IC09IGZDYXBSZXNlcnZlOw0KLSAgICAgICAgICAgICAgICBtX3J0VUkudG9wICs9IGZDYXBSZXNlcnZlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6IHsNCi0gICAgICAgICAgICAgICAgbV9ydENhcHRpb24ubGVmdCA9IG1fcnRDYXB0aW9uLnJpZ2h0KCkgLSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICAgICAgbV9ydENhcHRpb24ud2lkdGggPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICAgICAgQ2FwTGVmdFJpZ2h0UGxhY2VtZW50KG1nQ2FwKTsNCi0gICAgICAgICAgICAgICAgbV9ydFVJLndpZHRoIC09IGZDYXBSZXNlcnZlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOiB7DQotICAgICAgICAgICAgICAgIG1fcnRDYXB0aW9uLnRvcCA9IG1fcnRDYXB0aW9uLmJvdHRvbSgpIC0gZkNhcFJlc2VydmU7DQotICAgICAgICAgICAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZDYXBSZXNlcnZlOw0KLSAgICAgICAgICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ0NhcCk7DQotICAgICAgICAgICAgICAgIG1fcnRVSS5oZWlnaHQgLT0gZkNhcFJlc2VydmU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9JbmxpbmU6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGlIb3J6QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBpZiAoaUhvcnpBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXIpIHsNCi0gICAgICAgIG1fcnRVSS5sZWZ0ICs9IChtX3J0VUkud2lkdGggLSBmQ2hlY2tTaXplKSAvIDI7DQotICAgIH0gZWxzZSBpZiAoaUhvcnpBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KLSAgICAgICAgbV9ydFVJLmxlZnQgPSBtX3J0VUkucmlnaHQoKSAtIGZDaGVja1NpemU7DQotICAgIH0NCi0gICAgaWYgKGlWZXJ0QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlKSB7DQotICAgICAgICBtX3J0VUkudG9wICs9IChtX3J0VUkuaGVpZ2h0IC0gZkNoZWNrU2l6ZSkgLyAyOw0KLSAgICB9IGVsc2UgaWYgKGlWZXJ0QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQotICAgICAgICBtX3J0VUkudG9wID0gbV9ydFVJLmJvdHRvbSgpIC0gZkNoZWNrU2l6ZTsNCi0gICAgfQ0KLSAgICBtX3J0VUkud2lkdGggPSBmQ2hlY2tTaXplOw0KLSAgICBtX3J0VUkuaGVpZ2h0ID0gZkNoZWNrU2l6ZTsNCi0gICAgQWRkVUlNYXJnaW4oaUNhcFBsYWNlbWVudCk7DQotICAgIG1fcnRDaGVja0JveCA9IG1fcnRVSTsNCi0gICAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KLSAgICBpZiAoYm9yZGVyVUkpIHsNCi0gICAgICAgIENYRkFfTWFyZ2luIG1hcmdpbiA9IGJvcmRlclVJLkdldE1hcmdpbigpOw0KLSAgICAgICAgaWYgKG1hcmdpbi5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydFVJLCBtYXJnaW4pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fcnRVSS5Ob3JtYWxpemUoKTsNCi0gICAgTGF5b3V0Q2FwdGlvbigpOw0KLSAgICBTZXRGV0xSZWN0KCk7DQotICAgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoQ1hGQV9NYXJnaW4gbWdDYXApDQotew0KLSAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ0NhcCk7DQotICAgIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCAwKSB7DQotICAgICAgICBtX3J0Q2FwdGlvbi50b3AgKz0gbV9ydENhcHRpb24uaGVpZ2h0Ow0KLSAgICB9DQotICAgIGlmIChtX3J0Q2FwdGlvbi53aWR0aCA8IDApIHsNCi0gICAgICAgIG1fcnRDYXB0aW9uLmxlZnQgKz0gbV9ydENhcHRpb24ud2lkdGg7DQotICAgICAgICBtX3J0Q2FwdGlvbi53aWR0aCA9IC1tX3J0Q2FwdGlvbi53aWR0aDsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRkZDaGVja0J1dHRvbjo6QWRkVUlNYXJnaW4oaW50MzJfdCBpQ2FwUGxhY2VtZW50KQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW47DQotICAgIG1fcERhdGFBY2MtPkdldFVJTWFyZ2luKHJ0VUlNYXJnaW4pOw0KLSAgICBtX3J0VUkudG9wIC09IHJ0VUlNYXJnaW4udG9wIC8gMiAtIHJ0VUlNYXJnaW4uaGVpZ2h0IC8gMjsNCi0gICAgRlhfRkxPQVQgZkxlZnRBZGRSaWdodCA9IHJ0VUlNYXJnaW4ubGVmdCArIHJ0VUlNYXJnaW4ud2lkdGg7DQotICAgIEZYX0ZMT0FUIGZUb3BBZGRCb3R0b20gPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KLSAgICBpZiAobV9ydFVJLndpZHRoIDwgZkxlZnRBZGRSaWdodCkgew0KLSAgICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQgfHwgaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0KSB7DQotICAgICAgICAgICAgbV9ydFVJLmxlZnQgLT0gZkxlZnRBZGRSaWdodCAtIG1fcnRVSS53aWR0aDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9ydFVJLmxlZnQgLT0gMiAqIChmTGVmdEFkZFJpZ2h0IC0gbV9ydFVJLndpZHRoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcnRVSS53aWR0aCArPSAyICogKGZMZWZ0QWRkUmlnaHQgLSBtX3J0VUkud2lkdGgpOw0KLSAgICB9DQotICAgIGlmIChtX3J0VUkuaGVpZ2h0IDwgZlRvcEFkZEJvdHRvbSkgew0KLSAgICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsNCi0gICAgICAgICAgICBtX3J0VUkubGVmdCAtPSBmVG9wQWRkQm90dG9tIC0gbV9ydFVJLmhlaWdodDsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcnRVSS50b3AgLT0gZlRvcEFkZEJvdHRvbSAtIG1fcnRVSS5oZWlnaHQ7DQotICAgICAgICBtX3J0VUkuaGVpZ2h0ICs9IDIgKiAoZlRvcEFkZEJvdHRvbSAtIG1fcnRVSS5oZWlnaHQpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIGludDMyX3QgaVJvdGF0ZSApDQotew0KLSAgICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9NYXRyaXggbXRSb3RhdGU7DQotICAgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOw0KLSAgICBDWEZBX0JvcmRlciBib3JkZXJVSSA9IG1fcERhdGFBY2MtPkdldFVJQm9yZGVyKCk7DQotICAgIERyYXdCb3JkZXIocEdTLCBib3JkZXJVSSwgbV9ydFVJLCAmbXRSb3RhdGUsIG1fcERhdGFBY2MtPkdldENoZWNrQnV0dG9uU2hhcGUoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3VuZCA/IFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQgOiAwKTsNCi0gICAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQotICAgIERyYXdIaWdobGlnaHQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzLCBtX3BEYXRhQWNjLT5HZXRDaGVja0J1dHRvblNoYXBlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm91bmQpOw0KLSAgICBDRlhfTWF0cml4IG10Ow0KLSAgICBtdC5TZXQoMSwgMCwgMCwgMSwgbV9ydENoZWNrQm94LmxlZnQsIG1fcnRDaGVja0JveC50b3ApOw0KLSAgICBtdC5Db25jYXQobXRSb3RhdGUpOw0KLSAgICBHZXRBcHAoKS0+R2V0V2lkZ2V0TWdyRGVsZWdhdGUoKS0+T25EcmF3V2lkZ2V0KG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksIHBHUywgJm10KTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGQ2hlY2tCdXR0b246Ok9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKCFJc0J1dHRvbkRvd24oKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIFNldEJ1dHRvbkRvd24oRkFMU0UpOw0KLSAgICBDRldMX01zZ01vdXNlIG1zOw0KLSAgICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDsNCi0gICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCi0gICAgbXMubV9meCA9IGZ4Ow0KLSAgICBtcy5tX2Z5ID0gZnk7DQotICAgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KLSAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCi0gICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotWEZBX0NIRUNLU1RBVEUgQ1hGQV9GRkNoZWNrQnV0dG9uOjpGV0xTdGF0ZTJYRkFTdGF0ZSgpDQotew0KLSAgICBYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSA9IFhGQV9DSEVDS1NUQVRFX09mZjsNCi0gICAgRlhfRFdPUkQgZHdTdGF0ZSA9IG1fcE5vcm1hbFdpZGdldC0+R2V0U3RhdGVzKCk7DQotICAgIGlmIChkd1N0YXRlICYgRldMX1NUQVRFX0NLQl9DaGVja2VkKSB7DQotICAgICAgICBlQ2hlY2tTdGF0ZSA9IFhGQV9DSEVDS1NUQVRFX09uOw0KLSAgICB9IGVsc2UgaWYgKGR3U3RhdGUgJiBGV0xfU1RBVEVfQ0tCX05ldXRyYWwpIHsNCi0gICAgICAgIGVDaGVja1N0YXRlID0gWEZBX0NIRUNLU1RBVEVfTmV1dHJhbDsNCi0gICAgfQ0KLSAgICByZXR1cm4gZUNoZWNrU3RhdGU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpDb21taXREYXRhKCkNCi17DQotICAgIFhGQV9DSEVDS1NUQVRFIGVDaGVja1N0YXRlID0gRldMU3RhdGUyWEZBU3RhdGUoKTsNCi0gICAgbV9wRGF0YUFjYy0+U2V0Q2hlY2tTdGF0ZShlQ2hlY2tTdGF0ZSwgVFJVRSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENYRkFfRkZDaGVja0J1dHRvbjo6SXNEYXRhQ2hhbmdlZCgpDQotew0KLSAgICBYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSA9IEZXTFN0YXRlMlhGQVN0YXRlKCk7DQotICAgIHJldHVybiBtX3BEYXRhQWNjLT5HZXRDaGVja1N0YXRlKCkgIT0gZUNoZWNrU3RhdGU7DQotfQ0KLXZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpTZXRGV0xDaGVja1N0YXRlKFhGQV9DSEVDS1NUQVRFIGVDaGVja1N0YXRlKQ0KLXsNCi0gICAgaWYgKGVDaGVja1N0YXRlID09IFhGQV9DSEVDS1NUQVRFX05ldXRyYWwpIHsNCi0gICAgICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0U3RhdGVzKEZXTF9TVEFURV9DS0JfTmV1dHJhbCwgVFJVRSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFN0YXRlcyhGV0xfU1RBVEVfQ0tCX0NoZWNrZWQsIGVDaGVja1N0YXRlID09IFhGQV9DSEVDS1NUQVRFX09uKTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENYRkFfRkZDaGVja0J1dHRvbjo6VXBkYXRlRldMRGF0YSgpDQotew0KLSAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIFhGQV9DSEVDS1NUQVRFIGVTdGF0ZSA9IG1fcERhdGFBY2MtPkdldENoZWNrU3RhdGUoKTsNCi0gICAgU2V0RldMQ2hlY2tTdGF0ZShlU3RhdGUpOw0KKyAgfQ0KKyAgbV9ydFVJLk5vcm1hbGl6ZSgpOw0KKyAgTGF5b3V0Q2FwdGlvbigpOw0KKyAgU2V0RldMUmVjdCgpOw0KKyAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KICAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KLSAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCi1pbnQzMl90IENYRkFfRkZDaGVja0J1dHRvbjo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit2b2lkIENYRkFfRkZDaGVja0J1dHRvbjo6Q2FwTGVmdFJpZ2h0UGxhY2VtZW50KENYRkFfTWFyZ2luIG1nQ2FwKSB7DQorICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ0NhcCk7DQorICBpZiAobV9ydENhcHRpb24uaGVpZ2h0IDwgMCkgew0KKyAgICBtX3J0Q2FwdGlvbi50b3AgKz0gbV9ydENhcHRpb24uaGVpZ2h0Ow0KKyAgfQ0KKyAgaWYgKG1fcnRDYXB0aW9uLndpZHRoIDwgMCkgew0KKyAgICBtX3J0Q2FwdGlvbi5sZWZ0ICs9IG1fcnRDYXB0aW9uLndpZHRoOw0KKyAgICBtX3J0Q2FwdGlvbi53aWR0aCA9IC1tX3J0Q2FwdGlvbi53aWR0aDsNCisgIH0NCiB9DQotRldMX0VSUiBDWEZBX0ZGQ2hlY2tCdXR0b246Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCi17DQotICAgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCi0gICAgRlhfRFdPUkQgZHdFdmVudElEID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQotICAgIHN3aXRjaCAoZHdFdmVudElEKSB7DQotICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0NLQl9DaGVja1N0YXRlQ2hhbmdlZDogew0KLSAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KLSAgICAgICAgICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DaGFuZ2U7DQotICAgICAgICAgICAgICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzTmV3VGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KLSAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcEZGRXhjbEdyb3VwID0gbV9wRGF0YUFjYy0+R2V0RXhjbEdyb3VwKCk7DQotICAgICAgICAgICAgICAgIGlmIChQcm9jZXNzQ29tbWl0dGVkRGF0YSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gcEZGRXhjbEdyb3VwOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGRkV4Y2xHcm91cCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcERvY1ZpZXctPkFkZFZhbGlkYXRlV2lkZ2V0KHBGRkV4Y2xHcm91cCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHBGRkV4Y2xHcm91cCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEZGRXhjbEdyb3VwLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZSwgJmVQYXJhbSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBTZXRGV0xDaGVja1N0YXRlKG1fcERhdGFBY2MtPkdldENoZWNrU3RhdGUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHBGRkV4Y2xHcm91cCkgew0KLSAgICAgICAgICAgICAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IHBGRkV4Y2xHcm91cDsNCi0gICAgICAgICAgICAgICAgICAgIHBGRkV4Y2xHcm91cC0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrLCAmZVBhcmFtKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCi0gICAgICAgICAgICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrLCAmZVBhcmFtKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCit2b2lkIENYRkFfRkZDaGVja0J1dHRvbjo6QWRkVUlNYXJnaW4oaW50MzJfdCBpQ2FwUGxhY2VtZW50KSB7DQorICBDRlhfUmVjdEYgcnRVSU1hcmdpbjsNCisgIG1fcERhdGFBY2MtPkdldFVJTWFyZ2luKHJ0VUlNYXJnaW4pOw0KKyAgbV9ydFVJLnRvcCAtPSBydFVJTWFyZ2luLnRvcCAvIDIgLSBydFVJTWFyZ2luLmhlaWdodCAvIDI7DQorICBGWF9GTE9BVCBmTGVmdEFkZFJpZ2h0ID0gcnRVSU1hcmdpbi5sZWZ0ICsgcnRVSU1hcmdpbi53aWR0aDsNCisgIEZYX0ZMT0FUIGZUb3BBZGRCb3R0b20gPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KKyAgaWYgKG1fcnRVSS53aWR0aCA8IGZMZWZ0QWRkUmlnaHQpIHsNCisgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQgfHwNCisgICAgICAgIGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdCkgew0KKyAgICAgIG1fcnRVSS5sZWZ0IC09IGZMZWZ0QWRkUmlnaHQgLSBtX3J0VUkud2lkdGg7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9ydFVJLmxlZnQgLT0gMiAqIChmTGVmdEFkZFJpZ2h0IC0gbV9ydFVJLndpZHRoKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorICAgIG1fcnRVSS53aWR0aCArPSAyICogKGZMZWZ0QWRkUmlnaHQgLSBtX3J0VUkud2lkdGgpOw0KKyAgfQ0KKyAgaWYgKG1fcnRVSS5oZWlnaHQgPCBmVG9wQWRkQm90dG9tKSB7DQorICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgICAgbV9ydFVJLmxlZnQgLT0gZlRvcEFkZEJvdHRvbSAtIG1fcnRVSS5oZWlnaHQ7DQorICAgIH0NCisgICAgbV9ydFVJLnRvcCAtPSBmVG9wQWRkQm90dG9tIC0gbV9ydFVJLmhlaWdodDsNCisgICAgbV9ydFVJLmhlaWdodCArPSAyICogKGZUb3BBZGRCb3R0b20gLSBtX3J0VUkuaGVpZ2h0KTsNCisgIH0NCiB9DQotRldMX0VSUiBDWEZBX0ZGQ2hlY2tCdXR0b246Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK3ZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUpIHsNCisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9NYXRyaXggbXRSb3RhdGU7DQorICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOw0KKyAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KKyAgRHJhd0JvcmRlcihwR1MsIGJvcmRlclVJLCBtX3J0VUksICZtdFJvdGF0ZSwNCisgICAgICAgICAgICAgbV9wRGF0YUFjYy0+R2V0Q2hlY2tCdXR0b25TaGFwZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kDQorICAgICAgICAgICAgICAgICA/IFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQNCisgICAgICAgICAgICAgICAgIDogMCk7DQorICBSZW5kZXJDYXB0aW9uKHBHUywgJm10Um90YXRlKTsNCisgIERyYXdIaWdobGlnaHQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICBtX3BEYXRhQWNjLT5HZXRDaGVja0J1dHRvblNoYXBlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm91bmQpOw0KKyAgQ0ZYX01hdHJpeCBtdDsNCisgIG10LlNldCgxLCAwLCAwLCAxLCBtX3J0Q2hlY2tCb3gubGVmdCwgbV9ydENoZWNrQm94LnRvcCk7DQorICBtdC5Db25jYXQobXRSb3RhdGUpOw0KKyAgR2V0QXBwKCktPkdldFdpZGdldE1nckRlbGVnYXRlKCktPk9uRHJhd1dpZGdldChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR1MsICZtdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghSXNCdXR0b25Eb3duKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgU2V0QnV0dG9uRG93bihGQUxTRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA7DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9meCA9IGZ4Ow0KKyAgbXMubV9meSA9IGZ5Ow0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitYRkFfQ0hFQ0tTVEFURSBDWEZBX0ZGQ2hlY2tCdXR0b246OkZXTFN0YXRlMlhGQVN0YXRlKCkgew0KKyAgWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUgPSBYRkFfQ0hFQ0tTVEFURV9PZmY7DQorICBGWF9EV09SRCBkd1N0YXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKTsNCisgIGlmIChkd1N0YXRlICYgRldMX1NUQVRFX0NLQl9DaGVja2VkKSB7DQorICAgIGVDaGVja1N0YXRlID0gWEZBX0NIRUNLU1RBVEVfT247DQorICB9IGVsc2UgaWYgKGR3U3RhdGUgJiBGV0xfU1RBVEVfQ0tCX05ldXRyYWwpIHsNCisgICAgZUNoZWNrU3RhdGUgPSBYRkFfQ0hFQ0tTVEFURV9OZXV0cmFsOw0KKyAgfQ0KKyAgcmV0dXJuIGVDaGVja1N0YXRlOw0KK30NCitGWF9CT09MIENYRkFfRkZDaGVja0J1dHRvbjo6Q29tbWl0RGF0YSgpIHsNCisgIFhGQV9DSEVDS1NUQVRFIGVDaGVja1N0YXRlID0gRldMU3RhdGUyWEZBU3RhdGUoKTsNCisgIG1fcERhdGFBY2MtPlNldENoZWNrU3RhdGUoZUNoZWNrU3RhdGUsIFRSVUUpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpJc0RhdGFDaGFuZ2VkKCkgew0KKyAgWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUgPSBGV0xTdGF0ZTJYRkFTdGF0ZSgpOw0KKyAgcmV0dXJuIG1fcERhdGFBY2MtPkdldENoZWNrU3RhdGUoKSAhPSBlQ2hlY2tTdGF0ZTsNCit9DQordm9pZCBDWEZBX0ZGQ2hlY2tCdXR0b246OlNldEZXTENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUpIHsNCisgIGlmIChlQ2hlY2tTdGF0ZSA9PSBYRkFfQ0hFQ0tTVEFURV9OZXV0cmFsKSB7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0U3RhdGVzKEZXTF9TVEFURV9DS0JfTmV1dHJhbCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFN0YXRlcyhGV0xfU1RBVEVfQ0tCX0NoZWNrZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDaGVja1N0YXRlID09IFhGQV9DSEVDS1NUQVRFX09uKTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGQ2hlY2tCdXR0b246OlVwZGF0ZUZXTERhdGEoKSB7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBYRkFfQ0hFQ0tTVEFURSBlU3RhdGUgPSBtX3BEYXRhQWNjLT5HZXRDaGVja1N0YXRlKCk7DQorICBTZXRGV0xDaGVja1N0YXRlKGVTdGF0ZSk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRkNoZWNrQnV0dG9uOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GRkNoZWNrQnV0dG9uOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgIEZYX0RXT1JEIGR3RXZlbnRJRCA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgc3dpdGNoIChkd0V2ZW50SUQpIHsNCisgICAgY2FzZSBGV0xfRVZUSEFTSF9DS0JfQ2hlY2tTdGF0ZUNoYW5nZWQ6IHsNCisgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsNCisgICAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZShlUGFyYW0ubV93c05ld1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgICAgICBDWEZBX1dpZGdldEFjYyogcEZGRXhjbEdyb3VwID0gbV9wRGF0YUFjYy0+R2V0RXhjbEdyb3VwKCk7DQorICAgICAgaWYgKFByb2Nlc3NDb21taXR0ZWREYXRhKCkpIHsNCisgICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBwRkZFeGNsR3JvdXA7DQorICAgICAgICBpZiAocEZGRXhjbEdyb3VwKSB7DQorICAgICAgICAgIG1fcERvY1ZpZXctPkFkZFZhbGlkYXRlV2lkZ2V0KHBGRkV4Y2xHcm91cCk7DQorICAgICAgICAgIG1fcERvY1ZpZXctPkFkZENhbGN1bGF0ZVdpZGdldEFjYyhwRkZFeGNsR3JvdXApOw0KKyAgICAgICAgICBwRkZFeGNsR3JvdXAtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9DaGFuZ2UsICZlUGFyYW0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICAgICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgU2V0RldMQ2hlY2tTdGF0ZShtX3BEYXRhQWNjLT5HZXRDaGVja1N0YXRlKCkpOw0KKyAgICAgIH0NCisgICAgICBpZiAocEZGRXhjbEdyb3VwKSB7DQorICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gcEZGRXhjbEdyb3VwOw0KKyAgICAgICAgcEZGRXhjbEdyb3VwLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2xpY2ssICZlUGFyYW0pOw0KKyAgICAgIH0NCisgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2xpY2ssICZlUGFyYW0pOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GRkNoZWNrQnV0dG9uOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hlY2tidXR0b24uaAppbmRleCBhM2FiZmI2Li43ZDU2YTJiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmgKQEAgLTcsMzAgKzcsMzMgQEAKICNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9DSEVDS0JVVFRPTl9JTVBfSA0KICNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9DSEVDS0JVVFRPTl9JTVBfSA0KIGNsYXNzIENYRkFfRkZFeGNsR3JvdXA7DQotY2xhc3MgQ1hGQV9GRkNoZWNrQnV0dG9uIDogcHVibGljIENYRkFfRkZGaWVsZA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZDaGVja0J1dHRvbihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GRkNoZWNrQnV0dG9uKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLCBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCitjbGFzcyBDWEZBX0ZGQ2hlY2tCdXR0b24gOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkNoZWNrQnV0dG9uKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRkNoZWNrQnV0dG9uKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQlMb2FkV2lkZ2V0KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJTGF5b3V0V2lkZ2V0KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJVXBkYXRlRldMRGF0YSgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdm9pZAkJCQlTZXRGV0xDaGVja1N0YXRlKFhGQV9DSEVDS1NUQVRFIGVDaGVja1N0YXRlKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTGF5b3V0V2lkZ2V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVXBkYXRlRldMRGF0YSgpOw0KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgU2V0RldMQ2hlY2tTdGF0ZShYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSk7DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KIA0KLXByb3RlY3RlZDoNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDb21taXREYXRhKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNEYXRhQ2hhbmdlZCgpOw0KLSAgICB2b2lkCQkJCUNhcExlZnRSaWdodFBsYWNlbWVudChDWEZBX01hcmdpbiBtZ0NhcCk7DQotICAgIHZvaWQJCQkJQWRkVUlNYXJnaW4oaW50MzJfdCBpQ2FwUGxhY2VtZW50KTsNCi0gICAgWEZBX0NIRUNLU1RBVEUJCUZXTFN0YXRlMlhGQVN0YXRlKCk7DQotICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqCW1fcE9sZERlbGVnYXRlOw0KLSAgICBDRlhfUmVjdEYJCQltX3J0Q2hlY2tCb3g7DQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgRlhfQk9PTCBDb21taXREYXRhKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZCgpOw0KKyAgdm9pZCBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoQ1hGQV9NYXJnaW4gbWdDYXApOw0KKyAgdm9pZCBBZGRVSU1hcmdpbihpbnQzMl90IGlDYXBQbGFjZW1lbnQpOw0KKyAgWEZBX0NIRUNLU1RBVEUgRldMU3RhdGUyWEZBU3RhdGUoKTsNCisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIG1fcE9sZERlbGVnYXRlOw0KKyAgQ0ZYX1JlY3RGIG1fcnRDaGVja0JveDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNob2ljZWxpc3QuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hvaWNlbGlzdC5jcHAKaW5kZXggNTYyMTVhZi4uODFkNWJlNSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hvaWNlbGlzdC5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hvaWNlbGlzdC5jcHAKQEAgLTEzLDU1OSArMTMsNTI4IEBACiAjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KICNpbmNsdWRlICJ4ZmFfZmZjaG9pY2VsaXN0LmgiDQogI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KLUNYRkFfRkZMaXN0Qm94OjpDWEZBX0ZGTGlzdEJveChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KLSAgICA6IENYRkFfRkZGaWVsZChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KLSAgICAsIG1fcE9sZERlbGVnYXRlKE5VTEwpDQotew0KLX0NCi1DWEZBX0ZGTGlzdEJveDo6fkNYRkFfRkZMaXN0Qm94KCkNCi17DQotICAgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCi0gICAgICAgIElGV0xfTm90ZURyaXZlciAqcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgICAgIHBOb3RlRHJpdmVyLT5VbnJlZ2lzdGVyRXZlbnRUYXJnZXQocFdpZGdldCk7DQotICAgIH0NCi19DQotRlhfQk9PTCBDWEZBX0ZGTGlzdEJveDo6TG9hZFdpZGdldCgpDQotew0KLSAgICBDRldMX0xpc3RCb3gqIHBMaXN0Qm94ID0gQ0ZXTF9MaXN0Qm94OjpDcmVhdGUoKTsNCi0gICAgcExpc3RCb3gtPkluaXRpYWxpemUoKTsNCi0gICAgcExpc3RCb3gtPk1vZGlmeVN0eWxlcyhGV0xfV0dUU1RZTEVfVlNjcm9sbCB8IEZXTF9XR1RTVFlMRV9Ob0JhY2tncm91bmQsIDB4RkZGRkZGRkYpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQgPSAoQ0ZXTF9XaWRnZXQqKXBMaXN0Qm94Ow0KK0NYRkFfRkZMaXN0Qm94OjpDWEZBX0ZGTGlzdEJveChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZGaWVsZChwUGFnZVZpZXcsIHBEYXRhQWNjKSwgbV9wT2xkRGVsZWdhdGUoTlVMTCkge30NCitDWEZBX0ZGTGlzdEJveDo6fkNYRkFfRkZMaXN0Qm94KCkgew0KKyAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KICAgICBJRldMX1dpZGdldCogcFdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocFdpZGdldCwgdGhpcywgTlVMTCk7DQotICAgIElGV0xfTm90ZURyaXZlciAqcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocFdpZGdldCwgcFdpZGdldCk7DQotICAgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7DQotICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NMYWJlbEFycmF5Ow0KLSAgICBtX3BEYXRhQWNjLT5HZXRDaG9pY2VMaXN0SXRlbXMod3NMYWJlbEFycmF5LCBGQUxTRSk7DQotICAgIGludDMyX3QgaUl0ZW1zID0gd3NMYWJlbEFycmF5LkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUl0ZW1zOyBpKyspIHsNCi0gICAgICAgIHBMaXN0Qm94LT5BZGRTdHJpbmcod3NMYWJlbEFycmF5W2ldKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBwTm90ZURyaXZlci0+VW5yZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZMaXN0Qm94OjpMb2FkV2lkZ2V0KCkgew0KKyAgQ0ZXTF9MaXN0Qm94KiBwTGlzdEJveCA9IENGV0xfTGlzdEJveDo6Q3JlYXRlKCk7DQorICBwTGlzdEJveC0+SW5pdGlhbGl6ZSgpOw0KKyAgcExpc3RCb3gtPk1vZGlmeVN0eWxlcyhGV0xfV0dUU1RZTEVfVlNjcm9sbCB8IEZXTF9XR1RTVFlMRV9Ob0JhY2tncm91bmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwTGlzdEJveDsNCisgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocFdpZGdldCwgdGhpcywgTlVMTCk7DQorICBJRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQorICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0LCBwV2lkZ2V0KTsNCisgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c0xhYmVsQXJyYXk7DQorICBtX3BEYXRhQWNjLT5HZXRDaG9pY2VMaXN0SXRlbXMod3NMYWJlbEFycmF5LCBGQUxTRSk7DQorICBpbnQzMl90IGlJdGVtcyA9IHdzTGFiZWxBcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpSXRlbXM7IGkrKykgew0KKyAgICBwTGlzdEJveC0+QWRkU3RyaW5nKHdzTGFiZWxBcnJheVtpXSk7DQorICB9DQorICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJGb2N1czsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfTFRCX011bHRpU2VsZWN0aW9uOw0KKyAgfQ0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd0V4dGVuZGVkU3R5bGUsIDB4RkZGRkZGRkYpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgaVNlbEFycmF5Ow0KKyAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOw0KKyAgaW50MzJfdCBpU2VsQ291bnQgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVNlbENvdW50OyBqKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBpdGVtID0gcExpc3RCb3gtPkdldEl0ZW0oaVNlbEFycmF5W2pdKTsNCisgICAgcExpc3RCb3gtPlNldFNlbEl0ZW0oaXRlbSwgVFJVRSk7DQorICB9DQorICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOw0KKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZMaXN0Qm94OjpPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3Rm9jdXMpIHsNCisgIEZYX0JPT0wgZmxhZyA9IFByb2Nlc3NDb21taXR0ZWREYXRhKCk7DQorICBpZiAoIWZsYWcpIHsNCisgICAgVXBkYXRlRldMRGF0YSgpOw0KKyAgfQ0KKyAgQ1hGQV9GRkZpZWxkOjpPbktpbGxGb2N1cyhwTmV3Rm9jdXMpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkxpc3RCb3g6OkNvbW1pdERhdGEoKSB7DQorICBGWFNZU19hc3NlcnQobV9wTm9ybWFsV2lkZ2V0ICE9IE5VTEwpOw0KKyAgQ0ZXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldDsNCisgIGludDMyX3QgaVNlbHMgPSBwTGlzdEJveC0+Q291bnRTZWxJdGVtcygpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgaVNlbEFycmF5Ow0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNlbHM7IGkrKykgew0KKyAgICBpU2VsQXJyYXkuQWRkKHBMaXN0Qm94LT5HZXRTZWxJbmRleChpKSk7DQorICB9DQorICBtX3BEYXRhQWNjLT5TZXRTZWxlY3RkSXRlbXMoaVNlbEFycmF5LCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZMaXN0Qm94OjpJc0RhdGFDaGFuZ2VkKCkgew0KKyAgQ0ZYX0ludDMyQXJyYXkgaVNlbEFycmF5Ow0KKyAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOw0KKyAgaW50MzJfdCBpT2xkU2VscyA9IGlTZWxBcnJheS5HZXRTaXplKCk7DQorICBDRldMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgaW50MzJfdCBpU2VscyA9IHBMaXN0Qm94LT5Db3VudFNlbEl0ZW1zKCk7DQorICBpZiAoaU9sZFNlbHMgPT0gaVNlbHMpIHsNCisgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgICBmb3IgKDsgaUluZGV4IDwgaVNlbHM7IGlJbmRleCsrKSB7DQorICAgICAgRldMX0hMSVNUSVRFTSBobGlzdEl0ZW0gPSBwTGlzdEJveC0+R2V0SXRlbShpU2VsQXJyYXlbaUluZGV4XSk7DQorICAgICAgaWYgKCEocExpc3RCb3gtPkdldEl0ZW1TdGF0ZXMoaGxpc3RJdGVtKSAmJiBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZCkpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJGb2N1czsNCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCi0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfTFRCX011bHRpU2VsZWN0aW9uOw0KKyAgICBpZiAoaUluZGV4ID09IGlTZWxzKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBHZXRBbGlnbm1lbnQoKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd0V4dGVuZGVkU3R5bGUsIDB4RkZGRkZGRkYpOw0KLSAgICBDRlhfSW50MzJBcnJheSBpU2VsQXJyYXk7DQotICAgIG1fcERhdGFBY2MtPkdldFNlbGVjdGVkSXRlbXMoaVNlbEFycmF5KTsNCi0gICAgaW50MzJfdCBpU2VsQ291bnQgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpU2VsQ291bnQ7IGorKykgew0KLSAgICAgICAgRldMX0hMSVNUSVRFTSBpdGVtID0gcExpc3RCb3gtPkdldEl0ZW0oaVNlbEFycmF5W2pdKTsNCi0gICAgICAgIHBMaXN0Qm94LT5TZXRTZWxJdGVtKGl0ZW0sIFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZMaXN0Qm94OjpHZXRBbGlnbm1lbnQoKSB7DQorICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KKyAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQorICAgIGludDMyX3QgaUhvcnogPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KKyAgICBzd2l0Y2ggKGlIb3J6KSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0xUQl9DZW50ZXJBbGlnbjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeToNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeUFsbDoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmFkaXg6DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9MVEJfUmlnaHRBbGlnbjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0xUQl9MZWZ0QWxpZ247DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOw0KLSAgICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQorICB9DQorICByZXR1cm4gZHdFeHRlbmRlZFN0eWxlOw0KIH0NCi1GWF9CT09MIENYRkFfRkZMaXN0Qm94OjpPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3Rm9jdXMpDQotew0KLSAgICBGWF9CT09MIGZsYWcgPSBQcm9jZXNzQ29tbWl0dGVkRGF0YSgpOw0KLSAgICBpZiAoIWZsYWcpIHsNCi0gICAgICAgIFVwZGF0ZUZXTERhdGEoKTsNCitGWF9CT09MIENYRkFfRkZMaXN0Qm94OjpVcGRhdGVGV0xEYXRhKCkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9MaXN0Qm94KiBwTGlzdEJveCA9ICgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpOw0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8RldMX0hMSVNUSVRFTT4gc2VsSXRlbUFycmF5Ow0KKyAgQ0ZYX0ludDMyQXJyYXkgaVNlbEFycmF5Ow0KKyAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOw0KKyAgaW50MzJfdCBpU2VsQ291bnQgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVNlbENvdW50OyBqKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBscEl0ZW1TZWwgPSBwTGlzdEJveC0+R2V0U2VsSXRlbShpU2VsQXJyYXlbal0pOw0KKyAgICBzZWxJdGVtQXJyYXkuQWRkKGxwSXRlbVNlbCk7DQorICB9DQorICBwTGlzdEJveC0+U2V0U2VsSXRlbShwTGlzdEJveC0+R2V0U2VsSXRlbSgtMSksIEZBTFNFKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTZWxDb3VudDsgaSsrKSB7DQorICAgICgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRTZWxJdGVtKHNlbEl0ZW1BcnJheVtpXSwgVFJVRSk7DQorICB9DQorICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9GRkxpc3RCb3g6Ok9uU2VsZWN0Q2hhbmdlZChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIGFyclNlbHMpIHsNCisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DaGFuZ2U7DQorICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzUHJldlRleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgIENGV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQ7DQorICBpbnQzMl90IGlTZWxzID0gcExpc3RCb3gtPkNvdW50U2VsSXRlbXMoKTsNCisgIGlmIChpU2VscyA+IDApIHsNCisgICAgcExpc3RCb3gtPkdldEl0ZW1UZXh0KHBMaXN0Qm94LT5HZXRTZWxJdGVtKDApLCBlUGFyYW0ubV93c05ld1RleHQpOw0KKyAgfQ0KKyAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZSwgJmVQYXJhbSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkxpc3RCb3g6OlNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpIHsNCisgIEZXTF9ITElTVElURU0gaXRlbSA9ICgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpLT5HZXRTZWxJdGVtKG5JbmRleCk7DQorICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0U2VsSXRlbShpdGVtLCBiU2VsZWN0ZWQpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkxpc3RCb3g6Okluc2VydEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGVtcCh3c0xhYmVsKTsNCisgICgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpLT5BZGRTdHJpbmcod3NUZW1wKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KK30NCit2b2lkIENYRkFfRkZMaXN0Qm94OjpEZWxldGVJdGVtKGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4IDwgMCkgew0KKyAgICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+RGVsZXRlQWxsKCk7DQorICB9IGVsc2Ugew0KKyAgICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KQ0KKyAgICAgICAgLT5EZWxldGVTdHJpbmcoKChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldCktPkdldEl0ZW0obkluZGV4KSk7DQorICB9DQorICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCit9DQoraW50MzJfdCBDWEZBX0ZGTGlzdEJveDo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCitGV0xfRVJSIENYRkFfRkZMaXN0Qm94OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgIEZYX0RXT1JEIGR3RXZlbnRJRCA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgc3dpdGNoIChkd0V2ZW50SUQpIHsNCisgICAgY2FzZSBGV0xfRVZUSEFTSF9MVEJfU2VsQ2hhbmdlZDogew0KKyAgICAgIENGWF9JbnQzMkFycmF5IGFyclNlbHM7DQorICAgICAgT25TZWxlY3RDaGFuZ2VkKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksIGFyclNlbHMpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIENYRkFfRkZGaWVsZDo6T25LaWxsRm9jdXMocE5ld0ZvY3VzKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRkxpc3RCb3g6OkNvbW1pdERhdGEoKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fcE5vcm1hbFdpZGdldCAhPSBOVUxMKTsNCi0gICAgQ0ZXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldDsNCi0gICAgaW50MzJfdCBpU2VscyA9IHBMaXN0Qm94LT5Db3VudFNlbEl0ZW1zKCk7DQotICAgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNlbHM7IGkrKykgew0KLSAgICAgICAgaVNlbEFycmF5LkFkZChwTGlzdEJveC0+R2V0U2VsSW5kZXgoaSkpOw0KLSAgICB9DQotICAgIG1fcERhdGFBY2MtPlNldFNlbGVjdGRJdGVtcyhpU2VsQXJyYXksIFRSVUUpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGV0xfRVJSIENYRkFfRkZMaXN0Qm94OjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRkxpc3RCb3g6OklzRGF0YUNoYW5nZWQoKQ0KLXsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgaVNlbEFycmF5Ow0KLSAgICBtX3BEYXRhQWNjLT5HZXRTZWxlY3RlZEl0ZW1zKGlTZWxBcnJheSk7DQotICAgIGludDMyX3QgaU9sZFNlbHMgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBDRldMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0Ow0KLSAgICBpbnQzMl90IGlTZWxzID0gcExpc3RCb3gtPkNvdW50U2VsSXRlbXMoKTsNCi0gICAgaWYgKGlPbGRTZWxzID09IGlTZWxzKSB7DQotICAgICAgICBpbnQzMl90IGlJbmRleCA9IDA7DQotICAgICAgICBmb3IgKDsgaUluZGV4IDwgaVNlbHM7IGlJbmRleCsrKSB7DQotICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBobGlzdEl0ZW0gPSBwTGlzdEJveC0+R2V0SXRlbShpU2VsQXJyYXlbaUluZGV4XSk7DQotICAgICAgICAgICAgaWYoIShwTGlzdEJveC0+R2V0SXRlbVN0YXRlcyhobGlzdEl0ZW0pICYmIEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkKSkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoaUluZGV4ID09IGlTZWxzKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9EV09SRCBDWEZBX0ZGTGlzdEJveDo6R2V0QWxpZ25tZW50KCkNCi17DQotICAgIEZYX0RXT1JEIGR3RXh0ZW5kZWRTdHlsZSA9IDA7DQotICAgIGlmIChDWEZBX1BhcmEgcGFyYSA9IG1fcERhdGFBY2MtPkdldFBhcmEoKSkgew0KLSAgICAgICAgaW50MzJfdCBpSG9yeiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7DQotICAgICAgICBzd2l0Y2goaUhvcnopIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoNCi0gICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9MVEJfQ2VudGVyQWxpZ247DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeToNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JhZGl4Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KLSAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0xUQl9SaWdodEFsaWduOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0xUQl9MZWZ0QWxpZ247DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBkd0V4dGVuZGVkU3R5bGU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkxpc3RCb3g6OlVwZGF0ZUZXTERhdGEoKQ0KLXsNCi0gICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRldMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldCk7DQotICAgIENGWF9BcnJheVRlbXBsYXRlPEZXTF9ITElTVElURU0+IHNlbEl0ZW1BcnJheTsNCi0gICAgQ0ZYX0ludDMyQXJyYXkgaVNlbEFycmF5Ow0KLSAgICBtX3BEYXRhQWNjLT5HZXRTZWxlY3RlZEl0ZW1zKGlTZWxBcnJheSk7DQotICAgIGludDMyX3QgaVNlbENvdW50ID0gaVNlbEFycmF5LkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVNlbENvdW50OyBqKyspIHsNCi0gICAgICAgIEZXTF9ITElTVElURU0gbHBJdGVtU2VsID0gcExpc3RCb3gtPkdldFNlbEl0ZW0oaVNlbEFycmF5W2pdKTsNCi0gICAgICAgIHNlbEl0ZW1BcnJheS5BZGQobHBJdGVtU2VsKTsNCi0gICAgfQ0KLSAgICBwTGlzdEJveC0+U2V0U2VsSXRlbShwTGlzdEJveC0+R2V0U2VsSXRlbSgtMSksIEZBTFNFKTsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBpU2VsQ291bnQ7IGkrKykgew0KLSAgICAgICAgKChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldFNlbEl0ZW0oc2VsSXRlbUFycmF5W2ldLCBUUlVFKTsNCi0gICAgfQ0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDWEZBX0ZGTGlzdEJveDo6T25TZWxlY3RDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfSW50MzJBcnJheSAmYXJyU2VscykNCi17DQotICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQotICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsNCi0gICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQotICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzUHJldlRleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCi0gICAgQ0ZXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldDsNCi0gICAgaW50MzJfdCBpU2VscyA9IHBMaXN0Qm94LT5Db3VudFNlbEl0ZW1zKCk7DQotICAgIGlmIChpU2VscyA+IDApIHsNCi0gICAgICAgIHBMaXN0Qm94LT5HZXRJdGVtVGV4dChwTGlzdEJveC0+R2V0U2VsSXRlbSgwKSwgZVBhcmFtLm1fd3NOZXdUZXh0KTsNCi0gICAgfQ0KLSAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsNCi19DQotdm9pZCBDWEZBX0ZGTGlzdEJveDo6U2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCkNCi17DQotICAgIEZXTF9ITElTVElURU0gaXRlbSA9ICgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpLT5HZXRTZWxJdGVtKG5JbmRleCk7DQotICAgICgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRTZWxJdGVtKGl0ZW0sIGJTZWxlY3RlZCk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQotICAgIEFkZEludmFsaWRhdGVSZWN0KCk7DQotfQ0KLXZvaWQgQ1hGQV9GRkxpc3RCb3g6Okluc2VydEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsLCBpbnQzMl90IG5JbmRleCApDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXAod3NMYWJlbCk7DQotICAgICgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpLT5BZGRTdHJpbmcod3NUZW1wKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCi0gICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCi19DQotdm9pZCBDWEZBX0ZGTGlzdEJveDo6RGVsZXRlSXRlbShpbnQzMl90IG5JbmRleCkNCi17DQotICAgIGlmIChuSW5kZXggPCAwKSB7DQotICAgICAgICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+RGVsZXRlQWxsKCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+RGVsZXRlU3RyaW5nKCgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpLT5HZXRJdGVtKG5JbmRleCkpOw0KLSAgICB9DQotICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQotICAgIEFkZEludmFsaWRhdGVSZWN0KCk7DQotfQ0KLWludDMyX3QgQ1hGQV9GRkxpc3RCb3g6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotICAgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQotfQ0KLUZXTF9FUlIgQ1hGQV9GRkxpc3RCb3g6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCi17DQotICAgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCi0gICAgRlhfRFdPUkQgZHdFdmVudElEID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQotICAgIHN3aXRjaCAoZHdFdmVudElEKSB7DQotICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0xUQl9TZWxDaGFuZ2VkOiB7DQotICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5IGFyclNlbHM7DQotICAgICAgICAgICAgICAgIE9uU2VsZWN0Q2hhbmdlZChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLCBhcnJTZWxzKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQotfQ0KLUZXTF9FUlIgQ1hGQV9GRkxpc3RCb3g6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KLX0NCi1DWEZBX0ZGQ29tYm9Cb3g6OkNYRkFfRkZDb21ib0JveChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KLSAgICA6IENYRkFfRkZGaWVsZChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KLSAgICAsIG1fcE9sZERlbGVnYXRlKE5VTEwpDQotew0KLX0NCi1DWEZBX0ZGQ29tYm9Cb3g6On5DWEZBX0ZGQ29tYm9Cb3goKQ0KLXsNCi19DQotRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkdldEJCb3goQ0ZYX1JlY3RGICZydEJveCwgRlhfRFdPUkQgZHdTdGF0dXMsIEZYX0JPT0wgYkRyYXdGb2N1cykNCi17DQotICAgIGlmIChiRHJhd0ZvY3VzKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCitDWEZBX0ZGQ29tYm9Cb3g6OkNYRkFfRkZDb21ib0JveChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRkZpZWxkKHBQYWdlVmlldywgcERhdGFBY2MpLCBtX3BPbGREZWxlZ2F0ZShOVUxMKSB7fQ0KK0NYRkFfRkZDb21ib0JveDo6fkNYRkFfRkZDb21ib0JveCgpIHt9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkdldEJCb3goQ0ZYX1JlY3RGJiBydEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEcmF3Rm9jdXMpIHsNCisgIGlmIChiRHJhd0ZvY3VzKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCiAjaWZuZGVmIF9YRkFfRU1CDQotICAgIHJldHVybiBDWEZBX0ZGV2lkZ2V0OjpHZXRCQm94KHJ0Qm94LCBkd1N0YXR1cyk7DQorICByZXR1cm4gQ1hGQV9GRldpZGdldDo6R2V0QkJveChydEJveCwgZHdTdGF0dXMpOw0KICNlbmRpZg0KLSAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQotICAgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIENGWF9SZWN0RiBydFdpZGdldDsNCi0gICAgICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0QkJveChydFdpZGdldCk7DQotICAgICAgICBydEJveC5VbmlvbihydFdpZGdldCk7DQotICAgIH0NCi0gICAgQ0ZYX01hdHJpeCBtdDsNCi0gICAgR2V0Um90YXRlTWF0cml4KG10KTsNCi0gICAgbXQuVHJhbnNmb3JtUmVjdChydEJveCk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNYRkFfRkZDb21ib0JveDo6UHRJbkFjdGl2ZVJlY3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KKyAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRCb3gpOw0KKyAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KICAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQogICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0QkJveChydFdpZGdldCk7DQotICAgIGlmIChydFdpZGdldC5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KKyAgICBydEJveC5VbmlvbihydFdpZGdldCk7DQorICB9DQorICBDRlhfTWF0cml4IG10Ow0KKyAgR2V0Um90YXRlTWF0cml4KG10KTsNCisgIG10LlRyYW5zZm9ybVJlY3QocnRCb3gpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpQdEluQWN0aXZlUmVjdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQogICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkxvYWRXaWRnZXQoKQ0KLXsNCi0gICAgQ0ZXTF9Db21ib0JveCogcENvbWJvQm94ID0gQ0ZXTF9Db21ib0JveDo6Q3JlYXRlKCk7DQotICAgIHBDb21ib0JveC0+SW5pdGlhbGl6ZSgpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQgPSAoQ0ZXTF9XaWRnZXQqKXBDb21ib0JveDsNCi0gICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBXaWRnZXQsIHRoaXMsIE5VTEwpOw0KLSAgICBJRldMX05vdGVEcml2ZXIgKnBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQotICAgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQsIHBXaWRnZXQpOw0KLSAgICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzTGFiZWxBcnJheTsNCi0gICAgbV9wRGF0YUFjYy0+R2V0Q2hvaWNlTGlzdEl0ZW1zKHdzTGFiZWxBcnJheSwgRkFMU0UpOw0KLSAgICBpbnQzMl90IGlJdGVtcyA9IHdzTGFiZWxBcnJheS5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlJdGVtczsgaSsrKSB7DQotICAgICAgICBwQ29tYm9Cb3gtPkFkZFN0cmluZyh3c0xhYmVsQXJyYXlbaV0pOw0KLSAgICB9DQotICAgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCi0gICAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOw0KLSAgICBpbnQzMl90IGlTZWxDb3VudCA9IGlTZWxBcnJheS5HZXRTaXplKCk7DQotICAgIGlmIChpU2VsQ291bnQgPiAwKSB7DQotICAgICAgICBwQ29tYm9Cb3gtPlNldEN1clNlbChpU2VsQXJyYXlbMF0pOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQotICAgICAgICBwQ29tYm9Cb3gtPlNldEVkaXRUZXh0KHdzVGV4dCk7DQotICAgIH0NCi0gICAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsNCi0gICAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KLX0NCi12b2lkIENYRkFfRkZDb21ib0JveDo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKQ0KLXsNCi0gICAgQ0ZXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldDsNCi0gICAgaWYgKCFwQ29tYm9Cb3gpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KLSAgICBGWF9EV09SRCBkd0VkaXRTdHlsZXMgPSBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5IHwgRldMX1NUWUxFRVhUX0VEVF9MYXN0TGluZUhlaWdodDsNCi0gICAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsNCi0gICAgaWYgKG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkpIHsNCi0gICAgICAgIGR3RWRpdFN0eWxlcyAmPSB+RldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsNCi0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KLSAgICB9DQotICAgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuIHx8ICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KLSAgICAgICAgZHdFZGl0U3R5bGVzIHw9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7DQotICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0NNQl9SZWFkT25seTsNCi0gICAgfQ0KLSAgICBkd0V4dGVuZGVkU3R5bGUgfD0gR2V0QWxpZ25tZW50KCk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsNCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PZmYpIHsNCi0gICAgICAgIGR3RWRpdFN0eWxlcyB8PSBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsOw0KLSAgICB9DQotICAgIHBDb21ib0JveC0+RWRpdE1vZGlmeVN0eWxlc0V4KGR3RWRpdFN0eWxlcywgMHhGRkZGRkZGRik7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBpZiAoIUNYRkFfRkZGaWVsZDo6T25SQnV0dG9uVXAoZHdGbGFncywgZngsIGZ5KSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9Qb2ludEYgcHQ7DQotICAgIHB0LlNldChmeCwgZnkpOw0KLSAgICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+UG9wdXBNZW51KHRoaXMsIHB0LCBOVUxMKTsNCisgIH0NCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0QkJveChydFdpZGdldCk7DQorICBpZiAocnRXaWRnZXQuQ29udGFpbnMoZngsIGZ5KSkgew0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpDQotew0KLSAgICBGWF9CT09MIGZsYWcgPSBQcm9jZXNzQ29tbWl0dGVkRGF0YSgpOw0KLSAgICBpZiAoIWZsYWcpIHsNCi0gICAgICAgIFVwZGF0ZUZXTERhdGEoKTsNCi0gICAgfQ0KLSAgICBDWEZBX0ZGRmllbGQ6Ok9uS2lsbEZvY3VzKHBOZXdXaWRnZXQpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9wZW5Ecm9wRG93bkxpc3QoKQ0KLXsNCi0gICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5PcGVuRHJvcERvd25MaXN0KFRSVUUpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q29tbWl0RGF0YSgpDQotew0KLSAgICByZXR1cm4gbV9wRGF0YUFjYy0+U2V0VmFsdWUobV93c05ld1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpJc0RhdGFDaGFuZ2VkKCkNCi17DQotICAgIENGV0xfQ29tYm9Cb3gqIHBGV0xjb21ib2JveCA9ICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KTsNCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6TG9hZFdpZGdldCgpIHsNCisgIENGV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IENGV0xfQ29tYm9Cb3g6OkNyZWF0ZSgpOw0KKyAgcENvbWJvQm94LT5Jbml0aWFsaXplKCk7DQorICBtX3BOb3JtYWxXaWRnZXQgPSAoQ0ZXTF9XaWRnZXQqKXBDb21ib0JveDsNCisgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocFdpZGdldCwgdGhpcywgTlVMTCk7DQorICBJRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQorICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0LCBwV2lkZ2V0KTsNCisgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c0xhYmVsQXJyYXk7DQorICBtX3BEYXRhQWNjLT5HZXRDaG9pY2VMaXN0SXRlbXMod3NMYWJlbEFycmF5LCBGQUxTRSk7DQorICBpbnQzMl90IGlJdGVtcyA9IHdzTGFiZWxBcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpSXRlbXM7IGkrKykgew0KKyAgICBwQ29tYm9Cb3gtPkFkZFN0cmluZyh3c0xhYmVsQXJyYXlbaV0pOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgaVNlbEFycmF5Ow0KKyAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOw0KKyAgaW50MzJfdCBpU2VsQ291bnQgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKGlTZWxDb3VudCA+IDApIHsNCisgICAgcENvbWJvQm94LT5TZXRDdXJTZWwoaVNlbEFycmF5WzBdKTsNCisgIH0gZWxzZSB7DQogICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgcEZXTGNvbWJvYm94LT5HZXRFZGl0VGV4dCh3c1RleHQpOw0KLSAgICBpbnQzMl90IGlDdXJzZWwgPSBwRldMY29tYm9ib3gtPkdldEN1clNlbCgpOw0KLSAgICBpZiAoaUN1cnNlbCA+PSAwKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NlbDsNCi0gICAgICAgIHBGV0xjb21ib2JveC0+R2V0VGV4dEJ5SW5kZXgoaUN1cnNlbCwgd3NTZWwpOw0KLSAgICAgICAgaWYgKHdzU2VsID09IHdzVGV4dCkgew0KLSAgICAgICAgICAgIG1fcERhdGFBY2MtPkdldENob2ljZUxpc3RJdGVtKHdzVGV4dCwgaUN1cnNlbCwgVFJVRSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NPbGRWYWx1ZTsNCi0gICAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NPbGRWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KLSAgICBpZiAod3NPbGRWYWx1ZSAhPSB3c1RleHQpIHsNCi0gICAgICAgIG1fd3NOZXdWYWx1ZSA9IHdzVGV4dDsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQorICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICBwQ29tYm9Cb3gtPlNldEVkaXRUZXh0KHdzVGV4dCk7DQorICB9DQorICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsNCisgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkgew0KKyAgQ0ZXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldDsNCisgIGlmICghcENvbWJvQm94KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0RXT1JEIGR3RXh0ZW5kZWRTdHlsZSA9IDA7DQorICBGWF9EV09SRCBkd0VkaXRTdHlsZXMgPQ0KKyAgICAgIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkgfCBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0Ow0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsNCisgIGlmIChtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpKSB7DQorICAgIGR3RWRpdFN0eWxlcyAmPSB+RldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsNCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd247DQorICB9DQorICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbiB8fA0KKyAgICAgICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KKyAgICBkd0VkaXRTdHlsZXMgfD0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsNCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfUmVhZE9ubHk7DQorICB9DQorICBkd0V4dGVuZGVkU3R5bGUgfD0gR2V0QWxpZ25tZW50KCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7DQorICBpZiAobV9wRGF0YUFjYy0+R2V0SG9yaXpvbnRhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgew0KKyAgICBkd0VkaXRTdHlsZXMgfD0gRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbDsNCisgIH0NCisgIHBDb21ib0JveC0+RWRpdE1vZGlmeVN0eWxlc0V4KGR3RWRpdFN0eWxlcywgMHhGRkZGRkZGRik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25VcChkd0ZsYWdzLCBmeCwgZnkpKSB7DQogICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9Qb2ludEYgcHQ7DQorICBwdC5TZXQoZngsIGZ5KTsNCisgIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5Qb3B1cE1lbnUodGhpcywgcHQsIE5VTEwpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ1hGQV9GRkNvbWJvQm94OjpGV0xFdmVudFNlbENoYW5nZShDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSkNCi17DQotICAgIHBQYXJhbS0+bV9lVHlwZSA9IFhGQV9FVkVOVF9DaGFuZ2U7DQotICAgIHBQYXJhbS0+bV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCi0gICAgQ0ZXTF9Db21ib0JveCogcEZXTGNvbWJvYm94ID0gKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpOw0KLSAgICBwRldMY29tYm9ib3gtPkdldEVkaXRUZXh0KHBQYXJhbS0+bV93c05ld1RleHQpOw0KLSAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCBwUGFyYW0pOw0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KSB7DQorICBGWF9CT09MIGZsYWcgPSBQcm9jZXNzQ29tbWl0dGVkRGF0YSgpOw0KKyAgaWYgKCFmbGFnKSB7DQorICAgIFVwZGF0ZUZXTERhdGEoKTsNCisgIH0NCisgIENYRkFfRkZGaWVsZDo6T25LaWxsRm9jdXMocE5ld1dpZGdldCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfRFdPUkQgQ1hGQV9GRkNvbWJvQm94OjpHZXRBbGlnbm1lbnQoKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gMDsNCi0gICAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQotICAgICAgICBpbnQzMl90IGlIb3J6ID0gcGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKTsNCi0gICAgICAgIHN3aXRjaChpSG9yeikgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KLSAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0NNQl9FZGl0SENlbnRlciB8IEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1DZW50ZXJBbGlnbjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5Og0KLSAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0NNQl9FZGl0SnVzdGlmaWVkOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnlBbGw6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmFkaXg6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRITmVhciB8IEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1MZWZ0QWxpZ247DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpVmVydCA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KLSAgICAgICAgc3dpdGNoKGlWZXJ0KSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQotICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWQ2VudGVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbToNCi0gICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZGYXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWTmVhcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGR3RXh0ZW5kZWRTdHlsZTsNCit2b2lkIENYRkFfRkZDb21ib0JveDo6T3BlbkRyb3BEb3duTGlzdCgpIHsNCisgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+T3BlbkRyb3BEb3duTGlzdChUUlVFKTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OlVwZGF0ZUZXTERhdGEoKQ0KLXsNCi0gICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q29tbWl0RGF0YSgpIHsNCisgIHJldHVybiBtX3BEYXRhQWNjLT5TZXRWYWx1ZShtX3dzTmV3VmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OklzRGF0YUNoYW5nZWQoKSB7DQorICBDRldMX0NvbWJvQm94KiBwRldMY29tYm9ib3ggPSAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBwRldMY29tYm9ib3gtPkdldEVkaXRUZXh0KHdzVGV4dCk7DQorICBpbnQzMl90IGlDdXJzZWwgPSBwRldMY29tYm9ib3gtPkdldEN1clNlbCgpOw0KKyAgaWYgKGlDdXJzZWwgPj0gMCkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1NlbDsNCisgICAgcEZXTGNvbWJvYm94LT5HZXRUZXh0QnlJbmRleChpQ3Vyc2VsLCB3c1NlbCk7DQorICAgIGlmICh3c1NlbCA9PSB3c1RleHQpIHsNCisgICAgICBtX3BEYXRhQWNjLT5HZXRDaG9pY2VMaXN0SXRlbSh3c1RleHQsIGlDdXJzZWwsIFRSVUUpOw0KICAgICB9DQotICAgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCi0gICAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOw0KLSAgICBpbnQzMl90IGlTZWxDb3VudCA9IGlTZWxBcnJheS5HZXRTaXplKCk7DQotICAgIGlmIChpU2VsQ291bnQgPiAwKSB7DQotICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldEN1clNlbChpU2VsQXJyYXlbMF0pOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRDdXJTZWwoLTEpOw0KLSAgICAgICAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQotICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldEVkaXRUZXh0KHdzVGV4dCk7DQotICAgIH0NCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzT2xkVmFsdWU7DQorICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c09sZFZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICBpZiAod3NPbGRWYWx1ZSAhPSB3c1RleHQpIHsNCisgICAgbV93c05ld1ZhbHVlID0gd3NUZXh0Ow0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkNhblVuZG8oKQ0KLXsNCi0gICAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0Q2FuVW5kbygpOw0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpGV0xFdmVudFNlbENoYW5nZShDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSkgew0KKyAgcFBhcmFtLT5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsNCisgIHBQYXJhbS0+bV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgIENGV0xfQ29tYm9Cb3gqIHBGV0xjb21ib2JveCA9ICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KTsNCisgIHBGV0xjb21ib2JveC0+R2V0RWRpdFRleHQocFBhcmFtLT5tX3dzTmV3VGV4dCk7DQorICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCBwUGFyYW0pOw0KIH0NCi1GWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuUmVkbygpDQotew0KLSAgICByZXR1cm4gbV9wRGF0YUFjYy0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSAmJiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDYW5SZWRvKCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpVbmRvKCkNCi17DQotICAgIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdFVuZG8oKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OlJlZG8oKQ0KLXsNCi0gICAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0UmVkbygpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuQ29weSgpDQotew0KLSAgICByZXR1cm4gKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0Q2FuQ29weSgpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuQ3V0KCkNCi17DQotICAgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorRlhfRFdPUkQgQ1hGQV9GRkNvbWJvQm94OjpHZXRBbGlnbm1lbnQoKSB7DQorICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KKyAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQorICAgIGludDMyX3QgaUhvcnogPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KKyAgICBzd2l0Y2ggKGlIb3J6KSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0NCisgICAgICAgICAgICBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIQ2VudGVyIHwgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUNlbnRlckFsaWduOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5Og0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfRWRpdEp1c3RpZmllZDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeUFsbDoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmFkaXg6DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PQ0KKyAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhOZWFyIHwgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUxlZnRBbGlnbjsNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdENhbkN1dCgpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuUGFzdGUoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpID09IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pOw0KLX0NCi1GWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuU2VsZWN0QWxsKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDYW5TZWxlY3RBbGwoKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDb3B5KHdzQ29weSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpDdXQoQ0ZYX1dpZGVTdHJpbmcgJndzQ3V0KQ0KLXsNCi0gICAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0Q3V0KHdzQ3V0KTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKQ0KLXsNCi0gICAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0UGFzdGUod3NQYXN0ZSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpTZWxlY3RBbGwoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdFNlbGVjdEFsbCgpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZDb21ib0JveDo6RGVsZXRlKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXREZWxldGUoKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkRlU2VsZWN0KCkNCi17DQotICAgIHJldHVybiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXREZVNlbGVjdCgpOw0KLX0NCi12b2lkIENYRkFfRkZDb21ib0JveDo6U2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCkNCi17DQotICAgIGlmIChiU2VsZWN0ZWQpIHsNCi0gICAgICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0Q3VyU2VsKG5JbmRleCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldEN1clNlbCgtMSk7DQorICAgIGludDMyX3QgaVZlcnQgPSBwYXJhLkdldFZlcnRpY2FsQWxpZ24oKTsNCisgICAgc3dpdGNoIChpVmVydCkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlOg0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZDZW50ZXI7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbToNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWRmFyOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWTmVhcjsNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQotICAgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorICB9DQorICByZXR1cm4gZHdFeHRlbmRlZFN0eWxlOw0KIH0NCi12b2lkIENYRkFfRkZDb21ib0JveDo6SW5zZXJ0SXRlbShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTGFiZWwsIGludDMyX3QgbkluZGV4ICkNCi17DQotICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+QWRkU3RyaW5nKHdzTGFiZWwpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KLSAgICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpVcGRhdGVGV0xEYXRhKCkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgaVNlbEFycmF5Ow0KKyAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOw0KKyAgaW50MzJfdCBpU2VsQ291bnQgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKGlTZWxDb3VudCA+IDApIHsNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRDdXJTZWwoaVNlbEFycmF5WzBdKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRDdXJTZWwoLTEpOw0KKyAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRFZGl0VGV4dCh3c1RleHQpOw0KKyAgfQ0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi12b2lkIENYRkFfRkZDb21ib0JveDo6RGVsZXRlSXRlbShpbnQzMl90IG5JbmRleCkNCi17DQotICAgIGlmIChuSW5kZXggPCAwKSB7DQotICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlJlbW92ZUFsbCgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5SZW1vdmVBdChuSW5kZXgpOw0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpDYW5VbmRvKCkgew0KKyAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYNCisgICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpDYW5SZWRvKCkgew0KKyAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYNCisgICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDYW5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpVbmRvKCkgew0KKyAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYNCisgICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRVbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpSZWRvKCkgew0KKyAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYNCisgICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRSZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpDYW5Db3B5KCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdENhbkNvcHkoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkNhbkN1dCgpIHsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmDQorICAgICAgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0Q2FuQ3V0KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpDYW5QYXN0ZSgpIHsNCisgIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmDQorICAgICAgICAgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpID09IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuU2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdENhblNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0Q29weSh3c0NvcHkpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgew0KKyAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYNCisgICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDdXQod3NDdXQpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpIHsNCisgIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmDQorICAgICAgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0UGFzdGUod3NQYXN0ZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpTZWxlY3RBbGwoKSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0U2VsZWN0QWxsKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpEZWxldGUoKSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0RGVsZXRlKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpEZVNlbGVjdCgpIHsNCisgIHJldHVybiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXREZVNlbGVjdCgpOw0KK30NCit2b2lkIENYRkFfRkZDb21ib0JveDo6U2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCkgew0KKyAgaWYgKGJTZWxlY3RlZCkgew0KKyAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldEN1clNlbChuSW5kZXgpOw0KKyAgfSBlbHNlIHsNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRDdXJTZWwoLTEpOw0KKyAgfQ0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpJbnNlcnRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCkgew0KKyAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5BZGRTdHJpbmcod3NMYWJlbCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCit9DQordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6OkRlbGV0ZUl0ZW0oaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChuSW5kZXggPCAwKSB7DQorICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+UmVtb3ZlQWxsKCk7DQorICB9IGVsc2Ugew0KKyAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlJlbW92ZUF0KG5JbmRleCk7DQorICB9DQorICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCit9DQordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uVGV4dENoYW5nZWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2hhbmdlZCkgew0KKyAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzUHJldlRleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgIGVQYXJhbS5tX3dzQ2hhbmdlID0gd3NDaGFuZ2VkOw0KKyAgRldMRXZlbnRTZWxDaGFuZ2UoJmVQYXJhbSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPblNlbGVjdENoYW5nZWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgYXJyU2VscywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxCdXR0b25VcCkgew0KKyAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzUHJldlRleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgIEZXTEV2ZW50U2VsQ2hhbmdlKCZlUGFyYW0pOw0KKyAgaWYgKG1fcERhdGFBY2MtPkdldENob2ljZUxpc3RDb21taXRPbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX1NlbGVjdCAmJg0KKyAgICAgIGJMQnV0dG9uVXApIHsNCisgICAgbV9wRG9jVmlldy0+U2V0Rm9jdXNXaWRnZXRBY2MoTlVMTCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPblByZU9wZW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9QcmVPcGVuOw0KKyAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fUHJlT3BlbiwgJmVQYXJhbSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPblBvc3RPcGVuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfUG9zdE9wZW47DQorICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9Qb3N0T3BlbiwgJmVQYXJhbSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPbkFkZERvUmVjb3JkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+QWRkRG9SZWNvcmQodGhpcyk7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRkNvbWJvQm94OjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GRkNvbWJvQm94OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgIEZYX0RXT1JEIGR3RXZlbnRJRCA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgc3dpdGNoIChkd0V2ZW50SUQpIHsNCisgICAgY2FzZSBGV0xfRVZUSEFTSF9DTUJfU2VsQ2hhbmdlZDogew0KKyAgICAgIENGV0xfRXZ0Q21iU2VsQ2hhbmdlZCogcG9zdEV2ZW50ID0gKENGV0xfRXZ0Q21iU2VsQ2hhbmdlZCopcEV2ZW50Ow0KKyAgICAgIE9uU2VsZWN0Q2hhbmdlZChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLCBwb3N0RXZlbnQtPmlBcnJheVNlbHMsDQorICAgICAgICAgICAgICAgICAgICAgIHBvc3RFdmVudC0+YkxCdXR0b25VcCk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCi0gICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCi19DQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uVGV4dENoYW5nZWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0NoYW5nZWQpDQotew0KLSAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KLSAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZShlUGFyYW0ubV93c1ByZXZUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQotICAgIGVQYXJhbS5tX3dzQ2hhbmdlID0gd3NDaGFuZ2VkOw0KLSAgICBGV0xFdmVudFNlbENoYW5nZSgmZVBhcmFtKTsNCi19DQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uU2VsZWN0Q2hhbmdlZChJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmFyclNlbHMsIEZYX0JPT0wgYkxCdXR0b25VcCkNCi17DQotICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQotICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzUHJldlRleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCi0gICAgRldMRXZlbnRTZWxDaGFuZ2UoJmVQYXJhbSk7DQotICAgIGlmIChtX3BEYXRhQWNjLT5HZXRDaG9pY2VMaXN0Q29tbWl0T24oKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9TZWxlY3QgJiYgYkxCdXR0b25VcCkgew0KLSAgICAgICAgbV9wRG9jVmlldy0+U2V0Rm9jdXNXaWRnZXRBY2MoTlVMTCk7DQorICAgIGNhc2UgRldMX0VWVEhBU0hfQ01CX0VkaXRDaGFuZ2VkOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGFuZ2VkOw0KKyAgICAgIE9uVGV4dENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgd3NDaGFuZ2VkKTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLX0NCi12b2lkIENYRkFfRkZDb21ib0JveDo6T25QcmVPcGVuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCi0gICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfUHJlT3BlbjsNCi0gICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQotICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9QcmVPcGVuLCAmZVBhcmFtKTsNCi19DQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uUG9zdE9wZW4oSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KLSAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Qb3N0T3BlbjsNCi0gICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQotICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9Qb3N0T3BlbiwgJmVQYXJhbSk7DQotfQ0KLXZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPbkFkZERvUmVjb3JkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KQ0KLXsNCi0gICAgR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPkFkZERvUmVjb3JkKHRoaXMpOw0KLX0NCi1pbnQzMl90IENYRkFfRkZDb21ib0JveDo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCi19DQotRldMX0VSUiBDWEZBX0ZGQ29tYm9Cb3g6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCi17DQotICAgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCi0gICAgRlhfRFdPUkQgZHdFdmVudElEID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQotICAgIHN3aXRjaCAoZHdFdmVudElEKSB7DQotICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0NNQl9TZWxDaGFuZ2VkOiB7DQotICAgICAgICAgICAgICAgIENGV0xfRXZ0Q21iU2VsQ2hhbmdlZCAqcG9zdEV2ZW50ID0gKENGV0xfRXZ0Q21iU2VsQ2hhbmdlZCopcEV2ZW50Ow0KLSAgICAgICAgICAgICAgICBPblNlbGVjdENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgcG9zdEV2ZW50LT5pQXJyYXlTZWxzLCBwb3N0RXZlbnQtPmJMQnV0dG9uVXApOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0NNQl9FZGl0Q2hhbmdlZDogew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYW5nZWQ7DQotICAgICAgICAgICAgICAgIE9uVGV4dENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgd3NDaGFuZ2VkKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9DTUJfUHJlRHJvcERvd246IHsNCi0gICAgICAgICAgICAgICAgT25QcmVPcGVuKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCkpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0NNQl9Qb3N0RHJvcERvd246IHsNCi0gICAgICAgICAgICAgICAgT25Qb3N0T3BlbihtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCisgICAgY2FzZSBGV0xfRVZUSEFTSF9DTUJfUHJlRHJvcERvd246IHsNCisgICAgICBPblByZU9wZW4obV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOw0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX0NNQl9Qb3N0RHJvcERvd246IHsNCisgICAgICBPblBvc3RPcGVuKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQogfQ0KLUZXTF9FUlIgQ1hGQV9GRkNvbWJvQm94OjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PbkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCitGV0xfRVJSIENYRkFfRkZDb21ib0JveDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PbkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hvaWNlbGlzdC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hvaWNlbGlzdC5oCmluZGV4IGFlZGRlZGIuLjcxZGM3ODMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNob2ljZWxpc3QuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmgKQEAgLTYsNzcgKzYsODcgQEAKIA0KICNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9DSE9JQ0VMSVNUX0lNUF9IDQogI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX0NIT0lDRUxJU1RfSU1QX0gNCi1jbGFzcyBDWEZBX0ZGTGlzdEJveCA6IHB1YmxpYyBDWEZBX0ZGRmllbGQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGTGlzdEJveChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GRkxpc3RCb3goKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlMb2FkV2lkZ2V0KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCk7DQotcHJvdGVjdGVkOg0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNvbW1pdERhdGEoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlVcGRhdGVGV0xEYXRhKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNEYXRhQ2hhbmdlZCgpOw0KLSAgICBGWF9EV09SRAkJCUdldEFsaWdubWVudCgpOw0KLXB1YmxpYzoNCi0gICAgdm9pZAkJT25TZWxlY3RDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfSW50MzJBcnJheSAmYXJyU2Vscyk7DQotICAgIHZvaWQJCQlTZXRJdGVtU3RhdGUoaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKTsNCi0gICAgdm9pZAkJCUluc2VydEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsLCBpbnQzMl90IG5JbmRleCA9IC0xKTsNCi0gICAgdm9pZAkJCURlbGV0ZUl0ZW0oaW50MzJfdCBuSW5kZXgpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLXByb3RlY3RlZDoNCi0gICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSoJbV9wT2xkRGVsZWdhdGU7DQorY2xhc3MgQ1hGQV9GRkxpc3RCb3ggOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkxpc3RCb3goQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGTGlzdEJveCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdmlydHVhbCBGWF9CT09MIENvbW1pdERhdGEoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVcGRhdGVGV0xEYXRhKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZCgpOw0KKyAgRlhfRFdPUkQgR2V0QWxpZ25tZW50KCk7DQorDQorIHB1YmxpYzoNCisgIHZvaWQgT25TZWxlY3RDaGFuZ2VkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBjb25zdCBDRlhfSW50MzJBcnJheSYgYXJyU2Vscyk7DQorICB2b2lkIFNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpOw0KKyAgdm9pZCBJbnNlcnRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwgaW50MzJfdCBuSW5kZXggPSAtMSk7DQorICB2b2lkIERlbGV0ZUl0ZW0oaW50MzJfdCBuSW5kZXgpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7DQogfTsNCi1jbGFzcyBDWEZBX0ZGQ29tYm9Cb3ggOiBwdWJsaWMgQ1hGQV9GRkZpZWxkDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GRkNvbWJvQm94KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZGQ29tYm9Cb3goKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRCQm94KENGWF9SZWN0RiAmcnRCb3gsIEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9CT09MIGJEcmF3Rm9jdXMgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJTG9hZFdpZGdldCgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25SQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5VbmRvKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuUmVkbygpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVVuZG8oKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlSZWRvKCk7DQorY2xhc3MgQ1hGQV9GRkNvbWJvQm94IDogcHVibGljIENYRkFfRkZGaWVsZCB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZDb21ib0JveChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgIHZpcnR1YWwgfkNYRkFfRkZDb21ib0JveCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goQ0ZYX1JlY3RGJiBydEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRHJhd0ZvY3VzID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblJlZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhbkNvcHkoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5DdXQoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5QYXN0ZSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblNlbGVjdEFsbCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNlbGVjdEFsbCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlbGV0ZSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlU2VsZWN0KCk7DQotICAgIHZvaWQJT3BlbkRyb3BEb3duTGlzdCgpOw0KLXByb3RlY3RlZDoNCi0gICAgdmlydHVhbAlGWF9CT09MCQlQdEluQWN0aXZlUmVjdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNvbW1pdERhdGEoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlVcGRhdGVGV0xEYXRhKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNEYXRhQ2hhbmdlZCgpOw0KLSAgICBGWF9EV09SRAkJCUdldEFsaWdubWVudCgpOw0KLSAgICB2b2lkCQkJCUZXTEV2ZW50U2VsQ2hhbmdlKENYRkFfRXZlbnRQYXJhbSogcFBhcmFtKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5Db3B5KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQ3V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuUGFzdGUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5TZWxlY3RBbGwoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpOw0KKyAgdmlydHVhbCBGWF9CT09MIEN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZWxlY3RBbGwoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEZWxldGUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEZVNlbGVjdCgpOw0KKyAgdm9pZCBPcGVuRHJvcERvd25MaXN0KCk7DQogDQotICAgIENGWF9XaWRlU3RyaW5nCQltX3dzTmV3VmFsdWU7DQotcHVibGljOg0KLSAgICB2b2lkCU9uVGV4dENoYW5nZWQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0NoYW5nZWQpOw0KLSAgICB2b2lkCU9uU2VsZWN0Q2hhbmdlZChJRldMX1dpZGdldCAqcFdpZGdldCwgY29uc3QgQ0ZYX0ludDMyQXJyYXkgJmFyclNlbHMsIEZYX0JPT0wgYkxCdXR0b25VcCk7DQotICAgIHZvaWQJT25QcmVPcGVuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdm9pZAlPblBvc3RPcGVuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdm9pZAlPbkFkZERvUmVjb3JkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdm9pZAkJCVNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpOw0KLSAgICB2b2lkCQkJSW5zZXJ0SXRlbShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTGFiZWwsIGludDMyX3QgbkluZGV4ID0gLTEpOw0KLSAgICB2b2lkCQkJRGVsZXRlSXRlbShpbnQzMl90IG5JbmRleCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ID0gTlVMTCk7DQotcHJvdGVjdGVkOg0KLSAgICBJRldMX1dpZGdldERlbGVnYXRlKgltX3BPbGREZWxlZ2F0ZTsNCisgcHJvdGVjdGVkOg0KKyAgdmlydHVhbCBGWF9CT09MIFB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ29tbWl0RGF0YSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFVwZGF0ZUZXTERhdGEoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0RhdGFDaGFuZ2VkKCk7DQorICBGWF9EV09SRCBHZXRBbGlnbm1lbnQoKTsNCisgIHZvaWQgRldMRXZlbnRTZWxDaGFuZ2UoQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0pOw0KKw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c05ld1ZhbHVlOw0KKw0KKyBwdWJsaWM6DQorICB2b2lkIE9uVGV4dENoYW5nZWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NoYW5nZWQpOw0KKyAgdm9pZCBPblNlbGVjdENoYW5nZWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgYXJyU2VscywNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxCdXR0b25VcCk7DQorICB2b2lkIE9uUHJlT3BlbihJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2b2lkIE9uUG9zdE9wZW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdm9pZCBPbkFkZERvUmVjb3JkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZvaWQgU2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCk7DQorICB2b2lkIEluc2VydEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsLCBpbnQzMl90IG5JbmRleCA9IC0xKTsNCisgIHZvaWQgRGVsZXRlSXRlbShpbnQzMl90IG5JbmRleCk7DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX1dpZGdldERlbGVnYXRlKiBtX3BPbGREZWxlZ2F0ZTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvYy5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2MuY3BwCmluZGV4IDM2ZTY5ZGIuLmRjNjBlODQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvYy5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jLmNwcApAQCAtMTMsNDM3ICsxMyw0NDIgQEAKICNpbmNsdWRlICJ4ZmFfZmZub3RpZnkuaCINCiAjaW5jbHVkZSAieGZhX2ZvbnRtZ3IuaCINCiBDWEZBX0ZGRG9jOjpDWEZBX0ZGRG9jKENYRkFfRkZBcHAqIHBBcHAsIElYRkFfRG9jUHJvdmlkZXIqIHBEb2NQcm92aWRlcikNCi0gICAgOiBtX3BEb2NQcm92aWRlcihwRG9jUHJvdmlkZXIpDQotICAgICwgbV9kd0RvY1R5cGUoWEZBX0RPQ1RZUEVfU3RhdGljKQ0KLSAgICAsIG1fcERvY3VtZW50KE5VTEwpDQotICAgICwgbV9wU3RyZWFtKE5VTEwpDQotICAgICwgbV9wQXBwKHBBcHApDQotICAgICwgbV9wTm90aWZ5KE5VTEwpDQotICAgICwgbV9wUERGRG9jKE5VTEwpDQotICAgICwgbV9iT3duU3RyZWFtKFRSVUUpDQotew0KKyAgICA6IG1fcERvY1Byb3ZpZGVyKHBEb2NQcm92aWRlciksDQorICAgICAgbV9kd0RvY1R5cGUoWEZBX0RPQ1RZUEVfU3RhdGljKSwNCisgICAgICBtX3BEb2N1bWVudChOVUxMKSwNCisgICAgICBtX3BTdHJlYW0oTlVMTCksDQorICAgICAgbV9wQXBwKHBBcHApLA0KKyAgICAgIG1fcE5vdGlmeShOVUxMKSwNCisgICAgICBtX3BQREZEb2MoTlVMTCksDQorICAgICAgbV9iT3duU3RyZWFtKFRSVUUpIHt9DQorQ1hGQV9GRkRvYzo6fkNYRkFfRkZEb2MoKSB7DQorICBDbG9zZURvYygpOw0KIH0NCi1DWEZBX0ZGRG9jOjp+Q1hGQV9GRkRvYygpDQotew0KLSAgICBDbG9zZURvYygpOw0KK0ZYX0RXT1JEIENYRkFfRkZEb2M6OkdldERvY1R5cGUoKSB7DQorICByZXR1cm4gbV9kd0RvY1R5cGU7DQogfQ0KLUZYX0RXT1JEIENYRkFfRkZEb2M6OkdldERvY1R5cGUoKQ0KLXsNCi0gICAgcmV0dXJuIG1fZHdEb2NUeXBlOw0KK2ludDMyX3QgQ1hGQV9GRkRvYzo6U3RhcnRMb2FkKCkgew0KKyAgbV9wTm90aWZ5ID0gRlhfTkVXIENYRkFfRkZOb3RpZnkodGhpcyk7DQorICBJWEZBX0RvY1BhcnNlciogcERvY1BhcnNlciA9IElYRkFfRG9jUGFyc2VyOjpDcmVhdGUobV9wTm90aWZ5KTsNCisgIGludDMyX3QgaVN0YXR1cyA9IHBEb2NQYXJzZXItPlN0YXJ0UGFyc2UobV9wU3RyZWFtKTsNCisgIG1fcERvY3VtZW50ID0gcERvY1BhcnNlci0+R2V0RG9jdW1lbnQoKTsNCisgIHJldHVybiBpU3RhdHVzOw0KIH0NCi1pbnQzMl90IENYRkFfRkZEb2M6OlN0YXJ0TG9hZCgpDQotew0KLSAgICBtX3BOb3RpZnkgPSBGWF9ORVcgQ1hGQV9GRk5vdGlmeSh0aGlzKTsNCi0gICAgSVhGQV9Eb2NQYXJzZXIqIHBEb2NQYXJzZXIgPSBJWEZBX0RvY1BhcnNlcjo6Q3JlYXRlKG1fcE5vdGlmeSk7DQotICAgIGludDMyX3QgaVN0YXR1cyA9IHBEb2NQYXJzZXItPlN0YXJ0UGFyc2UobV9wU3RyZWFtKTsNCi0gICAgbV9wRG9jdW1lbnQgPSBwRG9jUGFyc2VyLT5HZXREb2N1bWVudCgpOw0KLSAgICByZXR1cm4gaVN0YXR1czsNCitGWF9CT09MIFhGQV9HZXRQREZDb250ZW50c0Zyb21QREZYTUwoSUZERV9YTUxOb2RlKiBwUERGRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHBCeXRlQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQnVmZmVyU2l6ZSkgew0KKyAgSUZERV9YTUxFbGVtZW50KiBwRG9jdW1lbnRFbGVtZW50ID0gTlVMTDsNCisgIGZvciAoSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9DQorICAgICAgICAgICBwUERGRWxlbWVudC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgcFhNTE5vZGU7IHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RhZ05hbWU7DQorICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlOw0KKyAgICAgIHBYTUxFbGVtZW50LT5HZXRUYWdOYW1lKHdzVGFnTmFtZSk7DQorICAgICAgaWYgKHdzVGFnTmFtZS5FcXVhbChGWF9XU1RSQyhMImRvY3VtZW50IikpKSB7DQorICAgICAgICBwRG9jdW1lbnRFbGVtZW50ID0gcFhNTEVsZW1lbnQ7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmICghcERvY3VtZW50RWxlbWVudCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRkRFX1hNTEVsZW1lbnQqIHBDaHVua0VsZW1lbnQgPSBOVUxMOw0KKyAgZm9yIChJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0NCisgICAgICAgICAgIHBEb2N1bWVudEVsZW1lbnQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgIHBYTUxOb2RlOyBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWdOYW1lOw0KKyAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZTsNCisgICAgICBwWE1MRWxlbWVudC0+R2V0VGFnTmFtZSh3c1RhZ05hbWUpOw0KKyAgICAgIGlmICh3c1RhZ05hbWUuRXF1YWwoRlhfV1NUUkMoTCJjaHVuayIpKSkgew0KKyAgICAgICAgcENodW5rRWxlbWVudCA9IHBYTUxFbGVtZW50Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoIXBDaHVua0VsZW1lbnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQREZDb250ZW50Ow0KKyAgcENodW5rRWxlbWVudC0+R2V0VGV4dERhdGEod3NQREZDb250ZW50KTsNCisgIGlCdWZmZXJTaXplID0gRlhfQmFzZTY0RGVjb2RlVyh3c1BERkNvbnRlbnQsIHdzUERGQ29udGVudC5HZXRMZW5ndGgoKSwgTlVMTCk7DQorICBwQnl0ZUJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlCdWZmZXJTaXplICsgMSk7DQorICBpZiAoIXBCeXRlQnVmZmVyKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHBCeXRlQnVmZmVyW2lCdWZmZXJTaXplXSA9ICcwJzsNCisgIEZYX0Jhc2U2NERlY29kZVcod3NQREZDb250ZW50LCB3c1BERkNvbnRlbnQuR2V0TGVuZ3RoKCksIHBCeXRlQnVmZmVyKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIFhGQV9HZXRQREZDb250ZW50c0Zyb21QREZYTUwoSUZERV9YTUxOb2RlICpwUERGRWxlbWVudCwgdWludDhfdCogJnBCeXRlQnVmZmVyLCBpbnQzMl90JiBpQnVmZmVyU2l6ZSkNCi17DQotICAgIElGREVfWE1MRWxlbWVudCogcERvY3VtZW50RWxlbWVudCA9IE5VTEw7DQotICAgIGZvciAoSUZERV9YTUxOb2RlICpwWE1MTm9kZSA9IHBQREZFbGVtZW50LT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MTm9kZTsgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCi0gICAgICAgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RhZ05hbWU7DQotICAgICAgICAgICAgSUZERV9YTUxFbGVtZW50ICogcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGU7DQotICAgICAgICAgICAgcFhNTEVsZW1lbnQtPkdldFRhZ05hbWUod3NUYWdOYW1lKTsNCi0gICAgICAgICAgICBpZiAod3NUYWdOYW1lLkVxdWFsKEZYX1dTVFJDKEwiZG9jdW1lbnQiKSkpIHsNCi0gICAgICAgICAgICAgICAgcERvY3VtZW50RWxlbWVudCA9IHBYTUxFbGVtZW50Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQordm9pZCBYRkFfWFBEUGFja2V0X01lcmdlUm9vdE5vZGUoQ1hGQV9Ob2RlKiBwT3JpZ2luUm9vdCwgQ1hGQV9Ob2RlKiBwTmV3Um9vdCkgew0KKyAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5ld1Jvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChwQ2hpbGROb2RlKSB7DQorICAgIENYRkFfTm9kZSogcE9yaWdpbkNoaWxkID0NCisgICAgICAgIHBPcmlnaW5Sb290LT5HZXRGaXJzdENoaWxkQnlOYW1lKHBDaGlsZE5vZGUtPkdldE5hbWVIYXNoKCkpOw0KKyAgICBpZiAocE9yaWdpbkNoaWxkKSB7DQorICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwTmV4dFNpYmxpbmcgPQ0KKyAgICAgICAgICBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgIHBOZXdSb290LT5SZW1vdmVDaGlsZChwQ2hpbGROb2RlKTsNCisgICAgICBwT3JpZ2luUm9vdC0+SW5zZXJ0Q2hpbGQocENoaWxkTm9kZSk7DQorICAgICAgcENoaWxkTm9kZSA9IHBOZXh0U2libGluZzsNCisgICAgICBwTmV4dFNpYmxpbmcgPSBOVUxMOw0KICAgICB9DQotICAgIGlmICghcERvY3VtZW50RWxlbWVudCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIElGREVfWE1MRWxlbWVudCogcENodW5rRWxlbWVudCA9IE5VTEw7DQotICAgIGZvciAoSUZERV9YTUxOb2RlICpwWE1MTm9kZSA9IHBEb2N1bWVudEVsZW1lbnQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7IHBYTUxOb2RlOyBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KLSAgICAgICAgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGFnTmFtZTsNCi0gICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQgKilwWE1MTm9kZTsNCi0gICAgICAgICAgICBwWE1MRWxlbWVudC0+R2V0VGFnTmFtZSh3c1RhZ05hbWUpOw0KLSAgICAgICAgICAgIGlmICh3c1RhZ05hbWUuRXF1YWwoRlhfV1NUUkMoTCJjaHVuayIpKSkgew0KLSAgICAgICAgICAgICAgICBwQ2h1bmtFbGVtZW50ID0gcFhNTEVsZW1lbnQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoIXBDaHVua0VsZW1lbnQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1BERkNvbnRlbnQ7DQotICAgIHBDaHVua0VsZW1lbnQtPkdldFRleHREYXRhKHdzUERGQ29udGVudCk7DQotICAgIGlCdWZmZXJTaXplID0gRlhfQmFzZTY0RGVjb2RlVyh3c1BERkNvbnRlbnQsIHdzUERGQ29udGVudC5HZXRMZW5ndGgoKSwgTlVMTCk7DQotICAgIHBCeXRlQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgaUJ1ZmZlclNpemUgKyAxKTsNCi0gICAgaWYgKCFwQnl0ZUJ1ZmZlcikgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHBCeXRlQnVmZmVyW2lCdWZmZXJTaXplXSA9ICcwJzsNCi0gICAgRlhfQmFzZTY0RGVjb2RlVyh3c1BERkNvbnRlbnQsIHdzUERGQ29udGVudC5HZXRMZW5ndGgoKSwgcEJ5dGVCdWZmZXIpOw0KLSAgICByZXR1cm4gVFJVRTsNCisgIH0NCiB9DQotdm9pZCBYRkFfWFBEUGFja2V0X01lcmdlUm9vdE5vZGUoQ1hGQV9Ob2RlICpwT3JpZ2luUm9vdCwgQ1hGQV9Ob2RlKiBwTmV3Um9vdCkNCi17DQotICAgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBOZXdSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgIHdoaWxlIChwQ2hpbGROb2RlKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBPcmlnaW5DaGlsZCA9IHBPcmlnaW5Sb290LT5HZXRGaXJzdENoaWxkQnlOYW1lKHBDaGlsZE5vZGUtPkdldE5hbWVIYXNoKCkpOw0KLSAgICAgICAgaWYgKHBPcmlnaW5DaGlsZCkgew0KLSAgICAgICAgICAgIHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUgKnBOZXh0U2libGluZyA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgICAgICAgICAgcE5ld1Jvb3QtPlJlbW92ZUNoaWxkKHBDaGlsZE5vZGUpOw0KLSAgICAgICAgICAgIHBPcmlnaW5Sb290LT5JbnNlcnRDaGlsZChwQ2hpbGROb2RlKTsNCi0gICAgICAgICAgICBwQ2hpbGROb2RlID0gcE5leHRTaWJsaW5nOw0KLSAgICAgICAgICAgIHBOZXh0U2libGluZyA9IE5VTEw7DQotICAgICAgICB9DQoraW50MzJfdCBDWEZBX0ZGRG9jOjpEb0xvYWQoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGludDMyX3QgaVN0YXR1cyA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+RG9QYXJzZShwUGF1c2UpOw0KKyAgaWYgKGlTdGF0dXMgPT0gWEZBX1BBUlNFU1RBVFVTX0RvbmUgJiYgIW1fcFBERkRvYykgew0KKyAgICBDWEZBX05vZGUqIHBQREZOb2RlID0gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1BkZik7DQorICAgIGlmICghcFBERk5vZGUpIHsNCisgICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N5bnRheEVycjsNCiAgICAgfQ0KKyAgICBJRkRFX1hNTE5vZGUqIHBQREZYTUwgPSBwUERGTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgaWYgKHBQREZYTUwtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgIH0NCisgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSA9IDA7DQorICAgIHVpbnQ4X3QqIHBCeXRlQnVmZmVyID0gTlVMTDsNCisgICAgSUZYX0ZpbGVSZWFkKiBwWEZBUmVhZGVyID0gTlVMTDsNCisgICAgaWYgKFhGQV9HZXRQREZDb250ZW50c0Zyb21QREZYTUwocFBERlhNTCwgcEJ5dGVCdWZmZXIsIGlCdWZmZXJTaXplKSkgew0KKyAgICAgIHBYRkFSZWFkZXIgPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ5dGVCdWZmZXIsIGlCdWZmZXJTaXplLCBUUlVFKTsNCisgICAgICBpZiAoIXBYRkFSZWFkZXIpIHsNCisgICAgICAgIGlmIChwQnl0ZUJ1ZmZlcikgew0KKyAgICAgICAgICBGWF9GcmVlKHBCeXRlQnVmZmVyKTsNCisgICAgICAgICAgcEJ5dGVCdWZmZXIgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzSHJlZjsNCisgICAgICAoKElGREVfWE1MRWxlbWVudCopcFBERlhNTCktPkdldFN0cmluZyhMImhyZWYiLCB3c0hyZWYpOw0KKyAgICAgIGlmICghd3NIcmVmLklzRW1wdHkoKSkgew0KKyAgICAgICAgcFhGQVJlYWRlciA9IEdldERvY1Byb3ZpZGVyKCktPk9wZW5MaW5rZWRGaWxlKHRoaXMsIHdzSHJlZik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghcFhGQVJlYWRlcikgew0KKyAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyOw0KKyAgICB9DQorICAgIENQREZfRG9jdW1lbnQqIHBQREZEb2N1bWVudCA9DQorICAgICAgICBHZXREb2NQcm92aWRlcigpLT5PcGVuUERGKHRoaXMsIHBYRkFSZWFkZXIsIFRSVUUpOw0KKyAgICBGWFNZU19hc3NlcnQoIW1fcFBERkRvYyk7DQorICAgIGlmICghT3BlbkRvYyhwUERGRG9jdW1lbnQpKSB7DQorICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgIH0NCisgICAgSVhGQV9QYXJzZXIqIHBQYXJzZXIgPSBJWEZBX1BhcnNlcjo6Q3JlYXRlKG1fcERvY3VtZW50LCBUUlVFKTsNCisgICAgaWYgKCFwUGFyc2VyKSB7DQorICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwUm9vdE5vZGUgPSBOVUxMOw0KKyAgICBpZiAocFBhcnNlci0+U3RhcnRQYXJzZShtX3BTdHJlYW0pID09IFhGQV9QQVJTRVNUQVRVU19SZWFkeSAmJg0KKyAgICAgICAgcFBhcnNlci0+RG9QYXJzZShOVUxMKSA9PSBYRkFfUEFSU0VTVEFUVVNfRG9uZSkgew0KKyAgICAgIHBSb290Tm9kZSA9IHBQYXJzZXItPkdldFJvb3ROb2RlKCk7DQorICAgIH0NCisgICAgaWYgKHBSb290Tm9kZSAmJiBtX3BEb2N1bWVudC0+R2V0Um9vdCgpKSB7DQorICAgICAgWEZBX1hQRFBhY2tldF9NZXJnZVJvb3ROb2RlKG1fcERvY3VtZW50LT5HZXRSb290KCksIHBSb290Tm9kZSk7DQorICAgICAgaVN0YXR1cyA9IFhGQV9QQVJTRVNUQVRVU19Eb25lOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGF0dXMgPSBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KKyAgICB9DQorICAgIHBQYXJzZXItPlJlbGVhc2UoKTsNCisgICAgcFBhcnNlciA9IE5VTEw7DQorICB9DQorICByZXR1cm4gaVN0YXR1czsNCiB9DQotaW50MzJfdCBDWEZBX0ZGRG9jOjpEb0xvYWQoSUZYX1BhdXNlICpwUGF1c2UgKQ0KLXsNCi0gICAgaW50MzJfdCBpU3RhdHVzID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5Eb1BhcnNlKHBQYXVzZSk7DQotICAgIGlmIChpU3RhdHVzID09IFhGQV9QQVJTRVNUQVRVU19Eb25lICYmICFtX3BQREZEb2MpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcFBERk5vZGUgPSAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfUGRmKTsNCi0gICAgICAgIGlmICghcFBERk5vZGUpIHsNCi0gICAgICAgICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N5bnRheEVycjsNCi0gICAgICAgIH0NCi0gICAgICAgIElGREVfWE1MTm9kZSAqcFBERlhNTCA9IHBQREZOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICAgICAgaWYgKHBQREZYTUwtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlCdWZmZXJTaXplID0gMDsNCi0gICAgICAgIHVpbnQ4X3QqIHBCeXRlQnVmZmVyID0gTlVMTDsNCi0gICAgICAgIElGWF9GaWxlUmVhZCogcFhGQVJlYWRlciA9IE5VTEw7DQotICAgICAgICBpZiAoWEZBX0dldFBERkNvbnRlbnRzRnJvbVBERlhNTChwUERGWE1MLCBwQnl0ZUJ1ZmZlciwgaUJ1ZmZlclNpemUpKSB7DQotICAgICAgICAgICAgcFhGQVJlYWRlciA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwQnl0ZUJ1ZmZlciwgaUJ1ZmZlclNpemUsIFRSVUUpOw0KLSAgICAgICAgICAgIGlmICghcFhGQVJlYWRlcikgew0KLSAgICAgICAgICAgICAgICBpZiAocEJ5dGVCdWZmZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUocEJ5dGVCdWZmZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgcEJ5dGVCdWZmZXIgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIcmVmOw0KLSAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KilwUERGWE1MKS0+R2V0U3RyaW5nKEwiaHJlZiIsIHdzSHJlZik7DQotICAgICAgICAgICAgaWYgKCF3c0hyZWYuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIHBYRkFSZWFkZXIgPSBHZXREb2NQcm92aWRlcigpLT5PcGVuTGlua2VkRmlsZSh0aGlzLCB3c0hyZWYpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghcFhGQVJlYWRlcikgew0KLSAgICAgICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1BERl9Eb2N1bWVudCogcFBERkRvY3VtZW50ID0gR2V0RG9jUHJvdmlkZXIoKS0+T3BlblBERih0aGlzLCBwWEZBUmVhZGVyLCBUUlVFKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydCghbV9wUERGRG9jKTsNCi0gICAgICAgIGlmICghT3BlbkRvYyhwUERGRG9jdW1lbnQpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQotICAgICAgICB9DQotICAgICAgICBJWEZBX1BhcnNlciogcFBhcnNlciA9IElYRkFfUGFyc2VyOjpDcmVhdGUobV9wRG9jdW1lbnQsIFRSVUUpOw0KLSAgICAgICAgaWYgKCFwUGFyc2VyKSB7DQotICAgICAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX05vZGUqIHBSb290Tm9kZSA9IE5VTEw7DQotICAgICAgICBpZiAocFBhcnNlci0+U3RhcnRQYXJzZShtX3BTdHJlYW0pID09IFhGQV9QQVJTRVNUQVRVU19SZWFkeSAmJiBwUGFyc2VyLT5Eb1BhcnNlKE5VTEwpID09IFhGQV9QQVJTRVNUQVRVU19Eb25lKSB7DQotICAgICAgICAgICAgcFJvb3ROb2RlID0gcFBhcnNlci0+R2V0Um9vdE5vZGUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwUm9vdE5vZGUgJiYgbV9wRG9jdW1lbnQtPkdldFJvb3QoKSkgew0KLSAgICAgICAgICAgIFhGQV9YUERQYWNrZXRfTWVyZ2VSb290Tm9kZShtX3BEb2N1bWVudC0+R2V0Um9vdCgpLCBwUm9vdE5vZGUpOw0KLSAgICAgICAgICAgIGlTdGF0dXMgPSBYRkFfUEFSU0VTVEFUVVNfRG9uZTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVN0YXR1cyA9IFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQotICAgICAgICB9DQotICAgICAgICBwUGFyc2VyLT5SZWxlYXNlKCk7DQotICAgICAgICBwUGFyc2VyID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gaVN0YXR1czsNCit2b2lkIENYRkFfRkZEb2M6OlN0b3BMb2FkKCkgew0KKyAgbV9wQXBwLT5HZXRYRkFGb250TWdyKCktPkxvYWREb2NGb250cyh0aGlzKTsNCisgIG1fZHdEb2NUeXBlID0gWEZBX0RPQ1RZUEVfU3RhdGljOw0KKyAgQ1hGQV9Ob2RlKiBwQ29uZmlnID0gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0NvbmZpZyk7DQorICBpZiAoIXBDb25maWcpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQWNyb2JhdCA9IHBDb25maWctPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0Fjcm9iYXQpOw0KKyAgaWYgKCFwQWNyb2JhdCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHBBY3JvYmF0NyA9IHBBY3JvYmF0LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9BY3JvYmF0Nyk7DQorICBpZiAoIXBBY3JvYmF0Nykgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHBEeW5hbWljUmVuZGVyID0NCisgICAgICBwQWNyb2JhdDctPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0R5bmFtaWNSZW5kZXIpOw0KKyAgaWYgKCFwRHluYW1pY1JlbmRlcikgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1R5cGU7DQorICBpZiAocER5bmFtaWNSZW5kZXItPlRyeUNvbnRlbnQod3NUeXBlKSAmJiB3c1R5cGUgPT0gRlhfV1NUUkMoTCJyZXF1aXJlZCIpKSB7DQorICAgIG1fZHdEb2NUeXBlID0gWEZBX0RPQ1RZUEVfRHluYW1pYzsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZGRG9jOjpTdG9wTG9hZCgpDQotew0KLSAgICBtX3BBcHAtPkdldFhGQUZvbnRNZ3IoKS0+TG9hZERvY0ZvbnRzKHRoaXMpOw0KLSAgICBtX2R3RG9jVHlwZSA9IFhGQV9ET0NUWVBFX1N0YXRpYzsNCi0gICAgQ1hGQV9Ob2RlKiBwQ29uZmlnID0gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0NvbmZpZyk7DQotICAgIGlmICghcENvbmZpZykgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcEFjcm9iYXQgPSBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9BY3JvYmF0KTsNCi0gICAgaWYgKCFwQWNyb2JhdCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcEFjcm9iYXQ3ID0gcEFjcm9iYXQtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0Fjcm9iYXQ3KTsNCi0gICAgaWYgKCFwQWNyb2JhdDcpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBEeW5hbWljUmVuZGVyID0gcEFjcm9iYXQ3LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9EeW5hbWljUmVuZGVyKTsNCi0gICAgaWYgKCFwRHluYW1pY1JlbmRlcikgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVHlwZTsNCi0gICAgaWYgKHBEeW5hbWljUmVuZGVyLT5UcnlDb250ZW50KHdzVHlwZSkgJiYgd3NUeXBlID09IEZYX1dTVFJDKEwicmVxdWlyZWQiKSkgew0KLSAgICAgICAgbV9kd0RvY1R5cGUgPSBYRkFfRE9DVFlQRV9EeW5hbWljOw0KLSAgICB9DQorSVhGQV9Eb2NWaWV3KiBDWEZBX0ZGRG9jOjpDcmVhdGVEb2NWaWV3KEZYX0RXT1JEIGR3Vmlldykgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0NCisgICAgICAoQ1hGQV9GRkRvY1ZpZXcqKW1fbWFwVHlwZVRvRG9jVmlldy5HZXRWYWx1ZUF0KCh2b2lkKikodWludHB0cl90KWR3Vmlldyk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHBEb2NWaWV3ID0gRlhfTkVXIENYRkFfRkZEb2NWaWV3KHRoaXMpOw0KKyAgICBtX21hcFR5cGVUb0RvY1ZpZXcuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdWaWV3LCBwRG9jVmlldyk7DQorICB9DQorICByZXR1cm4gcERvY1ZpZXc7DQogfQ0KLUlYRkFfRG9jVmlldyogQ1hGQV9GRkRvYzo6Q3JlYXRlRG9jVmlldyhGWF9EV09SRCBkd1ZpZXcgKQ0KLXsNCi0gICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gKENYRkFfRkZEb2NWaWV3KiltX21hcFR5cGVUb0RvY1ZpZXcuR2V0VmFsdWVBdCgodm9pZCopKHVpbnRwdHJfdClkd1ZpZXcpOw0KLSAgICBpZiAoIXBEb2NWaWV3KSB7DQotICAgICAgICBwRG9jVmlldyA9IEZYX05FVyBDWEZBX0ZGRG9jVmlldyh0aGlzKTsNCi0gICAgICAgIG1fbWFwVHlwZVRvRG9jVmlldy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd1ZpZXcsIHBEb2NWaWV3KTsNCitDWEZBX0ZGRG9jVmlldyogQ1hGQV9GRkRvYzo6R2V0RG9jVmlldyhJWEZBX0RvY0xheW91dCogcExheW91dCkgew0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFR5cGVUb0RvY1ZpZXcuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIHZvaWQqIHBUeXBlOw0KKyAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXc7DQorICAgIG1fbWFwVHlwZVRvRG9jVmlldy5HZXROZXh0QXNzb2MocHMsIHBUeXBlLCAodm9pZComKXBEb2NWaWV3KTsNCisgICAgaWYgKHBEb2NWaWV3LT5HZXRYRkFMYXlvdXQoKSA9PSBwTGF5b3V0KSB7DQorICAgICAgcmV0dXJuIHBEb2NWaWV3Ow0KICAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9GRkRvY1ZpZXcqIENYRkFfRkZEb2M6OkdldERvY1ZpZXcoKSB7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwVHlwZVRvRG9jVmlldy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICBpZiAocHMpIHsNCisgICAgdm9pZCogcFR5cGU7DQorICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldzsNCisgICAgbV9tYXBUeXBlVG9Eb2NWaWV3LkdldE5leHRBc3NvYyhwcywgcFR5cGUsICh2b2lkKiYpcERvY1ZpZXcpOw0KICAgICByZXR1cm4gcERvY1ZpZXc7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotQ1hGQV9GRkRvY1ZpZXcqIENYRkFfRkZEb2M6OkdldERvY1ZpZXcoSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQpDQotew0KLSAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwVHlwZVRvRG9jVmlldy5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIHdoaWxlIChwcykgew0KLSAgICAgICAgdm9pZCogcFR5cGU7DQotICAgICAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXc7DQotICAgICAgICBtX21hcFR5cGVUb0RvY1ZpZXcuR2V0TmV4dEFzc29jKHBzLCBwVHlwZSwgKHZvaWQqJilwRG9jVmlldyk7DQotICAgICAgICBpZiAocERvY1ZpZXctPkdldFhGQUxheW91dCgpID09IHBMYXlvdXQpIHsNCi0gICAgICAgICAgICByZXR1cm4gcERvY1ZpZXc7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorRlhfQk9PTCBDWEZBX0ZGRG9jOjpPcGVuRG9jKElGWF9GaWxlUmVhZCogcFN0cmVhbSwgRlhfQk9PTCBiVGFrZU92ZXJGaWxlKSB7DQorICBtX2JPd25TdHJlYW0gPSBiVGFrZU92ZXJGaWxlOw0KKyAgbV9wU3RyZWFtID0gcFN0cmVhbTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1DWEZBX0ZGRG9jVmlldyogQ1hGQV9GRkRvYzo6R2V0RG9jVmlldygpDQotew0KLSAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwVHlwZVRvRG9jVmlldy5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIGlmIChwcykgew0KLSAgICAgICAgdm9pZCogcFR5cGU7DQotICAgICAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXc7DQotICAgICAgICBtX21hcFR5cGVUb0RvY1ZpZXcuR2V0TmV4dEFzc29jKHBzLCBwVHlwZSwgKHZvaWQqJilwRG9jVmlldyk7DQotICAgICAgICByZXR1cm4gcERvY1ZpZXc7DQorRlhfQk9PTCBDWEZBX0ZGRG9jOjpPcGVuRG9jKENQREZfRG9jdW1lbnQqIHBQREZEb2MpIHsNCisgIGlmIChwUERGRG9jID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBQREZEb2MtPkdldFJvb3QoKTsNCisgIGlmIChwUm9vdCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENQREZfRGljdGlvbmFyeSogcEFjcm9Gb3JtID0gcFJvb3QtPkdldERpY3QoRlhfQlNUUkMoIkFjcm9Gb3JtIikpOw0KKyAgaWYgKHBBY3JvRm9ybSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENQREZfT2JqZWN0KiBwRWxlbWVudFhGQSA9IHBBY3JvRm9ybS0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJYRkEiKSk7DQorICBpZiAocEVsZW1lbnRYRkEgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGlPYmpUeXBlID0gcEVsZW1lbnRYRkEtPkdldFR5cGUoKTsNCisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RyZWFtKj4geGZhU3RyZWFtczsNCisgIGlmIChpT2JqVHlwZSA9PSBQREZPQkpfQVJSQVkpIHsNCisgICAgQ1BERl9BcnJheSogcFhGQUFycmF5ID0gKENQREZfQXJyYXkqKXBFbGVtZW50WEZBOw0KKyAgICBGWF9EV09SRCBjb3VudCA9IHBYRkFBcnJheS0+R2V0Q291bnQoKSAvIDI7DQorICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwWEZBQXJyYXktPkdldFN0cmVhbShpICogMiArIDEpOw0KKyAgICAgIGlmIChwU3RyZWFtICE9IE5VTEwpIHsNCisgICAgICAgIHhmYVN0cmVhbXMuQWRkKHBTdHJlYW0pOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCisgIH0gZWxzZSBpZiAoaU9ialR5cGUgPT0gUERGT0JKX1NUUkVBTSkgew0KKyAgICB4ZmFTdHJlYW1zLkFkZCgoQ1BERl9TdHJlYW0qKXBFbGVtZW50WEZBKTsNCisgIH0NCisgIGlmICh4ZmFTdHJlYW1zLkdldFNpemUoKSA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQgPSBGWF9ORVcgQ1hGQV9GaWxlUmVhZDIoeGZhU3RyZWFtcyk7DQorICBpZiAoIXBGaWxlUmVhZCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3BQREZEb2MgPSBwUERGRG9jOw0KKyAgaWYgKG1fcFN0cmVhbSkgew0KKyAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgbV9wU3RyZWFtID0gTlVMTDsNCisgIH0NCisgIG1fcFN0cmVhbSA9IHBGaWxlUmVhZDsNCisgIG1fYk93blN0cmVhbSA9IFRSVUU7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGRG9jOjpPcGVuRG9jKElGWF9GaWxlUmVhZCogcFN0cmVhbSwgRlhfQk9PTCBiVGFrZU92ZXJGaWxlKQ0KLXsNCi0gICAgbV9iT3duU3RyZWFtID0gYlRha2VPdmVyRmlsZTsNCi0gICAgbV9wU3RyZWFtID0gcFN0cmVhbTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDWEZBX0ZGRG9jOjpDbG9zZURvYygpIHsNCisgIEZYX1BPU0lUSU9OIHBzQ2xvc2UgPSBtX21hcFR5cGVUb0RvY1ZpZXcuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzQ2xvc2UpIHsNCisgICAgdm9pZCogcFR5cGU7DQorICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldzsNCisgICAgbV9tYXBUeXBlVG9Eb2NWaWV3LkdldE5leHRBc3NvYyhwc0Nsb3NlLCBwVHlwZSwgKHZvaWQqJilwRG9jVmlldyk7DQorICAgIHBEb2NWaWV3LT5SdW5Eb2NDbG9zZSgpOw0KKyAgfQ0KKyAgaWYgKG1fcERvY3VtZW50KSB7DQorICAgIG1fcERvY3VtZW50LT5DbGVhckxheW91dERhdGEoKTsNCisgIH0NCisgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBUeXBlVG9Eb2NWaWV3LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICB2b2lkKiBwVHlwZTsNCisgICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3Ow0KKyAgICBtX21hcFR5cGVUb0RvY1ZpZXcuR2V0TmV4dEFzc29jKHBzLCBwVHlwZSwgKHZvaWQqJilwRG9jVmlldyk7DQorICAgIGRlbGV0ZSBwRG9jVmlldzsNCisgIH0NCisgIG1fbWFwVHlwZVRvRG9jVmlldy5SZW1vdmVBbGwoKTsNCisgIGlmIChtX3BEb2N1bWVudCkgew0KKyAgICBJWEZBX1BhcnNlciogcFBhcnNlciA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKTsNCisgICAgcFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICBtX3BEb2N1bWVudCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wTm90aWZ5KSB7DQorICAgIGRlbGV0ZSBtX3BOb3RpZnk7DQorICAgIG1fcE5vdGlmeSA9IE5VTEw7DQorICB9DQorICBtX3BBcHAtPkdldFhGQUZvbnRNZ3IoKS0+UmVsZWFzZURvY0ZvbnRzKHRoaXMpOw0KKyAgaWYgKG1fZHdEb2NUeXBlICE9IFhGQV9ET0NUWVBFX1hEUCAmJiBtX3BTdHJlYW0gJiYgbV9iT3duU3RyZWFtKSB7DQorICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICBtX3BTdHJlYW0gPSBOVUxMOw0KKyAgfQ0KKyAgcHMgPSBtX21hcE5hbWVkSW1hZ2VzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICB2b2lkKiBwTmFtZTsNCisgICAgRlhfSU1BR0VESUJfQU5EX0RQSSogcEltYWdlID0gTlVMTDsNCisgICAgbV9tYXBOYW1lZEltYWdlcy5HZXROZXh0QXNzb2MocHMsIHBOYW1lLCAodm9pZComKXBJbWFnZSk7DQorICAgIGlmIChwSW1hZ2UpIHsNCisgICAgICBkZWxldGUgcEltYWdlLT5wRGliU291cmNlOw0KKyAgICAgIHBJbWFnZS0+cERpYlNvdXJjZSA9IE5VTEw7DQorICAgICAgRlhfRnJlZShwSW1hZ2UpOw0KKyAgICAgIHBJbWFnZSA9IE5VTEw7DQorICAgIH0NCisgIH0NCisgIG1fbWFwTmFtZWRJbWFnZXMuUmVtb3ZlQWxsKCk7DQorICBJRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQorICBwTm90ZURyaXZlci0+Q2xlYXJFdmVudFRhcmdldHMoRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRkRvYzo6T3BlbkRvYyhDUERGX0RvY3VtZW50KiBwUERGRG9jKQ0KLXsNCi0gICAgaWYgKHBQREZEb2MgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwUERGRG9jLT5HZXRSb290KCk7DQotICAgIGlmIChwUm9vdCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdChGWF9CU1RSQygiQWNyb0Zvcm0iKSk7DQotICAgIGlmIChwQWNyb0Zvcm0gPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENQREZfT2JqZWN0KiBwRWxlbWVudFhGQSA9IHBBY3JvRm9ybS0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJYRkEiKSk7DQotICAgIGlmIChwRWxlbWVudFhGQSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaW50MzJfdCBpT2JqVHlwZSA9IHBFbGVtZW50WEZBLT5HZXRUeXBlKCk7DQotICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RyZWFtKj4geGZhU3RyZWFtczsNCi0gICAgaWYgKGlPYmpUeXBlID09IFBERk9CSl9BUlJBWSkgew0KLSAgICAgICAgQ1BERl9BcnJheSogcFhGQUFycmF5ID0gKENQREZfQXJyYXkqKXBFbGVtZW50WEZBOw0KLSAgICAgICAgRlhfRFdPUkQgY291bnQgPSBwWEZBQXJyYXktPkdldENvdW50KCkgLyAyOw0KLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsNCi0gICAgICAgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBYRkFBcnJheS0+R2V0U3RyZWFtKGkgKiAyICsgMSk7DQotICAgICAgICAgICAgaWYgKHBTdHJlYW0gIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICB4ZmFTdHJlYW1zLkFkZChwU3RyZWFtKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZiAoaU9ialR5cGUgPT0gUERGT0JKX1NUUkVBTSkgew0KLSAgICAgICAgeGZhU3RyZWFtcy5BZGQoKENQREZfU3RyZWFtKilwRWxlbWVudFhGQSk7DQotICAgIH0NCi0gICAgaWYgKHhmYVN0cmVhbXMuR2V0U2l6ZSgpIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkID0gRlhfTkVXIENYRkFfRmlsZVJlYWQyKHhmYVN0cmVhbXMpOw0KLSAgICBpZiAoIXBGaWxlUmVhZCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG1fcFBERkRvYyA9IHBQREZEb2M7DQotICAgIGlmIChtX3BTdHJlYW0pIHsNCi0gICAgICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wU3RyZWFtID0gTlVMTDsNCi0gICAgfQ0KLSAgICBtX3BTdHJlYW0gPSBwRmlsZVJlYWQ7DQotICAgIG1fYk93blN0cmVhbSA9IFRSVUU7DQotICAgIHJldHVybiBUUlVFOw0KK3ZvaWQgQ1hGQV9GRkRvYzo6U2V0RG9jVHlwZShGWF9EV09SRCBkd1R5cGUpIHsNCisgIG1fZHdEb2NUeXBlID0gZHdUeXBlOw0KIH0NCi1GWF9CT09MIENYRkFfRkZEb2M6OkNsb3NlRG9jKCkNCi17DQotICAgIEZYX1BPU0lUSU9OIHBzQ2xvc2UgPSBtX21hcFR5cGVUb0RvY1ZpZXcuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHNDbG9zZSkgew0KLSAgICAgICAgdm9pZCogcFR5cGU7DQotICAgICAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXc7DQotICAgICAgICBtX21hcFR5cGVUb0RvY1ZpZXcuR2V0TmV4dEFzc29jKHBzQ2xvc2UsIHBUeXBlLCAodm9pZComKXBEb2NWaWV3KTsNCi0gICAgICAgIHBEb2NWaWV3LT5SdW5Eb2NDbG9zZSgpOw0KLSAgICB9DQotICAgIGlmIChtX3BEb2N1bWVudCkgew0KLSAgICAgICAgbV9wRG9jdW1lbnQtPkNsZWFyTGF5b3V0RGF0YSgpOw0KLSAgICB9DQotICAgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBUeXBlVG9Eb2NWaWV3LkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBzKSB7DQotICAgICAgICB2b2lkKiBwVHlwZTsNCi0gICAgICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldzsNCi0gICAgICAgIG1fbWFwVHlwZVRvRG9jVmlldy5HZXROZXh0QXNzb2MocHMsIHBUeXBlLCAodm9pZComKXBEb2NWaWV3KTsNCi0gICAgICAgIGRlbGV0ZSBwRG9jVmlldzsNCi0gICAgfQ0KLSAgICBtX21hcFR5cGVUb0RvY1ZpZXcuUmVtb3ZlQWxsKCk7DQotICAgIGlmIChtX3BEb2N1bWVudCkgew0KLSAgICAgICAgSVhGQV9QYXJzZXIqIHBQYXJzZXIgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCk7DQotICAgICAgICBwUGFyc2VyLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BEb2N1bWVudCA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKG1fcE5vdGlmeSkgew0KLSAgICAgICAgZGVsZXRlIG1fcE5vdGlmeTsNCi0gICAgICAgIG1fcE5vdGlmeSA9IE5VTEw7DQotICAgIH0NCi0gICAgbV9wQXBwLT5HZXRYRkFGb250TWdyKCktPlJlbGVhc2VEb2NGb250cyh0aGlzKTsNCi0gICAgaWYgKG1fZHdEb2NUeXBlICE9IFhGQV9ET0NUWVBFX1hEUCAmJiBtX3BTdHJlYW0gJiYgbV9iT3duU3RyZWFtKSB7DQotICAgICAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcFN0cmVhbSA9IE5VTEw7DQotICAgIH0NCi0gICAgcHMgPSBtX21hcE5hbWVkSW1hZ2VzLkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBzKSB7DQotICAgICAgICB2b2lkKiBwTmFtZTsNCi0gICAgICAgIEZYX0lNQUdFRElCX0FORF9EUEkqIHBJbWFnZSA9IE5VTEw7DQotICAgICAgICBtX21hcE5hbWVkSW1hZ2VzLkdldE5leHRBc3NvYyhwcywgcE5hbWUsICh2b2lkKiYpcEltYWdlKTsNCi0gICAgICAgIGlmIChwSW1hZ2UpIHsNCi0gICAgICAgICAgICBkZWxldGUgcEltYWdlLT5wRGliU291cmNlOw0KLSAgICAgICAgICAgIHBJbWFnZS0+cERpYlNvdXJjZSA9IE5VTEw7DQotICAgICAgICAgICAgRlhfRnJlZShwSW1hZ2UpOw0KLSAgICAgICAgICAgIHBJbWFnZSA9IE5VTEw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9tYXBOYW1lZEltYWdlcy5SZW1vdmVBbGwoKTsNCi0gICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICBwTm90ZURyaXZlci0+Q2xlYXJFdmVudFRhcmdldHMoRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDWEZBX0ZGRG9jOjpTZXREb2NUeXBlKEZYX0RXT1JEIGR3VHlwZSkNCi17DQotICAgIG1fZHdEb2NUeXBlID0gZHdUeXBlOw0KLX0NCi1DUERGX0RvY3VtZW50KiBDWEZBX0ZGRG9jOjpHZXRQREZEb2MoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcFBERkRvYzsNCitDUERGX0RvY3VtZW50KiBDWEZBX0ZGRG9jOjpHZXRQREZEb2MoKSB7DQorICByZXR1cm4gbV9wUERGRG9jOw0KIH0NCiAjZGVmaW5lIF9GWExJQl9ORVdfVkVSU0lPTl8NCi1DRlhfRElCaXRtYXAqIENYRkFfRkZEb2M6OkdldFBERk5hbWVkSW1hZ2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsIGludDMyX3QgJmlJbWFnZVhEcGksIGludDMyX3QgJmlJbWFnZVlEcGkpDQotew0KLSAgICBpZiAoIW1fcFBERkRvYykgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCksIEZBTFNFKTsNCi0gICAgRlhfSU1BR0VESUJfQU5EX0RQSSAqaW1hZ2VESUJEcGkgPSBOVUxMOw0KLSAgICBpZiAobV9tYXBOYW1lZEltYWdlcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZComKWltYWdlRElCRHBpKSkgew0KLSAgICAgICAgaUltYWdlWERwaSA9IGltYWdlRElCRHBpLT5pSW1hZ2VYRHBpOw0KLSAgICAgICAgaUltYWdlWURwaSA9IGltYWdlRElCRHBpLT5pSW1hZ2VZRHBpOw0KLSAgICAgICAgcmV0dXJuIChDRlhfRElCaXRtYXAqKWltYWdlRElCRHBpLT5wRGliU291cmNlOw0KLSAgICB9DQotICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BQREZEb2MtPkdldFJvb3QoKTsNCi0gICAgaWYgKHBSb290ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENQREZfRGljdGlvbmFyeSogcE5hbWVzID0gcFJvb3QtPkdldERpY3QoIk5hbWVzIik7DQotICAgIGlmICghcE5hbWVzKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBYRkFJbWFnZXMgPSBwTmFtZXMtPkdldERpY3QoIlhGQUltYWdlcyIpOw0KLSAgICBpZiAoIXBYRkFJbWFnZXMpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENQREZfTmFtZVRyZWUgbmFtZXRyZWUocFhGQUltYWdlcyk7DQotI2lmZGVmIF9GWExJQl9ORVdfVkVSU0lPTl8NCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gUERGX0VuY29kZVRleHQod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCkpOw0KLSAgICBDUERGX09iamVjdCogcE9iamVjdCA9IG5hbWV0cmVlLkxvb2t1cFZhbHVlKGJzTmFtZSk7DQotICAgIGlmICghcE9iamVjdCkgew0KLSAgICAgICAgaW50MzJfdCBpQ291bnQgPSBuYW1ldHJlZS5HZXRDb3VudCgpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1RlbXA7DQotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBUZW1wT2JqZWN0ID0gbmFtZXRyZWUuTG9va3VwVmFsdWUoaSwgYnNUZW1wKTsNCi0gICAgICAgICAgICBpZiAoYnNUZW1wID09IGJzTmFtZSkgew0KLSAgICAgICAgICAgICAgICBwT2JqZWN0ID0gcFRlbXBPYmplY3Q7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSNlbHNlDQotICAgIENQREZfT2JqZWN0KiBwT2JqZWN0ID0gbmFtZXRyZWUuTG9va3VwVmFsdWUod3NOYW1lKTsNCi0gICAgaWYgKCFwT2JqZWN0KSB7DQotICAgICAgICBpbnQzMl90IGlDb3VudCA9IG5hbWV0cmVlLkdldENvdW50KCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCi0gICAgICAgICAgICBDUERGX09iamVjdCogcFRlbXBPYmplY3QgPSBuYW1ldHJlZS5Mb29rdXBWYWx1ZShpLCB3c1RlbXApOw0KLSAgICAgICAgICAgIGlmICh3c1RlbXAgPT0gd3NOYW1lKSB7DQotICAgICAgICAgICAgICAgIHBPYmplY3QgPSBwVGVtcE9iamVjdDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotI2VuZGlmDQotICAgIGlmICghcE9iamVjdCB8fCBwT2JqZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaWYgKCFpbWFnZURJQkRwaSkgew0KLSAgICAgICAgaW1hZ2VESUJEcGkgPSBGWF9BbGxvYyhGWF9JTUFHRURJQl9BTkRfRFBJLCAxKTsNCi0gICAgICAgIGltYWdlRElCRHBpLT5wRGliU291cmNlID0gTlVMTDsNCi0gICAgICAgIGltYWdlRElCRHBpLT5pSW1hZ2VYRHBpID0gMDsNCi0gICAgICAgIGltYWdlRElCRHBpLT5pSW1hZ2VZRHBpID0gMDsNCi0gICAgICAgIENQREZfU3RyZWFtQWNjIHN0cmVhbUFjYzsNCi0gICAgICAgIHN0cmVhbUFjYy5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBPYmplY3QpOw0KLSAgICAgICAgSUZYX0ZpbGVSZWFkKiBwSW1hZ2VGaWxlUmVhZCA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopc3RyZWFtQWNjLkdldERhdGEoKSwgc3RyZWFtQWNjLkdldFNpemUoKSk7DQotICAgICAgICBpbWFnZURJQkRwaS0+cERpYlNvdXJjZSA9IFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKHBJbWFnZUZpbGVSZWFkLCBGWENPREVDX0lNQUdFX1VOS05PV04sIGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOw0KLSAgICAgICAgaW1hZ2VESUJEcGktPmlJbWFnZVhEcGkgPSBpSW1hZ2VYRHBpOw0KLSAgICAgICAgaW1hZ2VESUJEcGktPmlJbWFnZVlEcGkgPSBpSW1hZ2VZRHBpOw0KLSAgICAgICAgcEltYWdlRmlsZVJlYWQtPlJlbGVhc2UoKTsNCi0gICAgfQ0KLSAgICBtX21hcE5hbWVkSW1hZ2VzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgaW1hZ2VESUJEcGkpOw0KK0NGWF9ESUJpdG1hcCogQ1hGQV9GRkRvYzo6R2V0UERGTmFtZWRJbWFnZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUltYWdlWERwaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUltYWdlWURwaSkgew0KKyAgaWYgKCFtX3BQREZEb2MpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBGWF9EV09SRCBkd0hhc2ggPQ0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgd3NOYW1lLkdldExlbmd0aCgpLCBGQUxTRSk7DQorICBGWF9JTUFHRURJQl9BTkRfRFBJKiBpbWFnZURJQkRwaSA9IE5VTEw7DQorICBpZiAobV9tYXBOYW1lZEltYWdlcy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZComKWltYWdlRElCRHBpKSkgew0KKyAgICBpSW1hZ2VYRHBpID0gaW1hZ2VESUJEcGktPmlJbWFnZVhEcGk7DQorICAgIGlJbWFnZVlEcGkgPSBpbWFnZURJQkRwaS0+aUltYWdlWURwaTsNCiAgICAgcmV0dXJuIChDRlhfRElCaXRtYXAqKWltYWdlRElCRHBpLT5wRGliU291cmNlOw0KKyAgfQ0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcFBERkRvYy0+R2V0Um9vdCgpOw0KKyAgaWYgKHBSb290ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDUERGX0RpY3Rpb25hcnkqIHBOYW1lcyA9IHBSb290LT5HZXREaWN0KCJOYW1lcyIpOw0KKyAgaWYgKCFwTmFtZXMpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDUERGX0RpY3Rpb25hcnkqIHBYRkFJbWFnZXMgPSBwTmFtZXMtPkdldERpY3QoIlhGQUltYWdlcyIpOw0KKyAgaWYgKCFwWEZBSW1hZ2VzKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ1BERl9OYW1lVHJlZSBuYW1ldHJlZShwWEZBSW1hZ2VzKTsNCisjaWZkZWYgX0ZYTElCX05FV19WRVJTSU9OXw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gUERGX0VuY29kZVRleHQod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgQ1BERl9PYmplY3QqIHBPYmplY3QgPSBuYW1ldHJlZS5Mb29rdXBWYWx1ZShic05hbWUpOw0KKyAgaWYgKCFwT2JqZWN0KSB7DQorICAgIGludDMyX3QgaUNvdW50ID0gbmFtZXRyZWUuR2V0Q291bnQoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBic1RlbXA7DQorICAgICAgQ1BERl9PYmplY3QqIHBUZW1wT2JqZWN0ID0gbmFtZXRyZWUuTG9va3VwVmFsdWUoaSwgYnNUZW1wKTsNCisgICAgICBpZiAoYnNUZW1wID09IGJzTmFtZSkgew0KKyAgICAgICAgcE9iamVjdCA9IHBUZW1wT2JqZWN0Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorI2Vsc2UNCisgIENQREZfT2JqZWN0KiBwT2JqZWN0ID0gbmFtZXRyZWUuTG9va3VwVmFsdWUod3NOYW1lKTsNCisgIGlmICghcE9iamVjdCkgew0KKyAgICBpbnQzMl90IGlDb3VudCA9IG5hbWV0cmVlLkdldENvdW50KCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgIENQREZfT2JqZWN0KiBwVGVtcE9iamVjdCA9IG5hbWV0cmVlLkxvb2t1cFZhbHVlKGksIHdzVGVtcCk7DQorICAgICAgaWYgKHdzVGVtcCA9PSB3c05hbWUpIHsNCisgICAgICAgIHBPYmplY3QgPSBwVGVtcE9iamVjdDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyNlbmRpZg0KKyAgaWYgKCFwT2JqZWN0IHx8IHBPYmplY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKCFpbWFnZURJQkRwaSkgew0KKyAgICBpbWFnZURJQkRwaSA9IEZYX0FsbG9jKEZYX0lNQUdFRElCX0FORF9EUEksIDEpOw0KKyAgICBpbWFnZURJQkRwaS0+cERpYlNvdXJjZSA9IE5VTEw7DQorICAgIGltYWdlRElCRHBpLT5pSW1hZ2VYRHBpID0gMDsNCisgICAgaW1hZ2VESUJEcGktPmlJbWFnZVlEcGkgPSAwOw0KKyAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW1BY2M7DQorICAgIHN0cmVhbUFjYy5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBPYmplY3QpOw0KKyAgICBJRlhfRmlsZVJlYWQqIHBJbWFnZUZpbGVSZWFkID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKA0KKyAgICAgICAgKHVpbnQ4X3QqKXN0cmVhbUFjYy5HZXREYXRhKCksIHN0cmVhbUFjYy5HZXRTaXplKCkpOw0KKyAgICBpbWFnZURJQkRwaS0+cERpYlNvdXJjZSA9IFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKA0KKyAgICAgICAgcEltYWdlRmlsZVJlYWQsIEZYQ09ERUNfSU1BR0VfVU5LTk9XTiwgaUltYWdlWERwaSwgaUltYWdlWURwaSk7DQorICAgIGltYWdlRElCRHBpLT5pSW1hZ2VYRHBpID0gaUltYWdlWERwaTsNCisgICAgaW1hZ2VESUJEcGktPmlJbWFnZVlEcGkgPSBpSW1hZ2VZRHBpOw0KKyAgICBwSW1hZ2VGaWxlUmVhZC0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgbV9tYXBOYW1lZEltYWdlcy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsIGltYWdlRElCRHBpKTsNCisgIHJldHVybiAoQ0ZYX0RJQml0bWFwKilpbWFnZURJQkRwaS0+cERpYlNvdXJjZTsNCiB9DQotSUZERV9YTUxFbGVtZW50KiBDWEZBX0ZGRG9jOjpHZXRQYWNrYWdlRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGFja2FnZSkNCi17DQotICAgIEZYX0RXT1JEIHBhY2tldEhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c1BhY2thZ2UuR2V0UHRyKCksIHdzUGFja2FnZS5HZXRMZW5ndGgoKSk7DQorSUZERV9YTUxFbGVtZW50KiBDWEZBX0ZGRG9jOjpHZXRQYWNrYWdlRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGFja2FnZSkgew0KKyAgRlhfRFdPUkQgcGFja2V0SGFzaCA9DQorICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NQYWNrYWdlLkdldFB0cigpLCB3c1BhY2thZ2UuR2V0TGVuZ3RoKCkpOw0KKyAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBtX3BEb2N1bWVudC0+R2V0WEZBTm9kZShwYWNrZXRIYXNoKTsNCisgIENYRkFfTm9kZSogcE5vZGUgPQ0KKyAgICAgIChwT2JqZWN0ICYmIHBPYmplY3QtPklzTm9kZSgpKSA/IChDWEZBX05vZGUqKXBPYmplY3QgOiBOVUxMOw0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBwTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgIHJldHVybiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KQ0KKyAgICAgICAgICAgICA/IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlDQorICAgICAgICAgICAgIDogTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jOjpTYXZlUGFja2FnZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGFja2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9GaWxlV3JpdGUqIHBGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9DaGVja3N1bUNvbnRleHQqIHBDU0NvbnRleHQpIHsNCisgIElYRkFfUGFja2V0RXhwb3J0KiBwRXhwb3J0ID0gSVhGQV9QYWNrZXRFeHBvcnQ6OkNyZWF0ZShtX3BEb2N1bWVudCk7DQorICBpZiAoIXBFeHBvcnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfRFdPUkQgcGFja2V0SGFzaCA9DQorICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NQYWNrYWdlLkdldFB0cigpLCB3c1BhY2thZ2UuR2V0TGVuZ3RoKCkpOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBpZiAocGFja2V0SGFzaCA9PSBYRkFfSEFTSENPREVfWGZhKSB7DQorICAgIHBOb2RlID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsNCisgIH0gZWxzZSB7DQogICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUocGFja2V0SGFzaCk7DQotICAgIENYRkFfTm9kZSAqcE5vZGUgPSAocE9iamVjdCAmJiBwT2JqZWN0LT5Jc05vZGUoKSkgPyAoQ1hGQV9Ob2RlKilwT2JqZWN0IDogTlVMTDsNCi0gICAgaWYgKCFwTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIHBOb2RlID0gKHBPYmplY3QgJiYgcE9iamVjdC0+SXNOb2RlKCkpID8gKENYRkFfTm9kZSopcE9iamVjdCA6IE5VTEw7DQorICB9DQorICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgaWYgKHBOb2RlKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzQ2hlY2tzdW07DQorICAgIGlmIChwQ1NDb250ZXh0KSB7DQorICAgICAgcENTQ29udGV4dC0+R2V0Q2hlY2tzdW0oYnNDaGVja3N1bSk7DQogICAgIH0NCi0gICAgSUZERV9YTUxOb2RlICpwWE1MTm9kZSA9IHBOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICByZXR1cm4gKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgPyAoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGUgOiBOVUxMOw0KKyAgICBiRmxhZ3MgPSBwRXhwb3J0LT5FeHBvcnQocEZpbGUsIHBOb2RlLCAwLCBic0NoZWNrc3VtLkdldExlbmd0aCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChjb25zdCBGWF9DSEFSKilic0NoZWNrc3VtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwpOw0KKyAgfSBlbHNlIHsNCisgICAgYkZsYWdzID0gcEV4cG9ydC0+RXhwb3J0KHBGaWxlKTsNCisgIH0NCisgIHBFeHBvcnQtPlJlbGVhc2UoKTsNCisgIHJldHVybiBiRmxhZ3M7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRkRvYzo6U2F2ZVBhY2thZ2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhY2thZ2UsIElGWF9GaWxlV3JpdGUqIHBGaWxlLCBJWEZBX0NoZWNrc3VtQ29udGV4dCAqcENTQ29udGV4dCApDQotew0KLSAgICBJWEZBX1BhY2tldEV4cG9ydCAqcEV4cG9ydCA9IElYRkFfUGFja2V0RXhwb3J0OjpDcmVhdGUobV9wRG9jdW1lbnQpOw0KLSAgICBpZiAoIXBFeHBvcnQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBwYWNrZXRIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NQYWNrYWdlLkdldFB0cigpLCB3c1BhY2thZ2UuR2V0TGVuZ3RoKCkpOw0KLSAgICBDWEZBX05vZGUgKnBOb2RlID0gTlVMTDsNCi0gICAgaWYgKHBhY2tldEhhc2ggPT0gWEZBX0hBU0hDT0RFX1hmYSkgew0KLSAgICAgICAgcE5vZGUgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9PYmplY3QgKnBPYmplY3QgPSBtX3BEb2N1bWVudC0+R2V0WEZBTm9kZShwYWNrZXRIYXNoKTsNCi0gICAgICAgIHBOb2RlID0gKHBPYmplY3QgJiYgcE9iamVjdC0+SXNOb2RlKCkpID8gKENYRkFfTm9kZSopcE9iamVjdCA6IE5VTEw7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgaWYgKHBOb2RlKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0NoZWNrc3VtOw0KLSAgICAgICAgaWYgKHBDU0NvbnRleHQpIHsNCi0gICAgICAgICAgICBwQ1NDb250ZXh0LT5HZXRDaGVja3N1bShic0NoZWNrc3VtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGJGbGFncyA9IHBFeHBvcnQtPkV4cG9ydChwRmlsZSwgcE5vZGUsIDAsIGJzQ2hlY2tzdW0uR2V0TGVuZ3RoKCkgPyAoY29uc3QgRlhfQ0hBUiopYnNDaGVja3N1bSA6IE5VTEwpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgYkZsYWdzID0gcEV4cG9ydC0+RXhwb3J0KHBGaWxlKTsNCi0gICAgfQ0KLSAgICBwRXhwb3J0LT5SZWxlYXNlKCk7DQotICAgIHJldHVybiBiRmxhZ3M7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkRvYzo6SW1wb3J0RGF0YShJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlhEUCApDQotew0KLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCi0gICAgSVhGQV9QYWNrZXRJbXBvcnQgKnBJbXBvcnQgPSBJWEZBX1BhY2tldEltcG9ydDo6Q3JlYXRlKG1fcERvY3VtZW50KTsNCi0gICAgaWYgKHBJbXBvcnQpIHsNCi0gICAgICAgIGJSZXQgPSBwSW1wb3J0LT5JbXBvcnREYXRhKHBTdHJlYW0pOw0KLSAgICAgICAgcEltcG9ydC0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIHJldHVybiBiUmV0Ow0KK0ZYX0JPT0wgQ1hGQV9GRkRvYzo6SW1wb3J0RGF0YShJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlhEUCkgew0KKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICBJWEZBX1BhY2tldEltcG9ydCogcEltcG9ydCA9IElYRkFfUGFja2V0SW1wb3J0OjpDcmVhdGUobV9wRG9jdW1lbnQpOw0KKyAgaWYgKHBJbXBvcnQpIHsNCisgICAgYlJldCA9IHBJbXBvcnQtPkltcG9ydERhdGEocFN0cmVhbSk7DQorICAgIHBJbXBvcnQtPlJlbGVhc2UoKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2MuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvYy5oCmluZGV4IGNhZWE0MDguLjRhMTE5NmEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvYy5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvYy5oCkBAIC0xNSw1NSArMTUsNTAgQEAKIGNsYXNzIElYRkFfTG9jYWxlOw0KIA0KIHR5cGVkZWYgc3RydWN0IF9GWF9JTUFHRURJQl9BTkRfRFBJIHsNCi0gICAgQ0ZYX0RJQlNvdXJjZSogcERpYlNvdXJjZTsNCi0gICAgaW50MzJfdAkgICBpSW1hZ2VYRHBpOw0KLSAgICBpbnQzMl90CSAgIGlJbWFnZVlEcGk7DQorICBDRlhfRElCU291cmNlKiBwRGliU291cmNlOw0KKyAgaW50MzJfdCBpSW1hZ2VYRHBpOw0KKyAgaW50MzJfdCBpSW1hZ2VZRHBpOw0KIH0gRlhfSU1BR0VESUJfQU5EX0RQSTsNCiANCi1jbGFzcyBDWEZBX0ZGRG9jIDogcHVibGljIElYRkFfRG9jDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GRkRvYyhDWEZBX0ZGQXBwKiBwQXBwLCBJWEZBX0RvY1Byb3ZpZGVyKiBwRG9jUHJvdmlkZXIpOw0KLSAgICB+Q1hGQV9GRkRvYygpOw0KLSAgICBJWEZBX0RvY1Byb3ZpZGVyKgkJR2V0RG9jUHJvdmlkZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wRG9jUHJvdmlkZXI7DQotICAgIH0NCi0gICAgRlhfRFdPUkQJCQkJR2V0RG9jVHlwZSgpOw0KLSAgICBpbnQzMl90CQkJCVN0YXJ0TG9hZCgpOw0KLSAgICBpbnQzMl90CQkJCURvTG9hZChJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpOw0KLSAgICB2b2lkCQkJCQlTdG9wTG9hZCgpOw0KLSAgICBJWEZBX0RvY1ZpZXcqCQkJQ3JlYXRlRG9jVmlldyhGWF9EV09SRCBkd1ZpZXcgPSAwKTsNCi0gICAgRlhfQk9PTAkJCQkJT3BlbkRvYyhJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlRha2VPdmVyRmlsZSk7DQotICAgIEZYX0JPT0wJCQkJCU9wZW5Eb2MoQ1BERl9Eb2N1bWVudCogcFBERkRvYyk7DQotICAgIEZYX0JPT0wJCQkJCUNsb3NlRG9jKCk7DQotICAgIHZvaWQJCQkJCVNldERvY1R5cGUoRlhfRFdPUkQgZHdUeXBlKTsNCi0gICAgQ1hGQV9Eb2N1bWVudCoJCQlHZXRYRkFEb2MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wRG9jdW1lbnQ7DQotICAgIH0NCi0gICAgQ1hGQV9GRkFwcCoJCQkJR2V0QXBwKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcEFwcDsNCi0gICAgfQ0KLSAgICBDWEZBX0ZGRG9jVmlldyoJCQlHZXREb2NWaWV3KElYRkFfRG9jTGF5b3V0KiBwTGF5b3V0KTsNCi0gICAgQ1hGQV9GRkRvY1ZpZXcqCQkJR2V0RG9jVmlldygpOw0KLSAgICBDUERGX0RvY3VtZW50KgkJCUdldFBERkRvYygpOw0KLSAgICBDRlhfRElCaXRtYXAqCQkJR2V0UERGTmFtZWRJbWFnZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwgaW50MzJfdCAmaUltYWdlWERwaSwgaW50MzJfdCAmaUltYWdlWURwaSk7DQotICAgIElGREVfWE1MRWxlbWVudCoJCUdldFBhY2thZ2VEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlKTsNCi0gICAgRlhfQk9PTAkJCQkJU2F2ZVBhY2thZ2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhY2thZ2UsIElGWF9GaWxlV3JpdGUqIHBGaWxlLCBJWEZBX0NoZWNrc3VtQ29udGV4dCAqcENTQ29udGV4dCA9IE5VTEwpOw0KLSAgICBGWF9CT09MCQkJCQlJbXBvcnREYXRhKElGWF9GaWxlUmVhZCogcFN0cmVhbSwgRlhfQk9PTCBiWERQID0gVFJVRSk7DQotcHJvdGVjdGVkOg0KLSAgICBJWEZBX0RvY1Byb3ZpZGVyKgkJbV9wRG9jUHJvdmlkZXI7DQotICAgIENYRkFfRG9jdW1lbnQqCQkJbV9wRG9jdW1lbnQ7DQotICAgIElGWF9GaWxlUmVhZCoJCQltX3BTdHJlYW07DQotICAgIENYRkFfRkZBcHAqCQkJCW1fcEFwcDsNCi0gICAgQ1hGQV9GRk5vdGlmeSoJCQltX3BOb3RpZnk7DQotICAgIENQREZfRG9jdW1lbnQqCQkJbV9wUERGRG9jOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCQltX21hcE5hbWVkSW1hZ2VzOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCQltX21hcFR5cGVUb0RvY1ZpZXc7DQotICAgIEZYX0RXT1JECQkJCW1fZHdEb2NUeXBlOw0KLSAgICBGWF9CT09MCQkJCQltX2JPd25TdHJlYW07DQorY2xhc3MgQ1hGQV9GRkRvYyA6IHB1YmxpYyBJWEZBX0RvYyB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZEb2MoQ1hGQV9GRkFwcCogcEFwcCwgSVhGQV9Eb2NQcm92aWRlciogcERvY1Byb3ZpZGVyKTsNCisgIH5DWEZBX0ZGRG9jKCk7DQorICBJWEZBX0RvY1Byb3ZpZGVyKiBHZXREb2NQcm92aWRlcigpIHsgcmV0dXJuIG1fcERvY1Byb3ZpZGVyOyB9DQorICBGWF9EV09SRCBHZXREb2NUeXBlKCk7DQorICBpbnQzMl90IFN0YXJ0TG9hZCgpOw0KKyAgaW50MzJfdCBEb0xvYWQoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisgIHZvaWQgU3RvcExvYWQoKTsNCisgIElYRkFfRG9jVmlldyogQ3JlYXRlRG9jVmlldyhGWF9EV09SRCBkd1ZpZXcgPSAwKTsNCisgIEZYX0JPT0wgT3BlbkRvYyhJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlRha2VPdmVyRmlsZSk7DQorICBGWF9CT09MIE9wZW5Eb2MoQ1BERl9Eb2N1bWVudCogcFBERkRvYyk7DQorICBGWF9CT09MIENsb3NlRG9jKCk7DQorICB2b2lkIFNldERvY1R5cGUoRlhfRFdPUkQgZHdUeXBlKTsNCisgIENYRkFfRG9jdW1lbnQqIEdldFhGQURvYygpIHsgcmV0dXJuIG1fcERvY3VtZW50OyB9DQorICBDWEZBX0ZGQXBwKiBHZXRBcHAoKSB7IHJldHVybiBtX3BBcHA7IH0NCisgIENYRkFfRkZEb2NWaWV3KiBHZXREb2NWaWV3KElYRkFfRG9jTGF5b3V0KiBwTGF5b3V0KTsNCisgIENYRkFfRkZEb2NWaWV3KiBHZXREb2NWaWV3KCk7DQorICBDUERGX0RvY3VtZW50KiBHZXRQREZEb2MoKTsNCisgIENGWF9ESUJpdG1hcCogR2V0UERGTmFtZWRJbWFnZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VYRHBpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbWFnZVlEcGkpOw0KKyAgSUZERV9YTUxFbGVtZW50KiBHZXRQYWNrYWdlRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGFja2FnZSk7DQorICBGWF9CT09MIFNhdmVQYWNrYWdlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVdyaXRlKiBwRmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgSVhGQV9DaGVja3N1bUNvbnRleHQqIHBDU0NvbnRleHQgPSBOVUxMKTsNCisgIEZYX0JPT0wgSW1wb3J0RGF0YShJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlhEUCA9IFRSVUUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJWEZBX0RvY1Byb3ZpZGVyKiBtX3BEb2NQcm92aWRlcjsNCisgIENYRkFfRG9jdW1lbnQqIG1fcERvY3VtZW50Ow0KKyAgSUZYX0ZpbGVSZWFkKiBtX3BTdHJlYW07DQorICBDWEZBX0ZGQXBwKiBtX3BBcHA7DQorICBDWEZBX0ZGTm90aWZ5KiBtX3BOb3RpZnk7DQorICBDUERGX0RvY3VtZW50KiBtX3BQREZEb2M7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9tYXBOYW1lZEltYWdlczsNCisgIENGWF9NYXBQdHJUb1B0ciBtX21hcFR5cGVUb0RvY1ZpZXc7DQorICBGWF9EV09SRCBtX2R3RG9jVHlwZTsNCisgIEZYX0JPT0wgbV9iT3duU3RyZWFtOw0KIH07DQogDQogI2VuZGlmICAvLyBGWEZBX1NSQ19BUFBfWEZBX0ZGRE9DX0hfDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jaGFuZGxlci5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2NoYW5kbGVyLmNwcAppbmRleCA3OTM3NWMyLi41MWE4OTQ3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2NoYW5kbGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2NoYW5kbGVyLmNwcApAQCAtOCwxMDYgKzgsMTAyIEBACiAjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9jb21tb24uaCINCiAjaW5jbHVkZSAieGZhX2ZmZG9jaGFuZGxlci5oIg0KICNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCi1DWEZBX0ZGRG9jSGFuZGxlcjo6Q1hGQV9GRkRvY0hhbmRsZXIoKQ0KLXsNCitDWEZBX0ZGRG9jSGFuZGxlcjo6Q1hGQV9GRkRvY0hhbmRsZXIoKSB7fQ0KK0NYRkFfRkZEb2NIYW5kbGVyOjp+Q1hGQV9GRkRvY0hhbmRsZXIoKSB7fQ0KK3ZvaWQgQ1hGQV9GRkRvY0hhbmRsZXI6OlJlbGVhc2VEb2MoSVhGQV9Eb2MqIGhEb2MpIHsNCisgIGRlbGV0ZSBoRG9jOyAgLy8gdmlydHVhbCBkdG9yLg0KIH0NCi1DWEZBX0ZGRG9jSGFuZGxlcjo6fkNYRkFfRkZEb2NIYW5kbGVyKCkNCi17DQorSVhGQV9Eb2NQcm92aWRlciogQ1hGQV9GRkRvY0hhbmRsZXI6OkdldERvY1Byb3ZpZGVyKElYRkFfRG9jKiBoRG9jKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpLT5HZXREb2NQcm92aWRlcigpOw0KIH0NCi12b2lkIENYRkFfRkZEb2NIYW5kbGVyOjpSZWxlYXNlRG9jKElYRkFfRG9jKiBoRG9jKQ0KLXsNCi0gICAgZGVsZXRlIGhEb2M7ICAvLyB2aXJ0dWFsIGR0b3IuDQorRlhfRFdPUkQgQ1hGQV9GRkRvY0hhbmRsZXI6OkdldERvY1R5cGUoSVhGQV9Eb2MqIGhEb2MpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPkdldERvY1R5cGUoKTsNCiB9DQotSVhGQV9Eb2NQcm92aWRlciogQ1hGQV9GRkRvY0hhbmRsZXI6OkdldERvY1Byb3ZpZGVyKElYRkFfRG9jKiBoRG9jKQ0KLXsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+R2V0RG9jUHJvdmlkZXIoKTsNCitpbnQzMl90IENYRkFfRkZEb2NIYW5kbGVyOjpTdGFydExvYWQoSVhGQV9Eb2MqIGhEb2MpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPlN0YXJ0TG9hZCgpOw0KIH0NCi1GWF9EV09SRCBDWEZBX0ZGRG9jSGFuZGxlcjo6R2V0RG9jVHlwZShJWEZBX0RvYyogaERvYykNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPkdldERvY1R5cGUoKTsNCitpbnQzMl90IENYRkFfRkZEb2NIYW5kbGVyOjpEb0xvYWQoSVhGQV9Eb2MqIGhEb2MsIElGWF9QYXVzZSogcFBhdXNlKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpLT5Eb0xvYWQocFBhdXNlKTsNCiB9DQotaW50MzJfdCBDWEZBX0ZGRG9jSGFuZGxlcjo6U3RhcnRMb2FkKElYRkFfRG9jKiBoRG9jKQ0KLXsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+U3RhcnRMb2FkKCk7DQotfQ0KLWludDMyX3QgQ1hGQV9GRkRvY0hhbmRsZXI6OkRvTG9hZChJWEZBX0RvYyogaERvYywgSUZYX1BhdXNlICpwUGF1c2UgKQ0KLXsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+RG9Mb2FkKHBQYXVzZSk7DQotfQ0KLXZvaWQgQ1hGQV9GRkRvY0hhbmRsZXI6OlN0b3BMb2FkKElYRkFfRG9jKiBoRG9jKQ0KLXsNCi0gICAgc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpLT5TdG9wTG9hZCgpOw0KK3ZvaWQgQ1hGQV9GRkRvY0hhbmRsZXI6OlN0b3BMb2FkKElYRkFfRG9jKiBoRG9jKSB7DQorICBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPlN0b3BMb2FkKCk7DQogfQ0KIA0KLUlYRkFfRG9jVmlldyogQ1hGQV9GRkRvY0hhbmRsZXI6OkNyZWF0ZURvY1ZpZXcoSVhGQV9Eb2MqIGhEb2MsIEZYX0RXT1JEIGR3VmlldyApDQotew0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpLT5DcmVhdGVEb2NWaWV3KGR3Vmlldyk7DQorSVhGQV9Eb2NWaWV3KiBDWEZBX0ZGRG9jSGFuZGxlcjo6Q3JlYXRlRG9jVmlldyhJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Vmlldykgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+Q3JlYXRlRG9jVmlldyhkd1ZpZXcpOw0KIH0NCi1pbnQzMl90IENYRkFfRkZEb2NIYW5kbGVyOjpDb3VudFBhY2thZ2VzKElYRkFfRG9jKiBoRG9jKQ0KLXsNCi0gICAgcmV0dXJuIDA7DQoraW50MzJfdCBDWEZBX0ZGRG9jSGFuZGxlcjo6Q291bnRQYWNrYWdlcyhJWEZBX0RvYyogaERvYykgew0KKyAgcmV0dXJuIDA7DQogfQ0KLXZvaWQgQ1hGQV9GRkRvY0hhbmRsZXI6OkdldFBhY2thZ2VOYW1lKElYRkFfRG9jKiBoRG9jLCBpbnQzMl90IGlQYWNrYWdlLCBDRlhfV2lkZVN0cmluZ0MgJndzUGFja2FnZSkNCi17DQordm9pZCBDWEZBX0ZGRG9jSGFuZGxlcjo6R2V0UGFja2FnZU5hbWUoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFja2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MmIHdzUGFja2FnZSkge30NCitJRkRFX1hNTEVsZW1lbnQqIENYRkFfRkZEb2NIYW5kbGVyOjpHZXRQYWNrYWdlRGF0YSgNCisgICAgSVhGQV9Eb2MqIGhEb2MsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpLT5HZXRQYWNrYWdlRGF0YSh3c1BhY2thZ2UpOw0KIH0NCi1JRkRFX1hNTEVsZW1lbnQqIENYRkFfRkZEb2NIYW5kbGVyOjpHZXRQYWNrYWdlRGF0YShJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhY2thZ2UpDQotew0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpLT5HZXRQYWNrYWdlRGF0YSh3c1BhY2thZ2UpOw0KK0ZYX0JPT0wgQ1hGQV9GRkRvY0hhbmRsZXI6OlNhdmVQYWNrYWdlKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9GaWxlV3JpdGUqIHBGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYRkFfQ2hlY2tzdW1Db250ZXh0KiBwQ1NDb250ZXh0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpDQorICAgICAgLT5TYXZlUGFja2FnZSh3c1BhY2thZ2UsIHBGaWxlLCBwQ1NDb250ZXh0KTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGRG9jSGFuZGxlcjo6U2F2ZVBhY2thZ2UoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlLCBJRlhfRmlsZVdyaXRlKiBwRmlsZSwgSVhGQV9DaGVja3N1bUNvbnRleHQgKnBDU0NvbnRleHQgKQ0KLXsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+U2F2ZVBhY2thZ2Uod3NQYWNrYWdlLCBwRmlsZSwgcENTQ29udGV4dCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkRvY0hhbmRsZXI6OkNsb3NlRG9jKElYRkFfRG9jKiBoRG9jKQ0KLXsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+Q2xvc2VEb2MoKTsNCitGWF9CT09MIENYRkFfRkZEb2NIYW5kbGVyOjpDbG9zZURvYyhJWEZBX0RvYyogaERvYykgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+Q2xvc2VEb2MoKTsNCiB9DQogDQotRlhfQk9PTCBDWEZBX0ZGRG9jSGFuZGxlcjo6SW1wb3J0RGF0YShJWEZBX0RvYyogaERvYywgSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLCBGWF9CT09MIGJYRFAgKQ0KLXsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+SW1wb3J0RGF0YShwU3RyZWFtLCBiWERQKTsNCitGWF9CT09MIENYRkFfRkZEb2NIYW5kbGVyOjpJbXBvcnREYXRhKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiWERQKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpLT5JbXBvcnREYXRhKHBTdHJlYW0sIGJYRFApOw0KIH0NCi12b2lkIENYRkFfRkZEb2NIYW5kbGVyOjpTZXRKU0VSdW50aW1lKElYRkFfRG9jKiBoRG9jLCBGWEpTRV9IUlVOVElNRSBoUnVudGltZSkNCi17DQotICAgIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+R2V0WEZBRG9jKCktPkluaXRTY3JpcHRDb250ZXh0KGhSdW50aW1lKTsNCit2b2lkIENYRkFfRkZEb2NIYW5kbGVyOjpTZXRKU0VSdW50aW1lKElYRkFfRG9jKiBoRG9jLCBGWEpTRV9IUlVOVElNRSBoUnVudGltZSkgew0KKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpLT5HZXRYRkFEb2MoKS0+SW5pdFNjcmlwdENvbnRleHQoaFJ1bnRpbWUpOw0KIH0NCi1GWEpTRV9IVkFMVUUgQ1hGQV9GRkRvY0hhbmRsZXI6OkdldFhGQVNjcmlwdE9iamVjdChJWEZBX0RvYyogaERvYykNCi17DQotICAgIENYRkFfRG9jdW1lbnQqIHBYRkFEb2MgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPkdldFhGQURvYygpOw0KLSAgICBpZiAoIXBYRkFEb2MpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBwWEZBRG9jLT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAocFhGQURvYy0+R2V0Um9vdCgpKTsNCitGWEpTRV9IVkFMVUUgQ1hGQV9GRkRvY0hhbmRsZXI6OkdldFhGQVNjcmlwdE9iamVjdChJWEZBX0RvYyogaERvYykgew0KKyAgQ1hGQV9Eb2N1bWVudCogcFhGQURvYyA9IHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+R2V0WEZBRG9jKCk7DQorICBpZiAoIXBYRkFEb2MpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gcFhGQURvYy0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAocFhGQURvYy0+R2V0Um9vdCgpKTsNCiB9DQotWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9GRkRvY0hhbmRsZXI6OkdldFJlc3RvcmVTdGF0ZShJWEZBX0RvYyogaERvYykNCi17DQotICAgIENYRkFfRG9jdW1lbnQqIHBYRkFEb2MgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPkdldFhGQURvYygpOw0KLSAgICBpZiAoIXBYRkFEb2MpIHsNCi0gICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcEZvcm0gPSAoQ1hGQV9Ob2RlKilwWEZBRG9jLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCi0gICAgaWYgKCFwRm9ybSkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd247DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwU3ViRm9ybSA9IHBGb3JtLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCi0gICAgaWYgKCFwU3ViRm9ybSkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd247DQotICAgIH0NCi0gICAgcmV0dXJuIHBTdWJGb3JtLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUmVzdG9yZVN0YXRlKTsNCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0ZGRG9jSGFuZGxlcjo6R2V0UmVzdG9yZVN0YXRlKElYRkFfRG9jKiBoRG9jKSB7DQorICBDWEZBX0RvY3VtZW50KiBwWEZBRG9jID0gc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpLT5HZXRYRkFEb2MoKTsNCisgIGlmICghcFhGQURvYykgew0KKyAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCisgIH0NCisgIENYRkFfTm9kZSogcEZvcm0gPSAoQ1hGQV9Ob2RlKilwWEZBRG9jLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgIGlmICghcEZvcm0pIHsNCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd247DQorICB9DQorICBDWEZBX05vZGUqIHBTdWJGb3JtID0gcEZvcm0tPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KKyAgaWYgKCFwU3ViRm9ybSkgew0KKyAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCisgIH0NCisgIHJldHVybiBwU3ViRm9ybS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSk7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRkRvY0hhbmRsZXI6OlJ1bkRvY1NjcmlwdChJWEZBX0RvYyogaERvYywgWEZBX1NDUklQVFRZUEUgZVNjcmlwdFR5cGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTY3JpcHQsIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsIEZYSlNFX0hWQUxVRSBoVGhpc09iamVjdCkNCi17DQotICAgIENYRkFfRG9jdW1lbnQqIHBYRkFEb2MgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPkdldFhGQURvYygpOw0KLSAgICBpZiAoIXBYRkFEb2MpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gcFhGQURvYy0+R2V0U2NyaXB0Q29udGV4dCgpOw0KLSAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIHBTY3JpcHRDb250ZXh0LT5SdW5TY3JpcHQoKFhGQV9TQ1JJUFRMQU5HVFlQRSllU2NyaXB0VHlwZSwgd3NTY3JpcHQsIGhSZXRWYWx1ZSwgaFRoaXNPYmplY3QgPyAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzT2JqZWN0LCBOVUxMKSA6IE5VTEwpOw0KK0ZYX0JPT0wgQ1hGQV9GRkRvY0hhbmRsZXI6OlJ1bkRvY1NjcmlwdChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1NDUklQVFRZUEUgZVNjcmlwdFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVGhpc09iamVjdCkgew0KKyAgQ1hGQV9Eb2N1bWVudCogcFhGQURvYyA9IHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+R2V0WEZBRG9jKCk7DQorICBpZiAoIXBYRkFEb2MpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IHBYRkFEb2MtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIHBTY3JpcHRDb250ZXh0LT5SdW5TY3JpcHQoDQorICAgICAgKFhGQV9TQ1JJUFRMQU5HVFlQRSllU2NyaXB0VHlwZSwgd3NTY3JpcHQsIGhSZXRWYWx1ZSwNCisgICAgICBoVGhpc09iamVjdCA/IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXNPYmplY3QsIE5VTEwpDQorICAgICAgICAgICAgICAgICAgOiBOVUxMKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jaGFuZGxlci5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jaGFuZGxlci5oCmluZGV4IGIwODc3MDkuLjVmOWFiNzggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY2hhbmRsZXIuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2NoYW5kbGVyLmgKQEAgLTcsMzAgKzcsNDIgQEAKICNpZm5kZWYgWEZBX0ZGRE9DSEFORExFUl9IXw0KICNkZWZpbmUgWEZBX0ZGRE9DSEFORExFUl9IXw0KIA0KLWNsYXNzIENYRkFfRkZEb2NIYW5kbGVyIDogcHVibGljIElYRkFfRG9jSGFuZGxlcg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZEb2NIYW5kbGVyKCk7DQotICAgIH5DWEZBX0ZGRG9jSGFuZGxlcigpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZURvYyhJWEZBX0RvYyogaERvYyk7DQotICAgIHZpcnR1YWwgSVhGQV9Eb2NQcm92aWRlcioJR2V0RG9jUHJvdmlkZXIoSVhGQV9Eb2MqIGhEb2MpOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXREb2NUeXBlKElYRkFfRG9jKiBoRG9jKTsNCi0gICAgdmlydHVhbAlpbnQzMl90CQlTdGFydExvYWQoSVhGQV9Eb2MqIGhEb2MpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCURvTG9hZChJWEZBX0RvYyogaERvYywgSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJU3RvcExvYWQoSVhGQV9Eb2MqIGhEb2MpOw0KK2NsYXNzIENYRkFfRkZEb2NIYW5kbGVyIDogcHVibGljIElYRkFfRG9jSGFuZGxlciB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZEb2NIYW5kbGVyKCk7DQorICB+Q1hGQV9GRkRvY0hhbmRsZXIoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlRG9jKElYRkFfRG9jKiBoRG9jKTsNCisgIHZpcnR1YWwgSVhGQV9Eb2NQcm92aWRlciogR2V0RG9jUHJvdmlkZXIoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXREb2NUeXBlKElYRkFfRG9jKiBoRG9jKTsNCisgIHZpcnR1YWwgaW50MzJfdCBTdGFydExvYWQoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCBpbnQzMl90IERvTG9hZChJWEZBX0RvYyogaERvYywgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisgIHZpcnR1YWwgdm9pZCBTdG9wTG9hZChJWEZBX0RvYyogaERvYyk7DQogDQotICAgIHZpcnR1YWwgSVhGQV9Eb2NWaWV3KglDcmVhdGVEb2NWaWV3KElYRkFfRG9jKiBoRG9jLCBGWF9EV09SRCBkd1ZpZXcgPSAwKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJQ291bnRQYWNrYWdlcyhJWEZBX0RvYyogaERvYyk7DQotICAgIHZpcnR1YWwJdm9pZAkJCQlHZXRQYWNrYWdlTmFtZShJWEZBX0RvYyogaERvYywgaW50MzJfdCBpUGFja2FnZSwgQ0ZYX1dpZGVTdHJpbmdDICZ3c1BhY2thZ2UpOw0KLSAgICB2aXJ0dWFsIElGREVfWE1MRWxlbWVudCoJR2V0UGFja2FnZURhdGEoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2F2ZVBhY2thZ2UoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlLCBJRlhfRmlsZVdyaXRlKiBwRmlsZSwgSVhGQV9DaGVja3N1bUNvbnRleHQgKnBDU0NvbnRleHQgPSBOVUxMKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJQ2xvc2VEb2MoSVhGQV9Eb2MqIGhEb2MpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJbXBvcnREYXRhKElYRkFfRG9jKiBoRG9jLCBJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlhEUCA9IFRSVUUpOw0KLSAgICB2aXJ0dWFsCXZvaWQJCQlTZXRKU0VSdW50aW1lKElYRkFfRG9jKiBoRG9jLCBGWEpTRV9IUlVOVElNRSBoUnVudGltZSk7DQotICAgIHZpcnR1YWwgRlhKU0VfSFZBTFVFCQlHZXRYRkFTY3JpcHRPYmplY3QoSVhGQV9Eb2MqIGhEb2MpOw0KLSAgICB2aXJ0dWFsIFhGQV9BVFRSSUJVVEVFTlVNCUdldFJlc3RvcmVTdGF0ZShJWEZBX0RvYyogaERvYyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJ1bkRvY1NjcmlwdChJWEZBX0RvYyogaERvYywgWEZBX1NDUklQVFRZUEUgZVNjcmlwdFR5cGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTY3JpcHQsIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsIEZYSlNFX0hWQUxVRSBoVGhpc09iamVjdCk7DQotcHJvdGVjdGVkOg0KKyAgdmlydHVhbCBJWEZBX0RvY1ZpZXcqIENyZWF0ZURvY1ZpZXcoSVhGQV9Eb2MqIGhEb2MsIEZYX0RXT1JEIGR3VmlldyA9IDApOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50UGFja2FnZXMoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCB2b2lkIEdldFBhY2thZ2VOYW1lKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhY2thZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhY2thZ2UpOw0KKyAgdmlydHVhbCBJRkRFX1hNTEVsZW1lbnQqIEdldFBhY2thZ2VEYXRhKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTYXZlUGFja2FnZShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGFja2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVdyaXRlKiBwRmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEZBX0NoZWNrc3VtQ29udGV4dCogcENTQ29udGV4dCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIENsb3NlRG9jKElYRkFfRG9jKiBoRG9jKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJbXBvcnREYXRhKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiWERQID0gVFJVRSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0SlNFUnVudGltZShJWEZBX0RvYyogaERvYywgRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpOw0KKyAgdmlydHVhbCBGWEpTRV9IVkFMVUUgR2V0WEZBU2NyaXB0T2JqZWN0KElYRkFfRG9jKiBoRG9jKTsNCisgIHZpcnR1YWwgWEZBX0FUVFJJQlVURUVOVU0gR2V0UmVzdG9yZVN0YXRlKElYRkFfRG9jKiBoRG9jKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBSdW5Eb2NTY3JpcHQoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9TQ1JJUFRUWVBFIGVTY3JpcHRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU2NyaXB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFRoaXNPYmplY3QpOw0KKw0KKyBwcm90ZWN0ZWQ6DQogfTsNCiANCiAjZW5kaWYgIC8vIFhGQV9GRkRPQ0hBTkRMRVJfSF8NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2N2aWV3LmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuY3BwCmluZGV4IGU2NzYxMmQuLmRjNDQ0ZDIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuY3BwCkBAIC0zMCw5MzEgKzMwLDkwNyBAQAogI2luY2x1ZGUgInhmYV90ZXh0bGF5b3V0LmgiDQogI2luY2x1ZGUgInhmYV9mZndpZGdldGFjYy5oIg0KIGV4dGVybiBjb25zdCBYRkFfQVRUUklCVVRFRU5VTSBnc19FdmVudEFjdGl2aXR5W10gPSB7DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9DaGFuZ2UsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0RvY0Nsb3NlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Eb2NSZWFkeSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fRW50ZXIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0V4aXQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Z1bGwsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX0luZGV4Q2hhbmdlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Jbml0aWFsaXplLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZURvd24sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRW50ZXIsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRXhpdCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VVcCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdEV4ZWN1dGUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RPcGVuLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0UHJpbnQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTYXZlLA0KLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2lnbiwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFN1Ym1pdCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUHJlRXhlY3V0ZSwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUHJlT3BlbiwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUHJlUHJpbnQsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNhdmUsDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNpZ24sDQotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVN1Ym1pdCwNCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUmVhZHksDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrLCAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRG9jQ2xvc2UsICAgWEZBX0FUVFJJQlVURUVOVU1fRG9jUmVhZHksDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0VudGVyLCAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0V4aXQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0Z1bGwsICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0luZGV4Q2hhbmdlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Jbml0aWFsaXplLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZURvd24sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRW50ZXIsIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRXhpdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VVcCwgICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdEV4ZWN1dGUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RPcGVuLCAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RQcmludCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFNhdmUsICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFNpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTdWJtaXQsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZUV4ZWN1dGUsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZU9wZW4sICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVByaW50LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTYXZlLCAgICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTaWduLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTdWJtaXQsICBYRkFfQVRUUklCVVRFRU5VTV9SZWFkeSwNCiAgICAgWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93biwNCiB9Ow0KIENYRkFfRkZEb2NWaWV3OjpDWEZBX0ZGRG9jVmlldyhDWEZBX0ZGRG9jKiBwRG9jKQ0KLSAgICA6IG1fcERvYyhwRG9jKQ0KLSAgICAsIG1fcFdpZGdldEhhbmRsZXIoTlVMTCkNCi0gICAgLCBtX3BYRkFEb2NMYXlvdXQoTlVMTCkNCi0gICAgLCBtX2lTdGF0dXMoWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX05vbmUpDQotICAgICwgbV9pTG9jaygwKQ0KLSAgICAsIG1fYkxheW91dEV2ZW50KEZBTFNFKQ0KLSAgICAsIG1fcEZvY3VzQWNjKE5VTEwpDQotICAgICwgbV9wRm9jdXNXaWRnZXQoTlVMTCkNCi0gICAgLCBtX3BMaXN0Rm9jdXNXaWRnZXQoTlVMTCkNCi0gICAgLCBtX3BPbGRGb2N1c1dpZGdldChOVUxMKQ0KLSAgICAsIG1fYkluTGF5b3V0U3RhdHVzKEZBTFNFKQ0KLXsNCisgICAgOiBtX3BEb2MocERvYyksDQorICAgICAgbV9wV2lkZ2V0SGFuZGxlcihOVUxMKSwNCisgICAgICBtX3BYRkFEb2NMYXlvdXQoTlVMTCksDQorICAgICAgbV9pU3RhdHVzKFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Ob25lKSwNCisgICAgICBtX2lMb2NrKDApLA0KKyAgICAgIG1fYkxheW91dEV2ZW50KEZBTFNFKSwNCisgICAgICBtX3BGb2N1c0FjYyhOVUxMKSwNCisgICAgICBtX3BGb2N1c1dpZGdldChOVUxMKSwNCisgICAgICBtX3BMaXN0Rm9jdXNXaWRnZXQoTlVMTCksDQorICAgICAgbV9wT2xkRm9jdXNXaWRnZXQoTlVMTCksDQorICAgICAgbV9iSW5MYXlvdXRTdGF0dXMoRkFMU0UpIHt9DQorQ1hGQV9GRkRvY1ZpZXc6On5DWEZBX0ZGRG9jVmlldygpIHsNCisgIERlc3Ryb3lEb2NWaWV3KCk7DQorICBpZiAobV9wV2lkZ2V0SGFuZGxlcikgew0KKyAgICBkZWxldGUgbV9wV2lkZ2V0SGFuZGxlcjsNCisgIH0NCisgIG1fcFdpZGdldEhhbmRsZXIgPSBOVUxMOw0KIH0NCi1DWEZBX0ZGRG9jVmlldzo6fkNYRkFfRkZEb2NWaWV3KCkNCi17DQotICAgIERlc3Ryb3lEb2NWaWV3KCk7DQotICAgIGlmIChtX3BXaWRnZXRIYW5kbGVyKSB7DQotICAgICAgICBkZWxldGUgbV9wV2lkZ2V0SGFuZGxlcjsNCi0gICAgfQ0KLSAgICBtX3BXaWRnZXRIYW5kbGVyID0gTlVMTDsNCit2b2lkIENYRkFfRkZEb2NWaWV3OjpJbml0TGF5b3V0KENYRkFfTm9kZSogcE5vZGUpIHsNCisgIFJ1bkJpbmRJdGVtcygpOw0KKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX0luaXRpYWxpemUpOw0KKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX0luZGV4Q2hhbmdlKTsNCiB9DQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6SW5pdExheW91dChDWEZBX05vZGUqIHBOb2RlKQ0KLXsNCi0gICAgUnVuQmluZEl0ZW1zKCk7DQotICAgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIFhGQV9FVkVOVF9Jbml0aWFsaXplKTsNCi0gICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX0luZGV4Q2hhbmdlKTsNCi19DQotaW50MzJfdCBDWEZBX0ZGRG9jVmlldzo6U3RhcnRMYXlvdXQoaW50MzJfdCBpU3RhcnRQYWdlICkNCi17DQotICAgIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19TdGFydDsNCi0gICAgbV9wRG9jLT5HZXRYRkFEb2MoKS0+RG9Qcm90b01lcmdlKCk7DQotICAgIG1fcERvYy0+R2V0WEZBRG9jKCktPkRvRGF0YU1lcmdlKCk7DQotICAgIG1fcFhGQURvY0xheW91dCA9IEdldFhGQUxheW91dCgpOw0KLSAgICBpbnQzMl90IGlTdGF0dXMgPSBtX3BYRkFEb2NMYXlvdXQtPlN0YXJ0TGF5b3V0KCk7DQotICAgIGlmIChpU3RhdHVzIDwgMCkgew0KLSAgICAgICAgcmV0dXJuIGlTdGF0dXM7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwUm9vdEl0ZW0gPSAoQ1hGQV9Ob2RlKiltX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCi0gICAgaWYgKCFwUm9vdEl0ZW0pIHsNCi0gICAgICAgIHJldHVybiBpU3RhdHVzOw0KLSAgICB9DQotICAgIEluaXRMYXlvdXQocFJvb3RJdGVtKTsNCi0gICAgSW5pdENhbGN1bGF0ZShwUm9vdEl0ZW0pOw0KLSAgICBJbml0VmFsaWRhdGUocFJvb3RJdGVtKTsNCi0gICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9SZWFkeSwgVFJVRSk7DQotICAgIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19TdGFydDsNCitpbnQzMl90IENYRkFfRkZEb2NWaWV3OjpTdGFydExheW91dChpbnQzMl90IGlTdGFydFBhZ2UpIHsNCisgIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19TdGFydDsNCisgIG1fcERvYy0+R2V0WEZBRG9jKCktPkRvUHJvdG9NZXJnZSgpOw0KKyAgbV9wRG9jLT5HZXRYRkFEb2MoKS0+RG9EYXRhTWVyZ2UoKTsNCisgIG1fcFhGQURvY0xheW91dCA9IEdldFhGQUxheW91dCgpOw0KKyAgaW50MzJfdCBpU3RhdHVzID0gbV9wWEZBRG9jTGF5b3V0LT5TdGFydExheW91dCgpOw0KKyAgaWYgKGlTdGF0dXMgPCAwKSB7DQogICAgIHJldHVybiBpU3RhdHVzOw0KLX0NCi1pbnQzMl90IENYRkFfRkZEb2NWaWV3OjpEb0xheW91dChJRlhfUGF1c2UgKnBQYXVzZSApDQotew0KLSAgICBpbnQzMl90IGlTdGF0dXMgPSAxMDA7DQotICAgIGlTdGF0dXMgPSBtX3BYRkFEb2NMYXlvdXQtPkRvTGF5b3V0KHBQYXVzZSk7DQotICAgIGlmIChpU3RhdHVzICE9IDEwMCkgew0KLSAgICAgICAgcmV0dXJuIGlTdGF0dXM7DQotICAgIH0NCi0gICAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0RvaW5nOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUm9vdEl0ZW0gPQ0KKyAgICAgIChDWEZBX05vZGUqKW1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgaWYgKCFwUm9vdEl0ZW0pIHsNCiAgICAgcmV0dXJuIGlTdGF0dXM7DQorICB9DQorICBJbml0TGF5b3V0KHBSb290SXRlbSk7DQorICBJbml0Q2FsY3VsYXRlKHBSb290SXRlbSk7DQorICBJbml0VmFsaWRhdGUocFJvb3RJdGVtKTsNCisgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFJvb3RJdGVtLCBYRkFfRVZFTlRfUmVhZHksIFRSVUUpOw0KKyAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1N0YXJ0Ow0KKyAgcmV0dXJuIGlTdGF0dXM7DQogfQ0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlN0b3BMYXlvdXQoKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwUm9vdEl0ZW0gPSAoQ1hGQV9Ob2RlKiltX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCi0gICAgaWYgKCFwUm9vdEl0ZW0pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSA9IHBSb290SXRlbS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQotICAgIGlmICghcFN1YmZvcm1Ob2RlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwUGFnZVNldE5vZGUgPSBwU3ViZm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KLSAgICBpZighcFBhZ2VTZXROb2RlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgUnVuQ2FsY3VsYXRlV2lkZ2V0cygpOw0KLSAgICBSdW5WYWxpZGF0ZSgpOw0KLSAgICBJbml0TGF5b3V0KHBQYWdlU2V0Tm9kZSk7DQotICAgIEluaXRDYWxjdWxhdGUocFBhZ2VTZXROb2RlKTsNCi0gICAgSW5pdFZhbGlkYXRlKHBQYWdlU2V0Tm9kZSk7DQotICAgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFBhZ2VTZXROb2RlLCBYRkFfRVZFTlRfUmVhZHksIFRSVUUpOw0KK2ludDMyX3QgQ1hGQV9GRkRvY1ZpZXc6OkRvTGF5b3V0KElGWF9QYXVzZSogcFBhdXNlKSB7DQorICBpbnQzMl90IGlTdGF0dXMgPSAxMDA7DQorICBpU3RhdHVzID0gbV9wWEZBRG9jTGF5b3V0LT5Eb0xheW91dChwUGF1c2UpOw0KKyAgaWYgKGlTdGF0dXMgIT0gMTAwKSB7DQorICAgIHJldHVybiBpU3RhdHVzOw0KKyAgfQ0KKyAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0RvaW5nOw0KKyAgcmV0dXJuIGlTdGF0dXM7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlN0b3BMYXlvdXQoKSB7DQorICBDWEZBX05vZGUqIHBSb290SXRlbSA9DQorICAgICAgKENYRkFfTm9kZSopbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQorICBpZiAoIXBSb290SXRlbSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSA9IHBSb290SXRlbS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICBpZiAoIXBTdWJmb3JtTm9kZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHBQYWdlU2V0Tm9kZSA9DQorICAgICAgcFN1YmZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9QYWdlU2V0KTsNCisgIGlmICghcFBhZ2VTZXROb2RlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFJ1bkNhbGN1bGF0ZVdpZGdldHMoKTsNCisgIFJ1blZhbGlkYXRlKCk7DQorICBJbml0TGF5b3V0KHBQYWdlU2V0Tm9kZSk7DQorICBJbml0Q2FsY3VsYXRlKHBQYWdlU2V0Tm9kZSk7DQorICBJbml0VmFsaWRhdGUocFBhZ2VTZXROb2RlKTsNCisgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFBhZ2VTZXROb2RlLCBYRkFfRVZFTlRfUmVhZHksIFRSVUUpOw0KKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9SZWFkeSk7DQorICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBSb290SXRlbSwgWEZBX0VWRU5UX0RvY1JlYWR5KTsNCisgIFJ1bkNhbGN1bGF0ZVdpZGdldHMoKTsNCisgIFJ1blZhbGlkYXRlKCk7DQorICBpZiAoUnVuTGF5b3V0KCkpIHsNCiAgICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9SZWFkeSk7DQotICAgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFJvb3RJdGVtLCBYRkFfRVZFTlRfRG9jUmVhZHkpOw0KLSAgICBSdW5DYWxjdWxhdGVXaWRnZXRzKCk7DQotICAgIFJ1blZhbGlkYXRlKCk7DQotICAgIGlmKFJ1bkxheW91dCgpKSB7DQotICAgICAgICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBSb290SXRlbSwgWEZBX0VWRU5UX1JlYWR5KTsNCi0gICAgfQ0KLSAgICBtX0NhbGN1bGF0ZUFjY3MuUmVtb3ZlQWxsKCk7DQotICAgIGlmIChtX3BGb2N1c0FjYyAmJiAhbV9wRm9jdXNXaWRnZXQpIHsNCi0gICAgICAgIFNldEZvY3VzV2lkZ2V0QWNjKG1fcEZvY3VzQWNjKTsNCi0gICAgfQ0KLSAgICBtX2lTdGF0dXMgPSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kOw0KKyAgfQ0KKyAgbV9DYWxjdWxhdGVBY2NzLlJlbW92ZUFsbCgpOw0KKyAgaWYgKG1fcEZvY3VzQWNjICYmICFtX3BGb2N1c1dpZGdldCkgew0KKyAgICBTZXRGb2N1c1dpZGdldEFjYyhtX3BGb2N1c0FjYyk7DQorICB9DQorICBtX2lTdGF0dXMgPSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kOw0KIH0NCi1pbnQzMl90IENYRkFfRkZEb2NWaWV3OjpHZXRMYXlvdXRTdGF0dXMoKQ0KLXsNCi0gICAgcmV0dXJuIG1faVN0YXR1czsNCitpbnQzMl90IENYRkFfRkZEb2NWaWV3OjpHZXRMYXlvdXRTdGF0dXMoKSB7DQorICByZXR1cm4gbV9pU3RhdHVzOw0KIH0NCi12b2lkIENYRkFfRkZEb2NWaWV3OjpTaG93TnVsbFRlc3RNc2coKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX2Fyck51bGxUZXN0TXNnLkdldFNpemUoKTsNCi0gICAgQ1hGQV9GRkFwcCogcEFwcCA9IG1fcERvYy0+R2V0QXBwKCk7DQotICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IHBBcHAtPkdldEFwcFByb3ZpZGVyKCk7DQotICAgIGlmIChwQXBwUHJvdmlkZXIgJiYgaUNvdW50KSB7DQotICAgICAgICBpbnQzMl90IGlSZW1haW4gPSBpQ291bnQgPiA3ID8gaUNvdW50IC0gNyA6IDA7DQotICAgICAgICBpQ291bnQgLT0gaVJlbWFpbjsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTXNnOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgICAgICB3c01zZyArPSBtX2Fyck51bGxUZXN0TXNnW2ldICsgRlhfV1NUUkMoTCJcbiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlSZW1haW4gPiAwKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaW1pdDsNCi0gICAgICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19WYWxpZGF0ZUxpbWl0LCB3c0xpbWl0KTsNCi0gICAgICAgICAgICBpZiAoIXdzTGltaXQuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCi0gICAgICAgICAgICAgICAgd3NUZW1wLkZvcm1hdCgoY29uc3QgRlhfV0NIQVIqKXdzTGltaXQsIGlSZW1haW4pOw0KLSAgICAgICAgICAgICAgICB3c01zZyArPSBGWF9XU1RSQyhMIlxuIikgKyB3c1RlbXA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaXRsZTsNCi0gICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX0FwcE5hbWUsIHdzVGl0bGUpOw0KLSAgICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fU3RhdHVzLCBYRkFfTUJfT0spOw0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlNob3dOdWxsVGVzdE1zZygpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJOdWxsVGVzdE1zZy5HZXRTaXplKCk7DQorICBDWEZBX0ZGQXBwKiBwQXBwID0gbV9wRG9jLT5HZXRBcHAoKTsNCisgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IHBBcHAtPkdldEFwcFByb3ZpZGVyKCk7DQorICBpZiAocEFwcFByb3ZpZGVyICYmIGlDb3VudCkgew0KKyAgICBpbnQzMl90IGlSZW1haW4gPSBpQ291bnQgPiA3ID8gaUNvdW50IC0gNyA6IDA7DQorICAgIGlDb3VudCAtPSBpUmVtYWluOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c01zZzsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICB3c01zZyArPSBtX2Fyck51bGxUZXN0TXNnW2ldICsgRlhfV1NUUkMoTCJcbiIpOw0KICAgICB9DQotICAgIG1fYXJyTnVsbFRlc3RNc2cuUmVtb3ZlQWxsKCk7DQorICAgIGlmIChpUmVtYWluID4gMCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGltaXQ7DQorICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVMaW1pdCwgd3NMaW1pdCk7DQorICAgICAgaWYgKCF3c0xpbWl0LklzRW1wdHkoKSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgICAgd3NUZW1wLkZvcm1hdCgoY29uc3QgRlhfV0NIQVIqKXdzTGltaXQsIGlSZW1haW4pOw0KKyAgICAgICAgd3NNc2cgKz0gRlhfV1NUUkMoTCJcbiIpICsgd3NUZW1wOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19BcHBOYW1lLCB3c1RpdGxlKTsNCisgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fU3RhdHVzLCBYRkFfTUJfT0spOw0KKyAgfQ0KKyAgbV9hcnJOdWxsVGVzdE1zZy5SZW1vdmVBbGwoKTsNCiB9DQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6VXBkYXRlRG9jVmlldygpDQotew0KLSAgICBpZiAoSXNVcGRhdGVMb2NrZWQoKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIExvY2tVcGRhdGUoKTsNCi0gICAgaW50MzJfdCBpTmV3QWRkcyA9IG1fTmV3QWRkZWROb2Rlcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlOZXdBZGRzOyBpKyspIHsNCi0gICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSAoQ1hGQV9Ob2RlKiltX05ld0FkZGVkTm9kZXNbaV07DQotICAgICAgICBJbml0Q2FsY3VsYXRlKHBOb2RlKTsNCi0gICAgICAgIEluaXRWYWxpZGF0ZShwTm9kZSk7DQotICAgICAgICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBYRkFfRVZFTlRfUmVhZHksIFRSVUUpOw0KLSAgICB9DQotICAgIG1fTmV3QWRkZWROb2Rlcy5SZW1vdmVBbGwoKTsNCi0gICAgdGhpcy0+UnVuU3ViZm9ybUluZGV4Q2hhbmdlKCk7DQotICAgIHRoaXMtPlJ1bkNhbGN1bGF0ZVdpZGdldHMoKTsNCi0gICAgdGhpcy0+UnVuVmFsaWRhdGUoKTsNCi0gICAgU2hvd051bGxUZXN0TXNnKCk7DQotICAgIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19OZXh0Ow0KLSAgICBpZiAoUnVuTGF5b3V0KCkgJiYgbV9iTGF5b3V0RXZlbnQpIHsNCi0gICAgICAgIFJ1bkV2ZW50TGF5b3V0UmVhZHkoKTsNCi0gICAgfQ0KLSAgICBtX2JMYXlvdXRFdmVudCA9IEZBTFNFOw0KLSAgICBtX0NhbGN1bGF0ZUFjY3MuUmVtb3ZlQWxsKCk7DQotICAgIHRoaXMtPlJ1bkludmFsaWRhdGUoKTsNCi0gICAgVW5sb2NrVXBkYXRlKCk7DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6VXBkYXRlRG9jVmlldygpIHsNCisgIGlmIChJc1VwZGF0ZUxvY2tlZCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIExvY2tVcGRhdGUoKTsNCisgIGludDMyX3QgaU5ld0FkZHMgPSBtX05ld0FkZGVkTm9kZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaU5ld0FkZHM7IGkrKykgew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gKENYRkFfTm9kZSopbV9OZXdBZGRlZE5vZGVzW2ldOw0KKyAgICBJbml0Q2FsY3VsYXRlKHBOb2RlKTsNCisgICAgSW5pdFZhbGlkYXRlKHBOb2RlKTsNCisgICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX1JlYWR5LCBUUlVFKTsNCisgIH0NCisgIG1fTmV3QWRkZWROb2Rlcy5SZW1vdmVBbGwoKTsNCisgIHRoaXMtPlJ1blN1YmZvcm1JbmRleENoYW5nZSgpOw0KKyAgdGhpcy0+UnVuQ2FsY3VsYXRlV2lkZ2V0cygpOw0KKyAgdGhpcy0+UnVuVmFsaWRhdGUoKTsNCisgIFNob3dOdWxsVGVzdE1zZygpOw0KKyAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX05leHQ7DQorICBpZiAoUnVuTGF5b3V0KCkgJiYgbV9iTGF5b3V0RXZlbnQpIHsNCisgICAgUnVuRXZlbnRMYXlvdXRSZWFkeSgpOw0KKyAgfQ0KKyAgbV9iTGF5b3V0RXZlbnQgPSBGQUxTRTsNCisgIG1fQ2FsY3VsYXRlQWNjcy5SZW1vdmVBbGwoKTsNCisgIHRoaXMtPlJ1bkludmFsaWRhdGUoKTsNCisgIFVubG9ja1VwZGF0ZSgpOw0KIH0NCi1pbnQzMl90IENYRkFfRkZEb2NWaWV3OjpDb3VudFBhZ2VWaWV3cygpDQotew0KLSAgICBpZiAoIW1fcFhGQURvY0xheW91dCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcFhGQURvY0xheW91dC0+Q291bnRQYWdlcygpOw0KK2ludDMyX3QgQ1hGQV9GRkRvY1ZpZXc6OkNvdW50UGFnZVZpZXdzKCkgew0KKyAgaWYgKCFtX3BYRkFEb2NMYXlvdXQpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gbV9wWEZBRG9jTGF5b3V0LT5Db3VudFBhZ2VzKCk7DQogfQ0KLUlYRkFfUGFnZVZpZXcqIENYRkFfRkZEb2NWaWV3OjpHZXRQYWdlVmlldyhpbnQzMl90IG5JbmRleCkNCi17DQotICAgIGlmICghbV9wWEZBRG9jTGF5b3V0KSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gKENYRkFfRkZQYWdlVmlldyopbV9wWEZBRG9jTGF5b3V0LT5HZXRQYWdlKG5JbmRleCk7DQorSVhGQV9QYWdlVmlldyogQ1hGQV9GRkRvY1ZpZXc6OkdldFBhZ2VWaWV3KGludDMyX3QgbkluZGV4KSB7DQorICBpZiAoIW1fcFhGQURvY0xheW91dCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiAoQ1hGQV9GRlBhZ2VWaWV3KiltX3BYRkFEb2NMYXlvdXQtPkdldFBhZ2UobkluZGV4KTsNCiB9DQotSVhGQV9XaWRnZXQqIENYRkFfRkZEb2NWaWV3OjpHZXRXaWRnZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpDQotew0KLSAgICByZXR1cm4gR2V0V2lkZ2V0QnlOYW1lKHdzTmFtZSwgTlVMTCk7DQorSVhGQV9XaWRnZXQqIENYRkFfRkZEb2NWaWV3OjpHZXRXaWRnZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsNCisgIHJldHVybiBHZXRXaWRnZXRCeU5hbWUod3NOYW1lLCBOVUxMKTsNCiB9DQotQ1hGQV9XaWRnZXRBY2MqIENYRkFfRkZEb2NWaWV3OjpHZXRXaWRnZXRBY2NCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpDQotew0KLSAgICByZXR1cm4gR2V0V2lkZ2V0QWNjQnlOYW1lKHdzTmFtZSwgTlVMTCk7DQorQ1hGQV9XaWRnZXRBY2MqIENYRkFfRkZEb2NWaWV3OjpHZXRXaWRnZXRBY2NCeU5hbWUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSB7DQorICByZXR1cm4gR2V0V2lkZ2V0QWNjQnlOYW1lKHdzTmFtZSwgTlVMTCk7DQogfQ0KLUlYRkFfRG9jTGF5b3V0KglDWEZBX0ZGRG9jVmlldzo6R2V0WEZBTGF5b3V0KCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3BEb2MtPkdldFhGQURvYygpLT5HZXREb2NMYXlvdXQoKTsNCitJWEZBX0RvY0xheW91dCogQ1hGQV9GRkRvY1ZpZXc6OkdldFhGQUxheW91dCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BEb2MtPkdldFhGQURvYygpLT5HZXREb2NMYXlvdXQoKTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6UmVzZXRTaW5nbGVXaWRnZXRBY2NEYXRhKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBXaWRnZXRBY2MtPkdldE5vZGUoKTsNCi0gICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAoZVR5cGUgIT0gWEZBX0VMRU1FTlRfRmllbGQgJiYgZVR5cGUgIT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiTm90aWZ5ID0gSXNTdGF0aWNOb3RpZnkoKTsNCi0gICAgcFdpZGdldEFjYy0+UmVzZXREYXRhKCk7DQotICAgIHBXaWRnZXRBY2MtPlVwZGF0ZVVJRGlzcGxheSgpOw0KLSAgICBpZiAoYk5vdGlmeSkgew0KLSAgICAgICAgcFdpZGdldEFjYy0+Tm90aWZ5RXZlbnQoWEZBX1dJREdFVEVWRU5UX1Bvc3RDb250ZW50Q2hhbmdlZCwgTlVMTCwgTlVMTCwgTlVMTCk7DQotICAgIH0NCi0gICAgaWYgKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUgPSBwV2lkZ2V0QWNjLT5HZXRWYWxpZGF0ZSgpKSB7DQotICAgICAgICBBZGRWYWxpZGF0ZVdpZGdldChwV2lkZ2V0QWNjKTsNCi0gICAgICAgICgoQ1hGQV9Ob2RlKil2YWxpZGF0ZSktPlNldEZsYWcoWEZBX05PREVGTEFHX05lZWRzSW5pdEFwcCwgVFJVRSwgRkFMU0UpOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OlJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYykgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBXaWRnZXRBY2MtPkdldE5vZGUoKTsNCisgIFhGQV9FTEVNRU5UIGVUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgIGlmIChlVHlwZSAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJiBlVHlwZSAhPSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiTm90aWZ5ID0gSXNTdGF0aWNOb3RpZnkoKTsNCisgIHBXaWRnZXRBY2MtPlJlc2V0RGF0YSgpOw0KKyAgcFdpZGdldEFjYy0+VXBkYXRlVUlEaXNwbGF5KCk7DQorICBpZiAoYk5vdGlmeSkgew0KKyAgICBwV2lkZ2V0QWNjLT5Ob3RpZnlFdmVudChYRkFfV0lER0VURVZFTlRfUG9zdENvbnRlbnRDaGFuZ2VkLCBOVUxMLCBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsNCisgIH0NCisgIGlmIChDWEZBX1ZhbGlkYXRlIHZhbGlkYXRlID0gcFdpZGdldEFjYy0+R2V0VmFsaWRhdGUoKSkgew0KKyAgICBBZGRWYWxpZGF0ZVdpZGdldChwV2lkZ2V0QWNjKTsNCisgICAgKChDWEZBX05vZGUqKXZhbGlkYXRlKS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfTmVlZHNJbml0QXBwLCBUUlVFLCBGQUxTRSk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6UmVzZXRXaWRnZXREYXRhKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjICkNCi17DQotICAgIG1fYkxheW91dEV2ZW50ID0gVFJVRTsNCi0gICAgRlhfQk9PTCBiQ2hhbmdlZCA9IEZBTFNFOw0KLSAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IE5VTEw7DQotICAgIGlmIChwV2lkZ2V0QWNjKSB7DQotICAgICAgICBiQ2hhbmdlZCA9IFJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShwV2lkZ2V0QWNjKTsNCi0gICAgICAgIHBGb3JtTm9kZSA9IHBXaWRnZXRBY2MtPkdldE5vZGUoKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBGb3JtTm9kZSA9IEdldFJvb3RTdWJmb3JtKCk7DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6UmVzZXRXaWRnZXREYXRhKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKSB7DQorICBtX2JMYXlvdXRFdmVudCA9IFRSVUU7DQorICBGWF9CT09MIGJDaGFuZ2VkID0gRkFMU0U7DQorICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IE5VTEw7DQorICBpZiAocFdpZGdldEFjYykgew0KKyAgICBiQ2hhbmdlZCA9IFJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShwV2lkZ2V0QWNjKTsNCisgICAgcEZvcm1Ob2RlID0gcFdpZGdldEFjYy0+R2V0Tm9kZSgpOw0KKyAgfSBlbHNlIHsNCisgICAgcEZvcm1Ob2RlID0gR2V0Um9vdFN1YmZvcm0oKTsNCisgIH0NCisgIGlmICghcEZvcm1Ob2RlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJg0KKyAgICAgIHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yIEl0ZXJhdG9yKHRoaXMsIHBGb3JtTm9kZSk7DQorICAgIHdoaWxlIChDWEZBX1dpZGdldEFjYyogcEFjYyA9IEl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgIGJDaGFuZ2VkIHw9IFJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShwQWNjKTsNCisgICAgICBpZiAocEFjYy0+R2V0Tm9kZSgpLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgICAgICBJdGVyYXRvci5Ta2lwVHJlZSgpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAoIXBGb3JtTm9kZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChwRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJiBwRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCi0gICAgICAgIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3IgSXRlcmF0b3IodGhpcywgcEZvcm1Ob2RlKTsNCi0gICAgICAgIHdoaWxlIChDWEZBX1dpZGdldEFjYyogcEFjYyA9IEl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KLSAgICAgICAgICAgIGJDaGFuZ2VkIHw9IFJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShwQWNjKTsNCi0gICAgICAgICAgICBpZiAocEFjYy0+R2V0Tm9kZSgpLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yLlNraXBUcmVlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChiQ2hhbmdlZCkgew0KLSAgICAgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5TZXRDaGFuZ2VNYXJrKG1fcERvYyk7DQotICAgIH0NCisgIH0NCisgIGlmIChiQ2hhbmdlZCkgew0KKyAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPlNldENoYW5nZU1hcmsobV9wRG9jKTsNCisgIH0NCiB9DQotaW50MzJfdCBDWEZBX0ZGRG9jVmlldzo6UHJvY2Vzc1dpZGdldEV2ZW50KENYRkFfRXZlbnRQYXJhbSogcFBhcmFtLCBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyApDQotew0KLSAgICBpZiAocFBhcmFtID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9FcnJvcjsNCitpbnQzMl90IENYRkFfRkZEb2NWaWV3OjpQcm9jZXNzV2lkZ2V0RXZlbnQoQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKSB7DQorICBpZiAocFBhcmFtID09IE5VTEwpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgfQ0KKyAgaWYgKHBQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfVmFsaWRhdGUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWxpZGF0ZVN0ciA9IEZYX1dTVFJDKEwicHJlU3VibWl0Iik7DQorICAgIENYRkFfTm9kZSogcENvbmZpZ0l0ZW0gPQ0KKyAgICAgICAgKENYRkFfTm9kZSopbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfQ29uZmlnKTsNCisgICAgaWYgKHBDb25maWdJdGVtKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwVmFsaWRhdGVOb2RlID0gTlVMTDsNCisgICAgICBDWEZBX05vZGUqIHBBY3JvYmF0Tm9kZSA9IHBDb25maWdJdGVtLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9BY3JvYmF0KTsNCisgICAgICBwVmFsaWRhdGVOb2RlID0NCisgICAgICAgICAgcEFjcm9iYXROb2RlID8gcEFjcm9iYXROb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWxpZGF0ZSkgOiBOVUxMOw0KKyAgICAgIGlmICghcFZhbGlkYXRlTm9kZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUHJlc2VudE5vZGUgPSBwQ29uZmlnSXRlbS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUHJlc2VudCk7DQorICAgICAgICBwVmFsaWRhdGVOb2RlID0gcFByZXNlbnROb2RlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcFByZXNlbnROb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWxpZGF0ZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBpZiAocFZhbGlkYXRlTm9kZSkgew0KKyAgICAgICAgd3NWYWxpZGF0ZVN0ciA9IHBWYWxpZGF0ZU5vZGUtPkdldENvbnRlbnQoKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKHBQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfVmFsaWRhdGUpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsaWRhdGVTdHIgPSBGWF9XU1RSQyhMInByZVN1Ym1pdCIpOw0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwQ29uZmlnSXRlbSA9IChDWEZBX05vZGUqKW1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0NvbmZpZyk7DQotICAgICAgICBpZiAocENvbmZpZ0l0ZW0pIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBWYWxpZGF0ZU5vZGUgPSBOVUxMOw0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcEFjcm9iYXROb2RlID0gcENvbmZpZ0l0ZW0tPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0Fjcm9iYXQpOw0KLSAgICAgICAgICAgIHBWYWxpZGF0ZU5vZGUgPSBwQWNyb2JhdE5vZGUgPyBwQWNyb2JhdE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbGlkYXRlKSA6IE5VTEw7DQotICAgICAgICAgICAgaWYgKCFwVmFsaWRhdGVOb2RlKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFByZXNlbnROb2RlID0gcENvbmZpZ0l0ZW0tPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ByZXNlbnQpOw0KLSAgICAgICAgICAgICAgICBwVmFsaWRhdGVOb2RlID0gcFByZXNlbnROb2RlID8gcFByZXNlbnROb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWxpZGF0ZSkgOiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocFZhbGlkYXRlTm9kZSkgew0KLSAgICAgICAgICAgICAgICB3c1ZhbGlkYXRlU3RyID0gcFZhbGlkYXRlTm9kZS0+R2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0JPT0wgYlZhbGlkYXRlID0gRkFMU0U7DQotICAgICAgICBzd2l0Y2ggKHBQYXJhbS0+bV9pVmFsaWRhdGVBY3Rpdml0aWVzKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfVkFMSURBVEVfcHJlU3VibWl0Og0KLSAgICAgICAgICAgICAgICBiVmFsaWRhdGUgPSB3c1ZhbGlkYXRlU3RyLkZpbmQoTCJwcmVTdWJtaXQiKSAhPSAtMTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfVkFMSURBVEVfcHJlUHJpbnQ6DQotICAgICAgICAgICAgICAgIGJWYWxpZGF0ZSA9IHdzVmFsaWRhdGVTdHIuRmluZChMInByZVByaW50IikgIT0gLTE7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX1ZBTElEQVRFX3ByZUV4ZWN1dGU6DQotICAgICAgICAgICAgICAgIGJWYWxpZGF0ZSA9IHdzVmFsaWRhdGVTdHIuRmluZChMInByZUV4ZWN1dGUiKSAhPSAtMTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfVkFMSURBVEVfcHJlU2F2ZToNCi0gICAgICAgICAgICAgICAgYlZhbGlkYXRlID0gd3NWYWxpZGF0ZVN0ci5GaW5kKEwicHJlU2F2ZSIpICE9IC0xOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYlZhbGlkYXRlKSB7DQotICAgICAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCi0gICAgICAgIH0NCisgICAgRlhfQk9PTCBiVmFsaWRhdGUgPSBGQUxTRTsNCisgICAgc3dpdGNoIChwUGFyYW0tPm1faVZhbGlkYXRlQWN0aXZpdGllcykgew0KKyAgICAgIGNhc2UgWEZBX1ZBTElEQVRFX3ByZVN1Ym1pdDoNCisgICAgICAgIGJWYWxpZGF0ZSA9IHdzVmFsaWRhdGVTdHIuRmluZChMInByZVN1Ym1pdCIpICE9IC0xOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfVkFMSURBVEVfcHJlUHJpbnQ6DQorICAgICAgICBiVmFsaWRhdGUgPSB3c1ZhbGlkYXRlU3RyLkZpbmQoTCJwcmVQcmludCIpICE9IC0xOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfVkFMSURBVEVfcHJlRXhlY3V0ZToNCisgICAgICAgIGJWYWxpZGF0ZSA9IHdzVmFsaWRhdGVTdHIuRmluZChMInByZUV4ZWN1dGUiKSAhPSAtMTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX1ZBTElEQVRFX3ByZVNhdmU6DQorICAgICAgICBiVmFsaWRhdGUgPSB3c1ZhbGlkYXRlU3RyLkZpbmQoTCJwcmVTYXZlIikgIT0gLTE7DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gcFdpZGdldEFjYyA/IHBXaWRnZXRBY2MtPkdldE5vZGUoKSA6IE5VTEw7DQotICAgIGlmICghcE5vZGUpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcFJvb3RJdGVtID0gKENYRkFfTm9kZSopbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQotICAgICAgICBpZiAoIXBSb290SXRlbSkgew0KLSAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9FcnJvcjsNCi0gICAgICAgIH0NCi0gICAgICAgIHBOb2RlID0gcFJvb3RJdGVtLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCisgICAgaWYgKCFiVmFsaWRhdGUpIHsNCisgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KICAgICB9DQotICAgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIHBQYXJhbS0+bV9lVHlwZSwgcFBhcmFtLT5tX2JJc0Zvcm1SZWFkeSk7DQotICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gcFdpZGdldEFjYyA/IHBXaWRnZXRBY2MtPkdldE5vZGUoKSA6IE5VTEw7DQorICBpZiAoIXBOb2RlKSB7DQorICAgIENYRkFfTm9kZSogcFJvb3RJdGVtID0NCisgICAgICAgIChDWEZBX05vZGUqKW1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgICBpZiAoIXBSb290SXRlbSkgew0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9FcnJvcjsNCisgICAgfQ0KKyAgICBwTm9kZSA9IHBSb290SXRlbS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICB9DQorICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBwUGFyYW0tPm1fZVR5cGUsIHBQYXJhbS0+bV9iSXNGb3JtUmVhZHkpOw0KKyAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCiB9DQotSVhGQV9XaWRnZXRIYW5kbGVyKiBDWEZBX0ZGRG9jVmlldzo6R2V0V2lkZ2V0SGFuZGxlcigpDQotew0KLSAgICBpZiAoIW1fcFdpZGdldEhhbmRsZXIpIHsNCi0gICAgICAgIG1fcFdpZGdldEhhbmRsZXIgPSBGWF9ORVcgQ1hGQV9GRldpZGdldEhhbmRsZXIodGhpcyk7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcFdpZGdldEhhbmRsZXI7DQorSVhGQV9XaWRnZXRIYW5kbGVyKiBDWEZBX0ZGRG9jVmlldzo6R2V0V2lkZ2V0SGFuZGxlcigpIHsNCisgIGlmICghbV9wV2lkZ2V0SGFuZGxlcikgew0KKyAgICBtX3BXaWRnZXRIYW5kbGVyID0gRlhfTkVXIENYRkFfRkZXaWRnZXRIYW5kbGVyKHRoaXMpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcFdpZGdldEhhbmRsZXI7DQogfQ0KLUlYRkFfV2lkZ2V0SXRlcmF0b3IqIENYRkFfRkZEb2NWaWV3OjpDcmVhdGVXaWRnZXRJdGVyYXRvcigpDQotew0KLSAgICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IEdldFJvb3RTdWJmb3JtKCk7DQotICAgIGlmICghcEZvcm1Sb290KSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhfTkVXIENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcih0aGlzLCBwRm9ybVJvb3QpOw0KK0lYRkFfV2lkZ2V0SXRlcmF0b3IqIENYRkFfRkZEb2NWaWV3OjpDcmVhdGVXaWRnZXRJdGVyYXRvcigpIHsNCisgIENYRkFfTm9kZSogcEZvcm1Sb290ID0gR2V0Um9vdFN1YmZvcm0oKTsNCisgIGlmICghcEZvcm1Sb290KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX05FVyBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3IodGhpcywgcEZvcm1Sb290KTsNCiB9DQotSVhGQV9XaWRnZXRBY2NJdGVyYXRvciogQ1hGQV9GRkRvY1ZpZXc6OkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKFhGQV9XSURHRVRPUkRFUiBlT3JkZXIgKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRm9ybVJvb3QgPSBHZXRSb290U3ViZm9ybSgpOw0KLSAgICBpZiAoIXBGb3JtUm9vdCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIEZYX05FVyBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKHRoaXMsIHBGb3JtUm9vdCk7DQorSVhGQV9XaWRnZXRBY2NJdGVyYXRvciogQ1hGQV9GRkRvY1ZpZXc6OkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKA0KKyAgICBYRkFfV0lER0VUT1JERVIgZU9yZGVyKSB7DQorICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IEdldFJvb3RTdWJmb3JtKCk7DQorICBpZiAoIXBGb3JtUm9vdCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBGWF9ORVcgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcih0aGlzLCBwRm9ybVJvb3QpOw0KIH0NCi1JWEZBX1dpZGdldCogQ1hGQV9GRkRvY1ZpZXc6OkdldEZvY3VzV2lkZ2V0KCkNCi17DQotICAgIHJldHVybiBtX3BGb2N1c1dpZGdldDsNCitJWEZBX1dpZGdldCogQ1hGQV9GRkRvY1ZpZXc6OkdldEZvY3VzV2lkZ2V0KCkgew0KKyAgcmV0dXJuIG1fcEZvY3VzV2lkZ2V0Ow0KIH0NCi12b2lkIENYRkFfRkZEb2NWaWV3OjpLaWxsRm9jdXMoKQ0KLXsNCi0gICAgaWYgKG1fcEZvY3VzV2lkZ2V0ICYmIChtX3BGb2N1c1dpZGdldC0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQpKSB7DQotICAgICAgICAobV9wRm9jdXNXaWRnZXQpLT5PbktpbGxGb2N1cyhOVUxMKTsNCit2b2lkIENYRkFfRkZEb2NWaWV3OjpLaWxsRm9jdXMoKSB7DQorICBpZiAobV9wRm9jdXNXaWRnZXQgJiYNCisgICAgICAobV9wRm9jdXNXaWRnZXQtPkdldFN0YXR1cygpICYgWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkKSkgew0KKyAgICAobV9wRm9jdXNXaWRnZXQpLT5PbktpbGxGb2N1cyhOVUxMKTsNCisgIH0NCisgIG1fcEZvY3VzQWNjID0gTlVMTDsNCisgIG1fcEZvY3VzV2lkZ2V0ID0gTlVMTDsNCisgIG1fcE9sZEZvY3VzV2lkZ2V0ID0gTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6U2V0Rm9jdXMoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIENYRkFfRkZXaWRnZXQqIHBOZXdGb2N1cyA9IChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0Ow0KKyAgaWYgKG1fcE9sZEZvY3VzV2lkZ2V0ID09IHBOZXdGb2N1cykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX0ZGV2lkZ2V0KiBwT2xkRm9jdXMgPSBtX3BPbGRGb2N1c1dpZGdldDsNCisgIG1fcE9sZEZvY3VzV2lkZ2V0ID0gcE5ld0ZvY3VzOw0KKyAgaWYgKHBPbGRGb2N1cykgew0KKyAgICBpZiAobV9wRm9jdXNXaWRnZXQgIT0gbV9wT2xkRm9jdXNXaWRnZXQgJiYNCisgICAgICAgIChwT2xkRm9jdXMtPkdldFN0YXR1cygpICYgWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkKSkgew0KKyAgICAgIG1fcEZvY3VzV2lkZ2V0ID0gcE9sZEZvY3VzOw0KKyAgICAgIHBPbGRGb2N1cy0+T25LaWxsRm9jdXMocE5ld0ZvY3VzKTsNCisgICAgfSBlbHNlIGlmICgocE9sZEZvY3VzLT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCisgICAgICBpZiAoIXBPbGRGb2N1cy0+SXNMb2FkZWQoKSkgew0KKyAgICAgICAgcE9sZEZvY3VzLT5Mb2FkV2lkZ2V0KCk7DQorICAgICAgfQ0KKyAgICAgIHBPbGRGb2N1cy0+T25TZXRGb2N1cyhtX3BGb2N1c1dpZGdldCk7DQorICAgICAgbV9wRm9jdXNXaWRnZXQgPSBwT2xkRm9jdXM7DQorICAgICAgcE9sZEZvY3VzLT5PbktpbGxGb2N1cyhwTmV3Rm9jdXMpOw0KICAgICB9DQorICB9DQorICBpZiAobV9wRm9jdXNXaWRnZXQgPT0gbV9wT2xkRm9jdXNXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcE5ld0ZvY3VzID0gbV9wT2xkRm9jdXNXaWRnZXQ7DQorICBpZiAobV9wTGlzdEZvY3VzV2lkZ2V0ICYmIHBOZXdGb2N1cyA9PSBtX3BMaXN0Rm9jdXNXaWRnZXQpIHsNCisgICAgbV9wRm9jdXNBY2MgPSBOVUxMOw0KKyAgICBtX3BGb2N1c1dpZGdldCA9IE5VTEw7DQorICAgIG1fcExpc3RGb2N1c1dpZGdldCA9IE5VTEw7DQorICAgIG1fcE9sZEZvY3VzV2lkZ2V0ID0gTlVMTDsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBOZXdGb2N1cyAmJiAocE5ld0ZvY3VzLT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCisgICAgaWYgKCFwTmV3Rm9jdXMtPklzTG9hZGVkKCkpIHsNCisgICAgICBwTmV3Rm9jdXMtPkxvYWRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICBwTmV3Rm9jdXMtPk9uU2V0Rm9jdXMobV9wRm9jdXNXaWRnZXQpOw0KKyAgfQ0KKyAgbV9wRm9jdXNBY2MgPSBwTmV3Rm9jdXMgPyBwTmV3Rm9jdXMtPkdldERhdGFBY2MoKSA6IE5VTEw7DQorICBtX3BGb2N1c1dpZGdldCA9IHBOZXdGb2N1czsNCisgIG1fcE9sZEZvY3VzV2lkZ2V0ID0gbV9wRm9jdXNXaWRnZXQ7DQorICByZXR1cm4gVFJVRTsNCit9DQorQ1hGQV9XaWRnZXRBY2MqIENYRkFfRkZEb2NWaWV3OjpHZXRGb2N1c1dpZGdldEFjYygpIHsNCisgIHJldHVybiBtX3BGb2N1c0FjYzsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6U2V0Rm9jdXNXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpIHsNCisgIENYRkFfRkZXaWRnZXQqIHBOZXdGb2N1cyA9DQorICAgICAgcFdpZGdldEFjYyA/IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQoTlVMTCkgOiBOVUxMOw0KKyAgaWYgKFNldEZvY3VzKHBOZXdGb2N1cykpIHsNCisgICAgbV9wRm9jdXNBY2MgPSBwV2lkZ2V0QWNjOw0KKyAgICBpZiAobV9pU3RhdHVzID49IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpIHsNCisgICAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPlNldEZvY3VzV2lkZ2V0KG1fcERvYywgbV9wRm9jdXNXaWRnZXQpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkRlbGV0ZUxheW91dEl0ZW0oQ1hGQV9GRldpZGdldCogcFdpZGdldCkgew0KKyAgaWYgKG1fcEZvY3VzQWNjID09IHBXaWRnZXQtPkdldERhdGFBY2MoKSkgew0KICAgICBtX3BGb2N1c0FjYyA9IE5VTEw7DQogICAgIG1fcEZvY3VzV2lkZ2V0ID0gTlVMTDsNCiAgICAgbV9wT2xkRm9jdXNXaWRnZXQgPSBOVUxMOw0KKyAgfQ0KIH0NCi1GWF9CT09MIENYRkFfRkZEb2NWaWV3OjpTZXRGb2N1cyhJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIENYRkFfRkZXaWRnZXQqIHBOZXdGb2N1cyA9IChDWEZBX0ZGV2lkZ2V0KiloV2lkZ2V0Ow0KLSAgICBpZiAobV9wT2xkRm9jdXNXaWRnZXQgPT0gcE5ld0ZvY3VzKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ1hGQV9GRldpZGdldCogcE9sZEZvY3VzID0gbV9wT2xkRm9jdXNXaWRnZXQ7DQotICAgIG1fcE9sZEZvY3VzV2lkZ2V0ID0gcE5ld0ZvY3VzOw0KLSAgICBpZiAocE9sZEZvY3VzKSB7DQotICAgICAgICBpZiAobV9wRm9jdXNXaWRnZXQgIT0gbV9wT2xkRm9jdXNXaWRnZXQgJiYgKHBPbGRGb2N1cy0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQpKSB7DQotICAgICAgICAgICAgbV9wRm9jdXNXaWRnZXQgPSBwT2xkRm9jdXM7DQotICAgICAgICAgICAgcE9sZEZvY3VzLT5PbktpbGxGb2N1cyhwTmV3Rm9jdXMpOw0KLSAgICAgICAgfSBlbHNlIGlmICgocE9sZEZvY3VzLT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCi0gICAgICAgICAgICBpZiAoIXBPbGRGb2N1cy0+SXNMb2FkZWQoKSkgew0KLSAgICAgICAgICAgICAgICBwT2xkRm9jdXMtPkxvYWRXaWRnZXQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcE9sZEZvY3VzLT5PblNldEZvY3VzKG1fcEZvY3VzV2lkZ2V0KTsNCi0gICAgICAgICAgICBtX3BGb2N1c1dpZGdldCA9IHBPbGRGb2N1czsNCi0gICAgICAgICAgICBwT2xkRm9jdXMtPk9uS2lsbEZvY3VzKHBOZXdGb2N1cyk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKG1fcEZvY3VzV2lkZ2V0ID09IG1fcE9sZEZvY3VzV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcE5ld0ZvY3VzID0gbV9wT2xkRm9jdXNXaWRnZXQ7DQotICAgIGlmIChtX3BMaXN0Rm9jdXNXaWRnZXQgJiYgcE5ld0ZvY3VzID09IG1fcExpc3RGb2N1c1dpZGdldCkgew0KLSAgICAgICAgbV9wRm9jdXNBY2MgPSBOVUxMOw0KLSAgICAgICAgbV9wRm9jdXNXaWRnZXQgPSBOVUxMOw0KLSAgICAgICAgbV9wTGlzdEZvY3VzV2lkZ2V0ID0gTlVMTDsNCi0gICAgICAgIG1fcE9sZEZvY3VzV2lkZ2V0ID0gTlVMTDsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAocE5ld0ZvY3VzICYmIChwTmV3Rm9jdXMtPkdldFN0YXR1cygpICYgWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlKSkgew0KLSAgICAgICAgaWYgKCFwTmV3Rm9jdXMtPklzTG9hZGVkKCkpIHsNCi0gICAgICAgICAgICBwTmV3Rm9jdXMtPkxvYWRXaWRnZXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBOZXdGb2N1cy0+T25TZXRGb2N1cyhtX3BGb2N1c1dpZGdldCk7DQotICAgIH0NCi0gICAgbV9wRm9jdXNBY2MgPSBwTmV3Rm9jdXMgPyBwTmV3Rm9jdXMtPkdldERhdGFBY2MoKSA6IE5VTEw7DQotICAgIG1fcEZvY3VzV2lkZ2V0ID0gcE5ld0ZvY3VzOw0KLSAgICBtX3BPbGRGb2N1c1dpZGdldCA9IG1fcEZvY3VzV2lkZ2V0Ow0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotQ1hGQV9XaWRnZXRBY2MqIENYRkFfRkZEb2NWaWV3OjpHZXRGb2N1c1dpZGdldEFjYygpDQotew0KLSAgICByZXR1cm4gbV9wRm9jdXNBY2M7DQotfQ0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlNldEZvY3VzV2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKQ0KLXsNCi0gICAgQ1hGQV9GRldpZGdldCogcE5ld0ZvY3VzID0gcFdpZGdldEFjYyA/IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQoTlVMTCkgOiBOVUxMOw0KLSAgICBpZiAoU2V0Rm9jdXMocE5ld0ZvY3VzKSkgew0KLSAgICAgICAgbV9wRm9jdXNBY2MgPSBwV2lkZ2V0QWNjOw0KLSAgICAgICAgaWYgKG1faVN0YXR1cyA+PSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kKSB7DQotICAgICAgICAgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5TZXRGb2N1c1dpZGdldChtX3BEb2MsIG1fcEZvY3VzV2lkZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRkZEb2NWaWV3OjpEZWxldGVMYXlvdXRJdGVtKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpDQotew0KLSAgICBpZiAobV9wRm9jdXNBY2MgPT0gcFdpZGdldC0+R2V0RGF0YUFjYygpKSB7DQotICAgICAgICBtX3BGb2N1c0FjYyA9IE5VTEw7DQotICAgICAgICBtX3BGb2N1c1dpZGdldCA9IE5VTEw7DQotICAgICAgICBtX3BPbGRGb2N1c1dpZGdldCA9IE5VTEw7DQotICAgIH0NCi19DQotc3RhdGljIGludDMyX3QgWEZBX1Byb2Nlc3NFdmVudChDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLCBDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSkNCi17DQotICAgIGlmICghcFBhcmFtIHx8IHBQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfVW5rbm93bikgew0KK3N0YXRpYyBpbnQzMl90IFhGQV9Qcm9jZXNzRXZlbnQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSkgew0KKyAgaWYgKCFwUGFyYW0gfHwgcFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Vbmtub3duKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIGlmICghcFdpZGdldEFjYyB8fCBwV2lkZ2V0QWNjLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICB9DQorICBzd2l0Y2ggKHBQYXJhbS0+bV9lVHlwZSkgew0KKyAgICBjYXNlIFhGQV9FVkVOVF9DYWxjdWxhdGU6DQorICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPlByb2Nlc3NDYWxjdWxhdGUoKTsNCisgICAgY2FzZSBYRkFfRVZFTlRfVmFsaWRhdGU6DQorICAgICAgaWYgKCgoQ1hGQV9GRkRvYyopcERvY1ZpZXctPkdldERvYygpKQ0KKyAgICAgICAgICAgICAgLT5HZXREb2NQcm92aWRlcigpDQorICAgICAgICAgICAgICAtPklzVmFsaWRhdGlvbnNFbmFibGVkKHBEb2NWaWV3LT5HZXREb2MoKSkpIHsNCisgICAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5Qcm9jZXNzVmFsaWRhdGUoMHgwMSk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsNCisgICAgY2FzZSBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZTogew0KKyAgICAgIENYRkFfQ2FsY3VsYXRlIGNhbGMgPSBwV2lkZ2V0QWNjLT5HZXRDYWxjdWxhdGUoKTsNCisgICAgICBpZiAoIWNhbGMpIHsNCiAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgICB9DQorICAgICAgaWYgKHBXaWRnZXRBY2MtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlKSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Rpc2FibGVkOw0KKyAgICAgIH0NCisgICAgICBDWEZBX1NjcmlwdCBzY3JpcHQgPSBjYWxjLkdldFNjcmlwdCgpOw0KKyAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5FeGVjdXRlU2NyaXB0KHNjcmlwdCwgcFBhcmFtKTsNCiAgICAgfQ0KLSAgICBpZiAoIXBXaWRnZXRBY2MgfHwgcFdpZGdldEFjYy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RyYXcpIHsNCi0gICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKHBQYXJhbS0+bV9lVHlwZSkgew0KLSAgICAgICAgY2FzZSBYRkFfRVZFTlRfQ2FsY3VsYXRlOg0KLSAgICAgICAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5Qcm9jZXNzQ2FsY3VsYXRlKCk7DQotICAgICAgICBjYXNlIFhGQV9FVkVOVF9WYWxpZGF0ZToNCi0gICAgICAgICAgICBpZiAoKChDWEZBX0ZGRG9jKilwRG9jVmlldy0+R2V0RG9jKCkpLT5HZXREb2NQcm92aWRlcigpLT5Jc1ZhbGlkYXRpb25zRW5hYmxlZChwRG9jVmlldy0+R2V0RG9jKCkpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5Qcm9jZXNzVmFsaWRhdGUoMHgwMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsNCi0gICAgICAgIGNhc2UgWEZBX0VWRU5UX0luaXRDYWxjdWxhdGU6IHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9DYWxjdWxhdGUgY2FsYyA9IHBXaWRnZXRBY2MtPkdldENhbGN1bGF0ZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoIWNhbGMpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAocFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ1hGQV9TY3JpcHQgc2NyaXB0ID0gY2FsYy5HZXRTY3JpcHQoKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPkV4ZWN1dGVTY3JpcHQoc2NyaXB0LCBwUGFyYW0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgaW50MzJfdCBpUmV0ID0gcFdpZGdldEFjYy0+UHJvY2Vzc0V2ZW50KGdzX0V2ZW50QWN0aXZpdHlbcFBhcmFtLT5tX2VUeXBlXSwgcFBhcmFtKTsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIGludDMyX3QgaVJldCA9DQorICAgICAgcFdpZGdldEFjYy0+UHJvY2Vzc0V2ZW50KGdzX0V2ZW50QWN0aXZpdHlbcFBhcmFtLT5tX2VUeXBlXSwgcFBhcmFtKTsNCisgIHJldHVybiBpUmV0Ow0KK30NCitpbnQzMl90IENYRkFfRkZEb2NWaWV3OjpFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNGb3JtUmVhZHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWN1cnNpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBFeGNsdWRlKSB7DQorICBpbnQzMl90IGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIGlmIChwRm9ybU5vZGUgPT0gcEV4Y2x1ZGUpIHsNCiAgICAgcmV0dXJuIGlSZXQ7DQotfQ0KLWludDMyX3QgQ1hGQV9GRkRvY1ZpZXc6OkV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwgRlhfQk9PTCBiSXNGb3JtUmVhZHksIEZYX0JPT0wgYlJlY3Vyc2l2ZSwgQ1hGQV9Ob2RlKiBwRXhjbHVkZSkNCi17DQotICAgIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KLSAgICBpZiAocEZvcm1Ob2RlID09IHBFeGNsdWRlKSB7DQotICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgfQ0KLSAgICBYRkFfRUxFTUVOVCBlbGVtZW50VHlwZSA9IHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCi0gICAgICAgIGlmIChlRXZlbnRUeXBlID09IFhGQV9FVkVOVF9JbmRleENoYW5nZSkgew0KLSAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBGb3JtTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KLSAgICAgICAgaWYgKHBXaWRnZXRBY2MgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCi0gICAgICAgIGVQYXJhbS5tX2VUeXBlID0gZUV2ZW50VHlwZTsNCi0gICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBwV2lkZ2V0QWNjOw0KLSAgICAgICAgZVBhcmFtLm1fYklzRm9ybVJlYWR5ID0gYklzRm9ybVJlYWR5Ow0KLSAgICAgICAgcmV0dXJuIFhGQV9Qcm9jZXNzRXZlbnQodGhpcywgcFdpZGdldEFjYywgJmVQYXJhbSk7DQotICAgIH0NCi0gICAgaWYgKGJSZWN1cnNpdmUpIHsNCi0gICAgICAgIGZvcihDWEZBX05vZGUqIHBOb2RlID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpKSB7DQotICAgICAgICAgICAgZWxlbWVudFR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMgJiYgZWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfRHJhdykgew0KLSAgICAgICAgICAgICAgICBpUmV0IHw9IEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIGVFdmVudFR5cGUsIGJJc0Zvcm1SZWFkeSwgYlJlY3Vyc2l2ZSwgcEV4Y2x1ZGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgIH0NCisgIFhGQV9FTEVNRU5UIGVsZW1lbnRUeXBlID0gcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoZWxlbWVudFR5cGUgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgaWYgKGVFdmVudFR5cGUgPT0gWEZBX0VWRU5UX0luZGV4Q2hhbmdlKSB7DQorICAgICAgcmV0dXJuIGlSZXQ7DQogICAgIH0NCiAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBGb3JtTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KICAgICBpZiAocFdpZGdldEFjYyA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gaVJldDsNCisgICAgICByZXR1cm4gaVJldDsNCiAgICAgfQ0KICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KICAgICBlUGFyYW0ubV9lVHlwZSA9IGVFdmVudFR5cGU7DQogICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBwV2lkZ2V0QWNjOw0KICAgICBlUGFyYW0ubV9iSXNGb3JtUmVhZHkgPSBiSXNGb3JtUmVhZHk7DQotICAgIGlSZXQgfD0gWEZBX1Byb2Nlc3NFdmVudCh0aGlzLCBwV2lkZ2V0QWNjLCAmZVBhcmFtKTsNCisgICAgcmV0dXJuIFhGQV9Qcm9jZXNzRXZlbnQodGhpcywgcFdpZGdldEFjYywgJmVQYXJhbSk7DQorICB9DQorICBpZiAoYlJlY3Vyc2l2ZSkgew0KKyAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICBYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgICAgICAgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkpIHsNCisgICAgICBlbGVtZW50VHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgICAgaWYgKGVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcyAmJg0KKyAgICAgICAgICBlbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgICAgICBpUmV0IHw9IEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIGVFdmVudFR5cGUsIGJJc0Zvcm1SZWFkeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVjdXJzaXZlLCBwRXhjbHVkZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IChDWEZBX1dpZGdldEFjYyopcEZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICBpZiAocFdpZGdldEFjYyA9PSBOVUxMKSB7DQogICAgIHJldHVybiBpUmV0Ow0KKyAgfQ0KKyAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgIGVQYXJhbS5tX2VUeXBlID0gZUV2ZW50VHlwZTsNCisgIGVQYXJhbS5tX3BUYXJnZXQgPSBwV2lkZ2V0QWNjOw0KKyAgZVBhcmFtLm1fYklzRm9ybVJlYWR5ID0gYklzRm9ybVJlYWR5Ow0KKyAgaVJldCB8PSBYRkFfUHJvY2Vzc0V2ZW50KHRoaXMsIHBXaWRnZXRBY2MsICZlUGFyYW0pOw0KKyAgcmV0dXJuIGlSZXQ7DQogfQ0KLUNYRkFfRkZXaWRnZXQqIENYRkFfRkZEb2NWaWV3OjpHZXRXaWRnZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQgKQ0KLXsNCi0gICAgQ1hGQV9XaWRnZXRBY2MqIHBSZWZBY2MgPSBwUmVmV2lkZ2V0ID8gcFJlZldpZGdldC0+R2V0RGF0YUFjYygpIDogTlVMTDsNCi0gICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gR2V0V2lkZ2V0QWNjQnlOYW1lKHdzTmFtZSwgcFJlZkFjYykpIHsNCi0gICAgICAgIHJldHVybiBwQWNjLT5HZXROZXh0V2lkZ2V0KE5VTEwpOw0KLSAgICB9DQorQ1hGQV9GRldpZGdldCogQ1hGQV9GRkRvY1ZpZXc6OkdldFdpZGdldEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQpIHsNCisgIENYRkFfV2lkZ2V0QWNjKiBwUmVmQWNjID0gcFJlZldpZGdldCA/IHBSZWZXaWRnZXQtPkdldERhdGFBY2MoKSA6IE5VTEw7DQorICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBHZXRXaWRnZXRBY2NCeU5hbWUod3NOYW1lLCBwUmVmQWNjKSkgew0KKyAgICByZXR1cm4gcEFjYy0+R2V0TmV4dFdpZGdldChOVUxMKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9GRkRvY1ZpZXc6OkdldFdpZGdldEFjY0J5TmFtZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgIENYRkFfV2lkZ2V0QWNjKiBwUmVmV2lkZ2V0QWNjKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICBGWF9EV09SRCBkd1N0eWxlID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfA0KKyAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQ7DQorICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KICAgICByZXR1cm4gTlVMTDsNCi19DQotQ1hGQV9XaWRnZXRBY2MqIENYRkFfRkZEb2NWaWV3OjpHZXRXaWRnZXRBY2NCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsIENYRkFfV2lkZ2V0QWNjKiBwUmVmV2lkZ2V0QWNjICkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCi0gICAgRlhfRFdPUkQgZHdTdHlsZSA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudDsNCi0gICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvYy0+R2V0WEZBRG9jKCktPkdldFNjcmlwdENvbnRleHQoKTsNCi0gICAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiByZWZOb2RlID0gTlVMTDsNCi0gICAgaWYocFJlZldpZGdldEFjYyAhPSBOVUxMKSB7DQotICAgICAgICByZWZOb2RlID0gcFJlZldpZGdldEFjYy0+R2V0Tm9kZSgpOw0KLSAgICAgICAgd3NFeHByZXNzaW9uID0gd3NOYW1lOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgd3NFeHByZXNzaW9uID0gTCIkZm9ybS4iICsgd3NOYW1lOw0KLSAgICB9DQotICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQotICAgIGludDMyX3QgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhyZWZOb2RlLCB3c0V4cHJlc3Npb24sIHJlc292ZU5vZGVSUywgZHdTdHlsZSk7DQotICAgIGlmIChpUmV0IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaWYgKHJlc292ZU5vZGVSUy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2Rlcykgew0KLSAgICAgICAgQ1hGQV9PYmplY3QqIHBOb2RlID0gcmVzb3ZlTm9kZVJTLm5vZGVzWzBdOw0KLSAgICAgICAgaWYocE5vZGUtPklzTm9kZSgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIChDWEZBX1dpZGdldEFjYyopKChDWEZBX05vZGUqKXBOb2RlKS0+R2V0V2lkZ2V0RGF0YSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICB9DQorICBDWEZBX05vZGUqIHJlZk5vZGUgPSBOVUxMOw0KKyAgaWYgKHBSZWZXaWRnZXRBY2MgIT0gTlVMTCkgew0KKyAgICByZWZOb2RlID0gcFJlZldpZGdldEFjYy0+R2V0Tm9kZSgpOw0KKyAgICB3c0V4cHJlc3Npb24gPSB3c05hbWU7DQorICB9IGVsc2Ugew0KKyAgICB3c0V4cHJlc3Npb24gPSBMIiRmb3JtLiIgKyB3c05hbWU7DQorICB9DQorICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgaW50MzJfdCBpUmV0ID0gcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHJlZk5vZGUsIHdzRXhwcmVzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdmVOb2RlUlMsIGR3U3R5bGUpOw0KKyAgaWYgKGlSZXQgPCAxKSB7DQogICAgIHJldHVybiBOVUxMOw0KLX0NCi12b2lkIENYRkFfRkZEb2NWaWV3OjpPblBhZ2VFdmVudChJWEZBX0xheW91dFBhZ2UgKnBTZW5kZXIsIFhGQV9QQUdFRVZFTlQgZUV2ZW50LCBpbnQzMl90IGlQYWdlSW5kZXgpDQotew0KLSAgICBGWF9CT09MIGJOb2ZpZnkgPSBtX2lTdGF0dXMgPj0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZDsNCi0gICAgaWYgKGVFdmVudCA9PSBYRkFfUEFHRUVWRU5UX1BhZ2VSZW1vdmVkKSB7DQotICAgICAgICBpZiAoYk5vZmlmeSkgew0KLSAgICAgICAgICAgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+UGFnZVZpZXdFdmVudCgoQ1hGQV9GRlBhZ2VWaWV3KilwU2VuZGVyLCBYRkFfUEFHRVZJRVdFVkVOVF9Qb3N0UmVtb3ZlZCk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZiAoZUV2ZW50ID09IFhGQV9QQUdFRVZFTlRfUGFnZUFkZGVkKSB7DQotICAgICAgICBpZiAoYk5vZmlmeSkgew0KLSAgICAgICAgICAgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+UGFnZVZpZXdFdmVudCgoQ1hGQV9GRlBhZ2VWaWV3KilwU2VuZGVyLCBYRkFfUEFHRVZJRVdFVkVOVF9Qb3N0QWRkZWQpOw0KLSAgICAgICAgICAgICgoQ1hGQV9GRlBhZ2VWaWV3KilwU2VuZGVyKS0+TG9hZFBhZ2VWaWV3KCk7DQotICAgICAgICB9DQorICB9DQorICBpZiAocmVzb3ZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7DQorICAgIENYRkFfT2JqZWN0KiBwTm9kZSA9IHJlc292ZU5vZGVSUy5ub2Rlc1swXTsNCisgICAgaWYgKHBOb2RlLT5Jc05vZGUoKSkgew0KKyAgICAgIHJldHVybiAoQ1hGQV9XaWRnZXRBY2MqKSgoQ1hGQV9Ob2RlKilwTm9kZSktPkdldFdpZGdldERhdGEoKTsNCiAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkxvY2tVcGRhdGUoKQ0KLXsNCi0gICAgbV9pTG9jaysrOw0KLX0NCi12b2lkIENYRkFfRkZEb2NWaWV3OjpVbmxvY2tVcGRhdGUoKQ0KLXsNCi0gICAgbV9pTG9jay0tOw0KLX0NCi1GWF9CT09MIENYRkFfRkZEb2NWaWV3OjpJc1VwZGF0ZUxvY2tlZCgpDQotew0KLSAgICByZXR1cm4gbV9pTG9jazsNCi19DQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6Q2xlYXJJbnZhbGlkYXRlTGlzdCgpDQotew0KLSAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwUGFnZUludmFsaWRhdGUuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHMpIHsNCi0gICAgICAgIHZvaWQqIHBQYWdlVmlldyA9IE5VTEw7DQotICAgICAgICBDRlhfUmVjdEYqIHBSZWN0ID0gTlVMTDsNCi0gICAgICAgIG1fbWFwUGFnZUludmFsaWRhdGUuR2V0TmV4dEFzc29jKHBzLCBwUGFnZVZpZXcsICh2b2lkKiYpcFJlY3QpOw0KLSAgICAgICAgZGVsZXRlIHBSZWN0Ow0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6Ok9uUGFnZUV2ZW50KElYRkFfTGF5b3V0UGFnZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUEFHRUVWRU5UIGVFdmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYWdlSW5kZXgpIHsNCisgIEZYX0JPT0wgYk5vZmlmeSA9IG1faVN0YXR1cyA+PSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kOw0KKyAgaWYgKGVFdmVudCA9PSBYRkFfUEFHRUVWRU5UX1BhZ2VSZW1vdmVkKSB7DQorICAgIGlmIChiTm9maWZ5KSB7DQorICAgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5QYWdlVmlld0V2ZW50KChDWEZBX0ZGUGFnZVZpZXcqKXBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QQUdFVklFV0VWRU5UX1Bvc3RSZW1vdmVkKTsNCiAgICAgfQ0KLSAgICBtX21hcFBhZ2VJbnZhbGlkYXRlLlJlbW92ZUFsbCgpOw0KLX0NCi12b2lkIENYRkFfRkZEb2NWaWV3OjpBZGRJbnZhbGlkYXRlUmVjdChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0LCBjb25zdCBDRlhfUmVjdEYgJnJ0SW52YWxpZGF0ZSkNCi17DQotICAgIEFkZEludmFsaWRhdGVSZWN0KHBXaWRnZXQtPkdldFBhZ2VWaWV3KCksIHJ0SW52YWxpZGF0ZSk7DQotfQ0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZEludmFsaWRhdGVSZWN0KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ0ZYX1JlY3RGICZydEludmFsaWRhdGUpDQotew0KLSAgICBDRlhfUmVjdEYqIHBSZWN0ID0gKENGWF9SZWN0RiopbV9tYXBQYWdlSW52YWxpZGF0ZS5HZXRWYWx1ZUF0KHBQYWdlVmlldyk7DQotICAgIGlmICghcFJlY3QpIHsNCi0gICAgICAgIHBSZWN0ID0gRlhfTkVXIENGWF9SZWN0RjsNCi0gICAgICAgIHBSZWN0LT5TZXQocnRJbnZhbGlkYXRlLmxlZnQsIHJ0SW52YWxpZGF0ZS50b3AsIHJ0SW52YWxpZGF0ZS53aWR0aCwgcnRJbnZhbGlkYXRlLmhlaWdodCk7DQotICAgICAgICBtX21hcFBhZ2VJbnZhbGlkYXRlLlNldEF0KHBQYWdlVmlldywgcFJlY3QpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcFJlY3QtPlVuaW9uKHJ0SW52YWxpZGF0ZSk7DQorICB9IGVsc2UgaWYgKGVFdmVudCA9PSBYRkFfUEFHRUVWRU5UX1BhZ2VBZGRlZCkgew0KKyAgICBpZiAoYk5vZmlmeSkgew0KKyAgICAgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+UGFnZVZpZXdFdmVudCgoQ1hGQV9GRlBhZ2VWaWV3KilwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUEFHRVZJRVdFVkVOVF9Qb3N0QWRkZWQpOw0KKyAgICAgICgoQ1hGQV9GRlBhZ2VWaWV3KilwU2VuZGVyKS0+TG9hZFBhZ2VWaWV3KCk7DQogICAgIH0NCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6UnVuSW52YWxpZGF0ZSgpDQotew0KLSAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwUGFnZUludmFsaWRhdGUuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHMpIHsNCi0gICAgICAgIElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyA9IE5VTEw7DQotICAgICAgICBDRlhfUmVjdEYqIHBSZWN0ID0gTlVMTDsNCi0gICAgICAgIG1fbWFwUGFnZUludmFsaWRhdGUuR2V0TmV4dEFzc29jKHBzLCAodm9pZComKXBQYWdlVmlldywgKHZvaWQqJilwUmVjdCk7DQotICAgICAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPkludmFsaWRhdGVSZWN0KHBQYWdlVmlldywgKnBSZWN0KTsNCi0gICAgICAgIGRlbGV0ZSBwUmVjdDsNCi0gICAgfQ0KLSAgICBtX21hcFBhZ2VJbnZhbGlkYXRlLlJlbW92ZUFsbCgpOw0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkxvY2tVcGRhdGUoKSB7DQorICBtX2lMb2NrKys7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkxheW91dCgpDQotew0KLSAgICBMb2NrVXBkYXRlKCk7DQotICAgIG1fYkluTGF5b3V0U3RhdHVzID0gVFJVRTsNCi0gICAgaWYgKCFtX3BYRkFEb2NMYXlvdXQtPkluY3JlbWVudExheW91dCgpICYmIG1fcFhGQURvY0xheW91dC0+U3RhcnRMYXlvdXQoKSA8IDEwMCkgew0KLSAgICAgICAgbV9wWEZBRG9jTGF5b3V0LT5Eb0xheW91dCgpOw0KLSAgICAgICAgVW5sb2NrVXBkYXRlKCk7DQotICAgICAgICBtX2JJbkxheW91dFN0YXR1cyA9IEZBTFNFOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgbV9iSW5MYXlvdXRTdGF0dXMgPSBGQUxTRTsNCit2b2lkIENYRkFfRkZEb2NWaWV3OjpVbmxvY2tVcGRhdGUoKSB7DQorICBtX2lMb2NrLS07DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OklzVXBkYXRlTG9ja2VkKCkgew0KKyAgcmV0dXJuIG1faUxvY2s7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkNsZWFySW52YWxpZGF0ZUxpc3QoKSB7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwUGFnZUludmFsaWRhdGUuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIHZvaWQqIHBQYWdlVmlldyA9IE5VTEw7DQorICAgIENGWF9SZWN0RiogcFJlY3QgPSBOVUxMOw0KKyAgICBtX21hcFBhZ2VJbnZhbGlkYXRlLkdldE5leHRBc3NvYyhwcywgcFBhZ2VWaWV3LCAodm9pZComKXBSZWN0KTsNCisgICAgZGVsZXRlIHBSZWN0Ow0KKyAgfQ0KKyAgbV9tYXBQYWdlSW52YWxpZGF0ZS5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6QWRkSW52YWxpZGF0ZVJlY3QoQ1hGQV9GRldpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SW52YWxpZGF0ZSkgew0KKyAgQWRkSW52YWxpZGF0ZVJlY3QocFdpZGdldC0+R2V0UGFnZVZpZXcoKSwgcnRJbnZhbGlkYXRlKTsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6QWRkSW52YWxpZGF0ZVJlY3QoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJbnZhbGlkYXRlKSB7DQorICBDRlhfUmVjdEYqIHBSZWN0ID0gKENGWF9SZWN0RiopbV9tYXBQYWdlSW52YWxpZGF0ZS5HZXRWYWx1ZUF0KHBQYWdlVmlldyk7DQorICBpZiAoIXBSZWN0KSB7DQorICAgIHBSZWN0ID0gRlhfTkVXIENGWF9SZWN0RjsNCisgICAgcFJlY3QtPlNldChydEludmFsaWRhdGUubGVmdCwgcnRJbnZhbGlkYXRlLnRvcCwgcnRJbnZhbGlkYXRlLndpZHRoLA0KKyAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZS5oZWlnaHQpOw0KKyAgICBtX21hcFBhZ2VJbnZhbGlkYXRlLlNldEF0KHBQYWdlVmlldywgcFJlY3QpOw0KKyAgfSBlbHNlIHsNCisgICAgcFJlY3QtPlVuaW9uKHJ0SW52YWxpZGF0ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkludmFsaWRhdGUoKSB7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwUGFnZUludmFsaWRhdGUuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyA9IE5VTEw7DQorICAgIENGWF9SZWN0RiogcFJlY3QgPSBOVUxMOw0KKyAgICBtX21hcFBhZ2VJbnZhbGlkYXRlLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwUGFnZVZpZXcsICh2b2lkKiYpcFJlY3QpOw0KKyAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPkludmFsaWRhdGVSZWN0KHBQYWdlVmlldywgKnBSZWN0KTsNCisgICAgZGVsZXRlIHBSZWN0Ow0KKyAgfQ0KKyAgbV9tYXBQYWdlSW52YWxpZGF0ZS5SZW1vdmVBbGwoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6UnVuTGF5b3V0KCkgew0KKyAgTG9ja1VwZGF0ZSgpOw0KKyAgbV9iSW5MYXlvdXRTdGF0dXMgPSBUUlVFOw0KKyAgaWYgKCFtX3BYRkFEb2NMYXlvdXQtPkluY3JlbWVudExheW91dCgpICYmDQorICAgICAgbV9wWEZBRG9jTGF5b3V0LT5TdGFydExheW91dCgpIDwgMTAwKSB7DQorICAgIG1fcFhGQURvY0xheW91dC0+RG9MYXlvdXQoKTsNCiAgICAgVW5sb2NrVXBkYXRlKCk7DQotICAgIHJldHVybiBGQUxTRTsNCisgICAgbV9iSW5MYXlvdXRTdGF0dXMgPSBGQUxTRTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBtX2JJbkxheW91dFN0YXR1cyA9IEZBTFNFOw0KKyAgVW5sb2NrVXBkYXRlKCk7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1blN1YmZvcm1JbmRleENoYW5nZSgpDQotew0KLSAgICBpbnQzMl90IGlTdWJmb3JtcyA9IG1fSW5kZXhDaGFuZ2VkU3ViZm9ybXMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU3ViZm9ybXM7IGkrKykgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybU5vZGUgPSAoQ1hGQV9Ob2RlKiltX0luZGV4Q2hhbmdlZFN1YmZvcm1zW2ldOw0KLSAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBTdWJmb3JtTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KLSAgICAgICAgaWYgKCFwV2lkZ2V0QWNjKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KLSAgICAgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfSW5kZXhDaGFuZ2U7DQotICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gcFdpZGdldEFjYzsNCi0gICAgICAgIHBXaWRnZXRBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9JbmRleENoYW5nZSwgJmVQYXJhbSk7DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6UnVuU3ViZm9ybUluZGV4Q2hhbmdlKCkgew0KKyAgaW50MzJfdCBpU3ViZm9ybXMgPSBtX0luZGV4Q2hhbmdlZFN1YmZvcm1zLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTdWJmb3JtczsgaSsrKSB7DQorICAgIENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlID0gKENYRkFfTm9kZSopbV9JbmRleENoYW5nZWRTdWJmb3Jtc1tpXTsNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBTdWJmb3JtTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXRBY2MpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBtX0luZGV4Q2hhbmdlZFN1YmZvcm1zLlJlbW92ZUFsbCgpOw0KKyAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9JbmRleENoYW5nZTsNCisgICAgZVBhcmFtLm1fcFRhcmdldCA9IHBXaWRnZXRBY2M7DQorICAgIHBXaWRnZXRBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9JbmRleENoYW5nZSwgJmVQYXJhbSk7DQorICB9DQorICBtX0luZGV4Q2hhbmdlZFN1YmZvcm1zLlJlbW92ZUFsbCgpOw0KIH0NCi12b2lkIENYRkFfRkZEb2NWaWV3OjpBZGROZXdGb3JtTm9kZShDWEZBX05vZGUqIHBOb2RlKQ0KLXsNCi0gICAgbV9OZXdBZGRlZE5vZGVzLkFkZChwTm9kZSk7DQotICAgIHRoaXMtPkluaXRMYXlvdXQocE5vZGUpOw0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZE5ld0Zvcm1Ob2RlKENYRkFfTm9kZSogcE5vZGUpIHsNCisgIG1fTmV3QWRkZWROb2Rlcy5BZGQocE5vZGUpOw0KKyAgdGhpcy0+SW5pdExheW91dChwTm9kZSk7DQogfQ0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZEluZGV4Q2hhbmdlZFN1YmZvcm0oQ1hGQV9Ob2RlKiBwTm9kZSkNCi17DQotICAgIEZYU1lTX2Fzc2VydChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gKTsNCi0gICAgbV9JbmRleENoYW5nZWRTdWJmb3Jtcy5BZGQocE5vZGUpOw0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZEluZGV4Q2hhbmdlZFN1YmZvcm0oQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICBtX0luZGV4Q2hhbmdlZFN1YmZvcm1zLkFkZChwTm9kZSk7DQogfQ0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkRvY0Nsb3NlKCkNCi17DQotICAgIENYRkFfTm9kZSogcFJvb3RJdGVtID0gKENYRkFfTm9kZSopbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQotICAgIGlmICghcFJvb3RJdGVtKSB7DQotICAgICAgICByZXR1cm47DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6UnVuRG9jQ2xvc2UoKSB7DQorICBDWEZBX05vZGUqIHBSb290SXRlbSA9DQorICAgICAgKENYRkFfTm9kZSopbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQorICBpZiAoIXBSb290SXRlbSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBSb290SXRlbSwgWEZBX0VWRU5UX0RvY0Nsb3NlKTsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6RGVzdHJveURvY1ZpZXcoKSB7DQorICBDbGVhckludmFsaWRhdGVMaXN0KCk7DQorICBtX2lTdGF0dXMgPSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfTm9uZTsNCisgIG1faUxvY2sgPSAwOw0KKyAgbV9WYWxpZGF0ZUFjY3MuUmVtb3ZlQWxsKCk7DQorICBtX2JpbmRJdGVtcy5SZW1vdmVBbGwoKTsNCisgIG1fQ2FsY3VsYXRlQWNjcy5SZW1vdmVBbGwoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6SXNTdGF0aWNOb3RpZnkoKSB7DQorICByZXR1cm4gbV9wRG9jLT5HZXREb2NUeXBlKCkgPT0gWEZBX0RPQ1RZUEVfU3RhdGljOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpBZGRDYWxjdWxhdGVXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpIHsNCisgIGludDMyX3QgaUFjY3MgPSBtX0NhbGN1bGF0ZUFjY3MuR2V0U2l6ZSgpOw0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBDdXJyZW50QWNjID0NCisgICAgICAoaUFjY3MgPCAxKSA/IChDWEZBX1dpZGdldEFjYyopTlVMTA0KKyAgICAgICAgICAgICAgICAgIDogKENYRkFfV2lkZ2V0QWNjKiltX0NhbGN1bGF0ZUFjY3NbaUFjY3MgLSAxXTsNCisgIGlmIChwQ3VycmVudEFjYyAhPSBwV2lkZ2V0QWNjKSB7DQorICAgIG1fQ2FsY3VsYXRlQWNjcy5BZGQocFdpZGdldEFjYyk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZENhbGN1bGF0ZU5vZGVOb3RpZnkoQ1hGQV9Ob2RlKiBwTm9kZUNoYW5nZSkgew0KKyAgQ1hGQV9DYWxjRGF0YSogcEdsb2JhbERhdGEgPQ0KKyAgICAgIChDWEZBX0NhbGNEYXRhKilwTm9kZUNoYW5nZS0+R2V0VXNlckRhdGEoWEZBX0NhbGNEYXRhKTsNCisgIGludDMyX3QgaUNvdW50ID0gcEdsb2JhbERhdGEgPyBwR2xvYmFsRGF0YS0+bV9HbG9iYWxzLkdldFNpemUoKSA6IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDWEZBX1dpZGdldEFjYyogcFJlc3VsdEFjYyA9IChDWEZBX1dpZGdldEFjYyopcEdsb2JhbERhdGEtPm1fR2xvYmFsc1tpXTsNCisgICAgaWYgKHBSZXN1bHRBY2MtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZCkpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBSb290SXRlbSwgWEZBX0VWRU5UX0RvY0Nsb3NlKTsNCi19DQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6RGVzdHJveURvY1ZpZXcoKQ0KLXsNCi0gICAgQ2xlYXJJbnZhbGlkYXRlTGlzdCgpOw0KLSAgICBtX2lTdGF0dXMgPSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfTm9uZTsNCi0gICAgbV9pTG9jayA9IDA7DQotICAgIG1fVmFsaWRhdGVBY2NzLlJlbW92ZUFsbCgpOw0KLSAgICBtX2JpbmRJdGVtcy5SZW1vdmVBbGwoKTsNCi0gICAgbV9DYWxjdWxhdGVBY2NzLlJlbW92ZUFsbCgpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZEb2NWaWV3OjpJc1N0YXRpY05vdGlmeSgpDQotew0KLSAgICByZXR1cm4gIG1fcERvYy0+R2V0RG9jVHlwZSgpID09IFhGQV9ET0NUWVBFX1N0YXRpYzsNCi19DQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKQ0KLXsNCiAgICAgaW50MzJfdCBpQWNjcyA9IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCk7DQotICAgIENYRkFfV2lkZ2V0QWNjKiBwQ3VycmVudEFjYyA9IChpQWNjcyA8IDEpID8gKENYRkFfV2lkZ2V0QWNjKilOVUxMIDogKENYRkFfV2lkZ2V0QWNjKiltX0NhbGN1bGF0ZUFjY3NbaUFjY3MgLSAxXTsNCi0gICAgaWYgKHBDdXJyZW50QWNjICE9IHBXaWRnZXRBY2MpIHsNCi0gICAgICAgIG1fQ2FsY3VsYXRlQWNjcy5BZGQocFdpZGdldEFjYyk7DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwQ3VycmVudEFjYyA9DQorICAgICAgICAoaUFjY3MgPCAxKSA/IChDWEZBX1dpZGdldEFjYyopTlVMTA0KKyAgICAgICAgICAgICAgICAgICAgOiAoQ1hGQV9XaWRnZXRBY2MqKW1fQ2FsY3VsYXRlQWNjc1tpQWNjcyAtIDFdOw0KKyAgICBpZiAocEN1cnJlbnRBY2MgIT0gcFJlc3VsdEFjYykgew0KKyAgICAgIG1fQ2FsY3VsYXRlQWNjcy5BZGQocFJlc3VsdEFjYyk7DQogICAgIH0NCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6QWRkQ2FsY3VsYXRlTm9kZU5vdGlmeShDWEZBX05vZGUqIHBOb2RlQ2hhbmdlKQ0KLXsNCi0gICAgQ1hGQV9DYWxjRGF0YSogcEdsb2JhbERhdGEgPSAoQ1hGQV9DYWxjRGF0YSopcE5vZGVDaGFuZ2UtPkdldFVzZXJEYXRhKFhGQV9DYWxjRGF0YSk7DQotICAgIGludDMyX3QgaUNvdW50ID0gcEdsb2JhbERhdGEgPyBwR2xvYmFsRGF0YS0+bV9HbG9iYWxzLkdldFNpemUoKSA6IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8ICBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBSZXN1bHRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBHbG9iYWxEYXRhLT5tX0dsb2JhbHNbaV07DQotICAgICAgICBpZiAocFJlc3VsdEFjYy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19IYXNSZW1vdmVkKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpQWNjcyA9IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCk7DQotICAgICAgICBDWEZBX1dpZGdldEFjYyogcEN1cnJlbnRBY2MgPSAoaUFjY3MgPCAxKSA/IChDWEZBX1dpZGdldEFjYyopTlVMTCA6IChDWEZBX1dpZGdldEFjYyopbV9DYWxjdWxhdGVBY2NzW2lBY2NzIC0gMV07DQotICAgICAgICBpZiAocEN1cnJlbnRBY2MgIT0gcFJlc3VsdEFjYykgew0KLSAgICAgICAgICAgIG1fQ2FsY3VsYXRlQWNjcy5BZGQocFJlc3VsdEFjYyk7DQotICAgICAgICB9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6UnVuQ2FsY3VsYXRlUmVjdXJzaXZlKGludDMyX3QmIGlJbmRleCkgew0KKyAgd2hpbGUgKGlJbmRleCA8IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCkpIHsNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBDdXJBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKW1fQ2FsY3VsYXRlQWNjc1tpSW5kZXhdOw0KKyAgICBBZGRDYWxjdWxhdGVOb2RlTm90aWZ5KHBDdXJBY2MtPkdldE5vZGUoKSk7DQorICAgIGludDMyX3QgaVJlZkNvdW50ID0NCisgICAgICAgIChpbnQzMl90KSh1aW50cHRyX3QpcEN1ckFjYy0+R2V0Tm9kZSgpLT5HZXRVc2VyRGF0YShYRkFfQ2FsY1JlZkNvdW50KTsNCisgICAgaVJlZkNvdW50Kys7DQorICAgIHBDdXJBY2MtPkdldE5vZGUoKS0+U2V0VXNlckRhdGEoWEZBX0NhbGNSZWZDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKHVpbnRwdHJfdClpUmVmQ291bnQpOw0KKyAgICBpZiAoaVJlZkNvdW50ID4gMTEpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KKyAgICBpZiAoKHBDdXJBY2MtPlByb2Nlc3NDYWxjdWxhdGUoKSkgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzKSB7DQorICAgICAgQWRkVmFsaWRhdGVXaWRnZXQocEN1ckFjYyk7DQorICAgIH0NCisgICAgaUluZGV4Kys7DQorICAgIFJ1bkNhbGN1bGF0ZVJlY3Vyc2l2ZShpSW5kZXgpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRkZEb2NWaWV3OjpSdW5DYWxjdWxhdGVSZWN1cnNpdmUoaW50MzJfdCYgaUluZGV4KQ0KLXsNCi0gICAgd2hpbGUgKGlJbmRleCA8IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCkpIHsNCi0gICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwQ3VyQWNjID0gKENYRkFfV2lkZ2V0QWNjKiltX0NhbGN1bGF0ZUFjY3NbaUluZGV4XTsNCi0gICAgICAgIEFkZENhbGN1bGF0ZU5vZGVOb3RpZnkocEN1ckFjYy0+R2V0Tm9kZSgpKTsNCi0gICAgICAgIGludDMyX3QgaVJlZkNvdW50ID0gKGludDMyX3QpKHVpbnRwdHJfdClwQ3VyQWNjLT5HZXROb2RlKCktPkdldFVzZXJEYXRhKFhGQV9DYWxjUmVmQ291bnQpOw0KLSAgICAgICAgaVJlZkNvdW50Kys7DQotICAgICAgICBwQ3VyQWNjLT5HZXROb2RlKCktPlNldFVzZXJEYXRhKFhGQV9DYWxjUmVmQ291bnQsICh2b2lkKikodWludHB0cl90KWlSZWZDb3VudCk7DQotICAgICAgICBpZiAoaVJlZkNvdW50ID4gMTEpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICgocEN1ckFjYy0+UHJvY2Vzc0NhbGN1bGF0ZSgpKSA9PSBYRkFfRVZFTlRFUlJPUl9TdWNlc3MpIHsNCi0gICAgICAgICAgICBBZGRWYWxpZGF0ZVdpZGdldChwQ3VyQWNjKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlJbmRleCsrOw0KLSAgICAgICAgUnVuQ2FsY3VsYXRlUmVjdXJzaXZlKGlJbmRleCk7DQotICAgIH0NCitpbnQzMl90IENYRkFfRkZEb2NWaWV3OjpSdW5DYWxjdWxhdGVXaWRnZXRzKCkgew0KKyAgaWYgKCFtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPklzQ2FsY3VsYXRpb25zRW5hYmxlZChtX3BEb2MpKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsNCisgIH0NCisgIGludDMyX3QgaUNvdW50cyA9IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCk7DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBpZiAoaUNvdW50cyA+IDApIHsNCisgICAgUnVuQ2FsY3VsYXRlUmVjdXJzaXZlKGlJbmRleCk7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX0NhbGN1bGF0ZUFjY3MuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBDdXJBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKW1fQ2FsY3VsYXRlQWNjc1tpXTsNCisgICAgcEN1ckFjYy0+R2V0Tm9kZSgpLT5TZXRVc2VyRGF0YShYRkFfQ2FsY1JlZkNvdW50LCAodm9pZCopKHVpbnRwdHJfdCkwKTsNCisgIH0NCisgIG1fQ2FsY3VsYXRlQWNjcy5SZW1vdmVBbGwoKTsNCisgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQogfQ0KLWludDMyX3QgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkNhbGN1bGF0ZVdpZGdldHMoKQ0KLXsNCi0gICAgaWYgKCFtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPklzQ2FsY3VsYXRpb25zRW5hYmxlZChtX3BEb2MpKSB7DQotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQotICAgIH0NCi0gICAgaW50MzJfdCBpQ291bnRzID0gbV9DYWxjdWxhdGVBY2NzLkdldFNpemUoKTsNCi0gICAgaW50MzJfdCBpSW5kZXggPSAwOw0KLSAgICBpZiAoaUNvdW50cyA+IDApIHsNCi0gICAgICAgIFJ1bkNhbGN1bGF0ZVJlY3Vyc2l2ZShpSW5kZXgpOw0KLSAgICB9DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBDdXJBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKW1fQ2FsY3VsYXRlQWNjc1tpXTsNCi0gICAgICAgIHBDdXJBY2MtPkdldE5vZGUoKS0+U2V0VXNlckRhdGEoWEZBX0NhbGNSZWZDb3VudCwgKHZvaWQqKSh1aW50cHRyX3QpMCk7DQotICAgIH0NCi0gICAgbV9DYWxjdWxhdGVBY2NzLlJlbW92ZUFsbCgpOw0KLSAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZFZhbGlkYXRlV2lkZ2V0KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0KSB7DQorICBpZiAobV9WYWxpZGF0ZUFjY3MuRmluZChwV2lkZ2V0KSA8IDApIHsNCisgICAgbV9WYWxpZGF0ZUFjY3MuQWRkKHBXaWRnZXQpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRkZEb2NWaWV3OjpBZGRWYWxpZGF0ZVdpZGdldChDWEZBX1dpZGdldEFjYyogcFdpZGdldCkNCi17DQotICAgIGlmIChtX1ZhbGlkYXRlQWNjcy5GaW5kKHBXaWRnZXQpIDwgMCkgew0KLSAgICAgICAgbV9WYWxpZGF0ZUFjY3MuQWRkKHBXaWRnZXQpOw0KLSAgICB9DQorRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6SW5pdENhbGN1bGF0ZShDWEZBX05vZGUqIHBOb2RlKSB7DQorICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6SW5pdENhbGN1bGF0ZShDWEZBX05vZGUqIHBOb2RlKQ0KLXsNCi0gICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENYRkFfRkZEb2NWaWV3OjpJbml0VmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgaWYgKCFtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPklzVmFsaWRhdGlvbnNFbmFibGVkKG1fcERvYykpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX1ZhbGlkYXRlKTsNCisgIG1fVmFsaWRhdGVBY2NzLlJlbW92ZUFsbCgpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OkluaXRWYWxpZGF0ZShDWEZBX05vZGUqIHBOb2RlKQ0KLXsNCi0gICAgaWYgKCFtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPklzVmFsaWRhdGlvbnNFbmFibGVkKG1fcERvYykpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZEb2NWaWV3OjpSdW5WYWxpZGF0ZSgpIHsNCisgIGlmICghbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5Jc1ZhbGlkYXRpb25zRW5hYmxlZChtX3BEb2MpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgaUNvdW50cyA9IG1fVmFsaWRhdGVBY2NzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudHM7IGkrKykgew0KKyAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IChDWEZBX1dpZGdldEFjYyopbV9WYWxpZGF0ZUFjY3NbaV07DQorICAgIGlmIChwQWNjLT5HZXROb2RlKCktPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX1ZhbGlkYXRlKTsNCi0gICAgbV9WYWxpZGF0ZUFjY3MuUmVtb3ZlQWxsKCk7DQotICAgIHJldHVybiBUUlVFOw0KKyAgICBwQWNjLT5Qcm9jZXNzVmFsaWRhdGUoKTsNCisgIH0NCisgIG1fVmFsaWRhdGVBY2NzLlJlbW92ZUFsbCgpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OlJ1blZhbGlkYXRlKCkNCi17DQotICAgIGlmICghbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5Jc1ZhbGlkYXRpb25zRW5hYmxlZChtX3BEb2MpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaW50MzJfdCBpQ291bnRzID0gbV9WYWxpZGF0ZUFjY3MuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnRzOyBpKyspIHsNCi0gICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gKENYRkFfV2lkZ2V0QWNjKiltX1ZhbGlkYXRlQWNjc1tpXTsNCi0gICAgICAgIGlmIChwQWNjLT5HZXROb2RlKCktPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBwQWNjLT5Qcm9jZXNzVmFsaWRhdGUoKTsNCi0gICAgfQ0KLSAgICBtX1ZhbGlkYXRlQWNjcy5SZW1vdmVBbGwoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6UnVuRXZlbnRMYXlvdXRSZWFkeSgpIHsNCisgIENYRkFfTm9kZSogcFJvb3RJdGVtID0NCisgICAgICAoQ1hGQV9Ob2RlKiltX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgIGlmICghcFJvb3RJdGVtKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFJvb3RJdGVtLCBYRkFfRVZFTlRfUmVhZHkpOw0KKyAgUnVuTGF5b3V0KCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6UnVuRXZlbnRMYXlvdXRSZWFkeSgpDQotew0KLSAgICBDWEZBX05vZGUqIHBSb290SXRlbSA9IChDWEZBX05vZGUqKW1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KLSAgICBpZiAoIXBSb290SXRlbSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkJpbmRJdGVtcygpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9iaW5kSXRlbXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgaWYgKCgoQ1hGQV9Ob2RlKiltX2JpbmRJdGVtc1tpXSktPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9SZWFkeSk7DQotICAgIFJ1bkxheW91dCgpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6UnVuQmluZEl0ZW1zKCkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9iaW5kSXRlbXMuR2V0U2l6ZSgpOw0KKyAgICBDWEZBX05vZGUqIHBXaWRnZXROb2RlID0NCisgICAgICAgICgoQ1hGQV9Ob2RlKiltX2JpbmRJdGVtc1tpXSktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IChDWEZBX1dpZGdldEFjYyopcFdpZGdldE5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKCFwQWNjKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ1hGQV9CaW5kSXRlbXMgYmluZGl0ZW1zKChDWEZBX05vZGUqKW1fYmluZEl0ZW1zW2ldKTsNCisgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9DQorICAgICAgICBwV2lkZ2V0Tm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWY7DQorICAgIGJpbmRpdGVtcy5HZXRSZWYod3NSZWYpOw0KKyAgICBGWF9EV09SRCBkd1N0eWxlID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8DQorICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQUxMOw0KKyAgICBYRkFfUkVTT0xWRU5PREVfUlMgcnM7DQorICAgIHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwV2lkZ2V0Tm9kZSwgd3NSZWYsIHJzLCBkd1N0eWxlKTsNCisgICAgaW50MzJfdCBpQ291bnQgPSBycy5ub2Rlcy5HZXRTaXplKCk7DQorICAgIHBBY2MtPkRlbGV0ZUl0ZW0oLTEpOw0KKyAgICBpZiAocnMuZHdGbGFncyAhPSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMgfHwgaUNvdW50IDwgMSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c1ZhbHVlUmVmLCB3c0xhYmVsUmVmOw0KKyAgICBiaW5kaXRlbXMuR2V0VmFsdWVSZWYod3NWYWx1ZVJlZik7DQorICAgIGJpbmRpdGVtcy5HZXRMYWJlbFJlZih3c0xhYmVsUmVmKTsNCisgICAgRlhfQk9PTCBiVXNlVmFsdWUgPSB3c0xhYmVsUmVmLklzRW1wdHkoKSB8fCB3c0xhYmVsUmVmID09IHdzVmFsdWVSZWY7DQorICAgIEZYX0JPT0wgYkxhYmVsVXNlQ29udGVudCA9DQorICAgICAgICB3c0xhYmVsUmVmLklzRW1wdHkoKSB8fCB3c0xhYmVsUmVmID09IEZYX1dTVFJDKEwiJCIpOw0KKyAgICBGWF9CT09MIGJWYWx1ZVVzZUNvbnRlbnQgPQ0KKyAgICAgICAgd3NWYWx1ZVJlZi5Jc0VtcHR5KCkgfHwgd3NWYWx1ZVJlZiA9PSBGWF9XU1RSQyhMIiQiKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSwgd3NMYWJlbDsNCisgICAgRlhfRFdPUkQgdVZhbHVlSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKENGWF9XaWRlU3RyaW5nKHdzVmFsdWVSZWYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZVJlZi5HZXRMZW5ndGgoKSk7DQorICAgIEZYX0RXT1JEIHVMYWJsZUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhDRlhfV2lkZVN0cmluZyh3c0xhYmVsUmVmKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTGFiZWxSZWYuR2V0TGVuZ3RoKCkpOw0KICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgaWYgKCgoQ1hGQV9Ob2RlKiltX2JpbmRJdGVtc1tpXSktPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQotICAgICAgICAgICAgY29udGludWU7DQorICAgICAgQ1hGQV9PYmplY3QqIHJlZk9iaiA9IHJzLm5vZGVzW2ldOw0KKyAgICAgIGlmICghcmVmT2JqLT5Jc05vZGUoKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogcmVmTm9kZSA9IChDWEZBX05vZGUqKXJlZk9iajsNCisgICAgICBpZiAoYlZhbHVlVXNlQ29udGVudCkgew0KKyAgICAgICAgd3NWYWx1ZSA9IHJlZk5vZGUtPkdldENvbnRlbnQoKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBub2RlVmFsdWUgPSByZWZOb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKHVWYWx1ZUhhc2gpOw0KKyAgICAgICAgaWYgKG5vZGVWYWx1ZSA9PSBOVUxMKSB7DQorICAgICAgICAgIHdzVmFsdWUgPSByZWZOb2RlLT5HZXRDb250ZW50KCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c1ZhbHVlID0gbm9kZVZhbHVlLT5HZXRDb250ZW50KCk7DQogICAgICAgICB9DQotICAgICAgICBDWEZBX05vZGUqIHBXaWRnZXROb2RlID0gKChDWEZBX05vZGUqKW1fYmluZEl0ZW1zW2ldKS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IChDWEZBX1dpZGdldEFjYyopcFdpZGdldE5vZGUtPkdldFdpZGdldERhdGEoKTsNCi0gICAgICAgIGlmICghcEFjYykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoIWJVc2VWYWx1ZSkgew0KKyAgICAgICAgaWYgKGJMYWJlbFVzZUNvbnRlbnQpIHsNCisgICAgICAgICAgd3NMYWJlbCA9IHJlZk5vZGUtPkdldENvbnRlbnQoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIENYRkFfTm9kZSogbm9kZUxhYmVsID0gcmVmTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZSh3c0xhYmVsUmVmKTsNCisgICAgICAgICAgaWYgKG5vZGVMYWJlbCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgd3NMYWJlbCA9IG5vZGVMYWJlbC0+R2V0Q29udGVudCgpOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBDWEZBX0JpbmRJdGVtcyBiaW5kaXRlbXMoKENYRkFfTm9kZSopbV9iaW5kSXRlbXNbaV0pOw0KLSAgICAgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IHBXaWRnZXROb2RlLT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWY7DQotICAgICAgICBiaW5kaXRlbXMuR2V0UmVmKHdzUmVmKTsNCi0gICAgICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfQUxMOw0KLSAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJzOw0KLSAgICAgICAgcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHBXaWRnZXROb2RlLCB3c1JlZiwgcnMsIGR3U3R5bGUpOw0KLSAgICAgICAgaW50MzJfdCBpQ291bnQgPSBycy5ub2Rlcy5HZXRTaXplKCk7DQotICAgICAgICBwQWNjLT5EZWxldGVJdGVtKC0xKTsNCi0gICAgICAgIGlmIChycy5kd0ZsYWdzICE9IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2RlcyB8fCBpQ291bnQgPCAxKSB7DQotICAgICAgICAgICAgY29udGludWU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdzTGFiZWwgPSB3c1ZhbHVlOw0KKyAgICAgIH0NCisgICAgICBwQWNjLT5JbnNlcnRJdGVtKHdzTGFiZWwsIHdzVmFsdWUpOw0KKyAgICB9DQorICB9DQorICBtX2JpbmRJdGVtcy5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6U2V0Q2hhbmdlTWFyaygpIHsNCisgIGlmIChtX2lTdGF0dXMgPCBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Q2hhbmdlTWFyayhtX3BEb2MpOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZEb2NWaWV3OjpHZXRSb290U3ViZm9ybSgpIHsNCisgIENYRkFfTm9kZSogcEZvcm1QYWNrZXROb2RlID0NCisgICAgICAoQ1hGQV9Ob2RlKiltX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgIGlmICghcEZvcm1QYWNrZXROb2RlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb3JtUGFja2V0Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorfQ0KK0NYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcjo6Q1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUcmF2ZWxSb290KQ0KKyAgICA6IG1fQ29udGVudEl0ZXJhdG9yKHBUcmF2ZWxSb290KSB7DQorICBtX3BEb2NWaWV3ID0gcERvY1ZpZXc7DQorICBtX3BDdXJXaWRnZXQgPSBOVUxMOw0KK30NCitDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6On5DWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3IoKSB7fQ0KK3ZvaWQgQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpSZXNldCgpIHsNCisgIG1fQ29udGVudEl0ZXJhdG9yLlJlc2V0KCk7DQorICBtX3BDdXJXaWRnZXQgPSBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpNb3ZlVG9GaXJzdCgpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkgew0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb05leHQoKSB7DQorICBDWEZBX05vZGUqIHBJdGVtID0gbV9wQ3VyV2lkZ2V0ID8gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9Db250ZW50SXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KKyAgd2hpbGUgKHBJdGVtKSB7DQorICAgIGlmIChDWEZBX1dpZGdldEFjYyogcEFjYyA9IChDWEZBX1dpZGdldEFjYyopcEl0ZW0tPkdldFdpZGdldERhdGEoKSkgew0KKyAgICAgIHdoaWxlICgobV9wQ3VyV2lkZ2V0ID0gcEFjYy0+R2V0TmV4dFdpZGdldChOVUxMKSkgIT0gTlVMTCkgew0KKyAgICAgICAgaWYgKCFtX3BDdXJXaWRnZXQtPklzTG9hZGVkKCkgJiYNCisgICAgICAgICAgICAobV9wQ3VyV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCisgICAgICAgICAgbV9wQ3VyV2lkZ2V0LT5Mb2FkV2lkZ2V0KCk7DQogICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZVJlZiwgd3NMYWJlbFJlZjsNCi0gICAgICAgIGJpbmRpdGVtcy5HZXRWYWx1ZVJlZih3c1ZhbHVlUmVmKTsNCi0gICAgICAgIGJpbmRpdGVtcy5HZXRMYWJlbFJlZih3c0xhYmVsUmVmKTsNCi0gICAgICAgIEZYX0JPT0wgYlVzZVZhbHVlID0gd3NMYWJlbFJlZi5Jc0VtcHR5KCkgfHwgd3NMYWJlbFJlZiA9PSB3c1ZhbHVlUmVmOw0KLSAgICAgICAgRlhfQk9PTCBiTGFiZWxVc2VDb250ZW50ID0gd3NMYWJlbFJlZi5Jc0VtcHR5KCkgfHwgd3NMYWJlbFJlZiA9PSBGWF9XU1RSQyhMIiQiKTsNCi0gICAgICAgIEZYX0JPT0wgYlZhbHVlVXNlQ29udGVudCA9IHdzVmFsdWVSZWYuSXNFbXB0eSgpIHx8IHdzVmFsdWVSZWYgPT0gRlhfV1NUUkMoTCIkIik7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlLCB3c0xhYmVsOw0KLSAgICAgICAgRlhfRFdPUkQgdVZhbHVlSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKENGWF9XaWRlU3RyaW5nKHdzVmFsdWVSZWYpLCB3c1ZhbHVlUmVmLkdldExlbmd0aCgpKTsNCi0gICAgICAgIEZYX0RXT1JEIHVMYWJsZUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhDRlhfV2lkZVN0cmluZyh3c0xhYmVsUmVmKSwgd3NMYWJlbFJlZi5HZXRMZW5ndGgoKSk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgICAgIENYRkFfT2JqZWN0KiByZWZPYmogPSBycy5ub2Rlc1tpXTsNCi0gICAgICAgICAgICBpZighcmVmT2JqLT5Jc05vZGUoKSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiByZWZOb2RlID0gKENYRkFfTm9kZSopcmVmT2JqOw0KLSAgICAgICAgICAgIGlmIChiVmFsdWVVc2VDb250ZW50KSB7DQotICAgICAgICAgICAgICAgIHdzVmFsdWUgPSByZWZOb2RlLT5HZXRDb250ZW50KCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBub2RlVmFsdWUgPSByZWZOb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKHVWYWx1ZUhhc2gpOw0KLSAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgPSByZWZOb2RlLT5HZXRDb250ZW50KCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlID0gbm9kZVZhbHVlLT5HZXRDb250ZW50KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCFiVXNlVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGJMYWJlbFVzZUNvbnRlbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzTGFiZWwgPSByZWZOb2RlLT5HZXRDb250ZW50KCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIG5vZGVMYWJlbCA9ICByZWZOb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKHdzTGFiZWxSZWYpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVMYWJlbCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NMYWJlbCA9IG5vZGVMYWJlbC0+R2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgd3NMYWJlbCA9IHdzVmFsdWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBBY2MtPkluc2VydEl0ZW0od3NMYWJlbCwgd3NWYWx1ZSk7DQotICAgICAgICB9DQorICAgICAgICByZXR1cm4gbV9wQ3VyV2lkZ2V0Ow0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBtX2JpbmRJdGVtcy5SZW1vdmVBbGwoKTsNCisgICAgcEl0ZW0gPSBtX0NvbnRlbnRJdGVyYXRvci5Nb3ZlVG9OZXh0KCk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6U2V0Q2hhbmdlTWFyaygpDQotew0KLSAgICBpZiAobV9pU3RhdHVzIDwgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCkgew0KLSAgICAgICAgcmV0dXJuOw0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb1ByZXZpb3VzKCkgew0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6OkdldEN1cnJlbnRXaWRnZXQoKSB7DQorICByZXR1cm4gTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6OlNldEN1cnJlbnRXaWRnZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorSVhGQV9XaWRnZXRBY2NJdGVyYXRvciogWEZBX1dpZGdldEFjY0l0ZXJhdG9yX0NyZWF0ZSgNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBUcmF2ZWxSb290LA0KKyAgICBYRkFfV0lER0VUT1JERVIgZU9yZGVyKSB7DQorICBpZiAoIXBUcmF2ZWxSb290KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX05FVyBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKHBUcmF2ZWxSb290LT5HZXREb2NWaWV3KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYXZlbFJvb3QtPkdldE5vZGUoKSk7DQorfQ0KK0NYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6OkNYRkFfV2lkZ2V0QWNjSXRlcmF0b3IoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVHJhdmVsUm9vdCkNCisgICAgOiBtX0NvbnRlbnRJdGVyYXRvcihwVHJhdmVsUm9vdCkgew0KKyAgbV9wRG9jVmlldyA9IHBEb2NWaWV3Ow0KKyAgbV9wQ3VyV2lkZ2V0QWNjID0gTlVMTDsNCit9DQorQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6fkNYRkFfV2lkZ2V0QWNjSXRlcmF0b3IoKSB7fQ0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6UmVzZXQoKSB7DQorICBtX3BDdXJXaWRnZXRBY2MgPSBOVUxMOw0KKyAgbV9Db250ZW50SXRlcmF0b3IuUmVzZXQoKTsNCit9DQorQ1hGQV9XaWRnZXRBY2MqIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6Ok1vdmVUb0ZpcnN0KCkgew0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfV2lkZ2V0QWNjKiBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkgew0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfV2lkZ2V0QWNjKiBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpNb3ZlVG9OZXh0KCkgew0KKyAgQ1hGQV9Ob2RlKiBwSXRlbSA9IG1fcEN1cldpZGdldEFjYyA/IG1fQ29udGVudEl0ZXJhdG9yLk1vdmVUb05leHQoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fQ29udGVudEl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgIHdoaWxlIChwSXRlbSkgew0KKyAgICBpZiAoKG1fcEN1cldpZGdldEFjYyA9IChDWEZBX1dpZGdldEFjYyopcEl0ZW0tPkdldFdpZGdldERhdGEoKSkgIT0gTlVMTCkgew0KKyAgICAgIHJldHVybiBtX3BDdXJXaWRnZXRBY2M7DQogICAgIH0NCi0gICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5TZXRDaGFuZ2VNYXJrKG1fcERvYyk7DQorICAgIHBJdGVtID0gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9GRkRvY1ZpZXc6OkdldFJvb3RTdWJmb3JtKCkNCi17DQotICAgIENYRkFfTm9kZSogcEZvcm1QYWNrZXROb2RlID0gKENYRkFfTm9kZSopbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQotICAgIGlmICghcEZvcm1QYWNrZXROb2RlKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gcEZvcm1QYWNrZXROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCitDWEZBX1dpZGdldEFjYyogQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6TW92ZVRvUHJldmlvdXMoKSB7DQorICByZXR1cm4gTlVMTDsNCiB9DQotQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3IoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBDWEZBX05vZGUqIHBUcmF2ZWxSb290KQ0KLSAgICA6IG1fQ29udGVudEl0ZXJhdG9yKHBUcmF2ZWxSb290KQ0KLXsNCi0gICAgbV9wRG9jVmlldyA9IHBEb2NWaWV3Ow0KLSAgICBtX3BDdXJXaWRnZXQgPSBOVUxMOw0KK0NYRkFfV2lkZ2V0QWNjKiBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpHZXRDdXJyZW50V2lkZ2V0QWNjKCkgew0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLUNYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcjo6fkNYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcigpDQotew0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6U2V0Q3VycmVudFdpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogaFdpZGdldCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi12b2lkIENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcjo6UmVzZXQoKQ0KLXsNCi0gICAgbV9Db250ZW50SXRlcmF0b3IuUmVzZXQoKTsNCi0gICAgbV9wQ3VyV2lkZ2V0ID0gTlVMTDsNCi19DQotSVhGQV9XaWRnZXQqIENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcjo6TW92ZVRvRmlyc3QoKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUlYRkFfV2lkZ2V0KiBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0xhc3QoKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUlYRkFfV2lkZ2V0KiBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb05leHQoKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IG1fcEN1cldpZGdldCA/IG1fQ29udGVudEl0ZXJhdG9yLk1vdmVUb05leHQoKSA6IG1fQ29udGVudEl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCi0gICAgd2hpbGUgKHBJdGVtKSB7DQotICAgICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBJdGVtLT5HZXRXaWRnZXREYXRhKCkpIHsNCi0gICAgICAgICAgICB3aGlsZSAoKG1fcEN1cldpZGdldCA9IHBBY2MtPkdldE5leHRXaWRnZXQoTlVMTCkpICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFtX3BDdXJXaWRnZXQtPklzTG9hZGVkKCkgJiYgKG1fcEN1cldpZGdldC0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BDdXJXaWRnZXQtPkxvYWRXaWRnZXQoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9wQ3VyV2lkZ2V0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHBJdGVtID0gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1JWEZBX1dpZGdldCogQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpNb3ZlVG9QcmV2aW91cygpDQotew0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotSVhGQV9XaWRnZXQqIENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcjo6R2V0Q3VycmVudFdpZGdldCgpDQotew0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotRlhfQk9PTCBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6OlNldEN1cnJlbnRXaWRnZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUlYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIFhGQV9XaWRnZXRBY2NJdGVyYXRvcl9DcmVhdGUoQ1hGQV9XaWRnZXRBY2MqIHBUcmF2ZWxSb290LCBYRkFfV0lER0VUT1JERVIgZU9yZGVyKQ0KLXsNCi0gICAgaWYgKCFwVHJhdmVsUm9vdCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIEZYX05FVyBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKHBUcmF2ZWxSb290LT5HZXREb2NWaWV3KCksIHBUcmF2ZWxSb290LT5HZXROb2RlKCkpOw0KLX0NCi1DWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwVHJhdmVsUm9vdCkNCi0gICAgOiBtX0NvbnRlbnRJdGVyYXRvcihwVHJhdmVsUm9vdCkNCi17DQotICAgIG1fcERvY1ZpZXcgPSBwRG9jVmlldzsNCi0gICAgbV9wQ3VyV2lkZ2V0QWNjID0gTlVMTDsNCi19DQotQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6fkNYRkFfV2lkZ2V0QWNjSXRlcmF0b3IoKQ0KLXsNCi19DQotdm9pZCBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpSZXNldCgpDQotew0KLSAgICBtX3BDdXJXaWRnZXRBY2MgPSBOVUxMOw0KLSAgICBtX0NvbnRlbnRJdGVyYXRvci5SZXNldCgpOw0KLX0NCi1DWEZBX1dpZGdldEFjYyogQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6TW92ZVRvRmlyc3QoKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUNYRkFfV2lkZ2V0QWNjKiBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkNCi17DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1DWEZBX1dpZGdldEFjYyogQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6TW92ZVRvTmV4dCgpDQotew0KLSAgICBDWEZBX05vZGUqIHBJdGVtID0gbV9wQ3VyV2lkZ2V0QWNjID8gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpIDogbV9Db250ZW50SXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KLSAgICB3aGlsZSAocEl0ZW0pIHsNCi0gICAgICAgIGlmICgobV9wQ3VyV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwSXRlbS0+R2V0V2lkZ2V0RGF0YSgpKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1fcEN1cldpZGdldEFjYzsNCi0gICAgICAgIH0NCi0gICAgICAgIHBJdGVtID0gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1DWEZBX1dpZGdldEFjYyogQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6TW92ZVRvUHJldmlvdXMoKQ0KLXsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUNYRkFfV2lkZ2V0QWNjKglDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpHZXRDdXJyZW50V2lkZ2V0QWNjKCkNCi17DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6OlNldEN1cnJlbnRXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIGhXaWRnZXQpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLXZvaWQgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6U2tpcFRyZWUoKQ0KLXsNCi0gICAgbV9Db250ZW50SXRlcmF0b3IuU2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpOw0KLSAgICBtX3BDdXJXaWRnZXRBY2MgPSBOVUxMOw0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6U2tpcFRyZWUoKSB7DQorICBtX0NvbnRlbnRJdGVyYXRvci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCk7DQorICBtX3BDdXJXaWRnZXRBY2MgPSBOVUxMOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2N2aWV3LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2N2aWV3LmgKaW5kZXggNjAzNzcxNi4uNWY4NDA3YiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jdmlldy5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuaApAQCAtMTUsMTUyICsxNSwxNTcgQEAKIGNsYXNzIENYRkFfRkZXaWRnZXQ7DQogZXh0ZXJuIGNvbnN0IFhGQV9BVFRSSUJVVEVFTlVNIGdzX0V2ZW50QWN0aXZpdHlbXTsNCiBlbnVtIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVUyB7DQotICAgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Ob25lLA0KLSAgICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfU3RhcnQsDQotICAgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Gb3JtSW5pdGlhbGl6ZSwNCi0gICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0Zvcm1Jbml0Q2FsY3VsYXRlLA0KLSAgICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRm9ybUluaXRWYWxpZGF0ZSwNCi0gICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0Zvcm1Gb3JtUmVhZHksDQotICAgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Eb2luZywNCi0gICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1BhZ2VzZXRJbml0aWFsaXplLA0KLSAgICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfUGFnZXNldEluaXRDYWxjdWxhdGUsDQotICAgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19QYWdlc2V0SW5pdFZhbGlkYXRlLA0KLSAgICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfUGFnZXNldEZvcm1SZWFkeSwNCi0gICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0xheW91dFJlYWR5LA0KLSAgICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRG9jUmVhZHksDQotICAgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQsDQotICAgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19OZXh0LA0KKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX05vbmUsDQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfU3RhcnQsDQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRm9ybUluaXRpYWxpemUsDQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRm9ybUluaXRDYWxjdWxhdGUsDQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRm9ybUluaXRWYWxpZGF0ZSwNCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Gb3JtRm9ybVJlYWR5LA0KKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0RvaW5nLA0KKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1BhZ2VzZXRJbml0aWFsaXplLA0KKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1BhZ2VzZXRJbml0Q2FsY3VsYXRlLA0KKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1BhZ2VzZXRJbml0VmFsaWRhdGUsDQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfUGFnZXNldEZvcm1SZWFkeSwNCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19MYXlvdXRSZWFkeSwNCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Eb2NSZWFkeSwNCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQsDQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfTmV4dCwNCiB9Ow0KLWNsYXNzIENYRkFfRkZEb2NWaWV3IDogcHVibGljIElYRkFfRG9jVmlldw0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZEb2NWaWV3KENYRkFfRkZEb2MqIHBEb2MpOw0KLSAgICB+Q1hGQV9GRkRvY1ZpZXcoKTsNCitjbGFzcyBDWEZBX0ZGRG9jVmlldyA6IHB1YmxpYyBJWEZBX0RvY1ZpZXcgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGRG9jVmlldyhDWEZBX0ZGRG9jKiBwRG9jKTsNCisgIH5DWEZBX0ZGRG9jVmlldygpOw0KIA0KLSAgICB2aXJ0dWFsIElYRkFfRG9jKiBHZXREb2MoKSB7IHJldHVybiBtX3BEb2M7IH0NCi0gICAgdmlydHVhbAlpbnQzMl90CQlTdGFydExheW91dChpbnQzMl90IGlTdGFydFBhZ2UgPSAwKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlEb0xheW91dChJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTdG9wTGF5b3V0KCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJR2V0TGF5b3V0U3RhdHVzKCk7DQotICAgIHZpcnR1YWwJdm9pZAkJCVVwZGF0ZURvY1ZpZXcoKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlDb3VudFBhZ2VWaWV3cygpOw0KLSAgICB2aXJ0dWFsIElYRkFfUGFnZVZpZXcqCUdldFBhZ2VWaWV3KGludDMyX3QgbkluZGV4KTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldCoJCUdldFdpZGdldEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSk7DQotICAgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqIEdldFdpZGdldEFjY0J5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlc2V0V2lkZ2V0RGF0YShDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCVByb2Nlc3NXaWRnZXRFdmVudChDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSwgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBOVUxMKTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldEhhbmRsZXIqCQkJR2V0V2lkZ2V0SGFuZGxlcigpOw0KLSAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0SXRlcmF0b3IqCQlDcmVhdGVXaWRnZXRJdGVyYXRvcigpOw0KLSAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqCQlDcmVhdGVXaWRnZXRBY2NJdGVyYXRvcihYRkFfV0lER0VUT1JERVIgZU9yZGVyID0gWEZBX1dJREdFVE9SREVSX1ByZU9yZGVyKTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldCoJCUdldEZvY3VzV2lkZ2V0KCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUtpbGxGb2N1cygpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlTZXRGb2N1cyhJWEZBX1dpZGdldCogaFdpZGdldCk7DQotICAgIENYRkFfRkZXaWRnZXQqCQlHZXRXaWRnZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQgPSBOVUxMKTsNCi0gICAgQ1hGQV9XaWRnZXRBY2MqCQlHZXRXaWRnZXRBY2NCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsIENYRkFfV2lkZ2V0QWNjKiBwUmVmV2lkZ2V0QWNjID0gTlVMTCk7DQotICAgIElYRkFfRG9jTGF5b3V0KgkJR2V0WEZBTGF5b3V0KCkgY29uc3Q7DQotICAgIHZvaWQJCQkJT25QYWdlRXZlbnQoSVhGQV9MYXlvdXRQYWdlICpwU2VuZGVyLCBYRkFfUEFHRUVWRU5UIGVFdmVudCwgaW50MzJfdCBpUGFnZUluZGV4KTsNCi0gICAgdm9pZAkJCQlMb2NrVXBkYXRlKCk7DQotICAgIHZvaWQJCQkJVW5sb2NrVXBkYXRlKCk7DQotICAgIEZYX0JPT0wJCQkJSXNVcGRhdGVMb2NrZWQoKTsNCi0gICAgdm9pZAkJCQlDbGVhckludmFsaWRhdGVMaXN0KCk7DQotICAgIHZvaWQJCQkJQWRkSW52YWxpZGF0ZVJlY3QoQ1hGQV9GRldpZGdldCogcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGICZydEludmFsaWRhdGUpOw0KLSAgICB2b2lkCQkJCUFkZEludmFsaWRhdGVSZWN0KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ0ZYX1JlY3RGICZydEludmFsaWRhdGUpOw0KLSAgICB2b2lkCQkJCVJ1bkludmFsaWRhdGUoKTsNCi0gICAgdm9pZAkJCQlSdW5Eb2NDbG9zZSgpOw0KLSAgICB2b2lkCQkJCURlc3Ryb3lEb2NWaWV3KCk7DQorICB2aXJ0dWFsIElYRkFfRG9jKiBHZXREb2MoKSB7IHJldHVybiBtX3BEb2M7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBTdGFydExheW91dChpbnQzMl90IGlTdGFydFBhZ2UgPSAwKTsNCisgIHZpcnR1YWwgaW50MzJfdCBEb0xheW91dChJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOw0KKyAgdmlydHVhbCB2b2lkIFN0b3BMYXlvdXQoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMYXlvdXRTdGF0dXMoKTsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVEb2NWaWV3KCk7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRQYWdlVmlld3MoKTsNCisgIHZpcnR1YWwgSVhGQV9QYWdlVmlldyogR2V0UGFnZVZpZXcoaW50MzJfdCBuSW5kZXgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogR2V0V2lkZ2V0QnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsNCisgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqIEdldFdpZGdldEFjY0J5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSk7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXRXaWRnZXREYXRhKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgUHJvY2Vzc1dpZGdldEV2ZW50KENYRkFfRXZlbnRQYXJhbSogcFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IE5VTEwpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldEhhbmRsZXIqIEdldFdpZGdldEhhbmRsZXIoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXRJdGVyYXRvciogQ3JlYXRlV2lkZ2V0SXRlcmF0b3IoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXRBY2NJdGVyYXRvciogQ3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoDQorICAgICAgWEZBX1dJREdFVE9SREVSIGVPcmRlciA9IFhGQV9XSURHRVRPUkRFUl9QcmVPcmRlcik7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBHZXRGb2N1c1dpZGdldCgpOw0KKyAgdmlydHVhbCB2b2lkIEtpbGxGb2N1cygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvY3VzKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisgIENYRkFfRkZXaWRnZXQqIEdldFdpZGdldEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwUmVmV2lkZ2V0ID0gTlVMTCk7DQorICBDWEZBX1dpZGdldEFjYyogR2V0V2lkZ2V0QWNjQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcFJlZldpZGdldEFjYyA9IE5VTEwpOw0KKyAgSVhGQV9Eb2NMYXlvdXQqIEdldFhGQUxheW91dCgpIGNvbnN0Ow0KKyAgdm9pZCBPblBhZ2VFdmVudChJWEZBX0xheW91dFBhZ2UqIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgIFhGQV9QQUdFRVZFTlQgZUV2ZW50LA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYWdlSW5kZXgpOw0KKyAgdm9pZCBMb2NrVXBkYXRlKCk7DQorICB2b2lkIFVubG9ja1VwZGF0ZSgpOw0KKyAgRlhfQk9PTCBJc1VwZGF0ZUxvY2tlZCgpOw0KKyAgdm9pZCBDbGVhckludmFsaWRhdGVMaXN0KCk7DQorICB2b2lkIEFkZEludmFsaWRhdGVSZWN0KENYRkFfRkZXaWRnZXQqIHBXaWRnZXQsIGNvbnN0IENGWF9SZWN0RiYgcnRJbnZhbGlkYXRlKTsNCisgIHZvaWQgQWRkSW52YWxpZGF0ZVJlY3QoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SW52YWxpZGF0ZSk7DQorICB2b2lkIFJ1bkludmFsaWRhdGUoKTsNCisgIHZvaWQgUnVuRG9jQ2xvc2UoKTsNCisgIHZvaWQgRGVzdHJveURvY1ZpZXcoKTsNCiANCi0gICAgRlhfQk9PTAkJCQlJbml0VmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQotICAgIEZYX0JPT0wJCQkJUnVuVmFsaWRhdGUoKTsNCisgIEZYX0JPT0wgSW5pdFZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgRlhfQk9PTCBSdW5WYWxpZGF0ZSgpOw0KIA0KLSAgICB2b2lkCQkJCVNldENoYW5nZU1hcmsoKTsNCisgIHZvaWQgU2V0Q2hhbmdlTWFyaygpOw0KIA0KLSAgICB2b2lkCQkJCUFkZFZhbGlkYXRlV2lkZ2V0KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0KTsNCi0gICAgdm9pZAkJCQlBZGRDYWxjdWxhdGVOb2RlTm90aWZ5KENYRkFfTm9kZSogcE5vZGVDaGFuZ2UpOw0KLSAgICB2b2lkCQkJCUFkZENhbGN1bGF0ZVdpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyk7DQotICAgIGludDMyX3QJCQlSdW5DYWxjdWxhdGVXaWRnZXRzKCk7DQotICAgIEZYX0JPT0wJCQkJSXNTdGF0aWNOb3RpZnkoKTsNCi0gICAgRlhfQk9PTAkJCQlSdW5MYXlvdXQoKTsNCi0gICAgdm9pZAkJCQlSdW5TdWJmb3JtSW5kZXhDaGFuZ2UoKTsNCi0gICAgdm9pZAkJCQlBZGROZXdGb3JtTm9kZShDWEZBX05vZGUqIHBOb2RlKTsNCi0gICAgdm9pZAkJCQlBZGRJbmRleENoYW5nZWRTdWJmb3JtKENYRkFfTm9kZSogcE5vZGUpOw0KLSAgICBDWEZBX1dpZGdldEFjYyoJCUdldEZvY3VzV2lkZ2V0QWNjKCk7DQotICAgIHZvaWQJCQkJU2V0Rm9jdXNXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOw0KLSAgICB2b2lkCQkJCURlbGV0ZUxheW91dEl0ZW0oQ1hGQV9GRldpZGdldCogcFdpZGdldCk7DQotICAgIGludDMyX3QJCQlFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KENYRkFfTm9kZSogcEZvcm1Ob2RlLCBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUsIEZYX0JPT0wgYklzRm9ybVJlYWR5ID0gRkFMU0UsIEZYX0JPT0wgYlJlY3Vyc2l2ZSA9IFRSVUUsIENYRkFfTm9kZSogcEV4Y2x1ZGUgPSBOVUxMKTsNCi0gICAgRlhfQk9PTAkJCQltX2JMYXlvdXRFdmVudDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdBcnJheQltX2Fyck51bGxUZXN0TXNnOw0KLSAgICBDWEZBX0ZGV2lkZ2V0KgkJbV9wTGlzdEZvY3VzV2lkZ2V0Ow0KLSAgICBGWF9CT09MCQkJCW1fYkluTGF5b3V0U3RhdHVzOw0KLXByb3RlY3RlZDoNCi0gICAgRlhfQk9PTAkJCQlSdW5FdmVudExheW91dFJlYWR5KCk7DQotICAgIHZvaWQJCQkJUnVuQmluZEl0ZW1zKCk7DQotICAgIEZYX0JPT0wJCQkJSW5pdENhbGN1bGF0ZShDWEZBX05vZGUqIHBOb2RlKTsNCi0gICAgdm9pZAkJCQlJbml0TGF5b3V0KENYRkFfTm9kZSogcE5vZGUpOw0KLSAgICB2b2lkCQkJCVJ1bkNhbGN1bGF0ZVJlY3Vyc2l2ZShpbnQzMl90JiBpSW5kZXgpOw0KLSAgICB2b2lkCQkJCVNob3dOdWxsVGVzdE1zZygpOw0KLSAgICBGWF9CT09MCQkJCVJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyk7DQotICAgIENYRkFfTm9kZSoJCQlHZXRSb290U3ViZm9ybSgpOw0KLSAgICBDWEZBX0ZGRG9jKgkJCQkJCQltX3BEb2M7DQotICAgIENYRkFfRkZXaWRnZXRIYW5kbGVyKgkJCQltX3BXaWRnZXRIYW5kbGVyOw0KLSAgICBJWEZBX0RvY0xheW91dCoJCQkJCQltX3BYRkFEb2NMYXlvdXQ7DQotICAgIENYRkFfV2lkZ2V0QWNjKgkJCQkJCW1fcEZvY3VzQWNjOw0KLSAgICBDWEZBX0ZGV2lkZ2V0KgkJCQkJCW1fcEZvY3VzV2lkZ2V0Ow0KLSAgICBDWEZBX0ZGV2lkZ2V0KgkJCQkJCW1fcE9sZEZvY3VzV2lkZ2V0Ow0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCQkJCQltX21hcFBhZ2VJbnZhbGlkYXRlOw0KLSAgICBDRlhfUHRyQXJyYXkJCQkJCQltX1ZhbGlkYXRlQWNjczsNCi0gICAgQ0ZYX1B0ckFycmF5CQkJCQkJbV9iaW5kSXRlbXM7DQotICAgIENGWF9QdHJBcnJheQkJCQkJCW1fQ2FsY3VsYXRlQWNjczsNCisgIHZvaWQgQWRkVmFsaWRhdGVXaWRnZXQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXQpOw0KKyAgdm9pZCBBZGRDYWxjdWxhdGVOb2RlTm90aWZ5KENYRkFfTm9kZSogcE5vZGVDaGFuZ2UpOw0KKyAgdm9pZCBBZGRDYWxjdWxhdGVXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOw0KKyAgaW50MzJfdCBSdW5DYWxjdWxhdGVXaWRnZXRzKCk7DQorICBGWF9CT09MIElzU3RhdGljTm90aWZ5KCk7DQorICBGWF9CT09MIFJ1bkxheW91dCgpOw0KKyAgdm9pZCBSdW5TdWJmb3JtSW5kZXhDaGFuZ2UoKTsNCisgIHZvaWQgQWRkTmV3Rm9ybU5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2b2lkIEFkZEluZGV4Q2hhbmdlZFN1YmZvcm0oQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBDWEZBX1dpZGdldEFjYyogR2V0Rm9jdXNXaWRnZXRBY2MoKTsNCisgIHZvaWQgU2V0Rm9jdXNXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOw0KKyAgdm9pZCBEZWxldGVMYXlvdXRJdGVtKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpOw0KKyAgaW50MzJfdCBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0Zvcm1SZWFkeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRXhjbHVkZSA9IE5VTEwpOw0KKyAgRlhfQk9PTCBtX2JMYXlvdXRFdmVudDsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgbV9hcnJOdWxsVGVzdE1zZzsNCisgIENYRkFfRkZXaWRnZXQqIG1fcExpc3RGb2N1c1dpZGdldDsNCisgIEZYX0JPT0wgbV9iSW5MYXlvdXRTdGF0dXM7DQogDQotICAgIENGWF9QdHJBcnJheQkJCQkJCW1fTmV3QWRkZWROb2RlczsNCi0gICAgQ0ZYX1B0ckFycmF5CQkJCQkJbV9JbmRleENoYW5nZWRTdWJmb3JtczsNCi0gICAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTCQkJbV9pU3RhdHVzOw0KLSAgICBpbnQzMl90CQkJCQkJCW1faUxvY2s7DQotICAgIGZyaWVuZCBjbGFzcyBDWEZBX0ZGTm90aWZ5Ow0KKyBwcm90ZWN0ZWQ6DQorICBGWF9CT09MIFJ1bkV2ZW50TGF5b3V0UmVhZHkoKTsNCisgIHZvaWQgUnVuQmluZEl0ZW1zKCk7DQorICBGWF9CT09MIEluaXRDYWxjdWxhdGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2b2lkIEluaXRMYXlvdXQoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2b2lkIFJ1bkNhbGN1bGF0ZVJlY3Vyc2l2ZShpbnQzMl90JiBpSW5kZXgpOw0KKyAgdm9pZCBTaG93TnVsbFRlc3RNc2coKTsNCisgIEZYX0JPT0wgUmVzZXRTaW5nbGVXaWRnZXRBY2NEYXRhKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKTsNCisgIENYRkFfTm9kZSogR2V0Um9vdFN1YmZvcm0oKTsNCisgIENYRkFfRkZEb2MqIG1fcERvYzsNCisgIENYRkFfRkZXaWRnZXRIYW5kbGVyKiBtX3BXaWRnZXRIYW5kbGVyOw0KKyAgSVhGQV9Eb2NMYXlvdXQqIG1fcFhGQURvY0xheW91dDsNCisgIENYRkFfV2lkZ2V0QWNjKiBtX3BGb2N1c0FjYzsNCisgIENYRkFfRkZXaWRnZXQqIG1fcEZvY3VzV2lkZ2V0Ow0KKyAgQ1hGQV9GRldpZGdldCogbV9wT2xkRm9jdXNXaWRnZXQ7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9tYXBQYWdlSW52YWxpZGF0ZTsNCisgIENGWF9QdHJBcnJheSBtX1ZhbGlkYXRlQWNjczsNCisgIENGWF9QdHJBcnJheSBtX2JpbmRJdGVtczsNCisgIENGWF9QdHJBcnJheSBtX0NhbGN1bGF0ZUFjY3M7DQorDQorICBDRlhfUHRyQXJyYXkgbV9OZXdBZGRlZE5vZGVzOw0KKyAgQ0ZYX1B0ckFycmF5IG1fSW5kZXhDaGFuZ2VkU3ViZm9ybXM7DQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVMgbV9pU3RhdHVzOw0KKyAgaW50MzJfdCBtX2lMb2NrOw0KKyAgZnJpZW5kIGNsYXNzIENYRkFfRkZOb3RpZnk7DQogfTsNCi1jbGFzcyBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3IgOiBwdWJsaWMgSVhGQV9XaWRnZXRJdGVyYXRvcg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcihDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcFRyYXZlbFJvb3QpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3IoKTsNCitjbGFzcyBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3IgOiBwdWJsaWMgSVhGQV9XaWRnZXRJdGVyYXRvciB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcihDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcFRyYXZlbFJvb3QpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yKCk7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzZXQoKTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldCoJCQlNb3ZlVG9GaXJzdCgpOw0KLSAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0KgkJCU1vdmVUb0xhc3QoKTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldCoJCQlNb3ZlVG9OZXh0KCk7DQotICAgIHZpcnR1YWwgSVhGQV9XaWRnZXQqCQkJTW92ZVRvUHJldmlvdXMoKTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldCoJCQlHZXRDdXJyZW50V2lkZ2V0KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRDdXJyZW50V2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCi1wcm90ZWN0ZWQ6DQotICAgIENYRkFfQ29udGFpbmVySXRlcmF0b3IJCW1fQ29udGVudEl0ZXJhdG9yOw0KLSAgICBDWEZBX0ZGRG9jVmlldyoJCQkJbV9wRG9jVmlldzsNCi0gICAgQ1hGQV9GRldpZGdldCoJCQkJbV9wQ3VyV2lkZ2V0Ow0KKyAgdmlydHVhbCB2b2lkIFJlc2V0KCk7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBNb3ZlVG9GaXJzdCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvTGFzdCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvTmV4dCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvUHJldmlvdXMoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldEN1cnJlbnRXaWRnZXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDdXJyZW50V2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9Db250YWluZXJJdGVyYXRvciBtX0NvbnRlbnRJdGVyYXRvcjsNCisgIENYRkFfRkZEb2NWaWV3KiBtX3BEb2NWaWV3Ow0KKyAgQ1hGQV9GRldpZGdldCogbV9wQ3VyV2lkZ2V0Ow0KIH07DQotY2xhc3MgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvciA6IHB1YmxpYyBJWEZBX1dpZGdldEFjY0l0ZXJhdG9yDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcihDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcFRyYXZlbFJvb3QpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX1dpZGdldEFjY0l0ZXJhdG9yKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0KCk7DQotICAgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqCQlNb3ZlVG9GaXJzdCgpOw0KLSAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKgkJTW92ZVRvTGFzdCgpOw0KLSAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKgkJTW92ZVRvTmV4dCgpOw0KLSAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKgkJTW92ZVRvUHJldmlvdXMoKTsNCi0gICAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyoJCUdldEN1cnJlbnRXaWRnZXRBY2MoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCVNldEN1cnJlbnRXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIGhXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2tpcFRyZWUoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENYRkFfQ29udGFpbmVySXRlcmF0b3IJCW1fQ29udGVudEl0ZXJhdG9yOw0KLSAgICBDWEZBX0ZGRG9jVmlldyoJCQkJbV9wRG9jVmlldzsNCi0gICAgQ1hGQV9XaWRnZXRBY2MqCQkJCW1fcEN1cldpZGdldEFjYzsNCitjbGFzcyBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yIDogcHVibGljIElYRkFfV2lkZ2V0QWNjSXRlcmF0b3Igew0KKyBwdWJsaWM6DQorICBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwVHJhdmVsUm9vdCk7DQorICB2aXJ0dWFsIH5DWEZBX1dpZGdldEFjY0l0ZXJhdG9yKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogTW92ZVRvRmlyc3QoKTsNCisgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqIE1vdmVUb0xhc3QoKTsNCisgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqIE1vdmVUb05leHQoKTsNCisgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqIE1vdmVUb1ByZXZpb3VzKCk7DQorICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKiBHZXRDdXJyZW50V2lkZ2V0QWNjKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q3VycmVudFdpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogaFdpZGdldCk7DQorICB2aXJ0dWFsIHZvaWQgU2tpcFRyZWUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9Db250YWluZXJJdGVyYXRvciBtX0NvbnRlbnRJdGVyYXRvcjsNCisgIENYRkFfRkZEb2NWaWV3KiBtX3BEb2NWaWV3Ow0KKyAgQ1hGQV9XaWRnZXRBY2MqIG1fcEN1cldpZGdldEFjYzsNCiB9Ow0KIA0KICNlbmRpZiAgLy8gRlhGQV9TUkNfQVBQX1hGQV9GRkRPQ1ZJRVdfSF8NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkcmF3LmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRyYXcuY3BwCmluZGV4IGE2ODFjMTQuLmIyMWMyNWYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRyYXcuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRyYXcuY3BwCkBAIC0xMiw5ICsxMiw1IEBACiAjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQogI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KIENYRkFfRkZEcmF3OjpDWEZBX0ZGRHJhdyhDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KLSAgICA6IENYRkFfRkZXaWRnZXQocFBhZ2VWaWV3LCBwRGF0YUFjYykNCi17DQotfQ0KLUNYRkFfRkZEcmF3Ojp+Q1hGQV9GRkRyYXcoKQ0KLXsNCi19DQorICAgIDogQ1hGQV9GRldpZGdldChwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZEcmF3Ojp+Q1hGQV9GRkRyYXcoKSB7fQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRyYXcuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRyYXcuaAppbmRleCAyOGI0MTA4Li5kYTM0OTQ4IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkcmF3LmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZHJhdy5oCkBAIC02LDExICs2LDExIEBACiANCiAjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfRFJBV19JTVBfSA0KICNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9EUkFXX0lNUF9IDQotY2xhc3MgQ1hGQV9GRkRyYXcgOiBwdWJsaWMgQ1hGQV9GRldpZGdldA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZEcmF3KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZGRHJhdygpOw0KLXByb3RlY3RlZDoNCitjbGFzcyBDWEZBX0ZGRHJhdyA6IHB1YmxpYyBDWEZBX0ZGV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkRyYXcoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGRHJhdygpOw0KKw0KKyBwcm90ZWN0ZWQ6DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZleGNsZ3JvdXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmNwcAppbmRleCA2MjU2NzI0Li5jZGI5NDIxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZleGNsZ3JvdXAuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmV4Y2xncm91cC5jcHAKQEAgLTExLDIyICsxMSwyMSBAQAogI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQogI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KICNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCi1DWEZBX0ZGRXhjbEdyb3VwOjpDWEZBX0ZGRXhjbEdyb3VwKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQotICAgIDogQ1hGQV9GRldpZGdldChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KLXsNCi19DQotQ1hGQV9GRkV4Y2xHcm91cDo6fkNYRkFfRkZFeGNsR3JvdXAoKQ0KLXsNCi19DQotdm9pZCBDWEZBX0ZGRXhjbEdyb3VwOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIGludDMyX3QgaVJvdGF0ZSApDQotew0KLSAgICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9NYXRyaXggbXRSb3RhdGU7DQotICAgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOw0KK0NYRkFfRkZFeGNsR3JvdXA6OkNYRkFfRkZFeGNsR3JvdXAoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRldpZGdldChwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZFeGNsR3JvdXA6On5DWEZBX0ZGRXhjbEdyb3VwKCkge30NCit2b2lkIENYRkFfRkZFeGNsR3JvdXA6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSkgew0KKyAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cyk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmV4Y2xncm91cC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmgKaW5kZXggYzhkOGVmNS4uMmJhYTE4NyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmgKQEAgLTYsMTMgKzYsMTYgQEAKIA0KICNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9FWENMR1JPVVBfSU1QX0gNCiAjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfRVhDTEdST1VQX0lNUF9IDQotY2xhc3MgQ1hGQV9GRkV4Y2xHcm91cCA6IHB1YmxpYyBDWEZBX0ZGV2lkZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GRkV4Y2xHcm91cChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GRkV4Y2xHcm91cCgpOw0KK2NsYXNzIENYRkFfRkZFeGNsR3JvdXAgOiBwdWJsaWMgQ1hGQV9GRldpZGdldCB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZFeGNsR3JvdXAoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGRXhjbEdyb3VwKCk7DQogDQotICAgIHZpcnR1YWwgdm9pZAlSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLCBGWF9EV09SRCBkd1N0YXR1cyA9IDAsIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KLXByb3RlY3RlZDoNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cyA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KKw0KKyBwcm90ZWN0ZWQ6DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZmaWVsZC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZmaWVsZC5jcHAKaW5kZXggODdkM2FkYS4uODBkNjUwNiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZmllbGQuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmNwcApAQCAtMTUsODYwICsxNSw4NDQgQEAKICNpbmNsdWRlICJ4ZmFfdGV4dGxheW91dC5oIg0KICNpbmNsdWRlICJ4ZmFfZmZkb2N2aWV3LmgiDQogQ1hGQV9GRkZpZWxkOjpDWEZBX0ZGRmllbGQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCi0gICAgOiBDWEZBX0ZGV2lkZ2V0KHBQYWdlVmlldywgcERhdGFBY2MpDQotICAgICwgbV9wTm9ybWFsV2lkZ2V0KE5VTEwpDQotew0KLSAgICBtX3J0VUkuU2V0KDAsIDAsIDAsIDApOw0KLSAgICBtX3J0Q2FwdGlvbi5TZXQoMCwgMCwgMCwgMCk7DQorICAgIDogQ1hGQV9GRldpZGdldChwUGFnZVZpZXcsIHBEYXRhQWNjKSwgbV9wTm9ybWFsV2lkZ2V0KE5VTEwpIHsNCisgIG1fcnRVSS5TZXQoMCwgMCwgMCwgMCk7DQorICBtX3J0Q2FwdGlvbi5TZXQoMCwgMCwgMCwgMCk7DQogfQ0KLUNYRkFfRkZGaWVsZDo6fkNYRkFfRkZGaWVsZCgpDQotew0KLSAgICBDWEZBX0ZGRmllbGQ6OlVubG9hZFdpZGdldCgpOw0KK0NYRkFfRkZGaWVsZDo6fkNYRkFfRkZGaWVsZCgpIHsNCisgIENYRkFfRkZGaWVsZDo6VW5sb2FkV2lkZ2V0KCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpHZXRCQm94KENGWF9SZWN0RiAmcnRCb3gsIEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9CT09MIGJEcmF3Rm9jdXMpDQotew0KLSAgICBpZiAoYkRyYXdGb2N1cykgew0KLSAgICAgICAgWEZBX0VMRU1FTlQgdHlwZSA9IChYRkFfRUxFTUVOVCltX3BEYXRhQWNjLT5HZXRVSVR5cGUoKTsNCi0gICAgICAgIGlmICh0eXBlID09IFhGQV9FTEVNRU5UX0J1dHRvbiB8fCB0eXBlID09IFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uIHx8IHR5cGUgPT0gWEZBX0VMRU1FTlRfSW1hZ2VFZGl0DQotICAgICAgICAgICAgICAgIHx8IHR5cGUgPT0gWEZBX0VMRU1FTlRfU2lnbmF0dXJlIHx8IHR5cGUgPT0gWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCkgew0KLSAgICAgICAgICAgIHJ0Qm94ID0gbV9ydFVJOw0KLSAgICAgICAgICAgIENGWF9NYXRyaXggbXQ7DQotICAgICAgICAgICAgR2V0Um90YXRlTWF0cml4KG10KTsNCi0gICAgICAgICAgICBtdC5UcmFuc2Zvcm1SZWN0KHJ0Qm94KTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZGaWVsZDo6R2V0QkJveChDRlhfUmVjdEYmIHJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRyYXdGb2N1cykgew0KKyAgaWYgKGJEcmF3Rm9jdXMpIHsNCisgICAgWEZBX0VMRU1FTlQgdHlwZSA9IChYRkFfRUxFTUVOVCltX3BEYXRhQWNjLT5HZXRVSVR5cGUoKTsNCisgICAgaWYgKHR5cGUgPT0gWEZBX0VMRU1FTlRfQnV0dG9uIHx8IHR5cGUgPT0gWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24gfHwNCisgICAgICAgIHR5cGUgPT0gWEZBX0VMRU1FTlRfSW1hZ2VFZGl0IHx8IHR5cGUgPT0gWEZBX0VMRU1FTlRfU2lnbmF0dXJlIHx8DQorICAgICAgICB0eXBlID09IFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QpIHsNCisgICAgICBydEJveCA9IG1fcnRVSTsNCisgICAgICBDRlhfTWF0cml4IG10Ow0KKyAgICAgIEdldFJvdGF0ZU1hdHJpeChtdCk7DQorICAgICAgbXQuVHJhbnNmb3JtUmVjdChydEJveCk7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi0jaWZuZGVmIF9YRkFfRU1CDQotICAgIHJldHVybiBDWEZBX0ZGV2lkZ2V0OjpHZXRCQm94KHJ0Qm94LCBkd1N0YXR1cyk7DQotI2VuZGlmDQotICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0Qm94KTsNCi0gICAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KLSAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCi0gICAgICAgIHJ0Qm94LlVuaW9uKHJ0V2lkZ2V0KTsNCi0gICAgfQ0KLSAgICBDRlhfTWF0cml4IG10Ow0KLSAgICBHZXRSb3RhdGVNYXRyaXgobXQpOw0KLSAgICBtdC5UcmFuc2Zvcm1SZWN0KHJ0Qm94KTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXZvaWQgQ1hGQV9GRkZpZWxkOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIGludDMyX3QgaVJvdGF0ZSApDQotew0KLSAgICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9NYXRyaXggbXRSb3RhdGU7DQotICAgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOw0KLSAgICBDWEZBX0JvcmRlciBib3JkZXJVSSA9IG1fcERhdGFBY2MtPkdldFVJQm9yZGVyKCk7DQotICAgIERyYXdCb3JkZXIocEdTLCBib3JkZXJVSSwgbV9ydFVJLCAmbXRSb3RhdGUpOw0KLSAgICBSZW5kZXJDYXB0aW9uKHBHUywgJm10Um90YXRlKTsNCi0gICAgRHJhd0hpZ2hsaWdodChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMsIEZBTFNFKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KLSAgICBDRlhfTWF0cml4IG10Ow0KLSAgICBtdC5TZXQoMSwgMCwgMCwgMSwgcnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wKTsNCi0gICAgbXQuQ29uY2F0KG10Um90YXRlKTsNCi0gICAgR2V0QXBwKCktPkdldFdpZGdldE1nckRlbGVnYXRlKCktPk9uRHJhd1dpZGdldChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLCBwR1MsICZtdCk7DQotfQ0KLXZvaWQgQ1hGQV9GRkZpZWxkOjpEcmF3SGlnaGxpZ2h0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBkd1N0YXR1cywgRlhfQk9PTCBiRWxsaXBzZSkNCi17DQotICAgIGlmIChtX3J0VUkuSXNFbXB0eSgpIHx8ICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmICgoZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX0hpZ2hsaWdodCkgJiYgbV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KLSAgICAgICAgQ1hGQV9GRkRvYyogcERvYyA9IEdldERvYygpOw0KLSAgICAgICAgQ0ZYX0NvbG9yIGNySGlnaGxpZ2h0KHBEb2MtPkdldERvY1Byb3ZpZGVyKCktPkdldEhpZ2hsaWdodENvbG9yKHBEb2MpKTsNCi0gICAgICAgIHBHUy0+U2V0RmlsbENvbG9yKCZjckhpZ2hsaWdodCk7DQotICAgICAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICAgICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgICAgIGlmIChiRWxsaXBzZSkgew0KLSAgICAgICAgICAgIHBhdGguQWRkRWxsaXBzZShtX3J0VUkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZShtX3J0VUkubGVmdCwgbV9ydFVJLnRvcCwgbV9ydFVJLndpZHRoLCBtX3J0VUkuaGVpZ2h0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBHUy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRkZGaWVsZDo6RHJhd0ZvY3VzKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KLXsNCi0gICAgaWYgKG1fZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQpIHsNCi0gICAgICAgIENGWF9Db2xvciBjcigweEZGMDAwMDAwKTsNCi0gICAgICAgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsNCi0gICAgICAgIEZYX0ZMT0FUIERhc2hQYXR0ZXJuWzJdID0gezEsIDF9Ow0KLSAgICAgICAgcEdTLT5TZXRMaW5lRGFzaCgwLjBmLCBEYXNoUGF0dGVybiwgMik7DQotICAgICAgICBwR1MtPlNldExpbmVXaWR0aCgwLCBGQUxTRSk7DQotICAgICAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICAgICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKG1fcnRVSS5sZWZ0LCBtX3J0VUkudG9wLCBtX3J0VUkud2lkdGgsIG1fcnRVSS5oZWlnaHQpOw0KLSAgICAgICAgcEdTLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRkZGaWVsZDo6U2V0RldMVGhlbWVQcm92aWRlcigpDQotew0KLSAgICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcC0+U2V0VGhlbWVQcm92aWRlcihHZXRBcHAoKS0+R2V0RldMVGhlbWUoKSk7DQotICAgIH0NCi19DQotRlhfQk9PTCBDWEZBX0ZGRmllbGQ6OklzTG9hZGVkKCkNCi17DQotICAgIHJldHVybiBtX3BOb3JtYWxXaWRnZXQgIT0gTlVMTCAmJiBDWEZBX0ZGV2lkZ2V0OjpJc0xvYWRlZCgpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpDQotew0KLSAgICBTZXRGV0xUaGVtZVByb3ZpZGVyKCk7DQotICAgIG1fcERhdGFBY2MtPkxvYWRDYXB0aW9uKCk7DQotICAgIExheW91dFdpZGdldCgpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDWEZBX0ZGRmllbGQ6OlVubG9hZFdpZGdldCgpDQotew0KLSAgICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICBtX3BOb3JtYWxXaWRnZXQtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcE5vcm1hbFdpZGdldCA9IE5VTEw7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZGRmllbGQ6OlNldEVkaXRTY3JvbGxPZmZzZXQoKQ0KLXsNCi0gICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKTsNCi0gICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1RleHRFZGl0IHx8IGVUeXBlID09IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0IHx8IGVUeXBlID09IFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCkgew0KLSAgICAgICAgRlhfRkxPQVQgZlNjcm9sbE9mZnNldCA9IDA7DQotICAgICAgICBDWEZBX0ZGRmllbGQqIHBQcmV2ID0gKENYRkFfRkZGaWVsZCopR2V0TGF5b3V0SXRlbSgpLT5HZXRQcmV2KCk7DQotICAgICAgICBpZiAocFByZXYpIHsNCi0gICAgICAgICAgICBDRlhfUmVjdEYgcnRNYXJnaW47DQotICAgICAgICAgICAgbV9wRGF0YUFjYy0+R2V0VUlNYXJnaW4ocnRNYXJnaW4pOw0KLSAgICAgICAgICAgIGZTY3JvbGxPZmZzZXQgPSAtcnRNYXJnaW4udG9wOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2hpbGUocFByZXYpIHsNCi0gICAgICAgICAgICBmU2Nyb2xsT2Zmc2V0ICs9IHBQcmV2LT5tX3J0VUkuaGVpZ2h0Ow0KLSAgICAgICAgICAgIHBQcmV2ID0gKENYRkFfRkZGaWVsZCopcFByZXYtPkdldExheW91dEl0ZW0oKS0+R2V0UHJldigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPlNldFNjcm9sbE9mZnNldChmU2Nyb2xsT2Zmc2V0KTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENYRkFfRkZGaWVsZDo6TGF5b3V0V2lkZ2V0KCkNCi17DQotICAgIENYRkFfRkZXaWRnZXQ6OkxheW91dFdpZGdldCgpOw0KLSAgICBDYXBQbGFjZW1lbnQoKTsNCi0gICAgTGF5b3V0Q2FwdGlvbigpOw0KLSAgICBTZXRGV0xSZWN0KCk7DQotICAgIFNldEVkaXRTY3JvbGxPZmZzZXQoKTsNCi0gICAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDWEZBX0ZGRmllbGQ6OkNhcFBsYWNlbWVudCgpDQotew0KLSAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQotICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCi0gICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKTsNCi0gICAgaWYgKG1nV2lkZ2V0KSB7DQotICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gdGhpcy0+R2V0TGF5b3V0SXRlbSgpOw0KLSAgICAgICAgaWYgKCFwSXRlbSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZUb3BJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQotICAgICAgICBtZ1dpZGdldC5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7DQotICAgICAgICBtZ1dpZGdldC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCi0gICAgICAgIG1nV2lkZ2V0LkdldFRvcEluc2V0KGZUb3BJbnNldCk7DQotICAgICAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KLSAgICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCAmJiBwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCi0gICAgICAgICAgICBydFdpZGdldC5EZWZsYXRlKGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcnRXaWRnZXQuRGVmbGF0ZShmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCAwKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHBJdGVtLT5HZXROZXh0KCkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBydFdpZGdldC5EZWZsYXRlKGZMZWZ0SW5zZXQsIDAsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkxlZnRJbnNldCwgMCwgZlJpZ2h0SW5zZXQsIDApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBpQ2FwUGxhY2VtZW50ID0gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCi0gICAgRlhfRkxPQVQgZkNhcFJlc2VydmUgPSAwOw0KLSAgICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsNCi0gICAgaWYgKGNhcHRpb24uSXNFeGlzdEluWE1MKCkgJiYgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgew0KLSAgICAgICAgaUNhcFBsYWNlbWVudCA9IChYRkFfQVRUUklCVVRFRU5VTSljYXB0aW9uLkdldFBsYWNlbWVudFR5cGUoKTsNCi0gICAgICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCAmJiAoR2V0TGF5b3V0SXRlbSgpLT5HZXRQcmV2KCkpKSB7DQotICAgICAgICAgICAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KLSAgICAgICAgfSBlbHNlIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbSAmJiAoR2V0TGF5b3V0SXRlbSgpLT5HZXROZXh0KCkpKSB7DQotICAgICAgICAgICAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmQ2FwUmVzZXJ2ZSA9IGNhcHRpb24uR2V0UmVzZXJ2ZSgpOw0KLSAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSB0aGlzLT5HZXRMYXlvdXRJdGVtKCk7DQotICAgICAgICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCAmJiBwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgbV9ydENhcHRpb24uU2V0KHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsIHJ0V2lkZ2V0LmhlaWdodCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+R2V0Rmlyc3QoKTsNCi0gICAgICAgICAgICAgICAgcEl0ZW0tPkdldFJlY3QobV9ydENhcHRpb24pOw0KLSAgICAgICAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5HZXROZXh0KCk7DQotICAgICAgICAgICAgICAgIHdoaWxlIChwSXRlbSkgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0UmVjdDsNCi0gICAgICAgICAgICAgICAgICAgIHBJdGVtLT5HZXRSZWN0KHJ0UmVjdCk7DQotICAgICAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgKz0gcnRSZWN0LkhlaWdodCgpOw0KLSAgICAgICAgICAgICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+R2V0TmV4dCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nV2lkZ2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1hGQV9UZXh0TGF5b3V0KiBwQ2FwVGV4dExheW91dCA9IG1fcERhdGFBY2MtPkdldENhcHRpb25UZXh0TGF5b3V0KCk7DQotICAgICAgICAgICAgaWYgKGZDYXBSZXNlcnZlIDw9IDAgJiYgcENhcFRleHRMYXlvdXQpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1NpemVGIHNpemU7DQotICAgICAgICAgICAgICAgIHNpemUuU2V0KDAsIDApOw0KLSAgICAgICAgICAgICAgICBDRlhfU2l6ZUYgbWluU2l6ZTsNCi0gICAgICAgICAgICAgICAgbWluU2l6ZS5TZXQoMCwgMCk7DQotICAgICAgICAgICAgICAgIENGWF9TaXplRiBtYXhTaXplOw0KLSAgICAgICAgICAgICAgICBtYXhTaXplLlNldCgwLCAwKTsNCi0gICAgICAgICAgICAgICAgcENhcFRleHRMYXlvdXQtPkNhbGNTaXplKG1pblNpemUsIG1heFNpemUsIHNpemUpOw0KLSAgICAgICAgICAgICAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ub3AgfHwgaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20pIHsNCi0gICAgICAgICAgICAgICAgICAgIGZDYXBSZXNlcnZlID0gc2l6ZS55Ow0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZkNhcFJlc2VydmUgPSBzaXplLng7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9ydFVJID0gcnRXaWRnZXQ7DQotICAgIHN3aXRjaChpQ2FwUGxhY2VtZW50KSB7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6IHsNCi0gICAgICAgICAgICAgICAgbV9ydENhcHRpb24ud2lkdGggPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICAgICAgQ2FwTGVmdFJpZ2h0UGxhY2VtZW50KGNhcHRpb24sIHJ0V2lkZ2V0LCBpQ2FwUGxhY2VtZW50KTsNCi0gICAgICAgICAgICAgICAgbV9ydFVJLndpZHRoIC09IGZDYXBSZXNlcnZlOw0KLSAgICAgICAgICAgICAgICBtX3J0VUkubGVmdCArPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDogew0KLSAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICAgICAgQ2FwVG9wQm90dG9tUGxhY2VtZW50KGNhcHRpb24sIHJ0V2lkZ2V0LCBpQ2FwUGxhY2VtZW50KTsNCi0gICAgICAgICAgICAgICAgbV9ydFVJLnRvcCArPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICAgICAgbV9ydFVJLmhlaWdodCAtPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OiB7DQotICAgICAgICAgICAgICAgIG1fcnRDYXB0aW9uLmxlZnQgPSBtX3J0Q2FwdGlvbi5yaWdodCgpIC0gZkNhcFJlc2VydmU7DQotICAgICAgICAgICAgICAgIG1fcnRDYXB0aW9uLndpZHRoID0gZkNhcFJlc2VydmU7DQotICAgICAgICAgICAgICAgIENhcExlZnRSaWdodFBsYWNlbWVudChjYXB0aW9uLCBydFdpZGdldCwgaUNhcFBsYWNlbWVudCk7DQotICAgICAgICAgICAgICAgIG1fcnRVSS53aWR0aCAtPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogew0KLSAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi50b3AgPSBtX3J0Q2FwdGlvbi5ib3R0b20oKSAtIGZDYXBSZXNlcnZlOw0KLSAgICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICAgICAgQ2FwVG9wQm90dG9tUGxhY2VtZW50KGNhcHRpb24sIHJ0V2lkZ2V0LCBpQ2FwUGxhY2VtZW50KTsNCi0gICAgICAgICAgICAgICAgbV9ydFVJLmhlaWdodCAtPSBmQ2FwUmVzZXJ2ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZToNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KLSAgICBpZiAoYm9yZGVyVUkpIHsNCi0gICAgICAgIENYRkFfTWFyZ2luIG1hcmdpbiA9IGJvcmRlclVJLkdldE1hcmdpbigpOw0KLSAgICAgICAgaWYgKG1hcmdpbi5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydFVJLCBtYXJnaW4pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fcnRVSS5Ob3JtYWxpemUoKTsNCi19DQotdm9pZCBDWEZBX0ZGRmllbGQ6OkNhcFRvcEJvdHRvbVBsYWNlbWVudChDWEZBX0NhcHRpb24gY2FwdGlvbiwgY29uc3QgQ0ZYX1JlY3RGICZydFdpZGdldCwgaW50MzJfdCBpQ2FwUGxhY2VtZW50KQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW47DQotICAgIG1fcERhdGFBY2MtPkdldFVJTWFyZ2luKHJ0VUlNYXJnaW4pOw0KLSAgICBtX3J0Q2FwdGlvbi5sZWZ0ICs9IHJ0VUlNYXJnaW4ubGVmdDsNCi0gICAgaWYgKENYRkFfTWFyZ2luIG1nQ2FwID0gY2FwdGlvbi5HZXRNYXJnaW4oKSkgew0KLSAgICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihtX3J0Q2FwdGlvbiwgbWdDYXApOw0KLSAgICAgICAgaWYgKG1fcnRDYXB0aW9uLmhlaWdodCA8IDApIHsNCi0gICAgICAgICAgICBtX3J0Q2FwdGlvbi50b3AgKz0gbV9ydENhcHRpb24uaGVpZ2h0Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHJ0VUlNYXJnaW4ubGVmdCArIHJ0VUlNYXJnaW4ud2lkdGg7DQotICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBtX3J0Q2FwdGlvbi5oZWlnaHQgKyBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KLSAgICBpZiAoZldpZHRoID4gcnRXaWRnZXQud2lkdGgpIHsNCi0gICAgICAgIG1fcnRVSS53aWR0aCArPSBmV2lkdGggLSBydFdpZGdldC53aWR0aDsNCi0gICAgfQ0KLSAgICBpZiAoZkhlaWdodCA9PSBYRkFfREVGQVVMVFVJX0hFSUdIVCAmJiBtX3J0VUkuaGVpZ2h0IDwgWEZBX01JTlVJX0hFSUdIVCkgew0KLSAgICAgICAgbV9ydFVJLmhlaWdodCA9IFhGQV9NSU5VSV9IRUlHSFQ7DQotICAgICAgICBtX3J0Q2FwdGlvbi50b3AgKz0gcnRVSU1hcmdpbi50b3AgKyBydFVJTWFyZ2luLmhlaWdodDsNCi0gICAgfSBlbHNlIGlmIChmSGVpZ2h0ID4gcnRXaWRnZXQuaGVpZ2h0KSB7DQotICAgICAgICBtX3J0VUkuaGVpZ2h0ICs9IGZIZWlnaHQgLSBydFdpZGdldC5oZWlnaHQ7DQotICAgICAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20pIHsNCi0gICAgICAgICAgICBtX3J0Q2FwdGlvbi50b3AgKz0gZkhlaWdodCAtIHJ0V2lkZ2V0LmhlaWdodDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRkZGaWVsZDo6Q2FwTGVmdFJpZ2h0UGxhY2VtZW50KENYRkFfQ2FwdGlvbiBjYXB0aW9uLCBjb25zdCBDRlhfUmVjdEYgJnJ0V2lkZ2V0LCBpbnQzMl90IGlDYXBQbGFjZW1lbnQpDQotew0KLSAgICBDRlhfUmVjdEYgcnRVSU1hcmdpbjsNCi0gICAgbV9wRGF0YUFjYy0+R2V0VUlNYXJnaW4ocnRVSU1hcmdpbik7DQotICAgIG1fcnRDYXB0aW9uLnRvcCArPSBydFVJTWFyZ2luLnRvcDsNCi0gICAgbV9ydENhcHRpb24uaGVpZ2h0IC09IHJ0VUlNYXJnaW4udG9wOw0KLSAgICBpZiAoQ1hGQV9NYXJnaW4gbWdDYXAgPSBjYXB0aW9uLkdldE1hcmdpbigpKSB7DQotICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ0NhcCk7DQotICAgICAgICBpZiAobV9ydENhcHRpb24uaGVpZ2h0IDwgMCkgew0KLSAgICAgICAgICAgIG1fcnRDYXB0aW9uLnRvcCArPSBtX3J0Q2FwdGlvbi5oZWlnaHQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZldpZHRoID0gbV9ydENhcHRpb24ud2lkdGggKyBydFVJTWFyZ2luLmxlZnQgKyBydFVJTWFyZ2luLndpZHRoOw0KLSAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gcnRVSU1hcmdpbi50b3AgKyBydFVJTWFyZ2luLmhlaWdodDsNCi0gICAgaWYgKGZXaWR0aCA+IHJ0V2lkZ2V0LndpZHRoKSB7DQotICAgICAgICBtX3J0VUkud2lkdGggKz0gZldpZHRoIC0gcnRXaWRnZXQud2lkdGg7DQotICAgICAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KLSAgICAgICAgICAgIG1fcnRDYXB0aW9uLmxlZnQgKz0gZldpZHRoIC0gcnRXaWRnZXQud2lkdGg7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGZIZWlnaHQgPT0gWEZBX0RFRkFVTFRVSV9IRUlHSFQgJiYgbV9ydFVJLmhlaWdodCA8IFhGQV9NSU5VSV9IRUlHSFQpIHsNCi0gICAgICAgIG1fcnRVSS5oZWlnaHQgPSBYRkFfTUlOVUlfSEVJR0hUOw0KLSAgICAgICAgbV9ydENhcHRpb24udG9wICs9IHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7DQotICAgIH0gZWxzZSBpZiAoZkhlaWdodCA+IHJ0V2lkZ2V0LmhlaWdodCkgew0KLSAgICAgICAgbV9ydFVJLmhlaWdodCArPSBmSGVpZ2h0IC0gcnRXaWRnZXQuaGVpZ2h0Ow0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GRkZpZWxkOjpVcGRhdGVGV0woKQ0KLXsNCi0gICAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCi0gICAgfQ0KLX0NCi1GWF9EV09SRCBDWEZBX0ZGRmllbGQ6OlVwZGF0ZVVJUHJvcGVydHkoKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwVWlOb2RlID0gbV9wRGF0YUFjYy0+R2V0VUlDaGlsZCgpOw0KLSAgICBGWF9EV09SRCBkd1N0eWxlID0gMDsNCi0gICAgaWYgKHBVaU5vZGUgJiYgcFVpTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RlZmF1bHRVaSkgew0KLSAgICAgICAgZHdTdHlsZSA9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7DQotICAgIH0NCi0gICAgcmV0dXJuIGR3U3R5bGU7DQotfQ0KLXZvaWQgQ1hGQV9GRkZpZWxkOjpTZXRGV0xSZWN0KCkNCi17DQotICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGIHJ0VWkgPSBtX3J0VUk7DQotICAgIGlmIChydFVpLndpZHRoIDwgMS4wKSB7DQotICAgICAgICBGWFNZU19hc3NlcnQocnRVaS53aWR0aCA8IDEuMCk7DQotICAgICAgICBydFVpLndpZHRoID0gMS4wOw0KLSAgICB9DQotICAgIGlmICghbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IG1fcERhdGFBY2MtPkdldEZvbnRTaXplKCk7DQotICAgICAgICBpZiAocnRVaS5oZWlnaHQgPCBmRm9udFNpemUpIHsNCi0gICAgICAgICAgICBydFVpLmhlaWdodCA9IGZGb250U2l6ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFdpZGdldFJlY3QocnRVaSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpPbk1vdXNlRW50ZXIoKQ0KLXsNCi0gICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRldMX01zZ01vdXNlIG1zOw0KLSAgICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX01vdXNlRW50ZXI7DQotICAgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KLSAgICBtcy5tX3BTcmNUYXJnZXQgPSBOVUxMOw0KLSAgICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENYRkFfRkZGaWVsZDo6T25Nb3VzZUV4aXQoKQ0KLXsNCi0gICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRldMX01zZ01vdXNlIG1zOw0KLSAgICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmU7DQotICAgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KLSAgICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENYRkFfRkZGaWVsZDo6RldMVG9DbGllbnQoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpDQotew0KLSAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9SZWN0RiBydFdpZGdldDsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCi0gICAgZnggLT0gcnRXaWRnZXQubGVmdDsNCi0gICAgZnkgLT0gcnRXaWRnZXQudG9wOw0KLX0NCi1GWF9CT09MCUNYRkFfRkZGaWVsZDo6T25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuIHx8ICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmICghUHRJbkFjdGl2ZVJlY3QoZngsIGZ5KSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQotICAgIENGV0xfTXNnTW91c2UgbXM7DQotICAgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd247DQotICAgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQotICAgIG1zLm1fZnggPSBmeDsNCi0gICAgbXMubV9meSA9IGZ5Ow0KLSAgICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCi0gICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQotICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ1hGQV9GRkZpZWxkOjpPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmICghSXNCdXR0b25Eb3duKCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBTZXRCdXR0b25Eb3duKEZBTFNFKTsNCi0gICAgQ0ZXTF9Nc2dNb3VzZSBtczsNCi0gICAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA7DQotICAgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQotICAgIG1zLm1fZnggPSBmeDsNCi0gICAgbXMubV9meSA9IGZ5Ow0KLSAgICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCi0gICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQotICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ1hGQV9GRkZpZWxkOjpPbkxCdXR0b25EYmxDbGsoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRldMX01zZ01vdXNlIG1zOw0KLSAgICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX0xCdXR0b25EYmxDbGs7DQotICAgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQotICAgIG1zLm1fZnggPSBmeDsNCi0gICAgbXMubV9meSA9IGZ5Ow0KLSAgICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCi0gICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQotICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ1hGQV9GRkZpZWxkOjpPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGV0xfTXNnTW91c2UgbXM7DQotICAgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOw0KLSAgICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KLSAgICBtcy5tX2Z4ID0gZng7DQotICAgIG1zLm1fZnkgPSBmeTsNCi0gICAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQotICAgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KLSAgICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNYRkFfRkZGaWVsZDo6T25Nb3VzZVdoZWVsKEZYX0RXT1JEIGR3RmxhZ3MsIGludDE2X3QgekRlbHRhLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KICAgICByZXR1cm4gRkFMU0U7DQotICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZXTF9Nc2dNb3VzZVdoZWVsIG1zOw0KLSAgICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KLSAgICBtcy5tX2Z4ID0gZng7DQotICAgIG1zLm1fZnkgPSBmeTsNCi0gICAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQotICAgIG1zLm1fZkRlbHRhWCA9IHpEZWx0YTsNCi0gICAgbXMubV9mRGVsdGFZID0gMDsNCi0gICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQotICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICB9DQorI2lmbmRlZiBfWEZBX0VNQg0KKyAgcmV0dXJuIENYRkFfRkZXaWRnZXQ6OkdldEJCb3gocnRCb3gsIGR3U3RhdHVzKTsNCisjZW5kaWYNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0Qm94KTsNCisgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgICBydEJveC5VbmlvbihydFdpZGdldCk7DQorICB9DQorICBDRlhfTWF0cml4IG10Ow0KKyAgR2V0Um90YXRlTWF0cml4KG10KTsNCisgIG10LlRyYW5zZm9ybVJlY3QocnRCb3gpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgU2V0QnV0dG9uRG93bihUUlVFKTsNCi0gICAgQ0ZXTF9Nc2dNb3VzZSBtczsNCi0gICAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRG93bjsNCi0gICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCi0gICAgbXMubV9meCA9IGZ4Ow0KLSAgICBtcy5tX2Z5ID0gZnk7DQotICAgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KLSAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCi0gICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KLSAgICByZXR1cm4gVFJVRTsNCit2b2lkIENYRkFfRkZGaWVsZDo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgIENYRkFfQm9yZGVyIGJvcmRlclVJID0gbV9wRGF0YUFjYy0+R2V0VUlCb3JkZXIoKTsNCisgIERyYXdCb3JkZXIocEdTLCBib3JkZXJVSSwgbV9ydFVJLCAmbXRSb3RhdGUpOw0KKyAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQorICBEcmF3SGlnaGxpZ2h0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cywgRkFMU0UpOw0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgIENGWF9NYXRyaXggbXQ7DQorICBtdC5TZXQoMSwgMCwgMCwgMSwgcnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wKTsNCisgIG10LkNvbmNhdChtdFJvdGF0ZSk7DQorICBHZXRBcHAoKS0+R2V0V2lkZ2V0TWdyRGVsZWdhdGUoKS0+T25EcmF3V2lkZ2V0KG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHUywgJm10KTsNCiB9DQotRlhfQk9PTAlDWEZBX0ZGRmllbGQ6Ok9uUkJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQordm9pZCBDWEZBX0ZGRmllbGQ6OkRyYXdIaWdobGlnaHQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbGxpcHNlKSB7DQorICBpZiAobV9ydFVJLklzRW1wdHkoKSB8fCAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKChkd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfSGlnaGxpZ2h0KSAmJg0KKyAgICAgIG1fcERhdGFBY2MtPkdldEFjY2VzcygpID09IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pIHsNCisgICAgQ1hGQV9GRkRvYyogcERvYyA9IEdldERvYygpOw0KKyAgICBDRlhfQ29sb3IgY3JIaWdobGlnaHQocERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0SGlnaGxpZ2h0Q29sb3IocERvYykpOw0KKyAgICBwR1MtPlNldEZpbGxDb2xvcigmY3JIaWdobGlnaHQpOw0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBpZiAoYkVsbGlwc2UpIHsNCisgICAgICBwYXRoLkFkZEVsbGlwc2UobV9ydFVJKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwYXRoLkFkZFJlY3RhbmdsZShtX3J0VUkubGVmdCwgbV9ydFVJLnRvcCwgbV9ydFVJLndpZHRoLCBtX3J0VUkuaGVpZ2h0KTsNCiAgICAgfQ0KLSAgICBpZiAoIUlzQnV0dG9uRG93bigpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgU2V0QnV0dG9uRG93bihGQUxTRSk7DQotICAgIENGV0xfTXNnTW91c2UgbXM7DQotICAgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfUkJ1dHRvblVwOw0KLSAgICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KLSAgICBtcy5tX2Z4ID0gZng7DQotICAgIG1zLm1fZnkgPSBmeTsNCi0gICAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQotICAgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KLSAgICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQotICAgIHJldHVybiBUUlVFOw0KKyAgICBwR1MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICB9DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25EYmxDbGsoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCit2b2lkIENYRkFfRkZGaWVsZDo6RHJhd0ZvY3VzKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAobV9kd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZCkgew0KKyAgICBDRlhfQ29sb3IgY3IoMHhGRjAwMDAwMCk7DQorICAgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsNCisgICAgRlhfRkxPQVQgRGFzaFBhdHRlcm5bMl0gPSB7MSwgMX07DQorICAgIHBHUy0+U2V0TGluZURhc2goMC4wZiwgRGFzaFBhdHRlcm4sIDIpOw0KKyAgICBwR1MtPlNldExpbmVXaWR0aCgwLCBGQUxTRSk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKG1fcnRVSS5sZWZ0LCBtX3J0VUkudG9wLCBtX3J0VUkud2lkdGgsIG1fcnRVSS5oZWlnaHQpOw0KKyAgICBwR1MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6U2V0RldMVGhlbWVQcm92aWRlcigpIHsNCisgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXAtPlNldFRoZW1lUHJvdmlkZXIoR2V0QXBwKCktPkdldEZXTFRoZW1lKCkpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6SXNMb2FkZWQoKSB7DQorICByZXR1cm4gbV9wTm9ybWFsV2lkZ2V0ICE9IE5VTEwgJiYgQ1hGQV9GRldpZGdldDo6SXNMb2FkZWQoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKSB7DQorICBTZXRGV0xUaGVtZVByb3ZpZGVyKCk7DQorICBtX3BEYXRhQWNjLT5Mb2FkQ2FwdGlvbigpOw0KKyAgTGF5b3V0V2lkZ2V0KCk7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OlVubG9hZFdpZGdldCgpIHsNCisgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5SZWxlYXNlKCk7DQorICAgIG1fcE5vcm1hbFdpZGdldCA9IE5VTEw7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpTZXRFZGl0U2Nyb2xsT2Zmc2V0KCkgew0KKyAgWEZBX0VMRU1FTlQgZVR5cGUgPSBtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKTsNCisgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9UZXh0RWRpdCB8fCBlVHlwZSA9PSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCB8fA0KKyAgICAgIGVUeXBlID09IFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCkgew0KKyAgICBGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0ID0gMDsNCisgICAgQ1hGQV9GRkZpZWxkKiBwUHJldiA9IChDWEZBX0ZGRmllbGQqKUdldExheW91dEl0ZW0oKS0+R2V0UHJldigpOw0KKyAgICBpZiAocFByZXYpIHsNCisgICAgICBDRlhfUmVjdEYgcnRNYXJnaW47DQorICAgICAgbV9wRGF0YUFjYy0+R2V0VUlNYXJnaW4ocnRNYXJnaW4pOw0KKyAgICAgIGZTY3JvbGxPZmZzZXQgPSAtcnRNYXJnaW4udG9wOw0KICAgICB9DQotICAgIENGV0xfTXNnTW91c2UgbXM7DQotICAgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfUkJ1dHRvbkRibENsazsNCi0gICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCi0gICAgbXMubV9meCA9IGZ4Ow0KLSAgICBtcy5tX2Z5ID0gZnk7DQotICAgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KLSAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCi0gICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KLSAgICByZXR1cm4gVFJVRTsNCisgICAgd2hpbGUgKHBQcmV2KSB7DQorICAgICAgZlNjcm9sbE9mZnNldCArPSBwUHJldi0+bV9ydFVJLmhlaWdodDsNCisgICAgICBwUHJldiA9IChDWEZBX0ZGRmllbGQqKXBQcmV2LT5HZXRMYXlvdXRJdGVtKCktPkdldFByZXYoKTsNCisgICAgfQ0KKyAgICAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0U2Nyb2xsT2Zmc2V0KGZTY3JvbGxPZmZzZXQpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6TGF5b3V0V2lkZ2V0KCkgew0KKyAgQ1hGQV9GRldpZGdldDo6TGF5b3V0V2lkZ2V0KCk7DQorICBDYXBQbGFjZW1lbnQoKTsNCisgIExheW91dENhcHRpb24oKTsNCisgIFNldEZXTFJlY3QoKTsNCisgIFNldEVkaXRTY3JvbGxPZmZzZXQoKTsNCisgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6Q2FwUGxhY2VtZW50KCkgew0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRXaWRnZXQpOw0KKyAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKTsNCisgIGlmIChtZ1dpZGdldCkgew0KKyAgICBDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gdGhpcy0+R2V0TGF5b3V0SXRlbSgpOw0KKyAgICBpZiAoIXBJdGVtKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZUb3BJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQorICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgbWdXaWRnZXQuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICAgIG1nV2lkZ2V0LkdldFRvcEluc2V0KGZUb3BJbnNldCk7DQorICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwgJiYgcEl0ZW0tPkdldE5leHQoKSA9PSBOVUxMKSB7DQorICAgICAgcnRXaWRnZXQuRGVmbGF0ZShmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwpIHsNCisgICAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgMCk7DQorICAgICAgfSBlbHNlIGlmIChwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCisgICAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkxlZnRJbnNldCwgMCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkxlZnRJbnNldCwgMCwgZlJpZ2h0SW5zZXQsIDApOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgWEZBX0FUVFJJQlVURUVOVU0gaUNhcFBsYWNlbWVudCA9IFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd247DQorICBGWF9GTE9BVCBmQ2FwUmVzZXJ2ZSA9IDA7DQorICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsNCisgIGlmIChjYXB0aW9uLklzRXhpc3RJblhNTCgpICYmDQorICAgICAgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgew0KKyAgICBpQ2FwUGxhY2VtZW50ID0gKFhGQV9BVFRSSUJVVEVFTlVNKWNhcHRpb24uR2V0UGxhY2VtZW50VHlwZSgpOw0KKyAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ub3AgJiYNCisgICAgICAgIChHZXRMYXlvdXRJdGVtKCktPkdldFByZXYoKSkpIHsNCisgICAgICBtX3J0Q2FwdGlvbi5TZXQoMCwgMCwgMCwgMCk7DQorICAgIH0gZWxzZSBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20gJiYNCisgICAgICAgICAgICAgICAoR2V0TGF5b3V0SXRlbSgpLT5HZXROZXh0KCkpKSB7DQorICAgICAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGZDYXBSZXNlcnZlID0gY2FwdGlvbi5HZXRSZXNlcnZlKCk7DQorICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHRoaXMtPkdldExheW91dEl0ZW0oKTsNCisgICAgICBpZiAocEl0ZW0tPkdldFByZXYoKSA9PSBOVUxMICYmIHBJdGVtLT5HZXROZXh0KCkgPT0gTlVMTCkgew0KKyAgICAgICAgbV9ydENhcHRpb24uU2V0KHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcEl0ZW0gPSBwSXRlbS0+R2V0Rmlyc3QoKTsNCisgICAgICAgIHBJdGVtLT5HZXRSZWN0KG1fcnRDYXB0aW9uKTsNCisgICAgICAgIHBJdGVtID0gcEl0ZW0tPkdldE5leHQoKTsNCisgICAgICAgIHdoaWxlIChwSXRlbSkgew0KKyAgICAgICAgICBDRlhfUmVjdEYgcnRSZWN0Ow0KKyAgICAgICAgICBwSXRlbS0+R2V0UmVjdChydFJlY3QpOw0KKyAgICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgKz0gcnRSZWN0LkhlaWdodCgpOw0KKyAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5HZXROZXh0KCk7DQorICAgICAgICB9DQorICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ1dpZGdldCk7DQorICAgICAgfQ0KKyAgICAgIENYRkFfVGV4dExheW91dCogcENhcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uVGV4dExheW91dCgpOw0KKyAgICAgIGlmIChmQ2FwUmVzZXJ2ZSA8PSAwICYmIHBDYXBUZXh0TGF5b3V0KSB7DQorICAgICAgICBDRlhfU2l6ZUYgc2l6ZTsNCisgICAgICAgIHNpemUuU2V0KDAsIDApOw0KKyAgICAgICAgQ0ZYX1NpemVGIG1pblNpemU7DQorICAgICAgICBtaW5TaXplLlNldCgwLCAwKTsNCisgICAgICAgIENGWF9TaXplRiBtYXhTaXplOw0KKyAgICAgICAgbWF4U2l6ZS5TZXQoMCwgMCk7DQorICAgICAgICBwQ2FwVGV4dExheW91dC0+Q2FsY1NpemUobWluU2l6ZSwgbWF4U2l6ZSwgc2l6ZSk7DQorICAgICAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ub3AgfHwNCisgICAgICAgICAgICBpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbSkgew0KKyAgICAgICAgICBmQ2FwUmVzZXJ2ZSA9IHNpemUueTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGZDYXBSZXNlcnZlID0gc2l6ZS54Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgbV9ydFVJID0gcnRXaWRnZXQ7DQorICBzd2l0Y2ggKGlDYXBQbGFjZW1lbnQpIHsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0OiB7DQorICAgICAgbV9ydENhcHRpb24ud2lkdGggPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoY2FwdGlvbiwgcnRXaWRnZXQsIGlDYXBQbGFjZW1lbnQpOw0KKyAgICAgIG1fcnRVSS53aWR0aCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBtX3J0VUkubGVmdCArPSBmQ2FwUmVzZXJ2ZTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6IHsNCisgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBDYXBUb3BCb3R0b21QbGFjZW1lbnQoY2FwdGlvbiwgcnRXaWRnZXQsIGlDYXBQbGFjZW1lbnQpOw0KKyAgICAgIG1fcnRVSS50b3AgKz0gZkNhcFJlc2VydmU7DQorICAgICAgbV9ydFVJLmhlaWdodCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDogew0KKyAgICAgIG1fcnRDYXB0aW9uLmxlZnQgPSBtX3J0Q2FwdGlvbi5yaWdodCgpIC0gZkNhcFJlc2VydmU7DQorICAgICAgbV9ydENhcHRpb24ud2lkdGggPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoY2FwdGlvbiwgcnRXaWRnZXQsIGlDYXBQbGFjZW1lbnQpOw0KKyAgICAgIG1fcnRVSS53aWR0aCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206IHsNCisgICAgICBtX3J0Q2FwdGlvbi50b3AgPSBtX3J0Q2FwdGlvbi5ib3R0b20oKSAtIGZDYXBSZXNlcnZlOw0KKyAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZDYXBSZXNlcnZlOw0KKyAgICAgIENhcFRvcEJvdHRvbVBsYWNlbWVudChjYXB0aW9uLCBydFdpZGdldCwgaUNhcFBsYWNlbWVudCk7DQorICAgICAgbV9ydFVJLmhlaWdodCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9JbmxpbmU6DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBDWEZBX0JvcmRlciBib3JkZXJVSSA9IG1fcERhdGFBY2MtPkdldFVJQm9yZGVyKCk7DQorICBpZiAoYm9yZGVyVUkpIHsNCisgICAgQ1hGQV9NYXJnaW4gbWFyZ2luID0gYm9yZGVyVUkuR2V0TWFyZ2luKCk7DQorICAgIGlmIChtYXJnaW4uSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRVSSwgbWFyZ2luKTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9ydFVJLk5vcm1hbGl6ZSgpOw0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6Q2FwVG9wQm90dG9tUGxhY2VtZW50KENYRkFfQ2FwdGlvbiBjYXB0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNhcFBsYWNlbWVudCkgew0KKyAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW47DQorICBtX3BEYXRhQWNjLT5HZXRVSU1hcmdpbihydFVJTWFyZ2luKTsNCisgIG1fcnRDYXB0aW9uLmxlZnQgKz0gcnRVSU1hcmdpbi5sZWZ0Ow0KKyAgaWYgKENYRkFfTWFyZ2luIG1nQ2FwID0gY2FwdGlvbi5HZXRNYXJnaW4oKSkgew0KKyAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ0NhcCk7DQorICAgIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCAwKSB7DQorICAgICAgbV9ydENhcHRpb24udG9wICs9IG1fcnRDYXB0aW9uLmhlaWdodDsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfRkxPQVQgZldpZHRoID0gcnRVSU1hcmdpbi5sZWZ0ICsgcnRVSU1hcmdpbi53aWR0aDsNCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBtX3J0Q2FwdGlvbi5oZWlnaHQgKyBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KKyAgaWYgKGZXaWR0aCA+IHJ0V2lkZ2V0LndpZHRoKSB7DQorICAgIG1fcnRVSS53aWR0aCArPSBmV2lkdGggLSBydFdpZGdldC53aWR0aDsNCisgIH0NCisgIGlmIChmSGVpZ2h0ID09IFhGQV9ERUZBVUxUVUlfSEVJR0hUICYmIG1fcnRVSS5oZWlnaHQgPCBYRkFfTUlOVUlfSEVJR0hUKSB7DQorICAgIG1fcnRVSS5oZWlnaHQgPSBYRkFfTUlOVUlfSEVJR0hUOw0KKyAgICBtX3J0Q2FwdGlvbi50b3AgKz0gcnRVSU1hcmdpbi50b3AgKyBydFVJTWFyZ2luLmhlaWdodDsNCisgIH0gZWxzZSBpZiAoZkhlaWdodCA+IHJ0V2lkZ2V0LmhlaWdodCkgew0KKyAgICBtX3J0VUkuaGVpZ2h0ICs9IGZIZWlnaHQgLSBydFdpZGdldC5oZWlnaHQ7DQorICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbSkgew0KKyAgICAgIG1fcnRDYXB0aW9uLnRvcCArPSBmSGVpZ2h0IC0gcnRXaWRnZXQuaGVpZ2h0Ow0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoQ1hGQV9DYXB0aW9uIGNhcHRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ2FwUGxhY2VtZW50KSB7DQorICBDRlhfUmVjdEYgcnRVSU1hcmdpbjsNCisgIG1fcERhdGFBY2MtPkdldFVJTWFyZ2luKHJ0VUlNYXJnaW4pOw0KKyAgbV9ydENhcHRpb24udG9wICs9IHJ0VUlNYXJnaW4udG9wOw0KKyAgbV9ydENhcHRpb24uaGVpZ2h0IC09IHJ0VUlNYXJnaW4udG9wOw0KKyAgaWYgKENYRkFfTWFyZ2luIG1nQ2FwID0gY2FwdGlvbi5HZXRNYXJnaW4oKSkgew0KKyAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ0NhcCk7DQorICAgIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCAwKSB7DQorICAgICAgbV9ydENhcHRpb24udG9wICs9IG1fcnRDYXB0aW9uLmhlaWdodDsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfRkxPQVQgZldpZHRoID0gbV9ydENhcHRpb24ud2lkdGggKyBydFVJTWFyZ2luLmxlZnQgKyBydFVJTWFyZ2luLndpZHRoOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7DQorICBpZiAoZldpZHRoID4gcnRXaWRnZXQud2lkdGgpIHsNCisgICAgbV9ydFVJLndpZHRoICs9IGZXaWR0aCAtIHJ0V2lkZ2V0LndpZHRoOw0KKyAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KKyAgICAgIG1fcnRDYXB0aW9uLmxlZnQgKz0gZldpZHRoIC0gcnRXaWRnZXQud2lkdGg7DQorICAgIH0NCisgIH0NCisgIGlmIChmSGVpZ2h0ID09IFhGQV9ERUZBVUxUVUlfSEVJR0hUICYmIG1fcnRVSS5oZWlnaHQgPCBYRkFfTUlOVUlfSEVJR0hUKSB7DQorICAgIG1fcnRVSS5oZWlnaHQgPSBYRkFfTUlOVUlfSEVJR0hUOw0KKyAgICBtX3J0Q2FwdGlvbi50b3AgKz0gcnRVSU1hcmdpbi50b3AgKyBydFVJTWFyZ2luLmhlaWdodDsNCisgIH0gZWxzZSBpZiAoZkhlaWdodCA+IHJ0V2lkZ2V0LmhlaWdodCkgew0KKyAgICBtX3J0VUkuaGVpZ2h0ICs9IGZIZWlnaHQgLSBydFdpZGdldC5oZWlnaHQ7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpVcGRhdGVGV0woKSB7DQorICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICB9DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZGaWVsZDo6VXBkYXRlVUlQcm9wZXJ0eSgpIHsNCisgIENYRkFfTm9kZSogcFVpTm9kZSA9IG1fcERhdGFBY2MtPkdldFVJQ2hpbGQoKTsNCisgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOw0KKyAgaWYgKHBVaU5vZGUgJiYgcFVpTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RlZmF1bHRVaSkgew0KKyAgICBkd1N0eWxlID0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsNCisgIH0NCisgIHJldHVybiBkd1N0eWxlOw0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6U2V0RldMUmVjdCgpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9SZWN0RiBydFVpID0gbV9ydFVJOw0KKyAgaWYgKHJ0VWkud2lkdGggPCAxLjApIHsNCisgICAgRlhTWVNfYXNzZXJ0KHJ0VWkud2lkdGggPCAxLjApOw0KKyAgICBydFVpLndpZHRoID0gMS4wOw0KKyAgfQ0KKyAgaWYgKCFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KKyAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBtX3BEYXRhQWNjLT5HZXRGb250U2l6ZSgpOw0KKyAgICBpZiAocnRVaS5oZWlnaHQgPCBmRm9udFNpemUpIHsNCisgICAgICBydFVpLmhlaWdodCA9IGZGb250U2l6ZTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRXaWRnZXRSZWN0KHJ0VWkpOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6T25Nb3VzZUVudGVyKCkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9Nc2dNb3VzZSBtczsNCisgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTW91c2VFbnRlcjsNCisgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KKyAgbXMubV9wU3JjVGFyZ2V0ID0gTlVMTDsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6T25Nb3VzZUV4aXQoKSB7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OkZXTFRvQ2xpZW50KEZYX0ZMT0FUJiBmeCwgRlhfRkxPQVQmIGZ5KSB7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgZnggLT0gcnRXaWRnZXQubGVmdDsNCisgIGZ5IC09IHJ0V2lkZ2V0LnRvcDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwNCisgICAgICAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjsNCisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICBtcy5tX2Z4ID0gZng7DQorICBtcy5tX2Z5ID0gZnk7DQorICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCisgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghSXNCdXR0b25Eb3duKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgU2V0QnV0dG9uRG93bihGQUxTRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA7DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9meCA9IGZ4Ow0KKyAgbXMubV9meSA9IGZ5Ow0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6T25MQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRGJsQ2xrOw0KKyAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgIG1zLm1fZnggPSBmeDsNCisgIG1zLm1fZnkgPSBmeTsNCisgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9Nc2dNb3VzZSBtczsNCisgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOw0KKyAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgIG1zLm1fZnggPSBmeDsNCisgIG1zLm1fZnkgPSBmeTsNCisgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uTW91c2VXaGVlbChGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX01zZ01vdXNlV2hlZWwgbXM7DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9meCA9IGZ4Ow0KKyAgbXMubV9meSA9IGZ5Ow0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBtcy5tX2ZEZWx0YVggPSB6RGVsdGE7DQorICBtcy5tX2ZEZWx0YVkgPSAwOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwNCisgICAgICAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRG93bjsNCisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICBtcy5tX2Z4ID0gZng7DQorICBtcy5tX2Z5ID0gZnk7DQorICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCisgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghSXNCdXR0b25Eb3duKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgU2V0QnV0dG9uRG93bihGQUxTRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uVXA7DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9meCA9IGZ4Ow0KKyAgbXMubV9meSA9IGZ5Ow0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6T25SQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRGJsQ2xrOw0KKyAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgIG1zLm1fZnggPSBmeDsNCisgIG1zLm1fZnkgPSBmeTsNCisgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCiB9DQogDQotRlhfQk9PTAlDWEZBX0ZGRmllbGQ6Ok9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCkNCi17DQotICAgIENYRkFfRkZXaWRnZXQ6Ok9uU2V0Rm9jdXMocE9sZFdpZGdldCk7DQotICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZXTF9Nc2dTZXRGb2N1cyBtczsNCi0gICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQotICAgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQotICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCi0gICAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQotICAgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCkgew0KKyAgQ1hGQV9GRldpZGdldDo6T25TZXRGb2N1cyhwT2xkV2lkZ2V0KTsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGV0xfTXNnU2V0Rm9jdXMgbXM7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICBtX2R3U3RhdHVzIHw9IFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCisgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBDWEZBX0ZGV2lkZ2V0OjpPbktpbGxGb2N1cyhwTmV3V2lkZ2V0KTsNCisgIH0NCisgIENGV0xfTXNnS2lsbEZvY3VzIG1zOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICBtcy5tX3BTcmNUYXJnZXQgPSBOVUxMOw0KKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgbV9kd1N0YXR1cyAmPSB+WEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkOw0KKyAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCisgIENYRkFfRkZXaWRnZXQ6Ok9uS2lsbEZvY3VzKHBOZXdXaWRnZXQpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpPbktleURvd24oRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCB8fCAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9Nc2dLZXkgbXM7DQorICBtcy5tX2R3Q21kID0gRldMX01TR0tFWUNNRF9LZXlEb3duOw0KKyAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgIG1zLm1fZHdLZXlDb2RlID0gZHdLZXlDb2RlOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQorICBtcy5tX3BTcmNUYXJnZXQgPSBOVUxMOw0KKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpPbktleVVwKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQgfHwgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGV0xfTXNnS2V5IG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dLRVlDTURfS2V5VXA7DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9kd0tleUNvZGUgPSBkd0tleUNvZGU7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uQ2hhcihGWF9EV09SRCBkd0NoYXIsIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCisgIGlmICghbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGR3Q2hhciA9PSBGV0xfVktFWV9UYWIpIHsNCiAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX01zZ0tleSBtczsNCisgIG1zLm1fZHdDbWQgPSBGV0xfTVNHS0VZQ01EX0NoYXI7DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9kd0tleUNvZGUgPSBkd0NoYXI7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAlDWEZBX0ZGRmllbGQ6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpDQotew0KLSAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuIENYRkFfRkZXaWRnZXQ6Ok9uS2lsbEZvY3VzKHBOZXdXaWRnZXQpOw0KK0ZYX0RXT1JEIENYRkFfRkZGaWVsZDo6T25IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KKyAgICBGWF9GTE9BVCBmZnggPSBmeCwgZmZ5ID0gZnk7DQorICAgIEZXTFRvQ2xpZW50KGZmeCwgZmZ5KTsNCisgICAgRlhfRFdPUkQgZHdXaWRnZXRIaXQgPSBtX3BOb3JtYWxXaWRnZXQtPkhpdFRlc3QoZmZ4LCBmZnkpOw0KKyAgICBpZiAoZHdXaWRnZXRIaXQgIT0gRldMX1dHVEhJVFRFU1RfVW5rbm93bikgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQogICAgIH0NCi0gICAgQ0ZXTF9Nc2dLaWxsRm9jdXMgbXM7DQotICAgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KLSAgICBtcy5tX3BTcmNUYXJnZXQgPSBOVUxMOw0KLSAgICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQotICAgIG1fZHdTdGF0dXMgJj0gflhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCi0gICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCi0gICAgQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMocE5ld1dpZGdldCk7DQorICB9DQorICBDRlhfUmVjdEYgcnRCb3g7DQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQorICBpZiAoIXJ0Qm94LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQorICB9DQorICBpZiAobV9ydENhcHRpb24uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVGl0bGViYXI7DQorICB9DQorICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQm9yZGVyOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6T25TZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6OlB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgIGlmIChydFdpZGdldC5Db250YWlucyhmeCwgZnkpKSB7DQogICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZGaWVsZDo6T25LZXlEb3duKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykNCi17DQotICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0IHx8ICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGV0xfTXNnS2V5IG1zOw0KLSAgICBtcy5tX2R3Q21kID0gRldMX01TR0tFWUNNRF9LZXlEb3duOw0KLSAgICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KLSAgICBtcy5tX2R3S2V5Q29kZSA9IGR3S2V5Q29kZTsNCi0gICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQotICAgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQotICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCi0gICAgcmV0dXJuIFRSVUU7DQordm9pZCBDWEZBX0ZGRmllbGQ6OkxheW91dENhcHRpb24oKSB7DQorICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCisgIGlmICghcENhcFRleHRMYXlvdXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1NpemVGIHNpemU7DQorICBzaXplLlNldChtX3J0Q2FwdGlvbi53aWR0aCwgbV9ydENhcHRpb24uaGVpZ2h0KTsNCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSAwOw0KKyAgcENhcFRleHRMYXlvdXQtPkxheW91dChzaXplLCAmZkhlaWdodCk7DQorICBpZiAobV9ydENhcHRpb24uaGVpZ2h0IDwgZkhlaWdodCkgew0KKyAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmSGVpZ2h0Ow0KKyAgfQ0KIH0NCi1GWF9CT09MCUNYRkFfRkZGaWVsZDo6T25LZXlVcChGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpDQotew0KLSAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCB8fCAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRldMX01zZ0tleSBtczsNCi0gICAgbXMubV9kd0NtZCA9IEZXTF9NU0dLRVlDTURfS2V5VXA7DQotICAgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQotICAgIG1zLm1fZHdLZXlDb2RlID0gZHdLZXlDb2RlOw0KLSAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCi0gICAgbXMubV9wU3JjVGFyZ2V0ID0gTlVMTDsNCi0gICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTAlDWEZBX0ZGRmllbGQ6Ok9uQ2hhcihGWF9EV09SRCBkd0NoYXIsIEZYX0RXT1JEIGR3RmxhZ3MpDQotew0KLSAgICBpZiAoIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKGR3Q2hhciA9PSBGV0xfVktFWV9UYWIpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRldMX01zZ0tleSBtczsNCi0gICAgbXMubV9kd0NtZCA9IEZXTF9NU0dLRVlDTURfQ2hhcjsNCi0gICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCi0gICAgbXMubV9kd0tleUNvZGUgPSBkd0NoYXI7DQotICAgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KLSAgICBtcy5tX3BTcmNUYXJnZXQgPSBOVUxMOw0KLSAgICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9EV09SRCBDWEZBX0ZGRmllbGQ6Ok9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICBGWF9GTE9BVCBmZnggPSBmeCwgZmZ5ID0gZnk7DQotICAgICAgICBGV0xUb0NsaWVudChmZngsIGZmeSk7DQotICAgICAgICBGWF9EV09SRCBkd1dpZGdldEhpdCA9IG1fcE5vcm1hbFdpZGdldC0+SGl0VGVzdChmZngsIGZmeSk7DQotICAgICAgICBpZiAoZHdXaWRnZXRIaXQgIT0gRldMX1dHVEhJVFRFU1RfVW5rbm93bikgew0KLSAgICAgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGIHJ0Qm94Ow0KLSAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQotICAgIGlmICghcnRCb3guQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQotICAgIH0NCi0gICAgaWYgKG1fcnRDYXB0aW9uLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9UaXRsZWJhcjsNCi0gICAgfQ0KLSAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQm9yZGVyOw0KLX0NCi1GWF9CT09MCUNYRkFfRkZGaWVsZDo6T25TZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ1hGQV9GRkZpZWxkOjpQdEluQWN0aXZlUmVjdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpSZW5kZXJDYXB0aW9uKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCisgIGlmICghcENhcFRleHRMYXlvdXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uKCk7DQorICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJg0KKyAgICAgIGNhcHRpb24uR2V0UHJlc2VuY2UoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7DQorICAgIGlmICghcENhcFRleHRMYXlvdXQtPklzTG9hZGVkKCkpIHsNCisgICAgICBDRlhfU2l6ZUYgc2l6ZTsNCisgICAgICBzaXplLlNldChtX3J0Q2FwdGlvbi53aWR0aCwgbV9ydENhcHRpb24uaGVpZ2h0KTsNCisgICAgICBwQ2FwVGV4dExheW91dC0+TGF5b3V0KHNpemUpOw0KICAgICB9DQogICAgIENGWF9SZWN0RiBydFdpZGdldDsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCi0gICAgaWYgKHJ0V2lkZ2V0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydFdpZGdldCk7DQorICAgIENGWF9SZWN0RiBydENsaXAgPSBtX3J0Q2FwdGlvbjsNCisgICAgcnRDbGlwLkludGVyc2VjdChydFdpZGdldCk7DQorICAgIENGWF9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UgPSBwR1MtPkdldFJlbmRlckRldmljZSgpOw0KKyAgICBDRlhfTWF0cml4IG10Ow0KKyAgICBtdC5TZXQoMSwgMCwgMCwgMSwgbV9ydENhcHRpb24ubGVmdCwgbV9ydENhcHRpb24udG9wKTsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQorICAgICAgbXQuQ29uY2F0KCpwTWF0cml4KTsNCiAgICAgfQ0KKyAgICBwQ2FwVGV4dExheW91dC0+RHJhd1N0cmluZyhwUmVuZGVyRGV2aWNlLCBtdCwgcnRDbGlwKTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6OlByb2Nlc3NDb21taXR0ZWREYXRhKCkgew0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFJc0RhdGFDaGFuZ2VkKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKENhbGN1bGF0ZU92ZXJyaWRlKCkgIT0gMSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoIUNvbW1pdERhdGEoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3BEb2NWaWV3LT5TZXRDaGFuZ2VNYXJrKCk7DQorICBtX3BEb2NWaWV3LT5BZGRWYWxpZGF0ZVdpZGdldChtX3BEYXRhQWNjKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi12b2lkIENYRkFfRkZGaWVsZDo6TGF5b3V0Q2FwdGlvbigpDQotew0KLSAgICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCi0gICAgaWYgKCFwQ2FwVGV4dExheW91dCkgew0KLSAgICAgICAgcmV0dXJuOw0KK2ludDMyX3QgQ1hGQV9GRkZpZWxkOjpDYWxjdWxhdGVPdmVycmlkZSgpIHsNCisgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gbV9wRGF0YUFjYy0+R2V0RXhjbEdyb3VwKCk7DQorICBpZiAoIXBBY2MpIHsNCisgICAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEFjYyhtX3BEYXRhQWNjKTsNCisgIH0NCisgIGludDMyX3QgaU92ZXJyaWRlID0gMDsNCisgIGlmIChDYWxjdWxhdGVXaWRnZXRBY2MocEFjYykgPT0gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBwQWNjLT5HZXRFeGNsR3JvdXBGaXJzdE1lbWJlcigpOw0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gTlVMTDsNCisgIHdoaWxlIChwTm9kZSkgew0KKyAgICBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXRBY2MpIHsNCisgICAgICByZXR1cm4gMTsNCiAgICAgfQ0KLSAgICBDRlhfU2l6ZUYgc2l6ZTsNCi0gICAgc2l6ZS5TZXQobV9ydENhcHRpb24ud2lkdGgsIG1fcnRDYXB0aW9uLmhlaWdodCk7DQotICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSAwOw0KLSAgICBwQ2FwVGV4dExheW91dC0+TGF5b3V0KHNpemUsICZmSGVpZ2h0KTsNCi0gICAgaWYgKG1fcnRDYXB0aW9uLmhlaWdodCA8IGZIZWlnaHQpIHsNCi0gICAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZIZWlnaHQ7DQorICAgIGlmIChDYWxjdWxhdGVXaWRnZXRBY2MocFdpZGdldEFjYykgPT0gMCkgew0KKyAgICAgIHJldHVybiAwOw0KICAgICB9DQorICAgIHBOb2RlID0gcFdpZGdldEFjYy0+R2V0RXhjbEdyb3VwTmV4dE1lbWJlcihwTm9kZSk7DQorICB9DQorICByZXR1cm4gMTsNCiB9DQotdm9pZCBDWEZBX0ZGRmllbGQ6OlJlbmRlckNhcHRpb24oQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggKQ0KLXsNCi0gICAgQ1hGQV9UZXh0TGF5b3V0KiBwQ2FwVGV4dExheW91dCA9IG1fcERhdGFBY2MtPkdldENhcHRpb25UZXh0TGF5b3V0KCk7DQotICAgIGlmICghcENhcFRleHRMYXlvdXQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsNCi0gICAgaWYgKGNhcHRpb24uSXNFeGlzdEluWE1MKCkgJiYgY2FwdGlvbi5HZXRQcmVzZW5jZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCi0gICAgICAgIGlmICghcENhcFRleHRMYXlvdXQtPklzTG9hZGVkKCkpIHsNCi0gICAgICAgICAgICBDRlhfU2l6ZUYgc2l6ZTsNCi0gICAgICAgICAgICBzaXplLlNldChtX3J0Q2FwdGlvbi53aWR0aCwgbV9ydENhcHRpb24uaGVpZ2h0KTsNCi0gICAgICAgICAgICBwQ2FwVGV4dExheW91dC0+TGF5b3V0KHNpemUpOw0KK2ludDMyX3QgQ1hGQV9GRkZpZWxkOjpDYWxjdWxhdGVXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBBY2MpIHsNCisgIENYRkFfQ2FsY3VsYXRlIGNhbGMgPSBwQWNjLT5HZXRDYWxjdWxhdGUoKTsNCisgIGlmICghY2FsYykgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIFhGQV9WRVJTSU9OIHZlcnNpb24gPSBwQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPkdldEN1clZlcnNpb25Nb2RlKCk7DQorICBpZiAoY2FsYykgew0KKyAgICBpbnQzMl90IGlPdmVycmlkZSA9IGNhbGMuR2V0T3ZlcnJpZGUoKTsNCisgICAgc3dpdGNoIChpT3ZlcnJpZGUpIHsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yOiB7DQorICAgICAgICBpZiAodmVyc2lvbiA8PSBYRkFfVkVSU0lPTl8yMDQpIHsNCisgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgICB9DQotICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQotICAgICAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydFdpZGdldCk7DQotICAgICAgICBDRlhfUmVjdEYgcnRDbGlwID0gbV9ydENhcHRpb247DQotICAgICAgICBydENsaXAuSW50ZXJzZWN0KHJ0V2lkZ2V0KTsNCi0gICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UgPSBwR1MtPkdldFJlbmRlckRldmljZSgpOw0KLSAgICAgICAgQ0ZYX01hdHJpeCBtdDsNCi0gICAgICAgIG10LlNldCgxLCAwLCAwLCAxLCBtX3J0Q2FwdGlvbi5sZWZ0LCBtX3J0Q2FwdGlvbi50b3ApOw0KLSAgICAgICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQotICAgICAgICAgICAgbXQuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IEdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOw0KKyAgICAgICAgaWYgKHBBcHBQcm92aWRlcikgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2FybmluZzsNCisgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfTm90TW9kaWZ5RmllbGQsIHdzV2FybmluZyk7DQorICAgICAgICAgIHdzTWVzc2FnZSArPSB3c1dhcm5pbmc7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICAgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX0NhbGNPdmVycmlkZSwgd3NUaXRsZSk7DQorICAgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzTWVzc2FnZSwgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfT0spOw0KICAgICAgICAgfQ0KLSAgICAgICAgcENhcFRleHRMYXlvdXQtPkRyYXdTdHJpbmcocFJlbmRlckRldmljZSwgbXQsIHJ0Q2xpcCk7DQotICAgIH0NCi19DQotRlhfQk9PTCBDWEZBX0ZGRmllbGQ6OlByb2Nlc3NDb21taXR0ZWREYXRhKCkNCi17DQotICAgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKCFJc0RhdGFDaGFuZ2VkKCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoQ2FsY3VsYXRlT3ZlcnJpZGUoKSAhPSAxKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKCFDb21taXREYXRhKCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX3BEb2NWaWV3LT5TZXRDaGFuZ2VNYXJrKCk7DQotICAgIG1fcERvY1ZpZXctPkFkZFZhbGlkYXRlV2lkZ2V0KG1fcERhdGFBY2MpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotaW50MzJfdCBDWEZBX0ZGRmllbGQ6OkNhbGN1bGF0ZU92ZXJyaWRlKCkNCi17DQotICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gbV9wRGF0YUFjYy0+R2V0RXhjbEdyb3VwKCk7DQotICAgIGlmICghcEFjYykgew0KLSAgICAgICAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEFjYyhtX3BEYXRhQWNjKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlPdmVycmlkZSA9IDA7DQotICAgIGlmIChDYWxjdWxhdGVXaWRnZXRBY2MocEFjYykgPT0gMCkgew0KKyAgICAgIH0NCiAgICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBwQWNjLT5HZXRFeGNsR3JvdXBGaXJzdE1lbWJlcigpOw0KLSAgICBpZiAoIXBOb2RlKSB7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfQ0KLSAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IE5VTEw7DQotICAgIHdoaWxlIChwTm9kZSkgew0KLSAgICAgICAgcFdpZGdldEFjYyA9IChDWEZBX1dpZGdldEFjYyopcE5vZGUtPkdldFdpZGdldERhdGEoKTsNCi0gICAgICAgIGlmICghcFdpZGdldEFjYykgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZzogew0KKyAgICAgICAgaWYgKHZlcnNpb24gPD0gWEZBX1ZFUlNJT05fMjA0KSB7DQorICAgICAgICAgIENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCk7DQorICAgICAgICAgIGlmICghc2NyaXB0KSB7DQogICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgIH0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgICAgICAgICBzY3JpcHQuR2V0RXhwcmVzc2lvbih3c0V4cHJlc3Npb24pOw0KKyAgICAgICAgICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBpZiAoQ2FsY3VsYXRlV2lkZ2V0QWNjKHBXaWRnZXRBY2MpID09IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIGlmIChwQWNjLT5HZXROb2RlKCktPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSkpIHsNCisgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgICB9DQotICAgICAgICBwTm9kZSA9IHBXaWRnZXRBY2MtPkdldEV4Y2xHcm91cE5leHRNZW1iZXIocE5vZGUpOw0KLSAgICB9DQotICAgIHJldHVybiAxOw0KLX0NCi1pbnQzMl90IENYRkFfRkZGaWVsZDo6Q2FsY3VsYXRlV2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwQWNjKQ0KLXsNCi0gICAgQ1hGQV9DYWxjdWxhdGUgY2FsYyA9IHBBY2MtPkdldENhbGN1bGF0ZSgpOw0KLSAgICBpZiAoIWNhbGMpIHsNCisgICAgICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IEdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOw0KKyAgICAgICAgaWYgKHBBcHBQcm92aWRlcikgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7DQorICAgICAgICAgIGNhbGMuR2V0TWVzc2FnZVRleHQod3NNZXNzYWdlKTsNCisgICAgICAgICAgaWYgKCF3c01lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgd3NNZXNzYWdlICs9IEwiXHJcbiI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXYXJuaW5nOw0KKyAgICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19Nb2RpZnlGaWVsZCwgd3NXYXJuaW5nKTsNCisgICAgICAgICAgd3NNZXNzYWdlICs9IHdzV2FybmluZzsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaXRsZTsNCisgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfQ2FsY092ZXJyaWRlLCB3c1RpdGxlKTsNCisgICAgICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzTWVzc2FnZSwgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01CX1llc05vKSA9PSBYRkFfSURZZXMpIHsNCisgICAgICAgICAgICBwQWNjLT5HZXROb2RlKCktPlNldEZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gMDsNCisgICAgICB9DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9JZ25vcmU6DQorICAgICAgICByZXR1cm4gMDsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkOg0KKyAgICAgICAgcEFjYy0+R2V0Tm9kZSgpLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUsIFRSVUUsIEZBTFNFKTsNCisgICAgICBkZWZhdWx0Og0KICAgICAgICAgcmV0dXJuIDE7DQogICAgIH0NCi0gICAgWEZBX1ZFUlNJT04gdmVyc2lvbiA9IHBBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCi0gICAgaWYgKGNhbGMpIHsNCi0gICAgICAgIGludDMyX3QgaU92ZXJyaWRlID0gY2FsYy5HZXRPdmVycmlkZSgpOw0KLSAgICAgICAgc3dpdGNoIChpT3ZlcnJpZGUpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yOiB7DQotICAgICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA8PSBYRkFfVkVSU0lPTl8yMDQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IEdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBcHBQcm92aWRlcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1dhcm5pbmc7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfTm90TW9kaWZ5RmllbGQsIHdzV2FybmluZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NNZXNzYWdlICs9IHdzV2FybmluZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX0NhbGNPdmVycmlkZSwgd3NUaXRsZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NNZXNzYWdlLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsIFhGQV9NQl9PSyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9XYXJuaW5nOiB7DQotICAgICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA8PSBYRkFfVkVSU0lPTl8yMDQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1NjcmlwdCBzY3JpcHQgPSBjYWxjLkdldFNjcmlwdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NyaXB0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQotICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LkdldEV4cHJlc3Npb24od3NFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAocEFjYy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQXBwUHJvdmlkZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsYy5HZXRNZXNzYWdlVGV4dCh3c01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd3NNZXNzYWdlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c01lc3NhZ2UgKz0gTCJcclxuIjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXYXJuaW5nOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX01vZGlmeUZpZWxkLCB3c1dhcm5pbmcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzTWVzc2FnZSArPSB3c1dhcm5pbmc7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaXRsZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19DYWxjT3ZlcnJpZGUsIHdzVGl0bGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQXBwUHJvdmlkZXItPk1zZ0JveCh3c01lc3NhZ2UsIHdzVGl0bGUsIFhGQV9NQklDT05fV2FybmluZywgWEZBX01CX1llc05vKSA9PSBYRkFfSURZZXMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFjYy0+R2V0Tm9kZSgpLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUsIFRSVUUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXNlICBYRkFfQVRUUklCVVRFRU5VTV9JZ25vcmU6DQotICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQ6DQotICAgICAgICAgICAgICAgIHBBY2MtPkdldE5vZGUoKS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlLCBUUlVFLCBGQUxTRSk7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICB9DQorICB9DQorICByZXR1cm4gMTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6OkNvbW1pdERhdGEoKSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpJc0RhdGFDaGFuZ2VkKCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6VHJhbnNsYXRlRldMTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBHZXRBcHAoKS0+R2V0V2lkZ2V0TWdyRGVsZWdhdGUoKS0+T25Qcm9jZXNzTWVzc2FnZVRvRm9ybShwTWVzc2FnZSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRkZpZWxkOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgew0KKyAgRlhfRFdPUkQgZHdFdmVudElEID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQorICBzd2l0Y2ggKGR3RXZlbnRJRCkgew0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX01vdXNlOiB7DQorICAgICAgQ0ZXTF9FdnRNb3VzZSogZXZlbnQgPSAoQ0ZXTF9FdnRNb3VzZSopcEV2ZW50Ow0KKyAgICAgIGlmIChldmVudC0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTW91c2VFbnRlcikgew0KKyAgICAgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX01vdXNlRW50ZXI7DQorICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZUVudGVyLCAmZVBhcmFtKTsNCisgICAgICB9IGVsc2UgaWYgKGV2ZW50LT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlKSB7DQorICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICAgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfTW91c2VFeGl0Ow0KKyAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICAgICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFeGl0LCAmZVBhcmFtKTsNCisgICAgICB9IGVsc2UgaWYgKGV2ZW50LT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bikgew0KKyAgICAgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX01vdXNlRG93bjsNCisgICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRG93biwgJmVQYXJhbSk7DQorICAgICAgfSBlbHNlIGlmIChldmVudC0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwKSB7DQorICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICAgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfTW91c2VVcDsNCisgICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlVXAsICZlUGFyYW0pOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gMTsNCi19DQotRlhfQk9PTAlDWEZBX0ZGRmllbGQ6OkNvbW1pdERhdGEoKQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfRkZGaWVsZDo6SXNEYXRhQ2hhbmdlZCgpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLXZvaWQgQ1hGQV9GRkZpZWxkOjpUcmFuc2xhdGVGV0xNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpDQotew0KLSAgICBHZXRBcHAoKS0+R2V0V2lkZ2V0TWdyRGVsZWdhdGUoKS0+T25Qcm9jZXNzTWVzc2FnZVRvRm9ybShwTWVzc2FnZSk7DQotfQ0KLWludDMyX3QgQ1hGQV9GRkZpZWxkOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZXTF9FUlIgQ1hGQV9GRkZpZWxkOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQotew0KLSAgICBGWF9EV09SRCBkd0V2ZW50SUQgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCi0gICAgc3dpdGNoIChkd0V2ZW50SUQpIHsNCi0gICAgICAgIGNhc2UgRldMX0VWVEhBU0hfTW91c2U6IHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9FdnRNb3VzZSAqZXZlbnQgPSAoQ0ZXTF9FdnRNb3VzZSopcEV2ZW50Ow0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQtPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX01vdXNlRW50ZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQotICAgICAgICAgICAgICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Nb3VzZUVudGVyOw0KLSAgICAgICAgICAgICAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQotICAgICAgICAgICAgICAgICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFbnRlciwgJmVQYXJhbSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQtPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmUpIHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQotICAgICAgICAgICAgICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Nb3VzZUV4aXQ7DQotICAgICAgICAgICAgICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCi0gICAgICAgICAgICAgICAgICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZUV4aXQsICZlUGFyYW0pOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bikgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCi0gICAgICAgICAgICAgICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX01vdXNlRG93bjsNCi0gICAgICAgICAgICAgICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRG93biwgJmVQYXJhbSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQtPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25VcCkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCi0gICAgICAgICAgICAgICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX01vdXNlVXA7DQotICAgICAgICAgICAgICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCi0gICAgICAgICAgICAgICAgICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZVVwLCAmZVBhcmFtKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0NsaWNrOiB7DQotICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQotICAgICAgICAgICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NsaWNrOw0KLSAgICAgICAgICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCi0gICAgICAgICAgICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrLCAmZVBhcmFtKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCisgICAgY2FzZSBGV0xfRVZUSEFTSF9DbGljazogew0KKyAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfQ2xpY2s7DQorICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrLCAmZVBhcmFtKTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ1hGQV9GRkZpZWxkOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggKQ0KLXsNCi0gICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK0ZXTF9FUlIgQ1hGQV9GRkZpZWxkOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZmaWVsZC5oCmluZGV4IDE2ZGQzZDYuLmU5YzE5MTYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZmllbGQuaApAQCAtNiw3MiArNiw4NyBAQAogDQogI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0ZJRUxEX0lNUF9IDQogI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX0ZJRUxEX0lNUF9IDQotI2RlZmluZSBYRkFfTUlOVUlfSEVJR0hUCQk0LjMyZg0KLSNkZWZpbmUgWEZBX0RFRkFVTFRVSV9IRUlHSFQJMi4wZg0KKyNkZWZpbmUgWEZBX01JTlVJX0hFSUdIVCA0LjMyZg0KKyNkZWZpbmUgWEZBX0RFRkFVTFRVSV9IRUlHSFQgMi4wZg0KIGNsYXNzIENYRkFfVGV4dExheW91dDsNCi1jbGFzcyBDWEZBX0ZGRmllbGQgOiBwdWJsaWMgQ1hGQV9GRldpZGdldCwgcHVibGljIElGV0xfV2lkZ2V0RGVsZWdhdGUNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGRmllbGQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQotICAgIHZpcnR1YWwgfkNYRkFfRkZGaWVsZCgpOw0KK2NsYXNzIENYRkFfRkZGaWVsZCA6IHB1YmxpYyBDWEZBX0ZGV2lkZ2V0LCBwdWJsaWMgSUZXTF9XaWRnZXREZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZGaWVsZChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgIHZpcnR1YWwgfkNYRkFfRkZGaWVsZCgpOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJR2V0QkJveChDRlhfUmVjdEYgJnJ0Qm94LCBGWF9EV09SRCBkd1N0YXR1cywgRlhfQk9PTCBiRHJhd0ZvY3VzID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIHZvaWQJUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLCBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCi0gICAgdmlydHVhbAlGWF9CT09MCUlzTG9hZGVkKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlMb2FkV2lkZ2V0KCk7DQotICAgIHZpcnR1YWwgdm9pZAlVbmxvYWRXaWRnZXQoKTsNCi0gICAgdmlydHVhbAlGWF9CT09MCUxheW91dFdpZGdldCgpOw0KLSAgICB2aXJ0dWFsCXZvaWQJVXBkYXRlRldMKCk7DQotICAgIEZYX0RXT1JECVVwZGF0ZVVJUHJvcGVydHkoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbk1vdXNlRW50ZXIoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbk1vdXNlRXhpdCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTEJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Nb3VzZVdoZWVsKEZYX0RXT1JEIGR3RmxhZ3MsIGludDE2X3QgekRlbHRhLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uUkJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goQ0ZYX1JlY3RGJiBydEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRHJhd0ZvY3VzID0gRkFMU0UpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlID0gMCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNMb2FkZWQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTGF5b3V0V2lkZ2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgVXBkYXRlRldMKCk7DQorICBGWF9EV09SRCBVcGRhdGVVSVByb3BlcnR5KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZUVudGVyKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZUV4aXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25EYmxDbGsoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VXaGVlbChGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHpEZWx0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25EYmxDbGsoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQlPblNldEZvY3VzKENYRkFfRkZXaWRnZXQqIHBPbGRXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2V5RG93bihGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2V5VXAoRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbkNoYXIoRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKTsNCi0gICAgdmlydHVhbAlGWF9EV09SRAlPbkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPblNldEN1cnNvcihGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLXByb3RlY3RlZDoNCi0gICAgdmlydHVhbCBGWF9CT09MCVB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwJdm9pZAlTZXRGV0xSZWN0KCk7DQotICAgIHZvaWQJCQlTZXRGV0xUaGVtZVByb3ZpZGVyKCk7DQotICAgIENGV0xfV2lkZ2V0KglHZXROb3JtYWxXaWRnZXQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wTm9ybWFsV2lkZ2V0Ow0KLSAgICB9DQotICAgIHZvaWQJCQlGV0xUb0NsaWVudChGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSk7DQotICAgIHZvaWQJCQlMYXlvdXRDYXB0aW9uKCk7DQotICAgIHZvaWQJCQlSZW5kZXJDYXB0aW9uKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25TZXRGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwT2xkV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbktleURvd24oRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbktleVVwKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKEZYX0RXT1JEIGR3Q2hhciwgRlhfRFdPUkQgZHdGbGFncyk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIE9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Q3Vyc29yKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQogDQotICAgIGludDMyX3QJCUNhbGN1bGF0ZU92ZXJyaWRlKCk7DQotICAgIGludDMyX3QJCUNhbGN1bGF0ZVdpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogcEFjYyk7DQotICAgIEZYX0JPT0wJCQlQcm9jZXNzQ29tbWl0dGVkRGF0YSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJQ29tbWl0RGF0YSgpOw0KLSAgICB2aXJ0dWFsCUZYX0JPT0wJSXNEYXRhQ2hhbmdlZCgpOw0KLSAgICB2b2lkCQkJRHJhd0hpZ2hsaWdodChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZHdTdGF0dXMsIEZYX0JPT0wgYkVsbGlwc2UgPSBGQUxTRSk7DQotICAgIHZvaWQJCQlEcmF3Rm9jdXMoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KLSAgICB2b2lkCQkJVHJhbnNsYXRlRldMTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCi0gICAgdm9pZAkJCUNhcFBsYWNlbWVudCgpOw0KLSAgICB2b2lkCQkJQ2FwVG9wQm90dG9tUGxhY2VtZW50KENYRkFfQ2FwdGlvbiBjYXB0aW9uLCBjb25zdCBDRlhfUmVjdEYgJnJ0V2lkZ2V0LCBpbnQzMl90IGlDYXBQbGFjZW1lbnQpOw0KLSAgICB2b2lkCQkJQ2FwTGVmdFJpZ2h0UGxhY2VtZW50KENYRkFfQ2FwdGlvbiBjYXB0aW9uLCBjb25zdCBDRlhfUmVjdEYgJnJ0V2lkZ2V0LCBpbnQzMl90IGlDYXBQbGFjZW1lbnQpOw0KLSAgICB2b2lkCQkJU2V0RWRpdFNjcm9sbE9mZnNldCgpOw0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGV0xfV2lkZ2V0KgltX3BOb3JtYWxXaWRnZXQ7DQotICAgIENGWF9SZWN0RgkJbV9ydFVJOw0KLSAgICBDRlhfUmVjdEYJCW1fcnRDYXB0aW9uOw0KKyBwcm90ZWN0ZWQ6DQorICB2aXJ0dWFsIEZYX0JPT0wgUHRJbkFjdGl2ZVJlY3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGV0xSZWN0KCk7DQorICB2b2lkIFNldEZXTFRoZW1lUHJvdmlkZXIoKTsNCisgIENGV0xfV2lkZ2V0KiBHZXROb3JtYWxXaWRnZXQoKSB7IHJldHVybiBtX3BOb3JtYWxXaWRnZXQ7IH0NCisgIHZvaWQgRldMVG9DbGllbnQoRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpOw0KKyAgdm9pZCBMYXlvdXRDYXB0aW9uKCk7DQorICB2b2lkIFJlbmRlckNhcHRpb24oQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgIGludDMyX3QgQ2FsY3VsYXRlT3ZlcnJpZGUoKTsNCisgIGludDMyX3QgQ2FsY3VsYXRlV2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwQWNjKTsNCisgIEZYX0JPT0wgUHJvY2Vzc0NvbW1pdHRlZERhdGEoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDb21taXREYXRhKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZCgpOw0KKyAgdm9pZCBEcmF3SGlnaGxpZ2h0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRWxsaXBzZSA9IEZBTFNFKTsNCisgIHZvaWQgRHJhd0ZvY3VzKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgVHJhbnNsYXRlRldMTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZvaWQgQ2FwUGxhY2VtZW50KCk7DQorICB2b2lkIENhcFRvcEJvdHRvbVBsYWNlbWVudChDWEZBX0NhcHRpb24gY2FwdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDYXBQbGFjZW1lbnQpOw0KKyAgdm9pZCBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoQ1hGQV9DYXB0aW9uIGNhcHRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ2FwUGxhY2VtZW50KTsNCisgIHZvaWQgU2V0RWRpdFNjcm9sbE9mZnNldCgpOw0KKw0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX1dpZGdldCogbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRVSTsNCisgIENGWF9SZWN0RiBtX3J0Q2FwdGlvbjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmNwcAppbmRleCA3OGVlZjMzLi42NWFkNWFlIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZS5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2UuY3BwCkBAIC0xMyw1OCArMTMsNTUgQEAKICNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCiAjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQogQ1hGQV9GRkltYWdlOjpDWEZBX0ZGSW1hZ2UoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCi0gICAgOiBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KLXsNCisgICAgOiBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZJbWFnZTo6fkNYRkFfRkZJbWFnZSgpIHsNCisgIENYRkFfRkZJbWFnZTo6VW5sb2FkV2lkZ2V0KCk7DQogfQ0KLUNYRkFfRkZJbWFnZTo6fkNYRkFfRkZJbWFnZSgpDQotew0KLSAgICBDWEZBX0ZGSW1hZ2U6OlVubG9hZFdpZGdldCgpOw0KK0ZYX0JPT0wgQ1hGQV9GRkltYWdlOjpJc0xvYWRlZCgpIHsNCisgIHJldHVybiBHZXREYXRhQWNjKCktPkdldEltYWdlSW1hZ2UoKSAhPSBOVUxMOw0KIH0NCi1GWF9CT09MIENYRkFfRkZJbWFnZTo6SXNMb2FkZWQoKQ0KLXsNCi0gICAgcmV0dXJuIEdldERhdGFBY2MoKS0+R2V0SW1hZ2VJbWFnZSgpICE9IE5VTEw7DQorRlhfQk9PTCBDWEZBX0ZGSW1hZ2U6OkxvYWRXaWRnZXQoKSB7DQorICBpZiAoR2V0RGF0YUFjYygpLT5HZXRJbWFnZUltYWdlKCkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBHZXREYXRhQWNjKCktPkxvYWRJbWFnZUltYWdlKCk7DQorICByZXR1cm4gQ1hGQV9GRkRyYXc6OkxvYWRXaWRnZXQoKTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGSW1hZ2U6OkxvYWRXaWRnZXQoKQ0KLXsNCi0gICAgaWYgKEdldERhdGFBY2MoKS0+R2V0SW1hZ2VJbWFnZSgpKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCit2b2lkIENYRkFfRkZJbWFnZTo6VW5sb2FkV2lkZ2V0KCkgew0KKyAgR2V0RGF0YUFjYygpLT5TZXRJbWFnZUltYWdlKE5VTEwpOw0KK30NCit2b2lkIENYRkFfRkZJbWFnZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgIGlmIChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IEdldERhdGFBY2MoKS0+R2V0SW1hZ2VJbWFnZSgpKSB7DQorICAgIENGWF9SZWN0RiBydEltYWdlOw0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEltYWdlKTsNCisgICAgaWYgKENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCkpIHsNCisgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0SW1hZ2UsIG1nV2lkZ2V0KTsNCiAgICAgfQ0KLSAgICBHZXREYXRhQWNjKCktPkxvYWRJbWFnZUltYWdlKCk7DQotICAgIHJldHVybiBDWEZBX0ZGRHJhdzo6TG9hZFdpZGdldCgpOw0KLX0NCi12b2lkIENYRkFfRkZJbWFnZTo6VW5sb2FkV2lkZ2V0KCkNCi17DQotICAgIEdldERhdGFBY2MoKS0+U2V0SW1hZ2VJbWFnZShOVUxMKTsNCi19DQotdm9pZCBDWEZBX0ZGSW1hZ2U6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCAsIEZYX0RXT1JEIGR3U3RhdHVzICwgaW50MzJfdCBpUm90YXRlICkNCi17DQotICAgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQotICAgICAgICByZXR1cm47DQorICAgIGludDMyX3QgaUhvcnpBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ7DQorICAgIGludDMyX3QgaVZlcnRBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsNCisgICAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQorICAgICAgaUhvcnpBbGlnbiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7DQorICAgICAgaVZlcnRBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KICAgICB9DQotICAgIENGWF9NYXRyaXggbXRSb3RhdGU7DQotICAgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOw0KLSAgICBpZiAoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBHZXREYXRhQWNjKCktPkdldEltYWdlSW1hZ2UoKSkgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0SW1hZ2U7DQotICAgICAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEltYWdlKTsNCi0gICAgICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQotICAgICAgICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihydEltYWdlLCBtZ1dpZGdldCk7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlIb3J6QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Ow0KLSAgICAgICAgaW50MzJfdCBpVmVydEFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fVG9wOw0KLSAgICAgICAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQotICAgICAgICAgICAgaUhvcnpBbGlnbiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7DQotICAgICAgICAgICAgaVZlcnRBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9WYWx1ZSB2YWx1ZSA9IG1fcERhdGFBY2MtPkdldEZvcm1WYWx1ZSgpOw0KLSAgICAgICAgQ1hGQV9JbWFnZSBpbWFnZU9iaiA9IHZhbHVlLkdldEltYWdlKCk7DQotICAgICAgICBpbnQzMl90IGlBc3BlY3QgPSBpbWFnZU9iai5HZXRBc3BlY3QoKTsNCi0gICAgICAgIGludDMyX3QgaUltYWdlWERwaSA9IDA7DQotICAgICAgICBpbnQzMl90IGlJbWFnZVlEcGkgPSAwOw0KLSAgICAgICAgbV9wRGF0YUFjYy0+R2V0SW1hZ2VEcGkoaUltYWdlWERwaSwgaUltYWdlWURwaSk7DQotICAgICAgICBYRkFfRHJhd0ltYWdlKHBHUywgcnRJbWFnZSwgJm10Um90YXRlLCBwRElCaXRtYXAsIGlBc3BlY3QsIGlJbWFnZVhEcGksIGlJbWFnZVlEcGksIGlIb3J6QWxpZ24sIGlWZXJ0QWxpZ24pOw0KLSAgICB9DQorICAgIENYRkFfVmFsdWUgdmFsdWUgPSBtX3BEYXRhQWNjLT5HZXRGb3JtVmFsdWUoKTsNCisgICAgQ1hGQV9JbWFnZSBpbWFnZU9iaiA9IHZhbHVlLkdldEltYWdlKCk7DQorICAgIGludDMyX3QgaUFzcGVjdCA9IGltYWdlT2JqLkdldEFzcGVjdCgpOw0KKyAgICBpbnQzMl90IGlJbWFnZVhEcGkgPSAwOw0KKyAgICBpbnQzMl90IGlJbWFnZVlEcGkgPSAwOw0KKyAgICBtX3BEYXRhQWNjLT5HZXRJbWFnZURwaShpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgICAgWEZBX0RyYXdJbWFnZShwR1MsIHJ0SW1hZ2UsICZtdFJvdGF0ZSwgcERJQml0bWFwLCBpQXNwZWN0LCBpSW1hZ2VYRHBpLA0KKyAgICAgICAgICAgICAgICAgIGlJbWFnZVlEcGksIGlIb3J6QWxpZ24sIGlWZXJ0QWxpZ24pOw0KKyAgfQ0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZS5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2UuaAppbmRleCBkZDc4NTcyLi45OGJjNjNlIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZS5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmgKQEAgLTYsMTQgKzYsMTYgQEAKIA0KICNpZm5kZWYgX1hGQV9EUkFXX0lNQUdFX0lNUF9IDQogI2RlZmluZSBfWEZBX0RSQVdfSU1BR0VfSU1QX0gNCi1jbGFzcyBDWEZBX0ZGSW1hZ2UgOiBwdWJsaWMgQ1hGQV9GRkRyYXcNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGSW1hZ2UoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQotICAgIHZpcnR1YWwgfkNYRkFfRkZJbWFnZSgpOw0KLSAgICB2aXJ0dWFsCXZvaWQJCQlSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLCBGWF9EV09SRCBkd1N0YXR1cyA9IDAsIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQlJc0xvYWRlZCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlMb2FkV2lkZ2V0KCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVVubG9hZFdpZGdldCgpOw0KK2NsYXNzIENYRkFfRkZJbWFnZSA6IHB1YmxpYyBDWEZBX0ZGRHJhdyB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZJbWFnZShDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgIHZpcnR1YWwgfkNYRkFfRkZJbWFnZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlID0gMCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNMb2FkZWQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2FkV2lkZ2V0KCk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZWVkaXQuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmNwcAppbmRleCAyMWJkOTU4Li42YTQ1YTlmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZWVkaXQuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlZWRpdC5jcHAKQEAgLTEyLDE3NyArMTIsMTcyIEBACiAjaW5jbHVkZSAieGZhX2ZmaW1hZ2VlZGl0LmgiDQogI2luY2x1ZGUgInhmYV9mZmRvY3ZpZXcuaCINCiAjaW5jbHVkZSAieGZhX2ZmZG9jLmgiDQotQ1hGQV9GRkltYWdlRWRpdDo6Q1hGQV9GRkltYWdlRWRpdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KLSAgICA6IENYRkFfRkZGaWVsZChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KLSAgICAsIG1fcE9sZERlbGVnYXRlKE5VTEwpDQotew0KK0NYRkFfRkZJbWFnZUVkaXQ6OkNYRkFfRkZJbWFnZUVkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRkZpZWxkKHBQYWdlVmlldywgcERhdGFBY2MpLCBtX3BPbGREZWxlZ2F0ZShOVUxMKSB7fQ0KK0NYRkFfRkZJbWFnZUVkaXQ6On5DWEZBX0ZGSW1hZ2VFZGl0KCkgew0KKyAgQ1hGQV9GRkltYWdlRWRpdDo6VW5sb2FkV2lkZ2V0KCk7DQogfQ0KLUNYRkFfRkZJbWFnZUVkaXQ6On5DWEZBX0ZGSW1hZ2VFZGl0KCkNCi17DQotICAgIENYRkFfRkZJbWFnZUVkaXQ6OlVubG9hZFdpZGdldCgpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZJbWFnZUVkaXQ6OkxvYWRXaWRnZXQoKQ0KLXsNCi0gICAgQ0ZXTF9QaWN0dXJlQm94KiBwUGljdHVyZUJveCA9IEZYX05FVyBDRldMX1BpY3R1cmVCb3g7DQotICAgIGlmIChwUGljdHVyZUJveCkgew0KLSAgICAgICAgcFBpY3R1cmVCb3gtPkluaXRpYWxpemUoKTsNCi0gICAgfQ0KLSAgICBtX3BOb3JtYWxXaWRnZXQgPSAoQ0ZXTF9XaWRnZXQqKXBQaWN0dXJlQm94Ow0KLSAgICBJRldMX1dpZGdldCogcFdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocFdpZGdldCwgdGhpcywgTlVMTCk7DQotICAgIElGV0xfTm90ZURyaXZlciAqcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocFdpZGdldCwgcFdpZGdldCk7DQotICAgIG1fcE9sZERlbGVnYXRlID0gcFBpY3R1cmVCb3gtPlNldERlbGVnYXRlKHRoaXMpOw0KLSAgICBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldEltYWdlRWRpdEltYWdlKCkgIT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgVXBkYXRlRldMRGF0YSgpOw0KK0ZYX0JPT0wgQ1hGQV9GRkltYWdlRWRpdDo6TG9hZFdpZGdldCgpIHsNCisgIENGV0xfUGljdHVyZUJveCogcFBpY3R1cmVCb3ggPSBGWF9ORVcgQ0ZXTF9QaWN0dXJlQm94Ow0KKyAgaWYgKHBQaWN0dXJlQm94KSB7DQorICAgIHBQaWN0dXJlQm94LT5Jbml0aWFsaXplKCk7DQorICB9DQorICBtX3BOb3JtYWxXaWRnZXQgPSAoQ0ZXTF9XaWRnZXQqKXBQaWN0dXJlQm94Ow0KKyAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCisgIElGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCisgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQsIHBXaWRnZXQpOw0KKyAgbV9wT2xkRGVsZWdhdGUgPSBwUGljdHVyZUJveC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRJbWFnZUVkaXRJbWFnZSgpICE9IE5VTEwpIHsNCiAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBVcGRhdGVGV0xEYXRhKCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDWEZBX0ZGSW1hZ2VFZGl0OjpVbmxvYWRXaWRnZXQoKQ0KLXsNCit2b2lkIENYRkFfRkZJbWFnZUVkaXQ6OlVubG9hZFdpZGdldCgpIHsNCisgIG1fcERhdGFBY2MtPlNldEltYWdlRWRpdEltYWdlKE5VTEwpOw0KKyAgQ1hGQV9GRkZpZWxkOjpVbmxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGSW1hZ2VFZGl0OjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUpIHsNCisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9NYXRyaXggbXRSb3RhdGU7DQorICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOw0KKyAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KKyAgRHJhd0JvcmRlcihwR1MsIGJvcmRlclVJLCBtX3J0VUksICZtdFJvdGF0ZSk7DQorICBSZW5kZXJDYXB0aW9uKHBHUywgJm10Um90YXRlKTsNCisgIGlmIChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IG1fcERhdGFBY2MtPkdldEltYWdlRWRpdEltYWdlKCkpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0SW1hZ2U7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEltYWdlKTsNCisgICAgaW50MzJfdCBpSG9yekFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdDsNCisgICAgaW50MzJfdCBpVmVydEFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fVG9wOw0KKyAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBtX3BEYXRhQWNjLT5HZXRQYXJhKCkpIHsNCisgICAgICBpSG9yekFsaWduID0gcGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKTsNCisgICAgICBpVmVydEFsaWduID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7DQorICAgIH0NCisgICAgaW50MzJfdCBpQXNwZWN0ID0gWEZBX0FUVFJJQlVURUVOVU1fRml0Ow0KKyAgICBpZiAoQ1hGQV9WYWx1ZSB2YWx1ZSA9IG1fcERhdGFBY2MtPkdldEZvcm1WYWx1ZSgpKSB7DQorICAgICAgaWYgKENYRkFfSW1hZ2UgaW1hZ2VPYmogPSB2YWx1ZS5HZXRJbWFnZSgpKSB7DQorICAgICAgICBpQXNwZWN0ID0gaW1hZ2VPYmouR2V0QXNwZWN0KCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGludDMyX3QgaUltYWdlWERwaSA9IDA7DQorICAgIGludDMyX3QgaUltYWdlWURwaSA9IDA7DQorICAgIG1fcERhdGFBY2MtPkdldEltYWdlRWRpdERwaShpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgICAgWEZBX0RyYXdJbWFnZShwR1MsIHJ0SW1hZ2UsICZtdFJvdGF0ZSwgcERJQml0bWFwLCBpQXNwZWN0LCBpSW1hZ2VYRHBpLA0KKyAgICAgICAgICAgICAgICAgIGlJbWFnZVlEcGksIGlIb3J6QWxpZ24sIGlWZXJ0QWxpZ24pOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZJbWFnZUVkaXQ6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoIVB0SW5BY3RpdmVSZWN0KGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgU2V0QnV0dG9uRG93bihUUlVFKTsNCisgIENGV0xfTXNnTW91c2UgbXM7DQorICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOw0KKyAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgIG1zLm1fZnggPSBmeDsNCisgIG1zLm1fZnkgPSBmeTsNCisgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHBQcm92aWRlcigpOw0KKyAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWx0ZXI7DQorICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19JbWFnZUZpbHRlciwgd3NGaWx0ZXIpOw0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1BhdGhBcnJheTsNCisgIHBBcHBQcm92aWRlci0+U2hvd0ZpbGVEaWFsb2cod3NUaXRsZSwgd3NGaWx0ZXIsIHdzUGF0aEFycmF5KTsNCisgIGludDMyX3QgaVNpemUgPSB3c1BhdGhBcnJheS5HZXRTaXplKCk7DQorICBpZiAoaVNpemUgPCAxKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aCA9IHdzUGF0aEFycmF5WzBdOw0KKyAgRlhfU1RSU0laRSBuTGVuID0gd3NGaWxlUGF0aC5HZXRMZW5ndGgoKTsNCisgIEZYX1NUUlNJWkUgbkluZGV4ID0gbkxlbiAtIDE7DQorICB3aGlsZSAobkluZGV4ID4gMCAmJiB3c0ZpbGVQYXRoW25JbmRleF0gIT0gJy4nKSB7DQorICAgIG5JbmRleC0tOw0KKyAgfQ0KKyAgaWYgKG5JbmRleCA8PSAwKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZShMImltYWdlLyIpOw0KKyAgd3NDb250ZW50VHlwZSArPSB3c0ZpbGVQYXRoLlJpZ2h0KG5MZW4gLSBuSW5kZXggLSAxKTsNCisgIHdzQ29udGVudFR5cGUuTWFrZUxvd2VyKCk7DQorICBGWENPREVDX0lNQUdFX1RZUEUgZUltYWdlVHlwZSA9IFhGQV9HZXRJbWFnZVR5cGUod3NDb250ZW50VHlwZSk7DQorICBpZiAoZUltYWdlVHlwZSA9PSBGWENPREVDX0lNQUdFX1VOS05PV04pIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0ltYWdlOw0KKyAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZCh3c0ZpbGVQYXRoKTsNCisgIGlmIChwRmlsZVJlYWQgIT0gTlVMTCkgew0KKyAgICBpbnQzMl90IG5EYXRhU2l6ZSA9IHBGaWxlUmVhZC0+R2V0U2l6ZSgpOw0KKyAgICBpZiAobkRhdGFTaXplID4gMCkgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzQnVmOw0KKyAgICAgIEZYX0NIQVIqIHBJbWFnZUJ1ZmZlciA9IGJzQnVmLkdldEJ1ZmZlcihuRGF0YVNpemUpOw0KKyAgICAgIHBGaWxlUmVhZC0+UmVhZEJsb2NrKHBJbWFnZUJ1ZmZlciwgMCwgbkRhdGFTaXplKTsNCisgICAgICBic0J1Zi5SZWxlYXNlQnVmZmVyKCk7DQorICAgICAgaWYgKCFic0J1Zi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIEZYX0NIQVIqIHBEYXRhID0gWEZBX0Jhc2U2NEVuY29kZShic0J1ZiwgbkRhdGFTaXplKTsNCisgICAgICAgIHdzSW1hZ2UgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBEYXRhKTsNCisgICAgICAgIGlmIChwRGF0YSAhPSBOVUxMKSB7DQorICAgICAgICAgIEZYX0ZyZWUocERhdGEpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KICAgICBtX3BEYXRhQWNjLT5TZXRJbWFnZUVkaXRJbWFnZShOVUxMKTsNCi0gICAgQ1hGQV9GRkZpZWxkOjpVbmxvYWRXaWRnZXQoKTsNCisgICAgcEZpbGVSZWFkLT5SZWxlYXNlKCk7DQorICB9DQorICBtX3BEYXRhQWNjLT5TZXRJbWFnZUVkaXQod3NDb250ZW50VHlwZSwgQ0ZYX1dpZGVTdHJpbmdDKCksIHdzSW1hZ2UpOw0KKyAgbV9wRGF0YUFjYy0+TG9hZEltYWdlRWRpdEltYWdlKCk7DQorICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KKyAgbV9wRG9jVmlldy0+U2V0Q2hhbmdlTWFyaygpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ1hGQV9GRkltYWdlRWRpdDo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ICwgRlhfRFdPUkQgZHdTdGF0dXMgLCBpbnQzMl90IGlSb3RhdGUgKQ0KLXsNCi0gICAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfTWF0cml4IG10Um90YXRlOw0KLSAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCi0gICAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KLSAgICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlKTsNCi0gICAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQotICAgIGlmIChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IG1fcERhdGFBY2MtPkdldEltYWdlRWRpdEltYWdlKCkpIHsNCi0gICAgICAgIENGWF9SZWN0RiBydEltYWdlOw0KLSAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0SW1hZ2UpOw0KLSAgICAgICAgaW50MzJfdCBpSG9yekFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdDsNCi0gICAgICAgIGludDMyX3QgaVZlcnRBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsNCi0gICAgICAgIGlmIChDWEZBX1BhcmEgcGFyYSA9IG1fcERhdGFBY2MtPkdldFBhcmEoKSkgew0KLSAgICAgICAgICAgIGlIb3J6QWxpZ24gPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KLSAgICAgICAgICAgIGlWZXJ0QWxpZ24gPSBwYXJhLkdldFZlcnRpY2FsQWxpZ24oKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaUFzcGVjdCA9IFhGQV9BVFRSSUJVVEVFTlVNX0ZpdDsNCi0gICAgICAgIGlmIChDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCkpIHsNCi0gICAgICAgICAgICBpZiAoQ1hGQV9JbWFnZSBpbWFnZU9iaiA9IHZhbHVlLkdldEltYWdlKCkpIHsNCi0gICAgICAgICAgICAgICAgaUFzcGVjdCA9IGltYWdlT2JqLkdldEFzcGVjdCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaUltYWdlWERwaSA9IDA7DQotICAgICAgICBpbnQzMl90IGlJbWFnZVlEcGkgPSAwOw0KLSAgICAgICAgbV9wRGF0YUFjYy0+R2V0SW1hZ2VFZGl0RHBpKGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOw0KLSAgICAgICAgWEZBX0RyYXdJbWFnZShwR1MsIHJ0SW1hZ2UsICZtdFJvdGF0ZSwgcERJQml0bWFwLCBpQXNwZWN0LCBpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpLCBpSG9yekFsaWduLCBpVmVydEFsaWduKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9GRkltYWdlRWRpdDo6U2V0RldMUmVjdCgpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9SZWN0RiBydFVJTWFyZ2luOw0KKyAgbV9wRGF0YUFjYy0+R2V0VUlNYXJnaW4ocnRVSU1hcmdpbik7DQorICBDRlhfUmVjdEYgcnRJbWFnZShtX3J0VUkpOw0KKyAgcnRJbWFnZS5EZWZsYXRlKHJ0VUlNYXJnaW4ubGVmdCwgcnRVSU1hcmdpbi50b3AsIHJ0VUlNYXJnaW4ud2lkdGgsDQorICAgICAgICAgICAgICAgICAgcnRVSU1hcmdpbi5oZWlnaHQpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRXaWRnZXRSZWN0KHJ0SW1hZ2UpOw0KIH0NCi1GWF9CT09MIENYRkFfRkZJbWFnZUVkaXQ6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoIVB0SW5BY3RpdmVSZWN0KGZ4LCBmeSkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBTZXRCdXR0b25Eb3duKFRSVUUpOw0KLSAgICBDRldMX01zZ01vdXNlIG1zOw0KLSAgICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOw0KLSAgICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KLSAgICBtcy5tX2Z4ID0gZng7DQotICAgIG1zLm1fZnkgPSBmeTsNCi0gICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQotICAgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KLSAgICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQotICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IEdldEFwcFByb3ZpZGVyKCk7DQotICAgIGlmICghcEFwcFByb3ZpZGVyKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0ZpbHRlcjsNCi0gICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfSW1hZ2VGaWx0ZXIsIHdzRmlsdGVyKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1BhdGhBcnJheTsNCi0gICAgcEFwcFByb3ZpZGVyLT5TaG93RmlsZURpYWxvZyh3c1RpdGxlLCB3c0ZpbHRlciwgd3NQYXRoQXJyYXkpOw0KLSAgICBpbnQzMl90IGlTaXplID0gd3NQYXRoQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaVNpemUgPCAxKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVQYXRoID0gd3NQYXRoQXJyYXlbMF07DQotICAgIEZYX1NUUlNJWkUgbkxlbiA9IHdzRmlsZVBhdGguR2V0TGVuZ3RoKCk7DQotICAgIEZYX1NUUlNJWkUgbkluZGV4ID0gbkxlbiAtIDE7DQotICAgIHdoaWxlIChuSW5kZXggPiAwICYmIHdzRmlsZVBhdGhbbkluZGV4XSAhPSAnLicpIHsNCi0gICAgICAgIG5JbmRleC0tOw0KLSAgICB9DQotICAgIGlmIChuSW5kZXggPD0gMCkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZShMImltYWdlLyIpOw0KLSAgICB3c0NvbnRlbnRUeXBlICs9IHdzRmlsZVBhdGguUmlnaHQobkxlbiAtIG5JbmRleCAtIDEpOw0KLSAgICB3c0NvbnRlbnRUeXBlLk1ha2VMb3dlcigpOw0KLSAgICBGWENPREVDX0lNQUdFX1RZUEUgZUltYWdlVHlwZSA9IFhGQV9HZXRJbWFnZVR5cGUod3NDb250ZW50VHlwZSk7DQotICAgIGlmIChlSW1hZ2VUeXBlID09IEZYQ09ERUNfSU1BR0VfVU5LTk9XTikgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NJbWFnZTsNCi0gICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZCh3c0ZpbGVQYXRoKTsNCi0gICAgaWYgKHBGaWxlUmVhZCAhPSBOVUxMKSB7DQotICAgICAgICBpbnQzMl90IG5EYXRhU2l6ZSA9IHBGaWxlUmVhZC0+R2V0U2l6ZSgpOw0KLSAgICAgICAgaWYgKG5EYXRhU2l6ZSA+IDApIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0J1ZjsNCi0gICAgICAgICAgICBGWF9DSEFSKiBwSW1hZ2VCdWZmZXIgPSBic0J1Zi5HZXRCdWZmZXIobkRhdGFTaXplKTsNCi0gICAgICAgICAgICBwRmlsZVJlYWQtPlJlYWRCbG9jayhwSW1hZ2VCdWZmZXIsIDAsIG5EYXRhU2l6ZSk7DQotICAgICAgICAgICAgYnNCdWYuUmVsZWFzZUJ1ZmZlcigpOw0KLSAgICAgICAgICAgIGlmICghYnNCdWYuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIEZYX0NIQVIqIHBEYXRhID0gWEZBX0Jhc2U2NEVuY29kZShic0J1ZiwgbkRhdGFTaXplKTsNCi0gICAgICAgICAgICAgICAgd3NJbWFnZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERhdGEpOw0KLSAgICAgICAgICAgICAgICBpZiAocERhdGEgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShwRGF0YSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBtX3BEYXRhQWNjLT5TZXRJbWFnZUVkaXRJbWFnZShOVUxMKTsNCi0gICAgICAgIHBGaWxlUmVhZC0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIG1fcERhdGFBY2MtPlNldEltYWdlRWRpdCh3c0NvbnRlbnRUeXBlLCBDRlhfV2lkZVN0cmluZ0MoKSwgd3NJbWFnZSk7DQotICAgIG1fcERhdGFBY2MtPkxvYWRJbWFnZUVkaXRJbWFnZSgpOw0KLSAgICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KLSAgICBtX3BEb2NWaWV3LT5TZXRDaGFuZ2VNYXJrKCk7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ1hGQV9GRkltYWdlRWRpdDo6Q29tbWl0RGF0YSgpIHsNCisgIHJldHVybiBUUlVFOw0KIH0NCi12b2lkIENYRkFfRkZJbWFnZUVkaXQ6OlNldEZXTFJlY3QoKQ0KLXsNCi0gICAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfUmVjdEYgcnRVSU1hcmdpbjsNCi0gICAgbV9wRGF0YUFjYy0+R2V0VUlNYXJnaW4ocnRVSU1hcmdpbik7DQotICAgIENGWF9SZWN0RiBydEltYWdlKG1fcnRVSSk7DQotICAgIHJ0SW1hZ2UuRGVmbGF0ZShydFVJTWFyZ2luLmxlZnQsIHJ0VUlNYXJnaW4udG9wLCBydFVJTWFyZ2luLndpZHRoLCBydFVJTWFyZ2luLmhlaWdodCk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0V2lkZ2V0UmVjdChydEltYWdlKTsNCitGWF9CT09MIENYRkFfRkZJbWFnZUVkaXQ6OlVwZGF0ZUZXTERhdGEoKSB7DQorICBtX3BEYXRhQWNjLT5TZXRJbWFnZUVkaXRJbWFnZShOVUxMKTsNCisgIG1fcERhdGFBY2MtPkxvYWRJbWFnZUVkaXRJbWFnZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRkltYWdlRWRpdDo6Q29tbWl0RGF0YSgpDQotew0KLSAgICByZXR1cm4gVFJVRTsNCitpbnQzMl90IENYRkFfRkZJbWFnZUVkaXQ6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGSW1hZ2VFZGl0OjpVcGRhdGVGV0xEYXRhKCkNCi17DQotICAgIG1fcERhdGFBY2MtPlNldEltYWdlRWRpdEltYWdlKE5VTEwpOw0KLSAgICBtX3BEYXRhQWNjLT5Mb2FkSW1hZ2VFZGl0SW1hZ2UoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRldMX0VSUiBDWEZBX0ZGSW1hZ2VFZGl0OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCiB9DQotaW50MzJfdCBDWEZBX0ZGSW1hZ2VFZGl0OjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLX0NCi1GV0xfRVJSCUNYRkFfRkZJbWFnZUVkaXQ6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQgKnBFdmVudCkNCi17DQotICAgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCi0gICAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOw0KLX0NCi1GV0xfRVJSCUNYRkFfRkZJbWFnZUVkaXQ6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK0ZXTF9FUlIgQ1hGQV9GRkltYWdlRWRpdDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlZWRpdC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmgKaW5kZXggOWNhOTkyOC4uYjZiMDMxZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmgKQEAgLTYsMjMgKzYsMjcgQEAKIA0KICNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9JTUFHRUVESVRfSU1QX0gNCiAjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfSU1BR0VFRElUX0lNUF9IDQotY2xhc3MgQ1hGQV9GRkltYWdlRWRpdCA6IHB1YmxpYyBDWEZBX0ZGRmllbGQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGSW1hZ2VFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZGSW1hZ2VFZGl0KCk7DQorY2xhc3MgQ1hGQV9GRkltYWdlRWRpdCA6IHB1YmxpYyBDWEZBX0ZGRmllbGQgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGSW1hZ2VFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRkltYWdlRWRpdCgpOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLCBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCi0gICAgdmlydHVhbAlGWF9CT09MIExvYWRXaWRnZXQoKTsNCi0gICAgdmlydHVhbCB2b2lkCVVubG9hZFdpZGdldCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJT25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UgKnBNZXNzYWdlKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCU9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCA9IE5VTEwpOw0KLXByb3RlY3RlZDoNCi0gICAgdmlydHVhbCB2b2lkCVNldEZXTFJlY3QoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCVVwZGF0ZUZXTERhdGEoKTsNCi0gICAgdmlydHVhbAlGWF9CT09MCUNvbW1pdERhdGEoKTsNCi0gICAgSUZXTF9XaWRnZXREZWxlZ2F0ZQkqbV9wT2xkRGVsZWdhdGU7DQorICB2aXJ0dWFsIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdmlydHVhbCB2b2lkIFNldEZXTFJlY3QoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVcGRhdGVGV0xEYXRhKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ29tbWl0RGF0YSgpOw0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmbm90aWZ5LmNwcAppbmRleCBlYmFmNGIyLi4wZWM5MTkyIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZm5vdGlmeS5jcHAKQEAgLTMwLDU4MiArMzAsNjIwIEBACiAjaW5jbHVkZSAieGZhX3RleHRsYXlvdXQuaCINCiAjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0YWNjLmgiDQogI2luY2x1ZGUgInhmYV9mZm5vdGlmeS5oIg0KLXN0YXRpYyB2b2lkIFhGQV9GRkRlbGV0ZVdpZGdldEFjYyh2b2lkKiBwRGF0YSkNCi17DQotICAgIGlmIChwRGF0YSkgew0KLSAgICAgICAgZGVsZXRlIChDWEZBX1dpZGdldEFjYyopcERhdGE7DQotICAgIH0NCitzdGF0aWMgdm9pZCBYRkFfRkZEZWxldGVXaWRnZXRBY2Modm9pZCogcERhdGEpIHsNCisgIGlmIChwRGF0YSkgew0KKyAgICBkZWxldGUgKENYRkFfV2lkZ2V0QWNjKilwRGF0YTsNCisgIH0NCiB9DQotc3RhdGljIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8gZ3NfWEZBRGVsZXRlV2lkZ2V0QWNjID0ge1hGQV9GRkRlbGV0ZVdpZGdldEFjYywgTlVMTH07DQotQ1hGQV9GRk5vdGlmeTo6Q1hGQV9GRk5vdGlmeShDWEZBX0ZGRG9jKiBwRG9jKQ0KLSAgICA6IG1fcERvYyhwRG9jKQ0KLXsNCitzdGF0aWMgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyBnc19YRkFEZWxldGVXaWRnZXRBY2MgPSB7DQorICAgIFhGQV9GRkRlbGV0ZVdpZGdldEFjYywgTlVMTH07DQorQ1hGQV9GRk5vdGlmeTo6Q1hGQV9GRk5vdGlmeShDWEZBX0ZGRG9jKiBwRG9jKSA6IG1fcERvYyhwRG9jKSB7fQ0KK0NYRkFfRkZOb3RpZnk6On5DWEZBX0ZGTm90aWZ5KCkge30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uUGFnZUV2ZW50KElYRkFfTGF5b3V0UGFnZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QQUdFRVZFTlQgZUV2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtKSB7DQorICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcocFNlbmRlci0+R2V0TGF5b3V0KCkpOw0KKyAgaWYgKCFwRG9jVmlldykgew0KKyAgICByZXR1cm47DQorICB9DQorICBwRG9jVmlldy0+T25QYWdlRXZlbnQocFNlbmRlciwgZUV2ZW50LCAoaW50MzJfdCkodWludHB0cl90KXBQYXJhbSk7DQogfQ0KLUNYRkFfRkZOb3RpZnk6On5DWEZBX0ZGTm90aWZ5KCkNCi17DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpPbk5vZGVFdmVudChDWEZBX05vZGUqIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUVWRU5UIGVFdmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtNCkgew0KKyAgc3dpdGNoIChlRXZlbnQpIHsNCisgICAgY2FzZSBYRkFfTk9ERUVWRU5UX1JlYWR5Og0KKyAgICAgIE9uTm9kZVJlYWR5KHBTZW5kZXIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2luZzoNCisgICAgICBPblZhbHVlQ2hhbmdpbmcocFNlbmRlciwgcFBhcmFtLCBwUGFyYW0yKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZDoNCisgICAgICBPblZhbHVlQ2hhbmdlZChwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIsIHBQYXJhbTMsIHBQYXJhbTQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9OT0RFRVZFTlRfQ2hpbGRBZGRlZDoNCisgICAgICBPbkNoaWxkQWRkZWQocFNlbmRlciwgcFBhcmFtLCBwUGFyYW0yKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTk9ERUVWRU5UX0NoaWxkUmVtb3ZlZDoNCisgICAgICBPbkNoaWxkUmVtb3ZlZChwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRkZOb3RpZnk6Ok9uUGFnZUV2ZW50KElYRkFfTGF5b3V0UGFnZSAqcFNlbmRlciwgWEZBX1BBR0VFVkVOVCBlRXZlbnQsIHZvaWQqIHBQYXJhbSkNCi17DQotICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldyhwU2VuZGVyLT5HZXRMYXlvdXQoKSk7DQotICAgIGlmICghcERvY1ZpZXcpIHsNCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uV2lkZ2V0RGF0YUV2ZW50KENYRkFfV2lkZ2V0RGF0YSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQWRkaXRpb25hbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBBZGRpdGlvbmFsMikgew0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBTZW5kZXI7DQorICBzd2l0Y2ggKGR3RXZlbnQpIHsNCisgICAgY2FzZSBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1BZGRlZDogew0KKyAgICAgIGlmIChwV2lkZ2V0QWNjLT5HZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0KSB7DQogICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgcERvY1ZpZXctPk9uUGFnZUV2ZW50KHBTZW5kZXIsIGVFdmVudCwgKGludDMyX3QpKHVpbnRwdHJfdClwUGFyYW0pOw0KLX0NCi12b2lkIENYRkFfRkZOb3RpZnk6Ok9uTm9kZUV2ZW50KENYRkFfTm9kZSAqcFNlbmRlciwgWEZBX05PREVFVkVOVCBlRXZlbnQsIHZvaWQqIHBQYXJhbSAsIHZvaWQqIHBQYXJhbTIgLCB2b2lkKiBwUGFyYW0zLCB2b2lkKiBwUGFyYW00KQ0KLXsNCi0gICAgc3dpdGNoIChlRXZlbnQpIHsNCi0gICAgICAgIGNhc2UgWEZBX05PREVFVkVOVF9SZWFkeToNCi0gICAgICAgICAgICBPbk5vZGVSZWFkeShwU2VuZGVyKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5naW5nOg0KLSAgICAgICAgICAgIE9uVmFsdWVDaGFuZ2luZyhwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZDoNCi0gICAgICAgICAgICBPblZhbHVlQ2hhbmdlZChwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIsIHBQYXJhbTMsIHBQYXJhbTQpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfTk9ERUVWRU5UX0NoaWxkQWRkZWQ6DQotICAgICAgICAgICAgT25DaGlsZEFkZGVkKHBTZW5kZXIsIHBQYXJhbSwgcFBhcmFtMik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9OT0RFRVZFTlRfQ2hpbGRSZW1vdmVkOg0KLSAgICAgICAgICAgIE9uQ2hpbGRSZW1vdmVkKHBTZW5kZXIsIHBQYXJhbSwgcFBhcmFtMik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZGTm90aWZ5OjpPbldpZGdldERhdGFFdmVudChDWEZBX1dpZGdldERhdGEqIHBTZW5kZXIsIEZYX0RXT1JEIGR3RXZlbnQsIHZvaWQqIHBQYXJhbSAsIHZvaWQqIHBBZGRpdGlvbmFsICwgdm9pZCogcEFkZGl0aW9uYWwyICkNCi17DQotICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwU2VuZGVyOw0KLSAgICBzd2l0Y2ggKGR3RXZlbnQpIHsNCi0gICAgICAgIGNhc2UgWEZBX1dJREdFVEVWRU5UX0xpc3RJdGVtQWRkZWQ6IHsNCi0gICAgICAgICAgICAgICAgaWYgKHBXaWRnZXRBY2MtPkdldFVJVHlwZSgpICE9IFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGF0aWNOb3RpZnkgPSBwV2lkZ2V0QWNjLT5HZXREb2NWaWV3KCktPklzU3RhdGljTm90aWZ5KCk7DQotICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KE5VTEwpOw0KLSAgICAgICAgICAgICAgICBpZiAoIXBXaWRnZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiU3RhdGljTm90aWZ5KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldEFjYy0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPldpZGdldEV2ZW50KHBXaWRnZXQsIHBXaWRnZXRBY2MsIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbUFkZGVkLCBwUGFyYW0sIHBBZGRpdGlvbmFsKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB3aGlsZSAocFdpZGdldCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBXaWRnZXQtPklzTG9hZGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdpZGdldEFjYy0+SXNMaXN0Qm94KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDWEZBX0ZGTGlzdEJveCopcFdpZGdldCktPkluc2VydEl0ZW0oKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYpKGNvbnN0IEZYX1dDSEFSKilwUGFyYW0sIChpbnQzMl90KSh1aW50cHRyX3QpcEFkZGl0aW9uYWwyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENYRkFfRkZDb21ib0JveCopcFdpZGdldCktPkluc2VydEl0ZW0oKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYpKGNvbnN0IEZYX1dDSEFSKilwUGFyYW0sIChpbnQzMl90KSh1aW50cHRyX3QpcEFkZGl0aW9uYWwyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAoYlN0YXRpY05vdGlmeSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXRBY2MtPkdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5XaWRnZXRFdmVudChwV2lkZ2V0LCBwV2lkZ2V0QWNjLCBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1BZGRlZCwgcFBhcmFtLCBwQWRkaXRpb25hbCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0ID0gcFdpZGdldEFjYy0+R2V0TmV4dFdpZGdldChwV2lkZ2V0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX1dJREdFVEVWRU5UX0xpc3RJdGVtUmVtb3ZlZDogew0KLSAgICAgICAgICAgICAgICBpZiAocFdpZGdldEFjYy0+R2V0VUlUeXBlKCkgIT0gWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YXRpY05vdGlmeSA9IHBXaWRnZXRBY2MtPkdldERvY1ZpZXcoKS0+SXNTdGF0aWNOb3RpZnkoKTsNCi0gICAgICAgICAgICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQoTlVMTCk7DQotICAgICAgICAgICAgICAgIGlmICghcFdpZGdldCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJTdGF0aWNOb3RpZnkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0QWNjLT5HZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+V2lkZ2V0RXZlbnQocFdpZGdldCwgcFdpZGdldEFjYywgWEZBX1dJREdFVEVWRU5UX0xpc3RJdGVtUmVtb3ZlZCwgcFBhcmFtLCBwQWRkaXRpb25hbCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgd2hpbGUgKHBXaWRnZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0xvYWRlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBXaWRnZXRBY2MtPklzTGlzdEJveCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1hGQV9GRkxpc3RCb3gqKXBXaWRnZXQpLT5EZWxldGVJdGVtKChpbnQzMl90KSh1aW50cHRyX3QpcFBhcmFtKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENYRkFfRkZDb21ib0JveCopcFdpZGdldCktPkRlbGV0ZUl0ZW0oKGludDMyX3QpKHVpbnRwdHJfdClwUGFyYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChiU3RhdGljTm90aWZ5KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldEFjYy0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPldpZGdldEV2ZW50KHBXaWRnZXQsIHBXaWRnZXRBY2MsIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbVJlbW92ZWQsIHBQYXJhbSwgcEFkZGl0aW9uYWwpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQocFdpZGdldCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi19DQotQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0ZGTm90aWZ5OjpPbkNyZWF0ZUxheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwTm9kZSkNCi17DQotICAgIElYRkFfRG9jTGF5b3V0KiBwTGF5b3V0ID0gbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0RG9jTGF5b3V0KCk7DQotICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldyhwTGF5b3V0KTsNCi0gICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCi0gICAgICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKikoRlhfTkVXIENYRkFfRkZQYWdlVmlldyhwRG9jVmlldywgcE5vZGUpKTsNCi0gICAgfSBlbHNlIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KLSAgICAgICAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKShGWF9ORVcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbChwTm9kZSkpOw0KLSAgICB9DQotICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gKENYRkFfV2lkZ2V0QWNjKilwTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KLSAgICBpZiAoIXBBY2MpIHsNCi0gICAgICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKikoRlhfTkVXIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKHBOb2RlKSk7DQotICAgIH0NCi0gICAgQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcgPSBOVUxMOw0KLSAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsNCi0gICAgc3dpdGNoKHBBY2MtPkdldFVJVHlwZSgpKSB7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JhcmNvZGU6DQotICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGQmFyY29kZShwUGFnZVZpZXcsIHBBY2MpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CdXR0b246DQotICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGUHVzaEJ1dHRvbihwUGFnZVZpZXcsIHBBY2MpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjoNCi0gICAgICAgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZDaGVja0J1dHRvbihwUGFnZVZpZXcsIHBBY2MpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0OiB7DQotICAgICAgICAgICAgICAgIGlmIChwQWNjLT5Jc0xpc3RCb3goKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGTGlzdEJveChwUGFnZVZpZXcsIHBBY2MpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGQ29tYm9Cb3gocFBhZ2VWaWV3LCBwQWNjKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0Og0KLSAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRkRhdGVUaW1lRWRpdChwUGFnZVZpZXcsIHBBY2MpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQ6DQotICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGSW1hZ2VFZGl0KHBQYWdlVmlldywgcEFjYyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0Og0KLSAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRk51bWVyaWNFZGl0KHBQYWdlVmlldywgcEFjYyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdDoNCi0gICAgICAgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZQYXNzd29yZEVkaXQocFBhZ2VWaWV3LCBwQWNjKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU2lnbmF0dXJlOg0KLSAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRlNpZ25hdHVyZShwUGFnZVZpZXcsIHBBY2MpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0RWRpdDoNCi0gICAgICAgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZUZXh0RWRpdChwUGFnZVZpZXcsIHBBY2MpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9BcmM6DQotICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGQXJjKHBQYWdlVmlldywgcEFjYyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0xpbmU6DQotICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGTGluZShwUGFnZVZpZXcsIHBBY2MpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9SZWN0YW5nbGU6DQotICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGUmVjdGFuZ2xlKHBQYWdlVmlldywgcEFjYyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHQ6DQotICAgICAgICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGVGV4dChwUGFnZVZpZXcsIHBBY2MpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZToNCi0gICAgICAgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZJbWFnZShwUGFnZVZpZXcsIHBBY2MpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EcmF3Og0KLSAgICAgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRkRyYXcocFBhZ2VWaWV3LCBwQWNjKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCi0gICAgICAgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZTdWJGb3JtKHBQYWdlVmlldywgcEFjYyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCi0gICAgICAgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZFeGNsR3JvdXAocFBhZ2VWaWV3LCBwQWNjKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGVmYXVsdFVpOg0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBwV2lkZ2V0ID0gTlVMTDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBpZiAoIXBXaWRnZXQpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHBXaWRnZXQtPlNldERvY1ZpZXcocERvY1ZpZXcpOw0KLSAgICByZXR1cm4gcFdpZGdldC0+R2V0TGF5b3V0SXRlbSgpOw0KLX0NCi12b2lkIENYRkFfRkZOb3RpZnk6Ok9uTGF5b3V0RXZlbnQoSVhGQV9Eb2NMYXlvdXQgKnBMYXlvdXQsIENYRkFfTGF5b3V0SXRlbSAqcFNlbmRlciwgWEZBX0xBWU9VVEVWRU5UIGVFdmVudCwgdm9pZCogcFBhcmFtICwgdm9pZCogcFBhcmFtMiApDQotew0KLSAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcocExheW91dCk7DQotICAgIGlmICghcERvY1ZpZXcgfHwgIVhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShwU2VuZGVyKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIHN3aXRjaCAoZUV2ZW50KSB7DQotICAgICAgICBjYXNlIFhGQV9MQVlPVVRFVkVOVF9JdGVtQWRkZWQ6DQotICAgICAgICAgICAgT25MYXlvdXRJdGVtQWRkKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfTEFZT1VURVZFTlRfSXRlbVJlbW92aW5nOg0KLSAgICAgICAgICAgIE9uTGF5b3V0SXRlbVJlbW92aW5nKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfTEFZT1VURVZFTlRfUmVjdENoYW5nZWQ6DQotICAgICAgICAgICAgT25MYXlvdXRJdGVtUmVjdENoYW5nZWQocERvY1ZpZXcsIHBMYXlvdXQsIHBTZW5kZXIsIHBQYXJhbSwgcFBhcmFtMik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9MQVlPVVRFVkVOVF9TdGF0dXNDaGFuZ2VkOg0KLSAgICAgICAgICAgIE9uTGF5b3V0SXRlbVN0YXR1c3RDaGFuZ2VkKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6U3RhcnRGaWVsZERyYXdMYXlvdXQoQ1hGQV9Ob2RlICpwSXRlbSwgRlhfRkxPQVQgJmZDYWxjV2lkdGgsIEZYX0ZMT0FUICZmQ2FsY0hlaWdodCkNCi17DQotICAgIENYRkFfV2lkZ2V0QWNjICpwQWNjID0gKENYRkFfV2lkZ2V0QWNjKilwSXRlbS0+R2V0V2lkZ2V0RGF0YSgpOw0KLSAgICBpZiAoIXBBY2MpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwQWNjLT5TdGFydFdpZGdldExheW91dChmQ2FsY1dpZHRoLCBmQ2FsY0hlaWdodCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRk5vdGlmeTo6RmluZFNwbGl0UG9zKENYRkFfTm9kZSAqcEl0ZW0sIGludDMyX3QgaUJsb2NrSW5kZXgsIEZYX0ZMT0FUICZmQ2FsY0hlaWdodFBvcykNCi17DQotICAgIENYRkFfV2lkZ2V0QWNjICpwQWNjID0gKENYRkFfV2lkZ2V0QWNjKilwSXRlbS0+R2V0V2lkZ2V0RGF0YSgpOw0KLSAgICBpZiAoIXBBY2MpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gKFhGQV9MQVlPVVRSRVNVTFQpcEFjYy0+RmluZFNwbGl0UG9zKGlCbG9ja0luZGV4LCBmQ2FsY0hlaWdodFBvcyk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRk5vdGlmeTo6UnVuU2NyaXB0KENYRkFfTm9kZSogcFNjcmlwdCwgQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0pDQotew0KLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCi0gICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQotICAgIGlmICghcERvY1ZpZXcpIHsNCi0gICAgICAgIHJldHVybiBiUmV0Ow0KLSAgICB9DQotICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwRm9ybUl0ZW0tPkdldFdpZGdldERhdGEoKTsNCi0gICAgaWYgKCFwV2lkZ2V0QWNjKSB7DQotICAgICAgICByZXR1cm4gYlJldDsNCi0gICAgfQ0KLSAgICBDWEZBX0V2ZW50UGFyYW0gRXZlbnRQYXJhbTsNCi0gICAgRXZlbnRQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX1Vua25vd247DQotICAgIEZYSlNFX0hWQUxVRSBwUmV0VmFsdWUgPSBOVUxMOw0KLSAgICBpbnQzMl90IGlSZXQgPSBwV2lkZ2V0QWNjLT5FeGVjdXRlU2NyaXB0KENYRkFfU2NyaXB0KHBTY3JpcHQpLCAmRXZlbnRQYXJhbSwgJnBSZXRWYWx1ZSk7DQotICAgIGlmIChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2VzcyAmJiBwUmV0VmFsdWUpIHsNCi0gICAgICAgIGJSZXQgPSBGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4ocFJldFZhbHVlKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocFJldFZhbHVlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gYlJldDsNCi19DQotaW50MzJfdCBDWEZBX0ZGTm90aWZ5OjpFeGVjRXZlbnRCeURlZXBGaXJzdChDWEZBX05vZGUqIHBGb3JtTm9kZSwgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlLCBGWF9CT09MIGJJc0Zvcm1SZWFkeSwgRlhfQk9PTCBiUmVjdXJzaXZlLCBDWEZBX1dpZGdldEFjYyogcEV4Y2x1ZGUpDQotew0KLSAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCi0gICAgaWYgKCFwRG9jVmlldykgew0KLSAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KLSAgICB9DQotICAgIHJldHVybiBwRG9jVmlldy0+RXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwRm9ybU5vZGUsIGVFdmVudFR5cGUsIGJJc0Zvcm1SZWFkeSwgYlJlY3Vyc2l2ZSwgcEV4Y2x1ZGUgPyBwRXhjbHVkZS0+R2V0Tm9kZSgpIDogTlVMTCk7DQotfQ0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6QWRkQ2FsY1ZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpDQotew0KLSAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCi0gICAgaWYgKCFwRG9jVmlldykgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KLSAgICBpZiAoIXBXaWRnZXRBY2MpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHBXaWRnZXRBY2MpOw0KLSAgICBwRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQocFdpZGdldEFjYyk7DQotfQ0KLUlYRkFfRG9jKiBDWEZBX0ZGTm90aWZ5OjpHZXRIRE9DKCkNCi17DQotICAgIHJldHVybiBtX3BEb2M7DQotfQ0KLUlYRkFfRG9jUHJvdmlkZXIqIENYRkFfRkZOb3RpZnk6OkdldERvY1Byb3ZpZGVyKCkNCi17DQotICAgIHJldHVybiBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCk7DQotfQ0KLUlYRkFfQXBwUHJvdmlkZXIqIENYRkFfRkZOb3RpZnk6OkdldEFwcFByb3ZpZGVyKCkNCi17DQotICAgIHJldHVybiBtX3BEb2MtPkdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOw0KLX0NCi1JWEZBX1dpZGdldEhhbmRsZXIqIENYRkFfRkZOb3RpZnk6OkdldFdpZGdldEhhbmRsZXIoKQ0KLXsNCi0gICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQotICAgIHJldHVybiBwRG9jVmlldyA/IHBEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCkgOiBOVUxMOw0KLX0NCi1JWEZBX1dpZGdldCogQ1hGQV9GRk5vdGlmeTo6R2V0SFdpZGdldChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKQ0KLXsNCi0gICAgcmV0dXJuIFhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShwTGF5b3V0SXRlbSk7DQotfQ0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6T3BlbkRyb3BEb3duTGlzdChJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSAoQ1hGQV9GRldpZGdldCopaFdpZGdldDsNCi0gICAgaWYgKHBXaWRnZXQtPkdldERhdGFBY2MoKS0+R2V0VUlUeXBlKCkgIT0gWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KLSAgICBwRG9jVmlldy0+TG9ja1VwZGF0ZSgpOw0KLSAgICAoKENYRkFfRkZDb21ib0JveCopcFdpZGdldCktPk9wZW5Ecm9wRG93bkxpc3QoKTsNCi0gICAgcERvY1ZpZXctPlVubG9ja1VwZGF0ZSgpOw0KLSAgICBwRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KLX0NCi1DRlhfV2lkZVN0cmluZyBDWEZBX0ZGTm90aWZ5OjpHZXRDdXJyZW50RGF0ZVRpbWUoKQ0KLXsNCi0gICAgQ0ZYX1VuaXRpbWUgZGF0YVRpbWU7DQotICAgIGRhdGFUaW1lLk5vdygpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGVUaW1lOw0KLSAgICB3c0RhdGVUaW1lLkZvcm1hdChMIiVkJTAyZCUwMmRUJTAyZCUwMmQlMDJkIiwgZGF0YVRpbWUuR2V0WWVhcigpLCBkYXRhVGltZS5HZXRNb250aCgpLCBkYXRhVGltZS5HZXREYXkoKSwgZGF0YVRpbWUuR2V0SG91cigpLCBkYXRhVGltZS5HZXRNaW51dGUoKSwgZGF0YVRpbWUuR2V0U2Vjb25kKCkpOw0KLSAgICByZXR1cm4gd3NEYXRlVGltZTsNCi19DQotdm9pZCBDWEZBX0ZGTm90aWZ5OjpSZXNldERhdGEoQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSkNCi17DQotICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KLSAgICBpZiAoIXBEb2NWaWV3KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgcERvY1ZpZXctPlJlc2V0V2lkZ2V0RGF0YSgoQ1hGQV9XaWRnZXRBY2MqKXBXaWRnZXREYXRhKTsNCi19DQotaW50MzJfdCBDWEZBX0ZGTm90aWZ5OjpHZXRMYXlvdXRTdGF0dXMoKQ0KLXsNCi0gICAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQotICAgIHJldHVybiBwRG9jVmlldyA/IHBEb2NWaWV3LT5HZXRMYXlvdXRTdGF0dXMoKSA6IDA7DQotfQ0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6UnVuTm9kZUluaXRpYWxpemUoQ1hGQV9Ob2RlKiBwTm9kZSkNCi17DQotICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KLSAgICBpZiAoIXBEb2NWaWV3KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgcERvY1ZpZXctPkFkZE5ld0Zvcm1Ob2RlKHBOb2RlKTsNCi19DQotdm9pZCBDWEZBX0ZGTm90aWZ5OjpSdW5TdWJmb3JtSW5kZXhDaGFuZ2UoQ1hGQV9Ob2RlKiBwU3ViZm9ybU5vZGUpDQotew0KLSAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCi0gICAgaWYgKCFwRG9jVmlldykgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIHBEb2NWaWV3LT5BZGRJbmRleENoYW5nZWRTdWJmb3JtKHBTdWJmb3JtTm9kZSk7DQotfQ0KLUNYRkFfTm9kZSogQ1hGQV9GRk5vdGlmeTo6R2V0Rm9jdXNXaWRnZXROb2RlKCkNCi17DQotICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KLSAgICBpZiAoIXBEb2NWaWV3KSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBEb2NWaWV3LT5HZXRGb2N1c1dpZGdldEFjYygpOw0KLSAgICByZXR1cm4gcEFjYyA/IHBBY2MtPkdldE5vZGUoKSA6IE5VTEw7DQotfQ0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6U2V0Rm9jdXNXaWRnZXROb2RlKENYRkFfTm9kZSogcE5vZGUpDQotew0KLSAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCi0gICAgaWYgKCFwRG9jVmlldykgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcE5vZGUgPyAoQ1hGQV9XaWRnZXRBY2MqKXBOb2RlLT5HZXRXaWRnZXREYXRhKCkgOiBOVUxMOw0KLSAgICBwRG9jVmlldy0+U2V0Rm9jdXNXaWRnZXRBY2MocEFjYyk7DQotfQ0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6T25Ob2RlUmVhZHkoQ1hGQV9Ob2RlICpwTm9kZSkNCi17DQotICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KLSAgICBpZiAoIXBEb2NWaWV3KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgWEZBX0VMRU1FTlQgaVR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAoWEZBX0lzQ3JlYXRlV2lkZ2V0KGlUeXBlKSkgew0KLSAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBGWF9ORVcgQ1hGQV9XaWRnZXRBY2MocERvY1ZpZXcsIChDWEZBX05vZGUqKXBOb2RlKTsNCi0gICAgICAgIHBOb2RlLT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9XaWRnZXREYXRhLCBwQWNjLCAmZ3NfWEZBRGVsZXRlV2lkZ2V0QWNjKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKGlUeXBlKSB7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JpbmRJdGVtczoNCi0gICAgICAgICAgICBwRG9jVmlldy0+bV9iaW5kSXRlbXMuQWRkKHBOb2RlKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVmFsaWRhdGU6IHsNCi0gICAgICAgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX05lZWRzSW5pdEFwcCwgVFJVRSwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZGTm90aWZ5OjpPblZhbHVlQ2hhbmdpbmcoQ1hGQV9Ob2RlICpwU2VuZGVyLCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBQYXJhbTIpDQotew0KLSAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCi0gICAgaWYgKCFwRG9jVmlldykgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPCBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfRFdPUkQgZHdQYWNrZXQgPSBwU2VuZGVyLT5HZXRQYWNrZXRJRCgpOw0KLSAgICBpZiAoZHdQYWNrZXQgJiBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQotICAgIH0gZWxzZSBpZiAocFNlbmRlci0+SXNGb3JtQ29udGFpbmVyKCkpIHsNCi0gICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHIgPSAoWEZBX0FUVFJJQlVURSkodWludHB0cl90KXBQYXJhbTsNCi0gICAgICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ByZXNlbmNlKSB7DQotICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBTZW5kZXItPkdldFdpZGdldERhdGEoKTsNCi0gICAgICAgICAgICBpZiAoIXBXaWRnZXRBY2MpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsNCi0gICAgICAgICAgICB3aGlsZSAoKHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0xvYWRlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0LT5BZGRJbnZhbGlkYXRlUmVjdCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBGWF9CT09MIGJTdGF0aWNOb3RpZnkgPSBwV2lkZ2V0QWNjLT5HZXREb2NWaWV3KCktPklzU3RhdGljTm90aWZ5KCk7DQorICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQoTlVMTCk7DQorICAgICAgaWYgKCFwV2lkZ2V0KSB7DQorICAgICAgICBpZiAoYlN0YXRpY05vdGlmeSkgew0KKyAgICAgICAgICBwV2lkZ2V0QWNjLT5HZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+V2lkZ2V0RXZlbnQoDQorICAgICAgICAgICAgICBwV2lkZ2V0LCBwV2lkZ2V0QWNjLCBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1BZGRlZCwgcFBhcmFtLA0KKyAgICAgICAgICAgICAgcEFkZGl0aW9uYWwpOw0KICAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6T25WYWx1ZUNoYW5nZWQoQ1hGQV9Ob2RlICpwU2VuZGVyLCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBQYXJhbTIsIHZvaWQqIHBQYXJhbTMsIHZvaWQqIHBQYXJhbTQpDQotew0KLSAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCi0gICAgaWYgKCFwRG9jVmlldykgew0KICAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3UGFja2V0ID0gcFNlbmRlci0+R2V0UGFja2V0SUQoKTsNCi0gICAgWEZBX0FUVFJJQlVURSBlQXR0ciA9IChYRkFfQVRUUklCVVRFKSh1aW50cHRyX3QpcFBhcmFtOw0KLSAgICBpZiAoZHdQYWNrZXQgJiBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCi0gICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSAoQ1hGQV9Ob2RlKilwUGFyYW0zOw0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0Tm9kZSA9IChDWEZBX05vZGUqKXBQYXJhbTQ7DQotICAgICAgICBYRkFfRUxFTUVOVCBlUFR5cGUgPSBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICAgICAgRlhfQk9PTCBiSXNDb250YWluZXJOb2RlID0gcFBhcmVudE5vZGUtPklzQ29udGFpbmVyTm9kZSgpOw0KLSAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBXaWRnZXROb2RlLT5HZXRXaWRnZXREYXRhKCk7DQotICAgICAgICBpZiAoIXBXaWRnZXRBY2MpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBGWF9CT09MIGJVcGRhdGVQcm9wZXJ0eSA9IEZBTFNFOw0KLSAgICAgICAgcERvY1ZpZXctPlNldENoYW5nZU1hcmsoKTsNCi0gICAgICAgIHN3aXRjaCAoZVBUeXBlKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DYXB0aW9uOiB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX1RleHRMYXlvdXQqIHBDYXBPdXQgPSBwV2lkZ2V0QWNjLT5HZXRDYXB0aW9uVGV4dExheW91dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwQ2FwT3V0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcENhcE91dC0+VW5sb2FkKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9VaToNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1BhcmE6DQotICAgICAgICAgICAgICAgIGJVcGRhdGVQcm9wZXJ0eSA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRm9udDoNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX01hcmdpbjoNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1ZhbHVlOg0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSXRlbXM6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJJc0NvbnRhaW5lck5vZGUgJiYgZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9BY2Nlc3MpIHsNCi0gICAgICAgICAgICBiVXBkYXRlUHJvcGVydHkgPSBUUlVFOw0KLSAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IHBEb2NWaWV3LT5Jc1N0YXRpY05vdGlmeSgpOw0KLSAgICAgICAgICAgIGlmIChiTm90aWZ5KSB7DQotICAgICAgICAgICAgICAgIHBXaWRnZXRBY2MtPk5vdGlmeUV2ZW50KFhGQV9XSURHRVRFVkVOVF9BY2Nlc3NDaGFuZ2VkLCBOVUxMLCBwUGFyYW0yLCBOVUxMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkgew0KLSAgICAgICAgICAgIHBEb2NWaWV3LT5BZGRDYWxjdWxhdGVOb2RlTm90aWZ5KHBTZW5kZXIpOw0KLSAgICAgICAgICAgIGlmIChlUFR5cGUgPT0gWEZBX0VMRU1FTlRfVmFsdWUgfHwgYklzQ29udGFpbmVyTm9kZSkgew0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBwRG9jVmlldy0+SXNTdGF0aWNOb3RpZnkoKTsNCi0gICAgICAgICAgICAgICAgaWYgKGJJc0NvbnRhaW5lck5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXRBY2MtPlVwZGF0ZVVJRGlzcGxheSgpOw0KLSAgICAgICAgICAgICAgICAgICAgcERvY1ZpZXctPkFkZENhbGN1bGF0ZVdpZGdldEFjYyhwV2lkZ2V0QWNjKTsNCi0gICAgICAgICAgICAgICAgICAgIHBEb2NWaWV3LT5BZGRWYWxpZGF0ZVdpZGdldChwV2lkZ2V0QWNjKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwV2lkZ2V0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXRBY2MtPlVwZGF0ZVVJRGlzcGxheSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5KSB7DQotICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0QWNjLT5Ob3RpZnlFdmVudChYRkFfV0lER0VURVZFTlRfUG9zdENvbnRlbnRDaGFuZ2VkLCBOVUxMLCBOVUxMLCBOVUxMKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IE5VTEw7DQotICAgICAgICB3aGlsZSAoKHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgaWYgKCFwV2lkZ2V0LT5Jc0xvYWRlZCgpKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoYlVwZGF0ZVByb3BlcnR5KSB7DQotICAgICAgICAgICAgICAgIHBXaWRnZXQtPlVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBXaWRnZXQtPkxheW91dFdpZGdldCgpOw0KLSAgICAgICAgICAgIHBXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KCk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkgew0KLSAgICAgICAgICAgIHBEb2NWaWV3LT5BZGRDYWxjdWxhdGVOb2RlTm90aWZ5KHBTZW5kZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6T25DaGlsZEFkZGVkKENYRkFfTm9kZSAqcFNlbmRlciwgdm9pZCogcFBhcmFtLCB2b2lkKiBwUGFyYW0yKQ0KLXsNCi0gICAgaWYgKCFwU2VuZGVyLT5Jc0Zvcm1Db250YWluZXIoKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KLSAgICBpZiAoIXBEb2NWaWV3KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfQk9PTCBiTGF5b3V0UmVhZHkgPSAhKHBEb2NWaWV3LT5tX2JJbkxheW91dFN0YXR1cykgJiYgKHBEb2NWaWV3LT5HZXRMYXlvdXRTdGF0dXMoKSA+PSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kKTsNCi0gICAgaWYgKGJMYXlvdXRSZWFkeSkgew0KLSAgICAgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5TZXRDaGFuZ2VNYXJrKG1fcERvYyk7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZGTm90aWZ5OjpPbkNoaWxkUmVtb3ZlZChDWEZBX05vZGUgKnBTZW5kZXIsIHZvaWQqIHBQYXJhbSwgdm9pZCogcFBhcmFtMikNCi17DQotICAgIGlmIChDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKSkgew0KLSAgICAgICAgRlhfQk9PTCBiTGF5b3V0UmVhZHkgPSAhKHBEb2NWaWV3LT5tX2JJbkxheW91dFN0YXR1cykgJiYgKHBEb2NWaWV3LT5HZXRMYXlvdXRTdGF0dXMoKSA+PSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kKTsNCi0gICAgICAgIGlmIChiTGF5b3V0UmVhZHkpIHsNCi0gICAgICAgICAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPlNldENoYW5nZU1hcmsobV9wRG9jKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRkZOb3RpZnk6Ok9uTGF5b3V0SXRlbUFkZChDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIElYRkFfRG9jTGF5b3V0ICpwTGF5b3V0LCBDWEZBX0xheW91dEl0ZW0gKnBTZW5kZXIsIHZvaWQqIHBQYXJhbSwgdm9pZCogcFBhcmFtMikNCi17DQotICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSAoQ1hGQV9GRldpZGdldCopKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwU2VuZGVyOw0KLSAgICBpbnQzMl90IGlQYWdlSWR4ID0gKGludDMyX3QpKHVpbnRwdHJfdClwUGFyYW07DQotICAgIElYRkFfUGFnZVZpZXcqIHBOZXdQYWdlVmlldyA9IHBEb2NWaWV3LT5HZXRQYWdlVmlldyhpUGFnZUlkeCk7DQotICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpcFBhcmFtMjsNCi0gICAgRlhfRFdPUkQgZHdGaWx0ZXIgPSBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUgfCBYRkFfV0lER0VUU1RBVFVTX1ZpZXdhYmxlIHwgWEZBX1dJREdFVFNUQVRVU19QcmludGFibGU7DQotICAgIHBXaWRnZXQtPk1vZGlmeVN0YXR1cyhkd1N0YXR1cywgZHdGaWx0ZXIpOw0KLSAgICBpZiAocERvY1ZpZXctPkdldExheW91dFN0YXR1cygpID49IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpIHsNCi0gICAgICAgIElYRkFfUGFnZVZpZXcqIHBQcmVQYWdlVmlldyA9IHBXaWRnZXQtPkdldFBhZ2VWaWV3KCk7DQotICAgICAgICBpZiAocFByZVBhZ2VWaWV3ICE9IHBOZXdQYWdlVmlldyB8fCAoZHdTdGF0dXMgJiAoWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlIHwgWEZBX1dJREdFVFNUQVRVU19WaWV3YWJsZSkpID09IChYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUgfCBYRkFfV0lER0VUU1RBVFVTX1ZpZXdhYmxlKSkgew0KLSAgICAgICAgICAgIHBXaWRnZXQtPlNldFBhZ2VWaWV3KHBOZXdQYWdlVmlldyk7DQotICAgICAgICAgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5XaWRnZXRFdmVudChwV2lkZ2V0LCBwV2lkZ2V0LT5HZXREYXRhQWNjKCksIFhGQV9XSURHRVRFVkVOVF9Qb3N0QWRkZWQsIHBOZXdQYWdlVmlldywgcFByZVBhZ2VWaWV3KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICgoZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpID09IDApIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHdoaWxlIChwV2lkZ2V0KSB7DQogICAgICAgICBpZiAocFdpZGdldC0+SXNMb2FkZWQoKSkgew0KLSAgICAgICAgICAgIENGWF9SZWN0RiBydE9sZDsNCi0gICAgICAgICAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0T2xkKTsNCi0gICAgICAgICAgICBDRlhfUmVjdEYgcnROZXcgPSBwV2lkZ2V0LT5SZUNhY2hlV2lkZ2V0UmVjdCgpOw0KLSAgICAgICAgICAgIGlmKHJ0T2xkICE9IHJ0TmV3KSB7DQotICAgICAgICAgICAgICAgIHBXaWRnZXQtPkxheW91dFdpZGdldCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcFdpZGdldC0+TG9hZFdpZGdldCgpOw0KKyAgICAgICAgICBpZiAocFdpZGdldEFjYy0+SXNMaXN0Qm94KCkpIHsNCisgICAgICAgICAgICAoKENYRkFfRkZMaXN0Qm94KilwV2lkZ2V0KQ0KKyAgICAgICAgICAgICAgICAtPkluc2VydEl0ZW0oKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYpKGNvbnN0IEZYX1dDSEFSKilwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkodWludHB0cl90KXBBZGRpdGlvbmFsMik7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgKChDWEZBX0ZGQ29tYm9Cb3gqKXBXaWRnZXQpDQorICAgICAgICAgICAgICAgIC0+SW5zZXJ0SXRlbSgoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJikoY29uc3QgRlhfV0NIQVIqKXBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSh1aW50cHRyX3QpcEFkZGl0aW9uYWwyKTsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoTlVMTCk7DQorICAgICAgICBpZiAoYlN0YXRpY05vdGlmeSkgew0KKyAgICAgICAgICBwV2lkZ2V0QWNjLT5HZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+V2lkZ2V0RXZlbnQoDQorICAgICAgICAgICAgICBwV2lkZ2V0LCBwV2lkZ2V0QWNjLCBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1BZGRlZCwgcFBhcmFtLA0KKyAgICAgICAgICAgICAgcEFkZGl0aW9uYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQocFdpZGdldCk7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbVJlbW92ZWQ6IHsNCisgICAgICBpZiAocFdpZGdldEFjYy0+R2V0VUlUeXBlKCkgIT0gWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBGWF9CT09MIGJTdGF0aWNOb3RpZnkgPSBwV2lkZ2V0QWNjLT5HZXREb2NWaWV3KCktPklzU3RhdGljTm90aWZ5KCk7DQorICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQoTlVMTCk7DQorICAgICAgaWYgKCFwV2lkZ2V0KSB7DQorICAgICAgICBpZiAoYlN0YXRpY05vdGlmeSkgew0KKyAgICAgICAgICBwV2lkZ2V0QWNjLT5HZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+V2lkZ2V0RXZlbnQoDQorICAgICAgICAgICAgICBwV2lkZ2V0LCBwV2lkZ2V0QWNjLCBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1SZW1vdmVkLCBwUGFyYW0sDQorICAgICAgICAgICAgICBwQWRkaXRpb25hbCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIHdoaWxlIChwV2lkZ2V0KSB7DQorICAgICAgICBpZiAocFdpZGdldC0+SXNMb2FkZWQoKSkgew0KKyAgICAgICAgICBpZiAocFdpZGdldEFjYy0+SXNMaXN0Qm94KCkpIHsNCisgICAgICAgICAgICAoKENYRkFfRkZMaXN0Qm94KilwV2lkZ2V0KS0+RGVsZXRlSXRlbSgoaW50MzJfdCkodWludHB0cl90KXBQYXJhbSk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgKChDWEZBX0ZGQ29tYm9Cb3gqKXBXaWRnZXQpLT5EZWxldGVJdGVtKChpbnQzMl90KSh1aW50cHRyX3QpcFBhcmFtKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJTdGF0aWNOb3RpZnkpIHsNCisgICAgICAgICAgcFdpZGdldEFjYy0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPldpZGdldEV2ZW50KA0KKyAgICAgICAgICAgICAgcFdpZGdldCwgcFdpZGdldEFjYywgWEZBX1dJREdFVEVWRU5UX0xpc3RJdGVtUmVtb3ZlZCwgcFBhcmFtLA0KKyAgICAgICAgICAgICAgcEFkZGl0aW9uYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQocFdpZGdldCk7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgfQ0KK30NCitDWEZBX0xheW91dEl0ZW0qIENYRkFfRkZOb3RpZnk6Ok9uQ3JlYXRlTGF5b3V0SXRlbShDWEZBX05vZGUqIHBOb2RlKSB7DQorICBJWEZBX0RvY0xheW91dCogcExheW91dCA9IG1fcERvYy0+R2V0WEZBRG9jKCktPkdldERvY0xheW91dCgpOw0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KHBMYXlvdXQpOw0KKyAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKikoRlhfTkVXIENYRkFfRkZQYWdlVmlldyhwRG9jVmlldywgcE5vZGUpKTsNCisgIH0gZWxzZSBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCisgICAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKShGWF9ORVcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbChwTm9kZSkpOw0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBOb2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBBY2MpIHsNCisgICAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKShGWF9ORVcgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwocE5vZGUpKTsNCisgIH0NCisgIENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3ID0gTlVMTDsNCisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBOVUxMOw0KKyAgc3dpdGNoIChwQWNjLT5HZXRVSVR5cGUoKSkgew0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0JhcmNvZGU6DQorICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGQmFyY29kZShwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0J1dHRvbjoNCisgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZQdXNoQnV0dG9uKHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b246DQorICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGQ2hlY2tCdXR0b24ocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0OiB7DQorICAgICAgaWYgKHBBY2MtPklzTGlzdEJveCgpKSB7DQorICAgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZMaXN0Qm94KHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRkNvbWJvQm94KHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdDoNCisgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZEYXRlVGltZUVkaXQocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQ6DQorICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGSW1hZ2VFZGl0KHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQ6DQorICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGTnVtZXJpY0VkaXQocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQ6DQorICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGUGFzc3dvcmRFZGl0KHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfU2lnbmF0dXJlOg0KKyAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRlNpZ25hdHVyZShwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHRFZGl0Og0KKyAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRlRleHRFZGl0KHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJjOg0KKyAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRkFyYyhwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0xpbmU6DQorICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGTGluZShwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1JlY3RhbmdsZToNCisgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZSZWN0YW5nbGUocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0Og0KKyAgICAgIHBXaWRnZXQgPSBGWF9ORVcgQ1hGQV9GRlRleHQocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZToNCisgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZJbWFnZShwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQorICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQorICAgICAgcFdpZGdldCA9IEZYX05FVyBDWEZBX0ZGU3ViRm9ybShwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCisgICAgICBwV2lkZ2V0ID0gRlhfTkVXIENYRkFfRkZFeGNsR3JvdXAocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9EZWZhdWx0VWk6DQorICAgIGRlZmF1bHQ6DQorICAgICAgcFdpZGdldCA9IE5VTEw7DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAoIXBXaWRnZXQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwV2lkZ2V0LT5TZXREb2NWaWV3KHBEb2NWaWV3KTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRMYXlvdXRJdGVtKCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRFdmVudChJWEZBX0RvY0xheW91dCogcExheW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VURVZFTlQgZUV2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTIpIHsNCisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldyhwTGF5b3V0KTsNCisgIGlmICghcERvY1ZpZXcgfHwgIVhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShwU2VuZGVyKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBzd2l0Y2ggKGVFdmVudCkgew0KKyAgICBjYXNlIFhGQV9MQVlPVVRFVkVOVF9JdGVtQWRkZWQ6DQorICAgICAgT25MYXlvdXRJdGVtQWRkKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3Zpbmc6DQorICAgICAgT25MYXlvdXRJdGVtUmVtb3ZpbmcocERvY1ZpZXcsIHBMYXlvdXQsIHBTZW5kZXIsIHBQYXJhbSwgcFBhcmFtMik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBWU9VVEVWRU5UX1JlY3RDaGFuZ2VkOg0KKyAgICAgIE9uTGF5b3V0SXRlbVJlY3RDaGFuZ2VkKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQVlPVVRFVkVOVF9TdGF0dXNDaGFuZ2VkOg0KKyAgICAgIE9uTGF5b3V0SXRlbVN0YXR1c3RDaGFuZ2VkKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6OlN0YXJ0RmllbGREcmF3TGF5b3V0KENYRkFfTm9kZSogcEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCkgew0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBJdGVtLT5HZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBBY2MpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcEFjYy0+U3RhcnRXaWRnZXRMYXlvdXQoZkNhbGNXaWR0aCwgZkNhbGNIZWlnaHQpOw0KK30NCitGWF9CT09MIENYRkFfRkZOb3RpZnk6OkZpbmRTcGxpdFBvcyhDWEZBX05vZGUqIHBJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0UG9zKSB7DQorICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IChDWEZBX1dpZGdldEFjYyopcEl0ZW0tPkdldFdpZGdldERhdGEoKTsNCisgIGlmICghcEFjYykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gKFhGQV9MQVlPVVRSRVNVTFQpcEFjYy0+RmluZFNwbGl0UG9zKGlCbG9ja0luZGV4LCBmQ2FsY0hlaWdodFBvcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRk5vdGlmeTo6UnVuU2NyaXB0KENYRkFfTm9kZSogcFNjcmlwdCwgQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0pIHsNCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybiBiUmV0Ow0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBGb3JtSXRlbS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0QWNjKSB7DQorICAgIHJldHVybiBiUmV0Ow0KKyAgfQ0KKyAgQ1hGQV9FdmVudFBhcmFtIEV2ZW50UGFyYW07DQorICBFdmVudFBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfVW5rbm93bjsNCisgIEZYSlNFX0hWQUxVRSBwUmV0VmFsdWUgPSBOVUxMOw0KKyAgaW50MzJfdCBpUmV0ID0NCisgICAgICBwV2lkZ2V0QWNjLT5FeGVjdXRlU2NyaXB0KENYRkFfU2NyaXB0KHBTY3JpcHQpLCAmRXZlbnRQYXJhbSwgJnBSZXRWYWx1ZSk7DQorICBpZiAoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9TdWNlc3MgJiYgcFJldFZhbHVlKSB7DQorICAgIGJSZXQgPSBGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4ocFJldFZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwUmV0VmFsdWUpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRk5vdGlmeTo6RXhlY0V2ZW50QnlEZWVwRmlyc3QoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0Zvcm1SZWFkeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRXhjbHVkZSkgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIHJldHVybiBwRG9jVmlldy0+RXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdCgNCisgICAgICBwRm9ybU5vZGUsIGVFdmVudFR5cGUsIGJJc0Zvcm1SZWFkeSwgYlJlY3Vyc2l2ZSwNCisgICAgICBwRXhjbHVkZSA/IHBFeGNsdWRlLT5HZXROb2RlKCkgOiBOVUxMKTsNCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpBZGRDYWxjVmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0QWNjKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBEb2NWaWV3LT5BZGRDYWxjdWxhdGVXaWRnZXRBY2MocFdpZGdldEFjYyk7DQorICBwRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQocFdpZGdldEFjYyk7DQorfQ0KK0lYRkFfRG9jKiBDWEZBX0ZGTm90aWZ5OjpHZXRIRE9DKCkgew0KKyAgcmV0dXJuIG1fcERvYzsNCit9DQorSVhGQV9Eb2NQcm92aWRlciogQ1hGQV9GRk5vdGlmeTo6R2V0RG9jUHJvdmlkZXIoKSB7DQorICByZXR1cm4gbV9wRG9jLT5HZXREb2NQcm92aWRlcigpOw0KK30NCitJWEZBX0FwcFByb3ZpZGVyKiBDWEZBX0ZGTm90aWZ5OjpHZXRBcHBQcm92aWRlcigpIHsNCisgIHJldHVybiBtX3BEb2MtPkdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOw0KK30NCitJWEZBX1dpZGdldEhhbmRsZXIqIENYRkFfRkZOb3RpZnk6OkdldFdpZGdldEhhbmRsZXIoKSB7DQorICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgIHJldHVybiBwRG9jVmlldyA/IHBEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCkgOiBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRk5vdGlmeTo6R2V0SFdpZGdldChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7DQorICByZXR1cm4gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBMYXlvdXRJdGVtKTsNCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpPcGVuRHJvcERvd25MaXN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQ7DQorICBpZiAocFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsNCisgICgoQ1hGQV9GRkNvbWJvQm94KilwV2lkZ2V0KS0+T3BlbkRyb3BEb3duTGlzdCgpOw0KKyAgcERvY1ZpZXctPlVubG9ja1VwZGF0ZSgpOw0KKyAgcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9GRk5vdGlmeTo6R2V0Q3VycmVudERhdGVUaW1lKCkgew0KKyAgQ0ZYX1VuaXRpbWUgZGF0YVRpbWU7DQorICBkYXRhVGltZS5Ob3coKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZVRpbWU7DQorICB3c0RhdGVUaW1lLkZvcm1hdChMIiVkJTAyZCUwMmRUJTAyZCUwMmQlMDJkIiwgZGF0YVRpbWUuR2V0WWVhcigpLA0KKyAgICAgICAgICAgICAgICAgICAgZGF0YVRpbWUuR2V0TW9udGgoKSwgZGF0YVRpbWUuR2V0RGF5KCksIGRhdGFUaW1lLkdldEhvdXIoKSwNCisgICAgICAgICAgICAgICAgICAgIGRhdGFUaW1lLkdldE1pbnV0ZSgpLCBkYXRhVGltZS5HZXRTZWNvbmQoKSk7DQorICByZXR1cm4gd3NEYXRlVGltZTsNCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpSZXNldERhdGEoQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSkgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBEb2NWaWV3LT5SZXNldFdpZGdldERhdGEoKENYRkFfV2lkZ2V0QWNjKilwV2lkZ2V0RGF0YSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRk5vdGlmeTo6R2V0TGF5b3V0U3RhdHVzKCkgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICByZXR1cm4gcERvY1ZpZXcgPyBwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgOiAwOw0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6OlJ1bk5vZGVJbml0aWFsaXplKENYRkFfTm9kZSogcE5vZGUpIHsNCisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgaWYgKCFwRG9jVmlldykgew0KKyAgICByZXR1cm47DQorICB9DQorICBwRG9jVmlldy0+QWRkTmV3Rm9ybU5vZGUocE5vZGUpOw0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6OlJ1blN1YmZvcm1JbmRleENoYW5nZShDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSkgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBEb2NWaWV3LT5BZGRJbmRleENoYW5nZWRTdWJmb3JtKHBTdWJmb3JtTm9kZSk7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRk5vdGlmeTo6R2V0Rm9jdXNXaWRnZXROb2RlKCkgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwRG9jVmlldy0+R2V0Rm9jdXNXaWRnZXRBY2MoKTsNCisgIHJldHVybiBwQWNjID8gcEFjYy0+R2V0Tm9kZSgpIDogTlVMTDsNCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpTZXRGb2N1c1dpZGdldE5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcE5vZGUgPyAoQ1hGQV9XaWRnZXRBY2MqKXBOb2RlLT5HZXRXaWRnZXREYXRhKCkgOiBOVUxMOw0KKyAgcERvY1ZpZXctPlNldEZvY3VzV2lkZ2V0QWNjKHBBY2MpOw0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uTm9kZVJlYWR5KENYRkFfTm9kZSogcE5vZGUpIHsNCisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgaWYgKCFwRG9jVmlldykgew0KKyAgICByZXR1cm47DQorICB9DQorICBYRkFfRUxFTUVOVCBpVHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoWEZBX0lzQ3JlYXRlV2lkZ2V0KGlUeXBlKSkgew0KKyAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IEZYX05FVyBDWEZBX1dpZGdldEFjYyhwRG9jVmlldywgKENYRkFfTm9kZSopcE5vZGUpOw0KKyAgICBwTm9kZS0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfV2lkZ2V0RGF0YSwgcEFjYywgJmdzX1hGQURlbGV0ZVdpZGdldEFjYyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIHN3aXRjaCAoaVR5cGUpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9CaW5kSXRlbXM6DQorICAgICAgcERvY1ZpZXctPm1fYmluZEl0ZW1zLkFkZChwTm9kZSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfVmFsaWRhdGU6IHsNCisgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfTmVlZHNJbml0QXBwLCBUUlVFLCBGQUxTRSk7DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25WYWx1ZUNoYW5naW5nKENYRkFfTm9kZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtMikgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPCBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0RXT1JEIGR3UGFja2V0ID0gcFNlbmRlci0+R2V0UGFja2V0SUQoKTsNCisgIGlmIChkd1BhY2tldCAmIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCisgIH0gZWxzZSBpZiAocFNlbmRlci0+SXNGb3JtQ29udGFpbmVyKCkpIHsNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0ciA9IChYRkFfQVRUUklCVVRFKSh1aW50cHRyX3QpcFBhcmFtOw0KKyAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9QcmVzZW5jZSkgew0KKyAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwU2VuZGVyLT5HZXRXaWRnZXREYXRhKCk7DQorICAgICAgaWYgKCFwV2lkZ2V0QWNjKSB7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBOVUxMOw0KKyAgICAgIHdoaWxlICgocFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQocFdpZGdldCkpICE9IE5VTEwpIHsNCisgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0xvYWRlZCgpKSB7DQorICAgICAgICAgIHBXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25WYWx1ZUNoYW5nZWQoQ1hGQV9Ob2RlKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW00KSB7DQorICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgIGlmICghcERvY1ZpZXcpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdQYWNrZXQgPSBwU2VuZGVyLT5HZXRQYWNrZXRJRCgpOw0KKyAgWEZBX0FUVFJJQlVURSBlQXR0ciA9IChYRkFfQVRUUklCVVRFKSh1aW50cHRyX3QpcFBhcmFtOw0KKyAgaWYgKGR3UGFja2V0ICYgWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQorICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSAoQ1hGQV9Ob2RlKilwUGFyYW0zOw0KKyAgICBDWEZBX05vZGUqIHBXaWRnZXROb2RlID0gKENYRkFfTm9kZSopcFBhcmFtNDsNCisgICAgWEZBX0VMRU1FTlQgZVBUeXBlID0gcFBhcmVudE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgRlhfQk9PTCBiSXNDb250YWluZXJOb2RlID0gcFBhcmVudE5vZGUtPklzQ29udGFpbmVyTm9kZSgpOw0KKyAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IChDWEZBX1dpZGdldEFjYyopcFdpZGdldE5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKCFwV2lkZ2V0QWNjKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlVwZGF0ZVByb3BlcnR5ID0gRkFMU0U7DQorICAgIHBEb2NWaWV3LT5TZXRDaGFuZ2VNYXJrKCk7DQorICAgIHN3aXRjaCAoZVBUeXBlKSB7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DYXB0aW9uOiB7DQorICAgICAgICBDWEZBX1RleHRMYXlvdXQqIHBDYXBPdXQgPSBwV2lkZ2V0QWNjLT5HZXRDYXB0aW9uVGV4dExheW91dCgpOw0KKyAgICAgICAgaWYgKCFwQ2FwT3V0KSB7DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHBDYXBPdXQtPlVubG9hZCgpOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9VaToNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1BhcmE6DQorICAgICAgICBiVXBkYXRlUHJvcGVydHkgPSBUUlVFOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Gb250Og0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTWFyZ2luOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVmFsdWU6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JdGVtczoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoYklzQ29udGFpbmVyTm9kZSAmJiBlQXR0ciA9PSBYRkFfQVRUUklCVVRFX0FjY2Vzcykgew0KKyAgICAgIGJVcGRhdGVQcm9wZXJ0eSA9IFRSVUU7DQorICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gcERvY1ZpZXctPklzU3RhdGljTm90aWZ5KCk7DQorICAgICAgaWYgKGJOb3RpZnkpIHsNCisgICAgICAgIHBXaWRnZXRBY2MtPk5vdGlmeUV2ZW50KFhGQV9XSURHRVRFVkVOVF9BY2Nlc3NDaGFuZ2VkLCBOVUxMLCBwUGFyYW0yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ZhbHVlKSB7DQorICAgICAgcERvY1ZpZXctPkFkZENhbGN1bGF0ZU5vZGVOb3RpZnkocFNlbmRlcik7DQorICAgICAgaWYgKGVQVHlwZSA9PSBYRkFfRUxFTUVOVF9WYWx1ZSB8fCBiSXNDb250YWluZXJOb2RlKSB7DQorICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBwRG9jVmlldy0+SXNTdGF0aWNOb3RpZnkoKTsNCisgICAgICAgIGlmIChiSXNDb250YWluZXJOb2RlKSB7DQorICAgICAgICAgIHBXaWRnZXRBY2MtPlVwZGF0ZVVJRGlzcGxheSgpOw0KKyAgICAgICAgICBwRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHBXaWRnZXRBY2MpOw0KKyAgICAgICAgICBwRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQocFdpZGdldEFjYyk7DQorICAgICAgICB9IGVsc2UgaWYgKHBXaWRnZXROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgICAgICAgIHBXaWRnZXRBY2MtPlVwZGF0ZVVJRGlzcGxheSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJOb3RpZnkpIHsNCisgICAgICAgICAgcFdpZGdldEFjYy0+Tm90aWZ5RXZlbnQoWEZBX1dJREdFVEVWRU5UX1Bvc3RDb250ZW50Q2hhbmdlZCwgTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBOVUxMOw0KKyAgICB3aGlsZSAoKHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpKSAhPSBOVUxMKSB7DQorICAgICAgaWYgKCFwV2lkZ2V0LT5Jc0xvYWRlZCgpKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKGJVcGRhdGVQcm9wZXJ0eSkgew0KKyAgICAgICAgcFdpZGdldC0+VXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgICAgICB9DQorICAgICAgcFdpZGdldC0+TGF5b3V0V2lkZ2V0KCk7DQorICAgICAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKGVBdHRyID09IFhGQV9BVFRSSUJVVEVfVmFsdWUpIHsNCisgICAgICBwRG9jVmlldy0+QWRkQ2FsY3VsYXRlTm9kZU5vdGlmeShwU2VuZGVyKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uQ2hpbGRBZGRlZChDWEZBX05vZGUqIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTIpIHsNCisgIGlmICghcFNlbmRlci0+SXNGb3JtQ29udGFpbmVyKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYkxheW91dFJlYWR5ID0NCisgICAgICAhKHBEb2NWaWV3LT5tX2JJbkxheW91dFN0YXR1cykgJiYNCisgICAgICAocERvY1ZpZXctPkdldExheW91dFN0YXR1cygpID49IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpOw0KKyAgaWYgKGJMYXlvdXRSZWFkeSkgew0KKyAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPlNldENoYW5nZU1hcmsobV9wRG9jKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpPbkNoaWxkUmVtb3ZlZChDWEZBX05vZGUqIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKSB7DQorICBpZiAoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCkpIHsNCisgICAgRlhfQk9PTCBiTGF5b3V0UmVhZHkgPQ0KKyAgICAgICAgIShwRG9jVmlldy0+bV9iSW5MYXlvdXRTdGF0dXMpICYmDQorICAgICAgICAocERvY1ZpZXctPkdldExheW91dFN0YXR1cygpID49IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpOw0KKyAgICBpZiAoYkxheW91dFJlYWR5KSB7DQorICAgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5TZXRDaGFuZ2VNYXJrKG1fcERvYyk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpPbkxheW91dEl0ZW1BZGQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYRkFfRG9jTGF5b3V0KiBwTGF5b3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtMikgew0KKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IChDWEZBX0ZGV2lkZ2V0KikoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBTZW5kZXI7DQorICBpbnQzMl90IGlQYWdlSWR4ID0gKGludDMyX3QpKHVpbnRwdHJfdClwUGFyYW07DQorICBJWEZBX1BhZ2VWaWV3KiBwTmV3UGFnZVZpZXcgPSBwRG9jVmlldy0+R2V0UGFnZVZpZXcoaVBhZ2VJZHgpOw0KKyAgRlhfRFdPUkQgZHdTdGF0dXMgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdClwUGFyYW0yOw0KKyAgRlhfRFdPUkQgZHdGaWx0ZXIgPSBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUgfCBYRkFfV0lER0VUU1RBVFVTX1ZpZXdhYmxlIHwNCisgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVFNUQVRVU19QcmludGFibGU7DQorICBwV2lkZ2V0LT5Nb2RpZnlTdGF0dXMoZHdTdGF0dXMsIGR3RmlsdGVyKTsNCisgIGlmIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPj0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCkgew0KKyAgICBJWEZBX1BhZ2VWaWV3KiBwUHJlUGFnZVZpZXcgPSBwV2lkZ2V0LT5HZXRQYWdlVmlldygpOw0KKyAgICBpZiAocFByZVBhZ2VWaWV3ICE9IHBOZXdQYWdlVmlldyB8fA0KKyAgICAgICAgKGR3U3RhdHVzICYgKFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSB8IFhGQV9XSURHRVRTVEFUVVNfVmlld2FibGUpKSA9PQ0KKyAgICAgICAgICAgIChYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUgfCBYRkFfV0lER0VUU1RBVFVTX1ZpZXdhYmxlKSkgew0KKyAgICAgIHBXaWRnZXQtPlNldFBhZ2VWaWV3KHBOZXdQYWdlVmlldyk7DQorICAgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5XaWRnZXRFdmVudChwV2lkZ2V0LCBwV2lkZ2V0LT5HZXREYXRhQWNjKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV0lER0VURVZFTlRfUG9zdEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5ld1BhZ2VWaWV3LCBwUHJlUGFnZVZpZXcpOw0KKyAgICB9DQorICAgIGlmICgoZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpID09IDApIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHBXaWRnZXQtPklzTG9hZGVkKCkpIHsNCisgICAgICBDRlhfUmVjdEYgcnRPbGQ7DQorICAgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydE9sZCk7DQorICAgICAgQ0ZYX1JlY3RGIHJ0TmV3ID0gcFdpZGdldC0+UmVDYWNoZVdpZGdldFJlY3QoKTsNCisgICAgICBpZiAocnRPbGQgIT0gcnROZXcpIHsNCisgICAgICAgIHBXaWRnZXQtPkxheW91dFdpZGdldCgpOw0KKyAgICAgIH0NCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIHBXaWRnZXQtPlNldFBhZ2VWaWV3KHBOZXdQYWdlVmlldyk7DQorICAgICAgcFdpZGdldC0+TG9hZFdpZGdldCgpOw0KICAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRJdGVtUmVtb3ZpbmcoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBJWEZBX0RvY0xheW91dCAqcExheW91dCwgQ1hGQV9MYXlvdXRJdGVtICpwU2VuZGVyLCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBQYXJhbTIpDQotew0KLSAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gKENYRkFfRkZXaWRnZXQqKXBTZW5kZXI7DQotICAgIHBEb2NWaWV3LT5EZWxldGVMYXlvdXRJdGVtKHBXaWRnZXQpOw0KLSAgICBpZiAocERvY1ZpZXctPkdldExheW91dFN0YXR1cygpIDwgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+V2lkZ2V0RXZlbnQocFdpZGdldCwgcFdpZGdldC0+R2V0RGF0YUFjYygpLCBYRkFfV0lER0VURVZFTlRfUHJlUmVtb3ZlZCwgTlVMTCwgTlVMTCk7DQogICAgIHBXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KE5VTEwpOw0KKyAgfSBlbHNlIHsNCisgICAgcFdpZGdldC0+U2V0UGFnZVZpZXcocE5ld1BhZ2VWaWV3KTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZGTm90aWZ5OjpPbkxheW91dEl0ZW1SZWN0Q2hhbmdlZChDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIElYRkFfRG9jTGF5b3V0ICpwTGF5b3V0LCBDWEZBX0xheW91dEl0ZW0gKnBTZW5kZXIsIHZvaWQqIHBQYXJhbSwgdm9pZCogcFBhcmFtMikNCi17DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpPbkxheW91dEl0ZW1SZW1vdmluZyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEZBX0RvY0xheW91dCogcExheW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTIpIHsNCisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSAoQ1hGQV9GRldpZGdldCopcFNlbmRlcjsNCisgIHBEb2NWaWV3LT5EZWxldGVMYXlvdXRJdGVtKHBXaWRnZXQpOw0KKyAgaWYgKHBEb2NWaWV3LT5HZXRMYXlvdXRTdGF0dXMoKSA8IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5XaWRnZXRFdmVudChwV2lkZ2V0LCBwV2lkZ2V0LT5HZXREYXRhQWNjKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9XSURHRVRFVkVOVF9QcmVSZW1vdmVkLCBOVUxMLCBOVUxMKTsNCisgIHBXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KE5VTEwpOw0KIH0NCi12b2lkIENYRkFfRkZOb3RpZnk6Ok9uTGF5b3V0SXRlbVN0YXR1c3RDaGFuZ2VkKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgSVhGQV9Eb2NMYXlvdXQgKnBMYXlvdXQsIENYRkFfTGF5b3V0SXRlbSAqcFNlbmRlciwgdm9pZCogcFBhcmFtLCB2b2lkKiBwUGFyYW0yKQ0KLXsNCi0gICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IChDWEZBX0ZGV2lkZ2V0KikoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBTZW5kZXI7DQotICAgIGlmICghcFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuOw0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRJdGVtUmVjdENoYW5nZWQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKSB7fQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRJdGVtU3RhdHVzdENoYW5nZWQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKSB7DQorICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gKENYRkFfRkZXaWRnZXQqKShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcFNlbmRlcjsNCisgIGlmICghcFdpZGdldCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9EV09SRCBkd1N0YXR1cyA9IChGWF9EV09SRCkodWludHB0cl90KXBQYXJhbTsNCisgIGlmIChkd1N0YXR1cyA9PSAwKSB7DQorICAgIENYRkFfTGF5b3V0SXRlbSogcFByZUl0ZW0gPSBwU2VuZGVyLT5HZXRQcmV2KCk7DQorICAgIGlmIChwUHJlSXRlbSkgew0KKyAgICAgIENYRkFfRkZXaWRnZXQqIHBQcmVXaWRnZXQgPQ0KKyAgICAgICAgICAoQ1hGQV9GRldpZGdldCopKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwUHJlSXRlbTsNCisgICAgICBpZiAocFByZVdpZGdldCkgew0KKyAgICAgICAgZHdTdGF0dXMgPSBwUHJlV2lkZ2V0LT5HZXRTdGF0dXMoKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdClwUGFyYW07DQotICAgIGlmIChkd1N0YXR1cyA9PSAwKSB7DQotICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBQcmVJdGVtID0gcFNlbmRlci0+R2V0UHJldigpOw0KLSAgICAgICAgaWYgKHBQcmVJdGVtKSB7DQotICAgICAgICAgICAgQ1hGQV9GRldpZGdldCogcFByZVdpZGdldCA9IChDWEZBX0ZGV2lkZ2V0KikoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBQcmVJdGVtOw0KLSAgICAgICAgICAgIGlmIChwUHJlV2lkZ2V0KSB7DQotICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gcFByZVdpZGdldC0+R2V0U3RhdHVzKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3T2xkU3RhdHVzID0gcFdpZGdldC0+R2V0U3RhdHVzKCk7DQotICAgIEZYX0RXT1JEIGR3RmlsdGVyID0gWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlIHwgWEZBX1dJREdFVFNUQVRVU19WaWV3YWJsZSB8IFhGQV9XSURHRVRTVEFUVVNfUHJpbnRhYmxlOw0KLSAgICBpZiAoKGR3T2xkU3RhdHVzICYgZHdGaWx0ZXIpID09IGR3U3RhdHVzKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgcFdpZGdldC0+TW9kaWZ5U3RhdHVzKGR3U3RhdHVzLCBkd0ZpbHRlcik7DQorICB9DQorICBGWF9EV09SRCBkd09sZFN0YXR1cyA9IHBXaWRnZXQtPkdldFN0YXR1cygpOw0KKyAgRlhfRFdPUkQgZHdGaWx0ZXIgPSBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUgfCBYRkFfV0lER0VUU1RBVFVTX1ZpZXdhYmxlIHwNCisgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVFNUQVRVU19QcmludGFibGU7DQorICBpZiAoKGR3T2xkU3RhdHVzICYgZHdGaWx0ZXIpID09IGR3U3RhdHVzKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBXaWRnZXQtPk1vZGlmeVN0YXR1cyhkd1N0YXR1cywgZHdGaWx0ZXIpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZm5vdGlmeS5oCmluZGV4IDdkZDU5NGQuLjY5NDFiMGQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZm5vdGlmeS5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZm5vdGlmeS5oCkBAIC02LDQ3ICs2LDkwIEBACiANCiAjaWZuZGVmIF9GWEZBX0ZGTk9USUZZX0hfDQogI2RlZmluZSBfRlhGQV9GRk5PVElGWV9IXw0KLWNsYXNzIENYRkFfRkZOb3RpZnkgOiBwdWJsaWMgSVhGQV9Ob3RpZnkNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGTm90aWZ5KENYRkFfRkZEb2MqIHBEb2MpOw0KLSAgICB+Q1hGQV9GRk5vdGlmeSgpOw0KK2NsYXNzIENYRkFfRkZOb3RpZnkgOiBwdWJsaWMgSVhGQV9Ob3RpZnkgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGTm90aWZ5KENYRkFfRkZEb2MqIHBEb2MpOw0KKyAgfkNYRkFfRkZOb3RpZnkoKTsNCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCU9uUGFnZUV2ZW50KElYRkFfTGF5b3V0UGFnZSAqcFNlbmRlciwgWEZBX1BBR0VFVkVOVCBlRXZlbnQsIHZvaWQqIHBQYXJhbSA9IE5VTEwpOw0KKyAgdmlydHVhbCB2b2lkIE9uUGFnZUV2ZW50KElYRkFfTGF5b3V0UGFnZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUEFHRUVWRU5UIGVFdmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0gPSBOVUxMKTsNCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCU9uTm9kZUV2ZW50KENYRkFfTm9kZSAqcFNlbmRlciwgWEZBX05PREVFVkVOVCBlRXZlbnQsIHZvaWQqIHBQYXJhbSA9IE5VTEwsIHZvaWQqIHBQYXJhbTIgPSBOVUxMLCB2b2lkKiBwUGFyYW0zID0gTlVMTCwgdm9pZCogcFBhcmFtNCA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCSAgICAgICAgT25XaWRnZXREYXRhRXZlbnQoQ1hGQV9XaWRnZXREYXRhKiBwU2VuZGVyLCBGWF9EV09SRCBkd0V2ZW50LCB2b2lkKiBwUGFyYW0gPSBOVUxMLCB2b2lkKiBwQWRkaXRpb25hbCA9IE5VTEwsIHZvaWQqIHBBZGRpdGlvbmFsMiA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIENYRkFfTGF5b3V0SXRlbSoJT25DcmVhdGVMYXlvdXRJdGVtKENYRkFfTm9kZSAqcE5vZGUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJT25MYXlvdXRFdmVudChJWEZBX0RvY0xheW91dCAqcExheW91dCwgQ1hGQV9MYXlvdXRJdGVtICpwU2VuZGVyLCBYRkFfTEFZT1VURVZFTlQgZUV2ZW50LCB2b2lkKiBwUGFyYW0gPSBOVUxMLCB2b2lkKiBwUGFyYW0yID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgT25Ob2RlRXZlbnQoQ1hGQV9Ob2RlKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFRVZFTlQgZUV2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtMiA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtMyA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtNCA9IE5VTEwpOw0KKyAgdmlydHVhbCB2b2lkIE9uV2lkZ2V0RGF0YUV2ZW50KENYRkFfV2lkZ2V0RGF0YSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0V2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEFkZGl0aW9uYWwgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBBZGRpdGlvbmFsMiA9IE5VTEwpOw0KKyAgdmlydHVhbCBDWEZBX0xheW91dEl0ZW0qIE9uQ3JlYXRlTGF5b3V0SXRlbShDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZpcnR1YWwgdm9pZCBPbkxheW91dEV2ZW50KElYRkFfRG9jTGF5b3V0KiBwTGF5b3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xBWU9VVEVWRU5UIGVFdmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yID0gTlVMTCk7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCQlTdGFydEZpZWxkRHJhd0xheW91dChDWEZBX05vZGUgKnBJdGVtLCBGWF9GTE9BVCAmZkNhbGNXaWR0aCwgRlhfRkxPQVQgJmZDYWxjSGVpZ2h0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUZpbmRTcGxpdFBvcyhDWEZBX05vZGUgKnBJdGVtLCBpbnQzMl90IGlCbG9ja0luZGV4LCBGWF9GTE9BVCAmZkNhbGNIZWlnaHRQb3MpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJUnVuU2NyaXB0KENYRkFfTm9kZSogcFNjcmlwdCwgQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0pOw0KLSAgICB2aXJ0dWFsCWludDMyX3QJCQlFeGVjRXZlbnRCeURlZXBGaXJzdChDWEZBX05vZGUqIHBGb3JtTm9kZSwgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlLCBGWF9CT09MIGJJc0Zvcm1SZWFkeSA9IEZBTFNFLCBGWF9CT09MIGJSZWN1cnNpdmUgPSBUUlVFLCBDWEZBX1dpZGdldEFjYwkqIHBFeGNsdWRlID0gTlVMTCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlBZGRDYWxjVmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQotICAgIHZpcnR1YWwgSVhGQV9Eb2MqCQkJR2V0SERPQygpOw0KLSAgICB2aXJ0dWFsIElYRkFfRG9jUHJvdmlkZXIqCUdldERvY1Byb3ZpZGVyKCk7DQotICAgIHZpcnR1YWwgSVhGQV9BcHBQcm92aWRlcioJR2V0QXBwUHJvdmlkZXIoKTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldEhhbmRsZXIqCUdldFdpZGdldEhhbmRsZXIoKTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldCoJCQlHZXRIV2lkZ2V0KENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJT3BlbkRyb3BEb3duTGlzdChJWEZBX1dpZGdldCogaFdpZGdldCk7DQotICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCUdldEN1cnJlbnREYXRlVGltZSgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVzZXREYXRhKENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBOVUxMKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0TGF5b3V0U3RhdHVzKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSdW5Ob2RlSW5pdGlhbGl6ZShDWEZBX05vZGUqIHBOb2RlKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVJ1blN1YmZvcm1JbmRleENoYW5nZShDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSk7DQotICAgIHZpcnR1YWwgQ1hGQV9Ob2RlKgkJCUdldEZvY3VzV2lkZ2V0Tm9kZSgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0Rm9jdXNXaWRnZXROb2RlKENYRkFfTm9kZSogcE5vZGUpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAlPbk5vZGVSZWFkeShDWEZBX05vZGUgKnBOb2RlKTsNCi0gICAgdm9pZAlPblZhbHVlQ2hhbmdpbmcoQ1hGQV9Ob2RlICpwU2VuZGVyLCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBQYXJhbTIpOw0KLSAgICB2b2lkCU9uVmFsdWVDaGFuZ2VkKENYRkFfTm9kZSAqcFNlbmRlciwgdm9pZCogcFBhcmFtLCB2b2lkKiBwUGFyYW0yLCB2b2lkKiBwUGFyYW0zLCB2b2lkKiBwUGFyYW00KTsNCi0gICAgdm9pZAlPbkNoaWxkQWRkZWQoQ1hGQV9Ob2RlICpwU2VuZGVyLCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBQYXJhbTIpOw0KLSAgICB2b2lkCU9uQ2hpbGRSZW1vdmVkKENYRkFfTm9kZSAqcFNlbmRlciwgdm9pZCogcFBhcmFtLCB2b2lkKiBwUGFyYW0yKTsNCi0gICAgdm9pZAlPbkxheW91dEl0ZW1BZGQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBJWEZBX0RvY0xheW91dCAqcExheW91dCwgQ1hGQV9MYXlvdXRJdGVtICpwU2VuZGVyLCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBQYXJhbTIpOw0KLSAgICB2b2lkCU9uTGF5b3V0SXRlbVJlbW92aW5nKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgSVhGQV9Eb2NMYXlvdXQgKnBMYXlvdXQsIENYRkFfTGF5b3V0SXRlbSAqcFNlbmRlciwgdm9pZCogcFBhcmFtLCB2b2lkKiBwUGFyYW0yKTsNCi0gICAgdm9pZAlPbkxheW91dEl0ZW1SZWN0Q2hhbmdlZChDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIElYRkFfRG9jTGF5b3V0ICpwTGF5b3V0LCBDWEZBX0xheW91dEl0ZW0gKnBTZW5kZXIsIHZvaWQqIHBQYXJhbSwgdm9pZCogcFBhcmFtMik7DQotICAgIHZvaWQJT25MYXlvdXRJdGVtU3RhdHVzdENoYW5nZWQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBJWEZBX0RvY0xheW91dCAqcExheW91dCwgQ1hGQV9MYXlvdXRJdGVtICpwU2VuZGVyLCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBQYXJhbTIpOw0KLSAgICBDWEZBX0ZGRG9jKgkJCW1fcERvYzsNCisgIHZpcnR1YWwgdm9pZCBTdGFydEZpZWxkRHJhd0xheW91dChDWEZBX05vZGUqIHBJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY1dpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmluZFNwbGl0UG9zKENYRkFfTm9kZSogcEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodFBvcyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUnVuU2NyaXB0KENYRkFfTm9kZSogcFNjcmlwdCwgQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0pOw0KKyAgdmlydHVhbCBpbnQzMl90IEV4ZWNFdmVudEJ5RGVlcEZpcnN0KENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0Zvcm1SZWFkeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBFeGNsdWRlID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgQWRkQ2FsY1ZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdmlydHVhbCBJWEZBX0RvYyogR2V0SERPQygpOw0KKyAgdmlydHVhbCBJWEZBX0RvY1Byb3ZpZGVyKiBHZXREb2NQcm92aWRlcigpOw0KKyAgdmlydHVhbCBJWEZBX0FwcFByb3ZpZGVyKiBHZXRBcHBQcm92aWRlcigpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldEhhbmRsZXIqIEdldFdpZGdldEhhbmRsZXIoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldEhXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7DQorICB2aXJ0dWFsIHZvaWQgT3BlbkRyb3BEb3duTGlzdChJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldEN1cnJlbnREYXRlVGltZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlc2V0RGF0YShDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGF5b3V0U3RhdHVzKCk7DQorICB2aXJ0dWFsIHZvaWQgUnVuTm9kZUluaXRpYWxpemUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2aXJ0dWFsIHZvaWQgUnVuU3ViZm9ybUluZGV4Q2hhbmdlKENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlKTsNCisgIHZpcnR1YWwgQ1hGQV9Ob2RlKiBHZXRGb2N1c1dpZGdldE5vZGUoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb2N1c1dpZGdldE5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25Ob2RlUmVhZHkoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2b2lkIE9uVmFsdWVDaGFuZ2luZyhDWEZBX05vZGUqIHBTZW5kZXIsIHZvaWQqIHBQYXJhbSwgdm9pZCogcFBhcmFtMik7DQorICB2b2lkIE9uVmFsdWVDaGFuZ2VkKENYRkFfTm9kZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yLA0KKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0zLA0KKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW00KTsNCisgIHZvaWQgT25DaGlsZEFkZGVkKENYRkFfTm9kZSogcFNlbmRlciwgdm9pZCogcFBhcmFtLCB2b2lkKiBwUGFyYW0yKTsNCisgIHZvaWQgT25DaGlsZFJlbW92ZWQoQ1hGQV9Ob2RlKiBwU2VuZGVyLCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBQYXJhbTIpOw0KKyAgdm9pZCBPbkxheW91dEl0ZW1BZGQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKTsNCisgIHZvaWQgT25MYXlvdXRJdGVtUmVtb3ZpbmcoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEZBX0RvY0xheW91dCogcExheW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTIpOw0KKyAgdm9pZCBPbkxheW91dEl0ZW1SZWN0Q2hhbmdlZChDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYRkFfRG9jTGF5b3V0KiBwTGF5b3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtMik7DQorICB2b2lkIE9uTGF5b3V0SXRlbVN0YXR1c3RDaGFuZ2VkKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKTsNCisgIENYRkFfRkZEb2MqIG1fcERvYzsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhZ2V2aWV3LmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhZ2V2aWV3LmNwcAppbmRleCA5N2M1YjcxLi5iMzk4NGVmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYWdldmlldy5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGFnZXZpZXcuY3BwCkBAIC0xOCw0MTEgKzE4LDQxMCBAQAogI2luY2x1ZGUgInhmYV9mZmltYWdlZWRpdC5oIg0KICNpbmNsdWRlICJ4ZmFfZmZ0ZXh0ZWRpdC5oIg0KIENYRkFfRkZQYWdlVmlldzo6Q1hGQV9GRlBhZ2VWaWV3KENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwUGFnZUFyZWEpDQotICAgIDogQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbChwUGFnZUFyZWEpDQotICAgICwgbV9wRG9jVmlldyhwRG9jVmlldykNCi0gICAgLCBtX2JMb2FkZWQoRkFMU0UpDQotew0KKyAgICA6IENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwocFBhZ2VBcmVhKSwNCisgICAgICBtX3BEb2NWaWV3KHBEb2NWaWV3KSwNCisgICAgICBtX2JMb2FkZWQoRkFMU0UpIHt9DQorQ1hGQV9GRlBhZ2VWaWV3Ojp+Q1hGQV9GRlBhZ2VWaWV3KCkge30NCitJWEZBX0RvY1ZpZXcqIENYRkFfRkZQYWdlVmlldzo6R2V0RG9jVmlldygpIHsNCisgIHJldHVybiBtX3BEb2NWaWV3Ow0KIH0NCi1DWEZBX0ZGUGFnZVZpZXc6On5DWEZBX0ZGUGFnZVZpZXcoKQ0KLXsNCitpbnQzMl90IENYRkFfRkZQYWdlVmlldzo6R2V0UGFnZVZpZXdJbmRleCgpIHsNCisgIHJldHVybiBHZXRMYXlvdXRQYWdlKCktPkdldFBhZ2VJbmRleCgpOw0KIH0NCi1JWEZBX0RvY1ZpZXcqIENYRkFfRkZQYWdlVmlldzo6R2V0RG9jVmlldygpDQotew0KLSAgICByZXR1cm4gbV9wRG9jVmlldzsNCit2b2lkIENYRkFfRkZQYWdlVmlldzo6R2V0UGFnZVZpZXdSZWN0KENGWF9SZWN0RiYgcnRQYWdlKSB7DQorICBDRlhfU2l6ZUYgc3o7DQorICBHZXRMYXlvdXRQYWdlKCktPkdldFBhZ2VTaXplKHN6KTsNCisgIHJ0UGFnZS5TZXQoMCwgMCwgc3opOw0KIH0NCi1pbnQzMl90IENYRkFfRkZQYWdlVmlldzo6R2V0UGFnZVZpZXdJbmRleCgpDQotew0KLSAgICByZXR1cm4gR2V0TGF5b3V0UGFnZSgpLT5HZXRQYWdlSW5kZXgoKTsNCit2b2lkIENYRkFfRkZQYWdlVmlldzo6R2V0RGlzcGxheU1hdHJpeChDRlhfTWF0cml4JiBtdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdCYgcnREaXNwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSkgew0KKyAgQ0ZYX1NpemVGIHN6Ow0KKyAgR2V0TGF5b3V0UGFnZSgpLT5HZXRQYWdlU2l6ZShzeik7DQorICBDRlhfUmVjdEYgZmRlUGFnZTsNCisgIGZkZVBhZ2UuU2V0KDAsIDAsIHN6LngsIHN6LnkpOw0KKyAgRkRFX0dldFBhZ2VNYXRyaXgobXQsIGZkZVBhZ2UsIHJ0RGlzcCwgaVJvdGF0ZSwgMCk7DQogfQ0KLXZvaWQgQ1hGQV9GRlBhZ2VWaWV3OjpHZXRQYWdlVmlld1JlY3QoQ0ZYX1JlY3RGICZydFBhZ2UpDQotew0KLSAgICBDRlhfU2l6ZUYgc3o7DQotICAgIEdldExheW91dFBhZ2UoKS0+R2V0UGFnZVNpemUoc3opOw0KLSAgICBydFBhZ2UuU2V0KDAsIDAsIHN6KTsNCi19DQotdm9pZCBDWEZBX0ZGUGFnZVZpZXc6OkdldERpc3BsYXlNYXRyaXgoQ0ZYX01hdHJpeCAmbXQsIGNvbnN0IENGWF9SZWN0ICZydERpc3AsIGludDMyX3QgaVJvdGF0ZSkNCi17DQotICAgIENGWF9TaXplRiBzejsNCi0gICAgR2V0TGF5b3V0UGFnZSgpLT5HZXRQYWdlU2l6ZShzeik7DQotICAgIENGWF9SZWN0RiBmZGVQYWdlOw0KLSAgICBmZGVQYWdlLlNldCgwLCAwLCBzei54LCBzei55KTsNCi0gICAgRkRFX0dldFBhZ2VNYXRyaXgobXQsIGZkZVBhZ2UsIHJ0RGlzcCwgaVJvdGF0ZSwgMCk7DQotfQ0KLWludDMyX3QgQ1hGQV9GRlBhZ2VWaWV3OjpMb2FkUGFnZVZpZXcoSUZYX1BhdXNlICpwUGF1c2UgKQ0KLXsNCi0gICAgaWYgKG1fYkxvYWRlZCkgew0KLSAgICAgICAgcmV0dXJuIDEwMDsNCi0gICAgfQ0KLSAgICBtX2JMb2FkZWQgPSBUUlVFOw0KK2ludDMyX3QgQ1hGQV9GRlBhZ2VWaWV3OjpMb2FkUGFnZVZpZXcoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmIChtX2JMb2FkZWQpIHsNCiAgICAgcmV0dXJuIDEwMDsNCisgIH0NCisgIG1fYkxvYWRlZCA9IFRSVUU7DQorICByZXR1cm4gMTAwOw0KIH0NCi12b2lkIENYRkFfRkZQYWdlVmlldzo6VW5sb2FkUGFnZVZpZXcoKQ0KLXsNCi0gICAgaWYgKCFtX2JMb2FkZWQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9GRlBhZ2VWaWV3OjpVbmxvYWRQYWdlVmlldygpIHsNCisgIGlmICghbV9iTG9hZGVkKSB7DQorICAgIHJldHVybjsNCisgIH0NCiB9DQotRlhfQk9PTCBDWEZBX0ZGUGFnZVZpZXc6OklzUGFnZVZpZXdMb2FkZWQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYkxvYWRlZDsNCitGWF9CT09MIENYRkFfRkZQYWdlVmlldzo6SXNQYWdlVmlld0xvYWRlZCgpIHsNCisgIHJldHVybiBtX2JMb2FkZWQ7DQogfQ0KLUlYRkFfV2lkZ2V0KiBDWEZBX0ZGUGFnZVZpZXc6OkdldFdpZGdldEJ5UG9zKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIGlmICghbV9iTG9hZGVkKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBJWEZBX1dpZGdldEl0ZXJhdG9yKiBwSXRlcmF0b3IgPSBDcmVhdGVXaWRnZXRJdGVyYXRvcigpOw0KLSAgICB3aGlsZSAoQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IChDWEZBX0ZGV2lkZ2V0KilwSXRlcmF0b3ItPk1vdmVUb05leHQoKSkgew0KLSAgICAgICAgaWYgKCEocFdpZGdldC0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBXaWRnZXQtPkdldERhdGFBY2MoKTsNCi0gICAgICAgIGludDMyX3QgdHlwZSA9IHBBY2MtPkdldENsYXNzSUQoKTsNCi0gICAgICAgIGlmICh0eXBlICE9IFhGQV9FTEVNRU5UX0ZpZWxkICYmIHR5cGUgIT0gWEZBX0VMRU1FTlRfRHJhdykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRkxPQVQgZldpZGdldHggPSBmeCwgZldpZGdldHkgPSBmeTsNCi0gICAgICAgIHBXaWRnZXQtPlJvdGF0ZTJOb3JtYWwoZldpZGdldHgsIGZXaWRnZXR5KTsNCi0gICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IHBXaWRnZXQtPk9uSGl0VGVzdChmV2lkZ2V0eCwgZldpZGdldHkpOw0KLSAgICAgICAgaWYgKCggRldMX1dHVEhJVFRFU1RfQ2xpZW50ID09IGR3RmxhZw0KLSAgICAgICAgICAgICAgICB8fCAgRldMX1dHVEhJVFRFU1RfVHJhbnNwYXJlbnQgPT0gZHdGbGFnKSkgew0KLSAgICAgICAgICAgIHBJdGVyYXRvci0+UmVsZWFzZSgpOw0KLSAgICAgICAgICAgIHJldHVybiBwV2lkZ2V0Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHBJdGVyYXRvci0+UmVsZWFzZSgpOw0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGUGFnZVZpZXc6OkdldFdpZGdldEJ5UG9zKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX2JMb2FkZWQpIHsNCiAgICAgcmV0dXJuIE5VTEw7DQotfQ0KLUlYRkFfV2lkZ2V0SXRlcmF0b3IqIENYRkFfRkZQYWdlVmlldzo6Q3JlYXRlV2lkZ2V0SXRlcmF0b3IoRlhfRFdPUkQgZHdUcmF2ZXJzZVdheSAsDQotICAgICAgICBGWF9EV09SRCBkd1dpZGdldEZpbHRlciApDQotew0KLSAgICBzd2l0Y2ggKGR3VHJhdmVyc2VXYXkpIHsNCi0gICAgICAgIGNhc2UgWEZBX1RSQVZFUlNFV0FZX1RyYW52YWxzZToNCi0gICAgICAgICAgICByZXR1cm4gRlhfTkVXIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcih0aGlzLCBkd1dpZGdldEZpbHRlcik7DQotICAgICAgICBjYXNlIFhGQV9UUkFWRVJTRVdBWV9Gb3JtOg0KLSAgICAgICAgICAgIHJldHVybiBGWF9ORVcgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcih0aGlzLCBkd1dpZGdldEZpbHRlcik7DQorICB9DQorICBJWEZBX1dpZGdldEl0ZXJhdG9yKiBwSXRlcmF0b3IgPSBDcmVhdGVXaWRnZXRJdGVyYXRvcigpOw0KKyAgd2hpbGUgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSAoQ1hGQV9GRldpZGdldCopcEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgaWYgKCEocFdpZGdldC0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLXN0YXRpYyBGWF9CT09MIFhGQV9QYWdlV2lkZ2V0RmlsdGVyKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQsIEZYX0RXT1JEIGR3RmlsdGVyLCBGWF9CT09MIGJUcmF2ZXJzYWwsIEZYX0JPT0wgYklnbm9yZXJlbGV2YW50KQ0KLXsNCi0gICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCk7DQotICAgIEZYX0RXT1JEIGR3VHlwZSA9IGR3RmlsdGVyICYgWEZBX1dJREdFVEZJTFRFUl9BbGxUeXBlOw0KLSAgICBpZiAoKGR3VHlwZSA9PSBYRkFfV0lER0VURklMVEVSX0ZpZWxkKSAmJiAocFdpZGdldEFjYy0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0ZpZWxkKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gcFdpZGdldC0+R2V0U3RhdHVzKCk7DQotICAgIGlmIChiVHJhdmVyc2FsICYmIChkd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfRGlzYWJsZWQpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKGJJZ25vcmVyZWxldmFudCkgew0KLSAgICAgICAgcmV0dXJuIChkd1N0YXR1cyAmIFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZSkgIT0gMDsNCi0gICAgfQ0KLSAgICBkd0ZpbHRlciAmPSAoWEZBX1dJREdFVEZJTFRFUl9WaXNpYmxlIHwgWEZBX1dJREdFVEZJTFRFUl9WaWV3YWJsZSB8IFhGQV9XSURHRVRGSUxURVJfUHJpbnRhYmxlKTsNCi0gICAgcmV0dXJuIChkd0ZpbHRlciAmIGR3U3RhdHVzKSA9PSBkd0ZpbHRlcjsNCi19DQotQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6Q1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfRFdPUkQgZHdGaWx0ZXIpDQotew0KLSAgICBtX3BQYWdlVmlldyA9IHBQYWdlVmlldzsNCi0gICAgbV9kd0ZpbHRlciA9IGR3RmlsdGVyOw0KLSAgICBtX3NJdGVyYXRvci5Jbml0KChDWEZBX0xheW91dEl0ZW0qKXBQYWdlVmlldy0+R2V0TGF5b3V0UGFnZSgpKTsNCi0gICAgbV9iSWdub3JlcmVsZXZhbnQgPSAoKENYRkFfRkZEb2MqKW1fcFBhZ2VWaWV3LT5HZXREb2NWaWV3KCktPkdldERvYygpKS0+R2V0WEZBRG9jKCktPkdldEN1clZlcnNpb25Nb2RlKCkgPCBYRkFfVkVSU0lPTl8yMDU7DQotfQ0KLUNYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6On5DWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yKCkNCi17DQotfQ0KLXZvaWQgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6UmVzZXQoKQ0KLXsNCi0gICAgbV9zSXRlcmF0b3IuUmVzZXQoKTsNCi19DQotSVhGQV9XaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0ZpcnN0KCkNCi17DQotICAgIG1fc0l0ZXJhdG9yLlJlc2V0KCk7DQotICAgIGZvcihDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTGF5b3V0SXRlbTsgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IEdldFdpZGdldChwTGF5b3V0SXRlbSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gaFdpZGdldDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotSVhGQV9XaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0xhc3QoKQ0KLXsNCi0gICAgbV9zSXRlcmF0b3IuU2V0Q3VycmVudChOVUxMKTsNCi0gICAgcmV0dXJuIE1vdmVUb1ByZXZpb3VzKCk7DQotfQ0KLUlYRkFfV2lkZ2V0KiBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9OZXh0KCkNCi17DQotICAgIGZvcihDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvTmV4dCgpOyBwTGF5b3V0SXRlbTsgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IEdldFdpZGdldChwTGF5b3V0SXRlbSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gaFdpZGdldDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotSVhGQV9XaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb1ByZXZpb3VzKCkNCi17DQotICAgIGZvcihDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvUHJldigpOyBwTGF5b3V0SXRlbTsgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9QcmV2KCkpIHsNCi0gICAgICAgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IEdldFdpZGdldChwTGF5b3V0SXRlbSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gaFdpZGdldDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotSVhGQV9XaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6OkdldEN1cnJlbnRXaWRnZXQoKQ0KLXsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IG1fc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCi0gICAgcmV0dXJuIHBMYXlvdXRJdGVtID8gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBMYXlvdXRJdGVtKSA6IE5VTEw7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6U2V0Q3VycmVudFdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIGlmKGhXaWRnZXQgJiYgbV9zSXRlcmF0b3IuU2V0Q3VycmVudCgoKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQpLT5HZXRMYXlvdXRJdGVtKCkpKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUlYRkFfV2lkZ2V0KiBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpHZXRXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkNCi17DQotICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBMYXlvdXRJdGVtKSkgew0KLSAgICAgICAgaWYgKCFYRkFfUGFnZVdpZGdldEZpbHRlcihwV2lkZ2V0LCBtX2R3RmlsdGVyLCBGQUxTRSwgbV9iSWdub3JlcmVsZXZhbnQpKSB7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIXBXaWRnZXQtPklzTG9hZGVkKCkgJiYgKHBXaWRnZXQtPkdldFN0YXR1cygpICYgWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlKSAhPSAwKSB7DQotICAgICAgICAgICAgcFdpZGdldC0+TG9hZFdpZGdldCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHBXaWRnZXQ7DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUNYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6Q1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9EV09SRCBkd0ZpbHRlcikNCi0gICAgOiBtX3BQYWdlVmlldyhwUGFnZVZpZXcpDQotICAgICwgbV9kd0ZpbHRlcihkd0ZpbHRlcikNCi0gICAgLCBtX2lDdXJXaWRnZXQoLTEpDQotew0KLSAgICBtX2JJZ25vcmVyZWxldmFudCA9ICgoQ1hGQV9GRkRvYyopbV9wUGFnZVZpZXctPkdldERvY1ZpZXcoKS0+R2V0RG9jKCkpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKSA8IFhGQV9WRVJTSU9OXzIwNTsNCi0gICAgUmVzZXQoKTsNCi19DQotQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjp+Q1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yKCkNCi17DQotfQ0KLXZvaWQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpSZWxlYXNlKCkNCi17DQotICAgIGRlbGV0ZSB0aGlzOw0KLX0NCi12b2lkIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6UmVzZXQoKQ0KLXsNCi0gICAgQ3JlYXRlVGFiT3JkZXJXaWRnZXRBcnJheSgpOw0KLSAgICBtX2lDdXJXaWRnZXQgPSAtMTsNCi19DQotSVhGQV9XaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6TW92ZVRvRmlyc3QoKQ0KLXsNCi0gICAgaWYgKG1fVGFiT3JkZXJXaWRnZXRBcnJheS5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBpZiAoWEZBX1BhZ2VXaWRnZXRGaWx0ZXIobV9UYWJPcmRlcldpZGdldEFycmF5W2ldLCBtX2R3RmlsdGVyLCBUUlVFLCBtX2JJZ25vcmVyZWxldmFudCkpIHsNCi0gICAgICAgICAgICAgICAgbV9pQ3VyV2lkZ2V0ID0gaTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotSVhGQV9XaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6TW92ZVRvTGFzdCgpDQotew0KLSAgICBpZiAobV9UYWJPcmRlcldpZGdldEFycmF5LkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gbV9UYWJPcmRlcldpZGdldEFycmF5LkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQotICAgICAgICAgICAgaWYgKFhGQV9QYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgVFJVRSwgbV9iSWdub3JlcmVsZXZhbnQpKSB7DQotICAgICAgICAgICAgICAgIG1faUN1cldpZGdldCA9IGk7DQotICAgICAgICAgICAgICAgIHJldHVybiBtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbbV9pQ3VyV2lkZ2V0XTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUlYRkFfV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb05leHQoKQ0KLXsNCi0gICAgZm9yIChpbnQzMl90IGkgPSBtX2lDdXJXaWRnZXQgKyAxOyBpIDwgbV9UYWJPcmRlcldpZGdldEFycmF5LkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICBpZiAoWEZBX1BhZ2VXaWRnZXRGaWx0ZXIobV9UYWJPcmRlcldpZGdldEFycmF5W2ldLCBtX2R3RmlsdGVyLCBUUlVFLCBtX2JJZ25vcmVyZWxldmFudCkpIHsNCi0gICAgICAgICAgICBtX2lDdXJXaWRnZXQgPSBpOw0KLSAgICAgICAgICAgIHJldHVybiBtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbbV9pQ3VyV2lkZ2V0XTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX2lDdXJXaWRnZXQgPSAtMTsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUlYRkFfV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb1ByZXZpb3VzKCkNCi17DQotICAgIGZvciAoaW50MzJfdCBpID0gbV9pQ3VyV2lkZ2V0IC0gMTsgaSA+PSAwOyBpLS0pIHsNCi0gICAgICAgIGlmIChYRkFfUGFnZVdpZGdldEZpbHRlcihtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbaV0sIG1fZHdGaWx0ZXIsIFRSVUUsIG1fYklnbm9yZXJlbGV2YW50KSkgew0KLSAgICAgICAgICAgIG1faUN1cldpZGdldCA9IGk7DQotICAgICAgICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1faUN1cldpZGdldCA9IC0xOw0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotSVhGQV9XaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6R2V0Q3VycmVudFdpZGdldCgpDQotew0KLSAgICBpZiAobV9pQ3VyV2lkZ2V0ID49IDApIHsNCi0gICAgICAgIHJldHVybiBtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbbV9pQ3VyV2lkZ2V0XTsNCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotRlhfQk9PTCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OlNldEN1cnJlbnRXaWRnZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpDQotew0KLSAgICBpbnQzMl90IGlXaWRnZXRJbmRleCA9IG1fVGFiT3JkZXJXaWRnZXRBcnJheS5GaW5kKHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KSk7DQotICAgIGlmIChpV2lkZ2V0SW5kZXggPj0gMCkgew0KLSAgICAgICAgbV9pQ3VyV2lkZ2V0ID0gaVdpZGdldEluZGV4Ow0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1DWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkdldFRyYXZlcnNlV2lkZ2V0KENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpDQotew0KICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBXaWRnZXQtPkdldERhdGFBY2MoKTsNCi0gICAgQ1hGQV9Ob2RlKiBwVHJhdmVyc2FsID0gcEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9UcmF2ZXJzYWwpOw0KLSAgICBpZiAocFRyYXZlcnNhbCAhPSBOVUxMKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBUcmF2ZXJzZSA9IHBUcmF2ZXJzYWwtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1RyYXZlcnNlKTsNCi0gICAgICAgIGlmIChwVHJhdmVyc2UgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVHJhdmVyc2VXaWRnZXROYW1lOw0KLSAgICAgICAgICAgIGlmIChwVHJhdmVyc2UtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1JlZiwgd3NUcmF2ZXJzZVdpZGdldE5hbWUpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGaW5kV2lkZ2V0QnlOYW1lKHdzVHJhdmVyc2VXaWRnZXROYW1lLCBwV2lkZ2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICAgIGludDMyX3QgdHlwZSA9IHBBY2MtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKHR5cGUgIT0gWEZBX0VMRU1FTlRfRmllbGQgJiYgdHlwZSAhPSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUNYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6RmluZFdpZGdldEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzV2lkZ2V0TmFtZSwgQ1hGQV9GRldpZGdldCogcFJlZldpZGdldCkNCi17DQotICAgIHJldHVybiBwUmVmV2lkZ2V0LT5HZXREb2NWaWV3KCktPkdldFdpZGdldEJ5TmFtZSh3c1dpZGdldE5hbWUsIHBSZWZXaWRnZXQpOw0KLX0NCi12b2lkIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6Q3JlYXRlVGFiT3JkZXJXaWRnZXRBcnJheSgpDQotew0KLSAgICBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuUmVtb3ZlQWxsKCk7DQotICAgIENYRkFfV2lkZ2V0QXJyYXkgU3BhY2VPcmRlcldpZGdldEFycmF5Ow0KLSAgICBDcmVhdGVTcGFjZU9yZGVyV2lkZ2V0QXJyYXkoU3BhY2VPcmRlcldpZGdldEFycmF5KTsNCi0gICAgaW50MzJfdCBuV2lkZ2V0Q291bnQgPSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBpZiAobldpZGdldENvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgICBGWF9GTE9BVCBmV2lkZ2V0eCA9IGZ4LCBmV2lkZ2V0eSA9IGZ5Ow0KKyAgICBwV2lkZ2V0LT5Sb3RhdGUyTm9ybWFsKGZXaWRnZXR4LCBmV2lkZ2V0eSk7DQorICAgIEZYX0RXT1JEIGR3RmxhZyA9IHBXaWRnZXQtPk9uSGl0VGVzdChmV2lkZ2V0eCwgZldpZGdldHkpOw0KKyAgICBpZiAoKEZXTF9XR1RISVRURVNUX0NsaWVudCA9PSBkd0ZsYWcgfHwNCisgICAgICAgICBGV0xfV0dUSElUVEVTVF9UcmFuc3BhcmVudCA9PSBkd0ZsYWcpKSB7DQorICAgICAgcEl0ZXJhdG9yLT5SZWxlYXNlKCk7DQorICAgICAgcmV0dXJuIHBXaWRnZXQ7DQogICAgIH0NCi0gICAgQ1hGQV9GRldpZGdldCogaFdpZGdldCA9IFNwYWNlT3JkZXJXaWRnZXRBcnJheVswXTsNCi0gICAgZm9yICg7IG1fVGFiT3JkZXJXaWRnZXRBcnJheS5HZXRTaXplKCkgPCBuV2lkZ2V0Q291bnQ7ICkgew0KLSAgICAgICAgaWYgKG1fVGFiT3JkZXJXaWRnZXRBcnJheS5GaW5kKGhXaWRnZXQpIDwgMCkgew0KLSAgICAgICAgICAgIG1fVGFiT3JkZXJXaWRnZXRBcnJheS5BZGQoaFdpZGdldCk7DQotICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBoV2lkZ2V0LT5HZXREYXRhQWNjKCk7DQotICAgICAgICAgICAgaWYgKHBXaWRnZXRBY2MtPkdldFVJVHlwZSgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlXaWRnZXRJbmRleCA9IFNwYWNlT3JkZXJXaWRnZXRBcnJheS5GaW5kKGhXaWRnZXQpICsgMTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKFRSVUUpIHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBSYWRpbyA9IFNwYWNlT3JkZXJXaWRnZXRBcnJheVsoaVdpZGdldEluZGV4KSAlIG5XaWRnZXRDb3VudF07DQotICAgICAgICAgICAgICAgICAgICBpZiAocFJhZGlvLT5HZXREYXRhQWNjKCktPkdldEV4Y2xHcm91cCgpICE9IHBXaWRnZXRBY2MpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuRmluZChoV2lkZ2V0KSA8IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuQWRkKHBSYWRpbyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpV2lkZ2V0SW5kZXgrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoQ1hGQV9GRldpZGdldCogaFRyYXZlcnNlV2lkZ2V0ID0gR2V0VHJhdmVyc2VXaWRnZXQoaFdpZGdldCkpIHsNCi0gICAgICAgICAgICAgICAgaFdpZGdldCA9IGhUcmF2ZXJzZVdpZGdldDsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpV2lkZ2V0SW5kZXggPSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuRmluZChoV2lkZ2V0KTsNCi0gICAgICAgIGhXaWRnZXQgPSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXlbKGlXaWRnZXRJbmRleCArIDEpICUgbldpZGdldENvdW50XTsNCi0gICAgfQ0KKyAgfQ0KKyAgcEl0ZXJhdG9yLT5SZWxlYXNlKCk7DQorICByZXR1cm4gTlVMTDsNCiB9DQotc3RhdGljIGludDMyX3QgWEZBX1RhYk9yZGVyV2lkZ2V0Q29tcGFyYXRvcihjb25zdCB2b2lkKiBwaFdpZGdldDEsIGNvbnN0IHZvaWQqIHBoV2lkZ2V0MikNCi17DQotICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQxID0gKCooQ1hGQV9UYWJQYXJhbSoqKXBoV2lkZ2V0MSktPm1fcFdpZGdldDsNCi0gICAgQ1hGQV9GRldpZGdldCogcFdpZGdldDIgPSAoKihDWEZBX1RhYlBhcmFtKiopcGhXaWRnZXQyKS0+bV9wV2lkZ2V0Ow0KLSAgICBDRlhfUmVjdEYgcnQxLCBydDI7DQotICAgIHBXaWRnZXQxLT5HZXRXaWRnZXRSZWN0KHJ0MSk7DQotICAgIHBXaWRnZXQyLT5HZXRXaWRnZXRSZWN0KHJ0Mik7DQotICAgIEZYX0ZMT0FUIHgxID0gcnQxLmxlZnQsIHkxID0gcnQxLnRvcCwgeDIgPSBydDIubGVmdCwgeTIgPSBydDIudG9wOw0KLSAgICBpZiAoeTEgPCB5MiB8fCAoeTEgLSB5MiA8IFhGQV9GTE9BVF9QRVJDSVNJT04gJiYgeDEgPCB4MikpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICByZXR1cm4gMTsNCitJWEZBX1dpZGdldEl0ZXJhdG9yKiBDWEZBX0ZGUGFnZVZpZXc6OkNyZWF0ZVdpZGdldEl0ZXJhdG9yKA0KKyAgICBGWF9EV09SRCBkd1RyYXZlcnNlV2F5LA0KKyAgICBGWF9EV09SRCBkd1dpZGdldEZpbHRlcikgew0KKyAgc3dpdGNoIChkd1RyYXZlcnNlV2F5KSB7DQorICAgIGNhc2UgWEZBX1RSQVZFUlNFV0FZX1RyYW52YWxzZToNCisgICAgICByZXR1cm4gRlhfTkVXIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcih0aGlzLCBkd1dpZGdldEZpbHRlcik7DQorICAgIGNhc2UgWEZBX1RSQVZFUlNFV0FZX0Zvcm06DQorICAgICAgcmV0dXJuIEZYX05FVyBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yKHRoaXMsIGR3V2lkZ2V0RmlsdGVyKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi12b2lkIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6T3JkZXJDb250YWluZXIoQ1hGQV9MYXlvdXRJdGVtSXRlcmF0b3IqIHNJdGVyYXRvciwgQ1hGQV9MYXlvdXRJdGVtKiBwQ29udGFpbmVySXRlbSwgQ1hGQV9UYWJQYXJhbSogcENvbnRhaW5lciwgRlhfQk9PTCAmYkN1cnJlbnRJdGVtLCBGWF9CT09MJiBiQ29udGVudEFyZWEsIEZYX0JPT0wgYk1hcnN0ZXJQYWdlKQ0KLXsNCi0gICAgQ0ZYX1B0ckFycmF5IHRhYlBhcmFtczsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtKiBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KLSAgICB3aGlsZShwU2VhcmNoSXRlbSkgew0KLSAgICAgICAgRlhfQk9PTCBiSXNDb250ZW50TGF5b3V0SXRlbSA9ICgoQ1hGQV9MYXlvdXRJdGVtSW1wbCopcFNlYXJjaEl0ZW0pLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCk7DQotICAgICAgICBpZighYklzQ29udGVudExheW91dEl0ZW0pIHsNCi0gICAgICAgICAgICBiQ29udGVudEFyZWEgPSBUUlVFOw0KLSAgICAgICAgICAgIHBTZWFyY2hJdGVtID0gc0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYk1hcnN0ZXJQYWdlICYmIGJDb250ZW50QXJlYSkgew0KK3N0YXRpYyBGWF9CT09MIFhGQV9QYWdlV2lkZ2V0RmlsdGVyKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGaWx0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhdmVyc2FsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklnbm9yZXJlbGV2YW50KSB7DQorICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBXaWRnZXQtPkdldERhdGFBY2MoKTsNCisgIEZYX0RXT1JEIGR3VHlwZSA9IGR3RmlsdGVyICYgWEZBX1dJREdFVEZJTFRFUl9BbGxUeXBlOw0KKyAgaWYgKChkd1R5cGUgPT0gWEZBX1dJREdFVEZJTFRFUl9GaWVsZCkgJiYNCisgICAgICAocFdpZGdldEFjYy0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0ZpZWxkKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9EV09SRCBkd1N0YXR1cyA9IHBXaWRnZXQtPkdldFN0YXR1cygpOw0KKyAgaWYgKGJUcmF2ZXJzYWwgJiYgKGR3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19EaXNhYmxlZCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJJZ25vcmVyZWxldmFudCkgew0KKyAgICByZXR1cm4gKGR3U3RhdHVzICYgWEZBX1dJREdFVEZJTFRFUl9WaXNpYmxlKSAhPSAwOw0KKyAgfQ0KKyAgZHdGaWx0ZXIgJj0gKFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZSB8IFhGQV9XSURHRVRGSUxURVJfVmlld2FibGUgfA0KKyAgICAgICAgICAgICAgIFhGQV9XSURHRVRGSUxURVJfUHJpbnRhYmxlKTsNCisgIHJldHVybiAoZHdGaWx0ZXIgJiBkd1N0YXR1cykgPT0gZHdGaWx0ZXI7DQorfQ0KK0NYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6OkNYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3IoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZpbHRlcikgew0KKyAgbV9wUGFnZVZpZXcgPSBwUGFnZVZpZXc7DQorICBtX2R3RmlsdGVyID0gZHdGaWx0ZXI7DQorICBtX3NJdGVyYXRvci5Jbml0KChDWEZBX0xheW91dEl0ZW0qKXBQYWdlVmlldy0+R2V0TGF5b3V0UGFnZSgpKTsNCisgIG1fYklnbm9yZXJlbGV2YW50ID0gKChDWEZBX0ZGRG9jKiltX3BQYWdlVmlldy0+R2V0RG9jVmlldygpLT5HZXREb2MoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0WEZBRG9jKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0Q3VyVmVyc2lvbk1vZGUoKSA8IFhGQV9WRVJTSU9OXzIwNTsNCit9DQorQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6fkNYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3IoKSB7fQ0KK3ZvaWQgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6UmVzZXQoKSB7DQorICBtX3NJdGVyYXRvci5SZXNldCgpOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6TW92ZVRvRmlyc3QoKSB7DQorICBtX3NJdGVyYXRvci5SZXNldCgpOw0KKyAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTGF5b3V0SXRlbTsNCisgICAgICAgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gR2V0V2lkZ2V0KHBMYXlvdXRJdGVtKSkgew0KKyAgICAgIHJldHVybiBoV2lkZ2V0Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorSVhGQV9XaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0xhc3QoKSB7DQorICBtX3NJdGVyYXRvci5TZXRDdXJyZW50KE5VTEwpOw0KKyAgcmV0dXJuIE1vdmVUb1ByZXZpb3VzKCk7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9OZXh0KCkgew0KKyAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvTmV4dCgpOyBwTGF5b3V0SXRlbTsNCisgICAgICAgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gR2V0V2lkZ2V0KHBMYXlvdXRJdGVtKSkgew0KKyAgICAgIHJldHVybiBoV2lkZ2V0Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorSVhGQV9XaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb1ByZXZpb3VzKCkgew0KKyAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvUHJldigpOyBwTGF5b3V0SXRlbTsNCisgICAgICAgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9QcmV2KCkpIHsNCisgICAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gR2V0V2lkZ2V0KHBMYXlvdXRJdGVtKSkgew0KKyAgICAgIHJldHVybiBoV2lkZ2V0Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorSVhGQV9XaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6OkdldEN1cnJlbnRXaWRnZXQoKSB7DQorICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KKyAgcmV0dXJuIHBMYXlvdXRJdGVtID8gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBMYXlvdXRJdGVtKSA6IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6U2V0Q3VycmVudFdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgaWYgKGhXaWRnZXQgJiYNCisgICAgICBtX3NJdGVyYXRvci5TZXRDdXJyZW50KCgoQ1hGQV9GRldpZGdldCopaFdpZGdldCktPkdldExheW91dEl0ZW0oKSkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpHZXRXaWRnZXQoDQorICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsNCisgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBMYXlvdXRJdGVtKSkgew0KKyAgICBpZiAoIVhGQV9QYWdlV2lkZ2V0RmlsdGVyKHBXaWRnZXQsIG1fZHdGaWx0ZXIsIEZBTFNFLCBtX2JJZ25vcmVyZWxldmFudCkpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoIXBXaWRnZXQtPklzTG9hZGVkKCkgJiYNCisgICAgICAgIChwV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkgIT0gMCkgew0KKyAgICAgIHBXaWRnZXQtPkxvYWRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcFdpZGdldDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkNYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcigNCisgICAgQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgIEZYX0RXT1JEIGR3RmlsdGVyKQ0KKyAgICA6IG1fcFBhZ2VWaWV3KHBQYWdlVmlldyksIG1fZHdGaWx0ZXIoZHdGaWx0ZXIpLCBtX2lDdXJXaWRnZXQoLTEpIHsNCisgIG1fYklnbm9yZXJlbGV2YW50ID0gKChDWEZBX0ZGRG9jKiltX3BQYWdlVmlldy0+R2V0RG9jVmlldygpLT5HZXREb2MoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0WEZBRG9jKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0Q3VyVmVyc2lvbk1vZGUoKSA8IFhGQV9WRVJTSU9OXzIwNTsNCisgIFJlc2V0KCk7DQorfQ0KK0NYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6fkNYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcigpIHt9DQordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCit9DQordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OlJlc2V0KCkgew0KKyAgQ3JlYXRlVGFiT3JkZXJXaWRnZXRBcnJheSgpOw0KKyAgbV9pQ3VyV2lkZ2V0ID0gLTE7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0ZpcnN0KCkgew0KKyAgaWYgKG1fVGFiT3JkZXJXaWRnZXRBcnJheS5HZXRTaXplKCkgPiAwKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fVGFiT3JkZXJXaWRnZXRBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgIGlmIChYRkFfUGFnZVdpZGdldEZpbHRlcihtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbaV0sIG1fZHdGaWx0ZXIsIFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYklnbm9yZXJlbGV2YW50KSkgew0KKyAgICAgICAgbV9pQ3VyV2lkZ2V0ID0gaTsNCisgICAgICAgIHJldHVybiBtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbbV9pQ3VyV2lkZ2V0XTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkgew0KKyAgaWYgKG1fVGFiT3JkZXJXaWRnZXRBcnJheS5HZXRTaXplKCkgPiAwKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gbV9UYWJPcmRlcldpZGdldEFycmF5LkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorICAgICAgaWYgKFhGQV9QYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSWdub3JlcmVsZXZhbnQpKSB7DQorICAgICAgICBtX2lDdXJXaWRnZXQgPSBpOw0KKyAgICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb05leHQoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IG1faUN1cldpZGdldCArIDE7IGkgPCBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgaWYgKFhGQV9QYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYklnbm9yZXJlbGV2YW50KSkgew0KKyAgICAgIG1faUN1cldpZGdldCA9IGk7DQorICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOw0KKyAgICB9DQorICB9DQorICBtX2lDdXJXaWRnZXQgPSAtMTsNCisgIHJldHVybiBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9QcmV2aW91cygpIHsNCisgIGZvciAoaW50MzJfdCBpID0gbV9pQ3VyV2lkZ2V0IC0gMTsgaSA+PSAwOyBpLS0pIHsNCisgICAgaWYgKFhGQV9QYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYklnbm9yZXJlbGV2YW50KSkgew0KKyAgICAgIG1faUN1cldpZGdldCA9IGk7DQorICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOw0KKyAgICB9DQorICB9DQorICBtX2lDdXJXaWRnZXQgPSAtMTsNCisgIHJldHVybiBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpHZXRDdXJyZW50V2lkZ2V0KCkgew0KKyAgaWYgKG1faUN1cldpZGdldCA+PSAwKSB7DQorICAgIHJldHVybiBtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbbV9pQ3VyV2lkZ2V0XTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6U2V0Q3VycmVudFdpZGdldCgNCisgICAgSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIGludDMyX3QgaVdpZGdldEluZGV4ID0NCisgICAgICBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuRmluZChzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCkpOw0KKyAgaWYgKGlXaWRnZXRJbmRleCA+PSAwKSB7DQorICAgIG1faUN1cldpZGdldCA9IGlXaWRnZXRJbmRleDsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6R2V0VHJhdmVyc2VXaWRnZXQoDQorICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpIHsNCisgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOw0KKyAgQ1hGQV9Ob2RlKiBwVHJhdmVyc2FsID0gcEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9UcmF2ZXJzYWwpOw0KKyAgaWYgKHBUcmF2ZXJzYWwgIT0gTlVMTCkgew0KKyAgICBDWEZBX05vZGUqIHBUcmF2ZXJzZSA9IHBUcmF2ZXJzYWwtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1RyYXZlcnNlKTsNCisgICAgaWYgKHBUcmF2ZXJzZSAhPSBOVUxMKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUcmF2ZXJzZVdpZGdldE5hbWU7DQorICAgICAgaWYgKHBUcmF2ZXJzZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1RyYXZlcnNlV2lkZ2V0TmFtZSkpIHsNCisgICAgICAgIHJldHVybiBGaW5kV2lkZ2V0QnlOYW1lKHdzVHJhdmVyc2VXaWRnZXROYW1lLCBwV2lkZ2V0KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkZpbmRXaWRnZXRCeU5hbWUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NXaWRnZXROYW1lLA0KKyAgICBDWEZBX0ZGV2lkZ2V0KiBwUmVmV2lkZ2V0KSB7DQorICByZXR1cm4gcFJlZldpZGdldC0+R2V0RG9jVmlldygpLT5HZXRXaWRnZXRCeU5hbWUod3NXaWRnZXROYW1lLCBwUmVmV2lkZ2V0KTsNCit9DQordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkNyZWF0ZVRhYk9yZGVyV2lkZ2V0QXJyYXkoKSB7DQorICBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuUmVtb3ZlQWxsKCk7DQorICBDWEZBX1dpZGdldEFycmF5IFNwYWNlT3JkZXJXaWRnZXRBcnJheTsNCisgIENyZWF0ZVNwYWNlT3JkZXJXaWRnZXRBcnJheShTcGFjZU9yZGVyV2lkZ2V0QXJyYXkpOw0KKyAgaW50MzJfdCBuV2lkZ2V0Q291bnQgPSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKG5XaWRnZXRDb3VudCA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9GRldpZGdldCogaFdpZGdldCA9IFNwYWNlT3JkZXJXaWRnZXRBcnJheVswXTsNCisgIGZvciAoOyBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpIDwgbldpZGdldENvdW50Oykgew0KKyAgICBpZiAobV9UYWJPcmRlcldpZGdldEFycmF5LkZpbmQoaFdpZGdldCkgPCAwKSB7DQorICAgICAgbV9UYWJPcmRlcldpZGdldEFycmF5LkFkZChoV2lkZ2V0KTsNCisgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IGhXaWRnZXQtPkdldERhdGFBY2MoKTsNCisgICAgICBpZiAocFdpZGdldEFjYy0+R2V0VUlUeXBlKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgICAgICBpbnQzMl90IGlXaWRnZXRJbmRleCA9IFNwYWNlT3JkZXJXaWRnZXRBcnJheS5GaW5kKGhXaWRnZXQpICsgMTsNCisgICAgICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBSYWRpbyA9DQorICAgICAgICAgICAgICBTcGFjZU9yZGVyV2lkZ2V0QXJyYXlbKGlXaWRnZXRJbmRleCkgJSBuV2lkZ2V0Q291bnRdOw0KKyAgICAgICAgICBpZiAocFJhZGlvLT5HZXREYXRhQWNjKCktPkdldEV4Y2xHcm91cCgpICE9IHBXaWRnZXRBY2MpIHsNCiAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAobV9UYWJPcmRlcldpZGdldEFycmF5LkZpbmQoaFdpZGdldCkgPCAwKSB7DQorICAgICAgICAgICAgbV9UYWJPcmRlcldpZGdldEFycmF5LkFkZChwUmFkaW8pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlXaWRnZXRJbmRleCsrOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJNYXJzdGVyUGFnZSB8fCBiQ29udGVudEFyZWEpIHsNCi0gICAgICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0ID0gR2V0V2lkZ2V0KHBTZWFyY2hJdGVtKTsNCi0gICAgICAgICAgICBpZiAoIWhXaWRnZXQpIHsNCi0gICAgICAgICAgICAgICAgcFNlYXJjaEl0ZW0gPSBzSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwQ29udGFpbmVySXRlbSAmJiAocFNlYXJjaEl0ZW0tPkdldFBhcmVudCgpICE9IHBDb250YWluZXJJdGVtKSkgew0KLSAgICAgICAgICAgICAgICBiQ3VycmVudEl0ZW0gPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1hGQV9UYWJQYXJhbSogcFBhcmFtID0gRlhfTkVXIENYRkFfVGFiUGFyYW07DQotICAgICAgICAgICAgcFBhcmFtLT5tX3BXaWRnZXQgPSBoV2lkZ2V0Ow0KLSAgICAgICAgICAgIHRhYlBhcmFtcy5BZGQocFBhcmFtKTsNCi0gICAgICAgICAgICBpZiAoWEZBX0lzTGF5b3V0RWxlbWVudChwU2VhcmNoSXRlbS0+R2V0Rm9ybU5vZGUoKS0+R2V0Q2xhc3NJRCgpLCBUUlVFKSkgew0KLSAgICAgICAgICAgICAgICBPcmRlckNvbnRhaW5lcihzSXRlcmF0b3IsIHBTZWFyY2hJdGVtLCBwUGFyYW0sIGJDdXJyZW50SXRlbSwgYkNvbnRlbnRBcmVhLCBiTWFyc3RlclBhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiQ3VycmVudEl0ZW0pIHsNCi0gICAgICAgICAgICBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+R2V0Q3VycmVudCgpOw0KLSAgICAgICAgICAgIGJDdXJyZW50SXRlbSA9IEZBTFNFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KLSAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoQ1hGQV9GRldpZGdldCogaFRyYXZlcnNlV2lkZ2V0ID0gR2V0VHJhdmVyc2VXaWRnZXQoaFdpZGdldCkpIHsNCisgICAgICAgIGhXaWRnZXQgPSBoVHJhdmVyc2VXaWRnZXQ7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaW50MzJfdCBpQ2hpbGRyZW4gPSB0YWJQYXJhbXMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaUNoaWxkcmVuID4gMSkgew0KLSAgICAgICAgRlhTWVNfcXNvcnQodGFiUGFyYW1zLkdldERhdGEoKSwgaUNoaWxkcmVuLCBzaXplb2Yodm9pZCopLCBYRkFfVGFiT3JkZXJXaWRnZXRDb21wYXJhdG9yKTsNCi0gICAgfQ0KLSAgICBmb3IgKGludDMyX3QgaVN0YXJ0ID0gMDsgaVN0YXJ0IDwgaUNoaWxkcmVuOyBpU3RhcnQrKykgew0KLSAgICAgICAgQ1hGQV9UYWJQYXJhbSogcFBhcmFtID0gKENYRkFfVGFiUGFyYW0qKXRhYlBhcmFtc1tpU3RhcnRdOw0KLSAgICAgICAgcENvbnRhaW5lci0+bV9DaGlsZHJlbi5BZGQocFBhcmFtLT5tX3BXaWRnZXQpOw0KLSAgICAgICAgaWYgKHBQYXJhbS0+bV9DaGlsZHJlbi5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgcENvbnRhaW5lci0+bV9DaGlsZHJlbi5BcHBlbmQocFBhcmFtLT5tX0NoaWxkcmVuKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRlbGV0ZSBwUGFyYW07DQotICAgIH0NCi0gICAgdGFiUGFyYW1zLlJlbW92ZUFsbCgpOw0KKyAgICBpbnQzMl90IGlXaWRnZXRJbmRleCA9IFNwYWNlT3JkZXJXaWRnZXRBcnJheS5GaW5kKGhXaWRnZXQpOw0KKyAgICBoV2lkZ2V0ID0gU3BhY2VPcmRlcldpZGdldEFycmF5WyhpV2lkZ2V0SW5kZXggKyAxKSAlIG5XaWRnZXRDb3VudF07DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpDcmVhdGVTcGFjZU9yZGVyV2lkZ2V0QXJyYXkoQ1hGQV9XaWRnZXRBcnJheSYgV2lkZ2V0QXJyYXkpDQotew0KLSAgICBDWEZBX0xheW91dEl0ZW1JdGVyYXRvciBzSXRlcmF0b3I7DQotICAgIHNJdGVyYXRvci5Jbml0KChDWEZBX0xheW91dEl0ZW0qKW1fcFBhZ2VWaWV3LT5HZXRMYXlvdXRQYWdlKCkpOw0KLSAgICBDWEZBX1RhYlBhcmFtKiBwUGFyYW0gPSBGWF9ORVcgQ1hGQV9UYWJQYXJhbTsNCi0gICAgRlhfQk9PTCBiQ3VycmVudEl0ZW0gPSBGQUxTRTsNCi0gICAgRlhfQk9PTCBiQ29udGVudEFyZWEgPSBGQUxTRTsNCi0gICAgT3JkZXJDb250YWluZXIoJnNJdGVyYXRvciwgTlVMTCwgcFBhcmFtLCBiQ3VycmVudEl0ZW0sIGJDb250ZW50QXJlYSk7DQotICAgIGlmIChwUGFyYW0tPm1fQ2hpbGRyZW4uR2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgV2lkZ2V0QXJyYXkuQXBwZW5kKHBQYXJhbS0+bV9DaGlsZHJlbik7DQorc3RhdGljIGludDMyX3QgWEZBX1RhYk9yZGVyV2lkZ2V0Q29tcGFyYXRvcihjb25zdCB2b2lkKiBwaFdpZGdldDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwaFdpZGdldDIpIHsNCisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQxID0gKCooQ1hGQV9UYWJQYXJhbSoqKXBoV2lkZ2V0MSktPm1fcFdpZGdldDsNCisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQyID0gKCooQ1hGQV9UYWJQYXJhbSoqKXBoV2lkZ2V0MiktPm1fcFdpZGdldDsNCisgIENGWF9SZWN0RiBydDEsIHJ0MjsNCisgIHBXaWRnZXQxLT5HZXRXaWRnZXRSZWN0KHJ0MSk7DQorICBwV2lkZ2V0Mi0+R2V0V2lkZ2V0UmVjdChydDIpOw0KKyAgRlhfRkxPQVQgeDEgPSBydDEubGVmdCwgeTEgPSBydDEudG9wLCB4MiA9IHJ0Mi5sZWZ0LCB5MiA9IHJ0Mi50b3A7DQorICBpZiAoeTEgPCB5MiB8fCAoeTEgLSB5MiA8IFhGQV9GTE9BVF9QRVJDSVNJT04gJiYgeDEgPCB4MikpIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgcmV0dXJuIDE7DQorfQ0KK3ZvaWQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpPcmRlckNvbnRhaW5lcigNCisgICAgQ1hGQV9MYXlvdXRJdGVtSXRlcmF0b3IqIHNJdGVyYXRvciwNCisgICAgQ1hGQV9MYXlvdXRJdGVtKiBwQ29udGFpbmVySXRlbSwNCisgICAgQ1hGQV9UYWJQYXJhbSogcENvbnRhaW5lciwNCisgICAgRlhfQk9PTCYgYkN1cnJlbnRJdGVtLA0KKyAgICBGWF9CT09MJiBiQ29udGVudEFyZWEsDQorICAgIEZYX0JPT0wgYk1hcnN0ZXJQYWdlKSB7DQorICBDRlhfUHRyQXJyYXkgdGFiUGFyYW1zOw0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgd2hpbGUgKHBTZWFyY2hJdGVtKSB7DQorICAgIEZYX0JPT0wgYklzQ29udGVudExheW91dEl0ZW0gPQ0KKyAgICAgICAgKChDWEZBX0xheW91dEl0ZW1JbXBsKilwU2VhcmNoSXRlbSktPklzQ29udGVudExheW91dEl0ZW0oKTsNCisgICAgaWYgKCFiSXNDb250ZW50TGF5b3V0SXRlbSkgew0KKyAgICAgIGJDb250ZW50QXJlYSA9IFRSVUU7DQorICAgICAgcFNlYXJjaEl0ZW0gPSBzSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBzSXRlcmF0b3IuUmVzZXQoKTsNCi0gICAgYkN1cnJlbnRJdGVtID0gRkFMU0U7DQotICAgIGJDb250ZW50QXJlYSA9IEZBTFNFOw0KLSAgICBwUGFyYW0tPm1fQ2hpbGRyZW4uUmVtb3ZlQWxsKCk7DQotICAgIE9yZGVyQ29udGFpbmVyKCZzSXRlcmF0b3IsIE5VTEwsIHBQYXJhbSwgYkN1cnJlbnRJdGVtLCBiQ29udGVudEFyZWEsIFRSVUUpOw0KKyAgICBpZiAoYk1hcnN0ZXJQYWdlICYmIGJDb250ZW50QXJlYSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChiTWFyc3RlclBhZ2UgfHwgYkNvbnRlbnRBcmVhKSB7DQorICAgICAgQ1hGQV9GRldpZGdldCogaFdpZGdldCA9IEdldFdpZGdldChwU2VhcmNoSXRlbSk7DQorICAgICAgaWYgKCFoV2lkZ2V0KSB7DQorICAgICAgICBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChwQ29udGFpbmVySXRlbSAmJiAocFNlYXJjaEl0ZW0tPkdldFBhcmVudCgpICE9IHBDb250YWluZXJJdGVtKSkgew0KKyAgICAgICAgYkN1cnJlbnRJdGVtID0gVFJVRTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBDWEZBX1RhYlBhcmFtKiBwUGFyYW0gPSBGWF9ORVcgQ1hGQV9UYWJQYXJhbTsNCisgICAgICBwUGFyYW0tPm1fcFdpZGdldCA9IGhXaWRnZXQ7DQorICAgICAgdGFiUGFyYW1zLkFkZChwUGFyYW0pOw0KKyAgICAgIGlmIChYRkFfSXNMYXlvdXRFbGVtZW50KHBTZWFyY2hJdGVtLT5HZXRGb3JtTm9kZSgpLT5HZXRDbGFzc0lEKCksIFRSVUUpKSB7DQorICAgICAgICBPcmRlckNvbnRhaW5lcihzSXRlcmF0b3IsIHBTZWFyY2hJdGVtLCBwUGFyYW0sIGJDdXJyZW50SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgIGJDb250ZW50QXJlYSwgYk1hcnN0ZXJQYWdlKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGJDdXJyZW50SXRlbSkgew0KKyAgICAgIHBTZWFyY2hJdGVtID0gc0l0ZXJhdG9yLT5HZXRDdXJyZW50KCk7DQorICAgICAgYkN1cnJlbnRJdGVtID0gRkFMU0U7DQorICAgIH0gZWxzZSB7DQorICAgICAgcFNlYXJjaEl0ZW0gPSBzSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpQ2hpbGRyZW4gPSB0YWJQYXJhbXMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlDaGlsZHJlbiA+IDEpIHsNCisgICAgRlhTWVNfcXNvcnQodGFiUGFyYW1zLkdldERhdGEoKSwgaUNoaWxkcmVuLCBzaXplb2Yodm9pZCopLA0KKyAgICAgICAgICAgICAgICBYRkFfVGFiT3JkZXJXaWRnZXRDb21wYXJhdG9yKTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpU3RhcnQgPSAwOyBpU3RhcnQgPCBpQ2hpbGRyZW47IGlTdGFydCsrKSB7DQorICAgIENYRkFfVGFiUGFyYW0qIHBQYXJhbSA9IChDWEZBX1RhYlBhcmFtKil0YWJQYXJhbXNbaVN0YXJ0XTsNCisgICAgcENvbnRhaW5lci0+bV9DaGlsZHJlbi5BZGQocFBhcmFtLT5tX3BXaWRnZXQpOw0KICAgICBpZiAocFBhcmFtLT5tX0NoaWxkcmVuLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgIFdpZGdldEFycmF5LkFwcGVuZChwUGFyYW0tPm1fQ2hpbGRyZW4pOw0KKyAgICAgIHBDb250YWluZXItPm1fQ2hpbGRyZW4uQXBwZW5kKHBQYXJhbS0+bV9DaGlsZHJlbik7DQogICAgIH0NCiAgICAgZGVsZXRlIHBQYXJhbTsNCisgIH0NCisgIHRhYlBhcmFtcy5SZW1vdmVBbGwoKTsNCiB9DQotQ1hGQV9GRldpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpHZXRXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkNCi17DQotICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBMYXlvdXRJdGVtKSkgew0KLSAgICAgICAgaWYgKCFwV2lkZ2V0LT5Jc0xvYWRlZCgpICYmIChwV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCi0gICAgICAgICAgICBwV2lkZ2V0LT5Mb2FkV2lkZ2V0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcFdpZGdldDsNCit2b2lkIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6Q3JlYXRlU3BhY2VPcmRlcldpZGdldEFycmF5KA0KKyAgICBDWEZBX1dpZGdldEFycmF5JiBXaWRnZXRBcnJheSkgew0KKyAgQ1hGQV9MYXlvdXRJdGVtSXRlcmF0b3Igc0l0ZXJhdG9yOw0KKyAgc0l0ZXJhdG9yLkluaXQoKENYRkFfTGF5b3V0SXRlbSopbV9wUGFnZVZpZXctPkdldExheW91dFBhZ2UoKSk7DQorICBDWEZBX1RhYlBhcmFtKiBwUGFyYW0gPSBGWF9ORVcgQ1hGQV9UYWJQYXJhbTsNCisgIEZYX0JPT0wgYkN1cnJlbnRJdGVtID0gRkFMU0U7DQorICBGWF9CT09MIGJDb250ZW50QXJlYSA9IEZBTFNFOw0KKyAgT3JkZXJDb250YWluZXIoJnNJdGVyYXRvciwgTlVMTCwgcFBhcmFtLCBiQ3VycmVudEl0ZW0sIGJDb250ZW50QXJlYSk7DQorICBpZiAocFBhcmFtLT5tX0NoaWxkcmVuLkdldFNpemUoKSA+IDApIHsNCisgICAgV2lkZ2V0QXJyYXkuQXBwZW5kKHBQYXJhbS0+bV9DaGlsZHJlbik7DQorICB9DQorICBzSXRlcmF0b3IuUmVzZXQoKTsNCisgIGJDdXJyZW50SXRlbSA9IEZBTFNFOw0KKyAgYkNvbnRlbnRBcmVhID0gRkFMU0U7DQorICBwUGFyYW0tPm1fQ2hpbGRyZW4uUmVtb3ZlQWxsKCk7DQorICBPcmRlckNvbnRhaW5lcigmc0l0ZXJhdG9yLCBOVUxMLCBwUGFyYW0sIGJDdXJyZW50SXRlbSwgYkNvbnRlbnRBcmVhLCBUUlVFKTsNCisgIGlmIChwUGFyYW0tPm1fQ2hpbGRyZW4uR2V0U2l6ZSgpID4gMCkgew0KKyAgICBXaWRnZXRBcnJheS5BcHBlbmQocFBhcmFtLT5tX0NoaWxkcmVuKTsNCisgIH0NCisgIGRlbGV0ZSBwUGFyYW07DQorfQ0KK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6R2V0V2lkZ2V0KA0KKyAgICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7DQorICBpZiAoQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShwTGF5b3V0SXRlbSkpIHsNCisgICAgaWYgKCFwV2lkZ2V0LT5Jc0xvYWRlZCgpICYmDQorICAgICAgICAocFdpZGdldC0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpKSB7DQorICAgICAgcFdpZGdldC0+TG9hZFdpZGdldCgpOw0KICAgICB9DQotICAgIHJldHVybiBOVUxMOw0KKyAgICByZXR1cm4gcFdpZGdldDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYWdldmlldy5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGFnZXZpZXcuaAppbmRleCBkNDE3NDUxLi5jYzk0NDhiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYWdldmlldy5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhZ2V2aWV3LmgKQEAgLTgsOTIgKzgsMTAwIEBACiAjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfUEFHRVZJRVdfSU1QX0gNCiBjbGFzcyBDWEZBX0ZGV2lkZ2V0Ow0KIGNsYXNzIENYRkFfRkZEb2NWaWV3Ow0KLWNsYXNzIENYRkFfRkZQYWdlVmlldyA6IHB1YmxpYyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsLCBwdWJsaWMgSVhGQV9QYWdlVmlldw0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZQYWdlVmlldyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcFBhZ2VBcmVhKTsNCi0gICAgfkNYRkFfRkZQYWdlVmlldygpOw0KLSAgICB2aXJ0dWFsIElYRkFfRG9jVmlldyoJR2V0RG9jVmlldygpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldFBhZ2VWaWV3SW5kZXgoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0UGFnZVZpZXdSZWN0KENGWF9SZWN0RiAmcnRQYWdlKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0RGlzcGxheU1hdHJpeChDRlhfTWF0cml4ICZtdCwgY29uc3QgQ0ZYX1JlY3QgJnJ0RGlzcCwgaW50MzJfdCBpUm90YXRlKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQlMb2FkUGFnZVZpZXcoSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJVW5sb2FkUGFnZVZpZXcoKTsNCi0gICAgRlhfQk9PTAkJCQkJSXNQYWdlVmlld0xvYWRlZCgpOw0KK2NsYXNzIENYRkFfRkZQYWdlVmlldyA6IHB1YmxpYyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJWEZBX1BhZ2VWaWV3IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRlBhZ2VWaWV3KENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwUGFnZUFyZWEpOw0KKyAgfkNYRkFfRkZQYWdlVmlldygpOw0KKyAgdmlydHVhbCBJWEZBX0RvY1ZpZXcqIEdldERvY1ZpZXcoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRQYWdlVmlld0luZGV4KCk7DQorICB2aXJ0dWFsIHZvaWQgR2V0UGFnZVZpZXdSZWN0KENGWF9SZWN0RiYgcnRQYWdlKTsNCisgIHZpcnR1YWwgdm9pZCBHZXREaXNwbGF5TWF0cml4KENGWF9NYXRyaXgmIG10LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3QmIHJ0RGlzcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSk7DQorICB2aXJ0dWFsIGludDMyX3QgTG9hZFBhZ2VWaWV3KElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2FkUGFnZVZpZXcoKTsNCisgIEZYX0JPT0wgSXNQYWdlVmlld0xvYWRlZCgpOw0KIA0KLSAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0KgkJR2V0V2lkZ2V0QnlQb3MoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldEl0ZXJhdG9yKiBDcmVhdGVXaWRnZXRJdGVyYXRvcihGWF9EV09SRCBkd1RyYXZlcnNlV2F5ID0gWEZBX1RSQVZFUlNFV0FZX0Zvcm0sDQotICAgICAgICAgICAgRlhfRFdPUkQgZHdXaWRnZXRGaWx0ZXIgPSBYRkFfV0lER0VURklMVEVSX1Zpc2libGUgfCBYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlIHwgWEZBX1dJREdFVEZJTFRFUl9BbGxUeXBlKTsNCi0gICAgSVhGQV9MYXlvdXRQYWdlKgkJR2V0TGF5b3V0UGFnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoSVhGQV9MYXlvdXRQYWdlKil0aGlzOw0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICBDWEZBX0ZGRG9jVmlldyoJCQltX3BEb2NWaWV3Ow0KLSAgICBGWF9CT09MCQkJCQltX2JMb2FkZWQ7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBHZXRXaWRnZXRCeVBvcyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldEl0ZXJhdG9yKiBDcmVhdGVXaWRnZXRJdGVyYXRvcigNCisgICAgICBGWF9EV09SRCBkd1RyYXZlcnNlV2F5ID0gWEZBX1RSQVZFUlNFV0FZX0Zvcm0sDQorICAgICAgRlhfRFdPUkQgZHdXaWRnZXRGaWx0ZXIgPSBYRkFfV0lER0VURklMVEVSX1Zpc2libGUgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVEZJTFRFUl9WaWV3YWJsZSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV0lER0VURklMVEVSX0FsbFR5cGUpOw0KKyAgSVhGQV9MYXlvdXRQYWdlKiBHZXRMYXlvdXRQYWdlKCkgeyByZXR1cm4gKElYRkFfTGF5b3V0UGFnZSopdGhpczsgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX0ZGRG9jVmlldyogbV9wRG9jVmlldzsNCisgIEZYX0JPT0wgbV9iTG9hZGVkOw0KIH07DQotdHlwZWRlZgkJQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0xheW91dEl0ZW0sIENYRkFfVHJhdmVyc2VTdHJhdGVneV9MYXlvdXRJdGVtPiBDWEZBX0xheW91dEl0ZW1JdGVyYXRvcjsNCi1jbGFzcyBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yIDogcHVibGljIElYRkFfV2lkZ2V0SXRlcmF0b3INCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9EV09SRCBkd0ZpbHRlcik7DQotICAgIHZpcnR1YWwgfkNYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3IoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KK3R5cGVkZWYgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0xheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9MYXlvdXRJdGVtPg0KKyAgICBDWEZBX0xheW91dEl0ZW1JdGVyYXRvcjsNCitjbGFzcyBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yIDogcHVibGljIElYRkFfV2lkZ2V0SXRlcmF0b3Igew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9EV09SRCBkd0ZpbHRlcik7DQorICB2aXJ0dWFsIH5DWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0KCk7DQotICAgIHZpcnR1YWwgSVhGQV9XaWRnZXQqCQkJTW92ZVRvRmlyc3QoKTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldCoJCQlNb3ZlVG9MYXN0KCk7DQotICAgIHZpcnR1YWwgSVhGQV9XaWRnZXQqCQkJTW92ZVRvTmV4dCgpOw0KLSAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0KgkJCU1vdmVUb1ByZXZpb3VzKCk7DQotICAgIHZpcnR1YWwgSVhGQV9XaWRnZXQqCQkJR2V0Q3VycmVudFdpZGdldCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0Q3VycmVudFdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCk7DQotcHJvdGVjdGVkOg0KLSAgICBJWEZBX1dpZGdldCoJCQkJCUdldFdpZGdldChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKTsNCi0gICAgQ1hGQV9GRlBhZ2VWaWV3KgkJCW1fcFBhZ2VWaWV3Ow0KLSAgICBJWEZBX1dpZGdldCoJCQkJCW1faEN1cldpZGdldDsNCi0gICAgRlhfRFdPUkQJCQkJCW1fZHdGaWx0ZXI7DQotICAgIEZYX0JPT0wJCQkJCQltX2JJZ25vcmVyZWxldmFudDsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtSXRlcmF0b3IJCW1fc0l0ZXJhdG9yOw0KKyAgdmlydHVhbCB2b2lkIFJlc2V0KCk7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBNb3ZlVG9GaXJzdCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvTGFzdCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvTmV4dCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvUHJldmlvdXMoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldEN1cnJlbnRXaWRnZXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDdXJyZW50V2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSVhGQV9XaWRnZXQqIEdldFdpZGdldChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKTsNCisgIENYRkFfRkZQYWdlVmlldyogbV9wUGFnZVZpZXc7DQorICBJWEZBX1dpZGdldCogbV9oQ3VyV2lkZ2V0Ow0KKyAgRlhfRFdPUkQgbV9kd0ZpbHRlcjsNCisgIEZYX0JPT0wgbV9iSWdub3JlcmVsZXZhbnQ7DQorICBDWEZBX0xheW91dEl0ZW1JdGVyYXRvciBtX3NJdGVyYXRvcjsNCiB9Ow0KLXR5cGVkZWYgCUNGWF9BcnJheVRlbXBsYXRlPENYRkFfRkZXaWRnZXQqPiBDWEZBX1dpZGdldEFycmF5Ow0KLWNsYXNzIENYRkFfVGFiUGFyYW0NCi17DQotcHVibGljOg0KLSAgICBDWEZBX1RhYlBhcmFtKCkgOiBtX3BXaWRnZXQoTlVMTCkge30NCi0gICAgfkNYRkFfVGFiUGFyYW0oKSB7fQ0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9GRldpZGdldCo+IENYRkFfV2lkZ2V0QXJyYXk7DQorY2xhc3MgQ1hGQV9UYWJQYXJhbSB7DQorIHB1YmxpYzoNCisgIENYRkFfVGFiUGFyYW0oKSA6IG1fcFdpZGdldChOVUxMKSB7fQ0KKyAgfkNYRkFfVGFiUGFyYW0oKSB7fQ0KIA0KLSAgICBDWEZBX0ZGV2lkZ2V0KgkJbV9wV2lkZ2V0Ow0KLSAgICBDWEZBX1dpZGdldEFycmF5CQltX0NoaWxkcmVuOw0KKyAgQ1hGQV9GRldpZGdldCogbV9wV2lkZ2V0Ow0KKyAgQ1hGQV9XaWRnZXRBcnJheSBtX0NoaWxkcmVuOw0KIH07DQotY2xhc3MgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yIDogcHVibGljIElYRkFfV2lkZ2V0SXRlcmF0b3INCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0RXT1JEIGR3RmlsdGVyKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yKCk7DQorY2xhc3MgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yIDogcHVibGljIElYRkFfV2lkZ2V0SXRlcmF0b3Igew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGaWx0ZXIpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yKCk7DQogDQotICAgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQgUmVzZXQoKTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvRmlyc3QoKTsNCi0gICAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvTGFzdCgpOw0KLSAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBNb3ZlVG9OZXh0KCk7DQotICAgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb1ByZXZpb3VzKCk7DQotICAgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldEN1cnJlbnRXaWRnZXQoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRDdXJyZW50V2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCi1wcm90ZWN0ZWQ6DQotICAgIENYRkFfV2lkZ2V0QXJyYXkJCQkJCQltX1RhYk9yZGVyV2lkZ2V0QXJyYXk7DQotICAgIENYRkFfRkZQYWdlVmlldyoJCQkJCW1fcFBhZ2VWaWV3Ow0KLSAgICBGWF9EV09SRAkJCQkJCQltX2R3RmlsdGVyOw0KLSAgICBpbnQzMl90CQkJCQkJCW1faUN1cldpZGdldDsNCi0gICAgRlhfQk9PTAkJCQkJCQkJbV9iSWdub3JlcmVsZXZhbnQ7DQotICAgIENYRkFfRkZXaWRnZXQqCQkJR2V0VHJhdmVyc2VXaWRnZXQoQ1hGQV9GRldpZGdldCogcFdpZGdldCk7DQotICAgIENYRkFfRkZXaWRnZXQqCQkJRmluZFdpZGdldEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzV2lkZ2V0TmFtZSwgQ1hGQV9GRldpZGdldCogcFJlZldpZGdldCk7DQotICAgIHZvaWQJCQkJCUNyZWF0ZVRhYk9yZGVyV2lkZ2V0QXJyYXkoKTsNCi0gICAgdm9pZAkJCQkJQ3JlYXRlU3BhY2VPcmRlcldpZGdldEFycmF5KENYRkFfV2lkZ2V0QXJyYXkmIFdpZGdldEFycmF5KTsNCi0gICAgQ1hGQV9GRldpZGdldCoJCQlHZXRXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7DQotICAgIHZvaWQJCQkJCU9yZGVyQ29udGFpbmVyKENYRkFfTGF5b3V0SXRlbUl0ZXJhdG9yKiBzSXRlcmF0b3IsIENYRkFfTGF5b3V0SXRlbSogcENvbnRhaW5lckl0ZW0sIENYRkFfVGFiUGFyYW0qIHBDb250YWluZXIsIEZYX0JPT0wgJmJDdXJyZW50SXRlbSwgRlhfQk9PTCYgYkNvbnRlbnRBcmVhLCBGWF9CT09MIGJNYXJzdGVyUGFnZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvRmlyc3QoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb0xhc3QoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb05leHQoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb1ByZXZpb3VzKCk7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBHZXRDdXJyZW50V2lkZ2V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q3VycmVudFdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCk7DQorDQorIHByb3RlY3RlZDoNCisgIENYRkFfV2lkZ2V0QXJyYXkgbV9UYWJPcmRlcldpZGdldEFycmF5Ow0KKyAgQ1hGQV9GRlBhZ2VWaWV3KiBtX3BQYWdlVmlldzsNCisgIEZYX0RXT1JEIG1fZHdGaWx0ZXI7DQorICBpbnQzMl90IG1faUN1cldpZGdldDsNCisgIEZYX0JPT0wgbV9iSWdub3JlcmVsZXZhbnQ7DQorICBDWEZBX0ZGV2lkZ2V0KiBHZXRUcmF2ZXJzZVdpZGdldChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIENYRkFfRkZXaWRnZXQqIEZpbmRXaWRnZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1dpZGdldE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQpOw0KKyAgdm9pZCBDcmVhdGVUYWJPcmRlcldpZGdldEFycmF5KCk7DQorICB2b2lkIENyZWF0ZVNwYWNlT3JkZXJXaWRnZXRBcnJheShDWEZBX1dpZGdldEFycmF5JiBXaWRnZXRBcnJheSk7DQorICBDWEZBX0ZGV2lkZ2V0KiBHZXRXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7DQorICB2b2lkIE9yZGVyQ29udGFpbmVyKENYRkFfTGF5b3V0SXRlbUl0ZXJhdG9yKiBzSXRlcmF0b3IsDQorICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcENvbnRhaW5lckl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgIENYRkFfVGFiUGFyYW0qIHBDb250YWluZXIsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJDdXJyZW50SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkNvbnRlbnRBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNYXJzdGVyUGFnZSA9IEZBTFNFKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGF0aC5jcHAKaW5kZXggMWNmOTkzYi4uNmIwMjFiNCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGF0aC5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGF0aC5jcHAKQEAgLTEzLDE1MCArMTMsMTQ2IEBACiAjaW5jbHVkZSAieGZhX2ZmZG9jLmgiDQogI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KIENYRkFfRkZMaW5lOjpDWEZBX0ZGTGluZShDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KLSAgICA6IENYRkFfRkZEcmF3KHBQYWdlVmlldywgcERhdGFBY2MpDQotew0KKyAgICA6IENYRkFfRkZEcmF3KHBQYWdlVmlldywgcERhdGFBY2MpIHt9DQorQ1hGQV9GRkxpbmU6On5DWEZBX0ZGTGluZSgpIHt9DQordm9pZCBDWEZBX0ZGTGluZTo6R2V0UmVjdEZyb21IYW5kKENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSGFuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCkgew0KKyAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZMaW5lV2lkdGggLyAyLjBmOw0KKyAgaWYgKHJlY3QuaGVpZ2h0IDwgMS4wZikgew0KKyAgICBzd2l0Y2ggKGlIYW5kKSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Og0KKyAgICAgICAgcmVjdC50b3AgLT0gZkhhbGZXaWR0aDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICByZWN0LnRvcCArPSBmSGFsZldpZHRoOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKHJlY3Qud2lkdGggPCAxLjBmKSB7DQorICAgIHN3aXRjaCAoaUhhbmQpIHsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQorICAgICAgICByZWN0LmxlZnQgKz0gZkhhbGZXaWR0aDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICByZWN0LmxlZnQgKz0gZkhhbGZXaWR0aDsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBzd2l0Y2ggKGlIYW5kKSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Og0KKyAgICAgICAgcmVjdC5JbmZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgIHJlY3QuRGVmbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQogfQ0KLUNYRkFfRkZMaW5lOjp+Q1hGQV9GRkxpbmUoKQ0KLXsNCi19DQotdm9pZCBDWEZBX0ZGTGluZTo6R2V0UmVjdEZyb21IYW5kKENGWF9SZWN0RiAmcmVjdCwgaW50MzJfdCBpSGFuZCwgRlhfRkxPQVQgZkxpbmVXaWR0aCkNCi17DQotICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmTGluZVdpZHRoIC8gMi4wZjsNCi0gICAgaWYgKHJlY3QuaGVpZ2h0IDwgMS4wZikgew0KLSAgICAgICAgc3dpdGNoIChpSGFuZCkgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCi0gICAgICAgICAgICAgICAgcmVjdC50b3AgLT0gZkhhbGZXaWR0aDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCi0gICAgICAgICAgICAgICAgcmVjdC50b3AgKz0gZkhhbGZXaWR0aDsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChyZWN0LndpZHRoIDwgMS4wZikgew0KLSAgICAgICAgc3dpdGNoIChpSGFuZCkgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCi0gICAgICAgICAgICAgICAgcmVjdC5sZWZ0ICs9IGZIYWxmV2lkdGg7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQotICAgICAgICAgICAgICAgIHJlY3QubGVmdCArPSBmSGFsZldpZHRoOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHN3aXRjaCAoaUhhbmQpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQotICAgICAgICAgICAgICAgIHJlY3QuSW5mbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCi0gICAgICAgICAgICAgICAgcmVjdC5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCit2b2lkIENYRkFfRkZMaW5lOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUpIHsNCisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfVmFsdWUgdmFsdWUgPSBtX3BEYXRhQWNjLT5HZXRGb3JtVmFsdWUoKTsNCisgIGlmICghdmFsdWUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9MaW5lIGxpbmVPYmogPSB2YWx1ZS5HZXRMaW5lKCk7DQorICBGWF9BUkdCIGxpbmVDb2xvciA9IDB4RkYwMDAwMDA7DQorICBpbnQzMl90IGlTdHJva2VUeXBlID0gMDsNCisgIEZYX0ZMT0FUIGZMaW5lV2lkdGggPSAxLjBmOw0KKyAgRlhfQk9PTCBiU2xvcGUgPSBsaW5lT2JqLkdldFNsb3AoKTsNCisgIGludDMyX3QgaUNhcCA9IDA7DQorICBDWEZBX0VkZ2UgZWRnZSA9IGxpbmVPYmouR2V0RWRnZSgpOw0KKyAgaWYgKGVkZ2UuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgaWYgKGVkZ2UuR2V0UHJlc2VuY2UoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GRkxpbmU6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCAsIEZYX0RXT1JEIGR3U3RhdHVzICwgaW50MzJfdCBpUm90YXRlICkNCi17DQotICAgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9WYWx1ZSB2YWx1ZSA9IG1fcERhdGFBY2MtPkdldEZvcm1WYWx1ZSgpOw0KLSAgICBpZiAoIXZhbHVlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9MaW5lIGxpbmVPYmoJID0gdmFsdWUuR2V0TGluZSgpOw0KLSAgICBGWF9BUkdCIGxpbmVDb2xvcgkgPSAweEZGMDAwMDAwOw0KLSAgICBpbnQzMl90IGlTdHJva2VUeXBlID0gMDsNCi0gICAgRlhfRkxPQVQgZkxpbmVXaWR0aCAgPSAxLjBmOw0KLSAgICBGWF9CT09MIGJTbG9wZSA9IGxpbmVPYmouR2V0U2xvcCgpOw0KLSAgICBpbnQzMl90IGlDYXAgPSAwOw0KLSAgICBDWEZBX0VkZ2UgZWRnZSA9IGxpbmVPYmouR2V0RWRnZSgpOw0KLSAgICBpZiAoZWRnZS5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgaWYgKGVkZ2UuR2V0UHJlc2VuY2UoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbGluZUNvbG9yCT0gZWRnZS5HZXRDb2xvcigpOw0KLSAgICAgICAgaVN0cm9rZVR5cGUgPSBlZGdlLkdldFN0cm9rZVR5cGUoKTsNCi0gICAgICAgIGZMaW5lV2lkdGgJPSBlZGdlLkdldFRoaWNrbmVzcygpOw0KLSAgICAgICAgaUNhcCA9IGVkZ2UuR2V0Q2FwVHlwZSgpOw0KLSAgICB9DQotICAgIENGWF9NYXRyaXggbXRSb3RhdGU7DQotICAgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIENGWF9SZWN0RiBydExpbmU7DQotICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0TGluZSk7DQotICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQotICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0TGluZSwgbWdXaWRnZXQpOw0KLSAgICB9DQotICAgIEdldFJlY3RGcm9tSGFuZChydExpbmUsIGxpbmVPYmouR2V0SGFuZCgpLCBmTGluZVdpZHRoKTsNCi0gICAgQ0ZYX1BhdGggbGluZVBhdGg7DQotICAgIGxpbmVQYXRoLkNyZWF0ZSgpOw0KLSAgICBpZiAoYlNsb3BlICYmIHJ0TGluZS5yaWdodCgpID4gMC4wZiAmJiBydExpbmUuYm90dG9tKCkgPiAwLjBmKSB7DQotICAgICAgICBsaW5lUGF0aC5BZGRMaW5lKHJ0TGluZS5yaWdodCgpLCBydExpbmUudG9wLCBydExpbmUubGVmdCwgcnRMaW5lLmJvdHRvbSgpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGxpbmVQYXRoLkFkZExpbmUocnRMaW5lLmxlZnQsIHJ0TGluZS50b3AsIHJ0TGluZS5yaWdodCgpLCBydExpbmUuYm90dG9tKCkpOw0KLSAgICB9DQotICAgIENGWF9Db2xvciBjb2xvcihsaW5lQ29sb3IpOw0KLSAgICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIHBHUy0+U2V0TGluZVdpZHRoKGZMaW5lV2lkdGgsIFRSVUUpOw0KLSAgICBYRkFfU3Ryb2tlVHlwZVNldExpbmVEYXNoKHBHUywgaVN0cm9rZVR5cGUsIGlDYXApOw0KLSAgICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjb2xvcik7DQotICAgIHBHUy0+U2V0TGluZUNhcChYRkFfTGluZUNhcFRvRlhHRShpQ2FwKSk7DQotICAgIHBHUy0+U3Ryb2tlUGF0aCgmbGluZVBhdGgsICZtdFJvdGF0ZSk7DQotICAgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgbGluZUNvbG9yID0gZWRnZS5HZXRDb2xvcigpOw0KKyAgICBpU3Ryb2tlVHlwZSA9IGVkZ2UuR2V0U3Ryb2tlVHlwZSgpOw0KKyAgICBmTGluZVdpZHRoID0gZWRnZS5HZXRUaGlja25lc3MoKTsNCisgICAgaUNhcCA9IGVkZ2UuR2V0Q2FwVHlwZSgpOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0TGluZTsNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0TGluZSk7DQorICBpZiAoQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKSkgew0KKyAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0TGluZSwgbWdXaWRnZXQpOw0KKyAgfQ0KKyAgR2V0UmVjdEZyb21IYW5kKHJ0TGluZSwgbGluZU9iai5HZXRIYW5kKCksIGZMaW5lV2lkdGgpOw0KKyAgQ0ZYX1BhdGggbGluZVBhdGg7DQorICBsaW5lUGF0aC5DcmVhdGUoKTsNCisgIGlmIChiU2xvcGUgJiYgcnRMaW5lLnJpZ2h0KCkgPiAwLjBmICYmIHJ0TGluZS5ib3R0b20oKSA+IDAuMGYpIHsNCisgICAgbGluZVBhdGguQWRkTGluZShydExpbmUucmlnaHQoKSwgcnRMaW5lLnRvcCwgcnRMaW5lLmxlZnQsIHJ0TGluZS5ib3R0b20oKSk7DQorICB9IGVsc2Ugew0KKyAgICBsaW5lUGF0aC5BZGRMaW5lKHJ0TGluZS5sZWZ0LCBydExpbmUudG9wLCBydExpbmUucmlnaHQoKSwgcnRMaW5lLmJvdHRvbSgpKTsNCisgIH0NCisgIENGWF9Db2xvciBjb2xvcihsaW5lQ29sb3IpOw0KKyAgcEdTLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgcEdTLT5TZXRMaW5lV2lkdGgoZkxpbmVXaWR0aCwgVFJVRSk7DQorICBYRkFfU3Ryb2tlVHlwZVNldExpbmVEYXNoKHBHUywgaVN0cm9rZVR5cGUsIGlDYXApOw0KKyAgcEdTLT5TZXRTdHJva2VDb2xvcigmY29sb3IpOw0KKyAgcEdTLT5TZXRMaW5lQ2FwKFhGQV9MaW5lQ2FwVG9GWEdFKGlDYXApKTsNCisgIHBHUy0+U3Ryb2tlUGF0aCgmbGluZVBhdGgsICZtdFJvdGF0ZSk7DQorICBwR1MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQogfQ0KIENYRkFfRkZBcmM6OkNYRkFfRkZBcmMoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCi0gICAgOiBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KLXsNCisgICAgOiBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZBcmM6On5DWEZBX0ZGQXJjKCkge30NCit2b2lkIENYRkFfRkZBcmM6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSkgew0KKyAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9WYWx1ZSB2YWx1ZSA9IG1fcERhdGFBY2MtPkdldEZvcm1WYWx1ZSgpOw0KKyAgaWYgKCF2YWx1ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0FyYyBhcmNPYmogPSB2YWx1ZS5HZXRBcmMoKTsNCisgIENGWF9NYXRyaXggbXRSb3RhdGU7DQorICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIENGWF9SZWN0RiBydEFyYzsNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0QXJjKTsNCisgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQorICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocnRBcmMsIG1nV2lkZ2V0KTsNCisgIH0NCisgIERyYXdCb3JkZXIocEdTLCBhcmNPYmosIHJ0QXJjLCAmbXRSb3RhdGUpOw0KIH0NCi1DWEZBX0ZGQXJjOjp+Q1hGQV9GRkFyYygpDQotew0KLX0NCi12b2lkIENYRkFfRkZBcmM6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCAsIEZYX0RXT1JEIGR3U3RhdHVzICwgaW50MzJfdCBpUm90YXRlICkNCi17DQotICAgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9WYWx1ZSB2YWx1ZSA9IG1fcERhdGFBY2MtPkdldEZvcm1WYWx1ZSgpOw0KLSAgICBpZiAoIXZhbHVlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9BcmMgYXJjT2JqID0gdmFsdWUuR2V0QXJjKCk7DQotICAgIENGWF9NYXRyaXggbXRSb3RhdGU7DQotICAgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQotICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICB9DQotICAgIENGWF9SZWN0RiBydEFyYzsNCi0gICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRBcmMpOw0KLSAgICBpZiAoQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKSkgew0KLSAgICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihydEFyYywgbWdXaWRnZXQpOw0KLSAgICB9DQotICAgIERyYXdCb3JkZXIocEdTLCBhcmNPYmosIHJ0QXJjLCAmbXRSb3RhdGUpOw0KLX0NCi1DWEZBX0ZGUmVjdGFuZ2xlOjpDWEZBX0ZGUmVjdGFuZ2xlKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQotICAgIDogQ1hGQV9GRkRyYXcocFBhZ2VWaWV3LCBwRGF0YUFjYykNCi17DQotfQ0KLUNYRkFfRkZSZWN0YW5nbGU6On5DWEZBX0ZGUmVjdGFuZ2xlKCkNCi17DQotfQ0KLXZvaWQgQ1hGQV9GRlJlY3RhbmdsZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ICwgRlhfRFdPUkQgZHdTdGF0dXMgLCBpbnQzMl90IGlSb3RhdGUgKQ0KLXsNCi0gICAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCk7DQotICAgIGlmICghdmFsdWUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX1JlY3RhbmdsZSBydE9iaiA9IHZhbHVlLkdldFJlY3RhbmdsZSgpOw0KLSAgICBDRlhfUmVjdEYgcmVjdDsNCi0gICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocmVjdCk7DQotICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQotICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJlY3QsIG1nV2lkZ2V0KTsNCi0gICAgfQ0KLSAgICBDRlhfTWF0cml4IG10Um90YXRlOw0KLSAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBEcmF3Qm9yZGVyKHBHUywgcnRPYmosIHJlY3QsICZtdFJvdGF0ZSk7DQorQ1hGQV9GRlJlY3RhbmdsZTo6Q1hGQV9GRlJlY3RhbmdsZShDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZSZWN0YW5nbGU6On5DWEZBX0ZGUmVjdGFuZ2xlKCkge30NCit2b2lkIENYRkFfRkZSZWN0YW5nbGU6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSkgew0KKyAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9WYWx1ZSB2YWx1ZSA9IG1fcERhdGFBY2MtPkdldEZvcm1WYWx1ZSgpOw0KKyAgaWYgKCF2YWx1ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX1JlY3RhbmdsZSBydE9iaiA9IHZhbHVlLkdldFJlY3RhbmdsZSgpOw0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShyZWN0KTsNCisgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQorICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocmVjdCwgbWdXaWRnZXQpOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgRHJhd0JvcmRlcihwR1MsIHJ0T2JqLCByZWN0LCAmbXRSb3RhdGUpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYXRoLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYXRoLmgKaW5kZXggYWVkNGE2Ny4uODA4MzMzZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGF0aC5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguaApAQCAtNiwyNyArNiwzNCBAQAogDQogI2lmbmRlZiBfWEZBX0RSQVdfUEFUSF9JTVBfSA0KICNkZWZpbmUgX1hGQV9EUkFXX1BBVEhfSU1QX0gNCi1jbGFzcyBDWEZBX0ZGTGluZSA6IHB1YmxpYyBDWEZBX0ZGRHJhdw0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZMaW5lKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZGTGluZSgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLCBGWF9EV09SRCBkd1N0YXR1cyA9IDAsIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KLXByaXZhdGU6DQotICAgIHZvaWQJCQkJCUdldFJlY3RGcm9tSGFuZChDRlhfUmVjdEYgJnJlY3QsIGludDMyX3QgaUhhbmQsIEZYX0ZMT0FUIGZMaW5lV2lkdGgpOw0KK2NsYXNzIENYRkFfRkZMaW5lIDogcHVibGljIENYRkFfRkZEcmF3IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkxpbmUoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGTGluZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlID0gMCk7DQorDQorIHByaXZhdGU6DQorICB2b2lkIEdldFJlY3RGcm9tSGFuZChDRlhfUmVjdEYmIHJlY3QsIGludDMyX3QgaUhhbmQsIEZYX0ZMT0FUIGZMaW5lV2lkdGgpOw0KIH07DQotY2xhc3MgQ1hGQV9GRkFyYyA6IHB1YmxpYyBDWEZBX0ZGRHJhdw0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZBcmMoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQotICAgIHZpcnR1YWwgfkNYRkFfRkZBcmMoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLCBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCitjbGFzcyBDWEZBX0ZGQXJjIDogcHVibGljIENYRkFfRkZEcmF3IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkFyYyhDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgIHZpcnR1YWwgfkNYRkFfRkZBcmMoKTsNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cyA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KIH07DQotY2xhc3MgQ1hGQV9GRlJlY3RhbmdsZSA6IHB1YmxpYyBDWEZBX0ZGRHJhdw0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZSZWN0YW5nbGUoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQotICAgIHZpcnR1YWwgfkNYRkFfRkZSZWN0YW5nbGUoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLCBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCitjbGFzcyBDWEZBX0ZGUmVjdGFuZ2xlIDogcHVibGljIENYRkFfRkZEcmF3IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRlJlY3RhbmdsZShDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgIHZpcnR1YWwgfkNYRkFfRkZSZWN0YW5nbGUoKTsNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cyA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmNwcAppbmRleCA0ZWEyYWM0Li5mNTA0NzE0IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmNwcApAQCAtMTMsMjQwICsxMywyMzkgQEAKICNpbmNsdWRlICJ4ZmFfZmZwdXNoYnV0dG9uLmgiDQogI2luY2x1ZGUgInhmYV90ZXh0bGF5b3V0LmgiDQogI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KLUNYRkFfRkZQdXNoQnV0dG9uOjpDWEZBX0ZGUHVzaEJ1dHRvbihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KLSAgICA6IENYRkFfRkZGaWVsZChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KLSAgICAsIG1fcFJvbGxvdmVyVGV4dExheW91dChOVUxMKQ0KLSAgICAsIG1fcERvd25UZXh0TGF5b3V0KE5VTEwpDQotICAgICwgbV9wRG93blByb3ZpZGVyKE5VTEwpDQotICAgICwgbV9wUm9sbFByb3ZpZGVyKE5VTEwpDQotICAgICwgbV9wT2xkRGVsZWdhdGUoTlVMTCkNCi17DQorQ1hGQV9GRlB1c2hCdXR0b246OkNYRkFfRkZQdXNoQnV0dG9uKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRkZpZWxkKHBQYWdlVmlldywgcERhdGFBY2MpLA0KKyAgICAgIG1fcFJvbGxvdmVyVGV4dExheW91dChOVUxMKSwNCisgICAgICBtX3BEb3duVGV4dExheW91dChOVUxMKSwNCisgICAgICBtX3BEb3duUHJvdmlkZXIoTlVMTCksDQorICAgICAgbV9wUm9sbFByb3ZpZGVyKE5VTEwpLA0KKyAgICAgIG1fcE9sZERlbGVnYXRlKE5VTEwpIHt9DQorQ1hGQV9GRlB1c2hCdXR0b246On5DWEZBX0ZGUHVzaEJ1dHRvbigpIHsNCisgIENYRkFfRkZQdXNoQnV0dG9uOjpVbmxvYWRXaWRnZXQoKTsNCiB9DQotQ1hGQV9GRlB1c2hCdXR0b246On5DWEZBX0ZGUHVzaEJ1dHRvbigpDQotew0KLSAgICBDWEZBX0ZGUHVzaEJ1dHRvbjo6VW5sb2FkV2lkZ2V0KCk7DQordm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgIFJlbmRlckhpZ2hsaWdodENhcHRpb24ocEdTLCAmbXRSb3RhdGUpOw0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRXaWRnZXQpOw0KKyAgQ0ZYX01hdHJpeCBtdDsNCisgIG10LlNldCgxLCAwLCAwLCAxLCBydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3ApOw0KKyAgbXQuQ29uY2F0KG10Um90YXRlKTsNCisgIEdldEFwcCgpLT5HZXRXaWRnZXRNZ3JEZWxlZ2F0ZSgpLT5PbkRyYXdXaWRnZXQobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdTLCAmbXQpOw0KIH0NCi12b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIGludDMyX3QgaVJvdGF0ZSApDQotew0KLSAgICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KLSAgICAgICAgcmV0dXJuOw0KK0ZYX0JPT0wgQ1hGQV9GRlB1c2hCdXR0b246OkxvYWRXaWRnZXQoKSB7DQorICBGWFNZU19hc3NlcnQobV9wTm9ybWFsV2lkZ2V0ID09IE5VTEwpOw0KKyAgQ0ZXTF9QdXNoQnV0dG9uKiBwUHVzaEJ1dHRvbiA9IENGV0xfUHVzaEJ1dHRvbjo6Q3JlYXRlKCk7DQorICBpZiAocFB1c2hCdXR0b24pIHsNCisgICAgcFB1c2hCdXR0b24tPkluaXRpYWxpemUoKTsNCisgIH0NCisgIG1fcE9sZERlbGVnYXRlID0gcFB1c2hCdXR0b24tPlNldERlbGVnYXRlKHRoaXMpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwUHVzaEJ1dHRvbjsNCisgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocFdpZGdldCwgdGhpcywgTlVMTCk7DQorICBJRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQorICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0LCBwV2lkZ2V0KTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIExvYWRIaWdobGlnaHRDYXB0aW9uKCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOw0KKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KK30NCit2b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsNCisgIEZYX0RXT1JEIGR3U3R5bGVFeCA9IDA7DQorICBzd2l0Y2ggKG1fcERhdGFBY2MtPkdldEJ1dHRvbkhpZ2hsaWdodCgpKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW52ZXJ0ZWQ6DQorICAgICAgZHdTdHlsZUV4ID0gWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVJbnZlcnRlZDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9PdXRsaW5lOg0KKyAgICAgIGR3U3R5bGVFeCA9IFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlT3V0TGluZTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9QdXNoOg0KKyAgICAgIGR3U3R5bGVFeCA9IFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlUHVzaDsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZUV4LCAweEZGRkZGRkZGKTsNCit9DQordm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6VW5sb2FkV2lkZ2V0KCkgew0KKyAgaWYgKG1fcFJvbGxvdmVyVGV4dExheW91dCkgew0KKyAgICBkZWxldGUgbV9wUm9sbG92ZXJUZXh0TGF5b3V0Ow0KKyAgICBtX3BSb2xsb3ZlclRleHRMYXlvdXQgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcERvd25UZXh0TGF5b3V0KSB7DQorICAgIGRlbGV0ZSBtX3BEb3duVGV4dExheW91dDsNCisgICAgbV9wRG93blRleHRMYXlvdXQgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcERvd25Qcm92aWRlcikgew0KKyAgICBkZWxldGUgbV9wRG93blByb3ZpZGVyOw0KKyAgICBtX3BEb3duUHJvdmlkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFJvbGxQcm92aWRlcikgew0KKyAgICBkZWxldGUgbV9wUm9sbFByb3ZpZGVyOw0KKyAgICBtX3BSb2xsUHJvdmlkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9GRkZpZWxkOjpVbmxvYWRXaWRnZXQoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGUHVzaEJ1dHRvbjo6TGF5b3V0V2lkZ2V0KCkgew0KKyAgQ1hGQV9GRldpZGdldDo6TGF5b3V0V2lkZ2V0KCk7DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydFdpZGdldCk7DQorICBtX3J0VUkgPSBydFdpZGdldDsNCisgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQorICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocnRXaWRnZXQsIG1nV2lkZ2V0KTsNCisgIH0NCisgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvbigpOw0KKyAgbV9ydENhcHRpb24uU2V0KHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsIHJ0V2lkZ2V0LmhlaWdodCk7DQorICBpZiAoQ1hGQV9NYXJnaW4gbWdDYXAgPSBjYXB0aW9uLkdldE1hcmdpbigpKSB7DQorICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsNCisgIH0NCisgIExheW91dEhpZ2hsaWdodENhcHRpb24oKTsNCisgIFNldEZXTFJlY3QoKTsNCisgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9GTE9BVCBDWEZBX0ZGUHVzaEJ1dHRvbjo6R2V0TGluZVdpZHRoKCkgew0KKyAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gbV9wRGF0YUFjYy0+R2V0Qm9yZGVyKCk7DQorICBpZiAoYm9yZGVyLklzRXhpc3RJblhNTCgpICYmDQorICAgICAgKGJvcmRlci5HZXRQcmVzZW5jZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpKSB7DQorICAgIENYRkFfRWRnZSBlZGdlID0gYm9yZGVyLkdldEVkZ2UoMCk7DQorICAgIHJldHVybiBlZGdlLkdldFRoaWNrbmVzcygpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK0ZYX0FSR0IgQ1hGQV9GRlB1c2hCdXR0b246OkdldExpbmVDb2xvcigpIHsNCisgIHJldHVybiAweEZGMDAwMDAwOw0KK30NCitGWF9BUkdCIENYRkFfRkZQdXNoQnV0dG9uOjpHZXRGaWxsQ29sb3IoKSB7DQorICByZXR1cm4gMHhGRkZGRkZGRjsNCit9DQordm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6TG9hZEhpZ2hsaWdodENhcHRpb24oKSB7DQorICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsNCisgIGlmIChjYXB0aW9uLklzRXhpc3RJblhNTCgpICYmDQorICAgICAgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgew0KKyAgICB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSb2xsb3ZlcjsNCisgICAgICBGWF9CT09MIGJSaWNoVGV4dDsNCisgICAgICBpZiAobV9wRGF0YUFjYy0+R2V0QnV0dG9uUm9sbG92ZXIod3NSb2xsb3ZlciwgYlJpY2hUZXh0KSkgew0KKyAgICAgICAgaWYgKG1fcFJvbGxQcm92aWRlciA9PSBOVUxMKSB7DQorICAgICAgICAgIG1fcFJvbGxQcm92aWRlciA9IEZYX05FVyBDWEZBX1RleHRQcm92aWRlcigNCisgICAgICAgICAgICAgIG1fcERhdGFBY2MsIFhGQV9URVhUUFJPVklERVJUWVBFX1JvbGxvdmVyKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFJvbGxvdmVyVGV4dExheW91dCA9IEZYX05FVyBDWEZBX1RleHRMYXlvdXQobV9wUm9sbFByb3ZpZGVyKTsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEb3duOw0KKyAgICAgIGlmIChtX3BEYXRhQWNjLT5HZXRCdXR0b25Eb3duKHdzRG93biwgYlJpY2hUZXh0KSkgew0KKyAgICAgICAgaWYgKG1fcERvd25Qcm92aWRlciA9PSBOVUxMKSB7DQorICAgICAgICAgIG1fcERvd25Qcm92aWRlciA9DQorICAgICAgICAgICAgICBGWF9ORVcgQ1hGQV9UZXh0UHJvdmlkZXIobV9wRGF0YUFjYywgWEZBX1RFWFRQUk9WSURFUlRZUEVfRG93bik7DQorICAgICAgICB9DQorICAgICAgICBtX3BEb3duVGV4dExheW91dCA9IEZYX05FVyBDWEZBX1RleHRMYXlvdXQobV9wRG93blByb3ZpZGVyKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCi0gICAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCi0gICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQotICAgIH0NCi0gICAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cyk7DQotICAgIFJlbmRlckhpZ2hsaWdodENhcHRpb24ocEdTLCAmbXRSb3RhdGUpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpMYXlvdXRIaWdobGlnaHRDYXB0aW9uKCkgew0KKyAgQ0ZYX1NpemVGIHN6Ow0KKyAgc3ouU2V0KG1fcnRDYXB0aW9uLndpZHRoLCBtX3J0Q2FwdGlvbi5oZWlnaHQpOw0KKyAgTGF5b3V0Q2FwdGlvbigpOw0KKyAgaWYgKG1fcFJvbGxvdmVyVGV4dExheW91dCkgew0KKyAgICBtX3BSb2xsb3ZlclRleHRMYXlvdXQtPkxheW91dChzeik7DQorICB9DQorICBpZiAobV9wRG93blRleHRMYXlvdXQpIHsNCisgICAgbV9wRG93blRleHRMYXlvdXQtPkxheW91dChzeik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRlB1c2hCdXR0b246OlJlbmRlckhpZ2hsaWdodENhcHRpb24oQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCisgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvbigpOw0KKyAgaWYgKGNhcHRpb24uSXNFeGlzdEluWE1MKCkgJiYNCisgICAgICBjYXB0aW9uLkdldFByZXNlbmNlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KKyAgICBDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlID0gcEdTLT5HZXRSZW5kZXJEZXZpY2UoKTsNCiAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KICAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydFdpZGdldCk7DQorICAgIENGWF9SZWN0RiBydENsaXAgPSBtX3J0Q2FwdGlvbjsNCisgICAgcnRDbGlwLkludGVyc2VjdChydFdpZGdldCk7DQogICAgIENGWF9NYXRyaXggbXQ7DQotICAgIG10LlNldCgxLCAwLCAwLCAxLCBydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3ApOw0KLSAgICBtdC5Db25jYXQobXRSb3RhdGUpOw0KLSAgICBHZXRBcHAoKS0+R2V0V2lkZ2V0TWdyRGVsZWdhdGUoKS0+T25EcmF3V2lkZ2V0KG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksIHBHUywgJm10KTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGUHVzaEJ1dHRvbjo6TG9hZFdpZGdldCgpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wTm9ybWFsV2lkZ2V0ID09IE5VTEwpOw0KLSAgICBDRldMX1B1c2hCdXR0b24qIHBQdXNoQnV0dG9uID0gQ0ZXTF9QdXNoQnV0dG9uOjpDcmVhdGUoKTsNCi0gICAgaWYgKHBQdXNoQnV0dG9uKSB7DQotICAgICAgICBwUHVzaEJ1dHRvbi0+SW5pdGlhbGl6ZSgpOw0KKyAgICBtdC5TZXQoMSwgMCwgMCwgMSwgbV9ydENhcHRpb24ubGVmdCwgbV9ydENhcHRpb24udG9wKTsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQorICAgICAgbXQuQ29uY2F0KCpwTWF0cml4KTsNCiAgICAgfQ0KLSAgICBtX3BPbGREZWxlZ2F0ZSA9IHBQdXNoQnV0dG9uLT5TZXREZWxlZ2F0ZSh0aGlzKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwUHVzaEJ1dHRvbjsNCi0gICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBXaWRnZXQsIHRoaXMsIE5VTEwpOw0KLSAgICBJRldMX05vdGVEcml2ZXIgKnBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQotICAgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQsIHBXaWRnZXQpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCi0gICAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCi0gICAgTG9hZEhpZ2hsaWdodENhcHRpb24oKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsNCi0gICAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KLX0NCi12b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpDQotew0KLSAgICBGWF9EV09SRCBkd1N0eWxlRXggPSAwOw0KLSAgICBzd2l0Y2gobV9wRGF0YUFjYy0+R2V0QnV0dG9uSGlnaGxpZ2h0KCkpIHsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW52ZXJ0ZWQ6DQotICAgICAgICAgICAgZHdTdHlsZUV4ID0gWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVJbnZlcnRlZDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fT3V0bGluZToNCi0gICAgICAgICAgICBkd1N0eWxlRXggPSBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZU91dExpbmU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1B1c2g6DQotICAgICAgICAgICAgZHdTdHlsZUV4ID0gWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVQdXNoOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3U3R5bGVFeCwgMHhGRkZGRkZGRik7DQotfQ0KLXZvaWQgQ1hGQV9GRlB1c2hCdXR0b246OlVubG9hZFdpZGdldCgpDQotew0KLSAgICBpZiAobV9wUm9sbG92ZXJUZXh0TGF5b3V0KSB7DQotICAgICAgICBkZWxldGUgbV9wUm9sbG92ZXJUZXh0TGF5b3V0Ow0KLSAgICAgICAgbV9wUm9sbG92ZXJUZXh0TGF5b3V0ID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wRG93blRleHRMYXlvdXQpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BEb3duVGV4dExheW91dDsNCi0gICAgICAgIG1fcERvd25UZXh0TGF5b3V0ID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wRG93blByb3ZpZGVyKSB7DQotICAgICAgICBkZWxldGUgbV9wRG93blByb3ZpZGVyOw0KLSAgICAgICAgbV9wRG93blByb3ZpZGVyID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wUm9sbFByb3ZpZGVyKSB7DQotICAgICAgICBkZWxldGUgbV9wUm9sbFByb3ZpZGVyOw0KLSAgICAgICAgbV9wUm9sbFByb3ZpZGVyID0gTlVMTDsNCi0gICAgfQ0KLSAgICBDWEZBX0ZGRmllbGQ6OlVubG9hZFdpZGdldCgpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZQdXNoQnV0dG9uOjpMYXlvdXRXaWRnZXQoKQ0KLXsNCi0gICAgQ1hGQV9GRldpZGdldDo6TGF5b3V0V2lkZ2V0KCk7DQotICAgIENGWF9SZWN0RiBydFdpZGdldDsNCi0gICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRXaWRnZXQpOw0KLSAgICBtX3J0VUkgPSBydFdpZGdldDsNCi0gICAgaWYgKENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCkpIHsNCi0gICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocnRXaWRnZXQsIG1nV2lkZ2V0KTsNCi0gICAgfQ0KLSAgICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsNCi0gICAgbV9ydENhcHRpb24uU2V0KHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsIHJ0V2lkZ2V0LmhlaWdodCk7DQotICAgIGlmIChDWEZBX01hcmdpbiBtZ0NhcCA9IGNhcHRpb24uR2V0TWFyZ2luKCkpIHsNCi0gICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsNCi0gICAgfQ0KLSAgICBMYXlvdXRIaWdobGlnaHRDYXB0aW9uKCk7DQotICAgIFNldEZXTFJlY3QoKTsNCi0gICAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfRkxPQVQgQ1hGQV9GRlB1c2hCdXR0b246OkdldExpbmVXaWR0aCgpDQotew0KLSAgICBDWEZBX0JvcmRlciBib3JkZXIgPSBtX3BEYXRhQWNjLT5HZXRCb3JkZXIoKTsNCi0gICAgaWYgKGJvcmRlci5Jc0V4aXN0SW5YTUwoKSAmJiAoYm9yZGVyLkdldFByZXNlbmNlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkpIHsNCi0gICAgICAgIENYRkFfRWRnZSBlZGdlID0gYm9yZGVyLkdldEVkZ2UoMCk7DQotICAgICAgICByZXR1cm4gZWRnZS5HZXRUaGlja25lc3MoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gMDsNCi19DQotRlhfQVJHQiBDWEZBX0ZGUHVzaEJ1dHRvbjo6R2V0TGluZUNvbG9yKCkNCi17DQotICAgIHJldHVybiAweEZGMDAwMDAwOw0KLX0NCi1GWF9BUkdCIENYRkFfRkZQdXNoQnV0dG9uOjpHZXRGaWxsQ29sb3IoKQ0KLXsNCi0gICAgcmV0dXJuIDB4RkZGRkZGRkY7DQotfQ0KLXZvaWQgQ1hGQV9GRlB1c2hCdXR0b246OkxvYWRIaWdobGlnaHRDYXB0aW9uKCkNCi17DQotICAgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvbigpOw0KLSAgICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJiBjYXB0aW9uLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVuKSB7DQotICAgICAgICB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSb2xsb3ZlcjsNCi0gICAgICAgICAgICBGWF9CT09MIGJSaWNoVGV4dDsNCi0gICAgICAgICAgICBpZiAobV9wRGF0YUFjYy0+R2V0QnV0dG9uUm9sbG92ZXIod3NSb2xsb3ZlciwgYlJpY2hUZXh0KSkgew0KLSAgICAgICAgICAgICAgICBpZiAobV9wUm9sbFByb3ZpZGVyID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcFJvbGxQcm92aWRlciA9IEZYX05FVyBDWEZBX1RleHRQcm92aWRlcihtX3BEYXRhQWNjLCBYRkFfVEVYVFBST1ZJREVSVFlQRV9Sb2xsb3Zlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9wUm9sbG92ZXJUZXh0TGF5b3V0ID0gRlhfTkVXIENYRkFfVGV4dExheW91dChtX3BSb2xsUHJvdmlkZXIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Rvd247DQotICAgICAgICAgICAgaWYgKG1fcERhdGFBY2MtPkdldEJ1dHRvbkRvd24od3NEb3duLCBiUmljaFRleHQpKSB7DQotICAgICAgICAgICAgICAgIGlmIChtX3BEb3duUHJvdmlkZXIgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wRG93blByb3ZpZGVyID0gRlhfTkVXIENYRkFfVGV4dFByb3ZpZGVyKG1fcERhdGFBY2MsIFhGQV9URVhUUFJPVklERVJUWVBFX0Rvd24pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fcERvd25UZXh0TGF5b3V0ID0gRlhfTkVXIENYRkFfVGV4dExheW91dChtX3BEb3duUHJvdmlkZXIpOw0KLSAgICAgICAgICAgIH0NCisgICAgew0KKyAgICAgIEZYX0RXT1JEIGR3U3RhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpOw0KKyAgICAgIGlmIChtX3BEb3duVGV4dExheW91dCAmJiAoZHdTdGF0ZSAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgJiYNCisgICAgICAgICAgKGR3U3RhdGUgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7DQorICAgICAgICBpZiAobV9wRG93blRleHRMYXlvdXQtPkRyYXdTdHJpbmcocFJlbmRlckRldmljZSwgbXQsIHJ0Q2xpcCkpIHsNCisgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GRlB1c2hCdXR0b246OkxheW91dEhpZ2hsaWdodENhcHRpb24oKQ0KLXsNCi0gICAgQ0ZYX1NpemVGIHN6Ow0KLSAgICBzei5TZXQobV9ydENhcHRpb24ud2lkdGgsIG1fcnRDYXB0aW9uLmhlaWdodCk7DQotICAgIExheW91dENhcHRpb24oKTsNCi0gICAgaWYgKG1fcFJvbGxvdmVyVGV4dExheW91dCkgew0KLSAgICAgICAgbV9wUm9sbG92ZXJUZXh0TGF5b3V0LT5MYXlvdXQoc3opOw0KLSAgICB9DQotICAgIGlmIChtX3BEb3duVGV4dExheW91dCkgew0KLSAgICAgICAgbV9wRG93blRleHRMYXlvdXQtPkxheW91dChzeik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6UmVuZGVySGlnaGxpZ2h0Q2FwdGlvbihDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCApDQotew0KLSAgICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCi0gICAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uKCk7DQotICAgIGlmIChjYXB0aW9uLklzRXhpc3RJblhNTCgpICYmIGNhcHRpb24uR2V0UHJlc2VuY2UoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7DQotICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlID0gcEdTLT5HZXRSZW5kZXJEZXZpY2UoKTsNCi0gICAgICAgIENGWF9SZWN0RiBydFdpZGdldDsNCi0gICAgICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCi0gICAgICAgIENGWF9SZWN0RiBydENsaXAgPSBtX3J0Q2FwdGlvbjsNCi0gICAgICAgIHJ0Q2xpcC5JbnRlcnNlY3QocnRXaWRnZXQpOw0KLSAgICAgICAgQ0ZYX01hdHJpeCBtdDsNCi0gICAgICAgIG10LlNldCgxLCAwLCAwLCAxLCBtX3J0Q2FwdGlvbi5sZWZ0LCBtX3J0Q2FwdGlvbi50b3ApOw0KLSAgICAgICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQotICAgICAgICAgICAgbXQuQ29uY2F0KCpwTWF0cml4KTsNCisgICAgICB9IGVsc2UgaWYgKG1fcFJvbGxvdmVyVGV4dExheW91dCAmJiAoZHdTdGF0ZSAmIEZXTF9TVEFURV9QU0JfSG92ZXJlZCkpIHsNCisgICAgICAgIGlmIChtX3BSb2xsb3ZlclRleHRMYXlvdXQtPkRyYXdTdHJpbmcocFJlbmRlckRldmljZSwgbXQsIHJ0Q2xpcCkpIHsNCisgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgfQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpOw0KLSAgICAgICAgICAgIGlmIChtX3BEb3duVGV4dExheW91dCAmJiAoZHdTdGF0ZSAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgJiYgKGR3U3RhdGUgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7DQotICAgICAgICAgICAgICAgIGlmIChtX3BEb3duVGV4dExheW91dC0+RHJhd1N0cmluZyhwUmVuZGVyRGV2aWNlLCBtdCwgcnRDbGlwKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChtX3BSb2xsb3ZlclRleHRMYXlvdXQgJiYgKGR3U3RhdGUgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7DQotICAgICAgICAgICAgICAgIGlmIChtX3BSb2xsb3ZlclRleHRMYXlvdXQtPkRyYXdTdHJpbmcocFJlbmRlckRldmljZSwgbXQsIHJ0Q2xpcCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwQ2FwVGV4dExheW91dCkgew0KLSAgICAgICAgICAgIHBDYXBUZXh0TGF5b3V0LT5EcmF3U3RyaW5nKHBSZW5kZXJEZXZpY2UsIG10LCBydENsaXApOw0KLSAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KLX0NCi1pbnQzMl90IENYRkFfRkZQdXNoQnV0dG9uOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLX0NCi1GV0xfRVJSCSBDWEZBX0ZGUHVzaEJ1dHRvbjo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KLXsNCi0gICAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQotICAgIHJldHVybiBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQotfQ0KLUZXTF9FUlIJQ1hGQV9GRlB1c2hCdXR0b246Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCAqcE1hdHJpeCApDQotew0KLSAgICBpZiAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdHlsZXNFeCgpICYgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVJbnZlcnRlZCkgew0KLSAgICAgICAgaWYgKChtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpICYgRldMX1NUQVRFX1BTQl9QcmVzc2VkKSAmJiAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9QU0JfSG92ZXJlZCkpIHsNCi0gICAgICAgICAgICBDRlhfUmVjdEYgcnRGaWxsOw0KLSAgICAgICAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEZpbGwpOw0KLSAgICAgICAgICAgIHJ0RmlsbC5sZWZ0ID0gcnRGaWxsLnRvcCA9IDA7DQotICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVXaXRoID0gIEdldExpbmVXaWR0aCgpOw0KLSAgICAgICAgICAgIHJ0RmlsbC5EZWZsYXRlKGZMaW5lV2l0aCwgZkxpbmVXaXRoKTsNCi0gICAgICAgICAgICBDRlhfQ29sb3IgY3IoRlhBUkdCX01BS0UoMTI4LCAxMjgsIDI1NSwgMjU1KSk7DQotICAgICAgICAgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCi0gICAgICAgICAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICAgICAgICAgIHBhdGguQ3JlYXRlKCk7DQotICAgICAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3AsIHJ0RmlsbC53aWR0aCwgcnRGaWxsLmhlaWdodCk7DQotICAgICAgICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIChDRlhfTWF0cml4KilwTWF0cml4KTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChtX3BOb3JtYWxXaWRnZXQtPkdldFN0eWxlc0V4KCkgJiBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZU91dExpbmUpIHsNCi0gICAgICAgIGlmICgobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgJiYgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3RhdGVzKCkgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7DQotICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IEdldExpbmVXaWR0aCgpOw0KLSAgICAgICAgICAgIENGWF9Db2xvciBjcihGWEFSR0JfTUFLRSgyNTUsIDEyOCwgMjU1LCAyNTUpKTsNCi0gICAgICAgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQotICAgICAgICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoZkxpbmVXaWR0aCk7DQotICAgICAgICAgICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICAgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KLSAgICAgICAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCi0gICAgICAgICAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQotICAgICAgICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCAoQ0ZYX01hdHJpeCopcE1hdHJpeCk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZiAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdHlsZXNFeCgpICYgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVQdXNoKSB7DQorICAgIGlmIChwQ2FwVGV4dExheW91dCkgew0KKyAgICAgIHBDYXBUZXh0TGF5b3V0LT5EcmF3U3RyaW5nKHBSZW5kZXJEZXZpY2UsIG10LCBydENsaXApOw0KICAgICB9DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCit9DQoraW50MzJfdCBDWEZBX0ZGUHVzaEJ1dHRvbjo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCitGV0xfRVJSIENYRkFfRkZQdXNoQnV0dG9uOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOw0KKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCit9DQorRldMX0VSUiBDWEZBX0ZGUHVzaEJ1dHRvbjo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdHlsZXNFeCgpICYgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVJbnZlcnRlZCkgew0KKyAgICBpZiAoKG1fcE5vcm1hbFdpZGdldC0+R2V0U3RhdGVzKCkgJiBGV0xfU1RBVEVfUFNCX1ByZXNzZWQpICYmDQorICAgICAgICAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9QU0JfSG92ZXJlZCkpIHsNCisgICAgICBDRlhfUmVjdEYgcnRGaWxsOw0KKyAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEZpbGwpOw0KKyAgICAgIHJ0RmlsbC5sZWZ0ID0gcnRGaWxsLnRvcCA9IDA7DQorICAgICAgRlhfRkxPQVQgZkxpbmVXaXRoID0gR2V0TGluZVdpZHRoKCk7DQorICAgICAgcnRGaWxsLkRlZmxhdGUoZkxpbmVXaXRoLCBmTGluZVdpdGgpOw0KKyAgICAgIENGWF9Db2xvciBjcihGWEFSR0JfTUFLRSgxMjgsIDEyOCwgMjU1LCAyNTUpKTsNCisgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOw0KKyAgICAgIENGWF9QYXRoIHBhdGg7DQorICAgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgICBwYXRoLkFkZFJlY3RhbmdsZShydEZpbGwubGVmdCwgcnRGaWxsLnRvcCwgcnRGaWxsLndpZHRoLCBydEZpbGwuaGVpZ2h0KTsNCisgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgKENGWF9NYXRyaXgqKXBNYXRyaXgpOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3R5bGVzRXgoKSAmDQorICAgICAgICAgICAgIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlT3V0TGluZSkgew0KKyAgICBpZiAoKG1fcE5vcm1hbFdpZGdldC0+R2V0U3RhdGVzKCkgJiBGV0xfU1RBVEVfUFNCX1ByZXNzZWQpICYmDQorICAgICAgICAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9QU0JfSG92ZXJlZCkpIHsNCisgICAgICBGWF9GTE9BVCBmTGluZVdpZHRoID0gR2V0TGluZVdpZHRoKCk7DQorICAgICAgQ0ZYX0NvbG9yIGNyKEZYQVJHQl9NQUtFKDI1NSwgMTI4LCAyNTUsIDI1NSkpOw0KKyAgICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsNCisgICAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aChmTGluZVdpZHRoKTsNCisgICAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICAgIHBhdGguQ3JlYXRlKCk7DQorICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIChDRlhfTWF0cml4KilwTWF0cml4KTsNCisgICAgfQ0KKyAgfSBlbHNlIGlmIChtX3BOb3JtYWxXaWRnZXQtPkdldFN0eWxlc0V4KCkgJiBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZVB1c2gpIHsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5oCmluZGV4IGU4MmI4OTAuLjNhNjkzOGUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnB1c2hidXR0b24uaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmgKQEAgLTYsMzQgKzYsMzggQEAKIA0KICNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9QVVNIQlVUVE9OX0lNUF9IDQogI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX1BVU0hCVVRUT05fSU1QX0gNCi0jZGVmaW5lIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlTm9uZQkJKDBMIDw8IDApDQotI2RlZmluZSBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZUludmVydGVkCSgxTCA8PCAwKQ0KLSNkZWZpbmUgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVQdXNoCQkoMkwgPDwgMCkNCi0jZGVmaW5lIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlT3V0TGluZQkoNEwgPDwgMCkNCi1jbGFzcyBDWEZBX0ZGUHVzaEJ1dHRvbiA6IHB1YmxpYyBDWEZBX0ZGRmllbGQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGUHVzaEJ1dHRvbihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GRlB1c2hCdXR0b24oKTsNCi0gICAgdmlydHVhbCB2b2lkCVJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwgaW50MzJfdCBpUm90YXRlID0gMCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQotICAgIHZpcnR1YWwgdm9pZAlVbmxvYWRXaWRnZXQoKTsNCi0gICAgdmlydHVhbAlGWF9CT09MCUxheW91dFdpZGdldCgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJTG9hZEhpZ2hsaWdodENhcHRpb24oKTsNCi0gICAgdm9pZAlMYXlvdXRIaWdobGlnaHRDYXB0aW9uKCk7DQotICAgIHZvaWQJUmVuZGVySGlnaGxpZ2h0Q2FwdGlvbihDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KLSAgICBGWF9GTE9BVCBHZXRMaW5lV2lkdGgoKTsNCi0gICAgRlhfQVJHQiAgR2V0TGluZUNvbG9yKCk7DQotICAgIEZYX0FSR0IJIEdldEZpbGxDb2xvcigpOw0KLSAgICBDWEZBX1RleHRMYXlvdXQJCSptX3BSb2xsb3ZlclRleHRMYXlvdXQ7DQotICAgIENYRkFfVGV4dExheW91dAkJKm1fcERvd25UZXh0TGF5b3V0Ow0KLSAgICBDWEZBX1RleHRQcm92aWRlcgkqbV9wRG93blByb3ZpZGVyOw0KLSAgICBDWEZBX1RleHRQcm92aWRlcgkqbV9wUm9sbFByb3ZpZGVyOw0KLSAgICBJRldMX1dpZGdldERlbGVnYXRlCSptX3BPbGREZWxlZ2F0ZTsNCisjZGVmaW5lIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlTm9uZSAoMEwgPDwgMCkNCisjZGVmaW5lIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlSW52ZXJ0ZWQgKDFMIDw8IDApDQorI2RlZmluZSBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZVB1c2ggKDJMIDw8IDApDQorI2RlZmluZSBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZU91dExpbmUgKDRMIDw8IDApDQorY2xhc3MgQ1hGQV9GRlB1c2hCdXR0b24gOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRlB1c2hCdXR0b24oQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGUHVzaEJ1dHRvbigpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlID0gMCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgdmlydHVhbCB2b2lkIFVubG9hZFdpZGdldCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIExheW91dFdpZGdldCgpOw0KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIExvYWRIaWdobGlnaHRDYXB0aW9uKCk7DQorICB2b2lkIExheW91dEhpZ2hsaWdodENhcHRpb24oKTsNCisgIHZvaWQgUmVuZGVySGlnaGxpZ2h0Q2FwdGlvbihDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgRlhfRkxPQVQgR2V0TGluZVdpZHRoKCk7DQorICBGWF9BUkdCIEdldExpbmVDb2xvcigpOw0KKyAgRlhfQVJHQiBHZXRGaWxsQ29sb3IoKTsNCisgIENYRkFfVGV4dExheW91dCogbV9wUm9sbG92ZXJUZXh0TGF5b3V0Ow0KKyAgQ1hGQV9UZXh0TGF5b3V0KiBtX3BEb3duVGV4dExheW91dDsNCisgIENYRkFfVGV4dFByb3ZpZGVyKiBtX3BEb3duUHJvdmlkZXI7DQorICBDWEZBX1RleHRQcm92aWRlciogbV9wUm9sbFByb3ZpZGVyOw0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzaWduYXR1cmUuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmNwcAppbmRleCBlZDRiZWNhLi5iODFmMTZmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzaWduYXR1cmUuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnNpZ25hdHVyZS5jcHAKQEAgLTExLDExOSArMTEsMTE3IEBACiAjaW5jbHVkZSAieGZhX2ZmcGFnZXZpZXcuaCINCiAjaW5jbHVkZSAieGZhX2Zmc2lnbmF0dXJlLmgiDQogI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KLUNYRkFfRkZTaWduYXR1cmU6OkNYRkFfRkZTaWduYXR1cmUoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCi0gICAgOiBDWEZBX0ZGRmllbGQocFBhZ2VWaWV3LCBwRGF0YUFjYykNCi17DQorQ1hGQV9GRlNpZ25hdHVyZTo6Q1hGQV9GRlNpZ25hdHVyZShDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRmllbGQocFBhZ2VWaWV3LCBwRGF0YUFjYykge30NCitDWEZBX0ZGU2lnbmF0dXJlOjp+Q1hGQV9GRlNpZ25hdHVyZSgpIHt9DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpMb2FkV2lkZ2V0KCkgew0KKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KIH0NCi1DWEZBX0ZGU2lnbmF0dXJlOjp+Q1hGQV9GRlNpZ25hdHVyZSgpDQotew0KK3ZvaWQgQ1hGQV9GRlNpZ25hdHVyZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgIENYRkFfQm9yZGVyIGJvcmRlclVJID0gbV9wRGF0YUFjYy0+R2V0VUlCb3JkZXIoKTsNCisgIERyYXdCb3JkZXIocEdTLCBib3JkZXJVSSwgbV9ydFVJLCAmbXRSb3RhdGUpOw0KKyAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQorICBEcmF3SGlnaGxpZ2h0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cywgRkFMU0UpOw0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0ID0gbV9ydFVJOw0KKyAgSVhGQV9Eb2NQcm92aWRlciogcERvY1Byb3ZpZGVyID0gbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCk7DQorICBGWFNZU19hc3NlcnQocERvY1Byb3ZpZGVyKTsNCisgIHBEb2NQcm92aWRlci0+UmVuZGVyQ3VzdG9tV2lkZ2V0KHRoaXMsIHBHUywgJm10Um90YXRlLCBydFdpZGdldCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6TG9hZFdpZGdldCgpDQotew0KLSAgICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpPbk1vdXNlRW50ZXIoKSB7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLXZvaWQgQ1hGQV9GRlNpZ25hdHVyZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ICwgRlhfRFdPUkQgZHdTdGF0dXMgLCBpbnQzMl90IGlSb3RhdGUgKQ0KLXsNCi0gICAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfTWF0cml4IG10Um90YXRlOw0KLSAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KLSAgICBpZiAocE1hdHJpeCkgew0KLSAgICAgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCi0gICAgfQ0KLSAgICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCi0gICAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KLSAgICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlKTsNCi0gICAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQotICAgIERyYXdIaWdobGlnaHQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzLCBGQUxTRSk7DQotICAgIENGWF9SZWN0RiBydFdpZGdldCA9IG1fcnRVSTsNCi0gICAgSVhGQV9Eb2NQcm92aWRlciogcERvY1Byb3ZpZGVyID0gIG1fcERhdGFBY2MtPkdldERvYygpLT5HZXREb2NQcm92aWRlcigpOw0KLSAgICBGWFNZU19hc3NlcnQocERvY1Byb3ZpZGVyKTsNCi0gICAgcERvY1Byb3ZpZGVyLT5SZW5kZXJDdXN0b21XaWRnZXQodGhpcywgcEdTLCAmbXRSb3RhdGUsIHJ0V2lkZ2V0KTsNCitGWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uTW91c2VFeGl0KCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uTW91c2VFbnRlcigpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uTW91c2VFeGl0KCkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRlNpZ25hdHVyZTo6T25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpPbkxCdXR0b25EYmxDbGsoRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZTaWduYXR1cmU6Ok9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRlNpZ25hdHVyZTo6T25MQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uTW91c2VXaGVlbChGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgekRlbHRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRlNpZ25hdHVyZTo6T25Nb3VzZU1vdmUoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6T25SQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTAlDWEZBX0ZGU2lnbmF0dXJlOjpPbk1vdXNlV2hlZWwoRlhfRFdPUkQgZHdGbGFncywgaW50MTZfdCB6RGVsdGEsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uUkJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRlNpZ25hdHVyZTo6T25SQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wJQ1hGQV9GRlNpZ25hdHVyZTo6T25SQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MCUNYRkFfRkZTaWduYXR1cmU6Ok9uUkJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpPblJCdXR0b25EYmxDbGsoRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCiANCi1GWF9CT09MCUNYRkFfRkZTaWduYXR1cmU6Ok9uU2V0Rm9jdXMoKQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6T25TZXRGb2N1cygpIHsNCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTAlDWEZBX0ZGU2lnbmF0dXJlOjpPbktpbGxGb2N1cygpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpPbktpbGxGb2N1cygpIHsNCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTAlDWEZBX0ZGU2lnbmF0dXJlOjpPbktleURvd24oRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6T25LZXlEb3duKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZTaWduYXR1cmU6Ok9uS2V5VXAoRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6T25LZXlVcChGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTAlDWEZBX0ZGU2lnbmF0dXJlOjpPbkNoYXIoRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6T25DaGFyKEZYX0RXT1JEIGR3Q2hhciwgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9EV09SRCBDWEZBX0ZGU2lnbmF0dXJlOjpPbkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgRlhfRkxPQVQgZmZ4ID0gZngsIGZmeSA9IGZ5Ow0KLSAgICAgICAgRldMVG9DbGllbnQoZmZ4LCBmZnkpOw0KLSAgICAgICAgRlhfRFdPUkQgZHdXaWRnZXRIaXQgPSBtX3BOb3JtYWxXaWRnZXQtPkhpdFRlc3QoZmZ4LCBmZnkpOw0KLSAgICAgICAgaWYgKGR3V2lkZ2V0SGl0ICE9IEZXTF9XR1RISVRURVNUX1Vua25vd24pIHsNCi0gICAgICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KLSAgICAgICAgfQ0KK0ZYX0RXT1JEIENYRkFfRkZTaWduYXR1cmU6Ok9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgRlhfRkxPQVQgZmZ4ID0gZngsIGZmeSA9IGZ5Ow0KKyAgICBGV0xUb0NsaWVudChmZngsIGZmeSk7DQorICAgIEZYX0RXT1JEIGR3V2lkZ2V0SGl0ID0gbV9wTm9ybWFsV2lkZ2V0LT5IaXRUZXN0KGZmeCwgZmZ5KTsNCisgICAgaWYgKGR3V2lkZ2V0SGl0ICE9IEZXTF9XR1RISVRURVNUX1Vua25vd24pIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KICAgICB9DQotICAgIENGWF9SZWN0RiBydEJveDsNCi0gICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRCb3gpOw0KLSAgICBpZiAoIXJ0Qm94LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KLSAgICB9DQotICAgIGlmIChtX3J0Q2FwdGlvbi5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVGl0bGViYXI7DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCisgIH0NCisgIENGWF9SZWN0RiBydEJveDsNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0Qm94KTsNCisgIGlmICghcnRCb3guQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCisgIH0NCisgIGlmIChtX3J0Q2FwdGlvbi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9UaXRsZWJhcjsNCisgIH0NCisgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRlNpZ25hdHVyZTo6T25TZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6T25TZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnNpZ25hdHVyZS5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmgKaW5kZXggZjgyODU2Yi4uMDAyYjRhMCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmgKQEAgLTYsMzIgKzYsMzggQEAKIA0KICNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9TSUdOQVRVUkVfSU1QX0gNCiAjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfU0lHTkFUVVJFX0lNUF9IDQotY2xhc3MgQ1hGQV9GRlNpZ25hdHVyZSA6IHB1YmxpYyBDWEZBX0ZGRmllbGQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGU2lnbmF0dXJlKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZGU2lnbmF0dXJlKCk7DQorY2xhc3MgQ1hGQV9GRlNpZ25hdHVyZSA6IHB1YmxpYyBDWEZBX0ZGRmllbGQgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGU2lnbmF0dXJlKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRlNpZ25hdHVyZSgpOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLCBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCUxvYWRXaWRnZXQoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbk1vdXNlRW50ZXIoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbk1vdXNlRXhpdCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTEJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Nb3VzZVdoZWVsKEZYX0RXT1JEIGR3RmxhZ3MsIGludDE2X3QgekRlbHRhLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uUkJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlID0gMCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VFbnRlcigpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VFeGl0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZU1vdmUoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlV2hlZWwoRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQogDQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25TZXRGb2N1cygpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2lsbEZvY3VzKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25LZXlEb3duKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25LZXlVcChGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uQ2hhcihGWF9EV09SRCBkd0NoYXIsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KLSAgICB2aXJ0dWFsCUZYX0RXT1JECU9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uU2V0Q3Vyc29yKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotcHJvdGVjdGVkOg0KKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Rm9jdXMoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbktpbGxGb2N1cygpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5RG93bihGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5VXAoRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgT25IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25TZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisNCisgcHJvdGVjdGVkOg0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc3ViZm9ybS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzdWJmb3JtLmNwcAppbmRleCBjN2JmYmZiLi5hNDM1ZDVhIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzdWJmb3JtLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzdWJmb3JtLmNwcApAQCAtMTEsMTAgKzExLDcgQEAKICNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KICNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCiAjaW5jbHVkZSAieGZhX2ZmZG9jLmgiDQotQ1hGQV9GRlN1YkZvcm06OkNYRkFfRkZTdWJGb3JtKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQotICAgIDogQ1hGQV9GRldpZGdldChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KLXsNCi19DQotQ1hGQV9GRlN1YkZvcm06On5DWEZBX0ZGU3ViRm9ybSgpDQotew0KLX0NCitDWEZBX0ZGU3ViRm9ybTo6Q1hGQV9GRlN1YkZvcm0oQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGV2lkZ2V0KHBQYWdlVmlldywgcERhdGFBY2MpIHt9DQorQ1hGQV9GRlN1YkZvcm06On5DWEZBX0ZGU3ViRm9ybSgpIHt9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc3ViZm9ybS5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc3ViZm9ybS5oCmluZGV4IDA5ZGVlZjQuLjM5NmYxZjQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnN1YmZvcm0uaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzdWJmb3JtLmgKQEAgLTYsMTIgKzYsMTEgQEAKIA0KICNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9TVUJGT1JNX0lNUF9IDQogI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX1NVQkZPUk1fSU1QX0gNCi1jbGFzcyBDWEZBX0ZGU3ViRm9ybSA6IHB1YmxpYyBDWEZBX0ZGV2lkZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GRlN1YkZvcm0oQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQotICAgIHZpcnR1YWwgfkNYRkFfRkZTdWJGb3JtKCk7DQorY2xhc3MgQ1hGQV9GRlN1YkZvcm0gOiBwdWJsaWMgQ1hGQV9GRldpZGdldCB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZTdWJGb3JtKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRlN1YkZvcm0oKTsNCiANCi1wcm90ZWN0ZWQ6DQorIHByb3RlY3RlZDoNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHQuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5jcHAKaW5kZXggYjZjYjViNy4uZGMzNDVlMCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5jcHAKQEAgLTE0LDE3NSArMTQsMTY2IEBACiAjaW5jbHVkZSAieGZhX2ZmZG9jLmgiDQogI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KIENYRkFfRkZUZXh0OjpDWEZBX0ZGVGV4dChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KLSAgICA6IENYRkFfRkZEcmF3KHBQYWdlVmlldywgcERhdGFBY2MpDQotew0KLX0NCi1DWEZBX0ZGVGV4dDo6fkNYRkFfRkZUZXh0KCkNCi17DQotfQ0KLXZvaWQgQ1hGQV9GRlRleHQ6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCAsIEZYX0RXT1JEIGR3U3RhdHVzICwgaW50MzJfdCBpUm90YXRlICkNCi17DQotICAgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQotICAgICAgICByZXR1cm47DQorICAgIDogQ1hGQV9GRkRyYXcocFBhZ2VWaWV3LCBwRGF0YUFjYykge30NCitDWEZBX0ZGVGV4dDo6fkNYRkFfRkZUZXh0KCkge30NCit2b2lkIENYRkFfRkZUZXh0OjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUpIHsNCisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHsNCisgICAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgICAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KICAgICB9DQotICAgIHsNCi0gICAgICAgIENGWF9NYXRyaXggbXRSb3RhdGU7DQotICAgICAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KLSAgICAgICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgICAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cyk7DQotICAgICAgICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0VGV4dExheW91dCgpOw0KLSAgICAgICAgaWYgKHBUZXh0TGF5b3V0KSB7DQotICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHUy0+R2V0UmVuZGVyRGV2aWNlKCk7DQotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCi0gICAgICAgICAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydFRleHQpOw0KLSAgICAgICAgICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSB0aGlzLT5HZXRMYXlvdXRJdGVtKCk7DQotICAgICAgICAgICAgICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwgJiYgcEl0ZW0tPkdldE5leHQoKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0VGV4dCwgbWdXaWRnZXQpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxlZnRJbnNldCwgZlJpZ2h0SW5zZXQsIGZUb3BJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQotICAgICAgICAgICAgICAgICAgICBtZ1dpZGdldC5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7DQotICAgICAgICAgICAgICAgICAgICBtZ1dpZGdldC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcnRUZXh0LkRlZmxhdGUoZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDRlhfTWF0cml4IG10Ow0KLSAgICAgICAgICAgIG10LlNldCgxLCAwLCAwLCAxLCBydFRleHQubGVmdCwgcnRUZXh0LnRvcCk7DQotICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0Q2xpcCA9IHJ0VGV4dDsNCi0gICAgICAgICAgICBtdFJvdGF0ZS5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQotICAgICAgICAgICAgbXQuQ29uY2F0KG10Um90YXRlKTsNCi0gICAgICAgICAgICBwVGV4dExheW91dC0+RHJhd1N0cmluZyhwUmVuZGVyRGV2aWNlLCBtdCwgcnRDbGlwLCB0aGlzLT5HZXRMYXlvdXRJdGVtKCktPkdldEluZGV4KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRlRleHQ6OklzTG9hZGVkKCkNCi17DQorICAgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOw0KICAgICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0VGV4dExheW91dCgpOw0KLSAgICByZXR1cm4gcFRleHRMYXlvdXQgIT0gTlVMTCAmJiAhcFRleHRMYXlvdXQtPm1fYkhhc0Jsb2NrOw0KLX0NCi1GWF9CT09MIENYRkFfRkZUZXh0OjpMYXlvdXRXaWRnZXQoKQ0KLXsNCi0gICAgQ1hGQV9GRkRyYXc6OkxheW91dFdpZGdldCgpOw0KLSAgICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0VGV4dExheW91dCgpOw0KLSAgICBpZiAoIXBUZXh0TGF5b3V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKCFwVGV4dExheW91dC0+bV9iSGFzQmxvY2spIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHBUZXh0TGF5b3V0LT5tX0Jsb2Nrcy5SZW1vdmVBbGwoKTsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHRoaXMtPkdldExheW91dEl0ZW0oKTsNCi0gICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCAmJiBwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHBJdGVtID0gcEl0ZW0tPkdldEZpcnN0KCk7DQotICAgIHdoaWxlIChwSXRlbSkgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCi0gICAgICAgIHBJdGVtLT5HZXRSZWN0KHJ0VGV4dCk7DQotICAgICAgICBpZiAoQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKSkgew0KLSAgICAgICAgICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvcEluc2V0Ow0KLSAgICAgICAgICAgICAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KLSAgICAgICAgICAgICAgICBydFRleHQuaGVpZ2h0IC09IGZUb3BJbnNldDsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHBJdGVtLT5HZXROZXh0KCkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQm90dG9tSW5zZXQ7DQotICAgICAgICAgICAgICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQotICAgICAgICAgICAgICAgIHJ0VGV4dC5oZWlnaHQgLT0gZkJvdHRvbUluc2V0Ow0KLSAgICAgICAgICAgIH0NCisgICAgaWYgKHBUZXh0TGF5b3V0KSB7DQorICAgICAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHUy0+R2V0UmVuZGVyRGV2aWNlKCk7DQorICAgICAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgICAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydFRleHQpOw0KKyAgICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQorICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gdGhpcy0+R2V0TGF5b3V0SXRlbSgpOw0KKyAgICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCAmJiBwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCisgICAgICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihydFRleHQsIG1nV2lkZ2V0KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZSaWdodEluc2V0LCBmVG9wSW5zZXQgPSAwLCBmQm90dG9tSW5zZXQgPSAwOw0KKyAgICAgICAgICBtZ1dpZGdldC5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7DQorICAgICAgICAgIG1nV2lkZ2V0LkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOw0KKyAgICAgICAgICBpZiAocEl0ZW0tPkdldFByZXYoKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgbWdXaWRnZXQuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgICAgICAgICAgfSBlbHNlIGlmIChwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCisgICAgICAgICAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJ0VGV4dC5EZWZsYXRlKGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldCk7DQogICAgICAgICB9DQotICAgICAgICBwVGV4dExheW91dC0+SXRlbUJsb2NrcyhydFRleHQsIHBJdGVtLT5HZXRJbmRleCgpKTsNCi0gICAgICAgIHBJdGVtID0gcEl0ZW0tPkdldE5leHQoKTsNCisgICAgICB9DQorICAgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgICBtdC5TZXQoMSwgMCwgMCwgMSwgcnRUZXh0LmxlZnQsIHJ0VGV4dC50b3ApOw0KKyAgICAgIENGWF9SZWN0RiBydENsaXAgPSBydFRleHQ7DQorICAgICAgbXRSb3RhdGUuVHJhbnNmb3JtUmVjdChydENsaXApOw0KKyAgICAgIG10LkNvbmNhdChtdFJvdGF0ZSk7DQorICAgICAgcFRleHRMYXlvdXQtPkRyYXdTdHJpbmcocFJlbmRlckRldmljZSwgbXQsIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5HZXRMYXlvdXRJdGVtKCktPkdldEluZGV4KCkpOw0KICAgICB9DQotICAgIHBUZXh0TGF5b3V0LT5tX2JIYXNCbG9jayA9IEZBTFNFOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0OjpJc0xvYWRlZCgpIHsNCisgIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRUZXh0TGF5b3V0KCk7DQorICByZXR1cm4gcFRleHRMYXlvdXQgIT0gTlVMTCAmJiAhcFRleHRMYXlvdXQtPm1fYkhhc0Jsb2NrOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0OjpMYXlvdXRXaWRnZXQoKSB7DQorICBDWEZBX0ZGRHJhdzo6TGF5b3V0V2lkZ2V0KCk7DQorICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0VGV4dExheW91dCgpOw0KKyAgaWYgKCFwVGV4dExheW91dCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoIXBUZXh0TGF5b3V0LT5tX2JIYXNCbG9jaykgew0KICAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGVGV4dDo6T25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBDRlhfUmVjdEYgcnRCb3g7DQotICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0Qm94KTsNCi0gICAgaWYgKCFydEJveC5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgY29uc3QgRlhfV0NIQVIqIHdzVVJMQ29udGVudCA9IEdldExpbmtVUkxBdFBvaW50KGZ4LCBmeSk7DQotICAgIGlmIChOVUxMID09IHdzVVJMQ29udGVudCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQorICB9DQorICBwVGV4dExheW91dC0+bV9CbG9ja3MuUmVtb3ZlQWxsKCk7DQorICBDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gdGhpcy0+R2V0TGF5b3V0SXRlbSgpOw0KKyAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCAmJiBwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCiAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBwSXRlbSA9IHBJdGVtLT5HZXRGaXJzdCgpOw0KKyAgd2hpbGUgKHBJdGVtKSB7DQorICAgIENGWF9SZWN0RiBydFRleHQ7DQorICAgIHBJdGVtLT5HZXRSZWN0KHJ0VGV4dCk7DQorICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQorICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCkgew0KKyAgICAgICAgRlhfRkxPQVQgZlRvcEluc2V0Ow0KKyAgICAgICAgbWdXaWRnZXQuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgICAgICAgIHJ0VGV4dC5oZWlnaHQgLT0gZlRvcEluc2V0Ow0KKyAgICAgIH0gZWxzZSBpZiAocEl0ZW0tPkdldE5leHQoKSA9PSBOVUxMKSB7DQorICAgICAgICBGWF9GTE9BVCBmQm90dG9tSW5zZXQ7DQorICAgICAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KKyAgICAgICAgcnRUZXh0LmhlaWdodCAtPSBmQm90dG9tSW5zZXQ7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHBUZXh0TGF5b3V0LT5JdGVtQmxvY2tzKHJ0VGV4dCwgcEl0ZW0tPkdldEluZGV4KCkpOw0KKyAgICBwSXRlbSA9IHBJdGVtLT5HZXROZXh0KCk7DQorICB9DQorICBwVGV4dExheW91dC0+bV9iSGFzQmxvY2sgPSBGQUxTRTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZUZXh0OjpPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBDRlhfUmVjdEYgcnRCb3g7DQotICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0Qm94KTsNCi0gICAgaWYgKCFydEJveC5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgY29uc3QgRlhfV0NIQVIqIHdzVVJMQ29udGVudCA9IEdldExpbmtVUkxBdFBvaW50KGZ4LCBmeSk7DQotICAgIGlmIChOVUxMID09IHdzVVJMQ29udGVudCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ1hGQV9GRlRleHQ6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBDRlhfUmVjdEYgcnRCb3g7DQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQorICBpZiAoIXJ0Qm94LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIHdzVVJMQ29udGVudCA9IEdldExpbmtVUkxBdFBvaW50KGZ4LCBmeSk7DQorICBpZiAoTlVMTCA9PSB3c1VSTENvbnRlbnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgU2V0QnV0dG9uRG93bihUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENYRkFfRkZUZXh0OjpPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBpZiAoIUlzQnV0dG9uRG93bigpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgU2V0QnV0dG9uRG93bihGQUxTRSk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiB3c1VSTENvbnRlbnQgPSBHZXRMaW5rVVJMQXRQb2ludChmeCwgZnkpOw0KLSAgICBpZiAoTlVMTCA9PSB3c1VSTENvbnRlbnQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDWEZBX0ZGRG9jKiBwRG9jID0gR2V0RG9jKCk7DQotICAgIHBEb2MtPkdldERvY1Byb3ZpZGVyKCktPkdvdG9VUkwocERvYywgQ0ZYX1dpZGVTdHJpbmdDKHdzVVJMQ29udGVudCksIEZBTFNFKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDWEZBX0ZGVGV4dDo6T25Nb3VzZU1vdmUoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBDRlhfUmVjdEYgcnRCb3g7DQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQorICBpZiAoIXJ0Qm94LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIHdzVVJMQ29udGVudCA9IEdldExpbmtVUkxBdFBvaW50KGZ4LCBmeSk7DQorICBpZiAoTlVMTCA9PSB3c1VSTENvbnRlbnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0RXT1JEIENYRkFfRkZUZXh0OjpPbkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0Qm94Ow0KLSAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQotICAgIGlmICghcnRCb3guQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQotICAgIH0NCi0gICAgY29uc3QgRlhfV0NIQVIqIHdzVVJMQ29udGVudCA9IEdldExpbmtVUkxBdFBvaW50KGZ4LCBmeSk7DQotICAgIGlmIChOVUxMID09IHdzVVJMQ29udGVudCkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQotICAgIH0NCi0gICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1RyYW5zcGFyZW50Ow0KK0ZYX0JPT0wgQ1hGQV9GRlRleHQ6Ok9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFJc0J1dHRvbkRvd24oKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBTZXRCdXR0b25Eb3duKEZBTFNFKTsNCisgIGNvbnN0IEZYX1dDSEFSKiB3c1VSTENvbnRlbnQgPSBHZXRMaW5rVVJMQXRQb2ludChmeCwgZnkpOw0KKyAgaWYgKE5VTEwgPT0gd3NVUkxDb250ZW50KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfRkZEb2MqIHBEb2MgPSBHZXREb2MoKTsNCisgIHBEb2MtPkdldERvY1Byb3ZpZGVyKCktPkdvdG9VUkwocERvYywgQ0ZYX1dpZGVTdHJpbmdDKHdzVVJMQ29udGVudCksIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1jb25zdCBGWF9XQ0hBUiogQ1hGQV9GRlRleHQ6OkdldExpbmtVUkxBdFBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRUZXh0TGF5b3V0KCk7DQotICAgIGlmICggTlVMTCA9PSBwVGV4dExheW91dCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgeChmeCksIHkoZnkpOw0KLSAgICBGV0xUb0NsaWVudCh4LCB5KTsNCi0gICAgY29uc3QgQ1hGQV9QaWVjZUxpbmVBcnJheSogcFBpZWNlTGluZXMgPSBwVGV4dExheW91dC0+R2V0UGllY2VMaW5lcygpOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IHBQaWVjZUxpbmVzLT5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICBDWEZBX1BpZWNlTGluZSAqcFBpZWNlTGluZSA9IHBQaWVjZUxpbmVzLT5HZXRBdChpKTsNCi0gICAgICAgIGludDMyX3QgaVBpZWNlcyA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRTaXplKCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUGllY2VzOyBqKyspIHsNCi0gICAgICAgICAgICBYRkFfTFBURVhUUElFQ0UgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGopOw0KLSAgICAgICAgICAgIGlmIChwUGllY2UtPnBMaW5rRGF0YSAmJiBwUGllY2UtPnJ0UGllY2UuQ29udGFpbnMoeCwgeSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBQaWVjZS0+cExpbmtEYXRhLT5HZXRMaW5rVVJMKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQorRlhfRFdPUkQgQ1hGQV9GRlRleHQ6Ok9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIENGWF9SZWN0RiBydEJveDsNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0Qm94KTsNCisgIGlmICghcnRCb3guQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiB3c1VSTENvbnRlbnQgPSBHZXRMaW5rVVJMQXRQb2ludChmeCwgZnkpOw0KKyAgaWYgKE5VTEwgPT0gd3NVUkxDb250ZW50KSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1RyYW5zcGFyZW50Ow0KK30NCitjb25zdCBGWF9XQ0hBUiogQ1hGQV9GRlRleHQ6OkdldExpbmtVUkxBdFBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgQ1hGQV9UZXh0TGF5b3V0KiBwVGV4dExheW91dCA9IG1fcERhdGFBY2MtPkdldFRleHRMYXlvdXQoKTsNCisgIGlmIChOVUxMID09IHBUZXh0TGF5b3V0KSB7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhfRkxPQVQgeChmeCksIHkoZnkpOw0KKyAgRldMVG9DbGllbnQoeCwgeSk7DQorICBjb25zdCBDWEZBX1BpZWNlTGluZUFycmF5KiBwUGllY2VMaW5lcyA9IHBUZXh0TGF5b3V0LT5HZXRQaWVjZUxpbmVzKCk7DQorICBpbnQzMl90IGlDb3VudCA9IHBQaWVjZUxpbmVzLT5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSA9IHBQaWVjZUxpbmVzLT5HZXRBdChpKTsNCisgICAgaW50MzJfdCBpUGllY2VzID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVBpZWNlczsgaisrKSB7DQorICAgICAgWEZBX0xQVEVYVFBJRUNFIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRBdChqKTsNCisgICAgICBpZiAocFBpZWNlLT5wTGlua0RhdGEgJiYgcFBpZWNlLT5ydFBpZWNlLkNvbnRhaW5zKHgsIHkpKSB7DQorICAgICAgICByZXR1cm4gcFBpZWNlLT5wTGlua0RhdGEtPkdldExpbmtVUkwoKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi12b2lkIENYRkFfRkZUZXh0OjpGV0xUb0NsaWVudChGWF9GTE9BVCAmZngsIEZYX0ZMT0FUICZmeSkNCi17DQotICAgIENGWF9SZWN0RiBydFdpZGdldDsNCi0gICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRXaWRnZXQpOw0KLSAgICBmeCAtPSBydFdpZGdldC5sZWZ0Ow0KLSAgICBmeSAtPSBydFdpZGdldC50b3A7DQordm9pZCBDWEZBX0ZGVGV4dDo6RldMVG9DbGllbnQoRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpIHsNCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCisgIGZ4IC09IHJ0V2lkZ2V0LmxlZnQ7DQorICBmeSAtPSBydFdpZGdldC50b3A7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHQuaAppbmRleCBjNzQ5OThhLi5jZDk2ZmE3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0LmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5oCkBAIC03LDIwICs3LDIzIEBACiAjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfRFJBV1RFWFRfSU1QX0gNCiAjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfRFJBV1RFWFRfSU1QX0gNCiBjbGFzcyBDWEZBX1RleHRMYXlvdXQ7DQotY2xhc3MgQ1hGQV9GRlRleHQgOiBwdWJsaWMgQ1hGQV9GRkRyYXcNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGVGV4dChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GRlRleHQoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCU9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCU9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsCUZYX0RXT1JECU9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIHZvaWQJUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLCBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCi0gICAgdmlydHVhbAlGWF9CT09MCUlzTG9hZGVkKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTCBMYXlvdXRXaWRnZXQoKTsNCi1wcml2YXRlOg0KLSAgICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRMaW5rVVJMQXRQb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2b2lkIEZXTFRvQ2xpZW50KEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KTsNCitjbGFzcyBDWEZBX0ZGVGV4dCA6IHB1YmxpYyBDWEZBX0ZGRHJhdyB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZUZXh0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRlRleHQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBPbkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cyA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KKyAgdmlydHVhbCBGWF9CT09MIElzTG9hZGVkKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTGF5b3V0V2lkZ2V0KCk7DQorDQorIHByaXZhdGU6DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRMaW5rVVJMQXRQb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdm9pZCBGV0xUb0NsaWVudChGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5jcHAKaW5kZXggM2NmOTQ1Mi4uNjBjYjM0MiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dGVkaXQuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHRlZGl0LmNwcApAQCAtMTUsODM1ICsxNSw3OTIgQEAKICNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCiAjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KICNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCi1DWEZBX0ZGVGV4dEVkaXQ6OkNYRkFfRkZUZXh0RWRpdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KLSAgICA6IENYRkFfRkZGaWVsZChwUGFnZVZpZXcsIHBEYXRhQWNjKQ0KLSAgICAsIG1fcE9sZERlbGVnYXRlKE5VTEwpDQotew0KLX0NCi1DWEZBX0ZGVGV4dEVkaXQ6On5DWEZBX0ZGVGV4dEVkaXQoKQ0KLXsNCi0gICAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KLSAgICAgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KLSAgICAgICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICAgICAgcE5vdGVEcml2ZXItPlVucmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0KTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6TG9hZFdpZGdldCgpDQotew0KLSAgICBDRldMX0VkaXQqIHBGV0xFZGl0ID0gQ0ZXTF9FZGl0OjpDcmVhdGUoKTsNCi0gICAgcEZXTEVkaXQtPkluaXRpYWxpemUoKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0ID0gcEZXTEVkaXQ7DQorQ1hGQV9GRlRleHRFZGl0OjpDWEZBX0ZGVGV4dEVkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZGaWVsZChwUGFnZVZpZXcsIHBEYXRhQWNjKSwgbV9wT2xkRGVsZWdhdGUoTlVMTCkge30NCitDWEZBX0ZGVGV4dEVkaXQ6On5DWEZBX0ZGVGV4dEVkaXQoKSB7DQorICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQogICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCi0gICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0LCBwV2lkZ2V0KTsNCi0gICAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCi0gICAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQotICAgIHBGV0xFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQotICAgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBwTm90ZURyaXZlci0+VW5yZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRkZUZXh0RWRpdDo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKQ0KLXsNCi0gICAgQ0ZXTF9FZGl0KiBwV2lkZ2V0ID0gKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0Ow0KLSAgICBpZiAoIXBXaWRnZXQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBkd1N0eWxlID0gMDsNCi0gICAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMgfCBGV0xfU1RZTEVFWFRfRURUX091dGVyU2Nyb2xsYmFyIHwgRldMX1NUWUxFRVhUX0VEVF9MYXN0TGluZUhlaWdodDsNCi0gICAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsNCi0gICAgaWYgKG1fcERhdGFBY2MtPklzTXVsdGlMaW5lKCkpIHsNCi0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSB8IEZXTF9TVFlMRUVYVF9FRFRfV2FudFJldHVybjsNCi0gICAgICAgIGlmIChtX3BEYXRhQWNjLT5HZXRWZXJ0aWNhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgew0KLSAgICAgICAgICAgIGR3U3R5bGUgfD0gRldMX1dHVFNUWUxFX1ZTY3JvbGw7DQotICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGw7DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZiAobV9wRGF0YUFjYy0+R2V0SG9yaXpvbnRhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgew0KLSAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7DQotICAgIH0NCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQotICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsNCi0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZTsNCi0gICAgfQ0KLSAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV047DQotICAgIGludDMyX3QgaU1heENoYXJzID0gbV9wRGF0YUFjYy0+R2V0TWF4Q2hhcnMoZVR5cGUpOw0KLSAgICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQotICAgICAgICBpTWF4Q2hhcnMgPSAwOw0KLSAgICB9DQotICAgIGludDMyX3QgaU51bUNlbGxzID0gbV9wRGF0YUFjYy0+R2V0TnVtYmVyT2ZDZWxscygpOw0KLSAgICBpZiAoaU51bUNlbGxzID09IDApIHsNCi0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0Ow0KLSAgICAgICAgcFdpZGdldC0+U2V0TGltaXQoaU1heENoYXJzID4gMCA/IGlNYXhDaGFycyA6IDEpOw0KLSAgICB9IGVsc2UgaWYgKGlOdW1DZWxscyA+IDApIHsNCi0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0Ow0KLSAgICAgICAgcFdpZGdldC0+U2V0TGltaXQoaU51bUNlbGxzKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBXaWRnZXQtPlNldExpbWl0KGlNYXhDaGFycyk7DQotICAgIH0NCi0gICAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlcyhkd1N0eWxlLCAweEZGRkZGRkZGKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd0V4dGVuZGVkU3R5bGUsIDB4RkZGRkZGRkYpOw0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpMb2FkV2lkZ2V0KCkgew0KKyAgQ0ZXTF9FZGl0KiBwRldMRWRpdCA9IENGV0xfRWRpdDo6Q3JlYXRlKCk7DQorICBwRldMRWRpdC0+SW5pdGlhbGl6ZSgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gcEZXTEVkaXQ7DQorICBJRldMX1dpZGdldCogcFdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocFdpZGdldCwgcFdpZGdldCk7DQorICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCisgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICBwRldMRWRpdC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsNCisgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQordm9pZCBDWEZBX0ZGVGV4dEVkaXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkgew0KKyAgQ0ZXTF9FZGl0KiBwV2lkZ2V0ID0gKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgaWYgKCFwV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOw0KKyAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0Ow0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsNCisgIGlmIChtX3BEYXRhQWNjLT5Jc011bHRpTGluZSgpKSB7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSB8IEZXTF9TVFlMRUVYVF9FRFRfV2FudFJldHVybjsNCisgICAgaWYgKG1fcERhdGFBY2MtPkdldFZlcnRpY2FsU2Nyb2xsUG9saWN5KCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT2ZmKSB7DQorICAgICAgZHdTdHlsZSB8PSBGV0xfV0dUU1RZTEVfVlNjcm9sbDsNCisgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9BdXRvVlNjcm9sbDsNCiAgICAgfQ0KLSAgICBpZiAoIUlzRm9jdXNlZCgpKSB7DQotICAgICAgICBtX2R3U3RhdHVzIHw9IFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCi0gICAgICAgIFVwZGF0ZUZXTERhdGEoKTsNCi0gICAgICAgIEFkZEludmFsaWRhdGVSZWN0KCk7DQotICAgIH0NCi0gICAgU2V0QnV0dG9uRG93bihUUlVFKTsNCi0gICAgQ0ZXTF9Nc2dNb3VzZSBtczsNCi0gICAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjsNCi0gICAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCi0gICAgbXMubV9meCA9IGZ4Ow0KLSAgICBtcy5tX2Z5ID0gZnk7DQotICAgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KLSAgICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCi0gICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KLSAgICByZXR1cm4gVFJVRTsNCisgIH0gZWxzZSBpZiAobV9wRGF0YUFjYy0+R2V0SG9yaXpvbnRhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgew0KKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbDsNCisgIH0NCisgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuIHx8DQorICAgICAgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5Ow0KKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmU7DQorICB9DQorICBYRkFfRUxFTUVOVCBlVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV047DQorICBpbnQzMl90IGlNYXhDaGFycyA9IG1fcERhdGFBY2MtPkdldE1heENoYXJzKGVUeXBlKTsNCisgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9FeERhdGEpIHsNCisgICAgaU1heENoYXJzID0gMDsNCisgIH0NCisgIGludDMyX3QgaU51bUNlbGxzID0gbV9wRGF0YUFjYy0+R2V0TnVtYmVyT2ZDZWxscygpOw0KKyAgaWYgKGlOdW1DZWxscyA9PSAwKSB7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0Ow0KKyAgICBwV2lkZ2V0LT5TZXRMaW1pdChpTWF4Q2hhcnMgPiAwID8gaU1heENoYXJzIDogMSk7DQorICB9IGVsc2UgaWYgKGlOdW1DZWxscyA+IDApIHsNCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQ7DQorICAgIHBXaWRnZXQtPlNldExpbWl0KGlOdW1DZWxscyk7DQorICB9IGVsc2Ugew0KKyAgICBwV2lkZ2V0LT5TZXRMaW1pdChpTWF4Q2hhcnMpOw0KKyAgfQ0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXMoZHdTdHlsZSwgMHhGRkZGRkZGRik7DQorICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKCFJc0ZvY3VzZWQoKSkgew0KLSAgICAgICAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQotICAgICAgICBVcGRhdGVGV0xEYXRhKCk7DQotICAgICAgICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KLSAgICB9DQotICAgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQotICAgIENGV0xfTXNnTW91c2UgbXM7DQotICAgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfUkJ1dHRvbkRvd247DQotICAgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQotICAgIG1zLm1fZnggPSBmeDsNCi0gICAgbXMubV9meSA9IGZ5Ow0KLSAgICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCi0gICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUkJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIGlmICghQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25VcChkd0ZsYWdzLCBmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZYX1BvaW50RiBwdDsNCi0gICAgcHQuU2V0KGZ4LCBmeSk7DQotICAgIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5Qb3B1cE1lbnUodGhpcywgcHQsIE5VTEwpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCkNCi17DQotICAgIG1fZHdTdGF0dXMgJj0gflhGQV9XSURHRVRTVEFUVVNfVGV4dEVkaXRWYWx1ZUNoYW5nZWQ7DQotICAgIGlmICghSXNGb2N1c2VkKCkpIHsNCi0gICAgICAgIG1fZHdTdGF0dXMgfD0gWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkOw0KLSAgICAgICAgVXBkYXRlRldMRGF0YSgpOw0KLSAgICAgICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCi0gICAgfQ0KLSAgICBDWEZBX0ZGV2lkZ2V0OjpPblNldEZvY3VzKHBPbGRXaWRnZXQpOw0KLSAgICBDRldMX01zZ1NldEZvY3VzIG1zOw0KLSAgICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCi0gICAgbXMubV9wU3JjVGFyZ2V0ID0gTlVMTDsNCi0gICAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTAlDWEZBX0ZGVGV4dEVkaXQ6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpDQotew0KLSAgICBDRldMX01zZ0tpbGxGb2N1cyBtczsNCi0gICAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJbXA7DQotICAgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQotICAgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCi0gICAgbV9kd1N0YXR1cyAmPSB+WEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkOw0KLSAgICBTZXRFZGl0U2Nyb2xsT2Zmc2V0KCk7DQotICAgIFByb2Nlc3NDb21taXR0ZWREYXRhKCk7DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghSXNGb2N1c2VkKCkpIHsNCisgICAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQogICAgIFVwZGF0ZUZXTERhdGEoKTsNCiAgICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCi0gICAgQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMocE5ld1dpZGdldCk7DQotICAgIG1fZHdTdGF0dXMgJj0gflhGQV9XSURHRVRTVEFUVVNfVGV4dEVkaXRWYWx1ZUNoYW5nZWQ7DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgU2V0QnV0dG9uRG93bihUUlVFKTsNCisgIENGV0xfTXNnTW91c2UgbXM7DQorICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOw0KKyAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgIG1zLm1fZnggPSBmeDsNCisgIG1zLm1fZnkgPSBmeTsNCisgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAlDWEZBX0ZGVGV4dEVkaXQ6OkNvbW1pdERhdGEoKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0VGV4dCh3c1RleHQpOw0KLSAgICBpZiAobV9wRGF0YUFjYy0+U2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpKSB7DQotICAgICAgICBtX3BEYXRhQWNjLT5VcGRhdGVVSURpc3BsYXkodGhpcyk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBWYWxpZGF0ZU51bWJlckZpZWxkKHdzVGV4dCk7DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghSXNGb2N1c2VkKCkpIHsNCisgICAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQorICAgIFVwZGF0ZUZXTERhdGEoKTsNCisgICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCisgIH0NCisgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRG93bjsNCisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICBtcy5tX2Z4ID0gZng7DQorICBtcy5tX2Z5ID0gZnk7DQorICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi12b2lkIENYRkFfRkZUZXh0RWRpdDo6VmFsaWRhdGVOdW1iZXJGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KQ0KLXsNCi0gICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSB0aGlzLT5HZXREYXRhQWNjKCk7DQotICAgIGlmIChwQWNjICYmIHBBY2MtPkdldFVJVHlwZSgpID09IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0KSB7DQotICAgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCi0gICAgICAgIGlmIChwQXBwUHJvdmlkZXIpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KLSAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX0FwcE5hbWUsIHdzVGl0bGUpOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Vycm9yOw0KLSAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX1ZhbGlkYXRlTnVtYmVyRXJyb3IsIHdzRXJyb3IpOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU29tRmllbGQ7DQotICAgICAgICAgICAgcEFjYy0+R2V0Tm9kZSgpLT5HZXRTT01FeHByZXNzaW9uKHdzU29tRmllbGQpOw0KLSAgICAgICAgICAgIHdzTWVzc2FnZS5Gb3JtYXQod3NFcnJvciwgKGNvbnN0IEZYX1dDSEFSKil3c1RleHQsIChjb25zdCBGWF9XQ0hBUiopd3NTb21GaWVsZCk7DQotICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NNZXNzYWdlLCB3c1RpdGxlLCBYRkFfTUJJQ09OX0Vycm9yLCBYRkFfTUJfT0spOw0KLSAgICAgICAgfQ0KLSAgICB9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUkJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFDWEZBX0ZGRmllbGQ6Ok9uUkJ1dHRvblVwKGR3RmxhZ3MsIGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1BvaW50RiBwdDsNCisgIHB0LlNldChmeCwgZnkpOw0KKyAgR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPlBvcHVwTWVudSh0aGlzLCBwdCwgTlVMTCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OklzRGF0YUNoYW5nZWQoKQ0KLXsNCi0gICAgcmV0dXJuIChtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19UZXh0RWRpdFZhbHVlQ2hhbmdlZCkgIT0gMDsNCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6T25TZXRGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwT2xkV2lkZ2V0KSB7DQorICBtX2R3U3RhdHVzICY9IH5YRkFfV0lER0VUU1RBVFVTX1RleHRFZGl0VmFsdWVDaGFuZ2VkOw0KKyAgaWYgKCFJc0ZvY3VzZWQoKSkgew0KKyAgICBtX2R3U3RhdHVzIHw9IFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCisgICAgVXBkYXRlRldMRGF0YSgpOw0KKyAgICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KKyAgfQ0KKyAgQ1hGQV9GRldpZGdldDo6T25TZXRGb2N1cyhwT2xkV2lkZ2V0KTsNCisgIENGV0xfTXNnU2V0Rm9jdXMgbXM7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcEltcDsNCisgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfRFdPUkQgQ1hGQV9GRlRleHRFZGl0OjpHZXRBbGlnbm1lbnQoKQ0KLXsNCi0gICAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gMDsNCi0gICAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQotICAgICAgICBpbnQzMl90IGlIb3J6ID0gcGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKTsNCi0gICAgICAgIHN3aXRjaChpSG9yeikgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KLSAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9IQ2VudGVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnk6DQotICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0p1c3RpZmllZDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JhZGl4Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KLSAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9IRmFyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9ITmVhcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlWZXJ0ID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7DQotICAgICAgICBzd2l0Y2goaVZlcnQpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToNCi0gICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfVkNlbnRlcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206DQotICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX1ZGYXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX1ZOZWFyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gZHdFeHRlbmRlZFN0eWxlOw0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KSB7DQorICBDRldMX01zZ0tpbGxGb2N1cyBtczsNCisgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSW1wOw0KKyAgbXMubV9wU3JjVGFyZ2V0ID0gTlVMTDsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIG1fZHdTdGF0dXMgJj0gflhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCisgIFNldEVkaXRTY3JvbGxPZmZzZXQoKTsNCisgIFByb2Nlc3NDb21taXR0ZWREYXRhKCk7DQorICBVcGRhdGVGV0xEYXRhKCk7DQorICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KKyAgQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMocE5ld1dpZGdldCk7DQorICBtX2R3U3RhdHVzICY9IH5YRkFfV0lER0VUU1RBVFVTX1RleHRFZGl0VmFsdWVDaGFuZ2VkOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpVcGRhdGVGV0xEYXRhKCkNCi17DQotICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgWEZBX1ZBTFVFUElDVFVSRSBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheTsNCi0gICAgaWYgKElzRm9jdXNlZCgpKSB7DQotICAgICAgICBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJVcGRhdGUgPSBGQUxTRTsNCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldFVJVHlwZSgpID09IFhGQV9FTEVNRU5UX1RleHRFZGl0ICYmIG1fcERhdGFBY2MtPkdldE51bWJlck9mQ2VsbHMoKSA8IDApIHsNCi0gICAgICAgIFhGQV9FTEVNRU5UIGVsZW1lbnRUeXBlID0gWEZBX0VMRU1FTlRfVU5LTk9XTjsNCi0gICAgICAgIGludDMyX3QgaU1heENoYXJzID0gbV9wRGF0YUFjYy0+R2V0TWF4Q2hhcnMoZWxlbWVudFR5cGUpOw0KLSAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KLSAgICAgICAgICAgIGlNYXhDaGFycyA9IGVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCA/IGlNYXhDaGFycyA6IDA7DQotICAgICAgICB9DQotICAgICAgICBpZiAoKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldExpbWl0KCkgIT0gaU1heENoYXJzKSB7DQotICAgICAgICAgICAgKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPlNldExpbWl0KGlNYXhDaGFycyk7DQotICAgICAgICAgICAgYlVwZGF0ZSA9IFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIGVUeXBlKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NPbGRUZXh0Ow0KLSAgICAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0VGV4dCh3c09sZFRleHQpOw0KLSAgICBpZiAod3NUZXh0ICE9IHdzT2xkVGV4dCB8fCAoZVR5cGUgPT0gWEZBX1ZBTFVFUElDVFVSRV9FZGl0ICYmIGJVcGRhdGUpKSB7DQotICAgICAgICAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0VGV4dCh3c1RleHQpOw0KLSAgICAgICAgYlVwZGF0ZSA9IFRSVUU7DQotICAgIH0NCi0gICAgaWYgKGJVcGRhdGUpIHsNCi0gICAgICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQotICAgIH0NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6Q29tbWl0RGF0YSgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5HZXRUZXh0KHdzVGV4dCk7DQorICBpZiAobV9wRGF0YUFjYy0+U2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpKSB7DQorICAgIG1fcERhdGFBY2MtPlVwZGF0ZVVJRGlzcGxheSh0aGlzKTsNCiAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBWYWxpZGF0ZU51bWJlckZpZWxkKHdzVGV4dCk7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDYW5VbmRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+Q2FuVW5kbygpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6Q2FuUmVkbygpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkNhblJlZG8oKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OlVuZG8oKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5VbmRvKCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpSZWRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+UmVkbygpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6Q2FuQ29weSgpDQotew0KLSAgICBpbnQzMl90IG5Db3VudCA9ICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5Db3VudFNlbFJhbmdlcygpOw0KLSAgICByZXR1cm4gbkNvdW50ID4gMDsNCi19DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkNhbkN1dCgpDQotew0KLSAgICBpZiAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK3ZvaWQgQ1hGQV9GRlRleHRFZGl0OjpWYWxpZGF0ZU51bWJlckZpZWxkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gdGhpcy0+R2V0RGF0YUFjYygpOw0KKyAgaWYgKHBBY2MgJiYgcEFjYy0+R2V0VUlUeXBlKCkgPT0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQpIHsNCisgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gR2V0QXBwKCktPkdldEFwcFByb3ZpZGVyKCk7DQorICAgIGlmIChwQXBwUHJvdmlkZXIpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX0FwcE5hbWUsIHdzVGl0bGUpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0Vycm9yOw0KKyAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX1ZhbGlkYXRlTnVtYmVyRXJyb3IsIHdzRXJyb3IpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzU29tRmllbGQ7DQorICAgICAgcEFjYy0+R2V0Tm9kZSgpLT5HZXRTT01FeHByZXNzaW9uKHdzU29tRmllbGQpOw0KKyAgICAgIHdzTWVzc2FnZS5Gb3JtYXQod3NFcnJvciwgKGNvbnN0IEZYX1dDSEFSKil3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgRlhfV0NIQVIqKXdzU29tRmllbGQpOw0KKyAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzTWVzc2FnZSwgd3NUaXRsZSwgWEZBX01CSUNPTl9FcnJvciwgWEZBX01CX09LKTsNCiAgICAgfQ0KLSAgICBpbnQzMl90IG5Db3VudCA9ICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5Db3VudFNlbFJhbmdlcygpOw0KLSAgICByZXR1cm4gbkNvdW50ID4gMDsNCisgIH0NCiB9DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkNhblBhc3RlKCkNCi17DQotICAgIHJldHVybiBtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuOw0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpJc0RhdGFDaGFuZ2VkKCkgew0KKyAgcmV0dXJuIChtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19UZXh0RWRpdFZhbHVlQ2hhbmdlZCkgIT0gMDsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkNhblNlbGVjdEFsbCgpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldFRleHRMZW5ndGgoKSA+IDA7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkNvcHkod3NDb3B5KTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpDQotew0KLSAgICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkN1dCh3c0N1dCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQYXN0ZSkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+UGFzdGUod3NQYXN0ZSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpTZWxlY3RBbGwoKQ0KLXsNCi0gICAgaW50MzJfdCBuQ291bnQgPSAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0VGV4dExlbmd0aCgpOw0KLSAgICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkFkZFNlbFJhbmdlKDAsIG5Db3VudCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpEZWxldGUoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5EZWxldGUoKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkRlU2VsZWN0KCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+Q2xlYXJTZWxlY3Rpb25zKCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KQ0KLXsNCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldFVJVHlwZSgpICE9IFhGQV9FTEVNRU5UX1RleHRFZGl0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorRlhfRFdPUkQgQ1hGQV9GRlRleHRFZGl0OjpHZXRBbGlnbm1lbnQoKSB7DQorICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KKyAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQorICAgIGludDMyX3QgaUhvcnogPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KKyAgICBzd2l0Y2ggKGlIb3J6KSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9IQ2VudGVyOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5Og0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfSnVzdGlmaWVkOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SYWRpeDoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9IRmFyOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0hOZWFyOw0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgRldMVG9DbGllbnQocG9pbnRmLngsIHBvaW50Zi55KTsNCi0gICAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5HZXRTdWdnZXN0V29yZHMocG9pbnRmLCBzU3VnZ2VzdCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKQ0KLXsNCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldFVJVHlwZSgpICE9IFhGQV9FTEVNRU5UX1RleHRFZGl0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIGludDMyX3QgaVZlcnQgPSBwYXJhLkdldFZlcnRpY2FsQWxpZ24oKTsNCisgICAgc3dpdGNoIChpVmVydCkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlOg0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfVkNlbnRlcjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOg0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfVkZhcjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9WTmVhcjsNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIEZXTFRvQ2xpZW50KHBvaW50Zi54LCBwb2ludGYueSk7DQotICAgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKHBvaW50ZiwgYnNSZXBsYWNlKTsNCisgIH0NCisgIHJldHVybiBkd0V4dGVuZGVkU3R5bGU7DQogfQ0KLXZvaWQgQ1hGQV9GRlRleHRFZGl0OjpPblRleHRDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NDaGFuZ2VkLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQcmV2VGV4dCkNCi17DQotICAgIG1fZHdTdGF0dXMgfD0gWEZBX1dJREdFVFNUQVRVU19UZXh0RWRpdFZhbHVlQ2hhbmdlZDsNCi0gICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCi0gICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfQ2hhbmdlOw0KLSAgICBlUGFyYW0ubV93c0NoYW5nZSA9IHdzQ2hhbmdlZDsNCi0gICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQotICAgIGVQYXJhbS5tX3dzUHJldlRleHQgPSB3c1ByZXZUZXh0Ow0KLSAgICBDRldMX0VkaXQqIHBFZGl0ID0gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCk7DQotICAgIGlmIChtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKSA9PSBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQpIHsNCi0gICAgICAgIENGV0xfRGF0ZVRpbWVQaWNrZXIqIHBEYXRlVGltZSA9IChDRldMX0RhdGVUaW1lUGlja2VyKilwRWRpdDsNCi0gICAgICAgIHBEYXRlVGltZS0+R2V0RWRpdFRleHQoZVBhcmFtLm1fd3NOZXdUZXh0KTsNCi0gICAgICAgIGludDMyX3QgaVNlbHMgPSBwRGF0ZVRpbWUtPkNvdW50U2VsUmFuZ2VzKCk7DQotICAgICAgICBpZiAoaVNlbHMgKSB7DQotICAgICAgICAgICAgZVBhcmFtLm1faVNlbEVuZCA9IHBEYXRlVGltZS0+R2V0U2VsUmFuZ2UoMCwgZVBhcmFtLm1faVNlbFN0YXJ0KTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBFZGl0LT5HZXRUZXh0KGVQYXJhbS5tX3dzTmV3VGV4dCk7DQotICAgICAgICBpbnQzMl90IGlTZWxzID0gcEVkaXQtPkNvdW50U2VsUmFuZ2VzKCk7DQotICAgICAgICBpZiAoaVNlbHMgKSB7DQotICAgICAgICAgICAgZVBhcmFtLm1faVNlbEVuZCA9IHBFZGl0LT5HZXRTZWxSYW5nZSgwLCBlUGFyYW0ubV9pU2VsU3RhcnQpOw0KLSAgICAgICAgfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpVcGRhdGVGV0xEYXRhKCkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgWEZBX1ZBTFVFUElDVFVSRSBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheTsNCisgIGlmIChJc0ZvY3VzZWQoKSkgew0KKyAgICBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDsNCisgIH0NCisgIEZYX0JPT0wgYlVwZGF0ZSA9IEZBTFNFOw0KKyAgaWYgKG1fcERhdGFBY2MtPkdldFVJVHlwZSgpID09IFhGQV9FTEVNRU5UX1RleHRFZGl0ICYmDQorICAgICAgbV9wRGF0YUFjYy0+R2V0TnVtYmVyT2ZDZWxscygpIDwgMCkgew0KKyAgICBYRkFfRUxFTUVOVCBlbGVtZW50VHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV047DQorICAgIGludDMyX3QgaU1heENoYXJzID0gbV9wRGF0YUFjYy0+R2V0TWF4Q2hhcnMoZWxlbWVudFR5cGUpOw0KKyAgICBpZiAoZWxlbWVudFR5cGUgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQorICAgICAgaU1heENoYXJzID0gZVR5cGUgPT0gWEZBX1ZBTFVFUElDVFVSRV9FZGl0ID8gaU1heENoYXJzIDogMDsNCiAgICAgfQ0KLSAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsNCi19DQotdm9pZCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uVGV4dEZ1bGwoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KLSAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9GdWxsOw0KLSAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCi0gICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0Z1bGwsICZlUGFyYW0pOw0KLX0NCi12b2lkIENYRkFfRkZUZXh0RWRpdDo6T25BZGREb1JlY29yZChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5BZGREb1JlY29yZCh0aGlzKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkNoZWNrV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkKQ0KLXsNCi0gICAgaWYgKHNXb3JkLklzRW1wdHkoKSB8fCBtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9UZXh0RWRpdCkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGlmICgoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0TGltaXQoKSAhPSBpTWF4Q2hhcnMpIHsNCisgICAgICAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0TGltaXQoaU1heENoYXJzKTsNCisgICAgICBiVXBkYXRlID0gVFJVRTsNCiAgICAgfQ0KLSAgICByZXR1cm4gR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPkNoZWNrV29yZChHZXREb2MoKSwgc1dvcmQpOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBlVHlwZSk7DQorICBDRlhfV2lkZVN0cmluZyB3c09sZFRleHQ7DQorICAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0VGV4dCh3c09sZFRleHQpOw0KKyAgaWYgKHdzVGV4dCAhPSB3c09sZFRleHQgfHwgKGVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCAmJiBiVXBkYXRlKSkgew0KKyAgICAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0VGV4dCh3c1RleHQpOw0KKyAgICBiVXBkYXRlID0gVFJVRTsNCisgIH0NCisgIGlmIChiVXBkYXRlKSB7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkdldFN1Z2dlc3RXb3Jkcyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkLCBDRlhfQnl0ZVN0cmluZ0FycmF5ICZzU3VnZ2VzdCkNCi17DQotICAgIGlmIChtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9UZXh0RWRpdCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDYW5VbmRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5DYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDYW5SZWRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5DYW5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpVbmRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpSZWRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDYW5Db3B5KCkgew0KKyAgaW50MzJfdCBuQ291bnQgPSAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+Q291bnRTZWxSYW5nZXMoKTsNCisgIHJldHVybiBuQ291bnQgPiAwOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6Q2FuQ3V0KCkgew0KKyAgaWYgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBuQ291bnQgPSAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+Q291bnRTZWxSYW5nZXMoKTsNCisgIHJldHVybiBuQ291bnQgPiAwOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6Q2FuUGFzdGUoKSB7DQorICByZXR1cm4gbV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbjsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkNhblNlbGVjdEFsbCgpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0VGV4dExlbmd0aCgpID4gMDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5Db3B5KHdzQ29weSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KSB7DQorICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkN1dCh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5QYXN0ZSh3c1Bhc3RlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OlNlbGVjdEFsbCgpIHsNCisgIGludDMyX3QgbkNvdW50ID0gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldFRleHRMZW5ndGgoKTsNCisgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+QWRkU2VsUmFuZ2UoMCwgbkNvdW50KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkRlbGV0ZSgpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+RGVsZXRlKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpEZVNlbGVjdCgpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+Q2xlYXJTZWxlY3Rpb25zKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCkgew0KKyAgaWYgKG1fcERhdGFBY2MtPkdldFVJVHlwZSgpICE9IFhGQV9FTEVNRU5UX1RleHRFZGl0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZXTFRvQ2xpZW50KHBvaW50Zi54LCBwb2ludGYueSk7DQorICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldFN1Z2dlc3RXb3Jkcyhwb2ludGYsIHNTdWdnZXN0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OlJlcGxhY2VTcGVsbENoZWNrV29yZCgNCisgICAgQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKSB7DQorICBpZiAobV9wRGF0YUFjYy0+R2V0VUlUeXBlKCkgIT0gWEZBX0VMRU1FTlRfVGV4dEVkaXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRldMVG9DbGllbnQocG9pbnRmLngsIHBvaW50Zi55KTsNCisgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KQ0KKyAgICAgIC0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKHBvaW50ZiwgYnNSZXBsYWNlKTsNCit9DQordm9pZCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uVGV4dENoYW5nZWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2hhbmdlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQcmV2VGV4dCkgew0KKyAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX1RleHRFZGl0VmFsdWVDaGFuZ2VkOw0KKyAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsNCisgIGVQYXJhbS5tX3dzQ2hhbmdlID0gd3NDaGFuZ2VkOw0KKyAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICBlUGFyYW0ubV93c1ByZXZUZXh0ID0gd3NQcmV2VGV4dDsNCisgIENGV0xfRWRpdCogcEVkaXQgPSAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KTsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKSA9PSBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQpIHsNCisgICAgQ0ZXTF9EYXRlVGltZVBpY2tlciogcERhdGVUaW1lID0gKENGV0xfRGF0ZVRpbWVQaWNrZXIqKXBFZGl0Ow0KKyAgICBwRGF0ZVRpbWUtPkdldEVkaXRUZXh0KGVQYXJhbS5tX3dzTmV3VGV4dCk7DQorICAgIGludDMyX3QgaVNlbHMgPSBwRGF0ZVRpbWUtPkNvdW50U2VsUmFuZ2VzKCk7DQorICAgIGlmIChpU2Vscykgew0KKyAgICAgIGVQYXJhbS5tX2lTZWxFbmQgPSBwRGF0ZVRpbWUtPkdldFNlbFJhbmdlKDAsIGVQYXJhbS5tX2lTZWxTdGFydCk7DQogICAgIH0NCi0gICAgcmV0dXJuIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5HZXRTdWdnZXN0V29yZHMoR2V0RG9jKCksIHNXb3JkLCBzU3VnZ2VzdCk7DQotfQ0KLWludDMyX3QgQ1hGQV9GRlRleHRFZGl0OjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSAqcE1lc3NhZ2UpDQotew0KLSAgICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KLX0NCi1GV0xfRVJSIENYRkFfRkZUZXh0RWRpdDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KQ0KLXsNCi0gICAgQ1hGQV9GRkZpZWxkOjpPblByb2Nlc3NFdmVudChwRXZlbnQpOw0KLSAgICBGWF9EV09SRCBkd0V2ZW50SUQgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCi0gICAgc3dpdGNoIChkd0V2ZW50SUQpIHsNCi0gICAgICAgIGNhc2UgRldMX0VWVEhBU0hfRURUX1RleHRDaGFuZ2VkOiB7DQotICAgICAgICAgICAgICAgIENGV0xfRXZ0RWR0VGV4dENoYW5nZWQgKmV2ZW50ID0gKENGV0xfRXZ0RWR0VGV4dENoYW5nZWQqKXBFdmVudDsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGFuZ2U7DQotICAgICAgICAgICAgICAgIE9uVGV4dENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgd3NDaGFuZ2UsIGV2ZW50LT53c1ByZXZUZXh0KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9FRFRfQWRkRG9SZWNvcmQ6IHsNCi0gICAgICAgICAgICAgICAgT25BZGREb1JlY29yZChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9FRFRfVGV4dEZ1bGw6IHsNCi0gICAgICAgICAgICAgICAgT25UZXh0RnVsbChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGV0xfRVZUSEFTSF9FRFRfQ2hlY2tXb3JkOiB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzdHIoTCJGV0xfRVZFTlRfRFRQX1NlbGVjdENoYW5nZWQiKTsNCi0gICAgICAgICAgICAgICAgRlhfRFdPUkQgaGFzaGNvZGUgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c3RyLCB3c3RyLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9FdnRFZHRDaGVja1dvcmQgKmV2ZW50ID0gKENGV0xfRXZ0RWR0Q2hlY2tXb3JkKilwRXZlbnQ7DQotICAgICAgICAgICAgICAgIGV2ZW50LT5iQ2hlY2tXb3JkID0gQ2hlY2tXb3JkKGV2ZW50LT5ic1dvcmQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZXTF9FVlRIQVNIX0VEVF9HZXRTdWdnZXN0V29yZHM6IHsNCi0gICAgICAgICAgICAgICAgQ0ZXTF9FdnRFZHRHZXRTdWdnZXN0V29yZHMgKmV2ZW50ID0gKENGV0xfRXZ0RWR0R2V0U3VnZ2VzdFdvcmRzKilwRXZlbnQ7DQotICAgICAgICAgICAgICAgIGV2ZW50LT5iU3VnZ2VzdFdvcmRzID0gR2V0U3VnZ2VzdFdvcmRzKGV2ZW50LT5ic1dvcmQsIGV2ZW50LT5ic0FycmF5U3VnZ2VzdFdvcmRzKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHBFZGl0LT5HZXRUZXh0KGVQYXJhbS5tX3dzTmV3VGV4dCk7DQorICAgIGludDMyX3QgaVNlbHMgPSBwRWRpdC0+Q291bnRTZWxSYW5nZXMoKTsNCisgICAgaWYgKGlTZWxzKSB7DQorICAgICAgZVBhcmFtLm1faVNlbEVuZCA9IHBFZGl0LT5HZXRTZWxSYW5nZSgwLCBlUGFyYW0ubV9pU2VsU3RhcnQpOw0KICAgICB9DQotICAgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgIH0NCisgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9DaGFuZ2UsICZlUGFyYW0pOw0KIH0NCi1GV0xfRVJSIENYRkFfRkZUZXh0RWRpdDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyAqcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4ICpwTWF0cml4ICkNCi17DQotICAgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQordm9pZCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uVGV4dEZ1bGwoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9GdWxsOw0KKyAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fRnVsbCwgJmVQYXJhbSk7DQogfQ0KLUNYRkFfRkZOdW1lcmljRWRpdDo6Q1hGQV9GRk51bWVyaWNFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQotICAgIDogQ1hGQV9GRlRleHRFZGl0KHBQYWdlVmlldywgcERhdGFBY2MpDQotew0KK3ZvaWQgQ1hGQV9GRlRleHRFZGl0OjpPbkFkZERvUmVjb3JkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+QWRkRG9SZWNvcmQodGhpcyk7DQogfQ0KLUNYRkFfRkZOdW1lcmljRWRpdDo6fkNYRkFfRkZOdW1lcmljRWRpdCgpDQotew0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDaGVja1dvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzV29yZCkgew0KKyAgaWYgKHNXb3JkLklzRW1wdHkoKSB8fCBtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9UZXh0RWRpdCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+Q2hlY2tXb3JkKEdldERvYygpLCBzV29yZCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRk51bWVyaWNFZGl0OjpMb2FkV2lkZ2V0KCkNCi17DQotICAgIENGV0xfRWRpdCogcFdpZGdldCA9IENGV0xfRWRpdDo6Q3JlYXRlKCk7DQotICAgIHBXaWRnZXQtPkluaXRpYWxpemUoKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwV2lkZ2V0Ow0KLSAgICBJRldMX1dpZGdldCogcElXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBJV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCi0gICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwSVdpZGdldCwgcElXaWRnZXQpOw0KLSAgICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCi0gICAgcFdpZGdldC0+U2V0VGV4dCh3c1RleHQpOw0KLSAgICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOw0KLSAgICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkdldFN1Z2dlc3RXb3Jkcyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpIHsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9UZXh0RWRpdCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPkdldFN1Z2dlc3RXb3JkcyhHZXREb2MoKSwgc1dvcmQsIHNTdWdnZXN0KTsNCiB9DQotdm9pZCBDWEZBX0ZGTnVtZXJpY0VkaXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkNCi17DQotICAgIENGV0xfRWRpdCogcFdpZGdldCA9IChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldDsNCi0gICAgaWYgKCFwV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm47DQoraW50MzJfdCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorRldMX0VSUiBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgew0KKyAgQ1hGQV9GRkZpZWxkOjpPblByb2Nlc3NFdmVudChwRXZlbnQpOw0KKyAgRlhfRFdPUkQgZHdFdmVudElEID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQorICBzd2l0Y2ggKGR3RXZlbnRJRCkgew0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX0VEVF9UZXh0Q2hhbmdlZDogew0KKyAgICAgIENGV0xfRXZ0RWR0VGV4dENoYW5nZWQqIGV2ZW50ID0gKENGV0xfRXZ0RWR0VGV4dENoYW5nZWQqKXBFdmVudDsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYW5nZTsNCisgICAgICBPblRleHRDaGFuZ2VkKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksIHdzQ2hhbmdlLCBldmVudC0+d3NQcmV2VGV4dCk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMgfA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfRURUX091dGVyU2Nyb2xsYmFyIHwgRldMX1NUWUxFRVhUX0VEVF9WYWxpZGF0ZSB8IEZXTF9TVFlMRUVYVF9FRFRfTnVtYmVyIHwgRldMX1NUWUxFRVhUX0VEVF9MYXN0TGluZUhlaWdodDsNCi0gICAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsNCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PZmYpIHsNCi0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsOw0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX0VEVF9BZGREb1JlY29yZDogew0KKyAgICAgIE9uQWRkRG9SZWNvcmQobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSk7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaW50MzJfdCBpTnVtQ2VsbHMgPSBtX3BEYXRhQWNjLT5HZXROdW1iZXJPZkNlbGxzKCk7DQotICAgIGlmIChpTnVtQ2VsbHMgPiAwKSB7DQotICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dDsNCi0gICAgICAgIHBXaWRnZXQtPlNldExpbWl0KGlOdW1DZWxscyk7DQorICAgIGNhc2UgRldMX0VWVEhBU0hfRURUX1RleHRGdWxsOiB7DQorICAgICAgT25UZXh0RnVsbChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpKTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBkd0V4dGVuZGVkU3R5bGUgfD0gR2V0QWxpZ25tZW50KCk7DQotICAgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuIHx8ICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KLSAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7DQorICAgIGNhc2UgRldMX0VWVEhBU0hfRURUX0NoZWNrV29yZDogew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzdHIoTCJGV0xfRVZFTlRfRFRQX1NlbGVjdENoYW5nZWQiKTsNCisgICAgICBGWF9EV09SRCBoYXNoY29kZSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzdHIsIHdzdHIuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIENGV0xfRXZ0RWR0Q2hlY2tXb3JkKiBldmVudCA9IChDRldMX0V2dEVkdENoZWNrV29yZCopcEV2ZW50Ow0KKyAgICAgIGV2ZW50LT5iQ2hlY2tXb3JkID0gQ2hlY2tXb3JkKGV2ZW50LT5ic1dvcmQpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsNCisgICAgY2FzZSBGV0xfRVZUSEFTSF9FRFRfR2V0U3VnZ2VzdFdvcmRzOiB7DQorICAgICAgQ0ZXTF9FdnRFZHRHZXRTdWdnZXN0V29yZHMqIGV2ZW50ID0gKENGV0xfRXZ0RWR0R2V0U3VnZ2VzdFdvcmRzKilwRXZlbnQ7DQorICAgICAgZXZlbnQtPmJTdWdnZXN0V29yZHMgPQ0KKyAgICAgICAgICBHZXRTdWdnZXN0V29yZHMoZXZlbnQtPmJzV29yZCwgZXZlbnQtPmJzQXJyYXlTdWdnZXN0V29yZHMpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQogfQ0KLUZXTF9FUlIgQ1hGQV9GRk51bWVyaWNFZGl0OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQotew0KLSAgICBGWF9EV09SRCBkd0V2ZW50SUQgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCi0gICAgaWYgKGR3RXZlbnRJRCA9PSBGV0xfRVZUSEFTSF9FRFRfVmFsaWRhdGUpIHsNCi0gICAgICAgIENGV0xfRXZ0RWR0VmFsaWRhdGUgKmV2ZW50ID0gKENGV0xfRXZ0RWR0VmFsaWRhdGUqKXBFdmVudDsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hhbmdlID0gZXZlbnQtPndzSW5zZXJ0Ow0KLSAgICAgICAgZXZlbnQtPmJWYWxpZGF0ZSA9IE9uVmFsaWRhdGUobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgd3NDaGFuZ2UpOw0KLSAgICAgICAgcmV0dXJuIGV2ZW50LT5iVmFsaWRhdGU7DQotICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gQ1hGQV9GRlRleHRFZGl0OjpPblByb2Nlc3NFdmVudChwRXZlbnQpOw0KLSAgICB9DQorRldMX0VSUiBDWEZBX0ZGVGV4dEVkaXQ6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRk51bWVyaWNFZGl0OjpPblZhbGlkYXRlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXR0ZXJuOw0KLSAgICBtX3BEYXRhQWNjLT5HZXRQaWN0dXJlQ29udGVudCh3c1BhdHRlcm4sIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7DQotICAgIGlmICghd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgaW50MzJfdCBpTGVhZHMgPSAwOw0KLSAgICBtX3BEYXRhQWNjLT5HZXRMZWFkRGlnaXRzKGlMZWFkcyk7DQotICAgIGludDMyX3QgaUZyYWNzID0gMDsNCi0gICAgbV9wRGF0YUFjYy0+R2V0RnJhY0RpZ2l0cyhpRnJhY3MpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCi0gICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZShtX3BEYXRhQWNjKTsNCi0gICAgd2lkZ2V0VmFsdWUuR2V0TnVtYmVyaWNGb3JtYXQod3NGb3JtYXQsIGlMZWFkcywgaUZyYWNzKTsNCi0gICAgcmV0dXJuIHdpZGdldFZhbHVlLlZhbGlkYXRlTnVtZXJpY1RlbXAod3NUZXh0LCB3c0Zvcm1hdCwgbV9wRGF0YUFjYy0+R2V0TG9jYWwoKSk7DQorQ1hGQV9GRk51bWVyaWNFZGl0OjpDWEZBX0ZGTnVtZXJpY0VkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZUZXh0RWRpdChwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZOdW1lcmljRWRpdDo6fkNYRkFfRkZOdW1lcmljRWRpdCgpIHt9DQorRlhfQk9PTCBDWEZBX0ZGTnVtZXJpY0VkaXQ6OkxvYWRXaWRnZXQoKSB7DQorICBDRldMX0VkaXQqIHBXaWRnZXQgPSBDRldMX0VkaXQ6OkNyZWF0ZSgpOw0KKyAgcFdpZGdldC0+SW5pdGlhbGl6ZSgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwV2lkZ2V0Ow0KKyAgSUZXTF9XaWRnZXQqIHBJV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocElXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocElXaWRnZXQsIHBJV2lkZ2V0KTsNCisgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgcFdpZGdldC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQogfQ0KLUNYRkFfRkZQYXNzd29yZEVkaXQ6OkNYRkFfRkZQYXNzd29yZEVkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCi0gICAgOiBDWEZBX0ZGVGV4dEVkaXQocFBhZ2VWaWV3LCBwRGF0YUFjYykNCi17DQordm9pZCBDWEZBX0ZGTnVtZXJpY0VkaXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkgew0KKyAgQ0ZXTF9FZGl0KiBwV2lkZ2V0ID0gKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgaWYgKCFwV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0RXT1JEIGR3RXh0ZW5kZWRTdHlsZSA9DQorICAgICAgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMgfCBGV0xfU1RZTEVFWFRfRURUX091dGVyU2Nyb2xsYmFyIHwNCisgICAgICBGV0xfU1RZTEVFWFRfRURUX1ZhbGlkYXRlIHwgRldMX1NUWUxFRVhUX0VEVF9OdW1iZXIgfA0KKyAgICAgIEZXTF9TVFlMRUVYVF9FRFRfTGFzdExpbmVIZWlnaHQ7DQorICBkd0V4dGVuZGVkU3R5bGUgfD0gVXBkYXRlVUlQcm9wZXJ0eSgpOw0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PZmYpIHsNCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7DQorICB9DQorICBpbnQzMl90IGlOdW1DZWxscyA9IG1fcERhdGFBY2MtPkdldE51bWJlck9mQ2VsbHMoKTsNCisgIGlmIChpTnVtQ2VsbHMgPiAwKSB7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0Ow0KKyAgICBwV2lkZ2V0LT5TZXRMaW1pdChpTnVtQ2VsbHMpOw0KKyAgfQ0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOw0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwNCisgICAgICAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7DQorICB9DQorICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7DQogfQ0KLUNYRkFfRkZQYXNzd29yZEVkaXQ6On5DWEZBX0ZGUGFzc3dvcmRFZGl0KCkNCi17DQorRldMX0VSUiBDWEZBX0ZGTnVtZXJpY0VkaXQ6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgew0KKyAgRlhfRFdPUkQgZHdFdmVudElEID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQorICBpZiAoZHdFdmVudElEID09IEZXTF9FVlRIQVNIX0VEVF9WYWxpZGF0ZSkgew0KKyAgICBDRldMX0V2dEVkdFZhbGlkYXRlKiBldmVudCA9IChDRldMX0V2dEVkdFZhbGlkYXRlKilwRXZlbnQ7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hhbmdlID0gZXZlbnQtPndzSW5zZXJ0Ow0KKyAgICBldmVudC0+YlZhbGlkYXRlID0gT25WYWxpZGF0ZShtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLCB3c0NoYW5nZSk7DQorICAgIHJldHVybiBldmVudC0+YlZhbGlkYXRlOw0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIENYRkFfRkZUZXh0RWRpdDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgIH0NCiB9DQotRlhfQk9PTCBDWEZBX0ZGUGFzc3dvcmRFZGl0OjpMb2FkV2lkZ2V0KCkNCi17DQotICAgIENGV0xfRWRpdCogcFdpZGdldCA9IENGV0xfRWRpdDo6Q3JlYXRlKCk7DQotICAgIHBXaWRnZXQtPkluaXRpYWxpemUoKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwV2lkZ2V0Ow0KLSAgICBJRldMX1dpZGdldCogcElXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBJV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCi0gICAgSUZXTF9Ob3RlRHJpdmVyICpwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KLSAgICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwSVdpZGdldCwgcElXaWRnZXQpOw0KLSAgICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCi0gICAgcFdpZGdldC0+U2V0VGV4dCh3c1RleHQpOw0KLSAgICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOw0KLSAgICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQorRlhfQk9PTCBDWEZBX0ZGTnVtZXJpY0VkaXQ6Ok9uVmFsaWRhdGUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXR0ZXJuOw0KKyAgbV9wRGF0YUFjYy0+R2V0UGljdHVyZUNvbnRlbnQod3NQYXR0ZXJuLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOw0KKyAgaWYgKCF3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVhZHMgPSAwOw0KKyAgbV9wRGF0YUFjYy0+R2V0TGVhZERpZ2l0cyhpTGVhZHMpOw0KKyAgaW50MzJfdCBpRnJhY3MgPSAwOw0KKyAgbV9wRGF0YUFjYy0+R2V0RnJhY0RpZ2l0cyhpRnJhY3MpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQorICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKG1fcERhdGFBY2MpOw0KKyAgd2lkZ2V0VmFsdWUuR2V0TnVtYmVyaWNGb3JtYXQod3NGb3JtYXQsIGlMZWFkcywgaUZyYWNzKTsNCisgIHJldHVybiB3aWRnZXRWYWx1ZS5WYWxpZGF0ZU51bWVyaWNUZW1wKHdzVGV4dCwgd3NGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEYXRhQWNjLT5HZXRMb2NhbCgpKTsNCiB9DQotdm9pZCBDWEZBX0ZGUGFzc3dvcmRFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpDQotew0KLSAgICBDRldMX0VkaXQqIHBXaWRnZXQgPSAoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQ7DQotICAgIGlmICghcFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3RXh0ZW5kZWRTdHlsZSA9IEZXTF9TVFlMRUVYVF9FRFRfU2hvd1Njcm9sbGJhckZvY3VzIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciB8IEZXTF9TVFlMRUVYVF9FRFRfUGFzc3dvcmQgfCBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0Ow0KLSAgICBkd0V4dGVuZGVkU3R5bGUgfD0gVXBkYXRlVUlQcm9wZXJ0eSgpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1Bhc3NXb3JkOw0KLSAgICBtX3BEYXRhQWNjLT5HZXRQYXNzd29yZENoYXIod3NQYXNzV29yZCk7DQotICAgIGlmICghd3NQYXNzV29yZC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHBXaWRnZXQtPlNldEFsaWFzQ2hhcih3c1Bhc3NXb3JkLkdldEF0KDApKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wRGF0YUFjYy0+R2V0SG9yaXpvbnRhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgew0KLSAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7DQotICAgIH0NCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQotICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsNCi0gICAgfQ0KLSAgICBkd0V4dGVuZGVkU3R5bGUgfD0gR2V0QWxpZ25tZW50KCk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsNCitDWEZBX0ZGUGFzc3dvcmRFZGl0OjpDWEZBX0ZGUGFzc3dvcmRFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZUZXh0RWRpdChwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZQYXNzd29yZEVkaXQ6On5DWEZBX0ZGUGFzc3dvcmRFZGl0KCkge30NCitGWF9CT09MIENYRkFfRkZQYXNzd29yZEVkaXQ6OkxvYWRXaWRnZXQoKSB7DQorICBDRldMX0VkaXQqIHBXaWRnZXQgPSBDRldMX0VkaXQ6OkNyZWF0ZSgpOw0KKyAgcFdpZGdldC0+SW5pdGlhbGl6ZSgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwV2lkZ2V0Ow0KKyAgSUZXTF9XaWRnZXQqIHBJV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocElXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocElXaWRnZXQsIHBJV2lkZ2V0KTsNCisgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgcFdpZGdldC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQogfQ0KLUNYRkFfRkZEYXRlVGltZUVkaXQ6OkNYRkFfRkZEYXRlVGltZUVkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCi0gICAgOiBDWEZBX0ZGVGV4dEVkaXQocFBhZ2VWaWV3LCBwRGF0YUFjYykNCi17DQordm9pZCBDWEZBX0ZGUGFzc3dvcmRFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsNCisgIENGV0xfRWRpdCogcFdpZGdldCA9IChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldDsNCisgIGlmICghcFdpZGdldCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPQ0KKyAgICAgIEZXTF9TVFlMRUVYVF9FRFRfU2hvd1Njcm9sbGJhckZvY3VzIHwgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciB8DQorICAgICAgRldMX1NUWUxFRVhUX0VEVF9QYXNzd29yZCB8IEZXTF9TVFlMRUVYVF9FRFRfTGFzdExpbmVIZWlnaHQ7DQorICBkd0V4dGVuZGVkU3R5bGUgfD0gVXBkYXRlVUlQcm9wZXJ0eSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXNzV29yZDsNCisgIG1fcERhdGFBY2MtPkdldFBhc3N3b3JkQ2hhcih3c1Bhc3NXb3JkKTsNCisgIGlmICghd3NQYXNzV29yZC5Jc0VtcHR5KCkpIHsNCisgICAgcFdpZGdldC0+U2V0QWxpYXNDaGFyKHdzUGFzc1dvcmQuR2V0QXQoMCkpOw0KKyAgfQ0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PZmYpIHsNCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7DQorICB9DQorICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbiB8fA0KKyAgICAgICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsNCisgIH0NCisgIGR3RXh0ZW5kZWRTdHlsZSB8PSBHZXRBbGlnbm1lbnQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsNCiB9DQotQ1hGQV9GRkRhdGVUaW1lRWRpdDo6fkNYRkFfRkZEYXRlVGltZUVkaXQoKQ0KLXsNCi19DQotRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpHZXRCQm94KENGWF9SZWN0RiAmcnRCb3gsIEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9CT09MIGJEcmF3Rm9jdXMpDQotew0KLSAgICBpZiAoYkRyYXdGb2N1cykgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQorQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q1hGQV9GRkRhdGVUaW1lRWRpdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGVGV4dEVkaXQocFBhZ2VWaWV3LCBwRGF0YUFjYykge30NCitDWEZBX0ZGRGF0ZVRpbWVFZGl0Ojp+Q1hGQV9GRkRhdGVUaW1lRWRpdCgpIHt9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpHZXRCQm94KENGWF9SZWN0RiYgcnRCb3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEcmF3Rm9jdXMpIHsNCisgIGlmIChiRHJhd0ZvY3VzKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCiAjaWZuZGVmIF9YRkFfRU1CDQotICAgIHJldHVybiBDWEZBX0ZGV2lkZ2V0OjpHZXRCQm94KHJ0Qm94LCBkd1N0YXR1cyk7DQorICByZXR1cm4gQ1hGQV9GRldpZGdldDo6R2V0QkJveChydEJveCwgZHdTdGF0dXMpOw0KICNlbmRpZg0KLSAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQotICAgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCi0gICAgICAgIENGWF9SZWN0RiBydFdpZGdldDsNCi0gICAgICAgICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0QkJveChydFdpZGdldCk7DQotICAgICAgICBydEJveC5VbmlvbihydFdpZGdldCk7DQotICAgIH0NCi0gICAgQ0ZYX01hdHJpeCBtdDsNCi0gICAgR2V0Um90YXRlTWF0cml4KG10KTsNCi0gICAgbXQuVHJhbnNmb3JtUmVjdChydEJveCk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MCUNYRkFfRkZEYXRlVGltZUVkaXQ6OlB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0Qm94KTsNCisgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCiAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KICAgICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkdldEJCb3gocnRXaWRnZXQpOw0KLSAgICBpZiAocnRXaWRnZXQuQ29udGFpbnMoZngsIGZ5KSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCisgICAgcnRCb3guVW5pb24ocnRXaWRnZXQpOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtdDsNCisgIEdldFJvdGF0ZU1hdHJpeChtdCk7DQorICBtdC5UcmFuc2Zvcm1SZWN0KHJ0Qm94KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OlB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkxvYWRXaWRnZXQoKQ0KLXsNCi0gICAgQ0ZXTF9EYXRlVGltZVBpY2tlciAqcFdpZGdldCA9IENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNyZWF0ZSgpOw0KLSAgICBwV2lkZ2V0LT5Jbml0aWFsaXplKCk7DQotICAgIG1fcE5vcm1hbFdpZGdldCA9IChDRldMX1dpZGdldCopcFdpZGdldDsNCi0gICAgSUZXTF9XaWRnZXQqIHBJV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwSVdpZGdldCwgdGhpcywgTlVMTCk7DQotICAgIElGV0xfTm90ZURyaXZlciAqcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCi0gICAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocElXaWRnZXQsIHBJV2lkZ2V0KTsNCi0gICAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOw0KLSAgICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQotICAgIHBXaWRnZXQtPlNldEVkaXRUZXh0KHdzVGV4dCk7DQotICAgIFhGQV9EQVRFVElNRVRZUEUgZVR5cGUgPSBYRkFfREFURVRJTUVUWVBFX0RhdGVBbmRUaW1lOw0KLSAgICBpZiAoQ1hGQV9WYWx1ZSB2YWx1ZSA9IG1fcERhdGFBY2MtPkdldEZvcm1WYWx1ZSgpKSB7DQotICAgICAgICBzd2l0Y2godmFsdWUuR2V0Q2hpbGRWYWx1ZUNsYXNzSUQoKSkgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZTogew0KLSAgICAgICAgICAgICAgICAgICAgZVR5cGUgPSBYRkFfREFURVRJTUVUWVBFX0RhdGU7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIXdzVGV4dC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxjVmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUobV9wRGF0YUFjYyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUgZGF0ZSA9IGxjVmFsdWUuR2V0RGF0ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoRlhfVU5JVElNRSlkYXRlICE9IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+U2V0Q3VyU2VsKGRhdGUuR2V0WWVhcigpLCBkYXRlLkdldE1vbnRoKCksIGRhdGUuR2V0RGF5KCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RpbWU6DQotICAgICAgICAgICAgICAgIGVUeXBlID0gWEZBX0RBVEVUSU1FVFlQRV9UaW1lOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBlVHlwZSA9IFhGQV9EQVRFVElNRVRZUEVfRGF0ZUFuZFRpbWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQotICAgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQotICAgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCi19DQotdm9pZCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpDQotew0KLSAgICBDRldMX0RhdGVUaW1lUGlja2VyKiBwV2lkZ2V0ID0gKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldDsNCi0gICAgaWYgKCFwV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gRldMX1NUWUxFRVhUX0RUUF9TaG9ydERhdGVGb3JtYXQ7DQotICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBVcGRhdGVVSVByb3BlcnR5KCk7DQotICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBHZXRBbGlnbm1lbnQoKTsNCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd0V4dGVuZGVkU3R5bGUsIDB4RkZGRkZGRkYpOw0KLSAgICBGWF9EV09SRCBkd0VkaXRTdHlsZXMgPSBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0Ow0KLSAgICBpbnQzMl90IGlOdW1DZWxscyA9IG1fcERhdGFBY2MtPkdldE51bWJlck9mQ2VsbHMoKTsNCi0gICAgaWYgKGlOdW1DZWxscyA+IDApIHsNCi0gICAgICAgIGR3RWRpdFN0eWxlcyB8PSBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0Ow0KLSAgICAgICAgcFdpZGdldC0+U2V0RWRpdExpbWl0KGlOdW1DZWxscyk7DQotICAgIH0NCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQotICAgICAgICBkd0VkaXRTdHlsZXMgfD0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsNCi0gICAgfQ0KLSAgICBpZiAobV9wRGF0YUFjYy0+R2V0SG9yaXpvbnRhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgew0KLSAgICAgICAgZHdFZGl0U3R5bGVzIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7DQotICAgIH0NCi0gICAgcFdpZGdldC0+TW9kaWZ5RWRpdFN0eWxlc0V4KGR3RWRpdFN0eWxlcywgMHhGRkZGRkZGRik7DQotfQ0KLUZYX0RXT1JEIENYRkFfRkZEYXRlVGltZUVkaXQ6OkdldEFsaWdubWVudCgpDQotew0KLSAgICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KLSAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBtX3BEYXRhQWNjLT5HZXRQYXJhKCkpIHsNCi0gICAgICAgIGludDMyX3QgaUhvcnogPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KLSAgICAgICAgc3dpdGNoKGlIb3J6KSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQotICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRIQ2VudGVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnk6DQotICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRKdXN0aWZpZWQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeUFsbDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SYWRpeDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCi0gICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhGYXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRITmVhcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlWZXJ0ID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7DQotICAgICAgICBzd2l0Y2goaVZlcnQpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToNCi0gICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZDZW50ZXI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOg0KLSAgICAgICAgICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0RUUF9FZGl0VkZhcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZOZWFyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gZHdFeHRlbmRlZFN0eWxlOw0KLX0NCi1GWF9CT09MCUNYRkFfRkZEYXRlVGltZUVkaXQ6OkNvbW1pdERhdGEoKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkdldEVkaXRUZXh0KHdzVGV4dCk7DQotICAgIGlmIChtX3BEYXRhQWNjLT5TZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCkpIHsNCi0gICAgICAgIG1fcERhdGFBY2MtPlVwZGF0ZVVJRGlzcGxheSh0aGlzKTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpVcGRhdGVGV0xEYXRhKCkNCi17DQotICAgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgWEZBX1ZBTFVFUElDVFVSRSBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheTsNCi0gICAgaWYgKElzRm9jdXNlZCgpKSB7DQotICAgICAgICBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgZVR5cGUpOw0KLSAgICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPlNldEVkaXRUZXh0KHdzVGV4dCk7DQotICAgIGlmIChJc0ZvY3VzZWQoKSAmJiAhd3NUZXh0LklzRW1wdHkoKSkgew0KLSAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsY1ZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKG1fcERhdGFBY2MpOw0KLSAgICAgICAgQ0ZYX1VuaXRpbWUgZGF0ZSA9IGxjVmFsdWUuR2V0RGF0ZSgpOw0KLSAgICAgICAgaWYgKGxjVmFsdWUuSXNWYWxpZCgpKSB7DQotICAgICAgICAgICAgaWYgKChGWF9VTklUSU1FKWRhdGUgIT0gMCkgew0KLSAgICAgICAgICAgICAgICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPlNldEN1clNlbChkYXRlLkdldFllYXIoKSwgZGF0ZS5HZXRNb250aCgpLCBkYXRlLkdldERheSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIH0NCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0QkJveChydFdpZGdldCk7DQorICBpZiAocnRXaWRnZXQuQ29udGFpbnMoZngsIGZ5KSkgew0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpJc0RhdGFDaGFuZ2VkKCkNCi17DQotICAgIGlmIChtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19UZXh0RWRpdFZhbHVlQ2hhbmdlZCkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpMb2FkV2lkZ2V0KCkgew0KKyAgQ0ZXTF9EYXRlVGltZVBpY2tlciogcFdpZGdldCA9IENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNyZWF0ZSgpOw0KKyAgcFdpZGdldC0+SW5pdGlhbGl6ZSgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwV2lkZ2V0Ow0KKyAgSUZXTF9XaWRnZXQqIHBJV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocElXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocElXaWRnZXQsIHBJV2lkZ2V0KTsNCisgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgcFdpZGdldC0+U2V0RWRpdFRleHQod3NUZXh0KTsNCisgIFhGQV9EQVRFVElNRVRZUEUgZVR5cGUgPSBYRkFfREFURVRJTUVUWVBFX0RhdGVBbmRUaW1lOw0KKyAgaWYgKENYRkFfVmFsdWUgdmFsdWUgPSBtX3BEYXRhQWNjLT5HZXRGb3JtVmFsdWUoKSkgew0KKyAgICBzd2l0Y2ggKHZhbHVlLkdldENoaWxkVmFsdWVDbGFzc0lEKCkpIHsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGU6IHsNCisgICAgICAgIGVUeXBlID0gWEZBX0RBVEVUSU1FVFlQRV9EYXRlOw0KKyAgICAgICAgaWYgKCF3c1RleHQuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbGNWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZShtX3BEYXRhQWNjKTsNCisgICAgICAgICAgQ0ZYX1VuaXRpbWUgZGF0ZSA9IGxjVmFsdWUuR2V0RGF0ZSgpOw0KKyAgICAgICAgICBpZiAoKEZYX1VOSVRJTUUpZGF0ZSAhPSAwKSB7DQorICAgICAgICAgICAgcFdpZGdldC0+U2V0Q3VyU2VsKGRhdGUuR2V0WWVhcigpLCBkYXRlLkdldE1vbnRoKCksIGRhdGUuR2V0RGF5KCkpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RpbWU6DQorICAgICAgICBlVHlwZSA9IFhGQV9EQVRFVElNRVRZUEVfVGltZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBlVHlwZSA9IFhGQV9EQVRFVElNRVRZUEVfRGF0ZUFuZFRpbWU7DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0RWRpdFRleHQod3NUZXh0KTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NPbGRWYWx1ZTsNCi0gICAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NPbGRWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsNCi0gICAgcmV0dXJuIHdzT2xkVmFsdWUgIT0gd3NUZXh0Ow0KKyAgfQ0KKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q2FuVW5kbygpDQotew0KLSAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5DYW5VbmRvKCk7DQordm9pZCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXIqIHBXaWRnZXQgPSAoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgaWYgKCFwV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0RXT1JEIGR3RXh0ZW5kZWRTdHlsZSA9IEZXTF9TVFlMRUVYVF9EVFBfU2hvcnREYXRlRm9ybWF0Ow0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsNCisgIGR3RXh0ZW5kZWRTdHlsZSB8PSBHZXRBbGlnbm1lbnQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsNCisgIEZYX0RXT1JEIGR3RWRpdFN0eWxlcyA9IEZXTF9TVFlMRUVYVF9FRFRfTGFzdExpbmVIZWlnaHQ7DQorICBpbnQzMl90IGlOdW1DZWxscyA9IG1fcERhdGFBY2MtPkdldE51bWJlck9mQ2VsbHMoKTsNCisgIGlmIChpTnVtQ2VsbHMgPiAwKSB7DQorICAgIGR3RWRpdFN0eWxlcyB8PSBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0Ow0KKyAgICBwV2lkZ2V0LT5TZXRFZGl0TGltaXQoaU51bUNlbGxzKTsNCisgIH0NCisgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuIHx8DQorICAgICAgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQorICAgIGR3RWRpdFN0eWxlcyB8PSBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5Ow0KKyAgfQ0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PZmYpIHsNCisgICAgZHdFZGl0U3R5bGVzIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7DQorICB9DQorICBwV2lkZ2V0LT5Nb2RpZnlFZGl0U3R5bGVzRXgoZHdFZGl0U3R5bGVzLCAweEZGRkZGRkZGKTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpDYW5SZWRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkNhblJlZG8oKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpVbmRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPlVuZG8oKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpSZWRvKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPlJlZG8oKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpDYW5Db3B5KCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkNhbkNvcHkoKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpDYW5DdXQoKQ0KLXsNCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCitGWF9EV09SRCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpHZXRBbGlnbm1lbnQoKSB7DQorICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KKyAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQorICAgIGludDMyX3QgaUhvcnogPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KKyAgICBzd2l0Y2ggKGlIb3J6KSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0RUUF9FZGl0SENlbnRlcjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeToNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRKdXN0aWZpZWQ7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnlBbGw6DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JhZGl4Og0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRIRmFyOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRITmVhcjsNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkNhbkN1dCgpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkNhblBhc3RlKCkNCi17DQotICAgIHJldHVybiBtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuOw0KLX0NCi1GWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkNhblNlbGVjdEFsbCgpDQotew0KLSAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5DYW5TZWxlY3RBbGwoKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpDQotew0KLSAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5Db3B5KHdzQ29weSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkN1dCh3c0N1dCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpDQotew0KLSAgICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5QYXN0ZSh3c1Bhc3RlKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpTZWxlY3RBbGwoKQ0KLXsNCi0gICAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+U2VsZWN0QWxsKCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6RGVsZXRlKCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkRlbGV0ZSgpOw0KLX0NCi1GWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkRlU2VsZWN0KCkNCi17DQotICAgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkRlU2VsZWN0KCk7DQotfQ0KLXZvaWQgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6T25TZWxlY3RDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KLSAgICBtX3BEYXRhQWNjLT5HZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7DQotICAgIENYRkFfTG9jYWxlVmFsdWUgZGF0ZShYRkFfVlRfREFURSwgdGhpcy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5HZXRMb2NhbE1ncigpKTsNCi0gICAgQ0ZYX1VuaXRpbWUgZHQ7DQotICAgIGR0LlNldChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCi0gICAgZGF0ZS5TZXREYXRlKGR0KTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlOw0KLSAgICBkYXRlLkZvcm1hdFBhdHRlcm5zKHdzRGF0ZSwgd3NQaWN0dXJlLCBtX3BEYXRhQWNjLT5HZXRMb2NhbCgpLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOw0KLSAgICBDRldMX0RhdGVUaW1lUGlja2VyKiBwRGF0ZVRpbWUgPSAoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0Ow0KLSAgICBwRGF0ZVRpbWUtPlNldEVkaXRUZXh0KHdzRGF0ZSk7DQotICAgIHBEYXRlVGltZS0+VXBkYXRlKCk7DQotICAgIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5TZXRGb2N1c1dpZGdldChHZXREb2MoKSwgTlVMTCk7DQotICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQotICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsNCi0gICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQotICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzTmV3VGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KLSAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsNCi19DQotRldMX0VSUiBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpDQotew0KLSAgICBGWF9EV09SRCBkd0V2ZW50SUQgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCi0gICAgaWYgKGR3RXZlbnRJRCA9PSBGV0xfRVZUSEFTSF9EVFBfU2VsZWN0Q2hhbmdlZCkgew0KLSAgICAgICAgQ0ZXTF9FdmVudF9EdHBTZWxlY3RDaGFuZ2VkICpldmVudCA9IChDRldMX0V2ZW50X0R0cFNlbGVjdENoYW5nZWQqKXBFdmVudDsNCi0gICAgICAgIE9uU2VsZWN0Q2hhbmdlZChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLCBldmVudC0+aVllYXIsIGV2ZW50LT5pTW9udGgsIGV2ZW50LT5pRGF5KTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIENYRkFfRkZUZXh0RWRpdDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgICAgaW50MzJfdCBpVmVydCA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KKyAgICBzd2l0Y2ggKGlWZXJ0KSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0RUUF9FZGl0VkNlbnRlcjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOg0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZGYXI7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZOZWFyOw0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCisgIH0NCisgIHJldHVybiBkd0V4dGVuZGVkU3R5bGU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q29tbWl0RGF0YSgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0RWRpdFRleHQod3NUZXh0KTsNCisgIGlmIChtX3BEYXRhQWNjLT5TZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCkpIHsNCisgICAgbV9wRGF0YUFjYy0+VXBkYXRlVUlEaXNwbGF5KHRoaXMpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpVcGRhdGVGV0xEYXRhKCkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgWEZBX1ZBTFVFUElDVFVSRSBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheTsNCisgIGlmIChJc0ZvY3VzZWQoKSkgew0KKyAgICBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgZVR5cGUpOw0KKyAgKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5TZXRFZGl0VGV4dCh3c1RleHQpOw0KKyAgaWYgKElzRm9jdXNlZCgpICYmICF3c1RleHQuSXNFbXB0eSgpKSB7DQorICAgIENYRkFfTG9jYWxlVmFsdWUgbGNWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZShtX3BEYXRhQWNjKTsNCisgICAgQ0ZYX1VuaXRpbWUgZGF0ZSA9IGxjVmFsdWUuR2V0RGF0ZSgpOw0KKyAgICBpZiAobGNWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICBpZiAoKEZYX1VOSVRJTUUpZGF0ZSAhPSAwKSB7DQorICAgICAgICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCkNCisgICAgICAgICAgICAtPlNldEN1clNlbChkYXRlLkdldFllYXIoKSwgZGF0ZS5HZXRNb250aCgpLCBkYXRlLkdldERheSgpKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpJc0RhdGFDaGFuZ2VkKCkgew0KKyAgaWYgKG1fZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX1RleHRFZGl0VmFsdWVDaGFuZ2VkKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5HZXRFZGl0VGV4dCh3c1RleHQpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NPbGRWYWx1ZTsNCisgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzT2xkVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7DQorICByZXR1cm4gd3NPbGRWYWx1ZSAhPSB3c1RleHQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q2FuVW5kbygpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkNhblVuZG8oKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpDYW5SZWRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+Q2FuUmVkbygpOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OlVuZG8oKSB7DQorICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6UmVkbygpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPlJlZG8oKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpDYW5Db3B5KCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+Q2FuQ29weSgpOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkNhbkN1dCgpIHsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkNhbkN1dCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkNhblBhc3RlKCkgew0KKyAgcmV0dXJuIG1fcERhdGFBY2MtPkdldEFjY2VzcygpID09IFhGQV9BVFRSSUJVVEVFTlVNX09wZW47DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q2FuU2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+Q2FuU2VsZWN0QWxsKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KSB7DQorICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5Db3B5KHdzQ29weSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+Q3V0KHdzQ3V0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+UGFzdGUod3NQYXN0ZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6U2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+U2VsZWN0QWxsKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6RGVsZXRlKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+RGVsZXRlKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6RGVTZWxlY3QoKSB7DQorICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5EZVNlbGVjdCgpOw0KK30NCit2b2lkIENYRkFfRkZEYXRlVGltZUVkaXQ6Ok9uU2VsZWN0Q2hhbmdlZChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KKyAgbV9wRGF0YUFjYy0+R2V0UGljdHVyZUNvbnRlbnQod3NQaWN0dXJlLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOw0KKyAgQ1hGQV9Mb2NhbGVWYWx1ZSBkYXRlKFhGQV9WVF9EQVRFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0TG9jYWxNZ3IoKSk7DQorICBDRlhfVW5pdGltZSBkdDsNCisgIGR0LlNldChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgIGRhdGUuU2V0RGF0ZShkdCk7DQorICBDRlhfV2lkZVN0cmluZyB3c0RhdGU7DQorICBkYXRlLkZvcm1hdFBhdHRlcm5zKHdzRGF0ZSwgd3NQaWN0dXJlLCBtX3BEYXRhQWNjLT5HZXRMb2NhbCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOw0KKyAgQ0ZXTF9EYXRlVGltZVBpY2tlciogcERhdGVUaW1lID0gKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldDsNCisgIHBEYXRlVGltZS0+U2V0RWRpdFRleHQod3NEYXRlKTsNCisgIHBEYXRlVGltZS0+VXBkYXRlKCk7DQorICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Rm9jdXNXaWRnZXQoR2V0RG9jKCksIE5VTEwpOw0KKyAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsNCisgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgbV9wRGF0YUFjYy0+R2V0VmFsdWUoZVBhcmFtLm1fd3NOZXdUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsNCit9DQorRldMX0VSUiBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIEZYX0RXT1JEIGR3RXZlbnRJRCA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGR3RXZlbnRJRCA9PSBGV0xfRVZUSEFTSF9EVFBfU2VsZWN0Q2hhbmdlZCkgew0KKyAgICBDRldMX0V2ZW50X0R0cFNlbGVjdENoYW5nZWQqIGV2ZW50ID0gKENGV0xfRXZlbnRfRHRwU2VsZWN0Q2hhbmdlZCopcEV2ZW50Ow0KKyAgICBPblNlbGVjdENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgZXZlbnQtPmlZZWFyLCBldmVudC0+aU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmlEYXkpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHRlZGl0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5oCmluZGV4IGNkMmRhZTIuLjQ1ZmE4MTYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHRlZGl0LmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dGVkaXQuaApAQCAtNiwxMTIgKzYsMTIyIEBACiANCiAjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfVEVYVEVESVRfSU1QX0gNCiAjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfVEVYVEVESVRfSU1QX0gNCi1jbGFzcyBDWEZBX0ZGVGV4dEVkaXQgOiBwdWJsaWMgQ1hGQV9GRkZpZWxkDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GRlRleHRFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZGVGV4dEVkaXQoKTsNCi0gICAgdmlydHVhbAlGWF9CT09MIExvYWRXaWRnZXQoKTsNCi0gICAgdmlydHVhbCB2b2lkCVVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAlPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJT25TZXRGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwT2xkV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCU9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblVuZG8oKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5SZWRvKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJVW5kbygpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlZG8oKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5Db3B5KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ3V0KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuUGFzdGUoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5TZWxlY3RBbGwoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZWxlY3RBbGwoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZWxldGUoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZVNlbGVjdCgpOw0KLSAgICBGWF9CT09MCQlHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KTsNCi0gICAgRlhfQk9PTAkJUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSk7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9EV09SRAlHZXRBbGlnbm1lbnQoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCUNvbW1pdERhdGEoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCVVwZGF0ZUZXTERhdGEoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MIElzRGF0YUNoYW5nZWQoKTsNCi0gICAgdm9pZAkJCVZhbGlkYXRlTnVtYmVyRmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQotICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqCW1fcE9sZERlbGVnYXRlOw0KLXB1YmxpYzoNCi0gICAgdm9pZAlPblRleHRDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NDaGFuZ2VkLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NQcmV2VGV4dCk7DQotICAgIHZvaWQJT25UZXh0RnVsbChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZvaWQJT25BZGREb1JlY29yZChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIEZYX0JPT0wJCUNoZWNrV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkKTsNCi0gICAgRlhfQk9PTAkJR2V0U3VnZ2VzdFdvcmRzKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc1dvcmQsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KTsNCi0gICAgdmlydHVhbCBpbnQzMl90CU9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCAqcEV2ZW50KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXggKnBNYXRyaXggPSBOVUxMKTsNCitjbGFzcyBDWEZBX0ZGVGV4dEVkaXQgOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRlRleHRFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRlRleHRFZGl0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblJlZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbkNvcHkoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5DdXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5QYXN0ZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblNlbGVjdEFsbCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIENvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNlbGVjdEFsbCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIERlbGV0ZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIERlU2VsZWN0KCk7DQorICBGWF9CT09MIEdldFN1Z2dlc3RXb3JkcyhDRlhfUG9pbnRGIHBvaW50ZiwgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpOw0KKyAgRlhfQk9PTCBSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSk7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0RXT1JEIEdldEFsaWdubWVudCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIENvbW1pdERhdGEoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVcGRhdGVGV0xEYXRhKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZCgpOw0KKyAgdm9pZCBWYWxpZGF0ZU51bWJlckZpZWxkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7DQorDQorIHB1YmxpYzoNCisgIHZvaWQgT25UZXh0Q2hhbmdlZChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDaGFuZ2VkLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ByZXZUZXh0KTsNCisgIHZvaWQgT25UZXh0RnVsbChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2b2lkIE9uQWRkRG9SZWNvcmQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgRlhfQk9PTCBDaGVja1dvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzV29yZCk7DQorICBGWF9CT09MIEdldFN1Z2dlc3RXb3Jkcyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCiB9Ow0KLWNsYXNzIENYRkFfRkZOdW1lcmljRWRpdCA6IHB1YmxpYyBDWEZBX0ZGVGV4dEVkaXQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZGTnVtZXJpY0VkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQotICAgIHZpcnR1YWwgfkNYRkFfRkZOdW1lcmljRWRpdCgpOw0KLSAgICB2aXJ0dWFsCUZYX0JPT0wgTG9hZFdpZGdldCgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KLXB1YmxpYzoNCi0gICAgRlhfQk9PTAlPblZhbGlkYXRlKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCitjbGFzcyBDWEZBX0ZGTnVtZXJpY0VkaXQgOiBwdWJsaWMgQ1hGQV9GRlRleHRFZGl0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRk51bWVyaWNFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRk51bWVyaWNFZGl0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisNCisgcHVibGljOg0KKyAgRlhfQk9PTCBPblZhbGlkYXRlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCiB9Ow0KLWNsYXNzIENYRkFfRkZQYXNzd29yZEVkaXQgOiBwdWJsaWMgQ1hGQV9GRlRleHRFZGl0DQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GRlBhc3N3b3JkRWRpdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GRlBhc3N3b3JkRWRpdCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFdpZGdldCgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCi1wcm90ZWN0ZWQ6DQorY2xhc3MgQ1hGQV9GRlBhc3N3b3JkRWRpdCA6IHB1YmxpYyBDWEZBX0ZGVGV4dEVkaXQgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGUGFzc3dvcmRFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRlBhc3N3b3JkRWRpdCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQogfTsNCiBlbnVtIFhGQV9EQVRFVElNRVRZUEUgew0KLSAgICBYRkFfREFURVRJTUVUWVBFX0RhdGUgPSAwLA0KLSAgICBYRkFfREFURVRJTUVUWVBFX1RpbWUsDQotICAgIFhGQV9EQVRFVElNRVRZUEVfRGF0ZUFuZFRpbWUNCisgIFhGQV9EQVRFVElNRVRZUEVfRGF0ZSA9IDAsDQorICBYRkFfREFURVRJTUVUWVBFX1RpbWUsDQorICBYRkFfREFURVRJTUVUWVBFX0RhdGVBbmRUaW1lDQogfTsNCi1jbGFzcyBDWEZBX0ZGRGF0ZVRpbWVFZGl0IDogcHVibGljIENYRkFfRkZUZXh0RWRpdA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZEYXRlVGltZUVkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQotICAgIHZpcnR1YWwgfkNYRkFfRkZEYXRlVGltZUVkaXQoKTsNCitjbGFzcyBDWEZBX0ZGRGF0ZVRpbWVFZGl0IDogcHVibGljIENYRkFfRkZUZXh0RWRpdCB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZEYXRlVGltZUVkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGRGF0ZVRpbWVFZGl0KCk7DQogDQotICAgIHZpcnR1YWwgRlhfQk9PTAlHZXRCQm94KENGWF9SZWN0RiAmcnRCb3gsIEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9CT09MIGJEcmF3Rm9jdXMgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQotICAgIHZpcnR1YWwgdm9pZAlVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goQ0ZYX1JlY3RGJiBydEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRHJhd0ZvY3VzID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KIA0KKyAgdmlydHVhbCBGWF9CT09MIENhblVuZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5SZWRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5VbmRvKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuUmVkbygpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVVuZG8oKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlSZWRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQ29weSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbkN1dCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblBhc3RlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuU2VsZWN0QWxsKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2VsZWN0QWxsKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVTZWxlY3QoKTsNCiANCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5Db3B5KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ3V0KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuUGFzdGUoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5TZWxlY3RBbGwoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDb3B5KENGWF9XaWRlU3RyaW5nICZ3c0NvcHkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUN1dChDRlhfV2lkZVN0cmluZyAmd3NDdXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1Bhc3RlKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZWxlY3RBbGwoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZWxldGUoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEZVNlbGVjdCgpOw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9EV09SRCBHZXRBbGlnbm1lbnQoKTsNCiANCi1wcm90ZWN0ZWQ6DQotICAgIEZYX0RXT1JECQlHZXRBbGlnbm1lbnQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQdEluQWN0aXZlUmVjdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIENvbW1pdERhdGEoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVcGRhdGVGV0xEYXRhKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZCgpOw0KIA0KLSAgICB2aXJ0dWFsCUZYX0JPT0wJUHRJbkFjdGl2ZVJlY3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCUNvbW1pdERhdGEoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCVVwZGF0ZUZXTERhdGEoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MIElzRGF0YUNoYW5nZWQoKTsNCi1wdWJsaWM6DQotICAgIHZvaWQJT25TZWxlY3RDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlPblByb2Nlc3NFdmVudChDRldMX0V2ZW50ICpwRXZlbnQpOw0KKyBwdWJsaWM6DQorICB2b2lkIE9uU2VsZWN0Q2hhbmdlZChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXQuY3BwCmluZGV4IGIwY2VjMGIuLjJiNmUxZGEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldC5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0LmNwcApAQCAtMTIsMTg2NSArMTIsMTk1MiBAQAogI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KICNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KICNpbmNsdWRlICJ4ZmFfdGV4dGxheW91dC5oIg0KLUNYRkFfRkZXaWRnZXQ6OkNYRkFfRkZXaWRnZXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCi0gICAgOiBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbChwRGF0YUFjYy0+R2V0Tm9kZSgpKQ0KLSAgICAsIG1fcFBhZ2VWaWV3KHBQYWdlVmlldykNCi0gICAgLCBtX3BEYXRhQWNjKHBEYXRhQWNjKQ0KLXsNCi0gICAgbV9ydFdpZGdldC5TZXQoMCwgMCwgMCwgMCk7DQorQ1hGQV9GRldpZGdldDo6Q1hGQV9GRldpZGdldChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbChwRGF0YUFjYy0+R2V0Tm9kZSgpKSwNCisgICAgICBtX3BQYWdlVmlldyhwUGFnZVZpZXcpLA0KKyAgICAgIG1fcERhdGFBY2MocERhdGFBY2MpIHsNCisgIG1fcnRXaWRnZXQuU2V0KDAsIDAsIDAsIDApOw0KIH0NCi1DWEZBX0ZGV2lkZ2V0Ojp+Q1hGQV9GRldpZGdldCgpDQotew0KK0NYRkFfRkZXaWRnZXQ6On5DWEZBX0ZGV2lkZ2V0KCkge30NCitJWEZBX1BhZ2VWaWV3KiBDWEZBX0ZGV2lkZ2V0OjpHZXRQYWdlVmlldygpIHsNCisgIHJldHVybiBtX3BQYWdlVmlldzsNCiB9DQotSVhGQV9QYWdlVmlldyogQ1hGQV9GRldpZGdldDo6R2V0UGFnZVZpZXcoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcFBhZ2VWaWV3Ow0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6U2V0UGFnZVZpZXcoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3KSB7DQorICBtX3BQYWdlVmlldyA9IChDWEZBX0ZGUGFnZVZpZXcqKXBQYWdlVmlldzsNCiB9DQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpTZXRQYWdlVmlldyhJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcpDQotew0KLSAgICBtX3BQYWdlVmlldyA9IChDWEZBX0ZGUGFnZVZpZXcqKXBQYWdlVmlldzsNCi19DQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcnRXaWRnZXQpDQotew0KLSAgICBpZiAoKG1fZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX1JlY3RDYWNoZWQpID09IDApIHsNCi0gICAgICAgIG1fZHdTdGF0dXMgfD0gWEZBX1dJREdFVFNUQVRVU19SZWN0Q2FjaGVkOw0KLSAgICAgICAgdGhpcy0+R2V0TGF5b3V0SXRlbSgpLT5HZXRSZWN0KG1fcnRXaWRnZXQpOw0KLSAgICB9DQotICAgIHJ0V2lkZ2V0ID0gbV9ydFdpZGdldDsNCi19DQotQ0ZYX1JlY3RGIENYRkFfRkZXaWRnZXQ6OlJlQ2FjaGVXaWRnZXRSZWN0KCkNCi17DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcnRXaWRnZXQpIHsNCisgIGlmICgobV9kd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfUmVjdENhY2hlZCkgPT0gMCkgew0KICAgICBtX2R3U3RhdHVzIHw9IFhGQV9XSURHRVRTVEFUVVNfUmVjdENhY2hlZDsNCiAgICAgdGhpcy0+R2V0TGF5b3V0SXRlbSgpLT5HZXRSZWN0KG1fcnRXaWRnZXQpOw0KLSAgICByZXR1cm4gbV9ydFdpZGdldDsNCisgIH0NCisgIHJ0V2lkZ2V0ID0gbV9ydFdpZGdldDsNCiB9DQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRSZWN0V2l0aG91dFJvdGF0ZShDRlhfUmVjdEYgJnJ0V2lkZ2V0KQ0KLXsNCi0gICAgR2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQotICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IDA7DQotICAgIHN3aXRjaCAobV9wRGF0YUFjYy0+R2V0Um90YXRlKCkpIHsNCi0gICAgICAgIGNhc2UgOTA6DQotICAgICAgICAgICAgcnRXaWRnZXQudG9wID0gcnRXaWRnZXQuYm90dG9tKCk7DQotICAgICAgICAgICAgZlZhbHVlID0gcnRXaWRnZXQud2lkdGg7DQotICAgICAgICAgICAgcnRXaWRnZXQud2lkdGggPSBydFdpZGdldC5oZWlnaHQ7DQotICAgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0ID0gZlZhbHVlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAxODA6DQotICAgICAgICAgICAgcnRXaWRnZXQubGVmdCA9IHJ0V2lkZ2V0LnJpZ2h0KCk7DQotICAgICAgICAgICAgcnRXaWRnZXQudG9wID0gcnRXaWRnZXQuYm90dG9tKCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDI3MDoNCi0gICAgICAgICAgICBydFdpZGdldC5sZWZ0ID0gcnRXaWRnZXQucmlnaHQoKTsNCi0gICAgICAgICAgICBmVmFsdWUgPSBydFdpZGdldC53aWR0aDsNCi0gICAgICAgICAgICBydFdpZGdldC53aWR0aCA9IHJ0V2lkZ2V0LmhlaWdodDsNCi0gICAgICAgICAgICBydFdpZGdldC5oZWlnaHQgPSBmVmFsdWU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCitDRlhfUmVjdEYgQ1hGQV9GRldpZGdldDo6UmVDYWNoZVdpZGdldFJlY3QoKSB7DQorICBtX2R3U3RhdHVzIHw9IFhGQV9XSURHRVRTVEFUVVNfUmVjdENhY2hlZDsNCisgIHRoaXMtPkdldExheW91dEl0ZW0oKS0+R2V0UmVjdChtX3J0V2lkZ2V0KTsNCisgIHJldHVybiBtX3J0V2lkZ2V0Ow0KIH0NCi1GWF9EV09SRCBDWEZBX0ZGV2lkZ2V0OjpHZXRTdGF0dXMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fZHdTdGF0dXM7DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRSZWN0V2l0aG91dFJvdGF0ZShDRlhfUmVjdEYmIHJ0V2lkZ2V0KSB7DQorICBHZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgIEZYX0ZMT0FUIGZWYWx1ZSA9IDA7DQorICBzd2l0Y2ggKG1fcERhdGFBY2MtPkdldFJvdGF0ZSgpKSB7DQorICAgIGNhc2UgOTA6DQorICAgICAgcnRXaWRnZXQudG9wID0gcnRXaWRnZXQuYm90dG9tKCk7DQorICAgICAgZlZhbHVlID0gcnRXaWRnZXQud2lkdGg7DQorICAgICAgcnRXaWRnZXQud2lkdGggPSBydFdpZGdldC5oZWlnaHQ7DQorICAgICAgcnRXaWRnZXQuaGVpZ2h0ID0gZlZhbHVlOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE4MDoNCisgICAgICBydFdpZGdldC5sZWZ0ID0gcnRXaWRnZXQucmlnaHQoKTsNCisgICAgICBydFdpZGdldC50b3AgPSBydFdpZGdldC5ib3R0b20oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyNzA6DQorICAgICAgcnRXaWRnZXQubGVmdCA9IHJ0V2lkZ2V0LnJpZ2h0KCk7DQorICAgICAgZlZhbHVlID0gcnRXaWRnZXQud2lkdGg7DQorICAgICAgcnRXaWRnZXQud2lkdGggPSBydFdpZGdldC5oZWlnaHQ7DQorICAgICAgcnRXaWRnZXQuaGVpZ2h0ID0gZlZhbHVlOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRkZXaWRnZXQ6Ok1vZGlmeVN0YXR1cyhGWF9EV09SRCBkd0FkZGVkLCBGWF9EV09SRCBkd1JlbW92ZWQpDQotew0KLSAgICBtX2R3U3RhdHVzID0gKG1fZHdTdGF0dXMgJiB+ZHdSZW1vdmVkKSB8IGR3QWRkZWQ7DQorRlhfRFdPUkQgQ1hGQV9GRldpZGdldDo6R2V0U3RhdHVzKCkgew0KKyAgcmV0dXJuIG1fZHdTdGF0dXM7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRldpZGdldDo6R2V0QkJveChDRlhfUmVjdEYgJnJ0Qm94LCBGWF9EV09SRCBkd1N0YXR1cywgRlhfQk9PTCBiRHJhd0ZvY3VzKQ0KLXsNCi0gICAgaWYgKGJEcmF3Rm9jdXMpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6TW9kaWZ5U3RhdHVzKEZYX0RXT1JEIGR3QWRkZWQsIEZYX0RXT1JEIGR3UmVtb3ZlZCkgew0KKyAgbV9kd1N0YXR1cyA9IChtX2R3U3RhdHVzICYgfmR3UmVtb3ZlZCkgfCBkd0FkZGVkOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6OkdldEJCb3goQ0ZYX1JlY3RGJiBydEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRyYXdGb2N1cykgew0KKyAgaWYgKGJEcmF3Rm9jdXMpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KICNpZm5kZWYgX1hGQV9FTUINCi0gICAgaWYobV9wUGFnZVZpZXcpIHsNCi0gICAgICAgIG1fcFBhZ2VWaWV3LT5HZXRQYWdlVmlld1JlY3QocnRCb3gpOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgaWYgKG1fcFBhZ2VWaWV3KSB7DQorICAgIG1fcFBhZ2VWaWV3LT5HZXRQYWdlVmlld1JlY3QocnRCb3gpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogI2VuZGlmDQotICAgIEdldFdpZGdldFJlY3QocnRCb3gpOw0KLSAgICByZXR1cm4gVFJVRTsNCisgIEdldFdpZGdldFJlY3QocnRCb3gpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUNYRkFfV2lkZ2V0QWNjKiBDWEZBX0ZGV2lkZ2V0OjpHZXREYXRhQWNjKCkNCi17DQotICAgIHJldHVybiBtX3BEYXRhQWNjOw0KK0NYRkFfV2lkZ2V0QWNjKiBDWEZBX0ZGV2lkZ2V0OjpHZXREYXRhQWNjKCkgew0KKyAgcmV0dXJuIG1fcERhdGFBY2M7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRldpZGdldDo6R2V0VG9vbFRpcChDRlhfV2lkZVN0cmluZyAmd3NUb29sVGlwKQ0KLXsNCi0gICAgaWYgKENYRkFfQXNzaXN0IGFzc2lzdCA9IG1fcERhdGFBY2MtPkdldEFzc2lzdCgpKSB7DQotICAgICAgICBpZiAoQ1hGQV9Ub29sVGlwIHRvb2xUaXAgPSBhc3Npc3QuR2V0VG9vbFRpcCgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRvb2xUaXAuR2V0VGlwKHdzVG9vbFRpcCk7DQotICAgICAgICB9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpHZXRUb29sVGlwKENGWF9XaWRlU3RyaW5nJiB3c1Rvb2xUaXApIHsNCisgIGlmIChDWEZBX0Fzc2lzdCBhc3Npc3QgPSBtX3BEYXRhQWNjLT5HZXRBc3Npc3QoKSkgew0KKyAgICBpZiAoQ1hGQV9Ub29sVGlwIHRvb2xUaXAgPSBhc3Npc3QuR2V0VG9vbFRpcCgpKSB7DQorICAgICAgcmV0dXJuIHRvb2xUaXAuR2V0VGlwKHdzVG9vbFRpcCk7DQogICAgIH0NCi0gICAgcmV0dXJuIEdldENhcHRpb25UZXh0KHdzVG9vbFRpcCk7DQorICB9DQorICByZXR1cm4gR2V0Q2FwdGlvblRleHQod3NUb29sVGlwKTsNCiB9DQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggLCBGWF9EV09SRCBkd1N0YXR1cyAsIGludDMyX3QgaVJvdGF0ZSApDQotew0KLSAgICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KLSAgICAgICAgcmV0dXJuOw0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0JvcmRlciBib3JkZXIgPSBtX3BEYXRhQWNjLT5HZXRCb3JkZXIoKTsNCisgIGlmIChib3JkZXIpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0Qm9yZGVyOw0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJvcmRlcik7DQorICAgIENYRkFfTWFyZ2luIG1hcmdpbiA9IGJvcmRlci5HZXRNYXJnaW4oKTsNCisgICAgaWYgKG1hcmdpbi5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocnRCb3JkZXIsIG1hcmdpbik7DQogICAgIH0NCi0gICAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gbV9wRGF0YUFjYy0+R2V0Qm9yZGVyKCk7DQotICAgIGlmIChib3JkZXIpIHsNCi0gICAgICAgIENGWF9SZWN0RiBydEJvcmRlcjsNCi0gICAgICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0Qm9yZGVyKTsNCi0gICAgICAgIENYRkFfTWFyZ2luIG1hcmdpbiA9IGJvcmRlci5HZXRNYXJnaW4oKTsNCi0gICAgICAgIGlmIChtYXJnaW4uSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0Qm9yZGVyLCBtYXJnaW4pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcnRCb3JkZXIuTm9ybWFsaXplKCk7DQotICAgICAgICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyLCBydEJvcmRlciwgcE1hdHJpeCk7DQotICAgIH0NCisgICAgcnRCb3JkZXIuTm9ybWFsaXplKCk7DQorICAgIERyYXdCb3JkZXIocEdTLCBib3JkZXIsIHJ0Qm9yZGVyLCBwTWF0cml4KTsNCisgIH0NCiB9DQotRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpJc0xvYWRlZCgpDQotew0KLSAgICByZXR1cm4gbV9wUGFnZVZpZXcgIT0gTlVMTDsNCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6OklzTG9hZGVkKCkgew0KKyAgcmV0dXJuIG1fcFBhZ2VWaWV3ICE9IE5VTEw7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRldpZGdldDo6TG9hZFdpZGdldCgpDQotew0KLSAgICBMYXlvdXRXaWRnZXQoKTs7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6TG9hZFdpZGdldCgpIHsNCisgIExheW91dFdpZGdldCgpOw0KKyAgOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ1hGQV9GRldpZGdldDo6VW5sb2FkV2lkZ2V0KCkNCi17DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpVbmxvYWRXaWRnZXQoKSB7fQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6TGF5b3V0V2lkZ2V0KCkgew0KKyAgUmVDYWNoZVdpZGdldFJlY3QoKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENYRkFfRkZXaWRnZXQ6OkxheW91dFdpZGdldCgpDQotew0KLSAgICBSZUNhY2hlV2lkZ2V0UmVjdCgpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6OlVwZGF0ZUZXTERhdGEoKSB7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRldpZGdldDo6VXBkYXRlRldMRGF0YSgpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHt9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpEcmF3Qm9yZGVyKENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0JveCBib3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRCb3JkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCisgIFhGQV9EcmF3Qm94KGJveCwgcEdTLCBydEJvcmRlciwgcE1hdHJpeCwgZHdGbGFncyk7DQogfQ0KLXZvaWQgQ1hGQV9GRldpZGdldDo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKQ0KLXsNCi19DQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpEcmF3Qm9yZGVyKENGWF9HcmFwaGljcyogcEdTLCBDWEZBX0JveCBib3gsIGNvbnN0IENGWF9SZWN0RiYgcnRCb3JkZXIsIENGWF9NYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGR3RmxhZ3MpDQotew0KLSAgICBYRkFfRHJhd0JveChib3gsIHBHUywgcnRCb3JkZXIsIHBNYXRyaXgsIGR3RmxhZ3MpOw0KLX0NCi12b2lkIENYRkFfRkZXaWRnZXQ6OkludmFsaWRhdGVXaWRnZXQoY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCApDQotew0KLSAgICBpZiAoIXBSZWN0KSB7DQotICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQotICAgICAgICBHZXRCQm94KHJ0V2lkZ2V0LCBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQpOw0KLSAgICAgICAgcnRXaWRnZXQuSW5mbGF0ZSgyLCAyKTsNCi0gICAgICAgIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5JbnZhbGlkYXRlUmVjdChtX3BQYWdlVmlldywgcnRXaWRnZXQsIFhGQV9JTlZBTElEQVRFX0N1cnJlbnRQYWdlKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5JbnZhbGlkYXRlUmVjdChtX3BQYWdlVmlldywgKnBSZWN0LCBYRkFfSU5WQUxJREFURV9DdXJyZW50UGFnZSk7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpBZGRJbnZhbGlkYXRlUmVjdChjb25zdCBDRlhfUmVjdEYqIHBSZWN0ICkNCi17DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpJbnZhbGlkYXRlV2lkZ2V0KGNvbnN0IENGWF9SZWN0RiogcFJlY3QpIHsNCisgIGlmICghcFJlY3QpIHsNCiAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KLSAgICBpZiAocFJlY3QpIHsNCi0gICAgICAgIHJ0V2lkZ2V0ID0gKnBSZWN0Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgR2V0QkJveChydFdpZGdldCwgWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkKTsNCi0gICAgICAgIHJ0V2lkZ2V0LkluZmxhdGUoMiwgMik7DQotICAgIH0NCi0gICAgbV9wRG9jVmlldy0+QWRkSW52YWxpZGF0ZVJlY3QobV9wUGFnZVZpZXcsIHJ0V2lkZ2V0KTsNCisgICAgR2V0QkJveChydFdpZGdldCwgWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkKTsNCisgICAgcnRXaWRnZXQuSW5mbGF0ZSgyLCAyKTsNCisgICAgR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPkludmFsaWRhdGVSZWN0KG1fcFBhZ2VWaWV3LCBydFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JTlZBTElEQVRFX0N1cnJlbnRQYWdlKTsNCisgIH0gZWxzZSB7DQorICAgIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5JbnZhbGlkYXRlUmVjdChtX3BQYWdlVmlldywgKnBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0lOVkFMSURBVEVfQ3VycmVudFBhZ2UpOw0KKyAgfQ0KIH0NCi1GWF9CT09MIENYRkFfRkZXaWRnZXQ6OkdldENhcHRpb25UZXh0KENGWF9XaWRlU3RyaW5nICZ3c0NhcCkNCi17DQotICAgIENYRkFfVGV4dExheW91dCogcENhcFRleHRsYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uVGV4dExheW91dCgpOw0KLSAgICBpZiAoIXBDYXBUZXh0bGF5b3V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcENhcFRleHRsYXlvdXQtPkdldFRleHQod3NDYXApOw0KLSAgICByZXR1cm4gVFJVRTsNCit2b2lkIENYRkFfRkZXaWRnZXQ6OkFkZEludmFsaWRhdGVSZWN0KGNvbnN0IENGWF9SZWN0RiogcFJlY3QpIHsNCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgIGlmIChwUmVjdCkgew0KKyAgICBydFdpZGdldCA9ICpwUmVjdDsNCisgIH0gZWxzZSB7DQorICAgIEdldEJCb3gocnRXaWRnZXQsIFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZCk7DQorICAgIHJ0V2lkZ2V0LkluZmxhdGUoMiwgMik7DQorICB9DQorICBtX3BEb2NWaWV3LT5BZGRJbnZhbGlkYXRlUmVjdChtX3BQYWdlVmlldywgcnRXaWRnZXQpOw0KIH0NCi1GWF9CT09MIENYRkFfRkZXaWRnZXQ6OklzRm9jdXNlZCgpDQotew0KLSAgICByZXR1cm4gbV9kd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCi19DQotRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPbk1vdXNlRW50ZXIoKQ0KLXsNCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6OkdldENhcHRpb25UZXh0KENGWF9XaWRlU3RyaW5nJiB3c0NhcCkgew0KKyAgQ1hGQV9UZXh0TGF5b3V0KiBwQ2FwVGV4dGxheW91dCA9IG1fcERhdGFBY2MtPkdldENhcHRpb25UZXh0TGF5b3V0KCk7DQorICBpZiAoIXBDYXBUZXh0bGF5b3V0KSB7DQogICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHBDYXBUZXh0bGF5b3V0LT5HZXRUZXh0KHdzQ2FwKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENYRkFfRkZXaWRnZXQ6Ok9uTW91c2VFeGl0KCkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6OklzRm9jdXNlZCgpIHsNCisgIHJldHVybiBtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXQ6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25Nb3VzZUVudGVyKCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXQ6Ok9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6Ok9uTW91c2VFeGl0KCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXQ6Ok9uTEJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXQ6Ok9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6Ok9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXQ6Ok9uTW91c2VXaGVlbChGWF9EV09SRCBkd0ZsYWdzLCBpbnQxNl90IHpEZWx0YSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25MQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0OjpPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6Ok9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXQ6Ok9uUkJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6Ok9uTW91c2VXaGVlbChGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgekRlbHRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRldpZGdldDo6T25SQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6Ok9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25SQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25SQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCiB9DQogDQotRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0OjpPblNldEZvY3VzKENYRkFfRkZXaWRnZXQqIHBPbGRXaWRnZXQpDQotew0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25TZXRGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwT2xkV2lkZ2V0KSB7DQorICBDWEZBX0ZGV2lkZ2V0KiBwUGFyZW50ID0gR2V0UGFyZW50KCk7DQorICBpZiAocFBhcmVudCAhPSBOVUxMICYmICFwUGFyZW50LT5Jc0FuY2VzdG9yT2YocE9sZFdpZGdldCkpIHsNCisgICAgcFBhcmVudC0+T25TZXRGb2N1cyhwT2xkV2lkZ2V0KTsNCisgIH0NCisgIG1fZHdTdGF0dXMgfD0gWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkOw0KKyAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0VudGVyOw0KKyAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fRW50ZXIsICZlUGFyYW0pOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkgew0KKyAgbV9kd1N0YXR1cyAmPSB+WEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkOw0KKyAgRXZlbnRLaWxsRm9jdXMoKTsNCisgIGlmIChwTmV3V2lkZ2V0ICE9IE5VTEwpIHsNCiAgICAgQ1hGQV9GRldpZGdldCogcFBhcmVudCA9IEdldFBhcmVudCgpOw0KLSAgICBpZiAocFBhcmVudCAhPSBOVUxMICYmICFwUGFyZW50LT5Jc0FuY2VzdG9yT2YocE9sZFdpZGdldCkpIHsNCi0gICAgICAgIHBQYXJlbnQtPk9uU2V0Rm9jdXMocE9sZFdpZGdldCk7DQorICAgIGlmIChwUGFyZW50ICE9IE5VTEwgJiYgIXBQYXJlbnQtPklzQW5jZXN0b3JPZihwTmV3V2lkZ2V0KSkgew0KKyAgICAgIHBQYXJlbnQtPk9uS2lsbEZvY3VzKHBOZXdXaWRnZXQpOw0KICAgICB9DQotICAgIG1fZHdTdGF0dXMgfD0gWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkOw0KLSAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KLSAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9FbnRlcjsNCi0gICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQotICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9FbnRlciwgJmVQYXJhbSk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPbktleURvd24oRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25LZXlVcChGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPbkNoYXIoRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZXaWRnZXQ6Ok9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPblNldEN1cnNvcihGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpSb3RhdGUyTm9ybWFsKEZYX0ZMT0FUJiBmeCwgRlhfRkxPQVQmIGZ5KSB7DQorICBDRlhfTWF0cml4IG10Ow0KKyAgR2V0Um90YXRlTWF0cml4KG10KTsNCisgIGlmIChtdC5Jc0lkZW50aXR5KCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtdFJldmVyc2U7DQorICBtdFJldmVyc2UuU2V0UmV2ZXJzZShtdCk7DQorICBtdFJldmVyc2UuVHJhbnNmb3JtUG9pbnQoZngsIGZ5KTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0dldE1hdHJpeChDRlhfTWF0cml4JiBtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnQpIHsNCisgIGlmICghaVJvdGF0ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCBmQW5jaG9yWCwgZkFuY2hvclk7DQorICBzd2l0Y2ggKGF0KSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdDoNCisgICAgICBmQW5jaG9yWCA9IHJ0LmxlZnQsIGZBbmNob3JZID0gcnQudG9wOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcENlbnRlcjoNCisgICAgICBmQW5jaG9yWCA9IChydC5sZWZ0ICsgcnQucmlnaHQoKSkgLyAyLCBmQW5jaG9yWSA9IHJ0LnRvcDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3BSaWdodDoNCisgICAgICBmQW5jaG9yWCA9IHJ0LnJpZ2h0KCksIGZBbmNob3JZID0gcnQudG9wOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUxlZnQ6DQorICAgICAgZkFuY2hvclggPSBydC5sZWZ0LCBmQW5jaG9yWSA9IChydC50b3AgKyBydC5ib3R0b20oKSkgLyAyOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUNlbnRlcjoNCisgICAgICBmQW5jaG9yWCA9IChydC5sZWZ0ICsgcnQucmlnaHQoKSkgLyAyLA0KKyAgICAgIGZBbmNob3JZID0gKHJ0LnRvcCArIHJ0LmJvdHRvbSgpKSAvIDI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlUmlnaHQ6DQorICAgICAgZkFuY2hvclggPSBydC5yaWdodCgpLCBmQW5jaG9yWSA9IChydC50b3AgKyBydC5ib3R0b20oKSkgLyAyOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUxlZnQ6DQorICAgICAgZkFuY2hvclggPSBydC5sZWZ0LCBmQW5jaG9yWSA9IHJ0LmJvdHRvbSgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUNlbnRlcjoNCisgICAgICBmQW5jaG9yWCA9IChydC5sZWZ0ICsgcnQucmlnaHQoKSkgLyAyLCBmQW5jaG9yWSA9IHJ0LmJvdHRvbSgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbVJpZ2h0Og0KKyAgICAgIGZBbmNob3JYID0gcnQucmlnaHQoKSwgZkFuY2hvclkgPSBydC5ib3R0b20oKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIHN3aXRjaCAoaVJvdGF0ZSkgew0KKyAgICBjYXNlIDkwOg0KKyAgICAgIG0uYSA9IDAsIG0uYiA9IC0xLCBtLmMgPSAxLCBtLmQgPSAwLCBtLmUgPSBmQW5jaG9yWCAtIGZBbmNob3JZLA0KKyAgICAgIG0uZiA9IGZBbmNob3JYICsgZkFuY2hvclk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTgwOg0KKyAgICAgIG0uYSA9IC0xLCBtLmIgPSAwLCBtLmMgPSAwLCBtLmQgPSAtMSwgbS5lID0gZkFuY2hvclggKiAyLA0KKyAgICAgIG0uZiA9IGZBbmNob3JZICogMjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyNzA6DQorICAgICAgbS5hID0gMCwgbS5iID0gMSwgbS5jID0gLTEsIG0uZCA9IDAsIG0uZSA9IGZBbmNob3JYICsgZkFuY2hvclksDQorICAgICAgbS5mID0gZkFuY2hvclkgLSBmQW5jaG9yWDsNCisgICAgICBicmVhazsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRSb3RhdGVNYXRyaXgoQ0ZYX01hdHJpeCYgbXQpIHsNCisgIG10LlNldCgxLCAwLCAwLCAxLCAwLCAwKTsNCisgIGludDMyX3QgaVJvdGF0ZSA9IG1fcERhdGFBY2MtPkdldFJvdGF0ZSgpOw0KKyAgaWYgKCFpUm90YXRlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9SZWN0RiByY1dpZGdldDsNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJjV2lkZ2V0KTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGF0ID0gWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdDsNCisgIFhGQV9HZXRNYXRyaXgobXQsIGlSb3RhdGUsIGF0LCByY1dpZGdldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6SXNMYXlvdXRSZWN0RW1wdHkoKSB7DQorICBDRlhfUmVjdEYgcnRMYXlvdXQ7DQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydExheW91dCk7DQorICByZXR1cm4gcnRMYXlvdXQud2lkdGggPCAwLjFmICYmIHJ0TGF5b3V0LmhlaWdodCA8IDAuMWY7DQorfQ0KK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZXaWRnZXQ6OkdldFBhcmVudCgpIHsNCisgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPQ0KKyAgICAgIG1fcERhdGFBY2MtPkdldE5vZGUoKS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICBpZiAocFBhcmVudE5vZGUgIT0gTlVMTCkgew0KKyAgICBDWEZBX1dpZGdldEFjYyogcFBhcmVudFdpZGdldEFjYyA9DQorICAgICAgICAoQ1hGQV9XaWRnZXRBY2MqKXBQYXJlbnROb2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICAgIGlmIChwUGFyZW50V2lkZ2V0QWNjICE9IE5VTEwpIHsNCisgICAgICByZXR1cm4gcFBhcmVudFdpZGdldEFjYy0+R2V0TmV4dFdpZGdldChOVUxMKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6SXNBbmNlc3Rvck9mKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpIHsNCisgIGlmICghcFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wRGF0YUFjYy0+R2V0Tm9kZSgpOw0KKyAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXROb2RlKCk7DQorICB3aGlsZSAocENoaWxkTm9kZSkgew0KKyAgICBpZiAocENoaWxkTm9kZSA9PSBwTm9kZSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpQdEluQWN0aXZlUmVjdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgIEdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgaWYgKHJ0V2lkZ2V0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCiAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkNCi17DQotICAgIG1fZHdTdGF0dXMgJj0gflhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCi0gICAgRXZlbnRLaWxsRm9jdXMoKTsNCi0gICAgaWYgKHBOZXdXaWRnZXQgIT0gTlVMTCkgew0KLSAgICAgICAgQ1hGQV9GRldpZGdldCogcFBhcmVudCA9IEdldFBhcmVudCgpOw0KLSAgICAgICAgaWYgKHBQYXJlbnQgIT0gTlVMTCAmJiAhcFBhcmVudC0+SXNBbmNlc3Rvck9mKHBOZXdXaWRnZXQpKSB7DQotICAgICAgICAgICAgcFBhcmVudC0+T25LaWxsRm9jdXMocE5ld1dpZGdldCk7DQotICAgICAgICB9DQorQ1hGQV9GRkRvY1ZpZXcqIENYRkFfRkZXaWRnZXQ6OkdldERvY1ZpZXcoKSB7DQorICByZXR1cm4gbV9wRG9jVmlldzsNCit9DQorQ1hGQV9GRkRvYyogQ1hGQV9GRldpZGdldDo6R2V0RG9jKCkgew0KKyAgcmV0dXJuIChDWEZBX0ZGRG9jKiltX3BEb2NWaWV3LT5HZXREb2MoKTsNCit9DQorQ1hGQV9GRkFwcCogQ1hGQV9GRldpZGdldDo6R2V0QXBwKCkgew0KKyAgcmV0dXJuIEdldERvYygpLT5HZXRBcHAoKTsNCit9DQorSVhGQV9BcHBQcm92aWRlciogQ1hGQV9GRldpZGdldDo6R2V0QXBwUHJvdmlkZXIoKSB7DQorICByZXR1cm4gR2V0QXBwKCktPkdldEFwcFByb3ZpZGVyKCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6R2V0TWluTWF4V2lkdGgoRlhfRkxPQVQgZk1pbldpZHRoLCBGWF9GTE9BVCBmTWF4V2lkdGgpIHsNCisgIGZNaW5XaWR0aCA9IGZNYXhXaWR0aCA9IDA7DQorICBGWF9GTE9BVCBmV2lkdGggPSAwOw0KKyAgaWYgKG1fcERhdGFBY2MtPkdldFdpZHRoKGZXaWR0aCkpIHsNCisgICAgZk1pbldpZHRoID0gZk1heFdpZHRoID0gZldpZHRoOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wRGF0YUFjYy0+R2V0TWluV2lkdGgoZk1pbldpZHRoKTsNCisgICAgbV9wRGF0YUFjYy0+R2V0TWF4V2lkdGgoZk1heFdpZHRoKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRNaW5NYXhIZWlnaHQoRlhfRkxPQVQgZk1pbkhlaWdodCwgRlhfRkxPQVQgZk1heEhlaWdodCkgew0KKyAgZk1pbkhlaWdodCA9IGZNYXhIZWlnaHQgPSAwOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IDA7DQorICBpZiAobV9wRGF0YUFjYy0+R2V0SGVpZ2h0KGZIZWlnaHQpKSB7DQorICAgIGZNaW5IZWlnaHQgPSBmTWF4SGVpZ2h0ID0gZkhlaWdodDsNCisgIH0gZWxzZSB7DQorICAgIG1fcERhdGFBY2MtPkdldE1pbkhlaWdodChmTWluSGVpZ2h0KTsNCisgICAgbV9wRGF0YUFjYy0+R2V0TWF4SGVpZ2h0KGZNYXhIZWlnaHQpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6OklzTWF0Y2hWaXNpYmxlU3RhdHVzKEZYX0RXT1JEIGR3U3RhdHVzKSB7DQorICByZXR1cm4gbV9kd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZTsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpFdmVudEtpbGxGb2N1cygpIHsNCisgIGlmIChtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19BY2Nlc3MpIHsNCisgICAgbV9kd1N0YXR1cyAmPSB+WEZBX1dJREdFVFNUQVRVU19BY2Nlc3M7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9FeGl0Ow0KKyAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fRXhpdCwgJmVQYXJhbSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6SXNCdXR0b25Eb3duKCkgew0KKyAgcmV0dXJuIChtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19CdXR0b25Eb3duKSAhPSAwOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXQ6OlNldEJ1dHRvbkRvd24oRlhfQk9PTCBiU2V0KSB7DQorICBiU2V0ID8gbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX0J1dHRvbkRvd24NCisgICAgICAgOiBtX2R3U3RhdHVzICY9IH5YRkFfV0lER0VUU1RBVFVTX0J1dHRvbkRvd247DQorfQ0KK2ludDMyX3QgWEZBX1N0cm9rZVR5cGVTZXRMaW5lRGFzaChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3Ryb2tlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ2FwVHlwZSkgew0KKyAgc3dpdGNoIChpU3Ryb2tlVHlwZSkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3Q6IHsNCisgICAgICBGWF9GTE9BVCBkYXNoQXJyYXlbXSA9IHs0LCAxLCAyLCAxfTsNCisgICAgICBpZiAoaUNhcFR5cGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fQnV0dCkgew0KKyAgICAgICAgZGFzaEFycmF5WzFdID0gMjsNCisgICAgICAgIGRhc2hBcnJheVszXSA9IDI7DQorICAgICAgfQ0KKyAgICAgIHBHcmFwaGljcy0+U2V0TGluZURhc2goMCwgZGFzaEFycmF5LCA0KTsNCisgICAgICByZXR1cm4gRlhfREFTSFNUWUxFX0Rhc2hEb3Q7DQogICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ1hGQV9GRldpZGdldDo6T25LZXlEb3duKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykNCi17DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0OjpPbktleVVwKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykNCi17DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0OjpPbkNoYXIoRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9EV09SRCBDWEZBX0ZGV2lkZ2V0OjpPbkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXQ6Ok9uU2V0Q3Vyc29yKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpSb3RhdGUyTm9ybWFsKEZYX0ZMT0FUICZmeCwgRlhfRkxPQVQgJmZ5KQ0KLXsNCi0gICAgQ0ZYX01hdHJpeCBtdDsNCi0gICAgR2V0Um90YXRlTWF0cml4KG10KTsNCi0gICAgaWYgKG10LklzSWRlbnRpdHkoKSkgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3REb3Q6IHsNCisgICAgICBGWF9GTE9BVCBkYXNoQXJyYXlbXSA9IHs0LCAxLCAyLCAxLCAyLCAxfTsNCisgICAgICBpZiAoaUNhcFR5cGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fQnV0dCkgew0KKyAgICAgICAgZGFzaEFycmF5WzFdID0gMjsNCisgICAgICAgIGRhc2hBcnJheVszXSA9IDI7DQorICAgICAgICBkYXNoQXJyYXlbNV0gPSAyOw0KKyAgICAgIH0NCisgICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgNik7DQorICAgICAgcmV0dXJuIEZYX0RBU0hTVFlMRV9EYXNoRG90RG90Ow0KICAgICB9DQotICAgIENGWF9NYXRyaXggbXRSZXZlcnNlOw0KLSAgICBtdFJldmVyc2UuU2V0UmV2ZXJzZShtdCk7DQotICAgIG10UmV2ZXJzZS5UcmFuc2Zvcm1Qb2ludChmeCwgZnkpOw0KLX0NCi1zdGF0aWMgdm9pZCBYRkFfR2V0TWF0cml4KENGWF9NYXRyaXggJm0sIGludDMyX3QgaVJvdGF0ZSwgaW50MzJfdCBhdCwgY29uc3QgQ0ZYX1JlY3RGJiBydCkNCi17DQotICAgIGlmICghaVJvdGF0ZSkgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hlZDogew0KKyAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezUsIDF9Ow0KKyAgICAgIGlmIChpQ2FwVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0KSB7DQorICAgICAgICBkYXNoQXJyYXlbMV0gPSAyOw0KKyAgICAgIH0NCisgICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgMik7DQorICAgICAgcmV0dXJuIEZYX0RBU0hTVFlMRV9EYXNoOw0KICAgICB9DQotICAgIEZYX0ZMT0FUIGZBbmNob3JYLCBmQW5jaG9yWTsNCi0gICAgc3dpdGNoIChhdCkgew0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3BMZWZ0Og0KLSAgICAgICAgICAgIGZBbmNob3JYID0gcnQubGVmdCwgZkFuY2hvclkgPSBydC50b3A7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcENlbnRlcjoNCi0gICAgICAgICAgICBmQW5jaG9yWCA9IChydC5sZWZ0ICsgcnQucmlnaHQoKSkgLyAyLCBmQW5jaG9yWSA9IHJ0LnRvcDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wUmlnaHQ6DQotICAgICAgICAgICAgZkFuY2hvclggPSBydC5yaWdodCgpLCBmQW5jaG9yWSA9IHJ0LnRvcDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlTGVmdDoNCi0gICAgICAgICAgICBmQW5jaG9yWCA9IHJ0LmxlZnQsIGZBbmNob3JZID0gKHJ0LnRvcCArIHJ0LmJvdHRvbSgpKSAvIDI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUNlbnRlcjoNCi0gICAgICAgICAgICBmQW5jaG9yWCA9IChydC5sZWZ0ICsgcnQucmlnaHQoKSkgLyAyLCBmQW5jaG9yWSA9IChydC50b3AgKyBydC5ib3R0b20oKSkgLyAyOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVSaWdodDoNCi0gICAgICAgICAgICBmQW5jaG9yWCA9IHJ0LnJpZ2h0KCksIGZBbmNob3JZID0gKHJ0LnRvcCArIHJ0LmJvdHRvbSgpKSAvIDI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUxlZnQ6DQotICAgICAgICAgICAgZkFuY2hvclggPSBydC5sZWZ0LCBmQW5jaG9yWSA9IHJ0LmJvdHRvbSgpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21DZW50ZXI6DQotICAgICAgICAgICAgZkFuY2hvclggPSAocnQubGVmdCArIHJ0LnJpZ2h0KCkpIC8gMiwgZkFuY2hvclkgPSBydC5ib3R0b20oKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tUmlnaHQ6DQotICAgICAgICAgICAgZkFuY2hvclggPSBydC5yaWdodCgpLCBmQW5jaG9yWSA9IHJ0LmJvdHRvbSgpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RvdHRlZDogew0KKyAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezIsIDF9Ow0KKyAgICAgIGlmIChpQ2FwVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0KSB7DQorICAgICAgICBkYXNoQXJyYXlbMV0gPSAyOw0KKyAgICAgIH0NCisgICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgMik7DQorICAgICAgcmV0dXJuIEZYX0RBU0hTVFlMRV9Eb3Q7DQogICAgIH0NCi0gICAgc3dpdGNoIChpUm90YXRlKSB7DQotICAgICAgICBjYXNlIDkwOg0KLSAgICAgICAgICAgIG0uYSA9IDAsIG0uYiA9IC0xLCBtLmMgPSAxLCBtLmQgPSAwLCBtLmUgPSBmQW5jaG9yWCAtIGZBbmNob3JZLCBtLmYgPSBmQW5jaG9yWCArIGZBbmNob3JZOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAxODA6DQotICAgICAgICAgICAgbS5hID0gLTEsIG0uYiA9IDAsIG0uYyA9IDAsIG0uZCA9IC0xLCBtLmUgPSBmQW5jaG9yWCAqIDIsIG0uZiA9IGZBbmNob3JZICogMjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjcwOg0KLSAgICAgICAgICAgIG0uYSA9IDAsIG0uYiA9IDEsIG0uYyA9IC0xLCBtLmQgPSAwLCBtLmUgPSBmQW5jaG9yWCArIGZBbmNob3JZLCBtLmYgPSBmQW5jaG9yWSAtIGZBbmNob3JYOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKEZYX0RBU0hTVFlMRV9Tb2xpZCk7DQorICByZXR1cm4gRlhfREFTSFNUWUxFX1NvbGlkOw0KIH0NCi12b2lkIENYRkFfRkZXaWRnZXQ6OkdldFJvdGF0ZU1hdHJpeChDRlhfTWF0cml4ICZtdCkNCi17DQotICAgIG10LlNldCgxLCAwLCAwLCAxLCAwLCAwKTsNCi0gICAgaW50MzJfdCBpUm90YXRlID0gbV9wRGF0YUFjYy0+R2V0Um90YXRlKCk7DQotICAgIGlmICghaVJvdGF0ZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9SZWN0RiByY1dpZGdldDsNCi0gICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocmNXaWRnZXQpOw0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBhdCA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcExlZnQ7DQotICAgIFhGQV9HZXRNYXRyaXgobXQsIGlSb3RhdGUsIGF0LCByY1dpZGdldCk7DQorQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIFhGQV9MaW5lQ2FwVG9GWEdFKGludDMyX3QgaUxpbmVDYXApIHsNCisgIHN3aXRjaCAoaUxpbmVDYXApIHsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Sb3VuZDoNCisgICAgICByZXR1cm4gQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwUm91bmQ7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQnV0dDoNCisgICAgICByZXR1cm4gQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwQnV0dDsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBTcXVhcmU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRldpZGdldDo6SXNMYXlvdXRSZWN0RW1wdHkoKQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0TGF5b3V0Ow0KLSAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydExheW91dCk7DQotICAgIHJldHVybiBydExheW91dC53aWR0aCA8IDAuMWYgJiYgcnRMYXlvdXQuaGVpZ2h0IDwgMC4xZjsNCi19DQotQ1hGQV9GRldpZGdldCogQ1hGQV9GRldpZGdldDo6R2V0UGFyZW50KCkNCi17DQotICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBtX3BEYXRhQWNjLT5HZXROb2RlKCktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICBpZiAocFBhcmVudE5vZGUgIT0gTlVMTCkgew0KLSAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBQYXJlbnRXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBQYXJlbnROb2RlLT5HZXRXaWRnZXREYXRhKCk7DQotICAgICAgICBpZiAocFBhcmVudFdpZGdldEFjYyAhPSBOVUxMKSB7DQotICAgICAgICAgICAgcmV0dXJuIHBQYXJlbnRXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQoTlVMTCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRldpZGdldDo6SXNBbmNlc3Rvck9mKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpDQotew0KLSAgICBpZiAoIXBXaWRnZXQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wRGF0YUFjYy0+R2V0Tm9kZSgpOw0KLSAgICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCktPkdldE5vZGUoKTsNCi0gICAgd2hpbGUgKHBDaGlsZE5vZGUpIHsNCi0gICAgICAgIGlmIChwQ2hpbGROb2RlID09IHBOb2RlKSB7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXQ6OlB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIENGWF9SZWN0RiBydFdpZGdldDsNCi0gICAgR2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQotICAgIGlmIChydFdpZGdldC5Db250YWlucyhmeCwgZnkpKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUNYRkFfRkZEb2NWaWV3KiBDWEZBX0ZGV2lkZ2V0OjpHZXREb2NWaWV3KCkNCi17DQotICAgIHJldHVybiBtX3BEb2NWaWV3Ow0KLX0NCi1DWEZBX0ZGRG9jKiBDWEZBX0ZGV2lkZ2V0OjpHZXREb2MoKQ0KLXsNCi0gICAgcmV0dXJuIChDWEZBX0ZGRG9jKiltX3BEb2NWaWV3LT5HZXREb2MoKTsNCi19DQotQ1hGQV9GRkFwcCogQ1hGQV9GRldpZGdldDo6R2V0QXBwKCkNCi17DQotICAgIHJldHVybiBHZXREb2MoKS0+R2V0QXBwKCk7DQotfQ0KLUlYRkFfQXBwUHJvdmlkZXIqIENYRkFfRkZXaWRnZXQ6OkdldEFwcFByb3ZpZGVyKCkNCi17DQotICAgIHJldHVybiBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCi19DQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRNaW5NYXhXaWR0aChGWF9GTE9BVCBmTWluV2lkdGgsIEZYX0ZMT0FUIGZNYXhXaWR0aCkNCi17DQotICAgIGZNaW5XaWR0aCA9IGZNYXhXaWR0aCA9IDA7DQotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDA7DQotICAgIGlmIChtX3BEYXRhQWNjLT5HZXRXaWR0aChmV2lkdGgpKSB7DQotICAgICAgICBmTWluV2lkdGggPSBmTWF4V2lkdGggPSBmV2lkdGg7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BEYXRhQWNjLT5HZXRNaW5XaWR0aChmTWluV2lkdGgpOw0KLSAgICAgICAgbV9wRGF0YUFjYy0+R2V0TWF4V2lkdGgoZk1heFdpZHRoKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRkZXaWRnZXQ6OkdldE1pbk1heEhlaWdodChGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0KQ0KLXsNCi0gICAgZk1pbkhlaWdodCA9IGZNYXhIZWlnaHQgPSAwOw0KLSAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gMDsNCi0gICAgaWYgKG1fcERhdGFBY2MtPkdldEhlaWdodChmSGVpZ2h0KSkgew0KLSAgICAgICAgZk1pbkhlaWdodCA9IGZNYXhIZWlnaHQgPSBmSGVpZ2h0Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wRGF0YUFjYy0+R2V0TWluSGVpZ2h0KGZNaW5IZWlnaHQpOw0KLSAgICAgICAgbV9wRGF0YUFjYy0+R2V0TWF4SGVpZ2h0KGZNYXhIZWlnaHQpOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRldpZGdldDo6SXNNYXRjaFZpc2libGVTdGF0dXMoRlhfRFdPUkQgZHdTdGF0dXMpDQotew0KLSAgICByZXR1cm4gbV9kd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZTsNCi19DQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpFdmVudEtpbGxGb2N1cygpDQotew0KLSAgICBpZiAobV9kd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfQWNjZXNzKSB7DQotICAgICAgICBtX2R3U3RhdHVzICY9IH5YRkFfV0lER0VUU1RBVFVTX0FjY2VzczsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KLSAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9FeGl0Ow0KLSAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCi0gICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0V4aXQsICZlUGFyYW0pOw0KLX0NCi1GWF9CT09MIENYRkFfRkZXaWRnZXQ6OklzQnV0dG9uRG93bigpDQotew0KLSAgICByZXR1cm4gKG1fZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX0J1dHRvbkRvd24pICE9IDA7DQotfQ0KLXZvaWQgQ1hGQV9GRldpZGdldDo6U2V0QnV0dG9uRG93bihGWF9CT09MIGJTZXQpDQotew0KLSAgICBiU2V0ID8gbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX0J1dHRvbkRvd24gOiBtX2R3U3RhdHVzICY9IH5YRkFfV0lER0VUU1RBVFVTX0J1dHRvbkRvd247DQotfQ0KLWludDMyX3QgWEZBX1N0cm9rZVR5cGVTZXRMaW5lRGFzaChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywgaW50MzJfdCBpU3Ryb2tlVHlwZSwgaW50MzJfdCBpQ2FwVHlwZSkNCi17DQotICAgIHN3aXRjaChpU3Ryb2tlVHlwZSkgew0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EYXNoRG90OiB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezQsIDEsIDIsIDF9Ow0KLSAgICAgICAgICAgICAgICBpZiAoaUNhcFR5cGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fQnV0dCkgew0KLSAgICAgICAgICAgICAgICAgICAgZGFzaEFycmF5WzFdID0gMjsNCi0gICAgICAgICAgICAgICAgICAgIGRhc2hBcnJheVszXSA9IDI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDQpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfREFTSFNUWUxFX0Rhc2hEb3Q7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EYXNoRG90RG90OiB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezQsIDEsIDIsIDEsIDIsIDF9Ow0KLSAgICAgICAgICAgICAgICBpZiAoaUNhcFR5cGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fQnV0dCkgew0KLSAgICAgICAgICAgICAgICAgICAgZGFzaEFycmF5WzFdID0gMjsNCi0gICAgICAgICAgICAgICAgICAgIGRhc2hBcnJheVszXSA9IDI7DQotICAgICAgICAgICAgICAgICAgICBkYXNoQXJyYXlbNV0gPSAyOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBHcmFwaGljcy0+U2V0TGluZURhc2goMCwgZGFzaEFycmF5LCA2KTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0RBU0hTVFlMRV9EYXNoRG90RG90Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGFzaGVkOiB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezUsIDF9Ow0KLSAgICAgICAgICAgICAgICBpZiAoaUNhcFR5cGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fQnV0dCkgew0KLSAgICAgICAgICAgICAgICAgICAgZGFzaEFycmF5WzFdID0gMjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgMik7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9EQVNIU1RZTEVfRGFzaDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RvdHRlZDogew0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBkYXNoQXJyYXlbXSA9IHsyLCAxfTsNCi0gICAgICAgICAgICAgICAgaWYgKGlDYXBUeXBlICE9IFhGQV9BVFRSSUJVVEVFTlVNX0J1dHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRhc2hBcnJheVsxXSA9IDI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDIpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfREFTSFNUWUxFX0RvdDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHBHcmFwaGljcy0+U2V0TGluZURhc2goRlhfREFTSFNUWUxFX1NvbGlkKTsNCi0gICAgcmV0dXJuIEZYX0RBU0hTVFlMRV9Tb2xpZDsNCi19DQotQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIFhGQV9MaW5lQ2FwVG9GWEdFKGludDMyX3QgaUxpbmVDYXApDQotew0KLSAgICBzd2l0Y2goaUxpbmVDYXApIHsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm91bmQ6DQotICAgICAgICAgICAgcmV0dXJuIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFJvdW5kOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0Og0KLSAgICAgICAgICAgIHJldHVybiBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0Ow0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwU3F1YXJlOw0KLX0NCi1jbGFzcyBDWEZBX0ltYWdlUmVuZGVyZXINCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ltYWdlUmVuZGVyZXIoKTsNCi0gICAgfkNYRkFfSW1hZ2VSZW5kZXJlcigpOw0KLSAgICBGWF9CT09MCQlTdGFydChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLCBGWF9BUkdCIGJpdG1hcF9hcmdiLA0KLSAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBGWF9EV09SRCBmbGFncywgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7DQotICAgIEZYX0JPT0wJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGWF9SZW5kZXJEZXZpY2UqCQltX3BEZXZpY2U7DQotICAgIGludAkJCQkJCW1fU3RhdHVzOw0KLSAgICBDRlhfQWZmaW5lTWF0cml4CQltX0ltYWdlTWF0cml4Ow0KLSAgICBDRlhfRElCU291cmNlKgkJCW1fcERJQlNvdXJjZTsNCi0gICAgQ0ZYX0RJQml0bWFwKgkJCW1fcENsb25lQ29udmVydDsNCi0gICAgaW50CQkJCQkJbV9CaXRtYXBBbHBoYTsNCi0gICAgRlhfQVJHQgkJCQkJbV9GaWxsQXJnYjsNCi0gICAgRlhfRFdPUkQJCQkJbV9GbGFnczsNCi0gICAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIqCW1fcFRyYW5zZm9ybWVyOw0KLSAgICB2b2lkKgkJCQltX0RldmljZUhhbmRsZTsNCi0gICAgaW50MzJfdAkJCQltX0JsZW5kVHlwZTsNCi0gICAgRlhfQk9PTAkJCQkJbV9SZXN1bHQ7DQotICAgIEZYX0JPT0wJCQkJCW1fYlByaW50Ow0KLSAgICBGWF9CT09MCQkJCQlTdGFydERJQlNvdXJjZSgpOw0KLSAgICB2b2lkCQkJCQlDb21wb3NpdGVESUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIEZYX0FSR0IgbWFza19hcmdiLA0KLSAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsIGludCBibGVuZF9tb2RlLCBpbnQgVHJhbnNwYXJlbmN5KTsNCitjbGFzcyBDWEZBX0ltYWdlUmVuZGVyZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX0ltYWdlUmVuZGVyZXIoKTsNCisgIH5DWEZBX0ltYWdlUmVuZGVyZXIoKTsNCisgIEZYX0JPT0wgU3RhcnQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwNCisgICAgICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwNCisgICAgICAgICAgICAgICAgRlhfQVJHQiBiaXRtYXBfYXJnYiwNCisgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsDQorICAgICAgICAgICAgICAgIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOw0KKyAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7DQorDQorIHByb3RlY3RlZDoNCisgIENGWF9SZW5kZXJEZXZpY2UqIG1fcERldmljZTsNCisgIGludCBtX1N0YXR1czsNCisgIENGWF9BZmZpbmVNYXRyaXggbV9JbWFnZU1hdHJpeDsNCisgIENGWF9ESUJTb3VyY2UqIG1fcERJQlNvdXJjZTsNCisgIENGWF9ESUJpdG1hcCogbV9wQ2xvbmVDb252ZXJ0Ow0KKyAgaW50IG1fQml0bWFwQWxwaGE7DQorICBGWF9BUkdCIG1fRmlsbEFyZ2I7DQorICBGWF9EV09SRCBtX0ZsYWdzOw0KKyAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIqIG1fcFRyYW5zZm9ybWVyOw0KKyAgdm9pZCogbV9EZXZpY2VIYW5kbGU7DQorICBpbnQzMl90IG1fQmxlbmRUeXBlOw0KKyAgRlhfQk9PTCBtX1Jlc3VsdDsNCisgIEZYX0JPT0wgbV9iUHJpbnQ7DQorICBGWF9CT09MIFN0YXJ0RElCU291cmNlKCk7DQorICB2b2lkIENvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBtYXNrX2FyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF9tb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVHJhbnNwYXJlbmN5KTsNCiB9Ow0KLUNYRkFfSW1hZ2VSZW5kZXJlcjo6Q1hGQV9JbWFnZVJlbmRlcmVyKCkNCi17DQotICAgIG1fcERldmljZSA9IE5VTEw7DQotICAgIG1fU3RhdHVzID0gMDsNCi0gICAgbV9wRElCU291cmNlID0gTlVMTDsNCi0gICAgbV9wQ2xvbmVDb252ZXJ0ID0gTlVMTDsNCi0gICAgbV9CaXRtYXBBbHBoYSA9IDI1NTsNCi0gICAgbV9GaWxsQXJnYiA9IDA7DQotICAgIG1fRmxhZ3MgPSAwOw0KLSAgICBtX3BUcmFuc2Zvcm1lciA9IE5VTEw7DQotICAgIG1fRGV2aWNlSGFuZGxlID0gTlVMTDsNCi0gICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7DQotICAgIG1fUmVzdWx0ID0gVFJVRTsNCi0gICAgbV9iUHJpbnQgPSBGQUxTRTsNCitDWEZBX0ltYWdlUmVuZGVyZXI6OkNYRkFfSW1hZ2VSZW5kZXJlcigpIHsNCisgIG1fcERldmljZSA9IE5VTEw7DQorICBtX1N0YXR1cyA9IDA7DQorICBtX3BESUJTb3VyY2UgPSBOVUxMOw0KKyAgbV9wQ2xvbmVDb252ZXJ0ID0gTlVMTDsNCisgIG1fQml0bWFwQWxwaGEgPSAyNTU7DQorICBtX0ZpbGxBcmdiID0gMDsNCisgIG1fRmxhZ3MgPSAwOw0KKyAgbV9wVHJhbnNmb3JtZXIgPSBOVUxMOw0KKyAgbV9EZXZpY2VIYW5kbGUgPSBOVUxMOw0KKyAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7DQorICBtX1Jlc3VsdCA9IFRSVUU7DQorICBtX2JQcmludCA9IEZBTFNFOw0KIH0NCi1DWEZBX0ltYWdlUmVuZGVyZXI6On5DWEZBX0ltYWdlUmVuZGVyZXIoKQ0KLXsNCi0gICAgaWYgKG1fcENsb25lQ29udmVydCkgew0KLSAgICAgICAgZGVsZXRlIG1fcENsb25lQ29udmVydDsNCi0gICAgfQ0KLSAgICBpZiAobV9wVHJhbnNmb3JtZXIpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLSAgICBpZiAobV9EZXZpY2VIYW5kbGUpIHsNCi0gICAgICAgIG1fcERldmljZS0+Q2FuY2VsRElCaXRzKG1fRGV2aWNlSGFuZGxlKTsNCi0gICAgfQ0KK0NYRkFfSW1hZ2VSZW5kZXJlcjo6fkNYRkFfSW1hZ2VSZW5kZXJlcigpIHsNCisgIGlmIChtX3BDbG9uZUNvbnZlcnQpIHsNCisgICAgZGVsZXRlIG1fcENsb25lQ29udmVydDsNCisgIH0NCisgIGlmIChtX3BUcmFuc2Zvcm1lcikgew0KKyAgICBkZWxldGUgbV9wVHJhbnNmb3JtZXI7DQorICB9DQorICBpZiAobV9EZXZpY2VIYW5kbGUpIHsNCisgICAgbV9wRGV2aWNlLT5DYW5jZWxESUJpdHMobV9EZXZpY2VIYW5kbGUpOw0KKyAgfQ0KIH0NCi1GWF9CT09MIENYRkFfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwgRlhfQVJHQiBiaXRtYXBfYXJnYiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgRlhfRFdPUkQgZmxhZ3MsIGludCBibGVuZFR5cGUpDQotew0KLSAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOw0KLSAgICBtX3BESUJTb3VyY2UgPSBwRElCU291cmNlOw0KLSAgICBtX0ZpbGxBcmdiID0gYml0bWFwX2FyZ2I7DQotICAgIG1fQml0bWFwQWxwaGEgPSBiaXRtYXBfYWxwaGE7DQotICAgIG1fSW1hZ2VNYXRyaXggPSAqcEltYWdlMkRldmljZTsNCi0gICAgbV9GbGFncyA9IGZsYWdzOw0KLSAgICBtX0JsZW5kVHlwZSA9IGJsZW5kVHlwZTsNCi0gICAgcmV0dXJuIFN0YXJ0RElCU291cmNlKCk7DQorRlhfQk9PTCBDWEZBX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYml0bWFwX2FyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRUeXBlKSB7DQorICBtX3BEZXZpY2UgPSBwRGV2aWNlOw0KKyAgbV9wRElCU291cmNlID0gcERJQlNvdXJjZTsNCisgIG1fRmlsbEFyZ2IgPSBiaXRtYXBfYXJnYjsNCisgIG1fQml0bWFwQWxwaGEgPSBiaXRtYXBfYWxwaGE7DQorICBtX0ltYWdlTWF0cml4ID0gKnBJbWFnZTJEZXZpY2U7DQorICBtX0ZsYWdzID0gZmxhZ3M7DQorICBtX0JsZW5kVHlwZSA9IGJsZW5kVHlwZTsNCisgIHJldHVybiBTdGFydERJQlNvdXJjZSgpOw0KIH0NCi1GWF9CT09MIENYRkFfSW1hZ2VSZW5kZXJlcjo6U3RhcnRESUJTb3VyY2UoKQ0KLXsNCi0gICAgaWYgKG1fcERldmljZS0+U3RhcnRESUJpdHMobV9wRElCU291cmNlLCBtX0JpdG1hcEFscGhhLCBtX0ZpbGxBcmdiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncywgbV9EZXZpY2VIYW5kbGUsIDAsIE5VTEwsIG1fQmxlbmRUeXBlKSkgew0KLSAgICAgICAgaWYgKG1fRGV2aWNlSGFuZGxlICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBtX1N0YXR1cyA9IDM7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDWEZBX0ltYWdlUmVuZGVyZXI6OlN0YXJ0RElCU291cmNlKCkgew0KKyAgaWYgKG1fcERldmljZS0+U3RhcnRESUJpdHMobV9wRElCU291cmNlLCBtX0JpdG1hcEFscGhhLCBtX0ZpbGxBcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fSW1hZ2VNYXRyaXgsIG1fRmxhZ3MsIG1fRGV2aWNlSGFuZGxlLCAwLCBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUpKSB7DQorICAgIGlmIChtX0RldmljZUhhbmRsZSAhPSBOVUxMKSB7DQorICAgICAgbV9TdGF0dXMgPSAzOw0KKyAgICAgIHJldHVybiBUUlVFOw0KICAgICB9DQotICAgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOw0KLSAgICBGWF9SRUNUIGltYWdlX3JlY3QgPSBpbWFnZV9yZWN0X2YuR2V0T3V0dGVyUmVjdCgpOw0KLSAgICBpbnQgZGVzdF93aWR0aCA9IGltYWdlX3JlY3QuV2lkdGgoKTsNCi0gICAgaW50IGRlc3RfaGVpZ2h0ID0gaW1hZ2VfcmVjdC5IZWlnaHQoKTsNCi0gICAgaWYgKChGWFNZU19mYWJzKG1fSW1hZ2VNYXRyaXguYikgPj0gMC41ZiB8fCBtX0ltYWdlTWF0cml4LmEgPT0gMCkgfHwNCi0gICAgICAgICAgICAoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmMpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5kID09IDApICkgew0KLSAgICAgICAgaWYgKG1fYlByaW50ICYmICEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7DQotICAgICAgICAgICAgbV9SZXN1bHQgPSBGQUxTRTsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBDRlhfRElCU291cmNlKiBwRGliID0gbV9wRElCU291cmNlOw0KLSAgICAgICAgaWYgKG1fcERJQlNvdXJjZS0+SGFzQWxwaGEoKSAmJiAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9JTUFHRSkgJiYgIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfR0VUX0JJVFMpKSB7DQotICAgICAgICAgICAgbV9wQ2xvbmVDb252ZXJ0ID0gbV9wRElCU291cmNlLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsNCi0gICAgICAgICAgICBpZiAoIW1fcENsb25lQ29udmVydCkgew0KLSAgICAgICAgICAgICAgICBtX1Jlc3VsdCA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBEaWIgPSBtX3BDbG9uZUNvbnZlcnQ7DQotICAgICAgICB9DQotICAgICAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7DQotICAgICAgICBjbGlwX2JveC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7DQotICAgICAgICBtX1N0YXR1cyA9IDI7DQotICAgICAgICBtX3BUcmFuc2Zvcm1lciA9IEZYX05FVyBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjsNCi0gICAgICAgIG1fcFRyYW5zZm9ybWVyLT5TdGFydChwRGliLCAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncywgJmNsaXBfYm94KTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIGlmIChtX0ltYWdlTWF0cml4LmEgPCAwKSB7DQotICAgICAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7DQotICAgIH0NCi0gICAgaWYgKG1fSW1hZ2VNYXRyaXguZCA+IDApIHsNCi0gICAgICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0Ow0KLSAgICB9DQotICAgIGludCBkZXN0X2xlZnQsIGRlc3RfdG9wOw0KLSAgICBkZXN0X2xlZnQgPSBkZXN0X3dpZHRoID4gMCA/IGltYWdlX3JlY3QubGVmdCA6IGltYWdlX3JlY3QucmlnaHQ7DQotICAgIGRlc3RfdG9wID0gZGVzdF9oZWlnaHQgPiAwID8gaW1hZ2VfcmVjdC50b3AgOiBpbWFnZV9yZWN0LmJvdHRvbTsNCi0gICAgaWYgKG1fcERJQlNvdXJjZS0+SXNPcGFxdWVJbWFnZSgpICYmIG1fQml0bWFwQWxwaGEgPT0gMjU1KSB7DQotICAgICAgICBpZiAobV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIG1fRmxhZ3MsIE5VTEwsIG1fQmxlbmRUeXBlKSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAobV9wRElCU291cmNlLT5Jc0FscGhhTWFzaygpKSB7DQotICAgICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpIHsNCi0gICAgICAgICAgICBtX0ZpbGxBcmdiID0gRlhBUkdCX01VTF9BTFBIQShtX0ZpbGxBcmdiLCBtX0JpdG1hcEFscGhhKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX3BEZXZpY2UtPlN0cmV0Y2hCaXRNYXNrKG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIG1fRmlsbEFyZ2IsIG1fRmxhZ3MpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOw0KKyAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsNCisgIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOw0KKyAgaW50IGRlc3RfaGVpZ2h0ID0gaW1hZ2VfcmVjdC5IZWlnaHQoKTsNCisgIGlmICgoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmIpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5hID09IDApIHx8DQorICAgICAgKEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5jKSA+PSAwLjVmIHx8IG1fSW1hZ2VNYXRyaXguZCA9PSAwKSkgew0KICAgICBpZiAobV9iUHJpbnQgJiYgIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQkxFTkRfTU9ERSkpIHsNCisgICAgICBtX1Jlc3VsdCA9IEZBTFNFOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfRElCU291cmNlKiBwRGliID0gbV9wRElCU291cmNlOw0KKyAgICBpZiAobV9wRElCU291cmNlLT5IYXNBbHBoYSgpICYmDQorICAgICAgICAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9JTUFHRSkgJiYNCisgICAgICAgICEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0dFVF9CSVRTKSkgew0KKyAgICAgIG1fcENsb25lQ29udmVydCA9IG1fcERJQlNvdXJjZS0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYik7DQorICAgICAgaWYgKCFtX3BDbG9uZUNvbnZlcnQpIHsNCiAgICAgICAgIG1fUmVzdWx0ID0gRkFMU0U7DQotICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgcERpYiA9IG1fcENsb25lQ29udmVydDsNCiAgICAgfQ0KICAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7DQotICAgIEZYX1JFQ1QgZGVzdF9yZWN0ID0gY2xpcF9ib3g7DQotICAgIGRlc3RfcmVjdC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7DQotICAgIEZYX1JFQ1QgZGVzdF9jbGlwKGRlc3RfcmVjdC5sZWZ0IC0gaW1hZ2VfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wIC0gaW1hZ2VfcmVjdC50b3AsDQotICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC5yaWdodCAtIGltYWdlX3JlY3QubGVmdCwgZGVzdF9yZWN0LmJvdHRvbSAtIGltYWdlX3JlY3QudG9wKTsNCi0gICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gbV9wRElCU291cmNlLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIG1fRmxhZ3MsICZkZXN0X2NsaXApOw0KLSAgICBpZiAocFN0cmV0Y2hlZCkgew0KLSAgICAgICAgQ29tcG9zaXRlRElCaXRtYXAocFN0cmV0Y2hlZCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3AsIG1fRmlsbEFyZ2IsIG1fQml0bWFwQWxwaGEsIG1fQmxlbmRUeXBlLCBGQUxTRSk7DQotICAgICAgICBkZWxldGUgcFN0cmV0Y2hlZDsNCi0gICAgICAgIHBTdHJldGNoZWQgPSBOVUxMOw0KKyAgICBjbGlwX2JveC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7DQorICAgIG1fU3RhdHVzID0gMjsNCisgICAgbV9wVHJhbnNmb3JtZXIgPSBGWF9ORVcgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI7DQorICAgIG1fcFRyYW5zZm9ybWVyLT5TdGFydChwRGliLCAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncywgJmNsaXBfYm94KTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAobV9JbWFnZU1hdHJpeC5hIDwgMCkgew0KKyAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7DQorICB9DQorICBpZiAobV9JbWFnZU1hdHJpeC5kID4gMCkgew0KKyAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsNCisgIH0NCisgIGludCBkZXN0X2xlZnQsIGRlc3RfdG9wOw0KKyAgZGVzdF9sZWZ0ID0gZGVzdF93aWR0aCA+IDAgPyBpbWFnZV9yZWN0LmxlZnQgOiBpbWFnZV9yZWN0LnJpZ2h0Ow0KKyAgZGVzdF90b3AgPSBkZXN0X2hlaWdodCA+IDAgPyBpbWFnZV9yZWN0LnRvcCA6IGltYWdlX3JlY3QuYm90dG9tOw0KKyAgaWYgKG1fcERJQlNvdXJjZS0+SXNPcGFxdWVJbWFnZSgpICYmIG1fQml0bWFwQWxwaGEgPT0gMjU1KSB7DQorICAgIGlmIChtX3BEZXZpY2UtPlN0cmV0Y2hESUJpdHMobV9wRElCU291cmNlLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0LCBtX0ZsYWdzLCBOVUxMLCBtX0JsZW5kVHlwZSkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCisgIH0NCisgIGlmIChtX3BESUJTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsNCisgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7DQorICAgICAgbV9GaWxsQXJnYiA9IEZYQVJHQl9NVUxfQUxQSEEobV9GaWxsQXJnYiwgbV9CaXRtYXBBbHBoYSk7DQorICAgIH0NCisgICAgaWYgKG1fcERldmljZS0+U3RyZXRjaEJpdE1hc2sobV9wRElCU291cmNlLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2hlaWdodCwgbV9GaWxsQXJnYiwgbV9GbGFncykpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIGlmIChtX2JQcmludCAmJiAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgew0KKyAgICBtX1Jlc3VsdCA9IEZBTFNFOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsNCisgIEZYX1JFQ1QgZGVzdF9yZWN0ID0gY2xpcF9ib3g7DQorICBkZXN0X3JlY3QuSW50ZXJzZWN0KGltYWdlX3JlY3QpOw0KKyAgRlhfUkVDVCBkZXN0X2NsaXAoDQorICAgICAgZGVzdF9yZWN0LmxlZnQgLSBpbWFnZV9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3AgLSBpbWFnZV9yZWN0LnRvcCwNCisgICAgICBkZXN0X3JlY3QucmlnaHQgLSBpbWFnZV9yZWN0LmxlZnQsIGRlc3RfcmVjdC5ib3R0b20gLSBpbWFnZV9yZWN0LnRvcCk7DQorICBDRlhfRElCaXRtYXAqIHBTdHJldGNoZWQgPQ0KKyAgICAgIG1fcERJQlNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX0ZsYWdzLCAmZGVzdF9jbGlwKTsNCisgIGlmIChwU3RyZXRjaGVkKSB7DQorICAgIENvbXBvc2l0ZURJQml0bWFwKHBTdHJldGNoZWQsIGRlc3RfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wLCBtX0ZpbGxBcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICBtX0JpdG1hcEFscGhhLCBtX0JsZW5kVHlwZSwgRkFMU0UpOw0KKyAgICBkZWxldGUgcFN0cmV0Y2hlZDsNCisgICAgcFN0cmV0Y2hlZCA9IE5VTEw7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JbWFnZVJlbmRlcmVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgaWYgKG1fU3RhdHVzID09IDIpIHsNCisgICAgaWYgKG1fcFRyYW5zZm9ybWVyLT5Db250aW51ZShwUGF1c2UpKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbV9wVHJhbnNmb3JtZXItPm1fU3RvcmVyLkRldGFjaCgpOw0KKyAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7DQorICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7DQorICAgICAgICBtX0ZpbGxBcmdiID0gRlhBUkdCX01VTF9BTFBIQShtX0ZpbGxBcmdiLCBtX0JpdG1hcEFscGhhKTsNCisgICAgICB9DQorICAgICAgbV9SZXN1bHQgPSBtX3BEZXZpY2UtPlNldEJpdE1hc2socEJpdG1hcCwgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0TGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFuc2Zvcm1lci0+bV9SZXN1bHRUb3AsIG1fRmlsbEFyZ2IpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgew0KKyAgICAgICAgcEJpdG1hcC0+TXVsdGlwbHlBbHBoYShtX0JpdG1hcEFscGhhKTsNCisgICAgICB9DQorICAgICAgbV9SZXN1bHQgPSBtX3BEZXZpY2UtPlNldERJQml0cyhwQml0bWFwLCBtX3BUcmFuc2Zvcm1lci0+bV9SZXN1bHRMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0VG9wLCBtX0JsZW5kVHlwZSk7DQorICAgIH0NCisgICAgZGVsZXRlIHBCaXRtYXA7DQogICAgIHJldHVybiBGQUxTRTsNCisgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gMykgew0KKyAgICByZXR1cm4gbV9wRGV2aWNlLT5Db250aW51ZURJQml0cyhtX0RldmljZUhhbmRsZSwgcFBhdXNlKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDWEZBX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQ0KLXsNCi0gICAgaWYgKG1fU3RhdHVzID09IDIpIHsNCi0gICAgICAgIGlmIChtX3BUcmFuc2Zvcm1lci0+Q29udGludWUocFBhdXNlKSkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbV9wVHJhbnNmb3JtZXItPm1fU3RvcmVyLkRldGFjaCgpOw0KLSAgICAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7DQotICAgICAgICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7DQotICAgICAgICAgICAgICAgIG1fRmlsbEFyZ2IgPSBGWEFSR0JfTVVMX0FMUEhBKG1fRmlsbEFyZ2IsIG1fQml0bWFwQWxwaGEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX1Jlc3VsdCA9IG1fcERldmljZS0+U2V0Qml0TWFzayhwQml0bWFwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwgbV9GaWxsQXJnYik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgew0KLSAgICAgICAgICAgICAgICBwQml0bWFwLT5NdWx0aXBseUFscGhhKG1fQml0bWFwQWxwaGEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtX1Jlc3VsdCA9IG1fcERldmljZS0+U2V0RElCaXRzKHBCaXRtYXAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFuc2Zvcm1lci0+bV9SZXN1bHRMZWZ0LCBtX3BUcmFuc2Zvcm1lci0+bV9SZXN1bHRUb3AsIG1fQmxlbmRUeXBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRlbGV0ZSBwQml0bWFwOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDMpIHsNCi0gICAgICAgIHJldHVybiBtX3BEZXZpY2UtPkNvbnRpbnVlRElCaXRzKG1fRGV2aWNlSGFuZGxlLCBwUGF1c2UpOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotdm9pZCBDWEZBX0ltYWdlUmVuZGVyZXI6OkNvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgRlhfQVJHQiBtYXNrX2FyZ2IsDQotICAgICAgICBpbnQgYml0bWFwX2FscGhhLCBpbnQgYmxlbmRfbW9kZSwgaW50IFRyYW5zcGFyZW5jeSkNCi17DQotICAgIGlmIChwRElCaXRtYXAgPT0gTlVMTCkgew0KK3ZvaWQgQ1hGQV9JbWFnZVJlbmRlcmVyOjpDb21wb3NpdGVESUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgbWFza19hcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfbW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFRyYW5zcGFyZW5jeSkgew0KKyAgaWYgKHBESUJpdG1hcCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYklzb2xhdGVkID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQ7DQorICBGWF9CT09MIGJHcm91cCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQOw0KKyAgaWYgKGJsZW5kX21vZGUgPT0gRlhESUJfQkxFTkRfTk9STUFMKSB7DQorICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7DQorICAgICAgaWYgKGJpdG1hcF9hbHBoYSA8IDI1NSkgew0KKyAgICAgICAgcERJQml0bWFwLT5NdWx0aXBseUFscGhhKGJpdG1hcF9hbHBoYSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX3BEZXZpY2UtPlNldERJQml0cyhwRElCaXRtYXAsIGxlZnQsIHRvcCkpIHsNCiAgICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJJc29sYXRlZCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEOw0KLSAgICBGWF9CT09MIGJHcm91cCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQOw0KLSAgICBpZiAoYmxlbmRfbW9kZSA9PSBGWERJQl9CTEVORF9OT1JNQUwpIHsNCi0gICAgICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7DQotICAgICAgICAgICAgaWYgKGJpdG1hcF9hbHBoYSA8IDI1NSkgew0KLSAgICAgICAgICAgICAgICBwRElCaXRtYXAtPk11bHRpcGx5QWxwaGEoYml0bWFwX2FscGhhKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG1fcERldmljZS0+U2V0RElCaXRzKHBESUJpdG1hcCwgbGVmdCwgdG9wKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWF9EV09SRCBmaWxsX2FyZ2IgPSAobWFza19hcmdiKTsNCi0gICAgICAgICAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1KSB7DQotICAgICAgICAgICAgICAgICgodWludDhfdCopJmZpbGxfYXJnYilbM10gPSAoKHVpbnQ4X3QqKSZmaWxsX2FyZ2IpWzNdICogYml0bWFwX2FscGhhIC8gMjU1Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5TZXRCaXRNYXNrKHBESUJpdG1hcCwgbGVmdCwgdG9wLCBmaWxsX2FyZ2IpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgRlhfQk9PTCBiQmFja0FscGhhUmVxdWlyZWQgPSBibGVuZF9tb2RlICYmIGJJc29sYXRlZDsNCi0gICAgRlhfQk9PTCBiR2V0QmFja0dyb3VuZCA9ICgobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX09VVFBVVCkpIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKSAmJiAobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBGWFJDX0dFVF9CSVRTKSAmJiAhYkJhY2tBbHBoYVJlcXVpcmVkKTsNCi0gICAgaWYgKGJHZXRCYWNrR3JvdW5kKSB7DQotICAgICAgICBpZiAoYklzb2xhdGVkIHx8ICFiR3JvdXApIHsNCi0gICAgICAgICAgICBpZiAocERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocERJQml0bWFwLCBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgcERJQml0bWFwLT5HZXRXaWR0aCgpLCB0b3AgKyBwRElCaXRtYXAtPkdldEhlaWdodCgpKTsNCi0gICAgICAgICAgICByZWN0LkludGVyc2VjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSk7DQotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmUgPSBOVUxMOw0KLSAgICAgICAgICAgIEZYX0JPT0wgYkNsb25lID0gRkFMU0U7DQotICAgICAgICAgICAgaWYgKG1fcERldmljZS0+R2V0QmFja0Ryb3AoKSAmJiBtX3BEZXZpY2UtPkdldEJpdG1hcCgpKSB7DQotICAgICAgICAgICAgICAgIGJDbG9uZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgIHBDbG9uZSA9IG1fcERldmljZS0+R2V0QmFja0Ryb3AoKS0+Q2xvbmUoJnJlY3QpOw0KLSAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAgKnBGb3JlQml0bWFwID0gbV9wRGV2aWNlLT5HZXRCaXRtYXAoKTsNCi0gICAgICAgICAgICAgICAgcENsb25lLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLCBwRm9yZUJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7DQotICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0ID49IDAgPyAwIDogbGVmdDsNCi0gICAgICAgICAgICAgICAgdG9wID0gdG9wID49IDAgPyAwIDogdG9wOw0KLSAgICAgICAgICAgICAgICBpZiAoIXBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkNCi0gICAgICAgICAgICAgICAgICAgIHBDbG9uZS0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHBDbG9uZS0+R2V0V2lkdGgoKSwgcENsb25lLT5HZXRIZWlnaHQoKSwgcERJQml0bWFwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCwgdG9wLCBibGVuZF9tb2RlKTsNCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgcENsb25lLT5Db21wb3NpdGVNYXNrKDAsIDAsIHBDbG9uZS0+R2V0V2lkdGgoKSwgcENsb25lLT5HZXRIZWlnaHQoKSwgcERJQml0bWFwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfYXJnYiwgbGVmdCwgdG9wLCBibGVuZF9tb2RlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBwQ2xvbmUgPSBwRElCaXRtYXA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCkpIHsNCi0gICAgICAgICAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocENsb25lLCByZWN0LmxlZnQsIHJlY3QudG9wKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZiAocERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocERJQml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wLCBibGVuZF9tb2RlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGJDbG9uZSkgew0KLSAgICAgICAgICAgICAgICBkZWxldGUgcENsb25lOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRFdPUkQgZmlsbF9hcmdiID0gKG1hc2tfYXJnYik7DQorICAgICAgaWYgKGJpdG1hcF9hbHBoYSA8IDI1NSkgew0KKyAgICAgICAgKCh1aW50OF90KikmZmlsbF9hcmdiKVszXSA9DQorICAgICAgICAgICAgKCh1aW50OF90KikmZmlsbF9hcmdiKVszXSAqIGJpdG1hcF9hbHBoYSAvIDI1NTsNCisgICAgICB9DQorICAgICAgaWYgKG1fcERldmljZS0+U2V0Qml0TWFzayhwRElCaXRtYXAsIGxlZnQsIHRvcCwgZmlsbF9hcmdiKSkgew0KICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAocERJQml0bWFwLT5IYXNBbHBoYSgpICYmICEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX0lNQUdFKSkgew0KLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmVDb252ZXJ0ID0gcERJQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsNCi0gICAgICAgIGlmICghcENsb25lQ29udmVydCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYkJhY2tBbHBoYVJlcXVpcmVkID0gYmxlbmRfbW9kZSAmJiBiSXNvbGF0ZWQ7DQorICBGWF9CT09MIGJHZXRCYWNrR3JvdW5kID0NCisgICAgICAoKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpKSB8fA0KKyAgICAgICghKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpICYmDQorICAgICAgIChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfR0VUX0JJVFMpICYmICFiQmFja0FscGhhUmVxdWlyZWQpOw0KKyAgaWYgKGJHZXRCYWNrR3JvdW5kKSB7DQorICAgIGlmIChiSXNvbGF0ZWQgfHwgIWJHcm91cCkgew0KKyAgICAgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocERJQml0bWFwLCBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwRElCaXRtYXAtPkdldFdpZHRoKCksDQorICAgICAgICAgICAgICAgICAgIHRvcCArIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCkpOw0KKyAgICAgIHJlY3QuSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsNCisgICAgICBDRlhfRElCaXRtYXAqIHBDbG9uZSA9IE5VTEw7DQorICAgICAgRlhfQk9PTCBiQ2xvbmUgPSBGQUxTRTsNCisgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpICYmIG1fcERldmljZS0+R2V0Qml0bWFwKCkpIHsNCisgICAgICAgIGJDbG9uZSA9IFRSVUU7DQorICAgICAgICBwQ2xvbmUgPSBtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCktPkNsb25lKCZyZWN0KTsNCisgICAgICAgIENGWF9ESUJpdG1hcCogcEZvcmVCaXRtYXAgPSBtX3BEZXZpY2UtPkdldEJpdG1hcCgpOw0KKyAgICAgICAgcENsb25lLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcmVCaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3ApOw0KKyAgICAgICAgbGVmdCA9IGxlZnQgPj0gMCA/IDAgOiBsZWZ0Ow0KKyAgICAgICAgdG9wID0gdG9wID49IDAgPyAwIDogdG9wOw0KKyAgICAgICAgaWYgKCFwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpDQorICAgICAgICAgIHBDbG9uZS0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHBDbG9uZS0+R2V0V2lkdGgoKSwgcENsb25lLT5HZXRIZWlnaHQoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERJQml0bWFwLCBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBwQ2xvbmUtPkNvbXBvc2l0ZU1hc2soMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERJQml0bWFwLCBtYXNrX2FyZ2IsIGxlZnQsIHRvcCwgYmxlbmRfbW9kZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBDbG9uZSA9IHBESUJpdG1hcDsNCisgICAgICB9DQorICAgICAgaWYgKG1fcERldmljZS0+R2V0QmFja0Ryb3AoKSkgew0KKyAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocENsb25lLCByZWN0LmxlZnQsIHJlY3QudG9wKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkgew0KKyAgICAgICAgICByZXR1cm47DQogICAgICAgICB9DQotICAgICAgICBDWEZBX0ltYWdlUmVuZGVyZXIgaW1hZ2VSZW5kZXI7DQotICAgICAgICBGWF9CT09MIGJSZXQgPSBpbWFnZVJlbmRlci5TdGFydChtX3BEZXZpY2UsIHBDbG9uZUNvbnZlcnQsIG1fRmlsbEFyZ2IsIG1fQml0bWFwQWxwaGEsICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzKTsNCi0gICAgICAgIHdoaWxlIChiUmV0KSB7DQotICAgICAgICAgICAgYlJldCA9IGltYWdlUmVuZGVyLkNvbnRpbnVlKE5VTEwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZGVsZXRlIHBDbG9uZUNvbnZlcnQ7DQotICAgICAgICByZXR1cm47DQorICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwRElCaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIGJsZW5kX21vZGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoYkNsb25lKSB7DQorICAgICAgICBkZWxldGUgcENsb25lOw0KKyAgICAgIH0NCiAgICAgfQ0KLX0NCi12b2lkIFhGQV9EcmF3SW1hZ2UoQ0ZYX0dyYXBoaWNzKiBwR1MsIGNvbnN0IENGWF9SZWN0RiAmcnRJbWFnZSwgQ0ZYX01hdHJpeCogcE1hdHJpeCwgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIGludDMyX3QgaUFzcGVjdCwgaW50MzJfdCBpSW1hZ2VYRHBpLCBpbnQzMl90IGlJbWFnZVlEcGksIGludDMyX3QgaUhvcnpBbGlnbiwgaW50MzJfdCBpVmVydEFsaWduKQ0KLXsNCi0gICAgaWYgKHJ0SW1hZ2UuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm47DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwRElCaXRtYXAtPkhhc0FscGhhKCkgJiYNCisgICAgICAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9JTUFHRSkpIHsNCisgICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmVDb252ZXJ0ID0gcERJQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsNCisgICAgaWYgKCFwQ2xvbmVDb252ZXJ0KSB7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQotICAgIGlmICghcERJQml0bWFwIHx8ICFwRElCaXRtYXAtPkdldEJ1ZmZlcigpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZldpZHRoID0gWEZBX1VuaXRQeDJQdCgoRlhfRkxPQVQpcERJQml0bWFwLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpaUltYWdlWERwaSk7DQotICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBYRkFfVW5pdFB4MlB0KChGWF9GTE9BVClwRElCaXRtYXAtPkdldEhlaWdodCgpLCAoRlhfRkxPQVQpaUltYWdlWURwaSk7DQotICAgIENGWF9SZWN0RiBydEZpdDsNCi0gICAgcnRGaXQuU2V0KHJ0SW1hZ2UubGVmdCwgcnRJbWFnZS50b3AsIGZXaWR0aCwgZkhlaWdodCk7DQotICAgIHN3aXRjaCAoaUFzcGVjdCkgew0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9GaXQ6IHsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZjEgPSBydEltYWdlLmhlaWdodCAvIHJ0Rml0LmhlaWdodDsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZjIgPSBydEltYWdlLndpZHRoIC8gcnRGaXQud2lkdGg7DQotICAgICAgICAgICAgICAgIGYxID0gRlhfTUlOKGYxLCBmMik7DQotICAgICAgICAgICAgICAgIHJ0Rml0LmhlaWdodCA9IHJ0Rml0LmhlaWdodCAqIGYxOw0KLSAgICAgICAgICAgICAgICBydEZpdC53aWR0aCA9IHJ0Rml0LndpZHRoICogZjE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BY3R1YWw6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0hlaWdodDogew0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmMSA9IHJ0SW1hZ2UuaGVpZ2h0IC8gcnRGaXQuaGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICBydEZpdC5oZWlnaHQgPSBydEltYWdlLmhlaWdodDsNCi0gICAgICAgICAgICAgICAgcnRGaXQud2lkdGggID0gZjEgKiBydEZpdC53aWR0aDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6DQotICAgICAgICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRJbWFnZS5oZWlnaHQ7DQotICAgICAgICAgICAgcnRGaXQud2lkdGggID0gcnRJbWFnZS53aWR0aDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fV2lkdGg6IHsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZjEgPSBydEltYWdlLndpZHRoIC8gcnRGaXQud2lkdGg7DQotICAgICAgICAgICAgICAgIHJ0Rml0LndpZHRoID0gcnRJbWFnZS53aWR0aDsNCi0gICAgICAgICAgICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRGaXQuaGVpZ2h0ICogZjE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGlmIChpSG9yekFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcikgew0KLSAgICAgICAgcnRGaXQubGVmdCArPSAocnRJbWFnZS53aWR0aCAtIHJ0Rml0LndpZHRoKSAvIDI7DQotICAgIH0gZWxzZSBpZiAoaUhvcnpBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KLSAgICAgICAgcnRGaXQubGVmdCA9IHJ0SW1hZ2UucmlnaHQoKSAtIHJ0Rml0LndpZHRoOw0KLSAgICB9DQotICAgIGlmIChpVmVydEFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZSkgew0KLSAgICAgICAgcnRGaXQudG9wICs9IChydEltYWdlLmhlaWdodCAtIHJ0Rml0LmhlaWdodCkgLyAyOw0KLSAgICB9IGVsc2UgaWYgKGlWZXJ0QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQotICAgICAgICBydEZpdC50b3AgPSBydEltYWdlLmJvdHRvbSgpIC0gcnRJbWFnZS5oZWlnaHQ7DQotICAgIH0NCi0gICAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHUy0+R2V0UmVuZGVyRGV2aWNlKCk7DQotICAgIHBSZW5kZXJEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KLSAgICBDRlhfUGF0aERhdGEgcGF0aDsNCi0gICAgcGF0aC5BcHBlbmRSZWN0KHJ0SW1hZ2UubGVmdCwgcnRJbWFnZS5ib3R0b20oKSwgcnRJbWFnZS5yaWdodCgpLCBydEltYWdlLnRvcCk7DQotICAgIHBSZW5kZXJEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwoJnBhdGgsIHBNYXRyaXgsIEZYRklMTF9XSU5ESU5HKTsNCi0gICAgQ0ZYX01hdHJpeCBtdEltYWdlKDEsIDAsIDAsIC0xLCAwLCAxKTsNCi0gICAgbXRJbWFnZS5Db25jYXQocnRGaXQud2lkdGgsIDAsIDAsIHJ0Rml0LmhlaWdodCwgcnRGaXQubGVmdCwgcnRGaXQudG9wKTsNCi0gICAgbXRJbWFnZS5Db25jYXQoKnBNYXRyaXgpOw0KICAgICBDWEZBX0ltYWdlUmVuZGVyZXIgaW1hZ2VSZW5kZXI7DQotICAgIEZYX0JPT0wgYlJldCA9IGltYWdlUmVuZGVyLlN0YXJ0KHBSZW5kZXJEZXZpY2UsIHBESUJpdG1hcCwgMCwgMjU1LCAmbXRJbWFnZSwgRlhESUJfSU5URVJQT0wpOw0KKyAgICBGWF9CT09MIGJSZXQgPSBpbWFnZVJlbmRlci5TdGFydChtX3BEZXZpY2UsIHBDbG9uZUNvbnZlcnQsIG1fRmlsbEFyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQml0bWFwQWxwaGEsICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzKTsNCiAgICAgd2hpbGUgKGJSZXQpIHsNCi0gICAgICAgIGJSZXQgPSBpbWFnZVJlbmRlci5Db250aW51ZShOVUxMKTsNCisgICAgICBiUmV0ID0gaW1hZ2VSZW5kZXIuQ29udGludWUoTlVMTCk7DQogICAgIH0NCi0gICAgcFJlbmRlckRldmljZS0+UmVzdG9yZVN0YXRlKCk7DQorICAgIGRlbGV0ZSBwQ2xvbmVDb252ZXJ0Ow0KKyAgICByZXR1cm47DQorICB9DQorfQ0KK3ZvaWQgWEZBX0RyYXdJbWFnZShDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEltYWdlLA0KKyAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQXNwZWN0LA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbWFnZVhEcGksDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUltYWdlWURwaSwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSG9yekFsaWduLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWZXJ0QWxpZ24pIHsNCisgIGlmIChydEltYWdlLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoIXBESUJpdG1hcCB8fCAhcERJQml0bWFwLT5HZXRCdWZmZXIoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCBmV2lkdGggPQ0KKyAgICAgIFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBESUJpdG1hcC0+R2V0V2lkdGgoKSwgKEZYX0ZMT0FUKWlJbWFnZVhEcGkpOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9DQorICAgICAgWEZBX1VuaXRQeDJQdCgoRlhfRkxPQVQpcERJQml0bWFwLT5HZXRIZWlnaHQoKSwgKEZYX0ZMT0FUKWlJbWFnZVlEcGkpOw0KKyAgQ0ZYX1JlY3RGIHJ0Rml0Ow0KKyAgcnRGaXQuU2V0KHJ0SW1hZ2UubGVmdCwgcnRJbWFnZS50b3AsIGZXaWR0aCwgZkhlaWdodCk7DQorICBzd2l0Y2ggKGlBc3BlY3QpIHsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9GaXQ6IHsNCisgICAgICBGWF9GTE9BVCBmMSA9IHJ0SW1hZ2UuaGVpZ2h0IC8gcnRGaXQuaGVpZ2h0Ow0KKyAgICAgIEZYX0ZMT0FUIGYyID0gcnRJbWFnZS53aWR0aCAvIHJ0Rml0LndpZHRoOw0KKyAgICAgIGYxID0gRlhfTUlOKGYxLCBmMik7DQorICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRGaXQuaGVpZ2h0ICogZjE7DQorICAgICAgcnRGaXQud2lkdGggPSBydEZpdC53aWR0aCAqIGYxOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0FjdHVhbDoNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9IZWlnaHQ6IHsNCisgICAgICBGWF9GTE9BVCBmMSA9IHJ0SW1hZ2UuaGVpZ2h0IC8gcnRGaXQuaGVpZ2h0Ow0KKyAgICAgIHJ0Rml0LmhlaWdodCA9IHJ0SW1hZ2UuaGVpZ2h0Ow0KKyAgICAgIHJ0Rml0LndpZHRoID0gZjEgKiBydEZpdC53aWR0aDsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOg0KKyAgICAgIHJ0Rml0LmhlaWdodCA9IHJ0SW1hZ2UuaGVpZ2h0Ow0KKyAgICAgIHJ0Rml0LndpZHRoID0gcnRJbWFnZS53aWR0aDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9XaWR0aDogew0KKyAgICAgIEZYX0ZMT0FUIGYxID0gcnRJbWFnZS53aWR0aCAvIHJ0Rml0LndpZHRoOw0KKyAgICAgIHJ0Rml0LndpZHRoID0gcnRJbWFnZS53aWR0aDsNCisgICAgICBydEZpdC5oZWlnaHQgPSBydEZpdC5oZWlnaHQgKiBmMTsNCisgICAgfSBicmVhazsNCisgIH0NCisgIGlmIChpSG9yekFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcikgew0KKyAgICBydEZpdC5sZWZ0ICs9IChydEltYWdlLndpZHRoIC0gcnRGaXQud2lkdGgpIC8gMjsNCisgIH0gZWxzZSBpZiAoaUhvcnpBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KKyAgICBydEZpdC5sZWZ0ID0gcnRJbWFnZS5yaWdodCgpIC0gcnRGaXQud2lkdGg7DQorICB9DQorICBpZiAoaVZlcnRBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGUpIHsNCisgICAgcnRGaXQudG9wICs9IChydEltYWdlLmhlaWdodCAtIHJ0Rml0LmhlaWdodCkgLyAyOw0KKyAgfSBlbHNlIGlmIChpVmVydEFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbSkgew0KKyAgICBydEZpdC50b3AgPSBydEltYWdlLmJvdHRvbSgpIC0gcnRJbWFnZS5oZWlnaHQ7DQorICB9DQorICBDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlID0gcEdTLT5HZXRSZW5kZXJEZXZpY2UoKTsNCisgIHBSZW5kZXJEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7DQorICBwYXRoLkFwcGVuZFJlY3QocnRJbWFnZS5sZWZ0LCBydEltYWdlLmJvdHRvbSgpLCBydEltYWdlLnJpZ2h0KCksIHJ0SW1hZ2UudG9wKTsNCisgIHBSZW5kZXJEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwoJnBhdGgsIHBNYXRyaXgsIEZYRklMTF9XSU5ESU5HKTsNCisgIENGWF9NYXRyaXggbXRJbWFnZSgxLCAwLCAwLCAtMSwgMCwgMSk7DQorICBtdEltYWdlLkNvbmNhdChydEZpdC53aWR0aCwgMCwgMCwgcnRGaXQuaGVpZ2h0LCBydEZpdC5sZWZ0LCBydEZpdC50b3ApOw0KKyAgbXRJbWFnZS5Db25jYXQoKnBNYXRyaXgpOw0KKyAgQ1hGQV9JbWFnZVJlbmRlcmVyIGltYWdlUmVuZGVyOw0KKyAgRlhfQk9PTCBiUmV0ID0gaW1hZ2VSZW5kZXIuU3RhcnQocFJlbmRlckRldmljZSwgcERJQml0bWFwLCAwLCAyNTUsICZtdEltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfSU5URVJQT0wpOw0KKyAgd2hpbGUgKGJSZXQpIHsNCisgICAgYlJldCA9IGltYWdlUmVuZGVyLkNvbnRpbnVlKE5VTEwpOw0KKyAgfQ0KKyAgcFJlbmRlckRldmljZS0+UmVzdG9yZVN0YXRlKCk7DQogfQ0KIGNvbnN0IHN0YXRpYyB1aW50OF90IGdfaW52X2Jhc2U2NFsxMjhdID0gew0KLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwNCi0gICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsDQotICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LA0KLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwNCi0gICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsDQotICAgIDI1NSwgMjU1LCAyNTUsICA2MiwgMjU1LCAyNTUsIDI1NSwgIDYzLA0KLSAgICA1MiwgICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwNCi0gICAgNjAsICAgNjEsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsDQotICAgIDI1NSwgICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LA0KLSAgICA3LCAgICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwNCi0gICAgMTUsICAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsDQotICAgIDIzLCAgIDI0LCAgMjUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LA0KLSAgICAyNTUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsICAzMiwNCi0gICAgMzMsICAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsDQotICAgIDQxLCAgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LA0KLSAgICA0OSwgICA1MCwgIDUxLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwNCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwNCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwNCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCA2MiwgIDI1NSwNCisgICAgMjU1LCAyNTUsIDYzLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICAyNTUsIDI1NSwNCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksDQorICAgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwNCisgICAgMjUsICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsICAzMiwgIDMzLA0KKyAgICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsDQorICAgIDQ5LCAgNTAsICA1MSwgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LA0KIH07DQotc3RhdGljIHVpbnQ4X3QqIFhGQV9SZW1vdmVCYXNlNjRXaGl0ZXNwYWNlKGNvbnN0IHVpbnQ4X3QqIHBTdHIsIGludDMyX3QgaUxlbikNCi17DQotICAgIHVpbnQ4X3QqIHBDUDsNCi0gICAgaW50MzJfdCBpID0gMCwgaiA9IDA7DQotICAgIGlmIChpTGVuID09IDApIHsNCi0gICAgICAgIGlMZW4gPSBGWFNZU19zdHJsZW4oKEZYX0NIQVIqKXBTdHIpOw0KK3N0YXRpYyB1aW50OF90KiBYRkFfUmVtb3ZlQmFzZTY0V2hpdGVzcGFjZShjb25zdCB1aW50OF90KiBwU3RyLCBpbnQzMl90IGlMZW4pIHsNCisgIHVpbnQ4X3QqIHBDUDsNCisgIGludDMyX3QgaSA9IDAsIGogPSAwOw0KKyAgaWYgKGlMZW4gPT0gMCkgew0KKyAgICBpTGVuID0gRlhTWVNfc3RybGVuKChGWF9DSEFSKilwU3RyKTsNCisgIH0NCisgIHBDUCA9ICh1aW50OF90KilGREVfQWxsb2MoaUxlbiArIDEpOw0KKyAgZm9yICg7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgaWYgKChwU3RyW2ldICYgMTI4KSA9PSAwKSB7DQorICAgICAgaWYgKGdfaW52X2Jhc2U2NFtwU3RyW2ldXSAhPSAweEZGIHx8IHBTdHJbaV0gPT0gJz0nKSB7DQorICAgICAgICBwQ1BbaisrXSA9IHBTdHJbaV07DQorICAgICAgfQ0KICAgICB9DQotICAgIHBDUCA9ICh1aW50OF90KilGREVfQWxsb2MoaUxlbiArIDEpOw0KLSAgICBmb3IgKDsgaSA8IGlMZW47IGkrKykgew0KLSAgICAgICAgaWYgKChwU3RyW2ldICYgMTI4KSA9PSAwKSB7DQotICAgICAgICAgICAgaWYgKGdfaW52X2Jhc2U2NFtwU3RyW2ldXSAhPSAweEZGIHx8IHBTdHJbaV0gPT0gJz0nKSB7DQotICAgICAgICAgICAgICAgIHBDUFtqKytdID0gcFN0cltpXTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcENQW2pdID0gJ1wwJzsNCi0gICAgcmV0dXJuIHBDUDsNCisgIH0NCisgIHBDUFtqXSA9ICdcMCc7DQorICByZXR1cm4gcENQOw0KIH0NCi1zdGF0aWMgaW50MzJfdCBYRkFfQmFzZTY0RGVjb2RlKGNvbnN0IEZYX0NIQVIqIHBTdHIsIHVpbnQ4X3QqIHBPdXRCdWZmZXIpDQotew0KLSAgICBpZiAocFN0ciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB1aW50OF90KiBwQnVmZmVyID0gWEZBX1JlbW92ZUJhc2U2NFdoaXRlc3BhY2UoKHVpbnQ4X3QqKXBTdHIsIEZYU1lTX3N0cmxlbigoRlhfQ0hBUiopcFN0cikpOw0KLSAgICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlMZW4gPSBGWFNZU19zdHJsZW4oKEZYX0NIQVIqKXBCdWZmZXIpOw0KLSAgICBpbnQzMl90IGkgPSAwLCBqID0gMDsNCi0gICAgRlhfRFdPUkQgZHdMaW1iID0gMDsNCi0gICAgZm9yICg7IGkgKyAzIDwgaUxlbjsgaSArPSA0KSB7DQotICAgICAgICBpZiAocEJ1ZmZlcltpXSA9PSAnPScgfHwgcEJ1ZmZlcltpICsgMV0gPT0gJz0nDQotICAgICAgICAgICAgICAgIHx8IHBCdWZmZXJbaSArIDJdID09ICc9JyB8fCBwQnVmZmVyW2kgKyAzXSA9PSAnPScpIHsNCi0gICAgICAgICAgICBpZiAocEJ1ZmZlcltpXSA9PSAnPScgfHwgcEJ1ZmZlcltpICsgMV0gPT0gJz0nKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocEJ1ZmZlcltpICsgMl0gPT0gJz0nKSB7DQotICAgICAgICAgICAgICAgIGR3TGltYiA9ICgoRlhfRFdPUkQpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaV1dIDw8IDYpDQotICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgMV1dKTsNCi0gICAgICAgICAgICAgICAgcE91dEJ1ZmZlcltqXSA9ICh1aW50OF90KShkd0xpbWIgPj4gNCkgJiAweEZGOw0KLSAgICAgICAgICAgICAgICBqKys7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZHdMaW1iID0gKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpXV0gPDwgMTIpIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgMV1dIDw8IDYpIHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgMl1dKTsNCi0gICAgICAgICAgICAgICAgcE91dEJ1ZmZlcltqXSA9ICh1aW50OF90KShkd0xpbWIgPj4gMTApICYgMHhGRjsNCi0gICAgICAgICAgICAgICAgcE91dEJ1ZmZlcltqICsgMV0gPSAodWludDhfdCkoZHdMaW1iID4+IDIpICYgMHhGRjsNCi0gICAgICAgICAgICAgICAgaiArPSAyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZHdMaW1iID0gKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpXV0gPDwgMTgpIHwNCi0gICAgICAgICAgICAgICAgICAgICAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAxXV0gPDwgMTIpIHwNCi0gICAgICAgICAgICAgICAgICAgICAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAyXV0gPDwgNikgfA0KLSAgICAgICAgICAgICAgICAgICAgICgoRlhfRFdPUkQpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaSArIDNdXSk7DQotICAgICAgICAgICAgcE91dEJ1ZmZlcltqXSA9ICh1aW50OF90KShkd0xpbWIgPj4gMTYpICYgMHhmZjsNCi0gICAgICAgICAgICBwT3V0QnVmZmVyW2ogKyAxXSA9ICh1aW50OF90KShkd0xpbWIgPj4gOCkgJiAweGZmOw0KLSAgICAgICAgICAgIHBPdXRCdWZmZXJbaiArIDJdID0gKHVpbnQ4X3QpKGR3TGltYikgJiAweGZmOw0KLSAgICAgICAgICAgIGogKz0gMzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGREVfRnJlZShwQnVmZmVyKTsNCi0gICAgcmV0dXJuIGo7DQotfQ0KLXN0YXRpYyBGWF9DSEFSIGdfYmFzZTY0X2NoYXJzW10gPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7DQotRlhfQ0hBUiogWEZBX0Jhc2U2NEVuY29kZShjb25zdCB1aW50OF90KiBidWYsIGludDMyX3QgYnVmX2xlbikNCi17DQotICAgIEZYX0NIQVIqIG91dCA9IE5VTEw7DQotICAgIGludCBpLCBqOw0KLSAgICBGWF9EV09SRCBsaW1iOw0KLSAgICBvdXQgPSAoRlhfQ0hBUiopRlhfQWxsb2MoRlhfQ0hBUiwgKChidWZfbGVuICogOCArIDUpIC8gNikgKyA1KTsNCi0gICAgZm9yIChpID0gMCwgaiA9IDAsIGxpbWIgPSAwOyBpICsgMiA8IGJ1Zl9sZW47IGkgKz0gMywgaiArPSA0KSB7DQotICAgICAgICBsaW1iID0NCi0gICAgICAgICAgICAoKEZYX0RXT1JEKWJ1ZltpXSA8PCAxNikgfA0KLSAgICAgICAgICAgICgoRlhfRFdPUkQpYnVmW2kgKyAxXSA8PCA4KSB8DQotICAgICAgICAgICAgKChGWF9EV09SRClidWZbaSArIDJdKTsNCi0gICAgICAgIG91dFtqXSA9IGdfYmFzZTY0X2NoYXJzWyhsaW1iID4+IDE4KSAmIDYzXTsNCi0gICAgICAgIG91dFtqICsgMV0gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiAxMikgJiA2M107DQotICAgICAgICBvdXRbaiArIDJdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPj4gNikgJiA2M107DQotICAgICAgICBvdXRbaiArIDNdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIpICYgNjNdOw0KLSAgICB9DQotICAgIHN3aXRjaCAoYnVmX2xlbiAtIGkpIHsNCi0gICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICBsaW1iID0gKChGWF9EV09SRClidWZbaV0pOw0KLSAgICAgICAgICAgIG91dFtqKytdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPj4gMikgJiA2M107DQotICAgICAgICAgICAgb3V0W2orK10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA8PCA0KSAmIDYzXTsNCi0gICAgICAgICAgICBvdXRbaisrXSA9ICc9JzsNCi0gICAgICAgICAgICBvdXRbaisrXSA9ICc9JzsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICBsaW1iID0gKChGWF9EV09SRClidWZbaV0gPDwgOCkgfCAoKEZYX0RXT1JEKWJ1ZltpICsgMV0pOw0KLSAgICAgICAgICAgIG91dFtqKytdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPj4gMTApICYgNjNdOw0KLSAgICAgICAgICAgIG91dFtqKytdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPj4gNCkgJiA2M107DQotICAgICAgICAgICAgb3V0W2orK10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA8PCAyKSAmIDYzXTsNCi0gICAgICAgICAgICBvdXRbaisrXSA9ICc9JzsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgb3V0W2pdID0gJ1wwJzsNCi0gICAgcmV0dXJuIG91dDsNCi19DQotRlhDT0RFQ19JTUFHRV9UWVBFIFhGQV9HZXRJbWFnZVR5cGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1R5cGUpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlKHdzVHlwZSk7DQotICAgIHdzQ29udGVudFR5cGUuTWFrZUxvd2VyKCk7DQotICAgIGlmICh3c0NvbnRlbnRUeXBlID09IEZYX1dTVFJDKEwiaW1hZ2UvanBnIikpIHsNCi0gICAgICAgIHJldHVybiBGWENPREVDX0lNQUdFX0pQRzsNCi0gICAgfQ0KLSAgICBpZiAod3NDb250ZW50VHlwZSA9PSBGWF9XU1RSQyhMImltYWdlL3BuZyIpKSB7DQotICAgICAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9QTkc7DQotICAgIH0NCi0gICAgaWYgKHdzQ29udGVudFR5cGUgPT0gRlhfV1NUUkMoTCJpbWFnZS9naWYiKSkgew0KLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfR0lGOw0KLSAgICB9DQotICAgIGlmICh3c0NvbnRlbnRUeXBlID09IEZYX1dTVFJDKEwiaW1hZ2UvYm1wIikpIHsNCi0gICAgICAgIHJldHVybiBGWENPREVDX0lNQUdFX0JNUDsNCi0gICAgfQ0KLSAgICBpZiAod3NDb250ZW50VHlwZSA9PSBGWF9XU1RSQyhMImltYWdlL3RpZiIpKSB7DQotICAgICAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9USUY7DQotICAgIH0NCi0gICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfVU5LTk9XTjsNCi19DQotQ0ZYX0RJQml0bWFwKiBYRkFfTG9hZEltYWdlRGF0YShDWEZBX0ZGRG9jICpwRG9jLCBDWEZBX0ltYWdlICpwSW1hZ2UsIEZYX0JPT0wgJmJOYW1lSW1hZ2UsIGludDMyX3QgJmlJbWFnZVhEcGksIGludDMyX3QgJmlJbWFnZVlEcGkpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0hyZWY7DQotICAgIHBJbWFnZS0+R2V0SHJlZih3c0hyZWYpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0ltYWdlOw0KLSAgICBwSW1hZ2UtPkdldENvbnRlbnQod3NJbWFnZSk7DQotICAgIGlmICh3c0hyZWYuSXNFbXB0eSgpICYmIHdzSW1hZ2UuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KLSAgICBwSW1hZ2UtPkdldENvbnRlbnRUeXBlKHdzQ29udGVudFR5cGUpOw0KLSAgICBGWENPREVDX0lNQUdFX1RZUEUgdHlwZSA9IFhGQV9HZXRJbWFnZVR5cGUod3NDb250ZW50VHlwZSk7DQotICAgIENGWF9CeXRlU3RyaW5nIGJzQ29udGVudDsNCi0gICAgdWludDhfdCogcEltYWdlQnVmZmVyID0gTlVMTDsNCi0gICAgSUZYX0ZpbGVSZWFkKiBwSW1hZ2VGaWxlUmVhZCA9IE5VTEw7DQotICAgIGlmICh3c0ltYWdlLkdldExlbmd0aCgpID4gMCkgew0KLSAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gaUVuY29kaW5nID0gKFhGQV9BVFRSSUJVVEVFTlVNKXBJbWFnZS0+R2V0VHJhbnNmZXJFbmNvZGluZygpOw0KLSAgICAgICAgaWYgKGlFbmNvZGluZyA9PSBYRkFfQVRUUklCVVRFRU5VTV9CYXNlNjQpIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0RhdGEgPSB3c0ltYWdlLlVURjhFbmNvZGUoKTsNCi0gICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSBic0RhdGEuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgcEltYWdlQnVmZmVyID0gRkRFX0FsbG9jKGlMZW5ndGgpOw0KLSAgICAgICAgICAgIGludDMyX3QgaVJlYWQgPSBYRkFfQmFzZTY0RGVjb2RlKChjb25zdCBGWF9DSEFSKilic0RhdGEsIHBJbWFnZUJ1ZmZlcik7DQotICAgICAgICAgICAgaWYgKGlSZWFkID4gMCkgew0KLSAgICAgICAgICAgICAgICBwSW1hZ2VGaWxlUmVhZCA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwSW1hZ2VCdWZmZXIsIGlSZWFkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGJzQ29udGVudCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c0ltYWdlKTsNCi0gICAgICAgICAgICBwSW1hZ2VGaWxlUmVhZCA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgodWludDhfdCopKGNvbnN0IHVpbnQ4X3QqKWJzQ29udGVudCwgYnNDb250ZW50LkdldExlbmd0aCgpKTsNCi0gICAgICAgIH0NCitzdGF0aWMgaW50MzJfdCBYRkFfQmFzZTY0RGVjb2RlKGNvbnN0IEZYX0NIQVIqIHBTdHIsIHVpbnQ4X3QqIHBPdXRCdWZmZXIpIHsNCisgIGlmIChwU3RyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB1aW50OF90KiBwQnVmZmVyID0NCisgICAgICBYRkFfUmVtb3ZlQmFzZTY0V2hpdGVzcGFjZSgodWludDhfdCopcFN0ciwgRlhTWVNfc3RybGVuKChGWF9DSEFSKilwU3RyKSk7DQorICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuID0gRlhTWVNfc3RybGVuKChGWF9DSEFSKilwQnVmZmVyKTsNCisgIGludDMyX3QgaSA9IDAsIGogPSAwOw0KKyAgRlhfRFdPUkQgZHdMaW1iID0gMDsNCisgIGZvciAoOyBpICsgMyA8IGlMZW47IGkgKz0gNCkgew0KKyAgICBpZiAocEJ1ZmZlcltpXSA9PSAnPScgfHwgcEJ1ZmZlcltpICsgMV0gPT0gJz0nIHx8IHBCdWZmZXJbaSArIDJdID09ICc9JyB8fA0KKyAgICAgICAgcEJ1ZmZlcltpICsgM10gPT0gJz0nKSB7DQorICAgICAgaWYgKHBCdWZmZXJbaV0gPT0gJz0nIHx8IHBCdWZmZXJbaSArIDFdID09ICc9Jykgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChwQnVmZmVyW2kgKyAyXSA9PSAnPScpIHsNCisgICAgICAgIGR3TGltYiA9ICgoRlhfRFdPUkQpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaV1dIDw8IDYpIHwNCisgICAgICAgICAgICAgICAgICgoRlhfRFdPUkQpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaSArIDFdXSk7DQorICAgICAgICBwT3V0QnVmZmVyW2pdID0gKHVpbnQ4X3QpKGR3TGltYiA+PiA0KSAmIDB4RkY7DQorICAgICAgICBqKys7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGR3TGltYiA9ICgoRlhfRFdPUkQpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaV1dIDw8IDEyKSB8DQorICAgICAgICAgICAgICAgICAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAxXV0gPDwgNikgfA0KKyAgICAgICAgICAgICAgICAgKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgMl1dKTsNCisgICAgICAgIHBPdXRCdWZmZXJbal0gPSAodWludDhfdCkoZHdMaW1iID4+IDEwKSAmIDB4RkY7DQorICAgICAgICBwT3V0QnVmZmVyW2ogKyAxXSA9ICh1aW50OF90KShkd0xpbWIgPj4gMikgJiAweEZGOw0KKyAgICAgICAgaiArPSAyOw0KKyAgICAgIH0NCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVVJMID0gd3NIcmVmOw0KLSAgICAgICAgaWYgKHdzVVJMLkxlZnQoNykgIT0gRlhfV1NUUkMoTCJodHRwOi8vIikgJiYgd3NVUkwuTGVmdCg2KSAhPSBGWF9XU1RSQyhMImZ0cDovLyIpKSB7DQotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwICpwQml0bWFwID0gcERvYy0+R2V0UERGTmFtZWRJbWFnZSh3c1VSTCwgaUltYWdlWERwaSwgaUltYWdlWURwaSk7DQotICAgICAgICAgICAgaWYgKHBCaXRtYXAgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBiTmFtZUltYWdlID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBCaXRtYXA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcEltYWdlRmlsZVJlYWQgPSBwRG9jLT5HZXREb2NQcm92aWRlcigpLT5PcGVuTGlua2VkRmlsZShwRG9jLCB3c1VSTCk7DQorICAgICAgZHdMaW1iID0gKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpXV0gPDwgMTgpIHwNCisgICAgICAgICAgICAgICAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAxXV0gPDwgMTIpIHwNCisgICAgICAgICAgICAgICAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAyXV0gPDwgNikgfA0KKyAgICAgICAgICAgICAgICgoRlhfRFdPUkQpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaSArIDNdXSk7DQorICAgICAgcE91dEJ1ZmZlcltqXSA9ICh1aW50OF90KShkd0xpbWIgPj4gMTYpICYgMHhmZjsNCisgICAgICBwT3V0QnVmZmVyW2ogKyAxXSA9ICh1aW50OF90KShkd0xpbWIgPj4gOCkgJiAweGZmOw0KKyAgICAgIHBPdXRCdWZmZXJbaiArIDJdID0gKHVpbnQ4X3QpKGR3TGltYikmMHhmZjsNCisgICAgICBqICs9IDM7DQogICAgIH0NCi0gICAgaWYgKCFwSW1hZ2VGaWxlUmVhZCkgew0KLSAgICAgICAgaWYgKHBJbWFnZUJ1ZmZlcikgew0KLSAgICAgICAgICAgIEZERV9GcmVlKHBJbWFnZUJ1ZmZlcik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZERV9GcmVlKHBCdWZmZXIpOw0KKyAgcmV0dXJuIGo7DQorfQ0KK3N0YXRpYyBGWF9DSEFSIGdfYmFzZTY0X2NoYXJzW10gPQ0KKyAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7DQorRlhfQ0hBUiogWEZBX0Jhc2U2NEVuY29kZShjb25zdCB1aW50OF90KiBidWYsIGludDMyX3QgYnVmX2xlbikgew0KKyAgRlhfQ0hBUiogb3V0ID0gTlVMTDsNCisgIGludCBpLCBqOw0KKyAgRlhfRFdPUkQgbGltYjsNCisgIG91dCA9IChGWF9DSEFSKilGWF9BbGxvYyhGWF9DSEFSLCAoKGJ1Zl9sZW4gKiA4ICsgNSkgLyA2KSArIDUpOw0KKyAgZm9yIChpID0gMCwgaiA9IDAsIGxpbWIgPSAwOyBpICsgMiA8IGJ1Zl9sZW47IGkgKz0gMywgaiArPSA0KSB7DQorICAgIGxpbWIgPSAoKEZYX0RXT1JEKWJ1ZltpXSA8PCAxNikgfCAoKEZYX0RXT1JEKWJ1ZltpICsgMV0gPDwgOCkgfA0KKyAgICAgICAgICAgKChGWF9EV09SRClidWZbaSArIDJdKTsNCisgICAgb3V0W2pdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPj4gMTgpICYgNjNdOw0KKyAgICBvdXRbaiArIDFdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPj4gMTIpICYgNjNdOw0KKyAgICBvdXRbaiArIDJdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPj4gNikgJiA2M107DQorICAgIG91dFtqICsgM10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYikmNjNdOw0KKyAgfQ0KKyAgc3dpdGNoIChidWZfbGVuIC0gaSkgew0KKyAgICBjYXNlIDA6DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMToNCisgICAgICBsaW1iID0gKChGWF9EV09SRClidWZbaV0pOw0KKyAgICAgIG91dFtqKytdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPj4gMikgJiA2M107DQorICAgICAgb3V0W2orK10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA8PCA0KSAmIDYzXTsNCisgICAgICBvdXRbaisrXSA9ICc9JzsNCisgICAgICBvdXRbaisrXSA9ICc9JzsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIGxpbWIgPSAoKEZYX0RXT1JEKWJ1ZltpXSA8PCA4KSB8ICgoRlhfRFdPUkQpYnVmW2kgKyAxXSk7DQorICAgICAgb3V0W2orK10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiAxMCkgJiA2M107DQorICAgICAgb3V0W2orK10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiA0KSAmIDYzXTsNCisgICAgICBvdXRbaisrXSA9IGdfYmFzZTY0X2NoYXJzWyhsaW1iIDw8IDIpICYgNjNdOw0KKyAgICAgIG91dFtqKytdID0gJz0nOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgb3V0W2pdID0gJ1wwJzsNCisgIHJldHVybiBvdXQ7DQorfQ0KK0ZYQ09ERUNfSU1BR0VfVFlQRSBYRkFfR2V0SW1hZ2VUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUeXBlKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlKHdzVHlwZSk7DQorICB3c0NvbnRlbnRUeXBlLk1ha2VMb3dlcigpOw0KKyAgaWYgKHdzQ29udGVudFR5cGUgPT0gRlhfV1NUUkMoTCJpbWFnZS9qcGciKSkgew0KKyAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9KUEc7DQorICB9DQorICBpZiAod3NDb250ZW50VHlwZSA9PSBGWF9XU1RSQyhMImltYWdlL3BuZyIpKSB7DQorICAgIHJldHVybiBGWENPREVDX0lNQUdFX1BORzsNCisgIH0NCisgIGlmICh3c0NvbnRlbnRUeXBlID09IEZYX1dTVFJDKEwiaW1hZ2UvZ2lmIikpIHsNCisgICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfR0lGOw0KKyAgfQ0KKyAgaWYgKHdzQ29udGVudFR5cGUgPT0gRlhfV1NUUkMoTCJpbWFnZS9ibXAiKSkgew0KKyAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9CTVA7DQorICB9DQorICBpZiAod3NDb250ZW50VHlwZSA9PSBGWF9XU1RSQyhMImltYWdlL3RpZiIpKSB7DQorICAgIHJldHVybiBGWENPREVDX0lNQUdFX1RJRjsNCisgIH0NCisgIHJldHVybiBGWENPREVDX0lNQUdFX1VOS05PV047DQorfQ0KK0NGWF9ESUJpdG1hcCogWEZBX0xvYWRJbWFnZURhdGEoQ1hGQV9GRkRvYyogcERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfSW1hZ2UqIHBJbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJOYW1lSW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VYRHBpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUltYWdlWURwaSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NIcmVmOw0KKyAgcEltYWdlLT5HZXRIcmVmKHdzSHJlZik7DQorICBDRlhfV2lkZVN0cmluZyB3c0ltYWdlOw0KKyAgcEltYWdlLT5HZXRDb250ZW50KHdzSW1hZ2UpOw0KKyAgaWYgKHdzSHJlZi5Jc0VtcHR5KCkgJiYgd3NJbWFnZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgcEltYWdlLT5HZXRDb250ZW50VHlwZSh3c0NvbnRlbnRUeXBlKTsNCisgIEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlID0gWEZBX0dldEltYWdlVHlwZSh3c0NvbnRlbnRUeXBlKTsNCisgIENGWF9CeXRlU3RyaW5nIGJzQ29udGVudDsNCisgIHVpbnQ4X3QqIHBJbWFnZUJ1ZmZlciA9IE5VTEw7DQorICBJRlhfRmlsZVJlYWQqIHBJbWFnZUZpbGVSZWFkID0gTlVMTDsNCisgIGlmICh3c0ltYWdlLkdldExlbmd0aCgpID4gMCkgew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBpRW5jb2RpbmcgPQ0KKyAgICAgICAgKFhGQV9BVFRSSUJVVEVFTlVNKXBJbWFnZS0+R2V0VHJhbnNmZXJFbmNvZGluZygpOw0KKyAgICBpZiAoaUVuY29kaW5nID09IFhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NCkgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzRGF0YSA9IHdzSW1hZ2UuVVRGOEVuY29kZSgpOw0KKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IGJzRGF0YS5HZXRMZW5ndGgoKTsNCisgICAgICBwSW1hZ2VCdWZmZXIgPSBGREVfQWxsb2MoaUxlbmd0aCk7DQorICAgICAgaW50MzJfdCBpUmVhZCA9IFhGQV9CYXNlNjREZWNvZGUoKGNvbnN0IEZYX0NIQVIqKWJzRGF0YSwgcEltYWdlQnVmZmVyKTsNCisgICAgICBpZiAoaVJlYWQgPiAwKSB7DQorICAgICAgICBwSW1hZ2VGaWxlUmVhZCA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwSW1hZ2VCdWZmZXIsIGlSZWFkKTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgYnNDb250ZW50ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzSW1hZ2UpOw0KKyAgICAgIHBJbWFnZUZpbGVSZWFkID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKA0KKyAgICAgICAgICAodWludDhfdCopKGNvbnN0IHVpbnQ4X3QqKWJzQ29udGVudCwgYnNDb250ZW50LkdldExlbmd0aCgpKTsNCiAgICAgfQ0KLSAgICBiTmFtZUltYWdlID0gRkFMU0U7DQotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKHBJbWFnZUZpbGVSZWFkLCB0eXBlLCBpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVVJMID0gd3NIcmVmOw0KKyAgICBpZiAod3NVUkwuTGVmdCg3KSAhPSBGWF9XU1RSQyhMImh0dHA6Ly8iKSAmJg0KKyAgICAgICAgd3NVUkwuTGVmdCg2KSAhPSBGWF9XU1RSQyhMImZ0cDovLyIpKSB7DQorICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0NCisgICAgICAgICAgcERvYy0+R2V0UERGTmFtZWRJbWFnZSh3c1VSTCwgaUltYWdlWERwaSwgaUltYWdlWURwaSk7DQorICAgICAgaWYgKHBCaXRtYXAgIT0gTlVMTCkgew0KKyAgICAgICAgYk5hbWVJbWFnZSA9IFRSVUU7DQorICAgICAgICByZXR1cm4gcEJpdG1hcDsNCisgICAgICB9DQorICAgIH0NCisgICAgcEltYWdlRmlsZVJlYWQgPSBwRG9jLT5HZXREb2NQcm92aWRlcigpLT5PcGVuTGlua2VkRmlsZShwRG9jLCB3c1VSTCk7DQorICB9DQorICBpZiAoIXBJbWFnZUZpbGVSZWFkKSB7DQogICAgIGlmIChwSW1hZ2VCdWZmZXIpIHsNCi0gICAgICAgIEZERV9GcmVlKHBJbWFnZUJ1ZmZlcik7DQotICAgIH0NCi0gICAgcEltYWdlRmlsZVJlYWQtPlJlbGVhc2UoKTsNCi0gICAgcmV0dXJuIHBCaXRtYXA7DQotfQ0KLXN0YXRpYyBGWERJQl9Gb3JtYXQgWEZBX0dldERJQkZvcm1hdChGWENPREVDX0lNQUdFX1RZUEUgdHlwZSwgaW50MzJfdCBpQ29tcG9uZW50cywgaW50MzJfdCBpQml0c1BlckNvbXBvbmVudCkNCi17DQotICAgIEZYRElCX0Zvcm1hdCBkaWJGb3JtYXQgPSBGWERJQl9BcmdiOw0KLSAgICBzd2l0Y2ggKHR5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9CTVA6DQotICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOg0KLSAgICAgICAgY2FzZSBGWENPREVDX0lNQUdFX1RJRjogew0KLSAgICAgICAgICAgICAgICBkaWJGb3JtYXQgPSBGWERJQl9SZ2IzMjsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBicHAgPSBpQ29tcG9uZW50cyAqIGlCaXRzUGVyQ29tcG9uZW50Ow0KLSAgICAgICAgICAgICAgICBpZiAoYnBwIDw9IDI0KSB7DQotICAgICAgICAgICAgICAgICAgICBkaWJGb3JtYXQgPSBGWERJQl9SZ2I7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfUE5HOg0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gZGliRm9ybWF0Ow0KLX0NCi1DRlhfRElCaXRtYXAqIFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKElGWF9GaWxlUmVhZCogcEltYWdlRmlsZVJlYWQsIEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlLCBpbnQzMl90ICZpSW1hZ2VYRHBpLCBpbnQzMl90ICZpSW1hZ2VZRHBpKQ0KLXsNCi0gICAgQ0ZYX0dFTW9kdWxlKiBwR2VNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpOw0KLSAgICBpZiAoIXBHZU1vZHVsZSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyID0gcEdlTW9kdWxlLT5HZXRDb2RlY01vZHVsZSgpOw0KLSAgICBpZiAoIXBDb2RlY01ncikgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0ZYX0RJQkF0dHJpYnV0ZSBkaWJBdHRyOw0KLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBOVUxMOw0KLSAgICBJQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwUHJvZ3Jlc3NpdmVEZWNvZGVyID0gcENvZGVjTWdyLT5DcmVhdGVQcm9ncmVzc2l2ZURlY29kZXIoKTsNCi0gICAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0gcFByb2dyZXNzaXZlRGVjb2Rlci0+TG9hZEltYWdlSW5mbyhwSW1hZ2VGaWxlUmVhZCwgdHlwZSwgJmRpYkF0dHIpOw0KLSAgICBzd2l0Y2ggKGRpYkF0dHIubV93RFBJVW5pdCkgew0KLSAgICAgICAgY2FzZSBGWENPREVDX1JFU1VOSVRfQ0VOVElNRVRFUjoNCi0gICAgICAgICAgICBkaWJBdHRyLm1fblhEUEkgPSAoaW50MzJfdCkoZGliQXR0ci5tX25YRFBJICogMi41NGYpOw0KLSAgICAgICAgICAgIGRpYkF0dHIubV9uWURQSSA9IChpbnQzMl90KShkaWJBdHRyLm1fbllEUEkgKiAyLjU0Zik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYQ09ERUNfUkVTVU5JVF9NRVRFUjoNCi0gICAgICAgICAgICBkaWJBdHRyLm1fblhEUEkgPSAoaW50MzJfdCkoZGliQXR0ci5tX25YRFBJIC8gKEZYX0ZMT0FUKTEwMCAqIDIuNTRmKTsNCi0gICAgICAgICAgICBkaWJBdHRyLm1fbllEUEkgPSAoaW50MzJfdCkoZGliQXR0ci5tX25ZRFBJIC8gKEZYX0ZMT0FUKTEwMCAqIDIuNTRmKTsNCi0gICAgICAgICAgICBicmVhazs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGlJbWFnZVhEcGkgPSBkaWJBdHRyLm1fblhEUEkgPiAxID8gZGliQXR0ci5tX25YRFBJIDogKDk2KTsNCi0gICAgaUltYWdlWURwaSA9IGRpYkF0dHIubV9uWURQSSA+IDEgPyBkaWJBdHRyLm1fbllEUEkgOiAoOTYpOw0KLSAgICBpZiAocFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0V2lkdGgoKSA+IDAgJiYgcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0SGVpZ2h0KCkgPiAwKSB7DQotICAgICAgICB0eXBlID0gcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0VHlwZSgpOw0KLSAgICAgICAgaW50MzJfdCBpQ29tcG9uZW50cyA9IHBQcm9ncmVzc2l2ZURlY29kZXItPkdldE51bUNvbXBvbmVudHMoKTsNCi0gICAgICAgIGludDMyX3QgaUJwYyA9IHBQcm9ncmVzc2l2ZURlY29kZXItPkdldEJQQygpOw0KLSAgICAgICAgRlhESUJfRm9ybWF0IGRpYkZvcm1hdCA9IFhGQV9HZXRESUJGb3JtYXQodHlwZSwgaUNvbXBvbmVudHMsIGlCcGMpOw0KLSAgICAgICAgcEJpdG1hcCA9IEZYX05FVyBDRlhfRElCaXRtYXAoKTsNCi0gICAgICAgIHBCaXRtYXAtPkNyZWF0ZShwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRXaWR0aCgpLCBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRIZWlnaHQoKSwgZGliRm9ybWF0KTsNCi0gICAgICAgIHBCaXRtYXAtPkNsZWFyKDB4ZmZmZmZmZmYpOw0KLSAgICAgICAgaW50MzJfdCBuRnJhbWVzOw0KLSAgICAgICAgaWYgKChwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRGcmFtZXMobkZyYW1lcykgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZKSAmJiAobkZyYW1lcyA+IDApKSB7DQotICAgICAgICAgICAgcFByb2dyZXNzaXZlRGVjb2Rlci0+U3RhcnREZWNvZGUocEJpdG1hcCwgMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOw0KLSAgICAgICAgICAgIHBQcm9ncmVzc2l2ZURlY29kZXItPkNvbnRpbnVlRGVjb2RlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZGVsZXRlIHBQcm9ncmVzc2l2ZURlY29kZXI7DQotICAgIHJldHVybiBwQml0bWFwOw0KLX0NCi12b2lkIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4oQ0ZYX1JlY3RGICZydCwgY29uc3QgQ1hGQV9NYXJnaW4gJm1nLCBGWF9CT09MIGJVSSApDQotew0KLSAgICBpZiAoIW1nKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0Ow0KLSAgICBtZy5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7DQotICAgIG1nLkdldFRvcEluc2V0KGZUb3BJbnNldCk7DQotICAgIG1nLkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOw0KLSAgICBtZy5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KLSAgICBydC5EZWZsYXRlKGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldCk7DQotfQ0KLUNYRkFfRkZXaWRnZXQqIFhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKQ0KLXsNCi0gICAgWEZBX0VMRU1FTlQgaVR5cGUgPSBwTGF5b3V0SXRlbS0+R2V0Rm9ybU5vZGUoKS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAoWEZBX0lzQ3JlYXRlV2lkZ2V0KGlUeXBlKSkgew0KLSAgICAgICAgcmV0dXJuIChDWEZBX0ZGV2lkZ2V0KikoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtOw0KKyAgICAgIEZERV9GcmVlKHBJbWFnZUJ1ZmZlcik7DQogICAgIH0NCiAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBiTmFtZUltYWdlID0gRkFMU0U7DQorICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPQ0KKyAgICAgIFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKHBJbWFnZUZpbGVSZWFkLCB0eXBlLCBpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgIGlmIChwSW1hZ2VCdWZmZXIpIHsNCisgICAgRkRFX0ZyZWUocEltYWdlQnVmZmVyKTsNCisgIH0NCisgIHBJbWFnZUZpbGVSZWFkLT5SZWxlYXNlKCk7DQorICByZXR1cm4gcEJpdG1hcDsNCiB9DQotRlhfQk9PTCBYRkFfSXNDcmVhdGVXaWRnZXQoWEZBX0VMRU1FTlQgaVR5cGUpDQotew0KLSAgICByZXR1cm4gaVR5cGUgPT0gWEZBX0VMRU1FTlRfRmllbGQgfHwgaVR5cGUgPT0gWEZBX0VMRU1FTlRfRHJhdyB8fCBpVHlwZSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtIHx8IGlUeXBlID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cDsNCitzdGF0aWMgRlhESUJfRm9ybWF0IFhGQV9HZXRESUJGb3JtYXQoRlhDT0RFQ19JTUFHRV9UWVBFIHR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvbXBvbmVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJpdHNQZXJDb21wb25lbnQpIHsNCisgIEZYRElCX0Zvcm1hdCBkaWJGb3JtYXQgPSBGWERJQl9BcmdiOw0KKyAgc3dpdGNoICh0eXBlKSB7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9CTVA6DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9KUEc6DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6IHsNCisgICAgICBkaWJGb3JtYXQgPSBGWERJQl9SZ2IzMjsNCisgICAgICBpbnQzMl90IGJwcCA9IGlDb21wb25lbnRzICogaUJpdHNQZXJDb21wb25lbnQ7DQorICAgICAgaWYgKGJwcCA8PSAyNCkgew0KKyAgICAgICAgZGliRm9ybWF0ID0gRlhESUJfUmdiOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWENPREVDX0lNQUdFX1BORzoNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBkaWJGb3JtYXQ7DQogfQ0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfR2V0UGF0aF9BcmMoQ1hGQV9Cb3ggYm94LCBDRlhfUmVjdEYgcnREcmF3LCBDRlhfUGF0aCAmZmlsbFBhdGgsIEZYX0RXT1JEIGR3RmxhZ3MpDQotew0KLSAgICBGWF9GTE9BVCBhLCBiOw0KLSAgICBhID0gcnREcmF3LndpZHRoIC8gMi4wZjsNCi0gICAgYiA9IHJ0RHJhdy5oZWlnaHQgLyAyLjBmOw0KLSAgICBpZiAoYm94LklzQ2lyY3VsYXIoKSB8fCAoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpICE9IDApIHsNCi0gICAgICAgIGEgPSBiID0gRlhfTUlOKGEsIGIpOw0KK0NGWF9ESUJpdG1hcCogWEZBX0xvYWRJbWFnZUZyb21CdWZmZXIoSUZYX0ZpbGVSZWFkKiBwSW1hZ2VGaWxlUmVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUltYWdlWERwaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbWFnZVlEcGkpIHsNCisgIENGWF9HRU1vZHVsZSogcEdlTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKTsNCisgIGlmICghcEdlTW9kdWxlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyID0gcEdlTW9kdWxlLT5HZXRDb2RlY01vZHVsZSgpOw0KKyAgaWYgKCFwQ29kZWNNZ3IpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfRElCQXR0cmlidXRlIGRpYkF0dHI7DQorICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBOVUxMOw0KKyAgSUNvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogcFByb2dyZXNzaXZlRGVjb2RlciA9DQorICAgICAgcENvZGVjTWdyLT5DcmVhdGVQcm9ncmVzc2l2ZURlY29kZXIoKTsNCisgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9DQorICAgICAgcFByb2dyZXNzaXZlRGVjb2Rlci0+TG9hZEltYWdlSW5mbyhwSW1hZ2VGaWxlUmVhZCwgdHlwZSwgJmRpYkF0dHIpOw0KKyAgc3dpdGNoIChkaWJBdHRyLm1fd0RQSVVuaXQpIHsNCisgICAgY2FzZSBGWENPREVDX1JFU1VOSVRfQ0VOVElNRVRFUjoNCisgICAgICBkaWJBdHRyLm1fblhEUEkgPSAoaW50MzJfdCkoZGliQXR0ci5tX25YRFBJICogMi41NGYpOw0KKyAgICAgIGRpYkF0dHIubV9uWURQSSA9IChpbnQzMl90KShkaWJBdHRyLm1fbllEUEkgKiAyLjU0Zik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19SRVNVTklUX01FVEVSOg0KKyAgICAgIGRpYkF0dHIubV9uWERQSSA9IChpbnQzMl90KShkaWJBdHRyLm1fblhEUEkgLyAoRlhfRkxPQVQpMTAwICogMi41NGYpOw0KKyAgICAgIGRpYkF0dHIubV9uWURQSSA9IChpbnQzMl90KShkaWJBdHRyLm1fbllEUEkgLyAoRlhfRkxPQVQpMTAwICogMi41NGYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICAgIDsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIGlJbWFnZVhEcGkgPSBkaWJBdHRyLm1fblhEUEkgPiAxID8gZGliQXR0ci5tX25YRFBJIDogKDk2KTsNCisgIGlJbWFnZVlEcGkgPSBkaWJBdHRyLm1fbllEUEkgPiAxID8gZGliQXR0ci5tX25ZRFBJIDogKDk2KTsNCisgIGlmIChwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRXaWR0aCgpID4gMCAmJg0KKyAgICAgIHBQcm9ncmVzc2l2ZURlY29kZXItPkdldEhlaWdodCgpID4gMCkgew0KKyAgICB0eXBlID0gcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0VHlwZSgpOw0KKyAgICBpbnQzMl90IGlDb21wb25lbnRzID0gcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0TnVtQ29tcG9uZW50cygpOw0KKyAgICBpbnQzMl90IGlCcGMgPSBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRCUEMoKTsNCisgICAgRlhESUJfRm9ybWF0IGRpYkZvcm1hdCA9IFhGQV9HZXRESUJGb3JtYXQodHlwZSwgaUNvbXBvbmVudHMsIGlCcGMpOw0KKyAgICBwQml0bWFwID0gRlhfTkVXIENGWF9ESUJpdG1hcCgpOw0KKyAgICBwQml0bWFwLT5DcmVhdGUocFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0V2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgIHBQcm9ncmVzc2l2ZURlY29kZXItPkdldEhlaWdodCgpLCBkaWJGb3JtYXQpOw0KKyAgICBwQml0bWFwLT5DbGVhcigweGZmZmZmZmZmKTsNCisgICAgaW50MzJfdCBuRnJhbWVzOw0KKyAgICBpZiAoKHBQcm9ncmVzc2l2ZURlY29kZXItPkdldEZyYW1lcyhuRnJhbWVzKSA9PQ0KKyAgICAgICAgIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWSkgJiYNCisgICAgICAgIChuRnJhbWVzID4gMCkpIHsNCisgICAgICBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5TdGFydERlY29kZShwQml0bWFwLCAwLCAwLCBwQml0bWFwLT5HZXRXaWR0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEhlaWdodCgpKTsNCisgICAgICBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5Db250aW51ZURlY29kZSgpOw0KICAgICB9DQotICAgIENGWF9Qb2ludEYgY2VudGVyID0gcnREcmF3LkNlbnRlcigpOw0KLSAgICBydERyYXcubGVmdCA9IGNlbnRlci54IC0gYTsNCi0gICAgcnREcmF3LnRvcCA9IGNlbnRlci55IC0gYjsNCi0gICAgcnREcmF3LndpZHRoID0gYSArIGE7DQotICAgIHJ0RHJhdy5oZWlnaHQgPSBiICsgYjsNCi0gICAgRlhfRkxPQVQgc3RhcnRBbmdsZSA9IDAsIHN3ZWVwQW5nbGUgPSAzNjA7DQotICAgIEZYX0JPT0wgYlN0YXJ0ID0gYm94LkdldFN0YXJ0QW5nbGUoc3RhcnRBbmdsZSk7DQotICAgIEZYX0JPT0wgYkVuZCA9IGJveC5HZXRTd2VlcEFuZ2xlKHN3ZWVwQW5nbGUpOw0KLSAgICBpZiAoIWJTdGFydCAmJiAhYkVuZCkgew0KLSAgICAgICAgZmlsbFBhdGguQWRkRWxsaXBzZShydERyYXcpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIHN0YXJ0QW5nbGUgPSAtc3RhcnRBbmdsZSAqIEZYX1BJIC8gMTgwLjBmOw0KLSAgICBzd2VlcEFuZ2xlID0gLXN3ZWVwQW5nbGUgKiBGWF9QSSAvIDE4MC4wZjsNCi0gICAgZmlsbFBhdGguQWRkQXJjKHJ0RHJhdy5sZWZ0LCBydERyYXcudG9wLCBydERyYXcud2lkdGgsIHJ0RHJhdy5oZWlnaHQsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUpOw0KKyAgfQ0KKyAgZGVsZXRlIHBQcm9ncmVzc2l2ZURlY29kZXI7DQorICByZXR1cm4gcEJpdG1hcDsNCiB9DQotc3RhdGljIHZvaWQgWEZBX0JPWF9HZXRQYXRoKENYRkFfQm94IGJveCwgY29uc3QgQ1hGQV9TdHJva2VBcnJheSAmc3Ryb2tlcywgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LCBDRlhfUGF0aCAmcGF0aCwgaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYlN0YXJ0LCBGWF9CT09MIGJDb3JuZXIpDQotew0KLSAgICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgOCk7DQotICAgIEZYX0JPT0wgYkludmVydGVkLCBiUm91bmQ7DQotICAgIEZYX0ZMT0FUIGZSYWRpdXMxLCBmUmFkaXVzMiwgc3gsIHN5LCB2eCwgdnksIG54LCBueSwgb2Zmc2V0WSwgb2Zmc2V0WCwgb2Zmc2V0RVgsIG9mZnNldEVZOw0KLSAgICBDRlhfUG9pbnRGIGNwU3RhcnQsIGNwLCBjcDEsIGNwMjsNCi0gICAgQ0ZYX1JlY3RGIHJ0UmFkaXVzOw0KLSAgICBpbnQzMl90IG4gPSAobkluZGV4ICYgMSkgPyBuSW5kZXggLSAxIDogbkluZGV4Ow0KLSAgICBDWEZBX0Nvcm5lciBjb3JuZXIxID0gKENYRkFfTm9kZSopc3Ryb2tlc1tuXTsNCi0gICAgQ1hGQV9Db3JuZXIgY29ybmVyMiA9IChDWEZBX05vZGUqKXN0cm9rZXNbKG4gKyAyKSAlIDhdOw0KLSAgICBmUmFkaXVzMSA9IGJDb3JuZXIgPyBjb3JuZXIxLkdldFJhZGl1cygpIDogMDsNCi0gICAgZlJhZGl1czIgPSBiQ29ybmVyID8gY29ybmVyMi5HZXRSYWRpdXMoKSA6IDA7DQotICAgIGJJbnZlcnRlZCA9IGNvcm5lcjEuSXNJbnZlcnRlZCgpOw0KLSAgICBvZmZzZXRZID0gMC4wZjsNCi0gICAgb2Zmc2V0WCA9IDAuMGY7DQotICAgIGJSb3VuZCA9IGNvcm5lcjEuR2V0Sm9pblR5cGUoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3VuZDsNCi0gICAgRlhfRkxPQVQgaGFsZkFmdGVyID0gMC4wZjsNCi0gICAgRlhfRkxPQVQgaGFsZkJlZm9yZSA9IDAuMGY7DQotICAgIENYRkFfU3Ryb2tlIHN0cm9rZSA9IHN0cm9rZXNbbkluZGV4XTsNCi0gICAgaWYoc3Ryb2tlLklzQ29ybmVyKCkpIHsNCi0gICAgICAgIENYRkFfU3Ryb2tlIGVkZ2VCZWZvcmUgPSBzdHJva2VzWyhuSW5kZXggKyAxICogOCAtIDEpICUgOF07DQotICAgICAgICBDWEZBX1N0cm9rZSBlZGdlQWZ0ZXIgPSBzdHJva2VzW25JbmRleCArIDFdOw0KLSAgICAgICAgaWYoIHN0cm9rZS5Jc0ludmVydGVkKCkpIHsNCi0gICAgICAgICAgICBpZighc3Ryb2tlLlNhbWVTdHlsZXMoZWRnZUJlZm9yZSkpIHsNCi0gICAgICAgICAgICAgICAgaGFsZkJlZm9yZSA9IGVkZ2VCZWZvcmUuR2V0VGhpY2tuZXNzKCkgLyAyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZighc3Ryb2tlLlNhbWVTdHlsZXMoZWRnZUFmdGVyKSkgew0KLSAgICAgICAgICAgICAgICBoYWxmQWZ0ZXIgPSBlZGdlQWZ0ZXIuR2V0VGhpY2tuZXNzKCkgLyAyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCit2b2lkIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4oQ0ZYX1JlY3RGJiBydCwgY29uc3QgQ1hGQV9NYXJnaW4mIG1nLCBGWF9CT09MIGJVSSkgew0KKyAgaWYgKCFtZykgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQ7DQorICBtZy5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7DQorICBtZy5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KKyAgbWcuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICBtZy5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KKyAgcnQuRGVmbGF0ZShmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQpOw0KK30NCitDWEZBX0ZGV2lkZ2V0KiBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgew0KKyAgWEZBX0VMRU1FTlQgaVR5cGUgPSBwTGF5b3V0SXRlbS0+R2V0Rm9ybU5vZGUoKS0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKFhGQV9Jc0NyZWF0ZVdpZGdldChpVHlwZSkpIHsNCisgICAgcmV0dXJuIChDWEZBX0ZGV2lkZ2V0KikoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgWEZBX0lzQ3JlYXRlV2lkZ2V0KFhGQV9FTEVNRU5UIGlUeXBlKSB7DQorICByZXR1cm4gaVR5cGUgPT0gWEZBX0VMRU1FTlRfRmllbGQgfHwgaVR5cGUgPT0gWEZBX0VMRU1FTlRfRHJhdyB8fA0KKyAgICAgICAgIGlUeXBlID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgaVR5cGUgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX0dldFBhdGhfQXJjKENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydERyYXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCYgZmlsbFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICBGWF9GTE9BVCBhLCBiOw0KKyAgYSA9IHJ0RHJhdy53aWR0aCAvIDIuMGY7DQorICBiID0gcnREcmF3LmhlaWdodCAvIDIuMGY7DQorICBpZiAoYm94LklzQ2lyY3VsYXIoKSB8fCAoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpICE9IDApIHsNCisgICAgYSA9IGIgPSBGWF9NSU4oYSwgYik7DQorICB9DQorICBDRlhfUG9pbnRGIGNlbnRlciA9IHJ0RHJhdy5DZW50ZXIoKTsNCisgIHJ0RHJhdy5sZWZ0ID0gY2VudGVyLnggLSBhOw0KKyAgcnREcmF3LnRvcCA9IGNlbnRlci55IC0gYjsNCisgIHJ0RHJhdy53aWR0aCA9IGEgKyBhOw0KKyAgcnREcmF3LmhlaWdodCA9IGIgKyBiOw0KKyAgRlhfRkxPQVQgc3RhcnRBbmdsZSA9IDAsIHN3ZWVwQW5nbGUgPSAzNjA7DQorICBGWF9CT09MIGJTdGFydCA9IGJveC5HZXRTdGFydEFuZ2xlKHN0YXJ0QW5nbGUpOw0KKyAgRlhfQk9PTCBiRW5kID0gYm94LkdldFN3ZWVwQW5nbGUoc3dlZXBBbmdsZSk7DQorICBpZiAoIWJTdGFydCAmJiAhYkVuZCkgew0KKyAgICBmaWxsUGF0aC5BZGRFbGxpcHNlKHJ0RHJhdyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIHN0YXJ0QW5nbGUgPSAtc3RhcnRBbmdsZSAqIEZYX1BJIC8gMTgwLjBmOw0KKyAgc3dlZXBBbmdsZSA9IC1zd2VlcEFuZ2xlICogRlhfUEkgLyAxODAuMGY7DQorICBmaWxsUGF0aC5BZGRBcmMocnREcmF3LmxlZnQsIHJ0RHJhdy50b3AsIHJ0RHJhdy53aWR0aCwgcnREcmF3LmhlaWdodCwNCisgICAgICAgICAgICAgICAgICBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9HZXRQYXRoKENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hGQV9TdHJva2VBcnJheSYgc3Ryb2tlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCYgcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb3JuZXIpIHsNCisgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCA4KTsNCisgIEZYX0JPT0wgYkludmVydGVkLCBiUm91bmQ7DQorICBGWF9GTE9BVCBmUmFkaXVzMSwgZlJhZGl1czIsIHN4LCBzeSwgdngsIHZ5LCBueCwgbnksIG9mZnNldFksIG9mZnNldFgsDQorICAgICAgb2Zmc2V0RVgsIG9mZnNldEVZOw0KKyAgQ0ZYX1BvaW50RiBjcFN0YXJ0LCBjcCwgY3AxLCBjcDI7DQorICBDRlhfUmVjdEYgcnRSYWRpdXM7DQorICBpbnQzMl90IG4gPSAobkluZGV4ICYgMSkgPyBuSW5kZXggLSAxIDogbkluZGV4Ow0KKyAgQ1hGQV9Db3JuZXIgY29ybmVyMSA9IChDWEZBX05vZGUqKXN0cm9rZXNbbl07DQorICBDWEZBX0Nvcm5lciBjb3JuZXIyID0gKENYRkFfTm9kZSopc3Ryb2tlc1sobiArIDIpICUgOF07DQorICBmUmFkaXVzMSA9IGJDb3JuZXIgPyBjb3JuZXIxLkdldFJhZGl1cygpIDogMDsNCisgIGZSYWRpdXMyID0gYkNvcm5lciA/IGNvcm5lcjIuR2V0UmFkaXVzKCkgOiAwOw0KKyAgYkludmVydGVkID0gY29ybmVyMS5Jc0ludmVydGVkKCk7DQorICBvZmZzZXRZID0gMC4wZjsNCisgIG9mZnNldFggPSAwLjBmOw0KKyAgYlJvdW5kID0gY29ybmVyMS5HZXRKb2luVHlwZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kOw0KKyAgRlhfRkxPQVQgaGFsZkFmdGVyID0gMC4wZjsNCisgIEZYX0ZMT0FUIGhhbGZCZWZvcmUgPSAwLjBmOw0KKyAgQ1hGQV9TdHJva2Ugc3Ryb2tlID0gc3Ryb2tlc1tuSW5kZXhdOw0KKyAgaWYgKHN0cm9rZS5Jc0Nvcm5lcigpKSB7DQorICAgIENYRkFfU3Ryb2tlIGVkZ2VCZWZvcmUgPSBzdHJva2VzWyhuSW5kZXggKyAxICogOCAtIDEpICUgOF07DQorICAgIENYRkFfU3Ryb2tlIGVkZ2VBZnRlciA9IHN0cm9rZXNbbkluZGV4ICsgMV07DQorICAgIGlmIChzdHJva2UuSXNJbnZlcnRlZCgpKSB7DQorICAgICAgaWYgKCFzdHJva2UuU2FtZVN0eWxlcyhlZGdlQmVmb3JlKSkgew0KKyAgICAgICAgaGFsZkJlZm9yZSA9IGVkZ2VCZWZvcmUuR2V0VGhpY2tuZXNzKCkgLyAyOw0KKyAgICAgIH0NCisgICAgICBpZiAoIXN0cm9rZS5TYW1lU3R5bGVzKGVkZ2VBZnRlcikpIHsNCisgICAgICAgIGhhbGZBZnRlciA9IGVkZ2VBZnRlci5HZXRUaGlja25lc3MoKSAvIDI7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX1N0cm9rZSBlZGdlQmVmb3JlID0gc3Ryb2tlc1sobkluZGV4ICsgOCAtIDIpICUgOF07DQorICAgIENYRkFfU3Ryb2tlIGVkZ2VBZnRlciA9IHN0cm9rZXNbKG5JbmRleCArIDIpICUgOF07DQorICAgIGlmICghYlJvdW5kICYmICFiSW52ZXJ0ZWQpIHsNCisgICAgICB7IGhhbGZCZWZvcmUgPSBlZGdlQmVmb3JlLkdldFRoaWNrbmVzcygpIC8gMjsgfQ0KKyAgICAgIHsgaGFsZkFmdGVyID0gZWRnZUFmdGVyLkdldFRoaWNrbmVzcygpIC8gMjsgfQ0KKyAgICB9DQorICB9DQorICBvZmZzZXRFWCA9IDAuMGY7DQorICBvZmZzZXRFWSA9IDAuMGY7DQorICBpZiAoYlJvdW5kKSB7DQorICAgIHN5ID0gRlhfUEkgLyAyOw0KKyAgfQ0KKyAgc3dpdGNoIChuSW5kZXgpIHsNCisgICAgY2FzZSAwOg0KKyAgICBjYXNlIDE6DQorICAgICAgY3AxID0gcnRXaWRnZXQuVG9wTGVmdCgpOw0KKyAgICAgIGNwMiA9IHJ0V2lkZ2V0LlRvcFJpZ2h0KCk7DQorICAgICAgaWYgKG5JbmRleCA9PSAwKSB7DQorICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCAtIGhhbGZCZWZvcmU7DQorICAgICAgICBjcFN0YXJ0LnkgPSBjcDEueSArIGZSYWRpdXMxLCBvZmZzZXRZID0gLWhhbGZBZnRlcjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY3BTdGFydC54ID0gY3AxLnggKyBmUmFkaXVzMSAtIGhhbGZCZWZvcmUsIGNwU3RhcnQueSA9IGNwMS55LA0KKyAgICAgICAgb2Zmc2V0RVggPSBoYWxmQWZ0ZXI7DQorICAgICAgfQ0KKyAgICAgIHZ4ID0gMSwgdnkgPSAxOw0KKyAgICAgIG54ID0gLTEsIG55ID0gMDsNCisgICAgICBpZiAoYlJvdW5kKSB7DQorICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJIC8gMiA6IEZYX1BJOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBzeCA9IDEsIHN5ID0gMDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjoNCisgICAgY2FzZSAzOg0KKyAgICAgIGNwMSA9IHJ0V2lkZ2V0LlRvcFJpZ2h0KCk7DQorICAgICAgY3AyID0gcnRXaWRnZXQuQm90dG9tUmlnaHQoKTsNCisgICAgICBpZiAobkluZGV4ID09IDIpIHsNCisgICAgICAgIGNwU3RhcnQueCA9IGNwMS54IC0gZlJhZGl1czEsIGNwU3RhcnQueSA9IGNwMS55IC0gaGFsZkJlZm9yZSwNCisgICAgICAgIG9mZnNldFggPSBoYWxmQWZ0ZXI7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNwU3RhcnQueCA9IGNwMS54LCBjcFN0YXJ0LnkgPSBjcDEueSArIGZSYWRpdXMxIC0gaGFsZkJlZm9yZSwNCisgICAgICAgIG9mZnNldEVZID0gaGFsZkFmdGVyOw0KKyAgICAgIH0NCisgICAgICB2eCA9IC0xLCB2eSA9IDE7DQorICAgICAgbnggPSAwLCBueSA9IC0xOw0KKyAgICAgIGlmIChiUm91bmQpIHsNCisgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgOiBGWF9QSSAqIDMgLyAyOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBzeCA9IDAsIHN5ID0gMTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgNDoNCisgICAgY2FzZSA1Og0KKyAgICAgIGNwMSA9IHJ0V2lkZ2V0LkJvdHRvbVJpZ2h0KCk7DQorICAgICAgY3AyID0gcnRXaWRnZXQuQm90dG9tTGVmdCgpOw0KKyAgICAgIGlmIChuSW5kZXggPT0gNCkgew0KKyAgICAgICAgY3BTdGFydC54ID0gY3AxLnggKyBoYWxmQmVmb3JlLCBjcFN0YXJ0LnkgPSBjcDEueSAtIGZSYWRpdXMxLA0KKyAgICAgICAgb2Zmc2V0WSA9IGhhbGZBZnRlcjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY3BTdGFydC54ID0gY3AxLnggLSBmUmFkaXVzMSArIGhhbGZCZWZvcmUsIGNwU3RhcnQueSA9IGNwMS55LA0KKyAgICAgICAgb2Zmc2V0RVggPSAtaGFsZkFmdGVyOw0KKyAgICAgIH0NCisgICAgICB2eCA9IC0xLCB2eSA9IC0xOw0KKyAgICAgIG54ID0gMSwgbnkgPSAwOw0KKyAgICAgIGlmIChiUm91bmQpIHsNCisgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgKiAzIC8gMiA6IDA7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHN4ID0gLTEsIHN5ID0gMDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgNjoNCisgICAgY2FzZSA3Og0KKyAgICAgIGNwMSA9IHJ0V2lkZ2V0LkJvdHRvbUxlZnQoKTsNCisgICAgICBjcDIgPSBydFdpZGdldC5Ub3BMZWZ0KCk7DQorICAgICAgaWYgKG5JbmRleCA9PSA2KSB7DQorICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCArIGZSYWRpdXMxLCBjcFN0YXJ0LnkgPSBjcDEueSArIGhhbGZCZWZvcmUsDQorICAgICAgICBvZmZzZXRYID0gLWhhbGZBZnRlcjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY3BTdGFydC54ID0gY3AxLngsIGNwU3RhcnQueSA9IGNwMS55IC0gZlJhZGl1czEgKyBoYWxmQmVmb3JlLA0KKyAgICAgICAgb2Zmc2V0RVkgPSAtaGFsZkFmdGVyOw0KKyAgICAgIH0NCisgICAgICB2eCA9IDEsIHZ5ID0gLTE7DQorICAgICAgbnggPSAwLCBueSA9IDE7DQorICAgICAgaWYgKGJSb3VuZCkgew0KKyAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyAwIDogRlhfUEkgLyAyOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBzeCA9IDAsIHN5ID0gLTE7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKGJTdGFydCkgew0KKyAgICBwYXRoLk1vdmVUbyhjcFN0YXJ0LngsIGNwU3RhcnQueSk7DQorICB9DQorICBpZiAobkluZGV4ICYgMSkgew0KKyAgICBwYXRoLkxpbmVUbyhjcDIueCArIGZSYWRpdXMyICogbnggKyBvZmZzZXRFWCwNCisgICAgICAgICAgICAgICAgY3AyLnkgKyBmUmFkaXVzMiAqIG55ICsgb2Zmc2V0RVkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlJvdW5kKSB7DQorICAgIGlmIChmUmFkaXVzMSA8IDApIHsNCisgICAgICBzeCAtPSBGWF9QSTsNCisgICAgfQ0KKyAgICBpZiAoYkludmVydGVkKSB7DQorICAgICAgc3kgKj0gLTE7DQorICAgIH0NCisgICAgcnRSYWRpdXMuU2V0KGNwMS54ICsgb2Zmc2V0WCAqIDIsIGNwMS55ICsgb2Zmc2V0WSAqIDIsDQorICAgICAgICAgICAgICAgICBmUmFkaXVzMSAqIDIgKiB2eCAtIG9mZnNldFggKiAyLA0KKyAgICAgICAgICAgICAgICAgZlJhZGl1czEgKiAyICogdnkgLSBvZmZzZXRZICogMik7DQorICAgIHJ0UmFkaXVzLk5vcm1hbGl6ZSgpOw0KKyAgICBpZiAoYkludmVydGVkKSB7DQorICAgICAgcnRSYWRpdXMuT2Zmc2V0KC1mUmFkaXVzMSAqIHZ4LCAtZlJhZGl1czEgKiB2eSk7DQorICAgIH0NCisgICAgcGF0aC5BcmNUbyhydFJhZGl1cy5sZWZ0LCBydFJhZGl1cy50b3AsIHJ0UmFkaXVzLndpZHRoLCBydFJhZGl1cy5oZWlnaHQsIHN4LA0KKyAgICAgICAgICAgICAgIHN5KTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChiSW52ZXJ0ZWQpIHsNCisgICAgICBjcC54ID0gY3AxLnggKyBmUmFkaXVzMSAqIHZ4LCBjcC55ID0gY3AxLnkgKyBmUmFkaXVzMSAqIHZ5Ow0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9TdHJva2UgZWRnZUJlZm9yZSA9IHN0cm9rZXNbKG5JbmRleCArIDggLSAyKSAlIDhdOw0KLSAgICAgICAgQ1hGQV9TdHJva2UgZWRnZUFmdGVyID0gc3Ryb2tlc1sobkluZGV4ICsgMikgJSA4XTsNCi0gICAgICAgIGlmKCFiUm91bmQgJiYgIWJJbnZlcnRlZCkgew0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaGFsZkJlZm9yZSA9IGVkZ2VCZWZvcmUuR2V0VGhpY2tuZXNzKCkgLyAyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGhhbGZBZnRlciA9IGVkZ2VBZnRlci5HZXRUaGlja25lc3MoKSAvIDI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgICAgIGNwID0gY3AxOw0KICAgICB9DQotICAgIG9mZnNldEVYID0gMC4wZjsNCi0gICAgb2Zmc2V0RVkgPSAwLjBmOw0KLSAgICBpZiAoYlJvdW5kKSB7DQotICAgICAgICBzeSA9IEZYX1BJIC8gMjsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKG5JbmRleCkgew0KLSAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgIGNwMSA9IHJ0V2lkZ2V0LlRvcExlZnQoKTsNCi0gICAgICAgICAgICBjcDIgPSBydFdpZGdldC5Ub3BSaWdodCgpOw0KLSAgICAgICAgICAgIGlmIChuSW5kZXggPT0gMCkgew0KLSAgICAgICAgICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCAtIGhhbGZCZWZvcmU7DQotICAgICAgICAgICAgICAgIGNwU3RhcnQueSA9IGNwMS55ICsgZlJhZGl1czEsIG9mZnNldFkgPSAgLSBoYWxmQWZ0ZXI7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgY3BTdGFydC54ID0gY3AxLnggKyBmUmFkaXVzMSAtIGhhbGZCZWZvcmUsIGNwU3RhcnQueSA9IGNwMS55LCBvZmZzZXRFWCA9IGhhbGZBZnRlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdnggPSAxLCB2eSA9IDE7DQotICAgICAgICAgICAgbnggPSAtMSwgbnkgPSAwOw0KLSAgICAgICAgICAgIGlmIChiUm91bmQpIHsNCi0gICAgICAgICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyBGWF9QSSAvIDIgOiBGWF9QSTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBzeCA9IDEsIHN5ID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDI6DQotICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgY3AxID0gcnRXaWRnZXQuVG9wUmlnaHQoKTsNCi0gICAgICAgICAgICBjcDIgPSBydFdpZGdldC5Cb3R0b21SaWdodCgpOw0KLSAgICAgICAgICAgIGlmIChuSW5kZXggPT0gMikgew0KLSAgICAgICAgICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCAtIGZSYWRpdXMxLCBjcFN0YXJ0LnkgPSBjcDEueSAtIGhhbGZCZWZvcmUsIG9mZnNldFggPSBoYWxmQWZ0ZXI7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgY3BTdGFydC54ID0gY3AxLngsIGNwU3RhcnQueSA9IGNwMS55ICsgZlJhZGl1czEgLSBoYWxmQmVmb3JlLCBvZmZzZXRFWSA9IGhhbGZBZnRlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdnggPSAtMSwgdnkgPSAxOw0KLSAgICAgICAgICAgIG54ID0gMCwgbnkgPSAtMTsNCi0gICAgICAgICAgICBpZiAoYlJvdW5kKSB7DQotICAgICAgICAgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgOiBGWF9QSSAqIDMgLyAyOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHN4ID0gMCwgc3kgPSAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgNDoNCi0gICAgICAgIGNhc2UgNToNCi0gICAgICAgICAgICBjcDEgPSBydFdpZGdldC5Cb3R0b21SaWdodCgpOw0KLSAgICAgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LkJvdHRvbUxlZnQoKTsNCi0gICAgICAgICAgICBpZiAobkluZGV4ID09IDQpIHsNCi0gICAgICAgICAgICAgICAgY3BTdGFydC54ID0gY3AxLnggKyBoYWxmQmVmb3JlICwgY3BTdGFydC55ID0gY3AxLnkgLSBmUmFkaXVzMSwgb2Zmc2V0WSA9IGhhbGZBZnRlcjsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCAtIGZSYWRpdXMxICsgaGFsZkJlZm9yZSwgY3BTdGFydC55ID0gY3AxLnksIG9mZnNldEVYID0gLWhhbGZBZnRlciA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZ4ID0gLTEsIHZ5ID0gLTE7DQotICAgICAgICAgICAgbnggPSAxLCBueSA9IDA7DQotICAgICAgICAgICAgaWYgKGJSb3VuZCkgew0KLSAgICAgICAgICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJICogMyAvIDIgOiAwOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHN4ID0gLTEsIHN5ID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDY6DQotICAgICAgICBjYXNlIDc6DQotICAgICAgICAgICAgY3AxID0gcnRXaWRnZXQuQm90dG9tTGVmdCgpOw0KLSAgICAgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LlRvcExlZnQoKTsNCi0gICAgICAgICAgICBpZiAobkluZGV4ID09IDYpIHsNCi0gICAgICAgICAgICAgICAgY3BTdGFydC54ID0gY3AxLnggKyBmUmFkaXVzMSwgY3BTdGFydC55ID0gY3AxLnkgKyBoYWxmQmVmb3JlLCBvZmZzZXRYID0gLWhhbGZBZnRlcjsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCwgY3BTdGFydC55ID0gY3AxLnkgLSBmUmFkaXVzMSArIGhhbGZCZWZvcmUsIG9mZnNldEVZID0gLWhhbGZBZnRlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdnggPSAxLCB2eSA9IC0xOw0KLSAgICAgICAgICAgIG54ID0gMCwgbnkgPSAxOw0KLSAgICAgICAgICAgIGlmIChiUm91bmQpIHsNCi0gICAgICAgICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyAwIDogRlhfUEkgLyAyOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHN4ID0gMCwgc3kgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgaWYgKGJTdGFydCkgew0KLSAgICAgICAgcGF0aC5Nb3ZlVG8oY3BTdGFydC54LCBjcFN0YXJ0LnkpOw0KLSAgICB9DQotICAgIGlmIChuSW5kZXggJiAxKSB7DQotICAgICAgICBwYXRoLkxpbmVUbyhjcDIueCArIGZSYWRpdXMyICogbnggKyBvZmZzZXRFWCwgY3AyLnkgKyBmUmFkaXVzMiAqIG55ICsgb2Zmc2V0RVkpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChiUm91bmQpIHsNCi0gICAgICAgIGlmIChmUmFkaXVzMSA8IDApIHsNCi0gICAgICAgICAgICBzeCAtPSBGWF9QSTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiSW52ZXJ0ZWQpIHsNCi0gICAgICAgICAgICBzeSAqPSAtMTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJ0UmFkaXVzLlNldChjcDEueCArIG9mZnNldFggKiAyLCBjcDEueSArIG9mZnNldFkgKiAyICwgZlJhZGl1czEgKiAyICogdnggLSBvZmZzZXRYICogMiwgZlJhZGl1czEgKiAyICogdnkgLSBvZmZzZXRZICogMik7DQotICAgICAgICBydFJhZGl1cy5Ob3JtYWxpemUoKTsNCi0gICAgICAgIGlmIChiSW52ZXJ0ZWQpIHsNCi0gICAgICAgICAgICBydFJhZGl1cy5PZmZzZXQoLWZSYWRpdXMxICogdngsIC1mUmFkaXVzMSAqIHZ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBhdGguQXJjVG8ocnRSYWRpdXMubGVmdCwgcnRSYWRpdXMudG9wLCBydFJhZGl1cy53aWR0aCwgcnRSYWRpdXMuaGVpZ2h0LCBzeCwgc3kpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKGJJbnZlcnRlZCkgew0KLSAgICAgICAgICAgIGNwLnggPSBjcDEueCArIGZSYWRpdXMxICogdngsIGNwLnkgPSBjcDEueSArIGZSYWRpdXMxICogdnk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGNwID0gY3AxOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcGF0aC5MaW5lVG8oY3AueCwgY3AueSk7DQotICAgICAgICBwYXRoLkxpbmVUbyhjcDEueCArIGZSYWRpdXMxICogc3ggKyBvZmZzZXRYLCBjcDEueSArIGZSYWRpdXMxICogc3kgKyBvZmZzZXRZKTsNCi0gICAgfQ0KKyAgICBwYXRoLkxpbmVUbyhjcC54LCBjcC55KTsNCisgICAgcGF0aC5MaW5lVG8oY3AxLnggKyBmUmFkaXVzMSAqIHN4ICsgb2Zmc2V0WCwNCisgICAgICAgICAgICAgICAgY3AxLnkgKyBmUmFkaXVzMSAqIHN5ICsgb2Zmc2V0WSk7DQorICB9DQogfQ0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfR2V0RmlsbFBhdGgoQ1hGQV9Cb3ggYm94LCBjb25zdCBDWEZBX1N0cm9rZUFycmF5ICZzdHJva2VzLCBDRlhfUmVjdEYgcnRXaWRnZXQsIENGWF9QYXRoICZmaWxsUGF0aCwgRlhfV09SRCBkd0ZsYWdzKQ0KLXsNCi0gICAgaWYgKGJveC5Jc0FyYygpIHx8IChkd0ZsYWdzICYgWEZBX0RSQVdCT1hfRm9yY2VSb3VuZCkgIT0gMCkgew0KLSAgICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3guR2V0RWRnZSgwKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSBlZGdlLkdldFRoaWNrbmVzcygpOw0KLSAgICAgICAgaWYgKGZUaGlja25lc3MgPCAwKSB7DQotICAgICAgICAgICAgZlRoaWNrbmVzcyA9IDA7DQotICAgICAgICB9DQotICAgICAgICBGWF9GTE9BVCBmSGFsZiA9IGZUaGlja25lc3MgLyAyOw0KLSAgICAgICAgaW50MzJfdCBpSGFuZCA9IGJveC5HZXRIYW5kKCk7DQotICAgICAgICBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdCkgew0KLSAgICAgICAgICAgIHJ0V2lkZ2V0LkluZmxhdGUoZkhhbGYsIGZIYWxmKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsNCi0gICAgICAgICAgICBydFdpZGdldC5EZWZsYXRlKGZIYWxmLCBmSGFsZik7DQotICAgICAgICB9DQotICAgICAgICBYRkFfQk9YX0dldFBhdGhfQXJjKGJveCwgcnRXaWRnZXQsIGZpbGxQYXRoLCBkd0ZsYWdzKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJTYW1lU3R5bGVzID0gVFJVRTsNCi0gICAgaW50MzJfdCBpOw0KLSAgICBDWEZBX1N0cm9rZSBzdHJva2UxID0gc3Ryb2tlc1swXTsNCi0gICAgZm9yIChpID0gMTsgaSA8IDg7IGkgKyspIHsNCi0gICAgICAgIENYRkFfU3Ryb2tlIHN0cm9rZTIgPSBzdHJva2VzW2ldOw0KLSAgICAgICAgaWYgKCFzdHJva2UxLlNhbWVTdHlsZXMoc3Ryb2tlMikpIHsNCi0gICAgICAgICAgICBiU2FtZVN0eWxlcyA9IEZBTFNFOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3Ryb2tlMSA9IHN0cm9rZTI7DQotICAgIH0NCi0gICAgaWYgKGJTYW1lU3R5bGVzKSB7DQotICAgICAgICBzdHJva2UxID0gc3Ryb2tlc1swXTsNCi0gICAgICAgIGZvciAoaSA9IDI7IGkgPCA4OyBpICs9IDIpIHsNCi0gICAgICAgICAgICBDWEZBX1N0cm9rZSBzdHJva2UyID0gc3Ryb2tlc1tpXTsNCi0gICAgICAgICAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyLCBYRkFfU1RST0tFX1NBTUVTVFlMRV9Ob1ByZXNlbmNlIHwgWEZBX1NUUk9LRV9TQU1FU1RZTEVfQ29ybmVyKSkgew0KLSAgICAgICAgICAgICAgICBiU2FtZVN0eWxlcyA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc3Ryb2tlMSA9IHN0cm9rZTI7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYlNhbWVTdHlsZXMpIHsNCi0gICAgICAgICAgICBzdHJva2UxID0gc3Ryb2tlc1swXTsNCi0gICAgICAgICAgICBpZiAoc3Ryb2tlMS5Jc0ludmVydGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHN0cm9rZTEuR2V0Sm9pblR5cGUoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmUpIHsNCi0gICAgICAgICAgICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGJTYW1lU3R5bGVzKSB7DQotICAgICAgICBmaWxsUGF0aC5BZGRSZWN0YW5nbGUocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBydFdpZGdldC53aWR0aCwgcnRXaWRnZXQuaGVpZ2h0KTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJJbnZlcnRlZCwgYlJvdW5kOw0KLSAgICBGWF9GTE9BVCBmUmFkaXVzMSwgZlJhZGl1czIsIHN4LCBzeSwgdngsIHZ5LCBueCwgbnk7DQotICAgIENGWF9Qb2ludEYgY3AsIGNwMSwgY3AyOw0KLSAgICBDRlhfUmVjdEYgcnRSYWRpdXM7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDg7IGkgKz0gMikgew0KLSAgICAgICAgQ1hGQV9Db3JuZXIgY29ybmVyMSA9IChDWEZBX05vZGUqKXN0cm9rZXNbaV07DQotICAgICAgICBDWEZBX0Nvcm5lciBjb3JuZXIyID0gKENYRkFfTm9kZSopc3Ryb2tlc1soaSArIDIpICUgOF07DQotICAgICAgICBmUmFkaXVzMSA9IGNvcm5lcjEuR2V0UmFkaXVzKCk7DQotICAgICAgICBmUmFkaXVzMiA9IGNvcm5lcjIuR2V0UmFkaXVzKCk7DQotICAgICAgICBiSW52ZXJ0ZWQgPSBjb3JuZXIxLklzSW52ZXJ0ZWQoKTsNCi0gICAgICAgIGJSb3VuZCA9IGNvcm5lcjEuR2V0Sm9pblR5cGUoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3VuZDsNCi0gICAgICAgIGlmIChiUm91bmQpIHsNCi0gICAgICAgICAgICBzeSA9IEZYX1BJIC8gMjsNCi0gICAgICAgIH0NCi0gICAgICAgIHN3aXRjaCAoaSkgew0KLSAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgY3AxID0gcnRXaWRnZXQuVG9wTGVmdCgpOw0KLSAgICAgICAgICAgICAgICBjcDIgPSBydFdpZGdldC5Ub3BSaWdodCgpOw0KLSAgICAgICAgICAgICAgICB2eCA9IDEsIHZ5ID0gMTsNCi0gICAgICAgICAgICAgICAgbnggPSAtMSwgbnkgPSAwOw0KLSAgICAgICAgICAgICAgICBpZiAoYlJvdW5kKSB7DQotICAgICAgICAgICAgICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJIC8gMiA6IEZYX1BJOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgc3ggPSAxLCBzeSA9IDA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICBjcDEgPSBydFdpZGdldC5Ub3BSaWdodCgpOw0KLSAgICAgICAgICAgICAgICBjcDIgPSBydFdpZGdldC5Cb3R0b21SaWdodCgpOw0KLSAgICAgICAgICAgICAgICB2eCA9IC0xLCB2eSA9IDE7DQotICAgICAgICAgICAgICAgIG54ID0gMCwgbnkgPSAtMTsNCi0gICAgICAgICAgICAgICAgaWYgKGJSb3VuZCkgew0KLSAgICAgICAgICAgICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyBGWF9QSSA6IEZYX1BJICogMyAvIDI7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBzeCA9IDAsIHN5ID0gMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgIGNwMSA9IHJ0V2lkZ2V0LkJvdHRvbVJpZ2h0KCk7DQotICAgICAgICAgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LkJvdHRvbUxlZnQoKTsNCi0gICAgICAgICAgICAgICAgdnggPSAtMSwgdnkgPSAtMTsNCi0gICAgICAgICAgICAgICAgbnggPSAxLCBueSA9IDA7DQotICAgICAgICAgICAgICAgIGlmIChiUm91bmQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgKiAzIC8gMiA6IDA7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBzeCA9IC0xLCBzeSA9IDA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSA2Og0KLSAgICAgICAgICAgICAgICBjcDEgPSBydFdpZGdldC5Cb3R0b21MZWZ0KCk7DQotICAgICAgICAgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LlRvcExlZnQoKTsNCi0gICAgICAgICAgICAgICAgdnggPSAxLCB2eSA9IC0xOw0KLSAgICAgICAgICAgICAgICBueCA9IDAsIG55ID0gMTsNCi0gICAgICAgICAgICAgICAgaWYgKGJSb3VuZCkgew0KLSAgICAgICAgICAgICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyAwIDogRlhfUEkgLyAyOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgc3ggPSAwLCBzeSA9IC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGkgPT0gMCkgew0KLSAgICAgICAgICAgIGZpbGxQYXRoLk1vdmVUbyhjcDEueCwgY3AxLnkgKyBmUmFkaXVzMSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYlJvdW5kKSB7DQotICAgICAgICAgICAgaWYgKGZSYWRpdXMxIDwgMCkgew0KLSAgICAgICAgICAgICAgICBzeCAtPSBGWF9QSTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGJJbnZlcnRlZCkgew0KLSAgICAgICAgICAgICAgICBzeSAqPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcnRSYWRpdXMuU2V0KGNwMS54LCBjcDEueSwgZlJhZGl1czEgKiAyICogdngsIGZSYWRpdXMxICogMiAqIHZ5KTsNCi0gICAgICAgICAgICBydFJhZGl1cy5Ob3JtYWxpemUoKTsNCi0gICAgICAgICAgICBpZiAoYkludmVydGVkKSB7DQotICAgICAgICAgICAgICAgIHJ0UmFkaXVzLk9mZnNldCgtZlJhZGl1czEgKiB2eCwgLWZSYWRpdXMxICogdnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmaWxsUGF0aC5BcmNUbyhydFJhZGl1cy5sZWZ0LCBydFJhZGl1cy50b3AsIHJ0UmFkaXVzLndpZHRoLCBydFJhZGl1cy5oZWlnaHQsIHN4LCBzeSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChiSW52ZXJ0ZWQpIHsNCi0gICAgICAgICAgICAgICAgY3AueCA9IGNwMS54ICsgZlJhZGl1czEgKiB2eCwgY3AueSA9IGNwMS55ICsgZlJhZGl1czEgKiB2eTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjcCA9IGNwMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZmlsbFBhdGguTGluZVRvKGNwLngsIGNwLnkpOw0KLSAgICAgICAgICAgIGZpbGxQYXRoLkxpbmVUbyhjcDEueCArIGZSYWRpdXMxICogc3gsIGNwMS55ICsgZlJhZGl1czEgKiBzeSk7DQotICAgICAgICB9DQotICAgICAgICBmaWxsUGF0aC5MaW5lVG8oY3AyLnggKyBmUmFkaXVzMiAqIG54LCBjcDIueSArIGZSYWRpdXMyICogbnkpOw0KLSAgICB9DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfRmlsbF9SYWRpYWwoQ1hGQV9Cb3ggYm94LCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX1BhdGggJmZpbGxQYXRoLCBDRlhfUmVjdEYgcnRGaWxsLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KLXsNCi0gICAgQ1hGQV9GaWxsIGZpbGwgPSBib3guR2V0RmlsbCgpOw0KLSAgICBGWF9BUkdCIGNyU3RhcnQsIGNyRW5kOw0KLSAgICBjclN0YXJ0ID0gZmlsbC5HZXRDb2xvcigpOw0KLSAgICBpbnQzMl90IGlUeXBlID0gZmlsbC5HZXRSYWRpYWwoY3JFbmQpOw0KLSAgICBDRlhfU2hhZGluZyBzaGFkaW5nOw0KLSAgICBpZiAoaVR5cGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fVG9FZGdlKSB7DQotICAgICAgICBGWF9BUkdCIHRlbXAgPSBjckVuZDsNCi0gICAgICAgIGNyRW5kID0gY3JTdGFydDsNCi0gICAgICAgIGNyU3RhcnQgPSB0ZW1wOw0KLSAgICB9DQotICAgIHNoYWRpbmcuQ3JlYXRlUmFkaWFsKHJ0RmlsbC5DZW50ZXIoKSwgcnRGaWxsLkNlbnRlcigpLCAwLCBGWFNZU19zcXJ0KHJ0RmlsbC5XaWR0aCgpKnJ0RmlsbC5XaWR0aCgpICsgcnRGaWxsLkhlaWdodCgpKnJ0RmlsbC5IZWlnaHQoKSkgLyAyLCBUUlVFLCBUUlVFLCBjclN0YXJ0LCBjckVuZCk7DQotICAgIENGWF9Db2xvciBjcigmc2hhZGluZyk7DQotICAgIHBHUy0+U2V0RmlsbENvbG9yKCZjcik7DQotICAgIHBHUy0+RmlsbFBhdGgoJmZpbGxQYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfRmlsbF9QYXR0ZXJuKENYRkFfQm94IGJveCwgQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9QYXRoICZmaWxsUGF0aCwgQ0ZYX1JlY3RGIHJ0RmlsbCwgQ0ZYX01hdHJpeCogcE1hdHJpeCkNCi17DQotICAgIENYRkFfRmlsbCBmaWxsID0gYm94LkdldEZpbGwoKTsNCi0gICAgRlhfQVJHQiBjclN0YXJ0LCBjckVuZDsNCi0gICAgY3JTdGFydCA9IGZpbGwuR2V0Q29sb3IoKTsNCi0gICAgaW50MzJfdCBpVHlwZSA9IGZpbGwuR2V0UGF0dGVybihjckVuZCk7DQotICAgIGludDMyX3QgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9Dcm9zczsNCi0gICAgc3dpdGNoKGlUeXBlKSB7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzRGlhZ29uYWw6DQotICAgICAgICAgICAgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9EaWFnb25hbENyb3NzOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbExlZnQ6DQotICAgICAgICAgICAgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9Gb3J3YXJkRGlhZ29uYWw7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RpYWdvbmFsUmlnaHQ6DQotICAgICAgICAgICAgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9CYWNrd2FyZERpYWdvbmFsOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ib3Jpem9udGFsOg0KLSAgICAgICAgICAgIGlIYXRjaCA9IEZYX0hBVENIU1RZTEVfSG9yaXpvbnRhbDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVmVydGljYWw6DQotICAgICAgICAgICAgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9WZXJ0aWNhbDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgQ0ZYX1BhdHRlcm4gcGF0dGVybjsNCi0gICAgcGF0dGVybi5DcmVhdGUoaUhhdGNoLCBjckVuZCwgY3JTdGFydCk7DQotICAgIENGWF9Db2xvciBjcigmcGF0dGVybik7DQotICAgIHBHUy0+U2V0RmlsbENvbG9yKCZjcik7DQotICAgIHBHUy0+RmlsbFBhdGgoJmZpbGxQYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfRmlsbF9MaW5lYXIoQ1hGQV9Cb3ggYm94LCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX1BhdGggJmZpbGxQYXRoLCBDRlhfUmVjdEYgcnRGaWxsLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KLXsNCi0gICAgQ1hGQV9GaWxsIGZpbGwgPSBib3guR2V0RmlsbCgpOw0KLSAgICBGWF9BUkdCIGNyU3RhcnQsIGNyRW5kOw0KLSAgICBjclN0YXJ0ID0gZmlsbC5HZXRDb2xvcigpOw0KLSAgICBpbnQzMl90IGlUeXBlID0gZmlsbC5HZXRMaW5lYXIoY3JFbmQpOw0KLSAgICBDRlhfUG9pbnRGIHB0U3RhcnQsIHB0RW5kOw0KLSAgICBzd2l0Y2goaVR5cGUpIHsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9SaWdodDoNCi0gICAgICAgICAgICBwdFN0YXJ0LlNldChydEZpbGwubGVmdCwgcnRGaWxsLnRvcCk7DQotICAgICAgICAgICAgcHRFbmQuU2V0KHJ0RmlsbC5yaWdodCgpLCBydEZpbGwudG9wKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9Cb3R0b206DQotICAgICAgICAgICAgcHRTdGFydC5TZXQocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3ApOw0KLSAgICAgICAgICAgIHB0RW5kLlNldChydEZpbGwubGVmdCwgcnRGaWxsLmJvdHRvbSgpKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9MZWZ0Og0KLSAgICAgICAgICAgIHB0U3RhcnQuU2V0KHJ0RmlsbC5yaWdodCgpLCBydEZpbGwudG9wKTsNCi0gICAgICAgICAgICBwdEVuZC5TZXQocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3ApOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub1RvcDoNCi0gICAgICAgICAgICBwdFN0YXJ0LlNldChydEZpbGwubGVmdCwgcnRGaWxsLmJvdHRvbSgpKTsNCi0gICAgICAgICAgICBwdEVuZC5TZXQocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3ApOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBDRlhfU2hhZGluZyBzaGFkaW5nOw0KLSAgICBzaGFkaW5nLkNyZWF0ZUF4aWFsKHB0U3RhcnQsIHB0RW5kLCBGQUxTRSwgRkFMU0UsIGNyU3RhcnQsIGNyRW5kKTsNCi0gICAgQ0ZYX0NvbG9yIGNyKCZzaGFkaW5nKTsNCi0gICAgcEdTLT5TZXRGaWxsQ29sb3IoJmNyKTsNCi0gICAgcEdTLT5GaWxsUGF0aCgmZmlsbFBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCi19DQotc3RhdGljIHZvaWQgWEZBX0JPWF9GaWxsKENYRkFfQm94IGJveCwgY29uc3QgQ1hGQV9TdHJva2VBcnJheSAmc3Ryb2tlcywgQ0ZYX0dyYXBoaWNzKiBwR1MsIGNvbnN0IENGWF9SZWN0RiAmcnRXaWRnZXQsIENGWF9NYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGR3RmxhZ3MpDQotew0KLSAgICBDWEZBX0ZpbGwgZmlsbCA9IGJveC5HZXRGaWxsKCk7DQotICAgIGlmICghZmlsbC5Jc0V4aXN0SW5YTUwoKSB8fCBmaWxsLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIHBHUy0+U2F2ZUdyYXBoU3RhdGUoKTsNCi0gICAgQ0ZYX1BhdGggZmlsbFBhdGg7DQotICAgIGZpbGxQYXRoLkNyZWF0ZSgpOw0KLSAgICBYRkFfQk9YX0dldEZpbGxQYXRoKGJveCwgc3Ryb2tlcywgcnRXaWRnZXQsIGZpbGxQYXRoLCAoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpICE9IDApOw0KLSAgICBmaWxsUGF0aC5DbG9zZSgpOw0KLSAgICBpbnQzMl90IGVUeXBlID0gZmlsbC5HZXRGaWxsVHlwZSgpOw0KLSAgICBzd2l0Y2goZVR5cGUpIHsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUmFkaWFsOg0KLSAgICAgICAgICAgIFhGQV9CT1hfRmlsbF9SYWRpYWwoYm94LCBwR1MsIGZpbGxQYXRoLCBydFdpZGdldCwgcE1hdHJpeCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1BhdHRlcm46DQotICAgICAgICAgICAgWEZBX0JPWF9GaWxsX1BhdHRlcm4oYm94LCBwR1MsIGZpbGxQYXRoLCBydFdpZGdldCwgcE1hdHJpeCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0xpbmVhcjoNCi0gICAgICAgICAgICBYRkFfQk9YX0ZpbGxfTGluZWFyKGJveCwgcEdTLCBmaWxsUGF0aCwgcnRXaWRnZXQsIHBNYXRyaXgpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICBGWF9BUkdCIGNyOw0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfU3RpcHBsZSkgew0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUmF0ZSA9IGZpbGwuR2V0U3RpcHBsZShjcik7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaVJhdGUgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlSYXRlID0gMTAwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0NPTE9SUkVGIHJnYjsNCi0gICAgICAgICAgICAgICAgICAgIEFyZ2JEZWNvZGUoY3IsIGEsIHJnYik7DQotICAgICAgICAgICAgICAgICAgICBjciA9IEFyZ2JFbmNvZGUoaVJhdGUgKiBhIC8gMTAwLCByZ2IpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgY3IgPSBmaWxsLkdldENvbG9yKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ0ZYX0NvbG9yIGZpbGxDb2xvcihjcik7DQotICAgICAgICAgICAgICAgIHBHUy0+U2V0RmlsbENvbG9yKCZmaWxsQ29sb3IpOw0KLSAgICAgICAgICAgICAgICBwR1MtPkZpbGxQYXRoKCZmaWxsUGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBwR1MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlUGF0aChDWEZBX1N0cm9rZSBzdHJva2UsIENGWF9QYXRoICpwUGF0aCwgQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXgpDQotew0KLSAgICBpZiAoIXN0cm9rZS5Jc0V4aXN0SW5YTUwoKSB8fCAhc3Ryb2tlLklzVmlzaWJsZSgpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZlRoaWNrbmVzcyA9IHN0cm9rZS5HZXRUaGlja25lc3MoKTsNCi0gICAgaWYgKGZUaGlja25lc3MgPCAwLjAwMWYpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7DQotICAgIGlmKHN0cm9rZS5Jc0Nvcm5lcigpICYmIGZUaGlja25lc3MgPiAyICogc3Ryb2tlLkdldFJhZGl1cygpKSB7DQotICAgICAgICBmVGhpY2tuZXNzID0gMiAqIHN0cm9rZS5HZXRSYWRpdXMoKTsNCi0gICAgfQ0KLSAgICBwR1MtPlNldExpbmVXaWR0aChmVGhpY2tuZXNzLCBUUlVFKTsNCi0gICAgcEdTLT5TZXRMaW5lQ2FwKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcEJ1dHQpOw0KLSAgICBYRkFfU3Ryb2tlVHlwZVNldExpbmVEYXNoKHBHUywgc3Ryb2tlLkdldFN0cm9rZVR5cGUoKSwgWEZBX0FUVFJJQlVURUVOVU1fQnV0dCk7DQotICAgIENGWF9Db2xvciBmeENvbG9yKHN0cm9rZS5HZXRDb2xvcigpKTsNCi0gICAgcEdTLT5TZXRTdHJva2VDb2xvcigmZnhDb2xvcik7DQotICAgIHBHUy0+U3Ryb2tlUGF0aChwUGF0aCwgcE1hdHJpeCk7DQotICAgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCi19DQotc3RhdGljIHZvaWQgWEZBX0JPWF9TdHJva2VBcmMoQ1hGQV9Cb3ggYm94LCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LCBDRlhfTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBkd0ZsYWdzKQ0KLXsNCitzdGF0aWMgdm9pZCBYRkFfQk9YX0dldEZpbGxQYXRoKENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkmIHN0cm9rZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCYgZmlsbFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIGR3RmxhZ3MpIHsNCisgIGlmIChib3guSXNBcmMoKSB8fCAoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpICE9IDApIHsNCiAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3guR2V0RWRnZSgwKTsNCi0gICAgaWYgKCFlZGdlLklzRXhpc3RJblhNTCgpIHx8ICFlZGdlLklzVmlzaWJsZSgpKSB7DQotICAgICAgICByZXR1cm47DQorICAgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSBlZGdlLkdldFRoaWNrbmVzcygpOw0KKyAgICBpZiAoZlRoaWNrbmVzcyA8IDApIHsNCisgICAgICBmVGhpY2tuZXNzID0gMDsNCiAgICAgfQ0KLSAgICBGWF9CT09MIGJWaXNpYmxlID0gRkFMU0U7DQotICAgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSAwOw0KLSAgICBpbnQzMl90IGkzRFR5cGUgPSBib3guR2V0M0RTdHlsZShiVmlzaWJsZSwgZlRoaWNrbmVzcyk7DQotICAgIGlmIChpM0RUeXBlKSB7DQotICAgICAgICBpZiAoYlZpc2libGUgJiYgZlRoaWNrbmVzcyA+PSAwLjAwMWYpIHsNCi0gICAgICAgICAgICBkd0ZsYWdzIHw9IFhGQV9EUkFXQk9YX0xvd2VyZWQzRDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmSGFsZiA9IGVkZ2UuR2V0VGhpY2tuZXNzKCkgLyAyOw0KLSAgICBpZiAoZkhhbGYgPCAwKSB7DQotICAgICAgICBmSGFsZiA9IDA7DQotICAgIH0NCisgICAgRlhfRkxPQVQgZkhhbGYgPSBmVGhpY2tuZXNzIC8gMjsNCiAgICAgaW50MzJfdCBpSGFuZCA9IGJveC5HZXRIYW5kKCk7DQogICAgIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0KSB7DQotICAgICAgICBydFdpZGdldC5JbmZsYXRlKGZIYWxmLCBmSGFsZik7DQorICAgICAgcnRXaWRnZXQuSW5mbGF0ZShmSGFsZiwgZkhhbGYpOw0KICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQotICAgICAgICBydFdpZGdldC5EZWZsYXRlKGZIYWxmLCBmSGFsZik7DQorICAgICAgcnRXaWRnZXQuRGVmbGF0ZShmSGFsZiwgZkhhbGYpOw0KICAgICB9DQotICAgIGlmICgoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpID09IDAgfHwgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Mb3dlcmVkM0QpID09IDApIHsNCi0gICAgICAgIGlmIChmSGFsZiA8IDAuMDAxZikgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9QYXRoIGFyY1BhdGg7DQotICAgICAgICBhcmNQYXRoLkNyZWF0ZSgpOw0KLSAgICAgICAgWEZBX0JPWF9HZXRQYXRoX0FyYyhib3gsIHJ0V2lkZ2V0LCBhcmNQYXRoLCBkd0ZsYWdzKTsNCi0gICAgICAgIFhGQV9CT1hfU3Ryb2tlUGF0aChlZGdlLCAmYXJjUGF0aCwgcEdTLCBwTWF0cml4KTsNCi0gICAgICAgIHJldHVybjsNCisgICAgWEZBX0JPWF9HZXRQYXRoX0FyYyhib3gsIHJ0V2lkZ2V0LCBmaWxsUGF0aCwgZHdGbGFncyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYlNhbWVTdHlsZXMgPSBUUlVFOw0KKyAgaW50MzJfdCBpOw0KKyAgQ1hGQV9TdHJva2Ugc3Ryb2tlMSA9IHN0cm9rZXNbMF07DQorICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7DQorICAgIENYRkFfU3Ryb2tlIHN0cm9rZTIgPSBzdHJva2VzW2ldOw0KKyAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyKSkgew0KKyAgICAgIGJTYW1lU3R5bGVzID0gRkFMU0U7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcEdTLT5TYXZlR3JhcGhTdGF0ZSgpOw0KLSAgICBwR1MtPlNldExpbmVXaWR0aChmSGFsZik7DQotICAgIEZYX0ZMT0FUIGEsIGI7DQotICAgIGEgPSBydFdpZGdldC53aWR0aCAvIDIuMGY7DQotICAgIGIgPSBydFdpZGdldC5oZWlnaHQgLyAyLjBmOw0KLSAgICBpZiAoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpIHsNCi0gICAgICAgIGEgPSBiID0gRlhfTUlOKGEsIGIpOw0KLSAgICB9DQotICAgIENGWF9Qb2ludEYgY2VudGVyID0gcnRXaWRnZXQuQ2VudGVyKCk7DQotICAgIHJ0V2lkZ2V0LmxlZnQgPSBjZW50ZXIueCAtIGE7DQotICAgIHJ0V2lkZ2V0LnRvcCA9IGNlbnRlci55IC0gYjsNCi0gICAgcnRXaWRnZXQud2lkdGggPSBhICsgYTsNCi0gICAgcnRXaWRnZXQuaGVpZ2h0ID0gYiArIGI7DQotICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUgPSAwLCBzd2VlcEFuZ2xlID0gMzYwOw0KLSAgICBzdGFydEFuZ2xlID0gc3RhcnRBbmdsZSAqIEZYX1BJIC8gMTgwLjBmOw0KLSAgICBzd2VlcEFuZ2xlID0gLXN3ZWVwQW5nbGUgKiBGWF9QSSAvIDE4MC4wZjsNCi0gICAgQ0ZYX1BhdGggYXJjUGF0aDsNCi0gICAgYXJjUGF0aC5DcmVhdGUoKTsNCi0gICAgYXJjUGF0aC5BZGRBcmMocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBydFdpZGdldC53aWR0aCwgcnRXaWRnZXQuaGVpZ2h0LCAzLjBmICogRlhfUEkgLyA0LjBmLCBGWF9QSSk7DQotICAgIENGWF9Db2xvciBjcigweEZGODA4MDgwKTsNCi0gICAgcEdTLT5TZXRTdHJva2VDb2xvcigmY3IpOw0KLSAgICBwR1MtPlN0cm9rZVBhdGgoJmFyY1BhdGgsIHBNYXRyaXgpOw0KLSAgICBhcmNQYXRoLkNsZWFyKCk7DQotICAgIGFyY1BhdGguQWRkQXJjKHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsIHJ0V2lkZ2V0LmhlaWdodCwgLTEuMGYgKiBGWF9QSSAvIDQuMGYsIEZYX1BJKTsNCi0gICAgY3IuU2V0KDB4RkZGRkZGRkYpOw0KLSAgICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQotICAgIHBHUy0+U3Ryb2tlUGF0aCgmYXJjUGF0aCwgcE1hdHJpeCk7DQotICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkhhbGYsIGZIYWxmKTsNCi0gICAgYXJjUGF0aC5DbGVhcigpOw0KLSAgICBhcmNQYXRoLkFkZEFyYyhydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIHJ0V2lkZ2V0LndpZHRoLCBydFdpZGdldC5oZWlnaHQsIDMuMGYgKiBGWF9QSSAvIDQuMGYsIEZYX1BJKTsNCi0gICAgY3IuU2V0KDB4RkY0MDQwNDApOw0KLSAgICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQotICAgIHBHUy0+U3Ryb2tlUGF0aCgmYXJjUGF0aCwgcE1hdHJpeCk7DQotICAgIGFyY1BhdGguQ2xlYXIoKTsNCi0gICAgYXJjUGF0aC5BZGRBcmMocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBydFdpZGdldC53aWR0aCwgcnRXaWRnZXQuaGVpZ2h0LCAtMS4wZiAqIEZYX1BJIC8gNC4wZiwgRlhfUEkpOw0KLSAgICBjci5TZXQoMHhGRkMwQzBDMCk7DQotICAgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsNCi0gICAgcEdTLT5TdHJva2VQYXRoKCZhcmNQYXRoLCBwTWF0cml4KTsNCi0gICAgcEdTLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KLX0NCi1zdGF0aWMgdm9pZCBYRkFfRHJhdzNEUmVjdChDRlhfR3JhcGhpY3MqIHBHcmFwaGljLCBjb25zdCBDRlhfUmVjdEYmIHJ0LCBGWF9GTE9BVCBmTGluZVdpZHRoLCBDRlhfTWF0cml4KiBwTWF0cml4LCBGWF9BUkdCIGFyZ2JUb3BMZWZ0LCBGWF9BUkdCIGFyZ2JCb3R0b21SaWdodCkNCi17DQotICAgIENGWF9Db2xvciBjckxUKGFyZ2JUb3BMZWZ0KTsNCi0gICAgcEdyYXBoaWMtPlNldEZpbGxDb2xvcigmY3JMVCk7DQotICAgIEZYX0ZMT0FUIGZCb3R0b20gPSBydC5ib3R0b20oKTsNCi0gICAgRlhfRkxPQVQgZlJpZ2h0ID0gcnQucmlnaHQoKTsNCi0gICAgQ0ZYX1BhdGggcGF0aExUOw0KLSAgICBwYXRoTFQuQ3JlYXRlKCk7DQotICAgIHBhdGhMVC5Nb3ZlVG8ocnQubGVmdCwgZkJvdHRvbSk7DQotICAgIHBhdGhMVC5MaW5lVG8ocnQubGVmdCwgcnQudG9wKTsNCi0gICAgcGF0aExULkxpbmVUbyhmUmlnaHQsIHJ0LnRvcCk7DQotICAgIHBhdGhMVC5MaW5lVG8oZlJpZ2h0IC0gZkxpbmVXaWR0aCwgcnQudG9wICsgZkxpbmVXaWR0aCk7DQotICAgIHBhdGhMVC5MaW5lVG8ocnQubGVmdCArIGZMaW5lV2lkdGgsIHJ0LnRvcCArIGZMaW5lV2lkdGgpOw0KLSAgICBwYXRoTFQuTGluZVRvKHJ0LmxlZnQgKyBmTGluZVdpZHRoLCBmQm90dG9tIC0gZkxpbmVXaWR0aCk7DQotICAgIHBhdGhMVC5MaW5lVG8ocnQubGVmdCwgZkJvdHRvbSk7DQotICAgIHBHcmFwaGljLT5GaWxsUGF0aCgmcGF0aExULCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotICAgIENGWF9Db2xvciBjclJCKGFyZ2JCb3R0b21SaWdodCk7DQotICAgIHBHcmFwaGljLT5TZXRGaWxsQ29sb3IoJmNyUkIpOw0KLSAgICBDRlhfUGF0aCBwYXRoUkI7DQotICAgIHBhdGhSQi5DcmVhdGUoKTsNCi0gICAgcGF0aFJCLk1vdmVUbyhmUmlnaHQsIHJ0LnRvcCk7DQotICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0LCBmQm90dG9tKTsNCi0gICAgcGF0aFJCLkxpbmVUbyhydC5sZWZ0LCBmQm90dG9tKTsNCi0gICAgcGF0aFJCLkxpbmVUbyhydC5sZWZ0ICsgZkxpbmVXaWR0aCwgZkJvdHRvbSAtIGZMaW5lV2lkdGgpOw0KLSAgICBwYXRoUkIuTGluZVRvKGZSaWdodCAtIGZMaW5lV2lkdGgsIGZCb3R0b20gLSBmTGluZVdpZHRoKTsNCi0gICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmTGluZVdpZHRoLCBydC50b3AgKyBmTGluZVdpZHRoKTsNCi0gICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQsIHJ0LnRvcCk7DQotICAgIHBHcmFwaGljLT5GaWxsUGF0aCgmcGF0aFJCLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9Mb3dlcmVkKENGWF9HcmFwaGljcyogcEdTLCBDRlhfUmVjdEYgcnQsIEZYX0ZMT0FUIGZUaGlja25lc3MsIENGWF9NYXRyaXgqIHBNYXRyaXgpDQotew0KLSAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZlRoaWNrbmVzcyAvIDIuMGY7DQotICAgIENGWF9SZWN0RiBydElubmVyKHJ0KTsNCi0gICAgcnRJbm5lci5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOw0KLSAgICBDRlhfQ29sb3IgY3IoMHhGRjAwMDAwMCk7DQotICAgIHBHUy0+U2V0RmlsbENvbG9yKCZjcik7DQotICAgIENGWF9QYXRoIHBhdGg7DQotICAgIHBhdGguQ3JlYXRlKCk7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQud2lkdGgsIHJ0LmhlaWdodCk7DQotICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0SW5uZXIubGVmdCwgcnRJbm5lci50b3AsIHJ0SW5uZXIud2lkdGgsIHJ0SW5uZXIuaGVpZ2h0KTsNCi0gICAgcEdTLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQotICAgIFhGQV9EcmF3M0RSZWN0KHBHUywgcnRJbm5lciwgZkhhbGZXaWR0aCwgcE1hdHJpeCwgMHhGRjgwODA4MCwgMHhGRkMwQzBDMCk7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9SYWlzZWQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9SZWN0RiBydCwgRlhfRkxPQVQgZlRoaWNrbmVzcywgQ0ZYX01hdHJpeCogcE1hdHJpeCkNCi17DQotICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmVGhpY2tuZXNzIC8gMi4wZjsNCi0gICAgQ0ZYX1JlY3RGIHJ0SW5uZXIocnQpOw0KLSAgICBydElubmVyLkRlZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7DQotICAgIENGWF9Db2xvciBjcigweEZGMDAwMDAwKTsNCi0gICAgcEdTLT5TZXRGaWxsQ29sb3IoJmNyKTsNCi0gICAgQ0ZYX1BhdGggcGF0aDsNCi0gICAgcGF0aC5DcmVhdGUoKTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wLCBydC53aWR0aCwgcnQuaGVpZ2h0KTsNCi0gICAgcGF0aC5BZGRSZWN0YW5nbGUocnRJbm5lci5sZWZ0LCBydElubmVyLnRvcCwgcnRJbm5lci53aWR0aCwgcnRJbm5lci5oZWlnaHQpOw0KLSAgICBwR1MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCBwTWF0cml4KTsNCi0gICAgWEZBX0RyYXczRFJlY3QocEdTLCBydElubmVyLCBmSGFsZldpZHRoLCBwTWF0cml4LCAweEZGRkZGRkZGLCAweEZGODA4MDgwKTsNCi19DQotc3RhdGljIHZvaWQgWEZBX0JPWF9TdHJva2VfM0RSZWN0X0V0Y2hlZChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX1JlY3RGIHJ0LCBGWF9GTE9BVCBmVGhpY2tuZXNzLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KLXsNCi0gICAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZUaGlja25lc3MgLyAyLjBmOw0KLSAgICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0LCBmVGhpY2tuZXNzLCBwTWF0cml4LCAweEZGODA4MDgwLCAweEZGRkZGRkZGKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0SW5uZXIocnQpOw0KLSAgICBydElubmVyLkRlZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7DQotICAgIFhGQV9EcmF3M0RSZWN0KHBHUywgcnRJbm5lciwgZkhhbGZXaWR0aCwgcE1hdHJpeCwgMHhGRkZGRkZGRiwgMHhGRjgwODA4MCk7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9FbWJvc3NlZChDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX1JlY3RGIHJ0LCBGWF9GTE9BVCBmVGhpY2tuZXNzLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KLXsNCi0gICAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZUaGlja25lc3MgLyAyLjBmOw0KLSAgICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0LCBmVGhpY2tuZXNzLCBwTWF0cml4LCAweEZGODA4MDgwLCAweEZGMDAwMDAwKTsNCi0gICAgQ0ZYX1JlY3RGIHJ0SW5uZXIocnQpOw0KLSAgICBydElubmVyLkRlZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7DQotICAgIFhGQV9EcmF3M0RSZWN0KHBHUywgcnRJbm5lciwgZkhhbGZXaWR0aCwgcE1hdHJpeCwgMHhGRjAwMDAwMCwgMHhGRjgwODA4MCk7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlX1JlY3QoQ1hGQV9Cb3ggYm94LCBjb25zdCBDWEZBX1N0cm9rZUFycmF5ICZzdHJva2VzLCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KLXsNCi0gICAgRlhfQk9PTCBiVmlzaWJsZSA9IEZBTFNFOw0KLSAgICBGWF9GTE9BVCBmVGhpY2tuZXNzID0gMDsNCi0gICAgaW50MzJfdCBpM0RUeXBlID0gYm94LkdldDNEU3R5bGUoYlZpc2libGUsIGZUaGlja25lc3MpOw0KLSAgICBpZiAoaTNEVHlwZSkgew0KLSAgICAgICAgaWYgKCFiVmlzaWJsZSB8fCBmVGhpY2tuZXNzIDwgMC4wMDFmKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3dpdGNoIChpM0RUeXBlKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Mb3dlcmVkOg0KLSAgICAgICAgICAgICAgICBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfTG93ZXJlZChwR1MsIHJ0V2lkZ2V0LCBmVGhpY2tuZXNzLCBwTWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SYWlzZWQ6DQotICAgICAgICAgICAgICAgIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9SYWlzZWQocEdTLCBydFdpZGdldCwgZlRoaWNrbmVzcywgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRXRjaGVkOg0KLSAgICAgICAgICAgICAgICBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfRXRjaGVkKHBHUywgcnRXaWRnZXQsIGZUaGlja25lc3MsIHBNYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0VtYm9zc2VkOg0KLSAgICAgICAgICAgICAgICBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfRW1ib3NzZWQocEdTLCBydFdpZGdldCwgZlRoaWNrbmVzcywgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYkNsb3NlID0gRkFMU0U7DQotICAgIEZYX0JPT0wgYlNhbWVTdHlsZXMgPSBUUlVFOw0KLSAgICBpbnQzMl90IGk7DQotICAgIENYRkFfU3Ryb2tlIHN0cm9rZTEgPSBzdHJva2VzWzBdOw0KLSAgICBmb3IgKGkgPSAxOyBpIDwgODsgaSArKykgew0KLSAgICAgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMiA9IHN0cm9rZXNbaV07DQotICAgICAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyKSkgew0KLSAgICAgICAgICAgIGJTYW1lU3R5bGVzID0gRkFMU0U7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBzdHJva2UxID0gc3Ryb2tlMjsNCisgICAgc3Ryb2tlMSA9IHN0cm9rZTI7DQorICB9DQorICBpZiAoYlNhbWVTdHlsZXMpIHsNCisgICAgc3Ryb2tlMSA9IHN0cm9rZXNbMF07DQorICAgIGZvciAoaSA9IDI7IGkgPCA4OyBpICs9IDIpIHsNCisgICAgICBDWEZBX1N0cm9rZSBzdHJva2UyID0gc3Ryb2tlc1tpXTsNCisgICAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyLCBYRkFfU1RST0tFX1NBTUVTVFlMRV9Ob1ByZXNlbmNlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1NUUk9LRV9TQU1FU1RZTEVfQ29ybmVyKSkgew0KKyAgICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBzdHJva2UxID0gc3Ryb2tlMjsNCiAgICAgfQ0KICAgICBpZiAoYlNhbWVTdHlsZXMpIHsNCi0gICAgICAgIHN0cm9rZTEgPSBzdHJva2VzWzBdOw0KLSAgICAgICAgYkNsb3NlID0gVFJVRTsNCi0gICAgICAgIGZvciAoaSA9IDI7IGkgPCA4OyBpICs9IDIpIHsNCi0gICAgICAgICAgICBDWEZBX1N0cm9rZSBzdHJva2UyID0gc3Ryb2tlc1tpXTsNCi0gICAgICAgICAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyLCBYRkFfU1RST0tFX1NBTUVTVFlMRV9Ob1ByZXNlbmNlIHwgWEZBX1NUUk9LRV9TQU1FU1RZTEVfQ29ybmVyKSkgew0KLSAgICAgICAgICAgICAgICBiU2FtZVN0eWxlcyA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc3Ryb2tlMSA9IHN0cm9rZTI7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYlNhbWVTdHlsZXMpIHsNCi0gICAgICAgICAgICBzdHJva2UxID0gc3Ryb2tlc1swXTsNCi0gICAgICAgICAgICBpZiAoc3Ryb2tlMS5Jc0ludmVydGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHN0cm9rZTEuR2V0Sm9pblR5cGUoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmUpIHsNCi0gICAgICAgICAgICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICAgICAgc3Ryb2tlMSA9IHN0cm9rZXNbMF07DQorICAgICAgaWYgKHN0cm9rZTEuSXNJbnZlcnRlZCgpKSB7DQorICAgICAgICBiU2FtZVN0eWxlcyA9IEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAoc3Ryb2tlMS5HZXRKb2luVHlwZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZSkgew0KKyAgICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCisgICAgICB9DQogICAgIH0NCi0gICAgRlhfQk9PTCBiU3RhcnQgPSBUUlVFOw0KLSAgICBDRlhfUGF0aCBwYXRoOw0KLSAgICBwYXRoLkNyZWF0ZSgpOw0KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArKykgew0KLSAgICAgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMSA9IHN0cm9rZXNbaV07DQotICAgICAgICBpZiAoKGkgJSAxKSA9PSAwICYmIHN0cm9rZTEuR2V0UmFkaXVzKCkgPCAwKSB7DQotICAgICAgICAgICAgRlhfQk9PTCBiRW1wdHkgPSBwYXRoLklzRW1wdHkoKTsNCi0gICAgICAgICAgICBpZiAoIWJFbXB0eSkgew0KLSAgICAgICAgICAgICAgICBYRkFfQk9YX1N0cm9rZVBhdGgoc3Ryb2tlMSwgJnBhdGgsIHBHUywgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgIHBhdGguQ2xlYXIoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYlN0YXJ0ID0gVFJVRTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIFhGQV9CT1hfR2V0UGF0aChib3gsIHN0cm9rZXMsIHJ0V2lkZ2V0LCBwYXRoLCBpLCBiU3RhcnQsICFiU2FtZVN0eWxlcyk7DQotICAgICAgICBDWEZBX1N0cm9rZSBzdHJva2UyID0gc3Ryb2tlc1soaSArIDEpICUgOF07DQotICAgICAgICBiU3RhcnQgPSAhc3Ryb2tlMS5TYW1lU3R5bGVzKHN0cm9rZTIpOw0KLSAgICAgICAgaWYgKGJTdGFydCkgew0KLSAgICAgICAgICAgIFhGQV9CT1hfU3Ryb2tlUGF0aChzdHJva2UxLCAmcGF0aCwgcEdTLCBwTWF0cml4KTsNCi0gICAgICAgICAgICBwYXRoLkNsZWFyKCk7DQotICAgICAgICB9DQorICB9DQorICBpZiAoYlNhbWVTdHlsZXMpIHsNCisgICAgZmlsbFBhdGguQWRkUmVjdGFuZ2xlKHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBydFdpZGdldC5oZWlnaHQpOw0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJJbnZlcnRlZCwgYlJvdW5kOw0KKyAgRlhfRkxPQVQgZlJhZGl1czEsIGZSYWRpdXMyLCBzeCwgc3ksIHZ4LCB2eSwgbngsIG55Ow0KKyAgQ0ZYX1BvaW50RiBjcCwgY3AxLCBjcDI7DQorICBDRlhfUmVjdEYgcnRSYWRpdXM7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA4OyBpICs9IDIpIHsNCisgICAgQ1hGQV9Db3JuZXIgY29ybmVyMSA9IChDWEZBX05vZGUqKXN0cm9rZXNbaV07DQorICAgIENYRkFfQ29ybmVyIGNvcm5lcjIgPSAoQ1hGQV9Ob2RlKilzdHJva2VzWyhpICsgMikgJSA4XTsNCisgICAgZlJhZGl1czEgPSBjb3JuZXIxLkdldFJhZGl1cygpOw0KKyAgICBmUmFkaXVzMiA9IGNvcm5lcjIuR2V0UmFkaXVzKCk7DQorICAgIGJJbnZlcnRlZCA9IGNvcm5lcjEuSXNJbnZlcnRlZCgpOw0KKyAgICBiUm91bmQgPSBjb3JuZXIxLkdldEpvaW5UeXBlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm91bmQ7DQorICAgIGlmIChiUm91bmQpIHsNCisgICAgICBzeSA9IEZYX1BJIC8gMjsNCiAgICAgfQ0KLSAgICBGWF9CT09MIGJFbXB0eSA9IHBhdGguSXNFbXB0eSgpOw0KLSAgICBpZiAoIWJFbXB0eSkgew0KLSAgICAgICAgaWYoYkNsb3NlKSB7DQotICAgICAgICAgICAgcGF0aC5DbG9zZSgpOw0KKyAgICBzd2l0Y2ggKGkpIHsNCisgICAgICBjYXNlIDA6DQorICAgICAgICBjcDEgPSBydFdpZGdldC5Ub3BMZWZ0KCk7DQorICAgICAgICBjcDIgPSBydFdpZGdldC5Ub3BSaWdodCgpOw0KKyAgICAgICAgdnggPSAxLCB2eSA9IDE7DQorICAgICAgICBueCA9IC0xLCBueSA9IDA7DQorICAgICAgICBpZiAoYlJvdW5kKSB7DQorICAgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgLyAyIDogRlhfUEk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBzeCA9IDEsIHN5ID0gMDsNCiAgICAgICAgIH0NCi0gICAgICAgIFhGQV9CT1hfU3Ryb2tlUGF0aChzdHJva2VzWzddLCAmcGF0aCwgcEdTLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMjoNCisgICAgICAgIGNwMSA9IHJ0V2lkZ2V0LlRvcFJpZ2h0KCk7DQorICAgICAgICBjcDIgPSBydFdpZGdldC5Cb3R0b21SaWdodCgpOw0KKyAgICAgICAgdnggPSAtMSwgdnkgPSAxOw0KKyAgICAgICAgbnggPSAwLCBueSA9IC0xOw0KKyAgICAgICAgaWYgKGJSb3VuZCkgew0KKyAgICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJIDogRlhfUEkgKiAzIC8gMjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHN4ID0gMCwgc3kgPSAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSA0Og0KKyAgICAgICAgY3AxID0gcnRXaWRnZXQuQm90dG9tUmlnaHQoKTsNCisgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LkJvdHRvbUxlZnQoKTsNCisgICAgICAgIHZ4ID0gLTEsIHZ5ID0gLTE7DQorICAgICAgICBueCA9IDEsIG55ID0gMDsNCisgICAgICAgIGlmIChiUm91bmQpIHsNCisgICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyBGWF9QSSAqIDMgLyAyIDogMDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHN4ID0gLTEsIHN5ID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgNjoNCisgICAgICAgIGNwMSA9IHJ0V2lkZ2V0LkJvdHRvbUxlZnQoKTsNCisgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LlRvcExlZnQoKTsNCisgICAgICAgIHZ4ID0gMSwgdnkgPSAtMTsNCisgICAgICAgIG54ID0gMCwgbnkgPSAxOw0KKyAgICAgICAgaWYgKGJSb3VuZCkgew0KKyAgICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IDAgOiBGWF9QSSAvIDI7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBzeCA9IDAsIHN5ID0gLTE7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KKyAgICBpZiAoaSA9PSAwKSB7DQorICAgICAgZmlsbFBhdGguTW92ZVRvKGNwMS54LCBjcDEueSArIGZSYWRpdXMxKTsNCisgICAgfQ0KKyAgICBpZiAoYlJvdW5kKSB7DQorICAgICAgaWYgKGZSYWRpdXMxIDwgMCkgew0KKyAgICAgICAgc3ggLT0gRlhfUEk7DQorICAgICAgfQ0KKyAgICAgIGlmIChiSW52ZXJ0ZWQpIHsNCisgICAgICAgIHN5ICo9IC0xOw0KKyAgICAgIH0NCisgICAgICBydFJhZGl1cy5TZXQoY3AxLngsIGNwMS55LCBmUmFkaXVzMSAqIDIgKiB2eCwgZlJhZGl1czEgKiAyICogdnkpOw0KKyAgICAgIHJ0UmFkaXVzLk5vcm1hbGl6ZSgpOw0KKyAgICAgIGlmIChiSW52ZXJ0ZWQpIHsNCisgICAgICAgIHJ0UmFkaXVzLk9mZnNldCgtZlJhZGl1czEgKiB2eCwgLWZSYWRpdXMxICogdnkpOw0KKyAgICAgIH0NCisgICAgICBmaWxsUGF0aC5BcmNUbyhydFJhZGl1cy5sZWZ0LCBydFJhZGl1cy50b3AsIHJ0UmFkaXVzLndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgIHJ0UmFkaXVzLmhlaWdodCwgc3gsIHN5KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoYkludmVydGVkKSB7DQorICAgICAgICBjcC54ID0gY3AxLnggKyBmUmFkaXVzMSAqIHZ4LCBjcC55ID0gY3AxLnkgKyBmUmFkaXVzMSAqIHZ5Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBjcCA9IGNwMTsNCisgICAgICB9DQorICAgICAgZmlsbFBhdGguTGluZVRvKGNwLngsIGNwLnkpOw0KKyAgICAgIGZpbGxQYXRoLkxpbmVUbyhjcDEueCArIGZSYWRpdXMxICogc3gsIGNwMS55ICsgZlJhZGl1czEgKiBzeSk7DQorICAgIH0NCisgICAgZmlsbFBhdGguTGluZVRvKGNwMi54ICsgZlJhZGl1czIgKiBueCwgY3AyLnkgKyBmUmFkaXVzMiAqIG55KTsNCisgIH0NCiB9DQotc3RhdGljIHZvaWQgWEZBX0JPWF9TdHJva2UoQ1hGQV9Cb3ggYm94LCBjb25zdCBDWEZBX1N0cm9rZUFycmF5ICZzdHJva2VzLCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LCBDRlhfTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBkd0ZsYWdzKQ0KLXsNCi0gICAgaWYgKGJveC5Jc0FyYygpIHx8IChkd0ZsYWdzICYgWEZBX0RSQVdCT1hfRm9yY2VSb3VuZCkgIT0gMCkgew0KLSAgICAgICAgWEZBX0JPWF9TdHJva2VBcmMoYm94LCBwR1MsIHJ0V2lkZ2V0LCBwTWF0cml4LCBkd0ZsYWdzKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJWaXNpYmxlID0gRkFMU0U7DQotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDQ7IGogKyspIHsNCi0gICAgICAgIGJWaXNpYmxlIHw9IHN0cm9rZXNbaiAqIDIgKyAxXS5Jc1Zpc2libGUoKTsNCi0gICAgICAgIGlmIChiVmlzaWJsZSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmICghYlZpc2libGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCA4OyBpICs9IDIpIHsNCi0gICAgICAgIENYRkFfRWRnZSBlZGdlID0gKENYRkFfTm9kZSopc3Ryb2tlc1tpXTsNCi0gICAgICAgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSBlZGdlLkdldFRoaWNrbmVzcygpOw0KLSAgICAgICAgaWYgKGZUaGlja25lc3MgPCAwKSB7DQotICAgICAgICAgICAgZlRoaWNrbmVzcyA9IDA7DQotICAgICAgICB9DQotICAgICAgICBGWF9GTE9BVCBmSGFsZiA9IGZUaGlja25lc3MgLyAyOw0KLSAgICAgICAgaW50MzJfdCBpSGFuZCA9IGJveC5HZXRIYW5kKCk7DQotICAgICAgICBzd2l0Y2ggKGkpIHsNCi0gICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0KSB7DQotICAgICAgICAgICAgICAgICAgICBydFdpZGdldC50b3AgLT0gZkhhbGY7DQotICAgICAgICAgICAgICAgICAgICBydFdpZGdldC5oZWlnaHQgKz0gZkhhbGY7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LnRvcCArPSBmSGFsZjsNCi0gICAgICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LmhlaWdodCAtPSBmSGFsZjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0KSB7DQotICAgICAgICAgICAgICAgICAgICBydFdpZGdldC53aWR0aCArPSBmSGFsZjsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KLSAgICAgICAgICAgICAgICAgICAgcnRXaWRnZXQud2lkdGggLT0gZkhhbGY7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgICAgICBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdCkgew0KLSAgICAgICAgICAgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0ICs9IGZIYWxmOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQotICAgICAgICAgICAgICAgICAgICBydFdpZGdldC5oZWlnaHQgLT0gZkhhbGY7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSA3Og0KLSAgICAgICAgICAgICAgICBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdCkgew0KLSAgICAgICAgICAgICAgICAgICAgcnRXaWRnZXQubGVmdCAtPSBmSGFsZjsNCi0gICAgICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoICs9IGZIYWxmOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQotICAgICAgICAgICAgICAgICAgICBydFdpZGdldC5sZWZ0ICs9IGZIYWxmOw0KLSAgICAgICAgICAgICAgICAgICAgcnRXaWRnZXQud2lkdGggLT0gZkhhbGY7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgWEZBX0JPWF9TdHJva2VfUmVjdChib3gsIHN0cm9rZXMsIHBHUywgcnRXaWRnZXQsIHBNYXRyaXgpOw0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfRmlsbF9SYWRpYWwoQ1hGQV9Cb3ggYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCYgZmlsbFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRGaWxsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ1hGQV9GaWxsIGZpbGwgPSBib3guR2V0RmlsbCgpOw0KKyAgRlhfQVJHQiBjclN0YXJ0LCBjckVuZDsNCisgIGNyU3RhcnQgPSBmaWxsLkdldENvbG9yKCk7DQorICBpbnQzMl90IGlUeXBlID0gZmlsbC5HZXRSYWRpYWwoY3JFbmQpOw0KKyAgQ0ZYX1NoYWRpbmcgc2hhZGluZzsNCisgIGlmIChpVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9Ub0VkZ2UpIHsNCisgICAgRlhfQVJHQiB0ZW1wID0gY3JFbmQ7DQorICAgIGNyRW5kID0gY3JTdGFydDsNCisgICAgY3JTdGFydCA9IHRlbXA7DQorICB9DQorICBzaGFkaW5nLkNyZWF0ZVJhZGlhbChydEZpbGwuQ2VudGVyKCksIHJ0RmlsbC5DZW50ZXIoKSwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3NxcnQocnRGaWxsLldpZHRoKCkgKiBydEZpbGwuV2lkdGgoKSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0RmlsbC5IZWlnaHQoKSAqIHJ0RmlsbC5IZWlnaHQoKSkgLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsDQorICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBUUlVFLCBjclN0YXJ0LCBjckVuZCk7DQorICBDRlhfQ29sb3IgY3IoJnNoYWRpbmcpOw0KKyAgcEdTLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgIHBHUy0+RmlsbFBhdGgoJmZpbGxQYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQogfQ0KLXZvaWQgWEZBX0RyYXdCb3goQ1hGQV9Cb3ggYm94LCBDRlhfR3JhcGhpY3MqIHBHUywgY29uc3QgQ0ZYX1JlY3RGICZydFdpZGdldCwgQ0ZYX01hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZHdGbGFncykNCi17DQotICAgIGlmICghYm94IHx8IGJveC5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCi0gICAgICAgIHJldHVybjsNCitzdGF0aWMgdm9pZCBYRkFfQk9YX0ZpbGxfUGF0dGVybihDWEZBX0JveCBib3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGgmIGZpbGxQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydEZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ1hGQV9GaWxsIGZpbGwgPSBib3guR2V0RmlsbCgpOw0KKyAgRlhfQVJHQiBjclN0YXJ0LCBjckVuZDsNCisgIGNyU3RhcnQgPSBmaWxsLkdldENvbG9yKCk7DQorICBpbnQzMl90IGlUeXBlID0gZmlsbC5HZXRQYXR0ZXJuKGNyRW5kKTsNCisgIGludDMyX3QgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9Dcm9zczsNCisgIHN3aXRjaCAoaVR5cGUpIHsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Dcm9zc0RpYWdvbmFsOg0KKyAgICAgIGlIYXRjaCA9IEZYX0hBVENIU1RZTEVfRGlhZ29uYWxDcm9zczsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbExlZnQ6DQorICAgICAgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9Gb3J3YXJkRGlhZ29uYWw7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGlhZ29uYWxSaWdodDoNCisgICAgICBpSGF0Y2ggPSBGWF9IQVRDSFNUWUxFX0JhY2t3YXJkRGlhZ29uYWw7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSG9yaXpvbnRhbDoNCisgICAgICBpSGF0Y2ggPSBGWF9IQVRDSFNUWUxFX0hvcml6b250YWw7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVmVydGljYWw6DQorICAgICAgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9WZXJ0aWNhbDsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIENGWF9QYXR0ZXJuIHBhdHRlcm47DQorICBwYXR0ZXJuLkNyZWF0ZShpSGF0Y2gsIGNyRW5kLCBjclN0YXJ0KTsNCisgIENGWF9Db2xvciBjcigmcGF0dGVybik7DQorICBwR1MtPlNldEZpbGxDb2xvcigmY3IpOw0KKyAgcEdTLT5GaWxsUGF0aCgmZmlsbFBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9GaWxsX0xpbmVhcihDWEZBX0JveCBib3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoJiBmaWxsUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydEZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDWEZBX0ZpbGwgZmlsbCA9IGJveC5HZXRGaWxsKCk7DQorICBGWF9BUkdCIGNyU3RhcnQsIGNyRW5kOw0KKyAgY3JTdGFydCA9IGZpbGwuR2V0Q29sb3IoKTsNCisgIGludDMyX3QgaVR5cGUgPSBmaWxsLkdldExpbmVhcihjckVuZCk7DQorICBDRlhfUG9pbnRGIHB0U3RhcnQsIHB0RW5kOw0KKyAgc3dpdGNoIChpVHlwZSkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvUmlnaHQ6DQorICAgICAgcHRTdGFydC5TZXQocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3ApOw0KKyAgICAgIHB0RW5kLlNldChydEZpbGwucmlnaHQoKSwgcnRGaWxsLnRvcCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9Cb3R0b206DQorICAgICAgcHRTdGFydC5TZXQocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3ApOw0KKyAgICAgIHB0RW5kLlNldChydEZpbGwubGVmdCwgcnRGaWxsLmJvdHRvbSgpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub0xlZnQ6DQorICAgICAgcHRTdGFydC5TZXQocnRGaWxsLnJpZ2h0KCksIHJ0RmlsbC50b3ApOw0KKyAgICAgIHB0RW5kLlNldChydEZpbGwubGVmdCwgcnRGaWxsLnRvcCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9Ub3A6DQorICAgICAgcHRTdGFydC5TZXQocnRGaWxsLmxlZnQsIHJ0RmlsbC5ib3R0b20oKSk7DQorICAgICAgcHRFbmQuU2V0KHJ0RmlsbC5sZWZ0LCBydEZpbGwudG9wKTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIENGWF9TaGFkaW5nIHNoYWRpbmc7DQorICBzaGFkaW5nLkNyZWF0ZUF4aWFsKHB0U3RhcnQsIHB0RW5kLCBGQUxTRSwgRkFMU0UsIGNyU3RhcnQsIGNyRW5kKTsNCisgIENGWF9Db2xvciBjcigmc2hhZGluZyk7DQorICBwR1MtPlNldEZpbGxDb2xvcigmY3IpOw0KKyAgcEdTLT5GaWxsUGF0aCgmZmlsbFBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9GaWxsKENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hGQV9TdHJva2VBcnJheSYgc3Ryb2tlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCisgIENYRkFfRmlsbCBmaWxsID0gYm94LkdldEZpbGwoKTsNCisgIGlmICghZmlsbC5Jc0V4aXN0SW5YTUwoKSB8fCBmaWxsLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfUGF0aCBmaWxsUGF0aDsNCisgIGZpbGxQYXRoLkNyZWF0ZSgpOw0KKyAgWEZBX0JPWF9HZXRGaWxsUGF0aChib3gsIHN0cm9rZXMsIHJ0V2lkZ2V0LCBmaWxsUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSAhPSAwKTsNCisgIGZpbGxQYXRoLkNsb3NlKCk7DQorICBpbnQzMl90IGVUeXBlID0gZmlsbC5HZXRGaWxsVHlwZSgpOw0KKyAgc3dpdGNoIChlVHlwZSkgew0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1JhZGlhbDoNCisgICAgICBYRkFfQk9YX0ZpbGxfUmFkaWFsKGJveCwgcEdTLCBmaWxsUGF0aCwgcnRXaWRnZXQsIHBNYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1BhdHRlcm46DQorICAgICAgWEZBX0JPWF9GaWxsX1BhdHRlcm4oYm94LCBwR1MsIGZpbGxQYXRoLCBydFdpZGdldCwgcE1hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfTGluZWFyOg0KKyAgICAgIFhGQV9CT1hfRmlsbF9MaW5lYXIoYm94LCBwR1MsIGZpbGxQYXRoLCBydFdpZGdldCwgcE1hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBGWF9BUkdCIGNyOw0KKyAgICAgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9TdGlwcGxlKSB7DQorICAgICAgICBpbnQzMl90IGlSYXRlID0gZmlsbC5HZXRTdGlwcGxlKGNyKTsNCisgICAgICAgIGlmIChpUmF0ZSA9PSAwKSB7DQorICAgICAgICAgIGlSYXRlID0gMTAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaW50MzJfdCBhID0gMDsNCisgICAgICAgIEZYX0NPTE9SUkVGIHJnYjsNCisgICAgICAgIEFyZ2JEZWNvZGUoY3IsIGEsIHJnYik7DQorICAgICAgICBjciA9IEFyZ2JFbmNvZGUoaVJhdGUgKiBhIC8gMTAwLCByZ2IpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBjciA9IGZpbGwuR2V0Q29sb3IoKTsNCisgICAgICB9DQorICAgICAgQ0ZYX0NvbG9yIGZpbGxDb2xvcihjcik7DQorICAgICAgcEdTLT5TZXRGaWxsQ29sb3IoJmZpbGxDb2xvcik7DQorICAgICAgcEdTLT5GaWxsUGF0aCgmZmlsbFBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgfSBicmVhazsNCisgIH0NCisgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9TdHJva2VQYXRoKENYRkFfU3Ryb2tlIHN0cm9rZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGgqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFzdHJva2UuSXNFeGlzdEluWE1MKCkgfHwgIXN0cm9rZS5Jc1Zpc2libGUoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCBmVGhpY2tuZXNzID0gc3Ryb2tlLkdldFRoaWNrbmVzcygpOw0KKyAgaWYgKGZUaGlja25lc3MgPCAwLjAwMWYpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcEdTLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgaWYgKHN0cm9rZS5Jc0Nvcm5lcigpICYmIGZUaGlja25lc3MgPiAyICogc3Ryb2tlLkdldFJhZGl1cygpKSB7DQorICAgIGZUaGlja25lc3MgPSAyICogc3Ryb2tlLkdldFJhZGl1cygpOw0KKyAgfQ0KKyAgcEdTLT5TZXRMaW5lV2lkdGgoZlRoaWNrbmVzcywgVFJVRSk7DQorICBwR1MtPlNldExpbmVDYXAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwQnV0dCk7DQorICBYRkFfU3Ryb2tlVHlwZVNldExpbmVEYXNoKHBHUywgc3Ryb2tlLkdldFN0cm9rZVR5cGUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fQnV0dCk7DQorICBDRlhfQ29sb3IgZnhDb2xvcihzdHJva2UuR2V0Q29sb3IoKSk7DQorICBwR1MtPlNldFN0cm9rZUNvbG9yKCZmeENvbG9yKTsNCisgIHBHUy0+U3Ryb2tlUGF0aChwUGF0aCwgcE1hdHJpeCk7DQorICBwR1MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlQXJjKENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICBDWEZBX0VkZ2UgZWRnZSA9IGJveC5HZXRFZGdlKDApOw0KKyAgaWYgKCFlZGdlLklzRXhpc3RJblhNTCgpIHx8ICFlZGdlLklzVmlzaWJsZSgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYlZpc2libGUgPSBGQUxTRTsNCisgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSAwOw0KKyAgaW50MzJfdCBpM0RUeXBlID0gYm94LkdldDNEU3R5bGUoYlZpc2libGUsIGZUaGlja25lc3MpOw0KKyAgaWYgKGkzRFR5cGUpIHsNCisgICAgaWYgKGJWaXNpYmxlICYmIGZUaGlja25lc3MgPj0gMC4wMDFmKSB7DQorICAgICAgZHdGbGFncyB8PSBYRkFfRFJBV0JPWF9Mb3dlcmVkM0Q7DQogICAgIH0NCi0gICAgaW50MzJfdCBpVHlwZSA9IGJveC5HZXRDbGFzc0lEKCk7DQotICAgIGlmIChpVHlwZSAhPSBYRkFfRUxFTUVOVF9BcmMgJiYgaVR5cGUgIT0gWEZBX0VMRU1FTlRfQm9yZGVyICYmIGlUeXBlICE9IFhGQV9FTEVNRU5UX1JlY3RhbmdsZSkgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkhhbGYgPSBlZGdlLkdldFRoaWNrbmVzcygpIC8gMjsNCisgIGlmIChmSGFsZiA8IDApIHsNCisgICAgZkhhbGYgPSAwOw0KKyAgfQ0KKyAgaW50MzJfdCBpSGFuZCA9IGJveC5HZXRIYW5kKCk7DQorICBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdCkgew0KKyAgICBydFdpZGdldC5JbmZsYXRlKGZIYWxmLCBmSGFsZik7DQorICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkhhbGYsIGZIYWxmKTsNCisgIH0NCisgIGlmICgoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpID09IDAgfHwNCisgICAgICAoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0xvd2VyZWQzRCkgPT0gMCkgew0KKyAgICBpZiAoZkhhbGYgPCAwLjAwMWYpIHsNCisgICAgICByZXR1cm47DQogICAgIH0NCi0gICAgQ1hGQV9TdHJva2VBcnJheSBzdHJva2VzOw0KLSAgICBpZiAoIShkd0ZsYWdzICYgWEZBX0RSQVdCT1hfRm9yY2VSb3VuZCkgJiYgaVR5cGUgIT0gWEZBX0VMRU1FTlRfQXJjKSB7DQotICAgICAgICBib3guR2V0U3Ryb2tlcyhzdHJva2VzKTsNCisgICAgQ0ZYX1BhdGggYXJjUGF0aDsNCisgICAgYXJjUGF0aC5DcmVhdGUoKTsNCisgICAgWEZBX0JPWF9HZXRQYXRoX0FyYyhib3gsIHJ0V2lkZ2V0LCBhcmNQYXRoLCBkd0ZsYWdzKTsNCisgICAgWEZBX0JPWF9TdHJva2VQYXRoKGVkZ2UsICZhcmNQYXRoLCBwR1MsIHBNYXRyaXgpOw0KKyAgICByZXR1cm47DQorICB9DQorICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBwR1MtPlNldExpbmVXaWR0aChmSGFsZik7DQorICBGWF9GTE9BVCBhLCBiOw0KKyAgYSA9IHJ0V2lkZ2V0LndpZHRoIC8gMi4wZjsNCisgIGIgPSBydFdpZGdldC5oZWlnaHQgLyAyLjBmOw0KKyAgaWYgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSB7DQorICAgIGEgPSBiID0gRlhfTUlOKGEsIGIpOw0KKyAgfQ0KKyAgQ0ZYX1BvaW50RiBjZW50ZXIgPSBydFdpZGdldC5DZW50ZXIoKTsNCisgIHJ0V2lkZ2V0LmxlZnQgPSBjZW50ZXIueCAtIGE7DQorICBydFdpZGdldC50b3AgPSBjZW50ZXIueSAtIGI7DQorICBydFdpZGdldC53aWR0aCA9IGEgKyBhOw0KKyAgcnRXaWRnZXQuaGVpZ2h0ID0gYiArIGI7DQorICBGWF9GTE9BVCBzdGFydEFuZ2xlID0gMCwgc3dlZXBBbmdsZSA9IDM2MDsNCisgIHN0YXJ0QW5nbGUgPSBzdGFydEFuZ2xlICogRlhfUEkgLyAxODAuMGY7DQorICBzd2VlcEFuZ2xlID0gLXN3ZWVwQW5nbGUgKiBGWF9QSSAvIDE4MC4wZjsNCisgIENGWF9QYXRoIGFyY1BhdGg7DQorICBhcmNQYXRoLkNyZWF0ZSgpOw0KKyAgYXJjUGF0aC5BZGRBcmMocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBydFdpZGdldC53aWR0aCwgcnRXaWRnZXQuaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgMy4wZiAqIEZYX1BJIC8gNC4wZiwgRlhfUEkpOw0KKyAgQ0ZYX0NvbG9yIGNyKDB4RkY4MDgwODApOw0KKyAgcEdTLT5TZXRTdHJva2VDb2xvcigmY3IpOw0KKyAgcEdTLT5TdHJva2VQYXRoKCZhcmNQYXRoLCBwTWF0cml4KTsNCisgIGFyY1BhdGguQ2xlYXIoKTsNCisgIGFyY1BhdGguQWRkQXJjKHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsIHJ0V2lkZ2V0LmhlaWdodCwNCisgICAgICAgICAgICAgICAgIC0xLjBmICogRlhfUEkgLyA0LjBmLCBGWF9QSSk7DQorICBjci5TZXQoMHhGRkZGRkZGRik7DQorICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQorICBwR1MtPlN0cm9rZVBhdGgoJmFyY1BhdGgsIHBNYXRyaXgpOw0KKyAgcnRXaWRnZXQuRGVmbGF0ZShmSGFsZiwgZkhhbGYpOw0KKyAgYXJjUGF0aC5DbGVhcigpOw0KKyAgYXJjUGF0aC5BZGRBcmMocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBydFdpZGdldC53aWR0aCwgcnRXaWRnZXQuaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgMy4wZiAqIEZYX1BJIC8gNC4wZiwgRlhfUEkpOw0KKyAgY3IuU2V0KDB4RkY0MDQwNDApOw0KKyAgcEdTLT5TZXRTdHJva2VDb2xvcigmY3IpOw0KKyAgcEdTLT5TdHJva2VQYXRoKCZhcmNQYXRoLCBwTWF0cml4KTsNCisgIGFyY1BhdGguQ2xlYXIoKTsNCisgIGFyY1BhdGguQWRkQXJjKHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsIHJ0V2lkZ2V0LmhlaWdodCwNCisgICAgICAgICAgICAgICAgIC0xLjBmICogRlhfUEkgLyA0LjBmLCBGWF9QSSk7DQorICBjci5TZXQoMHhGRkMwQzBDMCk7DQorICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQorICBwR1MtPlN0cm9rZVBhdGgoJmFyY1BhdGgsIHBNYXRyaXgpOw0KKyAgcEdTLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRHJhdzNEUmVjdChDRlhfR3JhcGhpY3MqIHBHcmFwaGljLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYlRvcExlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiQm90dG9tUmlnaHQpIHsNCisgIENGWF9Db2xvciBjckxUKGFyZ2JUb3BMZWZ0KTsNCisgIHBHcmFwaGljLT5TZXRGaWxsQ29sb3IoJmNyTFQpOw0KKyAgRlhfRkxPQVQgZkJvdHRvbSA9IHJ0LmJvdHRvbSgpOw0KKyAgRlhfRkxPQVQgZlJpZ2h0ID0gcnQucmlnaHQoKTsNCisgIENGWF9QYXRoIHBhdGhMVDsNCisgIHBhdGhMVC5DcmVhdGUoKTsNCisgIHBhdGhMVC5Nb3ZlVG8ocnQubGVmdCwgZkJvdHRvbSk7DQorICBwYXRoTFQuTGluZVRvKHJ0LmxlZnQsIHJ0LnRvcCk7DQorICBwYXRoTFQuTGluZVRvKGZSaWdodCwgcnQudG9wKTsNCisgIHBhdGhMVC5MaW5lVG8oZlJpZ2h0IC0gZkxpbmVXaWR0aCwgcnQudG9wICsgZkxpbmVXaWR0aCk7DQorICBwYXRoTFQuTGluZVRvKHJ0LmxlZnQgKyBmTGluZVdpZHRoLCBydC50b3AgKyBmTGluZVdpZHRoKTsNCisgIHBhdGhMVC5MaW5lVG8ocnQubGVmdCArIGZMaW5lV2lkdGgsIGZCb3R0b20gLSBmTGluZVdpZHRoKTsNCisgIHBhdGhMVC5MaW5lVG8ocnQubGVmdCwgZkJvdHRvbSk7DQorICBwR3JhcGhpYy0+RmlsbFBhdGgoJnBhdGhMVCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgQ0ZYX0NvbG9yIGNyUkIoYXJnYkJvdHRvbVJpZ2h0KTsNCisgIHBHcmFwaGljLT5TZXRGaWxsQ29sb3IoJmNyUkIpOw0KKyAgQ0ZYX1BhdGggcGF0aFJCOw0KKyAgcGF0aFJCLkNyZWF0ZSgpOw0KKyAgcGF0aFJCLk1vdmVUbyhmUmlnaHQsIHJ0LnRvcCk7DQorICBwYXRoUkIuTGluZVRvKGZSaWdodCwgZkJvdHRvbSk7DQorICBwYXRoUkIuTGluZVRvKHJ0LmxlZnQsIGZCb3R0b20pOw0KKyAgcGF0aFJCLkxpbmVUbyhydC5sZWZ0ICsgZkxpbmVXaWR0aCwgZkJvdHRvbSAtIGZMaW5lV2lkdGgpOw0KKyAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmTGluZVdpZHRoLCBmQm90dG9tIC0gZkxpbmVXaWR0aCk7DQorICBwYXRoUkIuTGluZVRvKGZSaWdodCAtIGZMaW5lV2lkdGgsIHJ0LnRvcCArIGZMaW5lV2lkdGgpOw0KKyAgcGF0aFJCLkxpbmVUbyhmUmlnaHQsIHJ0LnRvcCk7DQorICBwR3JhcGhpYy0+RmlsbFBhdGgoJnBhdGhSQiwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfTG93ZXJlZChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRoaWNrbmVzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZlRoaWNrbmVzcyAvIDIuMGY7DQorICBDRlhfUmVjdEYgcnRJbm5lcihydCk7DQorICBydElubmVyLkRlZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7DQorICBDRlhfQ29sb3IgY3IoMHhGRjAwMDAwMCk7DQorICBwR1MtPlNldEZpbGxDb2xvcigmY3IpOw0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0LCBydC50b3AsIHJ0LndpZHRoLCBydC5oZWlnaHQpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnRJbm5lci5sZWZ0LCBydElubmVyLnRvcCwgcnRJbm5lci53aWR0aCwgcnRJbm5lci5oZWlnaHQpOw0KKyAgcEdTLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQorICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0SW5uZXIsIGZIYWxmV2lkdGgsIHBNYXRyaXgsIDB4RkY4MDgwODAsIDB4RkZDMEMwQzApOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfUmFpc2VkKENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRoaWNrbmVzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmVGhpY2tuZXNzIC8gMi4wZjsNCisgIENGWF9SZWN0RiBydElubmVyKHJ0KTsNCisgIHJ0SW5uZXIuRGVmbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsNCisgIENGWF9Db2xvciBjcigweEZGMDAwMDAwKTsNCisgIHBHUy0+U2V0RmlsbENvbG9yKCZjcik7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQud2lkdGgsIHJ0LmhlaWdodCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydElubmVyLmxlZnQsIHJ0SW5uZXIudG9wLCBydElubmVyLndpZHRoLCBydElubmVyLmhlaWdodCk7DQorICBwR1MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCBwTWF0cml4KTsNCisgIFhGQV9EcmF3M0RSZWN0KHBHUywgcnRJbm5lciwgZkhhbGZXaWR0aCwgcE1hdHJpeCwgMHhGRkZGRkZGRiwgMHhGRjgwODA4MCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9FdGNoZWQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGhpY2tuZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZUaGlja25lc3MgLyAyLjBmOw0KKyAgWEZBX0RyYXczRFJlY3QocEdTLCBydCwgZlRoaWNrbmVzcywgcE1hdHJpeCwgMHhGRjgwODA4MCwgMHhGRkZGRkZGRik7DQorICBDRlhfUmVjdEYgcnRJbm5lcihydCk7DQorICBydElubmVyLkRlZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7DQorICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0SW5uZXIsIGZIYWxmV2lkdGgsIHBNYXRyaXgsIDB4RkZGRkZGRkYsIDB4RkY4MDgwODApOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfRW1ib3NzZWQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRoaWNrbmVzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZUaGlja25lc3MgLyAyLjBmOw0KKyAgWEZBX0RyYXczRFJlY3QocEdTLCBydCwgZlRoaWNrbmVzcywgcE1hdHJpeCwgMHhGRjgwODA4MCwgMHhGRjAwMDAwMCk7DQorICBDRlhfUmVjdEYgcnRJbm5lcihydCk7DQorICBydElubmVyLkRlZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7DQorICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0SW5uZXIsIGZIYWxmV2lkdGgsIHBNYXRyaXgsIDB4RkYwMDAwMDAsIDB4RkY4MDgwODApOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZV9SZWN0KENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkmIHN0cm9rZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYX0JPT0wgYlZpc2libGUgPSBGQUxTRTsNCisgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSAwOw0KKyAgaW50MzJfdCBpM0RUeXBlID0gYm94LkdldDNEU3R5bGUoYlZpc2libGUsIGZUaGlja25lc3MpOw0KKyAgaWYgKGkzRFR5cGUpIHsNCisgICAgaWYgKCFiVmlzaWJsZSB8fCBmVGhpY2tuZXNzIDwgMC4wMDFmKSB7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQotICAgIFhGQV9CT1hfRmlsbChib3gsIHN0cm9rZXMsIHBHUywgcnRXaWRnZXQsIHBNYXRyaXgsIGR3RmxhZ3MpOw0KLSAgICBYRkFfQk9YX1N0cm9rZShib3gsIHN0cm9rZXMsIHBHUywgcnRXaWRnZXQsIHBNYXRyaXgsIGR3RmxhZ3MpOw0KKyAgICBzd2l0Y2ggKGkzRFR5cGUpIHsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xvd2VyZWQ6DQorICAgICAgICBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfTG93ZXJlZChwR1MsIHJ0V2lkZ2V0LCBmVGhpY2tuZXNzLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmFpc2VkOg0KKyAgICAgICAgWEZBX0JPWF9TdHJva2VfM0RSZWN0X1JhaXNlZChwR1MsIHJ0V2lkZ2V0LCBmVGhpY2tuZXNzLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRXRjaGVkOg0KKyAgICAgICAgWEZBX0JPWF9TdHJva2VfM0RSZWN0X0V0Y2hlZChwR1MsIHJ0V2lkZ2V0LCBmVGhpY2tuZXNzLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRW1ib3NzZWQ6DQorICAgICAgICBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfRW1ib3NzZWQocEdTLCBydFdpZGdldCwgZlRoaWNrbmVzcywgcE1hdHJpeCk7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJDbG9zZSA9IEZBTFNFOw0KKyAgRlhfQk9PTCBiU2FtZVN0eWxlcyA9IFRSVUU7DQorICBpbnQzMl90IGk7DQorICBDWEZBX1N0cm9rZSBzdHJva2UxID0gc3Ryb2tlc1swXTsNCisgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspIHsNCisgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMiA9IHN0cm9rZXNbaV07DQorICAgIGlmICghc3Ryb2tlMS5TYW1lU3R5bGVzKHN0cm9rZTIpKSB7DQorICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBzdHJva2UxID0gc3Ryb2tlMjsNCisgIH0NCisgIGlmIChiU2FtZVN0eWxlcykgew0KKyAgICBzdHJva2UxID0gc3Ryb2tlc1swXTsNCisgICAgYkNsb3NlID0gVFJVRTsNCisgICAgZm9yIChpID0gMjsgaSA8IDg7IGkgKz0gMikgew0KKyAgICAgIENYRkFfU3Ryb2tlIHN0cm9rZTIgPSBzdHJva2VzW2ldOw0KKyAgICAgIGlmICghc3Ryb2tlMS5TYW1lU3R5bGVzKHN0cm9rZTIsIFhGQV9TVFJPS0VfU0FNRVNUWUxFX05vUHJlc2VuY2UgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfU1RST0tFX1NBTUVTVFlMRV9Db3JuZXIpKSB7DQorICAgICAgICBiU2FtZVN0eWxlcyA9IEZBTFNFOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHN0cm9rZTEgPSBzdHJva2UyOw0KKyAgICB9DQorICAgIGlmIChiU2FtZVN0eWxlcykgew0KKyAgICAgIHN0cm9rZTEgPSBzdHJva2VzWzBdOw0KKyAgICAgIGlmIChzdHJva2UxLklzSW52ZXJ0ZWQoKSkgew0KKyAgICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCisgICAgICB9DQorICAgICAgaWYgKHN0cm9rZTEuR2V0Sm9pblR5cGUoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmUpIHsNCisgICAgICAgIGJTYW1lU3R5bGVzID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBGWF9CT09MIGJTdGFydCA9IFRSVUU7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsNCisgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMSA9IHN0cm9rZXNbaV07DQorICAgIGlmICgoaSAlIDEpID09IDAgJiYgc3Ryb2tlMS5HZXRSYWRpdXMoKSA8IDApIHsNCisgICAgICBGWF9CT09MIGJFbXB0eSA9IHBhdGguSXNFbXB0eSgpOw0KKyAgICAgIGlmICghYkVtcHR5KSB7DQorICAgICAgICBYRkFfQk9YX1N0cm9rZVBhdGgoc3Ryb2tlMSwgJnBhdGgsIHBHUywgcE1hdHJpeCk7DQorICAgICAgICBwYXRoLkNsZWFyKCk7DQorICAgICAgfQ0KKyAgICAgIGJTdGFydCA9IFRSVUU7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgWEZBX0JPWF9HZXRQYXRoKGJveCwgc3Ryb2tlcywgcnRXaWRnZXQsIHBhdGgsIGksIGJTdGFydCwgIWJTYW1lU3R5bGVzKTsNCisgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMiA9IHN0cm9rZXNbKGkgKyAxKSAlIDhdOw0KKyAgICBiU3RhcnQgPSAhc3Ryb2tlMS5TYW1lU3R5bGVzKHN0cm9rZTIpOw0KKyAgICBpZiAoYlN0YXJ0KSB7DQorICAgICAgWEZBX0JPWF9TdHJva2VQYXRoKHN0cm9rZTEsICZwYXRoLCBwR1MsIHBNYXRyaXgpOw0KKyAgICAgIHBhdGguQ2xlYXIoKTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBiRW1wdHkgPSBwYXRoLklzRW1wdHkoKTsNCisgIGlmICghYkVtcHR5KSB7DQorICAgIGlmIChiQ2xvc2UpIHsNCisgICAgICBwYXRoLkNsb3NlKCk7DQorICAgIH0NCisgICAgWEZBX0JPWF9TdHJva2VQYXRoKHN0cm9rZXNbN10sICZwYXRoLCBwR1MsIHBNYXRyaXgpOw0KKyAgfQ0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZShDWEZBX0JveCBib3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hGQV9TdHJva2VBcnJheSYgc3Ryb2tlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICBpZiAoYm94LklzQXJjKCkgfHwgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSAhPSAwKSB7DQorICAgIFhGQV9CT1hfU3Ryb2tlQXJjKGJveCwgcEdTLCBydFdpZGdldCwgcE1hdHJpeCwgZHdGbGFncyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYlZpc2libGUgPSBGQUxTRTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDQ7IGorKykgew0KKyAgICBiVmlzaWJsZSB8PSBzdHJva2VzW2ogKiAyICsgMV0uSXNWaXNpYmxlKCk7DQorICAgIGlmIChiVmlzaWJsZSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoIWJWaXNpYmxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IDg7IGkgKz0gMikgew0KKyAgICBDWEZBX0VkZ2UgZWRnZSA9IChDWEZBX05vZGUqKXN0cm9rZXNbaV07DQorICAgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSBlZGdlLkdldFRoaWNrbmVzcygpOw0KKyAgICBpZiAoZlRoaWNrbmVzcyA8IDApIHsNCisgICAgICBmVGhpY2tuZXNzID0gMDsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmSGFsZiA9IGZUaGlja25lc3MgLyAyOw0KKyAgICBpbnQzMl90IGlIYW5kID0gYm94LkdldEhhbmQoKTsNCisgICAgc3dpdGNoIChpKSB7DQorICAgICAgY2FzZSAxOg0KKyAgICAgICAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsNCisgICAgICAgICAgcnRXaWRnZXQudG9wIC09IGZIYWxmOw0KKyAgICAgICAgICBydFdpZGdldC5oZWlnaHQgKz0gZkhhbGY7DQorICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgICAgICAgIHJ0V2lkZ2V0LnRvcCArPSBmSGFsZjsNCisgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0IC09IGZIYWxmOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAzOg0KKyAgICAgICAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsNCisgICAgICAgICAgcnRXaWRnZXQud2lkdGggKz0gZkhhbGY7DQorICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoIC09IGZIYWxmOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSA1Og0KKyAgICAgICAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsNCisgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0ICs9IGZIYWxmOw0KKyAgICAgICAgfSBlbHNlIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KKyAgICAgICAgICBydFdpZGdldC5oZWlnaHQgLT0gZkhhbGY7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDc6DQorICAgICAgICBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdCkgew0KKyAgICAgICAgICBydFdpZGdldC5sZWZ0IC09IGZIYWxmOw0KKyAgICAgICAgICBydFdpZGdldC53aWR0aCArPSBmSGFsZjsNCisgICAgICAgIH0gZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsNCisgICAgICAgICAgcnRXaWRnZXQubGVmdCArPSBmSGFsZjsNCisgICAgICAgICAgcnRXaWRnZXQud2lkdGggLT0gZkhhbGY7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgWEZBX0JPWF9TdHJva2VfUmVjdChib3gsIHN0cm9rZXMsIHBHUywgcnRXaWRnZXQsIHBNYXRyaXgpOw0KK30NCit2b2lkIFhGQV9EcmF3Qm94KENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFdpZGdldCwNCisgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICBpZiAoIWJveCB8fCBib3guR2V0UHJlc2VuY2UoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaVR5cGUgPSBib3guR2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGlUeXBlICE9IFhGQV9FTEVNRU5UX0FyYyAmJiBpVHlwZSAhPSBYRkFfRUxFTUVOVF9Cb3JkZXIgJiYNCisgICAgICBpVHlwZSAhPSBYRkFfRUxFTUVOVF9SZWN0YW5nbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9TdHJva2VBcnJheSBzdHJva2VzOw0KKyAgaWYgKCEoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpICYmIGlUeXBlICE9IFhGQV9FTEVNRU5UX0FyYykgew0KKyAgICBib3guR2V0U3Ryb2tlcyhzdHJva2VzKTsNCisgIH0NCisgIFhGQV9CT1hfRmlsbChib3gsIHN0cm9rZXMsIHBHUywgcnRXaWRnZXQsIHBNYXRyaXgsIGR3RmxhZ3MpOw0KKyAgWEZBX0JPWF9TdHJva2UoYm94LCBzdHJva2VzLCBwR1MsIHJ0V2lkZ2V0LCBwTWF0cml4LCBkd0ZsYWdzKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXQuaAppbmRleCBjNDVkZWY5Li41ZDI2NTk1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXQuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXQuaApAQCAtMTUsMTkxICsxNSwxNzYgQEAKIGNsYXNzIENYRkFfRkZBcHA7DQogY2xhc3MgQ1hGQV9MYXlvdXRJdGVtOw0KIA0KLSNkZWZpbmUgWEZBX0dPVE9fUE9TSVRJT05fSUZfRkFJTChhcmcsIHBvcykgeyBpZiAoIShhcmcpKSBnb3RvIHBvczsgfQ0KLWlubGluZSBGWF9GTE9BVCBYRkFfVW5pdFB4MlB0KEZYX0ZMT0FUIGZQeCwgRlhfRkxPQVQgZkRwaSkNCi17DQotICAgIHJldHVybiBmUHggKiA3Mi4wZiAvIGZEcGk7DQorI2RlZmluZSBYRkFfR09UT19QT1NJVElPTl9JRl9GQUlMKGFyZywgcG9zKSBcDQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIGlmICghKGFyZykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgZ290byBwb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9DQoraW5saW5lIEZYX0ZMT0FUIFhGQV9Vbml0UHgyUHQoRlhfRkxPQVQgZlB4LCBGWF9GTE9BVCBmRHBpKSB7DQorICByZXR1cm4gZlB4ICogNzIuMGYgLyBmRHBpOw0KIH0NCiAjZGVmaW5lIFhGQV9GTE9BVF9QRVJDSVNJT04gMC4wMDFmDQogZW51bSBYRkFfV0lER0VUSVRFTSB7DQotICAgIFhGQV9XSURHRVRJVEVNX1BhcmVudCwNCi0gICAgWEZBX1dJREdFVElURU1fRmlyc3RDaGlsZCwNCi0gICAgWEZBX1dJREdFVElURU1fTmV4dFNpYmxpbmcsDQotICAgIFhGQV9XSURHRVRJVEVNX1ByZXZTaWJsaW5nLA0KKyAgWEZBX1dJREdFVElURU1fUGFyZW50LA0KKyAgWEZBX1dJREdFVElURU1fRmlyc3RDaGlsZCwNCisgIFhGQV9XSURHRVRJVEVNX05leHRTaWJsaW5nLA0KKyAgWEZBX1dJREdFVElURU1fUHJldlNpYmxpbmcsDQogfTsNCi1jbGFzcyBDWEZBX0NhbGNEYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9DYWxjRGF0YSgpIDogbV9pUmVmQ291bnQoMCkge30NCi0gICAgfkNYRkFfQ2FsY0RhdGEoKQ0KLSAgICB7DQotICAgICAgICBtX0dsb2JhbHMuUmVtb3ZlQWxsKCk7DQotICAgIH0NCi0gICAgQ0ZYX1B0ckFycmF5CQkJCW1fR2xvYmFsczsNCi0gICAgaW50MzJfdAkJCQkJbV9pUmVmQ291bnQ7DQorY2xhc3MgQ1hGQV9DYWxjRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfQ2FsY0RhdGEoKSA6IG1faVJlZkNvdW50KDApIHt9DQorICB+Q1hGQV9DYWxjRGF0YSgpIHsgbV9HbG9iYWxzLlJlbW92ZUFsbCgpOyB9DQorICBDRlhfUHRyQXJyYXkgbV9HbG9iYWxzOw0KKyAgaW50MzJfdCBtX2lSZWZDb3VudDsNCiB9Ow0KLWNsYXNzIENYRkFfRkZXaWRnZXQgOiBwdWJsaWMgSVhGQV9XaWRnZXQsIHB1YmxpYyBDRlhfUHJpdmF0ZURhdGEsIHB1YmxpYyBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZXaWRnZXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQotICAgIHZpcnR1YWwgfkNYRkFfRkZXaWRnZXQoKTsNCi0gICAgSVhGQV9QYWdlVmlldyoJR2V0UGFnZVZpZXcoKTsNCi0gICAgdm9pZAkJCVNldFBhZ2VWaWV3KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyk7DQotICAgIHZvaWQJCQlHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiAmcnRXaWRnZXQpOw0KLSAgICBDRlhfUmVjdEYJCVJlQ2FjaGVXaWRnZXRSZWN0KCk7DQotICAgIEZYX0RXT1JECQlHZXRTdGF0dXMoKTsNCi0gICAgdm9pZAkJCU1vZGlmeVN0YXR1cyhGWF9EV09SRCBkd0FkZGVkLCBGWF9EV09SRCBkd1JlbW92ZWQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCQm94KENGWF9SZWN0RiAmcnRCb3gsIEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9CT09MIGJEcmF3Rm9jdXMgPSBGQUxTRSk7DQotICAgIENYRkFfV2lkZ2V0QWNjKglHZXREYXRhQWNjKCk7DQotICAgIEZYX0JPT0wJCQlHZXRUb29sVGlwKENGWF9XaWRlU3RyaW5nICZ3c1Rvb2xUaXApOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLCBGWF9EV09SRCBkd1N0YXR1cyA9IDAsIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KK2NsYXNzIENYRkFfRkZXaWRnZXQgOiBwdWJsaWMgSVhGQV9XaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDRlhfUHJpdmF0ZURhdGEsDQorICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZXaWRnZXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGV2lkZ2V0KCk7DQorICBJWEZBX1BhZ2VWaWV3KiBHZXRQYWdlVmlldygpOw0KKyAgdm9pZCBTZXRQYWdlVmlldyhJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOw0KKyAgdm9pZCBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcnRXaWRnZXQpOw0KKyAgQ0ZYX1JlY3RGIFJlQ2FjaGVXaWRnZXRSZWN0KCk7DQorICBGWF9EV09SRCBHZXRTdGF0dXMoKTsNCisgIHZvaWQgTW9kaWZ5U3RhdHVzKEZYX0RXT1JEIGR3QWRkZWQsIEZYX0RXT1JEIGR3UmVtb3ZlZCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0QkJveChDRlhfUmVjdEYmIHJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEcmF3Rm9jdXMgPSBGQUxTRSk7DQorICBDWEZBX1dpZGdldEFjYyogR2V0RGF0YUFjYygpOw0KKyAgRlhfQk9PTCBHZXRUb29sVGlwKENGWF9XaWRlU3RyaW5nJiB3c1Rvb2xUaXApOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlID0gMCk7DQogDQotICAgIHZpcnR1YWwJRlhfQk9PTAkJCUlzTG9hZGVkKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUxvYWRXaWRnZXQoKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJVW5sb2FkV2lkZ2V0KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUxheW91dFdpZGdldCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlVcGRhdGVGV0xEYXRhKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Nb3VzZUVudGVyKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Nb3VzZUV4aXQoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbkxCdXR0b25EYmxDbGsoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTW91c2VXaGVlbChGWF9EV09SRCBkd0ZsYWdzLCBpbnQxNl90IHpEZWx0YSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25SQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPblJCdXR0b25EYmxDbGsoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0xvYWRlZCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgdm9pZCBVbmxvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBMYXlvdXRXaWRnZXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVcGRhdGVGV0xEYXRhKCk7DQorICB2aXJ0dWFsIHZvaWQgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlRW50ZXIoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlRXhpdCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZVdoZWVsKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgekRlbHRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KIA0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25LZXlEb3duKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25LZXlVcChGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uQ2hhcihGWF9EV09SRCBkd0NoYXIsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KLSAgICB2aXJ0dWFsCUZYX0RXT1JECU9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uU2V0Q3Vyc29yKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuVW5kbygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblJlZG8oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQlVbmRvKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVkbygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhbkNvcHkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5DdXQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5QYXN0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblNlbGVjdEFsbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhbkRlbGV0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDYW5DdXQoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhbkRlU2VsZWN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENhbkNvcHkoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNvcHkoQ0ZYX1dpZGVTdHJpbmcgJndzQ29weSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ3V0KENGWF9XaWRlU3RyaW5nICZ3c0N1dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzUGFzdGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNlbGVjdEFsbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlbGV0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlU2VsZWN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0U3VnZ2VzdFdvcmRzKENGWF9Qb2ludEYgcG9pbnRmLCBDRlhfQnl0ZVN0cmluZ0FycmF5ICZzU3VnZ2VzdCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENYRkFfRkZEb2NWaWV3KgkJR2V0RG9jVmlldygpOw0KLSAgICB2b2lkCQkJCVNldERvY1ZpZXcoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3KQ0KLSAgICB7DQotICAgICAgICBtX3BEb2NWaWV3ID0gcERvY1ZpZXc7DQotICAgIH0NCi0gICAgQ1hGQV9GRkRvYyoJCQlHZXREb2MoKTsNCi0gICAgQ1hGQV9GRkFwcCoJCQlHZXRBcHAoKTsNCi0gICAgSVhGQV9BcHBQcm92aWRlcioJR2V0QXBwUHJvdmlkZXIoKTsNCi0gICAgdm9pZAkJCQlJbnZhbGlkYXRlV2lkZ2V0KGNvbnN0IENGWF9SZWN0RiogcFJlY3QgPSBOVUxMKTsNCi0gICAgdm9pZAkJCQlBZGRJbnZhbGlkYXRlUmVjdChjb25zdCBDRlhfUmVjdEYqIHBSZWN0ID0gTlVMTCk7DQotICAgIEZYX0JPT0wJCQkJR2V0Q2FwdGlvblRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzQ2FwKTsNCi0gICAgRlhfQk9PTAkJCQlJc0ZvY3VzZWQoKTsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtKglHZXRMYXlvdXRJdGVtKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopdGhpczsNCi0gICAgfQ0KLSAgICB2b2lkCQkJCVJvdGF0ZTJOb3JtYWwoRlhfRkxPQVQgJmZ4LCBGWF9GTE9BVCAmZnkpOw0KLSAgICB2b2lkCQkJCUdldFJvdGF0ZU1hdHJpeChDRlhfTWF0cml4ICZtdCk7DQotICAgIEZYX0JPT0wJCQkJSXNMYXlvdXRSZWN0RW1wdHkoKTsNCi0gICAgQ1hGQV9GRldpZGdldCoJCUdldFBhcmVudCgpOw0KLSAgICBGWF9CT09MCQkJCUlzQW5jZXN0b3JPZihDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblNldEZvY3VzKENYRkFfRkZXaWRnZXQqIHBPbGRXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5RG93bihGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5VXAoRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgT25IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25TZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5VbmRvKCkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5SZWRvKCkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKCkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBSZWRvKCkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5Db3B5KCkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5DdXQoKSB7IHJldHVybiBGQUxTRTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIENhblBhc3RlKCkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5TZWxlY3RBbGwoKSB7IHJldHVybiBGQUxTRTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIENhbkRlbGV0ZSgpIHsgcmV0dXJuIENhbkN1dCgpOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuRGVTZWxlY3QoKSB7IHJldHVybiBDYW5Db3B5KCk7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpIHsgcmV0dXJuIEZBTFNFOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgQ3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBTZWxlY3RBbGwoKSB7IHJldHVybiBGQUxTRTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIERlbGV0ZSgpIHsgcmV0dXJuIEZBTFNFOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVTZWxlY3QoKSB7IHJldHVybiBGQUxTRTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEdldFN1Z2dlc3RXb3JkcyhDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9CT09MIFJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlcGxhY2UpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9GRkRvY1ZpZXcqIEdldERvY1ZpZXcoKTsNCisgIHZvaWQgU2V0RG9jVmlldyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcpIHsgbV9wRG9jVmlldyA9IHBEb2NWaWV3OyB9DQorICBDWEZBX0ZGRG9jKiBHZXREb2MoKTsNCisgIENYRkFfRkZBcHAqIEdldEFwcCgpOw0KKyAgSVhGQV9BcHBQcm92aWRlciogR2V0QXBwUHJvdmlkZXIoKTsNCisgIHZvaWQgSW52YWxpZGF0ZVdpZGdldChjb25zdCBDRlhfUmVjdEYqIHBSZWN0ID0gTlVMTCk7DQorICB2b2lkIEFkZEludmFsaWRhdGVSZWN0KGNvbnN0IENGWF9SZWN0RiogcFJlY3QgPSBOVUxMKTsNCisgIEZYX0JPT0wgR2V0Q2FwdGlvblRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwKTsNCisgIEZYX0JPT0wgSXNGb2N1c2VkKCk7DQorICBDWEZBX0xheW91dEl0ZW0qIEdldExheW91dEl0ZW0oKSB7DQorICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKikoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXRoaXM7DQorICB9DQorICB2b2lkIFJvdGF0ZTJOb3JtYWwoRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpOw0KKyAgdm9pZCBHZXRSb3RhdGVNYXRyaXgoQ0ZYX01hdHJpeCYgbXQpOw0KKyAgRlhfQk9PTCBJc0xheW91dFJlY3RFbXB0eSgpOw0KKyAgQ1hGQV9GRldpZGdldCogR2V0UGFyZW50KCk7DQorICBGWF9CT09MIElzQW5jZXN0b3JPZihDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KTsNCiANCi1wcm90ZWN0ZWQ6DQotICAgIHZpcnR1YWwJRlhfQk9PTAlQdEluQWN0aXZlUmVjdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2b2lkCURyYXdCb3JkZXIoQ0ZYX0dyYXBoaWNzKiBwR1MsIENYRkFfQm94IGJveCwgY29uc3QgQ0ZYX1JlY3RGJiBydEJvcmRlciwgQ0ZYX01hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZHdGbGFncyA9IDApOw0KLSAgICB2b2lkCUdldE1pbk1heFdpZHRoKEZYX0ZMT0FUIGZNaW5XaWR0aCwgRlhfRkxPQVQgZk1heFdpZHRoKTsNCi0gICAgdm9pZAlHZXRNaW5NYXhIZWlnaHQoRlhfRkxPQVQgZk1pbkhlaWdodCwgRlhfRkxPQVQgZk1heEhlaWdodCk7DQotICAgIHZvaWQJR2V0UmVjdFdpdGhvdXRSb3RhdGUoQ0ZYX1JlY3RGICZydFdpZGdldCk7DQotICAgIEZYX0JPT0wgSXNNYXRjaFZpc2libGVTdGF0dXMoRlhfRFdPUkQgZHdTdGF0dXMpOw0KKyBwcm90ZWN0ZWQ6DQorICB2aXJ0dWFsIEZYX0JPT0wgUHRJbkFjdGl2ZVJlY3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgRHJhd0JvcmRlcihDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICBDWEZBX0JveCBib3gsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEJvcmRlciwNCisgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSAwKTsNCisgIHZvaWQgR2V0TWluTWF4V2lkdGgoRlhfRkxPQVQgZk1pbldpZHRoLCBGWF9GTE9BVCBmTWF4V2lkdGgpOw0KKyAgdm9pZCBHZXRNaW5NYXhIZWlnaHQoRlhfRkxPQVQgZk1pbkhlaWdodCwgRlhfRkxPQVQgZk1heEhlaWdodCk7DQorICB2b2lkIEdldFJlY3RXaXRob3V0Um90YXRlKENGWF9SZWN0RiYgcnRXaWRnZXQpOw0KKyAgRlhfQk9PTCBJc01hdGNoVmlzaWJsZVN0YXR1cyhGWF9EV09SRCBkd1N0YXR1cyk7DQogDQotICAgIHZvaWQJCUV2ZW50S2lsbEZvY3VzKCk7DQotICAgIEZYX0JPT0wJCUlzQnV0dG9uRG93bigpOw0KLSAgICB2b2lkCQlTZXRCdXR0b25Eb3duKEZYX0JPT0wgYlNldCk7DQotICAgIENYRkFfRkZEb2NWaWV3KgkJbV9wRG9jVmlldzsNCi0gICAgQ1hGQV9GRlBhZ2VWaWV3KgltX3BQYWdlVmlldzsNCi0gICAgQ1hGQV9XaWRnZXRBY2MqCQltX3BEYXRhQWNjOw0KLSAgICBDRlhfUmVjdEYJCQltX3J0V2lkZ2V0Ow0KKyAgdm9pZCBFdmVudEtpbGxGb2N1cygpOw0KKyAgRlhfQk9PTCBJc0J1dHRvbkRvd24oKTsNCisgIHZvaWQgU2V0QnV0dG9uRG93bihGWF9CT09MIGJTZXQpOw0KKyAgQ1hGQV9GRkRvY1ZpZXcqIG1fcERvY1ZpZXc7DQorICBDWEZBX0ZGUGFnZVZpZXcqIG1fcFBhZ2VWaWV3Ow0KKyAgQ1hGQV9XaWRnZXRBY2MqIG1fcERhdGFBY2M7DQorICBDRlhfUmVjdEYgbV9ydFdpZGdldDsNCiB9Ow0KLWludDMyX3QJCVhGQV9TdHJva2VUeXBlU2V0TGluZURhc2goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGludDMyX3QgaVN0cm9rZVR5cGUsIGludDMyX3QgaUNhcFR5cGUpOw0KK2ludDMyX3QgWEZBX1N0cm9rZVR5cGVTZXRMaW5lRGFzaChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3Ryb2tlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ2FwVHlwZSk7DQogQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIFhGQV9MaW5lQ2FwVG9GWEdFKGludDMyX3QgaUxpbmVDYXApOw0KLXZvaWQJCQlYRkFfRHJhd0ltYWdlKENGWF9HcmFwaGljcyogcEdTLCBjb25zdCBDRlhfUmVjdEYgJnJ0SW1hZ2UsIENGWF9NYXRyaXgqIHBNYXRyaXgsIENGWF9ESUJpdG1hcCogcERJQml0bWFwLCBpbnQzMl90IGlBc3BlY3QsIGludDMyX3QgaUltYWdlWERwaSwgaW50MzJfdCBpSW1hZ2VZRHBpLCBpbnQzMl90IGlIb3J6QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0LCBpbnQzMl90IGlWZXJ0QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9Ub3ApOw0KLUNGWF9ESUJpdG1hcCoJWEZBX0xvYWRJbWFnZURhdGEoQ1hGQV9GRkRvYyAqcERvYywgQ1hGQV9JbWFnZSAqcEltYWdlLCBGWF9CT09MICZiTmFtZUltYWdlLCBpbnQzMl90ICZpSW1hZ2VYRHBpLCBpbnQzMl90ICZpSW1hZ2VZRHBpKTsNCi1DRlhfRElCaXRtYXAqCVhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKElGWF9GaWxlUmVhZCogcEltYWdlRmlsZVJlYWQsIEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlLCBpbnQzMl90ICZpSW1hZ2VYRHBpLCBpbnQzMl90ICZpSW1hZ2VZRHBpKTsNCit2b2lkIFhGQV9EcmF3SW1hZ2UoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJbWFnZSwNCisgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFzcGVjdCwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW1hZ2VYRHBpLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbWFnZVlEcGksDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUhvcnpBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZlcnRBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCk7DQorQ0ZYX0RJQml0bWFwKiBYRkFfTG9hZEltYWdlRGF0YShDWEZBX0ZGRG9jKiBwRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9JbWFnZSogcEltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYk5hbWVJbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbWFnZVhEcGksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKTsNCitDRlhfRElCaXRtYXAqIFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKElGWF9GaWxlUmVhZCogcEltYWdlRmlsZVJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWENPREVDX0lNQUdFX1RZUEUgdHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbWFnZVhEcGksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKTsNCiBGWENPREVDX0lNQUdFX1RZUEUgWEZBX0dldEltYWdlVHlwZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVHlwZSk7DQotRlhfQ0hBUioJCVhGQV9CYXNlNjRFbmNvZGUoY29uc3QgdWludDhfdCogYnVmLCBpbnQzMl90IGJ1Zl9sZW4pOw0KLXZvaWQJCQlYRkFfUmVjdFdpZHRob3V0TWFyZ2luKENGWF9SZWN0RiAmcnQsIGNvbnN0IENYRkFfTWFyZ2luICZtZywgRlhfQk9PTCBiVUkgPSBGQUxTRSk7DQotRlhfRkxPQVQJCVhGQV9HZXRFZGdlVGhpY2tuZXNzKGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkgJnN0cm9rZXMsIEZYX0JPT0wgYjNEU3R5bGUsIGludDMyX3QgbkluZGV4KTsNCi1DWEZBX0ZGV2lkZ2V0KglYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7DQotRlhfQk9PTAkJCVhGQV9Jc0NyZWF0ZVdpZGdldChYRkFfRUxFTUVOVCBpVHlwZSk7DQotI2RlZmluZSBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kCTENCi0jZGVmaW5lIFhGQV9EUkFXQk9YX0xvd2VyZWQzRAkyDQotdm9pZCBYRkFfRHJhd0JveChDWEZBX0JveCBib3gsIENGWF9HcmFwaGljcyogcEdTLCBjb25zdCBDRlhfUmVjdEYgJnJ0V2lkZ2V0LCBDRlhfTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBkd0ZsYWdzID0gMCk7DQorRlhfQ0hBUiogWEZBX0Jhc2U2NEVuY29kZShjb25zdCB1aW50OF90KiBidWYsIGludDMyX3QgYnVmX2xlbik7DQordm9pZCBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKENGWF9SZWN0RiYgcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYRkFfTWFyZ2luJiBtZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVUkgPSBGQUxTRSk7DQorRlhfRkxPQVQgWEZBX0dldEVkZ2VUaGlja25lc3MoY29uc3QgQ1hGQV9TdHJva2VBcnJheSYgc3Ryb2tlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGIzRFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KTsNCitDWEZBX0ZGV2lkZ2V0KiBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7DQorRlhfQk9PTCBYRkFfSXNDcmVhdGVXaWRnZXQoWEZBX0VMRU1FTlQgaVR5cGUpOw0KKyNkZWZpbmUgWEZBX0RSQVdCT1hfRm9yY2VSb3VuZCAxDQorI2RlZmluZSBYRkFfRFJBV0JPWF9Mb3dlcmVkM0QgMg0KK3ZvaWQgWEZBX0RyYXdCb3goQ1hGQV9Cb3ggYm94LA0KKyAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSAwKTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRhY2MuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmNwcAppbmRleCA0MDVlNThlLi5jZDFlY2FlIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRhY2MuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldGFjYy5jcHAKQEAgLTE4LDE2OTYgKzE4LDE2OTYgQEAKICNpbmNsdWRlICJ4ZmFfZmZjaGVja2J1dHRvbi5oIg0KICNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXRhY2MuaCINCiAjaW5jbHVkZSAieGZhX2ZvbnRtZ3IuaCINCi1zdGF0aWMgdm9pZCBYRkFfRkZEZWxldGVDYWxjRGF0YSh2b2lkKiBwRGF0YSkNCi17DQotICAgIGlmIChwRGF0YSkgew0KLSAgICAgICAgZGVsZXRlICgoQ1hGQV9DYWxjRGF0YSopcERhdGEpOw0KLSAgICB9DQorc3RhdGljIHZvaWQgWEZBX0ZGRGVsZXRlQ2FsY0RhdGEodm9pZCogcERhdGEpIHsNCisgIGlmIChwRGF0YSkgew0KKyAgICBkZWxldGUgKChDWEZBX0NhbGNEYXRhKilwRGF0YSk7DQorICB9DQogfQ0KLXN0YXRpYyBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGdzX1hGQURlbGV0ZUNhbGNEYXRhID0ge1hGQV9GRkRlbGV0ZUNhbGNEYXRhLCBOVUxMfTsNCi1jbGFzcyBDWEZBX1dpZGdldExheW91dERhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX1dpZGdldExheW91dERhdGEoKQ0KLSAgICAgICAgOiBtX2ZXaWRnZXRIZWlnaHQoLTEpDQotICAgIHsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIH5DWEZBX1dpZGdldExheW91dERhdGEoKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIGRlbGV0ZSB0aGlzOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUCQkJbV9mV2lkZ2V0SGVpZ2h0Ow0KK3N0YXRpYyBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGdzX1hGQURlbGV0ZUNhbGNEYXRhID0gew0KKyAgICBYRkFfRkZEZWxldGVDYWxjRGF0YSwgTlVMTH07DQorY2xhc3MgQ1hGQV9XaWRnZXRMYXlvdXREYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9XaWRnZXRMYXlvdXREYXRhKCkgOiBtX2ZXaWRnZXRIZWlnaHQoLTEpIHt9DQorICB2aXJ0dWFsIH5DWEZBX1dpZGdldExheW91dERhdGEoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICBGWF9GTE9BVCBtX2ZXaWRnZXRIZWlnaHQ7DQogfTsNCi1jbGFzcyBDWEZBX1RleHRMYXlvdXREYXRhIDogcHVibGljIENYRkFfV2lkZ2V0TGF5b3V0RGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfVGV4dExheW91dERhdGEoKQ0KLSAgICAgICAgOiBtX3BUZXh0TGF5b3V0KE5VTEwpDQotICAgICAgICAsIG1fcFRleHRQcm92aWRlcihOVUxMKQ0KLSAgICB7DQorY2xhc3MgQ1hGQV9UZXh0TGF5b3V0RGF0YSA6IHB1YmxpYyBDWEZBX1dpZGdldExheW91dERhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX1RleHRMYXlvdXREYXRhKCkgOiBtX3BUZXh0TGF5b3V0KE5VTEwpLCBtX3BUZXh0UHJvdmlkZXIoTlVMTCkge30NCisgIH5DWEZBX1RleHRMYXlvdXREYXRhKCkgew0KKyAgICBpZiAobV9wVGV4dExheW91dCkgew0KKyAgICAgIGRlbGV0ZSBtX3BUZXh0TGF5b3V0Ow0KICAgICB9DQotICAgIH5DWEZBX1RleHRMYXlvdXREYXRhKCkNCi0gICAgew0KLSAgICAgICAgaWYgKG1fcFRleHRMYXlvdXQpIHsNCi0gICAgICAgICAgICBkZWxldGUgbV9wVGV4dExheW91dDsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcFRleHRMYXlvdXQgPSBOVUxMOw0KLSAgICAgICAgaWYgKG1fcFRleHRQcm92aWRlcikgew0KLSAgICAgICAgICAgIGRlbGV0ZSBtX3BUZXh0UHJvdmlkZXI7DQotICAgICAgICB9DQotICAgICAgICBtX3BUZXh0UHJvdmlkZXIgPSBOVUxMOw0KKyAgICBtX3BUZXh0TGF5b3V0ID0gTlVMTDsNCisgICAgaWYgKG1fcFRleHRQcm92aWRlcikgew0KKyAgICAgIGRlbGV0ZSBtX3BUZXh0UHJvdmlkZXI7DQogICAgIH0NCi0gICAgRlhfQk9PTCBMb2FkVGV4dChDWEZBX1dpZGdldEFjYyogcEFjYykNCi0gICAgew0KLSAgICAgICAgaWYgKG1fcFRleHRMYXlvdXQpIHsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcFRleHRQcm92aWRlciA9IEZYX05FVyBDWEZBX1RleHRQcm92aWRlcihwQWNjLCBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KTsNCi0gICAgICAgIG1fcFRleHRMYXlvdXQgPSBGWF9ORVcgQ1hGQV9UZXh0TGF5b3V0KG1fcFRleHRQcm92aWRlcik7DQotICAgICAgICByZXR1cm4gbV9wVGV4dExheW91dCAhPSBOVUxMOw0KKyAgICBtX3BUZXh0UHJvdmlkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgRlhfQk9PTCBMb2FkVGV4dChDWEZBX1dpZGdldEFjYyogcEFjYykgew0KKyAgICBpZiAobV9wVGV4dExheW91dCkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KICAgICB9DQotICAgIENYRkFfVGV4dExheW91dCoJbV9wVGV4dExheW91dDsNCi0gICAgQ1hGQV9UZXh0UHJvdmlkZXIJKm1fcFRleHRQcm92aWRlcjsNCisgICAgbV9wVGV4dFByb3ZpZGVyID0gRlhfTkVXIENYRkFfVGV4dFByb3ZpZGVyKHBBY2MsIFhGQV9URVhUUFJPVklERVJUWVBFX1RleHQpOw0KKyAgICBtX3BUZXh0TGF5b3V0ID0gRlhfTkVXIENYRkFfVGV4dExheW91dChtX3BUZXh0UHJvdmlkZXIpOw0KKyAgICByZXR1cm4gbV9wVGV4dExheW91dCAhPSBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9UZXh0TGF5b3V0KiBtX3BUZXh0TGF5b3V0Ow0KKyAgQ1hGQV9UZXh0UHJvdmlkZXIqIG1fcFRleHRQcm92aWRlcjsNCiB9Ow0KLWNsYXNzIENYRkFfSW1hZ2VMYXlvdXREYXRhIDogcHVibGljIENYRkFfV2lkZ2V0TGF5b3V0RGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfSW1hZ2VMYXlvdXREYXRhKCkNCi0gICAgICAgIDogbV9wRElCaXRtYXAoTlVMTCkNCi0gICAgICAgICwgbV9iTmFtZWRJbWFnZShGQUxTRSkNCi0gICAgICAgICwgbV9pSW1hZ2VYRHBpKDApDQotICAgICAgICAsIG1faUltYWdlWURwaSgwKQ0KLSAgICB7DQotICAgIH0NCitjbGFzcyBDWEZBX0ltYWdlTGF5b3V0RGF0YSA6IHB1YmxpYyBDWEZBX1dpZGdldExheW91dERhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0ltYWdlTGF5b3V0RGF0YSgpDQorICAgICAgOiBtX3BESUJpdG1hcChOVUxMKSwNCisgICAgICAgIG1fYk5hbWVkSW1hZ2UoRkFMU0UpLA0KKyAgICAgICAgbV9pSW1hZ2VYRHBpKDApLA0KKyAgICAgICAgbV9pSW1hZ2VZRHBpKDApIHt9DQogDQotICAgIH5DWEZBX0ltYWdlTGF5b3V0RGF0YSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1fcERJQml0bWFwICYmICFtX2JOYW1lZEltYWdlKSB7DQotICAgICAgICAgICAgZGVsZXRlIG1fcERJQml0bWFwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wRElCaXRtYXAgPSBOVUxMOw0KKyAgfkNYRkFfSW1hZ2VMYXlvdXREYXRhKCkgew0KKyAgICBpZiAobV9wRElCaXRtYXAgJiYgIW1fYk5hbWVkSW1hZ2UpIHsNCisgICAgICBkZWxldGUgbV9wRElCaXRtYXA7DQogICAgIH0NCisgICAgbV9wRElCaXRtYXAgPSBOVUxMOw0KKyAgfQ0KIA0KLSAgICBGWF9CT09MIExvYWRJbWFnZURhdGEoQ1hGQV9XaWRnZXRBY2MqIHBBY2MpDQotICAgIHsNCi0gICAgICAgIGlmKG1fcERJQml0bWFwKSB7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX1ZhbHVlIHZhbHVlID0gcEFjYy0+R2V0Rm9ybVZhbHVlKCk7DQotICAgICAgICBpZiAoIXZhbHVlKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9JbWFnZSBpbWFnZU9iaiA9IHZhbHVlLkdldEltYWdlKCk7DQotICAgICAgICBpZiAoIWltYWdlT2JqKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9GRkRvYyAqcEZGRG9jID0gcEFjYy0+R2V0RG9jKCk7DQotICAgICAgICBwQWNjLT5TZXRJbWFnZUltYWdlKFhGQV9Mb2FkSW1hZ2VEYXRhKHBGRkRvYywgJmltYWdlT2JqLCBtX2JOYW1lZEltYWdlLCBtX2lJbWFnZVhEcGksIG1faUltYWdlWURwaSkpOw0KLSAgICAgICAgcmV0dXJuIG1fcERJQml0bWFwICE9IE5VTEw7DQorICBGWF9CT09MIExvYWRJbWFnZURhdGEoQ1hGQV9XaWRnZXRBY2MqIHBBY2MpIHsNCisgICAgaWYgKG1fcERJQml0bWFwKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCisgICAgQ1hGQV9WYWx1ZSB2YWx1ZSA9IHBBY2MtPkdldEZvcm1WYWx1ZSgpOw0KKyAgICBpZiAoIXZhbHVlKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENYRkFfSW1hZ2UgaW1hZ2VPYmogPSB2YWx1ZS5HZXRJbWFnZSgpOw0KKyAgICBpZiAoIWltYWdlT2JqKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENYRkFfRkZEb2MqIHBGRkRvYyA9IHBBY2MtPkdldERvYygpOw0KKyAgICBwQWNjLT5TZXRJbWFnZUltYWdlKFhGQV9Mb2FkSW1hZ2VEYXRhKHBGRkRvYywgJmltYWdlT2JqLCBtX2JOYW1lZEltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faUltYWdlWERwaSwgbV9pSW1hZ2VZRHBpKSk7DQorICAgIHJldHVybiBtX3BESUJpdG1hcCAhPSBOVUxMOw0KKyAgfQ0KIA0KLSAgICBDRlhfRElCaXRtYXAqCQkJbV9wRElCaXRtYXA7DQotICAgIEZYX0JPT0wJCQkJCW1fYk5hbWVkSW1hZ2U7DQotICAgIGludDMyX3QJCQkJbV9pSW1hZ2VYRHBpOw0KLSAgICBpbnQzMl90CQkJCW1faUltYWdlWURwaTsNCisgIENGWF9ESUJpdG1hcCogbV9wRElCaXRtYXA7DQorICBGWF9CT09MIG1fYk5hbWVkSW1hZ2U7DQorICBpbnQzMl90IG1faUltYWdlWERwaTsNCisgIGludDMyX3QgbV9pSW1hZ2VZRHBpOw0KIH07DQotY2xhc3MgQ1hGQV9GaWVsZExheW91dERhdGEgOiBwdWJsaWMgQ1hGQV9XaWRnZXRMYXlvdXREYXRhDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GaWVsZExheW91dERhdGEoKQ0KLSAgICAgICAgOiBtX3BDYXBUZXh0TGF5b3V0KE5VTEwpDQotICAgICAgICAsIG1fcENhcFRleHRQcm92aWRlcihOVUxMKQ0KLSAgICAgICAgLCBtX3BUZXh0T3V0KE5VTEwpDQotICAgICAgICAsIG1fcEZpZWxkU3BsaXRBcnJheShOVUxMKQ0KLSAgICB7DQorY2xhc3MgQ1hGQV9GaWVsZExheW91dERhdGEgOiBwdWJsaWMgQ1hGQV9XaWRnZXRMYXlvdXREYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GaWVsZExheW91dERhdGEoKQ0KKyAgICAgIDogbV9wQ2FwVGV4dExheW91dChOVUxMKSwNCisgICAgICAgIG1fcENhcFRleHRQcm92aWRlcihOVUxMKSwNCisgICAgICAgIG1fcFRleHRPdXQoTlVMTCksDQorICAgICAgICBtX3BGaWVsZFNwbGl0QXJyYXkoTlVMTCkge30NCisgIH5DWEZBX0ZpZWxkTGF5b3V0RGF0YSgpIHsNCisgICAgaWYgKG1fcENhcFRleHRMYXlvdXQpIHsNCisgICAgICBkZWxldGUgbV9wQ2FwVGV4dExheW91dDsNCiAgICAgfQ0KLSAgICB+Q1hGQV9GaWVsZExheW91dERhdGEoKQ0KLSAgICB7DQotICAgICAgICBpZiAobV9wQ2FwVGV4dExheW91dCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBtX3BDYXBUZXh0TGF5b3V0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wQ2FwVGV4dExheW91dCA9IE5VTEw7DQotICAgICAgICBpZiAobV9wQ2FwVGV4dFByb3ZpZGVyKSB7DQotICAgICAgICAgICAgZGVsZXRlIG1fcENhcFRleHRQcm92aWRlcjsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcENhcFRleHRQcm92aWRlciA9IE5VTEw7DQotICAgICAgICBpZiAobV9wVGV4dE91dCkgew0KLSAgICAgICAgICAgIG1fcFRleHRPdXQtPlJlbGVhc2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcFRleHRPdXQgPSBOVUxMOw0KLSAgICAgICAgaWYgKG1fcEZpZWxkU3BsaXRBcnJheSkgew0KLSAgICAgICAgICAgIG1fcEZpZWxkU3BsaXRBcnJheS0+UmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgZGVsZXRlIG1fcEZpZWxkU3BsaXRBcnJheTsNCi0gICAgICAgICAgICBtX3BGaWVsZFNwbGl0QXJyYXkgPSBOVUxMOw0KLSAgICAgICAgfQ0KKyAgICBtX3BDYXBUZXh0TGF5b3V0ID0gTlVMTDsNCisgICAgaWYgKG1fcENhcFRleHRQcm92aWRlcikgew0KKyAgICAgIGRlbGV0ZSBtX3BDYXBUZXh0UHJvdmlkZXI7DQogICAgIH0NCi0gICAgRlhfQk9PTCBMb2FkQ2FwdGlvbihDWEZBX1dpZGdldEFjYyogcEFjYykNCi0gICAgew0KLSAgICAgICAgaWYgKG1fcENhcFRleHRMYXlvdXQpIHsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gcEFjYy0+R2V0Q2FwdGlvbigpOw0KLSAgICAgICAgaWYgKGNhcHRpb24uSXNFeGlzdEluWE1MKCkgJiYgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgew0KLSAgICAgICAgICAgIG1fcENhcFRleHRQcm92aWRlciA9IEZYX05FVyBDWEZBX1RleHRQcm92aWRlcihwQWNjLCBYRkFfVEVYVFBST1ZJREVSVFlQRV9DYXB0aW9uKTsNCi0gICAgICAgICAgICBtX3BDYXBUZXh0TGF5b3V0ID0gRlhfTkVXIENYRkFfVGV4dExheW91dChtX3BDYXBUZXh0UHJvdmlkZXIpOw0KLSAgICAgICAgICAgIHJldHVybiBtX3BDYXBUZXh0TGF5b3V0ICE9IE5VTEw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIG1fcENhcFRleHRQcm92aWRlciA9IE5VTEw7DQorICAgIGlmIChtX3BUZXh0T3V0KSB7DQorICAgICAgbV9wVGV4dE91dC0+UmVsZWFzZSgpOw0KICAgICB9DQotICAgIENYRkFfVGV4dExheW91dAkJKm1fcENhcFRleHRMYXlvdXQ7DQotICAgIENYRkFfVGV4dFByb3ZpZGVyCSptX3BDYXBUZXh0UHJvdmlkZXI7DQotICAgIElGREVfVGV4dE91dAkJKm1fcFRleHRPdXQ7DQotICAgIENGWF9GbG9hdEFycmF5CQkqbV9wRmllbGRTcGxpdEFycmF5Ow0KKyAgICBtX3BUZXh0T3V0ID0gTlVMTDsNCisgICAgaWYgKG1fcEZpZWxkU3BsaXRBcnJheSkgew0KKyAgICAgIG1fcEZpZWxkU3BsaXRBcnJheS0+UmVtb3ZlQWxsKCk7DQorICAgICAgZGVsZXRlIG1fcEZpZWxkU3BsaXRBcnJheTsNCisgICAgICBtX3BGaWVsZFNwbGl0QXJyYXkgPSBOVUxMOw0KKyAgICB9DQorICB9DQorICBGWF9CT09MIExvYWRDYXB0aW9uKENYRkFfV2lkZ2V0QWNjKiBwQWNjKSB7DQorICAgIGlmIChtX3BDYXBUZXh0TGF5b3V0KSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBwQWNjLT5HZXRDYXB0aW9uKCk7DQorICAgIGlmIChjYXB0aW9uLklzRXhpc3RJblhNTCgpICYmDQorICAgICAgICBjYXB0aW9uLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVuKSB7DQorICAgICAgbV9wQ2FwVGV4dFByb3ZpZGVyID0NCisgICAgICAgICAgRlhfTkVXIENYRkFfVGV4dFByb3ZpZGVyKHBBY2MsIFhGQV9URVhUUFJPVklERVJUWVBFX0NhcHRpb24pOw0KKyAgICAgIG1fcENhcFRleHRMYXlvdXQgPSBGWF9ORVcgQ1hGQV9UZXh0TGF5b3V0KG1fcENhcFRleHRQcm92aWRlcik7DQorICAgICAgcmV0dXJuIG1fcENhcFRleHRMYXlvdXQgIT0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX1RleHRMYXlvdXQqIG1fcENhcFRleHRMYXlvdXQ7DQorICBDWEZBX1RleHRQcm92aWRlciogbV9wQ2FwVGV4dFByb3ZpZGVyOw0KKyAgSUZERV9UZXh0T3V0KiBtX3BUZXh0T3V0Ow0KKyAgQ0ZYX0Zsb2F0QXJyYXkqIG1fcEZpZWxkU3BsaXRBcnJheTsNCiB9Ow0KLWNsYXNzIENYRkFfVGV4dEVkaXREYXRhIDogcHVibGljIENYRkFfRmllbGRMYXlvdXREYXRhDQotew0KLXB1YmxpYzoNCitjbGFzcyBDWEZBX1RleHRFZGl0RGF0YSA6IHB1YmxpYyBDWEZBX0ZpZWxkTGF5b3V0RGF0YSB7DQorIHB1YmxpYzoNCiB9Ow0KLWNsYXNzIENYRkFfSW1hZ2VFZGl0RGF0YSA6IHB1YmxpYyBDWEZBX0ZpZWxkTGF5b3V0RGF0YQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfSW1hZ2VFZGl0RGF0YSgpDQotICAgICAgICA6IG1fcERJQml0bWFwKE5VTEwpDQotICAgICAgICAsIG1fYk5hbWVkSW1hZ2UoRkFMU0UpDQotICAgICAgICAsIG1faUltYWdlWERwaSgwKQ0KLSAgICAgICAgLCBtX2lJbWFnZVlEcGkoMCkNCi0gICAgew0KLSAgICB9DQorY2xhc3MgQ1hGQV9JbWFnZUVkaXREYXRhIDogcHVibGljIENYRkFfRmllbGRMYXlvdXREYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9JbWFnZUVkaXREYXRhKCkNCisgICAgICA6IG1fcERJQml0bWFwKE5VTEwpLA0KKyAgICAgICAgbV9iTmFtZWRJbWFnZShGQUxTRSksDQorICAgICAgICBtX2lJbWFnZVhEcGkoMCksDQorICAgICAgICBtX2lJbWFnZVlEcGkoMCkge30NCiANCi0gICAgfkNYRkFfSW1hZ2VFZGl0RGF0YSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1fcERJQml0bWFwICYmICFtX2JOYW1lZEltYWdlKSB7DQotICAgICAgICAgICAgZGVsZXRlIG1fcERJQml0bWFwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wRElCaXRtYXAgPSBOVUxMOw0KKyAgfkNYRkFfSW1hZ2VFZGl0RGF0YSgpIHsNCisgICAgaWYgKG1fcERJQml0bWFwICYmICFtX2JOYW1lZEltYWdlKSB7DQorICAgICAgZGVsZXRlIG1fcERJQml0bWFwOw0KICAgICB9DQotICAgIEZYX0JPT0wgTG9hZEltYWdlRGF0YShDWEZBX1dpZGdldEFjYyogcEFjYykNCi0gICAgew0KLSAgICAgICAgaWYobV9wRElCaXRtYXApIHsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIENYRkFfVmFsdWUgdmFsdWUgPSBwQWNjLT5HZXRGb3JtVmFsdWUoKTsNCi0gICAgICAgIGlmICghdmFsdWUpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX0ltYWdlIGltYWdlT2JqID0gdmFsdWUuR2V0SW1hZ2UoKTsNCi0gICAgICAgIENYRkFfRkZEb2MgKnBGRkRvYyA9IHBBY2MtPkdldERvYygpOw0KLSAgICAgICAgcEFjYy0+U2V0SW1hZ2VFZGl0SW1hZ2UoWEZBX0xvYWRJbWFnZURhdGEocEZGRG9jLCAmaW1hZ2VPYmosIG1fYk5hbWVkSW1hZ2UsIG1faUltYWdlWERwaSwgbV9pSW1hZ2VZRHBpKSk7DQotICAgICAgICByZXR1cm4gbV9wRElCaXRtYXAgIT0gTlVMTDsNCisgICAgbV9wRElCaXRtYXAgPSBOVUxMOw0KKyAgfQ0KKyAgRlhfQk9PTCBMb2FkSW1hZ2VEYXRhKENYRkFfV2lkZ2V0QWNjKiBwQWNjKSB7DQorICAgIGlmIChtX3BESUJpdG1hcCkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KICAgICB9DQotICAgIENGWF9ESUJpdG1hcCoJCQltX3BESUJpdG1hcDsNCi0gICAgRlhfQk9PTAkJCQkJbV9iTmFtZWRJbWFnZTsNCi0gICAgaW50MzJfdAkJCQltX2lJbWFnZVhEcGk7DQotICAgIGludDMyX3QJCQkJbV9pSW1hZ2VZRHBpOw0KKyAgICBDWEZBX1ZhbHVlIHZhbHVlID0gcEFjYy0+R2V0Rm9ybVZhbHVlKCk7DQorICAgIGlmICghdmFsdWUpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9JbWFnZSBpbWFnZU9iaiA9IHZhbHVlLkdldEltYWdlKCk7DQorICAgIENYRkFfRkZEb2MqIHBGRkRvYyA9IHBBY2MtPkdldERvYygpOw0KKyAgICBwQWNjLT5TZXRJbWFnZUVkaXRJbWFnZShYRkFfTG9hZEltYWdlRGF0YShwRkZEb2MsICZpbWFnZU9iaiwgbV9iTmFtZWRJbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pSW1hZ2VYRHBpLCBtX2lJbWFnZVlEcGkpKTsNCisgICAgcmV0dXJuIG1fcERJQml0bWFwICE9IE5VTEw7DQorICB9DQorICBDRlhfRElCaXRtYXAqIG1fcERJQml0bWFwOw0KKyAgRlhfQk9PTCBtX2JOYW1lZEltYWdlOw0KKyAgaW50MzJfdCBtX2lJbWFnZVhEcGk7DQorICBpbnQzMl90IG1faUltYWdlWURwaTsNCiB9Ow0KIENYRkFfV2lkZ2V0QWNjOjpDWEZBX1dpZGdldEFjYyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcE5vZGUpDQotICAgIDogQ1hGQV9XaWRnZXREYXRhKHBOb2RlKQ0KLSAgICAsIG1fcERvY1ZpZXcocERvY1ZpZXcpDQotICAgICwgbV9wTGF5b3V0RGF0YShOVUxMKQ0KLXsNCisgICAgOiBDWEZBX1dpZGdldERhdGEocE5vZGUpLCBtX3BEb2NWaWV3KHBEb2NWaWV3KSwgbV9wTGF5b3V0RGF0YShOVUxMKSB7fQ0KK0NYRkFfV2lkZ2V0QWNjOjp+Q1hGQV9XaWRnZXRBY2MoKSB7DQorICBpZiAobV9wTGF5b3V0RGF0YSkgew0KKyAgICBtX3BMYXlvdXREYXRhLT5SZWxlYXNlKCk7DQorICAgIG1fcExheW91dERhdGEgPSBOVUxMOw0KKyAgfQ0KIH0NCi1DWEZBX1dpZGdldEFjYzo6fkNYRkFfV2lkZ2V0QWNjKCkNCi17DQotICAgIGlmIChtX3BMYXlvdXREYXRhKSB7DQotICAgICAgICBtX3BMYXlvdXREYXRhLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BMYXlvdXREYXRhID0gTlVMTDsNCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpHZXROYW1lKENGWF9XaWRlU3RyaW5nJiB3c05hbWUsIGludDMyX3QgaU5hbWVUeXBlKSB7DQorICBpZiAoaU5hbWVUeXBlID09IDApIHsNCisgICAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICByZXR1cm4gIXdzTmFtZS5Jc0VtcHR5KCk7DQorICB9DQorICBtX3BOb2RlLT5HZXRTT01FeHByZXNzaW9uKHdzTmFtZSk7DQorICBpZiAoaU5hbWVUeXBlID09IDIgJiYgd3NOYW1lLkdldExlbmd0aCgpID49IDE1KSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c1ByZSA9IEZYX1dTVFJDKEwieGZhWzBdLmZvcm1bMF0uIik7DQorICAgIGlmICh3c1ByZSA9PSBDRlhfV2lkZVN0cmluZ0Mod3NOYW1lLCB3c1ByZS5HZXRMZW5ndGgoKSkpIHsNCisgICAgICB3c05hbWUuRGVsZXRlKDAsIHdzUHJlLkdldExlbmd0aCgpKTsNCiAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkdldE5hbWUoQ0ZYX1dpZGVTdHJpbmcgJndzTmFtZSwgaW50MzJfdCBpTmFtZVR5cGUgKQ0KLXsNCi0gICAgaWYgKGlOYW1lVHlwZSA9PSAwKSB7DQotICAgICAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQotICAgICAgICByZXR1cm4gIXdzTmFtZS5Jc0VtcHR5KCk7DQotICAgIH0NCi0gICAgbV9wTm9kZS0+R2V0U09NRXhwcmVzc2lvbih3c05hbWUpOw0KLSAgICBpZiAoaU5hbWVUeXBlID09IDIgJiYgd3NOYW1lLkdldExlbmd0aCgpID49IDE1KSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NQcmUgPSBGWF9XU1RSQyhMInhmYVswXS5mb3JtWzBdLiIpOw0KLSAgICAgICAgaWYgKHdzUHJlID09IENGWF9XaWRlU3RyaW5nQyh3c05hbWUsIHdzUHJlLkdldExlbmd0aCgpKSkgew0KLSAgICAgICAgICAgIHdzTmFtZS5EZWxldGUoMCwgd3NQcmUuR2V0TGVuZ3RoKCkpOw0KK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXRBY2M6OkdldERhdGFzZXRzKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEJpbmREYXRhKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NWYWx1ZUNoYW5nZWQoKSB7DQorICBtX3BEb2NWaWV3LT5BZGRWYWxpZGF0ZVdpZGdldCh0aGlzKTsNCisgIG1fcERvY1ZpZXctPkFkZENhbGN1bGF0ZVdpZGdldEFjYyh0aGlzKTsNCisgIG1fcERvY1ZpZXctPlJ1bkNhbGN1bGF0ZVdpZGdldHMoKTsNCisgIG1fcERvY1ZpZXctPlJ1blZhbGlkYXRlKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6UmVzZXREYXRhKCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSAoWEZBX0VMRU1FTlQpR2V0VUlUeXBlKCk7DQorICBzd2l0Y2ggKGVVSVR5cGUpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQ6IHsNCisgICAgICBDWEZBX1ZhbHVlIGltYWdlVmFsdWUgPSBHZXREZWZhdWx0VmFsdWUoKTsNCisgICAgICBDWEZBX0ltYWdlIGltYWdlID0gaW1hZ2VWYWx1ZS5HZXRJbWFnZSgpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGUsIHdzSHJlZjsNCisgICAgICBpZiAoaW1hZ2UpIHsNCisgICAgICAgIGltYWdlLkdldENvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgICBpbWFnZS5HZXRDb250ZW50VHlwZSh3c0NvbnRlbnRUeXBlKTsNCisgICAgICAgIGltYWdlLkdldEhyZWYod3NIcmVmKTsNCisgICAgICB9DQorICAgICAgU2V0SW1hZ2VFZGl0KHdzQ29udGVudFR5cGUsIHdzSHJlZiwgd3NWYWx1ZSk7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOiB7DQorICAgICAgQ1hGQV9Ob2RlKiBwTmV4dENoaWxkID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgIFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgICAgICB3aGlsZSAocE5leHRDaGlsZCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTmV4dENoaWxkOw0KKyAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBDaGlsZC0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICAgICAgaWYgKCFwQWNjKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgQ1hGQV9WYWx1ZSBkZWZWYWx1ZShOVUxMKTsNCisgICAgICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSAmJiAoZGVmVmFsdWUgPSBwQWNjLT5HZXREZWZhdWx0VmFsdWUoKSkpIHsNCisgICAgICAgICAgZGVmVmFsdWUuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgICAgIHRoaXMtPlNldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgICAgICAgICAgcEFjYy0+U2V0VmFsdWUod3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBwQ2hpbGQtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgICAgICAgaWYgKCFwSXRlbXMpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyBpdGVtVGV4dDsNCisgICAgICAgICAgaWYgKHBJdGVtcy0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9VTktOT1dOKSA+IDEpIHsNCisgICAgICAgICAgICBpdGVtVGV4dCA9IHBJdGVtcy0+R2V0Q2hpbGQoMSwgWEZBX0VMRU1FTlRfVU5LTk9XTiktPkdldENvbnRlbnQoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwQWNjLT5TZXRWYWx1ZShpdGVtVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcE5leHRDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3Q6DQorICAgICAgQ2xlYXJBbGxTZWxlY3Rpb25zKCk7DQorICAgIGRlZmF1bHQ6DQorICAgICAgaWYgKENYRkFfVmFsdWUgZGVmVmFsdWUgPSBHZXREZWZhdWx0VmFsdWUoKSkgew0KKyAgICAgICAgZGVmVmFsdWUuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgfQ0KKyAgICAgIFNldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgICAgICBicmVhazsNCisgIH0NCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldEFjYzo6R2V0RGF0YXNldHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldEJpbmREYXRhKCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NWYWx1ZUNoYW5nZWQoKQ0KLXsNCi0gICAgbV9wRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQodGhpcyk7DQotICAgIG1fcERvY1ZpZXctPkFkZENhbGN1bGF0ZVdpZGdldEFjYyh0aGlzKTsNCi0gICAgbV9wRG9jVmlldy0+UnVuQ2FsY3VsYXRlV2lkZ2V0cygpOw0KLSAgICBtX3BEb2NWaWV3LT5SdW5WYWxpZGF0ZSgpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDWEZBX1dpZGdldEFjYzo6UmVzZXREYXRhKCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSAoWEZBX0VMRU1FTlQpR2V0VUlUeXBlKCk7DQotICAgIHN3aXRjaCAoZVVJVHlwZSkgew0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQ6IHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9WYWx1ZSBpbWFnZVZhbHVlID0gR2V0RGVmYXVsdFZhbHVlKCk7DQotICAgICAgICAgICAgICAgIENYRkFfSW1hZ2UgaW1hZ2UgPSBpbWFnZVZhbHVlLkdldEltYWdlKCk7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGUsIHdzSHJlZjsNCi0gICAgICAgICAgICAgICAgaWYgKGltYWdlKSB7DQotICAgICAgICAgICAgICAgICAgICBpbWFnZS5HZXRDb250ZW50KHdzVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UuR2V0Q29udGVudFR5cGUod3NDb250ZW50VHlwZSk7DQotICAgICAgICAgICAgICAgICAgICBpbWFnZS5HZXRIcmVmKHdzSHJlZik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgU2V0SW1hZ2VFZGl0KHdzQ29udGVudFR5cGUsIHdzSHJlZiwgd3NWYWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6IHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV4dENoaWxkID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAocE5leHRDaGlsZCkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTmV4dENoaWxkOw0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBDaGlsZC0+R2V0V2lkZ2V0RGF0YSgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwQWNjKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBDWEZBX1ZhbHVlIGRlZlZhbHVlKE5VTEwpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpICYmIChkZWZWYWx1ZSA9IHBBY2MtPkdldERlZmF1bHRWYWx1ZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZlZhbHVlLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPlNldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQWNjLT5TZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEl0ZW1zID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwSXRlbXMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGl0ZW1UZXh0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwSXRlbXMtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfVU5LTk9XTikgPiAxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UZXh0ID0gcEl0ZW1zLT5HZXRDaGlsZCgxLCBYRkFfRUxFTUVOVF9VTktOT1dOKS0+R2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBwQWNjLT5TZXRWYWx1ZShpdGVtVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcE5leHRDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDoNCi0gICAgICAgICAgICBDbGVhckFsbFNlbGVjdGlvbnMoKTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgaWYgKENYRkFfVmFsdWUgZGVmVmFsdWUgPSBHZXREZWZhdWx0VmFsdWUoKSkgew0KLSAgICAgICAgICAgICAgICBkZWZWYWx1ZS5HZXRDaGlsZFZhbHVlQ29udGVudCh3c1ZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgU2V0VmFsdWUod3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9XaWRnZXRBY2M6OlNldEltYWdlRWRpdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ29udGVudFR5cGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NIcmVmLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGF0YSkNCi17DQotICAgIENYRkFfSW1hZ2UgaW1hZ2UgPSBHZXRGb3JtVmFsdWUoKS5HZXRJbWFnZSgpOw0KLSAgICBpZiAoaW1hZ2UpIHsNCi0gICAgICAgIGltYWdlLlNldENvbnRlbnRUeXBlKHdzQ29udGVudFR5cGUpOw0KLSAgICAgICAgaW1hZ2UuU2V0SHJlZih3c0hyZWYpOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NEYXRhKTsNCi0gICAgdGhpcy0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzRGF0YSwgd3NGb3JtYXRWYWx1ZSk7DQotICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NEYXRhLCB3c0Zvcm1hdFZhbHVlLCBUUlVFKTsNCi0gICAgQ1hGQV9Ob2RlKiBwQmluZCA9IEdldERhdGFzZXRzKCk7DQotICAgIGlmICghcEJpbmQpIHsNCi0gICAgICAgIGltYWdlLlNldFRyYW5zZmVyRW5jb2RpbmcoWEZBX0FUVFJJQlVURUVOVU1fQmFzZTY0KTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwQmluZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQotICAgIENYRkFfTm9kZSAqcEhyZWZOb2RlID0gcEJpbmQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgaWYgKHBIcmVmTm9kZSkgew0KLSAgICAgICAgcEhyZWZOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0hyZWYpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MTm9kZSA9IHBCaW5kLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7DQotICAgICAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGUpLT5TZXRTdHJpbmcoRlhfV1NUUkMoTCJocmVmIiksIHdzSHJlZik7DQotICAgIH0NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpTZXRJbWFnZUVkaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSHJlZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0RhdGEpIHsNCisgIENYRkFfSW1hZ2UgaW1hZ2UgPSBHZXRGb3JtVmFsdWUoKS5HZXRJbWFnZSgpOw0KKyAgaWYgKGltYWdlKSB7DQorICAgIGltYWdlLlNldENvbnRlbnRUeXBlKHdzQ29udGVudFR5cGUpOw0KKyAgICBpbWFnZS5TZXRIcmVmKHdzSHJlZik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzRGF0YSk7DQorICB0aGlzLT5HZXRGb3JtYXREYXRhVmFsdWUod3NEYXRhLCB3c0Zvcm1hdFZhbHVlKTsNCisgIG1fcE5vZGUtPlNldENvbnRlbnQod3NEYXRhLCB3c0Zvcm1hdFZhbHVlLCBUUlVFKTsNCisgIENYRkFfTm9kZSogcEJpbmQgPSBHZXREYXRhc2V0cygpOw0KKyAgaWYgKCFwQmluZCkgew0KKyAgICBpbWFnZS5TZXRUcmFuc2ZlckVuY29kaW5nKFhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBCaW5kLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCisgIENYRkFfTm9kZSogcEhyZWZOb2RlID0gcEJpbmQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGlmIChwSHJlZk5vZGUpIHsNCisgICAgcEhyZWZOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0hyZWYpOw0KKyAgfSBlbHNlIHsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IHBCaW5kLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBGWFNZU19hc3NlcnQocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCisgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlKS0+U2V0U3RyaW5nKEZYX1dTVFJDKEwiaHJlZiIpLCB3c0hyZWYpOw0KKyAgfQ0KIH0NCiANCi1DWEZBX1dpZGdldEFjYyoJQ1hGQV9XaWRnZXRBY2M6OkdldEV4Y2xHcm91cCgpDQotew0KLSAgICBDWEZBX05vZGUqIHBFeGNsID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgIGlmICghcEV4Y2wgfHwgcEV4Y2wtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiAoQ1hGQV9XaWRnZXRBY2MqKXBFeGNsLT5HZXRXaWRnZXREYXRhKCk7DQorQ1hGQV9XaWRnZXRBY2MqIENYRkFfV2lkZ2V0QWNjOjpHZXRFeGNsR3JvdXAoKSB7DQorICBDWEZBX05vZGUqIHBFeGNsID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICBpZiAoIXBFeGNsIHx8IHBFeGNsLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIChDWEZBX1dpZGdldEFjYyopcEV4Y2wtPkdldFdpZGdldERhdGEoKTsNCiB9DQotQ1hGQV9GRkRvY1ZpZXcqIENYRkFfV2lkZ2V0QWNjOjpHZXREb2NWaWV3KCkNCi17DQotICAgIHJldHVybiBtX3BEb2NWaWV3Ow0KK0NYRkFfRkZEb2NWaWV3KiBDWEZBX1dpZGdldEFjYzo6R2V0RG9jVmlldygpIHsNCisgIHJldHVybiBtX3BEb2NWaWV3Ow0KIH0NCi1DWEZBX0ZGRG9jKiBDWEZBX1dpZGdldEFjYzo6R2V0RG9jKCkNCi17DQotICAgIHJldHVybiAoQ1hGQV9GRkRvYyopbV9wRG9jVmlldy0+R2V0RG9jKCk7DQorQ1hGQV9GRkRvYyogQ1hGQV9XaWRnZXRBY2M6OkdldERvYygpIHsNCisgIHJldHVybiAoQ1hGQV9GRkRvYyopbV9wRG9jVmlldy0+R2V0RG9jKCk7DQogfQ0KLUNYRkFfRkZBcHAqIENYRkFfV2lkZ2V0QWNjOjpHZXRBcHAoKQ0KLXsNCi0gICAgcmV0dXJuIEdldERvYygpLT5HZXRBcHAoKTsNCitDWEZBX0ZGQXBwKiBDWEZBX1dpZGdldEFjYzo6R2V0QXBwKCkgew0KKyAgcmV0dXJuIEdldERvYygpLT5HZXRBcHAoKTsNCiB9DQotSVhGQV9BcHBQcm92aWRlciogQ1hGQV9XaWRnZXRBY2M6OkdldEFwcFByb3ZpZGVyKCkNCi17DQotICAgIHJldHVybiBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCitJWEZBX0FwcFByb3ZpZGVyKiBDWEZBX1dpZGdldEFjYzo6R2V0QXBwUHJvdmlkZXIoKSB7DQorICByZXR1cm4gR2V0QXBwKCktPkdldEFwcFByb3ZpZGVyKCk7DQogfQ0KLWludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NFdmVudChpbnQzMl90IGlBY3Rpdml0eSwgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSkNCi17DQotICAgIGlmICh0aGlzLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KLSAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KLSAgICB9DQotICAgIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KLSAgICBDWEZBX05vZGVBcnJheSBldmVudEFycmF5Ow0KLSAgICBpbnQzMl90IGlDb3VudHMgPSBHZXRFdmVudEJ5QWN0aXZpdHkoaUFjdGl2aXR5LCBldmVudEFycmF5LCBwRXZlbnRQYXJhbS0+bV9iSXNGb3JtUmVhZHkpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnRzOyBpKyspIHsNCi0gICAgICAgIENYRkFfRXZlbnQgZXZlbnQoZXZlbnRBcnJheVtpXSk7DQotICAgICAgICBpbnQzMl90IHJlc3VsdCA9IFByb2Nlc3NFdmVudChldmVudCwgcEV2ZW50UGFyYW0pOw0KLSAgICAgICAgaWYgKGkgPT0gMCkgew0KLSAgICAgICAgICAgIGlSZXQgPSByZXN1bHQ7DQotICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBYRkFfRVZFTlRFUlJPUl9TdWNlc3MpIHsNCi0gICAgICAgICAgICBpUmV0ID0gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBpUmV0Ow0KLX0NCi1pbnQzMl90IENYRkFfV2lkZ2V0QWNjOjpQcm9jZXNzRXZlbnQoQ1hGQV9FdmVudCYgZXZlbnQsIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pDQotew0KLSAgICBpZiAoIWV2ZW50KSB7DQotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQotICAgIH0NCi0gICAgc3dpdGNoKGV2ZW50LkdldEV2ZW50VHlwZSgpKSB7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4ZWN1dGU6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1NjcmlwdDogew0KLSAgICAgICAgICAgICAgICBDWEZBX1NjcmlwdCBzY3JpcHQgPSBldmVudC5HZXRTY3JpcHQoKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEV4ZWN1dGVTY3JpcHQoc2NyaXB0LCBwRXZlbnRQYXJhbSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TaWduRGF0YToNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3VibWl0OiB7DQotICAgICAgICAgICAgICAgIENYRkFfU3VibWl0IHN1Ym1pdCA9IGV2ZW50LkdldFN1Ym1pdCgpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPlN1Ym1pdERhdGEoR2V0RG9jKCksIHN1Ym1pdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NFdmVudChpbnQzMl90IGlBY3Rpdml0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSkgew0KKyAgaWYgKHRoaXMtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQogICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgQ1hGQV9Ob2RlQXJyYXkgZXZlbnRBcnJheTsNCisgIGludDMyX3QgaUNvdW50cyA9DQorICAgICAgR2V0RXZlbnRCeUFjdGl2aXR5KGlBY3Rpdml0eSwgZXZlbnRBcnJheSwgcEV2ZW50UGFyYW0tPm1fYklzRm9ybVJlYWR5KTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudHM7IGkrKykgew0KKyAgICBDWEZBX0V2ZW50IGV2ZW50KGV2ZW50QXJyYXlbaV0pOw0KKyAgICBpbnQzMl90IHJlc3VsdCA9IFByb2Nlc3NFdmVudChldmVudCwgcEV2ZW50UGFyYW0pOw0KKyAgICBpZiAoaSA9PSAwKSB7DQorICAgICAgaVJldCA9IHJlc3VsdDsNCisgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzKSB7DQorICAgICAgaVJldCA9IHJlc3VsdDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlSZXQ7DQogfQ0KLWludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NDYWxjdWxhdGUoKQ0KLXsNCi0gICAgaWYgKHRoaXMtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQotICAgIH0NCi0gICAgQ1hGQV9DYWxjdWxhdGUgY2FsYyA9IHRoaXMtPkdldENhbGN1bGF0ZSgpOw0KLSAgICBpZiAoIWNhbGMpIHsNCi0gICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCi0gICAgfQ0KLSAgICBpZiAodGhpcy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQotICAgIH0NCi0gICAgQ1hGQV9FdmVudFBhcmFtIEV2ZW50UGFyYW07DQotICAgIEV2ZW50UGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DYWxjdWxhdGU7DQotICAgIENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCk7DQotICAgIGludDMyX3QgaVJldCA9IEV4ZWN1dGVTY3JpcHQoc2NyaXB0LCAmRXZlbnRQYXJhbSk7DQotICAgIGlmIChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2Vzcykgew0KLSAgICAgICAgaWYgKEdldFJhd1ZhbHVlKCkgIT0gRXZlbnRQYXJhbS5tX3dzUmVzdWx0KSB7DQotICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gR2V0RG9jKCktPkdldERvY1R5cGUoKSA9PSBYRkFfRE9DVFlQRV9TdGF0aWM7DQotICAgICAgICAgICAgU2V0VmFsdWUoRXZlbnRQYXJhbS5tX3dzUmVzdWx0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQotICAgICAgICAgICAgVXBkYXRlVUlEaXNwbGF5KCk7DQotICAgICAgICAgICAgaWYgKGJOb3RpZnkpIHsNCi0gICAgICAgICAgICAgICAgTm90aWZ5RXZlbnQoWEZBX1dJREdFVEVWRU5UX1Bvc3RDb250ZW50Q2hhbmdlZCwgTlVMTCwgTlVMTCwgTlVMTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGlSZXQ7DQotfQ0KLXZvaWQgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NTY3JpcHRUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwgaW50MzJfdCBpUmV0LCBGWEpTRV9IVkFMVUUgcFJldFZhbHVlLCBGWF9CT09MIGJWZXJzaW9uRmxhZykNCi17DQotICAgIGlmIChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2VzcyAmJiBwUmV0VmFsdWUpIHsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0Jvb2xlYW4ocFJldFZhbHVlKSAmJiAhRlhKU0VfVmFsdWVfVG9Cb29sZWFuKHBSZXRWYWx1ZSkpIHsNCi0gICAgICAgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHBQcm92aWRlcigpOw0KLSAgICAgICAgICAgIGlmICghcEFwcFByb3ZpZGVyKSB7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaXRsZTsNCi0gICAgICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19BcHBOYW1lLCB3c1RpdGxlKTsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NjcmlwdE1zZzsNCi0gICAgICAgICAgICB2YWxpZGF0ZS5HZXRTY3JpcHRNZXNzYWdlVGV4dCh3c1NjcmlwdE1zZyk7DQotICAgICAgICAgICAgaW50MzJfdCBlU2NyaXB0VGVzdCA9IHZhbGlkYXRlLkdldFNjcmlwdFRlc3QoKTsNCi0gICAgICAgICAgICBpZiAoZVNjcmlwdFRlc3QgPT0gWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZykgew0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHdzU2NyaXB0TXNnLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgR2V0VmFsaWRhdGVNZXNzYWdlKHBBcHBQcm92aWRlciwgd3NTY3JpcHRNc2csIEZBTFNFLCBiVmVyc2lvbkZsYWcpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChiVmVyc2lvbkZsYWcpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzU2NyaXB0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsIFhGQV9NQl9PSyk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzU2NyaXB0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsIFhGQV9NQl9ZZXNObykgPT0gWEZBX0lEWWVzKSB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLT5HZXROb2RlKCktPlNldEZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSwgVFJVRSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKHdzU2NyaXB0TXNnLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgR2V0VmFsaWRhdGVNZXNzYWdlKHBBcHBQcm92aWRlciwgd3NTY3JpcHRNc2csIFRSVUUsIGJWZXJzaW9uRmxhZyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NTY3JpcHRNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fRXJyb3IsIFhGQV9NQl9PSyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLWludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NGb3JtYXRUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwgRlhfQk9PTCBiVmVyc2lvbkZsYWcpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1Jhd1ZhbHVlID0gR2V0UmF3VmFsdWUoKTsNCi0gICAgaWYgKCF3c1Jhd1ZhbHVlLklzRW1wdHkoKSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KLSAgICAgICAgdmFsaWRhdGUuR2V0UGljdHVyZSh3c1BpY3R1cmUpOw0KLSAgICAgICAgaWYgKHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQotICAgICAgICB9DQotICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKTsNCi0gICAgICAgIGlmICghcExvY2FsZSkgew0KLSAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCi0gICAgICAgIH0NCi0gICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbGNWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZSh0aGlzKTsNCi0gICAgICAgIGlmICghbGNWYWx1ZS5WYWxpZGF0ZVZhbHVlKGxjVmFsdWUuR2V0VmFsdWUoKSwgd3NQaWN0dXJlLCBwTG9jYWxlKSkgew0KLSAgICAgICAgICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IEdldEFwcFByb3ZpZGVyKCk7DQotICAgICAgICAgICAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdE1zZzsNCi0gICAgICAgICAgICB2YWxpZGF0ZS5HZXRGb3JtYXRNZXNzYWdlVGV4dCh3c0Zvcm1hdE1zZyk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaXRsZTsNCi0gICAgICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19BcHBOYW1lLCB3c1RpdGxlKTsNCi0gICAgICAgICAgICBpbnQzMl90IGVGb3JtYXRUZXN0ID0gdmFsaWRhdGUuR2V0Rm9ybWF0VGVzdCgpOw0KLSAgICAgICAgICAgIGlmIChlRm9ybWF0VGVzdCA9PSBYRkFfQVRUUklCVVRFRU5VTV9FcnJvcikgew0KLSAgICAgICAgICAgICAgICBpZiAod3NGb3JtYXRNc2cuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBHZXRWYWxpZGF0ZU1lc3NhZ2UocEFwcFByb3ZpZGVyLCB3c0Zvcm1hdE1zZywgVFJVRSwgYlZlcnNpb25GbGFnKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c0Zvcm1hdE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9FcnJvciwgWEZBX01CX09LKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHRoaXMtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICh3c0Zvcm1hdE1zZy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgR2V0VmFsaWRhdGVNZXNzYWdlKHBBcHBQcm92aWRlciwgd3NGb3JtYXRNc2csIEZBTFNFLCBiVmVyc2lvbkZsYWcpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoYlZlcnNpb25GbGFnKSB7DQotICAgICAgICAgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzRm9ybWF0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsIFhGQV9NQl9PSyk7DQotICAgICAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwQXBwUHJvdmlkZXItPk1zZ0JveCh3c0Zvcm1hdE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLCBYRkFfTUJfWWVzTm8pID09IFhGQV9JRFllcykgew0KLSAgICAgICAgICAgICAgICB0aGlzLT5HZXROb2RlKCktPlNldEZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSwgVFJVRSwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KLSAgICAgICAgfQ0KLSAgICB9DQoraW50MzJfdCBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc0V2ZW50KENYRkFfRXZlbnQmIGV2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKSB7DQorICBpZiAoIWV2ZW50KSB7DQogICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIHN3aXRjaCAoZXZlbnQuR2V0RXZlbnRUeXBlKCkpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGVjdXRlOg0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1NjcmlwdDogew0KKyAgICAgIENYRkFfU2NyaXB0IHNjcmlwdCA9IGV2ZW50LkdldFNjcmlwdCgpOw0KKyAgICAgIHJldHVybiBFeGVjdXRlU2NyaXB0KHNjcmlwdCwgcEV2ZW50UGFyYW0pOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1NpZ25EYXRhOg0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1N1Ym1pdDogew0KKyAgICAgIENYRkFfU3VibWl0IHN1Ym1pdCA9IGV2ZW50LkdldFN1Ym1pdCgpOw0KKyAgICAgIHJldHVybiBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+U3VibWl0RGF0YShHZXREb2MoKSwgc3VibWl0KTsNCisgICAgfQ0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KIH0NCi1pbnQzMl90IENYRkFfV2lkZ2V0QWNjOjpQcm9jZXNzTnVsbFRlc3RWYWxpZGF0ZShDWEZBX1ZhbGlkYXRlIHZhbGlkYXRlLCBpbnQzMl90IGlGbGFncywgRlhfQk9PTCBiVmVyc2lvbkZsYWcpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICB0aGlzLT5HZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQotICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQoraW50MzJfdCBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc0NhbGN1bGF0ZSgpIHsNCisgIGlmICh0aGlzLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICB9DQorICBDWEZBX0NhbGN1bGF0ZSBjYWxjID0gdGhpcy0+R2V0Q2FsY3VsYXRlKCk7DQorICBpZiAoIWNhbGMpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgfQ0KKyAgaWYgKHRoaXMtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlKSkgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQorICB9DQorICBDWEZBX0V2ZW50UGFyYW0gRXZlbnRQYXJhbTsNCisgIEV2ZW50UGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DYWxjdWxhdGU7DQorICBDWEZBX1NjcmlwdCBzY3JpcHQgPSBjYWxjLkdldFNjcmlwdCgpOw0KKyAgaW50MzJfdCBpUmV0ID0gRXhlY3V0ZVNjcmlwdChzY3JpcHQsICZFdmVudFBhcmFtKTsNCisgIGlmIChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2Vzcykgew0KKyAgICBpZiAoR2V0UmF3VmFsdWUoKSAhPSBFdmVudFBhcmFtLm1fd3NSZXN1bHQpIHsNCisgICAgICBGWF9CT09MIGJOb3RpZnkgPSBHZXREb2MoKS0+R2V0RG9jVHlwZSgpID09IFhGQV9ET0NUWVBFX1N0YXRpYzsNCisgICAgICBTZXRWYWx1ZShFdmVudFBhcmFtLm1fd3NSZXN1bHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgICAgICBVcGRhdGVVSURpc3BsYXkoKTsNCisgICAgICBpZiAoYk5vdGlmeSkgew0KKyAgICAgICAgTm90aWZ5RXZlbnQoWEZBX1dJREdFVEVWRU5UX1Bvc3RDb250ZW50Q2hhbmdlZCwgTlVMTCwgTlVMTCwgTlVMTCk7DQorICAgICAgfQ0KKyAgICAgIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQogICAgIH0NCi0gICAgaWYgKHRoaXMtPm1fYklzTnVsbCAmJiAodGhpcy0+bV9iUHJlTnVsbCA9PSB0aGlzLT5tX2JJc051bGwpKSB7DQotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KLSAgICB9DQotICAgIGludDMyX3QgZU51bGxUZXN0ID0gdmFsaWRhdGUuR2V0TnVsbFRlc3QoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOdWxsTXNnOw0KLSAgICB2YWxpZGF0ZS5HZXROdWxsTWVzc2FnZVRleHQod3NOdWxsTXNnKTsNCi0gICAgaWYgKGlGbGFncyAmIDB4MDEpIHsNCi0gICAgICAgIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCi0gICAgICAgIGlmIChlTnVsbFRlc3QgIT0gWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQpIHsNCi0gICAgICAgICAgICBpUmV0ID0gWEZBX0VWRU5URVJST1JfRXJyb3I7DQorICB9DQorICByZXR1cm4gaVJldDsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc1NjcmlwdFRlc3RWYWxpZGF0ZShDWEZBX1ZhbGlkYXRlIHZhbGlkYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHBSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnNpb25GbGFnKSB7DQorICBpZiAoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9TdWNlc3MgJiYgcFJldFZhbHVlKSB7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0Jvb2xlYW4ocFJldFZhbHVlKSAmJiAhRlhKU0VfVmFsdWVfVG9Cb29sZWFuKHBSZXRWYWx1ZSkpIHsNCisgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHBQcm92aWRlcigpOw0KKyAgICAgIGlmICghcEFwcFByb3ZpZGVyKSB7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfQXBwTmFtZSwgd3NUaXRsZSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTY3JpcHRNc2c7DQorICAgICAgdmFsaWRhdGUuR2V0U2NyaXB0TWVzc2FnZVRleHQod3NTY3JpcHRNc2cpOw0KKyAgICAgIGludDMyX3QgZVNjcmlwdFRlc3QgPSB2YWxpZGF0ZS5HZXRTY3JpcHRUZXN0KCk7DQorICAgICAgaWYgKGVTY3JpcHRUZXN0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmcpIHsNCisgICAgICAgIGlmICh0aGlzLT5HZXROb2RlKCktPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSkpIHsNCisgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYgKCF3c051bGxNc2cuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgaWYgKGVOdWxsVGVzdCAhPSBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZCkgew0KLSAgICAgICAgICAgICAgICBtX3BEb2NWaWV3LT5tX2Fyck51bGxUZXN0TXNnLkFkZCh3c051bGxNc2cpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgICAgICBpZiAod3NTY3JpcHRNc2cuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIEdldFZhbGlkYXRlTWVzc2FnZShwQXBwUHJvdmlkZXIsIHdzU2NyaXB0TXNnLCBGQUxTRSwgYlZlcnNpb25GbGFnKTsNCiAgICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgaWYgKGJWZXJzaW9uRmxhZykgew0KKyAgICAgICAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c1NjcmlwdE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfT0spOw0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBpZiAocEFwcFByb3ZpZGVyLT5Nc2dCb3god3NTY3JpcHRNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fV2FybmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfWWVzTm8pID09IFhGQV9JRFllcykgew0KKyAgICAgICAgICB0aGlzLT5HZXROb2RlKCktPlNldEZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAod3NTY3JpcHRNc2cuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIEdldFZhbGlkYXRlTWVzc2FnZShwQXBwUHJvdmlkZXIsIHdzU2NyaXB0TXNnLCBUUlVFLCBiVmVyc2lvbkZsYWcpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NTY3JpcHRNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fRXJyb3IsIFhGQV9NQl9PSyk7DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmICh3c051bGxNc2cuSXNFbXB0eSgpICYmIGJWZXJzaW9uRmxhZyAmJiBlTnVsbFRlc3QgIT0gWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQpIHsNCi0gICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9FcnJvcjsNCisgIH0NCit9DQoraW50MzJfdCBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc0Zvcm1hdFRlc3RWYWxpZGF0ZShDWEZBX1ZhbGlkYXRlIHZhbGlkYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVyc2lvbkZsYWcpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzUmF3VmFsdWUgPSBHZXRSYXdWYWx1ZSgpOw0KKyAgaWYgKCF3c1Jhd1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7DQorICAgIHZhbGlkYXRlLkdldFBpY3R1cmUod3NQaWN0dXJlKTsNCisgICAgaWYgKHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCisgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQogICAgIH0NCi0gICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gR2V0QXBwUHJvdmlkZXIoKTsNCi0gICAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCk7DQorICAgIGlmICghcExvY2FsZSkgew0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgfQ0KKyAgICBDWEZBX0xvY2FsZVZhbHVlIGxjVmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUodGhpcyk7DQorICAgIGlmICghbGNWYWx1ZS5WYWxpZGF0ZVZhbHVlKGxjVmFsdWUuR2V0VmFsdWUoKSwgd3NQaWN0dXJlLCBwTG9jYWxlKSkgew0KKyAgICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IEdldEFwcFByb3ZpZGVyKCk7DQorICAgICAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCiAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRNc2c7DQorICAgICAgdmFsaWRhdGUuR2V0Rm9ybWF0TWVzc2FnZVRleHQod3NGb3JtYXRNc2cpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfQXBwTmFtZSwgd3NUaXRsZSk7DQorICAgICAgaW50MzJfdCBlRm9ybWF0VGVzdCA9IHZhbGlkYXRlLkdldEZvcm1hdFRlc3QoKTsNCisgICAgICBpZiAoZUZvcm1hdFRlc3QgPT0gWEZBX0FUVFJJQlVURUVOVU1fRXJyb3IpIHsNCisgICAgICAgIGlmICh3c0Zvcm1hdE1zZy5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgR2V0VmFsaWRhdGVNZXNzYWdlKHBBcHBQcm92aWRlciwgd3NGb3JtYXRNc2csIFRSVUUsIGJWZXJzaW9uRmxhZyk7DQorICAgICAgICB9DQorICAgICAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c0Zvcm1hdE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9FcnJvciwgWEZBX01CX09LKTsNCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgICAgfQ0KKyAgICAgIGlmICh0aGlzLT5HZXROb2RlKCktPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSkpIHsNCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgICB9DQorICAgICAgaWYgKHdzRm9ybWF0TXNnLklzRW1wdHkoKSkgew0KKyAgICAgICAgR2V0VmFsaWRhdGVNZXNzYWdlKHBBcHBQcm92aWRlciwgd3NGb3JtYXRNc2csIEZBTFNFLCBiVmVyc2lvbkZsYWcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoYlZlcnNpb25GbGFnKSB7DQorICAgICAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c0Zvcm1hdE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01CX09LKTsNCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgICAgfQ0KKyAgICAgIGlmIChwQXBwUHJvdmlkZXItPk1zZ0JveCh3c0Zvcm1hdE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfWWVzTm8pID09IFhGQV9JRFllcykgew0KKyAgICAgICAgdGhpcy0+R2V0Tm9kZSgpLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUsIFRSVUUsIEZBTFNFKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCiAgICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb25OYW1lOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KLSAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19BcHBOYW1lLCB3c1RpdGxlKTsNCi0gICAgc3dpdGNoIChlTnVsbFRlc3QpIHsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRXJyb3I6IHsNCi0gICAgICAgICAgICAgICAgaWYgKHdzTnVsbE1zZy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIEdldFZhbGlkYXRlQ2FwdGlvbk5hbWUod3NDYXB0aW9uTmFtZSwgYlZlcnNpb25GbGFnKTsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19WYWxpZGF0ZU51bGxFcnJvciwgd3NFcnJvcik7DQotICAgICAgICAgICAgICAgICAgICB3c051bGxNc2cuRm9ybWF0KHdzRXJyb3IsIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NOdWxsTXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1N0YXR1cywgWEZBX01CX09LKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZzogew0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAod3NOdWxsTXNnLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgR2V0VmFsaWRhdGVDYXB0aW9uTmFtZSh3c0NhcHRpb25OYW1lLCBiVmVyc2lvbkZsYWcpOw0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXYXJuaW5nOw0KLSAgICAgICAgICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVOdWxsV2FybmluZywgd3NXYXJuaW5nKTsNCi0gICAgICAgICAgICAgICAgICAgIHdzTnVsbE1zZy5Gb3JtYXQod3NXYXJuaW5nLCAoY29uc3QgRlhfV0NIQVIqKXdzQ2FwdGlvbk5hbWUsIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzTnVsbE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLCBYRkFfTUJfWWVzTm8pID09IFhGQV9JRFllcykgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy0+R2V0Tm9kZSgpLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUsIFRSVUUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZDoNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCisgIH0NCisgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc051bGxUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJzaW9uRmxhZykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIHRoaXMtPkdldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCiAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCi19DQotdm9pZCBDWEZBX1dpZGdldEFjYzo6R2V0VmFsaWRhdGVDYXB0aW9uTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uTmFtZSwgRlhfQk9PTCBiVmVyc2lvbkZsYWcpDQotew0KLSAgICBpZiAoIWJWZXJzaW9uRmxhZykgew0KLSAgICAgICAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBHZXRDYXB0aW9uKCk7DQotICAgICAgICBpZiAoY2FwdGlvbikgew0KLSAgICAgICAgICAgIENYRkFfVmFsdWUgY2FwVmFsdWUgPSBjYXB0aW9uLkdldFZhbHVlKCk7DQotICAgICAgICAgICAgaWYgKGNhcFZhbHVlKSB7DQotICAgICAgICAgICAgICAgIENYRkFfVGV4dCBjYXBUZXh0ID0gY2FwVmFsdWUuR2V0VGV4dCgpOw0KLSAgICAgICAgICAgICAgICBpZiAoY2FwVGV4dCkgew0KLSAgICAgICAgICAgICAgICAgICAgY2FwVGV4dC5HZXRDb250ZW50KHdzQ2FwdGlvbk5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgaWYgKHRoaXMtPm1fYklzTnVsbCAmJiAodGhpcy0+bV9iUHJlTnVsbCA9PSB0aGlzLT5tX2JJc051bGwpKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICB9DQorICBpbnQzMl90IGVOdWxsVGVzdCA9IHZhbGlkYXRlLkdldE51bGxUZXN0KCk7DQorICBDRlhfV2lkZVN0cmluZyB3c051bGxNc2c7DQorICB2YWxpZGF0ZS5HZXROdWxsTWVzc2FnZVRleHQod3NOdWxsTXNnKTsNCisgIGlmIChpRmxhZ3MgJiAweDAxKSB7DQorICAgIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCisgICAgaWYgKGVOdWxsVGVzdCAhPSBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZCkgew0KKyAgICAgIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9FcnJvcjsNCiAgICAgfQ0KLSAgICBpZiAod3NDYXB0aW9uTmFtZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIEdldE5hbWUod3NDYXB0aW9uTmFtZSk7DQorICAgIGlmICghd3NOdWxsTXNnLklzRW1wdHkoKSkgew0KKyAgICAgIGlmIChlTnVsbFRlc3QgIT0gWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQpIHsNCisgICAgICAgIG1fcERvY1ZpZXctPm1fYXJyTnVsbFRlc3RNc2cuQWRkKHdzTnVsbE1zZyk7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQogICAgIH0NCi19DQotdm9pZCBDWEZBX1dpZGdldEFjYzo6R2V0VmFsaWRhdGVNZXNzYWdlKElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciwgQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwgRlhfQk9PTCBiRXJyb3IsIEZYX0JPT0wgYlZlcnNpb25GbGFnKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXB0aW9uTmFtZTsNCi0gICAgR2V0VmFsaWRhdGVDYXB0aW9uTmFtZSh3c0NhcHRpb25OYW1lLCBiVmVyc2lvbkZsYWcpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Vycm9yOw0KLSAgICBpZiAoYlZlcnNpb25GbGFnKSB7DQotICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19WYWxpZGF0ZUZhaWxlZCwgd3NFcnJvcik7DQotICAgICAgICB3c01lc3NhZ2UuRm9ybWF0KHdzRXJyb3IsIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKGJFcnJvcikgew0KLSAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVFcnJvciwgd3NFcnJvcik7DQotICAgICAgICB3c01lc3NhZ2UuRm9ybWF0KHdzRXJyb3IsIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NXYXJuaW5nOw0KLSAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19WYWxpZGF0ZVdhcm5pbmcsIHdzV2FybmluZyk7DQotICAgIHdzTWVzc2FnZS5Gb3JtYXQod3NXYXJuaW5nLCAoY29uc3QgRlhfV0NIQVIqKXdzQ2FwdGlvbk5hbWUsIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSk7DQotfQ0KLWludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NWYWxpZGF0ZShpbnQzMl90IGlGbGFncykNCi17DQotICAgIGlmICh0aGlzLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KLSAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KLSAgICB9DQotICAgIENYRkFfVmFsaWRhdGUgdmFsaWRhdGUgPSB0aGlzLT5HZXRWYWxpZGF0ZSgpOw0KLSAgICBpZiAoIXZhbGlkYXRlKSB7DQotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiSW5pdERvYyA9ICgoQ1hGQV9Ob2RlKil2YWxpZGF0ZSktPkhhc0ZsYWcoWEZBX05PREVGTEFHX05lZWRzSW5pdEFwcCk7DQotICAgIEZYX0JPT0wgYlN0YXR1cyA9IG1fcERvY1ZpZXctPkdldExheW91dFN0YXR1cygpIDwgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZDsNCi0gICAgaW50MzJfdCBpRm9ybWF0ID0gMDsNCi0gICAgRlhKU0VfSFZBTFVFIHBSZXRWYWx1ZSA9IE5VTEw7DQotICAgIGludDMyX3QgIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCi0gICAgQ1hGQV9TY3JpcHQgc2NyaXB0ID0gdmFsaWRhdGUuR2V0U2NyaXB0KCk7DQotICAgIGlmIChzY3JpcHQpIHsNCi0gICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQotICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9WYWxpZGF0ZTsNCi0gICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSB0aGlzOw0KLSAgICAgICAgaVJldCA9IEV4ZWN1dGVTY3JpcHQoc2NyaXB0LCAmZVBhcmFtLCAoKGJJbml0RG9jIHx8IGJTdGF0dXMpICYmIHRoaXMtPkdldFJhd1ZhbHVlKCkuSXNFbXB0eSgpKSA/IE5VTEwgOiAmcFJldFZhbHVlKTsNCi0gICAgfQ0KLSAgICBYRkFfVkVSU0lPTiB2ZXJzaW9uID0gR2V0RG9jKCktPkdldFhGQURvYygpLT5HZXRDdXJWZXJzaW9uTW9kZSgpOw0KLSAgICBGWF9CT09MIGJWZXJzaW9uRmxhZyA9IEZBTFNFOw0KLSAgICBpZiAodmVyc2lvbiA8IFhGQV9WRVJTSU9OXzIwOCkgew0KLSAgICAgICAgYlZlcnNpb25GbGFnID0gVFJVRTsNCi0gICAgfQ0KLSAgICBpZiAoYkluaXREb2MpIHsNCi0gICAgICAgICgoQ1hGQV9Ob2RlKil2YWxpZGF0ZSktPlNldEZsYWcoWEZBX05PREVGTEFHX05lZWRzSW5pdEFwcCwgRkFMU0UsIEZBTFNFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlGb3JtYXQgPSBQcm9jZXNzRm9ybWF0VGVzdFZhbGlkYXRlKHZhbGlkYXRlLCBiVmVyc2lvbkZsYWcpOw0KLSAgICAgICAgaWYgKCFiVmVyc2lvbkZsYWcpIHsNCi0gICAgICAgICAgICBiVmVyc2lvbkZsYWcgPSBHZXREb2MoKS0+R2V0WEZBRG9jKCktPkhhc0ZsYWcoWEZBX0RPQ0ZMQUdfU2NyaXB0aW5nKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlSZXQgfD0gUHJvY2Vzc051bGxUZXN0VmFsaWRhdGUodmFsaWRhdGUsIGlGbGFncywgYlZlcnNpb25GbGFnKTsNCi0gICAgfQ0KLSAgICBpZiAoaUZvcm1hdCAhPSBYRkFfRVZFTlRFUlJPUl9TdWNlc3MpIHsNCi0gICAgICAgIFByb2Nlc3NTY3JpcHRUZXN0VmFsaWRhdGUodmFsaWRhdGUsIGlSZXQsIHBSZXRWYWx1ZSwgYlZlcnNpb25GbGFnKTsNCi0gICAgfQ0KLSAgICBpZiAocFJldFZhbHVlKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHBSZXRWYWx1ZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIGlSZXQgfCBpRm9ybWF0Ow0KLX0NCi1pbnQzMl90IENYRkFfV2lkZ2V0QWNjOjpFeGVjdXRlU2NyaXB0KENYRkFfU2NyaXB0IHNjcmlwdCwgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSwgRlhKU0VfSFZBTFVFKiBwUmV0VmFsdWUpDQotew0KLSAgICBGWFNZU19hc3NlcnQocEV2ZW50UGFyYW0pOw0KLSAgICBpZiAoIXNjcmlwdCkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KLSAgICB9DQotICAgIGlmKHNjcmlwdC5HZXRSdW5BdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1NlcnZlcikgew0KLSAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Rpc2FibGVkOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCi0gICAgc2NyaXB0LkdldEV4cHJlc3Npb24od3NFeHByZXNzaW9uKTsNCi0gICAgaWYgKHdzRXhwcmVzc2lvbi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCi0gICAgfQ0KLSAgICBYRkFfU0NSSVBUVFlQRSBlU2NyaXB0VHlwZSA9IHNjcmlwdC5HZXRDb250ZW50VHlwZSgpOw0KLSAgICBpZiAoZVNjcmlwdFR5cGUgPT0gWEZBX1NDUklQVFRZUEVfVW5rb3duKSB7DQotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KLSAgICB9DQotICAgIENYRkFfRkZEb2MqIHBEb2MgPSBHZXREb2MoKTsNCi0gICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwQ29udGV4dCA9IHBEb2MtPkdldFhGQURvYygpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgIHBDb250ZXh0LT5TZXRFdmVudFBhcmFtKHBFdmVudFBhcmFtKTsNCi0gICAgcENvbnRleHQtPlNldFJ1bkF0VHlwZSgoWEZBX0FUVFJJQlVURUVOVU0pc2NyaXB0LkdldFJ1bkF0KCkpOw0KLSAgICBDWEZBX05vZGVBcnJheSByZWZOb2RlczsNCi0gICAgaWYgKHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Jbml0Q2FsY3VsYXRlIHx8IHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9DYWxjdWxhdGUpIHsNCi0gICAgICAgIHBDb250ZXh0LT5TZXROb2Rlc09mUnVuU2NyaXB0KCZyZWZOb2Rlcyk7DQotICAgIH0NCi0gICAgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShwQ29udGV4dC0+R2V0UnVudGltZSgpKTsNCi0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQotICAgIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KChYRkFfU0NSSVBUTEFOR1RZUEUpZVNjcmlwdFR5cGUsIHdzRXhwcmVzc2lvbiwgaFJldFZhbHVlLCBtX3BOb2RlKTsNCi0gICAgaW50MzJfdCBpUmV0ID0gWEZBX0VWRU5URVJST1JfRXJyb3I7DQotICAgIGlmIChiUmV0KSB7DQotICAgICAgICBpUmV0ID0gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KLSAgICAgICAgaWYgKHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9DYWxjdWxhdGUgfHwgcEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpIHsNCi0gICAgICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGhSZXRWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwoaFJldFZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNTdHJpbmc7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFJldFZhbHVlLCBic1N0cmluZyk7DQotICAgICAgICAgICAgICAgICAgICBwRXZlbnRQYXJhbS0+bV93c1Jlc3VsdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1N0cmluZywgYnNTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2VzcykgJiYgKEdldFJhd1ZhbHVlKCkgIT0gcEV2ZW50UGFyYW0tPm1fd3NSZXN1bHQpKSB7DQotICAgICAgICAgICAgICAgICAgICBTZXRWYWx1ZShwRXZlbnRQYXJhbS0+bV93c1Jlc3VsdCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQodGhpcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaW50MzJfdCBpUmVmcyA9IHJlZk5vZGVzLkdldFNpemUoKTsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgciA9IDA7IHIgPCBpUmVmczsgcisrKSB7DQotICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwUmVmQWNjID0gKENYRkFfV2lkZ2V0QWNjKilyZWZOb2Rlc1tyXS0+R2V0V2lkZ2V0RGF0YSgpOw0KLSAgICAgICAgICAgICAgICBpZiAocFJlZkFjYyAmJiBwUmVmQWNjID09IHRoaXMpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFJlZk5vZGUgPSByZWZOb2Rlc1tyXTsNCi0gICAgICAgICAgICAgICAgQ1hGQV9DYWxjRGF0YSogcEdsb2JhbERhdGEgPSAoQ1hGQV9DYWxjRGF0YSopcFJlZk5vZGUtPkdldFVzZXJEYXRhKFhGQV9DYWxjRGF0YSk7DQotICAgICAgICAgICAgICAgIGlmICghcEdsb2JhbERhdGEpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBHbG9iYWxEYXRhID0gRlhfTkVXIENYRkFfQ2FsY0RhdGE7DQotICAgICAgICAgICAgICAgICAgICBwUmVmTm9kZS0+U2V0VXNlckRhdGEoWEZBX0NhbGNEYXRhLCBwR2xvYmFsRGF0YSwgJmdzX1hGQURlbGV0ZUNhbGNEYXRhKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAocEdsb2JhbERhdGEtPm1fR2xvYmFscy5GaW5kKHRoaXMpIDwgMCkgew0KLSAgICAgICAgICAgICAgICAgICAgcEdsb2JhbERhdGEtPm1fR2xvYmFscy5BZGQodGhpcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBSZXRWYWx1ZSkgew0KLSAgICAgICAgKnBSZXRWYWx1ZSA9IGhSZXRWYWx1ZTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFJldFZhbHVlKTsNCi0gICAgfQ0KLSAgICBwQ29udGV4dC0+U2V0Tm9kZXNPZlJ1blNjcmlwdChOVUxMKTsNCiAgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICBpZiAod3NOdWxsTXNnLklzRW1wdHkoKSAmJiBiVmVyc2lvbkZsYWcgJiYNCisgICAgICBlTnVsbFRlc3QgIT0gWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgfQ0KKyAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gR2V0QXBwUHJvdmlkZXIoKTsNCisgIGlmICghcEFwcFByb3ZpZGVyKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbk5hbWU7DQorICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfQXBwTmFtZSwgd3NUaXRsZSk7DQorICBzd2l0Y2ggKGVOdWxsVGVzdCkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yOiB7DQorICAgICAgaWYgKHdzTnVsbE1zZy5Jc0VtcHR5KCkpIHsNCisgICAgICAgIEdldFZhbGlkYXRlQ2FwdGlvbk5hbWUod3NDYXB0aW9uTmFtZSwgYlZlcnNpb25GbGFnKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXJyb3I7DQorICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19WYWxpZGF0ZU51bGxFcnJvciwgd3NFcnJvcik7DQorICAgICAgICB3c051bGxNc2cuRm9ybWF0KHdzRXJyb3IsIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSk7DQorICAgICAgfQ0KKyAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzTnVsbE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9TdGF0dXMsIFhGQV9NQl9PSyk7DQorICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgICB9DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZzogew0KKyAgICAgIGlmICh0aGlzLT5HZXROb2RlKCktPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpZiAod3NOdWxsTXNnLklzRW1wdHkoKSkgew0KKyAgICAgICAgR2V0VmFsaWRhdGVDYXB0aW9uTmFtZSh3c0NhcHRpb25OYW1lLCBiVmVyc2lvbkZsYWcpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXYXJuaW5nOw0KKyAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVOdWxsV2FybmluZywgd3NXYXJuaW5nKTsNCisgICAgICAgIHdzTnVsbE1zZy5Gb3JtYXQod3NXYXJuaW5nLCAoY29uc3QgRlhfV0NIQVIqKXdzQ2FwdGlvbk5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwQXBwUHJvdmlkZXItPk1zZ0JveCh3c051bGxNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fV2FybmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01CX1llc05vKSA9PSBYRkFfSURZZXMpIHsNCisgICAgICAgIHRoaXMtPkdldE5vZGUoKS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlLCBUUlVFLCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9FcnJvcjsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkOg0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCiB9DQotQ1hGQV9GRldpZGdldCogQ1hGQV9XaWRnZXRBY2M6OkdldE5leHRXaWRnZXQoQ1hGQV9GRldpZGdldCogcFdpZGdldCkNCi17DQotICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dCA9IE5VTEw7DQotICAgIGlmIChwV2lkZ2V0KSB7DQotICAgICAgICBwTGF5b3V0ID0gcFdpZGdldC0+R2V0TGF5b3V0SXRlbSgpLT5HZXROZXh0KCk7DQordm9pZCBDWEZBX1dpZGdldEFjYzo6R2V0VmFsaWRhdGVDYXB0aW9uTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnNpb25GbGFnKSB7DQorICBpZiAoIWJWZXJzaW9uRmxhZykgew0KKyAgICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IEdldENhcHRpb24oKTsNCisgICAgaWYgKGNhcHRpb24pIHsNCisgICAgICBDWEZBX1ZhbHVlIGNhcFZhbHVlID0gY2FwdGlvbi5HZXRWYWx1ZSgpOw0KKyAgICAgIGlmIChjYXBWYWx1ZSkgew0KKyAgICAgICAgQ1hGQV9UZXh0IGNhcFRleHQgPSBjYXBWYWx1ZS5HZXRUZXh0KCk7DQorICAgICAgICBpZiAoY2FwVGV4dCkgew0KKyAgICAgICAgICBjYXBUZXh0LkdldENvbnRlbnQod3NDYXB0aW9uTmFtZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAod3NDYXB0aW9uTmFtZS5Jc0VtcHR5KCkpIHsNCisgICAgR2V0TmFtZSh3c0NhcHRpb25OYW1lKTsNCisgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6R2V0VmFsaWRhdGVNZXNzYWdlKElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRXJyb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnNpb25GbGFnKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb25OYW1lOw0KKyAgR2V0VmFsaWRhdGVDYXB0aW9uTmFtZSh3c0NhcHRpb25OYW1lLCBiVmVyc2lvbkZsYWcpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFcnJvcjsNCisgIGlmIChiVmVyc2lvbkZsYWcpIHsNCisgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVGYWlsZWQsIHdzRXJyb3IpOw0KKyAgICB3c01lc3NhZ2UuRm9ybWF0KHdzRXJyb3IsIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiRXJyb3IpIHsNCisgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVFcnJvciwgd3NFcnJvcik7DQorICAgIHdzTWVzc2FnZS5Gb3JtYXQod3NFcnJvciwgKGNvbnN0IEZYX1dDSEFSKil3c0NhcHRpb25OYW1lKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NXYXJuaW5nOw0KKyAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVXYXJuaW5nLCB3c1dhcm5pbmcpOw0KKyAgd3NNZXNzYWdlLkZvcm1hdCh3c1dhcm5pbmcsIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSwNCisgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c0NhcHRpb25OYW1lKTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc1ZhbGlkYXRlKGludDMyX3QgaUZsYWdzKSB7DQorICBpZiAodGhpcy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgfQ0KKyAgQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSA9IHRoaXMtPkdldFZhbGlkYXRlKCk7DQorICBpZiAoIXZhbGlkYXRlKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIEZYX0JPT0wgYkluaXREb2MgPSAoKENYRkFfTm9kZSopdmFsaWRhdGUpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19OZWVkc0luaXRBcHApOw0KKyAgRlhfQk9PTCBiU3RhdHVzID0NCisgICAgICBtX3BEb2NWaWV3LT5HZXRMYXlvdXRTdGF0dXMoKSA8IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQ7DQorICBpbnQzMl90IGlGb3JtYXQgPSAwOw0KKyAgRlhKU0VfSFZBTFVFIHBSZXRWYWx1ZSA9IE5VTEw7DQorICBpbnQzMl90IGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIENYRkFfU2NyaXB0IHNjcmlwdCA9IHZhbGlkYXRlLkdldFNjcmlwdCgpOw0KKyAgaWYgKHNjcmlwdCkgew0KKyAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9WYWxpZGF0ZTsNCisgICAgZVBhcmFtLm1fcFRhcmdldCA9IHRoaXM7DQorICAgIGlSZXQgPSBFeGVjdXRlU2NyaXB0KA0KKyAgICAgICAgc2NyaXB0LCAmZVBhcmFtLA0KKyAgICAgICAgKChiSW5pdERvYyB8fCBiU3RhdHVzKSAmJiB0aGlzLT5HZXRSYXdWYWx1ZSgpLklzRW1wdHkoKSkgPyBOVUxMDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICZwUmV0VmFsdWUpOw0KKyAgfQ0KKyAgWEZBX1ZFUlNJT04gdmVyc2lvbiA9IEdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCisgIEZYX0JPT0wgYlZlcnNpb25GbGFnID0gRkFMU0U7DQorICBpZiAodmVyc2lvbiA8IFhGQV9WRVJTSU9OXzIwOCkgew0KKyAgICBiVmVyc2lvbkZsYWcgPSBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJJbml0RG9jKSB7DQorICAgICgoQ1hGQV9Ob2RlKil2YWxpZGF0ZSktPlNldEZsYWcoWEZBX05PREVGTEFHX05lZWRzSW5pdEFwcCwgRkFMU0UsIEZBTFNFKTsNCisgIH0gZWxzZSB7DQorICAgIGlGb3JtYXQgPSBQcm9jZXNzRm9ybWF0VGVzdFZhbGlkYXRlKHZhbGlkYXRlLCBiVmVyc2lvbkZsYWcpOw0KKyAgICBpZiAoIWJWZXJzaW9uRmxhZykgew0KKyAgICAgIGJWZXJzaW9uRmxhZyA9IEdldERvYygpLT5HZXRYRkFEb2MoKS0+SGFzRmxhZyhYRkFfRE9DRkxBR19TY3JpcHRpbmcpOw0KKyAgICB9DQorICAgIGlSZXQgfD0gUHJvY2Vzc051bGxUZXN0VmFsaWRhdGUodmFsaWRhdGUsIGlGbGFncywgYlZlcnNpb25GbGFnKTsNCisgIH0NCisgIGlmIChpRm9ybWF0ICE9IFhGQV9FVkVOVEVSUk9SX1N1Y2Vzcykgew0KKyAgICBQcm9jZXNzU2NyaXB0VGVzdFZhbGlkYXRlKHZhbGlkYXRlLCBpUmV0LCBwUmV0VmFsdWUsIGJWZXJzaW9uRmxhZyk7DQorICB9DQorICBpZiAocFJldFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocFJldFZhbHVlKTsNCisgIH0NCisgIHJldHVybiBpUmV0IHwgaUZvcm1hdDsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldEFjYzo6RXhlY3V0ZVNjcmlwdChDWEZBX1NjcmlwdCBzY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFKiBwUmV0VmFsdWUpIHsNCisgIEZYU1lTX2Fzc2VydChwRXZlbnRQYXJhbSk7DQorICBpZiAoIXNjcmlwdCkgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICB9DQorICBpZiAoc2NyaXB0LkdldFJ1bkF0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fU2VydmVyKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgIHNjcmlwdC5HZXRFeHByZXNzaW9uKHdzRXhwcmVzc2lvbik7DQorICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICB9DQorICBYRkFfU0NSSVBUVFlQRSBlU2NyaXB0VHlwZSA9IHNjcmlwdC5HZXRDb250ZW50VHlwZSgpOw0KKyAgaWYgKGVTY3JpcHRUeXBlID09IFhGQV9TQ1JJUFRUWVBFX1Vua293bikgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KKyAgfQ0KKyAgQ1hGQV9GRkRvYyogcERvYyA9IEdldERvYygpOw0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwQ29udGV4dCA9IHBEb2MtPkdldFhGQURvYygpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBwQ29udGV4dC0+U2V0RXZlbnRQYXJhbShwRXZlbnRQYXJhbSk7DQorICBwQ29udGV4dC0+U2V0UnVuQXRUeXBlKChYRkFfQVRUUklCVVRFRU5VTSlzY3JpcHQuR2V0UnVuQXQoKSk7DQorICBDWEZBX05vZGVBcnJheSByZWZOb2RlczsNCisgIGlmIChwRXZlbnRQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZSB8fA0KKyAgICAgIHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9DYWxjdWxhdGUpIHsNCisgICAgcENvbnRleHQtPlNldE5vZGVzT2ZSdW5TY3JpcHQoJnJlZk5vZGVzKTsNCisgIH0NCisgIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUocENvbnRleHQtPkdldFJ1bnRpbWUoKSk7DQorICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KChYRkFfU0NSSVBUTEFOR1RZUEUpZVNjcmlwdFR5cGUsIHdzRXhwcmVzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhSZXRWYWx1ZSwgbV9wTm9kZSk7DQorICBpbnQzMl90IGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9FcnJvcjsNCisgIGlmIChiUmV0KSB7DQorICAgIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgIGlmIChwRXZlbnRQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfQ2FsY3VsYXRlIHx8DQorICAgICAgICBwRXZlbnRQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZSkgew0KKyAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQoaFJldFZhbHVlKSkgew0KKyAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwoaFJldFZhbHVlKSkgew0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1N0cmluZzsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhSZXRWYWx1ZSwgYnNTdHJpbmcpOw0KKyAgICAgICAgICBwRXZlbnRQYXJhbS0+bV93c1Jlc3VsdCA9DQorICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNTdHJpbmcsIGJzU3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9FcnJvcjsNCisgICAgICB9DQorICAgICAgaWYgKHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Jbml0Q2FsY3VsYXRlKSB7DQorICAgICAgICBpZiAoKGlSZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzKSAmJg0KKyAgICAgICAgICAgIChHZXRSYXdWYWx1ZSgpICE9IHBFdmVudFBhcmFtLT5tX3dzUmVzdWx0KSkgew0KKyAgICAgICAgICBTZXRWYWx1ZShwRXZlbnRQYXJhbS0+bV93c1Jlc3VsdCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICAgICAgICBtX3BEb2NWaWV3LT5BZGRWYWxpZGF0ZVdpZGdldCh0aGlzKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaW50MzJfdCBpUmVmcyA9IHJlZk5vZGVzLkdldFNpemUoKTsNCisgICAgICBmb3IgKGludDMyX3QgciA9IDA7IHIgPCBpUmVmczsgcisrKSB7DQorICAgICAgICBDWEZBX1dpZGdldEFjYyogcFJlZkFjYyA9IChDWEZBX1dpZGdldEFjYyopcmVmTm9kZXNbcl0tPkdldFdpZGdldERhdGEoKTsNCisgICAgICAgIGlmIChwUmVmQWNjICYmIHBSZWZBY2MgPT0gdGhpcykgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFJlZk5vZGUgPSByZWZOb2Rlc1tyXTsNCisgICAgICAgIENYRkFfQ2FsY0RhdGEqIHBHbG9iYWxEYXRhID0NCisgICAgICAgICAgICAoQ1hGQV9DYWxjRGF0YSopcFJlZk5vZGUtPkdldFVzZXJEYXRhKFhGQV9DYWxjRGF0YSk7DQorICAgICAgICBpZiAoIXBHbG9iYWxEYXRhKSB7DQorICAgICAgICAgIHBHbG9iYWxEYXRhID0gRlhfTkVXIENYRkFfQ2FsY0RhdGE7DQorICAgICAgICAgIHBSZWZOb2RlLT5TZXRVc2VyRGF0YShYRkFfQ2FsY0RhdGEsIHBHbG9iYWxEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdzX1hGQURlbGV0ZUNhbGNEYXRhKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwR2xvYmFsRGF0YS0+bV9HbG9iYWxzLkZpbmQodGhpcykgPCAwKSB7DQorICAgICAgICAgIHBHbG9iYWxEYXRhLT5tX0dsb2JhbHMuQWRkKHRoaXMpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBSZXRWYWx1ZSkgew0KKyAgICAqcFJldFZhbHVlID0gaFJldFZhbHVlOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoUmV0VmFsdWUpOw0KKyAgfQ0KKyAgcENvbnRleHQtPlNldE5vZGVzT2ZSdW5TY3JpcHQoTlVMTCk7DQorICByZXR1cm4gaVJldDsNCit9DQorQ1hGQV9GRldpZGdldCogQ1hGQV9XaWRnZXRBY2M6OkdldE5leHRXaWRnZXQoQ1hGQV9GRldpZGdldCogcFdpZGdldCkgew0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0ID0gTlVMTDsNCisgIGlmIChwV2lkZ2V0KSB7DQorICAgIHBMYXlvdXQgPSBwV2lkZ2V0LT5HZXRMYXlvdXRJdGVtKCktPkdldE5leHQoKTsNCisgIH0gZWxzZSB7DQorICAgIHBMYXlvdXQgPSBtX3BEb2NWaWV3LT5HZXRYRkFMYXlvdXQoKS0+R2V0TGF5b3V0SXRlbShtX3BOb2RlKTsNCisgIH0NCisgIHJldHVybiAoQ1hGQV9GRldpZGdldCopKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Ow0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpVcGRhdGVVSURpc3BsYXkoQ1hGQV9GRldpZGdldCogcEV4Y2VwdCkgew0KKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IE5VTEw7DQorICB3aGlsZSAoKHBXaWRnZXQgPSB0aGlzLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpKSAhPSBOVUxMKSB7DQorICAgIGlmIChwV2lkZ2V0ID09IHBFeGNlcHQgfHwgIXBXaWRnZXQtPklzTG9hZGVkKCkgfHwNCisgICAgICAgIChHZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiAmJiBwV2lkZ2V0LT5Jc0ZvY3VzZWQoKSkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwV2lkZ2V0LT5VcGRhdGVGV0xEYXRhKCk7DQorICAgIHBXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6Ok5vdGlmeUV2ZW50KEZYX0RXT1JEIGR3RXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEFkZGl0aW9uYWwpIHsNCisgIElYRkFfRG9jUHJvdmlkZXIqIHBEb2NQcm92aWRlciA9IEdldERvYygpLT5HZXREb2NQcm92aWRlcigpOw0KKyAgaWYgKHBXaWRnZXQpIHsNCisgICAgcERvY1Byb3ZpZGVyLT5XaWRnZXRFdmVudChwV2lkZ2V0LCB0aGlzLCBkd0V2ZW50LCBwUGFyYW0sIHBBZGRpdGlvbmFsKTsNCisgIH0gZWxzZSB7DQorICAgIHBXaWRnZXQgPSBHZXROZXh0V2lkZ2V0KHBXaWRnZXQpOw0KKyAgICBpZiAocFdpZGdldCA9PSBOVUxMKSB7DQorICAgICAgcERvY1Byb3ZpZGVyLT5XaWRnZXRFdmVudChOVUxMLCB0aGlzLCBkd0V2ZW50LCBwUGFyYW0sIHBBZGRpdGlvbmFsKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgd2hpbGUgKHBXaWRnZXQpIHsNCisgICAgICBwRG9jUHJvdmlkZXItPldpZGdldEV2ZW50KHBXaWRnZXQsIHRoaXMsIGR3RXZlbnQsIHBQYXJhbSwgcEFkZGl0aW9uYWwpOw0KKyAgICAgIHBXaWRnZXQgPSBHZXROZXh0V2lkZ2V0KHBXaWRnZXQpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OkNhbGNDYXB0aW9uU2l6ZShDRlhfU2l6ZUYmIHN6Q2FwKSB7DQorICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IHRoaXMtPkdldENhcHRpb24oKTsNCisgIGlmICghY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSB8fA0KKyAgICAgIGNhcHRpb24uR2V0UHJlc2VuY2UoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIExvYWRDYXB0aW9uKCk7DQorICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gKFhGQV9FTEVNRU5UKUdldFVJVHlwZSgpOw0KKyAgaW50MzJfdCBpQ2FwUGxhY2VtZW50ID0gY2FwdGlvbi5HZXRQbGFjZW1lbnRUeXBlKCk7DQorICBGWF9GTE9BVCBmQ2FwUmVzZXJ2ZSA9IGNhcHRpb24uR2V0UmVzZXJ2ZSgpOw0KKyAgRlhfQk9PTCBiVmVydCA9IGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVG9wIHx8DQorICAgICAgICAgICAgICAgICAgaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b207DQorICBGWF9CT09MIGJSZXNlcnZlRXhpdCA9IGZDYXBSZXNlcnZlID4gMC4wMTsNCisgIENYRkFfVGV4dExheW91dCogcENhcFRleHRMYXlvdXQgPQ0KKyAgICAgICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BDYXBUZXh0TGF5b3V0Ow0KKyAgaWYgKHBDYXBUZXh0TGF5b3V0KSB7DQorICAgIGlmICghYlZlcnQgJiYgZVVJVHlwZSAhPSBYRkFfRUxFTUVOVF9CdXR0b24pIHsNCisgICAgICBzekNhcC54ID0gZkNhcFJlc2VydmU7DQorICAgIH0NCisgICAgQ0ZYX1NpemVGIG1pblNpemU7DQorICAgIG1pblNpemUuU2V0KDAsIDApOw0KKyAgICBwQ2FwVGV4dExheW91dC0+Q2FsY1NpemUobWluU2l6ZSwgc3pDYXAsIHN6Q2FwKTsNCisgICAgaWYgKGJSZXNlcnZlRXhpdCkgew0KKyAgICAgIGJWZXJ0ID8gc3pDYXAueSA9IGZDYXBSZXNlcnZlIDogc3pDYXAueCA9IGZDYXBSZXNlcnZlOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBGWF9GTE9BVCBmRm9udFNpemUgPSAxMC4wZjsNCisgICAgaWYgKENYRkFfRm9udCBmb250ID0gY2FwdGlvbi5HZXRGb250KCkpIHsNCisgICAgICBmRm9udFNpemUgPSBmb250LkdldEZvbnRTaXplKCk7DQorICAgIH0gZWxzZSBpZiAoQ1hGQV9Gb250IHdpZGdldGZvbnQgPSBHZXRGb250KCkpIHsNCisgICAgICBmRm9udFNpemUgPSB3aWRnZXRmb250LkdldEZvbnRTaXplKCk7DQorICAgIH0NCisgICAgaWYgKGJWZXJ0KSB7DQorICAgICAgc3pDYXAueSA9IGZDYXBSZXNlcnZlID4gMCA/IGZDYXBSZXNlcnZlIDogZkZvbnRTaXplOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgcExheW91dCA9IG1fcERvY1ZpZXctPkdldFhGQUxheW91dCgpLT5HZXRMYXlvdXRJdGVtKG1fcE5vZGUpOw0KKyAgICAgIHN6Q2FwLnggPSBmQ2FwUmVzZXJ2ZSA+IDAgPyBmQ2FwUmVzZXJ2ZSA6IDA7DQorICAgICAgc3pDYXAueSA9IGZGb250U2l6ZTsNCiAgICAgfQ0KLSAgICByZXR1cm4gKENYRkFfRkZXaWRnZXQqKShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dDsNCi19DQotdm9pZCBDWEZBX1dpZGdldEFjYzo6VXBkYXRlVUlEaXNwbGF5KENYRkFfRkZXaWRnZXQqIHBFeGNlcHQgKQ0KLXsNCi0gICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IE5VTEw7DQotICAgIHdoaWxlICgocFdpZGdldCA9IHRoaXMtPkdldE5leHRXaWRnZXQocFdpZGdldCkpICE9IE5VTEwpIHsNCi0gICAgICAgIGlmIChwV2lkZ2V0ID09IHBFeGNlcHQgfHwgIXBXaWRnZXQtPklzTG9hZGVkKCkgfHwgKEdldFVJVHlwZSgpICE9IFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uICYmIHBXaWRnZXQtPklzRm9jdXNlZCgpKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFdpZGdldC0+VXBkYXRlRldMRGF0YSgpOw0KLSAgICAgICAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfV2lkZ2V0QWNjOjpOb3RpZnlFdmVudChGWF9EV09SRCBkd0V2ZW50LCBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ICwgdm9pZCogcFBhcmFtICwgdm9pZCogcEFkZGl0aW9uYWwgKQ0KLXsNCi0gICAgSVhGQV9Eb2NQcm92aWRlciogcERvY1Byb3ZpZGVyID0gR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCk7DQotICAgIGlmIChwV2lkZ2V0KSB7DQotICAgICAgICBwRG9jUHJvdmlkZXItPldpZGdldEV2ZW50KHBXaWRnZXQsIHRoaXMsIGR3RXZlbnQsIHBQYXJhbSwgcEFkZGl0aW9uYWwpOw0KKyAgfQ0KKyAgaWYgKENYRkFfTWFyZ2luIG1nQ2FwID0gY2FwdGlvbi5HZXRNYXJnaW4oKSkgew0KKyAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQ7DQorICAgIG1nQ2FwLkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgbWdDYXAuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgICAgbWdDYXAuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICAgIG1nQ2FwLkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICAgIGlmIChiUmVzZXJ2ZUV4aXQpIHsNCisgICAgICBiVmVydCA/IChzekNhcC54ICs9IGZMZWZ0SW5zZXQgKyBmUmlnaHRJbnNldCkNCisgICAgICAgICAgICA6IChzekNhcC55ICs9IGZUb3BJbnNldCArIGZCb3R0b21JbnNldCk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBwV2lkZ2V0ID0gR2V0TmV4dFdpZGdldChwV2lkZ2V0KTsNCi0gICAgICAgIGlmIChwV2lkZ2V0ID09IE5VTEwpIHsNCi0gICAgICAgICAgICBwRG9jUHJvdmlkZXItPldpZGdldEV2ZW50KE5VTEwsIHRoaXMsIGR3RXZlbnQsIHBQYXJhbSwgcEFkZGl0aW9uYWwpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHdoaWxlIChwV2lkZ2V0KSB7DQotICAgICAgICAgICAgcERvY1Byb3ZpZGVyLT5XaWRnZXRFdmVudChwV2lkZ2V0LCB0aGlzLCBkd0V2ZW50LCBwUGFyYW0sIHBBZGRpdGlvbmFsKTsNCi0gICAgICAgICAgICBwV2lkZ2V0ID0gR2V0TmV4dFdpZGdldChwV2lkZ2V0KTsNCi0gICAgICAgIH0NCisgICAgICBzekNhcC54ICs9IGZMZWZ0SW5zZXQgKyBmUmlnaHRJbnNldDsNCisgICAgICBzekNhcC55ICs9IGZUb3BJbnNldCArIGZCb3R0b21JbnNldDsNCiAgICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENYRkFfV2lkZ2V0QWNjOjpDYWxjQ2FwdGlvblNpemUoQ0ZYX1NpemVGICZzekNhcCkNCi17DQotICAgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gdGhpcy0+R2V0Q2FwdGlvbigpOw0KLSAgICBpZiAoIWNhcHRpb24uSXNFeGlzdEluWE1MKCkgfHwgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCi0gICAgICAgIHJldHVybjsNCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVGaWVsZEF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgew0KKyAgQ0ZYX1NpemVGIHN6Q2FwOw0KKyAgc3pDYXAuU2V0KDAsIDApOw0KKyAgQ2FsY0NhcHRpb25TaXplKHN6Q2FwKTsNCisgIENGWF9SZWN0RiBydFVJTWFyZ2luOw0KKyAgR2V0VUlNYXJnaW4ocnRVSU1hcmdpbik7DQorICBzaXplLnggKz0gcnRVSU1hcmdpbi5sZWZ0ICsgcnRVSU1hcmdpbi53aWR0aDsNCisgIHNpemUueSArPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KKyAgaWYgKHN6Q2FwLnggPiAwICYmIHN6Q2FwLnkgPiAwKSB7DQorICAgIGludDMyX3QgaUNhcFBsYWNlbWVudCA9IHRoaXMtPkdldENhcHRpb24oKS5HZXRQbGFjZW1lbnRUeXBlKCk7DQorICAgIHN3aXRjaCAoaUNhcFBsYWNlbWVudCkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lOiB7DQorICAgICAgICBzaXplLnggKz0gc3pDYXAueDsNCisgICAgICAgIHNpemUueSA9IEZYX01BWChzaXplLnksIHN6Q2FwLnkpOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206IHsNCisgICAgICAgIHNpemUueSArPSBzekNhcC55Ow0KKyAgICAgICAgc2l6ZS54ID0gRlhfTUFYKHNpemUueCwgc3pDYXAueCk7DQorICAgICAgfQ0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBMb2FkQ2FwdGlvbigpOw0KLSAgICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gKFhGQV9FTEVNRU5UKUdldFVJVHlwZSgpOw0KLSAgICBpbnQzMl90IGlDYXBQbGFjZW1lbnQgPSBjYXB0aW9uLkdldFBsYWNlbWVudFR5cGUoKTsNCi0gICAgRlhfRkxPQVQgZkNhcFJlc2VydmUgPSBjYXB0aW9uLkdldFJlc2VydmUoKTsNCi0gICAgRlhfQk9PTCBiVmVydCA9IGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVG9wIHx8IGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOw0KLSAgICBGWF9CT09MIGJSZXNlcnZlRXhpdCA9IGZDYXBSZXNlcnZlID4gMC4wMTsNCi0gICAgQ1hGQV9UZXh0TGF5b3V0KiBwQ2FwVGV4dExheW91dCA9ICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BDYXBUZXh0TGF5b3V0Ow0KLSAgICBpZiAocENhcFRleHRMYXlvdXQpIHsNCi0gICAgICAgIGlmICghYlZlcnQgJiYgZVVJVHlwZSAhPSBYRkFfRUxFTUVOVF9CdXR0b24pIHsNCi0gICAgICAgICAgICBzekNhcC54ID0gZkNhcFJlc2VydmU7DQotICAgICAgICB9DQotICAgICAgICBDRlhfU2l6ZUYgbWluU2l6ZTsNCi0gICAgICAgIG1pblNpemUuU2V0KDAsIDApOw0KLSAgICAgICAgcENhcFRleHRMYXlvdXQtPkNhbGNTaXplKG1pblNpemUsIHN6Q2FwLCBzekNhcCk7DQotICAgICAgICBpZiAoYlJlc2VydmVFeGl0KSB7DQotICAgICAgICAgICAgYlZlcnQgPyBzekNhcC55ID0gZkNhcFJlc2VydmUgOiBzekNhcC54ID0gZkNhcFJlc2VydmU7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUgPSAxMC4wZjsNCi0gICAgICAgIGlmIChDWEZBX0ZvbnQgZm9udCA9IGNhcHRpb24uR2V0Rm9udCgpKSB7DQotICAgICAgICAgICAgZkZvbnRTaXplID0gZm9udC5HZXRGb250U2l6ZSgpOw0KLSAgICAgICAgfSBlbHNlIGlmIChDWEZBX0ZvbnQgd2lkZ2V0Zm9udCA9IEdldEZvbnQoKSkgew0KLSAgICAgICAgICAgIGZGb250U2l6ZSA9IHdpZGdldGZvbnQuR2V0Rm9udFNpemUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiVmVydCkgew0KLSAgICAgICAgICAgIHN6Q2FwLnkgPSBmQ2FwUmVzZXJ2ZSA+IDAgPyBmQ2FwUmVzZXJ2ZSA6IGZGb250U2l6ZTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgc3pDYXAueCA9IGZDYXBSZXNlcnZlID4gMCA/IGZDYXBSZXNlcnZlIDogMDsNCi0gICAgICAgICAgICBzekNhcC55ID0gZkZvbnRTaXplOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChDWEZBX01hcmdpbiBtZ0NhcCA9IGNhcHRpb24uR2V0TWFyZ2luKCkpIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldDsNCi0gICAgICAgIG1nQ2FwLkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCi0gICAgICAgIG1nQ2FwLkdldFRvcEluc2V0KGZUb3BJbnNldCk7DQotICAgICAgICBtZ0NhcC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCi0gICAgICAgIG1nQ2FwLkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQotICAgICAgICBpZiAoYlJlc2VydmVFeGl0KSB7DQotICAgICAgICAgICAgYlZlcnQgPyAoc3pDYXAueCArPSBmTGVmdEluc2V0ICsgZlJpZ2h0SW5zZXQpIDogKHN6Q2FwLnkgKz0gZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgc3pDYXAueCArPSBmTGVmdEluc2V0ICsgZlJpZ2h0SW5zZXQ7DQotICAgICAgICAgICAgc3pDYXAueSArPSBmVG9wSW5zZXQgKyBmQm90dG9tSW5zZXQ7DQotICAgICAgICB9DQotICAgIH0NCisgIH0NCisgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsNCiB9DQotRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlRmllbGRBdXRvU2l6ZShDRlhfU2l6ZUYgJnNpemUpDQotew0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZVdpZGdldEF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgew0KKyAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCisgIGlmIChtZ1dpZGdldC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQ7DQorICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgbWdXaWRnZXQuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgICAgbWdXaWRnZXQuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICAgIHNpemUueCArPSBmTGVmdEluc2V0ICsgZlJpZ2h0SW5zZXQ7DQorICAgIHNpemUueSArPSBmVG9wSW5zZXQgKyBmQm90dG9tSW5zZXQ7DQorICB9DQorICBDWEZBX1BhcmEgcGFyYSA9IHRoaXMtPkdldFBhcmEoKTsNCisgIGlmIChwYXJhLklzRXhpc3RJblhNTCgpKSB7DQorICAgIHNpemUueCArPSBwYXJhLkdldE1hcmdpbkxlZnQoKTsNCisgICAgc2l6ZS54ICs9IHBhcmEuR2V0VGV4dEluZGVudCgpOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlZhbCA9IDAsIGZNaW4gPSAwLCBmTWF4ID0gMDsNCisgIGlmICh0aGlzLT5HZXRXaWR0aChmVmFsKSkgew0KKyAgICBzaXplLnggPSBmVmFsOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKHRoaXMtPkdldE1pbldpZHRoKGZNaW4pKSB7DQorICAgICAgc2l6ZS54ID0gRlhfTUFYKHNpemUueCwgZk1pbik7DQorICAgIH0NCisgICAgaWYgKHRoaXMtPkdldE1heFdpZHRoKGZNYXgpICYmIGZNYXggPiAwKSB7DQorICAgICAgc2l6ZS54ID0gRlhfTUlOKHNpemUueCwgZk1heCk7DQorICAgIH0NCisgIH0NCisgIGZWYWwgPSAwLCBmTWluID0gMCwgZk1heCA9IDA7DQorICBpZiAodGhpcy0+R2V0SGVpZ2h0KGZWYWwpKSB7DQorICAgIHNpemUueSA9IGZWYWw7DQorICB9IGVsc2Ugew0KKyAgICBpZiAodGhpcy0+R2V0TWluSGVpZ2h0KGZNaW4pKSB7DQorICAgICAgc2l6ZS55ID0gRlhfTUFYKHNpemUueSwgZk1pbik7DQorICAgIH0NCisgICAgaWYgKHRoaXMtPkdldE1heEhlaWdodChmTWF4KSAmJiBmTWF4ID4gMCkgew0KKyAgICAgIHNpemUueSA9IEZYX01JTihzaXplLnksIGZNYXgpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlVGV4dENvbnRlbnRTaXplKENGWF9TaXplRiYgc2l6ZSkgew0KKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgIHRoaXMtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCisgIGlmICh3c1RleHQuSXNFbXB0eSgpKSB7DQorICAgIHNpemUueSArPSBmRm9udFNpemU7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX1dDSEFSIHdjRW50ZXIgPSAnXG4nOw0KKyAgRlhfV0NIQVIgd3NMYXN0ID0gd3NUZXh0LkdldEF0KHdzVGV4dC5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgaWYgKHdzTGFzdCA9PSB3Y0VudGVyKSB7DQorICAgIHdzVGV4dCA9IHdzVGV4dCArIHdjRW50ZXI7DQorICB9DQorICBpZiAoISgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BUZXh0T3V0KSB7DQorICAgICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BUZXh0T3V0ID0gSUZERV9UZXh0T3V0OjpDcmVhdGUoKTsNCisgICAgSUZERV9UZXh0T3V0KiBwVGV4dE91dCA9ICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BUZXh0T3V0Ow0KKyAgICBwVGV4dE91dC0+U2V0Rm9udChHZXRGREVGb250KCkpOw0KKyAgICBwVGV4dE91dC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsNCisgICAgcFRleHRPdXQtPlNldExpbmVCcmVha1RvbGVyYW5jZShmRm9udFNpemUgKiAwLjJmKTsNCisgICAgcFRleHRPdXQtPlNldExpbmVTcGFjZShHZXRMaW5lSGVpZ2h0KCkpOw0KKyAgICBGWF9EV09SRCBkd1N0eWxlcyA9IEZERV9UVE9TVFlMRV9MYXN0TGluZUhlaWdodDsNCisgICAgaWYgKEdldFVJVHlwZSgpID09IFhGQV9FTEVNRU5UX1RleHRFZGl0ICYmIElzTXVsdGlMaW5lKCkpIHsNCisgICAgICBkd1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfTGluZVdyYXA7DQorICAgIH0NCisgICAgcFRleHRPdXQtPlNldFN0eWxlcyhkd1N0eWxlcyk7DQorICB9DQorICAoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKQ0KKyAgICAgIC0+bV9wVGV4dE91dC0+Q2FsY0xvZ2ljU2l6ZSh3c1RleHQsIHdzVGV4dC5HZXRMZW5ndGgoKSwgc2l6ZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZVRleHRFZGl0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7DQorICBpZiAoc2l6ZS54ID4gMCkgew0KKyAgICBDRlhfU2l6ZUYgc3pPcnogPSBzaXplOw0KICAgICBDRlhfU2l6ZUYgc3pDYXA7DQogICAgIHN6Q2FwLlNldCgwLCAwKTsNCiAgICAgQ2FsY0NhcHRpb25TaXplKHN6Q2FwKTsNCisgICAgRlhfQk9PTCBiQ2FwRXhpdCA9IHN6Q2FwLnggPiAwLjAxICYmIHN6Q2FwLnkgPiAwLjAxOw0KKyAgICBpbnQzMl90IGlDYXBQbGFjZW1lbnQgPSBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KKyAgICBpZiAoYkNhcEV4aXQpIHsNCisgICAgICBpQ2FwUGxhY2VtZW50ID0gdGhpcy0+R2V0Q2FwdGlvbigpLkdldFBsYWNlbWVudFR5cGUoKTsNCisgICAgICBzd2l0Y2ggKGlDYXBQbGFjZW1lbnQpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZTogew0KKyAgICAgICAgICBzaXplLnggLT0gc3pDYXAueDsNCisgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KICAgICBDRlhfUmVjdEYgcnRVSU1hcmdpbjsNCiAgICAgR2V0VUlNYXJnaW4ocnRVSU1hcmdpbik7DQotICAgIHNpemUueCArPSBydFVJTWFyZ2luLmxlZnQgKyBydFVJTWFyZ2luLndpZHRoOw0KLSAgICBzaXplLnkgKz0gcnRVSU1hcmdpbi50b3AgKyBydFVJTWFyZ2luLmhlaWdodDsNCi0gICAgaWYgKHN6Q2FwLnggPiAwICYmIHN6Q2FwLnkgPiAwKSB7DQotICAgICAgICBpbnQzMl90IGlDYXBQbGFjZW1lbnQgPSB0aGlzLT5HZXRDYXB0aW9uKCkuR2V0UGxhY2VtZW50VHlwZSgpOw0KLSAgICAgICAgc3dpdGNoKGlDYXBQbGFjZW1lbnQpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZTogew0KLSAgICAgICAgICAgICAgICAgICAgc2l6ZS54ICs9IHN6Q2FwLng7DQotICAgICAgICAgICAgICAgICAgICBzaXplLnkgPSBGWF9NQVgoc2l6ZS55LCBzekNhcC55KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDoNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogew0KLSAgICAgICAgICAgICAgICAgICAgc2l6ZS55ICs9IHN6Q2FwLnk7DQotICAgICAgICAgICAgICAgICAgICBzaXplLnggPSBGWF9NQVgoc2l6ZS54LCBzekNhcC54KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKQ0KLXsNCisgICAgc2l6ZS54IC09IHJ0VUlNYXJnaW4ubGVmdCArIHJ0VUlNYXJnaW4ud2lkdGg7DQogICAgIENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gdGhpcy0+R2V0TWFyZ2luKCk7DQogICAgIGlmIChtZ1dpZGdldC5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgRlhfRkxPQVQgZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0Ow0KLSAgICAgICAgbWdXaWRnZXQuR2V0TGVmdEluc2V0KGZMZWZ0SW5zZXQpOw0KLSAgICAgICAgbWdXaWRnZXQuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCi0gICAgICAgIG1nV2lkZ2V0LkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOw0KLSAgICAgICAgbWdXaWRnZXQuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsNCi0gICAgICAgIHNpemUueCArPSBmTGVmdEluc2V0ICsgZlJpZ2h0SW5zZXQ7DQotICAgICAgICBzaXplLnkgKz0gZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0Ow0KLSAgICB9DQotICAgIENYRkFfUGFyYSBwYXJhID0gdGhpcy0+R2V0UGFyYSgpOw0KLSAgICBpZiAocGFyYS5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgc2l6ZS54ICs9IHBhcmEuR2V0TWFyZ2luTGVmdCgpOw0KLSAgICAgICAgc2l6ZS54ICs9IHBhcmEuR2V0VGV4dEluZGVudCgpOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZWYWwgPSAwLCBmTWluID0gMCwgZk1heCA9IDA7DQotICAgIGlmICh0aGlzLT5HZXRXaWR0aChmVmFsKSkgew0KLSAgICAgICAgc2l6ZS54ID0gZlZhbDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmICh0aGlzLT5HZXRNaW5XaWR0aChmTWluKSkgew0KLSAgICAgICAgICAgIHNpemUueCA9IEZYX01BWChzaXplLngsIGZNaW4pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHRoaXMtPkdldE1heFdpZHRoKGZNYXgpICYmIGZNYXggPiAwKSB7DQotICAgICAgICAgICAgc2l6ZS54ID0gRlhfTUlOKHNpemUueCwgZk1heCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZlZhbCA9IDAsIGZNaW4gPSAwLCBmTWF4ID0gMDsNCi0gICAgaWYgKHRoaXMtPkdldEhlaWdodChmVmFsKSkgew0KLSAgICAgICAgc2l6ZS55ID0gZlZhbDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmICh0aGlzLT5HZXRNaW5IZWlnaHQoZk1pbikpIHsNCi0gICAgICAgICAgICBzaXplLnkgPSBGWF9NQVgoc2l6ZS55LCBmTWluKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh0aGlzLT5HZXRNYXhIZWlnaHQoZk1heCkgJiYgZk1heCA+IDApIHsNCi0gICAgICAgICAgICBzaXplLnkgPSBGWF9NSU4oc2l6ZS55LCBmTWF4KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotdm9pZCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlVGV4dENvbnRlbnRTaXplKENGWF9TaXplRiAmc2l6ZSkNCi17DQotICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgdGhpcy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KLSAgICBpZiAod3NUZXh0LklzRW1wdHkoKSkgew0KLSAgICAgICAgc2l6ZS55ICs9IGZGb250U2l6ZTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9XQ0hBUiB3Y0VudGVyID0gJ1xuJzsNCi0gICAgRlhfV0NIQVIgd3NMYXN0ID0gd3NUZXh0LkdldEF0KHdzVGV4dC5HZXRMZW5ndGgoKSAtIDEpOw0KLSAgICBpZih3c0xhc3QgPT0gd2NFbnRlcikgew0KLSAgICAgICAgd3NUZXh0ID0gd3NUZXh0ICsgd2NFbnRlcjsNCi0gICAgfQ0KLSAgICBpZiAoISgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BUZXh0T3V0KSB7DQotICAgICAgICAoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dE91dCA9IElGREVfVGV4dE91dDo6Q3JlYXRlKCk7DQotICAgICAgICBJRkRFX1RleHRPdXQqIHBUZXh0T3V0ID0gKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRPdXQ7DQotICAgICAgICBwVGV4dE91dC0+U2V0Rm9udChHZXRGREVGb250KCkpOw0KLSAgICAgICAgcFRleHRPdXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQotICAgICAgICBwVGV4dE91dC0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKGZGb250U2l6ZSAqIDAuMmYpOw0KLSAgICAgICAgcFRleHRPdXQtPlNldExpbmVTcGFjZShHZXRMaW5lSGVpZ2h0KCkpOw0KLSAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXMgPSBGREVfVFRPU1RZTEVfTGFzdExpbmVIZWlnaHQ7DQotICAgICAgICBpZiAoR2V0VUlUeXBlKCkgPT0gWEZBX0VMRU1FTlRfVGV4dEVkaXQgJiYgSXNNdWx0aUxpbmUoKSkgew0KLSAgICAgICAgICAgIGR3U3R5bGVzIHw9IEZERV9UVE9TVFlMRV9MaW5lV3JhcDsNCi0gICAgICAgIH0NCi0gICAgICAgIHBUZXh0T3V0LT5TZXRTdHlsZXMoZHdTdHlsZXMpOw0KLSAgICB9DQotICAgICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BUZXh0T3V0LT5DYWxjTG9naWNTaXplKHdzVGV4dCwgd3NUZXh0LkdldExlbmd0aCgpLCBzaXplKTsNCi19DQotRlhfQk9PTAlDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlVGV4dEVkaXRBdXRvU2l6ZShDRlhfU2l6ZUYgJnNpemUpDQotew0KLSAgICBpZiAoc2l6ZS54ID4gMCkgew0KLSAgICAgICAgQ0ZYX1NpemVGIHN6T3J6ID0gc2l6ZTsNCi0gICAgICAgIENGWF9TaXplRiBzekNhcDsNCi0gICAgICAgIHN6Q2FwLlNldCgwLCAwKTsNCi0gICAgICAgIENhbGNDYXB0aW9uU2l6ZShzekNhcCk7DQotICAgICAgICBGWF9CT09MIGJDYXBFeGl0ID0gc3pDYXAueCA+IDAuMDEgJiYgc3pDYXAueSA+IDAuMDE7DQotICAgICAgICBpbnQzMl90IGlDYXBQbGFjZW1lbnQgPSBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KLSAgICAgICAgaWYgKGJDYXBFeGl0KSB7DQotICAgICAgICAgICAgaUNhcFBsYWNlbWVudCA9IHRoaXMtPkdldENhcHRpb24oKS5HZXRQbGFjZW1lbnRUeXBlKCk7DQotICAgICAgICAgICAgc3dpdGNoKGlDYXBQbGFjZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Og0KLSAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KLSAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUueCAtPSBzekNhcC54Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW47DQotICAgICAgICBHZXRVSU1hcmdpbihydFVJTWFyZ2luKTsNCi0gICAgICAgIHNpemUueCAtPSBydFVJTWFyZ2luLmxlZnQgKyBydFVJTWFyZ2luLndpZHRoOw0KLSAgICAgICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCi0gICAgICAgIGlmIChtZ1dpZGdldC5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZSaWdodEluc2V0Ow0KLSAgICAgICAgICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCi0gICAgICAgICAgICBtZ1dpZGdldC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCi0gICAgICAgICAgICBzaXplLnggLT0gZkxlZnRJbnNldCArIGZSaWdodEluc2V0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgQ2FsY3VsYXRlVGV4dENvbnRlbnRTaXplKHNpemUpOw0KLSAgICAgICAgc2l6ZS55ICs9IHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7DQotICAgICAgICBpZiAoYkNhcEV4aXQpIHsNCi0gICAgICAgICAgICBzd2l0Y2goaUNhcFBsYWNlbWVudCkgew0KLSAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS55ID0gRlhfTUFYKHNpemUueSwgc3pDYXAueSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS55ICs9IHN6Q2FwLnk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBzaXplLnggPSBzek9yei54Ow0KLSAgICAgICAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOw0KKyAgICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZSaWdodEluc2V0Ow0KKyAgICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgICBtZ1dpZGdldC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCisgICAgICBzaXplLnggLT0gZkxlZnRJbnNldCArIGZSaWdodEluc2V0Ow0KICAgICB9DQogICAgIENhbGN1bGF0ZVRleHRDb250ZW50U2l6ZShzaXplKTsNCi0gICAgcmV0dXJuIENhbGN1bGF0ZUZpZWxkQXV0b1NpemUoc2l6ZSk7DQotfQ0KLUZYX0JPT0wJQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZUNoZWNrQnV0dG9uQXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKQ0KLXsNCi0gICAgRlhfRkxPQVQgZkNoZWNrU2l6ZSA9IHRoaXMtPkdldENoZWNrQnV0dG9uU2l6ZSgpOw0KLSAgICBzaXplLnggPSBzaXplLnkgPSBmQ2hlY2tTaXplOw0KLSAgICByZXR1cm4gQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShzaXplKTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlUHVzaEJ1dHRvbkF1dG9TaXplKENGWF9TaXplRiAmc2l6ZSkNCi17DQotICAgIENhbGNDYXB0aW9uU2l6ZShzaXplKTsNCisgICAgc2l6ZS55ICs9IHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7DQorICAgIGlmIChiQ2FwRXhpdCkgew0KKyAgICAgIHN3aXRjaCAoaUNhcFBsYWNlbWVudCkgew0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Og0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lOiB7DQorICAgICAgICAgIHNpemUueSA9IEZYX01BWChzaXplLnksIHN6Q2FwLnkpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wOg0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206IHsNCisgICAgICAgICAgc2l6ZS55ICs9IHN6Q2FwLnk7DQorICAgICAgICB9DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgc2l6ZS54ID0gc3pPcnoueDsNCiAgICAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOw0KKyAgfQ0KKyAgQ2FsY3VsYXRlVGV4dENvbnRlbnRTaXplKHNpemUpOw0KKyAgcmV0dXJuIENhbGN1bGF0ZUZpZWxkQXV0b1NpemUoc2l6ZSk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZUltYWdlQXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKQ0KLXsNCi0gICAgaWYgKCFHZXRJbWFnZUltYWdlKCkpIHsNCi0gICAgICAgIExvYWRJbWFnZUltYWdlKCk7DQotICAgIH0NCi0gICAgc2l6ZS5TZXQoMCwgMCk7DQotICAgIGlmIChDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBHZXRJbWFnZUltYWdlKCkpIHsNCi0gICAgICAgIENYRkFfSW1hZ2UgaW1hZ2VPYmogPSBHZXRGb3JtVmFsdWUoKS5HZXRJbWFnZSgpOw0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0SW1hZ2UsIHJ0Rml0Ow0KLSAgICAgICAgcnRJbWFnZS5TZXQoMCwgMCwgMCwgMCk7DQotICAgICAgICBydEZpdC5TZXQoMCwgMCwgMCwgMCk7DQotICAgICAgICBpbnQzMl90IGlJbWFnZVhEcGkgPSAwOw0KLSAgICAgICAgaW50MzJfdCBpSW1hZ2VZRHBpID0gMDsNCi0gICAgICAgIEdldEltYWdlRHBpKGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOw0KLSAgICAgICAgcnRJbWFnZS53aWR0aCA9IFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBCaXRtYXAtPkdldFdpZHRoKCksIChGWF9GTE9BVClpSW1hZ2VYRHBpKTsNCi0gICAgICAgIHJ0SW1hZ2UuaGVpZ2h0ID0gWEZBX1VuaXRQeDJQdCgoRlhfRkxPQVQpcEJpdG1hcC0+R2V0SGVpZ2h0KCksIChGWF9GTE9BVClpSW1hZ2VZRHBpKTsNCi0gICAgICAgIGlmKEdldFdpZHRoKHJ0Rml0LndpZHRoKSkgew0KLSAgICAgICAgICAgIEdldFdpZHRoV2l0aG91dE1hcmdpbihydEZpdC53aWR0aCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJ0Rml0LndpZHRoID0gcnRJbWFnZS53aWR0aDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKEdldEhlaWdodChydEZpdC5oZWlnaHQpKSB7DQotICAgICAgICAgICAgR2V0SGVpZ2h0V2l0aG91dE1hcmdpbihydEZpdC5oZWlnaHQpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBydEZpdC5oZWlnaHQgPSBydEltYWdlLmhlaWdodDsNCi0gICAgICAgIH0NCi0gICAgICAgIHNpemUueCA9IHJ0Rml0LndpZHRoOw0KLSAgICAgICAgc2l6ZS55ID0gcnRGaXQuaGVpZ2h0Ow0KLSAgICB9DQotICAgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsNCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVDaGVja0J1dHRvbkF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgew0KKyAgRlhfRkxPQVQgZkNoZWNrU2l6ZSA9IHRoaXMtPkdldENoZWNrQnV0dG9uU2l6ZSgpOw0KKyAgc2l6ZS54ID0gc2l6ZS55ID0gZkNoZWNrU2l6ZTsNCisgIHJldHVybiBDYWxjdWxhdGVGaWVsZEF1dG9TaXplKHNpemUpOw0KIH0NCi1GWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVJbWFnZUVkaXRBdXRvU2l6ZShDRlhfU2l6ZUYgJnNpemUpDQotew0KLSAgICBpZiAoIUdldEltYWdlRWRpdEltYWdlKCkpIHsNCi0gICAgICAgIExvYWRJbWFnZUVkaXRJbWFnZSgpOw0KLSAgICB9DQotICAgIHNpemUuU2V0KDAsIDApOw0KLSAgICBpZiAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gR2V0SW1hZ2VFZGl0SW1hZ2UoKSkgew0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0SW1hZ2UsIHJ0Rml0Ow0KLSAgICAgICAgcnRJbWFnZS5TZXQoMCwgMCwgMCwgMCk7DQotICAgICAgICBydEZpdC5TZXQoMCwgMCwgMCwgMCk7DQotICAgICAgICBpbnQzMl90IGlJbWFnZVhEcGkgPSAwOw0KLSAgICAgICAgaW50MzJfdCBpSW1hZ2VZRHBpID0gMDsNCi0gICAgICAgIEdldEltYWdlRWRpdERwaShpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCi0gICAgICAgIHJ0SW1hZ2Uud2lkdGggPSBYRkFfVW5pdFB4MlB0KChGWF9GTE9BVClwQml0bWFwLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpaUltYWdlWERwaSk7DQotICAgICAgICBydEltYWdlLmhlaWdodCA9IFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBCaXRtYXAtPkdldEhlaWdodCgpLCAoRlhfRkxPQVQpaUltYWdlWURwaSk7DQotICAgICAgICBpZihHZXRXaWR0aChydEZpdC53aWR0aCkpIHsNCi0gICAgICAgICAgICBHZXRXaWR0aFdpdGhvdXRNYXJnaW4ocnRGaXQud2lkdGgpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBydEZpdC53aWR0aCA9IHJ0SW1hZ2Uud2lkdGg7DQotICAgICAgICB9DQotICAgICAgICBpZihHZXRIZWlnaHQocnRGaXQuaGVpZ2h0KSkgew0KLSAgICAgICAgICAgIEdldEhlaWdodFdpdGhvdXRNYXJnaW4ocnRGaXQuaGVpZ2h0KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRJbWFnZS5oZWlnaHQ7DQotICAgICAgICB9DQotICAgICAgICBzaXplLnggPSBydEZpdC53aWR0aDsNCi0gICAgICAgIHNpemUueSA9IHJ0Rml0LmhlaWdodDsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShzaXplKTsNCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVQdXNoQnV0dG9uQXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7DQorICBDYWxjQ2FwdGlvblNpemUoc2l6ZSk7DQorICByZXR1cm4gQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoc2l6ZSk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkxvYWRJbWFnZUltYWdlKCkNCi17DQotICAgIEluaXRMYXlvdXREYXRhKCk7DQotICAgIHJldHVybiAoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+TG9hZEltYWdlRGF0YSh0aGlzKTsNCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVJbWFnZUF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgew0KKyAgaWYgKCFHZXRJbWFnZUltYWdlKCkpIHsNCisgICAgTG9hZEltYWdlSW1hZ2UoKTsNCisgIH0NCisgIHNpemUuU2V0KDAsIDApOw0KKyAgaWYgKENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IEdldEltYWdlSW1hZ2UoKSkgew0KKyAgICBDWEZBX0ltYWdlIGltYWdlT2JqID0gR2V0Rm9ybVZhbHVlKCkuR2V0SW1hZ2UoKTsNCisgICAgQ0ZYX1JlY3RGIHJ0SW1hZ2UsIHJ0Rml0Ow0KKyAgICBydEltYWdlLlNldCgwLCAwLCAwLCAwKTsNCisgICAgcnRGaXQuU2V0KDAsIDAsIDAsIDApOw0KKyAgICBpbnQzMl90IGlJbWFnZVhEcGkgPSAwOw0KKyAgICBpbnQzMl90IGlJbWFnZVlEcGkgPSAwOw0KKyAgICBHZXRJbWFnZURwaShpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgICAgcnRJbWFnZS53aWR0aCA9DQorICAgICAgICBYRkFfVW5pdFB4MlB0KChGWF9GTE9BVClwQml0bWFwLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpaUltYWdlWERwaSk7DQorICAgIHJ0SW1hZ2UuaGVpZ2h0ID0NCisgICAgICAgIFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBCaXRtYXAtPkdldEhlaWdodCgpLCAoRlhfRkxPQVQpaUltYWdlWURwaSk7DQorICAgIGlmIChHZXRXaWR0aChydEZpdC53aWR0aCkpIHsNCisgICAgICBHZXRXaWR0aFdpdGhvdXRNYXJnaW4ocnRGaXQud2lkdGgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJ0Rml0LndpZHRoID0gcnRJbWFnZS53aWR0aDsNCisgICAgfQ0KKyAgICBpZiAoR2V0SGVpZ2h0KHJ0Rml0LmhlaWdodCkpIHsNCisgICAgICBHZXRIZWlnaHRXaXRob3V0TWFyZ2luKHJ0Rml0LmhlaWdodCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRJbWFnZS5oZWlnaHQ7DQorICAgIH0NCisgICAgc2l6ZS54ID0gcnRGaXQud2lkdGg7DQorICAgIHNpemUueSA9IHJ0Rml0LmhlaWdodDsNCisgIH0NCisgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsNCiB9DQotRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6TG9hZEltYWdlRWRpdEltYWdlKCkNCi17DQotICAgIEluaXRMYXlvdXREYXRhKCk7DQotICAgIHJldHVybiAoKENYRkFfSW1hZ2VFZGl0RGF0YSopbV9wTGF5b3V0RGF0YSktPkxvYWRJbWFnZURhdGEodGhpcyk7DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlSW1hZ2VFZGl0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7DQorICBpZiAoIUdldEltYWdlRWRpdEltYWdlKCkpIHsNCisgICAgTG9hZEltYWdlRWRpdEltYWdlKCk7DQorICB9DQorICBzaXplLlNldCgwLCAwKTsNCisgIGlmIChDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBHZXRJbWFnZUVkaXRJbWFnZSgpKSB7DQorICAgIENGWF9SZWN0RiBydEltYWdlLCBydEZpdDsNCisgICAgcnRJbWFnZS5TZXQoMCwgMCwgMCwgMCk7DQorICAgIHJ0Rml0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgaW50MzJfdCBpSW1hZ2VYRHBpID0gMDsNCisgICAgaW50MzJfdCBpSW1hZ2VZRHBpID0gMDsNCisgICAgR2V0SW1hZ2VFZGl0RHBpKGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOw0KKyAgICBydEltYWdlLndpZHRoID0NCisgICAgICAgIFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBCaXRtYXAtPkdldFdpZHRoKCksIChGWF9GTE9BVClpSW1hZ2VYRHBpKTsNCisgICAgcnRJbWFnZS5oZWlnaHQgPQ0KKyAgICAgICAgWEZBX1VuaXRQeDJQdCgoRlhfRkxPQVQpcEJpdG1hcC0+R2V0SGVpZ2h0KCksIChGWF9GTE9BVClpSW1hZ2VZRHBpKTsNCisgICAgaWYgKEdldFdpZHRoKHJ0Rml0LndpZHRoKSkgew0KKyAgICAgIEdldFdpZHRoV2l0aG91dE1hcmdpbihydEZpdC53aWR0aCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcnRGaXQud2lkdGggPSBydEltYWdlLndpZHRoOw0KKyAgICB9DQorICAgIGlmIChHZXRIZWlnaHQocnRGaXQuaGVpZ2h0KSkgew0KKyAgICAgIEdldEhlaWdodFdpdGhvdXRNYXJnaW4ocnRGaXQuaGVpZ2h0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBydEZpdC5oZWlnaHQgPSBydEltYWdlLmhlaWdodDsNCisgICAgfQ0KKyAgICBzaXplLnggPSBydEZpdC53aWR0aDsNCisgICAgc2l6ZS55ID0gcnRGaXQuaGVpZ2h0Ow0KKyAgfQ0KKyAgcmV0dXJuIENhbGN1bGF0ZUZpZWxkQXV0b1NpemUoc2l6ZSk7DQogfQ0KLXZvaWQgQ1hGQV9XaWRnZXRBY2M6OkdldEltYWdlRHBpKGludDMyX3QgJmlJbWFnZVhEcGksIGludDMyX3QgJmlJbWFnZVlEcGkpDQotew0KLSAgICBpSW1hZ2VYRHBpID0gKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1faUltYWdlWERwaTsNCi0gICAgaUltYWdlWURwaSA9ICgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX2lJbWFnZVlEcGk7DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6TG9hZEltYWdlSW1hZ2UoKSB7DQorICBJbml0TGF5b3V0RGF0YSgpOw0KKyAgcmV0dXJuICgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5Mb2FkSW1hZ2VEYXRhKHRoaXMpOw0KIH0NCi12b2lkIENYRkFfV2lkZ2V0QWNjOjpHZXRJbWFnZUVkaXREcGkoaW50MzJfdCAmaUltYWdlWERwaSwgaW50MzJfdCAmaUltYWdlWURwaSkNCi17DQotICAgIGlJbWFnZVhEcGkgPSAoKENYRkFfSW1hZ2VFZGl0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1faUltYWdlWERwaTsNCi0gICAgaUltYWdlWURwaSA9ICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9pSW1hZ2VZRHBpOw0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkxvYWRJbWFnZUVkaXRJbWFnZSgpIHsNCisgIEluaXRMYXlvdXREYXRhKCk7DQorICByZXR1cm4gKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5Mb2FkSW1hZ2VEYXRhKHRoaXMpOw0KIH0NCi1GWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVUZXh0QXV0b1NpemUoQ0ZYX1NpemVGICZzaXplKQ0KLXsNCi0gICAgaWYgKCFMb2FkVGV4dCgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ1hGQV9UZXh0TGF5b3V0KiBwVGV4dExheW91dCA9ICgoQ1hGQV9UZXh0TGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRMYXlvdXQ7DQotICAgIGlmIChwVGV4dExheW91dCkgew0KLSAgICAgICAgc2l6ZS54ID0gcFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KHNpemUueCk7DQotICAgICAgICBzaXplLnkgPSBwVGV4dExheW91dC0+R2V0TGF5b3V0SGVpZ2h0KCk7DQotICAgIH0NCi0gICAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOw0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OkdldEltYWdlRHBpKGludDMyX3QmIGlJbWFnZVhEcGksIGludDMyX3QmIGlJbWFnZVlEcGkpIHsNCisgIGlJbWFnZVhEcGkgPSAoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9pSW1hZ2VYRHBpOw0KKyAgaUltYWdlWURwaSA9ICgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX2lJbWFnZVlEcGk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkxvYWRUZXh0KCkNCi17DQotICAgIEluaXRMYXlvdXREYXRhKCk7DQotICAgIHJldHVybiAoKENYRkFfVGV4dExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5Mb2FkVGV4dCh0aGlzKTsNCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpHZXRJbWFnZUVkaXREcGkoaW50MzJfdCYgaUltYWdlWERwaSwgaW50MzJfdCYgaUltYWdlWURwaSkgew0KKyAgaUltYWdlWERwaSA9ICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9pSW1hZ2VYRHBpOw0KKyAgaUltYWdlWURwaSA9ICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9pSW1hZ2VZRHBpOw0KIH0NCi1GWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlV2lkZ2V0QXV0b1dpZHRoKEZYX0ZMT0FUIGZXaWR0aENhbGMpDQotew0KLSAgICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IHRoaXMtPkdldE1hcmdpbigpOw0KLSAgICBpZiAobWdXaWRnZXQuSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZSaWdodEluc2V0Ow0KLSAgICAgICAgbWdXaWRnZXQuR2V0TGVmdEluc2V0KGZMZWZ0SW5zZXQpOw0KLSAgICAgICAgbWdXaWRnZXQuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQotICAgICAgICBmV2lkdGhDYWxjICs9IGZMZWZ0SW5zZXQgKyBmUmlnaHRJbnNldDsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmTWluID0gMCwgZk1heCA9IDA7DQotICAgIGlmICh0aGlzLT5HZXRNaW5XaWR0aChmTWluKSkgew0KLSAgICAgICAgZldpZHRoQ2FsYyA9IEZYX01BWChmV2lkdGhDYWxjLCBmTWluKTsNCi0gICAgfQ0KLSAgICBpZiAodGhpcy0+R2V0TWF4V2lkdGgoZk1heCkgJiYgZk1heCA+IDApIHsNCi0gICAgICAgIGZXaWR0aENhbGMgPSBGWF9NSU4oZldpZHRoQ2FsYywgZk1heCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGZXaWR0aENhbGM7DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlVGV4dEF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgew0KKyAgaWYgKCFMb2FkVGV4dCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPQ0KKyAgICAgICgoQ1hGQV9UZXh0TGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRMYXlvdXQ7DQorICBpZiAocFRleHRMYXlvdXQpIHsNCisgICAgc2l6ZS54ID0gcFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KHNpemUueCk7DQorICAgIHNpemUueSA9IHBUZXh0TGF5b3V0LT5HZXRMYXlvdXRIZWlnaHQoKTsNCisgIH0NCisgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsNCiB9DQotRlhfRkxPQVQgQ1hGQV9XaWRnZXRBY2M6OkdldFdpZHRoV2l0aG91dE1hcmdpbihGWF9GTE9BVCBmV2lkdGhDYWxjKQ0KLXsNCi0gICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCi0gICAgaWYgKG1nV2lkZ2V0LklzRXhpc3RJblhNTCgpKSB7DQotICAgICAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmUmlnaHRJbnNldDsNCi0gICAgICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCi0gICAgICAgIG1nV2lkZ2V0LkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOw0KLSAgICAgICAgZldpZHRoQ2FsYyAtPSBmTGVmdEluc2V0ICsgZlJpZ2h0SW5zZXQ7DQotICAgIH0NCi0gICAgcmV0dXJuIGZXaWR0aENhbGM7DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6TG9hZFRleHQoKSB7DQorICBJbml0TGF5b3V0RGF0YSgpOw0KKyAgcmV0dXJuICgoQ1hGQV9UZXh0TGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPkxvYWRUZXh0KHRoaXMpOw0KIH0NCi1GWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlV2lkZ2V0QXV0b0hlaWdodChGWF9GTE9BVCBmSGVpZ2h0Q2FsYykNCi17DQotICAgIENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gdGhpcy0+R2V0TWFyZ2luKCk7DQotICAgIGlmIChtZ1dpZGdldC5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgRlhfRkxPQVQgZlRvcEluc2V0LCBmQm90dG9tSW5zZXQ7DQotICAgICAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KLSAgICAgICAgbWdXaWRnZXQuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsNCi0gICAgICAgIGZIZWlnaHRDYWxjICs9IGZUb3BJbnNldCArIGZCb3R0b21JbnNldDsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmTWluID0gMCwgZk1heCA9IDA7DQotICAgIGlmICh0aGlzLT5HZXRNaW5IZWlnaHQoZk1pbikpIHsNCi0gICAgICAgIGZIZWlnaHRDYWxjID0gRlhfTUFYKGZIZWlnaHRDYWxjLCBmTWluKTsNCi0gICAgfQ0KLSAgICBpZiAodGhpcy0+R2V0TWF4SGVpZ2h0KGZNYXgpICYmIGZNYXggPiAwKSB7DQotICAgICAgICBmSGVpZ2h0Q2FsYyA9IEZYX01JTihmSGVpZ2h0Q2FsYywgZk1heCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGZIZWlnaHRDYWxjOw0KK0ZYX0ZMT0FUIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVXaWRnZXRBdXRvV2lkdGgoRlhfRkxPQVQgZldpZHRoQ2FsYykgew0KKyAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCisgIGlmIChtZ1dpZGdldC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmUmlnaHRJbnNldDsNCisgICAgbWdXaWRnZXQuR2V0TGVmdEluc2V0KGZMZWZ0SW5zZXQpOw0KKyAgICBtZ1dpZGdldC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCisgICAgZldpZHRoQ2FsYyArPSBmTGVmdEluc2V0ICsgZlJpZ2h0SW5zZXQ7DQorICB9DQorICBGWF9GTE9BVCBmTWluID0gMCwgZk1heCA9IDA7DQorICBpZiAodGhpcy0+R2V0TWluV2lkdGgoZk1pbikpIHsNCisgICAgZldpZHRoQ2FsYyA9IEZYX01BWChmV2lkdGhDYWxjLCBmTWluKTsNCisgIH0NCisgIGlmICh0aGlzLT5HZXRNYXhXaWR0aChmTWF4KSAmJiBmTWF4ID4gMCkgew0KKyAgICBmV2lkdGhDYWxjID0gRlhfTUlOKGZXaWR0aENhbGMsIGZNYXgpOw0KKyAgfQ0KKyAgcmV0dXJuIGZXaWR0aENhbGM7DQogfQ0KLUZYX0ZMT0FUIENYRkFfV2lkZ2V0QWNjOjpHZXRIZWlnaHRXaXRob3V0TWFyZ2luKEZYX0ZMT0FUIGZIZWlnaHRDYWxjKQ0KLXsNCi0gICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCi0gICAgaWYgKG1nV2lkZ2V0LklzRXhpc3RJblhNTCgpKSB7DQotICAgICAgICBGWF9GTE9BVCBmVG9wSW5zZXQsIGZCb3R0b21JbnNldDsNCi0gICAgICAgIG1nV2lkZ2V0LkdldFRvcEluc2V0KGZUb3BJbnNldCk7DQotICAgICAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KLSAgICAgICAgZkhlaWdodENhbGMgLT0gZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0Ow0KLSAgICB9DQotICAgIHJldHVybiBmSGVpZ2h0Q2FsYzsNCitGWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6R2V0V2lkdGhXaXRob3V0TWFyZ2luKEZYX0ZMT0FUIGZXaWR0aENhbGMpIHsNCisgIENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gdGhpcy0+R2V0TWFyZ2luKCk7DQorICBpZiAobWdXaWRnZXQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgRlhfRkxPQVQgZkxlZnRJbnNldCwgZlJpZ2h0SW5zZXQ7DQorICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgbWdXaWRnZXQuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICAgIGZXaWR0aENhbGMgLT0gZkxlZnRJbnNldCArIGZSaWdodEluc2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIGZXaWR0aENhbGM7DQogfQ0KLXZvaWQgQ1hGQV9XaWRnZXRBY2M6OlN0YXJ0V2lkZ2V0TGF5b3V0KEZYX0ZMT0FUICZmQ2FsY1dpZHRoLCBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpDQotew0KLSAgICBJbml0TGF5b3V0RGF0YSgpOw0KLSAgICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gR2V0VUlUeXBlKCk7DQotICAgIGlmIChlVUlUeXBlID09IFhGQV9FTEVNRU5UX1RleHQpIHsNCi0gICAgICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IC0xOw0KLSAgICAgICAgR2V0SGVpZ2h0KG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCk7DQotICAgICAgICBTdGFydFRleHRMYXlvdXQoZkNhbGNXaWR0aCwgZkNhbGNIZWlnaHQpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChmQ2FsY1dpZHRoID4gMCAmJiBmQ2FsY0hlaWdodCA+IDApIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KK0ZYX0ZMT0FUIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVXaWRnZXRBdXRvSGVpZ2h0KEZYX0ZMT0FUIGZIZWlnaHRDYWxjKSB7DQorICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IHRoaXMtPkdldE1hcmdpbigpOw0KKyAgaWYgKG1nV2lkZ2V0LklzRXhpc3RJblhNTCgpKSB7DQorICAgIEZYX0ZMT0FUIGZUb3BJbnNldCwgZkJvdHRvbUluc2V0Ow0KKyAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KKyAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KKyAgICBmSGVpZ2h0Q2FsYyArPSBmVG9wSW5zZXQgKyBmQm90dG9tSW5zZXQ7DQorICB9DQorICBGWF9GTE9BVCBmTWluID0gMCwgZk1heCA9IDA7DQorICBpZiAodGhpcy0+R2V0TWluSGVpZ2h0KGZNaW4pKSB7DQorICAgIGZIZWlnaHRDYWxjID0gRlhfTUFYKGZIZWlnaHRDYWxjLCBmTWluKTsNCisgIH0NCisgIGlmICh0aGlzLT5HZXRNYXhIZWlnaHQoZk1heCkgJiYgZk1heCA+IDApIHsNCisgICAgZkhlaWdodENhbGMgPSBGWF9NSU4oZkhlaWdodENhbGMsIGZNYXgpOw0KKyAgfQ0KKyAgcmV0dXJuIGZIZWlnaHRDYWxjOw0KK30NCitGWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6R2V0SGVpZ2h0V2l0aG91dE1hcmdpbihGWF9GTE9BVCBmSGVpZ2h0Q2FsYykgew0KKyAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCisgIGlmIChtZ1dpZGdldC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICBGWF9GTE9BVCBmVG9wSW5zZXQsIGZCb3R0b21JbnNldDsNCisgICAgbWdXaWRnZXQuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgICAgbWdXaWRnZXQuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsNCisgICAgZkhlaWdodENhbGMgLT0gZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIGZIZWlnaHRDYWxjOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpTdGFydFdpZGdldExheW91dChGWF9GTE9BVCYgZkNhbGNXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpIHsNCisgIEluaXRMYXlvdXREYXRhKCk7DQorICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gR2V0VUlUeXBlKCk7DQorICBpZiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9UZXh0KSB7DQogICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IC0xOw0KLSAgICBGWF9GTE9BVCBmV2lkdGggPSAwOw0KLSAgICBpZiAoZkNhbGNXaWR0aCA+IDAgJiYgZkNhbGNIZWlnaHQgPCAwKSB7DQotICAgICAgICBpZiAoIUdldEhlaWdodChmQ2FsY0hlaWdodCkpIHsNCi0gICAgICAgICAgICBDYWxjdWxhdGVBY2NXaWR0aEFuZEhlaWdodChlVUlUeXBlLCBmQ2FsY1dpZHRoLCBmQ2FsY0hlaWdodCk7DQotICAgICAgICB9DQotICAgICAgICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPSBmQ2FsY0hlaWdodDsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoZkNhbGNXaWR0aCA8IDAgJiYgZkNhbGNIZWlnaHQgPCAwKSB7DQotICAgICAgICBpZiAoIUdldFdpZHRoKGZXaWR0aCkgfHwgIUdldEhlaWdodChmQ2FsY0hlaWdodCkpIHsNCi0gICAgICAgICAgICBDYWxjdWxhdGVBY2NXaWR0aEFuZEhlaWdodChlVUlUeXBlLCBmV2lkdGgsIGZDYWxjSGVpZ2h0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZDYWxjV2lkdGggPSBmV2lkdGg7DQorICAgIEdldEhlaWdodChtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQpOw0KKyAgICBTdGFydFRleHRMYXlvdXQoZkNhbGNXaWR0aCwgZkNhbGNIZWlnaHQpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoZkNhbGNXaWR0aCA+IDAgJiYgZkNhbGNIZWlnaHQgPiAwKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IC0xOw0KKyAgRlhfRkxPQVQgZldpZHRoID0gMDsNCisgIGlmIChmQ2FsY1dpZHRoID4gMCAmJiBmQ2FsY0hlaWdodCA8IDApIHsNCisgICAgaWYgKCFHZXRIZWlnaHQoZkNhbGNIZWlnaHQpKSB7DQorICAgICAgQ2FsY3VsYXRlQWNjV2lkdGhBbmRIZWlnaHQoZVVJVHlwZSwgZkNhbGNXaWR0aCwgZkNhbGNIZWlnaHQpOw0KICAgICB9DQogICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IGZDYWxjSGVpZ2h0Ow0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoZkNhbGNXaWR0aCA8IDAgJiYgZkNhbGNIZWlnaHQgPCAwKSB7DQorICAgIGlmICghR2V0V2lkdGgoZldpZHRoKSB8fCAhR2V0SGVpZ2h0KGZDYWxjSGVpZ2h0KSkgew0KKyAgICAgIENhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KGVVSVR5cGUsIGZXaWR0aCwgZkNhbGNIZWlnaHQpOw0KKyAgICB9DQorICAgIGZDYWxjV2lkdGggPSBmV2lkdGg7DQorICB9DQorICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPSBmQ2FsY0hlaWdodDsNCiB9DQotdm9pZCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlQWNjV2lkdGhBbmRIZWlnaHQoWEZBX0VMRU1FTlQgZVVJVHlwZSwgRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0KQ0KLXsNCi0gICAgQ0ZYX1NpemVGIHN6Ow0KLSAgICBzei5TZXQoZldpZHRoLCBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQpOw0KLSAgICBzd2l0Y2goZVVJVHlwZSkgew0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CYXJjb2RlOg0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0Og0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TaWduYXR1cmU6DQotICAgICAgICAgICAgQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShzeik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDoNCi0gICAgICAgICAgICBDYWxjdWxhdGVJbWFnZUVkaXRBdXRvU2l6ZShzeik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0J1dHRvbjoNCi0gICAgICAgICAgICBDYWxjdWxhdGVQdXNoQnV0dG9uQXV0b1NpemUoc3opOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjoNCi0gICAgICAgICAgICBDYWxjdWxhdGVDaGVja0J1dHRvbkF1dG9TaXplKHN6KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0Og0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdDoNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0Og0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0RWRpdDoNCi0gICAgICAgICAgICBDYWxjdWxhdGVUZXh0RWRpdEF1dG9TaXplKHN6KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2U6DQotICAgICAgICAgICAgQ2FsY3VsYXRlSW1hZ2VBdXRvU2l6ZShzeik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0FyYzoNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTGluZToNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUmVjdGFuZ2xlOg0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6DQotICAgICAgICAgICAgQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoc3opOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBmV2lkdGggPSBzei54Ow0KLSAgICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPSBzei55Ow0KLSAgICBmQ2FsY0hlaWdodCA9IHN6Lnk7DQordm9pZCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlQWNjV2lkdGhBbmRIZWlnaHQoWEZBX0VMRU1FTlQgZVVJVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCkgew0KKyAgQ0ZYX1NpemVGIHN6Ow0KKyAgc3ouU2V0KGZXaWR0aCwgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0KTsNCisgIHN3aXRjaCAoZVVJVHlwZSkgew0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0JhcmNvZGU6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TaWduYXR1cmU6DQorICAgICAgQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShzeik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0Og0KKyAgICAgIENhbGN1bGF0ZUltYWdlRWRpdEF1dG9TaXplKHN6KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9CdXR0b246DQorICAgICAgQ2FsY3VsYXRlUHVzaEJ1dHRvbkF1dG9TaXplKHN6KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjoNCisgICAgICBDYWxjdWxhdGVDaGVja0J1dHRvbkF1dG9TaXplKHN6KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQ6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQ6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0Og0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHRFZGl0Og0KKyAgICAgIENhbGN1bGF0ZVRleHRFZGl0QXV0b1NpemUoc3opOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlOg0KKyAgICAgIENhbGN1bGF0ZUltYWdlQXV0b1NpemUoc3opOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0FyYzoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9MaW5lOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1JlY3RhbmdsZToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCisgICAgICBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzeik7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBmV2lkdGggPSBzei54Ow0KKyAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0gc3oueTsNCisgIGZDYWxjSGVpZ2h0ID0gc3oueTsNCiB9DQotRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6RmluZFNwbGl0UG9zKGludDMyX3QgaUJsb2NrSW5kZXgsIEZYX0ZMT0FUICZmQ2FsY0hlaWdodCkNCi17DQotICAgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSAoWEZBX0VMRU1FTlQpR2V0VUlUeXBlKCk7DQotICAgIGlmIChlVUlUeXBlID09IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoZVVJVHlwZSAhPSBYRkFfRUxFTUVOVF9UZXh0ICYmIGVVSVR5cGUgIT0gWEZBX0VMRU1FTlRfVGV4dEVkaXQgJiYgZVVJVHlwZSAhPSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCAmJiBlVUlUeXBlICE9IFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCkgew0KLSAgICAgICAgZkNhbGNIZWlnaHQgPSAwOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZlRvcEluc2V0ID0gMDsNCi0gICAgRlhfRkxPQVQgZkJvdHRvbUluc2V0ID0gMDsNCi0gICAgaWYgKGlCbG9ja0luZGV4ID09IDApIHsNCi0gICAgICAgIENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gdGhpcy0+R2V0TWFyZ2luKCk7DQotICAgICAgICBpZiAobWdXaWRnZXQuSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgICAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KLSAgICAgICAgICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQotICAgICAgICB9DQotICAgICAgICBDRlhfUmVjdEYgcnRVSU1hcmdpbjsNCi0gICAgICAgIHRoaXMtPkdldFVJTWFyZ2luKHJ0VUlNYXJnaW4pOw0KLSAgICAgICAgZlRvcEluc2V0ICs9IHJ0VUlNYXJnaW4udG9wOw0KLSAgICAgICAgZkJvdHRvbUluc2V0ICs9IHJ0VUlNYXJnaW4ud2lkdGg7DQotICAgIH0NCi0gICAgaWYgKGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfVGV4dCkgew0KLSAgICAgICAgRlhfRkxPQVQgZkhlaWdodCA9IGZDYWxjSGVpZ2h0Ow0KLSAgICAgICAgaWYgKGlCbG9ja0luZGV4ID09IDApIHsNCi0gICAgICAgICAgICBmQ2FsY0hlaWdodCA9IGZDYWxjSGVpZ2h0IC0gZlRvcEluc2V0Ow0KLSAgICAgICAgICAgIGlmIChmQ2FsY0hlaWdodCA8IDApIHsNCi0gICAgICAgICAgICAgICAgZkNhbGNIZWlnaHQgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPSAoKENYRkFfVGV4dExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BUZXh0TGF5b3V0Ow0KLSAgICAgICAgcFRleHRMYXlvdXQtPkRvTGF5b3V0KGlCbG9ja0luZGV4LCBmQ2FsY0hlaWdodCwgZkNhbGNIZWlnaHQsIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCAtIGZUb3BJbnNldCk7DQotICAgICAgICBpZiAoZkNhbGNIZWlnaHQgIT0gMCkgew0KLSAgICAgICAgICAgIGlmIChpQmxvY2tJbmRleCA9PSAwKSB7DQotICAgICAgICAgICAgICAgIGZDYWxjSGVpZ2h0ID0gZkNhbGNIZWlnaHQgKyBmVG9wSW5zZXQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChmYWJzKGZIZWlnaHQgLSBmQ2FsY0hlaWdodCkgIDwgWEZBX0ZMT0FUX1BFUkNJU0lPTikgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gaUNhcFBsYWNlbWVudCA9IFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd247DQotICAgIEZYX0ZMT0FUIGZDYXBSZXNlcnZlID0gMDsNCi0gICAgaWYgKGlCbG9ja0luZGV4ID09IDApIHsNCi0gICAgICAgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gR2V0Q2FwdGlvbigpOw0KLSAgICAgICAgaWYgKGNhcHRpb24uSXNFeGlzdEluWE1MKCkgJiYgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgew0KLSAgICAgICAgICAgIGlDYXBQbGFjZW1lbnQgPSAoWEZBX0FUVFJJQlVURUVOVU0pY2FwdGlvbi5HZXRQbGFjZW1lbnRUeXBlKCk7DQotICAgICAgICAgICAgZkNhcFJlc2VydmUgPSBjYXB0aW9uLkdldFJlc2VydmUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCAmJiBmQ2FsY0hlaWdodCA8IGZDYXBSZXNlcnZlICsgZlRvcEluc2V0KSB7DQotICAgICAgICAgICAgZkNhbGNIZWlnaHQgPSAwOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tICYmIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCAtIGZDYXBSZXNlcnZlIC0gZkJvdHRvbUluc2V0KSB7DQotICAgICAgICAgICAgZkNhbGNIZWlnaHQgPSAwOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgIT0gWEZBX0FUVFJJQlVURUVOVU1fVG9wKSB7DQotICAgICAgICAgICAgZkNhcFJlc2VydmUgPSAwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGludDMyX3QgaUxpbmVzQ291bnQgPSAwOw0KLSAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0Ow0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQotICAgIHRoaXMtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCi0gICAgaWYgKHdzVGV4dC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIGlMaW5lc0NvdW50ID0gMTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmICghKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRPdXQpIHsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGggPSAwOw0KLSAgICAgICAgICAgIEdldFdpZHRoKGZXaWR0aCk7DQotICAgICAgICAgICAgQ2FsY3VsYXRlQWNjV2lkdGhBbmRIZWlnaHQoZVVJVHlwZSwgZldpZHRoLCBmSGVpZ2h0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlMaW5lc0NvdW50ID0gKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRPdXQtPkdldFRvdGFsTGluZXMoKTsNCi0gICAgfQ0KLSAgICBpZiAoISgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BGaWVsZFNwbGl0QXJyYXkpIHsNCi0gICAgICAgICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BGaWVsZFNwbGl0QXJyYXkgPSBGWF9ORVcgQ0ZYX0Zsb2F0QXJyYXk7DQotICAgIH0NCi0gICAgQ0ZYX0Zsb2F0QXJyYXkqIHBGaWVsZEFycmF5ID0gKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcEZpZWxkU3BsaXRBcnJheTsNCi0gICAgaW50MzJfdCBpRmllbGRTcGxpdENvdW50ID0gcEZpZWxkQXJyYXktPkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2NrSW5kZXggKiAzOyBpICs9IDMpIHsNCi0gICAgICAgIGlMaW5lc0NvdW50IC09IChpbnQzMl90KXBGaWVsZEFycmF5LT5HZXRBdChpICsgMSk7DQotICAgICAgICBmSGVpZ2h0IC09IHBGaWVsZEFycmF5LT5HZXRBdChpICsgMik7DQotICAgIH0NCi0gICAgaWYgKGlMaW5lc0NvdW50ID09IDApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IEdldExpbmVIZWlnaHQoKTsNCi0gICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsNCi0gICAgRlhfRkxPQVQgZlRleHRIZWlnaHQgPSBpTGluZXNDb3VudCAqIGZMaW5lSGVpZ2h0IC0gZkxpbmVIZWlnaHQgKyBmRm9udFNpemU7DQotICAgIEZYX0ZMT0FUIGZTcGFjZUFib3ZlID0gMDsNCi0gICAgRlhfRkxPQVQgZlN0YXJ0T2Zmc2V0ID0gMDsNCi0gICAgaWYgKGZIZWlnaHQgPiAwLjFmICYmIGlCbG9ja0luZGV4ID09IDApIHsNCi0gICAgICAgIGZTdGFydE9mZnNldCA9IGZUb3BJbnNldDsNCi0gICAgICAgIGZIZWlnaHQgLT0gKGZUb3BJbnNldCArIGZCb3R0b21JbnNldCk7DQotICAgICAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSB0aGlzLT5HZXRQYXJhKCkpIHsNCi0gICAgICAgICAgICBmU3BhY2VBYm92ZSA9IHBhcmEuR2V0U3BhY2VBYm92ZSgpOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGFjZUJlbG93ID0gcGFyYS5HZXRTcGFjZUJlbG93KCk7DQotICAgICAgICAgICAgZkhlaWdodCAtPSAoZlNwYWNlQWJvdmUgKyBmU3BhY2VCZWxvdyk7DQotICAgICAgICAgICAgc3dpdGNoIChwYXJhLkdldFZlcnRpY2FsQWxpZ24oKSkgew0KLSAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDoNCi0gICAgICAgICAgICAgICAgICAgIGZTdGFydE9mZnNldCArPSBmU3BhY2VBYm92ZTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToNCi0gICAgICAgICAgICAgICAgICAgIGZTdGFydE9mZnNldCArPSAoKGZIZWlnaHQgLSBmVGV4dEhlaWdodCkgLyAyICsgZlNwYWNlQWJvdmUpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOg0KLSAgICAgICAgICAgICAgICAgICAgZlN0YXJ0T2Zmc2V0ICs9IChmSGVpZ2h0IC0gZlRleHRIZWlnaHQgKyBmU3BhY2VBYm92ZSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoZlN0YXJ0T2Zmc2V0IDwgMC4xZikgew0KLSAgICAgICAgICAgIGZTdGFydE9mZnNldCA9IDA7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IGkgPSBpQmxvY2tJbmRleCAtIDE7IGlCbG9ja0luZGV4ID4gMCAmJiBpIDwgaUJsb2NrSW5kZXg7IGkrKykgew0KLSAgICAgICAgZlN0YXJ0T2Zmc2V0ID0gcEZpZWxkQXJyYXktPkdldEF0KGkgKiAzKSAtIHBGaWVsZEFycmF5LT5HZXRBdChpICogMyArIDIpOw0KLSAgICAgICAgaWYgKGZTdGFydE9mZnNldCA8IDAuMWYpIHsNCi0gICAgICAgICAgICBmU3RhcnRPZmZzZXQgPSAwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChpRmllbGRTcGxpdENvdW50IC8gMyA9PSAoaUJsb2NrSW5kZXggKyAxKSkgew0KLSAgICAgICAgcEZpZWxkQXJyYXktPlNldEF0KDAsIGZTdGFydE9mZnNldCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwRmllbGRBcnJheS0+QWRkKGZTdGFydE9mZnNldCk7DQotICAgIH0NCi0gICAgWEZBX1ZFUlNJT04gdmVyc2lvbiA9IEdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCi0gICAgRlhfQk9PTCBiQ2FuU3BsaXROb0NvbnRlbnQgPSBGQUxTRTsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dE1vZGU7DQotICAgIHRoaXMtPkdldE5vZGUoKS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPlRyeUVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQsIGVMYXlvdXRNb2RlLCBUUlVFKTsNCi0gICAgaWYgKChlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbiB8fCBlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYiB8fCBlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cgfHwgZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGFibGUpICYmIHZlcnNpb24gPiBYRkFfVkVSU0lPTl8yMDgpIHsNCi0gICAgICAgIGJDYW5TcGxpdE5vQ29udGVudCA9IFRSVUU7DQotICAgIH0NCi0gICAgaWYgKChlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYiB8fCBlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cgfHwgZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGFibGUpICYmIHZlcnNpb24gPD0gWEZBX1ZFUlNJT05fMjA4KSB7DQotICAgICAgICBpZiAoZlN0YXJ0T2Zmc2V0IDwgZkNhbGNIZWlnaHQpIHsNCi0gICAgICAgICAgICBiQ2FuU3BsaXROb0NvbnRlbnQgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmQ2FsY0hlaWdodCA9IDA7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGJDYW5TcGxpdE5vQ29udGVudCkgew0KLSAgICAgICAgaWYgKChmQ2FsY0hlaWdodCAtIGZUb3BJbnNldCAtIGZTcGFjZUFib3ZlIDwgZkxpbmVIZWlnaHQpKSB7DQotICAgICAgICAgICAgZkNhbGNIZWlnaHQgPSAwOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGZTdGFydE9mZnNldCArIFhGQV9GTE9BVF9QRVJDSVNJT04gPj0gZkNhbGNIZWlnaHQpIHsNCi0gICAgICAgICAgICBpZiAoaUZpZWxkU3BsaXRDb3VudCAvIDMgPT0gKGlCbG9ja0luZGV4ICsgMSkpIHsNCi0gICAgICAgICAgICAgICAgcEZpZWxkQXJyYXktPlNldEF0KGlCbG9ja0luZGV4ICogMyArIDEsIDApOw0KLSAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMiwgZkNhbGNIZWlnaHQpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBGaWVsZEFycmF5LT5BZGQoMCk7DQotICAgICAgICAgICAgICAgIHBGaWVsZEFycmF5LT5BZGQoZkNhbGNIZWlnaHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZkNhbGNIZWlnaHQgLSBmU3RhcnRPZmZzZXQgPCBmTGluZUhlaWdodCkgew0KLSAgICAgICAgICAgIGZDYWxjSGVpZ2h0ID0gZlN0YXJ0T2Zmc2V0Ow0KLSAgICAgICAgICAgIGlmIChpRmllbGRTcGxpdENvdW50IC8gMyA9PSAoaUJsb2NrSW5kZXggKyAxKSkgew0KLSAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMSwgMCk7DQotICAgICAgICAgICAgICAgIHBGaWVsZEFycmF5LT5TZXRBdChpQmxvY2tJbmRleCAqIDMgKyAyLCBmQ2FsY0hlaWdodCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcEZpZWxkQXJyYXktPkFkZCgwKTsNCi0gICAgICAgICAgICAgICAgcEZpZWxkQXJyYXktPkFkZChmQ2FsY0hlaWdodCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRkxPQVQgZlRleHROdW0gPSBmQ2FsY0hlaWdodCArIFhGQV9GTE9BVF9QRVJDSVNJT04gLSBmQ2FwUmVzZXJ2ZSAtIGZTdGFydE9mZnNldDsNCi0gICAgICAgIGludDMyX3QgaUxpbmVOdW0gPSAoaW50MzJfdCkoKGZUZXh0TnVtICsgKGZMaW5lSGVpZ2h0IC0gZkZvbnRTaXplKSkgLyBmTGluZUhlaWdodCk7DQotICAgICAgICBpZiAoaUxpbmVOdW0gPj0gaUxpbmVzQ291bnQpIHsNCi0gICAgICAgICAgICBpZiAoZkNhbGNIZWlnaHQgLSBmU3RhcnRPZmZzZXQgLSBmVGV4dEhlaWdodCA+PSBmRm9udFNpemUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7DQotICAgICAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMSwgKEZYX0ZMT0FUKWlMaW5lc0NvdW50KTsNCi0gICAgICAgICAgICAgICAgICAgIHBGaWVsZEFycmF5LT5TZXRBdChpQmxvY2tJbmRleCAqIDMgKyAyLCBmQ2FsY0hlaWdodCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+QWRkKChGWF9GTE9BVClpTGluZXNDb3VudCk7DQotICAgICAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+QWRkKGZDYWxjSGVpZ2h0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChmSGVpZ2h0IC0gZlN0YXJ0T2Zmc2V0IC0gZlRleHRIZWlnaHQgPCBmRm9udFNpemUpIHsNCi0gICAgICAgICAgICAgICAgaUxpbmVOdW0gLT0gMTsNCi0gICAgICAgICAgICAgICAgaWYgKGlMaW5lTnVtID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGZDYWxjSGVpZ2h0ID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaUxpbmVOdW0gPSAoaW50MzJfdCkoZlRleHROdW0gLyBmTGluZUhlaWdodCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlMaW5lTnVtID4gMCkgew0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGxpdEhlaWdodCA9IGlMaW5lTnVtICogZkxpbmVIZWlnaHQgICsgZkNhcFJlc2VydmUgKyBmU3RhcnRPZmZzZXQ7DQotICAgICAgICAgICAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7DQotICAgICAgICAgICAgICAgIHBGaWVsZEFycmF5LT5TZXRBdChpQmxvY2tJbmRleCAqIDMgKyAxLCAoRlhfRkxPQVQpaUxpbmVOdW0pOw0KLSAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMiwgZlNwbGl0SGVpZ2h0KTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBwRmllbGRBcnJheS0+QWRkKChGWF9GTE9BVClpTGluZU51bSk7DQotICAgICAgICAgICAgICAgIHBGaWVsZEFycmF5LT5BZGQoZlNwbGl0SGVpZ2h0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGZhYnMoZlNwbGl0SGVpZ2h0IC0gZkNhbGNIZWlnaHQpICA8IFhGQV9GTE9BVF9QRVJDSVNJT04pIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmQ2FsY0hlaWdodCA9IGZTcGxpdEhlaWdodDsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkZpbmRTcGxpdFBvcyhpbnQzMl90IGlCbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpIHsNCisgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSAoWEZBX0VMRU1FTlQpR2V0VUlUeXBlKCk7DQorICBpZiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChlVUlUeXBlICE9IFhGQV9FTEVNRU5UX1RleHQgJiYgZVVJVHlwZSAhPSBYRkFfRUxFTUVOVF9UZXh0RWRpdCAmJg0KKyAgICAgIGVVSVR5cGUgIT0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQgJiYNCisgICAgICBlVUlUeXBlICE9IFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCkgew0KICAgICBmQ2FsY0hlaWdodCA9IDA7DQogICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENYRkFfV2lkZ2V0QWNjOjpJbml0TGF5b3V0RGF0YSgpDQotew0KLSAgICBpZiAobV9wTGF5b3V0RGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlRvcEluc2V0ID0gMDsNCisgIEZYX0ZMT0FUIGZCb3R0b21JbnNldCA9IDA7DQorICBpZiAoaUJsb2NrSW5kZXggPT0gMCkgew0KKyAgICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IHRoaXMtPkdldE1hcmdpbigpOw0KKyAgICBpZiAobWdXaWRnZXQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KKyAgICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQogICAgIH0NCi0gICAgc3dpdGNoIChHZXRVSVR5cGUoKSkgew0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0Og0KLSAgICAgICAgICAgIG1fcExheW91dERhdGEgPSBGWF9ORVcgQ1hGQV9UZXh0TGF5b3V0RGF0YTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHRFZGl0Og0KLSAgICAgICAgICAgIG1fcExheW91dERhdGEgPSBGWF9ORVcgQ1hGQV9UZXh0RWRpdERhdGE7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZToNCi0gICAgICAgICAgICBtX3BMYXlvdXREYXRhID0gRlhfTkVXIENYRkFfSW1hZ2VMYXlvdXREYXRhOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0Og0KLSAgICAgICAgICAgIG1fcExheW91dERhdGEgPSBGWF9ORVcgQ1hGQV9JbWFnZUVkaXREYXRhOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQorICAgIENGWF9SZWN0RiBydFVJTWFyZ2luOw0KKyAgICB0aGlzLT5HZXRVSU1hcmdpbihydFVJTWFyZ2luKTsNCisgICAgZlRvcEluc2V0ICs9IHJ0VUlNYXJnaW4udG9wOw0KKyAgICBmQm90dG9tSW5zZXQgKz0gcnRVSU1hcmdpbi53aWR0aDsNCisgIH0NCisgIGlmIChlVUlUeXBlID09IFhGQV9FTEVNRU5UX1RleHQpIHsNCisgICAgRlhfRkxPQVQgZkhlaWdodCA9IGZDYWxjSGVpZ2h0Ow0KKyAgICBpZiAoaUJsb2NrSW5kZXggPT0gMCkgew0KKyAgICAgIGZDYWxjSGVpZ2h0ID0gZkNhbGNIZWlnaHQgLSBmVG9wSW5zZXQ7DQorICAgICAgaWYgKGZDYWxjSGVpZ2h0IDwgMCkgew0KKyAgICAgICAgZkNhbGNIZWlnaHQgPSAwOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAoR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQotICAgICAgICBtX3BMYXlvdXREYXRhID0gRlhfTkVXIENYRkFfRmllbGRMYXlvdXREYXRhOw0KKyAgICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0NCisgICAgICAgICgoQ1hGQV9UZXh0TGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRMYXlvdXQ7DQorICAgIHBUZXh0TGF5b3V0LT5Eb0xheW91dChpQmxvY2tJbmRleCwgZkNhbGNIZWlnaHQsIGZDYWxjSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0IC0gZlRvcEluc2V0KTsNCisgICAgaWYgKGZDYWxjSGVpZ2h0ICE9IDApIHsNCisgICAgICBpZiAoaUJsb2NrSW5kZXggPT0gMCkgew0KKyAgICAgICAgZkNhbGNIZWlnaHQgPSBmQ2FsY0hlaWdodCArIGZUb3BJbnNldDsNCisgICAgICB9DQorICAgICAgaWYgKGZhYnMoZkhlaWdodCAtIGZDYWxjSGVpZ2h0KSA8IFhGQV9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBYRkFfQVRUUklCVVRFRU5VTSBpQ2FwUGxhY2VtZW50ID0gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCisgIEZYX0ZMT0FUIGZDYXBSZXNlcnZlID0gMDsNCisgIGlmIChpQmxvY2tJbmRleCA9PSAwKSB7DQorICAgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gR2V0Q2FwdGlvbigpOw0KKyAgICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJg0KKyAgICAgICAgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgew0KKyAgICAgIGlDYXBQbGFjZW1lbnQgPSAoWEZBX0FUVFJJQlVURUVOVU0pY2FwdGlvbi5HZXRQbGFjZW1lbnRUeXBlKCk7DQorICAgICAgZkNhcFJlc2VydmUgPSBjYXB0aW9uLkdldFJlc2VydmUoKTsNCisgICAgfQ0KKyAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ub3AgJiYNCisgICAgICAgIGZDYWxjSGVpZ2h0IDwgZkNhcFJlc2VydmUgKyBmVG9wSW5zZXQpIHsNCisgICAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tICYmDQorICAgICAgICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgLSBmQ2FwUmVzZXJ2ZSAtIGZCb3R0b21JbnNldCkgew0KKyAgICAgIGZDYWxjSGVpZ2h0ID0gMDsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoaUNhcFBsYWNlbWVudCAhPSBYRkFfQVRUUklCVVRFRU5VTV9Ub3ApIHsNCisgICAgICBmQ2FwUmVzZXJ2ZSA9IDA7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaUxpbmVzQ291bnQgPSAwOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodDsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgIHRoaXMtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCisgIGlmICh3c1RleHQuSXNFbXB0eSgpKSB7DQorICAgIGlMaW5lc0NvdW50ID0gMTsNCisgIH0gZWxzZSB7DQorICAgIGlmICghKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRPdXQpIHsNCisgICAgICBGWF9GTE9BVCBmV2lkdGggPSAwOw0KKyAgICAgIEdldFdpZHRoKGZXaWR0aCk7DQorICAgICAgQ2FsY3VsYXRlQWNjV2lkdGhBbmRIZWlnaHQoZVVJVHlwZSwgZldpZHRoLCBmSGVpZ2h0KTsNCisgICAgfQ0KKyAgICBpTGluZXNDb3VudCA9DQorICAgICAgICAoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dE91dC0+R2V0VG90YWxMaW5lcygpOw0KKyAgfQ0KKyAgaWYgKCEoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRmllbGRTcGxpdEFycmF5KSB7DQorICAgICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BGaWVsZFNwbGl0QXJyYXkgPQ0KKyAgICAgICAgRlhfTkVXIENGWF9GbG9hdEFycmF5Ow0KKyAgfQ0KKyAgQ0ZYX0Zsb2F0QXJyYXkqIHBGaWVsZEFycmF5ID0NCisgICAgICAoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRmllbGRTcGxpdEFycmF5Ow0KKyAgaW50MzJfdCBpRmllbGRTcGxpdENvdW50ID0gcEZpZWxkQXJyYXktPkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlCbG9ja0luZGV4ICogMzsgaSArPSAzKSB7DQorICAgIGlMaW5lc0NvdW50IC09IChpbnQzMl90KXBGaWVsZEFycmF5LT5HZXRBdChpICsgMSk7DQorICAgIGZIZWlnaHQgLT0gcEZpZWxkQXJyYXktPkdldEF0KGkgKyAyKTsNCisgIH0NCisgIGlmIChpTGluZXNDb3VudCA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0ID0gR2V0TGluZUhlaWdodCgpOw0KKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsNCisgIEZYX0ZMT0FUIGZUZXh0SGVpZ2h0ID0gaUxpbmVzQ291bnQgKiBmTGluZUhlaWdodCAtIGZMaW5lSGVpZ2h0ICsgZkZvbnRTaXplOw0KKyAgRlhfRkxPQVQgZlNwYWNlQWJvdmUgPSAwOw0KKyAgRlhfRkxPQVQgZlN0YXJ0T2Zmc2V0ID0gMDsNCisgIGlmIChmSGVpZ2h0ID4gMC4xZiAmJiBpQmxvY2tJbmRleCA9PSAwKSB7DQorICAgIGZTdGFydE9mZnNldCA9IGZUb3BJbnNldDsNCisgICAgZkhlaWdodCAtPSAoZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0KTsNCisgICAgaWYgKENYRkFfUGFyYSBwYXJhID0gdGhpcy0+R2V0UGFyYSgpKSB7DQorICAgICAgZlNwYWNlQWJvdmUgPSBwYXJhLkdldFNwYWNlQWJvdmUoKTsNCisgICAgICBGWF9GTE9BVCBmU3BhY2VCZWxvdyA9IHBhcmEuR2V0U3BhY2VCZWxvdygpOw0KKyAgICAgIGZIZWlnaHQgLT0gKGZTcGFjZUFib3ZlICsgZlNwYWNlQmVsb3cpOw0KKyAgICAgIHN3aXRjaCAocGFyYS5HZXRWZXJ0aWNhbEFsaWduKCkpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wOg0KKyAgICAgICAgICBmU3RhcnRPZmZzZXQgKz0gZlNwYWNlQWJvdmU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQorICAgICAgICAgIGZTdGFydE9mZnNldCArPSAoKGZIZWlnaHQgLSBmVGV4dEhlaWdodCkgLyAyICsgZlNwYWNlQWJvdmUpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOg0KKyAgICAgICAgICBmU3RhcnRPZmZzZXQgKz0gKGZIZWlnaHQgLSBmVGV4dEhlaWdodCArIGZTcGFjZUFib3ZlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChmU3RhcnRPZmZzZXQgPCAwLjFmKSB7DQorICAgICAgZlN0YXJ0T2Zmc2V0ID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSBpQmxvY2tJbmRleCAtIDE7IGlCbG9ja0luZGV4ID4gMCAmJiBpIDwgaUJsb2NrSW5kZXg7IGkrKykgew0KKyAgICBmU3RhcnRPZmZzZXQgPSBwRmllbGRBcnJheS0+R2V0QXQoaSAqIDMpIC0gcEZpZWxkQXJyYXktPkdldEF0KGkgKiAzICsgMik7DQorICAgIGlmIChmU3RhcnRPZmZzZXQgPCAwLjFmKSB7DQorICAgICAgZlN0YXJ0T2Zmc2V0ID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7DQorICAgIHBGaWVsZEFycmF5LT5TZXRBdCgwLCBmU3RhcnRPZmZzZXQpOw0KKyAgfSBlbHNlIHsNCisgICAgcEZpZWxkQXJyYXktPkFkZChmU3RhcnRPZmZzZXQpOw0KKyAgfQ0KKyAgWEZBX1ZFUlNJT04gdmVyc2lvbiA9IEdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCisgIEZYX0JPT0wgYkNhblNwbGl0Tm9Db250ZW50ID0gRkFMU0U7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0TW9kZTsNCisgIHRoaXMtPkdldE5vZGUoKQ0KKyAgICAgIC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkNCisgICAgICAtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQsIGVMYXlvdXRNb2RlLCBUUlVFKTsNCisgIGlmICgoZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24gfHwNCisgICAgICAgZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGIgfHwNCisgICAgICAgZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm93IHx8DQorICAgICAgIGVMYXlvdXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlKSAmJg0KKyAgICAgIHZlcnNpb24gPiBYRkFfVkVSU0lPTl8yMDgpIHsNCisgICAgYkNhblNwbGl0Tm9Db250ZW50ID0gVFJVRTsNCisgIH0NCisgIGlmICgoZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGIgfHwNCisgICAgICAgZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm93IHx8DQorICAgICAgIGVMYXlvdXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlKSAmJg0KKyAgICAgIHZlcnNpb24gPD0gWEZBX1ZFUlNJT05fMjA4KSB7DQorICAgIGlmIChmU3RhcnRPZmZzZXQgPCBmQ2FsY0hlaWdodCkgew0KKyAgICAgIGJDYW5TcGxpdE5vQ29udGVudCA9IFRSVUU7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BMYXlvdXREYXRhID0gRlhfTkVXIENYRkFfV2lkZ2V0TGF5b3V0RGF0YTsNCisgICAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi19DQotdm9pZCBDWEZBX1dpZGdldEFjYzo6U3RhcnRUZXh0TGF5b3V0KEZYX0ZMT0FUJiBmQ2FsY1dpZHRoLCBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpDQotew0KLSAgICBMb2FkVGV4dCgpOw0KLSAgICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gKChDWEZBX1RleHRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dExheW91dDsNCi0gICAgRlhfRkxPQVQgZlRleHRIZWlnaHQgPSAwOw0KLSAgICBpZiAoZkNhbGNXaWR0aCA+IDAgJiYgZkNhbGNIZWlnaHQgPiAwKSB7DQotICAgICAgICBGWF9GTE9BVCBmV2lkdGggPSBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oZkNhbGNXaWR0aCk7DQotICAgICAgICBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoZldpZHRoKTsNCi0gICAgICAgIGZUZXh0SGVpZ2h0ID0gZkNhbGNIZWlnaHQ7DQotICAgICAgICBmVGV4dEhlaWdodCA9IEdldEhlaWdodFdpdGhvdXRNYXJnaW4oZlRleHRIZWlnaHQpOw0KLSAgICAgICAgcFRleHRMYXlvdXQtPkRvTGF5b3V0KDAsIGZUZXh0SGVpZ2h0LCAtMSwgZlRleHRIZWlnaHQpOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGJDYW5TcGxpdE5vQ29udGVudCkgew0KKyAgICBpZiAoKGZDYWxjSGVpZ2h0IC0gZlRvcEluc2V0IC0gZlNwYWNlQWJvdmUgPCBmTGluZUhlaWdodCkpIHsNCisgICAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi0gICAgaWYgKGZDYWxjV2lkdGggPiAwICYmIGZDYWxjSGVpZ2h0IDwgMCkgew0KLSAgICAgICAgRlhfRkxPQVQgZldpZHRoID0gR2V0V2lkdGhXaXRob3V0TWFyZ2luKGZDYWxjV2lkdGgpOw0KLSAgICAgICAgcFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KGZXaWR0aCk7DQorICAgIGlmIChmU3RhcnRPZmZzZXQgKyBYRkFfRkxPQVRfUEVSQ0lTSU9OID49IGZDYWxjSGVpZ2h0KSB7DQorICAgICAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7DQorICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMSwgMCk7DQorICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMiwgZkNhbGNIZWlnaHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwRmllbGRBcnJheS0+QWRkKDApOw0KKyAgICAgICAgcEZpZWxkQXJyYXktPkFkZChmQ2FsY0hlaWdodCk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBpZiAoZkNhbGNXaWR0aCA8IDAgJiYgZkNhbGNIZWlnaHQgPCAwKSB7DQotICAgICAgICBGWF9GTE9BVCBmTWF4V2lkdGggPSAtMTsNCi0gICAgICAgIEZYX0JPT0wgYlJldCA9IEdldFdpZHRoKGZNYXhXaWR0aCk7DQotICAgICAgICBpZiAoYlJldCkgew0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IEdldFdpZHRoV2l0aG91dE1hcmdpbihmTWF4V2lkdGgpOw0KLSAgICAgICAgICAgIHBUZXh0TGF5b3V0LT5TdGFydExheW91dChmV2lkdGgpOw0KKyAgICBpZiAoZkNhbGNIZWlnaHQgLSBmU3RhcnRPZmZzZXQgPCBmTGluZUhlaWdodCkgew0KKyAgICAgIGZDYWxjSGVpZ2h0ID0gZlN0YXJ0T2Zmc2V0Ow0KKyAgICAgIGlmIChpRmllbGRTcGxpdENvdW50IC8gMyA9PSAoaUJsb2NrSW5kZXggKyAxKSkgew0KKyAgICAgICAgcEZpZWxkQXJyYXktPlNldEF0KGlCbG9ja0luZGV4ICogMyArIDEsIDApOw0KKyAgICAgICAgcEZpZWxkQXJyYXktPlNldEF0KGlCbG9ja0luZGV4ICogMyArIDIsIGZDYWxjSGVpZ2h0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcEZpZWxkQXJyYXktPkFkZCgwKTsNCisgICAgICAgIHBGaWVsZEFycmF5LT5BZGQoZkNhbGNIZWlnaHQpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmVGV4dE51bSA9DQorICAgICAgICBmQ2FsY0hlaWdodCArIFhGQV9GTE9BVF9QRVJDSVNJT04gLSBmQ2FwUmVzZXJ2ZSAtIGZTdGFydE9mZnNldDsNCisgICAgaW50MzJfdCBpTGluZU51bSA9DQorICAgICAgICAoaW50MzJfdCkoKGZUZXh0TnVtICsgKGZMaW5lSGVpZ2h0IC0gZkZvbnRTaXplKSkgLyBmTGluZUhlaWdodCk7DQorICAgIGlmIChpTGluZU51bSA+PSBpTGluZXNDb3VudCkgew0KKyAgICAgIGlmIChmQ2FsY0hlaWdodCAtIGZTdGFydE9mZnNldCAtIGZUZXh0SGVpZ2h0ID49IGZGb250U2l6ZSkgew0KKyAgICAgICAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7DQorICAgICAgICAgIHBGaWVsZEFycmF5LT5TZXRBdChpQmxvY2tJbmRleCAqIDMgKyAxLCAoRlhfRkxPQVQpaUxpbmVzQ291bnQpOw0KKyAgICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMiwgZkNhbGNIZWlnaHQpOw0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGggPSBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoZk1heFdpZHRoKTsNCi0gICAgICAgICAgICBmTWF4V2lkdGggPSBDYWxjdWxhdGVXaWRnZXRBdXRvV2lkdGgoZldpZHRoKTsNCi0gICAgICAgICAgICBmV2lkdGggPSBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oZk1heFdpZHRoKTsNCi0gICAgICAgICAgICBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoZldpZHRoKTsNCisgICAgICAgICAgcEZpZWxkQXJyYXktPkFkZCgoRlhfRkxPQVQpaUxpbmVzQ291bnQpOw0KKyAgICAgICAgICBwRmllbGRBcnJheS0+QWRkKGZDYWxjSGVpZ2h0KTsNCiAgICAgICAgIH0NCi0gICAgICAgIGZDYWxjV2lkdGggPSBmTWF4V2lkdGg7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmIChmSGVpZ2h0IC0gZlN0YXJ0T2Zmc2V0IC0gZlRleHRIZWlnaHQgPCBmRm9udFNpemUpIHsNCisgICAgICAgIGlMaW5lTnVtIC09IDE7DQorICAgICAgICBpZiAoaUxpbmVOdW0gPT0gMCkgew0KKyAgICAgICAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpTGluZU51bSA9IChpbnQzMl90KShmVGV4dE51bSAvIGZMaW5lSGVpZ2h0KTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA8IDApIHsNCi0gICAgICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IHBUZXh0TGF5b3V0LT5HZXRMYXlvdXRIZWlnaHQoKTsNCi0gICAgICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IENhbGN1bGF0ZVdpZGdldEF1dG9IZWlnaHQobV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0KTsNCisgICAgaWYgKGlMaW5lTnVtID4gMCkgew0KKyAgICAgIEZYX0ZMT0FUIGZTcGxpdEhlaWdodCA9DQorICAgICAgICAgIGlMaW5lTnVtICogZkxpbmVIZWlnaHQgKyBmQ2FwUmVzZXJ2ZSArIGZTdGFydE9mZnNldDsNCisgICAgICBpZiAoaUZpZWxkU3BsaXRDb3VudCAvIDMgPT0gKGlCbG9ja0luZGV4ICsgMSkpIHsNCisgICAgICAgIHBGaWVsZEFycmF5LT5TZXRBdChpQmxvY2tJbmRleCAqIDMgKyAxLCAoRlhfRkxPQVQpaUxpbmVOdW0pOw0KKyAgICAgICAgcEZpZWxkQXJyYXktPlNldEF0KGlCbG9ja0luZGV4ICogMyArIDIsIGZTcGxpdEhlaWdodCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBGaWVsZEFycmF5LT5BZGQoKEZYX0ZMT0FUKWlMaW5lTnVtKTsNCisgICAgICAgIHBGaWVsZEFycmF5LT5BZGQoZlNwbGl0SGVpZ2h0KTsNCisgICAgICB9DQorICAgICAgaWYgKGZhYnMoZlNwbGl0SGVpZ2h0IC0gZkNhbGNIZWlnaHQpIDwgWEZBX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBmQ2FsY0hlaWdodCA9IGZTcGxpdEhlaWdodDsNCisgICAgICByZXR1cm4gVFJVRTsNCiAgICAgfQ0KLSAgICBmVGV4dEhlaWdodCA9IG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodDsNCisgIH0NCisgIGZDYWxjSGVpZ2h0ID0gMDsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpJbml0TGF5b3V0RGF0YSgpIHsNCisgIGlmIChtX3BMYXlvdXREYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHN3aXRjaCAoR2V0VUlUeXBlKCkpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0Og0KKyAgICAgIG1fcExheW91dERhdGEgPSBGWF9ORVcgQ1hGQV9UZXh0TGF5b3V0RGF0YTsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dEVkaXQ6DQorICAgICAgbV9wTGF5b3V0RGF0YSA9IEZYX05FVyBDWEZBX1RleHRFZGl0RGF0YTsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2U6DQorICAgICAgbV9wTGF5b3V0RGF0YSA9IEZYX05FVyBDWEZBX0ltYWdlTGF5b3V0RGF0YTsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0Og0KKyAgICAgIG1fcExheW91dERhdGEgPSBGWF9ORVcgQ1hGQV9JbWFnZUVkaXREYXRhOw0KKyAgICAgIHJldHVybjsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIGlmIChHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgbV9wTGF5b3V0RGF0YSA9IEZYX05FVyBDWEZBX0ZpZWxkTGF5b3V0RGF0YTsNCisgIH0gZWxzZSB7DQorICAgIG1fcExheW91dERhdGEgPSBGWF9ORVcgQ1hGQV9XaWRnZXRMYXlvdXREYXRhOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpTdGFydFRleHRMYXlvdXQoRlhfRkxPQVQmIGZDYWxjV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCkgew0KKyAgTG9hZFRleHQoKTsNCisgIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPQ0KKyAgICAgICgoQ1hGQV9UZXh0TGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcFRleHRMYXlvdXQ7DQorICBGWF9GTE9BVCBmVGV4dEhlaWdodCA9IDA7DQorICBpZiAoZkNhbGNXaWR0aCA+IDAgJiYgZkNhbGNIZWlnaHQgPiAwKSB7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IEdldFdpZHRoV2l0aG91dE1hcmdpbihmQ2FsY1dpZHRoKTsNCisgICAgcFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KGZXaWR0aCk7DQorICAgIGZUZXh0SGVpZ2h0ID0gZkNhbGNIZWlnaHQ7DQogICAgIGZUZXh0SGVpZ2h0ID0gR2V0SGVpZ2h0V2l0aG91dE1hcmdpbihmVGV4dEhlaWdodCk7DQogICAgIHBUZXh0TGF5b3V0LT5Eb0xheW91dCgwLCBmVGV4dEhlaWdodCwgLTEsIGZUZXh0SGVpZ2h0KTsNCi0gICAgZkNhbGNIZWlnaHQgPSBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQ7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkxvYWRDYXB0aW9uKCkNCi17DQotICAgIEluaXRMYXlvdXREYXRhKCk7DQotICAgIHJldHVybiAoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+TG9hZENhcHRpb24odGhpcyk7DQotfQ0KLUNYRkFfVGV4dExheW91dCogQ1hGQV9XaWRnZXRBY2M6OkdldENhcHRpb25UZXh0TGF5b3V0KCkNCi17DQotICAgIHJldHVybiBtX3BMYXlvdXREYXRhID8gKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcENhcFRleHRMYXlvdXQgOiBOVUxMOw0KLX0NCi1DWEZBX1RleHRMYXlvdXQqIENYRkFfV2lkZ2V0QWNjOjpHZXRUZXh0TGF5b3V0KCkNCi17DQotICAgIHJldHVybiBtX3BMYXlvdXREYXRhID8gKChDWEZBX1RleHRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dExheW91dCA6IE5VTEw7DQotfQ0KLUNGWF9ESUJpdG1hcCogQ1hGQV9XaWRnZXRBY2M6OkdldEltYWdlSW1hZ2UoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcExheW91dERhdGEgPyAoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgOiBOVUxMOw0KLX0NCi1DRlhfRElCaXRtYXAqIENYRkFfV2lkZ2V0QWNjOjpHZXRJbWFnZUVkaXRJbWFnZSgpDQotew0KLSAgICByZXR1cm4gbV9wTGF5b3V0RGF0YSA/ICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgOiBOVUxMOw0KLX0NCi12b2lkIENYRkFfV2lkZ2V0QWNjOjpTZXRJbWFnZUltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpDQotew0KLSAgICBpZigoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgPT0gbmV3SW1hZ2UpIHsNCi0gICAgICAgIHJldHVybjsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGZDYWxjV2lkdGggPiAwICYmIGZDYWxjSGVpZ2h0IDwgMCkgew0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oZkNhbGNXaWR0aCk7DQorICAgIHBUZXh0TGF5b3V0LT5TdGFydExheW91dChmV2lkdGgpOw0KKyAgfQ0KKyAgaWYgKGZDYWxjV2lkdGggPCAwICYmIGZDYWxjSGVpZ2h0IDwgMCkgew0KKyAgICBGWF9GTE9BVCBmTWF4V2lkdGggPSAtMTsNCisgICAgRlhfQk9PTCBiUmV0ID0gR2V0V2lkdGgoZk1heFdpZHRoKTsNCisgICAgaWYgKGJSZXQpIHsNCisgICAgICBGWF9GTE9BVCBmV2lkdGggPSBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oZk1heFdpZHRoKTsNCisgICAgICBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoZldpZHRoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9GTE9BVCBmV2lkdGggPSBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoZk1heFdpZHRoKTsNCisgICAgICBmTWF4V2lkdGggPSBDYWxjdWxhdGVXaWRnZXRBdXRvV2lkdGgoZldpZHRoKTsNCisgICAgICBmV2lkdGggPSBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oZk1heFdpZHRoKTsNCisgICAgICBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoZldpZHRoKTsNCiAgICAgfQ0KLSAgICBpZigoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgJiYgISgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX2JOYW1lZEltYWdlKSB7DQotICAgICAgICBkZWxldGUgKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwOw0KLSAgICAgICAgKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwID0gTlVMTDsNCi0gICAgfQ0KLSAgICAoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgPSBuZXdJbWFnZTsNCisgICAgZkNhbGNXaWR0aCA9IGZNYXhXaWR0aDsNCisgIH0NCisgIGlmIChtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPCAwKSB7DQorICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IHBUZXh0TGF5b3V0LT5HZXRMYXlvdXRIZWlnaHQoKTsNCisgICAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0NCisgICAgICAgIENhbGN1bGF0ZVdpZGdldEF1dG9IZWlnaHQobV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0KTsNCisgIH0NCisgIGZUZXh0SGVpZ2h0ID0gbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0Ow0KKyAgZlRleHRIZWlnaHQgPSBHZXRIZWlnaHRXaXRob3V0TWFyZ2luKGZUZXh0SGVpZ2h0KTsNCisgIHBUZXh0TGF5b3V0LT5Eb0xheW91dCgwLCBmVGV4dEhlaWdodCwgLTEsIGZUZXh0SGVpZ2h0KTsNCisgIGZDYWxjSGVpZ2h0ID0gbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0Ow0KIH0NCi12b2lkIENYRkFfV2lkZ2V0QWNjOjpTZXRJbWFnZUVkaXRJbWFnZShDRlhfRElCaXRtYXAqIG5ld0ltYWdlKQ0KLXsNCi0gICAgaWYoKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcCA9PSBuZXdJbWFnZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmKCgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgJiYgISgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9iTmFtZWRJbWFnZSkgew0KLSAgICAgICAgZGVsZXRlICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXA7DQotICAgICAgICAoKENYRkFfSW1hZ2VFZGl0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwID0gTlVMTDsNCi0gICAgfQ0KLSAgICAoKENYRkFfSW1hZ2VFZGl0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwID0gbmV3SW1hZ2U7DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6TG9hZENhcHRpb24oKSB7DQorICBJbml0TGF5b3V0RGF0YSgpOw0KKyAgcmV0dXJuICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5Mb2FkQ2FwdGlvbih0aGlzKTsNCiB9DQotQ1hGQV9XaWRnZXRMYXlvdXREYXRhKiBDWEZBX1dpZGdldEFjYzo6R2V0V2lkZ2V0TGF5b3V0RGF0YSgpDQotew0KLSAgICByZXR1cm4gbV9wTGF5b3V0RGF0YTsNCitDWEZBX1RleHRMYXlvdXQqIENYRkFfV2lkZ2V0QWNjOjpHZXRDYXB0aW9uVGV4dExheW91dCgpIHsNCisgIHJldHVybiBtX3BMYXlvdXREYXRhDQorICAgICAgICAgICAgID8gKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcENhcFRleHRMYXlvdXQNCisgICAgICAgICAgICAgOiBOVUxMOw0KIH0NCi1JRlhfRm9udCogQ1hGQV9XaWRnZXRBY2M6OkdldEZERUZvbnQoKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzRm9udE5hbWUgPSBGWF9XU1RSQyhMIkNvdXJpZXIiKTsNCi0gICAgRlhfRFdPUkQgZHdGb250U3R5bGUgPSAwOw0KLSAgICBpZiAoQ1hGQV9Gb250IGZvbnQgPSB0aGlzLT5HZXRGb250KCkpIHsNCi0gICAgICAgIGlmIChmb250LklzQm9sZCgpKSB7DQotICAgICAgICAgICAgZHdGb250U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0JvbGQ7DQorQ1hGQV9UZXh0TGF5b3V0KiBDWEZBX1dpZGdldEFjYzo6R2V0VGV4dExheW91dCgpIHsNCisgIHJldHVybiBtX3BMYXlvdXREYXRhID8gKChDWEZBX1RleHRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dExheW91dA0KKyAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitDRlhfRElCaXRtYXAqIENYRkFfV2lkZ2V0QWNjOjpHZXRJbWFnZUltYWdlKCkgew0KKyAgcmV0dXJuIG1fcExheW91dERhdGEgPyAoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXANCisgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsNCit9DQorQ0ZYX0RJQml0bWFwKiBDWEZBX1dpZGdldEFjYzo6R2V0SW1hZ2VFZGl0SW1hZ2UoKSB7DQorICByZXR1cm4gbV9wTGF5b3V0RGF0YSA/ICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXANCisgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6U2V0SW1hZ2VJbWFnZShDRlhfRElCaXRtYXAqIG5ld0ltYWdlKSB7DQorICBpZiAoKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwID09IG5ld0ltYWdlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmICgoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgJiYNCisgICAgICAhKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fYk5hbWVkSW1hZ2UpIHsNCisgICAgZGVsZXRlICgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcDsNCisgICAgKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwID0gTlVMTDsNCisgIH0NCisgICgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcCA9IG5ld0ltYWdlOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpTZXRJbWFnZUVkaXRJbWFnZShDRlhfRElCaXRtYXAqIG5ld0ltYWdlKSB7DQorICBpZiAoKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcCA9PSBuZXdJbWFnZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcCAmJg0KKyAgICAgICEoKENYRkFfSW1hZ2VFZGl0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fYk5hbWVkSW1hZ2UpIHsNCisgICAgZGVsZXRlICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXA7DQorICAgICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgPSBOVUxMOw0KKyAgfQ0KKyAgKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcCA9IG5ld0ltYWdlOw0KK30NCitDWEZBX1dpZGdldExheW91dERhdGEqIENYRkFfV2lkZ2V0QWNjOjpHZXRXaWRnZXRMYXlvdXREYXRhKCkgew0KKyAgcmV0dXJuIG1fcExheW91dERhdGE7DQorfQ0KK0lGWF9Gb250KiBDWEZBX1dpZGdldEFjYzo6R2V0RkRFRm9udCgpIHsNCisgIENGWF9XaWRlU3RyaW5nQyB3c0ZvbnROYW1lID0gRlhfV1NUUkMoTCJDb3VyaWVyIik7DQorICBGWF9EV09SRCBkd0ZvbnRTdHlsZSA9IDA7DQorICBpZiAoQ1hGQV9Gb250IGZvbnQgPSB0aGlzLT5HZXRGb250KCkpIHsNCisgICAgaWYgKGZvbnQuSXNCb2xkKCkpIHsNCisgICAgICBkd0ZvbnRTdHlsZSB8PSBGWF9GT05UU1RZTEVfQm9sZDsNCisgICAgfQ0KKyAgICBpZiAoZm9udC5Jc0l0YWxpYygpKSB7DQorICAgICAgZHdGb250U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCisgICAgfQ0KKyAgICBmb250LkdldFR5cGVmYWNlKHdzRm9udE5hbWUpOw0KKyAgfQ0KKyAgQ1hGQV9GRkRvYyogcERvYyA9IEdldERvYygpOw0KKyAgcmV0dXJuIHBEb2MtPkdldEFwcCgpLT5HZXRYRkFGb250TWdyKCktPkdldEZvbnQocERvYywgd3NGb250TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Rm9udFN0eWxlKTsNCit9DQorRlhfRkxPQVQgQ1hGQV9XaWRnZXRBY2M6OkdldEZvbnRTaXplKCkgew0KKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gMTAuMGY7DQorICBpZiAoQ1hGQV9Gb250IGZvbnQgPSB0aGlzLT5HZXRGb250KCkpIHsNCisgICAgZkZvbnRTaXplID0gZm9udC5HZXRGb250U2l6ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIGZGb250U2l6ZSA8IDAuMWYgPyAxMC4wZiA6IGZGb250U2l6ZTsNCit9DQorRlhfRkxPQVQgQ1hGQV9XaWRnZXRBY2M6OkdldExpbmVIZWlnaHQoKSB7DQorICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IDA7DQorICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSB0aGlzLT5HZXRQYXJhKCkpIHsNCisgICAgZkxpbmVIZWlnaHQgPSBwYXJhLkdldExpbmVIZWlnaHQoKTsNCisgIH0NCisgIGlmIChmTGluZUhlaWdodCA8IDEpIHsNCisgICAgZkxpbmVIZWlnaHQgPSBHZXRGb250U2l6ZSgpICogMS4yZjsNCisgIH0NCisgIHJldHVybiBmTGluZUhlaWdodDsNCit9DQorRlhfQVJHQiBDWEZBX1dpZGdldEFjYzo6R2V0VGV4dENvbG9yKCkgew0KKyAgaWYgKENYRkFfRm9udCBmb250ID0gdGhpcy0+R2V0Rm9udCgpKSB7DQorICAgIHJldHVybiBmb250LkdldENvbG9yKCk7DQorICB9DQorICByZXR1cm4gMHhGRjAwMDAwMDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1RleHRQcm92aWRlcjo6R2V0VGV4dE5vZGUoRlhfQk9PTCYgYlJpY2hUZXh0KSB7DQorICBiUmljaFRleHQgPSBGQUxTRTsNCisgIGlmIChtX3BUZXh0Tm9kZSkgew0KKyAgICBpZiAobV9wVGV4dE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGEpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgIG1fcFRleHROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsNCisgICAgICBpZiAod3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQvaHRtbCIpKSkgew0KKyAgICAgICAgYlJpY2hUZXh0ID0gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIG1fcFRleHROb2RlOw0KKyAgfQ0KKyAgaWYgKG1fZVR5cGUgPT0gWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCkgew0KKyAgICBDWEZBX05vZGUqIHBFbGVtZW50Tm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpOw0KKyAgICBDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPSBwRWxlbWVudE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCisgICAgaWYgKCFwVmFsdWVOb2RlKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpZiAocENoaWxkTm9kZSAmJiBwQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCisgICAgICBwQ2hpbGROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgRkFMU0UpOw0KKyAgICAgIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQorICAgICAgICBiUmljaFRleHQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcENoaWxkTm9kZTsNCisgIH0gZWxzZSBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9EYXRhc2V0cykgew0KKyAgICBDWEZBX05vZGUqIHBCaW5kID0gbV9wV2lkZ2V0QWNjLT5HZXREYXRhc2V0cygpOw0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gcEJpbmQtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgIEZYU1lTX2Fzc2VydChwWE1MTm9kZSk7DQorICAgIGZvciAoSUZERV9YTUxOb2RlKiBwWE1MQ2hpbGQgPQ0KKyAgICAgICAgICAgICBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgICBwWE1MQ2hpbGQ7DQorICAgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICAgIGlmIChwWE1MQ2hpbGQtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkOw0KKyAgICAgICAgaWYgKFhGQV9SZWNvZ25pemVSaWNoVGV4dChwRWxlbWVudCkpIHsNCisgICAgICAgICAgYlJpY2hUZXh0ID0gVFJVRTsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmIChmb250LklzSXRhbGljKCkpIHsNCi0gICAgICAgICAgICBkd0ZvbnRTdHlsZSB8PSBGWF9GT05UU1RZTEVfSXRhbGljOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9udC5HZXRUeXBlZmFjZSh3c0ZvbnROYW1lKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgQ1hGQV9GRkRvYyogcERvYyA9IEdldERvYygpOw0KLSAgICByZXR1cm4gcERvYy0+R2V0QXBwKCktPkdldFhGQUZvbnRNZ3IoKS0+R2V0Rm9udChwRG9jLCB3c0ZvbnROYW1lLCBkd0ZvbnRTdHlsZSk7DQotfQ0KLUZYX0ZMT0FUIENYRkFfV2lkZ2V0QWNjOjpHZXRGb250U2l6ZSgpDQotew0KLSAgICBGWF9GTE9BVCBmRm9udFNpemUgPSAxMC4wZjsNCi0gICAgaWYgKENYRkFfRm9udCBmb250ID0gdGhpcy0+R2V0Rm9udCgpKSB7DQotICAgICAgICBmRm9udFNpemUgPSBmb250LkdldEZvbnRTaXplKCk7DQorICAgIHJldHVybiBwQmluZDsNCisgIH0gZWxzZSBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9DYXB0aW9uKSB7DQorICAgIENYRkFfTm9kZSogcENhcHRpb25Ob2RlID0NCisgICAgICAgIG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9DYXB0aW9uKTsNCisgICAgaWYgKHBDYXB0aW9uTm9kZSA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQogICAgIH0NCi0gICAgcmV0dXJuIGZGb250U2l6ZSA8IDAuMWYgPyAxMC4wZiA6IGZGb250U2l6ZTsNCi19DQotRlhfRkxPQVQgQ1hGQV9XaWRnZXRBY2M6OkdldExpbmVIZWlnaHQoKQ0KLXsNCi0gICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSAwOw0KLSAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSB0aGlzLT5HZXRQYXJhKCkpIHsNCi0gICAgICAgIGZMaW5lSGVpZ2h0ID0gcGFyYS5HZXRMaW5lSGVpZ2h0KCk7DQorICAgIENYRkFfTm9kZSogcFZhbHVlTm9kZSA9IHBDYXB0aW9uTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KKyAgICBpZiAocFZhbHVlTm9kZSA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQogICAgIH0NCi0gICAgaWYgKGZMaW5lSGVpZ2h0IDwgMSkgew0KLSAgICAgICAgZkxpbmVIZWlnaHQgPSBHZXRGb250U2l6ZSgpICogMS4yZjsNCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpZiAocENoaWxkTm9kZSAmJiBwQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCisgICAgICBwQ2hpbGROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgRkFMU0UpOw0KKyAgICAgIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQorICAgICAgICBiUmljaFRleHQgPSBUUlVFOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gZkxpbmVIZWlnaHQ7DQotfQ0KLUZYX0FSR0IgQ1hGQV9XaWRnZXRBY2M6OkdldFRleHRDb2xvcigpDQotew0KLSAgICBpZiAoQ1hGQV9Gb250IGZvbnQgPSB0aGlzLT5HZXRGb250KCkpIHsNCi0gICAgICAgIHJldHVybiBmb250LkdldENvbG9yKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIDB4RkYwMDAwMDA7DQotfQ0KLUNYRkFfTm9kZSogQ1hGQV9UZXh0UHJvdmlkZXI6OkdldFRleHROb2RlKEZYX0JPT0wgJmJSaWNoVGV4dCkNCi17DQotICAgIGJSaWNoVGV4dCA9IEZBTFNFOw0KLSAgICBpZiAobV9wVGV4dE5vZGUpIHsNCi0gICAgICAgIGlmIChtX3BUZXh0Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQotICAgICAgICAgICAgbV9wVGV4dE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBGQUxTRSk7DQotICAgICAgICAgICAgaWYgKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L2h0bWwiKSkpIHsNCi0gICAgICAgICAgICAgICAgYlJpY2hUZXh0ID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbV9wVGV4dE5vZGU7DQotICAgIH0NCi0gICAgaWYgKG1fZVR5cGUgPT0gWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwRWxlbWVudE5vZGUgPSBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKTsNCi0gICAgICAgIENYRkFfTm9kZSAqcFZhbHVlTm9kZSA9IHBFbGVtZW50Tm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KLSAgICAgICAgaWYgKCFwVmFsdWVOb2RlKSB7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX05vZGUgKnBDaGlsZE5vZGUgPSBwVmFsdWVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICBpZiAocENoaWxkTm9kZSAmJiBwQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCi0gICAgICAgICAgICBwQ2hpbGROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgRkFMU0UpOw0KLSAgICAgICAgICAgIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQotICAgICAgICAgICAgICAgIGJSaWNoVGV4dCA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHBDaGlsZE5vZGU7DQotICAgIH0gZWxzZSBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9EYXRhc2V0cykgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwQmluZCA9IG1fcFdpZGdldEFjYy0+R2V0RGF0YXNldHMoKTsNCi0gICAgICAgIElGREVfWE1MTm9kZSAqcFhNTE5vZGUgPSBwQmluZC0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwWE1MTm9kZSk7DQotICAgICAgICBmb3IoSUZERV9YTUxOb2RlICpwWE1MQ2hpbGQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcFhNTENoaWxkOyBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgaWYgKHBYTUxDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgSUZERV9YTUxFbGVtZW50ICpwRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQgKilwWE1MQ2hpbGQ7DQotICAgICAgICAgICAgICAgIGlmKFhGQV9SZWNvZ25pemVSaWNoVGV4dChwRWxlbWVudCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJSaWNoVGV4dCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcEJpbmQ7DQotICAgIH0gZWxzZSBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9DYXB0aW9uKSB7DQotICAgICAgICBDWEZBX05vZGUgKnBDYXB0aW9uTm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9DYXB0aW9uKTsNCi0gICAgICAgIGlmIChwQ2FwdGlvbk5vZGUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9Ob2RlICpwVmFsdWVOb2RlID0gcENhcHRpb25Ob2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQotICAgICAgICBpZiAocFZhbHVlTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX05vZGUgKnBDaGlsZE5vZGUgPSBwVmFsdWVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICBpZiAocENoaWxkTm9kZSAmJiBwQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCi0gICAgICAgICAgICBwQ2hpbGROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgRkFMU0UpOw0KLSAgICAgICAgICAgIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQotICAgICAgICAgICAgICAgIGJSaWNoVGV4dCA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHBDaGlsZE5vZGU7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlICpwSXRlbU5vZGUgPSBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpOw0KLSAgICBpZiAocEl0ZW1Ob2RlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBwSXRlbU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgd2hpbGUocE5vZGUpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWU7DQotICAgICAgICBwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KLSAgICAgICAgaWYgKG1fZVR5cGUgPT0gWEZBX1RFWFRQUk9WSURFUlRZUEVfUm9sbG92ZXIgJiYgd3NOYW1lID09IEZYX1dTVFJDKEwicm9sbG92ZXIiKSkgew0KLSAgICAgICAgICAgIHJldHVybiBwTm9kZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX0Rvd24gJiYgd3NOYW1lID09IEZYX1dTVFJDKEwiZG93biIpKSB7DQotICAgICAgICAgICAgcmV0dXJuIHBOb2RlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgfQ0KKyAgICByZXR1cm4gcENoaWxkTm9kZTsNCisgIH0NCisgIENYRkFfTm9kZSogcEl0ZW1Ob2RlID0NCisgICAgICBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpOw0KKyAgaWYgKHBJdGVtTm9kZSA9PSBOVUxMKSB7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJdGVtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgd2hpbGUgKHBOb2RlKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWU7DQorICAgIHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICAgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX1JvbGxvdmVyICYmDQorICAgICAgICB3c05hbWUgPT0gRlhfV1NUUkMoTCJyb2xsb3ZlciIpKSB7DQorICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICB9DQorICAgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX0Rvd24gJiYgd3NOYW1lID09IEZYX1dTVFJDKEwiZG93biIpKSB7DQorICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICB9DQorICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotQ1hGQV9QYXJhIENYRkFfVGV4dFByb3ZpZGVyOjpHZXRQYXJhTm9kZSgpDQotew0KLSAgICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KSB7DQotICAgICAgICByZXR1cm4gbV9wV2lkZ2V0QWNjLT5HZXRQYXJhKCk7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlICpwTm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9DYXB0aW9uKTsNCi0gICAgcmV0dXJuIHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9QYXJhKTsNCitDWEZBX1BhcmEgQ1hGQV9UZXh0UHJvdmlkZXI6OkdldFBhcmFOb2RlKCkgew0KKyAgaWYgKG1fZVR5cGUgPT0gWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCkgew0KKyAgICByZXR1cm4gbV9wV2lkZ2V0QWNjLT5HZXRQYXJhKCk7DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wV2lkZ2V0QWNjLT5HZXROb2RlKCktPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0NhcHRpb24pOw0KKyAgcmV0dXJuIHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9QYXJhKTsNCiB9DQotQ1hGQV9Gb250IENYRkFfVGV4dFByb3ZpZGVyOjpHZXRGb250Tm9kZSgpDQotew0KLSAgICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KSB7DQotICAgICAgICByZXR1cm4gbV9wV2lkZ2V0QWNjLT5HZXRGb250KCk7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlICpwTm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9DYXB0aW9uKTsNCi0gICAgcE5vZGUgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRm9udCk7DQotICAgIGlmIChwTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIHBOb2RlOw0KLSAgICB9DQorQ1hGQV9Gb250IENYRkFfVGV4dFByb3ZpZGVyOjpHZXRGb250Tm9kZSgpIHsNCisgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX1RleHQpIHsNCiAgICAgcmV0dXJuIG1fcFdpZGdldEFjYy0+R2V0Rm9udCgpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9DYXB0aW9uKTsNCisgIHBOb2RlID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0ZvbnQpOw0KKyAgaWYgKHBOb2RlKSB7DQorICAgIHJldHVybiBwTm9kZTsNCisgIH0NCisgIHJldHVybiBtX3BXaWRnZXRBY2MtPkdldEZvbnQoKTsNCiB9DQotRlhfQk9PTAlDWEZBX1RleHRQcm92aWRlcjo6SXNDaGVja0J1dHRvbkFuZEF1dG9XaWR0aCgpDQotew0KLSAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IG1fcFdpZGdldEFjYy0+R2V0VUlUeXBlKCk7DQotICAgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbikgew0KLSAgICAgICAgRlhfRkxPQVQgZldpZHRoID0gMDsNCi0gICAgICAgIHJldHVybiAhbV9wV2lkZ2V0QWNjLT5HZXRXaWR0aChmV2lkdGgpOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfVGV4dFByb3ZpZGVyOjpJc0NoZWNrQnV0dG9uQW5kQXV0b1dpZHRoKCkgew0KKyAgWEZBX0VMRU1FTlQgZVR5cGUgPSBtX3BXaWRnZXRBY2MtPkdldFVJVHlwZSgpOw0KKyAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uKSB7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDA7DQorICAgIHJldHVybiAhbV9wV2lkZ2V0QWNjLT5HZXRXaWR0aChmV2lkdGgpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MIENYRkFfVGV4dFByb3ZpZGVyOjpHZXRFbWJiZWRPYmooRlhfQk9PTCBiVVJJLCBGWF9CT09MIGJSYXcsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHIsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKQ0KLXsNCi0gICAgaWYgKG1fZVR5cGUgIT0gWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmIChiVVJJKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBXaWRnZXROb2RlID0gbV9wV2lkZ2V0QWNjLT5HZXROb2RlKCk7DQotICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSBwV2lkZ2V0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwV2lkZ2V0Tm9kZS0+R2V0RG9jdW1lbnQoKTsNCi0gICAgICAgIENYRkFfTm9kZSogcElETm9kZSA9IE5VTEw7DQotICAgICAgICBDWEZBX1dpZGdldEFjYyogcEVtYkFjYyA9IE5VTEw7DQotICAgICAgICBpZiAocFBhcmVudCkgew0KLSAgICAgICAgICAgIHBJRE5vZGUgPSBwRG9jdW1lbnQtPkdldE5vZGVCeUlEKHBQYXJlbnQsIHdzQXR0cik7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIXBJRE5vZGUpIHsNCi0gICAgICAgICAgICBwSUROb2RlID0gcERvY3VtZW50LT5HZXROb2RlQnlJRCgoQ1hGQV9Ob2RlKilwRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pLCB3c0F0dHIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBJRE5vZGUpIHsNCi0gICAgICAgICAgICBwRW1iQWNjID0gKENYRkFfV2lkZ2V0QWNjKilwSUROb2RlLT5HZXRXaWRnZXREYXRhKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAocEVtYkFjYykgew0KLSAgICAgICAgICAgIHBFbWJBY2MtPkdldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCitGWF9CT09MIENYRkFfVGV4dFByb3ZpZGVyOjpHZXRFbWJiZWRPYmooRlhfQk9PTCBiVVJJLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSYXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSB7DQorICBpZiAobV9lVHlwZSAhPSBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KSB7DQogICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChiVVJJKSB7DQorICAgIENYRkFfTm9kZSogcFdpZGdldE5vZGUgPSBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKTsNCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gcFdpZGdldE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwV2lkZ2V0Tm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgICAgQ1hGQV9Ob2RlKiBwSUROb2RlID0gTlVMTDsNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBFbWJBY2MgPSBOVUxMOw0KKyAgICBpZiAocFBhcmVudCkgew0KKyAgICAgIHBJRE5vZGUgPSBwRG9jdW1lbnQtPkdldE5vZGVCeUlEKHBQYXJlbnQsIHdzQXR0cik7DQorICAgIH0NCisgICAgaWYgKCFwSUROb2RlKSB7DQorICAgICAgcElETm9kZSA9IHBEb2N1bWVudC0+R2V0Tm9kZUJ5SUQoDQorICAgICAgICAgIChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSksIHdzQXR0cik7DQorICAgIH0NCisgICAgaWYgKHBJRE5vZGUpIHsNCisgICAgICBwRW1iQWNjID0gKENYRkFfV2lkZ2V0QWNjKilwSUROb2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICAgIH0NCisgICAgaWYgKHBFbWJBY2MpIHsNCisgICAgICBwRW1iQWNjLT5HZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldGFjYy5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmgKaW5kZXggNmM2Y2NlYS4uMjY5ZmNjZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmgKQEAgLTgsMzMgKzgsMzQgQEAKICNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9XSURHRVRBQ0NfSU1QX0gNCiAjaW5jbHVkZSAieGZhX3RleHRsYXlvdXQuaCINCiBlbnVtIFhGQV9URVhUUFJPVklERVJUWVBFIHsNCi0gICAgWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCwNCi0gICAgWEZBX1RFWFRQUk9WSURFUlRZUEVfRGF0YXNldHMsDQotICAgIFhGQV9URVhUUFJPVklERVJUWVBFX0NhcHRpb24sDQotICAgIFhGQV9URVhUUFJPVklERVJUWVBFX1JvbGxvdmVyLA0KLSAgICBYRkFfVEVYVFBST1ZJREVSVFlQRV9Eb3duLA0KKyAgWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCwNCisgIFhGQV9URVhUUFJPVklERVJUWVBFX0RhdGFzZXRzLA0KKyAgWEZBX1RFWFRQUk9WSURFUlRZUEVfQ2FwdGlvbiwNCisgIFhGQV9URVhUUFJPVklERVJUWVBFX1JvbGxvdmVyLA0KKyAgWEZBX1RFWFRQUk9WSURFUlRZUEVfRG93biwNCiB9Ow0KLWNsYXNzIENYRkFfVGV4dFByb3ZpZGVyIDogcHVibGljIElYRkFfVGV4dFByb3ZpZGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9UZXh0UHJvdmlkZXIoQ1hGQV9XaWRnZXRBY2MgKnBXaWRnZXRBY2MsIFhGQV9URVhUUFJPVklERVJUWVBFIGVUeXBlLCBDWEZBX05vZGUqIHBUZXh0Tm9kZSA9IE5VTEwpDQotICAgICAgICA6IG1fcFdpZGdldEFjYyhwV2lkZ2V0QWNjKSwgbV9lVHlwZShlVHlwZSksIG1fcFRleHROb2RlKHBUZXh0Tm9kZSkNCi0gICAgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fcFdpZGdldEFjYyAhPSBOVUxMKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIH5DWEZBX1RleHRQcm92aWRlcigpIHt9DQotICAgIHZpcnR1YWwgQ1hGQV9Ob2RlKgkJR2V0VGV4dE5vZGUoRlhfQk9PTCAmYlJpY2hUZXh0KTsNCi0gICAgdmlydHVhbCBDWEZBX1BhcmEJCUdldFBhcmFOb2RlKCk7DQotICAgIHZpcnR1YWwgQ1hGQV9Gb250CQlHZXRGb250Tm9kZSgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0NoZWNrQnV0dG9uQW5kQXV0b1dpZHRoKCk7DQotICAgIHZpcnR1YWwgQ1hGQV9GRkRvYyoJCUdldERvY05vZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wV2lkZ2V0QWNjLT5HZXREb2MoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRFbWJiZWRPYmooRlhfQk9PTCBiVVJJLCBGWF9CT09MIGJSYXcsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0F0dHIsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENYRkFfV2lkZ2V0QWNjCQkJKm1fcFdpZGdldEFjYzsNCi0gICAgWEZBX1RFWFRQUk9WSURFUlRZUEUJbV9lVHlwZTsNCi0gICAgQ1hGQV9Ob2RlKgkJCQltX3BUZXh0Tm9kZTsNCitjbGFzcyBDWEZBX1RleHRQcm92aWRlciA6IHB1YmxpYyBJWEZBX1RleHRQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIENYRkFfVGV4dFByb3ZpZGVyKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX1RFWFRQUk9WSURFUlRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUZXh0Tm9kZSA9IE5VTEwpDQorICAgICAgOiBtX3BXaWRnZXRBY2MocFdpZGdldEFjYyksIG1fZVR5cGUoZVR5cGUpLCBtX3BUZXh0Tm9kZShwVGV4dE5vZGUpIHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcFdpZGdldEFjYyAhPSBOVUxMKTsNCisgIH0NCisgIHZpcnR1YWwgfkNYRkFfVGV4dFByb3ZpZGVyKCkge30NCisgIHZpcnR1YWwgQ1hGQV9Ob2RlKiBHZXRUZXh0Tm9kZShGWF9CT09MJiBiUmljaFRleHQpOw0KKyAgdmlydHVhbCBDWEZBX1BhcmEgR2V0UGFyYU5vZGUoKTsNCisgIHZpcnR1YWwgQ1hGQV9Gb250IEdldEZvbnROb2RlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNDaGVja0J1dHRvbkFuZEF1dG9XaWR0aCgpOw0KKyAgdmlydHVhbCBDWEZBX0ZGRG9jKiBHZXREb2NOb2RlKCkgeyByZXR1cm4gbV9wV2lkZ2V0QWNjLT5HZXREb2MoKTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEdldEVtYmJlZE9iaihGWF9CT09MIGJVUkksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJhdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX1dpZGdldEFjYyogbV9wV2lkZ2V0QWNjOw0KKyAgWEZBX1RFWFRQUk9WSURFUlRZUEUgbV9lVHlwZTsNCisgIENYRkFfTm9kZSogbV9wVGV4dE5vZGU7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldGhhbmRsZXIuY3BwCmluZGV4IDM0OGZlM2QuLmNlMmE5MWMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldGhhbmRsZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldGhhbmRsZXIuY3BwCkBAIC0xNCw1NzggKzE0LDYzMSBAQAogI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KICNpbmNsdWRlICJ4ZmFfZmZkb2N2aWV3LmgiDQogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNYRkFfRkZXaWRnZXRIYW5kbGVyKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldykNCi0gICAgOiBtX3BEb2NWaWV3KHBEb2NWaWV3KQ0KLXsNCisgICAgOiBtX3BEb2NWaWV3KHBEb2NWaWV3KSB7fQ0KK0NYRkFfRkZXaWRnZXRIYW5kbGVyOjp+Q1hGQV9GRldpZGdldEhhbmRsZXIoKSB7fQ0KK0lYRkFfUGFnZVZpZXcqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRQYWdlVmlldyhJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0UGFnZVZpZXcoKTsNCiB9DQotQ1hGQV9GRldpZGdldEhhbmRsZXI6On5DWEZBX0ZGV2lkZ2V0SGFuZGxlcigpDQotew0KK3ZvaWQgQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldFJlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9SZWN0RiYgcnQpIHsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0V2lkZ2V0UmVjdChydCk7DQogfQ0KLUlYRkFfUGFnZVZpZXcqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRQYWdlVmlldyhJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkdldFBhZ2VWaWV3KCk7DQorRlhfRFdPUkQgQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldFN0YXR1cyhJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0U3RhdHVzKCk7DQogfQ0KLXZvaWQgQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldFJlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9SZWN0RiAmcnQpDQotew0KLSAgICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkdldFdpZGdldFJlY3QocnQpOw0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldEJCb3goSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEcmF3Rm9jdXMpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCkNCisgICAgICAtPkdldEJCb3gocnRCb3gsIGR3U3RhdHVzLCBiRHJhd0ZvY3VzKTsNCiB9DQotRlhfRFdPUkQgQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldFN0YXR1cyhJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkdldFN0YXR1cygpOw0KK0NYRkFfV2lkZ2V0QWNjKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0RGF0YUFjYyhJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0RGF0YUFjYygpOw0KIH0NCi1GWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRCQm94KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0Qm94LCBGWF9EV09SRCBkd1N0YXR1cywgRlhfQk9PTCBiRHJhd0ZvY3VzKQ0KLXsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0QkJveChydEJveCwgZHdTdGF0dXMsIGJEcmF3Rm9jdXMpOw0KK3ZvaWQgQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldE5hbWUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTmFtZVR5cGUpIHsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0RGF0YUFjYygpLT5HZXROYW1lKHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlOYW1lVHlwZSk7DQogfQ0KLUNYRkFfV2lkZ2V0QWNjKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0RGF0YUFjYyhJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkdldERhdGFBY2MoKTsNCitGWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRUb29sVGlwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVG9vbFRpcCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0VG9vbFRpcCh3c1Rvb2xUaXApOw0KIH0NCi12b2lkIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXROYW1lKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NOYW1lLCBpbnQzMl90IGlOYW1lVHlwZSApDQotew0KLSAgICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkdldERhdGFBY2MoKS0+R2V0TmFtZSh3c05hbWUsIGlOYW1lVHlwZSk7DQordm9pZCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6U2V0UHJpdmF0ZURhdGEoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbW9kdWxlX2lkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKSB7DQorICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCkNCisgICAgICAtPlNldFByaXZhdGVEYXRhKG1vZHVsZV9pZCwgcERhdGEsIGNhbGxiYWNrKTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0VG9vbFRpcChJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzVG9vbFRpcCkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkdldFRvb2xUaXAod3NUb29sVGlwKTsNCit2b2lkKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0UHJpdmF0ZURhdGEoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG1vZHVsZV9pZCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkKTsNCiB9DQotdm9pZCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6U2V0UHJpdmF0ZURhdGEoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIHZvaWQqIG1vZHVsZV9pZCwgdm9pZCogcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKQ0KLXsNCi0gICAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5TZXRQcml2YXRlRGF0YShtb2R1bGVfaWQsIHBEYXRhLCBjYWxsYmFjayk7DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25Nb3VzZUVudGVyKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICBtX3BEb2NWaWV3LT5Mb2NrVXBkYXRlKCk7DQorICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uTW91c2VFbnRlcigpOw0KKyAgbV9wRG9jVmlldy0+VW5sb2NrVXBkYXRlKCk7DQorICBtX3BEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7DQorICByZXR1cm4gYlJldDsNCiB9DQotdm9pZCogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldFByaXZhdGVEYXRhKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCB2b2lkKiBtb2R1bGVfaWQpDQotew0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5HZXRQcml2YXRlRGF0YShtb2R1bGVfaWQpOw0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTW91c2VFeGl0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICBtX3BEb2NWaWV3LT5Mb2NrVXBkYXRlKCk7DQorICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uTW91c2VFeGl0KCk7DQorICBtX3BEb2NWaWV3LT5VbmxvY2tVcGRhdGUoKTsNCisgIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCisgIHJldHVybiBiUmV0Ow0KIH0NCi1GWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbk1vdXNlRW50ZXIoSVhGQV9XaWRnZXQqIGhXaWRnZXQpDQotew0KLSAgICBtX3BEb2NWaWV3LT5Mb2NrVXBkYXRlKCk7DQotICAgIEZYX0JPT0wgYlJldCA9IHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25Nb3VzZUVudGVyKCk7DQotICAgIG1fcERvY1ZpZXctPlVubG9ja1VwZGF0ZSgpOw0KLSAgICBtX3BEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7DQotICAgIHJldHVybiBiUmV0Ow0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTEJ1dHRvbkRvd24oSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgbV9wRG9jVmlldy0+TG9ja1VwZGF0ZSgpOw0KKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25MQnV0dG9uRG93bihkd0ZsYWdzLCBmeCwgZnkpOw0KKyAgaWYgKGJSZXQgJiYgbV9wRG9jVmlldy0+U2V0Rm9jdXMoaFdpZGdldCkpIHsNCisgICAgKChDWEZBX0ZGRG9jKiltX3BEb2NWaWV3LT5HZXREb2MoKSkNCisgICAgICAgIC0+R2V0RG9jUHJvdmlkZXIoKQ0KKyAgICAgICAgLT5TZXRGb2N1c1dpZGdldChtX3BEb2NWaWV3LT5HZXREb2MoKSwgKElYRkFfV2lkZ2V0KiloV2lkZ2V0KTsNCisgIH0NCisgIG1fcERvY1ZpZXctPlVubG9ja1VwZGF0ZSgpOw0KKyAgbV9wRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KKyAgcmV0dXJuIGJSZXQ7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTW91c2VFeGl0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KQ0KLXsNCi0gICAgbV9wRG9jVmlldy0+TG9ja1VwZGF0ZSgpOw0KLSAgICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uTW91c2VFeGl0KCk7DQotICAgIG1fcERvY1ZpZXctPlVubG9ja1VwZGF0ZSgpOw0KLSAgICBtX3BEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7DQotICAgIHJldHVybiBiUmV0Ow0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTEJ1dHRvblVwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIG1fcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgbV9wRG9jVmlldy0+bV9iTGF5b3V0RXZlbnQgPSBUUlVFOw0KKyAgRlhfQk9PTCBiUmV0ID0NCisgICAgICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uTEJ1dHRvblVwKGR3RmxhZ3MsIGZ4LCBmeSk7DQorICBtX3BEb2NWaWV3LT5VbmxvY2tVcGRhdGUoKTsNCisgIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCisgIHJldHVybiBiUmV0Ow0KIH0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbkxCdXR0b25Eb3duKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBtX3BEb2NWaWV3LT5Mb2NrVXBkYXRlKCk7DQotICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KLSAgICBGWF9CT09MIGJSZXQgPSAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5PbkxCdXR0b25Eb3duKGR3RmxhZ3MsIGZ4LCBmeSk7DQotICAgIGlmIChiUmV0ICYmIG1fcERvY1ZpZXctPlNldEZvY3VzKGhXaWRnZXQpKSB7DQotICAgICAgICAoKENYRkFfRkZEb2MqKW1fcERvY1ZpZXctPkdldERvYygpKS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Rm9jdXNXaWRnZXQobV9wRG9jVmlldy0+R2V0RG9jKCksIChJWEZBX1dpZGdldCopaFdpZGdldCk7DQotICAgIH0NCi0gICAgbV9wRG9jVmlldy0+VW5sb2NrVXBkYXRlKCk7DQotICAgIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25MQnV0dG9uRGJsQ2xrKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgRlhfQk9PTCBiUmV0ID0NCisgICAgICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uTEJ1dHRvbkRibENsayhkd0ZsYWdzLCBmeCwgZnkpOw0KKyAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgcmV0dXJuIGJSZXQ7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTEJ1dHRvblVwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBtX3BEb2NWaWV3LT5Mb2NrVXBkYXRlKCk7DQotICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KLSAgICBtX3BEb2NWaWV3LT5tX2JMYXlvdXRFdmVudCA9IFRSVUU7DQotICAgIEZYX0JPT0wgYlJldCA9IHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25MQnV0dG9uVXAoZHdGbGFncywgZngsIGZ5KTsNCi0gICAgbV9wRG9jVmlldy0+VW5sb2NrVXBkYXRlKCk7DQotICAgIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25Nb3VzZU1vdmUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25Nb3VzZU1vdmUoZHdGbGFncywgZngsIGZ5KTsNCisgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCisgIHJldHVybiBiUmV0Ow0KIH0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbkxCdXR0b25EYmxDbGsoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KLSAgICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uTEJ1dHRvbkRibENsayhkd0ZsYWdzLCBmeCwgZnkpOw0KLSAgICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7DQotICAgIHJldHVybiBiUmV0Ow0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTW91c2VXaGVlbChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCkNCisgICAgICAgICAgICAgICAgICAgICAtPk9uTW91c2VXaGVlbChkd0ZsYWdzLCB6RGVsdGEsIGZ4LCBmeSk7DQorICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7DQorICByZXR1cm4gYlJldDsNCiB9DQotRlhfQk9PTAlDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25Nb3VzZU1vdmUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KLSAgICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uTW91c2VNb3ZlKGR3RmxhZ3MsIGZ4LCBmeSk7DQotICAgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25SQnV0dG9uRG93bihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlJvdGF0ZTJOb3JtYWwoZngsIGZ5KTsNCisgIEZYX0JPT0wgYlJldCA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5PblJCdXR0b25Eb3duKGR3RmxhZ3MsIGZ4LCBmeSk7DQorICBpZiAoYlJldCAmJiBtX3BEb2NWaWV3LT5TZXRGb2N1cyhoV2lkZ2V0KSkgew0KKyAgICAoKENYRkFfRkZEb2MqKW1fcERvY1ZpZXctPkdldERvYygpKQ0KKyAgICAgICAgLT5HZXREb2NQcm92aWRlcigpDQorICAgICAgICAtPlNldEZvY3VzV2lkZ2V0KG1fcERvY1ZpZXctPkdldERvYygpLCAoSVhGQV9XaWRnZXQqKWhXaWRnZXQpOw0KKyAgfQ0KKyAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgcmV0dXJuIGJSZXQ7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTW91c2VXaGVlbChJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgaW50MTZfdCB6RGVsdGEsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KLSAgICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uTW91c2VXaGVlbChkd0ZsYWdzLCB6RGVsdGEsIGZ4LCBmeSk7DQotICAgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25SQnV0dG9uVXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25SQnV0dG9uVXAoZHdGbGFncywgZngsIGZ5KTsNCisgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCisgIHJldHVybiBiUmV0Ow0KIH0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXRIYW5kbGVyOjpPblJCdXR0b25Eb3duKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlJvdGF0ZTJOb3JtYWwoZngsIGZ5KTsNCi0gICAgRlhfQk9PTCBiUmV0ID0gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5PblJCdXR0b25Eb3duKGR3RmxhZ3MsIGZ4LCBmeSk7DQotICAgIGlmIChiUmV0ICYmIG1fcERvY1ZpZXctPlNldEZvY3VzKGhXaWRnZXQpKSB7DQotICAgICAgICAoKENYRkFfRkZEb2MqKW1fcERvY1ZpZXctPkdldERvYygpKS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Rm9jdXNXaWRnZXQobV9wRG9jVmlldy0+R2V0RG9jKCksIChJWEZBX1dpZGdldCopaFdpZGdldCk7DQotICAgIH0NCi0gICAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KLSAgICByZXR1cm4gYlJldDsNCitGWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPblJCdXR0b25EYmxDbGsoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25SQnV0dG9uRGJsQ2xrKGR3RmxhZ3MsIGZ4LCBmeSk7DQorICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7DQorICByZXR1cm4gYlJldDsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25SQnV0dG9uVXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KLSAgICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uUkJ1dHRvblVwKGR3RmxhZ3MsIGZ4LCBmeSk7DQotICAgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25LZXlEb3duKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0tleUNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCisgIEZYX0JPT0wgYlJldCA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5PbktleURvd24oZHdLZXlDb2RlLCBkd0ZsYWdzKTsNCisgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCisgIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCisgIHJldHVybiBiUmV0Ow0KIH0NCi1GWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPblJCdXR0b25EYmxDbGsoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkNCi17DQotICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KLSAgICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uUkJ1dHRvbkRibENsayhkd0ZsYWdzLCBmeCwgZnkpOw0KLSAgICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7DQotICAgIHJldHVybiBiUmV0Ow0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uS2V5VXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0tleUNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25LZXlVcChkd0tleUNvZGUsIGR3RmxhZ3MpOw0KKyAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgcmV0dXJuIGJSZXQ7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uS2V5RG93bihJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKQ0KLXsNCi0gICAgRlhfQk9PTCBiUmV0ID0gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5PbktleURvd24oZHdLZXlDb2RlLCBkd0ZsYWdzKTsNCi0gICAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KLSAgICBtX3BEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7DQotICAgIHJldHVybiBiUmV0Ow0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uQ2hhcihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uQ2hhcihkd0NoYXIsIGR3RmxhZ3MpOw0KKyAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgcmV0dXJuIGJSZXQ7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uS2V5VXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykNCi17DQotICAgIEZYX0JPT0wgYlJldCA9IHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25LZXlVcChkd0tleUNvZGUsIGR3RmxhZ3MpOw0KLSAgICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7DQotICAgIHJldHVybiBiUmV0Ow0KK0ZYX0RXT1JEIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbkhpdFRlc3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAoIShzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkdldFN0YXR1cygpICYNCisgICAgICAgIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQorICB9DQorICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlJvdGF0ZTJOb3JtYWwoZngsIGZ5KTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uSGl0VGVzdChmeCwgZnkpOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbkNoYXIoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3Q2hhciwgRlhfRFdPUkQgZHdGbGFncykNCi17DQotICAgIEZYX0JPT0wgYlJldCA9IHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25DaGFyKGR3Q2hhciwgZHdGbGFncyk7DQotICAgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25TZXRDdXJzb3IoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25TZXRDdXJzb3IoZngsIGZ5KTsNCiB9DQotRlhfRFdPUkQgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uSGl0VGVzdChJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgaWYgKCEoc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KLSAgICB9DQotICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5PbkhpdFRlc3QoZngsIGZ5KTsNCit2b2lkIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpSZW5kZXJXaWRnZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJIaWdobGlnaHQpIHsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+UmVuZGVyV2lkZ2V0KA0KKyAgICAgIHBHUywgcE1hdHJpeCwgYkhpZ2hsaWdodCA/IFhGQV9XSURHRVRTVEFUVVNfSGlnaGxpZ2h0IDogMCwgMCk7DQogfQ0KLUZYX0JPT0wJQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uU2V0Q3Vyc29yKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpDQotew0KLSAgICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlJvdGF0ZTJOb3JtYWwoZngsIGZ5KTsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25TZXRDdXJzb3IoZngsIGZ5KTsNCi19DQotdm9pZCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6UmVuZGVyV2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCAsIEZYX0JPT0wgYkhpZ2hsaWdodCkNCi17DQotICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+UmVuZGVyV2lkZ2V0KHBHUywgcE1hdHJpeCwgYkhpZ2hsaWdodCA/IFhGQV9XSURHRVRTVEFUVVNfSGlnaGxpZ2h0IDogMCwgMCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Okhhc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLCBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUpDQotew0KLSAgICBpZiAoIXBXaWRnZXRBY2MgfHwgZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfVW5rbm93bikgew0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Okhhc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSkgew0KKyAgaWYgKCFwV2lkZ2V0QWNjIHx8IGVFdmVudFR5cGUgPT0gWEZBX0VWRU5UX1Vua25vd24pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBXaWRnZXRBY2MtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHN3aXRjaCAoZUV2ZW50VHlwZSkgew0KKyAgICBjYXNlIFhGQV9FVkVOVF9DYWxjdWxhdGU6IHsNCisgICAgICBDWEZBX0NhbGN1bGF0ZSBjYWxjID0gcFdpZGdldEFjYy0+R2V0Q2FsY3VsYXRlKCk7DQorICAgICAgaWYgKCFjYWxjKSB7DQogICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmIChDWEZBX1NjcmlwdCBzY3JpcHQgPSBjYWxjLkdldFNjcmlwdCgpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIGlmIChwV2lkZ2V0QWNjLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KKyAgICBjYXNlIFhGQV9FVkVOVF9WYWxpZGF0ZTogew0KKyAgICAgIENYRkFfVmFsaWRhdGUgdmFsID0gcFdpZGdldEFjYy0+R2V0VmFsaWRhdGUoKTsNCisgICAgICBpZiAoIXZhbCkgew0KICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAodmFsLkdldFNjcmlwdCgpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIHN3aXRjaCAoZUV2ZW50VHlwZSkgew0KLSAgICAgICAgY2FzZSBYRkFfRVZFTlRfQ2FsY3VsYXRlOiB7DQotICAgICAgICAgICAgICAgIENYRkFfQ2FsY3VsYXRlIGNhbGMgPSBwV2lkZ2V0QWNjLT5HZXRDYWxjdWxhdGUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFjYWxjKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIFhGQV9FVkVOVF9WYWxpZGF0ZTogew0KLSAgICAgICAgICAgICAgICBDWEZBX1ZhbGlkYXRlIHZhbCA9IHBXaWRnZXRBY2MtPkdldFZhbGlkYXRlKCk7DQotICAgICAgICAgICAgICAgIGlmICghdmFsKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHZhbC5HZXRTY3JpcHQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlQXJyYXkgZXZlbnRBcnJheTsNCi0gICAgcmV0dXJuIHBXaWRnZXRBY2MtPkdldEV2ZW50QnlBY3Rpdml0eShnc19FdmVudEFjdGl2aXR5W2VFdmVudFR5cGVdLCBldmVudEFycmF5KTsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIENYRkFfTm9kZUFycmF5IGV2ZW50QXJyYXk7DQorICByZXR1cm4gcFdpZGdldEFjYy0+R2V0RXZlbnRCeUFjdGl2aXR5KGdzX0V2ZW50QWN0aXZpdHlbZUV2ZW50VHlwZV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50QXJyYXkpOw0KIH0NCi1pbnQzMl90IENYRkFfRkZXaWRnZXRIYW5kbGVyOjpQcm9jZXNzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsIENYRkFfRXZlbnRQYXJhbSogcFBhcmFtKQ0KLXsNCi0gICAgaWYgKCFwUGFyYW0gfHwgcFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Vbmtub3duKSB7DQoraW50MzJfdCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6UHJvY2Vzc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSkgew0KKyAgaWYgKCFwUGFyYW0gfHwgcFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Vbmtub3duKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIGlmICghcFdpZGdldEFjYyB8fCBwV2lkZ2V0QWNjLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICB9DQorICBzd2l0Y2ggKHBQYXJhbS0+bV9lVHlwZSkgew0KKyAgICBjYXNlIFhGQV9FVkVOVF9DYWxjdWxhdGU6DQorICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPlByb2Nlc3NDYWxjdWxhdGUoKTsNCisgICAgY2FzZSBYRkFfRVZFTlRfVmFsaWRhdGU6DQorICAgICAgaWYgKCgoQ1hGQV9GRkRvYyopbV9wRG9jVmlldy0+R2V0RG9jKCkpDQorICAgICAgICAgICAgICAtPkdldERvY1Byb3ZpZGVyKCkNCisgICAgICAgICAgICAgIC0+SXNWYWxpZGF0aW9uc0VuYWJsZWQobV9wRG9jVmlldy0+R2V0RG9jKCkpKSB7DQorICAgICAgICByZXR1cm4gcFdpZGdldEFjYy0+UHJvY2Vzc1ZhbGlkYXRlKCk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsNCisgICAgY2FzZSBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZTogew0KKyAgICAgIENYRkFfQ2FsY3VsYXRlIGNhbGMgPSBwV2lkZ2V0QWNjLT5HZXRDYWxjdWxhdGUoKTsNCisgICAgICBpZiAoIWNhbGMpIHsNCiAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgICB9DQorICAgICAgaWYgKHBXaWRnZXRBY2MtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlKSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Rpc2FibGVkOw0KKyAgICAgIH0NCisgICAgICBDWEZBX1NjcmlwdCBzY3JpcHQgPSBjYWxjLkdldFNjcmlwdCgpOw0KKyAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5FeGVjdXRlU2NyaXB0KHNjcmlwdCwgcFBhcmFtKTsNCiAgICAgfQ0KLSAgICBpZiAoIXBXaWRnZXRBY2MgfHwgcFdpZGdldEFjYy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RyYXcpIHsNCi0gICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKHBQYXJhbS0+bV9lVHlwZSkgew0KLSAgICAgICAgY2FzZSBYRkFfRVZFTlRfQ2FsY3VsYXRlOg0KLSAgICAgICAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5Qcm9jZXNzQ2FsY3VsYXRlKCk7DQotICAgICAgICBjYXNlIFhGQV9FVkVOVF9WYWxpZGF0ZToNCi0gICAgICAgICAgICBpZiAoKChDWEZBX0ZGRG9jKiltX3BEb2NWaWV3LT5HZXREb2MoKSktPkdldERvY1Byb3ZpZGVyKCktPklzVmFsaWRhdGlvbnNFbmFibGVkKG1fcERvY1ZpZXctPkdldERvYygpKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcFdpZGdldEFjYy0+UHJvY2Vzc1ZhbGlkYXRlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsNCi0gICAgICAgIGNhc2UgWEZBX0VWRU5UX0luaXRDYWxjdWxhdGU6IHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9DYWxjdWxhdGUgY2FsYyA9IHBXaWRnZXRBY2MtPkdldENhbGN1bGF0ZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoIWNhbGMpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAocFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ1hGQV9TY3JpcHQgc2NyaXB0ID0gY2FsYy5HZXRTY3JpcHQoKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPkV4ZWN1dGVTY3JpcHQoc2NyaXB0LCBwUGFyYW0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgaW50MzJfdCBpUmV0ID0gcFdpZGdldEFjYy0+UHJvY2Vzc0V2ZW50KGdzX0V2ZW50QWN0aXZpdHlbcFBhcmFtLT5tX2VUeXBlXSwgcFBhcmFtKTsNCi0gICAgcmV0dXJuIGlSZXQ7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBpbnQzMl90IGlSZXQgPQ0KKyAgICAgIHBXaWRnZXRBY2MtPlByb2Nlc3NFdmVudChnc19FdmVudEFjdGl2aXR5W3BQYXJhbS0+bV9lVHlwZV0sIHBQYXJhbSk7DQorICByZXR1cm4gaVJldDsNCiB9DQotSVhGQV9XaWRnZXQqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVXaWRnZXQoSVhGQV9XaWRnZXQqIGhQYXJlbnQsIFhGQV9XSURHRVRUWVBFIGVUeXBlLCBJWEZBX1dpZGdldCogaEJlZm9yZSApDQotew0KLSAgICBDWEZBX05vZGUqIHBQYXJlbnRGb3JtSXRlbSA9IGhQYXJlbnQgPyBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFBhcmVudCktPkdldERhdGFBY2MoKS0+R2V0Tm9kZSgpIDogTlVMTDsNCi0gICAgQ1hGQV9Ob2RlKiBwQmVmb3JlRm9ybUl0ZW0gPSBoQmVmb3JlID8gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhCZWZvcmUpLT5HZXREYXRhQWNjKCktPkdldE5vZGUoKSA6IE5VTEw7DQotICAgIENYRkFfTm9kZSogcE5ld0Zvcm1JdGVtID0gQ3JlYXRlV2lkZ2V0Rm9ybUl0ZW0oZVR5cGUsIHBQYXJlbnRGb3JtSXRlbSwgcEJlZm9yZUZvcm1JdGVtKTsNCi0gICAgaWYgKHBOZXdGb3JtSXRlbSA9PSBOVUxMKQl7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBwTmV3Rm9ybUl0ZW0tPkdldFRlbXBsYXRlTm9kZSgpLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQotICAgIHBOZXdGb3JtSXRlbS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KLSAgICBtX3BEb2NWaWV3LT5SdW5MYXlvdXQoKTsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0ID0gbV9wRG9jVmlldy0+R2V0WEZBTGF5b3V0KCktPkdldExheW91dEl0ZW0ocE5ld0Zvcm1JdGVtKTsNCi0gICAgcmV0dXJuIChJWEZBX1dpZGdldCopcExheW91dDsNCi19DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlV2lkZ2V0Rm9ybUl0ZW0oWEZBX1dJREdFVFRZUEUgZVR5cGUsIENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KLXsNCi0gICAgc3dpdGNoIChlVHlwZSkgew0KLSAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9CYXJjb2RlOg0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9QdXNoQnV0dG9uOg0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVQdXNoQnV0dG9uKHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9DaGVja0J1dHRvbjoNCi0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlQ2hlY2tCdXR0b24ocFBhcmVudCwgcEJlZm9yZSk7DQotICAgICAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0V4Y2x1ZGVHcm91cDoNCi0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlRXhjbEdyb3VwKHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9SYWRpb0J1dHRvbjoNCi0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmFkaW9CdXR0b24ocFBhcmVudCwgcEJlZm9yZSk7DQotICAgICAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0FyYzoNCi0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlQXJjKHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9SZWN0YW5nbGU6DQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlY3RhbmdsZShwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfSW1hZ2U6DQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUltYWdlKHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9MaW5lOg0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVMaW5lKHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9UZXh0Og0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVUZXh0KHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9EYXRldGltZUVkaXQ6DQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZURhdGV0aW1lRWRpdChwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfRGVjaW1hbEZpZWxkOg0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVEZWNpbWFsRmllbGQocFBhcmVudCwgcEJlZm9yZSk7DQotICAgICAgICBjYXNlIFhGQV9XSURHRVRUWVBFX051bWVyaWNGaWVsZDoNCi0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlTnVtZXJpY0ZpZWxkKHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9TaWduYXR1cmU6DQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVNpZ25hdHVyZShwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfVGV4dEVkaXQ6DQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVRleHRFZGl0KHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICAgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9Ecm9wZG93bkxpc3Q6DQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZURyb3Bkb3duTGlzdChwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfTGlzdEJveDoNCi0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlTGlzdEJveChwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfSW1hZ2VGaWVsZDoNCi0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlSW1hZ2VGaWVsZChwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfUGFzc3dvcmRFZGl0Og0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVQYXNzd29yZEVkaXQocFBhcmVudCwgcEJlZm9yZSk7DQotICAgICAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1N1YmZvcm06DQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVN1YmZvcm0ocFBhcmVudCwgcEJlZm9yZSk7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQorSVhGQV9XaWRnZXQqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVXaWRnZXQoSVhGQV9XaWRnZXQqIGhQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVFRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9XaWRnZXQqIGhCZWZvcmUpIHsNCisgIENYRkFfTm9kZSogcFBhcmVudEZvcm1JdGVtID0NCisgICAgICBoUGFyZW50ID8gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhQYXJlbnQpLT5HZXREYXRhQWNjKCktPkdldE5vZGUoKQ0KKyAgICAgICAgICAgICAgOiBOVUxMOw0KKyAgQ1hGQV9Ob2RlKiBwQmVmb3JlRm9ybUl0ZW0gPQ0KKyAgICAgIGhCZWZvcmUgPyBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaEJlZm9yZSktPkdldERhdGFBY2MoKS0+R2V0Tm9kZSgpDQorICAgICAgICAgICAgICA6IE5VTEw7DQorICBDWEZBX05vZGUqIHBOZXdGb3JtSXRlbSA9DQorICAgICAgQ3JlYXRlV2lkZ2V0Rm9ybUl0ZW0oZVR5cGUsIHBQYXJlbnRGb3JtSXRlbSwgcEJlZm9yZUZvcm1JdGVtKTsNCisgIGlmIChwTmV3Rm9ybUl0ZW0gPT0gTlVMTCkgew0KICAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBOZXdGb3JtSXRlbS0+R2V0VGVtcGxhdGVOb2RlKCktPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgIHBOZXdGb3JtSXRlbS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgbV9wRG9jVmlldy0+UnVuTGF5b3V0KCk7DQorICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXQgPQ0KKyAgICAgIG1fcERvY1ZpZXctPkdldFhGQUxheW91dCgpLT5HZXRMYXlvdXRJdGVtKHBOZXdGb3JtSXRlbSk7DQorICByZXR1cm4gKElYRkFfV2lkZ2V0KilwTGF5b3V0Ow0KIH0NCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVQdXNoQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9CdXR0b24sIHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICBDWEZBX05vZGUqIHBDYXB0aW9uID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfQ2FwdGlvbiwgcEZpZWxkKTsNCi0gICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9WYWx1ZSwgcENhcHRpb24pOw0KLSAgICBDWEZBX05vZGUqIHBUZXh0ID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfVGV4dCwgcFZhbHVlKTsNCi0gICAgcFRleHQtPlNldENvbnRlbnQoRlhfV1NUUkMoTCJCdXR0b24iKSwgRlhfV1NUUkMoTCJCdXR0b24iKSwgRkFMU0UpOw0KLSAgICBDWEZBX05vZGUqIHBQYXJhID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfUGFyYSwgcENhcHRpb24pOw0KLSAgICBwUGFyYS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlLCBGQUxTRSk7DQotICAgIHBQYXJhLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXIsIEZBTFNFKTsNCi0gICAgQ3JlYXRlRm9udE5vZGUocENhcHRpb24pOw0KLSAgICBDWEZBX05vZGUqIHBCb3JkZXIgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9Cb3JkZXIsIHBGaWVsZCk7DQotICAgIHBCb3JkZXItPlNldEVudW0oWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCwgRkFMU0UpOw0KLSAgICBDWEZBX05vZGUqIHBFZGdlID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfRWRnZSwgcEJvcmRlcik7DQotICAgIHBFZGdlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfU3Ryb2tlLCBYRkFfQVRUUklCVVRFRU5VTV9SYWlzZWQsIEZBTFNFKTsNCi0gICAgQ1hGQV9Ob2RlKiBwRmlsbCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0ZpbGwsIHBCb3JkZXIpOw0KLSAgICBDWEZBX05vZGUqIHBDb2xvciA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0NvbG9yLCBwRmlsbCk7DQotICAgIHBDb2xvci0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgRlhfV1NUUkMoTCIyMTIsIDIwOCwgMjAwIiksIEZBTFNFKTsNCi0gICAgQ1hGQV9Ob2RlKiBwQmluZCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0JpbmQsIHBGaWVsZCk7DQotICAgIHBCaW5kLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWF0Y2gsIFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpOw0KLSAgICByZXR1cm4gcEZpZWxkOw0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVdpZGdldEZvcm1JdGVtKA0KKyAgICBYRkFfV0lER0VUVFlQRSBlVHlwZSwNCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9CYXJjb2RlOg0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1B1c2hCdXR0b246DQorICAgICAgcmV0dXJuIENyZWF0ZVB1c2hCdXR0b24ocFBhcmVudCwgcEJlZm9yZSk7DQorICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfQ2hlY2tCdXR0b246DQorICAgICAgcmV0dXJuIENyZWF0ZUNoZWNrQnV0dG9uKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0V4Y2x1ZGVHcm91cDoNCisgICAgICByZXR1cm4gQ3JlYXRlRXhjbEdyb3VwKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1JhZGlvQnV0dG9uOg0KKyAgICAgIHJldHVybiBDcmVhdGVSYWRpb0J1dHRvbihwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9BcmM6DQorICAgICAgcmV0dXJuIENyZWF0ZUFyYyhwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9SZWN0YW5nbGU6DQorICAgICAgcmV0dXJuIENyZWF0ZVJlY3RhbmdsZShwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9JbWFnZToNCisgICAgICByZXR1cm4gQ3JlYXRlSW1hZ2UocFBhcmVudCwgcEJlZm9yZSk7DQorICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfTGluZToNCisgICAgICByZXR1cm4gQ3JlYXRlTGluZShwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9UZXh0Og0KKyAgICAgIHJldHVybiBDcmVhdGVUZXh0KHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0RhdGV0aW1lRWRpdDoNCisgICAgICByZXR1cm4gQ3JlYXRlRGF0ZXRpbWVFZGl0KHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0RlY2ltYWxGaWVsZDoNCisgICAgICByZXR1cm4gQ3JlYXRlRGVjaW1hbEZpZWxkKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX051bWVyaWNGaWVsZDoNCisgICAgICByZXR1cm4gQ3JlYXRlTnVtZXJpY0ZpZWxkKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1NpZ25hdHVyZToNCisgICAgICByZXR1cm4gQ3JlYXRlU2lnbmF0dXJlKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1RleHRFZGl0Og0KKyAgICAgIHJldHVybiBDcmVhdGVUZXh0RWRpdChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9Ecm9wZG93bkxpc3Q6DQorICAgICAgcmV0dXJuIENyZWF0ZURyb3Bkb3duTGlzdChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9MaXN0Qm94Og0KKyAgICAgIHJldHVybiBDcmVhdGVMaXN0Qm94KHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0ltYWdlRmllbGQ6DQorICAgICAgcmV0dXJuIENyZWF0ZUltYWdlRmllbGQocFBhcmVudCwgcEJlZm9yZSk7DQorICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfUGFzc3dvcmRFZGl0Og0KKyAgICAgIHJldHVybiBDcmVhdGVQYXNzd29yZEVkaXQocFBhcmVudCwgcEJlZm9yZSk7DQorICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfU3ViZm9ybToNCisgICAgICByZXR1cm4gQ3JlYXRlU3ViZm9ybShwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVDaGVja0J1dHRvbihDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCi17DQotICAgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sIHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICByZXR1cm4gcEZpZWxkOw0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVB1c2hCdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX0J1dHRvbiwgcFBhcmVudCwgcEJlZm9yZSk7DQorICBDWEZBX05vZGUqIHBDYXB0aW9uID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfQ2FwdGlvbiwgcEZpZWxkKTsNCisgIENYRkFfTm9kZSogcFZhbHVlID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfVmFsdWUsIHBDYXB0aW9uKTsNCisgIENYRkFfTm9kZSogcFRleHQgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9UZXh0LCBwVmFsdWUpOw0KKyAgcFRleHQtPlNldENvbnRlbnQoRlhfV1NUUkMoTCJCdXR0b24iKSwgRlhfV1NUUkMoTCJCdXR0b24iKSwgRkFMU0UpOw0KKyAgQ1hGQV9Ob2RlKiBwUGFyYSA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX1BhcmEsIHBDYXB0aW9uKTsNCisgIHBQYXJhLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfVkFsaWduLCBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGUsIEZBTFNFKTsNCisgIHBQYXJhLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXIsIEZBTFNFKTsNCisgIENyZWF0ZUZvbnROb2RlKHBDYXB0aW9uKTsNCisgIENYRkFfTm9kZSogcEJvcmRlciA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0JvcmRlciwgcEZpZWxkKTsNCisgIHBCb3JkZXItPlNldEVudW0oWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCwgRkFMU0UpOw0KKyAgQ1hGQV9Ob2RlKiBwRWRnZSA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0VkZ2UsIHBCb3JkZXIpOw0KKyAgcEVkZ2UtPlNldEVudW0oWEZBX0FUVFJJQlVURV9TdHJva2UsIFhGQV9BVFRSSUJVVEVFTlVNX1JhaXNlZCwgRkFMU0UpOw0KKyAgQ1hGQV9Ob2RlKiBwRmlsbCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0ZpbGwsIHBCb3JkZXIpOw0KKyAgQ1hGQV9Ob2RlKiBwQ29sb3IgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9Db2xvciwgcEZpbGwpOw0KKyAgcENvbG9yLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCBGWF9XU1RSQyhMIjIxMiwgMjA4LCAyMDAiKSwgRkFMU0UpOw0KKyAgQ1hGQV9Ob2RlKiBwQmluZCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0JpbmQsIHBGaWVsZCk7DQorICBwQmluZC0+U2V0RW51bShYRkFfQVRUUklCVVRFX01hdGNoLCBYRkFfQVRUUklCVVRFRU5VTV9Ob25lKTsNCisgIHJldHVybiBwRmllbGQ7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUV4Y2xHcm91cChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCi17DQotICAgIHJldHVybiBDcmVhdGVGb3JtSXRlbShYRkFfRUxFTUVOVF9FeGNsR3JvdXAsIHBQYXJlbnQsIHBCZWZvcmUpOw0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUNoZWNrQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlUmFkaW9CdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQotew0KLSAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgQ1hGQV9Ob2RlKiBwVWkgPSBwRmllbGQtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1VpKTsNCi0gICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0ID0gcFVpLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9DaGVja0J1dHRvbik7DQotICAgIHBXaWRnZXQtPlNldEVudW0oWEZBX0FUVFJJQlVURV9TaGFwZSwgWEZBX0FUVFJJQlVURUVOVU1fUm91bmQpOw0KLSAgICByZXR1cm4gcEZpZWxkOw0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUV4Y2xHcm91cChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgcmV0dXJuIENyZWF0ZUZvcm1JdGVtKFhGQV9FTEVNRU5UX0V4Y2xHcm91cCwgcFBhcmVudCwgcEJlZm9yZSk7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZURhdGV0aW1lRWRpdChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCi17DQotICAgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0LCBwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgQ3JlYXRlVmFsdWVOb2RlKFhGQV9FTEVNRU5UX0RhdGUsIHBGaWVsZCk7DQotICAgIHJldHVybiBwRmllbGQ7DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlUmFkaW9CdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiwgcFBhcmVudCwgcEJlZm9yZSk7DQorICBDWEZBX05vZGUqIHBVaSA9IHBGaWVsZC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfVWkpOw0KKyAgQ1hGQV9Ob2RlKiBwV2lkZ2V0ID0gcFVpLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9DaGVja0J1dHRvbik7DQorICBwV2lkZ2V0LT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfU2hhcGUsIFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kKTsNCisgIHJldHVybiBwRmllbGQ7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZURlY2ltYWxGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCi17DQotICAgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlTnVtZXJpY0ZpZWxkKHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICBDcmVhdGVWYWx1ZU5vZGUoWEZBX0VMRU1FTlRfRGVjaW1hbCwgcEZpZWxkKTsNCi0gICAgcmV0dXJuIHBGaWVsZDsNCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVEYXRldGltZUVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0LCBwUGFyZW50LCBwQmVmb3JlKTsNCisgIENyZWF0ZVZhbHVlTm9kZShYRkFfRUxFTUVOVF9EYXRlLCBwRmllbGQpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlTnVtZXJpY0ZpZWxkKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7DQotICAgIHJldHVybiBwRmllbGQ7DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRGVjaW1hbEZpZWxkKENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZU51bWVyaWNGaWVsZChwUGFyZW50LCBwQmVmb3JlKTsNCisgIENyZWF0ZVZhbHVlTm9kZShYRkFfRUxFTUVOVF9EZWNpbWFsLCBwRmllbGQpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlU2lnbmF0dXJlKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9TaWduYXR1cmUsIHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICByZXR1cm4gcEZpZWxkOw0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZU51bWVyaWNGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7DQorICByZXR1cm4gcEZpZWxkOw0KIH0NCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVUZXh0RWRpdChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCi17DQotICAgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfVGV4dEVkaXQsIHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICByZXR1cm4gcEZpZWxkOw0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVNpZ25hdHVyZShDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9TaWduYXR1cmUsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRHJvcGRvd25MaXN0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LCBwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgcmV0dXJuIHBGaWVsZDsNCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVUZXh0RWRpdChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX1RleHRFZGl0LCBwUGFyZW50LCBwQmVmb3JlKTsNCisgIHJldHVybiBwRmllbGQ7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUxpc3RCb3goQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQotew0KLSAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZURyb3Bkb3duTGlzdChwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgQ1hGQV9Ob2RlKiBwVWkgPSBwRmllbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgQ1hGQV9Ob2RlKiBwTGlzdEJveCA9IHBVaS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICBwTGlzdEJveC0+U2V0RW51bShYRkFfQVRUUklCVVRFX09wZW4sIFhGQV9BVFRSSUJVVEVFTlVNX0Fsd2F5cyk7DQotICAgIHBMaXN0Qm94LT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sIFhGQV9BVFRSSUJVVEVFTlVNX0V4aXQpOw0KLSAgICByZXR1cm4gcEZpZWxkOw0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZURyb3Bkb3duTGlzdChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LCBwUGFyZW50LCBwQmVmb3JlKTsNCisgIHJldHVybiBwRmllbGQ7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUltYWdlRmllbGQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQotew0KLSAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX0ltYWdlRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7DQotICAgIHJldHVybiBwRmllbGQ7DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlTGlzdEJveChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRHJvcGRvd25MaXN0KHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgQ1hGQV9Ob2RlKiBwVWkgPSBwRmllbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIENYRkFfTm9kZSogcExpc3RCb3ggPSBwVWktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIHBMaXN0Qm94LT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3BlbiwgWEZBX0FUVFJJQlVURUVOVU1fQWx3YXlzKTsNCisgIHBMaXN0Qm94LT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sIFhGQV9BVFRSSUJVVEVFTlVNX0V4aXQpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlUGFzc3dvcmRFZGl0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQsIHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICBDWEZBX05vZGUqIHBCaW5kID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfQmluZCwgcEZpZWxkKTsNCi0gICAgcEJpbmQtPlNldEVudW0oWEZBX0FUVFJJQlVURV9NYXRjaCwgWEZBX0FUVFJJQlVURUVOVU1fTm9uZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gcEZpZWxkOw0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUltYWdlRmllbGQoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX0ltYWdlRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7DQorICByZXR1cm4gcEZpZWxkOw0KIH0NCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVGaWVsZChYRkFfRUxFTUVOVCBlRWxlbWVudCwgQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQotew0KLSAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZvcm1JdGVtKFhGQV9FTEVNRU5UX0ZpZWxkLCBwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgQ1hGQV9Ob2RlKiBwVWkgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9VaSwgcEZpZWxkKTsNCi0gICAgQ1hGQV9Ob2RlKiBwQ2hlY2tCdXR0b24gPSBDcmVhdGVDb3B5Tm9kZShlRWxlbWVudCwgcFVpKTsNCi0gICAgQ3JlYXRlRm9udE5vZGUocEZpZWxkKTsNCi0gICAgcmV0dXJuIHBGaWVsZDsNCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVQYXNzd29yZEVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0LCBwUGFyZW50LCBwQmVmb3JlKTsNCisgIENYRkFfTm9kZSogcEJpbmQgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9CaW5kLCBwRmllbGQpOw0KKyAgcEJpbmQtPlNldEVudW0oWEZBX0FUVFJJQlVURV9NYXRjaCwgWEZBX0FUVFJJQlVURUVOVU1fTm9uZSwgRkFMU0UpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlQXJjKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVEcmF3KFhGQV9FTEVNRU5UX0FyYywgcFBhcmVudCwgcEJlZm9yZSk7DQotICAgIHJldHVybiBwRmllbGQ7DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRmllbGQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGb3JtSXRlbShYRkFfRUxFTUVOVF9GaWVsZCwgcFBhcmVudCwgcEJlZm9yZSk7DQorICBDWEZBX05vZGUqIHBVaSA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX1VpLCBwRmllbGQpOw0KKyAgQ1hGQV9Ob2RlKiBwQ2hlY2tCdXR0b24gPSBDcmVhdGVDb3B5Tm9kZShlRWxlbWVudCwgcFVpKTsNCisgIENyZWF0ZUZvbnROb2RlKHBGaWVsZCk7DQorICByZXR1cm4gcEZpZWxkOw0KIH0NCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVSZWN0YW5nbGUoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQotew0KLSAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZURyYXcoWEZBX0VMRU1FTlRfUmVjdGFuZ2xlLCBwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgcmV0dXJuIHBGaWVsZDsNCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVBcmMoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRHJhdyhYRkFfRUxFTUVOVF9BcmMsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlSW1hZ2UoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQotew0KLSAgICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZURyYXcoWEZBX0VMRU1FTlRfSW1hZ2UsIHBQYXJlbnQsIHBCZWZvcmUpOw0KLSAgICBDWEZBX05vZGUqIHBVaSA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX1VpLCBwRmllbGQpOw0KLSAgICBDWEZBX05vZGUqIHBJbWFnZSA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0ltYWdlRWRpdCwgcFVpKTsNCi0gICAgcmV0dXJuIHBGaWVsZDsNCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVSZWN0YW5nbGUoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRHJhdyhYRkFfRUxFTUVOVF9SZWN0YW5nbGUsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlTGluZShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCi17DQotICAgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRHJhdyhYRkFfRUxFTUVOVF9MaW5lLCBwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgcmV0dXJuIHBGaWVsZDsNCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVJbWFnZShDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZURyYXcoWEZBX0VMRU1FTlRfSW1hZ2UsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgQ1hGQV9Ob2RlKiBwVWkgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9VaSwgcEZpZWxkKTsNCisgIENYRkFfTm9kZSogcEltYWdlID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfSW1hZ2VFZGl0LCBwVWkpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlVGV4dChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCi17DQotICAgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRHJhdyhYRkFfRUxFTUVOVF9UZXh0LCBwUGFyZW50LCBwQmVmb3JlKTsNCi0gICAgQ1hGQV9Ob2RlKiBwVWkgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9VaSwgcEZpZWxkKTsNCi0gICAgQ1hGQV9Ob2RlKiBwVGV4dEVkaXQgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9UZXh0RWRpdCwgcFVpKTsNCi0gICAgQ3JlYXRlRm9udE5vZGUocEZpZWxkKTsNCi0gICAgcmV0dXJuIHBGaWVsZDsNCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVMaW5lKENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVEcmF3KFhGQV9FTEVNRU5UX0xpbmUsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRHJhdyhYRkFfRUxFTUVOVCBlRWxlbWVudCwgQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQotew0KLSAgICBDWEZBX05vZGUqIHBEcmF3ID0gQ3JlYXRlRm9ybUl0ZW0oWEZBX0VMRU1FTlRfRHJhdywgcFBhcmVudCwgcEJlZm9yZSk7DQotICAgIENyZWF0ZVZhbHVlTm9kZShlRWxlbWVudCwgcERyYXcpOw0KLSAgICByZXR1cm4gcERyYXc7DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlVGV4dChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRHJhdyhYRkFfRUxFTUVOVF9UZXh0LCBwUGFyZW50LCBwQmVmb3JlKTsNCisgIENYRkFfTm9kZSogcFVpID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfVWksIHBGaWVsZCk7DQorICBDWEZBX05vZGUqIHBUZXh0RWRpdCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX1RleHRFZGl0LCBwVWkpOw0KKyAgQ3JlYXRlRm9udE5vZGUocEZpZWxkKTsNCisgIHJldHVybiBwRmllbGQ7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVN1YmZvcm0oQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQotew0KLSAgICBDWEZBX05vZGUqIHBTdWJmb3JtID0gQ3JlYXRlRm9ybUl0ZW0oWEZBX0VMRU1FTlRfU3ViZm9ybSwgcFBhcmVudCwgcEJlZm9yZSk7DQotICAgIHJldHVybiBwU3ViZm9ybTsNCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVEcmF3KFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBEcmF3ID0gQ3JlYXRlRm9ybUl0ZW0oWEZBX0VMRU1FTlRfRHJhdywgcFBhcmVudCwgcEJlZm9yZSk7DQorICBDcmVhdGVWYWx1ZU5vZGUoZUVsZW1lbnQsIHBEcmF3KTsNCisgIHJldHVybiBwRHJhdzsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRm9ybUl0ZW0oWEZBX0VMRU1FTlQgZUVsZW1lbnQsIENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVQYXJlbnQgPSBwUGFyZW50ICE9IE5VTEwgPyBwUGFyZW50LT5HZXRUZW1wbGF0ZU5vZGUoKSA6IE5VTEw7DQotICAgIENYRkFfTm9kZSogcE5ld0Zvcm1JdGVtID0gcFRlbXBsYXRlUGFyZW50LT5DbG9uZVRlbXBsYXRlVG9Gb3JtKEZBTFNFKTsNCi0gICAgaWYgKHBQYXJlbnQgIT0gTlVMTCkgew0KLSAgICAgICAgcFBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld0Zvcm1JdGVtLCBwQmVmb3JlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gCXBOZXdGb3JtSXRlbTsNCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVTdWJmb3JtKENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwU3ViZm9ybSA9IENyZWF0ZUZvcm1JdGVtKFhGQV9FTEVNRU5UX1N1YmZvcm0sIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgcmV0dXJuIHBTdWJmb3JtOw0KIH0NCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVCBlRWxlbWVudCwgQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0DQotew0KLSAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZVBhcmVudCA9IHBQYXJlbnQgIT0gTlVMTCA/IHBQYXJlbnQtPkdldFRlbXBsYXRlTm9kZSgpIDogTlVMTDsNCi0gICAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IENyZWF0ZVRlbXBsYXRlTm9kZShlRWxlbWVudCwgcFRlbXBsYXRlUGFyZW50LCBwQmVmb3JlID8gcEJlZm9yZS0+R2V0VGVtcGxhdGVOb2RlKCkgOiBOVUxMKS0+Q2xvbmUoRkFMU0UpOw0KLSAgICBpZiAocFBhcmVudCAhPSBOVUxMKSB7DQotICAgICAgICBwUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3Tm9kZSwgcEJlZm9yZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIAlwTmV3Tm9kZTsNCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVGb3JtSXRlbShYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBUZW1wbGF0ZVBhcmVudCA9DQorICAgICAgcFBhcmVudCAhPSBOVUxMID8gcFBhcmVudC0+R2V0VGVtcGxhdGVOb2RlKCkgOiBOVUxMOw0KKyAgQ1hGQV9Ob2RlKiBwTmV3Rm9ybUl0ZW0gPSBwVGVtcGxhdGVQYXJlbnQtPkNsb25lVGVtcGxhdGVUb0Zvcm0oRkFMU0UpOw0KKyAgaWYgKHBQYXJlbnQgIT0gTlVMTCkgew0KKyAgICBwUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3Rm9ybUl0ZW0sIHBCZWZvcmUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBOZXdGb3JtSXRlbTsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlVGVtcGxhdGVOb2RlKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QNCi17DQotICAgIENYRkFfRG9jdW1lbnQqIHBYRkFEb2MgPSBHZXRYRkFEb2MoKTsNCi0gICAgQ1hGQV9Ob2RlKiBwTmV3VGVtcGxhdGVOb2RlID0gcFhGQURvYy0+R2V0UGFyc2VyKCktPkdldEZhY3RvcnkoKS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX1RlbXBsYXRlLCBlRWxlbWVudCk7DQotICAgIGlmIChwUGFyZW50ICE9IE5VTEwpIHsNCi0gICAgICAgIHBQYXJlbnQtPkluc2VydENoaWxkKHBOZXdUZW1wbGF0ZU5vZGUsIHBCZWZvcmUpOw0KLSAgICB9DQotICAgIHJldHVybiBwTmV3VGVtcGxhdGVOb2RlOw0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcFRlbXBsYXRlUGFyZW50ID0NCisgICAgICBwUGFyZW50ICE9IE5VTEwgPyBwUGFyZW50LT5HZXRUZW1wbGF0ZU5vZGUoKSA6IE5VTEw7DQorICBDWEZBX05vZGUqIHBOZXdOb2RlID0NCisgICAgICBDcmVhdGVUZW1wbGF0ZU5vZGUoZUVsZW1lbnQsIHBUZW1wbGF0ZVBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcEJlZm9yZSA/IHBCZWZvcmUtPkdldFRlbXBsYXRlTm9kZSgpIDogTlVMTCkNCisgICAgICAgICAgLT5DbG9uZShGQUxTRSk7DQorICBpZiAocFBhcmVudCAhPSBOVUxMKSB7DQorICAgIHBQYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlLCBwQmVmb3JlKTsNCisgIH0NCisgIHJldHVybiBwTmV3Tm9kZTsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRm9udE5vZGUoQ1hGQV9Ob2RlKiBwUGFyZW50KSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRm9udCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0ZvbnQsIHBQYXJlbnQpOw0KLSAgICBwRm9udC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwgRlhfV1NUUkMoTCJNeXJpYWQgUHJvIiksIEZBTFNFKTsNCi0gICAgcmV0dXJuIHBGb250Ow0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVRlbXBsYXRlTm9kZShYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfRG9jdW1lbnQqIHBYRkFEb2MgPSBHZXRYRkFEb2MoKTsNCisgIENYRkFfTm9kZSogcE5ld1RlbXBsYXRlTm9kZSA9IHBYRkFEb2MtPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCktPkNyZWF0ZU5vZGUoDQorICAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSwgZUVsZW1lbnQpOw0KKyAgaWYgKHBQYXJlbnQgIT0gTlVMTCkgew0KKyAgICBwUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3VGVtcGxhdGVOb2RlLCBwQmVmb3JlKTsNCisgIH0NCisgIHJldHVybiBwTmV3VGVtcGxhdGVOb2RlOw0KIH0NCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVNYXJnaW5Ob2RlKENYRkFfTm9kZSogcFBhcmVudCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZkluc2V0c1s0XSkgY29uc3QNCi17DQotICAgIENYRkFfTm9kZSogcE1hcmdpbiA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX01hcmdpbiwgcFBhcmVudCk7DQotICAgIGlmIChkd0ZsYWdzICYgMHgwMSkgew0KLSAgICAgICAgcE1hcmdpbi0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwgQ1hGQV9NZWFzdXJlbWVudChmSW5zZXRzWzBdLCBYRkFfVU5JVF9QdCksIEZBTFNFKTsNCi0gICAgfQ0KLSAgICBpZiAoZHdGbGFncyAmIDB4MDIpIHsNCi0gICAgICAgIHBNYXJnaW4tPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgQ1hGQV9NZWFzdXJlbWVudChmSW5zZXRzWzFdLCBYRkFfVU5JVF9QdCksIEZBTFNFKTsNCi0gICAgfQ0KLSAgICBpZiAoZHdGbGFncyAmIDB4MDQpIHsNCi0gICAgICAgIHBNYXJnaW4tPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LCBDWEZBX01lYXN1cmVtZW50KGZJbnNldHNbMl0sIFhGQV9VTklUX1B0KSwgRkFMU0UpOw0KLSAgICB9DQotICAgIGlmIChkd0ZsYWdzICYgMHgwOCkgew0KLSAgICAgICAgcE1hcmdpbi0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LCBDWEZBX01lYXN1cmVtZW50KGZJbnNldHNbM10sIFhGQV9VTklUX1B0KSwgRkFMU0UpOw0KLSAgICB9DQotICAgIHJldHVybiBwTWFyZ2luOw0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUZvbnROb2RlKENYRkFfTm9kZSogcFBhcmVudCkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRm9udCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0ZvbnQsIHBQYXJlbnQpOw0KKyAgcEZvbnQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsIEZYX1dTVFJDKEwiTXlyaWFkIFBybyIpLCBGQUxTRSk7DQorICByZXR1cm4gcEZvbnQ7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVZhbHVlTm9kZShYRkFfRUxFTUVOVCBlVmFsdWUsIENYRkFfTm9kZSogcFBhcmVudCkgY29uc3QNCi17DQotICAgIENYRkFfTm9kZSogcFZhbHVlID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfVmFsdWUsIHBQYXJlbnQpOw0KLSAgICBDWEZBX05vZGUqIHBEYXRlID0gQ3JlYXRlQ29weU5vZGUoZVZhbHVlLCBwVmFsdWUpOw0KLSAgICByZXR1cm4gcFZhbHVlOw0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZU1hcmdpbk5vZGUoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZJbnNldHNbNF0pIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcE1hcmdpbiA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX01hcmdpbiwgcFBhcmVudCk7DQorICBpZiAoZHdGbGFncyAmIDB4MDEpIHsNCisgICAgcE1hcmdpbi0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KGZJbnNldHNbMF0sIFhGQV9VTklUX1B0KSwgRkFMU0UpOw0KKyAgfQ0KKyAgaWYgKGR3RmxhZ3MgJiAweDAyKSB7DQorICAgIHBNYXJnaW4tPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KGZJbnNldHNbMV0sIFhGQV9VTklUX1B0KSwgRkFMU0UpOw0KKyAgfQ0KKyAgaWYgKGR3RmxhZ3MgJiAweDA0KSB7DQorICAgIHBNYXJnaW4tPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQoZkluc2V0c1syXSwgWEZBX1VOSVRfUHQpLCBGQUxTRSk7DQorICB9DQorICBpZiAoZHdGbGFncyAmIDB4MDgpIHsNCisgICAgcE1hcmdpbi0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQoZkluc2V0c1szXSwgWEZBX1VOSVRfUHQpLCBGQUxTRSk7DQorICB9DQorICByZXR1cm4gcE1hcmdpbjsNCiB9DQotSVhGQV9PYmpGYWN0b3J5KiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0T2JqRmFjdG9yeSgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gR2V0WEZBRG9jKCktPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCk7DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlVmFsdWVOb2RlKFhGQV9FTEVNRU5UIGVWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50KSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBWYWx1ZSA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX1ZhbHVlLCBwUGFyZW50KTsNCisgIENYRkFfTm9kZSogcERhdGUgPSBDcmVhdGVDb3B5Tm9kZShlVmFsdWUsIHBWYWx1ZSk7DQorICByZXR1cm4gcFZhbHVlOw0KIH0NCi1DWEZBX0RvY3VtZW50KiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0WEZBRG9jKCkgY29uc3QNCi17DQotICAgIHJldHVybiAoKENYRkFfRkZEb2MqKShtX3BEb2NWaWV3LT5HZXREb2MoKSkpLT5HZXRYRkFEb2MoKTsNCitJWEZBX09iakZhY3RvcnkqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRPYmpGYWN0b3J5KCkgY29uc3Qgew0KKyAgcmV0dXJuIEdldFhGQURvYygpLT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KIH0NCi1DWEZBX0ZGTWVudUhhbmRsZXI6OkNYRkFfRkZNZW51SGFuZGxlcigpDQotew0KK0NYRkFfRG9jdW1lbnQqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRYRkFEb2MoKSBjb25zdCB7DQorICByZXR1cm4gKChDWEZBX0ZGRG9jKikobV9wRG9jVmlldy0+R2V0RG9jKCkpKS0+R2V0WEZBRG9jKCk7DQogfQ0KLUNYRkFfRkZNZW51SGFuZGxlcjo6fkNYRkFfRkZNZW51SGFuZGxlcigpDQotew0KK0NYRkFfRkZNZW51SGFuZGxlcjo6Q1hGQV9GRk1lbnVIYW5kbGVyKCkge30NCitDWEZBX0ZGTWVudUhhbmRsZXI6On5DWEZBX0ZGTWVudUhhbmRsZXIoKSB7fQ0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5Db3B5KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5DYW5Db3B5KCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5Db3B5KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Q2FuQ29weSgpOw0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5DdXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNhbkN1dCgpOw0KIH0NCi1GWF9CT09MCUNYRkFfRkZNZW51SGFuZGxlcjo6Q2FuQ3V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Q2FuQ3V0KCk7DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkNhblBhc3RlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5DYW5QYXN0ZSgpOw0KIH0NCi1GWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q2FuUGFzdGUoSVhGQV9XaWRnZXQqIGhXaWRnZXQpDQotew0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5DYW5QYXN0ZSgpOw0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5TZWxlY3RBbGwoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNhblNlbGVjdEFsbCgpOw0KIH0NCi1GWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q2FuU2VsZWN0QWxsKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Q2FuU2VsZWN0QWxsKCk7DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkNhbkRlbGV0ZShJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Q2FuRGVsZXRlKCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5EZWxldGUoSVhGQV9XaWRnZXQqIGhXaWRnZXQpDQotew0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5DYW5EZWxldGUoKTsNCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q2FuRGVTZWxlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNhbkRlU2VsZWN0KCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5EZVNlbGVjdChJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNhbkRlU2VsZWN0KCk7DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkNvcHkoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNvcHkod3NUZXh0KTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkNvcHkoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Db3B5KHdzVGV4dCk7DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkN1dChJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Q3V0KHdzVGV4dCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDdXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5DdXQod3NUZXh0KTsNCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6UGFzdGUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlBhc3RlKHdzVGV4dCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpQYXN0ZShJWEZBX1dpZGdldCogaFdpZGdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlBhc3RlKHdzVGV4dCk7DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OlNlbGVjdEFsbChJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+U2VsZWN0QWxsKCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpTZWxlY3RBbGwoSVhGQV9XaWRnZXQqIGhXaWRnZXQpDQotew0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5TZWxlY3RBbGwoKTsNCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6RGVsZXRlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5EZWxldGUoKTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkRlbGV0ZShJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkRlbGV0ZSgpOw0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpEZVNlbGVjdChJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+RGVTZWxlY3QoKTsNCiB9DQotRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkRlU2VsZWN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KQ0KLXsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+RGVTZWxlY3QoKTsNCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q2FuVW5kbyhJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Q2FuVW5kbygpOw0KIH0NCi1GWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q2FuVW5kbyhJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNhblVuZG8oKTsNCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q2FuUmVkbyhJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Q2FuUmVkbygpOw0KIH0NCi1GWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q2FuUmVkbyhJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNhblJlZG8oKTsNCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6VW5kbyhJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+VW5kbygpOw0KIH0NCi1GWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6VW5kbyhJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlVuZG8oKTsNCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6UmVkbyhJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+UmVkbygpOw0KIH0NCi1GWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6UmVkbyhJWEZBX1dpZGdldCogaFdpZGdldCkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlJlZG8oKTsNCisjZGVmaW5lIEZYX0VESVRfSVNMQVRJTldPUkQodSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgKHUgPT0gMHgyRCB8fCAodSA8PSAweDAwNUEgJiYgdSA+PSAweDAwNDEpIHx8ICAgICAgICAgICAgICAgICAgICBcDQorICAgKHUgPD0gMHgwMDdBICYmIHUgPj0gMHgwMDYxKSB8fCAodSA8PSAweDAyQUYgJiYgdSA+PSAweDAwQzApIHx8IFwNCisgICB1ID09IDB4MDAyNykNCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6R2V0U3VnZ2VzdFdvcmRzKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KQ0KKyAgICAgIC0+R2V0U3VnZ2VzdFdvcmRzKHBvaW50Ziwgc1N1Z2dlc3QpOw0KIH0NCi0jZGVmaW5lIEZYX0VESVRfSVNMQVRJTldPUkQodSkJKHUgPT0gMHgyRCB8fCAodSA8PSAweDAwNUEgJiYgdSA+PSAweDAwNDEpIHx8ICh1IDw9IDB4MDA3QSAmJiB1ID49IDB4MDA2MSkgfHwgKHUgPD0gMHgwMkFGICYmIHUgPj0gMHgwMEMwKSB8fCB1ID09IDB4MDAyNykNCi1GWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6R2V0U3VnZ2VzdFdvcmRzKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfUG9pbnRGIHBvaW50ZiwgQ0ZYX0J5dGVTdHJpbmdBcnJheSAmc1N1Z2dlc3QpDQotew0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5HZXRTdWdnZXN0V29yZHMocG9pbnRmLCBzU3VnZ2VzdCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpSZXBsYWNlU3BlbGxDaGVja1dvcmQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9Qb2ludEYgcG9pbnRmLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSkNCi17DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlJlcGxhY2VTcGVsbENoZWNrV29yZChwb2ludGYsIGJzUmVwbGFjZSk7DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OlJlcGxhY2VTcGVsbENoZWNrV29yZCgNCisgICAgSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgIENGWF9Qb2ludEYgcG9pbnRmLA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KQ0KKyAgICAgIC0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKHBvaW50ZiwgYnNSZXBsYWNlKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0aGFuZGxlci5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0aGFuZGxlci5oCmluZGV4IDQ0NzdmMWYuLmFlODgzNjcgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldGhhbmRsZXIuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgKQEAgLTcsOTggKzcsMTYxIEBACiAjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfQU5OT1RIQU5ETEVSX0lNUF9IDQogI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX0FOTk9USEFORExFUl9JTVBfSA0KIGNsYXNzIENYRkFfRkZEb2NWaWV3Ow0KLWNsYXNzIENYRkFfRkZXaWRnZXRIYW5kbGVyIDogcHVibGljIElYRkFfV2lkZ2V0SGFuZGxlcg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZXaWRnZXRIYW5kbGVyKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyk7DQotICAgIH5DWEZBX0ZGV2lkZ2V0SGFuZGxlcigpOw0KLSAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0KgkJQ3JlYXRlV2lkZ2V0KElYRkFfV2lkZ2V0KiBoUGFyZW50LCBYRkFfV0lER0VUVFlQRSBlVHlwZSwgSVhGQV9XaWRnZXQqIGhCZWZvcmUgPSBOVUxMKTsNCi0gICAgdmlydHVhbCBJWEZBX1BhZ2VWaWV3KglHZXRQYWdlVmlldyhJWEZBX1dpZGdldCogaFdpZGdldCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFJlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9SZWN0RiAmcnQpOw0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRTdGF0dXMoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCQm94KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfUmVjdEYgJnJ0Qm94LCBGWF9EV09SRCBkd1N0YXR1cywgRlhfQk9PTCBiRHJhd0ZvY3VzID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKglHZXREYXRhQWNjKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0TmFtZShJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzTmFtZSwgaW50MzJfdCBpTmFtZVR5cGUgPSAwKTsNCi0gICAgdmlydHVhbAlGWF9CT09MCQkJR2V0VG9vbFRpcChJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzVG9vbFRpcCk7DQotICAgIHZpcnR1YWwJdm9pZAkJCVNldFByaXZhdGVEYXRhKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCB2b2lkKiBtb2R1bGVfaWQsIHZvaWQqIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjayk7DQotICAgIHZpcnR1YWwJdm9pZCoJCUdldFByaXZhdGVEYXRhKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCB2b2lkKiBtb2R1bGVfaWQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTW91c2VFbnRlcihJWEZBX1dpZGdldCogaFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Nb3VzZUV4aXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTEJ1dHRvbkRvd24oSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25MQnV0dG9uVXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25MQnV0dG9uRGJsQ2xrKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTW91c2VNb3ZlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uTW91c2VXaGVlbChJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgaW50MTZfdCB6RGVsdGEsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25SQnV0dG9uRG93bihJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPblJCdXR0b25VcChJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPblJCdXR0b25EYmxDbGsoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorY2xhc3MgQ1hGQV9GRldpZGdldEhhbmRsZXIgOiBwdWJsaWMgSVhGQV9XaWRnZXRIYW5kbGVyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRldpZGdldEhhbmRsZXIoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3KTsNCisgIH5DWEZBX0ZGV2lkZ2V0SGFuZGxlcigpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogQ3JlYXRlV2lkZ2V0KElYRkFfV2lkZ2V0KiBoUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9XSURHRVRUWVBFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYRkFfV2lkZ2V0KiBoQmVmb3JlID0gTlVMTCk7DQorICB2aXJ0dWFsIElYRkFfUGFnZVZpZXcqIEdldFBhZ2VWaWV3KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisgIHZpcnR1YWwgdm9pZCBHZXRSZWN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfUmVjdEYmIHJ0KTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0U3RhdHVzKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCQm94KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRHJhd0ZvY3VzID0gRkFMU0UpOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogR2V0RGF0YUFjYyhJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIHZvaWQgR2V0TmFtZShJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlOYW1lVHlwZSA9IDApOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldFRvb2xUaXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9XaWRlU3RyaW5nJiB3c1Rvb2xUaXApOw0KKyAgdmlydHVhbCB2b2lkIFNldFByaXZhdGVEYXRhKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG1vZHVsZV9pZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjayk7DQorICB2aXJ0dWFsIHZvaWQqIEdldFByaXZhdGVEYXRhKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCB2b2lkKiBtb2R1bGVfaWQpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VFbnRlcihJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZUV4aXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRGJsQ2xrKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VNb3ZlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VXaGVlbChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRG93bihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25EYmxDbGsoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSk7DQogDQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25LZXlEb3duKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uS2V5VXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncyk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25DaGFyKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0NoYXIsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KLSAgICB2aXJ0dWFsCUZYX0RXT1JECU9uSGl0VGVzdChJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlPblNldEN1cnNvcihJWEZBX1dpZGdldCogaFdpZGdldCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCi0gICAgdmlydHVhbCB2b2lkCQlSZW5kZXJXaWRnZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwgRlhfQk9PTCBiSGlnaGxpZ2h0ID0gRkFMU0UpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUhhc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLCBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJUHJvY2Vzc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLCBDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSk7DQotcHJvdGVjdGVkOg0KLSAgICBDWEZBX05vZGUqCQlDcmVhdGVXaWRnZXRGb3JtSXRlbShYRkFfV0lER0VUVFlQRSBlVHlwZSwgQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5RG93bihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdLZXlDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbktleVVwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdLZXlDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBPbkhpdFRlc3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25TZXRDdXJzb3IoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIHZvaWQgUmVuZGVyV2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhpZ2hsaWdodCA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBIYXNFdmVudChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUpOw0KKyAgdmlydHVhbCBpbnQzMl90IFByb2Nlc3NFdmVudChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0pOw0KIA0KLSAgICBDWEZBX05vZGUqCQlDcmVhdGVQdXNoQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCi0gICAgQ1hGQV9Ob2RlKgkJQ3JlYXRlQ2hlY2tCdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQlDcmVhdGVFeGNsR3JvdXAoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQlDcmVhdGVSYWRpb0J1dHRvbihDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCUNyZWF0ZURhdGV0aW1lRWRpdChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCUNyZWF0ZURlY2ltYWxGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCUNyZWF0ZU51bWVyaWNGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCUNyZWF0ZVNpZ25hdHVyZShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCUNyZWF0ZVRleHRFZGl0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCi0gICAgQ1hGQV9Ob2RlKgkJQ3JlYXRlRHJvcGRvd25MaXN0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCi0gICAgQ1hGQV9Ob2RlKgkJQ3JlYXRlTGlzdEJveChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCUNyZWF0ZUltYWdlRmllbGQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQlDcmVhdGVQYXNzd29yZEVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQlDcmVhdGVGaWVsZChYRkFfRUxFTUVOVCBlRWxlbWVudCwgQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQlDcmVhdGVBcmMoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQlDcmVhdGVSZWN0YW5nbGUoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQlDcmVhdGVJbWFnZShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCUNyZWF0ZUxpbmUoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQlDcmVhdGVUZXh0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCi0gICAgQ1hGQV9Ob2RlKgkJQ3JlYXRlRHJhdyhYRkFfRUxFTUVOVCBlRWxlbWVudCwgQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX05vZGUqIENyZWF0ZVdpZGdldEZvcm1JdGVtKFhGQV9XSURHRVRUWVBFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQogDQotICAgIENYRkFfTm9kZSoJCUNyZWF0ZVN1YmZvcm0oQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQlDcmVhdGVGb3JtSXRlbShYRkFfRUxFTUVOVCBlRWxlbWVudCwgQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQkJQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlID0gTlVMTCkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCQlDcmVhdGVUZW1wbGF0ZU5vZGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCi0gICAgQ1hGQV9Ob2RlKgkJCUNyZWF0ZUZvbnROb2RlKENYRkFfTm9kZSogcFBhcmVudCkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCQlDcmVhdGVNYXJnaW5Ob2RlKENYRkFfTm9kZSogcFBhcmVudCwgRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZkluc2V0c1s0XSkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCQlDcmVhdGVWYWx1ZU5vZGUoWEZBX0VMRU1FTlQgZVZhbHVlLCBDWEZBX05vZGUqIHBQYXJlbnQpIGNvbnN0Ow0KLSAgICBJWEZBX09iakZhY3RvcnkqCUdldE9iakZhY3RvcnkoKSBjb25zdDsNCi0gICAgQ1hGQV9Eb2N1bWVudCoJCUdldFhGQURvYygpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVQdXNoQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgIENYRkFfTm9kZSogQ3JlYXRlQ2hlY2tCdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVFeGNsR3JvdXAoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVSYWRpb0J1dHRvbihDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZURhdGV0aW1lRWRpdChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZURlY2ltYWxGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZU51bWVyaWNGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZVNpZ25hdHVyZShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZVRleHRFZGl0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgIENYRkFfTm9kZSogQ3JlYXRlRHJvcGRvd25MaXN0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgIENYRkFfTm9kZSogQ3JlYXRlTGlzdEJveChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZUltYWdlRmllbGQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVQYXNzd29yZEVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVBcmMoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVSZWN0YW5nbGUoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVJbWFnZShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZUxpbmUoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVUZXh0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgIENYRkFfTm9kZSogQ3JlYXRlRHJhdyhYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCiANCi0gICAgQ1hGQV9GRkRvY1ZpZXcqCQltX3BEb2NWaWV3Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVTdWJmb3JtKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgIENYRkFfTm9kZSogQ3JlYXRlRm9ybUl0ZW0oWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgIENYRkFfTm9kZSogQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlID0gTlVMTCkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZVRlbXBsYXRlTm9kZShYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZUZvbnROb2RlKENYRkFfTm9kZSogcFBhcmVudCkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZU1hcmdpbk5vZGUoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkluc2V0c1s0XSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZVZhbHVlTm9kZShYRkFfRUxFTUVOVCBlVmFsdWUsIENYRkFfTm9kZSogcFBhcmVudCkgY29uc3Q7DQorICBJWEZBX09iakZhY3RvcnkqIEdldE9iakZhY3RvcnkoKSBjb25zdDsNCisgIENYRkFfRG9jdW1lbnQqIEdldFhGQURvYygpIGNvbnN0Ow0KKw0KKyAgQ1hGQV9GRkRvY1ZpZXcqIG1fcERvY1ZpZXc7DQogfTsNCi1jbGFzcyBDWEZBX0ZGTWVudUhhbmRsZXIgOiBwdWJsaWMgSVhGQV9NZW51SGFuZGxlcg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRkZNZW51SGFuZGxlcigpOw0KLSAgICB+Q1hGQV9GRk1lbnVIYW5kbGVyKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ29weShJWEZBX1dpZGdldCogaFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuQ3V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5QYXN0ZShJWEZBX1dpZGdldCogaFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ2FuU2VsZWN0QWxsKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDYW5EZWxldGUoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhbkRlU2VsZWN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDb3B5KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlDdXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVBhc3RlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUZXh0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZWxlY3RBbGwoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlbGV0ZShJWEZBX1dpZGdldCogaFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVTZWxlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblVuZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNhblJlZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVVuZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFN1Z2dlc3RXb3JkcyhJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1BvaW50RiBwb2ludGYsIENGWF9CeXRlU3RyaW5nQXJyYXkgJnNTdWdnZXN0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlSZXBsYWNlU3BlbGxDaGVja1dvcmQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9Qb2ludEYgcG9pbnRmLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSk7DQorY2xhc3MgQ1hGQV9GRk1lbnVIYW5kbGVyIDogcHVibGljIElYRkFfTWVudUhhbmRsZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGTWVudUhhbmRsZXIoKTsNCisgIH5DWEZBX0ZGTWVudUhhbmRsZXIoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5Db3B5KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5DdXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblBhc3RlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5TZWxlY3RBbGwoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbkRlbGV0ZShJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuRGVTZWxlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIENvcHkoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdmlydHVhbCBGWF9CT09MIEN1dChJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFzdGUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNlbGVjdEFsbChJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEZVNlbGVjdChJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuVW5kbyhJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuUmVkbyhJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbyhJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbyhJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0U3VnZ2VzdFdvcmRzKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlcGxhY2VTcGVsbENoZWNrV29yZChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mb250bWdyLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mb250bWdyLmNwcAppbmRleCA4ODkyNmJkLi4yZWJhNzY0IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZm9udG1nci5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZvbnRtZ3IuY3BwCkBAIC0xMiwxMzczICsxMiwyMTI5IEBACiAjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCiBzdGF0aWMgY29uc3QgWEZBX0ZPTlRJTkZPIGdfWEZBRm9udHNNYXBbXSA9IHsNCi0gICAgezB4MDFkNWQzM2UsCUwiU2ltU3VuIiwJTCJBcmlhbCIsCTAsCTkzNn0sDQotICAgIHsweDAxZTRmMTAyLAlMIllvdVl1YW4iLAlMIkFyaWFsIiwJMSwJOTM2fSwNCi0gICAgezB4MDMwNTQ5ZGMsCUwiTGlTdSIsCUwiQXJpYWwiLAkxLAk5MzZ9LA0KLSAgICB7MHgwMzJlZGQ0NCwJTCJTaW1oZWkiLAlMIkFyaWFsIiwJMSwJOTM2fSwNCi0gICAgezB4MDNlYWM2ZmMsCUwiUG9vclJpY2hhcmQtUmVndWxhciIsCUwiQXJpYWwiLAkyLAkxMjUyfSwNCi0gICAgezB4MDNlZDkwZTYsCUwiTmluYSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4MDc3YjU2YjMsCUwiS2luZ3NvZnRQaG9uZXRpY1BsYWluIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHgwNzhlZDUyNCwJTCJNaWNyb3NvZnRTYW5zU2VyaWYiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDA4OWIxOGE5LAlMIkFyaWFsIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHgwYjJjYWQ3MiwJTCJNb25vdHlwZUNvcnNpdmEiLAlMIkFyaWFsIiwJOCwJMTI1Mn0sDQotICAgIHsweDBiYjAwM2U3LAlMIkthcnRpa2EiLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDBiYjQ2OWRmLAlMIlZpbmVySGFuZElUQyIsCUwiQXJpYWwiLAk4LAkxMjUyfSwNCi0gICAgezB4MGJjMWE4NTEsCUwiU2Vnb2VVSSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4MGMxMTJlYmQsCUwiS296dWthR290aGljUHJvLVZJTSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4MGNmY2I5YzEsCUwiQWRvYmVUaGFpIiwJTCJLb2tpbGEsQXJpYWwgTmFycm93IiwJMCwJODQ3fSwNCi0gICAgezB4MGU3ZGUwZjksCUwiUGxheWJpbGwiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDBlZmY0N2MzLAlMIlNUSHVwbyIsCUwiQXJpYWwiLAkwLAk5MzZ9LA0KLSAgICB7MHgxMDdhZDM3NCwJTCJDb25zdGFudGlhIiwJTCJBcmlhbCIsCTIsCTEyNTJ9LA0KLSAgICB7MHgxMjE5NGMyZCwJTCJLdW5zdGxlclNjcmlwdCIsCUwiQXJpYWwiLAk4LAkxMjUyfSwNCi0gICAgezB4MTM1ZWY2YTEsCUwiTWluaW9uUHJvU21CZCIsCUwiQmVsbCBNVCxDb3JiZWwsVGltZXMgTmV3IFJvbWFuLENhbWJyaWEsQmVybGluIFNhbnMgRkIiLAkwLAkxMjUyfSwNCi0gICAgezB4MTU4YzQwNDksCUwiR2FyYW1vbmQiLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDE2MGVjYjI0LAlMIlNUWmhvbmdzb25nIiwJTCJBcmlhbCIsCTAsCTkzNn0sDQotICAgIHsweDE2MWVkMDdlLAlMIk1TR290aGljIiwJTCJBcmlhbCIsCTEsCTEyNTJ9LA0KLSAgICB7MHgxNzFkMWVkMSwJTCJTbmFwSVRDLVJlZ3VsYXIiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDE4ZDExODhmLAlMIkNhbWJyaWEiLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDE4ZWFmMzUwLAlMIkFyaWFsVW5pY29kZU1TIiwJTCJBcmlhbCIsCTAsCTkzNn0sDQotICAgIHsweDFhOTJkMTE1LAlMIk1pbmdMaVUiLAlMIkFyaWFsIiwJMSwJMTI1Mn0sDQotICAgIHsweDFjYzIxN2M2LAlMIlRyZWJ1Y2hldE1TIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHgxZDY0OTU5NiwJTCJCYXNlbWljVGltZXMiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDFlMzRlZTYwLAlMIkJlbGxNVCIsCUwiQXJpYWwiLAkyLAkxMjUyfSwNCi0gICAgezB4MWViMzY5NDUsCUwiQ29vcGVyQmxhY2siLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDFlZjc3ODdkLAlMIkJhdGFuZ0NoZSIsCUwiQXJpYWwiLAkxLAkxMjUyfSwNCi0gICAgezB4MjBiM2JkM2EsCUwiQnJ1c2hTY3JpcHRNVCIsCUwiQXJpYWwiLAk4LAkxMjUyfSwNCi0gICAgezB4MjIwODc3YWEsCUwiQ2FuZGFyYSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4MjIxMzUwMDcsCUwiRnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIiLAlMIkFyaWFsIiwJOCwJMTI1Mn0sDQotICAgIHsweDI1MTA1OWMzLAlMIkNoaWxsZXIiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDI1YmVkNmRkLAlMIk1TUmVmZXJlbmNlU2Fuc1NlcmlmIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHgyODE1NGM4MSwJTCJQYXJjaG1lbnQtUmVndWxhciIsCUwiQXJpYWwiLAk4LAkxMjUyfSwNCi0gICAgezB4Mjk3MTFlYjksCUwiU1RMaXRpIiwJTCJBcmlhbCIsCTAsCTkzNn0sDQotICAgIHsweDJiMTk5M2I0LAlMIkJhc2VtaWMiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDJiMzE2MzM5LAlMIk5pYWdhcmFTb2xpZC1SZWciLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDJjMTQ3NTI5LAlMIkZvb3RsaWdodE1UTGlnaHQiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDJjMTk4OTI4LAlMIkhhcmxvd1NvbGlkIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHgyYzZhYzZiMiwJTCJMdWNpZGFCcmlnaHQiLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDJjOWYzOGUyLAlMIktvenVrYU1pbmNob1Byby1WSVIiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDJkNWE0N2IwLAlMIlNUQ2FpeXVuIiwJTCJBcmlhbCIsCTAsCTkzNn0sDQotICAgIHsweDJkZWYyNmJmLAlMIkJlcm5hcmRNVC1Db25kZW5zZWQiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDJmZDg5MzBiLAlMIktvenVrYU1pbmNob1ByNk5SIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzMTE1NTI1YSwJTCJGYW5nU29uZ19HQjIzMTIiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDMxMzI3ODE3LAlMIk15cmlhZFBybyIsCUwiQ2FsaWJyaSxDb3JiZWwsQ2FuZGFyYSxDYW1icmlhIE1hdGgsRnJhbmtsaW4gR290aGljIE1lZGl1bSxBcmlhbCBOYXJyb3csVGltZXMgTmV3IFJvbWFuIiwJMCwJMTI1Mn0sDQotICAgIHsweDMyMjQ0OTc1LCAgICBMIkhlbHZldGljYSIsIEwiQXJpYWwiLAkgMCwgICAxMjUyfSwNCi0gICAgezB4MzJhYzk5NWMsCUwiVGVybWluYWwiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDMzOGQ2NDhhLAlMIk5pYWdhcmFFbmdyYXZlZC1SZWciLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDMzYmI2NWYyLAlMIlN5bGZhZW4iLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDM0MDJjMzBlLAlMIk1TUE1pbmNobyIsCUwiQXJpYWwiLAkyLAkxMjUyfSwNCi0gICAgezB4MzQxMmJmMzEsCUwiU2ltU3VuLVBVQSIsCUwiQXJpYWwiLAkwLAk5MzZ9LA0KLSAgICB7MHgzNmViMzliOSwJTCJCZXJsaW5TYW5zRkIiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDM2ZjQyMDU1LAlMIlVuaXZlcnNBVFQiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDM4NjRjNGY2LAlMIkhpZ2hUb3dlclRleHQiLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDNhMjU3ZDAzLAlMIkZhbmdTb25nX0dCMjMxMiIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4M2NkYWU2NjgsCUwiRnJlZXN0eWxlU2NyaXB0IiwJTCJBcmlhbCIsCTgsCTEyNTJ9LA0KLSAgICB7MHgzZDU1YWVkNywJTCJKb2tlcm1hbiIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4M2Q1YjQzODUsCUwiUE1pbmdMaVUiLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDNkOWI3NjY5LAlMIkVzdHJhbmdlbG9FZGVzc2EiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDNlNTMyZDc0LAlMIkZyYW5rbGluR290aGljTWVkaXVtIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzZTZhYTMyZCwJTCJOU2ltU3VuIiwJTCJBcmlhbCIsCTEsCTkzNn0sDQotICAgIHsweDNmNmMzNmE4LAlMIkdhdXRhbWkiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDNmZjMyNjYyLAlMIkNoaWxsZXItUmVndWxhciIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4NDA5ZGUzMTIsCUwiTW9kZXJuTm8uMjAiLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDQxNDQzYzVlLAlMIkdlb3JnaWEiLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDQxNjBhZGU1LAlMIkJlbGxHb3RoaWNTdGRCbGFjayIsCUwiQXJpYWwsQXJpYWwgVW5pY29kZSBNUyxCb29rIEFudGlxdWEsRG90dW0sR2VvcmdpYSIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0MjE5NzZjNCwJTCJNb2Rlcm4tUmVndWxhciIsCUwiQXJpYWwiLAkyLAkxMjUyfSwNCi0gICAgezB4NDIyYTcyNTIsCUwiU3RlbmNpbCIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4NDJjODU1NGYsCUwiRml4ZWRzeXMiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDQzNWNiNDFkLAlMIlJvbWFuIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0Nzg4MjM4MywJTCJDb3VyaWVyTmV3IiwJTCJBcmlhbCIsCTEsCTEyNTJ9LA0KLSAgICB7MHg0ODBhMjMzOCwJTCJCZXJsaW5TYW5zRkJEZW1pIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0ODBiZjdhNCwJTCJDb3VyaWVyU3RkIiwJTCJDb3VyaWVyIE5ldyxWZXJkYW5hIiwJMCwJMTI1Mn0sDQotICAgIHsweDQ4MWFkNmVkLAlMIlZsYWRpbWlyU2NyaXB0IiwJTCJBcmlhbCIsCTgsCTEyNTJ9LA0KLSAgICB7MHg0OTExNTc3YSwJTCJZb3VZdWFuIiwJTCJBcmlhbCIsCTEsCTkzNn0sDQotICAgIHsweDRhNzg4ZDcyLAlMIlNUWGluZ2thaSIsCUwiQXJpYWwiLAkwLAk5MzZ9LA0KLSAgICB7MHg0YmY4ODU2NiwJTCJTZWdvZUNvbmRlbnNlZCIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4NGNjZjUxYTQsCUwiQmVybGluU2Fuc0ZCLVJlZyIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4NGVhOTY3Y2UsCUwiR3VsaW1DaGUiLAlMIkFyaWFsIiwJMSwJMTI1Mn0sDQotICAgIHsweDRmNjhiZDc5LAlMIkxldHRlckdvdGhpY1N0ZCIsCUwiQ291cmllciBOZXcsVmVyZGFuYSIsCTAsCTEyNTJ9LA0KLSAgICB7MHg1MWEwZDBlNiwJTCJLb3p1a2FHb3RoaWNQcjZOTSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4NTMxYjNkZWEsCUwiQmFzZW1pY1N5bWJvbCIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4NTMzM2ZkMzksCUwiQ2FsaWZvcm5pYW5GQi1SZWciLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDUzNTYxYTU0LAlMIkZaWVRLLS1HQksxLTAiLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4NTVlMGRkZTYsCUwiTHVjaWRhU2Fuc1R5cGV3cml0ZXIiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDU3NGQ0ZDNkLAlMIkFkb2JlQXJhYmljIiwJTCJBcmlhbCBOYXJyb3ciLAkwLAkxMjUyfSwNCi0gICAgezB4NTc5MmU3NTksCUwiU1RLYWl0aSIsCUwiQXJpYWwiLAkwLAk5MzZ9LA0KLSAgICB7MHg1OTIxOTc4ZSwJTCJMdWNpZGFTYW5zVW5pY29kZSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4NTk0ZTJkYTQsCUwiVnJpbmRhIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg1OWJhYTlhMiwJTCJLYWlUaV9HQjIzMTIiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDVjZmVkZjRmLAlMIkJhc2tPbGRGYWNlIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg1Zjk3OTIxYywJTCJBZG9iZU15dW5nam9TdGRNIiwJTCJCYXRhbmcsQm9va21hbiBPbGQgU3R5bGUsQ29uc29sYXMsU1RaaG9uZ3NvbmciLAkwLAk5MzZ9LA0KLSAgICB7MHg1ZmVmYmZhZCwJTCJCYXRhbmciLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDYwNTM0MmI5LAlMIkRvdHVtQ2hlIiwJTCJBcmlhbCIsCTEsCTEyNTJ9LA0KLSAgICB7MHg2MDhjNWY5YSwJTCJLYWlUaV9HQjIzMTIiLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4NjFlZmQwZDEsCUwiTWF0dXJhTVRTY3JpcHRDYXBpdGFscyIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4NjI2NjA4YTksCUwiTVZCb2xpIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg2MzA1MDFhMywJTCJTbWFsbEZvbnRzIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg2NWQwZTJhOSwJTCJGWllUSy0tR0JLMS0wIiwJTCJBcmlhbCIsCTAsCTkzNn0sDQotICAgIHsweDY2OWYyOWUxLAlMIkZaU1RLLS1HQksxLTAiLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4NjczYTllNWYsCUwiVHVuZ2EiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDY5MWFhNGNlLAlMIk5pYWdhcmFTb2xpZCIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4Njk2MjU5YjcsCUwiQ29yYmVsIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg2OTZlZTliZSwJTCJTVFhpaGVpIiwJTCJBcmlhbCIsCTAsCTkzNn0sDQotICAgIHsweDZjNTljZjY5LAlMIkRvdHVtIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3MDdmYTU2MSwJTCJHdW5nc3VoIiwJTCJBcmlhbCIsCTIsCTEyNTJ9LA0KLSAgICB7MHg3MTQxNmJiMiwJTCJaV0Fkb2JlRiIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4NzFiNDE4MDEsCUwiVmVyZGFuYSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4NzNmMjVlNGMsCUwiUGFsYXRpbm9MaW5vdHlwZSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4NzNmNGQxOWYsCUwiTmlhZ2FyYUVuZ3JhdmVkIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3NDAwMTY5NCwJTCJNeXJpYWRQcm9CbGFjayIsCUwiQm9vayBBbnRpcXVhLENvbnN0YW50aWEsRG90dW0sR2VvcmdpYSIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3NGIxNGQ4ZiwJTCJIYWV0dGVuc2Nod2VpbGVyIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3NGNiNDRlZSwJTCJOU2ltU3VuIiwJTCJBcmlhbCIsCTEsCTkzNn0sDQotICAgIHsweDc2YjRkN2ZmLAlMIlNocnV0aSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4Nzg4YjM1MzMsCUwiV2ViZGluZ3MiLAlMIkFyaWFsIiwJNiwJNDJ9LA0KLSAgICB7MHg3OTdkZGU5OSwJTCJNU1NlcmlmIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3YTBmOWU5ZSwJTCJNU01pbmNobyIsCUwiQXJpYWwiLAkxLAkxMjUyfSwNCi0gICAgezB4N2I0MzljYWYsCUwiT2xkRW5nbGlzaFRleHRNVCIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ODIxM2E0MzMsCUwiTHVjaWRhU2Fucy1UeXBld3JpdGVyIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4MmZlYzkyOSwJTCJBZG9iZVNvbmdTdGRMIiwJTCJDZW50YXVyLENhbGlicmksU1RTb25nLEJlbGwgTVQsR2FyYW1vbmQsVGltZXMgTmV3IFJvbWFuIiwJMCwJOTM2fSwNCi0gICAgezB4ODM1ODE4MjUsCUwiTW9kZXJuIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4MzVhMjgyMywJTCJBbGdlcmlhbiIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ODNkYWI5ZjUsCUwiU2NyaXB0IiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4NDdiNTZkYSwJTCJUYWhvbWEiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDhhNzgzY2IyLAlMIlNpbVN1bi1QVUEiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDhiNWNhYzBlLAlMIk9ueXgiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDhjNmE0OTllLAlMIkd1bGltIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4ZTBhZjc5MCwJTCJKdWljZUlUQyIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4OGU4ZDQzYjIsCUwiQ2VudGF1ciIsCUwiQXJpYWwiLAkyLAkxMjUyfSwNCi0gICAgezB4OGVlNGRjY2EsCUwiQm9va3NoZWxmU3ltYm9sNyIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4OTA3OTQ4MDAsCUwiQmVsbEdvdGhpY1N0ZExpZ2h0IiwJTCJCZWxsIE1ULENhbGlicmksVGltZXMgTmV3IFJvbWFuIiwJMCwJMTI1Mn0sDQotICAgIHsweDkwOWI1MTZhLAlMIkNlbnR1cnkiLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDkyYWUzNzBkLAlMIk1TT3V0bG9vayIsCUwiQXJpYWwiLAk0LAk0Mn0sDQotICAgIHsweDkzYzlmYmYxLAlMIkx1Y2lkYUZheCIsCUwiQXJpYWwiLAkyLAkxMjUyfSwNCi0gICAgezB4OTU2NTA4NWUsCUwiQm9va0FudGlxdWEiLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweDk4NTZkOTVkLAlMIkFkb2JlTWluZ1N0ZEwiLAlMIkFyaWFsLEFyaWFsIFVuaWNvZGUgTVMsQ2FtYnJpYSxCYXRhbmdDaGUiLAkwLAk5NDl9LA0KLSAgICB7MHg5YmJhZGQ2YiwJTCJDb2xvbm5hTVQiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweDljYmQxNmE0LAlMIlNob3djYXJkR290aGljLVJlZyIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4OWQ3MzAwOGUsCUwiTVNTYW5zU2VyaWYiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGEwNjA3ZGIxLAlMIkd1bmdzdWhDaGUiLAlMIkFyaWFsIiwJMSwJMTI1Mn0sDQotICAgIHsweGEwYmNmNmExLAlMIkxhdGluV2lkZSIsCUwiQXJpYWwiLAkyLAkxMjUyfSwNCi0gICAgezB4YTE0MjliMzYsCUwiU3ltYm9sIiwJTCJBcmlhbCIsCTYsCTQyfSwNCi0gICAgezB4YTFmYTVhYmMsCUwiV2luZ2RpbmdzMiIsCUwiQXJpYWwiLAk2LAk0Mn0sDQotICAgIHsweGExZmE1YWJkLAlMIldpbmdkaW5nczMiLAlMIkFyaWFsIiwJNiwJNDJ9LA0KLSAgICB7MHhhNDI3YmFkNCwJTCJJbmZvcm1hbFJvbWFuLVJlZ3VsYXIiLAlMIkFyaWFsIiwJOCwJMTI1Mn0sDQotICAgIHsweGE4YjkyZWNlLAlMIkZaU1RLLS1HQksxLTAiLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4YThkODNlY2UsCUwiQ2FsaWZvcm5pYW5GQiIsCUwiQXJpYWwiLAkyLAkxMjUyfSwNCi0gICAgezB4YWEzZTA4MmMsCUwiS2luZ3NvZnQtUGhvbmV0aWMiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGFhNmJjYWJlLAlMIkhhcmxvd1NvbGlkSXRhbGljIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHhhZGU1MzM3YywJTCJNU1VJR290aGljIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHhiMDhkZDk0MSwJTCJXaWRlTGF0aW4iLAlMIkFyaWFsIiwJMiwJMTI1Mn0sDQotICAgIHsweGIyMDdmMDVkLAlMIlBvb3JSaWNoYXJkIiwJTCJBcmlhbCIsCTIsCTEyNTJ9LA0KLSAgICB7MHhiM2JjNDkyZiwJTCJKdWljZUlUQy1SZWd1bGFyIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHhiNTU0NTM5OSwJTCJNYXJsZXR0IiwJTCJBcmlhbCIsCTQsCTQyfSwNCi0gICAgezB4YjVkZDFlYmIsCUwiQnJpdGFubmljQm9sZCIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4YjY5OWMxYzUsCUwiTHVjaWRhQ2FsbGlncmFwaHktSXRhbGljIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHhiNzI1ZDYyOSwJTCJUaW1lc05ld1JvbWFuIiwJTCJBcmlhbCIsCTIsCTEyNTJ9LA0KLSAgICB7MHhiN2VhZWJlYiwJTCJBZG9iZUhlaXRpU3RkUiIsCUwiQmF0YW5nLENlbnR1cnksRG90dW0iLAkwLAk5MzZ9LA0KLSAgICB7MHhiZDI5YzQ4NiwJTCJCZXJsaW5TYW5zRkJEZW1pLUJvbGQiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGJlOGE4ZGI0LAlMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjMTZjMDExOCwJTCJBZG9iZUhlYnJldyIsCUwiQmVsbCBNVCxCZXJsaW4gU2FucyBGQixDYWxpYnJpIiwJMCwJMTI1Mn0sDQotICAgIHsweGMzMThiMGFmLAlMIk15cmlhZFByb0xpZ2h0IiwJTCJDYWxpYnJpLFNURmFuZ3NvbmcsVGltZXMgTmV3IFJvbWFuIiwJMCwJMTI1Mn0sDQotICAgIHsweGM2NWU1NjU5LAlMIkNhbWJyaWFNYXRoIiwJTCJBcmlhbCIsCTIsCTEyNTJ9LA0KLSAgICB7MHhjNzVjOGYwNSwJTCJMdWNpZGFDb25zb2xlIiwJTCJBcmlhbCIsCTEsCTEyNTJ9LA0KLSAgICB7MHhjYTdjMzVkNiwJTCJDYWxpYnJpIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjYjA1M2Y1MywJTCJNaWNyb3NvZnRZYUhlaSIsCUwiQXJpYWwiLAkwLAk5MzZ9LA0KLSAgICB7MHhjYjcxOTBmOSwJTCJNYWduZXRvLUJvbGQiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGNjYTAwY2M1LAlMIlN5c3RlbSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4Y2NhZDZmNzYsCUwiSm9rZXJtYW4tUmVndWxhciIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4Y2NjNTgxOGMsCUwiRXVyb1NpZ24iLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGNmM2Q3MjM0LAlMIkx1Y2lkYUhhbmR3cml0aW5nLUl0YWxpYyIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4Y2Y3YjhmZGIsCUwiTWluaW9uUHJvIiwJTCJCZWxsIE1ULENvcmJlbCxUaW1lcyBOZXcgUm9tYW4sQ2FtYnJpYSxCZXJsaW4gU2FucyBGQiIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjZmU1NzU1ZiwJTCJTaW1oZWkiLAlMIkFyaWFsIiwJMSwJOTM2fSwNCi0gICAgezB4ZDAxMWY0ZWUsCUwiTVNQR290aGljIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHhkMDYwZTdlZiwJTCJWaXZhbGRpIiwJTCJBcmlhbCIsCTgsCTEyNTJ9LA0KLSAgICB7MHhkMDdlZGVjMSwJTCJGcmFua2xpbkdvdGhpYy1NZWRpdW0iLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGQxMDcyNDNmLAlMIlNpbVN1biIsCUwiQXJpYWwiLAkwLAk5MzZ9LA0KLSAgICB7MHhkMTg4MTU2MiwJTCJBcmlhbE5hcnJvdyIsCUwiQXJpYWwgTmFycm93IiwJMCwJMTI1Mn0sDQotICAgIHsweGQyMmI3ZGNlLAlMIkJvZG9uaU1UUG9zdGVyQ29tcHJlc3NlZCIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZDIyYmZhNjAsCUwiQ29taWNTYW5zTVMiLAlMIkFyaWFsIiwJOCwJMTI1Mn0sDQotICAgIHsweGQzYmQwZTM1LAlMIkJhdWhhdXM5MyIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZDQyOWVlN2EsCUwiU1RGYW5nc29uZyIsCUwiQXJpYWwiLAkwLAk5MzZ9LA0KLSAgICB7MHhkNjY3OWMxMiwJTCJCZXJuYXJkTVRDb25kZW5zZWQiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGQ4ZThhMDI3LAlMIkx1Y2lkYVNhbnMiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGQ5ZmU3NzYxLAlMIkhpZ2hUb3dlclRleHQtUmVnIiwJTCJBcmlhbCIsCTIsCTEyNTJ9LA0KLSAgICB7MHhkYTdlNTUxZSwJTCJTVFNvbmciLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4ZGFhNjg0MmQsCUwiU1RaaG9uZ3NvbmciLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4ZGFhYWI5M2YsCUwiU1RGYW5nc29uZyIsCUwiQXJpYWwiLAkwLAk5MzZ9LA0KLSAgICB7MHhkYWViMDcxMywJTCJTVFNvbmciLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4ZGFmZWRiZWYsCUwiU1RDYWl5dW4iLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4ZGIwMGEzZDksCUwiQnJvYWR3YXkiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGRiMWY1YWQ0LAlMIlNUWGlud2VpIiwJTCJBcmlhbCIsCTAsCTkzNn0sDQotICAgIHsweGRiMzI2ZTdmLAlMIlNUS2FpdGkiLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4ZGI2OTU5NWEsCUwiU1RIdXBvIiwJTCJBcmlhbCIsCTAsCTkzNn0sDQotICAgIHsweGRiYTAwODJjLAlMIlNUWGloZWkiLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4ZGJkMGFiMTgsCUwiU1RYaW5na2FpIiwJTCJBcmlhbCIsCTAsCTkzNn0sDQotICAgIHsweGRjMWE3ZGIxLAlMIlNUTGl0aSIsCUwiQXJpYWwiLAkwLAk5MzZ9LA0KLSAgICB7MHhkYzMzMDc1ZiwJTCJLcmlzdGVuSVRDLVJlZ3VsYXIiLAlMIkFyaWFsIiwJOCwJMTI1Mn0sDQotICAgIHsweGRjYzcwMDljLAlMIkhhcnJpbmd0b24iLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGRkNzEyNDY2LAlMIkFyaWFsQmxhY2siLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGRkZTg3YjNlLAlMIkltcGFjdCIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZGY2OWZiMzIsCUwiU25hcElUQyIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZGY4YjI1ZTgsCUwiQ2VudHVyeUdvdGhpYyIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZTBmNzA1YzAsCUwiS3Jpc3RlbklUQyIsCUwiQXJpYWwiLAk4LAkxMjUyfSwNCi0gICAgezB4ZTE0Mjc1NzMsCUwiUmFhdmkiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGUyY2VhMGNiLAlMIk1hZ25ldG8iLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGUzNmE5ZTE3LAlMIlJhdmllIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHhlNDMzZjhlMiwJTCJQYXJjaG1lbnQiLAlMIkFyaWFsIiwJOCwJMTI1Mn0sDQotICAgIHsweGU0M2RmZjRhLAlMIldpbmdkaW5ncyIsCUwiQXJpYWwiLAk0LAk0Mn0sDQotICAgIHsweGU0ZTJjNDA1LAlMIk1URXh0cmEiLAlMIkFyaWFsIiwJNiwJNDJ9LA0KLSAgICB7MHhlNjE4Y2MzNSwJTCJJbmZvcm1hbFJvbWFuIiwJTCJBcmlhbCIsCTgsCTEyNTJ9LA0KLSAgICB7MHhlNmMyN2ZmYywJTCJNaXN0cmFsIiwJTCJBcmlhbCIsCTgsCTEyNTJ9LA0KLSAgICB7MHhlN2ViZjRiOSwJTCJDb3VyaWVyIiwJTCJDb3VyaWVyIE5ldyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhlOGJjNGE5ZCwJTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZTkwZmIwMTMsCUwiVGVtcHVzU2Fuc0lUQyIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZWM2MzdiNDIsCUwiQ29uc29sYXMiLAlMIlZlcmRhbmEiLAkxLAkxMjUyfSwNCi0gICAgezB4ZWQzYTY4M2IsCUwiU1RYaW53ZWkiLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4ZWYyNjRjZDEsCUwiTHVjaWRhSGFuZHdyaXRpbmciLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGYwODZiY2EyLAlMIkJhc2tlcnZpbGxlT2xkRmFjZSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZjEwMjgwMzAsCUwiTWFuZ2FsIiwJTCJBcmlhbCIsCTIsCTEyNTJ9LA0KLSAgICB7MHhmMWRhN2ViOSwJTCJTaG93Y2FyZEdvdGhpYyIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZjIxMGYwNmEsCUwiQXJpYWxNVCIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZjQ3N2YxNmEsCUwiTGF0aGEiLAlMIkFyaWFsIiwJMCwJMTI1Mn0sDQotICAgIHsweGY2MTZmM2RkLAlMIkxpU3UiLAlMIkFyaWFsIiwJMSwJOTM2fSwNCi0gICAgezB4ZmE0NzlhYTYsCUwiTWljcm9zb2Z0WWFIZWkiLAlMIkFyaWFsIiwJMCwJOTM2fSwNCi0gICAgezB4ZmNkMTk2OTcsCUwiQm9va21hbk9sZFN0eWxlIiwJTCJBcmlhbCIsCTAsCTEyNTJ9LA0KLSAgICB7MHhmZTIwOWE4MiwJTCJMdWNpZGFDYWxsaWdyYXBoeSIsCUwiQXJpYWwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZmVmMTM1ZjgsCUwiQWRvYmVIZWl0aVN0ZC1SZWd1bGFyIiwJTCJCYXRhbmcsQ2VudHVyeSxEb3R1bSIsCTAsCTkzNn0sDQorICAgIHsweDAxZDVkMzNlLCBMIlNpbVN1biIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHgwMWU0ZjEwMiwgTCJZb3VZdWFuIiwgTCJBcmlhbCIsIDEsIDkzNn0sDQorICAgIHsweDAzMDU0OWRjLCBMIkxpU3UiLCBMIkFyaWFsIiwgMSwgOTM2fSwNCisgICAgezB4MDMyZWRkNDQsIEwiU2ltaGVpIiwgTCJBcmlhbCIsIDEsIDkzNn0sDQorICAgIHsweDAzZWFjNmZjLCBMIlBvb3JSaWNoYXJkLVJlZ3VsYXIiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDAzZWQ5MGU2LCBMIk5pbmEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDA3N2I1NmIzLCBMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MDc4ZWQ1MjQsIEwiTWljcm9zb2Z0U2Fuc1NlcmlmIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgwODliMThhOSwgTCJBcmlhbCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MGIyY2FkNzIsIEwiTW9ub3R5cGVDb3JzaXZhIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LA0KKyAgICB7MHgwYmIwMDNlNywgTCJLYXJ0aWthIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHgwYmI0NjlkZiwgTCJWaW5lckhhbmRJVEMiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sDQorICAgIHsweDBiYzFhODUxLCBMIlNlZ29lVUkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDBjMTEyZWJkLCBMIktvenVrYUdvdGhpY1Byby1WSU0iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDBjZmNiOWMxLCBMIkFkb2JlVGhhaSIsIEwiS29raWxhLEFyaWFsIE5hcnJvdyIsIDAsIDg0N30sDQorICAgIHsweDBlN2RlMGY5LCBMIlBsYXliaWxsIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgwZWZmNDdjMywgTCJTVEh1cG8iLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4MTA3YWQzNzQsIEwiQ29uc3RhbnRpYSIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4MTIxOTRjMmQsIEwiS3Vuc3RsZXJTY3JpcHQiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sDQorICAgIHsweDEzNWVmNmExLCBMIk1pbmlvblByb1NtQmQiLA0KKyAgICAgTCJCZWxsIE1ULENvcmJlbCxUaW1lcyBOZXcgUm9tYW4sQ2FtYnJpYSxCZXJsaW4gU2FucyBGQiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgxNThjNDA0OSwgTCJHYXJhbW9uZCIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4MTYwZWNiMjQsIEwiU1RaaG9uZ3NvbmciLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4MTYxZWQwN2UsIEwiTVNHb3RoaWMiLCBMIkFyaWFsIiwgMSwgMTI1Mn0sDQorICAgIHsweDE3MWQxZWQxLCBMIlNuYXBJVEMtUmVndWxhciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MThkMTE4OGYsIEwiQ2FtYnJpYSIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4MThlYWYzNTAsIEwiQXJpYWxVbmljb2RlTVMiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4MWE5MmQxMTUsIEwiTWluZ0xpVSIsIEwiQXJpYWwiLCAxLCAxMjUyfSwNCisgICAgezB4MWNjMjE3YzYsIEwiVHJlYnVjaGV0TVMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDFkNjQ5NTk2LCBMIkJhc2VtaWNUaW1lcyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MWUzNGVlNjAsIEwiQmVsbE1UIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHgxZWIzNjk0NSwgTCJDb29wZXJCbGFjayIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4MWVmNzc4N2QsIEwiQmF0YW5nQ2hlIiwgTCJBcmlhbCIsIDEsIDEyNTJ9LA0KKyAgICB7MHgyMGIzYmQzYSwgTCJCcnVzaFNjcmlwdE1UIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LA0KKyAgICB7MHgyMjA4NzdhYSwgTCJDYW5kYXJhIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyMjEzNTAwNywgTCJGcmVlc3R5bGVTY3JpcHQtUmVndWxhciIsIEwiQXJpYWwiLCA4LCAxMjUyfSwNCisgICAgezB4MjUxMDU5YzMsIEwiQ2hpbGxlciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MjViZWQ2ZGQsIEwiTVNSZWZlcmVuY2VTYW5zU2VyaWYiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDI4MTU0YzgxLCBMIlBhcmNobWVudC1SZWd1bGFyIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LA0KKyAgICB7MHgyOTcxMWViOSwgTCJTVExpdGkiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4MmIxOTkzYjQsIEwiQmFzZW1pYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MmIzMTYzMzksIEwiTmlhZ2FyYVNvbGlkLVJlZyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MmMxNDc1MjksIEwiRm9vdGxpZ2h0TVRMaWdodCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MmMxOTg5MjgsIEwiSGFybG93U29saWQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDJjNmFjNmIyLCBMIkx1Y2lkYUJyaWdodCIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4MmM5ZjM4ZTIsIEwiS296dWthTWluY2hvUHJvLVZJUiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MmQ1YTQ3YjAsIEwiU1RDYWl5dW4iLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4MmRlZjI2YmYsIEwiQmVybmFyZE1ULUNvbmRlbnNlZCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MmZkODkzMGIsIEwiS296dWthTWluY2hvUHI2TlIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDMxMTU1MjVhLCBMIkZhbmdTb25nX0dCMjMxMiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MzEzMjc4MTcsIEwiTXlyaWFkUHJvIiwNCisgICAgIEwiQ2FsaWJyaSxDb3JiZWwsQ2FuZGFyYSxDYW1icmlhIE1hdGgsRnJhbmtsaW4gR290aGljIE1lZGl1bSxBcmlhbCAiDQorICAgICBMIk5hcnJvdyxUaW1lcyBOZXcgUm9tYW4iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDMyMjQ0OTc1LCBMIkhlbHZldGljYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MzJhYzk5NWMsIEwiVGVybWluYWwiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDMzOGQ2NDhhLCBMIk5pYWdhcmFFbmdyYXZlZC1SZWciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDMzYmI2NWYyLCBMIlN5bGZhZW4iLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDM0MDJjMzBlLCBMIk1TUE1pbmNobyIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4MzQxMmJmMzEsIEwiU2ltU3VuLVBVQSIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHgzNmViMzliOSwgTCJCZXJsaW5TYW5zRkIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDM2ZjQyMDU1LCBMIlVuaXZlcnNBVFQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDM4NjRjNGY2LCBMIkhpZ2hUb3dlclRleHQiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDNhMjU3ZDAzLCBMIkZhbmdTb25nX0dCMjMxMiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4M2NkYWU2NjgsIEwiRnJlZXN0eWxlU2NyaXB0IiwgTCJBcmlhbCIsIDgsIDEyNTJ9LA0KKyAgICB7MHgzZDU1YWVkNywgTCJKb2tlcm1hbiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4M2Q1YjQzODUsIEwiUE1pbmdMaVUiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDNkOWI3NjY5LCBMIkVzdHJhbmdlbG9FZGVzc2EiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDNlNTMyZDc0LCBMIkZyYW5rbGluR290aGljTWVkaXVtIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzZTZhYTMyZCwgTCJOU2ltU3VuIiwgTCJBcmlhbCIsIDEsIDkzNn0sDQorICAgIHsweDNmNmMzNmE4LCBMIkdhdXRhbWkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDNmZjMyNjYyLCBMIkNoaWxsZXItUmVndWxhciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NDA5ZGUzMTIsIEwiTW9kZXJuTm8uMjAiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDQxNDQzYzVlLCBMIkdlb3JnaWEiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDQxNjBhZGU1LCBMIkJlbGxHb3RoaWNTdGRCbGFjayIsDQorICAgICBMIkFyaWFsLEFyaWFsIFVuaWNvZGUgTVMsQm9vayBBbnRpcXVhLERvdHVtLEdlb3JnaWEiLCAwLCAxMjUyfSwNCisgICAgezB4NDIxOTc2YzQsIEwiTW9kZXJuLVJlZ3VsYXIiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDQyMmE3MjUyLCBMIlN0ZW5jaWwiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0MzVjYjQxZCwgTCJSb21hbiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NDc4ODIzODMsIEwiQ291cmllck5ldyIsIEwiQXJpYWwiLCAxLCAxMjUyfSwNCisgICAgezB4NDgwYTIzMzgsIEwiQmVybGluU2Fuc0ZCRGVtaSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NDgwYmY3YTQsIEwiQ291cmllclN0ZCIsIEwiQ291cmllciBOZXcsVmVyZGFuYSIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0ODFhZDZlZCwgTCJWbGFkaW1pclNjcmlwdCIsIEwiQXJpYWwiLCA4LCAxMjUyfSwNCisgICAgezB4NDkxMTU3N2EsIEwiWW91WXVhbiIsIEwiQXJpYWwiLCAxLCA5MzZ9LA0KKyAgICB7MHg0YTc4OGQ3MiwgTCJTVFhpbmdrYWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4NGJmODg1NjYsIEwiU2Vnb2VDb25kZW5zZWQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDRjY2Y1MWE0LCBMIkJlcmxpblNhbnNGQi1SZWciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDRlYTk2N2NlLCBMIkd1bGltQ2hlIiwgTCJBcmlhbCIsIDEsIDEyNTJ9LA0KKyAgICB7MHg0ZjY4YmQ3OSwgTCJMZXR0ZXJHb3RoaWNTdGQiLCBMIkNvdXJpZXIgTmV3LFZlcmRhbmEiLCAwLCAxMjUyfSwNCisgICAgezB4NTFhMGQwZTYsIEwiS296dWthR290aGljUHI2Tk0iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDUzMWIzZGVhLCBMIkJhc2VtaWNTeW1ib2wiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDUzMzNmZDM5LCBMIkNhbGlmb3JuaWFuRkItUmVnIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHg1MzU2MWE1NCwgTCJGWllUSy0tR0JLMS0wIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweDU1ZTBkZGU2LCBMIkx1Y2lkYVNhbnNUeXBld3JpdGVyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1NzRkNGQzZCwgTCJBZG9iZUFyYWJpYyIsIEwiQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sDQorICAgIHsweDU3OTJlNzU5LCBMIlNUS2FpdGkiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4NTkyMTk3OGUsIEwiTHVjaWRhU2Fuc1VuaWNvZGUiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDU5NGUyZGE0LCBMIlZyaW5kYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NTliYWE5YTIsIEwiS2FpVGlfR0IyMzEyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1Y2ZlZGY0ZiwgTCJCYXNrT2xkRmFjZSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NWY5NzkyMWMsIEwiQWRvYmVNeXVuZ2pvU3RkTSIsDQorICAgICBMIkJhdGFuZyxCb29rbWFuIE9sZCBTdHlsZSxDb25zb2xhcyxTVFpob25nc29uZyIsIDAsIDkzNn0sDQorICAgIHsweDVmZWZiZmFkLCBMIkJhdGFuZyIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4NjA1MzQyYjksIEwiRG90dW1DaGUiLCBMIkFyaWFsIiwgMSwgMTI1Mn0sDQorICAgIHsweDYwOGM1ZjlhLCBMIkthaVRpX0dCMjMxMiIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHg2MWVmZDBkMSwgTCJNYXR1cmFNVFNjcmlwdENhcGl0YWxzIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg2MjY2MDhhOSwgTCJNVkJvbGkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDYzMDUwMWEzLCBMIlNtYWxsRm9udHMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDY1ZDBlMmE5LCBMIkZaWVRLLS1HQksxLTAiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4NjY5ZjI5ZTEsIEwiRlpTVEstLUdCSzEtMCIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHg2NzNhOWU1ZiwgTCJUdW5nYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NjkxYWE0Y2UsIEwiTmlhZ2FyYVNvbGlkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg2OTYyNTliNywgTCJDb3JiZWwiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDY5NmVlOWJlLCBMIlNUWGloZWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4NmM1OWNmNjksIEwiRG90dW0iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDcwN2ZhNTYxLCBMIkd1bmdzdWgiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDcxNDE2YmIyLCBMIlpXQWRvYmVGIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3MWI0MTgwMSwgTCJWZXJkYW5hIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3M2YyNWU0YywgTCJQYWxhdGlub0xpbm90eXBlIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3M2Y0ZDE5ZiwgTCJOaWFnYXJhRW5ncmF2ZWQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDc0MDAxNjk0LCBMIk15cmlhZFByb0JsYWNrIiwgTCJCb29rIEFudGlxdWEsQ29uc3RhbnRpYSxEb3R1bSxHZW9yZ2lhIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg3NGIxNGQ4ZiwgTCJIYWV0dGVuc2Nod2VpbGVyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3NGNiNDRlZSwgTCJOU2ltU3VuIiwgTCJBcmlhbCIsIDEsIDkzNn0sDQorICAgIHsweDc2YjRkN2ZmLCBMIlNocnV0aSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4Nzg4YjM1MzMsIEwiV2ViZGluZ3MiLCBMIkFyaWFsIiwgNiwgNDJ9LA0KKyAgICB7MHg3OTdkZGU5OSwgTCJNU1NlcmlmIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3YTBmOWU5ZSwgTCJNU01pbmNobyIsIEwiQXJpYWwiLCAxLCAxMjUyfSwNCisgICAgezB4N2I0MzljYWYsIEwiT2xkRW5nbGlzaFRleHRNVCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ODIxM2E0MzMsIEwiTHVjaWRhU2Fucy1UeXBld3JpdGVyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4MmZlYzkyOSwgTCJBZG9iZVNvbmdTdGRMIiwNCisgICAgIEwiQ2VudGF1cixDYWxpYnJpLFNUU29uZyxCZWxsIE1ULEdhcmFtb25kLFRpbWVzIE5ldyBSb21hbiIsIDAsIDkzNn0sDQorICAgIHsweDgzNTgxODI1LCBMIk1vZGVybiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ODM1YTI4MjMsIEwiQWxnZXJpYW4iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDgzZGFiOWY1LCBMIlNjcmlwdCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ODQ3YjU2ZGEsIEwiVGFob21hIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4YTc4M2NiMiwgTCJTaW1TdW4tUFVBIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4YjVjYWMwZSwgTCJPbnl4IiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4YzZhNDk5ZSwgTCJHdWxpbSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4OGUwYWY3OTAsIEwiSnVpY2VJVEMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDhlOGQ0M2IyLCBMIkNlbnRhdXIiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDhlZTRkY2NhLCBMIkJvb2tzaGVsZlN5bWJvbDciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDkwNzk0ODAwLCBMIkJlbGxHb3RoaWNTdGRMaWdodCIsIEwiQmVsbCBNVCxDYWxpYnJpLFRpbWVzIE5ldyBSb21hbiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4OTA5YjUxNmEsIEwiQ2VudHVyeSIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4OTJhZTM3MGQsIEwiTVNPdXRsb29rIiwgTCJBcmlhbCIsIDQsIDQyfSwNCisgICAgezB4OTNjOWZiZjEsIEwiTHVjaWRhRmF4IiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHg5NTY1MDg1ZSwgTCJCb29rQW50aXF1YSIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4OTg1NmQ5NWQsIEwiQWRvYmVNaW5nU3RkTCIsIEwiQXJpYWwsQXJpYWwgVW5pY29kZSBNUyxDYW1icmlhLEJhdGFuZ0NoZSIsDQorICAgICAwLCA5NDl9LA0KKyAgICB7MHg5YmJhZGQ2YiwgTCJDb2xvbm5hTVQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDljYmQxNmE0LCBMIlNob3djYXJkR290aGljLVJlZyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4OWQ3MzAwOGUsIEwiTVNTYW5zU2VyaWYiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGEwNjA3ZGIxLCBMIkd1bmdzdWhDaGUiLCBMIkFyaWFsIiwgMSwgMTI1Mn0sDQorICAgIHsweGEwYmNmNmExLCBMIkxhdGluV2lkZSIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4YTE0MjliMzYsIEwiU3ltYm9sIiwgTCJBcmlhbCIsIDYsIDQyfSwNCisgICAgezB4YTFmYTVhYmMsIEwiV2luZ2RpbmdzMiIsIEwiQXJpYWwiLCA2LCA0Mn0sDQorICAgIHsweGExZmE1YWJkLCBMIldpbmdkaW5nczMiLCBMIkFyaWFsIiwgNiwgNDJ9LA0KKyAgICB7MHhhNDI3YmFkNCwgTCJJbmZvcm1hbFJvbWFuLVJlZ3VsYXIiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sDQorICAgIHsweGE4YjkyZWNlLCBMIkZaU1RLLS1HQksxLTAiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4YThkODNlY2UsIEwiQ2FsaWZvcm5pYW5GQiIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4YWEzZTA4MmMsIEwiS2luZ3NvZnQtUGhvbmV0aWMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGFhNmJjYWJlLCBMIkhhcmxvd1NvbGlkSXRhbGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhhZGU1MzM3YywgTCJNU1VJR290aGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhiMDhkZDk0MSwgTCJXaWRlTGF0aW4iLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweGIyMDdmMDVkLCBMIlBvb3JSaWNoYXJkIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHhiM2JjNDkyZiwgTCJKdWljZUlUQy1SZWd1bGFyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhiNTU0NTM5OSwgTCJNYXJsZXR0IiwgTCJBcmlhbCIsIDQsIDQyfSwNCisgICAgezB4YjVkZDFlYmIsIEwiQnJpdGFubmljQm9sZCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4YjY5OWMxYzUsIEwiTHVjaWRhQ2FsbGlncmFwaHktSXRhbGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhiNzI1ZDYyOSwgTCJUaW1lc05ld1JvbWFuIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHhiN2VhZWJlYiwgTCJBZG9iZUhlaXRpU3RkUiIsIEwiQmF0YW5nLENlbnR1cnksRG90dW0iLCAwLCA5MzZ9LA0KKyAgICB7MHhiZDI5YzQ4NiwgTCJCZXJsaW5TYW5zRkJEZW1pLUJvbGQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGJlOGE4ZGI0LCBMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjMTZjMDExOCwgTCJBZG9iZUhlYnJldyIsIEwiQmVsbCBNVCxCZXJsaW4gU2FucyBGQixDYWxpYnJpIiwgMCwgMTI1Mn0sDQorICAgIHsweGMzMThiMGFmLCBMIk15cmlhZFByb0xpZ2h0IiwgTCJDYWxpYnJpLFNURmFuZ3NvbmcsVGltZXMgTmV3IFJvbWFuIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhjNjVlNTY1OSwgTCJDYW1icmlhTWF0aCIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4Yzc1YzhmMDUsIEwiTHVjaWRhQ29uc29sZSIsIEwiQXJpYWwiLCAxLCAxMjUyfSwNCisgICAgezB4Y2E3YzM1ZDYsIEwiQ2FsaWJyaSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4Y2IwNTNmNTMsIEwiTWljcm9zb2Z0WWFIZWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4Y2I3MTkwZjksIEwiTWFnbmV0by1Cb2xkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2EwMGNjNSwgTCJTeXN0ZW0iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGNjYWQ2Zjc2LCBMIkpva2VybWFuLVJlZ3VsYXIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGNjYzU4MThjLCBMIkV1cm9TaWduIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjZjNkNzIzNCwgTCJMdWNpZGFIYW5kd3JpdGluZy1JdGFsaWMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGNmN2I4ZmRiLCBMIk1pbmlvblBybyIsDQorICAgICBMIkJlbGwgTVQsQ29yYmVsLFRpbWVzIE5ldyBSb21hbixDYW1icmlhLEJlcmxpbiBTYW5zIEZCIiwgMCwgMTI1Mn0sDQorICAgIHsweGNmZTU3NTVmLCBMIlNpbWhlaSIsIEwiQXJpYWwiLCAxLCA5MzZ9LA0KKyAgICB7MHhkMDExZjRlZSwgTCJNU1BHb3RoaWMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGQwNjBlN2VmLCBMIlZpdmFsZGkiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sDQorICAgIHsweGQwN2VkZWMxLCBMIkZyYW5rbGluR290aGljLU1lZGl1bSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZDEwNzI0M2YsIEwiU2ltU3VuIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweGQxODgxNTYyLCBMIkFyaWFsTmFycm93IiwgTCJBcmlhbCBOYXJyb3ciLCAwLCAxMjUyfSwNCisgICAgezB4ZDIyYjdkY2UsIEwiQm9kb25pTVRQb3N0ZXJDb21wcmVzc2VkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkMjJiZmE2MCwgTCJDb21pY1NhbnNNUyIsIEwiQXJpYWwiLCA4LCAxMjUyfSwNCisgICAgezB4ZDNiZDBlMzUsIEwiQmF1aGF1czkzIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkNDI5ZWU3YSwgTCJTVEZhbmdzb25nIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweGQ2Njc5YzEyLCBMIkJlcm5hcmRNVENvbmRlbnNlZCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZDhlOGEwMjcsIEwiTHVjaWRhU2FucyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZDlmZTc3NjEsIEwiSGlnaFRvd2VyVGV4dC1SZWciLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweGRhN2U1NTFlLCBMIlNUU29uZyIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYWE2ODQyZCwgTCJTVFpob25nc29uZyIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYWFhYjkzZiwgTCJTVEZhbmdzb25nIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweGRhZWIwNzEzLCBMIlNUU29uZyIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYWZlZGJlZiwgTCJTVENhaXl1biIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYjAwYTNkOSwgTCJCcm9hZHdheSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZGIxZjVhZDQsIEwiU1RYaW53ZWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4ZGIzMjZlN2YsIEwiU1RLYWl0aSIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYjY5NTk1YSwgTCJTVEh1cG8iLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4ZGJhMDA4MmMsIEwiU1RYaWhlaSIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYmQwYWIxOCwgTCJTVFhpbmdrYWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4ZGMxYTdkYjEsIEwiU1RMaXRpIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweGRjMzMwNzVmLCBMIktyaXN0ZW5JVEMtUmVndWxhciIsIEwiQXJpYWwiLCA4LCAxMjUyfSwNCisgICAgezB4ZGNjNzAwOWMsIEwiSGFycmluZ3RvbiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZGQ3MTI0NjYsIEwiQXJpYWxCbGFjayIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZGRlODdiM2UsIEwiSW1wYWN0IiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkZjY5ZmIzMiwgTCJTbmFwSVRDIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkZjhiMjVlOCwgTCJDZW50dXJ5R290aGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlMGY3MDVjMCwgTCJLcmlzdGVuSVRDIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LA0KKyAgICB7MHhlMTQyNzU3MywgTCJSYWF2aSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZTJjZWEwY2IsIEwiTWFnbmV0byIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZTM2YTllMTcsIEwiUmF2aWUiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGU0MzNmOGUyLCBMIlBhcmNobWVudCIsIEwiQXJpYWwiLCA4LCAxMjUyfSwNCisgICAgezB4ZTQzZGZmNGEsIEwiV2luZ2RpbmdzIiwgTCJBcmlhbCIsIDQsIDQyfSwNCisgICAgezB4ZTRlMmM0MDUsIEwiTVRFeHRyYSIsIEwiQXJpYWwiLCA2LCA0Mn0sDQorICAgIHsweGU2MThjYzM1LCBMIkluZm9ybWFsUm9tYW4iLCBMIkFyaWFsIiwgOCwgMTI1Mn0sDQorICAgIHsweGU2YzI3ZmZjLCBMIk1pc3RyYWwiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sDQorICAgIHsweGU3ZWJmNGI5LCBMIkNvdXJpZXIiLCBMIkNvdXJpZXIgTmV3IiwgMCwgMTI1Mn0sDQorICAgIHsweGU4YmM0YTlkLCBMIk1TUmVmZXJlbmNlU3BlY2lhbHR5IiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlOTBmYjAxMywgTCJUZW1wdXNTYW5zSVRDIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlYzYzN2I0MiwgTCJDb25zb2xhcyIsIEwiVmVyZGFuYSIsIDEsIDEyNTJ9LA0KKyAgICB7MHhlZDNhNjgzYiwgTCJTVFhpbndlaSIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhlZjI2NGNkMSwgTCJMdWNpZGFIYW5kd3JpdGluZyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZjA4NmJjYTIsIEwiQmFza2VydmlsbGVPbGRGYWNlIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhmMTAyODAzMCwgTCJNYW5nYWwiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweGYxZGE3ZWI5LCBMIlNob3djYXJkR290aGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhmMjEwZjA2YSwgTCJBcmlhbE1UIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhmNDc3ZjE2YSwgTCJMYXRoYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZjYxNmYzZGQsIEwiTGlTdSIsIEwiQXJpYWwiLCAxLCA5MzZ9LA0KKyAgICB7MHhmYTQ3OWFhNiwgTCJNaWNyb3NvZnRZYUhlaSIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhmY2QxOTY5NywgTCJCb29rbWFuT2xkU3R5bGUiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGZlMjA5YTgyLCBMIkx1Y2lkYUNhbGxpZ3JhcGh5IiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhmZWYxMzVmOCwgTCJBZG9iZUhlaXRpU3RkLVJlZ3VsYXIiLCBMIkJhdGFuZyxDZW50dXJ5LERvdHVtIiwgMCwgOTM2fSwNCiB9Ow0KICNlbGlmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfDQogc3RhdGljIGNvbnN0IFhGQV9GT05USU5GTyBnX1hGQUZvbnRzTWFwW10gPSB7DQotICAgIHsweDAxZDVkMzNlLAlMIlNpbVN1biIsCUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiBQTCBVTWluZyBUVyBNQkUiLAkwLAk5MzZ9LA0KLSAgICB7MHgwMWU0ZjEwMiwJTCJZb3VZdWFuIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSIFBMIFVNaW5nIFRXIE1CRSIsCTEsCTkzNn0sDQotICAgIHsweDAzMDU0OWRjLAlMIkxpU3UiLAlMIldlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSIsCTEsCTkzNn0sDQotICAgIHsweDAzMmVkZDQ0LAlMIlNpbWhlaSIsCUwiV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMSwJOTM2fSwNCi0gICAgezB4MDNlYWM2ZmMsCUwiUG9vclJpY2hhcmQtUmVndWxhciIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLAkyLAkxMjUyfSwNCi0gICAgezB4MDNlZDkwZTYsCUwiTmluYSIsCUwiRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDA3N2I1NmIzLAlMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsCUwiVGliZXRhbiBNYWNoaW5lIFVuaSxMS0xVRyxTYW15YWsgR3VqYXJhdGksRHJvaWQgU2FucyBUaGFpLERyb2lkIFNhbnMgQXJtZW5pYW4sVW50aXRsZWQxLHV0a2FsLExvaGl0IE9yaXlhIiwJMCwJMTI1Mn0sDQotICAgIHsweDA3OGVkNTI0LAlMIk1pY3Jvc29mdFNhbnNTZXJpZiIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTAsCTEyNTJ9LA0KLSAgICB7MHgwODliMThhOSwJTCJBcmlhbCIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyBDb25kZW5zZWQsRnJlZVNlcmlmLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAkxMjUyfSwNCi0gICAgezB4MGIyY2FkNzIsCUwiTW9ub3R5cGVDb3JzaXZhIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsCTgsCTEyNTJ9LA0KLSAgICB7MHgwYmIwMDNlNywJTCJLYXJ0aWthIiwJTCJGcmVlU2FucyxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxOaW1idXMgU2FucyBMLEdhcnVkYSxGcmVlU2VyaWYsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTIsCTEyNTJ9LA0KLSAgICB7MHgwYmI0NjlkZiwJTCJWaW5lckhhbmRJVEMiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwJOCwJMTI1Mn0sDQotICAgIHsweDBiYzFhODUxLAlMIlNlZ29lVUkiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4MGMxMTJlYmQsCUwiS296dWthR290aGljUHJvLVZJTSIsCUwiRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDBjZmNiOWMxLAlMIkFkb2JlVGhhaSIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxXYXJlZSIsCTAsCTg0N30sDQotICAgIHsweDBlN2RlMGY5LAlMIlBsYXliaWxsIiwJTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDBlZmY0N2MzLAlMIlNUSHVwbyIsCUwiQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIENOIiwJMCwJOTM2fSwNCi0gICAgezB4MTA3YWQzNzQsCUwiQ29uc3RhbnRpYSIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYsV2VuUXVhbllpIE1pY3JvIEhlaSxVYnVudHUiLAkyLAkxMjUyfSwNCi0gICAgezB4MTIxOTRjMmQsCUwiS3Vuc3RsZXJTY3JpcHQiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsCTgsCTEyNTJ9LA0KLSAgICB7MHgxMzVlZjZhMSwJTCJNaW5pb25Qcm9TbUJkIiwJTCJMaWJlcmF0aW9uIFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDE1OGM0MDQ5LAlMIkdhcmFtb25kIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYsVWJ1bnR1LEZyZWVTZXJpZiIsCTIsCTEyNTJ9LA0KLSAgICB7MHgxNjBlY2IyNCwJTCJTVFpob25nc29uZyIsCUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJOTM2fSwNCi0gICAgezB4MTYxZWQwN2UsCUwiTVNHb3RoaWMiLAlMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwJMSwJMTI1Mn0sDQotICAgIHsweDE3MWQxZWQxLAlMIlNuYXBJVEMtUmVndWxhciIsCUwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxVYnVudHUgQ29uZGVuc2VkLE5pbWJ1cyBTYW5zIEwsRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4MThkMTE4OGYsCUwiQ2FtYnJpYSIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYsRnJlZU1vbm8iLAkyLAkxMjUyfSwNCi0gICAgezB4MThlYWYzNTAsCUwiQXJpYWxVbmljb2RlTVMiLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTAsCTkzNn0sDQotICAgIHsweDFhOTJkMTE1LAlMIk1pbmdMaVUiLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTEsCTEyNTJ9LA0KLSAgICB7MHgxY2MyMTdjNiwJTCJUcmVidWNoZXRNUyIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmLEZyZWVTZXJpZixVYnVudHUiLAkwLAkxMjUyfSwNCi0gICAgezB4MWQ2NDk1OTYsCUwiQmFzZW1pY1RpbWVzIiwJTCJMaWJlcmF0aW9uIFNlcmlmLFRpbWVzIE5ldyBSb21hbixEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZixVYnVudHUiLAkwLAkxMjUyfSwNCi0gICAgezB4MWUzNGVlNjAsCUwiQmVsbE1UIiwJTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUsTGliZXJhdGlvbiBTZXJpZiIsCTIsCTEyNTJ9LA0KLSAgICB7MHgxZWIzNjk0NSwJTCJDb29wZXJCbGFjayIsCUwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZU1vbm8sTGliZXJhdGlvbiBNb25vLCBXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLAkyLAkxMjUyfSwNCi0gICAgezB4MWVmNzc4N2QsCUwiQmF0YW5nQ2hlIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkxLAkxMjUyfSwNCi0gICAgezB4MjBiM2JkM2EsCUwiQnJ1c2hTY3JpcHRNVCIsCUwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNhbnMgSmFwYW5lc2UsVVJXIENoYW5jZXJ5IEwsTGliZXJhdGlvbiBTYW5zIiwJOCwJMTI1Mn0sDQotICAgIHsweDIyMDg3N2FhLAlMIkNhbmRhcmEiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4MjIxMzUwMDcsCUwiRnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIiLAlMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsCTgsCTEyNTJ9LA0KLSAgICB7MHgyNTEwNTljMywJTCJDaGlsbGVyIiwJTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4MjViZWQ2ZGQsCUwiTVNSZWZlcmVuY2VTYW5zU2VyaWYiLAlMIkRlamFWdSBTYW5zIENvbmRlbnNlZCxVYnVudHUgQ29uZGVuc2VkLERyb2lkIFNhbnMgSmFwYW5lc2UsQVIgUEwgVUthaSBISyIsCTAsCTEyNTJ9LA0KLSAgICB7MHgyODE1NGM4MSwJTCJQYXJjaG1lbnQtUmVndWxhciIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLAk4LAkxMjUyfSwNCi0gICAgezB4Mjk3MTFlYjksCUwiU1RMaXRpIiwJTCJBUiBQTCBVS2FpIEhLIiwJMCwJOTM2fSwNCi0gICAgezB4MmIxOTkzYjQsCUwiQmFzZW1pYyIsCUwiTGliZXJhdGlvbiBTZXJpZixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHgyYjMxNjMzOSwJTCJOaWFnYXJhU29saWQtUmVnIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHgyYzE0NzUyOSwJTCJGb290bGlnaHRNVExpZ2h0IiwJTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4MmMxOTg5MjgsCUwiSGFybG93U29saWQiLAlMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHgyYzZhYzZiMiwJTCJMdWNpZGFCcmlnaHQiLAlMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwJMiwJMTI1Mn0sDQotICAgIHsweDJjOWYzOGUyLAlMIktvenVrYU1pbmNob1Byby1WSVIiLAlMIkRlamFWdSBTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweDJkNWE0N2IwLAlMIlNUQ2FpeXVuIiwJTCJBUiBQTCBVS2FpIEhLIiwJMCwJOTM2fSwNCi0gICAgezB4MmRlZjI2YmYsCUwiQmVybmFyZE1ULUNvbmRlbnNlZCIsCUwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDJmZDg5MzBiLAlMIktvenVrYU1pbmNob1ByNk5SIiwJTCJEZWphVnUgU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4MzExNTUyNWEsCUwiRmFuZ1NvbmdfR0IyMzEyIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAkxMjUyfSwNCi0gICAgezB4MzEzMjc4MTcsCUwiTXlyaWFkUHJvIiwJTCJVYnVudHUgQ29uZGVuc2VkLERyb2lkIFNhbnMgSmFwYW5lc2UsIEZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzMjI0NDk3NSwgICAgTCJIZWx2ZXRpY2EiLCBMIlVidW50dSxEZWphVnUgU2FucyBDb25kZW5zZWQsTGliZXJhdGlvbiBTYW5zLExpYmVyYXRpb24gU2FucyBOYXJyb3csTmltYnVzIFNhbnMgTCIsCSAwLCAgIDEyNTJ9LA0KLSAgICB7MHgzMmFjOTk1YywJTCJUZXJtaW5hbCIsCUwiRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDMzOGQ2NDhhLAlMIk5pYWdhcmFFbmdyYXZlZC1SZWciLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDMzYmI2NWYyLAlMIlN5bGZhZW4iLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLAkyLAkxMjUyfSwNCi0gICAgezB4MzQwMmMzMGUsCUwiTVNQTWluY2hvIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwJMiwJMTI1Mn0sDQotICAgIHsweDM0MTJiZjMxLAlMIlNpbVN1bi1QVUEiLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEsiLAkwLAk5MzZ9LA0KLSAgICB7MHgzNmViMzliOSwJTCJCZXJsaW5TYW5zRkIiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZixVYnVudHUsRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDM2ZjQyMDU1LAlMIlVuaXZlcnNBVFQiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDM4NjRjNGY2LAlMIkhpZ2hUb3dlclRleHQiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwJMiwJMTI1Mn0sDQotICAgIHsweDNhMjU3ZDAzLAlMIkZhbmdTb25nX0dCMjMxMiIsCUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzYzdkMWQwNywJTCJHYXJhbW9uZDNMVFN0ZCIsICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1IENvbmRlbnNlZCxEZWphVnUgU2FucyBDb25kZW5zZWQsTGliZXJhdGlvbiBTZXJpZixVYnVudHUsRnJlZVNlcmlmIiwJMiwJMTI1Mn0sDQotICAgIHsweDNjZGFlNjY4LAlMIkZyZWVzdHlsZVNjcmlwdCIsCUwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLAk4LAkxMjUyfSwNCi0gICAgezB4M2Q1NWFlZDcsCUwiSm9rZXJtYW4iLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4M2Q1YjQzODUsCUwiUE1pbmdMaVUiLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTIsCTEyNTJ9LA0KLSAgICB7MHgzZDliNzY2OSwJTCJFc3RyYW5nZWxvRWRlc3NhIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweDNlNTMyZDc0LAlMIkZyYW5rbGluR290aGljTWVkaXVtIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLFVidW50dSIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzZTZhYTMyZCwJTCJOU2ltU3VuIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkxLAk5MzZ9LA0KLSAgICB7MHgzZjZjMzZhOCwJTCJHYXV0YW1pIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYywgbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweDNmZjMyNjYyLAlMIkNoaWxsZXItUmVndWxhciIsCUwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLEZyZWVTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweDQwOWRlMzEyLAlMIk1vZGVybk5vLjIwIiwJTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxOaW1idXMgU2FucyBMLE5pbWJ1cyBTYW5zIEwsRnJlZVNhbnMiLAkyLAkxMjUyfSwNCi0gICAgezB4NDE0NDNjNWUsCUwiR2VvcmdpYSIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2FucyIsCTIsCTEyNTJ9LA0KLSAgICB7MHg0MTYwYWRlNSwJTCJCZWxsR290aGljU3RkQmxhY2siLAlMIkZyZWVTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweDQyMTk3NmM0LAlMIk1vZGVybi1SZWd1bGFyIiwJTCJGcmVlU2FucyIsCTIsCTEyNTJ9LA0KLSAgICB7MHg0MjJhNzI1MiwJTCJTdGVuY2lsIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTYW5zLExpYmVyYXRpb24gU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0MmM4NTU0ZiwJTCJGaXhlZHN5cyIsCUwiRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDQzNWNiNDFkLAlMIlJvbWFuIiwJTCJGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4NDc4ODIzODMsCUwiQ291cmllck5ldyIsCUwiRnJlZU1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLEFSIFBMIFVLYWkgQ04sQVIgUEwgVUthaSBISyxBUiBQTCBVS2FpIFRXLEFSIFBMIFVLYWkgVFcgTUJFLERlamFWdSBTYW5zIiwJMSwJMTI1Mn0sDQotICAgIHsweDQ4MGEyMzM4LAlMIkJlcmxpblNhbnNGQkRlbWkiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0ODBiZjdhNCwJTCJDb3VyaWVyU3RkIiwJTCJEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0ODFhZDZlZCwJTCJWbGFkaW1pclNjcmlwdCIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLAk4LAkxMjUyfSwNCi0gICAgezB4NDkxMTU3N2EsCUwiWW91WXVhbiIsCUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsCTEsCTkzNn0sDQotICAgIHsweDRhNzg4ZDcyLAlMIlNUWGluZ2thaSIsCUwiQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIENOIiwJMCwJOTM2fSwNCi0gICAgezB4NGJmODg1NjYsCUwiU2Vnb2VDb25kZW5zZWQiLAlMIkZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0Y2NmNTFhNCwJTCJCZXJsaW5TYW5zRkItUmVnIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4NGVhOTY3Y2UsCUwiR3VsaW1DaGUiLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVUthaSBDTixBUiBQTCBVS2FpIEhLLEFSIFBMIFVLYWkgVFcsQVIgUEwgVUthaSBUVyBNQkUiLAkxLAkxMjUyfSwNCi0gICAgezB4NGY2OGJkNzksCUwiTGV0dGVyR290aGljU3RkIiwJTCJGcmVlTW9ubyxMaWJlcmF0aW9uIE1vbm8sQW5kYWxlIE1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweDUxYTBkMGU2LAlMIktvenVrYUdvdGhpY1ByNk5NIiwJTCJGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4NTMxYjNkZWEsCUwiQmFzZW1pY1N5bWJvbCIsCUwiRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDUzMzNmZDM5LAlMIkNhbGlmb3JuaWFuRkItUmVnIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLFVSVyBDaGFuY2VyeSBMLEZyZWVTZXJpZiIsCTIsCTEyNTJ9LA0KLSAgICB7MHg1MzU2MWE1NCwJTCJGWllUSy0tR0JLMS0wIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KLSAgICB7MHg1NWUwZGRlNiwJTCJMdWNpZGFTYW5zVHlwZXdyaXRlciIsCUwiVWJ1bnR1IE1vbm8sRGVqYVZ1IFNhbnMgTW9ubyxOaW1idXMgTW9ubyBMLExpYmVyYXRpb24gTW9ubyxDb3VyaWVyIDEwIFBpdGNoLEZyZWVNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweDU3NGQ0ZDNkLAlMIkFkb2JlQXJhYmljIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweDU3OTJlNzU5LAlMIlNUS2FpdGkiLAlMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsCTAsCTkzNn0sDQotICAgIHsweDU5MjE5NzhlLAlMIkx1Y2lkYVNhbnNVbmljb2RlIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweDU5NGUyZGE0LAlMIlZyaW5kYSIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgQXJhYmljIE5hc2toLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2FucyxGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4NTliYWE5YTIsCUwiS2FpVGlfR0IyMzEyIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAkxMjUyfSwNCi0gICAgezB4NWNmZWRmNGYsCUwiQmFza09sZEZhY2UiLAlMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLFVidW50dSxMaWJlcmF0aW9uIFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDVlMTZhYzkxLCAgICBMIlRyYWphblBybyIsICAgTCJOaW1idXMgU2FucyBMLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgVFcsQVIgUEwgVU1pbmcgVFcgTUJFLERlamFWdSBTYW5zLERlamFWdSBTZXJpZiIsICAwLCAgMTI1Mn0sDQotICAgIHsweDVmMzg4MTk2LCAgICBMIklUQ0xlZ2FjeVNhbnNTdGRNZWRpdW0iLCAgTCJMaWJlcmF0aW9uIFNlcmlmLEZyZWVTZXJpZixGcmVlU2FucyxVYnVudHUiLCAwLCAxMjUyfSwNCi0gICAgezB4NWY5NzkyMWMsCUwiQWRvYmVNeXVuZ2pvU3RkTSIsCUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJOTM2fSwNCi0gICAgezB4NWZlZmJmYWQsCUwiQmF0YW5nIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkyLAkxMjUyfSwNCi0gICAgezB4NjA1MzQyYjksCUwiRG90dW1DaGUiLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFciLAkxLAkxMjUyfSwNCi0gICAgezB4NjA4YzVmOWEsCUwiS2FpVGlfR0IyMzEyIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KLSAgICB7MHg2MWVmZDBkMSwJTCJNYXR1cmFNVFNjcmlwdENhcGl0YWxzIiwJTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZixEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg2MjY2MDhhOSwJTCJNVkJvbGkiLAlMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweDYzMDUwMWEzLAlMIlNtYWxsRm9udHMiLAlMIkRlamFWdSBTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHg2NWQwZTJhOSwJTCJGWllUSy0tR0JLMS0wIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KLSAgICB7MHg2NjlmMjllMSwJTCJGWlNUSy0tR0JLMS0wIiwJTCJBUiBQTCBVTWluZyBDTixBUiBQTCBVS2FpIENOLCBBUiBQTCBVTWluZyBISyIsCTAsCTkzNn0sDQotICAgIHsweDY3M2E5ZTVmLAlMIlR1bmdhIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDY5MWFhNGNlLAlMIk5pYWdhcmFTb2xpZCIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4Njk2MjU5YjcsCUwiQ29yYmVsIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweDY5NmVlOWJlLAlMIlNUWGloZWkiLAlMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsCTAsCTkzNn0sDQotICAgIHsweDZjNTljZjY5LAlMIkRvdHVtIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweDcwN2ZhNTYxLAlMIkd1bmdzdWgiLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8iLAkyLAkxMjUyfSwNCi0gICAgezB4NzE0MTZiYjIsCUwiWldBZG9iZUYiLAlMIkthY3N0QXJ0LEthY3N0Qm9va20sS2Fjc3REZWNvcmF0aXZlLEthY3N0RGlnaXRhbCxLYWNzdEZhcnNpLEthY3N0TGV0dGVyLEthY3N0T2ZmaWNlLERpbmdiYXRzLEZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3MWI0MTgwMSwJTCJWZXJkYW5hIiwJTCJEZWphVnUgU2FucyBDb25kZW5zZWQsVWJ1bnR1IENvbmRlbnNlZCxEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweDczZjI1ZTRjLAlMIlBhbGF0aW5vTGlub3R5cGUiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDczZjRkMTlmLAlMIk5pYWdhcmFFbmdyYXZlZCIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4NzQwMDE2OTQsCUwiTXlyaWFkUHJvQmxhY2siLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsQVIgUEwgVUthaSBISyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3NGIxNGQ4ZiwJTCJIYWV0dGVuc2Nod2VpbGVyIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3NGNiNDRlZSwJTCJOU2ltU3VuIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vIiwJMSwJOTM2fSwNCi0gICAgezB4NzZiNGQ3ZmYsCUwiU2hydXRpIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4Nzg4YjM1MzMsCUwiV2ViZGluZ3MiLAlMIkZyZWVTYW5zIiwJNiwJNDJ9LA0KLSAgICB7MHg3OTdkZGU5OSwJTCJNU1NlcmlmIiwJTCJGcmVlU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3YTBmOWU5ZSwJTCJNU01pbmNobyIsCUwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwJMSwJMTI1Mn0sDQotICAgIHsweDdiNDM5Y2FmLAlMIk9sZEVuZ2xpc2hUZXh0TVQiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4MjEzYTQzMywJTCJMdWNpZGFTYW5zLVR5cGV3cml0ZXIiLAlMIlVidW50dSBNb25vLExpYmVyYXRpb24gTW9ubyxEZWphVnUgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweDgyZmVjOTI5LAlMIkFkb2JlU29uZ1N0ZEwiLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTAsCTkzNn0sDQotICAgIHsweDgzNTgxODI1LAlMIk1vZGVybiIsCUwiRnJlZVNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4ODM1YTI4MjMsCUwiQWxnZXJpYW4iLAlMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTYW5zLExpYmVyYXRpb24gU2FucyxVYnVudHUiLAkwLAkxMjUyfSwNCi0gICAgezB4ODNkYWI5ZjUsCUwiU2NyaXB0IiwJTCJGcmVlU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4NDdiNTZkYSwJTCJUYWhvbWEiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLEZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4YTc4M2NiMiwJTCJTaW1TdW4tUFVBIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAkxMjUyfSwNCi0gICAgezB4OGI1Y2FjMGUsCUwiT255eCIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4OGM2YTQ5OWUsCUwiR3VsaW0iLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4ZTBhZjc5MCwJTCJKdWljZUlUQyIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4OGU4ZDQzYjIsCUwiQ2VudGF1ciIsCUwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsS2htZXIgT1MsS2htZXIgT1MgU3lzdGVtIiwJMiwJMTI1Mn0sDQotICAgIHsweDhlZTRkY2NhLAlMIkJvb2tzaGVsZlN5bWJvbDciLAlMIkxpYmVyYXRpb24gU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg5MDc5NDgwMCwJTCJCZWxsR290aGljU3RkTGlnaHQiLAlMIkxpYmVyYXRpb24gU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg5MDliNTE2YSwJTCJDZW50dXJ5IiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIE1vbm8sTGliZXJhdGlvbiBTZXJpZiIsCTIsCTEyNTJ9LA0KLSAgICB7MHg5MmFlMzcwZCwJTCJNU091dGxvb2siLAlMIkxpYmVyYXRpb24gU2FucyIsCTQsCTQyfSwNCi0gICAgezB4OTNjOWZiZjEsCUwiTHVjaWRhRmF4IiwJTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixMaWJlcmF0aW9uIFNhbnMiLAkyLAkxMjUyfSwNCi0gICAgezB4OTU2NTA4NWUsCUwiQm9va0FudGlxdWEiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLExpYmVyYXRpb24gU2VyaWYiLAkyLAkxMjUyfSwNCi0gICAgezB4OTg1NmQ5NWQsCUwiQWRvYmVNaW5nU3RkTCIsCUwiQVIgUEwgVU1pbmcgSEsiLAkwLAk5NDl9LA0KLSAgICB7MHg5YmJhZGQ2YiwJTCJDb2xvbm5hTVQiLAlMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLEtobWVyIE9TLEtobWVyIE9TIFN5c3RlbSIsCTAsCTEyNTJ9LA0KLSAgICB7MHg5Y2JkMTZhNCwJTCJTaG93Y2FyZEdvdGhpYy1SZWciLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsCTAsCTEyNTJ9LA0KLSAgICB7MHg5ZDczMDA4ZSwJTCJNU1NhbnNTZXJpZiIsCUwiRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweGEwNjA3ZGIxLAlMIkd1bmdzdWhDaGUiLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTEsCTEyNTJ9LA0KLSAgICB7MHhhMGJjZjZhMSwJTCJMYXRpbldpZGUiLAlMIkZyZWVTZXJpZiIsCTIsCTEyNTJ9LA0KLSAgICB7MHhhMTQyOWIzNiwJTCJTeW1ib2wiLAlMIkZyZWVTZXJpZiIsCTYsCTQyfSwNCi0gICAgezB4YTFmYTVhYmMsCUwiV2luZ2RpbmdzMiIsCUwiRnJlZVNlcmlmIiwJNiwJNDJ9LA0KLSAgICB7MHhhMWZhNWFiZCwJTCJXaW5nZGluZ3MzIiwJTCJGcmVlU2VyaWYiLAk2LAk0Mn0sDQotICAgIHsweGE0MjdiYWQ0LAlMIkluZm9ybWFsUm9tYW4tUmVndWxhciIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsCTgsCTEyNTJ9LA0KLSAgICB7MHhhOGI5MmVjZSwJTCJGWlNUSy0tR0JLMS0wIiwJTCJBUiBQTCBVTWluZyBDTiIsCTAsCTkzNn0sDQotICAgIHsweGE4ZDgzZWNlLAlMIkNhbGlmb3JuaWFuRkIiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmIiwJMiwJMTI1Mn0sDQotICAgIHsweGFhM2UwODJjLAlMIktpbmdzb2Z0LVBob25ldGljIiwJTCJUaWJldGFuIE1hY2hpbmUgVW5pLExLTFVHLFNhbXlhayBHdWphcmF0aSxEcm9pZCBTYW5zIFRoYWksdXRrYWwsS2VkYWdlLE1hbGxpZ2UsQVIgUEwgVUthaSBDTiIsCTAsCTEyNTJ9LA0KLSAgICB7MHhhYTZiY2FiZSwJTCJIYXJsb3dTb2xpZEl0YWxpYyIsCUwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHhhZGU1MzM3YywJTCJNU1VJR290aGljIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAkxMjUyfSwNCi0gICAgezB4YjA4ZGQ5NDEsCUwiV2lkZUxhdGluIiwJTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYiLAkyLAkxMjUyfSwNCi0gICAgezB4YjEyNzY1ZTAsICAgIEwiSVRDTGVnYWN5U2Fuc1N0ZEJvb2siLCAgTCJBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIEhLLEZyZWVTZXJpZixVYnVudHUsRnJlZVNhbnMiLCAgIDAsICAxMjUyfSwNCi0gICAgezB4YjIwN2YwNWQsCUwiUG9vclJpY2hhcmQiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsCTIsCTEyNTJ9LA0KLSAgICB7MHhiM2JjNDkyZiwJTCJKdWljZUlUQy1SZWd1bGFyIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4YjU1NDUzOTksCUwiTWFybGV0dCIsCUwiTGliZXJhdGlvbiBTZXJpZiIsCTQsCTQyfSwNCi0gICAgezB4YjVkZDFlYmIsCUwiQnJpdGFubmljQm9sZCIsCUwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sTGliZXJhdGlvbiBTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHhiNjk5YzFjNSwJTCJMdWNpZGFDYWxsaWdyYXBoeS1JdGFsaWMiLAlMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweGI3MjVkNjI5LAlMIlRpbWVzTmV3Um9tYW4iLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwJMiwJMTI1Mn0sDQotICAgIHsweGI3ZWFlYmViLAlMIkFkb2JlSGVpdGlTdGRSIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KLSAgICB7MHhiZDI5YzQ4NiwJTCJCZXJsaW5TYW5zRkJEZW1pLUJvbGQiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweGJlOGE4ZGI0LAlMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwJTCJEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjMTZjMDExOCwJTCJBZG9iZUhlYnJldyIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUsTGliZXJhdGlvbiBTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjMzE4YjBhZiwJTCJNeXJpYWRQcm9MaWdodCIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLAkwLAkxMjUyfSwNCi0gICAgezB4YzY1ZTU2NTksCUwiQ2FtYnJpYU1hdGgiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmLEZyZWVNb25vIiwJMiwJMTI1Mn0sDQotICAgIHsweGM3NWM4ZjA1LAlMIkx1Y2lkYUNvbnNvbGUiLAlMIkxpYmVyYXRpb24gTW9ubyxEZWphVnUgU2FucyBNb25vLEZyZWVNb25vLFdlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsCTEsCTEyNTJ9LA0KLSAgICB7MHhjYTdjMzVkNiwJTCJDYWxpYnJpIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweGNiMDUzZjUzLAlMIk1pY3Jvc29mdFlhSGVpIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KLSAgICB7MHhjYjcxOTBmOSwJTCJNYWduZXRvLUJvbGQiLAlMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4Y2NhMDBjYzUsCUwiU3lzdGVtIiwJTCJEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjY2FkNmY3NiwJTCJKb2tlcm1hbi1SZWd1bGFyIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweGNjYzU4MThjLAlMIkV1cm9TaWduIiwJTCJEZWphVnUgU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4Y2YzZDcyMzQsCUwiTHVjaWRhSGFuZHdyaXRpbmctSXRhbGljIiwJTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LFVidW50dSBDb25kZW5zZWQsTmltYnVzIFNhbnMgTCxEZWphVnUgU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4Y2Y3YjhmZGIsCUwiTWluaW9uUHJvIiwJTCJEZWphVnUgU2FucyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjZmU1NzU1ZiwJTCJTaW1oZWkiLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCTEsCTkzNn0sDQotICAgIHsweGQwMTFmNGVlLAlMIk1TUEdvdGhpYyIsCUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhkMDYwZTdlZiwJTCJWaXZhbGRpIiwJTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwJOCwJMTI1Mn0sDQotICAgIHsweGQwN2VkZWMxLAlMIkZyYW5rbGluR290aGljLU1lZGl1bSIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUiLAkwLAkxMjUyfSwNCi0gICAgezB4ZDEwNzI0M2YsCUwiU2ltU3VuIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vIiwJMCwJOTM2fSwNCi0gICAgezB4ZDE4ODE1NjIsCUwiQXJpYWxOYXJyb3ciLAlMIkxpYmVyYXRpb24gU2FucyBOYXJyb3csRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4ZDIyYjdkY2UsCUwiQm9kb25pTVRQb3N0ZXJDb21wcmVzc2VkIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHhkMjJiZmE2MCwJTCJDb21pY1NhbnNNUyIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlTW9ubyxMaWJlcmF0aW9uIE1vbm8iLAk4LAkxMjUyfSwNCi0gICAgezB4ZDNiZDBlMzUsCUwiQmF1aGF1czkzIiwJTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwJMCwJMTI1Mn0sDQotICAgIHsweGQ0MjllZTdhLAlMIlNURmFuZ3NvbmciLAlMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsCTAsCTkzNn0sDQotICAgIHsweGQ2Njc5YzEyLAlMIkJlcm5hcmRNVENvbmRlbnNlZCIsCUwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTmltYnVzIFNhbnMgTCxVUlcgQ2hhbmNlcnkgTCxLYWNzdE9uZSxMaWJlcmF0aW9uIFNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4ZDhlOGEwMjcsCUwiTHVjaWRhU2FucyIsCUwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxOaW1idXMgU2FucyBMLEthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEZWphVnUgU2VyaWYgQ29uZGVuc2VkLExpYmVyYXRpb24gTW9ubyxVYnVudHUiLAkwLAkxMjUyfSwNCi0gICAgezB4ZDlmZTc3NjEsCUwiSGlnaFRvd2VyVGV4dC1SZWciLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYiLAkyLAkxMjUyfSwNCi0gICAgezB4ZGE3ZTU1MWUsCUwiU1RTb25nIiwJTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLAkwLAk5MzZ9LA0KLSAgICB7MHhkYWE2ODQyZCwJTCJTVFpob25nc29uZyIsCUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJOTM2fSwNCi0gICAgezB4ZGFhYWI5M2YsCUwiU1RGYW5nc29uZyIsCUwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLAkwLAk5MzZ9LA0KLSAgICB7MHhkYWViMDcxMywJTCJTVFNvbmciLAlMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwJMCwJOTM2fSwNCi0gICAgezB4ZGFmZWRiZWYsCUwiU1RDYWl5dW4iLAlMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsCTAsCTkzNn0sDQotICAgIHsweGRiMDBhM2Q5LAlMIkJyb2Fkd2F5IiwJTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyxGcmVlTW9ubyxMaWJlcmF0aW9uIE1vbm8iLAkwLAkxMjUyfSwNCi0gICAgezB4ZGIxZjVhZDQsCUwiU1RYaW53ZWkiLAlMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsCTAsCTkzNn0sDQotICAgIHsweGRiMzI2ZTdmLAlMIlNUS2FpdGkiLAlMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwJMCwJOTM2fSwNCi0gICAgezB4ZGI2OTU5NWEsCUwiU1RIdXBvIiwJTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsCTAsCTkzNn0sDQotICAgIHsweGRiYTAwODJjLAlMIlNUWGloZWkiLAlMIiBXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsCTAsCTkzNn0sDQotICAgIHsweGRiZDBhYjE4LAlMIlNUWGluZ2thaSIsCUwiQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIENOIiwJMCwJOTM2fSwNCi0gICAgezB4ZGMxYTdkYjEsCUwiU1RMaXRpIiwJTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLAkwLAk5MzZ9LA0KLSAgICB7MHhkYzMzMDc1ZiwJTCJLcmlzdGVuSVRDLVJlZ3VsYXIiLAlMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLFVidW50dSxMaWJlcmF0aW9uIFNhbnMiLAk4LAkxMjUyfSwNCi0gICAgezB4ZGNjNzAwOWMsCUwiSGFycmluZ3RvbiIsCUwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZixGcmVlU2VyaWYsVWJ1bnR1IiwJMCwJMTI1Mn0sDQotICAgIHsweGRkNzEyNDY2LAlMIkFyaWFsQmxhY2siLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMsRGVqYVZ1IFNlcmlmLEZyZWVNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweGRkZTg3YjNlLAlMIkltcGFjdCIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4ZGY2OWZiMzIsCUwiU25hcElUQyIsCUwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxVYnVudHUgQ29uZGVuc2VkLERlamFWdSBTYW5zLERlamFWdSBTZXJpZixGcmVlTW9ubyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhkZjhiMjVlOCwJTCJDZW50dXJ5R290aGljIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gTW9ubyxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHhlMGY3MDVjMCwJTCJLcmlzdGVuSVRDIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERlamFWdSBTYW5zIENvbmRlbnNlZCxVYnVudHUsTGliZXJhdGlvbiBTYW5zIiwJOCwJMTI1Mn0sDQotICAgIHsweGUxNDI3NTczLAlMIlJhYXZpIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLEZyZWVTZXJpZixMaWJlcmF0aW9uIFNlcmlmLEtobWVyIE9TIiwJMCwJMTI1Mn0sDQotICAgIHsweGUyY2VhMGNiLAlMIk1hZ25ldG8iLAlMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRGVqYVZ1IFNlcmlmLERlamFWdSBTZXJpZiBDb25kZW5zZWQsRGVqYVZ1IFNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4ZTM2YTllMTcsCUwiUmF2aWUiLAlMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRGVqYVZ1IFNlcmlmLERlamFWdSBTYW5zLEZyZWVNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweGU0MzNmOGUyLAlMIlBhcmNobWVudCIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLAk4LAkxMjUyfSwNCi0gICAgezB4ZTQzZGZmNGEsCUwiV2luZ2RpbmdzIiwJTCJEZWphVnUgU2VyaWYiLAk0LAk0Mn0sDQotICAgIHsweGU0ZTJjNDA1LAlMIk1URXh0cmEiLAlMIkRlamFWdSBTZXJpZiIsCTYsCTQyfSwNCi0gICAgezB4ZTYxOGNjMzUsCUwiSW5mb3JtYWxSb21hbiIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLE5pbWJ1cyBTYW5zIEwsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLFVidW50dSxMaWJlcmF0aW9uIFNhbnMiLAk4LAkxMjUyfSwNCi0gICAgezB4ZTZjMjdmZmMsCUwiTWlzdHJhbCIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLAk4LAkxMjUyfSwNCi0gICAgezB4ZTdlYmY0YjksCUwiQ291cmllciIsCUwiRGVqYVZ1IFNhbnMsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLEZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHhlOGJjNGE5ZCwJTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsCUwiRGVqYVZ1IFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweGU5MGZiMDEzLAlMIlRlbXB1c1NhbnNJVEMiLAlMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYsRnJlZVNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweGVjNjM3YjQyLAlMIkNvbnNvbGFzIiwJTCJEZWphVnUgU2FucyBDb25kZW5zZWQsQVIgUEwgVUthaSBDTixBUiBQTCBVS2FpIEhLLEFSIFBMIFVLYWkgVFcsRnJlZVNlcmlmLEZyZWVTYW5zIiwJMSwJMTI1Mn0sDQotICAgIHsweGVkM2E2ODNiLAlMIlNUWGlud2VpIiwJTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLAkwLAk5MzZ9LA0KLSAgICB7MHhlZjI2NGNkMSwJTCJMdWNpZGFIYW5kd3JpdGluZyIsCUwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxVYnVudHUgQ29uZGVuc2VkLE5pbWJ1cyBTYW5zIEwsS2Fjc3RRdXJuLExpYmVyYXRpb24gTW9ubyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhmMDg2YmNhMiwJTCJCYXNrZXJ2aWxsZU9sZEZhY2UiLAlMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYsVWJ1bnR1LEZyZWVTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHhmMTAyODAzMCwJTCJNYW5nYWwiLAlMIkZyZWVTYW5zLFRTQ3VfUGFyYW5hcixHYXJ1ZGEsTGliZXJhdGlvbiBTYW5zLExpYmVyYXRpb24gU2FucyBOYXJyb3csTmltYnVzIFNhbnMgTCIsCTIsCTEyNTJ9LA0KLSAgICB7MHhmMWRhN2ViOSwJTCJTaG93Y2FyZEdvdGhpYyIsCUwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYgQ29uZGVuc2VkLERlamFWdSBTYW5zIENvbmRlbnNlZCxMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwJMCwJMTI1Mn0sDQotICAgIHsweGYyMTBmMDZhLAlMIkFyaWFsTVQiLAlMIkxpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNhbnMgTmFycm93LEZyZWVTYW5zLE5pbWJ1cyBTYW5zIEwsS2htZXIgT1MgU3lzdGVtLEtobWVyIE9TIiwJMCwJMTI1Mn0sDQotICAgIHsweGY0NzdmMTZhLAlMIkxhdGhhIiwJTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LE5pbWJ1cyBTYW5zIEwsRHJvaWQgQXJhYmljIE5hc2toLG1yeV9LYWNzdFF1cm4sRnJlZVNlcmlmLE5pbWJ1cyBTYW5zIEwiLAkwLAkxMjUyfSwNCi0gICAgezB4ZjYxNmYzZGQsCUwiTGlTdSIsCUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiBQTCBVTWluZyBUVyBNQkUiLAkxLAk5MzZ9LA0KLSAgICB7MHhmYTQ3OWFhNiwJTCJNaWNyb3NvZnRZYUhlaSIsCUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwJMCwJOTM2fSwNCi0gICAgezB4ZmNkMTk2OTcsCUwiQm9va21hbk9sZFN0eWxlIiwJTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gTW9ubyxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHhmZTIwOWE4MiwJTCJMdWNpZGFDYWxsaWdyYXBoeSIsCUwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYsRGVqYVZ1IFNhbnMsRnJlZU1vbm8iLAkwLAkxMjUyfSwNCi0gICAgezB4ZmVmMTM1ZjgsCUwiQWRvYmVIZWl0aVN0ZC1SZWd1bGFyIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAkwLAk5MzZ9LA0KKyAgICB7MHgwMWQ1ZDMzZSwgTCJTaW1TdW4iLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSICINCisgICAgIEwiUEwgVU1pbmcgVFcgTUJFIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweDAxZTRmMTAyLCBMIllvdVl1YW4iLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSICINCisgICAgIEwiUEwgVU1pbmcgVFcgTUJFIiwNCisgICAgIDEsIDkzNn0sDQorICAgIHsweDAzMDU0OWRjLCBMIkxpU3UiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIk1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCA5MzZ9LA0KKyAgICB7MHgwMzJlZGQ0NCwgTCJTaW1oZWkiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIk1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCA5MzZ9LA0KKyAgICB7MHgwM2VhYzZmYywgTCJQb29yUmljaGFyZC1SZWd1bGFyIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4MDNlZDkwZTYsIEwiTmluYSIsIEwiRnJlZVNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDA3N2I1NmIzLCBMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsDQorICAgICBMIlRpYmV0YW4gTWFjaGluZSBVbmksTEtMVUcsU2FteWFrIEd1amFyYXRpLERyb2lkIFNhbnMgVGhhaSxEcm9pZCBTYW5zICINCisgICAgIEwiQXJtZW5pYW4sVW50aXRsZWQxLHV0a2FsLExvaGl0IE9yaXlhIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgwNzhlZDUyNCwgTCJNaWNyb3NvZnRTYW5zU2VyaWYiLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZixXZW5RdWFuWWkgTWljcm8gSGVpIiwgMCwgMTI1Mn0sDQorICAgIHsweDA4OWIxOGE5LCBMIkFyaWFsIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyBDb25kZW5zZWQsRnJlZVNlcmlmLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDBiMmNhZDcyLCBMIk1vbm90eXBlQ29yc2l2YSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLCA4LCAxMjUyfSwNCisgICAgezB4MGJiMDAzZTcsIEwiS2FydGlrYSIsDQorICAgICBMIkZyZWVTYW5zLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNhbnMgTmFycm93LE5pbWJ1cyBTYW5zICINCisgICAgIEwiTCxHYXJ1ZGEsRnJlZVNlcmlmLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweDBiYjQ2OWRmLCBMIlZpbmVySGFuZElUQyIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwgOCwgMTI1Mn0sDQorICAgIHsweDBiYzFhODUxLCBMIlNlZ29lVUkiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4MGMxMTJlYmQsIEwiS296dWthR290aGljUHJvLVZJTSIsIEwiRnJlZVNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDBjZmNiOWMxLCBMIkFkb2JlVGhhaSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxXYXJlZSIsIDAsIDg0N30sDQorICAgIHsweDBlN2RlMGY5LCBMIlBsYXliaWxsIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgIg0KKyAgICAgTCJTYW5zIEV0aGlvcGljLERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgwZWZmNDdjMywgTCJTVEh1cG8iLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHgxMDdhZDM3NCwgTCJDb25zdGFudGlhIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYsV2VuUXVhbllpIE1pY3JvIEhlaSxVYnVudHUiLCAyLCAxMjUyfSwNCisgICAgezB4MTIxOTRjMmQsIEwiS3Vuc3RsZXJTY3JpcHQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsIDgsDQorICAgICAxMjUyfSwNCisgICAgezB4MTM1ZWY2YTEsIEwiTWluaW9uUHJvU21CZCIsIEwiTGliZXJhdGlvbiBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgxNThjNDA0OSwgTCJHYXJhbW9uZCIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZixVYnVudHUsRnJlZVNlcmlmIiwgMiwgMTI1Mn0sDQorICAgIHsweDE2MGVjYjI0LCBMIlNUWmhvbmdzb25nIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgOTM2fSwNCisgICAgezB4MTYxZWQwN2UsIEwiTVNHb3RoaWMiLA0KKyAgICAgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxBUiBQTCAiDQorICAgICBMIlVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwNCisgICAgIDEsIDEyNTJ9LA0KKyAgICB7MHgxNzFkMWVkMSwgTCJTbmFwSVRDLVJlZ3VsYXIiLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LFVidW50dSBDb25kZW5zZWQsTmltYnVzIFNhbnMgTCxEZWphVnUgU2FucyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4MThkMTE4OGYsIEwiQ2FtYnJpYSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYsRnJlZU1vbm8iLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDE4ZWFmMzUwLCBMIkFyaWFsVW5pY29kZU1TIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgOTM2fSwNCisgICAgezB4MWE5MmQxMTUsIEwiTWluZ0xpVSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDEsIDEyNTJ9LA0KKyAgICB7MHgxY2MyMTdjNiwgTCJUcmVidWNoZXRNUyIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZixGcmVlU2VyaWYsVWJ1bnR1IiwgMCwgMTI1Mn0sDQorICAgIHsweDFkNjQ5NTk2LCBMIkJhc2VtaWNUaW1lcyIsDQorICAgICBMIkxpYmVyYXRpb24gU2VyaWYsVGltZXMgTmV3IFJvbWFuLERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmLFVidW50dSIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MWUzNGVlNjAsIEwiQmVsbE1UIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYiLCAyLCAxMjUyfSwNCisgICAgezB4MWViMzY5NDUsIEwiQ29vcGVyQmxhY2siLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlTW9ubyxMaWJlcmF0aW9uIE1vbm8sIFdlblF1YW5ZaSBNaWNybyAiDQorICAgICBMIkhlaSBNb25vIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgxZWY3Nzg3ZCwgTCJCYXRhbmdDaGUiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nICINCisgICAgIEwiVFcsV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCAxMjUyfSwNCisgICAgezB4MjBiM2JkM2EsIEwiQnJ1c2hTY3JpcHRNVCIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICINCisgICAgIEwiSmFwYW5lc2UsVVJXIENoYW5jZXJ5IEwsTGliZXJhdGlvbiBTYW5zIiwNCisgICAgIDgsIDEyNTJ9LA0KKyAgICB7MHgyMjA4NzdhYSwgTCJDYW5kYXJhIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwgMTI1Mn0sDQorICAgIHsweDIyMTM1MDA3LCBMIkZyZWVzdHlsZVNjcmlwdC1SZWd1bGFyIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwgOCwgMTI1Mn0sDQorICAgIHsweDI1MTA1OWMzLCBMIkNoaWxsZXIiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2FucyAiDQorICAgICBMIkphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MjViZWQ2ZGQsIEwiTVNSZWZlcmVuY2VTYW5zU2VyaWYiLA0KKyAgICAgTCJEZWphVnUgU2FucyBDb25kZW5zZWQsVWJ1bnR1IENvbmRlbnNlZCxEcm9pZCBTYW5zIEphcGFuZXNlLEFSIFBMIFVLYWkgIg0KKyAgICAgTCJISyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MjgxNTRjODEsIEwiUGFyY2htZW50LVJlZ3VsYXIiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwNCisgICAgIDgsIDEyNTJ9LA0KKyAgICB7MHgyOTcxMWViOSwgTCJTVExpdGkiLCBMIkFSIFBMIFVLYWkgSEsiLCAwLCA5MzZ9LA0KKyAgICB7MHgyYjE5OTNiNCwgTCJCYXNlbWljIiwNCisgICAgIEwiTGliZXJhdGlvbiBTZXJpZixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYjMxNjMzOSwgTCJOaWFnYXJhU29saWQtUmVnIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4MmMxNDc1MjksIEwiRm9vdGxpZ2h0TVRMaWdodCIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYzE5ODkyOCwgTCJIYXJsb3dTb2xpZCIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYzZhYzZiMiwgTCJMdWNpZGFCcmlnaHQiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiDQorICAgICBMIlNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgyYzlmMzhlMiwgTCJLb3p1a2FNaW5jaG9Qcm8tVklSIiwgTCJEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyZDVhNDdiMCwgTCJTVENhaXl1biIsIEwiQVIgUEwgVUthaSBISyIsIDAsIDkzNn0sDQorICAgIHsweDJkZWYyNmJmLCBMIkJlcm5hcmRNVC1Db25kZW5zZWQiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4MmZkODkzMGIsIEwiS296dWthTWluY2hvUHI2TlIiLCBMIkRlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzMTE1NTI1YSwgTCJGYW5nU29uZ19HQjIzMTIiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MzEzMjc4MTcsIEwiTXlyaWFkUHJvIiwNCisgICAgIEwiVWJ1bnR1IENvbmRlbnNlZCxEcm9pZCBTYW5zIEphcGFuZXNlLCBGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4MzIyNDQ5NzUsIEwiSGVsdmV0aWNhIiwNCisgICAgIEwiVWJ1bnR1LERlamFWdSBTYW5zIENvbmRlbnNlZCxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTYW5zICINCisgICAgIEwiTmFycm93LE5pbWJ1cyBTYW5zIEwiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDMyYWM5OTVjLCBMIlRlcm1pbmFsIiwgTCJEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4MzM4ZDY0OGEsIEwiTmlhZ2FyYUVuZ3JhdmVkLVJlZyIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDMzYmI2NWYyLCBMIlN5bGZhZW4iLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAyLCAxMjUyfSwNCisgICAgezB4MzQwMmMzMGUsIEwiTVNQTWluY2hvIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4MzQxMmJmMzEsIEwiU2ltU3VuLVBVQSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEsiLCAwLA0KKyAgICAgOTM2fSwNCisgICAgezB4MzZlYjM5YjksIEwiQmVybGluU2Fuc0ZCIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmLFVidW50dSxGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4MzZmNDIwNTUsIEwiVW5pdmVyc0FUVCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4Mzg2NGM0ZjYsIEwiSGlnaFRvd2VyVGV4dCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDNhMjU3ZDAzLCBMIkZhbmdTb25nX0dCMjMxMiIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkiLCAwLCAxMjUyfSwNCisgICAgezB4M2M3ZDFkMDcsIEwiR2FyYW1vbmQzTFRTdGQiLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLFVidW50dSBDb25kZW5zZWQsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLExpYmVyYXRpb24gIg0KKyAgICAgTCJTZXJpZixVYnVudHUsRnJlZVNlcmlmIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgzY2RhZTY2OCwgTCJGcmVlc3R5bGVTY3JpcHQiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDgsIDEyNTJ9LA0KKyAgICB7MHgzZDU1YWVkNywgTCJKb2tlcm1hbiIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzZDViNDM4NSwgTCJQTWluZ0xpVSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgzZDliNzY2OSwgTCJFc3RyYW5nZWxvRWRlc3NhIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHgzZTUzMmQ3NCwgTCJGcmFua2xpbkdvdGhpY01lZGl1bSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDNlNmFhMzJkLCBMIk5TaW1TdW4iLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCA5MzZ9LA0KKyAgICB7MHgzZjZjMzZhOCwgTCJHYXV0YW1pIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsIG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyAiDQorICAgICBMIkphcGFuZXNlLEZyZWVTYW5zIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgzZmYzMjY2MiwgTCJDaGlsbGVyLVJlZ3VsYXIiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRnJlZVNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4NDA5ZGUzMTIsIEwiTW9kZXJuTm8uMjAiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxOaW1idXMgU2FucyBMLE5pbWJ1cyBTYW5zIEwsRnJlZVNhbnMiLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDQxNDQzYzVlLCBMIkdlb3JnaWEiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNhbnMiLCAyLCAxMjUyfSwNCisgICAgezB4NDE2MGFkZTUsIEwiQmVsbEdvdGhpY1N0ZEJsYWNrIiwgTCJGcmVlU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0MjE5NzZjNCwgTCJNb2Rlcm4tUmVndWxhciIsIEwiRnJlZVNhbnMiLCAyLCAxMjUyfSwNCisgICAgezB4NDIyYTcyNTIsIEwiU3RlbmNpbCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2FucyxMaWJlcmF0aW9uIFNhbnMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4NDM1Y2I0MWQsIEwiUm9tYW4iLCBMIkZyZWVTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0Nzg4MjM4MywgTCJDb3VyaWVyTmV3IiwNCisgICAgIEwiRnJlZU1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLEFSIFBMIFVLYWkgQ04sQVIgUEwgVUthaSBISyxBUiBQTCAiDQorICAgICBMIlVLYWkgVFcsQVIgUEwgVUthaSBUVyBNQkUsRGVqYVZ1IFNhbnMiLA0KKyAgICAgMSwgMTI1Mn0sDQorICAgIHsweDQ4MGEyMzM4LCBMIkJlcmxpblNhbnNGQkRlbWkiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4NDgwYmY3YTQsIEwiQ291cmllclN0ZCIsIEwiRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4NDgxYWQ2ZWQsIEwiVmxhZGltaXJTY3JpcHQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgOCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg0OTExNTc3YSwgTCJZb3VZdWFuIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsIDEsDQorICAgICA5MzZ9LA0KKyAgICB7MHg0YTc4OGQ3MiwgTCJTVFhpbmdrYWkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHg0YmY4ODU2NiwgTCJTZWdvZUNvbmRlbnNlZCIsIEwiRnJlZVNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDRjY2Y1MWE0LCBMIkJlcmxpblNhbnNGQi1SZWciLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4NGVhOTY3Y2UsIEwiR3VsaW1DaGUiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVLYWkgQ04sQVIgUEwgVUthaSBISyxBUiBQTCBVS2FpIFRXLEFSIFBMICINCisgICAgIEwiVUthaSBUVyBNQkUiLA0KKyAgICAgMSwgMTI1Mn0sDQorICAgIHsweDRmNjhiZDc5LCBMIkxldHRlckdvdGhpY1N0ZCIsDQorICAgICBMIkZyZWVNb25vLExpYmVyYXRpb24gTW9ubyxBbmRhbGUgTW9ubyxXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLCAwLCAxMjUyfSwNCisgICAgezB4NTFhMGQwZTYsIEwiS296dWthR290aGljUHI2Tk0iLCBMIkZyZWVTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1MzFiM2RlYSwgTCJCYXNlbWljU3ltYm9sIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4NTMzM2ZkMzksIEwiQ2FsaWZvcm5pYW5GQi1SZWciLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLFVSVyBDaGFuY2VyeSBMLEZyZWVTZXJpZiIsIDIsIDEyNTJ9LA0KKyAgICB7MHg1MzU2MWE1NCwgTCJGWllUSy0tR0JLMS0wIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgOTM2fSwNCisgICAgezB4NTVlMGRkZTYsIEwiTHVjaWRhU2Fuc1R5cGV3cml0ZXIiLA0KKyAgICAgTCJVYnVudHUgTW9ubyxEZWphVnUgU2FucyBNb25vLE5pbWJ1cyBNb25vIEwsTGliZXJhdGlvbiBNb25vLENvdXJpZXIgMTAgIg0KKyAgICAgTCJQaXRjaCxGcmVlTW9ubyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4NTc0ZDRkM2QsIEwiQWRvYmVBcmFiaWMiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4NTc5MmU3NTksIEwiU1RLYWl0aSIsIEwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vIiwgMCwgOTM2fSwNCisgICAgezB4NTkyMTk3OGUsIEwiTHVjaWRhU2Fuc1VuaWNvZGUiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDU5NGUyZGE0LCBMIlZyaW5kYSIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIEFyYWJpYyAiDQorICAgICBMIk5hc2toLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2FucyxGcmVlU2VyaWYiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDU5YmFhOWEyLCBMIkthaVRpX0dCMjMxMiIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg1Y2ZlZGY0ZiwgTCJCYXNrT2xkRmFjZSIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLFVidW50dSxMaWJlcmF0aW9uIFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDVlMTZhYzkxLCBMIlRyYWphblBybyIsDQorICAgICBMIk5pbWJ1cyBTYW5zIEwsQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBUVyxBUiBQTCBVTWluZyAiDQorICAgICBMIlRXIE1CRSxEZWphVnUgU2FucyxEZWphVnUgU2VyaWYiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDVmMzg4MTk2LCBMIklUQ0xlZ2FjeVNhbnNTdGRNZWRpdW0iLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNlcmlmLEZyZWVTZXJpZixGcmVlU2FucyxVYnVudHUiLCAwLCAxMjUyfSwNCisgICAgezB4NWY5NzkyMWMsIEwiQWRvYmVNeXVuZ2pvU3RkTSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweDVmZWZiZmFkLCBMIkJhdGFuZyIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHg2MDUzNDJiOSwgTCJEb3R1bUNoZSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFciLCAxLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDYwOGM1ZjlhLCBMIkthaVRpX0dCMjMxMiIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweDYxZWZkMGQxLCBMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiDQorICAgICBMIlNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmLERlamFWdSBTYW5zIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg2MjY2MDhhOSwgTCJNVkJvbGkiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgIg0KKyAgICAgTCJFdGhpb3BpYyxEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg2MzA1MDFhMywgTCJTbWFsbEZvbnRzIiwgTCJEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4NjVkMGUyYTksIEwiRlpZVEstLUdCSzEtMCIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweDY2OWYyOWUxLCBMIkZaU1RLLS1HQksxLTAiLA0KKyAgICAgTCJBUiBQTCBVTWluZyBDTixBUiBQTCBVS2FpIENOLCBBUiBQTCBVTWluZyBISyIsIDAsIDkzNn0sDQorICAgIHsweDY3M2E5ZTVmLCBMIlR1bmdhIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zICINCisgICAgIEwiSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg2OTFhYTRjZSwgTCJOaWFnYXJhU29saWQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDY5NjI1OWI3LCBMIkNvcmJlbCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg2OTZlZTliZSwgTCJTVFhpaGVpIiwgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLCAwLCA5MzZ9LA0KKyAgICB7MHg2YzU5Y2Y2OSwgTCJEb3R1bSIsIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3MDdmYTU2MSwgTCJHdW5nc3VoIiwgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vIiwgMiwgMTI1Mn0sDQorICAgIHsweDcxNDE2YmIyLCBMIlpXQWRvYmVGIiwNCisgICAgIEwiS2Fjc3RBcnQsS2Fjc3RCb29rbSxLYWNzdERlY29yYXRpdmUsS2Fjc3REaWdpdGFsLEthY3N0RmFyc2ksS2Fjc3RMZXR0ZXIsIg0KKyAgICAgTCJLYWNzdE9mZmljZSxEaW5nYmF0cyxGcmVlU2VyaWYiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDcxYjQxODAxLCBMIlZlcmRhbmEiLA0KKyAgICAgTCJEZWphVnUgU2FucyBDb25kZW5zZWQsVWJ1bnR1IENvbmRlbnNlZCxEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg3M2YyNWU0YywgTCJQYWxhdGlub0xpbm90eXBlIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NzNmNGQxOWYsIEwiTmlhZ2FyYUVuZ3JhdmVkIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3NDAwMTY5NCwgTCJNeXJpYWRQcm9CbGFjayIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxBUiBQTCBVS2FpIEhLIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg3NGIxNGQ4ZiwgTCJIYWV0dGVuc2Nod2VpbGVyIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NzRjYjQ0ZWUsIEwiTlNpbVN1biIsIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyIsIDEsIDkzNn0sDQorICAgIHsweDc2YjRkN2ZmLCBMIlNocnV0aSIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyAiDQorICAgICBMIkphcGFuZXNlLEZyZWVTYW5zIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg3ODhiMzUzMywgTCJXZWJkaW5ncyIsIEwiRnJlZVNhbnMiLCA2LCA0Mn0sDQorICAgIHsweDc5N2RkZTk5LCBMIk1TU2VyaWYiLCBMIkZyZWVTYW5zIiwgMCwgMTI1Mn0sDQorICAgIHsweDdhMGY5ZTllLCBMIk1TTWluY2hvIiwNCisgICAgIEwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwNCisgICAgIDEsIDEyNTJ9LA0KKyAgICB7MHg3YjQzOWNhZiwgTCJPbGRFbmdsaXNoVGV4dE1UIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwgMCwgMTI1Mn0sDQorICAgIHsweDgyMTNhNDMzLCBMIkx1Y2lkYVNhbnMtVHlwZXdyaXRlciIsDQorICAgICBMIlVidW50dSBNb25vLExpYmVyYXRpb24gTW9ubyxEZWphVnUgU2FucyBNb25vIiwgMCwgMTI1Mn0sDQorICAgIHsweDgyZmVjOTI5LCBMIkFkb2JlU29uZ1N0ZEwiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAwLCA5MzZ9LA0KKyAgICB7MHg4MzU4MTgyNSwgTCJNb2Rlcm4iLCBMIkZyZWVTYW5zIiwgMCwgMTI1Mn0sDQorICAgIHsweDgzNWEyODIzLCBMIkFsZ2VyaWFuIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNhbnMsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4M2RhYjlmNSwgTCJTY3JpcHQiLCBMIkZyZWVTYW5zIiwgMCwgMTI1Mn0sDQorICAgIHsweDg0N2I1NmRhLCBMIlRhaG9tYSIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLEZyZWVTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4YTc4M2NiMiwgTCJTaW1TdW4tUFVBIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDhiNWNhYzBlLCBMIk9ueXgiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwgMCwgMTI1Mn0sDQorICAgIHsweDhjNmE0OTllLCBMIkd1bGltIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDhlMGFmNzkwLCBMIkp1aWNlSVRDIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4ZThkNDNiMiwgTCJDZW50YXVyIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsS2htZXIgT1MsS2htZXIgT1MgU3lzdGVtIiwgMiwgMTI1Mn0sDQorICAgIHsweDhlZTRkY2NhLCBMIkJvb2tzaGVsZlN5bWJvbDciLCBMIkxpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg5MDc5NDgwMCwgTCJCZWxsR290aGljU3RkTGlnaHQiLCBMIkxpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg5MDliNTE2YSwgTCJDZW50dXJ5IiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBNb25vLExpYmVyYXRpb24gU2VyaWYiLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDkyYWUzNzBkLCBMIk1TT3V0bG9vayIsIEwiTGliZXJhdGlvbiBTYW5zIiwgNCwgNDJ9LA0KKyAgICB7MHg5M2M5ZmJmMSwgTCJMdWNpZGFGYXgiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgIg0KKyAgICAgTCJFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLExpYmVyYXRpb24gU2FucyIsDQorICAgICAyLCAxMjUyfSwNCisgICAgezB4OTU2NTA4NWUsIEwiQm9va0FudGlxdWEiLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwgMiwgMTI1Mn0sDQorICAgIHsweDk4NTZkOTVkLCBMIkFkb2JlTWluZ1N0ZEwiLCBMIkFSIFBMIFVNaW5nIEhLIiwgMCwgOTQ5fSwNCisgICAgezB4OWJiYWRkNmIsIEwiQ29sb25uYU1UIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsS2htZXIgT1MsS2htZXIgT1MgU3lzdGVtIiwgMCwgMTI1Mn0sDQorICAgIHsweDljYmQxNmE0LCBMIlNob3djYXJkR290aGljLVJlZyIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsIDAsIDEyNTJ9LA0KKyAgICB7MHg5ZDczMDA4ZSwgTCJNU1NhbnNTZXJpZiIsIEwiRnJlZVNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweGEwNjA3ZGIxLCBMIkd1bmdzdWhDaGUiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCAxMjUyfSwNCisgICAgezB4YTBiY2Y2YTEsIEwiTGF0aW5XaWRlIiwgTCJGcmVlU2VyaWYiLCAyLCAxMjUyfSwNCisgICAgezB4YTE0MjliMzYsIEwiU3ltYm9sIiwgTCJGcmVlU2VyaWYiLCA2LCA0Mn0sDQorICAgIHsweGExZmE1YWJjLCBMIldpbmdkaW5nczIiLCBMIkZyZWVTZXJpZiIsIDYsIDQyfSwNCisgICAgezB4YTFmYTVhYmQsIEwiV2luZ2RpbmdzMyIsIEwiRnJlZVNlcmlmIiwgNiwgNDJ9LA0KKyAgICB7MHhhNDI3YmFkNCwgTCJJbmZvcm1hbFJvbWFuLVJlZ3VsYXIiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgIg0KKyAgICAgTCJKYXBhbmVzZSxGcmVlU2VyaWYiLA0KKyAgICAgOCwgMTI1Mn0sDQorICAgIHsweGE4YjkyZWNlLCBMIkZaU1RLLS1HQksxLTAiLCBMIkFSIFBMIFVNaW5nIENOIiwgMCwgOTM2fSwNCisgICAgezB4YThkODNlY2UsIEwiQ2FsaWZvcm5pYW5GQiIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLCAyLCAxMjUyfSwNCisgICAgezB4YWEzZTA4MmMsIEwiS2luZ3NvZnQtUGhvbmV0aWMiLA0KKyAgICAgTCJUaWJldGFuIE1hY2hpbmUgVW5pLExLTFVHLFNhbXlhayBHdWphcmF0aSxEcm9pZCBTYW5zICINCisgICAgIEwiVGhhaSx1dGthbCxLZWRhZ2UsTWFsbGlnZSxBUiBQTCBVS2FpIENOIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhhYTZiY2FiZSwgTCJIYXJsb3dTb2xpZEl0YWxpYyIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4YWRlNTMzN2MsIEwiTVNVSUdvdGhpYyIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhiMDhkZDk0MSwgTCJXaWRlTGF0aW4iLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiDQorICAgICBMIlNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsDQorICAgICAyLCAxMjUyfSwNCisgICAgezB4YjEyNzY1ZTAsIEwiSVRDTGVnYWN5U2Fuc1N0ZEJvb2siLA0KKyAgICAgTCJBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIEhLLEZyZWVTZXJpZixVYnVudHUsRnJlZVNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4YjIwN2YwNWQsIEwiUG9vclJpY2hhcmQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4YjNiYzQ5MmYsIEwiSnVpY2VJVEMtUmVndWxhciIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhiNTU0NTM5OSwgTCJNYXJsZXR0IiwgTCJMaWJlcmF0aW9uIFNlcmlmIiwgNCwgNDJ9LA0KKyAgICB7MHhiNWRkMWViYiwgTCJCcml0YW5uaWNCb2xkIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zICINCisgICAgIEwiRXRoaW9waWMsbXJ5X0thY3N0UXVybixMaWJlcmF0aW9uIFNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhiNjk5YzFjNSwgTCJMdWNpZGFDYWxsaWdyYXBoeS1JdGFsaWMiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiDQorICAgICBMIlNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhiNzI1ZDYyOSwgTCJUaW1lc05ld1JvbWFuIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4YjdlYWViZWIsIEwiQWRvYmVIZWl0aVN0ZFIiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAwLCA5MzZ9LA0KKyAgICB7MHhiZDI5YzQ4NiwgTCJCZXJsaW5TYW5zRkJEZW1pLUJvbGQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhiZThhOGRiNCwgTCJCb29rc2hlbGZTeW1ib2xTZXZlbiIsIEwiRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4YzE2YzAxMTgsIEwiQWRvYmVIZWJyZXciLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGMzMThiMGFmLCBMIk15cmlhZFByb0xpZ2h0IiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweGM2NWU1NjU5LCBMIkNhbWJyaWFNYXRoIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZixGcmVlTW9ubyIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4Yzc1YzhmMDUsIEwiTHVjaWRhQ29uc29sZSIsDQorICAgICBMIkxpYmVyYXRpb24gTW9ubyxEZWphVnUgU2FucyBNb25vLEZyZWVNb25vLFdlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsIDEsDQorICAgICAxMjUyfSwNCisgICAgezB4Y2E3YzM1ZDYsIEwiQ2FsaWJyaSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjYjA1M2Y1MywgTCJNaWNyb3NvZnRZYUhlaSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyAiDQorICAgICBMIkphcGFuZXNlLERlamFWdSBTZXJpZiIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4Y2NhMDBjYzUsIEwiU3lzdGVtIiwgTCJEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2FkNmY3NiwgTCJKb2tlcm1hbi1SZWd1bGFyIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhjY2M1ODE4YywgTCJFdXJvU2lnbiIsIEwiRGVqYVZ1IFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweGNmM2Q3MjM0LCBMIkx1Y2lkYUhhbmR3cml0aW5nLUl0YWxpYyIsDQorICAgICBMIkxpYmVyYXRpb24gU2FucyBOYXJyb3csVWJ1bnR1IENvbmRlbnNlZCxOaW1idXMgU2FucyBMLERlamFWdSBTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4Y2Y3YjhmZGIsIEwiTWluaW9uUHJvIiwgTCJEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjZmU1NzU1ZiwgTCJTaW1oZWkiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCA5MzZ9LA0KKyAgICB7MHhkMDExZjRlZSwgTCJNU1BHb3RoaWMiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhkMDYwZTdlZiwgTCJWaXZhbGRpIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsIDgsIDEyNTJ9LA0KKyAgICB7MHhkMDdlZGVjMSwgTCJGcmFua2xpbkdvdGhpYy1NZWRpdW0iLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1IiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhkMTA3MjQzZiwgTCJTaW1TdW4iLCBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8iLCAwLCA5MzZ9LA0KKyAgICB7MHhkMTg4MTU2MiwgTCJBcmlhbE5hcnJvdyIsDQorICAgICBMIkxpYmVyYXRpb24gU2FucyBOYXJyb3csRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4ZDIyYjdkY2UsIEwiQm9kb25pTVRQb3N0ZXJDb21wcmVzc2VkIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4ZDIyYmZhNjAsIEwiQ29taWNTYW5zTVMiLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVNb25vLExpYmVyYXRpb24gTW9ubyIsIDgsIDEyNTJ9LA0KKyAgICB7MHhkM2JkMGUzNSwgTCJCYXVoYXVzOTMiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwgMCwgMTI1Mn0sDQorICAgIHsweGQ0MjllZTdhLCBMIlNURmFuZ3NvbmciLCBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsIDAsIDkzNn0sDQorICAgIHsweGQ2Njc5YzEyLCBMIkJlcm5hcmRNVENvbmRlbnNlZCIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLE5pbWJ1cyBTYW5zIEwsVVJXIENoYW5jZXJ5ICINCisgICAgIEwiTCxLYWNzdE9uZSxMaWJlcmF0aW9uIFNhbnMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGQ4ZThhMDI3LCBMIkx1Y2lkYVNhbnMiLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LE5pbWJ1cyBTYW5zIEwsS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCAiDQorICAgICBMIlNhbnMgRXRoaW9waWMsRGVqYVZ1IFNlcmlmIENvbmRlbnNlZCxMaWJlcmF0aW9uIE1vbm8sVWJ1bnR1IiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhkOWZlNzc2MSwgTCJIaWdoVG93ZXJUZXh0LVJlZyIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYiLCAyLCAxMjUyfSwNCisgICAgezB4ZGE3ZTU1MWUsIEwiU1RTb25nIiwgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLCAwLCA5MzZ9LA0KKyAgICB7MHhkYWE2ODQyZCwgTCJTVFpob25nc29uZyIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweGRhYWFiOTNmLCBMIlNURmFuZ3NvbmciLA0KKyAgICAgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuICINCisgICAgIEwiSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweGRhZWIwNzEzLCBMIlNUU29uZyIsDQorICAgICBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gIg0KKyAgICAgTCJIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLA0KKyAgICAgMCwgOTM2fSwNCisgICAgezB4ZGFmZWRiZWYsIEwiU1RDYWl5dW4iLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHhkYjAwYTNkOSwgTCJCcm9hZHdheSIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zLEZyZWVNb25vLExpYmVyYXRpb24gTW9ubyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ZGIxZjVhZDQsIEwiU1RYaW53ZWkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHhkYjMyNmU3ZiwgTCJTVEthaXRpIiwNCisgICAgIEwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiAiDQorICAgICBMIkhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsDQorICAgICAwLCA5MzZ9LA0KKyAgICB7MHhkYjY5NTk1YSwgTCJTVEh1cG8iLA0KKyAgICAgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuICINCisgICAgIEwiSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweGRiYTAwODJjLCBMIlNUWGloZWkiLA0KKyAgICAgTCIgV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiAiDQorICAgICBMIkhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsDQorICAgICAwLCA5MzZ9LA0KKyAgICB7MHhkYmQwYWIxOCwgTCJTVFhpbmdrYWkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHhkYzFhN2RiMSwgTCJTVExpdGkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHhkYzMzMDc1ZiwgTCJLcmlzdGVuSVRDLVJlZ3VsYXIiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERlamFWdSBTYW5zICINCisgICAgIEwiQ29uZGVuc2VkLFVidW50dSxMaWJlcmF0aW9uIFNhbnMiLA0KKyAgICAgOCwgMTI1Mn0sDQorICAgIHsweGRjYzcwMDljLCBMIkhhcnJpbmd0b24iLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmLEZyZWVTZXJpZixVYnVudHUiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweGRkNzEyNDY2LCBMIkFyaWFsQmxhY2siLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zLERlamFWdSBTZXJpZixGcmVlTW9ubyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkZGU4N2IzZSwgTCJJbXBhY3QiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweGRmNjlmYjMyLCBMIlNuYXBJVEMiLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LFVidW50dSBDb25kZW5zZWQsRGVqYVZ1IFNhbnMsRGVqYVZ1ICINCisgICAgIEwiU2VyaWYsRnJlZU1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGRmOGIyNWU4LCBMIkNlbnR1cnlHb3RoaWMiLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gTW9ubyxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ZTBmNzA1YzAsIEwiS3Jpc3RlbklUQyIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRGVqYVZ1IFNhbnMgIg0KKyAgICAgTCJDb25kZW5zZWQsVWJ1bnR1LExpYmVyYXRpb24gU2FucyIsDQorICAgICA4LCAxMjUyfSwNCisgICAgezB4ZTE0Mjc1NzMsIEwiUmFhdmkiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyAiDQorICAgICBMIkV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRnJlZVNlcmlmLExpYmVyYXRpb24gU2VyaWYsS2htZXIgT1MiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGUyY2VhMGNiLCBMIk1hZ25ldG8iLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERlamFWdSAiDQorICAgICBMIlNlcmlmLERlamFWdSBTZXJpZiBDb25kZW5zZWQsRGVqYVZ1IFNhbnMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGUzNmE5ZTE3LCBMIlJhdmllIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEZWphVnUgIg0KKyAgICAgTCJTZXJpZixEZWphVnUgU2FucyxGcmVlTW9ubyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4ZTQzM2Y4ZTIsIEwiUGFyY2htZW50IiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsIDgsIDEyNTJ9LA0KKyAgICB7MHhlNDNkZmY0YSwgTCJXaW5nZGluZ3MiLCBMIkRlamFWdSBTZXJpZiIsIDQsIDQyfSwNCisgICAgezB4ZTRlMmM0MDUsIEwiTVRFeHRyYSIsIEwiRGVqYVZ1IFNlcmlmIiwgNiwgNDJ9LA0KKyAgICB7MHhlNjE4Y2MzNSwgTCJJbmZvcm1hbFJvbWFuIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zICINCisgICAgIEwiSmFwYW5lc2UsTmltYnVzIFNhbnMgTCxEZWphVnUgU2FucyBDb25kZW5zZWQsVWJ1bnR1LExpYmVyYXRpb24gU2FucyIsDQorICAgICA4LCAxMjUyfSwNCisgICAgezB4ZTZjMjdmZmMsIEwiTWlzdHJhbCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCA4LCAxMjUyfSwNCisgICAgezB4ZTdlYmY0YjksIEwiQ291cmllciIsIEwiRGVqYVZ1IFNhbnMsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLEZyZWVTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ZThiYzRhOWQsIEwiTVNSZWZlcmVuY2VTcGVjaWFsdHkiLCBMIkRlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlOTBmYjAxMywgTCJUZW1wdXNTYW5zSVRDIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUsTGliZXJhdGlvbiBTZXJpZixGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4ZWM2MzdiNDIsIEwiQ29uc29sYXMiLA0KKyAgICAgTCJEZWphVnUgU2FucyBDb25kZW5zZWQsQVIgUEwgVUthaSBDTixBUiBQTCBVS2FpIEhLLEFSIFBMIFVLYWkgIg0KKyAgICAgTCJUVyxGcmVlU2VyaWYsRnJlZVNhbnMiLA0KKyAgICAgMSwgMTI1Mn0sDQorICAgIHsweGVkM2E2ODNiLCBMIlNUWGlud2VpIiwgTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLCAwLA0KKyAgICAgOTM2fSwNCisgICAgezB4ZWYyNjRjZDEsIEwiTHVjaWRhSGFuZHdyaXRpbmciLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LFVidW50dSBDb25kZW5zZWQsTmltYnVzIFNhbnMgIg0KKyAgICAgTCJMLEthY3N0UXVybixMaWJlcmF0aW9uIE1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGYwODZiY2EyLCBMIkJhc2tlcnZpbGxlT2xkRmFjZSIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYsVWJ1bnR1LEZyZWVTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ZjEwMjgwMzAsIEwiTWFuZ2FsIiwNCisgICAgIEwiRnJlZVNhbnMsVFNDdV9QYXJhbmFyLEdhcnVkYSxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTYW5zICINCisgICAgIEwiTmFycm93LE5pbWJ1cyBTYW5zIEwiLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweGYxZGE3ZWI5LCBMIlNob3djYXJkR290aGljIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYgQ29uZGVuc2VkLERlamFWdSBTYW5zICINCisgICAgIEwiQ29uZGVuc2VkLExpYmVyYXRpb24gU2FucyxVYnVudHUiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGYyMTBmMDZhLCBMIkFyaWFsTVQiLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxGcmVlU2FucyxOaW1idXMgU2FucyBMLEtobWVyIE9TICINCisgICAgIEwiU3lzdGVtLEtobWVyIE9TIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhmNDc3ZjE2YSwgTCJMYXRoYSIsDQorICAgICBMIkxpYmVyYXRpb24gU2FucyBOYXJyb3csTmltYnVzIFNhbnMgTCxEcm9pZCBBcmFiaWMgIg0KKyAgICAgTCJOYXNraCxtcnlfS2Fjc3RRdXJuLEZyZWVTZXJpZixOaW1idXMgU2FucyBMIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhmNjE2ZjNkZCwgTCJMaVN1IiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiAiDQorICAgICBMIlBMIFVNaW5nIFRXIE1CRSIsDQorICAgICAxLCA5MzZ9LA0KKyAgICB7MHhmYTQ3OWFhNiwgTCJNaWNyb3NvZnRZYUhlaSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweGZjZDE5Njk3LCBMIkJvb2ttYW5PbGRTdHlsZSIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBNb25vLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhmZTIwOWE4MiwgTCJMdWNpZGFDYWxsaWdyYXBoeSIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkICINCisgICAgIEwiU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYsRGVqYVZ1IFNhbnMsRnJlZU1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGZlZjEzNWY4LCBMIkFkb2JlSGVpdGlTdGQtUmVndWxhciIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQogfTsNCiAjZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXw0KIHN0YXRpYyBjb25zdCBYRkFfRk9OVElORk8gZ19YRkFGb250c01hcFtdID0gew0KLSAgICB7MHgwMWQ1ZDMzZSwJTCJTaW1TdW4iLAlMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsCTAsCTkzNn0sDQotICAgIHsweDAxZTRmMTAyLAlMIllvdVl1YW4iLAlMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsCTEsCTkzNn0sDQotICAgIHsweDAzMDU0OWRjLAlMIkxpU3UiLAlMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsCTEsCTkzNn0sDQotICAgIHsweDAzMmVkZDQ0LAlMIlNpbWhlaSIsCUwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwJMSwJOTM2fSwNCi0gICAgezB4MDNlYWM2ZmMsCUwiUG9vclJpY2hhcmQtUmVndWxhciIsCUwiTm90ZXdvcnRoeSxBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwJMiwJMTI1Mn0sDQotICAgIHsweDAzZWQ5MGU2LAlMIk5pbmEiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDA3N2I1NmIzLAlMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsCUwiTGFzdFJlc29ydCxBcHBsZSBDaGFuY2VyeSxTVElYVmFyaWFudHMsU1RJWFNpemVPbmVTeW0sU1RJWFNpemVPbmVTeW0sQXBwbGUgQnJhaWxsZSIsCTAsCTEyNTJ9LA0KLSAgICB7MHgwNzhlZDUyNCwJTCJNaWNyb3NvZnRTYW5zU2VyaWYiLAlMIlNvbmd0aSBTQyxBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQotICAgIHsweDA4OWIxOGE5LAlMIkFyaWFsIiwJTCJBcmlhbCBVbmljb2RlIE1TLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCi0gICAgezB4MGIyY2FkNzIsCUwiTW9ub3R5cGVDb3JzaXZhIiwJTCJBcmlhbCBOYXJyb3csSW1wYWN0IiwJOCwJMTI1Mn0sDQotICAgIHsweDBiYjAwM2U3LAlMIkthcnRpa2EiLAlMIkFyaWFsIFVuaWNvZGUgTVMsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXJpYWwgTmFycm93LERhbWFzY3VzIiwJMiwJMTI1Mn0sDQotICAgIHsweDBiYjQ2OWRmLAlMIlZpbmVySGFuZElUQyIsCUwiQ29taWMgU2FucyBNUyxTb25ndGkgU0MsU1RTb25nIiwJOCwJMTI1Mn0sDQotICAgIHsweDBiYzFhODUxLAlMIlNlZ29lVUkiLAlMIkFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCi0gICAgezB4MGMxMTJlYmQsCUwiS296dWthR290aGljUHJvLVZJTSIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHgwY2ZjYjljMSwJTCJBZG9iZVRoYWkiLAlMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCBVbHRyYSBMaWdodCIsCTAsCTg0N30sDQotICAgIHsweDBlN2RlMGY5LAlMIlBsYXliaWxsIiwJTCJTVElYTm9uVW5pY29kZSIsCTAsCTEyNTJ9LA0KLSAgICB7MHgwZWZmNDdjMywJTCJTVEh1cG8iLAlMIkthaXRpIFNDLFNvbmd0aSBTQyxTVEhlaXRpIiwJMCwJOTM2fSwNCi0gICAgezB4MTA3YWQzNzQsCUwiQ29uc3RhbnRpYSIsCUwiQXJpYWwgVW5pY29kZSBNUyxQYWxhdGlubyxCYXNrZXJ2aWxsZSIsCTIsCTEyNTJ9LA0KLSAgICB7MHgxMjE5NGMyZCwJTCJLdW5zdGxlclNjcmlwdCIsCUwiQXZlbmlyIE5leHQgQ29uZGVuc2VkIERlbWkgQm9sZCxBcmlhbCBOYXJyb3ciLAk4LAkxMjUyfSwNCi0gICAgezB4MTM1ZWY2YTEsCUwiTWluaW9uUHJvU21CZCIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHgxNThjNDA0OSwJTCJHYXJhbW9uZCIsCUwiSW1wYWN0LEFyaWFsIE5hcnJvdyIsCTIsCTEyNTJ9LA0KLSAgICB7MHgxNjBlY2IyNCwJTCJTVFpob25nc29uZyIsCUwiU1RGYW5nc29uZyxTb25ndGkgU0MiLAkwLAk5MzZ9LA0KLSAgICB7MHgxNjFlZDA3ZSwJTCJNU0dvdGhpYyIsCUwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMSwJMTI1Mn0sDQotICAgIHsweDE3MWQxZWQxLAlMIlNuYXBJVEMtUmVndWxhciIsCUwiU1RIZWl0aSxBcmlhbCBCbGFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgxOGQxMTg4ZiwJTCJDYW1icmlhIiwJTCJBcmlhbCBVbmljb2RlIE1TIiwJMiwJMTI1Mn0sDQotICAgIHsweDE4ZWFmMzUwLAlMIkFyaWFsVW5pY29kZU1TIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJOTM2fSwNCi0gICAgezB4MWE5MmQxMTUsCUwiTWluZ0xpVSIsCUwiSGVpdGkgU0MsU1RIZWl0aSIsCTEsCTEyNTJ9LA0KLSAgICB7MHgxY2MyMTdjNiwJTCJUcmVidWNoZXRNUyIsCUwiRGFtYXNjdXMsSW1wYWN0LEFyaWFsIE5hcnJvdyIsCTAsCTEyNTJ9LA0KLSAgICB7MHgxZDY0OTU5NiwJTCJCYXNlbWljVGltZXMiLAlMIkxpYmVyYXRpb24gU2VyaWYsSW1wYWN0LEFyaWFsIE5hcnJvdyIsCTAsCTEyNTJ9LA0KLSAgICB7MHgxZTM0ZWU2MCwJTCJCZWxsTVQiLAlMIlBhcHlydXMsU1RJWE5vblVuaWNvZGUsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXZlbmlyIExpZ2h0IiwJMiwJMTI1Mn0sDQotICAgIHsweDFlYjM2OTQ1LAlMIkNvb3BlckJsYWNrIiwJTCJNYXJpb24sU1RJWE5vblVuaWNvZGUsQXJpYWwgUm91bmRlZCBNVCBCb2xkLEx1Y2lkYSBHcmFuZGUiLAkyLAkxMjUyfSwNCi0gICAgezB4MWVmNzc4N2QsCUwiQmF0YW5nQ2hlIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLCxBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiBQTCBVTWluZyBUVyBNQkUsQXJpYWwgVW5pY29kZSBNUyxIZWl0aSBUQyIsCTEsCTEyNTJ9LA0KLSAgICB7MHgyMGIzYmQzYSwJTCJCcnVzaFNjcmlwdE1UIiwJTCJTVElYTm9uVW5pY29kZSxEYW1hc2N1cyxBcmlhbCBOYXJyb3csQXZlbmlyIE5leHQgQ29uZGVuc2VkLENvY2hpbiIsCTgsCTEyNTJ9LA0KLSAgICB7MHgyMjA4NzdhYSwJTCJDYW5kYXJhIiwJTCJDb2NoaW4sQmFza2VydmlsbGUsTWFyaW9uIiwJMCwJMTI1Mn0sDQotICAgIHsweDIyMTM1MDA3LAlMIkZyZWVzdHlsZVNjcmlwdC1SZWd1bGFyIiwJTCJTVElYTm9uVW5pY29kZSxOYWRlZW0sWmFwZiBEaW5nYmF0cyIsCTgsCTEyNTJ9LA0KLSAgICB7MHgyNTEwNTljMywJTCJDaGlsbGVyIiwJTCJaYXBmIERpbmdiYXRzLERhbWFzY3VzLFNUSVhOb25Vbmljb2RlLFBhcHlydXMsS3VmaVN0YW5kYXJkR0ssQmFnaGRhZCIsCTAsCTEyNTJ9LA0KLSAgICB7MHgyNWJlZDZkZCwJTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsCUwiVGFob21hLEFwcGxlIFN5bWJvbHMsQXBwbGUgTGlHb3RoaWMsQXJpYWwgVW5pY29kZSBNUyxMdWNpZGEgR3JhbmRlLE1pY3Jvc29mdCBTYW5zIFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDI4MTU0YzgxLAlMIlBhcmNobWVudC1SZWd1bGFyIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJOCwJMTI1Mn0sDQotICAgIHsweDI5NzExZWI5LAlMIlNUTGl0aSIsCUwiS2FpdGkgU0MsU29uZ3RpIFNDIiwJMCwJOTM2fSwNCi0gICAgezB4MmIxOTkzYjQsCUwiQmFzZW1pYyIsCUwiSW1wYWN0LEFyaWFsIE5hcnJvdyIsCTAsCTEyNTJ9LA0KLSAgICB7MHgyYjMxNjMzOSwJTCJOaWFnYXJhU29saWQtUmVnIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQotICAgIHsweDJjMTQ3NTI5LAlMIkZvb3RsaWdodE1UTGlnaHQiLAlMIlNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSxQVCBTYW5zLE5vdGV3b3J0aHkiLAkwLAkxMjUyfSwNCi0gICAgezB4MmMxOTg5MjgsCUwiSGFybG93U29saWQiLAlMIkF2ZW5pciBNZWRpdW0sQXZlbmlyIE5leHQgTWVkaXVtLEFyaWFsIFVuaWNvZGUgTVMiLAkwLAkxMjUyfSwNCi0gICAgezB4MmM2YWM2YjIsCUwiTHVjaWRhQnJpZ2h0IiwJTCJQVCBTYW5zIE5hcnJvdyxQYXB5cnVzLERhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEFyaWFsIFJvdW5kZWQgTVQgQm9sZCxDb21pYyBTYW5zIE1TLEF2ZW5pciBOZXh0IiwJMiwJMTI1Mn0sDQotICAgIHsweDJjOWYzOGUyLAlMIktvenVrYU1pbmNob1Byby1WSVIiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCi0gICAgezB4MmQ1YTQ3YjAsCUwiU1RDYWl5dW4iLAlMIkthaXRpIFNDLFNvbmd0aSBTQyIsCTAsCTkzNn0sDQotICAgIHsweDJkZWYyNmJmLAlMIkJlcm5hcmRNVC1Db25kZW5zZWQiLAlMIkltcGFjdCxBdmVuaXIgTmV4dCBDb25kZW5zZWQgRGVtaSBCb2xkLEFtZXJpY2FuIFR5cGV3cml0ZXIiLAkwLAkxMjUyfSwNCi0gICAgezB4MmZkODkzMGIsCUwiS296dWthTWluY2hvUHI2TlIiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCi0gICAgezB4MzExNTUyNWEsCUwiRmFuZ1NvbmdfR0IyMzEyIiwJTCJIaXJhZ2lubyBTYW5zIEdCLFNUSGVpdGkiLAkwLAkxMjUyfSwNCi0gICAgezB4MzEzMjc4MTcsCUwiTXlyaWFkUHJvIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQotICAgIHsweDMyMjQ0OTc1LCAgICBMIkhlbHZldGljYSIsIEwiQXJpYWwgTmFycm93LEFyaWFsIFVuaWNvZGUgTVMsRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUiLAkgMCwgICAxMjUyfSwNCi0gICAgezB4MzJhYzk5NWMsCUwiVGVybWluYWwiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCi0gICAgezB4MzM4ZDY0OGEsCUwiTmlhZ2FyYUVuZ3JhdmVkLVJlZyIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzM2JiNjVmMiwJTCJTeWxmYWVuIiwJTCJBcmlhbCBVbmljb2RlIE1TLE1hcmlvbiIsCTIsCTEyNTJ9LA0KLSAgICB7MHgzNDAyYzMwZSwJTCJNU1BNaW5jaG8iLAlMIkFyaWFsIFVuaWNvZGUgTVMsQXBwbGUgU0QgR290aGljIE5lbyIsCTIsCTEyNTJ9LA0KLSAgICB7MHgzNDEyYmYzMSwJTCJTaW1TdW4tUFVBIiwJTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLAkwLAk5MzZ9LA0KLSAgICB7MHgzNmViMzliOSwJTCJCZXJsaW5TYW5zRkIiLAlMIkFtZXJpY2FuIFR5cGV3cml0ZXIsSW1wYWN0IiwJMCwJMTI1Mn0sDQotICAgIHsweDM2ZjQyMDU1LAlMIlVuaXZlcnNBVFQiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweDM4NjRjNGY2LAlMIkhpZ2hUb3dlclRleHQiLAlMIlNUSVhHZW5lcmFsLC5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJIiwJMiwJMTI1Mn0sDQotICAgIHsweDNhMjU3ZDAzLAlMIkZhbmdTb25nX0dCMjMxMiIsCUwiSGlyYWdpbm8gU2FucyBHQixTVEhlaXRpIiwJMCwJMTI1Mn0sDQotICAgIHsweDNjZGFlNjY4LAlMIkZyZWVzdHlsZVNjcmlwdCIsCUwiTmFkZWVtLFphcGYgRGluZ2JhdHMsU1RJWE5vblVuaWNvZGUiLAk4LAkxMjUyfSwNCi0gICAgezB4M2Q1NWFlZDcsCUwiSm9rZXJtYW4iLAlMIlBhcHlydXMsTHVjaWRhIEdyYW5kZSxIZWl0aSBUQyxBbWVyaWNhbiBUeXBld3JpdGVyIiwJMCwJMTI1Mn0sDQotICAgIHsweDNkNWI0Mzg1LAlMIlBNaW5nTGlVIiwJTCJIZWl0aSBTQyxTVEhlaXRpIiwJMiwJMTI1Mn0sDQotICAgIHsweDNkOWI3NjY5LAlMIkVzdHJhbmdlbG9FZGVzc2EiLAlMIkFtZXJpY2FuIFR5cGV3cml0ZXIsTWFyaW9uIiwJMCwJMTI1Mn0sDQotICAgIHsweDNlNTMyZDc0LAlMIkZyYW5rbGluR290aGljTWVkaXVtIiwJTCJJbXBhY3QsQXJpYWwgTmFycm93IiwJMCwJMTI1Mn0sDQotICAgIHsweDNlNmFhMzJkLAlMIk5TaW1TdW4iLAlMIlNUSGVpdGksU1RGYW5nc29uZyIsCTEsCTkzNn0sDQotICAgIHsweDNmNmMzNmE4LAlMIkdhdXRhbWkiLAlMIkRhbWFzY3VzLFNUSVhOb25Vbmljb2RlLFNUSVhHZW5lcmFsLEFtZXJpY2FuIFR5cGV3cml0ZXIiLAkwLAkxMjUyfSwNCi0gICAgezB4M2ZmMzI2NjIsCUwiQ2hpbGxlci1SZWd1bGFyIiwJTCJQYXB5cnVzLEt1ZmlTdGFuZGFyZEdLLEJhZ2hkYWQiLAkwLAkxMjUyfSwNCi0gICAgezB4NDA5ZGUzMTIsCUwiTW9kZXJuTm8uMjAiLAlMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLAkyLAkxMjUyfSwNCi0gICAgezB4NDE0NDNjNWUsCUwiR2VvcmdpYSIsCUwiLkhlbHZldGljYSBOZXVlIERlc2sgVUksQXJpYWwgVW5pY29kZSBNUyIsCTIsCTEyNTJ9LA0KLSAgICB7MHg0MTYwYWRlNSwJTCJCZWxsR290aGljU3RkQmxhY2siLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCi0gICAgezB4NDIxOTc2YzQsCUwiTW9kZXJuLVJlZ3VsYXIiLAlMIkltcGFjdCIsCTIsCTEyNTJ9LA0KLSAgICB7MHg0MjJhNzI1MiwJTCJTdGVuY2lsIiwJTCJTVElYTm9uVW5pY29kZSxTb25ndGkgU0MsR2VvcmdpYSxCYXNrZXJ2aWxsZSIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0MmM4NTU0ZiwJTCJGaXhlZHN5cyIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0MzVjYjQxZCwJTCJSb21hbiIsCUwiQXJpYWwgTmFycm93IiwJMCwJMTI1Mn0sDQotICAgIHsweDQ3ODgyMzgzLAlMIkNvdXJpZXJOZXciLAlMIlBDTXl1bmdqbyxPc2FrYSxBcmlhbCBVbmljb2RlIE1TLFNvbmd0aSBTQyIsCTEsCTEyNTJ9LA0KLSAgICB7MHg0ODBhMjMzOCwJTCJCZXJsaW5TYW5zRkJEZW1pIiwJTCJTVElYTm9uVW5pY29kZSxBbWVyaWNhbiBUeXBld3JpdGVyLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0ODBiZjdhNCwJTCJDb3VyaWVyU3RkIiwJTCJDb3VyaWVyIE5ldyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0ODFhZDZlZCwJTCJWbGFkaW1pclNjcmlwdCIsCUwiU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsCTgsCTEyNTJ9LA0KLSAgICB7MHg0OTExNTc3YSwJTCJZb3VZdWFuIiwJTCJTVEhlaXRpLEhlaXRpIFRDIiwJMSwJOTM2fSwNCi0gICAgezB4NGE3ODhkNzIsCUwiU1RYaW5na2FpIiwJTCJLYWl0aSBTQyxTb25ndGkgU0MiLAkwLAk5MzZ9LA0KLSAgICB7MHg0YmY4ODU2NiwJTCJTZWdvZUNvbmRlbnNlZCIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0Y2NmNTFhNCwJTCJCZXJsaW5TYW5zRkItUmVnIiwJTCJTVElYTm9uVW5pY29kZSxBbWVyaWNhbiBUeXBld3JpdGVyLEltcGFjdCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0ZWE5NjdjZSwJTCJHdWxpbUNoZSIsCUwiQXJpYWwgVW5pY29kZSBNUyxIZWl0aSBUQyxTVEZhbmdzb25nIiwJMSwJMTI1Mn0sDQotICAgIHsweDRmNjhiZDc5LAlMIkxldHRlckdvdGhpY1N0ZCIsCUwiQ291cmllciBOZXcsQW5kYWxlIE1vbm8sQXl1dGhheWEsUENNeXVuZ2pvLE9zYWthIiwJMCwJMTI1Mn0sDQotICAgIHsweDUxYTBkMGU2LAlMIktvenVrYUdvdGhpY1ByNk5NIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQotICAgIHsweDUzMWIzZGVhLAlMIkJhc2VtaWNTeW1ib2wiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCi0gICAgezB4NTMzM2ZkMzksCUwiQ2FsaWZvcm5pYW5GQi1SZWciLAlMIkFtZXJpY2FuIFR5cGV3cml0ZXIsQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsCTIsCTEyNTJ9LA0KLSAgICB7MHg1MzU2MWE1NCwJTCJGWllUSy0tR0JLMS0wIiwJTCJTVEZhbmdzb25nLFNvbmd0aSBTQyxTVFNvbmciLAkwLAk5MzZ9LA0KLSAgICB7MHg1NWUwZGRlNiwJTCJMdWNpZGFTYW5zVHlwZXdyaXRlciIsCUwiTWVubG8sQ291cmllciBOZXcsQW5kYWxlIE1vbm8iLAkwLAkxMjUyfSwNCi0gICAgezB4NTc0ZDRkM2QsCUwiQWRvYmVBcmFiaWMiLAlMIkFyaWFsIE5hcnJvdyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg1NzkyZTc1OSwJTCJTVEthaXRpIiwJTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsCTAsCTkzNn0sDQotICAgIHsweDU5MjE5NzhlLAlMIkx1Y2lkYVNhbnNVbmljb2RlIiwJTCJMdWNpZGEgR3JhbmRlLEFyaWFsIFVuaWNvZGUgTVMsTWVubG8iLAkwLAkxMjUyfSwNCi0gICAgezB4NTk0ZTJkYTQsCUwiVnJpbmRhIiwJTCJHZWV6YSBQcm8sRGFtYXNjdXMsU1RJWEdlbmVyYWwsR2lsbCBTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweDU5YmFhOWEyLAlMIkthaVRpX0dCMjMxMiIsCUwiSGlyYWdpbm8gU2FucyBHQixTVEhlaXRpIiwJMCwJMTI1Mn0sDQotICAgIHsweDVjZmVkZjRmLAlMIkJhc2tPbGRGYWNlIiwJTCJBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnksUFQgU2FucyxBdmVuaXIgTmV4dCBDb25kZW5zZWQiLAkwLAkxMjUyfSwNCi0gICAgezB4NWUxNmFjOTEsICAgIEwiVHJhamFuUHJvIiwgICBMIkFyaWFsIE5hcnJvdyxQVCBTYW5zIE5hcnJvdyxEYW1hc2N1cyIsICAwLCAgMTI1Mn0sDQotICAgIHsweDVmOTc5MjFjLAlMIkFkb2JlTXl1bmdqb1N0ZE0iLAlMIkFwcGxlTXl1bmdqbyxBcHBsZUdvdGhpYyxBcmlhbCBVbmljb2RlIE1TIiwJMCwJOTM2fSwNCi0gICAgezB4NWZlZmJmYWQsCUwiQmF0YW5nIiwJTCJBcmlhbCBVbmljb2RlIE1TLFNvbmd0aSBTQyIsCTIsCTEyNTJ9LA0KLSAgICB7MHg2MDUzNDJiOSwJTCJEb3R1bUNoZSIsCUwiQXJpYWwgVW5pY29kZSBNUyxIZWl0aSBUQyIsCTEsCTEyNTJ9LA0KLSAgICB7MHg2MDhjNWY5YSwJTCJLYWlUaV9HQjIzMTIiLAlMIkhpcmFnaW5vIFNhbnMgR0IsU1RIZWl0aSxIZWl0aSBUQyIsCTAsCTkzNn0sDQotICAgIHsweDYxZWZkMGQxLAlMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLAlMIktva29ub3IsRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsU1RIZWl0aSxBcmlhbCBCbGFjayxBdmVuaXIgTmV4dCBIZWF2eSIsCTAsCTEyNTJ9LA0KLSAgICB7MHg2MjY2MDhhOSwJTCJNVkJvbGkiLAlMIkFwcGxlIEJyYWlsbGUsR2VlemEgUHJvLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCi0gICAgezB4NjMwNTAxYTMsCUwiU21hbGxGb250cyIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg2NWQwZTJhOSwJTCJGWllUSy0tR0JLMS0wIiwJTCJTVEZhbmdzb25nLFNvbmd0aSBTQyxTVFNvbmciLAkwLAk5MzZ9LA0KLSAgICB7MHg2NjlmMjllMSwJTCJGWlNUSy0tR0JLMS0wIiwJTCJTVEhlaXRpLEhlaXRpIFRDIiwJMCwJOTM2fSwNCi0gICAgezB4NjczYTllNWYsCUwiVHVuZ2EiLAlMIkRhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCxBdmVuaXIgTmV4dCBDb25kZW5zZWQgVWx0cmEgTGlnaHQsRnV0dXJhIiwJMCwJMTI1Mn0sDQotICAgIHsweDY5MWFhNGNlLAlMIk5pYWdhcmFTb2xpZCIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg2OTYyNTliNywJTCJDb3JiZWwiLAlMIkNvY2hpbixCYXNrZXJ2aWxsZSxNYXJpb24iLAkwLAkxMjUyfSwNCi0gICAgezB4Njk2ZWU5YmUsCUwiU1RYaWhlaSIsCUwiU1RIZWl0aSxIZWl0aSBUQyxTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsCTAsCTkzNn0sDQotICAgIHsweDZjNTljZjY5LAlMIkRvdHVtIiwJTCJBcmlhbCBVbmljb2RlIE1TLFNvbmd0aSBTQyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3MDdmYTU2MSwJTCJHdW5nc3VoIiwJTCJBcmlhbCBVbmljb2RlIE1TLEhlaXRpIFRDIiwJMiwJMTI1Mn0sDQotICAgIHsweDcxNDE2YmIyLAlMIlpXQWRvYmVGIiwJTCJTVElYU2l6ZUZvdXJTeW0sU1RJWFNpemVUaHJlZVN5bSxTVElYU2l6ZVR3b1N5bSxTVElYU2l6ZU9uZVN5bSIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3MWI0MTgwMSwJTCJWZXJkYW5hIiwJTCJUYWhvbWEsTWFyaW9uLEFwcGxlIFN5bWJvbHMsLkhlbHZldGljYSBOZXVlIERlc2sgVUksTHVjaWRhIEdyYW5kZSxDb3VyaWVyIE5ldyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3M2YyNWU0YywJTCJQYWxhdGlub0xpbm90eXBlIiwJTCJQYWxhdGlubyxBcmlhbCBVbmljb2RlIE1TIiwJMCwJMTI1Mn0sDQotICAgIHsweDczZjRkMTlmLAlMIk5pYWdhcmFFbmdyYXZlZCIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3NDAwMTY5NCwJTCJNeXJpYWRQcm9CbGFjayIsCUwiUGFsYXRpbm8sQmFza2VydmlsbGUsTWFyaW9uLENvY2hpbiIsCTAsCTEyNTJ9LA0KLSAgICB7MHg3NGIxNGQ4ZiwJTCJIYWV0dGVuc2Nod2VpbGVyIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQotICAgIHsweDc0Y2I0NGVlLAlMIk5TaW1TdW4iLAlMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsCTEsCTkzNn0sDQotICAgIHsweDc2YjRkN2ZmLAlMIlNocnV0aSIsCUwiRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsQXJpYWwgVW5pY29kZSBNUyxBbWVyaWNhbiBUeXBld3JpdGVyIiwJMCwJMTI1Mn0sDQotICAgIHsweDc4OGIzNTMzLAlMIldlYmRpbmdzIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJNiwJNDJ9LA0KLSAgICB7MHg3OTdkZGU5OSwJTCJNU1NlcmlmIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQotICAgIHsweDdhMGY5ZTllLAlMIk1TTWluY2hvIiwJTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSIFBMIFVNaW5nIFRXIE1CRSxBcmlhbCBVbmljb2RlIE1TLEFwcGxlIFNEIEdvdGhpYyBOZW8iLAkxLAkxMjUyfSwNCi0gICAgezB4N2I0MzljYWYsCUwiT2xkRW5nbGlzaFRleHRNVCIsCUwiU1RJWE5vblVuaWNvZGUsQXJpYWwgVW5pY29kZSBNUyxCYXNrZXJ2aWxsZSxBdmVuaXIgTmV4dCBNZWRpdW0iLAkwLAkxMjUyfSwNCi0gICAgezB4ODIxM2E0MzMsCUwiTHVjaWRhU2Fucy1UeXBld3JpdGVyIiwJTCJDb21pYyBTYW5zIE1TLEF2ZW5pciBOZXh0LEFyaWFsIFJvdW5kZWQgTVQgQm9sZCIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4MmZlYzkyOSwJTCJBZG9iZVNvbmdTdGRMIiwJTCJIZWl0aSBUQyxTVEhlaXRpIiwJMCwJOTM2fSwNCi0gICAgezB4ODM1ODE4MjUsCUwiTW9kZXJuIiwJTCJBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwJMCwJMTI1Mn0sDQotICAgIHsweDgzNWEyODIzLAlMIkFsZ2VyaWFuIiwJTCJTVElYTm9uVW5pY29kZSxCYXNrZXJ2aWxsZSxBdmVuaXIgTmV4dCBNZWRpdW0sQW1lcmljYW4gVHlwZXdyaXRlciIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4M2RhYjlmNSwJTCJTY3JpcHQiLAlMIkFyaWFsIE5hcnJvdyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4NDdiNTZkYSwJTCJUYWhvbWEiLAlMIlNvbmd0aSBTQyxBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQotICAgIHsweDhhNzgzY2IyLAlMIlNpbVN1bi1QVUEiLAlMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4YjVjYWMwZSwJTCJPbnl4IiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQotICAgIHsweDhjNmE0OTllLAlMIkd1bGltIiwJTCJBcmlhbCBVbmljb2RlIE1TLFNvbmd0aSBTQyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4ZTBhZjc5MCwJTCJKdWljZUlUQyIsCUwiTmFkZWVtLEFsIEJheWFuIiwJMCwJMTI1Mn0sDQotICAgIHsweDhlOGQ0M2IyLAlMIkNlbnRhdXIiLAlMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCxOb3Rld29ydGh5LEltcGFjdCIsCTIsCTEyNTJ9LA0KLSAgICB7MHg4ZWU0ZGNjYSwJTCJCb29rc2hlbGZTeW1ib2w3IiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQotICAgIHsweDkwNzk0ODAwLAlMIkJlbGxHb3RoaWNTdGRMaWdodCIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg5MDliNTE2YSwJTCJDZW50dXJ5IiwJTCJEYW1hc2N1cyxBbmRhbGUgTW9ubyxTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsCTIsCTEyNTJ9LA0KLSAgICB7MHg5MmFlMzcwZCwJTCJNU091dGxvb2siLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAk0LAk0Mn0sDQotICAgIHsweDkzYzlmYmYxLAlMIkx1Y2lkYUZheCIsCUwiUFQgU2FucyBOYXJyb3csUGFweXJ1cyxLb2tvbm9yLEdlZXphIFBybyxBcmlhbCBSb3VuZGVkIE1UIEJvbGQsTHVjaWRhIEdyYW5kZSxGdXR1cmEiLAkyLAkxMjUyfSwNCi0gICAgezB4OTU2NTA4NWUsCUwiQm9va0FudGlxdWEiLAlMIlBhbGF0aW5vLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkyLAkxMjUyfSwNCi0gICAgezB4OTg1NmQ5NWQsCUwiQWRvYmVNaW5nU3RkTCIsCUwiQUhpcmFnaW5vIFNhbnMgR0IsSGVpdGkgVEMsU1RIZWl0aSIsCTAsCTk0OX0sDQotICAgIHsweDliYmFkZDZiLAlMIkNvbG9ubmFNVCIsCUwiTm90ZXdvcnRoeSxBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwJMCwJMTI1Mn0sDQotICAgIHsweDljYmQxNmE0LAlMIlNob3djYXJkR290aGljLVJlZyIsCUwiQXJpYWwgVW5pY29kZSBNUyxHZW9yZ2lhLEFtZXJpY2FuIFR5cGV3cml0ZXIiLAkwLAkxMjUyfSwNCi0gICAgezB4OWQ3MzAwOGUsCUwiTVNTYW5zU2VyaWYiLAlMIlNvbmd0aSBTQyxBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQotICAgIHsweGEwNjA3ZGIxLAlMIkd1bmdzdWhDaGUiLAlMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFcsQVIgUEwgVU1pbmcgVFcgTUJFLEFyaWFsIFVuaWNvZGUgTVMsSGVpdGkgVEMsU1RGYW5nc29uZyIsCTEsCTEyNTJ9LA0KLSAgICB7MHhhMGJjZjZhMSwJTCJMYXRpbldpZGUiLAlMIlphcGZpbm8sQXJpYWwgQmxhY2ssU1RIZWl0aSIsCTIsCTEyNTJ9LA0KLSAgICB7MHhhMTQyOWIzNiwJTCJTeW1ib2wiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAk2LAk0Mn0sDQotICAgIHsweGExZmE1YWJjLAlMIldpbmdkaW5nczIiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAk2LAk0Mn0sDQotICAgIHsweGExZmE1YWJkLAlMIldpbmdkaW5nczMiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAk2LAk0Mn0sDQotICAgIHsweGE0MjdiYWQ0LAlMIkluZm9ybWFsUm9tYW4tUmVndWxhciIsCUwiU1RJWE5vblVuaWNvZGUsQXJpYWwgTmFycm93LEF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQiLAk4LAkxMjUyfSwNCi0gICAgezB4YThiOTJlY2UsCUwiRlpTVEstLUdCSzEtMCIsCUwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwJMCwJOTM2fSwNCi0gICAgezB4YThkODNlY2UsCUwiQ2FsaWZvcm5pYW5GQiIsCUwiQW1lcmljYW4gVHlwZXdyaXRlcixBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwJMiwJMTI1Mn0sDQotICAgIHsweGFhM2UwODJjLAlMIktpbmdzb2Z0LVBob25ldGljIiwJTCJTVElYVmFyaWFudHMsU1RJWFNpemVPbmVTeW0sQXBwbGUgQnJhaWxsZSIsCTAsCTEyNTJ9LA0KLSAgICB7MHhhYTZiY2FiZSwJTCJIYXJsb3dTb2xpZEl0YWxpYyIsCUwiU1RJWE5vblVuaWNvZGUsQXZlbmlyIE1lZGl1bSxBdmVuaXIgTmV4dCBNZWRpdW0sQXJpYWwgVW5pY29kZSBNUyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhhZGU1MzM3YywJTCJNU1VJR290aGljIiwJTCJBcmlhbCBVbmljb2RlIE1TLEFwcGxlIFNEIEdvdGhpYyBOZW8iLAkwLAkxMjUyfSwNCi0gICAgezB4YjA4ZGQ5NDEsCUwiV2lkZUxhdGluIiwJTCJNYXJpb24sUGFweXJ1cyxOYW51bSBQZW4gU2NyaXB0LFphcGYgRGluZ2JhdHMsRGFtYXNjdXMsWmFwZmlubyxBcmlhbCBCbGFjayxTVEhlaXRpIiwJMiwJMTI1Mn0sDQotICAgIHsweGIxMjc2NWUwLCAgICBMIklUQ0xlZ2FjeVNhbnNTdGRCb29rIiwgIEwiTGFzdFJlc29ydCwuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxBcmlhbCBVbmljb2RlIE1TLFBhbGF0aW5vIiwgICAwLCAgMTI1Mn0sDQotICAgIHsweGIyMDdmMDVkLAlMIlBvb3JSaWNoYXJkIiwJTCJOb3Rld29ydGh5LEF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLAkyLAkxMjUyfSwNCi0gICAgezB4YjNiYzQ5MmYsCUwiSnVpY2VJVEMtUmVndWxhciIsCUwiTmFkZWVtLEFsIEJheWFuLFNUSVhOb25Vbmljb2RlIiwJMCwJMTI1Mn0sDQotICAgIHsweGI1NTQ1Mzk5LAlMIk1hcmxldHQiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAk0LAk0Mn0sDQotICAgIHsweGI1ZGQxZWJiLAlMIkJyaXRhbm5pY0JvbGQiLAlMIkRhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSxQVCBTYW5zIiwJMCwJMTI1Mn0sDQotICAgIHsweGI2OTljMWM1LAlMIkx1Y2lkYUNhbGxpZ3JhcGh5LUl0YWxpYyIsCUwiU1RIZWl0aSxBcmlhbCBCbGFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHhiNzI1ZDYyOSwJTCJUaW1lc05ld1JvbWFuIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMiwJMTI1Mn0sDQotICAgIHsweGI3ZWFlYmViLAlMIkFkb2JlSGVpdGlTdGRSIiwJTCJIZWl0aSBUQyxTVEhlaXRpIiwJMCwJOTM2fSwNCi0gICAgezB4YmQyOWM0ODYsCUwiQmVybGluU2Fuc0ZCRGVtaS1Cb2xkIiwJTCJBbWVyaWNhbiBUeXBld3JpdGVyLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSIsCTAsCTEyNTJ9LA0KLSAgICB7MHhiZThhOGRiNCwJTCJCb29rc2hlbGZTeW1ib2xTZXZlbiIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjMTZjMDExOCwJTCJBZG9iZUhlYnJldyIsCUwiLkhlbHZldGljYSBOZXVlIERlc2sgVUksUGFsYXRpbm8sQW1lcmljYW4gVHlwZXdyaXRlciIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjMzE4YjBhZiwJTCJNeXJpYWRQcm9MaWdodCIsCUwiUGFsYXRpbm8sQmFza2VydmlsbGUsTWFyaW9uIiwJMCwJMTI1Mn0sDQotICAgIHsweGM2NWU1NjU5LAlMIkNhbWJyaWFNYXRoIiwJTCJBcmlhbCBVbmljb2RlIE1TIiwJMiwJMTI1Mn0sDQotICAgIHsweGM3NWM4ZjA1LAlMIkx1Y2lkYUNvbnNvbGUiLAlMIkNvdXJpZXIgTmV3LE1lbmxvLEFuZGFsZSBNb25vIiwJMSwJMTI1Mn0sDQotICAgIHsweGNhN2MzNWQ2LAlMIkNhbGlicmkiLAlMIkFwcGxlIFN5bWJvbHMsSGVhZExpbmVBIiwJMCwJMTI1Mn0sDQotICAgIHsweGNiMDUzZjUzLAlMIk1pY3Jvc29mdFlhSGVpIiwJTCJBcmlhbCBVbmljb2RlIE1TIiwJMCwJOTM2fSwNCi0gICAgezB4Y2I3MTkwZjksCUwiTWFnbmV0by1Cb2xkIiwJTCJMdWNpZGEgR3JhbmRlIiwJMCwJMTI1Mn0sDQotICAgIHsweGNjYTAwY2M1LAlMIlN5c3RlbSIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjY2FkNmY3NiwJTCJKb2tlcm1hbi1SZWd1bGFyIiwJTCJMdWNpZGEgR3JhbmRlIiwJMCwJMTI1Mn0sDQotICAgIHsweGNjYzU4MThjLAlMIkV1cm9TaWduIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJMCwJMTI1Mn0sDQotICAgIHsweGNmM2Q3MjM0LAlMIkx1Y2lkYUhhbmR3cml0aW5nLUl0YWxpYyIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjZjdiOGZkYiwJTCJNaW5pb25Qcm8iLAlMIkJlbGwgTVQsQ29yYmVsLFRpbWVzIE5ldyBSb21hbixDYW1icmlhLEJlcmxpbiBTYW5zIEZCIiwJMCwJMTI1Mn0sDQotICAgIHsweGNmZTU3NTVmLAlMIlNpbWhlaSIsCUwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwJMSwJOTM2fSwNCi0gICAgezB4ZDAxMWY0ZWUsCUwiTVNQR290aGljIiwJTCJBcmlhbCBVbmljb2RlIE1TLEFwcGxlIFNEIEdvdGhpYyBOZW8iLAkwLAkxMjUyfSwNCi0gICAgezB4ZDA2MGU3ZWYsCUwiVml2YWxkaSIsCUwiU1RJWE5vblVuaWNvZGUsQXJpYWwgVW5pY29kZSBNUyxBdmVuaXIgTWVkaXVtLEF2ZW5pciBOZXh0IE1lZGl1bSIsCTgsCTEyNTJ9LA0KLSAgICB7MHhkMDdlZGVjMSwJTCJGcmFua2xpbkdvdGhpYy1NZWRpdW0iLAlMIkltcGFjdCxBcmlhbCBOYXJyb3ciLAkwLAkxMjUyfSwNCi0gICAgezB4ZDEwNzI0M2YsCUwiU2ltU3VuIiwJTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLAkwLAk5MzZ9LA0KLSAgICB7MHhkMTg4MTU2MiwJTCJBcmlhbE5hcnJvdyIsCUwiUFQgU2FucyBOYXJyb3csQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhkMjJiN2RjZSwJTCJCb2RvbmlNVFBvc3RlckNvbXByZXNzZWQiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCi0gICAgezB4ZDIyYmZhNjAsCUwiQ29taWNTYW5zTVMiLAlMIkRhbWFzY3VzLEdlb3JnaWEsLkhlbHZldGljYSBOZXVlIERlc2sgVUksTHVjaWRhIEdyYW5kZSxBcmlhbCBVbmljb2RlIE1TIiwJOCwJMTI1Mn0sDQotICAgIHsweGQzYmQwZTM1LAlMIkJhdWhhdXM5MyIsCUwiU1RJWE5vblVuaWNvZGUsQXJpYWwgVW5pY29kZSBNUyxBdmVuaXIgTmV4dCxBdmVuaXIiLAkwLAkxMjUyfSwNCi0gICAgezB4ZDQyOWVlN2EsCUwiU1RGYW5nc29uZyIsCUwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLAkwLAk5MzZ9LA0KLSAgICB7MHhkNjY3OWMxMiwJTCJCZXJuYXJkTVRDb25kZW5zZWQiLAlMIkltcGFjdCxBdmVuaXIgTmV4dCBDb25kZW5zZWQgRGVtaSBCb2xkIiwJMCwJMTI1Mn0sDQotICAgIHsweGQ4ZThhMDI3LAlMIkx1Y2lkYVNhbnMiLAlMIkFyaWFsIE5hcnJvdyxLaG1lciBNTixLb2tvbm9yLERhbWFzY3VzLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAkwLAkxMjUyfSwNCi0gICAgezB4ZDlmZTc3NjEsCUwiSGlnaFRvd2VyVGV4dC1SZWciLAlMIlNUSVhHZW5lcmFsLC5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJLFRyZWJ1Y2hldCBNUyIsCTIsCTEyNTJ9LA0KLSAgICB7MHhkYTdlNTUxZSwJTCJTVFNvbmciLAlMIkFyaWFsIFVuaWNvZGUgTVMiLAkwLAk5MzZ9LA0KLSAgICB7MHhkYWE2ODQyZCwJTCJTVFpob25nc29uZyIsCUwiU1RGYW5nc29uZyxTb25ndGkgU0MsU1RTb25nIiwJMCwJOTM2fSwNCi0gICAgezB4ZGFhYWI5M2YsCUwiU1RGYW5nc29uZyIsCUwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLAkwLAk5MzZ9LA0KLSAgICB7MHhkYWViMDcxMywJTCJTVFNvbmciLAlMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwJMCwJOTM2fSwNCi0gICAgezB4ZGFmZWRiZWYsCUwiU1RDYWl5dW4iLAlMIkthaXRpIFNDLFNvbmd0aSBTQyxTVEhlaXRpIiwJMCwJOTM2fSwNCi0gICAgezB4ZGIwMGEzZDksCUwiQnJvYWR3YXkiLAlMIlBhcHlydXMsU1RJWE5vblVuaWNvZGUsQXJpYWwgQmxhY2ssQXZlbmlyIE5leHQgSGVhdnksSGVpdGkgVEMiLAkwLAkxMjUyfSwNCi0gICAgezB4ZGIxZjVhZDQsCUwiU1RYaW53ZWkiLAlMIkthaXRpIFNDLFNvbmd0aSBTQyxTVEhlaXRpIiwJMCwJOTM2fSwNCi0gICAgezB4ZGIzMjZlN2YsCUwiU1RLYWl0aSIsCUwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLAkwLAk5MzZ9LA0KLSAgICB7MHhkYjY5NTk1YSwJTCJTVEh1cG8iLAlMIkthaXRpIFNDLFNvbmd0aSBTQyxTVEhlaXRpIiwJMCwJOTM2fSwNCi0gICAgezB4ZGJhMDA4MmMsCUwiU1RYaWhlaSIsCUwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLAkwLAk5MzZ9LA0KLSAgICB7MHhkYmQwYWIxOCwJTCJTVFhpbmdrYWkiLAlMIkthaXRpIFNDLFNvbmd0aSBTQyIsCTAsCTkzNn0sDQotICAgIHsweGRjMWE3ZGIxLAlMIlNUTGl0aSIsCUwiS2FpdGkgU0MsU29uZ3RpIFNDIiwJMCwJOTM2fSwNCi0gICAgezB4ZGMzMzA3NWYsCUwiS3Jpc3RlbklUQy1SZWd1bGFyIiwJTCJTVElYTm9uVW5pY29kZSxEYW1hc2N1cyxTb25ndGkgU0MsU1RTb25nIiwJOCwJMTI1Mn0sDQotICAgIHsweGRjYzcwMDljLAlMIkhhcnJpbmd0b24iLAlMIlNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSxOb3Rld29ydGh5IiwJMCwJMTI1Mn0sDQotICAgIHsweGRkNzEyNDY2LAlMIkFyaWFsQmxhY2siLAlMIkdlZXphIFBybyxEYW1hc2N1cyxTb25ndGkgU0MsU1RTb25nIiwJMCwJMTI1Mn0sDQotICAgIHsweGRkZTg3YjNlLAlMIkltcGFjdCIsCUwiQXJpYWwgTmFycm93LE1hcmlvbiIsCTAsCTEyNTJ9LA0KLSAgICB7MHhkZjY5ZmIzMiwJTCJTbmFwSVRDIiwJTCJBcmlhbCBOYXJyb3csUFQgU2FucyBOYXJyb3csTWFyaW9uLFNUSGVpdGksQXJpYWwgQmxhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4ZGY4YjI1ZTgsCUwiQ2VudHVyeUdvdGhpYyIsCUwiRGFtYXNjdXMsQW5kYWxlIE1vbm8sU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLAkwLAkxMjUyfSwNCi0gICAgezB4ZTBmNzA1YzAsCUwiS3Jpc3RlbklUQyIsCUwiU29uZ3RpIFNDLFNUU29uZyIsCTgsCTEyNTJ9LA0KLSAgICB7MHhlMTQyNzU3MywJTCJSYWF2aSIsCUwiRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsTWFyaW9uLFBhcHlydXMsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5LEFtZXJpY2FuIFR5cGV3cml0ZXIiLAkwLAkxMjUyfSwNCi0gICAgezB4ZTJjZWEwY2IsCUwiTWFnbmV0byIsCUwiU1RJWE5vblVuaWNvZGUsRGFtYXNjdXMsR2VlemEgUHJvLEx1Y2lkYSBHcmFuZGUsR2VvcmdpYSxIZWl0aSBUQyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhlMzZhOWUxNywJTCJSYXZpZSIsCUwiU1RIZWl0aSxBcmlhbCBCbGFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHhlNDMzZjhlMiwJTCJQYXJjaG1lbnQiLAlMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAk4LAkxMjUyfSwNCi0gICAgezB4ZTQzZGZmNGEsCUwiV2luZ2RpbmdzIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJNCwJNDJ9LA0KLSAgICB7MHhlNGUyYzQwNSwJTCJNVEV4dHJhIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwJNiwJNDJ9LA0KLSAgICB7MHhlNjE4Y2MzNSwJTCJJbmZvcm1hbFJvbWFuIiwJTCJBcmlhbCBOYXJyb3ciLAk4LAkxMjUyfSwNCi0gICAgezB4ZTZjMjdmZmMsCUwiTWlzdHJhbCIsCUwiQXBwbGUgU3ltYm9scyIsCTgsCTEyNTJ9LA0KLSAgICB7MHhlN2ViZjRiOSwJTCJDb3VyaWVyIiwJTCJDb3VyaWVyIE5ldyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhlOGJjNGE5ZCwJTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsCUwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhlOTBmYjAxMywJTCJUZW1wdXNTYW5zSVRDIiwJTCJTVElYTm9uVW5pY29kZSxNaWNyb3NvZnQgU2FucyBTZXJpZixBdmVuaXIgTGlnaHQiLAkwLAkxMjUyfSwNCi0gICAgezB4ZWM2MzdiNDIsCUwiQ29uc29sYXMiLAlMIkFSIFBMIFVLYWkgQ04sQVIgUEwgVUthaSBISyxBUiBQTCBVS2FpIFRXLEFSIFBMIFVLYWkgVFcgTUJFLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLE1pY3Jvc29mdCBTYW5zIFNlcmlmLFRhaG9tYSIsCTEsCTEyNTJ9LA0KLSAgICB7MHhlZDNhNjgzYiwJTCJTVFhpbndlaSIsCUwiS2FpdGkgU0MsU29uZ3RpIFNDLCIsCTAsCTkzNn0sDQotICAgIHsweGVmMjY0Y2QxLAlMIkx1Y2lkYUhhbmR3cml0aW5nIiwJTCJBcmlhbCBOYXJyb3csQXZlbmlyIE5leHQgQ29uZGVuc2VkIERlbWkgQm9sZCxBdmVuaXIgTmV4dCBDb25kZW5zZWQsQXZlbmlyIE5leHQgQ29uZGVuc2VkIE1lZGl1bSxTVEhlaXRpLEFyaWFsIEJsYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGYwODZiY2EyLAlMIkJhc2tlcnZpbGxlT2xkRmFjZSIsCUwiU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5LFBUIFNhbnMiLAkwLAkxMjUyfSwNCi0gICAgezB4ZjEwMjgwMzAsCUwiTWFuZ2FsIiwJTCJBcmlhbCBVbmljb2RlIE1TLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFyaWFsIE5hcnJvdyxUYWhvbWEiLAkyLAkxMjUyfSwNCi0gICAgezB4ZjFkYTdlYjksCUwiU2hvd2NhcmRHb3RoaWMiLAlMIlBhcHlydXMsQXJpYWwgVW5pY29kZSBNUyxHZW9yZ2lhLEFtZXJpY2FuIFR5cGV3cml0ZXIiLAkwLAkxMjUyfSwNCi0gICAgezB4ZjIxMGYwNmEsCUwiQXJpYWxNVCIsCUwiQXJpYWwgVW5pY29kZSBNUyxBcmlhbCBOYXJyb3csU1RJWE5vblVuaWNvZGUsRGFtYXNjdXMsQXZlbmlyIE5leHQgQ29uZGVuc2VkIERlbWkgQm9sZCxBdmVuaXIgTmV4dCBDb25kZW5zZWQgTWVkaXVtLEF2ZW5pciBOZXh0IENvbmRlbnNlZCIsCTAsCTEyNTJ9LA0KLSAgICB7MHhmNDc3ZjE2YSwJTCJMYXRoYSIsCUwiQXJpYWwgTmFycm93LERhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEFtZXJpY2FuIFR5cGV3cml0ZXIiLAkwLAkxMjUyfSwNCi0gICAgezB4ZjYxNmYzZGQsCUwiTGlTdSIsCUwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwJMSwJOTM2fSwNCi0gICAgezB4ZmE0NzlhYTYsCUwiTWljcm9zb2Z0WWFIZWkiLAlMIkFyaWFsIFVuaWNvZGUgTVMiLAkwLAk5MzZ9LA0KLSAgICB7MHhmY2QxOTY5NywJTCJCb29rbWFuT2xkU3R5bGUiLAlMIkdlZXphIFBybyxEYW1hc2N1cyxBbmRhbGUgTW9ubyxTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhmZTIwOWE4MiwJTCJMdWNpZGFDYWxsaWdyYXBoeSIsCUwiS29rb25vcixEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxTVEhlaXRpLEFyaWFsIEJsYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGZlZjEzNWY4LAlMIkFkb2JlSGVpdGlTdGQtUmVndWxhciIsCUwiSGVpdGkgVEMsU1RIZWl0aSIsCTAsCTkzNn0sDQorICAgIHsweDAxZDVkMzNlLCBMIlNpbVN1biIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMCwgOTM2fSwNCisgICAgezB4MDFlNGYxMDIsIEwiWW91WXVhbiIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgOTM2fSwNCisgICAgezB4MDMwNTQ5ZGMsIEwiTGlTdSIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgOTM2fSwNCisgICAgezB4MDMyZWRkNDQsIEwiU2ltaGVpIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAxLCA5MzZ9LA0KKyAgICB7MHgwM2VhYzZmYywgTCJQb29yUmljaGFyZC1SZWd1bGFyIiwNCisgICAgIEwiTm90ZXdvcnRoeSxBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwgMiwgMTI1Mn0sDQorICAgIHsweDAzZWQ5MGU2LCBMIk5pbmEiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDA3N2I1NmIzLCBMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsDQorICAgICBMIkxhc3RSZXNvcnQsQXBwbGUgIg0KKyAgICAgTCJDaGFuY2VyeSxTVElYVmFyaWFudHMsU1RJWFNpemVPbmVTeW0sU1RJWFNpemVPbmVTeW0sQXBwbGUgQnJhaWxsZSIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MDc4ZWQ1MjQsIEwiTWljcm9zb2Z0U2Fuc1NlcmlmIiwgTCJTb25ndGkgU0MsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgwODliMThhOSwgTCJBcmlhbCIsDQorICAgICBMIkFyaWFsIFVuaWNvZGUgTVMsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgwYjJjYWQ3MiwgTCJNb25vdHlwZUNvcnNpdmEiLCBMIkFyaWFsIE5hcnJvdyxJbXBhY3QiLCA4LCAxMjUyfSwNCisgICAgezB4MGJiMDAzZTcsIEwiS2FydGlrYSIsDQorICAgICBMIkFyaWFsIFVuaWNvZGUgTVMsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXJpYWwgTmFycm93LERhbWFzY3VzIiwgMiwgMTI1Mn0sDQorICAgIHsweDBiYjQ2OWRmLCBMIlZpbmVySGFuZElUQyIsIEwiQ29taWMgU2FucyBNUyxTb25ndGkgU0MsU1RTb25nIiwgOCwgMTI1Mn0sDQorICAgIHsweDBiYzFhODUxLCBMIlNlZ29lVUkiLCBMIkFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwNCisgICAgezB4MGMxMTJlYmQsIEwiS296dWthR290aGljUHJvLVZJTSIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MGNmY2I5YzEsIEwiQWRvYmVUaGFpIiwgTCJBdmVuaXIgTmV4dCBDb25kZW5zZWQgVWx0cmEgTGlnaHQiLCAwLCA4NDd9LA0KKyAgICB7MHgwZTdkZTBmOSwgTCJQbGF5YmlsbCIsIEwiU1RJWE5vblVuaWNvZGUiLCAwLCAxMjUyfSwNCisgICAgezB4MGVmZjQ3YzMsIEwiU1RIdXBvIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MsU1RIZWl0aSIsIDAsIDkzNn0sDQorICAgIHsweDEwN2FkMzc0LCBMIkNvbnN0YW50aWEiLCBMIkFyaWFsIFVuaWNvZGUgTVMsUGFsYXRpbm8sQmFza2VydmlsbGUiLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDEyMTk0YzJkLCBMIkt1bnN0bGVyU2NyaXB0IiwNCisgICAgIEwiQXZlbmlyIE5leHQgQ29uZGVuc2VkIERlbWkgQm9sZCxBcmlhbCBOYXJyb3ciLCA4LCAxMjUyfSwNCisgICAgezB4MTM1ZWY2YTEsIEwiTWluaW9uUHJvU21CZCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4MTU4YzQwNDksIEwiR2FyYW1vbmQiLCBMIkltcGFjdCxBcmlhbCBOYXJyb3ciLCAyLCAxMjUyfSwNCisgICAgezB4MTYwZWNiMjQsIEwiU1RaaG9uZ3NvbmciLCBMIlNURmFuZ3NvbmcsU29uZ3RpIFNDIiwgMCwgOTM2fSwNCisgICAgezB4MTYxZWQwN2UsIEwiTVNHb3RoaWMiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nICINCisgICAgIEwiVFcsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsDQorICAgICAxLCAxMjUyfSwNCisgICAgezB4MTcxZDFlZDEsIEwiU25hcElUQy1SZWd1bGFyIiwgTCJTVEhlaXRpLEFyaWFsIEJsYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDE4ZDExODhmLCBMIkNhbWJyaWEiLCBMIkFyaWFsIFVuaWNvZGUgTVMiLCAyLCAxMjUyfSwNCisgICAgezB4MThlYWYzNTAsIEwiQXJpYWxVbmljb2RlTVMiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLA0KKyAgICAgOTM2fSwNCisgICAgezB4MWE5MmQxMTUsIEwiTWluZ0xpVSIsIEwiSGVpdGkgU0MsU1RIZWl0aSIsIDEsIDEyNTJ9LA0KKyAgICB7MHgxY2MyMTdjNiwgTCJUcmVidWNoZXRNUyIsIEwiRGFtYXNjdXMsSW1wYWN0LEFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgxZDY0OTU5NiwgTCJCYXNlbWljVGltZXMiLCBMIkxpYmVyYXRpb24gU2VyaWYsSW1wYWN0LEFyaWFsIE5hcnJvdyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4MWUzNGVlNjAsIEwiQmVsbE1UIiwNCisgICAgIEwiUGFweXJ1cyxTVElYTm9uVW5pY29kZSxNaWNyb3NvZnQgU2FucyBTZXJpZixBdmVuaXIgTGlnaHQiLCAyLCAxMjUyfSwNCisgICAgezB4MWViMzY5NDUsIEwiQ29vcGVyQmxhY2siLA0KKyAgICAgTCJNYXJpb24sU1RJWE5vblVuaWNvZGUsQXJpYWwgUm91bmRlZCBNVCBCb2xkLEx1Y2lkYSBHcmFuZGUiLCAyLCAxMjUyfSwNCisgICAgezB4MWVmNzc4N2QsIEwiQmF0YW5nQ2hlIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTiwsQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFcsQVIgIg0KKyAgICAgTCJQTCBVTWluZyBUVyBNQkUsQXJpYWwgVW5pY29kZSBNUyxIZWl0aSBUQyIsDQorICAgICAxLCAxMjUyfSwNCisgICAgezB4MjBiM2JkM2EsIEwiQnJ1c2hTY3JpcHRNVCIsDQorICAgICBMIlNUSVhOb25Vbmljb2RlLERhbWFzY3VzLEFyaWFsIE5hcnJvdyxBdmVuaXIgTmV4dCBDb25kZW5zZWQsQ29jaGluIiwgOCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHgyMjA4NzdhYSwgTCJDYW5kYXJhIiwgTCJDb2NoaW4sQmFza2VydmlsbGUsTWFyaW9uIiwgMCwgMTI1Mn0sDQorICAgIHsweDIyMTM1MDA3LCBMIkZyZWVzdHlsZVNjcmlwdC1SZWd1bGFyIiwNCisgICAgIEwiU1RJWE5vblVuaWNvZGUsTmFkZWVtLFphcGYgRGluZ2JhdHMiLCA4LCAxMjUyfSwNCisgICAgezB4MjUxMDU5YzMsIEwiQ2hpbGxlciIsDQorICAgICBMIlphcGYgRGluZ2JhdHMsRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsUGFweXJ1cyxLdWZpU3RhbmRhcmRHSyxCYWdoZGFkIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHgyNWJlZDZkZCwgTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsDQorICAgICBMIlRhaG9tYSxBcHBsZSBTeW1ib2xzLEFwcGxlIExpR290aGljLEFyaWFsIFVuaWNvZGUgTVMsTHVjaWRhICINCisgICAgIEwiR3JhbmRlLE1pY3Jvc29mdCBTYW5zIFNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgyODE1NGM4MSwgTCJQYXJjaG1lbnQtUmVndWxhciIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDgsDQorICAgICAxMjUyfSwNCisgICAgezB4Mjk3MTFlYjksIEwiU1RMaXRpIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MiLCAwLCA5MzZ9LA0KKyAgICB7MHgyYjE5OTNiNCwgTCJCYXNlbWljIiwgTCJJbXBhY3QsQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sDQorICAgIHsweDJiMzE2MzM5LCBMIk5pYWdhcmFTb2xpZC1SZWciLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDJjMTQ3NTI5LCBMIkZvb3RsaWdodE1UTGlnaHQiLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnksUFQgU2FucyxOb3Rld29ydGh5IiwgMCwgMTI1Mn0sDQorICAgIHsweDJjMTk4OTI4LCBMIkhhcmxvd1NvbGlkIiwNCisgICAgIEwiQXZlbmlyIE1lZGl1bSxBdmVuaXIgTmV4dCBNZWRpdW0sQXJpYWwgVW5pY29kZSBNUyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYzZhYzZiMiwgTCJMdWNpZGFCcmlnaHQiLA0KKyAgICAgTCJQVCBTYW5zIE5hcnJvdyxQYXB5cnVzLERhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEFyaWFsIFJvdW5kZWQgTVQgIg0KKyAgICAgTCJCb2xkLENvbWljIFNhbnMgTVMsQXZlbmlyIE5leHQiLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweDJjOWYzOGUyLCBMIktvenVrYU1pbmNob1Byby1WSVIiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDJkNWE0N2IwLCBMIlNUQ2FpeXVuIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MiLCAwLCA5MzZ9LA0KKyAgICB7MHgyZGVmMjZiZiwgTCJCZXJuYXJkTVQtQ29uZGVuc2VkIiwNCisgICAgIEwiSW1wYWN0LEF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQsQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyZmQ4OTMwYiwgTCJLb3p1a2FNaW5jaG9QcjZOUiIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4MzExNTUyNWEsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJIaXJhZ2lubyBTYW5zIEdCLFNUSGVpdGkiLCAwLCAxMjUyfSwNCisgICAgezB4MzEzMjc4MTcsIEwiTXlyaWFkUHJvIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweDMyMjQ0OTc1LCBMIkhlbHZldGljYSIsDQorICAgICBMIkFyaWFsIE5hcnJvdyxBcmlhbCBVbmljb2RlIE1TLERhbWFzY3VzLFNUSVhOb25Vbmljb2RlIiwgMCwgMTI1Mn0sDQorICAgIHsweDMyYWM5OTVjLCBMIlRlcm1pbmFsIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweDMzOGQ2NDhhLCBMIk5pYWdhcmFFbmdyYXZlZC1SZWciLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDMzYmI2NWYyLCBMIlN5bGZhZW4iLCBMIkFyaWFsIFVuaWNvZGUgTVMsTWFyaW9uIiwgMiwgMTI1Mn0sDQorICAgIHsweDM0MDJjMzBlLCBMIk1TUE1pbmNobyIsIEwiQXJpYWwgVW5pY29kZSBNUyxBcHBsZSBTRCBHb3RoaWMgTmVvIiwgMiwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHgzNDEyYmYzMSwgTCJTaW1TdW4tUFVBIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAwLCA5MzZ9LA0KKyAgICB7MHgzNmViMzliOSwgTCJCZXJsaW5TYW5zRkIiLCBMIkFtZXJpY2FuIFR5cGV3cml0ZXIsSW1wYWN0IiwgMCwgMTI1Mn0sDQorICAgIHsweDM2ZjQyMDU1LCBMIlVuaXZlcnNBVFQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDM4NjRjNGY2LCBMIkhpZ2hUb3dlclRleHQiLCBMIlNUSVhHZW5lcmFsLC5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJIiwgMiwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHgzYTI1N2QwMywgTCJGYW5nU29uZ19HQjIzMTIiLCBMIkhpcmFnaW5vIFNhbnMgR0IsU1RIZWl0aSIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzY2RhZTY2OCwgTCJGcmVlc3R5bGVTY3JpcHQiLCBMIk5hZGVlbSxaYXBmIERpbmdiYXRzLFNUSVhOb25Vbmljb2RlIiwgOCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHgzZDU1YWVkNywgTCJKb2tlcm1hbiIsDQorICAgICBMIlBhcHlydXMsTHVjaWRhIEdyYW5kZSxIZWl0aSBUQyxBbWVyaWNhbiBUeXBld3JpdGVyIiwgMCwgMTI1Mn0sDQorICAgIHsweDNkNWI0Mzg1LCBMIlBNaW5nTGlVIiwgTCJIZWl0aSBTQyxTVEhlaXRpIiwgMiwgMTI1Mn0sDQorICAgIHsweDNkOWI3NjY5LCBMIkVzdHJhbmdlbG9FZGVzc2EiLCBMIkFtZXJpY2FuIFR5cGV3cml0ZXIsTWFyaW9uIiwgMCwgMTI1Mn0sDQorICAgIHsweDNlNTMyZDc0LCBMIkZyYW5rbGluR290aGljTWVkaXVtIiwgTCJJbXBhY3QsQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sDQorICAgIHsweDNlNmFhMzJkLCBMIk5TaW1TdW4iLCBMIlNUSGVpdGksU1RGYW5nc29uZyIsIDEsIDkzNn0sDQorICAgIHsweDNmNmMzNmE4LCBMIkdhdXRhbWkiLA0KKyAgICAgTCJEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxTVElYR2VuZXJhbCxBbWVyaWNhbiBUeXBld3JpdGVyIiwgMCwgMTI1Mn0sDQorICAgIHsweDNmZjMyNjYyLCBMIkNoaWxsZXItUmVndWxhciIsIEwiUGFweXJ1cyxLdWZpU3RhbmRhcmRHSyxCYWdoZGFkIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg0MDlkZTMxMiwgTCJNb2Rlcm5Oby4yMCIsIEwiQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDIsIDEyNTJ9LA0KKyAgICB7MHg0MTQ0M2M1ZSwgTCJHZW9yZ2lhIiwgTCIuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxBcmlhbCBVbmljb2RlIE1TIiwgMiwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg0MTYwYWRlNSwgTCJCZWxsR290aGljU3RkQmxhY2siLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDQyMTk3NmM0LCBMIk1vZGVybi1SZWd1bGFyIiwgTCJJbXBhY3QiLCAyLCAxMjUyfSwNCisgICAgezB4NDIyYTcyNTIsIEwiU3RlbmNpbCIsIEwiU1RJWE5vblVuaWNvZGUsU29uZ3RpIFNDLEdlb3JnaWEsQmFza2VydmlsbGUiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweDQzNWNiNDFkLCBMIlJvbWFuIiwgTCJBcmlhbCBOYXJyb3ciLCAwLCAxMjUyfSwNCisgICAgezB4NDc4ODIzODMsIEwiQ291cmllck5ldyIsIEwiUENNeXVuZ2pvLE9zYWthLEFyaWFsIFVuaWNvZGUgTVMsU29uZ3RpIFNDIiwNCisgICAgIDEsIDEyNTJ9LA0KKyAgICB7MHg0ODBhMjMzOCwgTCJCZXJsaW5TYW5zRkJEZW1pIiwNCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQW1lcmljYW4gVHlwZXdyaXRlcixBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnkiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDQ4MGJmN2E0LCBMIkNvdXJpZXJTdGQiLCBMIkNvdXJpZXIgTmV3IiwgMCwgMTI1Mn0sDQorICAgIHsweDQ4MWFkNmVkLCBMIlZsYWRpbWlyU2NyaXB0IiwNCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDgsIDEyNTJ9LA0KKyAgICB7MHg0OTExNTc3YSwgTCJZb3VZdWFuIiwgTCJTVEhlaXRpLEhlaXRpIFRDIiwgMSwgOTM2fSwNCisgICAgezB4NGE3ODhkNzIsIEwiU1RYaW5na2FpIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MiLCAwLCA5MzZ9LA0KKyAgICB7MHg0YmY4ODU2NiwgTCJTZWdvZUNvbmRlbnNlZCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NGNjZjUxYTQsIEwiQmVybGluU2Fuc0ZCLVJlZyIsDQorICAgICBMIlNUSVhOb25Vbmljb2RlLEFtZXJpY2FuIFR5cGV3cml0ZXIsSW1wYWN0IiwgMCwgMTI1Mn0sDQorICAgIHsweDRlYTk2N2NlLCBMIkd1bGltQ2hlIiwgTCJBcmlhbCBVbmljb2RlIE1TLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAxLCAxMjUyfSwNCisgICAgezB4NGY2OGJkNzksIEwiTGV0dGVyR290aGljU3RkIiwNCisgICAgIEwiQ291cmllciBOZXcsQW5kYWxlIE1vbm8sQXl1dGhheWEsUENNeXVuZ2pvLE9zYWthIiwgMCwgMTI1Mn0sDQorICAgIHsweDUxYTBkMGU2LCBMIktvenVrYUdvdGhpY1ByNk5NIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg1MzFiM2RlYSwgTCJCYXNlbWljU3ltYm9sIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg1MzMzZmQzOSwgTCJDYWxpZm9ybmlhbkZCLVJlZyIsDQorICAgICBMIkFtZXJpY2FuIFR5cGV3cml0ZXIsQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDIsIDEyNTJ9LA0KKyAgICB7MHg1MzU2MWE1NCwgTCJGWllUSy0tR0JLMS0wIiwgTCJTVEZhbmdzb25nLFNvbmd0aSBTQyxTVFNvbmciLCAwLCA5MzZ9LA0KKyAgICB7MHg1NWUwZGRlNiwgTCJMdWNpZGFTYW5zVHlwZXdyaXRlciIsIEwiTWVubG8sQ291cmllciBOZXcsQW5kYWxlIE1vbm8iLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDU3NGQ0ZDNkLCBMIkFkb2JlQXJhYmljIiwgTCJBcmlhbCBOYXJyb3ciLCAwLCAxMjUyfSwNCisgICAgezB4NTc5MmU3NTksIEwiU1RLYWl0aSIsIEwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LA0KKyAgICB7MHg1OTIxOTc4ZSwgTCJMdWNpZGFTYW5zVW5pY29kZSIsIEwiTHVjaWRhIEdyYW5kZSxBcmlhbCBVbmljb2RlIE1TLE1lbmxvIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg1OTRlMmRhNCwgTCJWcmluZGEiLCBMIkdlZXphIFBybyxEYW1hc2N1cyxTVElYR2VuZXJhbCxHaWxsIFNhbnMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDU5YmFhOWEyLCBMIkthaVRpX0dCMjMxMiIsIEwiSGlyYWdpbm8gU2FucyBHQixTVEhlaXRpIiwgMCwgMTI1Mn0sDQorICAgIHsweDVjZmVkZjRmLCBMIkJhc2tPbGRGYWNlIiwNCisgICAgIEwiQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5LFBUIFNhbnMsQXZlbmlyIE5leHQgQ29uZGVuc2VkIiwgMCwgMTI1Mn0sDQorICAgIHsweDVlMTZhYzkxLCBMIlRyYWphblBybyIsIEwiQXJpYWwgTmFycm93LFBUIFNhbnMgTmFycm93LERhbWFzY3VzIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg1Zjk3OTIxYywgTCJBZG9iZU15dW5nam9TdGRNIiwNCisgICAgIEwiQXBwbGVNeXVuZ2pvLEFwcGxlR290aGljLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LA0KKyAgICB7MHg1ZmVmYmZhZCwgTCJCYXRhbmciLCBMIkFyaWFsIFVuaWNvZGUgTVMsU29uZ3RpIFNDIiwgMiwgMTI1Mn0sDQorICAgIHsweDYwNTM0MmI5LCBMIkRvdHVtQ2hlIiwgTCJBcmlhbCBVbmljb2RlIE1TLEhlaXRpIFRDIiwgMSwgMTI1Mn0sDQorICAgIHsweDYwOGM1ZjlhLCBMIkthaVRpX0dCMjMxMiIsIEwiSGlyYWdpbm8gU2FucyBHQixTVEhlaXRpLEhlaXRpIFRDIiwgMCwgOTM2fSwNCisgICAgezB4NjFlZmQwZDEsIEwiTWF0dXJhTVRTY3JpcHRDYXBpdGFscyIsDQorICAgICBMIktva29ub3IsRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsU1RIZWl0aSxBcmlhbCBCbGFjayxBdmVuaXIgTmV4dCBIZWF2eSIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4NjI2NjA4YTksIEwiTVZCb2xpIiwNCisgICAgIEwiQXBwbGUgQnJhaWxsZSxHZWV6YSBQcm8sTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg2MzA1MDFhMywgTCJTbWFsbEZvbnRzIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweDY1ZDBlMmE5LCBMIkZaWVRLLS1HQksxLTAiLCBMIlNURmFuZ3NvbmcsU29uZ3RpIFNDLFNUU29uZyIsIDAsIDkzNn0sDQorICAgIHsweDY2OWYyOWUxLCBMIkZaU1RLLS1HQksxLTAiLCBMIlNUSGVpdGksSGVpdGkgVEMiLCAwLCA5MzZ9LA0KKyAgICB7MHg2NzNhOWU1ZiwgTCJUdW5nYSIsDQorICAgICBMIkRhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCxBdmVuaXIgTmV4dCBDb25kZW5zZWQgIg0KKyAgICAgTCJVbHRyYSBMaWdodCxGdXR1cmEiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDY5MWFhNGNlLCBMIk5pYWdhcmFTb2xpZCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4Njk2MjU5YjcsIEwiQ29yYmVsIiwgTCJDb2NoaW4sQmFza2VydmlsbGUsTWFyaW9uIiwgMCwgMTI1Mn0sDQorICAgIHsweDY5NmVlOWJlLCBMIlNUWGloZWkiLCBMIlNUSGVpdGksSGVpdGkgVEMsU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLA0KKyAgICAgOTM2fSwNCisgICAgezB4NmM1OWNmNjksIEwiRG90dW0iLCBMIkFyaWFsIFVuaWNvZGUgTVMsU29uZ3RpIFNDIiwgMCwgMTI1Mn0sDQorICAgIHsweDcwN2ZhNTYxLCBMIkd1bmdzdWgiLCBMIkFyaWFsIFVuaWNvZGUgTVMsSGVpdGkgVEMiLCAyLCAxMjUyfSwNCisgICAgezB4NzE0MTZiYjIsIEwiWldBZG9iZUYiLA0KKyAgICAgTCJTVElYU2l6ZUZvdXJTeW0sU1RJWFNpemVUaHJlZVN5bSxTVElYU2l6ZVR3b1N5bSxTVElYU2l6ZU9uZVN5bSIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NzFiNDE4MDEsIEwiVmVyZGFuYSIsDQorICAgICBMIlRhaG9tYSxNYXJpb24sQXBwbGUgU3ltYm9scywuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxMdWNpZGEgIg0KKyAgICAgTCJHcmFuZGUsQ291cmllciBOZXciLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDczZjI1ZTRjLCBMIlBhbGF0aW5vTGlub3R5cGUiLCBMIlBhbGF0aW5vLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCAxMjUyfSwNCisgICAgezB4NzNmNGQxOWYsIEwiTmlhZ2FyYUVuZ3JhdmVkIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg3NDAwMTY5NCwgTCJNeXJpYWRQcm9CbGFjayIsIEwiUGFsYXRpbm8sQmFza2VydmlsbGUsTWFyaW9uLENvY2hpbiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NzRiMTRkOGYsIEwiSGFldHRlbnNjaHdlaWxlciIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NzRjYjQ0ZWUsIEwiTlNpbVN1biIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgOTM2fSwNCisgICAgezB4NzZiNGQ3ZmYsIEwiU2hydXRpIiwNCisgICAgIEwiRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsQXJpYWwgVW5pY29kZSBNUyxBbWVyaWNhbiBUeXBld3JpdGVyIiwgMCwgMTI1Mn0sDQorICAgIHsweDc4OGIzNTMzLCBMIldlYmRpbmdzIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNiwgNDJ9LA0KKyAgICB7MHg3OTdkZGU5OSwgTCJNU1NlcmlmIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweDdhMGY5ZTllLCBMIk1TTWluY2hvIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiAiDQorICAgICBMIlBMIFVNaW5nIFRXIE1CRSxBcmlhbCBVbmljb2RlIE1TLEFwcGxlIFNEIEdvdGhpYyBOZW8iLA0KKyAgICAgMSwgMTI1Mn0sDQorICAgIHsweDdiNDM5Y2FmLCBMIk9sZEVuZ2xpc2hUZXh0TVQiLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxBcmlhbCBVbmljb2RlIE1TLEJhc2tlcnZpbGxlLEF2ZW5pciBOZXh0IE1lZGl1bSIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ODIxM2E0MzMsIEwiTHVjaWRhU2Fucy1UeXBld3JpdGVyIiwNCisgICAgIEwiQ29taWMgU2FucyBNUyxBdmVuaXIgTmV4dCxBcmlhbCBSb3VuZGVkIE1UIEJvbGQiLCAwLCAxMjUyfSwNCisgICAgezB4ODJmZWM5MjksIEwiQWRvYmVTb25nU3RkTCIsIEwiSGVpdGkgVEMsU1RIZWl0aSIsIDAsIDkzNn0sDQorICAgIHsweDgzNTgxODI1LCBMIk1vZGVybiIsIEwiQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4MzVhMjgyMywgTCJBbGdlcmlhbiIsDQorICAgICBMIlNUSVhOb25Vbmljb2RlLEJhc2tlcnZpbGxlLEF2ZW5pciBOZXh0IE1lZGl1bSxBbWVyaWNhbiBUeXBld3JpdGVyIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg4M2RhYjlmNSwgTCJTY3JpcHQiLCBMIkFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4NDdiNTZkYSwgTCJUYWhvbWEiLCBMIlNvbmd0aSBTQyxBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweDhhNzgzY2IyLCBMIlNpbVN1bi1QVUEiLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4YjVjYWMwZSwgTCJPbnl4IiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweDhjNmE0OTllLCBMIkd1bGltIiwgTCJBcmlhbCBVbmljb2RlIE1TLFNvbmd0aSBTQyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4ZTBhZjc5MCwgTCJKdWljZUlUQyIsIEwiTmFkZWVtLEFsIEJheWFuIiwgMCwgMTI1Mn0sDQorICAgIHsweDhlOGQ0M2IyLCBMIkNlbnRhdXIiLCBMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCxOb3Rld29ydGh5LEltcGFjdCIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4OGVlNGRjY2EsIEwiQm9va3NoZWxmU3ltYm9sNyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4OTA3OTQ4MDAsIEwiQmVsbEdvdGhpY1N0ZExpZ2h0IiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg5MDliNTE2YSwgTCJDZW50dXJ5IiwgTCJEYW1hc2N1cyxBbmRhbGUgTW9ubyxTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsDQorICAgICAyLCAxMjUyfSwNCisgICAgezB4OTJhZTM3MGQsIEwiTVNPdXRsb29rIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNCwgNDJ9LA0KKyAgICB7MHg5M2M5ZmJmMSwgTCJMdWNpZGFGYXgiLA0KKyAgICAgTCJQVCBTYW5zIE5hcnJvdyxQYXB5cnVzLEtva29ub3IsR2VlemEgUHJvLEFyaWFsIFJvdW5kZWQgTVQgQm9sZCxMdWNpZGEgIg0KKyAgICAgTCJHcmFuZGUsRnV0dXJhIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHg5NTY1MDg1ZSwgTCJCb29rQW50aXF1YSIsIEwiUGFsYXRpbm8sTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsDQorICAgICAyLCAxMjUyfSwNCisgICAgezB4OTg1NmQ5NWQsIEwiQWRvYmVNaW5nU3RkTCIsIEwiQUhpcmFnaW5vIFNhbnMgR0IsSGVpdGkgVEMsU1RIZWl0aSIsIDAsDQorICAgICA5NDl9LA0KKyAgICB7MHg5YmJhZGQ2YiwgTCJDb2xvbm5hTVQiLCBMIk5vdGV3b3J0aHksQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4OWNiZDE2YTQsIEwiU2hvd2NhcmRHb3RoaWMtUmVnIiwNCisgICAgIEwiQXJpYWwgVW5pY29kZSBNUyxHZW9yZ2lhLEFtZXJpY2FuIFR5cGV3cml0ZXIiLCAwLCAxMjUyfSwNCisgICAgezB4OWQ3MzAwOGUsIEwiTVNTYW5zU2VyaWYiLCBMIlNvbmd0aSBTQyxBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweGEwNjA3ZGIxLCBMIkd1bmdzdWhDaGUiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSICINCisgICAgIEwiUEwgVU1pbmcgVFcgTUJFLEFyaWFsIFVuaWNvZGUgTVMsSGVpdGkgVEMsU1RGYW5nc29uZyIsDQorICAgICAxLCAxMjUyfSwNCisgICAgezB4YTBiY2Y2YTEsIEwiTGF0aW5XaWRlIiwgTCJaYXBmaW5vLEFyaWFsIEJsYWNrLFNUSGVpdGkiLCAyLCAxMjUyfSwNCisgICAgezB4YTE0MjliMzYsIEwiU3ltYm9sIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNiwgNDJ9LA0KKyAgICB7MHhhMWZhNWFiYywgTCJXaW5nZGluZ3MyIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNiwgNDJ9LA0KKyAgICB7MHhhMWZhNWFiZCwgTCJXaW5nZGluZ3MzIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNiwgNDJ9LA0KKyAgICB7MHhhNDI3YmFkNCwgTCJJbmZvcm1hbFJvbWFuLVJlZ3VsYXIiLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxBcmlhbCBOYXJyb3csQXZlbmlyIE5leHQgQ29uZGVuc2VkIERlbWkgQm9sZCIsIDgsIDEyNTJ9LA0KKyAgICB7MHhhOGI5MmVjZSwgTCJGWlNUSy0tR0JLMS0wIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAwLCA5MzZ9LA0KKyAgICB7MHhhOGQ4M2VjZSwgTCJDYWxpZm9ybmlhbkZCIiwNCisgICAgIEwiQW1lcmljYW4gVHlwZXdyaXRlcixBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwgMiwgMTI1Mn0sDQorICAgIHsweGFhM2UwODJjLCBMIktpbmdzb2Z0LVBob25ldGljIiwNCisgICAgIEwiU1RJWFZhcmlhbnRzLFNUSVhTaXplT25lU3ltLEFwcGxlIEJyYWlsbGUiLCAwLCAxMjUyfSwNCisgICAgezB4YWE2YmNhYmUsIEwiSGFybG93U29saWRJdGFsaWMiLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTWVkaXVtLEF2ZW5pciBOZXh0IE1lZGl1bSxBcmlhbCBVbmljb2RlIE1TIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhhZGU1MzM3YywgTCJNU1VJR290aGljIiwgTCJBcmlhbCBVbmljb2RlIE1TLEFwcGxlIFNEIEdvdGhpYyBOZW8iLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweGIwOGRkOTQxLCBMIldpZGVMYXRpbiIsDQorICAgICBMIk1hcmlvbixQYXB5cnVzLE5hbnVtIFBlbiBTY3JpcHQsWmFwZiBEaW5nYmF0cyxEYW1hc2N1cyxaYXBmaW5vLEFyaWFsICINCisgICAgIEwiQmxhY2ssU1RIZWl0aSIsDQorICAgICAyLCAxMjUyfSwNCisgICAgezB4YjEyNzY1ZTAsIEwiSVRDTGVnYWN5U2Fuc1N0ZEJvb2siLA0KKyAgICAgTCJMYXN0UmVzb3J0LC5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJLEFyaWFsIFVuaWNvZGUgTVMsUGFsYXRpbm8iLCAwLCAxMjUyfSwNCisgICAgezB4YjIwN2YwNWQsIEwiUG9vclJpY2hhcmQiLCBMIk5vdGV3b3J0aHksQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4YjNiYzQ5MmYsIEwiSnVpY2VJVEMtUmVndWxhciIsIEwiTmFkZWVtLEFsIEJheWFuLFNUSVhOb25Vbmljb2RlIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhiNTU0NTM5OSwgTCJNYXJsZXR0IiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNCwgNDJ9LA0KKyAgICB7MHhiNWRkMWViYiwgTCJCcml0YW5uaWNCb2xkIiwNCisgICAgIEwiRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5LFBUIFNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4YjY5OWMxYzUsIEwiTHVjaWRhQ2FsbGlncmFwaHktSXRhbGljIiwgTCJTVEhlaXRpLEFyaWFsIEJsYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGI3MjVkNjI5LCBMIlRpbWVzTmV3Um9tYW4iLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweGI3ZWFlYmViLCBMIkFkb2JlSGVpdGlTdGRSIiwgTCJIZWl0aSBUQyxTVEhlaXRpIiwgMCwgOTM2fSwNCisgICAgezB4YmQyOWM0ODYsIEwiQmVybGluU2Fuc0ZCRGVtaS1Cb2xkIiwNCisgICAgIEwiQW1lcmljYW4gVHlwZXdyaXRlcixBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnkiLCAwLCAxMjUyfSwNCisgICAgezB4YmU4YThkYjQsIEwiQm9va3NoZWxmU3ltYm9sU2V2ZW4iLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGMxNmMwMTE4LCBMIkFkb2JlSGVicmV3IiwNCisgICAgIEwiLkhlbHZldGljYSBOZXVlIERlc2sgVUksUGFsYXRpbm8sQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjMzE4YjBhZiwgTCJNeXJpYWRQcm9MaWdodCIsIEwiUGFsYXRpbm8sQmFza2VydmlsbGUsTWFyaW9uIiwgMCwgMTI1Mn0sDQorICAgIHsweGM2NWU1NjU5LCBMIkNhbWJyaWFNYXRoIiwgTCJBcmlhbCBVbmljb2RlIE1TIiwgMiwgMTI1Mn0sDQorICAgIHsweGM3NWM4ZjA1LCBMIkx1Y2lkYUNvbnNvbGUiLCBMIkNvdXJpZXIgTmV3LE1lbmxvLEFuZGFsZSBNb25vIiwgMSwgMTI1Mn0sDQorICAgIHsweGNhN2MzNWQ2LCBMIkNhbGlicmkiLCBMIkFwcGxlIFN5bWJvbHMsSGVhZExpbmVBIiwgMCwgMTI1Mn0sDQorICAgIHsweGNiMDUzZjUzLCBMIk1pY3Jvc29mdFlhSGVpIiwgTCJBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwNCisgICAgezB4Y2I3MTkwZjksIEwiTWFnbmV0by1Cb2xkIiwgTCJMdWNpZGEgR3JhbmRlIiwgMCwgMTI1Mn0sDQorICAgIHsweGNjYTAwY2M1LCBMIlN5c3RlbSIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2FkNmY3NiwgTCJKb2tlcm1hbi1SZWd1bGFyIiwgTCJMdWNpZGEgR3JhbmRlIiwgMCwgMTI1Mn0sDQorICAgIHsweGNjYzU4MThjLCBMIkV1cm9TaWduIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweGNmM2Q3MjM0LCBMIkx1Y2lkYUhhbmR3cml0aW5nLUl0YWxpYyIsDQorICAgICBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwNCisgICAgezB4Y2Y3YjhmZGIsIEwiTWluaW9uUHJvIiwNCisgICAgIEwiQmVsbCBNVCxDb3JiZWwsVGltZXMgTmV3IFJvbWFuLENhbWJyaWEsQmVybGluIFNhbnMgRkIiLCAwLCAxMjUyfSwNCisgICAgezB4Y2ZlNTc1NWYsIEwiU2ltaGVpIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAxLCA5MzZ9LA0KKyAgICB7MHhkMDExZjRlZSwgTCJNU1BHb3RoaWMiLCBMIkFyaWFsIFVuaWNvZGUgTVMsQXBwbGUgU0QgR290aGljIE5lbyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ZDA2MGU3ZWYsIEwiVml2YWxkaSIsDQorICAgICBMIlNUSVhOb25Vbmljb2RlLEFyaWFsIFVuaWNvZGUgTVMsQXZlbmlyIE1lZGl1bSxBdmVuaXIgTmV4dCBNZWRpdW0iLCA4LA0KKyAgICAgMTI1Mn0sDQorICAgIHsweGQwN2VkZWMxLCBMIkZyYW5rbGluR290aGljLU1lZGl1bSIsIEwiSW1wYWN0LEFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkMTA3MjQzZiwgTCJTaW1TdW4iLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDAsIDkzNn0sDQorICAgIHsweGQxODgxNTYyLCBMIkFyaWFsTmFycm93IiwgTCJQVCBTYW5zIE5hcnJvdyxBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweGQyMmI3ZGNlLCBMIkJvZG9uaU1UUG9zdGVyQ29tcHJlc3NlZCIsDQorICAgICBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwNCisgICAgezB4ZDIyYmZhNjAsIEwiQ29taWNTYW5zTVMiLA0KKyAgICAgTCJEYW1hc2N1cyxHZW9yZ2lhLC5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJLEx1Y2lkYSBHcmFuZGUsQXJpYWwgVW5pY29kZSBNUyIsDQorICAgICA4LCAxMjUyfSwNCisgICAgezB4ZDNiZDBlMzUsIEwiQmF1aGF1czkzIiwNCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQXJpYWwgVW5pY29kZSBNUyxBdmVuaXIgTmV4dCxBdmVuaXIiLCAwLCAxMjUyfSwNCisgICAgezB4ZDQyOWVlN2EsIEwiU1RGYW5nc29uZyIsIEwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LA0KKyAgICB7MHhkNjY3OWMxMiwgTCJCZXJuYXJkTVRDb25kZW5zZWQiLA0KKyAgICAgTCJJbXBhY3QsQXZlbmlyIE5leHQgQ29uZGVuc2VkIERlbWkgQm9sZCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkOGU4YTAyNywgTCJMdWNpZGFTYW5zIiwNCisgICAgIEwiQXJpYWwgTmFycm93LEtobWVyIE1OLEtva29ub3IsRGFtYXNjdXMsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgIg0KKyAgICAgTCJTeW1ib2xzIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhkOWZlNzc2MSwgTCJIaWdoVG93ZXJUZXh0LVJlZyIsDQorICAgICBMIlNUSVhHZW5lcmFsLC5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJLFRyZWJ1Y2hldCBNUyIsIDIsIDEyNTJ9LA0KKyAgICB7MHhkYTdlNTUxZSwgTCJTVFNvbmciLCBMIkFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYWE2ODQyZCwgTCJTVFpob25nc29uZyIsIEwiU1RGYW5nc29uZyxTb25ndGkgU0MsU1RTb25nIiwgMCwgOTM2fSwNCisgICAgezB4ZGFhYWI5M2YsIEwiU1RGYW5nc29uZyIsIEwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYWViMDcxMywgTCJTVFNvbmciLCBMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwNCisgICAgezB4ZGFmZWRiZWYsIEwiU1RDYWl5dW4iLCBMIkthaXRpIFNDLFNvbmd0aSBTQyxTVEhlaXRpIiwgMCwgOTM2fSwNCisgICAgezB4ZGIwMGEzZDksIEwiQnJvYWR3YXkiLA0KKyAgICAgTCJQYXB5cnVzLFNUSVhOb25Vbmljb2RlLEFyaWFsIEJsYWNrLEF2ZW5pciBOZXh0IEhlYXZ5LEhlaXRpIFRDIiwgMCwgMTI1Mn0sDQorICAgIHsweGRiMWY1YWQ0LCBMIlNUWGlud2VpIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MsU1RIZWl0aSIsIDAsIDkzNn0sDQorICAgIHsweGRiMzI2ZTdmLCBMIlNUS2FpdGkiLCBMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwNCisgICAgezB4ZGI2OTU5NWEsIEwiU1RIdXBvIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MsU1RIZWl0aSIsIDAsIDkzNn0sDQorICAgIHsweGRiYTAwODJjLCBMIlNUWGloZWkiLCBMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwNCisgICAgezB4ZGJkMGFiMTgsIEwiU1RYaW5na2FpIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYzFhN2RiMSwgTCJTVExpdGkiLCBMIkthaXRpIFNDLFNvbmd0aSBTQyIsIDAsIDkzNn0sDQorICAgIHsweGRjMzMwNzVmLCBMIktyaXN0ZW5JVEMtUmVndWxhciIsDQorICAgICBMIlNUSVhOb25Vbmljb2RlLERhbWFzY3VzLFNvbmd0aSBTQyxTVFNvbmciLCA4LCAxMjUyfSwNCisgICAgezB4ZGNjNzAwOWMsIEwiSGFycmluZ3RvbiIsDQorICAgICBMIlNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSxOb3Rld29ydGh5IiwgMCwgMTI1Mn0sDQorICAgIHsweGRkNzEyNDY2LCBMIkFyaWFsQmxhY2siLCBMIkdlZXphIFBybyxEYW1hc2N1cyxTb25ndGkgU0MsU1RTb25nIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhkZGU4N2IzZSwgTCJJbXBhY3QiLCBMIkFyaWFsIE5hcnJvdyxNYXJpb24iLCAwLCAxMjUyfSwNCisgICAgezB4ZGY2OWZiMzIsIEwiU25hcElUQyIsDQorICAgICBMIkFyaWFsIE5hcnJvdyxQVCBTYW5zIE5hcnJvdyxNYXJpb24sU1RIZWl0aSxBcmlhbCBCbGFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkZjhiMjVlOCwgTCJDZW50dXJ5R290aGljIiwNCisgICAgIEwiRGFtYXNjdXMsQW5kYWxlIE1vbm8sU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCAxMjUyfSwNCisgICAgezB4ZTBmNzA1YzAsIEwiS3Jpc3RlbklUQyIsIEwiU29uZ3RpIFNDLFNUU29uZyIsIDgsIDEyNTJ9LA0KKyAgICB7MHhlMTQyNzU3MywgTCJSYWF2aSIsDQorICAgICBMIkRhbWFzY3VzLFNUSVhOb25Vbmljb2RlLE1hcmlvbixQYXB5cnVzLEF2ZW5pciBOZXh0IENvbmRlbnNlZCAiDQorICAgICBMIkhlYXZ5LEFtZXJpY2FuIFR5cGV3cml0ZXIiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGUyY2VhMGNiLCBMIk1hZ25ldG8iLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxEYW1hc2N1cyxHZWV6YSBQcm8sTHVjaWRhIEdyYW5kZSxHZW9yZ2lhLEhlaXRpIFRDIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhlMzZhOWUxNywgTCJSYXZpZSIsIEwiU1RIZWl0aSxBcmlhbCBCbGFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlNDMzZjhlMiwgTCJQYXJjaG1lbnQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCA4LCAxMjUyfSwNCisgICAgezB4ZTQzZGZmNGEsIEwiV2luZ2RpbmdzIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNCwgNDJ9LA0KKyAgICB7MHhlNGUyYzQwNSwgTCJNVEV4dHJhIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNiwgNDJ9LA0KKyAgICB7MHhlNjE4Y2MzNSwgTCJJbmZvcm1hbFJvbWFuIiwgTCJBcmlhbCBOYXJyb3ciLCA4LCAxMjUyfSwNCisgICAgezB4ZTZjMjdmZmMsIEwiTWlzdHJhbCIsIEwiQXBwbGUgU3ltYm9scyIsIDgsIDEyNTJ9LA0KKyAgICB7MHhlN2ViZjRiOSwgTCJDb3VyaWVyIiwgTCJDb3VyaWVyIE5ldyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlOGJjNGE5ZCwgTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4ZTkwZmIwMTMsIEwiVGVtcHVzU2Fuc0lUQyIsDQorICAgICBMIlNUSVhOb25Vbmljb2RlLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEF2ZW5pciBMaWdodCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlYzYzN2I0MiwgTCJDb25zb2xhcyIsDQorICAgICBMIkFSIFBMIFVLYWkgQ04sQVIgUEwgVUthaSBISyxBUiBQTCBVS2FpIFRXLEFSIFBMIFVLYWkgVFcgTUJFLEFSIFBMIFVNaW5nICINCisgICAgIEwiQ04sQVIgUEwgVU1pbmcgSEssTWljcm9zb2Z0IFNhbnMgU2VyaWYsVGFob21hIiwNCisgICAgIDEsIDEyNTJ9LA0KKyAgICB7MHhlZDNhNjgzYiwgTCJTVFhpbndlaSIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDLCIsIDAsIDkzNn0sDQorICAgIHsweGVmMjY0Y2QxLCBMIkx1Y2lkYUhhbmR3cml0aW5nIiwNCisgICAgIEwiQXJpYWwgTmFycm93LEF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQsQXZlbmlyIE5leHQgIg0KKyAgICAgTCJDb25kZW5zZWQsQXZlbmlyIE5leHQgQ29uZGVuc2VkIE1lZGl1bSxTVEhlaXRpLEFyaWFsIEJsYWNrIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhmMDg2YmNhMiwgTCJCYXNrZXJ2aWxsZU9sZEZhY2UiLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnksUFQgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhmMTAyODAzMCwgTCJNYW5nYWwiLA0KKyAgICAgTCJBcmlhbCBVbmljb2RlIE1TLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFyaWFsIE5hcnJvdyxUYWhvbWEiLCAyLCAxMjUyfSwNCisgICAgezB4ZjFkYTdlYjksIEwiU2hvd2NhcmRHb3RoaWMiLA0KKyAgICAgTCJQYXB5cnVzLEFyaWFsIFVuaWNvZGUgTVMsR2VvcmdpYSxBbWVyaWNhbiBUeXBld3JpdGVyIiwgMCwgMTI1Mn0sDQorICAgIHsweGYyMTBmMDZhLCBMIkFyaWFsTVQiLA0KKyAgICAgTCJBcmlhbCBVbmljb2RlIE1TLEFyaWFsIE5hcnJvdyxTVElYTm9uVW5pY29kZSxEYW1hc2N1cyxBdmVuaXIgTmV4dCAiDQorICAgICBMIkNvbmRlbnNlZCBEZW1pIEJvbGQsQXZlbmlyIE5leHQgQ29uZGVuc2VkIE1lZGl1bSxBdmVuaXIgTmV4dCBDb25kZW5zZWQiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGY0NzdmMTZhLCBMIkxhdGhhIiwNCisgICAgIEwiQXJpYWwgTmFycm93LERhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEFtZXJpY2FuIFR5cGV3cml0ZXIiLCAwLCAxMjUyfSwNCisgICAgezB4ZjYxNmYzZGQsIEwiTGlTdSIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgOTM2fSwNCisgICAgezB4ZmE0NzlhYTYsIEwiTWljcm9zb2Z0WWFIZWkiLCBMIkFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LA0KKyAgICB7MHhmY2QxOTY5NywgTCJCb29rbWFuT2xkU3R5bGUiLA0KKyAgICAgTCJHZWV6YSBQcm8sRGFtYXNjdXMsQW5kYWxlIE1vbm8sU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCAxMjUyfSwNCisgICAgezB4ZmUyMDlhODIsIEwiTHVjaWRhQ2FsbGlncmFwaHkiLA0KKyAgICAgTCJLb2tvbm9yLERhbWFzY3VzLFNUSVhOb25Vbmljb2RlLFNUSGVpdGksQXJpYWwgQmxhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ZmVmMTM1ZjgsIEwiQWRvYmVIZWl0aVN0ZC1SZWd1bGFyIiwgTCJIZWl0aSBUQyxTVEhlaXRpIiwgMCwgOTM2fSwNCiB9Ow0KICNlbGlmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQU5EUk9JRF8NCiBzdGF0aWMgY29uc3QgWEZBX0ZPTlRJTkZPIGdfWEZBRm9udHNNYXBbXSA9IHsNCi0gICAgezB4MDFkNWQzM2UsCUwiU2ltU3VuIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4MDFlNGYxMDIsCUwiWW91WXVhbiIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTkzNn0sDQotICAgIHsweDAzMDU0OWRjLAlMIkxpU3UiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAk5MzZ9LA0KLSAgICB7MHgwMzJlZGQ0NCwJTCJTaW1oZWkiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAk5MzZ9LA0KLSAgICB7MHgwM2VhYzZmYywJTCJQb29yUmljaGFyZC1SZWd1bGFyIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2ssRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLAkyLAkxMjUyfSwNCi0gICAgezB4MDNlZDkwZTYsCUwiTmluYSIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDA3N2I1NmIzLAlMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsCUwiRHJvaWQgU2FucyBUaGFpLERyb2lkIFNhbnMgQXJtZW5pYW4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgwNzhlZDUyNCwJTCJNaWNyb3NvZnRTYW5zU2VyaWYiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4MDg5YjE4YTksCUwiQXJpYWwiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4MGIyY2FkNzIsCUwiTW9ub3R5cGVDb3JzaXZhIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAk4LAkxMjUyfSwNCi0gICAgezB4MGJiMDAzZTcsCUwiS2FydGlrYSIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyIsCTIsCTEyNTJ9LA0KLSAgICB7MHgwYmI0NjlkZiwJTCJWaW5lckhhbmRJVEMiLAlMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTgsCTEyNTJ9LA0KLSAgICB7MHgwYmMxYTg1MSwJTCJTZWdvZVVJIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDBjMTEyZWJkLAlMIktvenVrYUdvdGhpY1Byby1WSU0iLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgwY2ZjYjljMSwJTCJBZG9iZVRoYWkiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTg0N30sDQotICAgIHsweDBlN2RlMGY5LAlMIlBsYXliaWxsIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweDBlZmY0N2MzLAlMIlNUSHVwbyIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweDEwN2FkMzc0LAlMIkNvbnN0YW50aWEiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KLSAgICB7MHgxMjE5NGMyZCwJTCJLdW5zdGxlclNjcmlwdCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJOCwJMTI1Mn0sDQotICAgIHsweDEzNWVmNmExLAlMIk1pbmlvblByb1NtQmQiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgxNThjNDA0OSwJTCJHYXJhbW9uZCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQotICAgIHsweDE2MGVjYjI0LAlMIlNUWmhvbmdzb25nIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4MTYxZWQwN2UsCUwiTVNHb3RoaWMiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAkxMjUyfSwNCi0gICAgezB4MTcxZDFlZDEsCUwiU25hcElUQy1SZWd1bGFyIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4MThkMTE4OGYsCUwiQ2FtYnJpYSIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KLSAgICB7MHgxOGVhZjM1MCwJTCJBcmlhbFVuaWNvZGVNUyIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweDFhOTJkMTE1LAlMIk1pbmdMaVUiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAkxMjUyfSwNCi0gICAgezB4MWNjMjE3YzYsCUwiVHJlYnVjaGV0TVMiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgxZDY0OTU5NiwJTCJCYXNlbWljVGltZXMiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgxZTM0ZWU2MCwJTCJCZWxsTVQiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KLSAgICB7MHgxZWIzNjk0NSwJTCJDb29wZXJCbGFjayIsCUwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQotICAgIHsweDFlZjc3ODdkLAlMIkJhdGFuZ0NoZSIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTEyNTJ9LA0KLSAgICB7MHgyMGIzYmQzYSwJTCJCcnVzaFNjcmlwdE1UIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsCTgsCTEyNTJ9LA0KLSAgICB7MHgyMjA4NzdhYSwJTCJDYW5kYXJhIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4MjIxMzUwMDcsCUwiRnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTgsCTEyNTJ9LA0KLSAgICB7MHgyNTEwNTljMywJTCJDaGlsbGVyIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYiLAkwLAkxMjUyfSwNCi0gICAgezB4MjViZWQ2ZGQsCUwiTVNSZWZlcmVuY2VTYW5zU2VyaWYiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4MjgxNTRjODEsCUwiUGFyY2htZW50LVJlZ3VsYXIiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTgsCTEyNTJ9LA0KLSAgICB7MHgyOTcxMWViOSwJTCJTVExpdGkiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KLSAgICB7MHgyYjE5OTNiNCwJTCJCYXNlbWljIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4MmIzMTYzMzksCUwiTmlhZ2FyYVNvbGlkLVJlZyIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDJjMTQ3NTI5LAlMIkZvb3RsaWdodE1UTGlnaHQiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgyYzE5ODkyOCwJTCJIYXJsb3dTb2xpZCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDJjNmFjNmIyLAlMIkx1Y2lkYUJyaWdodCIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvIiwJMiwJMTI1Mn0sDQotICAgIHsweDJjOWYzOGUyLAlMIktvenVrYU1pbmNob1Byby1WSVIiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgyZDVhNDdiMCwJTCJTVENhaXl1biIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweDJkZWYyNmJmLAlMIkJlcm5hcmRNVC1Db25kZW5zZWQiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgyZmQ4OTMwYiwJTCJLb3p1a2FNaW5jaG9QcjZOUiIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDMxMTU1MjVhLAlMIkZhbmdTb25nX0dCMjMxMiIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzMTMyNzgxNywJTCJNeXJpYWRQcm8iLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzMjI0NDk3NSwgICAgTCJIZWx2ZXRpY2EiLCBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byIsCSAwLCAgIDEyNTJ9LA0KLSAgICB7MHgzMmFjOTk1YywJTCJUZXJtaW5hbCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDMzOGQ2NDhhLAlMIk5pYWdhcmFFbmdyYXZlZC1SZWciLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzM2JiNjVmMiwJTCJTeWxmYWVuIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCi0gICAgezB4MzQwMmMzMGUsCUwiTVNQTWluY2hvIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQotICAgIHsweDM0MTJiZjMxLAlMIlNpbVN1bi1QVUEiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KLSAgICB7MHgzNmViMzliOSwJTCJCZXJsaW5TYW5zRkIiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzNmY0MjA1NSwJTCJVbml2ZXJzQVRUIiwJTCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzODY0YzRmNiwJTCJIaWdoVG93ZXJUZXh0IiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCi0gICAgezB4M2EyNTdkMDMsCUwiRmFuZ1NvbmdfR0IyMzEyIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDNjZGFlNjY4LAlMIkZyZWVzdHlsZVNjcmlwdCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJOCwJMTI1Mn0sDQotICAgIHsweDNkNTVhZWQ3LAlMIkpva2VybWFuIiwJTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4M2Q1YjQzODUsCUwiUE1pbmdMaVUiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCi0gICAgezB4M2Q5Yjc2NjksCUwiRXN0cmFuZ2Vsb0VkZXNzYSIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDNlNTMyZDc0LAlMIkZyYW5rbGluR290aGljTWVkaXVtIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4M2U2YWEzMmQsCUwiTlNpbVN1biIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTkzNn0sDQotICAgIHsweDNmNmMzNmE4LAlMIkdhdXRhbWkiLAlMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHgzZmYzMjY2MiwJTCJDaGlsbGVyLVJlZ3VsYXIiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0MDlkZTMxMiwJTCJNb2Rlcm5Oby4yMCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQotICAgIHsweDQxNDQzYzVlLAlMIkdlb3JnaWEiLAlMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KLSAgICB7MHg0MTYwYWRlNSwJTCJCZWxsR290aGljU3RkQmxhY2siLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0MjE5NzZjNCwJTCJNb2Rlcm4tUmVndWxhciIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQotICAgIHsweDQyMmE3MjUyLAlMIlN0ZW5jaWwiLAlMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0MmM4NTU0ZiwJTCJGaXhlZHN5cyIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDQzNWNiNDFkLAlMIlJvbWFuIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4NDc4ODIzODMsCUwiQ291cmllck5ldyIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTEyNTJ9LA0KLSAgICB7MHg0ODBhMjMzOCwJTCJCZXJsaW5TYW5zRkJEZW1pIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4NDgwYmY3YTQsCUwiQ291cmllclN0ZCIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0ODFhZDZlZCwJTCJWbGFkaW1pclNjcmlwdCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJOCwJMTI1Mn0sDQotICAgIHsweDQ5MTE1NzdhLAlMIllvdVl1YW4iLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAk5MzZ9LA0KLSAgICB7MHg0YTc4OGQ3MiwJTCJTVFhpbmdrYWkiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KLSAgICB7MHg0YmY4ODU2NiwJTCJTZWdvZUNvbmRlbnNlZCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDRjY2Y1MWE0LAlMIkJlcmxpblNhbnNGQi1SZWciLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg0ZWE5NjdjZSwJTCJHdWxpbUNoZSIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTEyNTJ9LA0KLSAgICB7MHg0ZjY4YmQ3OSwJTCJMZXR0ZXJHb3RoaWNTdGQiLAlMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg1MWEwZDBlNiwJTCJLb3p1a2FHb3RoaWNQcjZOTSIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDUzMWIzZGVhLAlMIkJhc2VtaWNTeW1ib2wiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg1MzMzZmQzOSwJTCJDYWxpZm9ybmlhbkZCLVJlZyIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQotICAgIHsweDUzNTYxYTU0LAlMIkZaWVRLLS1HQksxLTAiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KLSAgICB7MHg1NWUwZGRlNiwJTCJMdWNpZGFTYW5zVHlwZXdyaXRlciIsCUwiRHJvaWQgU2FucyBNb25vLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljIiwJMCwJMTI1Mn0sDQotICAgIHsweDU3NGQ0ZDNkLAlMIkFkb2JlQXJhYmljIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4NTc5MmU3NTksCUwiU1RLYWl0aSIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweDU5MjE5NzhlLAlMIkx1Y2lkYVNhbnNVbmljb2RlIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDU5NGUyZGE0LAlMIlZyaW5kYSIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyIsCTAsCTEyNTJ9LA0KLSAgICB7MHg1OWJhYTlhMiwJTCJLYWlUaV9HQjIzMTIiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4NWNmZWRmNGYsCUwiQmFza09sZEZhY2UiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg1Zjk3OTIxYywJTCJBZG9iZU15dW5nam9TdGRNIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4NWZlZmJmYWQsCUwiQmF0YW5nIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQotICAgIHsweDYwNTM0MmI5LAlMIkRvdHVtQ2hlIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMSwJMTI1Mn0sDQotICAgIHsweDYwOGM1ZjlhLAlMIkthaVRpX0dCMjMxMiIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweDYxZWZkMGQxLAlMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLAlMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8iLAkwLAkxMjUyfSwNCi0gICAgezB4NjI2NjA4YTksCUwiTVZCb2xpIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweDYzMDUwMWEzLAlMIlNtYWxsRm9udHMiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg2NWQwZTJhOSwJTCJGWllUSy0tR0JLMS0wIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4NjY5ZjI5ZTEsCUwiRlpTVEstLUdCSzEtMCIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweDY3M2E5ZTVmLAlMIlR1bmdhIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4NjkxYWE0Y2UsCUwiTmlhZ2FyYVNvbGlkIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4Njk2MjU5YjcsCUwiQ29yYmVsIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4Njk2ZWU5YmUsCUwiU1RYaWhlaSIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweDZjNTljZjY5LAlMIkRvdHVtIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDcwN2ZhNTYxLAlMIkd1bmdzdWgiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCi0gICAgezB4NzE0MTZiYjIsCUwiWldBZG9iZUYiLAlMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEFybWVuaWFuLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2FucyBHZW9yZ2lhbixEcm9pZCBTYW5zIEhlYnJldyxEcm9pZCBTYW5zIFRoYWkiLAkwLAkxMjUyfSwNCi0gICAgezB4NzFiNDE4MDEsCUwiVmVyZGFuYSIsCUwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDczZjI1ZTRjLAlMIlBhbGF0aW5vTGlub3R5cGUiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4NzNmNGQxOWYsCUwiTmlhZ2FyYUVuZ3JhdmVkIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4NzQwMDE2OTQsCUwiTXlyaWFkUHJvQmxhY2siLAlMIkJvb2sgQW50aXF1YSxDb25zdGFudGlhLERvdHVtLEdlb3JnaWEiLAkwLAkxMjUyfSwNCi0gICAgezB4NzRiMTRkOGYsCUwiSGFldHRlbnNjaHdlaWxlciIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDc0Y2I0NGVlLAlMIk5TaW1TdW4iLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAk5MzZ9LA0KLSAgICB7MHg3NmI0ZDdmZiwJTCJTaHJ1dGkiLAlMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8iLAkwLAkxMjUyfSwNCi0gICAgezB4Nzg4YjM1MzMsCUwiV2ViZGluZ3MiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTYsCTQyfSwNCi0gICAgezB4Nzk3ZGRlOTksCUwiTVNTZXJpZiIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDdhMGY5ZTllLAlMIk1TTWluY2hvIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMSwJMTI1Mn0sDQotICAgIHsweDdiNDM5Y2FmLAlMIk9sZEVuZ2xpc2hUZXh0TVQiLAlMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4MjEzYTQzMywJTCJMdWNpZGFTYW5zLVR5cGV3cml0ZXIiLAlMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4MmZlYzkyOSwJTCJBZG9iZVNvbmdTdGRMIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4ODM1ODE4MjUsCUwiTW9kZXJuIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4ODM1YTI4MjMsCUwiQWxnZXJpYW4iLAlMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4M2RhYjlmNSwJTCJTY3JpcHQiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4NDdiNTZkYSwJTCJUYWhvbWEiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4OGE3ODNjYjIsCUwiU2ltU3VuLVBVQSIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4YjVjYWMwZSwJTCJPbnl4IiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4OGM2YTQ5OWUsCUwiR3VsaW0iLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4OGUwYWY3OTAsCUwiSnVpY2VJVEMiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHg4ZThkNDNiMiwJTCJDZW50YXVyIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCi0gICAgezB4OGVlNGRjY2EsCUwiQm9va3NoZWxmU3ltYm9sNyIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDkwNzk0ODAwLAlMIkJlbGxHb3RoaWNTdGRMaWdodCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDkwOWI1MTZhLAlMIkNlbnR1cnkiLAlMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KLSAgICB7MHg5MmFlMzcwZCwJTCJNU091dGxvb2siLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTQsCTQyfSwNCi0gICAgezB4OTNjOWZiZjEsCUwiTHVjaWRhRmF4IiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMiwJMTI1Mn0sDQotICAgIHsweDk1NjUwODVlLAlMIkJvb2tBbnRpcXVhIiwJTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCi0gICAgezB4OTg1NmQ5NWQsCUwiQWRvYmVNaW5nU3RkTCIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTk0OX0sDQotICAgIHsweDliYmFkZDZiLAlMIkNvbG9ubmFNVCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweDljYmQxNmE0LAlMIlNob3djYXJkR290aGljLVJlZyIsCUwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWMiLAkwLAkxMjUyfSwNCi0gICAgezB4OWQ3MzAwOGUsCUwiTVNTYW5zU2VyaWYiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHhhMDYwN2RiMSwJTCJHdW5nc3VoQ2hlIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMSwJMTI1Mn0sDQotICAgIHsweGEwYmNmNmExLAlMIkxhdGluV2lkZSIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQotICAgIHsweGExNDI5YjM2LAlMIlN5bWJvbCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJNiwJNDJ9LA0KLSAgICB7MHhhMWZhNWFiYywJTCJXaW5nZGluZ3MyIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAk2LAk0Mn0sDQotICAgIHsweGExZmE1YWJkLAlMIldpbmdkaW5nczMiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTYsCTQyfSwNCi0gICAgezB4YTQyN2JhZDQsCUwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsCTgsCTEyNTJ9LA0KLSAgICB7MHhhOGI5MmVjZSwJTCJGWlNUSy0tR0JLMS0wIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4YThkODNlY2UsCUwiQ2FsaWZvcm5pYW5GQiIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQotICAgIHsweGFhM2UwODJjLAlMIktpbmdzb2Z0LVBob25ldGljIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4YWE2YmNhYmUsCUwiSGFybG93U29saWRJdGFsaWMiLAlMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHhhZGU1MzM3YywJTCJNU1VJR290aGljIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4YjA4ZGQ5NDEsCUwiV2lkZUxhdGluIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMiwJMTI1Mn0sDQotICAgIHsweGIyMDdmMDVkLAlMIlBvb3JSaWNoYXJkIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCi0gICAgezB4YjNiYzQ5MmYsCUwiSnVpY2VJVEMtUmVndWxhciIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGI1NTQ1Mzk5LAlMIk1hcmxldHQiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTQsCTQyfSwNCi0gICAgezB4YjVkZDFlYmIsCUwiQnJpdGFubmljQm9sZCIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLAkwLAkxMjUyfSwNCi0gICAgezB4YjY5OWMxYzUsCUwiTHVjaWRhQ2FsbGlncmFwaHktSXRhbGljIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4YjcyNWQ2MjksCUwiVGltZXNOZXdSb21hbiIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTIsCTEyNTJ9LA0KLSAgICB7MHhiN2VhZWJlYiwJTCJBZG9iZUhlaXRpU3RkUiIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweGJkMjljNDg2LAlMIkJlcmxpblNhbnNGQkRlbWktQm9sZCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGJlOGE4ZGI0LAlMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4YzE2YzAxMTgsCUwiQWRvYmVIZWJyZXciLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayxEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhjMzE4YjBhZiwJTCJNeXJpYWRQcm9MaWdodCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGM2NWU1NjU5LAlMIkNhbWJyaWFNYXRoIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMiwJMTI1Mn0sDQotICAgIHsweGM3NWM4ZjA1LAlMIkx1Y2lkYUNvbnNvbGUiLAlMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTEyNTJ9LA0KLSAgICB7MHhjYTdjMzVkNiwJTCJDYWxpYnJpIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGNiMDUzZjUzLAlMIk1pY3Jvc29mdFlhSGVpIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4Y2I3MTkwZjksCUwiTWFnbmV0by1Cb2xkIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4Y2NhMDBjYzUsCUwiU3lzdGVtIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4Y2NhZDZmNzYsCUwiSm9rZXJtYW4tUmVndWxhciIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGNjYzU4MThjLAlMIkV1cm9TaWduIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4Y2YzZDcyMzQsCUwiTHVjaWRhSGFuZHdyaXRpbmctSXRhbGljIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4Y2Y3YjhmZGIsCUwiTWluaW9uUHJvIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4Y2ZlNTc1NWYsCUwiU2ltaGVpIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMSwJOTM2fSwNCi0gICAgezB4ZDAxMWY0ZWUsCUwiTVNQR290aGljIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGQwNjBlN2VmLAlMIlZpdmFsZGkiLAlMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTgsCTEyNTJ9LA0KLSAgICB7MHhkMDdlZGVjMSwJTCJGcmFua2xpbkdvdGhpYy1NZWRpdW0iLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHhkMTA3MjQzZiwJTCJTaW1TdW4iLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KLSAgICB7MHhkMTg4MTU2MiwJTCJBcmlhbE5hcnJvdyIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGQyMmI3ZGNlLAlMIkJvZG9uaU1UUG9zdGVyQ29tcHJlc3NlZCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGQyMmJmYTYwLAlMIkNvbWljU2Fuc01TIiwJTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTgsCTEyNTJ9LA0KLSAgICB7MHhkM2JkMGUzNSwJTCJCYXVoYXVzOTMiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHhkNDI5ZWU3YSwJTCJTVEZhbmdzb25nIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4ZDY2NzljMTIsCUwiQmVybmFyZE1UQ29uZGVuc2VkIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4ZDhlOGEwMjcsCUwiTHVjaWRhU2FucyIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvIiwJMCwJMTI1Mn0sDQotICAgIHsweGQ5ZmU3NzYxLAlMIkhpZ2hUb3dlclRleHQtUmVnIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkyLAkxMjUyfSwNCi0gICAgezB4ZGE3ZTU1MWUsCUwiU1RTb25nIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4ZGFhNjg0MmQsCUwiU1RaaG9uZ3NvbmciLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KLSAgICB7MHhkYWFhYjkzZiwJTCJTVEZhbmdzb25nIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4ZGFlYjA3MTMsCUwiU1RTb25nIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KLSAgICB7MHhkYWZlZGJlZiwJTCJTVENhaXl1biIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweGRiMDBhM2Q5LAlMIkJyb2Fkd2F5IiwJTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4ZGIxZjVhZDQsCUwiU1RYaW53ZWkiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAk5MzZ9LA0KLSAgICB7MHhkYjMyNmU3ZiwJTCJTVEthaXRpIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4ZGI2OTU5NWEsCUwiU1RIdXBvIiwJTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJOTM2fSwNCi0gICAgezB4ZGJhMDA4MmMsCUwiU1RYaWhlaSIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweGRiZDBhYjE4LAlMIlNUWGluZ2thaSIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweGRjMWE3ZGIxLAlMIlNUTGl0aSIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweGRjMzMwNzVmLAlMIktyaXN0ZW5JVEMtUmVndWxhciIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvIiwJOCwJMTI1Mn0sDQotICAgIHsweGRjYzcwMDljLAlMIkhhcnJpbmd0b24iLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHhkZDcxMjQ2NiwJTCJBcmlhbEJsYWNrIiwJTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4ZGRlODdiM2UsCUwiSW1wYWN0IiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAkwLAkxMjUyfSwNCi0gICAgezB4ZGY2OWZiMzIsCUwiU25hcElUQyIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhkZjhiMjVlOCwJTCJDZW50dXJ5R290aGljIiwJTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweGUwZjcwNWMwLAlMIktyaXN0ZW5JVEMiLAlMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byIsCTgsCTEyNTJ9LA0KLSAgICB7MHhlMTQyNzU3MywJTCJSYWF2aSIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyIsCTAsCTEyNTJ9LA0KLSAgICB7MHhlMmNlYTBjYiwJTCJNYWduZXRvIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweGUzNmE5ZTE3LAlMIlJhdmllIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweGU0MzNmOGUyLAlMIlBhcmNobWVudCIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJOCwJMTI1Mn0sDQotICAgIHsweGU0M2RmZjRhLAlMIldpbmdkaW5ncyIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJNCwJNDJ9LA0KLSAgICB7MHhlNGUyYzQwNSwJTCJNVEV4dHJhIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAk2LAk0Mn0sDQotICAgIHsweGU2MThjYzM1LAlMIkluZm9ybWFsUm9tYW4iLAlMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZiIsCTgsCTEyNTJ9LA0KLSAgICB7MHhlNmMyN2ZmYywJTCJNaXN0cmFsIiwJTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLAk4LAkxMjUyfSwNCi0gICAgezB4ZTdlYmY0YjksCUwiQ291cmllciIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHhlOGJjNGE5ZCwJTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGU5MGZiMDEzLAlMIlRlbXB1c1NhbnNJVEMiLAlMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTEyNTJ9LA0KLSAgICB7MHhlYzYzN2I0MiwJTCJDb25zb2xhcyIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTEsCTEyNTJ9LA0KLSAgICB7MHhlZDNhNjgzYiwJTCJTVFhpbndlaSIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweGVmMjY0Y2QxLAlMIkx1Y2lkYUhhbmR3cml0aW5nIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweGYwODZiY2EyLAlMIkJhc2tlcnZpbGxlT2xkRmFjZSIsCUwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGYxMDI4MDMwLAlMIk1hbmdhbCIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyIsCTIsCTEyNTJ9LA0KLSAgICB7MHhmMWRhN2ViOSwJTCJTaG93Y2FyZEdvdGhpYyIsCUwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWMiLAkwLAkxMjUyfSwNCi0gICAgezB4ZjIxMGYwNmEsCUwiQXJpYWxNVCIsCUwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmIiwJMCwJMTI1Mn0sDQotICAgIHsweGY0NzdmMTZhLAlMIkxhdGhhIiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweGY2MTZmM2RkLAlMIkxpU3UiLAlMIkRyb2lkIFNhbnMgRmFsbGJhY2siLAkxLAk5MzZ9LA0KLSAgICB7MHhmYTQ3OWFhNiwJTCJNaWNyb3NvZnRZYUhlaSIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQotICAgIHsweGZjZDE5Njk3LAlMIkJvb2ttYW5PbGRTdHlsZSIsCUwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwJMCwJMTI1Mn0sDQotICAgIHsweGZlMjA5YTgyLAlMIkx1Y2lkYUNhbGxpZ3JhcGh5IiwJTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vIiwJMCwJMTI1Mn0sDQotICAgIHsweGZlZjEzNWY4LAlMIkFkb2JlSGVpdGlTdGQtUmVndWxhciIsCUwiRHJvaWQgU2FucyBGYWxsYmFjayIsCTAsCTkzNn0sDQorICAgIHsweDAxZDVkMzNlLCBMIlNpbVN1biIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweDAxZTRmMTAyLCBMIllvdVl1YW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCA5MzZ9LA0KKyAgICB7MHgwMzA1NDlkYywgTCJMaVN1IiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgOTM2fSwNCisgICAgezB4MDMyZWRkNDQsIEwiU2ltaGVpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgOTM2fSwNCisgICAgezB4MDNlYWM2ZmMsIEwiUG9vclJpY2hhcmQtUmVndWxhciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayxEcm9pZCBBcmFiaWMgIg0KKyAgICAgTCJOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgwM2VkOTBlNiwgTCJOaW5hIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDA3N2I1NmIzLCBMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsDQorICAgICBMIkRyb2lkIFNhbnMgVGhhaSxEcm9pZCBTYW5zIEFybWVuaWFuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zICINCisgICAgIEwiRXRoaW9waWMsRHJvaWQgU2FucyBGYWxsYmFjayIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MDc4ZWQ1MjQsIEwiTWljcm9zb2Z0U2Fuc1NlcmlmIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDA4OWIxOGE5LCBMIkFyaWFsIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDBiMmNhZDcyLCBMIk1vbm90eXBlQ29yc2l2YSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDgsIDEyNTJ9LA0KKyAgICB7MHgwYmIwMDNlNywgTCJLYXJ0aWthIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgwYmI0NjlkZiwgTCJWaW5lckhhbmRJVEMiLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwNCisgICAgezB4MGJjMWE4NTEsIEwiU2Vnb2VVSSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgwYzExMmViZCwgTCJLb3p1a2FHb3RoaWNQcm8tVklNIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDBjZmNiOWMxLCBMIkFkb2JlVGhhaSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDg0N30sDQorICAgIHsweDBlN2RlMGY5LCBMIlBsYXliaWxsIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgwZWZmNDdjMywgTCJTVEh1cG8iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHgxMDdhZDM3NCwgTCJDb25zdGFudGlhIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDEyMTk0YzJkLCBMIkt1bnN0bGVyU2NyaXB0IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sDQorICAgIHsweDEzNWVmNmExLCBMIk1pbmlvblByb1NtQmQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MTU4YzQwNDksIEwiR2FyYW1vbmQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwNCisgICAgezB4MTYwZWNiMjQsIEwiU1RaaG9uZ3NvbmciLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHgxNjFlZDA3ZSwgTCJNU0dvdGhpYyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDEyNTJ9LA0KKyAgICB7MHgxNzFkMWVkMSwgTCJTbmFwSVRDLVJlZ3VsYXIiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MThkMTE4OGYsIEwiQ2FtYnJpYSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHgxOGVhZjM1MCwgTCJBcmlhbFVuaWNvZGVNUyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweDFhOTJkMTE1LCBMIk1pbmdMaVUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwNCisgICAgezB4MWNjMjE3YzYsIEwiVHJlYnVjaGV0TVMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MWQ2NDk1OTYsIEwiQmFzZW1pY1RpbWVzIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDFlMzRlZTYwLCBMIkJlbGxNVCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHgxZWIzNjk0NSwgTCJDb29wZXJCbGFjayIsDQorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHgxZWY3Nzg3ZCwgTCJCYXRhbmdDaGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwNCisgICAgezB4MjBiM2JkM2EsIEwiQnJ1c2hTY3JpcHRNVCIsIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLCA4LA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDIyMDg3N2FhLCBMIkNhbmRhcmEiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MjIxMzUwMDcsIEwiRnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwNCisgICAgezB4MjUxMDU5YzMsIEwiQ2hpbGxlciIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyNWJlZDZkZCwgTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyODE1NGM4MSwgTCJQYXJjaG1lbnQtUmVndWxhciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDgsIDEyNTJ9LA0KKyAgICB7MHgyOTcxMWViOSwgTCJTVExpdGkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHgyYjE5OTNiNCwgTCJCYXNlbWljIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDJiMzE2MzM5LCBMIk5pYWdhcmFTb2xpZC1SZWciLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MmMxNDc1MjksIEwiRm9vdGxpZ2h0TVRMaWdodCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYzE5ODkyOCwgTCJIYXJsb3dTb2xpZCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYzZhYzZiMiwgTCJMdWNpZGFCcmlnaHQiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8iLCAyLCAxMjUyfSwNCisgICAgezB4MmM5ZjM4ZTIsIEwiS296dWthTWluY2hvUHJvLVZJUiIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyZDVhNDdiMCwgTCJTVENhaXl1biIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweDJkZWYyNmJmLCBMIkJlcm5hcmRNVC1Db25kZW5zZWQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MmZkODkzMGIsIEwiS296dWthTWluY2hvUHI2TlIiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MzExNTUyNWEsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDMxMzI3ODE3LCBMIk15cmlhZFBybyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzMjI0NDk3NSwgTCJIZWx2ZXRpY2EiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8iLCAwLCAxMjUyfSwNCisgICAgezB4MzJhYzk5NWMsIEwiVGVybWluYWwiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MzM4ZDY0OGEsIEwiTmlhZ2FyYUVuZ3JhdmVkLVJlZyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzM2JiNjVmMiwgTCJTeWxmYWVuIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDM0MDJjMzBlLCBMIk1TUE1pbmNobyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHgzNDEyYmYzMSwgTCJTaW1TdW4tUFVBIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4MzZlYjM5YjksIEwiQmVybGluU2Fuc0ZCIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDM2ZjQyMDU1LCBMIlVuaXZlcnNBVFQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDM4NjRjNGY2LCBMIkhpZ2hUb3dlclRleHQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwNCisgICAgezB4M2EyNTdkMDMsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDNjZGFlNjY4LCBMIkZyZWVzdHlsZVNjcmlwdCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDgsIDEyNTJ9LA0KKyAgICB7MHgzZDU1YWVkNywgTCJKb2tlcm1hbiIsDQorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzZDViNDM4NSwgTCJQTWluZ0xpVSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHgzZDliNzY2OSwgTCJFc3RyYW5nZWxvRWRlc3NhIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDNlNTMyZDc0LCBMIkZyYW5rbGluR290aGljTWVkaXVtIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDNlNmFhMzJkLCBMIk5TaW1TdW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCA5MzZ9LA0KKyAgICB7MHgzZjZjMzZhOCwgTCJHYXV0YW1pIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDNmZjMyNjYyLCBMIkNoaWxsZXItUmVndWxhciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0MDlkZTMxMiwgTCJNb2Rlcm5Oby4yMCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHg0MTQ0M2M1ZSwgTCJHZW9yZ2lhIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDQxNjBhZGU1LCBMIkJlbGxHb3RoaWNTdGRCbGFjayIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0MjE5NzZjNCwgTCJNb2Rlcm4tUmVndWxhciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHg0MjJhNzI1MiwgTCJTdGVuY2lsIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDQzNWNiNDFkLCBMIlJvbWFuIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDQ3ODgyMzgzLCBMIkNvdXJpZXJOZXciLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwNCisgICAgezB4NDgwYTIzMzgsIEwiQmVybGluU2Fuc0ZCRGVtaSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0ODBiZjdhNCwgTCJDb3VyaWVyU3RkIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDQ4MWFkNmVkLCBMIlZsYWRpbWlyU2NyaXB0IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sDQorICAgIHsweDQ5MTE1NzdhLCBMIllvdVl1YW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCA5MzZ9LA0KKyAgICB7MHg0YTc4OGQ3MiwgTCJTVFhpbmdrYWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg0YmY4ODU2NiwgTCJTZWdvZUNvbmRlbnNlZCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0Y2NmNTFhNCwgTCJCZXJsaW5TYW5zRkItUmVnIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDRlYTk2N2NlLCBMIkd1bGltQ2hlIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sDQorICAgIHsweDRmNjhiZDc5LCBMIkxldHRlckdvdGhpY1N0ZCIsDQorICAgICBMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICINCisgICAgIEwiTW9ubyxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIEZhbGxiYWNrIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg1MWEwZDBlNiwgTCJLb3p1a2FHb3RoaWNQcjZOTSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1MzFiM2RlYSwgTCJCYXNlbWljU3ltYm9sIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDUzMzNmZDM5LCBMIkNhbGlmb3JuaWFuRkItUmVnIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDUzNTYxYTU0LCBMIkZaWVRLLS1HQksxLTAiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg1NWUwZGRlNiwgTCJMdWNpZGFTYW5zVHlwZXdyaXRlciIsDQorICAgICBMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1NzRkNGQzZCwgTCJBZG9iZUFyYWJpYyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1NzkyZTc1OSwgTCJTVEthaXRpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4NTkyMTk3OGUsIEwiTHVjaWRhU2Fuc1VuaWNvZGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4NTk0ZTJkYTQsIEwiVnJpbmRhIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg1OWJhYTlhMiwgTCJLYWlUaV9HQjIzMTIiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4NWNmZWRmNGYsIEwiQmFza09sZEZhY2UiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4NWY5NzkyMWMsIEwiQWRvYmVNeXVuZ2pvU3RkTSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweDVmZWZiZmFkLCBMIkJhdGFuZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHg2MDUzNDJiOSwgTCJEb3R1bUNoZSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDEyNTJ9LA0KKyAgICB7MHg2MDhjNWY5YSwgTCJLYWlUaV9HQjIzMTIiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg2MWVmZDBkMSwgTCJNYXR1cmFNVFNjcmlwdENhcGl0YWxzIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg2MjY2MDhhOSwgTCJNVkJvbGkiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDYzMDUwMWEzLCBMIlNtYWxsRm9udHMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4NjVkMGUyYTksIEwiRlpZVEstLUdCSzEtMCIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweDY2OWYyOWUxLCBMIkZaU1RLLS1HQksxLTAiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg2NzNhOWU1ZiwgTCJUdW5nYSIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zICINCisgICAgIEwiTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg2OTFhYTRjZSwgTCJOaWFnYXJhU29saWQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4Njk2MjU5YjcsIEwiQ29yYmVsIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDY5NmVlOWJlLCBMIlNUWGloZWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg2YzU5Y2Y2OSwgTCJEb3R1bSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3MDdmYTU2MSwgTCJHdW5nc3VoIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDcxNDE2YmIyLCBMIlpXQWRvYmVGIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgQXJtZW5pYW4sRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICINCisgICAgIEwiR2VvcmdpYW4sRHJvaWQgU2FucyBIZWJyZXcsRHJvaWQgU2FucyBUaGFpIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg3MWI0MTgwMSwgTCJWZXJkYW5hIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDczZjI1ZTRjLCBMIlBhbGF0aW5vTGlub3R5cGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4NzNmNGQxOWYsIEwiTmlhZ2FyYUVuZ3JhdmVkIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDc0MDAxNjk0LCBMIk15cmlhZFByb0JsYWNrIiwgTCJCb29rIEFudGlxdWEsQ29uc3RhbnRpYSxEb3R1bSxHZW9yZ2lhIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg3NGIxNGQ4ZiwgTCJIYWV0dGVuc2Nod2VpbGVyIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDc0Y2I0NGVlLCBMIk5TaW1TdW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCA5MzZ9LA0KKyAgICB7MHg3NmI0ZDdmZiwgTCJTaHJ1dGkiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDc4OGIzNTMzLCBMIldlYmRpbmdzIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNiwgNDJ9LA0KKyAgICB7MHg3OTdkZGU5OSwgTCJNU1NlcmlmIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDdhMGY5ZTllLCBMIk1TTWluY2hvIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sDQorICAgIHsweDdiNDM5Y2FmLCBMIk9sZEVuZ2xpc2hUZXh0TVQiLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ODIxM2E0MzMsIEwiTHVjaWRhU2Fucy1UeXBld3JpdGVyIiwNCisgICAgIEwiRHJvaWQgU2FucyBNb25vLERyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDgyZmVjOTI5LCBMIkFkb2JlU29uZ1N0ZEwiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg4MzU4MTgyNSwgTCJNb2Rlcm4iLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ODM1YTI4MjMsIEwiQWxnZXJpYW4iLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ODNkYWI5ZjUsIEwiU2NyaXB0IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDg0N2I1NmRhLCBMIlRhaG9tYSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4YTc4M2NiMiwgTCJTaW1TdW4tUFVBIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDhiNWNhYzBlLCBMIk9ueXgiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4OGM2YTQ5OWUsIEwiR3VsaW0iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4OGUwYWY3OTAsIEwiSnVpY2VJVEMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4OGU4ZDQzYjIsIEwiQ2VudGF1ciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHg4ZWU0ZGNjYSwgTCJCb29rc2hlbGZTeW1ib2w3IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDkwNzk0ODAwLCBMIkJlbGxHb3RoaWNTdGRMaWdodCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg5MDliNTE2YSwgTCJDZW50dXJ5IiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDkyYWUzNzBkLCBMIk1TT3V0bG9vayIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDQsIDQyfSwNCisgICAgezB4OTNjOWZiZjEsIEwiTHVjaWRhRmF4IiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHg5NTY1MDg1ZSwgTCJCb29rQW50aXF1YSIsDQorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHg5ODU2ZDk1ZCwgTCJBZG9iZU1pbmdTdGRMIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTQ5fSwNCisgICAgezB4OWJiYWRkNmIsIEwiQ29sb25uYU1UIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDljYmQxNmE0LCBMIlNob3djYXJkR290aGljLVJlZyIsDQorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjIiwgMCwgMTI1Mn0sDQorICAgIHsweDlkNzMwMDhlLCBMIk1TU2Fuc1NlcmlmIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGEwNjA3ZGIxLCBMIkd1bmdzdWhDaGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwNCisgICAgezB4YTBiY2Y2YTEsIEwiTGF0aW5XaWRlIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweGExNDI5YjM2LCBMIlN5bWJvbCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDYsIDQyfSwNCisgICAgezB4YTFmYTVhYmMsIEwiV2luZ2RpbmdzMiIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDYsIDQyfSwNCisgICAgezB4YTFmYTVhYmQsIEwiV2luZ2RpbmdzMyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDYsIDQyfSwNCisgICAgezB4YTQyN2JhZDQsIEwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLCA4LCAxMjUyfSwNCisgICAgezB4YThiOTJlY2UsIEwiRlpTVEstLUdCSzEtMCIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGE4ZDgzZWNlLCBMIkNhbGlmb3JuaWFuRkIiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwNCisgICAgezB4YWEzZTA4MmMsIEwiS2luZ3NvZnQtUGhvbmV0aWMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4YWE2YmNhYmUsIEwiSGFybG93U29saWRJdGFsaWMiLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4YWRlNTMzN2MsIEwiTVNVSUdvdGhpYyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhiMDhkZDk0MSwgTCJXaWRlTGF0aW4iLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweGIyMDdmMDVkLCBMIlBvb3JSaWNoYXJkIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweGIzYmM0OTJmLCBMIkp1aWNlSVRDLVJlZ3VsYXIiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4YjU1NDUzOTksIEwiTWFybGV0dCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDQsIDQyfSwNCisgICAgezB4YjVkZDFlYmIsIEwiQnJpdGFubmljQm9sZCIsIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweGI2OTljMWM1LCBMIkx1Y2lkYUNhbGxpZ3JhcGh5LUl0YWxpYyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhiNzI1ZDYyOSwgTCJUaW1lc05ld1JvbWFuIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweGI3ZWFlYmViLCBMIkFkb2JlSGVpdGlTdGRSIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4YmQyOWM0ODYsIEwiQmVybGluU2Fuc0ZCRGVtaS1Cb2xkIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGJlOGE4ZGI0LCBMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGMxNmMwMTE4LCBMIkFkb2JlSGVicmV3IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrLERyb2lkIEFyYWJpYyAiDQorICAgICBMIk5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGMzMThiMGFmLCBMIk15cmlhZFByb0xpZ2h0IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGM2NWU1NjU5LCBMIkNhbWJyaWFNYXRoIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweGM3NWM4ZjA1LCBMIkx1Y2lkYUNvbnNvbGUiLA0KKyAgICAgTCJEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwNCisgICAgezB4Y2E3YzM1ZDYsIEwiQ2FsaWJyaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjYjA1M2Y1MywgTCJNaWNyb3NvZnRZYUhlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2EwMGNjNSwgTCJTeXN0ZW0iLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4Y2NhZDZmNzYsIEwiSm9rZXJtYW4tUmVndWxhciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2M1ODE4YywgTCJFdXJvU2lnbiIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjZjNkNzIzNCwgTCJMdWNpZGFIYW5kd3JpdGluZy1JdGFsaWMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4Y2Y3YjhmZGIsIEwiTWluaW9uUHJvIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGNmZTU3NTVmLCBMIlNpbWhlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sDQorICAgIHsweGQwMTFmNGVlLCBMIk1TUEdvdGhpYyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkMDYwZTdlZiwgTCJWaXZhbGRpIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sDQorICAgIHsweGQwN2VkZWMxLCBMIkZyYW5rbGluR290aGljLU1lZGl1bSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkMTA3MjQzZiwgTCJTaW1TdW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHhkMTg4MTU2MiwgTCJBcmlhbE5hcnJvdyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkMjJiN2RjZSwgTCJCb2RvbmlNVFBvc3RlckNvbXByZXNzZWQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ZDIyYmZhNjAsIEwiQ29taWNTYW5zTVMiLCBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhkM2JkMGUzNSwgTCJCYXVoYXVzOTMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ZDQyOWVlN2EsIEwiU1RGYW5nc29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGQ2Njc5YzEyLCBMIkJlcm5hcmRNVENvbmRlbnNlZCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkOGU4YTAyNywgTCJMdWNpZGFTYW5zIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvIiwgMCwgMTI1Mn0sDQorICAgIHsweGQ5ZmU3NzYxLCBMIkhpZ2hUb3dlclRleHQtUmVnIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweGRhN2U1NTFlLCBMIlNUU29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRhYTY4NDJkLCBMIlNUWmhvbmdzb25nIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZGFhYWI5M2YsIEwiU1RGYW5nc29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRhZWIwNzEzLCBMIlNUU29uZyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRhZmVkYmVmLCBMIlNUQ2FpeXVuIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZGIwMGEzZDksIEwiQnJvYWR3YXkiLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ZGIxZjVhZDQsIEwiU1RYaW53ZWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHhkYjMyNmU3ZiwgTCJTVEthaXRpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZGI2OTU5NWEsIEwiU1RIdXBvIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZGJhMDA4MmMsIEwiU1RYaWhlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRiZDBhYjE4LCBMIlNUWGluZ2thaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRjMWE3ZGIxLCBMIlNUTGl0aSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRjMzMwNzVmLCBMIktyaXN0ZW5JVEMtUmVndWxhciIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byIsIDgsIDEyNTJ9LA0KKyAgICB7MHhkY2M3MDA5YywgTCJIYXJyaW5ndG9uIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGRkNzEyNDY2LCBMIkFyaWFsQmxhY2siLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ZGRlODdiM2UsIEwiSW1wYWN0IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGRmNjlmYjMyLCBMIlNuYXBJVEMiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGRmOGIyNWU4LCBMIkNlbnR1cnlHb3RoaWMiLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vIiwgMCwgMTI1Mn0sDQorICAgIHsweGUwZjcwNWMwLCBMIktyaXN0ZW5JVEMiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8iLCA4LCAxMjUyfSwNCisgICAgezB4ZTE0Mjc1NzMsIEwiUmFhdmkiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGUyY2VhMGNiLCBMIk1hZ25ldG8iLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGUzNmE5ZTE3LCBMIlJhdmllIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhlNDMzZjhlMiwgTCJQYXJjaG1lbnQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwNCisgICAgezB4ZTQzZGZmNGEsIEwiV2luZ2RpbmdzIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNCwgNDJ9LA0KKyAgICB7MHhlNGUyYzQwNSwgTCJNVEV4dHJhIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNiwgNDJ9LA0KKyAgICB7MHhlNjE4Y2MzNSwgTCJJbmZvcm1hbFJvbWFuIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmIiwgOCwgMTI1Mn0sDQorICAgIHsweGU2YzI3ZmZjLCBMIk1pc3RyYWwiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwNCisgICAgezB4ZTdlYmY0YjksIEwiQ291cmllciIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlOGJjNGE5ZCwgTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlOTBmYjAxMywgTCJUZW1wdXNTYW5zSVRDIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGVjNjM3YjQyLCBMIkNvbnNvbGFzIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sDQorICAgIHsweGVkM2E2ODNiLCBMIlNUWGlud2VpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZWYyNjRjZDEsIEwiTHVjaWRhSGFuZHdyaXRpbmciLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGYwODZiY2EyLCBMIkJhc2tlcnZpbGxlT2xkRmFjZSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhmMTAyODAzMCwgTCJNYW5nYWwiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweGYxZGE3ZWI5LCBMIlNob3djYXJkR290aGljIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWMiLCAwLCAxMjUyfSwNCisgICAgezB4ZjIxMGYwNmEsIEwiQXJpYWxNVCIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHhmNDc3ZjE2YSwgTCJMYXRoYSIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zICINCisgICAgIEwiTW9ubyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4ZjYxNmYzZGQsIEwiTGlTdSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sDQorICAgIHsweGZhNDc5YWE2LCBMIk1pY3Jvc29mdFlhSGVpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZmNkMTk2OTcsIEwiQm9va21hbk9sZFN0eWxlIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGZlMjA5YTgyLCBMIkx1Y2lkYUNhbGxpZ3JhcGh5IiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhmZWYxMzVmOCwgTCJBZG9iZUhlaXRpU3RkLVJlZ3VsYXIiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KIH07DQogI2VuZGlmDQotdm9pZCBYRkFfTG9jYWxGb250TmFtZVRvRW5nbGlzaE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xvY2FsTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgJndzRW5nbGlzaE5hbWUpDQotew0KLSAgICB3c0VuZ2xpc2hOYW1lID0gd3NMb2NhbE5hbWU7DQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18gfHwgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8gfHwgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8gfHwgX0ZYTV9QTEFURk9STV8gPT0gIF9GWE1fUExBVEZPUk1fQU5EUk9JRF8NCi0gICAgRlhfRFdPUkQgZHdMb2NhbE5hbWVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NMb2NhbE5hbWUuR2V0UHRyKCksIHdzTG9jYWxOYW1lLkdldExlbmd0aCgpLCBUUlVFKTsNCi0gICAgaW50MzJfdCBpU3RhcnQgPSAwOw0KLSAgICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19YRkFGb250c01hcCkgLyBzaXplb2YoWEZBX0ZPTlRJTkZPKSAtIDE7DQotICAgIGludDMyX3QgaU1pZCA9IDA7DQotICAgIGRvIHsNCi0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgRlhfRFdPUkQgZHdGb250TmFtZUhhc2ggPSBnX1hGQUZvbnRzTWFwW2lNaWRdLmR3Rm9udE5hbWVIYXNoOw0KLSAgICAgICAgaWYgKGR3Rm9udE5hbWVIYXNoID09IGR3TG9jYWxOYW1lSGFzaCkgew0KLSAgICAgICAgICAgIHdzRW5nbGlzaE5hbWUgPSBnX1hGQUZvbnRzTWFwW2lNaWRdLnBQc05hbWU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9IGVsc2UgaWYgKGR3Rm9udE5hbWVIYXNoIDwgZHdMb2NhbE5hbWVIYXNoKSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAoaUVuZCA+PSBpU3RhcnQpOw0KK3ZvaWQgWEZBX0xvY2FsRm9udE5hbWVUb0VuZ2xpc2hOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRW5nbGlzaE5hbWUpIHsNCisgIHdzRW5nbGlzaE5hbWUgPSB3c0xvY2FsTmFtZTsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXyB8fCBcDQorICAgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8ICAgXA0KKyAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCAgIFwNCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXw0KKyAgRlhfRFdPUkQgZHdMb2NhbE5hbWVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoDQorICAgICAgd3NMb2NhbE5hbWUuR2V0UHRyKCksIHdzTG9jYWxOYW1lLkdldExlbmd0aCgpLCBUUlVFKTsNCisgIGludDMyX3QgaVN0YXJ0ID0gMDsNCisgIGludDMyX3QgaUVuZCA9IHNpemVvZihnX1hGQUZvbnRzTWFwKSAvIHNpemVvZihYRkFfRk9OVElORk8pIC0gMTsNCisgIGludDMyX3QgaU1pZCA9IDA7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBGWF9EV09SRCBkd0ZvbnROYW1lSGFzaCA9IGdfWEZBRm9udHNNYXBbaU1pZF0uZHdGb250TmFtZUhhc2g7DQorICAgIGlmIChkd0ZvbnROYW1lSGFzaCA9PSBkd0xvY2FsTmFtZUhhc2gpIHsNCisgICAgICB3c0VuZ2xpc2hOYW1lID0gZ19YRkFGb250c01hcFtpTWlkXS5wUHNOYW1lOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9IGVsc2UgaWYgKGR3Rm9udE5hbWVIYXNoIDwgZHdMb2NhbE5hbWVIYXNoKSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpRW5kID49IGlTdGFydCk7DQogI2VuZGlmDQogfQ0KLWNvbnN0IFhGQV9GT05USU5GTyogWEZBX0dldEZvbnRJTkZPQnlGb250TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udE5hbWUpDQotew0KLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfIHx8IF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8IF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfIHx8IF9GWE1fUExBVEZPUk1fID09ICBfRlhNX1BMQVRGT1JNX0FORFJPSURfDQotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9udE5hbWVUZW1wID0gd3NGb250TmFtZTsNCi0gICAgd3NGb250TmFtZVRlbXAuUmVtb3ZlKEwnICcpOw0KLSAgICBGWF9EV09SRCBkd0N1ckZvbnROYW1lSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzRm9udE5hbWVUZW1wLCB3c0ZvbnROYW1lVGVtcC5HZXRMZW5ndGgoKSwgVFJVRSk7DQotICAgIGludDMyX3QgaVN0YXJ0ID0gMDsNCi0gICAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfWEZBRm9udHNNYXApIC8gc2l6ZW9mKFhGQV9GT05USU5GTykgLSAxOw0KLSAgICBpbnQzMl90IGlNaWQgPSAwOw0KLSAgICBjb25zdCBYRkFfRk9OVElORk8gKnBGb250SW5mbyA9IE5VTEw7DQotICAgIGRvIHsNCi0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgRlhfRFdPUkQgZHdGb250TmFtZUhhc2ggPSBnX1hGQUZvbnRzTWFwW2lNaWRdLmR3Rm9udE5hbWVIYXNoOw0KLSAgICAgICAgaWYgKGR3Rm9udE5hbWVIYXNoID09IGR3Q3VyRm9udE5hbWVIYXNoKSB7DQotICAgICAgICAgICAgcEZvbnRJbmZvID0gJmdfWEZBRm9udHNNYXBbaU1pZF07DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9IGVsc2UgaWYgKGR3Rm9udE5hbWVIYXNoIDwgZHdDdXJGb250TmFtZUhhc2gpIHsNCi0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlIChpRW5kID49IGlTdGFydCk7DQotICAgIHJldHVybiBwRm9udEluZm87DQorY29uc3QgWEZBX0ZPTlRJTkZPKiBYRkFfR2V0Rm9udElORk9CeUZvbnROYW1lKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udE5hbWUpIHsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXyB8fCBcDQorICAgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8ICAgXA0KKyAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCAgIFwNCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb250TmFtZVRlbXAgPSB3c0ZvbnROYW1lOw0KKyAgd3NGb250TmFtZVRlbXAuUmVtb3ZlKEwnICcpOw0KKyAgRlhfRFdPUkQgZHdDdXJGb250TmFtZUhhc2ggPQ0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzRm9udE5hbWVUZW1wLCB3c0ZvbnROYW1lVGVtcC5HZXRMZW5ndGgoKSwgVFJVRSk7DQorICBpbnQzMl90IGlTdGFydCA9IDA7DQorICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19YRkFGb250c01hcCkgLyBzaXplb2YoWEZBX0ZPTlRJTkZPKSAtIDE7DQorICBpbnQzMl90IGlNaWQgPSAwOw0KKyAgY29uc3QgWEZBX0ZPTlRJTkZPKiBwRm9udEluZm8gPSBOVUxMOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgRlhfRFdPUkQgZHdGb250TmFtZUhhc2ggPSBnX1hGQUZvbnRzTWFwW2lNaWRdLmR3Rm9udE5hbWVIYXNoOw0KKyAgICBpZiAoZHdGb250TmFtZUhhc2ggPT0gZHdDdXJGb250TmFtZUhhc2gpIHsNCisgICAgICBwRm9udEluZm8gPSAmZ19YRkFGb250c01hcFtpTWlkXTsNCisgICAgICBicmVhazsNCisgICAgfSBlbHNlIGlmIChkd0ZvbnROYW1lSGFzaCA8IGR3Q3VyRm9udE5hbWVIYXNoKSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpRW5kID49IGlTdGFydCk7DQorICByZXR1cm4gcEZvbnRJbmZvOw0KICNlbHNlDQotICAgIHJldHVybiBOVUxMOw0KKyAgcmV0dXJuIE5VTEw7DQogI2VuZGlmDQogfQ0KIC8vIHN0YXRpYw0KLUlYRkFfRm9udE1nciogSVhGQV9Gb250TWdyOjpDcmVhdGVEZWZhdWx0KCkNCi17DQotICAgIHJldHVybiBGWF9ORVcgQ1hGQV9EZWZGb250TWdyOw0KK0lYRkFfRm9udE1nciogSVhGQV9Gb250TWdyOjpDcmVhdGVEZWZhdWx0KCkgew0KKyAgcmV0dXJuIEZYX05FVyBDWEZBX0RlZkZvbnRNZ3I7DQogfQ0KIC8vIHZpcnR1YWwNCi1JWEZBX0ZvbnRNZ3I6On5JWEZBX0ZvbnRNZ3IoKQ0KLXsNCi19DQotQ1hGQV9EZWZGb250TWdyOjp+Q1hGQV9EZWZGb250TWdyKCkNCi17DQotICAgIGludDMyX3QgaUNvdW50cyA9IG1fQ2FjaGVGb250cy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudHM7IGkrKykgew0KLSAgICAgICAgKChJRlhfRm9udCopbV9DYWNoZUZvbnRzW2ldKS0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIG1fQ2FjaGVGb250cy5SZW1vdmVBbGwoKTsNCitJWEZBX0ZvbnRNZ3I6On5JWEZBX0ZvbnRNZ3IoKSB7fQ0KK0NYRkFfRGVmRm9udE1ncjo6fkNYRkFfRGVmRm9udE1ncigpIHsNCisgIGludDMyX3QgaUNvdW50cyA9IG1fQ2FjaGVGb250cy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnRzOyBpKyspIHsNCisgICAgKChJRlhfRm9udCopbV9DYWNoZUZvbnRzW2ldKS0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgbV9DYWNoZUZvbnRzLlJlbW92ZUFsbCgpOw0KIH0NCiAjZGVmaW5lIF9GWEZBX1VTRUdBU0ZPTlRNR1JfDQotSUZYX0ZvbnQqIENYRkFfRGVmRm9udE1ncjo6R2V0Rm9udChJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UgKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb250TmFtZSA9IHdzRm9udEZhbWlseTsNCi0gICAgSUZYX0ZvbnRNZ3IqIHBGREVGb250TWdyID0gKChDWEZBX0ZGRG9jKiloRG9jKS0+R2V0QXBwKCktPkdldEZERUZvbnRNZ3IoKTsNCitJRlhfRm9udCogQ1hGQV9EZWZGb250TWdyOjpHZXRGb250KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb250TmFtZSA9IHdzRm9udEZhbWlseTsNCisgIElGWF9Gb250TWdyKiBwRkRFRm9udE1nciA9ICgoQ1hGQV9GRkRvYyopaERvYyktPkdldEFwcCgpLT5HZXRGREVGb250TWdyKCk7DQogI2lmZGVmIF9GWEZBX1VTRUdBU0ZPTlRNR1JfDQotICAgIGNvbnN0IFhGQV9GT05USU5GTyAqcEN1ckZvbnQgPSBOVUxMOw0KLSAgICBGWF9CT09MIGJHZXRGb250SW5mbyA9IFRSVUU7DQotICAgIElGWF9Gb250KiBwRm9udCA9IHBGREVGb250TWdyLT5Mb2FkRm9udCgoY29uc3QgRlhfV0NIQVIqKXdzRm9udE5hbWUsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgIGNvbnN0IFhGQV9GT05USU5GTyogcEN1ckZvbnQgPSBOVUxMOw0KKyAgRlhfQk9PTCBiR2V0Rm9udEluZm8gPSBUUlVFOw0KKyAgSUZYX0ZvbnQqIHBGb250ID0gcEZERUZvbnRNZ3ItPkxvYWRGb250KChjb25zdCBGWF9XQ0hBUiopd3NGb250TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQogI2Vsc2UNCi0gICAgY29uc3QgWEZBX0ZPTlRJTkZPICpwQ3VyRm9udCA9IFhGQV9HZXRGb250SU5GT0J5Rm9udE5hbWUod3NGb250TmFtZSk7DQotICAgIEZYX0JPT0wgYkdldEZvbnRJbmZvID0gRkFMU0U7DQotICAgIElGWF9Gb250KiBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udCgoY29uc3QgRlhfV0NIQVIqKXdzRm9udE5hbWUsIGR3Rm9udFN0eWxlcyB8IEZYX0ZPTlRTVFlMRV9FeGFjdE1hdGNoLCBwQ3VyRm9udCA/IHBDdXJGb250LT53Q29kZVBhZ2UgOiB3Q29kZVBhZ2UsIHBGREVGb250TWdyKTsNCisgIGNvbnN0IFhGQV9GT05USU5GTyogcEN1ckZvbnQgPSBYRkFfR2V0Rm9udElORk9CeUZvbnROYW1lKHdzRm9udE5hbWUpOw0KKyAgRlhfQk9PTCBiR2V0Rm9udEluZm8gPSBGQUxTRTsNCisgIElGWF9Gb250KiBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udCgNCisgICAgICAoY29uc3QgRlhfV0NIQVIqKXdzRm9udE5hbWUsIGR3Rm9udFN0eWxlcyB8IEZYX0ZPTlRTVFlMRV9FeGFjdE1hdGNoLA0KKyAgICAgIHBDdXJGb250ID8gcEN1ckZvbnQtPndDb2RlUGFnZSA6IHdDb2RlUGFnZSwgcEZERUZvbnRNZ3IpOw0KICNlbmRpZg0KLSAgICBpZiAoIXBGb250ICYmIGhEb2MpIHsNCi0gICAgICAgIGlmIChiR2V0Rm9udEluZm8pIHsNCi0gICAgICAgICAgICBwQ3VyRm9udCA9IFhGQV9HZXRGb250SU5GT0J5Rm9udE5hbWUod3NGb250TmFtZSk7DQorICBpZiAoIXBGb250ICYmIGhEb2MpIHsNCisgICAgaWYgKGJHZXRGb250SW5mbykgew0KKyAgICAgIHBDdXJGb250ID0gWEZBX0dldEZvbnRJTkZPQnlGb250TmFtZSh3c0ZvbnROYW1lKTsNCisgICAgfQ0KKyAgICBpZiAocEN1ckZvbnQgIT0gTlVMTCAmJiBwQ3VyRm9udC0+cFJlcGxhY2VGb250ICE9IE5VTEwpIHsNCisgICAgICBGWF9EV09SRCBkd1N0eWxlID0gMDsNCisgICAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpIHsNCisgICAgICAgIGR3U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0JvbGQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfSXRhbGljKSB7DQorICAgICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7DQorICAgICAgfQ0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwUmVwbGFjZSA9IHBDdXJGb250LT5wUmVwbGFjZUZvbnQ7DQorICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBSZXBsYWNlKTsNCisgICAgICB3aGlsZSAoaUxlbmd0aCA+IDApIHsNCisgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZVRleHQgPSBwUmVwbGFjZTsNCisgICAgICAgIHdoaWxlICgqcE5hbWVUZXh0ICE9IEwnLCcgJiYgaUxlbmd0aCA+IDApIHsNCisgICAgICAgICAgcE5hbWVUZXh0Kys7DQorICAgICAgICAgIGlMZW5ndGgtLTsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmIChwQ3VyRm9udCAhPSBOVUxMICYmIHBDdXJGb250LT5wUmVwbGFjZUZvbnQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOw0KLSAgICAgICAgICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgew0KLSAgICAgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgew0KLSAgICAgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwUmVwbGFjZSA9IHBDdXJGb250LT5wUmVwbGFjZUZvbnQ7DQotICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBSZXBsYWNlKTsNCi0gICAgICAgICAgICB3aGlsZSAoaUxlbmd0aCA+IDApIHsNCi0gICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBOYW1lVGV4dCA9IHBSZXBsYWNlOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKnBOYW1lVGV4dCAhPSBMJywnICYmIGlMZW5ndGggPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBwTmFtZVRleHQrKzsNCi0gICAgICAgICAgICAgICAgICAgIGlMZW5ndGgtLTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1JlcGxhY2UgPSBDRlhfV2lkZVN0cmluZyhwUmVwbGFjZSwgcE5hbWVUZXh0IC0gcFJlcGxhY2UpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXBsYWNlID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyhwUmVwbGFjZSwgcE5hbWVUZXh0IC0gcFJlcGxhY2UpOw0KICNpZmRlZiBfRlhGQV9VU0VHQVNGT05UTUdSXw0KLSAgICAgICAgICAgICAgICBwRm9udCA9IHBGREVGb250TWdyLT5Mb2FkRm9udCh3c1JlcGxhY2UsIGR3U3R5bGUsIHdDb2RlUGFnZSk7DQorICAgICAgICBwRm9udCA9IHBGREVGb250TWdyLT5Mb2FkRm9udCh3c1JlcGxhY2UsIGR3U3R5bGUsIHdDb2RlUGFnZSk7DQogI2Vsc2UNCi0gICAgICAgICAgICAgICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQoKGNvbnN0IEZYX1dDSEFSKil3c1JlcGxhY2UsIGR3U3R5bGUgfCBGWF9GT05UU1RZTEVfRXhhY3RNYXRjaCwgcEN1ckZvbnQtPndDb2RlUGFnZSwgcEZERUZvbnRNZ3IpOw0KKyAgICAgICAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQoKGNvbnN0IEZYX1dDSEFSKil3c1JlcGxhY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0eWxlIHwgRlhfRk9OVFNUWUxFX0V4YWN0TWF0Y2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyRm9udC0+d0NvZGVQYWdlLCBwRkRFRm9udE1ncik7DQogI2VuZGlmDQotICAgICAgICAgICAgICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpTGVuZ3RoLS07DQotICAgICAgICAgICAgICAgIHBOYW1lVGV4dCsrOw0KLSAgICAgICAgICAgICAgICBwUmVwbGFjZSA9IHBOYW1lVGV4dDsNCi0gICAgICAgICAgICB9DQorICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCisgICAgICAgIGlMZW5ndGgtLTsNCisgICAgICAgIHBOYW1lVGV4dCsrOw0KKyAgICAgICAgcFJlcGxhY2UgPSBwTmFtZVRleHQ7DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmIChwRm9udCkgew0KLSAgICAgICAgbV9DYWNoZUZvbnRzLkFkZChwRm9udCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBGb250Ow0KKyAgfQ0KKyAgaWYgKHBGb250KSB7DQorICAgIG1fQ2FjaGVGb250cy5BZGQocEZvbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KIH0NCi1JRlhfRm9udCogQ1hGQV9EZWZGb250TWdyOjpHZXREZWZhdWx0Rm9udChJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UpDQotew0KLSAgICBJRlhfRm9udE1nciogcEZERUZvbnRNZ3IgPSAoKENYRkFfRkZEb2MqKWhEb2MpLT5HZXRBcHAoKS0+R2V0RkRFRm9udE1ncigpOw0KK0lGWF9Gb250KiBDWEZBX0RlZkZvbnRNZ3I6OkdldERlZmF1bHRGb250KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSkgew0KKyAgSUZYX0ZvbnRNZ3IqIHBGREVGb250TWdyID0gKChDWEZBX0ZGRG9jKiloRG9jKS0+R2V0QXBwKCktPkdldEZERUZvbnRNZ3IoKTsNCiAjaWZkZWYgX0ZYRkFfVVNFR0FTRk9OVE1HUl8NCi0gICAgSUZYX0ZvbnQqIHBGb250ID0gcEZERUZvbnRNZ3ItPkxvYWRGb250KEwiQXJpYWwgTmFycm93IiwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgSUZYX0ZvbnQqIHBGb250ID0NCisgICAgICBwRkRFRm9udE1nci0+TG9hZEZvbnQoTCJBcmlhbCBOYXJyb3ciLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQogI2Vsc2UNCi0gICAgY29uc3QgWEZBX0ZPTlRJTkZPICpwQ3VyRm9udCA9IFhGQV9HZXRGb250SU5GT0J5Rm9udE5hbWUod3NGb250RmFtaWx5KTsNCi0gICAgSUZYX0ZvbnQqIHBGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KEwiQXJpYWwgTmFycm93IiwgZHdGb250U3R5bGVzLCBwQ3VyRm9udCA/IHBDdXJGb250LT53Q29kZVBhZ2UgOiAxMjUyLCBwRkRFRm9udE1ncik7DQorICBjb25zdCBYRkFfRk9OVElORk8qIHBDdXJGb250ID0gWEZBX0dldEZvbnRJTkZPQnlGb250TmFtZSh3c0ZvbnRGYW1pbHkpOw0KKyAgSUZYX0ZvbnQqIHBGb250ID0NCisgICAgICBJRlhfRm9udDo6TG9hZEZvbnQoTCJBcmlhbCBOYXJyb3ciLCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJGb250ID8gcEN1ckZvbnQtPndDb2RlUGFnZSA6IDEyNTIsIHBGREVGb250TWdyKTsNCiAjZW5kaWYNCi0gICAgaWYgKCFwRm9udCkNCisgIGlmICghcEZvbnQpDQogI2lmZGVmIF9GWEZBX1VTRUdBU0ZPTlRNR1JfDQotICAgICAgICBwRm9udCA9IHBGREVGb250TWdyLT5Mb2FkRm9udCgoY29uc3QgRlhfV0NIQVIqKU5VTEwsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgcEZvbnQgPQ0KKyAgICAgICAgcEZERUZvbnRNZ3ItPkxvYWRGb250KChjb25zdCBGWF9XQ0hBUiopTlVMTCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KICNlbHNlDQotICAgICAgICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udCgoY29uc3QgRlhfV0NIQVIqKU5VTEwsIGR3Rm9udFN0eWxlcywgcEN1ckZvbnQgPyBwQ3VyRm9udC0+d0NvZGVQYWdlIDogMTI1MiwgcEZERUZvbnRNZ3IpOw0KKyAgICBwRm9udCA9DQorICAgICAgICBJRlhfRm9udDo6TG9hZEZvbnQoKGNvbnN0IEZYX1dDSEFSKilOVUxMLCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1ckZvbnQgPyBwQ3VyRm9udC0+d0NvZGVQYWdlIDogMTI1MiwgcEZERUZvbnRNZ3IpOw0KICNlbmRpZg0KLSAgICBGWFNZU19hc3NlcnQocEZvbnQgIT0gTlVMTCk7DQotICAgIGlmIChwRm9udCkgew0KLSAgICAgICAgbV9DYWNoZUZvbnRzLkFkZChwRm9udCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBGb250Ow0KKyAgRlhTWVNfYXNzZXJ0KHBGb250ICE9IE5VTEwpOw0KKyAgaWYgKHBGb250KSB7DQorICAgIG1fQ2FjaGVGb250cy5BZGQocEZvbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KIH0NCiBzdHJ1Y3QgWEZBX1BERkZPTlROQU1FIHsNCi0gICAgY29uc3QgRlhfQ0hBUiogbHBQc05hbWU7DQotICAgIGNvbnN0IEZYX0NIQVIqIGxwTm9ybWFsOw0KLSAgICBjb25zdCBGWF9DSEFSKiBscEJvbGQ7DQotICAgIGNvbnN0IEZYX0NIQVIqIGxwSXRhbGljOw0KLSAgICBjb25zdCBGWF9DSEFSKiBscEJvbGRJdGFsaWM7DQorICBjb25zdCBGWF9DSEFSKiBscFBzTmFtZTsNCisgIGNvbnN0IEZYX0NIQVIqIGxwTm9ybWFsOw0KKyAgY29uc3QgRlhfQ0hBUiogbHBCb2xkOw0KKyAgY29uc3QgRlhfQ0hBUiogbHBJdGFsaWM7DQorICBjb25zdCBGWF9DSEFSKiBscEJvbGRJdGFsaWM7DQogfTsNCiBjb25zdCBYRkFfUERGRk9OVE5BTUUgZ19YRkFQREZGb250TmFtZVtdID0gew0KICAgICB7IkFkb2JlIFBJIFN0ZCIsICJBZG9iZVBJU3RkIiwgIkFkb2JlUElTdGQiLCAiQWRvYmVQSVN0ZCIsICJBZG9iZVBJU3RkIn0sDQotICAgIHsiTXlyaWFkIFBybyBMaWdodCIsICJNeXJpYWRQcm8tTGlnaHQiLCAiTXlyaWFkUHJvLVNlbWlib2xkIiwgIk15cmlhZFByby1MaWdodEl0IiwgIk15cmlhZFByby1TZW1pYm9sZEl0In0sDQorICAgIHsiTXlyaWFkIFBybyBMaWdodCIsICJNeXJpYWRQcm8tTGlnaHQiLCAiTXlyaWFkUHJvLVNlbWlib2xkIiwNCisgICAgICJNeXJpYWRQcm8tTGlnaHRJdCIsICJNeXJpYWRQcm8tU2VtaWJvbGRJdCJ9LA0KIH07DQotQ1hGQV9QREZGb250TWdyOjpDWEZBX1BERkZvbnRNZ3IoQ1hGQV9GRkRvYyogcERvYykNCi17DQotICAgIG1fcERvYyA9IHBEb2M7DQorQ1hGQV9QREZGb250TWdyOjpDWEZBX1BERkZvbnRNZ3IoQ1hGQV9GRkRvYyogcERvYykgew0KKyAgbV9wRG9jID0gcERvYzsNCiB9DQotQ1hGQV9QREZGb250TWdyOjp+Q1hGQV9QREZGb250TWdyKCkNCi17DQotICAgIEZYX1BPU0lUSU9OIHBzID0gbV9GREUyUERGRm9udC5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIHdoaWxlIChwcykgew0KLSAgICAgICAgSUZYX0ZvbnQqIHBGREVGb250Ow0KLSAgICAgICAgdm9pZCogcFBERkZvbnQ7DQotICAgICAgICBtX0ZERTJQREZGb250LkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwRkRFRm9udCwgcFBERkZvbnQpOw0KLSAgICAgICAgcEZERUZvbnQtPlNldEZvbnRQcm92aWRlcihOVUxMKTsNCi0gICAgfQ0KLSAgICBtX0ZERTJQREZGb250LlJlbW92ZUFsbCgpOw0KLSAgICBwcyA9IG1fRm9udEFycmF5LkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBzKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHJLZXk7DQotICAgICAgICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KLSAgICAgICAgbV9Gb250QXJyYXkuR2V0TmV4dEFzc29jKHBzLCBzdHJLZXksICh2b2lkKiYpcEZvbnQpOw0KLSAgICAgICAgaWYgKHBGb250ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBwRm9udC0+UmVsZWFzZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fRm9udEFycmF5LlJlbW92ZUFsbCgpOw0KLX0NCi1JRlhfRm9udCogQ1hGQV9QREZGb250TWdyOjpGaW5kRm9udChDRlhfQnl0ZVN0cmluZyBzdHJQc05hbWUsIEZYX0JPT0wgYkJvbGQsIEZYX0JPT0wgYkl0YWxpYywgQ1BERl9Gb250KiogcERzdFBERkZvbnQsIEZYX0JPT0wgYlN0cmljdE1hdGNoKQ0KLXsNCi0gICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IG1fcERvYy0+R2V0UERGRG9jKCk7DQotICAgIGlmIChwRG9jID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRTZXREaWN0ID0gcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0KEZYX0JTVFJDKCJBY3JvRm9ybSIpKS0+R2V0RGljdChGWF9CU1RSQygiRFIiKSk7DQotICAgIGlmICghcEZvbnRTZXREaWN0KSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBwRm9udFNldERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRm9udFNldERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkZvbnQiKSk7DQotICAgIGlmICghcEZvbnRTZXREaWN0KSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBzdHJQc05hbWUuUmVtb3ZlKCcgJyk7DQotICAgIElGWF9Gb250TWdyKiBwRkRFRm9udE1nciA9IG1fcERvYy0+R2V0QXBwKCktPkdldEZERUZvbnRNZ3IoKTsNCi0gICAgRlhfUE9TSVRJT04gcG9zID0gcEZvbnRTZXREaWN0LT5HZXRTdGFydFBvcygpOw0KLSAgICB3aGlsZSAocG9zKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXk7DQotICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBGb250U2V0RGljdC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOw0KLSAgICAgICAgaWYgKCFQc05hbWVNYXRjaERSRm9udE5hbWUoc3RyUHNOYW1lLCBiQm9sZCwgYkl0YWxpYywga2V5LCBiU3RyaWN0TWF0Y2gpKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOw0KLSAgICAgICAgaWYgKHBEaXJlY3QgPT0gTlVMTCB8fCBwRGlyZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gKENQREZfRGljdGlvbmFyeSopcERpcmVjdDsNCi0gICAgICAgIGlmIChwRm9udERpY3QtPkdldFN0cmluZygiVHlwZSIpICE9IEZYX0JTVFJDKCJGb250IikpIHsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIENQREZfRm9udCogcFBERkZvbnQgPSBwRG9jLT5Mb2FkRm9udChwRm9udERpY3QpOw0KLSAgICAgICAgaWYgKCFwUERGRm9udCkgew0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFwUERGRm9udC0+SXNFbWJlZGRlZCgpKSB7DQotICAgICAgICAgICAgKnBEc3RQREZGb250ID0gcFBERkZvbnQ7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gSUZYX0ZvbnQ6OkxvYWRGb250KCZwUERGRm9udC0+bV9Gb250LCBwRkRFRm9udE1ncik7DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUlGWF9Gb250KiBDWEZBX1BERkZvbnRNZ3I6OkdldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgQ1BERl9Gb250KiogcFBERkZvbnQsIEZYX0JPT0wgYlN0cmljdE1hdGNoICkNCi17DQotICAgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0ZvbnRGYW1pbHkuR2V0UHRyKCksIHdzRm9udEZhbWlseS5HZXRMZW5ndGgoKSk7DQorQ1hGQV9QREZGb250TWdyOjp+Q1hGQV9QREZGb250TWdyKCkgew0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX0ZERTJQREZGb250LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICBJRlhfRm9udCogcEZERUZvbnQ7DQorICAgIHZvaWQqIHBQREZGb250Ow0KKyAgICBtX0ZERTJQREZGb250LkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwRkRFRm9udCwgcFBERkZvbnQpOw0KKyAgICBwRkRFRm9udC0+U2V0Rm9udFByb3ZpZGVyKE5VTEwpOw0KKyAgfQ0KKyAgbV9GREUyUERGRm9udC5SZW1vdmVBbGwoKTsNCisgIHBzID0gbV9Gb250QXJyYXkuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQogICAgIENGWF9CeXRlU3RyaW5nIHN0cktleTsNCiAgICAgSUZYX0ZvbnQqIHBGb250ID0gTlVMTDsNCi0gICAgc3RyS2V5LkZvcm1hdCgiJXUldSIsIGR3SGFzaENvZGUsIGR3Rm9udFN0eWxlcyk7DQotICAgIGlmIChtX0ZvbnRBcnJheS5Mb29rdXAoc3RyS2V5LCAodm9pZComKXBGb250KSkgew0KLSAgICAgICAgcmV0dXJuIHBGb250Ow0KKyAgICBtX0ZvbnRBcnJheS5HZXROZXh0QXNzb2MocHMsIHN0cktleSwgKHZvaWQqJilwRm9udCk7DQorICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCiAgICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZyBic1BzTmFtZTsNCi0gICAgYnNQc05hbWUgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUod3NGb250RmFtaWx5KTsNCi0gICAgRlhfQk9PTCBiQm9sZCA9IChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgPT0gRlhfRk9OVFNUWUxFX0JvbGQ7DQotICAgIEZYX0JPT0wgYkl0YWxpYyA9IChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfSXRhbGljKSA9PSBGWF9GT05UU1RZTEVfSXRhbGljOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBzdHJGb250TmFtZSA9IFBzTmFtZVRvRm9udE5hbWUoYnNQc05hbWUsIGJCb2xkLCBiSXRhbGljKTsNCi0gICAgcEZvbnQgPSBGaW5kRm9udChzdHJGb250TmFtZSwgYkJvbGQsIGJJdGFsaWMsIHBQREZGb250LCBiU3RyaWN0TWF0Y2gpOw0KLSAgICBpZiAocEZvbnQpIHsNCi0gICAgICAgIG1fRm9udEFycmF5LlNldEF0KHN0cktleSwgcEZvbnQpOw0KLSAgICB9DQotICAgIHJldHVybiBwRm9udDsNCisgIH0NCisgIG1fRm9udEFycmF5LlJlbW92ZUFsbCgpOw0KIH0NCi1DRlhfQnl0ZVN0cmluZyBDWEZBX1BERkZvbnRNZ3I6OlBzTmFtZVRvRm9udE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0clBzTmFtZSwNCi0gICAgICAgIEZYX0JPT0wgYkJvbGQsIEZYX0JPT0wgYkl0YWxpYykNCi17DQotICAgIGludDMyX3QgbkNvdW50ID0gc2l6ZW9mKGdfWEZBUERGRm9udE5hbWUpIC8gc2l6ZW9mKFhGQV9QREZGT05UTkFNRSk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQotICAgICAgICBpZiAoc3RyUHNOYW1lID09IGdfWEZBUERGRm9udE5hbWVbaV0ubHBQc05hbWUpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gMSArICgoYkl0YWxpYyA8PCAxKSB8IGJCb2xkKTsNCi0gICAgICAgICAgICByZXR1cm4gKigmZ19YRkFQREZGb250TmFtZVtpXS5scFBzTmFtZSArIGluZGV4KTsNCi0gICAgICAgIH0NCitJRlhfRm9udCogQ1hGQV9QREZGb250TWdyOjpGaW5kRm9udChDRlhfQnl0ZVN0cmluZyBzdHJQc05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQm9sZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiogcERzdFBERkZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RyaWN0TWF0Y2gpIHsNCisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBtX3BEb2MtPkdldFBERkRvYygpOw0KKyAgaWYgKHBEb2MgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENQREZfRGljdGlvbmFyeSogcEZvbnRTZXREaWN0ID0NCisgICAgICBwRG9jLT5HZXRSb290KCktPkdldERpY3QoRlhfQlNUUkMoIkFjcm9Gb3JtIikpLT5HZXREaWN0KEZYX0JTVFJDKCJEUiIpKTsNCisgIGlmICghcEZvbnRTZXREaWN0KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcEZvbnRTZXREaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEZvbnRTZXREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGb250IikpOw0KKyAgaWYgKCFwRm9udFNldERpY3QpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBzdHJQc05hbWUuUmVtb3ZlKCcgJyk7DQorICBJRlhfRm9udE1nciogcEZERUZvbnRNZ3IgPSBtX3BEb2MtPkdldEFwcCgpLT5HZXRGREVGb250TWdyKCk7DQorICBGWF9QT1NJVElPTiBwb3MgPSBwRm9udFNldERpY3QtPkdldFN0YXJ0UG9zKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGtleTsNCisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwRm9udFNldERpY3QtPkdldE5leHRFbGVtZW50KHBvcywga2V5KTsNCisgICAgaWYgKCFQc05hbWVNYXRjaERSRm9udE5hbWUoc3RyUHNOYW1lLCBiQm9sZCwgYkl0YWxpYywga2V5LCBiU3RyaWN0TWF0Y2gpKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgcmV0dXJuIHN0clBzTmFtZTsNCi19DQotRlhfQk9PTCBDWEZBX1BERkZvbnRNZ3I6OlBzTmFtZU1hdGNoRFJGb250TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUHNOYW1lLCBGWF9CT09MIGJCb2xkLCBGWF9CT09MIGJJdGFsaWMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic0RSRm9udE5hbWUsIEZYX0JPT0wgYlN0cmljdE1hdGNoKQ0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNEUk5hbWUgPSBic0RSRm9udE5hbWU7DQotICAgIGJzRFJOYW1lLlJlbW92ZSgnLScpOw0KLSAgICBpbnQzMl90IGlQc0xlbiA9IGJzUHNOYW1lLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IG5JbmRleCA9IGJzRFJOYW1lLkZpbmQoYnNQc05hbWUpOw0KLSAgICBpZiAobkluZGV4ICE9IC0xICYmICFiU3RyaWN0TWF0Y2gpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KKyAgICBDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOw0KKyAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KICAgICB9DQotICAgIGlmIChuSW5kZXggIT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBEaXJlY3Q7DQorICAgIGlmIChwRm9udERpY3QtPkdldFN0cmluZygiVHlwZSIpICE9IEZYX0JTVFJDKCJGb250IikpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICBpbnQzMl90IGlEaWZmZXJMZW5ndGggPSBic0RSTmFtZS5HZXRMZW5ndGgoKSAtIGlQc0xlbjsNCi0gICAgaWYgKGlEaWZmZXJMZW5ndGggPiAxIHx8IChiQm9sZCB8fCBiSXRhbGljKSkgew0KLSAgICAgICAgaW50MzJfdCBpQm9sZEluZGV4ID0gYnNEUk5hbWUuRmluZChGWF9CU1RSQygiQm9sZCIpKTsNCi0gICAgICAgIEZYX0JPT0wgYkJvbGRGb250ID0gaUJvbGRJbmRleCA+IDA7DQotICAgICAgICBpZiAoYkJvbGQgXiBiQm9sZEZvbnQpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYkJvbGRGb250KSB7DQotICAgICAgICAgICAgaURpZmZlckxlbmd0aCA9IEZYX01JTihpRGlmZmVyTGVuZ3RoIC0gNCwgYnNEUk5hbWUuR2V0TGVuZ3RoKCkgLSBpQm9sZEluZGV4IC0gNCk7DQotICAgICAgICB9DQotICAgICAgICBGWF9CT09MIGJJdGFsaWNGb250ID0gVFJVRTsNCi0gICAgICAgIGlmIChic0RSTmFtZS5GaW5kKEZYX0JTVFJDKCJJdGFsaWMiKSkgPiAwKSB7DQotICAgICAgICAgICAgaURpZmZlckxlbmd0aCAtPSA2Ow0KLSAgICAgICAgfSBlbHNlIGlmIChic0RSTmFtZS5GaW5kKEZYX0JTVFJDKCJJdCIpKSA+IDApIHsNCi0gICAgICAgICAgICBpRGlmZmVyTGVuZ3RoIC09IDI7DQotICAgICAgICB9IGVsc2UgaWYgKGJzRFJOYW1lLkZpbmQoRlhfQlNUUkMoIk9ibGlxdWUiKSkgPiAwKSB7DQotICAgICAgICAgICAgaURpZmZlckxlbmd0aCAtPSA3Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBiSXRhbGljRm9udCA9IEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJJdGFsaWMgXiBiSXRhbGljRm9udCkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpRGlmZmVyTGVuZ3RoID4gMSkgew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRFJUYWlsZXIgPSBic0RSTmFtZS5SaWdodChpRGlmZmVyTGVuZ3RoKTsNCi0gICAgICAgICAgICBpZiAoYnNEUlRhaWxlci5FcXVhbChGWF9CU1RSQygiTVQiKSkgfHwgYnNEUlRhaWxlci5FcXVhbChGWF9CU1RSQygiUFNNVCIpKSB8fCBic0RSVGFpbGVyLkVxdWFsKEZYX0JTVFJDKCJSZWd1bGFyIikpIHx8IGJzRFJUYWlsZXIuRXF1YWwoRlhfQlNUUkMoIlJlZyIpKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGJCb2xkRm9udCB8fCBiSXRhbGljRm9udCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYX0JPT0wgYk1hdGNoID0gRkFMU0U7DQotICAgICAgICAgICAgc3dpdGNoIChic1BzTmFtZS5HZXRBdChpUHNMZW4gLSAxKSkgew0KLSAgICAgICAgICAgICAgICBjYXNlICdMJzogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChic0RSTmFtZS5SaWdodCg1KS5FcXVhbChGWF9CU1RSQygiTGlnaHQiKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1hdGNoID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnUic6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGJzRFJOYW1lLlJpZ2h0KDcpLkVxdWFsKEZYX0JTVFJDKCJSZWd1bGFyIikpIHx8IGJzRFJOYW1lLlJpZ2h0KDMpLkVxdWFsKEZYX0JTVFJDKCJSZWciKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1hdGNoID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnTSc6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnNEUk5hbWUuUmlnaHQoNSkuRXF1YWwoRlhfQlNUUkMoIk1lZGl1bSIpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF0Y2ggPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBiTWF0Y2g7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9QREZGb250TWdyOjpHZXRDaGFyV2lkdGgoSUZYX0ZvbnQqIHBGb250LCBGWF9XQ0hBUiB3VW5pY29kZSwgaW50MzJfdCAmaVdpZHRoLCBGWF9CT09MIGJDaGFyQ29kZSkNCi17DQotICAgIGlmICh3VW5pY29kZSAhPSAweDIwIHx8IGJDaGFyQ29kZSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENQREZfRm9udCogcFBERkZvbnQgPSAoQ1BERl9Gb250KiltX0ZERTJQREZGb250LkdldFZhbHVlQXQocEZvbnQpOw0KKyAgICBDUERGX0ZvbnQqIHBQREZGb250ID0gcERvYy0+TG9hZEZvbnQocEZvbnREaWN0KTsNCiAgICAgaWYgKCFwUERGRm9udCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIHJldHVybiBOVUxMOw0KICAgICB9DQotICAgIHdVbmljb2RlID0gKEZYX1dDSEFSKXBQREZGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdVbmljb2RlKTsNCi0gICAgaVdpZHRoID0gcFBERkZvbnQtPkdldENoYXJXaWR0aEYod1VuaWNvZGUpOw0KLSAgICByZXR1cm4gVFJVRTsNCisgICAgaWYgKCFwUERGRm9udC0+SXNFbWJlZGRlZCgpKSB7DQorICAgICAgKnBEc3RQREZGb250ID0gcFBERkZvbnQ7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIElGWF9Gb250OjpMb2FkRm9udCgmcFBERkZvbnQtPm1fRm9udCwgcEZERUZvbnRNZ3IpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLUNYRkFfRm9udE1ncjo6Q1hGQV9Gb250TWdyKCkNCi0gICAgOiBtX3BEZWZGb250TWdyKE5VTEwpDQotew0KLX0NCi1DWEZBX0ZvbnRNZ3I6On5DWEZBX0ZvbnRNZ3IoKQ0KLXsNCi0gICAgRGVsQWxsTWdyTWFwKCk7DQotfQ0KLUlGWF9Gb250KiBDWEZBX0ZvbnRNZ3I6OkdldEZvbnQoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSApDQotew0KLSAgICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0ZvbnRGYW1pbHkuR2V0UHRyKCksIHdzRm9udEZhbWlseS5HZXRMZW5ndGgoKSwgRkFMU0UpOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBic0tleTsNCi0gICAgYnNLZXkuRm9ybWF0KCIldSV1JXUiLCBkd0hhc2gsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCi0gICAgSUZYX0ZvbnQqIHBGb250ID0gTlVMTDsNCi0gICAgaWYgKG1fRm9udEFycmF5Lkxvb2t1cChic0tleSwgKHZvaWQqJilwRm9udCkpIHsNCi0gICAgICAgIHJldHVybiBwRm9udDsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0VuZ2xpc2hOYW1lOw0KLSAgICBYRkFfTG9jYWxGb250TmFtZVRvRW5nbGlzaE5hbWUod3NGb250RmFtaWx5LCB3c0VuZ2xpc2hOYW1lKTsNCi0gICAgQ1hGQV9QREZGb250TWdyKiBwTWdyID0gKENYRkFfUERGRm9udE1nciopbV9QREZGb250TWdyQXJyYXkuR2V0VmFsdWVBdChoRG9jKTsNCi0gICAgQ1BERl9Gb250KiBwUERGRm9udCA9IE5VTEw7DQotICAgIGlmIChwTWdyICE9IE5VTEwpIHsNCi0gICAgICAgIHBGb250ID0gcE1nci0+R2V0Rm9udCh3c0VuZ2xpc2hOYW1lLCBkd0ZvbnRTdHlsZXMsICZwUERGRm9udCk7DQotICAgICAgICBpZiAocEZvbnQpIHsNCi0gICAgICAgICAgICByZXR1cm4gcEZvbnQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBGb250ID09IE5VTEwgJiYgbV9wRGVmRm9udE1nciAhPSBOVUxMKSB7DQotICAgICAgICBwRm9udCA9IG1fcERlZkZvbnRNZ3ItPkdldEZvbnQoaERvYywgd3NGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQotICAgIH0NCi0gICAgaWYgKHBGb250ID09IE5VTEwgJiYgcE1nciAhPSBOVUxMKSB7DQotICAgICAgICBwUERGRm9udCA9IE5VTEw7DQotICAgICAgICBwRm9udCA9IHBNZ3ItPkdldEZvbnQod3NFbmdsaXNoTmFtZSwgZHdGb250U3R5bGVzLCAmcFBERkZvbnQsIEZBTFNFKTsNCi0gICAgICAgIGlmIChwRm9udCkgew0KLSAgICAgICAgICAgIHJldHVybiBwRm9udDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAocEZvbnQgPT0gTlVMTCAmJiBtX3BEZWZGb250TWdyICE9IE5VTEwpIHsNCi0gICAgICAgIHBGb250ID0gbV9wRGVmRm9udE1nci0+R2V0RGVmYXVsdEZvbnQoaERvYywgd3NGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQotICAgIH0NCi0gICAgRlhTWVNfYXNzZXJ0KHBGb250ICE9IE5VTEwpOw0KLSAgICBpZiAocEZvbnQpIHsNCi0gICAgICAgIGlmIChwUERGRm9udCkgew0KLSAgICAgICAgICAgIHBNZ3ItPm1fRkRFMlBERkZvbnQuU2V0QXQocEZvbnQsIHBQREZGb250KTsNCi0gICAgICAgICAgICBwRm9udC0+U2V0Rm9udFByb3ZpZGVyKHBNZ3IpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9Gb250QXJyYXkuU2V0QXQoYnNLZXksIHBGb250KTsNCi0gICAgfQ0KK0lGWF9Gb250KiBDWEZBX1BERkZvbnRNZ3I6OkdldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqKiBwUERGRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cmljdE1hdGNoKSB7DQorICBGWF9EV09SRCBkd0hhc2hDb2RlID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0ZvbnRGYW1pbHkuR2V0UHRyKCksIHdzRm9udEZhbWlseS5HZXRMZW5ndGgoKSk7DQorICBDRlhfQnl0ZVN0cmluZyBzdHJLZXk7DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgc3RyS2V5LkZvcm1hdCgiJXUldSIsIGR3SGFzaENvZGUsIGR3Rm9udFN0eWxlcyk7DQorICBpZiAobV9Gb250QXJyYXkuTG9va3VwKHN0cktleSwgKHZvaWQqJilwRm9udCkpIHsNCiAgICAgcmV0dXJuIHBGb250Ow0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNQc05hbWU7DQorICBic1BzTmFtZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c0ZvbnRGYW1pbHkpOw0KKyAgRlhfQk9PTCBiQm9sZCA9IChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgPT0gRlhfRk9OVFNUWUxFX0JvbGQ7DQorICBGWF9CT09MIGJJdGFsaWMgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgPT0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCisgIENGWF9CeXRlU3RyaW5nIHN0ckZvbnROYW1lID0gUHNOYW1lVG9Gb250TmFtZShic1BzTmFtZSwgYkJvbGQsIGJJdGFsaWMpOw0KKyAgcEZvbnQgPSBGaW5kRm9udChzdHJGb250TmFtZSwgYkJvbGQsIGJJdGFsaWMsIHBQREZGb250LCBiU3RyaWN0TWF0Y2gpOw0KKyAgaWYgKHBGb250KSB7DQorICAgIG1fRm9udEFycmF5LlNldEF0KHN0cktleSwgcEZvbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KIH0NCi12b2lkIENYRkFfRm9udE1ncjo6TG9hZERvY0ZvbnRzKElYRkFfRG9jKiBoRG9jKQ0KLXsNCi0gICAgaWYgKCFtX1BERkZvbnRNZ3JBcnJheS5HZXRWYWx1ZUF0KGhEb2MpKSB7DQotICAgICAgICBtX1BERkZvbnRNZ3JBcnJheS5TZXRBdChoRG9jLCBGWF9ORVcgQ1hGQV9QREZGb250TWdyKChDWEZBX0ZGRG9jKiloRG9jKSk7DQorQ0ZYX0J5dGVTdHJpbmcgQ1hGQV9QREZGb250TWdyOjpQc05hbWVUb0ZvbnROYW1lKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyUHNOYW1lLA0KKyAgICBGWF9CT09MIGJCb2xkLA0KKyAgICBGWF9CT09MIGJJdGFsaWMpIHsNCisgIGludDMyX3QgbkNvdW50ID0gc2l6ZW9mKGdfWEZBUERGRm9udE5hbWUpIC8gc2l6ZW9mKFhGQV9QREZGT05UTkFNRSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBpZiAoc3RyUHNOYW1lID09IGdfWEZBUERGRm9udE5hbWVbaV0ubHBQc05hbWUpIHsNCisgICAgICBpbnQzMl90IGluZGV4ID0gMSArICgoYkl0YWxpYyA8PCAxKSB8IGJCb2xkKTsNCisgICAgICByZXR1cm4gKigmZ19YRkFQREZGb250TmFtZVtpXS5scFBzTmFtZSArIGluZGV4KTsNCiAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHN0clBzTmFtZTsNCiB9DQotdm9pZCBDWEZBX0ZvbnRNZ3I6OlJlbGVhc2VEb2NGb250cyhJWEZBX0RvYyogaERvYykNCi17DQorRlhfQk9PTCBDWEZBX1BERkZvbnRNZ3I6OlBzTmFtZU1hdGNoRFJGb250TmFtZSgNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1BzTmFtZSwNCisgICAgRlhfQk9PTCBiQm9sZCwNCisgICAgRlhfQk9PTCBiSXRhbGljLA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNEUkZvbnROYW1lLA0KKyAgICBGWF9CT09MIGJTdHJpY3RNYXRjaCkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNEUk5hbWUgPSBic0RSRm9udE5hbWU7DQorICBic0RSTmFtZS5SZW1vdmUoJy0nKTsNCisgIGludDMyX3QgaVBzTGVuID0gYnNQc05hbWUuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IG5JbmRleCA9IGJzRFJOYW1lLkZpbmQoYnNQc05hbWUpOw0KKyAgaWYgKG5JbmRleCAhPSAtMSAmJiAhYlN0cmljdE1hdGNoKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKG5JbmRleCAhPSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgaURpZmZlckxlbmd0aCA9IGJzRFJOYW1lLkdldExlbmd0aCgpIC0gaVBzTGVuOw0KKyAgaWYgKGlEaWZmZXJMZW5ndGggPiAxIHx8IChiQm9sZCB8fCBiSXRhbGljKSkgew0KKyAgICBpbnQzMl90IGlCb2xkSW5kZXggPSBic0RSTmFtZS5GaW5kKEZYX0JTVFJDKCJCb2xkIikpOw0KKyAgICBGWF9CT09MIGJCb2xkRm9udCA9IGlCb2xkSW5kZXggPiAwOw0KKyAgICBpZiAoYkJvbGQgXiBiQm9sZEZvbnQpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKGJCb2xkRm9udCkgew0KKyAgICAgIGlEaWZmZXJMZW5ndGggPQ0KKyAgICAgICAgICBGWF9NSU4oaURpZmZlckxlbmd0aCAtIDQsIGJzRFJOYW1lLkdldExlbmd0aCgpIC0gaUJvbGRJbmRleCAtIDQpOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYkl0YWxpY0ZvbnQgPSBUUlVFOw0KKyAgICBpZiAoYnNEUk5hbWUuRmluZChGWF9CU1RSQygiSXRhbGljIikpID4gMCkgew0KKyAgICAgIGlEaWZmZXJMZW5ndGggLT0gNjsNCisgICAgfSBlbHNlIGlmIChic0RSTmFtZS5GaW5kKEZYX0JTVFJDKCJJdCIpKSA+IDApIHsNCisgICAgICBpRGlmZmVyTGVuZ3RoIC09IDI7DQorICAgIH0gZWxzZSBpZiAoYnNEUk5hbWUuRmluZChGWF9CU1RSQygiT2JsaXF1ZSIpKSA+IDApIHsNCisgICAgICBpRGlmZmVyTGVuZ3RoIC09IDc7DQorICAgIH0gZWxzZSB7DQorICAgICAgYkl0YWxpY0ZvbnQgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoYkl0YWxpYyBeIGJJdGFsaWNGb250KSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChpRGlmZmVyTGVuZ3RoID4gMSkgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzRFJUYWlsZXIgPSBic0RSTmFtZS5SaWdodChpRGlmZmVyTGVuZ3RoKTsNCisgICAgICBpZiAoYnNEUlRhaWxlci5FcXVhbChGWF9CU1RSQygiTVQiKSkgfHwNCisgICAgICAgICAgYnNEUlRhaWxlci5FcXVhbChGWF9CU1RSQygiUFNNVCIpKSB8fA0KKyAgICAgICAgICBic0RSVGFpbGVyLkVxdWFsKEZYX0JTVFJDKCJSZWd1bGFyIikpIHx8DQorICAgICAgICAgIGJzRFJUYWlsZXIuRXF1YWwoRlhfQlNUUkMoIlJlZyIpKSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGlmIChiQm9sZEZvbnQgfHwgYkl0YWxpY0ZvbnQpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgRlhfQk9PTCBiTWF0Y2ggPSBGQUxTRTsNCisgICAgICBzd2l0Y2ggKGJzUHNOYW1lLkdldEF0KGlQc0xlbiAtIDEpKSB7DQorICAgICAgICBjYXNlICdMJzogew0KKyAgICAgICAgICBpZiAoYnNEUk5hbWUuUmlnaHQoNSkuRXF1YWwoRlhfQlNUUkMoIkxpZ2h0IikpKSB7DQorICAgICAgICAgICAgYk1hdGNoID0gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgJ1InOiB7DQorICAgICAgICAgIGlmIChic0RSTmFtZS5SaWdodCg3KS5FcXVhbChGWF9CU1RSQygiUmVndWxhciIpKSB8fA0KKyAgICAgICAgICAgICAgYnNEUk5hbWUuUmlnaHQoMykuRXF1YWwoRlhfQlNUUkMoIlJlZyIpKSkgew0KKyAgICAgICAgICAgIGJNYXRjaCA9IFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICdNJzogew0KKyAgICAgICAgICBpZiAoYnNEUk5hbWUuUmlnaHQoNSkuRXF1YWwoRlhfQlNUUkMoIk1lZGl1bSIpKSkgew0KKyAgICAgICAgICAgIGJNYXRjaCA9IFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgcmV0dXJuIGJNYXRjaDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QREZGb250TWdyOjpHZXRDaGFyV2lkdGgoSUZYX0ZvbnQqIHBGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSkgew0KKyAgaWYgKHdVbmljb2RlICE9IDB4MjAgfHwgYkNoYXJDb2RlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENQREZfRm9udCogcFBERkZvbnQgPSAoQ1BERl9Gb250KiltX0ZERTJQREZGb250LkdldFZhbHVlQXQocEZvbnQpOw0KKyAgaWYgKCFwUERGRm9udCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3VW5pY29kZSA9IChGWF9XQ0hBUilwUERGRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3VW5pY29kZSk7DQorICBpV2lkdGggPSBwUERGRm9udC0+R2V0Q2hhcldpZHRoRih3VW5pY29kZSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorQ1hGQV9Gb250TWdyOjpDWEZBX0ZvbnRNZ3IoKSA6IG1fcERlZkZvbnRNZ3IoTlVMTCkge30NCitDWEZBX0ZvbnRNZ3I6On5DWEZBX0ZvbnRNZ3IoKSB7DQorICBEZWxBbGxNZ3JNYXAoKTsNCit9DQorSUZYX0ZvbnQqIENYRkFfRm9udE1ncjo6R2V0Rm9udChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgIEZYX0RXT1JEIGR3SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzRm9udEZhbWlseS5HZXRQdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRm9udEZhbWlseS5HZXRMZW5ndGgoKSwgRkFMU0UpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNLZXk7DQorICBic0tleS5Gb3JtYXQoIiV1JXUldSIsIGR3SGFzaCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgSUZYX0ZvbnQqIHBGb250ID0gTlVMTDsNCisgIGlmIChtX0ZvbnRBcnJheS5Mb29rdXAoYnNLZXksICh2b2lkKiYpcEZvbnQpKSB7DQorICAgIHJldHVybiBwRm9udDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRW5nbGlzaE5hbWU7DQorICBYRkFfTG9jYWxGb250TmFtZVRvRW5nbGlzaE5hbWUod3NGb250RmFtaWx5LCB3c0VuZ2xpc2hOYW1lKTsNCisgIENYRkFfUERGRm9udE1nciogcE1nciA9IChDWEZBX1BERkZvbnRNZ3IqKW1fUERGRm9udE1nckFycmF5LkdldFZhbHVlQXQoaERvYyk7DQorICBDUERGX0ZvbnQqIHBQREZGb250ID0gTlVMTDsNCisgIGlmIChwTWdyICE9IE5VTEwpIHsNCisgICAgcEZvbnQgPSBwTWdyLT5HZXRGb250KHdzRW5nbGlzaE5hbWUsIGR3Rm9udFN0eWxlcywgJnBQREZGb250KTsNCisgICAgaWYgKHBGb250KSB7DQorICAgICAgcmV0dXJuIHBGb250Ow0KKyAgICB9DQorICB9DQorICBpZiAocEZvbnQgPT0gTlVMTCAmJiBtX3BEZWZGb250TWdyICE9IE5VTEwpIHsNCisgICAgcEZvbnQgPSBtX3BEZWZGb250TWdyLT5HZXRGb250KGhEb2MsIHdzRm9udEZhbWlseSwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgfQ0KKyAgaWYgKHBGb250ID09IE5VTEwgJiYgcE1nciAhPSBOVUxMKSB7DQorICAgIHBQREZGb250ID0gTlVMTDsNCisgICAgcEZvbnQgPSBwTWdyLT5HZXRGb250KHdzRW5nbGlzaE5hbWUsIGR3Rm9udFN0eWxlcywgJnBQREZGb250LCBGQUxTRSk7DQorICAgIGlmIChwRm9udCkgew0KKyAgICAgIHJldHVybiBwRm9udDsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBGb250ID09IE5VTEwgJiYgbV9wRGVmRm9udE1nciAhPSBOVUxMKSB7DQorICAgIHBGb250ID0gbV9wRGVmRm9udE1nci0+R2V0RGVmYXVsdEZvbnQoaERvYywgd3NGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0NvZGVQYWdlKTsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChwRm9udCAhPSBOVUxMKTsNCisgIGlmIChwRm9udCkgew0KKyAgICBpZiAocFBERkZvbnQpIHsNCisgICAgICBwTWdyLT5tX0ZERTJQREZGb250LlNldEF0KHBGb250LCBwUERGRm9udCk7DQorICAgICAgcEZvbnQtPlNldEZvbnRQcm92aWRlcihwTWdyKTsNCisgICAgfQ0KKyAgICBtX0ZvbnRBcnJheS5TZXRBdChic0tleSwgcEZvbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KK30NCit2b2lkIENYRkFfRm9udE1ncjo6TG9hZERvY0ZvbnRzKElYRkFfRG9jKiBoRG9jKSB7DQorICBpZiAoIW1fUERGRm9udE1nckFycmF5LkdldFZhbHVlQXQoaERvYykpIHsNCisgICAgbV9QREZGb250TWdyQXJyYXkuU2V0QXQoaERvYywgRlhfTkVXIENYRkFfUERGRm9udE1ncigoQ1hGQV9GRkRvYyopaERvYykpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRm9udE1ncjo6UmVsZWFzZURvY0ZvbnRzKElYRkFfRG9jKiBoRG9jKSB7DQorICBDWEZBX1BERkZvbnRNZ3IqIHBNZ3IgPSBOVUxMOw0KKyAgaWYgKG1fUERGRm9udE1nckFycmF5Lkxvb2t1cChoRG9jLCAodm9pZComKXBNZ3IpKSB7DQorICAgIGlmIChwTWdyICE9IE5VTEwpIHsNCisgICAgICBkZWxldGUgcE1ncjsNCisgICAgfQ0KKyAgICBtX1BERkZvbnRNZ3JBcnJheS5SZW1vdmVLZXkoaERvYyk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Gb250TWdyOjpEZWxBbGxNZ3JNYXAoKSB7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fUERGRm9udE1nckFycmF5LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICBJWEZBX0RvYyogaERvYyA9IE5VTEw7DQogICAgIENYRkFfUERGRm9udE1nciogcE1nciA9IE5VTEw7DQotICAgIGlmIChtX1BERkZvbnRNZ3JBcnJheS5Mb29rdXAoaERvYywgKHZvaWQqJilwTWdyKSkgew0KLSAgICAgICAgaWYgKHBNZ3IgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBwTWdyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9QREZGb250TWdyQXJyYXkuUmVtb3ZlS2V5KGhEb2MpOw0KKyAgICBtX1BERkZvbnRNZ3JBcnJheS5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpaERvYywgKHZvaWQqJilwTWdyKTsNCisgICAgaWYgKHBNZ3IgIT0gTlVMTCkgew0KKyAgICAgIGRlbGV0ZSBwTWdyOw0KICAgICB9DQorICB9DQorICBtX1BERkZvbnRNZ3JBcnJheS5SZW1vdmVBbGwoKTsNCisgIG1fRm9udEFycmF5LlJlbW92ZUFsbCgpOw0KIH0NCi12b2lkIENYRkFfRm9udE1ncjo6RGVsQWxsTWdyTWFwKCkNCi17DQotICAgIEZYX1BPU0lUSU9OIHBzID0gbV9QREZGb250TWdyQXJyYXkuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHMpIHsNCi0gICAgICAgIElYRkFfRG9jKiBoRG9jID0gTlVMTDsNCi0gICAgICAgIENYRkFfUERGRm9udE1nciogcE1nciA9IE5VTEw7DQotICAgICAgICBtX1BERkZvbnRNZ3JBcnJheS5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpaERvYywgKHZvaWQqJilwTWdyKTsNCi0gICAgICAgIGlmIChwTWdyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBkZWxldGUgcE1ncjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX1BERkZvbnRNZ3JBcnJheS5SZW1vdmVBbGwoKTsNCi0gICAgbV9Gb250QXJyYXkuUmVtb3ZlQWxsKCk7DQotfQ0KLXZvaWQgQ1hGQV9Gb250TWdyOjpTZXREZWZGb250TWdyKElYRkFfRm9udE1nciogcEZvbnRNZ3IpDQotew0KLSAgICBtX3BEZWZGb250TWdyID0gcEZvbnRNZ3I7DQordm9pZCBDWEZBX0ZvbnRNZ3I6OlNldERlZkZvbnRNZ3IoSVhGQV9Gb250TWdyKiBwRm9udE1ncikgew0KKyAgbV9wRGVmRm9udE1nciA9IHBGb250TWdyOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZm9udG1nci5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZvbnRtZ3IuaAppbmRleCBkOGY3Nzg0Li4wZWVkOTk5IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZm9udG1nci5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mb250bWdyLmgKQEAgLTcsNTIgKzcsNzYgQEAKICNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9GT05UTUdSX0lNUF9IDQogI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX0ZPTlRNR1JfSU1QX0gNCiBzdHJ1Y3QgWEZBX0ZPTlRJTkZPIHsNCi0gICAgRlhfRFdPUkQJZHdGb250TmFtZUhhc2g7DQotICAgIGNvbnN0IEZYX1dDSEFSKglwUHNOYW1lOw0KLSAgICBjb25zdCBGWF9XQ0hBUioJcFJlcGxhY2VGb250Ow0KLSAgICBGWF9XT1JECQlkd1N0eWxlczsNCi0gICAgRlhfV09SRAkJd0NvZGVQYWdlOw0KKyAgRlhfRFdPUkQgZHdGb250TmFtZUhhc2g7DQorICBjb25zdCBGWF9XQ0hBUiogcFBzTmFtZTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwUmVwbGFjZUZvbnQ7DQorICBGWF9XT1JEIGR3U3R5bGVzOw0KKyAgRlhfV09SRCB3Q29kZVBhZ2U7DQogfTsNCi1jbGFzcyBDWEZBX0RlZkZvbnRNZ3IgOiBwdWJsaWMgSVhGQV9Gb250TWdyDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9EZWZGb250TWdyKCkge30NCi0gICAgfkNYRkFfRGVmRm9udE1ncigpIG92ZXJyaWRlOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0Rm9udChJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpOw0KLSAgICB2aXJ0dWFsIElGWF9Gb250KgkJR2V0RGVmYXVsdEZvbnQoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGWF9QdHJBcnJheQkJCW1fQ2FjaGVGb250czsNCi19Ow0KLWNsYXNzIENYRkFfUERGRm9udE1nciA6IHB1YmxpYyBJRlhfRm9udFByb3ZpZGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9QREZGb250TWdyKENYRkFfRkZEb2MqIHBEb2MpOw0KLSAgICB+Q1hGQV9QREZGb250TWdyKCk7DQotICAgIElGWF9Gb250KgkJCQlHZXRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIENQREZfRm9udCoqIHBQREZGb250LCBGWF9CT09MIGJTdHJpY3RNYXRjaCA9IFRSVUUpOw0KLSAgICBGWF9CT09MCQkJCQlHZXRDaGFyV2lkdGgoSUZYX0ZvbnQqIHBGb250LCBGWF9XQ0hBUiB3VW5pY29kZSwgaW50MzJfdCAmaVdpZHRoLCBGWF9CT09MIGJDaGFyQ29kZSk7DQotICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fRkRFMlBERkZvbnQ7DQotcHJvdGVjdGVkOg0KLSAgICBJRlhfRm9udCoJCQkJRmluZEZvbnQoQ0ZYX0J5dGVTdHJpbmcgc3RyRmFtaWx5TmFtZSwgRlhfQk9PTCBiQm9sZCwgRlhfQk9PTCBiSXRhbGljLCBDUERGX0ZvbnQqKiBwUERGRm9udCwgRlhfQk9PTCBiU3RyaWN0TWF0Y2ggPSBUUlVFKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlQc05hbWVUb0ZvbnROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJQc05hbWUsIEZYX0JPT0wgYkJvbGQsIEZYX0JPT0wgYkl0YWxpYyk7DQotICAgIEZYX0JPT0wJCQkJCVBzTmFtZU1hdGNoRFJGb250TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUHNOYW1lLCBGWF9CT09MIGJCb2xkLCBGWF9CT09MIGJJdGFsaWMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic0RSRm9udE5hbWUsIEZYX0JPT0wgYlN0cmljdE1hdGNoID0gVFJVRSk7DQotICAgIENYRkFfRkZEb2MqCQkJCQkJCQltX3BEb2M7DQotICAgIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyCQkJCQltX0ZvbnRBcnJheTsNCi19Ow0KLWNsYXNzIENYRkFfRm9udE1ncg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRm9udE1ncigpOw0KLSAgICB+Q1hGQV9Gb250TWdyKCk7DQotICAgIElGWF9Gb250KgkJR2V0Rm9udChJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCitjbGFzcyBDWEZBX0RlZkZvbnRNZ3IgOiBwdWJsaWMgSVhGQV9Gb250TWdyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9EZWZGb250TWdyKCkge30NCisgIH5DWEZBX0RlZkZvbnRNZ3IoKSBvdmVycmlkZTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnQoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKTsNCi0gICAgdm9pZAkJCUxvYWREb2NGb250cyhJWEZBX0RvYyogaERvYyk7DQotICAgIHZvaWQJCQlSZWxlYXNlRG9jRm9udHMoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmYXVsdEZvbnQoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKTsNCiANCi0gICAgdm9pZAkJCVNldERlZkZvbnRNZ3IoSVhGQV9Gb250TWdyKiBwRm9udE1ncik7DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQkJCQlEZWxBbGxNZ3JNYXAoKTsNCi0gICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9QREZGb250TWdyQXJyYXk7DQotICAgIElYRkFfRm9udE1ncioJCQltX3BEZWZGb250TWdyOw0KLSAgICBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cgltX0ZvbnRBcnJheTsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1B0ckFycmF5IG1fQ2FjaGVGb250czsNCit9Ow0KK2NsYXNzIENYRkFfUERGRm9udE1nciA6IHB1YmxpYyBJRlhfRm9udFByb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9QREZGb250TWdyKENYRkFfRkZEb2MqIHBEb2MpOw0KKyAgfkNYRkFfUERGRm9udE1ncigpOw0KKyAgSUZYX0ZvbnQqIEdldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqKiBwUERGRm9udCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cmljdE1hdGNoID0gVFJVRSk7DQorICBGWF9CT09MIEdldENoYXJXaWR0aChJRlhfRm9udCogcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlKTsNCisgIENGWF9NYXBQdHJUb1B0ciBtX0ZERTJQREZGb250Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRlhfRm9udCogRmluZEZvbnQoQ0ZYX0J5dGVTdHJpbmcgc3RyRmFtaWx5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCb2xkLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywNCisgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqKiBwUERGRm9udCwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJpY3RNYXRjaCA9IFRSVUUpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgUHNOYW1lVG9Gb250TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyUHNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCb2xkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMpOw0KKyAgRlhfQk9PTCBQc05hbWVNYXRjaERSRm9udE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1BzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJvbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNEUkZvbnROYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RyaWN0TWF0Y2ggPSBUUlVFKTsNCisgIENYRkFfRkZEb2MqIG1fcERvYzsNCisgIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyIG1fRm9udEFycmF5Ow0KK307DQorY2xhc3MgQ1hGQV9Gb250TWdyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9Gb250TWdyKCk7DQorICB+Q1hGQV9Gb250TWdyKCk7DQorICBJRlhfRm9udCogR2V0Rm9udChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpOw0KKyAgdm9pZCBMb2FkRG9jRm9udHMoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdm9pZCBSZWxlYXNlRG9jRm9udHMoSVhGQV9Eb2MqIGhEb2MpOw0KKw0KKyAgdm9pZCBTZXREZWZGb250TWdyKElYRkFfRm9udE1nciogcEZvbnRNZ3IpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERlbEFsbE1nck1hcCgpOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fUERGRm9udE1nckFycmF5Ow0KKyAgSVhGQV9Gb250TWdyKiBtX3BEZWZGb250TWdyOw0KKyAgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIgbV9Gb250QXJyYXk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsYWRhcHRlci5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsYWRhcHRlci5jcHAKaW5kZXggNGI5NzQxNS4uOTRlMTBhYiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bGFkYXB0ZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2xhZGFwdGVyLmNwcApAQCAtMTAsNzEgKzEwLDcwIEBACiAjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQogI2luY2x1ZGUgInhmYV9mZmZpZWxkLmgiDQogI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KLUlGV0xfQWRhcHRlck5hdGl2ZSAqIEZXTF9DcmVhdGVGdWVsQWRhcHRlck5hdGl2ZSgpDQotew0KLSAgICByZXR1cm4gTlVMTDsNCitJRldMX0FkYXB0ZXJOYXRpdmUqIEZXTF9DcmVhdGVGdWVsQWRhcHRlck5hdGl2ZSgpIHsNCisgIHJldHVybiBOVUxMOw0KIH0NCi12b2lkIEZXTF9SZWxlYXNlRnVlbEFkYXB0ZXJOYXRpdmUoSUZXTF9BZGFwdGVyTmF0aXZlICogbmF0aXZlKQ0KLXsNCit2b2lkIEZXTF9SZWxlYXNlRnVlbEFkYXB0ZXJOYXRpdmUoSUZXTF9BZGFwdGVyTmF0aXZlKiBuYXRpdmUpIHt9DQordm9pZCBGV0xfUG9zdE1lc3NhZ2VUb01haW5Sb29wKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHt9DQorSUZXTF9BZGFwdGVyU2VtYXBob3JlKiBJRldMX0FkYXB0ZXJTZW1hcGhvcmU6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBOVUxMOw0KIH0NCi12b2lkIEZXTF9Qb3N0TWVzc2FnZVRvTWFpblJvb3AoQ0ZXTF9NZXNzYWdlICpwTWVzc2FnZSkNCi17DQotfQ0KLUlGV0xfQWRhcHRlclNlbWFwaG9yZSAqIElGV0xfQWRhcHRlclNlbWFwaG9yZTo6Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1GWF9CT09MCUZXTF9TaG93Q2FyZXQoSUZXTF9XaWRnZXQgKnBXaWRnZXQsIEZYX0JPT0wgYlZpc2libGUsIGNvbnN0IENGWF9SZWN0RiAqcFJ0QW5jaG9yKQ0KLXsNCi0gICAgQ1hGQV9GRldpZGdldCogcFhGQVdpZGdldCA9IChDWEZBX0ZGV2lkZ2V0KilwV2lkZ2V0LT5HZXRQcml2YXRlRGF0YShwV2lkZ2V0KTsNCi0gICAgaWYgKCFwWEZBV2lkZ2V0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgSVhGQV9Eb2NQcm92aWRlciogcERvY1Byb3ZpZGVyID0gcFhGQVdpZGdldC0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCk7DQotICAgIGlmICghcERvY1Byb3ZpZGVyKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKGJWaXNpYmxlKSB7DQotICAgICAgICBDRlhfTWF0cml4IG10Ow0KLSAgICAgICAgcFhGQVdpZGdldC0+R2V0Um90YXRlTWF0cml4KG10KTsNCi0gICAgICAgIENGWF9SZWN0RiBydCgqcFJ0QW5jaG9yKTsNCi0gICAgICAgIG10LlRyYW5zZm9ybVJlY3QocnQpOw0KLSAgICAgICAgcERvY1Byb3ZpZGVyLT5EaXNwbGF5Q2FyZXQocFhGQVdpZGdldCwgYlZpc2libGUsICZydCk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBwRG9jUHJvdmlkZXItPkRpc3BsYXlDYXJldChwWEZBV2lkZ2V0LCBiVmlzaWJsZSwgcFJ0QW5jaG9yKTsNCitGWF9CT09MIEZXTF9TaG93Q2FyZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZpc2libGUsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0QW5jaG9yKSB7DQorICBDWEZBX0ZGV2lkZ2V0KiBwWEZBV2lkZ2V0ID0gKENYRkFfRkZXaWRnZXQqKXBXaWRnZXQtPkdldFByaXZhdGVEYXRhKHBXaWRnZXQpOw0KKyAgaWYgKCFwWEZBV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElYRkFfRG9jUHJvdmlkZXIqIHBEb2NQcm92aWRlciA9IHBYRkFXaWRnZXQtPkdldERvYygpLT5HZXREb2NQcm92aWRlcigpOw0KKyAgaWYgKCFwRG9jUHJvdmlkZXIpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJWaXNpYmxlKSB7DQorICAgIENGWF9NYXRyaXggbXQ7DQorICAgIHBYRkFXaWRnZXQtPkdldFJvdGF0ZU1hdHJpeChtdCk7DQorICAgIENGWF9SZWN0RiBydCgqcFJ0QW5jaG9yKTsNCisgICAgbXQuVHJhbnNmb3JtUmVjdChydCk7DQorICAgIHBEb2NQcm92aWRlci0+RGlzcGxheUNhcmV0KHBYRkFXaWRnZXQsIGJWaXNpYmxlLCAmcnQpOw0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHBEb2NQcm92aWRlci0+RGlzcGxheUNhcmV0KHBYRkFXaWRnZXQsIGJWaXNpYmxlLCBwUnRBbmNob3IpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZXTF9FUlIgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOjpSZXBhaW50V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0KQ0KLXsNCi0gICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwV2lkZ2V0LCBGV0xfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBDWEZBX0ZGRmllbGQgKnBGaWVsZCA9IChDWEZBX0ZGRmllbGQqKXBXaWRnZXQtPkdldFByaXZhdGVEYXRhKHBXaWRnZXQpOw0KLSAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBGaWVsZCwgRldMX0VSUl9JbmRlZmluaXRlKTsNCitGV0xfRVJSIENYRkFfRldMQWRhcHRlcldpZGdldE1ncjo6UmVwYWludFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0KSB7DQorICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBXaWRnZXQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQorICBDWEZBX0ZGRmllbGQqIHBGaWVsZCA9IChDWEZBX0ZGRmllbGQqKXBXaWRnZXQtPkdldFByaXZhdGVEYXRhKHBXaWRnZXQpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwRmllbGQsIEZXTF9FUlJfSW5kZWZpbml0ZSk7DQogI2lmZGVmIF9YRkFfRU1CDQotICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQotICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRJbnZhbGlkYXRlKTsNCi0gICAgaWYgKHBSZWN0KSB7DQotICAgICAgICBydEludmFsaWRhdGUubGVmdCArPSBwUmVjdC0+bGVmdDsNCi0gICAgICAgIHJ0SW52YWxpZGF0ZS50b3AgKz0gcFJlY3QtPnRvcDsNCi0gICAgICAgIHJ0SW52YWxpZGF0ZS53aWR0aCA9IHBSZWN0LT53aWR0aDsNCi0gICAgICAgIHJ0SW52YWxpZGF0ZS5oZWlnaHQgPSBwUmVjdC0+aGVpZ2h0Ow0KLSAgICB9DQotICAgIENGWF9NYXRyaXggbXQ7DQotICAgIHBGaWVsZC0+R2V0Um90YXRlTWF0cml4KG10KTsNCi0gICAgbXQuVHJhbnNmb3JtUmVjdChydEludmFsaWRhdGUpOw0KLSAgICBwRmllbGQtPkFkZEludmFsaWRhdGVSZWN0KCZydEludmFsaWRhdGUpOw0KKyAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRJbnZhbGlkYXRlKTsNCisgIGlmIChwUmVjdCkgew0KKyAgICBydEludmFsaWRhdGUubGVmdCArPSBwUmVjdC0+bGVmdDsNCisgICAgcnRJbnZhbGlkYXRlLnRvcCArPSBwUmVjdC0+dG9wOw0KKyAgICBydEludmFsaWRhdGUud2lkdGggPSBwUmVjdC0+d2lkdGg7DQorICAgIHJ0SW52YWxpZGF0ZS5oZWlnaHQgPSBwUmVjdC0+aGVpZ2h0Ow0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtdDsNCisgIHBGaWVsZC0+R2V0Um90YXRlTWF0cml4KG10KTsNCisgIG10LlRyYW5zZm9ybVJlY3QocnRJbnZhbGlkYXRlKTsNCisgIHBGaWVsZC0+QWRkSW52YWxpZGF0ZVJlY3QoJnJ0SW52YWxpZGF0ZSk7DQogI2Vsc2UNCi0gICAgcEZpZWxkLT5BZGRJbnZhbGlkYXRlUmVjdChOVUxMKTsNCisgIHBGaWVsZC0+QWRkSW52YWxpZGF0ZVJlY3QoTlVMTCk7DQogI2VuZGlmDQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfQk9PTAlDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3I6OkdldFBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0LCBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYgJnJ0UG9wdXApDQotew0KLSAgICBDWEZBX0ZGV2lkZ2V0KiBwRkZXaWRnZXQgPSAoQ1hGQV9GRldpZGdldCopKHBXaWRnZXQtPkdldFByaXZhdGVEYXRhKHBXaWRnZXQpKTsNCi0gICAgQ0ZYX01hdHJpeCBtdDsNCi0gICAgcEZGV2lkZ2V0LT5HZXRSb3RhdGVNYXRyaXgobXQpOw0KLSAgICBDRlhfUmVjdEYgcnRSb3RhdGVBbmNob3IocnRBbmNob3IpOw0KLSAgICBtdC5UcmFuc2Zvcm1SZWN0KHJ0Um90YXRlQW5jaG9yKTsNCi0gICAgcEZGV2lkZ2V0LT5HZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0UG9wdXBQb3MocEZGV2lkZ2V0LCBmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydFJvdGF0ZUFuY2hvciwgcnRQb3B1cCk7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOjpHZXRQb3B1cFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKSB7DQorICBDWEZBX0ZGV2lkZ2V0KiBwRkZXaWRnZXQgPSAoQ1hGQV9GRldpZGdldCopKHBXaWRnZXQtPkdldFByaXZhdGVEYXRhKHBXaWRnZXQpKTsNCisgIENGWF9NYXRyaXggbXQ7DQorICBwRkZXaWRnZXQtPkdldFJvdGF0ZU1hdHJpeChtdCk7DQorICBDRlhfUmVjdEYgcnRSb3RhdGVBbmNob3IocnRBbmNob3IpOw0KKyAgbXQuVHJhbnNmb3JtUmVjdChydFJvdGF0ZUFuY2hvcik7DQorICBwRkZXaWRnZXQtPkdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5HZXRQb3B1cFBvcygNCisgICAgICBwRkZXaWRnZXQsIGZNaW5IZWlnaHQsIGZNYXhIZWlnaHQsIHJ0Um90YXRlQW5jaG9yLCBydFBvcHVwKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsYWRhcHRlci5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bGFkYXB0ZXIuaAppbmRleCA4YzQ3MmQ0Li41ZTk5ZmU1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsYWRhcHRlci5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2xhZGFwdGVyLmgKQEAgLTYsNDQgKzYsNDggQEAKIA0KICNpZm5kZWYgX1hGQV9GV0xfQURBUFRFUl9JTVBfSA0KICNkZWZpbmUgX1hGQV9GV0xfQURBUFRFUl9JTVBfSA0KLWNsYXNzIENYRkFfRldMQWRhcHRlcldpZGdldE1nciA6IHB1YmxpYyBDRldMX1NEQWRhcHRlcldpZGdldE1ncg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgRldMX0VSUiBSZXBhaW50V2lkZ2V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfUmVjdEYgKnBSZWN0KTsNCi0gICAgdmlydHVhbCBGWF9CT09MCSBHZXRQb3B1cFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwgRlhfRkxPQVQgZk1pbkhlaWdodCwgRlhfRkxPQVQgZk1heEhlaWdodCwgY29uc3QgQ0ZYX1JlY3RGICZydEFuY2hvciwgQ0ZYX1JlY3RGICZydFBvcHVwKTsNCitjbGFzcyBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IgOiBwdWJsaWMgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZXTF9FUlIgUmVwYWludFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UG9wdXBQb3MoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKTsNCiB9Ow0KLWNsYXNzIElYRkFfRldMRXZlbnRIYW5kbGVyDQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SVhGQV9GV0xFdmVudEhhbmRsZXIoKSB7fQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFBvcHVwUG9zKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBGWF9GTE9BVCBmTWluUG9wdXAsIEZYX0ZMT0FUIGZNYXhQb3B1cCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYgJnJ0QW5jaG9yLCBDRlhfUmVjdEYmIHJ0UG9wdXApDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCU9uUHJlT3BlbihJRldMX1dpZGdldCAqcFdpZGdldCkge30NCi0gICAgdmlydHVhbCB2b2lkCQlPblBvc3RPcGVuKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSB7fQ0KLSAgICB2aXJ0dWFsCXZvaWQJCU9uU2VsZWN0Q2hhbmdlZChJRldMX1dpZGdldCAqcFdpZGdldCwgaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSkge30NCi0gICAgdmlydHVhbAl2b2lkCQlPblRleHRDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NDaGFuZ2VkKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCU9uVGV4dEZ1bGwoSUZXTF9XaWRnZXQgKnBXaWRnZXQpIHt9DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25WYWxpZGF0ZShJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZpcnR1YWwJdm9pZAkJT25TZWxlY3RDaGFuZ2VkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfSW50MzJBcnJheSAmYXJyU2Vscykge30NCi0gICAgdmlydHVhbCB2b2lkCQlPbkFkZERvUmVjb3JkKElGV0xfV2lkZ2V0ICpwV2lkZ2V0KSB7fQ0KLSAgICB2aXJ0dWFsIENYRkFfRWRnZQlHZXRDb21ib1NwbGl0Q29sb3IoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDWEZBX0VkZ2UoTlVMTCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQlHZXRVSU1hcmdpbihDRlhfUmVjdEYgJnJ0TWFyZ2luKSB7fQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUNoZWNrV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFN1Z2dlc3RXb3Jkcyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkLCBDRlhfQnl0ZVN0cmluZ0FycmF5ICZzU3VnZ2VzdCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQorY2xhc3MgSVhGQV9GV0xFdmVudEhhbmRsZXIgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JWEZBX0ZXTEV2ZW50SGFuZGxlcigpIHt9DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UG9wdXBQb3MoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pblBvcHVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhQb3B1cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgT25QcmVPcGVuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7fQ0KKyAgdmlydHVhbCB2b2lkIE9uUG9zdE9wZW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHt9DQorICB2aXJ0dWFsIHZvaWQgT25TZWxlY3RDaGFuZ2VkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5KSB7fQ0KKyAgdmlydHVhbCB2b2lkIE9uVGV4dENoYW5nZWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDaGFuZ2VkKSB7fQ0KKyAgdmlydHVhbCB2b2lkIE9uVGV4dEZ1bGwoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHt9DQorICB2aXJ0dWFsIEZYX0JPT0wgT25WYWxpZGF0ZShJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgT25TZWxlY3RDaGFuZ2VkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgYXJyU2Vscykge30NCisgIHZpcnR1YWwgdm9pZCBPbkFkZERvUmVjb3JkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7fQ0KKyAgdmlydHVhbCBDWEZBX0VkZ2UgR2V0Q29tYm9TcGxpdENvbG9yKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICAgIHJldHVybiBDWEZBX0VkZ2UoTlVMTCk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgR2V0VUlNYXJnaW4oQ0ZYX1JlY3RGJiBydE1hcmdpbikge30NCisgIHZpcnR1YWwgRlhfQk9PTCBDaGVja1dvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzV29yZCkgeyByZXR1cm4gVFJVRTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEdldFN1Z2dlc3RXb3Jkcyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bHRoZW1lLmNwcAppbmRleCBlMDgwNzU3Li41Y2NjYWRiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2x0aGVtZS5jcHAKQEAgLTksNDA0ICs5LDQwMSBAQAogI2luY2x1ZGUgInhmYV9md2x0aGVtZS5oIg0KICNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCiAjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQotQ1hGQV9GRldpZGdldCogWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpDQotew0KLSAgICBJRldMX1dpZGdldCogcE91dGVyID0gcFdpZGdldDsNCi0gICAgd2hpbGUgKHBPdXRlci0+R2V0T3V0ZXIoKSkgew0KLSAgICAgICAgcE91dGVyID0gcE91dGVyLT5HZXRPdXRlcigpOw0KLSAgICB9DQotICAgIGlmIChwT3V0ZXIpIHsNCi0gICAgICAgIHJldHVybiAoQ1hGQV9GRldpZGdldCopcE91dGVyLT5HZXRQcml2YXRlRGF0YShwT3V0ZXIpOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KK0NYRkFfRkZXaWRnZXQqIFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBJRldMX1dpZGdldCogcE91dGVyID0gcFdpZGdldDsNCisgIHdoaWxlIChwT3V0ZXItPkdldE91dGVyKCkpIHsNCisgICAgcE91dGVyID0gcE91dGVyLT5HZXRPdXRlcigpOw0KKyAgfQ0KKyAgaWYgKHBPdXRlcikgew0KKyAgICByZXR1cm4gKENYRkFfRkZXaWRnZXQqKXBPdXRlci0+R2V0UHJpdmF0ZURhdGEocE91dGVyKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1DWEZBX0ZXTFRoZW1lOjpDWEZBX0ZXTFRoZW1lKENYRkFfRkZBcHAgKnBBcHApDQotICAgIDogbV9wQXBwKHBBcHApDQotew0KLSAgICBtX3BUZXh0T3V0ID0gTlVMTDsNCi0gICAgbV9kd0NhcGFjaXR5ID0gMDsNCi0gICAgbV9mQ2FwYWNpdHkgPSAwOw0KLSAgICBtX3BDYWxlbmRhckZvbnQgPSBOVUxMOw0KLSAgICBtX1JlY3QuU2V0KDAsIDAsIDAsIDApOw0KLSAgICBtX1NpemVBYm92ZUJlbG93LlNldCgwLCAwKTsNCi0gICAgbV9wQ2hlY2tCb3hUUCA9IEZYX05FVyBDWEZBX0ZXTENoZWNrQm94VFA7DQotICAgIG1fcExpc3RCb3hUUCA9IEZYX05FVyBDRldMX0xpc3RCb3hUUDsNCi0gICAgbV9wUGljdHVyZUJveFRQID0gRlhfTkVXIENGV0xfUGljdHVyZUJveFRQOw0KLSAgICBtX3BTcm9sbEJhclRQID0gRlhfTkVXIENGV0xfU2Nyb2xsQmFyVFA7DQotICAgIG1fcEVkaXRUUCA9IEZYX05FVyBDWEZBX0ZXTEVkaXRUUDsNCi0gICAgbV9wQ29tYm9Cb3hUUCA9IEZYX05FVyBDRldMX0NvbWJvQm94VFA7DQotICAgIG1fcE1vbnRoQ2FsZW5kYXJUUCA9IEZYX05FVyBDRldMX01vbnRoQ2FsZW5kYXJUUDsNCi0gICAgbV9wRGF0ZVRpbWVQaWNrZXJUUCA9IEZYX05FVyBDRldMX0RhdGVUaW1lUGlja2VyVFA7DQotICAgIG1fcFB1c2hCdXR0b25UUCA9IEZYX05FVyBDRldMX1B1c2hCdXR0b25UUDsNCi0gICAgbV9wQ2FyZXRUUCA9IEZYX05FVyBDRldMX0NhcmV0VFA7DQotICAgIG1fcEJhcmNvZGVUUCA9IEZYX05FVyBDRldMX0JhcmNvZGVUUDsNCi0gICAgSW5pdGlhbGl6ZSgpOw0KK0NYRkFfRldMVGhlbWU6OkNYRkFfRldMVGhlbWUoQ1hGQV9GRkFwcCogcEFwcCkgOiBtX3BBcHAocEFwcCkgew0KKyAgbV9wVGV4dE91dCA9IE5VTEw7DQorICBtX2R3Q2FwYWNpdHkgPSAwOw0KKyAgbV9mQ2FwYWNpdHkgPSAwOw0KKyAgbV9wQ2FsZW5kYXJGb250ID0gTlVMTDsNCisgIG1fUmVjdC5TZXQoMCwgMCwgMCwgMCk7DQorICBtX1NpemVBYm92ZUJlbG93LlNldCgwLCAwKTsNCisgIG1fcENoZWNrQm94VFAgPSBGWF9ORVcgQ1hGQV9GV0xDaGVja0JveFRQOw0KKyAgbV9wTGlzdEJveFRQID0gRlhfTkVXIENGV0xfTGlzdEJveFRQOw0KKyAgbV9wUGljdHVyZUJveFRQID0gRlhfTkVXIENGV0xfUGljdHVyZUJveFRQOw0KKyAgbV9wU3JvbGxCYXJUUCA9IEZYX05FVyBDRldMX1Njcm9sbEJhclRQOw0KKyAgbV9wRWRpdFRQID0gRlhfTkVXIENYRkFfRldMRWRpdFRQOw0KKyAgbV9wQ29tYm9Cb3hUUCA9IEZYX05FVyBDRldMX0NvbWJvQm94VFA7DQorICBtX3BNb250aENhbGVuZGFyVFAgPSBGWF9ORVcgQ0ZXTF9Nb250aENhbGVuZGFyVFA7DQorICBtX3BEYXRlVGltZVBpY2tlclRQID0gRlhfTkVXIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDsNCisgIG1fcFB1c2hCdXR0b25UUCA9IEZYX05FVyBDRldMX1B1c2hCdXR0b25UUDsNCisgIG1fcENhcmV0VFAgPSBGWF9ORVcgQ0ZXTF9DYXJldFRQOw0KKyAgbV9wQmFyY29kZVRQID0gRlhfTkVXIENGV0xfQmFyY29kZVRQOw0KKyAgSW5pdGlhbGl6ZSgpOw0KIH0NCi1DWEZBX0ZXTFRoZW1lOjp+Q1hGQV9GV0xUaGVtZSgpDQotew0KLSAgICBGaW5hbGl6ZSgpOw0KLSAgICBkZWxldGUgbV9wQ2hlY2tCb3hUUDsNCi0gICAgZGVsZXRlIG1fcExpc3RCb3hUUDsNCi0gICAgZGVsZXRlIG1fcFBpY3R1cmVCb3hUUDsNCi0gICAgZGVsZXRlIG1fcFNyb2xsQmFyVFA7DQotICAgIGRlbGV0ZSBtX3BFZGl0VFA7DQotICAgIGRlbGV0ZSBtX3BDb21ib0JveFRQOw0KLSAgICBkZWxldGUgbV9wTW9udGhDYWxlbmRhclRQOw0KLSAgICBkZWxldGUgbV9wRGF0ZVRpbWVQaWNrZXJUUDsNCi0gICAgZGVsZXRlIG1fcFB1c2hCdXR0b25UUDsNCi0gICAgZGVsZXRlIG1fcENhcmV0VFA7DQotICAgIGRlbGV0ZSBtX3BCYXJjb2RlVFA7DQorQ1hGQV9GV0xUaGVtZTo6fkNYRkFfRldMVGhlbWUoKSB7DQorICBGaW5hbGl6ZSgpOw0KKyAgZGVsZXRlIG1fcENoZWNrQm94VFA7DQorICBkZWxldGUgbV9wTGlzdEJveFRQOw0KKyAgZGVsZXRlIG1fcFBpY3R1cmVCb3hUUDsNCisgIGRlbGV0ZSBtX3BTcm9sbEJhclRQOw0KKyAgZGVsZXRlIG1fcEVkaXRUUDsNCisgIGRlbGV0ZSBtX3BDb21ib0JveFRQOw0KKyAgZGVsZXRlIG1fcE1vbnRoQ2FsZW5kYXJUUDsNCisgIGRlbGV0ZSBtX3BEYXRlVGltZVBpY2tlclRQOw0KKyAgZGVsZXRlIG1fcFB1c2hCdXR0b25UUDsNCisgIGRlbGV0ZSBtX3BDYXJldFRQOw0KKyAgZGVsZXRlIG1fcEJhcmNvZGVUUDsNCiB9DQogc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBnX0ZXTFRoZW1lX0NhbEZvbnRzW10gPSB7DQotICAgIEwiQXJpYWwiLA0KLSAgICBMIkNvdXJpZXIgTmV3IiwNCi0gICAgTCJEZWphVnUgU2FucyIsDQorICAgIEwiQXJpYWwiLCBMIkNvdXJpZXIgTmV3IiwgTCJEZWphVnUgU2FucyIsDQogfTsNCi1GV0xfRVJSIENYRkFfRldMVGhlbWU6OkluaXRpYWxpemUoKQ0KLXsNCi0gICAgbV9wVGV4dE91dCA9IElGREVfVGV4dE91dDo6Q3JlYXRlKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgTlVMTCA9PSBtX3BDYWxlbmRhckZvbnQgJiYgaSA8IHNpemVvZihnX0ZXTFRoZW1lX0NhbEZvbnRzKSAvIHNpemVvZihjb25zdCBGWF9XQ0hBUiopOyBpKyspIHsNCi0gICAgICAgIG1fcENhbGVuZGFyRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChnX0ZXTFRoZW1lX0NhbEZvbnRzW2ldLCAwLCAwLCBtX3BBcHAtPkdldEZERUZvbnRNZ3IoKSk7DQotICAgIH0NCi0gICAgaWYgKE5VTEwgPT0gbV9wQ2FsZW5kYXJGb250KQ0KK0ZXTF9FUlIgQ1hGQV9GV0xUaGVtZTo6SW5pdGlhbGl6ZSgpIHsNCisgIG1fcFRleHRPdXQgPSBJRkRFX1RleHRPdXQ6OkNyZWF0ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBOVUxMID09IG1fcENhbGVuZGFyRm9udCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBpIDwgc2l6ZW9mKGdfRldMVGhlbWVfQ2FsRm9udHMpIC8gc2l6ZW9mKGNvbnN0IEZYX1dDSEFSKik7DQorICAgICAgIGkrKykgew0KKyAgICBtX3BDYWxlbmRhckZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQoZ19GV0xUaGVtZV9DYWxGb250c1tpXSwgMCwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEFwcC0+R2V0RkRFRm9udE1ncigpKTsNCisgIH0NCisgIGlmIChOVUxMID09IG1fcENhbGVuZGFyRm9udCkNCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KLSAgICAgICAgbV9wQ2FsZW5kYXJGb250ID0gbV9wQXBwLT5HZXRGREVGb250TWdyKCktPkdldERlZkZvbnRCeUNvZGVQYWdlKEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbiwgMCwgTlVMTCk7DQorICAgIG1fcENhbGVuZGFyRm9udCA9IG1fcEFwcC0+R2V0RkRFRm9udE1ncigpLT5HZXREZWZGb250QnlDb2RlUGFnZSgNCisgICAgICAgIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbiwgMCwgTlVMTCk7DQogI2Vsc2UNCi0gICAgICAgIG1fcENhbGVuZGFyRm9udCA9IG1fcEFwcC0+R2V0RkRFRm9udE1ncigpLT5HZXRGb250QnlDb2RlUGFnZShGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW4sIDAsIE5VTEwpOw0KKyAgICBtX3BDYWxlbmRhckZvbnQgPSBtX3BBcHAtPkdldEZERUZvbnRNZ3IoKS0+R2V0Rm9udEJ5Q29kZVBhZ2UoDQorICAgICAgICBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW4sIDAsIE5VTEwpOw0KICNlbmRpZg0KLSAgICBGWFNZU19hc3NlcnQoTlVMTCAhPSBtX3BDYWxlbmRhckZvbnQpOw0KLSAgICBGV0xUSEVNRV9Jbml0KCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIEZYU1lTX2Fzc2VydChOVUxMICE9IG1fcENhbGVuZGFyRm9udCk7DQorICBGV0xUSEVNRV9Jbml0KCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZXTF9FUlIgQ1hGQV9GV0xUaGVtZTo6RmluYWxpemUoKQ0KLXsNCi0gICAgaWYgKG1fcFRleHRPdXQpIHsNCi0gICAgICAgIG1fcFRleHRPdXQtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcFRleHRPdXQgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3BDYWxlbmRhckZvbnQpIHsNCi0gICAgICAgIG1fcENhbGVuZGFyRm9udC0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wQ2FsZW5kYXJGb250ID0gTlVMTDsNCi0gICAgfQ0KLSAgICBGV0xUSEVNRV9SZWxlYXNlKCk7DQotICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCitGV0xfRVJSIENYRkFfRldMVGhlbWU6OkZpbmFsaXplKCkgew0KKyAgaWYgKG1fcFRleHRPdXQpIHsNCisgICAgbV9wVGV4dE91dC0+UmVsZWFzZSgpOw0KKyAgICBtX3BUZXh0T3V0ID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BDYWxlbmRhckZvbnQpIHsNCisgICAgbV9wQ2FsZW5kYXJGb250LT5SZWxlYXNlKCk7DQorICAgIG1fcENhbGVuZGFyRm9udCA9IE5VTEw7DQorICB9DQorICBGV0xUSEVNRV9SZWxlYXNlKCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GV0xUaGVtZTo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ1hGQV9GV0xUaGVtZTo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0RXT1JEIENYRkFfRldMVGhlbWU6OkdldFRoZW1lSUQoSUZXTF9XaWRnZXQgKnBXaWRnZXQpDQotew0KLSAgICByZXR1cm4gMDsNCitGWF9EV09SRCBDWEZBX0ZXTFRoZW1lOjpHZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gMDsNCiB9DQotRlhfRFdPUkQgQ1hGQV9GV0xUaGVtZTo6U2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRFdPUkQgZHdUaGVtZUlELCBGWF9CT09MIGJDaGlsZHJlbiApDQotew0KLSAgICByZXR1cm4gMDsNCitGWF9EV09SRCBDWEZBX0ZXTFRoZW1lOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUaGVtZUlELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4pIHsNCisgIHJldHVybiAwOw0KIH0NCi1GWF9CT09MIENYRkFfRldMVGhlbWU6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKQ0KLXsNCi0gICAgcmV0dXJuIEdldFRoZW1lKHBQYXJhbXMtPm1fcFdpZGdldCktPkRyYXdCYWNrZ3JvdW5kKHBQYXJhbXMpOw0KK0ZYX0JPT0wgQ1hGQV9GV0xUaGVtZTo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIHJldHVybiBHZXRUaGVtZShwUGFyYW1zLT5tX3BXaWRnZXQpLT5EcmF3QmFja2dyb3VuZChwUGFyYW1zKTsNCiB9DQotRlhfQk9PTAlDWEZBX0ZXTFRoZW1lOjpEcmF3VGV4dChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcykNCi17DQotICAgIGlmIChwUGFyYW1zLT5tX3dzVGV4dC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQotICAgIH0NCi0gICAgaWYgKHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfTW9udGhDYWxlbmRhcikgew0KLSAgICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7DQotICAgICAgICBpZiAoIXBXaWRnZXQpIHsNCi0gICAgICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOw0KLSAgICAgICAgbV9wVGV4dE91dC0+U2V0QWxpZ25tZW50KHBQYXJhbXMtPm1faVRUT0FsaWduKTsNCi0gICAgICAgIG1fcFRleHRPdXQtPlNldEZvbnQobV9wQ2FsZW5kYXJGb250KTsNCi0gICAgICAgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplKTsNCi0gICAgICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3IpOw0KLSAgICAgICAgaWYgKChwUGFyYW1zLT5tX2lQYXJ0ID09IEZXTF9QQVJUX01DRF9EYXRlc0luKSAmJiAhKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfSVRFTVNUQVRFX01DRF9GbGFnKSAmJg0KLSAgICAgICAgICAgICAgICAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIChGV0xfUEFSVFNUQVRFX01DRF9Ib3ZlcmVkIHwgRldMX1BBUlRTVEFURV9NQ0RfU2VsZWN0ZWQpKSkgew0KLSAgICAgICAgICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcigweEZGRkZGRkZGKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwUGFyYW1zLT5tX2lQYXJ0ID09IEZXTF9QQVJUX01DRF9DYXB0aW9uKSB7DQotICAgICAgICAgICAgaWYgKG1fcE1vbnRoQ2FsZW5kYXJUUC0+R2V0VGhlbWVJRChwUGFyYW1zLT5tX3BXaWRnZXQpID09IDAgKSB7DQotICAgICAgICAgICAgICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihBcmdiRW5jb2RlKDB4ZmYsIDAsIDE1MywgMjU1KSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxMjgsIDApKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcyA9IHBQYXJhbXMtPm1fcEdyYXBoaWNzOw0KLSAgICAgICAgQ0ZYX1JlbmRlckRldmljZSAqcFJlbmRlckRldmljZSA9IHBHcmFwaGljcy0+R2V0UmVuZGVyRGV2aWNlKCk7DQotICAgICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBSZW5kZXJEZXZpY2UsIEZBTFNFKTsNCi0gICAgICAgIG1fcFRleHRPdXQtPlNldFJlbmRlckRldmljZShwUmVuZGVyRGV2aWNlKTsNCi0gICAgICAgIENGWF9NYXRyaXggbXRQYXJ0ID0gcFBhcmFtcy0+bV9tYXRyaXg7DQotICAgICAgICBDRlhfTWF0cml4ICpwTWF0cml4ID0gcEdyYXBoaWNzLT5HZXRNYXRyaXgoKTsNCi0gICAgICAgIGlmIChwTWF0cml4KSB7DQotICAgICAgICAgICAgbXRQYXJ0LkNvbmNhdCgqcE1hdHJpeCk7DQotICAgICAgICB9DQotICAgICAgICBtX3BUZXh0T3V0LT5TZXRNYXRyaXgobXRQYXJ0KTsNCi0gICAgICAgIG1fcFRleHRPdXQtPkRyYXdMb2dpY1RleHQocFBhcmFtcy0+bV93c1RleHQsIHBQYXJhbXMtPm1fd3NUZXh0LkdldExlbmd0aCgpLCBwUGFyYW1zLT5tX3J0UGFydCk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ1hGQV9GV0xUaGVtZTo6RHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMpIHsNCisgIGlmIChwUGFyYW1zLT5tX3dzVGV4dC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIGlmIChwUGFyYW1zLT5tX3BXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX01vbnRoQ2FsZW5kYXIpIHsNCiAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7DQogICAgIGlmICghcFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KICAgICB9DQotICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOw0KLSAgICBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcyA9IHBQYXJhbXMtPm1fcEdyYXBoaWNzOw0KLSAgICBDRlhfUmVuZGVyRGV2aWNlICpwUmVuZGVyRGV2aWNlID0gcEdyYXBoaWNzLT5HZXRSZW5kZXJEZXZpY2UoKTsNCisgICAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRBbGlnbm1lbnQocFBhcmFtcy0+bV9pVFRPQWxpZ24pOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRGb250KG1fcENhbGVuZGFyRm9udCk7DQorICAgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplKTsNCisgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKEZXTFRIRU1FX0NBUEFDSVRZX1RleHRDb2xvcik7DQorICAgIGlmICgocFBhcmFtcy0+bV9pUGFydCA9PSBGV0xfUEFSVF9NQ0RfRGF0ZXNJbikgJiYNCisgICAgICAgICEocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9JVEVNU1RBVEVfTUNEX0ZsYWcpICYmDQorICAgICAgICAocFBhcmFtcy0+bV9kd1N0YXRlcyAmDQorICAgICAgICAgKEZXTF9QQVJUU1RBVEVfTUNEX0hvdmVyZWQgfCBGV0xfUEFSVFNUQVRFX01DRF9TZWxlY3RlZCkpKSB7DQorICAgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKDB4RkZGRkZGRkYpOw0KKyAgICB9DQorICAgIGlmIChwUGFyYW1zLT5tX2lQYXJ0ID09IEZXTF9QQVJUX01DRF9DYXB0aW9uKSB7DQorICAgICAgaWYgKG1fcE1vbnRoQ2FsZW5kYXJUUC0+R2V0VGhlbWVJRChwUGFyYW1zLT5tX3BXaWRnZXQpID09IDApIHsNCisgICAgICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihBcmdiRW5jb2RlKDB4ZmYsIDAsIDE1MywgMjU1KSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihBcmdiRW5jb2RlKDB4ZmYsIDEyOCwgMTI4LCAwKSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzID0gcFBhcmFtcy0+bV9wR3JhcGhpY3M7DQorICAgIENGWF9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UgPSBwR3JhcGhpY3MtPkdldFJlbmRlckRldmljZSgpOw0KICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBSZW5kZXJEZXZpY2UsIEZBTFNFKTsNCiAgICAgbV9wVGV4dE91dC0+U2V0UmVuZGVyRGV2aWNlKHBSZW5kZXJEZXZpY2UpOw0KLSAgICBtX3BUZXh0T3V0LT5TZXRTdHlsZXMocFBhcmFtcy0+bV9kd1RUT1N0eWxlcyk7DQotICAgIG1fcFRleHRPdXQtPlNldEFsaWdubWVudChwUGFyYW1zLT5tX2lUVE9BbGlnbik7DQotICAgIG1fcFRleHRPdXQtPlNldEZvbnQocEFjYy0+R2V0RkRFRm9udCgpKTsNCi0gICAgbV9wVGV4dE91dC0+U2V0Rm9udFNpemUocEFjYy0+R2V0Rm9udFNpemUoKSk7DQotICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihwQWNjLT5HZXRUZXh0Q29sb3IoKSk7DQogICAgIENGWF9NYXRyaXggbXRQYXJ0ID0gcFBhcmFtcy0+bV9tYXRyaXg7DQotICAgIENGWF9NYXRyaXggKnBNYXRyaXggPSBwR3JhcGhpY3MtPkdldE1hdHJpeCgpOw0KKyAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gcEdyYXBoaWNzLT5HZXRNYXRyaXgoKTsNCiAgICAgaWYgKHBNYXRyaXgpIHsNCi0gICAgICAgIG10UGFydC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICAgIG10UGFydC5Db25jYXQoKnBNYXRyaXgpOw0KICAgICB9DQogICAgIG1fcFRleHRPdXQtPlNldE1hdHJpeChtdFBhcnQpOw0KLSAgICBtX3BUZXh0T3V0LT5EcmF3TG9naWNUZXh0KHBQYXJhbXMtPm1fd3NUZXh0LCBwUGFyYW1zLT5tX3dzVGV4dC5HZXRMZW5ndGgoKSwgcFBhcmFtcy0+bV9ydFBhcnQpOw0KKyAgICBtX3BUZXh0T3V0LT5EcmF3TG9naWNUZXh0KHBQYXJhbXMtPm1fd3NUZXh0LCBwUGFyYW1zLT5tX3dzVGV4dC5HZXRMZW5ndGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydCk7DQogICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7DQorICBpZiAoIXBXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOw0KKyAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsNCisgIENGWF9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UgPSBwR3JhcGhpY3MtPkdldFJlbmRlckRldmljZSgpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUmVuZGVyRGV2aWNlLCBGQUxTRSk7DQorICBtX3BUZXh0T3V0LT5TZXRSZW5kZXJEZXZpY2UocFJlbmRlckRldmljZSk7DQorICBtX3BUZXh0T3V0LT5TZXRTdHlsZXMocFBhcmFtcy0+bV9kd1RUT1N0eWxlcyk7DQorICBtX3BUZXh0T3V0LT5TZXRBbGlnbm1lbnQocFBhcmFtcy0+bV9pVFRPQWxpZ24pOw0KKyAgbV9wVGV4dE91dC0+U2V0Rm9udChwQWNjLT5HZXRGREVGb250KCkpOw0KKyAgbV9wVGV4dE91dC0+U2V0Rm9udFNpemUocEFjYy0+R2V0Rm9udFNpemUoKSk7DQorICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IocEFjYy0+R2V0VGV4dENvbG9yKCkpOw0KKyAgQ0ZYX01hdHJpeCBtdFBhcnQgPSBwUGFyYW1zLT5tX21hdHJpeDsNCisgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBwR3JhcGhpY3MtPkdldE1hdHJpeCgpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgbXRQYXJ0LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBtX3BUZXh0T3V0LT5TZXRNYXRyaXgobXRQYXJ0KTsNCisgIG1fcFRleHRPdXQtPkRyYXdMb2dpY1RleHQocFBhcmFtcy0+bV93c1RleHQsIHBQYXJhbXMtPm1fd3NUZXh0LkdldExlbmd0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCogQ1hGQV9GV0xUaGVtZTo6R2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQgKnBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpDQotew0KLSAgICBzd2l0Y2goZHdDYXBhY2l0eSkgew0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRm9udDogew0KLSAgICAgICAgICAgICAgICBpZiAoQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwV2lkZ2V0LT5HZXREYXRhQWNjKCktPkdldEZERUZvbnQoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0ZvbnRTaXplOiB7DQotICAgICAgICAgICAgICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9mQ2FwYWNpdHkgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCktPkdldEZvbnRTaXplKCk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gJm1fZkNhcGFjaXR5Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVGV4dENvbG9yOiB7DQotICAgICAgICAgICAgICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9kd0NhcGFjaXR5ID0gcFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRUZXh0Q29sb3IoKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAmbV9kd0NhcGFjaXR5Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTGluZUhlaWdodDogew0KLSAgICAgICAgICAgICAgICBpZiAoQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fZkNhcGFjaXR5ID0gcFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRMaW5lSGVpZ2h0KCk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gJm1fZkNhcGFjaXR5Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGg6IHsNCi0gICAgICAgICAgICAgICAgbV9mQ2FwYWNpdHkgPSA5Ow0KLSAgICAgICAgICAgICAgICByZXR1cm4gJm1fZkNhcGFjaXR5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX1VJTWFyZ2luOiB7DQotICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpOw0KLSAgICAgICAgICAgICAgICBpZiAocFdpZGdldCkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHBXaWRnZXQtPkdldExheW91dEl0ZW0oKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghcEl0ZW0pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJm1fUmVjdDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOw0KLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldEFjYy0+R2V0VUlNYXJnaW4obV9SZWN0KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChDWEZBX1BhcmEgcGFyYSA9IHBXaWRnZXRBY2MtPkdldFBhcmEoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fUmVjdC5sZWZ0ICs9IHBhcmEuR2V0TWFyZ2luTGVmdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV2lkZ2V0QWNjLT5Jc011bHRpTGluZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fUmVjdC53aWR0aCArPSBwYXJhLkdldE1hcmdpblJpZ2h0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwSXRlbS0+R2V0TmV4dCgpICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9SZWN0LmhlaWdodCA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1JlY3QudG9wID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9SZWN0LnRvcCA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9SZWN0LmhlaWdodCA9IDA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuICZtX1JlY3Q7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfU3BhY2VBYm92ZUJlbG93OiB7DQotICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpOw0KLSAgICAgICAgICAgICAgICBpZiAocFdpZGdldCkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBwV2lkZ2V0QWNjLT5HZXRQYXJhKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NpemVBYm92ZUJlbG93LnggPSBwYXJhLkdldFNwYWNlQWJvdmUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1NpemVBYm92ZUJlbG93LnkgPSBwYXJhLkdldFNwYWNlQmVsb3coKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gJm1fU2l6ZUFib3ZlQmVsb3c7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBpZiAocFRoZW1lUGFydC0+bV9wV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9Nb250aENhbGVuZGFyICYmIGR3Q2FwYWNpdHkgPj0gRldMX01DQ0FQQUNJVFlfU3VuICYmIGR3Q2FwYWNpdHkgPD0gRldMX01DQ0FQQUNJVFlfVG9kYXkpIHsNCi0gICAgICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkgew0KLSAgICAgICAgICAgIElYRkFfQXBwUHJvdmlkZXIgKnBBcHBQcm92aWRlciA9IHBXaWRnZXQtPkdldEFwcFByb3ZpZGVyKCk7DQotICAgICAgICAgICAgbV93c1Jlc291cmNlLkVtcHR5KCk7DQotICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfU3RyaW5nV2Vla0RheV9TdW4gKyBkd0NhcGFjaXR5IC0gRldMX1dHVENBUEFDSVRZX01BWCAtIDUsIG1fd3NSZXNvdXJjZSk7DQotICAgICAgICAgICAgaWYgKCFtX3dzUmVzb3VyY2UuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAmbV93c1Jlc291cmNlOw0KLSAgICAgICAgICAgIH0NCit2b2lkKiBDWEZBX0ZXTFRoZW1lOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NhcGFjaXR5KSB7DQorICBzd2l0Y2ggKGR3Q2FwYWNpdHkpIHsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRm9udDogew0KKyAgICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0NCisgICAgICAgICAgICAgIFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCkpIHsNCisgICAgICAgIHJldHVybiBwV2lkZ2V0LT5HZXREYXRhQWNjKCktPkdldEZERUZvbnQoKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0ZvbnRTaXplOiB7DQorICAgICAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPQ0KKyAgICAgICAgICAgICAgWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkgew0KKyAgICAgICAgbV9mQ2FwYWNpdHkgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCktPkdldEZvbnRTaXplKCk7DQorICAgICAgICByZXR1cm4gJm1fZkNhcGFjaXR5Ow0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVGV4dENvbG9yOiB7DQorICAgICAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPQ0KKyAgICAgICAgICAgICAgWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkgew0KKyAgICAgICAgbV9kd0NhcGFjaXR5ID0gcFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRUZXh0Q29sb3IoKTsNCisgICAgICAgIHJldHVybiAmbV9kd0NhcGFjaXR5Ow0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTGluZUhlaWdodDogew0KKyAgICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0NCisgICAgICAgICAgICAgIFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCkpIHsNCisgICAgICAgIG1fZkNhcGFjaXR5ID0gcFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRMaW5lSGVpZ2h0KCk7DQorICAgICAgICByZXR1cm4gJm1fZkNhcGFjaXR5Ow0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGg6IHsNCisgICAgICBtX2ZDYXBhY2l0eSA9IDk7DQorICAgICAgcmV0dXJuICZtX2ZDYXBhY2l0eTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW46IHsNCisgICAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KTsNCisgICAgICBpZiAocFdpZGdldCkgew0KKyAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHBXaWRnZXQtPkdldExheW91dEl0ZW0oKTsNCisgICAgICAgIGlmICghcEl0ZW0pIHsNCisgICAgICAgICAgcmV0dXJuICZtX1JlY3Q7DQogICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCktPkdldENhcGFjaXR5KHBUaGVtZVBhcnQsIGR3Q2FwYWNpdHkpOw0KLX0NCi1GWF9CT09MIENYRkFfRldMVGhlbWU6OklzQ3VzdG9taXplZExheW91dChJRldMX1dpZGdldCAqcFdpZGdldCkNCi17DQotICAgIHJldHVybiBHZXRUaGVtZShwV2lkZ2V0KS0+SXNDdXN0b21pemVkTGF5b3V0KHBXaWRnZXQpOw0KLX0NCi1GV0xfRVJSIENYRkFfRldMVGhlbWU6OkdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJlY3Q7DQotICAgIHJldHVybiBHZXRUaGVtZShwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpLT5HZXRQYXJ0UmVjdChwVGhlbWVQYXJ0LCByZWN0KTsNCi19DQotRlhfQk9PTCBDWEZBX0ZXTFRoZW1lOjpJc0luUGFydChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KQ0KLXsNCi0gICAgcmV0dXJuIEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCktPklzSW5QYXJ0KHBUaGVtZVBhcnQsIGZ4LCBmeSk7DQotfQ0KLUZYX0JPT0wJQ1hGQV9GV0xUaGVtZTo6Q2FsY1RleHRSZWN0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zLCBDRlhfUmVjdEYgJnJlY3QpDQotew0KLSAgICBpZiAocFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9Nb250aENhbGVuZGFyKSB7DQotICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFBhcmFtcy0+bV9wV2lkZ2V0KTsNCi0gICAgICAgIGlmICghcFdpZGdldCkgew0KLSAgICAgICAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBXaWRnZXQtPkdldERhdGFBY2MoKTsNCisgICAgICAgIHBXaWRnZXRBY2MtPkdldFVJTWFyZ2luKG1fUmVjdCk7DQorICAgICAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBwV2lkZ2V0QWNjLT5HZXRQYXJhKCkpIHsNCisgICAgICAgICAgbV9SZWN0LmxlZnQgKz0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7DQorICAgICAgICAgIGlmIChwV2lkZ2V0QWNjLT5Jc011bHRpTGluZSgpKSB7DQorICAgICAgICAgICAgbV9SZWN0LndpZHRoICs9IHBhcmEuR2V0TWFyZ2luUmlnaHQoKTsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwUGFyYW1zLCBGQUxTRSk7DQotICAgICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1fcFRleHRPdXQsIEZBTFNFKTsNCi0gICAgICAgIG1fcFRleHRPdXQtPlNldEZvbnQobV9wQ2FsZW5kYXJGb250KTsNCi0gICAgICAgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplKTsNCi0gICAgICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3IpOw0KLSAgICAgICAgbV9wVGV4dE91dC0+U2V0QWxpZ25tZW50KHBQYXJhbXMtPm1faVRUT0FsaWduKTsNCi0gICAgICAgIG1fcFRleHRPdXQtPlNldFN0eWxlcyhwUGFyYW1zLT5tX2R3VFRPU3R5bGVzKTsNCi0gICAgICAgIG1fcFRleHRPdXQtPkNhbGNMb2dpY1NpemUocFBhcmFtcy0+bV93c1RleHQsIHBQYXJhbXMtPm1fd3NUZXh0LkdldExlbmd0aCgpLCByZWN0KTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCkgew0KKyAgICAgICAgICBpZiAocEl0ZW0tPkdldE5leHQoKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgbV9SZWN0LmhlaWdodCA9IDA7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAocEl0ZW0tPkdldE5leHQoKSA9PSBOVUxMKSB7DQorICAgICAgICAgIG1fUmVjdC50b3AgPSAwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgbV9SZWN0LnRvcCA9IDA7DQorICAgICAgICAgIG1fUmVjdC5oZWlnaHQgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gJm1fUmVjdDsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfU3BhY2VBYm92ZUJlbG93OiB7DQorICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCk7DQorICAgICAgaWYgKHBXaWRnZXQpIHsNCisgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOw0KKyAgICAgICAgaWYgKENYRkFfUGFyYSBwYXJhID0gcFdpZGdldEFjYy0+R2V0UGFyYSgpKSB7DQorICAgICAgICAgIG1fU2l6ZUFib3ZlQmVsb3cueCA9IHBhcmEuR2V0U3BhY2VBYm92ZSgpOw0KKyAgICAgICAgICBtX1NpemVBYm92ZUJlbG93LnkgPSBwYXJhLkdldFNwYWNlQmVsb3coKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuICZtX1NpemVBYm92ZUJlbG93Ow0KKyAgICB9IGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKHBUaGVtZVBhcnQtPm1fcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfTW9udGhDYWxlbmRhciAmJg0KKyAgICAgIGR3Q2FwYWNpdHkgPj0gRldMX01DQ0FQQUNJVFlfU3VuICYmIGR3Q2FwYWNpdHkgPD0gRldMX01DQ0FQQUNJVFlfVG9kYXkpIHsNCisgICAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPQ0KKyAgICAgICAgICAgIFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCkpIHsNCisgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBwV2lkZ2V0LT5HZXRBcHBQcm92aWRlcigpOw0KKyAgICAgIG1fd3NSZXNvdXJjZS5FbXB0eSgpOw0KKyAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZygNCisgICAgICAgICAgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1N1biArIGR3Q2FwYWNpdHkgLSBGV0xfV0dUQ0FQQUNJVFlfTUFYIC0gNSwNCisgICAgICAgICAgbV93c1Jlc291cmNlKTsNCisgICAgICBpZiAoIW1fd3NSZXNvdXJjZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiAmbV93c1Jlc291cmNlOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCktPkdldENhcGFjaXR5KHBUaGVtZVBhcnQsIGR3Q2FwYWNpdHkpOw0KK30NCitGWF9CT09MIENYRkFfRldMVGhlbWU6OklzQ3VzdG9taXplZExheW91dChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIEdldFRoZW1lKHBXaWRnZXQpLT5Jc0N1c3RvbWl6ZWRMYXlvdXQocFdpZGdldCk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GV0xUaGVtZTo6R2V0UGFydFJlY3QoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQpIHsNCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgcmV0dXJuIEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCktPkdldFBhcnRSZWN0KHBUaGVtZVBhcnQsIHJlY3QpOw0KK30NCitGWF9CT09MIENYRkFfRldMVGhlbWU6OklzSW5QYXJ0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCktPklzSW5QYXJ0KHBUaGVtZVBhcnQsIGZ4LCBmeSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GV0xUaGVtZTo6Q2FsY1RleHRSZWN0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zLCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIGlmIChwUGFyYW1zLT5tX3BXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX01vbnRoQ2FsZW5kYXIpIHsNCiAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7DQogICAgIGlmICghcFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KICAgICB9DQotICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOw0KLSAgICBtX3BUZXh0T3V0LT5TZXRGb250KHBBY2MtPkdldEZERUZvbnQoKSk7DQotICAgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKHBBY2MtPkdldEZvbnRTaXplKCkpOw0KLSAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IocEFjYy0+R2V0VGV4dENvbG9yKCkpOw0KICAgICBfRldMX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBQYXJhbXMsIEZBTFNFKTsNCiAgICAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BUZXh0T3V0LCBGQUxTRSk7DQorICAgIG1fcFRleHRPdXQtPlNldEZvbnQobV9wQ2FsZW5kYXJGb250KTsNCisgICAgbV9wVGV4dE91dC0+U2V0Rm9udFNpemUoRldMVEhFTUVfQ0FQQUNJVFlfRm9udFNpemUpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yKTsNCiAgICAgbV9wVGV4dE91dC0+U2V0QWxpZ25tZW50KHBQYXJhbXMtPm1faVRUT0FsaWduKTsNCiAgICAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOw0KLSAgICBtX3BUZXh0T3V0LT5DYWxjTG9naWNTaXplKHBQYXJhbXMtPm1fd3NUZXh0LCBwUGFyYW1zLT5tX3dzVGV4dC5HZXRMZW5ndGgoKSwgcmVjdCk7DQorICAgIG1fcFRleHRPdXQtPkNhbGNMb2dpY1NpemUocFBhcmFtcy0+bV93c1RleHQsIHBQYXJhbXMtPm1fd3NUZXh0LkdldExlbmd0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOw0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwUGFyYW1zLT5tX3BXaWRnZXQpOw0KKyAgaWYgKCFwV2lkZ2V0KSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBXaWRnZXQtPkdldERhdGFBY2MoKTsNCisgIG1fcFRleHRPdXQtPlNldEZvbnQocEFjYy0+R2V0RkRFRm9udCgpKTsNCisgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKHBBY2MtPkdldEZvbnRTaXplKCkpOw0KKyAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKHBBY2MtPkdldFRleHRDb2xvcigpKTsNCisgIF9GV0xfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocFBhcmFtcywgRkFMU0UpOw0KKyAgX0ZXTF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtX3BUZXh0T3V0LCBGQUxTRSk7DQorICBtX3BUZXh0T3V0LT5TZXRBbGlnbm1lbnQocFBhcmFtcy0+bV9pVFRPQWxpZ24pOw0KKyAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOw0KKyAgbV9wVGV4dE91dC0+Q2FsY0xvZ2ljU2l6ZShwUGFyYW1zLT5tX3dzVGV4dCwgcFBhcmFtcy0+bV93c1RleHQuR2V0TGVuZ3RoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUNGV0xfV2lkZ2V0VFAqIENYRkFfRldMVGhlbWU6OkdldFRoZW1lKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KQ0KLXsNCi0gICAgc3dpdGNoKHBXaWRnZXQtPkdldENsYXNzSUQoKSkgew0KLSAgICAgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX0NoZWNrQm94Og0KLSAgICAgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX1JhZGlvQnV0dG9uOg0KLSAgICAgICAgICAgIHJldHVybiBtX3BDaGVja0JveFRQOw0KLSAgICAgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX0xpc3RCb3g6DQotICAgICAgICAgICAgcmV0dXJuIG1fcExpc3RCb3hUUDsNCi0gICAgICAgIGNhc2UgRldMX0NMQVNTSEFTSF9QaWN0dXJlQm94Og0KLSAgICAgICAgICAgIHJldHVybiBtX3BQaWN0dXJlQm94VFA7DQotICAgICAgICBjYXNlIEZXTF9DTEFTU0hBU0hfU2Nyb2xsQmFyOg0KLSAgICAgICAgICAgIHJldHVybiBtX3BTcm9sbEJhclRQOw0KLSAgICAgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX0VkaXQ6DQotICAgICAgICAgICAgcmV0dXJuIG1fcEVkaXRUUDsNCi0gICAgICAgIGNhc2UgRldMX0NMQVNTSEFTSF9Db21ib0JveDoNCi0gICAgICAgICAgICByZXR1cm4gbV9wQ29tYm9Cb3hUUDsNCi0gICAgICAgIGNhc2UgRldMX0NMQVNTSEFTSF9Nb250aENhbGVuZGFyOg0KLSAgICAgICAgICAgIHJldHVybiBtX3BNb250aENhbGVuZGFyVFA7DQotICAgICAgICBjYXNlIEZXTF9DTEFTU0hBU0hfRGF0ZVRpbWVQaWNrZXI6DQotICAgICAgICAgICAgcmV0dXJuIG1fcERhdGVUaW1lUGlja2VyVFA7DQotICAgICAgICBjYXNlIEZXTF9DTEFTU0hBU0hfUHVzaEJ1dHRvbjoNCi0gICAgICAgICAgICByZXR1cm4gbV9wUHVzaEJ1dHRvblRQOw0KLSAgICAgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX0NhcmV0Og0KLSAgICAgICAgICAgIHJldHVybiBtX3BDYXJldFRQOw0KLSAgICAgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX0JhcmNvZGU6DQotICAgICAgICAgICAgcmV0dXJuIG1fcEJhcmNvZGVUUDsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorQ0ZXTF9XaWRnZXRUUCogQ1hGQV9GV0xUaGVtZTo6R2V0VGhlbWUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHN3aXRjaCAocFdpZGdldC0+R2V0Q2xhc3NJRCgpKSB7DQorICAgIGNhc2UgRldMX0NMQVNTSEFTSF9DaGVja0JveDoNCisgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX1JhZGlvQnV0dG9uOg0KKyAgICAgIHJldHVybiBtX3BDaGVja0JveFRQOw0KKyAgICBjYXNlIEZXTF9DTEFTU0hBU0hfTGlzdEJveDoNCisgICAgICByZXR1cm4gbV9wTGlzdEJveFRQOw0KKyAgICBjYXNlIEZXTF9DTEFTU0hBU0hfUGljdHVyZUJveDoNCisgICAgICByZXR1cm4gbV9wUGljdHVyZUJveFRQOw0KKyAgICBjYXNlIEZXTF9DTEFTU0hBU0hfU2Nyb2xsQmFyOg0KKyAgICAgIHJldHVybiBtX3BTcm9sbEJhclRQOw0KKyAgICBjYXNlIEZXTF9DTEFTU0hBU0hfRWRpdDoNCisgICAgICByZXR1cm4gbV9wRWRpdFRQOw0KKyAgICBjYXNlIEZXTF9DTEFTU0hBU0hfQ29tYm9Cb3g6DQorICAgICAgcmV0dXJuIG1fcENvbWJvQm94VFA7DQorICAgIGNhc2UgRldMX0NMQVNTSEFTSF9Nb250aENhbGVuZGFyOg0KKyAgICAgIHJldHVybiBtX3BNb250aENhbGVuZGFyVFA7DQorICAgIGNhc2UgRldMX0NMQVNTSEFTSF9EYXRlVGltZVBpY2tlcjoNCisgICAgICByZXR1cm4gbV9wRGF0ZVRpbWVQaWNrZXJUUDsNCisgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX1B1c2hCdXR0b246DQorICAgICAgcmV0dXJuIG1fcFB1c2hCdXR0b25UUDsNCisgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX0NhcmV0Og0KKyAgICAgIHJldHVybiBtX3BDYXJldFRQOw0KKyAgICBjYXNlIEZXTF9DTEFTU0hBU0hfQmFyY29kZToNCisgICAgICByZXR1cm4gbV9wQmFyY29kZVRQOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLUNYRkFfRldMQ2hlY2tCb3hUUDo6Q1hGQV9GV0xDaGVja0JveFRQKCkNCi17DQotfQ0KLUZYX0JPT0wJQ1hGQV9GV0xDaGVja0JveFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcykNCi17DQotICAgIGlmIChwUGFyYW1zLT5tX2lQYXJ0ICE9IEZXTF9QQVJUX0NLQl9DaGVja0JveCkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgaWYgKCgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkKSB8fCAoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMikgPT0gRldMX1BBUlRTVEFURV9DS0JfTmV1dHJhbCkpIHsNCi0gICAgICAgIERyYXdDaGVja1NpZ24ocFBhcmFtcy0+bV9wV2lkZ2V0LCBwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBwUGFyYW1zLT5tX2R3U3RhdGVzLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KLSAgICB9DQorQ1hGQV9GV0xDaGVja0JveFRQOjpDWEZBX0ZXTENoZWNrQm94VFAoKSB7fQ0KK0ZYX0JPT0wgQ1hGQV9GV0xDaGVja0JveFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgaWYgKHBQYXJhbXMtPm1faVBhcnQgIT0gRldMX1BBUlRfQ0tCX0NoZWNrQm94KSB7DQogICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKCgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PQ0KKyAgICAgICBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkKSB8fA0KKyAgICAgICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PQ0KKyAgICAgICBGV0xfUEFSVFNUQVRFX0NLQl9OZXV0cmFsKSkgew0KKyAgICBEcmF3Q2hlY2tTaWduKHBQYXJhbXMtPm1fcFdpZGdldCwgcFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwNCisgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX2R3U3RhdGVzLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ1hGQV9GV0xDaGVja0JveFRQOjpEcmF3Q2hlY2tTaWduKElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfR3JhcGhpY3MgKnBHcmFwaGljcywgY29uc3QgQ0ZYX1JlY3RGICpwUnRCb3gsIGludDMyX3QgaVN0YXRlLCBDRlhfTWF0cml4KiBwTWF0cml4KQ0KLXsNCi0gICAgQ0ZYX1JlY3RGIHJ0U2lnbigqcFJ0Qm94KTsNCi0gICAgRlhfRFdPUkQgZHdDb2xvciA9IDB4RkYwMDAwMDA7DQotICAgIGlmICgoaVN0YXRlICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09IEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWwpIHsNCi0gICAgICAgIGR3Q29sb3IgPSAweEZGQTlBOUE5Ow0KK3ZvaWQgQ1hGQV9GV0xDaGVja0JveFRQOjpEcmF3Q2hlY2tTaWduKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9SZWN0RiBydFNpZ24oKnBSdEJveCk7DQorICBGWF9EV09SRCBkd0NvbG9yID0gMHhGRjAwMDAwMDsNCisgIGlmICgoaVN0YXRlICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09IEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWwpIHsNCisgICAgZHdDb2xvciA9IDB4RkZBOUE5QTk7DQorICB9DQorICB7DQorICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBwV2lkZ2V0LT5HZXRTdHlsZXNFeCgpOw0KKyAgICBydFNpZ24uRGVmbGF0ZShydFNpZ24ud2lkdGggLyA0LCBydFNpZ24uaGVpZ2h0IC8gNCk7DQorICAgIHN3aXRjaCAoZHdTdHlsZSAmIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlTWFzaykgew0KKyAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaGVjazoNCisgICAgICAgIERyYXdTaWduQ2hlY2socEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaXJjbGU6DQorICAgICAgICBEcmF3U2lnbkNpcmNsZShwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNyb3NzOg0KKyAgICAgICAgRHJhd1NpZ25Dcm9zcyhwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZURpYW1vbmQ6DQorICAgICAgICBEcmF3U2lnbkRpYW1vbmQocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTcXVhcmU6DQorICAgICAgICBEcmF3U2lnblNxdWFyZShwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVN0YXI6DQorICAgICAgICBEcmF3U2lnblN0YXIocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICB7DQotICAgICAgICBGWF9EV09SRCBkd1N0eWxlID0gcFdpZGdldC0+R2V0U3R5bGVzRXgoKTsNCi0gICAgICAgIHJ0U2lnbi5EZWZsYXRlKHJ0U2lnbi53aWR0aCAvIDQsIHJ0U2lnbi5oZWlnaHQgLyA0KTsNCi0gICAgICAgIHN3aXRjaChkd1N0eWxlICYgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVNYXNrKSB7DQotICAgICAgICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNoZWNrOg0KLSAgICAgICAgICAgICAgICBEcmF3U2lnbkNoZWNrKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaXJjbGU6DQotICAgICAgICAgICAgICAgIERyYXdTaWduQ2lyY2xlKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDcm9zczoNCi0gICAgICAgICAgICAgICAgRHJhd1NpZ25Dcm9zcyhwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlRGlhbW9uZDoNCi0gICAgICAgICAgICAgICAgRHJhd1NpZ25EaWFtb25kKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTcXVhcmU6DQotICAgICAgICAgICAgICAgIERyYXdTaWduU3F1YXJlKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTdGFyOg0KLSAgICAgICAgICAgICAgICBEcmF3U2lnblN0YXIocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQorICB9DQorfQ0KK0NYRkFfRldMRWRpdFRQOjpDWEZBX0ZXTEVkaXRUUCgpIHt9DQorQ1hGQV9GV0xFZGl0VFA6On5DWEZBX0ZXTEVkaXRUUCgpIHt9DQorRlhfQk9PTCBDWEZBX0ZXTEVkaXRUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIGlmIChGV0xfUEFSVF9FRFRfQ29tYlRleHRMaW5lID09IHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7DQorICAgIEZYX0FSR0IgY3IgPSAweEZGMDAwMDAwOw0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSAxLjBmOw0KKyAgICBpZiAoQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCktPkdldFVJQm9yZGVyKCkpIHsNCisgICAgICBDWEZBX0VkZ2UgZWRnZSA9IGJvcmRlclVJLkdldEVkZ2UoMCk7DQorICAgICAgaWYgKGVkZ2UpIHsNCisgICAgICAgIGNyID0gZWRnZS5HZXRDb2xvcigpOw0KKyAgICAgICAgZldpZHRoID0gZWRnZS5HZXRUaGlja25lc3MoKTsNCisgICAgICB9DQogICAgIH0NCi19DQotQ1hGQV9GV0xFZGl0VFA6OkNYRkFfRldMRWRpdFRQKCkNCi17DQotfQ0KLUNYRkFfRldMRWRpdFRQOjp+Q1hGQV9GV0xFZGl0VFAoKQ0KLXsNCi19DQotRlhfQk9PTCBDWEZBX0ZXTEVkaXRUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQgKnBQYXJhbXMpDQotew0KLSAgICBpZiAoRldMX1BBUlRfRURUX0NvbWJUZXh0TGluZSA9PSBwUGFyYW1zLT5tX2lQYXJ0KSB7DQotICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFBhcmFtcy0+bV9wV2lkZ2V0KTsNCi0gICAgICAgIEZYX0FSR0IgY3IgPSAweEZGMDAwMDAwOw0KLSAgICAgICAgRlhfRkxPQVQgZldpZHRoID0gMS4wZjsNCi0gICAgICAgIGlmIChDWEZBX0JvcmRlciBib3JkZXJVSSA9IHBXaWRnZXQtPkdldERhdGFBY2MoKS0+R2V0VUlCb3JkZXIoKSkgew0KLSAgICAgICAgICAgIENYRkFfRWRnZSBlZGdlID0gYm9yZGVyVUkuR2V0RWRnZSgwKTsNCi0gICAgICAgICAgICBpZiAoZWRnZSkgew0KLSAgICAgICAgICAgICAgICBjciA9IGVkZ2UuR2V0Q29sb3IoKTsNCi0gICAgICAgICAgICAgICAgZldpZHRoID0gZWRnZS5HZXRUaGlja25lc3MoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBDRlhfQ29sb3IgY3JMaW5lKGNyKTsNCi0gICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JMaW5lKTsNCi0gICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoZldpZHRoKTsNCi0gICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKHBQYXJhbXMtPm1fcFBhdGgsICZwUGFyYW1zLT5tX21hdHJpeCk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ0ZXTF9FZGl0VFA6OkRyYXdCYWNrZ3JvdW5kKHBQYXJhbXMpOw0KKyAgICBDRlhfQ29sb3IgY3JMaW5lKGNyKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckxpbmUpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0TGluZVdpZHRoKGZXaWR0aCk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKHBQYXJhbXMtPm1fcFBhdGgsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfRWRpdFRQOjpEcmF3QmFja2dyb3VuZChwUGFyYW1zKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bHRoZW1lLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuaAppbmRleCA1Y2U3MGFhLi5kMDhhN2FkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuaApAQCAtNiw4OSArNiw4NyBAQAogDQogI2lmbmRlZiBfWEZBX0ZXTF9USEVNRV9JTVBfSA0KICNkZWZpbmUgX1hGQV9GV0xfVEhFTUVfSU1QX0gNCi1jbGFzcyBDWEZBX0ZXTFRoZW1lIDogcHVibGljIElGV0xfVGhlbWVQcm92aWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRldMVGhlbWUoQ1hGQV9GRkFwcCAqcEFwcCk7DQotICAgIHZpcnR1YWx+Q1hGQV9GV0xUaGVtZSgpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotICAgIH0NCi0gICAgdmlydHVhbCBJRldMX1RhcmdldCoJUmV0YWluKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgdmlydHVhbCBGV0xfRVJSCQkJR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nICZ3c0NsYXNzKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2V0SGFzaENvZGUoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCQlJbml0aWFsaXplKCk7DQotICAgIHZpcnR1YWwgRldMX0VSUgkJCUZpbmFsaXplKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCk7DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJU2V0VGhlbWVJRChJRldMX1dpZGdldCAqcFdpZGdldCwgRlhfRFdPUkQgZHdUaGVtZUlELCBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3VGV4dChDRldMX1RoZW1lVGV4dCAqcFBhcmFtcyk7DQotICAgIHZpcnR1YWwgdm9pZCogICBHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCAqcFRoZW1lUGFydCwgRlhfRFdPUkQgZHdDYXBhY2l0eSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNDdXN0b21pemVkTGF5b3V0KElGV0xfV2lkZ2V0ICpwV2lkZ2V0KTsNCi0gICAgdmlydHVhbCBGV0xfRVJSCQlHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNJblBhcnQoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorY2xhc3MgQ1hGQV9GV0xUaGVtZSA6IHB1YmxpYyBJRldMX1RoZW1lUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZXTFRoZW1lKENYRkFfRkZBcHAqIHBBcHApOw0KKyAgdmlydHVhbCB+Q1hGQV9GV0xUaGVtZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlbGVhc2UoKSB7DQorICAgIGRlbGV0ZSB0aGlzOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICB2aXJ0dWFsIElGV0xfVGFyZ2V0KiBSZXRhaW4oKSB7IHJldHVybiBOVUxMOyB9DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0SGFzaENvZGUoKSBjb25zdCB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldFRoZW1lSUQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3VGV4dChDRldMX1RoZW1lVGV4dCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0luUGFydChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSk7DQogDQotICAgIHZpcnR1YWwJRlhfQk9PTAkJQ2FsY1RleHRSZWN0KENGV0xfVGhlbWVUZXh0ICpwUGFyYW1zLCBDRlhfUmVjdEYgJnJlY3QpOw0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBDRlhfTWF0cml4ICZtYXRyaXgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCVNldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0ICpwV2lkZ2V0LCBjb25zdCBDRlhfTWF0cml4ICZtYXRyaXgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZXTF9FUlIJCUdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0ICpwVGhlbWVQYXJ0LCBDRlhfUmVjdEYgJnJ0UGFydCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICBDRldMX1dpZGdldFRQKiBHZXRUaGVtZShJRldMX1dpZGdldCogcFdpZGdldCk7DQotICAgIENGV0xfQ2hlY2tCb3hUUCoJCW1fcENoZWNrQm94VFA7DQotICAgIENGV0xfTGlzdEJveFRQKgkJCW1fcExpc3RCb3hUUDsNCi0gICAgQ0ZXTF9QaWN0dXJlQm94VFAqCQltX3BQaWN0dXJlQm94VFA7DQotICAgIENGV0xfU2Nyb2xsQmFyVFAqCQltX3BTcm9sbEJhclRQOw0KLSAgICBDRldMX0VkaXRUUCoJCQltX3BFZGl0VFA7DQotICAgIENGV0xfQ29tYm9Cb3hUUCoJCW1fcENvbWJvQm94VFA7DQotICAgIENGV0xfTW9udGhDYWxlbmRhclRQKgltX3BNb250aENhbGVuZGFyVFA7DQotICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJUUCoJbV9wRGF0ZVRpbWVQaWNrZXJUUDsNCi0gICAgQ0ZXTF9QdXNoQnV0dG9uVFAqCQltX3BQdXNoQnV0dG9uVFA7DQotICAgIENGV0xfQ2FyZXRUUCoJCQltX3BDYXJldFRQOw0KLSAgICBDRldMX0JhcmNvZGVUUCoJCQltX3BCYXJjb2RlVFA7DQotICAgIElGREVfVGV4dE91dCoJCQltX3BUZXh0T3V0Ow0KLSAgICBGWF9GTE9BVAkJCQltX2ZDYXBhY2l0eTsNCi0gICAgRlhfRFdPUkQJCQkJbV9kd0NhcGFjaXR5Ow0KLSAgICBJRlhfRm9udCoJCQkJbV9wQ2FsZW5kYXJGb250Ow0KLSAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3NSZXNvdXJjZTsNCi0gICAgQ1hGQV9GRkFwcCoJCQkJbV9wQXBwOw0KLSAgICBDRlhfUmVjdEYJCQkJbV9SZWN0Ow0KLSAgICBDRlhfU2l6ZUYJCQkJbV9TaXplQWJvdmVCZWxvdzsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYWxjVGV4dFJlY3QoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMsIENGWF9SZWN0RiYgcmVjdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIHZpcnR1YWwgRldMX0VSUiBHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwgQ0ZYX1JlY3RGJiBydFBhcnQpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX1dpZGdldFRQKiBHZXRUaGVtZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICBDRldMX0NoZWNrQm94VFAqIG1fcENoZWNrQm94VFA7DQorICBDRldMX0xpc3RCb3hUUCogbV9wTGlzdEJveFRQOw0KKyAgQ0ZXTF9QaWN0dXJlQm94VFAqIG1fcFBpY3R1cmVCb3hUUDsNCisgIENGV0xfU2Nyb2xsQmFyVFAqIG1fcFNyb2xsQmFyVFA7DQorICBDRldMX0VkaXRUUCogbV9wRWRpdFRQOw0KKyAgQ0ZXTF9Db21ib0JveFRQKiBtX3BDb21ib0JveFRQOw0KKyAgQ0ZXTF9Nb250aENhbGVuZGFyVFAqIG1fcE1vbnRoQ2FsZW5kYXJUUDsNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXJUUCogbV9wRGF0ZVRpbWVQaWNrZXJUUDsNCisgIENGV0xfUHVzaEJ1dHRvblRQKiBtX3BQdXNoQnV0dG9uVFA7DQorICBDRldMX0NhcmV0VFAqIG1fcENhcmV0VFA7DQorICBDRldMX0JhcmNvZGVUUCogbV9wQmFyY29kZVRQOw0KKyAgSUZERV9UZXh0T3V0KiBtX3BUZXh0T3V0Ow0KKyAgRlhfRkxPQVQgbV9mQ2FwYWNpdHk7DQorICBGWF9EV09SRCBtX2R3Q2FwYWNpdHk7DQorICBJRlhfRm9udCogbV9wQ2FsZW5kYXJGb250Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1Jlc291cmNlOw0KKyAgQ1hGQV9GRkFwcCogbV9wQXBwOw0KKyAgQ0ZYX1JlY3RGIG1fUmVjdDsNCisgIENGWF9TaXplRiBtX1NpemVBYm92ZUJlbG93Ow0KIH07DQotY2xhc3MgQ1hGQV9GV0xDaGVja0JveFRQIDogcHVibGljIENGV0xfQ2hlY2tCb3hUUA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRldMQ2hlY2tCb3hUUCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kICpwUGFyYW1zKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJRHJhd0NoZWNrU2lnbihJRldMX1dpZGdldCAqcFdpZGdldCwgQ0ZYX0dyYXBoaWNzICpwR3JhcGhpY3MsIGNvbnN0IENGWF9SZWN0RiAqcFJ0Qm94LCBpbnQzMl90IGlTdGF0ZSwgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorY2xhc3MgQ1hGQV9GV0xDaGVja0JveFRQIDogcHVibGljIENGV0xfQ2hlY2tCb3hUUCB7DQorIHB1YmxpYzoNCisgIENYRkFfRldMQ2hlY2tCb3hUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3Q2hlY2tTaWduKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KIH07DQotY2xhc3MgQ1hGQV9GV0xFZGl0VFAgOiBwdWJsaWMgQ0ZXTF9FZGl0VFANCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZXTEVkaXRUUCgpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZXTEVkaXRUUCgpOw0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCAqcFBhcmFtcyk7DQorY2xhc3MgQ1hGQV9GV0xFZGl0VFAgOiBwdWJsaWMgQ0ZXTF9FZGl0VFAgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZXTEVkaXRUUCgpOw0KKyAgdmlydHVhbCB+Q1hGQV9GV0xFZGl0VFAoKTsNCisNCisgcHVibGljOg0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9yZW5kZXJjb250ZXh0LmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9yZW5kZXJjb250ZXh0LmNwcAppbmRleCBjODlkYzNlLi4wYjQ4Y2ZmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfcmVuZGVyY29udGV4dC5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3JlbmRlcmNvbnRleHQuY3BwCkBAIC04LDY3ICs4LDY4IEBACiAjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9jb21tb24uaCINCiAjaW5jbHVkZSAieGZhX3JlbmRlcmNvbnRleHQuaCINCiAjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQotI2RlZmluZSBYRkFfUkVOREVSQ09OVEVYVF9NYXhDb3VudAkJMzANCi1JWEZBX1JlbmRlckNvbnRleHQqCVhGQV9SZW5kZXJDb250ZXh0X0NyZWF0ZSgpDQotew0KLSAgICByZXR1cm4gRlhfTkVXIENYRkFfUmVuZGVyQ29udGV4dDsNCisjZGVmaW5lIFhGQV9SRU5ERVJDT05URVhUX01heENvdW50IDMwDQorSVhGQV9SZW5kZXJDb250ZXh0KiBYRkFfUmVuZGVyQ29udGV4dF9DcmVhdGUoKSB7DQorICByZXR1cm4gRlhfTkVXIENYRkFfUmVuZGVyQ29udGV4dDsNCiB9DQotQ1hGQV9SZW5kZXJDb250ZXh0OjpDWEZBX1JlbmRlckNvbnRleHQoKQ0KLXsNCi0gICAgbV9wV2lkZ2V0SXRlcmF0b3IgPSBOVUxMOw0KLSAgICBtX3BXaWRnZXQgPSBOVUxMOw0KLSAgICBtX3BQYWdlVmlldyA9IE5VTEw7DQotICAgIG1fcEdTID0gTlVMTDsNCi0gICAgbV9kd1N0YXR1cyA9IDA7DQotICAgIG1fbWF0cml4LlJlc2V0KCk7DQotICAgIG1fcnRDbGlwUmVjdC5SZXNldCgpOw0KK0NYRkFfUmVuZGVyQ29udGV4dDo6Q1hGQV9SZW5kZXJDb250ZXh0KCkgew0KKyAgbV9wV2lkZ2V0SXRlcmF0b3IgPSBOVUxMOw0KKyAgbV9wV2lkZ2V0ID0gTlVMTDsNCisgIG1fcFBhZ2VWaWV3ID0gTlVMTDsNCisgIG1fcEdTID0gTlVMTDsNCisgIG1fZHdTdGF0dXMgPSAwOw0KKyAgbV9tYXRyaXguUmVzZXQoKTsNCisgIG1fcnRDbGlwUmVjdC5SZXNldCgpOw0KIH0NCi1DWEZBX1JlbmRlckNvbnRleHQ6On5DWEZBX1JlbmRlckNvbnRleHQoKQ0KLXsNCi0gICAgU3RvcFJlbmRlcigpOw0KK0NYRkFfUmVuZGVyQ29udGV4dDo6fkNYRkFfUmVuZGVyQ29udGV4dCgpIHsNCisgIFN0b3BSZW5kZXIoKTsNCiB9DQotaW50MzJfdCBDWEZBX1JlbmRlckNvbnRleHQ6OlN0YXJ0UmVuZGVyKElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywgQ0ZYX0dyYXBoaWNzKiBwR1MsIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwgY29uc3QgQ1hGQV9SZW5kZXJPcHRpb25zJiBvcHRpb25zKQ0KLXsNCi0gICAgbV9wUGFnZVZpZXcgPSBwUGFnZVZpZXc7DQotICAgIG1fcEdTID0gcEdTOw0KLSAgICBtX21hdHJpeCA9IG1hdHJpeDsNCi0gICAgbV9vcHRpb25zID0gb3B0aW9uczsNCi0gICAgQ0ZYX1JlY3RGIHJ0UGFnZTsNCi0gICAgcEdTLT5HZXRDbGlwUmVjdChydFBhZ2UpOw0KLSAgICBDRlhfTWF0cml4IG10UmVzOw0KLSAgICBtdFJlcy5TZXRSZXZlcnNlKG1hdHJpeCk7DQotICAgIG1fcnRDbGlwUmVjdC5TZXQocnRQYWdlLmxlZnQsIHJ0UGFnZS50b3AsIHJ0UGFnZS53aWR0aCwgcnRQYWdlLmhlaWdodCk7DQotICAgIG10UmVzLlRyYW5zZm9ybVJlY3QobV9ydENsaXBSZWN0KTsNCi0gICAgbV9kd1N0YXR1cyA9IG1fb3B0aW9ucy5tX2JIaWdobGlnaHQgPyBYRkFfV0lER0VUU1RBVFVTX0hpZ2hsaWdodCA6IDA7DQotICAgIEZYX0RXT1JEIGR3RmlsdGVyVHlwZSA9IFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZSB8IFhGQV9XSURHRVRGSUxURVJfQWxsVHlwZSB8IChtX29wdGlvbnMubV9iUHJpbnQgPyBYRkFfV0lER0VUU1RBVFVTX1ByaW50YWJsZSA6IFhGQV9XSURHRVRTVEFUVVNfVmlld2FibGUpOw0KLSAgICBtX3BXaWRnZXRJdGVyYXRvciA9IG1fcFBhZ2VWaWV3LT5DcmVhdGVXaWRnZXRJdGVyYXRvcihYRkFfVFJBVkVSU0VXQVlfRm9ybSwgZHdGaWx0ZXJUeXBlKTsNCitpbnQzMl90IENYRkFfUmVuZGVyQ29udGV4dDo6U3RhcnRSZW5kZXIoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWEZBX1JlbmRlck9wdGlvbnMmIG9wdGlvbnMpIHsNCisgIG1fcFBhZ2VWaWV3ID0gcFBhZ2VWaWV3Ow0KKyAgbV9wR1MgPSBwR1M7DQorICBtX21hdHJpeCA9IG1hdHJpeDsNCisgIG1fb3B0aW9ucyA9IG9wdGlvbnM7DQorICBDRlhfUmVjdEYgcnRQYWdlOw0KKyAgcEdTLT5HZXRDbGlwUmVjdChydFBhZ2UpOw0KKyAgQ0ZYX01hdHJpeCBtdFJlczsNCisgIG10UmVzLlNldFJldmVyc2UobWF0cml4KTsNCisgIG1fcnRDbGlwUmVjdC5TZXQocnRQYWdlLmxlZnQsIHJ0UGFnZS50b3AsIHJ0UGFnZS53aWR0aCwgcnRQYWdlLmhlaWdodCk7DQorICBtdFJlcy5UcmFuc2Zvcm1SZWN0KG1fcnRDbGlwUmVjdCk7DQorICBtX2R3U3RhdHVzID0gbV9vcHRpb25zLm1fYkhpZ2hsaWdodCA/IFhGQV9XSURHRVRTVEFUVVNfSGlnaGxpZ2h0IDogMDsNCisgIEZYX0RXT1JEIGR3RmlsdGVyVHlwZSA9IFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZSB8IFhGQV9XSURHRVRGSUxURVJfQWxsVHlwZSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAobV9vcHRpb25zLm1fYlByaW50ID8gWEZBX1dJREdFVFNUQVRVU19QcmludGFibGUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfV0lER0VUU1RBVFVTX1ZpZXdhYmxlKTsNCisgIG1fcFdpZGdldEl0ZXJhdG9yID0NCisgICAgICBtX3BQYWdlVmlldy0+Q3JlYXRlV2lkZ2V0SXRlcmF0b3IoWEZBX1RSQVZFUlNFV0FZX0Zvcm0sIGR3RmlsdGVyVHlwZSk7DQorICBtX3BXaWRnZXQgPSBtX3BXaWRnZXRJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgcmV0dXJuIFhGQV9SRU5ERVJTVEFUVVNfUmVhZHk7DQorfQ0KK2ludDMyX3QgQ1hGQV9SZW5kZXJDb250ZXh0OjpEb1JlbmRlcihJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgd2hpbGUgKG1fcFdpZGdldCkgew0KKyAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gKENYRkFfRkZXaWRnZXQqKW1fcFdpZGdldDsNCisgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Qm94Ow0KKyAgICBwV2lkZ2V0LT5HZXRCQm94KHJ0V2lkZ2V0Qm94LCBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpOw0KKyAgICBydFdpZGdldEJveC53aWR0aCArPSAxOw0KKyAgICBydFdpZGdldEJveC5oZWlnaHQgKz0gMTsNCisgICAgaWYgKHJ0V2lkZ2V0Qm94LkludGVyc2VjdFdpdGgobV9ydENsaXBSZWN0KSkgew0KKyAgICAgIHBXaWRnZXQtPlJlbmRlcldpZGdldChtX3BHUywgJm1fbWF0cml4LCBtX2R3U3RhdHVzKTsNCisgICAgfQ0KICAgICBtX3BXaWRnZXQgPSBtX3BXaWRnZXRJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KLSAgICByZXR1cm4gWEZBX1JFTkRFUlNUQVRVU19SZWFkeTsNCi19DQotaW50MzJfdCBDWEZBX1JlbmRlckNvbnRleHQ6OkRvUmVuZGVyKElGWF9QYXVzZSogcFBhdXNlKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSAwOw0KLSAgICB3aGlsZShtX3BXaWRnZXQpIHsNCi0gICAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSAoQ1hGQV9GRldpZGdldCopbV9wV2lkZ2V0Ow0KLSAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Qm94Ow0KLSAgICAgICAgcFdpZGdldC0+R2V0QkJveChydFdpZGdldEJveCwgWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlKTsNCi0gICAgICAgIHJ0V2lkZ2V0Qm94LndpZHRoICs9IDE7DQotICAgICAgICBydFdpZGdldEJveC5oZWlnaHQgKz0gMTsNCi0gICAgICAgIGlmIChydFdpZGdldEJveC5JbnRlcnNlY3RXaXRoKG1fcnRDbGlwUmVjdCkpIHsNCi0gICAgICAgICAgICBwV2lkZ2V0LT5SZW5kZXJXaWRnZXQobV9wR1MsICZtX21hdHJpeCwgbV9kd1N0YXR1cyk7DQotICAgICAgICB9DQotICAgICAgICBtX3BXaWRnZXQgPSBtX3BXaWRnZXRJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KLSAgICAgICAgaUNvdW50Kys7DQotICAgICAgICBpZiAoaUNvdW50ID4gWEZBX1JFTkRFUkNPTlRFWFRfTWF4Q291bnQgJiYgcFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KLSAgICAgICAgICAgIHJldHVybiBYRkFfUkVOREVSU1RBVFVTX1RvQmVDb250aW51ZWQ7DQotICAgICAgICB9DQorICAgIGlDb3VudCsrOw0KKyAgICBpZiAoaUNvdW50ID4gWEZBX1JFTkRFUkNPTlRFWFRfTWF4Q291bnQgJiYgcFBhdXNlICYmDQorICAgICAgICBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCisgICAgICByZXR1cm4gWEZBX1JFTkRFUlNUQVRVU19Ub0JlQ29udGludWVkOw0KICAgICB9DQotICAgIHJldHVybiBYRkFfUkVOREVSU1RBVFVTX0RvbmU7DQorICB9DQorICByZXR1cm4gWEZBX1JFTkRFUlNUQVRVU19Eb25lOw0KIH0NCi12b2lkIENYRkFfUmVuZGVyQ29udGV4dDo6U3RvcFJlbmRlcigpDQotew0KLSAgICBpZiAobV9wV2lkZ2V0SXRlcmF0b3IpIHsNCi0gICAgICAgIG1fcFdpZGdldEl0ZXJhdG9yLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BXaWRnZXRJdGVyYXRvciA9IE5VTEw7DQotICAgIH0NCit2b2lkIENYRkFfUmVuZGVyQ29udGV4dDo6U3RvcFJlbmRlcigpIHsNCisgIGlmIChtX3BXaWRnZXRJdGVyYXRvcikgew0KKyAgICBtX3BXaWRnZXRJdGVyYXRvci0+UmVsZWFzZSgpOw0KKyAgICBtX3BXaWRnZXRJdGVyYXRvciA9IE5VTEw7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9yZW5kZXJjb250ZXh0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfcmVuZGVyY29udGV4dC5oCmluZGV4IDc5OTMxYjIuLmNmMzdlM2UgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9yZW5kZXJjb250ZXh0LmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3JlbmRlcmNvbnRleHQuaApAQCAtNCwyOCArNCwyOCBAQAogDQogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCi0jaWZuZGVmCV9GWEZBX0ZPUk1GSUxMRVJfUkVOREVSQ09OVEVYVF9JTVBfSA0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9SRU5ERVJDT05URVhUX0lNUF9IDQogI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX1JFTkRFUkNPTlRFWFRfSU1QX0gNCi1jbGFzcyBDWEZBX1JlbmRlckNvbnRleHQgOiBwdWJsaWMgSVhGQV9SZW5kZXJDb250ZXh0DQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9SZW5kZXJDb250ZXh0KCk7DQotICAgIHZpcnR1YWwgfkNYRkFfUmVuZGVyQ29udGV4dCgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJU3RhcnRSZW5kZXIoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LCBDRlhfR3JhcGhpY3MqIHBHUywgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LCBjb25zdCBDWEZBX1JlbmRlck9wdGlvbnMmIG9wdGlvbnMpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJRG9SZW5kZXIoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCi0gICAgdmlydHVhbAl2b2lkCQlTdG9wUmVuZGVyKCk7DQotcHJvdGVjdGVkOg0KLSAgICBJWEZBX1dpZGdldEl0ZXJhdG9yKiBtX3BXaWRnZXRJdGVyYXRvcjsNCi0gICAgSVhGQV9XaWRnZXQqCQkgbV9wV2lkZ2V0Ow0KLSAgICBJWEZBX1BhZ2VWaWV3KgkJIG1fcFBhZ2VWaWV3Ow0KLSAgICBDRlhfR3JhcGhpY3MqCQkgbV9wR1M7DQotICAgIENGWF9NYXRyaXgJCQkgbV9tYXRyaXg7DQotICAgIENYRkFfUmVuZGVyT3B0aW9ucwkgbV9vcHRpb25zOw0KLSAgICBGWF9EV09SRAkJCSBtX2R3U3RhdHVzOw0KLSAgICBDRlhfUmVjdEYJCQkgbV9ydENsaXBSZWN0Ow0KK2NsYXNzIENYRkFfUmVuZGVyQ29udGV4dCA6IHB1YmxpYyBJWEZBX1JlbmRlckNvbnRleHQgew0KKyBwdWJsaWM6DQorICBDWEZBX1JlbmRlckNvbnRleHQoKTsNCisgIHZpcnR1YWwgfkNYRkFfUmVuZGVyQ29udGV4dCgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgU3RhcnRSZW5kZXIoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWEZBX1JlbmRlck9wdGlvbnMmIG9wdGlvbnMpOw0KKyAgdmlydHVhbCBpbnQzMl90IERvUmVuZGVyKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgU3RvcFJlbmRlcigpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJWEZBX1dpZGdldEl0ZXJhdG9yKiBtX3BXaWRnZXRJdGVyYXRvcjsNCisgIElYRkFfV2lkZ2V0KiBtX3BXaWRnZXQ7DQorICBJWEZBX1BhZ2VWaWV3KiBtX3BQYWdlVmlldzsNCisgIENGWF9HcmFwaGljcyogbV9wR1M7DQorICBDRlhfTWF0cml4IG1fbWF0cml4Ow0KKyAgQ1hGQV9SZW5kZXJPcHRpb25zIG1fb3B0aW9uczsNCisgIEZYX0RXT1JEIG1fZHdTdGF0dXM7DQorICBDRlhfUmVjdEYgbV9ydENsaXBSZWN0Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuY3BwCmluZGV4IDc1YjZkM2MuLjhlNTQ4YTkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV90ZXh0bGF5b3V0LmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfdGV4dGxheW91dC5jcHAKQEAgLTEwLDE5MTkgKzEwLDIwMTggQEAKICNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCiAjaW5jbHVkZSAieGZhX2ZmZG9jLmgiDQogI2luY2x1ZGUgInhmYV9mb250bWdyLmgiDQotQ1hGQV9DU1NUYWdQcm92aWRlcjo6fkNYRkFfQ1NTVGFnUHJvdmlkZXIoKQ0KLXsNCi0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9BdHRyaWJ1dGVzLkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBvcykgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBOYW1lID0gTlVMTCwgKnBWYWx1ZSA9IE5VTEw7DQotICAgICAgICBtX0F0dHJpYnV0ZXMuR2V0TmV4dEFzc29jKHBvcywgKHZvaWQqJilwTmFtZSwgKHZvaWQqJilwVmFsdWUpOw0KLSAgICAgICAgaWYgKHBOYW1lICE9IE5VTEwpCXsNCi0gICAgICAgICAgICBkZWxldGUgcE5hbWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBkZWxldGUgcFZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9DU1NUYWdQcm92aWRlcjo6R2V0TmV4dEF0dHJpYnV0ZShGWF9QT1NJVElPTiAmcG9zLCBDRlhfV2lkZVN0cmluZ0MgJndzQXR0ciwgQ0ZYX1dpZGVTdHJpbmdDICZ3c1ZhbHVlKQ0KLXsNCi0gICAgaWYgKHBvcyA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgKnBOYW1lCT0gTlVMTDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgKnBWYWx1ZQk9IE5VTEw7DQorQ1hGQV9DU1NUYWdQcm92aWRlcjo6fkNYRkFfQ1NTVGFnUHJvdmlkZXIoKSB7DQorICBGWF9QT1NJVElPTiBwb3MgPSBtX0F0dHJpYnV0ZXMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBDRlhfV2lkZVN0cmluZyAqcE5hbWUgPSBOVUxMLCAqcFZhbHVlID0gTlVMTDsNCiAgICAgbV9BdHRyaWJ1dGVzLkdldE5leHRBc3NvYyhwb3MsICh2b2lkKiYpcE5hbWUsICh2b2lkKiYpcFZhbHVlKTsNCi0gICAgd3NBdHRyCT0gKnBOYW1lOw0KLSAgICB3c1ZhbHVlCT0gKnBWYWx1ZTsNCisgICAgaWYgKHBOYW1lICE9IE5VTEwpIHsNCisgICAgICBkZWxldGUgcE5hbWU7DQorICAgIH0NCisgICAgaWYgKHBWYWx1ZSAhPSBOVUxMKSB7DQorICAgICAgZGVsZXRlIHBWYWx1ZTsNCisgICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENYRkFfQ1NTVGFnUHJvdmlkZXI6OlNldEF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NBdHRyLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nICpwTmFtZQk9IEZYX05FVyBDRlhfV2lkZVN0cmluZygpOw0KLSAgICBDRlhfV2lkZVN0cmluZyAqcFZhbHVlCT0gRlhfTkVXIENGWF9XaWRlU3RyaW5nKCk7DQotICAgICpwTmFtZQk9IHdzQXR0cjsNCi0gICAgKnBWYWx1ZQk9IHdzVmFsdWU7DQotICAgIG1fQXR0cmlidXRlcy5TZXRBdChwTmFtZSwgcFZhbHVlKTsNCit2b2lkIENYRkFfQ1NTVGFnUHJvdmlkZXI6OkdldE5leHRBdHRyaWJ1dGUoRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSkgew0KKyAgaWYgKHBvcyA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nKiBwTmFtZSA9IE5VTEw7DQorICBDRlhfV2lkZVN0cmluZyogcFZhbHVlID0gTlVMTDsNCisgIG1fQXR0cmlidXRlcy5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKXBOYW1lLCAodm9pZComKXBWYWx1ZSk7DQorICB3c0F0dHIgPSAqcE5hbWU7DQorICB3c1ZhbHVlID0gKnBWYWx1ZTsNCiB9DQotdm9pZCBDWEZBX1RleHRQYXJzZUNvbnRleHQ6OlNldERlY2xzKGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24gKipwcERlY2xBcnJheSwgaW50MzJfdCBpRGVjbENvdW50KQ0KLXsNCi0gICAgaWYgKGlEZWNsQ291bnQgPD0gMCB8fCBwcERlY2xBcnJheSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgbV9kd01hdGNoZWREZWNscyA9IGlEZWNsQ291bnQ7DQotICAgIGludDMyX3QgaUJ5dGVzCSA9IGlEZWNsQ291bnQgKiBzaXplb2YoSUZERV9DU1NEZWNsYXJhdGlvbiopOw0KLSAgICBtX3BwTWF0Y2hlZERlY2xzID0gKElGREVfQ1NTRGVjbGFyYXRpb24qKilGREVfQWxsb2MoaUJ5dGVzKTsNCi0gICAgRlhfbWVtY3B5KG1fcHBNYXRjaGVkRGVjbHMsIHBwRGVjbEFycmF5LCBpQnl0ZXMpOw0KK3ZvaWQgQ1hGQV9DU1NUYWdQcm92aWRlcjo6U2V0QXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIHsNCisgIENGWF9XaWRlU3RyaW5nKiBwTmFtZSA9IEZYX05FVyBDRlhfV2lkZVN0cmluZygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcqIHBWYWx1ZSA9IEZYX05FVyBDRlhfV2lkZVN0cmluZygpOw0KKyAgKnBOYW1lID0gd3NBdHRyOw0KKyAgKnBWYWx1ZSA9IHdzVmFsdWU7DQorICBtX0F0dHJpYnV0ZXMuU2V0QXQocE5hbWUsIHBWYWx1ZSk7DQogfQ0KLUNYRkFfVGV4dFBhcnNlcjo6fkNYRkFfVGV4dFBhcnNlcigpDQotew0KLSAgICBpZiAobV9wVUFTaGVldCAhPSBOVUxMKSB7DQotICAgICAgICBtX3BVQVNoZWV0LT5SZWxlYXNlKCk7DQotICAgIH0NCi0gICAgaWYgKG1fcFNlbGVjdG9yICE9IE5VTEwpCXsNCi0gICAgICAgIG1fcFNlbGVjdG9yLT5SZWxlYXNlKCk7DQotICAgIH0NCi0gICAgaWYgKG1fcEFsbG9jYXRvciAhPSBOVUxMKQl7DQotICAgICAgICBtX3BBbGxvY2F0b3ItPlJlbGVhc2UoKTsNCi0gICAgfQ0KLSAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBzKSB7DQotICAgICAgICBJRkRFX1hNTE5vZGUgKnBYTUxOb2RlOw0KLSAgICAgICAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0ICpwUGFyc2VDb250ZXh0Ow0KLSAgICAgICAgbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuR2V0TmV4dEFzc29jKHBzLCBwWE1MTm9kZSwgcFBhcnNlQ29udGV4dCk7DQotICAgICAgICBpZiAocFBhcnNlQ29udGV4dCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgRkRFX0RlbGV0ZVdpdGgoQ1hGQV9UZXh0UGFyc2VDb250ZXh0LCBtX3BBbGxvY2F0b3IsIHBQYXJzZUNvbnRleHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LlJlbW92ZUFsbCgpOw0KK3ZvaWQgQ1hGQV9UZXh0UGFyc2VDb250ZXh0OjpTZXREZWNscyhjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uKiogcHBEZWNsQXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURlY2xDb3VudCkgew0KKyAgaWYgKGlEZWNsQ291bnQgPD0gMCB8fCBwcERlY2xBcnJheSA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fZHdNYXRjaGVkRGVjbHMgPSBpRGVjbENvdW50Ow0KKyAgaW50MzJfdCBpQnl0ZXMgPSBpRGVjbENvdW50ICogc2l6ZW9mKElGREVfQ1NTRGVjbGFyYXRpb24qKTsNCisgIG1fcHBNYXRjaGVkRGVjbHMgPSAoSUZERV9DU1NEZWNsYXJhdGlvbioqKUZERV9BbGxvYyhpQnl0ZXMpOw0KKyAgRlhfbWVtY3B5KG1fcHBNYXRjaGVkRGVjbHMsIHBwRGVjbEFycmF5LCBpQnl0ZXMpOw0KIH0NCi12b2lkIENYRkFfVGV4dFBhcnNlcjo6UmVzZXQoKQ0KLXsNCi0gICAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIHdoaWxlIChwcykgew0KLSAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MTm9kZTsNCi0gICAgICAgIENYRkFfVGV4dFBhcnNlQ29udGV4dCAqcFBhcnNlQ29udGV4dDsNCi0gICAgICAgIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldE5leHRBc3NvYyhwcywgcFhNTE5vZGUsIHBQYXJzZUNvbnRleHQpOw0KLSAgICAgICAgaWYgKHBQYXJzZUNvbnRleHQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIEZERV9EZWxldGVXaXRoKENYRkFfVGV4dFBhcnNlQ29udGV4dCwgbV9wQWxsb2NhdG9yLCBwUGFyc2VDb250ZXh0KTsNCi0gICAgICAgIH0NCitDWEZBX1RleHRQYXJzZXI6On5DWEZBX1RleHRQYXJzZXIoKSB7DQorICBpZiAobV9wVUFTaGVldCAhPSBOVUxMKSB7DQorICAgIG1fcFVBU2hlZXQtPlJlbGVhc2UoKTsNCisgIH0NCisgIGlmIChtX3BTZWxlY3RvciAhPSBOVUxMKSB7DQorICAgIG1fcFNlbGVjdG9yLT5SZWxlYXNlKCk7DQorICB9DQorICBpZiAobV9wQWxsb2NhdG9yICE9IE5VTEwpIHsNCisgICAgbV9wQWxsb2NhdG9yLT5SZWxlYXNlKCk7DQorICB9DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlOw0KKyAgICBDWEZBX1RleHRQYXJzZUNvbnRleHQqIHBQYXJzZUNvbnRleHQ7DQorICAgIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldE5leHRBc3NvYyhwcywgcFhNTE5vZGUsIHBQYXJzZUNvbnRleHQpOw0KKyAgICBpZiAocFBhcnNlQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgRkRFX0RlbGV0ZVdpdGgoQ1hGQV9UZXh0UGFyc2VDb250ZXh0LCBtX3BBbGxvY2F0b3IsIHBQYXJzZUNvbnRleHQpOw0KICAgICB9DQotICAgIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LlJlbW92ZUFsbCgpOw0KLSAgICBpZiAobV9wQWxsb2NhdG9yICE9IE5VTEwpIHsNCi0gICAgICAgIG1fcEFsbG9jYXRvci0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wQWxsb2NhdG9yID0gTlVMTDsNCi0gICAgfQ0KKyAgfQ0KKyAgbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuUmVtb3ZlQWxsKCk7DQogfQ0KLXZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpJbml0Q1NTRGF0YShJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlcikNCi17DQotICAgIGlmIChwVGV4dFByb3ZpZGVyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCit2b2lkIENYRkFfVGV4dFBhcnNlcjo6UmVzZXQoKSB7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlOw0KKyAgICBDWEZBX1RleHRQYXJzZUNvbnRleHQqIHBQYXJzZUNvbnRleHQ7DQorICAgIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldE5leHRBc3NvYyhwcywgcFhNTE5vZGUsIHBQYXJzZUNvbnRleHQpOw0KKyAgICBpZiAocFBhcnNlQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgRkRFX0RlbGV0ZVdpdGgoQ1hGQV9UZXh0UGFyc2VDb250ZXh0LCBtX3BBbGxvY2F0b3IsIHBQYXJzZUNvbnRleHQpOw0KICAgICB9DQotICAgIGlmIChtX3BTZWxlY3RvciA9PSBOVUxMKSB7DQotICAgICAgICBDWEZBX0ZGRG9jICpwRG9jID0gcFRleHRQcm92aWRlci0+R2V0RG9jTm9kZSgpOw0KLSAgICAgICAgSUZYX0ZvbnRNZ3IgKnBGb250TWdyID0gcERvYy0+R2V0QXBwKCktPkdldEZERUZvbnRNZ3IoKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwRm9udE1nciAhPSBOVUxMKTsNCi0gICAgICAgIG1fcFNlbGVjdG9yID0gSUZERV9DU1NTdHlsZVNlbGVjdG9yOjpDcmVhdGUoKTsNCi0gICAgICAgIG1fcFNlbGVjdG9yLT5TZXRGb250TWdyKHBGb250TWdyKTsNCi0gICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IDEwOw0KLSAgICAgICAgQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOw0KLSAgICAgICAgaWYgKGZvbnQuSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgICAgICBmRm9udFNpemUgPSBmb250LkdldEZvbnRTaXplKCk7DQotICAgICAgICB9DQotICAgICAgICBtX3BTZWxlY3Rvci0+U2V0RGVmRm9udFNpemUoZkZvbnRTaXplKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wVUFTaGVldCA9PSBOVUxMKSB7DQotICAgICAgICBtX3BVQVNoZWV0ID0gTG9hZERlZmF1bHRTaGVldFN0eWxlKCk7DQotICAgICAgICBtX3BTZWxlY3Rvci0+U2V0U3R5bGVTaGVldChGREVfQ1NTU1RZTEVTSEVFVEdST1VQX1VzZXJBZ2VudCwgbV9wVUFTaGVldCk7DQotICAgICAgICBtX3BTZWxlY3Rvci0+VXBkYXRlU3R5bGVJbmRleChGREVfQ1NTTUVESUFUWVBFX0FMTCk7DQotICAgIH0NCisgIH0NCisgIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LlJlbW92ZUFsbCgpOw0KKyAgaWYgKG1fcEFsbG9jYXRvciAhPSBOVUxMKSB7DQorICAgIG1fcEFsbG9jYXRvci0+UmVsZWFzZSgpOw0KKyAgICBtX3BBbGxvY2F0b3IgPSBOVUxMOw0KKyAgfQ0KIH0NCi1JRkRFX0NTU1N0eWxlU2hlZXQqCUNYRkFfVGV4dFBhcnNlcjo6TG9hZERlZmF1bHRTaGVldFN0eWxlKCkNCi17DQotICAgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiBzX3BTdHlsZVtdID0NCi0gICAgICAgICAgICBMImh0bWwsYm9keSxvbCxwLHVse2Rpc3BsYXk6YmxvY2t9Ig0KLSAgICAgICAgICAgIEwibGl7ZGlzcGxheTpsaXN0LWl0ZW19Ig0KLSAgICAgICAgICAgIEwib2wsdWx7cGFkZGluZy1sZWZ0OjMzcHh9b2x7bGlzdC1zdHlsZS10eXBlOmRlY2ltYWx9b2wsdWx7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MH11bCxvbHttYXJnaW46MS4xMmVtIDB9Ig0KLSAgICAgICAgICAgIEwiYXtjb2xvcjojMDAwMGZmO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9Yntmb250LXdlaWdodDpib2xkZXJ9aXtmb250LXN0eWxlOml0YWxpY30iDQotICAgICAgICAgICAgTCJzdXB7dmVydGljYWwtYWxpZ246KzE1ZW07Zm9udC1zaXplOi42NmVtfXN1Ynt2ZXJ0aWNhbC1hbGlnbjotMTVlbTtmb250LXNpemU6LjY2ZW19IjsNCi0gICAgcmV0dXJuIElGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZyb21CdWZmZXIoQ0ZYX1dpZGVTdHJpbmcoKSwgc19wU3R5bGUsIEZYU1lTX3djc2xlbihzX3BTdHlsZSksIEZYX0NPREVQQUdFX1VURjgpOw0KLX0NCi1JRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENYRkFfVGV4dFBhcnNlcjo6Q3JlYXRlUm9vdFN0eWxlKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyKQ0KLXsNCit2b2lkIENYRkFfVGV4dFBhcnNlcjo6SW5pdENTU0RhdGEoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpIHsNCisgIGlmIChwVGV4dFByb3ZpZGVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcFNlbGVjdG9yID09IE5VTEwpIHsNCisgICAgQ1hGQV9GRkRvYyogcERvYyA9IHBUZXh0UHJvdmlkZXItPkdldERvY05vZGUoKTsNCisgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyID0gcERvYy0+R2V0QXBwKCktPkdldEZERUZvbnRNZ3IoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBGb250TWdyICE9IE5VTEwpOw0KKyAgICBtX3BTZWxlY3RvciA9IElGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q3JlYXRlKCk7DQorICAgIG1fcFNlbGVjdG9yLT5TZXRGb250TWdyKHBGb250TWdyKTsNCisgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gMTA7DQogICAgIENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKTsNCi0gICAgQ1hGQV9QYXJhIHBhcmEgPSBwVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpOw0KLSAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSA9IG1fcFNlbGVjdG9yLT5DcmVhdGVDb21wdXRlZFN0eWxlKE5VTEwpOw0KLSAgICBJRkRFX0NTU0ZvbnRTdHlsZSAqcEZvbnRTdHlsZSA9IHBTdHlsZS0+R2V0Rm9udFN0eWxlcygpOw0KLSAgICBJRkRFX0NTU1BhcmFncmFwaFN0eWxlICpwUGFyYVN0eWxlID0gcFN0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKTsNCi0gICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSAwLCBmRm9udFNpemUgPSAxMDsNCi0gICAgaWYgKHBhcmEuSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgIGZMaW5lSGVpZ2h0ID0gcGFyYS5HZXRMaW5lSGVpZ2h0KCk7DQotICAgICAgICBGREVfQ1NTTEVOR1RIIGluZGVudDsNCi0gICAgICAgIGluZGVudC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIHBhcmEuR2V0VGV4dEluZGVudCgpKTsNCi0gICAgICAgIHBQYXJhU3R5bGUtPlNldFRleHRJbmRlbnQoaW5kZW50KTsNCi0gICAgICAgIEZERV9DU1NURVhUQUxJR04gaEFsZ2luID0gRkRFX0NTU1RFWFRBTElHTl9MZWZ0Ow0KLSAgICAgICAgc3dpdGNoIChwYXJhLkdldEhvcml6b250YWxBbGlnbigpKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQotICAgICAgICAgICAgICAgIGhBbGdpbiA9IEZERV9DU1NURVhUQUxJR05fQ2VudGVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KLSAgICAgICAgICAgICAgICBoQWxnaW4gPSBGREVfQ1NTVEVYVEFMSUdOX1JpZ2h0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnk6DQotICAgICAgICAgICAgICAgIGhBbGdpbiA9IEZERV9DU1NURVhUQUxJR05fSnVzdGlmeTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOg0KLSAgICAgICAgICAgICAgICBoQWxnaW4gPSBGREVfQ1NTVEVYVEFMSUdOX0p1c3RpZnlBbGw7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFBhcmFTdHlsZS0+U2V0VGV4dEFsaWduKGhBbGdpbik7DQotICAgICAgICBGREVfQ1NTUkVDVCBydE1hcmdpbldpZHRoOw0KLSAgICAgICAgcnRNYXJnaW5XaWR0aC5sZWZ0LlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcGFyYS5HZXRNYXJnaW5MZWZ0KCkpOw0KLSAgICAgICAgcnRNYXJnaW5XaWR0aC50b3AuU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBwYXJhLkdldFNwYWNlQWJvdmUoKSk7DQotICAgICAgICBydE1hcmdpbldpZHRoLnJpZ2h0LlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcGFyYS5HZXRNYXJnaW5SaWdodCgpKTsNCi0gICAgICAgIHJ0TWFyZ2luV2lkdGguYm90dG9tLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcGFyYS5HZXRTcGFjZUJlbG93KCkpOw0KLSAgICAgICAgcFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5TZXRNYXJnaW5XaWR0aChydE1hcmdpbldpZHRoKTsNCi0gICAgfQ0KICAgICBpZiAoZm9udC5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgcEZvbnRTdHlsZS0+U2V0Q29sb3IoZm9udC5HZXRDb2xvcigpKTsNCi0gICAgICAgIHBGb250U3R5bGUtPlNldEZvbnRTdHlsZShmb250LklzSXRhbGljKCkgPyBGREVfQ1NTRk9OVFNUWUxFX0l0YWxpYyA6IEZERV9DU1NGT05UU1RZTEVfTm9ybWFsKTsNCi0gICAgICAgIHBGb250U3R5bGUtPlNldEZvbnRXZWlnaHQoZm9udC5Jc0JvbGQoKSA/IEZYRk9OVF9GV19CT0xEIDogRlhGT05UX0ZXX05PUk1BTCk7DQotICAgICAgICBwUGFyYVN0eWxlLT5TZXROdW1iZXJWZXJ0aWNhbEFsaWduKC1mb250LkdldEJhc2VsaW5lU2hpZnQoKSk7DQotICAgICAgICBmRm9udFNpemUgPSBmb250LkdldEZvbnRTaXplKCk7DQotICAgICAgICBGREVfQ1NTTEVOR1RIIGxldHRlclNwYWNpbmc7DQotICAgICAgICBsZXR0ZXJTcGFjaW5nLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgZm9udC5HZXRMZXR0ZXJTcGFjaW5nKCkpOw0KLSAgICAgICAgcFBhcmFTdHlsZS0+U2V0TGV0dGVyU3BhY2luZyhsZXR0ZXJTcGFjaW5nKTsNCi0gICAgICAgIEZYX0RXT1JEIGR3RGVjb3JhdGlvbiA9IDA7DQotICAgICAgICBpZiAoZm9udC5HZXRMaW5lVGhyb3VnaCgpID4gMCkJew0KLSAgICAgICAgICAgIGR3RGVjb3JhdGlvbiB8PSBGREVfQ1NTVEVYVERFQ09SQVRJT05fTGluZVRocm91Z2g7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZm9udC5HZXRVbmRlcmxpbmUoKSA+IDEpIHsNCi0gICAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0RvdWJsZTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZm9udC5HZXRVbmRlcmxpbmUoKSA+IDApIHsNCi0gICAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX1VuZGVybGluZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBQYXJhU3R5bGUtPlNldFRleHREZWNvcmF0aW9uKGR3RGVjb3JhdGlvbik7DQorICAgICAgZkZvbnRTaXplID0gZm9udC5HZXRGb250U2l6ZSgpOw0KICAgICB9DQotICAgIHBQYXJhU3R5bGUtPlNldExpbmVIZWlnaHQoZkxpbmVIZWlnaHQpOw0KLSAgICBwRm9udFN0eWxlLT5TZXRGb250U2l6ZShmRm9udFNpemUpOw0KLSAgICByZXR1cm4gcFN0eWxlOw0KKyAgICBtX3BTZWxlY3Rvci0+U2V0RGVmRm9udFNpemUoZkZvbnRTaXplKTsNCisgIH0NCisgIGlmIChtX3BVQVNoZWV0ID09IE5VTEwpIHsNCisgICAgbV9wVUFTaGVldCA9IExvYWREZWZhdWx0U2hlZXRTdHlsZSgpOw0KKyAgICBtX3BTZWxlY3Rvci0+U2V0U3R5bGVTaGVldChGREVfQ1NTU1RZTEVTSEVFVEdST1VQX1VzZXJBZ2VudCwgbV9wVUFTaGVldCk7DQorICAgIG1fcFNlbGVjdG9yLT5VcGRhdGVTdHlsZUluZGV4KEZERV9DU1NNRURJQVRZUEVfQUxMKTsNCisgIH0NCiB9DQotSUZERV9DU1NDb21wdXRlZFN0eWxlKiBDWEZBX1RleHRQYXJzZXI6OkNyZWF0ZVN0eWxlKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFBhcmVudFN0eWxlKQ0KLXsNCi0gICAgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwTmV3U3R5bGUgPSBtX3BTZWxlY3Rvci0+Q3JlYXRlQ29tcHV0ZWRTdHlsZShwUGFyZW50U3R5bGUpOw0KLSAgICBGWFNZU19hc3NlcnQocE5ld1N0eWxlICE9IE5VTEwpOw0KLSAgICBpZiAocFBhcmVudFN0eWxlKSB7DQotICAgICAgICBJRkRFX0NTU1BhcmFncmFwaFN0eWxlICpwUGFyYVN0eWxlID0gcFBhcmVudFN0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKTsNCi0gICAgICAgIEZYX0RXT1JEIGR3RGVjb3JhdGlvbiA9IHBQYXJhU3R5bGUtPkdldFRleHREZWNvcmF0aW9uKCk7DQotICAgICAgICBGWF9GTE9BVCBmQmFzZUxpbmUgPSAwOw0KLSAgICAgICAgaWYgKHBQYXJhU3R5bGUtPkdldFZlcnRpY2FsQWxpZ24oKSA9PSBGREVfQ1NTVkVSVElDQUxBTElHTl9OdW1iZXIpIHsNCi0gICAgICAgICAgICBmQmFzZUxpbmUgPSBwUGFyYVN0eWxlLT5HZXROdW1iZXJWZXJ0aWNhbEFsaWduKCk7DQotICAgICAgICB9DQotICAgICAgICBwUGFyYVN0eWxlID0gcE5ld1N0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKTsNCi0gICAgICAgIHBQYXJhU3R5bGUtPlNldFRleHREZWNvcmF0aW9uKGR3RGVjb3JhdGlvbik7DQotICAgICAgICBwUGFyYVN0eWxlLT5TZXROdW1iZXJWZXJ0aWNhbEFsaWduKGZCYXNlTGluZSk7DQotICAgICAgICBJRkRFX0NTU0JvdW5kYXJ5U3R5bGUgKnBCb3VuZGFyeXR5bGUgPSBwUGFyZW50U3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCk7DQotICAgICAgICBjb25zdCBGREVfQ1NTUkVDVCAqcFJlY3QgPSBwQm91bmRhcnl0eWxlLT5HZXRNYXJnaW5XaWR0aCgpOw0KLSAgICAgICAgaWYgKHBSZWN0ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBwQm91bmRhcnl0eWxlID0gcE5ld1N0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpOw0KLSAgICAgICAgICAgIHBCb3VuZGFyeXR5bGUtPlNldE1hcmdpbldpZHRoKCpwUmVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIHBOZXdTdHlsZTsNCitJRkRFX0NTU1N0eWxlU2hlZXQqIENYRkFfVGV4dFBhcnNlcjo6TG9hZERlZmF1bHRTaGVldFN0eWxlKCkgew0KKyAgc3RhdGljIGNvbnN0IEZYX1dDSEFSIHNfcFN0eWxlW10gPQ0KKyAgICAgIEwiaHRtbCxib2R5LG9sLHAsdWx7ZGlzcGxheTpibG9ja30iDQorICAgICAgTCJsaXtkaXNwbGF5Omxpc3QtaXRlbX0iDQorICAgICAgTCJvbCx1bHtwYWRkaW5nLWxlZnQ6MzNweH1vbHtsaXN0LXN0eWxlLXR5cGU6ZGVjaW1hbH1vbCx1bHttYXJnaW4tdG9wOjA7Ig0KKyAgICAgIEwibWFyZ2luLWJvdHRvbTowfXVsLG9se21hcmdpbjoxLjEyZW0gMH0iDQorICAgICAgTCJhe2NvbG9yOiMwMDAwZmY7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1ie2ZvbnQtd2VpZ2h0OmJvbGRlcn1pe2ZvbnQtIg0KKyAgICAgIEwic3R5bGU6aXRhbGljfSINCisgICAgICBMInN1cHt2ZXJ0aWNhbC1hbGlnbjorMTVlbTtmb250LXNpemU6LjY2ZW19c3Vie3ZlcnRpY2FsLWFsaWduOi0xNWVtO2ZvbnQtIg0KKyAgICAgIEwic2l6ZTouNjZlbX0iOw0KKyAgcmV0dXJuIElGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZyb21CdWZmZXIoDQorICAgICAgQ0ZYX1dpZGVTdHJpbmcoKSwgc19wU3R5bGUsIEZYU1lTX3djc2xlbihzX3BTdHlsZSksIEZYX0NPREVQQUdFX1VURjgpOw0KIH0NCi1JRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENYRkFfVGV4dFBhcnNlcjo6Q29tcHV0ZVN0eWxlKElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFBhcmVudFN0eWxlKQ0KLXsNCi0gICAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0ICpwQ29udGV4dCA9IChDWEZBX1RleHRQYXJzZUNvbnRleHQqKW1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldFZhbHVlQXQocFhNTE5vZGUpOw0KLSAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQorSUZERV9DU1NDb21wdXRlZFN0eWxlKiBDWEZBX1RleHRQYXJzZXI6OkNyZWF0ZVJvb3RTdHlsZSgNCisgICAgSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpIHsNCisgIENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKTsNCisgIENYRkFfUGFyYSBwYXJhID0gcFRleHRQcm92aWRlci0+R2V0UGFyYU5vZGUoKTsNCisgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlID0gbV9wU2VsZWN0b3ItPkNyZWF0ZUNvbXB1dGVkU3R5bGUoTlVMTCk7DQorICBJRkRFX0NTU0ZvbnRTdHlsZSogcEZvbnRTdHlsZSA9IHBTdHlsZS0+R2V0Rm9udFN0eWxlcygpOw0KKyAgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSogcFBhcmFTdHlsZSA9IHBTdHlsZS0+R2V0UGFyYWdyYXBoU3R5bGVzKCk7DQorICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IDAsIGZGb250U2l6ZSA9IDEwOw0KKyAgaWYgKHBhcmEuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgZkxpbmVIZWlnaHQgPSBwYXJhLkdldExpbmVIZWlnaHQoKTsNCisgICAgRkRFX0NTU0xFTkdUSCBpbmRlbnQ7DQorICAgIGluZGVudC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIHBhcmEuR2V0VGV4dEluZGVudCgpKTsNCisgICAgcFBhcmFTdHlsZS0+U2V0VGV4dEluZGVudChpbmRlbnQpOw0KKyAgICBGREVfQ1NTVEVYVEFMSUdOIGhBbGdpbiA9IEZERV9DU1NURVhUQUxJR05fTGVmdDsNCisgICAgc3dpdGNoIChwYXJhLkdldEhvcml6b250YWxBbGlnbigpKSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICBoQWxnaW4gPSBGREVfQ1NTVEVYVEFMSUdOX0NlbnRlcjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICBoQWxnaW4gPSBGREVfQ1NTVEVYVEFMSUdOX1JpZ2h0Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5Og0KKyAgICAgICAgaEFsZ2luID0gRkRFX0NTU1RFWFRBTElHTl9KdXN0aWZ5Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOg0KKyAgICAgICAgaEFsZ2luID0gRkRFX0NTU1RFWFRBTElHTl9KdXN0aWZ5QWxsOw0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcENvbnRleHQtPm1fcFBhcmVudFN0eWxlID0gcFBhcmVudFN0eWxlOw0KLSAgICBDWEZBX0NTU1RhZ1Byb3ZpZGVyIHRhZ1Byb3ZpZGVyOw0KLSAgICBQYXJzZVRhZ0luZm8ocFhNTE5vZGUsIHRhZ1Byb3ZpZGVyKTsNCi0gICAgaWYgKHRhZ1Byb3ZpZGVyLm1fYkNvbnRlbnQpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KKyAgICBwUGFyYVN0eWxlLT5TZXRUZXh0QWxpZ24oaEFsZ2luKTsNCisgICAgRkRFX0NTU1JFQ1QgcnRNYXJnaW5XaWR0aDsNCisgICAgcnRNYXJnaW5XaWR0aC5sZWZ0LlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcGFyYS5HZXRNYXJnaW5MZWZ0KCkpOw0KKyAgICBydE1hcmdpbldpZHRoLnRvcC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIHBhcmEuR2V0U3BhY2VBYm92ZSgpKTsNCisgICAgcnRNYXJnaW5XaWR0aC5yaWdodC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIHBhcmEuR2V0TWFyZ2luUmlnaHQoKSk7DQorICAgIHJ0TWFyZ2luV2lkdGguYm90dG9tLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcGFyYS5HZXRTcGFjZUJlbG93KCkpOw0KKyAgICBwU3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCktPlNldE1hcmdpbldpZHRoKHJ0TWFyZ2luV2lkdGgpOw0KKyAgfQ0KKyAgaWYgKGZvbnQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgcEZvbnRTdHlsZS0+U2V0Q29sb3IoZm9udC5HZXRDb2xvcigpKTsNCisgICAgcEZvbnRTdHlsZS0+U2V0Rm9udFN0eWxlKGZvbnQuSXNJdGFsaWMoKSA/IEZERV9DU1NGT05UU1RZTEVfSXRhbGljDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGREVfQ1NTRk9OVFNUWUxFX05vcm1hbCk7DQorICAgIHBGb250U3R5bGUtPlNldEZvbnRXZWlnaHQoZm9udC5Jc0JvbGQoKSA/IEZYRk9OVF9GV19CT0xEDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYRk9OVF9GV19OT1JNQUwpOw0KKyAgICBwUGFyYVN0eWxlLT5TZXROdW1iZXJWZXJ0aWNhbEFsaWduKC1mb250LkdldEJhc2VsaW5lU2hpZnQoKSk7DQorICAgIGZGb250U2l6ZSA9IGZvbnQuR2V0Rm9udFNpemUoKTsNCisgICAgRkRFX0NTU0xFTkdUSCBsZXR0ZXJTcGFjaW5nOw0KKyAgICBsZXR0ZXJTcGFjaW5nLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgZm9udC5HZXRMZXR0ZXJTcGFjaW5nKCkpOw0KKyAgICBwUGFyYVN0eWxlLT5TZXRMZXR0ZXJTcGFjaW5nKGxldHRlclNwYWNpbmcpOw0KKyAgICBGWF9EV09SRCBkd0RlY29yYXRpb24gPSAwOw0KKyAgICBpZiAoZm9udC5HZXRMaW5lVGhyb3VnaCgpID4gMCkgew0KKyAgICAgIGR3RGVjb3JhdGlvbiB8PSBGREVfQ1NTVEVYVERFQ09SQVRJT05fTGluZVRocm91Z2g7DQogICAgIH0NCi0gICAgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUJPSBDcmVhdGVTdHlsZShwUGFyZW50U3R5bGUpOw0KLSAgICBJRkRFX0NTU0FjY2VsZXJhdG9yICpwQ1NTQWNjZWwJPSBtX3BTZWxlY3Rvci0+SW5pdEFjY2VsZXJhdG9yKCk7DQotICAgIHBDU1NBY2NlbC0+T25FbnRlclRhZygmdGFnUHJvdmlkZXIpOw0KLSAgICBtX3BTZWxlY3Rvci0+Q29tcHV0ZVN0eWxlKCZ0YWdQcm92aWRlciwgcENvbnRleHQtPkdldERlY2xzKCksIHBDb250ZXh0LT5Db3VudERlY2xzKCksIHBTdHlsZSk7DQotICAgIHBDU1NBY2NlbC0+T25MZWF2ZVRhZygmdGFnUHJvdmlkZXIpOw0KLSAgICByZXR1cm4gcFN0eWxlOw0KKyAgICBpZiAoZm9udC5HZXRVbmRlcmxpbmUoKSA+IDEpIHsNCisgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0RvdWJsZTsNCisgICAgfSBlbHNlIGlmIChmb250LkdldFVuZGVybGluZSgpID4gMCkgew0KKyAgICAgIGR3RGVjb3JhdGlvbiB8PSBGREVfQ1NTVEVYVERFQ09SQVRJT05fVW5kZXJsaW5lOw0KKyAgICB9DQorICAgIHBQYXJhU3R5bGUtPlNldFRleHREZWNvcmF0aW9uKGR3RGVjb3JhdGlvbik7DQorICB9DQorICBwUGFyYVN0eWxlLT5TZXRMaW5lSGVpZ2h0KGZMaW5lSGVpZ2h0KTsNCisgIHBGb250U3R5bGUtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQorICByZXR1cm4gcFN0eWxlOw0KIH0NCi12b2lkIENYRkFfVGV4dFBhcnNlcjo6RG9QYXJzZShJRkRFX1hNTE5vZGUgKnBYTUxDb250YWluZXIsIElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyKQ0KLXsNCi0gICAgaWYgKHBYTUxDb250YWluZXIgPT0gTlVMTCB8fCBwVGV4dFByb3ZpZGVyID09IE5VTEwgfHwgbV9wQWxsb2NhdG9yICE9IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCitJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENYRkFfVGV4dFBhcnNlcjo6Q3JlYXRlU3R5bGUoDQorICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKSB7DQorICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBOZXdTdHlsZSA9DQorICAgICAgbV9wU2VsZWN0b3ItPkNyZWF0ZUNvbXB1dGVkU3R5bGUocFBhcmVudFN0eWxlKTsNCisgIEZYU1lTX2Fzc2VydChwTmV3U3R5bGUgIT0gTlVMTCk7DQorICBpZiAocFBhcmVudFN0eWxlKSB7DQorICAgIElGREVfQ1NTUGFyYWdyYXBoU3R5bGUqIHBQYXJhU3R5bGUgPSBwUGFyZW50U3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpOw0KKyAgICBGWF9EV09SRCBkd0RlY29yYXRpb24gPSBwUGFyYVN0eWxlLT5HZXRUZXh0RGVjb3JhdGlvbigpOw0KKyAgICBGWF9GTE9BVCBmQmFzZUxpbmUgPSAwOw0KKyAgICBpZiAocFBhcmFTdHlsZS0+R2V0VmVydGljYWxBbGlnbigpID09IEZERV9DU1NWRVJUSUNBTEFMSUdOX051bWJlcikgew0KKyAgICAgIGZCYXNlTGluZSA9IHBQYXJhU3R5bGUtPkdldE51bWJlclZlcnRpY2FsQWxpZ24oKTsNCiAgICAgfQ0KLSAgICBtX3BBbGxvY2F0b3IgPSBGWF9DcmVhdGVBbGxvY2F0b3IoRlhfQUxMT0NUWVBFX0ZpeGVkLCAzMiwgc2l6ZW9mKENYRkFfQ1NTVGFnUHJvdmlkZXIpKTsNCi0gICAgSW5pdENTU0RhdGEocFRleHRQcm92aWRlcik7DQotICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFJvb3RTdHlsZSA9IENyZWF0ZVJvb3RTdHlsZShwVGV4dFByb3ZpZGVyKTsNCi0gICAgUGFyc2VSaWNoVGV4dChwWE1MQ29udGFpbmVyLCBwUm9vdFN0eWxlKTsNCi0gICAgcFJvb3RTdHlsZS0+UmVsZWFzZSgpOw0KKyAgICBwUGFyYVN0eWxlID0gcE5ld1N0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKTsNCisgICAgcFBhcmFTdHlsZS0+U2V0VGV4dERlY29yYXRpb24oZHdEZWNvcmF0aW9uKTsNCisgICAgcFBhcmFTdHlsZS0+U2V0TnVtYmVyVmVydGljYWxBbGlnbihmQmFzZUxpbmUpOw0KKyAgICBJRkRFX0NTU0JvdW5kYXJ5U3R5bGUqIHBCb3VuZGFyeXR5bGUgPSBwUGFyZW50U3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCk7DQorICAgIGNvbnN0IEZERV9DU1NSRUNUKiBwUmVjdCA9IHBCb3VuZGFyeXR5bGUtPkdldE1hcmdpbldpZHRoKCk7DQorICAgIGlmIChwUmVjdCAhPSBOVUxMKSB7DQorICAgICAgcEJvdW5kYXJ5dHlsZSA9IHBOZXdTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKTsNCisgICAgICBwQm91bmRhcnl0eWxlLT5TZXRNYXJnaW5XaWR0aCgqcFJlY3QpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcE5ld1N0eWxlOw0KIH0NCi12b2lkIENYRkFfVGV4dFBhcnNlcjo6UGFyc2VSaWNoVGV4dChJRkRFX1hNTE5vZGUgKnBYTUxOb2RlLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBQYXJlbnRTdHlsZSkNCi17DQotICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9DU1NUYWdQcm92aWRlciB0YWdQcm92aWRlcjsNCi0gICAgUGFyc2VUYWdJbmZvKHBYTUxOb2RlLCB0YWdQcm92aWRlcik7DQotICAgIGlmICghdGFnUHJvdmlkZXIubV9iVGFnQXZpbGlhYmxlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwTmV3U3R5bGUgPSBOVUxMOw0KLSAgICBpZiAoKHRhZ1Byb3ZpZGVyLkdldFRhZ05hbWUoKSAhPSBGWF9XU1RSQyhMImJvZHkiKSkgfHwgKHRhZ1Byb3ZpZGVyLkdldFRhZ05hbWUoKSAhPSBGWF9XU1RSQyhMImh0bWwiKSkgKSB7DQotICAgICAgICBDWEZBX1RleHRQYXJzZUNvbnRleHQgKnBUZXh0Q29udGV4dCA9IEZERV9OZXdXaXRoKG1fcEFsbG9jYXRvcilDWEZBX1RleHRQYXJzZUNvbnRleHQ7DQotICAgICAgICBGREVfQ1NTRElTUExBWSBlRGlzcGxheSA9IEZERV9DU1NESVNQTEFZX0lubGluZTsNCi0gICAgICAgIGlmICghdGFnUHJvdmlkZXIubV9iQ29udGVudCkgew0KLSAgICAgICAgICAgIHBOZXdTdHlsZSA9IENyZWF0ZVN0eWxlKHBQYXJlbnRTdHlsZSk7DQotICAgICAgICAgICAgSUZERV9DU1NBY2NlbGVyYXRvciAqcENTU0FjY2VsID0gbV9wU2VsZWN0b3ItPkluaXRBY2NlbGVyYXRvcigpOw0KLSAgICAgICAgICAgIHBDU1NBY2NlbC0+T25FbnRlclRhZygmdGFnUHJvdmlkZXIpOw0KLSAgICAgICAgICAgIENGREVfQ1NTRGVjbGFyYXRpb25BcnJheSBEZWNsQXJyYXk7DQotICAgICAgICAgICAgaW50MzJfdCBpTWF0Y2hlZERlY2xzID0gbV9wU2VsZWN0b3ItPk1hdGNoRGVjbGFyYXRpb25zKCZ0YWdQcm92aWRlciwgRGVjbEFycmF5KTsNCi0gICAgICAgICAgICBjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uICoqcHBNYXRjaERlY2xzID0gKGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24gKiopRGVjbEFycmF5LkdldERhdGEoKTsNCi0gICAgICAgICAgICBtX3BTZWxlY3Rvci0+Q29tcHV0ZVN0eWxlKCZ0YWdQcm92aWRlciwgcHBNYXRjaERlY2xzLCBpTWF0Y2hlZERlY2xzLCBwTmV3U3R5bGUpOw0KLSAgICAgICAgICAgIHBDU1NBY2NlbC0+T25MZWF2ZVRhZygmdGFnUHJvdmlkZXIpOw0KLSAgICAgICAgICAgIGlmIChpTWF0Y2hlZERlY2xzID4gMCkgew0KLSAgICAgICAgICAgICAgICBwVGV4dENvbnRleHQtPlNldERlY2xzKHBwTWF0Y2hEZWNscywgaU1hdGNoZWREZWNscyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVEaXNwbGF5ID0gcE5ld1N0eWxlLT5HZXRQb3NpdGlvblN0eWxlcygpLT5HZXREaXNwbGF5KCk7DQotICAgICAgICB9DQotICAgICAgICBwVGV4dENvbnRleHQtPlNldERpc3BsYXkoZURpc3BsYXkpOw0KLSAgICAgICAgbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuU2V0QXQocFhNTE5vZGUsIHBUZXh0Q29udGV4dCk7DQotICAgIH0NCi0gICAgZm9yKElGREVfWE1MTm9kZSAqcFhNTENoaWxkID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7IHBYTUxDaGlsZDsgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KLSAgICAgICAgUGFyc2VSaWNoVGV4dChwWE1MQ2hpbGQsIHBOZXdTdHlsZSk7DQotICAgIH0NCi0gICAgaWYgKHBOZXdTdHlsZSAhPSBOVUxMKSB7DQotICAgICAgICBwTmV3U3R5bGUtPlJlbGVhc2UoKTsNCi0gICAgfQ0KK0lGREVfQ1NTQ29tcHV0ZWRTdHlsZSogQ1hGQV9UZXh0UGFyc2VyOjpDb21wdXRlU3R5bGUoDQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKSB7DQorICBDWEZBX1RleHRQYXJzZUNvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiltX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5HZXRWYWx1ZUF0KHBYTUxOb2RlKTsNCisgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcENvbnRleHQtPm1fcFBhcmVudFN0eWxlID0gcFBhcmVudFN0eWxlOw0KKyAgQ1hGQV9DU1NUYWdQcm92aWRlciB0YWdQcm92aWRlcjsNCisgIFBhcnNlVGFnSW5mbyhwWE1MTm9kZSwgdGFnUHJvdmlkZXIpOw0KKyAgaWYgKHRhZ1Byb3ZpZGVyLm1fYkNvbnRlbnQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSA9IENyZWF0ZVN0eWxlKHBQYXJlbnRTdHlsZSk7DQorICBJRkRFX0NTU0FjY2VsZXJhdG9yKiBwQ1NTQWNjZWwgPSBtX3BTZWxlY3Rvci0+SW5pdEFjY2VsZXJhdG9yKCk7DQorICBwQ1NTQWNjZWwtPk9uRW50ZXJUYWcoJnRhZ1Byb3ZpZGVyKTsNCisgIG1fcFNlbGVjdG9yLT5Db21wdXRlU3R5bGUoJnRhZ1Byb3ZpZGVyLCBwQ29udGV4dC0+R2V0RGVjbHMoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPkNvdW50RGVjbHMoKSwgcFN0eWxlKTsNCisgIHBDU1NBY2NlbC0+T25MZWF2ZVRhZygmdGFnUHJvdmlkZXIpOw0KKyAgcmV0dXJuIHBTdHlsZTsNCiB9DQotdm9pZCBDWEZBX1RleHRQYXJzZXI6OlBhcnNlVGFnSW5mbyhJRkRFX1hNTE5vZGUgKnBYTUxOb2RlLCBDWEZBX0NTU1RhZ1Byb3ZpZGVyICZ0YWdQcm92aWRlcikNCi17DQotICAgIHN0YXRpYyBjb25zdCBGWF9EV09SRCBzX1hGQVRhZ05hbWVbXSA9IHsNCi0gICAgICAgIDB4NjEsDQotICAgICAgICAweDYyLA0KLSAgICAgICAgMHg2OSwNCi0gICAgICAgIDB4NzAsDQotICAgICAgICAweDAwMDFmNzE0LA0KLSAgICAgICAgMHgwMDAyMmE1NSwNCi0gICAgICAgIDB4MDAwMjM5YmIsDQotICAgICAgICAweDAwMDI1ODgxLA0KLSAgICAgICAgMHgwYmQzN2ZhYSwNCi0gICAgICAgIDB4MGJkMzdmYjgsDQotICAgICAgICAweGE3M2UzYWYyLA0KLSAgICAgICAgMHhiMTgyZWFhZSwNCi0gICAgICAgIDB4ZGI4YWM0NTUsDQotICAgIH07DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCi0gICAgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgSUZERV9YTUxFbGVtZW50ICpwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQgKilwWE1MTm9kZTsNCi0gICAgICAgIHBYTUxFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUod3NOYW1lKTsNCi0gICAgICAgIHRhZ1Byb3ZpZGVyLlNldFRhZ05hbWVPYmood3NOYW1lKTsNCi0gICAgICAgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUsIHdzTmFtZS5HZXRMZW5ndGgoKSwgVFJVRSk7DQotICAgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBzX2lDb3VudCA9IHNpemVvZihzX1hGQVRhZ05hbWUpIC8gc2l6ZW9mKEZYX0RXT1JEKTsNCi0gICAgICAgIENGWF9EU1BBVGVtcGxhdGU8RlhfRFdPUkQ+IGxvb2t1cDsNCi0gICAgICAgIHRhZ1Byb3ZpZGVyLm1fYlRhZ0F2aWxpYWJsZSA9IGxvb2t1cC5Mb29rdXAoZHdIYXNoQ29kZSwgc19YRkFUYWdOYW1lLCBzX2lDb3VudCkgPiAtMTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgICAgICBwWE1MRWxlbWVudC0+R2V0U3RyaW5nKEZYX1dTVFJDKEwic3R5bGUiKS5HZXRQdHIoKSwgd3NWYWx1ZSk7DQotICAgICAgICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgdGFnUHJvdmlkZXIuU2V0QXR0cmlidXRlKEZYX1dTVFJDKEwic3R5bGUiKSwgd3NWYWx1ZSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9UZXh0KSB7DQotICAgICAgICB0YWdQcm92aWRlci5tX2JUYWdBdmlsaWFibGUgPSBUUlVFOw0KLSAgICAgICAgdGFnUHJvdmlkZXIubV9iQ29udGVudCA9IFRSVUU7DQotICAgIH0NCit2b2lkIENYRkFfVGV4dFBhcnNlcjo6RG9QYXJzZShJRkRFX1hNTE5vZGUqIHBYTUxDb250YWluZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpIHsNCisgIGlmIChwWE1MQ29udGFpbmVyID09IE5VTEwgfHwgcFRleHRQcm92aWRlciA9PSBOVUxMIHx8IG1fcEFsbG9jYXRvciAhPSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcEFsbG9jYXRvciA9DQorICAgICAgRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9GaXhlZCwgMzIsIHNpemVvZihDWEZBX0NTU1RhZ1Byb3ZpZGVyKSk7DQorICBJbml0Q1NTRGF0YShwVGV4dFByb3ZpZGVyKTsNCisgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFJvb3RTdHlsZSA9IENyZWF0ZVJvb3RTdHlsZShwVGV4dFByb3ZpZGVyKTsNCisgIFBhcnNlUmljaFRleHQocFhNTENvbnRhaW5lciwgcFJvb3RTdHlsZSk7DQorICBwUm9vdFN0eWxlLT5SZWxlYXNlKCk7DQogfQ0KLWludDMyX3QgQ1hGQV9UZXh0UGFyc2VyOjpHZXRWQWxnaW4oSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIpIGNvbnN0DQotew0KLSAgICBpbnQzMl90IGlBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsNCi0gICAgQ1hGQV9QYXJhIHBhcmEgPSBwVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpOw0KLSAgICBpZiAocGFyYS5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgaUFsaWduID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7DQordm9pZCBDWEZBX1RleHRQYXJzZXI6OlBhcnNlUmljaFRleHQoSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSkgew0KKyAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9DU1NUYWdQcm92aWRlciB0YWdQcm92aWRlcjsNCisgIFBhcnNlVGFnSW5mbyhwWE1MTm9kZSwgdGFnUHJvdmlkZXIpOw0KKyAgaWYgKCF0YWdQcm92aWRlci5tX2JUYWdBdmlsaWFibGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwTmV3U3R5bGUgPSBOVUxMOw0KKyAgaWYgKCh0YWdQcm92aWRlci5HZXRUYWdOYW1lKCkgIT0gRlhfV1NUUkMoTCJib2R5IikpIHx8DQorICAgICAgKHRhZ1Byb3ZpZGVyLkdldFRhZ05hbWUoKSAhPSBGWF9XU1RSQyhMImh0bWwiKSkpIHsNCisgICAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiBwVGV4dENvbnRleHQgPQ0KKyAgICAgICAgRkRFX05ld1dpdGgobV9wQWxsb2NhdG9yKSBDWEZBX1RleHRQYXJzZUNvbnRleHQ7DQorICAgIEZERV9DU1NESVNQTEFZIGVEaXNwbGF5ID0gRkRFX0NTU0RJU1BMQVlfSW5saW5lOw0KKyAgICBpZiAoIXRhZ1Byb3ZpZGVyLm1fYkNvbnRlbnQpIHsNCisgICAgICBwTmV3U3R5bGUgPSBDcmVhdGVTdHlsZShwUGFyZW50U3R5bGUpOw0KKyAgICAgIElGREVfQ1NTQWNjZWxlcmF0b3IqIHBDU1NBY2NlbCA9IG1fcFNlbGVjdG9yLT5Jbml0QWNjZWxlcmF0b3IoKTsNCisgICAgICBwQ1NTQWNjZWwtPk9uRW50ZXJUYWcoJnRhZ1Byb3ZpZGVyKTsNCisgICAgICBDRkRFX0NTU0RlY2xhcmF0aW9uQXJyYXkgRGVjbEFycmF5Ow0KKyAgICAgIGludDMyX3QgaU1hdGNoZWREZWNscyA9DQorICAgICAgICAgIG1fcFNlbGVjdG9yLT5NYXRjaERlY2xhcmF0aW9ucygmdGFnUHJvdmlkZXIsIERlY2xBcnJheSk7DQorICAgICAgY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbioqIHBwTWF0Y2hEZWNscyA9DQorICAgICAgICAgIChjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uKiopRGVjbEFycmF5LkdldERhdGEoKTsNCisgICAgICBtX3BTZWxlY3Rvci0+Q29tcHV0ZVN0eWxlKCZ0YWdQcm92aWRlciwgcHBNYXRjaERlY2xzLCBpTWF0Y2hlZERlY2xzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5ld1N0eWxlKTsNCisgICAgICBwQ1NTQWNjZWwtPk9uTGVhdmVUYWcoJnRhZ1Byb3ZpZGVyKTsNCisgICAgICBpZiAoaU1hdGNoZWREZWNscyA+IDApIHsNCisgICAgICAgIHBUZXh0Q29udGV4dC0+U2V0RGVjbHMocHBNYXRjaERlY2xzLCBpTWF0Y2hlZERlY2xzKTsNCisgICAgICB9DQorICAgICAgZURpc3BsYXkgPSBwTmV3U3R5bGUtPkdldFBvc2l0aW9uU3R5bGVzKCktPkdldERpc3BsYXkoKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gaUFsaWduOw0KKyAgICBwVGV4dENvbnRleHQtPlNldERpc3BsYXkoZURpc3BsYXkpOw0KKyAgICBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5TZXRBdChwWE1MTm9kZSwgcFRleHRDb250ZXh0KTsNCisgIH0NCisgIGZvciAoSUZERV9YTUxOb2RlKiBwWE1MQ2hpbGQgPQ0KKyAgICAgICAgICAgcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgIHBYTUxDaGlsZDsNCisgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICBQYXJzZVJpY2hUZXh0KHBYTUxDaGlsZCwgcE5ld1N0eWxlKTsNCisgIH0NCisgIGlmIChwTmV3U3R5bGUgIT0gTlVMTCkgew0KKyAgICBwTmV3U3R5bGUtPlJlbGVhc2UoKTsNCisgIH0NCiB9DQotRlhfRkxPQVQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRUYWJJbnRlcnZhbChJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkgY29uc3QNCi17DQordm9pZCBDWEZBX1RleHRQYXJzZXI6OlBhcnNlVGFnSW5mbyhJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9DU1NUYWdQcm92aWRlciYgdGFnUHJvdmlkZXIpIHsNCisgIHN0YXRpYyBjb25zdCBGWF9EV09SRCBzX1hGQVRhZ05hbWVbXSA9IHsNCisgICAgICAweDYxLCAgICAgICAweDYyLCAgICAgICAweDY5LCAgICAgICAweDcwLCAgICAgICAweDAwMDFmNzE0LA0KKyAgICAgIDB4MDAwMjJhNTUsIDB4MDAwMjM5YmIsIDB4MDAwMjU4ODEsIDB4MGJkMzdmYWEsIDB4MGJkMzdmYjgsDQorICAgICAgMHhhNzNlM2FmMiwgMHhiMTgyZWFhZSwgMHhkYjhhYzQ1NSwNCisgIH07DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgIElGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZTsNCisgICAgcFhNTEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c05hbWUpOw0KKyAgICB0YWdQcm92aWRlci5TZXRUYWdOYW1lT2JqKHdzTmFtZSk7DQorICAgIEZYX0RXT1JEIGR3SGFzaENvZGUgPQ0KKyAgICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLCB3c05hbWUuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBzX2lDb3VudCA9IHNpemVvZihzX1hGQVRhZ05hbWUpIC8gc2l6ZW9mKEZYX0RXT1JEKTsNCisgICAgQ0ZYX0RTUEFUZW1wbGF0ZTxGWF9EV09SRD4gbG9va3VwOw0KKyAgICB0YWdQcm92aWRlci5tX2JUYWdBdmlsaWFibGUgPQ0KKyAgICAgICAgbG9va3VwLkxvb2t1cChkd0hhc2hDb2RlLCBzX1hGQVRhZ05hbWUsIHNfaUNvdW50KSA+IC0xOw0KICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICBpZiAocFN0eWxlICYmIHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoRlhfV1NUUkMoTCJ0YWItaW50ZXJ2YWwiKSwgd3NWYWx1ZSkpIHsNCi0gICAgICAgIENYRkFfTWVhc3VyZW1lbnQgbXMod3NWYWx1ZSk7DQotICAgICAgICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgcFhNTEVsZW1lbnQtPkdldFN0cmluZyhGWF9XU1RSQyhMInN0eWxlIikuR2V0UHRyKCksIHdzVmFsdWUpOw0KKyAgICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgdGFnUHJvdmlkZXIuU2V0QXR0cmlidXRlKEZYX1dTVFJDKEwic3R5bGUiKSwgd3NWYWx1ZSk7DQogICAgIH0NCi0gICAgcmV0dXJuIDM2Ow0KKyAgfSBlbHNlIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX1RleHQpIHsNCisgICAgdGFnUHJvdmlkZXIubV9iVGFnQXZpbGlhYmxlID0gVFJVRTsNCisgICAgdGFnUHJvdmlkZXIubV9iQ29udGVudCA9IFRSVUU7DQorICB9DQogfQ0KLWludDMyX3QgQ1hGQV9UZXh0UGFyc2VyOjpDb3VudFRhYnMoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0DQotew0KK2ludDMyX3QgQ1hGQV9UZXh0UGFyc2VyOjpHZXRWQWxnaW4oSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpIGNvbnN0IHsNCisgIGludDMyX3QgaUFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fVG9wOw0KKyAgQ1hGQV9QYXJhIHBhcmEgPSBwVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpOw0KKyAgaWYgKHBhcmEuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgaUFsaWduID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7DQorICB9DQorICByZXR1cm4gaUFsaWduOw0KK30NCitGWF9GTE9BVCBDWEZBX1RleHRQYXJzZXI6OkdldFRhYkludGVydmFsKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgaWYgKHBTdHlsZSAmJiBwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEZYX1dTVFJDKEwidGFiLWludGVydmFsIiksIHdzVmFsdWUpKSB7DQorICAgIENYRkFfTWVhc3VyZW1lbnQgbXMod3NWYWx1ZSk7DQorICAgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgfQ0KKyAgcmV0dXJuIDM2Ow0KK30NCitpbnQzMl90IENYRkFfVGV4dFBhcnNlcjo6Q291bnRUYWJzKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgaWYgKHBTdHlsZSAmJiBwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEZYX1dTVFJDKEwieGZhLXRhYi1jb3VudCIpLCB3c1ZhbHVlKSkgew0KKyAgICByZXR1cm4gd3NWYWx1ZS5HZXRJbnRlZ2VyKCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorRlhfQk9PTCBDWEZBX1RleHRQYXJzZXI6OklzU3BhY2VSdW4oSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0IHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBpZiAocFN0eWxlICYmIHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoRlhfV1NUUkMoTCJ4ZmEtc3BhY2VydW4iKSwgd3NWYWx1ZSkpIHsNCisgICAgd3NWYWx1ZS5NYWtlTG93ZXIoKTsNCisgICAgcmV0dXJuIHdzVmFsdWUgPT0gRlhfV1NUUkMoTCJ5ZXMiKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorSUZYX0ZvbnQqIENYRkFfVGV4dFBhcnNlcjo6R2V0Rm9udChJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NGYW1pbHkgPSBGWF9XU1RSQyhMIkNvdXJpZXIiKTsNCisgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOw0KKyAgQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOw0KKyAgaWYgKGZvbnQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgZm9udC5HZXRUeXBlZmFjZSh3c0ZhbWlseSk7DQorICAgIGlmIChmb250LklzQm9sZCgpKSB7DQorICAgICAgZHdTdHlsZSB8PSBGWF9GT05UU1RZTEVfQm9sZDsNCisgICAgfQ0KKyAgICBpZiAoZm9udC5Jc0l0YWxpYygpKSB7DQorICAgICAgZHdTdHlsZSB8PSBGWF9GT05UU1RZTEVfSXRhbGljOw0KKyAgICB9DQorICB9DQorICBpZiAocFN0eWxlKSB7DQorICAgIElGREVfQ1NTRm9udFN0eWxlKiBwRm9udFN0eWxlID0gcFN0eWxlLT5HZXRGb250U3R5bGVzKCk7DQorICAgIGludDMyX3QgaUNvdW50ID0gcEZvbnRTdHlsZS0+Q291bnRGb250RmFtaWxpZXMoKTsNCisgICAgaWYgKGlDb3VudCA+IDApIHsNCisgICAgICB3c0ZhbWlseSA9IHBGb250U3R5bGUtPkdldEZvbnRGYW1pbHkoaUNvdW50IC0gMSk7DQorICAgIH0NCisgICAgZHdTdHlsZSA9IDA7DQorICAgIGlmIChwRm9udFN0eWxlLT5HZXRGb250V2VpZ2h0KCkgPiBGWEZPTlRfRldfTk9STUFMKSB7DQorICAgICAgZHdTdHlsZSB8PSBGWF9GT05UU1RZTEVfQm9sZDsNCisgICAgfQ0KKyAgICBpZiAocEZvbnRTdHlsZS0+R2V0Rm9udFN0eWxlKCkgPT0gRkRFX0NTU0ZPTlRTVFlMRV9JdGFsaWMpIHsNCisgICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7DQorICAgIH0NCisgIH0NCisgIENYRkFfRkZEb2MqIHBEb2MgPSBwVGV4dFByb3ZpZGVyLT5HZXREb2NOb2RlKCk7DQorICBGWFNZU19hc3NlcnQocERvYyAhPSBOVUxMKTsNCisgIENYRkFfRm9udE1nciogcEZvbnRNZ3IgPSBwRG9jLT5HZXRBcHAoKS0+R2V0WEZBRm9udE1ncigpOw0KKyAgcmV0dXJuIHBGb250TWdyLT5HZXRGb250KHBEb2MsIHdzRmFtaWx5LCBkd1N0eWxlKTsNCit9DQorRlhfRkxPQVQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRGb250U2l6ZShJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7DQorICBpZiAocFN0eWxlICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIHBTdHlsZS0+R2V0Rm9udFN0eWxlcygpLT5HZXRGb250U2l6ZSgpOw0KKyAgfQ0KKyAgQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOw0KKyAgaWYgKGZvbnQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgcmV0dXJuIGZvbnQuR2V0Rm9udFNpemUoKTsNCisgIH0NCisgIHJldHVybiAxMDsNCit9DQoraW50MzJfdCBDWEZBX1RleHRQYXJzZXI6OkdldEhvclNjYWxlKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSkgY29uc3Qgew0KKyAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQogICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgIGlmIChwU3R5bGUgJiYgcFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInhmYS10YWItY291bnQiKSwgd3NWYWx1ZSkpIHsNCisgICAgaWYgKHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoRlhfV1NUUkMoTCJ4ZmEtZm9udC1ob3Jpem9udGFsLXNjYWxlIiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUpKSB7DQorICAgICAgcmV0dXJuIHdzVmFsdWUuR2V0SW50ZWdlcigpOw0KKyAgICB9DQorICAgIHdoaWxlIChwWE1MTm9kZSkgew0KKyAgICAgIENYRkFfVGV4dFBhcnNlQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgICAoQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiltX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5HZXRWYWx1ZUF0KA0KKyAgICAgICAgICAgICAgcFhNTE5vZGUpOw0KKyAgICAgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9wUGFyZW50U3R5bGUgJiYNCisgICAgICAgICAgcENvbnRleHQtPm1fcFBhcmVudFN0eWxlLT5HZXRDdXN0b21TdHlsZSgNCisgICAgICAgICAgICAgIEZYX1dTVFJDKEwieGZhLWZvbnQtaG9yaXpvbnRhbC1zY2FsZSIpLCB3c1ZhbHVlKSkgew0KICAgICAgICAgcmV0dXJuIHdzVmFsdWUuR2V0SW50ZWdlcigpOw0KKyAgICAgIH0NCisgICAgICBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCk7DQogICAgIH0NCi0gICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKSB7DQorICAgIHJldHVybiAoaW50MzJfdClmb250LkdldEhvcml6b250YWxTY2FsZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIDEwMDsNCiB9DQotRlhfQk9PTAlDWEZBX1RleHRQYXJzZXI6OklzU3BhY2VSdW4oSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0DQotew0KK2ludDMyX3QgQ1hGQV9UZXh0UGFyc2VyOjpHZXRWZXJTY2FsZShJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0IHsNCisgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICBpZiAocFN0eWxlICYmIHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoRlhfV1NUUkMoTCJ4ZmEtc3BhY2VydW4iKSwgd3NWYWx1ZSkpIHsNCi0gICAgICAgIHdzVmFsdWUuTWFrZUxvd2VyKCk7DQotICAgICAgICByZXR1cm4gd3NWYWx1ZSA9PSBGWF9XU1RSQyhMInllcyIpOw0KKyAgICBpZiAocFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInhmYS1mb250LXZlcnRpY2FsLXNjYWxlIiksIHdzVmFsdWUpKSB7DQorICAgICAgcmV0dXJuIHdzVmFsdWUuR2V0SW50ZWdlcigpOw0KICAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCkpIHsNCisgICAgcmV0dXJuIChpbnQzMl90KWZvbnQuR2V0VmVydGljYWxTY2FsZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIDEwMDsNCiB9DQotSUZYX0ZvbnQqIENYRkFfVGV4dFBhcnNlcjo6R2V0Rm9udChJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0DQotew0KLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NGYW1pbHkgPSBGWF9XU1RSQyhMIkNvdXJpZXIiKTsNCi0gICAgRlhfRFdPUkQgZHdTdHlsZSA9IDA7DQotICAgIENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKTsNCi0gICAgaWYgKGZvbnQuSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgIGZvbnQuR2V0VHlwZWZhY2Uod3NGYW1pbHkpOw0KLSAgICAgICAgaWYgKGZvbnQuSXNCb2xkKCkpIHsNCi0gICAgICAgICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGZvbnQuSXNJdGFsaWMoKSkgew0KLSAgICAgICAgICAgIGR3U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCi0gICAgICAgIH0NCit2b2lkIENYRkFfVGV4dFBhcnNlcjo6R2V0VW5kZXJsaW5lKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpVW5kZXJsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVBlcmlvZCkgY29uc3Qgew0KKyAgaVVuZGVybGluZSA9IDA7DQorICBpUGVyaW9kID0gWEZBX0FUVFJJQlVURUVOVU1fQWxsOw0KKyAgaWYgKHBTdHlsZSkgew0KKyAgICBGWF9EV09SRCBkd0RlY29yYXRpb24gPSBwU3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpLT5HZXRUZXh0RGVjb3JhdGlvbigpOw0KKyAgICBpZiAoZHdEZWNvcmF0aW9uICYgRkRFX0NTU1RFWFRERUNPUkFUSU9OX0RvdWJsZSkgew0KKyAgICAgIGlVbmRlcmxpbmUgPSAyOw0KKyAgICB9IGVsc2UgaWYgKGR3RGVjb3JhdGlvbiAmIEZERV9DU1NURVhUREVDT1JBVElPTl9VbmRlcmxpbmUpIHsNCisgICAgICBpVW5kZXJsaW5lID0gMTsNCiAgICAgfQ0KLSAgICBpZiAocFN0eWxlKSB7DQotICAgICAgICBJRkRFX0NTU0ZvbnRTdHlsZSAqcEZvbnRTdHlsZSA9IHBTdHlsZS0+R2V0Rm9udFN0eWxlcygpOw0KLSAgICAgICAgaW50MzJfdCBpQ291bnQgPSBwRm9udFN0eWxlLT5Db3VudEZvbnRGYW1pbGllcygpOw0KLSAgICAgICAgaWYgKGlDb3VudCA+IDApIHsNCi0gICAgICAgICAgICB3c0ZhbWlseSA9IHBGb250U3R5bGUtPkdldEZvbnRGYW1pbHkoaUNvdW50IC0gMSk7DQotICAgICAgICB9DQotICAgICAgICBkd1N0eWxlID0gMDsNCi0gICAgICAgIGlmIChwRm9udFN0eWxlLT5HZXRGb250V2VpZ2h0KCkgPiBGWEZPTlRfRldfTk9STUFMKSB7DQotICAgICAgICAgICAgZHdTdHlsZSB8PSBGWF9GT05UU1RZTEVfQm9sZDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwRm9udFN0eWxlLT5HZXRGb250U3R5bGUoKSA9PSBGREVfQ1NTRk9OVFNUWUxFX0l0YWxpYykJew0KLSAgICAgICAgICAgIGR3U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBDWEZBX0ZGRG9jICpwRG9jID0gcFRleHRQcm92aWRlci0+R2V0RG9jTm9kZSgpOw0KLSAgICBGWFNZU19hc3NlcnQocERvYyAhPSBOVUxMKTsNCi0gICAgQ1hGQV9Gb250TWdyICpwRm9udE1nciA9IHBEb2MtPkdldEFwcCgpLT5HZXRYRkFGb250TWdyKCk7DQotICAgIHJldHVybiBwRm9udE1nci0+R2V0Rm9udChwRG9jLCB3c0ZhbWlseSwgZHdTdHlsZSk7DQotfQ0KLUZYX0ZMT0FUIENYRkFfVGV4dFBhcnNlcjo6R2V0Rm9udFNpemUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlKSBjb25zdA0KLXsNCi0gICAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gcFN0eWxlLT5HZXRGb250U3R5bGVzKCktPkdldEZvbnRTaXplKCk7DQotICAgIH0NCi0gICAgQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOw0KLSAgICBpZiAoZm9udC5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgcmV0dXJuIGZvbnQuR2V0Rm9udFNpemUoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gMTA7DQotfQ0KLWludDMyX3QgQ1hGQV9UZXh0UGFyc2VyOjpHZXRIb3JTY2FsZShJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIElGREVfWE1MTm9kZSAqcFhNTE5vZGUpIGNvbnN0DQotew0KLSAgICBpZiAocFN0eWxlICE9IE5VTEwpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgICAgICBpZiAocFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInhmYS1mb250LWhvcml6b250YWwtc2NhbGUiKSwgd3NWYWx1ZSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NWYWx1ZS5HZXRJbnRlZ2VyKCk7DQotICAgICAgICB9DQotICAgICAgICB3aGlsZSAocFhNTE5vZGUpIHsNCi0gICAgICAgICAgICBDWEZBX1RleHRQYXJzZUNvbnRleHQgKnBDb250ZXh0ID0gKENYRkFfVGV4dFBhcnNlQ29udGV4dCopbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuR2V0VmFsdWVBdChwWE1MTm9kZSk7DQotICAgICAgICAgICAgaWYgKHBDb250ZXh0ICYmIHBDb250ZXh0LT5tX3BQYXJlbnRTdHlsZSAmJiBwQ29udGV4dC0+bV9wUGFyZW50U3R5bGUtPkdldEN1c3RvbVN0eWxlKEZYX1dTVFJDKEwieGZhLWZvbnQtaG9yaXpvbnRhbC1zY2FsZSIpLCB3c1ZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3NWYWx1ZS5HZXRJbnRlZ2VyKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKSB7DQotICAgICAgICByZXR1cm4gKGludDMyX3QpZm9udC5HZXRIb3Jpem9udGFsU2NhbGUoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gMTAwOw0KLX0NCi1pbnQzMl90IENYRkFfVGV4dFBhcnNlcjo6R2V0VmVyU2NhbGUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlKSBjb25zdA0KLXsNCi0gICAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICAgICAgaWYgKHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoRlhfV1NUUkMoTCJ4ZmEtZm9udC12ZXJ0aWNhbC1zY2FsZSIpLCB3c1ZhbHVlKSkgew0KLSAgICAgICAgICAgIHJldHVybiB3c1ZhbHVlLkdldEludGVnZXIoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKSB7DQotICAgICAgICByZXR1cm4gKGludDMyX3QpZm9udC5HZXRWZXJ0aWNhbFNjYWxlKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIDEwMDsNCi19DQotdm9pZCBDWEZBX1RleHRQYXJzZXI6OkdldFVuZGVybGluZShJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIGludDMyX3QgJmlVbmRlcmxpbmUsIGludDMyX3QgJmlQZXJpb2QpIGNvbnN0DQotew0KLSAgICBpVW5kZXJsaW5lID0gMDsNCi0gICAgaVBlcmlvZCA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsNCi0gICAgaWYgKHBTdHlsZSkgew0KLSAgICAgICAgRlhfRFdPUkQgZHdEZWNvcmF0aW9uID0gcFN0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKS0+R2V0VGV4dERlY29yYXRpb24oKTsNCi0gICAgICAgIGlmIChkd0RlY29yYXRpb24gJiBGREVfQ1NTVEVYVERFQ09SQVRJT05fRG91YmxlKSB7DQotICAgICAgICAgICAgaVVuZGVybGluZSA9IDI7DQotICAgICAgICB9IGVsc2UgaWYgKGR3RGVjb3JhdGlvbiAmIEZERV9DU1NURVhUREVDT1JBVElPTl9VbmRlcmxpbmUpIHsNCi0gICAgICAgICAgICBpVW5kZXJsaW5lID0gMTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgICAgICBpZiAocFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInVuZGVybGluZVBlcmlvZCIpLCB3c1ZhbHVlKSkgew0KLSAgICAgICAgICAgIGlmICh3c1ZhbHVlID09IEZYX1dTVFJDKEwid29yZCIpKSB7DQotICAgICAgICAgICAgICAgIGlQZXJpb2QgPSBYRkFfQVRUUklCVVRFRU5VTV9Xb3JkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKSB7DQotICAgICAgICAgICAgaVBlcmlvZCA9IGZvbnQuR2V0VW5kZXJsaW5lUGVyaW9kKCk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7DQotICAgICAgICBpZiAoZm9udC5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgICAgIGlVbmRlcmxpbmUgPSBmb250LkdldFVuZGVybGluZSgpOw0KLSAgICAgICAgICAgIGlQZXJpb2QgPSBmb250LkdldFVuZGVybGluZVBlcmlvZCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRMaW5ldGhyb3VnaChJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIGludDMyX3QgJmlMaW5ldGhyb3VnaCkgY29uc3QNCi17DQotICAgIGlmIChwU3R5bGUpIHsNCi0gICAgICAgIEZYX0RXT1JEIGR3RGVjb3JhdGlvbiA9IHBTdHlsZS0+R2V0UGFyYWdyYXBoU3R5bGVzKCktPkdldFRleHREZWNvcmF0aW9uKCk7DQotICAgICAgICBpTGluZXRocm91Z2ggPSAoZHdEZWNvcmF0aW9uICYgRkRFX0NTU1RFWFRERUNPUkFUSU9OX0xpbmVUaHJvdWdoKSA/IDEgOiAwOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOw0KLSAgICAgICAgaWYgKGZvbnQuSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgICAgICBpTGluZXRocm91Z2ggPSBmb250LkdldExpbmVUaHJvdWdoKCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQotRlhfQVJHQglDWEZBX1RleHRQYXJzZXI6OkdldENvbG9yKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkgY29uc3QNCi17DQotICAgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIHBTdHlsZS0+R2V0Rm9udFN0eWxlcygpLT5HZXRDb2xvcigpOw0KLSAgICB9DQotICAgIGlmIChDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCkpIHsNCi0gICAgICAgIHJldHVybiBmb250LkdldENvbG9yKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIDB4RkYwMDAwMDA7DQotfQ0KLUZYX0ZMT0FUIENYRkFfVGV4dFBhcnNlcjo6R2V0QmFzZWxpbmUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlKSBjb25zdA0KLXsNCi0gICAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQotICAgICAgICBJRkRFX0NTU1BhcmFncmFwaFN0eWxlICpwUGFyYVN0eWxlID0gcFN0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKTsNCi0gICAgICAgIGlmIChwUGFyYVN0eWxlLT5HZXRWZXJ0aWNhbEFsaWduKCkgPT0gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fTnVtYmVyKSB7DQotICAgICAgICAgICAgcmV0dXJuIHBQYXJhU3R5bGUtPkdldE51bWJlclZlcnRpY2FsQWxpZ24oKTsNCi0gICAgICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgaWYgKHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoRlhfV1NUUkMoTCJ1bmRlcmxpbmVQZXJpb2QiKSwgd3NWYWx1ZSkpIHsNCisgICAgICBpZiAod3NWYWx1ZSA9PSBGWF9XU1RSQyhMIndvcmQiKSkgew0KKyAgICAgICAgaVBlcmlvZCA9IFhGQV9BVFRSSUJVVEVFTlVNX1dvcmQ7DQorICAgICAgfQ0KICAgICB9IGVsc2UgaWYgKENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKSkgew0KLSAgICAgICAgcmV0dXJuIGZvbnQuR2V0QmFzZWxpbmVTaGlmdCgpOw0KKyAgICAgIGlQZXJpb2QgPSBmb250LkdldFVuZGVybGluZVBlcmlvZCgpOw0KICAgICB9DQotICAgIHJldHVybiAwOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOw0KKyAgICBpZiAoZm9udC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgIGlVbmRlcmxpbmUgPSBmb250LkdldFVuZGVybGluZSgpOw0KKyAgICAgIGlQZXJpb2QgPSBmb250LkdldFVuZGVybGluZVBlcmlvZCgpOw0KKyAgICB9DQorICB9DQogfQ0KLUZYX0ZMT0FUIENYRkFfVGV4dFBhcnNlcjo6R2V0TGluZUhlaWdodChJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIEZYX0JPT0wgYkZpcnN0LCBGWF9GTE9BVCBmVmVyU2NhbGUpIGNvbnN0DQotew0KLSAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IDA7DQotICAgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KLSAgICAgICAgZkxpbmVIZWlnaHQgPSBwU3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpLT5HZXRMaW5lSGVpZ2h0KCk7DQotICAgIH0gZWxzZSBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBwVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpKSB7DQotICAgICAgICBmTGluZUhlaWdodCA9IHBhcmEuR2V0TGluZUhlaWdodCgpOw0KK3ZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRMaW5ldGhyb3VnaChJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlMaW5ldGhyb3VnaCkgY29uc3Qgew0KKyAgaWYgKHBTdHlsZSkgew0KKyAgICBGWF9EV09SRCBkd0RlY29yYXRpb24gPSBwU3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpLT5HZXRUZXh0RGVjb3JhdGlvbigpOw0KKyAgICBpTGluZXRocm91Z2ggPSAoZHdEZWNvcmF0aW9uICYgRkRFX0NTU1RFWFRERUNPUkFUSU9OX0xpbmVUaHJvdWdoKSA/IDEgOiAwOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOw0KKyAgICBpZiAoZm9udC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgIGlMaW5ldGhyb3VnaCA9IGZvbnQuR2V0TGluZVRocm91Z2goKTsNCiAgICAgfQ0KLSAgICBpZiAoYkZpcnN0KSB7DQotICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBHZXRGb250U2l6ZShwVGV4dFByb3ZpZGVyLCBwU3R5bGUpOw0KLSAgICAgICAgaWYgKGZMaW5lSGVpZ2h0IDwgMC4xZikgew0KLSAgICAgICAgICAgIGZMaW5lSGVpZ2h0ID0gZkZvbnRTaXplOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmTGluZUhlaWdodCA9IEZYX01JTihmTGluZUhlaWdodCwgZkZvbnRTaXplKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChmTGluZUhlaWdodCA8IDAuMWYpIHsNCi0gICAgICAgIGZMaW5lSGVpZ2h0ID0gR2V0Rm9udFNpemUocFRleHRQcm92aWRlciwgcFN0eWxlKSAqIDEuMmY7DQotICAgIH0NCi0gICAgZkxpbmVIZWlnaHQgKj0gZlZlclNjYWxlOw0KLSAgICByZXR1cm4gZkxpbmVIZWlnaHQ7DQorICB9DQogfQ0KLUZYX0JPT0wJQ1hGQV9UZXh0UGFyc2VyOjpHZXRFbWJiZWRPYmooSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIENGWF9XaWRlU3RyaW5nICZ3c1ZhbHVlKQ0KLXsNCi0gICAgd3NWYWx1ZS5FbXB0eSgpOw0KLSAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KLSAgICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCAqKXBYTUxOb2RlOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyOw0KLSAgICAgICAgcEVsZW1lbnQtPkdldFN0cmluZyhGWF9XU1RSQyhMInhmYTplbWJlZCIpLkdldFB0cigpLCB3c0F0dHIpOw0KLSAgICAgICAgaWYgKHdzQXR0ci5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NBdHRyLkdldEF0KDApID09IEwnIycpIHsNCi0gICAgICAgICAgICB3c0F0dHIuRGVsZXRlKDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3M7DQotICAgICAgICBwRWxlbWVudC0+R2V0U3RyaW5nKEZYX1dTVFJDKEwieGZhOmVtYmVkVHlwZSIpLkdldFB0cigpLCB3cyk7DQotICAgICAgICBpZiAod3MuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgd3MgPSBMInNvbSI7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdzLk1ha2VMb3dlcigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfQk9PTCBiVVJJID0gKHdzID09IEZYX1dTVFJDKEwidXJpIikpOw0KLSAgICAgICAgaWYgKCFiVVJJICYmIHdzICE9IEZYX1dTVFJDKEwic29tIikpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICB3cy5FbXB0eSgpOw0KLSAgICAgICAgcEVsZW1lbnQtPkdldFN0cmluZyhGWF9XU1RSQyhMInhmYTplbWJlZE1vZGUiKS5HZXRQdHIoKSwgd3MpOw0KLSAgICAgICAgaWYgKHdzLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIHdzID0gTCJmb3JtYXR0ZWQiOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB3cy5NYWtlTG93ZXIoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0JPT0wJYlJhdyA9ICh3cyA9PSBGWF9XU1RSQyhMInJhdyIpKTsNCi0gICAgICAgIGlmICghYlJhdyAmJiB3cyAhPSBGWF9XU1RSQyhMImZvcm1hdHRlZCIpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYlJldCA9IHBUZXh0UHJvdmlkZXItPkdldEVtYmJlZE9iaihiVVJJLCBiUmF3LCB3c0F0dHIsIHdzVmFsdWUpOw0KLSAgICB9DQotICAgIHJldHVybiBiUmV0Ow0KK0ZYX0FSR0IgQ1hGQV9UZXh0UGFyc2VyOjpHZXRDb2xvcihJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0IHsNCisgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KKyAgICByZXR1cm4gcFN0eWxlLT5HZXRGb250U3R5bGVzKCktPkdldENvbG9yKCk7DQorICB9DQorICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKSB7DQorICAgIHJldHVybiBmb250LkdldENvbG9yKCk7DQorICB9DQorICByZXR1cm4gMHhGRjAwMDAwMDsNCiB9DQotQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiBDWEZBX1RleHRQYXJzZXI6OkdldFBhcnNlQ29udGV4dEZyb21NYXAoSUZERV9YTUxOb2RlICpwWE1MTm9kZSkNCi17DQotICAgIHJldHVybiAoQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiltX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5HZXRWYWx1ZUF0KHBYTUxOb2RlKTsNCitGWF9GTE9BVCBDWEZBX1RleHRQYXJzZXI6OkdldEJhc2VsaW5lKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0IHsNCisgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KKyAgICBJRkRFX0NTU1BhcmFncmFwaFN0eWxlKiBwUGFyYVN0eWxlID0gcFN0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKTsNCisgICAgaWYgKHBQYXJhU3R5bGUtPkdldFZlcnRpY2FsQWxpZ24oKSA9PSBGREVfQ1NTVkVSVElDQUxBTElHTl9OdW1iZXIpIHsNCisgICAgICByZXR1cm4gcFBhcmFTdHlsZS0+R2V0TnVtYmVyVmVydGljYWxBbGlnbigpOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKSkgew0KKyAgICByZXR1cm4gZm9udC5HZXRCYXNlbGluZVNoaWZ0KCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorRlhfRkxPQVQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRMaW5lSGVpZ2h0KElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmlyc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZWZXJTY2FsZSkgY29uc3Qgew0KKyAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSAwOw0KKyAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQorICAgIGZMaW5lSGVpZ2h0ID0gcFN0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKS0+R2V0TGluZUhlaWdodCgpOw0KKyAgfSBlbHNlIGlmIChDWEZBX1BhcmEgcGFyYSA9IHBUZXh0UHJvdmlkZXItPkdldFBhcmFOb2RlKCkpIHsNCisgICAgZkxpbmVIZWlnaHQgPSBwYXJhLkdldExpbmVIZWlnaHQoKTsNCisgIH0NCisgIGlmIChiRmlyc3QpIHsNCisgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUocFRleHRQcm92aWRlciwgcFN0eWxlKTsNCisgICAgaWYgKGZMaW5lSGVpZ2h0IDwgMC4xZikgew0KKyAgICAgIGZMaW5lSGVpZ2h0ID0gZkZvbnRTaXplOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGZMaW5lSGVpZ2h0ID0gRlhfTUlOKGZMaW5lSGVpZ2h0LCBmRm9udFNpemUpOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKGZMaW5lSGVpZ2h0IDwgMC4xZikgew0KKyAgICBmTGluZUhlaWdodCA9IEdldEZvbnRTaXplKHBUZXh0UHJvdmlkZXIsIHBTdHlsZSkgKiAxLjJmOw0KKyAgfQ0KKyAgZkxpbmVIZWlnaHQgKj0gZlZlclNjYWxlOw0KKyAgcmV0dXJuIGZMaW5lSGVpZ2h0Ow0KK30NCitGWF9CT09MIENYRkFfVGV4dFBhcnNlcjo6R2V0RW1iYmVkT2JqKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSB7DQorICB3c1ZhbHVlLkVtcHR5KCk7DQorICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHI7DQorICAgIHBFbGVtZW50LT5HZXRTdHJpbmcoRlhfV1NUUkMoTCJ4ZmE6ZW1iZWQiKS5HZXRQdHIoKSwgd3NBdHRyKTsNCisgICAgaWYgKHdzQXR0ci5Jc0VtcHR5KCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHdzQXR0ci5HZXRBdCgwKSA9PSBMJyMnKSB7DQorICAgICAgd3NBdHRyLkRlbGV0ZSgwKTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3czsNCisgICAgcEVsZW1lbnQtPkdldFN0cmluZyhGWF9XU1RSQyhMInhmYTplbWJlZFR5cGUiKS5HZXRQdHIoKSwgd3MpOw0KKyAgICBpZiAod3MuSXNFbXB0eSgpKSB7DQorICAgICAgd3MgPSBMInNvbSI7DQorICAgIH0gZWxzZSB7DQorICAgICAgd3MuTWFrZUxvd2VyKCk7DQorICAgIH0NCisgICAgRlhfQk9PTCBiVVJJID0gKHdzID09IEZYX1dTVFJDKEwidXJpIikpOw0KKyAgICBpZiAoIWJVUkkgJiYgd3MgIT0gRlhfV1NUUkMoTCJzb20iKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3cy5FbXB0eSgpOw0KKyAgICBwRWxlbWVudC0+R2V0U3RyaW5nKEZYX1dTVFJDKEwieGZhOmVtYmVkTW9kZSIpLkdldFB0cigpLCB3cyk7DQorICAgIGlmICh3cy5Jc0VtcHR5KCkpIHsNCisgICAgICB3cyA9IEwiZm9ybWF0dGVkIjsNCisgICAgfSBlbHNlIHsNCisgICAgICB3cy5NYWtlTG93ZXIoKTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJSYXcgPSAod3MgPT0gRlhfV1NUUkMoTCJyYXciKSk7DQorICAgIGlmICghYlJhdyAmJiB3cyAhPSBGWF9XU1RSQyhMImZvcm1hdHRlZCIpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGJSZXQgPSBwVGV4dFByb3ZpZGVyLT5HZXRFbWJiZWRPYmooYlVSSSwgYlJhdywgd3NBdHRyLCB3c1ZhbHVlKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KK30NCitDWEZBX1RleHRQYXJzZUNvbnRleHQqIENYRkFfVGV4dFBhcnNlcjo6R2V0UGFyc2VDb250ZXh0RnJvbU1hcCgNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSkgew0KKyAgcmV0dXJuIChDWEZBX1RleHRQYXJzZUNvbnRleHQqKW1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldFZhbHVlQXQoDQorICAgICAgcFhNTE5vZGUpOw0KIH0NCiBlbnVtIFhGQV9UQUJTVE9QU1NUQVRVUyB7DQotICAgIFhGQV9UQUJTVE9QU1NUQVRVU19FcnJvciwNCi0gICAgWEZBX1RBQlNUT1BTU1RBVFVTX0VPUywNCi0gICAgWEZBX1RBQlNUT1BTU1RBVFVTX05vbmUsDQotICAgIFhGQV9UQUJTVE9QU1NUQVRVU19BbGlnbm1lbnQsDQotICAgIFhGQV9UQUJTVE9QU1NUQVRVU19TdGFydExlYWRlciwNCi0gICAgWEZBX1RBQlNUT1BTU1RBVFVTX0xlYWRlciwNCi0gICAgWEZBX1RBQlNUT1BTU1RBVFVTX0xvY2F0aW9uLA0KKyAgWEZBX1RBQlNUT1BTU1RBVFVTX0Vycm9yLA0KKyAgWEZBX1RBQlNUT1BTU1RBVFVTX0VPUywNCisgIFhGQV9UQUJTVE9QU1NUQVRVU19Ob25lLA0KKyAgWEZBX1RBQlNUT1BTU1RBVFVTX0FsaWdubWVudCwNCisgIFhGQV9UQUJTVE9QU1NUQVRVU19TdGFydExlYWRlciwNCisgIFhGQV9UQUJTVE9QU1NUQVRVU19MZWFkZXIsDQorICBYRkFfVEFCU1RPUFNTVEFUVVNfTG9jYXRpb24sDQogfTsNCi1GWF9CT09MIENYRkFfVGV4dFBhcnNlcjo6R2V0VGFic3RvcHMoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dCAqcFRhYnN0b3BDb250ZXh0KQ0KLXsNCi0gICAgaWYgKHBTdHlsZSA9PSBOVUxMIHx8IHBUYWJzdG9wQ29udGV4dCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCi0gICAgaWYgKCFwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEZYX1dTVFJDKEwieGZhLXRhYi1zdG9wcyIpLCB3c1ZhbHVlKQ0KLSAgICAgICAgICAgICYmICFwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEZYX1dTVFJDKEwidGFiLXN0b3BzIiksIHdzVmFsdWUpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBUYWJTdG9wcyA9IHdzVmFsdWU7DQotICAgIGludDMyX3QgaUN1ciA9IDA7DQotICAgIGludDMyX3QgaUxhc3QgPSAwOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0FsaWduOw0KLSAgICBYRkFfVEFCU1RPUFNTVEFUVVMgZVN0YXR1cyA9IFhGQV9UQUJTVE9QU1NUQVRVU19Ob25lOw0KLSAgICBGWF9XQ0hBUiBjaDsNCi0gICAgd2hpbGUgKGlDdXIgPCBpTGVuZ3RoKSB7DQotICAgICAgICBjaCA9IHBUYWJTdG9wc1tpQ3VyXTsNCi0gICAgICAgIHN3aXRjaCAoZVN0YXR1cykgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX1RBQlNUT1BTU1RBVFVTX05vbmU6DQotICAgICAgICAgICAgICAgIGlmIChjaCA8PSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlDdXIrKzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGVTdGF0dXMgPSBYRkFfVEFCU1RPUFNTVEFUVVNfQWxpZ25tZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgaUxhc3QgPSBpQ3VyOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX1RBQlNUT1BTU1RBVFVTX0FsaWdubWVudDoNCi0gICAgICAgICAgICAgICAgaWYgKGNoID09ICcgJykgew0KLSAgICAgICAgICAgICAgICAgICAgd3NBbGlnbiA9IENGWF9XaWRlU3RyaW5nQyhwVGFiU3RvcHMgKyBpTGFzdCwgaUN1ciAtIGlMYXN0KTsNCi0gICAgICAgICAgICAgICAgICAgIGVTdGF0dXMgPSBYRkFfVEFCU1RPUFNTVEFUVVNfU3RhcnRMZWFkZXI7DQotICAgICAgICAgICAgICAgICAgICBpQ3VyKys7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaUN1ciA8IGlMZW5ndGggJiYgcFRhYlN0b3BzW2lDdXJdIDw9ICcgJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlDdXIrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlMYXN0ID0gaUN1cjsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlDdXIrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9UQUJTVE9QU1NUQVRVU19TdGFydExlYWRlcjoNCi0gICAgICAgICAgICAgICAgaWYgKGNoICE9ICdsJykgew0KLSAgICAgICAgICAgICAgICAgICAgZVN0YXR1cyA9IFhGQV9UQUJTVE9QU1NUQVRVU19Mb2NhdGlvbjsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpQ3VyIDwgaUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gcFRhYlN0b3BzW2lDdXJdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlDdXIrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJygnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyknKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudC0tOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUNvdW50ID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlDdXIgPCBpTGVuZ3RoICYmIHBUYWJTdG9wc1tpQ3VyXSA8PSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ3VyKys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpTGFzdCA9IGlDdXI7DQotICAgICAgICAgICAgICAgICAgICBlU3RhdHVzID0gWEZBX1RBQlNUT1BTU1RBVFVTX0xvY2F0aW9uOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX1RBQlNUT1BTU1RBVFVTX0xvY2F0aW9uOg0KLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyAnKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0hhc2hDb2RlID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NBbGlnbiwgd3NBbGlnbi5HZXRMZW5ndGgoKSwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IG1zKENGWF9XaWRlU3RyaW5nQyhwVGFiU3RvcHMgKyBpTGFzdCwgaUN1ciAtIGlMYXN0KSk7DQotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9zID0gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgICAgICAgICAgICAgIHBUYWJzdG9wQ29udGV4dC0+QXBwZW5kKGR3SGFzaENvZGUsIGZQb3MpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NBbGlnbi5FbXB0eSgpOw0KLSAgICAgICAgICAgICAgICAgICAgZVN0YXR1cyA9IFhGQV9UQUJTVE9QU1NUQVRVU19Ob25lOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlDdXIrKzsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKCF3c0FsaWduLklzRW1wdHkoKSkgew0KLSAgICAgICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzQWxpZ24sIHdzQWxpZ24uR2V0TGVuZ3RoKCksIFRSVUUpOw0KLSAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhDRlhfV2lkZVN0cmluZ0MocFRhYlN0b3BzICsgaUxhc3QsIGlDdXIgLSBpTGFzdCkpOw0KLSAgICAgICAgRlhfRkxPQVQgZlBvcyA9IG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgICAgICBwVGFic3RvcENvbnRleHQtPkFwcGVuZChkd0hhc2hDb2RlLCBmUG9zKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotQ1hGQV9UZXh0TGF5b3V0OjpDWEZBX1RleHRMYXlvdXQoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIpDQotICAgIDogbV9wVGV4dFByb3ZpZGVyKHBUZXh0UHJvdmlkZXIpDQotICAgICwgbV9wVGV4dERhdGFOb2RlKE5VTEwpDQotICAgICwgbV9wQWxsb2NhdG9yKE5VTEwpDQotICAgICwgbV9wQnJlYWsoTlVMTCkNCi0gICAgLCBtX2R3VGV4dERhdGEoMCkNCi0gICAgLCBtX3BMb2FkZXIoTlVMTCkNCi0gICAgLCBtX2lMaW5lcygwKQ0KLSAgICAsIG1fZk1heFdpZHRoKDApDQotICAgICwgbV9wVGFic3RvcENvbnRleHQoTlVMTCkNCi0gICAgLCBtX2JCbG9ja0NvbnRpbnVlKFRSVUUpDQotICAgICwgbV9iUmljaFRleHQoRkFMU0UpDQotICAgICwgbV9iSGFzQmxvY2soRkFMU0UpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wVGV4dFByb3ZpZGVyICE9IE5VTEwpOw0KLX0NCi1DWEZBX1RleHRMYXlvdXQ6On5DWEZBX1RleHRMYXlvdXQoKQ0KLXsNCi0gICAgbV90ZXh0UGFyc2VyLlJlc2V0KCk7DQotICAgIGlmIChtX3BMb2FkZXIgIT0gTlVMTCkgew0KLSAgICAgICAgZGVsZXRlIG1fcExvYWRlcjsNCi0gICAgfQ0KLSAgICBpZiAobV9wVGFic3RvcENvbnRleHQgIT0gTlVMTCkJew0KLSAgICAgICAgZGVsZXRlIG1fcFRhYnN0b3BDb250ZXh0Ow0KLSAgICB9DQotICAgIFVubG9hZCgpOw0KLX0NCi12b2lkIENYRkFfVGV4dExheW91dDo6VW5sb2FkKCkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9waWVjZUxpbmVzLkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgIENYRkFfUGllY2VMaW5lICpwTGluZSA9IG1fcGllY2VMaW5lcy5HZXRBdChpKTsNCi0gICAgICAgIEZERV9EZWxldGVXaXRoKENYRkFfUGllY2VMaW5lLCBtX3BBbGxvY2F0b3IsIHBMaW5lKTsNCi0gICAgfQ0KLSAgICBtX3BpZWNlTGluZXMuUmVtb3ZlQWxsKCk7DQotICAgIGlmIChtX3BCcmVhayAhPSBOVUxMKSB7DQotICAgICAgICBtX3BCcmVhay0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wQnJlYWsgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3BBbGxvY2F0b3IgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wQWxsb2NhdG9yLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BBbGxvY2F0b3IgPSBOVUxMOw0KLSAgICB9DQotfQ0KLWNvbnN0IENYRkFfUGllY2VMaW5lQXJyYXkqIENYRkFfVGV4dExheW91dDo6R2V0UGllY2VMaW5lcygpDQotew0KLSAgICByZXR1cm4gJm1fcGllY2VMaW5lczsNCi19DQotdm9pZCBDWEZBX1RleHRMYXlvdXQ6OkdldFRleHREYXRhTm9kZSgpDQotew0KLSAgICBpZiAobV9wVGV4dFByb3ZpZGVyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUgKnBOb2RlID0gbV9wVGV4dFByb3ZpZGVyLT5HZXRUZXh0Tm9kZShtX2JSaWNoVGV4dCk7DQotICAgIGlmIChwTm9kZSAmJiBtX2JSaWNoVGV4dCkgew0KLSAgICAgICAgbV90ZXh0UGFyc2VyLlJlc2V0KCk7DQotICAgIH0NCi0gICAgbV9wVGV4dERhdGFOb2RlID0gcE5vZGU7DQotfQ0KLUlGREVfWE1MTm9kZSogQ1hGQV9UZXh0TGF5b3V0OjpHZXRYTUxDb250YWluZXJOb2RlKCkNCi17DQotICAgIElGREVfWE1MTm9kZSogcFhNTENvbnRhaW5lciA9IE5VTEw7DQotICAgIGlmIChtX2JSaWNoVGV4dCkgew0KLSAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MUm9vdCA9IG1fcFRleHREYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCi0gICAgICAgIGlmICghcFhNTFJvb3QpIHsNCi0gICAgICAgICAgICByZXR1cm4gcFhNTENvbnRhaW5lcjsNCi0gICAgICAgIH0NCi0gICAgICAgIGZvciAoSUZERV9YTUxOb2RlICpwWE1MQ2hpbGQgPSBwWE1MUm9vdC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcFhNTENoaWxkOyBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgaWYgKHBYTUxDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgSUZERV9YTUxFbGVtZW50ICpwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxDaGlsZDsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWc7DQotICAgICAgICAgICAgICAgIHBYTUxFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUod3NUYWcpOw0KLSAgICAgICAgICAgICAgICBpZiAod3NUYWcuRXF1YWwoRlhfV1NUUkMoTCJib2R5IikpIHx8IHdzVGFnLkVxdWFsKEZYX1dTVFJDKEwiaHRtbCIpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcFhNTENvbnRhaW5lciA9IHBYTUxDaGlsZDsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBwWE1MQ29udGFpbmVyOw0KLX0NCi1JRlhfUlRGQnJlYWsqIENYRkFfVGV4dExheW91dDo6Q3JlYXRlQnJlYWsoRlhfQk9PTCBiRGVmYXVsdCkNCi17DQotICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBGWF9SVEZMQVlPVVRTVFlMRV9FeHBhbmRUYWI7DQotICAgIGlmICghYkRlZmF1bHQpIHsNCi0gICAgICAgIGR3U3R5bGUgfD0gRlhfUlRGTEFZT1VUU1RZTEVfUGFnaW5hdGlvbjsNCi0gICAgfQ0KLSAgICBJRlhfUlRGQnJlYWsgKnBCcmVhayA9IElGWF9SVEZCcmVhazo6Q3JlYXRlKDApOw0KLSAgICBwQnJlYWstPlNldExheW91dFN0eWxlcyhkd1N0eWxlKTsNCi0gICAgcEJyZWFrLT5TZXRMaW5lQnJlYWtDaGFyKEwnXG4nKTsNCi0gICAgcEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UoMSk7DQotICAgIHBCcmVhay0+U2V0Rm9udChtX3RleHRQYXJzZXIuR2V0Rm9udChtX3BUZXh0UHJvdmlkZXIsIE5VTEwpKTsNCi0gICAgcEJyZWFrLT5TZXRGb250U2l6ZShtX3RleHRQYXJzZXIuR2V0Rm9udFNpemUobV9wVGV4dFByb3ZpZGVyLCBOVUxMKSk7DQotICAgIHJldHVybiBwQnJlYWs7DQotfQ0KLXZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpJbml0QnJlYWsoRlhfRkxPQVQgZkxpbmVXaWR0aCkNCi17DQotICAgIENYRkFfRm9udCBmb250ID0gbV9wVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOw0KLSAgICBDWEZBX1BhcmEgcGFyYSA9IG1fcFRleHRQcm92aWRlci0+R2V0UGFyYU5vZGUoKTsNCi0gICAgRlhfRkxPQVQgZlN0YXJ0ID0gMDsNCi0gICAgRlhfRkxPQVQgZlN0YXJ0UG9zID0gMDsNCi0gICAgaWYgKHBhcmEuSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgIGludDMyX3QgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0Ow0KLSAgICAgICAgc3dpdGNoIChwYXJhLkdldEhvcml6b250YWxBbGlnbigpKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQotICAgICAgICAgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfQ2VudGVyOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KLSAgICAgICAgICAgICAgICBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX1JpZ2h0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnk6DQotICAgICAgICAgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnlBbGw6DQotICAgICAgICAgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wQnJlYWstPlNldEFsaWdubWVudChpQWxpZ24pOw0KLSAgICAgICAgZlN0YXJ0ID0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7DQotICAgICAgICBpZiAobV9wVGV4dFByb3ZpZGVyLT5Jc0NoZWNrQnV0dG9uQW5kQXV0b1dpZHRoKCkpIHsNCi0gICAgICAgICAgICBpZiAoaUFsaWduICE9IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCkgew0KLSAgICAgICAgICAgICAgICBmTGluZVdpZHRoIC09IHBhcmEuR2V0TWFyZ2luUmlnaHQoKTsNCi0gICAgICAgICAgICB9DQorRlhfQk9PTCBDWEZBX1RleHRQYXJzZXI6OkdldFRhYnN0b3BzKA0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwNCisgICAgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0KiBwVGFic3RvcENvbnRleHQpIHsNCisgIGlmIChwU3R5bGUgPT0gTlVMTCB8fCBwVGFic3RvcENvbnRleHQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgaWYgKCFwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEZYX1dTVFJDKEwieGZhLXRhYi1zdG9wcyIpLCB3c1ZhbHVlKSAmJg0KKyAgICAgICFwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEZYX1dTVFJDKEwidGFiLXN0b3BzIiksIHdzVmFsdWUpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgaUxlbmd0aCA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFRhYlN0b3BzID0gd3NWYWx1ZTsNCisgIGludDMyX3QgaUN1ciA9IDA7DQorICBpbnQzMl90IGlMYXN0ID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIHdzQWxpZ247DQorICBYRkFfVEFCU1RPUFNTVEFUVVMgZVN0YXR1cyA9IFhGQV9UQUJTVE9QU1NUQVRVU19Ob25lOw0KKyAgRlhfV0NIQVIgY2g7DQorICB3aGlsZSAoaUN1ciA8IGlMZW5ndGgpIHsNCisgICAgY2ggPSBwVGFiU3RvcHNbaUN1cl07DQorICAgIHN3aXRjaCAoZVN0YXR1cykgew0KKyAgICAgIGNhc2UgWEZBX1RBQlNUT1BTU1RBVFVTX05vbmU6DQorICAgICAgICBpZiAoY2ggPD0gJyAnKSB7DQorICAgICAgICAgIGlDdXIrKzsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZkxpbmVXaWR0aCAtPSBwYXJhLkdldE1hcmdpblJpZ2h0KCk7DQorICAgICAgICAgIGVTdGF0dXMgPSBYRkFfVEFCU1RPUFNTVEFUVVNfQWxpZ25tZW50Ow0KKyAgICAgICAgICBpTGFzdCA9IGlDdXI7DQogICAgICAgICB9DQotICAgICAgICBpZiAoZkxpbmVXaWR0aCA8IDApIHsNCi0gICAgICAgICAgICBmTGluZVdpZHRoID0gZlN0YXJ0Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfVEFCU1RPUFNTVEFUVVNfQWxpZ25tZW50Og0KKyAgICAgICAgaWYgKGNoID09ICcgJykgew0KKyAgICAgICAgICB3c0FsaWduID0gQ0ZYX1dpZGVTdHJpbmdDKHBUYWJTdG9wcyArIGlMYXN0LCBpQ3VyIC0gaUxhc3QpOw0KKyAgICAgICAgICBlU3RhdHVzID0gWEZBX1RBQlNUT1BTU1RBVFVTX1N0YXJ0TGVhZGVyOw0KKyAgICAgICAgICBpQ3VyKys7DQorICAgICAgICAgIHdoaWxlIChpQ3VyIDwgaUxlbmd0aCAmJiBwVGFiU3RvcHNbaUN1cl0gPD0gJyAnKSB7DQorICAgICAgICAgICAgaUN1cisrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlMYXN0ID0gaUN1cjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlDdXIrKzsNCiAgICAgICAgIH0NCi0gICAgICAgIGZTdGFydFBvcyA9IGZTdGFydDsNCi0gICAgICAgIEZYX0ZMT0FUIGZJbmRlbnQgPSBwYXJhLkdldFRleHRJbmRlbnQoKTsNCi0gICAgICAgIGlmIChmSW5kZW50ID4gMCkgew0KLSAgICAgICAgICAgIGZTdGFydFBvcyArPSBmSW5kZW50Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfVEFCU1RPUFNTVEFUVVNfU3RhcnRMZWFkZXI6DQorICAgICAgICBpZiAoY2ggIT0gJ2wnKSB7DQorICAgICAgICAgIGVTdGF0dXMgPSBYRkFfVEFCU1RPUFNTVEFUVVNfTG9jYXRpb247DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IDA7DQorICAgICAgICAgIHdoaWxlIChpQ3VyIDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgIGNoID0gcFRhYlN0b3BzW2lDdXJdOw0KKyAgICAgICAgICAgIGlDdXIrKzsNCisgICAgICAgICAgICBpZiAoY2ggPT0gJygnKSB7DQorICAgICAgICAgICAgICBpQ291bnQrKzsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcpJykgew0KKyAgICAgICAgICAgICAgaUNvdW50LS07DQorICAgICAgICAgICAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdoaWxlIChpQ3VyIDwgaUxlbmd0aCAmJiBwVGFiU3RvcHNbaUN1cl0gPD0gJyAnKSB7DQorICAgICAgICAgICAgaUN1cisrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlMYXN0ID0gaUN1cjsNCisgICAgICAgICAgZVN0YXR1cyA9IFhGQV9UQUJTVE9QU1NUQVRVU19Mb2NhdGlvbjsNCiAgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX1RBQlNUT1BTU1RBVFVTX0xvY2F0aW9uOg0KKyAgICAgICAgaWYgKGNoID09ICcgJykgew0KKyAgICAgICAgICBGWF9EV09SRCBkd0hhc2hDb2RlID0NCisgICAgICAgICAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzQWxpZ24sIHdzQWxpZ24uR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IG1zKENGWF9XaWRlU3RyaW5nQyhwVGFiU3RvcHMgKyBpTGFzdCwgaUN1ciAtIGlMYXN0KSk7DQorICAgICAgICAgIEZYX0ZMT0FUIGZQb3MgPSBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgICBwVGFic3RvcENvbnRleHQtPkFwcGVuZChkd0hhc2hDb2RlLCBmUG9zKTsNCisgICAgICAgICAgd3NBbGlnbi5FbXB0eSgpOw0KKyAgICAgICAgICBlU3RhdHVzID0gWEZBX1RBQlNUT1BTU1RBVFVTX05vbmU7DQorICAgICAgICB9DQorICAgICAgICBpQ3VyKys7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmICghd3NBbGlnbi5Jc0VtcHR5KCkpIHsNCisgICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9DQorICAgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0FsaWduLCB3c0FsaWduLkdldExlbmd0aCgpLCBUUlVFKTsNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhDRlhfV2lkZVN0cmluZ0MocFRhYlN0b3BzICsgaUxhc3QsIGlDdXIgLSBpTGFzdCkpOw0KKyAgICBGWF9GTE9BVCBmUG9zID0gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgcFRhYnN0b3BDb250ZXh0LT5BcHBlbmQoZHdIYXNoQ29kZSwgZlBvcyk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorQ1hGQV9UZXh0TGF5b3V0OjpDWEZBX1RleHRMYXlvdXQoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpDQorICAgIDogbV9wVGV4dFByb3ZpZGVyKHBUZXh0UHJvdmlkZXIpLA0KKyAgICAgIG1fcFRleHREYXRhTm9kZShOVUxMKSwNCisgICAgICBtX3BBbGxvY2F0b3IoTlVMTCksDQorICAgICAgbV9wQnJlYWsoTlVMTCksDQorICAgICAgbV9kd1RleHREYXRhKDApLA0KKyAgICAgIG1fcExvYWRlcihOVUxMKSwNCisgICAgICBtX2lMaW5lcygwKSwNCisgICAgICBtX2ZNYXhXaWR0aCgwKSwNCisgICAgICBtX3BUYWJzdG9wQ29udGV4dChOVUxMKSwNCisgICAgICBtX2JCbG9ja0NvbnRpbnVlKFRSVUUpLA0KKyAgICAgIG1fYlJpY2hUZXh0KEZBTFNFKSwNCisgICAgICBtX2JIYXNCbG9jayhGQUxTRSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFRleHRQcm92aWRlciAhPSBOVUxMKTsNCit9DQorQ1hGQV9UZXh0TGF5b3V0Ojp+Q1hGQV9UZXh0TGF5b3V0KCkgew0KKyAgbV90ZXh0UGFyc2VyLlJlc2V0KCk7DQorICBpZiAobV9wTG9hZGVyICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fcExvYWRlcjsNCisgIH0NCisgIGlmIChtX3BUYWJzdG9wQ29udGV4dCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX3BUYWJzdG9wQ29udGV4dDsNCisgIH0NCisgIFVubG9hZCgpOw0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6VW5sb2FkKCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3BpZWNlTGluZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ1hGQV9QaWVjZUxpbmUqIHBMaW5lID0gbV9waWVjZUxpbmVzLkdldEF0KGkpOw0KKyAgICBGREVfRGVsZXRlV2l0aChDWEZBX1BpZWNlTGluZSwgbV9wQWxsb2NhdG9yLCBwTGluZSk7DQorICB9DQorICBtX3BpZWNlTGluZXMuUmVtb3ZlQWxsKCk7DQorICBpZiAobV9wQnJlYWsgIT0gTlVMTCkgew0KKyAgICBtX3BCcmVhay0+UmVsZWFzZSgpOw0KKyAgICBtX3BCcmVhayA9IE5VTEw7DQorICB9DQorICBpZiAobV9wQWxsb2NhdG9yICE9IE5VTEwpIHsNCisgICAgbV9wQWxsb2NhdG9yLT5SZWxlYXNlKCk7DQorICAgIG1fcEFsbG9jYXRvciA9IE5VTEw7DQorICB9DQorfQ0KK2NvbnN0IENYRkFfUGllY2VMaW5lQXJyYXkqIENYRkFfVGV4dExheW91dDo6R2V0UGllY2VMaW5lcygpIHsNCisgIHJldHVybiAmbV9waWVjZUxpbmVzOw0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6R2V0VGV4dERhdGFOb2RlKCkgew0KKyAgaWYgKG1fcFRleHRQcm92aWRlciA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BUZXh0UHJvdmlkZXItPkdldFRleHROb2RlKG1fYlJpY2hUZXh0KTsNCisgIGlmIChwTm9kZSAmJiBtX2JSaWNoVGV4dCkgew0KKyAgICBtX3RleHRQYXJzZXIuUmVzZXQoKTsNCisgIH0NCisgIG1fcFRleHREYXRhTm9kZSA9IHBOb2RlOw0KK30NCitJRkRFX1hNTE5vZGUqIENYRkFfVGV4dExheW91dDo6R2V0WE1MQ29udGFpbmVyTm9kZSgpIHsNCisgIElGREVfWE1MTm9kZSogcFhNTENvbnRhaW5lciA9IE5VTEw7DQorICBpZiAobV9iUmljaFRleHQpIHsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MUm9vdCA9IG1fcFRleHREYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgaWYgKCFwWE1MUm9vdCkgew0KKyAgICAgIHJldHVybiBwWE1MQ29udGFpbmVyOw0KKyAgICB9DQorICAgIGZvciAoSUZERV9YTUxOb2RlKiBwWE1MQ2hpbGQgPQ0KKyAgICAgICAgICAgICBwWE1MUm9vdC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgICBwWE1MQ2hpbGQ7DQorICAgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICAgIGlmIChwWE1MQ2hpbGQtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWc7DQorICAgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsNCisgICAgICAgIGlmICh3c1RhZy5FcXVhbChGWF9XU1RSQyhMImJvZHkiKSkgfHwgd3NUYWcuRXF1YWwoRlhfV1NUUkMoTCJodG1sIikpKSB7DQorICAgICAgICAgIHBYTUxDb250YWluZXIgPSBwWE1MQ2hpbGQ7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBYTUxDb250YWluZXI7DQorfQ0KK0lGWF9SVEZCcmVhayogQ1hGQV9UZXh0TGF5b3V0OjpDcmVhdGVCcmVhayhGWF9CT09MIGJEZWZhdWx0KSB7DQorICBGWF9EV09SRCBkd1N0eWxlID0gRlhfUlRGTEFZT1VUU1RZTEVfRXhwYW5kVGFiOw0KKyAgaWYgKCFiRGVmYXVsdCkgew0KKyAgICBkd1N0eWxlIHw9IEZYX1JURkxBWU9VVFNUWUxFX1BhZ2luYXRpb247DQorICB9DQorICBJRlhfUlRGQnJlYWsqIHBCcmVhayA9IElGWF9SVEZCcmVhazo6Q3JlYXRlKDApOw0KKyAgcEJyZWFrLT5TZXRMYXlvdXRTdHlsZXMoZHdTdHlsZSk7DQorICBwQnJlYWstPlNldExpbmVCcmVha0NoYXIoTCdcbicpOw0KKyAgcEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UoMSk7DQorICBwQnJlYWstPlNldEZvbnQobV90ZXh0UGFyc2VyLkdldEZvbnQobV9wVGV4dFByb3ZpZGVyLCBOVUxMKSk7DQorICBwQnJlYWstPlNldEZvbnRTaXplKG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIE5VTEwpKTsNCisgIHJldHVybiBwQnJlYWs7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpJbml0QnJlYWsoRlhfRkxPQVQgZkxpbmVXaWR0aCkgew0KKyAgQ1hGQV9Gb250IGZvbnQgPSBtX3BUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7DQorICBDWEZBX1BhcmEgcGFyYSA9IG1fcFRleHRQcm92aWRlci0+R2V0UGFyYU5vZGUoKTsNCisgIEZYX0ZMT0FUIGZTdGFydCA9IDA7DQorICBGWF9GTE9BVCBmU3RhcnRQb3MgPSAwOw0KKyAgaWYgKHBhcmEuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgaW50MzJfdCBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQ7DQorICAgIHN3aXRjaCAocGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKSkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KKyAgICAgICAgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9DZW50ZXI7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9SaWdodDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeToNCisgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOg0KKyAgICAgICAgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZDsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIG1fcEJyZWFrLT5TZXRBbGlnbm1lbnQoaUFsaWduKTsNCisgICAgZlN0YXJ0ID0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7DQorICAgIGlmIChtX3BUZXh0UHJvdmlkZXItPklzQ2hlY2tCdXR0b25BbmRBdXRvV2lkdGgoKSkgew0KKyAgICAgIGlmIChpQWxpZ24gIT0gRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0KSB7DQorICAgICAgICBmTGluZVdpZHRoIC09IHBhcmEuR2V0TWFyZ2luUmlnaHQoKTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgZkxpbmVXaWR0aCAtPSBwYXJhLkdldE1hcmdpblJpZ2h0KCk7DQorICAgIH0NCisgICAgaWYgKGZMaW5lV2lkdGggPCAwKSB7DQorICAgICAgZkxpbmVXaWR0aCA9IGZTdGFydDsNCisgICAgfQ0KKyAgICBmU3RhcnRQb3MgPSBmU3RhcnQ7DQorICAgIEZYX0ZMT0FUIGZJbmRlbnQgPSBwYXJhLkdldFRleHRJbmRlbnQoKTsNCisgICAgaWYgKGZJbmRlbnQgPiAwKSB7DQorICAgICAgZlN0YXJ0UG9zICs9IGZJbmRlbnQ7DQorICAgIH0NCisgIH0NCisgIG1fcEJyZWFrLT5TZXRMaW5lV2lkdGgoZlN0YXJ0LCBmTGluZVdpZHRoKTsNCisgIG1fcEJyZWFrLT5TZXRMaW5lUG9zKGZTdGFydFBvcyk7DQorICBpZiAoZm9udC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICBtX3BCcmVhay0+U2V0SG9yaXpvbnRhbFNjYWxlKChpbnQzMl90KWZvbnQuR2V0SG9yaXpvbnRhbFNjYWxlKCkpOw0KKyAgICBtX3BCcmVhay0+U2V0VmVydGljYWxTY2FsZSgoaW50MzJfdClmb250LkdldFZlcnRpY2FsU2NhbGUoKSk7DQorICAgIG1fcEJyZWFrLT5TZXRDaGFyU3BhY2UoZm9udC5HZXRMZXR0ZXJTcGFjaW5nKCkpOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gbV90ZXh0UGFyc2VyLkdldEZvbnRTaXplKG1fcFRleHRQcm92aWRlciwgTlVMTCk7DQorICBtX3BCcmVhay0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsNCisgIG1fcEJyZWFrLT5TZXRGb250KG1fdGV4dFBhcnNlci5HZXRGb250KG1fcFRleHRQcm92aWRlciwgTlVMTCkpOw0KKyAgbV9wQnJlYWstPlNldExpbmVCcmVha1RvbGVyYW5jZShmRm9udFNpemUgKiAwLjJmKTsNCit9DQordm9pZCBDWEZBX1RleHRMYXlvdXQ6OkluaXRCcmVhayhJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NESVNQTEFZIGVEaXNwbGF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSkgew0KKyAgaWYgKHBTdHlsZSA9PSBOVUxMKSB7DQorICAgIEluaXRCcmVhayhmTGluZVdpZHRoKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSogcFBhcmFTdHlsZSA9IHBTdHlsZS0+R2V0UGFyYWdyYXBoU3R5bGVzKCk7DQorICBpZiAoZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfQmxvY2sgfHwgZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfTGlzdEl0ZW0pIHsNCisgICAgaW50MzJfdCBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQ7DQorICAgIHN3aXRjaCAocFBhcmFTdHlsZS0+R2V0VGV4dEFsaWduKCkpIHsNCisgICAgICBjYXNlIEZERV9DU1NURVhUQUxJR05fUmlnaHQ6DQorICAgICAgICBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX1JpZ2h0Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTVEVYVEFMSUdOX0NlbnRlcjoNCisgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfQ2VudGVyOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTVEVYVEFMSUdOX0p1c3RpZnk6DQorICAgICAgICBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1RFWFRBTElHTl9KdXN0aWZ5QWxsOg0KKyAgICAgICAgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBtX3BCcmVhay0+U2V0QWxpZ25tZW50KGlBbGlnbik7DQorICAgIEZYX0ZMT0FUIGZTdGFydCA9IDA7DQorICAgIGNvbnN0IEZERV9DU1NSRUNUKiBwUmVjdCA9IHBTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKS0+R2V0TWFyZ2luV2lkdGgoKTsNCisgICAgY29uc3QgRkRFX0NTU1JFQ1QqIHBQYWRkaW5nUmVjdCA9DQorICAgICAgICBwU3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCktPkdldFBhZGRpbmdXaWR0aCgpOw0KKyAgICBpZiAocFJlY3QgIT0gTlVMTCkgew0KKyAgICAgIGZTdGFydCA9IHBSZWN0LT5sZWZ0LkdldFZhbHVlKCk7DQorICAgICAgZkxpbmVXaWR0aCAtPSBwUmVjdC0+cmlnaHQuR2V0VmFsdWUoKTsNCisgICAgICBpZiAocFBhZGRpbmdSZWN0ICE9IE5VTEwpIHsNCisgICAgICAgIGZTdGFydCArPSBwUGFkZGluZ1JlY3QtPmxlZnQuR2V0VmFsdWUoKTsNCisgICAgICAgIGZMaW5lV2lkdGggLT0gcFBhZGRpbmdSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOw0KKyAgICAgIH0NCisgICAgICBpZiAoZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfTGlzdEl0ZW0pIHsNCisgICAgICAgIGNvbnN0IEZERV9DU1NSRUNUKiBwUGFyUmVjdCA9DQorICAgICAgICAgICAgcFBhcmVudFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5HZXRNYXJnaW5XaWR0aCgpOw0KKyAgICAgICAgY29uc3QgRkRFX0NTU1JFQ1QqIHBQYXJQYWRkaW5nUmVjdCA9DQorICAgICAgICAgICAgcFBhcmVudFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5HZXRQYWRkaW5nV2lkdGgoKTsNCisgICAgICAgIGlmIChwUGFyUmVjdCAhPSBOVUxMKSB7DQorICAgICAgICAgIGZTdGFydCArPSBwUGFyUmVjdC0+bGVmdC5HZXRWYWx1ZSgpOw0KKyAgICAgICAgICBmTGluZVdpZHRoIC09IHBQYXJSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOw0KKyAgICAgICAgICBpZiAocFBhclBhZGRpbmdSZWN0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICBmU3RhcnQgKz0gcFBhclBhZGRpbmdSZWN0LT5sZWZ0LkdldFZhbHVlKCk7DQorICAgICAgICAgICAgZkxpbmVXaWR0aCAtPSBwUGFyUGFkZGluZ1JlY3QtPnJpZ2h0LkdldFZhbHVlKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZERV9DU1NSRUNUIHBOZXdSZWN0Ow0KKyAgICAgICAgcE5ld1JlY3QubGVmdC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIGZTdGFydCk7DQorICAgICAgICBwTmV3UmVjdC5yaWdodC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIHBSZWN0LT5yaWdodC5HZXRWYWx1ZSgpKTsNCisgICAgICAgIHBOZXdSZWN0LnRvcC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIHBSZWN0LT50b3AuR2V0VmFsdWUoKSk7DQorICAgICAgICBwTmV3UmVjdC5ib3R0b20uU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBwUmVjdC0+Ym90dG9tLkdldFZhbHVlKCkpOw0KKyAgICAgICAgcFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5TZXRNYXJnaW5XaWR0aChwTmV3UmVjdCk7DQorICAgICAgfQ0KICAgICB9DQogICAgIG1fcEJyZWFrLT5TZXRMaW5lV2lkdGgoZlN0YXJ0LCBmTGluZVdpZHRoKTsNCi0gICAgbV9wQnJlYWstPlNldExpbmVQb3MoZlN0YXJ0UG9zKTsNCi0gICAgaWYgKGZvbnQuSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgIG1fcEJyZWFrLT5TZXRIb3Jpem9udGFsU2NhbGUoKGludDMyX3QpZm9udC5HZXRIb3Jpem9udGFsU2NhbGUoKSk7DQotICAgICAgICBtX3BCcmVhay0+U2V0VmVydGljYWxTY2FsZSgoaW50MzJfdClmb250LkdldFZlcnRpY2FsU2NhbGUoKSk7DQotICAgICAgICBtX3BCcmVhay0+U2V0Q2hhclNwYWNlKGZvbnQuR2V0TGV0dGVyU3BhY2luZygpKTsNCisgICAgRlhfRkxPQVQgZkluZGVudCA9IHBQYXJhU3R5bGUtPkdldFRleHRJbmRlbnQoKS5HZXRWYWx1ZSgpOw0KKyAgICBpZiAoZkluZGVudCA+IDApIHsNCisgICAgICBmU3RhcnQgKz0gZkluZGVudDsNCiAgICAgfQ0KLSAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBtX3RleHRQYXJzZXIuR2V0Rm9udFNpemUobV9wVGV4dFByb3ZpZGVyLCBOVUxMKTsNCi0gICAgbV9wQnJlYWstPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQotICAgIG1fcEJyZWFrLT5TZXRGb250KG1fdGV4dFBhcnNlci5HZXRGb250KG1fcFRleHRQcm92aWRlciwgTlVMTCkpOw0KLSAgICBtX3BCcmVhay0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKGZGb250U2l6ZSAqIDAuMmYpOw0KKyAgICBtX3BCcmVhay0+U2V0TGluZVBvcyhmU3RhcnQpOw0KKyAgICBtX3BCcmVhay0+U2V0VGFiV2lkdGgobV90ZXh0UGFyc2VyLkdldFRhYkludGVydmFsKHBTdHlsZSkpOw0KKyAgICBpZiAobV9wVGFic3RvcENvbnRleHQgPT0gTlVMTCkgew0KKyAgICAgIG1fcFRhYnN0b3BDb250ZXh0ID0gRlhfTkVXIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dDsNCisgICAgfQ0KKyAgICBtX3RleHRQYXJzZXIuR2V0VGFic3RvcHMocFN0eWxlLCBtX3BUYWJzdG9wQ29udGV4dCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fcFRhYnN0b3BDb250ZXh0LT5tX2lUYWJDb3VudDsgaSsrKSB7DQorICAgICAgWEZBX1RBQlNUT1BTKiBwVGFiID0gbV9wVGFic3RvcENvbnRleHQtPm1fdGFic3RvcHMuR2V0RGF0YVB0cihpKTsNCisgICAgICBtX3BCcmVhay0+QWRkUG9zaXRpb25lZFRhYihwVGFiLT5mVGFic3RvcHMpOw0KKyAgICB9DQorICB9DQorICBGWF9GTE9BVCBmRm9udFNpemUgPSBtX3RleHRQYXJzZXIuR2V0Rm9udFNpemUobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpOw0KKyAgbV9wQnJlYWstPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQorICBtX3BCcmVhay0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKGZGb250U2l6ZSAqIDAuMmYpOw0KKyAgbV9wQnJlYWstPlNldEZvbnQobV90ZXh0UGFyc2VyLkdldEZvbnQobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpKTsNCisgIG1fcEJyZWFrLT5TZXRIb3Jpem9udGFsU2NhbGUoDQorICAgICAgbV90ZXh0UGFyc2VyLkdldEhvclNjYWxlKG1fcFRleHRQcm92aWRlciwgcFN0eWxlLCBwWE1MTm9kZSkpOw0KKyAgbV9wQnJlYWstPlNldFZlcnRpY2FsU2NhbGUobV90ZXh0UGFyc2VyLkdldFZlclNjYWxlKG1fcFRleHRQcm92aWRlciwgcFN0eWxlKSk7DQorICBtX3BCcmVhay0+U2V0Q2hhclNwYWNlKHBQYXJhU3R5bGUtPkdldExldHRlclNwYWNpbmcoKS5HZXRWYWx1ZSgpKTsNCiB9DQotdm9pZCBDWEZBX1RleHRMYXlvdXQ6OkluaXRCcmVhayhJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSwgRkRFX0NTU0RJU1BMQVkgZURpc3BsYXksIEZYX0ZMT0FUIGZMaW5lV2lkdGgsIElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFBhcmVudFN0eWxlKQ0KLXsNCi0gICAgaWYgKHBTdHlsZSA9PSBOVUxMKSB7DQotICAgICAgICBJbml0QnJlYWsoZkxpbmVXaWR0aCk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSAqcFBhcmFTdHlsZSA9IHBTdHlsZS0+R2V0UGFyYWdyYXBoU3R5bGVzKCk7DQotICAgIGlmIChlRGlzcGxheSA9PSBGREVfQ1NTRElTUExBWV9CbG9jayB8fCBlRGlzcGxheSA9PSBGREVfQ1NTRElTUExBWV9MaXN0SXRlbSkgew0KLSAgICAgICAgaW50MzJfdCBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQ7DQotICAgICAgICBzd2l0Y2ggKHBQYXJhU3R5bGUtPkdldFRleHRBbGlnbigpKSB7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTVEVYVEFMSUdOX1JpZ2h0Og0KLSAgICAgICAgICAgICAgICBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX1JpZ2h0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NURVhUQUxJR05fQ2VudGVyOg0KLSAgICAgICAgICAgICAgICBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX0NlbnRlcjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfQ1NTVEVYVEFMSUdOX0p1c3RpZnk6DQotICAgICAgICAgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9DU1NURVhUQUxJR05fSnVzdGlmeUFsbDoNCi0gICAgICAgICAgICAgICAgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBtX3BCcmVhay0+U2V0QWxpZ25tZW50KGlBbGlnbik7DQotICAgICAgICBGWF9GTE9BVCBmU3RhcnQgPSAwOw0KLSAgICAgICAgY29uc3QgRkRFX0NTU1JFQ1QgKnBSZWN0ID0gcFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5HZXRNYXJnaW5XaWR0aCgpOw0KLSAgICAgICAgY29uc3QgRkRFX0NTU1JFQ1QgKnBQYWRkaW5nUmVjdCA9IHBTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKS0+R2V0UGFkZGluZ1dpZHRoKCk7DQotICAgICAgICBpZiAocFJlY3QgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGZTdGFydCA9IHBSZWN0LT5sZWZ0LkdldFZhbHVlKCk7DQotICAgICAgICAgICAgZkxpbmVXaWR0aCAtPSBwUmVjdC0+cmlnaHQuR2V0VmFsdWUoKTsNCi0gICAgICAgICAgICBpZiAocFBhZGRpbmdSZWN0ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgZlN0YXJ0ICs9IHBQYWRkaW5nUmVjdC0+bGVmdC5HZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICBmTGluZVdpZHRoIC09IHBQYWRkaW5nUmVjdC0+cmlnaHQuR2V0VmFsdWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGVEaXNwbGF5ID09IEZERV9DU1NESVNQTEFZX0xpc3RJdGVtKSB7DQotICAgICAgICAgICAgICAgIGNvbnN0IEZERV9DU1NSRUNUICpwUGFyUmVjdCA9IHBQYXJlbnRTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKS0+R2V0TWFyZ2luV2lkdGgoKTsNCi0gICAgICAgICAgICAgICAgY29uc3QgRkRFX0NTU1JFQ1QgKnBQYXJQYWRkaW5nUmVjdCA9IHBQYXJlbnRTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKS0+R2V0UGFkZGluZ1dpZHRoKCk7DQotICAgICAgICAgICAgICAgIGlmIChwUGFyUmVjdCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBmU3RhcnQgKz0gcFBhclJlY3QtPmxlZnQuR2V0VmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZMaW5lV2lkdGggLT0gcFBhclJlY3QtPnJpZ2h0LkdldFZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFBhclBhZGRpbmdSZWN0ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmU3RhcnQgKz0gcFBhclBhZGRpbmdSZWN0LT5sZWZ0LkdldFZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZkxpbmVXaWR0aCAtPSBwUGFyUGFkZGluZ1JlY3QtPnJpZ2h0LkdldFZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRkRFX0NTU1JFQ1QgcE5ld1JlY3Q7DQotICAgICAgICAgICAgICAgIHBOZXdSZWN0LmxlZnQuU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBmU3RhcnQpOw0KLSAgICAgICAgICAgICAgICBwTmV3UmVjdC5yaWdodC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIHBSZWN0LT5yaWdodC5HZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgcE5ld1JlY3QudG9wLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcFJlY3QtPnRvcC5HZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgcE5ld1JlY3QuYm90dG9tLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcFJlY3QtPmJvdHRvbS5HZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgcFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5TZXRNYXJnaW5XaWR0aChwTmV3UmVjdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wQnJlYWstPlNldExpbmVXaWR0aChmU3RhcnQsIGZMaW5lV2lkdGgpOw0KLSAgICAgICAgRlhfRkxPQVQgZkluZGVudCA9IHBQYXJhU3R5bGUtPkdldFRleHRJbmRlbnQoKS5HZXRWYWx1ZSgpOw0KLSAgICAgICAgaWYgKGZJbmRlbnQgPiAwKSB7DQotICAgICAgICAgICAgZlN0YXJ0ICs9IGZJbmRlbnQ7DQotICAgICAgICB9DQotICAgICAgICBtX3BCcmVhay0+U2V0TGluZVBvcyhmU3RhcnQpOw0KLSAgICAgICAgbV9wQnJlYWstPlNldFRhYldpZHRoKG1fdGV4dFBhcnNlci5HZXRUYWJJbnRlcnZhbChwU3R5bGUpKTsNCi0gICAgICAgIGlmIChtX3BUYWJzdG9wQ29udGV4dCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQgPSBGWF9ORVcgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgbV90ZXh0UGFyc2VyLkdldFRhYnN0b3BzKHBTdHlsZSwgbV9wVGFic3RvcENvbnRleHQpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9wVGFic3RvcENvbnRleHQtPm1faVRhYkNvdW50OyBpKyspIHsNCi0gICAgICAgICAgICBYRkFfVEFCU1RPUFMgKnBUYWIgPSBtX3BUYWJzdG9wQ29udGV4dC0+bV90YWJzdG9wcy5HZXREYXRhUHRyKGkpOw0KLSAgICAgICAgICAgIG1fcEJyZWFrLT5BZGRQb3NpdGlvbmVkVGFiKHBUYWItPmZUYWJzdG9wcyk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZkZvbnRTaXplID0gbV90ZXh0UGFyc2VyLkdldEZvbnRTaXplKG1fcFRleHRQcm92aWRlciwgcFN0eWxlKTsNCi0gICAgbV9wQnJlYWstPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQotICAgIG1fcEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UoZkZvbnRTaXplICogMC4yZik7DQotICAgIG1fcEJyZWFrLT5TZXRGb250KG1fdGV4dFBhcnNlci5HZXRGb250KG1fcFRleHRQcm92aWRlciwgcFN0eWxlKSk7DQotICAgIG1fcEJyZWFrLT5TZXRIb3Jpem9udGFsU2NhbGUobV90ZXh0UGFyc2VyLkdldEhvclNjYWxlKG1fcFRleHRQcm92aWRlciwgcFN0eWxlLCBwWE1MTm9kZSkpOw0KLSAgICBtX3BCcmVhay0+U2V0VmVydGljYWxTY2FsZShtX3RleHRQYXJzZXIuR2V0VmVyU2NhbGUobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpKTsNCi0gICAgbV9wQnJlYWstPlNldENoYXJTcGFjZShwUGFyYVN0eWxlLT5HZXRMZXR0ZXJTcGFjaW5nKCkuR2V0VmFsdWUoKSk7DQoraW50MzJfdCBDWEZBX1RleHRMYXlvdXQ6OkdldFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgR2V0VGV4dERhdGFOb2RlKCk7DQorICB3c1RleHQuRW1wdHkoKTsNCisgIGlmIChtX2JSaWNoVGV4dCkgew0KKyAgfSBlbHNlIHsNCisgICAgd3NUZXh0ID0gbV9wVGV4dERhdGFOb2RlLT5HZXRDb250ZW50KCk7DQorICB9DQorICByZXR1cm4gd3NUZXh0LkdldExlbmd0aCgpOw0KIH0NCi1pbnQzMl90IENYRkFfVGV4dExheW91dDo6R2V0VGV4dChDRlhfV2lkZVN0cmluZyAmd3NUZXh0KQ0KLXsNCi0gICAgR2V0VGV4dERhdGFOb2RlKCk7DQotICAgIHdzVGV4dC5FbXB0eSgpOw0KLSAgICBpZiAobV9iUmljaFRleHQpIHsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHdzVGV4dCA9IG1fcFRleHREYXRhTm9kZS0+R2V0Q29udGVudCgpOw0KK0ZYX0ZMT0FUIENYRkFfVGV4dExheW91dDo6R2V0TGF5b3V0SGVpZ2h0KCkgew0KKyAgaWYgKG1fcExvYWRlciA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlDb3VudCA9PSAwICYmIG1fcExvYWRlci0+bV9mV2lkdGggPiAwKSB7DQorICAgIENGWF9TaXplRiBzek1heCwgc3pEZWY7DQorICAgIHN6TWF4LlNldChtX3BMb2FkZXItPm1fZldpZHRoLCBtX3BMb2FkZXItPm1fZkhlaWdodCk7DQorICAgIHN6RGVmLlNldCgwLCAwKTsNCisgICAgbV9wTG9hZGVyLT5tX2JTYXZlTGluZUhlaWdodCA9IFRSVUU7DQorICAgIG1fcExvYWRlci0+bV9mTGFzdFBvcyA9IDA7DQorICAgIENhbGNTaXplKHN6TWF4LCBzek1heCwgc3pEZWYpOw0KKyAgICBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0ID0gRkFMU0U7DQorICAgIHJldHVybiBzekRlZi55Ow0KKyAgfQ0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IG1fcExvYWRlci0+bV9mSGVpZ2h0Ow0KKyAgaWYgKGZIZWlnaHQgPCAwLjFmKSB7DQorICAgIGZIZWlnaHQgPSAwOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIGZIZWlnaHQgKz0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkVsZW1lbnRBdChpKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gd3NUZXh0LkdldExlbmd0aCgpOw0KKyAgfQ0KKyAgcmV0dXJuIGZIZWlnaHQ7DQogfQ0KLUZYX0ZMT0FUIENYRkFfVGV4dExheW91dDo6R2V0TGF5b3V0SGVpZ2h0KCkNCi17DQotICAgIGlmIChtX3BMb2FkZXIgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaUNvdW50ID09IDAgJiYgbV9wTG9hZGVyLT5tX2ZXaWR0aCA+IDApIHsNCi0gICAgICAgIENGWF9TaXplRiBzek1heCwgc3pEZWY7DQotICAgICAgICBzek1heC5TZXQobV9wTG9hZGVyLT5tX2ZXaWR0aCwgbV9wTG9hZGVyLT5tX2ZIZWlnaHQpOw0KLSAgICAgICAgc3pEZWYuU2V0KDAsIDApOw0KLSAgICAgICAgbV9wTG9hZGVyLT5tX2JTYXZlTGluZUhlaWdodCA9IFRSVUU7DQotICAgICAgICBtX3BMb2FkZXItPm1fZkxhc3RQb3MgPSAwOw0KLSAgICAgICAgQ2FsY1NpemUoc3pNYXgsIHN6TWF4LCBzekRlZik7DQotICAgICAgICBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0ID0gRkFMU0U7DQotICAgICAgICByZXR1cm4gc3pEZWYueTsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gbV9wTG9hZGVyLT5tX2ZIZWlnaHQ7DQotICAgIGlmIChmSGVpZ2h0IDwgMC4xZikgew0KLSAgICAgICAgZkhlaWdodCA9IDA7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgICAgIGZIZWlnaHQgKz0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkVsZW1lbnRBdChpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gZkhlaWdodDsNCi19DQotRlhfRkxPQVQgQ1hGQV9UZXh0TGF5b3V0OjpTdGFydExheW91dChGWF9GTE9BVCBmV2lkdGggKQ0KLXsNCi0gICAgaWYgKG1fcExvYWRlciA9PSBOVUxMKSB7DQotICAgICAgICBtX3BMb2FkZXIgPSBGWF9ORVcgQ1hGQV9Mb2FkZXJDb250ZXh0Ow0KLSAgICB9DQotICAgIGlmIChmV2lkdGggPCAwIHx8IChtX3BMb2FkZXItPm1fZldpZHRoID4gLTEgJiYgRlhTWVNfZmFicyhmV2lkdGggLSBtX3BMb2FkZXItPm1fZldpZHRoKSA+IDApKSB7DQotICAgICAgICBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuUmVtb3ZlQWxsKCk7DQotICAgICAgICBtX0Jsb2Nrcy5SZW1vdmVBbGwoKTsNCi0gICAgICAgIFVubG9hZCgpOw0KLSAgICAgICAgbV9wTG9hZGVyLT5tX2ZTdGFydExpbmVPZmZzZXQgPSAwOw0KLSAgICB9DQotICAgIG1fcExvYWRlci0+bV9mV2lkdGggPSBmV2lkdGg7DQotICAgIGlmIChmV2lkdGggPCAwKSB7DQotICAgICAgICBDRlhfU2l6ZUYgc3pNYXgsIHN6RGVmOw0KLSAgICAgICAgc3pNYXguU2V0KDAsIDApOw0KLSAgICAgICAgc3pEZWYuU2V0KDAsIDApOw0KLSAgICAgICAgbV9wTG9hZGVyLT5tX2JTYXZlTGluZUhlaWdodCA9IFRSVUU7DQotICAgICAgICBtX3BMb2FkZXItPm1fZkxhc3RQb3MgPSAwOw0KLSAgICAgICAgQ2FsY1NpemUoc3pNYXgsIHN6TWF4LCBzekRlZik7DQotICAgICAgICBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0ID0gRkFMU0U7DQotICAgICAgICBmV2lkdGggPSBzekRlZi54Ow0KLSAgICB9DQotICAgIHJldHVybiBmV2lkdGg7DQotfQ0KLUZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpEb0xheW91dChpbnQzMl90IGlCbG9ja0luZGV4LCBGWF9GTE9BVCAmZkNhbGNIZWlnaHQsIEZYX0ZMT0FUIGZDb250ZW50QXJlYUhlaWdodCAsIEZYX0ZMT0FUIGZUZXh0SGVpZ2h0ICkNCi17DQotICAgIGlmIChtX3BMb2FkZXIgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGludDMyX3QgaUJsb2NrQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCk7DQotICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBmVGV4dEhlaWdodDsNCi0gICAgaWYgKGZIZWlnaHQgPCAwKSB7DQotICAgICAgICBmSGVpZ2h0ID0gR2V0TGF5b3V0SGVpZ2h0KCk7DQotICAgIH0NCi0gICAgbV9wTG9hZGVyLT5tX2ZIZWlnaHQgPSBmSGVpZ2h0Ow0KLSAgICBpZiAoZkNvbnRlbnRBcmVhSGVpZ2h0IDwgMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG1fYkhhc0Jsb2NrID0gVFJVRTsNCi0gICAgaWYgKGlCbG9ja0NvdW50ID09IDAgJiYgZkhlaWdodCA+IDApIHsNCi0gICAgICAgIGZIZWlnaHQgPSBmVGV4dEhlaWdodCAtIEdldExheW91dEhlaWdodCgpOw0KLSAgICAgICAgaWYgKGZIZWlnaHQgPiAwKSB7DQotICAgICAgICAgICAgaW50MzJfdCBpQWxpZ24gPSBtX3RleHRQYXJzZXIuR2V0VkFsZ2luKG1fcFRleHRQcm92aWRlcik7DQotICAgICAgICAgICAgaWYgKGlBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGUpIHsNCi0gICAgICAgICAgICAgICAgZkhlaWdodCAvPSAyLjBmOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaUFsaWduICE9IFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbSkgew0KLSAgICAgICAgICAgICAgICBmSGVpZ2h0ID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9wTG9hZGVyLT5tX2ZTdGFydExpbmVPZmZzZXQgPSBmSGVpZ2h0Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZMaW5lUG9zID0gbV9wTG9hZGVyLT5tX2ZTdGFydExpbmVPZmZzZXQ7DQotICAgIGludDMyX3QgaUxpbmVJbmRleCA9IDA7DQotICAgIGlmIChpQmxvY2tDb3VudCA+IDEpIHsNCi0gICAgICAgIGlmIChpQmxvY2tDb3VudCA+PSAoaUJsb2NrSW5kZXggKyAxKSAqIDIpIHsNCi0gICAgICAgICAgICBpTGluZUluZGV4ID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9ja0luZGV4ICogMik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlMaW5lSW5kZXggPSBtX0Jsb2Nrcy5FbGVtZW50QXQoaUJsb2NrQ291bnQgLSAxKSArIG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2tDb3VudCAtIDIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuR2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlCbG9ja0luZGV4OyBpKyspIHsNCi0gICAgICAgICAgICAgICAgZkxpbmVQb3MgLT0gbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5FbGVtZW50QXQoaSAqIDIgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuR2V0U2l6ZSgpOw0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBmb3IgKGkgPSBpTGluZUluZGV4OyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0ID0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkVsZW1lbnRBdChpKTsNCi0gICAgICAgIGlmICgoaSA9PSBpTGluZUluZGV4KSAmJiAoZkxpbmVIZWlnaHQgLSBmQ29udGVudEFyZWFIZWlnaHQgPiAwLjAwMSkpIHsNCi0gICAgICAgICAgICBmQ2FsY0hlaWdodCA9IDA7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZkxpbmVQb3MgKyBmTGluZUhlaWdodCAtIGZDb250ZW50QXJlYUhlaWdodCA+IDAuMDAxKSB7DQotICAgICAgICAgICAgaWYgKGlCbG9ja0NvdW50ID49IChpQmxvY2tJbmRleCArIDEpICogMikgew0KLSAgICAgICAgICAgICAgICBtX0Jsb2Nrcy5TZXRBdChpQmxvY2tJbmRleCAqIDIsIGlMaW5lSW5kZXgpOw0KLSAgICAgICAgICAgICAgICBtX0Jsb2Nrcy5TZXRBdChpQmxvY2tJbmRleCAqIDIgKyAxLCBpIC0gaUxpbmVJbmRleCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgbV9CbG9ja3MuQWRkKGlMaW5lSW5kZXgpOw0KLSAgICAgICAgICAgICAgICBtX0Jsb2Nrcy5BZGQoaSAtIGlMaW5lSW5kZXgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoaSA9PSBpTGluZUluZGV4KSB7DQotICAgICAgICAgICAgICAgIGlmIChmQ2FsY0hlaWdodCA8PSBmTGluZVBvcykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuR2V0U2l6ZSgpID4gaUJsb2NrSW5kZXggKiAyICYmIChtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LkdldEF0KGlCbG9ja0luZGV4ICogMikgPT0gaUJsb2NrSW5kZXgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5TZXRBdChpQmxvY2tJbmRleCAqIDIgKyAxLCBmQ2FsY0hlaWdodCk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuQWRkKChGWF9GTE9BVClpQmxvY2tJbmRleCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5BZGQoZkNhbGNIZWlnaHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmQ2FsY0hlaWdodCA9IGZMaW5lUG9zOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZkxpbmVQb3MgKz0gZkxpbmVIZWlnaHQ7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1pbnQzMl90IENYRkFfVGV4dExheW91dDo6Q291bnRCbG9ja3MoKSBjb25zdA0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCkgLyAyOw0KLSAgICByZXR1cm4gaUNvdW50ID4gMCA/IGlDb3VudCA6IDE7DQotfQ0KLUZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpDYWxjU2l6ZShjb25zdCBDRlhfU2l6ZUYgJm1pblNpemUsIGNvbnN0IENGWF9TaXplRiAmbWF4U2l6ZSwgQ0ZYX1NpemVGICZkZWZhdWx0U2l6ZSkNCi17DQotICAgIGRlZmF1bHRTaXplLnggPSBtYXhTaXplLng7DQotICAgIGlmIChkZWZhdWx0U2l6ZS54IDwgMSkgew0KLSAgICAgICAgZGVmYXVsdFNpemUueCA9IDB4RkZGRjsNCi0gICAgfQ0KLSAgICBpZiAobV9wQnJlYWsgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wQnJlYWstPlJlbGVhc2UoKTsNCi0gICAgfQ0KLSAgICBtX3BCcmVhayA9IENyZWF0ZUJyZWFrKEZBTFNFKTsNCi0gICAgRlhfRkxPQVQgZkxpbmVQb3MgPSAwOw0KLSAgICBtX2lMaW5lcyA9IDA7DQotICAgIG1fZk1heFdpZHRoID0gMDsNCi0gICAgTG9hZGVyKGRlZmF1bHRTaXplLCBmTGluZVBvcywgRkFMU0UpOw0KLSAgICBpZiAoZkxpbmVQb3MgPCAwLjFmKSB7DQotICAgICAgICBmTGluZVBvcyA9IG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIE5VTEwpOw0KLSAgICB9DQotICAgIGlmIChtX3BUYWJzdG9wQ29udGV4dCkgew0KLSAgICAgICAgZGVsZXRlIG1fcFRhYnN0b3BDb250ZXh0Ow0KLSAgICAgICAgbV9wVGFic3RvcENvbnRleHQgPSBOVUxMOw0KLSAgICB9DQotICAgIGRlZmF1bHRTaXplLlNldChtX2ZNYXhXaWR0aCwgZkxpbmVQb3MpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX1RleHRMYXlvdXQ6OkxheW91dChjb25zdCBDRlhfU2l6ZUYgJnNpemUsIEZYX0ZMT0FUKiBmSGVpZ2h0KQ0KLXsNCi0gICAgaWYgKHNpemUueCA8IDEpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KK0ZYX0ZMT0FUIENYRkFfVGV4dExheW91dDo6U3RhcnRMYXlvdXQoRlhfRkxPQVQgZldpZHRoKSB7DQorICBpZiAobV9wTG9hZGVyID09IE5VTEwpIHsNCisgICAgbV9wTG9hZGVyID0gRlhfTkVXIENYRkFfTG9hZGVyQ29udGV4dDsNCisgIH0NCisgIGlmIChmV2lkdGggPCAwIHx8IChtX3BMb2FkZXItPm1fZldpZHRoID4gLTEgJiYNCisgICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKGZXaWR0aCAtIG1fcExvYWRlci0+bV9mV2lkdGgpID4gMCkpIHsNCisgICAgbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLlJlbW92ZUFsbCgpOw0KKyAgICBtX0Jsb2Nrcy5SZW1vdmVBbGwoKTsNCiAgICAgVW5sb2FkKCk7DQotICAgIG1fcEJyZWFrID0gQ3JlYXRlQnJlYWsoVFJVRSk7DQotICAgIGlmIChtX3BMb2FkZXIgIT0gTlVMTCkgew0KLSAgICAgICAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gLTE7DQotICAgICAgICBtX3BMb2FkZXItPm1faUNoYXIgPSAwOw0KLSAgICB9DQotICAgIG1faUxpbmVzID0gMDsNCi0gICAgRlhfRkxPQVQgZkxpbmVQb3MgPSAwOw0KLSAgICBMb2FkZXIoc2l6ZSwgZkxpbmVQb3MsIFRSVUUpOw0KLSAgICBVcGRhdGVBbGlnbihzaXplLnksIGZMaW5lUG9zKTsNCi0gICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0KSB7DQotICAgICAgICBkZWxldGUgbV9wVGFic3RvcENvbnRleHQ7DQotICAgICAgICBtX3BUYWJzdG9wQ29udGV4dCA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKGZIZWlnaHQpIHsNCi0gICAgICAgICpmSGVpZ2h0ID0gZkxpbmVQb3M7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0ID0gMDsNCisgIH0NCisgIG1fcExvYWRlci0+bV9mV2lkdGggPSBmV2lkdGg7DQorICBpZiAoZldpZHRoIDwgMCkgew0KKyAgICBDRlhfU2l6ZUYgc3pNYXgsIHN6RGVmOw0KKyAgICBzek1heC5TZXQoMCwgMCk7DQorICAgIHN6RGVmLlNldCgwLCAwKTsNCisgICAgbV9wTG9hZGVyLT5tX2JTYXZlTGluZUhlaWdodCA9IFRSVUU7DQorICAgIG1fcExvYWRlci0+bV9mTGFzdFBvcyA9IDA7DQorICAgIENhbGNTaXplKHN6TWF4LCBzek1heCwgc3pEZWYpOw0KKyAgICBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0ID0gRkFMU0U7DQorICAgIGZXaWR0aCA9IHN6RGVmLng7DQorICB9DQorICByZXR1cm4gZldpZHRoOw0KIH0NCi1GWF9CT09MIENYRkFfVGV4dExheW91dDo6TGF5b3V0KGludDMyX3QgaUJsb2NrKQ0KLXsNCi0gICAgaWYgKG1fcExvYWRlciA9PSBOVUxMIHx8IGlCbG9jayA8IDAgfHwgaUJsb2NrID49IENvdW50QmxvY2tzKCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfVGV4dExheW91dDo6RG9MYXlvdXQoaW50MzJfdCBpQmxvY2tJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudEFyZWFIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZXh0SGVpZ2h0KSB7DQorICBpZiAobV9wTG9hZGVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBpQmxvY2tDb3VudCA9IG1fQmxvY2tzLkdldFNpemUoKTsNCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBmVGV4dEhlaWdodDsNCisgIGlmIChmSGVpZ2h0IDwgMCkgew0KKyAgICBmSGVpZ2h0ID0gR2V0TGF5b3V0SGVpZ2h0KCk7DQorICB9DQorICBtX3BMb2FkZXItPm1fZkhlaWdodCA9IGZIZWlnaHQ7DQorICBpZiAoZkNvbnRlbnRBcmVhSGVpZ2h0IDwgMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2JIYXNCbG9jayA9IFRSVUU7DQorICBpZiAoaUJsb2NrQ291bnQgPT0gMCAmJiBmSGVpZ2h0ID4gMCkgew0KKyAgICBmSGVpZ2h0ID0gZlRleHRIZWlnaHQgLSBHZXRMYXlvdXRIZWlnaHQoKTsNCisgICAgaWYgKGZIZWlnaHQgPiAwKSB7DQorICAgICAgaW50MzJfdCBpQWxpZ24gPSBtX3RleHRQYXJzZXIuR2V0VkFsZ2luKG1fcFRleHRQcm92aWRlcik7DQorICAgICAgaWYgKGlBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGUpIHsNCisgICAgICAgIGZIZWlnaHQgLz0gMi4wZjsNCisgICAgICB9IGVsc2UgaWYgKGlBbGlnbiAhPSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20pIHsNCisgICAgICAgIGZIZWlnaHQgPSAwOw0KKyAgICAgIH0NCisgICAgICBtX3BMb2FkZXItPm1fZlN0YXJ0TGluZU9mZnNldCA9IGZIZWlnaHQ7DQogICAgIH0NCi0gICAgaWYgKG1fcExvYWRlci0+bV9mV2lkdGggPCAxKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9GTE9BVCBmTGluZVBvcyA9IG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0Ow0KKyAgaW50MzJfdCBpTGluZUluZGV4ID0gMDsNCisgIGlmIChpQmxvY2tDb3VudCA+IDEpIHsNCisgICAgaWYgKGlCbG9ja0NvdW50ID49IChpQmxvY2tJbmRleCArIDEpICogMikgew0KKyAgICAgIGlMaW5lSW5kZXggPSBtX0Jsb2Nrcy5FbGVtZW50QXQoaUJsb2NrSW5kZXggKiAyKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpTGluZUluZGV4ID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9ja0NvdW50IC0gMSkgKw0KKyAgICAgICAgICAgICAgICAgICBtX0Jsb2Nrcy5FbGVtZW50QXQoaUJsb2NrQ291bnQgLSAyKTsNCiAgICAgfQ0KLSAgICBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPSAtMTsNCi0gICAgbV9pTGluZXMgPSAwOw0KLSAgICBGWF9GTE9BVCBmTGluZVBvcyA9IDA7DQotICAgIENYRkFfTm9kZSAqcE5vZGUgPSBOVUxMOw0KLSAgICBDRlhfU2l6ZUYgc3pUZXh0Ow0KLSAgICBzelRleHQuU2V0KG1fcExvYWRlci0+bV9mV2lkdGgsIG1fcExvYWRlci0+bV9mSGVpZ2h0KTsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaUJsb2Nrc0hlaWdodENvdW50ID0gbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5HZXRTaXplKCk7DQotICAgIGlCbG9ja3NIZWlnaHRDb3VudCAvPSAyOw0KLSAgICBpZiAoaUJsb2NrIDwgaUJsb2Nrc0hlaWdodENvdW50KSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgaWYgKG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlCbG9ja0luZGV4OyBpKyspIHsNCisgICAgICAgIGZMaW5lUG9zIC09IG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuRWxlbWVudEF0KGkgKiAyICsgMSk7DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmIChpQmxvY2sgPT0gaUJsb2Nrc0hlaWdodENvdW50KSB7DQotICAgICAgICBVbmxvYWQoKTsNCi0gICAgICAgIG1fcEJyZWFrID0gQ3JlYXRlQnJlYWsoVFJVRSk7DQotICAgICAgICBmTGluZVBvcyA9IG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0Ow0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2Nrc0hlaWdodENvdW50OyBpKyspIHsNCi0gICAgICAgICAgICBmTGluZVBvcyAtPSBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LkVsZW1lbnRBdChpICogMiArIDEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wTG9hZGVyLT5tX2lDaGFyID0gMDsNCi0gICAgICAgIGlmIChpQ291bnQgPiAxKSB7DQotICAgICAgICAgICAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9jayAqIDIgKyAxKTsNCi0gICAgICAgIH0NCi0gICAgICAgIExvYWRlcihzelRleHQsIGZMaW5lUG9zLCBUUlVFKTsNCi0gICAgICAgIGlmIChpQ291bnQgPT0gMCAmJiBtX3BMb2FkZXItPm1fZlN0YXJ0TGluZU9mZnNldCA8IDAuMWYpIHsNCi0gICAgICAgICAgICBVcGRhdGVBbGlnbihzelRleHQueSwgZkxpbmVQb3MpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKG1fcFRleHREYXRhTm9kZSAhPSBOVUxMKSB7DQotICAgICAgICBpQmxvY2sgKj0gMjsNCi0gICAgICAgIGlmIChpQmxvY2sgPCBpQ291bnQgLSAyKSB7DQotICAgICAgICAgICAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9jayArIDEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wQnJlYWstPlJlc2V0KCk7DQotICAgICAgICBpZiAobV9iUmljaFRleHQpIHsNCi0gICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBDb250YWluZXJOb2RlID0gR2V0WE1MQ29udGFpbmVyTm9kZSgpOw0KLSAgICAgICAgICAgIGlmICghcENvbnRhaW5lck5vZGUpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIElGREVfWE1MTm9kZSAqcFhNTE5vZGUgPSBtX3BMb2FkZXItPm1fcFhNTE5vZGU7DQotICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFNhdmVYTUxOb2RlID0gbV9wTG9hZGVyLT5tX3BYTUxOb2RlOw0KLSAgICAgICAgICAgIGZvciAoOyBwWE1MTm9kZTsgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxhZyA9IExvYWRSaWNoVGV4dChwWE1MTm9kZSwgc3pUZXh0LCBmTGluZVBvcywgbV9wTG9hZGVyLT5tX3BQYXJlbnRTdHlsZSwgVFJVRSk7DQotICAgICAgICAgICAgICAgIGlmICghYkZsYWcpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdoaWxlIChwWE1MTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIHBYTUxOb2RlID0gcFNhdmVYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCk7DQotICAgICAgICAgICAgICAgIGlmIChwWE1MTm9kZSA9PSBwQ29udGFpbmVyTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxhZyA9IExvYWRSaWNoVGV4dChwWE1MTm9kZSwgc3pUZXh0LCBmTGluZVBvcywgbV9wTG9hZGVyLT5tX3BQYXJlbnRTdHlsZSwgVFJVRSwgTlVMTCAsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFiRmxhZykgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcFNhdmVYTUxOb2RlID0gcFhNTE5vZGU7DQotICAgICAgICAgICAgICAgIHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgICAgICBpZiAoIXBYTUxOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmb3IgKDsgcFhNTE5vZGU7IHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGFnID0gTG9hZFJpY2hUZXh0KHBYTUxOb2RlLCBzelRleHQsIGZMaW5lUG9zLCBtX3BMb2FkZXItPm1fcFBhcmVudFN0eWxlLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghYkZsYWcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcE5vZGUgPSBtX3BMb2FkZXItPm1fcE5vZGU7DQotICAgICAgICAgICAgaWYgKHBOb2RlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIExvYWRUZXh0KHBOb2RlLCBzelRleHQsIGZMaW5lUG9zLCBUUlVFKTsNCi0gICAgICAgIH0NCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkdldFNpemUoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSBpTGluZUluZGV4OyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuRWxlbWVudEF0KGkpOw0KKyAgICBpZiAoKGkgPT0gaUxpbmVJbmRleCkgJiYgKGZMaW5lSGVpZ2h0IC0gZkNvbnRlbnRBcmVhSGVpZ2h0ID4gMC4wMDEpKSB7DQorICAgICAgZkNhbGNIZWlnaHQgPSAwOw0KKyAgICAgIHJldHVybiBUUlVFOw0KICAgICB9DQotICAgIGlmIChpQmxvY2sgPT0gaUNvdW50KSB7DQotICAgICAgICBpZiAobV9wVGFic3RvcENvbnRleHQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBtX3BUYWJzdG9wQ29udGV4dDsNCi0gICAgICAgICAgICBtX3BUYWJzdG9wQ29udGV4dCA9IE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wTG9hZGVyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBkZWxldGUgbV9wTG9hZGVyOw0KLSAgICAgICAgICAgIG1fcExvYWRlciA9IE5VTEw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpJdGVtQmxvY2tzKGNvbnN0IENGWF9SZWN0RiYgcnRUZXh0LCBpbnQzMl90IGlCbG9ja0luZGV4KQ0KLXsNCi0gICAgaWYgKCFtX3BMb2FkZXIpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDb3VudEhlaWdodCA9IG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5HZXRTaXplKCk7DQotICAgIGlmIChpQ291bnRIZWlnaHQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYkVuZEl0ZW0gPSBUUlVFOw0KLSAgICBpbnQzMl90IGlCbG9ja0NvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOw0KLSAgICBGWF9GTE9BVCBmTGluZVBvcyA9IG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0Ow0KLSAgICBpbnQzMl90IGlMaW5lSW5kZXggPSAwOw0KLSAgICBpZiAoaUJsb2NrSW5kZXggPiAwKSB7DQotICAgICAgICBpbnQzMl90IGlCbG9ja0hlaWdodENvdW50ID0gbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5HZXRTaXplKCk7DQotICAgICAgICBpQmxvY2tIZWlnaHRDb3VudCAvPSAyOw0KLSAgICAgICAgaWYgKGlCbG9ja0hlaWdodENvdW50ID49IGlCbG9ja0luZGV4KSB7DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2NrSW5kZXg7IGkrKykgew0KLSAgICAgICAgICAgICAgICBmTGluZVBvcyAtPSBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LkVsZW1lbnRBdChpICogMiArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZkxpbmVQb3MgPSAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaUxpbmVJbmRleCA9IG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2tDb3VudCAtIDEpICsgbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9ja0NvdW50IC0gMik7DQotICAgIH0NCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yIChpID0gaUxpbmVJbmRleDsgaSA8IGlDb3VudEhlaWdodDsgaSsrKSB7DQotICAgICAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5FbGVtZW50QXQoaSk7DQotICAgICAgICBpZiAoZkxpbmVQb3MgKyBmTGluZUhlaWdodCAtIHJ0VGV4dC5oZWlnaHQgPiAwLjAwMSkgew0KLSAgICAgICAgICAgIG1fQmxvY2tzLkFkZChpTGluZUluZGV4KTsNCi0gICAgICAgICAgICBtX0Jsb2Nrcy5BZGQoaSAtIGlMaW5lSW5kZXgpOw0KLSAgICAgICAgICAgIGJFbmRJdGVtID0gRkFMU0U7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBmTGluZVBvcyArPSBmTGluZUhlaWdodDsNCi0gICAgfQ0KLSAgICBpZiAoaUNvdW50SGVpZ2h0ID4gMCAmJiAoaSAtIGlMaW5lSW5kZXgpID4gMCAmJiBiRW5kSXRlbSkgew0KKyAgICBpZiAoZkxpbmVQb3MgKyBmTGluZUhlaWdodCAtIGZDb250ZW50QXJlYUhlaWdodCA+IDAuMDAxKSB7DQorICAgICAgaWYgKGlCbG9ja0NvdW50ID49IChpQmxvY2tJbmRleCArIDEpICogMikgew0KKyAgICAgICAgbV9CbG9ja3MuU2V0QXQoaUJsb2NrSW5kZXggKiAyLCBpTGluZUluZGV4KTsNCisgICAgICAgIG1fQmxvY2tzLlNldEF0KGlCbG9ja0luZGV4ICogMiArIDEsIGkgLSBpTGluZUluZGV4KTsNCisgICAgICB9IGVsc2Ugew0KICAgICAgICAgbV9CbG9ja3MuQWRkKGlMaW5lSW5kZXgpOw0KICAgICAgICAgbV9CbG9ja3MuQWRkKGkgLSBpTGluZUluZGV4KTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENYRkFfVGV4dExheW91dDo6RHJhd1N0cmluZyhDRlhfUmVuZGVyRGV2aWNlICpwRnhEZXZpY2UsIGNvbnN0IENGWF9NYXRyaXggJnRtRG9jMkRldmljZSwgY29uc3QgQ0ZYX1JlY3RGICZydENsaXAsIGludDMyX3QgaUJsb2NrICkNCi17DQotICAgIElGREVfUmVuZGVyRGV2aWNlICpwRGV2aWNlID0gSUZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZShwRnhEZXZpY2UpOw0KLSAgICBpZiAocERldmljZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRkRFX0hERVZJQ0VTVEFURSBzdGF0ZSA9IHBEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KLSAgICBwRGV2aWNlLT5TZXRDbGlwUmVjdChydENsaXApOw0KLSAgICBJRkRFX1NvbGlkQnJ1c2ggKnBTb2xpZEJydXNoID0gKElGREVfU29saWRCcnVzaCopSUZERV9CcnVzaDo6Q3JlYXRlKEZERV9CUlVTSFRZUEVfU29saWQpOw0KLSAgICBJRkRFX1BlbiAqcFBlbiA9IElGREVfUGVuOjpDcmVhdGUoKTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBEZXZpY2UgIT0gTlVMTCAmJiBwU29saWRCcnVzaCAhPSBOVUxMICYmIHBQZW4gIT0gTlVMTCk7DQotICAgIGlmIChtX3BpZWNlTGluZXMuR2V0U2l6ZSgpID09IDApIHsNCi0gICAgICAgIGludDMyX3QgaUJsb2NrQ291bnQgPSBDb3VudEJsb2NrcygpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2NrQ291bnQ7IGkrKykgew0KLSAgICAgICAgICAgIExheW91dChpKTsNCisgICAgICB9DQorICAgICAgaWYgKGkgPT0gaUxpbmVJbmRleCkgew0KKyAgICAgICAgaWYgKGZDYWxjSGVpZ2h0IDw9IGZMaW5lUG9zKSB7DQorICAgICAgICAgIGlmIChtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LkdldFNpemUoKSA+IGlCbG9ja0luZGV4ICogMiAmJg0KKyAgICAgICAgICAgICAgKG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuR2V0QXQoaUJsb2NrSW5kZXggKiAyKSA9PQ0KKyAgICAgICAgICAgICAgIGlCbG9ja0luZGV4KSkgew0KKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuU2V0QXQoaUJsb2NrSW5kZXggKiAyICsgMSwgZkNhbGNIZWlnaHQpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuQWRkKChGWF9GTE9BVClpQmxvY2tJbmRleCk7DQorICAgICAgICAgICAgbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5BZGQoZkNhbGNIZWlnaHQpOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgIH0NCi0gICAgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zID0gTlVMTDsNCi0gICAgaW50MzJfdCBpQ2hhckNvdW50ID0gMDsNCi0gICAgaW50MzJfdCBpTGluZVN0YXJ0ID0gMDsNCi0gICAgaW50MzJfdCBpUGllY2VMaW5lcyA9IG1fcGllY2VMaW5lcy5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaUNvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaUNvdW50ID4gMCkgew0KLSAgICAgICAgaUJsb2NrICo9IDI7DQotICAgICAgICBpZiAoaUJsb2NrIDwgaUNvdW50KSB7DQotICAgICAgICAgICAgaUxpbmVTdGFydCA9IG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2spOw0KLSAgICAgICAgICAgIGlQaWVjZUxpbmVzID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9jayArIDEpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpUGllY2VMaW5lcyA9IDA7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVBpZWNlTGluZXM7IGkrKykgew0KLSAgICAgICAgaWYoaSArIGlMaW5lU3RhcnQgPj0gbV9waWVjZUxpbmVzLkdldFNpemUoKSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9QaWVjZUxpbmUgKnBQaWVjZUxpbmUgPSBtX3BpZWNlTGluZXMuR2V0QXQoaSArIGlMaW5lU3RhcnQpOw0KLSAgICAgICAgaW50MzJfdCBpUGllY2VzID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldFNpemUoKTsNCi0gICAgICAgIGludDMyX3QgaiA9IDA7DQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgaVBpZWNlczsgaisrKSB7DQotICAgICAgICAgICAgWEZBX0xQQ1RFWFRQSUVDRSBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0QXQoaik7DQotICAgICAgICAgICAgaW50MzJfdCBpQ2hhcnMgPSBwUGllY2UtPmlDaGFyczsNCi0gICAgICAgICAgICBpZiAoaUNoYXJDb3VudCA8IGlDaGFycykgew0KLSAgICAgICAgICAgICAgICBpZiAocENoYXJQb3MgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgRkRFX0ZyZWUocENoYXJQb3MpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBDaGFyUG9zID0gKEZYVEVYVF9DSEFSUE9TKilGREVfQWxsb2MoaUNoYXJzICogc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSk7DQotICAgICAgICAgICAgICAgIGlDaGFyQ291bnQgPSBpQ2hhcnM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYU1lTX21lbXNldChwQ2hhclBvcywgMCwgaUNoYXJDb3VudCAqIHNpemVvZihGWFRFWFRfQ0hBUlBPUykpOw0KLSAgICAgICAgICAgIFJlbmRlclN0cmluZyhwRGV2aWNlLCBwU29saWRCcnVzaCwgcFBpZWNlTGluZSwgaiwgcENoYXJQb3MsIHRtRG9jMkRldmljZSk7DQotICAgICAgICB9DQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgaVBpZWNlczsgaisrKSB7DQotICAgICAgICAgICAgUmVuZGVyUGF0aChwRGV2aWNlLCBwUGVuLCBwUGllY2VMaW5lLCBqLCBwQ2hhclBvcywgdG1Eb2MyRGV2aWNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwRGV2aWNlLT5SZXN0b3JlU3RhdGUoc3RhdGUpOw0KLSAgICBpZiAocENoYXJQb3MgIT0gTlVMTCkgew0KLSAgICAgICAgRkRFX0ZyZWUocENoYXJQb3MpOw0KLSAgICB9DQotICAgIHBTb2xpZEJydXNoLT5SZWxlYXNlKCk7DQotICAgIHBQZW4tPlJlbGVhc2UoKTsNCi0gICAgcERldmljZS0+UmVsZWFzZSgpOw0KLSAgICByZXR1cm4gaVBpZWNlTGluZXM7DQotfQ0KLXZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpVcGRhdGVBbGlnbihGWF9GTE9BVCBmSGVpZ2h0LCBGWF9GTE9BVCBmQm90dG9tKQ0KLXsNCi0gICAgZkhlaWdodCAtPSBmQm90dG9tOw0KLSAgICBpZiAoZkhlaWdodCA8IDAuMWYpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKG1fdGV4dFBhcnNlci5HZXRWQWxnaW4obV9wVGV4dFByb3ZpZGVyKSkgew0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQotICAgICAgICAgICAgZkhlaWdodCAvPSAyLjBmOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fcGllY2VMaW5lcy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICBDWEZBX1BpZWNlTGluZSAqcFBpZWNlTGluZSA9IG1fcGllY2VMaW5lcy5HZXRBdChpKTsNCi0gICAgICAgIGludDMyX3QgaVBpZWNlcyA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRTaXplKCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUGllY2VzOyBqKyspIHsNCi0gICAgICAgICAgICBYRkFfTFBURVhUUElFQ0UgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGopOw0KLSAgICAgICAgICAgIENGWF9SZWN0RiAmcmVjdCA9IHBQaWVjZS0+cnRQaWVjZTsNCi0gICAgICAgICAgICByZWN0LnRvcCArPSBmSGVpZ2h0Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpMb2FkZXIoY29uc3QgQ0ZYX1NpemVGICZzelRleHQsIEZYX0ZMT0FUICZmTGluZVBvcywgRlhfQk9PTCBiU2F2ZVBpZWNlcyApDQotew0KLSAgICBpZiAobV9wQWxsb2NhdG9yID09IE5VTEwpIHsNCi0gICAgICAgIG1fcEFsbG9jYXRvciA9IEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfU3RhdGljLCAyNTYsIDApOw0KLSAgICB9DQotICAgIEdldFRleHREYXRhTm9kZSgpOw0KLSAgICBpZiAobV9wVGV4dERhdGFOb2RlID09IE5VTEwpIHsNCiAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBmQ2FsY0hlaWdodCA9IGZMaW5lUG9zOw0KKyAgICAgIHJldHVybiBUUlVFOw0KICAgICB9DQotICAgIGlmIChtX2JSaWNoVGV4dCkgew0KLSAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MQ29udGFpbmVyID0gR2V0WE1MQ29udGFpbmVyTm9kZSgpOw0KLSAgICAgICAgaWYgKHBYTUxDb250YWluZXIpIHsNCi0gICAgICAgICAgICBpZiAoIW1fdGV4dFBhcnNlci5Jc1BhcnNlZCgpKSB7DQotICAgICAgICAgICAgICAgIG1fdGV4dFBhcnNlci5Eb1BhcnNlKHBYTUxDb250YWluZXIsIG1fcFRleHRQcm92aWRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFJvb3RTdHlsZSA9IG1fdGV4dFBhcnNlci5DcmVhdGVSb290U3R5bGUobV9wVGV4dFByb3ZpZGVyKTsNCi0gICAgICAgICAgICBMb2FkUmljaFRleHQocFhNTENvbnRhaW5lciwgc3pUZXh0LCBmTGluZVBvcywgcFJvb3RTdHlsZSwgYlNhdmVQaWVjZXMpOw0KLSAgICAgICAgICAgIHBSb290U3R5bGUtPlJlbGVhc2UoKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIExvYWRUZXh0KG1fcFRleHREYXRhTm9kZSwgc3pUZXh0LCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOw0KLSAgICB9DQorICAgIGZMaW5lUG9zICs9IGZMaW5lSGVpZ2h0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitpbnQzMl90IENYRkFfVGV4dExheW91dDo6Q291bnRCbG9ja3MoKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQmxvY2tzLkdldFNpemUoKSAvIDI7DQorICByZXR1cm4gaUNvdW50ID4gMCA/IGlDb3VudCA6IDE7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpDYWxjU2l6ZShjb25zdCBDRlhfU2l6ZUYmIG1pblNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9TaXplRiYgbWF4U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NpemVGJiBkZWZhdWx0U2l6ZSkgew0KKyAgZGVmYXVsdFNpemUueCA9IG1heFNpemUueDsNCisgIGlmIChkZWZhdWx0U2l6ZS54IDwgMSkgew0KKyAgICBkZWZhdWx0U2l6ZS54ID0gMHhGRkZGOw0KKyAgfQ0KKyAgaWYgKG1fcEJyZWFrICE9IE5VTEwpIHsNCisgICAgbV9wQnJlYWstPlJlbGVhc2UoKTsNCisgIH0NCisgIG1fcEJyZWFrID0gQ3JlYXRlQnJlYWsoRkFMU0UpOw0KKyAgRlhfRkxPQVQgZkxpbmVQb3MgPSAwOw0KKyAgbV9pTGluZXMgPSAwOw0KKyAgbV9mTWF4V2lkdGggPSAwOw0KKyAgTG9hZGVyKGRlZmF1bHRTaXplLCBmTGluZVBvcywgRkFMU0UpOw0KKyAgaWYgKGZMaW5lUG9zIDwgMC4xZikgew0KKyAgICBmTGluZVBvcyA9IG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIE5VTEwpOw0KKyAgfQ0KKyAgaWYgKG1fcFRhYnN0b3BDb250ZXh0KSB7DQorICAgIGRlbGV0ZSBtX3BUYWJzdG9wQ29udGV4dDsNCisgICAgbV9wVGFic3RvcENvbnRleHQgPSBOVUxMOw0KKyAgfQ0KKyAgZGVmYXVsdFNpemUuU2V0KG1fZk1heFdpZHRoLCBmTGluZVBvcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX1RleHRMYXlvdXQ6OkxheW91dChjb25zdCBDRlhfU2l6ZUYmIHNpemUsIEZYX0ZMT0FUKiBmSGVpZ2h0KSB7DQorICBpZiAoc2l6ZS54IDwgMSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBVbmxvYWQoKTsNCisgIG1fcEJyZWFrID0gQ3JlYXRlQnJlYWsoVFJVRSk7DQorICBpZiAobV9wTG9hZGVyICE9IE5VTEwpIHsNCisgICAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gLTE7DQorICAgIG1fcExvYWRlci0+bV9pQ2hhciA9IDA7DQorICB9DQorICBtX2lMaW5lcyA9IDA7DQorICBGWF9GTE9BVCBmTGluZVBvcyA9IDA7DQorICBMb2FkZXIoc2l6ZSwgZkxpbmVQb3MsIFRSVUUpOw0KKyAgVXBkYXRlQWxpZ24oc2l6ZS55LCBmTGluZVBvcyk7DQorICBpZiAobV9wVGFic3RvcENvbnRleHQpIHsNCisgICAgZGVsZXRlIG1fcFRhYnN0b3BDb250ZXh0Ow0KKyAgICBtX3BUYWJzdG9wQ29udGV4dCA9IE5VTEw7DQorICB9DQorICBpZiAoZkhlaWdodCkgew0KKyAgICAqZkhlaWdodCA9IGZMaW5lUG9zOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpMYXlvdXQoaW50MzJfdCBpQmxvY2spIHsNCisgIGlmIChtX3BMb2FkZXIgPT0gTlVMTCB8fCBpQmxvY2sgPCAwIHx8IGlCbG9jayA+PSBDb3VudEJsb2NrcygpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChtX3BMb2FkZXItPm1fZldpZHRoIDwgMSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPSAtMTsNCisgIG1faUxpbmVzID0gMDsNCisgIEZYX0ZMT0FUIGZMaW5lUG9zID0gMDsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgQ0ZYX1NpemVGIHN6VGV4dDsNCisgIHN6VGV4dC5TZXQobV9wTG9hZGVyLT5tX2ZXaWR0aCwgbV9wTG9hZGVyLT5tX2ZIZWlnaHQpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCk7DQorICBpbnQzMl90IGlCbG9ja3NIZWlnaHRDb3VudCA9IG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuR2V0U2l6ZSgpOw0KKyAgaUJsb2Nrc0hlaWdodENvdW50IC89IDI7DQorICBpZiAoaUJsb2NrIDwgaUJsb2Nrc0hlaWdodENvdW50KSB7DQogICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENYRkFfVGV4dExheW91dDo6TG9hZFRleHQoQ1hGQV9Ob2RlICpwTm9kZSwgY29uc3QgQ0ZYX1NpemVGICZzelRleHQsIEZYX0ZMT0FUICZmTGluZVBvcywgRlhfQk9PTCBiU2F2ZVBpZWNlcykNCi17DQotICAgIEluaXRCcmVhayhzelRleHQueCk7DQotICAgIENYRkFfUGFyYSBwYXJhID0gbV9wVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpOw0KLSAgICBGWF9GTE9BVCBmU3BhY2VBYm92ZSA9IDA7DQotICAgIGlmIChwYXJhLklzRXhpc3RJblhNTCgpKSB7DQotICAgICAgICBmU3BhY2VBYm92ZSA9IHBhcmEuR2V0U3BhY2VBYm92ZSgpOw0KLSAgICAgICAgaWYgKGZTcGFjZUFib3ZlIDwgMC4xZikgew0KLSAgICAgICAgICAgIGZTcGFjZUFib3ZlID0gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgdmVyQWxpZ24gPSBwYXJhLkdldFZlcnRpY2FsQWxpZ24oKTsNCi0gICAgICAgIHN3aXRjaCAodmVyQWxpZ24pIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDoNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogew0KLSAgICAgICAgICAgICAgICAgICAgZkxpbmVQb3MgKz0gZlNwYWNlQWJvdmU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgaWYgKGlCbG9jayA9PSBpQmxvY2tzSGVpZ2h0Q291bnQpIHsNCisgICAgVW5sb2FkKCk7DQorICAgIG1fcEJyZWFrID0gQ3JlYXRlQnJlYWsoVFJVRSk7DQorICAgIGZMaW5lUG9zID0gbV9wTG9hZGVyLT5tX2ZTdGFydExpbmVPZmZzZXQ7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlCbG9ja3NIZWlnaHRDb3VudDsgaSsrKSB7DQorICAgICAgZkxpbmVQb3MgLT0gbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5FbGVtZW50QXQoaSAqIDIgKyAxKTsNCiAgICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBwTm9kZS0+R2V0Q29udGVudCgpOw0KLSAgICB3c1RleHQuVHJpbVJpZ2h0KEwiICIpOw0KLSAgICBGWF9CT09MIGJSZXQgPSBBcHBlbmRDaGFyKHdzVGV4dCwgZkxpbmVQb3MsIGZTcGFjZUFib3ZlLCBiU2F2ZVBpZWNlcyk7DQotICAgIGlmIChiUmV0ICYmIG1fcExvYWRlciAhPSBOVUxMKSB7DQotICAgICAgICBtX3BMb2FkZXItPm1fcE5vZGUgPSBwTm9kZTsNCisgICAgbV9wTG9hZGVyLT5tX2lDaGFyID0gMDsNCisgICAgaWYgKGlDb3VudCA+IDEpIHsNCisgICAgICBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPSBtX0Jsb2Nrcy5FbGVtZW50QXQoaUJsb2NrICogMiArIDEpOw0KKyAgICB9DQorICAgIExvYWRlcihzelRleHQsIGZMaW5lUG9zLCBUUlVFKTsNCisgICAgaWYgKGlDb3VudCA9PSAwICYmIG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0IDwgMC4xZikgew0KKyAgICAgIFVwZGF0ZUFsaWduKHN6VGV4dC55LCBmTGluZVBvcyk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAobV9wVGV4dERhdGFOb2RlICE9IE5VTEwpIHsNCisgICAgaUJsb2NrICo9IDI7DQorICAgIGlmIChpQmxvY2sgPCBpQ291bnQgLSAyKSB7DQorICAgICAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9jayArIDEpOw0KKyAgICB9DQorICAgIG1fcEJyZWFrLT5SZXNldCgpOw0KKyAgICBpZiAobV9iUmljaFRleHQpIHsNCisgICAgICBJRkRFX1hNTE5vZGUqIHBDb250YWluZXJOb2RlID0gR2V0WE1MQ29udGFpbmVyTm9kZSgpOw0KKyAgICAgIGlmICghcENvbnRhaW5lck5vZGUpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gbV9wTG9hZGVyLT5tX3BYTUxOb2RlOw0KKyAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgSUZERV9YTUxOb2RlKiBwU2F2ZVhNTE5vZGUgPSBtX3BMb2FkZXItPm1fcFhNTE5vZGU7DQorICAgICAgZm9yICg7IHBYTUxOb2RlOw0KKyAgICAgICAgICAgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWcgPSBMb2FkUmljaFRleHQocFhNTE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9wUGFyZW50U3R5bGUsIFRSVUUpOw0KKyAgICAgICAgaWYgKCFiRmxhZykgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgd2hpbGUgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgICAgIHBYTUxOb2RlID0gcFNhdmVYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCk7DQorICAgICAgICBpZiAocFhNTE5vZGUgPT0gcENvbnRhaW5lck5vZGUpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBGWF9CT09MIGJGbGFnID0NCisgICAgICAgICAgICBMb2FkUmljaFRleHQocFhNTE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsIG1fcExvYWRlci0+bV9wUGFyZW50U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIE5VTEwsIEZBTFNFKTsNCisgICAgICAgIGlmICghYkZsYWcpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBwU2F2ZVhNTE5vZGUgPSBwWE1MTm9kZTsNCisgICAgICAgIHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpOw0KKyAgICAgICAgaWYgKCFwWE1MTm9kZSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAoOyBwWE1MTm9kZTsNCisgICAgICAgICAgICAgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgICAgRlhfQk9PTCBiRmxhZyA9IExvYWRSaWNoVGV4dChwWE1MTm9kZSwgc3pUZXh0LCBmTGluZVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fcFBhcmVudFN0eWxlLCBUUlVFKTsNCisgICAgICAgICAgaWYgKCFiRmxhZykgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgRW5kQnJlYWsoRlhfUlRGQlJFQUtfUGFyYWdyYXBoQnJlYWssIGZMaW5lUG9zLCBiU2F2ZVBpZWNlcyk7DQorICAgICAgcE5vZGUgPSBtX3BMb2FkZXItPm1fcE5vZGU7DQorICAgICAgaWYgKHBOb2RlID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBMb2FkVGV4dChwTm9kZSwgc3pUZXh0LCBmTGluZVBvcywgVFJVRSk7DQogICAgIH0NCisgIH0NCisgIGlmIChpQmxvY2sgPT0gaUNvdW50KSB7DQorICAgIGlmIChtX3BUYWJzdG9wQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgZGVsZXRlIG1fcFRhYnN0b3BDb250ZXh0Ow0KKyAgICAgIG1fcFRhYnN0b3BDb250ZXh0ID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wTG9hZGVyICE9IE5VTEwpIHsNCisgICAgICBkZWxldGUgbV9wTG9hZGVyOw0KKyAgICAgIG1fcExvYWRlciA9IE5VTEw7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MCSBDWEZBX1RleHRMYXlvdXQ6OkxvYWRSaWNoVGV4dChJRkRFX1hNTE5vZGUgKnBYTUxOb2RlLCBjb25zdCBDRlhfU2l6ZUYgJnN6VGV4dCwgRlhfRkxPQVQgJmZMaW5lUG9zLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBQYXJlbnRTdHlsZSwgRlhfQk9PTCBiU2F2ZVBpZWNlcywgQ1hGQV9MaW5rVXNlckRhdGEqIHBMaW5rRGF0YSwgRlhfQk9PTCBiRW5kQnJlYWssIEZYX0JPT0wgYklzT2wsIGludDMyX3QgaUxpQ291bnQpDQotew0KLSAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpJdGVtQmxvY2tzKGNvbnN0IENGWF9SZWN0RiYgcnRUZXh0LCBpbnQzMl90IGlCbG9ja0luZGV4KSB7DQorICBpZiAoIW1fcExvYWRlcikgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlDb3VudEhlaWdodCA9IG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5HZXRTaXplKCk7DQorICBpZiAoaUNvdW50SGVpZ2h0ID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiRW5kSXRlbSA9IFRSVUU7DQorICBpbnQzMl90IGlCbG9ja0NvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOw0KKyAgRlhfRkxPQVQgZkxpbmVQb3MgPSBtX3BMb2FkZXItPm1fZlN0YXJ0TGluZU9mZnNldDsNCisgIGludDMyX3QgaUxpbmVJbmRleCA9IDA7DQorICBpZiAoaUJsb2NrSW5kZXggPiAwKSB7DQorICAgIGludDMyX3QgaUJsb2NrSGVpZ2h0Q291bnQgPSBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LkdldFNpemUoKTsNCisgICAgaUJsb2NrSGVpZ2h0Q291bnQgLz0gMjsNCisgICAgaWYgKGlCbG9ja0hlaWdodENvdW50ID49IGlCbG9ja0luZGV4KSB7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2NrSW5kZXg7IGkrKykgew0KKyAgICAgICAgZkxpbmVQb3MgLT0gbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5FbGVtZW50QXQoaSAqIDIgKyAxKTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgZkxpbmVQb3MgPSAwOw0KICAgICB9DQotICAgIENYRkFfVGV4dFBhcnNlQ29udGV4dCAqcENvbnRleHQgPSBtX3RleHRQYXJzZXIuR2V0UGFyc2VDb250ZXh0RnJvbU1hcChwWE1MTm9kZSk7DQotICAgIEZERV9DU1NESVNQTEFZIGVEaXNwbGF5ID0gRkRFX0NTU0RJU1BMQVlfTm9uZTsNCi0gICAgRlhfQk9PTCBiQ29udGVudE5vZGUJPSBGQUxTRTsNCi0gICAgRlhfRkxPQVQgZlNwYWNlQmVsb3cJPSAwOw0KLSAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSA9IE5VTEw7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCi0gICAgaWYgKGJFbmRCcmVhaykgew0KLSAgICAgICAgRlhfQk9PTCBiQ3VyT2wgPSBGQUxTRTsNCi0gICAgICAgIEZYX0JPT0wgYkN1ckxpID0gRkFMU0U7DQotICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKnBFbGVtZW50ID0gTlVMTDsNCi0gICAgICAgIGlmIChwQ29udGV4dCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgaWYobV9iQmxvY2tDb250aW51ZSB8fCAobV9wTG9hZGVyICYmIHBYTUxOb2RlID09IG1fcExvYWRlci0+bV9wWE1MTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgbV9iQmxvY2tDb250aW51ZSA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfVGV4dCkgew0KLSAgICAgICAgICAgICAgICBiQ29udGVudE5vZGUgPSBUUlVFOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgICAgIHBFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCAqKXBYTUxOb2RlOw0KLSAgICAgICAgICAgICAgICBwRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJvbCIpKSB7DQotICAgICAgICAgICAgICAgIGJJc09sID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgYkN1ck9sID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYobV9iQmxvY2tDb250aW51ZSB8fCBiQ29udGVudE5vZGUgPT0gRkFMU0UpIHsNCi0gICAgICAgICAgICAgICAgZURpc3BsYXkgPSBwQ29udGV4dC0+R2V0RGlzcGxheSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoZURpc3BsYXkgIT0gRkRFX0NTU0RJU1BMQVlfQmxvY2sgJiYgZURpc3BsYXkgIT0gRkRFX0NTU0RJU1BMQVlfSW5saW5lICYmIGVEaXNwbGF5ICE9IEZERV9DU1NESVNQTEFZX0xpc3RJdGVtKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwU3R5bGUgPSBtX3RleHRQYXJzZXIuQ29tcHV0ZVN0eWxlKHBYTUxOb2RlLCBwUGFyZW50U3R5bGUpOw0KLSAgICAgICAgICAgICAgICBJbml0QnJlYWsoYkNvbnRlbnROb2RlID8gcFBhcmVudFN0eWxlIDogcFN0eWxlLCBlRGlzcGxheSwgc3pUZXh0LngsIHBYTUxOb2RlLCBwUGFyZW50U3R5bGUpOw0KLSAgICAgICAgICAgICAgICBpZiAoKGVEaXNwbGF5ID09IEZERV9DU1NESVNQTEFZX0Jsb2NrIHx8IGVEaXNwbGF5ID09IEZERV9DU1NESVNQTEFZX0xpc3RJdGVtKSAmJiAocFN0eWxlICE9IE5VTEwpDQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdzTmFtZS5Jc0VtcHR5KCkgfHwgKHdzTmFtZSAhPSBGWF9XU1RSQyhMImJvZHkiKSAmJiB3c05hbWUgIT0gRlhfV1NUUkMoTCJodG1sIikgJiYgd3NOYW1lICE9IEZYX1dTVFJDKEwib2wiKSAmJiB3c05hbWUgIT0gRlhfV1NUUkMoTCJ1bCIpKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZERV9DU1NSRUNUICpwUmVjdCA9IHBTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKS0+R2V0TWFyZ2luV2lkdGgoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwUmVjdCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZMaW5lUG9zICs9IHBSZWN0LT50b3AuR2V0VmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmU3BhY2VCZWxvdyA9IHBSZWN0LT5ib3R0b20uR2V0VmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAod3NOYW1lID09IEZYX1dTVFJDKEwiYSIpKSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpbmtDb250ZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBFbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgICAgIHBFbGVtZW50LT5HZXRTdHJpbmcoRlhfV1NUUkMoTCJocmVmIikuR2V0UHRyKCksIHdzTGlua0NvbnRlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCF3c0xpbmtDb250ZW50LklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5rRGF0YSA9IEZERV9OZXdXaXRoKG1fcEFsbG9jYXRvcilDWEZBX0xpbmtVc2VyRGF0YShtX3BBbGxvY2F0b3IsIHdzTGlua0NvbnRlbnQuR2V0QnVmZmVyKHdzTGlua0NvbnRlbnQuR2V0TGVuZ3RoKCkpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c0xpbmtDb250ZW50LlJlbGVhc2VCdWZmZXIod3NMaW5rQ29udGVudC5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpVGFiQ291bnQgPSBtX3RleHRQYXJzZXIuQ291bnRUYWJzKGJDb250ZW50Tm9kZSA/IHBQYXJlbnRTdHlsZSA6IHBTdHlsZSk7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNwYWNlUnVuID0gbV90ZXh0UGFyc2VyLklzU3BhY2VSdW4oYkNvbnRlbnROb2RlID8gcFBhcmVudFN0eWxlIDogcFN0eWxlKTsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgICAgICAgICBpZiAoYkNvbnRlbnROb2RlICYmIGlUYWJDb3VudCA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MVGV4dCAqKXBYTUxOb2RlKS0+R2V0VGV4dCh3c1RleHQpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdzTmFtZSA9PSBGWF9XU1RSQyhMImJyIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzVGV4dCA9IEwnXG4nOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdzTmFtZSA9PSBGWF9XU1RSQyhMImxpIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJDdXJMaSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICBpZiAoYklzT2wpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1RleHQuRm9ybWF0KEwiJWQuICAiLCBpTGlDb3VudCk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzVGV4dCA9IDB4MDBCNyArIEZYX1dTVFJDKEwiICAiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYkNvbnRlbnROb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaVRhYkNvdW50ID4gMCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaVRhYkNvdW50LS0gPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVGV4dCArPSBMJ1x0JzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3RleHRQYXJzZXIuR2V0RW1iYmVkT2JqKG1fcFRleHRQcm92aWRlciwgcFhNTE5vZGUsIHdzVGV4dCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICBpZiAoaUxlbmd0aCA+IDAgJiYgYkNvbnRlbnROb2RlICYmICFiU3BhY2VSdW4pIHsNCi0gICAgICAgICAgICAgICAgICAgIFByb2Nlc3NUZXh0KHdzVGV4dCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKG1fcExvYWRlcikgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA+IDAgJiYgKG1fcExvYWRlci0+bV9kd0ZsYWdzICYgWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzVGV4dC5UcmltTGVmdCgweDIwKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChGREVfQ1NTRElTUExBWV9CbG9jayA9PSBlRGlzcGxheSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzIHw9IFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRkRFX0NTU0RJU1BMQVlfSW5saW5lID09IGVEaXNwbGF5ICYmIChtX3BMb2FkZXItPm1fZHdGbGFncyAmIFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyAmPSB+WEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3c1RleHQuR2V0TGVuZ3RoKCkgPiAwICYmICgweDIwID09IHdzVGV4dC5HZXRBdCh3c1RleHQuR2V0TGVuZ3RoKCkgLSAxKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyB8PSBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA9PSAwKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIDsNCi0gICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzICY9IH5YRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BMb2FkZXIgPT0gTlVMTCB8fCBtX3BMb2FkZXItPm1faUNoYXIgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwTGlua0RhdGEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmtEYXRhLT5BZGRSZWYoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UZXh0VXNlckRhdGEgKnBVc2VyRGF0YSA9IEZERV9OZXdXaXRoKG1fcEFsbG9jYXRvcilDWEZBX1RleHRVc2VyRGF0YShtX3BBbGxvY2F0b3IsIGJDb250ZW50Tm9kZSA/IHBQYXJlbnRTdHlsZSA6IHBTdHlsZSwgcExpbmtEYXRhKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BCcmVhay0+U2V0VXNlckRhdGEocFVzZXJEYXRhKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChBcHBlbmRDaGFyKHdzVGV4dCwgZkxpbmVQb3MsIDAsIGJTYXZlUGllY2VzKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbV9wTG9hZGVyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzICY9IH5YRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0VuZChiU2F2ZVBpZWNlcykpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcExvYWRlciAmJiBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPiAtMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTG9hZGVyLT5tX3BYTUxOb2RlID0gcFhNTE5vZGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fcFBhcmVudFN0eWxlID0gcFBhcmVudFN0eWxlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0eWxlLT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCisgICAgaUxpbmVJbmRleCA9IG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2tDb3VudCAtIDEpICsNCisgICAgICAgICAgICAgICAgIG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2tDb3VudCAtIDIpOw0KKyAgfQ0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IGlMaW5lSW5kZXg7IGkgPCBpQ291bnRIZWlnaHQ7IGkrKykgew0KKyAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5FbGVtZW50QXQoaSk7DQorICAgIGlmIChmTGluZVBvcyArIGZMaW5lSGVpZ2h0IC0gcnRUZXh0LmhlaWdodCA+IDAuMDAxKSB7DQorICAgICAgbV9CbG9ja3MuQWRkKGlMaW5lSW5kZXgpOw0KKyAgICAgIG1fQmxvY2tzLkFkZChpIC0gaUxpbmVJbmRleCk7DQorICAgICAgYkVuZEl0ZW0gPSBGQUxTRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBmTGluZVBvcyArPSBmTGluZUhlaWdodDsNCisgIH0NCisgIGlmIChpQ291bnRIZWlnaHQgPiAwICYmIChpIC0gaUxpbmVJbmRleCkgPiAwICYmIGJFbmRJdGVtKSB7DQorICAgIG1fQmxvY2tzLkFkZChpTGluZUluZGV4KTsNCisgICAgbV9CbG9ja3MuQWRkKGkgLSBpTGluZUluZGV4KTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX1RleHRMYXlvdXQ6OkRyYXdTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcEZ4RGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHRtRG9jMkRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCbG9jaykgew0KKyAgSUZERV9SZW5kZXJEZXZpY2UqIHBEZXZpY2UgPSBJRkRFX1JlbmRlckRldmljZTo6Q3JlYXRlKHBGeERldmljZSk7DQorICBpZiAocERldmljZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZERV9IREVWSUNFU1RBVEUgc3RhdGUgPSBwRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgIHBEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorICBJRkRFX1NvbGlkQnJ1c2gqIHBTb2xpZEJydXNoID0NCisgICAgICAoSUZERV9Tb2xpZEJydXNoKilJRkRFX0JydXNoOjpDcmVhdGUoRkRFX0JSVVNIVFlQRV9Tb2xpZCk7DQorICBJRkRFX1BlbiogcFBlbiA9IElGREVfUGVuOjpDcmVhdGUoKTsNCisgIEZYU1lTX2Fzc2VydChwRGV2aWNlICE9IE5VTEwgJiYgcFNvbGlkQnJ1c2ggIT0gTlVMTCAmJiBwUGVuICE9IE5VTEwpOw0KKyAgaWYgKG1fcGllY2VMaW5lcy5HZXRTaXplKCkgPT0gMCkgew0KKyAgICBpbnQzMl90IGlCbG9ja0NvdW50ID0gQ291bnRCbG9ja3MoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2NrQ291bnQ7IGkrKykgew0KKyAgICAgIExheW91dChpKTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gTlVMTDsNCisgIGludDMyX3QgaUNoYXJDb3VudCA9IDA7DQorICBpbnQzMl90IGlMaW5lU3RhcnQgPSAwOw0KKyAgaW50MzJfdCBpUGllY2VMaW5lcyA9IG1fcGllY2VMaW5lcy5HZXRTaXplKCk7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQmxvY2tzLkdldFNpemUoKTsNCisgIGlmIChpQ291bnQgPiAwKSB7DQorICAgIGlCbG9jayAqPSAyOw0KKyAgICBpZiAoaUJsb2NrIDwgaUNvdW50KSB7DQorICAgICAgaUxpbmVTdGFydCA9IG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2spOw0KKyAgICAgIGlQaWVjZUxpbmVzID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9jayArIDEpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlQaWVjZUxpbmVzID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVBpZWNlTGluZXM7IGkrKykgew0KKyAgICBpZiAoaSArIGlMaW5lU3RhcnQgPj0gbV9waWVjZUxpbmVzLkdldFNpemUoKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lID0gbV9waWVjZUxpbmVzLkdldEF0KGkgKyBpTGluZVN0YXJ0KTsNCisgICAgaW50MzJfdCBpUGllY2VzID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldFNpemUoKTsNCisgICAgaW50MzJfdCBqID0gMDsNCisgICAgZm9yIChqID0gMDsgaiA8IGlQaWVjZXM7IGorKykgew0KKyAgICAgIFhGQV9MUENURVhUUElFQ0UgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGopOw0KKyAgICAgIGludDMyX3QgaUNoYXJzID0gcFBpZWNlLT5pQ2hhcnM7DQorICAgICAgaWYgKGlDaGFyQ291bnQgPCBpQ2hhcnMpIHsNCisgICAgICAgIGlmIChwQ2hhclBvcyAhPSBOVUxMKSB7DQorICAgICAgICAgIEZERV9GcmVlKHBDaGFyUG9zKTsNCiAgICAgICAgIH0NCi0gICAgICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsNCi0gICAgICAgIGZvciAoSUZERV9YTUxOb2RlICpwQ2hpbGROb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7IHBDaGlsZE5vZGU7IHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgIGlmIChiQ3VyT2wpIHsNCi0gICAgICAgICAgICAgICAgaUxpQ291bnQrKzsNCisgICAgICAgIHBDaGFyUG9zID0gKEZYVEVYVF9DSEFSUE9TKilGREVfQWxsb2MoaUNoYXJzICogc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSk7DQorICAgICAgICBpQ2hhckNvdW50ID0gaUNoYXJzOw0KKyAgICAgIH0NCisgICAgICBGWFNZU19tZW1zZXQocENoYXJQb3MsIDAsIGlDaGFyQ291bnQgKiBzaXplb2YoRlhURVhUX0NIQVJQT1MpKTsNCisgICAgICBSZW5kZXJTdHJpbmcocERldmljZSwgcFNvbGlkQnJ1c2gsIHBQaWVjZUxpbmUsIGosIHBDaGFyUG9zLCB0bURvYzJEZXZpY2UpOw0KKyAgICB9DQorICAgIGZvciAoaiA9IDA7IGogPCBpUGllY2VzOyBqKyspIHsNCisgICAgICBSZW5kZXJQYXRoKHBEZXZpY2UsIHBQZW4sIHBQaWVjZUxpbmUsIGosIHBDaGFyUG9zLCB0bURvYzJEZXZpY2UpOw0KKyAgICB9DQorICB9DQorICBwRGV2aWNlLT5SZXN0b3JlU3RhdGUoc3RhdGUpOw0KKyAgaWYgKHBDaGFyUG9zICE9IE5VTEwpIHsNCisgICAgRkRFX0ZyZWUocENoYXJQb3MpOw0KKyAgfQ0KKyAgcFNvbGlkQnJ1c2gtPlJlbGVhc2UoKTsNCisgIHBQZW4tPlJlbGVhc2UoKTsNCisgIHBEZXZpY2UtPlJlbGVhc2UoKTsNCisgIHJldHVybiBpUGllY2VMaW5lczsNCit9DQordm9pZCBDWEZBX1RleHRMYXlvdXQ6OlVwZGF0ZUFsaWduKEZYX0ZMT0FUIGZIZWlnaHQsIEZYX0ZMT0FUIGZCb3R0b20pIHsNCisgIGZIZWlnaHQgLT0gZkJvdHRvbTsNCisgIGlmIChmSGVpZ2h0IDwgMC4xZikgew0KKyAgICByZXR1cm47DQorICB9DQorICBzd2l0Y2ggKG1fdGV4dFBhcnNlci5HZXRWQWxnaW4obV9wVGV4dFByb3ZpZGVyKSkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToNCisgICAgICBmSGVpZ2h0IC89IDIuMGY7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOg0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gbV9waWVjZUxpbmVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lID0gbV9waWVjZUxpbmVzLkdldEF0KGkpOw0KKyAgICBpbnQzMl90IGlQaWVjZXMgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUGllY2VzOyBqKyspIHsNCisgICAgICBYRkFfTFBURVhUUElFQ0UgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGopOw0KKyAgICAgIENGWF9SZWN0RiYgcmVjdCA9IHBQaWVjZS0+cnRQaWVjZTsNCisgICAgICByZWN0LnRvcCArPSBmSGVpZ2h0Ow0KKyAgICB9DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpMb2FkZXIoY29uc3QgQ0ZYX1NpemVGJiBzelRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkxpbmVQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlUGllY2VzKSB7DQorICBpZiAobV9wQWxsb2NhdG9yID09IE5VTEwpIHsNCisgICAgbV9wQWxsb2NhdG9yID0gRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9TdGF0aWMsIDI1NiwgMCk7DQorICB9DQorICBHZXRUZXh0RGF0YU5vZGUoKTsNCisgIGlmIChtX3BUZXh0RGF0YU5vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChtX2JSaWNoVGV4dCkgew0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxDb250YWluZXIgPSBHZXRYTUxDb250YWluZXJOb2RlKCk7DQorICAgIGlmIChwWE1MQ29udGFpbmVyKSB7DQorICAgICAgaWYgKCFtX3RleHRQYXJzZXIuSXNQYXJzZWQoKSkgew0KKyAgICAgICAgbV90ZXh0UGFyc2VyLkRvUGFyc2UocFhNTENvbnRhaW5lciwgbV9wVGV4dFByb3ZpZGVyKTsNCisgICAgICB9DQorICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwUm9vdFN0eWxlID0NCisgICAgICAgICAgbV90ZXh0UGFyc2VyLkNyZWF0ZVJvb3RTdHlsZShtX3BUZXh0UHJvdmlkZXIpOw0KKyAgICAgIExvYWRSaWNoVGV4dChwWE1MQ29udGFpbmVyLCBzelRleHQsIGZMaW5lUG9zLCBwUm9vdFN0eWxlLCBiU2F2ZVBpZWNlcyk7DQorICAgICAgcFJvb3RTdHlsZS0+UmVsZWFzZSgpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBMb2FkVGV4dChtX3BUZXh0RGF0YU5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsIGJTYXZlUGllY2VzKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6TG9hZFRleHQoQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiBzelRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTGluZVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVBpZWNlcykgew0KKyAgSW5pdEJyZWFrKHN6VGV4dC54KTsNCisgIENYRkFfUGFyYSBwYXJhID0gbV9wVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpOw0KKyAgRlhfRkxPQVQgZlNwYWNlQWJvdmUgPSAwOw0KKyAgaWYgKHBhcmEuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgZlNwYWNlQWJvdmUgPSBwYXJhLkdldFNwYWNlQWJvdmUoKTsNCisgICAgaWYgKGZTcGFjZUFib3ZlIDwgMC4xZikgew0KKyAgICAgIGZTcGFjZUFib3ZlID0gMDsNCisgICAgfQ0KKyAgICBpbnQzMl90IHZlckFsaWduID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7DQorICAgIHN3aXRjaCAodmVyQWxpZ24pIHsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDoNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogew0KKyAgICAgICAgZkxpbmVQb3MgKz0gZlNwYWNlQWJvdmU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dCA9IHBOb2RlLT5HZXRDb250ZW50KCk7DQorICB3c1RleHQuVHJpbVJpZ2h0KEwiICIpOw0KKyAgRlhfQk9PTCBiUmV0ID0gQXBwZW5kQ2hhcih3c1RleHQsIGZMaW5lUG9zLCBmU3BhY2VBYm92ZSwgYlNhdmVQaWVjZXMpOw0KKyAgaWYgKGJSZXQgJiYgbV9wTG9hZGVyICE9IE5VTEwpIHsNCisgICAgbV9wTG9hZGVyLT5tX3BOb2RlID0gcE5vZGU7DQorICB9IGVsc2Ugew0KKyAgICBFbmRCcmVhayhGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhaywgZkxpbmVQb3MsIGJTYXZlUGllY2VzKTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX1RleHRMYXlvdXQ6OkxvYWRSaWNoVGV4dChJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiBzelRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkxpbmVQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVQaWVjZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xpbmtVc2VyRGF0YSogcExpbmtEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5kQnJlYWssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc09sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGlDb3VudCkgew0KKyAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgbV90ZXh0UGFyc2VyLkdldFBhcnNlQ29udGV4dEZyb21NYXAocFhNTE5vZGUpOw0KKyAgRkRFX0NTU0RJU1BMQVkgZURpc3BsYXkgPSBGREVfQ1NTRElTUExBWV9Ob25lOw0KKyAgRlhfQk9PTCBiQ29udGVudE5vZGUgPSBGQUxTRTsNCisgIEZYX0ZMT0FUIGZTcGFjZUJlbG93ID0gMDsNCisgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlID0gTlVMTDsNCisgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgIGlmIChiRW5kQnJlYWspIHsNCisgICAgRlhfQk9PTCBiQ3VyT2wgPSBGQUxTRTsNCisgICAgRlhfQk9PTCBiQ3VyTGkgPSBGQUxTRTsNCisgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IE5VTEw7DQorICAgIGlmIChwQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgaWYgKG1fYkJsb2NrQ29udGludWUgfHwNCisgICAgICAgICAgKG1fcExvYWRlciAmJiBwWE1MTm9kZSA9PSBtX3BMb2FkZXItPm1fcFhNTE5vZGUpKSB7DQorICAgICAgICBtX2JCbG9ja0NvbnRpbnVlID0gVFJVRTsNCisgICAgICB9DQorICAgICAgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfVGV4dCkgew0KKyAgICAgICAgYkNvbnRlbnROb2RlID0gVFJVRTsNCisgICAgICB9IGVsc2UgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgcEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZTsNCisgICAgICAgIHBFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUod3NOYW1lKTsNCisgICAgICB9DQorICAgICAgaWYgKHdzTmFtZSA9PSBGWF9XU1RSQyhMIm9sIikpIHsNCisgICAgICAgIGJJc09sID0gVFJVRTsNCisgICAgICAgIGJDdXJPbCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX2JCbG9ja0NvbnRpbnVlIHx8IGJDb250ZW50Tm9kZSA9PSBGQUxTRSkgew0KKyAgICAgICAgZURpc3BsYXkgPSBwQ29udGV4dC0+R2V0RGlzcGxheSgpOw0KKyAgICAgICAgaWYgKGVEaXNwbGF5ICE9IEZERV9DU1NESVNQTEFZX0Jsb2NrICYmDQorICAgICAgICAgICAgZURpc3BsYXkgIT0gRkRFX0NTU0RJU1BMQVlfSW5saW5lICYmDQorICAgICAgICAgICAgZURpc3BsYXkgIT0gRkRFX0NTU0RJU1BMQVlfTGlzdEl0ZW0pIHsNCisgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBwU3R5bGUgPSBtX3RleHRQYXJzZXIuQ29tcHV0ZVN0eWxlKHBYTUxOb2RlLCBwUGFyZW50U3R5bGUpOw0KKyAgICAgICAgSW5pdEJyZWFrKGJDb250ZW50Tm9kZSA/IHBQYXJlbnRTdHlsZSA6IHBTdHlsZSwgZURpc3BsYXksIHN6VGV4dC54LA0KKyAgICAgICAgICAgICAgICAgIHBYTUxOb2RlLCBwUGFyZW50U3R5bGUpOw0KKyAgICAgICAgaWYgKChlRGlzcGxheSA9PSBGREVfQ1NTRElTUExBWV9CbG9jayB8fA0KKyAgICAgICAgICAgICBlRGlzcGxheSA9PSBGREVfQ1NTRElTUExBWV9MaXN0SXRlbSkgJiYNCisgICAgICAgICAgICAocFN0eWxlICE9IE5VTEwpICYmDQorICAgICAgICAgICAgKHdzTmFtZS5Jc0VtcHR5KCkgfHwNCisgICAgICAgICAgICAgKHdzTmFtZSAhPSBGWF9XU1RSQyhMImJvZHkiKSAmJiB3c05hbWUgIT0gRlhfV1NUUkMoTCJodG1sIikgJiYNCisgICAgICAgICAgICAgIHdzTmFtZSAhPSBGWF9XU1RSQyhMIm9sIikgJiYgd3NOYW1lICE9IEZYX1dTVFJDKEwidWwiKSkpKSB7DQorICAgICAgICAgIGNvbnN0IEZERV9DU1NSRUNUKiBwUmVjdCA9DQorICAgICAgICAgICAgICBwU3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCktPkdldE1hcmdpbldpZHRoKCk7DQorICAgICAgICAgIGlmIChwUmVjdCkgew0KKyAgICAgICAgICAgIGZMaW5lUG9zICs9IHBSZWN0LT50b3AuR2V0VmFsdWUoKTsNCisgICAgICAgICAgICBmU3BhY2VCZWxvdyA9IHBSZWN0LT5ib3R0b20uR2V0VmFsdWUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHdzTmFtZSA9PSBGWF9XU1RSQyhMImEiKSkgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xpbmtDb250ZW50Ow0KKyAgICAgICAgICBGWFNZU19hc3NlcnQocEVsZW1lbnQpOw0KKyAgICAgICAgICBwRWxlbWVudC0+R2V0U3RyaW5nKEZYX1dTVFJDKEwiaHJlZiIpLkdldFB0cigpLCB3c0xpbmtDb250ZW50KTsNCisgICAgICAgICAgaWYgKCF3c0xpbmtDb250ZW50LklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHBMaW5rRGF0YSA9IEZERV9OZXdXaXRoKG1fcEFsbG9jYXRvcikgQ1hGQV9MaW5rVXNlckRhdGEoDQorICAgICAgICAgICAgICAgIG1fcEFsbG9jYXRvciwNCisgICAgICAgICAgICAgICAgd3NMaW5rQ29udGVudC5HZXRCdWZmZXIod3NMaW5rQ29udGVudC5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgICAgIHdzTGlua0NvbnRlbnQuUmVsZWFzZUJ1ZmZlcih3c0xpbmtDb250ZW50LkdldExlbmd0aCgpKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaW50MzJfdCBpVGFiQ291bnQgPQ0KKyAgICAgICAgICAgIG1fdGV4dFBhcnNlci5Db3VudFRhYnMoYkNvbnRlbnROb2RlID8gcFBhcmVudFN0eWxlIDogcFN0eWxlKTsNCisgICAgICAgIEZYX0JPT0wgYlNwYWNlUnVuID0NCisgICAgICAgICAgICBtX3RleHRQYXJzZXIuSXNTcGFjZVJ1bihiQ29udGVudE5vZGUgPyBwUGFyZW50U3R5bGUgOiBwU3R5bGUpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgaWYgKGJDb250ZW50Tm9kZSAmJiBpVGFiQ291bnQgPT0gMCkgew0KKyAgICAgICAgICAoKElGREVfWE1MVGV4dCopcFhNTE5vZGUpLT5HZXRUZXh0KHdzVGV4dCk7DQorICAgICAgICB9IGVsc2UgaWYgKHdzTmFtZSA9PSBGWF9XU1RSQyhMImJyIikpIHsNCisgICAgICAgICAgd3NUZXh0ID0gTCdcbic7DQorICAgICAgICB9IGVsc2UgaWYgKHdzTmFtZSA9PSBGWF9XU1RSQyhMImxpIikpIHsNCisgICAgICAgICAgYkN1ckxpID0gVFJVRTsNCisgICAgICAgICAgaWYgKGJJc09sKSB7DQorICAgICAgICAgICAgd3NUZXh0LkZvcm1hdChMIiVkLiAgIiwgaUxpQ291bnQpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzVGV4dCA9IDB4MDBCNyArIEZYX1dTVFJDKEwiICAiKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmICghYkNvbnRlbnROb2RlKSB7DQorICAgICAgICAgIGlmIChpVGFiQ291bnQgPiAwKQ0KKyAgICAgICAgICAgIHdoaWxlIChpVGFiQ291bnQtLSA+IDApIHsNCisgICAgICAgICAgICAgIHdzVGV4dCArPSBMJ1x0JzsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0ID0gTG9hZFJpY2hUZXh0KHBDaGlsZE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsIHBDb250ZXh0ID8gcFN0eWxlIDogcFBhcmVudFN0eWxlLCBiU2F2ZVBpZWNlcywgcExpbmtEYXRhLCBUUlVFLCBiSXNPbCwgaUxpQ291bnQpOw0KLSAgICAgICAgICAgIGlmKHJldCA9PSBGQUxTRSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICBtX3RleHRQYXJzZXIuR2V0RW1iYmVkT2JqKG1fcFRleHRQcm92aWRlciwgcFhNTE5vZGUsIHdzVGV4dCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgICAgIGlmIChpTGVuZ3RoID4gMCAmJiBiQ29udGVudE5vZGUgJiYgIWJTcGFjZVJ1bikgew0KKyAgICAgICAgICBQcm9jZXNzVGV4dCh3c1RleHQpOw0KICAgICAgICAgfQ0KICAgICAgICAgaWYgKG1fcExvYWRlcikgew0KLSAgICAgICAgICAgIGlmIChGREVfQ1NTRElTUExBWV9CbG9jayA9PSBlRGlzcGxheSkgew0KLSAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyB8PSBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7DQorICAgICAgICAgIGlmICh3c1RleHQuR2V0TGVuZ3RoKCkgPiAwICYmDQorICAgICAgICAgICAgICAobV9wTG9hZGVyLT5tX2R3RmxhZ3MgJiBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0UpKSB7DQorICAgICAgICAgICAgd3NUZXh0LlRyaW1MZWZ0KDB4MjApOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChGREVfQ1NTRElTUExBWV9CbG9jayA9PSBlRGlzcGxheSkgew0KKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzIHw9IFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsNCisgICAgICAgICAgfSBlbHNlIGlmIChGREVfQ1NTRElTUExBWV9JbmxpbmUgPT0gZURpc3BsYXkgJiYNCisgICAgICAgICAgICAgICAgICAgICAobV9wTG9hZGVyLT5tX2R3RmxhZ3MgJiBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0UpKSB7DQorICAgICAgICAgICAgbV9wTG9hZGVyLT5tX2R3RmxhZ3MgJj0gflhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsNCisgICAgICAgICAgfSBlbHNlIGlmICh3c1RleHQuR2V0TGVuZ3RoKCkgPiAwICYmDQorICAgICAgICAgICAgICAgICAgICAgKDB4MjAgPT0gd3NUZXh0LkdldEF0KHdzVGV4dC5HZXRMZW5ndGgoKSAtIDEpKSkgew0KKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzIHw9IFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsNCisgICAgICAgICAgfSBlbHNlIGlmICh3c1RleHQuR2V0TGVuZ3RoKCkgPT0gMCkNCisgICAgICAgICAgICA7DQorICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzICY9IH5YRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICh3c1RleHQuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICAgIGlmIChtX3BMb2FkZXIgPT0gTlVMTCB8fCBtX3BMb2FkZXItPm1faUNoYXIgPT0gMCkgew0KKyAgICAgICAgICAgIGlmIChwTGlua0RhdGEpIHsNCisgICAgICAgICAgICAgIHBMaW5rRGF0YS0+QWRkUmVmKCk7DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJDdXJMaSkgew0KLSAgICAgICAgICAgIEVuZEJyZWFrKEZYX1JURkJSRUFLX0xpbmVCcmVhaywgZkxpbmVQb3MsIGJTYXZlUGllY2VzKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChwQ29udGV4dCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgZURpc3BsYXkgPSBwQ29udGV4dC0+R2V0RGlzcGxheSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmKG1fYkJsb2NrQ29udGludWUpIHsNCi0gICAgICAgIGlmIChwQ29udGV4dCAhPSBOVUxMICYmICFiQ29udGVudE5vZGUpIHsNCi0gICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cyA9IChlRGlzcGxheSA9PSBGREVfQ1NTRElTUExBWV9CbG9jaykgPyBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhayA6IEZYX1JURkJSRUFLX1BpZWNlQnJlYWs7DQotICAgICAgICAgICAgRW5kQnJlYWsoZHdTdGF0dXMsIGZMaW5lUG9zLCBiU2F2ZVBpZWNlcyk7DQotICAgICAgICAgICAgaWYgKGVEaXNwbGF5ID09IEZERV9DU1NESVNQTEFZX0Jsb2NrKSB7DQotICAgICAgICAgICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUJlbG93Ow0KLSAgICAgICAgICAgICAgICBpZiAobV9wVGFic3RvcENvbnRleHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcFRhYnN0b3BDb250ZXh0LT5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIHdzTmFtZSA9PSBGWF9XU1RSQyhMImEiKSkgew0KLSAgICAgICAgICAgICAgICBpZiAocExpbmtEYXRhICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UmVmQ291bnQgPSBwTGlua0RhdGEtPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIHBMaW5rRGF0YSA9IE5VTEw7DQotICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX1RleHRVc2VyRGF0YSogcFVzZXJEYXRhID0gRkRFX05ld1dpdGgobV9wQWxsb2NhdG9yKQ0KKyAgICAgICAgICAgICAgICBDWEZBX1RleHRVc2VyRGF0YShtX3BBbGxvY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDb250ZW50Tm9kZSA/IHBQYXJlbnRTdHlsZSA6IHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmtEYXRhKTsNCisgICAgICAgICAgICBtX3BCcmVhay0+U2V0VXNlckRhdGEocFVzZXJEYXRhKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoQXBwZW5kQ2hhcih3c1RleHQsIGZMaW5lUG9zLCAwLCBiU2F2ZVBpZWNlcykpIHsNCisgICAgICAgICAgICBpZiAobV9wTG9hZGVyKSB7DQorICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyAmPSB+WEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICBpZiAoSXNFbmQoYlNhdmVQaWVjZXMpKSB7DQotICAgICAgICAgICAgICAgIGlmIChwU3R5bGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBTdHlsZS0+UmVsZWFzZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChtX3BMb2FkZXIgJiYgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID4gLTEpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9wWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsNCi0gICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9wUGFyZW50U3R5bGUgPSBwUGFyZW50U3R5bGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgICAgaWYgKG1fcExvYWRlciAmJiBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPiAtMSkgew0KKyAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fcFhNTE5vZGUgPSBwWE1MTm9kZTsNCisgICAgICAgICAgICAgICAgbV9wTG9hZGVyLT5tX3BQYXJlbnRTdHlsZSA9IHBQYXJlbnRTdHlsZTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwU3R5bGUtPlJlbGVhc2UoKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQotICAgICAgICBwU3R5bGUtPlJlbGVhc2UoKTsNCisgICAgRlhfQk9PTCByZXQgPSBUUlVFOw0KKyAgICBmb3IgKElGREVfWE1MTm9kZSogcENoaWxkTm9kZSA9DQorICAgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICAgIHBDaGlsZE5vZGU7DQorICAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgICAgaWYgKGJDdXJPbCkgew0KKyAgICAgICAgaUxpQ291bnQrKzsNCisgICAgICB9DQorICAgICAgcmV0ID0gTG9hZFJpY2hUZXh0KHBDaGlsZE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0ID8gcFN0eWxlIDogcFBhcmVudFN0eWxlLCBiU2F2ZVBpZWNlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmtEYXRhLCBUUlVFLCBiSXNPbCwgaUxpQ291bnQpOw0KKyAgICAgIGlmIChyZXQgPT0gRkFMU0UpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpBcHBlbmRDaGFyKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1RleHQsIEZYX0ZMT0FUICZmTGluZVBvcywgRlhfRkxPQVQgZlNwYWNlQWJvdmUsIEZYX0JPT0wgYlNhdmVQaWVjZXMpDQotew0KLSAgICBGWF9EV09SRCBkd1N0YXR1cyA9IDA7DQotICAgIGludDMyX3QgaUNoYXIgPSAwOw0KICAgICBpZiAobV9wTG9hZGVyKSB7DQotICAgICAgICBpQ2hhciA9IG1fcExvYWRlci0+bV9pQ2hhcjsNCisgICAgICBpZiAoRkRFX0NTU0RJU1BMQVlfQmxvY2sgPT0gZURpc3BsYXkpIHsNCisgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzIHw9IFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IGlDaGFyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQotICAgICAgICBGWF9XQ0hBUiB3Y2ggPSB3c1RleHQuR2V0QXQoaSk7DQotICAgICAgICBpZiAod2NoID09IDB4QTApIHsNCi0gICAgICAgICAgICB3Y2ggPSAweDIwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKChkd1N0YXR1cyA9IG1fcEJyZWFrLT5BcHBlbmRDaGFyKHdjaCkpID4gRlhfUlRGQlJFQUtfUGllY2VCcmVhaykgew0KLSAgICAgICAgICAgIEFwcGVuZFRleHRMaW5lKGR3U3RhdHVzLCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOw0KLSAgICAgICAgICAgIGlmIChJc0VuZChiU2F2ZVBpZWNlcykpIHsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcExvYWRlciAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1faUNoYXIgPSBpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZHdTdGF0dXMgPT0gRlhfUlRGQlJFQUtfUGFyYWdyYXBoQnJlYWsgJiYgbV9iUmljaFRleHQpIHsNCi0gICAgICAgICAgICAgICAgZkxpbmVQb3MgKz0gZlNwYWNlQWJvdmU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgICBpZiAoYkN1ckxpKSB7DQorICAgICAgRW5kQnJlYWsoRlhfUlRGQlJFQUtfTGluZUJyZWFrLCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOw0KICAgICB9DQotICAgIGlmKG1fcExvYWRlcikgew0KLSAgICAgICAgbV9wTG9hZGVyLT5tX2lDaGFyID0gMDsNCisgIH0gZWxzZSB7DQorICAgIGlmIChwQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgZURpc3BsYXkgPSBwQ29udGV4dC0+R2V0RGlzcGxheSgpOw0KICAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDWEZBX1RleHRMYXlvdXQ6OklzRW5kKEZYX0JPT0wgYlNhdmVQaWVjZXMpDQotew0KLSAgICBpZiAoIWJTYXZlUGllY2VzKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKG1fcExvYWRlciAmJiBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPiAwKSB7DQotICAgICAgICByZXR1cm4gbV9pTGluZXMgPj0gbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotdm9pZCBDWEZBX1RleHRMYXlvdXQ6OlByb2Nlc3NUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICBpbnQzMl90IGlMZW4gPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuID09IDApIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9XQ0hBUiogcHN6ID0gd3NUZXh0LkdldEJ1ZmZlcihpTGVuKTsNCi0gICAgaW50MzJfdCBpVHJpbUxlZnQgPSAwOw0KLSAgICBGWF9XQ0hBUiB3Y2ggPSAwLCB3UHJldiA9IDA7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW47IGkrKykgew0KLSAgICAgICAgd2NoID0gcHN6W2ldOw0KLSAgICAgICAgaWYgKHdjaCA8IDB4MjApIHsNCi0gICAgICAgICAgICB3Y2ggPSAweDIwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdjaCA9PSAweDIwICYmIHdQcmV2ID09IDB4MjApIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHdQcmV2ID0gd2NoOw0KLSAgICAgICAgcHN6W2lUcmltTGVmdCsrXSA9IHdjaDsNCi0gICAgfQ0KLSAgICB3c1RleHQuUmVsZWFzZUJ1ZmZlcihpTGVuKTsNCi0gICAgd3NUZXh0ID0gd3NUZXh0LkxlZnQoaVRyaW1MZWZ0KTsNCi19DQotdm9pZCBDWEZBX1RleHRMYXlvdXQ6OkVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9GTE9BVCAmZkxpbmVQb3MsIEZYX0JPT0wgYlNhdmVQaWVjZXMpDQotew0KLSAgICBkd1N0YXR1cyA9IG1fcEJyZWFrLT5FbmRCcmVhayhkd1N0YXR1cyk7DQotICAgIGlmIChkd1N0YXR1cyA+IEZYX1JURkJSRUFLX1BpZWNlQnJlYWspIHsNCi0gICAgICAgIEFwcGVuZFRleHRMaW5lKGR3U3RhdHVzLCBmTGluZVBvcywgYlNhdmVQaWVjZXMsIFRSVUUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpEb1RhYnN0b3BzKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlLCBDWEZBX1BpZWNlTGluZSAqcFBpZWNlTGluZSkNCi17DQotICAgIGlmIChtX3BUYWJzdG9wQ29udGV4dCA9PSBOVUxMIHx8IG1fcFRhYnN0b3BDb250ZXh0LT5tX2lUYWJDb3VudCA9PSAwKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKHBTdHlsZSA9PSBOVUxMIHx8IHBQaWVjZUxpbmUgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaVBpZWNlcyA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRTaXplKCk7DQotICAgIGlmIChpUGllY2VzID09IDApIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBYRkFfTFBURVhUUElFQ0UgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGlQaWVjZXMgLSAxKTsNCi0gICAgaW50MzJfdCAmaVRhYnN0b3BzSW5kZXggPSBtX3BUYWJzdG9wQ29udGV4dC0+bV9pVGFiSW5kZXg7DQotICAgIGludDMyX3QgaUNvdW50ID0gbV90ZXh0UGFyc2VyLkNvdW50VGFicyhwU3R5bGUpOw0KLSAgICBpZiAoaVRhYnN0b3BzSW5kZXggPiBtX3BUYWJzdG9wQ29udGV4dC0+bV9pVGFiQ291bnQgLSAxKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKGlDb3VudCA+IDApIHsNCi0gICAgICAgIGlUYWJzdG9wc0luZGV4Kys7DQotICAgICAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV9iVGFic3RvcHMgPSBUUlVFOw0KLSAgICAgICAgRlhfRkxPQVQgZlJpZ2h0ID0gMDsNCi0gICAgICAgIGlmIChpUGllY2VzID4gMSkgew0KLSAgICAgICAgICAgIFhGQV9MUFRFWFRQSUVDRSBwID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGlQaWVjZXMgLSAyKTsNCi0gICAgICAgICAgICBmUmlnaHQgPSBwLT5ydFBpZWNlLnJpZ2h0KCk7DQotICAgICAgICB9DQotICAgICAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV9mVGFiV2lkdGggPSBwUGllY2UtPnJ0UGllY2Uud2lkdGggKyBwUGllY2UtPnJ0UGllY2UubGVmdCAtIGZSaWdodDsNCi0gICAgfSBlbHNlIGlmIChpVGFic3RvcHNJbmRleCA+IC0xKSB7DQotICAgICAgICBGWF9GTE9BVCBmTGVmdCA9IDA7DQotICAgICAgICBpZiAobV9wVGFic3RvcENvbnRleHQtPm1fYlRhYnN0b3BzKSB7DQotICAgICAgICAgICAgWEZBX1RBQlNUT1BTICpwVGFic3RvcHMgPSBtX3BUYWJzdG9wQ29udGV4dC0+bV90YWJzdG9wcy5HZXREYXRhUHRyKGlUYWJzdG9wc0luZGV4KTsNCi0gICAgICAgICAgICBGWF9EV09SRCBkd0FsZ2luID0gcFRhYnN0b3BzLT5kd0FsaWduOw0KLSAgICAgICAgICAgIGlmIChkd0FsZ2luID09IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEwiY2VudGVyIiwgNikpIHsNCi0gICAgICAgICAgICAgICAgZkxlZnQgPSBwUGllY2UtPnJ0UGllY2Uud2lkdGggLyAyLjBmOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdBbGdpbiA9PSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhMInJpZ2h0IiwgNSkNCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IGR3QWxnaW4gPT0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoTCJiZWZvcmUiLCA2KSkgew0KLSAgICAgICAgICAgICAgICBmTGVmdCA9IHBQaWVjZS0+cnRQaWVjZS53aWR0aDsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGR3QWxnaW4gPT0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoTCJkZWNpbWFsIiwgNykpIHsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpQ2hhcnMgPSBwUGllY2UtPmlDaGFyczsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNoYXJzOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwUGllY2UtPnBzelRleHRbaV0gPT0gTCcuJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZkxlZnQgKz0gcFBpZWNlLT5wV2lkdGhzW2ldIC8gMjAwMDAuMGY7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fZkxlZnQgPSBGWF9NSU4oZkxlZnQsIG1fcFRhYnN0b3BDb250ZXh0LT5tX2ZUYWJXaWR0aCk7DQotICAgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fYlRhYnN0b3BzID0gRkFMU0U7DQotICAgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fZlRhYldpZHRoID0gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIHBQaWVjZS0+cnRQaWVjZS5sZWZ0IC09IG1fcFRhYnN0b3BDb250ZXh0LT5tX2ZMZWZ0Ow0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpBcHBlbmRUZXh0TGluZShGWF9EV09SRCBkd1N0YXR1cywgRlhfRkxPQVQgJmZMaW5lUG9zLCBGWF9CT09MIGJTYXZlUGllY2VzLCBGWF9CT09MIGJFbmRCcmVhaykNCi17DQotICAgIGludDMyX3QgaVBpZWNlcyA9IG1fcEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7DQotICAgIGlmIChpUGllY2VzIDwgMSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlID0gTlVMTDsNCi0gICAgaWYgKGJTYXZlUGllY2VzKSB7DQotICAgICAgICBDWEZBX1BpZWNlTGluZSAqcFBpZWNlTGluZSA9IEZERV9OZXdXaXRoKG1fcEFsbG9jYXRvcilDWEZBX1BpZWNlTGluZTsNCi0gICAgICAgIG1fcGllY2VMaW5lcy5BZGQocFBpZWNlTGluZSk7DQorICB9DQorICBpZiAobV9iQmxvY2tDb250aW51ZSkgew0KKyAgICBpZiAocENvbnRleHQgIT0gTlVMTCAmJiAhYkNvbnRlbnROb2RlKSB7DQorICAgICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAoZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfQmxvY2spDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhaw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhfUlRGQlJFQUtfUGllY2VCcmVhazsNCisgICAgICBFbmRCcmVhayhkd1N0YXR1cywgZkxpbmVQb3MsIGJTYXZlUGllY2VzKTsNCisgICAgICBpZiAoZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfQmxvY2spIHsNCisgICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUJlbG93Ow0KICAgICAgICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0KSB7DQotICAgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPlJlc2V0KCk7DQorICAgICAgICAgIG1fcFRhYnN0b3BDb250ZXh0LT5SZW1vdmVBbGwoKTsNCiAgICAgICAgIH0NCi0gICAgICAgIEZYX0ZMT0FUIGZMaW5lU3RlcCA9IDAsIGZCYXNlTGluZSA9IDA7DQotICAgICAgICBpbnQzMl90IGkgPSAwOw0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGlQaWVjZXM7IGkrKykgew0KLSAgICAgICAgICAgIGNvbnN0IENGWF9SVEZQaWVjZSAqcFBpZWNlID0gbV9wQnJlYWstPkdldEJyZWFrUGllY2UoaSk7DQotICAgICAgICAgICAgQ1hGQV9UZXh0VXNlckRhdGEgKnBVc2VyRGF0YSA9IChDWEZBX1RleHRVc2VyRGF0YSopcFBpZWNlLT5tX3BVc2VyRGF0YTsNCi0gICAgICAgICAgICBpZiAocFVzZXJEYXRhICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcFN0eWxlID0gcFVzZXJEYXRhLT5tX3BTdHlsZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhfRkxPQVQgZlZlclNjYWxlID0gcFBpZWNlLT5tX2lWZXJ0aWNhbFNjYWxlIC8gMTAwLjBmOw0KLSAgICAgICAgICAgIFhGQV9MUFRFWFRQSUVDRSBwVFAgPSAoWEZBX0xQVEVYVFBJRUNFKW1fcEFsbG9jYXRvci0+QWxsb2Moc2l6ZW9mKFhGQV9URVhUUElFQ0UpKTsNCi0gICAgICAgICAgICBwVFAtPnBzelRleHQgPSAoRlhfV0NIQVIqKW1fcEFsbG9jYXRvci0+QWxsb2MocFBpZWNlLT5tX2lDaGFycyAqIHNpemVvZihGWF9XQ0hBUikpOw0KLSAgICAgICAgICAgIHBUUC0+cFdpZHRocyA9IChpbnQzMl90KiltX3BBbGxvY2F0b3ItPkFsbG9jKHBQaWVjZS0+bV9pQ2hhcnMgKiBzaXplb2YoaW50MzJfdCkpOw0KLSAgICAgICAgICAgIHBUUC0+aUNoYXJzID0gcFBpZWNlLT5tX2lDaGFyczsNCi0gICAgICAgICAgICBwUGllY2UtPkdldFN0cmluZyhwVFAtPnBzelRleHQpOw0KLSAgICAgICAgICAgIHBQaWVjZS0+R2V0V2lkdGhzKHBUUC0+cFdpZHRocyk7DQotICAgICAgICAgICAgcFRQLT5pQmlkaUxldmVsID0gcFBpZWNlLT5tX2lCaWRpTGV2ZWw7DQotICAgICAgICAgICAgcFRQLT5pSG9yU2NhbGUJPSBwUGllY2UtPm1faUhvcml6b250YWxTY2FsZTsNCi0gICAgICAgICAgICBwVFAtPmlWZXJTY2FsZQk9IHBQaWVjZS0+bV9pVmVydGljYWxTY2FsZTsNCi0gICAgICAgICAgICBtX3RleHRQYXJzZXIuR2V0VW5kZXJsaW5lKG1fcFRleHRQcm92aWRlciwgcFN0eWxlLCBwVFAtPmlVbmRlcmxpbmUsIHBUUC0+aVBlcmlvZCk7DQotICAgICAgICAgICAgbV90ZXh0UGFyc2VyLkdldExpbmV0aHJvdWdoKG1fcFRleHRQcm92aWRlciwgcFN0eWxlLCBwVFAtPmlMaW5lVGhyb3VnaCk7DQotICAgICAgICAgICAgcFRQLT5kd0NvbG9yCT0gbV90ZXh0UGFyc2VyLkdldENvbG9yKG1fcFRleHRQcm92aWRlciwgcFN0eWxlKTsNCi0gICAgICAgICAgICBwVFAtPnBGb250CQk9IG1fdGV4dFBhcnNlci5HZXRGb250KG1fcFRleHRQcm92aWRlciwgcFN0eWxlKTsNCi0gICAgICAgICAgICBwVFAtPmZGb250U2l6ZQk9IG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSk7DQotICAgICAgICAgICAgcFRQLT5ydFBpZWNlLmxlZnQgPSBwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGY7DQotICAgICAgICAgICAgcFRQLT5ydFBpZWNlLndpZHRoID0gcFBpZWNlLT5tX2lXaWR0aCAvIDIwMDAwLjBmOw0KLSAgICAgICAgICAgIHBUUC0+cnRQaWVjZS5oZWlnaHQgPSAoRlhfRkxPQVQpcFBpZWNlLT5tX2lGb250U2l6ZSAqIGZWZXJTY2FsZSAvIDIwLjBmOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZCYXNlTGluZVRlbXAgPSBtX3RleHRQYXJzZXIuR2V0QmFzZWxpbmUobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpOw0KLSAgICAgICAgICAgIHBUUC0+cnRQaWVjZS50b3AgPSBmQmFzZUxpbmVUZW1wOw0KLSAgICAgICAgICAgIHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5BZGQocFRQKTsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IG1fdGV4dFBhcnNlci5HZXRMaW5lSGVpZ2h0KG1fcFRleHRQcm92aWRlciwgcFN0eWxlLCBtX2lMaW5lcyA9PSAwLCBmVmVyU2NhbGUpOw0KLSAgICAgICAgICAgIGlmIChmQmFzZUxpbmVUZW1wID4gMCkgew0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGluZUhlaWdodFRtcCA9IGZCYXNlTGluZVRlbXAgKyBwVFAtPnJ0UGllY2UuaGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICBpZiAoZkxpbmVIZWlnaHQgPCBmTGluZUhlaWdodFRtcCkgew0KLSAgICAgICAgICAgICAgICAgICAgZkxpbmVIZWlnaHQgPSBmTGluZUhlaWdodFRtcDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGZCYXNlTGluZVRlbXAgPSAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChmQmFzZUxpbmUgPCAtZkJhc2VMaW5lVGVtcCkgew0KLSAgICAgICAgICAgICAgICBmQmFzZUxpbmUgPSAtZkJhc2VMaW5lVGVtcDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZkxpbmVTdGVwID0gRlhfTUFYKGZMaW5lU3RlcCwgZkxpbmVIZWlnaHQpOw0KLSAgICAgICAgICAgIGlmICggcFVzZXJEYXRhICE9IE5VTEwgJiYgcFVzZXJEYXRhLT5tX3BMaW5rRGF0YSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIHBVc2VyRGF0YS0+bV9wTGlua0RhdGEtPkFkZFJlZigpOw0KLSAgICAgICAgICAgICAgICBwVFAtPnBMaW5rRGF0YSA9IHBVc2VyRGF0YS0+bV9wTGlua0RhdGE7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcFRQLT5wTGlua0RhdGEgPSBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBEb1RhYnN0b3BzKHBTdHlsZSwgcFBpZWNlTGluZSk7DQorICAgICAgfQ0KKyAgICAgIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJhIikpIHsNCisgICAgICAgIGlmIChwTGlua0RhdGEgIT0gTlVMTCkgew0KKyAgICAgICAgICBGWF9EV09SRCBkd1JlZkNvdW50ID0gcExpbmtEYXRhLT5SZWxlYXNlKCk7DQorICAgICAgICAgIHBMaW5rRGF0YSA9IE5VTEw7DQogICAgICAgICB9DQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaVBpZWNlczsgaSsrKSB7DQotICAgICAgICAgICAgWEZBX0xQVEVYVFBJRUNFIHBUUCA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRBdChpKTsNCi0gICAgICAgICAgICBGWF9GTE9BVCAmZlRvcCA9IHBUUC0+cnRQaWVjZS50b3A7DQotICAgICAgICAgICAgRlhfRkxPQVQgZkJhc2VMaW5lVGVtcCA9IGZUb3A7DQotICAgICAgICAgICAgZlRvcCA9IGZMaW5lUG9zICsgZkxpbmVTdGVwIC0gcFRQLT5ydFBpZWNlLmhlaWdodCAtIGZCYXNlTGluZVRlbXA7DQotICAgICAgICAgICAgZlRvcCA9IEZYX01BWCgwLCBmVG9wKTsNCisgICAgICB9DQorICAgICAgaWYgKElzRW5kKGJTYXZlUGllY2VzKSkgew0KKyAgICAgICAgaWYgKHBTdHlsZSkgew0KKyAgICAgICAgICBwU3R5bGUtPlJlbGVhc2UoKTsNCiAgICAgICAgIH0NCi0gICAgICAgIGZMaW5lUG9zICs9IGZMaW5lU3RlcCArIGZCYXNlTGluZTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZMaW5lU3RlcCA9IDA7DQotICAgICAgICBGWF9GTE9BVCBmTGluZVdpZHRoID0gMDsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlQaWVjZXM7IGkrKykgew0KLSAgICAgICAgICAgIGNvbnN0IENGWF9SVEZQaWVjZSAqcFBpZWNlID0gbV9wQnJlYWstPkdldEJyZWFrUGllY2UoaSk7DQotICAgICAgICAgICAgQ1hGQV9UZXh0VXNlckRhdGEgKnBVc2VyRGF0YSA9IChDWEZBX1RleHRVc2VyRGF0YSopcFBpZWNlLT5tX3BVc2VyRGF0YTsNCi0gICAgICAgICAgICBpZiAocFVzZXJEYXRhICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgcFN0eWxlID0gcFVzZXJEYXRhLT5tX3BTdHlsZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhfRkxPQVQgZlZlclNjYWxlID0gcFBpZWNlLT5tX2lWZXJ0aWNhbFNjYWxlIC8gMTAwLjBmOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZCYXNlTGluZSA9IG1fdGV4dFBhcnNlci5HZXRCYXNlbGluZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSk7DQotICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSBtX3RleHRQYXJzZXIuR2V0TGluZUhlaWdodChtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSwgbV9pTGluZXMgPT0gMCwgZlZlclNjYWxlKTsNCi0gICAgICAgICAgICBpZiAoZkJhc2VMaW5lID4gMCkgew0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGluZUhlaWdodFRtcCA9IGZCYXNlTGluZSArIChGWF9GTE9BVClwUGllY2UtPm1faUZvbnRTaXplICogZlZlclNjYWxlIC8gMjAuMGY7DQotICAgICAgICAgICAgICAgIGlmIChmTGluZUhlaWdodCA8IGZMaW5lSGVpZ2h0VG1wKSB7DQotICAgICAgICAgICAgICAgICAgICBmTGluZUhlaWdodCA9IGZMaW5lSGVpZ2h0VG1wOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZMaW5lU3RlcCA9IEZYX01BWChmTGluZVN0ZXAsIGZMaW5lSGVpZ2h0KTsNCi0gICAgICAgICAgICBmTGluZVdpZHRoICs9IHBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZjsNCisgICAgICAgIGlmIChtX3BMb2FkZXIgJiYgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID4gLTEpIHsNCisgICAgICAgICAgbV9wTG9hZGVyLT5tX3BYTUxOb2RlID0NCisgICAgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsNCisgICAgICAgICAgbV9wTG9hZGVyLT5tX3BQYXJlbnRTdHlsZSA9IHBQYXJlbnRTdHlsZTsNCiAgICAgICAgIH0NCi0gICAgICAgIGZMaW5lUG9zICs9IGZMaW5lU3RlcDsNCi0gICAgICAgIG1fZk1heFdpZHRoID0gRlhfTUFYKG1fZk1heFdpZHRoLCBmTGluZVdpZHRoKTsNCi0gICAgICAgIGlmIChtX3BMb2FkZXIgJiYgbV9wTG9hZGVyLT5tX2JTYXZlTGluZUhlaWdodCkgew0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBmTGluZVBvcyAtIG1fcExvYWRlci0+bV9mTGFzdFBvczsNCi0gICAgICAgICAgICBtX3BMb2FkZXItPm1fZkxhc3RQb3MgPSBmTGluZVBvczsNCi0gICAgICAgICAgICBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuQWRkKGZIZWlnaHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fcEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQotICAgIGlmIChkd1N0YXR1cyA9PSBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhaykgew0KLSAgICAgICAgbV9wQnJlYWstPlJlc2V0KCk7DQotICAgICAgICBpZiAocFN0eWxlID09IE5VTEwgJiYgYkVuZEJyZWFrKSB7DQotICAgICAgICAgICAgQ1hGQV9QYXJhIHBhcmEgPSBtX3BUZXh0UHJvdmlkZXItPkdldFBhcmFOb2RlKCk7DQotICAgICAgICAgICAgaWYgKHBhcmEuSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZlN0YXJ0UG9zID0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZJbmRlbnQgPSBwYXJhLkdldFRleHRJbmRlbnQoKTsNCi0gICAgICAgICAgICAgICAgaWYgKGZJbmRlbnQgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBmU3RhcnRQb3MgKz0gZkluZGVudDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU3BhY2VCZWxvdyA9IHBhcmEuR2V0U3BhY2VCZWxvdygpOw0KLSAgICAgICAgICAgICAgICBpZiAoZlNwYWNlQmVsb3cgPCAwLjFmKSB7DQotICAgICAgICAgICAgICAgICAgICBmU3BhY2VCZWxvdyA9IDA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9wQnJlYWstPlNldExpbmVQb3MoZlN0YXJ0UG9zKTsNCi0gICAgICAgICAgICAgICAgZkxpbmVQb3MgKz0gZlNwYWNlQmVsb3c7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KLSAgICAgICAgRlhfRkxPQVQgZlN0YXJ0ID0gMDsNCi0gICAgICAgIGNvbnN0IEZERV9DU1NSRUNUICpwUmVjdCA9IHBTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKS0+R2V0TWFyZ2luV2lkdGgoKTsNCi0gICAgICAgIGlmIChwUmVjdCkgew0KLSAgICAgICAgICAgIGZTdGFydCA9IHBSZWN0LT5sZWZ0LkdldFZhbHVlKCk7DQotICAgICAgICB9DQotICAgICAgICBGWF9GTE9BVCBmVGV4dEluZGVudCA9IHBTdHlsZS0+R2V0UGFyYWdyYXBoU3R5bGVzKCktPkdldFRleHRJbmRlbnQoKS5HZXRWYWx1ZSgpOw0KLSAgICAgICAgaWYgKGZUZXh0SW5kZW50IDwgMCkgew0KLSAgICAgICAgICAgIGZTdGFydCAtPSBmVGV4dEluZGVudDsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcEJyZWFrLT5TZXRMaW5lUG9zKGZTdGFydCk7DQotICAgIH0NCi0gICAgbV9pTGluZXMrKzsNCi19DQotdm9pZCBDWEZBX1RleHRMYXlvdXQ6OlJlbmRlclN0cmluZyhJRkRFX1JlbmRlckRldmljZSAqcERldmljZSwgSUZERV9Tb2xpZEJydXNoICpwQnJ1c2gsIENYRkFfUGllY2VMaW5lICpwUGllY2VMaW5lLCBpbnQzMl90IGlQaWVjZSwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBjb25zdCBDRlhfTWF0cml4ICZ0bURvYzJEZXZpY2UpDQotew0KLSAgICBYRkFfTFBDVEVYVFBJRUNFIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRBdChpUGllY2UpOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IEdldERpc3BsYXlQb3MocFBpZWNlLCBwQ2hhclBvcyk7DQotICAgIGlmIChpQ291bnQgPiAwKSB7DQotICAgICAgICBwQnJ1c2gtPlNldENvbG9yKHBQaWVjZS0+ZHdDb2xvcik7DQotICAgICAgICBwRGV2aWNlLT5EcmF3U3RyaW5nKHBCcnVzaCwgcFBpZWNlLT5wRm9udCwgcENoYXJQb3MsIGlDb3VudCwgcFBpZWNlLT5mRm9udFNpemUsICZ0bURvYzJEZXZpY2UpOw0KLSAgICB9DQotICAgIHBQaWVjZUxpbmUtPm1fY2hhckNvdW50cy5BZGQoaUNvdW50KTsNCi19DQotdm9pZCBDWEZBX1RleHRMYXlvdXQ6OlJlbmRlclBhdGgoSUZERV9SZW5kZXJEZXZpY2UgKnBEZXZpY2UsIElGREVfUGVuICpwUGVuLCBDWEZBX1BpZWNlTGluZSAqcFBpZWNlTGluZSwgaW50MzJfdCBpUGllY2UsIEZYVEVYVF9DSEFSUE9TICpwQ2hhclBvcywgY29uc3QgQ0ZYX01hdHJpeCAmdG1Eb2MyRGV2aWNlKQ0KLXsNCi0gICAgWEZBX1RFWFRQSUVDRSAqcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGlQaWVjZSk7DQotICAgIEZYX0JPT0wgYk5vVW5kZXJsaW5lID0gcFBpZWNlLT5pVW5kZXJsaW5lIDwgMSB8fCBwUGllY2UtPmlVbmRlcmxpbmUgPiAyOw0KLSAgICBGWF9CT09MIGJOb0xpbmVUaHJvdWdoID0gcFBpZWNlLT5pTGluZVRocm91Z2ggPCAxIHx8IHBQaWVjZS0+aUxpbmVUaHJvdWdoID4gMjsNCi0gICAgaWYgKGJOb1VuZGVybGluZSAmJiBiTm9MaW5lVGhyb3VnaCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIHBQZW4tPlNldENvbG9yKHBQaWVjZS0+ZHdDb2xvcik7DQotICAgIElGREVfUGF0aCAqcFBhdGggPSBJRkRFX1BhdGg6OkNyZWF0ZSgpOw0KLSAgICBpbnQzMl90IGlDaGFycyA9IEdldERpc3BsYXlQb3MocFBpZWNlLCBwQ2hhclBvcyk7DQotICAgIGlmIChpQ2hhcnMgPiAwKSB7DQotICAgICAgICBDRlhfUG9pbnRGIHB0MSwgcHQyOw0KLSAgICAgICAgRlhfRkxPQVQgZkVuZFkgPSBwQ2hhclBvc1swXS5tX09yaWdpblkgKyAxLjA1ZjsNCi0gICAgICAgIGludDMyX3QgaSA9IDA7DQotICAgICAgICBpZiAocFBpZWNlLT5pUGVyaW9kID09IFhGQV9BVFRSSUJVVEVFTlVNX1dvcmQpIHsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwUGllY2UtPmlVbmRlcmxpbmU7IGkrKykgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpQ2hhcnM7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgcHQxLnggPSBwQ2hhclBvc1tqXS5tX09yaWdpblg7DQotICAgICAgICAgICAgICAgICAgICBwdDIueCA9IHB0MS54ICsgcENoYXJQb3Nbal0ubV9Gb250Q2hhcldpZHRoICogcFBpZWNlLT5mRm9udFNpemUgLyAxMDAwLjBmOw0KLSAgICAgICAgICAgICAgICAgICAgcHQxLnkgPSBwdDIueSA9IGZFbmRZOw0KLSAgICAgICAgICAgICAgICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZFbmRZICs9IDIuMGY7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwdDEueCA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWDsNCi0gICAgICAgICAgICBwdDIueCA9IHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fT3JpZ2luWCArIHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fRm9udENoYXJXaWR0aCAqIHBQaWVjZS0+ZkZvbnRTaXplIC8gMTAwMC4wZjsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwUGllY2UtPmlVbmRlcmxpbmU7IGkrKykgew0KLSAgICAgICAgICAgICAgICBwdDEueSA9IHB0Mi55ID0gZkVuZFk7DQotICAgICAgICAgICAgICAgIHBQYXRoLT5BZGRMaW5lKHB0MSwgcHQyKTsNCi0gICAgICAgICAgICAgICAgZkVuZFkgKz0gMi4wZjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBmRW5kWSA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWSAtIHBQaWVjZS0+cnRQaWVjZS5oZWlnaHQgKiAwLjI1ZjsNCi0gICAgICAgIHB0MS54ID0gcENoYXJQb3NbMF0ubV9PcmlnaW5YOw0KLSAgICAgICAgcHQyLnggPSBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX09yaWdpblggKyBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX0ZvbnRDaGFyV2lkdGggKiBwUGllY2UtPmZGb250U2l6ZSAvIDEwMDAuMGY7DQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBpZWNlLT5pTGluZVRocm91Z2g7IGkrKykgew0KLSAgICAgICAgICAgIHB0MS55ID0gcHQyLnkgPSBmRW5kWTsNCi0gICAgICAgICAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7DQotICAgICAgICAgICAgZkVuZFkgKz0gMi4wZjsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChiTm9MaW5lVGhyb3VnaCAmJiAoYk5vVW5kZXJsaW5lIHx8IHBQaWVjZS0+aVBlcmlvZCAhPSBYRkFfQVRUUklCVVRFRU5VTV9BbGwpKSB7DQotICAgICAgICAgICAgZ290byBYRkFfUmVuZGVyUGF0aFJldDsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaUNoYXJzVG1wID0gMDsNCi0gICAgICAgIGludDMyX3QgaVBpZWNlUHJldiA9IGlQaWVjZSwgaVBpZWNlTmV4dCA9IGlQaWVjZTsNCi0gICAgICAgIHdoaWxlIChpUGllY2VQcmV2ID4gMCkgew0KLSAgICAgICAgICAgIGlQaWVjZVByZXYtLTsNCi0gICAgICAgICAgICBpQ2hhcnNUbXAgPSBwUGllY2VMaW5lLT5tX2NoYXJDb3VudHMuR2V0QXQoaVBpZWNlUHJldik7DQotICAgICAgICAgICAgaWYgKGlDaGFyc1RtcCA+IDApIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlDaGFyc1RtcCA9PSAwKSB7DQotICAgICAgICAgICAgZ290byBYRkFfUmVuZGVyUGF0aFJldDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlDaGFyc1RtcCA9IDA7DQotICAgICAgICBpbnQzMl90IGlQaWVjZXMgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0U2l6ZSgpOw0KLSAgICAgICAgd2hpbGUgKGlQaWVjZU5leHQgPCBpUGllY2VzIC0gMSkgew0KLSAgICAgICAgICAgIGlQaWVjZU5leHQrKzsNCi0gICAgICAgICAgICBpQ2hhcnNUbXAgPSBwUGllY2VMaW5lLT5tX2NoYXJDb3VudHMuR2V0QXQoaVBpZWNlTmV4dCk7DQotICAgICAgICAgICAgaWYgKGlDaGFyc1RtcCA+IDApIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlDaGFyc1RtcCA9PSAwKSB7DQotICAgICAgICAgICAgZ290byBYRkFfUmVuZGVyUGF0aFJldDsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZMT0FUIGZPcmdYID0gMC4wZiwgZkVuZFggPSAwLjBmOw0KLSAgICAgICAgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGlQaWVjZVByZXYpOw0KLSAgICAgICAgaUNoYXJzID0gR2V0RGlzcGxheVBvcyhwUGllY2UsIHBDaGFyUG9zKTsNCi0gICAgICAgIGlmIChpQ2hhcnMgPCAxKSB7DQotICAgICAgICAgICAgZ290byBYRkFfUmVuZGVyUGF0aFJldDsNCi0gICAgICAgIH0NCi0gICAgICAgIGZPcmdYID0gcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9PcmlnaW5YICsgcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9Gb250Q2hhcldpZHRoICogcFBpZWNlLT5mRm9udFNpemUgLyAxMDAwLjBmOw0KLSAgICAgICAgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGlQaWVjZU5leHQpOw0KLSAgICAgICAgaUNoYXJzID0gR2V0RGlzcGxheVBvcyhwUGllY2UsIHBDaGFyUG9zKTsNCi0gICAgICAgIGlmIChpQ2hhcnMgPCAxKSB7DQotICAgICAgICAgICAgZ290byBYRkFfUmVuZGVyUGF0aFJldDsNCi0gICAgICAgIH0NCi0gICAgICAgIGZFbmRYID0gcENoYXJQb3NbMF0ubV9PcmlnaW5YOw0KLSAgICAgICAgQ0ZYX1BvaW50RiBwdDEsIHB0MjsNCi0gICAgICAgIHB0MS54ID0gZk9yZ1gsIHB0Mi54ID0gZkVuZFg7DQotICAgICAgICBGWF9GTE9BVCBmRW5kWSA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWSArIDEuMDVmOw0KLSAgICAgICAgaW50MzJfdCBpID0gMDsNCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGllY2UtPmlVbmRlcmxpbmU7IGkrKykgew0KLSAgICAgICAgICAgIHB0MS55ID0gcHQyLnkgPSBmRW5kWTsNCi0gICAgICAgICAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7DQotICAgICAgICAgICAgZkVuZFkgKz0gMi4wZjsNCi0gICAgICAgIH0NCi0gICAgICAgIGZFbmRZID0gcENoYXJQb3NbMF0ubV9PcmlnaW5ZIC0gcFBpZWNlLT5ydFBpZWNlLmhlaWdodCAqIDAuMjVmOw0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQaWVjZS0+aUxpbmVUaHJvdWdoOyBpKyspIHsNCi0gICAgICAgICAgICBwdDEueSA9IHB0Mi55ID0gZkVuZFk7DQotICAgICAgICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOw0KLSAgICAgICAgICAgIGZFbmRZICs9IDIuMGY7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcERldmljZS0+RHJhd1BhdGgocFBlbiwgMSwgcFBhdGgsICZ0bURvYzJEZXZpY2UpOw0KLVhGQV9SZW5kZXJQYXRoUmV0Og0KLSAgICBwUGF0aC0+UmVsZWFzZSgpOw0KLX0NCi1pbnQzMl90IENYRkFfVGV4dExheW91dDo6R2V0RGlzcGxheVBvcyhYRkFfTFBDVEVYVFBJRUNFIHBQaWVjZSwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBGWF9CT09MIGJDaGFyQ29kZSApDQotew0KLSAgICBpZiAocFBpZWNlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIEZYX1JURlRFWFRPQkogdHI7DQotICAgIGlmICghVG9SdW4ocFBpZWNlLCB0cikpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BCcmVhay0+R2V0RGlzcGxheVBvcygmdHIsIHBDaGFyUG9zLCBiQ2hhckNvZGUpOw0KLX0NCi1GWF9CT09MCUNYRkFfVGV4dExheW91dDo6VG9SdW4oWEZBX0xQQ1RFWFRQSUVDRSBwUGllY2UsIEZYX1JURlRFWFRPQkogJnRyKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcFBpZWNlLT5pQ2hhcnM7DQotICAgIGlmIChpTGVuZ3RoIDwgMSkgew0KICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICB0ci5wU3RyCQk9IHBQaWVjZS0+cHN6VGV4dDsNCi0gICAgdHIucEZvbnQJPSBwUGllY2UtPnBGb250Ow0KLSAgICB0ci5wUmVjdAk9ICZwUGllY2UtPnJ0UGllY2U7DQotICAgIHRyLnBXaWR0aHMJPSBwUGllY2UtPnBXaWR0aHM7DQotICAgIHRyLmlMZW5ndGgJPSBpTGVuZ3RoOw0KLSAgICB0ci5mRm9udFNpemUJPSBwUGllY2UtPmZGb250U2l6ZTsNCi0gICAgdHIuaUJpZGlMZXZlbAk9IHBQaWVjZS0+aUJpZGlMZXZlbDsNCi0gICAgdHIuaUNoYXJSb3RhdGlvbiA9IDA7DQotICAgIHRyLndMaW5lQnJlYWtDaGFyID0gTCdcbic7DQotICAgIHRyLmlWZXJ0aWNhbFNjYWxlID0gcFBpZWNlLT5pVmVyU2NhbGU7DQotICAgIHRyLmR3TGF5b3V0U3R5bGVzID0gRlhfUlRGTEFZT1VUU1RZTEVfRXhwYW5kVGFiOw0KLSAgICB0ci5pSG9yaXpvbnRhbFNjYWxlID0gcFBpZWNlLT5pSG9yU2NhbGU7DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQorICAgIHBTdHlsZS0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpBcHBlbmRDaGFyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGFjZUFib3ZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVQaWVjZXMpIHsNCisgIEZYX0RXT1JEIGR3U3RhdHVzID0gMDsNCisgIGludDMyX3QgaUNoYXIgPSAwOw0KKyAgaWYgKG1fcExvYWRlcikgew0KKyAgICBpQ2hhciA9IG1fcExvYWRlci0+bV9pQ2hhcjsNCisgIH0NCisgIGludDMyX3QgaUxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgIGZvciAoaW50MzJfdCBpID0gaUNoYXI7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgRlhfV0NIQVIgd2NoID0gd3NUZXh0LkdldEF0KGkpOw0KKyAgICBpZiAod2NoID09IDB4QTApIHsNCisgICAgICB3Y2ggPSAweDIwOw0KKyAgICB9DQorICAgIGlmICgoZHdTdGF0dXMgPSBtX3BCcmVhay0+QXBwZW5kQ2hhcih3Y2gpKSA+IEZYX1JURkJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICBBcHBlbmRUZXh0TGluZShkd1N0YXR1cywgZkxpbmVQb3MsIGJTYXZlUGllY2VzKTsNCisgICAgICBpZiAoSXNFbmQoYlNhdmVQaWVjZXMpKSB7DQorICAgICAgICBpZiAobV9wTG9hZGVyICE9IE5VTEwpIHsNCisgICAgICAgICAgbV9wTG9hZGVyLT5tX2lDaGFyID0gaTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpZiAoZHdTdGF0dXMgPT0gRlhfUlRGQlJFQUtfUGFyYWdyYXBoQnJlYWsgJiYgbV9iUmljaFRleHQpIHsNCisgICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUFib3ZlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fcExvYWRlcikgew0KKyAgICBtX3BMb2FkZXItPm1faUNoYXIgPSAwOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfVGV4dExheW91dDo6SXNFbmQoRlhfQk9PTCBiU2F2ZVBpZWNlcykgew0KKyAgaWYgKCFiU2F2ZVBpZWNlcykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9wTG9hZGVyICYmIG1fcExvYWRlci0+bV9pVG90YWxMaW5lcyA+IDApIHsNCisgICAgcmV0dXJuIG1faUxpbmVzID49IG1fcExvYWRlci0+bV9pVG90YWxMaW5lczsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX1RleHRMYXlvdXQ6OlByb2Nlc3NUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIGludDMyX3QgaUxlbiA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfV0NIQVIqIHBzeiA9IHdzVGV4dC5HZXRCdWZmZXIoaUxlbik7DQorICBpbnQzMl90IGlUcmltTGVmdCA9IDA7DQorICBGWF9XQ0hBUiB3Y2ggPSAwLCB3UHJldiA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgd2NoID0gcHN6W2ldOw0KKyAgICBpZiAod2NoIDwgMHgyMCkgew0KKyAgICAgIHdjaCA9IDB4MjA7DQorICAgIH0NCisgICAgaWYgKHdjaCA9PSAweDIwICYmIHdQcmV2ID09IDB4MjApIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICB3UHJldiA9IHdjaDsNCisgICAgcHN6W2lUcmltTGVmdCsrXSA9IHdjaDsNCisgIH0NCisgIHdzVGV4dC5SZWxlYXNlQnVmZmVyKGlMZW4pOw0KKyAgd3NUZXh0ID0gd3NUZXh0LkxlZnQoaVRyaW1MZWZ0KTsNCit9DQordm9pZCBDWEZBX1RleHRMYXlvdXQ6OkVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkxpbmVQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVQaWVjZXMpIHsNCisgIGR3U3RhdHVzID0gbV9wQnJlYWstPkVuZEJyZWFrKGR3U3RhdHVzKTsNCisgIGlmIChkd1N0YXR1cyA+IEZYX1JURkJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgQXBwZW5kVGV4dExpbmUoZHdTdGF0dXMsIGZMaW5lUG9zLCBiU2F2ZVBpZWNlcywgVFJVRSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpEb1RhYnN0b3BzKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lKSB7DQorICBpZiAobV9wVGFic3RvcENvbnRleHQgPT0gTlVMTCB8fCBtX3BUYWJzdG9wQ29udGV4dC0+bV9pVGFiQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocFN0eWxlID09IE5VTEwgfHwgcFBpZWNlTGluZSA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaVBpZWNlcyA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRTaXplKCk7DQorICBpZiAoaVBpZWNlcyA9PSAwKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFhGQV9MUFRFWFRQSUVDRSBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0QXQoaVBpZWNlcyAtIDEpOw0KKyAgaW50MzJfdCYgaVRhYnN0b3BzSW5kZXggPSBtX3BUYWJzdG9wQ29udGV4dC0+bV9pVGFiSW5kZXg7DQorICBpbnQzMl90IGlDb3VudCA9IG1fdGV4dFBhcnNlci5Db3VudFRhYnMocFN0eWxlKTsNCisgIGlmIChpVGFic3RvcHNJbmRleCA+IG1fcFRhYnN0b3BDb250ZXh0LT5tX2lUYWJDb3VudCAtIDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGlDb3VudCA+IDApIHsNCisgICAgaVRhYnN0b3BzSW5kZXgrKzsNCisgICAgbV9wVGFic3RvcENvbnRleHQtPm1fYlRhYnN0b3BzID0gVFJVRTsNCisgICAgRlhfRkxPQVQgZlJpZ2h0ID0gMDsNCisgICAgaWYgKGlQaWVjZXMgPiAxKSB7DQorICAgICAgWEZBX0xQVEVYVFBJRUNFIHAgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0QXQoaVBpZWNlcyAtIDIpOw0KKyAgICAgIGZSaWdodCA9IHAtPnJ0UGllY2UucmlnaHQoKTsNCisgICAgfQ0KKyAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV9mVGFiV2lkdGggPQ0KKyAgICAgICAgcFBpZWNlLT5ydFBpZWNlLndpZHRoICsgcFBpZWNlLT5ydFBpZWNlLmxlZnQgLSBmUmlnaHQ7DQorICB9IGVsc2UgaWYgKGlUYWJzdG9wc0luZGV4ID4gLTEpIHsNCisgICAgRlhfRkxPQVQgZkxlZnQgPSAwOw0KKyAgICBpZiAobV9wVGFic3RvcENvbnRleHQtPm1fYlRhYnN0b3BzKSB7DQorICAgICAgWEZBX1RBQlNUT1BTKiBwVGFic3RvcHMgPQ0KKyAgICAgICAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV90YWJzdG9wcy5HZXREYXRhUHRyKGlUYWJzdG9wc0luZGV4KTsNCisgICAgICBGWF9EV09SRCBkd0FsZ2luID0gcFRhYnN0b3BzLT5kd0FsaWduOw0KKyAgICAgIGlmIChkd0FsZ2luID09IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEwiY2VudGVyIiwgNikpIHsNCisgICAgICAgIGZMZWZ0ID0gcFBpZWNlLT5ydFBpZWNlLndpZHRoIC8gMi4wZjsNCisgICAgICB9IGVsc2UgaWYgKGR3QWxnaW4gPT0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoTCJyaWdodCIsIDUpIHx8DQorICAgICAgICAgICAgICAgICBkd0FsZ2luID09IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEwiYmVmb3JlIiwgNikpIHsNCisgICAgICAgIGZMZWZ0ID0gcFBpZWNlLT5ydFBpZWNlLndpZHRoOw0KKyAgICAgIH0gZWxzZSBpZiAoZHdBbGdpbiA9PSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhMImRlY2ltYWwiLCA3KSkgew0KKyAgICAgICAgaW50MzJfdCBpQ2hhcnMgPSBwUGllY2UtPmlDaGFyczsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDaGFyczsgaSsrKSB7DQorICAgICAgICAgIGlmIChwUGllY2UtPnBzelRleHRbaV0gPT0gTCcuJykgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGZMZWZ0ICs9IHBQaWVjZS0+cFdpZHRoc1tpXSAvIDIwMDAwLjBmOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV9mTGVmdCA9DQorICAgICAgICAgIEZYX01JTihmTGVmdCwgbV9wVGFic3RvcENvbnRleHQtPm1fZlRhYldpZHRoKTsNCisgICAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV9iVGFic3RvcHMgPSBGQUxTRTsNCisgICAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV9mVGFiV2lkdGggPSAwOw0KKyAgICB9DQorICAgIHBQaWVjZS0+cnRQaWVjZS5sZWZ0IC09IG1fcFRhYnN0b3BDb250ZXh0LT5tX2ZMZWZ0Ow0KKyAgfQ0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6QXBwZW5kVGV4dExpbmUoRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTGluZVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVBpZWNlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5kQnJlYWspIHsNCisgIGludDMyX3QgaVBpZWNlcyA9IG1fcEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7DQorICBpZiAoaVBpZWNlcyA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUgPSBOVUxMOw0KKyAgaWYgKGJTYXZlUGllY2VzKSB7DQorICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lID0gRkRFX05ld1dpdGgobV9wQWxsb2NhdG9yKSBDWEZBX1BpZWNlTGluZTsNCisgICAgbV9waWVjZUxpbmVzLkFkZChwUGllY2VMaW5lKTsNCisgICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0KSB7DQorICAgICAgbV9wVGFic3RvcENvbnRleHQtPlJlc2V0KCk7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkxpbmVTdGVwID0gMCwgZkJhc2VMaW5lID0gMDsNCisgICAgaW50MzJfdCBpID0gMDsNCisgICAgZm9yIChpID0gMDsgaSA8IGlQaWVjZXM7IGkrKykgew0KKyAgICAgIGNvbnN0IENGWF9SVEZQaWVjZSogcFBpZWNlID0gbV9wQnJlYWstPkdldEJyZWFrUGllY2UoaSk7DQorICAgICAgQ1hGQV9UZXh0VXNlckRhdGEqIHBVc2VyRGF0YSA9IChDWEZBX1RleHRVc2VyRGF0YSopcFBpZWNlLT5tX3BVc2VyRGF0YTsNCisgICAgICBpZiAocFVzZXJEYXRhICE9IE5VTEwpIHsNCisgICAgICAgIHBTdHlsZSA9IHBVc2VyRGF0YS0+bV9wU3R5bGU7DQorICAgICAgfQ0KKyAgICAgIEZYX0ZMT0FUIGZWZXJTY2FsZSA9IHBQaWVjZS0+bV9pVmVydGljYWxTY2FsZSAvIDEwMC4wZjsNCisgICAgICBYRkFfTFBURVhUUElFQ0UgcFRQID0NCisgICAgICAgICAgKFhGQV9MUFRFWFRQSUVDRSltX3BBbGxvY2F0b3ItPkFsbG9jKHNpemVvZihYRkFfVEVYVFBJRUNFKSk7DQorICAgICAgcFRQLT5wc3pUZXh0ID0NCisgICAgICAgICAgKEZYX1dDSEFSKiltX3BBbGxvY2F0b3ItPkFsbG9jKHBQaWVjZS0+bV9pQ2hhcnMgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICBwVFAtPnBXaWR0aHMgPQ0KKyAgICAgICAgICAoaW50MzJfdCopbV9wQWxsb2NhdG9yLT5BbGxvYyhwUGllY2UtPm1faUNoYXJzICogc2l6ZW9mKGludDMyX3QpKTsNCisgICAgICBwVFAtPmlDaGFycyA9IHBQaWVjZS0+bV9pQ2hhcnM7DQorICAgICAgcFBpZWNlLT5HZXRTdHJpbmcocFRQLT5wc3pUZXh0KTsNCisgICAgICBwUGllY2UtPkdldFdpZHRocyhwVFAtPnBXaWR0aHMpOw0KKyAgICAgIHBUUC0+aUJpZGlMZXZlbCA9IHBQaWVjZS0+bV9pQmlkaUxldmVsOw0KKyAgICAgIHBUUC0+aUhvclNjYWxlID0gcFBpZWNlLT5tX2lIb3Jpem9udGFsU2NhbGU7DQorICAgICAgcFRQLT5pVmVyU2NhbGUgPSBwUGllY2UtPm1faVZlcnRpY2FsU2NhbGU7DQorICAgICAgbV90ZXh0UGFyc2VyLkdldFVuZGVybGluZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSwgcFRQLT5pVW5kZXJsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRQLT5pUGVyaW9kKTsNCisgICAgICBtX3RleHRQYXJzZXIuR2V0TGluZXRocm91Z2gobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUsIHBUUC0+aUxpbmVUaHJvdWdoKTsNCisgICAgICBwVFAtPmR3Q29sb3IgPSBtX3RleHRQYXJzZXIuR2V0Q29sb3IobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpOw0KKyAgICAgIHBUUC0+cEZvbnQgPSBtX3RleHRQYXJzZXIuR2V0Rm9udChtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSk7DQorICAgICAgcFRQLT5mRm9udFNpemUgPSBtX3RleHRQYXJzZXIuR2V0Rm9udFNpemUobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpOw0KKyAgICAgIHBUUC0+cnRQaWVjZS5sZWZ0ID0gcFBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmOw0KKyAgICAgIHBUUC0+cnRQaWVjZS53aWR0aCA9IHBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZjsNCisgICAgICBwVFAtPnJ0UGllY2UuaGVpZ2h0ID0gKEZYX0ZMT0FUKXBQaWVjZS0+bV9pRm9udFNpemUgKiBmVmVyU2NhbGUgLyAyMC4wZjsNCisgICAgICBGWF9GTE9BVCBmQmFzZUxpbmVUZW1wID0NCisgICAgICAgICAgbV90ZXh0UGFyc2VyLkdldEJhc2VsaW5lKG1fcFRleHRQcm92aWRlciwgcFN0eWxlKTsNCisgICAgICBwVFAtPnJ0UGllY2UudG9wID0gZkJhc2VMaW5lVGVtcDsNCisgICAgICBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuQWRkKHBUUCk7DQorICAgICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSBtX3RleHRQYXJzZXIuR2V0TGluZUhlaWdodCgNCisgICAgICAgICAgbV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUsIG1faUxpbmVzID09IDAsIGZWZXJTY2FsZSk7DQorICAgICAgaWYgKGZCYXNlTGluZVRlbXAgPiAwKSB7DQorICAgICAgICBGWF9GTE9BVCBmTGluZUhlaWdodFRtcCA9IGZCYXNlTGluZVRlbXAgKyBwVFAtPnJ0UGllY2UuaGVpZ2h0Ow0KKyAgICAgICAgaWYgKGZMaW5lSGVpZ2h0IDwgZkxpbmVIZWlnaHRUbXApIHsNCisgICAgICAgICAgZkxpbmVIZWlnaHQgPSBmTGluZUhlaWdodFRtcDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGZCYXNlTGluZVRlbXAgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoZkJhc2VMaW5lIDwgLWZCYXNlTGluZVRlbXApIHsNCisgICAgICAgIGZCYXNlTGluZSA9IC1mQmFzZUxpbmVUZW1wOw0KKyAgICAgIH0NCisgICAgICBmTGluZVN0ZXAgPSBGWF9NQVgoZkxpbmVTdGVwLCBmTGluZUhlaWdodCk7DQorICAgICAgaWYgKHBVc2VyRGF0YSAhPSBOVUxMICYmIHBVc2VyRGF0YS0+bV9wTGlua0RhdGEgIT0gTlVMTCkgew0KKyAgICAgICAgcFVzZXJEYXRhLT5tX3BMaW5rRGF0YS0+QWRkUmVmKCk7DQorICAgICAgICBwVFAtPnBMaW5rRGF0YSA9IHBVc2VyRGF0YS0+bV9wTGlua0RhdGE7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBUUC0+cExpbmtEYXRhID0gTlVMTDsNCisgICAgICB9DQorICAgICAgRG9UYWJzdG9wcyhwU3R5bGUsIHBQaWVjZUxpbmUpOw0KKyAgICB9DQorICAgIGZvciAoaSA9IDA7IGkgPCBpUGllY2VzOyBpKyspIHsNCisgICAgICBYRkFfTFBURVhUUElFQ0UgcFRQID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGkpOw0KKyAgICAgIEZYX0ZMT0FUJiBmVG9wID0gcFRQLT5ydFBpZWNlLnRvcDsNCisgICAgICBGWF9GTE9BVCBmQmFzZUxpbmVUZW1wID0gZlRvcDsNCisgICAgICBmVG9wID0gZkxpbmVQb3MgKyBmTGluZVN0ZXAgLSBwVFAtPnJ0UGllY2UuaGVpZ2h0IC0gZkJhc2VMaW5lVGVtcDsNCisgICAgICBmVG9wID0gRlhfTUFYKDAsIGZUb3ApOw0KKyAgICB9DQorICAgIGZMaW5lUG9zICs9IGZMaW5lU3RlcCArIGZCYXNlTGluZTsNCisgIH0gZWxzZSB7DQorICAgIEZYX0ZMT0FUIGZMaW5lU3RlcCA9IDA7DQorICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGggPSAwOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpUGllY2VzOyBpKyspIHsNCisgICAgICBjb25zdCBDRlhfUlRGUGllY2UqIHBQaWVjZSA9IG1fcEJyZWFrLT5HZXRCcmVha1BpZWNlKGkpOw0KKyAgICAgIENYRkFfVGV4dFVzZXJEYXRhKiBwVXNlckRhdGEgPSAoQ1hGQV9UZXh0VXNlckRhdGEqKXBQaWVjZS0+bV9wVXNlckRhdGE7DQorICAgICAgaWYgKHBVc2VyRGF0YSAhPSBOVUxMKSB7DQorICAgICAgICBwU3R5bGUgPSBwVXNlckRhdGEtPm1fcFN0eWxlOw0KKyAgICAgIH0NCisgICAgICBGWF9GTE9BVCBmVmVyU2NhbGUgPSBwUGllY2UtPm1faVZlcnRpY2FsU2NhbGUgLyAxMDAuMGY7DQorICAgICAgRlhfRkxPQVQgZkJhc2VMaW5lID0gbV90ZXh0UGFyc2VyLkdldEJhc2VsaW5lKG1fcFRleHRQcm92aWRlciwgcFN0eWxlKTsNCisgICAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IG1fdGV4dFBhcnNlci5HZXRMaW5lSGVpZ2h0KA0KKyAgICAgICAgICBtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSwgbV9pTGluZXMgPT0gMCwgZlZlclNjYWxlKTsNCisgICAgICBpZiAoZkJhc2VMaW5lID4gMCkgew0KKyAgICAgICAgRlhfRkxPQVQgZkxpbmVIZWlnaHRUbXAgPQ0KKyAgICAgICAgICAgIGZCYXNlTGluZSArIChGWF9GTE9BVClwUGllY2UtPm1faUZvbnRTaXplICogZlZlclNjYWxlIC8gMjAuMGY7DQorICAgICAgICBpZiAoZkxpbmVIZWlnaHQgPCBmTGluZUhlaWdodFRtcCkgew0KKyAgICAgICAgICBmTGluZUhlaWdodCA9IGZMaW5lSGVpZ2h0VG1wOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBmTGluZVN0ZXAgPSBGWF9NQVgoZkxpbmVTdGVwLCBmTGluZUhlaWdodCk7DQorICAgICAgZkxpbmVXaWR0aCArPSBwUGllY2UtPm1faVdpZHRoIC8gMjAwMDAuMGY7DQorICAgIH0NCisgICAgZkxpbmVQb3MgKz0gZkxpbmVTdGVwOw0KKyAgICBtX2ZNYXhXaWR0aCA9IEZYX01BWChtX2ZNYXhXaWR0aCwgZkxpbmVXaWR0aCk7DQorICAgIGlmIChtX3BMb2FkZXIgJiYgbV9wTG9hZGVyLT5tX2JTYXZlTGluZUhlaWdodCkgew0KKyAgICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBmTGluZVBvcyAtIG1fcExvYWRlci0+bV9mTGFzdFBvczsNCisgICAgICBtX3BMb2FkZXItPm1fZkxhc3RQb3MgPSBmTGluZVBvczsNCisgICAgICBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuQWRkKGZIZWlnaHQpOw0KKyAgICB9DQorICB9DQorICBtX3BCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgaWYgKGR3U3RhdHVzID09IEZYX1JURkJSRUFLX1BhcmFncmFwaEJyZWFrKSB7DQorICAgIG1fcEJyZWFrLT5SZXNldCgpOw0KKyAgICBpZiAocFN0eWxlID09IE5VTEwgJiYgYkVuZEJyZWFrKSB7DQorICAgICAgQ1hGQV9QYXJhIHBhcmEgPSBtX3BUZXh0UHJvdmlkZXItPkdldFBhcmFOb2RlKCk7DQorICAgICAgaWYgKHBhcmEuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZTdGFydFBvcyA9IHBhcmEuR2V0TWFyZ2luTGVmdCgpOw0KKyAgICAgICAgRlhfRkxPQVQgZkluZGVudCA9IHBhcmEuR2V0VGV4dEluZGVudCgpOw0KKyAgICAgICAgaWYgKGZJbmRlbnQgPiAwKSB7DQorICAgICAgICAgIGZTdGFydFBvcyArPSBmSW5kZW50Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZlNwYWNlQmVsb3cgPSBwYXJhLkdldFNwYWNlQmVsb3coKTsNCisgICAgICAgIGlmIChmU3BhY2VCZWxvdyA8IDAuMWYpIHsNCisgICAgICAgICAgZlNwYWNlQmVsb3cgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wQnJlYWstPlNldExpbmVQb3MoZlN0YXJ0UG9zKTsNCisgICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUJlbG93Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQorICAgIEZYX0ZMT0FUIGZTdGFydCA9IDA7DQorICAgIGNvbnN0IEZERV9DU1NSRUNUKiBwUmVjdCA9IHBTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKS0+R2V0TWFyZ2luV2lkdGgoKTsNCisgICAgaWYgKHBSZWN0KSB7DQorICAgICAgZlN0YXJ0ID0gcFJlY3QtPmxlZnQuR2V0VmFsdWUoKTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmVGV4dEluZGVudCA9DQorICAgICAgICBwU3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpLT5HZXRUZXh0SW5kZW50KCkuR2V0VmFsdWUoKTsNCisgICAgaWYgKGZUZXh0SW5kZW50IDwgMCkgew0KKyAgICAgIGZTdGFydCAtPSBmVGV4dEluZGVudDsNCisgICAgfQ0KKyAgICBtX3BCcmVhay0+U2V0TGluZVBvcyhmU3RhcnQpOw0KKyAgfQ0KKyAgbV9pTGluZXMrKzsNCit9DQordm9pZCBDWEZBX1RleHRMYXlvdXQ6OlJlbmRlclN0cmluZyhJRkRFX1JlbmRlckRldmljZSogcERldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfU29saWRCcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9QaWVjZUxpbmUqIHBQaWVjZUxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQaWVjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHRtRG9jMkRldmljZSkgew0KKyAgWEZBX0xQQ1RFWFRQSUVDRSBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0QXQoaVBpZWNlKTsNCisgIGludDMyX3QgaUNvdW50ID0gR2V0RGlzcGxheVBvcyhwUGllY2UsIHBDaGFyUG9zKTsNCisgIGlmIChpQ291bnQgPiAwKSB7DQorICAgIHBCcnVzaC0+U2V0Q29sb3IocFBpZWNlLT5kd0NvbG9yKTsNCisgICAgcERldmljZS0+RHJhd1N0cmluZyhwQnJ1c2gsIHBQaWVjZS0+cEZvbnQsIHBDaGFyUG9zLCBpQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgcFBpZWNlLT5mRm9udFNpemUsICZ0bURvYzJEZXZpY2UpOw0KKyAgfQ0KKyAgcFBpZWNlTGluZS0+bV9jaGFyQ291bnRzLkFkZChpQ291bnQpOw0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6UmVuZGVyUGF0aChJRkRFX1JlbmRlckRldmljZSogcERldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQaWVjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKSB7DQorICBYRkFfVEVYVFBJRUNFKiBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0QXQoaVBpZWNlKTsNCisgIEZYX0JPT0wgYk5vVW5kZXJsaW5lID0gcFBpZWNlLT5pVW5kZXJsaW5lIDwgMSB8fCBwUGllY2UtPmlVbmRlcmxpbmUgPiAyOw0KKyAgRlhfQk9PTCBiTm9MaW5lVGhyb3VnaCA9IHBQaWVjZS0+aUxpbmVUaHJvdWdoIDwgMSB8fCBwUGllY2UtPmlMaW5lVGhyb3VnaCA+IDI7DQorICBpZiAoYk5vVW5kZXJsaW5lICYmIGJOb0xpbmVUaHJvdWdoKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBQZW4tPlNldENvbG9yKHBQaWVjZS0+ZHdDb2xvcik7DQorICBJRkRFX1BhdGgqIHBQYXRoID0gSUZERV9QYXRoOjpDcmVhdGUoKTsNCisgIGludDMyX3QgaUNoYXJzID0gR2V0RGlzcGxheVBvcyhwUGllY2UsIHBDaGFyUG9zKTsNCisgIGlmIChpQ2hhcnMgPiAwKSB7DQorICAgIENGWF9Qb2ludEYgcHQxLCBwdDI7DQorICAgIEZYX0ZMT0FUIGZFbmRZID0gcENoYXJQb3NbMF0ubV9PcmlnaW5ZICsgMS4wNWY7DQorICAgIGludDMyX3QgaSA9IDA7DQorICAgIGlmIChwUGllY2UtPmlQZXJpb2QgPT0gWEZBX0FUVFJJQlVURUVOVU1fV29yZCkgew0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBQaWVjZS0+aVVuZGVybGluZTsgaSsrKSB7DQorICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpQ2hhcnM7IGorKykgew0KKyAgICAgICAgICBwdDEueCA9IHBDaGFyUG9zW2pdLm1fT3JpZ2luWDsNCisgICAgICAgICAgcHQyLnggPQ0KKyAgICAgICAgICAgICAgcHQxLnggKyBwQ2hhclBvc1tqXS5tX0ZvbnRDaGFyV2lkdGggKiBwUGllY2UtPmZGb250U2l6ZSAvIDEwMDAuMGY7DQorICAgICAgICAgIHB0MS55ID0gcHQyLnkgPSBmRW5kWTsNCisgICAgICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZkVuZFkgKz0gMi4wZjsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgcHQxLnggPSBwQ2hhclBvc1swXS5tX09yaWdpblg7DQorICAgICAgcHQyLnggPQ0KKyAgICAgICAgICBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX09yaWdpblggKw0KKyAgICAgICAgICBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX0ZvbnRDaGFyV2lkdGggKiBwUGllY2UtPmZGb250U2l6ZSAvIDEwMDAuMGY7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFBpZWNlLT5pVW5kZXJsaW5lOyBpKyspIHsNCisgICAgICAgIHB0MS55ID0gcHQyLnkgPSBmRW5kWTsNCisgICAgICAgIHBQYXRoLT5BZGRMaW5lKHB0MSwgcHQyKTsNCisgICAgICAgIGZFbmRZICs9IDIuMGY7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGZFbmRZID0gcENoYXJQb3NbMF0ubV9PcmlnaW5ZIC0gcFBpZWNlLT5ydFBpZWNlLmhlaWdodCAqIDAuMjVmOw0KKyAgICBwdDEueCA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWDsNCisgICAgcHQyLnggPSBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX09yaWdpblggKw0KKyAgICAgICAgICAgIHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fRm9udENoYXJXaWR0aCAqIHBQaWVjZS0+ZkZvbnRTaXplIC8gMTAwMC4wZjsNCisgICAgZm9yIChpID0gMDsgaSA8IHBQaWVjZS0+aUxpbmVUaHJvdWdoOyBpKyspIHsNCisgICAgICBwdDEueSA9IHB0Mi55ID0gZkVuZFk7DQorICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOw0KKyAgICAgIGZFbmRZICs9IDIuMGY7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmIChiTm9MaW5lVGhyb3VnaCAmJg0KKyAgICAgICAgKGJOb1VuZGVybGluZSB8fCBwUGllY2UtPmlQZXJpb2QgIT0gWEZBX0FUVFJJQlVURUVOVU1fQWxsKSkgew0KKyAgICAgIGdvdG8gWEZBX1JlbmRlclBhdGhSZXQ7DQorICAgIH0NCisgICAgaW50MzJfdCBpQ2hhcnNUbXAgPSAwOw0KKyAgICBpbnQzMl90IGlQaWVjZVByZXYgPSBpUGllY2UsIGlQaWVjZU5leHQgPSBpUGllY2U7DQorICAgIHdoaWxlIChpUGllY2VQcmV2ID4gMCkgew0KKyAgICAgIGlQaWVjZVByZXYtLTsNCisgICAgICBpQ2hhcnNUbXAgPSBwUGllY2VMaW5lLT5tX2NoYXJDb3VudHMuR2V0QXQoaVBpZWNlUHJldik7DQorICAgICAgaWYgKGlDaGFyc1RtcCA+IDApIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaUNoYXJzVG1wID09IDApIHsNCisgICAgICBnb3RvIFhGQV9SZW5kZXJQYXRoUmV0Ow0KKyAgICB9DQorICAgIGlDaGFyc1RtcCA9IDA7DQorICAgIGludDMyX3QgaVBpZWNlcyA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRTaXplKCk7DQorICAgIHdoaWxlIChpUGllY2VOZXh0IDwgaVBpZWNlcyAtIDEpIHsNCisgICAgICBpUGllY2VOZXh0Kys7DQorICAgICAgaUNoYXJzVG1wID0gcFBpZWNlTGluZS0+bV9jaGFyQ291bnRzLkdldEF0KGlQaWVjZU5leHQpOw0KKyAgICAgIGlmIChpQ2hhcnNUbXAgPiAwKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlDaGFyc1RtcCA9PSAwKSB7DQorICAgICAgZ290byBYRkFfUmVuZGVyUGF0aFJldDsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmT3JnWCA9IDAuMGYsIGZFbmRYID0gMC4wZjsNCisgICAgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGlQaWVjZVByZXYpOw0KKyAgICBpQ2hhcnMgPSBHZXREaXNwbGF5UG9zKHBQaWVjZSwgcENoYXJQb3MpOw0KKyAgICBpZiAoaUNoYXJzIDwgMSkgew0KKyAgICAgIGdvdG8gWEZBX1JlbmRlclBhdGhSZXQ7DQorICAgIH0NCisgICAgZk9yZ1ggPSBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX09yaWdpblggKw0KKyAgICAgICAgICAgIHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fRm9udENoYXJXaWR0aCAqIHBQaWVjZS0+ZkZvbnRTaXplIC8gMTAwMC4wZjsNCisgICAgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGlQaWVjZU5leHQpOw0KKyAgICBpQ2hhcnMgPSBHZXREaXNwbGF5UG9zKHBQaWVjZSwgcENoYXJQb3MpOw0KKyAgICBpZiAoaUNoYXJzIDwgMSkgew0KKyAgICAgIGdvdG8gWEZBX1JlbmRlclBhdGhSZXQ7DQorICAgIH0NCisgICAgZkVuZFggPSBwQ2hhclBvc1swXS5tX09yaWdpblg7DQorICAgIENGWF9Qb2ludEYgcHQxLCBwdDI7DQorICAgIHB0MS54ID0gZk9yZ1gsIHB0Mi54ID0gZkVuZFg7DQorICAgIEZYX0ZMT0FUIGZFbmRZID0gcENoYXJQb3NbMF0ubV9PcmlnaW5ZICsgMS4wNWY7DQorICAgIGludDMyX3QgaSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBwUGllY2UtPmlVbmRlcmxpbmU7IGkrKykgew0KKyAgICAgIHB0MS55ID0gcHQyLnkgPSBmRW5kWTsNCisgICAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7DQorICAgICAgZkVuZFkgKz0gMi4wZjsNCisgICAgfQ0KKyAgICBmRW5kWSA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWSAtIHBQaWVjZS0+cnRQaWVjZS5oZWlnaHQgKiAwLjI1ZjsNCisgICAgZm9yIChpID0gMDsgaSA8IHBQaWVjZS0+aUxpbmVUaHJvdWdoOyBpKyspIHsNCisgICAgICBwdDEueSA9IHB0Mi55ID0gZkVuZFk7DQorICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOw0KKyAgICAgIGZFbmRZICs9IDIuMGY7DQorICAgIH0NCisgIH0NCisgIHBEZXZpY2UtPkRyYXdQYXRoKHBQZW4sIDEsIHBQYXRoLCAmdG1Eb2MyRGV2aWNlKTsNCitYRkFfUmVuZGVyUGF0aFJldDoNCisgIHBQYXRoLT5SZWxlYXNlKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9UZXh0TGF5b3V0OjpHZXREaXNwbGF5UG9zKFhGQV9MUENURVhUUElFQ0UgcFBpZWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSkgew0KKyAgaWYgKHBQaWVjZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgRlhfUlRGVEVYVE9CSiB0cjsNCisgIGlmICghVG9SdW4ocFBpZWNlLCB0cikpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gbV9wQnJlYWstPkdldERpc3BsYXlQb3MoJnRyLCBwQ2hhclBvcywgYkNoYXJDb2RlKTsNCit9DQorRlhfQk9PTCBDWEZBX1RleHRMYXlvdXQ6OlRvUnVuKFhGQV9MUENURVhUUElFQ0UgcFBpZWNlLCBGWF9SVEZURVhUT0JKJiB0cikgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcFBpZWNlLT5pQ2hhcnM7DQorICBpZiAoaUxlbmd0aCA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdHIucFN0ciA9IHBQaWVjZS0+cHN6VGV4dDsNCisgIHRyLnBGb250ID0gcFBpZWNlLT5wRm9udDsNCisgIHRyLnBSZWN0ID0gJnBQaWVjZS0+cnRQaWVjZTsNCisgIHRyLnBXaWR0aHMgPSBwUGllY2UtPnBXaWR0aHM7DQorICB0ci5pTGVuZ3RoID0gaUxlbmd0aDsNCisgIHRyLmZGb250U2l6ZSA9IHBQaWVjZS0+ZkZvbnRTaXplOw0KKyAgdHIuaUJpZGlMZXZlbCA9IHBQaWVjZS0+aUJpZGlMZXZlbDsNCisgIHRyLmlDaGFyUm90YXRpb24gPSAwOw0KKyAgdHIud0xpbmVCcmVha0NoYXIgPSBMJ1xuJzsNCisgIHRyLmlWZXJ0aWNhbFNjYWxlID0gcFBpZWNlLT5pVmVyU2NhbGU7DQorICB0ci5kd0xheW91dFN0eWxlcyA9IEZYX1JURkxBWU9VVFNUWUxFX0V4cGFuZFRhYjsNCisgIHRyLmlIb3Jpem9udGFsU2NhbGUgPSBwUGllY2UtPmlIb3JTY2FsZTsNCisgIHJldHVybiBUUlVFOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfdGV4dGxheW91dC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuaAppbmRleCAyZTAxMDY2Li44YjU5NzRjIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfdGV4dGxheW91dC5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV90ZXh0bGF5b3V0LmgKQEAgLTYsMzg3ICs2LDQxNiBAQAogDQogI2lmbmRlZiBfRlhGQV9URVhUTEFZT1VUX0gNCiAjZGVmaW5lIF9GWEZBX1RFWFRMQVlPVVRfSA0KLSNkZWZpbmUgWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFCQkJMHgwMDENCisjZGVmaW5lIFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRSAweDAwMQ0KIGNsYXNzIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dDsNCi1jbGFzcyBJWEZBX1RleHRQcm92aWRlcg0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklYRkFfVGV4dFByb3ZpZGVyKCkge30NCi0gICAgdmlydHVhbCBDWEZBX05vZGUqCQkJR2V0VGV4dE5vZGUoRlhfQk9PTCAmYlJpY2hUZXh0KSA9IDA7DQotICAgIHZpcnR1YWwgQ1hGQV9QYXJhCQkJR2V0UGFyYU5vZGUoKSA9IDA7DQotICAgIHZpcnR1YWwgQ1hGQV9Gb250CQkJR2V0Rm9udE5vZGUoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0NoZWNrQnV0dG9uQW5kQXV0b1dpZHRoKCkgPSAwOw0KLSAgICB2aXJ0dWFsCUNYRkFfRkZEb2MqCQkJR2V0RG9jTm9kZSgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUdldEVtYmJlZE9iaihGWF9CT09MIGJVUkksIEZYX0JPT0wgYlJhdywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0ciwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpID0gMDsNCitjbGFzcyBJWEZBX1RleHRQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfVGV4dFByb3ZpZGVyKCkge30NCisgIHZpcnR1YWwgQ1hGQV9Ob2RlKiBHZXRUZXh0Tm9kZShGWF9CT09MJiBiUmljaFRleHQpID0gMDsNCisgIHZpcnR1YWwgQ1hGQV9QYXJhIEdldFBhcmFOb2RlKCkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX0ZvbnQgR2V0Rm9udE5vZGUoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNDaGVja0J1dHRvbkFuZEF1dG9XaWR0aCgpID0gMDsNCisgIHZpcnR1YWwgQ1hGQV9GRkRvYyogR2V0RG9jTm9kZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRFbWJiZWRPYmooRlhfQk9PTCBiVVJJLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSYXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSA9IDA7DQogfTsNCi1jbGFzcyBDWEZBX0NTU1RhZ1Byb3ZpZGVyIDogcHVibGljIElGREVfQ1NTVGFnUHJvdmlkZXINCi17DQotcHVibGljOg0KLSAgICBDWEZBX0NTU1RhZ1Byb3ZpZGVyICgpDQotICAgICAgICA6IG1fYlRhZ0F2aWxpYWJsZShGQUxTRSksDQotICAgICAgICAgIG1fYkNvbnRlbnQoRkFMU0UpDQotICAgIHt9DQotICAgIHZpcnR1YWwgfkNYRkFfQ1NTVGFnUHJvdmlkZXIoKTsNCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZ0MJCUdldFRhZ05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV93c1RhZ05hbWU7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9QT1NJVElPTgkJCUdldEZpcnN0QXR0cmlidXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fQXR0cmlidXRlcy5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkCQkJCUdldE5leHRBdHRyaWJ1dGUoRlhfUE9TSVRJT04gJnBvcywgQ0ZYX1dpZGVTdHJpbmdDICZ3c0F0dHIsIENGWF9XaWRlU3RyaW5nQyAmd3NWYWx1ZSk7DQotICAgIHZvaWQJCQkJCQlTZXRUYWdOYW1lT2JqKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c05hbWUpDQotICAgIHsNCi0gICAgICAgIG1fd3NUYWdOYW1lID0gd3NOYW1lOw0KLSAgICB9DQotICAgIHZvaWQJCQkJCQlTZXRBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQXR0ciwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpOw0KLSAgICBGWF9CT09MCQkJCQltX2JUYWdBdmlsaWFibGU7DQotICAgIEZYX0JPT0wJCQkJCW1fYkNvbnRlbnQ7DQotcHJvdGVjdGVkOg0KLSAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3NUYWdOYW1lOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCQltX0F0dHJpYnV0ZXM7DQotfTsNCi1jbGFzcyBDWEZBX1RleHRQYXJzZUNvbnRleHQgOiBwdWJsaWMgQ0ZYX1RhcmdldA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfVGV4dFBhcnNlQ29udGV4dCgpIDogbV9wcE1hdGNoZWREZWNscyhOVUxMKSwgbV9kd01hdGNoZWREZWNscygwKSwgbV9lRGlzcGxheShGREVfQ1NTRElTUExBWV9Ob25lKSwgbV9wUGFyZW50U3R5bGUoTlVMTCkge30NCi0gICAgfkNYRkFfVGV4dFBhcnNlQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIGlmIChtX3BwTWF0Y2hlZERlY2xzICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBGREVfRnJlZShtX3BwTWF0Y2hlZERlY2xzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB2b2lkCQkJCQkJU2V0RGlzcGxheShGREVfQ1NTRElTUExBWSBlRGlzcGxheSkNCi0gICAgew0KLSAgICAgICAgbV9lRGlzcGxheSA9IGVEaXNwbGF5Ow0KLSAgICB9DQotICAgIEZERV9DU1NESVNQTEFZCQkJCUdldERpc3BsYXkoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9lRGlzcGxheTsNCi0gICAgfQ0KLSAgICB2b2lkCQkJCQkJU2V0RGVjbHMoY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbiAqKnBwRGVjbEFycmF5LCBpbnQzMl90IGlEZWNsQ291bnQpOw0KLSAgICBjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uKioJR2V0RGVjbHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKiltX3BwTWF0Y2hlZERlY2xzOw0KLSAgICB9DQotICAgIEZYX0RXT1JECQkJCQlDb3VudERlY2xzKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZHdNYXRjaGVkRGVjbHM7DQotICAgIH0NCi0gICAgSUZERV9DU1NDb21wdXRlZFN0eWxlICoJCW1fcFBhcmVudFN0eWxlOw0KLXByb3RlY3RlZDoNCi0gICAgSUZERV9DU1NEZWNsYXJhdGlvbgkJKiptX3BwTWF0Y2hlZERlY2xzOw0KLSAgICBGWF9EV09SRAkJCQltX2R3TWF0Y2hlZERlY2xzIDogMjg7DQotICAgIEZERV9DU1NESVNQTEFZCQkJbV9lRGlzcGxheQkJIDogNDsNCi19Ow0KLWNsYXNzIENYRkFfVGV4dFBhcnNlcg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfVGV4dFBhcnNlcigpIDogbV9wQWxsb2NhdG9yKE5VTEwpLCBtX3BTZWxlY3RvcihOVUxMKSwgbV9wVUFTaGVldChOVUxMKSB7fQ0KLSAgICB2aXJ0dWFsIH5DWEZBX1RleHRQYXJzZXIoKTsNCi0gICAgdm9pZAkJCQkJCVJlc2V0KCk7DQotICAgIHZvaWQJCQkJCQlEb1BhcnNlKElGREVfWE1MTm9kZSAqcFhNTENvbnRhaW5lciwgSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIpOw0KLSAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqCQlDcmVhdGVSb290U3R5bGUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIpOw0KLSAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqCQlDb21wdXRlU3R5bGUoSUZERV9YTUxOb2RlICpwWE1MTm9kZSwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwUGFyZW50U3R5bGUpOw0KLSAgICBGWF9CT09MCQkJCQkJSXNQYXJzZWQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wQWxsb2NhdG9yICE9IE5VTEw7DQotICAgIH0NCitjbGFzcyBDWEZBX0NTU1RhZ1Byb3ZpZGVyIDogcHVibGljIElGREVfQ1NTVGFnUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX0NTU1RhZ1Byb3ZpZGVyKCkgOiBtX2JUYWdBdmlsaWFibGUoRkFMU0UpLCBtX2JDb250ZW50KEZBTFNFKSB7fQ0KKyAgdmlydHVhbCB+Q1hGQV9DU1NUYWdQcm92aWRlcigpOw0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZ0MgR2V0VGFnTmFtZSgpIHsgcmV0dXJuIG1fd3NUYWdOYW1lOyB9DQorICB2aXJ0dWFsIEZYX1BPU0lUSU9OIEdldEZpcnN0QXR0cmlidXRlKCkgew0KKyAgICByZXR1cm4gbV9BdHRyaWJ1dGVzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXROZXh0QXR0cmlidXRlKEZYX1BPU0lUSU9OJiBwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSk7DQorICB2b2lkIFNldFRhZ05hbWVPYmooY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSkgeyBtX3dzVGFnTmFtZSA9IHdzTmFtZTsgfQ0KKyAgdm9pZCBTZXRBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0ciwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKTsNCisgIEZYX0JPT0wgbV9iVGFnQXZpbGlhYmxlOw0KKyAgRlhfQk9PTCBtX2JDb250ZW50Ow0KIA0KLSAgICBpbnQzMl90CQkJCQlHZXRWQWxnaW4oSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIpIGNvbnN0Ow0KLSAgICBGWF9GTE9BVAkJCQkJR2V0VGFiSW50ZXJ2YWwoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0Ow0KLSAgICBpbnQzMl90CQkJCQlDb3VudFRhYnMoSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0Ow0KLSAgICBGWF9CT09MCQkJCQkJSXNTcGFjZVJ1bihJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkgY29uc3Q7DQotICAgIEZYX0JPT0wJCQkJCQlHZXRUYWJzdG9wcyhJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSwgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0CSpwVGFic3RvcENvbnRleHQpOw0KLSAgICBJRlhfRm9udCoJCQkJCUdldEZvbnQoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlKSBjb25zdDsNCi0gICAgRlhfRkxPQVQJCQkJCUdldEZvbnRTaXplKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkgY29uc3Q7DQotICAgIGludDMyX3QJCQkJCUdldEhvclNjYWxlKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSwgSUZERV9YTUxOb2RlICpwWE1MTm9kZSkgY29uc3Q7DQotICAgIGludDMyX3QJCQkJCUdldFZlclNjYWxlKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkgY29uc3Q7DQotICAgIHZvaWQJCQkJCQlHZXRVbmRlcmxpbmUoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlLCBpbnQzMl90ICZpVW5kZXJsaW5lLCBpbnQzMl90ICZpUGVyaW9kKSBjb25zdDsNCi0gICAgdm9pZAkJCQkJCUdldExpbmV0aHJvdWdoKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSwgaW50MzJfdCAmaUxpbmV0aHJvdWdoKSBjb25zdDsNCi0gICAgRlhfQVJHQgkJCQkJCUdldENvbG9yKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSkgY29uc3Q7DQotICAgIEZYX0ZMT0FUCQkJCQlHZXRCYXNlbGluZShJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpIGNvbnN0Ow0KLSAgICBGWF9GTE9BVAkJCQkJR2V0TGluZUhlaWdodChJWEZBX1RleHRQcm92aWRlciAqcFRleHRQcm92aWRlciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIEZYX0JPT0wgYkZpcnN0LCBGWF9GTE9BVCBmVmVyU2NhbGUpIGNvbnN0Ow0KLSAgICBGWF9CT09MCQkJCQkJR2V0RW1iYmVkT2JqKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyLCBJRkRFX1hNTE5vZGUgKnBYTUxOb2RlLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSk7DQotICAgIENYRkFfVGV4dFBhcnNlQ29udGV4dCoJCUdldFBhcnNlQ29udGV4dEZyb21NYXAoSUZERV9YTUxOb2RlICpwWE1MTm9kZSk7DQotcHJpdmF0ZToNCi0gICAgdm9pZAkJCQkJCUluaXRDU1NEYXRhKElYRkFfVGV4dFByb3ZpZGVyICpwVGV4dFByb3ZpZGVyKTsNCi0gICAgdm9pZAkJCQkJCVBhcnNlUmljaFRleHQoSUZERV9YTUxOb2RlICpwWE1MTm9kZSwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwUGFyZW50U3R5bGUpOw0KLSAgICB2b2lkCQkJCQkJUGFyc2VUYWdJbmZvKElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIENYRkFfQ1NTVGFnUHJvdmlkZXIgJnRhZ1Byb3ZpZGVyKTsNCi0gICAgSUZERV9DU1NTdHlsZVNoZWV0KgkJCUxvYWREZWZhdWx0U2hlZXRTdHlsZSgpOw0KLSAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqCQlDcmVhdGVTdHlsZShJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBQYXJlbnRTdHlsZSk7DQotICAgIElGWF9NRU1BbGxvY2F0b3IJCSptX3BBbGxvY2F0b3I7DQotICAgIElGREVfQ1NTU3R5bGVTZWxlY3RvcgkqbV9wU2VsZWN0b3I7DQotICAgIElGREVfQ1NTU3R5bGVTaGVldAkJKm1fcFVBU2hlZXQ7DQotICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxJRkRFX1hNTE5vZGUqLCBDWEZBX1RleHRQYXJzZUNvbnRleHQqPgltX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dDsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1RhZ05hbWU7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9BdHRyaWJ1dGVzOw0KIH07DQotY2xhc3MgQ1hGQV9Mb2FkZXJDb250ZXh0DQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9Mb2FkZXJDb250ZXh0KCkgOiBtX2JTYXZlTGluZUhlaWdodChGQUxTRSkNCi0gICAgICAgICwgbV9mV2lkdGgoMCkNCi0gICAgICAgICwgbV9mSGVpZ2h0KDApDQotICAgICAgICAsIG1fZkxhc3RQb3MoMCkNCi0gICAgICAgICwgbV9mU3RhcnRMaW5lT2Zmc2V0KDApDQotICAgICAgICAsIG1faUNoYXIoMCkNCi0gICAgICAgICwgbV9pVG90YWxMaW5lcygtMSkNCi0gICAgICAgICwgbV9wWE1MTm9kZShOVUxMKQ0KLSAgICAgICAgLCBtX3BOb2RlKE5VTEwpDQotICAgICAgICAsIG1fcFBhcmVudFN0eWxlKE5VTEwpDQotICAgICAgICAsIG1fZHdGbGFncygwKQ0KLSAgICB7fQ0KLSAgICBGWF9CT09MCQkJCW1fYlNhdmVMaW5lSGVpZ2h0Ow0KLSAgICBGWF9GTE9BVAkJCW1fZldpZHRoOw0KLSAgICBGWF9GTE9BVAkJCW1fZkhlaWdodDsNCi0gICAgRlhfRkxPQVQJCQltX2ZMYXN0UG9zOw0KLSAgICBGWF9GTE9BVAkJCW1fZlN0YXJ0TGluZU9mZnNldDsNCi0gICAgaW50MzJfdAkJCW1faUNoYXI7DQotICAgIGludDMyX3QJCQltX2lMaW5lczsNCi0gICAgaW50MzJfdAkJCW1faVRvdGFsTGluZXM7DQotICAgIElGREVfWE1MTm9kZQkJKm1fcFhNTE5vZGU7DQotICAgIENYRkFfTm9kZQkJCSptX3BOb2RlOw0KLSAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUJCSptX3BQYXJlbnRTdHlsZTsNCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+IG1fbGluZUhlaWdodHM7DQotICAgIEZYX0RXT1JECQkJbV9kd0ZsYWdzOw0KLSAgICBDRlhfRmxvYXRBcnJheQkJbV9CbG9ja3NIZWlnaHQ7DQotfTsNCi1jbGFzcyBDWEZBX0xpbmtVc2VyRGF0YSA6IHB1YmxpYyBJRlhfVW5rbm93biwgcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0xpbmtVc2VyRGF0YShJRlhfTUVNQWxsb2NhdG9yICpwQWxsb2NhdG9yLCBGWF9XQ0hBUiogcHN6VGV4dCkNCi0gICAgICAgIDogbV9wQWxsb2NhdG9yKHBBbGxvY2F0b3IpDQotICAgICAgICAsIG1fZHdSZWZDb3VudCgxKQ0KLSAgICB7DQotICAgICAgICBtX3BzelVSTENvbnRlbnQgPSBwc3pUZXh0Ow0KK2NsYXNzIENYRkFfVGV4dFBhcnNlQ29udGV4dCA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KCkNCisgICAgICA6IG1fcHBNYXRjaGVkRGVjbHMoTlVMTCksDQorICAgICAgICBtX2R3TWF0Y2hlZERlY2xzKDApLA0KKyAgICAgICAgbV9lRGlzcGxheShGREVfQ1NTRElTUExBWV9Ob25lKSwNCisgICAgICAgIG1fcFBhcmVudFN0eWxlKE5VTEwpIHt9DQorICB+Q1hGQV9UZXh0UGFyc2VDb250ZXh0KCkgew0KKyAgICBpZiAobV9wcE1hdGNoZWREZWNscyAhPSBOVUxMKSB7DQorICAgICAgRkRFX0ZyZWUobV9wcE1hdGNoZWREZWNscyk7DQogICAgIH0NCi0gICAgfkNYRkFfTGlua1VzZXJEYXRhKCkgeyB9DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJUmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIEZYX0RXT1JEIGR3UmVmQ291bnQgPSAtLW1fZHdSZWZDb3VudDsNCi0gICAgICAgIGlmIChkd1JlZkNvdW50IDw9IDApIHsNCi0gICAgICAgICAgICBGREVfRGVsZXRlV2l0aChDWEZBX0xpbmtVc2VyRGF0YSwgbV9wQWxsb2NhdG9yLCB0aGlzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBkd1JlZkNvdW50Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhfRFdPUkQJQWRkUmVmKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICsrbV9kd1JlZkNvdW50Ow0KLSAgICB9DQotcHVibGljOg0KLSAgICBjb25zdCBGWF9XQ0hBUiogR2V0TGlua1VSTCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BzelVSTENvbnRlbnQ7DQotICAgIH07DQotcHJvdGVjdGVkOg0KLSAgICBJRlhfTUVNQWxsb2NhdG9yCQkqbV9wQWxsb2NhdG9yOw0KLSAgICBGWF9EV09SRAkJCQltX2R3UmVmQ291bnQ7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJbV9wc3pVUkxDb250ZW50Ow0KLX07DQotY2xhc3MgQ1hGQV9UZXh0VXNlckRhdGEgOiBwdWJsaWMgSUZYX1Vua25vd24sIHB1YmxpYyBDRlhfVGFyZ2V0DQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9UZXh0VXNlckRhdGEoSUZYX01FTUFsbG9jYXRvciAqcEFsbG9jYXRvciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUpDQotICAgICAgICA6IG1fcFN0eWxlKHBTdHlsZSkNCi0gICAgICAgICwgbV9wQWxsb2NhdG9yKHBBbGxvY2F0b3IpDQotICAgICAgICAsIG1fZHdSZWZDb3VudCgwKQ0KLSAgICAgICAgLCBtX3BMaW5rRGF0YShOVUxMKQ0KLSAgICB7DQotICAgICAgICBGWFNZU19hc3NlcnQobV9wQWxsb2NhdG9yICE9IE5VTEwpOw0KLSAgICAgICAgaWYgKG1fcFN0eWxlICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBtX3BTdHlsZS0+QWRkUmVmKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgQ1hGQV9UZXh0VXNlckRhdGEoSUZYX01FTUFsbG9jYXRvciAqcEFsbG9jYXRvciwgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwU3R5bGUsIENYRkFfTGlua1VzZXJEYXRhKiBwTGlua0RhdGEpDQotICAgICAgICA6IG1fcFN0eWxlKHBTdHlsZSkNCi0gICAgICAgICwgbV9wQWxsb2NhdG9yKHBBbGxvY2F0b3IpDQotICAgICAgICAsIG1fZHdSZWZDb3VudCgwKQ0KLSAgICAgICAgLCBtX3BMaW5rRGF0YShwTGlua0RhdGEpDQotICAgIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChtX3BBbGxvY2F0b3IgIT0gTlVMTCk7DQotICAgICAgICBpZiAobV9wU3R5bGUgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIG1fcFN0eWxlLT5BZGRSZWYoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB+Q1hGQV9UZXh0VXNlckRhdGEoKQ0KLSAgICB7DQotICAgICAgICBpZiAobV9wU3R5bGUgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIG1fcFN0eWxlLT5SZWxlYXNlKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wTGlua0RhdGEgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIG1fcExpbmtEYXRhLT5SZWxlYXNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9EV09SRAlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgRlhfRFdPUkQgZHdSZWZDb3VudCA9IC0tbV9kd1JlZkNvdW50Ow0KLSAgICAgICAgaWYgKGR3UmVmQ291bnQgPT0gMCkgew0KLSAgICAgICAgICAgIEZERV9EZWxldGVXaXRoKENYRkFfVGV4dFVzZXJEYXRhLCBtX3BBbGxvY2F0b3IsIHRoaXMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGR3UmVmQ291bnQ7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9EV09SRAlBZGRSZWYoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKyttX2R3UmVmQ291bnQ7DQotICAgIH0NCisgIH0NCisgIHZvaWQgU2V0RGlzcGxheShGREVfQ1NTRElTUExBWSBlRGlzcGxheSkgeyBtX2VEaXNwbGF5ID0gZURpc3BsYXk7IH0NCisgIEZERV9DU1NESVNQTEFZIEdldERpc3BsYXkoKSBjb25zdCB7IHJldHVybiBtX2VEaXNwbGF5OyB9DQorICB2b2lkIFNldERlY2xzKGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKiBwcERlY2xBcnJheSwgaW50MzJfdCBpRGVjbENvdW50KTsNCisgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKiBHZXREZWNscygpIHsNCisgICAgcmV0dXJuIChjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uKiopbV9wcE1hdGNoZWREZWNsczsNCisgIH0NCisgIEZYX0RXT1JEIENvdW50RGVjbHMoKSBjb25zdCB7IHJldHVybiBtX2R3TWF0Y2hlZERlY2xzOyB9DQorICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIG1fcFBhcmVudFN0eWxlOw0KIA0KLSAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUJKm1fcFN0eWxlOw0KLSAgICBDWEZBX0xpbmtVc2VyRGF0YQkJKm1fcExpbmtEYXRhOw0KLXByb3RlY3RlZDoNCi0gICAgSUZYX01FTUFsbG9jYXRvcgkJCSptX3BBbGxvY2F0b3I7DQotICAgIEZYX0RXT1JECQkJCW1fZHdSZWZDb3VudDsNCisgcHJvdGVjdGVkOg0KKyAgSUZERV9DU1NEZWNsYXJhdGlvbioqIG1fcHBNYXRjaGVkRGVjbHM7DQorICBGWF9EV09SRCBtX2R3TWF0Y2hlZERlY2xzIDogMjg7DQorICBGREVfQ1NTRElTUExBWSBtX2VEaXNwbGF5IDogNDsNCit9Ow0KK2NsYXNzIENYRkFfVGV4dFBhcnNlciB7DQorIHB1YmxpYzoNCisgIENYRkFfVGV4dFBhcnNlcigpIDogbV9wQWxsb2NhdG9yKE5VTEwpLCBtX3BTZWxlY3RvcihOVUxMKSwgbV9wVUFTaGVldChOVUxMKSB7fQ0KKyAgdmlydHVhbCB+Q1hGQV9UZXh0UGFyc2VyKCk7DQorICB2b2lkIFJlc2V0KCk7DQorICB2b2lkIERvUGFyc2UoSUZERV9YTUxOb2RlKiBwWE1MQ29udGFpbmVyLCBJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcik7DQorICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENyZWF0ZVJvb3RTdHlsZShJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcik7DQorICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENvbXB1dGVTdHlsZShJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpOw0KKyAgRlhfQk9PTCBJc1BhcnNlZCgpIGNvbnN0IHsgcmV0dXJuIG1fcEFsbG9jYXRvciAhPSBOVUxMOyB9DQorDQorICBpbnQzMl90IEdldFZBbGdpbihJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcikgY29uc3Q7DQorICBGWF9GTE9BVCBHZXRUYWJJbnRlcnZhbChJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Q7DQorICBpbnQzMl90IENvdW50VGFicyhJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Q7DQorICBGWF9CT09MIElzU3BhY2VSdW4oSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0Ow0KKyAgRlhfQk9PTCBHZXRUYWJzdG9wcyhJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0KiBwVGFic3RvcENvbnRleHQpOw0KKyAgSUZYX0ZvbnQqIEdldEZvbnQoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Q7DQorICBGWF9GTE9BVCBHZXRGb250U2l6ZShJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdDsNCisgIGludDMyX3QgR2V0SG9yU2NhbGUoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlKSBjb25zdDsNCisgIGludDMyX3QgR2V0VmVyU2NhbGUoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdDsNCisgIHZvaWQgR2V0VW5kZXJsaW5lKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpVW5kZXJsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVBlcmlvZCkgY29uc3Q7DQorICB2b2lkIEdldExpbmV0aHJvdWdoKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUxpbmV0aHJvdWdoKSBjb25zdDsNCisgIEZYX0FSR0IgR2V0Q29sb3IoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdDsNCisgIEZYX0ZMT0FUIEdldEJhc2VsaW5lKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0Ow0KKyAgRlhfRkxPQVQgR2V0TGluZUhlaWdodChJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmVyU2NhbGUpIGNvbnN0Ow0KKyAgRlhfQk9PTCBHZXRFbWJiZWRPYmooSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpOw0KKyAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiBHZXRQYXJzZUNvbnRleHRGcm9tTWFwKElGREVfWE1MTm9kZSogcFhNTE5vZGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgdm9pZCBJbml0Q1NTRGF0YShJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcik7DQorICB2b2lkIFBhcnNlUmljaFRleHQoSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSk7DQorICB2b2lkIFBhcnNlVGFnSW5mbyhJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLCBDWEZBX0NTU1RhZ1Byb3ZpZGVyJiB0YWdQcm92aWRlcik7DQorICBJRkRFX0NTU1N0eWxlU2hlZXQqIExvYWREZWZhdWx0U2hlZXRTdHlsZSgpOw0KKyAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBDcmVhdGVTdHlsZShJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSk7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBtX3BBbGxvY2F0b3I7DQorICBJRkRFX0NTU1N0eWxlU2VsZWN0b3IqIG1fcFNlbGVjdG9yOw0KKyAgSUZERV9DU1NTdHlsZVNoZWV0KiBtX3BVQVNoZWV0Ow0KKyAgQ0ZYX01hcFB0clRlbXBsYXRlPElGREVfWE1MTm9kZSosIENYRkFfVGV4dFBhcnNlQ29udGV4dCo+DQorICAgICAgbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQ7DQorfTsNCitjbGFzcyBDWEZBX0xvYWRlckNvbnRleHQgew0KKyBwdWJsaWM6DQorICBDWEZBX0xvYWRlckNvbnRleHQoKQ0KKyAgICAgIDogbV9iU2F2ZUxpbmVIZWlnaHQoRkFMU0UpLA0KKyAgICAgICAgbV9mV2lkdGgoMCksDQorICAgICAgICBtX2ZIZWlnaHQoMCksDQorICAgICAgICBtX2ZMYXN0UG9zKDApLA0KKyAgICAgICAgbV9mU3RhcnRMaW5lT2Zmc2V0KDApLA0KKyAgICAgICAgbV9pQ2hhcigwKSwNCisgICAgICAgIG1faVRvdGFsTGluZXMoLTEpLA0KKyAgICAgICAgbV9wWE1MTm9kZShOVUxMKSwNCisgICAgICAgIG1fcE5vZGUoTlVMTCksDQorICAgICAgICBtX3BQYXJlbnRTdHlsZShOVUxMKSwNCisgICAgICAgIG1fZHdGbGFncygwKSB7fQ0KKyAgRlhfQk9PTCBtX2JTYXZlTGluZUhlaWdodDsNCisgIEZYX0ZMT0FUIG1fZldpZHRoOw0KKyAgRlhfRkxPQVQgbV9mSGVpZ2h0Ow0KKyAgRlhfRkxPQVQgbV9mTGFzdFBvczsNCisgIEZYX0ZMT0FUIG1fZlN0YXJ0TGluZU9mZnNldDsNCisgIGludDMyX3QgbV9pQ2hhcjsNCisgIGludDMyX3QgbV9pTGluZXM7DQorICBpbnQzMl90IG1faVRvdGFsTGluZXM7DQorICBJRkRFX1hNTE5vZGUqIG1fcFhNTE5vZGU7DQorICBDWEZBX05vZGUqIG1fcE5vZGU7DQorICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIG1fcFBhcmVudFN0eWxlOw0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+IG1fbGluZUhlaWdodHM7DQorICBGWF9EV09SRCBtX2R3RmxhZ3M7DQorICBDRlhfRmxvYXRBcnJheSBtX0Jsb2Nrc0hlaWdodDsNCit9Ow0KK2NsYXNzIENYRkFfTGlua1VzZXJEYXRhIDogcHVibGljIElGWF9Vbmtub3duLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENYRkFfTGlua1VzZXJEYXRhKElGWF9NRU1BbGxvY2F0b3IqIHBBbGxvY2F0b3IsIEZYX1dDSEFSKiBwc3pUZXh0KQ0KKyAgICAgIDogbV9wQWxsb2NhdG9yKHBBbGxvY2F0b3IpLCBtX2R3UmVmQ291bnQoMSkgew0KKyAgICBtX3BzelVSTENvbnRlbnQgPSBwc3pUZXh0Ow0KKyAgfQ0KKyAgfkNYRkFfTGlua1VzZXJEYXRhKCkge30NCisgIHZpcnR1YWwgRlhfRFdPUkQgUmVsZWFzZSgpIHsNCisgICAgRlhfRFdPUkQgZHdSZWZDb3VudCA9IC0tbV9kd1JlZkNvdW50Ow0KKyAgICBpZiAoZHdSZWZDb3VudCA8PSAwKSB7DQorICAgICAgRkRFX0RlbGV0ZVdpdGgoQ1hGQV9MaW5rVXNlckRhdGEsIG1fcEFsbG9jYXRvciwgdGhpcyk7DQorICAgIH0NCisgICAgcmV0dXJuIGR3UmVmQ291bnQ7DQorICB9DQorICB2aXJ0dWFsIEZYX0RXT1JEIEFkZFJlZigpIHsgcmV0dXJuICsrbV9kd1JlZkNvdW50OyB9DQorDQorIHB1YmxpYzoNCisgIGNvbnN0IEZYX1dDSEFSKiBHZXRMaW5rVVJMKCkgeyByZXR1cm4gbV9wc3pVUkxDb250ZW50OyB9Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRlhfTUVNQWxsb2NhdG9yKiBtX3BBbGxvY2F0b3I7DQorICBGWF9EV09SRCBtX2R3UmVmQ291bnQ7DQorICBDRlhfV2lkZVN0cmluZyBtX3BzelVSTENvbnRlbnQ7DQorfTsNCitjbGFzcyBDWEZBX1RleHRVc2VyRGF0YSA6IHB1YmxpYyBJRlhfVW5rbm93biwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDWEZBX1RleHRVc2VyRGF0YShJRlhfTUVNQWxsb2NhdG9yKiBwQWxsb2NhdG9yLCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkNCisgICAgICA6IG1fcFN0eWxlKHBTdHlsZSksDQorICAgICAgICBtX3BBbGxvY2F0b3IocEFsbG9jYXRvciksDQorICAgICAgICBtX2R3UmVmQ291bnQoMCksDQorICAgICAgICBtX3BMaW5rRGF0YShOVUxMKSB7DQorICAgIEZYU1lTX2Fzc2VydChtX3BBbGxvY2F0b3IgIT0gTlVMTCk7DQorICAgIGlmIChtX3BTdHlsZSAhPSBOVUxMKSB7DQorICAgICAgbV9wU3R5bGUtPkFkZFJlZigpOw0KKyAgICB9DQorICB9DQorICBDWEZBX1RleHRVc2VyRGF0YShJRlhfTUVNQWxsb2NhdG9yKiBwQWxsb2NhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICBDWEZBX0xpbmtVc2VyRGF0YSogcExpbmtEYXRhKQ0KKyAgICAgIDogbV9wU3R5bGUocFN0eWxlKSwNCisgICAgICAgIG1fcEFsbG9jYXRvcihwQWxsb2NhdG9yKSwNCisgICAgICAgIG1fZHdSZWZDb3VudCgwKSwNCisgICAgICAgIG1fcExpbmtEYXRhKHBMaW5rRGF0YSkgew0KKyAgICBGWFNZU19hc3NlcnQobV9wQWxsb2NhdG9yICE9IE5VTEwpOw0KKyAgICBpZiAobV9wU3R5bGUgIT0gTlVMTCkgew0KKyAgICAgIG1fcFN0eWxlLT5BZGRSZWYoKTsNCisgICAgfQ0KKyAgfQ0KKyAgfkNYRkFfVGV4dFVzZXJEYXRhKCkgew0KKyAgICBpZiAobV9wU3R5bGUgIT0gTlVMTCkgew0KKyAgICAgIG1fcFN0eWxlLT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgaWYgKG1fcExpbmtEYXRhICE9IE5VTEwpIHsNCisgICAgICBtX3BMaW5rRGF0YS0+UmVsZWFzZSgpOw0KKyAgICB9DQorICB9DQorICB2aXJ0dWFsIEZYX0RXT1JEIFJlbGVhc2UoKSB7DQorICAgIEZYX0RXT1JEIGR3UmVmQ291bnQgPSAtLW1fZHdSZWZDb3VudDsNCisgICAgaWYgKGR3UmVmQ291bnQgPT0gMCkgew0KKyAgICAgIEZERV9EZWxldGVXaXRoKENYRkFfVGV4dFVzZXJEYXRhLCBtX3BBbGxvY2F0b3IsIHRoaXMpOw0KKyAgICB9DQorICAgIHJldHVybiBkd1JlZkNvdW50Ow0KKyAgfQ0KKyAgdmlydHVhbCBGWF9EV09SRCBBZGRSZWYoKSB7IHJldHVybiArK21fZHdSZWZDb3VudDsgfQ0KKw0KKyAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBtX3BTdHlsZTsNCisgIENYRkFfTGlua1VzZXJEYXRhKiBtX3BMaW5rRGF0YTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZYX01FTUFsbG9jYXRvciogbV9wQWxsb2NhdG9yOw0KKyAgRlhfRFdPUkQgbV9kd1JlZkNvdW50Ow0KIH07DQogdHlwZWRlZiBzdHJ1Y3QgX1hGQV9URVhUUElFQ0UgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQotICAgIEZYX1dDSEFSKgkJcHN6VGV4dDsNCi0gICAgaW50MzJfdAkJaUNoYXJzOw0KLSAgICBpbnQzMl90CQkqcFdpZHRoczsNCi0gICAgaW50MzJfdAkJaUhvclNjYWxlOw0KLSAgICBpbnQzMl90CQlpVmVyU2NhbGU7DQotICAgIGludDMyX3QJCWlCaWRpTGV2ZWw7DQotICAgIGludDMyX3QJCWlVbmRlcmxpbmU7DQotICAgIGludDMyX3QJCWlQZXJpb2Q7DQotICAgIGludDMyX3QJCWlMaW5lVGhyb3VnaDsNCi0gICAgSUZYX0ZvbnQJCSpwRm9udDsNCi0gICAgRlhfQVJHQgkJCWR3Q29sb3I7DQotICAgIEZYX0ZMT0FUCQlmRm9udFNpemU7DQotICAgIENGWF9SZWN0RgkJcnRQaWVjZTsNCi0gICAgQ1hGQV9MaW5rVXNlckRhdGEqCXBMaW5rRGF0YTsNCisgIEZYX1dDSEFSKiBwc3pUZXh0Ow0KKyAgaW50MzJfdCBpQ2hhcnM7DQorICBpbnQzMl90KiBwV2lkdGhzOw0KKyAgaW50MzJfdCBpSG9yU2NhbGU7DQorICBpbnQzMl90IGlWZXJTY2FsZTsNCisgIGludDMyX3QgaUJpZGlMZXZlbDsNCisgIGludDMyX3QgaVVuZGVybGluZTsNCisgIGludDMyX3QgaVBlcmlvZDsNCisgIGludDMyX3QgaUxpbmVUaHJvdWdoOw0KKyAgSUZYX0ZvbnQqIHBGb250Ow0KKyAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgRlhfRkxPQVQgZkZvbnRTaXplOw0KKyAgQ0ZYX1JlY3RGIHJ0UGllY2U7DQorICBDWEZBX0xpbmtVc2VyRGF0YSogcExpbmtEYXRhOw0KIA0KLSAgICBfWEZBX1RFWFRQSUVDRSgpIDogcHN6VGV4dChOVUxMKSwgcEZvbnQoTlVMTCksIHBMaW5rRGF0YShOVUxMKQ0KLSAgICB7DQotICAgICAgICBwc3pUZXh0ID0gTlVMTDsNCisgIF9YRkFfVEVYVFBJRUNFKCkgOiBwc3pUZXh0KE5VTEwpLCBwRm9udChOVUxMKSwgcExpbmtEYXRhKE5VTEwpIHsNCisgICAgcHN6VGV4dCA9IE5VTEw7DQorICB9DQorICB+X1hGQV9URVhUUElFQ0UoKSB7DQorICAgIHBzelRleHQgPSBOVUxMOw0KKyAgICBpZiAoTlVMTCAhPSBwTGlua0RhdGEpIHsNCisgICAgICBwTGlua0RhdGEtPlJlbGVhc2UoKTsNCisgICAgICBwTGlua0RhdGEgPSBOVUxMOw0KICAgICB9DQotICAgIH5fWEZBX1RFWFRQSUVDRSgpDQotICAgIHsNCi0gICAgICAgIHBzelRleHQgPSBOVUxMOw0KLSAgICAgICAgaWYgKE5VTEwgIT0gcExpbmtEYXRhKSB7DQotICAgICAgICAgICAgcExpbmtEYXRhLT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgcExpbmtEYXRhID0gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0gWEZBX1RFWFRQSUVDRSwgKiBYRkFfTFBURVhUUElFQ0U7DQotdHlwZWRlZiBYRkFfVEVYVFBJRUNFIGNvbnN0ICogWEZBX0xQQ1RFWFRQSUVDRTsNCi10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPFhGQV9MUFRFWFRQSUVDRT4JQ1hGQV9QaWVjZUFycmF5Ow0KLWNsYXNzIENYRkFfUGllY2VMaW5lIDogcHVibGljIENGWF9UYXJnZXQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX1BpZWNlTGluZSgpIHt9DQotICAgIENYRkFfUGllY2VBcnJheQkJbV90ZXh0UGllY2VzOw0KLSAgICBDRlhfSW50MzJBcnJheQkJbV9jaGFyQ291bnRzOw0KKyAgfQ0KK30gWEZBX1RFWFRQSUVDRSwgKlhGQV9MUFRFWFRQSUVDRTsNCit0eXBlZGVmIFhGQV9URVhUUElFQ0UgY29uc3QqIFhGQV9MUENURVhUUElFQ0U7DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxYRkFfTFBURVhUUElFQ0U+IENYRkFfUGllY2VBcnJheTsNCitjbGFzcyBDWEZBX1BpZWNlTGluZSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9QaWVjZUxpbmUoKSB7fQ0KKyAgQ1hGQV9QaWVjZUFycmF5IG1fdGV4dFBpZWNlczsNCisgIENGWF9JbnQzMkFycmF5IG1fY2hhckNvdW50czsNCiB9Ow0KLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9QaWVjZUxpbmUqPglDWEZBX1BpZWNlTGluZUFycmF5Ow0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9QaWVjZUxpbmUqPiBDWEZBX1BpZWNlTGluZUFycmF5Ow0KIHN0cnVjdCBYRkFfVEFCU1RPUFMgew0KLSAgICBGWF9EV09SRCBkd0FsaWduOw0KLSAgICBGWF9GTE9BVCBmVGFic3RvcHM7DQorICBGWF9EV09SRCBkd0FsaWduOw0KKyAgRlhfRkxPQVQgZlRhYnN0b3BzOw0KIH07DQotY2xhc3MgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0DQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0KCkgOiBtX2lUYWJDb3VudCgwKSwgbV9pVGFiSW5kZXgoLTEpLCBtX2JUYWJzdG9wcyhGQUxTRSksIG1fZlRhYldpZHRoKDApLCBtX2ZMZWZ0KDApIHt9DQotICAgIHZvaWQgQXBwZW5kKEZYX0RXT1JEIGR3QWxpZ24sIEZYX0ZMT0FUIGZUYWJzdG9wcykNCi0gICAgew0KLSAgICAgICAgaW50MzJfdCBpID0gMDsNCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2lUYWJDb3VudDsgaSsrKSB7DQotICAgICAgICAgICAgWEZBX1RBQlNUT1BTICpwVGFic3RvcCA9IG1fdGFic3RvcHMuR2V0RGF0YVB0cihpKTsNCi0gICAgICAgICAgICBpZiAoZlRhYnN0b3BzIDwgcFRhYnN0b3AtPmZUYWJzdG9wcykgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBtX3RhYnN0b3BzLkluc2VydFNwYWNlQXQoaSwgMSk7DQotICAgICAgICBYRkFfVEFCU1RPUFMgdGFic3RvcDsNCi0gICAgICAgIHRhYnN0b3AuZHdBbGlnbgkJPSBkd0FsaWduOw0KLSAgICAgICAgdGFic3RvcC5mVGFic3RvcHMJPSBmVGFic3RvcHM7DQotICAgICAgICBtX3RhYnN0b3BzLlNldEF0KGksIHRhYnN0b3ApOw0KLSAgICAgICAgbV9pVGFiQ291bnQrKzsNCitjbGFzcyBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQgew0KKyBwdWJsaWM6DQorICBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQoKQ0KKyAgICAgIDogbV9pVGFiQ291bnQoMCksDQorICAgICAgICBtX2lUYWJJbmRleCgtMSksDQorICAgICAgICBtX2JUYWJzdG9wcyhGQUxTRSksDQorICAgICAgICBtX2ZUYWJXaWR0aCgwKSwNCisgICAgICAgIG1fZkxlZnQoMCkge30NCisgIHZvaWQgQXBwZW5kKEZYX0RXT1JEIGR3QWxpZ24sIEZYX0ZMT0FUIGZUYWJzdG9wcykgew0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbV9pVGFiQ291bnQ7IGkrKykgew0KKyAgICAgIFhGQV9UQUJTVE9QUyogcFRhYnN0b3AgPSBtX3RhYnN0b3BzLkdldERhdGFQdHIoaSk7DQorICAgICAgaWYgKGZUYWJzdG9wcyA8IHBUYWJzdG9wLT5mVGFic3RvcHMpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICB2b2lkIFJlbW92ZUFsbCgpDQotICAgIHsNCi0gICAgICAgIG1fdGFic3RvcHMuUmVtb3ZlQWxsKCk7DQotICAgICAgICBtX2lUYWJDb3VudCA9IDA7DQotICAgIH0NCi0gICAgdm9pZCBSZXNldCgpDQotICAgIHsNCi0gICAgICAgIG1faVRhYkluZGV4ID0gLTE7DQotICAgICAgICBtX2JUYWJzdG9wcyA9IEZBTFNFOw0KLSAgICAgICAgbV9mVGFiV2lkdGggPSAwOw0KLSAgICAgICAgbV9mTGVmdCA9IDA7DQotICAgIH0NCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8WEZBX1RBQlNUT1BTPgkJbV90YWJzdG9wczsNCi0gICAgaW50MzJfdAkJbV9pVGFiQ291bnQ7DQotICAgIGludDMyX3QJCW1faVRhYkluZGV4Ow0KLSAgICBGWF9CT09MCQkJbV9iVGFic3RvcHM7DQotICAgIEZYX0ZMT0FUCQltX2ZUYWJXaWR0aDsNCi0gICAgRlhfRkxPQVQJCW1fZkxlZnQ7DQorICAgIG1fdGFic3RvcHMuSW5zZXJ0U3BhY2VBdChpLCAxKTsNCisgICAgWEZBX1RBQlNUT1BTIHRhYnN0b3A7DQorICAgIHRhYnN0b3AuZHdBbGlnbiA9IGR3QWxpZ247DQorICAgIHRhYnN0b3AuZlRhYnN0b3BzID0gZlRhYnN0b3BzOw0KKyAgICBtX3RhYnN0b3BzLlNldEF0KGksIHRhYnN0b3ApOw0KKyAgICBtX2lUYWJDb3VudCsrOw0KKyAgfQ0KKyAgdm9pZCBSZW1vdmVBbGwoKSB7DQorICAgIG1fdGFic3RvcHMuUmVtb3ZlQWxsKCk7DQorICAgIG1faVRhYkNvdW50ID0gMDsNCisgIH0NCisgIHZvaWQgUmVzZXQoKSB7DQorICAgIG1faVRhYkluZGV4ID0gLTE7DQorICAgIG1fYlRhYnN0b3BzID0gRkFMU0U7DQorICAgIG1fZlRhYldpZHRoID0gMDsNCisgICAgbV9mTGVmdCA9IDA7DQorICB9DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxYRkFfVEFCU1RPUFM+IG1fdGFic3RvcHM7DQorICBpbnQzMl90IG1faVRhYkNvdW50Ow0KKyAgaW50MzJfdCBtX2lUYWJJbmRleDsNCisgIEZYX0JPT0wgbV9iVGFic3RvcHM7DQorICBGWF9GTE9BVCBtX2ZUYWJXaWR0aDsNCisgIEZYX0ZMT0FUIG1fZkxlZnQ7DQogfTsNCi1jbGFzcyBDWEZBX1RleHRMYXlvdXQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX1RleHRMYXlvdXQoSVhGQV9UZXh0UHJvdmlkZXIgKnBUZXh0UHJvdmlkZXIpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX1RleHRMYXlvdXQoKTsNCi0gICAgaW50MzJfdAkJCUdldFRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCk7DQotICAgIEZYX0ZMT0FUCQkJR2V0TGF5b3V0SGVpZ2h0KCk7DQotICAgIEZYX0ZMT0FUCQkJU3RhcnRMYXlvdXQoRlhfRkxPQVQgZldpZHRoID0gLTEpOw0KLSAgICBGWF9CT09MCQkJCURvTGF5b3V0KGludDMyX3QgaUJsb2NrSW5kZXgsIEZYX0ZMT0FUICZmQ2FsY0hlaWdodCwgRlhfRkxPQVQgZkNvbnRlbnRBcmVhSGVpZ2h0ID0gLTEsIEZYX0ZMT0FUIGZUZXh0SGVpZ2h0ID0gLTEpOw0KK2NsYXNzIENYRkFfVGV4dExheW91dCB7DQorIHB1YmxpYzoNCisgIENYRkFfVGV4dExheW91dChJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcik7DQorICB2aXJ0dWFsIH5DWEZBX1RleHRMYXlvdXQoKTsNCisgIGludDMyX3QgR2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIEZYX0ZMT0FUIEdldExheW91dEhlaWdodCgpOw0KKyAgRlhfRkxPQVQgU3RhcnRMYXlvdXQoRlhfRkxPQVQgZldpZHRoID0gLTEpOw0KKyAgRlhfQk9PTCBEb0xheW91dChpbnQzMl90IGlCbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50QXJlYUhlaWdodCA9IC0xLA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGV4dEhlaWdodCA9IC0xKTsNCiANCi0gICAgRlhfQk9PTAkJCQlDYWxjU2l6ZShjb25zdCBDRlhfU2l6ZUYgJm1pblNpemUsIGNvbnN0IENGWF9TaXplRiAmbWF4U2l6ZSwgQ0ZYX1NpemVGICZkZWZhdWx0U2l6ZSk7DQotICAgIEZYX0JPT0wJCQkJTGF5b3V0KGNvbnN0IENGWF9TaXplRiAmc2l6ZSwgRlhfRkxPQVQqIGZIZWlnaHQgPSBOVUxMKTsNCi0gICAgdm9pZAkJCQlJdGVtQmxvY2tzKGNvbnN0IENGWF9SZWN0RiYgcnRUZXh0LCBpbnQzMl90IGlCbG9ja0luZGV4KTsNCi0gICAgRlhfQk9PTAkJCQlEcmF3U3RyaW5nKENGWF9SZW5kZXJEZXZpY2UgKnBGeERldmljZSwgY29uc3QgQ0ZYX01hdHJpeCAmdG1Eb2MyRGV2aWNlLCBjb25zdCBDRlhfUmVjdEYgJnJ0Q2xpcCwgaW50MzJfdCBpQmxvY2sgPSAwKTsNCisgIEZYX0JPT0wgQ2FsY1NpemUoY29uc3QgQ0ZYX1NpemVGJiBtaW5TaXplLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIG1heFNpemUsDQorICAgICAgICAgICAgICAgICAgIENGWF9TaXplRiYgZGVmYXVsdFNpemUpOw0KKyAgRlhfQk9PTCBMYXlvdXQoY29uc3QgQ0ZYX1NpemVGJiBzaXplLCBGWF9GTE9BVCogZkhlaWdodCA9IE5VTEwpOw0KKyAgdm9pZCBJdGVtQmxvY2tzKGNvbnN0IENGWF9SZWN0RiYgcnRUZXh0LCBpbnQzMl90IGlCbG9ja0luZGV4KTsNCisgIEZYX0JPT0wgRHJhd1N0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRnhEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrID0gMCk7DQogDQotICAgIEZYX0JPT0wJCQkJSXNMb2FkZWQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9waWVjZUxpbmVzLkdldFNpemUoKSA+IDA7DQotICAgIH0NCi0gICAgdm9pZAkJCQlVbmxvYWQoKTsNCi0gICAgY29uc3QgQ1hGQV9QaWVjZUxpbmVBcnJheSoJR2V0UGllY2VMaW5lcygpOw0KLXByaXZhdGU6DQotICAgIHZvaWQJCQkJR2V0VGV4dERhdGFOb2RlKCk7DQotICAgIElGREVfWE1MTm9kZSoJCUdldFhNTENvbnRhaW5lck5vZGUoKTsNCi0gICAgSUZYX1JURkJyZWFrKgkJQ3JlYXRlQnJlYWsoRlhfQk9PTCBiRGVmYXVsdCk7DQotICAgIHZvaWQJCQkJSW5pdEJyZWFrKEZYX0ZMT0FUIGZMaW5lV2lkdGgpOw0KLSAgICB2b2lkCQkJCUluaXRCcmVhayhJRkRFX0NTU0NvbXB1dGVkU3R5bGUgKnBTdHlsZSwgRkRFX0NTU0RJU1BMQVkgZURpc3BsYXksIEZYX0ZMT0FUIGZMaW5lV2lkdGgsIElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFBhcmVudFN0eWxlID0gTlVMTCk7DQotICAgIEZYX0JPT0wJCQkJTG9hZGVyKGNvbnN0IENGWF9TaXplRiAmc3pUZXh0LCBGWF9GTE9BVCAmZkxpbmVQb3MsIEZYX0JPT0wgYlNhdmVQaWVjZXMgPSBUUlVFKTsNCisgIEZYX0JPT0wgSXNMb2FkZWQoKSBjb25zdCB7IHJldHVybiBtX3BpZWNlTGluZXMuR2V0U2l6ZSgpID4gMDsgfQ0KKyAgdm9pZCBVbmxvYWQoKTsNCisgIGNvbnN0IENYRkFfUGllY2VMaW5lQXJyYXkqIEdldFBpZWNlTGluZXMoKTsNCiANCi0gICAgdm9pZAkJCQlMb2FkVGV4dChDWEZBX05vZGUgKnBOb2RlLCBjb25zdCBDRlhfU2l6ZUYgJnN6VGV4dCwgRlhfRkxPQVQgJmZMaW5lUG9zLCBGWF9CT09MIGJTYXZlUGllY2VzKTsNCi0gICAgRlhfQk9PTAkJCQlMb2FkUmljaFRleHQoSUZERV9YTUxOb2RlICpwWE1MTm9kZSwgY29uc3QgQ0ZYX1NpemVGICZzelRleHQsIEZYX0ZMT0FUICZmTGluZVBvcywgSUZERV9DU1NDb21wdXRlZFN0eWxlICpwUGFyZW50U3R5bGUsIEZYX0JPT0wgYlNhdmVQaWVjZXMsIENYRkFfTGlua1VzZXJEYXRhKiBwTGlua0RhdGEgPSBOVUxMLCBGWF9CT09MIGJFbmRCcmVhayA9IFRSVUUsIEZYX0JPT0wgYklzT2wgPSBGQUxTRSwgaW50MzJfdCBpTGlDb3VudCA9IDApOw0KKyBwcml2YXRlOg0KKyAgdm9pZCBHZXRUZXh0RGF0YU5vZGUoKTsNCisgIElGREVfWE1MTm9kZSogR2V0WE1MQ29udGFpbmVyTm9kZSgpOw0KKyAgSUZYX1JURkJyZWFrKiBDcmVhdGVCcmVhayhGWF9CT09MIGJEZWZhdWx0KTsNCisgIHZvaWQgSW5pdEJyZWFrKEZYX0ZMT0FUIGZMaW5lV2lkdGgpOw0KKyAgdm9pZCBJbml0QnJlYWsoSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICBGREVfQ1NTRElTUExBWSBlRGlzcGxheSwNCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGgsDQorICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUgPSBOVUxMKTsNCisgIEZYX0JPT0wgTG9hZGVyKGNvbnN0IENGWF9TaXplRiYgc3pUZXh0LA0KKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVBpZWNlcyA9IFRSVUUpOw0KIA0KLSAgICBGWF9CT09MCQkJCUFwcGVuZENoYXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCwgRlhfRkxPQVQgJmZMaW5lUG9zLCAgRlhfRkxPQVQgZlNwYWNlQWJvdmUsIEZYX0JPT0wgYlNhdmVQaWVjZXMpOw0KKyAgdm9pZCBMb2FkVGV4dChDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIHN6VGV4dCwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlUGllY2VzKTsNCisgIEZYX0JPT0wgTG9hZFJpY2hUZXh0KElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIHN6VGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTGluZVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVBpZWNlcywNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGlua1VzZXJEYXRhKiBwTGlua0RhdGEgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5kQnJlYWsgPSBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNPbCA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGlDb3VudCA9IDApOw0KIA0KLSAgICB2b2lkCQkJCUFwcGVuZFRleHRMaW5lKEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9GTE9BVCAmZkxpbmVQb3MsIEZYX0JPT0wgYlNhdmVQaWVjZXMsIEZYX0JPT0wgYkVuZEJyZWFrID0gRkFMU0UpOw0KLSAgICB2b2lkCQkJCUVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzLCBGWF9GTE9BVCAmZkxpbmVQb3MsIEZYX0JPT0wgYkRlZmF1bHQpOw0KLSAgICBGWF9CT09MCQkJCUlzRW5kKEZYX0JPT0wgYlNhdmVQaWVjZXMpOw0KKyAgRlhfQk9PTCBBcHBlbmRDaGFyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGFjZUFib3ZlLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVQaWVjZXMpOw0KIA0KLSAgICB2b2lkCQkJCVByb2Nlc3NUZXh0KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpOw0KLSAgICB2b2lkCQkJCVVwZGF0ZUFsaWduKEZYX0ZMT0FUIGZIZWlnaHQsIEZYX0ZMT0FUIGZCb3R0b20pOw0KKyAgdm9pZCBBcHBlbmRUZXh0TGluZShGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlUGllY2VzLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmRCcmVhayA9IEZBTFNFKTsNCisgIHZvaWQgRW5kQnJlYWsoRlhfRFdPUkQgZHdTdGF0dXMsIEZYX0ZMT0FUJiBmTGluZVBvcywgRlhfQk9PTCBiRGVmYXVsdCk7DQorICBGWF9CT09MIElzRW5kKEZYX0JPT0wgYlNhdmVQaWVjZXMpOw0KIA0KLSAgICB2b2lkCQkJCVJlbmRlclN0cmluZyhJRkRFX1JlbmRlckRldmljZSAqcERldmljZSwgSUZERV9Tb2xpZEJydXNoICpwQnJ1c2gsIENYRkFfUGllY2VMaW5lICpwUGllY2VMaW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQaWVjZSwgRlhURVhUX0NIQVJQT1MgKnBDaGFyUG9zLCBjb25zdCBDRlhfTWF0cml4ICZ0bURvYzJEZXZpY2UpOw0KLSAgICB2b2lkCQkJCVJlbmRlclBhdGgoSUZERV9SZW5kZXJEZXZpY2UgKnBEZXZpY2UsIElGREVfUGVuICpwUGVuLCBDWEZBX1BpZWNlTGluZSAqcFBpZWNlTGluZSwgaW50MzJfdCBpUGllY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyAqcENoYXJQb3MsIGNvbnN0IENGWF9NYXRyaXggJnRtRG9jMkRldmljZSk7DQorICB2b2lkIFByb2Nlc3NUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdm9pZCBVcGRhdGVBbGlnbihGWF9GTE9BVCBmSGVpZ2h0LCBGWF9GTE9BVCBmQm90dG9tKTsNCiANCi0gICAgaW50MzJfdAkJCUdldERpc3BsYXlQb3MoWEZBX0xQQ1RFWFRQSUVDRSBwUGllY2UsIEZYVEVYVF9DSEFSUE9TICpwQ2hhclBvcywgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQotICAgIEZYX0JPT0wJCQkJVG9SdW4oWEZBX0xQQ1RFWFRQSUVDRSBwUGllY2UsIEZYX1JURlRFWFRPQkogJnRyKTsNCisgIHZvaWQgUmVuZGVyU3RyaW5nKElGREVfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9Tb2xpZEJydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBpZWNlLA0KKyAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKTsNCisgIHZvaWQgUmVuZGVyUGF0aChJRkRFX1JlbmRlckRldmljZSogcERldmljZSwNCisgICAgICAgICAgICAgICAgICBJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQaWVjZSwNCisgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKTsNCiANCi0gICAgdm9pZAkJCQlEb1RhYnN0b3BzKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSAqcFN0eWxlLCBDWEZBX1BpZWNlTGluZSAqcFBpZWNlTGluZSk7DQotICAgIEZYX0JPT0wJCQkJTGF5b3V0KGludDMyX3QgaUJsb2NrKTsNCi0gICAgaW50MzJfdAkJCUNvdW50QmxvY2tzKCkgY29uc3Q7DQotICAgIElYRkFfVGV4dFByb3ZpZGVyCSptX3BUZXh0UHJvdmlkZXI7DQotICAgIENYRkFfTm9kZQkJCSptX3BUZXh0RGF0YU5vZGU7DQotICAgIEZYX0JPT0wJCQkJbV9iUmljaFRleHQ7DQotICAgIElGWF9NRU1BbGxvY2F0b3IJKm1fcEFsbG9jYXRvcjsNCi0gICAgSUZYX1JURkJyZWFrCQkqbV9wQnJlYWs7DQotICAgIEZYX0RXT1JECQkJbV9kd1RleHREYXRhOw0KKyAgaW50MzJfdCBHZXREaXNwbGF5UG9zKFhGQV9MUENURVhUUElFQ0UgcFBpZWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCisgIEZYX0JPT0wgVG9SdW4oWEZBX0xQQ1RFWFRQSUVDRSBwUGllY2UsIEZYX1JURlRFWFRPQkomIHRyKTsNCiANCi0gICAgQ1hGQV9Mb2FkZXJDb250ZXh0CSptX3BMb2FkZXI7DQotICAgIGludDMyX3QJCQltX2lMaW5lczsNCi0gICAgRlhfRkxPQVQJCQltX2ZNYXhXaWR0aDsNCisgIHZvaWQgRG9UYWJzdG9wcyhJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwgQ1hGQV9QaWVjZUxpbmUqIHBQaWVjZUxpbmUpOw0KKyAgRlhfQk9PTCBMYXlvdXQoaW50MzJfdCBpQmxvY2spOw0KKyAgaW50MzJfdCBDb3VudEJsb2NrcygpIGNvbnN0Ow0KKyAgSVhGQV9UZXh0UHJvdmlkZXIqIG1fcFRleHRQcm92aWRlcjsNCisgIENYRkFfTm9kZSogbV9wVGV4dERhdGFOb2RlOw0KKyAgRlhfQk9PTCBtX2JSaWNoVGV4dDsNCisgIElGWF9NRU1BbGxvY2F0b3IqIG1fcEFsbG9jYXRvcjsNCisgIElGWF9SVEZCcmVhayogbV9wQnJlYWs7DQorICBGWF9EV09SRCBtX2R3VGV4dERhdGE7DQogDQotICAgIENYRkFfVGV4dFBhcnNlcgkJbV90ZXh0UGFyc2VyOw0KLSAgICBDWEZBX1BpZWNlTGluZUFycmF5CW1fcGllY2VMaW5lczsNCi0gICAgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0CSptX3BUYWJzdG9wQ29udGV4dDsNCi0gICAgRlhfQk9PTAkJCQltX2JCbG9ja0NvbnRpbnVlOw0KLXB1YmxpYzoNCi0gICAgRlhfQk9PTAkJCQltX2JIYXNCbG9jazsNCi0gICAgQ0ZYX0ludDMyQXJyYXkJCW1fQmxvY2tzOw0KKyAgQ1hGQV9Mb2FkZXJDb250ZXh0KiBtX3BMb2FkZXI7DQorICBpbnQzMl90IG1faUxpbmVzOw0KKyAgRlhfRkxPQVQgbV9mTWF4V2lkdGg7DQorDQorICBDWEZBX1RleHRQYXJzZXIgbV90ZXh0UGFyc2VyOw0KKyAgQ1hGQV9QaWVjZUxpbmVBcnJheSBtX3BpZWNlTGluZXM7DQorICBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQqIG1fcFRhYnN0b3BDb250ZXh0Ow0KKyAgRlhfQk9PTCBtX2JCbG9ja0NvbnRpbnVlOw0KKw0KKyBwdWJsaWM6DQorICBGWF9CT09MIG1fYkhhc0Jsb2NrOw0KKyAgQ0ZYX0ludDMyQXJyYXkgbV9CbG9ja3M7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi9meGZhX2xvY2FsZXZhbHVlLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi9meGZhX2xvY2FsZXZhbHVlLmgKaW5kZXggYzljZWM1Ny4uMzgxNDY5YiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24vZnhmYV9sb2NhbGV2YWx1ZS5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL2Z4ZmFfbG9jYWxldmFsdWUuaApAQCAtOSw3MyArOSw5OCBAQAogY2xhc3MgSUZYX0xvY2FsZTsNCiBjbGFzcyBDRlhfVW5pdGltZTsNCiBjbGFzcyBDWEZBX0xvY2FsZU1ncjsNCi0jZGVmaW5lCVhGQV9WVF9OVUxMCQkJCQkwDQotI2RlZmluZSBYRkFfVlRfQk9PTEVBTgkJCQkxDQotI2RlZmluZSBYRkFfVlRfSU5URUdFUgkJCQkyDQotI2RlZmluZSBYRkFfVlRfREVDSU1BTAkJCQk0DQotI2RlZmluZSBYRkFfVlRfRkxPQVQJCQkJOA0KLSNkZWZpbmUgWEZBX1ZUX1RFWFQJCQkJCTE2DQotI2RlZmluZSBYRkFfVlRfREFURQkJCQkJMzINCi0jZGVmaW5lIFhGQV9WVF9USU1FCQkJCQk2NA0KLSNkZWZpbmUgWEZBX1ZUX0RBVEVUSU1FCQkJCTEyOA0KLWNsYXNzIENYRkFfTG9jYWxlVmFsdWUNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0xvY2FsZVZhbHVlKCk7DQotICAgIENYRkFfTG9jYWxlVmFsdWUoY29uc3QgQ1hGQV9Mb2NhbGVWYWx1ZSYgdmFsdWUpOw0KLSAgICBDWEZBX0xvY2FsZVZhbHVlKEZYX0RXT1JEIGR3VHlwZSwgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IpOw0KLSAgICBDWEZBX0xvY2FsZVZhbHVlKEZYX0RXT1JEIGR3VHlwZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKTsNCi0gICAgQ1hGQV9Mb2NhbGVWYWx1ZShGWF9EV09SRCBkd1R5cGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSwgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IpOw0KLSAgICB+Q1hGQV9Mb2NhbGVWYWx1ZSgpOw0KLSAgICBDWEZBX0xvY2FsZVZhbHVlJiBvcGVyYXRvciA9IChjb25zdCBDWEZBX0xvY2FsZVZhbHVlJiB2YWx1ZSk7DQorI2RlZmluZSBYRkFfVlRfTlVMTCAwDQorI2RlZmluZSBYRkFfVlRfQk9PTEVBTiAxDQorI2RlZmluZSBYRkFfVlRfSU5URUdFUiAyDQorI2RlZmluZSBYRkFfVlRfREVDSU1BTCA0DQorI2RlZmluZSBYRkFfVlRfRkxPQVQgOA0KKyNkZWZpbmUgWEZBX1ZUX1RFWFQgMTYNCisjZGVmaW5lIFhGQV9WVF9EQVRFIDMyDQorI2RlZmluZSBYRkFfVlRfVElNRSA2NA0KKyNkZWZpbmUgWEZBX1ZUX0RBVEVUSU1FIDEyOA0KK2NsYXNzIENYRkFfTG9jYWxlVmFsdWUgew0KKyBwdWJsaWM6DQorICBDWEZBX0xvY2FsZVZhbHVlKCk7DQorICBDWEZBX0xvY2FsZVZhbHVlKGNvbnN0IENYRkFfTG9jYWxlVmFsdWUmIHZhbHVlKTsNCisgIENYRkFfTG9jYWxlVmFsdWUoRlhfRFdPUkQgZHdUeXBlLCBDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncik7DQorICBDWEZBX0xvY2FsZVZhbHVlKEZYX0RXT1JEIGR3VHlwZSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKTsNCisgIENYRkFfTG9jYWxlVmFsdWUoRlhfRFdPUkQgZHdUeXBlLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncik7DQorICB+Q1hGQV9Mb2NhbGVWYWx1ZSgpOw0KKyAgQ1hGQV9Mb2NhbGVWYWx1ZSYgb3BlcmF0b3I9KGNvbnN0IENYRkFfTG9jYWxlVmFsdWUmIHZhbHVlKTsNCiANCi0gICAgRlhfQk9PTAlWYWxpZGF0ZVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBJRlhfTG9jYWxlKiBwTG9jYWxlLCBDRlhfV2lkZVN0cmluZyogcE1hdGNoRm9ybWF0ICA9IE5VTEwpOw0KLSAgICBGWF9CT09MCUZvcm1hdFBhdHRlcm5zKENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlLCBYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUpIGNvbnN0Ow0KLSAgICBGWF9CT09MCUZvcm1hdFNpbmdsZVBhdHRlcm4oQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzdWx0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsIElGWF9Mb2NhbGUqIHBMb2NhbGUsIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgY29uc3Q7DQotICAgIEZYX0JPT0wJVmFsaWRhdGVDYW5vbmljYWxWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgRlhfRFdPUkQgZHdWVHlwZSk7DQotICAgIEZYX0JPT0wJVmFsaWRhdGVDYW5vbmljYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsIENGWF9Vbml0aW1lJiB1bkRhdGUpOw0KLSAgICBGWF9CT09MCVZhbGlkYXRlQ2Fub25pY2FsVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lKTsNCi0gICAgRlhfQk9PTAlWYWxpZGF0ZUNhbm9uaWNhbERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lKTsNCi0gICAgdm9pZAlHZXROdW1iZXJpY0Zvcm1hdChDRlhfV2lkZVN0cmluZyAmd3NGb3JtYXQsIGludDMyX3QgbkludExlbiwgaW50MzJfdCBuRGVjTGVuLCBGWF9CT09MIGJTaWduID0gVFJVRSk7DQotICAgIEZYX0JPT0wJVmFsaWRhdGVOdW1lcmljVGVtcChDRlhfV2lkZVN0cmluZyYgd3NOdW1lcmljLCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMLCBpbnQzMl90KiBwb3MgPSBOVUxMKTsNCisgIEZYX0JPT0wgVmFsaWRhdGVWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBNYXRjaEZvcm1hdCA9IE5VTEwpOw0KKyAgRlhfQk9PTCBGb3JtYXRQYXR0ZXJucyhDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKSBjb25zdDsNCisgIEZYX0JPT0wgRm9ybWF0U2luZ2xlUGF0dGVybihDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKSBjb25zdDsNCisgIEZYX0JPT0wgVmFsaWRhdGVDYW5vbmljYWxWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1ZUeXBlKTsNCisgIEZYX0JPT0wgVmFsaWRhdGVDYW5vbmljYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfVW5pdGltZSYgdW5EYXRlKTsNCisgIEZYX0JPT0wgVmFsaWRhdGVDYW5vbmljYWxUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWUpOw0KKyAgRlhfQk9PTCBWYWxpZGF0ZUNhbm9uaWNhbERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lKTsNCisgIHZvaWQgR2V0TnVtYmVyaWNGb3JtYXQoQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbnRMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkRlY0xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2lnbiA9IFRSVUUpOw0KKyAgRlhfQk9PTCBWYWxpZGF0ZU51bWVyaWNUZW1wKENGWF9XaWRlU3RyaW5nJiB3c051bWVyaWMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBvcyA9IE5VTEwpOw0KIA0KLSAgICBDRlhfV2lkZVN0cmluZwkJR2V0VmFsdWUoKSBjb25zdDsNCi0gICAgRlhfRFdPUkQJCQlHZXRUeXBlKCkgY29uc3Q7DQotICAgIHZvaWQJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIEZYX0RXT1JEIGR3VHlwZSk7DQotICAgIENGWF9XaWRlU3RyaW5nCQlHZXRUZXh0KCkgY29uc3Q7DQotICAgIEZYX0ZMT0FUCQkJR2V0TnVtKCkgY29uc3Q7DQotICAgIEZYX0RPVUJMRQkJCUdldERvdWJsZU51bSgpIGNvbnN0Ow0KLSAgICBDRlhfVW5pdGltZQkJCUdldERhdGUoKSBjb25zdDsNCi0gICAgQ0ZYX1VuaXRpbWUJCQlHZXRUaW1lKCkgY29uc3Q7DQotICAgIENGWF9Vbml0aW1lCQkJR2V0RGF0ZVRpbWUoKSBjb25zdDsNCi0gICAgRlhfQk9PTAkJCQlTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KLSAgICBGWF9CT09MCQkJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlKTsNCi0gICAgRlhfQk9PTAkJCQlTZXROdW0oRlhfRkxPQVQgZk51bSk7DQotICAgIEZYX0JPT0wJCQkJU2V0TnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlKTsNCi0gICAgRlhfQk9PTAkJCQlTZXREYXRlKGNvbnN0IENGWF9Vbml0aW1lJiBkKTsNCi0gICAgRlhfQk9PTAkJCQlTZXREYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSk7DQotICAgIEZYX0JPT0wJCQkJU2V0VGltZShjb25zdCBDRlhfVW5pdGltZSYgdCk7DQotICAgIEZYX0JPT0wJCQkJU2V0VGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsIElGWF9Mb2NhbGUqIHBMb2NhbGUpOw0KLSAgICBGWF9CT09MCQkJCVNldERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCk7DQotICAgIEZYX0JPT0wJCQkJU2V0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVRpbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSk7DQotICAgIGlubGluZSBGWF9CT09MCQlJc051bGwoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9kd1R5cGUgPT0gWEZBX1ZUX05VTEw7DQotICAgIH0NCi0gICAgaW5saW5lIEZYX0JPT0wJCUlzRW1wdHkoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV93c1ZhbHVlLklzRW1wdHkoKTsNCi0gICAgfQ0KLSAgICBpbmxpbmUgRlhfQk9PTAkJSXNWYWxpZCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2JWYWxpZDsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgRlhfQk9PTAkJCQlQYXJzZVBhdHRlcm5WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgSUZYX0xvY2FsZSogcExvY2FsZSk7DQotICAgIENYRkFfTG9jYWxlTWdyKgkJbV9wTG9jYWxlTWdyOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJbV93c1ZhbHVlOw0KLSAgICBGWF9EV09SRAkJCW1fZHdUeXBlOw0KLSAgICBGWF9CT09MCQkJCW1fYlZhbGlkOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VmFsdWUoKSBjb25zdDsNCisgIEZYX0RXT1JEIEdldFR5cGUoKSBjb25zdDsNCisgIHZvaWQgU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIEZYX0RXT1JEIGR3VHlwZSk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7DQorICBGWF9GTE9BVCBHZXROdW0oKSBjb25zdDsNCisgIEZYX0RPVUJMRSBHZXREb3VibGVOdW0oKSBjb25zdDsNCisgIENGWF9Vbml0aW1lIEdldERhdGUoKSBjb25zdDsNCisgIENGWF9Vbml0aW1lIEdldFRpbWUoKSBjb25zdDsNCisgIENGWF9Vbml0aW1lIEdldERhdGVUaW1lKCkgY29uc3Q7DQorICBGWF9CT09MIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBGWF9CT09MIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSk7DQorICBGWF9CT09MIFNldE51bShGWF9GTE9BVCBmTnVtKTsNCisgIEZYX0JPT0wgU2V0TnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c051bSwNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpOw0KKyAgRlhfQk9PTCBTZXREYXRlKGNvbnN0IENGWF9Vbml0aW1lJiBkKTsNCisgIEZYX0JPT0wgU2V0RGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKTsNCisgIEZYX0JPT0wgU2V0VGltZShjb25zdCBDRlhfVW5pdGltZSYgdCk7DQorICBGWF9CT09MIFNldFRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZSwNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSk7DQorICBGWF9CT09MIFNldERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCk7DQorICBGWF9CT09MIFNldERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpOw0KKyAgaW5saW5lIEZYX0JPT0wgSXNOdWxsKCkgY29uc3QgeyByZXR1cm4gbV9kd1R5cGUgPT0gWEZBX1ZUX05VTEw7IH0NCisgIGlubGluZSBGWF9CT09MIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX3dzVmFsdWUuSXNFbXB0eSgpOyB9DQorICBpbmxpbmUgRlhfQk9PTCBJc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9iVmFsaWQ7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBQYXJzZVBhdHRlcm5WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSk7DQorICBDWEZBX0xvY2FsZU1nciogbV9wTG9jYWxlTWdyOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1ZhbHVlOw0KKyAgRlhfRFdPUkQgbV9kd1R5cGU7DQorICBGWF9CT09MIG1fYlZhbGlkOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2RhdGEuaCBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgKaW5kZXggYjcwOWZjZS4uN2IwYTljNCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2RhdGEuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oCkBAIC03LDIzICs3LDI1IEBACiAjaWZuZGVmIF9YRkFfRE9DREFUQV9IDQogI2RlZmluZSBfWEZBX0RPQ0RBVEFfSA0KIGVudW0gWEZBX0RBVEFGT1JNQVQgew0KLSAgICBYRkFfREFUQUZPUk1BVF9YRFAsDQorICBYRkFfREFUQUZPUk1BVF9YRFAsDQogfTsNCi1jbGFzcyBJWEZBX1BhY2tldEV4cG9ydA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJWEZBX1BhY2tldEV4cG9ydCoJQ3JlYXRlKENYRkFfRG9jdW1lbnQgKnBEb2N1bWVudCwgWEZBX0RBVEFGT1JNQVQgZUZvcm1hdCA9IFhGQV9EQVRBRk9STUFUX1hEUCk7DQotICAgIHZpcnR1YWwgfklYRkFfUGFja2V0RXhwb3J0KCkge30NCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlFeHBvcnQoSUZYX0ZpbGVXcml0ZSAqcFdyaXRlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlFeHBvcnQoSUZYX0ZpbGVXcml0ZSAqcFdyaXRlLCBDWEZBX05vZGUgKnBOb2RlLCBGWF9EV09SRCBkd0ZsYWcgPSAwLCBjb25zdCBGWF9DSEFSKiBwQ2hlY2tzdW0gPSBOVUxMKSA9IDA7DQorY2xhc3MgSVhGQV9QYWNrZXRFeHBvcnQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSVhGQV9QYWNrZXRFeHBvcnQqIENyZWF0ZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfREFUQUZPUk1BVCBlRm9ybWF0ID0gWEZBX0RBVEFGT1JNQVRfWERQKTsNCisgIHZpcnR1YWwgfklYRkFfUGFja2V0RXhwb3J0KCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEV4cG9ydChJRlhfRmlsZVdyaXRlKiBwV3JpdGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBFeHBvcnQoSUZYX0ZpbGVXcml0ZSogcFdyaXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBwQ2hlY2tzdW0gPSBOVUxMKSA9IDA7DQogfTsNCi1jbGFzcyBJWEZBX1BhY2tldEltcG9ydA0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBJWEZBX1BhY2tldEltcG9ydCoJQ3JlYXRlKENYRkFfRG9jdW1lbnQgKnBEc3REb2MpOw0KLSAgICB2aXJ0dWFsIH5JWEZBX1BhY2tldEltcG9ydCgpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSW1wb3J0RGF0YShJRlhfRmlsZVJlYWQqIHBEYXRhRG9jdW1lbnQpID0gMDsNCitjbGFzcyBJWEZBX1BhY2tldEltcG9ydCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJWEZBX1BhY2tldEltcG9ydCogQ3JlYXRlKENYRkFfRG9jdW1lbnQqIHBEc3REb2MpOw0KKyAgdmlydHVhbCB+SVhGQV9QYWNrZXRJbXBvcnQoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSW1wb3J0RGF0YShJRlhfRmlsZVJlYWQqIHBEYXRhRG9jdW1lbnQpID0gMDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaAppbmRleCA3OGM1OGExLi41ODhlNzhkIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oCkBAIC05LDEwMCArOSw5MiBAQAogI2RlZmluZSBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KIGNsYXNzIENYRkFfTGF5b3V0SXRlbTsNCiBjbGFzcyBJWEZBX0xheW91dFBhZ2U7DQotY2xhc3MgQ1hGQV9MYXlvdXRJdGVtDQotew0KLXB1YmxpYzoNCi0gICAgSVhGQV9MYXlvdXRQYWdlKglHZXRQYWdlKCkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCQlHZXRGb3JtTm9kZSgpIGNvbnN0Ow0KLSAgICB2b2lkCQkJCUdldFJlY3QoQ0ZYX1JlY3RGICZydExheW91dCwgRlhfQk9PTCBiUmVsYXRpdmUgPSBGQUxTRSkgY29uc3Q7DQotICAgIGludDMyX3QJCQlHZXRJbmRleCgpIGNvbnN0Ow0KLSAgICBpbnQzMl90CQkJR2V0Q291bnQoKSBjb25zdDsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtKglHZXRQYXJlbnQoKSBjb25zdDsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtKglHZXRGaXJzdCgpIGNvbnN0Ow0KLSAgICBDWEZBX0xheW91dEl0ZW0qCUdldFByZXYoKSBjb25zdDsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtKglHZXROZXh0KCkgY29uc3Q7DQotICAgIENYRkFfTGF5b3V0SXRlbSoJR2V0TGFzdCgpIGNvbnN0Ow0KK2NsYXNzIENYRkFfTGF5b3V0SXRlbSB7DQorIHB1YmxpYzoNCisgIElYRkFfTGF5b3V0UGFnZSogR2V0UGFnZSgpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBHZXRGb3JtTm9kZSgpIGNvbnN0Ow0KKyAgdm9pZCBHZXRSZWN0KENGWF9SZWN0RiYgcnRMYXlvdXQsIEZYX0JPT0wgYlJlbGF0aXZlID0gRkFMU0UpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXRJbmRleCgpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXRDb3VudCgpIGNvbnN0Ow0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBHZXRQYXJlbnQoKSBjb25zdDsNCisgIENYRkFfTGF5b3V0SXRlbSogR2V0Rmlyc3QoKSBjb25zdDsNCisgIENYRkFfTGF5b3V0SXRlbSogR2V0UHJldigpIGNvbnN0Ow0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBHZXROZXh0KCkgY29uc3Q7DQorICBDWEZBX0xheW91dEl0ZW0qIEdldExhc3QoKSBjb25zdDsNCiB9Ow0KLWNsYXNzIENYRkFfTGF5b3V0SXRlbUltcGwNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0xheW91dEl0ZW1JbXBsKENYRkFfTm9kZSAqcE5vZGUsIEZYX0JPT0wgYklzQ29udGVudExheW91dEl0ZW0pOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0xheW91dEl0ZW1JbXBsKCk7DQotICAgIEZYX0JPT0wgSXNDb250ZW50TGF5b3V0SXRlbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2JJc0NvbnRlbnRMYXlvdXRJdGVtOw0KLSAgICB9DQotICAgIHZvaWQJQWRkQ2hpbGQoQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcENoaWxkSXRlbSk7DQotICAgIHZvaWQJQWRkSGVhZENoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwgKnBDaGlsZEl0ZW0pOw0KLSAgICB2b2lkCVJlbW92ZUNoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwgKnBDaGlsZEl0ZW0pOw0KLSAgICB2b2lkCUluc2VydENoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwgKnBCZWZvcmVJdGVtLCBDWEZBX0xheW91dEl0ZW1JbXBsICpwQ2hpbGRJdGVtKTsNCi1wdWJsaWM6DQotICAgIENYRkFfTm9kZSoJCQkJbV9wRm9ybU5vZGU7DQotICAgIENYRkFfTGF5b3V0SXRlbUltcGwqCW1fcFBhcmVudDsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCoJbV9wTmV4dFNpYmxpbmc7DQotICAgIENYRkFfTGF5b3V0SXRlbUltcGwqCW1fcEZpcnN0Q2hpbGQ7DQotICAgIEZYX0JPT0wJCQkJCW1fYklzQ29udGVudExheW91dEl0ZW07DQotfTsNCi1jbGFzcyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsIDogcHVibGljIENYRkFfTGF5b3V0SXRlbUltcGwNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKENYRkFfTm9kZSAqcE5vZGUpOw0KLXB1YmxpYzoNCi0gICAgQ1hGQV9Ob2RlKgkJCSBtX3BPbGRTdWJmb3JtOw0KLX07DQotI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX0FjY2VzcwkJCQkJMHg4MDAwMDAwMA0KLSNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19EaXNhYmxlZAkJCQkweDQwMDAwMDAwDQotI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX1JlY3RDYWNoZWQJCQkJMHgyMDAwMDAwMA0KLSNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19CdXR0b25Eb3duCQkJCTB4MTAwMDAwMDANCi0jZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfSGlnaGxpZ2h0CQkJCTB4MDgwMDAwMDANCi0jZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfVGV4dEVkaXRWYWx1ZUNoYW5nZWQJMHgwNDAwMDAwMA0KLWNsYXNzIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsIDogcHVibGljIENYRkFfTGF5b3V0SXRlbUltcGwNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbChDWEZBX05vZGUgKnBOb2RlKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwoKTsNCi1wdWJsaWM6DQotICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBtX3BQcmV2Ow0KLSAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogbV9wTmV4dDsNCi0gICAgQ0ZYX1BvaW50RgkJbV9zUG9zOw0KLSAgICBDRlhfU2l6ZUYJCW1fc1NpemU7DQotICAgIEZYX0RXT1JECQltX2R3U3RhdHVzOw0KLX07DQotY2xhc3MgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0xheW91dEl0ZW0NCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgaW5saW5lIENYRkFfTGF5b3V0SXRlbSogR2V0Rmlyc3RDaGlsZChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopKChDWEZBX0xheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbSktPm1fcEZpcnN0Q2hpbGQ7DQotICAgIH0NCi0gICAgc3RhdGljIGlubGluZSBDWEZBX0xheW91dEl0ZW0qIEdldE5leHRTaWJsaW5nKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKikoKENYRkFfTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtKS0+bV9wTmV4dFNpYmxpbmc7DQotICAgIH0NCi0gICAgc3RhdGljIGlubGluZSBDWEZBX0xheW91dEl0ZW0qIEdldFBhcmVudChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopKChDWEZBX0xheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbSktPm1fcFBhcmVudDsNCi0gICAgfQ0KLX07DQotY2xhc3MgSVhGQV9MYXlvdXRQYWdlDQotew0KLXB1YmxpYzoNCi0gICAgSVhGQV9Eb2NMYXlvdXQqCQlHZXRMYXlvdXQoKSBjb25zdDsNCi0gICAgaW50MzJfdAkJCUdldFBhZ2VJbmRleCgpIGNvbnN0Ow0KLSAgICB2b2lkCQkJCUdldFBhZ2VTaXplKENGWF9TaXplRiAmc2l6ZSk7DQotICAgIENYRkFfTm9kZSoJCQlHZXRNYXN0ZXJQYWdlKCkgY29uc3Q7DQotfTsNCi1jbGFzcyBJWEZBX0RvY0xheW91dA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklYRkFfRG9jTGF5b3V0KCkge30NCi0gICAgdmlydHVhbCBDWEZBX0RvY3VtZW50KgkJR2V0RG9jdW1lbnQoKSBjb25zdCA9IDA7DQotICAgIHZpcnR1YWwJaW50MzJfdAkJCVN0YXJ0TGF5b3V0KEZYX0JPT0wgYkZvcmNlUmVzdGFydCA9IEZBTFNFKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCURvTGF5b3V0KElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSW5jcmVtZW50TGF5b3V0KCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlDb3VudFBhZ2VzKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElYRkFfTGF5b3V0UGFnZSoJR2V0UGFnZShpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7DQorY2xhc3MgQ1hGQV9MYXlvdXRJdGVtSW1wbCB7DQorIHB1YmxpYzoNCisgIENYRkFfTGF5b3V0SXRlbUltcGwoQ1hGQV9Ob2RlKiBwTm9kZSwgRlhfQk9PTCBiSXNDb250ZW50TGF5b3V0SXRlbSk7DQorICB2aXJ0dWFsIH5DWEZBX0xheW91dEl0ZW1JbXBsKCk7DQorICBGWF9CT09MIElzQ29udGVudExheW91dEl0ZW0oKSB7IHJldHVybiBtX2JJc0NvbnRlbnRMYXlvdXRJdGVtOyB9DQorICB2b2lkIEFkZENoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwqIHBDaGlsZEl0ZW0pOw0KKyAgdm9pZCBBZGRIZWFkQ2hpbGQoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSk7DQorICB2b2lkIFJlbW92ZUNoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwqIHBDaGlsZEl0ZW0pOw0KKyAgdm9pZCBJbnNlcnRDaGlsZChDWEZBX0xheW91dEl0ZW1JbXBsKiBwQmVmb3JlSXRlbSwNCisgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSk7DQogDQotICAgIHZpcnR1YWwgQ1hGQV9MYXlvdXRJdGVtKglHZXRMYXlvdXRJdGVtKENYRkFfTm9kZSAqcEZvcm1JdGVtKSA9IDA7DQorIHB1YmxpYzoNCisgIENYRkFfTm9kZSogbV9wRm9ybU5vZGU7DQorICBDWEZBX0xheW91dEl0ZW1JbXBsKiBtX3BQYXJlbnQ7DQorICBDWEZBX0xheW91dEl0ZW1JbXBsKiBtX3BOZXh0U2libGluZzsNCisgIENYRkFfTGF5b3V0SXRlbUltcGwqIG1fcEZpcnN0Q2hpbGQ7DQorICBGWF9CT09MIG1fYklzQ29udGVudExheW91dEl0ZW07DQorfTsNCitjbGFzcyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsIDogcHVibGljIENYRkFfTGF5b3V0SXRlbUltcGwgew0KKyBwdWJsaWM6DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKENYRkFfTm9kZSogcE5vZGUpOw0KKw0KKyBwdWJsaWM6DQorICBDWEZBX05vZGUqIG1fcE9sZFN1YmZvcm07DQorfTsNCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfQWNjZXNzIDB4ODAwMDAwMDANCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfRGlzYWJsZWQgMHg0MDAwMDAwMA0KKyNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19SZWN0Q2FjaGVkIDB4MjAwMDAwMDANCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfQnV0dG9uRG93biAweDEwMDAwMDAwDQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX0hpZ2hsaWdodCAweDA4MDAwMDAwDQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX1RleHRFZGl0VmFsdWVDaGFuZ2VkIDB4MDQwMDAwMDANCitjbGFzcyBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCA6IHB1YmxpYyBDWEZBX0xheW91dEl0ZW1JbXBsIHsNCisgcHVibGljOg0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2aXJ0dWFsIH5DWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCgpOw0KKw0KKyBwdWJsaWM6DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogbV9wUHJldjsNCisgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBtX3BOZXh0Ow0KKyAgQ0ZYX1BvaW50RiBtX3NQb3M7DQorICBDRlhfU2l6ZUYgbV9zU2l6ZTsNCisgIEZYX0RXT1JEIG1fZHdTdGF0dXM7DQorfTsNCitjbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfTGF5b3V0SXRlbSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9MYXlvdXRJdGVtKiBHZXRGaXJzdENoaWxkKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsNCisgICAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKSgoQ1hGQV9MYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0pLT5tX3BGaXJzdENoaWxkOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBDWEZBX0xheW91dEl0ZW0qIEdldE5leHRTaWJsaW5nKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsNCisgICAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKSgoQ1hGQV9MYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0pDQorICAgICAgICAtPm1fcE5leHRTaWJsaW5nOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBDWEZBX0xheW91dEl0ZW0qIEdldFBhcmVudChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7DQorICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKikoKENYRkFfTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtKS0+bV9wUGFyZW50Ow0KKyAgfQ0KK307DQorY2xhc3MgSVhGQV9MYXlvdXRQYWdlIHsNCisgcHVibGljOg0KKyAgSVhGQV9Eb2NMYXlvdXQqIEdldExheW91dCgpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXRQYWdlSW5kZXgoKSBjb25zdDsNCisgIHZvaWQgR2V0UGFnZVNpemUoQ0ZYX1NpemVGJiBzaXplKTsNCisgIENYRkFfTm9kZSogR2V0TWFzdGVyUGFnZSgpIGNvbnN0Ow0KK307DQorY2xhc3MgSVhGQV9Eb2NMYXlvdXQgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JWEZBX0RvY0xheW91dCgpIHt9DQorICB2aXJ0dWFsIENYRkFfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFN0YXJ0TGF5b3V0KEZYX0JPT0wgYkZvcmNlUmVzdGFydCA9IEZBTFNFKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgRG9MYXlvdXQoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSW5jcmVtZW50TGF5b3V0KCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50UGFnZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElYRkFfTGF5b3V0UGFnZSogR2V0UGFnZShpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7DQorDQorICB2aXJ0dWFsIENYRkFfTGF5b3V0SXRlbSogR2V0TGF5b3V0SXRlbShDWEZBX05vZGUqIHBGb3JtSXRlbSkgPSAwOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaAppbmRleCA0N2NmOThlLi5mZTE5ZWEwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaApAQCAtMTgsMTYyICsxOCwxNzkgQEAKIGNsYXNzIElYRkFfT2JqRmFjdG9yeTsNCiBjbGFzcyBDWEZBX0RvY3VtZW50Ow0KIGVudW0gWEZBX1ZFUlNJT04gew0KLSAgICBYRkFfVkVSU0lPTl9VTktOT1dOID0gMCwNCi0gICAgWEZBX1ZFUlNJT05fMjAwID0gMjAwLA0KLSAgICBYRkFfVkVSU0lPTl8yMDIgPSAyMDIsDQotICAgIFhGQV9WRVJTSU9OXzIwNCA9IDIwNCwNCi0gICAgWEZBX1ZFUlNJT05fMjA1ID0gMjA1LA0KLSAgICBYRkFfVkVSU0lPTl8yMDYgPSAyMDYsDQotICAgIFhGQV9WRVJTSU9OXzIwNyA9IDIwNywNCi0gICAgWEZBX1ZFUlNJT05fMjA4ID0gMjA4LA0KLSAgICBYRkFfVkVSU0lPTl8zMDAgPSAzMDAsDQotICAgIFhGQV9WRVJTSU9OXzMwMSA9IDMwMSwNCi0gICAgWEZBX1ZFUlNJT05fMzAzID0gMzAzLA0KLSAgICBYRkFfVkVSU0lPTl8zMDYgPSAzMDYsDQotICAgIFhGQV9WRVJTSU9OX0RFRkFVTFQgPSBYRkFfVkVSU0lPTl8zMDMsDQotICAgIFhGQV9WRVJTSU9OX01JTiAgICAgPSAyMDAsDQotICAgIFhGQV9WRVJTSU9OX01BWCAgICAgPSA0MDAsDQorICBYRkFfVkVSU0lPTl9VTktOT1dOID0gMCwNCisgIFhGQV9WRVJTSU9OXzIwMCA9IDIwMCwNCisgIFhGQV9WRVJTSU9OXzIwMiA9IDIwMiwNCisgIFhGQV9WRVJTSU9OXzIwNCA9IDIwNCwNCisgIFhGQV9WRVJTSU9OXzIwNSA9IDIwNSwNCisgIFhGQV9WRVJTSU9OXzIwNiA9IDIwNiwNCisgIFhGQV9WRVJTSU9OXzIwNyA9IDIwNywNCisgIFhGQV9WRVJTSU9OXzIwOCA9IDIwOCwNCisgIFhGQV9WRVJTSU9OXzMwMCA9IDMwMCwNCisgIFhGQV9WRVJTSU9OXzMwMSA9IDMwMSwNCisgIFhGQV9WRVJTSU9OXzMwMyA9IDMwMywNCisgIFhGQV9WRVJTSU9OXzMwNiA9IDMwNiwNCisgIFhGQV9WRVJTSU9OX0RFRkFVTFQgPSBYRkFfVkVSU0lPTl8zMDMsDQorICBYRkFfVkVSU0lPTl9NSU4gPSAyMDAsDQorICBYRkFfVkVSU0lPTl9NQVggPSA0MDAsDQogfTsNCi0jZGVmaW5lIFhGQV9MQVlPVVRTVEFUVVNfVmlzaWJsZQkweDAwMDENCi0jZGVmaW5lIFhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGUJMHgwMDEwDQotI2RlZmluZSBYRkFfTEFZT1VUU1RBVFVTX1ByaW50YWJsZQkweDAwMjANCisjZGVmaW5lIFhGQV9MQVlPVVRTVEFUVVNfVmlzaWJsZSAweDAwMDENCisjZGVmaW5lIFhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGUgMHgwMDEwDQorI2RlZmluZSBYRkFfTEFZT1VUU1RBVFVTX1ByaW50YWJsZSAweDAwMjANCiBlbnVtIFhGQV9OT0RFRVZFTlQgew0KLSAgICBYRkFfTk9ERUVWRU5UX1JlYWR5LA0KLSAgICBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdpbmcsDQotICAgIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLA0KLSAgICBYRkFfTk9ERUVWRU5UX0NoaWxkQWRkZWQsDQotICAgIFhGQV9OT0RFRVZFTlRfQ2hpbGRSZW1vdmVkLA0KKyAgWEZBX05PREVFVkVOVF9SZWFkeSwNCisgIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2luZywNCisgIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLA0KKyAgWEZBX05PREVFVkVOVF9DaGlsZEFkZGVkLA0KKyAgWEZBX05PREVFVkVOVF9DaGlsZFJlbW92ZWQsDQogfTsNCiBlbnVtIFhGQV9QQUdFRVZFTlQgew0KLSAgICBYRkFfUEFHRUVWRU5UX1BhZ2VBZGRlZCwNCi0gICAgWEZBX1BBR0VFVkVOVF9QYWdlUmVtb3ZlZCwNCisgIFhGQV9QQUdFRVZFTlRfUGFnZUFkZGVkLA0KKyAgWEZBX1BBR0VFVkVOVF9QYWdlUmVtb3ZlZCwNCiB9Ow0KIGVudW0gWEZBX0xBWU9VVEVWRU5UIHsNCi0gICAgWEZBX0xBWU9VVEVWRU5UX0l0ZW1BZGRlZCwNCi0gICAgWEZBX0xBWU9VVEVWRU5UX0l0ZW1SZW1vdmluZywNCi0gICAgWEZBX0xBWU9VVEVWRU5UX1JlY3RDaGFuZ2VkLA0KLSAgICBYRkFfTEFZT1VURVZFTlRfU3RhdHVzQ2hhbmdlZCwNCisgIFhGQV9MQVlPVVRFVkVOVF9JdGVtQWRkZWQsDQorICBYRkFfTEFZT1VURVZFTlRfSXRlbVJlbW92aW5nLA0KKyAgWEZBX0xBWU9VVEVWRU5UX1JlY3RDaGFuZ2VkLA0KKyAgWEZBX0xBWU9VVEVWRU5UX1N0YXR1c0NoYW5nZWQsDQogfTsNCiBlbnVtIFhGQV9MQVlPVVRSRVNVTFQgew0KLSAgICBYRkFfTEFZT1VUUkVTVUxUX0NvbnRpbnVlLA0KLSAgICBYRkFfTEFZT1VUUkVTVUxUX0RvbmUsDQotICAgIFhGQV9MQVlPVVRSRVNVTFRfTmV4dENvbnRlbnQsDQorICBYRkFfTEFZT1VUUkVTVUxUX0NvbnRpbnVlLA0KKyAgWEZBX0xBWU9VVFJFU1VMVF9Eb25lLA0KKyAgWEZBX0xBWU9VVFJFU1VMVF9OZXh0Q29udGVudCwNCiB9Ow0KLSNkZWZpbmUgWEZBX0xBWU9VVE5PVElGWV9TdHJpY3RIZWlnaHQJMHgwMDAxDQotI2RlZmluZSBYRkFfTEFZT1VUTk9USUZZX05vUGFyZW50QnJlYWsJMHgwMDAyDQotY2xhc3MgSVhGQV9Ob3RpZnkNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIH5JWEZBX05vdGlmeSgpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJCQlPblBhZ2VFdmVudChJWEZBX0xheW91dFBhZ2UgKnBTZW5kZXIsIFhGQV9QQUdFRVZFTlQgZUV2ZW50LCB2b2lkKiBwUGFyYW0gPSBOVUxMKSA9IDA7DQorI2RlZmluZSBYRkFfTEFZT1VUTk9USUZZX1N0cmljdEhlaWdodCAweDAwMDENCisjZGVmaW5lIFhGQV9MQVlPVVROT1RJRllfTm9QYXJlbnRCcmVhayAweDAwMDINCitjbGFzcyBJWEZBX05vdGlmeSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfTm90aWZ5KCkge30NCisgIHZpcnR1YWwgdm9pZCBPblBhZ2VFdmVudChJWEZBX0xheW91dFBhZ2UqIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BBR0VFVkVOVCBlRXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtID0gTlVMTCkgPSAwOw0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJT25Ob2RlRXZlbnQoQ1hGQV9Ob2RlICpwU2VuZGVyLCBYRkFfTk9ERUVWRU5UIGVFdmVudCwgdm9pZCogcFBhcmFtID0gTlVMTCwgdm9pZCogcFBhcmFtMiA9IE5VTEwsIHZvaWQqIHBQYXJhbTMgPSBOVUxMLCB2b2lkKiBwUGFyYW00ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCSAgICAgICAgT25XaWRnZXREYXRhRXZlbnQoQ1hGQV9XaWRnZXREYXRhKiBwU2VuZGVyLCBGWF9EV09SRCBkd0V2ZW50LCB2b2lkKiBwUGFyYW0gPSBOVUxMLCB2b2lkKiBwQWRkaXRpb25hbCA9IE5VTEwsIHZvaWQqIHBBZGRpdGlvbmFsMiA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPbk5vZGVFdmVudChDWEZBX05vZGUqIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVFVkVOVCBlRXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0zID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW00ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIE9uV2lkZ2V0RGF0YUV2ZW50KENYRkFfV2lkZ2V0RGF0YSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0V2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEFkZGl0aW9uYWwgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBBZGRpdGlvbmFsMiA9IE5VTEwpID0gMDsNCiANCi0gICAgdmlydHVhbCBDWEZBX0xheW91dEl0ZW0qCU9uQ3JlYXRlTGF5b3V0SXRlbShDWEZBX05vZGUgKnBOb2RlKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlPbkxheW91dEV2ZW50KElYRkFfRG9jTGF5b3V0ICpwTGF5b3V0LCBDWEZBX0xheW91dEl0ZW0gKnBTZW5kZXIsIFhGQV9MQVlPVVRFVkVOVCBlRXZlbnQsIHZvaWQqIHBQYXJhbSA9IE5VTEwsIHZvaWQqIHBQYXJhbTIgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlTdGFydEZpZWxkRHJhd0xheW91dChDWEZBX05vZGUgKnBJdGVtLCBGWF9GTE9BVCAmZkNhbGNXaWR0aCwgRlhfRkxPQVQgJmZDYWxjSGVpZ2h0KSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGaW5kU3BsaXRQb3MoQ1hGQV9Ob2RlICpwSXRlbSwgaW50MzJfdCBpQmxvY2tJbmRleCwgRlhfRkxPQVQgJmZDYWxjSGVpZ2h0UG9zKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0LCBDWEZBX05vZGUqIHBGb3JtSXRlbSkgPSAwOw0KLSAgICB2aXJ0dWFsCWludDMyX3QJCQlFeGVjRXZlbnRCeURlZXBGaXJzdChDWEZBX05vZGUqIHBGb3JtTm9kZSwgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlLCBGWF9CT09MIGJJc0Zvcm1SZWFkeSA9IEZBTFNFLCBGWF9CT09MIGJSZWN1cnNpdmUgPSBUUlVFLCBDWEZBX1dpZGdldEFjYyogcEV4Y2x1ZGUgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlBZGRDYWxjVmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KLSAgICB2aXJ0dWFsIElYRkFfRG9jKgkJCUdldEhET0MoKSA9IDA7DQotICAgIHZpcnR1YWwgSVhGQV9Eb2NQcm92aWRlcioJR2V0RG9jUHJvdmlkZXIoKSA9IDA7DQotICAgIHZpcnR1YWwgSVhGQV9BcHBQcm92aWRlcioJR2V0QXBwUHJvdmlkZXIoKSA9IDA7DQotICAgIHZpcnR1YWwgSVhGQV9XaWRnZXRIYW5kbGVyKglHZXRXaWRnZXRIYW5kbGVyKCkgPSAwOw0KLSAgICB2aXJ0dWFsIElYRkFfV2lkZ2V0KgkJR2V0SFdpZGdldChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlPcGVuRHJvcERvd25MaXN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQotICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCUdldEN1cnJlbnREYXRlVGltZSgpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlc2V0RGF0YShDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlHZXRMYXlvdXRTdGF0dXMoKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSdW5Ob2RlSW5pdGlhbGl6ZShDWEZBX05vZGUqIHBOb2RlKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSdW5TdWJmb3JtSW5kZXhDaGFuZ2UoQ1hGQV9Ob2RlKiBwU3ViZm9ybU5vZGUpID0gMDsNCi0gICAgdmlydHVhbCBDWEZBX05vZGUqCQkJR2V0Rm9jdXNXaWRnZXROb2RlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0Rm9jdXNXaWRnZXROb2RlKENYRkFfTm9kZSogcE5vZGUpID0gMDsNCisgIHZpcnR1YWwgQ1hGQV9MYXlvdXRJdGVtKiBPbkNyZWF0ZUxheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIE9uTGF5b3V0RXZlbnQoSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VURVZFTlQgZUV2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTIgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU3RhcnRGaWVsZERyYXdMYXlvdXQoQ1hGQV9Ob2RlKiBwSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaW5kU3BsaXRQb3MoQ1hGQV9Ob2RlKiBwSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmxvY2tJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0UG9zKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUnVuU2NyaXB0KENYRkFfTm9kZSogcFNjcmlwdCwgQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0pID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBFeGVjRXZlbnRCeURlZXBGaXJzdChDWEZBX05vZGUqIHBGb3JtTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNGb3JtUmVhZHkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWN1cnNpdmUgPSBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRXhjbHVkZSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBBZGRDYWxjVmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX0RvYyogR2V0SERPQygpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9Eb2NQcm92aWRlciogR2V0RG9jUHJvdmlkZXIoKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfQXBwUHJvdmlkZXIqIEdldEFwcFByb3ZpZGVyKCkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldEhhbmRsZXIqIEdldFdpZGdldEhhbmRsZXIoKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBHZXRIV2lkZ2V0KENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPcGVuRHJvcERvd25MaXN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldEN1cnJlbnREYXRlVGltZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSZXNldERhdGEoQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMYXlvdXRTdGF0dXMoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUnVuTm9kZUluaXRpYWxpemUoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJ1blN1YmZvcm1JbmRleENoYW5nZShDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX05vZGUqIEdldEZvY3VzV2lkZ2V0Tm9kZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb2N1c1dpZGdldE5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KIH07DQotY2xhc3MgSVhGQV9PYmpGYWN0b3J5DQotew0KLXB1YmxpYzoNCi0gICAgdmlydHVhbCB+SVhGQV9PYmpGYWN0b3J5KCkge30NCi0gICAgdmlydHVhbCBDWEZBX05vZGUqCQkJQ3JlYXRlTm9kZShGWF9EV09SRCBkd1BhY2tldCwgWEZBX0VMRU1FTlQgZUVsZW1lbnQpID0gMDsNCi0gICAgdmlydHVhbCBDWEZBX05vZGUqCQkJQ3JlYXRlTm9kZShYRkFfTFBDUEFDS0VUSU5GTyBwUGFja2V0LCBYRkFfRUxFTUVOVCBlRWxlbWVudCkgPSAwOw0KK2NsYXNzIElYRkFfT2JqRmFjdG9yeSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfT2JqRmFjdG9yeSgpIHt9DQorICB2aXJ0dWFsIENYRkFfTm9kZSogQ3JlYXRlTm9kZShGWF9EV09SRCBkd1BhY2tldCwgWEZBX0VMRU1FTlQgZUVsZW1lbnQpID0gMDsNCisgIHZpcnR1YWwgQ1hGQV9Ob2RlKiBDcmVhdGVOb2RlKFhGQV9MUENQQUNLRVRJTkZPIHBQYWNrZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlRWxlbWVudCkgPSAwOw0KIH07DQotI2RlZmluZSBYRkFfRE9DRkxBR19TdHJpY3RTY29waW5nCTB4MDAwMQ0KLSNkZWZpbmUgWEZBX0RPQ0ZMQUdfSGFzSW50ZXJhY3RpdmUJMHgwMDAyDQotI2RlZmluZSBYRkFfRE9DRkxBR19JbnRlcmFjdGl2ZQkJMHgwMDA0DQotI2RlZmluZSBYRkFfRE9DRkxBR19TY3JpcHRpbmcJCTB4MDAwOA0KKyNkZWZpbmUgWEZBX0RPQ0ZMQUdfU3RyaWN0U2NvcGluZyAweDAwMDENCisjZGVmaW5lIFhGQV9ET0NGTEFHX0hhc0ludGVyYWN0aXZlIDB4MDAwMg0KKyNkZWZpbmUgWEZBX0RPQ0ZMQUdfSW50ZXJhY3RpdmUgMHgwMDA0DQorI2RlZmluZSBYRkFfRE9DRkxBR19TY3JpcHRpbmcgMHgwMDA4DQogY2xhc3MgQ1NjcmlwdF9EYXRhV2luZG93Ow0KIGNsYXNzIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDsNCiBjbGFzcyBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDsNCiBjbGFzcyBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOw0KIGNsYXNzIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw7DQogY2xhc3MgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDsNCi1jbGFzcyBDWEZBX0RvY3VtZW50IDogcHVibGljIElYRkFfT2JqRmFjdG9yeQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRG9jdW1lbnQoSVhGQV9Eb2NQYXJzZXIgKnBQYXJzZXIpOw0KLSAgICB+Q1hGQV9Eb2N1bWVudCgpOw0KLSAgICBDWEZBX05vZGUqCQkJCQlHZXRSb290KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcFJvb3ROb2RlOw0KLSAgICB9DQotICAgIElYRkFfRG9jUGFyc2VyKgkJCQlHZXRQYXJzZXIoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wUGFyc2VyOw0KLSAgICB9DQotICAgIElYRkFfTm90aWZ5KgkJCQlHZXROb3RpZnkoKSBjb25zdDsNCi0gICAgdm9pZAkJCQkJCVNldFJvb3QoQ1hGQV9Ob2RlKiBwTmV3Um9vdCk7DQotICAgIENYRkFfT2JqZWN0KgkJCQlHZXRYRkFOb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOb2RlTmFtZSk7DQotICAgIENYRkFfT2JqZWN0KgkJCQlHZXRYRkFOb2RlKEZYX0RXT1JEIHdzTm9kZU5hbWVIYXNoKTsNCi0gICAgdm9pZAkJCQkJCUFkZFB1cmdlTm9kZShDWEZBX05vZGUgKnBOb2RlKTsNCi0gICAgRlhfQk9PTAkJCQkJCVJlbW92ZVB1cmdlTm9kZShDWEZBX05vZGUgKnBOb2RlKTsNCi0gICAgdm9pZAkJCQkJCVB1cmdlTm9kZXMoKTsNCi0gICAgRlhfQk9PTAkJCQkJCUhhc0ZsYWcoRlhfRFdPUkQgZHdGbGFnKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKG1fZHdEb2NGbGFncyAmIGR3RmxhZykgPT0gZHdGbGFnOw0KLSAgICB9DQotICAgIHZvaWQJCQkJCQlTZXRGbGFnKEZYX0RXT1JEIGR3RmxhZywgRlhfQk9PTCBiT24gPSBUUlVFKTsNCi0gICAgRlhfQk9PTAkJCQkJCUlzSW50ZXJhY3RpdmUoKTsNCi0gICAgWEZBX1ZFUlNJT04JCQkJCUdldEN1clZlcnNpb25Nb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZUN1clZlcnNpb25Nb2RlOw0KLSAgICB9DQotICAgIFhGQV9WRVJTSU9OCQkJCQlSZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKENGWF9XaWRlU3RyaW5nJiB3c1RlbXBsYXRlTlMpOw0KLSAgICBDWEZBX0xvY2FsZU1ncioJCQkJR2V0TG9jYWxNZ3IoKTsNCi0gICAgdmlydHVhbCBDWEZBX05vZGUqCQkJQ3JlYXRlTm9kZShGWF9EV09SRCBkd1BhY2tldCwgWEZBX0VMRU1FTlQgZUVsZW1lbnQpOw0KLSAgICB2aXJ0dWFsIENYRkFfTm9kZSoJCQlDcmVhdGVOb2RlKFhGQV9MUENQQUNLRVRJTkZPIHBQYWNrZXQsIFhGQV9FTEVNRU5UIGVFbGVtZW50KTsNCi0gICAgdm9pZAkJCQkJCURvUHJvdG9NZXJnZSgpOw0KLSAgICBDWEZBX05vZGUqCQkJCQlHZXROb2RlQnlJRChDWEZBX05vZGUqIHBSb290LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSUQpOw0KK2NsYXNzIENYRkFfRG9jdW1lbnQgOiBwdWJsaWMgSVhGQV9PYmpGYWN0b3J5IHsNCisgcHVibGljOg0KKyAgQ1hGQV9Eb2N1bWVudChJWEZBX0RvY1BhcnNlciogcFBhcnNlcik7DQorICB+Q1hGQV9Eb2N1bWVudCgpOw0KKyAgQ1hGQV9Ob2RlKiBHZXRSb290KCkgY29uc3QgeyByZXR1cm4gbV9wUm9vdE5vZGU7IH0NCisgIElYRkFfRG9jUGFyc2VyKiBHZXRQYXJzZXIoKSBjb25zdCB7IHJldHVybiBtX3BQYXJzZXI7IH0NCisgIElYRkFfTm90aWZ5KiBHZXROb3RpZnkoKSBjb25zdDsNCisgIHZvaWQgU2V0Um9vdChDWEZBX05vZGUqIHBOZXdSb290KTsNCisgIENYRkFfT2JqZWN0KiBHZXRYRkFOb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOb2RlTmFtZSk7DQorICBDWEZBX09iamVjdCogR2V0WEZBTm9kZShGWF9EV09SRCB3c05vZGVOYW1lSGFzaCk7DQorICB2b2lkIEFkZFB1cmdlTm9kZShDWEZBX05vZGUqIHBOb2RlKTsNCisgIEZYX0JPT0wgUmVtb3ZlUHVyZ2VOb2RlKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdm9pZCBQdXJnZU5vZGVzKCk7DQorICBGWF9CT09MIEhhc0ZsYWcoRlhfRFdPUkQgZHdGbGFnKSB7IHJldHVybiAobV9kd0RvY0ZsYWdzICYgZHdGbGFnKSA9PSBkd0ZsYWc7IH0NCisgIHZvaWQgU2V0RmxhZyhGWF9EV09SRCBkd0ZsYWcsIEZYX0JPT0wgYk9uID0gVFJVRSk7DQorICBGWF9CT09MIElzSW50ZXJhY3RpdmUoKTsNCisgIFhGQV9WRVJTSU9OIEdldEN1clZlcnNpb25Nb2RlKCkgeyByZXR1cm4gbV9lQ3VyVmVyc2lvbk1vZGU7IH0NCisgIFhGQV9WRVJTSU9OIFJlY29nbml6ZVhGQVZlcnNpb25OdW1iZXIoQ0ZYX1dpZGVTdHJpbmcmIHdzVGVtcGxhdGVOUyk7DQorICBDWEZBX0xvY2FsZU1nciogR2V0TG9jYWxNZ3IoKTsNCisgIHZpcnR1YWwgQ1hGQV9Ob2RlKiBDcmVhdGVOb2RlKEZYX0RXT1JEIGR3UGFja2V0LCBYRkFfRUxFTUVOVCBlRWxlbWVudCk7DQorICB2aXJ0dWFsIENYRkFfTm9kZSogQ3JlYXRlTm9kZShYRkFfTFBDUEFDS0VUSU5GTyBwUGFja2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQpOw0KKyAgdm9pZCBEb1Byb3RvTWVyZ2UoKTsNCisgIENYRkFfTm9kZSogR2V0Tm9kZUJ5SUQoQ1hGQV9Ob2RlKiBwUm9vdCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0lEKTsNCiANCi0gICAgdm9pZAkJCQkJCURvRGF0YU1lcmdlKCk7DQotICAgIHZvaWQJCQkJCQlEb0RhdGFSZW1lcmdlKEZYX0JPT0wgYkRvRGF0YU1lcmdlKTsNCi0gICAgQ1hGQV9Ob2RlKgkJCQkJRGF0YU1lcmdlX0NvcHlDb250YWluZXIoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLCBDWEZBX05vZGUqIHBGb3JtTm9kZSwgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLCBGWF9CT09MIGJPbmVJbnN0YW5jZSA9IEZBTFNFLCBGWF9CT09MIGJEYXRhTWVyZ2UgPSBUUlVFLCBGWF9CT09MIGJVcExldmVsID0gVFJVRSk7DQotICAgIHZvaWQJCQkJCQlEYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhDWEZBX05vZGUqIHBGb3JtVXBkYXRlUm9vdCk7DQotICAgIENYRkFfTm9kZSoJCQkJCUdldE5vdEJpbmROb2RlKENYRkFfT2JqQXJyYXkmIGFycmF5Tm9kZXMpOw0KLSAgICBDWEZBX0xheW91dFByb2Nlc3NvcioJCUdldExheW91dFByb2Nlc3NvcigpOw0KLSAgICBJWEZBX0RvY0xheW91dCoJCQkJR2V0RG9jTGF5b3V0KCk7DQotICAgIElYRkFfU2NyaXB0Q29udGV4dCoJCQlJbml0U2NyaXB0Q29udGV4dChGWEpTRV9IUlVOVElNRSBoUnVudGltZSk7DQotICAgIElYRkFfU2NyaXB0Q29udGV4dCoJCQlHZXRTY3JpcHRDb250ZXh0KCk7DQotICAgIHZvaWQJCQkJCQlDbGVhckxheW91dERhdGEoKTsNCi1wdWJsaWM6DQotICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9Ob2RlKj4gbV9yZ0dsb2JhbEJpbmRpbmc7DQotICAgIENYRkFfTm9kZUFycmF5CQkJCSBtX3BQZW5kaW5nUGFnZVNldDsNCi1wcm90ZWN0ZWQ6DQotICAgIElYRkFfRG9jUGFyc2VyKgkJCQltX3BQYXJzZXI7DQotICAgIElYRkFfU2NyaXB0Q29udGV4dCoJCQltX3BTY3JpcHRDb250ZXh0Ow0KLSAgICBDWEZBX0xheW91dFByb2Nlc3NvcioJCW1fcExheW91dFByb2Nlc3NvcjsNCi0gICAgQ1hGQV9Ob2RlKgkJCQkJbV9wUm9vdE5vZGU7DQorICB2b2lkIERvRGF0YU1lcmdlKCk7DQorICB2b2lkIERvRGF0YVJlbWVyZ2UoRlhfQk9PTCBiRG9EYXRhTWVyZ2UpOw0KKyAgQ1hGQV9Ob2RlKiBEYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk9uZUluc3RhbmNlID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRhdGFNZXJnZSA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVwTGV2ZWwgPSBUUlVFKTsNCisgIHZvaWQgRGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMoQ1hGQV9Ob2RlKiBwRm9ybVVwZGF0ZVJvb3QpOw0KKyAgQ1hGQV9Ob2RlKiBHZXROb3RCaW5kTm9kZShDWEZBX09iakFycmF5JiBhcnJheU5vZGVzKTsNCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBHZXRMYXlvdXRQcm9jZXNzb3IoKTsNCisgIElYRkFfRG9jTGF5b3V0KiBHZXREb2NMYXlvdXQoKTsNCisgIElYRkFfU2NyaXB0Q29udGV4dCogSW5pdFNjcmlwdENvbnRleHQoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpOw0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBHZXRTY3JpcHRDb250ZXh0KCk7DQorICB2b2lkIENsZWFyTGF5b3V0RGF0YSgpOw0KIA0KLSAgICBDWEZBX0xvY2FsZU1ncioJCQkJbV9wTG9jYWxNZ3I7DQotICAgIENTY3JpcHRfRGF0YVdpbmRvdyoJCQkJCW1fcFNjcmlwdERhdGFXaW5kb3c7DQotICAgIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbCoJCQltX3BTY3JpcHRFdmVudDsNCi0gICAgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwqCQkJbV9wU2NyaXB0SG9zdDsNCi0gICAgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbCoJCQkJbV9wU2NyaXB0TG9nOw0KLSAgICBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsKgkJCW1fcFNjcmlwdExheW91dDsNCi0gICAgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCoJCW1fcFNjcmlwdFNpZ25hdHVyZTsNCi0gICAgQ1hGQV9Ob2RlU2V0CQkJCQkJbV9yZ1B1cmdlTm9kZXM7DQotICAgIFhGQV9WRVJTSU9OCQkJCQkJCW1fZUN1clZlcnNpb25Nb2RlOw0KLSAgICBGWF9EV09SRAkJCQkJCQltX2R3RG9jRmxhZ3M7DQotICAgIGZyaWVuZCBjbGFzcyBDWEZBX1NpbXBsZVBhcnNlcjsNCisgcHVibGljOg0KKyAgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBDWEZBX05vZGUqPiBtX3JnR2xvYmFsQmluZGluZzsNCisgIENYRkFfTm9kZUFycmF5IG1fcFBlbmRpbmdQYWdlU2V0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJWEZBX0RvY1BhcnNlciogbV9wUGFyc2VyOw0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBtX3BTY3JpcHRDb250ZXh0Ow0KKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIG1fcExheW91dFByb2Nlc3NvcjsNCisgIENYRkFfTm9kZSogbV9wUm9vdE5vZGU7DQorDQorICBDWEZBX0xvY2FsZU1nciogbV9wTG9jYWxNZ3I7DQorICBDU2NyaXB0X0RhdGFXaW5kb3cqIG1fcFNjcmlwdERhdGFXaW5kb3c7DQorICBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwqIG1fcFNjcmlwdEV2ZW50Ow0KKyAgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwqIG1fcFNjcmlwdEhvc3Q7DQorICBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsKiBtX3BTY3JpcHRMb2c7DQorICBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsKiBtX3BTY3JpcHRMYXlvdXQ7DQorICBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKiBtX3BTY3JpcHRTaWduYXR1cmU7DQorICBDWEZBX05vZGVTZXQgbV9yZ1B1cmdlTm9kZXM7DQorICBYRkFfVkVSU0lPTiBtX2VDdXJWZXJzaW9uTW9kZTsNCisgIEZYX0RXT1JEIG1fZHdEb2NGbGFnczsNCisgIGZyaWVuZCBjbGFzcyBDWEZBX1NpbXBsZVBhcnNlcjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgKaW5kZXggNDFmZWU2ZC4uNTA1NmUxNiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgKQEAgLTYsMjEgKzYsMjIgQEAKIA0KICNpZm5kZWYgX1hGQV9GTTJKU19BUElfSA0KICNkZWZpbmUgX1hGQV9GTTJKU19BUElfSA0KLSNkZWZpbmUgRk9YSVRfWEZBX0ZNMkpTX0ZPUk1DQUxDX1JVTlRJTUUJImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lIg0KKyNkZWZpbmUgRk9YSVRfWEZBX0ZNMkpTX0ZPUk1DQUxDX1JVTlRJTUUgImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lIg0KICNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyINCi17DQorZXh0ZXJuICJDIiB7DQogI2VuZGlmDQotdHlwZWRlZiBzdHJ1Y3QgWEZBX0hGTTJKU0NPTlRFWFRfIHsNCi0gICAgdm9pZCoqIHBEYXRhOw0KLX0qIFhGQV9IRk0ySlNDT05URVhUOw0KLWludDMyX3QJCQlYRkFfRk0ySlNfVHJhbnNsYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb3JtY2FsYywgQ0ZYX1dpZGVUZXh0QnVmJiB3c0phdmFzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiB3c0Vycm9yKTsNCi1YRkFfSEZNMkpTQ09OVEVYVAlYRkFfRk0ySlNfQ29udGV4dENyZWF0ZSgpOw0KLXZvaWQJCQkJWEZBX0ZNMkpTX0NvbnRleHRJbml0aWFsaXplKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQsIEZYSlNFX0hSVU5USU1FIGhTY3JpcHRSdW50aW1lLA0KLSAgICAgICAgRlhKU0VfSENPTlRFWFQgaFNjcmlwdENvbnRleHQsDQotICAgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KLXZvaWQJCQkJWEZBX0ZNMkpTX0dsb2JhbFByb3BlcnR5R2V0dGVyKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQsIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KLXZvaWQJCQkJWEZBX0ZNMkpTX0NvbnRleHRSZWxlYXNlKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQpOw0KK3R5cGVkZWYgc3RydWN0IFhGQV9IRk0ySlNDT05URVhUXyB7IHZvaWQqKiBwRGF0YTsgfSAqIFhGQV9IRk0ySlNDT05URVhUOw0KK2ludDMyX3QgWEZBX0ZNMkpTX1RyYW5zbGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybWNhbGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlVGV4dEJ1ZiYgd3NKYXZhc2NyaXB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NFcnJvcik7DQorWEZBX0hGTTJKU0NPTlRFWFQgWEZBX0ZNMkpTX0NvbnRleHRDcmVhdGUoKTsNCit2b2lkIFhGQV9GTTJKU19Db250ZXh0SW5pdGlhbGl6ZShYRkFfSEZNMkpTQ09OVEVYVCBoRk0ySlNDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hSVU5USU1FIGhTY3JpcHRSdW50aW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hDT05URVhUIGhTY3JpcHRDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQordm9pZCBYRkFfRk0ySlNfR2xvYmFsUHJvcGVydHlHZXR0ZXIoWEZBX0hGTTJKU0NPTlRFWFQgaEZNMkpTQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCit2b2lkIFhGQV9GTTJKU19Db250ZXh0UmVsZWFzZShYRkFfSEZNMkpTQ09OVEVYVCBoRk0ySlNDb250ZXh0KTsNCiAjaWZkZWYgX19jcGx1c3BsdXMNCiB9DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2xvY2FsZW1nci5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2xvY2FsZW1nci5oCmluZGV4IDE5YzdiOTYuLjhkZGE2ZDAgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgKQEAgLTEwLDYyICsxMCw2MSBAQAogY2xhc3MgSUZYX0xvY2FsZTsNCiBjbGFzcyBJRlhfTG9jYWxlTWdyOw0KIGNsYXNzIENYRkFfTG9jYWxlTWdyOw0KLSNkZWZpbmUgWEZBX0xBTkdJRF96aF9DTgkweDA4MDQNCi0jZGVmaW5lCVhGQV9MQU5HSURfemhfVFcJMHgwNDA0DQotI2RlZmluZSBYRkFfTEFOR0lEX3poX0hLCTB4MGMwNA0KLSNkZWZpbmUgWEZBX0xBTkdJRF9qYV9KUAkweDA0MTENCi0jZGVmaW5lCVhGQV9MQU5HSURfa29fS1IJMHgwNDEyDQotI2RlZmluZSBYRkFfTEFOR0lEX2VuX1VTCTB4MDQwOQ0KLSNkZWZpbmUgWEZBX0xBTkdJRF9lbl9HQgkweDA4MDkNCi0jZGVmaW5lIFhGQV9MQU5HSURfZXNfRVMJMHgwYzBhDQotI2RlZmluZSBYRkFfTEFOR0lEX2VzX0xBCTB4MDgwYQ0KLSNkZWZpbmUgWEZBX0xBTkdJRF9kZV9ERQkweDA0MDcNCi0jZGVmaW5lIFhGQV9MQU5HSURfZnJfRlIJMHgwNDBjDQotI2RlZmluZSBYRkFfTEFOR0lEX2l0X0lUCTB4MDQxMA0KLSNkZWZpbmUgWEZBX0xBTkdJRF9wdF9CUgkweDA0MTYNCi0jZGVmaW5lIFhGQV9MQU5HSURfbmxfTkwJMHgwNDEzDQotI2RlZmluZSBYRkFfTEFOR0lEX3J1X1JVCTB4MDQxOQ0KLWNsYXNzIENYRkFfTG9jYWxlTWdyIDogcHVibGljIElGWF9Mb2NhbGVNZ3INCi17DQotcHVibGljOg0KLSAgICBDWEZBX0xvY2FsZU1ncihDWEZBX05vZGUqIHBMb2NhbGVTZXQsIENGWF9XaWRlU3RyaW5nIHdzRGVmbGNpZCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKTsNCi0gICAgdmlydHVhbCBGWF9XT1JECQkJR2V0RGVmTG9jYWxlSUQoKTsNCi0gICAgdmlydHVhbCBJRlhfTG9jYWxlKgkJR2V0RGVmTG9jYWxlKCk7DQotICAgIHZpcnR1YWwgSUZYX0xvY2FsZSoJCUdldExvY2FsZShGWF9XT1JEIGxjaWQpOw0KLSAgICB2aXJ0dWFsIElGWF9Mb2NhbGUqIAlHZXRMb2NhbGVCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xvY2FsZU5hbWUpOw0KLSAgICB+Q1hGQV9Mb2NhbGVNZ3IoKTsNCi0gICAgdm9pZAkJCQkJU2V0RGVmTG9jYWxlKElGWF9Mb2NhbGUqIHBMb2NhbGUpOw0KLSAgICBDRlhfV2lkZVN0cmluZ0MJCQlHZXRDb25maWdMb2NhbGVOYW1lKENYRkFfTm9kZSogcENvbmZpZyk7DQotcHJvdGVjdGVkOg0KLSAgICBDRlhfUHRyQXJyYXkJCQltX0xvY2FsZUFycmF5Ow0KLSAgICBDRlhfUHRyQXJyYXkJCQltX1hNTExvY2FsZUFycmF5Ow0KLSAgICBJRlhfTG9jYWxlKgkJCQltX3BEZWZMb2NhbGU7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJbV93c0NvbmZpZ0xvY2FsZTsNCi0gICAgRlhfV09SRAkJCQkJbV9kd0RlZmxjaWQ7DQotICAgIEZYX1dPUkQJCQkJCW1fZHdMb2NhbGVGbGFnczsNCisjZGVmaW5lIFhGQV9MQU5HSURfemhfQ04gMHgwODA0DQorI2RlZmluZSBYRkFfTEFOR0lEX3poX1RXIDB4MDQwNA0KKyNkZWZpbmUgWEZBX0xBTkdJRF96aF9ISyAweDBjMDQNCisjZGVmaW5lIFhGQV9MQU5HSURfamFfSlAgMHgwNDExDQorI2RlZmluZSBYRkFfTEFOR0lEX2tvX0tSIDB4MDQxMg0KKyNkZWZpbmUgWEZBX0xBTkdJRF9lbl9VUyAweDA0MDkNCisjZGVmaW5lIFhGQV9MQU5HSURfZW5fR0IgMHgwODA5DQorI2RlZmluZSBYRkFfTEFOR0lEX2VzX0VTIDB4MGMwYQ0KKyNkZWZpbmUgWEZBX0xBTkdJRF9lc19MQSAweDA4MGENCisjZGVmaW5lIFhGQV9MQU5HSURfZGVfREUgMHgwNDA3DQorI2RlZmluZSBYRkFfTEFOR0lEX2ZyX0ZSIDB4MDQwYw0KKyNkZWZpbmUgWEZBX0xBTkdJRF9pdF9JVCAweDA0MTANCisjZGVmaW5lIFhGQV9MQU5HSURfcHRfQlIgMHgwNDE2DQorI2RlZmluZSBYRkFfTEFOR0lEX25sX05MIDB4MDQxMw0KKyNkZWZpbmUgWEZBX0xBTkdJRF9ydV9SVSAweDA0MTkNCitjbGFzcyBDWEZBX0xvY2FsZU1nciA6IHB1YmxpYyBJRlhfTG9jYWxlTWdyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9Mb2NhbGVNZ3IoQ1hGQV9Ob2RlKiBwTG9jYWxlU2V0LCBDRlhfV2lkZVN0cmluZyB3c0RlZmxjaWQpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfV09SRCBHZXREZWZMb2NhbGVJRCgpOw0KKyAgdmlydHVhbCBJRlhfTG9jYWxlKiBHZXREZWZMb2NhbGUoKTsNCisgIHZpcnR1YWwgSUZYX0xvY2FsZSogR2V0TG9jYWxlKEZYX1dPUkQgbGNpZCk7DQorICB2aXJ0dWFsIElGWF9Mb2NhbGUqIEdldExvY2FsZUJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTG9jYWxlTmFtZSk7DQorICB+Q1hGQV9Mb2NhbGVNZ3IoKTsNCisgIHZvaWQgU2V0RGVmTG9jYWxlKElGWF9Mb2NhbGUqIHBMb2NhbGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmdDIEdldENvbmZpZ0xvY2FsZU5hbWUoQ1hGQV9Ob2RlKiBwQ29uZmlnKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1B0ckFycmF5IG1fTG9jYWxlQXJyYXk7DQorICBDRlhfUHRyQXJyYXkgbV9YTUxMb2NhbGVBcnJheTsNCisgIElGWF9Mb2NhbGUqIG1fcERlZkxvY2FsZTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NDb25maWdMb2NhbGU7DQorICBGWF9XT1JEIG1fZHdEZWZsY2lkOw0KKyAgRlhfV09SRCBtX2R3TG9jYWxlRmxhZ3M7DQogfTsNCi1jbGFzcyBJWEZBX1RpbWVab25lUHJvdmlkZXINCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBDcmVhdGUoKTsNCi0gICAgc3RhdGljIElYRkFfVGltZVpvbmVQcm92aWRlciogR2V0KCk7DQotICAgIHN0YXRpYyB2b2lkIERlc3Ryb3koKTsNCitjbGFzcyBJWEZBX1RpbWVab25lUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBDcmVhdGUoKTsNCisgIHN0YXRpYyBJWEZBX1RpbWVab25lUHJvdmlkZXIqIEdldCgpOw0KKyAgc3RhdGljIHZvaWQgRGVzdHJveSgpOw0KIA0KLSAgICB2aXJ0dWFsIH5JWEZBX1RpbWVab25lUHJvdmlkZXIoKSB7fQ0KKyAgdmlydHVhbCB+SVhGQV9UaW1lWm9uZVByb3ZpZGVyKCkge30NCiANCi0gICAgdmlydHVhbCB2b2lkCQlTZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopID0gMDsNCiANCi0gICAgdmlydHVhbCB2b2lkCQlHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopID0gMDsNCiB9Ow0KLWNsYXNzIENYRkFfVGltZVpvbmVQcm92aWRlciA6IHB1YmxpYyBJWEZBX1RpbWVab25lUHJvdmlkZXINCi17DQotcHVibGljOg0KLSAgICBDWEZBX1RpbWVab25lUHJvdmlkZXIoKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9UaW1lWm9uZVByb3ZpZGVyKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJU2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KTsNCi0gICAgdmlydHVhbCB2b2lkCQlHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopOw0KLXByaXZhdGU6DQotICAgIEZYX1RJTUVaT05FCQkJbV90ejsNCitjbGFzcyBDWEZBX1RpbWVab25lUHJvdmlkZXIgOiBwdWJsaWMgSVhGQV9UaW1lWm9uZVByb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyKCk7DQorICB2aXJ0dWFsIH5DWEZBX1RpbWVab25lUHJvdmlkZXIoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopOw0KKyAgdmlydHVhbCB2b2lkIEdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eik7DQorDQorIHByaXZhdGU6DQorICBGWF9USU1FWk9ORSBtX3R6Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX29iamVjdC5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX29iamVjdC5oCmluZGV4IDY5YzgwZGEuLmVmYzBjYTkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgKQEAgLTE2LDU3MyArMTYsNzM0IEBACiBjbGFzcyBDWEZBX0FycmF5Tm9kZUxpc3Q7DQogY2xhc3MgQ1hGQV9BdHRhY2hOb2RlTGlzdDsNCiBlbnVtIFhGQV9PQkpFQ1RUWVBFIHsNCi0gICAgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3QgPSAweDAsDQotICAgIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5TGlzdCAgID0gMHgxLA0KLSAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlTGlzdCAgICAgICA9IDB4MiwNCi0gICAgWEZBX09CSkVDVFRZUEVfTm9kZSAgICAgICAgICAgPSAweDQsDQotICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVDICAgICAgICAgID0gMHg1LA0KLSAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlViAgICAgICAgICA9IDB4NiwNCi0gICAgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlICAgICAgPSAweDgsDQotICAgIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlICAgICAgID0gMHg5LA0KLSAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlICA9IDB4QSwNCi0gICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGUgICAgPSAweEIsDQotICAgIFhGQV9PQkpFQ1RUWVBFX1ZhcmlhYmxlc1RoaXMgID0gMHhDLA0KLSAgICBYRkFfT0JKRUNUVFlQRU1BU0sgICAgICAgICAgICA9IDB4RiwNCi0gICAgWEZBX05PREVGTEFHX0luaXRpYWxpemVkICAgICAgPSAweDAwMDIwLA0KLSAgICBYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZAkgICAgICA9IDB4MDAyMDAsDQotICAgIFhGQV9OT0RFRkxBR19OZWVkc0luaXRBcHAgICAgID0gMHgwMDQwMCwNCi0gICAgWEZBX05PREVGTEFHX0JpbmRGb3JtSXRlbXMgICAgPSAweDAwODAwLA0KLSAgICBYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlICA9IDB4MDEwMDAsDQotICAgIFhGQV9OT0RFRkxBR19Ta2lwRGF0YUJpbmRpbmcgID0gMHgwMjAwMCwNCi0gICAgWEZBX05PREVGTEFHX093blhNTE5vZGUJCSAgPQkweDA0MDAwLA0KLSAgICBYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSAgICAgICA9IDB4MDgwMDAsDQotICAgIFhGQV9OT0RFRkxBR19MYXlvdXRHZW5lcmF0ZWROb2RlID0gMHgxMDAwMCwNCisgIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0ID0gMHgwLA0KKyAgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlMaXN0ID0gMHgxLA0KKyAgWEZBX09CSkVDVFRZUEVfTm9kZUxpc3QgPSAweDIsDQorICBYRkFfT0JKRUNUVFlQRV9Ob2RlID0gMHg0LA0KKyAgWEZBX09CSkVDVFRZUEVfTm9kZUMgPSAweDUsDQorICBYRkFfT0JKRUNUVFlQRV9Ob2RlViA9IDB4NiwNCisgIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZSA9IDB4OCwNCisgIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlID0gMHg5LA0KKyAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSA9IDB4QSwNCisgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlID0gMHhCLA0KKyAgWEZBX09CSkVDVFRZUEVfVmFyaWFibGVzVGhpcyA9IDB4QywNCisgIFhGQV9PQkpFQ1RUWVBFTUFTSyA9IDB4RiwNCisgIFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCA9IDB4MDAwMjAsDQorICBYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZCA9IDB4MDAyMDAsDQorICBYRkFfTk9ERUZMQUdfTmVlZHNJbml0QXBwID0gMHgwMDQwMCwNCisgIFhGQV9OT0RFRkxBR19CaW5kRm9ybUl0ZW1zID0gMHgwMDgwMCwNCisgIFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUgPSAweDAxMDAwLA0KKyAgWEZBX05PREVGTEFHX1NraXBEYXRhQmluZGluZyA9IDB4MDIwMDAsDQorICBYRkFfTk9ERUZMQUdfT3duWE1MTm9kZSA9IDB4MDQwMDAsDQorICBYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSA9IDB4MDgwMDAsDQorICBYRkFfTk9ERUZMQUdfTGF5b3V0R2VuZXJhdGVkTm9kZSA9IDB4MTAwMDAsDQogfTsNCi1jbGFzcyBDWEZBX09iamVjdA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfT2JqZWN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgRlhfRFdPUkQgdUZsYWdzKTsNCi0gICAgaW5saW5lIENYRkFfRG9jdW1lbnQqCUdldERvY3VtZW50KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcERvY3VtZW50Ow0KLSAgICB9DQotICAgIGlubGluZSBGWF9EV09SRAkJCUdldEZsYWcoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV91RmxhZ3M7DQotICAgIH0NCi0gICAgaW5saW5lIFhGQV9PQkpFQ1RUWVBFCUdldE9iamVjdFR5cGUoKQkJY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChYRkFfT0JKRUNUVFlQRSkobV91RmxhZ3MgJiBYRkFfT0JKRUNUVFlQRU1BU0spOw0KLSAgICB9DQotICAgIGlubGluZSBGWF9CT09MCQkJSXNOb2RlKCkJCQljb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKG1fdUZsYWdzICYgWEZBX09CSkVDVFRZUEVNQVNLKSA+PSBYRkFfT0JKRUNUVFlQRV9Ob2RlOw0KLSAgICB9DQotICAgIGlubGluZSBGWF9CT09MCQkJSXNPcmRpbmFyeU9iamVjdCgpCWNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAobV91RmxhZ3MgJiBYRkFfT0JKRUNUVFlQRU1BU0spID09IFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0Ow0KLSAgICB9DQotICAgIGlubGluZSBGWF9CT09MCQkJSXNOb2RlTGlzdCgpCQljb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKG1fdUZsYWdzICYgWEZBX09CSkVDVFRZUEVNQVNLKSA9PSBYRkFfT0JKRUNUVFlQRV9Ob2RlTGlzdDsNCi0gICAgfQ0KLSAgICBpbmxpbmUgRlhfQk9PTAkJCUlzT3JkaW5hcnlMaXN0KCkJY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChtX3VGbGFncyAmIFhGQV9PQkpFQ1RUWVBFTUFTSykgPT0gWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlMaXN0Ow0KLSAgICB9DQotICAgIEZYX0JPT0wJCQkJCUlzQ29udGVudE5vZGUoKQkJY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChtX3VGbGFncyAmIFhGQV9PQkpFQ1RUWVBFTUFTSykgPT0gWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGU7DQotICAgIH0NCi0gICAgRlhfQk9PTAkJCQkJSXNDb250YWluZXJOb2RlKCkJY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChtX3VGbGFncyAmIFhGQV9PQkpFQ1RUWVBFTUFTSykgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZTsNCi0gICAgfQ0KLSAgICBYRkFfRUxFTUVOVAkJCQlHZXRDbGFzc0lEKCkgY29uc3Q7DQotICAgIHZvaWQJCQkJCUdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZ0MgJndzTmFtZSkgY29uc3Q7DQotICAgIHVpbnQzMl90CQkJCUdldENsYXNzSGFzaENvZGUoKSBjb25zdDsNCi0gICAgdm9pZAkJCQlTY3JpcHRfT2JqZWN0Q2xhc3NfQ2xhc3NOYW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJCQkJVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoaW50MzJfdCBpU3RyaW5nSUQsIC4uLik7DQotcHJvdGVjdGVkOg0KLSAgICBDWEZBX0RvY3VtZW50CQkqbV9wRG9jdW1lbnQ7DQotICAgIEZYX0RXT1JECQkJbV91RmxhZ3M7DQorY2xhc3MgQ1hGQV9PYmplY3Qgew0KKyBwdWJsaWM6DQorICBDWEZBX09iamVjdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIEZYX0RXT1JEIHVGbGFncyk7DQorICBpbmxpbmUgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQ0KKyAgaW5saW5lIEZYX0RXT1JEIEdldEZsYWcoKSBjb25zdCB7IHJldHVybiBtX3VGbGFnczsgfQ0KKyAgaW5saW5lIFhGQV9PQkpFQ1RUWVBFIEdldE9iamVjdFR5cGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoWEZBX09CSkVDVFRZUEUpKG1fdUZsYWdzICYgWEZBX09CSkVDVFRZUEVNQVNLKTsNCisgIH0NCisgIGlubGluZSBGWF9CT09MIElzTm9kZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChtX3VGbGFncyAmIFhGQV9PQkpFQ1RUWVBFTUFTSykgPj0gWEZBX09CSkVDVFRZUEVfTm9kZTsNCisgIH0NCisgIGlubGluZSBGWF9CT09MIElzT3JkaW5hcnlPYmplY3QoKSBjb25zdCB7DQorICAgIHJldHVybiAobV91RmxhZ3MgJiBYRkFfT0JKRUNUVFlQRU1BU0spID09IFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0Ow0KKyAgfQ0KKyAgaW5saW5lIEZYX0JPT0wgSXNOb2RlTGlzdCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChtX3VGbGFncyAmIFhGQV9PQkpFQ1RUWVBFTUFTSykgPT0gWEZBX09CSkVDVFRZUEVfTm9kZUxpc3Q7DQorICB9DQorICBpbmxpbmUgRlhfQk9PTCBJc09yZGluYXJ5TGlzdCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChtX3VGbGFncyAmIFhGQV9PQkpFQ1RUWVBFTUFTSykgPT0gWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlMaXN0Ow0KKyAgfQ0KKyAgRlhfQk9PTCBJc0NvbnRlbnROb2RlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKG1fdUZsYWdzICYgWEZBX09CSkVDVFRZUEVNQVNLKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZTsNCisgIH0NCisgIEZYX0JPT0wgSXNDb250YWluZXJOb2RlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKG1fdUZsYWdzICYgWEZBX09CSkVDVFRZUEVNQVNLKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlOw0KKyAgfQ0KKyAgWEZBX0VMRU1FTlQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdm9pZCBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIGNvbnN0Ow0KKyAgdWludDMyX3QgR2V0Q2xhc3NIYXNoQ29kZSgpIGNvbnN0Ow0KKyAgdm9pZCBTY3JpcHRfT2JqZWN0Q2xhc3NfQ2xhc3NOYW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShpbnQzMl90IGlTdHJpbmdJRCwgLi4uKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7DQorICBGWF9EV09SRCBtX3VGbGFnczsNCiB9Ow0KLSNkZWZpbmUgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4JCQkweDAxDQotI2RlZmluZSBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzCQkweDAyDQotI2RlZmluZSBYRkFfTk9ERUZJTFRFUl9PbmVPZlByb3BlcnR5CTB4MDQNCi0jZGVmaW5lIFhGQV9DTE9ORUZMQUdfQ29udGVudAkJCTB4MDENCisjZGVmaW5lIFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuIDB4MDENCisjZGVmaW5lIFhGQV9OT0RFRklMVEVSX1Byb3BlcnRpZXMgMHgwMg0KKyNkZWZpbmUgWEZBX05PREVGSUxURVJfT25lT2ZQcm9wZXJ0eSAweDA0DQorI2RlZmluZSBYRkFfQ0xPTkVGTEFHX0NvbnRlbnQgMHgwMQ0KIGVudW0gWEZBX05PREVJVEVNIHsNCi0gICAgWEZBX05PREVJVEVNX1BhcmVudCwNCi0gICAgWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQsDQotICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZywNCi0gICAgWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nLA0KKyAgWEZBX05PREVJVEVNX1BhcmVudCwNCisgIFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkLA0KKyAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nLA0KKyAgWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nLA0KIH07DQogZW51bSBYRkFfU09NX01FU1NBR0VUWVBFIHsNCi0gICAgWEZBX1NPTV9WYWxpZGF0aW9uTWVzc2FnZSwNCi0gICAgWEZBX1NPTV9Gb3JtYXRNZXNzYWdlLA0KLSAgICBYRkFfU09NX01hbmRhdG9yeU1lc3NhZ2UNCisgIFhGQV9TT01fVmFsaWRhdGlvbk1lc3NhZ2UsDQorICBYRkFfU09NX0Zvcm1hdE1lc3NhZ2UsDQorICBYRkFfU09NX01hbmRhdG9yeU1lc3NhZ2UNCiB9Ow0KIHR5cGVkZWYgQ0ZYX1N0YWNrVGVtcGxhdGU8Q1hGQV9Ob2RlKj4gQ1hGQV9Ob2RlU3RhY2s7DQogdHlwZWRlZiBDWEZBX1B0clNldFRlbXBsYXRlPENYRkFfTm9kZSo+IENYRkFfTm9kZVNldDsNCiB0eXBlZGVmIHZvaWQgKCpQRF9DQUxMQkFDS19EVVBMSUNBVEVEQVRBKSh2b2lkKiYgcERhdGEpOw0KIHR5cGVkZWYgc3RydWN0IF9YRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIHsNCi0gICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEJCXBGcmVlOw0KLSAgICBQRF9DQUxMQkFDS19EVVBMSUNBVEVEQVRBCXBDb3B5Ow0KKyAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgcEZyZWU7DQorICBQRF9DQUxMQkFDS19EVVBMSUNBVEVEQVRBIHBDb3B5Ow0KIH0gWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTzsNCiB0eXBlZGVmIHN0cnVjdCBfWEZBX01BUERBVEFCTE9DSyB7DQotICAgIHVpbnQ4X3QqCQkJCUdldERhdGEoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHVpbnQ4X3QqKXRoaXMgKyBzaXplb2YoX1hGQV9NQVBEQVRBQkxPQ0spOw0KLSAgICB9DQotICAgIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8qCXBDYWxsYmFja0luZm87DQotICAgIGludDMyX3QJCQkJCQlpQnl0ZXM7DQotfSBYRkFfTUFQREFUQUJMT0NLLCAqIFhGQV9MUE1BUERBVEFCTE9DSzsNCisgIHVpbnQ4X3QqIEdldERhdGEoKSBjb25zdCB7DQorICAgIHJldHVybiAodWludDhfdCopdGhpcyArIHNpemVvZihfWEZBX01BUERBVEFCTE9DSyk7DQorICB9DQorICBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvOw0KKyAgaW50MzJfdCBpQnl0ZXM7DQorfSBYRkFfTUFQREFUQUJMT0NLLCAqWEZBX0xQTUFQREFUQUJMT0NLOw0KIHR5cGVkZWYgc3RydWN0IF9YRkFfTUFQTU9EVUxFREFUQSB7DQotICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fVmFsdWVNYXA7DQotICAgIENGWF9NYXBQdHJUZW1wbGF0ZTx2b2lkKiwgWEZBX0xQTUFQREFUQUJMT0NLPiBtX0J1ZmZlck1hcDsNCi19IFhGQV9NQVBNT0RVTEVEQVRBLCAqIFhGQV9MUE1BUE1PRFVMRURBVEE7DQotI2RlZmluZSBYRkFfQ2FsY1JlZkNvdW50CSh2b2lkKikodWludHB0cl90KUZYQlNUUl9JRCgnWCcsICdGJywgJ0EnLCAnUicpDQotI2RlZmluZSBYRkFfQ2FsY0RhdGEJCSh2b2lkKikodWludHB0cl90KUZYQlNUUl9JRCgnWCcsICdGJywgJ0EnLCAnQycpDQotI2RlZmluZSBYRkFfTEFZT1VUSVRFTUtFWQkodm9pZCopKHVpbnRwdHJfdClGWEJTVFJfSUQoJ0wnLCAnWScsICdJJywgJ00nKQ0KLWNsYXNzIENYRkFfTm9kZSA6IHB1YmxpYyBDWEZBX09iamVjdA0KLXsNCi1wdWJsaWM6DQotICAgIFhGQV9FTEVNRU5UCQkJR2V0Q2xhc3NJRCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiAoWEZBX0VMRU1FTlQpbV9lTm9kZUNsYXNzOw0KLSAgICB9DQotICAgIEZYX0RXT1JECQkJR2V0UGFja2V0SUQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9lUGFja2V0Ow0KLSAgICB9DQotICAgIEZYX0JPT0wJCQkJSGFzRmxhZyhGWF9EV09SRCBkd0ZsYWcpIGNvbnN0Ow0KLSAgICB2b2lkCQkJCVNldEZsYWcoRlhfRFdPUkQgZHdGbGFnLCBGWF9CT09MIGJPbiA9IFRSVUUsIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUpOw0KLSAgICBGWF9CT09MCQkJCUlzQXR0cmlidXRlSW5YTUwoKTsNCi0gICAgRlhfQk9PTAkJCQlJc0Zvcm1Db250YWluZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9lUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfRm9ybSAmJiBJc0NvbnRhaW5lck5vZGUoKTsNCi0gICAgfQ0KLSAgICB2b2lkCQkJCVNldFhNTE1hcHBpbmdOb2RlKElGREVfWE1MTm9kZSogcFhNTE5vZGUpDQotICAgIHsNCi0gICAgICAgIG1fcFhNTE5vZGUgPSBwWE1MTm9kZTsNCi0gICAgfQ0KLSAgICBJRkRFX1hNTE5vZGUqCQlHZXRYTUxNYXBwaW5nTm9kZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BYTUxOb2RlOw0KLSAgICB9DQotICAgIElGREVfWE1MTm9kZSoJCUNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7DQotICAgIEZYX0JPT0wJCQkJSXNOZWVkU2F2aW5nWE1MTm9kZSgpOw0KLSAgICBpbmxpbmUgRlhfRFdPUkQJCUdldE5hbWVIYXNoKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZHdOYW1lSGFzaDsNCi0gICAgfQ0KLSAgICBpbmxpbmUgRlhfQk9PTAkJSXNVbm5hbWVkKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZHdOYW1lSGFzaCA9PSAwOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSoJCQlHZXRNb2RlbE5vZGUoKTsNCi0gICAgdm9pZAkJCQlVcGRhdGVOYW1lSGFzaCgpOw0KLSAgICBGWF9CT09MCQkJCUhhc0F0dHJpYnV0ZShYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9CT09MIGJDYW5Jbmhlcml0ID0gRkFMU0UpOw0KLSAgICBGWF9CT09MCQkJCVNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFIGVBdHRyLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsNCi0gICAgRlhfQk9PTAkJCQlHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURSBlQXR0ciwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFKTsNCi0gICAgRlhfQk9PTAkJCQlTZXRBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHIsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOw0KLSAgICBGWF9CT09MCQkJCUdldEF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0ciwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFKTsNCi0gICAgRlhfQk9PTAkJCQlSZW1vdmVBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHIpOw0KLSAgICBGWF9CT09MCQkJCVNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFLCAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UsIEZYX0JPT0wgYlN5bmNEYXRhID0gVFJVRSk7DQotICAgIEZYX0JPT0wJCQkJVHJ5Q29udGVudChDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LCBGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSwgRlhfQk9PTCBiUHJvdG8gPSBUUlVFKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCUdldENvbnRlbnQoKTsNCisgIENGWF9NYXBQdHJUb1B0ciBtX1ZhbHVlTWFwOw0KKyAgQ0ZYX01hcFB0clRlbXBsYXRlPHZvaWQqLCBYRkFfTFBNQVBEQVRBQkxPQ0s+IG1fQnVmZmVyTWFwOw0KK30gWEZBX01BUE1PRFVMRURBVEEsICpYRkFfTFBNQVBNT0RVTEVEQVRBOw0KKyNkZWZpbmUgWEZBX0NhbGNSZWZDb3VudCAodm9pZCopKHVpbnRwdHJfdCkgRlhCU1RSX0lEKCdYJywgJ0YnLCAnQScsICdSJykNCisjZGVmaW5lIFhGQV9DYWxjRGF0YSAodm9pZCopKHVpbnRwdHJfdCkgRlhCU1RSX0lEKCdYJywgJ0YnLCAnQScsICdDJykNCisjZGVmaW5lIFhGQV9MQVlPVVRJVEVNS0VZICh2b2lkKikodWludHB0cl90KSBGWEJTVFJfSUQoJ0wnLCAnWScsICdJJywgJ00nKQ0KK2NsYXNzIENYRkFfTm9kZSA6IHB1YmxpYyBDWEZBX09iamVjdCB7DQorIHB1YmxpYzoNCisgIFhGQV9FTEVNRU5UIEdldENsYXNzSUQoKSBjb25zdCB7IHJldHVybiAoWEZBX0VMRU1FTlQpbV9lTm9kZUNsYXNzOyB9DQorICBGWF9EV09SRCBHZXRQYWNrZXRJRCgpIGNvbnN0IHsgcmV0dXJuIG1fZVBhY2tldDsgfQ0KKyAgRlhfQk9PTCBIYXNGbGFnKEZYX0RXT1JEIGR3RmxhZykgY29uc3Q7DQorICB2b2lkIFNldEZsYWcoRlhfRFdPUkQgZHdGbGFnLCBGWF9CT09MIGJPbiA9IFRSVUUsIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUpOw0KKyAgRlhfQk9PTCBJc0F0dHJpYnV0ZUluWE1MKCk7DQorICBGWF9CT09MIElzRm9ybUNvbnRhaW5lcigpIHsNCisgICAgcmV0dXJuIG1fZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0Zvcm0gJiYgSXNDb250YWluZXJOb2RlKCk7DQorICB9DQorICB2b2lkIFNldFhNTE1hcHBpbmdOb2RlKElGREVfWE1MTm9kZSogcFhNTE5vZGUpIHsgbV9wWE1MTm9kZSA9IHBYTUxOb2RlOyB9DQorICBJRkRFX1hNTE5vZGUqIEdldFhNTE1hcHBpbmdOb2RlKCkgY29uc3QgeyByZXR1cm4gbV9wWE1MTm9kZTsgfQ0KKyAgSUZERV9YTUxOb2RlKiBDcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgRlhfQk9PTCBJc05lZWRTYXZpbmdYTUxOb2RlKCk7DQorICBpbmxpbmUgRlhfRFdPUkQgR2V0TmFtZUhhc2goKSBjb25zdCB7IHJldHVybiBtX2R3TmFtZUhhc2g7IH0NCisgIGlubGluZSBGWF9CT09MIElzVW5uYW1lZCgpIGNvbnN0IHsgcmV0dXJuIG1fZHdOYW1lSGFzaCA9PSAwOyB9DQorICBDWEZBX05vZGUqIEdldE1vZGVsTm9kZSgpOw0KKyAgdm9pZCBVcGRhdGVOYW1lSGFzaCgpOw0KKyAgRlhfQk9PTCBIYXNBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfQk9PTCBiQ2FuSW5oZXJpdCA9IEZBTFNFKTsNCisgIEZYX0JPT0wgU2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7DQorICBGWF9CT09MIEdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VEZWZhdWx0ID0gVFJVRSk7DQorICBGWF9CT09MIFNldEF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsNCisgIEZYX0JPT0wgR2V0QXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VEZWZhdWx0ID0gVFJVRSk7DQorICBGWF9CT09MIFJlbW92ZUF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cik7DQorICBGWF9CT09MIFNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW5jRGF0YSA9IFRSVUUpOw0KKyAgRlhfQk9PTCBUcnlDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvdG8gPSBUUlVFKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldENvbnRlbnQoKTsNCiANCi0gICAgRlhfQk9PTAkJCQlUcnlOYW1lc3BhY2UoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlKTsNCisgIEZYX0JPT0wgVHJ5TmFtZXNwYWNlKENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZSk7DQogDQotICAgIEZYX0JPT0wJCQkJU2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9CT09MIGJWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTZXRWYWx1ZShlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgKHZvaWQqKSh1aW50cHRyX3QpYlZhbHVlLCBiTm90aWZ5KTsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQkJCVRyeUJvb2xlYW4oWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfQk9PTCAmYlZhbHVlLCBGWF9CT09MIGJVc2VEZWZhdWx0ID0gVFJVRSk7DQotICAgIEZYX0JPT0wJCQkJR2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFIGVBdHRyKQ0KLSAgICB7DQotICAgICAgICBGWF9CT09MIGJWYWx1ZTsNCi0gICAgICAgIHJldHVybiBUcnlCb29sZWFuKGVBdHRyLCBiVmFsdWUsIFRSVUUpID8gYlZhbHVlIDogRkFMU0U7DQotICAgIH0NCi0gICAgRlhfQk9PTAkJCQlTZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEUgZUF0dHIsIGludDMyX3QgaVZhbHVlLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFNldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCAodm9pZCopKHVpbnRwdHJfdClpVmFsdWUsIGJOb3RpZnkpOw0KLSAgICB9DQotICAgIEZYX0JPT0wJCQkJVHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFIGVBdHRyLCBpbnQzMl90ICZpVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFKTsNCi0gICAgaW50MzJfdAkJCUdldEludGVnZXIoWEZBX0FUVFJJQlVURSBlQXR0cikNCi0gICAgew0KLSAgICAgICAgaW50MzJfdCBpVmFsdWU7DQotICAgICAgICByZXR1cm4gVHJ5SW50ZWdlcihlQXR0ciwgaVZhbHVlLCBUUlVFKSA/IGlWYWx1ZSA6IDA7DQotICAgIH0NCi0gICAgRlhfQk9PTAkJCQlTZXRFbnVtKFhGQV9BVFRSSUJVVEUgZUF0dHIsIFhGQV9BVFRSSUJVVEVFTlVNIGVWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTZXRWYWx1ZShlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKSh1aW50cHRyX3QpZVZhbHVlLCBiTm90aWZ5KTsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQkJCVRyeUVudW0oWEZBX0FUVFJJQlVURSBlQXR0ciwgWEZBX0FUVFJJQlVURUVOVU0gJmVWYWx1ZSwgRlhfQk9PTCBiVXNlRGVmYXVsdCA9IFRSVUUpOw0KLSAgICBYRkFfQVRUUklCVVRFRU5VTQlHZXRFbnVtKFhGQV9BVFRSSUJVVEUgZUF0dHIpDQotICAgIHsNCi0gICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVWYWx1ZTsNCi0gICAgICAgIHJldHVybiBUcnlFbnVtKGVBdHRyLCBlVmFsdWUsIFRSVUUpID8gZVZhbHVlIDogWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQkJCVNldENEYXRhKFhGQV9BVFRSSUJVVEUgZUF0dHIsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UpOw0KLSAgICBGWF9CT09MCQkJCVNldEF0dHJpYnV0ZVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UsIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFKTsNCi0gICAgRlhfQk9PTAkJCQlUcnlDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSwgRlhfQk9PTCBiVXNlRGVmYXVsdCA9IFRSVUUsIEZYX0JPT0wgYlByb3RvID0gVFJVRSk7DQotICAgIEZYX0JPT0wJCQkJVHJ5Q0RhdGEoWEZBX0FUVFJJQlVURSBlQXR0ciwgQ0ZYX1dpZGVTdHJpbmdDICZ3c1ZhbHVlLCBGWF9CT09MIGJVc2VEZWZhdWx0ID0gVFJVRSwgRlhfQk9PTCBiUHJvdG8gPSBUUlVFKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDCQlHZXRDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyKQ0KLSAgICB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZTsNCi0gICAgICAgIHJldHVybiBUcnlDRGF0YShlQXR0ciwgd3NWYWx1ZSkgPyB3c1ZhbHVlIDogQ0ZYX1dpZGVTdHJpbmdDKCk7DQotICAgIH0NCi0gICAgRlhfQk9PTAkJCQlTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIENYRkFfTWVhc3VyZW1lbnQgbVZhbHVlLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7DQotICAgIEZYX0JPT0wJCQkJVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLCBDWEZBX01lYXN1cmVtZW50ICZtVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFKTsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudAlHZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIpDQotICAgIHsNCi0gICAgICAgIENYRkFfTWVhc3VyZW1lbnQgbVZhbHVlOw0KLSAgICAgICAgcmV0dXJuIFRyeU1lYXN1cmUoZUF0dHIsIG1WYWx1ZSwgVFJVRSkgPyBtVmFsdWUgOiBDWEZBX01lYXN1cmVtZW50KCk7DQotICAgIH0NCi0gICAgRlhfQk9PTAkJCQlTZXRPYmplY3QoWEZBX0FUVFJJQlVURSBlQXR0ciwgdm9pZCogcERhdGEsIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8qIHBDYWxsYmFja0luZm8gPSBOVUxMKTsNCi0gICAgRlhfQk9PTAkJCQlUcnlPYmplY3QoWEZBX0FUVFJJQlVURSBlQXR0ciwgdm9pZCogJnBEYXRhKTsNCi0gICAgdm9pZCoJCQlHZXRPYmplY3QoWEZBX0FUVFJJQlVURSBlQXR0cikNCi0gICAgew0KLSAgICAgICAgdm9pZCogcERhdGE7DQotICAgICAgICByZXR1cm4gVHJ5T2JqZWN0KGVBdHRyLCBwRGF0YSkgPyBwRGF0YSA6IE5VTEw7DQotICAgIH0NCi0gICAgRlhfQk9PTAkJCQlTZXRVc2VyRGF0YSh2b2lkKiBwS2V5LCB2b2lkKiBwRGF0YSwgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbyA9IE5VTEwpOw0KLSAgICBGWF9CT09MCQkJCVRyeVVzZXJEYXRhKHZvaWQqIHBLZXksIHZvaWQqICZwRGF0YSwgRlhfQk9PTCBiUHJvdG9BbHNvID0gRkFMU0UpOw0KLSAgICB2b2lkKgkJCUdldFVzZXJEYXRhKHZvaWQqIHBLZXksIEZYX0JPT0wgYlByb3RvQWxzbyA9IEZBTFNFKQ0KLSAgICB7DQotICAgICAgICB2b2lkKiBwRGF0YTsNCi0gICAgICAgIHJldHVybiBUcnlVc2VyRGF0YShwS2V5LCBwRGF0YSwgYlByb3RvQWxzbykgPyBwRGF0YSA6IE5VTEw7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKgkJCUdldFByb3BlcnR5KGludDMyX3QgaW5kZXgsIFhGQV9FTEVNRU5UIGVQcm9wZXJ0eSwgRlhfQk9PTCBiQ3JlYXRlUHJvcGVydHkgPSBUUlVFKTsNCi0gICAgaW50MzJfdAkJCUNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlQgZUVsZW1lbnQsICBGWF9CT09MIGJPbmx5Q2hpbGQgPSBGQUxTRSk7DQotICAgIENYRkFfTm9kZSoJCQlHZXRDaGlsZChpbnQzMl90IGluZGV4LCBYRkFfRUxFTUVOVCBlRWxlbWVudCwgIEZYX0JPT0wgYk9ubHlDaGlsZCA9IEZBTFNFKTsNCi0gICAgaW50MzJfdAkJCUluc2VydENoaWxkKGludDMyX3QgaW5kZXgsIENYRkFfTm9kZSAqcE5vZGUpOw0KLSAgICBGWF9CT09MCQkJCUluc2VydENoaWxkKENYRkFfTm9kZSAqcE5vZGUsIENYRkFfTm9kZSogcEJlZm9yZU5vZGUgPSBOVUxMKTsNCi0gICAgRlhfQk9PTAkJCQlSZW1vdmVDaGlsZChDWEZBX05vZGUgKnBOb2RlLCBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCi0gICAgQ1hGQV9Ob2RlKgkJCUNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSk7DQotICAgIENYRkFfTm9kZSoJCQlHZXROb2RlSXRlbShYRkFfTk9ERUlURU0gZUl0ZW0pIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQkJR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNIGVJdGVtLCBYRkFfT0JKRUNUVFlQRSBlVHlwZSkgY29uc3Q7DQotICAgIGludDMyX3QJCQlHZXROb2RlTGlzdChDWEZBX05vZGVBcnJheSAmbm9kZXMsIEZYX0RXT1JEIGR3VHlwZUZpbHRlciA9IFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuIHwgWEZBX05PREVGSUxURVJfUHJvcGVydGllcywgWEZBX0VMRU1FTlQgZUVsZW1lbnRGaWx0ZXIgPSBYRkFfRUxFTUVOVF9VTktOT1dOLCBpbnQzMl90IGlMZXZlbCA9IDEpOw0KLSAgICBDWEZBX05vZGUqCQkJQ3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIEZYX0RXT1JEIGR3RmxhZ3MgPSBYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KLSAgICBDWEZBX05vZGUqCQkJQ2xvbmVUZW1wbGF0ZVRvRm9ybShGWF9CT09MIGJSZWN1cnNpdmUpOw0KLSAgICBDWEZBX05vZGUqCQkJR2V0VGVtcGxhdGVOb2RlKCk7DQotICAgIHZvaWQJCQkJU2V0VGVtcGxhdGVOb2RlKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSk7DQotICAgIENYRkFfTm9kZSoJCQlHZXREYXRhRGVzY3JpcHRpb25Ob2RlKCk7DQotICAgIHZvaWQJCQkJU2V0RGF0YURlc2NyaXB0aW9uTm9kZShDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKTsNCi0gICAgQ1hGQV9Ob2RlKgkJCUdldEJpbmREYXRhKCk7DQotICAgIGludDMyX3QJCQlHZXRCaW5kSXRlbXMoQ1hGQV9Ob2RlQXJyYXkmIGZvcm1JdGVtcyk7DQotICAgIGludDMyX3QJCQlBZGRCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSk7DQotICAgIGludDMyX3QJCQlSZW1vdmVCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSk7DQotICAgIEZYX0JPT0wJCQkJSGFzQmluZEl0ZW0oKTsNCi0gICAgQ1hGQV9XaWRnZXREYXRhKglHZXRXaWRnZXREYXRhKCk7DQotICAgIENYRkFfV2lkZ2V0RGF0YSoJR2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KLSAgICBGWF9CT09MCQkJCUdldExvY2FsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxlTmFtZSk7DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNCUdldEludGFjdCgpOw0KLSAgICBDWEZBX05vZGUqCQkJR2V0Rmlyc3RDaGlsZEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTm9kZU5hbWUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQkJR2V0Rmlyc3RDaGlsZEJ5TmFtZShGWF9EV09SRCBkd05vZGVOYW1lSGFzaCkgY29uc3Q7DQotICAgIENYRkFfTm9kZSoJCQlHZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVCBlTm9kZUNsYXNzKSBjb25zdDsNCi0gICAgQ1hGQV9Ob2RlKgkJCUdldE5leHRTYW1lTmFtZVNpYmxpbmcoRlhfRFdPUkQgZHdOb2RlTmFtZUhhc2gpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQkJR2V0TmV4dFNhbWVOYW1lU2libGluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTm9kZU5hbWUpIGNvbnN0Ow0KLSAgICBDWEZBX05vZGUqCQkJR2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlQgZU5vZGVDbGFzcykgY29uc3Q7DQotICAgIGludDMyX3QJCQlHZXROb2RlU2FtZU5hbWVJbmRleCgpIGNvbnN0Ow0KLSAgICBpbnQzMl90CQkJR2V0Tm9kZVNhbWVDbGFzc0luZGV4KCkgY29uc3Q7DQotICAgIHZvaWQJCQkJR2V0U09NRXhwcmVzc2lvbihDRlhfV2lkZVN0cmluZyYgd3NTT01FeHByZXNzaW9uKTsNCi0gICAgQ1hGQV9Ob2RlKgkJCUdldEluc3RhbmNlTWdyT2ZTdWJmb3JtKCk7DQorICBGWF9CT09MIFNldEJvb2xlYW4oWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSkgew0KKyAgICByZXR1cm4gU2V0VmFsdWUoZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sICh2b2lkKikodWludHB0cl90KWJWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgIGJOb3RpZnkpOw0KKyAgfQ0KKyAgRlhfQk9PTCBUcnlCb29sZWFuKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFKTsNCisgIEZYX0JPT0wgR2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFIGVBdHRyKSB7DQorICAgIEZYX0JPT0wgYlZhbHVlOw0KKyAgICByZXR1cm4gVHJ5Qm9vbGVhbihlQXR0ciwgYlZhbHVlLCBUUlVFKSA/IGJWYWx1ZSA6IEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBTZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpIHsNCisgICAgcmV0dXJuIFNldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCAodm9pZCopKHVpbnRwdHJfdClpVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICBiTm90aWZ5KTsNCisgIH0NCisgIEZYX0JPT0wgVHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VEZWZhdWx0ID0gVFJVRSk7DQorICBpbnQzMl90IEdldEludGVnZXIoWEZBX0FUVFJJQlVURSBlQXR0cikgew0KKyAgICBpbnQzMl90IGlWYWx1ZTsNCisgICAgcmV0dXJuIFRyeUludGVnZXIoZUF0dHIsIGlWYWx1ZSwgVFJVRSkgPyBpVmFsdWUgOiAwOw0KKyAgfQ0KKyAgRlhfQk9PTCBTZXRFbnVtKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKSB7DQorICAgIHJldHVybiBTZXRWYWx1ZShlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKSh1aW50cHRyX3QpZVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgYk5vdGlmeSk7DQorICB9DQorICBGWF9CT09MIFRyeUVudW0oWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSYgZVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFKTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldEVudW0oWEZBX0FUVFJJQlVURSBlQXR0cikgew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlVmFsdWU7DQorICAgIHJldHVybiBUcnlFbnVtKGVBdHRyLCBlVmFsdWUsIFRSVUUpID8gZVZhbHVlIDogWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCisgIH0NCisgIEZYX0JPT0wgU2V0Q0RhdGEoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSk7DQorICBGWF9CT09MIFNldEF0dHJpYnV0ZVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFKTsNCisgIEZYX0JPT0wgVHJ5Q0RhdGEoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm90byA9IFRSVUUpOw0KKyAgRlhfQk9PTCBUcnlDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm90byA9IFRSVUUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmdDIEdldENEYXRhKFhGQV9BVFRSSUJVVEUgZUF0dHIpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWU7DQorICAgIHJldHVybiBUcnlDRGF0YShlQXR0ciwgd3NWYWx1ZSkgPyB3c1ZhbHVlIDogQ0ZYX1dpZGVTdHJpbmdDKCk7DQorICB9DQorICBGWF9CT09MIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IG1WYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7DQorICBGWF9CT09MIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50JiBtVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlRGVmYXVsdCA9IFRSVUUpOw0KKyAgQ1hGQV9NZWFzdXJlbWVudCBHZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIpIHsNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtVmFsdWU7DQorICAgIHJldHVybiBUcnlNZWFzdXJlKGVBdHRyLCBtVmFsdWUsIFRSVUUpID8gbVZhbHVlIDogQ1hGQV9NZWFzdXJlbWVudCgpOw0KKyAgfQ0KKyAgRlhfQk9PTCBTZXRPYmplY3QoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbyA9IE5VTEwpOw0KKyAgRlhfQk9PTCBUcnlPYmplY3QoWEZBX0FUVFJJQlVURSBlQXR0ciwgdm9pZComIHBEYXRhKTsNCisgIHZvaWQqIEdldE9iamVjdChYRkFfQVRUUklCVVRFIGVBdHRyKSB7DQorICAgIHZvaWQqIHBEYXRhOw0KKyAgICByZXR1cm4gVHJ5T2JqZWN0KGVBdHRyLCBwRGF0YSkgPyBwRGF0YSA6IE5VTEw7DQorICB9DQorICBGWF9CT09MIFNldFVzZXJEYXRhKHZvaWQqIHBLZXksDQorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvID0gTlVMTCk7DQorICBGWF9CT09MIFRyeVVzZXJEYXRhKHZvaWQqIHBLZXksIHZvaWQqJiBwRGF0YSwgRlhfQk9PTCBiUHJvdG9BbHNvID0gRkFMU0UpOw0KKyAgdm9pZCogR2V0VXNlckRhdGEodm9pZCogcEtleSwgRlhfQk9PTCBiUHJvdG9BbHNvID0gRkFMU0UpIHsNCisgICAgdm9pZCogcERhdGE7DQorICAgIHJldHVybiBUcnlVc2VyRGF0YShwS2V5LCBwRGF0YSwgYlByb3RvQWxzbykgPyBwRGF0YSA6IE5VTEw7DQorICB9DQorICBDWEZBX05vZGUqIEdldFByb3BlcnR5KGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVQcm9wZXJ0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3JlYXRlUHJvcGVydHkgPSBUUlVFKTsNCisgIGludDMyX3QgQ291bnRDaGlsZHJlbihYRkFfRUxFTUVOVCBlRWxlbWVudCwgRlhfQk9PTCBiT25seUNoaWxkID0gRkFMU0UpOw0KKyAgQ1hGQV9Ob2RlKiBHZXRDaGlsZChpbnQzMl90IGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seUNoaWxkID0gRkFMU0UpOw0KKyAgaW50MzJfdCBJbnNlcnRDaGlsZChpbnQzMl90IGluZGV4LCBDWEZBX05vZGUqIHBOb2RlKTsNCisgIEZYX0JPT0wgSW5zZXJ0Q2hpbGQoQ1hGQV9Ob2RlKiBwTm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSA9IE5VTEwpOw0KKyAgRlhfQk9PTCBSZW1vdmVDaGlsZChDWEZBX05vZGUqIHBOb2RlLCBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCisgIENYRkFfTm9kZSogQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKTsNCisgIENYRkFfTm9kZSogR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNIGVJdGVtKSBjb25zdDsNCisgIENYRkFfTm9kZSogR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNIGVJdGVtLCBYRkFfT0JKRUNUVFlQRSBlVHlwZSkgY29uc3Q7DQorICBpbnQzMl90IEdldE5vZGVMaXN0KENYRkFfTm9kZUFycmF5JiBub2RlcywNCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUeXBlRmlsdGVyID0gWEZBX05PREVGSUxURVJfQ2hpbGRyZW4gfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlRWxlbWVudEZpbHRlciA9IFhGQV9FTEVNRU5UX1VOS05PV04sDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxldmVsID0gMSk7DQorICBDWEZBX05vZGUqIENyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzID0gWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgIENYRkFfTm9kZSogQ2xvbmVUZW1wbGF0ZVRvRm9ybShGWF9CT09MIGJSZWN1cnNpdmUpOw0KKyAgQ1hGQV9Ob2RlKiBHZXRUZW1wbGF0ZU5vZGUoKTsNCisgIHZvaWQgU2V0VGVtcGxhdGVOb2RlKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSk7DQorICBDWEZBX05vZGUqIEdldERhdGFEZXNjcmlwdGlvbk5vZGUoKTsNCisgIHZvaWQgU2V0RGF0YURlc2NyaXB0aW9uTm9kZShDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKTsNCisgIENYRkFfTm9kZSogR2V0QmluZERhdGEoKTsNCisgIGludDMyX3QgR2V0QmluZEl0ZW1zKENYRkFfTm9kZUFycmF5JiBmb3JtSXRlbXMpOw0KKyAgaW50MzJfdCBBZGRCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSk7DQorICBpbnQzMl90IFJlbW92ZUJpbmRJdGVtKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsNCisgIEZYX0JPT0wgSGFzQmluZEl0ZW0oKTsNCisgIENYRkFfV2lkZ2V0RGF0YSogR2V0V2lkZ2V0RGF0YSgpOw0KKyAgQ1hGQV9XaWRnZXREYXRhKiBHZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQorICBGWF9CT09MIEdldExvY2FsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxlTmFtZSk7DQorICBYRkFfQVRUUklCVVRFRU5VTSBHZXRJbnRhY3QoKTsNCisgIENYRkFfTm9kZSogR2V0Rmlyc3RDaGlsZEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTm9kZU5hbWUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBHZXRGaXJzdENoaWxkQnlOYW1lKEZYX0RXT1JEIGR3Tm9kZU5hbWVIYXNoKSBjb25zdDsNCisgIENYRkFfTm9kZSogR2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlQgZU5vZGVDbGFzcykgY29uc3Q7DQorICBDWEZBX05vZGUqIEdldE5leHRTYW1lTmFtZVNpYmxpbmcoRlhfRFdPUkQgZHdOb2RlTmFtZUhhc2gpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBHZXROZXh0U2FtZU5hbWVTaWJsaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOb2RlTmFtZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIEdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UIGVOb2RlQ2xhc3MpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXROb2RlU2FtZU5hbWVJbmRleCgpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXROb2RlU2FtZUNsYXNzSW5kZXgoKSBjb25zdDsNCisgIHZvaWQgR2V0U09NRXhwcmVzc2lvbihDRlhfV2lkZVN0cmluZyYgd3NTT01FeHByZXNzaW9uKTsNCisgIENYRkFfTm9kZSogR2V0SW5zdGFuY2VNZ3JPZlN1YmZvcm0oKTsNCiANCisgIENYRkFfTm9kZSogR2V0T2NjdXJOb2RlKCk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGVzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiByZWZOb2RlID0gTlVMTCk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfQWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfTm9kZXMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NBbGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfUGFyZW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NJbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfU29tRXhwcmVzc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfQXBwbHlYU0woQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfQXNzaWduTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X05vZGVDbGFzc19DbG9uZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X05vZGVDbGFzc19HZXRBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfR2V0RWxlbWVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X05vZGVDbGFzc19Jc1Byb3BlcnR5U3BlY2lmaWVkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX0xvYWRYTUwoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZUZpbHRlcmVkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX1NhdmVYTUwoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfU2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX1NldEVsZW1lbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfTnMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfTW9kZWwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfSXNDb250YWluZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfSXNOdWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfT25lT2ZDaGlsZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0NvbnRhaW5lckNsYXNzX0dldERlbHRhcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X01vZGVsQ2xhc3NfQ2xlYXJFcnJvckxpc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Nb2RlbENsYXNzX0NyZWF0ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Nb2RlbENsYXNzX0lzQ29tcGF0aWJsZU5TKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTW9kZWxDbGFzc19Db250ZXh0KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfTW9kZWxDbGFzc19BbGlhc05vZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfV3NkbENvbm5lY3Rpb25fRXhlY3V0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0RlbHRhX1Jlc3RvcmUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9EZWx0YV9DdXJyZW50VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9EZWx0YV9TYXZlZFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9EZWx0YV9UYXJnZXQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9BdHRyaWJ1dGVfU2VuZEF0dHJpYnV0ZUNoYW5nZU1lc3NhZ2Uodm9pZCogZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBlVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5KTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9CT09MKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9CT09MUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmdSZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0ZpZWxkX0xlbmd0aChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWVfUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0Jvb2xlYW5fVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1NvbV9NZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1NPTV9NRVNTQUdFVFlQRSBpTWVzc2FnZVR5cGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0JvcmRlckNvbG9yKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0JvcmRlcldpZHRoKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0ZpbGxDb2xvcihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0RhdGFOb2RlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0ZvbnRDb2xvcihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX01hbmRhdG9yeShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX01hbmRhdG9yeU1lc3NhZ2UoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0luc3RhbmNlSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRHJhd19EZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRGVmYXVsdFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRWRpdFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRm9ybWF0TWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRm9ybWF0dGVkVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfUGFyZW50U3ViZm9ybShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfU2VsZWN0ZWRJbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfQ2xlYXJJdGVtcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0ZpZWxkX0V4ZWNFdmVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0ZpZWxkX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRGVsZXRlSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0ZpZWxkX0dldFNhdmVJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfQm91bmRJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfR2V0SXRlbVN0YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0ZpZWxkX1NldEl0ZW1zKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfR2V0RGlzcGxheUl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9GaWVsZF9TZXRJdGVtU3RhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9GaWVsZF9BZGRJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX0RlZmF1bHRBbmRSYXdWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX0Vycm9yVGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX1RyYW5zaWVudChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX0V4ZWNFdmVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0V4Y2xHcm91cF9TZWxlY3RlZE1lbWJlcihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0V4Y2xHcm91cF9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0V4Y2xHcm91cF9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1N1YmZvcm1fSW5zdGFuY2VNYW5hZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1N1YmZvcm1fTG9jYWxlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1N1YmZvcm1fRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU3ViZm9ybV9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1N1YmZvcm1fRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1N1YmZvcm1fRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU3ViZm9ybV9HZXRJbnZhbGlkT2JqZWN0cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCiANCi0gICAgQ1hGQV9Ob2RlKgkJCUdldE9jY3VyTm9kZSgpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJCQkJU2NyaXB0X1RyZWVDbGFzc19SZXNvbHZlTm9kZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJCQkJU2NyaXB0X1NvbV9SZXNvbHZlTm9kZUxpc3QoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uLCBGWF9EV09SRCBkd0ZsYWcsIENYRkFfTm9kZSogcmVmTm9kZSA9IE5VTEwpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9UcmVlQ2xhc3NfQWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJCQkJU2NyaXB0X1RyZWVDbGFzc19Ob2RlcyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NBbGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfVHJlZUNsYXNzX1BhcmVudChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9UcmVlQ2xhc3NfSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfVHJlZUNsYXNzX0NsYXNzSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfVHJlZUNsYXNzX1NvbUV4cHJlc3Npb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX0FwcGx5WFNMKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfQXNzaWduTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX0Nsb25lKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfR2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfR2V0RWxlbWVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX0lzUHJvcGVydHlTcGVjaWZpZWQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJCQkJU2NyaXB0X05vZGVDbGFzc19Mb2FkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZUZpbHRlcmVkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZVhNTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX1NldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX1NldEVsZW1lbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJCQkJU2NyaXB0X05vZGVDbGFzc19OcyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9Ob2RlQ2xhc3NfTW9kZWwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX0lzQ29udGFpbmVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJCQkJU2NyaXB0X05vZGVDbGFzc19Jc051bGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfTm9kZUNsYXNzX09uZU9mQ2hpbGQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfQ29udGFpbmVyQ2xhc3NfR2V0RGVsdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0NvbnRhaW5lckNsYXNzX0dldERlbHRhcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTW9kZWxDbGFzc19DbGVhckVycm9yTGlzdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTW9kZWxDbGFzc19DcmVhdGVOb2RlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Nb2RlbENsYXNzX0lzQ29tcGF0aWJsZU5TKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Nb2RlbENsYXNzX0NvbnRleHQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfTW9kZWxDbGFzc19BbGlhc05vZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfV3NkbENvbm5lY3Rpb25fRXhlY3V0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRGVsdGFfUmVzdG9yZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRGVsdGFfQ3VycmVudFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0RlbHRhX1NhdmVkVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRGVsdGFfVGFyZ2V0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0F0dHJpYnV0ZV9TZW5kQXR0cmlidXRlQ2hhbmdlTWVzc2FnZSh2b2lkKiBlQXR0cmlidXRlLCB2b2lkKiBlVmFsdWUsIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSk7DQotICAgIHZvaWQJU2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9BdHRyaWJ1dGVfQk9PTChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9BdHRyaWJ1dGVfQk9PTFJlYWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9Tb21fVmFsaWRhdGlvbk1lc3NhZ2UoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRmllbGRfTGVuZ3RoKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZV9SZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0Jvb2xlYW5fVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZCAgIFNjcmlwdF9Tb21fTWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfU09NX01FU1NBR0VUWVBFIGlNZXNzYWdlVHlwZSk7DQotICAgIHZvaWQJCQkJU2NyaXB0X1NvbV9Cb3JkZXJDb2xvcihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9Tb21fQm9yZGVyV2lkdGgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfU29tX0ZpbGxDb2xvcihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9Tb21fRGF0YU5vZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAkJCQlTY3JpcHRfU29tX0ZvbnRDb2xvcihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCQkJCVNjcmlwdF9Tb21fTWFuZGF0b3J5KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJCQkJU2NyaXB0X1NvbV9NYW5kYXRvcnlNZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJCQkJU2NyaXB0X1NvbV9JbnN0YW5jZUluZGV4KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0RyYXdfRGVmYXVsdFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0ZpZWxkX0RlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9GaWVsZF9FZGl0VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRmllbGRfRm9ybWF0TWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9GaWVsZF9Gb3JtYXR0ZWRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9GaWVsZF9QYXJlbnRTdWJmb3JtKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0ZpZWxkX1NlbGVjdGVkSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRmllbGRfQ2xlYXJJdGVtcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRmllbGRfRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9GaWVsZF9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRmllbGRfRGVsZXRlSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRmllbGRfR2V0U2F2ZUl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0ZpZWxkX0JvdW5kSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRmllbGRfR2V0SXRlbVN0YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9GaWVsZF9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9GaWVsZF9TZXRJdGVtcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRmllbGRfR2V0RGlzcGxheUl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0ZpZWxkX1NldEl0ZW1TdGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRmllbGRfQWRkSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRmllbGRfRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9FeGNsR3JvdXBfRGVmYXVsdEFuZFJhd1ZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0V4Y2xHcm91cF9FcnJvclRleHQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRXhjbEdyb3VwX1RyYW5zaWVudChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9FeGNsR3JvdXBfRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9FeGNsR3JvdXBfU2VsZWN0ZWRNZW1iZXIoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0V4Y2xHcm91cF9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRXhjbEdyb3VwX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0V4Y2xHcm91cF9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1N1YmZvcm1fSW5zdGFuY2VNYW5hZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X1N1YmZvcm1fTG9jYWxlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X1N1YmZvcm1fRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9TdWJmb3JtX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9TdWJmb3JtX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1N1YmZvcm1fRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9TdWJmb3JtX0dldEludmFsaWRPYmplY3RzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgaW50MzJfdCBTdWJmb3JtX2FuZF9TdWJmb3JtU2V0X0luc3RhbmNlSW5kZXgoKTsNCisgIHZvaWQgU2NyaXB0X1RlbXBsYXRlX0Zvcm1Ob2RlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1RlbXBsYXRlX1JlbWVyZ2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9UZW1wbGF0ZV9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1RlbXBsYXRlX0NyZWF0ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9UZW1wbGF0ZV9SZWNhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1RlbXBsYXRlX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9UZW1wbGF0ZV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9NYW5pZmVzdF9FdmFsdWF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9Db3VudChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NYXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NaW4oRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSW5zdGFuY2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfU2V0SW5zdGFuY2VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0FkZEluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0luc2VydEluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgaW50MzJfdCBJbnN0YW5jZU1hbmFnZXJfU2V0SW5zdGFuY2VzKGludDMyX3QgaUNvdW50KTsNCisgIGludDMyX3QgSW5zdGFuY2VNYW5hZ2VyX01vdmVJbnN0YW5jZShpbnQzMl90IGlUbywgaW50MzJfdCBpRnJvbSk7DQorICB2b2lkIFNjcmlwdF9PY2N1cl9NYXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9PY2N1cl9NaW4oRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9EZXNjX01ldGFkYXRhKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRm9ybV9Gb3JtTm9kZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Gb3JtX1JlbWVyZ2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Gb3JtX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRm9ybV9SZWNhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0Zvcm1fRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0Zvcm1fRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRm9ybV9DaGVja3N1bShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfUGFja2V0X0dldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1BhY2tldF9TZXRBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9QYWNrZXRfUmVtb3ZlQXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfUGFja2V0X0NvbnRlbnQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX05leHQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfQ2FuY2VsQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfRmlyc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfVXBkYXRlQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfUHJldmlvdXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfSXNCT0YoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfSXNFT0YoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfQ2FuY2VsKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX1VwZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1NvdXJjZV9PcGVuKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX0RlbGV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1NvdXJjZV9BZGROZXcoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfUmVxdWVyeShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1NvdXJjZV9SZXN5bmMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfQ2xvc2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfTGFzdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1NvdXJjZV9IYXNEYXRhQ2hhbmdlZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1NvdXJjZV9EYihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1hmYV9UaGlzKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0hhbmRsZXJfVmVyc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1N1Ym1pdEZvcm1hdF9Nb2RlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0V4dHJhc19UeXBlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0VuY3J5cHRfRm9ybWF0KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1NjcmlwdF9TdGF0ZWxlc3MoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCiANCi0gICAgaW50MzJfdCBTdWJmb3JtX2FuZF9TdWJmb3JtU2V0X0luc3RhbmNlSW5kZXgoKTsNCi0gICAgdm9pZAlTY3JpcHRfVGVtcGxhdGVfRm9ybU5vZGVzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9UZW1wbGF0ZV9SZW1lcmdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9UZW1wbGF0ZV9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfVGVtcGxhdGVfQ3JlYXRlTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfVGVtcGxhdGVfUmVjYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1RlbXBsYXRlX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1RlbXBsYXRlX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTWFuaWZlc3RfRXZhbHVhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9Db3VudChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTWF4KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NaW4oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01vdmVJbnN0YW5jZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX1JlbW92ZUluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfU2V0SW5zdGFuY2VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfQWRkSW5zdGFuY2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9JbnNlcnRJbnN0YW5jZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgaW50MzJfdCBJbnN0YW5jZU1hbmFnZXJfU2V0SW5zdGFuY2VzKGludDMyX3QgaUNvdW50KTsNCi0gICAgaW50MzJfdCBJbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlKGludDMyX3QgaVRvLCBpbnQzMl90IGlGcm9tKTsNCi0gICAgdm9pZAlTY3JpcHRfT2NjdXJfTWF4KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X09jY3VyX01pbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9EZXNjX01ldGFkYXRhKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Gb3JtX0Zvcm1Ob2RlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRm9ybV9SZW1lcmdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Gb3JtX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Gb3JtX1JlY2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Gb3JtX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0Zvcm1fRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Gb3JtX0NoZWNrc3VtKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X1BhY2tldF9HZXRBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1BhY2tldF9TZXRBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1BhY2tldF9SZW1vdmVBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1BhY2tldF9Db250ZW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9OZXh0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Tb3VyY2VfQ2FuY2VsQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9GaXJzdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfU291cmNlX1VwZGF0ZUJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Tb3VyY2VfUHJldmlvdXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9Jc0JPRihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfU291cmNlX0lzRU9GKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Tb3VyY2VfQ2FuY2VsKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Tb3VyY2VfVXBkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Tb3VyY2VfT3BlbihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfU291cmNlX0RlbGV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfU291cmNlX0FkZE5ldyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfU291cmNlX1JlcXVlcnkoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9SZXN5bmMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9DbG9zZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfU291cmNlX0xhc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1NvdXJjZV9IYXNEYXRhQ2hhbmdlZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfU291cmNlX0RiKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X1hmYV9UaGlzKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0hhbmRsZXJfVmVyc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9TdWJtaXRGb3JtYXRfTW9kZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9FeHRyYXNfVHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9FbmNyeXB0X0Zvcm1hdChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9TY3JpcHRfU3RhdGVsZXNzKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotcHJvdGVjdGVkOg0KLSAgICBDWEZBX05vZGUoQ1hGQV9Eb2N1bWVudCAqcERvYywgRlhfV09SRCBlUGFja2V0LCBYRkFfRUxFTUVOVCBlRWxlbWVudCk7DQotICAgIH5DWEZBX05vZGUoKTsNCi0gICAgZnJpZW5kIGNsYXNzIENYRkFfRG9jdW1lbnQ7DQotICAgIENYRkFfTm9kZSoJCQlEZXByZWNhdGVkX0dldFByZXZTaWJsaW5nKCk7DQotICAgIEZYX0JPT0wJCQkJU2V0VmFsdWUoWEZBX0FUVFJJQlVURSBlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsIHZvaWQqIHBWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KTsNCi0gICAgRlhfQk9PTAkJCQlHZXRWYWx1ZShYRkFfQVRUUklCVVRFIGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRSBlVHlwZSwgRlhfQk9PTCBiVXNlRGVmYXVsdCwgdm9pZCogJnBWYWx1ZSk7DQotICAgIHZvaWQJCQkJT25SZW1vdmVkKENYRkFfTm9kZSAqcFBhcmVudCwgQ1hGQV9Ob2RlICpwUmVtb3ZlZCwgRlhfQk9PTCBiTm90aWZ5KTsNCi0gICAgdm9pZAkJCQlPbkNoYW5naW5nKFhGQV9BVFRSSUJVVEUgZUF0dHIsIHZvaWQqIHBOZXdWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KTsNCi0gICAgdm9pZAkJCQlPbkNoYW5nZWQoWEZBX0FUVFJJQlVURSBlQXR0ciwgdm9pZCogcE5ld1ZhbHVlLCBGWF9CT09MIGJOb3RpZnksIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFKTsNCi0gICAgaW50MzJfdAkJCWV4ZWNTaW5nbGVFdmVudEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXZlbnROYW1lLCBYRkFfRUxFTUVOVCBlRWxlbWVudFR5cGUpOw0KLSAgICBGWF9CT09MCQkJCVNldFNjcmlwdENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUsIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLCBGWF9CT09MIGJTeW5jRGF0YSA9IFRSVUUpOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJR2V0U2NyaXB0Q29udGVudChGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSk7DQotICAgIFhGQV9MUE1BUE1PRFVMRURBVEEJR2V0TWFwTW9kdWxlRGF0YShGWF9CT09MIGJDcmVhdGVOZXcpOw0KLSAgICB2b2lkCQkJCVNldE1hcE1vZHVsZVZhbHVlKHZvaWQqIHBLZXksIHZvaWQqIHBWYWx1ZSk7DQotICAgIEZYX0JPT0wJCQkJR2V0TWFwTW9kdWxlVmFsdWUodm9pZCogcEtleSwgdm9pZCogJnBWYWx1ZSk7DQotICAgIHZvaWQJCQkJU2V0TWFwTW9kdWxlU3RyaW5nKHZvaWQqIHBLZXksIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSk7DQotICAgIEZYX0JPT0wJCQkJR2V0TWFwTW9kdWxlU3RyaW5nKHZvaWQqIHBLZXksIENGWF9XaWRlU3RyaW5nQyAmd3NWYWx1ZSk7DQotICAgIHZvaWQJCQkJU2V0TWFwTW9kdWxlQnVmZmVyKHZvaWQqIHBLZXksIHZvaWQqIHBWYWx1ZSwgaW50MzJfdCBpQnl0ZXMsIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8qIHBDYWxsYmFja0luZm8gPSBOVUxMKTsNCi0gICAgRlhfQk9PTAkJCQlHZXRNYXBNb2R1bGVCdWZmZXIodm9pZCogcEtleSwgdm9pZCogJnBWYWx1ZSwgaW50MzJfdCAmaUJ5dGVzLCBGWF9CT09MIGJQcm90b0Fsc28gPSBUUlVFKTsNCi0gICAgRlhfQk9PTAkJCQlIYXNNYXBNb2R1bGVLZXkodm9pZCogcEtleSwgRlhfQk9PTCBiUHJvdG9BbHNvID0gRkFMU0UpOw0KLSAgICB2b2lkCQkJCVJlbW92ZU1hcE1vZHVsZUtleSh2b2lkKiBwS2V5ID0gTlVMTCk7DQotICAgIHZvaWQJCQkJTWVyZ2VBbGxEYXRhKHZvaWQqIHBEc3RNb2R1bGUsIEZYX0JPT0wgYlVzZVNyY0F0dHIgPSBUUlVFKTsNCi0gICAgdm9pZAkJCQlNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX05vZGUqIHBEc3RNb2R1bGUsIHZvaWQqIHBLZXkpOw0KLSAgICB2b2lkCQkJCU1vdmVCdWZmZXJNYXBEYXRhKENYRkFfTm9kZSogcFNyY01vZHVsZSwgQ1hGQV9Ob2RlKiBwRHN0TW9kdWxlLCB2b2lkKiBwS2V5LCBGWF9CT09MIGJSZWN1cnNpdmUgPSBGQUxTRSk7DQotcHJvdGVjdGVkOg0KLSAgICBDWEZBX05vZGUJCQkqbV9wTmV4dDsNCi0gICAgQ1hGQV9Ob2RlCQkJKm1fcENoaWxkOw0KLSAgICBDWEZBX05vZGUJCQkqbV9wTGFzdENoaWxkOw0KLSAgICBDWEZBX05vZGUJCQkqbV9wUGFyZW50Ow0KLSAgICBJRkRFX1hNTE5vZGUJCSptX3BYTUxOb2RlOw0KLSAgICBYRkFfRUxFTUVOVAkJCW1fZU5vZGVDbGFzczsNCi0gICAgRlhfV09SRAkJCQltX2VQYWNrZXQ7DQotICAgIEZYX0RXT1JECQkJbV9kd05hbWVIYXNoOw0KLSAgICBDWEZBX05vZGUJCQkqbV9wQXV4Tm9kZTsNCi0gICAgWEZBX0xQTUFQTU9EVUxFREFUQQltX3BNYXBNb2R1bGVEYXRhOw0KLX07DQotY2xhc3MgQ1hGQV9PcmRpbmFyeU9iamVjdCA6IHB1YmxpYyBDWEZBX09iamVjdA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfT3JkaW5hcnlPYmplY3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBYRkFfRUxFTUVOVCBlRWxlbWVudCkgOiBDWEZBX09iamVjdChwRG9jdW1lbnQsIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0KSwgbV91U2NyaXB0SGFzaCgwKQ0KLSAgICB7DQotICAgICAgICBtX2VOb2RlQ2xhc3MgPSBlRWxlbWVudDsNCi0gICAgfQ0KLSAgICBYRkFfRUxFTUVOVAkJCUdldENsYXNzSUQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFhGQV9FTEVNRU5UKW1fZU5vZGVDbGFzczsNCi0gICAgfQ0KLSAgICB1aW50MzJfdAkJCUdldFNjcmlwdE9iakhhc2goKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV91U2NyaXB0SGFzaDsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgWEZBX0VMRU1FTlQJCQltX2VOb2RlQ2xhc3M7DQotICAgIHVpbnQzMl90CQkJbV91U2NyaXB0SGFzaDsNCi19Ow0KLWNsYXNzIENYRkFfVGhpc1Byb3h5IDogcHVibGljIENYRkFfT2JqZWN0DQotew0KLXB1YmxpYyA6DQotICAgIENYRkFfVGhpc1Byb3h5KENYRkFfTm9kZSogcFRoaXNOb2RlLCBDWEZBX05vZGUqIHBTY3JpcHROb2RlKTogQ1hGQV9PYmplY3QocFRoaXNOb2RlLT5HZXREb2N1bWVudCgpLCBYRkFfT0JKRUNUVFlQRV9WYXJpYWJsZXNUaGlzKSwgbV9wVGhpc05vZGUoTlVMTCksIG1fcFNjcmlwdE5vZGUoTlVMTCkNCi0gICAgew0KLSAgICAgICAgbV9wVGhpc05vZGUgPSBwVGhpc05vZGU7DQotICAgICAgICBtX3BTY3JpcHROb2RlID0gcFNjcmlwdE5vZGU7DQotICAgIH0NCi0gICAgdmlydHVhbCB+Q1hGQV9UaGlzUHJveHkoKSB7fQ0KLSAgICBDWEZBX05vZGUqIEdldFRoaXNOb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcFRoaXNOb2RlOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogR2V0U2NyaXB0Tm9kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BTY3JpcHROb2RlOw0KLSAgICB9DQotcHJpdmF0ZToNCi0gICAgQ1hGQV9Ob2RlKiBtX3BUaGlzTm9kZTsNCi0gICAgQ1hGQV9Ob2RlKiBtX3BTY3JpcHROb2RlOw0KLX07DQotY2xhc3MgQ1hGQV9Ob2RlTGlzdCA6IHB1YmxpYyBDWEZBX09iamVjdA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfTm9kZUxpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCi0gICAgdmlydHVhbCB+Q1hGQV9Ob2RlTGlzdCgpIHt9DQotICAgIFhGQV9FTEVNRU5UCQkJR2V0Q2xhc3NJRCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBYRkFfRUxFTUVOVF9Ob2RlTGlzdDsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqCQkJTmFtZWRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CUdldExlbmd0aCgpID0gMDsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlBcHBlbmQoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUluc2VydChDWEZBX05vZGUqIHBOZXdOb2RlLCBDWEZBX05vZGUqIHBCZWZvcmVOb2RlKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpID0gMDsNCi0gICAgdmlydHVhbCBDWEZBX05vZGUqCUl0ZW0oaW50MzJfdCBpSW5kZXgpID0gMDsNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9Ob2RlKENYRkFfRG9jdW1lbnQqIHBEb2MsIEZYX1dPUkQgZVBhY2tldCwgWEZBX0VMRU1FTlQgZUVsZW1lbnQpOw0KKyAgfkNYRkFfTm9kZSgpOw0KKyAgZnJpZW5kIGNsYXNzIENYRkFfRG9jdW1lbnQ7DQorICBDWEZBX05vZGUqIERlcHJlY2F0ZWRfR2V0UHJldlNpYmxpbmcoKTsNCisgIEZYX0JPT0wgU2V0VmFsdWUoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgIHZvaWQqIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5KTsNCisgIEZYX0JPT0wgR2V0VmFsdWUoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQsDQorICAgICAgICAgICAgICAgICAgIHZvaWQqJiBwVmFsdWUpOw0KKyAgdm9pZCBPblJlbW92ZWQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBSZW1vdmVkLCBGWF9CT09MIGJOb3RpZnkpOw0KKyAgdm9pZCBPbkNoYW5naW5nKFhGQV9BVFRSSUJVVEUgZUF0dHIsIHZvaWQqIHBOZXdWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KTsNCisgIHZvaWQgT25DaGFuZ2VkKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICB2b2lkKiBwTmV3VmFsdWUsDQorICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSk7DQorICBpbnQzMl90IGV4ZWNTaW5nbGVFdmVudEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXZlbnROYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnRUeXBlKTsNCisgIEZYX0JPT0wgU2V0U2NyaXB0Q29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEgPSBUUlVFKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldFNjcmlwdENvbnRlbnQoRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UpOw0KKyAgWEZBX0xQTUFQTU9EVUxFREFUQSBHZXRNYXBNb2R1bGVEYXRhKEZYX0JPT0wgYkNyZWF0ZU5ldyk7DQorICB2b2lkIFNldE1hcE1vZHVsZVZhbHVlKHZvaWQqIHBLZXksIHZvaWQqIHBWYWx1ZSk7DQorICBGWF9CT09MIEdldE1hcE1vZHVsZVZhbHVlKHZvaWQqIHBLZXksIHZvaWQqJiBwVmFsdWUpOw0KKyAgdm9pZCBTZXRNYXBNb2R1bGVTdHJpbmcodm9pZCogcEtleSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlKTsNCisgIEZYX0JPT0wgR2V0TWFwTW9kdWxlU3RyaW5nKHZvaWQqIHBLZXksIENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSk7DQorICB2b2lkIFNldE1hcE1vZHVsZUJ1ZmZlcih2b2lkKiBwS2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvID0gTlVMTCk7DQorICBGWF9CT09MIEdldE1hcE1vZHVsZUJ1ZmZlcih2b2lkKiBwS2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByb3RvQWxzbyA9IFRSVUUpOw0KKyAgRlhfQk9PTCBIYXNNYXBNb2R1bGVLZXkodm9pZCogcEtleSwgRlhfQk9PTCBiUHJvdG9BbHNvID0gRkFMU0UpOw0KKyAgdm9pZCBSZW1vdmVNYXBNb2R1bGVLZXkodm9pZCogcEtleSA9IE5VTEwpOw0KKyAgdm9pZCBNZXJnZUFsbERhdGEodm9pZCogcERzdE1vZHVsZSwgRlhfQk9PTCBiVXNlU3JjQXR0ciA9IFRSVUUpOw0KKyAgdm9pZCBNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX05vZGUqIHBEc3RNb2R1bGUsIHZvaWQqIHBLZXkpOw0KKyAgdm9pZCBNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX05vZGUqIHBTcmNNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERzdE1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEtleSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVjdXJzaXZlID0gRkFMU0UpOw0KIA0KLSAgICB2b2lkCVNjcmlwdF9MaXN0Q2xhc3NfQXBwZW5kKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9MaXN0Q2xhc3NfSW5zZXJ0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9MaXN0Q2xhc3NfUmVtb3ZlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9MaXN0Q2xhc3NfSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9Ob2RlKiBtX3BOZXh0Ow0KKyAgQ1hGQV9Ob2RlKiBtX3BDaGlsZDsNCisgIENYRkFfTm9kZSogbV9wTGFzdENoaWxkOw0KKyAgQ1hGQV9Ob2RlKiBtX3BQYXJlbnQ7DQorICBJRkRFX1hNTE5vZGUqIG1fcFhNTE5vZGU7DQorICBYRkFfRUxFTUVOVCBtX2VOb2RlQ2xhc3M7DQorICBGWF9XT1JEIG1fZVBhY2tldDsNCisgIEZYX0RXT1JEIG1fZHdOYW1lSGFzaDsNCisgIENYRkFfTm9kZSogbV9wQXV4Tm9kZTsNCisgIFhGQV9MUE1BUE1PRFVMRURBVEEgbV9wTWFwTW9kdWxlRGF0YTsNCit9Ow0KK2NsYXNzIENYRkFfT3JkaW5hcnlPYmplY3QgOiBwdWJsaWMgQ1hGQV9PYmplY3Qgew0KKyBwdWJsaWM6DQorICBDWEZBX09yZGluYXJ5T2JqZWN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgWEZBX0VMRU1FTlQgZUVsZW1lbnQpDQorICAgICAgOiBDWEZBX09iamVjdChwRG9jdW1lbnQsIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0KSwNCisgICAgICAgIG1fdVNjcmlwdEhhc2goMCkgew0KKyAgICBtX2VOb2RlQ2xhc3MgPSBlRWxlbWVudDsNCisgIH0NCisgIFhGQV9FTEVNRU5UIEdldENsYXNzSUQoKSBjb25zdCB7IHJldHVybiAoWEZBX0VMRU1FTlQpbV9lTm9kZUNsYXNzOyB9DQorICB1aW50MzJfdCBHZXRTY3JpcHRPYmpIYXNoKCkgeyByZXR1cm4gbV91U2NyaXB0SGFzaDsgfQ0KIA0KLSAgICB2b2lkCVNjcmlwdF9UcmVlbGlzdENsYXNzX05hbWVkSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTGlzdENsYXNzX0xlbmd0aChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyBwcm90ZWN0ZWQ6DQorICBYRkFfRUxFTUVOVCBtX2VOb2RlQ2xhc3M7DQorICB1aW50MzJfdCBtX3VTY3JpcHRIYXNoOw0KIH07DQotY2xhc3MgQ1hGQV9BcnJheU5vZGVMaXN0IDogcHVibGljIENYRkFfTm9kZUxpc3QNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0FycmF5Tm9kZUxpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCi0gICAgdm9pZAlTZXRBcnJheU5vZGVMaXN0KGNvbnN0IENYRkFfTm9kZUFycmF5ICZzcmNBcnJheSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAlHZXRMZW5ndGgoKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlBcHBlbmQoQ1hGQV9Ob2RlKiBwTm9kZSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSW5zZXJ0KENYRkFfTm9kZSogcE5ld05vZGUsIENYRkFfTm9kZSogcEJlZm9yZU5vZGUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlbW92ZShDWEZBX05vZGUqIHBOb2RlKTsNCi0gICAgdmlydHVhbCBDWEZBX05vZGUqCUl0ZW0oaW50MzJfdCBpSW5kZXgpOw0KLXByb3RlY3RlZDoNCi0gICAgQ1hGQV9Ob2RlQXJyYXkJbV9hcnJheTsNCi19Ow0KLWNsYXNzIENYRkFfQXR0YWNoTm9kZUxpc3QgOiBwdWJsaWMgQ1hGQV9Ob2RlTGlzdA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfQXR0YWNoTm9kZUxpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBBdHRhY2hOb2RlKTsNCitjbGFzcyBDWEZBX1RoaXNQcm94eSA6IHB1YmxpYyBDWEZBX09iamVjdCB7DQorIHB1YmxpYzoNCisgIENYRkFfVGhpc1Byb3h5KENYRkFfTm9kZSogcFRoaXNOb2RlLCBDWEZBX05vZGUqIHBTY3JpcHROb2RlKQ0KKyAgICAgIDogQ1hGQV9PYmplY3QocFRoaXNOb2RlLT5HZXREb2N1bWVudCgpLCBYRkFfT0JKRUNUVFlQRV9WYXJpYWJsZXNUaGlzKSwNCisgICAgICAgIG1fcFRoaXNOb2RlKE5VTEwpLA0KKyAgICAgICAgbV9wU2NyaXB0Tm9kZShOVUxMKSB7DQorICAgIG1fcFRoaXNOb2RlID0gcFRoaXNOb2RlOw0KKyAgICBtX3BTY3JpcHROb2RlID0gcFNjcmlwdE5vZGU7DQorICB9DQorICB2aXJ0dWFsIH5DWEZBX1RoaXNQcm94eSgpIHt9DQorICBDWEZBX05vZGUqIEdldFRoaXNOb2RlKCkgeyByZXR1cm4gbV9wVGhpc05vZGU7IH0NCisgIENYRkFfTm9kZSogR2V0U2NyaXB0Tm9kZSgpIHsgcmV0dXJuIG1fcFNjcmlwdE5vZGU7IH0NCiANCi0gICAgdmlydHVhbCBpbnQzMl90CUdldExlbmd0aCgpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUFwcGVuZChDWEZBX05vZGUqIHBOb2RlKTsNCi0gICAgdmlydHVhbCBGWF9CT09MCQlJbnNlcnQoQ1hGQV9Ob2RlKiBwTmV3Tm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpOw0KLSAgICB2aXJ0dWFsIENYRkFfTm9kZSoJSXRlbShpbnQzMl90IGlJbmRleCk7DQotcHJvdGVjdGVkOg0KLSAgICBDWEZBX05vZGUqCQltX3BBdHRhY2hOb2RlOw0KKyBwcml2YXRlOg0KKyAgQ1hGQV9Ob2RlKiBtX3BUaGlzTm9kZTsNCisgIENYRkFfTm9kZSogbV9wU2NyaXB0Tm9kZTsNCiB9Ow0KLWNsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIENYRkFfTm9kZSogR2V0Rmlyc3RDaGlsZChDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsIHZvaWQqIHBVc2VyRGF0YSA9IE5VTEwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQotICAgIH0NCi0gICAgc3RhdGljIENYRkFfTm9kZSogR2V0TmV4dFNpYmxpbmcoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLCB2b2lkKiBwVXNlckRhdGEgPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCi0gICAgfQ0KLSAgICBzdGF0aWMgQ1hGQV9Ob2RlKiBHZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLCB2b2lkKiBwVXNlckRhdGEgPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQotICAgIH0NCitjbGFzcyBDWEZBX05vZGVMaXN0IDogcHVibGljIENYRkFfT2JqZWN0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9Ob2RlTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KKyAgdmlydHVhbCB+Q1hGQV9Ob2RlTGlzdCgpIHt9DQorICBYRkFfRUxFTUVOVCBHZXRDbGFzc0lEKCkgY29uc3QgeyByZXR1cm4gWEZBX0VMRU1FTlRfTm9kZUxpc3Q7IH0NCisgIENYRkFfTm9kZSogTmFtZWRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMZW5ndGgoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQXBwZW5kKENYRkFfTm9kZSogcE5vZGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJbnNlcnQoQ1hGQV9Ob2RlKiBwTmV3Tm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlbW92ZShDWEZBX05vZGUqIHBOb2RlKSA9IDA7DQorICB2aXJ0dWFsIENYRkFfTm9kZSogSXRlbShpbnQzMl90IGlJbmRleCkgPSAwOw0KKw0KKyAgdm9pZCBTY3JpcHRfTGlzdENsYXNzX0FwcGVuZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0xpc3RDbGFzc19JbnNlcnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MaXN0Q2xhc3NfUmVtb3ZlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGlzdENsYXNzX0l0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorDQorICB2b2lkIFNjcmlwdF9UcmVlbGlzdENsYXNzX05hbWVkSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0xpc3RDbGFzc19MZW5ndGgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCiB9Ow0KLXR5cGVkZWYgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPiBDWEZBX0NvbnRhaW5lckl0ZXJhdG9yOw0KLWNsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldEZpcnN0Q2hpbGQoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICB9DQotICAgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Ob2RlKiBHZXROZXh0U2libGluZyhDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICB9DQotICAgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Ob2RlKiBHZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgIH0NCitjbGFzcyBDWEZBX0FycmF5Tm9kZUxpc3QgOiBwdWJsaWMgQ1hGQV9Ob2RlTGlzdCB7DQorIHB1YmxpYzoNCisgIENYRkFfQXJyYXlOb2RlTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KKyAgdm9pZCBTZXRBcnJheU5vZGVMaXN0KGNvbnN0IENYRkFfTm9kZUFycmF5JiBzcmNBcnJheSk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGVuZ3RoKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQXBwZW5kKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIEluc2VydChDWEZBX05vZGUqIHBOZXdOb2RlLCBDWEZBX05vZGUqIHBCZWZvcmVOb2RlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZW1vdmUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2aXJ0dWFsIENYRkFfTm9kZSogSXRlbShpbnQzMl90IGlJbmRleCk7DQorDQorIHByb3RlY3RlZDoNCisgIENYRkFfTm9kZUFycmF5IG1fYXJyYXk7DQogfTsNCi10eXBlZGVmIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4gQ1hGQV9Ob2RlSXRlcmF0b3I7DQorY2xhc3MgQ1hGQV9BdHRhY2hOb2RlTGlzdCA6IHB1YmxpYyBDWEZBX05vZGVMaXN0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9BdHRhY2hOb2RlTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIENYRkFfTm9kZSogcEF0dGFjaE5vZGUpOw0KKw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEFwcGVuZChDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJbnNlcnQoQ1hGQV9Ob2RlKiBwTmV3Tm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdmlydHVhbCBDWEZBX05vZGUqIEl0ZW0oaW50MzJfdCBpSW5kZXgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX05vZGUqIG1fcEF0dGFjaE5vZGU7DQorfTsNCitjbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDWEZBX05vZGUqIEdldEZpcnN0Q2hpbGQoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEgPSBOVUxMKSB7DQorICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgfQ0KKyAgc3RhdGljIENYRkFfTm9kZSogR2V0TmV4dFNpYmxpbmcoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhID0gTlVMTCkgew0KKyAgICByZXR1cm4gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICB9DQorICBzdGF0aWMgQ1hGQV9Ob2RlKiBHZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSA9IE5VTEwpIHsNCisgICAgcmV0dXJuIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgIH0NCit9Ow0KK3R5cGVkZWYgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPg0KKyAgICBDWEZBX0NvbnRhaW5lckl0ZXJhdG9yOw0KK2NsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlIHsNCisgcHVibGljOg0KKyAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldEZpcnN0Q2hpbGQoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlKSB7DQorICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICB9DQorICBzdGF0aWMgaW5saW5lIENYRkFfTm9kZSogR2V0TmV4dFNpYmxpbmcoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlKSB7DQorICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldFBhcmVudChDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUpIHsNCisgICAgcmV0dXJuIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgfQ0KK307DQordHlwZWRlZiBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yOw0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaAppbmRleCAwOGE4YjM0Li5jMDZmNTEyIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfcGFyc2VyLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oCkBAIC03LDMzICs3LDM1IEBACiAjaWZuZGVmIF9YRkFfUEFSU0VSX0gNCiAjZGVmaW5lIF9YRkFfUEFSU0VSX0gNCiBjbGFzcyBJRlhfU3RyZWFtOw0KLWNsYXNzIElYRkFfUGFyc2VyDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIElYRkFfUGFyc2VyKgkJCQlDcmVhdGUoSVhGQV9PYmpGYWN0b3J5ICpwRmFjdG9yeSwgRlhfQk9PTCBiRG9jdW1lbnRQYXJzZXIgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwgfklYRkFfUGFyc2VyKCkge30NCi0gICAgdmlydHVhbCB2b2lkCQkJCQlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQkJU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQgKnBTdHJlYW0sIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEID0gWEZBX1hEUFBBQ0tFVF9YRFApID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJCURvUGFyc2UoSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCQlQYXJzZVhNTERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzWE1MLCBJRkRFX1hNTE5vZGUqICZwWE1MTm9kZSwgSUZYX1BhdXNlICpwUGF1c2UgPSBOVUxMKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJQ29uc3RydWN0WEZBTm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlKSA9IDA7DQotICAgIHZpcnR1YWwgSVhGQV9PYmpGYWN0b3J5KgkJR2V0RmFjdG9yeSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBDWEZBX05vZGUqCQkJCUdldFJvb3ROb2RlKCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElGREVfWE1MRG9jKgkJCUdldFhNTERvYygpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCQlDbG9zZVBhcnNlcigpID0gMDsNCitjbGFzcyBJWEZBX1BhcnNlciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJWEZBX1BhcnNlciogQ3JlYXRlKElYRkFfT2JqRmFjdG9yeSogcEZhY3RvcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEb2N1bWVudFBhcnNlciA9IEZBTFNFKTsNCisgIHZpcnR1YWwgfklYRkFfUGFyc2VyKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQgPSBYRkFfWERQUEFDS0VUX1hEUCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IERvUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgUGFyc2VYTUxEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiYgcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENvbnN0cnVjdFhGQU5vZGUoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9PYmpGYWN0b3J5KiBHZXRGYWN0b3J5KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBDWEZBX05vZGUqIEdldFJvb3ROb2RlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX1hNTERvYyogR2V0WE1MRG9jKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENsb3NlUGFyc2VyKCkgPSAwOw0KIH07DQotY2xhc3MgSVhGQV9Eb2NQYXJzZXIgOiBwdWJsaWMgSVhGQV9QYXJzZXINCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSVhGQV9Eb2NQYXJzZXIqCQkJQ3JlYXRlKElYRkFfTm90aWZ5ICpwTm90aWZ5KTsNCi0gICAgdmlydHVhbCBDWEZBX0RvY3VtZW50KgkJCUdldERvY3VtZW50KCkgY29uc3QgPSAwOw0KLSAgICB2aXJ0dWFsIElYRkFfTm90aWZ5KgkJCUdldE5vdGlmeSgpIGNvbnN0ID0gMDsNCitjbGFzcyBJWEZBX0RvY1BhcnNlciA6IHB1YmxpYyBJWEZBX1BhcnNlciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJWEZBX0RvY1BhcnNlciogQ3JlYXRlKElYRkFfTm90aWZ5KiBwTm90aWZ5KTsNCisgIHZpcnR1YWwgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElYRkFfTm90aWZ5KiBHZXROb3RpZnkoKSBjb25zdCA9IDA7DQogfTsNCi1jbGFzcyBJWEZBX0RhdGFMb2FkZXJPcHRpb25zUHJvdmlkZXINCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgSVhGQV9EYXRhTG9hZGVyT3B0aW9uc1Byb3ZpZGVyKglDcmVhdGUoQ1hGQV9Ob2RlKiBwQ29uZmlndXJhdGlvbkRPTSk7DQotICAgIHZpcnR1YWwgfklYRkFfRGF0YUxvYWRlck9wdGlvbnNQcm92aWRlcigpIHt9DQotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlSZWxlYXNlKCkgPSAwOw0KK2NsYXNzIElYRkFfRGF0YUxvYWRlck9wdGlvbnNQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJWEZBX0RhdGFMb2FkZXJPcHRpb25zUHJvdmlkZXIqIENyZWF0ZShDWEZBX05vZGUqIHBDb25maWd1cmF0aW9uRE9NKTsNCisgIHZpcnR1YWwgfklYRkFfRGF0YUxvYWRlck9wdGlvbnNQcm92aWRlcigpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaAppbmRleCBmZDljZGM0Li4zYmRkYzhiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oCkBAIC02LDEwMyArNiwxMDUgQEAKIA0KICNpZm5kZWYgX0ZYRkFfU0NSSVBUX0gNCiAjZGVmaW5lIF9GWEZBX1NDUklQVF9IDQotI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4JCQkweDAwMDENCi0jZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzCQkJMHgwMDA0DQotI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcwkJCTB4MDAwOA0KLSNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzCQkJMHgwMDIwDQotI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfUGFyZW50CQkJCTB4MDA0MA0KLSNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0FueUNoaWxkCQkJMHgwMDgwDQotI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfQUxMCQkJCQkweDAxMDANCi0jZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlCQkJMHgwNDAwDQotI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfQmluZCAJCQkJMHgwODAwDQotI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfQmluZE5ldyAJCQkweDEwMDANCisjZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiAweDAwMDENCisjZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIDB4MDAwNA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgMHgwMDA4DQorI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgMHgwMDIwDQorI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfUGFyZW50IDB4MDA0MA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0FueUNoaWxkIDB4MDA4MA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0FMTCAweDAxMDANCisjZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlIDB4MDQwMA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0JpbmQgMHgwODAwDQorI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfQmluZE5ldyAweDEwMDANCiBlbnVtIFhGQV9TQ1JJUFRMQU5HVFlQRSB7DQotICAgIFhGQV9TQ1JJUFRMQU5HVFlQRV9Gb3JtY2FsYyA9IFhGQV9TQ1JJUFRUWVBFX0Zvcm1jYWxjLA0KLSAgICBYRkFfU0NSSVBUTEFOR1RZUEVfSmF2YXNjcmlwdCA9IFhGQV9TQ1JJUFRUWVBFX0phdmFzY3JpcHQsDQotICAgIFhGQV9TQ1JJUFRMQU5HVFlQRV9Vbmtvd24gPSBYRkFfU0NSSVBUVFlQRV9Vbmtvd24sDQorICBYRkFfU0NSSVBUTEFOR1RZUEVfRm9ybWNhbGMgPSBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYywNCisgIFhGQV9TQ1JJUFRMQU5HVFlQRV9KYXZhc2NyaXB0ID0gWEZBX1NDUklQVFRZUEVfSmF2YXNjcmlwdCwNCisgIFhGQV9TQ1JJUFRMQU5HVFlQRV9Vbmtvd24gPSBYRkFfU0NSSVBUVFlQRV9Vbmtvd24sDQogfTsNCiBlbnVtIFhGQV9SRVNPVkVOT0RFX1JTVFlQRSB7DQotICAgIFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2RlcywNCi0gICAgWEZBX1JFU09WRU5PREVfUlNUWVBFX0F0dHJpYnV0ZSwNCi0gICAgWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlT25lLA0KLSAgICBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVBbGwsDQotICAgIFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU1pZEFsbCwNCi0gICAgWEZBX1JFU09WRU5PREVfUlNUWVBFX0V4aXN0Tm9kZXMsDQorICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMsDQorICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlLA0KKyAgWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlT25lLA0KKyAgWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlQWxsLA0KKyAgWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlTWlkQWxsLA0KKyAgWEZBX1JFU09WRU5PREVfUlNUWVBFX0V4aXN0Tm9kZXMsDQogfTsNCi1jbGFzcyBDWEZBX0hWQUxVRUFycmF5IDogcHVibGljIENGWF9BcnJheVRlbXBsYXRlPEZYSlNFX0hWQUxVRT4NCi17DQotcHVibGljOg0KLSAgICBDWEZBX0hWQUxVRUFycmF5KEZYSlNFX0hSVU5USU1FIGhSdW5UaW1lKSA6IG1faFJ1blRpbWUoaFJ1blRpbWUpIHt9Ow0KLSAgICB+Q1hGQV9IVkFMVUVBcnJheSgpDQotICAgIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IEdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShHZXRBdChpKSk7DQotICAgICAgICB9DQorY2xhc3MgQ1hGQV9IVkFMVUVBcnJheSA6IHB1YmxpYyBDRlhfQXJyYXlUZW1wbGF0ZTxGWEpTRV9IVkFMVUU+IHsNCisgcHVibGljOg0KKyAgQ1hGQV9IVkFMVUVBcnJheShGWEpTRV9IUlVOVElNRSBoUnVuVGltZSkgOiBtX2hSdW5UaW1lKGhSdW5UaW1lKXt9Ow0KKyAgfkNYRkFfSFZBTFVFQXJyYXkoKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IEdldFNpemUoKTsgaSsrKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShHZXRBdChpKSk7DQogICAgIH0NCi0gICAgdm9pZCBHZXRBdHRyaWJ1dGVPYmplY3QoQ1hGQV9PYmpBcnJheSYgb2JqQXJyYXkpDQotICAgIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IEdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KEdldEF0KGkpLCBOVUxMKTsNCi0gICAgICAgICAgICBvYmpBcnJheS5BZGQocE9iamVjdCk7DQotICAgICAgICB9DQorICB9DQorICB2b2lkIEdldEF0dHJpYnV0ZU9iamVjdChDWEZBX09iakFycmF5JiBvYmpBcnJheSkgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBHZXRTaXplKCk7IGkrKykgew0KKyAgICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChHZXRBdChpKSwgTlVMTCk7DQorICAgICAgb2JqQXJyYXkuQWRkKHBPYmplY3QpOw0KICAgICB9DQotICAgIEZYSlNFX0hSVU5USU1FCQltX2hSdW5UaW1lOw0KKyAgfQ0KKyAgRlhKU0VfSFJVTlRJTUUgbV9oUnVuVGltZTsNCiB9Ow0KIHR5cGVkZWYgc3RydWN0IF9YRkFfUkVTT0xWRU5PREVfUlMgew0KLSAgICBfWEZBX1JFU09MVkVOT0RFX1JTKCkgOiBkd0ZsYWdzKFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2RlcyksIHBTY3JpcHRBdHRyaWJ1dGUoTlVMTCkgeyB9DQotICAgIH5fWEZBX1JFU09MVkVOT0RFX1JTKCkNCi0gICAgew0KLSAgICAgICAgbm9kZXMuUmVtb3ZlQWxsKCk7DQorICBfWEZBX1JFU09MVkVOT0RFX1JTKCkNCisgICAgICA6IGR3RmxhZ3MoWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSwgcFNjcmlwdEF0dHJpYnV0ZShOVUxMKSB7fQ0KKyAgfl9YRkFfUkVTT0xWRU5PREVfUlMoKSB7IG5vZGVzLlJlbW92ZUFsbCgpOyB9DQorICBpbnQzMl90IEdldEF0dHJpYnV0ZVJlc3VsdChDWEZBX0hWQUxVRUFycmF5JiBoVmFsdWVBcnJheSkgY29uc3Qgew0KKyAgICBpZiAocFNjcmlwdEF0dHJpYnV0ZSAmJiBwU2NyaXB0QXR0cmlidXRlLT5lVmFsdWVUeXBlID09IFhGQV9TQ1JJUFRfT2JqZWN0KSB7DQorICAgICAgRlhKU0VfSFJVTlRJTUUgaFJ1blRpbWUgPSBoVmFsdWVBcnJheS5tX2hSdW5UaW1lOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5vZGVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhSdW5UaW1lKTsNCisgICAgICAgIChub2Rlc1tpXS0+KihwU2NyaXB0QXR0cmlidXRlLT5scGZuQ2FsbGJhY2spKSgNCisgICAgICAgICAgICBoVmFsdWUsIEZBTFNFLCAoWEZBX0FUVFJJQlVURSlwU2NyaXB0QXR0cmlidXRlLT5lQXR0cmlidXRlKTsNCisgICAgICAgIGhWYWx1ZUFycmF5LkFkZChoVmFsdWUpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpbnQzMl90IEdldEF0dHJpYnV0ZVJlc3VsdChDWEZBX0hWQUxVRUFycmF5JiBoVmFsdWVBcnJheSkgY29uc3QNCi0gICAgew0KLSAgICAgICAgaWYgKHBTY3JpcHRBdHRyaWJ1dGUgJiYgcFNjcmlwdEF0dHJpYnV0ZS0+ZVZhbHVlVHlwZSA9PSBYRkFfU0NSSVBUX09iamVjdCkgew0KLSAgICAgICAgICAgIEZYSlNFX0hSVU5USU1FIGhSdW5UaW1lID0gaFZhbHVlQXJyYXkubV9oUnVuVGltZTsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBub2Rlcy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhSdW5UaW1lKTsNCi0gICAgICAgICAgICAgICAgKG5vZGVzW2ldLT4qKHBTY3JpcHRBdHRyaWJ1dGUtPmxwZm5DYWxsYmFjaykpKGhWYWx1ZSwgRkFMU0UsIChYRkFfQVRUUklCVVRFKXBTY3JpcHRBdHRyaWJ1dGUtPmVBdHRyaWJ1dGUpOw0KLSAgICAgICAgICAgICAgICBoVmFsdWVBcnJheS5BZGQoaFZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaFZhbHVlQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICB9DQotICAgIENYRkFfT2JqQXJyYXkJCQkJbm9kZXM7DQotICAgIFhGQV9SRVNPVkVOT0RFX1JTVFlQRQkJZHdGbGFnczsNCi0gICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8JcFNjcmlwdEF0dHJpYnV0ZTsNCi19IFhGQV9SRVNPTFZFTk9ERV9SUywgKiBYRkFfTFBSRVNPTFZFTk9ERV9SUzsNCisgICAgcmV0dXJuIGhWYWx1ZUFycmF5LkdldFNpemUoKTsNCisgIH0NCisgIENYRkFfT2JqQXJyYXkgbm9kZXM7DQorICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEUgZHdGbGFnczsNCisgIFhGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPIHBTY3JpcHRBdHRyaWJ1dGU7DQorfSBYRkFfUkVTT0xWRU5PREVfUlMsICpYRkFfTFBSRVNPTFZFTk9ERV9SUzsNCiB0eXBlZGVmIHN0cnVjdCBfWEZBX0pTQlVJTFRJTklORk8gew0KLSAgICB1aW50MzJfdAkJCQkJCXVVbmljb2RlSGFzaDsNCi0gICAgY29uc3QgRlhfQ0hBUioJCQkJCQlwTmFtZTsNCi19IFhGQV9KU0JVSUxUSU5JTkZPLCAqIFhGQV9MUEpTQlVJTFRJTklORk87DQotdHlwZWRlZiBYRkFfSlNCVUlMVElOSU5GTyBjb25zdCAqIFhGQV9MUENKU0JVSUxUSU5JTkZPOw0KKyAgdWludDMyX3QgdVVuaWNvZGVIYXNoOw0KKyAgY29uc3QgRlhfQ0hBUiogcE5hbWU7DQorfSBYRkFfSlNCVUlMVElOSU5GTywgKlhGQV9MUEpTQlVJTFRJTklORk87DQordHlwZWRlZiBYRkFfSlNCVUlMVElOSU5GTyBjb25zdCogWEZBX0xQQ0pTQlVJTFRJTklORk87DQogWEZBX0xQQ0pTQlVJTFRJTklORk8gWEZBX0dldEpTQnVpbHRpbkJ5SGFzaCh1aW50MzJfdCB1SGFzaENvZGUpOw0KLWNsYXNzIElYRkFfU2NyaXB0Q29udGV4dA0KLXsNCi1wdWJsaWM6DQotICAgIHZpcnR1YWwgfklYRkFfU2NyaXB0Q29udGV4dCgpIHt9DQotICAgIHZpcnR1YWwgdm9pZAlSZWxlYXNlKCkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJSW5pdGlhbGl6ZShGWEpTRV9IUlVOVElNRSBoUnVudGltZSkgPSAwOw0KK2NsYXNzIElYRkFfU2NyaXB0Q29udGV4dCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfU2NyaXB0Q29udGV4dCgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKSA9IDA7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCQlTZXRFdmVudFBhcmFtKENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pID0gMDsNCi0gICAgdmlydHVhbCBDWEZBX0V2ZW50UGFyYW0qCUdldEV2ZW50UGFyYW0oKSA9IDA7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJUnVuU2NyaXB0KFhGQV9TQ1JJUFRMQU5HVFlQRSBlU2NyaXB0VHlwZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1NjcmlwdCwgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwgQ1hGQV9PYmplY3QqIHBUaGlzT2JqZWN0ID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJUmVzb2x2ZU9iamVjdHMoQ1hGQV9PYmplY3QqIHJlZk5vZGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLCBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc29sdmVOb2RlUlMsIEZYX0RXT1JEIGR3U3R5bGVzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuLCBDWEZBX05vZGUqIGJpbmROb2RlID0gTlVMTCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYSlNFX0hWQUxVRQkJR2V0SlNWYWx1ZUZyb21NYXAoQ1hGQV9PYmplY3QqIHBPYmplY3QpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCUNhY2hlTGlzdChDWEZBX05vZGVMaXN0KiBwTGlzdCkgPSAwOw0KLSAgICB2aXJ0dWFsIENYRkFfT2JqZWN0KgkJR2V0VGhpc09iamVjdCgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBGWEpTRV9IUlVOVElNRQkJR2V0UnVudGltZSgpIGNvbnN0ID0gMDsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0SW5kZXhCeU5hbWUoQ1hGQV9Ob2RlKiByZWZOb2RlKSA9IDA7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldEluZGV4QnlDbGFzc05hbWUoQ1hGQV9Ob2RlKiByZWZOb2RlKSA9IDA7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlHZXRTb21FeHByZXNzaW9uKENYRkFfTm9kZSogcmVmTm9kZSwgQ0ZYX1dpZGVTdHJpbmcgJndzRXhwcmVzc2lvbikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEV2ZW50UGFyYW0oQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX0V2ZW50UGFyYW0qIEdldEV2ZW50UGFyYW0oKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUnVuU2NyaXB0KFhGQV9TQ1JJUFRMQU5HVFlQRSBlU2NyaXB0VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1NjcmlwdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9PYmplY3QqIHBUaGlzT2JqZWN0ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFJlc29sdmVPYmplY3RzKENYRkFfT2JqZWN0KiByZWZOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb2x2ZU5vZGVSUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlcyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIGJpbmROb2RlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWEpTRV9IVkFMVUUgR2V0SlNWYWx1ZUZyb21NYXAoQ1hGQV9PYmplY3QqIHBPYmplY3QpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDYWNoZUxpc3QoQ1hGQV9Ob2RlTGlzdCogcExpc3QpID0gMDsNCisgIHZpcnR1YWwgQ1hGQV9PYmplY3QqIEdldFRoaXNPYmplY3QoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYSlNFX0hSVU5USU1FIEdldFJ1bnRpbWUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SW5kZXhCeU5hbWUoQ1hGQV9Ob2RlKiByZWZOb2RlKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SW5kZXhCeUNsYXNzTmFtZShDWEZBX05vZGUqIHJlZk5vZGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRTb21FeHByZXNzaW9uKENYRkFfTm9kZSogcmVmTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0V4cHJlc3Npb24pID0gMDsNCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCVNldE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlQXJyYXkgKnBBcnJheSkgPSAwOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJQWRkTm9kZXNPZlJ1blNjcmlwdChjb25zdCBDWEZBX05vZGVBcnJheSYgbm9kZXMpID0gMDsNCi0gICAgdmlydHVhbCB2b2lkCQkJCUFkZE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYSlNFX0hDTEFTUwkJR2V0SnNlTm9ybWFsQ2xhc3MoKSA9IDA7DQotICAgIHZpcnR1YWwgWEZBX1NDUklQVExBTkdUWVBFCUdldFR5cGUoKSA9IDA7DQotICAgIHZpcnR1YWwJdm9pZAkJCQlBZGRKU0J1aWx0aW5PYmplY3QoWEZBX0xQQ0pTQlVJTFRJTklORk8gcEJ1aXRpbk9iamVjdCkgPSAwOw0KLSAgICB2aXJ0dWFsCXZvaWQJCQkJU2V0UnVuQXRUeXBlKFhGQV9BVFRSSUJVVEVFTlVNIGVSdW5BdCkgPSAwOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSXNSdW5BdENsaWVudCgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXROb2Rlc09mUnVuU2NyaXB0KENYRkFfTm9kZUFycmF5KiBwQXJyYXkpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBBZGROb2Rlc09mUnVuU2NyaXB0KGNvbnN0IENYRkFfTm9kZUFycmF5JiBub2RlcykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KKyAgdmlydHVhbCBGWEpTRV9IQ0xBU1MgR2V0SnNlTm9ybWFsQ2xhc3MoKSA9IDA7DQorICB2aXJ0dWFsIFhGQV9TQ1JJUFRMQU5HVFlQRSBHZXRUeXBlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZEpTQnVpbHRpbk9iamVjdChYRkFfTFBDSlNCVUlMVElOSU5GTyBwQnVpdGluT2JqZWN0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0UnVuQXRUeXBlKFhGQV9BVFRSSUJVVEVFTlVNIGVSdW5BdCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzUnVuQXRDbGllbnQoKSA9IDA7DQogfTsNCiBJWEZBX1NjcmlwdENvbnRleHQqIFhGQV9TY3JpcHRDb250ZXh0X0NyZWF0ZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgKaW5kZXggMTFhMWMwZS4uYmQzMjM2OSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgKQEAgLTYsMjM0ICs2LDIxMCBAQAogDQogI2lmbmRlZiBfWEZBX1VUSUxTX0hfDQogI2RlZmluZSBfWEZBX1VUSUxTX0hfDQotRlhfQk9PTCBYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIoSUZERV9YTUxFbGVtZW50KiBwTm9kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1F1YWxpZmllciwgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKTsNCitGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZU5hbWVzcGFjZVF1YWxpZmllcigNCisgICAgSUZERV9YTUxFbGVtZW50KiBwTm9kZSwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1F1YWxpZmllciwNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKTsNCiB0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVR5cGUsIGNsYXNzIFRyYXZlcnNlU3RyYXRlZ3k+DQotY2xhc3MgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGUoTm9kZVR5cGUqIHBSb290Tm9kZSA9IE5VTEwpDQotICAgICAgICA6IG1fcFJvb3QocFJvb3ROb2RlKQ0KLSAgICB7DQotICAgICAgICBpZihwUm9vdE5vZGUpIHsNCi0gICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBSb290Tm9kZSk7DQorY2xhc3MgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZSB7DQorIHB1YmxpYzoNCisgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGUoTm9kZVR5cGUqIHBSb290Tm9kZSA9IE5VTEwpIDogbV9wUm9vdChwUm9vdE5vZGUpIHsNCisgICAgaWYgKHBSb290Tm9kZSkgew0KKyAgICAgIG1fTm9kZVN0YWNrLlB1c2gocFJvb3ROb2RlKTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBJbml0KE5vZGVUeXBlKiBwUm9vdE5vZGUpIHsNCisgICAgaWYgKCFwUm9vdE5vZGUpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbV9wUm9vdCA9IHBSb290Tm9kZTsNCisgICAgbV9Ob2RlU3RhY2suUmVtb3ZlQWxsKCk7DQorICAgIG1fTm9kZVN0YWNrLlB1c2gocFJvb3ROb2RlKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICB2b2lkIENsZWFyKCkgeyBtX05vZGVTdGFjay5SZW1vdmVBbGwoKTsgfQ0KKyAgdm9pZCBSZXNldCgpIHsNCisgICAgQ2xlYXIoKTsNCisgICAgaWYgKG1fcFJvb3QpIHsNCisgICAgICBtX05vZGVTdGFjay5QdXNoKG1fcFJvb3QpOw0KKyAgICB9DQorICB9DQorICBGWF9CT09MIFNldEN1cnJlbnQoTm9kZVR5cGUqIHBDdXJOb2RlKSB7DQorICAgIG1fTm9kZVN0YWNrLlJlbW92ZUFsbCgpOw0KKyAgICBpZiAocEN1ck5vZGUpIHsNCisgICAgICBDRlhfU3RhY2tUZW1wbGF0ZTxOb2RlVHlwZSo+IHJldlN0YWNrOw0KKyAgICAgIE5vZGVUeXBlKiBwTm9kZTsNCisgICAgICBmb3IgKHBOb2RlID0gcEN1ck5vZGU7IHBOb2RlICYmIHBOb2RlICE9IG1fcFJvb3Q7DQorICAgICAgICAgICBwTm9kZSA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldFBhcmVudChwTm9kZSkpIHsNCisgICAgICAgIHJldlN0YWNrLlB1c2gocE5vZGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHJldlN0YWNrLlB1c2gobV9wUm9vdCk7DQorICAgICAgd2hpbGUgKHJldlN0YWNrLkdldFNpemUoKSkgew0KKyAgICAgICAgbV9Ob2RlU3RhY2suUHVzaCgqcmV2U3RhY2suR2V0VG9wRWxlbWVudCgpKTsNCisgICAgICAgIHJldlN0YWNrLlBvcCgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIE5vZGVUeXBlKiBHZXRDdXJyZW50KCkgew0KKyAgICByZXR1cm4gbV9Ob2RlU3RhY2suR2V0U2l6ZSgpID8gKm1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKSA6IE5VTEw7DQorICB9DQorICBOb2RlVHlwZSogR2V0Um9vdCgpIHsgcmV0dXJuIG1fcFJvb3Q7IH0NCisgIE5vZGVUeXBlKiBNb3ZlVG9QcmV2KCkgew0KKyAgICBOb2RlVHlwZSogcEN1cnJlbnQgPSBHZXRDdXJyZW50KCk7DQorICAgIGludDMyX3QgblN0YWNrTGVuZ3RoID0gbV9Ob2RlU3RhY2suR2V0U2l6ZSgpOw0KKyAgICBpZiAoblN0YWNrTGVuZ3RoID09IDEpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfSBlbHNlIGlmIChuU3RhY2tMZW5ndGggPiAxKSB7DQorICAgICAgTm9kZVR5cGUqIHBDdXJJdGVtID0gKm1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICBtX05vZGVTdGFjay5Qb3AoKTsNCisgICAgICBOb2RlVHlwZSogcFBhcmVudEl0ZW0gPSAqbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgIE5vZGVUeXBlKiBwUGFyZW50Rmlyc3RDaGlsZEl0ZW0gPQ0KKyAgICAgICAgICBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXRGaXJzdENoaWxkKHBQYXJlbnRJdGVtKTsNCisgICAgICBpZiAocEN1ckl0ZW0gPT0gcFBhcmVudEZpcnN0Q2hpbGRJdGVtKSB7DQorICAgICAgICByZXR1cm4gcFBhcmVudEl0ZW07DQorICAgICAgfQ0KKyAgICAgIE5vZGVUeXBlICpwUHJldkl0ZW0gPSBwUGFyZW50Rmlyc3RDaGlsZEl0ZW0sICpwUHJldkl0ZW1OZXh0ID0gTlVMTDsNCisgICAgICBmb3IgKDsgcFByZXZJdGVtOyBwUHJldkl0ZW0gPSBwUHJldkl0ZW1OZXh0KSB7DQorICAgICAgICBwUHJldkl0ZW1OZXh0ID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0TmV4dFNpYmxpbmcocFByZXZJdGVtKTsNCisgICAgICAgIGlmICghcFByZXZJdGVtTmV4dCB8fCBwUHJldkl0ZW1OZXh0ID09IHBDdXJJdGVtKSB7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBtX05vZGVTdGFjay5QdXNoKHBQcmV2SXRlbSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9Ob2RlU3RhY2suUmVtb3ZlQWxsKCk7DQorICAgICAgaWYgKG1fcFJvb3QpIHsNCisgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gobV9wUm9vdCk7DQorICAgICAgfQ0KICAgICB9DQotICAgIEZYX0JPT0wgSW5pdChOb2RlVHlwZSogcFJvb3ROb2RlKQ0KLSAgICB7DQotICAgICAgICBpZighcFJvb3ROb2RlKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICBpZiAobV9Ob2RlU3RhY2suR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgIE5vZGVUeXBlKiBwQ2hpbGRJdGVtID0gKm1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICB3aGlsZSAoKHBDaGlsZEl0ZW0gPSBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXRGaXJzdENoaWxkKHBDaGlsZEl0ZW0pKSAhPQ0KKyAgICAgICAgICAgICBOVUxMKSB7DQorICAgICAgICB3aGlsZSAoTm9kZVR5cGUqIHBOZXh0SXRlbSA9DQorICAgICAgICAgICAgICAgICAgIFRyYXZlcnNlU3RyYXRlZ3k6OkdldE5leHRTaWJsaW5nKHBDaGlsZEl0ZW0pKSB7DQorICAgICAgICAgIHBDaGlsZEl0ZW0gPSBwTmV4dEl0ZW07DQogICAgICAgICB9DQotICAgICAgICBtX3BSb290ID0gcFJvb3ROb2RlOw0KLSAgICAgICAgbV9Ob2RlU3RhY2suUmVtb3ZlQWxsKCk7DQotICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBSb290Tm9kZSk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gocENoaWxkSXRlbSk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiAqbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KICAgICB9DQotICAgIHZvaWQgQ2xlYXIoKQ0KLSAgICB7DQotICAgICAgICBtX05vZGVTdGFjay5SZW1vdmVBbGwoKTsNCi0gICAgfQ0KLSAgICB2b2lkIFJlc2V0KCkNCi0gICAgew0KLSAgICAgICAgQ2xlYXIoKTsNCi0gICAgICAgIGlmIChtX3BSb290KSB7DQotICAgICAgICAgICAgbV9Ob2RlU3RhY2suUHVzaChtX3BSb290KTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBOb2RlVHlwZSogTW92ZVRvTmV4dCgpIHsNCisgICAgTm9kZVR5cGUqKiBwcE5vZGUgPSBOVUxMOw0KKyAgICBOb2RlVHlwZSogcEN1cnJlbnQgPSBHZXRDdXJyZW50KCk7DQorICAgIHdoaWxlIChtX05vZGVTdGFjay5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgd2hpbGUgKChwcE5vZGUgPSBtX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCkpICE9IE5VTEwpIHsNCisgICAgICAgIGlmIChwQ3VycmVudCAhPSAqcHBOb2RlKSB7DQorICAgICAgICAgIHJldHVybiAqcHBOb2RlOw0KICAgICAgICAgfQ0KLSAgICB9DQotICAgIEZYX0JPT0wgU2V0Q3VycmVudChOb2RlVHlwZSogcEN1ck5vZGUpDQotICAgIHsNCi0gICAgICAgIG1fTm9kZVN0YWNrLlJlbW92ZUFsbCgpOw0KLSAgICAgICAgaWYocEN1ck5vZGUpIHsNCi0gICAgICAgICAgICBDRlhfU3RhY2tUZW1wbGF0ZTxOb2RlVHlwZSo+IHJldlN0YWNrOw0KLSAgICAgICAgICAgIE5vZGVUeXBlKiBwTm9kZTsNCi0gICAgICAgICAgICBmb3IocE5vZGUgPSBwQ3VyTm9kZTsgcE5vZGUgJiYgcE5vZGUgIT0gbV9wUm9vdDsgcE5vZGUgPSBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXRQYXJlbnQocE5vZGUpKSB7DQotICAgICAgICAgICAgICAgIHJldlN0YWNrLlB1c2gocE5vZGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZighcE5vZGUpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXZTdGFjay5QdXNoKG1fcFJvb3QpOw0KLSAgICAgICAgICAgIHdoaWxlKHJldlN0YWNrLkdldFNpemUoKSkgew0KLSAgICAgICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKCpyZXZTdGFjay5HZXRUb3BFbGVtZW50KCkpOw0KLSAgICAgICAgICAgICAgICByZXZTdGFjay5Qb3AoKTsNCi0gICAgICAgICAgICB9DQorICAgICAgICBOb2RlVHlwZSogcENoaWxkID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0Rmlyc3RDaGlsZCgqcHBOb2RlKTsNCisgICAgICAgIGlmIChwQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIE5vZGVUeXBlKiBHZXRDdXJyZW50KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fTm9kZVN0YWNrLkdldFNpemUoKSA/ICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCkgOiBOVUxMOw0KLSAgICB9DQotICAgIE5vZGVUeXBlKiBHZXRSb290KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcFJvb3Q7DQotICAgIH0NCi0gICAgTm9kZVR5cGUqIE1vdmVUb1ByZXYoKQ0KLSAgICB7DQotICAgICAgICBOb2RlVHlwZSAqcEN1cnJlbnQgPSBHZXRDdXJyZW50KCk7DQotICAgICAgICBpbnQzMl90IG5TdGFja0xlbmd0aCA9IG1fTm9kZVN0YWNrLkdldFNpemUoKTsNCi0gICAgICAgIGlmKG5TdGFja0xlbmd0aCA9PSAxKSB7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9IGVsc2UgaWYoblN0YWNrTGVuZ3RoID4gMSkgew0KLSAgICAgICAgICAgIE5vZGVUeXBlICpwQ3VySXRlbSA9ICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQotICAgICAgICAgICAgbV9Ob2RlU3RhY2suUG9wKCk7DQotICAgICAgICAgICAgTm9kZVR5cGUgKnBQYXJlbnRJdGVtID0gKm1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCi0gICAgICAgICAgICBOb2RlVHlwZSAqcFBhcmVudEZpcnN0Q2hpbGRJdGVtID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0Rmlyc3RDaGlsZChwUGFyZW50SXRlbSk7DQotICAgICAgICAgICAgaWYocEN1ckl0ZW0gPT0gcFBhcmVudEZpcnN0Q2hpbGRJdGVtKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwUGFyZW50SXRlbTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgTm9kZVR5cGUgKnBQcmV2SXRlbSA9IHBQYXJlbnRGaXJzdENoaWxkSXRlbSwgKnBQcmV2SXRlbU5leHQgPSBOVUxMOw0KLSAgICAgICAgICAgIGZvcig7IHBQcmV2SXRlbTsgcFByZXZJdGVtID0gcFByZXZJdGVtTmV4dCkgew0KLSAgICAgICAgICAgICAgICBwUHJldkl0ZW1OZXh0ID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0TmV4dFNpYmxpbmcocFByZXZJdGVtKTsNCi0gICAgICAgICAgICAgICAgaWYoIXBQcmV2SXRlbU5leHQgfHwgcFByZXZJdGVtTmV4dCA9PSBwQ3VySXRlbSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9Ob2RlU3RhY2suUHVzaChwUHJldkl0ZW0pOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX05vZGVTdGFjay5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICBpZihtX3BSb290KSB7DQotICAgICAgICAgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gobV9wUm9vdCk7DQotICAgICAgICAgICAgfQ0KKyAgICAgICAgbV9Ob2RlU3RhY2suUHVzaChwQ2hpbGQpOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAoKHBwTm9kZSA9IG1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKSkgIT0gTlVMTCkgew0KKyAgICAgICAgTm9kZVR5cGUqIHBOZXh0ID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0TmV4dFNpYmxpbmcoKnBwTm9kZSk7DQorICAgICAgICBtX05vZGVTdGFjay5Qb3AoKTsNCisgICAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmKG1fTm9kZVN0YWNrLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICBOb2RlVHlwZSAqcENoaWxkSXRlbSA9ICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQotICAgICAgICAgICAgd2hpbGUoKHBDaGlsZEl0ZW0gPSBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXRGaXJzdENoaWxkKHBDaGlsZEl0ZW0pKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIHdoaWxlKE5vZGVUeXBlICpwTmV4dEl0ZW0gPSBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXROZXh0U2libGluZyhwQ2hpbGRJdGVtKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcENoaWxkSXRlbSA9IHBOZXh0SXRlbTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBDaGlsZEl0ZW0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKm1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgIGlmIChwTmV4dCkgew0KKyAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBOZXh0KTsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQogICAgIH0NCi0gICAgTm9kZVR5cGUqIE1vdmVUb05leHQoKQ0KLSAgICB7DQotICAgICAgICBOb2RlVHlwZSAqKnBwTm9kZSA9IE5VTEw7DQotICAgICAgICBOb2RlVHlwZSAqcEN1cnJlbnQgPSBHZXRDdXJyZW50KCk7DQotICAgICAgICB3aGlsZSAobV9Ob2RlU3RhY2suR2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgIHdoaWxlICgocHBOb2RlID0gbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIGlmIChwQ3VycmVudCAhPSAqcHBOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKnBwTm9kZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBOb2RlVHlwZSAqcENoaWxkID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0Rmlyc3RDaGlsZCgqcHBOb2RlKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBDaGlsZCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBDaGlsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdoaWxlICgocHBOb2RlID0gbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpKSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIE5vZGVUeXBlICpwTmV4dCA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldE5leHRTaWJsaW5nKCpwcE5vZGUpOw0KLSAgICAgICAgICAgICAgICBtX05vZGVTdGFjay5Qb3AoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1fTm9kZVN0YWNrLkdldFNpemUoKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAocE5leHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gocE5leHQpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBOb2RlVHlwZSogU2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpIHsNCisgICAgTm9kZVR5cGUqKiBwcE5vZGUgPSBOVUxMOw0KKyAgICB3aGlsZSAoKHBwTm9kZSA9IG1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKSkgIT0gTlVMTCkgew0KKyAgICAgIE5vZGVUeXBlKiBwTmV4dCA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldE5leHRTaWJsaW5nKCpwcE5vZGUpOw0KKyAgICAgIG1fTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChwTmV4dCkgew0KKyAgICAgICAgbV9Ob2RlU3RhY2suUHVzaChwTmV4dCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQogICAgIH0NCi0gICAgTm9kZVR5cGUqIFNraXBDaGlsZHJlbkFuZE1vdmVUb05leHQoKQ0KLSAgICB7DQotICAgICAgICBOb2RlVHlwZSAqKnBwTm9kZSA9IE5VTEw7DQotICAgICAgICB3aGlsZSAoKHBwTm9kZSA9IG1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKSkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIE5vZGVUeXBlICpwTmV4dCA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldE5leHRTaWJsaW5nKCpwcE5vZGUpOw0KLSAgICAgICAgICAgIG1fTm9kZVN0YWNrLlBvcCgpOw0KLSAgICAgICAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHBOZXh0KSB7DQotICAgICAgICAgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gocE5leHQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gR2V0Q3VycmVudCgpOw0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICBOb2RlVHlwZQkJCQkJCSptX3BSb290Ow0KLSAgICBDRlhfU3RhY2tUZW1wbGF0ZTxOb2RlVHlwZSo+CW1fTm9kZVN0YWNrOw0KKyAgICByZXR1cm4gR2V0Q3VycmVudCgpOw0KKyAgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBOb2RlVHlwZSogbV9wUm9vdDsNCisgIENGWF9TdGFja1RlbXBsYXRlPE5vZGVUeXBlKj4gbV9Ob2RlU3RhY2s7DQogfTsNCiB0ZW1wbGF0ZSA8Y2xhc3MgS2V5VHlwZT4NCi1jbGFzcyBDWEZBX1B0clNldFRlbXBsYXRlIDogcHJpdmF0ZSBDRlhfTWFwUHRyVG9QdHINCi17DQotcHVibGljOg0KK2NsYXNzIENYRkFfUHRyU2V0VGVtcGxhdGUgOiBwcml2YXRlIENGWF9NYXBQdHJUb1B0ciB7DQorIHB1YmxpYzoNCisgIENYRkFfUHRyU2V0VGVtcGxhdGUoKSA6IENGWF9NYXBQdHJUb1B0cigxMCkge30NCiANCi0gICAgQ1hGQV9QdHJTZXRUZW1wbGF0ZSgpIDogQ0ZYX01hcFB0clRvUHRyKDEwKSB7fQ0KKyAgaW50IEdldENvdW50KCkgY29uc3QgeyByZXR1cm4gQ0ZYX01hcFB0clRvUHRyOjpHZXRDb3VudCgpOyB9DQogDQotICAgIGludCBHZXRDb3VudCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBDRlhfTWFwUHRyVG9QdHI6OkdldENvdW50KCk7DQotICAgIH0NCisgIEZYX0JPT0wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIENGWF9NYXBQdHJUb1B0cjo6SXNFbXB0eSgpOyB9DQogDQorICBGWF9CT09MIExvb2t1cChLZXlUeXBlIGtleSkgY29uc3Qgew0KKyAgICB2b2lkKiBwVmFsdWUgPSBOVUxMOw0KKyAgICByZXR1cm4gQ0ZYX01hcFB0clRvUHRyOjpMb29rdXAoKHZvaWQqKWtleSwgcFZhbHVlKTsNCisgIH0NCiANCi0gICAgRlhfQk9PTCBJc0VtcHR5KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENGWF9NYXBQdHJUb1B0cjo6SXNFbXB0eSgpOw0KLSAgICB9DQorICBGWF9CT09MIG9wZXJhdG9yW10oS2V5VHlwZSBrZXkpIHsgcmV0dXJuIExvb2t1cChrZXkpOyB9DQogDQotICAgIEZYX0JPT0wJTG9va3VwKEtleVR5cGUga2V5KSBjb25zdA0KLSAgICB7DQotICAgICAgICB2b2lkKiBwVmFsdWUgPSBOVUxMOw0KLSAgICAgICAgcmV0dXJuIENGWF9NYXBQdHJUb1B0cjo6TG9va3VwKCh2b2lkKilrZXksIHBWYWx1ZSk7DQotICAgIH0NCisgIHZvaWQgQWRkKEtleVR5cGUga2V5KSB7IENGWF9NYXBQdHJUb1B0cjo6U2V0QXQoKHZvaWQqKWtleSwgKHZvaWQqKWtleSk7IH0NCiANCi0gICAgRlhfQk9PTCBvcGVyYXRvcltdKEtleVR5cGUga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTG9va3VwKGtleSk7DQotICAgIH0NCisgIEZYX0JPT0wgUmVtb3ZlS2V5KEtleVR5cGUga2V5KSB7DQorICAgIHJldHVybiBDRlhfTWFwUHRyVG9QdHI6OlJlbW92ZUtleSgodm9pZCopa2V5KTsNCisgIH0NCiANCi0gICAgdm9pZCBBZGQoS2V5VHlwZSBrZXkpDQotICAgIHsNCi0gICAgICAgIENGWF9NYXBQdHJUb1B0cjo6U2V0QXQoKHZvaWQqKWtleSwgKHZvaWQqKWtleSk7DQotICAgIH0NCisgIHZvaWQgUmVtb3ZlQWxsKCkgeyBDRlhfTWFwUHRyVG9QdHI6OlJlbW92ZUFsbCgpOyB9DQogDQotICAgIEZYX0JPT0wJUmVtb3ZlS2V5KEtleVR5cGUga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX01hcFB0clRvUHRyOjpSZW1vdmVLZXkoKHZvaWQqKWtleSk7DQotICAgIH0NCisgIEZYX1BPU0lUSU9OIEdldFN0YXJ0UG9zaXRpb24oKSBjb25zdCB7DQorICAgIHJldHVybiBDRlhfTWFwUHRyVG9QdHI6OkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIH0NCiANCi0gICAgdm9pZCBSZW1vdmVBbGwoKQ0KLSAgICB7DQotICAgICAgICBDRlhfTWFwUHRyVG9QdHI6OlJlbW92ZUFsbCgpOw0KLSAgICB9DQotDQotICAgIEZYX1BPU0lUSU9OIEdldFN0YXJ0UG9zaXRpb24oKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ0ZYX01hcFB0clRvUHRyOjpHZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgdm9pZCBHZXROZXh0QXNzb2MoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24sIEtleVR5cGUmIHJLZXkpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHZvaWQqIHBLZXkgPSBOVUxMOw0KLSAgICAgICAgdm9pZCogcFZhbHVlID0gTlVMTDsNCi0gICAgICAgIENGWF9NYXBQdHJUb1B0cjo6R2V0TmV4dEFzc29jKHJOZXh0UG9zaXRpb24sIHBLZXksIHBWYWx1ZSk7DQotICAgICAgICByS2V5ID0gKEtleVR5cGUpKHVpbnRwdHJfdClwS2V5Ow0KLSAgICB9DQorICB2b2lkIEdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbiwgS2V5VHlwZSYgcktleSkgY29uc3Qgew0KKyAgICB2b2lkKiBwS2V5ID0gTlVMTDsNCisgICAgdm9pZCogcFZhbHVlID0gTlVMTDsNCisgICAgQ0ZYX01hcFB0clRvUHRyOjpHZXROZXh0QXNzb2Mock5leHRQb3NpdGlvbiwgcEtleSwgcFZhbHVlKTsNCisgICAgcktleSA9IChLZXlUeXBlKSh1aW50cHRyX3QpcEtleTsNCisgIH0NCiB9Ow0KIGNsYXNzIENYRkFfTm9kZTsNCiBjbGFzcyBDWEZBX1dpZGdldERhdGE7DQogI2luY2x1ZGUgImZ4ZmFfbG9jYWxldmFsdWUuaCINCi1DWEZBX05vZGUqICAgICAgICAgIFhGQV9DcmVhdGVVSUNoaWxkKENYRkFfTm9kZSogcE5vZGUsIFhGQV9FTEVNRU5UJiBlV2lkZ2V0VHlwZSk7DQotQ1hGQV9Mb2NhbGVWYWx1ZSAgICBYRkFfR2V0TG9jYWxlVmFsdWUoQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSk7DQotQ0ZYX1dpZGVTdHJpbmcJICAgIFhGQV9OdW1lcmljTGltaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIGludDMyX3QgaUxlYWQsIGludDMyX3QgaVRyZWFkKTsNCi1GWF9ET1VCTEUgICAgICAgICAgIFhGQV9XaWRlU3RyaW5nVG9Eb3VibGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzU3RyaW5nVmFsKTsNCi1GWF9ET1VCTEUgICAgICAgICAgIFhGQV9CeXRlU3RyaW5nVG9Eb3VibGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelN0cmluZ1ZhbCk7DQotaW50MzJfdCAgICAgICAgICAgIFhGQV9NYXBSb3RhdGlvbihpbnQzMl90IG5Sb3RhdGlvbik7IA0KK0NYRkFfTm9kZSogWEZBX0NyZWF0ZVVJQ2hpbGQoQ1hGQV9Ob2RlKiBwTm9kZSwgWEZBX0VMRU1FTlQmIGVXaWRnZXRUeXBlKTsNCitDWEZBX0xvY2FsZVZhbHVlIFhGQV9HZXRMb2NhbGVWYWx1ZShDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhKTsNCitDRlhfV2lkZVN0cmluZyBYRkFfTnVtZXJpY0xpbWl0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRyZWFkKTsNCitGWF9ET1VCTEUgWEZBX1dpZGVTdHJpbmdUb0RvdWJsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTdHJpbmdWYWwpOw0KK0ZYX0RPVUJMRSBYRkFfQnl0ZVN0cmluZ1RvRG91YmxlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pTdHJpbmdWYWwpOw0KK2ludDMyX3QgWEZBX01hcFJvdGF0aW9uKGludDMyX3QgblJvdGF0aW9uKTsNCiAjaWZuZGVmIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCiAjZGVmaW5lIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCiAjZW5kaWYNCi1GWF9CT09MICAgICAgICAgICAgIFhGQV9SZWNvZ25pemVSaWNoVGV4dChJRkRFX1hNTEVsZW1lbnQqIHBSaWNoVGV4dFhNTE5vZGUpOw0KLXZvaWQgICAgICAgICAgICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dChJRkRFX1hNTE5vZGUgKnBYTUxOb2RlLCBDRlhfV2lkZVN0cmluZyAmd3NQbGFpblRleHQpOw0KLUZYX0JPT0wgICAgICAgICAgICAgWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3goQ1hGQV9Ob2RlKiBwRmllbGROb2RlKTsNCi1JRlhfU3RyZWFtKiAgICAgICAgIFhGQV9DcmVhdGVXaWRlVGV4dFJlYWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQnVmZmVyKTsNCi1GWF9CT09MICAgICAgICAgICAgIFhGQV9Jc0xheW91dEVsZW1lbnQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIEZYX0JPT0wgYkxheW91dENvbnRhaW5lciA9IEZBTFNFKTsNCi1GWF9CT09MICAgICAgICAgICAgIFhGQV9Jc1Rha2luZ3VwU3BhY2UoWEZBX0FUVFJJQlVURUVOVU0gZVByZXNlbmNlKTsNCi1GWF9CT09MICAgICAgICAgICAgIFhGQV9Jc0Zsb3dpbmdMYXlvdXQoWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCk7DQotRlhfQk9PTAkgICAgICAgICAgICBYRkFfSXNIb3Jpem9udGFsRmxvdyhYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0KTsNCi12b2lkICAgICAgICAgICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfRGVhbFdpdGhEYXRhR3JvdXBOb2RlKENYRkFfTm9kZSAqcERhdGFOb2RlKTsNCi12b2lkICAgICAgICAgICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlKENYRkFfTm9kZSogcE5vZGUsIElGWF9TdHJlYW0qIHBTdHJlYW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBwQ2hlY2tzdW0gPSBOVUxMLCBGWF9CT09MIGJTYXZlWE1MID0gRkFMU0UpOw0KK0ZYX0JPT0wgWEZBX1JlY29nbml6ZVJpY2hUZXh0KElGREVfWE1MRWxlbWVudCogcFJpY2hUZXh0WE1MTm9kZSk7DQordm9pZCBYRkFfR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BsYWluVGV4dCk7DQorRlhfQk9PTCBYRkFfRmllbGRJc011bHRpTGlzdEJveChDWEZBX05vZGUqIHBGaWVsZE5vZGUpOw0KK0lGWF9TdHJlYW0qIFhGQV9DcmVhdGVXaWRlVGV4dFJlYWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQnVmZmVyKTsNCitGWF9CT09MIFhGQV9Jc0xheW91dEVsZW1lbnQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxheW91dENvbnRhaW5lciA9IEZBTFNFKTsNCitGWF9CT09MIFhGQV9Jc1Rha2luZ3VwU3BhY2UoWEZBX0FUVFJJQlVURUVOVU0gZVByZXNlbmNlKTsNCitGWF9CT09MIFhGQV9Jc0Zsb3dpbmdMYXlvdXQoWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCk7DQorRlhfQk9PTCBYRkFfSXNIb3Jpem9udGFsRmxvdyhYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0KTsNCit2b2lkIFhGQV9EYXRhRXhwb3J0ZXJfRGVhbFdpdGhEYXRhR3JvdXBOb2RlKENYRkFfTm9kZSogcERhdGFOb2RlKTsNCit2b2lkIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlKENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVYTUwgPSBGQUxTRSk7DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXJyb3IuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXJyb3IuY3BwCmluZGV4IGEyNDY0MTkuLmFkMGNkMzUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2Vycm9yLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9lcnJvci5jcHAKQEAgLTYsMjAgKzYsMTUgQEAKIA0KICNpbmNsdWRlICJ4ZmFfZm0yanMuaCINCiBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIGdzX2xwU3RyRXJyb3JNc2dJbmZvW10gPSB7DQotICAgIEwidW5zdXBwb3J0ZWQgY2hhciAnJWMnIiwNCi0gICAgTCJiYWQgc3VmZml4IG9uIG51bWJlciIsDQotICAgIEwiaW52YWxpZGF0ZSBjaGFyICclYyciLA0KLSAgICBMImV4cGVjdGVkIGlkZW50aWZpZXIgaW5zdGVhZCBvZiAnJXMnIiwNCi0gICAgTCJleHBlY3RlZCAnJXMnIGluc3RlYWQgb2YgJyVzJyIsDQotICAgIEwiZXhwZWN0ZWQgJ2VuZGlmJyBpbnN0ZWFkIG9mICclcyciLA0KLSAgICBMInVuZXhwZWN0ZWQgZXhwcmVzc2lvbiAnJXMnIiwNCi0gICAgTCJleHBlY3RlZCBvcGVyYXRvciAnJXMnIGluc3RlYWQgb2YgJyVzJyIsDQorICAgIEwidW5zdXBwb3J0ZWQgY2hhciAnJWMnIiwgICAgICAgICBMImJhZCBzdWZmaXggb24gbnVtYmVyIiwNCisgICAgTCJpbnZhbGlkYXRlIGNoYXIgJyVjJyIsICAgICAgICAgIEwiZXhwZWN0ZWQgaWRlbnRpZmllciBpbnN0ZWFkIG9mICclcyciLA0KKyAgICBMImV4cGVjdGVkICclcycgaW5zdGVhZCBvZiAnJXMnIiwgTCJleHBlY3RlZCAnZW5kaWYnIGluc3RlYWQgb2YgJyVzJyIsDQorICAgIEwidW5leHBlY3RlZCBleHByZXNzaW9uICclcyciLCAgICBMImV4cGVjdGVkIG9wZXJhdG9yICclcycgaW5zdGVhZCBvZiAnJXMnIiwNCiB9Ow0KLWNvbnN0IEZYX1dDSEFSKiBYRkFfRk1fRXJyb3JNc2coWEZBX0ZNX0VSUk1TRyBtc2cpDQotew0KLSAgICBpZihtc2cgPCBGTUVSUl9NQVhJTVVNKSB7DQotICAgICAgICByZXR1cm4gZ3NfbHBTdHJFcnJvck1zZ0luZm9bbXNnXTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBMIiI7DQotICAgIH0NCitjb25zdCBGWF9XQ0hBUiogWEZBX0ZNX0Vycm9yTXNnKFhGQV9GTV9FUlJNU0cgbXNnKSB7DQorICBpZiAobXNnIDwgRk1FUlJfTUFYSU1VTSkgew0KKyAgICByZXR1cm4gZ3NfbHBTdHJFcnJvck1zZ0luZm9bbXNnXTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBMIiI7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2Vycm9yLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9lcnJvci5oCmluZGV4IDZiOWZjOTIuLjUyZmE0NTcgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2Vycm9yLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXJyb3IuaApAQCAtNywyMyArNywyMiBAQAogI2lmbmRlZiBfWEZBX0ZNX0VSUk9SX0gNCiAjZGVmaW5lIF9YRkFfRk1fRVJST1JfSA0KIGVudW0gWEZBX0ZNX0VSUk1TRyB7DQotICAgIEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsDQotICAgIEZNRVJSX0JBRF9TVUZGSVhfTlVNQkVSLA0KLSAgICBGTUVSUl9JTlZBTElEQVRFX0NIQVIsDQotICAgIEZNRVJSX0VYUEVDVEVEX0lERU5USUZJRVIsDQotICAgIEZNRVJSX0VYUEVDVEVEX1RPS0VOLA0KLSAgICBGTUVSUl9FWFBFQ1RFRF9JRkVORCwNCi0gICAgRk1FUlJfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OLA0KLSAgICBGTUVSUl9FWFBURUNURURfT1BFUkFUT1IsDQotICAgIEZNRVJSX01BWElNVU0NCisgIEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsDQorICBGTUVSUl9CQURfU1VGRklYX05VTUJFUiwNCisgIEZNRVJSX0lOVkFMSURBVEVfQ0hBUiwNCisgIEZNRVJSX0VYUEVDVEVEX0lERU5USUZJRVIsDQorICBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwNCisgIEZNRVJSX0VYUEVDVEVEX0lGRU5ELA0KKyAgRk1FUlJfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OLA0KKyAgRk1FUlJfRVhQVEVDVEVEX09QRVJBVE9SLA0KKyAgRk1FUlJfTUFYSU1VTQ0KIH07DQotY2xhc3MgQ1hGQV9GTUVycm9ySW5mbw0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1FcnJvckluZm8oKSA6IGxpbmVudW0oMCkge307DQotICAgIH5DWEZBX0ZNRXJyb3JJbmZvKCkge307DQotICAgIEZYX0RXT1JEIGxpbmVudW07DQotICAgIENGWF9XaWRlU3RyaW5nIG1lc3NhZ2U7DQorY2xhc3MgQ1hGQV9GTUVycm9ySW5mbyB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1FcnJvckluZm8oKSA6IGxpbmVudW0oMCl7fTsNCisgIH5DWEZBX0ZNRXJyb3JJbmZvKCl7fTsNCisgIEZYX0RXT1JEIGxpbmVudW07DQorICBDRlhfV2lkZVN0cmluZyBtZXNzYWdlOw0KIH07DQotY29uc3QgRlhfV0NIQVIqIFhGQV9GTV9FcnJvck1zZyggWEZBX0ZNX0VSUk1TRyBtc2cpOw0KK2NvbnN0IEZYX1dDSEFSKiBYRkFfRk1fRXJyb3JNc2coWEZBX0ZNX0VSUk1TRyBtc2cpOw0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2V4cHJlc3Npb24uY3BwIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXhwcmVzc2lvbi5jcHAKaW5kZXggYjAxYjExZi4uNDQwY2U1YiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXhwcmVzc2lvbi5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXhwcmVzc2lvbi5jcHAKQEAgLTUsNzExICs1LDY3MiBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAieGZhX2ZtMmpzLmgiDQotc3RhdGljIENGWF9XaWRlU3RyaW5nQyBSVU5USU1FQkxPQ0tURU1QQVJSQVkJCT0JRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZV9ibG9ja190ZW1wX2FycmF5Iik7DQotc3RhdGljIENGWF9XaWRlU3RyaW5nQyBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWAk9CUZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWVfYmxvY2tfdGVtcF9hcnJheV9pbmRleCIpOw0KLUNYRkFfRk1FeHByZXNzaW9uOjpDWEZBX0ZNRXhwcmVzc2lvbiggRlhfRFdPUkQgbGluZSApDQotICAgIDogbV9saW5lKGxpbmUpLCBtX3R5cGUoWEZBX0ZNX0VYUFRZUEVfVU5LTk9XTikNCi17DQotfQ0KK3N0YXRpYyBDRlhfV2lkZVN0cmluZ0MgUlVOVElNRUJMT0NLVEVNUEFSUkFZID0NCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZV9ibG9ja190ZW1wX2FycmF5Iik7DQorc3RhdGljIENGWF9XaWRlU3RyaW5nQyBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWCA9DQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWVfYmxvY2tfdGVtcF9hcnJheV9pbmRleCIpOw0KK0NYRkFfRk1FeHByZXNzaW9uOjpDWEZBX0ZNRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lKQ0KKyAgICA6IG1fbGluZShsaW5lKSwgbV90eXBlKFhGQV9GTV9FWFBUWVBFX1VOS05PV04pIHt9DQogQ1hGQV9GTUV4cHJlc3Npb246OkNYRkFfRk1FeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9FWFBUWVBFIHR5cGUpDQotICAgIDogbV9saW5lKGxpbmUpLCBtX3R5cGUodHlwZSkNCi17DQotfQ0KLXZvaWQgQ1hGQV9GTUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQote30NCi12b2lkIENYRkFfRk1FeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQote30NCi1DWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uOjpDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uKCBGWF9EV09SRCBsaW5lLCBGWF9CT09MIGlzR2xvYmFsLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwgQ0ZYX1dpZGVTdHJpbmdDQXJyYXkgKnBBcmd1bWVudHMsIENGWF9QdHJBcnJheSAqcEV4cHJlc3Npb25zICkNCisgICAgOiBtX2xpbmUobGluZSksIG1fdHlwZSh0eXBlKSB7fQ0KK3ZvaWQgQ1hGQV9GTUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHt9DQordm9pZCBDWEZBX0ZNRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7fQ0KK0NYRkFfRk1GdW5jdGlvbkRlZmluaXRpb246OkNYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24oDQorICAgIEZYX0RXT1JEIGxpbmUsDQorICAgIEZYX0JPT0wgaXNHbG9iYWwsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLA0KKyAgICBDRlhfV2lkZVN0cmluZ0NBcnJheSogcEFyZ3VtZW50cywNCisgICAgQ0ZYX1B0ckFycmF5KiBwRXhwcmVzc2lvbnMpDQogICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfRlVOQyksDQogICAgICAgbV9pc0dsb2JhbChpc0dsb2JhbCksDQogICAgICAgbV93c05hbWUod3NOYW1lKSwNCiAgICAgICBtX3BBcmd1bWVudHMocEFyZ3VtZW50cyksDQotICAgICAgbV9wRXhwcmVzc2lvbnMocEV4cHJlc3Npb25zKQ0KLXsNCisgICAgICBtX3BFeHByZXNzaW9ucyhwRXhwcmVzc2lvbnMpIHt9DQorQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbjo6fkNYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24oKSB7DQorICBpZiAobV9wQXJndW1lbnRzKSB7DQorICAgIG1fcEFyZ3VtZW50cy0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBtX3BBcmd1bWVudHM7DQorICAgIG1fcEFyZ3VtZW50cyA9IDA7DQorICB9DQorICBpZiAobV9wRXhwcmVzc2lvbnMpIHsNCisgICAgaW50MzJfdCBleHBjID0gbV9wRXhwcmVzc2lvbnMtPkdldFNpemUoKTsNCisgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgICAgd2hpbGUgKGluZGV4IDwgZXhwYykgew0KKyAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24qKW1fcEV4cHJlc3Npb25zLT5HZXRBdChpbmRleCk7DQorICAgICAgZGVsZXRlIGU7DQorICAgICAgaW5kZXgrKzsNCisgICAgfQ0KKyAgICBtX3BFeHByZXNzaW9ucy0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBtX3BFeHByZXNzaW9uczsNCisgICAgbV9wRXhwcmVzc2lvbnMgPSAwOw0KKyAgfQ0KIH0NCi1DWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uOjp+Q1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbigpDQotew0KLSAgICBpZiAobV9wQXJndW1lbnRzKSB7DQotICAgICAgICBtX3BBcmd1bWVudHMtPlJlbW92ZUFsbCgpOw0KLSAgICAgICAgZGVsZXRlIG1fcEFyZ3VtZW50czsNCi0gICAgICAgIG1fcEFyZ3VtZW50cyA9IDA7DQordm9pZCBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBpZiAobV9pc0dsb2JhbCAmJiAoIW1fcEV4cHJlc3Npb25zIHx8IG1fcEV4cHJlc3Npb25zLT5HZXRTaXplKCkgPT0gMCkpIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIi8vIGNvbW1lbnRzIG9ubHkiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1faXNHbG9iYWwpIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIihcbiIpOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImZ1bmN0aW9uICIpOw0KKyAgaWYgKG1fd3NOYW1lLkdldEF0KDApID09IEwnIScpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcE5hbWUgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c05hbWUuTWlkKDEpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOw0KKyAgfSBlbHNlIHsNCisgICAgamF2YXNjcmlwdCA8PCBtX3dzTmFtZTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBpZiAobV9wQXJndW1lbnRzICE9IDApIHsNCisgICAgaW50MzJfdCBhcmdjID0gbV9wQXJndW1lbnRzLT5HZXRTaXplKCk7DQorICAgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgICBDRlhfV2lkZVN0cmluZ0MgaWRlbnRpZmllciA9IDA7DQorICAgIHdoaWxlIChpbmRleCA8IGFyZ2MpIHsNCisgICAgICBpZGVudGlmaWVyID0gbV9wQXJndW1lbnRzLT5HZXRBdChpbmRleCk7DQorICAgICAgaWYgKGlkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcElkZW50aWZpZXIgPQ0KKyAgICAgICAgICAgIEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBpZGVudGlmaWVyLk1pZCgxKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcElkZW50aWZpZXI7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgaWRlbnRpZmllcjsNCisgICAgICB9DQorICAgICAgaWYgKGluZGV4ICsgMSA8IGFyZ2MpIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgICAgIH0NCisgICAgICBpbmRleCsrOw0KICAgICB9DQotICAgIGlmIChtX3BFeHByZXNzaW9ucykgew0KLSAgICAgICAgaW50MzJfdCBleHBjID0gbV9wRXhwcmVzc2lvbnMtPkdldFNpemUoKTsNCi0gICAgICAgIGludDMyX3QgaW5kZXggPSAwOw0KLSAgICAgICAgQ1hGQV9GTUV4cHJlc3Npb24gKmUgPSAwOw0KLSAgICAgICAgd2hpbGUgKGluZGV4IDwgZXhwYykgew0KLSAgICAgICAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24gKiltX3BFeHByZXNzaW9ucy0+R2V0QXQoaW5kZXgpOw0KLSAgICAgICAgICAgIGRlbGV0ZSBlOw0KLSAgICAgICAgICAgIGluZGV4Kys7DQotICAgICAgICB9DQotICAgICAgICBtX3BFeHByZXNzaW9ucy0+UmVtb3ZlQWxsKCk7DQotICAgICAgICBkZWxldGUgbV9wRXhwcmVzc2lvbnM7DQotICAgICAgICBtX3BFeHByZXNzaW9ucyA9IDA7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKVxue1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSBudWxsO1xuIik7DQorICBpZiAobV9wRXhwcmVzc2lvbnMpIHsNCisgICAgaW50MzJfdCBleHBjID0gbV9wRXhwcmVzc2lvbnMtPkdldFNpemUoKTsNCisgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgICAgd2hpbGUgKGluZGV4IDwgZXhwYykgew0KKyAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24qKW1fcEV4cHJlc3Npb25zLT5HZXRBdChpbmRleCk7DQorICAgICAgaWYgKGluZGV4ICsgMSA8IGV4cGMpIHsNCisgICAgICAgIGUtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZS0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7DQorICAgICAgfQ0KKyAgICAgIGluZGV4Kys7DQogICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgaWYgKG1faXNHbG9iYWwgJiYgKCFtX3BFeHByZXNzaW9ucyB8fCBtX3BFeHByZXNzaW9ucy0+R2V0U2l6ZSgpID09IDApKSB7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLy8gY29tbWVudHMgb25seSIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmKG1faXNHbG9iYWwpIHsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoXG4iKTsNCi0gICAgfQ0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZnVuY3Rpb24gIik7DQotICAgIGlmIChtX3dzTmFtZS5HZXRBdCgwKSA9PSBMJyEnKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB0ZW1wTmFtZSA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzTmFtZS5NaWQoMSk7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBtX3dzTmFtZTsNCi0gICAgfQ0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInJldHVybiAiKTsNCisgIGlmIChtX2lzR2xvYmFsKSB7DQorICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCiAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgaWYgKG1fcEFyZ3VtZW50cyAhPSAwKSB7DQotICAgICAgICBpbnQzMl90IGFyZ2MgPSBtX3BBcmd1bWVudHMtPkdldFNpemUoKTsNCi0gICAgICAgIGludDMyX3QgaW5kZXggPSAwOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIGlkZW50aWZpZXIgPSAwOw0KLSAgICAgICAgd2hpbGUgKGluZGV4IDwgYXJnYykgew0KLSAgICAgICAgICAgIGlkZW50aWZpZXIgPSBtX3BBcmd1bWVudHMtPkdldEF0KGluZGV4KTsNCi0gICAgICAgICAgICBpZiAoaWRlbnRpZmllci5HZXRBdCgwKSA9PSBMJyEnKSB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHRlbXBJZGVudGlmaWVyID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIGlkZW50aWZpZXIuTWlkKDEpOw0KLSAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBJZGVudGlmaWVyOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgaWRlbnRpZmllcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA8IGFyZ2MpIHsNCi0gICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGluZGV4Kys7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIilcbntcbiIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KICAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gbnVsbDtcbiIpOw0KLSAgICBpZiAobV9wRXhwcmVzc2lvbnMpIHsNCi0gICAgICAgIGludDMyX3QgZXhwYyA9IG1fcEV4cHJlc3Npb25zLT5HZXRTaXplKCk7DQotICAgICAgICBpbnQzMl90IGluZGV4ID0gMDsNCi0gICAgICAgIENYRkFfRk1FeHByZXNzaW9uICplID0gMDsNCi0gICAgICAgIHdoaWxlIChpbmRleCA8IGV4cGMpIHsNCi0gICAgICAgICAgICBlID0gKENYRkFfRk1FeHByZXNzaW9uICopbV9wRXhwcmVzc2lvbnMtPkdldEF0KGluZGV4KTsNCi0gICAgICAgICAgICBpZiAoaW5kZXggKyAxIDwgZXhwYykgew0KLSAgICAgICAgICAgICAgICBlLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZS0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGluZGV4Kys7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInJldHVybiAiKTsNCi0gICAgaWYgKG1faXNHbG9iYWwpIHsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQotICAgIH0NCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjtcbn1cbiIpOw0KLSAgICBpZihtX2lzR2xvYmFsKSB7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKS5jYWxsKHRoaXMpO1xuIik7DQotICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgIH0gZWxzZSB7DQorICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiO1xufVxuIik7DQorICBpZiAobV9pc0dsb2JhbCkgew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKS5jYWxsKHRoaXMpO1xuIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJikNCi17fQ0KLUNYRkFfRk1WYXJFeHByZXNzaW9uOjpDWEZBX0ZNVmFyRXhwcmVzc2lvbiggRlhfRFdPUkQgbGluZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsIENYRkFfRk1FeHByZXNzaW9uICpwSW5pdCApDQordm9pZCBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKSB7fQ0KK0NYRkFfRk1WYXJFeHByZXNzaW9uOjpDWEZBX0ZNVmFyRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTUV4cHJlc3Npb24qIHBJbml0KQ0KICAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX1ZBUiksDQogICAgICAgbV93c05hbWUod3NOYW1lKSwNCi0gICAgICBtX3BJbml0KHBJbml0KQ0KLXsNCisgICAgICBtX3BJbml0KHBJbml0KSB7fQ0KK0NYRkFfRk1WYXJFeHByZXNzaW9uOjp+Q1hGQV9GTVZhckV4cHJlc3Npb24oKSB7DQorICBpZiAobV9wSW5pdCkgew0KKyAgICBkZWxldGUgbV9wSW5pdDsNCisgICAgbV9wSW5pdCA9IDA7DQorICB9DQogfQ0KLUNYRkFfRk1WYXJFeHByZXNzaW9uOjp+Q1hGQV9GTVZhckV4cHJlc3Npb24oKQ0KLXsNCi0gICAgaWYgKG1fcEluaXQpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BJbml0Ow0KLSAgICAgICAgbV9wSW5pdCA9IDA7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNVmFyRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCi17DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgIik7DQotICAgIENGWF9XaWRlU3RyaW5nIHRlbXBOYW1lID0gbV93c05hbWU7DQotICAgIGlmIChtX3dzTmFtZS5HZXRBdCgwKSA9PSBMJyEnKSB7DQotICAgICAgICB0ZW1wTmFtZSA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzTmFtZS5NaWQoMSk7DQotICAgIH0NCit2b2lkIENYRkFfRk1WYXJFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgdGVtcE5hbWUgPSBtX3dzTmFtZTsNCisgIGlmIChtX3dzTmFtZS5HZXRBdCgwKSA9PSBMJyEnKSB7DQorICAgIHRlbXBOYW1lID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NOYW1lLk1pZCgxKTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICBpZiAobV9wSW5pdCkgew0KKyAgICBtX3BJbml0LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQogICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQogICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCi0gICAgaWYgKG1fcEluaXQpIHsNCi0gICAgICAgIG1fcEluaXQtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoVkFSRklMVEVSKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG4iKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIlwiO1xuIik7DQotICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKFZBUkZJTFRFUik7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpO1xuIik7DQorICB9IGVsc2Ugew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCJcIjtcbiIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRk1WYXJFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB0ZW1wTmFtZSA9IG1fd3NOYW1lOw0KLSAgICBpZiAobV93c05hbWUuR2V0QXQoMCkgPT0gTCchJykgew0KLSAgICAgICAgdGVtcE5hbWUgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c05hbWUuTWlkKDEpOw0KLSAgICB9DQordm9pZCBDWEZBX0ZNVmFyRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgdGVtcE5hbWUgPSBtX3dzTmFtZTsNCisgIGlmIChtX3dzTmFtZS5HZXRBdCgwKSA9PSBMJyEnKSB7DQorICAgIHRlbXBOYW1lID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NOYW1lLk1pZCgxKTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICBpZiAobV9wSW5pdCkgew0KKyAgICBtX3BJbml0LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQogICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQogICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCi0gICAgaWYgKG1fcEluaXQpIHsNCi0gICAgICAgIG1fcEluaXQtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoVkFSRklMVEVSKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG4iKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIlwiO1xuIik7DQotICAgIH0NCi0gICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoVkFSRklMVEVSKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCiAgICAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG4iKTsNCisgIH0gZWxzZSB7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIlwiO1xuIik7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG4iKTsNCit9DQorQ1hGQV9GTUV4cEV4cHJlc3Npb246OkNYRkFfRk1FeHBFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwcmVzc2lvbikNCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9FWFApLCBtX3BFeHByZXNzaW9uKHBFeHByZXNzaW9uKSB7fQ0KK0NYRkFfRk1FeHBFeHByZXNzaW9uOjp+Q1hGQV9GTUV4cEV4cHJlc3Npb24oKSB7DQorICBpZiAobV9wRXhwcmVzc2lvbikgew0KKyAgICBkZWxldGUgbV9wRXhwcmVzc2lvbjsNCisgICAgbV9wRXhwcmVzc2lvbiA9IDA7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTUV4cEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGlmIChtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LYXNzaWduKSB7DQorICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIH0gZWxzZSB7DQorICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCiAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjtcbiIpOw0KKyAgfQ0KIH0NCi1DWEZBX0ZNRXhwRXhwcmVzc2lvbjo6Q1hGQV9GTUV4cEV4cHJlc3Npb24oIEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwcmVzc2lvbiApDQotICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfRVhQKSwgbV9wRXhwcmVzc2lvbihwRXhwcmVzc2lvbikNCi17DQotfQ0KLUNYRkFfRk1FeHBFeHByZXNzaW9uOjp+Q1hGQV9GTUV4cEV4cHJlc3Npb24oKQ0KLXsNCi0gICAgaWYgKG1fcEV4cHJlc3Npb24pIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BFeHByZXNzaW9uOw0KLSAgICAgICAgbV9wRXhwcmVzc2lvbiA9IDA7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNRXhwRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCi17DQotICAgIGlmIChtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LYXNzaWduKSB7DQotICAgICAgICBtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQordm9pZCBDWEZBX0ZNRXhwRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBpZiAobV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2Fzc2lnbikgew0KKyAgICBtX3BFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9Lc3RhciB8fA0KKyAgICAgICAgbV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2RvdHN0YXIgfHwNCisgICAgICAgIG1fcEV4cHJlc3Npb24tPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tkb3RzY3JlYW0gfHwNCisgICAgICAgIG1fcEV4cHJlc3Npb24tPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tkb3Rkb3QgfHwNCisgICAgICAgIG1fcEV4cHJlc3Npb24tPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tkb3QpIHsNCisgICAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgICAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgICBtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG4iKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG4iKTsNCisgICAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgICAgICBtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjtcbiIpOw0KICAgICB9DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9GTUV4cEV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCi17DQotICAgIGlmIChtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LYXNzaWduKSB7DQotICAgICAgICBtX3BFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmKCBtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9Lc3RhciB8fA0KLSAgICAgICAgICAgICAgICBtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LZG90c3RhciB8fA0KLSAgICAgICAgICAgICAgICBtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LZG90c2NyZWFtIHx8DQotICAgICAgICAgICAgICAgIG1fcEV4cHJlc3Npb24tPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tkb3Rkb3QgfHwNCi0gICAgICAgICAgICAgICAgbV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2RvdA0KLSAgICAgICAgICApIHsNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQotICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgICAgICAgICBtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG4iKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQotICAgICAgICAgICAgbV9wRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi1DWEZBX0ZNQmxvY2tFeHByZXNzaW9uOjpDWEZBX0ZNQmxvY2tFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENGWF9QdHJBcnJheSAqcEV4cHJlc3Npb25MaXN0ICkNCitDWEZBX0ZNQmxvY2tFeHByZXNzaW9uOjpDWEZBX0ZNQmxvY2tFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBFeHByZXNzaW9uTGlzdCkNCiAgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9CTE9DSyksDQotICAgICAgbV9wRXhwcmVzc2lvbkxpc3QocEV4cHJlc3Npb25MaXN0KQ0KLXsNCi19DQotQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbjo6fkNYRkFfRk1CbG9ja0V4cHJlc3Npb24oKQ0KLXsNCi0gICAgaWYgKG1fcEV4cHJlc3Npb25MaXN0KSB7DQotICAgICAgICBpbnQzMl90IGV4cGMgPSBtX3BFeHByZXNzaW9uTGlzdC0+R2V0U2l6ZSgpOw0KLSAgICAgICAgaW50MzJfdCBpbmRleCA9IDA7DQotICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQotICAgICAgICB3aGlsZSAoaW5kZXggPCBleHBjKSB7DQotICAgICAgICAgICAgZSA9IChDWEZBX0ZNRXhwcmVzc2lvbiAqKW1fcEV4cHJlc3Npb25MaXN0LT5HZXRBdChpbmRleCk7DQotICAgICAgICAgICAgZGVsZXRlIGU7DQotICAgICAgICAgICAgaW5kZXgrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcEV4cHJlc3Npb25MaXN0LT5SZW1vdmVBbGwoKTsNCi0gICAgICAgIGRlbGV0ZSBtX3BFeHByZXNzaW9uTGlzdDsNCi0gICAgICAgIG1fcEV4cHJlc3Npb25MaXN0ID0gMDsNCisgICAgICBtX3BFeHByZXNzaW9uTGlzdChwRXhwcmVzc2lvbkxpc3QpIHt9DQorQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbjo6fkNYRkFfRk1CbG9ja0V4cHJlc3Npb24oKSB7DQorICBpZiAobV9wRXhwcmVzc2lvbkxpc3QpIHsNCisgICAgaW50MzJfdCBleHBjID0gbV9wRXhwcmVzc2lvbkxpc3QtPkdldFNpemUoKTsNCisgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgICAgd2hpbGUgKGluZGV4IDwgZXhwYykgew0KKyAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24qKW1fcEV4cHJlc3Npb25MaXN0LT5HZXRBdChpbmRleCk7DQorICAgICAgZGVsZXRlIGU7DQorICAgICAgaW5kZXgrKzsNCiAgICAgfQ0KKyAgICBtX3BFeHByZXNzaW9uTGlzdC0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBtX3BFeHByZXNzaW9uTGlzdDsNCisgICAgbV9wRXhwcmVzc2lvbkxpc3QgPSAwOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRk1CbG9ja0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQotICAgIGlmIChtX3BFeHByZXNzaW9uTGlzdCkgew0KLSAgICAgICAgaW50MzJfdCBleHBjID0gbV9wRXhwcmVzc2lvbkxpc3QtPkdldFNpemUoKTsNCi0gICAgICAgIGludDMyX3QgaW5kZXggPSAwOw0KLSAgICAgICAgQ1hGQV9GTUV4cHJlc3Npb24gKmUgPSAwOw0KLSAgICAgICAgd2hpbGUgKGluZGV4IDwgZXhwYykgew0KLSAgICAgICAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24gKiltX3BFeHByZXNzaW9uTGlzdC0+R2V0QXQoaW5kZXgpOw0KLSAgICAgICAgICAgIGUtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgICAgICAgICBpbmRleCsrOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIntcbiIpOw0KKyAgaWYgKG1fcEV4cHJlc3Npb25MaXN0KSB7DQorICAgIGludDMyX3QgZXhwYyA9IG1fcEV4cHJlc3Npb25MaXN0LT5HZXRTaXplKCk7DQorICAgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiogZSA9IDA7DQorICAgIHdoaWxlIChpbmRleCA8IGV4cGMpIHsNCisgICAgICBlID0gKENYRkFfRk1FeHByZXNzaW9uKiltX3BFeHByZXNzaW9uTGlzdC0+R2V0QXQoaW5kZXgpOw0KKyAgICAgIGUtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICBpbmRleCsrOw0KICAgICB9DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCiB9DQotdm9pZCBDWEZBX0ZNQmxvY2tFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQotICAgIGlmIChtX3BFeHByZXNzaW9uTGlzdCkgew0KLSAgICAgICAgaW50MzJfdCBleHBjID0gbV9wRXhwcmVzc2lvbkxpc3QtPkdldFNpemUoKTsNCi0gICAgICAgIGludDMyX3QgaW5kZXggPSAwOw0KLSAgICAgICAgQ1hGQV9GTUV4cHJlc3Npb24gKmUgPSAwOw0KLSAgICAgICAgd2hpbGUgKGluZGV4IDwgZXhwYykgew0KLSAgICAgICAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24gKiltX3BFeHByZXNzaW9uTGlzdC0+R2V0QXQoaW5kZXgpOw0KLSAgICAgICAgICAgIGlmIChpbmRleCArIDEgPT0gZXhwYykgew0KLSAgICAgICAgICAgICAgICBlLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBlLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGluZGV4Kys7DQotICAgICAgICB9DQordm9pZCBDWEZBX0ZNQmxvY2tFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ7XG4iKTsNCisgIGlmIChtX3BFeHByZXNzaW9uTGlzdCkgew0KKyAgICBpbnQzMl90IGV4cGMgPSBtX3BFeHByZXNzaW9uTGlzdC0+R2V0U2l6ZSgpOw0KKyAgICBpbnQzMl90IGluZGV4ID0gMDsNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgICB3aGlsZSAoaW5kZXggPCBleHBjKSB7DQorICAgICAgZSA9IChDWEZBX0ZNRXhwcmVzc2lvbiopbV9wRXhwcmVzc2lvbkxpc3QtPkdldEF0KGluZGV4KTsNCisgICAgICBpZiAoaW5kZXggKyAxID09IGV4cGMpIHsNCisgICAgICAgIGUtPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBlLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgfQ0KKyAgICAgIGluZGV4Kys7DQogICAgIH0NCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KIH0NCi1DWEZBX0ZNRG9FeHByZXNzaW9uOjpDWEZBX0ZNRG9FeHByZXNzaW9uKCBGWF9EV09SRCBsaW5lLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcExpc3QgKQ0KLSAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUpLA0KLSAgICAgIG1fcExpc3QocExpc3QpDQotew0KK0NYRkFfRk1Eb0V4cHJlc3Npb246OkNYRkFfRk1Eb0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1FeHByZXNzaW9uKiBwTGlzdCkNCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lKSwgbV9wTGlzdChwTGlzdCkge30NCitDWEZBX0ZNRG9FeHByZXNzaW9uOjp+Q1hGQV9GTURvRXhwcmVzc2lvbigpIHsNCisgIGlmIChtX3BMaXN0KSB7DQorICAgIGRlbGV0ZSBtX3BMaXN0Ow0KKyAgICBtX3BMaXN0ID0gMDsNCisgIH0NCiB9DQotQ1hGQV9GTURvRXhwcmVzc2lvbjo6fkNYRkFfRk1Eb0V4cHJlc3Npb24oKQ0KLXsNCi0gICAgaWYgKG1fcExpc3QpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BMaXN0Ow0KLSAgICAgICAgbV9wTGlzdCA9IDA7DQotICAgIH0NCit2b2lkIENYRkFfRk1Eb0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIG1fcExpc3QtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCiB9DQotdm9pZCBDWEZBX0ZNRG9FeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgbV9wTGlzdC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KK3ZvaWQgQ1hGQV9GTURvRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBtX3BMaXN0LT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCiB9DQotdm9pZCBDWEZBX0ZNRG9FeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBtX3BMaXN0LT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCi19DQotQ1hGQV9GTUlmRXhwcmVzc2lvbjo6Q1hGQV9GTUlmRXhwcmVzc2lvbiggRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHByZXNzaW9uLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcElmRXhwcmVzc2lvbiwgQ1hGQV9GTUV4cHJlc3Npb24gKnBFbHNlRXhwcmVzc2lvbiApDQorQ1hGQV9GTUlmRXhwcmVzc2lvbjo6Q1hGQV9GTUlmRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTUV4cHJlc3Npb24qIHBJZkV4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiogcEVsc2VFeHByZXNzaW9uKQ0KICAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX0lGKSwNCiAgICAgICBtX3BFeHByZXNzaW9uKHBFeHByZXNzaW9uKSwNCiAgICAgICBtX3BJZkV4cHJlc3Npb24ocElmRXhwcmVzc2lvbiksDQotICAgICAgbV9wRWxzZUV4cHJlc3Npb24ocEVsc2VFeHByZXNzaW9uKQ0KLXsNCisgICAgICBtX3BFbHNlRXhwcmVzc2lvbihwRWxzZUV4cHJlc3Npb24pIHt9DQorQ1hGQV9GTUlmRXhwcmVzc2lvbjo6fkNYRkFfRk1JZkV4cHJlc3Npb24oKSB7DQorICBpZiAobV9wRXhwcmVzc2lvbikgew0KKyAgICBkZWxldGUgbV9wRXhwcmVzc2lvbjsNCisgICAgbV9wRXhwcmVzc2lvbiA9IDA7DQorICB9DQorICBpZiAobV9wSWZFeHByZXNzaW9uKSB7DQorICAgIGRlbGV0ZSBtX3BJZkV4cHJlc3Npb247DQorICAgIG1fcElmRXhwcmVzc2lvbiA9IDA7DQorICB9DQorICBpZiAobV9wRWxzZUV4cHJlc3Npb24pIHsNCisgICAgZGVsZXRlIG1fcEVsc2VFeHByZXNzaW9uOw0KKyAgICBtX3BFbHNlRXhwcmVzc2lvbiA9IDA7DQorICB9DQogfQ0KLUNYRkFfRk1JZkV4cHJlc3Npb246On5DWEZBX0ZNSWZFeHByZXNzaW9uKCkNCi17DQotICAgIGlmIChtX3BFeHByZXNzaW9uKSB7DQotICAgICAgICBkZWxldGUgbV9wRXhwcmVzc2lvbjsNCi0gICAgICAgIG1fcEV4cHJlc3Npb24gPSAwOw0KK3ZvaWQgQ1hGQV9GTUlmRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImlmICgiKTsNCisgIGlmIChtX3BFeHByZXNzaW9uKSB7DQorICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIilcbiIpOw0KKyAgaWYgKG1fcElmRXhwcmVzc2lvbikgew0KKyAgICBtX3BJZkV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIH0NCisgIGlmIChtX3BFbHNlRXhwcmVzc2lvbikgew0KKyAgICBpZiAobV9wRWxzZUV4cHJlc3Npb24tPkdldEV4cFR5cGUoKSA9PSBYRkFfRk1fRVhQVFlQRV9JRikgew0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJlbHNlXG4iKTsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQorICAgICAgbV9wRWxzZUV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwifVxuIik7DQorICAgIH0gZWxzZSB7DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImVsc2VcbiIpOw0KKyAgICAgIG1fcEVsc2VFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQogICAgIH0NCi0gICAgaWYgKG1fcElmRXhwcmVzc2lvbikgew0KLSAgICAgICAgZGVsZXRlIG1fcElmRXhwcmVzc2lvbjsNCi0gICAgICAgIG1fcElmRXhwcmVzc2lvbiA9IDA7DQotICAgIH0NCi0gICAgaWYgKG1fcEVsc2VFeHByZXNzaW9uKSB7DQotICAgICAgICBkZWxldGUgbV9wRWxzZUV4cHJlc3Npb247DQotICAgICAgICBtX3BFbHNlRXhwcmVzc2lvbiA9IDA7DQotICAgIH0NCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZNSWZFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImlmICgiKTsNCi0gICAgaWYgKG1fcEV4cHJlc3Npb24pIHsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgICAgICBtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK3ZvaWQgQ1hGQV9GTUlmRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJpZiAoIik7DQorICBpZiAobV9wRXhwcmVzc2lvbikgew0KKyAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCisgIGlmIChtX3BJZkV4cHJlc3Npb24pIHsNCisgICAgbV9wSWZFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCisgIH0NCisgIGlmIChtX3BFbHNlRXhwcmVzc2lvbikgew0KKyAgICBpZiAobV9wRWxzZUV4cHJlc3Npb24tPkdldEV4cFR5cGUoKSA9PSBYRkFfRk1fRVhQVFlQRV9JRikgew0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJlbHNlXG4iKTsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQorICAgICAgbV9wRWxzZUV4cHJlc3Npb24tPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZWxzZVxuIik7DQorICAgICAgbV9wRWxzZUV4cHJlc3Npb24tPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KICAgICB9DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCi0gICAgaWYgKG1fcElmRXhwcmVzc2lvbikgew0KLSAgICAgICAgbV9wSWZFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgIH0NCi0gICAgaWYgKG1fcEVsc2VFeHByZXNzaW9uKSB7DQotICAgICAgICBpZiAobV9wRWxzZUV4cHJlc3Npb24tPkdldEV4cFR5cGUoKSA9PSBYRkFfRk1fRVhQVFlQRV9JRikgew0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJlbHNlXG4iKTsNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQotICAgICAgICAgICAgbV9wRWxzZUV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwifVxuIik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJlbHNlXG4iKTsNCi0gICAgICAgICAgICBtX3BFbHNlRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9GTUlmRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImlmICgiKTsNCi0gICAgaWYgKG1fcEV4cHJlc3Npb24pIHsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgICAgICBtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KLSAgICB9DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCi0gICAgaWYgKG1fcElmRXhwcmVzc2lvbikgew0KLSAgICAgICAgbV9wSWZFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCi0gICAgfQ0KLSAgICBpZiAobV9wRWxzZUV4cHJlc3Npb24pIHsNCi0gICAgICAgIGlmIChtX3BFbHNlRXhwcmVzc2lvbi0+R2V0RXhwVHlwZSgpID09IFhGQV9GTV9FWFBUWVBFX0lGKSB7DQotICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImVsc2VcbiIpOw0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ7XG4iKTsNCi0gICAgICAgICAgICBtX3BFbHNlRXhwcmVzc2lvbi0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7DQotICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZWxzZVxuIik7DQotICAgICAgICAgICAgbV9wRWxzZUV4cHJlc3Npb24tPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLUNYRkFfRk1Mb29wRXhwcmVzc2lvbjo6fkNYRkFfRk1Mb29wRXhwcmVzc2lvbigpDQotew0KLX0NCi12b2lkIENYRkFfRk1Mb29wRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCi17DQotfQ0KLXZvaWQgQ1hGQV9GTUxvb3BFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKQ0KLXt9DQotQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbjo6Q1hGQV9GTVdoaWxlRXhwcmVzc2lvbiggRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBDb25kaXRpb24sIENYRkFfRk1FeHByZXNzaW9uICpwRXhwcmVzc2lvbiApDQorQ1hGQV9GTUxvb3BFeHByZXNzaW9uOjp+Q1hGQV9GTUxvb3BFeHByZXNzaW9uKCkge30NCit2b2lkIENYRkFfRk1Mb29wRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkge30NCit2b2lkIENYRkFfRk1Mb29wRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJikge30NCitDWEZBX0ZNV2hpbGVFeHByZXNzaW9uOjpDWEZBX0ZNV2hpbGVFeHByZXNzaW9uKA0KKyAgICBGWF9EV09SRCBsaW5lLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcENvbmRpdGlvbiwNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24qIHBFeHByZXNzaW9uKQ0KICAgICA6IENYRkFfRk1Mb29wRXhwcmVzc2lvbihsaW5lKSwNCiAgICAgICBtX3BDb25kaXRpb24ocENvbmRpdGlvbiksDQotICAgICAgbV9wRXhwcmVzc2lvbihwRXhwcmVzc2lvbikNCi17DQorICAgICAgbV9wRXhwcmVzc2lvbihwRXhwcmVzc2lvbikge30NCitDWEZBX0ZNV2hpbGVFeHByZXNzaW9uOjp+Q1hGQV9GTVdoaWxlRXhwcmVzc2lvbigpIHsNCisgIGlmIChtX3BDb25kaXRpb24pIHsNCisgICAgZGVsZXRlIG1fcENvbmRpdGlvbjsNCisgICAgbV9wQ29uZGl0aW9uID0gMDsNCisgIH0NCisgIGlmIChtX3BFeHByZXNzaW9uKSB7DQorICAgIGRlbGV0ZSBtX3BFeHByZXNzaW9uOw0KKyAgICBtX3BFeHByZXNzaW9uID0gMDsNCisgIH0NCiB9DQotQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbjo6fkNYRkFfRk1XaGlsZUV4cHJlc3Npb24oKQ0KLXsNCi0gICAgaWYgKG1fcENvbmRpdGlvbikgew0KLSAgICAgICAgZGVsZXRlIG1fcENvbmRpdGlvbjsNCi0gICAgICAgIG1fcENvbmRpdGlvbiA9IDA7DQotICAgIH0NCi0gICAgaWYgKG1fcEV4cHJlc3Npb24pIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BFeHByZXNzaW9uOw0KLSAgICAgICAgbV9wRXhwcmVzc2lvbiA9IDA7DQotICAgIH0NCit2b2lkIENYRkFfRk1XaGlsZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ3aGlsZSAoIik7DQorICBtX3BDb25kaXRpb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCisgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCiB9DQotdm9pZCBDWEZBX0ZNV2hpbGVFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIndoaWxlICgiKTsNCi0gICAgbV9wQ29uZGl0aW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCi0gICAgbV9wRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLX0NCi12b2lkIENYRkFfRk1XaGlsZUV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCi17DQotICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ3aGlsZSAoIik7DQotICAgIG1fcENvbmRpdGlvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKVxuIik7DQotICAgIG1fcEV4cHJlc3Npb24tPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KK3ZvaWQgQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ3aGlsZSAoIik7DQorICBtX3BDb25kaXRpb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCisgIG1fcEV4cHJlc3Npb24tPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KIH0NCiBDWEZBX0ZNQnJlYWtFeHByZXNzaW9uOjpDWEZBX0ZNQnJlYWtFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUpDQotICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfQlJFQUspLA0KLSAgICAgIG1fcEV4cHJlc3Npb24oMCkNCi17DQorICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfQlJFQUspLCBtX3BFeHByZXNzaW9uKDApIHt9DQorQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbjo6fkNYRkFfRk1CcmVha0V4cHJlc3Npb24oKSB7fQ0KK3ZvaWQgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiYnJlYWs7XG4iKTsNCiB9DQotQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbjo6fkNYRkFfRk1CcmVha0V4cHJlc3Npb24oKQ0KLXsNCit2b2lkIENYRkFfRk1CcmVha0V4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiYnJlYWs7XG4iKTsNCiB9DQotdm9pZCBDWEZBX0ZNQnJlYWtFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImJyZWFrO1xuIik7DQorQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbjo6Q1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lKQ0KKyAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX0NPTlRJTlVFKSwgbV9wRXhwcmVzc2lvbigwKSB7fQ0KK0NYRkFfRk1Db250aW51ZUV4cHJlc3Npb246On5DWEZBX0ZNQ29udGludWVFeHByZXNzaW9uKCkge30NCit2b2lkIENYRkFfRk1Db250aW51ZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImNvbnRpbnVlO1xuIik7DQogfQ0KLXZvaWQgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImJyZWFrO1xuIik7DQordm9pZCBDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImNvbnRpbnVlO1xuIik7DQogfQ0KLUNYRkFfRk1Db250aW51ZUV4cHJlc3Npb246OkNYRkFfRk1Db250aW51ZUV4cHJlc3Npb24oIEZYX0RXT1JEIGxpbmUgKQ0KLSAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX0NPTlRJTlVFKSwNCi0gICAgICBtX3BFeHByZXNzaW9uKDApDQotew0KLX0NCi1DWEZBX0ZNQ29udGludWVFeHByZXNzaW9uOjp+Q1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbigpDQotew0KLX0NCi12b2lkIENYRkFfRk1Db250aW51ZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiY29udGludWU7XG4iKTsNCi19DQotdm9pZCBDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiY29udGludWU7XG4iKTsNCi19DQotQ1hGQV9GTUZvckV4cHJlc3Npb246OkNYRkFfRk1Gb3JFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYXJpYW50LCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEFzc2lnbm1lbnQsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQWNjZXNzb3IsIGludDMyX3QgaURpcmVjdGlvbiwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBTdGVwLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcExpc3QpDQorQ1hGQV9GTUZvckV4cHJlc3Npb246OkNYRkFfRk1Gb3JFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYXJpYW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEFzc2lnbm1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwQWNjZXNzb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURpcmVjdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBTdGVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiogcExpc3QpDQogICAgIDogQ1hGQV9GTUxvb3BFeHByZXNzaW9uKGxpbmUpLA0KICAgICAgIG1fd3NWYXJpYW50KHdzVmFyaWFudCksDQogICAgICAgbV9wQXNzaWdubWVudChwQXNzaWdubWVudCksDQogICAgICAgbV9wQWNjZXNzb3IocEFjY2Vzc29yKSwNCiAgICAgICBtX2lEaXJlY3Rpb24oaURpcmVjdGlvbiksDQogICAgICAgbV9wU3RlcChwU3RlcCksDQotICAgICAgbV9wTGlzdChwTGlzdCkNCi17DQorICAgICAgbV9wTGlzdChwTGlzdCkge30NCitDWEZBX0ZNRm9yRXhwcmVzc2lvbjo6fkNYRkFfRk1Gb3JFeHByZXNzaW9uKCkgew0KKyAgaWYgKG1fcEFzc2lnbm1lbnQpIHsNCisgICAgZGVsZXRlIG1fcEFzc2lnbm1lbnQ7DQorICAgIG1fcEFzc2lnbm1lbnQgPSAwOw0KKyAgfQ0KKyAgaWYgKG1fcEFjY2Vzc29yKSB7DQorICAgIGRlbGV0ZSBtX3BBY2Nlc3NvcjsNCisgICAgbV9wQWNjZXNzb3IgPSAwOw0KKyAgfQ0KKyAgaWYgKG1fcFN0ZXApIHsNCisgICAgZGVsZXRlIG1fcFN0ZXA7DQorICAgIG1fcFN0ZXAgPSAwOw0KKyAgfQ0KKyAgaWYgKG1fcExpc3QpIHsNCisgICAgZGVsZXRlIG1fcExpc3Q7DQorICAgIG1fcExpc3QgPSAwOw0KKyAgfQ0KIH0NCi1DWEZBX0ZNRm9yRXhwcmVzc2lvbjo6fkNYRkFfRk1Gb3JFeHByZXNzaW9uKCkNCi17DQotICAgIGlmIChtX3BBc3NpZ25tZW50KSB7DQotICAgICAgICBkZWxldGUgbV9wQXNzaWdubWVudDsNCi0gICAgICAgIG1fcEFzc2lnbm1lbnQgPSAwOw0KLSAgICB9DQotICAgIGlmIChtX3BBY2Nlc3Nvcikgew0KLSAgICAgICAgZGVsZXRlIG1fcEFjY2Vzc29yOw0KLSAgICAgICAgbV9wQWNjZXNzb3IgPSAwOw0KLSAgICB9DQotICAgIGlmIChtX3BTdGVwKSB7DQotICAgICAgICBkZWxldGUgbV9wU3RlcDsNCi0gICAgICAgIG1fcFN0ZXAgPSAwOw0KLSAgICB9DQotICAgIGlmIChtX3BMaXN0KSB7DQotICAgICAgICBkZWxldGUgbV9wTGlzdDsNCi0gICAgICAgIG1fcExpc3QgPSAwOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTUZvckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xudmFyICIpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB0ZW1wVmFyaWFudDsNCi0gICAgaWYgKG1fd3NWYXJpYW50LkdldEF0KDApID09IEwnIScpIHsNCi0gICAgICAgIHRlbXBWYXJpYW50ID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NWYXJpYW50Lk1pZCgxKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgICB0ZW1wVmFyaWFudCA9IG1fd3NWYXJpYW50Ow0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBtX3dzVmFyaWFudDsNCi0gICAgfQ0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gbnVsbDtcbiIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZm9yICgiKTsNCit2b2lkIENYRkFfRk1Gb3JFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xudmFyICIpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgdGVtcFZhcmlhbnQ7DQorICBpZiAobV93c1ZhcmlhbnQuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICB0ZW1wVmFyaWFudCA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzVmFyaWFudC5NaWQoMSk7DQogICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgIH0gZWxzZSB7DQorICAgIHRlbXBWYXJpYW50ID0gbV93c1ZhcmlhbnQ7DQorICAgIGphdmFzY3JpcHQgPDwgbV93c1ZhcmlhbnQ7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gbnVsbDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImZvciAoIik7DQorICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIG1fcEFzc2lnbm1lbnQtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpOyAiKTsNCisgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQorICBpZiAobV9pRGlyZWN0aW9uID09IDEpIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA8PSAiKTsNCiAgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KLSAgICBtX3BBc3NpZ25tZW50LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIG1fcEFjY2Vzc29yLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQogICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpOyAiKTsNCiAgICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCi0gICAgaWYgKG1faURpcmVjdGlvbiA9PSAxKSB7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiIDw9ICIpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgICAgIG1fcEFjY2Vzc29yLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTsgIik7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiArPSAiKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPj0gIik7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KLSAgICAgICAgbV9wQWNjZXNzb3ItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpOyAiKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiIC09ICIpOw0KLSAgICB9DQotICAgIGlmIChtX3BTdGVwKSB7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KLSAgICAgICAgbV9wU3RlcC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIxIik7DQotICAgIH0NCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIilcbiIpOw0KLSAgICBtX3BMaXN0LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCi19DQotdm9pZCBDWEZBX0ZNRm9yRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIntcbnZhciAiKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcFZhcmlhbnQ7DQotICAgIGlmIChtX3dzVmFyaWFudC5HZXRBdCgwKSA9PSBMJyEnKSB7DQotICAgICAgICB0ZW1wVmFyaWFudCA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzVmFyaWFudC5NaWQoMSk7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgdGVtcFZhcmlhbnQgPSBtX3dzVmFyaWFudDsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgbV93c1ZhcmlhbnQ7DQotICAgIH0NCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IG51bGw7XG4iKTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImZvciAoIik7DQotICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiArPSAiKTsNCisgIH0gZWxzZSB7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPj0gIik7DQogICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCiAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgbV9wQXNzaWdubWVudC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBtX3BBY2Nlc3Nvci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTsgIik7DQogICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQotICAgIGlmIChtX2lEaXJlY3Rpb24gPT0gMSkgew0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA8PSAiKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgICAgICBtX3BBY2Nlc3Nvci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7ICIpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgKz0gIik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID49ICIpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgICAgIG1fcEFjY2Vzc29yLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTsgIik7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiAtPSAiKTsNCi0gICAgfQ0KLSAgICBpZiAobV9wU3RlcCkgew0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgICAgIG1fcFN0ZXAtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMSIpOw0KLSAgICB9DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCi0gICAgbV9wTGlzdC0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiAtPSAiKTsNCisgIH0NCisgIGlmIChtX3BTdGVwKSB7DQorICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wU3RlcC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KKyAgfSBlbHNlIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjEiKTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCisgIG1fcExpc3QtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCiB9DQotQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uOjpDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb24oIEZYX0RXT1JEIGxpbmUsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NJZGVudGlmaWVyLCBDRlhfUHRyQXJyYXkgKnBBY2Nlc3NvcnMsIENYRkFfRk1FeHByZXNzaW9uICpwTGlzdCApDQordm9pZCBDWEZBX0ZNRm9yRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ7XG52YXIgIik7DQorICBDRlhfV2lkZVN0cmluZyB0ZW1wVmFyaWFudDsNCisgIGlmIChtX3dzVmFyaWFudC5HZXRBdCgwKSA9PSBMJyEnKSB7DQorICAgIHRlbXBWYXJpYW50ID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NWYXJpYW50Lk1pZCgxKTsNCisgICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCisgIH0gZWxzZSB7DQorICAgIHRlbXBWYXJpYW50ID0gbV93c1ZhcmlhbnQ7DQorICAgIGphdmFzY3JpcHQgPDwgbV93c1ZhcmlhbnQ7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gbnVsbDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImZvciAoIik7DQorICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIG1fcEFzc2lnbm1lbnQtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpOyAiKTsNCisgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQorICBpZiAobV9pRGlyZWN0aW9uID09IDEpIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA8PSAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICBtX3BBY2Nlc3Nvci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTsgIik7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgKz0gIik7DQorICB9IGVsc2Ugew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID49ICIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIG1fcEFjY2Vzc29yLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpOyAiKTsNCisgICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiAtPSAiKTsNCisgIH0NCisgIGlmIChtX3BTdGVwKSB7DQorICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wU3RlcC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KKyAgfSBlbHNlIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjEiKTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCisgIG1fcExpc3QtPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KK30NCitDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb246OkNYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0lkZW50aWZpZXIsDQorICAgIENGWF9QdHJBcnJheSogcEFjY2Vzc29ycywNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24qIHBMaXN0KQ0KICAgICA6IENYRkFfRk1Mb29wRXhwcmVzc2lvbihsaW5lKSwNCiAgICAgICBtX3dzSWRlbnRpZmllcih3c0lkZW50aWZpZXIpLA0KICAgICAgIG1fcEFjY2Vzc29ycyhwQWNjZXNzb3JzKSwNCi0gICAgICBtX3BMaXN0KHBMaXN0KQ0KLXsNCi19DQotQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uOjp+Q1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKCkNCi17DQotICAgIGlmIChtX3BMaXN0KSB7DQotICAgICAgICBkZWxldGUgbV9wTGlzdDsNCi0gICAgICAgIG1fcExpc3QgPSAwOw0KLSAgICB9DQotICAgIGlmIChtX3BBY2Nlc3NvcnMpIHsNCi0gICAgICAgIGludDMyX3Qgc2l6ZSA9IG1fcEFjY2Vzc29ycy0+R2V0U2l6ZSgpOw0KLSAgICAgICAgaW50MzJfdCBpbmRleCA9IDA7DQotICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZSA9IDA7DQotICAgICAgICB3aGlsZSAoaW5kZXggPCBzaXplKSB7DQotICAgICAgICAgICAgZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKW1fcEFjY2Vzc29ycy0+R2V0QXQoaW5kZXgpOw0KLSAgICAgICAgICAgIGRlbGV0ZSBlOw0KLSAgICAgICAgICAgIGluZGV4Kys7DQotICAgICAgICB9DQotICAgICAgICBtX3BBY2Nlc3NvcnMtPlJlbW92ZUFsbCgpOw0KLSAgICAgICAgZGVsZXRlIG1fcEFjY2Vzc29yczsNCi0gICAgICAgIG1fcEFjY2Vzc29ycyA9IDA7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgIik7DQotICAgIGlmIChtX3dzSWRlbnRpZmllci5HZXRBdCgwKSA9PSBMJyEnKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzSWRlbnRpZmllci5NaWQoMSk7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBJZGVudGlmaWVyOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsNCi0gICAgfQ0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gbnVsbDtcbiIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoQ09OQ0FURk1PQkpFQ1QpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KLSAgICBpbnQzMl90IGlTaXplID0gbV9wQWNjZXNzb3JzLT5HZXRTaXplKCk7DQorICAgICAgbV9wTGlzdChwTGlzdCkge30NCitDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb246On5DWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb24oKSB7DQorICBpZiAobV9wTGlzdCkgew0KKyAgICBkZWxldGUgbV9wTGlzdDsNCisgICAgbV9wTGlzdCA9IDA7DQorICB9DQorICBpZiAobV9wQWNjZXNzb3JzKSB7DQorICAgIGludDMyX3Qgc2l6ZSA9IG1fcEFjY2Vzc29ycy0+R2V0U2l6ZSgpOw0KICAgICBpbnQzMl90IGluZGV4ID0gMDsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnMgPSAwOw0KLSAgICB3aGlsZShpbmRleCA8IGlTaXplKSB7DQotICAgICAgICBzID0gKENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICopbV9wQWNjZXNzb3JzLT5HZXRBdChpbmRleCk7DQotICAgICAgICBzLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgICAgICBpZiAoaW5kZXggKyAxIDwgaVNpemUpIHsNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGluZGV4Kys7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBlID0gMDsNCisgICAgd2hpbGUgKGluZGV4IDwgc2l6ZSkgew0KKyAgICAgIGUgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qKW1fcEFjY2Vzc29ycy0+R2V0QXQoaW5kZXgpOw0KKyAgICAgIGRlbGV0ZSBlOw0KKyAgICAgIGluZGV4Kys7DQogICAgIH0NCi0gICAgcyA9IDA7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpO1xuIik7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgIik7DQotICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ3aGlsZSgiKTsNCi0gICAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA8ICIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIi5sZW5ndGgpXG57XG4iKTsNCi0gICAgaWYgKG1fd3NJZGVudGlmaWVyLkdldEF0KDApID09IEwnIScpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHRlbXBJZGVudGlmaWVyID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NJZGVudGlmaWVyLk1pZCgxKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcElkZW50aWZpZXI7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOw0KLSAgICB9DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCi0gICAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJbIik7DQotICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIrK107XG4iKTsNCi0gICAgbV9wTGlzdC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwifVxuIik7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCisgICAgbV9wQWNjZXNzb3JzLT5SZW1vdmVBbGwoKTsNCisgICAgZGVsZXRlIG1fcEFjY2Vzc29yczsNCisgICAgbV9wQWNjZXNzb3JzID0gMDsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCi17DQotICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ7XG4iKTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciAiKTsNCi0gICAgaWYgKG1fd3NJZGVudGlmaWVyLkdldEF0KDApID09IEwnIScpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHRlbXBJZGVudGlmaWVyID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NJZGVudGlmaWVyLk1pZCgxKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcElkZW50aWZpZXI7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOw0KK3ZvaWQgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KKyAgaWYgKG1fd3NJZGVudGlmaWVyLkdldEF0KDApID09IEwnIScpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcElkZW50aWZpZXIgPQ0KKyAgICAgICAgRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NJZGVudGlmaWVyLk1pZCgxKTsNCisgICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsNCisgIH0gZWxzZSB7DQorICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gbnVsbDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciAiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKENPTkNBVEZNT0JKRUNUKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBpbnQzMl90IGlTaXplID0gbV9wQWNjZXNzb3JzLT5HZXRTaXplKCk7DQorICBpbnQzMl90IGluZGV4ID0gMDsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0gMDsNCisgIHdoaWxlIChpbmRleCA8IGlTaXplKSB7DQorICAgIHMgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qKW1fcEFjY2Vzc29ycy0+R2V0QXQoaW5kZXgpOw0KKyAgICBzLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGlmIChpbmRleCArIDEgPCBpU2l6ZSkgew0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KICAgICB9DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSBudWxsO1xuIik7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgIik7DQotICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQotICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhDT05DQVRGTU9CSkVDVCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgIGludDMyX3QgaVNpemUgPSBtX3BBY2Nlc3NvcnMtPkdldFNpemUoKTsNCi0gICAgaW50MzJfdCBpbmRleCA9IDA7DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpzID0gMDsNCi0gICAgd2hpbGUoaW5kZXggPCBpU2l6ZSkgew0KLSAgICAgICAgcyA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKW1fcEFjY2Vzc29ycy0+R2V0QXQoaW5kZXgpOw0KLSAgICAgICAgcy0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICAgICAgaWYgKGluZGV4ICsgMSA8IGlTaXplKSB7DQotICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQotICAgICAgICB9DQotICAgICAgICBpbmRleCsrOw0KKyAgICBpbmRleCsrOw0KKyAgfQ0KKyAgcyA9IDA7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciAiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIndoaWxlKCIpOw0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPCAiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIi5sZW5ndGgpXG57XG4iKTsNCisgIGlmIChtX3dzSWRlbnRpZmllci5HZXRBdCgwKSA9PSBMJyEnKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHRlbXBJZGVudGlmaWVyID0NCisgICAgICAgIEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzSWRlbnRpZmllci5NaWQoMSk7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcElkZW50aWZpZXI7DQorICB9IGVsc2Ugew0KKyAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiWyIpOw0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIrK107XG4iKTsNCisgIG1fcExpc3QtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCit9DQordm9pZCBDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KKyAgaWYgKG1fd3NJZGVudGlmaWVyLkdldEF0KDApID09IEwnIScpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcElkZW50aWZpZXIgPQ0KKyAgICAgICAgRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NJZGVudGlmaWVyLk1pZCgxKTsNCisgICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsNCisgIH0gZWxzZSB7DQorICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gbnVsbDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciAiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKENPTkNBVEZNT0JKRUNUKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBpbnQzMl90IGlTaXplID0gbV9wQWNjZXNzb3JzLT5HZXRTaXplKCk7DQorICBpbnQzMl90IGluZGV4ID0gMDsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0gMDsNCisgIHdoaWxlIChpbmRleCA8IGlTaXplKSB7DQorICAgIHMgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qKW1fcEFjY2Vzc29ycy0+R2V0QXQoaW5kZXgpOw0KKyAgICBzLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGlmIChpbmRleCArIDEgPCBpU2l6ZSkgew0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KICAgICB9DQotICAgIHMgPSAwOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTtcbiIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWUlOREVYOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwid2hpbGUoIik7DQotICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPCAiKTsNCi0gICAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIubGVuZ3RoKVxue1xuIik7DQotICAgIGlmIChtX3dzSWRlbnRpZmllci5HZXRBdCgwKSA9PSBMJyEnKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzSWRlbnRpZmllci5NaWQoMSk7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IHRlbXBJZGVudGlmaWVyOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsNCi0gICAgfQ0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQotICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiWyIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWUlOREVYOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKytdO1xuIik7DQotICAgIG1fcExpc3QtPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwifVxuIik7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCisgICAgaW5kZXgrKzsNCisgIH0NCisgIHMgPSAwOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgIik7DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWUlOREVYOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ3aGlsZSgiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiIDwgIik7DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIubGVuZ3RoKVxue1xuIik7DQorICBpZiAobV93c0lkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICBDRlhfV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9DQorICAgICAgICBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c0lkZW50aWZpZXIuTWlkKDEpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBJZGVudGlmaWVyOw0KKyAgfSBlbHNlIHsNCisgICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlsiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKytdO1xuIik7DQorICBtX3BMaXN0LT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXhwcmVzc2lvbi5oIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXhwcmVzc2lvbi5oCmluZGV4IDg3ZmQ5OWQuLjk1YTY2ZDUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2V4cHJlc3Npb24uaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9leHByZXNzaW9uLmgKQEAgLTcsMTY2ICs3LDE3OCBAQAogI2lmbmRlZiBfWEZBX0ZNX0VYUFJFU1NJT05fSA0KICNkZWZpbmUgX1hGQV9GTV9FWFBSRVNTSU9OX0gNCiBlbnVtIFhGQV9GTV9FWFBUWVBFIHsNCi0gICAgWEZBX0ZNX0VYUFRZUEVfVU5LTk9XTiwNCi0gICAgWEZBX0ZNX0VYUFRZUEVfRlVOQywNCi0gICAgWEZBX0ZNX0VYUFRZUEVfVkFSLA0KLSAgICBYRkFfRk1fRVhQVFlQRV9FWFAsDQotICAgIFhGQV9GTV9FWFBUWVBFX0JMT0NLLA0KLSAgICBYRkFfRk1fRVhQVFlQRV9JRiwNCi0gICAgWEZBX0ZNX0VYUFRZUEVfQlJFQUssDQotICAgIFhGQV9GTV9FWFBUWVBFX0NPTlRJTlVFLA0KKyAgWEZBX0ZNX0VYUFRZUEVfVU5LTk9XTiwNCisgIFhGQV9GTV9FWFBUWVBFX0ZVTkMsDQorICBYRkFfRk1fRVhQVFlQRV9WQVIsDQorICBYRkFfRk1fRVhQVFlQRV9FWFAsDQorICBYRkFfRk1fRVhQVFlQRV9CTE9DSywNCisgIFhGQV9GTV9FWFBUWVBFX0lGLA0KKyAgWEZBX0ZNX0VYUFRZUEVfQlJFQUssDQorICBYRkFfRk1fRVhQVFlQRV9DT05USU5VRSwNCiB9Ow0KLWNsYXNzIENYRkFfRk1FeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSk7DQotICAgIENYRkFfRk1FeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9FWFBUWVBFIHR5cGUpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZNRXhwcmVzc2lvbigpIHt9Ow0KLSAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQotICAgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCi0gICAgRlhfRFdPUkQgR2V0TGluZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2xpbmU7DQotICAgIH0NCi0gICAgWEZBX0ZNX0VYUFRZUEUgR2V0RXhwVHlwZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3R5cGU7DQotICAgIH0NCi1wcm90ZWN0ZWQ6DQotICAgIFhGQV9GTV9FWFBUWVBFIG1fdHlwZTsNCi0gICAgRlhfRFdPUkQgbV9saW5lOw0KK2NsYXNzIENYRkFfRk1FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fRVhQVFlQRSB0eXBlKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1FeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCisgIEZYX0RXT1JEIEdldExpbmUoKSB7IHJldHVybiBtX2xpbmU7IH0NCisgIFhGQV9GTV9FWFBUWVBFIEdldEV4cFR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgWEZBX0ZNX0VYUFRZUEUgbV90eXBlOw0KKyAgRlhfRFdPUkQgbV9saW5lOw0KIH07DQotY2xhc3MgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24oRlhfRFdPUkQgbGluZSwgRlhfQk9PTCBpc0dsb2JhbCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsIENGWF9XaWRlU3RyaW5nQ0FycmF5ICpwQXJndW1lbnRzLCBDRlhfUHRyQXJyYXkgKnBFeHByZXNzaW9ucyk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24oKTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLSAgICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQotcHJpdmF0ZToNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NOYW1lOw0KLSAgICBDRlhfV2lkZVN0cmluZ0NBcnJheSAqbV9wQXJndW1lbnRzOw0KLSAgICBDRlhfUHRyQXJyYXkgKm1fcEV4cHJlc3Npb25zOw0KLSAgICBGWF9CT09MIG1faXNHbG9iYWw7DQorY2xhc3MgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0dsb2JhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQ0FycmF5KiBwQXJndW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBFeHByZXNzaW9ucyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uKCk7DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQorDQorIHByaXZhdGU6DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c05hbWU7DQorICBDRlhfV2lkZVN0cmluZ0NBcnJheSogbV9wQXJndW1lbnRzOw0KKyAgQ0ZYX1B0ckFycmF5KiBtX3BFeHByZXNzaW9uczsNCisgIEZYX0JPT0wgbV9pc0dsb2JhbDsNCiB9Ow0KLWNsYXNzIENYRkFfRk1WYXJFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTVZhckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsIENYRkFfRk1FeHByZXNzaW9uICpwSW5pdCk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1WYXJFeHByZXNzaW9uKCk7DQotICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KLXByaXZhdGU6DQotICAgIENGWF9XaWRlU3RyaW5nQyBtX3dzTmFtZTsNCi0gICAgQ1hGQV9GTUV4cHJlc3Npb24gKm1fcEluaXQ7DQorY2xhc3MgQ1hGQV9GTVZhckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNVmFyRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiogcEluaXQpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTVZhckV4cHJlc3Npb24oKTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9XaWRlU3RyaW5nQyBtX3dzTmFtZTsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBtX3BJbml0Ow0KIH07DQotY2xhc3MgQ1hGQV9GTUV4cEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24NCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZNRXhwRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cHJlc3Npb24pOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZNRXhwRXhwcmVzc2lvbigpOw0KLSAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQotICAgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCi1wcml2YXRlOg0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqbV9wRXhwcmVzc2lvbjsNCitjbGFzcyBDWEZBX0ZNRXhwRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1FeHBFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwcmVzc2lvbik7DQorICB2aXJ0dWFsIH5DWEZBX0ZNRXhwRXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIG1fcEV4cHJlc3Npb247DQogfTsNCi1jbGFzcyBDWEZBX0ZNQmxvY2tFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDRlhfUHRyQXJyYXkgKnBFeHByZXNzaW9uTGlzdCk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1CbG9ja0V4cHJlc3Npb24oKTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLSAgICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQotcHJpdmF0ZToNCi0gICAgQ0ZYX1B0ckFycmF5ICptX3BFeHByZXNzaW9uTGlzdDsNCitjbGFzcyBDWEZBX0ZNQmxvY2tFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDRlhfUHRyQXJyYXkqIHBFeHByZXNzaW9uTGlzdCk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNQmxvY2tFeHByZXNzaW9uKCk7DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQorDQorIHByaXZhdGU6DQorICBDRlhfUHRyQXJyYXkqIG1fcEV4cHJlc3Npb25MaXN0Ow0KIH07DQotY2xhc3MgQ1hGQV9GTURvRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1Eb0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTUV4cHJlc3Npb24gKnBMaXN0KTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GTURvRXhwcmVzc2lvbigpOw0KLSAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQotICAgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCi1wcml2YXRlOg0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqbV9wTGlzdDsNCitjbGFzcyBDWEZBX0ZNRG9FeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTURvRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNRXhwcmVzc2lvbiogcExpc3QpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTURvRXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIG1fcExpc3Q7DQogfTsNCi1jbGFzcyBDWEZBX0ZNSWZFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTUlmRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cHJlc3Npb24sIENYRkFfRk1FeHByZXNzaW9uICpwSWZFeHByZXNzaW9uLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcEVsc2VFeHByZXNzaW9uKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GTUlmRXhwcmVzc2lvbigpOw0KLSAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQotICAgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCi1wcml2YXRlOg0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqbV9wRXhwcmVzc2lvbjsNCi0gICAgQ1hGQV9GTUV4cHJlc3Npb24JKm1fcElmRXhwcmVzc2lvbjsNCi0gICAgQ1hGQV9GTUV4cHJlc3Npb24JKm1fcEVsc2VFeHByZXNzaW9uOw0KK2NsYXNzIENYRkFfRk1JZkV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNSWZFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwcmVzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTUV4cHJlc3Npb24qIHBJZkV4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1FeHByZXNzaW9uKiBwRWxzZUV4cHJlc3Npb24pOw0KKyAgdmlydHVhbCB+Q1hGQV9GTUlmRXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIG1fcEV4cHJlc3Npb247DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogbV9wSWZFeHByZXNzaW9uOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIG1fcEVsc2VFeHByZXNzaW9uOw0KIH07DQotY2xhc3MgQ1hGQV9GTUxvb3BFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTUxvb3BFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUpIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSkge30NCi0gICAgdmlydHVhbCB+Q1hGQV9GTUxvb3BFeHByZXNzaW9uKCk7DQotICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KK2NsYXNzIENYRkFfRk1Mb29wRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1Mb29wRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lKSA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUpIHt9DQorICB2aXJ0dWFsIH5DWEZBX0ZNTG9vcEV4cHJlc3Npb24oKTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCiB9Ow0KLWNsYXNzIENYRkFfRk1XaGlsZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUxvb3BFeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcENvZGl0aW9uLCBDWEZBX0ZNRXhwcmVzc2lvbiAqcEV4cHJlc3Npb24pOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZNV2hpbGVFeHByZXNzaW9uKCk7DQotICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KLXByaXZhdGU6DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICptX3BDb25kaXRpb247DQotICAgIENYRkFfRk1FeHByZXNzaW9uICptX3BFeHByZXNzaW9uOw0KK2NsYXNzIENYRkFfRk1XaGlsZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUxvb3BFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcENvZGl0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiogcEV4cHJlc3Npb24pOw0KKyAgdmlydHVhbCB+Q1hGQV9GTVdoaWxlRXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIG1fcENvbmRpdGlvbjsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBtX3BFeHByZXNzaW9uOw0KIH07DQotY2xhc3MgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1CcmVha0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1CcmVha0V4cHJlc3Npb24oKTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLSAgICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQotcHJpdmF0ZToNCi0gICAgQ1hGQV9GTUxvb3BFeHByZXNzaW9uICptX3BFeHByZXNzaW9uOw0KK2NsYXNzIENYRkFfRk1CcmVha0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNQnJlYWtFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTUJyZWFrRXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ1hGQV9GTUxvb3BFeHByZXNzaW9uKiBtX3BFeHByZXNzaW9uOw0KIH07DQotY2xhc3MgQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1Db250aW51ZUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1Db250aW51ZUV4cHJlc3Npb24oKTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLSAgICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQotcHJpdmF0ZToNCi0gICAgQ1hGQV9GTUxvb3BFeHByZXNzaW9uICptX3BFeHByZXNzaW9uOw0KK2NsYXNzIENYRkFfRk1Db250aW51ZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ1hGQV9GTUxvb3BFeHByZXNzaW9uKiBtX3BFeHByZXNzaW9uOw0KIH07DQotY2xhc3MgQ1hGQV9GTUZvckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUxvb3BFeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTUZvckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhcmlhbnQsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQXNzaWdubWVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBBY2Nlc3NvciwgaW50MzJfdCBpRGlyZWN0aW9uLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcFN0ZXAsIENYRkFfRk1FeHByZXNzaW9uICpwTGlzdCk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1Gb3JFeHByZXNzaW9uKCk7DQotICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KLXByaXZhdGU6DQotICAgIENGWF9XaWRlU3RyaW5nQyBtX3dzVmFyaWFudDsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiBtX3BBc3NpZ25tZW50Ow0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqbV9wQWNjZXNzb3I7DQotICAgIGludDMyX3QgbV9pRGlyZWN0aW9uOw0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqbV9wU3RlcDsNCi0gICAgQ1hGQV9GTUV4cHJlc3Npb24gKm1fcExpc3Q7DQorY2xhc3MgQ1hGQV9GTUZvckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUxvb3BFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUZvckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYXJpYW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBBc3NpZ25tZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBBY2Nlc3NvciwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURpcmVjdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwU3RlcCwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1FeHByZXNzaW9uKiBwTGlzdCk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNRm9yRXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NWYXJpYW50Ow0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIG1fcEFzc2lnbm1lbnQ7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogbV9wQWNjZXNzb3I7DQorICBpbnQzMl90IG1faURpcmVjdGlvbjsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBtX3BTdGVwOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIG1fcExpc3Q7DQogfTsNCi1jbGFzcyBDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUxvb3BFeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NJZGVudGlmaWVyLCBDRlhfUHRyQXJyYXkgKnBBY2Nlc3NvcnMsIENYRkFfRk1FeHByZXNzaW9uICpwTGlzdCk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbigpOw0KLSAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQotICAgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCi1wcml2YXRlOg0KLSAgICBDRlhfV2lkZVN0cmluZ0MgbV93c0lkZW50aWZpZXI7DQotICAgIENGWF9QdHJBcnJheSAqbV9wQWNjZXNzb3JzOw0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqbV9wTGlzdDsNCitjbGFzcyBDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUxvb3BFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0lkZW50aWZpZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBwQWNjZXNzb3JzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1FeHByZXNzaW9uKiBwTGlzdCk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb24oKTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9XaWRlU3RyaW5nQyBtX3dzSWRlbnRpZmllcjsNCisgIENGWF9QdHJBcnJheSogbV9wQWNjZXNzb3JzOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIG1fcExpc3Q7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqcy5oIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanMuaAppbmRleCBhYmJmNDkxLi42OGRhZTcxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqcy5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzLmgKQEAgLTE3LDggKzE3LDEwIEBACiAjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9kZWJ1Zy5oIg0KICNpbmNsdWRlICIuLi9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KICNpbmNsdWRlICIuLi9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQotI2RlZmluZSAgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUUgKEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWVfZnVuY19yZXR1cm5fdmFsdWUiKSkNCi0jZGVmaW5lICBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSCShGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19fZXhjbGFtYXRpb25fXyIpKQ0KKyNkZWZpbmUgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUUgXA0KKyAgKEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWVfZnVuY19yZXR1cm5fdmFsdWUiKSkNCisjZGVmaW5lIEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgXA0KKyAgKEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX19leGNsYW1hdGlvbl9fIikpDQogdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfV2lkZVN0cmluZ0M+IENGWF9XaWRlU3RyaW5nQ0FycmF5Ow0KICNpbmNsdWRlICJ4ZmFfZXJyb3IuaCINCiAjaW5jbHVkZSAieGZhX2xleGVyLmgiDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanNhcGkuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanNhcGkuY3BwCmluZGV4IDQyMDM1ZWYuLjg1YjYwMGIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzYXBpLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2FwaS5jcHAKQEAgLTYsNTEgKzYsNTIgQEAKIA0KICNpbmNsdWRlICJ4ZmFfZm0yanMuaCINCiAjaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiDQotew0KK2V4dGVybiAiQyIgew0KICNlbmRpZg0KLWludDMyX3QgWEZBX0ZNMkpTX1RyYW5zbGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybWNhbGMsIENGWF9XaWRlVGV4dEJ1ZiYgd3NKYXZhc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgd3NFcnJvcikNCi17DQotICAgIGlmICh3c0Zvcm1jYWxjLklzRW1wdHkoKSkgew0KLSAgICAgICAgd3NKYXZhc2NyaXB0LkNsZWFyKCk7DQotICAgICAgICB3c0Vycm9yLkVtcHR5KCk7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IHN0YXR1cyA9IDA7DQotICAgIENYRkFfRk1Qcm9ncmFtIHByb2dyYW07DQotICAgIHN0YXR1cyA9IHByb2dyYW0uSW5pdCh3c0Zvcm1jYWxjKTsNCi0gICAgaWYoc3RhdHVzKSB7DQotICAgICAgICB3c0Vycm9yID0gcHJvZ3JhbS5HZXRFcnJvcigpLm1lc3NhZ2U7DQotICAgICAgICByZXR1cm4gc3RhdHVzOw0KLSAgICB9DQotICAgIHN0YXR1cyA9IHByb2dyYW0uUGFyc2VQcm9ncmFtKCk7DQotICAgIGlmKHN0YXR1cykgew0KLSAgICAgICAgd3NFcnJvciA9IHByb2dyYW0uR2V0RXJyb3IoKS5tZXNzYWdlOw0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsNCi0gICAgfQ0KLSAgICBwcm9ncmFtLlRyYW5zbGF0ZVByb2dyYW0od3NKYXZhc2NyaXB0KTsNCitpbnQzMl90IFhGQV9GTTJKU19UcmFuc2xhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVRleHRCdWYmIHdzSmF2YXNjcmlwdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRXJyb3IpIHsNCisgIGlmICh3c0Zvcm1jYWxjLklzRW1wdHkoKSkgew0KKyAgICB3c0phdmFzY3JpcHQuQ2xlYXIoKTsNCisgICAgd3NFcnJvci5FbXB0eSgpOw0KICAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3Qgc3RhdHVzID0gMDsNCisgIENYRkFfRk1Qcm9ncmFtIHByb2dyYW07DQorICBzdGF0dXMgPSBwcm9ncmFtLkluaXQod3NGb3JtY2FsYyk7DQorICBpZiAoc3RhdHVzKSB7DQorICAgIHdzRXJyb3IgPSBwcm9ncmFtLkdldEVycm9yKCkubWVzc2FnZTsNCisgICAgcmV0dXJuIHN0YXR1czsNCisgIH0NCisgIHN0YXR1cyA9IHByb2dyYW0uUGFyc2VQcm9ncmFtKCk7DQorICBpZiAoc3RhdHVzKSB7DQorICAgIHdzRXJyb3IgPSBwcm9ncmFtLkdldEVycm9yKCkubWVzc2FnZTsNCisgICAgcmV0dXJuIHN0YXR1czsNCisgIH0NCisgIHByb2dyYW0uVHJhbnNsYXRlUHJvZ3JhbSh3c0phdmFzY3JpcHQpOw0KKyAgcmV0dXJuIDA7DQogfQ0KLVhGQV9IRk0ySlNDT05URVhUIFhGQV9GTTJKU19Db250ZXh0Q3JlYXRlKCkNCi17DQotICAgIHJldHVybiAoWEZBX0hGTTJKU0NPTlRFWFQpQ1hGQV9GTTJKU0NvbnRleHQ6OkNyZWF0ZSgpOw0KK1hGQV9IRk0ySlNDT05URVhUIFhGQV9GTTJKU19Db250ZXh0Q3JlYXRlKCkgew0KKyAgcmV0dXJuIChYRkFfSEZNMkpTQ09OVEVYVClDWEZBX0ZNMkpTQ29udGV4dDo6Q3JlYXRlKCk7DQogfQ0KLXZvaWQgWEZBX0ZNMkpTX0NvbnRleHRJbml0aWFsaXplKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQsIEZYSlNFX0hSVU5USU1FIGhTY3JpcHRSdW50aW1lLA0KK3ZvaWQgWEZBX0ZNMkpTX0NvbnRleHRJbml0aWFsaXplKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFJVTlRJTUUgaFNjcmlwdFJ1bnRpbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSENPTlRFWFQgaFNjcmlwdENvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQgKnBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDWEZBX0ZNMkpTQ29udGV4dCo+KGhGTTJKU0NvbnRleHQpOw0KLSAgICBwQ29udGV4dC0+SW5pdGlhbGl6ZShoU2NyaXB0UnVudGltZSwgaFNjcmlwdENvbnRleHQsIHBEb2N1bWVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q1hGQV9GTTJKU0NvbnRleHQqPihoRk0ySlNDb250ZXh0KTsNCisgIHBDb250ZXh0LT5Jbml0aWFsaXplKGhTY3JpcHRSdW50aW1lLCBoU2NyaXB0Q29udGV4dCwgcERvY3VtZW50KTsNCiB9DQotdm9pZCBYRkFfRk0ySlNfR2xvYmFsUHJvcGVydHlHZXR0ZXIoWEZBX0hGTTJKU0NPTlRFWFQgaEZNMkpTQ29udGV4dCwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCi17DQotICAgIENYRkFfRk0ySlNDb250ZXh0ICpwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q1hGQV9GTTJKU0NvbnRleHQqPihoRk0ySlNDb250ZXh0KTsNCi0gICAgcENvbnRleHQtPkdsb2JhbFByb3BlcnR5R2V0dGVyKGhWYWx1ZSk7DQordm9pZCBYRkFfRk0ySlNfR2xvYmFsUHJvcGVydHlHZXR0ZXIoWEZBX0hGTTJKU0NPTlRFWFQgaEZNMkpTQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q1hGQV9GTTJKU0NvbnRleHQqPihoRk0ySlNDb250ZXh0KTsNCisgIHBDb250ZXh0LT5HbG9iYWxQcm9wZXJ0eUdldHRlcihoVmFsdWUpOw0KIH0NCi12b2lkIFhGQV9GTTJKU19Db250ZXh0UmVsZWFzZShYRkFfSEZNMkpTQ09OVEVYVCBoRk0ySlNDb250ZXh0KQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQgKnBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDWEZBX0ZNMkpTQ29udGV4dCo+KGhGTTJKU0NvbnRleHQpOw0KLSAgICBwQ29udGV4dC0+UmVsZWFzZSgpOw0KK3ZvaWQgWEZBX0ZNMkpTX0NvbnRleHRSZWxlYXNlKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxDWEZBX0ZNMkpTQ29udGV4dCo+KGhGTTJKU0NvbnRleHQpOw0KKyAgcENvbnRleHQtPlJlbGVhc2UoKTsNCiB9DQogI2lmZGVmIF9fY3BsdXNwbHVzDQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzY29udGV4dC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuY3BwCmluZGV4IDJlYmM2YTIuLmZlYjc5NjYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzY29udGV4dC5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmNwcApAQCAtNiw3MTgwICs2LDcyMTggQEAKIA0KICNpbmNsdWRlICJ4ZmFfZm0yanMuaCINCiAjaW5jbHVkZSA8dGltZS5oPg0KLSNkZWZpbmUgRklOQU5DSUFMX1BSRUNJU0lPTgkJMC4wMDAwMDAwMQ0KKyNkZWZpbmUgRklOQU5DSUFMX1BSRUNJU0lPTiAwLjAwMDAwMDAxDQogc3RydWN0IFhGQV9GTUh0bWxSZXNlcnZlQ29kZSB7DQotICAgIHVpbnQzMl90CQltX3VDb2RlOw0KLSAgICBjb25zdCBGWF9XQ0hBUioJCW1faHRtbFJlc2VydmU7DQorICB1aW50MzJfdCBtX3VDb2RlOw0KKyAgY29uc3QgRlhfV0NIQVIqIG1faHRtbFJlc2VydmU7DQogfTsNCiBzdHJ1Y3QgWEZBX0ZNSHRtbEhhc2hlZFJlc2VydmVDb2RlIHsNCi0gICAgdWludDMyX3QJCW1fdUhhc2g7DQotICAgIGNvbnN0IEZYX1dDSEFSKgkJbV9odG1sUmVzZXJ2ZTsNCi0gICAgdWludDMyX3QJCW1fdUNvZGU7DQorICB1aW50MzJfdCBtX3VIYXNoOw0KKyAgY29uc3QgRlhfV0NIQVIqIG1faHRtbFJlc2VydmU7DQorICB1aW50MzJfdCBtX3VDb2RlOw0KIH07DQotc3RhdGljIFhGQV9GTUh0bWxIYXNoZWRSZXNlcnZlQ29kZSByZXNlcnZlc0ZvckRlY29kZSBbXSA9IHsNCi0gICAgezB4MDAwMThiNjIsICAgIEwiTXUiLCAgICAgIDkyNH0sDQotICAgIHsweDAwMDE5MDgzLCAgICBMIk51IiwgICAgICA5MjV9LA0KLSAgICB7MHgwMDAxOWFiOSwgICAgTCJQaSIsICAgICAgOTI4fSwNCi0gICAgezB4MDAwMWMzYzEsICAgIEwiWGkiLCAgICAgIDkyNn0sDQotICAgIHsweDAwMDIxMGFjLCAgICBMImdlIiwgICAgICA4ODA1fSwNCi0gICAgezB4MDAwMjEwYmIsICAgIEwiZ3QiLCAgICAgIDYyfSwNCi0gICAgezB4MDAwMjJhNTEsICAgIEwibGUiLCAgICAgIDg4MDR9LA0KLSAgICB7MHgwMDAyMmE2MCwgICAgTCJsdCIsICAgICAgNjB9LA0KLSAgICB7MHgwMDAyMmY4MiwgICAgTCJtdSIsICAgICAgOTU2fSwNCi0gICAgezB4MDAwMjM0OTMsICAgIEwibmUiLCAgICAgIDg4MDB9LA0KLSAgICB7MHgwMDAyMzQ5NywgICAgTCJuaSIsICAgICAgODcxNX0sDQotICAgIHsweDAwMDIzNGEzLCAgICBMIm51IiwgICAgICA5NTd9LA0KLSAgICB7MHgwMDAyMzljMSwgICAgTCJvciIsICAgICAgODc0NH0sDQotICAgIHsweDAwMDIzZWQ5LCAgICBMInBpIiwgICAgICA5NjB9LA0KLSAgICB7MHgwMDAyNjdlMSwgICAgTCJ4aSIsICAgICAgOTU4fSwNCi0gICAgezB4MDBjNDE3ODksICAgIEwibGNlaWwiLCAgIDg5Njh9LA0KLSAgICB7MHgwMGVlZjM0ZiwgICAgTCJ0aGV0YXN5bSIsOTc3fSwNCi0gICAgezB4MDEyZDdlYWQsICAgIEwibGNpcmMiLCAgIDIwNn0sDQotICAgIHsweDAxNjM3YjU2LCAgICBMImFncmF2ZSIsICAyMjR9LA0KLSAgICB7MHgwMjA4NTZkYSwgICAgTCJjcmFyciIsICAgODYyOX0sDQotICAgIHsweDAyMjE4OGMzLCAgICBMImdhbW1hIiwgICA5NDd9LA0KLSAgICB7MHgwMzM1ODZkMywgICAgTCJuYnNwIiwgICAgMTYwfSwNCi0gICAgezB4MDRmNGMzNTgsICAgIEwibnN1YiIsICAgIDg4MzZ9LA0KLSAgICB7MHgwNTgxNDY2YSwgICAgTCJkYWdnZXIiLCAgODIyNH0sDQotICAgIHsweDA2YjFmNzkwLCAgICBMIm9lbGlnIiwgICAzMzl9LA0KLSAgICB7MHgwNmU0OTBkNCwgICAgTCJDaGkiLCAgICAgOTM1fSwNCi0gICAgezB4MDcxOGM2YTEsICAgIEwiRVRIIiwgICAgIDIwOH0sDQotICAgIHsweDA3MTk2YWRhLCAgICBMIkV0YSIsICAgICA5MTl9LA0KLSAgICB7MHgwN2Y2NjdjYSwgICAgTCJVZ3JhdmUiLCAgMjE3fSwNCi0gICAgezB4MDgzYThhMjEsICAgIEwiUGhpIiwgICAgIDkzNH0sDQotICAgIHsweDA4M2FjMjhjLCAgICBMIlBzaSIsICAgICA5MzZ9LA0KLSAgICB7MHgwODZmMjZhOSwgICAgTCJSaG8iLCAgICAgOTI5fSwNCi0gICAgezB4MDg5YjViNTEsICAgIEwiYXJpbmciLCAgIDIyOX0sDQotICAgIHsweDA4YTM5ZjRhLCAgICBMIlRhdSIsICAgICA5MzJ9LA0KLSAgICB7MHgwOGI2MTg4YiwgICAgTCJUSE9STiIsICAgMjIyfSwNCi0gICAgezB4MDljZTc5MmEsICAgIEwiaWNpcmMiLCAgIDIzOH0sDQotICAgIHsweDA5ZjlkNjFlLCAgICBMImFtcCIsICAgICAzOH0sDQotICAgIHsweDA5ZjlkYjMzLCAgICBMImFuZCIsICAgICA4NzQzfSwNCi0gICAgezB4MDlmOWRiMzYsICAgIEwiYW5nIiwgICAgIDg3MzZ9LA0KLSAgICB7MHgwYTJlMzUxNCwgICAgTCJjYXAiLCAgICAgODc0NX0sDQotICAgIHsweDBhMmU1OGY0LCAgICBMImNoaSIsICAgICA5Njd9LA0KLSAgICB7MHgwYTJlOWJhOCwgICAgTCJjdXAiLCAgICAgODc0Nn0sDQotICAgIHsweDBhNDg5N2QwLCAgICBMImRlZyIsICAgICAxNzZ9LA0KLSAgICB7MHgwYTYzMzJmYSwgICAgTCJldGEiLCAgICAgOTUxfSwNCi0gICAgezB4MGE2MzMzMDEsICAgIEwiZXRoIiwgICAgIDI0MH0sDQotICAgIHsweDBhY2M0ZDRiLCAgICBMImludCIsICAgICA4NzQ3fSwNCi0gICAgezB4MGIxYjNkMzUsICAgIEwibG96IiwgICAgIDk2NzR9LA0KLSAgICB7MHgwYjFiNGM4YiwgICAgTCJscm0iLCAgICAgODIwNn0sDQotICAgIHsweDBiNGZkOWIxLCAgICBMIm5vdCIsICAgICAxNzJ9LA0KLSAgICB7MHgwYjg0NTI0MSwgICAgTCJwaGkiLCAgICAgOTY2fSwNCi0gICAgezB4MGI4NDU3NmYsICAgIEwicGl2IiwgICAgIDk4Mn0sDQotICAgIHsweDBiODQ4YWFjLCAgICBMInBzaSIsICAgICA5Njh9LA0KLSAgICB7MHgwYmI4ZGY1ZSwgICAgTCJyZWciLCAgICAgMTc0fSwNCi0gICAgezB4MGJiOGVlYzksICAgIEwicmhvIiwgICAgIDk2MX0sDQotICAgIHsweDBiYjkwMzRiLCAgICBMInJsbSIsICAgICA4MjA3fSwNCi0gICAgezB4MGJkMzNkMTQsICAgIEwic2h5IiwgICAgIDE3M30sDQotICAgIHsweDBiZDM0MjI5LCAgICBMInNpbSIsICAgICA4NzY0fSwNCi0gICAgezB4MGJkMzdmYWEsICAgIEwic3ViIiwgICAgIDg4MzR9LA0KLSAgICB7MHgwYmQzN2ZiNSwgICAgTCJzdW0iLCAgICAgODcyMX0sDQotICAgIHsweDBiZDM3ZmI4LCAgICBMInN1cCIsICAgICA4ODM1fSwNCi0gICAgezB4MGJlZDY3NmEsICAgIEwidGF1IiwgICAgIDk2NH0sDQotICAgIHsweDBjMDdmMzJlLCAgICBMInVtbCIsICAgICAxNjh9LA0KLSAgICB7MHgwYzcxMDMyYywgICAgTCJ5ZW4iLCAgICAgMTY1fSwNCi0gICAgezB4MGM3ZjI4ODksICAgIEwic3psaWciLCAgIDIyM30sDQotICAgIHsweDBjOGJhZGJiLCAgICBMInp3aiIsICAgICA4MjA1fSwNCi0gICAgezB4MTBiYTRkYmEsICAgIEwiRWdyYXZlIiwgIDIwMH0sDQotICAgIHsweDEwZjFlYTI0LCAgICBMInBhcmEiLCAgICAxODJ9LA0KLSAgICB7MHgxMGYxZWEzNywgICAgTCJwYXJ0IiwgICAgODcwNn0sDQotICAgIHsweDExNWIyMzM3LCAgICBMInBlcnAiLCAgICA4ODY5fSwNCi0gICAgezB4MTJiMTBkMTUsICAgIEwicHJvZCIsICAgIDg3MTl9LA0KLSAgICB7MHgxMmIxMGQyMSwgICAgTCJwcm9wIiwgICAgODczM30sDQotICAgIHsweDEyZGZhOWY0LCAgICBMInJmbG9vciIsICA4OTcxfSwNCi0gICAgezB4MTJlYjQ3MzYsICAgIEwiQWdyYXZlIiwgIDE5Mn0sDQotICAgIHsweDEyZmZmMmI3LCAgICBMInB1bmQiLCAgICAxNjN9LA0KLSAgICB7MHgxM2ZkYTlmMiwgICAgTCJ0aWxkZSIsICAgNzMyfSwNCi0gICAgezB4MTQxN2ZkNjIsICAgIEwidGltZXMiLCAgIDIxNX0sDQotICAgIHsweDE1NGZjNzI2LCAgICBMImVjaXJjIiwgICAyMzR9LA0KLSAgICB7MHgxNjVhYTQ1MSwgICAgTCJzaWdtYSIsICAgOTYzfSwNCi0gICAgezB4MTcwOTEyNGEsICAgIEwiRGFnZ2VyIiwgIDgyMjV9LA0KLSAgICB7MHgxOTJmNzhkNSwgICAgTCJpZXhjbCIsICAgMTYxfSwNCi0gICAgezB4MWI3ZWQ4ZDcsICAgIEwickFyciIsICAgIDg2NTh9LA0KLSAgICB7MHgxZWM4OGM2OCwgICAgTCJyYW5nIiwgICAgOTAwMn0sDQotICAgIHsweDFlYzhhMGY3LCAgICBMInJhcnIiLCAgICA4NTk0fSwNCi0gICAgezB4MWVkYTA3ZjMsICAgIEwiYXRpbGRlIiwgIDIyN30sDQotICAgIHsweDFmMzE4MmM0LCAgICBMInJlYWwiLCAgICA4NDc2fSwNCi0gICAgezB4MWZjMzRmOGIsICAgIEwieWFjdXRlIiwgIDI1M30sDQotICAgIHsweDIwZDExNTIyLCAgICBMImFjaXJjIiwgICAyMjZ9LA0KLSAgICB7MHgyMTkzM2E5YiwgICAgTCJyc2FxdW8iLCAgODI1MH0sDQotICAgIHsweDIxZjQ0OTA3LCAgICBMInVhY3V0ZSIsICAyNTB9LA0KLSAgICB7MHgyMjBjY2E3MiwgICAgTCJhY3V0ZSIsICAgMTgwfSwNCi0gICAgezB4MjQyY2RlZDEsICAgIEwiYWxlZnN5bSIsIDg1MDF9LA0KLSAgICB7MHgyNjU1YzY2YSwgICAgTCJkZWx0YSIsICAgOTQ4fSwNCi0gICAgezB4MjY5ZTRiNGQsICAgIEwiZXhpc3QiLCAgIDg3MDd9LA0KLSAgICB7MHgyNzMzNzlmYSwgICAgTCJtaWNybyIsICAgMTgxfSwNCi0gICAgezB4MjdhMzc0NDAsICAgIEwiZm9yYWxsIiwgIDg3MDR9LA0KLSAgICB7MHgyODU0ZTYyYywgICAgTCJtaW51cyIsICAgODcyMn0sDQotICAgIHsweDI4NjM2ZjgxLCAgICBMImNlZGlsIiwgICAxODR9LA0KLSAgICB7MHgyODg3MzU3YiwgICAgTCJpYWN1dGUiLCAgMjM3fSwNCi0gICAgezB4Mjk5NGQ1ZmYsICAgIEwiZnJhYzEyIiwgIDE4OX0sDQotICAgIHsweDI5OTRkNjAxLCAgICBMImZyYWMxNCIsICAxODh9LA0KLSAgICB7MHgyOTk0ZTA0MywgICAgTCJmcmFjMzQiLCAgMTkwfSwNCi0gICAgezB4MmExZmViNDEsICAgIEwibGFtYmRhIiwgIDk1NX0sDQotICAgIHsweDJhYjIxNWYzLCAgICBMImFwb3MiLCAgICAzOX0sDQotICAgIHsweDJhYjgyZWY3LCAgICBMImVhY3V0ZSIsICAyMzN9LA0KLSAgICB7MHgyYjM1OTJlZiwgICAgTCJhdW1sIiwgICAgMjI4fSwNCi0gICAgezB4MmNlOTI4NzMsICAgIEwiYWFjdXRlIiwgIDIyNX0sDQotICAgIHsweDJkYWZmNDhhLCAgICBMIm9zbGFzaCIsICAyNDh9LA0KLSAgICB7MHgyZWY2ODg4MiwgICAgTCJhZWxpZyIsICAgMjMwfSwNCi0gICAgezB4MzA2MWQzZDMsICAgIEwiQXRpbGRlIiwgIDE5NX0sDQotICAgIHsweDMxNGIxYjZiLCAgICBMIllhY3V0ZSIsICAyMjF9LA0KLSAgICB7MHgzMzdjMTRlNywgICAgTCJVYWN1dGUiLCAgMjE4fSwNCi0gICAgezB4Mzc2NzZhY2EsICAgIEwiY2VudCIsICAgIDE2Mn0sDQotICAgIHsweDM3ZDBiODQxLCAgICBMImNpcmMiLCAgICA3MTB9LA0KLSAgICB7MHgzODZlNzk0NywgICAgTCJjb25nIiwgICAgODc3M30sDQotICAgIHsweDM4NmU4MzliLCAgICBMImNvcHkiLCAgICAxNjl9LA0KLSAgICB7MHgzYTBlMjI1YSwgICAgTCJFcHNpbG9uIiwgOTE3fSwNCi0gICAgezB4M2JhN2I3MjEsICAgIEwiTGFtYmRhIiwgIDkyM30sDQotICAgIHsweDNiZDlhYmU2LCAgICBMIkFscGhhIiwgICA5MTN9LA0KLSAgICB7MHgzYzNmZmFkNywgICAgTCJFYWN1dGUiLCAgMjAxfSwNCi0gICAgezB4M2NmYWY2OWYsICAgIEwiYnJ2YmFyIiwgIDE2Nn0sDQotICAgIHsweDNkNTRhNDg5LCAgICBMIm9tZWdhIiwgICA5Njl9LA0KLSAgICB7MHgzZTcwZjQ1MywgICAgTCJBYWN1dGUiLCAgMTkzfSwNCi0gICAgezB4M2YzN2MwNmEsICAgIEwiT3NsYXNoIiwgIDIxNn0sDQotICAgIHsweDQwZTFiMzRlLCAgICBMImRpYW1zIiwgICA5ODMwfSwNCi0gICAgezB4NDE2NTk2ZGYsICAgIEwicGx1c21uIiwgIDE3N30sDQotICAgIHsweDQzNTRmZjE2LCAgICBMIlVjaXJjIiwgICAyMTl9LA0KLSAgICB7MHg0NTRmY2U2YSwgICAgTCJVcHNpbG9uIiwgOTMzfSwNCi0gICAgezB4NDYxMGFkMzUsICAgIEwiZW1zcCIsICAgIDgxOTV9LA0KLSAgICB7MHg0NjJhZmI3NiwgICAgTCJlbnNwIiwgICAgODE5NH0sDQotICAgIHsweDQ2ZTMwMDczLCAgICBMImV1bWwiLCAgICAyMzV9LA0KLSAgICB7MHg0NmUzMWExYiwgICAgTCJldXJvIiwgICAgODM2NH0sDQotICAgIHsweDQ2ZjJlYWRhLCAgICBMImxvd2FzdCIsICA4NzI3fSwNCi0gICAgezB4NGRjYTI2Y2YsICAgIEwiQXVtbCIsICAgIDE5Nn0sDQotICAgIHsweDRlMmQ2MDgzLCAgICBMImltYWdlIiwgICA4NDY1fSwNCi0gICAgezB4NGY5NjRlZTgsICAgIEwibm90aW4iLCAgIDg3MTN9LA0KLSAgICB7MHg1MDkxN2E3YSwgICAgTCJlcHNpbG9uIiwgOTQ5fSwNCi0gICAgezB4NTJmOWE0Y2QsICAgIEwiS2FwcGEiLCAgIDkyMn0sDQotICAgIHsweDU0OTZmNDEwLCAgICBMIk9jaXJjIiwgICAyMTJ9LA0KLSAgICB7MHg1NjhjYmYzNCwgICAgTCJ6ZXRhIiwgICAgOTUwfSwNCi0gICAgezB4NTdiYWRkMjAsICAgIEwibnRpbGRlIiwgIDI0MX0sDQotICAgIHsweDU4NjYyMTA5LCAgICBMInp3bmoiLCAgICA4MjA0fSwNCi0gICAgezB4NWIzOTg3MGYsICAgIEwiZW1wdHkiLCAgIDg3MDl9LA0KLSAgICB7MHg1YmQzMjY4YSwgICAgTCJ1cHNpbG9uIiwgOTY1fSwNCi0gICAgezB4NWUyYmY4YTMsICAgIEwiR2FtbWEiLCAgIDkxNX0sDQotICAgIHsweDVmNzNjMTNhLCAgICBMInJzcXVvIiwgICA4MjE3fSwNCi0gICAgezB4NjFmMmJjNGQsICAgIEwiaW90YSIsICAgIDk1M30sDQotICAgIHsweDYyNWJiY2YzLCAgICBMImlzaW4iLCAgICA4NzEyfSwNCi0gICAgezB4NjI5MDZkZjcsICAgIEwiaXVtbCIsICAgIDIzOX0sDQotICAgIHsweDY0YTVjYjMxLCAgICBMIkFyaW5nIiwgICAxOTd9LA0KLSAgICB7MHg2NmYyNWM0YSwgICAgTCJzYnF1byIsICAgODIxOH0sDQotICAgIHsweDY4NTFhYjYwLCAgICBMInNwYWRlcyIsICA5ODI0fSwNCi0gICAgezB4Njk0MmE5MDAsICAgIEwiTnRpbGRlIiwgIDIwOX0sDQotICAgIHsweDY5Nzc5NDUzLCAgICBMIkV1bWwiLCAgICAyMDN9LA0KLSAgICB7MHg2Y2RhNmUyMywgICAgTCJjdXJyZW50IiwgMTY0fSwNCi0gICAgezB4NzBiNWI2MzQsICAgIEwibHNxdW8iLCAgIDgyMTZ9LA0KLSAgICB7MHg3MTVhMzcwNiwgICAgTCJFY2lyYyIsICAgMjAyfSwNCi0gICAgezB4NzFlOGJmOGQsICAgIEwidGRxdW8iLCAgIDgyMjF9LA0KLSAgICB7MHg3MjY1MTQzMSwgICAgTCJTaWdtYSIsICAgOTMxfSwNCi0gICAgezB4NzU2OTgxM2IsICAgIEwiaXF1ZXN0IiwgIDE5MX0sDQotICAgIHsweDc3NmE0MzZhLCAgICBMImVxdWl2IiwgICA4ODAxfSwNCi0gICAgezB4NzkyMTUzMTQsICAgIEwiWmV0YSIsICAgIDkxOH0sDQotICAgIHsweDc5YjgxMjI0LCAgICBMIm9ncmF2ZSIsICAyNDJ9LA0KLSAgICB7MHg3YzJmOGIyMywgICAgTCJtYWNyIiwgICAgMTc1fSwNCi0gICAgezB4N2NkYjg1MDIsICAgIEwiQWNpcmMiLCAgIDE5NH0sDQotICAgIHsweDgxODVjNjJlLCAgICBMIm5kYXNoIiwgICA4MjExfSwNCi0gICAgezB4ODI2MDM2NGEsICAgIEwiRGVsdGEiLCAgIDkxNn0sDQotICAgIHsweDg0NjYxOWFkLCAgICBMIm1kYXNoIiwgICA4MjEyfSwNCi0gICAgezB4ODU1MGZiNTAsICAgIEwiT0VsaWciLCAgIDMzOH0sDQotICAgIHsweDg4ZWI1Yjg1LCAgICBMImxkcXVvIiwgICA4MjIwfSwNCi0gICAgezB4OGIzZmRlMDQsICAgIEwiT2dyYXZlIiwgIDIxMH0sDQotICAgIHsweDhiYzU3OTRiLCAgICBMIm9yZGYiLCAgICAxNzB9LA0KLSAgICB7MHg4YmM1Nzk1MiwgICAgTCJvcmRtIiwgICAgMTg2fSwNCi0gICAgezB4OGMxNDkyM2QsICAgIEwib3VtbCIsICAgIDI0Nn0sDQotICAgIHsweDhjNWE3Y2Q2LCAgICBMInRoZXRhIiwgICA5NTJ9LA0KLSAgICB7MHg4ZDYxODEyYiwgICAgTCJ0aG9ybiIsICAgMjU0fSwNCi0gICAgezB4OTEyYjk1YWEsICAgIEwiYXN5bXAiLCAgIDg3NzZ9LA0KLSAgICB7MHg5NDdmYWY4MSwgICAgTCJtaWRkb3QiLCAgMTgzfSwNCi0gICAgezB4OTYyOTIwMmUsICAgIEwibGZsb29yIiwgIDg5NzB9LA0KLSAgICB7MHg5NzJlOWVjMSwgICAgTCJvdGlsZGUiLCAgMjQ1fSwNCi0gICAgezB4OTc0OGYyMzEsICAgIEwib3RpbWVzIiwgIDg4NTV9LA0KLSAgICB7MHg5OTVmMTQ2OSwgICAgTCJPbWVnYSIsICAgOTM3fSwNCi0gICAgezB4OTllYjUzNDksICAgIEwicXVvdCIsICAgIDM0fSwNCi0gICAgezB4OWFlYjYzOWUsICAgIEwiaGVsbGlwIiwgIDgyMzB9LA0KLSAgICB7MHhhMGFlMmY4NiwgICAgTCJTY2Fyb24iLCAgMzUyfSwNCi0gICAgezB4YTRkY2IwZDUsICAgIEwibHNhcXVvIiwgIDgyNDl9LA0KLSAgICB7MHhhNTNkYmY0MSwgICAgTCJvYWN1dGUiLCAgMjQzfSwNCi0gICAgezB4YTVhZTllN2IsICAgIEwiYmRxdW8iLCAgIDgyMjJ9LA0KLSAgICB7MHhhNjAyZDdiYSwgICAgTCJzZG90IiwgICAgODkwMX0sDQotICAgIHsweGE2MWNlODZmLCAgICBMInNlY3QiLCAgICAxNjd9LA0KLSAgICB7MHhhNmU0YzNkNywgICAgTCJzaWdtYWYiLCAgOTYyfSwNCi0gICAgezB4YTdjMWM3NGYsICAgIEwic3ViZSIsICAgIDg4Mzh9LA0KLSAgICB7MHhhN2MyMGVlOSwgICAgTCJzdXAxIiwgICAgMTg1fSwNCi0gICAgezB4YTdjMjBlZWEsICAgIEwic3VwMiIsICAgIDE3OH0sDQotICAgIHsweGE3YzIwZWViLCAgICBMInN1cDMiLCAgICAxNzl9LA0KLSAgICB7MHhhN2MyMGYxZCwgICAgTCJzdXBlIiwgICAgODgzOX0sDQotICAgIHsweGE4YjY2YWExLCAgICBMIk90aWxkZSIsICAyMTN9LA0KLSAgICB7MHhhZDk1OGM0MiwgICAgTCJBRWxpZyIsICAgMTk4fSwNCi0gICAgezB4YWVhOTI2MWQsICAgIEwiT3VtbCIsICAgIDIxNH0sDQotICAgIHsweGIwNDBlYWZhLCAgICBMInVBcnIiLCAgICA4NjU3fSwNCi0gICAgezB4YjA3YzJlMWMsICAgIEwiYmV0YSIsICAgIDk0Nn0sDQotICAgIHsweGIyMjBlOTJmLCAgICBMImJ1bGwiLCAgICA4MjI2fSwNCi0gICAgezB4YjIyNzUwYzQsICAgIEwiY2NlZGlsIiwgIDIzMX0sDQotICAgIHsweGIzOGFiMzFhLCAgICBMInVhcnIiLCAgICA4NTkzfSwNCi0gICAgezB4YjU5OGI2ODMsICAgIEwidXVtbCIsICAgIDI1Mn0sDQotICAgIHsweGI2YzU4YjIxLCAgICBMIk9hY3V0ZSIsICAyMTF9LA0KLSAgICB7MHhiNmQyYTYxNywgICAgTCJvbGluZSIsICAgODI1NH0sDQotICAgIHsweGJhOWZkOTg5LCAgICBMImRBcnIiLCAgICA4NjU5fSwNCi0gICAgezB4YmI1Y2NkNDEsICAgIEwibGdyYXZlIiwgIDIwNH0sDQotICAgIHsweGJkMzliNDRjLCAgICBMIndlaWVycCIsICA4NDcyfSwNCi0gICAgezB4YmRlOWExYTksICAgIEwiZGFyciIsICAgIDg1OTV9LA0KLSAgICB7MHhjMDI3ZTMyOSwgICAgTCJwZXJtaWwiLCAgODI0MH0sDQotICAgIHsweGMyNDUxMzg5LCAgICBMInVwc2loIiwgICA5Nzh9LA0KLSAgICB7MHhjM2FmMWNhNCwgICAgTCJDY2VkaWwiLCAgMTk5fSwNCi0gICAgezB4Y2QxNjQyNDksICAgIEwiZm5vZiIsICAgIDQwMn0sDQotICAgIHsweGNmNmM4NDY3LCAgICBMImhlYXJ0cyIsICA5ODI5fSwNCi0gICAgezB4ZDEyMjgzOTAsICAgIEwidHJhZGUiLCAgIDg0ODJ9LA0KLSAgICB7MHhkMTQ2MjQwNywgICAgTCJ5dW1sIiwgICAgMjU1fSwNCi0gICAgezB4ZDJjZjIyNTMsICAgIEwib3BsdXMiLCAgIDg4NTN9LA0KLSAgICB7MHhkMzEwYzFmYywgICAgTCJCZXRhIiwgICAgOTE0fSwNCi0gICAgezB4ZDU5YzRkNzQsICAgIEwiaW5maW4iLCAgIDg3MzR9LA0KLSAgICB7MHhkNjRkNDcwZCwgICAgTCJoQXJyIiwgICAgODY2MH0sDQotICAgIHsweGQ2N2Q5Yzc1LCAgICBMImRpdmlkZSIsICAyNDd9LA0KLSAgICB7MHhkNjk4ZGQzNywgICAgTCJPbWljcm9uIiwgOTI3fSwNCi0gICAgezB4ZDgyZDRhNjMsICAgIEwiVXVtbCIsICAgIDIyMH0sDQotICAgIHsweGQ5OTcwZjJkLCAgICBMImhhcnIiLCAgICA4NTk2fSwNCi0gICAgezB4ZGE5MWZkOTksICAgIEwiY2x1YnMiLCAgIDk4Mjd9LA0KLSAgICB7MHhkYmU1YmRjYywgICAgTCJ0aGVyZTQiLCAgODc1Nn0sDQotICAgIHsweGRkNzY3MWJkLCAgICBMInByaW1lIiwgICA4MjQyfSwNCi0gICAgezB4ZGZjZjNjMDYsICAgIEwiYWxwaGEiLCAgIDk0NX0sDQotICAgIHsweGUwMjEzMDYzLCAgICBMInNhcm9uIiwgICAzNTN9LA0KLSAgICB7MHhlMTkxMWQ4MywgICAgTCJyYWRpYyIsICAgODczMH0sDQotICAgIHsweGUyZTc1NDY4LCAgICBMInJhcXVvIiwgICAxODd9LA0KLSAgICB7MHhlNmUyN2E1ZSwgICAgTCJsYWN1dGUiLCAgMjA1fSwNCi0gICAgezB4ZTc0YThmMzYsICAgIEwidWNpcmMiLCAgIDI1MX0sDQotICAgIHsweGU4NjRlY2I2LCAgICBMIlRoZXRhIiwgICA5MjB9LA0KLSAgICB7MHhlY2RkZGU1ZSwgICAgTCJuYWJsYSIsICAgODcxMX0sDQotICAgIHsweGVkMWMzNTU3LCAgICBMIm9taWNyb24iLCA5NTl9LA0KLSAgICB7MHhlZjgyMjI4ZiwgICAgTCJyY2VpbCIsICAgODk2OX0sDQotICAgIHsweGYxZmFiNDkxLCAgICBMImxBcnIiLCAgICA4NjU2fSwNCi0gICAgezB4ZjNkYWI3ZTcsICAgIEwiWXVtbCIsICAgIDM3Nn0sDQotICAgIHsweGY0Mjk0OTYyLCAgICBMImxhcXVvIiwgICAxNzF9LA0KLSAgICB7MHhmNTQ0NjgyMiwgICAgTCJsYW5nIiwgICAgOTAwMX0sDQotICAgIHsweGY1NDQ3Y2IxLCAgICBMImxhcnIiLCAgICA4NTkyfSwNCi0gICAgezB4ZjY2ZTliZWEsICAgIEwidWdyYXZlIiwgIDI0OX0sDQotICAgIHsweGY2YjRjZTcwLCAgICBMImxvdGEiLCAgICA5MjF9LA0KLSAgICB7MHhmNmVmMzRlZCwgICAgTCJrYXBwYSIsICAgOTU0fSwNCi0gICAgezB4ZjcyYTNhNTYsICAgIEwidGhpbnNwIiwgIDgyMDF9LA0KLSAgICB7MHhmNzUyODAxYSwgICAgTCJsdW1sIiwgICAgMjA3fSwNCi0gICAgezB4Zjg4Yzg0MzAsICAgIEwib2NpcmMiLCAgIDI0NH0sDQotICAgIHsweGY5Njc2MTc4LCAgICBMImZyYXNsIiwgICA4MjYwfSwNCi0gICAgezB4ZmQwMTg4NWUsICAgIEwiaWdyYXZlIiwgIDIzNn0sDQotICAgIHsweGZmMzI4MWRhLCAgICBMImVncmF2ZSIsICAyMzJ9LA0KK3N0YXRpYyBYRkFfRk1IdG1sSGFzaGVkUmVzZXJ2ZUNvZGUgcmVzZXJ2ZXNGb3JEZWNvZGVbXSA9IHsNCisgICAgezB4MDAwMThiNjIsIEwiTXUiLCA5MjR9LCAgICAgICB7MHgwMDAxOTA4MywgTCJOdSIsIDkyNX0sDQorICAgIHsweDAwMDE5YWI5LCBMIlBpIiwgOTI4fSwgICAgICAgezB4MDAwMWMzYzEsIEwiWGkiLCA5MjZ9LA0KKyAgICB7MHgwMDAyMTBhYywgTCJnZSIsIDg4MDV9LCAgICAgIHsweDAwMDIxMGJiLCBMImd0IiwgNjJ9LA0KKyAgICB7MHgwMDAyMmE1MSwgTCJsZSIsIDg4MDR9LCAgICAgIHsweDAwMDIyYTYwLCBMImx0IiwgNjB9LA0KKyAgICB7MHgwMDAyMmY4MiwgTCJtdSIsIDk1Nn0sICAgICAgIHsweDAwMDIzNDkzLCBMIm5lIiwgODgwMH0sDQorICAgIHsweDAwMDIzNDk3LCBMIm5pIiwgODcxNX0sICAgICAgezB4MDAwMjM0YTMsIEwibnUiLCA5NTd9LA0KKyAgICB7MHgwMDAyMzljMSwgTCJvciIsIDg3NDR9LCAgICAgIHsweDAwMDIzZWQ5LCBMInBpIiwgOTYwfSwNCisgICAgezB4MDAwMjY3ZTEsIEwieGkiLCA5NTh9LCAgICAgICB7MHgwMGM0MTc4OSwgTCJsY2VpbCIsIDg5Njh9LA0KKyAgICB7MHgwMGVlZjM0ZiwgTCJ0aGV0YXN5bSIsIDk3N30sIHsweDAxMmQ3ZWFkLCBMImxjaXJjIiwgMjA2fSwNCisgICAgezB4MDE2MzdiNTYsIEwiYWdyYXZlIiwgMjI0fSwgICB7MHgwMjA4NTZkYSwgTCJjcmFyciIsIDg2Mjl9LA0KKyAgICB7MHgwMjIxODhjMywgTCJnYW1tYSIsIDk0N30sICAgIHsweDAzMzU4NmQzLCBMIm5ic3AiLCAxNjB9LA0KKyAgICB7MHgwNGY0YzM1OCwgTCJuc3ViIiwgODgzNn0sICAgIHsweDA1ODE0NjZhLCBMImRhZ2dlciIsIDgyMjR9LA0KKyAgICB7MHgwNmIxZjc5MCwgTCJvZWxpZyIsIDMzOX0sICAgIHsweDA2ZTQ5MGQ0LCBMIkNoaSIsIDkzNX0sDQorICAgIHsweDA3MThjNmExLCBMIkVUSCIsIDIwOH0sICAgICAgezB4MDcxOTZhZGEsIEwiRXRhIiwgOTE5fSwNCisgICAgezB4MDdmNjY3Y2EsIEwiVWdyYXZlIiwgMjE3fSwgICB7MHgwODNhOGEyMSwgTCJQaGkiLCA5MzR9LA0KKyAgICB7MHgwODNhYzI4YywgTCJQc2kiLCA5MzZ9LCAgICAgIHsweDA4NmYyNmE5LCBMIlJobyIsIDkyOX0sDQorICAgIHsweDA4OWI1YjUxLCBMImFyaW5nIiwgMjI5fSwgICAgezB4MDhhMzlmNGEsIEwiVGF1IiwgOTMyfSwNCisgICAgezB4MDhiNjE4OGIsIEwiVEhPUk4iLCAyMjJ9LCAgICB7MHgwOWNlNzkyYSwgTCJpY2lyYyIsIDIzOH0sDQorICAgIHsweDA5ZjlkNjFlLCBMImFtcCIsIDM4fSwgICAgICAgezB4MDlmOWRiMzMsIEwiYW5kIiwgODc0M30sDQorICAgIHsweDA5ZjlkYjM2LCBMImFuZyIsIDg3MzZ9LCAgICAgezB4MGEyZTM1MTQsIEwiY2FwIiwgODc0NX0sDQorICAgIHsweDBhMmU1OGY0LCBMImNoaSIsIDk2N30sICAgICAgezB4MGEyZTliYTgsIEwiY3VwIiwgODc0Nn0sDQorICAgIHsweDBhNDg5N2QwLCBMImRlZyIsIDE3Nn0sICAgICAgezB4MGE2MzMyZmEsIEwiZXRhIiwgOTUxfSwNCisgICAgezB4MGE2MzMzMDEsIEwiZXRoIiwgMjQwfSwgICAgICB7MHgwYWNjNGQ0YiwgTCJpbnQiLCA4NzQ3fSwNCisgICAgezB4MGIxYjNkMzUsIEwibG96IiwgOTY3NH0sICAgICB7MHgwYjFiNGM4YiwgTCJscm0iLCA4MjA2fSwNCisgICAgezB4MGI0ZmQ5YjEsIEwibm90IiwgMTcyfSwgICAgICB7MHgwYjg0NTI0MSwgTCJwaGkiLCA5NjZ9LA0KKyAgICB7MHgwYjg0NTc2ZiwgTCJwaXYiLCA5ODJ9LCAgICAgIHsweDBiODQ4YWFjLCBMInBzaSIsIDk2OH0sDQorICAgIHsweDBiYjhkZjVlLCBMInJlZyIsIDE3NH0sICAgICAgezB4MGJiOGVlYzksIEwicmhvIiwgOTYxfSwNCisgICAgezB4MGJiOTAzNGIsIEwicmxtIiwgODIwN30sICAgICB7MHgwYmQzM2QxNCwgTCJzaHkiLCAxNzN9LA0KKyAgICB7MHgwYmQzNDIyOSwgTCJzaW0iLCA4NzY0fSwgICAgIHsweDBiZDM3ZmFhLCBMInN1YiIsIDg4MzR9LA0KKyAgICB7MHgwYmQzN2ZiNSwgTCJzdW0iLCA4NzIxfSwgICAgIHsweDBiZDM3ZmI4LCBMInN1cCIsIDg4MzV9LA0KKyAgICB7MHgwYmVkNjc2YSwgTCJ0YXUiLCA5NjR9LCAgICAgIHsweDBjMDdmMzJlLCBMInVtbCIsIDE2OH0sDQorICAgIHsweDBjNzEwMzJjLCBMInllbiIsIDE2NX0sICAgICAgezB4MGM3ZjI4ODksIEwic3psaWciLCAyMjN9LA0KKyAgICB7MHgwYzhiYWRiYiwgTCJ6d2oiLCA4MjA1fSwgICAgIHsweDEwYmE0ZGJhLCBMIkVncmF2ZSIsIDIwMH0sDQorICAgIHsweDEwZjFlYTI0LCBMInBhcmEiLCAxODJ9LCAgICAgezB4MTBmMWVhMzcsIEwicGFydCIsIDg3MDZ9LA0KKyAgICB7MHgxMTViMjMzNywgTCJwZXJwIiwgODg2OX0sICAgIHsweDEyYjEwZDE1LCBMInByb2QiLCA4NzE5fSwNCisgICAgezB4MTJiMTBkMjEsIEwicHJvcCIsIDg3MzN9LCAgICB7MHgxMmRmYTlmNCwgTCJyZmxvb3IiLCA4OTcxfSwNCisgICAgezB4MTJlYjQ3MzYsIEwiQWdyYXZlIiwgMTkyfSwgICB7MHgxMmZmZjJiNywgTCJwdW5kIiwgMTYzfSwNCisgICAgezB4MTNmZGE5ZjIsIEwidGlsZGUiLCA3MzJ9LCAgICB7MHgxNDE3ZmQ2MiwgTCJ0aW1lcyIsIDIxNX0sDQorICAgIHsweDE1NGZjNzI2LCBMImVjaXJjIiwgMjM0fSwgICAgezB4MTY1YWE0NTEsIEwic2lnbWEiLCA5NjN9LA0KKyAgICB7MHgxNzA5MTI0YSwgTCJEYWdnZXIiLCA4MjI1fSwgIHsweDE5MmY3OGQ1LCBMImlleGNsIiwgMTYxfSwNCisgICAgezB4MWI3ZWQ4ZDcsIEwickFyciIsIDg2NTh9LCAgICB7MHgxZWM4OGM2OCwgTCJyYW5nIiwgOTAwMn0sDQorICAgIHsweDFlYzhhMGY3LCBMInJhcnIiLCA4NTk0fSwgICAgezB4MWVkYTA3ZjMsIEwiYXRpbGRlIiwgMjI3fSwNCisgICAgezB4MWYzMTgyYzQsIEwicmVhbCIsIDg0NzZ9LCAgICB7MHgxZmMzNGY4YiwgTCJ5YWN1dGUiLCAyNTN9LA0KKyAgICB7MHgyMGQxMTUyMiwgTCJhY2lyYyIsIDIyNn0sICAgIHsweDIxOTMzYTliLCBMInJzYXF1byIsIDgyNTB9LA0KKyAgICB7MHgyMWY0NDkwNywgTCJ1YWN1dGUiLCAyNTB9LCAgIHsweDIyMGNjYTcyLCBMImFjdXRlIiwgMTgwfSwNCisgICAgezB4MjQyY2RlZDEsIEwiYWxlZnN5bSIsIDg1MDF9LCB7MHgyNjU1YzY2YSwgTCJkZWx0YSIsIDk0OH0sDQorICAgIHsweDI2OWU0YjRkLCBMImV4aXN0IiwgODcwN30sICAgezB4MjczMzc5ZmEsIEwibWljcm8iLCAxODF9LA0KKyAgICB7MHgyN2EzNzQ0MCwgTCJmb3JhbGwiLCA4NzA0fSwgIHsweDI4NTRlNjJjLCBMIm1pbnVzIiwgODcyMn0sDQorICAgIHsweDI4NjM2ZjgxLCBMImNlZGlsIiwgMTg0fSwgICAgezB4Mjg4NzM1N2IsIEwiaWFjdXRlIiwgMjM3fSwNCisgICAgezB4Mjk5NGQ1ZmYsIEwiZnJhYzEyIiwgMTg5fSwgICB7MHgyOTk0ZDYwMSwgTCJmcmFjMTQiLCAxODh9LA0KKyAgICB7MHgyOTk0ZTA0MywgTCJmcmFjMzQiLCAxOTB9LCAgIHsweDJhMWZlYjQxLCBMImxhbWJkYSIsIDk1NX0sDQorICAgIHsweDJhYjIxNWYzLCBMImFwb3MiLCAzOX0sICAgICAgezB4MmFiODJlZjcsIEwiZWFjdXRlIiwgMjMzfSwNCisgICAgezB4MmIzNTkyZWYsIEwiYXVtbCIsIDIyOH0sICAgICB7MHgyY2U5Mjg3MywgTCJhYWN1dGUiLCAyMjV9LA0KKyAgICB7MHgyZGFmZjQ4YSwgTCJvc2xhc2giLCAyNDh9LCAgIHsweDJlZjY4ODgyLCBMImFlbGlnIiwgMjMwfSwNCisgICAgezB4MzA2MWQzZDMsIEwiQXRpbGRlIiwgMTk1fSwgICB7MHgzMTRiMWI2YiwgTCJZYWN1dGUiLCAyMjF9LA0KKyAgICB7MHgzMzdjMTRlNywgTCJVYWN1dGUiLCAyMTh9LCAgIHsweDM3Njc2YWNhLCBMImNlbnQiLCAxNjJ9LA0KKyAgICB7MHgzN2QwYjg0MSwgTCJjaXJjIiwgNzEwfSwgICAgIHsweDM4NmU3OTQ3LCBMImNvbmciLCA4NzczfSwNCisgICAgezB4Mzg2ZTgzOWIsIEwiY29weSIsIDE2OX0sICAgICB7MHgzYTBlMjI1YSwgTCJFcHNpbG9uIiwgOTE3fSwNCisgICAgezB4M2JhN2I3MjEsIEwiTGFtYmRhIiwgOTIzfSwgICB7MHgzYmQ5YWJlNiwgTCJBbHBoYSIsIDkxM30sDQorICAgIHsweDNjM2ZmYWQ3LCBMIkVhY3V0ZSIsIDIwMX0sICAgezB4M2NmYWY2OWYsIEwiYnJ2YmFyIiwgMTY2fSwNCisgICAgezB4M2Q1NGE0ODksIEwib21lZ2EiLCA5Njl9LCAgICB7MHgzZTcwZjQ1MywgTCJBYWN1dGUiLCAxOTN9LA0KKyAgICB7MHgzZjM3YzA2YSwgTCJPc2xhc2giLCAyMTZ9LCAgIHsweDQwZTFiMzRlLCBMImRpYW1zIiwgOTgzMH0sDQorICAgIHsweDQxNjU5NmRmLCBMInBsdXNtbiIsIDE3N30sICAgezB4NDM1NGZmMTYsIEwiVWNpcmMiLCAyMTl9LA0KKyAgICB7MHg0NTRmY2U2YSwgTCJVcHNpbG9uIiwgOTMzfSwgIHsweDQ2MTBhZDM1LCBMImVtc3AiLCA4MTk1fSwNCisgICAgezB4NDYyYWZiNzYsIEwiZW5zcCIsIDgxOTR9LCAgICB7MHg0NmUzMDA3MywgTCJldW1sIiwgMjM1fSwNCisgICAgezB4NDZlMzFhMWIsIEwiZXVybyIsIDgzNjR9LCAgICB7MHg0NmYyZWFkYSwgTCJsb3dhc3QiLCA4NzI3fSwNCisgICAgezB4NGRjYTI2Y2YsIEwiQXVtbCIsIDE5Nn0sICAgICB7MHg0ZTJkNjA4MywgTCJpbWFnZSIsIDg0NjV9LA0KKyAgICB7MHg0Zjk2NGVlOCwgTCJub3RpbiIsIDg3MTN9LCAgIHsweDUwOTE3YTdhLCBMImVwc2lsb24iLCA5NDl9LA0KKyAgICB7MHg1MmY5YTRjZCwgTCJLYXBwYSIsIDkyMn0sICAgIHsweDU0OTZmNDEwLCBMIk9jaXJjIiwgMjEyfSwNCisgICAgezB4NTY4Y2JmMzQsIEwiemV0YSIsIDk1MH0sICAgICB7MHg1N2JhZGQyMCwgTCJudGlsZGUiLCAyNDF9LA0KKyAgICB7MHg1ODY2MjEwOSwgTCJ6d25qIiwgODIwNH0sICAgIHsweDViMzk4NzBmLCBMImVtcHR5IiwgODcwOX0sDQorICAgIHsweDViZDMyNjhhLCBMInVwc2lsb24iLCA5NjV9LCAgezB4NWUyYmY4YTMsIEwiR2FtbWEiLCA5MTV9LA0KKyAgICB7MHg1ZjczYzEzYSwgTCJyc3F1byIsIDgyMTd9LCAgIHsweDYxZjJiYzRkLCBMImlvdGEiLCA5NTN9LA0KKyAgICB7MHg2MjViYmNmMywgTCJpc2luIiwgODcxMn0sICAgIHsweDYyOTA2ZGY3LCBMIml1bWwiLCAyMzl9LA0KKyAgICB7MHg2NGE1Y2IzMSwgTCJBcmluZyIsIDE5N30sICAgIHsweDY2ZjI1YzRhLCBMInNicXVvIiwgODIxOH0sDQorICAgIHsweDY4NTFhYjYwLCBMInNwYWRlcyIsIDk4MjR9LCAgezB4Njk0MmE5MDAsIEwiTnRpbGRlIiwgMjA5fSwNCisgICAgezB4Njk3Nzk0NTMsIEwiRXVtbCIsIDIwM30sICAgICB7MHg2Y2RhNmUyMywgTCJjdXJyZW50IiwgMTY0fSwNCisgICAgezB4NzBiNWI2MzQsIEwibHNxdW8iLCA4MjE2fSwgICB7MHg3MTVhMzcwNiwgTCJFY2lyYyIsIDIwMn0sDQorICAgIHsweDcxZThiZjhkLCBMInRkcXVvIiwgODIyMX0sICAgezB4NzI2NTE0MzEsIEwiU2lnbWEiLCA5MzF9LA0KKyAgICB7MHg3NTY5ODEzYiwgTCJpcXVlc3QiLCAxOTF9LCAgIHsweDc3NmE0MzZhLCBMImVxdWl2IiwgODgwMX0sDQorICAgIHsweDc5MjE1MzE0LCBMIlpldGEiLCA5MTh9LCAgICAgezB4NzliODEyMjQsIEwib2dyYXZlIiwgMjQyfSwNCisgICAgezB4N2MyZjhiMjMsIEwibWFjciIsIDE3NX0sICAgICB7MHg3Y2RiODUwMiwgTCJBY2lyYyIsIDE5NH0sDQorICAgIHsweDgxODVjNjJlLCBMIm5kYXNoIiwgODIxMX0sICAgezB4ODI2MDM2NGEsIEwiRGVsdGEiLCA5MTZ9LA0KKyAgICB7MHg4NDY2MTlhZCwgTCJtZGFzaCIsIDgyMTJ9LCAgIHsweDg1NTBmYjUwLCBMIk9FbGlnIiwgMzM4fSwNCisgICAgezB4ODhlYjViODUsIEwibGRxdW8iLCA4MjIwfSwgICB7MHg4YjNmZGUwNCwgTCJPZ3JhdmUiLCAyMTB9LA0KKyAgICB7MHg4YmM1Nzk0YiwgTCJvcmRmIiwgMTcwfSwgICAgIHsweDhiYzU3OTUyLCBMIm9yZG0iLCAxODZ9LA0KKyAgICB7MHg4YzE0OTIzZCwgTCJvdW1sIiwgMjQ2fSwgICAgIHsweDhjNWE3Y2Q2LCBMInRoZXRhIiwgOTUyfSwNCisgICAgezB4OGQ2MTgxMmIsIEwidGhvcm4iLCAyNTR9LCAgICB7MHg5MTJiOTVhYSwgTCJhc3ltcCIsIDg3NzZ9LA0KKyAgICB7MHg5NDdmYWY4MSwgTCJtaWRkb3QiLCAxODN9LCAgIHsweDk2MjkyMDJlLCBMImxmbG9vciIsIDg5NzB9LA0KKyAgICB7MHg5NzJlOWVjMSwgTCJvdGlsZGUiLCAyNDV9LCAgIHsweDk3NDhmMjMxLCBMIm90aW1lcyIsIDg4NTV9LA0KKyAgICB7MHg5OTVmMTQ2OSwgTCJPbWVnYSIsIDkzN30sICAgIHsweDk5ZWI1MzQ5LCBMInF1b3QiLCAzNH0sDQorICAgIHsweDlhZWI2MzllLCBMImhlbGxpcCIsIDgyMzB9LCAgezB4YTBhZTJmODYsIEwiU2Nhcm9uIiwgMzUyfSwNCisgICAgezB4YTRkY2IwZDUsIEwibHNhcXVvIiwgODI0OX0sICB7MHhhNTNkYmY0MSwgTCJvYWN1dGUiLCAyNDN9LA0KKyAgICB7MHhhNWFlOWU3YiwgTCJiZHF1byIsIDgyMjJ9LCAgIHsweGE2MDJkN2JhLCBMInNkb3QiLCA4OTAxfSwNCisgICAgezB4YTYxY2U4NmYsIEwic2VjdCIsIDE2N30sICAgICB7MHhhNmU0YzNkNywgTCJzaWdtYWYiLCA5NjJ9LA0KKyAgICB7MHhhN2MxYzc0ZiwgTCJzdWJlIiwgODgzOH0sICAgIHsweGE3YzIwZWU5LCBMInN1cDEiLCAxODV9LA0KKyAgICB7MHhhN2MyMGVlYSwgTCJzdXAyIiwgMTc4fSwgICAgIHsweGE3YzIwZWViLCBMInN1cDMiLCAxNzl9LA0KKyAgICB7MHhhN2MyMGYxZCwgTCJzdXBlIiwgODgzOX0sICAgIHsweGE4YjY2YWExLCBMIk90aWxkZSIsIDIxM30sDQorICAgIHsweGFkOTU4YzQyLCBMIkFFbGlnIiwgMTk4fSwgICAgezB4YWVhOTI2MWQsIEwiT3VtbCIsIDIxNH0sDQorICAgIHsweGIwNDBlYWZhLCBMInVBcnIiLCA4NjU3fSwgICAgezB4YjA3YzJlMWMsIEwiYmV0YSIsIDk0Nn0sDQorICAgIHsweGIyMjBlOTJmLCBMImJ1bGwiLCA4MjI2fSwgICAgezB4YjIyNzUwYzQsIEwiY2NlZGlsIiwgMjMxfSwNCisgICAgezB4YjM4YWIzMWEsIEwidWFyciIsIDg1OTN9LCAgICB7MHhiNTk4YjY4MywgTCJ1dW1sIiwgMjUyfSwNCisgICAgezB4YjZjNThiMjEsIEwiT2FjdXRlIiwgMjExfSwgICB7MHhiNmQyYTYxNywgTCJvbGluZSIsIDgyNTR9LA0KKyAgICB7MHhiYTlmZDk4OSwgTCJkQXJyIiwgODY1OX0sICAgIHsweGJiNWNjZDQxLCBMImxncmF2ZSIsIDIwNH0sDQorICAgIHsweGJkMzliNDRjLCBMIndlaWVycCIsIDg0NzJ9LCAgezB4YmRlOWExYTksIEwiZGFyciIsIDg1OTV9LA0KKyAgICB7MHhjMDI3ZTMyOSwgTCJwZXJtaWwiLCA4MjQwfSwgIHsweGMyNDUxMzg5LCBMInVwc2loIiwgOTc4fSwNCisgICAgezB4YzNhZjFjYTQsIEwiQ2NlZGlsIiwgMTk5fSwgICB7MHhjZDE2NDI0OSwgTCJmbm9mIiwgNDAyfSwNCisgICAgezB4Y2Y2Yzg0NjcsIEwiaGVhcnRzIiwgOTgyOX0sICB7MHhkMTIyODM5MCwgTCJ0cmFkZSIsIDg0ODJ9LA0KKyAgICB7MHhkMTQ2MjQwNywgTCJ5dW1sIiwgMjU1fSwgICAgIHsweGQyY2YyMjUzLCBMIm9wbHVzIiwgODg1M30sDQorICAgIHsweGQzMTBjMWZjLCBMIkJldGEiLCA5MTR9LCAgICAgezB4ZDU5YzRkNzQsIEwiaW5maW4iLCA4NzM0fSwNCisgICAgezB4ZDY0ZDQ3MGQsIEwiaEFyciIsIDg2NjB9LCAgICB7MHhkNjdkOWM3NSwgTCJkaXZpZGUiLCAyNDd9LA0KKyAgICB7MHhkNjk4ZGQzNywgTCJPbWljcm9uIiwgOTI3fSwgIHsweGQ4MmQ0YTYzLCBMIlV1bWwiLCAyMjB9LA0KKyAgICB7MHhkOTk3MGYyZCwgTCJoYXJyIiwgODU5Nn0sICAgIHsweGRhOTFmZDk5LCBMImNsdWJzIiwgOTgyN30sDQorICAgIHsweGRiZTViZGNjLCBMInRoZXJlNCIsIDg3NTZ9LCAgezB4ZGQ3NjcxYmQsIEwicHJpbWUiLCA4MjQyfSwNCisgICAgezB4ZGZjZjNjMDYsIEwiYWxwaGEiLCA5NDV9LCAgICB7MHhlMDIxMzA2MywgTCJzYXJvbiIsIDM1M30sDQorICAgIHsweGUxOTExZDgzLCBMInJhZGljIiwgODczMH0sICAgezB4ZTJlNzU0NjgsIEwicmFxdW8iLCAxODd9LA0KKyAgICB7MHhlNmUyN2E1ZSwgTCJsYWN1dGUiLCAyMDV9LCAgIHsweGU3NGE4ZjM2LCBMInVjaXJjIiwgMjUxfSwNCisgICAgezB4ZTg2NGVjYjYsIEwiVGhldGEiLCA5MjB9LCAgICB7MHhlY2RkZGU1ZSwgTCJuYWJsYSIsIDg3MTF9LA0KKyAgICB7MHhlZDFjMzU1NywgTCJvbWljcm9uIiwgOTU5fSwgIHsweGVmODIyMjhmLCBMInJjZWlsIiwgODk2OX0sDQorICAgIHsweGYxZmFiNDkxLCBMImxBcnIiLCA4NjU2fSwgICAgezB4ZjNkYWI3ZTcsIEwiWXVtbCIsIDM3Nn0sDQorICAgIHsweGY0Mjk0OTYyLCBMImxhcXVvIiwgMTcxfSwgICAgezB4ZjU0NDY4MjIsIEwibGFuZyIsIDkwMDF9LA0KKyAgICB7MHhmNTQ0N2NiMSwgTCJsYXJyIiwgODU5Mn0sICAgIHsweGY2NmU5YmVhLCBMInVncmF2ZSIsIDI0OX0sDQorICAgIHsweGY2YjRjZTcwLCBMImxvdGEiLCA5MjF9LCAgICAgezB4ZjZlZjM0ZWQsIEwia2FwcGEiLCA5NTR9LA0KKyAgICB7MHhmNzJhM2E1NiwgTCJ0aGluc3AiLCA4MjAxfSwgIHsweGY3NTI4MDFhLCBMImx1bWwiLCAyMDd9LA0KKyAgICB7MHhmODhjODQzMCwgTCJvY2lyYyIsIDI0NH0sICAgIHsweGY5Njc2MTc4LCBMImZyYXNsIiwgODI2MH0sDQorICAgIHsweGZkMDE4ODVlLCBMImlncmF2ZSIsIDIzNn0sICAgezB4ZmYzMjgxZGEsIEwiZWdyYXZlIiwgMjMyfSwNCiB9Ow0KLXN0YXRpYyBYRkFfRk1IdG1sUmVzZXJ2ZUNvZGUgcmVzZXJ2ZXNGb3JFbmNvZGUgW10gPSB7DQotICAgIHszNCwJTCJxdW90In0sDQotICAgIHszOCwJTCJhbXAifSwNCi0gICAgezM5LAlMImFwb3MifSwNCi0gICAgezYwLAlMImx0In0sDQotICAgIHs2MiwJTCJndCJ9LA0KLSAgICB7MTYwLAlMIm5ic3AifSwNCi0gICAgezE2MSwJTCJpZXhjbCJ9LA0KLSAgICB7MTYyLAlMImNlbnQifSwNCi0gICAgezE2MywJTCJwdW5kIn0sDQotICAgIHsxNjQsCUwiY3VycmVudCJ9LA0KLSAgICB7MTY1LAlMInllbiJ9LA0KLSAgICB7MTY2LAlMImJydmJhciJ9LA0KLSAgICB7MTY3LAlMInNlY3QifSwNCi0gICAgezE2OCwJTCJ1bWwifSwNCi0gICAgezE2OSwJTCJjb3B5In0sDQotICAgIHsxNzAsCUwib3JkZiJ9LA0KLSAgICB7MTcxLAlMImxhcXVvIn0sDQotICAgIHsxNzIsCUwibm90In0sDQotICAgIHsxNzMsCUwic2h5In0sDQotICAgIHsxNzQsCUwicmVnIn0sDQotICAgIHsxNzUsCUwibWFjciJ9LA0KLSAgICB7MTc2LAlMImRlZyJ9LA0KLSAgICB7MTc3LAlMInBsdXNtbiJ9LA0KLSAgICB7MTc4LAlMInN1cDIifSwNCi0gICAgezE3OSwJTCJzdXAzIn0sDQotICAgIHsxODAsCUwiYWN1dGUifSwNCi0gICAgezE4MSwJTCJtaWNybyJ9LA0KLSAgICB7MTgyLAlMInBhcmEifSwNCi0gICAgezE4MywJTCJtaWRkb3QifSwNCi0gICAgezE4NCwJTCJjZWRpbCJ9LA0KLSAgICB7MTg1LAlMInN1cDEifSwNCi0gICAgezE4NiwJTCJvcmRtIn0sDQotICAgIHsxODcsCUwicmFxdW8ifSwNCi0gICAgezE4OCwJTCJmcmFjMTQifSwNCi0gICAgezE4OSwJTCJmcmFjMTIifSwNCi0gICAgezE5MCwJTCJmcmFjMzQifSwNCi0gICAgezE5MSwJTCJpcXVlc3QifSwNCi0gICAgezE5MiwJTCJBZ3JhdmUifSwNCi0gICAgezE5MywJTCJBYWN1dGUifSwNCi0gICAgezE5NCwJTCJBY2lyYyJ9LA0KLSAgICB7MTk1LAlMIkF0aWxkZSJ9LA0KLSAgICB7MTk2LAlMIkF1bWwifSwNCi0gICAgezE5NywJTCJBcmluZyJ9LA0KLSAgICB7MTk4LAlMIkFFbGlnIn0sDQotICAgIHsxOTksCUwiQ2NlZGlsIn0sDQotICAgIHsyMDAsCUwiRWdyYXZlIn0sDQotICAgIHsyMDEsCUwiRWFjdXRlIn0sDQotICAgIHsyMDIsCUwiRWNpcmMifSwNCi0gICAgezIwMywJTCJFdW1sIn0sDQotICAgIHsyMDQsCUwibGdyYXZlIn0sDQotICAgIHsyMDUsCUwibGFjdXRlIn0sDQotICAgIHsyMDYsCUwibGNpcmMifSwNCi0gICAgezIwNywJTCJsdW1sIn0sDQotICAgIHsyMDgsCUwiRVRIIn0sDQotICAgIHsyMDksCUwiTnRpbGRlIn0sDQotICAgIHsyMTAsCUwiT2dyYXZlIn0sDQotICAgIHsyMTEsCUwiT2FjdXRlIn0sDQotICAgIHsyMTIsCUwiT2NpcmMifSwNCi0gICAgezIxMywJTCJPdGlsZGUifSwNCi0gICAgezIxNCwJTCJPdW1sIn0sDQotICAgIHsyMTUsCUwidGltZXMifSwNCi0gICAgezIxNiwJTCJPc2xhc2gifSwNCi0gICAgezIxNywJTCJVZ3JhdmUifSwNCi0gICAgezIxOCwJTCJVYWN1dGUifSwNCi0gICAgezIxOSwJTCJVY2lyYyJ9LA0KLSAgICB7MjIwLAlMIlV1bWwifSwNCi0gICAgezIyMSwJTCJZYWN1dGUifSwNCi0gICAgezIyMiwJTCJUSE9STiJ9LA0KLSAgICB7MjIzLAlMInN6bGlnIn0sDQotICAgIHsyMjQsCUwiYWdyYXZlIn0sDQotICAgIHsyMjUsCUwiYWFjdXRlIn0sDQotICAgIHsyMjYsCUwiYWNpcmMifSwNCi0gICAgezIyNywJTCJhdGlsZGUifSwNCi0gICAgezIyOCwJTCJhdW1sIn0sDQotICAgIHsyMjksCUwiYXJpbmcifSwNCi0gICAgezIzMCwJTCJhZWxpZyJ9LA0KLSAgICB7MjMxLAlMImNjZWRpbCJ9LA0KLSAgICB7MjMyLAlMImVncmF2ZSJ9LA0KLSAgICB7MjMzLAlMImVhY3V0ZSJ9LA0KLSAgICB7MjM0LAlMImVjaXJjIn0sDQotICAgIHsyMzUsCUwiZXVtbCJ9LA0KLSAgICB7MjM2LAlMImlncmF2ZSJ9LA0KLSAgICB7MjM3LAlMImlhY3V0ZSJ9LA0KLSAgICB7MjM4LAlMImljaXJjIn0sDQotICAgIHsyMzksCUwiaXVtbCJ9LA0KLSAgICB7MjQwLAlMImV0aCJ9LA0KLSAgICB7MjQxLAlMIm50aWxkZSJ9LA0KLSAgICB7MjQyLAlMIm9ncmF2ZSJ9LA0KLSAgICB7MjQzLAlMIm9hY3V0ZSJ9LA0KLSAgICB7MjQ0LAlMIm9jaXJjIn0sDQotICAgIHsyNDUsCUwib3RpbGRlIn0sDQotICAgIHsyNDYsCUwib3VtbCJ9LA0KLSAgICB7MjQ3LAlMImRpdmlkZSJ9LA0KLSAgICB7MjQ4LAlMIm9zbGFzaCJ9LA0KLSAgICB7MjQ5LAlMInVncmF2ZSJ9LA0KLSAgICB7MjUwLAlMInVhY3V0ZSJ9LA0KLSAgICB7MjUxLAlMInVjaXJjIn0sDQotICAgIHsyNTIsCUwidXVtbCJ9LA0KLSAgICB7MjUzLAlMInlhY3V0ZSJ9LA0KLSAgICB7MjU0LAlMInRob3JuIn0sDQotICAgIHsyNTUsCUwieXVtbCJ9LA0KLSAgICB7MzM4LAlMIk9FbGlnIn0sDQotICAgIHszMzksCUwib2VsaWcifSwNCi0gICAgezM1MiwJTCJTY2Fyb24ifSwNCi0gICAgezM1MywJTCJzYXJvbiJ9LA0KLSAgICB7Mzc2LAlMIll1bWwifSwNCi0gICAgezQwMiwJTCJmbm9mIn0sDQotICAgIHs3MTAsCUwiY2lyYyJ9LA0KLSAgICB7NzMyLAlMInRpbGRlIn0sDQotICAgIHs5MTMsCUwiQWxwaGEifSwNCi0gICAgezkxNCwJTCJCZXRhIn0sDQotICAgIHs5MTUsCUwiR2FtbWEifSwNCi0gICAgezkxNiwJTCJEZWx0YSJ9LA0KLSAgICB7OTE3LAlMIkVwc2lsb24ifSwNCi0gICAgezkxOCwJTCJaZXRhIn0sDQotICAgIHs5MTksCUwiRXRhIn0sDQotICAgIHs5MjAsCUwiVGhldGEifSwNCi0gICAgezkyMSwJTCJsb3RhIn0sDQotICAgIHs5MjIsCUwiS2FwcGEifSwNCi0gICAgezkyMywJTCJMYW1iZGEifSwNCi0gICAgezkyNCwJTCJNdSJ9LA0KLSAgICB7OTI1LAlMIk51In0sDQotICAgIHs5MjYsCUwiWGkifSwNCi0gICAgezkyNywJTCJPbWljcm9uIn0sDQotICAgIHs5MjgsCUwiUGkifSwNCi0gICAgezkyOSwJTCJSaG8ifSwNCi0gICAgezkzMSwJTCJTaWdtYSJ9LA0KLSAgICB7OTMyLAlMIlRhdSJ9LA0KLSAgICB7OTMzLAlMIlVwc2lsb24ifSwNCi0gICAgezkzNCwJTCJQaGkifSwNCi0gICAgezkzNSwJTCJDaGkifSwNCi0gICAgezkzNiwJTCJQc2kifSwNCi0gICAgezkzNywJTCJPbWVnYSJ9LA0KLSAgICB7OTQ1LAlMImFscGhhIn0sDQotICAgIHs5NDYsCUwiYmV0YSJ9LA0KLSAgICB7OTQ3LAlMImdhbW1hIn0sDQotICAgIHs5NDgsCUwiZGVsdGEifSwNCi0gICAgezk0OSwJTCJlcHNpbG9uIn0sDQotICAgIHs5NTAsCUwiemV0YSJ9LA0KLSAgICB7OTUxLAlMImV0YSJ9LA0KLSAgICB7OTUyLAlMInRoZXRhIn0sDQotICAgIHs5NTMsCUwiaW90YSJ9LA0KLSAgICB7OTU0LAlMImthcHBhIn0sDQotICAgIHs5NTUsCUwibGFtYmRhIn0sDQotICAgIHs5NTYsCUwibXUifSwNCi0gICAgezk1NywJTCJudSJ9LA0KLSAgICB7OTU4LAlMInhpIn0sDQotICAgIHs5NTksCUwib21pY3JvbiJ9LA0KLSAgICB7OTYwLAlMInBpIn0sDQotICAgIHs5NjEsCUwicmhvIn0sDQotICAgIHs5NjIsCUwic2lnbWFmIn0sDQotICAgIHs5NjMsCUwic2lnbWEifSwNCi0gICAgezk2NCwJTCJ0YXUifSwNCi0gICAgezk2NSwJTCJ1cHNpbG9uIn0sDQotICAgIHs5NjYsCUwicGhpIn0sDQotICAgIHs5NjcsCUwiY2hpIn0sDQotICAgIHs5NjgsCUwicHNpIn0sDQotICAgIHs5NjksCUwib21lZ2EifSwNCi0gICAgezk3NywJTCJ0aGV0YXN5bSJ9LA0KLSAgICB7OTc4LAlMInVwc2loIn0sDQotICAgIHs5ODIsCUwicGl2In0sDQotICAgIHs4MTk0LAlMImVuc3AifSwNCi0gICAgezgxOTUsCUwiZW1zcCJ9LA0KLSAgICB7ODIwMSwJTCJ0aGluc3AifSwNCi0gICAgezgyMDQsCUwienduaiJ9LA0KLSAgICB7ODIwNSwJTCJ6d2oifSwNCi0gICAgezgyMDYsCUwibHJtIn0sDQotICAgIHs4MjA3LAlMInJsbSJ9LA0KLSAgICB7ODIxMSwJTCJuZGFzaCJ9LA0KLSAgICB7ODIxMiwJTCJtZGFzaCJ9LA0KLSAgICB7ODIxNiwJTCJsc3F1byJ9LA0KLSAgICB7ODIxNywJTCJyc3F1byJ9LA0KLSAgICB7ODIxOCwJTCJzYnF1byJ9LA0KLSAgICB7ODIyMCwJTCJsZHF1byJ9LA0KLSAgICB7ODIyMSwJTCJ0ZHF1byJ9LA0KLSAgICB7ODIyMiwJTCJiZHF1byJ9LA0KLSAgICB7ODIyNCwJTCJkYWdnZXIifSwNCi0gICAgezgyMjUsCUwiRGFnZ2VyIn0sDQotICAgIHs4MjI2LAlMImJ1bGwifSwNCi0gICAgezgyMzAsCUwiaGVsbGlwIn0sDQotICAgIHs4MjQwLAlMInBlcm1pbCJ9LA0KLSAgICB7ODI0MiwJTCJwcmltZSJ9LA0KLSAgICB7ODI0OSwJTCJsc2FxdW8ifSwNCi0gICAgezgyNTAsCUwicnNhcXVvIn0sDQotICAgIHs4MjU0LAlMIm9saW5lIn0sDQotICAgIHs4MjYwLAlMImZyYXNsIn0sDQotICAgIHs4MzY0LAlMImV1cm8ifSwNCi0gICAgezg0NjUsCUwiaW1hZ2UifSwNCi0gICAgezg0NzIsCUwid2VpZXJwIn0sDQotICAgIHs4NDc2LAlMInJlYWwifSwNCi0gICAgezg0ODIsCUwidHJhZGUifSwNCi0gICAgezg1MDEsCUwiYWxlZnN5bSJ9LA0KLSAgICB7ODU5MiwJTCJsYXJyIn0sDQotICAgIHs4NTkzLAlMInVhcnIifSwNCi0gICAgezg1OTQsCUwicmFyciJ9LA0KLSAgICB7ODU5NSwJTCJkYXJyIn0sDQotICAgIHs4NTk2LAlMImhhcnIifSwNCi0gICAgezg2MjksCUwiY3JhcnIifSwNCi0gICAgezg2NTYsCUwibEFyciJ9LA0KLSAgICB7ODY1NywJTCJ1QXJyIn0sDQotICAgIHs4NjU4LAlMInJBcnIifSwNCi0gICAgezg2NTksCUwiZEFyciJ9LA0KLSAgICB7ODY2MCwJTCJoQXJyIn0sDQotICAgIHs4NzA0LAlMImZvcmFsbCJ9LA0KLSAgICB7ODcwNiwJTCJwYXJ0In0sDQotICAgIHs4NzA3LAlMImV4aXN0In0sDQotICAgIHs4NzA5LAlMImVtcHR5In0sDQotICAgIHs4NzExLAlMIm5hYmxhIn0sDQotICAgIHs4NzEyLAlMImlzaW4ifSwNCi0gICAgezg3MTMsCUwibm90aW4ifSwNCi0gICAgezg3MTUsCUwibmkifSwNCi0gICAgezg3MTksCUwicHJvZCJ9LA0KLSAgICB7ODcyMSwJTCJzdW0ifSwNCi0gICAgezg3MjIsCUwibWludXMifSwNCi0gICAgezg3MjcsCUwibG93YXN0In0sDQotICAgIHs4NzMwLAlMInJhZGljIn0sDQotICAgIHs4NzMzLAlMInByb3AifSwNCi0gICAgezg3MzQsCUwiaW5maW4ifSwNCi0gICAgezg3MzYsCUwiYW5nIn0sDQotICAgIHs4NzQzLAlMImFuZCJ9LA0KLSAgICB7ODc0NCwJTCJvciJ9LA0KLSAgICB7ODc0NSwJTCJjYXAifSwNCi0gICAgezg3NDYsCUwiY3VwIn0sDQotICAgIHs4NzQ3LAlMImludCJ9LA0KLSAgICB7ODc1NiwJTCJ0aGVyZTQifSwNCi0gICAgezg3NjQsCUwic2ltIn0sDQotICAgIHs4NzczLAlMImNvbmcifSwNCi0gICAgezg3NzYsCUwiYXN5bXAifSwNCi0gICAgezg4MDAsCUwibmUifSwNCi0gICAgezg4MDEsCUwiZXF1aXYifSwNCi0gICAgezg4MDQsCUwibGUifSwNCi0gICAgezg4MDUsCUwiZ2UifSwNCi0gICAgezg4MzQsCUwic3ViIn0sDQotICAgIHs4ODM1LAlMInN1cCJ9LA0KLSAgICB7ODgzNiwJTCJuc3ViIn0sDQotICAgIHs4ODM4LAlMInN1YmUifSwNCi0gICAgezg4MzksCUwic3VwZSJ9LA0KLSAgICB7ODg1MywJTCJvcGx1cyJ9LA0KLSAgICB7ODg1NSwJTCJvdGltZXMifSwNCi0gICAgezg4NjksCUwicGVycCJ9LA0KLSAgICB7ODkwMSwJTCJzZG90In0sDQotICAgIHs4OTY4LAlMImxjZWlsIn0sDQotICAgIHs4OTY5LAlMInJjZWlsIn0sDQotICAgIHs4OTcwLAlMImxmbG9vciJ9LA0KLSAgICB7ODk3MSwJTCJyZmxvb3IifSwNCi0gICAgezkwMDEsCUwibGFuZyJ9LA0KLSAgICB7OTAwMiwJTCJyYW5nIn0sDQotICAgIHs5Njc0LAlMImxveiJ9LA0KLSAgICB7OTgyNCwJTCJzcGFkZXMifSwNCi0gICAgezk4MjcsCUwiY2x1YnMifSwNCi0gICAgezk4MjksCUwiaGVhcnRzIn0sDQotICAgIHs5ODMwLAlMImRpYW1zIn0sDQorc3RhdGljIFhGQV9GTUh0bWxSZXNlcnZlQ29kZSByZXNlcnZlc0ZvckVuY29kZVtdID0gew0KKyAgICB7MzQsIEwicXVvdCJ9LCAgICAgezM4LCBMImFtcCJ9LCAgICAgIHszOSwgTCJhcG9zIn0sDQorICAgIHs2MCwgTCJsdCJ9LCAgICAgICB7NjIsIEwiZ3QifSwgICAgICAgezE2MCwgTCJuYnNwIn0sDQorICAgIHsxNjEsIEwiaWV4Y2wifSwgICB7MTYyLCBMImNlbnQifSwgICAgezE2MywgTCJwdW5kIn0sDQorICAgIHsxNjQsIEwiY3VycmVudCJ9LCB7MTY1LCBMInllbiJ9LCAgICAgezE2NiwgTCJicnZiYXIifSwNCisgICAgezE2NywgTCJzZWN0In0sICAgIHsxNjgsIEwidW1sIn0sICAgICB7MTY5LCBMImNvcHkifSwNCisgICAgezE3MCwgTCJvcmRmIn0sICAgIHsxNzEsIEwibGFxdW8ifSwgICB7MTcyLCBMIm5vdCJ9LA0KKyAgICB7MTczLCBMInNoeSJ9LCAgICAgezE3NCwgTCJyZWcifSwgICAgIHsxNzUsIEwibWFjciJ9LA0KKyAgICB7MTc2LCBMImRlZyJ9LCAgICAgezE3NywgTCJwbHVzbW4ifSwgIHsxNzgsIEwic3VwMiJ9LA0KKyAgICB7MTc5LCBMInN1cDMifSwgICAgezE4MCwgTCJhY3V0ZSJ9LCAgIHsxODEsIEwibWljcm8ifSwNCisgICAgezE4MiwgTCJwYXJhIn0sICAgIHsxODMsIEwibWlkZG90In0sICB7MTg0LCBMImNlZGlsIn0sDQorICAgIHsxODUsIEwic3VwMSJ9LCAgICB7MTg2LCBMIm9yZG0ifSwgICAgezE4NywgTCJyYXF1byJ9LA0KKyAgICB7MTg4LCBMImZyYWMxNCJ9LCAgezE4OSwgTCJmcmFjMTIifSwgIHsxOTAsIEwiZnJhYzM0In0sDQorICAgIHsxOTEsIEwiaXF1ZXN0In0sICB7MTkyLCBMIkFncmF2ZSJ9LCAgezE5MywgTCJBYWN1dGUifSwNCisgICAgezE5NCwgTCJBY2lyYyJ9LCAgIHsxOTUsIEwiQXRpbGRlIn0sICB7MTk2LCBMIkF1bWwifSwNCisgICAgezE5NywgTCJBcmluZyJ9LCAgIHsxOTgsIEwiQUVsaWcifSwgICB7MTk5LCBMIkNjZWRpbCJ9LA0KKyAgICB7MjAwLCBMIkVncmF2ZSJ9LCAgezIwMSwgTCJFYWN1dGUifSwgIHsyMDIsIEwiRWNpcmMifSwNCisgICAgezIwMywgTCJFdW1sIn0sICAgIHsyMDQsIEwibGdyYXZlIn0sICB7MjA1LCBMImxhY3V0ZSJ9LA0KKyAgICB7MjA2LCBMImxjaXJjIn0sICAgezIwNywgTCJsdW1sIn0sICAgIHsyMDgsIEwiRVRIIn0sDQorICAgIHsyMDksIEwiTnRpbGRlIn0sICB7MjEwLCBMIk9ncmF2ZSJ9LCAgezIxMSwgTCJPYWN1dGUifSwNCisgICAgezIxMiwgTCJPY2lyYyJ9LCAgIHsyMTMsIEwiT3RpbGRlIn0sICB7MjE0LCBMIk91bWwifSwNCisgICAgezIxNSwgTCJ0aW1lcyJ9LCAgIHsyMTYsIEwiT3NsYXNoIn0sICB7MjE3LCBMIlVncmF2ZSJ9LA0KKyAgICB7MjE4LCBMIlVhY3V0ZSJ9LCAgezIxOSwgTCJVY2lyYyJ9LCAgIHsyMjAsIEwiVXVtbCJ9LA0KKyAgICB7MjIxLCBMIllhY3V0ZSJ9LCAgezIyMiwgTCJUSE9STiJ9LCAgIHsyMjMsIEwic3psaWcifSwNCisgICAgezIyNCwgTCJhZ3JhdmUifSwgIHsyMjUsIEwiYWFjdXRlIn0sICB7MjI2LCBMImFjaXJjIn0sDQorICAgIHsyMjcsIEwiYXRpbGRlIn0sICB7MjI4LCBMImF1bWwifSwgICAgezIyOSwgTCJhcmluZyJ9LA0KKyAgICB7MjMwLCBMImFlbGlnIn0sICAgezIzMSwgTCJjY2VkaWwifSwgIHsyMzIsIEwiZWdyYXZlIn0sDQorICAgIHsyMzMsIEwiZWFjdXRlIn0sICB7MjM0LCBMImVjaXJjIn0sICAgezIzNSwgTCJldW1sIn0sDQorICAgIHsyMzYsIEwiaWdyYXZlIn0sICB7MjM3LCBMImlhY3V0ZSJ9LCAgezIzOCwgTCJpY2lyYyJ9LA0KKyAgICB7MjM5LCBMIml1bWwifSwgICAgezI0MCwgTCJldGgifSwgICAgIHsyNDEsIEwibnRpbGRlIn0sDQorICAgIHsyNDIsIEwib2dyYXZlIn0sICB7MjQzLCBMIm9hY3V0ZSJ9LCAgezI0NCwgTCJvY2lyYyJ9LA0KKyAgICB7MjQ1LCBMIm90aWxkZSJ9LCAgezI0NiwgTCJvdW1sIn0sICAgIHsyNDcsIEwiZGl2aWRlIn0sDQorICAgIHsyNDgsIEwib3NsYXNoIn0sICB7MjQ5LCBMInVncmF2ZSJ9LCAgezI1MCwgTCJ1YWN1dGUifSwNCisgICAgezI1MSwgTCJ1Y2lyYyJ9LCAgIHsyNTIsIEwidXVtbCJ9LCAgICB7MjUzLCBMInlhY3V0ZSJ9LA0KKyAgICB7MjU0LCBMInRob3JuIn0sICAgezI1NSwgTCJ5dW1sIn0sICAgIHszMzgsIEwiT0VsaWcifSwNCisgICAgezMzOSwgTCJvZWxpZyJ9LCAgIHszNTIsIEwiU2Nhcm9uIn0sICB7MzUzLCBMInNhcm9uIn0sDQorICAgIHszNzYsIEwiWXVtbCJ9LCAgICB7NDAyLCBMImZub2YifSwgICAgezcxMCwgTCJjaXJjIn0sDQorICAgIHs3MzIsIEwidGlsZGUifSwgICB7OTEzLCBMIkFscGhhIn0sICAgezkxNCwgTCJCZXRhIn0sDQorICAgIHs5MTUsIEwiR2FtbWEifSwgICB7OTE2LCBMIkRlbHRhIn0sICAgezkxNywgTCJFcHNpbG9uIn0sDQorICAgIHs5MTgsIEwiWmV0YSJ9LCAgICB7OTE5LCBMIkV0YSJ9LCAgICAgezkyMCwgTCJUaGV0YSJ9LA0KKyAgICB7OTIxLCBMImxvdGEifSwgICAgezkyMiwgTCJLYXBwYSJ9LCAgIHs5MjMsIEwiTGFtYmRhIn0sDQorICAgIHs5MjQsIEwiTXUifSwgICAgICB7OTI1LCBMIk51In0sICAgICAgezkyNiwgTCJYaSJ9LA0KKyAgICB7OTI3LCBMIk9taWNyb24ifSwgezkyOCwgTCJQaSJ9LCAgICAgIHs5MjksIEwiUmhvIn0sDQorICAgIHs5MzEsIEwiU2lnbWEifSwgICB7OTMyLCBMIlRhdSJ9LCAgICAgezkzMywgTCJVcHNpbG9uIn0sDQorICAgIHs5MzQsIEwiUGhpIn0sICAgICB7OTM1LCBMIkNoaSJ9LCAgICAgezkzNiwgTCJQc2kifSwNCisgICAgezkzNywgTCJPbWVnYSJ9LCAgIHs5NDUsIEwiYWxwaGEifSwgICB7OTQ2LCBMImJldGEifSwNCisgICAgezk0NywgTCJnYW1tYSJ9LCAgIHs5NDgsIEwiZGVsdGEifSwgICB7OTQ5LCBMImVwc2lsb24ifSwNCisgICAgezk1MCwgTCJ6ZXRhIn0sICAgIHs5NTEsIEwiZXRhIn0sICAgICB7OTUyLCBMInRoZXRhIn0sDQorICAgIHs5NTMsIEwiaW90YSJ9LCAgICB7OTU0LCBMImthcHBhIn0sICAgezk1NSwgTCJsYW1iZGEifSwNCisgICAgezk1NiwgTCJtdSJ9LCAgICAgIHs5NTcsIEwibnUifSwgICAgICB7OTU4LCBMInhpIn0sDQorICAgIHs5NTksIEwib21pY3JvbiJ9LCB7OTYwLCBMInBpIn0sICAgICAgezk2MSwgTCJyaG8ifSwNCisgICAgezk2MiwgTCJzaWdtYWYifSwgIHs5NjMsIEwic2lnbWEifSwgICB7OTY0LCBMInRhdSJ9LA0KKyAgICB7OTY1LCBMInVwc2lsb24ifSwgezk2NiwgTCJwaGkifSwgICAgIHs5NjcsIEwiY2hpIn0sDQorICAgIHs5NjgsIEwicHNpIn0sICAgICB7OTY5LCBMIm9tZWdhIn0sICAgezk3NywgTCJ0aGV0YXN5bSJ9LA0KKyAgICB7OTc4LCBMInVwc2loIn0sICAgezk4MiwgTCJwaXYifSwgICAgIHs4MTk0LCBMImVuc3AifSwNCisgICAgezgxOTUsIEwiZW1zcCJ9LCAgIHs4MjAxLCBMInRoaW5zcCJ9LCB7ODIwNCwgTCJ6d25qIn0sDQorICAgIHs4MjA1LCBMInp3aiJ9LCAgICB7ODIwNiwgTCJscm0ifSwgICAgezgyMDcsIEwicmxtIn0sDQorICAgIHs4MjExLCBMIm5kYXNoIn0sICB7ODIxMiwgTCJtZGFzaCJ9LCAgezgyMTYsIEwibHNxdW8ifSwNCisgICAgezgyMTcsIEwicnNxdW8ifSwgIHs4MjE4LCBMInNicXVvIn0sICB7ODIyMCwgTCJsZHF1byJ9LA0KKyAgICB7ODIyMSwgTCJ0ZHF1byJ9LCAgezgyMjIsIEwiYmRxdW8ifSwgIHs4MjI0LCBMImRhZ2dlciJ9LA0KKyAgICB7ODIyNSwgTCJEYWdnZXIifSwgezgyMjYsIEwiYnVsbCJ9LCAgIHs4MjMwLCBMImhlbGxpcCJ9LA0KKyAgICB7ODI0MCwgTCJwZXJtaWwifSwgezgyNDIsIEwicHJpbWUifSwgIHs4MjQ5LCBMImxzYXF1byJ9LA0KKyAgICB7ODI1MCwgTCJyc2FxdW8ifSwgezgyNTQsIEwib2xpbmUifSwgIHs4MjYwLCBMImZyYXNsIn0sDQorICAgIHs4MzY0LCBMImV1cm8ifSwgICB7ODQ2NSwgTCJpbWFnZSJ9LCAgezg0NzIsIEwid2VpZXJwIn0sDQorICAgIHs4NDc2LCBMInJlYWwifSwgICB7ODQ4MiwgTCJ0cmFkZSJ9LCAgezg1MDEsIEwiYWxlZnN5bSJ9LA0KKyAgICB7ODU5MiwgTCJsYXJyIn0sICAgezg1OTMsIEwidWFyciJ9LCAgIHs4NTk0LCBMInJhcnIifSwNCisgICAgezg1OTUsIEwiZGFyciJ9LCAgIHs4NTk2LCBMImhhcnIifSwgICB7ODYyOSwgTCJjcmFyciJ9LA0KKyAgICB7ODY1NiwgTCJsQXJyIn0sICAgezg2NTcsIEwidUFyciJ9LCAgIHs4NjU4LCBMInJBcnIifSwNCisgICAgezg2NTksIEwiZEFyciJ9LCAgIHs4NjYwLCBMImhBcnIifSwgICB7ODcwNCwgTCJmb3JhbGwifSwNCisgICAgezg3MDYsIEwicGFydCJ9LCAgIHs4NzA3LCBMImV4aXN0In0sICB7ODcwOSwgTCJlbXB0eSJ9LA0KKyAgICB7ODcxMSwgTCJuYWJsYSJ9LCAgezg3MTIsIEwiaXNpbiJ9LCAgIHs4NzEzLCBMIm5vdGluIn0sDQorICAgIHs4NzE1LCBMIm5pIn0sICAgICB7ODcxOSwgTCJwcm9kIn0sICAgezg3MjEsIEwic3VtIn0sDQorICAgIHs4NzIyLCBMIm1pbnVzIn0sICB7ODcyNywgTCJsb3dhc3QifSwgezg3MzAsIEwicmFkaWMifSwNCisgICAgezg3MzMsIEwicHJvcCJ9LCAgIHs4NzM0LCBMImluZmluIn0sICB7ODczNiwgTCJhbmcifSwNCisgICAgezg3NDMsIEwiYW5kIn0sICAgIHs4NzQ0LCBMIm9yIn0sICAgICB7ODc0NSwgTCJjYXAifSwNCisgICAgezg3NDYsIEwiY3VwIn0sICAgIHs4NzQ3LCBMImludCJ9LCAgICB7ODc1NiwgTCJ0aGVyZTQifSwNCisgICAgezg3NjQsIEwic2ltIn0sICAgIHs4NzczLCBMImNvbmcifSwgICB7ODc3NiwgTCJhc3ltcCJ9LA0KKyAgICB7ODgwMCwgTCJuZSJ9LCAgICAgezg4MDEsIEwiZXF1aXYifSwgIHs4ODA0LCBMImxlIn0sDQorICAgIHs4ODA1LCBMImdlIn0sICAgICB7ODgzNCwgTCJzdWIifSwgICAgezg4MzUsIEwic3VwIn0sDQorICAgIHs4ODM2LCBMIm5zdWIifSwgICB7ODgzOCwgTCJzdWJlIn0sICAgezg4MzksIEwic3VwZSJ9LA0KKyAgICB7ODg1MywgTCJvcGx1cyJ9LCAgezg4NTUsIEwib3RpbWVzIn0sIHs4ODY5LCBMInBlcnAifSwNCisgICAgezg5MDEsIEwic2RvdCJ9LCAgIHs4OTY4LCBMImxjZWlsIn0sICB7ODk2OSwgTCJyY2VpbCJ9LA0KKyAgICB7ODk3MCwgTCJsZmxvb3IifSwgezg5NzEsIEwicmZsb29yIn0sIHs5MDAxLCBMImxhbmcifSwNCisgICAgezkwMDIsIEwicmFuZyJ9LCAgIHs5Njc0LCBMImxveiJ9LCAgICB7OTgyNCwgTCJzcGFkZXMifSwNCisgICAgezk4MjcsIEwiY2x1YnMifSwgIHs5ODI5LCBMImhlYXJ0cyJ9LCB7OTgzMCwgTCJkaWFtcyJ9LA0KIH07DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6QWJzKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGlmKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQotICAgICAgICBpZihIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKTsNCi0gICAgICAgICAgICBpZihkVmFsdWUgPCAwKSB7DQotICAgICAgICAgICAgICAgIGRWYWx1ZSA9IC1kVmFsdWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGRWYWx1ZSk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6QWJzKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiQWJzIik7DQorICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgIGlmIChkVmFsdWUgPCAwKSB7DQorICAgICAgICBkVmFsdWUgPSAtZFZhbHVlOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkVmFsdWUpOw0KICAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkFicyIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpBdmcoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgdWludDMyX3QgdUNvdW50ID0gMDsNCi0gICAgRlhfRE9VQkxFIGRTdW0gPSAwLjA7DQotICAgIGlmKGFyZ2MgPj0gMSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1ZhbHVlID0gMDsNCi0gICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQotICAgICAgICAgICAgYXJnVmFsdWUgPSBhcmdzLkdldFZhbHVlKGkpOw0KLSAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1ZhbHVlLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGlmKGlMZW5ndGggPiAyKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaiA9IDI7IGogPCBpTGVuZ3RoOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBqLCBqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGRlZmF1bHRQcm9wVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgZGVmYXVsdFByb3BWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKGRlZmF1bHRQcm9wVmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkU3VtICs9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBkZWZhdWx0UHJvcFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZGVmYXVsdFByb3BWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGosIGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRTdW0gKz0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUNvdW50Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZFN1bSArPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVmFsdWUpOw0KLSAgICAgICAgICAgICAgICB1Q291bnQrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQotICAgICAgICB9DQotICAgICAgICBhcmdWYWx1ZSA9IDA7DQotICAgIH0NCi0gICAgaWYoMCA9PSB1Q291bnQpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGRTdW0gLyB1Q291bnQpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkNlaWwoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVmFsdWUpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChhcmdzLkdldFJldHVyblZhbHVlKCksIEZYU1lTX2NlaWwoSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVmFsdWUpKSk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIkNlaWwiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpDb3VudChGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICB1aW50MzJfdCB1Q291bnQgPSAwOw0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkF2ZyhGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgdWludDMyX3QgdUNvdW50ID0gMDsNCisgIEZYX0RPVUJMRSBkU3VtID0gMC4wOw0KKyAgaWYgKGFyZ2MgPj0gMSkgew0KICAgICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSAwOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KLSAgICAgICAgYXJnVmFsdWUgPSBhcmdzLkdldFZhbHVlKGkpOw0KLSAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1ZhbHVlKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfSBlbHNlIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnVmFsdWUpKSB7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1ZhbHVlLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIGlmKGlMZW5ndGggPiAyKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMiwganNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGksIGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Q291bnQrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQotICAgICAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgbmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgdUNvdW50ICs9IChGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkgPyAwIDogMSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICAgIGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1ZhbHVlKSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnVmFsdWUpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdWYWx1ZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgICBpZiAoaUxlbmd0aCA+IDIpIHsNCisgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDI7IGogPCBpTGVuZ3RoOyBqKyspIHsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgZGVmYXVsdFByb3BWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgZGVmYXVsdFByb3BWYWx1ZSk7DQorICAgICAgICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChkZWZhdWx0UHJvcFZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBkU3VtICs9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBkZWZhdWx0UHJvcFZhbHVlKTsNCisgICAgICAgICAgICAgICAgdUNvdW50Kys7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGRlZmF1bHRQcm9wVmFsdWUpOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdWYWx1ZSkpIHsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnVmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgew0KKyAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBqLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgZFN1bSArPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGRTdW0gKz0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlKTsNCisgICAgICAgIHVDb3VudCsrOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgfQ0KKyAgICBhcmdWYWx1ZSA9IDA7DQorICB9DQorICBpZiAoMCA9PSB1Q291bnQpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZFN1bSAvIHVDb3VudCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkNlaWwoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1ZhbHVlKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfY2VpbChIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdWYWx1ZSkpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJDZWlsIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkNvdW50KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgdWludDMyX3QgdUNvdW50ID0gMDsNCisgIEZYSlNFX0hWQUxVRSBhcmdWYWx1ZSA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsNCisgICAgYXJnVmFsdWUgPSBhcmdzLkdldFZhbHVlKGkpOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1ZhbHVlKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnVmFsdWUpKSB7DQorICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1ZhbHVlLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCisgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgIGlmIChpTGVuZ3RoID4gMikgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KICAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgdUNvdW50Kys7DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdUNvdW50Kys7DQorICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGksIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICB1Q291bnQgKz0gKEZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSA/IDAgOiAxKTsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQotICAgIH0NCi0gICAgYXJnVmFsdWUgPSAwOw0KLSAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGludDMyX3QpdUNvdW50KTsNCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Rmxvb3IoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVmFsdWUpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChhcmdzLkdldFJldHVyblZhbHVlKCksIEZYU1lTX2Zsb29yKEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1ZhbHVlKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnVmFsdWUpKSB7DQorICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdWYWx1ZSwgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgIHVDb3VudCsrOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiRmxvb3IiKTsNCisgICAgICB1Q291bnQrKzsNCiAgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgIH0NCisgIGFyZ1ZhbHVlID0gMDsNCisgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoaW50MzJfdCl1Q291bnQpOw0KIH0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpNYXgoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgdWludDMyX3QgdUNvdW50ID0gMDsNCi0gICAgRlhfRE9VQkxFIGRNYXhWYWx1ZSA9IDAuMDsNCi0gICAgRlhKU0VfSFZBTFVFIGFyZ1ZhbHVlID0gMDsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsNCi0gICAgICAgIGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsNCi0gICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdWYWx1ZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlKSkgew0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdWYWx1ZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICBpZihpTGVuZ3RoID4gMikgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIDIsIGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBpLCBqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgbmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Q291bnQrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodUNvdW50ID09IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRNYXhWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkTWF4VmFsdWUgPCBkVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkTWF4VmFsdWUgPSBkVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQotICAgICAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgbmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Q291bnQrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodUNvdW50ID09IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRNYXhWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkTWF4VmFsdWUgPCBkVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkTWF4VmFsdWUgPSBkVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Rmxvb3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1ZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVmFsdWUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19mbG9vcihIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdWYWx1ZSkpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJGbG9vciIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpNYXgoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIHVpbnQzMl90IHVDb3VudCA9IDA7DQorICBGWF9ET1VCTEUgZE1heFZhbHVlID0gMC4wOw0KKyAgRlhKU0VfSFZBTFVFIGFyZ1ZhbHVlID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICBhcmdWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoaSk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnVmFsdWUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICAgICAgY29udGludWU7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnVmFsdWUsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgaWYgKGlMZW5ndGggPiAyKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCAyLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBpLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgaWYgKHVDb3VudCA9PSAxKSB7DQorICAgICAgICAgICAgICAgIGRNYXhWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmIChkTWF4VmFsdWUgPCBkVmFsdWUpIHsNCisgICAgICAgICAgICAgICAgICBkTWF4VmFsdWUgPSBkVmFsdWU7DQogICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ1ZhbHVlKSkgew0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBpLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgaWYgKHVDb3VudCA9PSAxKSB7DQorICAgICAgICAgICAgICAgIGRNYXhWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmIChkTWF4VmFsdWUgPCBkVmFsdWUpIHsNCisgICAgICAgICAgICAgICAgICBkTWF4VmFsdWUgPSBkVmFsdWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ1ZhbHVlLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgdUNvdW50Kys7DQorICAgICAgICBpZiAodUNvdW50ID09IDEpIHsNCisgICAgICAgICAgZE1heFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgaWYgKGRNYXhWYWx1ZSA8IGRWYWx1ZSkgew0KKyAgICAgICAgICAgIGRNYXhWYWx1ZSA9IGRWYWx1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHVDb3VudCsrOw0KKyAgICAgIGlmICh1Q291bnQgPT0gMSkgew0KKyAgICAgICAgZE1heFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZSk7DQorICAgICAgICBpZiAoZE1heFZhbHVlIDwgZFZhbHVlKSB7DQorICAgICAgICAgIGRNYXhWYWx1ZSA9IGRWYWx1ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICB9DQorICBhcmdWYWx1ZSA9IDA7DQorICBpZiAodUNvdW50KSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGRNYXhWYWx1ZSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1pbihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgdWludDMyX3QgdUNvdW50ID0gMDsNCisgIEZYX0RPVUJMRSBkTWluVmFsdWUgPSAwLjA7DQorICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgIGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdWYWx1ZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICBpZiAoaUxlbmd0aCA+IDIpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIDIsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGksIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgdUNvdW50Kys7DQorICAgICAgICAgICAgICBpZiAodUNvdW50ID09IDEpIHsNCisgICAgICAgICAgICAgICAgZE1pblZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgICAgaWYgKGRNaW5WYWx1ZSA+IGRWYWx1ZSkgew0KKyAgICAgICAgICAgICAgICAgIGRNaW5WYWx1ZSA9IGRWYWx1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICAgIGlmICh1Q291bnQgPT0gMSkgew0KKyAgICAgICAgICAgICAgICBkTWluVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpZiAoZE1pblZhbHVlID4gZFZhbHVlKSB7DQorICAgICAgICAgICAgICAgICAgZE1pblZhbHVlID0gZFZhbHVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnVmFsdWUpKSB7DQorICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdWYWx1ZSwgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgaWYgKHVDb3VudCA9PSAxKSB7DQorICAgICAgICAgIGRNaW5WYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgIGlmIChkTWluVmFsdWUgPiBkVmFsdWUpIHsNCisgICAgICAgICAgICBkTWluVmFsdWUgPSBkVmFsdWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICB1Q291bnQrKzsNCisgICAgICBpZiAodUNvdW50ID09IDEpIHsNCisgICAgICAgIGRNaW5WYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVmFsdWUpOw0KKyAgICAgICAgaWYgKGRNaW5WYWx1ZSA+IGRWYWx1ZSkgew0KKyAgICAgICAgICBkTWluVmFsdWUgPSBkVmFsdWU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KKyAgfQ0KKyAgYXJnVmFsdWUgPSAwOw0KKyAgaWYgKHVDb3VudCkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkTWluVmFsdWUpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpNb2QoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IGFyZ3MuR2V0VmFsdWUoMSk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnVHdvKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9ET1VCTEUgZERpdmlkZW5kID0gMC4wOw0KKyAgICAgIEZYX0RPVUJMRSBkRGl2aWRvciA9IDAuMDsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdPbmUsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgaWYgKGlMZW5ndGggPiAyKSB7DQorICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICBkRGl2aWRlbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCiAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ1ZhbHVlLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICBpZighRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KLSAgICAgICAgICAgICAgICBpZih1Q291bnQgPT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgZE1heFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGRNYXhWYWx1ZSA8IGRWYWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRNYXhWYWx1ZSA9IGRWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgZERpdmlkZW5kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdUNvdW50Kys7DQotICAgICAgICAgICAgaWYodUNvdW50ID09IDEpIHsNCi0gICAgICAgICAgICAgICAgZE1heFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlKTsNCi0gICAgICAgICAgICAgICAgaWYoZE1heFZhbHVlIDwgZFZhbHVlKSB7DQotICAgICAgICAgICAgICAgICAgICBkTWF4VmFsdWUgPSBkVmFsdWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQorICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCiAgICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KLSAgICB9DQotICAgIGFyZ1ZhbHVlID0gMDsNCi0gICAgaWYodUNvdW50KSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkTWF4VmFsdWUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1pbihGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICB1aW50MzJfdCB1Q291bnQgPSAwOw0KLSAgICBGWF9ET1VCTEUgZE1pblZhbHVlID0gMC4wOw0KLSAgICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSAwOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KLSAgICAgICAgYXJnVmFsdWUgPSBhcmdzLkdldFZhbHVlKGkpOw0KLSAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1ZhbHVlKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfSBlbHNlIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnVmFsdWUpKSB7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1ZhbHVlLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIGlmKGlMZW5ndGggPiAyKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMiwganNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGksIGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1Q291bnQgPT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZE1pblZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRNaW5WYWx1ZSA+IGRWYWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRNaW5WYWx1ZSA9IGRWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBpLCBqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1Q291bnQgPT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZE1pblZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRNaW5WYWx1ZSA+IGRWYWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRNaW5WYWx1ZSA9IGRWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnVmFsdWUpKSB7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGREaXZpZGVuZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdUd28pKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdUd28sIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgaWYgKGlMZW5ndGggPiAyKSB7DQorICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVHdvLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1R3bywgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICBkRGl2aWRvciA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnVmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgIGlmKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgdUNvdW50Kys7DQotICAgICAgICAgICAgICAgIGlmKHVDb3VudCA9PSAxKSB7DQotICAgICAgICAgICAgICAgICAgICBkTWluVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoZE1pblZhbHVlID4gZFZhbHVlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZE1pblZhbHVlID0gZFZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICBkRGl2aWRvciA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCiAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHVDb3VudCsrOw0KLSAgICAgICAgICAgIGlmKHVDb3VudCA9PSAxKSB7DQotICAgICAgICAgICAgICAgIGRNaW5WYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGlmKGRNaW5WYWx1ZSA+IGRWYWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgZE1pblZhbHVlID0gZFZhbHVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KKyAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQogICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGREaXZpZG9yID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgfQ0KKyAgICAgIGlmIChkRGl2aWRvcikgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKA0KKyAgICAgICAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICBkRGl2aWRlbmQgLSBkRGl2aWRvciAqIChpbnQzMl90KShkRGl2aWRlbmQgLyBkRGl2aWRvcikpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19ESVZJREVfWkVSTyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk1vZCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSb3VuZChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIHVpbnQ4X3QgdVByZWNpc2lvbiA9IDA7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IDAuMDsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDIsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywganNPYmplY3RWYWx1ZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgfQ0KKyAgICAgIENGWF9EZWNpbWFsIGRlY2ltYWxWYWx1ZSgoRlhfRkxPQVQpZFZhbHVlLCB1UHJlY2lzaW9uKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gZGVjaW1hbFZhbHVlOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCB3c1ZhbHVlLlVURjhFbmNvZGUoKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIGlmIChhcmdjID09IDIpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBhcmdzLkdldFZhbHVlKDEpOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkgfHwgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1R3bykpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IDAuMDsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDIsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywganNPYmplY3RWYWx1ZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgfQ0KKyAgICAgIEZYX0RPVUJMRSBkUHJlY2lzaW9uID0gMC4wOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1R3bykpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdUd28sIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1R3bywgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgIGRQcmVjaXNpb24gPSBIVmFsdWVUb0RvdWJsZShoVGhpcywganNPYmplY3RWYWx1ZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBkUHJlY2lzaW9uID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGRQcmVjaXNpb24gPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVHdvKTsNCisgICAgICB9DQorICAgICAgaWYgKGRQcmVjaXNpb24gPCAwKSB7DQorICAgICAgICB1UHJlY2lzaW9uID0gMDsNCisgICAgICB9IGVsc2UgaWYgKGRQcmVjaXNpb24gPiAxMi4wKSB7DQorICAgICAgICB1UHJlY2lzaW9uID0gMTI7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHVQcmVjaXNpb24gPSAodWludDhfdClkUHJlY2lzaW9uOw0KKyAgICAgIH0NCisgICAgICBDRlhfRGVjaW1hbCBkZWNpbWFsVmFsdWUoKEZYX0ZMT0FUKWRWYWx1ZSwgdVByZWNpc2lvbik7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IGRlY2ltYWxWYWx1ZTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgd3NWYWx1ZS5VVEY4RW5jb2RlKCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlJvdW5kIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlN1bShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgdWludDMyX3QgdUNvdW50ID0gMDsNCisgIEZYX0RPVUJMRSBkU3VtID0gMC4wOw0KKyAgaWYgKGFyZ2MpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1ZhbHVlID0gMDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgICAgYXJnVmFsdWUgPSBhcmdzLkdldFZhbHVlKGkpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnVmFsdWUpKSB7DQogICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdWYWx1ZSkpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1ZhbHVlLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCisgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICAgIGlmIChpTGVuZ3RoID4gMikgew0KKyAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGosIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgZFN1bSArPSBIVmFsdWVUb0RvdWJsZShoVGhpcywganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgew0KKyAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBqLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgZFN1bSArPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnVmFsdWUpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnVmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgZFN1bSArPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVmFsdWUpOw0KKyAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGRTdW0gKz0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlKTsNCisgICAgICAgIHVDb3VudCsrOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCiAgICAgfQ0KICAgICBhcmdWYWx1ZSA9IDA7DQotICAgIGlmKHVDb3VudCkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZE1pblZhbHVlKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgfQ0KKyAgfQ0KKyAgaWYgKHVDb3VudCA8IDEpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZFN1bSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1vZChGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpZihhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IGFyZ3MuR2V0VmFsdWUoMSk7DQotICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnVHdvKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhfRE9VQkxFIGREaXZpZGVuZCA9IDAuMDsNCi0gICAgICAgICAgICBGWF9ET1VCTEUgZERpdmlkb3IgPSAwLjA7DQotICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnT25lLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGlmKGlMZW5ndGggPiAyKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDIsIGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZERpdmlkZW5kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkRGl2aWRlbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZERpdmlkZW5kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnVHdvKSkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1R3bywgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgICAgICBpZihpTGVuZ3RoID4gMikgew0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1R3bywgMSwgcHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVHdvLCAyLCBqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGREaXZpZG9yID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkRGl2aWRvciA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBkRGl2aWRvciA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUd28pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihkRGl2aWRvcikgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkRGl2aWRlbmQgLSBkRGl2aWRvciAqIChpbnQzMl90KShkRGl2aWRlbmQgLyBkRGl2aWRvcikpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0RJVklERV9aRVJPKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJNb2QiKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRhdGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDApIHsNCisgICAgc3RydWN0IHRtKiBwVG1TdHJ1Y3QgPSAwOw0KKyAgICB0aW1lX3QgY3VycmVudFRpbWU7DQorICAgIHRpbWUoJmN1cnJlbnRUaW1lKTsNCisgICAgcFRtU3RydWN0ID0gZ210aW1lKCZjdXJyZW50VGltZSk7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ1ZmZlclllYXI7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ1ZmZlck1vbjsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyRGF5Ow0KKyAgICBidWZmZXJZZWFyLkZvcm1hdCgiJWQiLCBwVG1TdHJ1Y3QtPnRtX3llYXIgKyAxOTAwKTsNCisgICAgYnVmZmVyTW9uLkZvcm1hdCgiJTAyZCIsIHBUbVN0cnVjdC0+dG1fbW9uICsgMSk7DQorICAgIGJ1ZmZlckRheS5Gb3JtYXQoIiUwMmQiLCBwVG1TdHJ1Y3QtPnRtX21kYXkpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBidWZmZXJDdXJyZW50ID0gYnVmZmVyWWVhciArIGJ1ZmZlck1vbiArIGJ1ZmZlckRheTsNCisgICAgaW50MzJfdCBkRGF5cyA9IERhdGVTdHJpbmcyTnVtKGJ1ZmZlckN1cnJlbnQpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZERheXMpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiRGF0ZSIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSb3VuZChGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICB1aW50OF90IHVQcmVjaXNpb24gPSAwOw0KLSAgICBpZihhcmdjID09IDEpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KLSAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSAwLjA7DQotICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMiwganNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgbmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9EZWNpbWFsIGRlY2ltYWxWYWx1ZSgoRlhfRkxPQVQpZFZhbHVlLCB1UHJlY2lzaW9uKTsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gZGVjaW1hbFZhbHVlOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCB3c1ZhbHVlLlVURjhFbmNvZGUoKSk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgIH0gZWxzZSBpZihhcmdjID09IDIpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IGFyZ3MuR2V0VmFsdWUoMSk7DQotICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnVHdvKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IDAuMDsNCi0gICAgICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ09uZSkpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDEsIHByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAyLCBqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywganNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhfRE9VQkxFICBkUHJlY2lzaW9uID0gMC4wOw0KLSAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnVHdvKSkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1R3bywgMSwgcHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdUd28sIDIsIGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRQcmVjaXNpb24gPSBIVmFsdWVUb0RvdWJsZShoVGhpcywganNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIGRQcmVjaXNpb24gPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZFByZWNpc2lvbiA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUd28pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihkUHJlY2lzaW9uIDwgMCkgew0KLSAgICAgICAgICAgICAgICB1UHJlY2lzaW9uID0gMDsNCi0gICAgICAgICAgICB9IGVsc2UgaWYoZFByZWNpc2lvbiA+IDEyLjApIHsNCi0gICAgICAgICAgICAgICAgdVByZWNpc2lvbiA9IDEyOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHVQcmVjaXNpb24gPSAodWludDhfdClkUHJlY2lzaW9uOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDRlhfRGVjaW1hbCBkZWNpbWFsVmFsdWUoKEZYX0ZMT0FUKWRWYWx1ZSwgdVByZWNpc2lvbik7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IGRlY2ltYWxWYWx1ZTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgd3NWYWx1ZS5VVEY4RW5jb2RlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiUm91bmQiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpTdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgdWludDMyX3QgdUNvdW50ID0gMDsNCi0gICAgRlhfRE9VQkxFIGRTdW0gPSAwLjA7DQotICAgIGlmKGFyZ2MpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdWYWx1ZSA9IDA7DQotICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KLSAgICAgICAgICAgIGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsNCi0gICAgICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwoYXJnVmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdWYWx1ZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgICAgICBpZihpTGVuZ3RoID4gMikgew0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaiwganNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRTdW0gKz0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUNvdW50Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaiA9IDI7IGogPCBpTGVuZ3RoOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBqLCBqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgbmV3UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkU3VtICs9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnVmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZFN1bSArPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgdUNvdW50Kys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBkU3VtICs9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZSk7DQotICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGFyZ1ZhbHVlID0gMDsNCi0gICAgfQ0KLSAgICBpZih1Q291bnQgPCAxKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkU3VtKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpEYXRlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDApIHsNCi0gICAgICAgIHN0cnVjdCB0bSAqcFRtU3RydWN0ID0gMDsNCi0gICAgICAgIHRpbWVfdCBjdXJyZW50VGltZTsNCi0gICAgICAgIHRpbWUoJmN1cnJlbnRUaW1lKTsNCi0gICAgICAgIHBUbVN0cnVjdCA9IGdtdGltZSgmY3VycmVudFRpbWUpOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyWWVhcjsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJ1ZmZlck1vbjsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJ1ZmZlckRheTsNCi0gICAgICAgIGJ1ZmZlclllYXIuRm9ybWF0KCIlZCIsIHBUbVN0cnVjdC0+dG1feWVhciArIDE5MDApOw0KLSAgICAgICAgYnVmZmVyTW9uLkZvcm1hdCgiJTAyZCIsIHBUbVN0cnVjdC0+dG1fbW9uICsgMSk7DQotICAgICAgICBidWZmZXJEYXkuRm9ybWF0KCIlMDJkIiwgcFRtU3RydWN0LT50bV9tZGF5KTsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJ1ZmZlckN1cnJlbnQgPSBidWZmZXJZZWFyICsgYnVmZmVyTW9uICsgYnVmZmVyRGF5Ow0KLSAgICAgICAgaW50MzJfdCBkRGF5cyA9IERhdGVTdHJpbmcyTnVtKGJ1ZmZlckN1cnJlbnQpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIGREYXlzKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiRGF0ZSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRhdGUyTnVtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgNCkpIHsNCi0gICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBkYXRlU3RyaW5nOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQotICAgICAgICBGWEpTRV9IVkFMVUUgZGF0ZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBmb3JtYXRWYWx1ZSA9IDA7DQotICAgICAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQotICAgICAgICBpZihIVmFsdWVJc051bGwoaFRoaXMsIGRhdGVWYWx1ZSkpIHsNCi0gICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoZGF0ZVZhbHVlLCBkYXRlU3RyaW5nKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGFyZ2MgPiAxKSB7DQotICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGZvcm1hdFZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZSwgZm9ybWF0U3RyaW5nKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQotICAgICAgICAgICAgbG9jYWxWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQotICAgICAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgbG9jYWxWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZSwgbG9jYWxTdHJpbmcpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYkZsYWdzKSB7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pJc29EYXRlU3RyaW5nOw0KLSAgICAgICAgICAgIEZYX0JPT0wgYlJldCA9IExvY2FsMklzb0RhdGUoaFRoaXMsIGRhdGVTdHJpbmcsIGZvcm1hdFN0cmluZywgbG9jYWxTdHJpbmcsIHN6SXNvRGF0ZVN0cmluZyk7DQotICAgICAgICAgICAgaWYgKGJSZXQpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIERhdGVTdHJpbmcyTnVtKHN6SXNvRGF0ZVN0cmluZykpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZGF0ZVZhbHVlKTsNCi0gICAgICAgIGlmIChhcmdjID4gMSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZm9ybWF0VmFsdWUpOw0KLSAgICAgICAgICAgIGlmIChhcmdjID09IDMpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbFZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIkRhdGUyTnVtIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZUZtdChGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA8IDMpIHsNCi0gICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQotICAgICAgICBpbnQzMl90IGlTdHlsZSA9IDA7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1N0eWxlID0gMDsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdMb2NhbCA9IDA7DQotICAgICAgICBpZiAoYXJnYyA+IDApIHsNCi0gICAgICAgICAgICBhcmdTdHlsZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTdHlsZSkpIHsNCi0gICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaVN0eWxlID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnU3R5bGUpOw0KLSAgICAgICAgICAgIGlmIChpU3R5bGUgPiA0IHx8IGlTdHlsZSA8IDApIHsNCi0gICAgICAgICAgICAgICAgaVN0eWxlID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoYXJnYyA9PSAyKSB7DQotICAgICAgICAgICAgYXJnTG9jYWwgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnTG9jYWwpKSB7DQotICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0xvY2FsLCBzekxvY2FsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJGbGFncykgew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cjsNCi0gICAgICAgICAgICBHZXRTdGFuZGFyZERhdGVGb3JtYXQoaFRoaXMsIGlTdHlsZSwgc3pMb2NhbCwgZm9ybWF0U3RyKTsNCi0gICAgICAgICAgICBpZiAoZm9ybWF0U3RyLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBmb3JtYXRTdHIgPSBGWF9CU1RSQygiIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmb3JtYXRTdHIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYXJnYyA+IDApIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1N0eWxlKTsNCi0gICAgICAgICAgICBpZiAoYXJnYyA9PSAyKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnTG9jYWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiRGF0ZTJOdW0iKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpJc29EYXRlMk51bShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpZihhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN6QXJnU3RyaW5nOw0KLSAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHN6QXJnU3RyaW5nKTsNCi0gICAgICAgICAgICBpbnQzMl90IGREYXlzID0gRGF0ZVN0cmluZzJOdW0oc3pBcmdTdHJpbmcpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoaW50MzJfdClkRGF5cyk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIklzb0RhdGUyTnVtIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNvVGltZTJOdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGlmKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBpZihIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQocERvYyk7DQotICAgICAgICAgICAgSUZYX0xvY2FsZU1nciAqcE1nciA9IChJRlhfTG9jYWxlTWdyICopcERvYy0+R2V0TG9jYWxNZ3IoKTsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzekFyZ1N0cmluZzsNCi0gICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBzekFyZ1N0cmluZyk7DQotICAgICAgICAgICAgc3pBcmdTdHJpbmcgID0gc3pBcmdTdHJpbmcuTWlkKHN6QXJnU3RyaW5nLkZpbmQoJ1QnLCAwKSArIDEpOw0KLSAgICAgICAgICAgIGlmIChzekFyZ1N0cmluZy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDApOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB0aW1lVmFsdWUoWEZBX1ZUX1RJTUUsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekFyZ1N0cmluZywgc3pBcmdTdHJpbmcuR2V0TGVuZ3RoKCkpLCAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KLSAgICAgICAgICAgIGlmICh0aW1lVmFsdWUuSXNWYWxpZCgpKSB7DQotICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lIHVuaVRpbWUgPSB0aW1lVmFsdWUuR2V0VGltZSgpOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGhvdXIgPSB1bmlUaW1lLkdldEhvdXIoKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBtaW4gPSB1bmlUaW1lLkdldE1pbnV0ZSgpOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHNlY29uZCA9IHVuaVRpbWUuR2V0U2Vjb25kKCk7DQotICAgICAgICAgICAgICAgIGludDMyX3QgbWlsU2Vjb25kID0gdW5pVGltZS5HZXRNaWxsaXNlY29uZCgpOw0KLSAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwRGVmTG9jYWxlID0gcE1nci0+R2V0RGVmTG9jYWxlKCk7DQotICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwRGVmTG9jYWxlKTsNCi0gICAgICAgICAgICAgICAgRlhfVElNRVpPTkUgdHpMb2NhbGU7DQotICAgICAgICAgICAgICAgIHBEZWZMb2NhbGUtPkdldFRpbWVab25lKHR6TG9jYWxlKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBtaW5zID0gaG91ciAqIDYwICsgbWluOw0KLSAgICAgICAgICAgICAgICBtaW5zIC09ICh0ekxvY2FsZS50ekhvdXIgKiA2MCk7DQotICAgICAgICAgICAgICAgIHdoaWxlIChtaW5zID4gMTQ0MCkgew0KLSAgICAgICAgICAgICAgICAgICAgbWlucyAtPSAxNDQwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdoaWxlIChtaW5zIDwgMCkgew0KLSAgICAgICAgICAgICAgICAgICAgbWlucyArPSAxNDQwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGhvdXIgPSBtaW5zIC8gNjA7DQotICAgICAgICAgICAgICAgIG1pbiA9IG1pbnMgJSA2MDsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpUmVzdWx0ID0gaG91ciAqIDM2MDAwMDAgKyBtaW4gKiA2MDAwMCArIHNlY29uZCAqIDEwMDAgKyBtaWxTZWNvbmQgKyAxOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgaVJlc3VsdCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIklzb1RpbWUyTnVtIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWxEYXRlRm10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjIDwgMykgew0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgICAgIGludDMyX3QgaVN0eWxlID0gMDsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN6TG9jYWw7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnU3R5bGUgPSAwOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0xvY2FsID0gMDsNCi0gICAgICAgIGlmIChhcmdjID4gMCkgew0KLSAgICAgICAgICAgIGFyZ1N0eWxlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1N0eWxlKSkgew0KLSAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpU3R5bGUgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdTdHlsZSk7DQotICAgICAgICAgICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkgew0KLSAgICAgICAgICAgICAgICBpU3R5bGUgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChhcmdjID09IDIpIHsNCi0gICAgICAgICAgICBhcmdMb2NhbCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdMb2NhbCkpIHsNCi0gICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnTG9jYWwsIHN6TG9jYWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYkZsYWdzKSB7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyOw0KLSAgICAgICAgICAgIEdldExvY2FsRGF0ZUZvcm1hdChoVGhpcywgaVN0eWxlLCBzekxvY2FsLCBmb3JtYXRTdHIsIEZBTFNFKTsNCi0gICAgICAgICAgICBpZiAoZm9ybWF0U3RyLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBmb3JtYXRTdHIgPSBGWF9CU1RSQygiIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmb3JtYXRTdHIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYXJnYyA+IDApIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1N0eWxlKTsNCi0gICAgICAgICAgICBpZiAoYXJnYyA9PSAyKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnTG9jYWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiTG9jYWxEYXRlRm10Iik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWxUaW1lRm10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjIDwgMykgew0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgICAgIGludDMyX3QgaVN0eWxlID0gMDsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN6TG9jYWw7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnU3R5bGUgPSAwOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0xvY2FsID0gMDsNCi0gICAgICAgIGlmIChhcmdjID4gMCkgew0KLSAgICAgICAgICAgIGFyZ1N0eWxlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1N0eWxlKSkgew0KLSAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpU3R5bGUgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdTdHlsZSk7DQotICAgICAgICAgICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkgew0KLSAgICAgICAgICAgICAgICBpU3R5bGUgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChhcmdjID09IDIpIHsNCi0gICAgICAgICAgICBhcmdMb2NhbCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdMb2NhbCkpIHsNCi0gICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnTG9jYWwsIHN6TG9jYWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYkZsYWdzKSB7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyOw0KLSAgICAgICAgICAgIEdldExvY2FsVGltZUZvcm1hdChoVGhpcywgaVN0eWxlLCBzekxvY2FsLCBmb3JtYXRTdHIsIEZBTFNFKTsNCi0gICAgICAgICAgICBpZiAoZm9ybWF0U3RyLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBmb3JtYXRTdHIgPSBGWF9CU1RSQygiIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmb3JtYXRTdHIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYXJnYyA+IDApIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1N0eWxlKTsNCi0gICAgICAgICAgICBpZiAoYXJnYyA9PSAyKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnTG9jYWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiTG9jYWxUaW1lRm10Iik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TnVtMkRhdGUoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCA0KSkgew0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgICAgIGludDMyX3QgZERhdGU7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBmb3JtYXRTdHJpbmc7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBsb2NhbFN0cmluZzsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBkYXRlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGZvcm1hdFZhbHVlID0gMDsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBsb2NhbFZhbHVlID0gMDsNCi0gICAgICAgIGlmKEhWYWx1ZUlzTnVsbChoVGhpcywgZGF0ZVZhbHVlKSkgew0KLSAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGREYXRlID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgZGF0ZVZhbHVlKTsNCi0gICAgICAgICAgICBiRmxhZ3MgPSBkRGF0ZSA8IDE7DQotICAgICAgICB9DQotICAgICAgICBpZihhcmdjID4gMSkgew0KLSAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBmb3JtYXRWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoZm9ybWF0VmFsdWUsIGZvcm1hdFN0cmluZyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGFyZ2MgPT0gMykgew0KLSAgICAgICAgICAgIGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KLSAgICAgICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGxvY2FsVmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGxvY2FsVmFsdWUsIGxvY2FsU3RyaW5nKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJGbGFncykgew0KLSAgICAgICAgICAgIGludDMyX3QgaVllYXIgPSAxOTAwOw0KLSAgICAgICAgICAgIGludDMyX3QgaU1vbnRoID0gMTsNCi0gICAgICAgICAgICBpbnQzMl90IGlEYXkgPSAxOw0KLSAgICAgICAgICAgIGludDMyX3QgaSA9IDA7DQotICAgICAgICAgICAgd2hpbGUgKGREYXRlID4gMCkgew0KLSAgICAgICAgICAgICAgICBpZiAoaU1vbnRoID09IDIpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgoISgoaVllYXIgKyBpKSAlIDQpICYmICgoaVllYXIgKyBpKSAlIDEwMCkpIHx8ICEoKGlZZWFyICsgaSkgJSA0MDApKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGREYXRlID4gMjkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpTW9udGg7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpTW9udGggPiAxMikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1vbnRoID0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGF5ID0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZERhdGUgLT0gMjk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxpbnQzMl90PihkRGF0ZSkgLSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGF0ZSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZERhdGUgPiAyOCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2lNb250aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTW9udGggPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEYXkgPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGF0ZSAtPSAyODsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PGludDMyX3Q+KGREYXRlKSAtIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGREYXRlID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaU1vbnRoIDwgOCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChpTW9udGggJSAyID09IDApKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGREYXRlID4gMzApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpTW9udGg7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpTW9udGggPiAxMikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1vbnRoID0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGF5ID0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZERhdGUgLT0gMzA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxpbnQzMl90PihkRGF0ZSkgLSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGF0ZSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZERhdGUgPiAzMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2lNb250aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTW9udGggPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEYXkgPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGF0ZSAtPSAzMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PGludDMyX3Q+KGREYXRlKSAtIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGREYXRlID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaU1vbnRoICUgMiAhPSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGREYXRlID4gMzApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpTW9udGg7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpTW9udGggPiAxMikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1vbnRoID0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGF5ID0gMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZERhdGUgLT0gMzA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxpbnQzMl90PihkRGF0ZSkgLSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGF0ZSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZERhdGUgPiAzMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2lNb250aDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTW9udGggPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEYXkgPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGF0ZSAtPSAzMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PGludDMyX3Q+KGREYXRlKSAtIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGREYXRlID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pJc29EYXRlU3RyaW5nOw0KLSAgICAgICAgICAgIHN6SXNvRGF0ZVN0cmluZy5Gb3JtYXQoIiVkJTAyZCUwMmQiLCBpWWVhciArIGksIGlNb250aCwgaURheSk7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pMb2NhbERhdGVTdHJpbmc7DQotICAgICAgICAgICAgRlhfQk9PTCBiUmV0ID0gSXNvRGF0ZTJMb2NhbChoVGhpcywgc3pJc29EYXRlU3RyaW5nLCBmb3JtYXRTdHJpbmcsIGxvY2FsU3RyaW5nLCBzekxvY2FsRGF0ZVN0cmluZyk7DQotICAgICAgICAgICAgaWYgKHN6TG9jYWxEYXRlU3RyaW5nLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBzekxvY2FsRGF0ZVN0cmluZyA9IEZYX0JTVFJDKCIiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHN6TG9jYWxEYXRlU3RyaW5nKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShkYXRlVmFsdWUpOw0KLSAgICAgICAgaWYgKGFyZ2MgPiAxKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmb3JtYXRWYWx1ZSk7DQotICAgICAgICAgICAgaWYgKGFyZ2MgPT0gMykgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsVmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiTnVtMkRhdGUiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yR01UaW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgNCkpIHsNCi0gICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQotICAgICAgICBpbnQzMl90IGlUaW1lOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQotICAgICAgICBGWEpTRV9IVkFMVUUgdGltZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBmb3JtYXRWYWx1ZSA9IDA7DQotICAgICAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQotICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwodGltZVZhbHVlKSkgew0KLSAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlUaW1lID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgdGltZVZhbHVlKTsNCi0gICAgICAgICAgICBpZiAoRlhTWVNfYWJzKGlUaW1lKSA8IDEuMCkgew0KLSAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGFyZ2MgPiAxKSB7DQotICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoZm9ybWF0VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGZvcm1hdFZhbHVlLCBmb3JtYXRTdHJpbmcpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChhcmdjID09IDMpIHsNCi0gICAgICAgICAgICBsb2NhbFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCi0gICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGxvY2FsVmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGxvY2FsVmFsdWUsIGxvY2FsU3RyaW5nKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJGbGFncykgew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN6R01UVGltZVN0cmluZzsNCi0gICAgICAgICAgICBOdW0yQWxsVGltZShoVGhpcywgaVRpbWUsIGZvcm1hdFN0cmluZywgbG9jYWxTdHJpbmcsIFRSVUUsIHN6R01UVGltZVN0cmluZyk7DQotICAgICAgICAgICAgaWYgKHN6R01UVGltZVN0cmluZy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgc3pHTVRUaW1lU3RyaW5nID0gRlhfQlNUUkMoIiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc3pHTVRUaW1lU3RyaW5nKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZSh0aW1lVmFsdWUpOw0KLSAgICAgICAgaWYgKGFyZ2MgPiAxKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmb3JtYXRWYWx1ZSk7DQotICAgICAgICAgICAgaWYgKGFyZ2MgPT0gMykgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsVmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiTnVtMkdNVGltZSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJUaW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgNCkpIHsNCi0gICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQotICAgICAgICBGWF9GTE9BVCBmVGltZTsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGxvY2FsU3RyaW5nOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIHRpbWVWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgZm9ybWF0VmFsdWUgPSAwOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGxvY2FsVmFsdWUgPSAwOw0KLSAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKHRpbWVWYWx1ZSkpIHsNCi0gICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmVGltZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIHRpbWVWYWx1ZSk7DQotICAgICAgICAgICAgaWYgKEZYU1lTX2ZhYnMoZlRpbWUpIDwgMS4wKSB7DQotICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoYXJnYyA+IDEpIHsNCi0gICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChmb3JtYXRWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoZm9ybWF0VmFsdWUsIGZvcm1hdFN0cmluZyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGFyZ2MgPT0gMykgew0KLSAgICAgICAgICAgIGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KLSAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwobG9jYWxWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZSwgbG9jYWxTdHJpbmcpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYkZsYWdzKSB7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pMb2NhbFRpbWVTdHJpbmc7DQotICAgICAgICAgICAgTnVtMkFsbFRpbWUoaFRoaXMsIChpbnQzMl90KWZUaW1lLCBmb3JtYXRTdHJpbmcsIGxvY2FsU3RyaW5nLCBGQUxTRSwgc3pMb2NhbFRpbWVTdHJpbmcpOw0KLSAgICAgICAgICAgIGlmIChzekxvY2FsVGltZVN0cmluZy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgc3pMb2NhbFRpbWVTdHJpbmcgPSBGWF9CU1RSQygiIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzekxvY2FsVGltZVN0cmluZyk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodGltZVZhbHVlKTsNCi0gICAgICAgIGlmIChhcmdjID4gMSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZm9ybWF0VmFsdWUpOw0KLSAgICAgICAgICAgIGlmIChhcmdjID09IDMpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbFZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIk51bTJUaW1lIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICB0aW1lX3Qgbm93Ow0KLSAgICAgICAgdGltZSgmbm93KTsNCi0gICAgICAgIHN0cnVjdCB0bSAqcEdtdCA9IGdtdGltZSgmbm93KTsNCi0gICAgICAgIGludDMyX3QgaUdNSG91ciA9IHBHbXQtPnRtX2hvdXI7DQotICAgICAgICBpbnQzMl90IGlHTU1pbiA9IHBHbXQtPnRtX21pbjsNCi0gICAgICAgIGludDMyX3QgaUdNU2VjID0gcEdtdC0+dG1fc2VjOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksICgoaUdNSG91ciAqIDM2MDAgKyBpR01NaW4gKiA2MCArIGlHTVNlYykgKiAxMDAwKSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIlRpbWUiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUaW1lMk51bShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQotICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdGltZVN0cmluZzsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGxvY2FsU3RyaW5nOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIHRpbWVWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgZm9ybWF0VmFsdWUgPSAwOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGxvY2FsVmFsdWUgPSAwOw0KLSAgICAgICAgaWYoSFZhbHVlSXNOdWxsKGhUaGlzLCB0aW1lVmFsdWUpKSB7DQotICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKHRpbWVWYWx1ZSwgdGltZVN0cmluZyk7DQotICAgICAgICB9DQotICAgICAgICBpZihhcmdjID4gMSkgew0KLSAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBmb3JtYXRWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoZm9ybWF0VmFsdWUsIGZvcm1hdFN0cmluZyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGFyZ2MgPT0gMykgew0KLSAgICAgICAgICAgIGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KLSAgICAgICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGxvY2FsVmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGxvY2FsVmFsdWUsIGxvY2FsU3RyaW5nKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJGbGFncykgew0KLSAgICAgICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICAgICAgICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCi0gICAgICAgICAgICBJRlhfTG9jYWxlTWdyICpwTWdyID0gKElGWF9Mb2NhbGVNZ3IgKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KLSAgICAgICAgICAgIElGWF9Mb2NhbGUgKnBMb2NhbGUgPSBOVUxMOw0KLSAgICAgICAgICAgIGlmIChsb2NhbFN0cmluZy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9PYmplY3QgKiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBUaGlzTm9kZS0+SXNOb2RlKCkpOw0KLSAgICAgICAgICAgICAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YSgoQ1hGQV9Ob2RlICopcFRoaXNOb2RlKTsNCi0gICAgICAgICAgICAgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBwTG9jYWxlID0gcE1nci0+R2V0TG9jYWxlQnlOYW1lKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChsb2NhbFN0cmluZywgbG9jYWxTdHJpbmcuR2V0TGVuZ3RoKCkpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQotICAgICAgICAgICAgaWYgKGZvcm1hdFN0cmluZy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgd3NGb3JtYXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoZm9ybWF0U3RyaW5nLCBmb3JtYXRTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c0Zvcm1hdCA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzRm9ybWF0Ow0KLSAgICAgICAgICAgIHdzRm9ybWF0ICs9IEZYX1dTVFJDKEwifSIpOw0KLSAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgdGltZVZhbHVlKFhGQV9WVF9USU1FLCBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgodGltZVN0cmluZywgdGltZVN0cmluZy5HZXRMZW5ndGgoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NGb3JtYXQsIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQotICAgICAgICAgICAgaWYgKHRpbWVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUgdW5pVGltZSA9IHRpbWVWYWx1ZS5HZXRUaW1lKCk7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaG91ciA9IHVuaVRpbWUuR2V0SG91cigpOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IG1pbiA9IHVuaVRpbWUuR2V0TWludXRlKCk7DQotICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vjb25kID0gdW5pVGltZS5HZXRTZWNvbmQoKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBtaWxTZWNvbmQgPSB1bmlUaW1lLkdldE1pbGxpc2Vjb25kKCk7DQotICAgICAgICAgICAgICAgIGludDMyX3QgbWlucyA9IGhvdXIgKiA2MCArIG1pbjsNCi0gICAgICAgICAgICAgICAgSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBwUHJvdmlkZXIgPSBJWEZBX1RpbWVab25lUHJvdmlkZXI6OkdldCgpOw0KLSAgICAgICAgICAgICAgICBpZiAocFByb3ZpZGVyICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX1RJTUVaT05FIHR6Ow0KLSAgICAgICAgICAgICAgICAgICAgcFByb3ZpZGVyLT5HZXRUaW1lWm9uZSh0eik7DQotICAgICAgICAgICAgICAgICAgICBtaW5zIC09ICh0ei50ekhvdXIgKiA2MCk7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAobWlucyA+IDE0NDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5zIC09IDE0NDA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAobWlucyA8IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5zICs9IDE0NDA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBob3VyID0gbWlucyAvIDYwOw0KLSAgICAgICAgICAgICAgICAgICAgbWluID0gbWlucyAlIDYwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGludDMyX3QgaVJlc3VsdCA9IGhvdXIgKiAzNjAwMDAwICsgbWluICogNjAwMDAgKyBzZWNvbmQgKiAxMDAwICsgbWlsU2Vjb25kICsgMTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIGlSZXN1bHQpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodGltZVZhbHVlKTsNCi0gICAgICAgIGlmIChhcmdjID4gMSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZm9ybWF0VmFsdWUpOw0KLSAgICAgICAgICAgIGlmIChhcmdjID09IDMpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbFZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIlRpbWUyTnVtIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VGltZUZtdChGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA8IDMpIHsNCi0gICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQotICAgICAgICBpbnQzMl90IGlTdHlsZSA9IDA7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1N0eWxlID0gMDsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdMb2NhbCA9IDA7DQotICAgICAgICBpZiAoYXJnYyA+IDApIHsNCi0gICAgICAgICAgICBhcmdTdHlsZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTdHlsZSkpIHsNCi0gICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaVN0eWxlID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnU3R5bGUpOw0KLSAgICAgICAgICAgIGlmIChpU3R5bGUgPiA0IHx8IGlTdHlsZSA8IDApIHsNCi0gICAgICAgICAgICAgICAgaVN0eWxlID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoYXJnYyA9PSAyKSB7DQotICAgICAgICAgICAgYXJnTG9jYWwgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnTG9jYWwpKSB7DQotICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0xvY2FsLCBzekxvY2FsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJGbGFncykgew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cjsNCi0gICAgICAgICAgICBHZXRTdGFuZGFyZFRpbWVGb3JtYXQoaFRoaXMsIGlTdHlsZSwgc3pMb2NhbCwgZm9ybWF0U3RyKTsNCi0gICAgICAgICAgICBpZiAoZm9ybWF0U3RyLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBmb3JtYXRTdHIgPSBGWF9CU1RSQygiIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmb3JtYXRTdHIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYXJnYyA+IDApIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1N0eWxlKTsNCi0gICAgICAgICAgICBpZiAoYXJnYyA9PSAyKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnTG9jYWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiVGltZUZtdCIpOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OklzSXNvRGF0ZUZvcm1hdChjb25zdCBGWF9DSEFSKiBwRGF0YSwgaW50MzJfdCBpTGVuZ3RoLCBpbnQzMl90ICZpU3R5bGUsIGludDMyX3QgJmlZZWFyLCBpbnQzMl90ICZpTW9udGgsIGludDMyX3QgJmlEYXkpDQotew0KLSAgICBpWWVhciA9IDA7DQotICAgIGlNb250aCA9IDE7DQotICAgIGlEYXkgPSAxOw0KLSAgICBGWF9CT09MIGlSZXQgPSBGQUxTRTsNCi0gICAgaWYgKGlMZW5ndGggPCA0KSB7DQotICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgfQ0KLSAgICBGWF9DSEFSIHN0clllYXJbNV07DQotICAgIHN0clllYXJbNF0gPSAnXDAnOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsNCi0gICAgICAgIGlmICgqKHBEYXRhICsgaSkgPD0gJzknICYmICoocERhdGEgKyBpKSA+PSAnMCcpIHsNCi0gICAgICAgICAgICBzdHJZZWFyW2ldID0gKihwRGF0YSArIGkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpWWVhciA9IEZYU1lTX2F0b2koc3RyWWVhcik7DQotICAgIGlTdHlsZSA9IDA7DQotICAgIGlmIChpTGVuZ3RoID4gNCkgew0KLSAgICAgICAgaWYgKCoocERhdGEgKyA0KSA9PSAnLScpIHsNCi0gICAgICAgICAgICBpU3R5bGUgPSAxOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpU3R5bGUgPSAwOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaVJldCA9IFRSVUU7DQotICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgfQ0KLSAgICBGWF9DSEFSIHN0clRlbXBbM107DQotICAgIHN0clRlbXBbMl0gPSAnXDAnOw0KLSAgICBpbnQzMl90IGlQb3NPZmYgPSAwOw0KLSAgICBpZiAoaVN0eWxlID09IDApIHsNCi0gICAgICAgIGlQb3NPZmYgPSA0Ow0KLSAgICAgICAgaWYgKGlMZW5ndGggPT0gNCkgew0KLSAgICAgICAgICAgIGlSZXQgPSBUUlVFOw0KLSAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaVBvc09mZiA9IDU7DQotICAgICAgICBpZiAoaUxlbmd0aCA9PSA0KSB7DQotICAgICAgICAgICAgaVJldCA9IFRSVUU7DQotICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKCgqKHBEYXRhICsgaVBvc09mZikgPiAnOScgfHwgKihwRGF0YSArIGlQb3NPZmYpIDwgJzAnKSB8fCAoKihwRGF0YSArIGlQb3NPZmYgKyAxKSA+ICc5JyB8fCAqKHBEYXRhICsgaVBvc09mZiArIDEpIDwgJzAnKSkgew0KLSAgICAgICAgcmV0dXJuIGlSZXQ7DQotICAgIH0NCi0gICAgc3RyVGVtcFswXSA9ICoocERhdGEgKyBpUG9zT2ZmKTsNCi0gICAgc3RyVGVtcFsxXSA9ICoocERhdGEgKyBpUG9zT2ZmICsgMSk7DQotICAgIGlNb250aCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQotICAgIGlmIChpTW9udGggPiAxMiB8fCBpTW9udGggPCAxKSB7DQotICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgfQ0KLSAgICBpZiAoaVN0eWxlID09IDApIHsNCi0gICAgICAgIGlQb3NPZmYgKz0gMjsNCi0gICAgICAgIGlmIChpTGVuZ3RoID09IDYpIHsNCi0gICAgICAgICAgICBpUmV0ID0gMTsNCi0gICAgICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlQb3NPZmYgKz0gMzsNCi0gICAgICAgIGlmIChpTGVuZ3RoID09IDcpIHsNCi0gICAgICAgICAgICBpUmV0ID0gMTsNCi0gICAgICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoKCoocERhdGEgKyBpUG9zT2ZmKSA+ICc5JyB8fCAqKHBEYXRhICsgaVBvc09mZikgPCAnMCcpIHx8ICgqKHBEYXRhICsgaVBvc09mZiArIDEpID4gJzknIHx8ICoocERhdGEgKyBpUG9zT2ZmICsgMSkgPCAnMCcpKSB7DQotICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgfQ0KLSAgICBzdHJUZW1wWzBdID0gKihwRGF0YSArIGlQb3NPZmYpOw0KLSAgICBzdHJUZW1wWzFdID0gKihwRGF0YSArIGlQb3NPZmYgKyAxKTsNCi0gICAgaURheSA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQotICAgIGlmIChpUG9zT2ZmICsgMiA8IGlMZW5ndGgpIHsNCi0gICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICB9DQotICAgIGlmICgoIShpWWVhciAlIDQpICYmIChpWWVhciAlIDEwMCkpIHx8ICEoaVllYXIgJSA0MDApKSB7DQotICAgICAgICBpZiAoaU1vbnRoID09IDIpIHsNCi0gICAgICAgICAgICBpZiAoaURheSA+IDI5KSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGlNb250aCA8IDgpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlEYXkgPiAoaU1vbnRoICUgMiA9PSAwID8gMzAgOiAzMSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlEYXkgPiAoaU1vbnRoICUgMiA9PSAwID8gMzEgOiAzMCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKGlNb250aCA9PSAyKSB7DQotICAgICAgICAgICAgaWYgKGlEYXkgPiAyOCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChpTW9udGggPCA4KSB7DQotICAgICAgICAgICAgICAgIGlmIChpRGF5ID4gKGlNb250aCAlIDIgPT0gMCA/IDMwIDogMzEpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmIChpRGF5ID4gKGlNb250aCAlIDIgPT0gMCA/IDMxIDogMzApKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpUmV0ID0gVFJVRTsNCi0gICAgcmV0dXJuIGlSZXQ7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OklzSXNvVGltZUZvcm1hdChjb25zdCBGWF9DSEFSKiBwRGF0YSwgaW50MzJfdCBpTGVuZ3RoLCBpbnQzMl90ICZpSG91ciwgaW50MzJfdCAmaU1pbnV0ZSwgaW50MzJfdCAmaVNlY29uZCwgaW50MzJfdCAmaU1pbGxpU2Vjb25kLCBpbnQzMl90ICZpWm9uZUhvdXIsIGludDMyX3QgJmlab25lTWludXRlKQ0KLXsNCi0gICAgaUhvdXIgPSAwOw0KLSAgICBpTWludXRlID0gMDsNCi0gICAgaVNlY29uZCA9IDA7DQotICAgIGlNaWxsaVNlY29uZCA9IDA7DQotICAgIGlab25lSG91ciA9IDA7DQotICAgIGlab25lTWludXRlID0gMDsNCi0gICAgaWYgKCFwRGF0YSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGludDMyX3QgaVJldCA9IEZBTFNFOw0KLSAgICBGWF9DSEFSIHN0clRlbXBbM107DQotICAgIHN0clRlbXBbMl0gPSAnXDAnOw0KLSAgICBpbnQzMl90IGlJbmRleCA9IDA7DQotICAgIGludDMyX3QgaVpvbmUgPSAwOw0KLSAgICBpbnQzMl90IGkgPSBpSW5kZXg7DQotICAgIHdoaWxlIChpIDwgaUxlbmd0aCkgew0KLSAgICAgICAgaWYgKCgqKHBEYXRhICsgaSkgPiAnOScgfHwgKihwRGF0YSArIGkpIDwgJzAnKSAmJiAqKHBEYXRhICsgaSkgIT0gJzonICkgew0KLSAgICAgICAgICAgIGlab25lID0gaTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgICsraTsNCi0gICAgfQ0KLSAgICBpZiAoaSA9PSBpTGVuZ3RoKSB7DQotICAgICAgICBpWm9uZSA9IGlMZW5ndGg7DQotICAgIH0NCi0gICAgaW50MzJfdCBpUG9zID0gMDsNCi0gICAgd2hpbGUgKGlJbmRleCA8IGlab25lKSB7DQotICAgICAgICBpZiAoaUluZGV4ID49IGlab25lKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPiAnOScgfHwgKihwRGF0YSArIGlJbmRleCkgPCAnMCcpIHsNCi0gICAgICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgICAgIH0NCi0gICAgICAgIHN0clRlbXBbMF0gPSAqKHBEYXRhICsgaUluZGV4KTsNCi0gICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPiAnOScgfHwgKihwRGF0YSArIGlJbmRleCArIDEpIDwgJzAnKSB7DQotICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQotICAgICAgICB9DQotICAgICAgICBzdHJUZW1wWzFdID0gKihwRGF0YSArIGlJbmRleCArIDEpOw0KLSAgICAgICAgaWYgKEZYU1lTX2F0b2koc3RyVGVtcCkgPiA2MCkgew0KLSAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCoocERhdGEgKyAyKSA9PSAnOicpIHsNCi0gICAgICAgICAgICBpZiAoaVBvcyA9PSAwKSB7DQotICAgICAgICAgICAgICAgIGlIb3VyID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCi0gICAgICAgICAgICAgICAgKytpUG9zOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaVBvcyA9PSAxKSB7DQotICAgICAgICAgICAgICAgIGlNaW51dGUgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KLSAgICAgICAgICAgICAgICArK2lQb3M7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaVNlY29uZCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlJbmRleCArPSAzOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoaVBvcyA9PSAwKSB7DQotICAgICAgICAgICAgICAgIGlIb3VyID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCi0gICAgICAgICAgICAgICAgKytpUG9zOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaVBvcyA9PSAxKSB7DQotICAgICAgICAgICAgICAgIGlNaW51dGUgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KLSAgICAgICAgICAgICAgICArK2lQb3M7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChpUG9zID09IDIpIHsNCi0gICAgICAgICAgICAgICAgaVNlY29uZCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQotICAgICAgICAgICAgICAgICsraVBvczsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaUluZGV4ICs9IDI7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKCoocERhdGEgKyBpSW5kZXgpID09ICcuJykgew0KLSAgICAgICAgKytpSW5kZXg7DQotICAgICAgICBGWF9DSEFSIHN0clRlbXBbNF07DQotICAgICAgICBzdHJUZW1wWzNdID0gJ1wwJzsNCi0gICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSA+ICc5JyB8fCAqKHBEYXRhICsgaUluZGV4KSA8ICcwJykgew0KLSAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgc3RyVGVtcFswXSA9ICoocERhdGEgKyBpSW5kZXgpOw0KLSAgICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA+ICc5JyB8fCAqKHBEYXRhICsgaUluZGV4ICsgMSkgPCAnMCcpIHsNCi0gICAgICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgICAgIH0NCi0gICAgICAgIHN0clRlbXBbMV0gPSAqKHBEYXRhICsgaUluZGV4ICsgMSk7DQotICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCArIDIpID4gJzknIHx8ICoocERhdGEgKyBpSW5kZXggKyAyKSA8ICcwJykgew0KLSAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgc3RyVGVtcFsyXSA9ICoocERhdGEgKyBpSW5kZXggKyAyKTsNCi0gICAgICAgIGlNaWxsaVNlY29uZCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQotICAgICAgICBpZiAoaU1pbGxpU2Vjb25kID4gMTAwKSB7DQotICAgICAgICAgICAgaU1pbGxpU2Vjb25kID0gMDsNCi0gICAgICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlJbmRleCArPSAzOw0KLSAgICB9DQotICAgIGludDMyX3QgaVNpZ24gPSAxOw0KLSAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJ3onIHx8ICoocERhdGEgKyBpSW5kZXgpID09ICdaJykgew0KLSAgICAgICAgaVJldCA9IDE7DQotICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4KSA9PSAnKycpIHsNCi0gICAgICAgICsraUluZGV4Ow0KLSAgICB9IGVsc2UgaWYgKCoocERhdGEgKyBpSW5kZXgpID09ICctJykgew0KLSAgICAgICAgaVNpZ24gPSAtMTsNCi0gICAgICAgICsraUluZGV4Ow0KLSAgICB9DQotICAgIGlQb3MgPSAwOw0KLSAgICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KLSAgICAgICAgaWYgKGlJbmRleCA+PSBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQotICAgICAgICB9DQotICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPiAnOScgfHwgKihwRGF0YSArIGlJbmRleCkgPCAnMCcpIHsNCi0gICAgICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgICAgIH0NCi0gICAgICAgIHN0clRlbXBbMF0gPSAqKHBEYXRhICsgaUluZGV4KTsNCi0gICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPiAnOScgfHwgKihwRGF0YSArIGlJbmRleCArIDEpIDwgJzAnKSB7DQotICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQotICAgICAgICB9DQotICAgICAgICBzdHJUZW1wWzFdID0gKihwRGF0YSArIGlJbmRleCArIDEpOw0KLSAgICAgICAgaWYgKEZYU1lTX2F0b2koc3RyVGVtcCkgPiA2MCkgew0KLSAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCoocERhdGEgKyAyKSA9PSAnOicpIHsNCi0gICAgICAgICAgICBpZiAoaVBvcyA9PSAwKSB7DQotICAgICAgICAgICAgICAgIGlab25lSG91ciA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChpUG9zID09IDEpIHsNCi0gICAgICAgICAgICAgICAgaVpvbmVNaW51dGUgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpSW5kZXggKz0gMzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKCFpUG9zKSB7DQotICAgICAgICAgICAgICAgIGlab25lSG91ciA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQotICAgICAgICAgICAgICAgICsraVBvczsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGlQb3MgPT0gMSkgew0KLSAgICAgICAgICAgICAgICBpWm9uZU1pbnV0ZSA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQotICAgICAgICAgICAgICAgICsraVBvczsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaUluZGV4ICs9IDI7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGlJbmRleCA8IGlMZW5ndGgpIHsNCi0gICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICB9DQotICAgIGlab25lSG91ciAqPSBpU2lnbjsNCi0gICAgaVJldCA9IFRSVUU7DQotICAgIHJldHVybiBpUmV0Ow0KLX0NCi1GWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpJc0lzb0RhdGVUaW1lRm9ybWF0KGNvbnN0IEZYX0NIQVIqIHBEYXRhLCBpbnQzMl90IGlMZW5ndGgsIGludDMyX3QgJmlZZWFyLCBpbnQzMl90ICZpTW9udGgsIGludDMyX3QgJmlEYXksIGludDMyX3QgJmlIb3VyLCBpbnQzMl90ICZpTWludXRlLCBpbnQzMl90ICZpU2Vjb25kLCBpbnQzMl90ICZpTWlsbGlvblNlY29uZCwgaW50MzJfdCAmaVpvbmVIb3VyLCBpbnQzMl90ICZpWm9uZU1pbnV0ZSkNCi17DQotICAgIGlZZWFyID0gMDsNCi0gICAgaU1vbnRoID0gMDsNCi0gICAgaURheSA9IDA7DQotICAgIGlIb3VyID0gMDsNCi0gICAgaU1pbnV0ZSA9IDA7DQotICAgIGlTZWNvbmQgPSAwOw0KLSAgICBpZiAoIXBEYXRhKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaW50MzJfdCBpUmV0ID0gRkFMU0U7DQotICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgd2hpbGUgKCoocERhdGEgKyBpSW5kZXgpICE9ICdUJyAmJiAqKHBEYXRhICsgaUluZGV4KSAhPSAndCcpIHsNCi0gICAgICAgIGlmIChpSW5kZXggPj0gaUxlbmd0aCkgew0KLSAgICAgICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgKytpSW5kZXg7DQotICAgIH0NCi0gICAgaWYgKGlJbmRleCAhPSA4ICYmIGlJbmRleCAhPSAxMCkgew0KLSAgICAgICAgcmV0dXJuIGlSZXQ7DQotICAgIH0NCi0gICAgaW50MzJfdCBpU3R5bGUgPSAtMTsNCi0gICAgaVJldCA9IElzSXNvRGF0ZUZvcm1hdChwRGF0YSwgaUluZGV4ICwgaVN0eWxlLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCi0gICAgaWYgKCFpUmV0KSB7DQotICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgfQ0KLSAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgIT0gJ1QnICYmICoocERhdGEgKyBpSW5kZXgpICE9ICd0Jykgew0KLSAgICAgICAgcmV0dXJuIGlSZXQ7DQotICAgIH0NCi0gICAgKytpSW5kZXg7DQotICAgIGlmICgoKGlMZW5ndGggLSBpSW5kZXggPiAxMykgJiYgKGlMZW5ndGggLSBpSW5kZXggPCA2KSkgJiYgKGlMZW5ndGggLSBpSW5kZXggIT0gMTUpKSB7DQotICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgfQ0KLSAgICBpUmV0ID0gSXNJc29UaW1lRm9ybWF0KHBEYXRhICsgaUluZGV4LCBpTGVuZ3RoIC0gaUluZGV4LCBpSG91ciwgaU1pbnV0ZSwgaVNlY29uZCwgaU1pbGxpb25TZWNvbmQsIGlab25lSG91ciwgaVpvbmVNaW51dGUpOw0KLSAgICBpZiAoIWlSZXQpIHsNCi0gICAgICAgIHJldHVybiBpUmV0Ow0KLSAgICB9DQotICAgIGlSZXQgPSBUUlVFOw0KLSAgICByZXR1cm4gaVJldDsNCi19DQotRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWwySXNvRGF0ZShGWEpTRV9IT0JKRUNUIGhUaGlzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0ZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwgQ0ZYX0J5dGVTdHJpbmcgJnN0cklzb0RhdGUpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KLSAgICBpZighcERvYykgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIElGWF9Mb2NhbGVNZ3IgKnBNZ3IgPSAoSUZYX0xvY2FsZU1nciAqKXBEb2MtPkdldExvY2FsTWdyKCk7DQotICAgIElGWF9Mb2NhbGUgKnBMb2NhbGUgPSBOVUxMOw0KLSAgICBpZiAoc3pMb2NhbGUuSXNFbXB0eSgpKSB7DQotICAgICAgICBDWEZBX09iamVjdCAqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBUaGlzTm9kZS0+SXNOb2RlKCkpOw0KLSAgICAgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEoKENYRkFfTm9kZSAqKXBUaGlzTm9kZSk7DQotICAgICAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbGUuR2V0Q1N0cigpLCBzekxvY2FsZS5HZXRMZW5ndGgoKSkpOw0KLSAgICB9DQotICAgIGlmICghcExvY2FsZSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KLSAgICBpZiAoc3pGb3JtYXQuSXNFbXB0eSgpKSB7DQotICAgICAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsIHdzRm9ybWF0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHdzRm9ybWF0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6Rm9ybWF0LkdldENTdHIoKSwgc3pGb3JtYXQuR2V0TGVuZ3RoKCkpOw0KLSAgICB9DQotICAgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoWEZBX1ZUX0RBVEUsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekRhdGUuR2V0Q1N0cigpLCBzekRhdGUuR2V0TGVuZ3RoKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRm9ybWF0LCBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KLSAgICBDRlhfVW5pdGltZSBkdCA9IHdpZGdldFZhbHVlLkdldERhdGUoKTsNCi0gICAgc3RySXNvRGF0ZS5Gb3JtYXQoIiU0ZC0lMDJkLSUwMmQiLCBkdC5HZXRZZWFyKCksIGR0LkdldE1vbnRoKCksIGR0LkdldERheSgpKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkxvY2FsMklzb1RpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelRpbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsIENGWF9CeXRlU3RyaW5nICZzdHJJc29UaW1lKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCi0gICAgaWYoIXBEb2MpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBJRlhfTG9jYWxlTWdyICpwTWdyID0gKElGWF9Mb2NhbGVNZ3IgKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KLSAgICBJRlhfTG9jYWxlICpwTG9jYWxlID0gTlVMTDsNCi0gICAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgew0KLSAgICAgICAgQ1hGQV9PYmplY3QgKiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCi0gICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUgKilwVGhpc05vZGUpOw0KLSAgICAgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlLkdldENTdHIoKSwgc3pMb2NhbGUuR2V0TGVuZ3RoKCkpKTsNCi0gICAgfQ0KLSAgICBpZiAoIXBMb2NhbGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCi0gICAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkgew0KLSAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICB3c0Zvcm1hdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekZvcm1hdC5HZXRDU3RyKCksIHN6Rm9ybWF0LkdldExlbmd0aCgpKTsNCi0gICAgfQ0KLSAgICB3c0Zvcm1hdCA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzRm9ybWF0Ow0KLSAgICB3c0Zvcm1hdCArPSBGWF9XU1RSQyhMIn0iKTsNCi0gICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZShYRkFfVlRfVElNRSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VGltZS5HZXRDU3RyKCksIHN6VGltZS5HZXRMZW5ndGgoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NGb3JtYXQsIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQotICAgIENGWF9Vbml0aW1lIHV0aW1lID0gd2lkZ2V0VmFsdWUuR2V0VGltZSgpOw0KLSAgICBzdHJJc29UaW1lLkZvcm1hdCgiJTAyZDolMDJkOiUwMmQuJTAzZCIsIHV0aW1lLkdldEhvdXIoKSwgdXRpbWUuR2V0TWludXRlKCksIHV0aW1lLkdldFNlY29uZCgpLCB1dGltZS5HZXRNaWxsaXNlY29uZCgpKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6Oklzb0RhdGUyTG9jYWwoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsIENGWF9CeXRlU3RyaW5nICZzdHJMb2NhbERhdGUpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KLSAgICBpZighcERvYykgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIElGWF9Mb2NhbGVNZ3IgKnBNZ3IgPSAoSUZYX0xvY2FsZU1nciAqKXBEb2MtPkdldExvY2FsTWdyKCk7DQotICAgIElGWF9Mb2NhbGUgKnBMb2NhbGUgPSBOVUxMOw0KLSAgICBpZiAoc3pMb2NhbGUuSXNFbXB0eSgpKSB7DQotICAgICAgICBDWEZBX09iamVjdCAqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBUaGlzTm9kZS0+SXNOb2RlKCkpOw0KLSAgICAgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEoKENYRkFfTm9kZSAqKXBUaGlzTm9kZSk7DQotICAgICAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbGUuR2V0Q1N0cigpLCBzekxvY2FsZS5HZXRMZW5ndGgoKSkpOw0KLSAgICB9DQotICAgIGlmICghcExvY2FsZSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KLSAgICBpZiAoc3pGb3JtYXQuSXNFbXB0eSgpKSB7DQotICAgICAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsIHdzRm9ybWF0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHdzRm9ybWF0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6Rm9ybWF0LkdldENTdHIoKSwgc3pGb3JtYXQuR2V0TGVuZ3RoKCkpOw0KLSAgICB9DQotICAgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoWEZBX1ZUX0RBVEUsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekRhdGUuR2V0Q1N0cigpLCBzekRhdGUuR2V0TGVuZ3RoKCkpLCAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1JldDsNCi0gICAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NSZXQsIHdzRm9ybWF0LCBwTG9jYWxlLCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KLSAgICBzdHJMb2NhbERhdGUgPSBGWF9VVEY4RW5jb2RlKHdzUmV0LCB3c1JldC5HZXRMZW5ndGgoKSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpJc29UaW1lMkxvY2FsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pUaW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLCBDRlhfQnl0ZVN0cmluZyAmc3RyTG9jYWxUaW1lKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCi0gICAgaWYoIXBEb2MpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBJRlhfTG9jYWxlTWdyICpwTWdyID0gKElGWF9Mb2NhbGVNZ3IgKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KLSAgICBJRlhfTG9jYWxlICpwTG9jYWxlID0gTlVMTDsNCi0gICAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgew0KLSAgICAgICAgQ1hGQV9PYmplY3QgKiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCi0gICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUgKilwVGhpc05vZGUpOw0KLSAgICAgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlLkdldENTdHIoKSwgc3pMb2NhbGUuR2V0TGVuZ3RoKCkpKTsNCi0gICAgfQ0KLSAgICBpZiAoIXBMb2NhbGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCi0gICAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkgew0KLSAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICB3c0Zvcm1hdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekZvcm1hdC5HZXRDU3RyKCksIHN6Rm9ybWF0LkdldExlbmd0aCgpKTsNCi0gICAgfQ0KLSAgICB3c0Zvcm1hdCA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzRm9ybWF0Ow0KLSAgICB3c0Zvcm1hdCArPSBGWF9XU1RSQyhMIn0iKTsNCi0gICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZShYRkFfVlRfVElNRSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VGltZS5HZXRDU3RyKCksIHN6VGltZS5HZXRMZW5ndGgoKSksIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzUmV0Ow0KLSAgICB3aWRnZXRWYWx1ZS5Gb3JtYXRQYXR0ZXJucyh3c1JldCwgd3NGb3JtYXQsIHBMb2NhbGUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQotICAgIHN0ckxvY2FsVGltZSA9IEZYX1VURjhFbmNvZGUod3NSZXQsIHdzUmV0LkdldExlbmd0aCgpKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldEdNVFRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelRpbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsIENGWF9CeXRlU3RyaW5nICZzdHJHTVRUaW1lKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCi0gICAgaWYoIXBEb2MpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBJRlhfTG9jYWxlTWdyICpwTWdyID0gKElGWF9Mb2NhbGVNZ3IgKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KLSAgICBJRlhfTG9jYWxlICpwTG9jYWxlID0gTlVMTDsNCi0gICAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgew0KLSAgICAgICAgQ1hGQV9PYmplY3QgKiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCi0gICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUgKilwVGhpc05vZGUpOw0KLSAgICAgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlLkdldENTdHIoKSwgc3pMb2NhbGUuR2V0TGVuZ3RoKCkpKTsNCi0gICAgfQ0KLSAgICBpZiAoIXBMb2NhbGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCi0gICAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkgew0KLSAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICB3c0Zvcm1hdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekZvcm1hdC5HZXRDU3RyKCksIHN6Rm9ybWF0LkdldExlbmd0aCgpKTsNCi0gICAgfQ0KLSAgICB3c0Zvcm1hdCA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzRm9ybWF0Ow0KLSAgICB3c0Zvcm1hdCArPSBGWF9XU1RSQyhMIn0iKTsNCi0gICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZShYRkFfVlRfVElNRSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VGltZS5HZXRDU3RyKCksIHN6VGltZS5HZXRMZW5ndGgoKSksIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzUmV0Ow0KLSAgICB3aWRnZXRWYWx1ZS5Gb3JtYXRQYXR0ZXJucyh3c1JldCwgd3NGb3JtYXQsIHBMb2NhbGUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQotICAgIHN0ckdNVFRpbWUgPSBGWF9VVEY4RW5jb2RlKHdzUmV0LCB3c1JldC5HZXRMZW5ndGgoKSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1pbnQzMl90ICBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZVN0cmluZzJOdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGVTdHJpbmcpDQotew0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRhdGUyTnVtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQogICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHN6RGF0ZVN0cmluZy5HZXRMZW5ndGgoKTsNCi0gICAgRlhfQk9PTCBpUmV0ID0gRkFMU0U7DQotICAgIGludDMyX3QgaVN0eWxlID0gLTE7DQotICAgIGludDMyX3QgaVllYXIgPSAwOw0KLSAgICBpbnQzMl90IGlNb250aCA9IDA7DQotICAgIGludDMyX3QgaURheSA9IDA7DQotICAgIGludDMyX3QgaUhvdXIgPSAwOw0KLSAgICBpbnQzMl90IGlNaW51dGUgPSAwOw0KLSAgICBpbnQzMl90IGlTZWNvbmQgPSAwOw0KLSAgICBpbnQzMl90IGlNaWxsaW9uU2Vjb25kID0gMDsNCi0gICAgaW50MzJfdCBpWm9uZUhvdXIgPSAwOw0KLSAgICBpbnQzMl90IGlab25lTWludXRlID0gMDsNCi0gICAgaWYgKGlMZW5ndGggPD0gMTApIHsNCi0gICAgICAgIGlSZXQgPSBJc0lzb0RhdGVGb3JtYXQoc3pEYXRlU3RyaW5nLkdldENTdHIoKSwgaUxlbmd0aCwgaVN0eWxlLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgZGF0ZVN0cmluZzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBsb2NhbFN0cmluZzsNCisgICAgRlhKU0VfSFZBTFVFIGRhdGVWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBmb3JtYXRWYWx1ZSA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBsb2NhbFZhbHVlID0gMDsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgZGF0ZVZhbHVlKSkgew0KKyAgICAgIGJGbGFncyA9IFRSVUU7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBpUmV0ID0gSXNJc29EYXRlVGltZUZvcm1hdChzekRhdGVTdHJpbmcuR2V0Q1N0cigpLCBpTGVuZ3RoLCBpWWVhciwgaU1vbnRoLCBpRGF5LCBpSG91ciwgaU1pbnV0ZSwgaVNlY29uZCwgaU1pbGxpb25TZWNvbmQsIGlab25lSG91ciwgaVpvbmVNaW51dGUpOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhkYXRlVmFsdWUsIGRhdGVTdHJpbmcpOw0KICAgICB9DQotICAgIGlmICghaVJldCkgew0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICBmb3JtYXRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgZm9ybWF0VmFsdWUpKSB7DQogICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoZm9ybWF0VmFsdWUsIGZvcm1hdFN0cmluZyk7DQorICAgICAgfQ0KICAgICB9DQotICAgIEZYX0ZMT0FUIGREYXlzID0gMDsNCi0gICAgaW50MzJfdCBpID0gMTsNCi0gICAgaWYgKGlZZWFyIDwgMTkwMCkgew0KKyAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgbG9jYWxWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgbG9jYWxWYWx1ZSkpIHsNCiAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhsb2NhbFZhbHVlLCBsb2NhbFN0cmluZyk7DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmKCFiRmxhZ3MpIHsNCi0gICAgICAgIHdoaWxlIChpWWVhciAtIGkgPj0gMTkwMCkgew0KLSAgICAgICAgICAgIGlmICgoISgoaVllYXIgLSBpKSAlIDQpICYmICgoaVllYXIgLSBpKSAlIDEwMCkpIHx8ICEoKGlZZWFyIC0gaSkgJSA0MDApKSB7DQotICAgICAgICAgICAgICAgIGREYXlzICs9IDM2NjsNCisgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzeklzb0RhdGVTdHJpbmc7DQorICAgICAgRlhfQk9PTCBiUmV0ID0gTG9jYWwySXNvRGF0ZShoVGhpcywgZGF0ZVN0cmluZywgZm9ybWF0U3RyaW5nLCBsb2NhbFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6SXNvRGF0ZVN0cmluZyk7DQorICAgICAgaWYgKGJSZXQpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlU3RyaW5nMk51bShzeklzb0RhdGVTdHJpbmcpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDApOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShkYXRlVmFsdWUpOw0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGZvcm1hdFZhbHVlKTsNCisgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsVmFsdWUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiRGF0ZTJOdW0iKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZUZtdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjIDwgMykgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBpbnQzMl90IGlTdHlsZSA9IDA7DQorICAgIENGWF9CeXRlU3RyaW5nIHN6TG9jYWw7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdTdHlsZSA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdMb2NhbCA9IDA7DQorICAgIGlmIChhcmdjID4gMCkgew0KKyAgICAgIGFyZ1N0eWxlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1N0eWxlKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9DQorICAgICAgaVN0eWxlID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnU3R5bGUpOw0KKyAgICAgIGlmIChpU3R5bGUgPiA0IHx8IGlTdHlsZSA8IDApIHsNCisgICAgICAgIGlTdHlsZSA9IDA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICBhcmdMb2NhbCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdMb2NhbCkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdMb2NhbCwgc3pMb2NhbCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyOw0KKyAgICAgIEdldFN0YW5kYXJkRGF0ZUZvcm1hdChoVGhpcywgaVN0eWxlLCBzekxvY2FsLCBmb3JtYXRTdHIpOw0KKyAgICAgIGlmIChmb3JtYXRTdHIuSXNFbXB0eSgpKSB7DQorICAgICAgICBmb3JtYXRTdHIgPSBGWF9CU1RSQygiIik7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmb3JtYXRTdHIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfQ0KKyAgICBpZiAoYXJnYyA+IDApIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1N0eWxlKTsNCisgICAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0xvY2FsKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkRhdGUyTnVtIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Oklzb0RhdGUyTnVtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzekFyZ1N0cmluZzsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBzekFyZ1N0cmluZyk7DQorICAgICAgaW50MzJfdCBkRGF5cyA9IERhdGVTdHJpbmcyTnVtKHN6QXJnU3RyaW5nKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGludDMyX3QpZERheXMpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIklzb0RhdGUyTnVtIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Oklzb1RpbWUyTnVtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgICBGWFNZU19hc3NlcnQocERvYyk7DQorICAgICAgSUZYX0xvY2FsZU1nciogcE1nciA9IChJRlhfTG9jYWxlTWdyKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHN6QXJnU3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHN6QXJnU3RyaW5nKTsNCisgICAgICBzekFyZ1N0cmluZyA9IHN6QXJnU3RyaW5nLk1pZChzekFyZ1N0cmluZy5GaW5kKCdUJywgMCkgKyAxKTsNCisgICAgICBpZiAoc3pBcmdTdHJpbmcuSXNFbXB0eSgpKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIENYRkFfTG9jYWxlVmFsdWUgdGltZVZhbHVlKA0KKyAgICAgICAgICBYRkFfVlRfVElNRSwNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6QXJnU3RyaW5nLCBzekFyZ1N0cmluZy5HZXRMZW5ndGgoKSksDQorICAgICAgICAgIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgICAgaWYgKHRpbWVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgIENGWF9Vbml0aW1lIHVuaVRpbWUgPSB0aW1lVmFsdWUuR2V0VGltZSgpOw0KKyAgICAgICAgaW50MzJfdCBob3VyID0gdW5pVGltZS5HZXRIb3VyKCk7DQorICAgICAgICBpbnQzMl90IG1pbiA9IHVuaVRpbWUuR2V0TWludXRlKCk7DQorICAgICAgICBpbnQzMl90IHNlY29uZCA9IHVuaVRpbWUuR2V0U2Vjb25kKCk7DQorICAgICAgICBpbnQzMl90IG1pbFNlY29uZCA9IHVuaVRpbWUuR2V0TWlsbGlzZWNvbmQoKTsNCisgICAgICAgIElGWF9Mb2NhbGUqIHBEZWZMb2NhbGUgPSBwTWdyLT5HZXREZWZMb2NhbGUoKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwRGVmTG9jYWxlKTsNCisgICAgICAgIEZYX1RJTUVaT05FIHR6TG9jYWxlOw0KKyAgICAgICAgcERlZkxvY2FsZS0+R2V0VGltZVpvbmUodHpMb2NhbGUpOw0KKyAgICAgICAgaW50MzJfdCBtaW5zID0gaG91ciAqIDYwICsgbWluOw0KKyAgICAgICAgbWlucyAtPSAodHpMb2NhbGUudHpIb3VyICogNjApOw0KKyAgICAgICAgd2hpbGUgKG1pbnMgPiAxNDQwKSB7DQorICAgICAgICAgIG1pbnMgLT0gMTQ0MDsNCisgICAgICAgIH0NCisgICAgICAgIHdoaWxlIChtaW5zIDwgMCkgew0KKyAgICAgICAgICBtaW5zICs9IDE0NDA7DQorICAgICAgICB9DQorICAgICAgICBob3VyID0gbWlucyAvIDYwOw0KKyAgICAgICAgbWluID0gbWlucyAlIDYwOw0KKyAgICAgICAgaW50MzJfdCBpUmVzdWx0ID0NCisgICAgICAgICAgICBob3VyICogMzYwMDAwMCArIG1pbiAqIDYwMDAwICsgc2Vjb25kICogMTAwMCArIG1pbFNlY29uZCArIDE7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgaVJlc3VsdCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAwKTsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIklzb1RpbWUyTnVtIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkxvY2FsRGF0ZUZtdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA8IDMpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgaW50MzJfdCBpU3R5bGUgPSAwOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU3R5bGUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnTG9jYWwgPSAwOw0KKyAgICBpZiAoYXJnYyA+IDApIHsNCisgICAgICBhcmdTdHlsZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTdHlsZSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGlTdHlsZSA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1N0eWxlKTsNCisgICAgICBpZiAoaVN0eWxlID4gNCB8fCBpU3R5bGUgPCAwKSB7DQorICAgICAgICBpU3R5bGUgPSAwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgYXJnTG9jYWwgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnTG9jYWwpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnTG9jYWwsIHN6TG9jYWwpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJGbGFncykgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cjsNCisgICAgICBHZXRMb2NhbERhdGVGb3JtYXQoaFRoaXMsIGlTdHlsZSwgc3pMb2NhbCwgZm9ybWF0U3RyLCBGQUxTRSk7DQorICAgICAgaWYgKGZvcm1hdFN0ci5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGZvcm1hdFN0ciA9IEZYX0JTVFJDKCIiKTsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIGZvcm1hdFN0cik7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID4gMCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU3R5bGUpOw0KKyAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnTG9jYWwpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTG9jYWxEYXRlRm10Iik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkxvY2FsVGltZUZtdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA8IDMpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgaW50MzJfdCBpU3R5bGUgPSAwOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU3R5bGUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnTG9jYWwgPSAwOw0KKyAgICBpZiAoYXJnYyA+IDApIHsNCisgICAgICBhcmdTdHlsZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTdHlsZSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGlTdHlsZSA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1N0eWxlKTsNCisgICAgICBpZiAoaVN0eWxlID4gNCB8fCBpU3R5bGUgPCAwKSB7DQorICAgICAgICBpU3R5bGUgPSAwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgYXJnTG9jYWwgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnTG9jYWwpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnTG9jYWwsIHN6TG9jYWwpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJGbGFncykgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cjsNCisgICAgICBHZXRMb2NhbFRpbWVGb3JtYXQoaFRoaXMsIGlTdHlsZSwgc3pMb2NhbCwgZm9ybWF0U3RyLCBGQUxTRSk7DQorICAgICAgaWYgKGZvcm1hdFN0ci5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGZvcm1hdFN0ciA9IEZYX0JTVFJDKCIiKTsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIGZvcm1hdFN0cik7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID4gMCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU3R5bGUpOw0KKyAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnTG9jYWwpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTG9jYWxUaW1lRm10Iik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJEYXRlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIGludDMyX3QgZERhdGU7DQorICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQorICAgIEZYSlNFX0hWQUxVRSBkYXRlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgZm9ybWF0VmFsdWUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGRhdGVWYWx1ZSkpIHsNCisgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGREYXRlID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgZGF0ZVZhbHVlKTsNCisgICAgICBiRmxhZ3MgPSBkRGF0ZSA8IDE7DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgZm9ybWF0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGZvcm1hdFZhbHVlKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGZvcm1hdFZhbHVlLCBmb3JtYXRTdHJpbmcpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgbG9jYWxWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgbG9jYWxWYWx1ZSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhsb2NhbFZhbHVlLCBsb2NhbFN0cmluZyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgaW50MzJfdCBpWWVhciA9IDE5MDA7DQorICAgICAgaW50MzJfdCBpTW9udGggPSAxOw0KKyAgICAgIGludDMyX3QgaURheSA9IDE7DQorICAgICAgaW50MzJfdCBpID0gMDsNCisgICAgICB3aGlsZSAoZERhdGUgPiAwKSB7DQorICAgICAgICBpZiAoaU1vbnRoID09IDIpIHsNCisgICAgICAgICAgaWYgKCghKChpWWVhciArIGkpICUgNCkgJiYgKChpWWVhciArIGkpICUgMTAwKSkgfHwNCisgICAgICAgICAgICAgICEoKGlZZWFyICsgaSkgJSA0MDApKSB7DQorICAgICAgICAgICAgaWYgKGREYXRlID4gMjkpIHsNCisgICAgICAgICAgICAgICsraU1vbnRoOw0KKyAgICAgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7DQorICAgICAgICAgICAgICAgIGlNb250aCA9IDE7DQorICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlEYXkgPSAxOw0KKyAgICAgICAgICAgICAgZERhdGUgLT0gMjk7DQogICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZERheXMgKz0gMzY1Ow0KKyAgICAgICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxpbnQzMl90PihkRGF0ZSkgLSAxOw0KKyAgICAgICAgICAgICAgZERhdGUgPSAwOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICArK2k7DQotICAgICAgICB9DQotICAgICAgICBpID0gMTsNCi0gICAgICAgIHdoaWxlIChpIDwgaU1vbnRoKSB7DQotICAgICAgICAgICAgaWYgKGkgPT0gMikgew0KLSAgICAgICAgICAgICAgICBpZiAoKCEoaVllYXIgJSA0KSAmJiAoaVllYXIgJSAxMDApKSB8fCAhKGlZZWFyICUgNDAwKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZERheXMgKz0gMjk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBkRGF5cyArPSAyODsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8PSA3KSB7DQotICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBkRGF5cyArPSAzMDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGREYXlzICs9IDMxOw0KLSAgICAgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGREYXRlID4gMjgpIHsNCisgICAgICAgICAgICAgICsraU1vbnRoOw0KKyAgICAgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7DQorICAgICAgICAgICAgICAgIGlNb250aCA9IDE7DQorICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlEYXkgPSAxOw0KKyAgICAgICAgICAgICAgZERhdGUgLT0gMjg7DQogICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKGkgJSAyID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGREYXlzICs9IDMxOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZERheXMgKz0gMzA7DQotICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZERhdGUpIC0gMTsNCisgICAgICAgICAgICAgIGREYXRlID0gMDsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgKytpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaSA9IDA7DQotICAgICAgICB3aGlsZSAoaURheSAtIGkgPiAwKSB7DQotICAgICAgICAgICAgZERheXMgKz0gMTsNCi0gICAgICAgICAgICArK2k7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBkRGF5cyA9IDA7DQotICAgIH0NCi0gICAgcmV0dXJuIChpbnQzMl90KWREYXlzOw0KLX0NCi0jZGVmaW5lIFhGQV9OIDE5DQotc3RhdGljIHVpbnQ4X3QgZ19zQWx0VGFibGVfRGF0ZVtdID0gew0KLSAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCAgIDMsICAgICA5LCAgIFhGQV9OLCBYRkFfTiwgWEZBX04sDQotICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLAkgIDIsICAgWEZBX04sIFhGQV9OLCBYRkFfTiwNCi0gICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KLSAgICAxLCAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KLSAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQotICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCi0gICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KLSAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQotfTsNCi1zdGF0aWMgdWludDhfdCBnX3NBbHRUYWJsZV9UaW1lW10gPSB7DQotICAgIDE0LCAgWEZBX04sIFhGQV9OLCAgIDMsICAgICA5LCAgIFhGQV9OLCBYRkFfTiwgICAgMTUsDQotICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLAkgIDYsICAgWEZBX04sIFhGQV9OLCBYRkFfTiwNCi0gICAgWEZBX04sIFhGQV9OLCAgIDcsICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KLSAgICAxLCAgIDE3LCAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KLSAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgICAgMTUsDQotICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCi0gICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KLSAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQotfTsNCi1zdGF0aWMgdm9pZCBYRkFfRk1fQWx0ZXJuYXRlRGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nICZ3c1BhdHRlcm4sIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0FsdFN5bWJvbHMsIHVpbnQ4X3QgKnBBbHRUYWJsZSkNCi17DQotICAgIGludDMyX3QJbkxlbmd0aAkJCT0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOw0KLSAgICBGWF9CT09MCQliSW5Db25zdFJhbmdlCT0gRkFMU0U7DQotICAgIEZYX0JPT0wJCWJFc2NhcGUJCQk9IEZBTFNFOw0KLSAgICBpbnQzMl90IGkgPSAwLCBuID0gMDsNCi0gICAgd2hpbGUgKGkgPCBuTGVuZ3RoKSB7DQotICAgICAgICBGWF9XQ0hBUiB3YyA9IHdzUGF0dGVybltpXTsNCi0gICAgICAgIGlmICh3YyA9PSBMJ1wnJykgew0KLSAgICAgICAgICAgIGJJbkNvbnN0UmFuZ2UJPSAhYkluQ29uc3RSYW5nZTsNCi0gICAgICAgICAgICBpZiAoYkVzY2FwZSkgew0KLSAgICAgICAgICAgICAgICBpICsrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGlNb250aCA8IDgpIHsNCisgICAgICAgICAgaWYgKChpTW9udGggJSAyID09IDApKSB7DQorICAgICAgICAgICAgaWYgKGREYXRlID4gMzApIHsNCisgICAgICAgICAgICAgICsraU1vbnRoOw0KKyAgICAgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7DQorICAgICAgICAgICAgICAgIGlNb250aCA9IDE7DQorICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlEYXkgPSAxOw0KKyAgICAgICAgICAgICAgZERhdGUgLT0gMzA7DQogICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgd3NQYXR0ZXJuLkRlbGV0ZShpKTsNCi0gICAgICAgICAgICAgICAgbkxlbmd0aCAtLTsNCisgICAgICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZERhdGUpIC0gMTsNCisgICAgICAgICAgICAgIGREYXRlID0gMDsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgYkVzY2FwZSA9ICFiRXNjYXBlOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiSW5Db25zdFJhbmdlICYmIChuID0gd2MgLSBMJ0EnKSA+PSAwICYmIG4gPD0gKEwnYScgLSBMJ0EnKSkgew0KLSAgICAgICAgICAgIGludDMyX3QgbkFsdCA9IChpbnQzMl90KXBBbHRUYWJsZVtuXTsNCi0gICAgICAgICAgICBpZiAobkFsdCAhPSBYRkFfTikgew0KLSAgICAgICAgICAgICAgICB3c1BhdHRlcm4uU2V0QXQoaSwgd3NBbHRTeW1ib2xzW25BbHRdKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoZERhdGUgPiAzMSkgew0KKyAgICAgICAgICAgICAgKytpTW9udGg7DQorICAgICAgICAgICAgICBpZiAoaU1vbnRoID4gMTIpIHsNCisgICAgICAgICAgICAgICAgaU1vbnRoID0gMTsNCisgICAgICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaURheSA9IDE7DQorICAgICAgICAgICAgICBkRGF0ZSAtPSAzMTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxpbnQzMl90PihkRGF0ZSkgLSAxOw0KKyAgICAgICAgICAgICAgZERhdGUgPSAwOw0KICAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGlNb250aCAlIDIgIT0gMCkgew0KKyAgICAgICAgICAgIGlmIChkRGF0ZSA+IDMwKSB7DQorICAgICAgICAgICAgICArK2lNb250aDsNCisgICAgICAgICAgICAgIGlmIChpTW9udGggPiAxMikgew0KKyAgICAgICAgICAgICAgICBpTW9udGggPSAxOw0KKyAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpRGF5ID0gMTsNCisgICAgICAgICAgICAgIGREYXRlIC09IDMwOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PGludDMyX3Q+KGREYXRlKSAtIDE7DQorICAgICAgICAgICAgICBkRGF0ZSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChkRGF0ZSA+IDMxKSB7DQorICAgICAgICAgICAgICArK2lNb250aDsNCisgICAgICAgICAgICAgIGlmIChpTW9udGggPiAxMikgew0KKyAgICAgICAgICAgICAgICBpTW9udGggPSAxOw0KKyAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpRGF5ID0gMTsNCisgICAgICAgICAgICAgIGREYXRlIC09IDMxOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PGludDMyX3Q+KGREYXRlKSAtIDE7DQorICAgICAgICAgICAgICBkRGF0ZSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBpICsrOw0KLSAgICAgICAgYkVzY2FwZSA9IEZBTFNFOw0KLSAgICB9DQotfQ0KLSN1bmRlZiBYRkFfTg0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldExvY2FsRGF0ZUZvcm1hdChGWEpTRV9IT0JKRUNUIGhUaGlzLCBpbnQzMl90IGlTdHlsZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLCBDRlhfQnl0ZVN0cmluZyAmc3RyRm9ybWF0LCBGWF9CT09MIGJTdGFuZGFyZCkNCi17DQotICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgc3RyU3R5bGU7DQotICAgIHN3aXRjaCAoaVN0eWxlKSB7DQotICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KLSAgICBpZighcERvYykgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElGWF9Mb2NhbGVNZ3IgKnBNZ3IgPSAoSUZYX0xvY2FsZU1nciAqKXBEb2MtPkdldExvY2FsTWdyKCk7DQotICAgIElGWF9Mb2NhbGUgKnBMb2NhbGUgPSBOVUxMOw0KLSAgICBpZiAoc3pMb2NhbFN0ci5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIENYRkFfT2JqZWN0KiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCi0gICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUqKXBUaGlzTm9kZSk7DQotICAgICAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KKyAgICAgIH0NCisgICAgICBDRlhfQnl0ZVN0cmluZyBzeklzb0RhdGVTdHJpbmc7DQorICAgICAgc3pJc29EYXRlU3RyaW5nLkZvcm1hdCgiJWQlMDJkJTAyZCIsIGlZZWFyICsgaSwgaU1vbnRoLCBpRGF5KTsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsRGF0ZVN0cmluZzsNCisgICAgICBGWF9CT09MIGJSZXQgPSBJc29EYXRlMkxvY2FsKGhUaGlzLCBzeklzb0RhdGVTdHJpbmcsIGZvcm1hdFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RyaW5nLCBzekxvY2FsRGF0ZVN0cmluZyk7DQorICAgICAgaWYgKHN6TG9jYWxEYXRlU3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgICAgc3pMb2NhbERhdGVTdHJpbmcgPSBGWF9CU1RSQygiIik7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzekxvY2FsRGF0ZVN0cmluZyk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBwTG9jYWxlID0gcE1nci0+R2V0TG9jYWxlQnlOYW1lKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekxvY2FsU3RyLkdldENTdHIoKSwgc3pMb2NhbFN0ci5HZXRMZW5ndGgoKSkpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCiAgICAgfQ0KLSAgICBpZiAoIXBMb2NhbGUpIHsNCi0gICAgICAgIHJldHVybjsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShkYXRlVmFsdWUpOw0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGZvcm1hdFZhbHVlKTsNCisgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsVmFsdWUpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyBzdHJSZXQ7DQotICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKHN0clN0eWxlLCBzdHJSZXQpOw0KLSAgICBpZiAoIWJTdGFuZGFyZCkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2xzOw0KLSAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVRpbWVTeW1ib2xzKHdzU3ltYm9scyk7DQotICAgICAgICBYRkFfRk1fQWx0ZXJuYXRlRGF0ZVRpbWVTeW1ib2xzKHN0clJldCwgd3NTeW1ib2xzLCBnX3NBbHRUYWJsZV9EYXRlKTsNCi0gICAgfQ0KLSAgICBzdHJGb3JtYXQgPSBGWF9VVEY4RW5jb2RlKHN0clJldCwgc3RyUmV0LkdldExlbmd0aCgpKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk51bTJEYXRlIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldExvY2FsVGltZUZvcm1hdChGWEpTRV9IT0JKRUNUIGhUaGlzLCBpbnQzMl90IGlTdHlsZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLCBDRlhfQnl0ZVN0cmluZyAmc3RyRm9ybWF0LCBGWF9CT09MIGJTdGFuZGFyZCkNCi17DQotICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgc3RyU3R5bGU7DQotICAgIHN3aXRjaCAoaVN0eWxlKSB7DQotICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KLSAgICBpZighcERvYykgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElGWF9Mb2NhbGVNZ3IgKnBNZ3IgPSAoSUZYX0xvY2FsZU1nciAqKXBEb2MtPkdldExvY2FsTWdyKCk7DQotICAgIElGWF9Mb2NhbGUgKnBMb2NhbGUgPSBOVUxMOw0KLSAgICBpZiAoc3pMb2NhbFN0ci5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIENYRkFfT2JqZWN0ICpwVGhpc09iamVjdCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBUaGlzT2JqZWN0LT5Jc05vZGUoKSk7DQotICAgICAgICBDWEZBX05vZGUqIHBUaGlzTm9kZSA9IChDWEZBX05vZGUgKilwVGhpc09iamVjdDsNCi0gICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKHBUaGlzTm9kZSk7DQotICAgICAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJHTVRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIGludDMyX3QgaVRpbWU7DQorICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQorICAgIEZYSlNFX0hWQUxVRSB0aW1lVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgZm9ybWF0VmFsdWUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwodGltZVZhbHVlKSkgew0KKyAgICAgIGJGbGFncyA9IFRSVUU7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBwTG9jYWxlID0gcE1nci0+R2V0TG9jYWxlQnlOYW1lKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekxvY2FsU3RyLkdldENTdHIoKSwgc3pMb2NhbFN0ci5HZXRMZW5ndGgoKSkpOw0KKyAgICAgIGlUaW1lID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgdGltZVZhbHVlKTsNCisgICAgICBpZiAoRlhTWVNfYWJzKGlUaW1lKSA8IDEuMCkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKCFwTG9jYWxlKSB7DQotICAgICAgICByZXR1cm47DQorICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgIGZvcm1hdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGZvcm1hdFZhbHVlKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGZvcm1hdFZhbHVlLCBmb3JtYXRTdHJpbmcpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyBzdHJSZXQ7DQotICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKHN0clN0eWxlLCBzdHJSZXQpOw0KLSAgICBpZiAoIWJTdGFuZGFyZCkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2xzOw0KLSAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVRpbWVTeW1ib2xzKHdzU3ltYm9scyk7DQotICAgICAgICBYRkFfRk1fQWx0ZXJuYXRlRGF0ZVRpbWVTeW1ib2xzKHN0clJldCwgd3NTeW1ib2xzLCBnX3NBbHRUYWJsZV9UaW1lKTsNCisgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgIGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwobG9jYWxWYWx1ZSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhsb2NhbFZhbHVlLCBsb2NhbFN0cmluZyk7DQorICAgICAgfQ0KICAgICB9DQotICAgIHN0ckZvcm1hdCA9IEZYX1VURjhFbmNvZGUoc3RyUmV0LCBzdHJSZXQuR2V0TGVuZ3RoKCkpOw0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXRTdGFuZGFyZERhdGVGb3JtYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywgaW50MzJfdCBpU3R5bGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbFN0ciwgQ0ZYX0J5dGVTdHJpbmcgJnN0ckZvcm1hdCkNCi17DQotICAgIEdldExvY2FsRGF0ZUZvcm1hdChoVGhpcywgaVN0eWxlLCBzekxvY2FsU3RyLCBzdHJGb3JtYXQsIFRSVUUpOw0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXRTdGFuZGFyZFRpbWVGb3JtYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywgaW50MzJfdCBpU3R5bGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbFN0ciwgQ0ZYX0J5dGVTdHJpbmcgJnN0ckZvcm1hdCkNCi17DQotICAgIEdldExvY2FsVGltZUZvcm1hdChoVGhpcywgaVN0eWxlLCBzekxvY2FsU3RyLCBzdHJGb3JtYXQsIFRSVUUpOw0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yQWxsVGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLCBpbnQzMl90IGlUaW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLCBGWF9CT09MIGJHTSwgQ0ZYX0J5dGVTdHJpbmcgJnN0clRpbWUpDQotew0KLSAgICBpbnQzMl90IGlIb3VyID0gMDsNCi0gICAgaW50MzJfdCBpTWluID0gMDsNCi0gICAgaW50MzJfdCBpU2VjID0gMDsNCi0gICAgaW50MzJfdCBpWm9uZUhvdXIgPSAwOw0KLSAgICBpbnQzMl90IGlab25lTWluID0gMDsNCi0gICAgaW50MzJfdCBpWm9uZVNlYyA9IDA7DQotICAgIGlIb3VyID0gc3RhdGljX2Nhc3Q8aW50PihpVGltZSkgLyAzNjAwMDAwOw0KLSAgICBpTWluID0gKHN0YXRpY19jYXN0PGludD4oaVRpbWUpIC0gaUhvdXIgKiAzNjAwMDAwKSAvIDYwMDAwOw0KLSAgICBpU2VjID0gKHN0YXRpY19jYXN0PGludD4oaVRpbWUpIC0gaUhvdXIgKiAzNjAwMDAwIC0gaU1pbiAqIDYwMDAwKSAvIDEwMDA7DQotICAgIGlmICghYkdNKSB7DQotICAgICAgICBHZXRMb2NhbFRpbWVab25lKGlab25lSG91ciwgaVpvbmVNaW4sIGlab25lU2VjKTsNCi0gICAgICAgIGlIb3VyICs9IGlab25lSG91cjsNCi0gICAgICAgIGlNaW4gKz0gaVpvbmVNaW47DQotICAgICAgICBpU2VjICs9IGlab25lU2VjOw0KLSAgICB9DQotICAgIGludDMyX3QgaVJldCA9IDA7DQotICAgIENGWF9CeXRlU3RyaW5nIHN0cklzb1RpbWU7DQotICAgIHN0cklzb1RpbWUuRm9ybWF0KCIlMDJkOiUwMmQ6JTAyZCIsIGlIb3VyLCBpTWluLCBpU2VjKTsNCi0gICAgaWYgKGJHTSkgew0KLSAgICAgICAgaVJldCA9IEdldEdNVFRpbWUoaFRoaXMsIHN0cklzb1RpbWUsIHN6Rm9ybWF0LCBzekxvY2FsZSwgc3RyVGltZSk7DQorICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pHTVRUaW1lU3RyaW5nOw0KKyAgICAgIE51bTJBbGxUaW1lKGhUaGlzLCBpVGltZSwgZm9ybWF0U3RyaW5nLCBsb2NhbFN0cmluZywgVFJVRSwNCisgICAgICAgICAgICAgICAgICBzekdNVFRpbWVTdHJpbmcpOw0KKyAgICAgIGlmIChzekdNVFRpbWVTdHJpbmcuSXNFbXB0eSgpKSB7DQorICAgICAgICBzekdNVFRpbWVTdHJpbmcgPSBGWF9CU1RSQygiIik7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzekdNVFRpbWVTdHJpbmcpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgaVJldCA9IElzb1RpbWUyTG9jYWwoaFRoaXMsIHN0cklzb1RpbWUsIHN6Rm9ybWF0LCBzekxvY2FsZSwgc3RyVGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KICAgICB9DQotICAgIGlmICghaVJldCkgew0KLSAgICAgICAgc3RyVGltZSA9IEZYX0JTVFJDKCIiKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZSh0aW1lVmFsdWUpOw0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGZvcm1hdFZhbHVlKTsNCisgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsVmFsdWUpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm47DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJOdW0yR01UaW1lIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldExvY2FsVGltZVpvbmUoaW50MzJfdCAmaUhvdXIsIGludDMyX3QgJmlNaW4sIGludDMyX3QgJmlTZWMpDQotew0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJUaW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIEZYX0ZMT0FUIGZUaW1lOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBmb3JtYXRTdHJpbmc7DQorICAgIENGWF9CeXRlU3RyaW5nIGxvY2FsU3RyaW5nOw0KKyAgICBGWEpTRV9IVkFMVUUgdGltZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGZvcm1hdFZhbHVlID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGxvY2FsVmFsdWUgPSAwOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHRpbWVWYWx1ZSkpIHsNCisgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGZUaW1lID0gSFZhbHVlVG9GbG9hdChoVGhpcywgdGltZVZhbHVlKTsNCisgICAgICBpZiAoRlhTWVNfZmFicyhmVGltZSkgPCAxLjApIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgIGZvcm1hdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGZvcm1hdFZhbHVlKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGZvcm1hdFZhbHVlLCBmb3JtYXRTdHJpbmcpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgbG9jYWxWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChsb2NhbFZhbHVlKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGxvY2FsVmFsdWUsIGxvY2FsU3RyaW5nKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsVGltZVN0cmluZzsNCisgICAgICBOdW0yQWxsVGltZShoVGhpcywgKGludDMyX3QpZlRpbWUsIGZvcm1hdFN0cmluZywgbG9jYWxTdHJpbmcsIEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgIHN6TG9jYWxUaW1lU3RyaW5nKTsNCisgICAgICBpZiAoc3pMb2NhbFRpbWVTdHJpbmcuSXNFbXB0eSgpKSB7DQorICAgICAgICBzekxvY2FsVGltZVN0cmluZyA9IEZYX0JTVFJDKCIiKTsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHN6TG9jYWxUaW1lU3RyaW5nKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZSh0aW1lVmFsdWUpOw0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGZvcm1hdFZhbHVlKTsNCisgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsVmFsdWUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTnVtMlRpbWUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMCkgew0KICAgICB0aW1lX3Qgbm93Ow0KICAgICB0aW1lKCZub3cpOw0KLSAgICBzdHJ1Y3QgdG0gKnBHbXQgPSBnbXRpbWUoJm5vdyk7DQorICAgIHN0cnVjdCB0bSogcEdtdCA9IGdtdGltZSgmbm93KTsNCiAgICAgaW50MzJfdCBpR01Ib3VyID0gcEdtdC0+dG1faG91cjsNCiAgICAgaW50MzJfdCBpR01NaW4gPSBwR210LT50bV9taW47DQogICAgIGludDMyX3QgaUdNU2VjID0gcEdtdC0+dG1fc2VjOw0KLSAgICBzdHJ1Y3QgdG0gKnBMb2NhbCA9IGxvY2FsdGltZSgmbm93KTsNCi0gICAgaW50MzJfdCBpTG9jYWxIb3VyID0gcExvY2FsLT50bV9ob3VyOw0KLSAgICBpbnQzMl90IGlMb2NhbE1pbiA9IHBMb2NhbC0+dG1fbWluOw0KLSAgICBpbnQzMl90IGlMb2NhbFNlYyA9IHBMb2NhbC0+dG1fc2VjOw0KLSAgICBpSG91ciA9IGlMb2NhbEhvdXIgLSBpR01Ib3VyOw0KLSAgICBpTWluID0gaUxvY2FsTWluIC0gaUdNTWluOw0KLSAgICBpU2VjID0gaUxvY2FsU2VjIC0gaUdNU2VjOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlHTUhvdXIgKiAzNjAwICsgaUdNTWluICogNjAgKyBpR01TZWMpICogMTAwMCkpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiVGltZSIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpBcHIoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGlmKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgICAgIEZYX0RPVUJMRSBuUHJpbmNpcGFsID0gMDsNCi0gICAgICAgIEZYX0RPVUJMRSBuUGF5bWVudCA9IDA7DQotICAgICAgICBGWF9ET1VCTEUgblBlcmlvZHMgPSAwOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQotICAgICAgICBiRmxhZ3MgPSAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1RocmVlKSk7DQotICAgICAgICBpZihiRmxhZ3MpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG5QcmluY2lwYWwgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKTsNCi0gICAgICAgICAgICBuUGF5bWVudCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUd28pOw0KLSAgICAgICAgICAgIG5QZXJpb2RzID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1RocmVlKTsNCi0gICAgICAgICAgICBiRmxhZ3MgPSAoKG5QcmluY2lwYWwgPD0gMCkgfHwgKG5QYXltZW50IDw9IDApIHx8IChuUGVyaW9kcyA8PSAwKSk7DQotICAgICAgICAgICAgaWYoYkZsYWdzKSB7DQotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBGWF9ET1VCTEUgciA9IDIgKiAoblBlcmlvZHMgKiBuUGF5bWVudCAtIG5QcmluY2lwYWwpIC8gKG5QZXJpb2RzICogblByaW5jaXBhbCk7DQotICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBuVGVtcCA9IDE7DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5QZXJpb2RzOyArK2kpIHsNCi0gICAgICAgICAgICAgICAgICAgIG5UZW1wICo9ICgxICsgcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhfRE9VQkxFIG5SZXQgPSByICogblRlbXAgLyAoblRlbXAgLSAxKSAtIG5QYXltZW50IC8gblByaW5jaXBhbDsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKCAoblJldCA+IEZJTkFOQ0lBTF9QUkVDSVNJT04gfHwgblJldCA8IC1GSU5BTkNJQUxfUFJFQ0lTSU9OKSAmJiAoIWJGbGFncykgKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUgbkRlcml2YXRpdmUgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgbkRlcml2YXRpdmUgPSAoKG5UZW1wICsgciAqIG5QZXJpb2RzICogKG5UZW1wIC8gKDEgKyByKSkpICogKG5UZW1wIC0gMSkgLSAociAqIG5UZW1wICogblBlcmlvZHMgKiAoblRlbXAgLyAoMSArIHIpKSkpIC8gKChuVGVtcCAtIDEpICogKG5UZW1wIC0gMSkpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5EZXJpdmF0aXZlID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgciA9IHIgLSBuUmV0IC8gbkRlcml2YXRpdmU7DQotICAgICAgICAgICAgICAgICAgICBuVGVtcCA9IDE7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuUGVyaW9kczsgKytpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgblRlbXAgKj0gKDEgKyByKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIG5SZXQgPSByICogblRlbXAgLyAoblRlbXAgLSAxKSAtIG5QYXltZW50IC8gblByaW5jaXBhbDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZihiRmxhZ3MpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHIgPSByICogMTI7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWUyTnVtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIENGWF9CeXRlU3RyaW5nIHRpbWVTdHJpbmc7DQorICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQorICAgIEZYSlNFX0hWQUxVRSB0aW1lVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgZm9ybWF0VmFsdWUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIHRpbWVWYWx1ZSkpIHsNCisgICAgICBiRmxhZ3MgPSBUUlVFOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiQXByIik7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKHRpbWVWYWx1ZSwgdGltZVN0cmluZyk7DQogICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Q1Rlcm0oRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGlmKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgICAgIEZYX0ZMT0FUIG5SYXRlID0gMDsNCi0gICAgICAgIEZYX0ZMT0FUIG5GdXR1cmVWYWx1ZSA9IDA7DQotICAgICAgICBGWF9GTE9BVCBuSW5pdEFtb3VudCA9IDA7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCi0gICAgICAgIGJGbGFncyA9IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpKTsNCi0gICAgICAgIGlmKGJGbGFncykgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgblJhdGUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdPbmUpOw0KLSAgICAgICAgICAgIG5GdXR1cmVWYWx1ZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1R3byk7DQotICAgICAgICAgICAgbkluaXRBbW91bnQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUaHJlZSk7DQotICAgICAgICAgICAgYkZsYWdzID0gKChuUmF0ZSA8PSAwKSB8fCAobkZ1dHVyZVZhbHVlIDw9IDApIHx8IChuSW5pdEFtb3VudCA8PSAwKSk7DQotICAgICAgICAgICAgaWYoYkZsYWdzKSB7DQotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChhcmdzLkdldFJldHVyblZhbHVlKCksIEZYU1lTX2xvZygoRlhfRkxPQVQpKG5GdXR1cmVWYWx1ZSAvIG5Jbml0QW1vdW50KSkgLyBGWFNZU19sb2coKEZYX0ZMT0FUKSgxICsgblJhdGUpKSApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiQ1Rlcm0iKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpGVihGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAzKSB7DQotICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KLSAgICAgICAgRlhfRE9VQkxFIG5BbW91bnQgPSAwOw0KLSAgICAgICAgRlhfRE9VQkxFIG5SYXRlID0gMDsNCi0gICAgICAgIEZYX0RPVUJMRSBuUGVyaW9kID0gMDsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KLSAgICAgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUaHJlZSkpOw0KLSAgICAgICAgaWYoYkZsYWdzKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBuQW1vdW50ID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQotICAgICAgICAgICAgblJhdGUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVHdvKTsNCi0gICAgICAgICAgICBuUGVyaW9kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1RocmVlKTsNCi0gICAgICAgICAgICBiRmxhZ3MgPSAoKG5SYXRlIDwgMCkgfHwgKG5QZXJpb2QgPD0gMCkgfHwgKG5BbW91bnQgPD0gMCkpOw0KLSAgICAgICAgICAgIGlmKGJGbGFncykgew0KLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgRlhfRE9VQkxFIGRSZXN1bHQgPSAwOw0KLSAgICAgICAgICAgICAgICBpZiAoIW5SYXRlKSB7DQotICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gbkFtb3VudCAqIG5QZXJpb2Q7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUgblRlbXAgPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUGVyaW9kOyArK2kpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBuVGVtcCAqPSAxICsgblJhdGU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gbkFtb3VudCAqIChuVGVtcCAtIDEpIC8gblJhdGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZFJlc3VsdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJGViIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OklQbXQoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGlmKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gNSkgew0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgICAgIEZYX0ZMT0FUIG5QcmluY3BhbEFtb3VudCA9IDA7DQotICAgICAgICBGWF9GTE9BVCBuUmF0ZSA9IDA7DQotICAgICAgICBGWF9GTE9BVCBuUGF5bWVudCA9IDA7DQotICAgICAgICBGWF9GTE9BVCBuRmlyc3RNb250aCA9IDA7DQotICAgICAgICBGWF9GTE9BVCBuTnVtYmVyT2ZNb250aHMgPSAwOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRm91ciA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMyk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRml2ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgNCk7DQotICAgICAgICBiRmxhZ3MgPSAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1RocmVlKSB8fA0KLSAgICAgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRm91cikgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdGaXZlKSk7DQotICAgICAgICBpZihiRmxhZ3MpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG5QcmluY3BhbEFtb3VudCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ09uZSk7DQotICAgICAgICAgICAgblJhdGUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUd28pOw0KLSAgICAgICAgICAgIG5QYXltZW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KLSAgICAgICAgICAgIG5GaXJzdE1vbnRoID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnRm91cik7DQotICAgICAgICAgICAgbk51bWJlck9mTW9udGhzID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnRml2ZSk7DQotICAgICAgICAgICAgYkZsYWdzID0gKChuUHJpbmNwYWxBbW91bnQgPD0gMCkgfHwgKG5SYXRlIDw9IDApIHx8IChuUGF5bWVudCA8PSAwKSB8fCAobkZpcnN0TW9udGggPCAwKSB8fCAobk51bWJlck9mTW9udGhzIDwgMCkpOw0KLSAgICAgICAgICAgIGlmKGJGbGFncykgew0KLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZlJlc3VsdCA9IDA7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG5SYXRlT2ZNb250aCA9IG5SYXRlIC8gMTI7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaU51bXMgPSAoaW50MzJfdCkoKEZYU1lTX2xvZzEwKChGWF9GTE9BVCkoblBheW1lbnQgLyBuUHJpbmNwYWxBbW91bnQpKSAtIEZYU1lTX2xvZzEwKChGWF9GTE9BVCkoblBheW1lbnQgLyBuUHJpbmNwYWxBbW91bnQgLSBuUmF0ZU9mTW9udGgpKSkgLyBGWFNZU19sb2cxMCgoRlhfRkxPQVQpKDEgKyBuUmF0ZU9mTW9udGgpKSk7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUVuZCA9IChpbnQzMl90KShuRmlyc3RNb250aCArIG5OdW1iZXJPZk1vbnRocyAtIDEpOw0KLSAgICAgICAgICAgICAgICBpZiAoaUVuZCA+IGlOdW1zKSB7DQotICAgICAgICAgICAgICAgICAgICBpRW5kID0gaU51bXM7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgblN1bSA9IDA7DQotICAgICAgICAgICAgICAgIGlmIChuUGF5bWVudCA8IG5QcmluY3BhbEFtb3VudCAqIG5SYXRlT2ZNb250aCkgew0KLSAgICAgICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGZSZXN1bHQgPSAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKCFiRmxhZ3MpIHsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaSA9IDA7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkZpcnN0TW9udGggLSAxOyArK2kpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBuUHJpbmNwYWxBbW91bnQgLT0gblBheW1lbnQgLSBuUHJpbmNwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGg7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGlFbmQ7ICsraSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5TdW0gKz0gblByaW5jcGFsQW1vdW50ICogblJhdGVPZk1vbnRoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5QcmluY3BhbEFtb3VudCAtPSBuUGF5bWVudCAtIG5QcmluY3BhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZSZXN1bHQgPSBuU3VtOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZlJlc3VsdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZvdXIpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXZlKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIklQbXQiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpOUFYoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID4gMikgew0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSAqYXJnVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBhcmdjKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KLSAgICAgICAgICAgIGFyZ1ZhbHVlc1tpXSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgaSk7DQotICAgICAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVmFsdWVzW2ldKSkgew0KLSAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYkZsYWdzKSB7DQotICAgICAgICAgICAgRlhfRE9VQkxFIG5SYXRlID0gMDsNCi0gICAgICAgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZXNbMF0pOw0KLSAgICAgICAgICAgIGlmIChuUmF0ZSA8PSAwKSB7DQotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBGWF9ET1VCTEUgKnBEYXRhID0gRlhfQWxsb2MoRlhfRE9VQkxFLCBhcmdjIC0gMSk7DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgcERhdGFbaSAtIDFdID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlc1tpXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhfRE9VQkxFICBuU3VtID0gMDsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjIC0gMTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUgblRlbXAgPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDw9IGk7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5UZW1wICo9IDEgKyBuUmF0ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBuTnVtID0gKihwRGF0YSArIGlJbmRleCsrKTsNCi0gICAgICAgICAgICAgICAgICAgIG5TdW0gKz0gbk51bSAvIG5UZW1wOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIG5TdW0pOw0KLSAgICAgICAgICAgICAgICBGWF9GcmVlKHBEYXRhKTsNCi0gICAgICAgICAgICAgICAgcERhdGEgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZXNbaV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRnJlZShhcmdWYWx1ZXMpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiTlBWIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UG10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICBpZihhcmdzLkdldExlbmd0aCgpID09IDMpIHsNCi0gICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQotICAgICAgICBGWF9GTE9BVCBuUHJpbmNpcGFsID0gMDsNCi0gICAgICAgIEZYX0ZMT0FUIG5SYXRlID0gMDsNCi0gICAgICAgIEZYX0ZMT0FUIG5QZXJpb2RzID0gMDsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KLSAgICAgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUaHJlZSkpOw0KLSAgICAgICAgaWYoYkZsYWdzKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBuUHJpbmNpcGFsID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCi0gICAgICAgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1R3byk7DQotICAgICAgICAgICAgblBlcmlvZHMgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUaHJlZSk7DQotICAgICAgICAgICAgYkZsYWdzID0gKChuUHJpbmNpcGFsIDw9IDApIHx8IChuUmF0ZSA8PSAwKSB8fCAoblBlcmlvZHMgPD0gMCkpOw0KLSAgICAgICAgICAgIGlmKGJGbGFncykgew0KLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgblN1bSA9IDA7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG5UbXAgPSAxICsgblJhdGU7DQotICAgICAgICAgICAgICAgIG5TdW0gPSBuVG1wOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuUGVyaW9kcyAtIDE7ICsraSkgew0KLSAgICAgICAgICAgICAgICAgICAgblN1bSAqPSBuVG1wOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKG5QcmluY2lwYWwgKiBuUmF0ZSAqIG5TdW0pIC8gKG5TdW0gLSAxKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJQbXQiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQUG10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICBpZihhcmdzLkdldExlbmd0aCgpID09IDUpIHsNCi0gICAgICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQotICAgICAgICBGWF9GTE9BVCBuUHJpbmNwYWxBbW91bnQgPSAwOw0KLSAgICAgICAgRlhfRkxPQVQgblJhdGUgPSAwOw0KLSAgICAgICAgRlhfRkxPQVQgblBheW1lbnQgPSAwOw0KLSAgICAgICAgRlhfRkxPQVQgbkZpcnN0TW9udGggPSAwOw0KLSAgICAgICAgRlhfRkxPQVQgbk51bWJlck9mTW9udGhzID0gMDsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZvdXIgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDMpOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpdmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDQpOw0KLSAgICAgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUaHJlZSkgfHwNCi0gICAgICAgICAgICAgICAgICBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ0ZvdXIpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRml2ZSkpOw0KLSAgICAgICAgaWYoYkZsYWdzKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBuUHJpbmNwYWxBbW91bnQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdPbmUpOw0KLSAgICAgICAgICAgIG5SYXRlID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVHdvKTsNCi0gICAgICAgICAgICBuUGF5bWVudCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1RocmVlKTsNCi0gICAgICAgICAgICBuRmlyc3RNb250aCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ0ZvdXIpOw0KLSAgICAgICAgICAgIG5OdW1iZXJPZk1vbnRocyA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ0ZpdmUpOw0KLSAgICAgICAgICAgIGJGbGFncyA9ICgoblByaW5jcGFsQW1vdW50IDw9IDApIHx8IChuUmF0ZSA8PSAwKSB8fCAoblBheW1lbnQgPD0gMCkgfHwgKG5GaXJzdE1vbnRoIDwgMCkgfHwgKG5OdW1iZXJPZk1vbnRocyA8IDApKTsNCi0gICAgICAgICAgICBpZihiRmxhZ3MpIHsNCi0gICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUVuZCA9IChpbnQzMl90KShuRmlyc3RNb250aCArIG5OdW1iZXJPZk1vbnRocyAtIDEpOw0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBuU3VtID0gMDsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgblJhdGVPZk1vbnRoID0gblJhdGUgLyAxMjsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpTnVtcyA9IChpbnQzMl90KSgoRlhTWVNfbG9nMTAoKEZYX0ZMT0FUKShuUGF5bWVudCAvIG5QcmluY3BhbEFtb3VudCkpIC0gRlhTWVNfbG9nMTAoKEZYX0ZMT0FUKShuUGF5bWVudCAvIG5QcmluY3BhbEFtb3VudCAtIG5SYXRlT2ZNb250aCkpKSAvIEZYU1lTX2xvZzEwKChGWF9GTE9BVCkoMSArIG5SYXRlT2ZNb250aCkpKTsNCi0gICAgICAgICAgICAgICAgaWYgKGlFbmQgPiBpTnVtcykgew0KLSAgICAgICAgICAgICAgICAgICAgaUVuZCA9IGlOdW1zOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChuUGF5bWVudCA8IG5QcmluY3BhbEFtb3VudCAqIG5SYXRlT2ZNb250aCkgew0KLSAgICAgICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZighYkZsYWdzKSB7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGkgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5GaXJzdE1vbnRoIC0gMTsgKytpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgblByaW5jcGFsQW1vdW50IC09IG5QYXltZW50IC0gblByaW5jcGFsQW1vdW50ICogblJhdGVPZk1vbnRoOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgblRlbXAgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBpRW5kOyArK2kpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBuVGVtcCA9IG5QYXltZW50IC0gblByaW5jcGFsQW1vdW50ICogblJhdGVPZk1vbnRoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5TdW0gKz0gblRlbXA7DQotICAgICAgICAgICAgICAgICAgICAgICAgblByaW5jcGFsQW1vdW50IC09IG5UZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBuU3VtKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGb3VyKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRml2ZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJQUG10Iik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UFYoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGlmKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgICAgIEZYX0RPVUJMRSBuQW1vdW50ID0gMDsNCi0gICAgICAgIEZYX0RPVUJMRSBuUmF0ZSA9IDA7DQotICAgICAgICBGWF9ET1VCTEUgblBlcmlvZCA9IDA7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCi0gICAgICAgIGJGbGFncyA9IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpKTsNCi0gICAgICAgIGlmKGJGbGFncykgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbkFtb3VudCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpOw0KLSAgICAgICAgICAgIG5SYXRlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1R3byk7DQotICAgICAgICAgICAgblBlcmlvZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUaHJlZSk7DQotICAgICAgICAgICAgYkZsYWdzID0gKChuQW1vdW50IDw9IDApIHx8IChuUmF0ZSA8IDApIHx8IChuUGVyaW9kIDw9IDApKTsNCi0gICAgICAgICAgICBpZihiRmxhZ3MpIHsNCi0gICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBuVGVtcCA9IDE7DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5QZXJpb2Q7ICsraSkgew0KLSAgICAgICAgICAgICAgICAgICAgblRlbXAgKj0gMSArIG5SYXRlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG5UZW1wID0gMSAvIG5UZW1wOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBuQW1vdW50ICogKCgxIC0gblRlbXApIC8gblJhdGUpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIlBWIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UmF0ZShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAzKSB7DQotICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KLSAgICAgICAgRlhfRkxPQVQgbkZ1dHVyZSA9IDA7DQotICAgICAgICBGWF9GTE9BVCBuUHJlc2VudCA9IDA7DQotICAgICAgICBGWF9GTE9BVCBuVG90YWxOdW1iZXIgPSAwOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQotICAgICAgICBiRmxhZ3MgPSAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1RocmVlKSk7DQotICAgICAgICBpZihiRmxhZ3MpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG5GdXR1cmUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdPbmUpOw0KLSAgICAgICAgICAgIG5QcmVzZW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVHdvKTsNCi0gICAgICAgICAgICBuVG90YWxOdW1iZXIgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUaHJlZSk7DQotICAgICAgICAgICAgYkZsYWdzID0gKChuRnV0dXJlIDw9IDApIHx8IChuUHJlc2VudCA8IDApIHx8IChuVG90YWxOdW1iZXIgPD0gMCkpOw0KLSAgICAgICAgICAgIGlmKGJGbGFncykgew0KLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoRlhTWVNfcG93KChGWF9GTE9BVCkobkZ1dHVyZSAvIG5QcmVzZW50KSAsIChGWF9GTE9BVCkoMSAvIG5Ub3RhbE51bWJlcikpIC0gMSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiUmF0ZSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRlcm0oRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGlmKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgICAgIEZYX0ZMT0FUIG5Nb3VudCA9IDA7DQotICAgICAgICBGWF9GTE9BVCBuUmF0ZSA9IDA7DQotICAgICAgICBGWF9GTE9BVCBuRnV0dXJlID0gMDsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KLSAgICAgICAgYkZsYWdzID0gKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdUd28pIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdUaHJlZSkpOw0KLSAgICAgICAgaWYoYkZsYWdzKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBuTW91bnQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdPbmUpOw0KLSAgICAgICAgICAgIG5SYXRlID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVHdvKTsNCi0gICAgICAgICAgICBuRnV0dXJlID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KLSAgICAgICAgICAgIGJGbGFncyA9ICgobk1vdW50IDw9IDApIHx8IChuUmF0ZSA8PSAwKSB8fCAobkZ1dHVyZSA8PSAwKSk7DQotICAgICAgICAgICAgaWYoYkZsYWdzKSB7DQotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChhcmdzLkdldFJldHVyblZhbHVlKCksIChGWFNZU19sb2coKEZYX0ZMT0FUKShuRnV0dXJlIC8gbk1vdW50ICogblJhdGUpICsgMSkgLyBGWFNZU19sb2coKEZYX0ZMT0FUKSgxICsgblJhdGUpKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiVGVybSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkNob29zZShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KICAgICBpZiAoYXJnYyA+IDEpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KLSAgICAgICAgRlhfQk9PTCBhcmdPbmVJc051bGwgPSBGQUxTRTsNCi0gICAgICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgICAgIGFyZ09uZUlzTnVsbCA9IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKTsNCi0gICAgICAgIGlmICghYXJnT25lSXNOdWxsKSB7DQotICAgICAgICAgICAgaUluZGV4ID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgICAgIGlmIChhcmdPbmVJc051bGwpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2UgaWYgKGlJbmRleCA8IDEpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhfQk9PTCBiRm91bmQgPSBGQUxTRTsNCi0gICAgICAgICAgICBGWF9CT09MIGJTdG9wQ291bnRlckZsYWdzID0gRkFMU0U7DQotICAgICAgICAgICAgaW50MzJfdCBpQXJnSW5kZXggPSAxOw0KLSAgICAgICAgICAgIGludDMyX3QgaVZhbHVlSW5kZXggPSAwOw0KLSAgICAgICAgICAgIHdoaWxlKCFiRm91bmQgJiYgIWJTdG9wQ291bnRlckZsYWdzICYmIChpQXJnSW5kZXggPCBhcmdjKSkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgYXJnSW5kZXhWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoaUFyZ0luZGV4KTsNCi0gICAgICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnSW5kZXhWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ0luZGV4VmFsdWUsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlMZW5ndGggPiAzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BDb3VudGVyRmxhZ3MgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaVZhbHVlSW5kZXggKz0gKGlMZW5ndGggLSAyKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpVmFsdWVJbmRleCA+PSBpSW5kZXgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ0luZGV4VmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdJbmRleFZhbHVlLCAoKGlMZW5ndGggLSAxKSAtIChpVmFsdWVJbmRleCAtIGlJbmRleCkpLCBqc29iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcFN0cjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BTdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzb2JqZWN0VmFsdWUsIHByb3BTdHIsIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDaG9vc2VkOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhuZXdQcm9wZXJ0eSwgYnNDaG9vc2VkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYnNDaG9vc2VkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzb2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYkZvdW5kID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlWYWx1ZUluZGV4ICsrOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlWYWx1ZUluZGV4ID09IGlJbmRleCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzQ2hvb3NlZDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnSW5kZXhWYWx1ZSwgYnNDaG9vc2VkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYnNDaG9vc2VkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiRm91bmQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnSW5kZXhWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGlBcmdJbmRleCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIWJGb3VuZCkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIkNob29zZSIpOw0KKyAgICAgIGZvcm1hdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBmb3JtYXRWYWx1ZSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZSwgZm9ybWF0U3RyaW5nKTsNCisgICAgICB9DQogICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RXhpc3RzKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ09uZSkpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJFeGlzdHMiKTsNCisgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgIGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGxvY2FsVmFsdWUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZSwgbG9jYWxTdHJpbmcpOw0KKyAgICAgIH0NCiAgICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpIYXNWYWx1ZShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnT25lKSkgew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHZhbHVlU3RyOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmdPbmUsIHZhbHVlU3RyKTsNCi0gICAgICAgICAgICB2YWx1ZVN0ci5UcmltTGVmdCgpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoIXZhbHVlU3RyLklzRW1wdHkoKSkpOw0KLSAgICAgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc051bWJlcihhcmdPbmUpIHx8IEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihhcmdPbmUpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIFRSVUUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJIYXNWYWx1ZSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok9uZW9mKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmKGFyZ2MgPiAxKSB7DQotICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgKnBhcmFtZXRlcnNWYWx1ZSA9IDA7DQotICAgICAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgICAgICB1bmZvbGRBcmdzKGhUaGlzLCBhcmdzLCBwYXJhbWV0ZXJzVmFsdWUsIGlDb3VudCwgMSk7DQotICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICAgICAgaWYoc2ltcGxlVmFsdWVDb21wYXJlKGhUaGlzLCBhcmdPbmUsIHBhcmFtZXRlcnNWYWx1ZVtpXSkpIHsNCi0gICAgICAgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIGJGbGFncyk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocGFyYW1ldGVyc1ZhbHVlW2ldKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZyZWUocGFyYW1ldGVyc1ZhbHVlKTsNCi0gICAgICAgIHBhcmFtZXRlcnNWYWx1ZSA9IDA7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIk9uZW9mIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6V2l0aGluKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmKGFyZ2MgPT0gMykgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgYXJnTG93ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgYXJnSGVpZ2h0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCi0gICAgICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc051bWJlcihhcmdPbmUpKSB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG9uZU51bWJlciA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ09uZSk7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxvd051bWJlciA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ0xvdyk7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhlaWdodE51bWJlciA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ0hlaWdodCk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoKG9uZU51bWJlciA+PSBsb3dOdW1iZXIpICYmIChvbmVOdW1iZXIgPD0gaGVpZ2h0TnVtYmVyKSkgKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBvbmVTdHJpbmc7DQotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGxvd1N0cmluZzsNCi0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgaGVpZ2h0U3RyaW5nOw0KLSAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBvbmVTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnTG93LCBsb3dTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnSGVpZ2h0LCBoZWlnaHRTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKChvbmVTdHJpbmcuQ29tcGFyZShsb3dTdHJpbmcpID49IDApICYmIChvbmVTdHJpbmcuQ29tcGFyZShoZWlnaHRTdHJpbmcpIDw9IDApKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnTG93KTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0hlaWdodCk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIldpdGhpbiIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OklmKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDMpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdDb25kaXRpb24gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCi0gICAgICAgIEZYX0JPT0wgYkNvbmRpdGlvbiA9IEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihhcmdDb25kaXRpb24pOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYkNvbmRpdGlvbiA/IGFyZ0ZpcnN0VmFsdWUgOiBhcmdTZWNvbmRWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZFZhbHVlKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3RWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0NvbmRpdGlvbik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIklmIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RXZhbChGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgc2NyaXB0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdXRmOFNjcmlwdFN0cmluZzsNCi0gICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhzY3JpcHRWYWx1ZSwgdXRmOFNjcmlwdFN0cmluZyk7DQotICAgICAgICBpZiAodXRmOFNjcmlwdFN0cmluZy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENGWF9XaWRlVGV4dEJ1ZiB3c0phdmFTY3JpcHRCdWY7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgIGphdmFTY3JpcHQ7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFcnJvcjsNCi0gICAgICAgICAgICBYRkFfRk0ySlNfVHJhbnNsYXRlKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCh1dGY4U2NyaXB0U3RyaW5nLCB1dGY4U2NyaXB0U3RyaW5nLkdldExlbmd0aCgpKSwgd3NKYXZhU2NyaXB0QnVmLCB3c0Vycm9yKTsNCi0gICAgICAgICAgICBGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCA9IEZYSlNFX0NvbnRleHRfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgcmV0dXJuVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgIGphdmFTY3JpcHQgPSB3c0phdmFTY3JpcHRCdWYuR2V0V2lkZVN0cmluZygpOw0KLSAgICAgICAgICAgIEZYSlNFX0V4ZWN1dGVTY3JpcHQoaENvbnRleHQsIEZYX1VURjhFbmNvZGUoamF2YVNjcmlwdCwgamF2YVNjcmlwdC5HZXRMZW5ndGgoKSksIHJldHVyblZhbHVlKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXR1cm5WYWx1ZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShyZXR1cm5WYWx1ZSk7DQotICAgICAgICAgICAgRlhKU0VfQ29udGV4dF9SZWxlYXNlKGhDb250ZXh0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc2NyaXB0VmFsdWUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiRXZhbCIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlZihGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSByZ1ZhbHVlc1szXTsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgcmdWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKHJnVmFsdWVzWzBdLCA0KTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzFdKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzJdKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRBcnJheShhcmdzLkdldFJldHVyblZhbHVlKCksIDMsIHJnVmFsdWVzKTsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShyZ1ZhbHVlc1tpXSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnT25lLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChpTGVuZ3RoID49IDMpOw0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMiwganNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKGpzT2JqZWN0VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpICYmICghRlhKU0VfVmFsdWVfSXNOdWxsKGpzT2JqZWN0VmFsdWUpKSkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcmdWYWx1ZXNbM107DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgcmdWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIocmdWYWx1ZXNbMF0sIDMpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzFdKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHJnVmFsdWVzWzJdLCBqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAzLCByZ1ZhbHVlcyk7DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShyZ1ZhbHVlc1tpXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgIH0gZWxzZSBpZihGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdPbmUpKSB7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHJnVmFsdWVzWzNdOw0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgew0KLSAgICAgICAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIocmdWYWx1ZXNbMF0sIDMpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMV0pOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZ1ZhbHVlc1syXSwgYXJnT25lKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRBcnJheShhcmdzLkdldFJldHVyblZhbHVlKCksIDMsIHJnVmFsdWVzKTsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShyZ1ZhbHVlc1tpXSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmKEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihhcmdPbmUpIHx8IEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdPbmUpIHx8IEZYSlNFX1ZhbHVlX0lzTnVtYmVyKGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBhcmdPbmUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJSZWYiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpVbml0VHlwZShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgdW5pdHNwYW5WYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHVuaXRzcGFuVmFsdWUpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodW5pdHNwYW5WYWx1ZSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdW5pdHNwYW5TdHJpbmc7DQotICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcodW5pdHNwYW5WYWx1ZSwgdW5pdHNwYW5TdHJpbmcpOw0KLSAgICAgICAgaWYgKHVuaXRzcGFuU3RyaW5nLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiaW4iKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGVudW0gWEZBX0ZNMkpTX1ZBTFVFVFlQRV9QYXJzZXJTdGF0dXMgew0KLSAgICAgICAgICAgICAgICBWQUxVRVRZUEVfU1RBUlQsDQotICAgICAgICAgICAgICAgIFZBTFVFVFlQRV9IQVZFSU5WQUxJRENIQVIsDQotICAgICAgICAgICAgICAgIFZBTFVFVFlQRV9IQVZFRElHSVQsDQotICAgICAgICAgICAgICAgIFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSwNCi0gICAgICAgICAgICAgICAgVkFMVUVUWVBFX0lTQ00sDQotICAgICAgICAgICAgICAgIFZBTFVFVFlQRV9JU01NLA0KLSAgICAgICAgICAgICAgICBWQUxVRVRZUEVfSVNQVCwNCi0gICAgICAgICAgICAgICAgVkFMVUVUWVBFX0lTTVAsDQotICAgICAgICAgICAgICAgIFZBTFVFVFlQRV9JU0lOLA0KLSAgICAgICAgICAgIH07DQotICAgICAgICAgICAgdW5pdHNwYW5TdHJpbmcuTWFrZUxvd2VyKCk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHVuaXRzcGFuU3RyaW5nLCB1bml0c3BhblN0cmluZy5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBEYXRhID0gd3NUeXBlU3RyaW5nOw0KLSAgICAgICAgICAgIGludDMyX3QgdSA9IDA7DQotICAgICAgICAgICAgaW50MzJfdCB1TGVuID0gd3NUeXBlU3RyaW5nLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgIHdoaWxlICgqKHBEYXRhICsgdSkgPT0gMHgyMCB8fCAqKHBEYXRhICsgdSkgPT0gMHgwOSB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQiB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQyB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQSB8fCAqKHBEYXRhICsgdSkgPT0gMHgwRCkgew0KLSAgICAgICAgICAgICAgICB1Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFhGQV9GTTJKU19WQUxVRVRZUEVfUGFyc2VyU3RhdHVzIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfU1RBUlQ7DQotICAgICAgICAgICAgRlhfV0NIQVIgdHlwZUNoYXI7DQotICAgICAgICAgICAgd2hpbGUgKHUgPCB1TGVuKSB7DQotICAgICAgICAgICAgICAgIHR5cGVDaGFyID0gKihwRGF0YSArIHUpOw0KLSAgICAgICAgICAgICAgICBpZiAodHlwZUNoYXIgPT0gMHgyMCB8fCB0eXBlQ2hhciA9PSAweDA5IHx8IHR5cGVDaGFyID09IDB4MEIgfHwgdHlwZUNoYXIgPT0gMHgwQyB8fCB0eXBlQ2hhciA9PSAweDBBIHx8IHR5cGVDaGFyID09IDB4MEQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVCB8fCBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSEFWRURJR0lUV0hJVEU7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSVNJTjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodHlwZUNoYXIgPj0gJzAnICYmIHR5cGVDaGFyIDw9ICc5JykgfHwgdHlwZUNoYXIgPT0gJy0nIHx8IHR5cGVDaGFyID09ICcuJykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVFdISVRFKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9JU0lOOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0hBVkVESUdJVDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodHlwZUNoYXIgPT0gJ2MnIHx8IHR5cGVDaGFyID09ICdwJykgJiYgKHUgKyAxIDwgdUxlbikpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIG5leHRDaGFyID0gKihwRGF0YSArIHUgKyAxKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgoZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfU1RBUlQgfHwgZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfSEFWRURJR0lUIHx8IGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVFdISVRFKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dENoYXIgPiAnOScgfHwgbmV4dENoYXIgPCAnMCcpICYmIG5leHRDaGFyICE9ICcuJyAmJiBuZXh0Q2hhciAhPSAnLScgKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9ICh0eXBlQ2hhciA9PSAnYycpID8gVkFMVUVUWVBFX0lTQ00gOiBWQUxVRVRZUEVfSVNQVDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9IQVZFSU5WQUxJRENIQVI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNoYXIgPT0gJ20nICYmICh1ICsgMSA8IHVMZW4pKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBuZXh0Q2hhciA9ICoocERhdGEgKyB1ICsgMSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX1NUQVJUIHx8IGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVCB8fCBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRDaGFyID4gJzknIHx8IG5leHRDaGFyIDwgJzAnKSAmJiBuZXh0Q2hhciAhPSAnLicgJiYgbmV4dENoYXIgIT0gJy0nICkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSVNNTTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPT0gJ3AnIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUgKyA1IDwgdUxlbikgJiYgKihwRGF0YSArIHUgKyAxKSA9PSAnaScgJiYgKihwRGF0YSArIHUgKyAyKSA9PSAnbCcgJiYgKihwRGF0YSArIHUgKyAzKSA9PSAnbCcgJiYgKihwRGF0YSArIHUgKyA0KSA9PSAnaScgJiYgKihwRGF0YSArIHUgKyA1KSA9PSAncCcpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSVNNUDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0hBVkVJTlZBTElEQ0hBUjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB1Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHN3aXRjaCAoZVBhcnNlclN0YXR1cykgew0KLSAgICAgICAgICAgICAgICBjYXNlIFZBTFVFVFlQRV9JU0NNOg0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJjbSIpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIFZBTFVFVFlQRV9JU01NOg0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJtbSIpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIFZBTFVFVFlQRV9JU1BUOg0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJwdCIpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIFZBTFVFVFlQRV9JU01QOg0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJtcCIpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJpbiIpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodW5pdHNwYW5WYWx1ZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIlVuaXRUeXBlIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VW5pdFZhbHVlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmICgoYXJnYyA9PSAxKSB8fCAoYXJnYyA9PSAyKSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIHVuaXRzcGFuVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIHVuaXRWYWx1ZSA9IDA7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyB1bml0c3BhblN0cmluZzsNCi0gICAgICAgIEZYX0RPVUJMRSBkRmlyc3ROdW1iZXIgPSAwOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyRmlyc3RVbml0Ow0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyVW5pdDsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwodW5pdHNwYW5WYWx1ZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyh1bml0c3BhblZhbHVlLCB1bml0c3BhblN0cmluZyk7DQotICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcERhdGEgPSB1bml0c3BhblN0cmluZzsNCi0gICAgICAgICAgICBpZiAocERhdGEpIHsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCB1ID0gMDsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKCoocERhdGEgKyB1KSA9PSAweDIwIHx8ICoocERhdGEgKyB1KSA9PSAweDA5IHx8ICoocERhdGEgKyB1KSA9PSAweDBCIHx8ICoocERhdGEgKyB1KSA9PSAweDBDIHx8ICoocERhdGEgKyB1KSA9PSAweDBBIHx8ICoocERhdGEgKyB1KSA9PSAweDBEKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIGNoID0gKihwRGF0YSArIHUpOw0KLSAgICAgICAgICAgICAgICAgICAgKyt1Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGludDMyX3QgdVN0YXJ0ID0gdTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKHUgPCB1bml0c3BhblN0cmluZy5HZXRMZW5ndGgoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgqKHBEYXRhICsgdSkgPiAnOScgfHwgKihwRGF0YSArIHUpIDwgJzAnKSAmJiAqKHBEYXRhICsgdSkgIT0gJy4nICYmICoocERhdGEgKyB1KSAhPSAnLScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICsrdTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWF9DSEFSICogcFRlbXAgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBkRmlyc3ROdW1iZXIgPSBzdHJ0b2QocERhdGEsICZwVGVtcCk7DQotICAgICAgICAgICAgICAgIHdoaWxlICgqKHBEYXRhICsgdSkgPT0gJyAnIHx8ICoocERhdGEgKyB1KSA9PSAweDA5IHx8ICoocERhdGEgKyB1KSA9PSAweDBCIHx8ICoocERhdGEgKyB1KSA9PSAweDBDIHx8ICoocERhdGEgKyB1KSA9PSAweDBBIHx8ICoocERhdGEgKyB1KSA9PSAweDBEKSB7DQotICAgICAgICAgICAgICAgICAgICArK3U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaW50MzJfdCB1TGVuID0gdW5pdHNwYW5TdHJpbmcuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIHdoaWxlICh1IDwgdUxlbikgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCoocERhdGEgKyB1KSA9PSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHN0ckZpcnN0VW5pdCArPSAoKihwRGF0YSArIHUpKTsNCi0gICAgICAgICAgICAgICAgICAgICsrdTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBzdHJGaXJzdFVuaXQuTWFrZUxvd2VyKCk7DQotICAgICAgICAgICAgICAgIGlmIChhcmdjID09IDIpIHsNCi0gICAgICAgICAgICAgICAgICAgIHVuaXRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB1bml0VGVtcFN0cmluZzsNCi0gICAgICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyh1bml0VmFsdWUsIHVuaXRUZW1wU3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBEYXRhID0gdW5pdFRlbXBTdHJpbmc7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHUgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCoocERhdGEgKyB1KSA9PSAnICcgfHwgKihwRGF0YSArIHUpID09IDB4MDkgfHwgKihwRGF0YSArIHUpID09IDB4MEIgfHwgKihwRGF0YSArIHUpID09IDB4MEMgfHwgKihwRGF0YSArIHUpID09IDB4MEEgfHwgKihwRGF0YSArIHUpID09IDB4MEQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICArK3U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodSA8IHVuaXRUZW1wU3RyaW5nLkdldExlbmd0aCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqKHBEYXRhICsgdSkgPiAnOScgfHwgKihwRGF0YSArIHUpIDwgJzAnKSAmJiAqKHBEYXRhICsgdSkgIT0gJy4nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICArK3U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKihwRGF0YSArIHUpID09ICcgJyB8fCAqKHBEYXRhICsgdSkgPT0gMHgwOSB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQiB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQyB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQSB8fCAqKHBEYXRhICsgdSkgPT0gMHgwRCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrdTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgdUxlbiA9IHVuaXRUZW1wU3RyaW5nLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHUgPCB1TGVuKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCoocERhdGEgKyB1KSA9PSAnICcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0clVuaXQgKz0gKCoocERhdGEgKyB1KSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgKyt1Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgc3RyVW5pdC5NYWtlTG93ZXIoKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0clVuaXQgPSBzdHJGaXJzdFVuaXQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhfRE9VQkxFIGRSZXN1bHQgPSAwOw0KLSAgICAgICAgICAgICAgICBpZiAoc3RyRmlyc3RVbml0LkVxdWFsKCJpbiIpIHx8IHN0ckZpcnN0VW5pdC5FcXVhbCgiaW5jaGVzIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJVbml0LkVxdWFsKCJtbSIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpbWV0ZXJzIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyICogMjUuNDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgiY20iKSB8fCBzdHJVbml0LkVxdWFsKCJjZW50aW1ldGVycyIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAqIDIuNTQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoInB0IikgfHwgc3RyVW5pdC5FcXVhbCgicG9pbnRzIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzI7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoIm1wIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGlwb2ludHMiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MjAwMDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQuRXF1YWwoIm1tIikgfHwgc3RyRmlyc3RVbml0LkVxdWFsKCJtaWxsaW1ldGVycyIpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyVW5pdC5FcXVhbCgibW0iKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaW1ldGVycyIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgiY20iKSB8fCBzdHJVbml0LkVxdWFsKCJjZW50aW1ldGVycyIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDEwOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJwdCIpIHx8IHN0clVuaXQuRXF1YWwoInBvaW50cyIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDI1LjQgLyA3MjsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgibXAiKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaXBvaW50cyIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDI1LjQgLyA3MjAwMDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDI1LjQ7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRmlyc3RVbml0LkVxdWFsKCJjbSIpIHx8IHN0ckZpcnN0VW5pdC5FcXVhbCgiY2VudGltZXRlcnMiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0clVuaXQuRXF1YWwoIm1tIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGltZXRlcnMiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgKiAxMDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgiY20iKSB8fCBzdHJVbml0LkVxdWFsKCJjZW50aW1ldGVycyIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgicHQiKSB8fCBzdHJVbml0LkVxdWFsKCJwb2ludHMiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyAyLjU0IC8gNzI7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoIm1wIikgIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpcG9pbnRzIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMi41NCAvIDcyMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMi41NDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQuRXF1YWwoInB0IikgfHwgc3RyRmlyc3RVbml0LkVxdWFsKCJwb2ludHMiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0clVuaXQuRXF1YWwoIm1tIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGltZXRlcnMiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MiAqIDI1LjQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoImNtIikgfHwgc3RyVW5pdC5FcXVhbCgiY2VudGltZXRlcnMiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MiAqIDIuNTQ7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoInB0IikgfHwgc3RyVW5pdC5FcXVhbCgicG9pbnRzIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJtcCIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpcG9pbnRzIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyICogMTAwMDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckZpcnN0VW5pdC5FcXVhbCgibXAiKSB8fCBzdHJGaXJzdFVuaXQuRXF1YWwoIm1pbGxpcG9pbnRzIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJVbml0LkVxdWFsKCJtbSIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpbWV0ZXJzIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIwMDAgKiAyNS40Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJjbSIpIHx8IHN0clVuaXQuRXF1YWwoImNlbnRpbWV0ZXJzIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIwMDAgKiAyLjU0Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJwdCIpIHx8IHN0clVuaXQuRXF1YWwoInBvaW50cyIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDEwMDA7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoIm1wIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGlwb2ludHMiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXI7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MjAwMDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkUmVzdWx0KTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZSh1bml0c3BhblZhbHVlKTsNCi0gICAgICAgIGlmIChhcmdjID09IDIpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHVuaXRWYWx1ZSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIlVuaXRWYWx1ZSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQotICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyaW5nVHdvOw0KLSAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIHN0cmluZ1R3byk7DQotICAgICAgICAgICAgaWYgKHN0cmluZ1R3by5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDEpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cmluZ09uZTsNCi0gICAgICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc3RyaW5nT25lKTsNCi0gICAgICAgICAgICAgICAgRlhfU1RSU0laRSBpUG9zaXRpb24gPSBzdHJpbmdPbmUuRmluZChzdHJpbmdUd28pOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgaVBvc2l0aW9uICsgMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiQXQiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpDb25jYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPj0gMSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0U3RyaW5nOw0KLSAgICAgICAgRlhfQk9PTCBiQWxsTnVsbCA9IFRSVUU7DQotICAgICAgICBGWEpTRV9IVkFMVUUgKmFyZ1ZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgYXJnYyk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsNCi0gICAgICAgICAgICBhcmdWYWx1ZXNbaV0gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIGkpOw0KLSAgICAgICAgICAgIGlmKCFIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1ZhbHVlc1tpXSkpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdmFsdWVTdHI7DQotICAgICAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdWYWx1ZXNbaV0sIHZhbHVlU3RyKTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0U3RyaW5nICs9IHZhbHVlU3RyOw0KLSAgICAgICAgICAgICAgICBiQWxsTnVsbCA9IEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZXNbaV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRnJlZShhcmdWYWx1ZXMpOw0KLSAgICAgICAgaWYgKGJBbGxOdWxsKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgcmVzdWx0U3RyaW5nKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIkNvbmNhdCIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBpZihhcmdjID09IDEpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdG9EZWNvZGVTdHJpbmc7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgdG9EZWNvZGVTdHJpbmcpOw0KLSAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7DQotICAgICAgICAgICAgRGVjb2RlVVJMKHRvRGVjb2RlU3RyaW5nLCByZXN1bHRCdWYpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRCdWYuR2V0Qnl0ZVN0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgfSBlbHNlIGlmIChhcmdjID09IDIpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdG9EZWNvZGVTdHJpbmc7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgdG9EZWNvZGVTdHJpbmcpOw0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGlkZW50aWZ5U3RyaW5nOw0KLSAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIGlkZW50aWZ5U3RyaW5nKTsNCi0gICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0QnVmOw0KLSAgICAgICAgICAgIGlmIChpZGVudGlmeVN0cmluZy5FcXVhbE5vQ2FzZShGWF9CU1RSQygiaHRtbCIpKSkgew0KLSAgICAgICAgICAgICAgICBEZWNvZGVIVE1MKHRvRGVjb2RlU3RyaW5nLCByZXN1bHRCdWYpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpZnlTdHJpbmcuRXF1YWxOb0Nhc2UoRlhfQlNUUkMoInhtbCIpKSkgew0KLSAgICAgICAgICAgICAgICBEZWNvZGVYTUwodG9EZWNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgRGVjb2RlVVJMKHRvRGVjb2RlU3RyaW5nLCByZXN1bHRCdWYpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgcmVzdWx0QnVmLkdldEJ5dGVTdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJEZWNvZGUiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpEZWNvZGVVUkwgKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pVUkxTdHJpbmcsICBDRlhfQnl0ZVRleHRCdWYgJnN6UmVzdWx0U3RyaW5nKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NVUkxTdHJpbmcgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pVUkxTdHJpbmcuR2V0Q1N0cigpLCBzelVSTFN0cmluZy5HZXRMZW5ndGgoKSk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzVVJMU3RyaW5nOw0KLSAgICBpbnQzMl90IGlMZW4gPSB3c1VSTFN0cmluZy5HZXRMZW5ndGgoKTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgRlhfV0NIQVIgY2ggPSAwOw0KLSAgICBGWF9XQ0hBUiBjaFRlbXAgPSAwOw0KLSAgICBDRlhfV2lkZVRleHRCdWYgd3NSZXN1bHRCdWY7DQotICAgIHdoaWxlIChpIDwgaUxlbikgew0KLSAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQotICAgICAgICBpZiAoJyUnID09IGNoKSB7DQotICAgICAgICAgICAgY2hUZW1wID0gMDsNCi0gICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgICAgICAgICAgd2hpbGUgKGlDb3VudCA8IDIpIHsNCi0gICAgICAgICAgICAgICAgKytpOw0KLSAgICAgICAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCi0gICAgICAgICAgICAgICAgaWYgKGNoIDw9ICc5JyAmJiBjaCA+PSAnMCcpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghaUNvdW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2hUZW1wICs9IChjaCAtICcwJykgKiAxNjsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2hUZW1wICs9IChjaCAtICcwJyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaUNvdW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoVGVtcCArPSAoY2ggLSAnQScgKyAxMCkgKiAxNjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaFRlbXAgKz0gKGNoIC0gJ0EnICsgMTApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJ2YnICYmIGNoID49ICdhJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaUNvdW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoVGVtcCArPSAoY2ggLSAnYScgKyAxMCkgKiAxNjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaFRlbXAgKz0gKGNoIC0gJ2EnICsgMTApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYuQ2xlYXIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgKytpQ291bnQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2hUZW1wKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihjaCk7DQotICAgICAgICB9DQotICAgICAgICArK2k7DQotICAgIH0NCi0gICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCi0gICAgc3pSZXN1bHRTdHJpbmcgID0gRlhfVVRGOEVuY29kZSh3c1Jlc3VsdEJ1Zi5HZXRCdWZmZXIoKSwgd3NSZXN1bHRCdWYuR2V0TGVuZ3RoKCkpOw0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpEZWNvZGVIVE1MKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pIVE1MU3RyaW5nLCBDRlhfQnl0ZVRleHRCdWYgJnN6UmVzdWx0U3RyaW5nKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NIVE1MU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6SFRNTFN0cmluZy5HZXRDU3RyKCksIHN6SFRNTFN0cmluZy5HZXRMZW5ndGgoKSk7DQotICAgIEZYX1dDSEFSIHN0clN0cmluZ1s5XTsNCi0gICAgaW50MzJfdCBpU3RySW5kZXggPSAwOw0KLSAgICBpbnQzMl90IGlMZW4gPSB3c0hUTUxTdHJpbmcuR2V0TGVuZ3RoKCk7DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGludDMyX3QgaUNvZGUgPSAwOw0KLSAgICBGWF9XQ0hBUiBjaCA9IDA7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzSFRNTFN0cmluZzsNCi0gICAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOw0KLSAgICB3aGlsZSAoaSA8IGlMZW4pIHsNCi0gICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KLSAgICAgICAgaWYgKGNoID09ICcmJykgew0KLSAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCi0gICAgICAgICAgICBpZiAoY2ggPT0gJyMnKSB7DQotICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAneCcgfHwgY2ggPT0gJ1gnKSB7DQotICAgICAgICAgICAgICAgICAgICArK2k7DQotICAgICAgICAgICAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHx8IChjaCA8PSAnRicgJiYgY2ggPj0gJ0EnKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjaCAhPSAnOycgJiYgaSA8IGlMZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJzAnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJ2EnICsgMTA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvZGUgKz0gY2ggLSAnQScgKyAxMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkNsZWFyKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29kZSAqPSAxNjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlDb2RlIC89IDE2Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYuQ2xlYXIoKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHdoaWxlIChjaCAhPSAnOycgJiYgaSA8IGlMZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0clN0cmluZ1tpU3RySW5kZXgrK10gPSBjaDsNCi0gICAgICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHN0clN0cmluZ1tpU3RySW5kZXhdID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2gpOw0KLSAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHVpbnQzMl90IGlEYXRhID0gMDsNCi0gICAgICAgIGlmIChIVE1MU1RSMkNvZGUoc3RyU3RyaW5nLCBpRGF0YSkpIHsNCi0gICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKChGWF9XQ0hBUilpRGF0YSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoaUNvZGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaVN0ckluZGV4ID0gMDsNCi0gICAgICAgIHN0clN0cmluZ1tpU3RySW5kZXhdID0gMDsNCi0gICAgICAgICsraTsNCi0gICAgfQ0KLSAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOw0KLSAgICBzelJlc3VsdFN0cmluZyAgPSBGWF9VVEY4RW5jb2RlKHdzUmVzdWx0QnVmLkdldEJ1ZmZlcigpLCB3c1Jlc3VsdEJ1Zi5HZXRMZW5ndGgoKSk7DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZVhNTCAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelhNTFN0cmluZywgIENGWF9CeXRlVGV4dEJ1ZiAmc3pSZXN1bHRTdHJpbmcpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1hNTFN0cmluZyA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelhNTFN0cmluZy5HZXRDU3RyKCksIHN6WE1MU3RyaW5nLkdldExlbmd0aCgpKTsNCi0gICAgRlhfV0NIQVIgc3RyU3RyaW5nWzldOw0KLSAgICBpbnQzMl90IGlTdHJJbmRleCA9IDA7DQotICAgIGludDMyX3QgaUxlbiA9IHdzWE1MU3RyaW5nLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IGkgPSAwOw0KLSAgICBpbnQzMl90IGlDb2RlID0gMDsNCi0gICAgRlhfV0NIQVIgY2ggPSAwOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c1hNTFN0cmluZzsNCi0gICAgQ0ZYX1dpZGVUZXh0QnVmIHdzWE1MQnVmOw0KLSAgICB3aGlsZSAoaSA8IGlMZW4pIHsNCi0gICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KLSAgICAgICAgaWYgKGNoID09ICcmJykgew0KLSAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCi0gICAgICAgICAgICBpZiAoY2ggPT0gJyMnKSB7DQotICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAneCcgfHwgY2ggPT0gJ1gnKSB7DQotICAgICAgICAgICAgICAgICAgICArK2k7DQotICAgICAgICAgICAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHx8IChjaCA8PSAnRicgJiYgY2ggPj0gJ0EnKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjaCAhPSAnOycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJzAnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJ2EnICsgMTA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvZGUgKz0gY2ggLSAnQScgKyAxMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzWE1MQnVmLkNsZWFyKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29kZSAqPSAxNjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlDb2RlIC89IDE2Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgd3NYTUxCdWYuQ2xlYXIoKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHdoaWxlIChjaCAhPSAnOycgJiYgaSA8IGlMZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0clN0cmluZ1tpU3RySW5kZXgrK10gPSBjaDsNCi0gICAgICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHN0clN0cmluZ1tpU3RySW5kZXhdID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdzWE1MQnVmLkFwcGVuZENoYXIoY2gpOw0KLSAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNvbnN0IEZYX1dDSEFSKiBjb25zdCBzdHJOYW1lW10gPSB7DQotICAgICAgICAgICAgTCJxdW90IiwNCi0gICAgICAgICAgICBMImFtcCIsDQotICAgICAgICAgICAgTCJhcG9zIiwNCi0gICAgICAgICAgICBMImx0IiwNCi0gICAgICAgICAgICBMImd0Ig0KLSAgICAgICAgfTsNCi0gICAgICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgICAgIHdoaWxlIChpSW5kZXggPCA1KSB7DQotICAgICAgICAgICAgaWYgKEZYU1lTX21lbWNtcChzdHJTdHJpbmcsIHN0ck5hbWVbaUluZGV4XSwgRlhTWVNfd2NzbGVuKHN0ck5hbWVbaUluZGV4XSkpID09IDApIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICsraUluZGV4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgc3dpdGNoIChpSW5kZXgpIHsNCi0gICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgIHdzWE1MQnVmLkFwcGVuZENoYXIoJyInKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKCcmJyk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcignXCcnKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKCc8Jyk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcignPicpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKGlDb2RlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpU3RySW5kZXggPSAwOw0KLSAgICAgICAgc3RyU3RyaW5nW2lTdHJJbmRleF0gPSAwOw0KLSAgICAgICAgKytpOw0KLSAgICAgICAgaUNvZGUgPSAwOw0KLSAgICB9DQotICAgIHdzWE1MQnVmLkFwcGVuZENoYXIoMCk7DQotICAgIHN6UmVzdWx0U3RyaW5nICA9IEZYX1VURjhFbmNvZGUod3NYTUxCdWYuR2V0QnVmZmVyKCksIHdzWE1MQnVmLkdldExlbmd0aCgpKTsNCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RW5jb2RlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmKGFyZ2MgPT0gMSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB0b0VuY29kZVN0cmluZzsNCi0gICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCB0b0VuY29kZVN0cmluZyk7DQotICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdEJ1ZjsNCi0gICAgICAgICAgICBFbmNvZGVVUkwodG9FbmNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHJlc3VsdEJ1Zi5HZXRCeXRlU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICB9IGVsc2UgaWYgKGFyZ2MgPT0gMikgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB0b0VuY29kZVN0cmluZzsNCi0gICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCB0b0VuY29kZVN0cmluZyk7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgaWRlbnRpZnlTdHJpbmc7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3bywgaWRlbnRpZnlTdHJpbmcpOw0KLSAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7DQotICAgICAgICAgICAgaWYgKGlkZW50aWZ5U3RyaW5nLkVxdWFsTm9DYXNlKEZYX0JTVFJDKCJodG1sIikpKSB7DQotICAgICAgICAgICAgICAgIEVuY29kZUhUTUwodG9FbmNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChpZGVudGlmeVN0cmluZy5FcXVhbE5vQ2FzZShGWF9CU1RSQygieG1sIikpKSB7DQotICAgICAgICAgICAgICAgIEVuY29kZVhNTCh0b0VuY29kZVN0cmluZywgcmVzdWx0QnVmKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBFbmNvZGVVUkwodG9FbmNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRCdWYuR2V0Qnl0ZVN0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIkVuY29kZSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkVuY29kZVVSTCAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelVSTFN0cmluZywgIENGWF9CeXRlVGV4dEJ1ZiAmc3pSZXN1bHRCdWYpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1VSTFN0cmluZyA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelVSTFN0cmluZy5HZXRDU3RyKCksIHN6VVJMU3RyaW5nLkdldExlbmd0aCgpKTsNCi0gICAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOw0KLSAgICBGWF9XQ0hBUiBjaCA9IDA7DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHdzVVJMU3RyaW5nLkdldExlbmd0aCgpOw0KLSAgICBGWF9XQ0hBUiBzdHJFbmNvZGVbNF07DQotICAgIHN0ckVuY29kZVswXSA9ICclJzsNCi0gICAgc3RyRW5jb2RlWzNdID0gMDsNCi0gICAgRlhfV0NIQVIgc3RyVW5zYWZlW10gPSB7ICcgJywgJzwnLCAnPicsICciJywgJyMnLCAnJScsICd7JywgJ30nLCAnfCcsICdcXCcsICdeJywgJ34nLCAnWycsICddJywgJ2AnIH07DQotICAgIEZYX1dDSEFSIHN0clJlc2VydmVkW10gPSB7JzsnLCAnLycsICc/JywgJzonLCAnQCcsICc9JywgJyYnfTsNCi0gICAgRlhfV0NIQVIgc3RyU3BlY2lhbFtdID0geyckJywgJy0nLCAnKycsICchJywgJyonLCAnXCcnLCAnKCcsICcpJywgJywnfTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHN0ckNvZGUgPSBMIjAxMjM0NTY3ODlhYmNkZWYiOw0KLSAgICBmb3IgKGludDMyX3QgdSA9IDA7IHUgPCBpTGVuZ3RoOyArK3UpIHsNCi0gICAgICAgIGNoID0gd3NVUkxTdHJpbmcuR2V0QXQodSk7DQotICAgICAgICBpbnQzMl90IGkgPSAwOw0KLSAgICAgICAgaW50MzJfdCBpQ291bnQgPSBzaXplb2Yoc3RyVW5zYWZlKSAvIHNpemVvZihzdHJVbnNhZmVbMF0pOw0KLSAgICAgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsNCi0gICAgICAgICAgICBpZiAoY2ggPT0gc3RyVW5zYWZlW2ldKSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUluZGV4ID0gY2ggLyAxNjsNCi0gICAgICAgICAgICAgICAgc3RyRW5jb2RlWzFdID0gc3RyQ29kZVtpSW5kZXhdOw0KLSAgICAgICAgICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJDb2RlW2NoIC0gaUluZGV4ICogMTZdOw0KLSAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgKytpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGkgPCBpQ291bnQpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGkgPSAwOw0KLSAgICAgICAgaUNvdW50ID0gc2l6ZW9mKHN0clJlc2VydmVkKSAvIHNpemVvZihzdHJSZXNlcnZlZFswXSk7DQotICAgICAgICB3aGlsZSAoaSA8IGlDb3VudCkgew0KLSAgICAgICAgICAgIGlmIChjaCA9PSBzdHJSZXNlcnZlZFtpXSkgew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleCA9IGNoIC8gMTY7DQotICAgICAgICAgICAgICAgIHN0ckVuY29kZVsxXSA9IHN0ckNvZGVbaUluZGV4XTsNCi0gICAgICAgICAgICAgICAgc3RyRW5jb2RlWzJdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsNCi0gICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICsraTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpIDwgaUNvdW50KSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpID0gMDsNCi0gICAgICAgIGlDb3VudCA9IHNpemVvZihzdHJTcGVjaWFsKSAvIHNpemVvZihzdHJTcGVjaWFsWzBdKTsNCi0gICAgICAgIHdoaWxlIChpIDwgaUNvdW50KSB7DQotICAgICAgICAgICAgaWYgKGNoID09IHN0clNwZWNpYWxbaV0pIHsNCi0gICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihjaCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICArK2k7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaSA8IGlDb3VudCkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGNoID49IDB4ODAgJiYgY2ggPD0gMHhmZikgew0KLSAgICAgICAgICAgIGludDMyX3QgaUluZGV4ID0gY2ggLyAxNjsNCi0gICAgICAgICAgICBzdHJFbmNvZGVbMV0gPSBzdHJDb2RlW2lJbmRleF07DQotICAgICAgICAgICAgc3RyRW5jb2RlWzJdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsNCi0gICAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KLSAgICAgICAgfSBlbHNlIGlmICgoY2ggPj0gMHgwICYmIGNoIDw9IDB4MWYpIHx8IGNoID09IDB4N2YpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlJbmRleCA9IGNoIC8gMTY7DQotICAgICAgICAgICAgc3RyRW5jb2RlWzFdID0gc3RyQ29kZVtpSW5kZXhdOw0KLSAgICAgICAgICAgIHN0ckVuY29kZVsyXSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07DQotICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHgyMCAmJiBjaCA8PSAweDdlKSB7DQotICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihjaCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGludDMyX3QgaVJhZGl4ID0gMTY7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyVG1wOw0KLSAgICAgICAgICAgIHdoaWxlIChjaCA+PSBpUmFkaXgpIHsNCi0gICAgICAgICAgICAgICAgRlhfV0NIQVIgdG1wID0gc3RyQ29kZVtjaCAlIGlSYWRpeF07DQotICAgICAgICAgICAgICAgIGNoIC89IGlSYWRpeDsNCi0gICAgICAgICAgICAgICAgc3RyVG1wICs9IHRtcDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc3RyVG1wICs9IHN0ckNvZGVbY2hdOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxlbiA9IHN0clRtcC5HZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICBpZiAoaUxlbiA8IDIpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgICAgICAgICBpZiAoaUxlbiAlIDIgIT0gMCkgew0KLSAgICAgICAgICAgICAgICBzdHJFbmNvZGVbMV0gPSAnMCc7DQotICAgICAgICAgICAgICAgIHN0ckVuY29kZVsyXSA9IHN0clRtcC5HZXRBdChpTGVuIC0gMSk7DQotICAgICAgICAgICAgICAgIGlJbmRleCA9IGlMZW4gLSAyOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHN0ckVuY29kZVsxXSA9IHN0clRtcC5HZXRBdChpTGVuIC0gMSk7DQotICAgICAgICAgICAgICAgIHN0ckVuY29kZVsyXSA9IHN0clRtcC5HZXRBdChpTGVuIC0gMik7DQotICAgICAgICAgICAgICAgIGlJbmRleCA9IGlMZW4gLSAzOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KLSAgICAgICAgICAgIHdoaWxlIChpSW5kZXggPiAwKSB7DQotICAgICAgICAgICAgICAgIHN0ckVuY29kZVsxXSA9IHN0clRtcC5HZXRBdChpSW5kZXgpOw0KLSAgICAgICAgICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJUbXAuR2V0QXQoaUluZGV4IC0gMSk7DQotICAgICAgICAgICAgICAgIGlJbmRleCAtPSAyOw0KLSAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOw0KLSAgICBzelJlc3VsdEJ1ZiA9IEZYX1VURjhFbmNvZGUod3NSZXN1bHRCdWYuR2V0QnVmZmVyKCksIHdzUmVzdWx0QnVmLkdldExlbmd0aCgpKTsNCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RW5jb2RlSFRNTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6SFRNTFN0cmluZywgQ0ZYX0J5dGVUZXh0QnVmICZzelJlc3VsdEJ1ZikNCi17DQotICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHN6SFRNTFN0cmluZy5HZXRDU3RyKCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzSFRNTFN0cmluZyA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzdHIsIHN0ci5HZXRMZW5ndGgoKSk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBzdHJDb2RlID0gTCIwMTIzNDU2Nzg5YWJjZGVmIjsNCi0gICAgRlhfV0NIQVIgc3RyRW5jb2RlWzldOw0KLSAgICBzdHJFbmNvZGVbMF0gPSAnJic7DQotICAgIHN0ckVuY29kZVsxXSA9ICcjJzsNCi0gICAgc3RyRW5jb2RlWzJdID0gJ3gnOw0KLSAgICBzdHJFbmNvZGVbNV0gPSAnOyc7DQotICAgIHN0ckVuY29kZVs2XSA9IDA7DQotICAgIHN0ckVuY29kZVs3XSA9ICc7JzsNCi0gICAgc3RyRW5jb2RlWzhdID0gMDsNCi0gICAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOw0KLSAgICB1aW50MzJfdCBjaCA9IDA7DQotICAgIGludDMyX3QgaUxlbiA9IHdzSFRNTFN0cmluZy5HZXRMZW5ndGgoKTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBEYXRhID0gd3NIVE1MU3RyaW5nOw0KLSAgICBpbnQzMl90IGlJbmRleCA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nIGh0bWxSZXNlcnZlOw0KLSAgICB3aGlsZSAoaSA8IGlMZW4pIHsNCi0gICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KLSAgICAgICAgaHRtbFJlc2VydmUuRW1wdHkoKTsNCi0gICAgICAgIGlmIChIVE1MQ29kZTJTVFIoY2gsIGh0bWxSZXNlcnZlKSkgew0KLSAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoTCcmJyk7DQotICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgaHRtbFJlc2VydmU7DQotICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihMJzsnKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGNoID49IDMyICYmIGNoIDw9IDEyNikgew0KLSAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKChGWF9XQ0hBUiljaCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA8IDI1Nikgew0KLSAgICAgICAgICAgICAgICBpSW5kZXggPSBjaCAvIDE2Ow0KLSAgICAgICAgICAgICAgICBzdHJFbmNvZGVbM10gPSBzdHJDb2RlW2lJbmRleF07DQotICAgICAgICAgICAgICAgIHN0ckVuY29kZVs0XSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07DQotICAgICAgICAgICAgICAgIHN0ckVuY29kZVs1XSA9ICc7JzsNCi0gICAgICAgICAgICAgICAgc3RyRW5jb2RlWzZdID0gMDsNCi0gICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlCaWdCeXRlID0gY2ggLyAyNTY7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUxpdHRsZUJ5dGUgPSBjaCAlIDI1NjsNCi0gICAgICAgICAgICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpQmlnQnl0ZSAvIDE2XTsNCi0gICAgICAgICAgICAgICAgc3RyRW5jb2RlWzRdID0gc3RyQ29kZVtpQmlnQnl0ZSAlIDE2XTsNCi0gICAgICAgICAgICAgICAgc3RyRW5jb2RlWzVdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAvIDE2XTsNCi0gICAgICAgICAgICAgICAgc3RyRW5jb2RlWzZdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAlIDE2XTsNCi0gICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICArK2k7DQotICAgIH0NCi0gICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCi0gICAgc3pSZXN1bHRCdWYgID0gRlhfVVRGOEVuY29kZSh3c1Jlc3VsdEJ1Zi5HZXRCdWZmZXIoKSwgd3NSZXN1bHRCdWYuR2V0TGVuZ3RoKCkpOw0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpFbmNvZGVYTUwgKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pYTUxTdHJpbmcsICBDRlhfQnl0ZVRleHRCdWYgJnN6UmVzdWx0QnVmKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NYTUxTdHJpbmcgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pYTUxTdHJpbmcuR2V0Q1N0cigpLCBzelhNTFN0cmluZy5HZXRMZW5ndGgoKSk7DQotICAgIENGWF9XaWRlVGV4dEJ1ZiB3c1Jlc3VsdEJ1ZjsNCi0gICAgZW51bSB7DQotICAgICAgICBRVU9ULA0KLSAgICAgICAgQU1QLA0KLSAgICAgICAgQVBPUywNCi0gICAgICAgIExULA0KLSAgICAgICAgR1QsDQotICAgIH07DQotICAgIEZYX1dDSEFSIHN0ckVuY29kZVs5XTsNCi0gICAgc3RyRW5jb2RlWzBdID0gJyYnOw0KLSAgICBzdHJFbmNvZGVbMV0gPSAnIyc7DQotICAgIHN0ckVuY29kZVsyXSA9ICd4JzsNCi0gICAgc3RyRW5jb2RlWzVdID0gJzsnOw0KLSAgICBzdHJFbmNvZGVbNl0gPSAwOw0KLSAgICBzdHJFbmNvZGVbN10gPSAnOyc7DQotICAgIHN0ckVuY29kZVs4XSA9IDA7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBjb25zdCBzdHJOYW1lW10gPSB7DQotICAgICAgICBMInF1b3QiLA0KLSAgICAgICAgTCJhbXAiLA0KLSAgICAgICAgTCJhcG9zIiwNCi0gICAgICAgIEwibHQiLA0KLSAgICAgICAgTCJndCINCi0gICAgfTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHN0ckNvZGUgPSBMIjAxMjM0NTY3ODlhYmNkZWYiOw0KLSAgICBGWF9XQ0hBUiBjaCA9IDA7DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHdzWE1MU3RyaW5nLkdldExlbmd0aCgpOw0KLSAgICBpbnQzMl90IGlJbmRleCA9IDA7DQotICAgIGludDMyX3QgdSA9IDA7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzWE1MU3RyaW5nOw0KLSAgICBmb3IgKHUgPSAwOyB1IDwgaUxlbmd0aDsgKyt1KSB7DQotICAgICAgICBjaCA9ICoocERhdGEgKyB1KTsNCi0gICAgICAgIHN3aXRjaCAoY2gpIHsNCi0gICAgICAgICAgICBjYXNlICciJzoNCi0gICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignJicpOw0KLSAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBDRlhfV2lkZVN0cmluZ0Moc3RyTmFtZVtRVU9UXSk7DQotICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJzsnKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnJic6DQotICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsNCi0gICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgQ0ZYX1dpZGVTdHJpbmdDKHN0ck5hbWVbQU1QXSk7DQotICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJzsnKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAgJ1wnJzoNCi0gICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignJicpOw0KLSAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBDRlhfV2lkZVN0cmluZ0Moc3RyTmFtZVtBUE9TXSk7DQotICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJzsnKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAgJzwnOg0KLSAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcmJyk7DQotICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmIDw8IENGWF9XaWRlU3RyaW5nQyhzdHJOYW1lW0xUXSk7DQotICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJzsnKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnPic6DQotICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsNCi0gICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgQ0ZYX1dpZGVTdHJpbmdDKHN0ck5hbWVbR1RdKTsNCi0gICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignOycpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gMTI2KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihjaCk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoIDwgMjU2KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaUluZGV4ID0gY2ggLyAxNjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJFbmNvZGVbM10gPSBzdHJDb2RlW2lJbmRleF07DQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzRdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJFbmNvZGVbNV0gPSAnOyc7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzZdID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCaWdCeXRlID0gY2ggLyAyNTY7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGl0dGxlQnl0ZSA9IGNoICUgMjU2Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ckVuY29kZVszXSA9IHN0ckNvZGVbaUJpZ0J5dGUgLyAxNl07DQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyRW5jb2RlWzRdID0gc3RyQ29kZVtpQmlnQnl0ZSAlIDE2XTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJFbmNvZGVbNV0gPSBzdHJDb2RlW2lMaXR0bGVCeXRlIC8gMTZdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ckVuY29kZVs2XSA9IHN0ckNvZGVbaUxpdHRsZUJ5dGUgJSAxNl07DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOw0KLSAgICBzelJlc3VsdEJ1ZiA9IEZYX1VURjhFbmNvZGUod3NSZXN1bHRCdWYuR2V0QnVmZmVyKCksIHdzUmVzdWx0QnVmLkdldExlbmd0aCgpKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6SFRNTFNUUjJDb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcERhdGEsIHVpbnQzMl90ICZpQ29kZSkNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBEYXRhLkdldExlbmd0aCgpOw0KLSAgICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBEYXRhLkdldFB0cigpLCBpTGVuZ3RoKTsNCi0gICAgWEZBX0ZNSHRtbEhhc2hlZFJlc2VydmVDb2RlIGh0bWxoYXNoZWRyZXNlcnZlY29kZTsNCi0gICAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gKHNpemVvZihyZXNlcnZlc0ZvckRlY29kZSkgLyBzaXplb2YocmVzZXJ2ZXNGb3JEZWNvZGVbMF0pKSAtIDE7DQotICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgIGRvIHsNCi0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgaHRtbGhhc2hlZHJlc2VydmVjb2RlID0gcmVzZXJ2ZXNGb3JEZWNvZGVbaU1pZF07DQotICAgICAgICBpZiAodUhhc2ggPT0gaHRtbGhhc2hlZHJlc2VydmVjb2RlLm1fdUhhc2gpIHsNCi0gICAgICAgICAgICBpQ29kZSA9IGh0bWxoYXNoZWRyZXNlcnZlY29kZS5tX3VDb2RlOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfSBlbHNlIGlmICh1SGFzaCA8IGh0bWxoYXNoZWRyZXNlcnZlY29kZS5tX3VIYXNoKSB7DQotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkhUTUxDb2RlMlNUUih1aW50MzJfdCBpQ29kZSwgQ0ZYX1dpZGVTdHJpbmcgJndzSFRNTFJlc2VydmUpDQotew0KLSAgICBYRkFfRk1IdG1sUmVzZXJ2ZUNvZGUgaHRtbHJlc2VydmVjb2RlOw0KLSAgICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSAoc2l6ZW9mKHJlc2VydmVzRm9yRW5jb2RlKSAvIHNpemVvZihyZXNlcnZlc0ZvckVuY29kZVswXSkpIC0gMTsNCi0gICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCi0gICAgZG8gew0KLSAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICBodG1scmVzZXJ2ZWNvZGUgPSByZXNlcnZlc0ZvckVuY29kZVtpTWlkXTsNCi0gICAgICAgIGlmIChpQ29kZSA9PSBodG1scmVzZXJ2ZWNvZGUubV91Q29kZSkgew0KLSAgICAgICAgICAgIHdzSFRNTFJlc2VydmUgPSBodG1scmVzZXJ2ZWNvZGUubV9odG1sUmVzZXJ2ZTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0gZWxzZSBpZiAoaUNvZGUgPCBodG1scmVzZXJ2ZWNvZGUubV91Q29kZSkgew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1zdGF0aWMgRlhfQk9PTCBYRkFfUEFUVEVSTl9TVFJJTkdfVHlwZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UGF0dGVybiwgRlhfRFdPUkQmIHBhdHRlcm5UeXBlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXR0ZXJuID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6UGF0dGVybi5HZXRDU3RyKCksIHN6UGF0dGVybi5HZXRMZW5ndGgoKSk7DQotICAgIGlmIChGWF9XU1RSQyhMImRhdGV0aW1lIikgPT0gd3NQYXR0ZXJuLkxlZnQoOCkpIHsNCi0gICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0RBVEVUSU1FOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0gZWxzZSBpZiAoRlhfV1NUUkMoTCJkYXRlIikgPT0gd3NQYXR0ZXJuLkxlZnQoNCkpIHsNCi0gICAgICAgIHBhdHRlcm5UeXBlID0gd3NQYXR0ZXJuLkZpbmQoTCJ0aW1lIikgPiAwID8gWEZBX1ZUX0RBVEVUSU1FIDogWEZBX1ZUX0RBVEU7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfSBlbHNlIGlmIChGWF9XU1RSQyhMInRpbWUiKSA9PSB3c1BhdHRlcm4uTGVmdCg0KSkgew0KLSAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVElNRTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9IGVsc2UgaWYgKEZYX1dTVFJDKEwidGV4dCIpID09IHdzUGF0dGVybi5MZWZ0KDQpKSB7DQotICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9URVhUOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0gZWxzZSBpZiAoRlhfV1NUUkMoTCJudW0iKSA9PSB3c1BhdHRlcm4uTGVmdCgzKSkgew0KLSAgICAgICAgaWYgKEZYX1dTVFJDKEwiaW50ZWdlciIpID09IHdzUGF0dGVybi5NaWQoNCwgNykpIHsNCi0gICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9JTlRFR0VSOw0KLSAgICAgICAgfSBlbHNlIGlmIChGWF9XU1RSQyhMImRlY2ltYWwiKSA9PSB3c1BhdHRlcm4uTWlkKDQsIDcpKSB7DQotICAgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfREVDSU1BTDsNCi0gICAgICAgIH0gZWxzZSBpZiAoRlhfV1NUUkMoTCJjdXJyZW5jeSIpID09IHdzUGF0dGVybi5NaWQoNCwgOCkpIHsNCi0gICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsNCi0gICAgICAgIH0gZWxzZSBpZiAoRlhfV1NUUkMoTCJwZXJjZW50IikgPT0gd3NQYXR0ZXJuLk1pZCg0LCA3KSkgew0KLSAgICAgICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0ZMT0FUOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX05VTEw7DQotICAgIHdzUGF0dGVybi5NYWtlTG93ZXIoKTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHBEYXRhID0gd3NQYXR0ZXJuOw0KLSAgICBpbnQzMl90IGlMZW5ndGggPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7DQotICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgRlhfQk9PTCBiU2luZ2xlUXVvdGF0aW9uID0gRkFMU0U7DQotICAgIEZYX1dDSEFSIHBhdHRlcm5DaGFyOw0KLSAgICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KLSAgICAgICAgcGF0dGVybkNoYXIgPSAqKHBEYXRhICsgaUluZGV4KTsNCi0gICAgICAgIGlmIChwYXR0ZXJuQ2hhciA9PSAweDI3KSB7DQotICAgICAgICAgICAgYlNpbmdsZVF1b3RhdGlvbiA9ICFiU2luZ2xlUXVvdGF0aW9uOw0KLSAgICAgICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJiAocGF0dGVybkNoYXIgPT0gJ3knIHx8IHBhdHRlcm5DaGFyID09ICdqJykpIHsNCi0gICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9EQVRFOw0KLSAgICAgICAgICAgIGlJbmRleCsrOw0KLSAgICAgICAgICAgIEZYX1dDSEFSIHRpbWVQYXR0ZXJuQ2hhcjsNCi0gICAgICAgICAgICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICB0aW1lUGF0dGVybkNoYXIgPSAqKHBEYXRhICsgaUluZGV4KTsNCi0gICAgICAgICAgICAgICAgaWYgKHRpbWVQYXR0ZXJuQ2hhciA9PSAweDI3KSB7DQotICAgICAgICAgICAgICAgICAgICBiU2luZ2xlUXVvdGF0aW9uID0gIWJTaW5nbGVRdW90YXRpb247DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJTaW5nbGVRdW90YXRpb24gJiYgdGltZVBhdHRlcm5DaGFyID09ICd0Jykgew0KLSAgICAgICAgICAgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfREFURVRJTUU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpSW5kZXgrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9IGVsc2UgaWYgKCFiU2luZ2xlUXVvdGF0aW9uICYmIChwYXR0ZXJuQ2hhciA9PSAnaCcgfHwgcGF0dGVybkNoYXIgPT0gJ2snKSkgew0KLSAgICAgICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RJTUU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9IGVsc2UgaWYgKCFiU2luZ2xlUXVvdGF0aW9uICYmIChwYXR0ZXJuQ2hhciA9PSAnYScgfHwgcGF0dGVybkNoYXIgPT0gJ3gnIHx8IHBhdHRlcm5DaGFyID09ICdvJyB8fCBwYXR0ZXJuQ2hhciA9PSAnMCcpKSB7DQotICAgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVEVYVDsNCi0gICAgICAgICAgICBpZiAocGF0dGVybkNoYXIgPT0gJ3gnIHx8IHBhdHRlcm5DaGFyID09ICdvJyB8fCBwYXR0ZXJuQ2hhciA9PSAnMCcpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJiAocGF0dGVybkNoYXIgPT0gJ3onIHx8IHBhdHRlcm5DaGFyID09ICdzJyB8fCBwYXR0ZXJuQ2hhciA9PSAnZScgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5DaGFyID09ICd2JyB8fCBwYXR0ZXJuQ2hhciA9PSAnOCcgfHwgcGF0dGVybkNoYXIgPT0gJywnIHx8IHBhdHRlcm5DaGFyID09ICcuJyB8fCBwYXR0ZXJuQ2hhciA9PSAnJCcpKSB7DQotICAgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfRkxPQVQ7DQotICAgICAgICAgICAgaWYgKHBhdHRlcm5DaGFyID09ICd2JyB8fCBwYXR0ZXJuQ2hhciA9PSAnOCcgfHwgcGF0dGVybkNoYXIgPT0gJyQnICkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpSW5kZXgrKzsNCi0gICAgfQ0KLSAgICBpZiAocGF0dGVyblR5cGUgPT0gWEZBX1ZUX05VTEwpIHsNCi0gICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RFWFQgfCBYRkFfVlRfRkxPQVQ7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpGb3JtYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID49IDIpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzelBhdHRlcm47DQotICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBzelBhdHRlcm4pOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pWYWx1ZTsNCi0gICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIHN6VmFsdWUpOw0KLSAgICAgICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KLSAgICAgICAgSUZYX0xvY2FsZU1nciAqcE1nciA9IChJRlhfTG9jYWxlTWdyICopcERvYy0+R2V0TG9jYWxNZ3IoKTsNCisgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQorICAgICAgSUZYX0xvY2FsZU1nciogcE1nciA9IChJRlhfTG9jYWxlTWdyKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KKyAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgICAgIGlmIChsb2NhbFN0cmluZy5Jc0VtcHR5KCkpIHsNCiAgICAgICAgIENYRkFfT2JqZWN0KiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCiAgICAgICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCiAgICAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUqKXBUaGlzTm9kZSk7DQotICAgICAgICBJRlhfTG9jYWxlICpwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KLSAgICAgICAgRlhfRFdPUkQgcGF0dGVyblR5cGU7DQotICAgICAgICBGWF9CT09MIGJDb21wZWx0ZSA9IFhGQV9QQVRURVJOX1NUUklOR19UeXBlKHN6UGF0dGVybiwgcGF0dGVyblR5cGUpOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXR0ZXJuID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6UGF0dGVybiwgc3pQYXR0ZXJuLkdldExlbmd0aCgpKTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pWYWx1ZSwgc3pWYWx1ZS5HZXRMZW5ndGgoKSk7DQotICAgICAgICBpZiAoIWJDb21wZWx0ZSkgew0KLSAgICAgICAgICAgIHN3aXRjaCAocGF0dGVyblR5cGUpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIGlUQ2hhciA9IHdzUGF0dGVybi5GaW5kKEwnVCcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZVBhdHRlcm4gPSBGWF9XU1RSQyhMImRhdGV7Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NEYXRlUGF0dGVybiArPSB3c1BhdHRlcm4uTGVmdChpVENoYXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9ICIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGltZVBhdHRlcm4gPSBGWF9XU1RSQyhMInRpbWV7Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NUaW1lUGF0dGVybiArPSB3c1BhdHRlcm4uTWlkKGlUQ2hhciArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzVGltZVBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuID0gd3NEYXRlUGF0dGVybiArIHdzVGltZVBhdHRlcm47DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfREFURTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzUGF0dGVybiA9IEZYX1dTVFJDKEwiZGF0ZXsiKSArIHdzUGF0dGVybjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfVElNRTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzUGF0dGVybiA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzUGF0dGVybjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfVEVYVDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzUGF0dGVybiA9IEZYX1dTVFJDKEwidGV4dHsiKSArIHdzUGF0dGVybjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfRkxPQVQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMIm51bXsiKSArIHdzUGF0dGVybjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVzdFBhdHRlcm47DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NUZXN0UGF0dGVybiA9IEZYX1dTVFJDKEwibnVteyIpICsgd3NQYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzVGVzdFBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB0ZW1wTG9jYWxlVmFsdWUoWEZBX1ZUX0ZMT0FULCB3c1ZhbHVlLCB3c1Rlc3RQYXR0ZXJuLCBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IgKilwTWdyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcExvY2FsZVZhbHVlLklzVmFsaWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gPSB3c1Rlc3RQYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1Rlc3RQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0ZXh0eyIpICsgd3NQYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1Rlc3RQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gPSB3c1Rlc3RQYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9URVhUOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCisgICAgICAgIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoDQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGxvY2FsU3RyaW5nLCBsb2NhbFN0cmluZy5HZXRMZW5ndGgoKSkpOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCisgICAgICBpZiAoZm9ybWF0U3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdzRm9ybWF0ID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoZm9ybWF0U3RyaW5nLCBmb3JtYXRTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIH0NCisgICAgICB3c0Zvcm1hdCA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzRm9ybWF0Ow0KKyAgICAgIHdzRm9ybWF0ICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgIENYRkFfTG9jYWxlVmFsdWUgdGltZVZhbHVlKA0KKyAgICAgICAgICBYRkFfVlRfVElNRSwNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHRpbWVTdHJpbmcsIHRpbWVTdHJpbmcuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgICB3c0Zvcm1hdCwgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgICAgICBpZiAodGltZVZhbHVlLklzVmFsaWQoKSkgew0KKyAgICAgICAgQ0ZYX1VuaXRpbWUgdW5pVGltZSA9IHRpbWVWYWx1ZS5HZXRUaW1lKCk7DQorICAgICAgICBpbnQzMl90IGhvdXIgPSB1bmlUaW1lLkdldEhvdXIoKTsNCisgICAgICAgIGludDMyX3QgbWluID0gdW5pVGltZS5HZXRNaW51dGUoKTsNCisgICAgICAgIGludDMyX3Qgc2Vjb25kID0gdW5pVGltZS5HZXRTZWNvbmQoKTsNCisgICAgICAgIGludDMyX3QgbWlsU2Vjb25kID0gdW5pVGltZS5HZXRNaWxsaXNlY29uZCgpOw0KKyAgICAgICAgaW50MzJfdCBtaW5zID0gaG91ciAqIDYwICsgbWluOw0KKyAgICAgICAgSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBwUHJvdmlkZXIgPSBJWEZBX1RpbWVab25lUHJvdmlkZXI6OkdldCgpOw0KKyAgICAgICAgaWYgKHBQcm92aWRlciAhPSBOVUxMKSB7DQorICAgICAgICAgIEZYX1RJTUVaT05FIHR6Ow0KKyAgICAgICAgICBwUHJvdmlkZXItPkdldFRpbWVab25lKHR6KTsNCisgICAgICAgICAgbWlucyAtPSAodHoudHpIb3VyICogNjApOw0KKyAgICAgICAgICB3aGlsZSAobWlucyA+IDE0NDApIHsNCisgICAgICAgICAgICBtaW5zIC09IDE0NDA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgd2hpbGUgKG1pbnMgPCAwKSB7DQorICAgICAgICAgICAgbWlucyArPSAxNDQwOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGhvdXIgPSBtaW5zIC8gNjA7DQorICAgICAgICAgIG1pbiA9IG1pbnMgJSA2MDsNCiAgICAgICAgIH0NCi0gICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyICopcE1ncik7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1JldDsNCi0gICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Gb3JtYXRQYXR0ZXJucyh3c1JldCwgd3NQYXR0ZXJuLCBwTG9jYWxlLCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX1VURjhFbmNvZGUod3NSZXQsIHdzUmV0LkdldExlbmd0aCgpKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICAgICAgaW50MzJfdCBpUmVzdWx0ID0NCisgICAgICAgICAgICBob3VyICogMzYwMDAwMCArIG1pbiAqIDYwMDAwICsgc2Vjb25kICogMTAwMCArIG1pbFNlY29uZCArIDE7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgaVJlc3VsdCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAwKTsNCisgICAgICB9DQogICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJGb3JtYXQiKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQogICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZSh0aW1lVmFsdWUpOw0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGZvcm1hdFZhbHVlKTsNCisgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsVmFsdWUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiVGltZTJOdW0iKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TGVmdChGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgRlhfQk9PTCBhcmdJc051bGwgPSBGQUxTRTsNCi0gICAgICAgIGlmICgoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB8fCAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSkgew0KLSAgICAgICAgICAgIGFyZ0lzTnVsbCA9IFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYXJnSXNOdWxsKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmc7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc291cmNlU3RyaW5nKTsNCi0gICAgICAgICAgICBpbnQzMl90IGNvdW50ID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBhcmdUd28pOw0KLSAgICAgICAgICAgIGlmIChjb3VudCA8IDApIHsNCi0gICAgICAgICAgICAgICAgY291bnQgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc291cmNlU3RyaW5nLkxlZnQoY291bnQpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUaW1lRm10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPCAzKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIGludDMyX3QgaVN0eWxlID0gMDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pMb2NhbDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1N0eWxlID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0xvY2FsID0gMDsNCisgICAgaWYgKGFyZ2MgPiAwKSB7DQorICAgICAgYXJnU3R5bGUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU3R5bGUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpU3R5bGUgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdTdHlsZSk7DQorICAgICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkgew0KKyAgICAgICAgaVN0eWxlID0gMDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgIGFyZ0xvY2FsID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0xvY2FsKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0xvY2FsLCBzekxvY2FsKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBmb3JtYXRTdHI7DQorICAgICAgR2V0U3RhbmRhcmRUaW1lRm9ybWF0KGhUaGlzLCBpU3R5bGUsIHN6TG9jYWwsIGZvcm1hdFN0cik7DQorICAgICAgaWYgKGZvcm1hdFN0ci5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGZvcm1hdFN0ciA9IEZYX0JTVFJDKCIiKTsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIGZvcm1hdFN0cik7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJMZWZ0Iik7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KICAgICB9DQorICAgIGlmIChhcmdjID4gMCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU3R5bGUpOw0KKyAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnTG9jYWwpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiVGltZUZtdCIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMZW4oRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmc7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc291cmNlU3RyaW5nKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc291cmNlU3RyaW5nLkdldExlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpJc0lzb0RhdGVGb3JtYXQoY29uc3QgRlhfQ0hBUiogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRGF5KSB7DQorICBpWWVhciA9IDA7DQorICBpTW9udGggPSAxOw0KKyAgaURheSA9IDE7DQorICBGWF9CT09MIGlSZXQgPSBGQUxTRTsNCisgIGlmIChpTGVuZ3RoIDwgNCkgew0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgIEZYX0NIQVIgc3RyWWVhcls1XTsNCisgIHN0clllYXJbNF0gPSAnXDAnOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7DQorICAgIGlmICgqKHBEYXRhICsgaSkgPD0gJzknICYmICoocERhdGEgKyBpKSA+PSAnMCcpIHsNCisgICAgICBzdHJZZWFyW2ldID0gKihwRGF0YSArIGkpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiTGVuIik7DQorICAgICAgcmV0dXJuIGlSZXQ7DQogICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TG93ZXIoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCAzKSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYXJnU3RyaW5nOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgbG9jYWxlVmFsdWUgPSAwOw0KLSAgICAgICAgaWYoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZihhcmdjID09IDIpIHsNCi0gICAgICAgICAgICAgICAgbG9jYWxlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBhcmdTdHJpbmcpOw0KLSAgICAgICAgICAgIENGWF9XaWRlVGV4dEJ1ZiBsb3dTdHJpbmdCdWY7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBcmdTdHJpbmcgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYXJnU3RyaW5nLCBhcmdTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzQXJnU3RyaW5nOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxlbiA9IGFyZ1N0cmluZy5HZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICBpbnQzMl90IGkgPSAwOw0KLSAgICAgICAgICAgIGludDMyX3QgY2ggPSAwOw0KLSAgICAgICAgICAgIHdoaWxlIChpIDwgaUxlbikgew0KLSAgICAgICAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCi0gICAgICAgICAgICAgICAgaWYgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg1QSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2ggKz0gMzI7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHhDMCAmJiBjaCA8PSAweERFKSB7DQotICAgICAgICAgICAgICAgICAgICBjaCArPSAzMjsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAweDEwMCB8fCBjaCA9PSAweDEwMiB8fCBjaCA9PSAweDEwNCkgew0KLSAgICAgICAgICAgICAgICAgICAgY2ggKz0gMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBsb3dTdHJpbmdCdWYuQXBwZW5kQ2hhcihjaCk7DQotICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbG93U3RyaW5nQnVmLkFwcGVuZENoYXIoMCk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX1VURjhFbmNvZGUobG93U3RyaW5nQnVmLkdldEJ1ZmZlcigpLCBsb3dTdHJpbmdCdWYuR2V0TGVuZ3RoKCkpKTsNCi0gICAgICAgICAgICBpZihhcmdjID09IDIpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbGVWYWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfQ0KKyAgaVllYXIgPSBGWFNZU19hdG9pKHN0clllYXIpOw0KKyAgaVN0eWxlID0gMDsNCisgIGlmIChpTGVuZ3RoID4gNCkgew0KKyAgICBpZiAoKihwRGF0YSArIDQpID09ICctJykgew0KKyAgICAgIGlTdHlsZSA9IDE7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIkxvd2VyIik7DQorICAgICAgaVN0eWxlID0gMDsNCiAgICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMdHJpbShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNvdXJjZVN0cmluZzsNCi0gICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBzb3VyY2VTdHJpbmcpOw0KLSAgICAgICAgICAgIHNvdXJjZVN0cmluZy5UcmltTGVmdCgpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzb3VyY2VTdHJpbmcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgaVJldCA9IFRSVUU7DQorICAgIHJldHVybiBpUmV0Ow0KKyAgfQ0KKyAgRlhfQ0hBUiBzdHJUZW1wWzNdOw0KKyAgc3RyVGVtcFsyXSA9ICdcMCc7DQorICBpbnQzMl90IGlQb3NPZmYgPSAwOw0KKyAgaWYgKGlTdHlsZSA9PSAwKSB7DQorICAgIGlQb3NPZmYgPSA0Ow0KKyAgICBpZiAoaUxlbmd0aCA9PSA0KSB7DQorICAgICAgaVJldCA9IFRSVUU7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlQb3NPZmYgPSA1Ow0KKyAgICBpZiAoaUxlbmd0aCA9PSA0KSB7DQorICAgICAgaVJldCA9IFRSVUU7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgIH0NCisgIGlmICgoKihwRGF0YSArIGlQb3NPZmYpID4gJzknIHx8ICoocERhdGEgKyBpUG9zT2ZmKSA8ICcwJykgfHwNCisgICAgICAoKihwRGF0YSArIGlQb3NPZmYgKyAxKSA+ICc5JyB8fCAqKHBEYXRhICsgaVBvc09mZiArIDEpIDwgJzAnKSkgew0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgIHN0clRlbXBbMF0gPSAqKHBEYXRhICsgaVBvc09mZik7DQorICBzdHJUZW1wWzFdID0gKihwRGF0YSArIGlQb3NPZmYgKyAxKTsNCisgIGlNb250aCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICBpZiAoaU1vbnRoID4gMTIgfHwgaU1vbnRoIDwgMSkgew0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgIGlmIChpU3R5bGUgPT0gMCkgew0KKyAgICBpUG9zT2ZmICs9IDI7DQorICAgIGlmIChpTGVuZ3RoID09IDYpIHsNCisgICAgICBpUmV0ID0gMTsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaVBvc09mZiArPSAzOw0KKyAgICBpZiAoaUxlbmd0aCA9PSA3KSB7DQorICAgICAgaVJldCA9IDE7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgIH0NCisgIGlmICgoKihwRGF0YSArIGlQb3NPZmYpID4gJzknIHx8ICoocERhdGEgKyBpUG9zT2ZmKSA8ICcwJykgfHwNCisgICAgICAoKihwRGF0YSArIGlQb3NPZmYgKyAxKSA+ICc5JyB8fCAqKHBEYXRhICsgaVBvc09mZiArIDEpIDwgJzAnKSkgew0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgIHN0clRlbXBbMF0gPSAqKHBEYXRhICsgaVBvc09mZik7DQorICBzdHJUZW1wWzFdID0gKihwRGF0YSArIGlQb3NPZmYgKyAxKTsNCisgIGlEYXkgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgaWYgKGlQb3NPZmYgKyAyIDwgaUxlbmd0aCkgew0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgIGlmICgoIShpWWVhciAlIDQpICYmIChpWWVhciAlIDEwMCkpIHx8ICEoaVllYXIgJSA0MDApKSB7DQorICAgIGlmIChpTW9udGggPT0gMikgew0KKyAgICAgIGlmIChpRGF5ID4gMjkpIHsNCisgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgIH0NCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIkx0cmltIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UGFyc2UoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzelBhdHRlcm47DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc3pQYXR0ZXJuKTsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzelZhbHVlOw0KLSAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIHN6VmFsdWUpOw0KLSAgICAgICAgICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCi0gICAgICAgICAgICBJRlhfTG9jYWxlTWdyICpwTWdyID0gKElGWF9Mb2NhbGVNZ3IgKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KLSAgICAgICAgICAgIENYRkFfT2JqZWN0KiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQocFRoaXNOb2RlLT5Jc05vZGUoKSk7DQotICAgICAgICAgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEoKENYRkFfTm9kZSopcFRoaXNOb2RlKTsNCi0gICAgICAgICAgICBJRlhfTG9jYWxlICpwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KLSAgICAgICAgICAgIEZYX0RXT1JEIHBhdHRlcm5UeXBlOw0KLSAgICAgICAgICAgIEZYX0JPT0wgYkNvbXBsZXRlUGF0dGVybiA9IFhGQV9QQVRURVJOX1NUUklOR19UeXBlKHN6UGF0dGVybiwgcGF0dGVyblR5cGUpOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGF0dGVybiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelBhdHRlcm4sIHN6UGF0dGVybi5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelZhbHVlLCBzelZhbHVlLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzelBhcnNlZFZhbHVlOw0KLSAgICAgICAgICAgIGlmIChiQ29tcGxldGVQYXR0ZXJuKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyICopcE1ncik7DQotICAgICAgICAgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHN6UGFyc2VkVmFsdWUgPSBGWF9VVEY4RW5jb2RlKGxvY2FsZVZhbHVlLkdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHN6UGFyc2VkVmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCIiKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhdHRlcm5UeXBlKSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9WVF9EQVRFVElNRTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIGlUQ2hhciA9IHdzUGF0dGVybi5GaW5kKEwnVCcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGVQYXR0ZXJuID0gRlhfV1NUUkMoTCJkYXRleyIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RhdGVQYXR0ZXJuICs9IHdzUGF0dGVybi5MZWZ0KGlUQ2hhcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9ICIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWVQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0aW1leyIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1RpbWVQYXR0ZXJuICs9IHdzUGF0dGVybi5NaWQoaVRDaGFyICsgMSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVGltZVBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGF0dGVybiA9IHdzRGF0ZVBhdHRlcm4gKyB3c1RpbWVQYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKHBhdHRlcm5UeXBlLCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciAqKXBNZ3IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelBhcnNlZFZhbHVlID0gRlhfVVRGOEVuY29kZShsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzelBhcnNlZFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfREFURTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMImRhdGV7IikgKyB3c1BhdHRlcm47DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGF0dGVybiArPSBGWF9XU1RSQyhMIn0iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShwYXR0ZXJuVHlwZSwgd3NWYWx1ZSwgd3NQYXR0ZXJuLCBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IgKilwTWdyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZVZhbHVlLklzVmFsaWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pQYXJzZWRWYWx1ZSA9IEZYX1VURjhFbmNvZGUobG9jYWxlVmFsdWUuR2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc3pQYXJzZWRWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0aW1leyIpICsgd3NQYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyICopcE1ncik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UGFyc2VkVmFsdWUgPSBGWF9VVEY4RW5jb2RlKGxvY2FsZVZhbHVlLkdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHN6UGFyc2VkVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCIiKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9WVF9URVhUOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGF0dGVybiA9IEZYX1dTVFJDKEwidGV4dHsiKSArIHdzUGF0dGVybjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKFhGQV9WVF9URVhULCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciAqKXBNZ3IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelBhcnNlZFZhbHVlID0gRlhfVVRGOEVuY29kZShsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzelBhcnNlZFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfRkxPQVQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQYXR0ZXJuID0gRlhfV1NUUkMoTCJudW17IikgKyB3c1BhdHRlcm47DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGF0dGVybiArPSBGWF9XU1RSQyhMIn0iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShYRkFfVlRfRkxPQVQsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyICopcE1ncik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGxvY2FsZVZhbHVlLkdldERvdWJsZU51bSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1Rlc3RQYXR0ZXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1Rlc3RQYXR0ZXJuID0gRlhfV1NUUkMoTCJudW17IikgKyB3c1BhdHRlcm47DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVGVzdFBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUoWEZBX1ZUX0ZMT0FULCB3c1ZhbHVlLCB3c1Rlc3RQYXR0ZXJuLCBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IgKilwTWdyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZVZhbHVlLklzVmFsaWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgbG9jYWxlVmFsdWUuR2V0RG91YmxlTnVtKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NUZXN0UGF0dGVybiA9IEZYX1dTVFJDKEwidGV4dHsiKSArIHdzUGF0dGVybjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVGVzdFBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKFhGQV9WVF9URVhULCB3c1ZhbHVlLCB3c1Rlc3RQYXR0ZXJuLCBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IgKilwTWdyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelBhcnNlZFZhbHVlID0gRlhfVVRGOEVuY29kZShsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc3pQYXJzZWRWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KKyAgICAgIGlmIChpTW9udGggPCA4KSB7DQorICAgICAgICBpZiAoaURheSA+IChpTW9udGggJSAyID09IDAgPyAzMCA6IDMxKSkgew0KKyAgICAgICAgICByZXR1cm4gaVJldDsNCiAgICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIlBhcnNlIik7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChpRGF5ID4gKGlNb250aCAlIDIgPT0gMCA/IDMxIDogMzApKSB7DQorICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKGlNb250aCA9PSAyKSB7DQorICAgICAgaWYgKGlEYXkgPiAyOCkgew0KKyAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChpTW9udGggPCA4KSB7DQorICAgICAgICBpZiAoaURheSA+IChpTW9udGggJSAyID09IDAgPyAzMCA6IDMxKSkgew0KKyAgICAgICAgICByZXR1cm4gaVJldDsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGlEYXkgPiAoaU1vbnRoICUgMiA9PSAwID8gMzEgOiAzMCkpIHsNCisgICAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpUmV0ID0gVFJVRTsNCisgIHJldHVybiBpUmV0Ow0KIH0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSZXBsYWNlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmICgoYXJnYyA9PSAyKSB8fCAoYXJnYyA9PSAzKSkgew0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSAwOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgb25lU3RyaW5nOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdHdvU3RyaW5nOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdGhyZWVTdHJpbmc7DQotICAgICAgICBpZiAoKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgfHwgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSkpIHsNCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpJc0lzb1RpbWVGb3JtYXQoY29uc3QgRlhfQ0hBUiogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUhvdXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaW51dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTZWNvbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaWxsaVNlY29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVpvbmVIb3VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZU1pbnV0ZSkgew0KKyAgaUhvdXIgPSAwOw0KKyAgaU1pbnV0ZSA9IDA7DQorICBpU2Vjb25kID0gMDsNCisgIGlNaWxsaVNlY29uZCA9IDA7DQorICBpWm9uZUhvdXIgPSAwOw0KKyAgaVpvbmVNaW51dGUgPSAwOw0KKyAgaWYgKCFwRGF0YSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGlSZXQgPSBGQUxTRTsNCisgIEZYX0NIQVIgc3RyVGVtcFszXTsNCisgIHN0clRlbXBbMl0gPSAnXDAnOw0KKyAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgaW50MzJfdCBpWm9uZSA9IDA7DQorICBpbnQzMl90IGkgPSBpSW5kZXg7DQorICB3aGlsZSAoaSA8IGlMZW5ndGgpIHsNCisgICAgaWYgKCgqKHBEYXRhICsgaSkgPiAnOScgfHwgKihwRGF0YSArIGkpIDwgJzAnKSAmJiAqKHBEYXRhICsgaSkgIT0gJzonKSB7DQorICAgICAgaVpvbmUgPSBpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgICsraTsNCisgIH0NCisgIGlmIChpID09IGlMZW5ndGgpIHsNCisgICAgaVpvbmUgPSBpTGVuZ3RoOw0KKyAgfQ0KKyAgaW50MzJfdCBpUG9zID0gMDsNCisgIHdoaWxlIChpSW5kZXggPCBpWm9uZSkgew0KKyAgICBpZiAoaUluZGV4ID49IGlab25lKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKCoocERhdGEgKyBpSW5kZXgpID4gJzknIHx8ICoocERhdGEgKyBpSW5kZXgpIDwgJzAnKSB7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgc3RyVGVtcFswXSA9ICoocERhdGEgKyBpSW5kZXgpOw0KKyAgICBpZiAoKihwRGF0YSArIGlJbmRleCArIDEpID4gJzknIHx8ICoocERhdGEgKyBpSW5kZXggKyAxKSA8ICcwJykgew0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIHN0clRlbXBbMV0gPSAqKHBEYXRhICsgaUluZGV4ICsgMSk7DQorICAgIGlmIChGWFNZU19hdG9pKHN0clRlbXApID4gNjApIHsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBpZiAoKihwRGF0YSArIDIpID09ICc6Jykgew0KKyAgICAgIGlmIChpUG9zID09IDApIHsNCisgICAgICAgIGlIb3VyID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgICAgICsraVBvczsNCisgICAgICB9IGVsc2UgaWYgKGlQb3MgPT0gMSkgew0KKyAgICAgICAgaU1pbnV0ZSA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICAgICAgICArK2lQb3M7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlTZWNvbmQgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICAgIH0NCisgICAgICBpSW5kZXggKz0gMzsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoaVBvcyA9PSAwKSB7DQorICAgICAgICBpSG91ciA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICAgICAgICArK2lQb3M7DQorICAgICAgfSBlbHNlIGlmIChpUG9zID09IDEpIHsNCisgICAgICAgIGlNaW51dGUgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICAgICAgKytpUG9zOw0KKyAgICAgIH0gZWxzZSBpZiAoaVBvcyA9PSAyKSB7DQorICAgICAgICBpU2Vjb25kID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgICAgICsraVBvczsNCisgICAgICB9DQorICAgICAgaUluZGV4ICs9IDI7DQorICAgIH0NCisgIH0NCisgIGlmICgqKHBEYXRhICsgaUluZGV4KSA9PSAnLicpIHsNCisgICAgKytpSW5kZXg7DQorICAgIEZYX0NIQVIgc3RyVGVtcFs0XTsNCisgICAgc3RyVGVtcFszXSA9ICdcMCc7DQorICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSA+ICc5JyB8fCAqKHBEYXRhICsgaUluZGV4KSA8ICcwJykgew0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIHN0clRlbXBbMF0gPSAqKHBEYXRhICsgaUluZGV4KTsNCisgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA+ICc5JyB8fCAqKHBEYXRhICsgaUluZGV4ICsgMSkgPCAnMCcpIHsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBzdHJUZW1wWzFdID0gKihwRGF0YSArIGlJbmRleCArIDEpOw0KKyAgICBpZiAoKihwRGF0YSArIGlJbmRleCArIDIpID4gJzknIHx8ICoocERhdGEgKyBpSW5kZXggKyAyKSA8ICcwJykgew0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIHN0clRlbXBbMl0gPSAqKHBEYXRhICsgaUluZGV4ICsgMik7DQorICAgIGlNaWxsaVNlY29uZCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICAgIGlmIChpTWlsbGlTZWNvbmQgPiAxMDApIHsNCisgICAgICBpTWlsbGlTZWNvbmQgPSAwOw0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIGlJbmRleCArPSAzOw0KKyAgfQ0KKyAgaW50MzJfdCBpU2lnbiA9IDE7DQorICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJ3onIHx8ICoocERhdGEgKyBpSW5kZXgpID09ICdaJykgew0KKyAgICBpUmV0ID0gMTsNCisgICAgcmV0dXJuIGlSZXQ7DQorICB9IGVsc2UgaWYgKCoocERhdGEgKyBpSW5kZXgpID09ICcrJykgew0KKyAgICArK2lJbmRleDsNCisgIH0gZWxzZSBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJy0nKSB7DQorICAgIGlTaWduID0gLTE7DQorICAgICsraUluZGV4Ow0KKyAgfQ0KKyAgaVBvcyA9IDA7DQorICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICBpZiAoaUluZGV4ID49IGlMZW5ndGgpIHsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPiAnOScgfHwgKihwRGF0YSArIGlJbmRleCkgPCAnMCcpIHsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBzdHJUZW1wWzBdID0gKihwRGF0YSArIGlJbmRleCk7DQorICAgIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPiAnOScgfHwgKihwRGF0YSArIGlJbmRleCArIDEpIDwgJzAnKSB7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgc3RyVGVtcFsxXSA9ICoocERhdGEgKyBpSW5kZXggKyAxKTsNCisgICAgaWYgKEZYU1lTX2F0b2koc3RyVGVtcCkgPiA2MCkgew0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIGlmICgqKHBEYXRhICsgMikgPT0gJzonKSB7DQorICAgICAgaWYgKGlQb3MgPT0gMCkgew0KKyAgICAgICAgaVpvbmVIb3VyID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgICB9IGVsc2UgaWYgKGlQb3MgPT0gMSkgew0KKyAgICAgICAgaVpvbmVNaW51dGUgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICAgIH0NCisgICAgICBpSW5kZXggKz0gMzsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoIWlQb3MpIHsNCisgICAgICAgIGlab25lSG91ciA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICAgICAgICArK2lQb3M7DQorICAgICAgfSBlbHNlIGlmIChpUG9zID09IDEpIHsNCisgICAgICAgIGlab25lTWludXRlID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgICAgICsraVBvczsNCisgICAgICB9DQorICAgICAgaUluZGV4ICs9IDI7DQorICAgIH0NCisgIH0NCisgIGlmIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgIHJldHVybiBpUmV0Ow0KKyAgfQ0KKyAgaVpvbmVIb3VyICo9IGlTaWduOw0KKyAgaVJldCA9IFRSVUU7DQorICByZXR1cm4gaVJldDsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNJc29EYXRlVGltZUZvcm1hdChjb25zdCBGWF9DSEFSKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlIb3VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTZWNvbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWlsbGlvblNlY29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlab25lSG91ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlab25lTWludXRlKSB7DQorICBpWWVhciA9IDA7DQorICBpTW9udGggPSAwOw0KKyAgaURheSA9IDA7DQorICBpSG91ciA9IDA7DQorICBpTWludXRlID0gMDsNCisgIGlTZWNvbmQgPSAwOw0KKyAgaWYgKCFwRGF0YSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGlSZXQgPSBGQUxTRTsNCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIHdoaWxlICgqKHBEYXRhICsgaUluZGV4KSAhPSAnVCcgJiYgKihwRGF0YSArIGlJbmRleCkgIT0gJ3QnKSB7DQorICAgIGlmIChpSW5kZXggPj0gaUxlbmd0aCkgew0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgICsraUluZGV4Ow0KKyAgfQ0KKyAgaWYgKGlJbmRleCAhPSA4ICYmIGlJbmRleCAhPSAxMCkgew0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgIGludDMyX3QgaVN0eWxlID0gLTE7DQorICBpUmV0ID0gSXNJc29EYXRlRm9ybWF0KHBEYXRhLCBpSW5kZXgsIGlTdHlsZSwgaVllYXIsIGlNb250aCwgaURheSk7DQorICBpZiAoIWlSZXQpIHsNCisgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICBpZiAoKihwRGF0YSArIGlJbmRleCkgIT0gJ1QnICYmICoocERhdGEgKyBpSW5kZXgpICE9ICd0Jykgew0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgICsraUluZGV4Ow0KKyAgaWYgKCgoaUxlbmd0aCAtIGlJbmRleCA+IDEzKSAmJiAoaUxlbmd0aCAtIGlJbmRleCA8IDYpKSAmJg0KKyAgICAgIChpTGVuZ3RoIC0gaUluZGV4ICE9IDE1KSkgew0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgIGlSZXQgPSBJc0lzb1RpbWVGb3JtYXQocERhdGEgKyBpSW5kZXgsIGlMZW5ndGggLSBpSW5kZXgsIGlIb3VyLCBpTWludXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpU2Vjb25kLCBpTWlsbGlvblNlY29uZCwgaVpvbmVIb3VyLCBpWm9uZU1pbnV0ZSk7DQorICBpZiAoIWlSZXQpIHsNCisgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICBpUmV0ID0gVFJVRTsNCisgIHJldHVybiBpUmV0Ow0KK30NCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpMb2NhbDJJc29EYXRlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0cklzb0RhdGUpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQorICBpZiAoIXBEb2MpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSUZYX0xvY2FsZU1nciogcE1nciA9IChJRlhfTG9jYWxlTWdyKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQorICBpZiAoc3pMb2NhbGUuSXNFbXB0eSgpKSB7DQorICAgIENYRkFfT2JqZWN0KiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBUaGlzTm9kZS0+SXNOb2RlKCkpOw0KKyAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YSgoQ1hGQV9Ob2RlKilwVGhpc05vZGUpOw0KKyAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KKyAgfSBlbHNlIHsNCisgICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZSgNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekxvY2FsZS5HZXRDU3RyKCksIHN6TG9jYWxlLkdldExlbmd0aCgpKSk7DQorICB9DQorICBpZiAoIXBMb2NhbGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQorICBpZiAoc3pGb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdCwgd3NGb3JtYXQpOw0KKyAgfSBlbHNlIHsNCisgICAgd3NGb3JtYXQgPQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6Rm9ybWF0LkdldENTdHIoKSwgc3pGb3JtYXQuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSgNCisgICAgICBYRkFfVlRfREFURSwNCisgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pEYXRlLkdldENTdHIoKSwgc3pEYXRlLkdldExlbmd0aCgpKSwgd3NGb3JtYXQsDQorICAgICAgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgIENGWF9Vbml0aW1lIGR0ID0gd2lkZ2V0VmFsdWUuR2V0RGF0ZSgpOw0KKyAgc3RySXNvRGF0ZS5Gb3JtYXQoIiU0ZC0lMDJkLSUwMmQiLCBkdC5HZXRZZWFyKCksIGR0LkdldE1vbnRoKCksIGR0LkdldERheSgpKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpMb2NhbDJJc29UaW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0cklzb1RpbWUpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQorICBpZiAoIXBEb2MpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSUZYX0xvY2FsZU1nciogcE1nciA9IChJRlhfTG9jYWxlTWdyKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQorICBpZiAoc3pMb2NhbGUuSXNFbXB0eSgpKSB7DQorICAgIENYRkFfT2JqZWN0KiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBUaGlzTm9kZS0+SXNOb2RlKCkpOw0KKyAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YSgoQ1hGQV9Ob2RlKilwVGhpc05vZGUpOw0KKyAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KKyAgfSBlbHNlIHsNCisgICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZSgNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekxvY2FsZS5HZXRDU3RyKCksIHN6TG9jYWxlLkdldExlbmd0aCgpKSk7DQorICB9DQorICBpZiAoIXBMb2NhbGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQorICBpZiAoc3pGb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdCwgd3NGb3JtYXQpOw0KKyAgfSBlbHNlIHsNCisgICAgd3NGb3JtYXQgPQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6Rm9ybWF0LkdldENTdHIoKSwgc3pGb3JtYXQuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgd3NGb3JtYXQgPSBGWF9XU1RSQyhMInRpbWV7IikgKyB3c0Zvcm1hdDsNCisgIHdzRm9ybWF0ICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSgNCisgICAgICBYRkFfVlRfVElNRSwNCisgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pUaW1lLkdldENTdHIoKSwgc3pUaW1lLkdldExlbmd0aCgpKSwgd3NGb3JtYXQsDQorICAgICAgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgIENGWF9Vbml0aW1lIHV0aW1lID0gd2lkZ2V0VmFsdWUuR2V0VGltZSgpOw0KKyAgc3RySXNvVGltZS5Gb3JtYXQoIiUwMmQ6JTAyZDolMDJkLiUwM2QiLCB1dGltZS5HZXRIb3VyKCksIHV0aW1lLkdldE1pbnV0ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgdXRpbWUuR2V0U2Vjb25kKCksIHV0aW1lLkdldE1pbGxpc2Vjb25kKCkpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6Oklzb0RhdGUyTG9jYWwoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyTG9jYWxEYXRlKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgaWYgKCFwRG9jKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElGWF9Mb2NhbGVNZ3IqIHBNZ3IgPSAoSUZYX0xvY2FsZU1nciopcERvYy0+R2V0TG9jYWxNZ3IoKTsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgew0KKyAgICBDWEZBX09iamVjdCogcFRoaXNOb2RlID0gcERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCk7DQorICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCisgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEoKENYRkFfTm9kZSopcFRoaXNOb2RlKTsNCisgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCisgIH0gZWxzZSB7DQorICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbGUuR2V0Q1N0cigpLCBzekxvY2FsZS5HZXRMZW5ndGgoKSkpOw0KKyAgfQ0KKyAgaWYgKCFwTG9jYWxlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KKyAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkgew0KKyAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsIHdzRm9ybWF0KTsNCisgIH0gZWxzZSB7DQorICAgIHdzRm9ybWF0ID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekZvcm1hdC5HZXRDU3RyKCksIHN6Rm9ybWF0LkdldExlbmd0aCgpKTsNCisgIH0NCisgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoDQorICAgICAgWEZBX1ZUX0RBVEUsDQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6RGF0ZS5HZXRDU3RyKCksIHN6RGF0ZS5HZXRMZW5ndGgoKSksDQorICAgICAgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzUmV0Ow0KKyAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NSZXQsIHdzRm9ybWF0LCBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCisgIHN0ckxvY2FsRGF0ZSA9IEZYX1VURjhFbmNvZGUod3NSZXQsIHdzUmV0LkdldExlbmd0aCgpKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpJc29UaW1lMkxvY2FsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckxvY2FsVGltZSkgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgIGlmICghcERvYykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRlhfTG9jYWxlTWdyKiBwTWdyID0gKElGWF9Mb2NhbGVNZ3IqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgIGlmIChzekxvY2FsZS5Jc0VtcHR5KCkpIHsNCisgICAgQ1hGQV9PYmplY3QqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICBGWFNZU19hc3NlcnQocFRoaXNOb2RlLT5Jc05vZGUoKSk7DQorICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUqKXBUaGlzTm9kZSk7DQorICAgIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7DQorICB9IGVsc2Ugew0KKyAgICBwTG9jYWxlID0gcE1nci0+R2V0TG9jYWxlQnlOYW1lKA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlLkdldENTdHIoKSwgc3pMb2NhbGUuR2V0TGVuZ3RoKCkpKTsNCisgIH0NCisgIGlmICghcExvY2FsZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCisgIGlmIChzekZvcm1hdC5Jc0VtcHR5KCkpIHsNCisgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQorICB9IGVsc2Ugew0KKyAgICB3c0Zvcm1hdCA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pGb3JtYXQuR2V0Q1N0cigpLCBzekZvcm1hdC5HZXRMZW5ndGgoKSk7DQorICB9DQorICB3c0Zvcm1hdCA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzRm9ybWF0Ow0KKyAgd3NGb3JtYXQgKz0gRlhfV1NUUkMoTCJ9Iik7DQorICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlKA0KKyAgICAgIFhGQV9WVF9USU1FLA0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelRpbWUuR2V0Q1N0cigpLCBzelRpbWUuR2V0TGVuZ3RoKCkpLA0KKyAgICAgIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICBDRlhfV2lkZVN0cmluZyB3c1JldDsNCisgIHdpZGdldFZhbHVlLkZvcm1hdFBhdHRlcm5zKHdzUmV0LCB3c0Zvcm1hdCwgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICBzdHJMb2NhbFRpbWUgPSBGWF9VVEY4RW5jb2RlKHdzUmV0LCB3c1JldC5HZXRMZW5ndGgoKSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0R01UVGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJHTVRUaW1lKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgaWYgKCFwRG9jKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElGWF9Mb2NhbGVNZ3IqIHBNZ3IgPSAoSUZYX0xvY2FsZU1nciopcERvYy0+R2V0TG9jYWxNZ3IoKTsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgew0KKyAgICBDWEZBX09iamVjdCogcFRoaXNOb2RlID0gcERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCk7DQorICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCisgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEoKENYRkFfTm9kZSopcFRoaXNOb2RlKTsNCisgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCisgIH0gZWxzZSB7DQorICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbGUuR2V0Q1N0cigpLCBzekxvY2FsZS5HZXRMZW5ndGgoKSkpOw0KKyAgfQ0KKyAgaWYgKCFwTG9jYWxlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KKyAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkgew0KKyAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsIHdzRm9ybWF0KTsNCisgIH0gZWxzZSB7DQorICAgIHdzRm9ybWF0ID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekZvcm1hdC5HZXRDU3RyKCksIHN6Rm9ybWF0LkdldExlbmd0aCgpKTsNCisgIH0NCisgIHdzRm9ybWF0ID0gRlhfV1NUUkMoTCJ0aW1leyIpICsgd3NGb3JtYXQ7DQorICB3c0Zvcm1hdCArPSBGWF9XU1RSQyhMIn0iKTsNCisgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoDQorICAgICAgWEZBX1ZUX1RJTUUsDQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VGltZS5HZXRDU3RyKCksIHN6VGltZS5HZXRMZW5ndGgoKSksDQorICAgICAgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzUmV0Ow0KKyAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NSZXQsIHdzRm9ybWF0LCBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCisgIHN0ckdNVFRpbWUgPSBGWF9VVEY4RW5jb2RlKHdzUmV0LCB3c1JldC5HZXRMZW5ndGgoKSk7DQorICByZXR1cm4gVFJVRTsNCit9DQoraW50MzJfdCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZVN0cmluZzJOdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGVTdHJpbmcpIHsNCisgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICBpbnQzMl90IGlMZW5ndGggPSBzekRhdGVTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICBGWF9CT09MIGlSZXQgPSBGQUxTRTsNCisgIGludDMyX3QgaVN0eWxlID0gLTE7DQorICBpbnQzMl90IGlZZWFyID0gMDsNCisgIGludDMyX3QgaU1vbnRoID0gMDsNCisgIGludDMyX3QgaURheSA9IDA7DQorICBpbnQzMl90IGlIb3VyID0gMDsNCisgIGludDMyX3QgaU1pbnV0ZSA9IDA7DQorICBpbnQzMl90IGlTZWNvbmQgPSAwOw0KKyAgaW50MzJfdCBpTWlsbGlvblNlY29uZCA9IDA7DQorICBpbnQzMl90IGlab25lSG91ciA9IDA7DQorICBpbnQzMl90IGlab25lTWludXRlID0gMDsNCisgIGlmIChpTGVuZ3RoIDw9IDEwKSB7DQorICAgIGlSZXQgPSBJc0lzb0RhdGVGb3JtYXQoc3pEYXRlU3RyaW5nLkdldENTdHIoKSwgaUxlbmd0aCwgaVN0eWxlLCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpTW9udGgsIGlEYXkpOw0KKyAgfSBlbHNlIHsNCisgICAgaVJldCA9IElzSXNvRGF0ZVRpbWVGb3JtYXQoc3pEYXRlU3RyaW5nLkdldENTdHIoKSwgaUxlbmd0aCwgaVllYXIsIGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaURheSwgaUhvdXIsIGlNaW51dGUsIGlTZWNvbmQsIGlNaWxsaW9uU2Vjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpWm9uZUhvdXIsIGlab25lTWludXRlKTsNCisgIH0NCisgIGlmICghaVJldCkgew0KKyAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZERheXMgPSAwOw0KKyAgaW50MzJfdCBpID0gMTsNCisgIGlmIChpWWVhciA8IDE5MDApIHsNCisgICAgYkZsYWdzID0gVFJVRTsNCisgIH0NCisgIGlmICghYkZsYWdzKSB7DQorICAgIHdoaWxlIChpWWVhciAtIGkgPj0gMTkwMCkgew0KKyAgICAgIGlmICgoISgoaVllYXIgLSBpKSAlIDQpICYmICgoaVllYXIgLSBpKSAlIDEwMCkpIHx8ICEoKGlZZWFyIC0gaSkgJSA0MDApKSB7DQorICAgICAgICBkRGF5cyArPSAzNjY7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGREYXlzICs9IDM2NTsNCisgICAgICB9DQorICAgICAgKytpOw0KKyAgICB9DQorICAgIGkgPSAxOw0KKyAgICB3aGlsZSAoaSA8IGlNb250aCkgew0KKyAgICAgIGlmIChpID09IDIpIHsNCisgICAgICAgIGlmICgoIShpWWVhciAlIDQpICYmIChpWWVhciAlIDEwMCkpIHx8ICEoaVllYXIgJSA0MDApKSB7DQorICAgICAgICAgIGREYXlzICs9IDI5Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZERheXMgKz0gMjg7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmIChpIDw9IDcpIHsNCisgICAgICAgIGlmIChpICUgMiA9PSAwKSB7DQorICAgICAgICAgIGREYXlzICs9IDMwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZERheXMgKz0gMzE7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChpICUgMiA9PSAwKSB7DQorICAgICAgICAgIGREYXlzICs9IDMxOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZERheXMgKz0gMzA7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgICsraTsNCisgICAgfQ0KKyAgICBpID0gMDsNCisgICAgd2hpbGUgKGlEYXkgLSBpID4gMCkgew0KKyAgICAgIGREYXlzICs9IDE7DQorICAgICAgKytpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBkRGF5cyA9IDA7DQorICB9DQorICByZXR1cm4gKGludDMyX3QpZERheXM7DQorfQ0KKyNkZWZpbmUgWEZBX04gMTkNCitzdGF0aWMgdWludDhfdCBnX3NBbHRUYWJsZV9EYXRlW10gPSB7DQorICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIDMsICAgICA5LCAgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCisgICAgWEZBX04sIDIsICAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICBYRkFfTiwgWEZBX04sIDEsICAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCisgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KK307DQorc3RhdGljIHVpbnQ4X3QgZ19zQWx0VGFibGVfVGltZVtdID0gew0KKyAgICAxNCwgICAgWEZBX04sIFhGQV9OLCAzLCAgICAgOSwgICAgIFhGQV9OLCBYRkFfTiwgMTUsICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorICAgIFhGQV9OLCA2LCAgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCA3LCAgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwNCisgICAgWEZBX04sIFhGQV9OLCAxLCAgICAgMTcsICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCAxNSwgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCisgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCit9Ow0KK3N0YXRpYyB2b2lkIFhGQV9GTV9BbHRlcm5hdGVEYXRlVGltZVN5bWJvbHMoQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0FsdFN5bWJvbHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwQWx0VGFibGUpIHsNCisgIGludDMyX3Qgbkxlbmd0aCA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgIEZYX0JPT0wgYkluQ29uc3RSYW5nZSA9IEZBTFNFOw0KKyAgRlhfQk9PTCBiRXNjYXBlID0gRkFMU0U7DQorICBpbnQzMl90IGkgPSAwLCBuID0gMDsNCisgIHdoaWxlIChpIDwgbkxlbmd0aCkgew0KKyAgICBGWF9XQ0hBUiB3YyA9IHdzUGF0dGVybltpXTsNCisgICAgaWYgKHdjID09IEwnXCcnKSB7DQorICAgICAgYkluQ29uc3RSYW5nZSA9ICFiSW5Db25zdFJhbmdlOw0KKyAgICAgIGlmIChiRXNjYXBlKSB7DQorICAgICAgICBpKys7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdzUGF0dGVybi5EZWxldGUoaSk7DQorICAgICAgICBuTGVuZ3RoLS07DQorICAgICAgfQ0KKyAgICAgIGJFc2NhcGUgPSAhYkVzY2FwZTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoIWJJbkNvbnN0UmFuZ2UgJiYgKG4gPSB3YyAtIEwnQScpID49IDAgJiYgbiA8PSAoTCdhJyAtIEwnQScpKSB7DQorICAgICAgaW50MzJfdCBuQWx0ID0gKGludDMyX3QpcEFsdFRhYmxlW25dOw0KKyAgICAgIGlmIChuQWx0ICE9IFhGQV9OKSB7DQorICAgICAgICB3c1BhdHRlcm4uU2V0QXQoaSwgd3NBbHRTeW1ib2xzW25BbHRdKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaSsrOw0KKyAgICBiRXNjYXBlID0gRkFMU0U7DQorICB9DQorfQ0KKyN1bmRlZiBYRkFfTg0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldExvY2FsRGF0ZUZvcm1hdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGFuZGFyZCkgew0KKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBzdHJTdHlsZTsNCisgIHN3aXRjaCAoaVN0eWxlKSB7DQorICAgIGNhc2UgMDoNCisgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE6DQorICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDI6DQorICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAzOg0KKyAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDQ6DQorICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0Z1bGw7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCisgICAgICBicmVhazsNCisgIH0NCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQorICBpZiAoIXBEb2MpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZYX0xvY2FsZU1nciogcE1nciA9IChJRlhfTG9jYWxlTWdyKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQorICBpZiAoc3pMb2NhbFN0ci5Jc0VtcHR5KCkpIHsNCisgICAgQ1hGQV9PYmplY3QqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICBGWFNZU19hc3NlcnQocFRoaXNOb2RlLT5Jc05vZGUoKSk7DQorICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUqKXBUaGlzTm9kZSk7DQorICAgIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7DQorICB9IGVsc2Ugew0KKyAgICBwTG9jYWxlID0gcE1nci0+R2V0TG9jYWxlQnlOYW1lKA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxTdHIuR2V0Q1N0cigpLCBzekxvY2FsU3RyLkdldExlbmd0aCgpKSk7DQorICB9DQorICBpZiAoIXBMb2NhbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyUmV0Ow0KKyAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oc3RyU3R5bGUsIHN0clJldCk7DQorICBpZiAoIWJTdGFuZGFyZCkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbHM7DQorICAgIHBMb2NhbGUtPkdldERhdGVUaW1lU3ltYm9scyh3c1N5bWJvbHMpOw0KKyAgICBYRkFfRk1fQWx0ZXJuYXRlRGF0ZVRpbWVTeW1ib2xzKHN0clJldCwgd3NTeW1ib2xzLCBnX3NBbHRUYWJsZV9EYXRlKTsNCisgIH0NCisgIHN0ckZvcm1hdCA9IEZYX1VURjhFbmNvZGUoc3RyUmV0LCBzdHJSZXQuR2V0TGVuZ3RoKCkpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXRMb2NhbFRpbWVGb3JtYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RhbmRhcmQpIHsNCisgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgc3RyU3R5bGU7DQorICBzd2l0Y2ggKGlTdHlsZSkgew0KKyAgICBjYXNlIDA6DQorICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxOg0KKyAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW07DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzoNCisgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzsNCisgICAgICBicmVhazsNCisgICAgY2FzZSA0Og0KKyAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW07DQorICAgICAgYnJlYWs7DQorICB9DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgaWYgKCFwRG9jKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGWF9Mb2NhbGVNZ3IqIHBNZ3IgPSAoSUZYX0xvY2FsZU1nciopcERvYy0+R2V0TG9jYWxNZ3IoKTsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgaWYgKHN6TG9jYWxTdHIuSXNFbXB0eSgpKSB7DQorICAgIENYRkFfT2JqZWN0KiBwVGhpc09iamVjdCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICBGWFNZU19hc3NlcnQocFRoaXNPYmplY3QtPklzTm9kZSgpKTsNCisgICAgQ1hGQV9Ob2RlKiBwVGhpc05vZGUgPSAoQ1hGQV9Ob2RlKilwVGhpc09iamVjdDsNCisgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEocFRoaXNOb2RlKTsNCisgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCisgIH0gZWxzZSB7DQorICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbFN0ci5HZXRDU3RyKCksIHN6TG9jYWxTdHIuR2V0TGVuZ3RoKCkpKTsNCisgIH0NCisgIGlmICghcExvY2FsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyBzdHJSZXQ7DQorICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihzdHJTdHlsZSwgc3RyUmV0KTsNCisgIGlmICghYlN0YW5kYXJkKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sczsNCisgICAgcExvY2FsZS0+R2V0RGF0ZVRpbWVTeW1ib2xzKHdzU3ltYm9scyk7DQorICAgIFhGQV9GTV9BbHRlcm5hdGVEYXRlVGltZVN5bWJvbHMoc3RyUmV0LCB3c1N5bWJvbHMsIGdfc0FsdFRhYmxlX1RpbWUpOw0KKyAgfQ0KKyAgc3RyRm9ybWF0ID0gRlhfVVRGOEVuY29kZShzdHJSZXQsIHN0clJldC5HZXRMZW5ndGgoKSk7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldFN0YW5kYXJkRGF0ZUZvcm1hdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRm9ybWF0KSB7DQorICBHZXRMb2NhbERhdGVGb3JtYXQoaFRoaXMsIGlTdHlsZSwgc3pMb2NhbFN0ciwgc3RyRm9ybWF0LCBUUlVFKTsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0U3RhbmRhcmRUaW1lRm9ybWF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJGb3JtYXQpIHsNCisgIEdldExvY2FsVGltZUZvcm1hdChoVGhpcywgaVN0eWxlLCBzekxvY2FsU3RyLCBzdHJGb3JtYXQsIFRSVUUpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yQWxsVGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdNLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJUaW1lKSB7DQorICBpbnQzMl90IGlIb3VyID0gMDsNCisgIGludDMyX3QgaU1pbiA9IDA7DQorICBpbnQzMl90IGlTZWMgPSAwOw0KKyAgaW50MzJfdCBpWm9uZUhvdXIgPSAwOw0KKyAgaW50MzJfdCBpWm9uZU1pbiA9IDA7DQorICBpbnQzMl90IGlab25lU2VjID0gMDsNCisgIGlIb3VyID0gc3RhdGljX2Nhc3Q8aW50PihpVGltZSkgLyAzNjAwMDAwOw0KKyAgaU1pbiA9IChzdGF0aWNfY2FzdDxpbnQ+KGlUaW1lKSAtIGlIb3VyICogMzYwMDAwMCkgLyA2MDAwMDsNCisgIGlTZWMgPSAoc3RhdGljX2Nhc3Q8aW50PihpVGltZSkgLSBpSG91ciAqIDM2MDAwMDAgLSBpTWluICogNjAwMDApIC8gMTAwMDsNCisgIGlmICghYkdNKSB7DQorICAgIEdldExvY2FsVGltZVpvbmUoaVpvbmVIb3VyLCBpWm9uZU1pbiwgaVpvbmVTZWMpOw0KKyAgICBpSG91ciArPSBpWm9uZUhvdXI7DQorICAgIGlNaW4gKz0gaVpvbmVNaW47DQorICAgIGlTZWMgKz0gaVpvbmVTZWM7DQorICB9DQorICBpbnQzMl90IGlSZXQgPSAwOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgc3RySXNvVGltZTsNCisgIHN0cklzb1RpbWUuRm9ybWF0KCIlMDJkOiUwMmQ6JTAyZCIsIGlIb3VyLCBpTWluLCBpU2VjKTsNCisgIGlmIChiR00pIHsNCisgICAgaVJldCA9IEdldEdNVFRpbWUoaFRoaXMsIHN0cklzb1RpbWUsIHN6Rm9ybWF0LCBzekxvY2FsZSwgc3RyVGltZSk7DQorICB9IGVsc2Ugew0KKyAgICBpUmV0ID0gSXNvVGltZTJMb2NhbChoVGhpcywgc3RySXNvVGltZSwgc3pGb3JtYXQsIHN6TG9jYWxlLCBzdHJUaW1lKTsNCisgIH0NCisgIGlmICghaVJldCkgew0KKyAgICBzdHJUaW1lID0gRlhfQlNUUkMoIiIpOw0KKyAgfQ0KKyAgcmV0dXJuOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXRMb2NhbFRpbWVab25lKGludDMyX3QmIGlIb3VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTZWMpIHsNCisgIHRpbWVfdCBub3c7DQorICB0aW1lKCZub3cpOw0KKyAgc3RydWN0IHRtKiBwR210ID0gZ210aW1lKCZub3cpOw0KKyAgaW50MzJfdCBpR01Ib3VyID0gcEdtdC0+dG1faG91cjsNCisgIGludDMyX3QgaUdNTWluID0gcEdtdC0+dG1fbWluOw0KKyAgaW50MzJfdCBpR01TZWMgPSBwR210LT50bV9zZWM7DQorICBzdHJ1Y3QgdG0qIHBMb2NhbCA9IGxvY2FsdGltZSgmbm93KTsNCisgIGludDMyX3QgaUxvY2FsSG91ciA9IHBMb2NhbC0+dG1faG91cjsNCisgIGludDMyX3QgaUxvY2FsTWluID0gcExvY2FsLT50bV9taW47DQorICBpbnQzMl90IGlMb2NhbFNlYyA9IHBMb2NhbC0+dG1fc2VjOw0KKyAgaUhvdXIgPSBpTG9jYWxIb3VyIC0gaUdNSG91cjsNCisgIGlNaW4gPSBpTG9jYWxNaW4gLSBpR01NaW47DQorICBpU2VjID0gaUxvY2FsU2VjIC0gaUdNU2VjOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpBcHIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBGWF9ET1VCTEUgblByaW5jaXBhbCA9IDA7DQorICAgIEZYX0RPVUJMRSBuUGF5bWVudCA9IDA7DQorICAgIEZYX0RPVUJMRSBuUGVyaW9kcyA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpKTsNCisgICAgaWYgKGJGbGFncykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBuUHJpbmNpcGFsID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgblBheW1lbnQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVHdvKTsNCisgICAgICBuUGVyaW9kcyA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUaHJlZSk7DQorICAgICAgYkZsYWdzID0gKChuUHJpbmNpcGFsIDw9IDApIHx8IChuUGF5bWVudCA8PSAwKSB8fCAoblBlcmlvZHMgPD0gMCkpOw0KKyAgICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRE9VQkxFIHIgPQ0KKyAgICAgICAgICAgIDIgKiAoblBlcmlvZHMgKiBuUGF5bWVudCAtIG5QcmluY2lwYWwpIC8gKG5QZXJpb2RzICogblByaW5jaXBhbCk7DQorICAgICAgICBGWF9ET1VCTEUgblRlbXAgPSAxOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblBlcmlvZHM7ICsraSkgew0KKyAgICAgICAgICBuVGVtcCAqPSAoMSArIHIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRE9VQkxFIG5SZXQgPSByICogblRlbXAgLyAoblRlbXAgLSAxKSAtIG5QYXltZW50IC8gblByaW5jaXBhbDsNCisgICAgICAgIHdoaWxlICgoblJldCA+IEZJTkFOQ0lBTF9QUkVDSVNJT04gfHwgblJldCA8IC1GSU5BTkNJQUxfUFJFQ0lTSU9OKSAmJg0KKyAgICAgICAgICAgICAgICghYkZsYWdzKSkgew0KKyAgICAgICAgICBGWF9ET1VCTEUgbkRlcml2YXRpdmUgPSAwOw0KKyAgICAgICAgICBuRGVyaXZhdGl2ZSA9DQorICAgICAgICAgICAgICAoKG5UZW1wICsgciAqIG5QZXJpb2RzICogKG5UZW1wIC8gKDEgKyByKSkpICogKG5UZW1wIC0gMSkgLQ0KKyAgICAgICAgICAgICAgIChyICogblRlbXAgKiBuUGVyaW9kcyAqIChuVGVtcCAvICgxICsgcikpKSkgLw0KKyAgICAgICAgICAgICAgKChuVGVtcCAtIDEpICogKG5UZW1wIC0gMSkpOw0KKyAgICAgICAgICBpZiAobkRlcml2YXRpdmUgPT0gMCkgew0KICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgciA9IHIgLSBuUmV0IC8gbkRlcml2YXRpdmU7DQorICAgICAgICAgIG5UZW1wID0gMTsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblBlcmlvZHM7ICsraSkgew0KKyAgICAgICAgICAgIG5UZW1wICo9ICgxICsgcik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgblJldCA9IHIgKiBuVGVtcCAvIChuVGVtcCAtIDEpIC0gblBheW1lbnQgLyBuUHJpbmNpcGFsOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJGbGFncykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIG9uZVN0cmluZyk7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3bywgdHdvU3RyaW5nKTsNCisgICAgICAgICAgciA9IHIgKiAxMjsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgcik7DQogICAgICAgICB9DQotICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQotICAgICAgICAgICAgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KLSAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUaHJlZSwgdGhyZWVTdHJpbmcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpU3JjTGVuID0gb25lU3RyaW5nLkdldExlbmd0aCgpOw0KLSAgICAgICAgaW50MzJfdCBpRmluZExlbiA9IHR3b1N0cmluZy5HZXRMZW5ndGgoKTsNCi0gICAgICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRTdHJpbmc7DQotICAgICAgICBpbnQzMl90IGlGaW5kSW5kZXggPSAwOw0KLSAgICAgICAgdWludDhfdCBjaCA9IDA7DQotICAgICAgICBmb3IgKGludDMyX3QgdSA9IDA7IHUgPCBpU3JjTGVuOyArK3UpIHsNCi0gICAgICAgICAgICBjaCA9IG9uZVN0cmluZy5HZXRBdCh1KTsNCi0gICAgICAgICAgICBpZiAoY2ggPT0gdHdvU3RyaW5nLkdldEF0KGlGaW5kSW5kZXgpKSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaVRlbXAgPSB1ICsgMTsNCi0gICAgICAgICAgICAgICAgKytpRmluZEluZGV4Ow0KLSAgICAgICAgICAgICAgICB1aW50OF90IGNoVGVtcCA9IDA7DQotICAgICAgICAgICAgICAgIHdoaWxlIChpRmluZEluZGV4IDwgaUZpbmRMZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgIGNoVGVtcCA9IG9uZVN0cmluZy5HZXRBdChpVGVtcCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2hUZW1wID09IHR3b1N0cmluZy5HZXRBdChpRmluZEluZGV4KSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICsraVRlbXA7DQotICAgICAgICAgICAgICAgICAgICAgICAgKytpRmluZEluZGV4Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpRmluZEluZGV4ID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoaUZpbmRJbmRleCA9PSBpRmluZExlbikgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0U3RyaW5nIDw8IHRocmVlU3RyaW5nOw0KLSAgICAgICAgICAgICAgICAgICAgdSArPSBpRmluZExlbiAtIDE7DQotICAgICAgICAgICAgICAgICAgICBpRmluZEluZGV4ID0gMDsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKGNoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKGNoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXN1bHRTdHJpbmcuQXBwZW5kQ2hhcigwKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRTdHJpbmcuR2V0Qnl0ZVN0cmluZygpKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCi0gICAgICAgIGlmKGFyZ2MgPT0gMykgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJSZXBsYWNlIik7DQorICAgICAgfQ0KICAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJBcHIiKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UmlnaHQoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgIEZYX0JPT0wgYXJnSXNOdWxsID0gRkFMU0U7DQotICAgICAgICBpZiAoKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgfHwgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSkpIHsNCi0gICAgICAgICAgICBhcmdJc051bGwgPSBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGFyZ0lzTnVsbCkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOw0KLSAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHNvdXJjZVN0cmluZyk7DQotICAgICAgICAgICAgaW50MzJfdCBjb3VudCA9IEhWYWx1ZVRvSW50ZWdlcihoVGhpcywgYXJnVHdvKTsNCi0gICAgICAgICAgICBpZiAoY291bnQgPCAwKSB7DQotICAgICAgICAgICAgICAgIGNvdW50ID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHNvdXJjZVN0cmluZy5SaWdodChjb3VudCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkNUZXJtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAzKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIEZYX0ZMT0FUIG5SYXRlID0gMDsNCisgICAgRlhfRkxPQVQgbkZ1dHVyZVZhbHVlID0gMDsNCisgICAgRlhfRkxPQVQgbkluaXRBbW91bnQgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgIGJGbGFncyA9IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pIHx8DQorICAgICAgICAgICAgICBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1RocmVlKSk7DQorICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJSaWdodCIpOw0KKyAgICAgIG5SYXRlID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICBuRnV0dXJlVmFsdWUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIG5Jbml0QW1vdW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgIGJGbGFncyA9ICgoblJhdGUgPD0gMCkgfHwgKG5GdXR1cmVWYWx1ZSA8PSAwKSB8fCAobkluaXRBbW91bnQgPD0gMCkpOw0KKyAgICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbG9nKChGWF9GTE9BVCkobkZ1dHVyZVZhbHVlIC8gbkluaXRBbW91bnQpKSAvDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbG9nKChGWF9GTE9BVCkoMSArIG5SYXRlKSkpOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiQ1Rlcm0iKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UnRyaW0oRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmc7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc291cmNlU3RyaW5nKTsNCi0gICAgICAgICAgICBzb3VyY2VTdHJpbmcuVHJpbVJpZ2h0KCk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHNvdXJjZVN0cmluZyk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RlYoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDMpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhfRE9VQkxFIG5BbW91bnQgPSAwOw0KKyAgICBGWF9ET1VCTEUgblJhdGUgPSAwOw0KKyAgICBGWF9ET1VCTEUgblBlcmlvZCA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpKTsNCisgICAgaWYgKGJGbGFncykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIlJ0cmltIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6U3BhY2UoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgbkFtb3VudCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgIG5SYXRlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgblBlcmlvZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUaHJlZSk7DQorICAgICAgYkZsYWdzID0gKChuUmF0ZSA8IDApIHx8IChuUGVyaW9kIDw9IDApIHx8IChuQW1vdW50IDw9IDApKTsNCisgICAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0RPVUJMRSBkUmVzdWx0ID0gMDsNCisgICAgICAgIGlmICghblJhdGUpIHsNCisgICAgICAgICAgZFJlc3VsdCA9IG5BbW91bnQgKiBuUGVyaW9kOw0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpbnQzMl90IGNvdW50ID0gMDsNCi0gICAgICAgICAgICBjb3VudCA9IEhWYWx1ZVRvSW50ZWdlcihoVGhpcywgYXJnT25lKTsNCi0gICAgICAgICAgICBjb3VudCA9IChjb3VudCA8IDApID8gMCA6IGNvdW50Ow0KLSAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiBzcGFjZVN0cmluZzsNCi0gICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gMDsNCi0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjb3VudCkgew0KLSAgICAgICAgICAgICAgICBzcGFjZVN0cmluZy5BcHBlbmRCeXRlKCcgJyk7DQotICAgICAgICAgICAgICAgIGluZGV4Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHNwYWNlU3RyaW5nLkFwcGVuZEJ5dGUoMCk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHNwYWNlU3RyaW5nLkdldEJ5dGVTdHJpbmcoKSk7DQorICAgICAgICAgIEZYX0RPVUJMRSBuVGVtcCA9IDE7DQorICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblBlcmlvZDsgKytpKSB7DQorICAgICAgICAgICAgblRlbXAgKj0gMSArIG5SYXRlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGRSZXN1bHQgPSBuQW1vdW50ICogKG5UZW1wIC0gMSkgLyBuUmF0ZTsNCiAgICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGRSZXN1bHQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiRlYiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6SVBtdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDUpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgblByaW5jcGFsQW1vdW50ID0gMDsNCisgICAgRlhfRkxPQVQgblJhdGUgPSAwOw0KKyAgICBGWF9GTE9BVCBuUGF5bWVudCA9IDA7DQorICAgIEZYX0ZMT0FUIG5GaXJzdE1vbnRoID0gMDsNCisgICAgRlhfRkxPQVQgbk51bWJlck9mTW9udGhzID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRm91ciA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMyk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdGaXZlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCA0KTsNCisgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRm91cikgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRml2ZSkpOw0KKyAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiU3BhY2UiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpTdHIoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCA0KSkgew0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgICAgIEZYX0ZMT0FUIGZOdW1iZXI7DQotICAgICAgICBpbnQzMl90IGlXaWR0aCA9IDEwOw0KLSAgICAgICAgaW50MzJfdCBpUHJlY2lzaW9uID0gMDsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBudW1iZXJWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgd2lkdGhWYWx1ZSA9IDA7DQotICAgICAgICBGWEpTRV9IVkFMVUUgcHJlY2lzaW9uVmFsdWUgPSAwOw0KLSAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNOdWxsKG51bWJlclZhbHVlKSkgew0KLSAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZOdW1iZXIgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBudW1iZXJWYWx1ZSk7DQorICAgICAgblByaW5jcGFsQW1vdW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgblBheW1lbnQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUaHJlZSk7DQorICAgICAgbkZpcnN0TW9udGggPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdGb3VyKTsNCisgICAgICBuTnVtYmVyT2ZNb250aHMgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdGaXZlKTsNCisgICAgICBiRmxhZ3MgPSAoKG5QcmluY3BhbEFtb3VudCA8PSAwKSB8fCAoblJhdGUgPD0gMCkgfHwgKG5QYXltZW50IDw9IDApIHx8DQorICAgICAgICAgICAgICAgIChuRmlyc3RNb250aCA8IDApIHx8IChuTnVtYmVyT2ZNb250aHMgPCAwKSk7DQorICAgICAgaWYgKGJGbGFncykgew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9GTE9BVCBmUmVzdWx0ID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIG5SYXRlT2ZNb250aCA9IG5SYXRlIC8gMTI7DQorICAgICAgICBpbnQzMl90IGlOdW1zID0NCisgICAgICAgICAgICAoaW50MzJfdCkoKEZYU1lTX2xvZzEwKChGWF9GTE9BVCkoblBheW1lbnQgLyBuUHJpbmNwYWxBbW91bnQpKSAtDQorICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19sb2cxMCgoRlhfRkxPQVQpKG5QYXltZW50IC8gblByaW5jcGFsQW1vdW50IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblJhdGVPZk1vbnRoKSkpIC8NCisgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbG9nMTAoKEZYX0ZMT0FUKSgxICsgblJhdGVPZk1vbnRoKSkpOw0KKyAgICAgICAgaW50MzJfdCBpRW5kID0gKGludDMyX3QpKG5GaXJzdE1vbnRoICsgbk51bWJlck9mTW9udGhzIC0gMSk7DQorICAgICAgICBpZiAoaUVuZCA+IGlOdW1zKSB7DQorICAgICAgICAgIGlFbmQgPSBpTnVtczsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmKGFyZ2MgPiAxKSB7DQotICAgICAgICAgICAgd2lkdGhWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICAgICAgaVdpZHRoID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgd2lkdGhWYWx1ZSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQotICAgICAgICAgICAgcHJlY2lzaW9uVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KLSAgICAgICAgICAgIGlQcmVjaXNpb24gPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBwcmVjaXNpb25WYWx1ZSk7DQotICAgICAgICAgICAgaWYgKGlQcmVjaXNpb24gPCAwKSB7DQotICAgICAgICAgICAgICAgIGlQcmVjaXNpb24gPSAwOw0KLSAgICAgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIG5TdW0gPSAwOw0KKyAgICAgICAgaWYgKG5QYXltZW50IDwgblByaW5jcGFsQW1vdW50ICogblJhdGVPZk1vbnRoKSB7DQorICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgIGZSZXN1bHQgPSAwOw0KICAgICAgICAgfQ0KICAgICAgICAgaWYgKCFiRmxhZ3MpIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBudW1iZXJTdHJpbmc7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyID0gIiUiOw0KLSAgICAgICAgICAgIGlmIChpUHJlY2lzaW9uKSB7DQotICAgICAgICAgICAgICAgIGZvcm1hdFN0ciArPSAiLiI7DQotICAgICAgICAgICAgICAgIGZvcm1hdFN0ciArPSBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpUHJlY2lzaW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZm9ybWF0U3RyICs9ICJmIjsNCi0gICAgICAgICAgICBudW1iZXJTdHJpbmcuRm9ybWF0KGZvcm1hdFN0ciwgZk51bWJlcik7DQotICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcERhdGEgPSBudW1iZXJTdHJpbmc7DQotICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gbnVtYmVyU3RyaW5nLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgIGludDMyX3QgdSA9IDA7DQotICAgICAgICAgICAgd2hpbGUgKHUgPCBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgIGlmICgqKHBEYXRhICsgdSkgPT0gJy4nKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICArK3U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7DQotICAgICAgICAgICAgaWYgKHUgPiBpV2lkdGggfHwgKGlQcmVjaXNpb24gKyB1KSA+PSBpV2lkdGgpIHsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpID0gMDsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBpV2lkdGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcqJyk7DQotICAgICAgICAgICAgICAgICAgICArK2k7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKHUgPT0gaUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlMZW5ndGggPiBpV2lkdGgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGkgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgaVdpZHRoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcqJyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3BhY2UgPSBpV2lkdGggLSBpTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgaVNwYWNlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcgJyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmIDw8IHBEYXRhOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVhdmluZ1NwYWNlID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpUHJlY2lzaW9uID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpTGVhdmluZ1NwYWNlID0gaVdpZHRoIC0gKHUgKyBpUHJlY2lzaW9uKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaUxlYXZpbmdTcGFjZSA9IGlXaWR0aCAtICh1ICsgaVByZWNpc2lvbiArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgaUxlYXZpbmdTcGFjZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcgJyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgKytpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaSA9IDA7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IHUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcigqKHBEYXRhICsgaSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpUHJlY2lzaW9uICE9IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcignLicpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgdSsrOw0KLSAgICAgICAgICAgICAgICAgICAgaSA9IDA7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodSA8IGlMZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBpUHJlY2lzaW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcigqKHBEYXRhICsgdSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgICAgICAgICArK3U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGlQcmVjaXNpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcignMCcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICsraTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRCdWYuR2V0Qnl0ZVN0cmluZygpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgICAgICBpbnQzMl90IGkgPSAwOw0KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkZpcnN0TW9udGggLSAxOyArK2kpIHsNCisgICAgICAgICAgICBuUHJpbmNwYWxBbW91bnQgLT0gblBheW1lbnQgLSBuUHJpbmNwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGg7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZm9yICg7IGkgPCBpRW5kOyArK2kpIHsNCisgICAgICAgICAgICBuU3VtICs9IG5QcmluY3BhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsNCisgICAgICAgICAgICBuUHJpbmNwYWxBbW91bnQgLT0gblBheW1lbnQgLSBuUHJpbmNwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGg7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZlJlc3VsdCA9IG5TdW07DQogICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG51bWJlclZhbHVlKTsNCi0gICAgICAgIGlmIChhcmdjID4gMSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uod2lkdGhWYWx1ZSk7DQotICAgICAgICAgICAgaWYgKGFyZ2MgPT0gMykgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByZWNpc2lvblZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIlN0ciIpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmUmVzdWx0KTsNCisgICAgICB9DQogICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZvdXIpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpdmUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIklQbXQiKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6U3R1ZmYoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKChhcmdjID09IDMpIHx8IChhcmdjID09IDQpKSB7DQotICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgaW5zZXJ0U3RyaW5nOw0KLSAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gMDsNCi0gICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMDsNCi0gICAgICAgIGludDMyX3QgaURlbGV0ZSA9IDA7DQotICAgICAgICBGWEpTRV9IVkFMVUUgc291cmNlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIHN0YXJ0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGRlbGV0ZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBpbnNlcnRWYWx1ZSA9IDA7DQotICAgICAgICBpZiAoKEZYSlNFX1ZhbHVlX0lzTnVsbChzb3VyY2VWYWx1ZSkpIHx8IChGWEpTRV9WYWx1ZV9Jc051bGwoc3RhcnRWYWx1ZSkpIHx8IChGWEpTRV9WYWx1ZV9Jc051bGwoZGVsZXRlVmFsdWUpKSkgew0KLSAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhzb3VyY2VWYWx1ZSwgc291cmNlU3RyaW5nKTsNCi0gICAgICAgICAgICBpTGVuZ3RoID0gc291cmNlU3RyaW5nLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgIGlTdGFydCA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIHN0YXJ0VmFsdWUpOw0KLSAgICAgICAgICAgIGlmIChpU3RhcnQgPCAxKSB7DQotICAgICAgICAgICAgICAgIGlTdGFydCA9IDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChpU3RhcnQgPiBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgIGlTdGFydCA9IGlMZW5ndGg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlEZWxldGUgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBkZWxldGVWYWx1ZSk7DQotICAgICAgICAgICAgaWYgKGlEZWxldGUgPD0gMCkgew0KLSAgICAgICAgICAgICAgICBpRGVsZXRlID0gMDsNCi0gICAgICAgICAgICB9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TlBWKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA+IDIpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhKU0VfSFZBTFVFKiBhcmdWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGFyZ2MpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsNCisgICAgICBhcmdWYWx1ZXNbaV0gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIGkpOw0KKyAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1ZhbHVlc1tpXSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgRlhfRE9VQkxFIG5SYXRlID0gMDsNCisgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZXNbMF0pOw0KKyAgICAgIGlmIChuUmF0ZSA8PSAwKSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0RPVUJMRSogcERhdGEgPSBGWF9BbGxvYyhGWF9ET1VCTEUsIGFyZ2MgLSAxKTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICAgICAgICBwRGF0YVtpIC0gMV0gPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVmFsdWVzW2ldKTsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmIChhcmdjID09IDQpIHsNCi0gICAgICAgICAgICBpbnNlcnRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMyk7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGluc2VydFZhbHVlLCBpbnNlcnRTdHJpbmcpOw0KKyAgICAgICAgRlhfRE9VQkxFIG5TdW0gPSAwOw0KKyAgICAgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYyAtIDE7IGkrKykgew0KKyAgICAgICAgICBGWF9ET1VCTEUgblRlbXAgPSAxOw0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPD0gaTsgaisrKSB7DQorICAgICAgICAgICAgblRlbXAgKj0gMSArIG5SYXRlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX0RPVUJMRSBuTnVtID0gKihwRGF0YSArIGlJbmRleCsrKTsNCisgICAgICAgICAgblN1bSArPSBuTnVtIC8gblRlbXA7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBuU3VtKTsNCisgICAgICAgIEZYX0ZyZWUocERhdGEpOw0KKyAgICAgICAgcERhdGEgPSAwOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0NCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZXNbaV0pOw0KKyAgICB9DQorICAgIEZYX0ZyZWUoYXJnVmFsdWVzKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJOUFYiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UG10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDMpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgblByaW5jaXBhbCA9IDA7DQorICAgIEZYX0ZMT0FUIG5SYXRlID0gMDsNCisgICAgRlhfRkxPQVQgblBlcmlvZHMgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgIGJGbGFncyA9IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pIHx8DQorICAgICAgICAgICAgICBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1RocmVlKSk7DQorICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgblByaW5jaXBhbCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgblJhdGUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIG5QZXJpb2RzID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgIGJGbGFncyA9ICgoblByaW5jaXBhbCA8PSAwKSB8fCAoblJhdGUgPD0gMCkgfHwgKG5QZXJpb2RzIDw9IDApKTsNCisgICAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0ZMT0FUIG5TdW0gPSAwOw0KKyAgICAgICAgRlhfRkxPQVQgblRtcCA9IDEgKyBuUmF0ZTsNCisgICAgICAgIG5TdW0gPSBuVG1wOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblBlcmlvZHMgLSAxOyArK2kpIHsNCisgICAgICAgICAgblN1bSAqPSBuVG1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5QcmluY2lwYWwgKiBuUmF0ZSAqIG5TdW0pIC8gKG5TdW0gLSAxKSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJQbXQiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UFBtdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDUpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgblByaW5jcGFsQW1vdW50ID0gMDsNCisgICAgRlhfRkxPQVQgblJhdGUgPSAwOw0KKyAgICBGWF9GTE9BVCBuUGF5bWVudCA9IDA7DQorICAgIEZYX0ZMT0FUIG5GaXJzdE1vbnRoID0gMDsNCisgICAgRlhfRkxPQVQgbk51bWJlck9mTW9udGhzID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRm91ciA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMyk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdGaXZlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCA0KTsNCisgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRm91cikgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRml2ZSkpOw0KKyAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5QcmluY3BhbEFtb3VudCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgblJhdGUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIG5QYXltZW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgIG5GaXJzdE1vbnRoID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnRm91cik7DQorICAgICAgbk51bWJlck9mTW9udGhzID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnRml2ZSk7DQorICAgICAgYkZsYWdzID0gKChuUHJpbmNwYWxBbW91bnQgPD0gMCkgfHwgKG5SYXRlIDw9IDApIHx8IChuUGF5bWVudCA8PSAwKSB8fA0KKyAgICAgICAgICAgICAgICAobkZpcnN0TW9udGggPCAwKSB8fCAobk51bWJlck9mTW9udGhzIDwgMCkpOw0KKyAgICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaW50MzJfdCBpRW5kID0gKGludDMyX3QpKG5GaXJzdE1vbnRoICsgbk51bWJlck9mTW9udGhzIC0gMSk7DQorICAgICAgICBGWF9GTE9BVCBuU3VtID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIG5SYXRlT2ZNb250aCA9IG5SYXRlIC8gMTI7DQorICAgICAgICBpbnQzMl90IGlOdW1zID0NCisgICAgICAgICAgICAoaW50MzJfdCkoKEZYU1lTX2xvZzEwKChGWF9GTE9BVCkoblBheW1lbnQgLyBuUHJpbmNwYWxBbW91bnQpKSAtDQorICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19sb2cxMCgoRlhfRkxPQVQpKG5QYXltZW50IC8gblByaW5jcGFsQW1vdW50IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblJhdGVPZk1vbnRoKSkpIC8NCisgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbG9nMTAoKEZYX0ZMT0FUKSgxICsgblJhdGVPZk1vbnRoKSkpOw0KKyAgICAgICAgaWYgKGlFbmQgPiBpTnVtcykgew0KKyAgICAgICAgICBpRW5kID0gaU51bXM7DQorICAgICAgICB9DQorICAgICAgICBpZiAoblBheW1lbnQgPCBuUHJpbmNwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGgpIHsNCisgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgICAgIGludDMyX3QgaSA9IDA7DQorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuRmlyc3RNb250aCAtIDE7ICsraSkgew0KKyAgICAgICAgICAgIG5QcmluY3BhbEFtb3VudCAtPSBuUGF5bWVudCAtIG5QcmluY3BhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWF9GTE9BVCBuVGVtcCA9IDA7DQorICAgICAgICAgIGZvciAoOyBpIDwgaUVuZDsgKytpKSB7DQorICAgICAgICAgICAgblRlbXAgPSBuUGF5bWVudCAtIG5QcmluY3BhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsNCisgICAgICAgICAgICBuU3VtICs9IG5UZW1wOw0KKyAgICAgICAgICAgIG5QcmluY3BhbEFtb3VudCAtPSBuVGVtcDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChhcmdzLkdldFJldHVyblZhbHVlKCksIG5TdW0pOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRm91cik7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRml2ZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiUFBtdCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQVihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBGWF9ET1VCTEUgbkFtb3VudCA9IDA7DQorICAgIEZYX0RPVUJMRSBuUmF0ZSA9IDA7DQorICAgIEZYX0RPVUJMRSBuUGVyaW9kID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICBiRmxhZ3MgPSAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSB8fA0KKyAgICAgICAgICAgICAgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUaHJlZSkpOw0KKyAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5BbW91bnQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKTsNCisgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIG5QZXJpb2QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgIGJGbGFncyA9ICgobkFtb3VudCA8PSAwKSB8fCAoblJhdGUgPCAwKSB8fCAoblBlcmlvZCA8PSAwKSk7DQorICAgICAgaWYgKGJGbGFncykgew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9ET1VCTEUgblRlbXAgPSAxOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblBlcmlvZDsgKytpKSB7DQorICAgICAgICAgIG5UZW1wICo9IDEgKyBuUmF0ZTsNCisgICAgICAgIH0NCisgICAgICAgIG5UZW1wID0gMSAvIG5UZW1wOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQW1vdW50ICogKCgxIC0gblRlbXApIC8gblJhdGUpKTsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlBWIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlJhdGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAzKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIEZYX0ZMT0FUIG5GdXR1cmUgPSAwOw0KKyAgICBGWF9GTE9BVCBuUHJlc2VudCA9IDA7DQorICAgIEZYX0ZMT0FUIG5Ub3RhbE51bWJlciA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpKTsNCisgICAgaWYgKGJGbGFncykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBuRnV0dXJlID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICBuUHJlc2VudCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgblRvdGFsTnVtYmVyID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgIGJGbGFncyA9ICgobkZ1dHVyZSA8PSAwKSB8fCAoblByZXNlbnQgPCAwKSB8fCAoblRvdGFsTnVtYmVyIDw9IDApKTsNCisgICAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWFNZU19wb3coKEZYX0ZMT0FUKShuRnV0dXJlIC8gblByZXNlbnQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKDEgLyBuVG90YWxOdW1iZXIpKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiUmF0ZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUZXJtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBGWF9GTE9BVCBuTW91bnQgPSAwOw0KKyAgICBGWF9GTE9BVCBuUmF0ZSA9IDA7DQorICAgIEZYX0ZMT0FUIG5GdXR1cmUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgIGJGbGFncyA9IChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnVHdvKSB8fA0KKyAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1RocmVlKSk7DQorICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgbk1vdW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgbkZ1dHVyZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1RocmVlKTsNCisgICAgICBiRmxhZ3MgPSAoKG5Nb3VudCA8PSAwKSB8fCAoblJhdGUgPD0gMCkgfHwgKG5GdXR1cmUgPD0gMCkpOw0KKyAgICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoDQorICAgICAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgIChGWFNZU19sb2coKEZYX0ZMT0FUKShuRnV0dXJlIC8gbk1vdW50ICogblJhdGUpICsgMSkgLw0KKyAgICAgICAgICAgICBGWFNZU19sb2coKEZYX0ZMT0FUKSgxICsgblJhdGUpKSkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiVGVybSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpDaG9vc2UoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID4gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgRlhfQk9PTCBhcmdPbmVJc051bGwgPSBGQUxTRTsNCisgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgICBhcmdPbmVJc051bGwgPSBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSk7DQorICAgIGlmICghYXJnT25lSXNOdWxsKSB7DQorICAgICAgaUluZGV4ID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIGlmIChhcmdPbmVJc051bGwpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSBpZiAoaUluZGV4IDwgMSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYX0JPT0wgYkZvdW5kID0gRkFMU0U7DQorICAgICAgRlhfQk9PTCBiU3RvcENvdW50ZXJGbGFncyA9IEZBTFNFOw0KKyAgICAgIGludDMyX3QgaUFyZ0luZGV4ID0gMTsNCisgICAgICBpbnQzMl90IGlWYWx1ZUluZGV4ID0gMDsNCisgICAgICB3aGlsZSAoIWJGb3VuZCAmJiAhYlN0b3BDb3VudGVyRmxhZ3MgJiYgKGlBcmdJbmRleCA8IGFyZ2MpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgYXJnSW5kZXhWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoaUFyZ0luZGV4KTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ0luZGV4VmFsdWUpKSB7DQorICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnSW5kZXhWYWx1ZSwgRlhfQlNUUkMoImxlbmd0aCIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgICAgIGlmIChpTGVuZ3RoID4gMykgew0KKyAgICAgICAgICAgIGJTdG9wQ291bnRlckZsYWdzID0gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpVmFsdWVJbmRleCArPSAoaUxlbmd0aCAtIDIpOw0KKyAgICAgICAgICBpZiAoaVZhbHVlSW5kZXggPj0gaUluZGV4KSB7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc29iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHkgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdJbmRleFZhbHVlLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoDQorICAgICAgICAgICAgICAgIGFyZ0luZGV4VmFsdWUsICgoaUxlbmd0aCAtIDEpIC0gKGlWYWx1ZUluZGV4IC0gaUluZGV4KSksDQorICAgICAgICAgICAgICAgIGpzb2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BTdHI7DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcFN0cik7DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzb2JqZWN0VmFsdWUsIHByb3BTdHIsIG5ld1Byb3BlcnR5KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDaG9vc2VkOw0KKyAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhuZXdQcm9wZXJ0eSwgYnNDaG9vc2VkKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYnNDaG9vc2VkKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzb2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgYkZvdW5kID0gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaVZhbHVlSW5kZXgrKzsNCisgICAgICAgICAgaWYgKGlWYWx1ZUluZGV4ID09IGlJbmRleCkgew0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzQ2hvb3NlZDsNCisgICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnSW5kZXhWYWx1ZSwgYnNDaG9vc2VkKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYnNDaG9vc2VkKTsNCisgICAgICAgICAgICBiRm91bmQgPSBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0luZGV4VmFsdWUpOw0KKyAgICAgICAgaUFyZ0luZGV4Kys7DQorICAgICAgfQ0KKyAgICAgIGlmICghYkZvdW5kKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkNob29zZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpFeGlzdHMoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnT25lKSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkV4aXN0cyIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpIYXNWYWx1ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ09uZSkpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyB2YWx1ZVN0cjsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnT25lLCB2YWx1ZVN0cik7DQorICAgICAgdmFsdWVTdHIuVHJpbUxlZnQoKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKCF2YWx1ZVN0ci5Jc0VtcHR5KCkpKTsNCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc051bWJlcihhcmdPbmUpIHx8IEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIFRSVUUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiSGFzVmFsdWUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6T25lb2YoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID4gMSkgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFKiBwYXJhbWV0ZXJzVmFsdWUgPSAwOw0KKyAgICBpbnQzMl90IGlDb3VudCA9IDA7DQorICAgIHVuZm9sZEFyZ3MoaFRoaXMsIGFyZ3MsIHBhcmFtZXRlcnNWYWx1ZSwgaUNvdW50LCAxKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBpZiAoc2ltcGxlVmFsdWVDb21wYXJlKGhUaGlzLCBhcmdPbmUsIHBhcmFtZXRlcnNWYWx1ZVtpXSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIGJGbGFncyk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHBhcmFtZXRlcnNWYWx1ZVtpXSk7DQorICAgIH0NCisgICAgRlhfRnJlZShwYXJhbWV0ZXJzVmFsdWUpOw0KKyAgICBwYXJhbWV0ZXJzVmFsdWUgPSAwOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiT25lb2YiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6V2l0aGluKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDMpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX0hWQUxVRSBhcmdMb3cgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgIEZYSlNFX0hWQUxVRSBhcmdIZWlnaHQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bWJlcihhcmdPbmUpKSB7DQorICAgICAgICBGWF9GTE9BVCBvbmVOdW1iZXIgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgICAgRlhfRkxPQVQgbG93TnVtYmVyID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnTG93KTsNCisgICAgICAgIEZYX0ZMT0FUIGhlaWdodE51bWJlciA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ0hlaWdodCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKA0KKyAgICAgICAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAoKG9uZU51bWJlciA+PSBsb3dOdW1iZXIpICYmIChvbmVOdW1iZXIgPD0gaGVpZ2h0TnVtYmVyKSkpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBvbmVTdHJpbmc7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBsb3dTdHJpbmc7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBoZWlnaHRTdHJpbmc7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBvbmVTdHJpbmcpOw0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0xvdywgbG93U3RyaW5nKTsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdIZWlnaHQsIGhlaWdodFN0cmluZyk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChvbmVTdHJpbmcuQ29tcGFyZShsb3dTdHJpbmcpID49IDApICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25lU3RyaW5nLkNvbXBhcmUoaGVpZ2h0U3RyaW5nKSA8PSAwKSkpOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0xvdyk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdIZWlnaHQpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIldpdGhpbiIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpJZihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnQ29uZGl0aW9uID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICBGWF9CT09MIGJDb25kaXRpb24gPSBGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4oYXJnQ29uZGl0aW9uKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgIGJDb25kaXRpb24gPyBhcmdGaXJzdFZhbHVlIDogYXJnU2Vjb25kVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZFZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdFZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdDb25kaXRpb24pOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiSWYiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RXZhbChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIHNjcmlwdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdXRmOFNjcmlwdFN0cmluZzsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKHNjcmlwdFZhbHVlLCB1dGY4U2NyaXB0U3RyaW5nKTsNCisgICAgaWYgKHV0ZjhTY3JpcHRTdHJpbmcuSXNFbXB0eSgpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9XaWRlVGV4dEJ1ZiB3c0phdmFTY3JpcHRCdWY7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgamF2YVNjcmlwdDsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0Vycm9yOw0KKyAgICAgIFhGQV9GTTJKU19UcmFuc2xhdGUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjhTY3JpcHRTdHJpbmcsIHV0ZjhTY3JpcHRTdHJpbmcuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3NKYXZhU2NyaXB0QnVmLCB3c0Vycm9yKTsNCisgICAgICBGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCA9IEZYSlNFX0NvbnRleHRfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9IVkFMVUUgcmV0dXJuVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIGphdmFTY3JpcHQgPSB3c0phdmFTY3JpcHRCdWYuR2V0V2lkZVN0cmluZygpOw0KKyAgICAgIEZYSlNFX0V4ZWN1dGVTY3JpcHQoaENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VVEY4RW5jb2RlKGphdmFTY3JpcHQsIGphdmFTY3JpcHQuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldChhcmdzLkdldFJldHVyblZhbHVlKCksIHJldHVyblZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJldHVyblZhbHVlKTsNCisgICAgICBGWEpTRV9Db250ZXh0X1JlbGVhc2UoaENvbnRleHQpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc2NyaXB0VmFsdWUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkV2YWwiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UmVmKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSByZ1ZhbHVlc1szXTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCisgICAgICAgIHJnVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgNCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1sxXSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1syXSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAzLCByZ1ZhbHVlcyk7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ09uZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICBGWFNZU19hc3NlcnQoaUxlbmd0aCA+PSAzKTsNCisgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDIsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoanNPYmplY3RWYWx1ZSkpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSAmJg0KKyAgICAgICAgICAgICAgICAgKCFGWEpTRV9WYWx1ZV9Jc051bGwoanNPYmplY3RWYWx1ZSkpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgcmdWYWx1ZXNbM107DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCisgICAgICAgICAgcmdWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgMyk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzFdKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZ1ZhbHVlc1syXSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRBcnJheShhcmdzLkdldFJldHVyblZhbHVlKCksIDMsIHJnVmFsdWVzKTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSByZ1ZhbHVlc1szXTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCisgICAgICAgIHJnVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgMyk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1sxXSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0KHJnVmFsdWVzWzJdLCBhcmdPbmUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEFycmF5KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMywgcmdWYWx1ZXMpOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShyZ1ZhbHVlc1tpXSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihhcmdPbmUpIHx8DQorICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ09uZSkgfHwNCisgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Jc051bWJlcihhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYXJnT25lKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlJlZiIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpVbml0VHlwZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSB1bml0c3BhblZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbCh1bml0c3BhblZhbHVlKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHVuaXRzcGFuVmFsdWUpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyB1bml0c3BhblN0cmluZzsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKHVuaXRzcGFuVmFsdWUsIHVuaXRzcGFuU3RyaW5nKTsNCisgICAgaWYgKHVuaXRzcGFuU3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiaW4iKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZW51bSBYRkFfRk0ySlNfVkFMVUVUWVBFX1BhcnNlclN0YXR1cyB7DQorICAgICAgICBWQUxVRVRZUEVfU1RBUlQsDQorICAgICAgICBWQUxVRVRZUEVfSEFWRUlOVkFMSURDSEFSLA0KKyAgICAgICAgVkFMVUVUWVBFX0hBVkVESUdJVCwNCisgICAgICAgIFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSwNCisgICAgICAgIFZBTFVFVFlQRV9JU0NNLA0KKyAgICAgICAgVkFMVUVUWVBFX0lTTU0sDQorICAgICAgICBWQUxVRVRZUEVfSVNQVCwNCisgICAgICAgIFZBTFVFVFlQRV9JU01QLA0KKyAgICAgICAgVkFMVUVUWVBFX0lTSU4sDQorICAgICAgfTsNCisgICAgICB1bml0c3BhblN0cmluZy5NYWtlTG93ZXIoKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1R5cGVTdHJpbmcgPQ0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgodW5pdHNwYW5TdHJpbmcsIHVuaXRzcGFuU3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c1R5cGVTdHJpbmc7DQorICAgICAgaW50MzJfdCB1ID0gMDsNCisgICAgICBpbnQzMl90IHVMZW4gPSB3c1R5cGVTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICAgICAgd2hpbGUgKCoocERhdGEgKyB1KSA9PSAweDIwIHx8ICoocERhdGEgKyB1KSA9PSAweDA5IHx8DQorICAgICAgICAgICAgICoocERhdGEgKyB1KSA9PSAweDBCIHx8ICoocERhdGEgKyB1KSA9PSAweDBDIHx8DQorICAgICAgICAgICAgICoocERhdGEgKyB1KSA9PSAweDBBIHx8ICoocERhdGEgKyB1KSA9PSAweDBEKSB7DQorICAgICAgICB1Kys7DQorICAgICAgfQ0KKyAgICAgIFhGQV9GTTJKU19WQUxVRVRZUEVfUGFyc2VyU3RhdHVzIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfU1RBUlQ7DQorICAgICAgRlhfV0NIQVIgdHlwZUNoYXI7DQorICAgICAgd2hpbGUgKHUgPCB1TGVuKSB7DQorICAgICAgICB0eXBlQ2hhciA9ICoocERhdGEgKyB1KTsNCisgICAgICAgIGlmICh0eXBlQ2hhciA9PSAweDIwIHx8IHR5cGVDaGFyID09IDB4MDkgfHwgdHlwZUNoYXIgPT0gMHgwQiB8fA0KKyAgICAgICAgICAgIHR5cGVDaGFyID09IDB4MEMgfHwgdHlwZUNoYXIgPT0gMHgwQSB8fCB0eXBlQ2hhciA9PSAweDBEKSB7DQorICAgICAgICAgIGlmIChlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVQgfHwNCisgICAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVFdISVRFKSB7DQorICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0lTSU47DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoKHR5cGVDaGFyID49ICcwJyAmJiB0eXBlQ2hhciA8PSAnOScpIHx8IHR5cGVDaGFyID09ICctJyB8fA0KKyAgICAgICAgICAgICAgICAgICB0eXBlQ2hhciA9PSAnLicpIHsNCisgICAgICAgICAgaWYgKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVFdISVRFKSB7DQorICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9JU0lOOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSEFWRURJR0lUOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKCh0eXBlQ2hhciA9PSAnYycgfHwgdHlwZUNoYXIgPT0gJ3AnKSAmJiAodSArIDEgPCB1TGVuKSkgew0KKyAgICAgICAgICBGWF9XQ0hBUiBuZXh0Q2hhciA9ICoocERhdGEgKyB1ICsgMSk7DQorICAgICAgICAgIGlmICgoZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfU1RBUlQgfHwNCisgICAgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVQgfHwNCisgICAgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgJiYNCisgICAgICAgICAgICAgIChuZXh0Q2hhciA+ICc5JyB8fCBuZXh0Q2hhciA8ICcwJykgJiYgbmV4dENoYXIgIT0gJy4nICYmDQorICAgICAgICAgICAgICBuZXh0Q2hhciAhPSAnLScpIHsNCisgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID0gKHR5cGVDaGFyID09ICdjJykgPyBWQUxVRVRZUEVfSVNDTSA6IFZBTFVFVFlQRV9JU1BUOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSEFWRUlOVkFMSURDSEFSOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHR5cGVDaGFyID09ICdtJyAmJiAodSArIDEgPCB1TGVuKSkgew0KKyAgICAgICAgICBGWF9XQ0hBUiBuZXh0Q2hhciA9ICoocERhdGEgKyB1ICsgMSk7DQorICAgICAgICAgIGlmICgoZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfU1RBUlQgfHwNCisgICAgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVQgfHwNCisgICAgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgJiYNCisgICAgICAgICAgICAgIChuZXh0Q2hhciA+ICc5JyB8fCBuZXh0Q2hhciA8ICcwJykgJiYgbmV4dENoYXIgIT0gJy4nICYmDQorICAgICAgICAgICAgICBuZXh0Q2hhciAhPSAnLScpIHsNCisgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0lTTU07DQorICAgICAgICAgICAgaWYgKG5leHRDaGFyID09ICdwJyB8fA0KKyAgICAgICAgICAgICAgICAoKHUgKyA1IDwgdUxlbikgJiYgKihwRGF0YSArIHUgKyAxKSA9PSAnaScgJiYNCisgICAgICAgICAgICAgICAgICoocERhdGEgKyB1ICsgMikgPT0gJ2wnICYmICoocERhdGEgKyB1ICsgMykgPT0gJ2wnICYmDQorICAgICAgICAgICAgICAgICAqKHBEYXRhICsgdSArIDQpID09ICdpJyAmJiAqKHBEYXRhICsgdSArIDUpID09ICdwJykpIHsNCisgICAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSVNNUDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSEFWRUlOVkFMSURDSEFSOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdSsrOw0KKyAgICAgIH0NCisgICAgICBzd2l0Y2ggKGVQYXJzZXJTdGF0dXMpIHsNCisgICAgICAgIGNhc2UgVkFMVUVUWVBFX0lTQ006DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiY20iKSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBWQUxVRVRZUEVfSVNNTToNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJtbSIpKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFZBTFVFVFlQRV9JU1BUOg0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoInB0IikpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVkFMVUVUWVBFX0lTTVA6DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygibXAiKSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCJpbiIpKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodW5pdHNwYW5WYWx1ZSk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJVbml0VHlwZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpVbml0VmFsdWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjID09IDEpIHx8IChhcmdjID09IDIpKSB7DQorICAgIEZYSlNFX0hWQUxVRSB1bml0c3BhblZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIHVuaXRWYWx1ZSA9IDA7DQorICAgIENGWF9CeXRlU3RyaW5nIHVuaXRzcGFuU3RyaW5nOw0KKyAgICBGWF9ET1VCTEUgZEZpcnN0TnVtYmVyID0gMDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyRmlyc3RVbml0Ow0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHJVbml0Ow0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHVuaXRzcGFuVmFsdWUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyh1bml0c3BhblZhbHVlLCB1bml0c3BhblN0cmluZyk7DQorICAgICAgY29uc3QgRlhfQ0hBUiogcERhdGEgPSB1bml0c3BhblN0cmluZzsNCisgICAgICBpZiAocERhdGEpIHsNCisgICAgICAgIGludDMyX3QgdSA9IDA7DQorICAgICAgICB3aGlsZSAoKihwRGF0YSArIHUpID09IDB4MjAgfHwgKihwRGF0YSArIHUpID09IDB4MDkgfHwNCisgICAgICAgICAgICAgICAqKHBEYXRhICsgdSkgPT0gMHgwQiB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQyB8fA0KKyAgICAgICAgICAgICAgICoocERhdGEgKyB1KSA9PSAweDBBIHx8ICoocERhdGEgKyB1KSA9PSAweDBEKSB7DQorICAgICAgICAgIEZYX0NIQVIgY2ggPSAqKHBEYXRhICsgdSk7DQorICAgICAgICAgICsrdTsNCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgdVN0YXJ0ID0gdTsNCisgICAgICAgIHdoaWxlICh1IDwgdW5pdHNwYW5TdHJpbmcuR2V0TGVuZ3RoKCkpIHsNCisgICAgICAgICAgaWYgKCgqKHBEYXRhICsgdSkgPiAnOScgfHwgKihwRGF0YSArIHUpIDwgJzAnKSAmJg0KKyAgICAgICAgICAgICAgKihwRGF0YSArIHUpICE9ICcuJyAmJiAqKHBEYXRhICsgdSkgIT0gJy0nKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgKyt1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQ0hBUiogcFRlbXAgPSBOVUxMOw0KKyAgICAgICAgZEZpcnN0TnVtYmVyID0gc3RydG9kKHBEYXRhLCAmcFRlbXApOw0KKyAgICAgICAgd2hpbGUgKCoocERhdGEgKyB1KSA9PSAnICcgfHwgKihwRGF0YSArIHUpID09IDB4MDkgfHwNCisgICAgICAgICAgICAgICAqKHBEYXRhICsgdSkgPT0gMHgwQiB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQyB8fA0KKyAgICAgICAgICAgICAgICoocERhdGEgKyB1KSA9PSAweDBBIHx8ICoocERhdGEgKyB1KSA9PSAweDBEKSB7DQorICAgICAgICAgICsrdTsNCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgdUxlbiA9IHVuaXRzcGFuU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICAgICAgd2hpbGUgKHUgPCB1TGVuKSB7DQorICAgICAgICAgIGlmICgqKHBEYXRhICsgdSkgPT0gJyAnKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3RyRmlyc3RVbml0ICs9ICgqKHBEYXRhICsgdSkpOw0KKyAgICAgICAgICArK3U7DQorICAgICAgICB9DQorICAgICAgICBzdHJGaXJzdFVuaXQuTWFrZUxvd2VyKCk7DQorICAgICAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgICAgIHVuaXRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHVuaXRUZW1wU3RyaW5nOw0KKyAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcodW5pdFZhbHVlLCB1bml0VGVtcFN0cmluZyk7DQorICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBEYXRhID0gdW5pdFRlbXBTdHJpbmc7DQorICAgICAgICAgIGludDMyX3QgdSA9IDA7DQorICAgICAgICAgIHdoaWxlICgqKHBEYXRhICsgdSkgPT0gJyAnIHx8ICoocERhdGEgKyB1KSA9PSAweDA5IHx8DQorICAgICAgICAgICAgICAgICAqKHBEYXRhICsgdSkgPT0gMHgwQiB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQyB8fA0KKyAgICAgICAgICAgICAgICAgKihwRGF0YSArIHUpID09IDB4MEEgfHwgKihwRGF0YSArIHUpID09IDB4MEQpIHsNCisgICAgICAgICAgICArK3U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgd2hpbGUgKHUgPCB1bml0VGVtcFN0cmluZy5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgICAgIGlmICgoKihwRGF0YSArIHUpID4gJzknIHx8ICoocERhdGEgKyB1KSA8ICcwJykgJiYNCisgICAgICAgICAgICAgICAgKihwRGF0YSArIHUpICE9ICcuJykgew0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICsrdTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3aGlsZSAoKihwRGF0YSArIHUpID09ICcgJyB8fCAqKHBEYXRhICsgdSkgPT0gMHgwOSB8fA0KKyAgICAgICAgICAgICAgICAgKihwRGF0YSArIHUpID09IDB4MEIgfHwgKihwRGF0YSArIHUpID09IDB4MEMgfHwNCisgICAgICAgICAgICAgICAgICoocERhdGEgKyB1KSA9PSAweDBBIHx8ICoocERhdGEgKyB1KSA9PSAweDBEKSB7DQorICAgICAgICAgICAgKyt1Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludDMyX3QgdUxlbiA9IHVuaXRUZW1wU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICAgICAgICB3aGlsZSAodSA8IHVMZW4pIHsNCisgICAgICAgICAgICBpZiAoKihwRGF0YSArIHUpID09ICcgJykgew0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHN0clVuaXQgKz0gKCoocERhdGEgKyB1KSk7DQorICAgICAgICAgICAgKyt1Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIHN0clVuaXQuTWFrZUxvd2VyKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBzdHJVbml0ID0gc3RyRmlyc3RVbml0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRE9VQkxFIGRSZXN1bHQgPSAwOw0KKyAgICAgICAgaWYgKHN0ckZpcnN0VW5pdC5FcXVhbCgiaW4iKSB8fCBzdHJGaXJzdFVuaXQuRXF1YWwoImluY2hlcyIpKSB7DQorICAgICAgICAgIGlmIChzdHJVbml0LkVxdWFsKCJtbSIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpbWV0ZXJzIikpIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyICogMjUuNDsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJjbSIpIHx8IHN0clVuaXQuRXF1YWwoImNlbnRpbWV0ZXJzIikpIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyICogMi41NDsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJwdCIpIHx8IHN0clVuaXQuRXF1YWwoInBvaW50cyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoIm1wIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGlwb2ludHMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MjAwMDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHN0ckZpcnN0VW5pdC5FcXVhbCgibW0iKSB8fA0KKyAgICAgICAgICAgICAgICAgICBzdHJGaXJzdFVuaXQuRXF1YWwoIm1pbGxpbWV0ZXJzIikpIHsNCisgICAgICAgICAgaWYgKHN0clVuaXQuRXF1YWwoIm1tIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXI7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgiY20iKSB8fCBzdHJVbml0LkVxdWFsKCJjZW50aW1ldGVycyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDEwOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoInB0IikgfHwgc3RyVW5pdC5FcXVhbCgicG9pbnRzIikpIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMjUuNCAvIDcyOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoIm1wIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGlwb2ludHMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyAyNS40IC8gNzIwMDA7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDI1LjQ7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoc3RyRmlyc3RVbml0LkVxdWFsKCJjbSIpIHx8DQorICAgICAgICAgICAgICAgICAgIHN0ckZpcnN0VW5pdC5FcXVhbCgiY2VudGltZXRlcnMiKSkgew0KKyAgICAgICAgICBpZiAoc3RyVW5pdC5FcXVhbCgibW0iKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaW1ldGVycyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAqIDEwOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoImNtIikgfHwgc3RyVW5pdC5FcXVhbCgiY2VudGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXI7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgicHQiKSB8fCBzdHJVbml0LkVxdWFsKCJwb2ludHMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyAyLjU0IC8gNzI7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgibXAiKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaXBvaW50cyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDIuNTQgLyA3MjAwMDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMi41NDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQuRXF1YWwoInB0IikgfHwgc3RyRmlyc3RVbml0LkVxdWFsKCJwb2ludHMiKSkgew0KKyAgICAgICAgICBpZiAoc3RyVW5pdC5FcXVhbCgibW0iKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaW1ldGVycyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyICogMjUuNDsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJjbSIpIHx8IHN0clVuaXQuRXF1YWwoImNlbnRpbWV0ZXJzIikpIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIgKiAyLjU0Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoInB0IikgfHwgc3RyVW5pdC5FcXVhbCgicG9pbnRzIikpIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoIm1wIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGlwb2ludHMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgKiAxMDAwOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQuRXF1YWwoIm1wIikgfHwNCisgICAgICAgICAgICAgICAgICAgc3RyRmlyc3RVbml0LkVxdWFsKCJtaWxsaXBvaW50cyIpKSB7DQorICAgICAgICAgIGlmIChzdHJVbml0LkVxdWFsKCJtbSIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpbWV0ZXJzIikpIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIwMDAgKiAyNS40Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoImNtIikgfHwgc3RyVW5pdC5FcXVhbCgiY2VudGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MjAwMCAqIDIuNTQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgicHQiKSB8fCBzdHJVbml0LkVxdWFsKCJwb2ludHMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyAxMDAwOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoIm1wIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGlwb2ludHMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXI7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyMDAwOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkUmVzdWx0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDApOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHVuaXRzcGFuVmFsdWUpOw0KKyAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZSh1bml0VmFsdWUpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJVbml0VmFsdWUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6QXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzdHJpbmdUd287DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3bywgc3RyaW5nVHdvKTsNCisgICAgICBpZiAoc3RyaW5nVHdvLklzRW1wdHkoKSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDEpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHJpbmdPbmU7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBzdHJpbmdPbmUpOw0KKyAgICAgICAgRlhfU1RSU0laRSBpUG9zaXRpb24gPSBzdHJpbmdPbmUuRmluZChzdHJpbmdUd28pOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIGlQb3NpdGlvbiArIDEpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJBdCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpDb25jYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID49IDEpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0U3RyaW5nOw0KKyAgICBGWF9CT09MIGJBbGxOdWxsID0gVFJVRTsNCisgICAgRlhKU0VfSFZBTFVFKiBhcmdWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGFyZ2MpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsNCisgICAgICBhcmdWYWx1ZXNbaV0gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIGkpOw0KKyAgICAgIGlmICghSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdWYWx1ZXNbaV0pKSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyB2YWx1ZVN0cjsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdWYWx1ZXNbaV0sIHZhbHVlU3RyKTsNCisgICAgICAgIHJlc3VsdFN0cmluZyArPSB2YWx1ZVN0cjsNCisgICAgICAgIGJBbGxOdWxsID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWVzW2ldKTsNCisgICAgfQ0KKyAgICBGWF9GcmVlKGFyZ1ZhbHVlcyk7DQorICAgIGlmIChiQWxsTnVsbCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgcmVzdWx0U3RyaW5nKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkNvbmNhdCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpEZWNvZGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgdG9EZWNvZGVTdHJpbmc7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgdG9EZWNvZGVTdHJpbmcpOw0KKyAgICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7DQorICAgICAgRGVjb2RlVVJMKHRvRGVjb2RlU3RyaW5nLCByZXN1bHRCdWYpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmLkdldEJ5dGVTdHJpbmcoKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIGlmIChhcmdjID09IDIpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyB0b0RlY29kZVN0cmluZzsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCB0b0RlY29kZVN0cmluZyk7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgaWRlbnRpZnlTdHJpbmc7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3bywgaWRlbnRpZnlTdHJpbmcpOw0KKyAgICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7DQorICAgICAgaWYgKGlkZW50aWZ5U3RyaW5nLkVxdWFsTm9DYXNlKEZYX0JTVFJDKCJodG1sIikpKSB7DQorICAgICAgICBEZWNvZGVIVE1MKHRvRGVjb2RlU3RyaW5nLCByZXN1bHRCdWYpOw0KKyAgICAgIH0gZWxzZSBpZiAoaWRlbnRpZnlTdHJpbmcuRXF1YWxOb0Nhc2UoRlhfQlNUUkMoInhtbCIpKSkgew0KKyAgICAgICAgRGVjb2RlWE1MKHRvRGVjb2RlU3RyaW5nLCByZXN1bHRCdWYpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBEZWNvZGVVUkwodG9EZWNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmLkdldEJ5dGVTdHJpbmcoKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiRGVjb2RlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZVVSTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VVJMU3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0U3RyaW5nKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1VSTFN0cmluZyA9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VVJMU3RyaW5nLkdldENTdHIoKSwgc3pVUkxTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBEYXRhID0gd3NVUkxTdHJpbmc7DQorICBpbnQzMl90IGlMZW4gPSB3c1VSTFN0cmluZy5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBGWF9XQ0hBUiBjaCA9IDA7DQorICBGWF9XQ0hBUiBjaFRlbXAgPSAwOw0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOw0KKyAgd2hpbGUgKGkgPCBpTGVuKSB7DQorICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICBpZiAoJyUnID09IGNoKSB7DQorICAgICAgY2hUZW1wID0gMDsNCisgICAgICBpbnQzMl90IGlDb3VudCA9IDA7DQorICAgICAgd2hpbGUgKGlDb3VudCA8IDIpIHsNCisgICAgICAgICsraTsNCisgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgaWYgKGNoIDw9ICc5JyAmJiBjaCA+PSAnMCcpIHsNCisgICAgICAgICAgaWYgKCFpQ291bnQpIHsNCisgICAgICAgICAgICBjaFRlbXAgKz0gKGNoIC0gJzAnKSAqIDE2Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNoVGVtcCArPSAoY2ggLSAnMCcpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpZiAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykgew0KKyAgICAgICAgICAgIGlmICghaUNvdW50KSB7DQorICAgICAgICAgICAgICBjaFRlbXAgKz0gKGNoIC0gJ0EnICsgMTApICogMTY7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGNoVGVtcCArPSAoY2ggLSAnQScgKyAxMCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHsNCisgICAgICAgICAgICBpZiAoIWlDb3VudCkgew0KKyAgICAgICAgICAgICAgY2hUZW1wICs9IChjaCAtICdhJyArIDEwKSAqIDE2Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBjaFRlbXAgKz0gKGNoIC0gJ2EnICsgMTApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5DbGVhcigpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgKytpQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2hUZW1wKTsNCisgICAgfSBlbHNlIHsNCisgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgfQ0KKyAgICArK2k7DQorICB9DQorICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOw0KKyAgc3pSZXN1bHRTdHJpbmcgPQ0KKyAgICAgIEZYX1VURjhFbmNvZGUod3NSZXN1bHRCdWYuR2V0QnVmZmVyKCksIHdzUmVzdWx0QnVmLkdldExlbmd0aCgpKTsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RGVjb2RlSFRNTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6SFRNTFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3pSZXN1bHRTdHJpbmcpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzSFRNTFN0cmluZyA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgNCisgICAgICBzekhUTUxTdHJpbmcuR2V0Q1N0cigpLCBzekhUTUxTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgRlhfV0NIQVIgc3RyU3RyaW5nWzldOw0KKyAgaW50MzJfdCBpU3RySW5kZXggPSAwOw0KKyAgaW50MzJfdCBpTGVuID0gd3NIVE1MU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGludDMyX3QgaUNvZGUgPSAwOw0KKyAgRlhfV0NIQVIgY2ggPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBEYXRhID0gd3NIVE1MU3RyaW5nOw0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOw0KKyAgd2hpbGUgKGkgPCBpTGVuKSB7DQorICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICBpZiAoY2ggPT0gJyYnKSB7DQorICAgICAgKytpOw0KKyAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgIGlmIChjaCA9PSAnIycpIHsNCisgICAgICAgICsraTsNCisgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgaWYgKGNoID09ICd4JyB8fCBjaCA9PSAnWCcpIHsNCisgICAgICAgICAgKytpOw0KKyAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgICAgaWYgKChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPD0gJ2YnICYmIGNoID49ICdhJykgfHwNCisgICAgICAgICAgICAgIChjaCA8PSAnRicgJiYgY2ggPj0gJ0EnKSkgew0KKyAgICAgICAgICAgIHdoaWxlIChjaCAhPSAnOycgJiYgaSA8IGlMZW4pIHsNCisgICAgICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7DQorICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJzAnOw0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnZicgJiYgY2ggPj0gJ2EnKSB7DQorICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJ2EnICsgMTA7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdGJyAmJiBjaCA+PSAnQScpIHsNCisgICAgICAgICAgICAgICAgaUNvZGUgKz0gY2ggLSAnQScgKyAxMDsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkNsZWFyKCk7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgIGlDb2RlICo9IDE2Ow0KKyAgICAgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlDb2RlIC89IDE2Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c1Jlc3VsdEJ1Zi5DbGVhcigpOw0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdoaWxlIChjaCAhPSAnOycgJiYgaSA8IGlMZW4pIHsNCisgICAgICAgICAgc3RyU3RyaW5nW2lTdHJJbmRleCsrXSA9IGNoOw0KKyAgICAgICAgICArK2k7DQorICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RyU3RyaW5nW2lTdHJJbmRleF0gPSAwOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgICArK2k7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgdWludDMyX3QgaURhdGEgPSAwOw0KKyAgICBpZiAoSFRNTFNUUjJDb2RlKHN0clN0cmluZywgaURhdGEpKSB7DQorICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigoRlhfV0NIQVIpaURhdGEpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoaUNvZGUpOw0KKyAgICB9DQorICAgIGlTdHJJbmRleCA9IDA7DQorICAgIHN0clN0cmluZ1tpU3RySW5kZXhdID0gMDsNCisgICAgKytpOw0KKyAgfQ0KKyAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCisgIHN6UmVzdWx0U3RyaW5nID0NCisgICAgICBGWF9VVEY4RW5jb2RlKHdzUmVzdWx0QnVmLkdldEJ1ZmZlcigpLCB3c1Jlc3VsdEJ1Zi5HZXRMZW5ndGgoKSk7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZVhNTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6WE1MU3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0U3RyaW5nKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1hNTFN0cmluZyA9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6WE1MU3RyaW5nLkdldENTdHIoKSwgc3pYTUxTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgRlhfV0NIQVIgc3RyU3RyaW5nWzldOw0KKyAgaW50MzJfdCBpU3RySW5kZXggPSAwOw0KKyAgaW50MzJfdCBpTGVuID0gd3NYTUxTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaW50MzJfdCBpQ29kZSA9IDA7DQorICBGWF9XQ0hBUiBjaCA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c1hNTFN0cmluZzsNCisgIENGWF9XaWRlVGV4dEJ1ZiB3c1hNTEJ1ZjsNCisgIHdoaWxlIChpIDwgaUxlbikgew0KKyAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgaWYgKGNoID09ICcmJykgew0KKyAgICAgICsraTsNCisgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICBpZiAoY2ggPT0gJyMnKSB7DQorICAgICAgICArK2k7DQorICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgIGlmIChjaCA9PSAneCcgfHwgY2ggPT0gJ1gnKSB7DQorICAgICAgICAgICsraTsNCisgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQorICAgICAgICAgIGlmICgoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHx8DQorICAgICAgICAgICAgICAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykpIHsNCisgICAgICAgICAgICB3aGlsZSAoY2ggIT0gJzsnKSB7DQorICAgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jykgew0KKyAgICAgICAgICAgICAgICBpQ29kZSArPSBjaCAtICcwJzsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJ2YnICYmIGNoID49ICdhJykgew0KKyAgICAgICAgICAgICAgICBpQ29kZSArPSBjaCAtICdhJyArIDEwOw0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnRicgJiYgY2ggPj0gJ0EnKSB7DQorICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJ0EnICsgMTA7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICB3c1hNTEJ1Zi5DbGVhcigpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICBpQ29kZSAqPSAxNjsNCisgICAgICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpQ29kZSAvPSAxNjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NYTUxCdWYuQ2xlYXIoKTsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB3aGlsZSAoY2ggIT0gJzsnICYmIGkgPCBpTGVuKSB7DQorICAgICAgICAgIHN0clN0cmluZ1tpU3RySW5kZXgrK10gPSBjaDsNCisgICAgICAgICAgKytpOw0KKyAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgIH0NCisgICAgICAgIHN0clN0cmluZ1tpU3RySW5kZXhdID0gMDsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcihjaCk7DQorICAgICAgKytpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGNvbnN0IEZYX1dDSEFSKiBjb25zdCBzdHJOYW1lW10gPSB7TCJxdW90IiwgTCJhbXAiLCBMImFwb3MiLCBMImx0IiwgTCJndCJ9Ow0KKyAgICBpbnQzMl90IGlJbmRleCA9IDA7DQorICAgIHdoaWxlIChpSW5kZXggPCA1KSB7DQorICAgICAgaWYgKEZYU1lTX21lbWNtcChzdHJTdHJpbmcsIHN0ck5hbWVbaUluZGV4XSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3djc2xlbihzdHJOYW1lW2lJbmRleF0pKSA9PSAwKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgKytpSW5kZXg7DQorICAgIH0NCisgICAgc3dpdGNoIChpSW5kZXgpIHsNCisgICAgICBjYXNlIDA6DQorICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKCciJyk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDE6DQorICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKCcmJyk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDI6DQorICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKCdcJycpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAzOg0KKyAgICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcignPCcpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSA0Og0KKyAgICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcignPicpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIHdzWE1MQnVmLkFwcGVuZENoYXIoaUNvZGUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaVN0ckluZGV4ID0gMDsNCisgICAgc3RyU3RyaW5nW2lTdHJJbmRleF0gPSAwOw0KKyAgICArK2k7DQorICAgIGlDb2RlID0gMDsNCisgIH0NCisgIHdzWE1MQnVmLkFwcGVuZENoYXIoMCk7DQorICBzelJlc3VsdFN0cmluZyA9IEZYX1VURjhFbmNvZGUod3NYTUxCdWYuR2V0QnVmZmVyKCksIHdzWE1MQnVmLkdldExlbmd0aCgpKTsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RW5jb2RlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHRvRW5jb2RlU3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHRvRW5jb2RlU3RyaW5nKTsNCisgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0QnVmOw0KKyAgICAgIEVuY29kZVVSTCh0b0VuY29kZVN0cmluZywgcmVzdWx0QnVmKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1Zi5HZXRCeXRlU3RyaW5nKCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSBpZiAoYXJnYyA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgdG9FbmNvZGVTdHJpbmc7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgdG9FbmNvZGVTdHJpbmcpOw0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGlkZW50aWZ5U3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIGlkZW50aWZ5U3RyaW5nKTsNCisgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0QnVmOw0KKyAgICAgIGlmIChpZGVudGlmeVN0cmluZy5FcXVhbE5vQ2FzZShGWF9CU1RSQygiaHRtbCIpKSkgew0KKyAgICAgICAgRW5jb2RlSFRNTCh0b0VuY29kZVN0cmluZywgcmVzdWx0QnVmKTsNCisgICAgICB9IGVsc2UgaWYgKGlkZW50aWZ5U3RyaW5nLkVxdWFsTm9DYXNlKEZYX0JTVFJDKCJ4bWwiKSkpIHsNCisgICAgICAgIEVuY29kZVhNTCh0b0VuY29kZVN0cmluZywgcmVzdWx0QnVmKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRW5jb2RlVVJMKHRvRW5jb2RlU3RyaW5nLCByZXN1bHRCdWYpOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1Zi5HZXRCeXRlU3RyaW5nKCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkVuY29kZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpFbmNvZGVVUkwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelVSTFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zikgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NVUkxTdHJpbmcgPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelVSTFN0cmluZy5HZXRDU3RyKCksIHN6VVJMU3RyaW5nLkdldExlbmd0aCgpKTsNCisgIENGWF9XaWRlVGV4dEJ1ZiB3c1Jlc3VsdEJ1ZjsNCisgIEZYX1dDSEFSIGNoID0gMDsNCisgIGludDMyX3QgaUxlbmd0aCA9IHdzVVJMU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgRlhfV0NIQVIgc3RyRW5jb2RlWzRdOw0KKyAgc3RyRW5jb2RlWzBdID0gJyUnOw0KKyAgc3RyRW5jb2RlWzNdID0gMDsNCisgIEZYX1dDSEFSIHN0clVuc2FmZVtdID0geycgJywgJzwnLCAgJz4nLCAnIicsICcjJywgJyUnLCAneycsICd9JywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICd8JywgJ1xcJywgJ14nLCAnficsICdbJywgJ10nLCAnYCd9Ow0KKyAgRlhfV0NIQVIgc3RyUmVzZXJ2ZWRbXSA9IHsnOycsICcvJywgJz8nLCAnOicsICdAJywgJz0nLCAnJid9Ow0KKyAgRlhfV0NIQVIgc3RyU3BlY2lhbFtdID0geyckJywgJy0nLCAnKycsICchJywgJyonLCAnXCcnLCAnKCcsICcpJywgJywnfTsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHJDb2RlID0gTCIwMTIzNDU2Nzg5YWJjZGVmIjsNCisgIGZvciAoaW50MzJfdCB1ID0gMDsgdSA8IGlMZW5ndGg7ICsrdSkgew0KKyAgICBjaCA9IHdzVVJMU3RyaW5nLkdldEF0KHUpOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBpbnQzMl90IGlDb3VudCA9IHNpemVvZihzdHJVbnNhZmUpIC8gc2l6ZW9mKHN0clVuc2FmZVswXSk7DQorICAgIHdoaWxlIChpIDwgaUNvdW50KSB7DQorICAgICAgaWYgKGNoID09IHN0clVuc2FmZVtpXSkgew0KKyAgICAgICAgaW50MzJfdCBpSW5kZXggPSBjaCAvIDE2Ow0KKyAgICAgICAgc3RyRW5jb2RlWzFdID0gc3RyQ29kZVtpSW5kZXhdOw0KKyAgICAgICAgc3RyRW5jb2RlWzJdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsNCisgICAgICAgIHdzUmVzdWx0QnVmIDw8IEZYX1dTVFJDKHN0ckVuY29kZSk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgKytpOw0KKyAgICB9DQorICAgIGlmIChpIDwgaUNvdW50KSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaSA9IDA7DQorICAgIGlDb3VudCA9IHNpemVvZihzdHJSZXNlcnZlZCkgLyBzaXplb2Yoc3RyUmVzZXJ2ZWRbMF0pOw0KKyAgICB3aGlsZSAoaSA8IGlDb3VudCkgew0KKyAgICAgIGlmIChjaCA9PSBzdHJSZXNlcnZlZFtpXSkgew0KKyAgICAgICAgaW50MzJfdCBpSW5kZXggPSBjaCAvIDE2Ow0KKyAgICAgICAgc3RyRW5jb2RlWzFdID0gc3RyQ29kZVtpSW5kZXhdOw0KKyAgICAgICAgc3RyRW5jb2RlWzJdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsNCisgICAgICAgIHdzUmVzdWx0QnVmIDw8IEZYX1dTVFJDKHN0ckVuY29kZSk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgKytpOw0KKyAgICB9DQorICAgIGlmIChpIDwgaUNvdW50KSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaSA9IDA7DQorICAgIGlDb3VudCA9IHNpemVvZihzdHJTcGVjaWFsKSAvIHNpemVvZihzdHJTcGVjaWFsWzBdKTsNCisgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsNCisgICAgICBpZiAoY2ggPT0gc3RyU3BlY2lhbFtpXSkgew0KKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihjaCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgKytpOw0KKyAgICB9DQorICAgIGlmIChpIDwgaUNvdW50KSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGNoID49IDB4ODAgJiYgY2ggPD0gMHhmZikgew0KKyAgICAgIGludDMyX3QgaUluZGV4ID0gY2ggLyAxNjsNCisgICAgICBzdHJFbmNvZGVbMV0gPSBzdHJDb2RlW2lJbmRleF07DQorICAgICAgc3RyRW5jb2RlWzJdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsNCisgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KKyAgICB9IGVsc2UgaWYgKChjaCA+PSAweDAgJiYgY2ggPD0gMHgxZikgfHwgY2ggPT0gMHg3Zikgew0KKyAgICAgIGludDMyX3QgaUluZGV4ID0gY2ggLyAxNjsNCisgICAgICBzdHJFbmNvZGVbMV0gPSBzdHJDb2RlW2lJbmRleF07DQorICAgICAgc3RyRW5jb2RlWzJdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsNCisgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KKyAgICB9IGVsc2UgaWYgKGNoID49IDB4MjAgJiYgY2ggPD0gMHg3ZSkgew0KKyAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2gpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGludDMyX3QgaVJhZGl4ID0gMTY7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyVG1wOw0KKyAgICAgIHdoaWxlIChjaCA+PSBpUmFkaXgpIHsNCisgICAgICAgIEZYX1dDSEFSIHRtcCA9IHN0ckNvZGVbY2ggJSBpUmFkaXhdOw0KKyAgICAgICAgY2ggLz0gaVJhZGl4Ow0KKyAgICAgICAgc3RyVG1wICs9IHRtcDsNCisgICAgICB9DQorICAgICAgc3RyVG1wICs9IHN0ckNvZGVbY2hdOw0KKyAgICAgIGludDMyX3QgaUxlbiA9IHN0clRtcC5HZXRMZW5ndGgoKTsNCisgICAgICBpZiAoaUxlbiA8IDIpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpbnQzMl90IGlJbmRleCA9IDA7DQorICAgICAgaWYgKGlMZW4gJSAyICE9IDApIHsNCisgICAgICAgIHN0ckVuY29kZVsxXSA9ICcwJzsNCisgICAgICAgIHN0ckVuY29kZVsyXSA9IHN0clRtcC5HZXRBdChpTGVuIC0gMSk7DQorICAgICAgICBpSW5kZXggPSBpTGVuIC0gMjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgc3RyRW5jb2RlWzFdID0gc3RyVG1wLkdldEF0KGlMZW4gLSAxKTsNCisgICAgICAgIHN0ckVuY29kZVsyXSA9IHN0clRtcC5HZXRBdChpTGVuIC0gMik7DQorICAgICAgICBpSW5kZXggPSBpTGVuIC0gMzsNCisgICAgICB9DQorICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCisgICAgICB3aGlsZSAoaUluZGV4ID4gMCkgew0KKyAgICAgICAgc3RyRW5jb2RlWzFdID0gc3RyVG1wLkdldEF0KGlJbmRleCk7DQorICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJUbXAuR2V0QXQoaUluZGV4IC0gMSk7DQorICAgICAgICBpSW5kZXggLT0gMjsNCisgICAgICAgIHdzUmVzdWx0QnVmIDw8IEZYX1dTVFJDKHN0ckVuY29kZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOw0KKyAgc3pSZXN1bHRCdWYgPSBGWF9VVEY4RW5jb2RlKHdzUmVzdWx0QnVmLkdldEJ1ZmZlcigpLCB3c1Jlc3VsdEJ1Zi5HZXRMZW5ndGgoKSk7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkVuY29kZUhUTUwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekhUTUxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0QnVmKSB7DQorICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBzekhUTUxTdHJpbmcuR2V0Q1N0cigpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NIVE1MU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN0ciwgc3RyLkdldExlbmd0aCgpKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHJDb2RlID0gTCIwMTIzNDU2Nzg5YWJjZGVmIjsNCisgIEZYX1dDSEFSIHN0ckVuY29kZVs5XTsNCisgIHN0ckVuY29kZVswXSA9ICcmJzsNCisgIHN0ckVuY29kZVsxXSA9ICcjJzsNCisgIHN0ckVuY29kZVsyXSA9ICd4JzsNCisgIHN0ckVuY29kZVs1XSA9ICc7JzsNCisgIHN0ckVuY29kZVs2XSA9IDA7DQorICBzdHJFbmNvZGVbN10gPSAnOyc7DQorICBzdHJFbmNvZGVbOF0gPSAwOw0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOw0KKyAgdWludDMyX3QgY2ggPSAwOw0KKyAgaW50MzJfdCBpTGVuID0gd3NIVE1MU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzSFRNTFN0cmluZzsNCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIGh0bWxSZXNlcnZlOw0KKyAgd2hpbGUgKGkgPCBpTGVuKSB7DQorICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICBodG1sUmVzZXJ2ZS5FbXB0eSgpOw0KKyAgICBpZiAoSFRNTENvZGUyU1RSKGNoLCBodG1sUmVzZXJ2ZSkpIHsNCisgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKEwnJicpOw0KKyAgICAgIHdzUmVzdWx0QnVmIDw8IGh0bWxSZXNlcnZlOw0KKyAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoTCc7Jyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGNoID49IDMyICYmIGNoIDw9IDEyNikgew0KKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigoRlhfV0NIQVIpY2gpOw0KKyAgICAgIH0gZWxzZSBpZiAoY2ggPCAyNTYpIHsNCisgICAgICAgIGlJbmRleCA9IGNoIC8gMTY7DQorICAgICAgICBzdHJFbmNvZGVbM10gPSBzdHJDb2RlW2lJbmRleF07DQorICAgICAgICBzdHJFbmNvZGVbNF0gPSBzdHJDb2RlW2NoIC0gaUluZGV4ICogMTZdOw0KKyAgICAgICAgc3RyRW5jb2RlWzVdID0gJzsnOw0KKyAgICAgICAgc3RyRW5jb2RlWzZdID0gMDsNCisgICAgICAgIHdzUmVzdWx0QnVmIDw8IEZYX1dTVFJDKHN0ckVuY29kZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGludDMyX3QgaUJpZ0J5dGUgPSBjaCAvIDI1NjsNCisgICAgICAgIGludDMyX3QgaUxpdHRsZUJ5dGUgPSBjaCAlIDI1NjsNCisgICAgICAgIHN0ckVuY29kZVszXSA9IHN0ckNvZGVbaUJpZ0J5dGUgLyAxNl07DQorICAgICAgICBzdHJFbmNvZGVbNF0gPSBzdHJDb2RlW2lCaWdCeXRlICUgMTZdOw0KKyAgICAgICAgc3RyRW5jb2RlWzVdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAvIDE2XTsNCisgICAgICAgIHN0ckVuY29kZVs2XSA9IHN0ckNvZGVbaUxpdHRsZUJ5dGUgJSAxNl07DQorICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICArK2k7DQorICB9DQorICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOw0KKyAgc3pSZXN1bHRCdWYgPSBGWF9VVEY4RW5jb2RlKHdzUmVzdWx0QnVmLkdldEJ1ZmZlcigpLCB3c1Jlc3VsdEJ1Zi5HZXRMZW5ndGgoKSk7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkVuY29kZVhNTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6WE1MU3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0QnVmKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1hNTFN0cmluZyA9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6WE1MU3RyaW5nLkdldENTdHIoKSwgc3pYTUxTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOw0KKyAgZW51bSB7DQorICAgIFFVT1QsDQorICAgIEFNUCwNCisgICAgQVBPUywNCisgICAgTFQsDQorICAgIEdULA0KKyAgfTsNCisgIEZYX1dDSEFSIHN0ckVuY29kZVs5XTsNCisgIHN0ckVuY29kZVswXSA9ICcmJzsNCisgIHN0ckVuY29kZVsxXSA9ICcjJzsNCisgIHN0ckVuY29kZVsyXSA9ICd4JzsNCisgIHN0ckVuY29kZVs1XSA9ICc7JzsNCisgIHN0ckVuY29kZVs2XSA9IDA7DQorICBzdHJFbmNvZGVbN10gPSAnOyc7DQorICBzdHJFbmNvZGVbOF0gPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIGNvbnN0IHN0ck5hbWVbXSA9IHtMInF1b3QiLCBMImFtcCIsIEwiYXBvcyIsIEwibHQiLCBMImd0In07DQorICBjb25zdCBGWF9XQ0hBUiogc3RyQ29kZSA9IEwiMDEyMzQ1Njc4OWFiY2RlZiI7DQorICBGWF9XQ0hBUiBjaCA9IDA7DQorICBpbnQzMl90IGlMZW5ndGggPSB3c1hNTFN0cmluZy5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIGludDMyX3QgdSA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c1hNTFN0cmluZzsNCisgIGZvciAodSA9IDA7IHUgPCBpTGVuZ3RoOyArK3UpIHsNCisgICAgY2ggPSAqKHBEYXRhICsgdSk7DQorICAgIHN3aXRjaCAoY2gpIHsNCisgICAgICBjYXNlICciJzoNCisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsNCisgICAgICAgIHdzUmVzdWx0QnVmIDw8IENGWF9XaWRlU3RyaW5nQyhzdHJOYW1lW1FVT1RdKTsNCisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJzsnKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJyYnOg0KKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignJicpOw0KKyAgICAgICAgd3NSZXN1bHRCdWYgPDwgQ0ZYX1dpZGVTdHJpbmdDKHN0ck5hbWVbQU1QXSk7DQorICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdcJyc6DQorICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcmJyk7DQorICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBDRlhfV2lkZVN0cmluZ0Moc3RyTmFtZVtBUE9TXSk7DQorICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICc8JzoNCisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsNCisgICAgICAgIHdzUmVzdWx0QnVmIDw8IENGWF9XaWRlU3RyaW5nQyhzdHJOYW1lW0xUXSk7DQorICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICc+JzoNCisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsNCisgICAgICAgIHdzUmVzdWx0QnVmIDw8IENGWF9XaWRlU3RyaW5nQyhzdHJOYW1lW0dUXSk7DQorICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0OiB7DQorICAgICAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gMTI2KSB7DQorICAgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2gpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA8IDI1Nikgew0KKyAgICAgICAgICBpSW5kZXggPSBjaCAvIDE2Ow0KKyAgICAgICAgICBzdHJFbmNvZGVbM10gPSBzdHJDb2RlW2lJbmRleF07DQorICAgICAgICAgIHN0ckVuY29kZVs0XSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07DQorICAgICAgICAgIHN0ckVuY29kZVs1XSA9ICc7JzsNCisgICAgICAgICAgc3RyRW5jb2RlWzZdID0gMDsNCisgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGludDMyX3QgaUJpZ0J5dGUgPSBjaCAvIDI1NjsNCisgICAgICAgICAgaW50MzJfdCBpTGl0dGxlQnl0ZSA9IGNoICUgMjU2Ow0KKyAgICAgICAgICBzdHJFbmNvZGVbM10gPSBzdHJDb2RlW2lCaWdCeXRlIC8gMTZdOw0KKyAgICAgICAgICBzdHJFbmNvZGVbNF0gPSBzdHJDb2RlW2lCaWdCeXRlICUgMTZdOw0KKyAgICAgICAgICBzdHJFbmNvZGVbNV0gPSBzdHJDb2RlW2lMaXR0bGVCeXRlIC8gMTZdOw0KKyAgICAgICAgICBzdHJFbmNvZGVbNl0gPSBzdHJDb2RlW2lMaXR0bGVCeXRlICUgMTZdOw0KKyAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7DQorICBzelJlc3VsdEJ1ZiA9IEZYX1VURjhFbmNvZGUod3NSZXN1bHRCdWYuR2V0QnVmZmVyKCksIHdzUmVzdWx0QnVmLkdldExlbmd0aCgpKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6SFRNTFNUUjJDb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBpQ29kZSkgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcERhdGEuR2V0TGVuZ3RoKCk7DQorICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBEYXRhLkdldFB0cigpLCBpTGVuZ3RoKTsNCisgIFhGQV9GTUh0bWxIYXNoZWRSZXNlcnZlQ29kZSBodG1saGFzaGVkcmVzZXJ2ZWNvZGU7DQorICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgIGlFbmQgPSAoc2l6ZW9mKHJlc2VydmVzRm9yRGVjb2RlKSAvIHNpemVvZihyZXNlcnZlc0ZvckRlY29kZVswXSkpIC0gMTsNCisgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBodG1saGFzaGVkcmVzZXJ2ZWNvZGUgPSByZXNlcnZlc0ZvckRlY29kZVtpTWlkXTsNCisgICAgaWYgKHVIYXNoID09IGh0bWxoYXNoZWRyZXNlcnZlY29kZS5tX3VIYXNoKSB7DQorICAgICAgaUNvZGUgPSBodG1saGFzaGVkcmVzZXJ2ZWNvZGUubV91Q29kZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfSBlbHNlIGlmICh1SGFzaCA8IGh0bWxoYXNoZWRyZXNlcnZlY29kZS5tX3VIYXNoKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkhUTUxDb2RlMlNUUih1aW50MzJfdCBpQ29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzSFRNTFJlc2VydmUpIHsNCisgIFhGQV9GTUh0bWxSZXNlcnZlQ29kZSBodG1scmVzZXJ2ZWNvZGU7DQorICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgIGlFbmQgPSAoc2l6ZW9mKHJlc2VydmVzRm9yRW5jb2RlKSAvIHNpemVvZihyZXNlcnZlc0ZvckVuY29kZVswXSkpIC0gMTsNCisgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBodG1scmVzZXJ2ZWNvZGUgPSByZXNlcnZlc0ZvckVuY29kZVtpTWlkXTsNCisgICAgaWYgKGlDb2RlID09IGh0bWxyZXNlcnZlY29kZS5tX3VDb2RlKSB7DQorICAgICAgd3NIVE1MUmVzZXJ2ZSA9IGh0bWxyZXNlcnZlY29kZS5tX2h0bWxSZXNlcnZlOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGVsc2UgaWYgKGlDb2RlIDwgaHRtbHJlc2VydmVjb2RlLm1fdUNvZGUpIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0NCisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgIHJldHVybiBGQUxTRTsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX1BBVFRFUk5fU1RSSU5HX1R5cGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHBhdHRlcm5UeXBlKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1BhdHRlcm4gPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelBhdHRlcm4uR2V0Q1N0cigpLCBzelBhdHRlcm4uR2V0TGVuZ3RoKCkpOw0KKyAgaWYgKEZYX1dTVFJDKEwiZGF0ZXRpbWUiKSA9PSB3c1BhdHRlcm4uTGVmdCg4KSkgew0KKyAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9EQVRFVElNRTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9IGVsc2UgaWYgKEZYX1dTVFJDKEwiZGF0ZSIpID09IHdzUGF0dGVybi5MZWZ0KDQpKSB7DQorICAgIHBhdHRlcm5UeXBlID0gd3NQYXR0ZXJuLkZpbmQoTCJ0aW1lIikgPiAwID8gWEZBX1ZUX0RBVEVUSU1FIDogWEZBX1ZUX0RBVEU7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfSBlbHNlIGlmIChGWF9XU1RSQyhMInRpbWUiKSA9PSB3c1BhdHRlcm4uTGVmdCg0KSkgew0KKyAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9USU1FOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0gZWxzZSBpZiAoRlhfV1NUUkMoTCJ0ZXh0IikgPT0gd3NQYXR0ZXJuLkxlZnQoNCkpIHsNCisgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVEVYVDsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9IGVsc2UgaWYgKEZYX1dTVFJDKEwibnVtIikgPT0gd3NQYXR0ZXJuLkxlZnQoMykpIHsNCisgICAgaWYgKEZYX1dTVFJDKEwiaW50ZWdlciIpID09IHdzUGF0dGVybi5NaWQoNCwgNykpIHsNCisgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9JTlRFR0VSOw0KKyAgICB9IGVsc2UgaWYgKEZYX1dTVFJDKEwiZGVjaW1hbCIpID09IHdzUGF0dGVybi5NaWQoNCwgNykpIHsNCisgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9ERUNJTUFMOw0KKyAgICB9IGVsc2UgaWYgKEZYX1dTVFJDKEwiY3VycmVuY3kiKSA9PSB3c1BhdHRlcm4uTWlkKDQsIDgpKSB7DQorICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfRkxPQVQ7DQorICAgIH0gZWxzZSBpZiAoRlhfV1NUUkMoTCJwZXJjZW50IikgPT0gd3NQYXR0ZXJuLk1pZCg0LCA3KSkgew0KKyAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcGF0dGVyblR5cGUgPSBYRkFfVlRfTlVMTDsNCisgIHdzUGF0dGVybi5NYWtlTG93ZXIoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzUGF0dGVybjsNCisgIGludDMyX3QgaUxlbmd0aCA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIEZYX0JPT0wgYlNpbmdsZVF1b3RhdGlvbiA9IEZBTFNFOw0KKyAgRlhfV0NIQVIgcGF0dGVybkNoYXI7DQorICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICBwYXR0ZXJuQ2hhciA9ICoocERhdGEgKyBpSW5kZXgpOw0KKyAgICBpZiAocGF0dGVybkNoYXIgPT0gMHgyNykgew0KKyAgICAgIGJTaW5nbGVRdW90YXRpb24gPSAhYlNpbmdsZVF1b3RhdGlvbjsNCisgICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJg0KKyAgICAgICAgICAgICAgIChwYXR0ZXJuQ2hhciA9PSAneScgfHwgcGF0dGVybkNoYXIgPT0gJ2onKSkgew0KKyAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0RBVEU7DQorICAgICAgaUluZGV4Kys7DQorICAgICAgRlhfV0NIQVIgdGltZVBhdHRlcm5DaGFyOw0KKyAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICB0aW1lUGF0dGVybkNoYXIgPSAqKHBEYXRhICsgaUluZGV4KTsNCisgICAgICAgIGlmICh0aW1lUGF0dGVybkNoYXIgPT0gMHgyNykgew0KKyAgICAgICAgICBiU2luZ2xlUXVvdGF0aW9uID0gIWJTaW5nbGVRdW90YXRpb247DQorICAgICAgICB9IGVsc2UgaWYgKCFiU2luZ2xlUXVvdGF0aW9uICYmIHRpbWVQYXR0ZXJuQ2hhciA9PSAndCcpIHsNCisgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfREFURVRJTUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUluZGV4Kys7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9IGVsc2UgaWYgKCFiU2luZ2xlUXVvdGF0aW9uICYmDQorICAgICAgICAgICAgICAgKHBhdHRlcm5DaGFyID09ICdoJyB8fCBwYXR0ZXJuQ2hhciA9PSAnaycpKSB7DQorICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVElNRTsNCisgICAgICBicmVhazsNCisgICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJg0KKyAgICAgICAgICAgICAgIChwYXR0ZXJuQ2hhciA9PSAnYScgfHwgcGF0dGVybkNoYXIgPT0gJ3gnIHx8DQorICAgICAgICAgICAgICAgIHBhdHRlcm5DaGFyID09ICdvJyB8fCBwYXR0ZXJuQ2hhciA9PSAnMCcpKSB7DQorICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVEVYVDsNCisgICAgICBpZiAocGF0dGVybkNoYXIgPT0gJ3gnIHx8IHBhdHRlcm5DaGFyID09ICdvJyB8fCBwYXR0ZXJuQ2hhciA9PSAnMCcpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJg0KKyAgICAgICAgICAgICAgIChwYXR0ZXJuQ2hhciA9PSAneicgfHwgcGF0dGVybkNoYXIgPT0gJ3MnIHx8DQorICAgICAgICAgICAgICAgIHBhdHRlcm5DaGFyID09ICdlJyB8fCBwYXR0ZXJuQ2hhciA9PSAndicgfHwNCisgICAgICAgICAgICAgICAgcGF0dGVybkNoYXIgPT0gJzgnIHx8IHBhdHRlcm5DaGFyID09ICcsJyB8fA0KKyAgICAgICAgICAgICAgICBwYXR0ZXJuQ2hhciA9PSAnLicgfHwgcGF0dGVybkNoYXIgPT0gJyQnKSkgew0KKyAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgICAgIGlmIChwYXR0ZXJuQ2hhciA9PSAndicgfHwgcGF0dGVybkNoYXIgPT0gJzgnIHx8IHBhdHRlcm5DaGFyID09ICckJykgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlJbmRleCsrOw0KKyAgfQ0KKyAgaWYgKHBhdHRlcm5UeXBlID09IFhGQV9WVF9OVUxMKSB7DQorICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RFWFQgfCBYRkFfVlRfRkxPQVQ7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkZvcm1hdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPj0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIENGWF9CeXRlU3RyaW5nIHN6UGF0dGVybjsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc3pQYXR0ZXJuKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pWYWx1ZTsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3bywgc3pWYWx1ZSk7DQorICAgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgSUZYX0xvY2FsZU1nciogcE1nciA9IChJRlhfTG9jYWxlTWdyKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KKyAgICBDWEZBX09iamVjdCogcFRoaXNOb2RlID0gcERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCk7DQorICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCisgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEoKENYRkFfTm9kZSopcFRoaXNOb2RlKTsNCisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCisgICAgRlhfRFdPUkQgcGF0dGVyblR5cGU7DQorICAgIEZYX0JPT0wgYkNvbXBlbHRlID0gWEZBX1BBVFRFUk5fU1RSSU5HX1R5cGUoc3pQYXR0ZXJuLCBwYXR0ZXJuVHlwZSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUGF0dGVybiA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pQYXR0ZXJuLCBzelBhdHRlcm4uR2V0TGVuZ3RoKCkpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelZhbHVlLCBzelZhbHVlLkdldExlbmd0aCgpKTsNCisgICAgaWYgKCFiQ29tcGVsdGUpIHsNCisgICAgICBzd2l0Y2ggKHBhdHRlcm5UeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9WVF9EQVRFVElNRTogew0KKyAgICAgICAgICBGWF9TVFJTSVpFIGlUQ2hhciA9IHdzUGF0dGVybi5GaW5kKEwnVCcpOw0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGVQYXR0ZXJuID0gRlhfV1NUUkMoTCJkYXRleyIpOw0KKyAgICAgICAgICB3c0RhdGVQYXR0ZXJuICs9IHdzUGF0dGVybi5MZWZ0KGlUQ2hhcik7DQorICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9ICIpOw0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWVQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0aW1leyIpOw0KKyAgICAgICAgICB3c1RpbWVQYXR0ZXJuICs9IHdzUGF0dGVybi5NaWQoaVRDaGFyICsgMSk7DQorICAgICAgICAgIHdzVGltZVBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgIHdzUGF0dGVybiA9IHdzRGF0ZVBhdHRlcm4gKyB3c1RpbWVQYXR0ZXJuOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6IHsNCisgICAgICAgICAgd3NQYXR0ZXJuID0gRlhfV1NUUkMoTCJkYXRleyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfVlRfVElNRTogew0KKyAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMInRpbWV7IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgIHdzUGF0dGVybiArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9WVF9URVhUOiB7DQorICAgICAgICAgIHdzUGF0dGVybiA9IEZYX1dTVFJDKEwidGV4dHsiKSArIHdzUGF0dGVybjsNCisgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX1ZUX0ZMT0FUOiB7DQorICAgICAgICAgIHdzUGF0dGVybiA9IEZYX1dTVFJDKEwibnVteyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1Rlc3RQYXR0ZXJuOw0KKyAgICAgICAgICB3c1Rlc3RQYXR0ZXJuID0gRlhfV1NUUkMoTCJudW17IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgIHdzVGVzdFBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgdGVtcExvY2FsZVZhbHVlKFhGQV9WVF9GTE9BVCwgd3NWYWx1ZSwgd3NUZXN0UGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgICAgICAgICAgaWYgKHRlbXBMb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgICB3c1BhdHRlcm4gPSB3c1Rlc3RQYXR0ZXJuOw0KKyAgICAgICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzVGVzdFBhdHRlcm4gPSBGWF9XU1RSQyhMInRleHR7IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgICAgd3NUZXN0UGF0dGVybiArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgICAgICAgICB3c1BhdHRlcm4gPSB3c1Rlc3RQYXR0ZXJuOw0KKyAgICAgICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RFWFQ7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1JldDsNCisgICAgaWYgKGxvY2FsZVZhbHVlLkZvcm1hdFBhdHRlcm5zKHdzUmV0LCB3c1BhdHRlcm4sIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VVEY4RW5jb2RlKHdzUmV0LCB3c1JldC5HZXRMZW5ndGgoKSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkZvcm1hdCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMZWZ0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEZYX0JPT0wgYXJnSXNOdWxsID0gRkFMU0U7DQorICAgIGlmICgoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB8fCAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSkgew0KKyAgICAgIGFyZ0lzTnVsbCA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKGFyZ0lzTnVsbCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmc7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc291cmNlU3RyaW5nKTsNCisgICAgICBpbnQzMl90IGNvdW50ID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIGlmIChjb3VudCA8IDApIHsNCisgICAgICAgIGNvdW50ID0gMDsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTdHJpbmcuTGVmdChjb3VudCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkxlZnQiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TGVuKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHNvdXJjZVN0cmluZyk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIHNvdXJjZVN0cmluZy5HZXRMZW5ndGgoKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkxlbiIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMb3dlcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCAzKSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBhcmdTdHJpbmc7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgbG9jYWxlVmFsdWUgPSAwOw0KKyAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgIGxvY2FsZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICB9DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgYXJnU3RyaW5nKTsNCisgICAgICBDRlhfV2lkZVRleHRCdWYgbG93U3RyaW5nQnVmOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXJnU3RyaW5nID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGFyZ1N0cmluZywgYXJnU3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c0FyZ1N0cmluZzsNCisgICAgICBpbnQzMl90IGlMZW4gPSBhcmdTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICAgICAgaW50MzJfdCBpID0gMDsNCisgICAgICBpbnQzMl90IGNoID0gMDsNCisgICAgICB3aGlsZSAoaSA8IGlMZW4pIHsNCisgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgaWYgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg1QSkgew0KKyAgICAgICAgICBjaCArPSAzMjsNCisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHhDMCAmJiBjaCA8PSAweERFKSB7DQorICAgICAgICAgIGNoICs9IDMyOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAweDEwMCB8fCBjaCA9PSAweDEwMiB8fCBjaCA9PSAweDEwNCkgew0KKyAgICAgICAgICBjaCArPSAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbG93U3RyaW5nQnVmLkFwcGVuZENoYXIoY2gpOw0KKyAgICAgICAgKytpOw0KKyAgICAgIH0NCisgICAgICBsb3dTdHJpbmdCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKA0KKyAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgIEZYX1VURjhFbmNvZGUobG93U3RyaW5nQnVmLkdldEJ1ZmZlcigpLCBsb3dTdHJpbmdCdWYuR2V0TGVuZ3RoKCkpKTsNCisgICAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsZVZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTG93ZXIiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6THRyaW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHNvdXJjZVN0cmluZyk7DQorICAgICAgc291cmNlU3RyaW5nLlRyaW1MZWZ0KCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHNvdXJjZVN0cmluZyk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkx0cmltIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlBhcnNlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzelBhdHRlcm47DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc3pQYXR0ZXJuKTsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzelZhbHVlOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIHN6VmFsdWUpOw0KKyAgICAgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgICBJRlhfTG9jYWxlTWdyKiBwTWdyID0gKElGWF9Mb2NhbGVNZ3IqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICAgICAgQ1hGQV9PYmplY3QqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCisgICAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YSgoQ1hGQV9Ob2RlKilwVGhpc05vZGUpOw0KKyAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7DQorICAgICAgRlhfRFdPUkQgcGF0dGVyblR5cGU7DQorICAgICAgRlhfQk9PTCBiQ29tcGxldGVQYXR0ZXJuID0NCisgICAgICAgICAgWEZBX1BBVFRFUk5fU1RSSU5HX1R5cGUoc3pQYXR0ZXJuLCBwYXR0ZXJuVHlwZSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXR0ZXJuID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6UGF0dGVybiwgc3pQYXR0ZXJuLkdldExlbmd0aCgpKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VmFsdWUsIHN6VmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHN6UGFyc2VkVmFsdWU7DQorICAgICAgaWYgKGJDb21wbGV0ZVBhdHRlcm4pIHsNCisgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgc3pQYXJzZWRWYWx1ZSA9IEZYX1VURjhFbmNvZGUobG9jYWxlVmFsdWUuR2V0VmFsdWUoKSk7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzelBhcnNlZFZhbHVlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBzd2l0Y2ggKHBhdHRlcm5UeXBlKSB7DQorICAgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEVUSU1FOiB7DQorICAgICAgICAgICAgRlhfU1RSU0laRSBpVENoYXIgPSB3c1BhdHRlcm4uRmluZChMJ1QnKTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGVQYXR0ZXJuID0gRlhfV1NUUkMoTCJkYXRleyIpOw0KKyAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gKz0gd3NQYXR0ZXJuLkxlZnQoaVRDaGFyKTsNCisgICAgICAgICAgICB3c0RhdGVQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSAiKTsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWVQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0aW1leyIpOw0KKyAgICAgICAgICAgIHdzVGltZVBhdHRlcm4gKz0gd3NQYXR0ZXJuLk1pZChpVENoYXIgKyAxKTsNCisgICAgICAgICAgICB3c1RpbWVQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgIHdzUGF0dGVybiA9IHdzRGF0ZVBhdHRlcm4gKyB3c1RpbWVQYXR0ZXJuOw0KKyAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgICAgICAgICAgaWYgKGxvY2FsZVZhbHVlLklzVmFsaWQoKSkgew0KKyAgICAgICAgICAgICAgc3pQYXJzZWRWYWx1ZSA9IEZYX1VURjhFbmNvZGUobG9jYWxlVmFsdWUuR2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc3pQYXJzZWRWYWx1ZSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgY2FzZSBYRkFfVlRfREFURTogew0KKyAgICAgICAgICAgIHdzUGF0dGVybiA9IEZYX1dTVFJDKEwiZGF0ZXsiKSArIHdzUGF0dGVybjsNCisgICAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShwYXR0ZXJuVHlwZSwgd3NWYWx1ZSwgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgICAgICAgICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgICBzelBhcnNlZFZhbHVlID0gRlhfVVRGOEVuY29kZShsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpKTsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzelBhcnNlZFZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCIiKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICBjYXNlIFhGQV9WVF9USU1FOiB7DQorICAgICAgICAgICAgd3NQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0aW1leyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICAgIHdzUGF0dGVybiArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKHBhdHRlcm5UeXBlLCB3c1ZhbHVlLCB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KKyAgICAgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgICAgIHN6UGFyc2VkVmFsdWUgPSBGWF9VVEY4RW5jb2RlKGxvY2FsZVZhbHVlLkdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHN6UGFyc2VkVmFsdWUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgIGNhc2UgWEZBX1ZUX1RFWFQ6IHsNCisgICAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMInRleHR7IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUoWEZBX1ZUX1RFWFQsIHdzVmFsdWUsIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgICAgICAgICAgaWYgKGxvY2FsZVZhbHVlLklzVmFsaWQoKSkgew0KKyAgICAgICAgICAgICAgc3pQYXJzZWRWYWx1ZSA9IEZYX1VURjhFbmNvZGUobG9jYWxlVmFsdWUuR2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc3pQYXJzZWRWYWx1ZSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgY2FzZSBYRkFfVlRfRkxPQVQ6IHsNCisgICAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMIm51bXsiKSArIHdzUGF0dGVybjsNCisgICAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShYRkFfVlRfRkxPQVQsIHdzVmFsdWUsIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgICAgICAgICAgaWYgKGxvY2FsZVZhbHVlLklzVmFsaWQoKSkgew0KKyAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVWYWx1ZS5HZXREb3VibGVOdW0oKSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVzdFBhdHRlcm47DQorICAgICAgICAgICAgd3NUZXN0UGF0dGVybiA9IEZYX1dTVFJDKEwibnVteyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICAgIHdzVGVzdFBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShYRkFfVlRfRkxPQVQsIHdzVmFsdWUsIHdzVGVzdFBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KKyAgICAgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlVmFsdWUuR2V0RG91YmxlTnVtKCkpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICB3c1Rlc3RQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0ZXh0eyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICAgICAgd3NUZXN0UGF0dGVybiArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUoWEZBX1ZUX1RFWFQsIHdzVmFsdWUsIHdzVGVzdFBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgICAgICAgICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgICAgIHN6UGFyc2VkVmFsdWUgPSBGWF9VVEY4RW5jb2RlKGxvY2FsZVZhbHVlLkdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc3pQYXJzZWRWYWx1ZSk7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlBhcnNlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlcGxhY2UoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPT0gMikgfHwgKGFyZ2MgPT0gMykpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSAwOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBvbmVTdHJpbmc7DQorICAgIENGWF9CeXRlU3RyaW5nIHR3b1N0cmluZzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdGhyZWVTdHJpbmc7DQorICAgIGlmICgoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB8fCAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSkgew0KKyAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgIH0gZWxzZSB7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgb25lU3RyaW5nKTsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLCB0d29TdHJpbmcpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1RocmVlLCB0aHJlZVN0cmluZyk7DQorICAgIH0NCisgICAgaW50MzJfdCBpU3JjTGVuID0gb25lU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICBpbnQzMl90IGlGaW5kTGVuID0gdHdvU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0U3RyaW5nOw0KKyAgICBpbnQzMl90IGlGaW5kSW5kZXggPSAwOw0KKyAgICB1aW50OF90IGNoID0gMDsNCisgICAgZm9yIChpbnQzMl90IHUgPSAwOyB1IDwgaVNyY0xlbjsgKyt1KSB7DQorICAgICAgY2ggPSBvbmVTdHJpbmcuR2V0QXQodSk7DQorICAgICAgaWYgKGNoID09IHR3b1N0cmluZy5HZXRBdChpRmluZEluZGV4KSkgew0KKyAgICAgICAgaW50MzJfdCBpVGVtcCA9IHUgKyAxOw0KKyAgICAgICAgKytpRmluZEluZGV4Ow0KKyAgICAgICAgdWludDhfdCBjaFRlbXAgPSAwOw0KKyAgICAgICAgd2hpbGUgKGlGaW5kSW5kZXggPCBpRmluZExlbikgew0KKyAgICAgICAgICBjaFRlbXAgPSBvbmVTdHJpbmcuR2V0QXQoaVRlbXApOw0KKyAgICAgICAgICBpZiAoY2hUZW1wID09IHR3b1N0cmluZy5HZXRBdChpRmluZEluZGV4KSkgew0KKyAgICAgICAgICAgICsraVRlbXA7DQorICAgICAgICAgICAgKytpRmluZEluZGV4Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlGaW5kSW5kZXggPSAwOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUZpbmRJbmRleCA9PSBpRmluZExlbikgew0KKyAgICAgICAgICByZXN1bHRTdHJpbmcgPDwgdGhyZWVTdHJpbmc7DQorICAgICAgICAgIHUgKz0gaUZpbmRMZW4gLSAxOw0KKyAgICAgICAgICBpRmluZEluZGV4ID0gMDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKGNoKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcmVzdWx0U3RyaW5nLkFwcGVuZENoYXIoY2gpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXN1bHRTdHJpbmcuQXBwZW5kQ2hhcigwKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0U3RyaW5nLkdldEJ5dGVTdHJpbmcoKSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlJlcGxhY2UiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UmlnaHQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBGWF9CT09MIGFyZ0lzTnVsbCA9IEZBTFNFOw0KKyAgICBpZiAoKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgfHwgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSkpIHsNCisgICAgICBhcmdJc051bGwgPSBUUlVFOw0KKyAgICB9DQorICAgIGlmIChhcmdJc051bGwpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHNvdXJjZVN0cmluZyk7DQorICAgICAgaW50MzJfdCBjb3VudCA9IEhWYWx1ZVRvSW50ZWdlcihoVGhpcywgYXJnVHdvKTsNCisgICAgICBpZiAoY291bnQgPCAwKSB7DQorICAgICAgICBjb3VudCA9IDA7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlU3RyaW5nLlJpZ2h0KGNvdW50KSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiUmlnaHQiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UnRyaW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHNvdXJjZVN0cmluZyk7DQorICAgICAgc291cmNlU3RyaW5nLlRyaW1SaWdodCgpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzb3VyY2VTdHJpbmcpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJSdHJpbSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpTcGFjZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGludDMyX3QgY291bnQgPSAwOw0KKyAgICAgIGNvdW50ID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgIGNvdW50ID0gKGNvdW50IDwgMCkgPyAwIDogY291bnQ7DQorICAgICAgQ0ZYX0J5dGVUZXh0QnVmIHNwYWNlU3RyaW5nOw0KKyAgICAgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgICAgIHdoaWxlIChpbmRleCA8IGNvdW50KSB7DQorICAgICAgICBzcGFjZVN0cmluZy5BcHBlbmRCeXRlKCcgJyk7DQorICAgICAgICBpbmRleCsrOw0KKyAgICAgIH0NCisgICAgICBzcGFjZVN0cmluZy5BcHBlbmRCeXRlKDApOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VTdHJpbmcuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiU3BhY2UiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6U3RyKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgNCkpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgZk51bWJlcjsNCisgICAgaW50MzJfdCBpV2lkdGggPSAxMDsNCisgICAgaW50MzJfdCBpUHJlY2lzaW9uID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIG51bWJlclZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIHdpZHRoVmFsdWUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgcHJlY2lzaW9uVmFsdWUgPSAwOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKG51bWJlclZhbHVlKSkgew0KKyAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgIH0gZWxzZSB7DQorICAgICAgZk51bWJlciA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIG51bWJlclZhbHVlKTsNCisgICAgfQ0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICB3aWR0aFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpV2lkdGggPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCB3aWR0aFZhbHVlKTsNCisgICAgfQ0KKyAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgcHJlY2lzaW9uVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgIGlQcmVjaXNpb24gPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBwcmVjaXNpb25WYWx1ZSk7DQorICAgICAgaWYgKGlQcmVjaXNpb24gPCAwKSB7DQorICAgICAgICBpUHJlY2lzaW9uID0gMDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBudW1iZXJTdHJpbmc7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyID0gIiUiOw0KKyAgICAgIGlmIChpUHJlY2lzaW9uKSB7DQorICAgICAgICBmb3JtYXRTdHIgKz0gIi4iOw0KKyAgICAgICAgZm9ybWF0U3RyICs9IENGWF9CeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKGlQcmVjaXNpb24pOw0KKyAgICAgIH0NCisgICAgICBmb3JtYXRTdHIgKz0gImYiOw0KKyAgICAgIG51bWJlclN0cmluZy5Gb3JtYXQoZm9ybWF0U3RyLCBmTnVtYmVyKTsNCisgICAgICBjb25zdCBGWF9DSEFSKiBwRGF0YSA9IG51bWJlclN0cmluZzsNCisgICAgICBpbnQzMl90IGlMZW5ndGggPSBudW1iZXJTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICAgICAgaW50MzJfdCB1ID0gMDsNCisgICAgICB3aGlsZSAodSA8IGlMZW5ndGgpIHsNCisgICAgICAgIGlmICgqKHBEYXRhICsgdSkgPT0gJy4nKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKyt1Ow0KKyAgICAgIH0NCisgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0QnVmOw0KKyAgICAgIGlmICh1ID4gaVdpZHRoIHx8IChpUHJlY2lzaW9uICsgdSkgPj0gaVdpZHRoKSB7DQorICAgICAgICBpbnQzMl90IGkgPSAwOw0KKyAgICAgICAgd2hpbGUgKGkgPCBpV2lkdGgpIHsNCisgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJyonKTsNCisgICAgICAgICAgKytpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmICh1ID09IGlMZW5ndGgpIHsNCisgICAgICAgICAgaWYgKGlMZW5ndGggPiBpV2lkdGgpIHsNCisgICAgICAgICAgICBpbnQzMl90IGkgPSAwOw0KKyAgICAgICAgICAgIHdoaWxlIChpIDwgaVdpZHRoKSB7DQorICAgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcignKicpOw0KKyAgICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpbnQzMl90IGkgPSAwOw0KKyAgICAgICAgICAgIGludDMyX3QgaVNwYWNlID0gaVdpZHRoIC0gaUxlbmd0aDsNCisgICAgICAgICAgICB3aGlsZSAoaSA8IGlTcGFjZSkgew0KKyAgICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJyAnKTsNCisgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0QnVmIDw8IHBEYXRhOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpbnQzMl90IGlMZWF2aW5nU3BhY2UgPSAwOw0KKyAgICAgICAgICBpZiAoaVByZWNpc2lvbiA9PSAwKSB7DQorICAgICAgICAgICAgaUxlYXZpbmdTcGFjZSA9IGlXaWR0aCAtICh1ICsgaVByZWNpc2lvbik7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaUxlYXZpbmdTcGFjZSA9IGlXaWR0aCAtICh1ICsgaVByZWNpc2lvbiArIDEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludDMyX3QgaSA9IDA7DQorICAgICAgICAgIHdoaWxlIChpIDwgaUxlYXZpbmdTcGFjZSkgew0KKyAgICAgICAgICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcgJyk7DQorICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGkgPSAwOw0KKyAgICAgICAgICB3aGlsZSAoaSA8IHUpIHsNCisgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcigqKHBEYXRhICsgaSkpOw0KKyAgICAgICAgICAgICsraTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaVByZWNpc2lvbiAhPSAwKSB7DQorICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJy4nKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB1Kys7DQorICAgICAgICAgIGkgPSAwOw0KKyAgICAgICAgICB3aGlsZSAodSA8IGlMZW5ndGgpIHsNCisgICAgICAgICAgICBpZiAoaSA+PSBpUHJlY2lzaW9uKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoKihwRGF0YSArIHUpKTsNCisgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgKyt1Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdoaWxlIChpIDwgaVByZWNpc2lvbikgew0KKyAgICAgICAgICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcwJyk7DQorICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1Zi5HZXRCeXRlU3RyaW5nKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG51bWJlclZhbHVlKTsNCisgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZSh3aWR0aFZhbHVlKTsNCisgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByZWNpc2lvblZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlN0ciIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpTdHVmZihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjID09IDMpIHx8IChhcmdjID09IDQpKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIENGWF9CeXRlU3RyaW5nIHNvdXJjZVN0cmluZzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgaW5zZXJ0U3RyaW5nOw0KKyAgICBpbnQzMl90IGlMZW5ndGggPSAwOw0KKyAgICBpbnQzMl90IGlTdGFydCA9IDA7DQorICAgIGludDMyX3QgaURlbGV0ZSA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBzb3VyY2VWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBzdGFydFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgRlhKU0VfSFZBTFVFIGRlbGV0ZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgRlhKU0VfSFZBTFVFIGluc2VydFZhbHVlID0gMDsNCisgICAgaWYgKChGWEpTRV9WYWx1ZV9Jc051bGwoc291cmNlVmFsdWUpKSB8fCAoRlhKU0VfVmFsdWVfSXNOdWxsKHN0YXJ0VmFsdWUpKSB8fA0KKyAgICAgICAgKEZYSlNFX1ZhbHVlX0lzTnVsbChkZWxldGVWYWx1ZSkpKSB7DQorICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoc291cmNlVmFsdWUsIHNvdXJjZVN0cmluZyk7DQorICAgICAgaUxlbmd0aCA9IHNvdXJjZVN0cmluZy5HZXRMZW5ndGgoKTsNCisgICAgICBpU3RhcnQgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBzdGFydFZhbHVlKTsNCisgICAgICBpZiAoaVN0YXJ0IDwgMSkgew0KKyAgICAgICAgaVN0YXJ0ID0gMTsNCisgICAgICB9DQorICAgICAgaWYgKGlTdGFydCA+IGlMZW5ndGgpIHsNCisgICAgICAgIGlTdGFydCA9IGlMZW5ndGg7DQorICAgICAgfQ0KKyAgICAgIGlEZWxldGUgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBkZWxldGVWYWx1ZSk7DQorICAgICAgaWYgKGlEZWxldGUgPD0gMCkgew0KKyAgICAgICAgaURlbGV0ZSA9IDA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChhcmdjID09IDQpIHsNCisgICAgICBpbnNlcnRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMyk7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGluc2VydFZhbHVlLCBpbnNlcnRTdHJpbmcpOw0KKyAgICB9DQorICAgIGlTdGFydCAtPSAxOw0KKyAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0U3RyaW5nOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICB3aGlsZSAoaSA8IGlTdGFydCkgew0KKyAgICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKHNvdXJjZVN0cmluZy5HZXRBdChpKSk7DQorICAgICAgKytpOw0KKyAgICB9DQorICAgIHJlc3VsdFN0cmluZyA8PCBpbnNlcnRTdHJpbmc7DQorICAgIGkgPSBpU3RhcnQgKyBpRGVsZXRlOw0KKyAgICB3aGlsZSAoaSA8IGlMZW5ndGgpIHsNCisgICAgICByZXN1bHRTdHJpbmcuQXBwZW5kQ2hhcihzb3VyY2VTdHJpbmcuR2V0QXQoaSkpOw0KKyAgICAgICsraTsNCisgICAgfQ0KKyAgICByZXN1bHRTdHJpbmcuQXBwZW5kQ2hhcigwKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0U3RyaW5nLkdldEJ5dGVTdHJpbmcoKSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc291cmNlVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHN0YXJ0VmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGRlbGV0ZVZhbHVlKTsNCisgICAgaWYgKGFyZ2MgPT0gNCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaW5zZXJ0VmFsdWUpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJTdHVmZiIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpTdWJzdHIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICBGWEpTRV9IVkFMVUUgc3RyaW5nVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgc3RhcnRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEZYSlNFX0hWQUxVRSBlbmRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIHN0cmluZ1ZhbHVlKSB8fCAoSFZhbHVlSXNOdWxsKGhUaGlzLCBzdGFydFZhbHVlKSkgfHwNCisgICAgICAgIChIVmFsdWVJc051bGwoaFRoaXMsIGVuZFZhbHVlKSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pTb3VyY2VTdHI7DQorICAgICAgaW50MzJfdCBpU3RhcnQgPSAwOw0KKyAgICAgIGludDMyX3QgaUNvdW50ID0gMDsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoc3RyaW5nVmFsdWUsIHN6U291cmNlU3RyKTsNCisgICAgICBpbnQzMl90IGlMZW5ndGggPSBzelNvdXJjZVN0ci5HZXRMZW5ndGgoKTsNCisgICAgICBpZiAoaUxlbmd0aCA9PSAwKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaVN0YXJ0ID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgc3RhcnRWYWx1ZSk7DQorICAgICAgICBpQ291bnQgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBlbmRWYWx1ZSk7DQorICAgICAgICBpZiAoaVN0YXJ0IDwgMSkgew0KKyAgICAgICAgICBpU3RhcnQgPSAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlTdGFydCA+IGlMZW5ndGgpIHsNCisgICAgICAgICAgaVN0YXJ0ID0gaUxlbmd0aDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpQ291bnQgPD0gMCkgew0KKyAgICAgICAgICBpQ291bnQgPSAwOw0KICAgICAgICAgfQ0KICAgICAgICAgaVN0YXJ0IC09IDE7DQotICAgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0U3RyaW5nOw0KLSAgICAgICAgaW50MzJfdCBpID0gMDsNCi0gICAgICAgIHdoaWxlIChpIDwgaVN0YXJ0KSB7DQotICAgICAgICAgICAgcmVzdWx0U3RyaW5nLkFwcGVuZENoYXIoc291cmNlU3RyaW5nLkdldEF0KGkpKTsNCi0gICAgICAgICAgICArK2k7DQotICAgICAgICB9DQotICAgICAgICByZXN1bHRTdHJpbmcgPDwgaW5zZXJ0U3RyaW5nOw0KLSAgICAgICAgaSA9IGlTdGFydCArIGlEZWxldGU7DQotICAgICAgICB3aGlsZSAoaSA8IGlMZW5ndGgpIHsNCi0gICAgICAgICAgICByZXN1bHRTdHJpbmcuQXBwZW5kQ2hhcihzb3VyY2VTdHJpbmcuR2V0QXQoaSkpOw0KLSAgICAgICAgICAgICsraTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKDApOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHJlc3VsdFN0cmluZy5HZXRCeXRlU3RyaW5nKCkpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShzb3VyY2VWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHN0YXJ0VmFsdWUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShkZWxldGVWYWx1ZSk7DQotICAgICAgICBpZiAoYXJnYyA9PSA0KSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShpbnNlcnRWYWx1ZSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIlN0dWZmIik7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pTb3VyY2VTdHIuTWlkKGlTdGFydCwgaUNvdW50KSk7DQorICAgICAgfQ0KICAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc3RyaW5nVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHN0YXJ0VmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGVuZFZhbHVlKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlN1YnN0ciIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpTdWJzdHIoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgaWYoYXJnYyA9PSAzKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgc3RyaW5nVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIHN0YXJ0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGVuZFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCi0gICAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIHN0cmluZ1ZhbHVlKSB8fCAoSFZhbHVlSXNOdWxsKGhUaGlzLCBzdGFydFZhbHVlKSkgfHwgKEhWYWx1ZUlzTnVsbChoVGhpcywgZW5kVmFsdWUpKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pTb3VyY2VTdHI7DQotICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwOw0KLSAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoc3RyaW5nVmFsdWUsIHN6U291cmNlU3RyKTsNCi0gICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSBzelNvdXJjZVN0ci5HZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICBpZiAoaUxlbmd0aCA9PSAwKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiIikpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlTdGFydCA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIHN0YXJ0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICBpQ291bnQgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBlbmRWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGlmIChpU3RhcnQgPCAxKSB7DQotICAgICAgICAgICAgICAgICAgICBpU3RhcnQgPSAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChpU3RhcnQgPiBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgICAgICBpU3RhcnQgPSBpTGVuZ3RoOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChpQ291bnQgPD0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaUNvdW50ID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpU3RhcnQgLT0gMTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHN6U291cmNlU3RyLk1pZChpU3RhcnQsIGlDb3VudCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc3RyaW5nVmFsdWUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShzdGFydFZhbHVlKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZW5kVmFsdWUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJTdWJzdHIiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpVdWlkKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmKChhcmdjID09IDApIHx8IChhcmdjID09IDEpKSB7DQotICAgICAgICBpbnQzMl90IGlOdW0gPSAwOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IDA7DQotICAgICAgICBpZihhcmdjID09IDEpIHsNCi0gICAgICAgICAgICBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgICAgIGlOdW0gPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdPbmUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfR1VJRCBndWlkOw0KLSAgICAgICAgRlhfR1VJRF9DcmVhdGVWNCgmZ3VpZCk7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1VJZDsNCi0gICAgICAgIEZYX0dVSURfVG9TdHJpbmcoJmd1aWQsIGJzVUlkLCBpTnVtKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBic1VJZCk7DQotICAgICAgICBpZihhcmdjID09IDEpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIlV1aWQiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpVcHBlcihGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDMpKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBhcmdTdHJpbmc7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBsb2NhbGVWYWx1ZSA9IDA7DQotICAgICAgICBpZihIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmKGFyZ2MgPT0gMikgew0KLSAgICAgICAgICAgICAgICBsb2NhbGVWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIGFyZ1N0cmluZyk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVUZXh0QnVmIHVwcGVyU3RyaW5nQnVmOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXJnU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGFyZ1N0cmluZywgYXJnU3RyaW5nLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c0FyZ1N0cmluZzsNCi0gICAgICAgICAgICBpbnQzMl90IGlMZW4gPSB3c0FyZ1N0cmluZy5HZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICBpbnQzMl90IGkgPSAwOw0KLSAgICAgICAgICAgIGludDMyX3QgY2ggPSAwOw0KLSAgICAgICAgICAgIHdoaWxlIChpIDwgaUxlbikgew0KLSAgICAgICAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCi0gICAgICAgICAgICAgICAgaWYgKGNoID49IDB4NjEgJiYgY2ggPD0gMHg3QSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2ggLT0gMzI7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHhFMCAmJiBjaCA8PSAweEZFKSB7DQotICAgICAgICAgICAgICAgICAgICBjaCAtPSAzMjsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAweDEwMSB8fCBjaCA9PSAweDEwMyB8fCBjaCA9PSAweDEwNSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2ggLT0gMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB1cHBlclN0cmluZ0J1Zi5BcHBlbmRDaGFyKGNoKTsNCi0gICAgICAgICAgICAgICAgKytpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB1cHBlclN0cmluZ0J1Zi5BcHBlbmRDaGFyKDApOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9VVEY4RW5jb2RlKHVwcGVyU3RyaW5nQnVmLkdldEJ1ZmZlcigpLCB1cHBlclN0cmluZ0J1Zi5HZXRMZW5ndGgoKSkpOw0KLSAgICAgICAgICAgIGlmKGFyZ2MgPT0gMikgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsZVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIlVwcGVyIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6V29yZE51bShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQotICAgICAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KLSAgICAgICAgRlhfRkxPQVQgZk51bWJlcjsNCi0gICAgICAgIGludDMyX3QgaUlkZW50aWZpZXIgPSAwOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxlU3RyaW5nOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIG51bWJlclZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBpZGVudGlmaWVyVmFsdWUgPSAwOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGxvY2FsZVZhbHVlID0gMDsNCi0gICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChudW1iZXJWYWx1ZSkpIHsNCi0gICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmTnVtYmVyID0gSFZhbHVlVG9GbG9hdChoVGhpcywgbnVtYmVyVmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoYXJnYyA+IDEpIHsNCi0gICAgICAgICAgICBpZGVudGlmaWVyVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoaWRlbnRpZmllclZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlJZGVudGlmaWVyID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgaWRlbnRpZmllclZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQotICAgICAgICAgICAgbG9jYWxlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KLSAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwobG9jYWxlVmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGxvY2FsZVZhbHVlLCBsb2NhbGVTdHJpbmcpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYkZsYWdzKSB7DQotICAgICAgICAgICAgaWYgKChmTnVtYmVyIDwgMCkgfHwgKGZOdW1iZXIgPiA5MjIzMzcyMDM2ODU0Nzc1NTApKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9CU1RSQygiKiIpKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0QnVmOw0KLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBudW1iZXJTdHJpbmc7DQotICAgICAgICAgICAgICAgIG51bWJlclN0cmluZy5Gb3JtYXQoIiUuMmYiLCBmTnVtYmVyKTsNCi0gICAgICAgICAgICAgICAgV29yZFVTKG51bWJlclN0cmluZywgaUlkZW50aWZpZXIsIHJlc3VsdEJ1Zik7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRCdWYuR2V0Qnl0ZVN0cmluZygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobnVtYmVyVmFsdWUpOw0KLSAgICAgICAgaWYgKGFyZ2MgPiAxKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShpZGVudGlmaWVyVmFsdWUpOw0KLSAgICAgICAgICAgIGlmIChhcmdjID09IDMpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbGVWYWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJXb3JkTnVtIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VHJpbGxpb25VUyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0YSwgQ0ZYX0J5dGVUZXh0QnVmICZzdHJCdWYpDQotew0KLSAgICBDRlhfQnl0ZVN0cmluZ0MgcFVuaXRzW10gPSAgICB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLAkiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIn07DQotICAgIENGWF9CeXRlU3RyaW5nQyBwQ2FwVW5pdHNbXQk9IHsgIlplcm8iLCAiT25lIiwgIlR3byIsICJUaHJlZSIsCSJGb3VyIiwgIkZpdmUiLCAiU2l4IiwgIlNldmVuIiwgIkVpZ2h0IiwgIk5pbmUifTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmdDIHBUZW5zW10JCT0geyJUZW4iLAkJIkVsZXZlbiIsCSJUd2VsdmUiLAkiVGhpcnRlZW4iLAkiRm91cnRlZW4iLAkiRmlmdGVlbiIsCSJTaXh0ZWVuIiwJIlNldmVudGVlbiIsCSJFaWdodGVlbiIsCSJOaW5ldGVlbiJ9Ow0KLSAgICBDRlhfQnl0ZVN0cmluZ0MgcExhc3RUZW5zW10JPSB7IlR3ZW50eSIsCSJUaGlydHkiLAkiRm9ydHkiLAkiRmlmdHkiLAkiU2l4dHkiLAkiU2V2ZW50eSIsCSJFaWdodHkiLAkiTmluZXR5In07DQotICAgIENGWF9CeXRlU3RyaW5nQyBwQ29tbVtdCQk9IHsiIEh1bmRyZWQgIiwgIiBUaG91c2FuZCAiLAkiIE1pbGxpb24gIiwgIiBCaWxsaW9uICIsICJUcmlsbGlvbiJ9Ow0KLSAgICBpbnQzMl90IGlDb21tID0gMDsNCi0gICAgY29uc3QgRlhfQ0hBUiogcERhdGEgPSBzekRhdGEuR2V0Q1N0cigpOw0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBzekRhdGEuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoID4gMTIpIHsNCi0gICAgICAgIGlDb21tID0gNDsNCi0gICAgfSBlbHNlIGlmIChpTGVuZ3RoID4gOSkgew0KLSAgICAgICAgaUNvbW0gPSAzOw0KLSAgICB9IGVsc2UgaWYgKGlMZW5ndGggPiA2KSB7DQotICAgICAgICBpQ29tbSA9IDI7DQotICAgIH0gZWxzZSBpZiAoaUxlbmd0aCA+IDMpIHsNCi0gICAgICAgIGlDb21tID0gMTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlJbmRleCA9IDA7DQotICAgIGludDMyX3QgaUZpcnN0Q291bnQgPSBpTGVuZ3RoICUgMzsNCi0gICAgaWYgKGlGaXJzdENvdW50ID09IDApIHsNCi0gICAgICAgIGlGaXJzdENvdW50ID0gMzsNCi0gICAgfQ0KLSAgICBpZiAoaUZpcnN0Q291bnQgPT0gMykgew0KLSAgICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXgpICE9ICcwJykgew0KLSAgICAgICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbKihwRGF0YSArIGlJbmRleCkgLSAnMCddOw0KLSAgICAgICAgICAgIHN0ckJ1ZiA8PCBwQ29tbVswXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPT0gJzAnKSB7DQotICAgICAgICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMikgLSAnMCddOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCArIDEpID4gJzEnKSB7DQotICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBwTGFzdFRlbnNbKihwRGF0YSArIGlJbmRleCArIDEpIC0gJzInXTsNCi0gICAgICAgICAgICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCItIik7DQotICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBwVW5pdHNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA9PSAnMScpIHsNCi0gICAgICAgICAgICAgICAgc3RyQnVmIDw8IHBUZW5zWyoocERhdGEgKyBpSW5kZXggKyAyKSAtICcwJ107DQotICAgICAgICAgICAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPT0gJzAnKSB7DQotICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpSW5kZXggKz0gMzsNCi0gICAgfSBlbHNlIGlmIChpRmlyc3RDb3VudCA9PSAyKSB7DQotICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJzAnKSB7DQotICAgICAgICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMCddOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPiAnMScpIHsNCi0gICAgICAgICAgICAgICAgc3RyQnVmIDw8IHBMYXN0VGVuc1sqKHBEYXRhICsgaUluZGV4KSAtICcyJ107DQotICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBGWF9CU1RSQygiLSIpOw0KLSAgICAgICAgICAgICAgICBzdHJCdWYgPDwgcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAxKSAtICcwJ107DQotICAgICAgICAgICAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4KSA9PSAnMScpIHsNCi0gICAgICAgICAgICAgICAgc3RyQnVmIDw8IHBUZW5zWyoocERhdGEgKyBpSW5kZXggKyAxKSAtICcwJ107DQotICAgICAgICAgICAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4KSA9PSAnMCcpIHsNCi0gICAgICAgICAgICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMCddOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlJbmRleCArPSAyOw0KLSAgICB9IGVsc2UgaWYgKGlGaXJzdENvdW50ID09IDEpIHsNCi0gICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbKihwRGF0YSArIGlJbmRleCkgLSAnMCddOw0KLSAgICAgICAgaUluZGV4ICs9IDE7DQotICAgIH0NCi0gICAgaWYgKGlMZW5ndGggPiAzICYmIGlGaXJzdENvdW50ID4gMCkgew0KLSAgICAgICAgc3RyQnVmIDw8IHBDb21tW2lDb21tXTsNCi0gICAgICAgIC0taUNvbW07DQotICAgIH0NCi0gICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCi0gICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSAhPSAnMCcpIHsNCi0gICAgICAgICAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXgpIC0gJzAnXTsNCi0gICAgICAgICAgICBzdHJCdWYgPDwgcENvbW1bMF07DQotICAgICAgICB9DQotICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCArIDEpID09ICcwJykgew0KLSAgICAgICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA+ICcxJykgew0KLSAgICAgICAgICAgICAgICBzdHJCdWYgPDwgcExhc3RUZW5zWyoocERhdGEgKyBpSW5kZXggKyAxKSAtICcyJ107DQotICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBGWF9CU1RSQygiLSIpOw0KLSAgICAgICAgICAgICAgICBzdHJCdWYgPDwgcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAyKSAtICcwJ107DQotICAgICAgICAgICAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPT0gJzEnKSB7DQotICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBwVGVuc1sqKHBEYXRhICsgaUluZGV4ICsgMikgLSAnMCddOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKihwRGF0YSArIGlJbmRleCArIDEpID09ICcwJykgew0KLSAgICAgICAgICAgICAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAyKSAtICcwJ107DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlJbmRleCA8IGlMZW5ndGggLSAzKSB7DQotICAgICAgICAgICAgc3RyQnVmIDw8IHBDb21tW2lDb21tXTsNCi0gICAgICAgICAgICAtLWlDb21tOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaUluZGV4ICs9IDM7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6V29yZFVTKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRhLCBpbnQzMl90IGlTdHlsZSwgQ0ZYX0J5dGVUZXh0QnVmICZzdHJCdWYpDQotew0KLSAgICBjb25zdCBGWF9DSEFSKiBwRGF0YSA9IHN6RGF0YS5HZXRDU3RyKCk7DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHN6RGF0YS5HZXRMZW5ndGgoKTsNCi0gICAgc3dpdGNoIChpU3R5bGUpIHsNCi0gICAgICAgIGNhc2UgMDogew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleCA9IDA7DQotICAgICAgICAgICAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJy4nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICArK2lJbmRleDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpTGVuZ3RoID0gaUluZGV4Ow0KLSAgICAgICAgICAgICAgICBpSW5kZXggPSAwOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgICAgICAgICAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSAoaUxlbmd0aCAtIGlJbmRleCkgJSAxMjsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghaUNvdW50ICYmIGlMZW5ndGggLSBpSW5kZXggPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaUNvdW50ID0gMTI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBUcmlsbGlvblVTKENGWF9CeXRlU3RyaW5nQyhwRGF0YSArIGlJbmRleCwgaUNvdW50KSwgc3RyQnVmKTsNCi0gICAgICAgICAgICAgICAgICAgIGlJbmRleCArPSBpQ291bnQ7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaUluZGV4IDwgaUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBGWF9CU1RSQygiIFRyaWxsaW9uICIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAxOiB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSA9PSAnLicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICsraUluZGV4Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlMZW5ndGggPSBpSW5kZXg7DQotICAgICAgICAgICAgICAgIGlJbmRleCA9IDA7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlDb3VudCA9IChpTGVuZ3RoIC0gaUluZGV4KSAlIDEyOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpQ291bnQgJiYgaUxlbmd0aCAtIGlJbmRleCA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSAxMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIFRyaWxsaW9uVVMoQ0ZYX0J5dGVTdHJpbmdDKHBEYXRhICsgaUluZGV4LCBpQ291bnQpLCBzdHJCdWYpOw0KLSAgICAgICAgICAgICAgICAgICAgaUluZGV4ICs9IGlDb3VudDsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpSW5kZXggPCBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCIgVHJpbGxpb24gIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCIgRG9sbGFycyIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjogew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleCA9IDA7DQotICAgICAgICAgICAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJy4nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICArK2lJbmRleDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlJbnRlZ2VyID0gaUluZGV4Ow0KLSAgICAgICAgICAgICAgICBpSW5kZXggPSAwOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgICAgICAgICAgICAgIHdoaWxlIChpSW5kZXggPCBpSW50ZWdlcikgew0KLSAgICAgICAgICAgICAgICAgICAgaUNvdW50ID0gKGlJbnRlZ2VyIC0gaUluZGV4KSAlIDEyOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpQ291bnQgJiYgaUxlbmd0aCAtIGlJbmRleCA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSAxMjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIFRyaWxsaW9uVVMoQ0ZYX0J5dGVTdHJpbmdDKHBEYXRhICsgaUluZGV4LCBpQ291bnQpLCBzdHJCdWYpOw0KLSAgICAgICAgICAgICAgICAgICAgaUluZGV4ICs9IGlDb3VudDsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpSW5kZXggPCBpSW50ZWdlcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBGWF9CU1RSQygiIFRyaWxsaW9uICIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHN0ckJ1ZiA8PCBGWF9CU1RSQygiIERvbGxhcnMiKTsNCi0gICAgICAgICAgICAgICAgaWYgKGlJbnRlZ2VyIDwgaUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCIgQW5kICIpOw0KLSAgICAgICAgICAgICAgICAgICAgaUluZGV4ID0gaUludGVnZXIgKyAxOw0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSAoaUxlbmd0aCAtIGlJbmRleCkgJSAxMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlDb3VudCAmJiBpTGVuZ3RoIC0gaUluZGV4ID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSAxMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgVHJpbGxpb25VUyhDRlhfQnl0ZVN0cmluZ0MocERhdGEgKyBpSW5kZXgsIGlDb3VudCksIHN0ckJ1Zik7DQotICAgICAgICAgICAgICAgICAgICAgICAgaUluZGV4ICs9IGlDb3VudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUluZGV4IDwgaUxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJCdWYgPDwgRlhfQlNUUkMoIiBUcmlsbGlvbiAiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBzdHJCdWYgPDwgRlhfQlNUUkMoIiBDZW50cyIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXQoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VXVpZChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA9PSAwKSB8fCAoYXJnYyA9PSAxKSkgew0KKyAgICBpbnQzMl90IGlOdW0gPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gMDsNCiAgICAgaWYgKGFyZ2MgPT0gMSkgew0KLSAgICAgICAgQ1hGQV9Eb2N1bWVudCAqcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KLSAgICAgICAgaWYoIXBEb2MpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBwRG9jLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCktPkdldEFwcFByb3ZpZGVyKCk7DQotICAgICAgICBpZighcEFwcFByb3ZpZGVyKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyB1cmxTdHJpbmc7DQotICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCB1cmxTdHJpbmcpOw0KLSAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZSA9IHBBcHBQcm92aWRlci0+RG93bmxvYWRVUkwoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHVybFN0cmluZywgdXJsU3RyaW5nLkdldExlbmd0aCgpKSk7DQotICAgICAgICBpZiAocEZpbGUpIHsNCi0gICAgICAgICAgICBpbnQzMl90IHNpemUgPSBwRmlsZS0+R2V0U2l6ZSgpOw0KLSAgICAgICAgICAgIHVpbnQ4X3QqIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7DQotICAgICAgICAgICAgaWYocERhdGEpIHsNCi0gICAgICAgICAgICAgICAgcEZpbGUtPlJlYWRCbG9jayhwRGF0YSwgc2l6ZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBDRlhfQnl0ZVN0cmluZ0MocERhdGEsIHNpemUpKTsNCi0gICAgICAgICAgICAgICAgRlhfRnJlZShwRGF0YSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBGaWxlLT5SZWxlYXNlKCk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJHZXQiKTsNCisgICAgICBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgIGlOdW0gPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdPbmUpOw0KICAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlBvc3QoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmKChhcmdjID49IDIpICYmIChhcmdjIDw9IDUpKSB7DQotICAgICAgICBDWEZBX0RvY3VtZW50ICpwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQotICAgICAgICBpZighcERvYykgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IHBEb2MtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCi0gICAgICAgIGlmKCFwQXBwUHJvdmlkZXIpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1VSTDsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRGF0YTsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzQ29udGVudFR5cGU7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0VuY29kZTsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzSGVhZGVyOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUd287DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWU7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRm91cjsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGaXZlOw0KLSAgICAgICAgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIGJzVVJMKTsNCi0gICAgICAgIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLCBic0RhdGEpOw0KLSAgICAgICAgaWYoYXJnYyA+IDIpIHsNCi0gICAgICAgICAgICBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1RocmVlLCBic0NvbnRlbnRUeXBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGFyZ2MgPiAzKSB7DQotICAgICAgICAgICAgYXJnRm91ciA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMyk7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0ZvdXIsIGJzRW5jb2RlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGFyZ2MgPiA0KSB7DQotICAgICAgICAgICAgYXJnRml2ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgNCk7DQotICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0ZpdmUsIGJzSGVhZGVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIGRlY29kZWRSZXNwb25zZTsNCi0gICAgICAgIEZYX0JPT0wgYkZsYWdzID0gcEFwcFByb3ZpZGVyLT5Qb3N0UmVxdWVzdFVSTChDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNVUkwsIGJzVVJMLkdldExlbmd0aCgpKSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRGF0YSwgYnNEYXRhLkdldExlbmd0aCgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQ29udGVudFR5cGUsIGJzQ29udGVudFR5cGUuR2V0TGVuZ3RoKCkpLCBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFbmNvZGUsIGJzRW5jb2RlLkdldExlbmd0aCgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzSGVhZGVyLCBic0hlYWRlci5HZXRMZW5ndGgoKSksIGRlY29kZWRSZXNwb25zZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQotICAgICAgICBpZihhcmdjID4gMikgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoYXJnYyA+IDMpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZvdXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoYXJnYyA+IDQpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpdmUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoYkZsYWdzKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX1VURjhFbmNvZGUoZGVjb2RlZFJlc3BvbnNlLCBkZWNvZGVkUmVzcG9uc2UuR2V0TGVuZ3RoKCkpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfU0VSVkVSX0RFTlkpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiUG9zdCIpOw0KKyAgICBGWF9HVUlEIGd1aWQ7DQorICAgIEZYX0dVSURfQ3JlYXRlVjQoJmd1aWQpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1VJZDsNCisgICAgRlhfR1VJRF9Ub1N0cmluZygmZ3VpZCwgYnNVSWQsIGlOdW0pOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYnNVSWQpOw0KKyAgICBpZiAoYXJnYyA9PSAxKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJVdWlkIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlB1dChGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgaWYoKGFyZ2MgPT0gMikgfHwgKGFyZ2MgPT0gMykpIHsNCi0gICAgICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCi0gICAgICAgIGlmKCFwRG9jKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gcERvYy0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpLT5HZXRBcHBQcm92aWRlcigpOw0KLSAgICAgICAgaWYoIXBBcHBQcm92aWRlcikgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVVJMOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEYXRhOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGU7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1R3bzsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZTsNCi0gICAgICAgIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBic1VSTCk7DQotICAgICAgICBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3bywgYnNEYXRhKTsNCi0gICAgICAgIGlmKGFyZ2MgPiAyKSB7DQotICAgICAgICAgICAgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KLSAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUaHJlZSwgYnNFbmNvZGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfQk9PTCBiRmxhZ3MgPSBwQXBwUHJvdmlkZXItPlB1dFJlcXVlc3RVUkwoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVVJMLCBic1VSTC5HZXRMZW5ndGgoKSksIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0RhdGEsIGJzRGF0YS5HZXRMZW5ndGgoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0VuY29kZSwgYnNFbmNvZGUuR2V0TGVuZ3RoKCkpKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCi0gICAgICAgIGlmKGFyZ2MgPiAyKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQotICAgICAgICB9DQotICAgICAgICBpZihiRmxhZ3MpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfU0VSVkVSX0RFTlkpOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlVwcGVyKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDMpKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGFyZ1N0cmluZzsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBsb2NhbGVWYWx1ZSA9IDA7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJQdXQiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0Ojphc3NpZ25fdmFsdWVfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaWYoYXJncy5HZXRMZW5ndGgoKSA9PSAyICkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGxWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgclZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgIEZYX0JPT0wgYlNldFN0YXR1cyA9IFRSVUU7DQotICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShsVmFsdWUpKSB7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlZnRMZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChsVmFsdWUsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVmdExlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICBpbnQzMl90IGlMZWZ0TGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlZnRMZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZWZ0TGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGxWYWx1ZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVmdExlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgobFZhbHVlLCBpLCBqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIGJTZXRTdGF0dXMgPSBTZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgclZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghYlNldFN0YXR1cykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX05PVF9ERUZBVUxfVkFMVUUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZWZ0TGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChsVmFsdWUsIGksIGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgclZhbHVlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQotICAgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGxWYWx1ZSkpIHsNCi0gICAgICAgICAgICBiU2V0U3RhdHVzID0gU2V0T2JqZWN0RGVmYXVsdFZhbHVlKGxWYWx1ZSwgclZhbHVlKTsNCi0gICAgICAgICAgICBpZiAoIWJTZXRTdGF0dXMpIHsNCi0gICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfTk9UX0RFRkFVTF9WQUxVRSk7DQotICAgICAgICAgICAgfQ0KKyAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgIGxvY2FsZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICB9DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgYXJnU3RyaW5nKTsNCisgICAgICBDRlhfV2lkZVRleHRCdWYgdXBwZXJTdHJpbmdCdWY7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBcmdTdHJpbmcgPQ0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYXJnU3RyaW5nLCBhcmdTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzQXJnU3RyaW5nOw0KKyAgICAgIGludDMyX3QgaUxlbiA9IHdzQXJnU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICAgIGludDMyX3QgaSA9IDA7DQorICAgICAgaW50MzJfdCBjaCA9IDA7DQorICAgICAgd2hpbGUgKGkgPCBpTGVuKSB7DQorICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgIGlmIChjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EpIHsNCisgICAgICAgICAgY2ggLT0gMzI7DQorICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4RTAgJiYgY2ggPD0gMHhGRSkgew0KKyAgICAgICAgICBjaCAtPSAzMjsNCisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gMHgxMDEgfHwgY2ggPT0gMHgxMDMgfHwgY2ggPT0gMHgxMDUpIHsNCisgICAgICAgICAgY2ggLT0gMTsNCiAgICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldChhcmdzLkdldFJldHVyblZhbHVlKCksIHJWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJWYWx1ZSk7DQorICAgICAgICB1cHBlclN0cmluZ0J1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgICAgICsraTsNCisgICAgICB9DQorICAgICAgdXBwZXJTdHJpbmdCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VURjhFbmNvZGUodXBwZXJTdHJpbmdCdWYuR2V0QnVmZmVyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyU3RyaW5nQnVmLkdldExlbmd0aCgpKSk7DQorICAgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbGVWYWx1ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlVwcGVyIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OldvcmROdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIEZYX0ZMT0FUIGZOdW1iZXI7DQorICAgIGludDMyX3QgaUlkZW50aWZpZXIgPSAwOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBsb2NhbGVTdHJpbmc7DQorICAgIEZYSlNFX0hWQUxVRSBudW1iZXJWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBpZGVudGlmaWVyVmFsdWUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgbG9jYWxlVmFsdWUgPSAwOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKG51bWJlclZhbHVlKSkgew0KKyAgICAgIGJGbGFncyA9IFRSVUU7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICAgICAgZk51bWJlciA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIG51bWJlclZhbHVlKTsNCiAgICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpsb2dpY2FsX29yX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmaXJzdCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ0ZpcnN0KTsNCi0gICAgICAgICAgICBGWF9GTE9BVCBzZWNvbmQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdTZWNvbmQpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgfHwgc2Vjb25kKSA/IDEgOiAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICBpZGVudGlmaWVyVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoaWRlbnRpZmllclZhbHVlKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaUlkZW50aWZpZXIgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBpZGVudGlmaWVyVmFsdWUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgbG9jYWxlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwobG9jYWxlVmFsdWUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcobG9jYWxlVmFsdWUsIGxvY2FsZVN0cmluZyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgaWYgKChmTnVtYmVyIDwgMCkgfHwgKGZOdW1iZXIgPiA5MjIzMzcyMDM2ODU0Nzc1NTApKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIioiKSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBudW1iZXJTdHJpbmc7DQorICAgICAgICBudW1iZXJTdHJpbmcuRm9ybWF0KCIlLjJmIiwgZk51bWJlcik7DQorICAgICAgICBXb3JkVVMobnVtYmVyU3RyaW5nLCBpSWRlbnRpZmllciwgcmVzdWx0QnVmKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWYuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgICB9DQogICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQogICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShudW1iZXJWYWx1ZSk7DQorICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaWRlbnRpZmllclZhbHVlKTsNCisgICAgICBpZiAoYXJnYyA9PSAzKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsZVZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIldvcmROdW0iKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bG9naWNhbF9hbmRfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZpcnN0ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnRmlyc3QpOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUIHNlY29uZCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1NlY29uZCk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChmaXJzdCAmJiBzZWNvbmQpID8gMSA6IDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VHJpbGxpb25VUyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3RyQnVmKSB7DQorICBDRlhfQnl0ZVN0cmluZ0MgcFVuaXRzW10gPSB7Inplcm8iLCAib25lIiwgInR3byIsICAgInRocmVlIiwgImZvdXIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIn07DQorICBDRlhfQnl0ZVN0cmluZ0MgcENhcFVuaXRzW10gPSB7Ilplcm8iLCAiT25lIiwgIlR3byIsICAgIlRocmVlIiwgIkZvdXIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsICJFaWdodCIsICJOaW5lIn07DQorICBDRlhfQnl0ZVN0cmluZ0MgcFRlbnNbXSA9IHsiVGVuIiwgICAgICAiRWxldmVuIiwgICJUd2VsdmUiLCAgIlRoaXJ0ZWVuIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3VydGVlbiIsICJGaWZ0ZWVuIiwgIlNpeHRlZW4iLCAiU2V2ZW50ZWVuIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFaWdodGVlbiIsICJOaW5ldGVlbiJ9Ow0KKyAgQ0ZYX0J5dGVTdHJpbmdDIHBMYXN0VGVuc1tdID0geyJUd2VudHkiLCAiVGhpcnR5IiwgICJGb3J0eSIsICAiRmlmdHkiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaXh0eSIsICAiU2V2ZW50eSIsICJFaWdodHkiLCAiTmluZXR5In07DQorICBDRlhfQnl0ZVN0cmluZ0MgcENvbW1bXSA9IHsiIEh1bmRyZWQgIiwgIiBUaG91c2FuZCAiLCAiIE1pbGxpb24gIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQmlsbGlvbiAiLCAiVHJpbGxpb24ifTsNCisgIGludDMyX3QgaUNvbW0gPSAwOw0KKyAgY29uc3QgRlhfQ0hBUiogcERhdGEgPSBzekRhdGEuR2V0Q1N0cigpOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gc3pEYXRhLkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPiAxMikgew0KKyAgICBpQ29tbSA9IDQ7DQorICB9IGVsc2UgaWYgKGlMZW5ndGggPiA5KSB7DQorICAgIGlDb21tID0gMzsNCisgIH0gZWxzZSBpZiAoaUxlbmd0aCA+IDYpIHsNCisgICAgaUNvbW0gPSAyOw0KKyAgfSBlbHNlIGlmIChpTGVuZ3RoID4gMykgew0KKyAgICBpQ29tbSA9IDE7DQorICB9DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBpbnQzMl90IGlGaXJzdENvdW50ID0gaUxlbmd0aCAlIDM7DQorICBpZiAoaUZpcnN0Q291bnQgPT0gMCkgew0KKyAgICBpRmlyc3RDb3VudCA9IDM7DQorICB9DQorICBpZiAoaUZpcnN0Q291bnQgPT0gMykgew0KKyAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgIT0gJzAnKSB7DQorICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4KSAtICcwJ107DQorICAgICAgc3RyQnVmIDw8IHBDb21tWzBdOw0KKyAgICB9DQorICAgIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPT0gJzAnKSB7DQorICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMikgLSAnMCddOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA+ICcxJykgew0KKyAgICAgICAgc3RyQnVmIDw8IHBMYXN0VGVuc1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMiddOw0KKyAgICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCItIik7DQorICAgICAgICBzdHJCdWYgPDwgcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAyKSAtICcwJ107DQorICAgICAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPT0gJzEnKSB7DQorICAgICAgICBzdHJCdWYgPDwgcFRlbnNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCisgICAgICB9IGVsc2UgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA9PSAnMCcpIHsNCisgICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCisgICAgICB9DQogICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6ZXF1YWxpdHlfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KLSAgICAgICAgaWYgKGZtX3JlZl9lcXVhbChoVGhpcywgYXJncykpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgfHwgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSA/IDEgOiAwKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ1NlY29uZCkpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZmlyc3RPdXRwdXQ7DQotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNlY29uZE91dHB1dDsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ0ZpcnN0LCBmaXJzdE91dHB1dCk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmdTZWNvbmQsIHNlY29uZE91dHB1dCk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmaXJzdE91dHB1dC5FcXVhbChzZWNvbmRPdXRwdXQpID8gMSA6IDApOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQotICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChmaXJzdCA9PSBzZWNvbmQpID8gMSA6IDApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQotICAgICAgICB9DQorICAgIGlJbmRleCArPSAzOw0KKyAgfSBlbHNlIGlmIChpRmlyc3RDb3VudCA9PSAyKSB7DQorICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSA9PSAnMCcpIHsNCisgICAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAxKSAtICcwJ107DQogICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPiAnMScpIHsNCisgICAgICAgIHN0ckJ1ZiA8PCBwTGFzdFRlbnNbKihwRGF0YSArIGlJbmRleCkgLSAnMiddOw0KKyAgICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCItIik7DQorICAgICAgICBzdHJCdWYgPDwgcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAxKSAtICcwJ107DQorICAgICAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4KSA9PSAnMScpIHsNCisgICAgICAgIHN0ckJ1ZiA8PCBwVGVuc1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMCddOw0KKyAgICAgIH0gZWxzZSBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJzAnKSB7DQorICAgICAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAxKSAtICcwJ107DQorICAgICAgfQ0KICAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Om5vdGVxdWFsaXR5X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCi0gICAgICAgIGlmIChmbV9yZWZfZXF1YWwoaFRoaXMsIGFyZ3MpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDApOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgPyAwIDogMSk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdTZWNvbmQpKSB7DQotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzZWNvbmRPdXRwdXQ7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmdGaXJzdCwgZmlyc3RPdXRwdXQpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZmlyc3RPdXRwdXQuRXF1YWwoc2Vjb25kT3V0cHV0KSA/IDAgOiAxKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBGWF9ET1VCTEUgZmlyc3QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KLSAgICAgICAgICAgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgPT0gc2Vjb25kKSA/IDAgOiAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KLSAgICAgICAgfQ0KKyAgICBpSW5kZXggKz0gMjsNCisgIH0gZWxzZSBpZiAoaUZpcnN0Q291bnQgPT0gMSkgew0KKyAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXgpIC0gJzAnXTsNCisgICAgaUluZGV4ICs9IDE7DQorICB9DQorICBpZiAoaUxlbmd0aCA+IDMgJiYgaUZpcnN0Q291bnQgPiAwKSB7DQorICAgIHN0ckJ1ZiA8PCBwQ29tbVtpQ29tbV07DQorICAgIC0taUNvbW07DQorICB9DQorICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgIT0gJzAnKSB7DQorICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4KSAtICcwJ107DQorICAgICAgc3RyQnVmIDw8IHBDb21tWzBdOw0KKyAgICB9DQorICAgIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPT0gJzAnKSB7DQorICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMikgLSAnMCddOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA+ICcxJykgew0KKyAgICAgICAgc3RyQnVmIDw8IHBMYXN0VGVuc1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMiddOw0KKyAgICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCItIik7DQorICAgICAgICBzdHJCdWYgPDwgcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAyKSAtICcwJ107DQorICAgICAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPT0gJzEnKSB7DQorICAgICAgICBzdHJCdWYgPDwgcFRlbnNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCisgICAgICB9IGVsc2UgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA9PSAnMCcpIHsNCisgICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCisgICAgICB9DQogICAgIH0NCisgICAgaWYgKGlJbmRleCA8IGlMZW5ndGggLSAzKSB7DQorICAgICAgc3RyQnVmIDw8IHBDb21tW2lDb21tXTsNCisgICAgICAtLWlDb21tOw0KKyAgICB9DQorICAgIGlJbmRleCArPSAzOw0KKyAgfQ0KIH0NCi1GWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpmbV9yZWZfZXF1YWwoRlhKU0VfSE9CSkVDVCBoVGhpcywgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBhcmdzLkdldFZhbHVlKDApOw0KLSAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gYXJncy5HZXRWYWx1ZSgwKTsNCi0gICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnU2Vjb25kKSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGZpcnN0RmxhZ1ZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBzZWNvbmRGbGFnVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ0ZpcnN0LCAwLCBmaXJzdEZsYWdWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnU2Vjb25kLCAwLCBzZWNvbmRGbGFnVmFsdWUpOw0KLSAgICAgICAgaWYgKChGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoZmlyc3RGbGFnVmFsdWUpID09IDMpICYmIChGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoc2Vjb25kRmxhZ1ZhbHVlKSA9PSAzKSkgew0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBmaXJzdEpTT2JqZWN0ID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgc2Vjb25kSlNPYmplY3QgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdGaXJzdCwgMiwgZmlyc3RKU09iamVjdCk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1NlY29uZCwgMiwgc2Vjb25kSlNPYmplY3QpOw0KLSAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKGZpcnN0SlNPYmplY3QpICYmICFGWEpTRV9WYWx1ZV9Jc051bGwoc2Vjb25kSlNPYmplY3QpKSB7DQotICAgICAgICAgICAgICAgIGJSZXQgPSAoRlhKU0VfVmFsdWVfVG9PYmplY3QoZmlyc3RKU09iamVjdCwgTlVMTCkgPT0gRlhKU0VfVmFsdWVfVG9PYmplY3Qoc2Vjb25kSlNPYmplY3QsIE5VTEwpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmaXJzdEpTT2JqZWN0KTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHNlY29uZEpTT2JqZWN0KTsNCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpXb3JkVVMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN0ckJ1Zikgew0KKyAgY29uc3QgRlhfQ0hBUiogcERhdGEgPSBzekRhdGEuR2V0Q1N0cigpOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gc3pEYXRhLkdldExlbmd0aCgpOw0KKyAgc3dpdGNoIChpU3R5bGUpIHsNCisgICAgY2FzZSAwOiB7DQorICAgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJy4nKSB7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmaXJzdEZsYWdWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHNlY29uZEZsYWdWYWx1ZSk7DQorICAgICAgICArK2lJbmRleDsNCisgICAgICB9DQorICAgICAgaUxlbmd0aCA9IGlJbmRleDsNCisgICAgICBpSW5kZXggPSAwOw0KKyAgICAgIGludDMyX3QgaUNvdW50ID0gMDsNCisgICAgICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICAgICAgaUNvdW50ID0gKGlMZW5ndGggLSBpSW5kZXgpICUgMTI7DQorICAgICAgICBpZiAoIWlDb3VudCAmJiBpTGVuZ3RoIC0gaUluZGV4ID4gMCkgew0KKyAgICAgICAgICBpQ291bnQgPSAxMjsNCisgICAgICAgIH0NCisgICAgICAgIFRyaWxsaW9uVVMoQ0ZYX0J5dGVTdHJpbmdDKHBEYXRhICsgaUluZGV4LCBpQ291bnQpLCBzdHJCdWYpOw0KKyAgICAgICAgaUluZGV4ICs9IGlDb3VudDsNCisgICAgICAgIGlmIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICAgIHN0ckJ1ZiA8PCBGWF9CU1RSQygiIFRyaWxsaW9uICIpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSAxOiB7DQorICAgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJy4nKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKytpSW5kZXg7DQorICAgICAgfQ0KKyAgICAgIGlMZW5ndGggPSBpSW5kZXg7DQorICAgICAgaUluZGV4ID0gMDsNCisgICAgICBpbnQzMl90IGlDb3VudCA9IDA7DQorICAgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCisgICAgICAgIGlDb3VudCA9IChpTGVuZ3RoIC0gaUluZGV4KSAlIDEyOw0KKyAgICAgICAgaWYgKCFpQ291bnQgJiYgaUxlbmd0aCAtIGlJbmRleCA+IDApIHsNCisgICAgICAgICAgaUNvdW50ID0gMTI7DQorICAgICAgICB9DQorICAgICAgICBUcmlsbGlvblVTKENGWF9CeXRlU3RyaW5nQyhwRGF0YSArIGlJbmRleCwgaUNvdW50KSwgc3RyQnVmKTsNCisgICAgICAgIGlJbmRleCArPSBpQ291bnQ7DQorICAgICAgICBpZiAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICAgICAgICBzdHJCdWYgPDwgRlhfQlNUUkMoIiBUcmlsbGlvbiAiKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCIgRG9sbGFycyIpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIDI6IHsNCisgICAgICBpbnQzMl90IGlJbmRleCA9IDA7DQorICAgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCisgICAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSA9PSAnLicpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICArK2lJbmRleDsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBpSW50ZWdlciA9IGlJbmRleDsNCisgICAgICBpSW5kZXggPSAwOw0KKyAgICAgIGludDMyX3QgaUNvdW50ID0gMDsNCisgICAgICB3aGlsZSAoaUluZGV4IDwgaUludGVnZXIpIHsNCisgICAgICAgIGlDb3VudCA9IChpSW50ZWdlciAtIGlJbmRleCkgJSAxMjsNCisgICAgICAgIGlmICghaUNvdW50ICYmIGlMZW5ndGggLSBpSW5kZXggPiAwKSB7DQorICAgICAgICAgIGlDb3VudCA9IDEyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgVHJpbGxpb25VUyhDRlhfQnl0ZVN0cmluZ0MocERhdGEgKyBpSW5kZXgsIGlDb3VudCksIHN0ckJ1Zik7DQorICAgICAgICBpSW5kZXggKz0gaUNvdW50Ow0KKyAgICAgICAgaWYgKGlJbmRleCA8IGlJbnRlZ2VyKSB7DQorICAgICAgICAgIHN0ckJ1ZiA8PCBGWF9CU1RSQygiIFRyaWxsaW9uICIpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBzdHJCdWYgPDwgRlhfQlNUUkMoIiBEb2xsYXJzIik7DQorICAgICAgaWYgKGlJbnRlZ2VyIDwgaUxlbmd0aCkgew0KKyAgICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCIgQW5kICIpOw0KKyAgICAgICAgaUluZGV4ID0gaUludGVnZXIgKyAxOw0KKyAgICAgICAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgICAgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCisgICAgICAgICAgaUNvdW50ID0gKGlMZW5ndGggLSBpSW5kZXgpICUgMTI7DQorICAgICAgICAgIGlmICghaUNvdW50ICYmIGlMZW5ndGggLSBpSW5kZXggPiAwKSB7DQorICAgICAgICAgICAgaUNvdW50ID0gMTI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgVHJpbGxpb25VUyhDRlhfQnl0ZVN0cmluZ0MocERhdGEgKyBpSW5kZXgsIGlDb3VudCksIHN0ckJ1Zik7DQorICAgICAgICAgIGlJbmRleCArPSBpQ291bnQ7DQorICAgICAgICAgIGlmIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgc3RyQnVmIDw8IEZYX0JTVFJDKCIgVHJpbGxpb24gIik7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0ckJ1ZiA8PCBGWF9CU1RSQygiIENlbnRzIik7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgICBpZiAoIXBEb2MpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0NCisgICAgICAgIHBEb2MtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCisgICAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIENGWF9CeXRlU3RyaW5nIHVybFN0cmluZzsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgdXJsU3RyaW5nKTsNCisgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZSA9IHBBcHBQcm92aWRlci0+RG93bmxvYWRVUkwoDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgodXJsU3RyaW5nLCB1cmxTdHJpbmcuR2V0TGVuZ3RoKCkpKTsNCisgICAgaWYgKHBGaWxlKSB7DQorICAgICAgaW50MzJfdCBzaXplID0gcEZpbGUtPkdldFNpemUoKTsNCisgICAgICB1aW50OF90KiBwRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOw0KKyAgICAgIGlmIChwRGF0YSkgew0KKyAgICAgICAgcEZpbGUtPlJlYWRCbG9jayhwRGF0YSwgc2l6ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDKHBEYXRhLCBzaXplKSk7DQorICAgICAgICBGWF9GcmVlKHBEYXRhKTsNCisgICAgICB9DQorICAgICAgcEZpbGUtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiR2V0Iik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlBvc3QoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjID49IDIpICYmIChhcmdjIDw9IDUpKSB7DQorICAgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgaWYgKCFwRG9jKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9DQorICAgICAgICBwRG9jLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCktPkdldEFwcFByb3ZpZGVyKCk7DQorICAgIGlmICghcEFwcFByb3ZpZGVyKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9CeXRlU3RyaW5nIGJzVVJMOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0RhdGE7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzQ29udGVudFR5cGU7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRW5jb2RlOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0hlYWRlcjsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3bzsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRm91cjsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpdmU7DQorICAgIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIGJzVVJMKTsNCisgICAgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3bywgYnNEYXRhKTsNCisgICAgaWYgKGFyZ2MgPiAyKSB7DQorICAgICAgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUaHJlZSwgYnNDb250ZW50VHlwZSk7DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPiAzKSB7DQorICAgICAgYXJnRm91ciA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMyk7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0ZvdXIsIGJzRW5jb2RlKTsNCisgICAgfQ0KKyAgICBpZiAoYXJnYyA+IDQpIHsNCisgICAgICBhcmdGaXZlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCA0KTsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnRml2ZSwgYnNIZWFkZXIpOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIGRlY29kZWRSZXNwb25zZTsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBwQXBwUHJvdmlkZXItPlBvc3RSZXF1ZXN0VVJMKA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVVJMLCBic1VSTC5HZXRMZW5ndGgoKSksDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNEYXRhLCBic0RhdGEuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQ29udGVudFR5cGUsIGJzQ29udGVudFR5cGUuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRW5jb2RlLCBic0VuY29kZS5HZXRMZW5ndGgoKSksDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNIZWFkZXIsIGJzSGVhZGVyLkdldExlbmd0aCgpKSwNCisgICAgICAgIGRlY29kZWRSZXNwb25zZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICBpZiAoYXJnYyA+IDIpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCisgICAgfQ0KKyAgICBpZiAoYXJnYyA+IDMpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZvdXIpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID4gNCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRml2ZSk7DQorICAgIH0NCisgICAgaWYgKGJGbGFncykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoDQorICAgICAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgRlhfVVRGOEVuY29kZShkZWNvZGVkUmVzcG9uc2UsIGRlY29kZWRSZXNwb25zZS5HZXRMZW5ndGgoKSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1NFUlZFUl9ERU5ZKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlBvc3QiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UHV0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPT0gMikgfHwgKGFyZ2MgPT0gMykpIHsNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgICBpZiAoIXBEb2MpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0NCisgICAgICAgIHBEb2MtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCisgICAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVUkw7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRGF0YTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGU7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmU7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd287DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZTsNCisgICAgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgYnNVUkwpOw0KKyAgICBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLCBic0RhdGEpOw0KKyAgICBpZiAoYXJnYyA+IDIpIHsNCisgICAgICBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1RocmVlLCBic0VuY29kZSk7DQorICAgIH0NCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBwQXBwUHJvdmlkZXItPlB1dFJlcXVlc3RVUkwoDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNVUkwsIGJzVVJMLkdldExlbmd0aCgpKSwNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0RhdGEsIGJzRGF0YS5HZXRMZW5ndGgoKSksDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFbmNvZGUsIGJzRW5jb2RlLkdldExlbmd0aCgpKSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICBpZiAoYXJnYyA+IDIpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCisgICAgfQ0KKyAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCIiKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfU0VSVkVSX0RFTlkpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiUHV0Iik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmFzc2lnbl92YWx1ZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBsVmFsdWUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBGWEpTRV9IVkFMVUUgclZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgRlhfQk9PTCBiU2V0U3RhdHVzID0gVFJVRTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkobFZhbHVlKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBsZWZ0TGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AobFZhbHVlLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlZnRMZW5ndGhWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpTGVmdExlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZWZ0TGVuZ3RoVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVmdExlbmd0aFZhbHVlKTsNCisgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChsVmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZWZ0TGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGxWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgIGJTZXRTdGF0dXMgPSBTZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgclZhbHVlKTsNCisgICAgICAgICAgaWYgKCFiU2V0U3RhdHVzKSB7DQorICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfTk9UX0RFRkFVTF9WQUxVRSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlZnRMZW5ndGg7IGkrKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgobFZhbHVlLCBpLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgclZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGxWYWx1ZSkpIHsNCisgICAgICBiU2V0U3RhdHVzID0gU2V0T2JqZWN0RGVmYXVsdFZhbHVlKGxWYWx1ZSwgclZhbHVlKTsNCisgICAgICBpZiAoIWJTZXRTdGF0dXMpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX05PVF9ERUZBVUxfVkFMVUUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoclZhbHVlKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bG9naWNhbF9vcl9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRkxPQVQgZmlyc3QgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgRlhfRkxPQVQgc2Vjb25kID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGZpcnN0IHx8IHNlY29uZCkgPyAxIDogMCk7DQogICAgIH0NCiAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQogICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bGVzc19vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAwKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnU2Vjb25kKSkgew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNlY29uZE91dHB1dDsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnRmlyc3QsIGZpcnN0T3V0cHV0KTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3RPdXRwdXQuQ29tcGFyZShzZWNvbmRPdXRwdXQpID09IC0xKSA/IDEgOiAwKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gIEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQotICAgICAgICAgICAgRlhfRE9VQkxFIHNlY29uZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdTZWNvbmQpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgPCBzZWNvbmQpID8gMSA6IDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bG9naWNhbF9hbmRfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgICBGWF9GTE9BVCBmaXJzdCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ0ZpcnN0KTsNCisgICAgICBGWF9GTE9BVCBzZWNvbmQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdTZWNvbmQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgJiYgc2Vjb25kKSA/IDEgOiAwKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmVxdWFsaXR5X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgaWYgKGZtX3JlZl9lcXVhbChoVGhpcywgYXJncykpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcigNCisgICAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpDQorICAgICAgICAgICAgICAgID8gMQ0KKyAgICAgICAgICAgICAgICA6IDApOw0KKyAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ0ZpcnN0KSAmJg0KKyAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ1NlY29uZCkpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc2Vjb25kT3V0cHV0Ow0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ0ZpcnN0LCBmaXJzdE91dHB1dCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0T3V0cHV0LkVxdWFsKHNlY29uZE91dHB1dCkgPyAxIDogMCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0ID09IHNlY29uZCkgPyAxIDogMCk7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Om5vdGVxdWFsaXR5X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgaWYgKGZtX3JlZl9lcXVhbChoVGhpcywgYXJncykpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcigNCisgICAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpDQorICAgICAgICAgICAgICAgID8gMA0KKyAgICAgICAgICAgICAgICA6IDEpOw0KKyAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ0ZpcnN0KSAmJg0KKyAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ1NlY29uZCkpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc2Vjb25kT3V0cHV0Ow0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ0ZpcnN0LCBmaXJzdE91dHB1dCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0T3V0cHV0LkVxdWFsKHNlY29uZE91dHB1dCkgPyAwIDogMSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0ID09IHNlY29uZCkgPyAwIDogMSk7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OmZtX3JlZl9lcXVhbChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNBcnJheShhcmdTZWNvbmQpKSB7DQorICAgIEZYSlNFX0hWQUxVRSBmaXJzdEZsYWdWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIEZYSlNFX0hWQUxVRSBzZWNvbmRGbGFnVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnRmlyc3QsIDAsIGZpcnN0RmxhZ1ZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1NlY29uZCwgMCwgc2Vjb25kRmxhZ1ZhbHVlKTsNCisgICAgaWYgKChGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoZmlyc3RGbGFnVmFsdWUpID09IDMpICYmDQorICAgICAgICAoRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKHNlY29uZEZsYWdWYWx1ZSkgPT0gMykpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgZmlyc3RKU09iamVjdCA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfSFZBTFVFIHNlY29uZEpTT2JqZWN0ID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnRmlyc3QsIDIsIGZpcnN0SlNPYmplY3QpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdTZWNvbmQsIDIsIHNlY29uZEpTT2JqZWN0KTsNCisgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChmaXJzdEpTT2JqZWN0KSAmJg0KKyAgICAgICAgICAhRlhKU0VfVmFsdWVfSXNOdWxsKHNlY29uZEpTT2JqZWN0KSkgew0KKyAgICAgICAgYlJldCA9IChGWEpTRV9WYWx1ZV9Ub09iamVjdChmaXJzdEpTT2JqZWN0LCBOVUxMKSA9PQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub09iamVjdChzZWNvbmRKU09iamVjdCwgTlVMTCkpOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGZpcnN0SlNPYmplY3QpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc2Vjb25kSlNPYmplY3QpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZmlyc3RGbGFnVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHNlY29uZEZsYWdWYWx1ZSk7DQorICB9DQorICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpsZXNzX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAwKTsNCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnRmlyc3QpICYmDQorICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ1NlY29uZCkpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBmaXJzdE91dHB1dDsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzZWNvbmRPdXRwdXQ7DQorICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ0ZpcnN0LCBmaXJzdE91dHB1dCk7DQorICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ1NlY29uZCwgc2Vjb25kT3V0cHV0KTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaXJzdE91dHB1dC5Db21wYXJlKHNlY29uZE91dHB1dCkgPT0gLTEpID8gMSA6IDApOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYX0RPVUJMRSBmaXJzdCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgRlhfRE9VQkxFIHNlY29uZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdTZWNvbmQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgPCBzZWNvbmQpID8gMSA6IDApOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bGVzc2VxdWFsX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgfHwgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKA0KKyAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSA/IDENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ0ZpcnN0KSAmJg0KKyAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdTZWNvbmQpKSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgZmlyc3RPdXRwdXQ7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc2Vjb25kT3V0cHV0Ow0KKyAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmdGaXJzdCwgZmlyc3RPdXRwdXQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmdTZWNvbmQsIHNlY29uZE91dHB1dCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlyc3RPdXRwdXQuQ29tcGFyZShzZWNvbmRPdXRwdXQpICE9IDEpID8gMSA6IDApOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYX0RPVUJMRSBmaXJzdCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgRlhfRE9VQkxFIHNlY29uZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdTZWNvbmQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgPD0gc2Vjb25kKSA/IDEgOiAwKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdyZWF0ZXJfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDApOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdGaXJzdCkgJiYNCisgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnU2Vjb25kKSkgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHNlY29uZE91dHB1dDsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnRmlyc3QsIGZpcnN0T3V0cHV0KTsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0T3V0cHV0LkNvbXBhcmUoc2Vjb25kT3V0cHV0KSA9PSAxKSA/IDEgOiAwKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9ET1VCTEUgZmlyc3QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGZpcnN0ID4gc2Vjb25kKSA/IDEgOiAwKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdyZWF0ZXJlcXVhbF9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcigNCisgICAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgPyAxDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDApOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdGaXJzdCkgJiYNCisgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnU2Vjb25kKSkgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHNlY29uZE91dHB1dDsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnRmlyc3QsIGZpcnN0T3V0cHV0KTsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0T3V0cHV0LkNvbXBhcmUoc2Vjb25kT3V0cHV0KSAhPSAtMSkgPyAxIDogMCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ0ZpcnN0KTsNCisgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChmaXJzdCA+PSBzZWNvbmQpID8gMSA6IDApOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6cGx1c19vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gYXJncy5HZXRWYWx1ZSgxKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRmlyc3QpICYmIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnU2Vjb25kKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9ET1VCTEUgZmlyc3QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmaXJzdCArIHNlY29uZCk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjptaW51c19vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9ET1VCTEUgZmlyc3QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmaXJzdCAtIHNlY29uZCk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjptdWx0aXBsZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9ET1VCTEUgZmlyc3QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmaXJzdCAqIHNlY29uZCk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpkaXZpZGVfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ0ZpcnN0KTsNCisgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgaWYgKHNlY29uZCA9PSAwLjApIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0RJVklERV9aRVJPKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZmlyc3QgLyBzZWNvbmQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpwb3NpdGl2ZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCArIEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bmVnYXRpdmVfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAgLSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfbm90X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChmaXJzdCA9PSAwLjApID8gMSA6IDApOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpkb3RfYWNjZXNzb3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA9PSA0KSB8fCAoYXJnYyA9PSA1KSkgew0KKyAgICBGWF9CT09MIGJJc1N0YXIgPSBUUlVFOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnQWNjZXNzb3IgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0FjY2Vzc29yTmFtZSA9IGFyZ3MuR2V0VVRGOFN0cmluZygxKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pOYW1lID0gYXJncy5HZXRVVEY4U3RyaW5nKDIpOw0KKyAgICBpbnQzMl90IGlJbmRleEZsYWdzID0gYXJncy5HZXRJbnQzMigzKTsNCisgICAgaW50MzJfdCBpSW5kZXhWYWx1ZSA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdJbmRleCA9IE5VTEw7DQorICAgIGlmIChhcmdjID09IDUpIHsNCisgICAgICBiSXNTdGFyID0gRkFMU0U7DQorICAgICAgYXJnSW5kZXggPSBhcmdzLkdldFZhbHVlKDQpOw0KKyAgICAgIGlJbmRleFZhbHVlID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBhcmdJbmRleCk7DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pTb21FeHA7DQorICAgIEdlbmVyYXRlU29tRXhwcmVzc2lvbihzek5hbWUsIGlJbmRleEZsYWdzLCBpSW5kZXhWYWx1ZSwgYklzU3Rhciwgc3pTb21FeHApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdBY2Nlc3NvcikpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgaExlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ0FjY2Vzc29yLCBGWF9CU1RSQygibGVuZ3RoIiksIGhMZW5ndGhWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhMZW5ndGhWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoTGVuZ3RoVmFsdWUpOw0KKyAgICAgIGludDMyX3QgaUNvdW50ZXIgPSAwOw0KKyAgICAgIEZYSlNFX0hWQUxVRSoqIGhSZXNvbHZlVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFKiwgaUxlbmd0aCAtIDIpOw0KKyAgICAgIGludDMyX3QqIGlTaXplcyA9IEZYX0FsbG9jKGludDMyX3QsIGlMZW5ndGggLSAyKTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaUxlbmd0aCAtIDIpOyBpKyspIHsNCisgICAgICAgIGlTaXplc1tpXSA9IDA7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX0hWQUxVRSBoSlNPYmpWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhfQk9PTCBiQXR0cmlidXRlID0gRkFMU0U7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnQWNjZXNzb3IsIGksIGhKU09ialZhbHVlKTsNCisgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQorICAgICAgICBpbnQzMl90IGlSZXQgPSBSZXNvbHZlT2JqZWN0cyhoVGhpcywgaEpTT2JqVmFsdWUsIHN6U29tRXhwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3ZlTm9kZVJTLCBUUlVFLCBzek5hbWUuSXNFbXB0eSgpKTsNCisgICAgICAgIGlmIChpUmV0ID4gMCkgew0KKyAgICAgICAgICBQYXJzZVJlc29sdmVSZXN1bHQoaFRoaXMsIHJlc292ZU5vZGVSUywgaEpTT2JqVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUmVzb2x2ZVZhbHVlc1tpIC0gMl0sIGlTaXplc1tpIC0gMl0sIGJBdHRyaWJ1dGUpOw0KKyAgICAgICAgICBpQ291bnRlciArPSBpU2l6ZXNbaSAtIDJdOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhKU09ialZhbHVlKTsNCisgICAgICBpZiAoaUNvdW50ZXIgPiAwKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUqIHJnVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBpQ291bnRlciArIDIpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgKGlDb3VudGVyICsgMik7IGkrKykgew0KKyAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKHJnVmFsdWVzWzBdLCAxKTsNCisgICAgICAgIGlmIChiQXR0cmlidXRlKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocmdWYWx1ZXNbMV0sIHN6TmFtZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzFdKTsNCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgaUluZGV4ID0gMjsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVNpemVzW2ldOyBqKyspIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmdWYWx1ZXNbaUluZGV4XSwgaFJlc29sdmVWYWx1ZXNbaV1bal0pOw0KKyAgICAgICAgICAgIGlJbmRleCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRBcnJheShhcmdzLkdldFJldHVyblZhbHVlKCksIChpQ291bnRlciArIDIpLCByZ1ZhbHVlcyk7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaUNvdW50ZXIgKyAyKTsgaSsrKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocmdWYWx1ZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRnJlZShyZ1ZhbHVlcyk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvcGVydHlOYW1lID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pOYW1lLCBzek5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTb21FeHByZXNzaW9uID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pTb21FeHAsIHN6U29tRXhwLkdldExlbmd0aCgpKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FDQ0VTU19QUk9QRVJUWV9JTl9OT1RfT0JKRUNULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopd3NQcm9wZXJ0eU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c1NvbUV4cHJlc3Npb24pOw0KKyAgICAgIH0NCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuZ3RoIC0gMjsgaSsrKSB7DQorICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpU2l6ZXNbaV07IGorKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhSZXNvbHZlVmFsdWVzW2ldW2pdKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpU2l6ZXNbaV0gPiAwKSB7DQorICAgICAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBGWF9GcmVlKGhSZXNvbHZlVmFsdWVzKTsNCisgICAgICBGWF9GcmVlKGlTaXplcyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgICAgICBpbnQzMl90IGlSZXQgPSAwOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdBY2Nlc3NvcikgfHwNCisgICAgICAgICAgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdBY2Nlc3NvcikgJiYgYnNBY2Nlc3Nvck5hbWUuSXNFbXB0eSgpKSkgew0KKyAgICAgICAgaVJldCA9IFJlc29sdmVPYmplY3RzKGhUaGlzLCBhcmdBY2Nlc3Nvciwgc3pTb21FeHAsIHJlc292ZU5vZGVSUywgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzek5hbWUuSXNFbXB0eSgpKTsNCisgICAgICB9IGVsc2UgaWYgKCFGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdBY2Nlc3NvcikgJiYNCisgICAgICAgICAgICAgICAgICFic0FjY2Vzc29yTmFtZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIEZYX0JPT0wgYkdldE9iamVjdCA9DQorICAgICAgICAgICAgR2V0T2JqZWN0QnlOYW1lKGhUaGlzLCBhcmdBY2Nlc3NvciwgYnNBY2Nlc3Nvck5hbWUpOw0KKyAgICAgICAgaWYgKGJHZXRPYmplY3QpIHsNCisgICAgICAgICAgaVJldCA9IFJlc29sdmVPYmplY3RzKGhUaGlzLCBhcmdBY2Nlc3Nvciwgc3pTb21FeHAsIHJlc292ZU5vZGVSUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIHN6TmFtZS5Jc0VtcHR5KCkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoaVJldCA+IDApIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSogaFJlc29sdmVWYWx1ZXM7DQorICAgICAgICBpbnQzMl90IGlTaXplID0gMDsNCisgICAgICAgIEZYX0JPT0wgYkF0dHJpYnV0ZSA9IEZBTFNFOw0KKyAgICAgICAgUGFyc2VSZXNvbHZlUmVzdWx0KGhUaGlzLCByZXNvdmVOb2RlUlMsIGFyZ0FjY2Vzc29yLCBoUmVzb2x2ZVZhbHVlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpU2l6ZSwgYkF0dHJpYnV0ZSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUqIHJnVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBpU2l6ZSArIDIpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgKGlTaXplICsgMik7IGkrKykgew0KKyAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKHJnVmFsdWVzWzBdLCAxKTsNCisgICAgICAgIGlmIChiQXR0cmlidXRlKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocmdWYWx1ZXNbMV0sIHN6TmFtZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzFdKTsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHJnVmFsdWVzW2kgKyAyXSwgaFJlc29sdmVWYWx1ZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoaVNpemUgKyAyKSwgcmdWYWx1ZXMpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgKGlTaXplICsgMik7IGkrKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZyZWUocmdWYWx1ZXMpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhSZXNvbHZlVmFsdWVzW2ldKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXMpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BlcnR5TmFtZSA9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TmFtZSwgc3pOYW1lLkdldExlbmd0aCgpKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU29tRXhwcmVzc2lvbiA9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6U29tRXhwLCBzelNvbUV4cC5HZXRMZW5ndGgoKSk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BQ0NFU1NfUFJPUEVSVFlfSU5fTk9UX09CSkVDVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgRlhfV0NIQVIqKXdzUHJvcGVydHlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopd3NTb21FeHByZXNzaW9uKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPT0gNSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnSW5kZXgpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnQWNjZXNzb3IpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpkb3Rkb3RfYWNjZXNzb3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA9PSA0KSB8fCAoYXJnYyA9PSA1KSkgew0KKyAgICBGWF9CT09MIGJJc1N0YXIgPSBUUlVFOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnQWNjZXNzb3IgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0FjY2Vzc29yTmFtZSA9IGFyZ3MuR2V0VVRGOFN0cmluZygxKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pOYW1lID0gYXJncy5HZXRVVEY4U3RyaW5nKDIpOw0KKyAgICBpbnQzMl90IGlJbmRleEZsYWdzID0gYXJncy5HZXRJbnQzMigzKTsNCisgICAgaW50MzJfdCBpSW5kZXhWYWx1ZSA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdJbmRleCA9IE5VTEw7DQorICAgIGlmIChhcmdjID09IDUpIHsNCisgICAgICBiSXNTdGFyID0gRkFMU0U7DQorICAgICAgYXJnSW5kZXggPSBhcmdzLkdldFZhbHVlKDQpOw0KKyAgICAgIGlJbmRleFZhbHVlID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBhcmdJbmRleCk7DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pTb21FeHA7DQorICAgIEdlbmVyYXRlU29tRXhwcmVzc2lvbihzek5hbWUsIGlJbmRleEZsYWdzLCBpSW5kZXhWYWx1ZSwgYklzU3Rhciwgc3pTb21FeHApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdBY2Nlc3NvcikpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgaExlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ0FjY2Vzc29yLCBGWF9CU1RSQygibGVuZ3RoIiksIGhMZW5ndGhWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhMZW5ndGhWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpQ291bnRlciA9IDA7DQorICAgICAgRlhKU0VfSFZBTFVFKiogaFJlc29sdmVWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUqLCBpTGVuZ3RoIC0gMik7DQorICAgICAgaW50MzJfdCogaVNpemVzID0gRlhfQWxsb2MoaW50MzJfdCwgaUxlbmd0aCAtIDIpOw0KKyAgICAgIEZYSlNFX0hWQUxVRSBoSlNPYmpWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhfQk9PTCBiQXR0cmlidXRlID0gRkFMU0U7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnQWNjZXNzb3IsIGksIGhKU09ialZhbHVlKTsNCisgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQorICAgICAgICBpbnQzMl90IGlSZXQgPQ0KKyAgICAgICAgICAgIFJlc29sdmVPYmplY3RzKGhUaGlzLCBoSlNPYmpWYWx1ZSwgc3pTb21FeHAsIHJlc292ZU5vZGVSUywgRkFMU0UpOw0KKyAgICAgICAgaWYgKGlSZXQgPiAwKSB7DQorICAgICAgICAgIFBhcnNlUmVzb2x2ZVJlc3VsdChoVGhpcywgcmVzb3ZlTm9kZVJTLCBoSlNPYmpWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhSZXNvbHZlVmFsdWVzW2kgLSAyXSwgaVNpemVzW2kgLSAyXSwgYkF0dHJpYnV0ZSk7DQorICAgICAgICAgIGlDb3VudGVyICs9IGlTaXplc1tpIC0gMl07DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaEpTT2JqVmFsdWUpOw0KKyAgICAgIGlmIChpQ291bnRlciA+IDApIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSogcmdWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlDb3VudGVyICsgMik7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaUNvdW50ZXIgKyAyKTsgaSsrKSB7DQorICAgICAgICAgIHJnVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIocmdWYWx1ZXNbMF0sIDEpOw0KKyAgICAgICAgaWYgKGJBdHRyaWJ1dGUpIHsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhyZ1ZhbHVlc1sxXSwgc3pOYW1lKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaW50MzJfdCBpSW5kZXggPSAyOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbmd0aCAtIDI7IGkrKykgew0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpU2l6ZXNbaV07IGorKykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZ1ZhbHVlc1tpSW5kZXhdLCBoUmVzb2x2ZVZhbHVlc1tpXVtqXSk7DQorICAgICAgICAgICAgaUluZGV4Kys7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEFycmF5KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGlDb3VudGVyICsgMiksIHJnVmFsdWVzKTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IChpQ291bnRlciArIDIpOyBpKyspIHsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShyZ1ZhbHVlc1tpXSk7DQorICAgICAgICB9DQorICAgICAgICBGWF9GcmVlKHJnVmFsdWVzKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wZXJ0eU5hbWUgPQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUsIHN6TmFtZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NvbUV4cHJlc3Npb24gPQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelNvbUV4cCwgc3pTb21FeHAuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQUNDRVNTX1BST1BFUlRZX0lOX05PVF9PQkpFQ1QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c1Byb3BlcnR5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgRlhfV0NIQVIqKXdzU29tRXhwcmVzc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsNCisgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlTaXplc1tpXTsgaisrKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFJlc29sdmVWYWx1ZXNbaV1bal0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRnJlZShoUmVzb2x2ZVZhbHVlc1tpXSk7DQorICAgICAgfQ0KKyAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXMpOw0KKyAgICAgIEZYX0ZyZWUoaVNpemVzKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhMZW5ndGhWYWx1ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgICAgICBpbnQzMl90IGlSZXQgPSAwOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdBY2Nlc3NvcikgfHwNCisgICAgICAgICAgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdBY2Nlc3NvcikgJiYgYnNBY2Nlc3Nvck5hbWUuSXNFbXB0eSgpKSkgew0KKyAgICAgICAgaVJldCA9DQorICAgICAgICAgICAgUmVzb2x2ZU9iamVjdHMoaFRoaXMsIGFyZ0FjY2Vzc29yLCBzelNvbUV4cCwgcmVzb3ZlTm9kZVJTLCBGQUxTRSk7DQorICAgICAgfSBlbHNlIGlmICghRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnQWNjZXNzb3IpICYmDQorICAgICAgICAgICAgICAgICAhYnNBY2Nlc3Nvck5hbWUuSXNFbXB0eSgpKSB7DQorICAgICAgICBGWF9CT09MIGJHZXRPYmplY3QgPQ0KKyAgICAgICAgICAgIEdldE9iamVjdEJ5TmFtZShoVGhpcywgYXJnQWNjZXNzb3IsIGJzQWNjZXNzb3JOYW1lKTsNCisgICAgICAgIGlmIChiR2V0T2JqZWN0KSB7DQorICAgICAgICAgIGlSZXQgPQ0KKyAgICAgICAgICAgICAgUmVzb2x2ZU9iamVjdHMoaFRoaXMsIGFyZ0FjY2Vzc29yLCBzelNvbUV4cCwgcmVzb3ZlTm9kZVJTLCBGQUxTRSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChpUmV0ID4gMCkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFKiBoUmVzb2x2ZVZhbHVlczsNCisgICAgICAgIGludDMyX3QgaVNpemUgPSAwOw0KKyAgICAgICAgRlhfQk9PTCBiQXR0cmlidXRlID0gRkFMU0U7DQorICAgICAgICBQYXJzZVJlc29sdmVSZXN1bHQoaFRoaXMsIHJlc292ZU5vZGVSUywgYXJnQWNjZXNzb3IsIGhSZXNvbHZlVmFsdWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTaXplLCBiQXR0cmlidXRlKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSogcmdWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlTaXplICsgMik7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaVNpemUgKyAyKTsgaSsrKSB7DQorICAgICAgICAgIHJnVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIocmdWYWx1ZXNbMF0sIDEpOw0KKyAgICAgICAgaWYgKGJBdHRyaWJ1dGUpIHsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhyZ1ZhbHVlc1sxXSwgc3pOYW1lKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmdWYWx1ZXNbaSArIDJdLCBoUmVzb2x2ZVZhbHVlc1tpXSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRBcnJheShhcmdzLkdldFJldHVyblZhbHVlKCksIChpU2l6ZSArIDIpLCByZ1ZhbHVlcyk7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaVNpemUgKyAyKTsgaSsrKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocmdWYWx1ZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRnJlZShyZ1ZhbHVlcyk7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFJlc29sdmVWYWx1ZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRnJlZShoUmVzb2x2ZVZhbHVlcyk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvcGVydHlOYW1lID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pOYW1lLCBzek5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTb21FeHByZXNzaW9uID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pTb21FeHAsIHN6U29tRXhwLkdldExlbmd0aCgpKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FDQ0VTU19QUk9QRVJUWV9JTl9OT1RfT0JKRUNULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopd3NQcm9wZXJ0eU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c1NvbUV4cHJlc3Npb24pOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYXJnYyA9PSA1KSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdJbmRleCk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdBY2Nlc3Nvcik7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmV2YWxfdHJhbnNsYXRpb24oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYXJnU3RyaW5nOw0KKyAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBhcmdTdHJpbmcpOw0KKyAgICBpZiAoYXJnU3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyBzY3JpcHRTdHJpbmcgPQ0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYXJnU3RyaW5nLCBhcmdTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIENGWF9XaWRlVGV4dEJ1ZiB3c0phdmFTY3JpcHRCdWY7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFcnJvcjsNCisgICAgICBYRkFfRk0ySlNfVHJhbnNsYXRlKHNjcmlwdFN0cmluZywgd3NKYXZhU2NyaXB0QnVmLCB3c0Vycm9yKTsNCisgICAgICBpZiAod3NFcnJvci5Jc0VtcHR5KCkpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIGphdmFTY3JpcHQgPSB3c0phdmFTY3JpcHRCdWYuR2V0V2lkZVN0cmluZygpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZygNCisgICAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgRlhfVVRGOEVuY29kZShqYXZhU2NyaXB0LCBqYXZhU2NyaXB0LkdldExlbmd0aCgpKSk7DQorICAgICAgfSBlbHNlIHsNCiAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgICAgICB9DQogICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkV2YWwiKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bGVzc2VxdWFsX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSA/IDEgOiAwKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnU2Vjb25kKSkgew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNlY29uZE91dHB1dDsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnRmlyc3QsIGZpcnN0T3V0cHV0KTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3RPdXRwdXQuQ29tcGFyZShzZWNvbmRPdXRwdXQpICE9IDEpID8gMSA6IDApOw0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmlzX2ZtX29iamVjdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnT25lKSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmlzX2ZtX2FycmF5KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBGWF9CT09MIGJJc0FycmF5ID0gRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYklzQXJyYXkpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpnZXRfZm1fdmFsdWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDIsIGpzb2JqZWN0VmFsdWUpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzb2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNvYmplY3RWYWx1ZSk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnT25lKSkgew0KKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdPbmUsIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYXJnT25lKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV9qc29iaihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdPbmUsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgRlhTWVNfYXNzZXJ0KGlMZW5ndGggPj0gMyk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMiwgYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBhcmdPbmUpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Zm1fdmFyX2ZpbHRlcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ09uZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICBGWFNZU19hc3NlcnQoaUxlbmd0aCA+PSAzKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICBGWEpTRV9IVkFMVUUgZmxhZ3NWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMCwgZmxhZ3NWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpRmxhZ3MgPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoZmxhZ3NWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmbGFnc1ZhbHVlKTsNCisgICAgICBpZiAoaUZsYWdzID09IDQpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSByZ1ZhbHVlc1szXTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKHJnVmFsdWVzWzBdLCAzKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMV0pOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1syXSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRBcnJheShhcmdzLkdldFJldHVyblZhbHVlKCksIDMsIHJnVmFsdWVzKTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2UgaWYgKGlGbGFncyA9PSAzKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMiwgb2JqZWN0VmFsdWUpOw0KKyAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwob2JqZWN0VmFsdWUpKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChhcmdzLkdldFJldHVyblZhbHVlKCksIGFyZ09uZSk7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9ICBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KLSAgICAgICAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGZpcnN0IDw9IHNlY29uZCkgPyAxIDogMCk7DQorICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCiAgICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShvYmplY3RWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBzaW1wbGVWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzaW1wbGVWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHNpbXBsZVZhbHVlKTsNCisgICAgICB9DQogICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgICAgICBGWEpTRV9IVkFMVUUgc2ltcGxlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldChhcmdzLkdldFJldHVyblZhbHVlKCksIHNpbXBsZVZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHNpbXBsZVZhbHVlKTsNCiAgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdyZWF0ZXJfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgfHwgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQotICAgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ1NlY29uZCkpIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBmaXJzdE91dHB1dDsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzZWNvbmRPdXRwdXQ7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ0ZpcnN0LCBmaXJzdE91dHB1dCk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ1NlY29uZCwgc2Vjb25kT3V0cHV0KTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGZpcnN0T3V0cHV0LkNvbXBhcmUoc2Vjb25kT3V0cHV0KSA9PSAxKSA/IDEgOiAwKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gIEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQotICAgICAgICAgICAgRlhfRE9VQkxFIHNlY29uZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdTZWNvbmQpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgPiBzZWNvbmQpID8gMSA6IDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpjb25jYXRfZm1fb2JqZWN0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgdWludDMyX3QgaUxlbmd0aCA9IDA7DQorICBpbnQzMl90IGFyZ0NvdW50ID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIEZYSlNFX0hWQUxVRSogYXJnVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBhcmdDb3VudCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7DQorICAgIGFyZ1ZhbHVlc1tpXSA9IGFyZ3MuR2V0VmFsdWUoaSk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlc1tpXSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnVmFsdWVzW2ldLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCisgICAgICBpbnQzMl90IGxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgaUxlbmd0aCA9IGlMZW5ndGggKyAoKGxlbmd0aCA+IDIpID8gKGxlbmd0aCAtIDIpIDogMCk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQogICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Z3JlYXRlcmVxdWFsX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSA/IDEgOiAwKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnU2Vjb25kKSkgew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNlY29uZE91dHB1dDsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnRmlyc3QsIGZpcnN0T3V0cHV0KTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3RPdXRwdXQuQ29tcGFyZShzZWNvbmRPdXRwdXQpICE9IC0xKSA/IDEgOiAwKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gIEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQotICAgICAgICAgICAgRlhfRE9VQkxFIHNlY29uZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdTZWNvbmQpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgPj0gc2Vjb25kKSA/IDEgOiAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6cGx1c19vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBhcmdzLkdldFZhbHVlKDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IGFyZ3MuR2V0VmFsdWUoMSk7DQotICAgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdGaXJzdCkgJiYgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdTZWNvbmQpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWF9ET1VCTEUgZmlyc3QgPSAgSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ0ZpcnN0KTsNCi0gICAgICAgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZmlyc3QgKyBzZWNvbmQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjptaW51c19vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQotICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gIEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQotICAgICAgICAgICAgRlhfRE9VQkxFIHNlY29uZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdTZWNvbmQpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGZpcnN0IC0gc2Vjb25kKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bXVsdGlwbGVfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9ICBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KLSAgICAgICAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmaXJzdCAqIHNlY29uZCk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmRpdmlkZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KLSAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9ICBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KLSAgICAgICAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCi0gICAgICAgICAgICBpZiAoc2Vjb25kID09IDAuMCkgew0KLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19ESVZJREVfWkVSTyk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZmlyc3QgLyBzZWNvbmQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OnBvc2l0aXZlX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoID09IDEpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAwLjAgKyBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKSk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpuZWdhdGl2ZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCA9PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMC4wIC0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bG9naWNhbF9ub3Rfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggPT0gMSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgPT0gMC4wKSA/IDEgOiAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmRvdF9hY2Nlc3NvcihGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBpZigoYXJnYyA9PSA0KSB8fCAoYXJnYyA9PSA1KSkgew0KLSAgICAgICAgRlhfQk9PTCBiSXNTdGFyID0gVFJVRTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdBY2Nlc3NvciA9IGFyZ3MuR2V0VmFsdWUoMCk7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0FjY2Vzc29yTmFtZSA9IGFyZ3MuR2V0VVRGOFN0cmluZygxKTsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN6TmFtZSA9IGFyZ3MuR2V0VVRGOFN0cmluZygyKTsNCi0gICAgICAgIGludDMyX3QgaUluZGV4RmxhZ3MgPSBhcmdzLkdldEludDMyKDMpOw0KLSAgICAgICAgaW50MzJfdCBpSW5kZXhWYWx1ZSA9IDA7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnSW5kZXggPSBOVUxMOw0KLSAgICAgICAgaWYoYXJnYyA9PSA1KSB7DQotICAgICAgICAgICAgYklzU3RhciA9IEZBTFNFOw0KLSAgICAgICAgICAgIGFyZ0luZGV4ID0gYXJncy5HZXRWYWx1ZSg0KTsNCi0gICAgICAgICAgICBpSW5kZXhWYWx1ZSA9IEhWYWx1ZVRvSW50ZWdlcihoVGhpcywgYXJnSW5kZXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pTb21FeHA7DQotICAgICAgICBHZW5lcmF0ZVNvbUV4cHJlc3Npb24oc3pOYW1lLCBpSW5kZXhGbGFncywgaUluZGV4VmFsdWUsIGJJc1N0YXIsIHN6U29tRXhwKTsNCi0gICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnQWNjZXNzb3IpKSB7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhMZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdBY2Nlc3NvciwgRlhfQlNUUkMoImxlbmd0aCIpLCBoTGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihoTGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaExlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICBpbnQzMl90IGlDb3VudGVyID0gMDsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgKipoUmVzb2x2ZVZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSosIGlMZW5ndGggLSAyKTsNCi0gICAgICAgICAgICBpbnQzMl90ICppU2l6ZXMgPSBGWF9BbGxvYyhpbnQzMl90LCBpTGVuZ3RoIC0gMik7DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgKGlMZW5ndGggLSAyKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIGlTaXplc1tpXSA9IDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoSlNPYmpWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhfQk9PTCBiQXR0cmlidXRlID0gRkFMU0U7DQotICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ0FjY2Vzc29yLCBpLCBoSlNPYmpWYWx1ZSk7DQotICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaVJldCA9IFJlc29sdmVPYmplY3RzKGhUaGlzLCBoSlNPYmpWYWx1ZSwgc3pTb21FeHAsIHJlc292ZU5vZGVSUywgVFJVRSwgc3pOYW1lLklzRW1wdHkoKSk7DQotICAgICAgICAgICAgICAgIGlmKGlSZXQgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBQYXJzZVJlc29sdmVSZXN1bHQoaFRoaXMsIHJlc292ZU5vZGVSUywgaEpTT2JqVmFsdWUsIGhSZXNvbHZlVmFsdWVzW2kgLSAyXSwgaVNpemVzW2kgLSAyXSwgYkF0dHJpYnV0ZSk7DQotICAgICAgICAgICAgICAgICAgICBpQ291bnRlciArPSBpU2l6ZXNbaSAtIDJdOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaEpTT2JqVmFsdWUpOw0KLSAgICAgICAgICAgIGlmIChpQ291bnRlciA+IDApIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFICpyZ1ZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgaUNvdW50ZXIgKyAyKTsNCi0gICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCAoaUNvdW50ZXIgKyAyKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgMSk7DQotICAgICAgICAgICAgICAgIGlmIChiQXR0cmlidXRlKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHJnVmFsdWVzWzFdLCBzek5hbWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1sxXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpSW5kZXggPSAyOw0KLSAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgaVNpemVzW2ldOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmdWYWx1ZXNbaUluZGV4XSwgaFJlc29sdmVWYWx1ZXNbaV1bal0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlJbmRleCsrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEFycmF5KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGlDb3VudGVyICsgMiksIHJnVmFsdWVzKTsNCi0gICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCAoaUNvdW50ZXIgKyAyKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWF9GcmVlKHJnVmFsdWVzKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BlcnR5TmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUsIHN6TmFtZS5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU29tRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelNvbUV4cCwgc3pTb21FeHAuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BQ0NFU1NfUFJPUEVSVFlfSU5fTk9UX09CSkVDVCwgKGNvbnN0IEZYX1dDSEFSKil3c1Byb3BlcnR5TmFtZSwgKGNvbnN0IEZYX1dDSEFSKil3c1NvbUV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaiA9IDA7IGogPCBpU2l6ZXNbaV07IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoUmVzb2x2ZVZhbHVlc1tpXVtqXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGlTaXplc1tpXSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXNbaV0pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXMpOw0KLSAgICAgICAgICAgIEZYX0ZyZWUoaVNpemVzKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCi0gICAgICAgICAgICBpbnQzMl90IGlSZXQgPSAwOw0KLSAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdBY2Nlc3NvcikgfHwgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdBY2Nlc3NvcikgJiYgYnNBY2Nlc3Nvck5hbWUuSXNFbXB0eSgpKSkgew0KLSAgICAgICAgICAgICAgICBpUmV0ID0gUmVzb2x2ZU9iamVjdHMoaFRoaXMsIGFyZ0FjY2Vzc29yLCBzelNvbUV4cCwgcmVzb3ZlTm9kZVJTLCBUUlVFLCBzek5hbWUuSXNFbXB0eSgpKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCFGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdBY2Nlc3NvcikgJiYgIWJzQWNjZXNzb3JOYW1lLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJHZXRPYmplY3QgPSBHZXRPYmplY3RCeU5hbWUoaFRoaXMsIGFyZ0FjY2Vzc29yLCBic0FjY2Vzc29yTmFtZSk7DQotICAgICAgICAgICAgICAgIGlmIChiR2V0T2JqZWN0KSB7DQotICAgICAgICAgICAgICAgICAgICBpUmV0ID0gUmVzb2x2ZU9iamVjdHMoaFRoaXMsIGFyZ0FjY2Vzc29yLCBzelNvbUV4cCwgcmVzb3ZlTm9kZVJTLCBUUlVFLCBzek5hbWUuSXNFbXB0eSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihpUmV0ID4gMCkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgKmhSZXNvbHZlVmFsdWVzOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlTaXplID0gMDsNCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiQXR0cmlidXRlID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIFBhcnNlUmVzb2x2ZVJlc3VsdChoVGhpcywgcmVzb3ZlTm9kZVJTLCBhcmdBY2Nlc3NvciwgaFJlc29sdmVWYWx1ZXMsIGlTaXplLCBiQXR0cmlidXRlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFICpyZ1ZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgaVNpemUgKyAyKTsNCi0gICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCAoaVNpemUgKyAyKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgMSk7DQotICAgICAgICAgICAgICAgIGlmIChiQXR0cmlidXRlKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHJnVmFsdWVzWzFdLCBzek5hbWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1sxXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmdWYWx1ZXNbaSArIDJdLCBoUmVzb2x2ZVZhbHVlc1tpXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoaVNpemUgKyAyKSwgcmdWYWx1ZXMpOw0KLSAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IChpU2l6ZSArIDIpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocmdWYWx1ZXNbaV0pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0ZyZWUocmdWYWx1ZXMpOw0KLSAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFJlc29sdmVWYWx1ZXNbaV0pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXMpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvcGVydHlOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TmFtZSwgc3pOYW1lLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTb21FeHByZXNzaW9uID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6U29tRXhwLCBzelNvbUV4cC5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FDQ0VTU19QUk9QRVJUWV9JTl9OT1RfT0JKRUNULCAoY29uc3QgRlhfV0NIQVIqKXdzUHJvcGVydHlOYW1lLCAoY29uc3QgRlhfV0NIQVIqKXdzU29tRXhwcmVzc2lvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoYXJnYyA9PSA1KSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdJbmRleCk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0FjY2Vzc29yKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpkb3Rkb3RfYWNjZXNzb3IoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgaWYoKGFyZ2MgPT0gNCkgfHwgKGFyZ2MgPT0gNSkpIHsNCi0gICAgICAgIEZYX0JPT0wgYklzU3RhciA9IFRSVUU7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnQWNjZXNzb3IgPSBhcmdzLkdldFZhbHVlKDApOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNBY2Nlc3Nvck5hbWUgPSBhcmdzLkdldFVURjhTdHJpbmcoMSk7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzek5hbWUgPSBhcmdzLkdldFVURjhTdHJpbmcoMik7DQotICAgICAgICBpbnQzMl90IGlJbmRleEZsYWdzID0gYXJncy5HZXRJbnQzMigzKTsNCi0gICAgICAgIGludDMyX3QgaUluZGV4VmFsdWUgPSAwOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ0luZGV4ID0gTlVMTDsNCi0gICAgICAgIGlmKGFyZ2MgPT0gNSkgew0KLSAgICAgICAgICAgIGJJc1N0YXIgPSBGQUxTRTsNCi0gICAgICAgICAgICBhcmdJbmRleCA9IGFyZ3MuR2V0VmFsdWUoNCk7DQotICAgICAgICAgICAgaUluZGV4VmFsdWUgPSBIVmFsdWVUb0ludGVnZXIoaFRoaXMsIGFyZ0luZGV4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN6U29tRXhwOw0KLSAgICAgICAgR2VuZXJhdGVTb21FeHByZXNzaW9uKHN6TmFtZSwgaUluZGV4RmxhZ3MsIGlJbmRleFZhbHVlLCBiSXNTdGFyLCBzelNvbUV4cCk7DQotICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ0FjY2Vzc29yKSkgew0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoTGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnQWNjZXNzb3IsIEZYX0JTVFJDKCJsZW5ndGgiKSwgaExlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaExlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICBpbnQzMl90IGlDb3VudGVyID0gMDsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgKipoUmVzb2x2ZVZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSosIGlMZW5ndGggLSAyKTsNCi0gICAgICAgICAgICBpbnQzMl90ICppU2l6ZXMgPSBGWF9BbGxvYyhpbnQzMl90LCBpTGVuZ3RoIC0gMik7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhKU09ialZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBGWF9CT09MIGJBdHRyaWJ1dGUgPSBGQUxTRTsNCi0gICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnQWNjZXNzb3IsIGksIGhKU09ialZhbHVlKTsNCi0gICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpUmV0ID0gUmVzb2x2ZU9iamVjdHMoaFRoaXMsIGhKU09ialZhbHVlLCBzelNvbUV4cCwgcmVzb3ZlTm9kZVJTLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIGlmKGlSZXQgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBQYXJzZVJlc29sdmVSZXN1bHQoaFRoaXMsIHJlc292ZU5vZGVSUywgaEpTT2JqVmFsdWUsIGhSZXNvbHZlVmFsdWVzW2kgLSAyXSwgaVNpemVzW2kgLSAyXSwgYkF0dHJpYnV0ZSk7DQotICAgICAgICAgICAgICAgICAgICBpQ291bnRlciArPSBpU2l6ZXNbaSAtIDJdOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaEpTT2JqVmFsdWUpOw0KLSAgICAgICAgICAgIGlmIChpQ291bnRlciA+IDApIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFICpyZ1ZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgaUNvdW50ZXIgKyAyKTsNCi0gICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCAoaUNvdW50ZXIgKyAyKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgMSk7DQotICAgICAgICAgICAgICAgIGlmIChiQXR0cmlidXRlKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHJnVmFsdWVzWzFdLCBzek5hbWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1sxXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpSW5kZXggPSAyOw0KLSAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IGogPSAwOyBqIDwgaVNpemVzW2ldOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmdWYWx1ZXNbaUluZGV4XSwgaFJlc29sdmVWYWx1ZXNbaV1bal0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlJbmRleCsrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEFycmF5KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGlDb3VudGVyICsgMiksIHJnVmFsdWVzKTsNCi0gICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCAoaUNvdW50ZXIgKyAyKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWF9GcmVlKHJnVmFsdWVzKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BlcnR5TmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUsIHN6TmFtZS5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU29tRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelNvbUV4cCwgc3pTb21FeHAuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BQ0NFU1NfUFJPUEVSVFlfSU5fTk9UX09CSkVDVCwgKGNvbnN0IEZYX1dDSEFSKil3c1Byb3BlcnR5TmFtZSwgKGNvbnN0IEZYX1dDSEFSKil3c1NvbUV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaiA9IDA7IGogPCBpU2l6ZXNbaV07IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoUmVzb2x2ZVZhbHVlc1tpXVtqXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhfRnJlZShoUmVzb2x2ZVZhbHVlc1tpXSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXMpOw0KLSAgICAgICAgICAgIEZYX0ZyZWUoaVNpemVzKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhMZW5ndGhWYWx1ZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQotICAgICAgICAgICAgaW50MzJfdCBpUmV0ID0gMDsNCi0gICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnQWNjZXNzb3IpIHx8IChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnQWNjZXNzb3IpICYmIGJzQWNjZXNzb3JOYW1lLklzRW1wdHkoKSkpIHsNCi0gICAgICAgICAgICAgICAgaVJldCA9IFJlc29sdmVPYmplY3RzKGhUaGlzLCBhcmdBY2Nlc3Nvciwgc3pTb21FeHAsIHJlc292ZU5vZGVSUywgRkFMU0UpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIUZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ0FjY2Vzc29yKSAmJiAhYnNBY2Nlc3Nvck5hbWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdldE9iamVjdCA9IEdldE9iamVjdEJ5TmFtZShoVGhpcywgYXJnQWNjZXNzb3IsIGJzQWNjZXNzb3JOYW1lKTsNCi0gICAgICAgICAgICAgICAgaWYgKGJHZXRPYmplY3QpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlSZXQgPSBSZXNvbHZlT2JqZWN0cyhoVGhpcywgYXJnQWNjZXNzb3IsIHN6U29tRXhwLCByZXNvdmVOb2RlUlMsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihpUmV0ID4gMCkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgKmhSZXNvbHZlVmFsdWVzOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlTaXplID0gMDsNCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiQXR0cmlidXRlID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIFBhcnNlUmVzb2x2ZVJlc3VsdChoVGhpcywgcmVzb3ZlTm9kZVJTLCBhcmdBY2Nlc3NvciwgaFJlc29sdmVWYWx1ZXMsIGlTaXplLCBiQXR0cmlidXRlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFICpyZ1ZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgaVNpemUgKyAyKTsNCi0gICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCAoaVNpemUgKyAyKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgMSk7DQotICAgICAgICAgICAgICAgIGlmIChiQXR0cmlidXRlKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHJnVmFsdWVzWzFdLCBzek5hbWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1sxXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmdWYWx1ZXNbaSArIDJdLCBoUmVzb2x2ZVZhbHVlc1tpXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoaVNpemUgKyAyKSwgcmdWYWx1ZXMpOw0KLSAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IChpU2l6ZSArIDIpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocmdWYWx1ZXNbaV0pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0ZyZWUocmdWYWx1ZXMpOw0KLSAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFJlc29sdmVWYWx1ZXNbaV0pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXMpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvcGVydHlOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TmFtZSwgc3pOYW1lLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTb21FeHByZXNzaW9uID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6U29tRXhwLCBzelNvbUV4cC5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FDQ0VTU19QUk9QRVJUWV9JTl9OT1RfT0JKRUNULCAoY29uc3QgRlhfV0NIQVIqKXdzUHJvcGVydHlOYW1lLCAoY29uc3QgRlhfV0NIQVIqKXdzU29tRXhwcmVzc2lvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoYXJnYyA9PSA1KSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdJbmRleCk7DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0FjY2Vzc29yKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpldmFsX3RyYW5zbGF0aW9uIChGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGFyZ1N0cmluZzsNCi0gICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIGFyZ1N0cmluZyk7DQotICAgICAgICBpZiAoYXJnU3RyaW5nLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc2NyaXB0U3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGFyZ1N0cmluZywgYXJnU3RyaW5nLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICBDRlhfV2lkZVRleHRCdWYgd3NKYXZhU2NyaXB0QnVmOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXJyb3I7DQotICAgICAgICAgICAgWEZBX0ZNMkpTX1RyYW5zbGF0ZShzY3JpcHRTdHJpbmcsIHdzSmF2YVNjcmlwdEJ1Ziwgd3NFcnJvcik7DQotICAgICAgICAgICAgaWYgKHdzRXJyb3IuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nICBqYXZhU2NyaXB0ID0gd3NKYXZhU2NyaXB0QnVmLkdldFdpZGVTdHJpbmcoKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIEZYX1VURjhFbmNvZGUoamF2YVNjcmlwdCwgamF2YVNjcmlwdC5HZXRMZW5ndGgoKSkpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJFdmFsIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6aXNfZm1fb2JqZWN0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoID09IDEpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihhcmdzLkdldFJldHVyblZhbHVlKCksIEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ09uZSkpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihhcmdzLkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0Ojppc19mbV9hcnJheShGWEpTRV9IT0JKRUNUIGhUaGlzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCA9PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCi0gICAgICAgIEZYX0JPT0wgYklzQXJyYXkgPSBGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ09uZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYklzQXJyYXkpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihhcmdzLkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpnZXRfZm1fdmFsdWUoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggPT0gMSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQotICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDEsIHByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDIsIGpzb2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNvYmplY3RWYWx1ZSwgYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc29iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzb2JqZWN0VmFsdWUpOw0KLSAgICAgICAgfSBlbHNlIGlmKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ09uZSkpIHsNCi0gICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnT25lLCBhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBhcmdPbmUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV9qc29iaihGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCi0gICAgICAgIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnT25lKSkgew0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdPbmUsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGlMZW5ndGggPj0gMyk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMiwgYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYXJnT25lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpmbV92YXJfZmlsdGVyKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQotICAgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDEpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KLSAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpKSB7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ09uZSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQoaUxlbmd0aCA+PSAzKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgZmxhZ3NWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMCwgZmxhZ3NWYWx1ZSk7DQotICAgICAgICAgICAgaW50MzJfdCBpRmxhZ3MgPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoZmxhZ3NWYWx1ZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmbGFnc1ZhbHVlKTsNCi0gICAgICAgICAgICBpZihpRmxhZ3MgPT0gNCkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcmdWYWx1ZXNbM107DQotICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgMyk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMV0pOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzJdKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAzLCByZ1ZhbHVlcyk7DQotICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZihpRmxhZ3MgPT0gMykgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAyLCBvYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGlmKCFGWEpTRV9WYWx1ZV9Jc051bGwob2JqZWN0VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBhcmdPbmUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uob2JqZWN0VmFsdWUpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBzaW1wbGVWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChhcmdzLkdldFJldHVyblZhbHVlKCksIHNpbXBsZVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShzaW1wbGVWYWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgc2ltcGxlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChhcmdzLkdldFJldHVyblZhbHVlKCksIHNpbXBsZVZhbHVlKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHNpbXBsZVZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpjb25jYXRfZm1fb2JqZWN0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQotICAgIHVpbnQzMl90IGlMZW5ndGggPSAwOw0KLSAgICBpbnQzMl90IGFyZ0NvdW50ID0gYXJncy5HZXRMZW5ndGgoKTsNCi0gICAgRlhKU0VfSFZBTFVFICphcmdWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGFyZ0NvdW50KTsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7DQotICAgICAgICBhcmdWYWx1ZXNbaV0gPSBhcmdzLkdldFZhbHVlKGkpOw0KLSAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdWYWx1ZXNbaV0pKSB7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1ZhbHVlc1tpXSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgaW50MzJfdCBsZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIGlMZW5ndGggPSBpTGVuZ3RoICsgKChsZW5ndGggPiAyKSA/IChsZW5ndGggLSAyKSA6IDApOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaUxlbmd0aCArPSAxOw0KLSAgICB9DQotICAgIEZYSlNFX0hWQUxVRSAqcmV0dXJuVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBpTGVuZ3RoKTsNCi0gICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCAoaW50MzJfdClpTGVuZ3RoOyBpKyspIHsNCi0gICAgICAgIHJldHVyblZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgIH0NCi0gICAgaW50MzJfdCBpbmRleCA9IDA7DQotICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykgew0KLSAgICAgICAgaWYoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdWYWx1ZXNbaV0pKSB7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1ZhbHVlc1tpXSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgaW50MzJfdCBsZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIGZvcihpbnQzMl90IGogPSAyOyBqIDwgbGVuZ3RoOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlc1tpXSwgaiwgcmV0dXJuVmFsdWVzW2luZGV4XSk7DQotICAgICAgICAgICAgICAgIGluZGV4Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHJldHVyblZhbHVlc1tpbmRleF0sIGFyZ1ZhbHVlc1tpXSk7DQorICAgIGlMZW5ndGggKz0gMTsNCisgIH0NCisgIEZYSlNFX0hWQUxVRSogcmV0dXJuVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBpTGVuZ3RoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IChpbnQzMl90KWlMZW5ndGg7IGkrKykgew0KKyAgICByZXR1cm5WYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgfQ0KKyAgaW50MzJfdCBpbmRleCA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlc1tpXSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnVmFsdWVzW2ldLCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCisgICAgICBpbnQzMl90IGxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgbGVuZ3RoOyBqKyspIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZXNbaV0sIGosIHJldHVyblZhbHVlc1tpbmRleF0pOw0KICAgICAgICAgaW5kZXgrKzsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQogICAgIH0NCi0gICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBpTGVuZ3RoLCByZXR1cm5WYWx1ZXMpOw0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGFyZ0NvdW50OyBpKyspIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWVzW2ldKTsNCi0gICAgfQ0KLSAgICBGWF9GcmVlKGFyZ1ZhbHVlcyk7DQotICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgKGludDMyX3QpaUxlbmd0aDsgaSsrKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJldHVyblZhbHVlc1tpXSk7DQotICAgIH0NCi0gICAgRlhfRnJlZShyZXR1cm5WYWx1ZXMpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXQocmV0dXJuVmFsdWVzW2luZGV4XSwgYXJnVmFsdWVzW2ldKTsNCisgICAgaW5kZXgrKzsNCisgIH0NCisgIEZYSlNFX1ZhbHVlX1NldEFycmF5KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgaUxlbmd0aCwgcmV0dXJuVmFsdWVzKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ0NvdW50OyBpKyspIHsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZXNbaV0pOw0KKyAgfQ0KKyAgRlhfRnJlZShhcmdWYWx1ZXMpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgKGludDMyX3QpaUxlbmd0aDsgaSsrKSB7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocmV0dXJuVmFsdWVzW2ldKTsNCisgIH0NCisgIEZYX0ZyZWUocmV0dXJuVmFsdWVzKTsNCiB9DQotRlhKU0VfSFZBTFVFIENYRkFfRk0ySlNDb250ZXh0OjpHZXRTaW1wbGVIVmFsdWUoRlhKU0VfSE9CSkVDVCBoVGhpcywgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncywgdWludDMyX3QgaW5kZXgpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBGWFNZU19hc3NlcnQoaW5kZXggPCAodWludDMyX3QpYXJncy5HZXRMZW5ndGgoKSk7DQotICAgIEZYSlNFX0hWQUxVRSBhcmdJbmRleCA9IGFyZ3MuR2V0VmFsdWUoaW5kZXgpOw0KLSAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdJbmRleCkpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ0luZGV4LCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCi0gICAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBzaW1wbGVWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICBpZiAoaUxlbmd0aCA+IDIpIHsNCi0gICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdJbmRleCwgMSwgcHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ0luZGV4LCAyLCBqc29iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBzaW1wbGVWYWx1ZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNvYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIHNpbXBsZVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzb2JqZWN0VmFsdWUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVbmRlZmluZWQoc2ltcGxlVmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdJbmRleCk7DQotICAgICAgICByZXR1cm4gc2ltcGxlVmFsdWU7DQotICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnSW5kZXgpKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgZGVmYXVsdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdJbmRleCwgZGVmYXVsdFZhbHVlKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnSW5kZXgpOw0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsNCitGWEpTRV9IVkFMVUUgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldFNpbXBsZUhWYWx1ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBGWFNZU19hc3NlcnQoaW5kZXggPCAodWludDMyX3QpYXJncy5HZXRMZW5ndGgoKSk7DQorICBGWEpTRV9IVkFMVUUgYXJnSW5kZXggPSBhcmdzLkdldFZhbHVlKGluZGV4KTsNCisgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ0luZGV4KSkgew0KKyAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ0luZGV4LCBGWF9CU1RSQygibGVuZ3RoIiksIGxlbmd0aFZhbHVlKTsNCisgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgIEZYSlNFX0hWQUxVRSBzaW1wbGVWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIGlmIChpTGVuZ3RoID4gMikgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9IVkFMVUUganNvYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ0luZGV4LCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnSW5kZXgsIDIsIGpzb2JqZWN0VmFsdWUpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBzaW1wbGVWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNvYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIHNpbXBsZVZhbHVlKTsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzb2JqZWN0VmFsdWUpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIGFyZ0luZGV4Ow0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChzaW1wbGVWYWx1ZSk7DQogICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdJbmRleCk7DQorICAgIHJldHVybiBzaW1wbGVWYWx1ZTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnSW5kZXgpKSB7DQorICAgIEZYSlNFX0hWQUxVRSBkZWZhdWx0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnSW5kZXgsIGRlZmF1bHRWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnSW5kZXgpOw0KKyAgICByZXR1cm4gZGVmYXVsdFZhbHVlOw0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIGFyZ0luZGV4Ow0KKyAgfQ0KIH0NCi1GWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpIVmFsdWVJc051bGwoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGFyZykNCi17DQotICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQotICAgIEZYX0JPT0wgaXNOdWxsID0gRkFMU0U7DQotICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnKSkgew0KLSAgICAgICAgaXNOdWxsID0gVFJVRTsNCi0gICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZykpIHsNCi0gICAgICAgIGludDMyX3QgaUxlbmd0aCA9IGh2YWx1ZV9nZXRfYXJyYXlfbGVuZ3RoKGhUaGlzLCBhcmcpOw0KLSAgICAgICAgaWYgKGlMZW5ndGggPiAyKSB7DQotICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAyLCBqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBkZWZhdWx0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgZGVmYXVsdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChkZWZhdWx0VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICBpc051bGwgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZGVmYXVsdFZhbHVlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaXNOdWxsID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlzTnVsbCA9IFRSVUU7DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnKSkgew0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkhWYWx1ZUlzTnVsbChGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgYXJnKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgRlhfQk9PTCBpc051bGwgPSBGQUxTRTsNCisgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnKSkgew0KKyAgICBpc051bGwgPSBUUlVFOw0KKyAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZykpIHsNCisgICAgaW50MzJfdCBpTGVuZ3RoID0gaHZhbHVlX2dldF9hcnJheV9sZW5ndGgoaFRoaXMsIGFyZyk7DQorICAgIGlmIChpTGVuZ3RoID4gMikgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZywgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZywgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KICAgICAgICAgRlhKU0VfSFZBTFVFIGRlZmF1bHRWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnLCBkZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUsIGRlZmF1bHRWYWx1ZSk7DQogICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGRlZmF1bHRWYWx1ZSkpIHsNCi0gICAgICAgICAgICBpc051bGwgPSBUUlVFOw0KKyAgICAgICAgICBpc051bGwgPSBUUlVFOw0KICAgICAgICAgfQ0KICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShkZWZhdWx0VmFsdWUpOw0KLSAgICB9DQotICAgIHJldHVybiBpc051bGw7DQotfQ0KLWludDMyX3QgQ1hGQV9GTTJKU0NvbnRleHQ6Omh2YWx1ZV9nZXRfYXJyYXlfbGVuZ3RoKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBhcmcpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpbnQzMl90IGlMZW5ndGggPSAwOw0KLSAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmcpKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmcsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gaUxlbmd0aDsNCi19DQotRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6c2ltcGxlVmFsdWVDb21wYXJlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBmaXJzdFZhbHVlLCBGWEpTRV9IVkFMVUUgc2Vjb25kVmFsdWUpDQotew0KLSAgICBGWF9CT09MIGJSZXR1cm4gPSBGQUxTRTsNCi0gICAgaWYoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGZpcnN0VmFsdWUpKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBmaXJzdFN0cmluZywgc2Vjb25kU3RyaW5nOw0KLSAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGZpcnN0VmFsdWUsIGZpcnN0U3RyaW5nKTsNCi0gICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhzZWNvbmRWYWx1ZSwgc2Vjb25kU3RyaW5nKTsNCi0gICAgICAgIGJSZXR1cm4gPSBmaXJzdFN0cmluZy5FcXVhbChzZWNvbmRTdHJpbmcpOw0KLSAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzTnVtYmVyKGZpcnN0VmFsdWUpKSB7DQotICAgICAgICBGWF9GTE9BVCBmaXJzdCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGZpcnN0VmFsdWUpOw0KLSAgICAgICAgRlhfRkxPQVQgc2Vjb25kID0gSFZhbHVlVG9GbG9hdChoVGhpcywgc2Vjb25kVmFsdWUpOw0KLSAgICAgICAgYlJldHVybiA9IChmaXJzdCA9PSBzZWNvbmQpOw0KLSAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihmaXJzdFZhbHVlKSkgew0KLSAgICAgICAgYlJldHVybiA9IChGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4oZmlyc3RWYWx1ZSkgPT0gRlhKU0VfVmFsdWVfVG9Cb29sZWFuKHNlY29uZFZhbHVlKSk7DQotICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGZpcnN0VmFsdWUpICYmIEZYSlNFX1ZhbHVlX0lzTnVsbChzZWNvbmRWYWx1ZSkpIHsNCi0gICAgICAgIGJSZXR1cm4gPSAgVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gYlJldHVybjsNCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6dW5mb2xkQXJncyhGWEpTRV9IT0JKRUNUIGhUaGlzLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzLCBGWEpTRV9IVkFMVUUgKiZyZXN1bHRWYWx1ZXMsIGludDMyX3QgJmlDb3VudCwgaW50MzJfdCBpU3RhcnQpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpQ291bnQgPSAwOw0KLSAgICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KLSAgICBGWEpTRV9IVkFMVUUgKmFyZ3NWYWx1ZSA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgYXJnYyk7DQotICAgIGZvciAoaW50MzJfdCBpID0gaVN0YXJ0OyBpIDwgYXJnYzsgaSsrKSB7DQotICAgICAgICBhcmdzVmFsdWVbaV0gPSBhcmdzLkdldFZhbHVlKGkpOw0KLSAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnc1ZhbHVlW2ldKSkgew0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdzVmFsdWVbaV0sIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgaUNvdW50ICs9ICgoaUxlbmd0aCA+IDIpID8gKGlMZW5ndGggLSAyKSA6IDApOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpQ291bnQgKz0gMTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgIGlzTnVsbCA9IFRSVUU7DQogICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaXNOdWxsID0gVFJVRTsNCiAgICAgfQ0KLSAgICByZXN1bHRWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlDb3VudCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICByZXN1bHRWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmcpKSB7DQorICAgIEZYSlNFX0hWQUxVRSBkZWZhdWx0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnLCBkZWZhdWx0VmFsdWUpOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGRlZmF1bHRWYWx1ZSkpIHsNCisgICAgICBpc051bGwgPSBUUlVFOw0KICAgICB9DQotICAgIGludDMyX3QgaW5kZXggPSAwOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGFyZ2M7IGkrKykgew0KLSAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnc1ZhbHVlW2ldKSkgew0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdzVmFsdWVbaV0sIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQotICAgICAgICAgICAgaWYgKGlMZW5ndGggPiAyKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnc1ZhbHVlW2ldLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ3NWYWx1ZVtpXSwgaiwganNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUsIHJlc3VsdFZhbHVlc1tpbmRleF0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cmluZzsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cmluZyk7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDI7IGogPCBpTGVuZ3RoOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnc1ZhbHVlW2ldLCBqLCBqc09iamVjdFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyaW5nLCByZXN1bHRWYWx1ZXNbaW5kZXhdKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ3NWYWx1ZVtpXSkpIHsNCi0gICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnc1ZhbHVlW2ldLCByZXN1bHRWYWx1ZXNbaW5kZXhdKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShkZWZhdWx0VmFsdWUpOw0KKyAgfQ0KKyAgcmV0dXJuIGlzTnVsbDsNCit9DQoraW50MzJfdCBDWEZBX0ZNMkpTQ29udGV4dDo6aHZhbHVlX2dldF9hcnJheV9sZW5ndGgoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgYXJnKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gMDsNCisgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZykpIHsNCisgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmcsIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KKyAgICBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICB9DQorICByZXR1cm4gaUxlbmd0aDsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6c2ltcGxlVmFsdWVDb21wYXJlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBmaXJzdFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgc2Vjb25kVmFsdWUpIHsNCisgIEZYX0JPT0wgYlJldHVybiA9IEZBTFNFOw0KKyAgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhmaXJzdFZhbHVlKSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBmaXJzdFN0cmluZywgc2Vjb25kU3RyaW5nOw0KKyAgICBIVmFsdWVUb1VURjhTdHJpbmcoZmlyc3RWYWx1ZSwgZmlyc3RTdHJpbmcpOw0KKyAgICBIVmFsdWVUb1VURjhTdHJpbmcoc2Vjb25kVmFsdWUsIHNlY29uZFN0cmluZyk7DQorICAgIGJSZXR1cm4gPSBmaXJzdFN0cmluZy5FcXVhbChzZWNvbmRTdHJpbmcpOw0KKyAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc051bWJlcihmaXJzdFZhbHVlKSkgew0KKyAgICBGWF9GTE9BVCBmaXJzdCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGZpcnN0VmFsdWUpOw0KKyAgICBGWF9GTE9BVCBzZWNvbmQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBzZWNvbmRWYWx1ZSk7DQorICAgIGJSZXR1cm4gPSAoZmlyc3QgPT0gc2Vjb25kKTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNCb29sZWFuKGZpcnN0VmFsdWUpKSB7DQorICAgIGJSZXR1cm4gPSAoRlhKU0VfVmFsdWVfVG9Cb29sZWFuKGZpcnN0VmFsdWUpID09DQorICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9Cb29sZWFuKHNlY29uZFZhbHVlKSk7DQorICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChmaXJzdFZhbHVlKSAmJg0KKyAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Jc051bGwoc2Vjb25kVmFsdWUpKSB7DQorICAgIGJSZXR1cm4gPSBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXR1cm47DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OnVuZm9sZEFyZ3MoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUqJiByZXN1bHRWYWx1ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCkgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlDb3VudCA9IDA7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgRlhKU0VfSFZBTFVFKiBhcmdzVmFsdWUgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGFyZ2MpOw0KKyAgZm9yIChpbnQzMl90IGkgPSBpU3RhcnQ7IGkgPCBhcmdjOyBpKyspIHsNCisgICAgYXJnc1ZhbHVlW2ldID0gYXJncy5HZXRWYWx1ZShpKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnc1ZhbHVlW2ldKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdzVmFsdWVbaV0sIEZYX0JTVFJDKCJsZW5ndGgiKSwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgaUNvdW50ICs9ICgoaUxlbmd0aCA+IDIpID8gKGlMZW5ndGggLSAyKSA6IDApOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlDb3VudCArPSAxOw0KKyAgICB9DQorICB9DQorICByZXN1bHRWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlDb3VudCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICByZXN1bHRWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgfQ0KKyAgaW50MzJfdCBpbmRleCA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdzVmFsdWVbaV0pKSB7DQorICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ3NWYWx1ZVtpXSwgRlhfQlNUUkMoImxlbmd0aCIpLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICBpZiAoaUxlbmd0aCA+IDIpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdzVmFsdWVbaV0sIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDI7IGogPCBpTGVuZ3RoOyBqKyspIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnc1ZhbHVlW2ldLCBqLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgcmVzdWx0VmFsdWVzW2luZGV4XSk7DQogICAgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgICAgfQ0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmVzdWx0VmFsdWVzW2luZGV4XSwgYXJnc1ZhbHVlW2ldKTsNCisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHJpbmc7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cmluZyk7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdzVmFsdWVbaV0sIGosIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRWYWx1ZXNbaW5kZXhdKTsNCiAgICAgICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgIH0NCi0gICAgZm9yIChpbnQzMl90IGkgPSBpU3RhcnQ7IGkgPCBhcmdjOyBpKyspIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnc1ZhbHVlW2ldKTsNCi0gICAgfQ0KLSAgICBGWF9GcmVlKGFyZ3NWYWx1ZSk7DQotfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldE9iamVjdERlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaE9iamVjdFZhbHVlLCBGWEpTRV9IVkFMVUUgaERlZmF1bHRWYWx1ZSkNCi17DQotICAgIENYRkFfT2JqZWN0KiBwTm9kZSA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaE9iamVjdFZhbHVlLCBOVUxMKTsNCi0gICAgaWYgKHBOb2RlICYmIHBOb2RlLT5Jc05vZGUoKSkgew0KLSAgICAgICAgKChDWEZBX05vZGUqKXBOb2RlKS0+U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUoaERlZmF1bHRWYWx1ZSwgRkFMU0UsIChYRkFfQVRUUklCVVRFKSAtIDEpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ3NWYWx1ZVtpXSkpIHsNCisgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnc1ZhbHVlW2ldLCByZXN1bHRWYWx1ZXNbaW5kZXhdKTsNCisgICAgICBpbmRleCsrOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoRGVmYXVsdFZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXQocmVzdWx0VmFsdWVzW2luZGV4XSwgYXJnc1ZhbHVlW2ldKTsNCisgICAgICBpbmRleCsrOw0KICAgICB9DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ3NWYWx1ZVtpXSk7DQorICB9DQorICBGWF9GcmVlKGFyZ3NWYWx1ZSk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OlNldE9iamVjdERlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaE9iamVjdFZhbHVlLCBGWEpTRV9IVkFMVUUgaE5ld1ZhbHVlKQ0KLXsNCi0gICAgRlhfQk9PTCBiU3VjY2VzcyA9IEZBTFNFOw0KLSAgICBDWEZBX09iamVjdCogcE5vZGUgPSAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhPYmplY3RWYWx1ZSwgTlVMTCk7DQotICAgIGlmIChwTm9kZSAmJiBwTm9kZS0+SXNOb2RlKCkpIHsNCi0gICAgICAgICgoQ1hGQV9Ob2RlKilwTm9kZSktPlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKGhOZXdWYWx1ZSwgVFJVRSwgKFhGQV9BVFRSSUJVVEUpIC0gMSk7DQotICAgICAgICBiU3VjY2VzcyA9IFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIGJTdWNjZXNzOw0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldE9iamVjdERlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaE9iamVjdFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaERlZmF1bHRWYWx1ZSkgew0KKyAgQ1hGQV9PYmplY3QqIHBOb2RlID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0VmFsdWUsIE5VTEwpOw0KKyAgaWYgKHBOb2RlICYmIHBOb2RlLT5Jc05vZGUoKSkgew0KKyAgICAoKENYRkFfTm9kZSopcE5vZGUpDQorICAgICAgICAtPlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKGhEZWZhdWx0VmFsdWUsIEZBTFNFLCAoWEZBX0FUVFJJQlVURSktMSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhEZWZhdWx0VmFsdWUpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZW5lcmF0ZVNvbUV4cHJlc3Npb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzek5hbWUsIGludDMyX3QgaUluZGV4RmxhZ3MsIGludDMyX3QgaUluZGV4VmFsdWUsIEZYX0JPT0wgYklzU3RhciwgQ0ZYX0J5dGVTdHJpbmcmIHN6U29tRXhwKQ0KLXsNCi0gICAgaWYoYklzU3Rhcikgew0KLSAgICAgICAgc3pTb21FeHAgPSBzek5hbWUgKyBGWF9CU1RSQygiWypdIik7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYoaUluZGV4RmxhZ3MgPT0gMCkgew0KLSAgICAgICAgc3pTb21FeHAgPSBzek5hbWU7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYoaUluZGV4RmxhZ3MgPT0gMSB8fCBpSW5kZXhWYWx1ZSA9PSAwKSB7DQotICAgICAgICBzelNvbUV4cCA9IHN6TmFtZSArIEZYX0JTVFJDKCJbIikgKyBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpSW5kZXhWYWx1ZSwgRlhGT1JNQVRfU0lHTkVEKSArIEZYX0JTVFJDKCJdIik7DQotICAgIH0gZWxzZSBpZihpSW5kZXhGbGFncyA9PSAyKSB7DQotICAgICAgICBzelNvbUV4cCA9IChpSW5kZXhWYWx1ZSA8IDApID8gKHN6TmFtZSArIEZYX0JTVFJDKCJbLSIpKSA6IChzek5hbWUgKyBGWF9CU1RSQygiWysiKSk7DQotICAgICAgICBpSW5kZXhWYWx1ZSA9IChpSW5kZXhWYWx1ZSA8IDApID8gKDAgLSBpSW5kZXhWYWx1ZSkgOiBpSW5kZXhWYWx1ZTsNCi0gICAgICAgIHN6U29tRXhwICs9IENGWF9CeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKGlJbmRleFZhbHVlKTsNCi0gICAgICAgIHN6U29tRXhwICs9IEZYX0JTVFJDKCJdIik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBzelNvbUV4cCA9IChpSW5kZXhWYWx1ZSA8IDApID8gKHN6TmFtZSArIEZYX0JTVFJDKCJbIikpIDogKHN6TmFtZSArIEZYX0JTVFJDKCJbLSIpKTsNCi0gICAgICAgIGlJbmRleFZhbHVlID0gKGlJbmRleFZhbHVlIDwgMCkgPyAoMCAtIGlJbmRleFZhbHVlKSA6IGlJbmRleFZhbHVlOw0KLSAgICAgICAgc3pTb21FeHAgKz0gQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIoaUluZGV4VmFsdWUpOw0KLSAgICAgICAgc3pTb21FeHAgKz0gRlhfQlNUUkMoIl0iKTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OlNldE9iamVjdERlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaE9iamVjdFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaE5ld1ZhbHVlKSB7DQorICBGWF9CT09MIGJTdWNjZXNzID0gRkFMU0U7DQorICBDWEZBX09iamVjdCogcE5vZGUgPSAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhPYmplY3RWYWx1ZSwgTlVMTCk7DQorICBpZiAocE5vZGUgJiYgcE5vZGUtPklzTm9kZSgpKSB7DQorICAgICgoQ1hGQV9Ob2RlKilwTm9kZSkNCisgICAgICAgIC0+U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUoaE5ld1ZhbHVlLCBUUlVFLCAoWEZBX0FUVFJJQlVURSktMSk7DQorICAgIGJTdWNjZXNzID0gVFJVRTsNCisgIH0NCisgIHJldHVybiBiU3VjY2VzczsNCiB9DQotRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0T2JqZWN0QnlOYW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBhY2Nlc3NvclZhbHVlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6QWNjZXNzb3JOYW1lKQ0KLXsNCi0gICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIENYRkFfRG9jdW1lbnQgKnBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCi0gICAgaWYoIXBEb2MpIHsNCi0gICAgICAgIHJldHVybiBiRmxhZ3M7DQotICAgIH0NCi0gICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsNCi0gICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCi0gICAgRlhfRFdPUkQgZHdGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudDsNCi0gICAgaW50MzJfdCBpUmV0ID0gcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCksIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekFjY2Vzc29yTmFtZS5HZXRDU3RyKCksIHN6QWNjZXNzb3JOYW1lLkdldExlbmd0aCgpKSwgcmVzb3ZlTm9kZVJTLCBkd0ZsYWdzKTsNCi0gICAgaWYgKGlSZXQgPj0gMSAmJiByZXNvdmVOb2RlUlMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldChhY2Nlc3NvclZhbHVlLCBwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAocmVzb3ZlTm9kZVJTLm5vZGVzLkdldEF0KDApKSk7DQotICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KLSAgICB9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6R2VuZXJhdGVTb21FeHByZXNzaW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleEZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc1N0YXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzelNvbUV4cCkgew0KKyAgaWYgKGJJc1N0YXIpIHsNCisgICAgc3pTb21FeHAgPSBzek5hbWUgKyBGWF9CU1RSQygiWypdIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChpSW5kZXhGbGFncyA9PSAwKSB7DQorICAgIHN6U29tRXhwID0gc3pOYW1lOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoaUluZGV4RmxhZ3MgPT0gMSB8fCBpSW5kZXhWYWx1ZSA9PSAwKSB7DQorICAgIHN6U29tRXhwID0gc3pOYW1lICsgRlhfQlNUUkMoIlsiKSArDQorICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIoaUluZGV4VmFsdWUsIEZYRk9STUFUX1NJR05FRCkgKw0KKyAgICAgICAgICAgICAgIEZYX0JTVFJDKCJdIik7DQorICB9IGVsc2UgaWYgKGlJbmRleEZsYWdzID09IDIpIHsNCisgICAgc3pTb21FeHAgPSAoaUluZGV4VmFsdWUgPCAwKSA/IChzek5hbWUgKyBGWF9CU1RSQygiWy0iKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChzek5hbWUgKyBGWF9CU1RSQygiWysiKSk7DQorICAgIGlJbmRleFZhbHVlID0gKGlJbmRleFZhbHVlIDwgMCkgPyAoMCAtIGlJbmRleFZhbHVlKSA6IGlJbmRleFZhbHVlOw0KKyAgICBzelNvbUV4cCArPSBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpSW5kZXhWYWx1ZSk7DQorICAgIHN6U29tRXhwICs9IEZYX0JTVFJDKCJdIik7DQorICB9IGVsc2Ugew0KKyAgICBzelNvbUV4cCA9IChpSW5kZXhWYWx1ZSA8IDApID8gKHN6TmFtZSArIEZYX0JTVFJDKCJbIikpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoc3pOYW1lICsgRlhfQlNUUkMoIlstIikpOw0KKyAgICBpSW5kZXhWYWx1ZSA9IChpSW5kZXhWYWx1ZSA8IDApID8gKDAgLSBpSW5kZXhWYWx1ZSkgOiBpSW5kZXhWYWx1ZTsNCisgICAgc3pTb21FeHAgKz0gQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIoaUluZGV4VmFsdWUpOw0KKyAgICBzelNvbUV4cCArPSBGWF9CU1RSQygiXSIpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpHZXRPYmplY3RCeU5hbWUoDQorICAgIEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgIEZYSlNFX0hWQUxVRSBhY2Nlc3NvclZhbHVlLA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6QWNjZXNzb3JOYW1lKSB7DQorICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgIGlmICghcERvYykgew0KICAgICByZXR1cm4gYkZsYWdzOw0KKyAgfQ0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQorICBGWF9EV09SRCBkd0ZsYWdzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfA0KKyAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQ7DQorICBpbnQzMl90IGlSZXQgPSBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMoDQorICAgICAgcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKSwNCisgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pBY2Nlc3Nvck5hbWUuR2V0Q1N0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekFjY2Vzc29yTmFtZS5HZXRMZW5ndGgoKSksDQorICAgICAgcmVzb3ZlTm9kZVJTLCBkd0ZsYWdzKTsNCisgIGlmIChpUmV0ID49IDEgJiYgcmVzb3ZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldChhY2Nlc3NvclZhbHVlLCBwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3ZlTm9kZVJTLm5vZGVzLkdldEF0KDApKSk7DQorICAgIGJGbGFncyA9IFRSVUU7DQorICB9DQorICByZXR1cm4gYkZsYWdzOw0KIH0NCi1pbnQzMl90IENYRkFfRk0ySlNDb250ZXh0OjpSZXNvbHZlT2JqZWN0cyhGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgaFJlZlZhbHVlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzU29tRXhwLCBYRkFfUkVTT0xWRU5PREVfUlMgJnJlc292ZU5vZGVSUywgRlhfQk9PTCBiZG90QWNjZXNzb3IgLCBGWF9CT09MIGJIYXNOb1Jlc29sdmVOYW1lICkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzU29tRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1NvbUV4cC5HZXRDU3RyKCksIGJzU29tRXhwLkdldExlbmd0aCgpKTsNCi0gICAgaW50MzJfdCBpUmV0ID0gLTE7DQotICAgIENYRkFfRk0ySlNDb250ZXh0KglwQ29udGV4dCA9IChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KLSAgICBDWEZBX0RvY3VtZW50ICpwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQotICAgIGlmKCFwRG9jKSB7DQotICAgICAgICByZXR1cm4gaVJldDsNCi0gICAgfQ0KLSAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gcERvYy0+R2V0U2NyaXB0Q29udGV4dCgpOw0KLSAgICBDWEZBX09iamVjdCAqcE5vZGUgPSBOVUxMOw0KLSAgICBGWF9EV09SRCBkRmxhZ3MgPSAwVUw7DQotICAgIGlmIChiZG90QWNjZXNzb3IpIHsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoaFJlZlZhbHVlKSkgew0KLSAgICAgICAgICAgIHBOb2RlID0gcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsNCi0gICAgICAgICAgICBkRmxhZ3MgPSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwTm9kZSA9IChDWEZBX09iamVjdCAqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhSZWZWYWx1ZSwgTlVMTCk7DQotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBOb2RlKTsNCi0gICAgICAgICAgICBpZiAoYkhhc05vUmVzb2x2ZU5hbWUpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KLSAgICAgICAgICAgICAgICBpZiAocE5vZGUtPklzTm9kZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBYRkFOb2RlID0gKENYRkFfTm9kZSopcE5vZGU7DQotICAgICAgICAgICAgICAgICAgICBwWEZBTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHdzTmFtZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyBjbGFzc05hbWU7DQotICAgICAgICAgICAgICAgICAgICBwTm9kZS0+R2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICB3c05hbWUgPSBGWF9XU1RSQyhMIiMiKSArIGNsYXNzTmFtZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB3c1NvbUV4cHJlc3Npb24gPSB3c05hbWUgKyB3c1NvbUV4cHJlc3Npb247DQotICAgICAgICAgICAgICAgIGRGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBkRmxhZ3MgPSAoYnNTb21FeHAgPT0gIioiKSA/IChYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4pIDogKFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBOb2RlID0gKENYRkFfT2JqZWN0ICopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFJlZlZhbHVlLCBOVUxMKTsNCi0gICAgICAgIGRGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9BbnlDaGlsZDsNCi0gICAgfQ0KLSAgICBpUmV0ID0gcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHBOb2RlLCB3c1NvbUV4cHJlc3Npb24sIHJlc292ZU5vZGVSUywgZEZsYWdzKTsNCitpbnQzMl90IENYRkFfRk0ySlNDb250ZXh0OjpSZXNvbHZlT2JqZWN0cyhGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUmVmVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1NvbUV4cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc292ZU5vZGVSUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJkb3RBY2Nlc3NvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJIYXNOb1Jlc29sdmVOYW1lKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1NvbUV4cHJlc3Npb24gPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1NvbUV4cC5HZXRDU3RyKCksIGJzU29tRXhwLkdldExlbmd0aCgpKTsNCisgIGludDMyX3QgaVJldCA9IC0xOw0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgIGlmICghcERvYykgew0KICAgICByZXR1cm4gaVJldDsNCi19DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UGFyc2VSZXNvbHZlUmVzdWx0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IFhGQV9SRVNPTFZFTk9ERV9SUyAmcmVzb3ZlTm9kZVJTLCBGWEpTRV9IVkFMVUUgaFBhcmVudFZhbHVlLCBGWEpTRV9IVkFMVUUgKiZyZXN1bHRWYWx1ZXMsIGludDMyX3QgJmlTaXplLCBGWF9CT09MICZiQXR0cmlidXRlKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhSdW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgaVNpemUgPSAwOw0KLSAgICByZXN1bHRWYWx1ZXMgPSBOVUxMOw0KLSAgICBpZiAocmVzb3ZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7DQotICAgICAgICBiQXR0cmlidXRlID0gRkFMU0U7DQotICAgICAgICBpU2l6ZSA9IHJlc292ZU5vZGVSUy5ub2Rlcy5HZXRTaXplKCk7DQotICAgICAgICByZXN1bHRWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlTaXplKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCi0gICAgICAgICAgICByZXN1bHRWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaFJ1bnRpbWUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZXN1bHRWYWx1ZXNbaV0sIHBDb250ZXh0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHJlc292ZU5vZGVSUy5ub2Rlcy5HZXRBdChpKSkpOw0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIENYRkFfT2JqZWN0KiBwTm9kZSA9IE5VTEw7DQorICBGWF9EV09SRCBkRmxhZ3MgPSAwVUw7DQorICBpZiAoYmRvdEFjY2Vzc29yKSB7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoaFJlZlZhbHVlKSkgew0KKyAgICAgIHBOb2RlID0gcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsNCisgICAgICBkRmxhZ3MgPSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50Ow0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9IVkFMVUVBcnJheSBvYmplY3RQcm9wZXJ0aWVzKGhSdW50aW1lKTsNCi0gICAgICAgIGludDMyX3QgaVJldCA9IHJlc292ZU5vZGVSUy5HZXRBdHRyaWJ1dGVSZXN1bHQob2JqZWN0UHJvcGVydGllcyk7DQotICAgICAgICBiQXR0cmlidXRlID0gKGlSZXQgPT0gMCk7DQotICAgICAgICBpZiAoYkF0dHJpYnV0ZSkgew0KLSAgICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChoUGFyZW50VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIGlTaXplID0gMTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0VmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCAxKTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0VmFsdWVzWzBdID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhSdW50aW1lKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHJlc3VsdFZhbHVlc1swXSwgaFBhcmVudFZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlTaXplID0gaVJldDsNCi0gICAgICAgICAgICByZXN1bHRWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlTaXplKTsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdFZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShoUnVudGltZSk7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZXN1bHRWYWx1ZXNbaV0sIG9iamVjdFByb3BlcnRpZXNbaV0pOw0KLSAgICAgICAgICAgIH0NCisgICAgICBwTm9kZSA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFJlZlZhbHVlLCBOVUxMKTsNCisgICAgICBGWFNZU19hc3NlcnQocE5vZGUpOw0KKyAgICAgIGlmIChiSGFzTm9SZXNvbHZlTmFtZSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgICAgICAgaWYgKHBOb2RlLT5Jc05vZGUoKSkgew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBYRkFOb2RlID0gKENYRkFfTm9kZSopcE5vZGU7DQorICAgICAgICAgIHBYRkFOb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUsIEZBTFNFKTsNCiAgICAgICAgIH0NCisgICAgICAgIGlmICh3c05hbWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyBjbGFzc05hbWU7DQorICAgICAgICAgIHBOb2RlLT5HZXRDbGFzc05hbWUoY2xhc3NOYW1lKTsNCisgICAgICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCIjIikgKyBjbGFzc05hbWU7DQorICAgICAgICB9DQorICAgICAgICB3c1NvbUV4cHJlc3Npb24gPSB3c05hbWUgKyB3c1NvbUV4cHJlc3Npb247DQorICAgICAgICBkRmxhZ3MgPSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGRGbGFncyA9IChic1NvbUV4cCA9PSAiKiIpDQorICAgICAgICAgICAgICAgICAgICAgPyAoWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuKQ0KKyAgICAgICAgICAgICAgICAgICAgIDogKFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyk7DQorICAgICAgfQ0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBwTm9kZSA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFJlZlZhbHVlLCBOVUxMKTsNCisgICAgZEZsYWdzID0gWEZBX1JFU09MVkVOT0RFX0FueUNoaWxkOw0KKyAgfQ0KKyAgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwTm9kZSwgd3NTb21FeHByZXNzaW9uLCByZXNvdmVOb2RlUlMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRGbGFncyk7DQorICByZXR1cm4gaVJldDsNCiB9DQotaW50MzJfdCBDWEZBX0ZNMkpTQ29udGV4dDo6SFZhbHVlVG9JbnRlZ2VyKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCoJcENvbnRleHQgPSAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCi0gICAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KLSAgICBpbnQzMl90IGlWYWx1ZSA9IDA7DQotICAgIGlmKEZYSlNFX1ZhbHVlX0lzQXJyYXkoaFZhbHVlKSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5ID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChoVmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGhWYWx1ZSwgMiwganNvYmplY3RWYWx1ZSk7DQotICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQotICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzb2JqZWN0VmFsdWUsIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzb2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBpVmFsdWUgPSBIVmFsdWVUb0ludGVnZXIoaFRoaXMsIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHkpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc29iamVjdFZhbHVlKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQotICAgICAgICByZXR1cm4gaVZhbHVlOw0KLSAgICB9IGVsc2UgaWYoRlhKU0VfVmFsdWVfSXNPYmplY3QoaFZhbHVlKSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5ID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShoVmFsdWUsIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIGlWYWx1ZSA9IEhWYWx1ZVRvSW50ZWdlcihoVGhpcywgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eSk7DQotICAgICAgICByZXR1cm4gaVZhbHVlOw0KLSAgICB9IGVsc2UgaWYoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGhWYWx1ZSkpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN6VmFsdWU7DQotICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBzelZhbHVlKTsNCi0gICAgICAgIGlWYWx1ZSA9IEZYU1lTX2F0b2koc3pWYWx1ZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpVmFsdWUgPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQYXJzZVJlc29sdmVSZXN1bHQoDQorICAgIEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgIGNvbnN0IFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb3ZlTm9kZVJTLA0KKyAgICBGWEpTRV9IVkFMVUUgaFBhcmVudFZhbHVlLA0KKyAgICBGWEpTRV9IVkFMVUUqJiByZXN1bHRWYWx1ZXMsDQorICAgIGludDMyX3QmIGlTaXplLA0KKyAgICBGWF9CT09MJiBiQXR0cmlidXRlKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaVNpemUgPSAwOw0KKyAgcmVzdWx0VmFsdWVzID0gTlVMTDsNCisgIGlmIChyZXNvdmVOb2RlUlMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMpIHsNCisgICAgYkF0dHJpYnV0ZSA9IEZBTFNFOw0KKyAgICBpU2l6ZSA9IHJlc292ZU5vZGVSUy5ub2Rlcy5HZXRTaXplKCk7DQorICAgIHJlc3VsdFZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgaVNpemUpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgcmVzdWx0VmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhSdW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXQoDQorICAgICAgICAgIHJlc3VsdFZhbHVlc1tpXSwNCisgICAgICAgICAgcENvbnRleHQtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAoDQorICAgICAgICAgICAgICByZXNvdmVOb2RlUlMubm9kZXMuR2V0QXQoaSkpKTsNCiAgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9IVkFMVUVBcnJheSBvYmplY3RQcm9wZXJ0aWVzKGhSdW50aW1lKTsNCisgICAgaW50MzJfdCBpUmV0ID0gcmVzb3ZlTm9kZVJTLkdldEF0dHJpYnV0ZVJlc3VsdChvYmplY3RQcm9wZXJ0aWVzKTsNCisgICAgYkF0dHJpYnV0ZSA9IChpUmV0ID09IDApOw0KKyAgICBpZiAoYkF0dHJpYnV0ZSkgew0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChoUGFyZW50VmFsdWUpKSB7DQorICAgICAgICBpU2l6ZSA9IDE7DQorICAgICAgICByZXN1bHRWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIDEpOw0KKyAgICAgICAgcmVzdWx0VmFsdWVzWzBdID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhSdW50aW1lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZXN1bHRWYWx1ZXNbMF0sIGhQYXJlbnRWYWx1ZSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTaXplID0gaVJldDsNCisgICAgICByZXN1bHRWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlTaXplKTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgICByZXN1bHRWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaFJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHJlc3VsdFZhbHVlc1tpXSwgb2JqZWN0UHJvcGVydGllc1tpXSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK2ludDMyX3QgQ1hGQV9GTTJKU0NvbnRleHQ6OkhWYWx1ZVRvSW50ZWdlcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBpVmFsdWUgPSAwOw0KKyAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoaFZhbHVlKSkgew0KKyAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIEZYSlNFX0hWQUxVRSBqc29iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5ID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGhWYWx1ZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChoVmFsdWUsIDIsIGpzb2JqZWN0VmFsdWUpOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzb2JqZWN0VmFsdWUsIG5ld1Byb3BlcnR5KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNvYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIG5ld1Byb3BlcnR5KTsNCisgICAgfQ0KKyAgICBpVmFsdWUgPSBIVmFsdWVUb0ludGVnZXIoaFRoaXMsIG5ld1Byb3BlcnR5KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNvYmplY3RWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQogICAgIHJldHVybiBpVmFsdWU7DQorICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGhWYWx1ZSkpIHsNCisgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5ID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGhWYWx1ZSwgbmV3UHJvcGVydHkpOw0KKyAgICBpVmFsdWUgPSBIVmFsdWVUb0ludGVnZXIoaFRoaXMsIG5ld1Byb3BlcnR5KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eSk7DQorICAgIHJldHVybiBpVmFsdWU7DQorICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhoVmFsdWUpKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIHN6VmFsdWU7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIHN6VmFsdWUpOw0KKyAgICBpVmFsdWUgPSBGWFNZU19hdG9pKHN6VmFsdWUpOw0KKyAgfSBlbHNlIHsNCisgICAgaVZhbHVlID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSk7DQorICB9DQorICByZXR1cm4gaVZhbHVlOw0KIH0NCi1GWF9ET1VCTEUgQ1hGQV9GTTJKU0NvbnRleHQ6OlN0cmluZ1RvRG91YmxlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pTdHJpbmdWYWwpDQotew0KLSAgICByZXR1cm4gWEZBX0J5dGVTdHJpbmdUb0RvdWJsZShzelN0cmluZ1ZhbCk7DQorRlhfRE9VQkxFIENYRkFfRk0ySlNDb250ZXh0OjpTdHJpbmdUb0RvdWJsZSgNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelN0cmluZ1ZhbCkgew0KKyAgcmV0dXJuIFhGQV9CeXRlU3RyaW5nVG9Eb3VibGUoc3pTdHJpbmdWYWwpOw0KIH0NCi1GWF9GTE9BVCBDWEZBX0ZNMkpTQ29udGV4dDo6SFZhbHVlVG9GbG9hdChGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgYXJnKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgRlhfRkxPQVQgZlJldCA9IDAuMGY7DQotICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZykpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBqc29iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmcsIDIsIGpzb2JqZWN0VmFsdWUpOw0KLSAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KLSAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc29iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZlJldCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHkpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc29iamVjdFZhbHVlKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQotICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnKSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5ID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCi0gICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmcsIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIGZSZXQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCi0gICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnKSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNPdXRwdXQ7DQotICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnLCBic091dHB1dCk7DQotICAgICAgICBmUmV0ID0gKEZYX0ZMT0FUKVN0cmluZ1RvRG91YmxlKGJzT3V0cHV0KTsNCi0gICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChhcmcpKSB7DQotICAgICAgICBmUmV0ID0gMDsNCitGWF9GTE9BVCBDWEZBX0ZNMkpTQ29udGV4dDo6SFZhbHVlVG9GbG9hdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmcpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBGWF9GTE9BVCBmUmV0ID0gMC4wZjsNCisgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZykpIHsNCisgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBGWEpTRV9IVkFMVUUganNvYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmcsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAyLCBqc29iamVjdFZhbHVlKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBmUmV0ID0gRlhKU0VfVmFsdWVfVG9GbG9hdChhcmcpOw0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc29iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgbmV3UHJvcGVydHkpOw0KICAgICB9DQotICAgIHJldHVybiBmUmV0Ow0KKyAgICBmUmV0ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgbmV3UHJvcGVydHkpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc29iamVjdFZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnKSkgew0KKyAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHkgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnLCBuZXdQcm9wZXJ0eSk7DQorICAgIGZSZXQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBuZXdQcm9wZXJ0eSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHkpOw0KKyAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnKSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic091dHB1dDsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZywgYnNPdXRwdXQpOw0KKyAgICBmUmV0ID0gKEZYX0ZMT0FUKVN0cmluZ1RvRG91YmxlKGJzT3V0cHV0KTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQoYXJnKSkgew0KKyAgICBmUmV0ID0gMDsNCisgIH0gZWxzZSB7DQorICAgIGZSZXQgPSBGWEpTRV9WYWx1ZV9Ub0Zsb2F0KGFyZyk7DQorICB9DQorICByZXR1cm4gZlJldDsNCiB9DQotRlhfRE9VQkxFIENYRkFfRk0ySlNDb250ZXh0OjpIVmFsdWVUb0RvdWJsZShGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgYXJnKQ0KLXsNCi0gICAgQ1hGQV9GTTJKU0NvbnRleHQqCXBDb250ZXh0ID0gKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCi0gICAgRlhfRE9VQkxFIGRSZXQgPSAwOw0KLSAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmcpKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICBGWEpTRV9IVkFMVUUganNvYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHkgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZywgMSwgcHJvcGVydHlWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAyLCBqc29iamVjdFZhbHVlKTsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCi0gICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNvYmplY3RWYWx1ZSwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNvYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRSZXQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzb2JqZWN0VmFsdWUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCi0gICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmcpKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHkgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KLSAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZywgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgZFJldCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCi0gICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnKSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNPdXRwdXQ7DQotICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnLCBic091dHB1dCk7DQotICAgICAgICBkUmV0ID0gU3RyaW5nVG9Eb3VibGUoYnNPdXRwdXQpOw0KLSAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGFyZykpIHsNCi0gICAgICAgIGRSZXQgPSAwOw0KK0ZYX0RPVUJMRSBDWEZBX0ZNMkpTQ29udGV4dDo6SFZhbHVlVG9Eb3VibGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmcpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBGWF9ET1VCTEUgZFJldCA9IDA7DQorICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmcpKSB7DQorICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHkgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZywgMiwganNvYmplY3RWYWx1ZSk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNvYmplY3RWYWx1ZSwgbmV3UHJvcGVydHkpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgZFJldCA9IEZYSlNFX1ZhbHVlX1RvRG91YmxlKGFyZyk7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzb2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eSk7DQogICAgIH0NCi0gICAgcmV0dXJuIGRSZXQ7DQorICAgIGRSZXQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHkpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc29iamVjdFZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnKSkgew0KKyAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHkgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnLCBuZXdQcm9wZXJ0eSk7DQorICAgIGRSZXQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHkpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZykpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNPdXRwdXQ7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmcsIGJzT3V0cHV0KTsNCisgICAgZFJldCA9IFN0cmluZ1RvRG91YmxlKGJzT3V0cHV0KTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQoYXJnKSkgew0KKyAgICBkUmV0ID0gMDsNCisgIH0gZWxzZSB7DQorICAgIGRSZXQgPSBGWEpTRV9WYWx1ZV9Ub0RvdWJsZShhcmcpOw0KKyAgfQ0KKyAgcmV0dXJuIGRSZXQ7DQogfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkhWYWx1ZVRvVVRGOFN0cmluZyhGWEpTRV9IVkFMVUUgYXJnLCBDRlhfQnl0ZVN0cmluZyYgc3pPdXRwdXRTdHJpbmcpDQotew0KLSAgICBpZihGWEpTRV9WYWx1ZV9Jc051bGwoYXJnKSB8fCBGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChhcmcpKSB7DQotICAgICAgICBzek91dHB1dFN0cmluZyA9ICIiOw0KLSAgICB9IGVsc2UgaWYoRlhKU0VfVmFsdWVfSXNCb29sZWFuKGFyZykpIHsNCi0gICAgICAgIHN6T3V0cHV0U3RyaW5nID0gIEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihhcmcpID8gIjEiIDogIjAiOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgc3pPdXRwdXRTdHJpbmcgPSAiIjsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmcsIHN6T3V0cHV0U3RyaW5nKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkhWYWx1ZVRvVVRGOFN0cmluZyhGWEpTRV9IVkFMVUUgYXJnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3pPdXRwdXRTdHJpbmcpIHsNCisgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnKSB8fCBGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChhcmcpKSB7DQorICAgIHN6T3V0cHV0U3RyaW5nID0gIiI7DQorICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihhcmcpKSB7DQorICAgIHN6T3V0cHV0U3RyaW5nID0gRlhKU0VfVmFsdWVfVG9Cb29sZWFuKGFyZykgPyAiMSIgOiAiMCI7DQorICB9IGVsc2Ugew0KKyAgICBzek91dHB1dFN0cmluZyA9ICIiOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnLCBzek91dHB1dFN0cmluZyk7DQorICB9DQogfQ0KIHN0YXRpYyBGWEpTRV9GVU5DVElPTiBmb3JtY2FsY19mbTJqc19mdW5jdGlvbnNbXSA9IHsNCi0gICAgew0KLSAgICAgICAgIkFicyIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6QWJzDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJBdmciLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkF2Zw0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiQ2VpbCIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6Q2VpbA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiQ291bnQiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkNvdW50DQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJGbG9vciIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6Rmxvb3INCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIk1heCIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6TWF4DQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJNaW4iLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1pbg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiTW9kIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpNb2QNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIlJvdW5kIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpSb3VuZA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiU3VtIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpTdW0NCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIkRhdGUiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkRhdGUNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIkRhdGUyTnVtIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpEYXRlMk51bQ0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiRGF0ZUZtdCIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZUZtdA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiSXNvRGF0ZTJOdW0iLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6Oklzb0RhdGUyTnVtDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJJc29UaW1lMk51bSIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6SXNvVGltZTJOdW0NCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIkxvY2FsRGF0ZUZtdCIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWxEYXRlRm10DQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJMb2NhbFRpbWVGbXQiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkxvY2FsVGltZUZtdA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiTnVtMkRhdGUiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJEYXRlDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJOdW0yR01UaW1lIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yR01UaW1lDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJOdW0yVGltZSIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6TnVtMlRpbWUNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIlRpbWUiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWUNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIlRpbWUyTnVtIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpUaW1lMk51bQ0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiVGltZUZtdCIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6VGltZUZtdA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiQXByIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpBcHINCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIkN0ZXJtIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpDVGVybQ0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiRlYiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkZWDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJJcG10IiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpJUG10DQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJOUFYiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6Ok5QVg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiUG10IiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpQbXQNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIlBQbXQiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlBQbXQNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIlBWIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpQVg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiUmF0ZSIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6UmF0ZQ0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiVGVybSIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6VGVybQ0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiQ2hvb3NlIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpDaG9vc2UNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIkV4aXN0cyIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6RXhpc3RzDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJIYXNWYWx1ZSIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6SGFzVmFsdWUNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIk9uZW9mIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpPbmVvZg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiV2l0aGluIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpXaXRoaW4NCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIklmIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpJZg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiRXZhbCIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6RXZhbA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiVHJhbnNsYXRlIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpldmFsX3RyYW5zbGF0aW9uDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJSZWYiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlZg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiVW5pdFR5cGUiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlVuaXRUeXBlDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJVbml0VmFsdWUiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlVuaXRWYWx1ZQ0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiQXQiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkF0DQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJDb25jYXQiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkNvbmNhdA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiRGVjb2RlIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpEZWNvZGUNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIkVuY29kZSIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6RW5jb2RlDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJGb3JtYXQiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OkZvcm1hdA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiTGVmdCIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6TGVmdA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiTGVuIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpMZW4NCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIkxvd2VyIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpMb3dlcg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiTHRyaW0iLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6Okx0cmltDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJQYXJzZSIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6UGFyc2UNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIlJlcGxhY2UiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlcGxhY2UNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIlJpZ2h0IiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpSaWdodA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiUnRyaW0iLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlJ0cmltDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJTcGFjZSIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6U3BhY2UNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIlN0ciIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6U3RyDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJTdHVmZiIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6U3R1ZmYNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIlN1YnN0ciIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6U3Vic3RyDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJVdWlkIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpVdWlkDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJVcHBlciIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6VXBwZXINCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIldvcmROdW0iLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OldvcmROdW0NCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIkdldCIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0DQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJQb3N0IiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpQb3N0DQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJQdXQiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlB1dA0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAicG9zaXRpdmVfb3BlcmF0b3IiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OnBvc2l0aXZlX29wZXJhdG9yDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJuZWdhdGl2ZV9vcGVyYXRvciIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6bmVnYXRpdmVfb3BlcmF0b3INCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgImxvZ2ljYWxfb3Jfb3BlcmF0b3IiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfb3Jfb3BlcmF0b3INCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgImxvZ2ljYWxfYW5kX29wZXJhdG9yIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0Ojpsb2dpY2FsX2FuZF9vcGVyYXRvcg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAibG9naWNhbF9ub3Rfb3BlcmF0b3IiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfbm90X29wZXJhdG9yDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJlcXVhbGl0eV9vcGVyYXRvciIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6ZXF1YWxpdHlfb3BlcmF0b3INCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIm5vdGVxdWFsaXR5X29wZXJhdG9yIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0Ojpub3RlcXVhbGl0eV9vcGVyYXRvcg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAibGVzc19vcGVyYXRvciIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6bGVzc19vcGVyYXRvcg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAibGVzc2VxdWFsX29wZXJhdG9yIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpsZXNzZXF1YWxfb3BlcmF0b3INCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgImdyZWF0ZXJfb3BlcmF0b3IiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmdyZWF0ZXJfb3BlcmF0b3INCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgImdyZWF0ZXJlcXVhbF9vcGVyYXRvciIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6Z3JlYXRlcmVxdWFsX29wZXJhdG9yDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJwbHVzX29wZXJhdG9yIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpwbHVzX29wZXJhdG9yDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJtaW51c19vcGVyYXRvciIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6bWludXNfb3BlcmF0b3INCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgIm11bHRpcGxlX29wZXJhdG9yIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjptdWx0aXBsZV9vcGVyYXRvcg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiZGl2aWRlX29wZXJhdG9yIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0OjpkaXZpZGVfb3BlcmF0b3INCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgImFzc2lnbl92YWx1ZV9vcGVyYXRvciIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6YXNzaWduX3ZhbHVlX29wZXJhdG9yDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJkb3RfYWNjZXNzb3IiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmRvdF9hY2Nlc3Nvcg0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiZG90ZG90X2FjY2Vzc29yIiwNCi0gICAgICAgIENYRkFfRk0ySlNDb250ZXh0Ojpkb3Rkb3RfYWNjZXNzb3INCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgImNvbmNhdF9mbV9vYmplY3QiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmNvbmNhdF9mbV9vYmplY3QNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgImlzX2ZtX29iamVjdCIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6aXNfZm1fb2JqZWN0DQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJpc19mbV9hcnJheSIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6aXNfZm1fYXJyYXkNCi0gICAgfSwNCi0gICAgew0KLSAgICAgICAgImdldF9mbV92YWx1ZSIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6Z2V0X2ZtX3ZhbHVlDQotICAgIH0sDQotICAgIHsNCi0gICAgICAgICJnZXRfZm1fanNvYmoiLA0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV9qc29iag0KLSAgICB9LA0KLSAgICB7DQotICAgICAgICAiZm1fdmFyX2ZpbHRlciIsDQotICAgICAgICBDWEZBX0ZNMkpTQ29udGV4dDo6Zm1fdmFyX2ZpbHRlcg0KLSAgICB9LA0KKyAgICB7IkFicyIsIENYRkFfRk0ySlNDb250ZXh0OjpBYnN9LA0KKyAgICB7IkF2ZyIsIENYRkFfRk0ySlNDb250ZXh0OjpBdmd9LA0KKyAgICB7IkNlaWwiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Q2VpbH0sDQorICAgIHsiQ291bnQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Q291bnR9LA0KKyAgICB7IkZsb29yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkZsb29yfSwNCisgICAgeyJNYXgiLCBDWEZBX0ZNMkpTQ29udGV4dDo6TWF4fSwNCisgICAgeyJNaW4iLCBDWEZBX0ZNMkpTQ29udGV4dDo6TWlufSwNCisgICAgeyJNb2QiLCBDWEZBX0ZNMkpTQ29udGV4dDo6TW9kfSwNCisgICAgeyJSb3VuZCIsIENYRkFfRk0ySlNDb250ZXh0OjpSb3VuZH0sDQorICAgIHsiU3VtIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlN1bX0sDQorICAgIHsiRGF0ZSIsIENYRkFfRk0ySlNDb250ZXh0OjpEYXRlfSwNCisgICAgeyJEYXRlMk51bSIsIENYRkFfRk0ySlNDb250ZXh0OjpEYXRlMk51bX0sDQorICAgIHsiRGF0ZUZtdCIsIENYRkFfRk0ySlNDb250ZXh0OjpEYXRlRm10fSwNCisgICAgeyJJc29EYXRlMk51bSIsIENYRkFfRk0ySlNDb250ZXh0OjpJc29EYXRlMk51bX0sDQorICAgIHsiSXNvVGltZTJOdW0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNvVGltZTJOdW19LA0KKyAgICB7IkxvY2FsRGF0ZUZtdCIsIENYRkFfRk0ySlNDb250ZXh0OjpMb2NhbERhdGVGbXR9LA0KKyAgICB7IkxvY2FsVGltZUZtdCIsIENYRkFfRk0ySlNDb250ZXh0OjpMb2NhbFRpbWVGbXR9LA0KKyAgICB7Ik51bTJEYXRlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJEYXRlfSwNCisgICAgeyJOdW0yR01UaW1lIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJHTVRpbWV9LA0KKyAgICB7Ik51bTJUaW1lIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJUaW1lfSwNCisgICAgeyJUaW1lIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWV9LA0KKyAgICB7IlRpbWUyTnVtIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWUyTnVtfSwNCisgICAgeyJUaW1lRm10IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWVGbXR9LA0KKyAgICB7IkFwciIsIENYRkFfRk0ySlNDb250ZXh0OjpBcHJ9LA0KKyAgICB7IkN0ZXJtIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkNUZXJtfSwNCisgICAgeyJGViIsIENYRkFfRk0ySlNDb250ZXh0OjpGVn0sDQorICAgIHsiSXBtdCIsIENYRkFfRk0ySlNDb250ZXh0OjpJUG10fSwNCisgICAgeyJOUFYiLCBDWEZBX0ZNMkpTQ29udGV4dDo6TlBWfSwNCisgICAgeyJQbXQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6UG10fSwNCisgICAgeyJQUG10IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlBQbXR9LA0KKyAgICB7IlBWIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlBWfSwNCisgICAgeyJSYXRlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlJhdGV9LA0KKyAgICB7IlRlcm0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6VGVybX0sDQorICAgIHsiQ2hvb3NlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkNob29zZX0sDQorICAgIHsiRXhpc3RzIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkV4aXN0c30sDQorICAgIHsiSGFzVmFsdWUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6SGFzVmFsdWV9LA0KKyAgICB7Ik9uZW9mIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Ok9uZW9mfSwNCisgICAgeyJXaXRoaW4iLCBDWEZBX0ZNMkpTQ29udGV4dDo6V2l0aGlufSwNCisgICAgeyJJZiIsIENYRkFfRk0ySlNDb250ZXh0OjpJZn0sDQorICAgIHsiRXZhbCIsIENYRkFfRk0ySlNDb250ZXh0OjpFdmFsfSwNCisgICAgeyJUcmFuc2xhdGUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6ZXZhbF90cmFuc2xhdGlvbn0sDQorICAgIHsiUmVmIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlZn0sDQorICAgIHsiVW5pdFR5cGUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6VW5pdFR5cGV9LA0KKyAgICB7IlVuaXRWYWx1ZSIsIENYRkFfRk0ySlNDb250ZXh0OjpVbml0VmFsdWV9LA0KKyAgICB7IkF0IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkF0fSwNCisgICAgeyJDb25jYXQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Q29uY2F0fSwNCisgICAgeyJEZWNvZGUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6RGVjb2RlfSwNCisgICAgeyJFbmNvZGUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6RW5jb2RlfSwNCisgICAgeyJGb3JtYXQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Rm9ybWF0fSwNCisgICAgeyJMZWZ0IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkxlZnR9LA0KKyAgICB7IkxlbiIsIENYRkFfRk0ySlNDb250ZXh0OjpMZW59LA0KKyAgICB7Ikxvd2VyIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Okxvd2VyfSwNCisgICAgeyJMdHJpbSIsIENYRkFfRk0ySlNDb250ZXh0OjpMdHJpbX0sDQorICAgIHsiUGFyc2UiLCBDWEZBX0ZNMkpTQ29udGV4dDo6UGFyc2V9LA0KKyAgICB7IlJlcGxhY2UiLCBDWEZBX0ZNMkpTQ29udGV4dDo6UmVwbGFjZX0sDQorICAgIHsiUmlnaHQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6UmlnaHR9LA0KKyAgICB7IlJ0cmltIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlJ0cmltfSwNCisgICAgeyJTcGFjZSIsIENYRkFfRk0ySlNDb250ZXh0OjpTcGFjZX0sDQorICAgIHsiU3RyIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlN0cn0sDQorICAgIHsiU3R1ZmYiLCBDWEZBX0ZNMkpTQ29udGV4dDo6U3R1ZmZ9LA0KKyAgICB7IlN1YnN0ciIsIENYRkFfRk0ySlNDb250ZXh0OjpTdWJzdHJ9LA0KKyAgICB7IlV1aWQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6VXVpZH0sDQorICAgIHsiVXBwZXIiLCBDWEZBX0ZNMkpTQ29udGV4dDo6VXBwZXJ9LA0KKyAgICB7IldvcmROdW0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6V29yZE51bX0sDQorICAgIHsiR2V0IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldH0sDQorICAgIHsiUG9zdCIsIENYRkFfRk0ySlNDb250ZXh0OjpQb3N0fSwNCisgICAgeyJQdXQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6UHV0fSwNCisgICAgeyJwb3NpdGl2ZV9vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0Ojpwb3NpdGl2ZV9vcGVyYXRvcn0sDQorICAgIHsibmVnYXRpdmVfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6bmVnYXRpdmVfb3BlcmF0b3J9LA0KKyAgICB7ImxvZ2ljYWxfb3Jfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6bG9naWNhbF9vcl9vcGVyYXRvcn0sDQorICAgIHsibG9naWNhbF9hbmRfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6bG9naWNhbF9hbmRfb3BlcmF0b3J9LA0KKyAgICB7ImxvZ2ljYWxfbm90X29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfbm90X29wZXJhdG9yfSwNCisgICAgeyJlcXVhbGl0eV9vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0OjplcXVhbGl0eV9vcGVyYXRvcn0sDQorICAgIHsibm90ZXF1YWxpdHlfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6bm90ZXF1YWxpdHlfb3BlcmF0b3J9LA0KKyAgICB7Imxlc3Nfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6bGVzc19vcGVyYXRvcn0sDQorICAgIHsibGVzc2VxdWFsX29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Omxlc3NlcXVhbF9vcGVyYXRvcn0sDQorICAgIHsiZ3JlYXRlcl9vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0OjpncmVhdGVyX29wZXJhdG9yfSwNCisgICAgeyJncmVhdGVyZXF1YWxfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Z3JlYXRlcmVxdWFsX29wZXJhdG9yfSwNCisgICAgeyJwbHVzX29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OnBsdXNfb3BlcmF0b3J9LA0KKyAgICB7Im1pbnVzX29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Om1pbnVzX29wZXJhdG9yfSwNCisgICAgeyJtdWx0aXBsZV9vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0OjptdWx0aXBsZV9vcGVyYXRvcn0sDQorICAgIHsiZGl2aWRlX29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmRpdmlkZV9vcGVyYXRvcn0sDQorICAgIHsiYXNzaWduX3ZhbHVlX29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmFzc2lnbl92YWx1ZV9vcGVyYXRvcn0sDQorICAgIHsiZG90X2FjY2Vzc29yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmRvdF9hY2Nlc3Nvcn0sDQorICAgIHsiZG90ZG90X2FjY2Vzc29yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmRvdGRvdF9hY2Nlc3Nvcn0sDQorICAgIHsiY29uY2F0X2ZtX29iamVjdCIsIENYRkFfRk0ySlNDb250ZXh0Ojpjb25jYXRfZm1fb2JqZWN0fSwNCisgICAgeyJpc19mbV9vYmplY3QiLCBDWEZBX0ZNMkpTQ29udGV4dDo6aXNfZm1fb2JqZWN0fSwNCisgICAgeyJpc19mbV9hcnJheSIsIENYRkFfRk0ySlNDb250ZXh0Ojppc19mbV9hcnJheX0sDQorICAgIHsiZ2V0X2ZtX3ZhbHVlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV92YWx1ZX0sDQorICAgIHsiZ2V0X2ZtX2pzb2JqIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV9qc29ian0sDQorICAgIHsiZm1fdmFyX2ZpbHRlciIsIENYRkFfRk0ySlNDb250ZXh0OjpmbV92YXJfZmlsdGVyfSwNCiB9Ow0KLUNYRkFfRk0ySlNDb250ZXh0OjpDWEZBX0ZNMkpTQ29udGV4dCgpIDoNCi0gICAgbV9wRG9jdW1lbnQoTlVMTCksDQotICAgIG1faEZNQ2xhc3MoTlVMTCkNCi17DQotICAgIEZYX21lbXNldCgmbV9mbUNsYXNzLCAwLCBzaXplb2YoRlhKU0VfQ0xBU1MpKTsNCitDWEZBX0ZNMkpTQ29udGV4dDo6Q1hGQV9GTTJKU0NvbnRleHQoKSA6IG1fcERvY3VtZW50KE5VTEwpLCBtX2hGTUNsYXNzKE5VTEwpIHsNCisgIEZYX21lbXNldCgmbV9mbUNsYXNzLCAwLCBzaXplb2YoRlhKU0VfQ0xBU1MpKTsNCiB9DQotQ1hGQV9GTTJKU0NvbnRleHQ6On5DWEZBX0ZNMkpTQ29udGV4dCgpDQotew0KLSAgICBtX3BEb2N1bWVudCA9IE5VTEw7DQotICAgIGlmKG1faFZhbHVlKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG1faFZhbHVlKTsNCi0gICAgICAgIG1faFZhbHVlID0gTlVMTDsNCi0gICAgfQ0KLSAgICBtX2hTY3JpcHRSdW50aW1lID0gTlVMTDsNCitDWEZBX0ZNMkpTQ29udGV4dDo6fkNYRkFfRk0ySlNDb250ZXh0KCkgew0KKyAgbV9wRG9jdW1lbnQgPSBOVUxMOw0KKyAgaWYgKG1faFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobV9oVmFsdWUpOw0KKyAgICBtX2hWYWx1ZSA9IE5VTEw7DQorICB9DQorICBtX2hTY3JpcHRSdW50aW1lID0gTlVMTDsNCiB9DQotQ1hGQV9GTTJKU0NvbnRleHQqIENYRkFfRk0ySlNDb250ZXh0OjpDcmVhdGUoKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDWEZBX0ZNMkpTQ29udGV4dDsNCitDWEZBX0ZNMkpTQ29udGV4dCogQ1hGQV9GTTJKU0NvbnRleHQ6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBGWF9ORVcgQ1hGQV9GTTJKU0NvbnRleHQ7DQogfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkluaXRpYWxpemUoRlhKU0VfSFJVTlRJTUUgaFNjcmlwdFJ1bnRpbWUsIEZYSlNFX0hDT05URVhUIGhTY3JpcHRDb250ZXh0LCBDWEZBX0RvY3VtZW50KiBwRG9jKQ0KLXsNCi0gICAgbV9wRG9jdW1lbnQgPSBwRG9jOw0KLSAgICBtX2hTY3JpcHRSdW50aW1lID0gaFNjcmlwdFJ1bnRpbWU7DQotICAgIG1fZm1DbGFzcy5uYW1lID0gIlhGQV9GTTJKU19Gb3JtQ2FsY0NsYXNzIjsNCi0gICAgbV9mbUNsYXNzLmNvbnN0cnVjdG9yID0gTlVMTDsNCi0gICAgbV9mbUNsYXNzLnByb3BlcnRpZXMgPSBOVUxMOw0KLSAgICBtX2ZtQ2xhc3MubWV0aG9kcyA9IGZvcm1jYWxjX2ZtMmpzX2Z1bmN0aW9uczsNCi0gICAgbV9mbUNsYXNzLnByb3BOdW0gPSAwOw0KLSAgICBtX2ZtQ2xhc3MubWV0aE51bSA9IHNpemVvZihmb3JtY2FsY19mbTJqc19mdW5jdGlvbnMpIC8gc2l6ZW9mKGZvcm1jYWxjX2ZtMmpzX2Z1bmN0aW9uc1swXSk7DQotICAgIG1faEZNQ2xhc3MgPSBGWEpTRV9EZWZpbmVDbGFzcyhoU2NyaXB0Q29udGV4dCwgJm1fZm1DbGFzcyk7DQotICAgIG1faFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhTY3JpcHRSdW50aW1lKTsNCi0gICAgRlhKU0VfVmFsdWVfU2V0TnVsbChtX2hWYWx1ZSk7DQotICAgIEZYSlNFX1ZhbHVlX1NldE9iamVjdChtX2hWYWx1ZSwgdGhpcywgbV9oRk1DbGFzcyk7DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6SW5pdGlhbGl6ZShGWEpTRV9IUlVOVElNRSBoU2NyaXB0UnVudGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hDT05URVhUIGhTY3JpcHRDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCogcERvYykgew0KKyAgbV9wRG9jdW1lbnQgPSBwRG9jOw0KKyAgbV9oU2NyaXB0UnVudGltZSA9IGhTY3JpcHRSdW50aW1lOw0KKyAgbV9mbUNsYXNzLm5hbWUgPSAiWEZBX0ZNMkpTX0Zvcm1DYWxjQ2xhc3MiOw0KKyAgbV9mbUNsYXNzLmNvbnN0cnVjdG9yID0gTlVMTDsNCisgIG1fZm1DbGFzcy5wcm9wZXJ0aWVzID0gTlVMTDsNCisgIG1fZm1DbGFzcy5tZXRob2RzID0gZm9ybWNhbGNfZm0yanNfZnVuY3Rpb25zOw0KKyAgbV9mbUNsYXNzLnByb3BOdW0gPSAwOw0KKyAgbV9mbUNsYXNzLm1ldGhOdW0gPQ0KKyAgICAgIHNpemVvZihmb3JtY2FsY19mbTJqc19mdW5jdGlvbnMpIC8gc2l6ZW9mKGZvcm1jYWxjX2ZtMmpzX2Z1bmN0aW9uc1swXSk7DQorICBtX2hGTUNsYXNzID0gRlhKU0VfRGVmaW5lQ2xhc3MoaFNjcmlwdENvbnRleHQsICZtX2ZtQ2xhc3MpOw0KKyAgbV9oVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaFNjcmlwdFJ1bnRpbWUpOw0KKyAgRlhKU0VfVmFsdWVfU2V0TnVsbChtX2hWYWx1ZSk7DQorICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QobV9oVmFsdWUsIHRoaXMsIG1faEZNQ2xhc3MpOw0KIH0NCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eUdldHRlcihGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KLXsNCi0gICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwgbV9oVmFsdWUpOw0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Okdsb2JhbFByb3BlcnR5R2V0dGVyKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIG1faFZhbHVlKTsNCiB9DQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UmVsZWFzZSgpDQotew0KLSAgICBkZWxldGUgdGhpczsNCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQogfQ0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKGludDMyX3QgaVN0cmluZ0lELCAuLi4pDQotew0KLSAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCktPkdldEFwcFByb3ZpZGVyKCk7DQotICAgIEZYU1lTX2Fzc2VydChwQXBwUHJvdmlkZXIpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCi0gICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKGlTdHJpbmdJRCwgd3NGb3JtYXQpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7DQotICAgIHZhX2xpc3QgYXJnX3B0cjsNCi0gICAgdmFfc3RhcnQoYXJnX3B0ciwgaVN0cmluZ0lEKTsNCi0gICAgd3NNZXNzYWdlLkZvcm1hdFYoKGNvbnN0IEZYX1dDSEFSKil3c0Zvcm1hdCwgYXJnX3B0cik7DQotICAgIHZhX2VuZChhcmdfcHRyKTsNCi0gICAgRlhKU0VfVGhyb3dNZXNzYWdlKEZYX0JTVFJDKCIiKSwgRlhfVVRGOEVuY29kZSh3c01lc3NhZ2UsIHdzTWVzc2FnZS5HZXRMZW5ndGgoKSkpOw0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKGludDMyX3QgaVN0cmluZ0lELCAuLi4pIHsNCisgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCisgIEZYU1lTX2Fzc2VydChwQXBwUHJvdmlkZXIpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQorICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoaVN0cmluZ0lELCB3c0Zvcm1hdCk7DQorICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7DQorICB2YV9saXN0IGFyZ19wdHI7DQorICB2YV9zdGFydChhcmdfcHRyLCBpU3RyaW5nSUQpOw0KKyAgd3NNZXNzYWdlLkZvcm1hdFYoKGNvbnN0IEZYX1dDSEFSKil3c0Zvcm1hdCwgYXJnX3B0cik7DQorICB2YV9lbmQoYXJnX3B0cik7DQorICBGWEpTRV9UaHJvd01lc3NhZ2UoRlhfQlNUUkMoIiIpLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX1VURjhFbmNvZGUod3NNZXNzYWdlLCB3c01lc3NhZ2UuR2V0TGVuZ3RoKCkpKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuaAppbmRleCBmMGFjMTIwLi4wY2YwYTc3IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuaApAQCAtNiwxNjkgKzYsNDQ0IEBACiANCiAjaWZuZGVmIF9YRkFfRk0ySlNfQ09OVEVYVF9IDQogI2RlZmluZSBfWEZBX0ZNMkpTX0NPTlRFWFRfSA0KLWNsYXNzIENYRkFfRk0ySlNDb250ZXh0DQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIHZvaWQgQWJzCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgQXZnCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgQ2VpbAkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgQ291bnQJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIEZsb29yCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBNYXgJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBNaW4JCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBNb2QJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBSb3VuZAkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgU3VtCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgRGF0ZQkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBEYXRlMk51bQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIERhdGVGbXQJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgSXNvRGF0ZTJOdW0JCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBJc29UaW1lMk51bQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIExvY2FsRGF0ZUZtdAkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgTG9jYWxUaW1lRm10CShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBOdW0yRGF0ZQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIE51bTJHTVRpbWUJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBOdW0yVGltZQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIFRpbWUJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgVGltZTJOdW0JCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBUaW1lRm10CQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQorY2xhc3MgQ1hGQV9GTTJKU0NvbnRleHQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgdm9pZCBBYnMoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBBdmcoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBDZWlsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBDb3VudChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBGbG9vcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBNYXgoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBNaW4oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBNb2QoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBSb3VuZChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBTdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBEYXRlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBEYXRlMk51bShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBEYXRlRm10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBJc29EYXRlMk51bShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBJc29UaW1lMk51bShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBMb2NhbERhdGVGbXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBMb2NhbFRpbWVGbXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBOdW0yRGF0ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBOdW0yR01UaW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBOdW0yVGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBUaW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBUaW1lMk51bShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBUaW1lRm10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQogDQotICAgIHN0YXRpYyBGWF9CT09MCUlzSXNvRGF0ZUZvcm1hdAkJCShjb25zdCBGWF9DSEFSKiBwRGF0YSwgaW50MzJfdCBpTGVuZ3RoLCBpbnQzMl90ICZpU3R5bGUsIGludDMyX3QgJmlZZWFyLCBpbnQzMl90ICZpTW9udGgsIGludDMyX3QgJmlEYXkpOw0KLSAgICBzdGF0aWMgRlhfQk9PTAlJc0lzb1RpbWVGb3JtYXQJCQkoY29uc3QgRlhfQ0hBUiogcERhdGEsIGludDMyX3QgaUxlbmd0aCwgaW50MzJfdCAmaUhvdXIsIGludDMyX3QgJmlNaW51dGUsIGludDMyX3QgJmlTZWNvbmQsIGludDMyX3QgJmlNaWxsaVNlY29uZCwgaW50MzJfdCAmaVpvbmVIb3VyLCBpbnQzMl90ICZpWm9uZU1pbnV0ZSk7DQotICAgIHN0YXRpYyBGWF9CT09MCUlzSXNvRGF0ZVRpbWVGb3JtYXQJCShjb25zdCBGWF9DSEFSKiBwRGF0YSwgaW50MzJfdCBpTGVuZ3RoLCBpbnQzMl90ICZpWWVhciwgaW50MzJfdCAmaU1vbnRoLCBpbnQzMl90ICZpRGF5LCBpbnQzMl90ICZpSG91ciwgaW50MzJfdCAmaU1pbnV0ZSwgaW50MzJfdCAmaVNlY29uZCwgaW50MzJfdCAmaU1pbGxpb25TZWNvbmQsIGludDMyX3QgJmlab25lSG91ciwgaW50MzJfdCAmaVpvbmVNaW51dGUpOw0KLSAgICBzdGF0aWMgRlhfQk9PTAlMb2NhbDJJc29EYXRlCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLCBDRlhfQnl0ZVN0cmluZyAmc3RySXNvRGF0ZSk7DQotICAgIHN0YXRpYyBGWF9CT09MCUxvY2FsMklzb1RpbWUJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelRpbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsIENGWF9CeXRlU3RyaW5nICZzdHJJc29UaW1lKTsNCi0gICAgc3RhdGljIEZYX0JPT0wJSXNvRGF0ZTJMb2NhbAkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0ZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwgQ0ZYX0J5dGVTdHJpbmcgJnN0ckxvY2FsRGF0ZSk7DQotICAgIHN0YXRpYyBGWF9CT09MCUlzb1RpbWUyTG9jYWwJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelRpbWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsIENGWF9CeXRlU3RyaW5nICZzdHJMb2NhbFRpbWUpOw0KLSAgICBzdGF0aWMgRlhfQk9PTAlHZXRHTVRUaW1lCQkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VGltZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwgQ0ZYX0J5dGVTdHJpbmcgJnN0ckdNVFRpbWUpOw0KLSAgICBzdGF0aWMgaW50MzJfdCBEYXRlU3RyaW5nMk51bQkJCShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0ZVN0cmluZyk7DQotICAgIHN0YXRpYyB2b2lkCQlHZXRMb2NhbERhdGVGb3JtYXQJCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBpbnQzMl90IGlTdHlsZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLCBDRlhfQnl0ZVN0cmluZyAmc3RyRm9ybWF0LCBGWF9CT09MIGJTdGFuZGFyZCk7DQotICAgIHN0YXRpYyB2b2lkCQlHZXRMb2NhbFRpbWVGb3JtYXQJCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBpbnQzMl90IGlTdHlsZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLCBDRlhfQnl0ZVN0cmluZyAmc3RyRm9ybWF0LCBGWF9CT09MIGJTdGFuZGFyZCk7DQotICAgIHN0YXRpYyB2b2lkCQlHZXRTdGFuZGFyZERhdGVGb3JtYXQJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGludDMyX3QgaVN0eWxlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxTdHIsIENGWF9CeXRlU3RyaW5nICZzdHJGb3JtYXQpOw0KLSAgICBzdGF0aWMgdm9pZAkJR2V0U3RhbmRhcmRUaW1lRm9ybWF0CShGWEpTRV9IT0JKRUNUIGhUaGlzLCBpbnQzMl90IGlTdHlsZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLCBDRlhfQnl0ZVN0cmluZyAmc3RyRm9ybWF0KTsNCisgIHN0YXRpYyBGWF9CT09MIElzSXNvRGF0ZUZvcm1hdChjb25zdCBGWF9DSEFSKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRGF5KTsNCisgIHN0YXRpYyBGWF9CT09MIElzSXNvVGltZUZvcm1hdChjb25zdCBGWF9DSEFSKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUhvdXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU2Vjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaWxsaVNlY29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZUhvdXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVpvbmVNaW51dGUpOw0KKyAgc3RhdGljIEZYX0JPT0wgSXNJc29EYXRlVGltZUZvcm1hdChjb25zdCBGWF9DSEFSKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRGF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSG91ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVNlY29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbGxpb25TZWNvbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlab25lSG91ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVpvbmVNaW51dGUpOw0KKyAgc3RhdGljIEZYX0JPT0wgTG9jYWwySXNvRGF0ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0cklzb0RhdGUpOw0KKyAgc3RhdGljIEZYX0JPT0wgTG9jYWwySXNvVGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0cklzb1RpbWUpOw0KKyAgc3RhdGljIEZYX0JPT0wgSXNvRGF0ZTJMb2NhbChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckxvY2FsRGF0ZSk7DQorICBzdGF0aWMgRlhfQk9PTCBJc29UaW1lMkxvY2FsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyTG9jYWxUaW1lKTsNCisgIHN0YXRpYyBGWF9CT09MIEdldEdNVFRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJHTVRUaW1lKTsNCisgIHN0YXRpYyBpbnQzMl90IERhdGVTdHJpbmcyTnVtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRlU3RyaW5nKTsNCisgIHN0YXRpYyB2b2lkIEdldExvY2FsRGF0ZUZvcm1hdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YW5kYXJkKTsNCisgIHN0YXRpYyB2b2lkIEdldExvY2FsVGltZUZvcm1hdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YW5kYXJkKTsNCisgIHN0YXRpYyB2b2lkIEdldFN0YW5kYXJkRGF0ZUZvcm1hdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRm9ybWF0KTsNCisgIHN0YXRpYyB2b2lkIEdldFN0YW5kYXJkVGltZUZvcm1hdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRm9ybWF0KTsNCiANCi0gICAgc3RhdGljIHZvaWQJCU51bTJBbGxUaW1lCQkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBpbnQzMl90IGlUaW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLCBGWF9CT09MIGJHTSwgQ0ZYX0J5dGVTdHJpbmcgJnN0clRpbWUpOw0KLSAgICBzdGF0aWMgdm9pZAkJR2V0TG9jYWxUaW1lWm9uZQkJKGludDMyX3QgJmlIb3VyLCBpbnQzMl90ICZpTWluLCBpbnQzMl90ICZpU2VjKTsNCisgIHN0YXRpYyB2b2lkIE51bTJBbGxUaW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJHTSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJUaW1lKTsNCisgIHN0YXRpYyB2b2lkIEdldExvY2FsVGltZVpvbmUoaW50MzJfdCYgaUhvdXIsIGludDMyX3QmIGlNaW4sIGludDMyX3QmIGlTZWMpOw0KIA0KLSAgICBzdGF0aWMgdm9pZCBBcHIJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBDVGVybQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgRlYJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBJUG10CShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBOUFYJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBQbXQJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBQUG10CShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBQVgkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIFJhdGUJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIFRlcm0JKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIENob29zZQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIEV4aXN0cwkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIEhhc1ZhbHVlCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBPbmVvZgkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIFdpdGhpbgkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIElmCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIEV2YWwJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBSZWYJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgVW5pdFR5cGUJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIFVuaXRWYWx1ZQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgIHN0YXRpYyB2b2lkIEFwcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIENUZXJtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIEZWKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIElQbXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIE5QVihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFBtdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFBQbXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFBWKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFJhdGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFRlcm0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIENob29zZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIEV4aXN0cyhGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIEhhc1ZhbHVlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIE9uZW9mKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFdpdGhpbihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIElmKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIEV2YWwoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFJlZihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFVuaXRUeXBlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFVuaXRWYWx1ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCiANCi0gICAgc3RhdGljIHZvaWQgQXQJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgQ29uY2F0CQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgRGVjb2RlCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgRGVjb2RlVVJMCShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VVJMU3RyaW5nLCAgQ0ZYX0J5dGVUZXh0QnVmICZzelJlc3VsdEJ1Zik7DQotICAgIHN0YXRpYyB2b2lkIERlY29kZUhUTUwJKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pIVE1MU3RyaW5nLCBDRlhfQnl0ZVRleHRCdWYgJnN6UmVzdWx0QnVmKTsNCi0gICAgc3RhdGljIHZvaWQgRGVjb2RlWE1MCShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6WE1MU3RyaW5nLCAgQ0ZYX0J5dGVUZXh0QnVmICZzelJlc3VsdEJ1Zik7DQotICAgIHN0YXRpYyB2b2lkIEVuY29kZQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIEVuY29kZVVSTAkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelVSTFN0cmluZywgIENGWF9CeXRlVGV4dEJ1ZiAmc3pSZXN1bHRCdWYpOw0KLSAgICBzdGF0aWMgdm9pZCBFbmNvZGVIVE1MCShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6SFRNTFN0cmluZywgQ0ZYX0J5dGVUZXh0QnVmICZzelJlc3VsdEJ1Zik7DQotICAgIHN0YXRpYyB2b2lkIEVuY29kZVhNTAkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelhNTFN0cmluZywgIENGWF9CeXRlVGV4dEJ1ZiAmc3pSZXN1bHRCdWYpOw0KLSAgICBzdGF0aWMgRlhfQk9PTCBIVE1MU1RSMkNvZGUJKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcERhdGEsIHVpbnQzMl90ICZpQ29kZSk7DQotICAgIHN0YXRpYyBGWF9CT09MIEhUTUxDb2RlMlNUUgkodWludDMyX3QgaUNvZGUsCSAgQ0ZYX1dpZGVTdHJpbmcgJndzSFRNTFJlc2VydmUpOw0KLSAgICBzdGF0aWMgdm9pZCBGb3JtYXQJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBMZWZ0CQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgTGVuCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIExvd2VyCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgTHRyaW0JCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBQYXJzZQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIFJlcGxhY2UJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBSaWdodAkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIFJ0cmltCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgU3BhY2UJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBTdHIJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgU3R1ZmYJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBTdWJzdHIJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBVdWlkCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgVXBwZXIJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBXb3JkTnVtCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgVHJpbGxpb25VUwkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGEsIENGWF9CeXRlVGV4dEJ1ZiAmc3RyQnVmKTsNCi0gICAgc3RhdGljIHZvaWQgV29yZFVTCQkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGEsIGludDMyX3QgaVN0eWxlLCBDRlhfQnl0ZVRleHRCdWYgJnN0ckJ1Zik7DQorICBzdGF0aWMgdm9pZCBBdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBDb25jYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBEZWNvZGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBEZWNvZGVVUkwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelVSTFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0QnVmKTsNCisgIHN0YXRpYyB2b2lkIERlY29kZUhUTUwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekhUTUxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3pSZXN1bHRCdWYpOw0KKyAgc3RhdGljIHZvaWQgRGVjb2RlWE1MKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pYTUxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zik7DQorICBzdGF0aWMgdm9pZCBFbmNvZGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBFbmNvZGVVUkwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelVSTFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0QnVmKTsNCisgIHN0YXRpYyB2b2lkIEVuY29kZUhUTUwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekhUTUxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3pSZXN1bHRCdWYpOw0KKyAgc3RhdGljIHZvaWQgRW5jb2RlWE1MKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pYTUxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zik7DQorICBzdGF0aWMgRlhfQk9PTCBIVE1MU1RSMkNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwRGF0YSwgdWludDMyX3QmIGlDb2RlKTsNCisgIHN0YXRpYyBGWF9CT09MIEhUTUxDb2RlMlNUUih1aW50MzJfdCBpQ29kZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzSFRNTFJlc2VydmUpOw0KKyAgc3RhdGljIHZvaWQgRm9ybWF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTGVmdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTGVuKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTG93ZXIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTHRyaW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgUGFyc2UoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgUmVwbGFjZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgUmlnaHQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgUnRyaW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgU3BhY2UoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgU3RyKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgU3R1ZmYoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgU3Vic3RyKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgVXVpZChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgVXBwZXIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgV29yZE51bShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgVHJpbGxpb25VUyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzdHJCdWYpOw0KKyAgc3RhdGljIHZvaWQgV29yZFVTKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3RyQnVmKTsNCiANCi0gICAgc3RhdGljIHZvaWQgR2V0CQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIFBvc3QJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBQdXQJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgYXNzaWduX3ZhbHVlX29wZXJhdG9yCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgbG9naWNhbF9vcl9vcGVyYXRvcgkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBsb2dpY2FsX2FuZF9vcGVyYXRvcgkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIGVxdWFsaXR5X29wZXJhdG9yCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIG5vdGVxdWFsaXR5X29wZXJhdG9yCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIEZYX0JPT0wgZm1fcmVmX2VxdWFsCQkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgbGVzc19vcGVyYXRvcgkJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgbGVzc2VxdWFsX29wZXJhdG9yCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIGdyZWF0ZXJfb3BlcmF0b3IJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgZ3JlYXRlcmVxdWFsX29wZXJhdG9yCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgcGx1c19vcGVyYXRvcgkJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgbWludXNfb3BlcmF0b3IJCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIG11bHRpcGxlX29wZXJhdG9yCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIGRpdmlkZV9vcGVyYXRvcgkJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgcG9zaXRpdmVfb3BlcmF0b3IJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgbmVnYXRpdmVfb3BlcmF0b3IJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgbG9naWNhbF9ub3Rfb3BlcmF0b3IJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZCBkb3RfYWNjZXNzb3IJCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsCWNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyB2b2lkIGRvdGRvdF9hY2Nlc3NvcgkJCQkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQgZXZhbF90cmFuc2xhdGlvbgkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZAkJaXNfZm1fb2JqZWN0CShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZAkJaXNfZm1fYXJyYXkJCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZAkJZ2V0X2ZtX3ZhbHVlCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZAkJZ2V0X2ZtX2pzb2JqCShGWEpTRV9IT0JKRUNUIGhUaGlzLAljb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MpOw0KLSAgICBzdGF0aWMgdm9pZAkJZm1fdmFyX2ZpbHRlcgkoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCi0gICAgc3RhdGljIHZvaWQJCWNvbmNhdF9mbV9vYmplY3QoRlhKU0VfSE9CSkVDVCBoVGhpcywJY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzKTsNCisgIHN0YXRpYyB2b2lkIEdldChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFBvc3QoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFB1dChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGFzc2lnbl92YWx1ZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGxvZ2ljYWxfb3Jfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGxvZ2ljYWxfYW5kX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGVxdWFsaXR5X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIG5vdGVxdWFsaXR5X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyBGWF9CT09MIGZtX3JlZl9lcXVhbChGWEpTRV9IT0JKRUNUIGhUaGlzLCBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGxlc3Nfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGxlc3NlcXVhbF9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGdyZWF0ZXJfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGdyZWF0ZXJlcXVhbF9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIHBsdXNfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIG1pbnVzX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIG11bHRpcGxlX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGRpdmlkZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIHBvc2l0aXZlX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIG5lZ2F0aXZlX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGxvZ2ljYWxfbm90X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGRvdF9hY2Nlc3NvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGRvdGRvdF9hY2Nlc3NvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGV2YWxfdHJhbnNsYXRpb24oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGlzX2ZtX29iamVjdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGlzX2ZtX2FycmF5KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGdldF9mbV92YWx1ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGdldF9mbV9qc29iaihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGZtX3Zhcl9maWx0ZXIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGNvbmNhdF9mbV9vYmplY3QoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCiANCi0gICAgc3RhdGljIGludDMyX3QgaHZhbHVlX2dldF9hcnJheV9sZW5ndGgJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBhcmcpOw0KLSAgICBzdGF0aWMgRlhfQk9PTAkJc2ltcGxlVmFsdWVDb21wYXJlCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgZmlyc3RWYWx1ZSwgRlhKU0VfSFZBTFVFIHNlY29uZFZhbHVlKTsNCi0gICAgc3RhdGljIHZvaWQJCQl1bmZvbGRBcmdzCQkJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIENGWEpTRV9Bcmd1bWVudHMgJmFyZ3MsIEZYSlNFX0hWQUxVRSAqJnJlc3VsdFZhbHVlcywgaW50MzJfdCAmaUNvdW50LCBpbnQzMl90IGlTdGFydCA9IDApOw0KLSAgICBzdGF0aWMgdm9pZAkJCUdldE9iamVjdERlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaE9iamVjdFZhbHVlLCBGWEpTRV9IVkFMVUUgaERlZmF1bHRWYWx1ZSk7DQotICAgIHN0YXRpYyBGWF9CT09MCQlTZXRPYmplY3REZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhPYmplY3RWYWx1ZSwgRlhKU0VfSFZBTFVFIGhOZXdWYWx1ZSk7DQotICAgIHN0YXRpYyB2b2lkCQkJR2VuZXJhdGVTb21FeHByZXNzaW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pOYW1lLCBpbnQzMl90IGlJbmRleEZsYWdzLCBpbnQzMl90IGlJbmRleFZhbHVlLCBGWF9CT09MIGJJc1N0YXIsIENGWF9CeXRlU3RyaW5nJiBzelNvbUV4cCk7DQotICAgIHN0YXRpYyBGWF9CT09MCQlHZXRPYmplY3RCeU5hbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGFjY2Vzc29yVmFsdWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pBY2Nlc3Nvck5hbWUpOw0KLSAgICBzdGF0aWMgaW50MzJfdAkJUmVzb2x2ZU9iamVjdHMoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGhQYXJlbnRWYWx1ZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1NvbUV4cCwgWEZBX1JFU09MVkVOT0RFX1JTICZyZXNvdmVOb2RlUlMsIEZYX0JPT0wgYmRvdEFjY2Vzc29yID0gVFJVRSwgRlhfQk9PTCBiSGFzTm9SZXNvbHZlTmFtZSA9IEZBTFNFKTsNCi0gICAgc3RhdGljIHZvaWQJCQlQYXJzZVJlc29sdmVSZXN1bHQoRlhKU0VfSE9CSkVDVCBoVGhpcywgY29uc3QgWEZBX1JFU09MVkVOT0RFX1JTJiByZXNvdmVOb2RlUlMsIEZYSlNFX0hWQUxVRSBoUGFyZW50VmFsdWUsIEZYSlNFX0hWQUxVRSAqJnJlc3VsdFZhbHVlcywgaW50MzJfdCAmaVNpemUsIEZYX0JPT0wgJmJBdHRyaWJ1dGUpOw0KKyAgc3RhdGljIGludDMyX3QgaHZhbHVlX2dldF9hcnJheV9sZW5ndGgoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGFyZyk7DQorICBzdGF0aWMgRlhfQk9PTCBzaW1wbGVWYWx1ZUNvbXBhcmUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgZmlyc3RWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgc2Vjb25kVmFsdWUpOw0KKyAgc3RhdGljIHZvaWQgdW5mb2xkQXJncyhGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUqJiByZXN1bHRWYWx1ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwKTsNCisgIHN0YXRpYyB2b2lkIEdldE9iamVjdERlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaE9iamVjdFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoRGVmYXVsdFZhbHVlKTsNCisgIHN0YXRpYyBGWF9CT09MIFNldE9iamVjdERlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaE9iamVjdFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoTmV3VmFsdWUpOw0KKyAgc3RhdGljIHZvaWQgR2VuZXJhdGVTb21FeHByZXNzaW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUluZGV4RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW5kZXhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc1N0YXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN6U29tRXhwKTsNCisgIHN0YXRpYyBGWF9CT09MIEdldE9iamVjdEJ5TmFtZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhY2Nlc3NvclZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pBY2Nlc3Nvck5hbWUpOw0KKyAgc3RhdGljIGludDMyX3QgUmVzb2x2ZU9iamVjdHMoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUGFyZW50VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzU29tRXhwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTJiByZXNvdmVOb2RlUlMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJkb3RBY2Nlc3NvciA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJIYXNOb1Jlc29sdmVOYW1lID0gRkFMU0UpOw0KKyAgc3RhdGljIHZvaWQgUGFyc2VSZXNvbHZlUmVzdWx0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWEZBX1JFU09MVkVOT0RFX1JTJiByZXNvdmVOb2RlUlMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhQYXJlbnRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUqJiByZXN1bHRWYWx1ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkF0dHJpYnV0ZSk7DQogDQotICAgIHN0YXRpYyBGWEpTRV9IVkFMVUUgR2V0U2ltcGxlSFZhbHVlCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBDRlhKU0VfQXJndW1lbnRzICZhcmdzLCB1aW50MzJfdCBpbmRleCk7DQotICAgIHN0YXRpYyBGWF9CT09MCQlIVmFsdWVJc051bGwJKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KLSAgICBzdGF0aWMgaW50MzJfdAkJSFZhbHVlVG9JbnRlZ2VyCShGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCi0gICAgc3RhdGljIEZYX0RPVUJMRQlTdHJpbmdUb0RvdWJsZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6U3RyaW5nVmFsKTsNCi0gICAgc3RhdGljIEZYX0ZMT0FUCQlIVmFsdWVUb0Zsb2F0CShGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCi0gICAgc3RhdGljIEZYX0RPVUJMRQlIVmFsdWVUb0RvdWJsZQkoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotICAgIHN0YXRpYyB2b2lkCQkJSFZhbHVlVG9VVEY4U3RyaW5nCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBDRlhfQnl0ZVN0cmluZyYgb3V0cHV0VmFsdWUpOw0KLSAgICBDWEZBX0ZNMkpTQ29udGV4dCgpOw0KLSAgICB+Q1hGQV9GTTJKU0NvbnRleHQoKTsNCi0gICAgc3RhdGljIENYRkFfRk0ySlNDb250ZXh0KiBDcmVhdGUoKTsNCi0gICAgdm9pZCBJbml0aWFsaXplKEZYSlNFX0hSVU5USU1FIGhTY3JpcHRSdW50aW1lLCBGWEpTRV9IQ09OVEVYVCBoU2NyaXB0Q29udGV4dCwgQ1hGQV9Eb2N1bWVudCogcERvYyk7DQotICAgIHZvaWQgR2xvYmFsUHJvcGVydHlHZXR0ZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotICAgIHZvaWQgUmVsZWFzZSgpOw0KLSAgICBGWEpTRV9IUlVOVElNRSBHZXRTY3JpcHRSdW50aW1lKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faFNjcmlwdFJ1bnRpbWU7DQotICAgIH0NCi0gICAgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wRG9jdW1lbnQ7DQotICAgIH0NCi0gICAgdm9pZCBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShpbnQzMl90IGlTdHJpbmdJRCwgLi4uKTsNCi1wcml2YXRlOg0KLSAgICBGWEpTRV9IUlVOVElNRQkJCW1faFNjcmlwdFJ1bnRpbWU7DQotICAgIEZYSlNFX0NMQVNTCQkJCW1fZm1DbGFzczsNCi0gICAgRlhKU0VfSENMQVNTCQkJbV9oRk1DbGFzczsNCi0gICAgRlhKU0VfSFZBTFVFCQkJbV9oVmFsdWU7DQotICAgIENYRkFfRG9jdW1lbnQqCQkJbV9wRG9jdW1lbnQ7DQorICBzdGF0aWMgRlhKU0VfSFZBTFVFIEdldFNpbXBsZUhWYWx1ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KTsNCisgIHN0YXRpYyBGWF9CT09MIEhWYWx1ZUlzTnVsbChGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCisgIHN0YXRpYyBpbnQzMl90IEhWYWx1ZVRvSW50ZWdlcihGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCisgIHN0YXRpYyBGWF9ET1VCTEUgU3RyaW5nVG9Eb3VibGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelN0cmluZ1ZhbCk7DQorICBzdGF0aWMgRlhfRkxPQVQgSFZhbHVlVG9GbG9hdChGWEpTRV9IT0JKRUNUIGhUaGlzLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCisgIHN0YXRpYyBGWF9ET1VCTEUgSFZhbHVlVG9Eb3VibGUoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICBzdGF0aWMgdm9pZCBIVmFsdWVUb1VURjhTdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgb3V0cHV0VmFsdWUpOw0KKyAgQ1hGQV9GTTJKU0NvbnRleHQoKTsNCisgIH5DWEZBX0ZNMkpTQ29udGV4dCgpOw0KKyAgc3RhdGljIENYRkFfRk0ySlNDb250ZXh0KiBDcmVhdGUoKTsNCisgIHZvaWQgSW5pdGlhbGl6ZShGWEpTRV9IUlVOVElNRSBoU2NyaXB0UnVudGltZSwNCisgICAgICAgICAgICAgICAgICBGWEpTRV9IQ09OVEVYVCBoU2NyaXB0Q29udGV4dCwNCisgICAgICAgICAgICAgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jKTsNCisgIHZvaWQgR2xvYmFsUHJvcGVydHlHZXR0ZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICB2b2lkIFJlbGVhc2UoKTsNCisgIEZYSlNFX0hSVU5USU1FIEdldFNjcmlwdFJ1bnRpbWUoKSBjb25zdCB7IHJldHVybiBtX2hTY3JpcHRSdW50aW1lOyB9DQorICBDWEZBX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50OyB9DQorICB2b2lkIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKGludDMyX3QgaVN0cmluZ0lELCAuLi4pOw0KKw0KKyBwcml2YXRlOg0KKyAgRlhKU0VfSFJVTlRJTUUgbV9oU2NyaXB0UnVudGltZTsNCisgIEZYSlNFX0NMQVNTIG1fZm1DbGFzczsNCisgIEZYSlNFX0hDTEFTUyBtX2hGTUNsYXNzOw0KKyAgRlhKU0VfSFZBTFVFIG1faFZhbHVlOw0KKyAgQ1hGQV9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbXBhcnNlLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtcGFyc2UuY3BwCmluZGV4IDc2OGMwODAuLjYxODZkYTEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtcGFyc2UuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtcGFyc2UuY3BwCkBAIC01LDExNDEgKzUsMTE1MSBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAieGZhX2ZtMmpzLmgiDQotQ1hGQV9GTVBhcnNlOjpDWEZBX0ZNUGFyc2UoKQ0KLXsNCi0gICAgbV9wU2NyaXB0ID0gMDsNCi0gICAgbV91TGVuZ3RoID0gMDsNCi0gICAgbV9wRXJyb3JJbmZvID0gMDsNCi0gICAgbV9sZXhlciA9IDA7DQotICAgIG1fcFRva2VuID0gMDsNCitDWEZBX0ZNUGFyc2U6OkNYRkFfRk1QYXJzZSgpIHsNCisgIG1fcFNjcmlwdCA9IDA7DQorICBtX3VMZW5ndGggPSAwOw0KKyAgbV9wRXJyb3JJbmZvID0gMDsNCisgIG1fbGV4ZXIgPSAwOw0KKyAgbV9wVG9rZW4gPSAwOw0KIH0NCi1DWEZBX0ZNUGFyc2U6On5DWEZBX0ZNUGFyc2UoKQ0KLXsNCi0gICAgaWYgKG1fbGV4ZXIpIHsNCi0gICAgICAgIGRlbGV0ZSBtX2xleGVyOw0KK0NYRkFfRk1QYXJzZTo6fkNYRkFfRk1QYXJzZSgpIHsNCisgIGlmIChtX2xleGVyKSB7DQorICAgIGRlbGV0ZSBtX2xleGVyOw0KKyAgfQ0KKyAgbV9sZXhlciA9IDA7DQorICBtX3BFcnJvckluZm8gPSAwOw0KKyAgbV9wU2NyaXB0ID0gMDsNCisgIG1fcFRva2VuID0gMDsNCit9DQoraW50MzJfdCBDWEZBX0ZNUGFyc2U6OkluaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1FcnJvckluZm8qIHBFcnJvckluZm8pIHsNCisgIG1fcFNjcmlwdCA9IHdzRm9ybWNhbGMuR2V0UHRyKCk7DQorICBtX3VMZW5ndGggPSB3c0Zvcm1jYWxjLkdldExlbmd0aCgpOw0KKyAgbV9wRXJyb3JJbmZvID0gcEVycm9ySW5mbzsNCisgIG1fbGV4ZXIgPSBGWF9ORVcgQ1hGQV9GTUxleGVyKHdzRm9ybWNhbGMsIG1fcEVycm9ySW5mbyk7DQorICBpZiAobV9sZXhlciA9PSAwKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCit2b2lkIENYRkFfRk1QYXJzZTo6TmV4dFRva2VuKCkgew0KKyAgbV9wVG9rZW4gPSBtX2xleGVyLT5OZXh0VG9rZW4oKTsNCisgIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlID09IFRPS3Jlc2VydmVyKSB7DQorICAgIGlmIChtX2xleGVyLT5IYXNFcnJvcigpKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgbV9sZXhlciA9IDA7DQotICAgIG1fcEVycm9ySW5mbyA9IDA7DQotICAgIG1fcFNjcmlwdCA9IDA7DQotICAgIG1fcFRva2VuID0gMDsNCi19DQotaW50MzJfdCBDWEZBX0ZNUGFyc2U6OkluaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjLCBDWEZBX0ZNRXJyb3JJbmZvICpwRXJyb3JJbmZvKQ0KLXsNCi0gICAgbV9wU2NyaXB0ID0gd3NGb3JtY2FsYy5HZXRQdHIoKTsNCi0gICAgbV91TGVuZ3RoID0gd3NGb3JtY2FsYy5HZXRMZW5ndGgoKTsNCi0gICAgbV9wRXJyb3JJbmZvID0gcEVycm9ySW5mbzsNCi0gICAgbV9sZXhlciA9IEZYX05FVyBDWEZBX0ZNTGV4ZXIod3NGb3JtY2FsYywgbV9wRXJyb3JJbmZvKTsNCi0gICAgaWYgKG1fbGV4ZXIgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIHJldHVybiAwOw0KLX0NCi12b2lkIENYRkFfRk1QYXJzZTo6TmV4dFRva2VuKCkNCi17DQogICAgIG1fcFRva2VuID0gbV9sZXhlci0+TmV4dFRva2VuKCk7DQotICAgIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlID09IFRPS3Jlc2VydmVyKSB7DQotICAgICAgICBpZiAobV9sZXhlci0+SGFzRXJyb3IoKSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wVG9rZW4gPSBtX2xleGVyLT5OZXh0VG9rZW4oKTsNCi0gICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRk1QYXJzZTo6Q2hlY2soIFhGQV9GTV9UT0tFTiBvcCApDQotew0KLSAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBvcCkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfVE9LRU4sIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcob3ApLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KLSAgICB9DQotICAgIE5leHRUb2tlbigpOw0KK3ZvaWQgQ1hGQV9GTVBhcnNlOjpDaGVjayhYRkFfRk1fVE9LRU4gb3ApIHsNCisgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IG9wKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfVE9LRU4sDQorICAgICAgICAgIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcob3ApLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgfQ0KKyAgTmV4dFRva2VuKCk7DQogfQ0KLXZvaWQgQ1hGQV9GTVBhcnNlOjpFcnJvcihGWF9EV09SRCBsaW5lTnVtLCBYRkFfRk1fRVJSTVNHIG1zZywgLi4uKQ0KLXsNCi0gICAgbV9wRXJyb3JJbmZvLT5saW5lbnVtID0gbGluZU51bTsNCi0gICAgY29uc3QgRlhfV0NIQVIqIGxwTWVzc2FnZUluZm8gPSBYRkFfRk1fRXJyb3JNc2cobXNnKTsNCi0gICAgdmFfbGlzdCBhcDsNCi0gICAgdmFfc3RhcnQoYXAsIG1zZyk7DQotICAgIG1fcEVycm9ySW5mby0+bWVzc2FnZS5Gb3JtYXRWKGxwTWVzc2FnZUluZm8sIGFwKTsNCi0gICAgdmFfZW5kKGFwKTsNCit2b2lkIENYRkFfRk1QYXJzZTo6RXJyb3IoRlhfRFdPUkQgbGluZU51bSwgWEZBX0ZNX0VSUk1TRyBtc2csIC4uLikgew0KKyAgbV9wRXJyb3JJbmZvLT5saW5lbnVtID0gbGluZU51bTsNCisgIGNvbnN0IEZYX1dDSEFSKiBscE1lc3NhZ2VJbmZvID0gWEZBX0ZNX0Vycm9yTXNnKG1zZyk7DQorICB2YV9saXN0IGFwOw0KKyAgdmFfc3RhcnQoYXAsIG1zZyk7DQorICBtX3BFcnJvckluZm8tPm1lc3NhZ2UuRm9ybWF0VihscE1lc3NhZ2VJbmZvLCBhcCk7DQorICB2YV9lbmQoYXApOw0KIH0NCi1DRlhfUHRyQXJyYXkgKiBDWEZBX0ZNUGFyc2U6OlBhcnNlVG9wRXhwcmVzc2lvbigpDQotew0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQotICAgIENGWF9QdHJBcnJheSAqIGV4cHJlc3Npb24gPSBGWF9ORVcgQ0ZYX1B0ckFycmF5KCk7DQotICAgIHdoaWxlICgxKSB7DQotICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlb2YpIHsNCi0gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2VuZGZ1bmMpIHsNCi0gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2VuZGlmKSB7DQotICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlbHNlaWYpIHsNCi0gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Vsc2UpIHsNCi0gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Z1bmMpIHsNCi0gICAgICAgICAgICBlID0gUGFyc2VGdW5jdGlvbigpOw0KLSAgICAgICAgICAgIGlmIChlKSB7DQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24tPkFkZChlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGUgPSBQYXJzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICBpZiAoZSkgew0KLSAgICAgICAgICAgICAgICBleHByZXNzaW9uLT5BZGQoZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KK0NGWF9QdHJBcnJheSogQ1hGQV9GTVBhcnNlOjpQYXJzZVRvcEV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogZSA9IDA7DQorICBDRlhfUHRyQXJyYXkqIGV4cHJlc3Npb24gPSBGWF9ORVcgQ0ZYX1B0ckFycmF5KCk7DQorICB3aGlsZSAoMSkgew0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlb2YpIHsNCisgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCiAgICAgfQ0KLSAgICByZXR1cm4gZXhwcmVzc2lvbjsNCi19DQotQ1hGQV9GTUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlRnVuY3Rpb24oKQ0KLXsNCi0gICAgQ1hGQV9GTUV4cHJlc3Npb24gKmUgPSAwOw0KLSAgICBDRlhfV2lkZVN0cmluZ0MgaWRlbnQ7DQotICAgIENGWF9XaWRlU3RyaW5nQ0FycmF5ICogcEFyZ3VtZW50cyA9IDA7DQotICAgIENGWF9QdHJBcnJheSAqIHBFeHByZXNzaW9ucyA9IDA7DQotICAgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCi0gICAgTmV4dFRva2VuKCk7DQotICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS2lkZW50aWZpZXIpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KLSAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX0lERU5USUZJRVIsIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZGVudCA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgfQ0KLSAgICBDaGVjayhUT0tscGFyZW4pOw0KLSAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tycGFyZW4pIHsNCi0gICAgICAgIE5leHRUb2tlbigpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcEFyZ3VtZW50cyA9IEZYX05FVyBDRlhfV2lkZVN0cmluZ0NBcnJheSgpOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHA7DQotICAgICAgICB3aGlsZSAoMSkgew0KLSAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2lkZW50aWZpZXIpIHsNCi0gICAgICAgICAgICAgICAgcCA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICAgICAgICAgIHBBcmd1bWVudHMtPkFkZChwKTsNCi0gICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2NvbW1hKSB7DQotICAgICAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcnBhcmVuKSB7DQotICAgICAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgQ2hlY2soVE9LcnBhcmVuKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9JREVOVElGSUVSLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KLSAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIENoZWNrKFRPS2RvKTsNCiAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW5kZnVuYykgew0KLSAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgcmV0dXJuIGV4cHJlc3Npb247DQorICAgIH0NCisgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW5kaWYpIHsNCisgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCisgICAgfQ0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlbHNlaWYpIHsNCisgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCisgICAgfQ0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlbHNlKSB7DQorICAgICAgcmV0dXJuIGV4cHJlc3Npb247DQorICAgIH0NCisgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZnVuYykgew0KKyAgICAgIGUgPSBQYXJzZUZ1bmN0aW9uKCk7DQorICAgICAgaWYgKGUpIHsNCisgICAgICAgIGV4cHJlc3Npb24tPkFkZChlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgcEV4cHJlc3Npb25zID0gUGFyc2VUb3BFeHByZXNzaW9uKCk7DQotICAgICAgICBDaGVjayhUT0tlbmRmdW5jKTsNCisgICAgICBlID0gUGFyc2VFeHByZXNzaW9uKCk7DQorICAgICAgaWYgKGUpIHsNCisgICAgICAgIGV4cHJlc3Npb24tPkFkZChlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQotICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24obGluZSwgMCwgaWRlbnQsIHBBcmd1bWVudHMsIHBFeHByZXNzaW9ucyk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpbnQzMl90IHNpemUgPSAwOw0KLSAgICAgICAgaW50MzJfdCBpbmRleCA9IDA7DQotICAgICAgICBpZiAocEFyZ3VtZW50cykgew0KLSAgICAgICAgICAgIHBBcmd1bWVudHMtPlJlbW92ZUFsbCgpOw0KLSAgICAgICAgICAgIGRlbGV0ZSBwQXJndW1lbnRzOw0KLSAgICAgICAgICAgIHBBcmd1bWVudHMgPSAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW5kZXggPSAwOw0KLSAgICAgICAgaWYgKHBFeHByZXNzaW9ucykgew0KLSAgICAgICAgICAgIENYRkFfRk1FeHByZXNzaW9uICplMSA9IDA7DQotICAgICAgICAgICAgc2l6ZSA9IHBFeHByZXNzaW9ucy0+R2V0U2l6ZSgpOw0KLSAgICAgICAgICAgIHdoaWxlKGluZGV4IDwgc2l6ZSkgew0KLSAgICAgICAgICAgICAgICBlMSA9IChDWEZBX0ZNRXhwcmVzc2lvbiAqKXBFeHByZXNzaW9ucy0+R2V0QXQoaW5kZXgpOw0KLSAgICAgICAgICAgICAgICBkZWxldGUgZTE7DQotICAgICAgICAgICAgICAgIGluZGV4Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBFeHByZXNzaW9ucy0+UmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgZGVsZXRlIHBFeHByZXNzaW9uczsNCi0gICAgICAgICAgICBwRXhwcmVzc2lvbnMgPSAwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBlOw0KKyAgfQ0KKyAgcmV0dXJuIGV4cHJlc3Npb247DQogfQ0KLUNYRkFfRk1FeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZUV4cHJlc3Npb24oKQ0KLXsNCi0gICAgQ1hGQV9GTUV4cHJlc3Npb24gKmUgPSAwOw0KLSAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQotICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KLSAgICAgICAgY2FzZSBUT0t2YXI6DQotICAgICAgICAgICAgZSA9IFBhcnNlVmFyRXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBUT0tudWxsOg0KLSAgICAgICAgY2FzZSBUT0tudW1iZXI6DQotICAgICAgICBjYXNlIFRPS3N0cmluZzoNCi0gICAgICAgIGNhc2UgVE9LcGx1czoNCi0gICAgICAgIGNhc2UgVE9LbWludXM6DQotICAgICAgICBjYXNlIFRPS2tzbm90Og0KLSAgICAgICAgY2FzZSBUT0tpZGVudGlmaWVyOg0KLSAgICAgICAgY2FzZSBUT0tscGFyZW46DQotICAgICAgICAgICAgZSA9IFBhcnNlRXhwRXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBUT0tpZjoNCi0gICAgICAgICAgICBlID0gUGFyc2VJZkV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVE9Ld2hpbGU6DQotICAgICAgICAgICAgZSA9IFBhcnNlV2hpbGVFeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFRPS2ZvcjoNCi0gICAgICAgICAgICBlID0gUGFyc2VGb3JFeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFRPS2ZvcmVhY2g6DQotICAgICAgICAgICAgZSA9IFBhcnNlRm9yZWFjaEV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVE9LZG86DQotICAgICAgICAgICAgZSA9IFBhcnNlRG9FeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFRPS2JyZWFrOg0KLSAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbihsaW5lKTsNCi0gICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVE9LY29udGludWU6DQotICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uKGxpbmUpOw0KLSAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCi0gICAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KLSAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBlOw0KLX0NCi1DWEZBX0ZNRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VWYXJFeHByZXNzaW9uKCkNCi17DQotICAgIENYRkFfRk1FeHByZXNzaW9uICogZSA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nQyBpZGVudDsNCi0gICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KK0NYRkFfRk1FeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlRnVuY3Rpb24oKSB7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogZSA9IDA7DQorICBDRlhfV2lkZVN0cmluZ0MgaWRlbnQ7DQorICBDRlhfV2lkZVN0cmluZ0NBcnJheSogcEFyZ3VtZW50cyA9IDA7DQorICBDRlhfUHRyQXJyYXkqIHBFeHByZXNzaW9ucyA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBOZXh0VG9rZW4oKTsNCisgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS2lkZW50aWZpZXIpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9JREVOVElGSUVSLA0KKyAgICAgICAgICB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgfSBlbHNlIHsNCisgICAgaWRlbnQgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KICAgICBOZXh0VG9rZW4oKTsNCi0gICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LaWRlbnRpZmllcikgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfSURFTlRJRklFUiwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlkZW50ID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCi0gICAgICAgIE5leHRUb2tlbigpOw0KLSAgICB9DQotICAgIGlmKCBtX3BUb2tlbi0+bV90eXBlID09IFRPS2Fzc2lnbikgew0KLSAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICBlID0gUGFyc2VFeHBFeHByZXNzaW9uKCk7DQotICAgIH0NCi0gICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTVZhckV4cHJlc3Npb24obGluZSwgaWRlbnQsIGUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZGVsZXRlIGU7DQotICAgICAgICBlID0gMDsNCi0gICAgfQ0KLSAgICByZXR1cm4gZTsNCi19DQotQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlU2ltcGxlRXhwcmVzc2lvbigpDQotew0KLSAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMSA9IDAsICpwRXhwMiA9IDA7DQotICAgIHBFeHAxID0gUGFyc2VMb2dpY2FsT3JFeHByZXNzaW9uKCk7DQotICAgIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Fzc2lnbikgew0KLSAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICBwRXhwMiA9IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOw0KLSAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBwRXhwMSA9IEZYX05FVyBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbihsaW5lLCBUT0thc3NpZ24sIHBFeHAxLCBwRXhwMik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGRlbGV0ZSBwRXhwMTsNCi0gICAgICAgICAgICBwRXhwMSA9IDA7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIHBFeHAxOw0KLX0NCi1DWEZBX0ZNRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VFeHBFeHByZXNzaW9uKCkNCi17DQotICAgIENYRkFfRk1FeHByZXNzaW9uICplID0gMDsNCi0gICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEgPSAwIDsNCi0gICAgcEV4cDEgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCi0gICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUV4cEV4cHJlc3Npb24obGluZSwgcEV4cDEpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZGVsZXRlIHBFeHAxOw0KLSAgICAgICAgZSA9IDA7DQotICAgIH0NCi0gICAgcmV0dXJuIGU7DQotfQ0KLUNYRkFfRk1TaW1wbGVFeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKQ0KLXsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUxID0gMCwgKmUyID0gMDsNCi0gICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KLSAgICBlMSA9IFBhcnNlTG9naWNhbEFuZEV4cHJlc3Npb24oKTsNCi0gICAgZm9yICg7Oykgew0KLSAgICAgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQotICAgICAgICAgICAgY2FzZSBUT0tvcjoNCi0gICAgICAgICAgICBjYXNlIFRPS2tzb3I6DQotICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICBlMiA9IFBhcnNlTG9naWNhbEFuZEV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uKGxpbmUsIFRPS29yLCBlMSwgZTIpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUxOw0KLSAgICAgICAgICAgICAgICAgICAgZTEgPSAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgcmV0dXJuIGUxOw0KLX0NCi1DWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VMb2dpY2FsQW5kRXhwcmVzc2lvbigpDQotew0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZTEgPSAwLCAqZTIgPSAwOw0KLSAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQotICAgIGUxID0gUGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKTsNCi0gICAgZm9yICg7Oykgew0KLSAgICAgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQotICAgICAgICAgICAgY2FzZSBUT0thbmQ6DQotICAgICAgICAgICAgY2FzZSBUT0trc2FuZDoNCi0gICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgICAgIGUyID0gUGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbihsaW5lLCBUT0thbmQsIGUxLCBlMik7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTE7DQotICAgICAgICAgICAgICAgICAgICBlMSA9IDA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gZTE7DQotfQ0KLUNYRkFfRk1TaW1wbGVFeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZUVxdWFsaXR5RXhwcmVzc2lvbigpDQotew0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZTEgPSAwLCAqZTIgPSAwOw0KLSAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQotICAgIGUxID0gUGFyc2VSZWxhdGlvbmFsRXhwcmVzc2lvbigpOw0KLSAgICBmb3IgKDs7KSB7DQotICAgICAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCi0gICAgICAgICAgICBjYXNlIFRPS2VxOg0KLSAgICAgICAgICAgIGNhc2UgVE9La3NlcToNCi0gICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgICAgIGUyID0gUGFyc2VSZWxhdGlvbmFsRXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbihsaW5lLCBUT0tlcSwgZTEsIGUyKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICBjYXNlIFRPS25lOg0KLSAgICAgICAgICAgIGNhc2UgVE9La3NuZToNCi0gICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgICAgIGUyID0gUGFyc2VSZWxhdGlvbmFsRXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbihsaW5lLCBUT0tuZSwgZTEsIGUyKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBlMTsNCi19DQotQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlUmVsYXRpb25hbEV4cHJlc3Npb24oKQ0KLXsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUxID0gMCwgKmUyID0gMDsNCi0gICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KLSAgICBlMSA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsNCi0gICAgZm9yICg7Oykgew0KLSAgICAgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQotICAgICAgICAgICAgY2FzZSBUT0tsdDoNCi0gICAgICAgICAgICBjYXNlIFRPS2tzbHQ6DQotICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICBlMiA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbihsaW5lLCBUT0tsdCwgZTEsIGUyKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICBjYXNlIFRPS2d0Og0KLSAgICAgICAgICAgIGNhc2UgVE9La3NndDoNCi0gICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgICAgIGUyID0gUGFyc2VBZGR0aXZlRXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKGxpbmUsIFRPS2d0LCBlMSwgZTIpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUxOw0KLSAgICAgICAgICAgICAgICAgICAgZTEgPSAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIGNhc2UgVE9LbGU6DQotICAgICAgICAgICAgY2FzZSBUT0trc2xlOg0KLSAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICAgICAgZTIgPSBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBlMSA9IEZYX05FVyBDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24obGluZSwgVE9LbGUsIGUxLCBlMik7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTE7DQotICAgICAgICAgICAgICAgICAgICBlMSA9IDA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgY2FzZSBUT0tnZToNCi0gICAgICAgICAgICBjYXNlIFRPS2tzZ2U6DQotICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICBlMiA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbihsaW5lLCBUT0tnZSwgZTEsIGUyKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBlMTsNCi19DQotQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKQ0KLXsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUxID0gMCwgKmUyID0gMDsNCi0gICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KLSAgICBlMSA9IFBhcnNlTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7DQotICAgIGZvciAoOzspIHsNCi0gICAgICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KLSAgICAgICAgICAgIGNhc2UgVE9LcGx1czoNCi0gICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgICAgIGUyID0gUGFyc2VNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24obGluZSwgVE9LcGx1cywgZTEsIGUyKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICBjYXNlIFRPS21pbnVzOg0KLSAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICAgICAgZTIgPSBQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbihsaW5lLCBUT0ttaW51cywgZTEsIGUyKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlMTsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBlMTsNCi19DQotQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkNCi17DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplMSA9IDAsICplMiA9IDA7DQotICAgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCi0gICAgZTEgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOw0KLSAgICBmb3IgKDs7KSB7DQotICAgICAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCi0gICAgICAgICAgICBjYXNlIFRPS211bDoNCi0gICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgICAgIGUyID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24obGluZSwgVE9LbXVsLCBlMSwgZTIpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUxOw0KLSAgICAgICAgICAgICAgICAgICAgZTEgPSAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIGNhc2UgVE9LZGl2Og0KLSAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICAgICAgZTIgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbihsaW5lLCBUT0tkaXYsIGUxLCBlMik7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTE7DQotICAgICAgICAgICAgICAgICAgICBlMSA9IDA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gZTE7DQotfQ0KLUNYRkFfRk1TaW1wbGVFeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZVVuYXJ5RXhwcmVzc2lvbigpDQotew0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZSA9IDA7DQotICAgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCi0gICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQotICAgICAgICBjYXNlIFRPS3BsdXM6DQotICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgZSA9IFBhcnNlVW5hcnlFeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNUG9zRXhwcmVzc2lvbihsaW5lLCBlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBlID0gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFRPS21pbnVzOg0KLSAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgIGUgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTU5lZ0V4cHJlc3Npb24obGluZSwgZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZSA9IDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBUT0trc25vdDoNCi0gICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICBlID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Ob3RFeHByZXNzaW9uKGxpbmUsIGUpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGUgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgZSA9IFBhcnNlUHJpbWFyeUV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gZTsNCi19DQotQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlUHJpbWFyeUV4cHJlc3Npb24oKQ0KLXsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUgPSAwOw0KLSAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQotICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KLSAgICAgICAgY2FzZSBUT0tudW1iZXI6DQotICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbihsaW5lLCBtX3BUb2tlbi0+bV93c3RyaW5nKTsNCi0gICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVE9Lc3RyaW5nOg0KLSAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTVN0cmluZ0V4cHJlc3Npb24obGluZSwgbV9wVG9rZW4tPm1fd3N0cmluZyk7DQotICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFRPS2lkZW50aWZpZXI6IHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllcihtX3BUb2tlbi0+bV93c3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2xicmFja2V0KSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IFBhcnNlSW5kZXhFeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgICAgICAgICBpZihzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKGxpbmUsIE5VTEwsIFRPS2RvdCwgd3NJZGVudGlmaWVyLCBzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uKGxpbmUsIHdzSWRlbnRpZmllcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFRPS2lmOg0KLSAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubihsaW5lLCBtX3BUb2tlbi0+bV93c3RyaW5nKTsNCi0gICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVE9LbnVsbDoNCi0gICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1OdWxsRXhwcmVzc2lvbihsaW5lKTsNCi0gICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVE9LbHBhcmVuOg0KLSAgICAgICAgICAgIGUgPSBQYXJzZVBhcmVuRXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCi0gICAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KLSAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGUgPSBQYXJzZVBvc3RFeHByZXNzaW9uKGUpOw0KLSAgICBpZiAoIShtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSkgew0KLSAgICAgICAgZGVsZXRlIGU7DQotICAgICAgICBlID0gMDsNCi0gICAgfQ0KLSAgICByZXR1cm4gZTsNCi19DQotQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKkNYRkFfRk1QYXJzZTo6UGFyc2VQb3N0RXhwcmVzc2lvbihDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZSkNCi17DQotICAgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgIH0NCisgIENoZWNrKFRPS2xwYXJlbik7DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tycGFyZW4pIHsNCisgICAgTmV4dFRva2VuKCk7DQorICB9IGVsc2Ugew0KKyAgICBwQXJndW1lbnRzID0gRlhfTkVXIENGWF9XaWRlU3RyaW5nQ0FycmF5KCk7DQorICAgIENGWF9XaWRlU3RyaW5nQyBwOw0KICAgICB3aGlsZSAoMSkgew0KLSAgICAgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQotICAgICAgICAgICAgY2FzZSBUT0tscGFyZW46IHsNCi0gICAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5ICpwQXJyYXkgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5ID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZSA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGQoZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LY29tbWEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW9mKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhUT0tycGFyZW4pLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNQ2FsbEV4cHJlc3Npb24obGluZSwgZSwgcEFycmF5LCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LbGJyYWNrZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbihsaW5lLCBlLCBUT0tjYWxsLCBGWF9XU1RSQyhMIiIpLCBzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTaXplID0gcEFycmF5LT5HZXRTaXplKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcFRlbXAgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKilwQXJyYXktPkdldEF0KGkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFRlbXA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwQXJyYXk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgZSA9IDA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUT0tkb3Q6DQotICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tpZGVudGlmaWVyKSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MgdGVtcFN0ciA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0ZW1wTGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KLSAgICAgICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tscGFyZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cEFjY2Vzc29yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwQ2FsbDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwRXhwQWNjZXNzb3IgPSBlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSAqcEFycmF5ID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5ID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpleHAgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkKGV4cCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tjb21tYSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2VvZikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfVE9LRU4sIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcoVE9LcnBhcmVuKSwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcElkZW50aWZpZXIgPSBGWF9ORVcgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubih0ZW1wTGluZSwgdGVtcFN0cik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHBDYWxsID0gRlhfTkVXIENYRkFfRk1DYWxsRXhwcmVzc2lvbihsaW5lLCBwSWRlbnRpZmllciwgcEFycmF5LCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24obGluZSwgcEV4cEFjY2Vzc29yLCBwRXhwQ2FsbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tsYnJhY2tldCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24obGluZSwgZSwgVE9LY2FsbCwgRlhfV1NUUkMoTCIiKSwgcyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU2l6ZSA9IHBBcnJheS0+R2V0U2l6ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcFRlbXAgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKilwQXJyYXktPkdldEF0KGkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBUZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwQXJyYXk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LbGJyYWNrZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IFBhcnNlSW5kZXhFeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHM7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKHRlbXBMaW5lLCBlLCBUT0tkb3QsIHRlbXBTdHIsIHMpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IEZYX05FVyBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKHRlbXBMaW5lLCBBQ0NFU1NPUl9OT19JTkRFWCwgTlVMTCwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbihsaW5lLCBlLCBUT0tkb3QsIHRlbXBTdHIsIHMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICAgICAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfSURFTlRJRklFUiwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVE9LZG90ZG90Og0KLSAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LaWRlbnRpZmllcikgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHRlbXBTdHIgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdGVtcExpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCi0gICAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LbGJyYWNrZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IFBhcnNlSW5kZXhFeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHM7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uKHRlbXBMaW5lLCBlLCBUT0tkb3Rkb3QsIHRlbXBTdHIsIHMpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IEZYX05FVyBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKHRlbXBMaW5lLCBBQ0NFU1NPUl9OT19JTkRFWCwgTlVMTCwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbihsaW5lLCBlLCBUT0tkb3Rkb3QsIHRlbXBTdHIsIHMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICAgICAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfSURFTlRJRklFUiwgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRPS2RvdHNjcmVhbToNCi0gICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2lkZW50aWZpZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB0ZW1wU3RyID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRlbXBMaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQotICAgICAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2xicmFja2V0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbih0ZW1wTGluZSwgZSwgVE9LZG90c2NyZWFtLCB0ZW1wU3RyLCBzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnMgPSBGWF9ORVcgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbih0ZW1wTGluZSwgQUNDRVNTT1JfTk9fSU5ERVgsIE5VTEwsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24obGluZSwgZSwgVE9LZG90c2NyZWFtLCB0ZW1wU3RyLCBzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KLSAgICAgICAgICAgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX0lERU5USUZJRVIsICB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUT0tkb3RzdGFyOiB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcyA9IEZYX05FVyBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKGxpbmUsIEFDQ0VTU09SX05PX0lOREVYLCBOVUxMLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24obGluZSwgZSwgVE9LZG90c3RhciwgRlhfV1NUUkMoTCIqIiksIHMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHJldHVybiBlOw0KLSAgICAgICAgfQ0KKyAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2lkZW50aWZpZXIpIHsNCisgICAgICAgIHAgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgcEFyZ3VtZW50cy0+QWRkKHApOw0KICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGU7DQotfQ0KLUNYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpDWEZBX0ZNUGFyc2U6OlBhcnNlSW5kZXhFeHByZXNzaW9uKCkNCi17DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwID0gMDsNCi0gICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KLSAgICBOZXh0VG9rZW4oKTsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnMgPSAwOw0KLSAgICBYRkFfRk1fQWNjZXNzb3JJbmRleCBhY2Nlc3NvckluZGV4ID0gQUNDRVNTT1JfTk9fUkVMQVRJVkVJTkRFWDsNCi0gICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LbXVsKSB7DQotICAgICAgICBwRXhwID0gRlhfTkVXIENYRkFfRk1JbmRleEV4cHJlc3Npb24obGluZSwgYWNjZXNzb3JJbmRleCwgcywgVFJVRSk7DQotICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JicmFja2V0KSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLCBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKFRPS3JwYXJlbiksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQotICAgICAgICAgICAgaWYgKHBFeHApIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIHBFeHA7DQotICAgICAgICAgICAgICAgIHBFeHAgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwRXhwOw0KLSAgICB9DQotICAgIGlmKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcGx1cykgew0KLSAgICAgICAgYWNjZXNzb3JJbmRleCA9IEFDQ0VTU09SX1BPU0lUSVZFX0lOREVYOw0KLSAgICAgICAgTmV4dFRva2VuKCk7DQotICAgIH0gZWxzZSBpZihtX3BUb2tlbi0+bV90eXBlID09IFRPS21pbnVzKSB7DQotICAgICAgICBhY2Nlc3NvckluZGV4ID0gQUNDRVNTT1JfTkVHQVRJVkVfSU5ERVg7DQotICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgfQ0KLSAgICBzID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQotICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JicmFja2V0KSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCi0gICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhUT0tycGFyZW4pLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KLSAgICAgICAgaWYgKHMpIHsNCi0gICAgICAgICAgICBkZWxldGUgczsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBFeHAgPSBGWF9ORVcgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbihsaW5lLCBhY2Nlc3NvckluZGV4LCBzLCBGQUxTRSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBFeHA7DQotfQ0KLUNYRkFfRk1TaW1wbGVFeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZVBhcmVuRXhwcmVzc2lvbigpDQotew0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEgPSAwLCAqcEV4cDIgPSAwOw0KLSAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQotICAgIENoZWNrKFRPS2xwYXJlbik7DQotICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgew0KLSAgICAgICAgcEV4cDEgPSBQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKTsNCi0gICAgICAgIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Fzc2lnbikgew0KLSAgICAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgICAgIHBFeHAyID0gUGFyc2VMb2dpY2FsT3JFeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgcEV4cDEgPSBGWF9ORVcgQ1hGQV9GTUFzc2lnbkV4cHJlc3Npb24obGluZSwgVE9LYXNzaWduLCBwRXhwMSwgcEV4cDIpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBwRXhwMTsNCi0gICAgICAgICAgICAgICAgcEV4cDEgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIENoZWNrKFRPS3JwYXJlbik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcEV4cDE7DQotfQ0KLUNYRkFfRk1FeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZUJsb2NrRXhwcmVzc2lvbigpDQotew0KLSAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQotICAgIENYRkFfRk1FeHByZXNzaW9uICplID0gMDsNCi0gICAgQ0ZYX1B0ckFycmF5ICogZXhwcmVzc2lvbiA9IEZYX05FVyBDRlhfUHRyQXJyYXkoKTsNCi0gICAgd2hpbGUgKDEpIHsNCi0gICAgICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KLSAgICAgICAgICAgIGNhc2UgVE9LZW9mOg0KLSAgICAgICAgICAgIGNhc2UgVE9LZW5kaWY6DQotICAgICAgICAgICAgY2FzZSBUT0tlbHNlaWY6DQotICAgICAgICAgICAgY2FzZSBUT0tlbHNlOg0KLSAgICAgICAgICAgIGNhc2UgVE9LZW5kd2hpbGU6DQotICAgICAgICAgICAgY2FzZSBUT0tlbmRmb3I6DQotICAgICAgICAgICAgY2FzZSBUT0tlbmQ6DQotICAgICAgICAgICAgY2FzZSBUT0tlbmRmdW5jOg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRPS2Z1bmM6DQotICAgICAgICAgICAgICAgIGUgPSBQYXJzZUZ1bmN0aW9uKCk7DQotICAgICAgICAgICAgICAgIGlmIChlKSB7DQotICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLT5BZGQoZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgZSA9IFBhcnNlRXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgICAgICBpZiAoZSkgew0KLSAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi0+QWRkKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbiAqcEV4cCA9IDA7DQotICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQotICAgICAgICBwRXhwID0gRlhfTkVXIENYRkFfRk1CbG9ja0V4cHJlc3Npb24obGluZSwgZXhwcmVzc2lvbik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpbnQzMl90IHNpemUgPSBleHByZXNzaW9uLT5HZXRTaXplKCk7DQotICAgICAgICBpbnQzMl90IGluZGV4ID0gMDsNCi0gICAgICAgIHdoaWxlKGluZGV4IDwgc2l6ZSkgew0KLSAgICAgICAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24gKilleHByZXNzaW9uLT5HZXRBdChpbmRleCk7DQotICAgICAgICAgICAgZGVsZXRlIGU7DQotICAgICAgICAgICAgaW5kZXgrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIGV4cHJlc3Npb24tPlJlbW92ZUFsbCgpOw0KLSAgICAgICAgZGVsZXRlIGV4cHJlc3Npb247DQotICAgICAgICBleHByZXNzaW9uID0gMDsNCi0gICAgfQ0KLSAgICByZXR1cm4gcEV4cDsNCi19DQotQ1hGQV9GTUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlSWZFeHByZXNzaW9uKCkNCi17DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwcmVzc2lvbiA9IDA7DQotICAgIENYRkFfRk1FeHByZXNzaW9uCSpwSWZFeHByZXNzaW9uID0gMDsNCi0gICAgQ1hGQV9GTUV4cHJlc3Npb24gICpwRWxzZUV4cHJlc3Npb24gPSAwOw0KLSAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnRQb3MgPSBtX2xleGVyLT5TYXZlUG9zKCk7DQotICAgIE5leHRUb2tlbigpOw0KLSAgICBDaGVjayhUT0tscGFyZW4pOw0KLSAgICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCi0gICAgICAgIGlmIChwRXhwcmVzc2lvbikgew0KLSAgICAgICAgICAgIGRlbGV0ZSBwRXhwcmVzc2lvbjsNCi0gICAgICAgIH0NCi0gICAgICAgIHBFeHByZXNzaW9uID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQogICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tjb21tYSkgew0KLSAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcnBhcmVuKSB7DQorICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIENoZWNrKFRPS3JwYXJlbik7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9JREVOVElGSUVSLA0KKyAgICAgICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KICAgICB9DQotICAgIENoZWNrKFRPS3JwYXJlbik7DQotICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3RoZW4pIHsNCi0gICAgICAgIGlmIChwRXhwcmVzc2lvbikgew0KLSAgICAgICAgICAgIGRlbGV0ZSBwRXhwcmVzc2lvbjsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fbGV4ZXItPlNldEN1cnJlbnRMaW5lKGxpbmUpOw0KLSAgICAgICAgbV9wVG9rZW4gPSBGWF9ORVcgQ1hGQV9GTVRva2VuKGxpbmUpOw0KLSAgICAgICAgbV9wVG9rZW4tPm1fdHlwZSA9IFRPS2lkZW50aWZpZXI7DQotICAgICAgICBtX3BUb2tlbi0+bV93c3RyaW5nID0gRlhfV1NUUkMoTCJpZiIpOw0KLSAgICAgICAgbV9sZXhlci0+U2V0VG9rZW4obV9wVG9rZW4pOw0KLSAgICAgICAgbV9sZXhlci0+UmVzdG9yZVBvcyhwU3RhcnRQb3MpOw0KLSAgICAgICAgcmV0dXJuIFBhcnNlRXhwRXhwcmVzc2lvbigpOw0KLSAgICB9DQotICAgIENoZWNrKFRPS3RoZW4pOw0KLSAgICBwSWZFeHByZXNzaW9uID0gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsNCi0gICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQotICAgICAgICBjYXNlIFRPS2VvZjoNCi0gICAgICAgIGNhc2UgVE9LZW5kaWY6DQotICAgICAgICAgICAgQ2hlY2soVE9LZW5kaWYpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBUT0tpZjoNCi0gICAgICAgICAgICBwRWxzZUV4cHJlc3Npb24gPSBQYXJzZUlmRXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgIENoZWNrKFRPS2VuZGlmKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVE9LZWxzZWlmOg0KLSAgICAgICAgICAgIHBFbHNlRXhwcmVzc2lvbiA9IFBhcnNlSWZFeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFRPS2Vsc2U6DQotICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgcEVsc2VFeHByZXNzaW9uID0gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICBDaGVjayhUT0tlbmRpZik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KLSAgICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9JRkVORCwgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQotICAgICAgICAgICAgTmV4dFRva2VuKCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgQ1hGQV9GTUlmRXhwcmVzc2lvbiAqcEV4cCA9IDA7DQotICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQotICAgICAgICBwRXhwID0gRlhfTkVXIENYRkFfRk1JZkV4cHJlc3Npb24obGluZSwgcEV4cHJlc3Npb24sIHBJZkV4cHJlc3Npb24sIHBFbHNlRXhwcmVzc2lvbik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAocEV4cHJlc3Npb24pIHsNCi0gICAgICAgICAgICBkZWxldGUgcEV4cHJlc3Npb247DQotICAgICAgICB9DQotICAgICAgICBpZiAocElmRXhwcmVzc2lvbikgew0KLSAgICAgICAgICAgIGRlbGV0ZSBwSWZFeHByZXNzaW9uOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBFbHNlRXhwcmVzc2lvbikgew0KLSAgICAgICAgICAgIGRlbGV0ZSBwRWxzZUV4cHJlc3Npb247DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIHBFeHA7DQotfQ0KLUNYRkFfRk1FeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZVdoaWxlRXhwcmVzc2lvbigpDQotew0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQ29uZGl0aW9uID0gMDsNCi0gICAgQ1hGQV9GTUV4cHJlc3Npb24gKnBFeHByZXNzaW9uID0gMDsNCi0gICAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgfQ0KKyAgQ2hlY2soVE9LZG8pOw0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW5kZnVuYykgew0KICAgICBOZXh0VG9rZW4oKTsNCi0gICAgcENvbmRpdGlvbiA9IFBhcnNlUGFyZW5FeHByZXNzaW9uKCk7DQotICAgIENoZWNrKFRPS2RvKTsNCi0gICAgcEV4cHJlc3Npb24gPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOw0KLSAgICBDaGVjayhUT0tlbmR3aGlsZSk7DQotICAgIGlmICghbV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KLSAgICAgICAgaWYgKHBDb25kaXRpb24pIHsNCi0gICAgICAgICAgICBkZWxldGUgcENvbmRpdGlvbjsNCisgIH0gZWxzZSB7DQorICAgIHBFeHByZXNzaW9ucyA9IFBhcnNlVG9wRXhwcmVzc2lvbigpOw0KKyAgICBDaGVjayhUT0tlbmRmdW5jKTsNCisgIH0NCisgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbihsaW5lLCAwLCBpZGVudCwgcEFyZ3VtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHByZXNzaW9ucyk7DQorICB9IGVsc2Ugew0KKyAgICBpbnQzMl90IHNpemUgPSAwOw0KKyAgICBpbnQzMl90IGluZGV4ID0gMDsNCisgICAgaWYgKHBBcmd1bWVudHMpIHsNCisgICAgICBwQXJndW1lbnRzLT5SZW1vdmVBbGwoKTsNCisgICAgICBkZWxldGUgcEFyZ3VtZW50czsNCisgICAgICBwQXJndW1lbnRzID0gMDsNCisgICAgfQ0KKyAgICBpbmRleCA9IDA7DQorICAgIGlmIChwRXhwcmVzc2lvbnMpIHsNCisgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiogZTEgPSAwOw0KKyAgICAgIHNpemUgPSBwRXhwcmVzc2lvbnMtPkdldFNpemUoKTsNCisgICAgICB3aGlsZSAoaW5kZXggPCBzaXplKSB7DQorICAgICAgICBlMSA9IChDWEZBX0ZNRXhwcmVzc2lvbiopcEV4cHJlc3Npb25zLT5HZXRBdChpbmRleCk7DQorICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICBpbmRleCsrOw0KKyAgICAgIH0NCisgICAgICBwRXhwcmVzc2lvbnMtPlJlbW92ZUFsbCgpOw0KKyAgICAgIGRlbGV0ZSBwRXhwcmVzc2lvbnM7DQorICAgICAgcEV4cHJlc3Npb25zID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1FeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KKyAgICBjYXNlIFRPS3ZhcjoNCisgICAgICBlID0gUGFyc2VWYXJFeHByZXNzaW9uKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9LbnVsbDoNCisgICAgY2FzZSBUT0tudW1iZXI6DQorICAgIGNhc2UgVE9Lc3RyaW5nOg0KKyAgICBjYXNlIFRPS3BsdXM6DQorICAgIGNhc2UgVE9LbWludXM6DQorICAgIGNhc2UgVE9La3Nub3Q6DQorICAgIGNhc2UgVE9LaWRlbnRpZmllcjoNCisgICAgY2FzZSBUT0tscGFyZW46DQorICAgICAgZSA9IFBhcnNlRXhwRXhwcmVzc2lvbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2lmOg0KKyAgICAgIGUgPSBQYXJzZUlmRXhwcmVzc2lvbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS3doaWxlOg0KKyAgICAgIGUgPSBQYXJzZVdoaWxlRXhwcmVzc2lvbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2ZvcjoNCisgICAgICBlID0gUGFyc2VGb3JFeHByZXNzaW9uKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9LZm9yZWFjaDoNCisgICAgICBlID0gUGFyc2VGb3JlYWNoRXhwcmVzc2lvbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2RvOg0KKyAgICAgIGUgPSBQYXJzZURvRXhwcmVzc2lvbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2JyZWFrOg0KKyAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbihsaW5lKTsNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tjb250aW51ZToNCisgICAgICBlID0gRlhfTkVXIENYRkFfRk1Db250aW51ZUV4cHJlc3Npb24obGluZSk7DQorICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX1VORVhQRUNURURfRVhQUkVTU0lPTiwNCisgICAgICAgICAgICB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1FeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlVmFyRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgIENGWF9XaWRlU3RyaW5nQyBpZGVudDsNCisgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgIE5leHRUb2tlbigpOw0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LaWRlbnRpZmllcikgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX0lERU5USUZJRVIsDQorICAgICAgICAgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICB9IGVsc2Ugew0KKyAgICBpZGVudCA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgIE5leHRUb2tlbigpOw0KKyAgfQ0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LYXNzaWduKSB7DQorICAgIE5leHRUb2tlbigpOw0KKyAgICBlID0gUGFyc2VFeHBFeHByZXNzaW9uKCk7DQorICB9DQorICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICBlID0gRlhfTkVXIENYRkFfRk1WYXJFeHByZXNzaW9uKGxpbmUsIGlkZW50LCBlKTsNCisgIH0gZWxzZSB7DQorICAgIGRlbGV0ZSBlOw0KKyAgICBlID0gMDsNCisgIH0NCisgIHJldHVybiBlOw0KK30NCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZVNpbXBsZUV4cHJlc3Npb24oKSB7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEgPSAwLCAqcEV4cDIgPSAwOw0KKyAgcEV4cDEgPSBQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKTsNCisgIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Fzc2lnbikgew0KKyAgICBOZXh0VG9rZW4oKTsNCisgICAgcEV4cDIgPSBQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKTsNCisgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICBwRXhwMSA9IEZYX05FVyBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbihsaW5lLCBUT0thc3NpZ24sIHBFeHAxLCBwRXhwMik7DQorICAgIH0gZWxzZSB7DQorICAgICAgZGVsZXRlIHBFeHAxOw0KKyAgICAgIHBFeHAxID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBFeHAxOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZUV4cEV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogZSA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDEgPSAwOw0KKyAgcEV4cDEgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCisgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUV4cEV4cHJlc3Npb24obGluZSwgcEV4cDEpOw0KKyAgfSBlbHNlIHsNCisgICAgZGVsZXRlIHBFeHAxOw0KKyAgICBlID0gMDsNCisgIH0NCisgIHJldHVybiBlOw0KK30NCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZTEgPSAwLCAqZTIgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgZTEgPSBQYXJzZUxvZ2ljYWxBbmRFeHByZXNzaW9uKCk7DQorICBmb3IgKDs7KSB7DQorICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KKyAgICAgIGNhc2UgVE9Lb3I6DQorICAgICAgY2FzZSBUT0trc29yOg0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBlMiA9IFBhcnNlTG9naWNhbEFuZEV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uKGxpbmUsIFRPS29yLCBlMSwgZTIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZGVsZXRlIGUxOw0KKyAgICAgICAgICBlMSA9IDA7DQogICAgICAgICB9DQotICAgICAgICBpZiAocEV4cHJlc3Npb24pIHsNCi0gICAgICAgICAgICBkZWxldGUgcEV4cHJlc3Npb247DQorICAgICAgICBjb250aW51ZTsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gZTE7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlTG9naWNhbEFuZEV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZTEgPSAwLCAqZTIgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgZTEgPSBQYXJzZUVxdWFsaXR5RXhwcmVzc2lvbigpOw0KKyAgZm9yICg7Oykgew0KKyAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgICBjYXNlIFRPS2FuZDoNCisgICAgICBjYXNlIFRPS2tzYW5kOg0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBlMiA9IFBhcnNlRXF1YWxpdHlFeHByZXNzaW9uKCk7DQorICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBlMSA9IEZYX05FVyBDWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb24obGluZSwgVE9LYW5kLCBlMSwgZTIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZGVsZXRlIGUxOw0KKyAgICAgICAgICBlMSA9IDA7DQogICAgICAgICB9DQotICAgICAgICBkZWxldGUgZTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBlMTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZTEgPSAwLCAqZTIgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgZTEgPSBQYXJzZVJlbGF0aW9uYWxFeHByZXNzaW9uKCk7DQorICBmb3IgKDs7KSB7DQorICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KKyAgICAgIGNhc2UgVE9LZXE6DQorICAgICAgY2FzZSBUT0trc2VxOg0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBlMiA9IFBhcnNlUmVsYXRpb25hbEV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24obGluZSwgVE9LZXEsIGUxLCBlMik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgIGUxID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGNhc2UgVE9LbmU6DQorICAgICAgY2FzZSBUT0trc25lOg0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBlMiA9IFBhcnNlUmVsYXRpb25hbEV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24obGluZSwgVE9LbmUsIGUxLCBlMik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgIGUxID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBlMTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplMSA9IDAsICplMiA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBlMSA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsNCisgIGZvciAoOzspIHsNCisgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgICAgY2FzZSBUT0tsdDoNCisgICAgICBjYXNlIFRPS2tzbHQ6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGUyID0gUGFyc2VBZGR0aXZlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKGxpbmUsIFRPS2x0LCBlMSwgZTIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZGVsZXRlIGUxOw0KKyAgICAgICAgICBlMSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBjb250aW51ZTsNCisgICAgICBjYXNlIFRPS2d0Og0KKyAgICAgIGNhc2UgVE9La3NndDoNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgZTIgPSBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7DQorICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBlMSA9IEZYX05FVyBDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24obGluZSwgVE9LZ3QsIGUxLCBlMik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgIGUxID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGNhc2UgVE9LbGU6DQorICAgICAgY2FzZSBUT0trc2xlOg0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBlMiA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbihsaW5lLCBUT0tsZSwgZTEsIGUyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgZTEgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgY2FzZSBUT0tnZToNCisgICAgICBjYXNlIFRPS2tzZ2U6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGUyID0gUGFyc2VBZGR0aXZlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKGxpbmUsIFRPS2dlLCBlMSwgZTIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZGVsZXRlIGUxOw0KKyAgICAgICAgICBlMSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBjb250aW51ZTsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gZTE7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZTEgPSAwLCAqZTIgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgZTEgPSBQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOw0KKyAgZm9yICg7Oykgew0KKyAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgICBjYXNlIFRPS3BsdXM6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGUyID0gUGFyc2VNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24obGluZSwgVE9LcGx1cywgZTEsIGUyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgZTEgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgY2FzZSBUT0ttaW51czoNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgZTIgPSBQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgZTEgPSBGWF9ORVcgQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbihsaW5lLCBUT0ttaW51cywgZTEsIGUyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgZTEgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIGUxOw0KK30NCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplMSA9IDAsICplMiA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBlMSA9IFBhcnNlVW5hcnlFeHByZXNzaW9uKCk7DQorICBmb3IgKDs7KSB7DQorICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KKyAgICAgIGNhc2UgVE9LbXVsOg0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBlMiA9IFBhcnNlVW5hcnlFeHByZXNzaW9uKCk7DQorICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBlMSA9IEZYX05FVyBDWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKGxpbmUsIFRPS211bCwgZTEsIGUyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgZTEgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgY2FzZSBUT0tkaXY6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGUyID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gRlhfTkVXIENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24obGluZSwgVE9LZGl2LCBlMSwgZTIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZGVsZXRlIGUxOw0KKyAgICAgICAgICBlMSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBjb250aW51ZTsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gZTE7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlVW5hcnlFeHByZXNzaW9uKCkgew0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgIGNhc2UgVE9LcGx1czoNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBlID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCisgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNUG9zRXhwcmVzc2lvbihsaW5lLCBlKTsNCisgICAgICB9IGVsc2Ugew0KICAgICAgICAgZSA9IDA7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1XaGlsZUV4cHJlc3Npb24obGluZSwgcENvbmRpdGlvbiwgcEV4cHJlc3Npb24pOw0KLSAgICB9DQotICAgIHJldHVybiBlOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0ttaW51czoNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBlID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCisgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNTmVnRXhwcmVzc2lvbihsaW5lLCBlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZSA9IDA7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2tzbm90Og0KKyAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgIGUgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOw0KKyAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Ob3RFeHByZXNzaW9uKGxpbmUsIGUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBlID0gMDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgZSA9IFBhcnNlUHJpbWFyeUV4cHJlc3Npb24oKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBlOw0KIH0NCi1DWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VTdWJhc3NpZ25tZW50SW5Gb3JFeHByZXNzaW9uKCkNCi17DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplID0gMDsNCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZVByaW1hcnlFeHByZXNzaW9uKCkgew0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgIGNhc2UgVE9LbnVtYmVyOg0KKyAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTU51bWJlckV4cHJlc3Npb24obGluZSwgbV9wVG9rZW4tPm1fd3N0cmluZyk7DQorICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9Lc3RyaW5nOg0KKyAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTVN0cmluZ0V4cHJlc3Npb24obGluZSwgbV9wVG9rZW4tPm1fd3N0cmluZyk7DQorICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9LaWRlbnRpZmllcjogew0KKyAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXIobV9wVG9rZW4tPm1fd3N0cmluZyk7DQorICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LbGJyYWNrZXQpIHsNCisgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChzKSB7DQorICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbihsaW5lLCBOVUxMLCBUT0tkb3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0lkZW50aWZpZXIsIHMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubihsaW5lLCB3c0lkZW50aWZpZXIpOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBUT0tpZjoNCisgICAgICBlID0gRlhfTkVXIENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbm4obGluZSwgbV9wVG9rZW4tPm1fd3N0cmluZyk7DQorICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9LbnVsbDoNCisgICAgICBlID0gRlhfTkVXIENYRkFfRk1OdWxsRXhwcmVzc2lvbihsaW5lKTsNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tscGFyZW46DQorICAgICAgZSA9IFBhcnNlUGFyZW5FeHByZXNzaW9uKCk7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX1VORVhQRUNURURfRVhQUkVTU0lPTiwNCisgICAgICAgICAgICB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgZSA9IFBhcnNlUG9zdEV4cHJlc3Npb24oZSk7DQorICBpZiAoIShtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSkgew0KKyAgICBkZWxldGUgZTsNCisgICAgZSA9IDA7DQorICB9DQorICByZXR1cm4gZTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VQb3N0RXhwcmVzc2lvbigNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGUpIHsNCisgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgIHdoaWxlICgxKSB7DQogICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KLSAgICAgICAgY2FzZSBUT0tpZGVudGlmaWVyOg0KLSAgICAgICAgICAgIGUgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX1VORVhQRUNURURfRVhQUkVTU0lPTiwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCi0gICAgICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gZTsNCi19DQotQ1hGQV9GTUV4cHJlc3Npb24gKiBDWEZBX0ZNUGFyc2U6OlBhcnNlRm9yRXhwcmVzc2lvbigpDQotew0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nQyB3c1ZhcmlhbnQ7DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQXNzaWdubWVudCA9IDA7DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQWNjZXNzb3IgPSAwOw0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcFN0ZXAgPSAwOw0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqcExpc3QgPSAwOw0KLSAgICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQotICAgIE5leHRUb2tlbigpOw0KLSAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tpZGVudGlmaWVyKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCi0gICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhtX3BUb2tlbi0+bV90eXBlKSwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCi0gICAgfQ0KLSAgICB3c1ZhcmlhbnQgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KLSAgICBOZXh0VG9rZW4oKTsNCi0gICAgaWYoIG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LYXNzaWduKSB7DQorICAgICAgY2FzZSBUT0tscGFyZW46IHsNCiAgICAgICAgIE5leHRUb2tlbigpOw0KLSAgICAgICAgcEFzc2lnbm1lbnQgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KLSAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLCBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKG1fcFRva2VuLT5tX3R5cGUpLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KLSAgICB9DQotICAgIGludDMyX3QgaURpcmVjdGlvbiA9IDA7DQotICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS3VwdG8pIHsNCi0gICAgICAgIGlEaXJlY3Rpb24gPSAxOw0KLSAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZG93bnRvKSB7DQotICAgICAgICBpRGlyZWN0aW9uID0gLTE7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCi0gICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwgTCJ1cHRvIG9yIGRvd250byIsIChjb25zdCBGWF9XQ0hBUiopd3NfVGVtcFN0cmluZyk7DQotICAgIH0NCi0gICAgTmV4dFRva2VuKCk7DQotICAgIHBBY2Nlc3NvciA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KLSAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tzdGVwKSB7DQotICAgICAgICBOZXh0VG9rZW4oKTsNCi0gICAgICAgIHBTdGVwID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQotICAgIH0NCi0gICAgQ2hlY2soVE9LZG8pOw0KLSAgICBwTGlzdCA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7DQotICAgIENoZWNrKFRPS2VuZGZvcik7DQotICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQotICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Gb3JFeHByZXNzaW9uKGxpbmUsIHdzVmFyaWFudCwgcEFzc2lnbm1lbnQsIHBBY2Nlc3NvciwgaURpcmVjdGlvbiwgcFN0ZXAsIHBMaXN0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChwQXNzaWdubWVudCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBwQXNzaWdubWVudDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwQWNjZXNzb3IpIHsNCi0gICAgICAgICAgICBkZWxldGUgcEFjY2Vzc29yOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBTdGVwKSB7DQotICAgICAgICAgICAgZGVsZXRlIHBTdGVwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBMaXN0KSB7DQotICAgICAgICAgICAgZGVsZXRlIHBMaXN0Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBlOw0KLX0NCi1DWEZBX0ZNRXhwcmVzc2lvbiAqIENYRkFfRk1QYXJzZTo6UGFyc2VGb3JlYWNoRXhwcmVzc2lvbigpDQotew0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQotICAgIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXI7DQotICAgIENGWF9QdHJBcnJheSAqcEFjY2Vzc29ycyA9IDA7DQotICAgIENYRkFfRk1FeHByZXNzaW9uICpwTGlzdCA9IDA7DQotICAgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCi0gICAgTmV4dFRva2VuKCk7DQotICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS2lkZW50aWZpZXIpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KLSAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLCBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKG1fcFRva2VuLT5tX3R5cGUpLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KLSAgICB9DQotICAgIHdzSWRlbnRpZmllciA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgIE5leHRUb2tlbigpOw0KLSAgICBDaGVjayhUT0tpbik7DQotICAgIENoZWNrKFRPS2xwYXJlbik7DQotICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS3JwYXJlbikgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQotICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KLSAgICAgICAgTmV4dFRva2VuKCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwQWNjZXNzb3JzID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KLSAgICAgICAgd2hpbGUgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQotICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnMgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICBpZiAocykgew0KLSAgICAgICAgICAgICAgICBwQWNjZXNzb3JzLT5BZGQocyk7DQorICAgICAgICBDRlhfUHRyQXJyYXkqIHBBcnJheSA9IDA7DQorICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCisgICAgICAgICAgcEFycmF5ID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KKyAgICAgICAgICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCisgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogZSA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIGlmIChlKSB7DQorICAgICAgICAgICAgICBwQXJyYXktPkFkZChlKTsNCiAgICAgICAgICAgICB9DQogICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LY29tbWEpIHsNCi0gICAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW9mKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLA0KKyAgICAgICAgICAgICAgICAgIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcoVE9LcnBhcmVuKSwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNQ2FsbEV4cHJlc3Npb24obGluZSwgZSwgcEFycmF5LCBGQUxTRSk7DQorICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tsYnJhY2tldCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgaWYgKHMpIHsNCisgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24obGluZSwgZSwgVE9LY2FsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV1NUUkMoTCIiKSwgcyk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgICAgZSA9IDA7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGludDMyX3QgaVNpemUgPSBwQXJyYXktPkdldFNpemUoKTsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgew0KKyAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwVGVtcCA9DQorICAgICAgICAgICAgICAgIChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiopcEFycmF5LT5HZXRBdChpKTsNCisgICAgICAgICAgICBkZWxldGUgcFRlbXA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZGVsZXRlIHBBcnJheTsNCisgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgIGUgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBUT0tkb3Q6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2lkZW50aWZpZXIpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHRlbXBTdHIgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgICBGWF9EV09SRCB0ZW1wTGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LbHBhcmVuKSB7DQorICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHBBY2Nlc3NvcjsNCisgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cENhbGw7DQorICAgICAgICAgICAgcEV4cEFjY2Vzc29yID0gZTsNCisgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBBcnJheSA9IDA7DQorICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgICAgICAgICAgICBwQXJyYXkgPSBGWF9ORVcgQ0ZYX1B0ckFycmF5KCk7DQorICAgICAgICAgICAgICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGV4cCA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgICAgICBwQXJyYXktPkFkZChleHApOw0KKyAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tjb21tYSkgew0KKyAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW9mKSB7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKFRPS3JwYXJlbiksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcElkZW50aWZpZXIgPQ0KKyAgICAgICAgICAgICAgICAgIEZYX05FVyBDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uKHRlbXBMaW5lLCB0ZW1wU3RyKTsNCisgICAgICAgICAgICAgIHBFeHBDYWxsID0NCisgICAgICAgICAgICAgICAgICBGWF9ORVcgQ1hGQV9GTUNhbGxFeHByZXNzaW9uKGxpbmUsIHBJZGVudGlmaWVyLCBwQXJyYXksIFRSVUUpOw0KKyAgICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24obGluZSwgcEV4cEFjY2Vzc29yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4cENhbGwpOw0KKyAgICAgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tsYnJhY2tldCkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgIGlmIChzKSB7DQorICAgICAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbihsaW5lLCBlLCBUT0tjYWxsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV1NUUkMoTCIiKSwgcyk7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkZWxldGUgZTsNCisgICAgICAgICAgICAgICAgZSA9IDA7DQorICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICBpbnQzMl90IGlTaXplID0gcEFycmF5LT5HZXRTaXplKCk7DQorICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQorICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwVGVtcCA9DQorICAgICAgICAgICAgICAgICAgICAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qKXBBcnJheS0+R2V0QXQoaSk7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBwVGVtcDsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGRlbGV0ZSBwQXJyYXk7DQorICAgICAgICAgICAgICBkZWxldGUgZTsNCisgICAgICAgICAgICAgIGUgPSAwOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIENoZWNrKFRPS3JwYXJlbik7DQotICAgIH0NCi0gICAgQ2hlY2soVE9LZG8pOw0KLSAgICBwTGlzdCA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7DQotICAgIENoZWNrKFRPS2VuZGZvcik7DQotICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQotICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbihsaW5lLCB3c0lkZW50aWZpZXIsIHBBY2Nlc3NvcnMsIHBMaXN0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChwQWNjZXNzb3JzKSB7DQotICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnMgPSAwOw0KLSAgICAgICAgICAgIGludDMyX3Qgc2l6ZSA9IHBBY2Nlc3NvcnMtPkdldFNpemUoKTsNCi0gICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gMDsNCi0gICAgICAgICAgICB3aGlsZShpbmRleCA8IHNpemUpIHsNCi0gICAgICAgICAgICAgICAgcyA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKXBBY2Nlc3NvcnMtPkdldEF0KGluZGV4KTsNCisgICAgICAgICAgfSBlbHNlIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2xicmFja2V0KSB7DQorICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIGlmICghKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpKSB7DQorICAgICAgICAgICAgICBpZiAocykgew0KICAgICAgICAgICAgICAgICBkZWxldGUgczsNCi0gICAgICAgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgICAgICAgICAgcyA9IDA7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAoZSkgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgZTsNCisgICAgICAgICAgICAgICAgZSA9IDA7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICByZXR1cm4gZTsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgcEFjY2Vzc29ycy0+UmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgZGVsZXRlIHBBY2Nlc3NvcnM7DQotICAgICAgICAgICAgcEFjY2Vzc29ycyA9IDA7DQorICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKHRlbXBMaW5lLCBlLCBUT0tkb3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBTdHIsIHMpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0gRlhfTkVXIENYRkFfRk1JbmRleEV4cHJlc3Npb24oDQorICAgICAgICAgICAgICAgIHRlbXBMaW5lLCBBQ0NFU1NPUl9OT19JTkRFWCwgTlVMTCwgRkFMU0UpOw0KKyAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbihsaW5lLCBlLCBUT0tkb3QsIHRlbXBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX0lERU5USUZJRVIsDQorICAgICAgICAgICAgICAgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICAgICAgICAgIHJldHVybiBlOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBMaXN0KSB7DQotICAgICAgICAgICAgZGVsZXRlIHBMaXN0Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBUT0tkb3Rkb3Q6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2lkZW50aWZpZXIpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHRlbXBTdHIgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgICBGWF9EV09SRCB0ZW1wTGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LbGJyYWNrZXQpIHsNCisgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcyA9IFBhcnNlSW5kZXhFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgaWYgKCEobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkpIHsNCisgICAgICAgICAgICAgIGlmIChzKSB7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBzOw0KKyAgICAgICAgICAgICAgICBzID0gMDsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmIChlKSB7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBlOw0KKyAgICAgICAgICAgICAgICBlID0gMDsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHJldHVybiBlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24odGVtcExpbmUsIGUsIFRPS2RvdGRvdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFN0ciwgcyk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHMgPSBGWF9ORVcgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbigNCisgICAgICAgICAgICAgICAgdGVtcExpbmUsIEFDQ0VTU09SX05PX0lOREVYLCBOVUxMLCBGQUxTRSk7DQorICAgICAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uKGxpbmUsIGUsIFRPS2RvdGRvdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFN0ciwgcyk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfSURFTlRJRklFUiwNCisgICAgICAgICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgICAgICAgICAgcmV0dXJuIGU7DQogICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFRPS2RvdHNjcmVhbToNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LaWRlbnRpZmllcikgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MgdGVtcFN0ciA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICAgIEZYX0RXT1JEIHRlbXBMaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tsYnJhY2tldCkgew0KKyAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICBpZiAoIShtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSkgew0KKyAgICAgICAgICAgICAgaWYgKHMpIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHM7DQorICAgICAgICAgICAgICAgIHMgPSAwOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKGUpIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgICAgICAgIGUgPSAwOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgcmV0dXJuIGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbih0ZW1wTGluZSwgZSwgVE9LZG90c2NyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wU3RyLCBzKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcyA9IEZYX05FVyBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKA0KKyAgICAgICAgICAgICAgICB0ZW1wTGluZSwgQUNDRVNTT1JfTk9fSU5ERVgsIE5VTEwsIEZBTFNFKTsNCisgICAgICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24obGluZSwgZSwgVE9LZG90c2NyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wU3RyLCBzKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9JREVOVElGSUVSLA0KKyAgICAgICAgICAgICAgICB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgICAgICAgICByZXR1cm4gZTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgVE9LZG90c3Rhcjogew0KKyAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHMgPQ0KKyAgICAgICAgICAgIEZYX05FVyBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKGxpbmUsIEFDQ0VTU09SX05PX0lOREVYLCBOVUxMLCBGQUxTRSk7DQorICAgICAgICBlID0gRlhfTkVXIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24obGluZSwgZSwgVE9LZG90c3RhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XU1RSQyhMIioiKSwgcyk7DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgcmV0dXJuIGU7DQogICAgIH0NCi0gICAgcmV0dXJuIGU7DQotfQ0KLUNYRkFfRk1FeHByZXNzaW9uICogQ1hGQV9GTVBhcnNlOjpQYXJzZURvRXhwcmVzc2lvbigpDQotew0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQotICAgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCiAgICAgTmV4dFRva2VuKCk7DQotICAgIGUgPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOw0KLSAgICBDaGVjayhUT0tlbmQpOw0KLSAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KLSAgICAgICAgZSA9IEZYX05FVyBDWEZBX0ZNRG9FeHByZXNzaW9uKGxpbmUsIGUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZGVsZXRlIGU7DQotICAgICAgICBlID0gMDsNCisgIH0NCisgIHJldHVybiBlOw0KK30NCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZUluZGV4RXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwID0gMDsNCisgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgIE5leHRUb2tlbigpOw0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHMgPSAwOw0KKyAgWEZBX0ZNX0FjY2Vzc29ySW5kZXggYWNjZXNzb3JJbmRleCA9IEFDQ0VTU09SX05PX1JFTEFUSVZFSU5ERVg7DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0ttdWwpIHsNCisgICAgcEV4cCA9IEZYX05FVyBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKGxpbmUsIGFjY2Vzc29ySW5kZXgsIHMsIFRSVUUpOw0KKyAgICBOZXh0VG9rZW4oKTsNCisgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcmJyYWNrZXQpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfVE9LRU4sDQorICAgICAgICAgICAgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhUT0tycGFyZW4pLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgICAgIGlmIChwRXhwKSB7DQorICAgICAgICBkZWxldGUgcEV4cDsNCisgICAgICAgIHBFeHAgPSAwOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gZTsNCisgICAgcmV0dXJuIHBFeHA7DQorICB9DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0twbHVzKSB7DQorICAgIGFjY2Vzc29ySW5kZXggPSBBQ0NFU1NPUl9QT1NJVElWRV9JTkRFWDsNCisgICAgTmV4dFRva2VuKCk7DQorICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LbWludXMpIHsNCisgICAgYWNjZXNzb3JJbmRleCA9IEFDQ0VTU09SX05FR0FUSVZFX0lOREVYOw0KKyAgICBOZXh0VG9rZW4oKTsNCisgIH0NCisgIHMgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCisgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JicmFja2V0KSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfVE9LRU4sDQorICAgICAgICAgIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcoVE9LcnBhcmVuKSwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgICAgaWYgKHMpIHsNCisgICAgICBkZWxldGUgczsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgcEV4cCA9IEZYX05FVyBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKGxpbmUsIGFjY2Vzc29ySW5kZXgsIHMsIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiBwRXhwOw0KK30NCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZVBhcmVuRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMSA9IDAsICpwRXhwMiA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBDaGVjayhUT0tscGFyZW4pOw0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgIHBFeHAxID0gUGFyc2VMb2dpY2FsT3JFeHByZXNzaW9uKCk7DQorICAgIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Fzc2lnbikgew0KKyAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgIHBFeHAyID0gUGFyc2VMb2dpY2FsT3JFeHByZXNzaW9uKCk7DQorICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHBFeHAxID0gRlhfTkVXIENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uKGxpbmUsIFRPS2Fzc2lnbiwgcEV4cDEsIHBFeHAyKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZGVsZXRlIHBFeHAxOw0KKyAgICAgICAgcEV4cDEgPSAwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBDaGVjayhUT0tycGFyZW4pOw0KKyAgfSBlbHNlIHsNCisgICAgTmV4dFRva2VuKCk7DQorICB9DQorICByZXR1cm4gcEV4cDE7DQorfQ0KK0NYRkFfRk1FeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlQmxvY2tFeHByZXNzaW9uKCkgew0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgQ0ZYX1B0ckFycmF5KiBleHByZXNzaW9uID0gRlhfTkVXIENGWF9QdHJBcnJheSgpOw0KKyAgd2hpbGUgKDEpIHsNCisgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgICAgY2FzZSBUT0tlb2Y6DQorICAgICAgY2FzZSBUT0tlbmRpZjoNCisgICAgICBjYXNlIFRPS2Vsc2VpZjoNCisgICAgICBjYXNlIFRPS2Vsc2U6DQorICAgICAgY2FzZSBUT0tlbmR3aGlsZToNCisgICAgICBjYXNlIFRPS2VuZGZvcjoNCisgICAgICBjYXNlIFRPS2VuZDoNCisgICAgICBjYXNlIFRPS2VuZGZ1bmM6DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFRPS2Z1bmM6DQorICAgICAgICBlID0gUGFyc2VGdW5jdGlvbigpOw0KKyAgICAgICAgaWYgKGUpIHsNCisgICAgICAgICAgZXhwcmVzc2lvbi0+QWRkKGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGUgPSBQYXJzZUV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChlKSB7DQorICAgICAgICAgIGV4cHJlc3Npb24tPkFkZChlKTsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGJyZWFrOw0KKyAgfQ0KKyAgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbiogcEV4cCA9IDA7DQorICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICBwRXhwID0gRlhfTkVXIENYRkFfRk1CbG9ja0V4cHJlc3Npb24obGluZSwgZXhwcmVzc2lvbik7DQorICB9IGVsc2Ugew0KKyAgICBpbnQzMl90IHNpemUgPSBleHByZXNzaW9uLT5HZXRTaXplKCk7DQorICAgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgICB3aGlsZSAoaW5kZXggPCBzaXplKSB7DQorICAgICAgZSA9IChDWEZBX0ZNRXhwcmVzc2lvbiopZXhwcmVzc2lvbi0+R2V0QXQoaW5kZXgpOw0KKyAgICAgIGRlbGV0ZSBlOw0KKyAgICAgIGluZGV4Kys7DQorICAgIH0NCisgICAgZXhwcmVzc2lvbi0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBleHByZXNzaW9uOw0KKyAgICBleHByZXNzaW9uID0gMDsNCisgIH0NCisgIHJldHVybiBwRXhwOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZUlmRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwcmVzc2lvbiA9IDA7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogcElmRXhwcmVzc2lvbiA9IDA7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogcEVsc2VFeHByZXNzaW9uID0gMDsNCisgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnRQb3MgPSBtX2xleGVyLT5TYXZlUG9zKCk7DQorICBOZXh0VG9rZW4oKTsNCisgIENoZWNrKFRPS2xwYXJlbik7DQorICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCisgICAgaWYgKHBFeHByZXNzaW9uKSB7DQorICAgICAgZGVsZXRlIHBFeHByZXNzaW9uOw0KKyAgICB9DQorICAgIHBFeHByZXNzaW9uID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQorICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2NvbW1hKSB7DQorICAgICAgTmV4dFRva2VuKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIENoZWNrKFRPS3JwYXJlbik7DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0t0aGVuKSB7DQorICAgIGlmIChwRXhwcmVzc2lvbikgew0KKyAgICAgIGRlbGV0ZSBwRXhwcmVzc2lvbjsNCisgICAgfQ0KKyAgICBtX2xleGVyLT5TZXRDdXJyZW50TGluZShsaW5lKTsNCisgICAgbV9wVG9rZW4gPSBGWF9ORVcgQ1hGQV9GTVRva2VuKGxpbmUpOw0KKyAgICBtX3BUb2tlbi0+bV90eXBlID0gVE9LaWRlbnRpZmllcjsNCisgICAgbV9wVG9rZW4tPm1fd3N0cmluZyA9IEZYX1dTVFJDKEwiaWYiKTsNCisgICAgbV9sZXhlci0+U2V0VG9rZW4obV9wVG9rZW4pOw0KKyAgICBtX2xleGVyLT5SZXN0b3JlUG9zKHBTdGFydFBvcyk7DQorICAgIHJldHVybiBQYXJzZUV4cEV4cHJlc3Npb24oKTsNCisgIH0NCisgIENoZWNrKFRPS3RoZW4pOw0KKyAgcElmRXhwcmVzc2lvbiA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7DQorICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgY2FzZSBUT0tlb2Y6DQorICAgIGNhc2UgVE9LZW5kaWY6DQorICAgICAgQ2hlY2soVE9LZW5kaWYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2lmOg0KKyAgICAgIHBFbHNlRXhwcmVzc2lvbiA9IFBhcnNlSWZFeHByZXNzaW9uKCk7DQorICAgICAgQ2hlY2soVE9LZW5kaWYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2Vsc2VpZjoNCisgICAgICBwRWxzZUV4cHJlc3Npb24gPSBQYXJzZUlmRXhwcmVzc2lvbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2Vsc2U6DQorICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgcEVsc2VFeHByZXNzaW9uID0gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsNCisgICAgICBDaGVjayhUT0tlbmRpZik7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX0lGRU5ELCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgQ1hGQV9GTUlmRXhwcmVzc2lvbiogcEV4cCA9IDA7DQorICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICBwRXhwID0gRlhfTkVXIENYRkFfRk1JZkV4cHJlc3Npb24obGluZSwgcEV4cHJlc3Npb24sIHBJZkV4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWxzZUV4cHJlc3Npb24pOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKHBFeHByZXNzaW9uKSB7DQorICAgICAgZGVsZXRlIHBFeHByZXNzaW9uOw0KKyAgICB9DQorICAgIGlmIChwSWZFeHByZXNzaW9uKSB7DQorICAgICAgZGVsZXRlIHBJZkV4cHJlc3Npb247DQorICAgIH0NCisgICAgaWYgKHBFbHNlRXhwcmVzc2lvbikgew0KKyAgICAgIGRlbGV0ZSBwRWxzZUV4cHJlc3Npb247DQorICAgIH0NCisgIH0NCisgIHJldHVybiBwRXhwOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZVdoaWxlRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwQ29uZGl0aW9uID0gMDsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBwRXhwcmVzc2lvbiA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBOZXh0VG9rZW4oKTsNCisgIHBDb25kaXRpb24gPSBQYXJzZVBhcmVuRXhwcmVzc2lvbigpOw0KKyAgQ2hlY2soVE9LZG8pOw0KKyAgcEV4cHJlc3Npb24gPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOw0KKyAgQ2hlY2soVE9LZW5kd2hpbGUpOw0KKyAgaWYgKCFtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgIGlmIChwQ29uZGl0aW9uKSB7DQorICAgICAgZGVsZXRlIHBDb25kaXRpb247DQorICAgIH0NCisgICAgaWYgKHBFeHByZXNzaW9uKSB7DQorICAgICAgZGVsZXRlIHBFeHByZXNzaW9uOw0KKyAgICB9DQorICAgIGRlbGV0ZSBlOw0KKyAgICBlID0gMDsNCisgIH0gZWxzZSB7DQorICAgIGUgPSBGWF9ORVcgQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbihsaW5lLCBwQ29uZGl0aW9uLCBwRXhwcmVzc2lvbik7DQorICB9DQorICByZXR1cm4gZTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VTdWJhc3NpZ25tZW50SW5Gb3JFeHByZXNzaW9uKCkgew0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgIGNhc2UgVE9LaWRlbnRpZmllcjoNCisgICAgICBlID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX1VORVhQRUNURURfRVhQUkVTU0lPTiwNCisgICAgICAgICAgICB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1FeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlRm9yRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgIENGWF9XaWRlU3RyaW5nQyB3c1ZhcmlhbnQ7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEFzc2lnbm1lbnQgPSAwOw0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBBY2Nlc3NvciA9IDA7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcFN0ZXAgPSAwOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIHBMaXN0ID0gMDsNCisgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgIE5leHRUb2tlbigpOw0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LaWRlbnRpZmllcikgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLA0KKyAgICAgICAgICBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKG1fcFRva2VuLT5tX3R5cGUpLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgfQ0KKyAgd3NWYXJpYW50ID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgIE5leHRUb2tlbigpOw0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LYXNzaWduKSB7DQorICAgIE5leHRUb2tlbigpOw0KKyAgICBwQXNzaWdubWVudCA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwNCisgICAgICAgICAgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhtX3BUb2tlbi0+bV90eXBlKSwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgIH0NCisgIGludDMyX3QgaURpcmVjdGlvbiA9IDA7DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0t1cHRvKSB7DQorICAgIGlEaXJlY3Rpb24gPSAxOw0KKyAgfSBlbHNlIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Rvd250bykgew0KKyAgICBpRGlyZWN0aW9uID0gLTE7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLCBMInVwdG8gb3IgZG93bnRvIiwNCisgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c19UZW1wU3RyaW5nKTsNCisgIH0NCisgIE5leHRUb2tlbigpOw0KKyAgcEFjY2Vzc29yID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tzdGVwKSB7DQorICAgIE5leHRUb2tlbigpOw0KKyAgICBwU3RlcCA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgfQ0KKyAgQ2hlY2soVE9LZG8pOw0KKyAgcExpc3QgPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOw0KKyAgQ2hlY2soVE9LZW5kZm9yKTsNCisgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUZvckV4cHJlc3Npb24obGluZSwgd3NWYXJpYW50LCBwQXNzaWdubWVudCwgcEFjY2Vzc29yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEaXJlY3Rpb24sIHBTdGVwLCBwTGlzdCk7DQorICB9IGVsc2Ugew0KKyAgICBpZiAocEFzc2lnbm1lbnQpIHsNCisgICAgICBkZWxldGUgcEFzc2lnbm1lbnQ7DQorICAgIH0NCisgICAgaWYgKHBBY2Nlc3Nvcikgew0KKyAgICAgIGRlbGV0ZSBwQWNjZXNzb3I7DQorICAgIH0NCisgICAgaWYgKHBTdGVwKSB7DQorICAgICAgZGVsZXRlIHBTdGVwOw0KKyAgICB9DQorICAgIGlmIChwTGlzdCkgew0KKyAgICAgIGRlbGV0ZSBwTGlzdDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1FeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlRm9yZWFjaEV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogZSA9IDA7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyOw0KKyAgQ0ZYX1B0ckFycmF5KiBwQWNjZXNzb3JzID0gMDsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBwTGlzdCA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBOZXh0VG9rZW4oKTsNCisgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS2lkZW50aWZpZXIpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwNCisgICAgICAgICAgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhtX3BUb2tlbi0+bV90eXBlKSwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgIH0NCisgIHdzSWRlbnRpZmllciA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICBOZXh0VG9rZW4oKTsNCisgIENoZWNrKFRPS2luKTsNCisgIENoZWNrKFRPS2xwYXJlbik7DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tycGFyZW4pIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9VTkVYUEVDVEVEX0VYUFJFU1NJT04sDQorICAgICAgICAgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICAgIE5leHRUb2tlbigpOw0KKyAgfSBlbHNlIHsNCisgICAgcEFjY2Vzc29ycyA9IEZYX05FVyBDRlhfUHRyQXJyYXkoKTsNCisgICAgd2hpbGUgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHMgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCisgICAgICBpZiAocykgew0KKyAgICAgICAgcEFjY2Vzc29ycy0+QWRkKHMpOw0KKyAgICAgIH0NCisgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tjb21tYSkgew0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBDaGVjayhUT0tycGFyZW4pOw0KKyAgfQ0KKyAgQ2hlY2soVE9LZG8pOw0KKyAgcExpc3QgPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOw0KKyAgQ2hlY2soVE9LZW5kZm9yKTsNCisgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBGWF9ORVcgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKGxpbmUsIHdzSWRlbnRpZmllciwgcEFjY2Vzc29ycywgcExpc3QpOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKHBBY2Nlc3NvcnMpIHsNCisgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcyA9IDA7DQorICAgICAgaW50MzJfdCBzaXplID0gcEFjY2Vzc29ycy0+R2V0U2l6ZSgpOw0KKyAgICAgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgICAgIHdoaWxlIChpbmRleCA8IHNpemUpIHsNCisgICAgICAgIHMgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qKXBBY2Nlc3NvcnMtPkdldEF0KGluZGV4KTsNCisgICAgICAgIGRlbGV0ZSBzOw0KKyAgICAgICAgaW5kZXgrKzsNCisgICAgICB9DQorICAgICAgcEFjY2Vzc29ycy0+UmVtb3ZlQWxsKCk7DQorICAgICAgZGVsZXRlIHBBY2Nlc3NvcnM7DQorICAgICAgcEFjY2Vzc29ycyA9IDA7DQorICAgIH0NCisgICAgaWYgKHBMaXN0KSB7DQorICAgICAgZGVsZXRlIHBMaXN0Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gZTsNCit9DQorQ1hGQV9GTUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VEb0V4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogZSA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBOZXh0VG9rZW4oKTsNCisgIGUgPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOw0KKyAgQ2hlY2soVE9LZW5kKTsNCisgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBGWF9ORVcgQ1hGQV9GTURvRXhwcmVzc2lvbihsaW5lLCBlKTsNCisgIH0gZWxzZSB7DQorICAgIGRlbGV0ZSBlOw0KKyAgICBlID0gMDsNCisgIH0NCisgIHJldHVybiBlOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbXBhcnNlLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbXBhcnNlLmgKaW5kZXggNjRiZDgzNS4uNjg5ZTg2NiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm1wYXJzZS5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtcGFyc2UuaApAQCAtNiw0NCArNiw0NCBAQAogDQogI2lmbmRlZiBfWEZBX0ZNX1BBUlNFX0gNCiAjZGVmaW5lIF9YRkFfRk1fUEFSU0VfSA0KLWNsYXNzIENYRkFfRk1QYXJzZQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1QYXJzZSgpOw0KLSAgICB+Q1hGQV9GTVBhcnNlKCk7DQotICAgIGludDMyX3QgSW5pdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybWNhbGMsIENYRkFfRk1FcnJvckluZm8gKnBFcnJvckluZm8pOw0KLSAgICB2b2lkIE5leHRUb2tlbigpOw0KLSAgICB2b2lkIENoZWNrKFhGQV9GTV9UT0tFTiBvcCk7DQotICAgIHZvaWQgRXJyb3IoRlhfRFdPUkQgbGluZU51bSwgWEZBX0ZNX0VSUk1TRyBtc2csIC4uLik7DQotICAgIENGWF9QdHJBcnJheSAqIFBhcnNlVG9wRXhwcmVzc2lvbigpOw0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqUGFyc2VGdW5jdGlvbigpOw0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqUGFyc2VFeHByZXNzaW9uKCk7DQotICAgIENYRkFfRk1FeHByZXNzaW9uICpQYXJzZVZhckV4cHJlc3Npb24oKTsNCi0gICAgQ1hGQV9GTUV4cHJlc3Npb24gKlBhcnNlRXhwRXhwcmVzc2lvbigpOw0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsNCi0gICAgQ1hGQV9GTUV4cHJlc3Npb24gKlBhcnNlSWZFeHByZXNzaW9uKCk7DQotICAgIENYRkFfRk1FeHByZXNzaW9uICpQYXJzZVdoaWxlRXhwcmVzc2lvbigpOw0KLSAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqUGFyc2VGb3JFeHByZXNzaW9uKCk7DQotICAgIENYRkFfRk1FeHByZXNzaW9uICpQYXJzZUZvcmVhY2hFeHByZXNzaW9uKCk7DQotICAgIENYRkFfRk1FeHByZXNzaW9uICpQYXJzZURvRXhwcmVzc2lvbigpOw0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqUGFyc2VQYXJlbkV4cHJlc3Npb24oKTsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKlBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqUGFyc2VTdWJhc3NpZ25tZW50SW5Gb3JFeHByZXNzaW9uKCk7DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKTsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKlBhcnNlTG9naWNhbEFuZEV4cHJlc3Npb24oKTsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKlBhcnNlRXF1YWxpdHlFeHByZXNzaW9uKCk7DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpQYXJzZVJlbGF0aW9uYWxFeHByZXNzaW9uKCk7DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOw0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKlBhcnNlUHJpbWFyeUV4cHJlc3Npb24oKTsNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKlBhcnNlUG9zdEV4cHJlc3Npb24oQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUpOw0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCi1wcml2YXRlOg0KLSAgICBjb25zdCBGWF9XQ0hBUiogbV9wU2NyaXB0Ow0KLSAgICBGWF9TVFJTSVpFIG1fdUxlbmd0aDsNCi0gICAgQ1hGQV9GTUxleGVyCSptX2xleGVyOw0KLSAgICBDWEZBX0ZNVG9rZW4JKm1fcFRva2VuOw0KLSAgICBDWEZBX0ZNRXJyb3JJbmZvICptX3BFcnJvckluZm87DQorY2xhc3MgQ1hGQV9GTVBhcnNlIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVBhcnNlKCk7DQorICB+Q1hGQV9GTVBhcnNlKCk7DQorICBpbnQzMl90IEluaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjLCBDWEZBX0ZNRXJyb3JJbmZvKiBwRXJyb3JJbmZvKTsNCisgIHZvaWQgTmV4dFRva2VuKCk7DQorICB2b2lkIENoZWNrKFhGQV9GTV9UT0tFTiBvcCk7DQorICB2b2lkIEVycm9yKEZYX0RXT1JEIGxpbmVOdW0sIFhGQV9GTV9FUlJNU0cgbXNnLCAuLi4pOw0KKyAgQ0ZYX1B0ckFycmF5KiBQYXJzZVRvcEV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBQYXJzZUZ1bmN0aW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VWYXJFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VFeHBFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBQYXJzZUlmRXhwcmVzc2lvbigpOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIFBhcnNlV2hpbGVFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VGb3JFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VGb3JlYWNoRXhwcmVzc2lvbigpOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIFBhcnNlRG9FeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VQYXJlbkV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZVN1YmFzc2lnbm1lbnRJbkZvckV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZUxvZ2ljYWxBbmRFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZVJlbGF0aW9uYWxFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VBZGR0aXZlRXhwcmVzc2lvbigpOw0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIFBhcnNlTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZVByaW1hcnlFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VQb3N0RXhwcmVzc2lvbihDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogZSk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCisNCisgcHJpdmF0ZToNCisgIGNvbnN0IEZYX1dDSEFSKiBtX3BTY3JpcHQ7DQorICBGWF9TVFJTSVpFIG1fdUxlbmd0aDsNCisgIENYRkFfRk1MZXhlciogbV9sZXhlcjsNCisgIENYRkFfRk1Ub2tlbiogbV9wVG9rZW47DQorICBDWEZBX0ZNRXJyb3JJbmZvKiBtX3BFcnJvckluZm87DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9sZXhlci5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9sZXhlci5jcHAKaW5kZXggYmE2MjIxOS4uYWFlZjc3NCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfbGV4ZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2xleGVyLmNwcApAQCAtNiw1ODQgKzYsNTY3IEBACiANCiAjaW5jbHVkZSAieGZhX2ZtMmpzLmgiDQogc3RydWN0IFhGQV9GTURDaGFyIHsNCi0gICAgc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBpbmMoY29uc3QgRlhfV0NIQVIqICZwKQ0KLSAgICB7DQotICAgICAgICArK3A7DQotICAgICAgICByZXR1cm4gcDsNCi0gICAgfQ0KLSAgICBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIGRlYyhjb25zdCBGWF9XQ0hBUiogJnApDQotICAgIHsNCi0gICAgICAgIC0tcDsNCi0gICAgICAgIHJldHVybiBwOw0KLSAgICB9DQotICAgIHN0YXRpYyB1aW50MTZfdCBnZXQoY29uc3QgRlhfV0NIQVIqIHApDQotICAgIHsNCi0gICAgICAgIHJldHVybiAqcDsNCi0gICAgfQ0KLSAgICBzdGF0aWMgRlhfQk9PTCBpc1doaXRlU3BhY2UoY29uc3QgRlhfV0NIQVIqIHApDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKnApID09IDB4MDkgfHwgKCpwKSA9PSAweDBiIHx8ICgqcCkgPT0gMHgwYyB8fCAoKnApID09IDB4MjA7DQotICAgIH0NCi0gICAgc3RhdGljIEZYX0JPT0wgaXNMaW5lVGVybWluYXRvcihjb25zdCBGWF9XQ0hBUiogcCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICpwID09IDB4MEEgfHwgKnAgPT0gMHgwRDsNCi0gICAgfQ0KLSAgICBzdGF0aWMgRlhfQk9PTCBpc0JpbmFyeShjb25zdCBGWF9XQ0hBUiogcCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgqcCkgPj0gJzAnICYmICgqcCkgPD0gJzEnOw0KLSAgICB9DQotICAgIHN0YXRpYyBGWF9CT09MIGlzT2N0YWwoY29uc3QgRlhfV0NIQVIqIHApDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKnApID49ICcwJyAmJiAoKnApIDw9ICc3JzsNCi0gICAgfQ0KLSAgICBzdGF0aWMgRlhfQk9PTCBpc0RpZ2l0YWwoY29uc3QgRlhfV0NIQVIqIHApDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKnApID49ICcwJyAmJiAoKnApIDw9ICc5JzsNCi0gICAgfQ0KLSAgICBzdGF0aWMgRlhfQk9PTCBpc0hleChjb25zdCBGWF9XQ0hBUiogcCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGlzRGlnaXRhbChwKSB8fCAoKCpwKSA+PSAnYScgJiYgKCpwKSA8PSAnZicpIHx8ICgoKnApID49ICdBJyAmJiAoKnApIDw9ICdGJyk7DQotICAgIH0NCi0gICAgc3RhdGljIEZYX0JPT0wgaXNBbHBoYShjb25zdCBGWF9XQ0hBUiogcCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoKnApIDw9ICd6JyAmJiAoKnApID49ICdhJykgfHwgKCgqcCkgPD0gJ1onICYmICgqcCkgPj0gJ0EnKTsNCi0gICAgfQ0KLSAgICBzdGF0aWMgRlhfQk9PTCBpc0F2YWxpZChjb25zdCBGWF9XQ0hBUiogcCwgRlhfQk9PTCBmbGFnID0gMCk7DQotICAgIHN0YXRpYyBGWF9CT09MIHN0cmluZzJudW1iZXIoY29uc3QgRlhfV0NIQVIqIHMsIEZYX0RPVUJMRSAqcFZhbHVlLCBjb25zdCBGWF9XQ0hBUiogJnBFbmQpOw0KLSAgICBzdGF0aWMgRlhfQk9PTCBpc1VuaWNvZGVBbHBoYSh1aW50MTZfdCBjaCk7DQorICBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIGluYyhjb25zdCBGWF9XQ0hBUiomIHApIHsNCisgICAgKytwOw0KKyAgICByZXR1cm4gcDsNCisgIH0NCisgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogZGVjKGNvbnN0IEZYX1dDSEFSKiYgcCkgew0KKyAgICAtLXA7DQorICAgIHJldHVybiBwOw0KKyAgfQ0KKyAgc3RhdGljIHVpbnQxNl90IGdldChjb25zdCBGWF9XQ0hBUiogcCkgeyByZXR1cm4gKnA7IH0NCisgIHN0YXRpYyBGWF9CT09MIGlzV2hpdGVTcGFjZShjb25zdCBGWF9XQ0hBUiogcCkgew0KKyAgICByZXR1cm4gKCpwKSA9PSAweDA5IHx8ICgqcCkgPT0gMHgwYiB8fCAoKnApID09IDB4MGMgfHwgKCpwKSA9PSAweDIwOw0KKyAgfQ0KKyAgc3RhdGljIEZYX0JPT0wgaXNMaW5lVGVybWluYXRvcihjb25zdCBGWF9XQ0hBUiogcCkgew0KKyAgICByZXR1cm4gKnAgPT0gMHgwQSB8fCAqcCA9PSAweDBEOw0KKyAgfQ0KKyAgc3RhdGljIEZYX0JPT0wgaXNCaW5hcnkoY29uc3QgRlhfV0NIQVIqIHApIHsNCisgICAgcmV0dXJuICgqcCkgPj0gJzAnICYmICgqcCkgPD0gJzEnOw0KKyAgfQ0KKyAgc3RhdGljIEZYX0JPT0wgaXNPY3RhbChjb25zdCBGWF9XQ0hBUiogcCkgew0KKyAgICByZXR1cm4gKCpwKSA+PSAnMCcgJiYgKCpwKSA8PSAnNyc7DQorICB9DQorICBzdGF0aWMgRlhfQk9PTCBpc0RpZ2l0YWwoY29uc3QgRlhfV0NIQVIqIHApIHsNCisgICAgcmV0dXJuICgqcCkgPj0gJzAnICYmICgqcCkgPD0gJzknOw0KKyAgfQ0KKyAgc3RhdGljIEZYX0JPT0wgaXNIZXgoY29uc3QgRlhfV0NIQVIqIHApIHsNCisgICAgcmV0dXJuIGlzRGlnaXRhbChwKSB8fCAoKCpwKSA+PSAnYScgJiYgKCpwKSA8PSAnZicpIHx8DQorICAgICAgICAgICAoKCpwKSA+PSAnQScgJiYgKCpwKSA8PSAnRicpOw0KKyAgfQ0KKyAgc3RhdGljIEZYX0JPT0wgaXNBbHBoYShjb25zdCBGWF9XQ0hBUiogcCkgew0KKyAgICByZXR1cm4gKCgqcCkgPD0gJ3onICYmICgqcCkgPj0gJ2EnKSB8fCAoKCpwKSA8PSAnWicgJiYgKCpwKSA+PSAnQScpOw0KKyAgfQ0KKyAgc3RhdGljIEZYX0JPT0wgaXNBdmFsaWQoY29uc3QgRlhfV0NIQVIqIHAsIEZYX0JPT0wgZmxhZyA9IDApOw0KKyAgc3RhdGljIEZYX0JPT0wgc3RyaW5nMm51bWJlcihjb25zdCBGWF9XQ0hBUiogcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9VQkxFKiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiYgcEVuZCk7DQorICBzdGF0aWMgRlhfQk9PTCBpc1VuaWNvZGVBbHBoYSh1aW50MTZfdCBjaCk7DQogfTsNCi1pbmxpbmUgRlhfQk9PTCBYRkFfRk1EQ2hhcjo6aXNBdmFsaWQoY29uc3QgRlhfV0NIQVIqIHAsIEZYX0JPT0wgZmxhZykNCi17DQotICAgIGlmICgqcCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gMTsNCitpbmxpbmUgRlhfQk9PTCBYRkFfRk1EQ2hhcjo6aXNBdmFsaWQoY29uc3QgRlhfV0NIQVIqIHAsIEZYX0JPT0wgZmxhZykgew0KKyAgaWYgKCpwID09IDApIHsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBpZiAoKCpwIDw9IDB4MEEgJiYgKnAgPj0gMHgwOSkgfHwgKnAgPT0gMHgwRCB8fA0KKyAgICAgICgqcCA8PSAweGQ3ZmYgJiYgKnAgPj0gMHgyMCkgfHwgKCpwIDw9IDB4ZmZmZCAmJiAqcCA+PSAweGUwMDApKSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgaWYgKCFmbGFnKSB7DQorICAgIGlmICgqcCA9PSAweDBCIHx8ICpwID09IDB4MEMpIHsNCisgICAgICByZXR1cm4gMTsNCiAgICAgfQ0KLSAgICBpZiAoKCpwIDw9IDB4MEEgJiYgKnAgPj0gMHgwOSkgfHwgKnAgPT0gMHgwRCB8fCAoKnAgPD0gMHhkN2ZmICYmICpwID49IDB4MjApIHx8ICgqcCA8PSAweGZmZmQgJiYgKnAgPj0gMHhlMDAwKSkgew0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0NCi0gICAgaWYgKCFmbGFnKSB7DQotICAgICAgICBpZiAoKnAgPT0gMHgwQiB8fCAqcCA9PSAweDBDKSB7DQotICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gMDsNCiB9DQotaW5saW5lIEZYX0JPT0wgWEZBX0ZNRENoYXI6OnN0cmluZzJudW1iZXIoY29uc3QgRlhfV0NIQVIqIHMsIEZYX0RPVUJMRSAqcFZhbHVlLCBjb25zdCBGWF9XQ0hBUiogJnBFbmQpDQotew0KLSAgICBpZiAocykgew0KLSAgICAgICAgKnBWYWx1ZSA9IHdjc3RvZCgod2NoYXJfdCAqKXMsICh3Y2hhcl90ICoqKSZwRW5kKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gMDsNCitpbmxpbmUgRlhfQk9PTCBYRkFfRk1EQ2hhcjo6c3RyaW5nMm51bWJlcihjb25zdCBGWF9XQ0hBUiogcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUqIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiomIHBFbmQpIHsNCisgIGlmIChzKSB7DQorICAgICpwVmFsdWUgPSB3Y3N0b2QoKHdjaGFyX3QqKXMsICh3Y2hhcl90KiopJnBFbmQpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQogfQ0KLWlubGluZSBGWF9CT09MIFhGQV9GTURDaGFyOjppc1VuaWNvZGVBbHBoYSh1aW50MTZfdCBjaCkNCi17DQotICAgIGlmIChjaCA9PSAwIHx8IGNoID09IDB4MEEgfHwgY2ggPT0gMHgwRCB8fCBjaCA9PSAweDA5IHx8IGNoID09IDB4MEIgfHwgY2ggPT0gMHgwQyB8fCBjaCA9PSAweDIwIHx8IGNoID09ICcuJw0KLSAgICAgICAgICAgIHx8IGNoID09ICc7JyB8fCBjaCA9PSAnIicgfHwgY2ggPT0gJz0nIHx8IGNoID09ICc8JyB8fCBjaCA9PSAnPicgfHwgY2ggPT0gJywnIHx8IGNoID09ICcoJyB8fCBjaCA9PSAnKScNCi0gICAgICAgICAgICB8fCBjaCA9PSAnXScgfHwgY2ggPT0gJ1snIHx8IGNoID09ICcmJyB8fCBjaCA9PSAnfCcgfHwgY2ggPT0gJysnIHx8IGNoID09ICctJyB8fCBjaCA9PSAnKicgfHwgY2ggPT0gJy8nKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KK2lubGluZSBGWF9CT09MIFhGQV9GTURDaGFyOjppc1VuaWNvZGVBbHBoYSh1aW50MTZfdCBjaCkgew0KKyAgaWYgKGNoID09IDAgfHwgY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEIHx8IGNoID09IDB4MDkgfHwgY2ggPT0gMHgwQiB8fA0KKyAgICAgIGNoID09IDB4MEMgfHwgY2ggPT0gMHgyMCB8fCBjaCA9PSAnLicgfHwgY2ggPT0gJzsnIHx8IGNoID09ICciJyB8fA0KKyAgICAgIGNoID09ICc9JyB8fCBjaCA9PSAnPCcgfHwgY2ggPT0gJz4nIHx8IGNoID09ICcsJyB8fCBjaCA9PSAnKCcgfHwNCisgICAgICBjaCA9PSAnKScgfHwgY2ggPT0gJ10nIHx8IGNoID09ICdbJyB8fCBjaCA9PSAnJicgfHwgY2ggPT0gJ3wnIHx8DQorICAgICAgY2ggPT0gJysnIHx8IGNoID09ICctJyB8fCBjaCA9PSAnKicgfHwgY2ggPT0gJy8nKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KIH0NCiBzdGF0aWMgWEZBX0ZNS2V5d29yZCBrZXlXb3Jkc1tdID0gew0KLSAgICB7VE9LYW5kLAkJMHgwMDAwMDAyNiwJCUwiJiJ9LA0KLSAgICB7VE9LbHBhcmVuLAkJMHgwMDAwMDAyOCwJCUwiKCJ9LA0KLSAgICB7VE9LcnBhcmVuLAkJMHgwMDAwMDAyOSwJCUwiKSJ9LA0KLSAgICB7VE9LbXVsLAkJMHgwMDAwMDAyYSwJCUwiKiJ9LA0KLSAgICB7VE9LcGx1cywJCTB4MDAwMDAwMmIsCQlMIisifSwNCi0gICAge1RPS2NvbW1hLAkJMHgwMDAwMDAyYywJCUwiLCJ9LA0KLSAgICB7VE9LbWludXMsCQkweDAwMDAwMDJkLAkJTCItIn0sDQotICAgIHtUT0tkb3QsCQkweDAwMDAwMDJlLAkJTCIuIn0sDQotICAgIHtUT0tkaXYsCQkweDAwMDAwMDJmLAkJTCIvIn0sDQotICAgIHtUT0tsdCwJCQkweDAwMDAwMDNjLAkJTCI8In0sDQotICAgIHtUT0thc3NpZ24sCQkweDAwMDAwMDNkLAkJTCI9In0sDQotICAgIHtUT0tndCwJCQkweDAwMDAwMDNlLAkJTCI+In0sDQotICAgIHtUT0tsYnJhY2tldCwJMHgwMDAwMDA1YiwJCUwiWyJ9LA0KLSAgICB7VE9LcmJyYWNrZXQsCTB4MDAwMDAwNWQsCQlMIl0ifSwNCi0gICAge1RPS29yLAkJCTB4MDAwMDAwN2MsCQlMInwifSwNCi0gICAge1RPS2RvdHNjcmVhbSwJMHgwMDAwZWMxMSwJCUwiLiMifSwNCi0gICAge1RPS2RvdHN0YXIsCTB4MDAwMGVjMTgsCQlMIi4qIn0sDQotICAgIHtUT0tkb3Rkb3QsCQkweDAwMDBlYzFjLAkJTCIuLiJ9LA0KLSAgICB7VE9LbGUsCQkJMHgwMDAxMzNmOSwJCUwiPD0ifSwNCi0gICAge1RPS25lLAkJCTB4MDAwMTMzZmEsCQlMIjw+In0sDQotICAgIHtUT0tlcSwJCQkweDAwMDEzOTFhLAkJTCI9PSJ9LA0KLSAgICB7VE9LZ2UsCQkJMHgwMDAxM2UzYiwJCUwiPj0ifSwNCi0gICAge1RPS2RvLAkJCTB4MDAwMjAxNTMsCQlMImRvIn0sDQotICAgIHtUT0trc2VxLAkJMHgwMDAyMDY3NiwJCUwiZXEifSwNCi0gICAge1RPS2tzZ2UsCQkweDAwMDIxMGFjLAkJTCJnZSJ9LA0KLSAgICB7VE9La3NndCwJCTB4MDAwMjEwYmIsCQlMImd0In0sDQotICAgIHtUT0tpZiwJCQkweDAwMDIxYWVmLAkJTCJpZiJ9LA0KLSAgICB7VE9LaW4sCQkJMHgwMDAyMWFmNywJCUwiaW4ifSwNCi0gICAge1RPS2tzbGUsCQkweDAwMDIyYTUxLAkJTCJsZSJ9LA0KLSAgICB7VE9La3NsdCwJCTB4MDAwMjJhNjAsCQlMImx0In0sDQotICAgIHtUT0trc25lLAkJMHgwMDAyMzQ5MywJCUwibmUifSwNCi0gICAge1RPS2tzb3IsCQkweDAwMDIzOWMxLAkJTCJvciJ9LA0KLSAgICB7VE9LbnVsbCwJCTB4MDUyOTMxYmIsCQlMIm51bGwifSwNCi0gICAge1RPS2JyZWFrLAkJMHgwNTUxOGMyNSwJCUwiYnJlYWsifSwNCi0gICAge1RPS2tzYW5kLAkJMHgwOWY5ZGIzMywJCUwiYW5kIn0sDQotICAgIHtUT0tlbmQsCQkweDBhNjMxNDM3LAkJTCJlbmQifSwNCi0gICAge1RPS2VvZiwJCTB4MGE2MzE5NWEsCQlMImVvZiJ9LA0KLSAgICB7VE9LZm9yLAkJMHgwYTdkNjdhNywJCUwiZm9yIn0sDQotICAgIHtUT0tuYW4sCQkweDBiNGY5MWRkLAkJTCJuYW4ifSwNCi0gICAge1RPS2tzbm90LAkJMHgwYjRmZDliMSwJCUwibm90In0sDQotICAgIHtUT0t2YXIsCQkweDBjMjIwM2U5LAkJTCJ2YXIifSwNCi0gICAge1RPS3RoZW4sCQkweDJkNTczOGNmLAkJTCJ0aGVuIn0sDQotICAgIHtUT0tlbHNlLAkJMHg0NWY2NWVlOSwJCUwiZWxzZSJ9LA0KLSAgICB7VE9LZXhpdCwJCTB4NDczMWQ2YmEsCQlMImV4aXQifSwNCi0gICAge1RPS2Rvd250bywJCTB4NGNhYWRjM2IsCQlMImRvd250byJ9LA0KLSAgICB7VE9LcmV0dXJuLAkJMHg0ZGI4YmQ2MCwJCUwicmV0dXJuIn0sDQotICAgIHtUT0tpbmZpbml0eSwJMHg1YzBhMDEwYSwJCUwiaW5maW5pdHkifSwNCi0gICAge1RPS2VuZHdoaWxlLAkweDVjNjRiZmYwLAkJTCJlbmR3aGlsZSJ9LA0KLSAgICB7VE9LZm9yZWFjaCwJMHg2N2UzMWYzOCwJCUwiZm9yZWFjaCJ9LA0KLSAgICB7VE9LZW5kZnVuYywJMHg2OGY5ODRhMywJCUwiZW5kZnVuYyJ9LA0KLSAgICB7VE9LZWxzZWlmLAkJMHg3ODI1MzIxOCwJCUwiZWxzZWlmIn0sDQotICAgIHtUT0t3aGlsZSwJCTB4ODQyMjkyNTksCQlMIndoaWxlIn0sDQotICAgIHtUT0tlbmRmb3IsCQkweDhhYjQ5ZDdlLAkJTCJlbmRmb3IifSwNCi0gICAge1RPS3Rocm93LAkJMHg4ZGIwNWM5NCwJCUwidGhyb3cifSwNCi0gICAge1RPS3N0ZXAsCQkweGE3YTc4ODdjLAkJTCJzdGVwIn0sDQotICAgIHtUT0t1cHRvLAkJMHhiNTE1NTMyOCwJCUwidXB0byJ9LA0KLSAgICB7VE9LY29udGludWUsCTB4YzAzNDA2ODUsCQlMImNvbnRpbnVlIn0sDQotICAgIHtUT0tmdW5jLAkJMHhjZGNlNjBlYywJCUwiZnVuYyJ9LA0KLSAgICB7VE9LZW5kaWYsCQkweGUwZThmZWU2LAkJTCJlbmRpZiJ9LA0KKyAgICB7VE9LYW5kLCAweDAwMDAwMDI2LCBMIiYifSwNCisgICAge1RPS2xwYXJlbiwgMHgwMDAwMDAyOCwgTCIoIn0sDQorICAgIHtUT0tycGFyZW4sIDB4MDAwMDAwMjksIEwiKSJ9LA0KKyAgICB7VE9LbXVsLCAweDAwMDAwMDJhLCBMIioifSwNCisgICAge1RPS3BsdXMsIDB4MDAwMDAwMmIsIEwiKyJ9LA0KKyAgICB7VE9LY29tbWEsIDB4MDAwMDAwMmMsIEwiLCJ9LA0KKyAgICB7VE9LbWludXMsIDB4MDAwMDAwMmQsIEwiLSJ9LA0KKyAgICB7VE9LZG90LCAweDAwMDAwMDJlLCBMIi4ifSwNCisgICAge1RPS2RpdiwgMHgwMDAwMDAyZiwgTCIvIn0sDQorICAgIHtUT0tsdCwgMHgwMDAwMDAzYywgTCI8In0sDQorICAgIHtUT0thc3NpZ24sIDB4MDAwMDAwM2QsIEwiPSJ9LA0KKyAgICB7VE9LZ3QsIDB4MDAwMDAwM2UsIEwiPiJ9LA0KKyAgICB7VE9LbGJyYWNrZXQsIDB4MDAwMDAwNWIsIEwiWyJ9LA0KKyAgICB7VE9LcmJyYWNrZXQsIDB4MDAwMDAwNWQsIEwiXSJ9LA0KKyAgICB7VE9Lb3IsIDB4MDAwMDAwN2MsIEwifCJ9LA0KKyAgICB7VE9LZG90c2NyZWFtLCAweDAwMDBlYzExLCBMIi4jIn0sDQorICAgIHtUT0tkb3RzdGFyLCAweDAwMDBlYzE4LCBMIi4qIn0sDQorICAgIHtUT0tkb3Rkb3QsIDB4MDAwMGVjMWMsIEwiLi4ifSwNCisgICAge1RPS2xlLCAweDAwMDEzM2Y5LCBMIjw9In0sDQorICAgIHtUT0tuZSwgMHgwMDAxMzNmYSwgTCI8PiJ9LA0KKyAgICB7VE9LZXEsIDB4MDAwMTM5MWEsIEwiPT0ifSwNCisgICAge1RPS2dlLCAweDAwMDEzZTNiLCBMIj49In0sDQorICAgIHtUT0tkbywgMHgwMDAyMDE1MywgTCJkbyJ9LA0KKyAgICB7VE9La3NlcSwgMHgwMDAyMDY3NiwgTCJlcSJ9LA0KKyAgICB7VE9La3NnZSwgMHgwMDAyMTBhYywgTCJnZSJ9LA0KKyAgICB7VE9La3NndCwgMHgwMDAyMTBiYiwgTCJndCJ9LA0KKyAgICB7VE9LaWYsIDB4MDAwMjFhZWYsIEwiaWYifSwNCisgICAge1RPS2luLCAweDAwMDIxYWY3LCBMImluIn0sDQorICAgIHtUT0trc2xlLCAweDAwMDIyYTUxLCBMImxlIn0sDQorICAgIHtUT0trc2x0LCAweDAwMDIyYTYwLCBMImx0In0sDQorICAgIHtUT0trc25lLCAweDAwMDIzNDkzLCBMIm5lIn0sDQorICAgIHtUT0trc29yLCAweDAwMDIzOWMxLCBMIm9yIn0sDQorICAgIHtUT0tudWxsLCAweDA1MjkzMWJiLCBMIm51bGwifSwNCisgICAge1RPS2JyZWFrLCAweDA1NTE4YzI1LCBMImJyZWFrIn0sDQorICAgIHtUT0trc2FuZCwgMHgwOWY5ZGIzMywgTCJhbmQifSwNCisgICAge1RPS2VuZCwgMHgwYTYzMTQzNywgTCJlbmQifSwNCisgICAge1RPS2VvZiwgMHgwYTYzMTk1YSwgTCJlb2YifSwNCisgICAge1RPS2ZvciwgMHgwYTdkNjdhNywgTCJmb3IifSwNCisgICAge1RPS25hbiwgMHgwYjRmOTFkZCwgTCJuYW4ifSwNCisgICAge1RPS2tzbm90LCAweDBiNGZkOWIxLCBMIm5vdCJ9LA0KKyAgICB7VE9LdmFyLCAweDBjMjIwM2U5LCBMInZhciJ9LA0KKyAgICB7VE9LdGhlbiwgMHgyZDU3MzhjZiwgTCJ0aGVuIn0sDQorICAgIHtUT0tlbHNlLCAweDQ1ZjY1ZWU5LCBMImVsc2UifSwNCisgICAge1RPS2V4aXQsIDB4NDczMWQ2YmEsIEwiZXhpdCJ9LA0KKyAgICB7VE9LZG93bnRvLCAweDRjYWFkYzNiLCBMImRvd250byJ9LA0KKyAgICB7VE9LcmV0dXJuLCAweDRkYjhiZDYwLCBMInJldHVybiJ9LA0KKyAgICB7VE9LaW5maW5pdHksIDB4NWMwYTAxMGEsIEwiaW5maW5pdHkifSwNCisgICAge1RPS2VuZHdoaWxlLCAweDVjNjRiZmYwLCBMImVuZHdoaWxlIn0sDQorICAgIHtUT0tmb3JlYWNoLCAweDY3ZTMxZjM4LCBMImZvcmVhY2gifSwNCisgICAge1RPS2VuZGZ1bmMsIDB4NjhmOTg0YTMsIEwiZW5kZnVuYyJ9LA0KKyAgICB7VE9LZWxzZWlmLCAweDc4MjUzMjE4LCBMImVsc2VpZiJ9LA0KKyAgICB7VE9Ld2hpbGUsIDB4ODQyMjkyNTksIEwid2hpbGUifSwNCisgICAge1RPS2VuZGZvciwgMHg4YWI0OWQ3ZSwgTCJlbmRmb3IifSwNCisgICAge1RPS3Rocm93LCAweDhkYjA1Yzk0LCBMInRocm93In0sDQorICAgIHtUT0tzdGVwLCAweGE3YTc4ODdjLCBMInN0ZXAifSwNCisgICAge1RPS3VwdG8sIDB4YjUxNTUzMjgsIEwidXB0byJ9LA0KKyAgICB7VE9LY29udGludWUsIDB4YzAzNDA2ODUsIEwiY29udGludWUifSwNCisgICAge1RPS2Z1bmMsIDB4Y2RjZTYwZWMsIEwiZnVuYyJ9LA0KKyAgICB7VE9LZW5kaWYsIDB4ZTBlOGZlZTYsIEwiZW5kaWYifSwNCiB9Ow0KIHN0YXRpYyBjb25zdCBGWF9XT1JEIEtFWVdPUkRfU1RBUlQgPSBUT0tkbzsNCiBzdGF0aWMgY29uc3QgRlhfV09SRCBLRVlXT1JEX0VORCA9IFRPS2VuZGlmOw0KLWNvbnN0IEZYX1dDSEFSKiBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKFhGQV9GTV9UT0tFTiBvcCkNCi17DQotICAgIHJldHVybiBrZXlXb3Jkc1tvcF0ubV9rZXdvcmQ7DQorY29uc3QgRlhfV0NIQVIqIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcoWEZBX0ZNX1RPS0VOIG9wKSB7DQorICByZXR1cm4ga2V5V29yZHNbb3BdLm1fa2V3b3JkOw0KIH0NCi1DWEZBX0ZNVG9rZW46OkNYRkFfRk1Ub2tlbigpDQotew0KLSAgICBtX3R5cGUgPSBUT0tyZXNlcnZlcjsNCi0gICAgbV91TGluZW51bSA9IDE7DQotICAgIG1fcE5leHQgPSAwOw0KK0NYRkFfRk1Ub2tlbjo6Q1hGQV9GTVRva2VuKCkgew0KKyAgbV90eXBlID0gVE9LcmVzZXJ2ZXI7DQorICBtX3VMaW5lbnVtID0gMTsNCisgIG1fcE5leHQgPSAwOw0KIH0NCi1DWEZBX0ZNVG9rZW46OkNYRkFfRk1Ub2tlbiggRlhfRFdPUkQgdUxpbmVOdW0gKQ0KLXsNCi0gICAgbV90eXBlID0gVE9LcmVzZXJ2ZXI7DQotICAgIG1fdUxpbmVudW0gPSB1TGluZU51bTsNCi0gICAgbV9wTmV4dCA9IDA7DQorQ1hGQV9GTVRva2VuOjpDWEZBX0ZNVG9rZW4oRlhfRFdPUkQgdUxpbmVOdW0pIHsNCisgIG1fdHlwZSA9IFRPS3Jlc2VydmVyOw0KKyAgbV91TGluZW51bSA9IHVMaW5lTnVtOw0KKyAgbV9wTmV4dCA9IDA7DQogfQ0KLUNYRkFfRk1Ub2tlbjo6fkNYRkFfRk1Ub2tlbigpDQotew0KK0NYRkFfRk1Ub2tlbjo6fkNYRkFfRk1Ub2tlbigpIHt9DQorQ1hGQV9GTUxleGVyOjpDWEZBX0ZNTGV4ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1DYWxjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1FcnJvckluZm8qIHBFcnJvckluZm8pIHsNCisgIG1fcFNjcmlwdCA9IHdzRm9ybUNhbGMuR2V0UHRyKCk7DQorICBtX3VMZW5ndGggPSB3c0Zvcm1DYWxjLkdldExlbmd0aCgpOw0KKyAgbV91Q3VycmVudExpbmUgPSAxOw0KKyAgbV9wdHIgPSBtX3BTY3JpcHQ7DQorICBtX3BUb2tlbiA9IDA7DQorICBtX3BFcnJvckluZm8gPSBwRXJyb3JJbmZvOw0KIH0NCi1DWEZBX0ZNTGV4ZXI6OkNYRkFfRk1MZXhlcihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybUNhbGMsIENYRkFfRk1FcnJvckluZm8gKnBFcnJvckluZm8pDQotew0KLSAgICBtX3BTY3JpcHQgPSB3c0Zvcm1DYWxjLkdldFB0cigpOw0KLSAgICBtX3VMZW5ndGggPSB3c0Zvcm1DYWxjLkdldExlbmd0aCgpOw0KLSAgICBtX3VDdXJyZW50TGluZSA9IDE7DQotICAgIG1fcHRyID0gbV9wU2NyaXB0Ow0KLSAgICBtX3BUb2tlbiA9IDA7DQotICAgIG1fcEVycm9ySW5mbyA9IHBFcnJvckluZm87DQotfQ0KLUNYRkFfRk1Ub2tlbiAqQ1hGQV9GTUxleGVyOjpOZXh0VG9rZW4oKQ0KLXsNCi0gICAgQ1hGQV9GTVRva2VuICp0ID0gMDsNCi0gICAgaWYgKCFtX3BUb2tlbikgew0KLSAgICAgICAgbV9wVG9rZW4gPSBTY2FuKCk7DQorQ1hGQV9GTVRva2VuKiBDWEZBX0ZNTGV4ZXI6Ok5leHRUb2tlbigpIHsNCisgIENYRkFfRk1Ub2tlbiogdCA9IDA7DQorICBpZiAoIW1fcFRva2VuKSB7DQorICAgIG1fcFRva2VuID0gU2NhbigpOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fcFRva2VuLT5tX3BOZXh0KSB7DQorICAgICAgdCA9IG1fcFRva2VuLT5tX3BOZXh0Ow0KKyAgICAgIGRlbGV0ZSBtX3BUb2tlbjsNCisgICAgICBtX3BUb2tlbiA9IHQ7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAobV9wVG9rZW4tPm1fcE5leHQpIHsNCi0gICAgICAgICAgICB0ID0gbV9wVG9rZW4tPm1fcE5leHQ7DQotICAgICAgICAgICAgZGVsZXRlIG1fcFRva2VuOw0KLSAgICAgICAgICAgIG1fcFRva2VuID0gdDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdCA9IG1fcFRva2VuOw0KLSAgICAgICAgICAgIG1fcFRva2VuID0gU2NhbigpOw0KLSAgICAgICAgICAgIGRlbGV0ZSB0Ow0KLSAgICAgICAgfQ0KKyAgICAgIHQgPSBtX3BUb2tlbjsNCisgICAgICBtX3BUb2tlbiA9IFNjYW4oKTsNCisgICAgICBkZWxldGUgdDsNCiAgICAgfQ0KLSAgICByZXR1cm4gbV9wVG9rZW47DQorICB9DQorICByZXR1cm4gbV9wVG9rZW47DQogfQ0KLUNYRkFfRk1Ub2tlbiAqIENYRkFfRk1MZXhlcjo6U2NhbigpDQotew0KLSAgICB1aW50MTZfdCBjaCA9IDA7DQotICAgIENYRkFfRk1Ub2tlbiAqIHAgPSBGWF9ORVcgQ1hGQV9GTVRva2VuKG1fdUN1cnJlbnRMaW5lKTsNCitDWEZBX0ZNVG9rZW4qIENYRkFfRk1MZXhlcjo6U2NhbigpIHsNCisgIHVpbnQxNl90IGNoID0gMDsNCisgIENYRkFfRk1Ub2tlbiogcCA9IEZYX05FVyBDWEZBX0ZNVG9rZW4obV91Q3VycmVudExpbmUpOw0KKyAgaWYgKCFYRkFfRk1EQ2hhcjo6aXNBdmFsaWQobV9wdHIpKSB7DQorICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCisgICAgcmV0dXJuIHA7DQorICB9DQorICBpbnQgaVJldCA9IDA7DQorICB3aGlsZSAoMSkgew0KICAgICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsNCi0gICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQotICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQorICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQorICAgICAgcmV0dXJuIHA7DQorICAgIH0NCisgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgc3dpdGNoIChjaCkgew0KKyAgICAgIGNhc2UgMDoNCisgICAgICAgIHAtPm1fdHlwZSA9IFRPS2VvZjsNCisgICAgICAgIHJldHVybiBwOw0KKyAgICAgIGNhc2UgMHgwQToNCisgICAgICAgICsrbV91Q3VycmVudExpbmU7DQorICAgICAgICBwLT5tX3VMaW5lbnVtID0gbV91Q3VycmVudExpbmU7DQorICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMHgwRDoNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnOyc6IHsNCisgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVGVtcCA9IDA7DQorICAgICAgICBDb21tZW50KG1fcHRyLCBwVGVtcCk7DQorICAgICAgICBtX3B0ciA9IHBUZW1wOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAnIic6IHsNCisgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVGVtcCA9IDA7DQorICAgICAgICBwLT5tX3R5cGUgPSBUT0tzdHJpbmc7DQorICAgICAgICBpUmV0ID0gU3RyaW5nKHAsIG1fcHRyLCBwVGVtcCk7DQorICAgICAgICBpZiAoaVJldCkgew0KKyAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgIH0NCisgICAgICAgIG1fcHRyID0gcFRlbXA7DQorICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHA7DQorICAgICAgY2FzZSAnMCc6DQorICAgICAgY2FzZSAnMSc6DQorICAgICAgY2FzZSAnMic6DQorICAgICAgY2FzZSAnMyc6DQorICAgICAgY2FzZSAnNCc6DQorICAgICAgY2FzZSAnNSc6DQorICAgICAgY2FzZSAnNic6DQorICAgICAgY2FzZSAnNyc6DQorICAgICAgY2FzZSAnOCc6DQorICAgICAgY2FzZSAnOSc6IHsNCisgICAgICAgIHAtPm1fdHlwZSA9IFRPS251bWJlcjsNCisgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVGVtcCA9IDA7DQorICAgICAgICBpUmV0ID0gTnVtYmVyKHAsIG1fcHRyLCBwVGVtcCk7DQorICAgICAgICBtX3B0ciA9IHBUZW1wOw0KKyAgICAgICAgaWYgKGlSZXQpIHsNCisgICAgICAgICAgRXJyb3IoRk1FUlJfQkFEX1NVRkZJWF9OVU1CRVIpOw0KKyAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgICByZXR1cm4gcDsNCisgICAgICBjYXNlICc9JzoNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgaWYgKFhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsNCisgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgICAgICAgaWYgKGNoID09ICc9Jykgew0KKyAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2VxOw0KKyAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2Fzc2lnbjsNCisgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgICAgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJzwnOg0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICBpZiAoWEZBX0ZNRENoYXI6OmlzQXZhbGlkKG1fcHRyKSkgew0KKyAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICBpZiAoY2ggPT0gJz0nKSB7DQorICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbGU7DQorICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7DQorICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbmU7DQorICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbHQ7DQorICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCisgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICc+JzoNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgaWYgKFhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsNCisgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgICAgICAgaWYgKGNoID09ICc9Jykgew0KKyAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2dlOw0KKyAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2d0Ow0KKyAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQorICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnLCc6DQorICAgICAgICBwLT5tX3R5cGUgPSBUT0tjb21tYTsNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgcmV0dXJuIHA7DQorICAgICAgY2FzZSAnKCc6DQorICAgICAgICBwLT5tX3R5cGUgPSBUT0tscGFyZW47DQorICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgIHJldHVybiBwOw0KKyAgICAgIGNhc2UgJyknOg0KKyAgICAgICAgcC0+bV90eXBlID0gVE9LcnBhcmVuOw0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICByZXR1cm4gcDsNCisgICAgICBjYXNlICdbJzoNCisgICAgICAgIHAtPm1fdHlwZSA9IFRPS2xicmFja2V0Ow0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICByZXR1cm4gcDsNCisgICAgICBjYXNlICddJzoNCisgICAgICAgIHAtPm1fdHlwZSA9IFRPS3JicmFja2V0Ow0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICByZXR1cm4gcDsNCisgICAgICBjYXNlICcmJzoNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgcC0+bV90eXBlID0gVE9LYW5kOw0KKyAgICAgICAgcmV0dXJuIHA7DQorICAgICAgY2FzZSAnfCc6DQorICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgIHAtPm1fdHlwZSA9IFRPS29yOw0KKyAgICAgICAgcmV0dXJuIHA7DQorICAgICAgY2FzZSAnKyc6DQorICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgIHAtPm1fdHlwZSA9IFRPS3BsdXM7DQorICAgICAgICByZXR1cm4gcDsNCisgICAgICBjYXNlICctJzoNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgcC0+bV90eXBlID0gVE9LbWludXM7DQorICAgICAgICByZXR1cm4gcDsNCisgICAgICBjYXNlICcqJzoNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgcC0+bV90eXBlID0gVE9LbXVsOw0KKyAgICAgICAgcmV0dXJuIHA7DQorICAgICAgY2FzZSAnLyc6DQorICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgIGlmIChYRkFfRk1EQ2hhcjo6aXNBdmFsaWQobV9wdHIpKSB7DQorICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgICAgICAgIGlmIChjaCA9PSAnLycpIHsNCisgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFRlbXAgPSAwOw0KKyAgICAgICAgICAgIENvbW1lbnQobV9wdHIsIHBUZW1wKTsNCisgICAgICAgICAgICBtX3B0ciA9IHBUZW1wOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2RpdjsNCisgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgICAgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJy4nOg0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICBpZiAoWEZBX0ZNRENoYXI6OmlzQXZhbGlkKG1fcHRyKSkgew0KKyAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICBpZiAoY2ggPT0gJy4nKSB7DQorICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZG90ZG90Ow0KKyAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcqJykgew0KKyAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2RvdHN0YXI7DQorICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyMnKSB7DQorICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZG90c2NyZWFtOw0KKyAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICc5JyAmJiBjaCA+PSAnMCcpIHsNCisgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tudW1iZXI7DQorICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBUZW1wID0gMDsNCisgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6ZGVjKG1fcHRyKTsNCisgICAgICAgICAgICBpUmV0ID0gTnVtYmVyKHAsIG1fcHRyLCBwVGVtcCk7DQorICAgICAgICAgICAgbV9wdHIgPSBwVGVtcDsNCisgICAgICAgICAgICBpZiAoaVJldCkgew0KKyAgICAgICAgICAgICAgRXJyb3IoRk1FUlJfQkFEX1NVRkZJWF9OVU1CRVIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tkb3Q7DQorICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCisgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICB9DQorICAgICAgY2FzZSAweDA5Og0KKyAgICAgIGNhc2UgMHgwQjoNCisgICAgICBjYXNlIDB4MEM6DQorICAgICAgY2FzZSAweDIwOg0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0OiB7DQorICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFRlbXAgPSAwOw0KKyAgICAgICAgaVJldCA9IElkZW50aWZpZXJzKHAsIG1fcHRyLCBwVGVtcCk7DQorICAgICAgICBtX3B0ciA9IHBUZW1wOw0KKyAgICAgICAgaWYgKGlSZXQpIHsNCisgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICB9DQorICAgICAgICBwLT5tX3R5cGUgPSBJc0tleXdvcmQocC0+bV93c3RyaW5nKTsNCisgICAgICB9DQogICAgICAgICByZXR1cm4gcDsNCiAgICAgfQ0KLSAgICBpbnQgaVJldCA9IDA7DQotICAgIHdoaWxlICgxKSB7DQotICAgICAgICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsNCi0gICAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KLSAgICAgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCi0gICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQotICAgICAgICBzd2l0Y2ggKGNoKSB7DQotICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tlb2Y7DQotICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgIGNhc2UgMHgwQToNCi0gICAgICAgICAgICAgICAgKyttX3VDdXJyZW50TGluZTsNCi0gICAgICAgICAgICAgICAgcC0+bV91TGluZW51bSA9IG1fdUN1cnJlbnRMaW5lOw0KLSAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAweDBEOg0KLSAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnOyc6IHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVGVtcCA9IDA7DQotICAgICAgICAgICAgICAgICAgICBDb21tZW50KG1fcHRyLCBwVGVtcCk7DQotICAgICAgICAgICAgICAgICAgICBtX3B0ciA9IHBUZW1wOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJyInOiB7DQotICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFRlbXAgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9Lc3RyaW5nOw0KLSAgICAgICAgICAgICAgICAgICAgaVJldCA9IFN0cmluZyhwLCBtX3B0ciwgcFRlbXApOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIG1fcHRyID0gcFRlbXA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHA7DQotICAgICAgICAgICAgY2FzZSAnMCc6DQotICAgICAgICAgICAgY2FzZSAnMSc6DQotICAgICAgICAgICAgY2FzZSAnMic6DQotICAgICAgICAgICAgY2FzZSAnMyc6DQotICAgICAgICAgICAgY2FzZSAnNCc6DQotICAgICAgICAgICAgY2FzZSAnNSc6DQotICAgICAgICAgICAgY2FzZSAnNic6DQotICAgICAgICAgICAgY2FzZSAnNyc6DQotICAgICAgICAgICAgY2FzZSAnOCc6DQotICAgICAgICAgICAgY2FzZSAnOSc6IHsNCi0gICAgICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS251bWJlcjsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVGVtcCA9IDA7DQotICAgICAgICAgICAgICAgICAgICBpUmV0ID0gTnVtYmVyKHAsIG1fcHRyLCBwVGVtcCk7DQotICAgICAgICAgICAgICAgICAgICBtX3B0ciA9IHBUZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBFcnJvcihGTUVSUl9CQURfU1VGRklYX05VTUJFUik7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHA7DQotICAgICAgICAgICAgY2FzZSAnPSc6DQotICAgICAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KLSAgICAgICAgICAgICAgICBpZiAoWEZBX0ZNRENoYXI6OmlzQXZhbGlkKG1fcHRyKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPScpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tlcTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LYXNzaWduOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJzwnOg0KLSAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgaWYgKFhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz0nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc+Jykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS25lOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tsdDsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQotICAgICAgICAgICAgICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICc+JzoNCi0gICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQotICAgICAgICAgICAgICAgIGlmIChYRkFfRk1EQ2hhcjo6aXNBdmFsaWQobV9wdHIpKSB7DQotICAgICAgICAgICAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc9Jykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2dlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tndDsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQotICAgICAgICAgICAgICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICcsJzoNCi0gICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LY29tbWE7DQotICAgICAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICBjYXNlICcoJzoNCi0gICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbHBhcmVuOw0KLSAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHA7DQotICAgICAgICAgICAgY2FzZSAnKSc6DQotICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS3JwYXJlbjsNCi0gICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQotICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgIGNhc2UgJ1snOg0KLSAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tsYnJhY2tldDsNCi0gICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQotICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgIGNhc2UgJ10nOg0KLSAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tyYnJhY2tldDsNCi0gICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQotICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgIGNhc2UgJyYnOg0KLSAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LYW5kOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICBjYXNlICd8JzoNCi0gICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQotICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS29yOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICBjYXNlICcrJzoNCi0gICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQotICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS3BsdXM7DQotICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgIGNhc2UgJy0nOg0KLSAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbWludXM7DQotICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgIGNhc2UgJyonOg0KLSAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbXVsOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICBjYXNlICcvJzoNCi0gICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQotICAgICAgICAgICAgICAgIGlmIChYRkFfRk1EQ2hhcjo6aXNBdmFsaWQobV9wdHIpKSB7DQotICAgICAgICAgICAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcvJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVGVtcCA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudChtX3B0ciwgcFRlbXApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcHRyID0gcFRlbXA7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2RpdjsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQotICAgICAgICAgICAgICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICcuJzoNCi0gICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQotICAgICAgICAgICAgICAgIGlmIChYRkFfRk1EQ2hhcjo6aXNBdmFsaWQobV9wdHIpKSB7DQotICAgICAgICAgICAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcuJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2RvdGRvdDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyonKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZG90c3RhcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyMnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZG90c2NyZWFtOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnOScgJiYgY2ggPj0gJzAnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbnVtYmVyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVGVtcCA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmRlYyhtX3B0cik7DQotICAgICAgICAgICAgICAgICAgICAgICAgaVJldCA9IE51bWJlcihwLCBtX3B0ciwgcFRlbXApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcHRyID0gcFRlbXA7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IoRk1FUlJfQkFEX1NVRkZJWF9OVU1CRVIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZG90Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSAweDA5Og0KLSAgICAgICAgICAgIGNhc2UgMHgwQjoNCi0gICAgICAgICAgICBjYXNlIDB4MEM6DQotICAgICAgICAgICAgY2FzZSAweDIwOg0KLSAgICAgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBUZW1wID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGlSZXQgPSBJZGVudGlmaWVycyhwLCBtX3B0ciwgcFRlbXApOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wdHIgPSBwVGVtcDsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpUmV0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwLT5tX3R5cGUgPSBJc0tleXdvcmQocC0+bV93c3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gcDsNCi0gICAgICAgIH0NCi0gICAgfQ0KKyAgfQ0KIH0NCi1GWF9EV09SRCBDWEZBX0ZNTGV4ZXI6Ok51bWJlcihDWEZBX0ZNVG9rZW4gKnQsIGNvbnN0IEZYX1dDSEFSKiBwLCBjb25zdCBGWF9XQ0hBUiogJnBFbmQpDQotew0KLSAgICBGWF9ET1VCTEUgbnVtYmVyID0gMDsNCi0gICAgaWYgKFhGQV9GTURDaGFyOjpzdHJpbmcybnVtYmVyKHAsICZudW1iZXIsIHBFbmQpKSB7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfQ0KLSAgICBpZiAocEVuZCAmJiBYRkFfRk1EQ2hhcjo6aXNBbHBoYShwRW5kKSkgew0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0NCi0gICAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHAsIChwRW5kIC0gcCkpOw0KLSAgICByZXR1cm4gMDsNCitGWF9EV09SRCBDWEZBX0ZNTGV4ZXI6Ok51bWJlcihDWEZBX0ZNVG9rZW4qIHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqJiBwRW5kKSB7DQorICBGWF9ET1VCTEUgbnVtYmVyID0gMDsNCisgIGlmIChYRkFfRk1EQ2hhcjo6c3RyaW5nMm51bWJlcihwLCAmbnVtYmVyLCBwRW5kKSkgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIGlmIChwRW5kICYmIFhGQV9GTURDaGFyOjppc0FscGhhKHBFbmQpKSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHAsIChwRW5kIC0gcCkpOw0KKyAgcmV0dXJuIDA7DQogfQ0KLUZYX0RXT1JEIENYRkFfRk1MZXhlcjo6U3RyaW5nKENYRkFfRk1Ub2tlbiAqdCwgY29uc3QgRlhfV0NIQVIqIHAsIGNvbnN0IEZYX1dDSEFSKiAmcEVuZCkNCi17DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBwOw0KLSAgICB1aW50MTZfdCBjaCA9IDA7DQotICAgIFhGQV9GTURDaGFyOjppbmMocCk7DQotICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCi0gICAgd2hpbGUgKGNoKSB7DQotICAgICAgICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChwKSkgew0KLSAgICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCi0gICAgICAgICAgICBwRW5kID0gcDsNCi0gICAgICAgICAgICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocFN0YXJ0LCAocEVuZCAtIHBTdGFydCkpOw0KLSAgICAgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCi0gICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChjaCA9PSAnIicpIHsNCi0gICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KLSAgICAgICAgICAgIGlmICghWEZBX0ZNRENoYXI6OmlzQXZhbGlkKHApKSB7DQotICAgICAgICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCi0gICAgICAgICAgICAgICAgcEVuZCA9IHA7DQotICAgICAgICAgICAgICAgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQotICAgICAgICAgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCi0gICAgICAgICAgICBpZiAoY2ggPT0gJyInKSB7DQotICAgICAgICAgICAgICAgIGdvdG8gTkVYVDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotTkVYVDoNCi0gICAgICAgIFhGQV9GTURDaGFyOjppbmMocCk7DQotICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQotICAgIH0NCi0gICAgcEVuZCA9IHA7DQotICAgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQotICAgIHJldHVybiAwOw0KLX0NCi1GWF9EV09SRCBDWEZBX0ZNTGV4ZXI6OklkZW50aWZpZXJzKENYRkFfRk1Ub2tlbiAqdCwgY29uc3QgRlhfV0NIQVIqIHAsIGNvbnN0IEZYX1dDSEFSKiAmcEVuZCkNCi17DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBwOw0KLSAgICB1aW50MTZfdCBjaCA9IDA7DQotICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCi0gICAgWEZBX0ZNRENoYXI6OmluYyhwKTsNCitGWF9EV09SRCBDWEZBX0ZNTGV4ZXI6OlN0cmluZyhDWEZBX0ZNVG9rZW4qIHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqJiBwRW5kKSB7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gcDsNCisgIHVpbnQxNl90IGNoID0gMDsNCisgIFhGQV9GTURDaGFyOjppbmMocCk7DQorICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQorICB3aGlsZSAoY2gpIHsNCiAgICAgaWYgKCFYRkFfRk1EQ2hhcjo6aXNBdmFsaWQocCkpIHsNCisgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQorICAgICAgcEVuZCA9IHA7DQorICAgICAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHBTdGFydCwgKHBFbmQgLSBwU3RhcnQpKTsNCisgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgICAgaWYgKGNoID09ICciJykgew0KKyAgICAgIFhGQV9GTURDaGFyOjppbmMocCk7DQorICAgICAgaWYgKCFYRkFfRk1EQ2hhcjo6aXNBdmFsaWQocCkpIHsNCisgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCiAgICAgICAgIHBFbmQgPSBwOw0KICAgICAgICAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHBTdGFydCwgKHBFbmQgLSBwU3RhcnQpKTsNCiAgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCiAgICAgICAgIHJldHVybiAxOw0KKyAgICAgIH0NCisgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQorICAgICAgaWYgKGNoID09ICciJykgew0KKyAgICAgICAgZ290byBORVhUOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQogICAgIH0NCi0gICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KHApOw0KLSAgICB3aGlsZSAoY2gpIHsNCi0gICAgICAgIGlmICghWEZBX0ZNRENoYXI6OmlzQXZhbGlkKHApKSB7DQotICAgICAgICAgICAgcEVuZCA9IHA7DQotICAgICAgICAgICAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHBTdGFydCwgKHBFbmQgLSBwU3RhcnQpKTsNCi0gICAgICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQotICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICB9DQotICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQotICAgICAgICBpZiAoWEZBX0ZNRENoYXI6OmlzVW5pY29kZUFscGhhKGNoKSkgew0KLSAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMocCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBFbmQgPSBwOw0KLSAgICAgICAgICAgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcEVuZCA9IHA7DQotICAgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQotICAgIHJldHVybiAwOw0KLX0NCi12b2lkIENYRkFfRk1MZXhlcjo6Q29tbWVudCggY29uc3QgRlhfV0NIQVIqIHAsIGNvbnN0IEZYX1dDSEFSKiAmcEVuZCApDQotew0KLSAgICB1bnNpZ25lZCBjaCA9IDA7DQorICBORVhUOg0KICAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQotICAgIHdoaWxlIChjaCkgew0KLSAgICAgICAgaWYgKGNoID09IDB4MEQpIHsNCi0gICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KLSAgICAgICAgICAgIHBFbmQgPSBwOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChjaCA9PSAweDBBKSB7DQotICAgICAgICAgICAgKyttX3VDdXJyZW50TGluZTsNCi0gICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KLSAgICAgICAgICAgIHBFbmQgPSBwOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIFhGQV9GTURDaGFyOjppbmMocCk7DQotICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQotICAgIH0NCisgIH0NCisgIHBFbmQgPSBwOw0KKyAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHBTdGFydCwgKHBFbmQgLSBwU3RhcnQpKTsNCisgIHJldHVybiAwOw0KK30NCitGWF9EV09SRCBDWEZBX0ZNTGV4ZXI6OklkZW50aWZpZXJzKENYRkFfRk1Ub2tlbiogdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqJiBwRW5kKSB7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gcDsNCisgIHVpbnQxNl90IGNoID0gMDsNCisgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCisgIFhGQV9GTURDaGFyOjppbmMocCk7DQorICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChwKSkgew0KICAgICBwRW5kID0gcDsNCi19DQotWEZBX0ZNX1RPS0VOIENYRkFfRk1MZXhlcjo6SXNLZXl3b3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gc3RyLkdldExlbmd0aCgpOw0KLSAgICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHN0ci5HZXRQdHIoKSwgaUxlbmd0aCwgVFJVRSk7DQotICAgIGludDMyX3QgaVN0YXJ0ID0gS0VZV09SRF9TVEFSVCwgaUVuZCA9IEtFWVdPUkRfRU5EOw0KLSAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICBYRkFfRk1LZXl3b3JkIGtleXdvcmQ7DQotICAgIGRvIHsNCi0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAga2V5d29yZCA9IGtleVdvcmRzW2lNaWRdOw0KLSAgICAgICAgaWYgKHVIYXNoID09IGtleXdvcmQubV91SGFzaCkgew0KLSAgICAgICAgICAgIHJldHVybiBrZXl3b3JkLm1fdHlwZTsNCi0gICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBrZXl3b3JkLm1fdUhhc2gpIHsNCi0gICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQotICAgIHJldHVybiBUT0tpZGVudGlmaWVyOw0KLX0NCi1DWEZBX0ZNTGV4ZXI6On5DWEZBX0ZNTGV4ZXIoKQ0KLXsNCi0gICAgbV9wU2NyaXB0ID0gMDsNCi0gICAgbV9wdHIgPSBtX3BTY3JpcHQ7DQotICAgIGlmIChtX3BUb2tlbikgew0KLSAgICAgICAgQ1hGQV9GTVRva2VuICp0MSA9IG1fcFRva2VuOw0KLSAgICAgICAgQ1hGQV9GTVRva2VuICp0MiA9IHQxLT5tX3BOZXh0Ow0KLSAgICAgICAgd2hpbGUgKHQyKSB7DQotICAgICAgICAgICAgZGVsZXRlIHQxOw0KLSAgICAgICAgICAgIHQxID0gdDI7DQotICAgICAgICAgICAgdDIgPSB0Mi0+bV9wTmV4dDsNCi0gICAgICAgIH0NCi0gICAgICAgIGRlbGV0ZSBtX3BUb2tlbjsNCi0gICAgICAgIG1fcFRva2VuID0gMDsNCisgICAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHBTdGFydCwgKHBFbmQgLSBwU3RhcnQpKTsNCisgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCisgIHdoaWxlIChjaCkgew0KKyAgICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChwKSkgew0KKyAgICAgIHBFbmQgPSBwOw0KKyAgICAgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQorICAgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICAgIHJldHVybiAxOw0KICAgICB9DQotICAgIG1fcEVycm9ySW5mbyA9IDA7DQotfQ0KLXZvaWQgQ1hGQV9GTUxleGVyOjpFcnJvcihYRkFfRk1fRVJSTVNHIG1zZywgLi4uKQ0KLXsNCi0gICAgbV9wRXJyb3JJbmZvLT5saW5lbnVtID0gbV91Q3VycmVudExpbmU7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBscE1lc3NhZ2VJbmZvID0gWEZBX0ZNX0Vycm9yTXNnKG1zZyk7DQotICAgIHZhX2xpc3QgYXA7DQotICAgIHZhX3N0YXJ0KGFwLCBtc2cpOw0KLSAgICBtX3BFcnJvckluZm8tPm1lc3NhZ2UuRm9ybWF0VihscE1lc3NhZ2VJbmZvLCBhcCk7DQotICAgIHZhX2VuZChhcCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GTUxleGVyOjpIYXNFcnJvcigpIGNvbnN0DQotew0KLSAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQorICAgIGlmIChYRkFfRk1EQ2hhcjo6aXNVbmljb2RlQWxwaGEoY2gpKSB7DQorICAgICAgWEZBX0ZNRENoYXI6OmluYyhwKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwRW5kID0gcDsNCisgICAgICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocFN0YXJ0LCAocEVuZCAtIHBTdGFydCkpOw0KKyAgICAgIHJldHVybiAwOw0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcEVuZCA9IHA7DQorICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocFN0YXJ0LCAocEVuZCAtIHBTdGFydCkpOw0KKyAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgQ1hGQV9GTUxleGVyOjpDb21tZW50KGNvbnN0IEZYX1dDSEFSKiBwLCBjb25zdCBGWF9XQ0hBUiomIHBFbmQpIHsNCisgIHVuc2lnbmVkIGNoID0gMDsNCisgIFhGQV9GTURDaGFyOjppbmMocCk7DQorICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQorICB3aGlsZSAoY2gpIHsNCisgICAgaWYgKGNoID09IDB4MEQpIHsNCisgICAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KKyAgICAgIHBFbmQgPSBwOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoY2ggPT0gMHgwQSkgew0KKyAgICAgICsrbV91Q3VycmVudExpbmU7DQorICAgICAgWEZBX0ZNRENoYXI6OmluYyhwKTsNCisgICAgICBwRW5kID0gcDsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgWEZBX0ZNRENoYXI6OmluYyhwKTsNCisgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KHApOw0KKyAgfQ0KKyAgcEVuZCA9IHA7DQorfQ0KK1hGQV9GTV9UT0tFTiBDWEZBX0ZNTGV4ZXI6OklzS2V5d29yZChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gc3RyLkdldExlbmd0aCgpOw0KKyAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhzdHIuR2V0UHRyKCksIGlMZW5ndGgsIFRSVUUpOw0KKyAgaW50MzJfdCBpU3RhcnQgPSBLRVlXT1JEX1NUQVJULCBpRW5kID0gS0VZV09SRF9FTkQ7DQorICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgWEZBX0ZNS2V5d29yZCBrZXl3b3JkOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAga2V5d29yZCA9IGtleVdvcmRzW2lNaWRdOw0KKyAgICBpZiAodUhhc2ggPT0ga2V5d29yZC5tX3VIYXNoKSB7DQorICAgICAgcmV0dXJuIGtleXdvcmQubV90eXBlOw0KKyAgICB9IGVsc2UgaWYgKHVIYXNoIDwga2V5d29yZC5tX3VIYXNoKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gVE9LaWRlbnRpZmllcjsNCit9DQorQ1hGQV9GTUxleGVyOjp+Q1hGQV9GTUxleGVyKCkgew0KKyAgbV9wU2NyaXB0ID0gMDsNCisgIG1fcHRyID0gbV9wU2NyaXB0Ow0KKyAgaWYgKG1fcFRva2VuKSB7DQorICAgIENYRkFfRk1Ub2tlbiogdDEgPSBtX3BUb2tlbjsNCisgICAgQ1hGQV9GTVRva2VuKiB0MiA9IHQxLT5tX3BOZXh0Ow0KKyAgICB3aGlsZSAodDIpIHsNCisgICAgICBkZWxldGUgdDE7DQorICAgICAgdDEgPSB0MjsNCisgICAgICB0MiA9IHQyLT5tX3BOZXh0Ow0KKyAgICB9DQorICAgIGRlbGV0ZSBtX3BUb2tlbjsNCisgICAgbV9wVG9rZW4gPSAwOw0KKyAgfQ0KKyAgbV9wRXJyb3JJbmZvID0gMDsNCit9DQordm9pZCBDWEZBX0ZNTGV4ZXI6OkVycm9yKFhGQV9GTV9FUlJNU0cgbXNnLCAuLi4pIHsNCisgIG1fcEVycm9ySW5mby0+bGluZW51bSA9IG1fdUN1cnJlbnRMaW5lOw0KKyAgY29uc3QgRlhfV0NIQVIqIGxwTWVzc2FnZUluZm8gPSBYRkFfRk1fRXJyb3JNc2cobXNnKTsNCisgIHZhX2xpc3QgYXA7DQorICB2YV9zdGFydChhcCwgbXNnKTsNCisgIG1fcEVycm9ySW5mby0+bWVzc2FnZS5Gb3JtYXRWKGxwTWVzc2FnZUluZm8sIGFwKTsNCisgIHZhX2VuZChhcCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTUxleGVyOjpIYXNFcnJvcigpIGNvbnN0IHsNCisgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9sZXhlci5oIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfbGV4ZXIuaAppbmRleCBhM2FiNjI1Li44ZTk0MzgwIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9sZXhlci5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2xleGVyLmgKQEAgLTcsNzYgKzcsMTIyIEBACiAjaWZuZGVmIF9YRkFfRk1fTEVYRVJfSA0KICNkZWZpbmUgX1hGQV9GTV9MRVhFUl9IDQogZW51bSBYRkFfRk1fVE9LRU4gew0KLSAgICBUT0thbmQsIFRPS2xwYXJlbiwgVE9LcnBhcmVuLCBUT0ttdWwsIFRPS3BsdXMsIFRPS2NvbW1hLCBUT0ttaW51cywgVE9LZG90LCBUT0tkaXYsIFRPS2x0LA0KLSAgICBUT0thc3NpZ24sIFRPS2d0LCBUT0tsYnJhY2tldCwgVE9LcmJyYWNrZXQsIFRPS29yLCBUT0tkb3RzY3JlYW0sIFRPS2RvdHN0YXIsIFRPS2RvdGRvdCwNCi0gICAgVE9LbGUsIFRPS25lLCBUT0tlcSwgVE9LZ2UsDQotICAgIFRPS2RvLCBUT0trc2VxLCBUT0trc2dlLCBUT0trc2d0LCBUT0tpZiwgVE9LaW4sIFRPS2tzbGUsIFRPS2tzbHQsIFRPS2tzbmUsIFRPS2tzb3IsIFRPS251bGwsDQotICAgIFRPS2JyZWFrLCBUT0trc2FuZCwgVE9LZW5kLCBUT0tlb2YsIFRPS2ZvciwgVE9LbmFuLCBUT0trc25vdCwgVE9LdmFyLCBUT0t0aGVuLCBUT0tlbHNlLCBUT0tleGl0LA0KLSAgICBUT0tkb3dudG8sIFRPS3JldHVybiwgVE9LaW5maW5pdHksIFRPS2VuZHdoaWxlLCBUT0tmb3JlYWNoLCBUT0tlbmRmdW5jLCBUT0tlbHNlaWYsIFRPS3doaWxlLA0KLSAgICBUT0tlbmRmb3IsIFRPS3Rocm93LCBUT0tzdGVwLCBUT0t1cHRvLCBUT0tjb250aW51ZSwgVE9LZnVuYywgVE9LZW5kaWYsDQotICAgIFRPS3N0YXIsDQotICAgIFRPS2lkZW50aWZpZXIsIFRPS3VuZGVyc2NvcmUsIFRPS2RvbGxhciwgVE9LZXhjbGFtYXRpb24sDQotICAgIFRPS2NhbGwsDQotICAgIFRPS3N0cmluZywNCi0gICAgVE9LbnVtYmVyLA0KLSAgICBUT0tyZXNlcnZlcg0KKyAgVE9LYW5kLA0KKyAgVE9LbHBhcmVuLA0KKyAgVE9LcnBhcmVuLA0KKyAgVE9LbXVsLA0KKyAgVE9LcGx1cywNCisgIFRPS2NvbW1hLA0KKyAgVE9LbWludXMsDQorICBUT0tkb3QsDQorICBUT0tkaXYsDQorICBUT0tsdCwNCisgIFRPS2Fzc2lnbiwNCisgIFRPS2d0LA0KKyAgVE9LbGJyYWNrZXQsDQorICBUT0tyYnJhY2tldCwNCisgIFRPS29yLA0KKyAgVE9LZG90c2NyZWFtLA0KKyAgVE9LZG90c3RhciwNCisgIFRPS2RvdGRvdCwNCisgIFRPS2xlLA0KKyAgVE9LbmUsDQorICBUT0tlcSwNCisgIFRPS2dlLA0KKyAgVE9LZG8sDQorICBUT0trc2VxLA0KKyAgVE9La3NnZSwNCisgIFRPS2tzZ3QsDQorICBUT0tpZiwNCisgIFRPS2luLA0KKyAgVE9La3NsZSwNCisgIFRPS2tzbHQsDQorICBUT0trc25lLA0KKyAgVE9La3NvciwNCisgIFRPS251bGwsDQorICBUT0ticmVhaywNCisgIFRPS2tzYW5kLA0KKyAgVE9LZW5kLA0KKyAgVE9LZW9mLA0KKyAgVE9LZm9yLA0KKyAgVE9LbmFuLA0KKyAgVE9La3Nub3QsDQorICBUT0t2YXIsDQorICBUT0t0aGVuLA0KKyAgVE9LZWxzZSwNCisgIFRPS2V4aXQsDQorICBUT0tkb3dudG8sDQorICBUT0tyZXR1cm4sDQorICBUT0tpbmZpbml0eSwNCisgIFRPS2VuZHdoaWxlLA0KKyAgVE9LZm9yZWFjaCwNCisgIFRPS2VuZGZ1bmMsDQorICBUT0tlbHNlaWYsDQorICBUT0t3aGlsZSwNCisgIFRPS2VuZGZvciwNCisgIFRPS3Rocm93LA0KKyAgVE9Lc3RlcCwNCisgIFRPS3VwdG8sDQorICBUT0tjb250aW51ZSwNCisgIFRPS2Z1bmMsDQorICBUT0tlbmRpZiwNCisgIFRPS3N0YXIsDQorICBUT0tpZGVudGlmaWVyLA0KKyAgVE9LdW5kZXJzY29yZSwNCisgIFRPS2RvbGxhciwNCisgIFRPS2V4Y2xhbWF0aW9uLA0KKyAgVE9LY2FsbCwNCisgIFRPS3N0cmluZywNCisgIFRPS251bWJlciwNCisgIFRPS3Jlc2VydmVyDQogfTsNCiBzdHJ1Y3QgWEZBX0ZNS2V5d29yZCB7DQotICAgIFhGQV9GTV9UT0tFTgltX3R5cGU7DQotICAgIHVpbnQzMl90CQltX3VIYXNoOw0KLSAgICBjb25zdCBGWF9XQ0hBUioJCW1fa2V3b3JkOw0KKyAgWEZBX0ZNX1RPS0VOIG1fdHlwZTsNCisgIHVpbnQzMl90IG1fdUhhc2g7DQorICBjb25zdCBGWF9XQ0hBUiogbV9rZXdvcmQ7DQogfTsNCiBjb25zdCBGWF9XQ0hBUiogWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhYRkFfRk1fVE9LRU4gb3ApOw0KLWNsYXNzIENYRkFfRk1Ub2tlbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1Ub2tlbigpOw0KLSAgICBDWEZBX0ZNVG9rZW4oRlhfRFdPUkQgdUxpbmVOdW0pOw0KLSAgICB+Q1hGQV9GTVRva2VuKCk7DQotICAgIENGWF9XaWRlU3RyaW5nQyBtX3dzdHJpbmc7DQotICAgIFhGQV9GTV9UT0tFTgltX3R5cGU7DQotICAgIEZYX0RXT1JECQltX3VMaW5lbnVtOw0KLSAgICBDWEZBX0ZNVG9rZW4qCW1fcE5leHQ7DQorY2xhc3MgQ1hGQV9GTVRva2VuIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVRva2VuKCk7DQorICBDWEZBX0ZNVG9rZW4oRlhfRFdPUkQgdUxpbmVOdW0pOw0KKyAgfkNYRkFfRk1Ub2tlbigpOw0KKyAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3N0cmluZzsNCisgIFhGQV9GTV9UT0tFTiBtX3R5cGU7DQorICBGWF9EV09SRCBtX3VMaW5lbnVtOw0KKyAgQ1hGQV9GTVRva2VuKiBtX3BOZXh0Ow0KIH07DQotY2xhc3MgQ1hGQV9GTUxleGVyDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTUxleGVyKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb3JtY2FsYywgQ1hGQV9GTUVycm9ySW5mbyAqcEVycm9ySW5mbyk7DQotICAgIH5DWEZBX0ZNTGV4ZXIoKTsNCi0gICAgQ1hGQV9GTVRva2VuKglOZXh0VG9rZW4oKTsNCi0gICAgRlhfRFdPUkQJCU51bWJlcihDWEZBX0ZNVG9rZW4gKnQsIGNvbnN0IEZYX1dDSEFSKiBwLCAgY29uc3QgRlhfV0NIQVIqICZwRW5kKTsNCi0gICAgRlhfRFdPUkQJCVN0cmluZyhDWEZBX0ZNVG9rZW4gKnQsIGNvbnN0IEZYX1dDSEFSKiBwLCBjb25zdCBGWF9XQ0hBUiogJnBFbmQpOw0KLSAgICBGWF9EV09SRAkJSWRlbnRpZmllcnMoQ1hGQV9GTVRva2VuICp0LCBjb25zdCBGWF9XQ0hBUiogcCwgY29uc3QgRlhfV0NIQVIqICZwRW5kKTsNCi0gICAgdm9pZAkJCUNvbW1lbnQoY29uc3QgRlhfV0NIQVIqIHAsIGNvbnN0IEZYX1dDSEFSKiAmcEVuZCk7DQotICAgIFhGQV9GTV9UT0tFTglJc0tleXdvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwKTsNCi0gICAgdm9pZAkJCVNldEN1cnJlbnRMaW5lKEZYX0RXT1JEIGxpbmUpDQotICAgIHsNCi0gICAgICAgIG1fdUN1cnJlbnRMaW5lID0gbGluZTsNCitjbGFzcyBDWEZBX0ZNTGV4ZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTGV4ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjLCBDWEZBX0ZNRXJyb3JJbmZvKiBwRXJyb3JJbmZvKTsNCisgIH5DWEZBX0ZNTGV4ZXIoKTsNCisgIENYRkFfRk1Ub2tlbiogTmV4dFRva2VuKCk7DQorICBGWF9EV09SRCBOdW1iZXIoQ1hGQV9GTVRva2VuKiB0LCBjb25zdCBGWF9XQ0hBUiogcCwgY29uc3QgRlhfV0NIQVIqJiBwRW5kKTsNCisgIEZYX0RXT1JEIFN0cmluZyhDWEZBX0ZNVG9rZW4qIHQsIGNvbnN0IEZYX1dDSEFSKiBwLCBjb25zdCBGWF9XQ0hBUiomIHBFbmQpOw0KKyAgRlhfRFdPUkQgSWRlbnRpZmllcnMoQ1hGQV9GTVRva2VuKiB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHAsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiomIHBFbmQpOw0KKyAgdm9pZCBDb21tZW50KGNvbnN0IEZYX1dDSEFSKiBwLCBjb25zdCBGWF9XQ0hBUiomIHBFbmQpOw0KKyAgWEZBX0ZNX1RPS0VOIElzS2V5d29yZChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHApOw0KKyAgdm9pZCBTZXRDdXJyZW50TGluZShGWF9EV09SRCBsaW5lKSB7IG1fdUN1cnJlbnRMaW5lID0gbGluZTsgfQ0KKyAgdm9pZCBTZXRUb2tlbihDWEZBX0ZNVG9rZW4qIHBUb2tlbikgew0KKyAgICBpZiAobV9wVG9rZW4pIHsNCisgICAgICBkZWxldGUgbV9wVG9rZW47DQogICAgIH0NCi0gICAgdm9pZAkJCVNldFRva2VuKENYRkFfRk1Ub2tlbiAqcFRva2VuKQ0KLSAgICB7DQotICAgICAgICBpZiAobV9wVG9rZW4pIHsNCi0gICAgICAgICAgICBkZWxldGUgbV9wVG9rZW47DQotICAgICAgICB9DQotICAgICAgICBtX3BUb2tlbiA9IHBUb2tlbjsNCi0gICAgfQ0KLSAgICBjb25zdCBGWF9XQ0hBUioJCVNhdmVQb3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wdHI7DQotICAgIH0NCi0gICAgdm9pZAkJCVJlc3RvcmVQb3MoY29uc3QgRlhfV0NIQVIqIHBQb3MpDQotICAgIHsNCi0gICAgICAgIG1fcHRyID0gcFBvczsNCi0gICAgfQ0KLSAgICB2b2lkCQkJRXJyb3IoWEZBX0ZNX0VSUk1TRyBtc2csIC4uLik7DQotICAgIEZYX0JPT0wJCQlIYXNFcnJvcigpIGNvbnN0Ow0KLXByb3RlY3RlZDoNCi0gICAgQ1hGQV9GTVRva2VuKglTY2FuKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKgkJbV9wU2NyaXB0Ow0KLSAgICBjb25zdCBGWF9XQ0hBUioJCW1fcHRyOw0KLSAgICBGWF9TVFJTSVpFCQltX3VMZW5ndGg7DQotICAgIEZYX0RXT1JECQltX3VDdXJyZW50TGluZTsNCi0gICAgQ1hGQV9GTVRva2VuKgltX3BUb2tlbjsNCi0gICAgQ1hGQV9GTUVycm9ySW5mbyogbV9wRXJyb3JJbmZvOw0KKyAgICBtX3BUb2tlbiA9IHBUb2tlbjsNCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiBTYXZlUG9zKCkgeyByZXR1cm4gbV9wdHI7IH0NCisgIHZvaWQgUmVzdG9yZVBvcyhjb25zdCBGWF9XQ0hBUiogcFBvcykgeyBtX3B0ciA9IHBQb3M7IH0NCisgIHZvaWQgRXJyb3IoWEZBX0ZNX0VSUk1TRyBtc2csIC4uLik7DQorICBGWF9CT09MIEhhc0Vycm9yKCkgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIENYRkFfRk1Ub2tlbiogU2NhbigpOw0KKyAgY29uc3QgRlhfV0NIQVIqIG1fcFNjcmlwdDsNCisgIGNvbnN0IEZYX1dDSEFSKiBtX3B0cjsNCisgIEZYX1NUUlNJWkUgbV91TGVuZ3RoOw0KKyAgRlhfRFdPUkQgbV91Q3VycmVudExpbmU7DQorICBDWEZBX0ZNVG9rZW4qIG1fcFRva2VuOw0KKyAgQ1hGQV9GTUVycm9ySW5mbyogbV9wRXJyb3JJbmZvOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfcHJvZ3JhbS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9wcm9ncmFtLmNwcAppbmRleCAwNmQ4ZTEwLi5jZDgzYzgyIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9wcm9ncmFtLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9wcm9ncmFtLmNwcApAQCAtNSw0NiArNSw0MCBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCiANCiAjaW5jbHVkZSAieGZhX2ZtMmpzLmgiDQotQ1hGQV9GTVByb2dyYW06OkNYRkFfRk1Qcm9ncmFtKCkNCi0gICAgOiBtX2dsb2JhbEZ1bmN0aW9uKDApDQotew0KK0NYRkFfRk1Qcm9ncmFtOjpDWEZBX0ZNUHJvZ3JhbSgpIDogbV9nbG9iYWxGdW5jdGlvbigwKSB7fQ0KK0NYRkFfRk1Qcm9ncmFtOjp+Q1hGQV9GTVByb2dyYW0oKSB7DQorICBpZiAobV9nbG9iYWxGdW5jdGlvbiAhPSAwKSB7DQorICAgIGRlbGV0ZSBtX2dsb2JhbEZ1bmN0aW9uOw0KKyAgICBtX2dsb2JhbEZ1bmN0aW9uID0gMDsNCisgIH0NCiB9DQotQ1hGQV9GTVByb2dyYW06On5DWEZBX0ZNUHJvZ3JhbSgpDQotew0KLSAgICBpZiAobV9nbG9iYWxGdW5jdGlvbiAhPSAwKSB7DQotICAgICAgICBkZWxldGUgbV9nbG9iYWxGdW5jdGlvbjsNCi0gICAgICAgIG1fZ2xvYmFsRnVuY3Rpb24gPSAwOw0KK2ludDMyX3QgQ1hGQV9GTVByb2dyYW06OkluaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjKSB7DQorICByZXR1cm4gbV9wYXJzZS5Jbml0KHdzRm9ybWNhbGMsICZtX3BFcnJvckluZm8pOw0KK30NCitpbnQzMl90IENYRkFfRk1Qcm9ncmFtOjpQYXJzZVByb2dyYW0oKSB7DQorICBDRlhfUHRyQXJyYXkqIGV4cHJlc3Npb25zID0gMDsNCisgIG1fcGFyc2UuTmV4dFRva2VuKCk7DQorICBpZiAoIW1fcEVycm9ySW5mby5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBleHByZXNzaW9ucyA9IG1fcGFyc2UuUGFyc2VUb3BFeHByZXNzaW9uKCk7DQorICBpZiAoIW1fcEVycm9ySW5mby5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiogZSA9IDA7DQorICAgIGZvciAoaW50MzJfdCB1ID0gMDsgdSA8IGV4cHJlc3Npb25zLT5HZXRTaXplKCk7ICsrdSkgew0KKyAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24qKWV4cHJlc3Npb25zLT5HZXRBdCh1KTsNCisgICAgICBpZiAoZSkgew0KKyAgICAgICAgZGVsZXRlIGU7DQorICAgICAgfQ0KICAgICB9DQorICAgIGRlbGV0ZSBleHByZXNzaW9uczsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgbV9nbG9iYWxGdW5jdGlvbiA9DQorICAgICAgRlhfTkVXIENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24oMSwgMSwgRlhfV1NUUkMoTCIiKSwgMCwgZXhwcmVzc2lvbnMpOw0KKyAgcmV0dXJuIDA7DQogfQ0KLWludDMyX3QgQ1hGQV9GTVByb2dyYW06OkluaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjKQ0KLXsNCi0gICAgcmV0dXJuIG1fcGFyc2UuSW5pdCh3c0Zvcm1jYWxjLCAmbV9wRXJyb3JJbmZvKTsNCi19DQotaW50MzJfdCBDWEZBX0ZNUHJvZ3JhbTo6UGFyc2VQcm9ncmFtKCkNCi17DQotICAgIENGWF9QdHJBcnJheSAqIGV4cHJlc3Npb25zID0gMDsNCi0gICAgbV9wYXJzZS5OZXh0VG9rZW4oKTsNCi0gICAgaWYgKCFtX3BFcnJvckluZm8ubWVzc2FnZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBleHByZXNzaW9ucyA9IG1fcGFyc2UuUGFyc2VUb3BFeHByZXNzaW9uKCk7DQotICAgIGlmICghbV9wRXJyb3JJbmZvLm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQotICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiAqZSA9IDA7DQotICAgICAgICBmb3IgKGludDMyX3QgdSA9IDA7IHUgPCBleHByZXNzaW9ucy0+R2V0U2l6ZSgpOyArK3UpIHsNCi0gICAgICAgICAgICBlID0gKENYRkFfRk1FeHByZXNzaW9uICopZXhwcmVzc2lvbnMtPkdldEF0KHUpOw0KLSAgICAgICAgICAgIGlmIChlKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGRlbGV0ZSBleHByZXNzaW9uczsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBtX2dsb2JhbEZ1bmN0aW9uID0gRlhfTkVXIENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24oMSwgMSwgRlhfV1NUUkMoTCIiKSwgMCwgZXhwcmVzc2lvbnMpOw0KLSAgICByZXR1cm4gMDsNCi19DQotaW50MzJfdCBDWEZBX0ZNUHJvZ3JhbTo6VHJhbnNsYXRlUHJvZ3JhbShDRlhfV2lkZVRleHRCdWYgJndzSmF2YVNjcmlwdCkNCi17DQotICAgIG1fZ2xvYmFsRnVuY3Rpb24tPlRvSmF2YVNjcmlwdCh3c0phdmFTY3JpcHQpOw0KLSAgICB3c0phdmFTY3JpcHQuQXBwZW5kQ2hhcigwKTsNCi0gICAgcmV0dXJuIDA7DQoraW50MzJfdCBDWEZBX0ZNUHJvZ3JhbTo6VHJhbnNsYXRlUHJvZ3JhbShDRlhfV2lkZVRleHRCdWYmIHdzSmF2YVNjcmlwdCkgew0KKyAgbV9nbG9iYWxGdW5jdGlvbi0+VG9KYXZhU2NyaXB0KHdzSmF2YVNjcmlwdCk7DQorICB3c0phdmFTY3JpcHQuQXBwZW5kQ2hhcigwKTsNCisgIHJldHVybiAwOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9wcm9ncmFtLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9wcm9ncmFtLmgKaW5kZXggMmU4MTQ5ZS4uN2RmYTcyNyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfcHJvZ3JhbS5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3Byb2dyYW0uaApAQCAtNiwyMSArNiwxOCBAQAogDQogI2lmbmRlZiBfWEZBX0ZNX1BST0dSQU1fSA0KICNkZWZpbmUgX1hGQV9GTV9QUk9HUkFNX0gNCi1jbGFzcyBDWEZBX0ZNUHJvZ3JhbQ0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1Qcm9ncmFtKCk7DQotICAgIH5DWEZBX0ZNUHJvZ3JhbSgpOw0KLSAgICBpbnQzMl90IEluaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjKTsNCi0gICAgaW50MzJfdCBQYXJzZVByb2dyYW0oKTsNCi0gICAgaW50MzJfdCBUcmFuc2xhdGVQcm9ncmFtKENGWF9XaWRlVGV4dEJ1ZiAmd3NKYXZhU2NyaXB0KTsNCi0gICAgQ1hGQV9GTUVycm9ySW5mbyYgR2V0RXJyb3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wRXJyb3JJbmZvOw0KLSAgICB9DQotcHJpdmF0ZToNCi0gICAgQ1hGQV9GTUVycm9ySW5mbyBtX3BFcnJvckluZm87DQotICAgIENYRkFfRk1QYXJzZQltX3BhcnNlOw0KLSAgICBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uICptX2dsb2JhbEZ1bmN0aW9uOw0KK2NsYXNzIENYRkFfRk1Qcm9ncmFtIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVByb2dyYW0oKTsNCisgIH5DWEZBX0ZNUHJvZ3JhbSgpOw0KKyAgaW50MzJfdCBJbml0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb3JtY2FsYyk7DQorICBpbnQzMl90IFBhcnNlUHJvZ3JhbSgpOw0KKyAgaW50MzJfdCBUcmFuc2xhdGVQcm9ncmFtKENGWF9XaWRlVGV4dEJ1ZiYgd3NKYXZhU2NyaXB0KTsNCisgIENYRkFfRk1FcnJvckluZm8mIEdldEVycm9yKCkgeyByZXR1cm4gbV9wRXJyb3JJbmZvOyB9DQorDQorIHByaXZhdGU6DQorICBDWEZBX0ZNRXJyb3JJbmZvIG1fcEVycm9ySW5mbzsNCisgIENYRkFfRk1QYXJzZSBtX3BhcnNlOw0KKyAgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbiogbV9nbG9iYWxGdW5jdGlvbjsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb24uY3BwIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbi5jcHAKaW5kZXggY2QzOWNhYS4uZjEwMzY3MyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbi5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbi5jcHAKQEAgLTMyLDI2OSArMzIsMTkzIEBACiAgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5nZXRfZm1fanNvYmoiKSwNCiAgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5mbV92YXJfZmlsdGVyIiksDQogfTsNCi1DRlhfV2lkZVN0cmluZ0MgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhYRkFfRk1fU2ltcGxlRXhwcmVzc2lvblR5cGUgc2ltcGxlRXhwVHlwZSkNCi17DQotICAgIHJldHVybiBnc19scFN0ckV4cEZ1bmNOYW1lW3NpbXBsZUV4cFR5cGVdOw0KK0NGWF9XaWRlU3RyaW5nQyBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKA0KKyAgICBYRkFfRk1fU2ltcGxlRXhwcmVzc2lvblR5cGUgc2ltcGxlRXhwVHlwZSkgew0KKyAgcmV0dXJuIGdzX2xwU3RyRXhwRnVuY05hbWVbc2ltcGxlRXhwVHlwZV07DQogfQ0KIHN0YXRpYyBYRkFfRk1CdWlsZEluRnVuYyBidWlsZEluRnVuY3NbXSA9IHsNCi0gICAgezB4MDAwMWYxZjUsIEwiQXQifSwNCi0gICAgezB4MDAwMjBiOWMsIEwiRlYifSwNCi0gICAgezB4MDAwMjFhZWYsIEwiSWYifSwNCi0gICAgezB4MDAwMjNlZTYsIEwiUFYifSwNCi0gICAgezB4MDRiNWM5ZWUsIEwiRW5jb2RlIn0sDQotICAgIHsweDA4ZTk2Njg1LCBMIkRhdGVGbXQifSwNCi0gICAgezB4MDlmOTlkYjYsIEwiQWJzIn0sDQotICAgIHsweDA5ZjllNTgzLCBMIkFwciJ9LA0KLSAgICB7MHgwOWZhMDQzZSwgTCJBdmcifSwNCi0gICAgezB4MGE5NzgyYTAsIEwiR2V0In0sDQotICAgIHsweDBiMWIwOWRmLCBMIkxlbiJ9LA0KLSAgICB7MHgwYjM1NDNhNiwgTCJNYXgifSwNCi0gICAgezB4MGIzNTZjYTQsIEwiTWluIn0sDQotICAgIHsweDBiMzU4YjYwLCBMIk1vZCJ9LA0KLSAgICB7MHgwYjRmZGVkNCwgTCJOUFYifSwNCi0gICAgezB4MGI4NDZiZjEsIEwiUG10In0sDQotICAgIHsweDBiODQ5NGY5LCBMIlB1dCJ9LA0KLSAgICB7MHgwYmI4ZGY1ZCwgTCJSZWYifSwNCi0gICAgezB4MGJkMzdhOTksIEwiU3RyIn0sDQotICAgIHsweDBiZDM3ZmI1LCBMIlN1bSJ9LA0KLSAgICB7MHgxMDQ4NDY5YiwgTCJDdGVybSJ9LA0KLSAgICB7MHgxMWUwMzY2MCwgTCJFeGlzdHMifSwNCi0gICAgezB4MTI2MjM2ZTYsIEwiUG9zdCJ9LA0KLSAgICB7MHgxMjdjNjY2MSwgTCJQUG10In0sDQotICAgIHsweDE5M2FkZTNlLCBMIlJpZ2h0In0sDQotICAgIHsweDFlYzhhYjJjLCBMIlJhdGUifSwNCi0gICAgezB4MjBlNDc2ZGMsIEwiSXNvVGltZTJOdW0ifSwNCi0gICAgezB4MjNlYjY4MTYsIEwiVGltZUZtdCJ9LA0KLSAgICB7MHgyNGZiMTdiMCwgTCJMb2NhbERhdGVGbXQifSwNCi0gICAgezB4MjhkZWU2ZTksIEwiRm9ybWF0In0sDQotICAgIHsweDJkMDg5MGI4LCBMIlRlcm0ifSwNCi0gICAgezB4MmQ3MWIwMGYsIEwiVGltZSJ9LA0KLSAgICB7MHgyZjg5MGZiMSwgTCJOdW0yVGltZSJ9LA0KLSAgICB7MHgzNzY3NTExZCwgTCJDZWlsIn0sDQotICAgIHsweDNmZmQxOTQxLCBMIkxvY2FsVGltZUZtdCJ9LA0KLSAgICB7MHg0NDJmNjhjOCwgTCJSb3VuZCJ9LA0KLSAgICB7MHg0NmZkMTEyOCwgTCJFdmFsIn0sDQotICAgIHsweDRkNjI5NDQwLCBMIkRhdGUyTnVtIn0sDQotICAgIHsweDRkY2YyNWY4LCBMIkNvbmNhdCJ9LA0KLSAgICB7MHg0ZTAwMjU1ZCwgTCJVbml0VmFsdWUifSwNCi0gICAgezB4NTVhNWNjMjksIEwiTG93ZXIifSwNCi0gICAgezB4NWU0M2UwNGMsIEwiV29yZE51bSJ9LA0KLSAgICB7MHg2MjBjZTZiYSwgTCJJcG10In0sDQotICAgIHsweDZmNTQ0ZDQ5LCBMIkNvdW50In0sDQotICAgIHsweDdlMjQxMDEzLCBMIldpdGhpbiJ9LA0KLSAgICB7MHg5YjlhNmUyYiwgTCJJc29EYXRlMk51bSJ9LA0KLSAgICB7MHhiMmM5NDFjMiwgTCJVbml0VHlwZSJ9LA0KLSAgICB7MHhiNTk4YTFmNywgTCJVdWlkIn0sDQotICAgIHsweGJkZTlhYmRlLCBMIkRhdGUifSwNCi0gICAgezB4YzAwMTBiODAsIEwiTnVtMkRhdGUifSwNCi0gICAgezB4YzFmNjE0NGMsIEwiVXBwZXIifSwNCi0gICAgezB4YzQ0MDI4ZjcsIEwiT25lb2YifSwNCi0gICAgezB4YzYyYzFiMmMsIEwiU3BhY2UifSwNCi0gICAgezB4ZDBmZjUwZjksIEwiSGFzVmFsdWUifSwNCi0gICAgezB4ZDE1MzcwNDIsIEwiRmxvb3IifSwNCi0gICAgezB4ZDJhYzljZjEsIEwiVGltZTJOdW0ifSwNCi0gICAgezB4ZDkwN2FlZTUsIEwiTnVtMkdNVGltZSJ9LA0KLSAgICB7MHhkZjI0ZjdjNCwgTCJEZWNvZGUifSwNCi0gICAgezB4ZTI2NjQ4MDMsIEwiU3Vic3RyIn0sDQotICAgIHsweGUzZTdiNTI4LCBMIlN0dWZmIn0sDQotICAgIHsweGU2NzkyZDRlLCBMIlJ0cmltIn0sDQotICAgIHsweGU4YzIzZjViLCBMIlBhcnNlIn0sDQotICAgIHsweGVhMThkMTIxLCBMIkNob29zZSJ9LA0KLSAgICB7MHhlYmZlZjY5YywgTCJSZXBsYWNlIn0sDQotICAgIHsweGY1YWQ3ODJiLCBMIkxlZnQifSwNCi0gICAgezB4ZjdiYjIyNDgsIEwiTHRyaW0ifSwNCisgICAgezB4MDAwMWYxZjUsIEwiQXQifSwgICAgICAgICAgIHsweDAwMDIwYjljLCBMIkZWIn0sDQorICAgIHsweDAwMDIxYWVmLCBMIklmIn0sICAgICAgICAgICB7MHgwMDAyM2VlNiwgTCJQViJ9LA0KKyAgICB7MHgwNGI1YzllZSwgTCJFbmNvZGUifSwgICAgICAgezB4MDhlOTY2ODUsIEwiRGF0ZUZtdCJ9LA0KKyAgICB7MHgwOWY5OWRiNiwgTCJBYnMifSwgICAgICAgICAgezB4MDlmOWU1ODMsIEwiQXByIn0sDQorICAgIHsweDA5ZmEwNDNlLCBMIkF2ZyJ9LCAgICAgICAgICB7MHgwYTk3ODJhMCwgTCJHZXQifSwNCisgICAgezB4MGIxYjA5ZGYsIEwiTGVuIn0sICAgICAgICAgIHsweDBiMzU0M2E2LCBMIk1heCJ9LA0KKyAgICB7MHgwYjM1NmNhNCwgTCJNaW4ifSwgICAgICAgICAgezB4MGIzNThiNjAsIEwiTW9kIn0sDQorICAgIHsweDBiNGZkZWQ0LCBMIk5QViJ9LCAgICAgICAgICB7MHgwYjg0NmJmMSwgTCJQbXQifSwNCisgICAgezB4MGI4NDk0ZjksIEwiUHV0In0sICAgICAgICAgIHsweDBiYjhkZjVkLCBMIlJlZiJ9LA0KKyAgICB7MHgwYmQzN2E5OSwgTCJTdHIifSwgICAgICAgICAgezB4MGJkMzdmYjUsIEwiU3VtIn0sDQorICAgIHsweDEwNDg0NjliLCBMIkN0ZXJtIn0sICAgICAgICB7MHgxMWUwMzY2MCwgTCJFeGlzdHMifSwNCisgICAgezB4MTI2MjM2ZTYsIEwiUG9zdCJ9LCAgICAgICAgIHsweDEyN2M2NjYxLCBMIlBQbXQifSwNCisgICAgezB4MTkzYWRlM2UsIEwiUmlnaHQifSwgICAgICAgIHsweDFlYzhhYjJjLCBMIlJhdGUifSwNCisgICAgezB4MjBlNDc2ZGMsIEwiSXNvVGltZTJOdW0ifSwgIHsweDIzZWI2ODE2LCBMIlRpbWVGbXQifSwNCisgICAgezB4MjRmYjE3YjAsIEwiTG9jYWxEYXRlRm10In0sIHsweDI4ZGVlNmU5LCBMIkZvcm1hdCJ9LA0KKyAgICB7MHgyZDA4OTBiOCwgTCJUZXJtIn0sICAgICAgICAgezB4MmQ3MWIwMGYsIEwiVGltZSJ9LA0KKyAgICB7MHgyZjg5MGZiMSwgTCJOdW0yVGltZSJ9LCAgICAgezB4Mzc2NzUxMWQsIEwiQ2VpbCJ9LA0KKyAgICB7MHgzZmZkMTk0MSwgTCJMb2NhbFRpbWVGbXQifSwgezB4NDQyZjY4YzgsIEwiUm91bmQifSwNCisgICAgezB4NDZmZDExMjgsIEwiRXZhbCJ9LCAgICAgICAgIHsweDRkNjI5NDQwLCBMIkRhdGUyTnVtIn0sDQorICAgIHsweDRkY2YyNWY4LCBMIkNvbmNhdCJ9LCAgICAgICB7MHg0ZTAwMjU1ZCwgTCJVbml0VmFsdWUifSwNCisgICAgezB4NTVhNWNjMjksIEwiTG93ZXIifSwgICAgICAgIHsweDVlNDNlMDRjLCBMIldvcmROdW0ifSwNCisgICAgezB4NjIwY2U2YmEsIEwiSXBtdCJ9LCAgICAgICAgIHsweDZmNTQ0ZDQ5LCBMIkNvdW50In0sDQorICAgIHsweDdlMjQxMDEzLCBMIldpdGhpbiJ9LCAgICAgICB7MHg5YjlhNmUyYiwgTCJJc29EYXRlMk51bSJ9LA0KKyAgICB7MHhiMmM5NDFjMiwgTCJVbml0VHlwZSJ9LCAgICAgezB4YjU5OGExZjcsIEwiVXVpZCJ9LA0KKyAgICB7MHhiZGU5YWJkZSwgTCJEYXRlIn0sICAgICAgICAgezB4YzAwMTBiODAsIEwiTnVtMkRhdGUifSwNCisgICAgezB4YzFmNjE0NGMsIEwiVXBwZXIifSwgICAgICAgIHsweGM0NDAyOGY3LCBMIk9uZW9mIn0sDQorICAgIHsweGM2MmMxYjJjLCBMIlNwYWNlIn0sICAgICAgICB7MHhkMGZmNTBmOSwgTCJIYXNWYWx1ZSJ9LA0KKyAgICB7MHhkMTUzNzA0MiwgTCJGbG9vciJ9LCAgICAgICAgezB4ZDJhYzljZjEsIEwiVGltZTJOdW0ifSwNCisgICAgezB4ZDkwN2FlZTUsIEwiTnVtMkdNVGltZSJ9LCAgIHsweGRmMjRmN2M0LCBMIkRlY29kZSJ9LA0KKyAgICB7MHhlMjY2NDgwMywgTCJTdWJzdHIifSwgICAgICAgezB4ZTNlN2I1MjgsIEwiU3R1ZmYifSwNCisgICAgezB4ZTY3OTJkNGUsIEwiUnRyaW0ifSwgICAgICAgIHsweGU4YzIzZjViLCBMIlBhcnNlIn0sDQorICAgIHsweGVhMThkMTIxLCBMIkNob29zZSJ9LCAgICAgICB7MHhlYmZlZjY5YywgTCJSZXBsYWNlIn0sDQorICAgIHsweGY1YWQ3ODJiLCBMIkxlZnQifSwgICAgICAgICB7MHhmN2JiMjI0OCwgTCJMdHJpbSJ9LA0KIH07DQogc3RhdGljIGNvbnN0IFhGQV9GTVNPTU1ldGhvZCBnc19GTVNvbU1ldGhvZHNbXSA9IHsNCi0gICAgezB4MDAwMDAwNjgsIEwiaCIsCQkJCTB4MDF9LA0KLSAgICB7MHgwMDAwMDA3NywgTCJ3IiwJCQkJMHgwMX0sDQotICAgIHsweDAwMDAwMDc4LCBMIngiLAkJCQkweDAxfSwNCi0gICAgezB4MDAwMDAwNzksIEwieSIsCQkJCTB4MDF9LA0KLSAgICB7MHgwNWViNWIwZiwgTCJwYWdlU3BhbiIsCQkweDAxfSwNCi0gICAgezB4MTBmMWIxYmQsIEwicGFnZSIsCQkJMHgwMX0sDQotICAgIHsweDNiZjFjMmE1LCBMImFic1BhZ2VTcGFuIiwJMHgwMX0sDQotICAgIHsweDNjNzUyNDk1LCBMInZlcmlmeSIsCQkJMHgwZH0sDQotICAgIHsweDQ0YzM1MmFkLCBMImZvcm1Ob2RlcyIsCQkweDAxfSwNCi0gICAgezB4NTc3NWMyY2MsIEwiYWJzUGFnZUluQmF0Y2giLAkweDAxfSwNCi0gICAgezB4NWVlMDA5OTYsIEwic2V0RWxlbWVudCIsCQkweDAxfSwNCi0gICAgezB4NzAzM2JmZDUsIEwiaW5zZXJ0IiwJCQkweDAzfSwNCi0gICAgezB4OGM1ZmViMzIsIEwic2hlZXRJbkJhdGNoIiwJMHgwMX0sDQotICAgIHsweDhmM2E4Mzc5LCBMInNoZWV0IiwJCQkweDAxfSwNCisgICAgezB4MDAwMDAwNjgsIEwiaCIsIDB4MDF9LA0KKyAgICB7MHgwMDAwMDA3NywgTCJ3IiwgMHgwMX0sDQorICAgIHsweDAwMDAwMDc4LCBMIngiLCAweDAxfSwNCisgICAgezB4MDAwMDAwNzksIEwieSIsIDB4MDF9LA0KKyAgICB7MHgwNWViNWIwZiwgTCJwYWdlU3BhbiIsIDB4MDF9LA0KKyAgICB7MHgxMGYxYjFiZCwgTCJwYWdlIiwgMHgwMX0sDQorICAgIHsweDNiZjFjMmE1LCBMImFic1BhZ2VTcGFuIiwgMHgwMX0sDQorICAgIHsweDNjNzUyNDk1LCBMInZlcmlmeSIsIDB4MGR9LA0KKyAgICB7MHg0NGMzNTJhZCwgTCJmb3JtTm9kZXMiLCAweDAxfSwNCisgICAgezB4NTc3NWMyY2MsIEwiYWJzUGFnZUluQmF0Y2giLCAweDAxfSwNCisgICAgezB4NWVlMDA5OTYsIEwic2V0RWxlbWVudCIsIDB4MDF9LA0KKyAgICB7MHg3MDMzYmZkNSwgTCJpbnNlcnQiLCAweDAzfSwNCisgICAgezB4OGM1ZmViMzIsIEwic2hlZXRJbkJhdGNoIiwgMHgwMX0sDQorICAgIHsweDhmM2E4Mzc5LCBMInNoZWV0IiwgMHgwMX0sDQogICAgIHsweDkyZGFkYTRmLCBMInNhdmVGaWx0ZXJlZFhNTCIsIDB4MDF9LA0KLSAgICB7MHg5Y2FiN2NhZSwgTCJyZW1vdmUiLAkJCTB4MDF9LA0KLSAgICB7MHhhNjg2MzVmMSwgTCJzaWduIiwJCQkweDYxfSwNCi0gICAgezB4YWFjMjQxYzgsIEwiaXNSZWNvcmRHcm91cCIsCTB4MDF9LA0KLSAgICB7MHhkOGVkMTQ2NywgTCJjbGVhciIsCQkJMHgwMX0sDQotICAgIHsweGRhMTJlNTE4LCBMImFwcGVuZCIsCQkJMHgwMX0sDQotICAgIHsweGU3NGYwNjUzLCBMImFic1BhZ2UiLAkJMHgwMX0sDQorICAgIHsweDljYWI3Y2FlLCBMInJlbW92ZSIsIDB4MDF9LA0KKyAgICB7MHhhNjg2MzVmMSwgTCJzaWduIiwgMHg2MX0sDQorICAgIHsweGFhYzI0MWM4LCBMImlzUmVjb3JkR3JvdXAiLCAweDAxfSwNCisgICAgezB4ZDhlZDE0NjcsIEwiY2xlYXIiLCAweDAxfSwNCisgICAgezB4ZGExMmU1MTgsIEwiYXBwZW5kIiwgMHgwMX0sDQorICAgIHsweGU3NGYwNjUzLCBMImFic1BhZ2UiLCAweDAxfSwNCiB9Ow0KIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uOjpDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fVE9LRU4gb3ApDQotICAgIDogbV9saW5lKGxpbmUpLA0KLSAgICAgIG1fb3Aob3ApDQotew0KLX0NCi12b2lkIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi19DQotdm9pZCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXt9DQotWEZBX0ZNX1RPS0VOIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uOjpHZXRPcGVyYXRvclRva2VuKCljb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fb3A7DQorICAgIDogbV9saW5lKGxpbmUpLCBtX29wKG9wKSB7fQ0KK3ZvaWQgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHt9DQordm9pZCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7fQ0KK1hGQV9GTV9UT0tFTiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbjo6R2V0T3BlcmF0b3JUb2tlbigpIGNvbnN0IHsNCisgIHJldHVybiBtX29wOw0KIH0NCiBDWEZBX0ZNTnVsbEV4cHJlc3Npb246OkNYRkFfRk1OdWxsRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lKQ0KLSAgICA6IENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKGxpbmUsICBUT0tudWxsKQ0KLXsNCisgICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBUT0tudWxsKSB7fQ0KK3ZvaWQgQ1hGQV9GTU51bGxFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwibnVsbCIpOw0KIH0NCi12b2lkIENYRkFfRk1OdWxsRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCi17DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJudWxsIik7DQorQ1hGQV9GTU51bWJlckV4cHJlc3Npb246OkNYRkFfRk1OdW1iZXJFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c051bWJlcikNCisgICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBUT0tudW1iZXIpLCBtX3dzTnVtYmVyKHdzTnVtYmVyKSB7fQ0KK3ZvaWQgQ1hGQV9GTU51bWJlckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgbV93c051bWJlcjsNCiB9DQotQ1hGQV9GTU51bWJlckV4cHJlc3Npb246OkNYRkFfRk1OdW1iZXJFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENGWF9XaWRlU3RyaW5nQyB3c051bWJlcikNCi0gICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBUT0tudW1iZXIpLCBtX3dzTnVtYmVyKHdzTnVtYmVyKQ0KLXsNCi19DQotdm9pZCBDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCi17DQotICAgIGphdmFzY3JpcHQgPDwgbV93c051bWJlcjsNCi19DQotQ1hGQV9GTVN0cmluZ0V4cHJlc3Npb246OkNYRkFfRk1TdHJpbmdFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENGWF9XaWRlU3RyaW5nQyB3c1N0cmluZykNCi0gICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBUT0tzdHJpbmcpLA0KLSAgICAgIG1fd3NTdHJpbmcod3NTdHJpbmcpDQotew0KLX0NCi12b2lkIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcFN0ciA9IG1fd3NTdHJpbmc7DQotICAgIGlmICh0ZW1wU3RyLkdldExlbmd0aCgpID4gMikgew0KLSAgICAgICAgamF2YXNjcmlwdC5BcHBlbmRDaGFyKEwnXCInKTsNCi0gICAgICAgIEZYX1dDSEFSIG9uZUNoYXI7DQotICAgICAgICBmb3IgKGludDE2X3QgaSA9IDE7IGkgPCB0ZW1wU3RyLkdldExlbmd0aCgpIC0gMTsgaSsrKSB7DQotICAgICAgICAgICAgb25lQ2hhciA9IHRlbXBTdHJbaV07DQotICAgICAgICAgICAgc3dpdGNoIChvbmVDaGFyKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgTCdcIic6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpKys7DQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlxcXCIiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDB4MGQ6DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAweDBhOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlxcbiIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0LkFwcGVuZENoYXIob25lQ2hhcik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBqYXZhc2NyaXB0LkFwcGVuZENoYXIoTCdcIicpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wU3RyOw0KK0NYRkFfRk1TdHJpbmdFeHByZXNzaW9uOjpDWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NTdHJpbmcpDQorICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgVE9Lc3RyaW5nKSwgbV93c1N0cmluZyh3c1N0cmluZykge30NCit2b2lkIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBDRlhfV2lkZVN0cmluZyB0ZW1wU3RyID0gbV93c1N0cmluZzsNCisgIGlmICh0ZW1wU3RyLkdldExlbmd0aCgpID4gMikgew0KKyAgICBqYXZhc2NyaXB0LkFwcGVuZENoYXIoTCdcIicpOw0KKyAgICBGWF9XQ0hBUiBvbmVDaGFyOw0KKyAgICBmb3IgKGludDE2X3QgaSA9IDE7IGkgPCB0ZW1wU3RyLkdldExlbmd0aCgpIC0gMTsgaSsrKSB7DQorICAgICAgb25lQ2hhciA9IHRlbXBTdHJbaV07DQorICAgICAgc3dpdGNoIChvbmVDaGFyKSB7DQorICAgICAgICBjYXNlIEwnXCInOiB7DQorICAgICAgICAgIGkrKzsNCisgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlxcXCIiKTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIDB4MGQ6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAweDBhOiB7DQorICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcXG4iKTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBkZWZhdWx0OiB7IGphdmFzY3JpcHQuQXBwZW5kQ2hhcihvbmVDaGFyKTsgfSBicmVhazsNCisgICAgICB9DQogICAgIH0NCi19DQotQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubjo6Q1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubihGWF9EV09SRCBsaW5lLCBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyKQ0KLSAgICA6IENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKGxpbmUsIFRPS2lkZW50aWZpZXIpLCBtX3dzSWRlbnRpZmllcih3c0lkZW50aWZpZXIpDQotew0KLX0NCi12b2lkIENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbm46OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB0ZW1wU3RyID0gbV93c0lkZW50aWZpZXI7DQotICAgIGlmICh0ZW1wU3RyLkVxdWFsKEZYX1dTVFJDKEwiJCIpKSkgew0KLSAgICAgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwidGhpcyIpOw0KLSAgICB9IGVsc2UgaWYgKHRlbXBTdHIuRXF1YWwoRlhfV1NUUkMoTCIhIikpKSB7DQotICAgICAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ4ZmEuZGF0YXNldHMiKTsNCi0gICAgfSBlbHNlIGlmICh0ZW1wU3RyLkVxdWFsKEZYX1dTVFJDKEwiJGRhdGEiKSkpIHsNCi0gICAgICAgIHRlbXBTdHIgPSBGWF9XU1RSQyhMInhmYS5kYXRhc2V0cy5kYXRhIik7DQotICAgIH0gZWxzZSBpZiAodGVtcFN0ci5FcXVhbChGWF9XU1RSQyhMIiRldmVudCIpKSkgew0KLSAgICAgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwieGZhLmV2ZW50Iik7DQotICAgIH0gZWxzZSBpZiAodGVtcFN0ci5FcXVhbChGWF9XU1RSQyhMIiRmb3JtIikpKSB7DQotICAgICAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ4ZmEuZm9ybSIpOw0KLSAgICB9IGVsc2UgaWYgKHRlbXBTdHIuRXF1YWwoRlhfV1NUUkMoTCIkaG9zdCIpKSkgew0KLSAgICAgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwieGZhLmhvc3QiKTsNCi0gICAgfSBlbHNlIGlmICh0ZW1wU3RyLkVxdWFsKEZYX1dTVFJDKEwiJGxheW91dCIpKSkgew0KLSAgICAgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwieGZhLmxheW91dCIpOw0KLSAgICB9IGVsc2UgaWYgKHRlbXBTdHIuRXF1YWwoRlhfV1NUUkMoTCIkdGVtcGxhdGUiKSkpIHsNCi0gICAgICAgIHRlbXBTdHIgPSBGWF9XU1RSQyhMInhmYS50ZW1wbGF0ZSIpOw0KLSAgICB9IGVsc2UgaWYgKHRlbXBTdHJbMF0gPT0gTCchJykgew0KLSAgICAgICAgdGVtcFN0ciA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyB0ZW1wU3RyLk1pZCgxKTsNCi0gICAgfQ0KKyAgICBqYXZhc2NyaXB0LkFwcGVuZENoYXIoTCdcIicpOw0KKyAgfSBlbHNlIHsNCiAgICAgamF2YXNjcmlwdCA8PCB0ZW1wU3RyOw0KLSAgICByZXR1cm47DQorICB9DQogfQ0KLUNYRkFfRk1VbmFyeUV4cHJlc3Npb246OkNYRkFfRk1VbmFyeUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cCkNCi0gICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBvcCksIG1fcEV4cChwRXhwKQ0KLXsNCitDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uOjpDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uKA0KKyAgICBGWF9EV09SRCBsaW5lLA0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyKQ0KKyAgICA6IENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKGxpbmUsIFRPS2lkZW50aWZpZXIpLA0KKyAgICAgIG1fd3NJZGVudGlmaWVyKHdzSWRlbnRpZmllcikge30NCit2b2lkIENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbm46OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIENGWF9XaWRlU3RyaW5nIHRlbXBTdHIgPSBtX3dzSWRlbnRpZmllcjsNCisgIGlmICh0ZW1wU3RyLkVxdWFsKEZYX1dTVFJDKEwiJCIpKSkgew0KKyAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ0aGlzIik7DQorICB9IGVsc2UgaWYgKHRlbXBTdHIuRXF1YWwoRlhfV1NUUkMoTCIhIikpKSB7DQorICAgIHRlbXBTdHIgPSBGWF9XU1RSQyhMInhmYS5kYXRhc2V0cyIpOw0KKyAgfSBlbHNlIGlmICh0ZW1wU3RyLkVxdWFsKEZYX1dTVFJDKEwiJGRhdGEiKSkpIHsNCisgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwieGZhLmRhdGFzZXRzLmRhdGEiKTsNCisgIH0gZWxzZSBpZiAodGVtcFN0ci5FcXVhbChGWF9XU1RSQyhMIiRldmVudCIpKSkgew0KKyAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ4ZmEuZXZlbnQiKTsNCisgIH0gZWxzZSBpZiAodGVtcFN0ci5FcXVhbChGWF9XU1RSQyhMIiRmb3JtIikpKSB7DQorICAgIHRlbXBTdHIgPSBGWF9XU1RSQyhMInhmYS5mb3JtIik7DQorICB9IGVsc2UgaWYgKHRlbXBTdHIuRXF1YWwoRlhfV1NUUkMoTCIkaG9zdCIpKSkgew0KKyAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ4ZmEuaG9zdCIpOw0KKyAgfSBlbHNlIGlmICh0ZW1wU3RyLkVxdWFsKEZYX1dTVFJDKEwiJGxheW91dCIpKSkgew0KKyAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ4ZmEubGF5b3V0Iik7DQorICB9IGVsc2UgaWYgKHRlbXBTdHIuRXF1YWwoRlhfV1NUUkMoTCIkdGVtcGxhdGUiKSkpIHsNCisgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwieGZhLnRlbXBsYXRlIik7DQorICB9IGVsc2UgaWYgKHRlbXBTdHJbMF0gPT0gTCchJykgew0KKyAgICB0ZW1wU3RyID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIHRlbXBTdHIuTWlkKDEpOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCB0ZW1wU3RyOw0KKyAgcmV0dXJuOw0KIH0NCi1DWEZBX0ZNVW5hcnlFeHByZXNzaW9uOjp+Q1hGQV9GTVVuYXJ5RXhwcmVzc2lvbigpDQotew0KLSAgICBpZiAobV9wRXhwICE9IDApIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BFeHA7DQotICAgICAgICBtX3BFeHAgPSAwOw0KLSAgICB9DQorQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbjo6Q1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHApDQorICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgb3ApLCBtX3BFeHAocEV4cCkge30NCitDWEZBX0ZNVW5hcnlFeHByZXNzaW9uOjp+Q1hGQV9GTVVuYXJ5RXhwcmVzc2lvbigpIHsNCisgIGlmIChtX3BFeHAgIT0gMCkgew0KKyAgICBkZWxldGUgbV9wRXhwOw0KKyAgICBtX3BFeHAgPSAwOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRk1VbmFyeUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KK3ZvaWQgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkge30NCitDWEZBX0ZNQmluRXhwcmVzc2lvbjo6Q1hGQV9GTUJpbkV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMikNCisgICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBvcCksIG1fcEV4cDEocEV4cDEpLCBtX3BFeHAyKHBFeHAyKSB7fQ0KK0NYRkFfRk1CaW5FeHByZXNzaW9uOjp+Q1hGQV9GTUJpbkV4cHJlc3Npb24oKSB7DQorICBpZiAobV9wRXhwMSAhPSAwKSB7DQorICAgIGRlbGV0ZSBtX3BFeHAxOw0KKyAgICBtX3BFeHAxID0gMDsNCisgIH0NCisgIGlmIChtX3BFeHAyICE9IDApIHsNCisgICAgZGVsZXRlIG1fcEV4cDI7DQorICAgIG1fcEV4cDIgPSAwOw0KKyAgfQ0KIH0NCi1DWEZBX0ZNQmluRXhwcmVzc2lvbjo6Q1hGQV9GTUJpbkV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMiApDQotICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgb3ApLA0KLSAgICAgIG1fcEV4cDEocEV4cDEpLA0KLSAgICAgIG1fcEV4cDIocEV4cDIpDQotew0KLX0NCi1DWEZBX0ZNQmluRXhwcmVzc2lvbjo6fkNYRkFfRk1CaW5FeHByZXNzaW9uKCkNCi17DQotICAgIGlmIChtX3BFeHAxICE9IDApIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BFeHAxOw0KLSAgICAgICAgbV9wRXhwMSA9IDA7DQotICAgIH0NCi0gICAgaWYgKG1fcEV4cDIgIT0gMCkgew0KLSAgICAgICAgZGVsZXRlIG1fcEV4cDI7DQotICAgICAgICBtX3BFeHAyID0gMDsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk1CaW5FeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi19DQotQ1hGQV9GTUFzc2lnbkV4cHJlc3Npb246OkNYRkFfRk1Bc3NpZ25FeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIgKQ0KLSAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpDQotew0KLX0NCi12b2lkIENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImlmICgiKTsNCi0gICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0lTRk1PQkpFQ1RdOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KLSAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpKVxue1xuIik7DQotICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtBU1NJR05dOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KLSAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KLSAgICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpO1xufVxuIik7DQotICAgIENGWF9XaWRlVGV4dEJ1ZiB0ZW1wRXhwMTsNCi0gICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KHRlbXBFeHAxKTsNCi0gICAgaWYgKG1fcEV4cDEtPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tpZGVudGlmaWVyICYmIHRlbXBFeHAxLkdldFdpZGVTdHJpbmcoKSAhPSBGWF9XU1RSQyhMInRoaXMiKSkgew0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImVsc2VcbntcbiIpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wRXhwMTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtBU1NJR05dOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgICAgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KLSAgICAgICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG59XG4iKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiaWYgKCIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbSVNGTU9CSkVDVF07DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikpXG57XG4iKTsNCi0gICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCit2b2lkIENYRkFfRk1CaW5FeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7fQ0KK0NYRkFfRk1Bc3NpZ25FeHByZXNzaW9uOjpDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAyKQ0KKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpIHt9DQordm9pZCBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImlmICgiKTsNCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtJU0ZNT0JKRUNUXTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSlcbntcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0FTU0lHTl07DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTtcbn1cbiIpOw0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHRlbXBFeHAxOw0KKyAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KHRlbXBFeHAxKTsNCisgIGlmIChtX3BFeHAxLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LaWRlbnRpZmllciAmJg0KKyAgICAgIHRlbXBFeHAxLkdldFdpZGVTdHJpbmcoKSAhPSBGWF9XU1RSQyhMInRoaXMiKSkgew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZWxzZVxue1xuIik7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcEV4cDE7DQogICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCiAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0FTU0lHTl07DQogICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQpAQCAtMzAyLDQ1NyArMjI2LDQ4NSBAQAogICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KICAgICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQogICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpO1xufVxuIik7DQotICAgIENGWF9XaWRlVGV4dEJ1ZiB0ZW1wRXhwMTsNCi0gICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KHRlbXBFeHAxKTsNCi0gICAgaWYgKG1fcEV4cDEtPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tpZGVudGlmaWVyICYmIHRlbXBFeHAxLkdldFdpZGVTdHJpbmcoKSAhPSBGWF9XU1RSQyhMInRoaXMiKSkgew0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImVsc2VcbntcbiIpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgdGVtcEV4cDE7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQVNTSUdOXTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgICAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCi0gICAgICAgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpO1xufVxuIik7DQotICAgIH0NCisgIH0NCiB9DQotQ1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb246OkNYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIpDQotICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHBFeHAxLCBwRXhwMikNCi17DQotfQ0KLXZvaWQgQ1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTE9HSUNBTE9SXTsNCit2b2lkIENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJpZiAoIik7DQorICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbSVNGTU9CSkVDVF07DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikpXG57XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQVNTSUdOXTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpO1xufVxuIik7DQorICBDRlhfV2lkZVRleHRCdWYgdGVtcEV4cDE7DQorICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQodGVtcEV4cDEpOw0KKyAgaWYgKG1fcEV4cDEtPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tpZGVudGlmaWVyICYmDQorICAgICAgdGVtcEV4cDEuR2V0V2lkZVN0cmluZygpICE9IEZYX1dTVFJDKEwidGhpcyIpKSB7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJlbHNlXG57XG4iKTsNCisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBFeHAxOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtBU1NJR05dOw0KICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KICAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQogICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KICAgICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpO1xufVxuIik7DQorICB9DQogfQ0KLUNYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbjo6Q1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIgKQ0KLSAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpDQotew0KK0NYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uOjpDWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDEsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMikNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgcEV4cDEsIHBFeHAyKSB7fQ0KK3ZvaWQgQ1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtMT0dJQ0FMT1JdOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCiB9DQotdm9pZCBDWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTE9HSUNBTEFORF07DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQotICAgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCitDWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb246OkNYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDEsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMikNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgcEV4cDEsIHBFeHAyKSB7fQ0KK3ZvaWQgQ1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTE9HSUNBTEFORF07DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KIH0NCi1DWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uOjpDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIgKQ0KLSAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpDQotew0KK0NYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb246OkNYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24oDQorICAgIEZYX0RXT1JEIGxpbmUsDQorICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAxLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDIpDQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHBFeHAxLCBwRXhwMikge30NCit2b2lkIENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIHN3aXRjaCAobV9vcCkgew0KKyAgICBjYXNlIFRPS2VxOg0KKyAgICBjYXNlIFRPS2tzZXE6DQorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0VRVUFMSVRZXTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tuZToNCisgICAgY2FzZSBUT0trc25lOg0KKyAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtOT1RFUVVBTElUWV07DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQogfQ0KLXZvaWQgQ1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCi17DQotICAgIHN3aXRjaChtX29wKSB7DQotICAgICAgICBjYXNlIFRPS2VxOg0KLSAgICAgICAgY2FzZSBUT0trc2VxOg0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtFUVVBTElUWV07DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFRPS25lOg0KLSAgICAgICAgY2FzZSBUT0trc25lOg0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtOT1RFUVVBTElUWV07DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCi0gICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK0NYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbjo6Q1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKA0KKyAgICBGWF9EV09SRCBsaW5lLA0KKyAgICBYRkFfRk1fVE9LRU4gb3AsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAyKQ0KKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpIHt9DQordm9pZCBDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIHN3aXRjaCAobV9vcCkgew0KKyAgICBjYXNlIFRPS2x0Og0KKyAgICBjYXNlIFRPS2tzbHQ6DQorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0xFU1NdOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2d0Og0KKyAgICBjYXNlIFRPS2tzZ3Q6DQorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dSRUFURVJdOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2xlOg0KKyAgICBjYXNlIFRPS2tzbGU6DQorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0xFU1NFUVVBTF07DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9LZ2U6DQorICAgIGNhc2UgVE9La3NnZToNCisgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR1JFQVRFUkVRVUFMXTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCiB9DQotQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uOjpDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMiApDQotICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHBFeHAxLCBwRXhwMikNCi17DQorQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbjo6Q1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDEsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMikNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgcEV4cDEsIHBFeHAyKSB7fQ0KK3ZvaWQgQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgc3dpdGNoIChtX29wKSB7DQorICAgIGNhc2UgVE9LcGx1czoNCisgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbUExVU107DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9LbWludXM6DQorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW01JTlVTXTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCiB9DQotdm9pZCBDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBzd2l0Y2ggKG1fb3ApIHsNCi0gICAgICAgIGNhc2UgVE9LbHQ6DQotICAgICAgICBjYXNlIFRPS2tzbHQ6DQotICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0xFU1NdOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBUT0tndDoNCi0gICAgICAgIGNhc2UgVE9La3NndDoNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR1JFQVRFUl07DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFRPS2xlOg0KLSAgICAgICAgY2FzZSBUT0trc2xlOg0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtMRVNTRVFVQUxdOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBUT0tnZToNCi0gICAgICAgIGNhc2UgVE9La3NnZToNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR1JFQVRFUkVRVUFMXTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KLSAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KLSAgICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorQ1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjo6Q1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDEsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMikNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgcEV4cDEsIHBFeHAyKSB7fQ0KK3ZvaWQgQ1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KA0KKyAgICBDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIHN3aXRjaCAobV9vcCkgew0KKyAgICBjYXNlIFRPS211bDoNCisgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTVVMVElQTEVdOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2RpdjoNCisgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbRElWSURFXTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCiB9DQotQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbjo6Q1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fVE9LRU4gb3AsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAyICkNCi0gICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgcEV4cDEsIHBFeHAyKQ0KLXsNCitDWEZBX0ZNUG9zRXhwcmVzc2lvbjo6Q1hGQV9GTVBvc0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHApDQorICAgIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0twbHVzLCBwRXhwKSB7fQ0KK3ZvaWQgQ1hGQV9GTVBvc0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtQT1NJVElWRV07DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wRXhwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KIH0NCi12b2lkIENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBzd2l0Y2ggKG1fb3ApIHsNCi0gICAgICAgIGNhc2UgVE9LcGx1czoNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbUExVU107DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFRPS21pbnVzOg0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtNSU5VU107DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCi0gICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK0NYRkFfRk1OZWdFeHByZXNzaW9uOjpDWEZBX0ZNTmVnRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cCkNCisgICAgOiBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKGxpbmUsIFRPS21pbnVzLCBwRXhwKSB7fQ0KK3ZvaWQgQ1hGQV9GTU5lZ0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtORUdBVElWRV07DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wRXhwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KIH0NCi1DWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uOjpDWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIgKQ0KLSAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpDQotew0KK0NYRkFfRk1Ob3RFeHByZXNzaW9uOjpDWEZBX0ZNTm90RXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cCkNCisgICAgOiBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKGxpbmUsIFRPS2tzbm90LCBwRXhwKSB7fQ0KK3ZvaWQgQ1hGQV9GTU5vdEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtOT1RdOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIG1fcEV4cC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCiB9DQotdm9pZCBDWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgc3dpdGNoIChtX29wKSB7DQotICAgICAgICBjYXNlIFRPS211bDoNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTVVMVElQTEVdOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBUT0tkaXY6DQotICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0RJVklERV07DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCi0gICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KLX0NCi1DWEZBX0ZNUG9zRXhwcmVzc2lvbjo6Q1hGQV9GTVBvc0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAgKSA6IENYRkFfRk1VbmFyeUV4cHJlc3Npb24obGluZSwgVE9LcGx1cywgcEV4cCkNCi17DQotfQ0KLXZvaWQgQ1hGQV9GTVBvc0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbUE9TSVRJVkVdOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KLSAgICBtX3BFeHAtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCi19DQotQ1hGQV9GTU5lZ0V4cHJlc3Npb246OkNYRkFfRk1OZWdFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwICkNCi0gICAgOiBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKGxpbmUsIFRPS21pbnVzLCBwRXhwKQ0KLXsNCi19DQotdm9pZCBDWEZBX0ZNTmVnRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCi17DQotICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtORUdBVElWRV07DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgIG1fcEV4cC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KLX0NCi1DWEZBX0ZNTm90RXhwcmVzc2lvbjo6Q1hGQV9GTU5vdEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAgKQ0KLSAgICA6IENYRkFfRk1VbmFyeUV4cHJlc3Npb24obGluZSwgVE9La3Nub3QsIHBFeHApDQotew0KLX0NCi12b2lkIENYRkFfRk1Ob3RFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW05PVF07DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgIG1fcEV4cC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KLX0NCi1DWEZBX0ZNQ2FsbEV4cHJlc3Npb246OkNYRkFfRk1DYWxsRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cCwgQ0ZYX1B0ckFycmF5ICpwQXJndW1lbnRzLCBGWF9CT09MIGJJc1NvbU1ldGhvZCkNCitDWEZBX0ZNQ2FsbEV4cHJlc3Npb246OkNYRkFfRk1DYWxsRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogcEFyZ3VtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc1NvbU1ldGhvZCkNCiAgICAgOiBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKGxpbmUsIFRPS2NhbGwsIHBFeHApLA0KICAgICAgIG1fcEFyZ3VtZW50cyhwQXJndW1lbnRzKSwNCi0gICAgICBtX2JJc1NvbU1ldGhvZChiSXNTb21NZXRob2QpDQotew0KKyAgICAgIG1fYklzU29tTWV0aG9kKGJJc1NvbU1ldGhvZCkge30NCitDWEZBX0ZNQ2FsbEV4cHJlc3Npb246On5DWEZBX0ZNQ2FsbEV4cHJlc3Npb24oKSB7DQorICBpZiAobV9wQXJndW1lbnRzKSB7DQorICAgIGludDMyX3QgYXJnYyA9IG1fcEFyZ3VtZW50cy0+R2V0U2l6ZSgpOw0KKyAgICBpbnQzMl90IGluZGV4ID0gMDsNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgICB3aGlsZSAoaW5kZXggPCBhcmdjKSB7DQorICAgICAgZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiopbV9wQXJndW1lbnRzLT5HZXRBdChpbmRleCk7DQorICAgICAgZGVsZXRlIGU7DQorICAgICAgaW5kZXgrKzsNCisgICAgfQ0KKyAgICBtX3BBcmd1bWVudHMtPlJlbW92ZUFsbCgpOw0KKyAgICBkZWxldGUgbV9wQXJndW1lbnRzOw0KKyAgICBtX3BBcmd1bWVudHMgPSAwOw0KKyAgfQ0KIH0NCi1DWEZBX0ZNQ2FsbEV4cHJlc3Npb246On5DWEZBX0ZNQ2FsbEV4cHJlc3Npb24oKQ0KLXsNCitGWF9CT09MIENYRkFfRk1DYWxsRXhwcmVzc2lvbjo6SXNCdWlsZEluRnVuYyhDRlhfV2lkZVRleHRCdWYmIGZ1bmNOYW1lKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBmdW5jTmFtZS5HZXRMZW5ndGgoKTsNCisgIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoZnVuY05hbWUuR2V0QnVmZmVyKCksIGlMZW5ndGgsIFRSVUUpOw0KKyAgWEZBX0ZNQnVpbGRJbkZ1bmMgYnVpbGRpbmZ1bmN0aW9uOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICBpRW5kID0gKHNpemVvZihidWlsZEluRnVuY3MpIC8gc2l6ZW9mKGJ1aWxkSW5GdW5jc1swXSkpIC0gMTsNCisgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBidWlsZGluZnVuY3Rpb24gPSBidWlsZEluRnVuY3NbaU1pZF07DQorICAgIGlmICh1SGFzaCA9PSBidWlsZGluZnVuY3Rpb24ubV91SGFzaCkgew0KKyAgICAgIGZ1bmNOYW1lLkNsZWFyKCk7DQorICAgICAgZnVuY05hbWUgPDwgYnVpbGRpbmZ1bmN0aW9uLm1fYnVpbGRpbmZ1bmM7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBidWlsZGluZnVuY3Rpb24ubV91SGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9EV09SRCBDWEZBX0ZNQ2FsbEV4cHJlc3Npb246OklzU29tTWV0aG9kV2l0aE9ialBhcmEoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbWV0aG9kTmFtZSkgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gbWV0aG9kTmFtZS5HZXRMZW5ndGgoKTsNCisgIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcobWV0aG9kTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICBYRkFfRk1TT01NZXRob2Qgc29tTWV0aG9kV2l0aE9ialBhcmE7DQorICBGWF9EV09SRCBwYXJhbWV0ZXJzID0gMHgwMDsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgaUVuZCA9IChzaXplb2YoZ3NfRk1Tb21NZXRob2RzKSAvIHNpemVvZihnc19GTVNvbU1ldGhvZHNbMF0pKSAtIDE7DQorICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgc29tTWV0aG9kV2l0aE9ialBhcmEgPSBnc19GTVNvbU1ldGhvZHNbaU1pZF07DQorICAgIGlmICh1SGFzaCA9PSBzb21NZXRob2RXaXRoT2JqUGFyYS5tX3VIYXNoKSB7DQorICAgICAgcGFyYW1ldGVycyA9IHNvbU1ldGhvZFdpdGhPYmpQYXJhLm1fZFBhcmFtZXRlcnM7DQorICAgICAgYnJlYWs7DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBzb21NZXRob2RXaXRoT2JqUGFyYS5tX3VIYXNoKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gcGFyYW1ldGVyczsNCit9DQordm9pZCBDWEZBX0ZNQ2FsbEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIENGWF9XaWRlVGV4dEJ1ZiBmdW5jTmFtZTsNCisgIG1fcEV4cC0+VG9KYXZhU2NyaXB0KGZ1bmNOYW1lKTsNCisgIGlmIChtX2JJc1NvbU1ldGhvZCkgew0KKyAgICBqYXZhc2NyaXB0IDw8IGZ1bmNOYW1lOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KICAgICBpZiAobV9wQXJndW1lbnRzKSB7DQotICAgICAgICBpbnQzMl90IGFyZ2MgPSBtX3BBcmd1bWVudHMtPkdldFNpemUoKTsNCi0gICAgICAgIGludDMyX3QgaW5kZXggPSAwOw0KLSAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUgPSAwOw0KKyAgICAgIGludDMyX3QgYXJnYyA9IG1fcEFyZ3VtZW50cy0+R2V0U2l6ZSgpOw0KKyAgICAgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgICAgIEZYX0RXT1JEIG1ldGhvZFBhcmEgPSBJc1NvbU1ldGhvZFdpdGhPYmpQYXJhKGZ1bmNOYW1lLkdldFdpZGVTdHJpbmcoKSk7DQorICAgICAgaWYgKG1ldGhvZFBhcmEgPiAwKSB7DQorICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogZSA9IDA7DQogICAgICAgICB3aGlsZSAoaW5kZXggPCBhcmdjKSB7DQotICAgICAgICAgICAgZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKW1fcEFyZ3VtZW50cy0+R2V0QXQoaW5kZXgpOw0KLSAgICAgICAgICAgIGRlbGV0ZSBlOw0KLSAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICAgIGlmICgobWV0aG9kUGFyYSAmICgweDAxIDw8IGluZGV4KSkgPiAwKSB7DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dFVEZNSlNPQkpdOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtHRVRGTVZBTFVFXTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICAgICAgICBlID0gKENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiltX3BBcmd1bWVudHMtPkdldEF0KGluZGV4KTsNCisgICAgICAgICAgZS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KKyAgICAgICAgICBpZiAoaW5kZXggKyAxIDwgYXJnYykgew0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGluZGV4Kys7DQogICAgICAgICB9DQotICAgICAgICBtX3BBcmd1bWVudHMtPlJlbW92ZUFsbCgpOw0KLSAgICAgICAgZGVsZXRlIG1fcEFyZ3VtZW50czsNCi0gICAgICAgIG1fcEFyZ3VtZW50cyA9IDA7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBlID0gMDsNCisgICAgICAgIHdoaWxlIChpbmRleCA8IGFyZ2MpIHsNCisgICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dFVEZNVkFMVUVdOw0KKyAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICAgICAgICBlID0gKENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiltX3BBcmd1bWVudHMtPkdldEF0KGluZGV4KTsNCisgICAgICAgICAgZS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KKyAgICAgICAgICBpZiAoaW5kZXggKyAxIDwgYXJnYykgew0KKyAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICB9DQorICAgICAgfQ0KICAgICB9DQotfQ0KLUZYX0JPT0wgQ1hGQV9GTUNhbGxFeHByZXNzaW9uOjpJc0J1aWxkSW5GdW5jKENGWF9XaWRlVGV4dEJ1ZiYgZnVuY05hbWUpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBmdW5jTmFtZS5HZXRMZW5ndGgoKTsNCi0gICAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhmdW5jTmFtZS5HZXRCdWZmZXIoKSwgaUxlbmd0aCwgVFJVRSk7DQotICAgIFhGQV9GTUJ1aWxkSW5GdW5jIGJ1aWxkaW5mdW5jdGlvbjsNCi0gICAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gKHNpemVvZihidWlsZEluRnVuY3MpIC8gc2l6ZW9mKGJ1aWxkSW5GdW5jc1swXSkpIC0gMTsNCi0gICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCi0gICAgZG8gew0KLSAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICBidWlsZGluZnVuY3Rpb24gPSBidWlsZEluRnVuY3NbaU1pZF07DQotICAgICAgICBpZiAodUhhc2ggPT0gYnVpbGRpbmZ1bmN0aW9uLm1fdUhhc2gpIHsNCi0gICAgICAgICAgICBmdW5jTmFtZS5DbGVhcigpOw0KLSAgICAgICAgICAgIGZ1bmNOYW1lIDw8IGJ1aWxkaW5mdW5jdGlvbi5tX2J1aWxkaW5mdW5jOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfSBlbHNlIGlmICh1SGFzaCA8IGJ1aWxkaW5mdW5jdGlvbi5tX3VIYXNoKSB7DQotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0RXT1JEIENYRkFfRk1DYWxsRXhwcmVzc2lvbjo6SXNTb21NZXRob2RXaXRoT2JqUGFyYShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIG1ldGhvZE5hbWUpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBtZXRob2ROYW1lLkdldExlbmd0aCgpOw0KLSAgICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKG1ldGhvZE5hbWUuR2V0UHRyKCksIGlMZW5ndGgpOw0KLSAgICBYRkFfRk1TT01NZXRob2Qgc29tTWV0aG9kV2l0aE9ialBhcmE7DQotICAgIEZYX0RXT1JEIHBhcmFtZXRlcnMgPSAweDAwOw0KLSAgICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSAoc2l6ZW9mKGdzX0ZNU29tTWV0aG9kcykgLyBzaXplb2YoZ3NfRk1Tb21NZXRob2RzWzBdKSkgLSAxOw0KLSAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICBkbyB7DQotICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCi0gICAgICAgIHNvbU1ldGhvZFdpdGhPYmpQYXJhID0gZ3NfRk1Tb21NZXRob2RzW2lNaWRdOw0KLSAgICAgICAgaWYgKHVIYXNoID09IHNvbU1ldGhvZFdpdGhPYmpQYXJhLm1fdUhhc2gpIHsNCi0gICAgICAgICAgICBwYXJhbWV0ZXJzID0gc29tTWV0aG9kV2l0aE9ialBhcmEubV9kUGFyYW1ldGVyczsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBzb21NZXRob2RXaXRoT2JqUGFyYS5tX3VIYXNoKSB7DQotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KLSAgICByZXR1cm4gcGFyYW1ldGVyczsNCi19DQotdm9pZCBDWEZBX0ZNQ2FsbEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBDRlhfV2lkZVRleHRCdWYgZnVuY05hbWU7DQotICAgIG1fcEV4cC0+VG9KYXZhU2NyaXB0KGZ1bmNOYW1lKTsNCi0gICAgaWYgKG1fYklzU29tTWV0aG9kKSB7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IGZ1bmNOYW1lOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgICAgIGlmIChtX3BBcmd1bWVudHMpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGFyZ2MgPSBtX3BBcmd1bWVudHMtPkdldFNpemUoKTsNCi0gICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gMDsNCi0gICAgICAgICAgICBGWF9EV09SRCBtZXRob2RQYXJhID0gSXNTb21NZXRob2RXaXRoT2JqUGFyYShmdW5jTmFtZS5HZXRXaWRlU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIGlmIChtZXRob2RQYXJhID4gMCkgew0KLSAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZSA9IDA7DQotICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGFyZ2MpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgobWV0aG9kUGFyYSAmICgweDAxIDw8IGluZGV4KSkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dFVEZNSlNPQkpdOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR0VURk1WQUxVRV07DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KLSAgICAgICAgICAgICAgICAgICAgZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKW1fcEFyZ3VtZW50cy0+R2V0QXQoaW5kZXgpOw0KLSAgICAgICAgICAgICAgICAgICAgZS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBhcmdjKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpbmRleCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUgPSAwOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBhcmdjKSB7DQotICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR0VURk1WQUxVRV07DQotICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KLSAgICAgICAgICAgICAgICAgICAgZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKW1fcEFyZ3VtZW50cy0+R2V0QXQoaW5kZXgpOw0KLSAgICAgICAgICAgICAgICAgICAgZS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBhcmdjKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpbmRleCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYX0JPT0wgaXNFdmFsRnVuYyA9IEZBTFNFOw0KLSAgICAgICAgRlhfQk9PTCBpc0V4aXN0c0Z1bmMgPSBGQUxTRTsNCi0gICAgICAgIGlmIChJc0J1aWxkSW5GdW5jKGZ1bmNOYW1lKSkgew0KLSAgICAgICAgICAgIGlmIChmdW5jTmFtZS5HZXRXaWRlU3RyaW5nKCkgPT0gRlhfV1NUUkMoTCJFdmFsIikpIHsNCi0gICAgICAgICAgICAgICAgaXNFdmFsRnVuYyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJldmFsLmNhbGwodGhpcywgIik7DQotICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtDQUxMXTsNCi0gICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlRyYW5zbGF0ZSIpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUuR2V0V2lkZVN0cmluZygpID09IEZYX1dTVFJDKEwiRXhpc3RzIikpIHsNCi0gICAgICAgICAgICAgICAgaXNFeGlzdHNGdW5jID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0NBTExdOw0KLSAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGZ1bmNOYW1lOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtDQUxMXTsNCi0gICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBmdW5jTmFtZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgZnVuY05hbWU7DQotICAgICAgICB9DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KLSAgICAgICAgaWYgKGlzRXhpc3RzRnVuYykgew0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcbihcbmZ1bmN0aW9uICgpXG57XG50cnlcbntcbiIpOw0KLSAgICAgICAgICAgIGlmIChtX3BBcmd1bWVudHMgJiYgIG1fcEFyZ3VtZW50cy0+R2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKW1fcEFyZ3VtZW50cy0+R2V0QXQoMCk7DQotICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJyZXR1cm4gIik7DQotICAgICAgICAgICAgICAgIGUtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjtcbn1cbiIpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJyZXR1cm4gMDtcbn1cbiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiY2F0Y2goYWNjZXNzRXhjZXB0aW9ucylcbntcbnJldHVybiAwO1xufVxufVxuKS5jYWxsKHRoaXMpXG4iKTsNCi0gICAgICAgIH0gZWxzZSBpZiAobV9wQXJndW1lbnRzKSB7DQotICAgICAgICAgICAgaW50MzJfdCBhcmdjID0gbV9wQXJndW1lbnRzLT5HZXRTaXplKCk7DQotICAgICAgICAgICAgaW50MzJfdCBpbmRleCA9IDA7DQotICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKmUgPSAwOw0KLSAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGFyZ2MpIHsNCi0gICAgICAgICAgICAgICAgZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqKW1fcEFyZ3VtZW50cy0+R2V0QXQoaW5kZXgpOw0KLSAgICAgICAgICAgICAgICBlLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBhcmdjKSB7DQotICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpbmRleCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQotICAgICAgICBpZiAoaXNFdmFsRnVuYykgew0KLSAgICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQotQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbjo6Q1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEFjY2Vzc29yLCBYRkFfRk1fVE9LRU4gb3AsDQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEluZGV4RXhwKQ0KLSAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwQWNjZXNzb3IsIHBJbmRleEV4cCksDQotICAgICAgbV93c0lkZW50aWZpZXIod3NJZGVudGlmaWVyKQ0KLXt9DQotdm9pZCBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KQ0KLXsNCi0gICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0RPVF07DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQotICAgIGlmKG1fcEV4cDEpIHsNCi0gICAgICAgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJudWxsIik7DQotICAgIH0NCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiIpOw0KLSAgICBpZiAobV9wRXhwMSAmJiBtX3BFeHAxLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LaWRlbnRpZmllcikgew0KLSAgICAgICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICB9DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiwgIik7DQotICAgIGlmIChtX29wID09IFRPS2RvdHNjcmVhbSkgew0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiIyIpOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsNCi0gICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiwgIik7DQotICAgIH0gZWxzZSBpZiAobV9vcCA9PSBUT0tkb3RzdGFyKSB7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCIqXCIsICIpOw0KLSAgICB9IGVsc2UgaWYgKG1fb3AgPT0gVE9LY2FsbCkgew0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiXCIsICIpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiIik7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOw0KLSAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiLCAiKTsNCi0gICAgfQ0KLSAgICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQogICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQotfQ0KLUNYRkFfRk1JbmRleEV4cHJlc3Npb246OkNYRkFfRk1JbmRleEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX0FjY2Vzc29ySW5kZXggYWNjZXNzb3JJbmRleCwNCi0gICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwSW5kZXhFeHAsIEZYX0JPT0wgYklzU3RhckluZGV4KQ0KLSAgICA6IENYRkFfRk1VbmFyeUV4cHJlc3Npb24obGluZSwgVE9LbGJyYWNrZXQsIHBJbmRleEV4cCksDQotICAgICAgbV9hY2Nlc3NvckluZGV4KGFjY2Vzc29ySW5kZXgpLA0KLSAgICAgIG1fYklzU3RhckluZGV4KGJJc1N0YXJJbmRleCkNCi17fQ0KLXZvaWQgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkNCi17DQotICAgIHN3aXRjaChtX2FjY2Vzc29ySW5kZXgpIHsNCi0gICAgICAgIGNhc2UgQUNDRVNTT1JfTk9fSU5ERVg6DQotICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjAiKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgQUNDRVNTT1JfTk9fUkVMQVRJVkVJTkRFWDoNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMSIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBBQ0NFU1NPUl9QT1NJVElWRV9JTkRFWDoNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMiIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBBQ0NFU1NPUl9ORUdBVElWRV9JTkRFWDoNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMyIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMCIpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhfQk9PTCBpc0V2YWxGdW5jID0gRkFMU0U7DQorICAgIEZYX0JPT0wgaXNFeGlzdHNGdW5jID0gRkFMU0U7DQorICAgIGlmIChJc0J1aWxkSW5GdW5jKGZ1bmNOYW1lKSkgew0KKyAgICAgIGlmIChmdW5jTmFtZS5HZXRXaWRlU3RyaW5nKCkgPT0gRlhfV1NUUkMoTCJFdmFsIikpIHsNCisgICAgICAgIGlzRXZhbEZ1bmMgPSBUUlVFOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImV2YWwuY2FsbCh0aGlzLCAiKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtDQUxMXTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJUcmFuc2xhdGUiKTsNCisgICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lLkdldFdpZGVTdHJpbmcoKSA9PSBGWF9XU1RSQyhMIkV4aXN0cyIpKSB7DQorICAgICAgICBpc0V4aXN0c0Z1bmMgPSBUUlVFOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0NBTExdOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBmdW5jTmFtZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0NBTExdOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBmdW5jTmFtZTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgamF2YXNjcmlwdCA8PCBmdW5jTmFtZTsNCiAgICAgfQ0KLSAgICBpZiAoIW1fYklzU3RhckluZGV4KSB7DQotICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCi0gICAgICAgIGlmIChtX3BFeHApIHsNCi0gICAgICAgICAgICBtX3BFeHAtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjAiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi1DWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uOjpDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQWNjZXNzb3IsIFhGQV9GTV9UT0tFTiBvcCwNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXIsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwSW5kZXhFeHApDQotICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHBBY2Nlc3NvciwgcEluZGV4RXhwKSwNCi0gICAgICBtX3dzSWRlbnRpZmllcih3c0lkZW50aWZpZXIpDQote30NCi12b2lkIENYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbRE9URE9UXTsNCiAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCi0gICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiIik7DQotICAgIGlmIChtX3BFeHAxICYmIG1fcEV4cDEtPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tpZGVudGlmaWVyKSB7DQotICAgICAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGlmIChpc0V4aXN0c0Z1bmMpIHsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXG4oXG5mdW5jdGlvbiAoKVxue1xudHJ5XG57XG4iKTsNCisgICAgICBpZiAobV9wQXJndW1lbnRzICYmIG1fcEFyZ3VtZW50cy0+R2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGUgPQ0KKyAgICAgICAgICAgIChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiopbV9wQXJndW1lbnRzLT5HZXRBdCgwKTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJyZXR1cm4gIik7DQorICAgICAgICBlLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiO1xufVxuIik7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJyZXR1cm4gMDtcbn1cbiIpOw0KKyAgICAgIH0NCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKA0KKyAgICAgICAgICBMImNhdGNoKGFjY2Vzc0V4Y2VwdGlvbnMpXG57XG5yZXR1cm4gMDtcbn1cbn1cbikuY2FsbCh0aGlzKVxuIik7DQorICAgIH0gZWxzZSBpZiAobV9wQXJndW1lbnRzKSB7DQorICAgICAgaW50MzJfdCBhcmdjID0gbV9wQXJndW1lbnRzLT5HZXRTaXplKCk7DQorICAgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgICAgIHdoaWxlIChpbmRleCA8IGFyZ2MpIHsNCisgICAgICAgIGUgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qKW1fcEFyZ3VtZW50cy0+R2V0QXQoaW5kZXgpOw0KKyAgICAgICAgZS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IGFyZ2MpIHsNCisgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgICAgICB9DQorICAgICAgICBpbmRleCsrOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KKyAgICBpZiAoaXNFdmFsRnVuYykgew0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorICAgIH0NCisgIH0NCit9DQorQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbjo6Q1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBBY2Nlc3NvciwNCisgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEluZGV4RXhwKQ0KKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwQWNjZXNzb3IsIHBJbmRleEV4cCksDQorICAgICAgbV93c0lkZW50aWZpZXIod3NJZGVudGlmaWVyKSB7fQ0KK3ZvaWQgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0RPVF07DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgaWYgKG1fcEV4cDEpIHsNCisgICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgfSBlbHNlIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIm51bGwiKTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiIik7DQorICBpZiAobV9wRXhwMSAmJiBtX3BFeHAxLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LaWRlbnRpZmllcikgew0KKyAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCIsICIpOw0KKyAgaWYgKG1fb3AgPT0gVE9LZG90c2NyZWFtKSB7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiMiKTsNCisgICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsNCiAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiLCAiKTsNCisgIH0gZWxzZSBpZiAobV9vcCA9PSBUT0tkb3RzdGFyKSB7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIipcIiwgIik7DQorICB9IGVsc2UgaWYgKG1fb3AgPT0gVE9LY2FsbCkgew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCJcIiwgIik7DQorICB9IGVsc2Ugew0KICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCIiKTsNCiAgICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsNCiAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiLCAiKTsNCi0gICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KKyAgfQ0KKyAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCiB9DQotQ1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uOjpDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBBY2Nlc3NvckV4cDEsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQ2FsbEV4cCkNCi0gICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBUT0tkb3QsIHBBY2Nlc3NvckV4cDEsIHBDYWxsRXhwKQ0KLXsNCitDWEZBX0ZNSW5kZXhFeHByZXNzaW9uOjpDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKA0KKyAgICBGWF9EV09SRCBsaW5lLA0KKyAgICBYRkFfRk1fQWNjZXNzb3JJbmRleCBhY2Nlc3NvckluZGV4LA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEluZGV4RXhwLA0KKyAgICBGWF9CT09MIGJJc1N0YXJJbmRleCkNCisgICAgOiBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKGxpbmUsIFRPS2xicmFja2V0LCBwSW5kZXhFeHApLA0KKyAgICAgIG1fYWNjZXNzb3JJbmRleChhY2Nlc3NvckluZGV4KSwNCisgICAgICBtX2JJc1N0YXJJbmRleChiSXNTdGFySW5kZXgpIHt9DQordm9pZCBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBzd2l0Y2ggKG1fYWNjZXNzb3JJbmRleCkgew0KKyAgICBjYXNlIEFDQ0VTU09SX05PX0lOREVYOg0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIwIik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgQUNDRVNTT1JfTk9fUkVMQVRJVkVJTkRFWDoNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMSIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEFDQ0VTU09SX1BPU0lUSVZFX0lOREVYOg0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIyIik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgQUNDRVNTT1JfTkVHQVRJVkVfSU5ERVg6DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjMiKTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMCIpOw0KKyAgfQ0KKyAgaWYgKCFtX2JJc1N0YXJJbmRleCkgew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgICAgaWYgKG1fcEV4cCkgew0KKyAgICAgIG1fcEV4cC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIwIik7DQorICAgIH0NCisgIH0NCiB9DQotdm9pZCBDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpDQotew0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKFxuZnVuY3Rpb24gKClcbntcbiIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyIG1ldGhvZF9yZXR1cm5fdmFsdWUgPSBudWxsO1xuIik7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgYWNjZXNzb3Jfb2JqZWN0ID0gIik7DQorQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbjo6Q1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBBY2Nlc3NvciwNCisgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEluZGV4RXhwKQ0KKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwQWNjZXNzb3IsIHBJbmRleEV4cCksDQorICAgICAgbV93c0lkZW50aWZpZXIod3NJZGVudGlmaWVyKSB7fQ0KK3ZvaWQgQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KA0KKyAgICBDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtET1RET1RdOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiIik7DQorICBpZiAobV9wRXhwMSAmJiBtX3BFeHAxLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LaWRlbnRpZmllcikgew0KICAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG4iKTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImlmICgiKTsNCi0gICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0lTRk1BUlJBWV07DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoYWNjZXNzb3Jfb2JqZWN0KSlcbntcbiIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZm9yKHZhciBpbmRleCA9IGFjY2Vzc29yX29iamVjdC5sZW5ndGggLSAxOyBpbmRleCA+IDE7IGluZGV4LS0pXG57XG4iKTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIm1ldGhvZF9yZXR1cm5fdmFsdWUgPSBhY2Nlc3Nvcl9vYmplY3RbaW5kZXhdLiIpOw0KLSAgICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQotICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG59XG59XG4iKTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImVsc2Vcbntcbm1ldGhvZF9yZXR1cm5fdmFsdWUgPSBhY2Nlc3Nvcl9vYmplY3QuIik7DQotICAgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjtcbn1cbiIpOw0KLSAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwicmV0dXJuIG1ldGhvZF9yZXR1cm5fdmFsdWU7XG4iKTsNCi0gICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbikuY2FsbCh0aGlzKSIpOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiLCAiKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiIpOw0KKyAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiwgIik7DQorICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK30NCitDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb246OkNYRkFfRk1NZXRob2RDYWxsRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBBY2Nlc3NvckV4cDEsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwQ2FsbEV4cCkNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBUT0tkb3QsIHBBY2Nlc3NvckV4cDEsIHBDYWxsRXhwKSB7fQ0KK3ZvaWQgQ1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKFxuZnVuY3Rpb24gKClcbntcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciBtZXRob2RfcmV0dXJuX3ZhbHVlID0gbnVsbDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciBhY2Nlc3Nvcl9vYmplY3QgPSAiKTsNCisgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJpZiAoIik7DQorICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbSVNGTUFSUkFZXTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoYWNjZXNzb3Jfb2JqZWN0KSlcbntcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQygNCisgICAgICBMImZvcih2YXIgaW5kZXggPSBhY2Nlc3Nvcl9vYmplY3QubGVuZ3RoIC0gMTsgaW5kZXggPiAxOyBpbmRleC0tKVxue1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwibWV0aG9kX3JldHVybl92YWx1ZSA9IGFjY2Vzc29yX29iamVjdFtpbmRleF0uIik7DQorICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiO1xufVxufVxuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZWxzZVxue1xubWV0aG9kX3JldHVybl92YWx1ZSA9IGFjY2Vzc29yX29iamVjdC4iKTsNCisgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG59XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJyZXR1cm4gbWV0aG9kX3JldHVybl92YWx1ZTtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbikuY2FsbCh0aGlzKSIpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmgKaW5kZXggYTY2NDYxZC4uYTQ4ZmJlOCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbi5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb24uaApAQCAtNywyMzMgKzcsMjYzIEBACiAjaWZuZGVmIF9YRkFfRk1fU0lNUExFRVhQUkVTU0lPTl9IDQogI2RlZmluZSBfWEZBX0ZNX1NJTVBMRUVYUFJFU1NJT05fSA0KIGVudW0gWEZBX0ZNX1NpbXBsZUV4cHJlc3Npb25UeXBlIHsNCi0gICAgQVNTSUdOLA0KLSAgICBMT0dJQ0FMT1IsDQotICAgIExPR0lDQUxBTkQsDQotICAgIEVRVUFMSVRZLA0KLSAgICBOT1RFUVVBTElUWSwNCi0gICAgTEVTUywNCi0gICAgTEVTU0VRVUFMLA0KLSAgICBHUkVBVEVSLA0KLSAgICBHUkVBVEVSRVFVQUwsDQotICAgIFBMVVMsDQotICAgIE1JTlVTLA0KLSAgICBNVUxUSVBMRSwNCi0gICAgRElWSURFLA0KLSAgICBQT1NJVElWRSwNCi0gICAgTkVHQVRJVkUsDQotICAgIE5PVCwNCi0gICAgQ0FMTCwNCi0gICAgRE9ULA0KLSAgICBET1RET1QsDQotICAgIENPTkNBVEZNT0JKRUNULA0KLSAgICBJU0ZNT0JKRUNULA0KLSAgICBJU0ZNQVJSQVksDQotICAgIEdFVEZNVkFMVUUsDQotICAgIEdFVEZNSlNPQkosDQotICAgIFZBUkZJTFRFUg0KKyAgQVNTSUdOLA0KKyAgTE9HSUNBTE9SLA0KKyAgTE9HSUNBTEFORCwNCisgIEVRVUFMSVRZLA0KKyAgTk9URVFVQUxJVFksDQorICBMRVNTLA0KKyAgTEVTU0VRVUFMLA0KKyAgR1JFQVRFUiwNCisgIEdSRUFURVJFUVVBTCwNCisgIFBMVVMsDQorICBNSU5VUywNCisgIE1VTFRJUExFLA0KKyAgRElWSURFLA0KKyAgUE9TSVRJVkUsDQorICBORUdBVElWRSwNCisgIE5PVCwNCisgIENBTEwsDQorICBET1QsDQorICBET1RET1QsDQorICBDT05DQVRGTU9CSkVDVCwNCisgIElTRk1PQkpFQ1QsDQorICBJU0ZNQVJSQVksDQorICBHRVRGTVZBTFVFLA0KKyAgR0VURk1KU09CSiwNCisgIFZBUkZJTFRFUg0KIH07DQotQ0ZYX1dpZGVTdHJpbmdDIFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoWEZBX0ZNX1NpbXBsZUV4cHJlc3Npb25UeXBlIHNpbXBsZUV4cFR5cGUpOw0KK0NGWF9XaWRlU3RyaW5nQyBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKA0KKyAgICBYRkFfRk1fU2ltcGxlRXhwcmVzc2lvblR5cGUgc2ltcGxlRXhwVHlwZSk7DQogc3RydWN0IFhGQV9GTUJ1aWxkSW5GdW5jIHsNCi0gICAgdWludDMyX3QJCW1fdUhhc2g7DQotICAgIGNvbnN0IEZYX1dDSEFSKgkJbV9idWlsZGluZnVuYzsNCisgIHVpbnQzMl90IG1fdUhhc2g7DQorICBjb25zdCBGWF9XQ0hBUiogbV9idWlsZGluZnVuYzsNCiB9Ow0KIHN0cnVjdCBYRkFfRk1TT01NZXRob2Qgew0KLSAgICB1aW50MzJfdAkJbV91SGFzaDsNCi0gICAgY29uc3QgRlhfV0NIQVIqCQltX3dzU29tTWV0aG9kTmFtZTsNCi0gICAgRlhfRFdPUkQJCW1fZFBhcmFtZXRlcnM7DQorICB1aW50MzJfdCBtX3VIYXNoOw0KKyAgY29uc3QgRlhfV0NIQVIqIG1fd3NTb21NZXRob2ROYW1lOw0KKyAgRlhfRFdPUkQgbV9kUGFyYW1ldGVyczsNCiB9Ow0KIGVudW0gWEZBX0ZNX0FjY2Vzc29ySW5kZXggew0KLSAgICBBQ0NFU1NPUl9OT19JTkRFWCwNCi0gICAgQUNDRVNTT1JfTk9fUkVMQVRJVkVJTkRFWCwNCi0gICAgQUNDRVNTT1JfUE9TSVRJVkVfSU5ERVgsDQotICAgIEFDQ0VTU09SX05FR0FUSVZFX0lOREVYDQorICBBQ0NFU1NPUl9OT19JTkRFWCwNCisgIEFDQ0VTU09SX05PX1JFTEFUSVZFSU5ERVgsDQorICBBQ0NFU1NPUl9QT1NJVElWRV9JTkRFWCwNCisgIEFDQ0VTU09SX05FR0FUSVZFX0lOREVYDQogfTsNCi1jbGFzcyBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1TaW1wbGVFeHByZXNzaW9uKCkge307DQotICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorY2xhc3MgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fVE9LRU4gb3ApOw0KKyAgdmlydHVhbCB+Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQogDQotICAgIFhGQV9GTV9UT0tFTiBHZXRPcGVyYXRvclRva2VuKCkgY29uc3Q7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9EV09SRCBtX2xpbmU7DQotICAgIFhGQV9GTV9UT0tFTiBtX29wOw0KKyAgWEZBX0ZNX1RPS0VOIEdldE9wZXJhdG9yVG9rZW4oKSBjb25zdDsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfRFdPUkQgbV9saW5lOw0KKyAgWEZBX0ZNX1RPS0VOIG1fb3A7DQogfTsNCi1jbGFzcyBDWEZBX0ZNTnVsbEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24NCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZNTnVsbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1OdWxsRXhwcmVzc2lvbigpIHt9Ow0KLSAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorY2xhc3MgQ1hGQV9GTU51bGxFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTU51bGxFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTU51bGxFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCiB9Ow0KLWNsYXNzIENYRkFfRk1OdW1iZXJFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTU51bWJlckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ0ZYX1dpZGVTdHJpbmdDIHdzTnVtYmVyKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GTU51bWJlckV4cHJlc3Npb24oKSB7fTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NOdW1iZXI7DQorY2xhc3MgQ1hGQV9GTU51bWJlckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDRlhfV2lkZVN0cmluZ0Mgd3NOdW1iZXIpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTU51bWJlckV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c051bWJlcjsNCiB9Ow0KLWNsYXNzIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTVN0cmluZ0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ0ZYX1dpZGVTdHJpbmdDIHdzU3RyaW5nKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GTVN0cmluZ0V4cHJlc3Npb24oKSB7fTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NTdHJpbmc7DQorY2xhc3MgQ1hGQV9GTVN0cmluZ0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDRlhfV2lkZVN0cmluZ0Mgd3NTdHJpbmcpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTVN0cmluZ0V4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c1N0cmluZzsNCiB9Ow0KLWNsYXNzIENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbm4gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24NCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uKEZYX0RXT1JEIGxpbmUsIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXIpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uKCkge307DQotICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCi1wcm90ZWN0ZWQ6DQotICAgIENGWF9XaWRlU3RyaW5nQyBtX3dzSWRlbnRpZmllcjsNCitjbGFzcyBDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubihGWF9EV09SRCBsaW5lLCBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbm4oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c0lkZW50aWZpZXI7DQogfTsNCi1jbGFzcyBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fVE9LRU4gb3AsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GTVVuYXJ5RXhwcmVzc2lvbigpOw0KLSAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQotcHJvdGVjdGVkOg0KLSAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqbV9wRXhwOw0KK2NsYXNzIENYRkFfRk1VbmFyeUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHApOw0KKyAgdmlydHVhbCB+Q1hGQV9GTVVuYXJ5RXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogbV9wRXhwOw0KIH07DQotY2xhc3MgQ1hGQV9GTUJpbkV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24NCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZNQmluRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fVE9LRU4gb3AsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAyKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GTUJpbkV4cHJlc3Npb24oKTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLXByb3RlY3RlZDoNCi0gICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKm1fcEV4cDE7DQotICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICptX3BFeHAyOw0KK2NsYXNzIENYRkFfRk1CaW5FeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUJpbkV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMik7DQorICB2aXJ0dWFsIH5DWEZBX0ZNQmluRXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogbV9wRXhwMTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBtX3BFeHAyOw0KIH07DQotY2xhc3MgQ1hGQV9GTUFzc2lnbkV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24NCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fVE9LRU4gb3AsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAyKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GTUFzc2lnbkV4cHJlc3Npb24oKSB7fTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLSAgICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCitjbGFzcyBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDIpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTUFzc2lnbkV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQogfTsNCi1jbGFzcyBDWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbigpIHt9Ow0KLSAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorY2xhc3MgQ1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAyKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCiB9Ow0KLWNsYXNzIENYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fVE9LRU4gb3AsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAyKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uKCkge307DQotICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCitjbGFzcyBDWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMik7DQorICB2aXJ0dWFsIH5DWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KIH07DQotY2xhc3MgQ1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMik7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24oKSB7fTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK2NsYXNzIENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDIpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbigpe307DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQogfTsNCi1jbGFzcyBDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24NCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMik7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbigpIHt9Ow0KLSAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorY2xhc3MgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDIpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCiB9Ow0KLWNsYXNzIENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24NCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZNQWRkaXRpdmVFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIFhGQV9GTV9UT0tFTiBvcCwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDIpOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZNQWRkaXRpdmVFeHByZXNzaW9uKCkge307DQotICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCitjbGFzcyBDWEZBX0ZNQWRkaXRpdmVFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAyKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KIH07DQotY2xhc3MgQ1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMik7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSB7fTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK2NsYXNzIENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDIpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpe307DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQogfTsNCi1jbGFzcyBDWEZBX0ZNUG9zRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTVBvc0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBFeHApOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZNUG9zRXhwcmVzc2lvbigpIHt9Ow0KLSAgICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorY2xhc3MgQ1hGQV9GTVBvc0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1Qb3NFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1Qb3NFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCiB9Ow0KLWNsYXNzIENYRkFfRk1OZWdFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1VbmFyeUV4cHJlc3Npb24NCi17DQotcHVibGljOg0KLSAgICBDWEZBX0ZNTmVnRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cCk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1OZWdFeHByZXNzaW9uKCkge307DQotICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCitjbGFzcyBDWEZBX0ZNTmVnRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTU5lZ0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHApOw0KKyAgdmlydHVhbCB+Q1hGQV9GTU5lZ0V4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KIH07DQotY2xhc3MgQ1hGQV9GTU5vdEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1Ob3RFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwKTsNCi0gICAgdmlydHVhbCB+Q1hGQV9GTU5vdEV4cHJlc3Npb24oKSB7fTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK2NsYXNzIENYRkFfRk1Ob3RFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1VbmFyeUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTm90RXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cCk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNTm90RXhwcmVzc2lvbigpe307DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQogfTsNCi1jbGFzcyBDWEZBX0ZNQ2FsbEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRk1DYWxsRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cCwgQ0ZYX1B0ckFycmF5ICpwQXJndW1lbnRzLCBGWF9CT09MIGJJc1NvbU1ldGhvZCk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1DYWxsRXhwcmVzc2lvbigpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgSXNCdWlsZEluRnVuYyhDRlhfV2lkZVRleHRCdWYmIGZ1bmNOYW1lKTsNCi0gICAgdmlydHVhbCBGWF9EV09SRCBJc1NvbU1ldGhvZFdpdGhPYmpQYXJhKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbWV0aG9kTmFtZSk7DQotICAgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCi1wcml2YXRlOg0KLSAgICBGWF9CT09MIG1fYklzU29tTWV0aG9kOw0KLSAgICBDRlhfUHRyQXJyYXkgKm1fcEFyZ3VtZW50czsNCitjbGFzcyBDWEZBX0ZNQ2FsbEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1DYWxsRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogcEFyZ3VtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc1NvbU1ldGhvZCk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNQ2FsbEV4cHJlc3Npb24oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0J1aWxkSW5GdW5jKENGWF9XaWRlVGV4dEJ1ZiYgZnVuY05hbWUpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBJc1NvbU1ldGhvZFdpdGhPYmpQYXJhKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbWV0aG9kTmFtZSk7DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorDQorIHByaXZhdGU6DQorICBGWF9CT09MIG1fYklzU29tTWV0aG9kOw0KKyAgQ0ZYX1B0ckFycmF5KiBtX3BBcmd1bWVudHM7DQogfTsNCi1jbGFzcyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEFjY2Vzc29yLCBYRkFfRk1fVE9LRU4gb3AsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllciwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBJbmRleEV4cCk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24oKSB7fTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NJZGVudGlmaWVyOw0KK2NsYXNzIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwQWNjZXNzb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBJbmRleEV4cCk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NJZGVudGlmaWVyOw0KIH07DQotY2xhc3MgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fQWNjZXNzb3JJbmRleCBhY2Nlc3NvckluZGV4LCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEluZGV4RXhwLCBGWF9CT09MIGJJc1N0YXJJbmRleCk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1JbmRleEV4cHJlc3Npb24oKSB7fTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLXByb3RlY3RlZDoNCi0gICAgWEZBX0ZNX0FjY2Vzc29ySW5kZXggbV9hY2Nlc3NvckluZGV4Ow0KLSAgICBGWF9CT09MIG1fYklzU3RhckluZGV4Ow0KK2NsYXNzIENYRkFfRk1JbmRleEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1JbmRleEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX0FjY2Vzc29ySW5kZXggYWNjZXNzb3JJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBJbmRleEV4cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNTdGFySW5kZXgpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTUluZGV4RXhwcmVzc2lvbigpe307DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorDQorIHByb3RlY3RlZDoNCisgIFhGQV9GTV9BY2Nlc3NvckluZGV4IG1fYWNjZXNzb3JJbmRleDsNCisgIEZYX0JPT0wgbV9iSXNTdGFySW5kZXg7DQogfTsNCi1jbGFzcyBDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEFjY2Vzc29yLCBYRkFfRk1fVE9LRU4gb3AsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllciwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gKnBJbmRleEV4cCk7DQotICAgIHZpcnR1YWwgfkNYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24oKSB7fTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NJZGVudGlmaWVyOw0KK2NsYXNzIENYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwQWNjZXNzb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBJbmRleEV4cCk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NJZGVudGlmaWVyOw0KIH07DQotY2xhc3MgQ1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwQWNjZXNzb3JFeHAxLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcENhbGxFeHApOw0KLSAgICB2aXJ0dWFsIH5DWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24oKSB7fTsNCi0gICAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KLXByb3RlY3RlZDoNCitjbGFzcyBDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEFjY2Vzc29yRXhwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcENhbGxFeHApOw0KKyAgdmlydHVhbCB+Q1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisNCisgcHJvdGVjdGVkOg0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2RhdGEuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2RhdGEuY3BwCmluZGV4IGE1MzA0MWUuLjk5YjAyYjggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19kYXRhLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5jcHAKQEAgLTI1LDI3MyArMjUsMjc1IEBACiAjaW5jbHVkZSAieGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oIg0KIGV4dGVybiBjb25zdCBYRkFfQVRUUklCVVRFRU5VTUlORk8gZ19YRkFFbnVtRGF0YVtdID0gew0KICAgICB7MHgyYSwgTCIqIiwgWEZBX0FUVFJJQlVURUVOVU1fQXN0ZXJpc2t9LA0KLQl7MHgyZiwgTCIvIiwgWEZBX0FUVFJJQlVURUVOVU1fU2xhc2h9LA0KLQl7MHg1YywgTCJcXCIsIFhGQV9BVFRSSUJVVEVFTlVNX0JhY2tzbGFzaH0sDQorICAgIHsweDJmLCBMIi8iLCBYRkFfQVRUUklCVVRFRU5VTV9TbGFzaH0sDQorICAgIHsweDVjLCBMIlxcIiwgWEZBX0FUVFJJQlVURUVOVU1fQmFja3NsYXNofSwNCiAgICAgezB4MjM5YmQsIEwib24iLCBYRkFfQVRUUklCVVRFRU5VTV9Pbn0sDQotCXsweDI1MzU2LCBMInRiIiwgWEZBX0FUVFJJQlVURUVOVU1fVGJ9LA0KLQl7MHgyNTg4NSwgTCJ1cCIsIFhGQV9BVFRSSUJVVEVFTlVNX1VwfSwNCisgICAgezB4MjUzNTYsIEwidGIiLCBYRkFfQVRUUklCVVRFRU5VTV9UYn0sDQorICAgIHsweDI1ODg1LCBMInVwIiwgWEZBX0FUVFJJQlVURUVOVU1fVXB9LA0KICAgICB7MHg5MWIyODEsIEwibWV0YURhdGEiLCBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YX0sDQotCXsweDFmOGRlZGIsIEwiZGVsZWdhdGUiLCBYRkFfQVRUUklCVVRFRU5VTV9EZWxlZ2F0ZX0sDQotCXsweDJhNmM1NWEsIEwicG9zdFN1Ym1pdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTdWJtaXR9LA0KKyAgICB7MHgxZjhkZWRiLCBMImRlbGVnYXRlIiwgWEZBX0FUVFJJQlVURUVOVU1fRGVsZWdhdGV9LA0KKyAgICB7MHgyYTZjNTVhLCBMInBvc3RTdWJtaXQiLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U3VibWl0fSwNCiAgICAgezB4MzFiMTljMSwgTCJuYW1lIiwgWEZBX0FUVFJJQlVURUVOVU1fTmFtZX0sDQotCXsweDM3OGEzOGEsIEwiY3Jvc3MiLCBYRkFfQVRUUklCVVRFRU5VTV9Dcm9zc30sDQotCXsweDM4NDhiM2YsIEwibmV4dCIsIFhGQV9BVFRSSUJVVEVFTlVNX05leHR9LA0KKyAgICB7MHgzNzhhMzhhLCBMImNyb3NzIiwgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3N9LA0KKyAgICB7MHgzODQ4YjNmLCBMIm5leHQiLCBYRkFfQVRUUklCVVRFRU5VTV9OZXh0fSwNCiAgICAgezB4NDhiNjY3MCwgTCJub25lIiwgWEZBX0FUVFJJQlVURUVOVU1fTm9uZX0sDQotCXsweDUxYWFmZTUsIEwic2hvcnRFZGdlIiwgWEZBX0FUVFJJQlVURUVOVU1fU2hvcnRFZGdlfSwNCi0JezB4NTUyNjRjNCwgTCIxbW9kMTBfMW1vZDExIiwgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwXzFtb2QxMX0sDQorICAgIHsweDUxYWFmZTUsIEwic2hvcnRFZGdlIiwgWEZBX0FUVFJJQlVURUVOVU1fU2hvcnRFZGdlfSwNCisgICAgezB4NTUyNjRjNCwgTCIxbW9kMTBfMW1vZDExIiwgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwXzFtb2QxMX0sDQogICAgIHsweDVhNWM1MTksIEwiaGVpZ2h0IiwgWEZBX0FUVFJJQlVURUVOVU1fSGVpZ2h0fSwNCi0JezB4ODljZTU0OSwgTCJjcm9zc0RpYWdvbmFsIiwgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3NEaWFnb25hbH0sDQotCXsweDlmOWQwZjksIEwiYWxsIiwgWEZBX0FUVFJJQlVURUVOVU1fQWxsfSwNCisgICAgezB4ODljZTU0OSwgTCJjcm9zc0RpYWdvbmFsIiwgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3NEaWFnb25hbH0sDQorICAgIHsweDlmOWQwZjksIEwiYWxsIiwgWEZBX0FUVFJJQlVURUVOVU1fQWxsfSwNCiAgICAgezB4OWY5ZGI0OCwgTCJhbnkiLCBYRkFfQVRUUklCVVRFRU5VTV9Bbnl9LA0KLQl7MHhhMTI2MjYxLCBMInRvUmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub1JpZ2h0fSwNCi0JezB4YTM2ZGUyOSwgTCJtYXRjaFRlbXBsYXRlIiwgWEZBX0FUVFJJQlVURUVOVU1fTWF0Y2hUZW1wbGF0ZX0sDQorICAgIHsweGExMjYyNjEsIEwidG9SaWdodCIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvUmlnaHR9LA0KKyAgICB7MHhhMzZkZTI5LCBMIm1hdGNoVGVtcGxhdGUiLCBYRkFfQVRUUklCVVRFRU5VTV9NYXRjaFRlbXBsYXRlfSwNCiAgICAgezB4YTQ4ZDA0MCwgTCJkcGwiLCBYRkFfQVRUUklCVVRFRU5VTV9EcGx9LA0KLQl7MHhhNTU5YzA1LCBMImludmlzaWJsZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0ludmlzaWJsZX0sDQotCXsweGE3ZDQ4ZTMsIEwiZml0IiwgWEZBX0FUVFJJQlVURUVOVU1fRml0fSwNCisgICAgezB4YTU1OWMwNSwgTCJpbnZpc2libGUiLCBYRkFfQVRUUklCVVRFRU5VTV9JbnZpc2libGV9LA0KKyAgICB7MHhhN2Q0OGUzLCBMImZpdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0ZpdH0sDQogICAgIHsweGE4YThmODAsIEwid2lkdGgiLCBYRkFfQVRUUklCVVRFRU5VTV9XaWR0aH0sDQotCXsweGFiNDY2YmIsIEwicHJlU3VibWl0IiwgWEZBX0FUVFJJQlVURUVOVU1fUHJlU3VibWl0fSwNCi0JezB4YWNjNTc4NSwgTCJpcGwiLCBYRkFfQVRUUklCVVRFRU5VTV9JcGx9LA0KKyAgICB7MHhhYjQ2NmJiLCBMInByZVN1Ym1pdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVN1Ym1pdH0sDQorICAgIHsweGFjYzU3ODUsIEwiaXBsIiwgWEZBX0FUVFJJQlVURUVOVU1fSXBsfSwNCiAgICAgezB4YWZhYjBmOCwgTCJmbGF0ZUNvbXByZXNzIiwgWEZBX0FUVFJJQlVURUVOVU1fRmxhdGVDb21wcmVzc30sDQotCXsweGIzNTU4MTYsIEwibWVkIiwgWEZBX0FUVFJJQlVURUVOVU1fTWVkfSwNCi0JezB4YjY5ZWY3NywgTCJvZGQiLCBYRkFfQVRUUklCVVRFRU5VTV9PZGR9LA0KKyAgICB7MHhiMzU1ODE2LCBMIm1lZCIsIFhGQV9BVFRSSUJVVEVFTlVNX01lZH0sDQorICAgIHsweGI2OWVmNzcsIEwib2RkIiwgWEZBX0FUVFJJQlVURUVOVU1fT2RkfSwNCiAgICAgezB4YjY5ZjliYiwgTCJvZmYiLCBYRkFfQVRUUklCVVRFRU5VTV9PZmZ9LA0KLQl7MHhiODQzZGJhLCBMInBkZiIsIFhGQV9BVFRSSUJVVEVFTlVNX1BkZn0sDQotCXsweGJiOTEyYjgsIEwicm93IiwgWEZBX0FUVFJJQlVURUVOVU1fUm93fSwNCisgICAgezB4Yjg0M2RiYSwgTCJwZGYiLCBYRkFfQVRUUklCVVRFRU5VTV9QZGZ9LA0KKyAgICB7MHhiYjkxMmI4LCBMInJvdyIsIFhGQV9BVFRSSUJVVEVFTlVNX1Jvd30sDQogICAgIHsweGJlZGFmMzMsIEwidG9wIiwgWEZBX0FUVFJJQlVURUVOVU1fVG9wfSwNCi0JezB4YzU2YWZjYywgTCJ4ZHAiLCBYRkFfQVRUUklCVVRFRU5VTV9YZHB9LA0KLQl7MHhjNTZiYTAyLCBMInhmZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1hmZH0sDQorICAgIHsweGM1NmFmY2MsIEwieGRwIiwgWEZBX0FUVFJJQlVURUVOVU1fWGRwfSwNCisgICAgezB4YzU2YmEwMiwgTCJ4ZmQiLCBYRkFfQVRUUklCVVRFRU5VTV9YZmR9LA0KICAgICB7MHhjNTZkZGYxLCBMInhtbCIsIFhGQV9BVFRSSUJVVEVFTlVNX1htbH0sDQotCXsweGM4YjY1ZjMsIEwiemlwIiwgWEZBX0FUVFJJQlVURUVOVU1fWmlwfSwNCi0JezB4YzhiODlkNiwgTCJ6cGwiLCBYRkFfQVRUUklCVVRFRU5VTV9acGx9LA0KKyAgICB7MHhjOGI2NWYzLCBMInppcCIsIFhGQV9BVFRSSUJVVEVFTlVNX1ppcH0sDQorICAgIHsweGM4Yjg5ZDYsIEwienBsIiwgWEZBX0FUVFJJQlVURUVOVU1fWnBsfSwNCiAgICAgezB4ZjU1ZDdlZSwgTCJ2aXNpYmxlIiwgWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZX0sDQotCXsweGZlMzU5NmEsIEwiZXhjbHVkZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0V4Y2x1ZGV9LA0KLQl7MHgxMDlkN2NlNywgTCJtb3VzZUVudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFbnRlcn0sDQorICAgIHsweGZlMzU5NmEsIEwiZXhjbHVkZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0V4Y2x1ZGV9LA0KKyAgICB7MHgxMDlkN2NlNywgTCJtb3VzZUVudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFbnRlcn0sDQogICAgIHsweDEwZjFiYzBjLCBMInBhaXIiLCBYRkFfQVRUUklCVVRFRU5VTV9QYWlyfSwNCi0JezB4MTE1NGVmZTYsIEwiZmlsdGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fRmlsdGVyfSwNCi0JezB4MTI1YmM5NGIsIEwibW92ZUxhc3QiLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3ZlTGFzdH0sDQorICAgIHsweDExNTRlZmU2LCBMImZpbHRlciIsIFhGQV9BVFRSSUJVVEVFTlVNX0ZpbHRlcn0sDQorICAgIHsweDEyNWJjOTRiLCBMIm1vdmVMYXN0IiwgWEZBX0FUVFJJQlVURUVOVU1fTW92ZUxhc3R9LA0KICAgICB7MHgxMmUxZjFmMCwgTCJleHBvcnRBbmRJbXBvcnQiLCBYRkFfQVRUUklCVVRFRU5VTV9FeHBvcnRBbmRJbXBvcnR9LA0KLQl7MHgxMzAwMGM2MCwgTCJwdXNoIiwgWEZBX0FUVFJJQlVURUVOVU1fUHVzaH0sDQotCXsweDEzOGVlMzE1LCBMInBvcnRyYWl0IiwgWEZBX0FUVFJJQlVURUVOVU1fUG9ydHJhaXR9LA0KKyAgICB7MHgxMzAwMGM2MCwgTCJwdXNoIiwgWEZBX0FUVFJJQlVURUVOVU1fUHVzaH0sDQorICAgIHsweDEzOGVlMzE1LCBMInBvcnRyYWl0IiwgWEZBX0FUVFJJQlVURUVOVU1fUG9ydHJhaXR9LA0KICAgICB7MHgxNGRhMjEyNSwgTCJkZWZhdWx0IiwgWEZBX0FUVFJJQlVURUVOVU1fRGVmYXVsdH0sDQotCXsweDE1Nzc0OWE1LCBMInN0b3JlZFByb2MiLCBYRkFfQVRUUklCVVRFRU5VTV9TdG9yZWRQcm9jfSwNCi0JezB4MTY2NDExOTgsIEwic3RheUJPRiIsIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXlCT0Z9LA0KKyAgICB7MHgxNTc3NDlhNSwgTCJzdG9yZWRQcm9jIiwgWEZBX0FUVFJJQlVURUVOVU1fU3RvcmVkUHJvY30sDQorICAgIHsweDE2NjQxMTk4LCBMInN0YXlCT0YiLCBYRkFfQVRUUklCVVRFRU5VTV9TdGF5Qk9GfSwNCiAgICAgezB4MTZiMmZjNWIsIEwic3RheUVPRiIsIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXlFT0Z9LA0KLQl7MHgxN2ZhZDM3MywgTCJwb3N0UHJpbnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0UHJpbnR9LA0KLQl7MHgxOTMyMDdkMCwgTCJ1c0NhcnJpZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9Vc0NhcnJpZXJ9LA0KKyAgICB7MHgxN2ZhZDM3MywgTCJwb3N0UHJpbnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0UHJpbnR9LA0KKyAgICB7MHgxOTMyMDdkMCwgTCJ1c0NhcnJpZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9Vc0NhcnJpZXJ9LA0KICAgICB7MHgxOTNhZGUzZSwgTCJyaWdodCIsIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0fSwNCi0JezB4MWJmYzcyZDksIEwicHJlT3BlbiIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZU9wZW59LA0KLQl7MHgxY2M5MzE3YSwgTCJhY3R1YWwiLCBYRkFfQVRUUklCVVRFRU5VTV9BY3R1YWx9LA0KKyAgICB7MHgxYmZjNzJkOSwgTCJwcmVPcGVuIiwgWEZBX0FUVFJJQlVURUVOVU1fUHJlT3Blbn0sDQorICAgIHsweDFjYzkzMTdhLCBMImFjdHVhbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0FjdHVhbH0sDQogICAgIHsweDFmMzFkZjFlLCBMInJlc3QiLCBYRkFfQVRUUklCVVRFRU5VTV9SZXN0fSwNCi0JezB4MWZiMWJmMTQsIEwidG9wQ2VudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fVG9wQ2VudGVyfSwNCi0JezB4MjA3ZGU2NjcsIEwic3RhbmRhcmRTeW1ib2wiLCBYRkFfQVRUUklCVVRFRU5VTV9TdGFuZGFyZFN5bWJvbH0sDQorICAgIHsweDFmYjFiZjE0LCBMInRvcENlbnRlciIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvcENlbnRlcn0sDQorICAgIHsweDIwN2RlNjY3LCBMInN0YW5kYXJkU3ltYm9sIiwgWEZBX0FUVFJJQlVURUVOVU1fU3RhbmRhcmRTeW1ib2x9LA0KICAgICB7MHgyMTk2YTQ1MiwgTCJpbml0aWFsaXplIiwgWEZBX0FUVFJJQlVURUVOVU1fSW5pdGlhbGl6ZX0sDQotCXsweDIzYmQ0MGM3LCBMImp1c3RpZnlBbGwiLCBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsfSwNCi0JezB4MjQ3Y2YzZTksIEwibm9ybWFsIiwgWEZBX0FUVFJJQlVURUVOVU1fTm9ybWFsfSwNCisgICAgezB4MjNiZDQwYzcsIEwianVzdGlmeUFsbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnlBbGx9LA0KKyAgICB7MHgyNDdjZjNlOSwgTCJub3JtYWwiLCBYRkFfQVRUUklCVVRFRU5VTV9Ob3JtYWx9LA0KICAgICB7MHgyNWFhOTQ2YiwgTCJsYW5kc2NhcGUiLCBYRkFfQVRUUklCVVRFRU5VTV9MYW5kc2NhcGV9LA0KLQl7MHgyNzM5YjVjOSwgTCJub25JbnRlcmFjdGl2ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX05vbkludGVyYWN0aXZlfSwNCi0JezB4Mjc0MTBmMDMsIEwibW91c2VFeGl0IiwgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFeGl0fSwNCisgICAgezB4MjczOWI1YzksIEwibm9uSW50ZXJhY3RpdmUiLCBYRkFfQVRUUklCVVRFRU5VTV9Ob25JbnRlcmFjdGl2ZX0sDQorICAgIHsweDI3NDEwZjAzLCBMIm1vdXNlRXhpdCIsIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRXhpdH0sDQogICAgIHsweDI4NTRlNjJjLCBMIm1pbnVzIiwgWEZBX0FUVFJJQlVURUVOVU1fTWludXN9LA0KLQl7MHgyODdlOTM2YSwgTCJkaWFnb25hbExlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbExlZnR9LA0KLQl7MHgyOTcyYTk4ZiwgTCJzaW1wbGV4UGFnaW5hdGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxleFBhZ2luYXRlZH0sDQorICAgIHsweDI4N2U5MzZhLCBMImRpYWdvbmFsTGVmdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0RpYWdvbmFsTGVmdH0sDQorICAgIHsweDI5NzJhOThmLCBMInNpbXBsZXhQYWdpbmF0ZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9TaW1wbGV4UGFnaW5hdGVkfSwNCiAgICAgezB4MjlkODIyNWYsIEwiZG9jdW1lbnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Eb2N1bWVudH0sDQotCXsweDJhOWQzMDE2LCBMIndhcm5pbmciLCBYRkFfQVRUUklCVVRFRU5VTV9XYXJuaW5nfSwNCi0JezB4MmIzNWI2ZDksIEwiYXV0byIsIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG99LA0KKyAgICB7MHgyYTlkMzAxNiwgTCJ3YXJuaW5nIiwgWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZ30sDQorICAgIHsweDJiMzViNmQ5LCBMImF1dG8iLCBYRkFfQVRUUklCVVRFRU5VTV9BdXRvfSwNCiAgICAgezB4MmMxNjUzZDksIEwiYmVsb3ciLCBYRkFfQVRUUklCVVRFRU5VTV9CZWxvd30sDQotCXsweDJjMWYwNTQwLCBMImJvdHRvbUxlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21MZWZ0fSwNCi0JezB4MmM0NGU4MTYsIEwiYm90dG9tQ2VudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tQ2VudGVyfSwNCisgICAgezB4MmMxZjA1NDAsIEwiYm90dG9tTGVmdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUxlZnR9LA0KKyAgICB7MHgyYzQ0ZTgxNiwgTCJib3R0b21DZW50ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21DZW50ZXJ9LA0KICAgICB7MHgyY2QzZTlmMywgTCJ0Y3BsIiwgWEZBX0FUVFJJQlVURUVOVU1fVGNwbH0sDQotCXsweDJkMDhhZjg1LCBMInRleHQiLCBYRkFfQVRUUklCVVRFRU5VTV9UZXh0fSwNCi0JezB4MmRjNDc4ZWIsIEwiZ3JvdXBpbmciLCBYRkFfQVRUUklCVVRFRU5VTV9Hcm91cGluZ30sDQorICAgIHsweDJkMDhhZjg1LCBMInRleHQiLCBYRkFfQVRUUklCVVRFRU5VTV9UZXh0fSwNCisgICAgezB4MmRjNDc4ZWIsIEwiZ3JvdXBpbmciLCBYRkFfQVRUUklCVVRFRU5VTV9Hcm91cGluZ30sDQogICAgIHsweDJlZjNhZmRkLCBMInNlY3VyZVN5bWJvbCIsIFhGQV9BVFRSSUJVVEVFTlVNX1NlY3VyZVN5bWJvbH0sDQotCXsweDJmMmRkMjlhLCBMInByZUV4ZWN1dGUiLCBYRkFfQVRUUklCVVRFRU5VTV9QcmVFeGVjdXRlfSwNCi0JezB4MzNjNDNkZWMsIEwiZG9jQ2xvc2UiLCBYRkFfQVRUUklCVVRFRU5VTV9Eb2NDbG9zZX0sDQorICAgIHsweDJmMmRkMjlhLCBMInByZUV4ZWN1dGUiLCBYRkFfQVRUUklCVVRFRU5VTV9QcmVFeGVjdXRlfSwNCisgICAgezB4MzNjNDNkZWMsIEwiZG9jQ2xvc2UiLCBYRkFfQVRUUklCVVRFRU5VTV9Eb2NDbG9zZX0sDQogICAgIHsweDMzZjI1YmI1LCBMImtleXNldCIsIFhGQV9BVFRSSUJVVEVFTlVNX0tleXNldH0sDQotCXsweDM0ZTM2M2RhLCBMInZlcnRpY2FsIiwgWEZBX0FUVFJJQlVURUVOVU1fVmVydGljYWx9LA0KLQl7MHgzNjFmYTFiNiwgTCJwcmVTYXZlIiwgWEZBX0FUVFJJQlVURUVOVU1fUHJlU2F2ZX0sDQorICAgIHsweDM0ZTM2M2RhLCBMInZlcnRpY2FsIiwgWEZBX0FUVFJJQlVURUVOVU1fVmVydGljYWx9LA0KKyAgICB7MHgzNjFmYTFiNiwgTCJwcmVTYXZlIiwgWEZBX0FUVFJJQlVURUVOVU1fUHJlU2F2ZX0sDQogICAgIHsweDM2ZjFjNmQ4LCBMInByZVNpZ24iLCBYRkFfQVRUUklCVVRFRU5VTV9QcmVTaWdufSwNCi0JezB4Mzk5ZjAyYjUsIEwiYm90dG9tIiwgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tfSwNCi0JezB4M2IwYWIwOTYsIEwidG9Ub3AiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub1RvcH0sDQorICAgIHsweDM5OWYwMmI1LCBMImJvdHRvbSIsIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbX0sDQorICAgIHsweDNiMGFiMDk2LCBMInRvVG9wIiwgWEZBX0FUVFJJQlVURUVOVU1fVG9Ub3B9LA0KICAgICB7MHgzYzc1MjQ5NSwgTCJ2ZXJpZnkiLCBYRkFfQVRUUklCVVRFRU5VTV9WZXJpZnl9LA0KLQl7MHgzY2UwNWQ2OCwgTCJmaXJzdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0fSwNCi0JezB4M2VjZWFkOTQsIEwiY29udGVudEFyZWEiLCBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYX0sDQorICAgIHsweDNjZTA1ZDY4LCBMImZpcnN0IiwgWEZBX0FUVFJJQlVURUVOVU1fRmlyc3R9LA0KKyAgICB7MHgzZWNlYWQ5NCwgTCJjb250ZW50QXJlYSIsIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhfSwNCiAgICAgezB4NDA2MjNiNWIsIEwic29saWQiLCBYRkFfQVRUUklCVVRFRU5VTV9Tb2xpZH0sDQotCXsweDQyYzZjZDhkLCBMInBlc3NpbWlzdGljIiwgWEZBX0FUVFJJQlVURUVOVU1fUGVzc2ltaXN0aWN9LA0KLQl7MHg0M2RkYzZiZiwgTCJkdXBsZXhQYWdpbmF0ZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9EdXBsZXhQYWdpbmF0ZWR9LA0KKyAgICB7MHg0MmM2Y2Q4ZCwgTCJwZXNzaW1pc3RpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX1Blc3NpbWlzdGljfSwNCisgICAgezB4NDNkZGM2YmYsIEwiZHVwbGV4UGFnaW5hdGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fRHVwbGV4UGFnaW5hdGVkfSwNCiAgICAgezB4NDQyZjY4YzgsIEwicm91bmQiLCBYRkFfQVRUUklCVVRFRU5VTV9Sb3VuZH0sDQotCXsweDQ1ZWZiODQ3LCBMInJlbWVyZ2UiLCBYRkFfQVRUUklCVVRFRU5VTV9SZW1lcmdlfSwNCi0JezB4NDY5NzIyNjUsIEwib3JkZXJlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWR9LA0KKyAgICB7MHg0NWVmYjg0NywgTCJyZW1lcmdlIiwgWEZBX0FUVFJJQlVURUVOVU1fUmVtZXJnZX0sDQorICAgIHsweDQ2OTcyMjY1LCBMIm9yZGVyZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkfSwNCiAgICAgezB4NDZmOTU1MzEsIEwicGVyY2VudCIsIFhGQV9BVFRSSUJVVEVFTlVNX1BlcmNlbnR9LA0KLQl7MHg0NmZkMjVhZSwgTCJldmVuIiwgWEZBX0FUVFJJQlVURUVOVU1fRXZlbn0sDQotCXsweDQ3MzFkNmJhLCBMImV4aXQiLCBYRkFfQVRUUklCVVRFRU5VTV9FeGl0fSwNCisgICAgezB4NDZmZDI1YWUsIEwiZXZlbiIsIFhGQV9BVFRSSUJVVEVFTlVNX0V2ZW59LA0KKyAgICB7MHg0NzMxZDZiYSwgTCJleGl0IiwgWEZBX0FUVFJJQlVURUVOVU1fRXhpdH0sDQogICAgIHsweDQ5NzczNTZiLCBMInRvb2xUaXAiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub29sVGlwfSwNCi0JezB4NDliOTgwZWUsIEwib3JkZXJlZE9jY3VycmVuY2UiLCBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZX0sDQotCXsweDRhN2UyZGZlLCBMInJlYWRPbmx5IiwgWEZBX0FUVFJJQlVURUVOVU1fUmVhZE9ubHl9LA0KKyAgICB7MHg0OWI5ODBlZSwgTCJvcmRlcmVkT2NjdXJyZW5jZSIsIFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlfSwNCisgICAgezB4NGE3ZTJkZmUsIEwicmVhZE9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9SZWFkT25seX0sDQogICAgIHsweDRjNGU4YWNiLCBMImN1cnJlbmN5IiwgWEZBX0FUVFJJQlVURUVOVU1fQ3VycmVuY3l9LA0KLQl7MHg0ZGNmMjVmOCwgTCJjb25jYXQiLCBYRkFfQVRUUklCVVRFRU5VTV9Db25jYXR9LA0KLQl7MHg0ZmViYjgyNiwgTCJUaGFpIiwgWEZBX0FUVFJJQlVURUVOVU1fVGhhaX0sDQorICAgIHsweDRkY2YyNWY4LCBMImNvbmNhdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0NvbmNhdH0sDQorICAgIHsweDRmZWJiODI2LCBMIlRoYWkiLCBYRkFfQVRUUklCVVRFRU5VTV9UaGFpfSwNCiAgICAgezB4NTBlZjk1YjIsIEwiZW1ib3NzZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9FbWJvc3NlZH0sDQotCXsweDUxNmUzNWNlLCBMImZvcm1kYXRhIiwgWEZBX0FUVFJJQlVURUVOVU1fRm9ybWRhdGF9LA0KLQl7MHg1MmZhNmYwZSwgTCJHcmVlayIsIFhGQV9BVFRSSUJVVEVFTlVNX0dyZWVrfSwNCisgICAgezB4NTE2ZTM1Y2UsIEwiZm9ybWRhdGEiLCBYRkFfQVRUUklCVVRFRU5VTV9Gb3JtZGF0YX0sDQorICAgIHsweDUyZmE2ZjBlLCBMIkdyZWVrIiwgWEZBX0FUVFJJQlVURUVOVU1fR3JlZWt9LA0KICAgICB7MHg1NDAzNGMyZiwgTCJkZWNpbWFsIiwgWEZBX0FUVFJJQlVURUVOVU1fRGVjaW1hbH0sDQotCXsweDU0MmM3MzAwLCBMInNlbGVjdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1NlbGVjdH0sDQotCXsweDU1MWYwYWU1LCBMImxvbmdFZGdlIiwgWEZBX0FUVFJJQlVURUVOVU1fTG9uZ0VkZ2V9LA0KKyAgICB7MHg1NDJjNzMwMCwgTCJzZWxlY3QiLCBYRkFfQVRUUklCVVRFRU5VTV9TZWxlY3R9LA0KKyAgICB7MHg1NTFmMGFlNSwgTCJsb25nRWRnZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0xvbmdFZGdlfSwNCiAgICAgezB4NTU1MjBhOGEsIEwicHJvdGVjdGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fUHJvdGVjdGVkfSwNCi0JezB4NTU5Zjc2ZjMsIEwiYm90dG9tUmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21SaWdodH0sDQotCXsweDU2OGNiNTAwLCBMInplcm8iLCBYRkFfQVRUUklCVVRFRU5VTV9aZXJvfSwNCisgICAgezB4NTU5Zjc2ZjMsIEwiYm90dG9tUmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21SaWdodH0sDQorICAgIHsweDU2OGNiNTAwLCBMInplcm8iLCBYRkFfQVRUUklCVVRFRU5VTV9aZXJvfSwNCiAgICAgezB4NTZiY2VjYjcsIEwiZm9yd2FyZE9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9Gb3J3YXJkT25seX0sDQotCXsweDU2YmY0NTZiLCBMImRvY1JlYWR5IiwgWEZBX0FUVFJJQlVURUVOVU1fRG9jUmVhZHl9LA0KLQl7MHg1NzNjYjQwYywgTCJoaWRkZW4iLCBYRkFfQVRUUklCVVRFRU5VTV9IaWRkZW59LA0KKyAgICB7MHg1NmJmNDU2YiwgTCJkb2NSZWFkeSIsIFhGQV9BVFRSSUJVVEVFTlVNX0RvY1JlYWR5fSwNCisgICAgezB4NTczY2I0MGMsIEwiaGlkZGVuIiwgWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVufSwNCiAgICAgezB4NTgyZTM0MjQsIEwiaW5jbHVkZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0luY2x1ZGV9LA0KLQl7MHg1OGEzZGQyOSwgTCJkYXNoZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9EYXNoZWR9LA0KLQl7MHg1OTU1YjIyYiwgTCJtdWx0aVNlbGVjdCIsIFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0fSwNCisgICAgezB4NThhM2RkMjksIEwiZGFzaGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fRGFzaGVkfSwNCisgICAgezB4NTk1NWIyMmIsIEwibXVsdGlTZWxlY3QiLCBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdH0sDQogICAgIHsweDU5OGQ1YzUzLCBMImluYWN0aXZlIiwgWEZBX0FUVFJJQlVURUVOVU1fSW5hY3RpdmV9LA0KLQl7MHg1OWM4ZjI3ZCwgTCJlbWJlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0VtYmVkfSwNCi0JezB4NWU3NTU1ZTgsIEwic3RhdGljIiwgWEZBX0FUVFJJQlVURUVOVU1fU3RhdGljfSwNCisgICAgezB4NTljOGYyN2QsIEwiZW1iZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9FbWJlZH0sDQorICAgIHsweDVlNzU1NWU4LCBMInN0YXRpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXRpY30sDQogICAgIHsweDYwNmQ0ZGVmLCBMIm9uRW50cnkiLCBYRkFfQVRUUklCVVRFRU5VTV9PbkVudHJ5fSwNCi0JezB4NjE5NWVhZmIsIEwiQ3lyaWxsaWMiLCBYRkFfQVRUUklCVVRFRU5VTV9DeXJpbGxpY30sDQotCXsweDY0OTFiMGYzLCBMIm5vbkJsYW5rIiwgWEZBX0FUVFJJQlVURUVOVU1fTm9uQmxhbmt9LA0KKyAgICB7MHg2MTk1ZWFmYiwgTCJDeXJpbGxpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX0N5cmlsbGljfSwNCisgICAgezB4NjQ5MWIwZjMsIEwibm9uQmxhbmsiLCBYRkFfQVRUUklCVVRFRU5VTV9Ob25CbGFua30sDQogICAgIHsweDY3YmVmMDMxLCBMInRvcFJpZ2h0IiwgWEZBX0FUVFJJQlVURUVOVU1fVG9wUmlnaHR9LA0KLQl7MHg2N2RmNWViZCwgTCJIZWJyZXciLCBYRkFfQVRUUklCVVRFRU5VTV9IZWJyZXd9LA0KLQl7MHg2YWVhOThiZSwgTCJ0b3BMZWZ0IiwgWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdH0sDQorICAgIHsweDY3ZGY1ZWJkLCBMIkhlYnJldyIsIFhGQV9BVFRSSUJVVEVFTlVNX0hlYnJld30sDQorICAgIHsweDZhZWE5OGJlLCBMInRvcExlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub3BMZWZ0fSwNCiAgICAgezB4NmM1MWFmYzEsIEwiY2VudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyfSwNCi0JezB4NzE0NWU2YmYsIEwibW92ZUZpcnN0IiwgWEZBX0FUVFJJQlVURUVOVU1fTW92ZUZpcnN0fSwNCi0JezB4NzM3NTQ2NWMsIEwiZGlhbW9uZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0RpYW1vbmR9LA0KKyAgICB7MHg3MTQ1ZTZiZiwgTCJtb3ZlRmlyc3QiLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3ZlRmlyc3R9LA0KKyAgICB7MHg3Mzc1NDY1YywgTCJkaWFtb25kIiwgWEZBX0FUVFJJQlVURUVOVU1fRGlhbW9uZH0sDQogICAgIHsweDc0NjFhZWY0LCBMInBhZ2VPZGQiLCBYRkFfQVRUUklCVVRFRU5VTV9QYWdlT2RkfSwNCi0JezB4NzVmOGFlYjIsIEwiMW1vZDEwIiwgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwfSwNCi0JezB4NzZkNzA4ZTAsIEwiS29yZWFuIiwgWEZBX0FUVFJJQlVURUVOVU1fS29yZWFufSwNCisgICAgezB4NzVmOGFlYjIsIEwiMW1vZDEwIiwgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwfSwNCisgICAgezB4NzZkNzA4ZTAsIEwiS29yZWFuIiwgWEZBX0FUVFJJQlVURUVOVU1fS29yZWFufSwNCiAgICAgezB4Nzg5ZjE0ZDcsIEwiYWJvdmVFbWJlZGRlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Fib3ZlRW1iZWRkZWR9LA0KLQl7MHg3OTJlYTM5ZiwgTCJ6aXBDb21wcmVzcyIsIFhGQV9BVFRSSUJVVEVFTlVNX1ppcENvbXByZXNzfSwNCi0JezB4N2E1YjcxOTMsIEwibnVtZXJpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX051bWVyaWN9LA0KKyAgICB7MHg3OTJlYTM5ZiwgTCJ6aXBDb21wcmVzcyIsIFhGQV9BVFRSSUJVVEVFTlVNX1ppcENvbXByZXNzfSwNCisgICAgezB4N2E1YjcxOTMsIEwibnVtZXJpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX051bWVyaWN9LA0KICAgICB7MHg3YWJlYzBkMiwgTCJjaXJjbGUiLCBYRkFfQVRUUklCVVRFRU5VTV9DaXJjbGV9LA0KLQl7MHg3YWZiYmEzOCwgTCJ0b0JvdHRvbSIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvQm90dG9tfSwNCi0JezB4N2I5NWU2NjEsIEwiaW52ZXJ0ZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9JbnZlcnRlZH0sDQorICAgIHsweDdhZmJiYTM4LCBMInRvQm90dG9tIiwgWEZBX0FUVFJJQlVURUVOVU1fVG9Cb3R0b219LA0KKyAgICB7MHg3Yjk1ZTY2MSwgTCJpbnZlcnRlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0ludmVydGVkfSwNCiAgICAgezB4N2JhY2EyZTMsIEwidXBkYXRlIiwgWEZBX0FUVFJJQlVURUVOVU1fVXBkYXRlfSwNCi0JezB4N2ViNWRhMmMsIEwiaXNvbmFtZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0lzb25hbWV9LA0KLQl7MHg3ZjZmZDNkNywgTCJzZXJ2ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9TZXJ2ZXJ9LA0KKyAgICB7MHg3ZWI1ZGEyYywgTCJpc29uYW1lIiwgWEZBX0FUVFJJQlVURUVOVU1fSXNvbmFtZX0sDQorICAgIHsweDdmNmZkM2Q3LCBMInNlcnZlciIsIFhGQV9BVFRSSUJVVEVFTlVNX1NlcnZlcn0sDQogICAgIHsweDgxNGY4MmI1LCBMInBvc2l0aW9uIiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb259LA0KLQl7MHg4MmRlYWNmMCwgTCJtaWRkbGVDZW50ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVDZW50ZXJ9LA0KLQl7MHg4M2E0OWRjNiwgTCJvcHRpb25hbCIsIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAgezB4ODJkZWFjZjAsIEwibWlkZGxlQ2VudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlQ2VudGVyfSwNCisgICAgezB4ODNhNDlkYzYsIEwib3B0aW9uYWwiLCBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQogICAgIHsweDg2MWExMTZmLCBMInVzZVByaW50ZXJTZXR0aW5nIiwgWEZBX0FUVFJJQlVURUVOVU1fVXNlUHJpbnRlclNldHRpbmd9LA0KLQl7MHg4NjcwMWNlMCwgTCJvdXRsaW5lIiwgWEZBX0FUVFJJQlVURUVOVU1fT3V0bGluZX0sDQotCXsweDg4MDgzODVlLCBMImluZGV4Q2hhbmdlIiwgWEZBX0FUVFJJQlVURUVOVU1fSW5kZXhDaGFuZ2V9LA0KKyAgICB7MHg4NjcwMWNlMCwgTCJvdXRsaW5lIiwgWEZBX0FUVFJJQlVURUVOVU1fT3V0bGluZX0sDQorICAgIHsweDg4MDgzODVlLCBMImluZGV4Q2hhbmdlIiwgWEZBX0FUVFJJQlVURUVOVU1fSW5kZXhDaGFuZ2V9LA0KICAgICB7MHg4OTFmNDYwNiwgTCJjaGFuZ2UiLCBYRkFfQVRUUklCVVRFRU5VTV9DaGFuZ2V9LA0KLQl7MHg4OTkzOWYzNiwgTCJwYWdlQXJlYSIsIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhfSwNCi0JezB4OGI1YzNiMjUsIEwib25jZSIsIFhGQV9BVFRSSUJVVEVFTlVNX09uY2V9LA0KKyAgICB7MHg4OTkzOWYzNiwgTCJwYWdlQXJlYSIsIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhfSwNCisgICAgezB4OGI1YzNiMjUsIEwib25jZSIsIFhGQV9BVFRSSUJVVEVFTlVNX09uY2V9LA0KICAgICB7MHg4YjVjNjk2MiwgTCJvbmx5IiwgWEZBX0FUVFJJQlVURUVOVU1fT25seX0sDQotCXsweDhiOTBlMWYyLCBMIm9wZW4iLCBYRkFfQVRUUklCVVRFRU5VTV9PcGVufSwNCi0JezB4OGJjZmU5NmUsIEwiY2FwdGlvbiIsIFhGQV9BVFRSSUJVVEVFTlVNX0NhcHRpb259LA0KKyAgICB7MHg4YjkwZTFmMiwgTCJvcGVuIiwgWEZBX0FUVFJJQlVURUVOVU1fT3Blbn0sDQorICAgIHsweDhiY2ZlOTZlLCBMImNhcHRpb24iLCBYRkFfQVRUUklCVVRFRU5VTV9DYXB0aW9ufSwNCiAgICAgezB4OGNlODNlZjgsIEwicmFpc2VkIiwgWEZBX0FUVFJJQlVURUVOVU1fUmFpc2VkfSwNCi0JezB4OGQyNjljYWUsIEwianVzdGlmeSIsIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnl9LA0KLQl7MHg4ZmQ1MjBkYywgTCJyZWZBbmREZXNjZW5kYW50cyIsIFhGQV9BVFRSSUJVVEVFTlVNX1JlZkFuZERlc2NlbmRhbnRzfSwNCisgICAgezB4OGQyNjljYWUsIEwianVzdGlmeSIsIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnl9LA0KKyAgICB7MHg4ZmQ1MjBkYywgTCJyZWZBbmREZXNjZW5kYW50cyIsIFhGQV9BVFRSSUJVVEVFTlVNX1JlZkFuZERlc2NlbmRhbnRzfSwNCiAgICAgezB4OTA0MWQ0YjAsIEwic2hvcnQiLCBYRkFfQVRUUklCVVRFRU5VTV9TaG9ydH0sDQotCXsweDkwYzk0NDI2LCBMInBhZ2VGcm9udCIsIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VGcm9udH0sDQotCXsweDkzNmJlZWU1LCBMIm1vbm9zcGFjZSIsIFhGQV9BVFRSSUJVVEVFTlVNX01vbm9zcGFjZX0sDQorICAgIHsweDkwYzk0NDI2LCBMInBhZ2VGcm9udCIsIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VGcm9udH0sDQorICAgIHsweDkzNmJlZWU1LCBMIm1vbm9zcGFjZSIsIFhGQV9BVFRSSUJVVEVFTlVNX01vbm9zcGFjZX0sDQogICAgIHsweDk0N2ZhMDBmLCBMIm1pZGRsZSIsIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZX0sDQotCXsweDk1MjhhN2I0LCBMInByZVByaW50IiwgWEZBX0FUVFJJQlVURUVOVU1fUHJlUHJpbnR9LA0KLQl7MHg5NTlhYjIzMSwgTCJhbHdheXMiLCBYRkFfQVRUUklCVVRFRU5VTV9BbHdheXN9LA0KKyAgICB7MHg5NTI4YTdiNCwgTCJwcmVQcmludCIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVByaW50fSwNCisgICAgezB4OTU5YWIyMzEsIEwiYWx3YXlzIiwgWEZBX0FUVFJJQlVURUVOVU1fQWx3YXlzfSwNCiAgICAgezB4OTZkNjFiZjAsIEwidW5rbm93biIsIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd259LA0KLQl7MHg5OTcxOTRlZSwgTCJ0b0xlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub0xlZnR9LA0KLQl7MHg5YTgzYTNjZCwgTCJhYm92ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0Fib3ZlfSwNCisgICAgezB4OTk3MTk0ZWUsIEwidG9MZWZ0IiwgWEZBX0FUVFJJQlVURUVOVU1fVG9MZWZ0fSwNCisgICAgezB4OWE4M2EzY2QsIEwiYWJvdmUiLCBYRkFfQVRUUklCVVRFRU5VTV9BYm92ZX0sDQogICAgIHsweDlkMGQ3MWM3LCBMImRhc2hEb3QiLCBYRkFfQVRUUklCVVRFRU5VTV9EYXNoRG90fSwNCi0JezB4OWRmNTZmM2UsIEwiZ3JlZ29yaWFuIiwgWEZBX0FUVFJJQlVURUVOVU1fR3JlZ29yaWFufSwNCi0JezB4OWY2NzIzZmQsIEwiUm9tYW4iLCBYRkFfQVRUUklCVVRFRU5VTV9Sb21hbn0sDQorICAgIHsweDlkZjU2ZjNlLCBMImdyZWdvcmlhbiIsIFhGQV9BVFRSSUJVVEVFTlVNX0dyZWdvcmlhbn0sDQorICAgIHsweDlmNjcyM2ZkLCBMIlJvbWFuIiwgWEZBX0FUVFJJQlVURUVOVU1fUm9tYW59LA0KICAgICB7MHg5ZjY5M2IyMSwgTCJtb3VzZURvd24iLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZURvd259LA0KLQl7MHhhMTQyOWIzNiwgTCJzeW1ib2wiLCBYRkFfQVRUUklCVVRFRU5VTV9TeW1ib2x9LA0KLQl7MHhhNWFhNDVjYiwgTCJwYWdlRXZlbiIsIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VFdmVufSwNCisgICAgezB4YTE0MjliMzYsIEwic3ltYm9sIiwgWEZBX0FUVFJJQlVURUVOVU1fU3ltYm9sfSwNCisgICAgezB4YTVhYTQ1Y2IsIEwicGFnZUV2ZW4iLCBYRkFfQVRUUklCVVRFRU5VTV9QYWdlRXZlbn0sDQogICAgIHsweGE2ODYzNWYxLCBMInNpZ24iLCBYRkFfQVRUUklCVVRFRU5VTV9TaWdufSwNCi0JezB4YTczMTUwOTMsIEwiYWRkTmV3IiwgWEZBX0FUVFJJQlVURUVOVU1fQWRkTmV3fSwNCi0JezB4YTdhNzczZmEsIEwic3RhciIsIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXJ9LA0KKyAgICB7MHhhNzMxNTA5MywgTCJhZGROZXciLCBYRkFfQVRUUklCVVRFRU5VTV9BZGROZXd9LA0KKyAgICB7MHhhN2E3NzNmYSwgTCJzdGFyIiwgWEZBX0FUVFJJQlVURUVOVU1fU3Rhcn0sDQogICAgIHsweGE3ZDU3YjQ1LCBMIm9wdGltaXN0aWMiLCBYRkFfQVRUUklCVVRFRU5VTV9PcHRpbWlzdGljfSwNCi0JezB4YTgwNzczMjEsIEwicmwtdGIiLCBYRkFfQVRUUklCVVRFRU5VTV9SbF90Yn0sDQotCXsweGE4ZjE0NjhkLCBMIm1pZGRsZVJpZ2h0IiwgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlUmlnaHR9LA0KKyAgICB7MHhhODA3NzMyMSwgTCJybC10YiIsIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RifSwNCisgICAgezB4YThmMTQ2OGQsIEwibWlkZGxlUmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVSaWdodH0sDQogICAgIHsweGFhODRhMWYxLCBMIm1haW50YWluIiwgWEZBX0FUVFJJQlVURUVOVU1fTWFpbnRhaW59LA0KLQl7MHhhYjQwYjEyYywgTCJwYWNrYWdlIiwgWEZBX0FUVFJJQlVURUVOVU1fUGFja2FnZX0sDQotCXsweGFjOGI0ZDg1LCBMIlNpbXBsaWZpZWRDaGluZXNlIiwgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxpZmllZENoaW5lc2V9LA0KKyAgICB7MHhhYjQwYjEyYywgTCJwYWNrYWdlIiwgWEZBX0FUVFJJQlVURUVOVU1fUGFja2FnZX0sDQorICAgIHsweGFjOGI0ZDg1LCBMIlNpbXBsaWZpZWRDaGluZXNlIiwgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxpZmllZENoaW5lc2V9LA0KICAgICB7MHhhZGFlNjc0NCwgTCJ0b0NlbnRlciIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvQ2VudGVyfSwNCi0JezB4YjAxMjlkZjEsIEwiYmFjayIsIFhGQV9BVFRSSUJVVEVFTlVNX0JhY2t9LA0KLQl7MHhiMGYwODhjZiwgTCJ1bnNwZWNpZmllZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Vuc3BlY2lmaWVkfSwNCisgICAgezB4YjAxMjlkZjEsIEwiYmFjayIsIFhGQV9BVFRSSUJVVEVFTlVNX0JhY2t9LA0KKyAgICB7MHhiMGYwODhjZiwgTCJ1bnNwZWNpZmllZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Vuc3BlY2lmaWVkfSwNCiAgICAgezB4YjEyNzEwNjcsIEwiYmF0Y2hPcHRpbWlzdGljIiwgWEZBX0FUVFJJQlVURUVOVU1fQmF0Y2hPcHRpbWlzdGljfSwNCi0JezB4YjE4MzEzYTEsIEwiYm9sZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0JvbGR9LA0KLQl7MHhiMTgzM2NhZCwgTCJib3RoIiwgWEZBX0FUVFJJQlVURUVOVU1fQm90aH0sDQorICAgIHsweGIxODMxM2ExLCBMImJvbGQiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb2xkfSwNCisgICAgezB4YjE4MzNjYWQsIEwiYm90aCIsIFhGQV9BVFRSSUJVVEVFTlVNX0JvdGh9LA0KICAgICB7MHhiMjIxMTIzZiwgTCJidXR0IiwgWEZBX0FUVFJJQlVURUVOVU1fQnV0dH0sDQotCXsweGI0MGMzNmJmLCBMImNsaWVudCIsIFhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sDQotCXsweGI1NmM3MDUzLCBMIjJtb2QxMCIsIFhGQV9BVFRSSUJVVEVFTlVNXzJtb2QxMH0sDQorICAgIHsweGI0MGMzNmJmLCBMImNsaWVudCIsIFhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sDQorICAgIHsweGI1NmM3MDUzLCBMIjJtb2QxMCIsIFhGQV9BVFRSSUJVVEVFTlVNXzJtb2QxMH0sDQogICAgIHsweGI2ODNhMzQ1LCBMImltYWdlT25seSIsIFhGQV9BVFRSSUJVVEVFTlVNX0ltYWdlT25seX0sDQotCXsweGI3NzMyZGVhLCBMImhvcml6b250YWwiLCBYRkFfQVRUUklCVVRFRU5VTV9Ib3Jpem9udGFsfSwNCi0JezB4Yjg4NjUyYTQsIEwiZG90dGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fRG90dGVkfSwNCisgICAgezB4Yjc3MzJkZWEsIEwiaG9yaXpvbnRhbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0hvcml6b250YWx9LA0KKyAgICB7MHhiODg2NTJhNCwgTCJkb3R0ZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9Eb3R0ZWR9LA0KICAgICB7MHhiYjJmMjg4MCwgTCJ1c2VyQ29udHJvbCIsIFhGQV9BVFRSSUJVVEVFTlVNX1VzZXJDb250cm9sfSwNCi0JezB4YmJiNzljNWQsIEwiZGlhZ29uYWxSaWdodCIsIFhGQV9BVFRSSUJVVEVFTlVNX0RpYWdvbmFsUmlnaHR9LA0KLQl7MHhiZDA3NzE1NCwgTCJjb25zdW1lRGF0YSIsIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnN1bWVEYXRhfSwNCisgICAgezB4YmJiNzljNWQsIEwiZGlhZ29uYWxSaWdodCIsIFhGQV9BVFRSSUJVVEVFTlVNX0RpYWdvbmFsUmlnaHR9LA0KKyAgICB7MHhiZDA3NzE1NCwgTCJjb25zdW1lRGF0YSIsIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnN1bWVEYXRhfSwNCiAgICAgezB4YmQzZmIxMWUsIEwiY2hlY2siLCBYRkFfQVRUUklCVVRFRU5VTV9DaGVja30sDQotCXsweGJkZTlhYmRhLCBMImRhdGEiLCBYRkFfQVRUUklCVVRFRU5VTV9EYXRhfSwNCi0JezB4YmY1YTAyZDgsIEwiZG93biIsIFhGQV9BVFRSSUJVVEVFTlVNX0Rvd259LA0KKyAgICB7MHhiZGU5YWJkYSwgTCJkYXRhIiwgWEZBX0FUVFJJQlVURUVOVU1fRGF0YX0sDQorICAgIHsweGJmNWEwMmQ4LCBMImRvd24iLCBYRkFfQVRUUklCVVRFRU5VTV9Eb3dufSwNCiAgICAgezB4YmY3NDUwZWUsIEwic2Fuc1NlcmlmIiwgWEZBX0FUVFJJQlVURUVOVU1fU2Fuc1NlcmlmfSwNCi0JezB4YzAyZDY0OWYsIEwiaW5saW5lIiwgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lfSwNCi0JezB4YzExYTllM2EsIEwiVHJhZGl0aW9uYWxDaGluZXNlIiwgWEZBX0FUVFJJQlVURUVOVU1fVHJhZGl0aW9uYWxDaGluZXNlfSwNCisgICAgezB4YzAyZDY0OWYsIEwiaW5saW5lIiwgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lfSwNCisgICAgezB4YzExYTllM2EsIEwiVHJhZGl0aW9uYWxDaGluZXNlIiwgWEZBX0FUVFJJQlVURUVOVU1fVHJhZGl0aW9uYWxDaGluZXNlfSwNCiAgICAgezB4YzE2MTY5ZDgsIEwid2FybiIsIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm59LA0KLQl7MHhjMTZmMDcxZiwgTCJyZWZPbmx5IiwgWEZBX0FUVFJJQlVURUVOVU1fUmVmT25seX0sDQotCXsweGMyN2M4YmE1LCBMImludGVyYWN0aXZlRm9ybXMiLCBYRkFfQVRUUklCVVRFRU5VTV9JbnRlcmFjdGl2ZUZvcm1zfSwNCisgICAgezB4YzE2ZjA3MWYsIEwicmVmT25seSIsIFhGQV9BVFRSSUJVVEVFTlVNX1JlZk9ubHl9LA0KKyAgICB7MHhjMjdjOGJhNSwgTCJpbnRlcmFjdGl2ZUZvcm1zIiwgWEZBX0FUVFJJQlVURUVOVU1fSW50ZXJhY3RpdmVGb3Jtc30sDQogICAgIHsweGMyZDFiMTVjLCBMIndvcmQiLCBYRkFfQVRUUklCVVRFRU5VTV9Xb3JkfSwNCi0JezB4YzM2MjEyODgsIEwidW5vcmRlcmVkIiwgWEZBX0FUVFJJQlVURUVOVU1fVW5vcmRlcmVkfSwNCi0JezB4YzUyNTE5ODEsIEwicmVxdWlyZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9SZXF1aXJlZH0sDQorICAgIHsweGMzNjIxMjg4LCBMInVub3JkZXJlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Vub3JkZXJlZH0sDQorICAgIHsweGM1MjUxOTgxLCBMInJlcXVpcmVkIiwgWEZBX0FUVFJJQlVURUVOVU1fUmVxdWlyZWR9LA0KICAgICB7MHhjNzA4OGU3ZCwgTCJpbXBvcnRPbmx5IiwgWEZBX0FUVFJJQlVURUVOVU1fSW1wb3J0T25seX0sDQotCXsweGM3MmNmMGUzLCBMImJlbG93RW1iZWRkZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9CZWxvd0VtYmVkZGVkfSwNCi0JezB4YzgxOWNmMDcsIEwiSmFwYW5lc2UiLCBYRkFfQVRUUklCVVRFRU5VTV9KYXBhbmVzZX0sDQorICAgIHsweGM3MmNmMGUzLCBMImJlbG93RW1iZWRkZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9CZWxvd0VtYmVkZGVkfSwNCisgICAgezB4YzgxOWNmMDcsIEwiSmFwYW5lc2UiLCBYRkFfQVRUUklCVVRFRU5VTV9KYXBhbmVzZX0sDQogICAgIHsweGNkY2U1NmIzLCBMImZ1bGwiLCBYRkFfQVRUUklCVVRFRU5VTV9GdWxsfSwNCi0JezB4Y2UwMTIyZTMsIEwicmwtcm93IiwgWEZBX0FUVFJJQlVURUVOVU1fUmxfcm93fSwNCi0JezB4Y2Y3ZDcxZjEsIEwiVmlldG5hbWVzZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1ZpZXRuYW1lc2V9LA0KKyAgICB7MHhjZTAxMjJlMywgTCJybC1yb3ciLCBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3d9LA0KKyAgICB7MHhjZjdkNzFmMSwgTCJWaWV0bmFtZXNlIiwgWEZBX0FUVFJJQlVURUVOVU1fVmlldG5hbWVzZX0sDQogICAgIHsweGNmZGUzZTA5LCBMIkVhc3RFdXJvcGVhblJvbWFuIiwgWEZBX0FUVFJJQlVURUVOVU1fRWFzdEV1cm9wZWFuUm9tYW59LA0KLQl7MHhkNTc2ZDA4ZSwgTCJtb3VzZVVwIiwgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VVcH0sDQotCXsweGQ3YTkyOTA0LCBMImV4cG9ydE9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9FeHBvcnRPbmx5fSwNCisgICAgezB4ZDU3NmQwOGUsIEwibW91c2VVcCIsIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlVXB9LA0KKyAgICB7MHhkN2E5MjkwNCwgTCJleHBvcnRPbmx5IiwgWEZBX0FUVFJJQlVURUVOVU1fRXhwb3J0T25seX0sDQogICAgIHsweGQ4ZWQxNDY3LCBMImNsZWFyIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2xlYXJ9LA0KLQl7MHhkOTU2NTdhNiwgTCJjbGljayIsIFhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrfSwNCi0JezB4ZDk2YzdkZTUsIEwiYmFzZTY0IiwgWEZBX0FUVFJJQlVURUVOVU1fQmFzZTY0fSwNCisgICAgezB4ZDk1NjU3YTYsIEwiY2xpY2siLCBYRkFfQVRUUklCVVRFRU5VTV9DbGlja30sDQorICAgIHsweGQ5NmM3ZGU1LCBMImJhc2U2NCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NH0sDQogICAgIHsweGQ5ZjQ3ZjM2LCBMImNsb3NlIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2xvc2V9LA0KLQl7MHhkYjA3NWJkZSwgTCJob3N0IiwgWEZBX0FUVFJJQlVURUVOVU1fSG9zdH0sDQotCXsweGRiMTAzNDExLCBMImdsb2JhbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0dsb2JhbH0sDQorICAgIHsweGRiMDc1YmRlLCBMImhvc3QiLCBYRkFfQVRUUklCVVRFRU5VTV9Ib3N0fSwNCisgICAgezB4ZGIxMDM0MTEsIEwiZ2xvYmFsIiwgWEZBX0FUVFJJQlVURUVOVU1fR2xvYmFsfSwNCiAgICAgezB4ZGI2NDcxODgsIEwiYmxhbmsiLCBYRkFfQVRUUklCVVRFRU5VTV9CbGFua30sDQotCXsweGRiOWJlOTY4LCBMInRhYmxlIiwgWEZBX0FUVFJJQlVURUVOVU1fVGFibGV9LA0KLQl7MHhkZjU5MGZiYiwgTCJpbXBvcnQiLCBYRkFfQVRUUklCVVRFRU5VTV9JbXBvcnR9LA0KKyAgICB7MHhkYjliZTk2OCwgTCJ0YWJsZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlfSwNCisgICAgezB4ZGY1OTBmYmIsIEwiaW1wb3J0IiwgWEZBX0FUVFJJQlVURUVOVU1fSW1wb3J0fSwNCiAgICAgezB4ZTBlNTczZmIsIEwiY3VzdG9tIiwgWEZBX0FUVFJJQlVURUVOVU1fQ3VzdG9tfSwNCi0JezB4ZTBlY2M3OWEsIEwibWlkZGxlTGVmdCIsIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUxlZnR9LA0KLQl7MHhlMTQ1MjAxOSwgTCJwb3N0RXhlY3V0ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RFeGVjdXRlfSwNCisgICAgezB4ZTBlY2M3OWEsIEwibWlkZGxlTGVmdCIsIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUxlZnR9LA0KKyAgICB7MHhlMTQ1MjAxOSwgTCJwb3N0RXhlY3V0ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RFeGVjdXRlfSwNCiAgICAgezB4ZTE5MTFkOTgsIEwicmFkaXgiLCBYRkFfQVRUUklCVVRFRU5VTV9SYWRpeH0sDQotCXsweGUyNWZhN2I4LCBMInBvc3RPcGVuIiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zdE9wZW59LA0KLQl7MHhlMjhkY2U3ZSwgTCJlbnRlciIsIFhGQV9BVFRSSUJVVEVFTlVNX0VudGVyfSwNCisgICAgezB4ZTI1ZmE3YjgsIEwicG9zdE9wZW4iLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0T3Blbn0sDQorICAgIHsweGUyOGRjZTdlLCBMImVudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fRW50ZXJ9LA0KICAgICB7MHhlMmM0NGRlNCwgTCJpZ25vcmUiLCBYRkFfQVRUUklCVVRFRU5VTV9JZ25vcmV9LA0KLQl7MHhlMmNkOGM2MSwgTCJsci10YiIsIFhGQV9BVFRSSUJVVEVFTlVNX0xyX3RifSwNCi0JezB4ZTJkYTgzMzYsIEwiZmFudGFzeSIsIFhGQV9BVFRSSUJVVEVFTlVNX0ZhbnRhc3l9LA0KKyAgICB7MHhlMmNkOGM2MSwgTCJsci10YiIsIFhGQV9BVFRSSUJVVEVFTlVNX0xyX3RifSwNCisgICAgezB4ZTJkYTgzMzYsIEwiZmFudGFzeSIsIFhGQV9BVFRSSUJVVEVFTlVNX0ZhbnRhc3l9LA0KICAgICB7MHhlMzFkNTM5NiwgTCJpdGFsaWMiLCBYRkFfQVRUUklCVVRFRU5VTV9JdGFsaWN9LA0KLQl7MHhlN2FkYTExMywgTCJhdXRob3IiLCBYRkFfQVRUUklCVVRFRU5VTV9BdXRob3J9LA0KLQl7MHhlOGU3Y2MxOCwgTCJ0b0VkZ2UiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub0VkZ2V9LA0KKyAgICB7MHhlN2FkYTExMywgTCJhdXRob3IiLCBYRkFfQVRUUklCVVRFRU5VTV9BdXRob3J9LA0KKyAgICB7MHhlOGU3Y2MxOCwgTCJ0b0VkZ2UiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub0VkZ2V9LA0KICAgICB7MHhlOTdhYTk4YiwgTCJjaG9pY2UiLCBYRkFfQVRUUklCVVRFRU5VTV9DaG9pY2V9LA0KLQl7MHhlYWZkMmEzOCwgTCJkaXNhYmxlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkfSwNCi0JezB4ZWIyYjc5NzIsIEwiY3Jvc3NIYXRjaCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzSGF0Y2h9LA0KKyAgICB7MHhlYWZkMmEzOCwgTCJkaXNhYmxlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkfSwNCisgICAgezB4ZWIyYjc5NzIsIEwiY3Jvc3NIYXRjaCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzSGF0Y2h9LA0KICAgICB7MHhlYjJkYjJkNywgTCJkYXRhUmVmIiwgWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZn0sDQotCXsweGVjMzVkYzZlLCBMImRhc2hEb3REb3QiLCBYRkFfQVRUUklCVVRFRU5VTV9EYXNoRG90RG90fSwNCi0JezB4ZWY4NWQzNTEsIEwic3F1YXJlIiwgWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlfSwNCisgICAgezB4ZWMzNWRjNmUsIEwiZGFzaERvdERvdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3REb3R9LA0KKyAgICB7MHhlZjg1ZDM1MSwgTCJzcXVhcmUiLCBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmV9LA0KICAgICB7MHhmMjEwMjQ0NSwgTCJkeW5hbWljIiwgWEZBX0FUVFJJQlVURUVOVU1fRHluYW1pY30sDQotCXsweGYyNzJjN2JlLCBMIm1hbnVhbCIsIFhGQV9BVFRSSUJVVEVFTlVNX01hbnVhbH0sDQotCXsweGYyYmJiNjRkLCBMImV0Y2hlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0V0Y2hlZH0sDQorICAgIHsweGYyNzJjN2JlLCBMIm1hbnVhbCIsIFhGQV9BVFRSSUJVVEVFTlVNX01hbnVhbH0sDQorICAgIHsweGYyYmJiNjRkLCBMImV0Y2hlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0V0Y2hlZH0sDQogICAgIHsweGYzYjhmYzZjLCBMInZhbGlkYXRpb25TdGF0ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1ZhbGlkYXRpb25TdGF0ZX0sDQotCXsweGY0MmYyYjgxLCBMImN1cnNpdmUiLCBYRkFfQVRUUklCVVRFRU5VTV9DdXJzaXZlfSwNCi0JezB4ZjU0NDgxZDQsIEwibGFzdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0xhc3R9LA0KKyAgICB7MHhmNDJmMmI4MSwgTCJjdXJzaXZlIiwgWEZBX0FUVFJJQlVURUVOVU1fQ3Vyc2l2ZX0sDQorICAgIHsweGY1NDQ4MWQ0LCBMImxhc3QiLCBYRkFfQVRUUklCVVRFRU5VTV9MYXN0fSwNCiAgICAgezB4ZjVhZDc4MmIsIEwibGVmdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnR9LA0KLQl7MHhmNjE2ZGEyZSwgTCJsaW5rIiwgWEZBX0FUVFJJQlVURUVOVU1fTGlua30sDQotCXsweGY2YjRhZmIwLCBMImxvbmciLCBYRkFfQVRUUklCVVRFRU5VTV9Mb25nfSwNCi0gICAgezB4Zjg2MzY0NjAsIEwiaW50ZXJuYXRpb25hbENhcnJpZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9JbnRlcm5hdGlvbmFsQ2Fycmllcn0sDQotCXsweGY5ZmIzN2FjLCBMIlBERjEuMyIsIFhGQV9BVFRSSUJVVEVFTlVNX1BERjFfM30sDQotCXsweGY5ZmIzN2FmLCBMIlBERjEuNiIsIFhGQV9BVFRSSUJVVEVFTlVNX1BERjFfNn0sDQorICAgIHsweGY2MTZkYTJlLCBMImxpbmsiLCBYRkFfQVRUUklCVVRFRU5VTV9MaW5rfSwNCisgICAgezB4ZjZiNGFmYjAsIEwibG9uZyIsIFhGQV9BVFRSSUJVVEVFTlVNX0xvbmd9LA0KKyAgICB7MHhmODYzNjQ2MCwgTCJpbnRlcm5hdGlvbmFsQ2FycmllciIsDQorICAgICBYRkFfQVRUUklCVVRFRU5VTV9JbnRlcm5hdGlvbmFsQ2Fycmllcn0sDQorICAgIHsweGY5ZmIzN2FjLCBMIlBERjEuMyIsIFhGQV9BVFRSSUJVVEVFTlVNX1BERjFfM30sDQorICAgIHsweGY5ZmIzN2FmLCBMIlBERjEuNiIsIFhGQV9BVFRSSUJVVEVFTlVNX1BERjFfNn0sDQogICAgIHsweGZiY2U3ZjE5LCBMInNlcmlmIiwgWEZBX0FUVFJJQlVURUVOVU1fU2VyaWZ9LA0KLQl7MHhmYzgyZDY5NSwgTCJwb3N0U2F2ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTYXZlfSwNCi0JezB4ZmNlZjg2YjUsIEwicmVhZHkiLCBYRkFfQVRUUklCVVRFRU5VTV9SZWFkeX0sDQorICAgIHsweGZjODJkNjk1LCBMInBvc3RTYXZlIiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFNhdmV9LA0KKyAgICB7MHhmY2VmODZiNSwgTCJyZWFkeSIsIFhGQV9BVFRSSUJVVEVFTlVNX1JlYWR5fSwNCiAgICAgezB4ZmQ1NGZiYjcsIEwicG9zdFNpZ24iLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2lnbn0sDQotCXsweGZkYzBhYWUyLCBMIkFyYWJpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX0FyYWJpY30sDQotCXsweGZlMDZkMmNhLCBMImVycm9yIiwgWEZBX0FUVFJJQlVURUVOVU1fRXJyb3J9LA0KKyAgICB7MHhmZGMwYWFlMiwgTCJBcmFiaWMiLCBYRkFfQVRUUklCVVRFRU5VTV9BcmFiaWN9LA0KKyAgICB7MHhmZTA2ZDJjYSwgTCJlcnJvciIsIFhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yfSwNCiAgICAgezB4ZmVmYzQ4ODUsIEwidXJsZW5jb2RlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1VybGVuY29kZWR9LA0KLQl7MHhmZjc5NWFkMiwgTCJsb3dlcmVkIiwgWEZBX0FUVFJJQlVURUVOVU1fTG93ZXJlZH0sDQorICAgIHsweGZmNzk1YWQyLCBMImxvd2VyZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9Mb3dlcmVkfSwNCiB9Ow0KLWV4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQUVudW1Db3VudCA9IHNpemVvZihnX1hGQUVudW1EYXRhKSAvIHNpemVvZihYRkFfQVRUUklCVVRFRU5VTUlORk8pOw0KK2V4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQUVudW1Db3VudCA9DQorICAgIHNpemVvZihnX1hGQUVudW1EYXRhKSAvIHNpemVvZihYRkFfQVRUUklCVVRFRU5VTUlORk8pOw0KIHN0YXRpYyBjb25zdCBDWEZBX01lYXN1cmVtZW50IGdfWEZBTWVhc3VyZW1lbnREYXRhW10gPSB7DQogICAgIENYRkFfTWVhc3VyZW1lbnQoMCwgWEZBX1VOSVRfSW4pLA0KICAgICBDWEZBX01lYXN1cmVtZW50KDAsIFhGQV9VTklUX1B0KSwNCkBAIC0zMDQsMTMwMyArMzA2LDcwMjggQEAKICAgICBDWEZBX01lYXN1cmVtZW50KDAuNSwgWEZBX1VOSVRfUHQpLA0KIH07DQogZXh0ZXJuIGNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPIGdfWEZBQXR0cmlidXRlRGF0YVtdID0gew0KLSAgICB7MHg2OCwgTCJoIiwgWEZBX0FUVFJJQlVURV9ILCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KLSAgICB7MHg3NywgTCJ3IiwgWEZBX0FUVFJJQlVURV9XLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KLSAgICB7MHg3OCwgTCJ4IiwgWEZBX0FUVFJJQlVURV9YLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQotICAgIHsweDc5LCBMInkiLCBYRkFfQVRUUklCVVRFX1ksIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCi0gICAgezB4MjFhZWQsIEwiaWQiLCBYRkFfQVRUUklCVVRFX0lkLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDI1MzYzLCBMInRvIiwgWEZBX0FUVFJJQlVURV9UbywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopTlVMTH0sDQotICAgIHsweGNiMGFjOSwgTCJsaW5lVGhyb3VnaCIsIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2gsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCi0gICAgezB4MjI4MmM3MywgTCJoQWxpZ24iLCBYRkFfQVRUUklCVVRFX0hBbGlnbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0xlZnR9LA0KLSAgICB7MHgyYzFjN2YxLCBMInR5cGVmYWNlIiwgWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKUwiQ291cmllciJ9LA0KLSAgICB7MHgzMTA2YzNhLCBMImJlZm9yZVRhcmdldCIsIFhGQV9BVFRSSUJVVEVfQmVmb3JlVGFyZ2V0LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtIHwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDM4NDhiM2YsIEwibmV4dCIsIFhGQV9BVFRSSUJVVEVfTmV4dCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KLSAgICB7MHg0M2UzNDliLCBMImRhdGFSb3dDb3VudCIsIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHg1NTE4YzI1LCBMImJyZWFrIiwgWEZBX0FUVFJJQlVURV9CcmVhaywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0Nsb3NlfSwNCi0gICAgezB4NWNlNjE5NSwgTCJ2U2Nyb2xsUG9saWN5IiwgWEZBX0FUVFJJQlVURV9WU2Nyb2xsUG9saWN5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQotICAgIHsweDhjNzRhZTksIEwiZm9udEhvcml6b250YWxTY2FsZSIsIFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilMIjEwMCUifSwNCi0gICAgezB4OGQ0ZjFjNywgTCJ0ZXh0SW5kZW50IiwgWEZBX0FUVFJJQlVURV9UZXh0SW5kZW50LCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KLSAgICB7MHg5N2MxYzY1LCBMImNvbnRleHQiLCBYRkFfQVRUUklCVVRFX0NvbnRleHQsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiwgKHZvaWQqKTB9LA0KLSAgICB7MHg5ODc2NTc4LCBMInRyYXlPdXQiLCBYRkFfQVRUUklCVVRFX1RyYXlPdXQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9BdXRvfSwNCi0gICAgezB4YTJlMzUxNCwgTCJjYXAiLCBYRkFfQVRUUklCVVRFX0NhcCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZX0sDQotICAgIHsweGIzNTQzYTYsIEwibWF4IiwgWEZBX0FUVFJJQlVURV9NYXgsIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhiMzU2Y2E0LCBMIm1pbiIsIFhGQV9BVFRSSUJVVEVfTWluLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMX0sDQotICAgIHsweGJiOGRmNWQsIEwicmVmIiwgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhiYjhmM2RmLCBMInJpZCIsIFhGQV9BVFRSSUJVVEVfUmlkLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhjMDgwY2QzLCBMInVybCIsIFhGQV9BVFRSSUJVVEVfVXJsLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweGNmZWEwMmUsIEwibGVmdEluc2V0IiwgWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQotICAgIHsweDEwMjZjNTlkLCBMIndpZG93cyIsIFhGQV9BVFRSSUJVVEVfV2lkb3dzLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQotICAgIHsweDEwNTllYzE4LCBMImxldmVsIiwgWEZBX0FUVFJJQlVURV9MZXZlbCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKikwfSwNCi0gICAgezB4MTM1NmNhZjgsIEwiYm90dG9tSW5zZXQiLCBYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KLSAgICB7MHgxM2EwOGJkYiwgTCJvdmVyZmxvd1RhcmdldCIsIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUYXJnZXQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDE0MTRkNDMxLCBMImFsbG93TWFjcm8iLCBYRkFfQVRUUklCVVRFX0FsbG93TWFjcm8sIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCi0gICAgezB4MTRhMzJkNTIsIEwicGFnZVBvc2l0aW9uIiwgWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Bbnl9LA0KLSAgICB7MHgxNTE3ZGZhMSwgTCJjb2x1bW5XaWR0aHMiLCBYRkFfQVRUUklCVVRFX0NvbHVtbldpZHRocywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4MTY5MTM0YTEsIEwib3ZlcmZsb3dMZWFkZXIiLCBYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHgxYjhkY2UzZSwgTCJhY3Rpb24iLCBYRkFfQVRUUklCVVRFX0FjdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0luY2x1ZGV9LA0KLSAgICB7MHgxZTQ1OWI4ZiwgTCJub25SZXB1ZGlhdGlvbiIsIFhGQV9BVFRSSUJVVEVfTm9uUmVwdWRpYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDFlYzhhYjJjLCBMInJhdGUiLCBYRkFfQVRUUklCVVRFX1JhdGUsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKik1MH0sDQotICAgIHsweDFlZjNhNjRhLCBMImFsbG93UmljaFRleHQiLCBYRkFfQVRUUklCVVRFX0FsbG93UmljaFRleHQsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCi0gICAgezB4MjAzOGM5YjIsIEwicm9sZSIsIFhGQV9BVFRSSUJVVEVfUm9sZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4MjA5MTQzNjcsIEwib3ZlcmZsb3dUcmFpbGVyIiwgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDIyNmNhOGYxLCBMIm9wZXJhdGlvbiIsIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDI0ZDg1MTY3LCBMInRpbWVvdXQiLCBYRkFfQVRUUklCVVRFX1RpbWVvdXQsIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCAodm9pZCopTlVMTH0sDQotICAgIHsweDI1NzY0NDM2LCBMInRvcEluc2V0IiwgWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCi0gICAgezB4MjU4Mzk4NTIsIEwiYWNjZXNzIiwgWEZBX0FUVFJJQlVURV9BY2Nlc3MsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcGVufSwNCi0gICAgezB4MjY4YjdlYzEsIEwiY29tbWFuZFR5cGUiLCBYRkFfQVRUUklCVVRFX0NvbW1hbmRUeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd259LA0KLSAgICB7MHgyOGRlZTZlOSwgTCJmb3JtYXQiLCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDI4ZTE3ZTkxLCBMImRhdGFQcmVwIiwgWEZBX0FUVFJJQlVURV9EYXRhUHJlcCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KLSAgICB7MHgyOTJiODhmZSwgTCJ3aWRnZXREYXRhIiwgWEZBX0FUVFJJQlVURV9XaWRnZXREYXRhLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1VOS05PV04sICh2b2lkKikwfSwNCi0gICAgezB4Mjk0MThiYjcsIEwiYWJiciIsIFhGQV9BVFRSSUJVVEVfQWJiciwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsICh2b2lkKikwfSwNCi0gICAgezB4MmE4MmQ5OWMsIEwibWFyZ2luUmlnaHQiLCBYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KLSAgICB7MHgyYjVkZjUxZSwgTCJkYXRhRGVzY3JpcHRpb24iLCBYRkFfQVRUUklCVVRFX0RhdGFEZXNjcmlwdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHgyYmIzZjQ3MCwgTCJlbmNpcGhlck9ubHkiLCBYRkFfQVRUUklCVVRFX0VuY2lwaGVyT25seSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4MmNkNzkwMzMsIEwia2VybmluZ01vZGUiLCBYRkFfQVRUUklCVVRFX0tlcm5pbmdNb2RlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9uZX0sDQotICAgIHsweDJlZTc2NzhmLCBMInJvdGF0ZSIsIFhGQV9BVFRSSUJVVEVfUm90YXRlLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNSl9LA0KLSAgICB7MHgyZjEwNWY3MiwgTCJ3b3JkQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1dvcmRDaGFyYWN0ZXJDb3VudCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTd9LA0KLSAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDM0YWUxMDNjLCBMInJlc2VydmUiLCBYRkFfQVRUUklCVVRFX1Jlc2VydmUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyA0KX0sDQotICAgIHsweDM2NTA1NTdlLCBMInRleHRMb2NhdGlvbiIsIFhGQV9BVFRSSUJVVEVfVGV4dExvY2F0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQmVsb3d9LA0KLSAgICB7MHgzOWNkYjBhMiwgTCJwcmlvcml0eSIsIFhGQV9BVFRSSUJVVEVfUHJpb3JpdHksIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9DdXN0b219LA0KLSAgICB7MHgzYTAyNzNhNiwgTCJ1bmRlcmxpbmUiLCBYRkFfQVRUUklCVVRFX1VuZGVybGluZSwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KLSAgICB7MHgzYjU4MjI4NiwgTCJtb2R1bGVXaWR0aCIsIFhGQV9BVFRSSUJVVEVfTW9kdWxlV2lkdGgsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAzKX0sDQotICAgIHsweDNkMTIzYzI2LCBMImh5cGhlbmF0ZSIsIFhGQV9BVFRSSUJVVEVfSHlwaGVuYXRlLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQotICAgIHsweDNlN2FmOTRmLCBMImxpc3RlbiIsIFhGQV9BVFRSSUJVVEVfTGlzdGVuLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fUmVmT25seX0sDQotICAgIHsweDQxNTZlZTNmLCBMImRlbGltaXRlciIsIFhGQV9BVFRSSUJVVEVfRGVsaW1pdGVyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDQ1M2VhZjM4LCBMInN0YXJ0TmV3IiwgWEZBX0FUVFJJQlVURV9TdGFydE5ldywgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KLSAgICB7MHg0NWE2ZGFmOCwgTCJlb2ZBY3Rpb24iLCBYRkFfQVRUUklCVVRFX0VvZkFjdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Nb3ZlTGFzdH0sDQotICAgIHsweDQ3Y2ZhNDNhLCBMImFsbG93TmV1dHJhbCIsIFhGQV9BVFRSSUJVVEVfQWxsb3dOZXV0cmFsLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQotICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLCBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDQ4NzNjNjAxLCBMImJhc2VsaW5lU2hpZnQiLCBYRkFfQVRUUklCVVRFX0Jhc2VsaW5lU2hpZnQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQotICAgIHsweDRiMzE5NzY3LCBMIm92ZXJsaW5lUGVyaW9kIiwgWEZBX0FUVFJJQlVURV9PdmVybGluZVBlcmlvZCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FsbH0sDQotICAgIHsweDRiOGJjODQwLCBMImZyYWNEaWdpdHMiLCBYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikyfSwNCi0gICAgezB4NGVmM2QwMmMsIEwib3JpZW50YXRpb24iLCBYRkFfQVRUUklCVVRFX09yaWVudGF0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fUG9ydHJhaXR9LA0KLSAgICB7MHg0ZmRjMzQ1NCwgTCJ0aW1lU3RhbXAiLCBYRkFfQVRUUklCVVRFX1RpbWVTdGFtcCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfWERQLCAodm9pZCopTlVMTH0sDQotICAgIHsweDUyNjY2ZjFjLCBMInByaW50Q2hlY2tEaWdpdCIsIFhGQV9BVFRSSUJVVEVfUHJpbnRDaGVja0RpZ2l0LCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQotICAgIHsweDUzNDcyOWM5LCBMIm1hcmdpbkxlZnQiLCBYRkFfQVRUUklCVVRFX01hcmdpbkxlZnQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQotICAgIHsweDUzOTJlYTU4LCBMInN0cm9rZSIsIFhGQV9BVFRSSUJVVEVfU3Ryb2tlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU29saWR9LA0KLSAgICB7MHg1NDA0ZDZkZiwgTCJtb2R1bGVIZWlnaHQiLCBYRkFfQVRUUklCVVRFX01vZHVsZUhlaWdodCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDIpfSwNCi0gICAgezB4NTRmYTcyMmMsIEwidHJhbnNmZXJFbmNvZGluZyIsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDU1MmQ5YWQ1LCBMInVzYWdlIiwgWEZBX0FUVFJJQlVURV9Vc2FnZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0V4cG9ydEFuZEltcG9ydH0sDQotICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGV9LA0KLSAgICB7MHg1NzM5ZDFmZiwgTCJyYWRpeE9mZnNldCIsIFhGQV9BVFRSSUJVVEVfUmFkaXhPZmZzZXQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQotICAgIHsweDU3NzY4MmFjLCBMInByZXNlcnZlIiwgWEZBX0FUVFJJQlVURV9QcmVzZXJ2ZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4NThiZTI4NzAsIEwiYWxpYXNOb2RlIiwgWEZBX0FUVFJJQlVURV9BbGlhc05vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiwgKHZvaWQqKTB9LA0KLSAgICB7MHg1YTMyZTQ5MywgTCJtdWx0aUxpbmUiLCBYRkFfQVRUUklCVVRFX011bHRpTGluZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KLSAgICB7MHg1YTUwZTllNiwgTCJ2ZXJzaW9uIiwgWEZBX0FUVFJJQlVURV9WZXJzaW9uLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHg1YWIyM2I2YywgTCJzdGFydENoYXIiLCBYRkFfQVRUUklCVVRFX1N0YXJ0Q2hhciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4NWI3MDdhMzUsIEwic2NyaXB0VGVzdCIsIFhGQV9BVFRSSUJVVEVfU2NyaXB0VGVzdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yfSwNCi0gICAgezB4NWMwNTQ3NTUsIEwic3RhcnRBbmdsZSIsIFhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDUpfSwNCi0gICAgezB4NWVjOTU4YzAsIEwiY3Vyc29yVHlwZSIsIFhGQV9BVFRSSUJVVEVfQ3Vyc29yVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Gb3J3YXJkT25seX0sDQotICAgIHsweDVmNzYwYjUwLCBMImRpZ2l0YWxTaWduYXR1cmUiLCBYRkFfQVRUUklCVVRFX0RpZ2l0YWxTaWduYXR1cmUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDYwYTYxZWRkLCBMImNvZGVUeXBlIiwgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4NjBkNGM4YjEsIEwib3V0cHV0IiwgWEZBX0FUVFJJQlVURV9PdXRwdXQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsICh2b2lkKilOVUxMfSwNCi0gICAgezB4NjQxMTBhYjUsIEwiYm9va2VuZFRyYWlsZXIiLCBYRkFfQVRUUklCVVRFX0Jvb2tlbmRUcmFpbGVyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHg2NWUzMGM2NywgTCJpbWFnaW5nQkJveCIsIFhGQV9BVFRSSUJVVEVfSW1hZ2luZ0JCb3gsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTCJub25lIn0sDQotICAgIHsweDY2NTM5YzQ4LCBMImV4Y2x1ZGVJbml0aWFsQ2FwIiwgWEZBX0FUVFJJQlVURV9FeGNsdWRlSW5pdGlhbENhcCwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KLSAgICB7MHg2NjY0MmY4ZiwgTCJmb3JjZSIsIFhGQV9BVFRSSUJVVEVfRm9yY2UsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopTlVMTH0sDQotICAgIHsweDY5YWEyMjkyLCBMImNybFNpZ24iLCBYRkFfQVRUUklCVVRFX0NybFNpZ24sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDZhMzQwNWRkLCBMInByZXZpb3VzIiwgWEZBX0FUVFJJQlVURV9QcmV2aW91cywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KLSAgICB7MHg2YTk1Yzk3NiwgTCJwdXNoQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1B1c2hDaGFyYWN0ZXJDb3VudCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTN9LA0KLSAgICB7MHg2YjZkZGNmYiwgTCJudWxsVGVzdCIsIFhGQV9BVFRSSUJVVEVfTnVsbFRlc3QsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZH0sDQotICAgIHsweDZjZmE4MjhhLCBMInJ1bkF0IiwgWEZBX0FUVFJJQlVURV9SdW5BdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sDQotICAgIHsweDczMWUwNjY1LCBMInNwYWNlQmVsb3ciLCBYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQotICAgIHsweDc0Nzg4ZjhiLCBMInN3ZWVwQW5nbGUiLCBYRkFfQVRUUklCVVRFX1N3ZWVwQW5nbGUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyA3KX0sDQotICAgIHsweDc4YmZmNTMxLCBMIm51bWJlck9mQ2VsbHMiLCBYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCi0gICAgezB4Nzk1NDMwNTUsIEwibGV0dGVyU3BhY2luZyIsIFhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4Nzk5NzVmMmIsIEwibG9ja1R5cGUiLCBYRkFfQVRUUklCVVRFX0xvY2tUeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1JlYWRPbmx5fSwNCi0gICAgezB4N2EwY2M0NzEsIEwicGFzc3dvcmRDaGFyIiwgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTCIqIn0sDQotICAgIHsweDdhN2NjMzQxLCBMInZBbGlnbiIsIFhGQV9BVFRSSUJVVEVfVkFsaWduLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVG9wfSwNCi0gICAgezB4N2IyOTYzMGEsIEwic291cmNlQmVsb3ciLCBYRkFfQVRUUklCVVRFX1NvdXJjZUJlbG93LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1VwZGF0ZX0sDQotICAgIHsweDdiOTVlNjYxLCBMImludmVydGVkIiwgWEZBX0FUVFJJQlVURV9JbnZlcnRlZCwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KLSAgICB7MHg3YzJmZDgwYiwgTCJtYXJrIiwgWEZBX0FUVFJJQlVURV9NYXJrLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRGVmYXVsdH0sDQotICAgIHsweDdjMmZmNmFlLCBMIm1heEgiLCBYRkFfQVRUUklCVVRFX01heEgsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQotICAgIHsweDdjMmZmNmJkLCBMIm1heFciLCBYRkFfQVRUUklCVVRFX01heFcsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQotICAgIHsweDdjNzMyYTY2LCBMInRydW5jYXRlIiwgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KLSAgICB7MHg3ZDAyMzU2YywgTCJtaW5IIiwgWEZBX0FUVFJJQlVURV9NaW5ILCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KLSAgICB7MHg3ZDAyMzU3YiwgTCJtaW5XIiwgWEZBX0FUVFJJQlVURV9NaW5XLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KLSAgICB7MHg3ZDBiNWZjYSwgTCJpbml0aWFsIiwgWEZBX0FUVFJJQlVURV9Jbml0aWFsLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMX0sDQotICAgIHsweDdkOWZkN2M1LCBMIm1vZGUiLCBYRkFfQVRUUklCVVRFX01vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVXNlUHJpbnRlclNldHRpbmd9LA0KLSAgICB7MHg3ZTdlODQ1ZSwgTCJsYXlvdXQiLCBYRkFfQVRUUklCVVRFX0xheW91dCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9ufSwNCi0gICAgezB4N2Y2ZmQzZDcsIEwic2VydmVyIiwgWEZBX0FUVFJJQlVURV9TZXJ2ZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDgyNGYyMWI3LCBMImVtYmVkUERGIiwgWEZBX0FUVFJJQlVURV9FbWJlZFBERiwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KLSAgICB7MHg4MzQwZWE2NiwgTCJvZGRPckV2ZW4iLCBYRkFfQVRUUklCVVRFX09kZE9yRXZlbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FueX0sDQotICAgIHsweDgzNmQ0ZDdjLCBMInRhYkRlZmF1bHQiLCBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDg4NTU4MDVmLCBMImNvbnRhaW5zIiwgWEZBX0FUVFJJQlVURV9Db250YWlucywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0RhdGF9LA0KLSAgICB7MHg4YTY5MjUyMSwgTCJyaWdodEluc2V0IiwgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KLSAgICB7MHg4YWYyZTY1NywgTCJtYXhDaGFycyIsIFhGQV9BVFRSSUJVVEVfTWF4Q2hhcnMsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCi0gICAgezB4OGI5MGUxZjIsIEwib3BlbiIsIFhGQV9BVFRSSUJVVEVfT3BlbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1VzZXJDb250cm9sfSwNCi0gICAgezB4OGM5OTM3N2UsIEwicmVsYXRpb24iLCBYRkFfQVRUUklCVVRFX1JlbGF0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweDhkMTgxZDYxLCBMIndpZGVOYXJyb3dSYXRpbyIsIFhGQV9BVFRSSUJVVEVfV2lkZU5hcnJvd1JhdGlvLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKUwiMzoxIn0sDQotICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4OGUyOWQ3OTQsIEwic2lnbmF0dXJlVHlwZSIsIFhGQV9BVFRSSUJVVEVfU2lnbmF0dXJlVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0ZpbHRlcn0sDQotICAgIHsweDhlYzYyMDRjLCBMImxpbmVUaHJvdWdoUGVyaW9kIiwgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaFBlcmlvZCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FsbH0sDQotICAgIHsweDhlZDE4MmQxLCBMInNoYXBlIiwgWEZBX0FUVFJJQlVURV9TaGFwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZX0sDQotICAgIHsweDhmYTAxNzkwLCBMInRhYlN0b3BzIiwgWEZBX0FUVFJJQlVURV9UYWJTdG9wcywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4OGZjMzZjMGEsIEwib3V0cHV0QmVsb3ciLCBYRkFfQVRUUklCVVRFX091dHB1dEJlbG93LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1dhcm59LA0KLSAgICB7MHg5MDQxZDRiMCwgTCJzaG9ydCIsIFhGQV9BVFRSSUJVVEVfU2hvcnQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQotICAgIHsweDkwN2M3NzE5LCBMImZvbnRWZXJ0aWNhbFNjYWxlIiwgWEZBX0FUVFJJQlVURV9Gb250VmVydGljYWxTY2FsZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilMIjEwMCUifSwNCi0gICAgezB4OTQ0NDZkY2MsIEwidGhpY2tuZXNzIiwgWEZBX0FUVFJJQlVURV9UaGlja25lc3MsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyA4KX0sDQotICAgIHsweDk1N2ZhMDA2LCBMImNvbW1pdE9uIiwgWEZBX0FUVFJJQlVURV9Db21taXRPbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1NlbGVjdH0sDQotICAgIHsweDk4MmJkODkyLCBMInJlbWFpbkNoYXJhY3RlckNvdW50IiwgWEZBX0FUVFJJQlVURV9SZW1haW5DaGFyYWN0ZXJDb3VudCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTN9LA0KLSAgICB7MHg5OGZkNGQ4MSwgTCJrZXlBZ3JlZW1lbnQiLCBYRkFfQVRUUklCVVRFX0tleUFncmVlbWVudCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4OTk4MDBkN2EsIEwiZXJyb3JDb3JyZWN0aW9uTGV2ZWwiLCBYRkFfQVRUUklCVVRFX0Vycm9yQ29ycmVjdGlvbkxldmVsLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHg5YTYzZGEzZCwgTCJ1cHNNb2RlIiwgWEZBX0FUVFJJQlVURV9VcHNNb2RlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVXNDYXJyaWVyfSwNCi0gICAgezB4OWNjMTdkNzUsIEwibWVyZ2VNb2RlIiwgWEZBX0FUVFJJQlVURV9NZXJnZU1vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Db25zdW1lRGF0YX0sDQotICAgIHsweDlkODMzZDc1LCBMImNpcmN1bGFyIiwgWEZBX0FUVFJJQlVURV9DaXJjdWxhciwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KLSAgICB7MHg5ZDhlZTIwNCwgTCJwc05hbWUiLCBYRkFfQVRUUklCVVRFX1BzTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopTlVMTH0sDQotICAgIHsweDlkY2MzYWIzLCBMInRyYWlsZXIiLCBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweGEwOTMzOTU0LCBMInVuaWNvZGVSYW5nZSIsIFhGQV9BVFRSSUJVVEVfVW5pY29kZVJhbmdlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKilOVUxMfSwNCi0gICAgezB4YTFiMGQyZjUsIEwiZXhlY3V0ZVR5cGUiLCBYRkFfQVRUUklCVVRFX0V4ZWN1dGVUeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fSW1wb3J0fSwNCi0gICAgezB4YTI1YTg4M2QsIEwiZHVwbGV4SW1wb3NpdGlvbiIsIFhGQV9BVFRSSUJVVEVfRHVwbGV4SW1wb3NpdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0xvbmdFZGdlfSwNCi0gICAgezB4YTQyY2ExYjcsIEwidHJheUluIiwgWEZBX0FUVFJJQlVURV9UcmF5SW4sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9BdXRvfSwNCi0gICAgezB4YTQzM2YwMDEsIEwiYmluZGluZ05vZGUiLCBYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1VOS05PV04sICh2b2lkKikwfSwNCi0gICAgezB4YTUzNDBmZjUsIEwiYm9mQWN0aW9uIiwgWEZBX0FUVFJJQlVURV9Cb2ZBY3Rpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTW92ZUZpcnN0fSwNCi0gICAgezB4YTViNDEwY2YsIEwic2F2ZSIsIFhGQV9BVFRSSUJVVEVfU2F2ZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KLSAgICB7MHhhNjExOGM4OSwgTCJ0YXJnZXRUeXBlIiwgWEZBX0FUVFJJQlVURV9UYXJnZXRUeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQotICAgIHsweGE2NjQwNGNiLCBMImtleUVuY2lwaGVybWVudCIsIFhGQV9BVFRSSUJVVEVfS2V5RW5jaXBoZXJtZW50LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhhNjcxMDI2MiwgTCJjcmVkZW50aWFsU2VydmVyUG9saWN5IiwgWEZBX0FUVFJJQlVURV9DcmVkZW50aWFsU2VydmVyUG9saWN5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KLSAgICB7MHhhNjg2OTc1YiwgTCJzaXplIiwgWEZBX0FUVFJJQlVURV9TaXplLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNil9LA0KLSAgICB7MHhhODVlNzRmMywgTCJpbml0aWFsTnVtYmVyIiwgWEZBX0FUVFJJQlVURV9Jbml0aWFsTnVtYmVyLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMX0sDQotICAgIHsweGFiZWYzN2UzLCBMInNsb3BlIiwgWEZBX0FUVFJJQlVURV9TbG9wZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0JhY2tzbGFzaH0sDQotICAgIHsweGFiZmE2YzRmLCBMImNTcGFjZSIsIFhGQV9BVFRSSUJVVEVfQ1NwYWNlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKUwiU1JHQiJ9LA0KLSAgICB7MHhhYzA2ZTJiMCwgTCJjb2xTcGFuIiwgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMX0sDQotICAgIHsweGFkYzRjNzdiLCBMImJpbmRpbmciLCBYRkFfQVRUUklCVVRFX0JpbmRpbmcsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweGFmNzU0NjEzLCBMImNoZWNrc3VtIiwgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhiMDQ1ZmJjNSwgTCJjaGFyRW5jb2RpbmciLCBYRkFfQVRUUklCVVRFX0NoYXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilMIlVURi04In0sDQotICAgIHsweGIwZTU0ODVkLCBMImJpbmQiLCBYRkFfQVRUUklCVVRFX0JpbmQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhiMTIxMjhiNywgTCJ0ZXh0RW50cnkiLCBYRkFfQVRUUklCVVRFX1RleHRFbnRyeSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KLSAgICB7MHhiMzczYTg2MiwgTCJhcmNoaXZlIiwgWEZBX0FUVFJJQlVURV9BcmNoaXZlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhiNTk4YTFmNywgTCJ1dWlkIiwgWEZBX0FUVFJJQlVURV9VdWlkLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9YRFAsICh2b2lkKilOVUxMfSwNCi0gICAgezB4YjVlNDliZjIsIEwicG9zdHVyZSIsIFhGQV9BVFRSSUJVVEVfUG9zdHVyZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9ybWFsfSwNCi0gICAgezB4YjZiNDQxNzIsIEwiYWZ0ZXIiLCBYRkFfQVRUUklCVVRFX0FmdGVyLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQotICAgIHsweGI3MTY0NjdiLCBMIm9ycGhhbnMiLCBYRkFfQVRUUklCVVRFX09ycGhhbnMsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCi0gICAgezB4YmMwYzQ2OTUsIEwicXVhbGlmaWVkTmFtZSIsIFhGQV9BVFRSSUJVVEVfUXVhbGlmaWVkTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweGJjOGZhMzUwLCBMImxvY2FsZSIsIFhGQV9BVFRSSUJVVEVfTG9jYWxlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhiZDZlMWQ4OCwgTCJ3ZWlnaHQiLCBYRkFfQVRUUklCVVRFX1dlaWdodCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9ybWFsfSwNCi0gICAgezB4YmQ5NmEwZTksIEwidW5kZXJsaW5lUGVyaW9kIiwgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9BbGx9LA0KLSAgICB7MHhiZGU5YWJkYSwgTCJkYXRhIiwgWEZBX0FUVFJJQlVURV9EYXRhLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTGlua30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCAodm9pZCopTlVMTH0sDQotICAgIHsweGJlOWJhNDcyLCBMIm51bWJlcmVkIiwgWEZBX0FUVFJJQlVURV9OdW1iZXJlZCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTF9LA0KLSAgICB7MHhjMDM1YzZiMSwgTCJkYXRhQ29sdW1uQ291bnQiLCBYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4YzBlYzlmYTQsIEwib3ZlcmxpbmUiLCBYRkFfQVRUUklCVVRFX092ZXJsaW5lLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQotICAgIHsweGMyYmEwOTIzLCBMInVybFBvbGljeSIsIFhGQV9BVFRSSUJVVEVfVXJsUG9saWN5LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhjMmJkNDBmZCwgTCJhbmNob3JUeXBlIiwgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdH0sDQotICAgIHsweGMzOWE4OGJkLCBMImxhYmVsUmVmIiwgWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4YzNjMTQ0MmYsIEwiYm9va2VuZExlYWRlciIsIFhGQV9BVFRSSUJVVEVfQm9va2VuZExlYWRlciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4YzQ1NDdhMDgsIEwibWF4TGVuZ3RoIiwgWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikgLSAxfSwNCi0gICAgezB4YzRmZWQwOWIsIEwiYWNjZXNzS2V5IiwgWEZBX0FUVFJJQlVURV9BY2Nlc3NLZXksIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweGM1NzYyMTU3LCBMImN1cnNvckxvY2F0aW9uIiwgWEZBX0FUVFJJQlVURV9DdXJzb3JMb2NhdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9DbGllbnR9LA0KLSAgICB7MHhjODYwZjMwYSwgTCJkZWxheWVkT3BlbiIsIFhGQV9BVFRSSUJVVEVfRGVsYXllZE9wZW4sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLCBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4Y2E1ZGMyN2MsIEwiZGF0YUVuY2lwaGVybWVudCIsIFhGQV9BVFRSSUJVVEVfRGF0YUVuY2lwaGVybWVudCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4Y2IxNTA0NzksIEwiYWZ0ZXJUYXJnZXQiLCBYRkFfQVRUUklCVVRFX0FmdGVyVGFyZ2V0LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhjYmNhZjY2ZCwgTCJsZWFkZXIiLCBYRkFfQVRUUklCVVRFX0xlYWRlciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4Y2NhNzg5N2UsIEwicGlja2VyIiwgWEZBX0FUVFJJQlVURV9QaWNrZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ib3N0fSwNCi0gICAgezB4Y2Q3ZjdiNTQsIEwiZnJvbSIsIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKilOVUxMfSwNCi0gICAgezB4Y2VhNWU2MmMsIEwiYmFzZVByb2ZpbGUiLCBYRkFfQVRUUklCVVRFX0Jhc2VQcm9maWxlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRnVsbH0sDQotICAgIHsweGQxNzFiMjQwLCBMImFzcGVjdCIsIFhGQV9BVFRSSUJVVEVfQXNwZWN0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRml0fSwNCi0gICAgezB4ZDNjODRkMjUsIEwicm93Q29sdW1uUmF0aW8iLCBYRkFfQVRUUklCVVRFX1Jvd0NvbHVtblJhdGlvLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhkNGIwMTkyMSwgTCJsaW5lSGVpZ2h0IiwgWEZBX0FUVFJJQlVURV9MaW5lSGVpZ2h0LCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMSl9LA0KLSAgICB7MHhkNGNjNTNmOCwgTCJoaWdobGlnaHQiLCBYRkFfQVRUUklCVVRFX0hpZ2hsaWdodCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0ludmVydGVkfSwNCi0gICAgezB4ZDUwZjkwM2EsIEwidmFsdWVSZWYiLCBYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhkNTI0ODJlMCwgTCJtYXhFbnRyaWVzIiwgWEZBX0FUVFJJQlVURV9NYXhFbnRyaWVzLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgKHZvaWQqKTV9LA0KLSAgICB7MHhkNTdjNTEzYywgTCJkYXRhTGVuZ3RoIiwgWEZBX0FUVFJJQlVURV9EYXRhTGVuZ3RoLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhkNjEyOGQ4ZCwgTCJhY3Rpdml0eSIsIFhGQV9BVFRSSUJVVEVfQWN0aXZpdHksIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9DbGlja30sDQotICAgIHsweGQ2YTM5OTkwLCBMImlucHV0IiwgWEZBX0FUVFJJQlVURV9JbnB1dCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIFhGQV9BVFRSSUJVVEVfVmFsdWUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyB8IFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhkNzA3OThjMiwgTCJibGFua09yTm90QmxhbmsiLCBYRkFfQVRUUklCVVRFX0JsYW5rT3JOb3RCbGFuaywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FueX0sDQotICAgIHsweGQ4NjFmOGFmLCBMImFkZFJldm9jYXRpb25JbmZvIiwgWEZBX0FUVFJJQlVURV9BZGRSZXZvY2F0aW9uSW5mbywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4ZDhmOTgyYmYsIEwiZ2VuZXJpY0ZhbWlseSIsIFhGQV9BVFRSSUJVVEVfR2VuZXJpY0ZhbWlseSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9TZXJpZn0sDQotICAgIHsweGQ5OTZmYTliLCBMImhhbmQiLCBYRkFfQVRUUklCVVRFX0hhbmQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9FdmVufSwNCi0gICAgezB4ZGI1NWZlYzUsIEwiaHJlZiIsIFhGQV9BVFRSSUJVVEVfSHJlZiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4ZGM3NTY3NmMsIEwidGV4dEVuY29kaW5nIiwgWEZBX0FUVFJJQlVURV9UZXh0RW5jb2RpbmcsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweGRlN2Y5MmJhLCBMImxlYWREaWdpdHMiLCBYRkFfQVRUUklCVVRFX0xlYWREaWdpdHMsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikgLSAxfSwNCi0gICAgezB4ZTExYTJjYmMsIEwicGVybWlzc2lvbnMiLCBYRkFfQVRUUklCVVRFX1Blcm1pc3Npb25zLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMn0sDQotICAgIHsweGUxOGI1NjU5LCBMInNwYWNlQWJvdmUiLCBYRkFfQVRUUklCVVRFX1NwYWNlQWJvdmUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQotICAgIHsweGUxYTI2YjU2LCBMImNvZGVCYXNlIiwgWEZBX0FUVFJJQlVURV9Db2RlQmFzZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4ZTM0OWQwNDQsIEwic3RvY2siLCBYRkFfQVRUUklCVVRFX1N0b2NrLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhlMzcyYWU5NywgTCJpc051bGwiLCBYRkFfQVRUUklCVVRFX0lzTnVsbCwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgKHZvaWQqKTB9LA0KLSAgICB7MHhlNGMzYTVlNSwgTCJyZXN0b3JlU3RhdGUiLCBYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX01hbnVhbH0sDQotICAgIHsweGU1Yzk2ZDZhLCBMImV4Y2x1ZGVBbGxDYXBzIiwgWEZBX0FUVFJJQlVURV9FeGNsdWRlQWxsQ2FwcywgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KLSAgICB7MHhlNjRiMTEyOSwgTCJmb3JtYXRUZXN0IiwgWEZBX0FUVFJJQlVURV9Gb3JtYXRUZXN0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZ30sDQotICAgIHsweGU2Zjk5NDg3LCBMImhTY3JvbGxQb2xpY3kiLCBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9BdXRvfSwNCi0gICAgezB4ZThkZGRmNTAsIEwiam9pbiIsIFhGQV9BVFRSSUJVVEVfSm9pbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZX0sDQotICAgIHsweGU4ZjExOGE4LCBMImtleUNlcnRTaWduIiwgWEZBX0FUVFJJQlVURV9LZXlDZXJ0U2lnbiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4ZTk0OGI5YTgsIEwicmFkaXVzIiwgWEZBX0FUVFJJQlVURV9SYWRpdXMsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQotICAgIHsweGU5OTZiMmZlLCBMInNvdXJjZUFib3ZlIiwgWEZBX0FUVFJJQlVURV9Tb3VyY2VBYm92ZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9XYXJufSwNCi0gICAgezB4ZWE3MDkwYTAsIEwib3ZlcnJpZGUiLCBYRkFfQVRUUklCVVRFX092ZXJyaWRlLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweGViMDkxMDAzLCBMImNsYXNzSWQiLCBYRkFfQVRUUklCVVRFX0NsYXNzSWQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQotICAgIHsweGViNTExYjU0LCBMImRpc2FibGUiLCBYRkFfQVRUUklCVVRFX0Rpc2FibGUsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCi0gICAgezB4ZWRhOTAxN2EsIEwic2NvcGUiLCBYRkFfQVRUUklCVVRFX1Njb3BlLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCi0gICAgezB4ZjE5Nzg0NGQsIEwibWF0Y2giLCBYRkFfQVRUUklCVVRFX01hdGNoLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT25jZX0sDQotICAgIHsweGYyMDA5MzM5LCBMInBsYWNlbWVudCIsIFhGQV9BVFRSSUJVVEVfUGxhY2VtZW50LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTGVmdH0sDQotICAgIHsweGY0ZmZjZTczLCBMImJlZm9yZSIsIFhGQV9BVFRSSUJVVEVfQmVmb3JlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQotICAgIHsweGY1MzFiMDU5LCBMIndyaXRpbmdTY3JpcHQiLCBYRkFfQVRUUklCVVRFX1dyaXRpbmdTY3JpcHQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXN0ZXJpc2t9LA0KLSAgICB7MHhmNTc1Y2E3NSwgTCJlbmRDaGFyIiwgWEZBX0FUVFJJQlVURV9FbmRDaGFyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgKHZvaWQqKTB9LA0KLSAgICB7MHhmNmI0YWZiMCwgTCJsb25nIiwgWEZBX0FUVFJJQlVURV9Mb25nLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KLSAgICB7MHhmNmI1OTU0MywgTCJpbnRhY3QiLCBYRkFfQVRUUklCVVRFX0ludGFjdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KLSAgICB7MHhmODg5ZTc0NywgTCJ4ZHBDb250ZW50IiwgWEZBX0FUVFJJQlVURV9YZHBDb250ZW50LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7MHhmZWE1M2VjNiwgTCJkZWNpcGhlck9ubHkiLCBYRkFfQVRUUklCVVRFX0RlY2lwaGVyT25seSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4NjgsIEwiaCIsIFhGQV9BVFRSSUJVVEVfSCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg3NywgTCJ3IiwgWEZBX0FUVFJJQlVURV9XLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDc4LCBMIngiLCBYRkFfQVRUUklCVVRFX1gsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg3OSwgTCJ5IiwgWEZBX0FUVFJJQlVURV9ZLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4MjFhZWQsIEwiaWQiLCBYRkFfQVRUUklCVVRFX0lkLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8DQorICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHgyNTM2MywgTCJ0byIsIFhGQV9BVFRSSUJVVEVfVG8sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKilOVUxMfSwNCisgICAgezB4Y2IwYWM5LCBMImxpbmVUaHJvdWdoIiwgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0xlZnR9LA0KKyAgICB7MHgyYzFjN2YxLCBMInR5cGVmYWNlIiwgWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTCJDb3VyaWVyIn0sDQorICAgIHsweDMxMDZjM2EsIEwiYmVmb3JlVGFyZ2V0IiwgWEZBX0FUVFJJQlVURV9CZWZvcmVUYXJnZXQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0IHwNCisgICAgICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyB8IFhGQV9YRFBQQUNLRVRfRm9ybSB8DQorICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHgzODQ4YjNmLCBMIm5leHQiLCBYRkFfQVRUUklCVVRFX05leHQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7MHg0M2UzNDliLCBMImRhdGFSb3dDb3VudCIsIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDU1MThjMjUsIEwiYnJlYWsiLCBYRkFfQVRUUklCVVRFX0JyZWFrLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9DbG9zZX0sDQorICAgIHsweDVjZTYxOTUsIEwidlNjcm9sbFBvbGljeSIsIFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweDhjNzRhZTksIEwiZm9udEhvcml6b250YWxTY2FsZSIsIFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKUwiMTAwJSJ9LA0KKyAgICB7MHg4ZDRmMWM3LCBMInRleHRJbmRlbnQiLCBYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4OTdjMWM2NSwgTCJjb250ZXh0IiwgWEZBX0FUVFJJQlVURV9Db250ZXh0LCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9VTktOT1dOLCAodm9pZCopMH0sDQorICAgIHsweDk4NzY1NzgsIEwidHJheU91dCIsIFhGQV9BVFRSSUJVVEVfVHJheU91dCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweGEyZTM1MTQsIEwiY2FwIiwgWEZBX0FUVFJJQlVURV9DYXAsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZX0sDQorICAgIHsweGIzNTQzYTYsIEwibWF4IiwgWEZBX0FUVFJJQlVURV9NYXgsIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsDQorICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGIzNTZjYTQsIEwibWluIiwgWEZBX0FUVFJJQlVURV9NaW4sIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMX0sDQorICAgIHsweGJiOGRmNWQsIEwicmVmIiwgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfA0KKyAgICAgICAgIFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4YmI4ZjNkZiwgTCJyaWQiLCBYRkFfQVRUUklCVVRFX1JpZCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGMwODBjZDMsIEwidXJsIiwgWEZBX0FUVFJJQlVURV9VcmwsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8DQorICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhjZmVhMDJlLCBMImxlZnRJbnNldCIsIFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDEwMjZjNTlkLCBMIndpZG93cyIsIFhGQV9BVFRSSUJVVEVfV2lkb3dzLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KKyAgICB7MHgxMDU5ZWMxOCwgTCJsZXZlbCIsIFhGQV9BVFRSSUJVVEVfTGV2ZWwsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgKHZvaWQqKTB9LA0KKyAgICB7MHgxMzU2Y2FmOCwgTCJib3R0b21JbnNldCIsIFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4MTNhMDhiZGIsIEwib3ZlcmZsb3dUYXJnZXQiLCBYRkFfQVRUUklCVVRFX092ZXJmbG93VGFyZ2V0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDE0MTRkNDMxLCBMImFsbG93TWFjcm8iLCBYRkFfQVRUUklCVVRFX0FsbG93TWFjcm8sDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKTB9LA0KKyAgICB7MHgxNGEzMmQ1MiwgTCJwYWdlUG9zaXRpb24iLCBYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbiwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQW55fSwNCisgICAgezB4MTUxN2RmYTEsIEwiY29sdW1uV2lkdGhzIiwgWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4MTY5MTM0YTEsIEwib3ZlcmZsb3dMZWFkZXIiLCBYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDFiOGRjZTNlLCBMImFjdGlvbiIsIFhGQV9BVFRSSUJVVEVfQWN0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9JbmNsdWRlfSwNCisgICAgezB4MWU0NTliOGYsIEwibm9uUmVwdWRpYXRpb24iLCBYRkFfQVRUUklCVVRFX05vblJlcHVkaWF0aW9uLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDFlYzhhYjJjLCBMInJhdGUiLCBYRkFfQVRUUklCVVRFX1JhdGUsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopNTB9LA0KKyAgICB7MHgxZWYzYTY0YSwgTCJhbGxvd1JpY2hUZXh0IiwgWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikwfSwNCisgICAgezB4MjAzOGM5YjIsIEwicm9sZSIsIFhGQV9BVFRSSUJVVEVfUm9sZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDIwOTE0MzY3LCBMIm92ZXJmbG93VHJhaWxlciIsIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUcmFpbGVyLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDIyNmNhOGYxLCBMIm9wZXJhdGlvbiIsIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4MjRkODUxNjcsIEwidGltZW91dCIsIFhGQV9BVFRSSUJVVEVfVGltZW91dCwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCAodm9pZCopTlVMTH0sDQorICAgIHsweDI1NzY0NDM2LCBMInRvcEluc2V0IiwgWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHgyNTgzOTg1MiwgTCJhY2Nlc3MiLCBYRkFfQVRUUklCVVRFX0FjY2VzcywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3Blbn0sDQorICAgIHsweDI2OGI3ZWMxLCBMImNvbW1hbmRUeXBlIiwgWEZBX0FUVFJJQlVURV9Db21tYW5kVHlwZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd259LA0KKyAgICB7MHgyOGRlZTZlOSwgTCJmb3JtYXQiLCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4MjhlMTdlOTEsIEwiZGF0YVByZXAiLCBYRkFfQVRUUklCVVRFX0RhdGFQcmVwLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwNCisgICAgezB4MjkyYjg4ZmUsIEwid2lkZ2V0RGF0YSIsIFhGQV9BVFRSSUJVVEVfV2lkZ2V0RGF0YSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiwgKHZvaWQqKTB9LA0KKyAgICB7MHgyOTQxOGJiNywgTCJhYmJyIiwgWEZBX0FUVFJJQlVURV9BYmJyLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsICh2b2lkKikwfSwNCisgICAgezB4MmE4MmQ5OWMsIEwibWFyZ2luUmlnaHQiLCBYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDJiNWRmNTFlLCBMImRhdGFEZXNjcmlwdGlvbiIsIFhGQV9BVFRSSUJVVEVfRGF0YURlc2NyaXB0aW9uLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHgyYmIzZjQ3MCwgTCJlbmNpcGhlck9ubHkiLCBYRkFfQVRUUklCVVRFX0VuY2lwaGVyT25seSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHgyY2Q3OTAzMywgTCJrZXJuaW5nTW9kZSIsIFhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7MHgyZWU3Njc4ZiwgTCJyb3RhdGUiLCBYRkFfQVRUUklCVVRFX1JvdGF0ZSwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNSl9LA0KKyAgICB7MHgyZjEwNWY3MiwgTCJ3b3JkQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1dvcmRDaGFyYWN0ZXJDb3VudCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopN30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDM0YWUxMDNjLCBMInJlc2VydmUiLCBYRkFfQVRUUklCVVRFX1Jlc2VydmUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDQpfSwNCisgICAgezB4MzY1MDU1N2UsIEwidGV4dExvY2F0aW9uIiwgWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0JlbG93fSwNCisgICAgezB4MzljZGIwYTIsIEwicHJpb3JpdHkiLCBYRkFfQVRUUklCVVRFX1ByaW9yaXR5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9DdXN0b219LA0KKyAgICB7MHgzYTAyNzNhNiwgTCJ1bmRlcmxpbmUiLCBYRkFfQVRUUklCVVRFX1VuZGVybGluZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDNiNTgyMjg2LCBMIm1vZHVsZVdpZHRoIiwgWEZBX0FUVFJJQlVURV9Nb2R1bGVXaWR0aCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMyl9LA0KKyAgICB7MHgzZDEyM2MyNiwgTCJoeXBoZW5hdGUiLCBYRkFfQVRUUklCVVRFX0h5cGhlbmF0ZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDNlN2FmOTRmLCBMImxpc3RlbiIsIFhGQV9BVFRSSUJVVEVfTGlzdGVuLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9SZWZPbmx5fSwNCisgICAgezB4NDE1NmVlM2YsIEwiZGVsaW1pdGVyIiwgWEZBX0FUVFJJQlVURV9EZWxpbWl0ZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4NDUzZWFmMzgsIEwic3RhcnROZXciLCBYRkFfQVRUUklCVVRFX1N0YXJ0TmV3LCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KKyAgICB7MHg0NWE2ZGFmOCwgTCJlb2ZBY3Rpb24iLCBYRkFfQVRUUklCVVRFX0VvZkFjdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTW92ZUxhc3R9LA0KKyAgICB7MHg0N2NmYTQzYSwgTCJhbGxvd05ldXRyYWwiLCBYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLCBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4NDg3M2M2MDEsIEwiYmFzZWxpbmVTaGlmdCIsIFhGQV9BVFRSSUJVVEVfQmFzZWxpbmVTaGlmdCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg0YjMxOTc2NywgTCJvdmVybGluZVBlcmlvZCIsIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmVQZXJpb2QsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FsbH0sDQorICAgIHsweDRiOGJjODQwLCBMImZyYWNEaWdpdHMiLCBYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKTJ9LA0KKyAgICB7MHg0ZWYzZDAyYywgTCJvcmllbnRhdGlvbiIsIFhGQV9BVFRSSUJVVEVfT3JpZW50YXRpb24sDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1BvcnRyYWl0fSwNCisgICAgezB4NGZkYzM0NTQsIEwidGltZVN0YW1wIiwgWEZBX0FUVFJJQlVURV9UaW1lU3RhbXAsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9YRFAsICh2b2lkKilOVUxMfSwNCisgICAgezB4NTI2NjZmMWMsIEwicHJpbnRDaGVja0RpZ2l0IiwgWEZBX0FUVFJJQlVURV9QcmludENoZWNrRGlnaXQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKTB9LA0KKyAgICB7MHg1MzQ3MjljOSwgTCJtYXJnaW5MZWZ0IiwgWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDUzOTJlYTU4LCBMInN0cm9rZSIsIFhGQV9BVFRSSUJVVEVfU3Ryb2tlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Tb2xpZH0sDQorICAgIHsweDU0MDRkNmRmLCBMIm1vZHVsZUhlaWdodCIsIFhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAyKX0sDQorICAgIHsweDU0ZmE3MjJjLCBMInRyYW5zZmVyRW5jb2RpbmciLCBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg1NTJkOWFkNSwgTCJ1c2FnZSIsIFhGQV9BVFRSSUJVVEVfVXNhZ2UsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0V4cG9ydEFuZEltcG9ydH0sDQorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZX0sDQorICAgIHsweDU3MzlkMWZmLCBMInJhZGl4T2Zmc2V0IiwgWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg1Nzc2ODJhYywgTCJwcmVzZXJ2ZSIsIFhGQV9BVFRSSUJVVEVfUHJlc2VydmUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg1OGJlMjg3MCwgTCJhbGlhc05vZGUiLCBYRkFfQVRUUklCVVRFX0FsaWFzTm9kZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiwgKHZvaWQqKTB9LA0KKyAgICB7MHg1YTMyZTQ5MywgTCJtdWx0aUxpbmUiLCBYRkFfQVRUUklCVVRFX011bHRpTGluZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDVhNTBlOWU2LCBMInZlcnNpb24iLCBYRkFfQVRUUklCVVRFX1ZlcnNpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg1YWIyM2I2YywgTCJzdGFydENoYXIiLCBYRkFfQVRUUklCVVRFX1N0YXJ0Q2hhciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDViNzA3YTM1LCBMInNjcmlwdFRlc3QiLCBYRkFfQVRUUklCVVRFX1NjcmlwdFRlc3QsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yfSwNCisgICAgezB4NWMwNTQ3NTUsIEwic3RhcnRBbmdsZSIsIFhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNSl9LA0KKyAgICB7MHg1ZWM5NThjMCwgTCJjdXJzb3JUeXBlIiwgWEZBX0FUVFJJQlVURV9DdXJzb3JUeXBlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRm9yd2FyZE9ubHl9LA0KKyAgICB7MHg1Zjc2MGI1MCwgTCJkaWdpdGFsU2lnbmF0dXJlIiwgWEZBX0FUVFJJQlVURV9EaWdpdGFsU2lnbmF0dXJlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDYwYTYxZWRkLCBMImNvZGVUeXBlIiwgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDYwZDRjOGIxLCBMIm91dHB1dCIsIFhGQV9BVFRSSUJVVEVfT3V0cHV0LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg2NDExMGFiNSwgTCJib29rZW5kVHJhaWxlciIsIFhGQV9BVFRSSUJVVEVfQm9va2VuZFRyYWlsZXIsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4NjVlMzBjNjcsIEwiaW1hZ2luZ0JCb3giLCBYRkFfQVRUUklCVVRFX0ltYWdpbmdCQm94LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTCJub25lIn0sDQorICAgIHsweDY2NTM5YzQ4LCBMImV4Y2x1ZGVJbml0aWFsQ2FwIiwgWEZBX0FUVFJJQlVURV9FeGNsdWRlSW5pdGlhbENhcCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDY2NjQyZjhmLCBMImZvcmNlIiwgWEZBX0FUVFJJQlVURV9Gb3JjZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopTlVMTH0sDQorICAgIHsweDY5YWEyMjkyLCBMImNybFNpZ24iLCBYRkFfQVRUUklCVVRFX0NybFNpZ24sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg2YTM0MDVkZCwgTCJwcmV2aW91cyIsIFhGQV9BVFRSSUJVVEVfUHJldmlvdXMsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7MHg2YTk1Yzk3NiwgTCJwdXNoQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1B1c2hDaGFyYWN0ZXJDb3VudCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopM30sDQorICAgIHsweDZiNmRkY2ZiLCBMIm51bGxUZXN0IiwgWEZBX0FUVFJJQlVURV9OdWxsVGVzdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWR9LA0KKyAgICB7MHg2Y2ZhODI4YSwgTCJydW5BdCIsIFhGQV9BVFRSSUJVVEVfUnVuQXQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sDQorICAgIHsweDczMWUwNjY1LCBMInNwYWNlQmVsb3ciLCBYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4NzQ3ODhmOGIsIEwic3dlZXBBbmdsZSIsIFhGQV9BVFRSSUJVVEVfU3dlZXBBbmdsZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNyl9LA0KKyAgICB7MHg3OGJmZjUzMSwgTCJudW1iZXJPZkNlbGxzIiwgWEZBX0FUVFJJQlVURV9OdW1iZXJPZkNlbGxzLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikwfSwNCisgICAgezB4Nzk1NDMwNTUsIEwibGV0dGVyU3BhY2luZyIsIFhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg3OTk3NWYyYiwgTCJsb2NrVHlwZSIsIFhGQV9BVFRSSUJVVEVfTG9ja1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1JlYWRPbmx5fSwNCisgICAgezB4N2EwY2M0NzEsIEwicGFzc3dvcmRDaGFyIiwgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilMIioifSwNCisgICAgezB4N2E3Y2MzNDEsIEwidkFsaWduIiwgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVG9wfSwNCisgICAgezB4N2IyOTYzMGEsIEwic291cmNlQmVsb3ciLCBYRkFfQVRUUklCVVRFX1NvdXJjZUJlbG93LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVXBkYXRlfSwNCisgICAgezB4N2I5NWU2NjEsIEwiaW52ZXJ0ZWQiLCBYRkFfQVRUUklCVVRFX0ludmVydGVkLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KKyAgICB7MHg3YzJmZDgwYiwgTCJtYXJrIiwgWEZBX0FUVFJJQlVURV9NYXJrLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9EZWZhdWx0fSwNCisgICAgezB4N2MyZmY2YWUsIEwibWF4SCIsIFhGQV9BVFRSSUJVVEVfTWF4SCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg3YzJmZjZiZCwgTCJtYXhXIiwgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDdjNzMyYTY2LCBMInRydW5jYXRlIiwgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCisgICAgezB4N2QwMjM1NmMsIEwibWluSCIsIFhGQV9BVFRSSUJVVEVfTWluSCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg3ZDAyMzU3YiwgTCJtaW5XIiwgWEZBX0FUVFJJQlVURV9NaW5XLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDdkMGI1ZmNhLCBMImluaXRpYWwiLCBYRkFfQVRUUklCVVRFX0luaXRpYWwsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMX0sDQorICAgIHsweDdkOWZkN2M1LCBMIm1vZGUiLCBYRkFfQVRUUklCVVRFX01vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1VzZVByaW50ZXJTZXR0aW5nfSwNCisgICAgezB4N2U3ZTg0NWUsIEwibGF5b3V0IiwgWEZBX0FUVFJJQlVURV9MYXlvdXQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9ufSwNCisgICAgezB4N2Y2ZmQzZDcsIEwic2VydmVyIiwgWEZBX0FUVFJJQlVURV9TZXJ2ZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg4MjRmMjFiNywgTCJlbWJlZFBERiIsIFhGQV9BVFRSSUJVVEVfRW1iZWRQREYsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQorICAgIHsweDgzNDBlYTY2LCBMIm9kZE9yRXZlbiIsIFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FueX0sDQorICAgIHsweDgzNmQ0ZDdjLCBMInRhYkRlZmF1bHQiLCBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ODg1NTgwNWYsIEwiY29udGFpbnMiLCBYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0RhdGF9LA0KKyAgICB7MHg4YTY5MjUyMSwgTCJyaWdodEluc2V0IiwgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDhhZjJlNjU3LCBMIm1heENoYXJzIiwgWEZBX0FUVFJJQlVURV9NYXhDaGFycywgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCisgICAgezB4OGI5MGUxZjIsIEwib3BlbiIsIFhGQV9BVFRSSUJVVEVfT3BlbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVXNlckNvbnRyb2x9LA0KKyAgICB7MHg4Yzk5Mzc3ZSwgTCJyZWxhdGlvbiIsIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDhkMTgxZDYxLCBMIndpZGVOYXJyb3dSYXRpbyIsIFhGQV9BVFRSSUJVVEVfV2lkZU5hcnJvd1JhdGlvLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTCIzOjEifSwNCisgICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4OGUyOWQ3OTQsIEwic2lnbmF0dXJlVHlwZSIsIFhGQV9BVFRSSUJVVEVfU2lnbmF0dXJlVHlwZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRmlsdGVyfSwNCisgICAgezB4OGVjNjIwNGMsIEwibGluZVRocm91Z2hQZXJpb2QiLCBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoUGVyaW9kLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9BbGx9LA0KKyAgICB7MHg4ZWQxODJkMSwgTCJzaGFwZSIsIFhGQV9BVFRSSUJVVEVfU2hhcGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZX0sDQorICAgIHsweDhmYTAxNzkwLCBMInRhYlN0b3BzIiwgWEZBX0FUVFJJQlVURV9UYWJTdG9wcywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDhmYzM2YzBhLCBMIm91dHB1dEJlbG93IiwgWEZBX0FUVFJJQlVURV9PdXRwdXRCZWxvdywNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1dhcm59LA0KKyAgICB7MHg5MDQxZDRiMCwgTCJzaG9ydCIsIFhGQV9BVFRSSUJVVEVfU2hvcnQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4OTA3Yzc3MTksIEwiZm9udFZlcnRpY2FsU2NhbGUiLCBYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTCIxMDAlIn0sDQorICAgIHsweDk0NDQ2ZGNjLCBMInRoaWNrbmVzcyIsIFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyA4KX0sDQorICAgIHsweDk1N2ZhMDA2LCBMImNvbW1pdE9uIiwgWEZBX0FUVFJJQlVURV9Db21taXRPbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU2VsZWN0fSwNCisgICAgezB4OTgyYmQ4OTIsIEwicmVtYWluQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikzfSwNCisgICAgezB4OThmZDRkODEsIEwia2V5QWdyZWVtZW50IiwgWEZBX0FUVFJJQlVURV9LZXlBZ3JlZW1lbnQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4OTk4MDBkN2EsIEwiZXJyb3JDb3JyZWN0aW9uTGV2ZWwiLCBYRkFfQVRUUklCVVRFX0Vycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDlhNjNkYTNkLCBMInVwc01vZGUiLCBYRkFfQVRUUklCVVRFX1Vwc01vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1VzQ2Fycmllcn0sDQorICAgIHsweDljYzE3ZDc1LCBMIm1lcmdlTW9kZSIsIFhGQV9BVFRSSUJVVEVfTWVyZ2VNb2RlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Db25zdW1lRGF0YX0sDQorICAgIHsweDlkODMzZDc1LCBMImNpcmN1bGFyIiwgWEZBX0FUVFJJQlVURV9DaXJjdWxhciwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCisgICAgezB4OWQ4ZWUyMDQsIEwicHNOYW1lIiwgWEZBX0FUVFJJQlVURV9Qc05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKilOVUxMfSwNCisgICAgezB4OWRjYzNhYjMsIEwidHJhaWxlciIsIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGEwOTMzOTU0LCBMInVuaWNvZGVSYW5nZSIsIFhGQV9BVFRSSUJVVEVfVW5pY29kZVJhbmdlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopTlVMTH0sDQorICAgIHsweGExYjBkMmY1LCBMImV4ZWN1dGVUeXBlIiwgWEZBX0FUVFJJQlVURV9FeGVjdXRlVHlwZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fSW1wb3J0fSwNCisgICAgezB4YTI1YTg4M2QsIEwiZHVwbGV4SW1wb3NpdGlvbiIsIFhGQV9BVFRSSUJVVEVfRHVwbGV4SW1wb3NpdGlvbiwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTG9uZ0VkZ2V9LA0KKyAgICB7MHhhNDJjYTFiNywgTCJ0cmF5SW4iLCBYRkFfQVRUUklCVVRFX1RyYXlJbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweGE0MzNmMDAxLCBMImJpbmRpbmdOb2RlIiwgWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiwgKHZvaWQqKTB9LA0KKyAgICB7MHhhNTM0MGZmNSwgTCJib2ZBY3Rpb24iLCBYRkFfQVRUUklCVVRFX0JvZkFjdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTW92ZUZpcnN0fSwNCisgICAgezB4YTViNDEwY2YsIEwic2F2ZSIsIFhGQV9BVFRSSUJVVEVfU2F2ZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCisgICAgezB4YTYxMThjODksIEwidGFyZ2V0VHlwZSIsIFhGQV9BVFRSSUJVVEVfVGFyZ2V0VHlwZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweGE2NjQwNGNiLCBMImtleUVuY2lwaGVybWVudCIsIFhGQV9BVFRSSUJVVEVfS2V5RW5jaXBoZXJtZW50LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGE2NzEwMjYyLCBMImNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3kiLA0KKyAgICAgWEZBX0FUVFJJQlVURV9DcmVkZW50aWFsU2VydmVyUG9saWN5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHsweGE2ODY5NzViLCBMInNpemUiLCBYRkFfQVRUUklCVVRFX1NpemUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDYpfSwNCisgICAgezB4YTg1ZTc0ZjMsIEwiaW5pdGlhbE51bWJlciIsIFhGQV9BVFRSSUJVVEVfSW5pdGlhbE51bWJlciwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMX0sDQorICAgIHsweGFiZWYzN2UzLCBMInNsb3BlIiwgWEZBX0FUVFJJQlVURV9TbG9wZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQmFja3NsYXNofSwNCisgICAgezB4YWJmYTZjNGYsIEwiY1NwYWNlIiwgWEZBX0FUVFJJQlVURV9DU3BhY2UsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKUwiU1JHQiJ9LA0KKyAgICB7MHhhYzA2ZTJiMCwgTCJjb2xTcGFuIiwgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTF9LA0KKyAgICB7MHhhZGM0Yzc3YiwgTCJiaW5kaW5nIiwgWEZBX0FUVFJJQlVURV9CaW5kaW5nLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4YWY3NTQ2MTMsIEwiY2hlY2tzdW0iLCBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4YjA0NWZiYzUsIEwiY2hhckVuY29kaW5nIiwgWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilMIlVURi04In0sDQorICAgIHsweGIwZTU0ODVkLCBMImJpbmQiLCBYRkFfQVRUUklCVVRFX0JpbmQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsICh2b2lkKilOVUxMfSwNCisgICAgezB4YjEyMTI4YjcsIEwidGV4dEVudHJ5IiwgWEZBX0FUVFJJQlVURV9UZXh0RW50cnksDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKTB9LA0KKyAgICB7MHhiMzczYTg2MiwgTCJhcmNoaXZlIiwgWEZBX0FUVFJJQlVURV9BcmNoaXZlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4YjU5OGExZjcsIEwidXVpZCIsIFhGQV9BVFRSSUJVVEVfVXVpZCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1hEUCwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhiNWU0OWJmMiwgTCJwb3N0dXJlIiwgWEZBX0FUVFJJQlVURV9Qb3N0dXJlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vcm1hbH0sDQorICAgIHsweGI2YjQ0MTcyLCBMImFmdGVyIiwgWEZBX0FUVFJJQlVURV9BZnRlciwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweGI3MTY0NjdiLCBMIm9ycGhhbnMiLCBYRkFfQVRUUklCVVRFX09ycGhhbnMsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQorICAgIHsweGJjMGM0Njk1LCBMInF1YWxpZmllZE5hbWUiLCBYRkFfQVRUUklCVVRFX1F1YWxpZmllZE5hbWUsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOLCAodm9pZCopTlVMTH0sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwNCisgICAgICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGJjOGZhMzUwLCBMImxvY2FsZSIsIFhGQV9BVFRSSUJVVEVfTG9jYWxlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4YmQ2ZTFkODgsIEwid2VpZ2h0IiwgWEZBX0FUVFJJQlVURV9XZWlnaHQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9ybWFsfSwNCisgICAgezB4YmQ5NmEwZTksIEwidW5kZXJsaW5lUGVyaW9kIiwgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FsbH0sDQorICAgIHsweGJkZTlhYmRhLCBMImRhdGEiLCBYRkFfQVRUUklCVVRFX0RhdGEsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0xpbmt9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsICh2b2lkKilOVUxMfSwNCisgICAgezB4YmU5YmE0NzIsIEwibnVtYmVyZWQiLCBYRkFfQVRUUklCVVRFX051bWJlcmVkLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTF9LA0KKyAgICB7MHhjMDM1YzZiMSwgTCJkYXRhQ29sdW1uQ291bnQiLCBYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhjMGVjOWZhNCwgTCJvdmVybGluZSIsIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmUsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQorICAgIHsweGMyYmEwOTIzLCBMInVybFBvbGljeSIsIFhGQV9BVFRSSUJVVEVfVXJsUG9saWN5LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4YzJiZDQwZmQsIEwiYW5jaG9yVHlwZSIsIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdH0sDQorICAgIHsweGMzOWE4OGJkLCBMImxhYmVsUmVmIiwgWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGMzYzE0NDJmLCBMImJvb2tlbmRMZWFkZXIiLCBYRkFfQVRUUklCVVRFX0Jvb2tlbmRMZWFkZXIsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4YzQ1NDdhMDgsIEwibWF4TGVuZ3RoIiwgWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKSAtIDF9LA0KKyAgICB7MHhjNGZlZDA5YiwgTCJhY2Nlc3NLZXkiLCBYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGM1NzYyMTU3LCBMImN1cnNvckxvY2F0aW9uIiwgWEZBX0FUVFJJQlVURV9DdXJzb3JMb2NhdGlvbiwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sDQorICAgIHsweGM4NjBmMzBhLCBMImRlbGF5ZWRPcGVuIiwgWEZBX0FUVFJJQlVURV9EZWxheWVkT3BlbiwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLCBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGNhNWRjMjdjLCBMImRhdGFFbmNpcGhlcm1lbnQiLCBYRkFfQVRUUklCVVRFX0RhdGFFbmNpcGhlcm1lbnQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4Y2IxNTA0NzksIEwiYWZ0ZXJUYXJnZXQiLCBYRkFfQVRUUklCVVRFX0FmdGVyVGFyZ2V0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGNiY2FmNjZkLCBMImxlYWRlciIsIFhGQV9BVFRSSUJVVEVfTGVhZGVyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4Y2NhNzg5N2UsIEwicGlja2VyIiwgWEZBX0FUVFJJQlVURV9QaWNrZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0hvc3R9LA0KKyAgICB7MHhjZDdmN2I1NCwgTCJmcm9tIiwgWEZBX0FUVFJJQlVURV9Gcm9tLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKilOVUxMfSwNCisgICAgezB4Y2VhNWU2MmMsIEwiYmFzZVByb2ZpbGUiLCBYRkFfQVRUUklCVVRFX0Jhc2VQcm9maWxlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9GdWxsfSwNCisgICAgezB4ZDE3MWIyNDAsIEwiYXNwZWN0IiwgWEZBX0FUVFJJQlVURV9Bc3BlY3QsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRml0fSwNCisgICAgezB4ZDNjODRkMjUsIEwicm93Q29sdW1uUmF0aW8iLCBYRkFfQVRUUklCVVRFX1Jvd0NvbHVtblJhdGlvLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGQ0YjAxOTIxLCBMImxpbmVIZWlnaHQiLCBYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDEpfSwNCisgICAgezB4ZDRjYzUzZjgsIEwiaGlnaGxpZ2h0IiwgWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0ludmVydGVkfSwNCisgICAgezB4ZDUwZjkwM2EsIEwidmFsdWVSZWYiLCBYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4ZDUyNDgyZTAsIEwibWF4RW50cmllcyIsIFhGQV9BVFRSSUJVVEVfTWF4RW50cmllcywNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopNX0sDQorICAgIHsweGQ1N2M1MTNjLCBMImRhdGFMZW5ndGgiLCBYRkFfQVRUUklCVVRFX0RhdGFMZW5ndGgsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ZDYxMjhkOGQsIEwiYWN0aXZpdHkiLCBYRkFfQVRUUklCVVRFX0FjdGl2aXR5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9DbGlja30sDQorICAgIHsweGQ2YTM5OTkwLCBMImlucHV0IiwgWEZBX0FUVFJJQlVURV9JbnB1dCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsICh2b2lkKilOVUxMfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCB8DQorICAgICAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMgfA0KKyAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ZDcwNzk4YzIsIEwiYmxhbmtPck5vdEJsYW5rIiwgWEZBX0FUVFJJQlVURV9CbGFua09yTm90QmxhbmssDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FueX0sDQorICAgIHsweGQ4NjFmOGFmLCBMImFkZFJldm9jYXRpb25JbmZvIiwgWEZBX0FUVFJJQlVURV9BZGRSZXZvY2F0aW9uSW5mbywNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhkOGY5ODJiZiwgTCJnZW5lcmljRmFtaWx5IiwgWEZBX0FUVFJJQlVURV9HZW5lcmljRmFtaWx5LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU2VyaWZ9LA0KKyAgICB7MHhkOTk2ZmE5YiwgTCJoYW5kIiwgWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9FdmVufSwNCisgICAgezB4ZGI1NWZlYzUsIEwiaHJlZiIsIFhGQV9BVFRSSUJVVEVfSHJlZiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGRjNzU2NzZjLCBMInRleHRFbmNvZGluZyIsIFhGQV9BVFRSSUJVVEVfVGV4dEVuY29kaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGRlN2Y5MmJhLCBMImxlYWREaWdpdHMiLCBYRkFfQVRUUklCVVRFX0xlYWREaWdpdHMsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKSAtIDF9LA0KKyAgICB7MHhlMTFhMmNiYywgTCJwZXJtaXNzaW9ucyIsIFhGQV9BVFRSSUJVVEVfUGVybWlzc2lvbnMsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKTJ9LA0KKyAgICB7MHhlMThiNTY1OSwgTCJzcGFjZUFib3ZlIiwgWEZBX0FUVFJJQlVURV9TcGFjZUFib3ZlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweGUxYTI2YjU2LCBMImNvZGVCYXNlIiwgWEZBX0FUVFJJQlVURV9Db2RlQmFzZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGUzNDlkMDQ0LCBMInN0b2NrIiwgWEZBX0FUVFJJQlVURV9TdG9jaywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGUzNzJhZTk3LCBMImlzTnVsbCIsIFhGQV9BVFRSSUJVVEVfSXNOdWxsLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgKHZvaWQqKTB9LA0KKyAgICB7MHhlNGMzYTVlNSwgTCJyZXN0b3JlU3RhdGUiLCBYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTWFudWFsfSwNCisgICAgezB4ZTVjOTZkNmEsIEwiZXhjbHVkZUFsbENhcHMiLCBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVBbGxDYXBzLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikwfSwNCisgICAgezB4ZTY0YjExMjksIEwiZm9ybWF0VGVzdCIsIFhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZ30sDQorICAgIHsweGU2Zjk5NDg3LCBMImhTY3JvbGxQb2xpY3kiLCBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0F1dG99LA0KKyAgICB7MHhlOGRkZGY1MCwgTCJqb2luIiwgWEZBX0FUVFJJQlVURV9Kb2luLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmV9LA0KKyAgICB7MHhlOGYxMThhOCwgTCJrZXlDZXJ0U2lnbiIsIFhGQV9BVFRSSUJVVEVfS2V5Q2VydFNpZ24sDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ZTk0OGI5YTgsIEwicmFkaXVzIiwgWEZBX0FUVFJJQlVURV9SYWRpdXMsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4ZTk5NmIyZmUsIEwic291cmNlQWJvdmUiLCBYRkFfQVRUUklCVVRFX1NvdXJjZUFib3ZlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fV2Fybn0sDQorICAgIHsweGVhNzA5MGEwLCBMIm92ZXJyaWRlIiwgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4ZWIwOTEwMDMsIEwiY2xhc3NJZCIsIFhGQV9BVFRSSUJVVEVfQ2xhc3NJZCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGViNTExYjU0LCBMImRpc2FibGUiLCBYRkFfQVRUUklCVVRFX0Rpc2FibGUsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQorICAgIHsweGVkYTkwMTdhLCBMInNjb3BlIiwgWEZBX0FUVFJJQlVURV9TY29wZSwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ZjE5Nzg0NGQsIEwibWF0Y2giLCBYRkFfQVRUUklCVVRFX01hdGNoLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PbmNlfSwNCisgICAgezB4ZjIwMDkzMzksIEwicGxhY2VtZW50IiwgWEZBX0FUVFJJQlVURV9QbGFjZW1lbnQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0xlZnR9LA0KKyAgICB7MHhmNGZmY2U3MywgTCJiZWZvcmUiLCBYRkFfQVRUUklCVVRFX0JlZm9yZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweGY1MzFiMDU5LCBMIndyaXRpbmdTY3JpcHQiLCBYRkFfQVRUUklCVVRFX1dyaXRpbmdTY3JpcHQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Bc3Rlcmlza30sDQorICAgIHsweGY1NzVjYTc1LCBMImVuZENoYXIiLCBYRkFfQVRUUklCVVRFX0VuZENoYXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKikwfSwNCisgICAgezB4ZjZiNGFmYjAsIEwibG9uZyIsIFhGQV9BVFRSSUJVVEVfTG9uZywgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHhmNmI1OTU0MywgTCJpbnRhY3QiLCBYRkFfQVRUUklCVVRFX0ludGFjdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9uZX0sDQorICAgIHsweGY4ODllNzQ3LCBMInhkcENvbnRlbnQiLCBYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ZmVhNTNlYzYsIEwiZGVjaXBoZXJPbmx5IiwgWEZBX0FUVFJJQlVURV9EZWNpcGhlck9ubHksDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCiB9Ow0KLWV4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQUF0dHJpYnV0ZUNvdW50ID0gc2l6ZW9mKGdfWEZBQXR0cmlidXRlRGF0YSkgLyBzaXplb2YoWEZBX0FUVFJJQlVURUlORk8pOw0KK2V4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQUF0dHJpYnV0ZUNvdW50ID0NCisgICAgc2l6ZW9mKGdfWEZBQXR0cmlidXRlRGF0YSkgLyBzaXplb2YoWEZBX0FUVFJJQlVURUlORk8pOw0KIGV4dGVybiBjb25zdCBYRkFfTk9UU1VSRUFUVFJJQlVURSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzW10gPSB7DQotICAgIHtYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LCBYRkFfQVRUUklCVVRFX1JlbGF0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZH0sDQotICAgIHtYRkFfRUxFTUVOVF9OdW1iZXJQYXR0ZXJuLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9OdW1lcmljfSwNCi0gICAge1hGQV9FTEVNRU5UX0tleVVzYWdlLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQotICAgIHtYRkFfRUxFTUVOVF9MYWJlbFByaW50ZXIsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1pwbH0sDQotICAgIHtYRkFfRUxFTUVOVF9DYWxlbmRhclN5bWJvbHMsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0dyZWdvcmlhbn0sDQotICAgIHtYRkFfRUxFTUVOVF9CYXJjb2RlLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCAodm9pZCopTlVMTH0sDQotICAgIHtYRkFfRUxFTUVOVF9CYXJjb2RlLCBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9uZX0sDQotICAgIHtYRkFfRUxFTUVOVF9UaW1lUGF0dGVybiwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTWVkfSwNCi0gICAge1hGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KLSAgICB7WEZBX0VMRU1FTlRfU3ViamVjdEROcywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KLSAgICB7WEZBX0VMRU1FTlRfSXNzdWVycywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KLSAgICB7WEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZHMsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCi0gICAge1hGQV9FTEVNRU5UX1BhdHRlcm4sIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzSGF0Y2h9LA0KLSAgICB7WEZBX0VMRU1FTlRfQ29tcHJlc3MsIFhGQV9BVFRSSUJVVEVfU2NvcGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9JbWFnZU9ubHl9LA0KLSAgICB7WEZBX0VMRU1FTlRfSW1hZ2UsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NH0sDQotICAgIHtYRkFfRUxFTUVOVF9UaW1lU3RhbXAsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCi0gICAge1hGQV9FTEVNRU5UX1N1YmZvcm0sIFhGQV9BVFRSSUJVVEVfU2NvcGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9OYW1lfSwNCi0gICAge1hGQV9FTEVNRU5UX0hhbmRsZXIsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCi0gICAge1hGQV9FTEVNRU5UX1JlY29yZCwgWEZBX0FUVFJJQlVURV9NYXgsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsICh2b2lkKikwfSwNCi0gICAge1hGQV9FTEVNRU5UX0NvbW1hbmQsIFhGQV9BVFRSSUJVVEVfVGltZW91dCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgKHZvaWQqKTMwfSwNCi0gICAge1hGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZHMsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCi0gICAge1hGQV9FTEVNRU5UX1BhZ2VTZXQsIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZX0sDQotICAgIHtYRkFfRUxFTUVOVF9FcXVhdGUsIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsICh2b2lkKilOVUxMfSwNCi0gICAge1hGQV9FTEVNRU5UX0VxdWF0ZSwgWEZBX0FUVFJJQlVURV9UbywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsICh2b2lkKilOVUxMfSwNCi0gICAge1hGQV9FTEVNRU5UX1RyYXZlcnNlLCBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05leHR9LA0KLSAgICB7WEZBX0VMRU1FTlRfRW5jb2RpbmdzLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQotICAgIHtYRkFfRUxFTUVOVF9TaWduaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQotICAgIHtYRkFfRUxFTUVOVF9PaWRzLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQotICAgIHtYRkFfRUxFTUVOVF9TaWduYXR1cmUsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1BERjFfM30sDQotICAgIHtYRkFfRUxFTUVOVF9FeERhdGEsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KLSAgICB7WEZBX0VMRU1FTlRfTGluZWFyLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ub1JpZ2h0fSwNCi0gICAge1hGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9sLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9TeW1ib2x9LA0KLSAgICB7WEZBX0VMRU1FTlRfRXF1YXRlUmFuZ2UsIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsICh2b2lkKilOVUxMfSwNCi0gICAge1hGQV9FTEVNRU5UX0VxdWF0ZVJhbmdlLCBYRkFfQVRUUklCVVRFX1RvLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgKHZvaWQqKU5VTEx9LA0KLSAgICB7WEZBX0VMRU1FTlRfU2lnbkRhdGEsIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU2lnbn0sDQotICAgIHtYRkFfRUxFTUVOVF9EYXRlUGF0dGVybiwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTWVkfSwNCi0gICAge1hGQV9FTEVNRU5UX0JpbmQsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KLSAgICB7WEZBX0VMRU1FTlRfUmVhc29ucywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KLSAgICB7WEZBX0VMRU1FTlRfQXBwZWFyYW5jZUZpbHRlciwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KLSAgICB7WEZBX0VMRU1FTlRfRm9ybSwgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsICh2b2lkKilOVUxMfSwNCi0gICAge1hGQV9FTEVNRU5UX1ZhbHVlLCBYRkFfQVRUUklCVVRFX092ZXJyaWRlLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCAodm9pZCopMH0sDQotICAgIHtYRkFfRUxFTUVOVF9DYWxjdWxhdGUsIFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9FcnJvcn0sDQotICAgIHtYRkFfRUxFTUVOVF9Db25uZWN0LCBYRkFfQVRUUklCVVRFX1RpbWVvdXQsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsICh2b2lkKikxNX0sDQotICAgIHtYRkFfRUxFTUVOVF9TdWJtaXQsIFhGQV9BVFRSSUJVVEVfRm9ybWF0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fWGRwfSwNCi0gICAge1hGQV9FTEVNRU5UX1JhZGlhbCwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVG9FZGdlfSwNCi0gICAge1hGQV9FTEVNRU5UX0xvY2tEb2N1bWVudCwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3ViZm9ybVNldCwgWEZBX0FUVFJJQlVURV9SZWxhdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkfSwNCisgICAge1hGQV9FTEVNRU5UX051bWJlclBhdHRlcm4sIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9OdW1lcmljfSwNCisgICAge1hGQV9FTEVNRU5UX0tleVVzYWdlLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KKyAgICB7WEZBX0VMRU1FTlRfTGFiZWxQcmludGVyLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fWnBsfSwNCisgICAge1hGQV9FTEVNRU5UX0NhbGVuZGFyU3ltYm9scywgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0dyZWdvcmlhbn0sDQorICAgIHtYRkFfRUxFTUVOVF9CYXJjb2RlLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmFyY29kZSwgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwNCisgICAge1hGQV9FTEVNRU5UX1RpbWVQYXR0ZXJuLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTWVkfSwNCisgICAge1hGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwNCisgICAge1hGQV9FTEVNRU5UX1N1YmplY3RETnMsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9Jc3N1ZXJzLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KKyAgICB7WEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZHMsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9QYXR0ZXJuLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3NIYXRjaH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db21wcmVzcywgWEZBX0FUVFJJQlVURV9TY29wZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9JbWFnZU9ubHl9LA0KKyAgICB7WEZBX0VMRU1FTlRfSW1hZ2UsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9CYXNlNjR9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGltZVN0YW1wLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3ViZm9ybSwgWEZBX0FUVFJJQlVURV9TY29wZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9OYW1lfSwNCisgICAge1hGQV9FTEVNRU5UX0hhbmRsZXIsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9SZWNvcmQsIFhGQV9BVFRSSUJVVEVfTWF4LCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgKHZvaWQqKTB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29tbWFuZCwgWEZBX0FUVFJJQlVURV9UaW1lb3V0LCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgKHZvaWQqKTMwfSwNCisgICAge1hGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZHMsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9QYWdlU2V0LCBYRkFfQVRUUklCVVRFX1JlbGF0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlfSwNCisgICAge1hGQV9FTEVNRU5UX0VxdWF0ZSwgWEZBX0FUVFJJQlVURV9Gcm9tLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAge1hGQV9FTEVNRU5UX0VxdWF0ZSwgWEZBX0FUVFJJQlVURV9UbywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHtYRkFfRUxFTUVOVF9UcmF2ZXJzZSwgWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTmV4dH0sDQorICAgIHtYRkFfRUxFTUVOVF9FbmNvZGluZ3MsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9TaWduaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KKyAgICB7WEZBX0VMRU1FTlRfT2lkcywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX1NpZ25hdHVyZSwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1BERjFfM30sDQorICAgIHtYRkFfRUxFTUVOVF9FeERhdGEsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwNCisgICAge1hGQV9FTEVNRU5UX0xpbmVhciwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1RvUmlnaHR9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ3VycmVuY3lTeW1ib2wsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9TeW1ib2x9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXF1YXRlUmFuZ2UsIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHtYRkFfRUxFTUVOVF9FcXVhdGVSYW5nZSwgWEZBX0FUVFJJQlVURV9UbywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHtYRkFfRUxFTUVOVF9TaWduRGF0YSwgWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU2lnbn0sDQorICAgIHtYRkFfRUxFTUVOVF9EYXRlUGF0dGVybiwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX01lZH0sDQorICAgIHtYRkFfRUxFTUVOVF9CaW5kLCBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9uZX0sDQorICAgIHtYRkFfRUxFTUVOVF9SZWFzb25zLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KKyAgICB7WEZBX0VMRU1FTlRfQXBwZWFyYW5jZUZpbHRlciwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX0Zvcm0sIFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmFsdWUsIFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sDQorICAgICAodm9pZCopMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DYWxjdWxhdGUsIFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRXJyb3J9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29ubmVjdCwgWEZBX0FUVFJJQlVURV9UaW1lb3V0LCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgKHZvaWQqKTE1fSwNCisgICAge1hGQV9FTEVNRU5UX1N1Ym1pdCwgWEZBX0FUVFJJQlVURV9Gb3JtYXQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fWGRwfSwNCisgICAge1hGQV9FTEVNRU5UX1JhZGlhbCwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1RvRWRnZX0sDQorICAgIHtYRkFfRUxFTUVOVF9Mb2NrRG9jdW1lbnQsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQogICAgIHtYRkFfRUxFTUVOVF9PY2N1ciwgWEZBX0FUVFJJQlVURV9NYXgsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsICh2b2lkKikxfSwNCi0gICAge1hGQV9FTEVNRU5UX051bWJlclN5bWJvbCwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRGVjaW1hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2wsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9EZWNpbWFsfSwNCiB9Ow0KLWV4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQU5vdHN1cmVDb3VudCA9IHNpemVvZihnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzKSAvIHNpemVvZihYRkFfTk9UU1VSRUFUVFJJQlVURSk7DQorZXh0ZXJuIGNvbnN0IGludDMyX3QgZ19pWEZBTm90c3VyZUNvdW50ID0NCisgICAgc2l6ZW9mKGdfWEZBTm90c3VyZUF0dHJpYnV0ZXMpIC8gc2l6ZW9mKFhGQV9OT1RTVVJFQVRUUklCVVRFKTsNCiBleHRlcm4gY29uc3QgWEZBX0VMRU1FTlRJTkZPIGdfWEZBRWxlbWVudERhdGFbXSA9IHsNCiAgICAgezB4MjNlZTMsIEwicHMiLCBYRkFfRUxFTUVOVF9QcywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgyNTM2MywgTCJ0byIsIFhGQV9FTEVNRU5UX1RvLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHgyNTg3ZSwgTCJ1aSIsIFhGQV9FTEVNRU5UX1VpLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MWM2NDhiLCBMInJlY29yZFNldCIsIFhGQV9FTEVNRU5UX1JlY29yZFNldCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgxNzE0MjhmLCBMInN1YnNldEJlbG93IiwgWEZBX0VMRU1FTlRfU3Vic2V0QmVsb3csIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDFhMDc3NmEsIEwic3ViZm9ybVNldCIsIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KLSAgICB7MHgyMzQwZDcwLCBMImFkb2JlRXh0ZW5zaW9uTGV2ZWwiLCBYRkFfRUxFTUVOVF9BZG9iZUV4dGVuc2lvbkxldmVsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHgyYzFjN2YxLCBMInR5cGVmYWNlIiwgWEZBX0VMRU1FTlRfVHlwZWZhY2UsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4NTUxOGMyNSwgTCJicmVhayIsIFhGQV9FTEVNRU5UX0JyZWFrLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4NWZmZjUyMywgTCJmb250SW5mbyIsIFhGQV9FTEVNRU5UX0ZvbnRJbmZvLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDY1M2EyMjcsIEwibnVtYmVyUGF0dGVybiIsIFhGQV9FTEVNRU5UX051bWJlclBhdHRlcm4sIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDY1YjRhMDUsIEwiZHluYW1pY1JlbmRlciIsIFhGQV9FTEVNRU5UX0R5bmFtaWNSZW5kZXIsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDdlNDM2MmUsIEwicHJpbnRTY2FsaW5nIiwgWEZBX0VMRU1FTlRfUHJpbnRTY2FsaW5nLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg3ZmU2ZDNhLCBMImNoZWNrQnV0dG9uIiwgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg4MGNmNThmLCBMImRhdGVQYXR0ZXJucyIsIFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJucywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg4MTE5MjlkLCBMInNvdXJjZVNldCIsIFhGQV9FTEVNRU5UX1NvdXJjZVNldCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQotICAgIHsweDlmOWQ2MTIsIEwiYW1kIiwgWEZBX0VMRU1FTlRfQW1kLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg5ZjllZmI2LCBMImFyYyIsIFhGQV9FTEVNRU5UX0FyYywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGE0ODgzNWUsIEwiZGF5IiwgWEZBX0VMRU1FTlRfRGF5LCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhhNjMyOGI4LCBMImVyYSIsIFhGQV9FTEVNRU5UX0VyYSwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4YWU2YTBhMCwgTCJqb2ciLCBYRkFfRUxFTUVOVF9Kb2csIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweGIxYjNkMjIsIEwibG9nIiwgWEZBX0VMRU1FTlRfTG9nLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGIzNTQzOWUsIEwibWFwIiwgWEZBX0VMRU1FTlRfTWFwLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YjM1NTMwMSwgTCJtZHAiLCBYRkFfRUxFTUVOVF9NZHAsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhiNDIwNDM4LCBMImJyZWFrQmVmb3JlIiwgWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhiNmEwOTFjLCBMIm9pZCIsIFhGQV9FTEVNRU5UX09pZCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KLSAgICB7MHhiODQzODlmLCBMInBjbCIsIFhGQV9FTEVNRU5UX1BjbCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhiODQzZGJhLCBMInBkZiIsIFhGQV9FTEVNRU5UX1BkZiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhiYjhkZjVkLCBMInJlZiIsIFhGQV9FTEVNRU5UX1JlZiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KLSAgICB7MHhjMDgwY2QwLCBMInVyaSIsIFhGQV9FTEVNRU5UX1VyaSwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCi0gICAgezB4YzU2YWZiZiwgTCJ4ZGMiLCBYRkFfRUxFTUVOVF9YZGMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9YZGMsIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQotICAgIHsweGM1NmFmY2MsIEwieGRwIiwgWEZBX0VMRU1FTlRfWGRwLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGM1NmI5ZmYsIEwieGZhIiwgWEZBX0VMRU1FTlRfWGZhLCBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCi0gICAgezB4YzU2ZmNiNywgTCJ4c2wiLCBYRkFfRUxFTUVOVF9Yc2wsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YzhiODlkNiwgTCJ6cGwiLCBYRkFfRUxFTUVOVF9acGwsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YzliYWU5NCwgTCJjYWNoZSIsIFhGQV9FTEVNRU5UX0NhY2hlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGNiMDE2YmUsIEwibWFyZ2luIiwgWEZBX0VMRU1FTlRfTWFyZ2luLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4ZTEzNzhmZSwgTCJrZXlVc2FnZSIsIFhGQV9FTEVNRU5UX0tleVVzYWdlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4ZmUzNTk2YSwgTCJleGNsdWRlIiwgWEZBX0VMRU1FTlRfRXhjbHVkZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4MTAzOTVhYzcsIEwiY2hvaWNlTGlzdCIsIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgxMDU5ZWMxOCwgTCJsZXZlbCIsIFhGQV9FTEVNRU5UX0xldmVsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHgxMDg3NDgwNCwgTCJsYWJlbFByaW50ZXIiLCBYRkFfRUxFTUVOVF9MYWJlbFByaW50ZXIsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MTBjNDBlMDMsIEwiY2FsZW5kYXJTeW1ib2xzIiwgWEZBX0VMRU1FTlRfQ2FsZW5kYXJTeW1ib2xzLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDEwZjFlYTI0LCBMInBhcmEiLCBYRkFfRUxFTUVOVF9QYXJhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MTBmMWVhMzcsIEwicGFydCIsIFhGQV9FTEVNRU5UX1BhcnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDExNDA5NzViLCBMInBkZmEiLCBYRkFfRUxFTUVOVF9QZGZhLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDExNTRlZmU2LCBMImZpbHRlciIsIFhGQV9FTEVNRU5UX0ZpbHRlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDEzZjQxZGUxLCBMInByZXNlbnQiLCBYRkFfRUxFTUVOVF9QcmVzZW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDE4MjdlNmVhLCBMInBhZ2luYXRpb24iLCBYRkFfRUxFTUVOVF9QYWdpbmF0aW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHgxODQ2MzcwNywgTCJlbmNvZGluZyIsIFhGQV9FTEVNRU5UX0VuY29kaW5nLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlQ30sDQotICAgIHsweDE4NWU0MWUyLCBMImV2ZW50IiwgWEZBX0VMRU1FTlRfRXZlbnQsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgxYWRiMTQyZCwgTCJ3aGl0ZXNwYWNlIiwgWEZBX0VMRU1FTlRfV2hpdGVzcGFjZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4MWYzZjY0YzMsIEwiZGVmYXVsdFVpIiwgWEZBX0VMRU1FTlRfRGVmYXVsdFVpLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MjA0ZTg3Y2IsIEwiZGF0YU1vZGVsIiwgWEZBX0VMRU1FTlRfRGF0YU1vZGVsLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGV9LA0KLSAgICB7MHgyMDU3YjM1MCwgTCJiYXJjb2RlIiwgWEZBX0VMRU1FTlRfQmFyY29kZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDIwNTk2YmFkLCBMInRpbWVQYXR0ZXJuIiwgWEZBX0VMRU1FTlRfVGltZVBhdHRlcm4sIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDIxMGI3NGQzLCBMImJhdGNoT3V0cHV0IiwgWEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MjEyZmYwZTIsIEwiZW5mb3JjZSIsIFhGQV9FTEVNRU5UX0VuZm9yY2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDIxZDM1MWI0LCBMImN1cnJlbmN5U3ltYm9scyIsIFhGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9scywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgyMWRiODNjNSwgTCJhZGRTaWxlbnRQcmludCIsIFhGQV9FTEVNRU5UX0FkZFNpbGVudFByaW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHgyMjI2NjI1OCwgTCJyZW5hbWUiLCBYRkFfRUxFTUVOVF9SZW5hbWUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQotICAgIHsweDIyNmNhOGYxLCBMIm9wZXJhdGlvbiIsIFhGQV9FTEVNRU5UX09wZXJhdGlvbiwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQotICAgIHsweDIzZTI3Yjg0LCBMInR5cGVmYWNlcyIsIFhGQV9FTEVNRU5UX1R5cGVmYWNlcywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgyM2Y0YWE3NSwgTCJzdWJqZWN0RE5zIiwgWEZBX0VMRU1FTlRfU3ViamVjdEROcywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDI0MGQ1ZThlLCBMImlzc3VlcnMiLCBYRkFfRUxFTUVOVF9Jc3N1ZXJzLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MjQ1N2EwMzMsIEwic2lnbmF0dXJlUHNldWRvTW9kZWwiLCBYRkFfRUxFTUVOVF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCwgWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0fSwNCi0gICAgezB4MjRhNTJmOGEsIEwid3NkbENvbm5lY3Rpb24iLCBYRkFfRUxFTUVOVF9Xc2RsQ29ubmVjdGlvbiwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MjU0ZWJkMDcsIEwiZGVidWciLCBYRkFfRUxFTUVOVF9EZWJ1ZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgyNjU1YzY2YSwgTCJkZWx0YSIsIFhGQV9FTEVNRU5UX0RlbHRhLCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0fSwNCi0gICAgezB4MjZjMGRhZWMsIEwiZXJhTmFtZXMiLCBYRkFfRUxFTUVOVF9FcmFOYW1lcywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgyNzNhYjAzYiwgTCJtb2RpZnlBbm5vdHMiLCBYRkFfRUxFTUVOVF9Nb2RpZnlBbm5vdHMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDI3ODc1YmI0LCBMInN0YXJ0Tm9kZSIsIFhGQV9FTEVNRU5UX1N0YXJ0Tm9kZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4Mjg1ZDBkYmMsIEwiYnV0dG9uIiwgWEZBX0VMRU1FTlRfQnV0dG9uLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MjhkZWU2ZTksIEwiZm9ybWF0IiwgWEZBX0VMRU1FTlRfRm9ybWF0LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MmEyMzM0OWUsIEwiYm9yZGVyIiwgWEZBX0VMRU1FTlRfQm9yZGVyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MmFlNjdmMTksIEwiYXJlYSIsIFhGQV9FTEVNRU5UX0FyZWEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQotICAgIHsweDJjM2M0YzY3LCBMImh5cGhlbmF0aW9uIiwgWEZBX0VMRU1FTlRfSHlwaGVuYXRpb24sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgyZDA4YWY4NSwgTCJ0ZXh0IiwgWEZBX0VMRU1FTlRfVGV4dCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDJkNzFiMDBmLCBMInRpbWUiLCBYRkFfRUxFTUVOVF9UaW1lLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLCBYRkFfRUxFTUVOVF9UeXBlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHgyZmUwNTdlOSwgTCJvdmVycHJpbnQiLCBYRkFfRUxFTUVOVF9PdmVycHJpbnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDMwMmFlZTE2LCBMImNlcnRpZmljYXRlcyIsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDMwYjIyN2RmLCBMImVuY3J5cHRpb25NZXRob2RzIiwgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZHMsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgzMmI5MDBkMSwgTCJzZXRQcm9wZXJ0eSIsIFhGQV9FTEVNRU5UX1NldFByb3BlcnR5LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MzM3ZDllNDUsIEwicHJpbnRlck5hbWUiLCBYRkFfRUxFTUVOVF9QcmludGVyTmFtZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4MzNlZGRhNGIsIEwic3RhcnRQYWdlIiwgWEZBX0VMRU1FTlRfU3RhcnRQYWdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KLSAgICB7MHgzODE5NDNlNCwgTCJwYWdlT2Zmc2V0IiwgWEZBX0VMRU1FTlRfUGFnZU9mZnNldCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgzODIxMDZjZCwgTCJkYXRlVGltZSIsIFhGQV9FTEVNRU5UX0RhdGVUaW1lLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDM4NmU3NDIxLCBMImNvbWIiLCBYRkFfRUxFTUVOVF9Db21iLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4MzkwYWNkOWUsIEwicGF0dGVybiIsIFhGQV9FTEVNRU5UX1BhdHRlcm4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgzOTQyMTYzZSwgTCJpZkVtcHR5IiwgWEZBX0VMRU1FTlRfSWZFbXB0eSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4Mzk5NDRhN2IsIEwic3VwcHJlc3NCYW5uZXIiLCBYRkFfRUxFTUVOVF9TdXBwcmVzc0Jhbm5lciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4M2IzYzNkY2EsIEwib3V0cHV0QmluIiwgWEZBX0VMRU1FTlRfT3V0cHV0QmluLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHgzYjhhNDAyNCwgTCJmaWVsZCIsIFhGQV9FTEVNRU5UX0ZpZWxkLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCi0gICAgezB4M2MxNTM1MmYsIEwiYWdlbnQiLCBYRkFfRUxFTUVOVF9BZ2VudCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHgzZDdlODY2OCwgTCJvdXRwdXRYU0wiLCBYRkFfRUxFTUVOVF9PdXRwdXRYU0wsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4M2UxYzkxYzUsIEwiYWRqdXN0RGF0YSIsIFhGQV9FTEVNRU5UX0FkanVzdERhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQotICAgIHsweDNlN2E5NDA4LCBMImF1dG9TYXZlIiwgWEZBX0VMRU1FTlRfQXV0b1NhdmUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQotICAgIHsweDNlY2VhZDk0LCBMImNvbnRlbnRBcmVhIiwgWEZBX0VMRU1FTlRfQ29udGVudEFyZWEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KLSAgICB7MHgzZWYzMzRlMywgTCJldmVudFBzZXVkb01vZGVsIiwgWEZBX0VMRU1FTlRfRXZlbnRQc2V1ZG9Nb2RlbCwgWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0fSwNCi0gICAgezB4M2ZhZGFlYzAsIEwid3NkbEFkZHJlc3MiLCBYRkFfRUxFTUVOVF9Xc2RsQWRkcmVzcywgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQotICAgIHsweDQwNjIzYjViLCBMInNvbGlkIiwgWEZBX0VMRU1FTlRfU29saWQsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg0MWYwYmQ3NiwgTCJkYXRlVGltZVN5bWJvbHMiLCBYRkFfRUxFTUVOVF9EYXRlVGltZVN5bWJvbHMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDQ0NGU3NTIzLCBMImVuY3J5cHRpb25MZXZlbCIsIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25MZXZlbCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4NDUyM2FmNTUsIEwiZWRnZSIsIFhGQV9FTEVNRU5UX0VkZ2UsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg0NWQ1ZTNjMSwgTCJzdGlwcGxlIiwgWEZBX0VMRU1FTlRfU3RpcHBsZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDQ3NWU0ZTg3LCBMImF0dHJpYnV0ZXMiLCBYRkFfRUxFTUVOVF9BdHRyaWJ1dGVzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KLSAgICB7MHg0ODdhOGM4NywgTCJ2ZXJzaW9uQ29udHJvbCIsIFhGQV9FTEVNRU5UX1ZlcnNpb25Db250cm9sLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDQ4ZTUyNDhjLCBMIm1lcmlkaWVtIiwgWEZBX0VMRU1FTlRfTWVyaWRpZW0sIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDQ4ZjM2NzE5LCBMImV4Y2xHcm91cCIsIFhGQV9FTEVNRU5UX0V4Y2xHcm91cCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQotICAgIHsweDQ5NzczNTZiLCBMInRvb2xUaXAiLCBYRkFfRUxFTUVOVF9Ub29sVGlwLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQotICAgIHsweDQ5OWFmZWNjLCBMImNvbXByZXNzIiwgWEZBX0VMRU1FTlRfQ29tcHJlc3MsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4NGEwYzQ5NDgsIEwicmVhc29uIiwgWEZBX0VMRU1FTlRfUmVhc29uLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQotICAgIHsweDRiZGNjZTEzLCBMImV4ZWN1dGUiLCBYRkFfRUxFTUVOVF9FeGVjdXRlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4NGM1NmIyMTYsIEwiY29udGVudENvcHkiLCBYRkFfRUxFTUVOVF9Db250ZW50Q29weSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4NGNjMTc2ZDMsIEwiZGF0ZVRpbWVFZGl0IiwgWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4NGUxZTM5YjYsIEwiY29uZmlnIiwgWEZBX0VMRU1FTlRfQ29uZmlnLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCi0gICAgezB4NGUyZDYwODMsIEwiaW1hZ2UiLCBYRkFfRUxFTUVOVF9JbWFnZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg0ZTgxNDE1MCwgTCIjeEhUTUwiLCBYRkFfRUxFTUVOVF9TaGFycHhIVE1MLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCB8IFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCB8IFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQotICAgIHsweDRmMjM4OGMxLCBMIm51bWJlck9mQ29waWVzIiwgWEZBX0VMRU1FTlRfTnVtYmVyT2ZDb3BpZXMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDRmNTEyZTMwLCBMImJlaGF2aW9yT3ZlcnJpZGUiLCBYRkFfRUxFTUVOVF9CZWhhdmlvck92ZXJyaWRlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg0ZmRjMzQ1NCwgTCJ0aW1lU3RhbXAiLCBYRkFfRUxFTUVOVF9UaW1lU3RhbXAsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg1MWQ5MDU0NiwgTCJtb250aCIsIFhGQV9FTEVNRU5UX01vbnRoLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg1MjM0MzdlNCwgTCJ2aWV3ZXJQcmVmZXJlbmNlcyIsIFhGQV9FTEVNRU5UX1ZpZXdlclByZWZlcmVuY2VzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDUzYWJjMWM2LCBMInNjcmlwdE1vZGVsIiwgWEZBX0VMRU1FTlRfU2NyaXB0TW9kZWwsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDU0MDM0YzJmLCBMImRlY2ltYWwiLCBYRkFfRUxFTUVOVF9EZWNpbWFsLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDU0MjAyYzllLCBMInN1YmZvcm0iLCBYRkFfRUxFTUVOVF9TdWJmb3JtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCi0gICAgezB4NTQyYzczMDAsIEwic2VsZWN0IiwgWEZBX0VMRU1FTlRfU2VsZWN0LCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KLSAgICB7MHg1NDM2ZDE5OCwgTCJ3aW5kb3ciLCBYRkFfRUxFTUVOVF9XaW5kb3csIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQotICAgIHsweDU0NzNiNmRjLCBMImxvY2FsZVNldCIsIFhGQV9FTEVNRU5UX0xvY2FsZVNldCwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCi0gICAgezB4NTZhZTE3OWUsIEwiaGFuZGxlciIsIFhGQV9FTEVNRU5UX0hhbmRsZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCi0gICAgezB4NTcwMGJkNWYsIEwiaG9zdFBzZXVkb01vZGVsIiwgWEZBX0VMRU1FTlRfSG9zdFBzZXVkb01vZGVsLCBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3R9LA0KLSAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsIFhGQV9FTEVNRU5UX1ByZXNlbmNlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KLSAgICB7MHg1Nzc5ZDY1ZiwgTCJyZWNvcmQiLCBYRkFfRUxFTUVOVF9SZWNvcmQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQotICAgIHsweDU5YzhmMjdkLCBMImVtYmVkIiwgWEZBX0VMRU1FTlRfRW1iZWQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDVhNTBlOWU2LCBMInZlcnNpb24iLCBYRkFfRUxFTUVOVF9WZXJzaW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg1YjgzODNkZiwgTCJjb21tYW5kIiwgWEZBX0VMRU1FTlRfQ29tbWFuZCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg1YzQzYzZjMywgTCJjb3BpZXMiLCBYRkFfRUxFTUVOVF9Db3BpZXMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDVlMGMyYzQ5LCBMInN0YXBsZSIsIFhGQV9FTEVNRU5UX1N0YXBsZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg1ZTUwODNkZCwgTCJzdWJtaXRGb3JtYXQiLCBYRkFfRUxFTUVOVF9TdWJtaXRGb3JtYXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDVlOGM1ZDIwLCBMImJvb2xlYW4iLCBYRkFfRUxFTUVOVF9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4NjA0OTBhODUsIEwibWVzc2FnZSIsIFhGQV9FTEVNRU5UX01lc3NhZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDYwZDRjOGIxLCBMIm91dHB1dCIsIFhGQV9FTEVNRU5UX091dHB1dCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg2MTgxMDA4MSwgTCJwc01hcCIsIFhGQV9FTEVNRU5UX1BzTWFwLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDYyYmQ5MDRiLCBMImV4Y2x1ZGVOUyIsIFhGQV9FTEVNRU5UX0V4Y2x1ZGVOUywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4NjY5ZDRmNzcsIEwiYXNzaXN0IiwgWEZBX0VMRU1FTlRfQXNzaXN0LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4NjczMzRhMWMsIEwicGljdHVyZSIsIFhGQV9FTEVNRU5UX1BpY3R1cmUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg2N2ZlNzMzNCwgTCJ0cmF2ZXJzYWwiLCBYRkFfRUxFTUVOVF9UcmF2ZXJzYWwsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg2ODk0NTg5YywgTCJzaWxlbnRQcmludCIsIFhGQV9FTEVNRU5UX1NpbGVudFByaW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDY4YTE2YmJkLCBMIndlYkNsaWVudCIsIFhGQV9FTEVNRU5UX1dlYkNsaWVudCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg2OWYxMTVkZiwgTCJsYXlvdXRQc2V1ZG9Nb2RlbCIsIFhGQV9FTEVNRU5UX0xheW91dFBzZXVkb01vZGVsLCBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3R9LA0KLSAgICB7MHg2YTRiYzA4NCwgTCJwcm9kdWNlciIsIFhGQV9FTEVNRU5UX1Byb2R1Y2VyLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg2YTllMDRjOSwgTCJjb3JuZXIiLCBYRkFfRUxFTUVOVF9Db3JuZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg2Y2NkNzI3NCwgTCJtc2dJZCIsIFhGQV9FTEVNRU5UX01zZ0lkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KLSAgICB7MHg2ZTY3OTIxZiwgTCJjb2xvciIsIFhGQV9FTEVNRU5UX0NvbG9yLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4NmVjMjE3YTUsIEwia2VlcCIsIFhGQV9FTEVNRU5UX0tlZXAsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg2ZWVmMTExNiwgTCJxdWVyeSIsIFhGQV9FTEVNRU5UX1F1ZXJ5LCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDcwMzNiZmQ1LCBMImluc2VydCIsIFhGQV9FTEVNRU5UX0luc2VydCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCi0gICAgezB4NzA0YWYzODksIEwiaW1hZ2VFZGl0IiwgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4NzIzMzAxOGEsIEwidmFsaWRhdGUiLCBYRkFfRUxFTUVOVF9WYWxpZGF0ZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDcyYmE0N2I0LCBMImRpZ2VzdE1ldGhvZHMiLCBYRkFfRUxFTUVOVF9EaWdlc3RNZXRob2RzLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4NzJmMmFhN2EsIEwibnVtYmVyUGF0dGVybnMiLCBYRkFfRUxFTUVOVF9OdW1iZXJQYXR0ZXJucywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg3NGNhZWQyOSwgTCJwYWdlU2V0IiwgWEZBX0VMRU1FTlRfUGFnZVNldCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQotICAgIHsweDc1NjhlNmFlLCBMImludGVnZXIiLCBYRkFfRUxFTUVOVF9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4NzYxODJkYjksIEwic29hcEFkZHJlc3MiLCBYRkFfRUxFTUVOVF9Tb2FwQWRkcmVzcywgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQotICAgIHsweDc3MzE0NmM1LCBMImVxdWF0ZSIsIFhGQV9FTEVNRU5UX0VxdWF0ZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4NzdkNDQ5ZGQsIEwiZm9ybUZpZWxkRmlsbGluZyIsIFhGQV9FTEVNRU5UX0Zvcm1GaWVsZEZpbGxpbmcsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDc4ODlkNjhhLCBMInBhZ2VSYW5nZSIsIFhGQV9FTEVNRU5UX1BhZ2VSYW5nZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4N2JhY2EyZTMsIEwidXBkYXRlIiwgWEZBX0VMRU1FTlRfVXBkYXRlLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KLSAgICB7MHg3Y2U4OTAwMSwgTCJjb25uZWN0U3RyaW5nIiwgWEZBX0VMRU1FTlRfQ29ubmVjdFN0cmluZywgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCi0gICAgezB4N2Q5ZmQ3YzUsIEwibW9kZSIsIFhGQV9FTEVNRU5UX01vZGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDdlN2U4NDVlLCBMImxheW91dCIsIFhGQV9FTEVNRU5UX0xheW91dCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4N2U4NDVjMzQsIEwiI3htbCIsIFhGQV9FTEVNRU5UX1NoYXJweG1sLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQotICAgIHsweDdmYjM0MWRmLCBMInhzZENvbm5lY3Rpb24iLCBYRkFfRUxFTUVOVF9Yc2RDb25uZWN0aW9uLCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg3ZmZiNTFjYywgTCJ0cmF2ZXJzZSIsIFhGQV9FTEVNRU5UX1RyYXZlcnNlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4ODAyMDNiNWEsIEwiZW5jb2RpbmdzIiwgWEZBX0VMRU1FTlRfRW5jb2RpbmdzLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4ODAzNTUwZmMsIEwidGVtcGxhdGUiLCBYRkFfRUxFTUVOVF9UZW1wbGF0ZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGV9LA0KLSAgICB7MHg4MDNkNWJiYywgTCJhY3JvYmF0IiwgWEZBX0VMRU1FTlRfQWNyb2JhdCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg4MjFkNjU2OSwgTCJ2YWxpZGF0aW9uTWVzc2FnaW5nIiwgWEZBX0VMRU1FTlRfVmFsaWRhdGlvbk1lc3NhZ2luZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4ODMwZTY4OGYsIEwic2lnbmluZyIsIFhGQV9FTEVNRU5UX1NpZ25pbmcsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg4M2E1NTBkMiwgTCJkYXRhV2luZG93IiwgWEZBX0VMRU1FTlRfRGF0YVdpbmRvdywgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3R9LA0KLSAgICB7MHg4M2RhYjlmNSwgTCJzY3JpcHQiLCBYRkFfRUxFTUVOVF9TY3JpcHQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg4NDExZWJjZCwgTCJhZGRWaWV3ZXJQcmVmZXJlbmNlcyIsIFhGQV9FTEVNRU5UX0FkZFZpZXdlclByZWZlcmVuY2VzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg4Nzc3NjQyZSwgTCJhbHdheXNFbWJlZCIsIFhGQV9FTEVNRU5UX0Fsd2F5c0VtYmVkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KLSAgICB7MHg4NzdhNmIzOSwgTCJwYXNzd29yZEVkaXQiLCBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg4N2U4NGM5OSwgTCJudW1lcmljRWRpdCIsIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4ODg1MmNkZWMsIEwiZW5jcnlwdGlvbk1ldGhvZCIsIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2QsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGVDfSwNCi0gICAgezB4ODkxZjQ2MDYsIEwiY2hhbmdlIiwgWEZBX0VMRU1FTlRfQ2hhbmdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg4OTkzOWYzNiwgTCJwYWdlQXJlYSIsIFhGQV9FTEVNRU5UX1BhZ2VBcmVhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCi0gICAgezB4OGE5ZDYyNDcsIEwic3VibWl0VXJsIiwgWEZBX0VMRU1FTlRfU3VibWl0VXJsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg4YWQ4YjkwZiwgTCJvaWRzIiwgWEZBX0VMRU1FTlRfT2lkcywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDhiMDM2ZjMyLCBMInNpZ25hdHVyZSIsIFhGQV9FTEVNRU5UX1NpZ25hdHVyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDhiMTI4ZWZiLCBMIkFEQkVfSlNDb25zb2xlIiwgWEZBX0VMRU1FTlRfQURCRV9KU0NvbnNvbGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweDhiY2ZlOTZlLCBMImNhcHRpb24iLCBYRkFfRUxFTUVOVF9DYXB0aW9uLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLCBYRkFfRUxFTUVOVF9SZWxldmFudCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4OGUzZjBhNGIsIEwiZmxpcExhYmVsIiwgWEZBX0VMRU1FTlRfRmxpcExhYmVsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KLSAgICB7MHg5MDAyODBiNywgTCJleERhdGEiLCBYRkFfRUxFTUVOVF9FeERhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4OTFlODAzNTIsIEwiZGF5TmFtZXMiLCBYRkFfRUxFTUVOVF9EYXlOYW1lcywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg5MzExM2IxMSwgTCJzb2FwQWN0aW9uIiwgWEZBX0VMRU1FTlRfU29hcEFjdGlvbiwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQotICAgIHsweDkzOGIwOWY2LCBMImRlZmF1bHRUeXBlZmFjZSIsIFhGQV9FTEVNRU5UX0RlZmF1bHRUeXBlZmFjZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4OTViMzc4OTcsIEwibWFuaWZlc3QiLCBYRkFfRUxFTUVOVF9NYW5pZmVzdCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweDk3Yjc2YjU0LCBMIm92ZXJmbG93IiwgWEZBX0VMRU1FTlRfT3ZlcmZsb3csIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg5YTU3ODYxYiwgTCJsaW5lYXIiLCBYRkFfRUxFTUVOVF9MaW5lYXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHg5YWQ1YTgyMSwgTCJjdXJyZW5jeVN5bWJvbCIsIFhGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9sLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHg5YzY0NzFiMywgTCJkZWxldGUiLCBYRkFfRUxFTUVOVF9EZWxldGUsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQotICAgIHsweDlkZWVhNjFkLCBMImRlbHRhcyIsIFhGQV9FTEVNRU5UX0RlbHRhcywgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdH0sDQotICAgIHsweDllNjdkZTIxLCBMImRpZ2VzdE1ldGhvZCIsIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZUN9LA0KLSAgICB7MHg5ZjNlOTUxMCwgTCJpbnN0YW5jZU1hbmFnZXIiLCBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIsIFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGEwNzk5ODkyLCBMImVxdWF0ZVJhbmdlIiwgWEZBX0VMRU1FTlRfRXF1YXRlUmFuZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQotICAgIHsweGEwODRhMzgxLCBMIm1lZGl1bSIsIFhGQV9FTEVNRU5UX01lZGl1bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGExMjExYjhiLCBMInRleHRFZGl0IiwgWEZBX0VMRU1FTlRfVGV4dEVkaXQsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhhMTcwMDhmMCwgTCJ0ZW1wbGF0ZUNhY2hlIiwgWEZBX0VMRU1FTlRfVGVtcGxhdGVDYWNoZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhhNGY3Yjg4ZiwgTCJjb21wcmVzc09iamVjdFN0cmVhbSIsIFhGQV9FTEVNRU5UX0NvbXByZXNzT2JqZWN0U3RyZWFtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhhNjVmNWQxNywgTCJkYXRhVmFsdWUiLCBYRkFfRUxFTUVOVF9EYXRhVmFsdWUsIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhhNmNhYWE4OSwgTCJhY2Nlc3NpYmxlQ29udGVudCIsIFhGQV9FTEVNRU5UX0FjY2Vzc2libGVDb250ZW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhhOGM3ZDVlMiwgTCJub2RlTGlzdCIsIFhGQV9FTEVNRU5UX05vZGVMaXN0LCBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09CSkVDVFRZUEVfTm9kZUxpc3R9LA0KLSAgICB7MHhhOTRjYzAwYiwgTCJpbmNsdWRlWERQQ29udGVudCIsIFhGQV9FTEVNRU5UX0luY2x1ZGVYRFBDb250ZW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhhOWIwODFhMSwgTCJ4bWxDb25uZWN0aW9uIiwgWEZBX0VMRU1FTlRfWG1sQ29ubmVjdGlvbiwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YWIyYTNiNzQsIEwidmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMiLCBYRkFfRUxFTUVOVF9WYWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4YWI4YzVhMmIsIEwic2lnbkRhdGEiLCBYRkFfRUxFTUVOVF9TaWduRGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGFiYWEyY2ViLCBMInBhY2tldHMiLCBYRkFfRUxFTUVOVF9QYWNrZXRzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhhZGJhMzU5YywgTCJkYXRlUGF0dGVybiIsIFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJuLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhhZTIyMmIyYiwgTCJkdXBsZXhPcHRpb24iLCBYRkFfRUxFTUVOVF9EdXBsZXhPcHRpb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweGIwMTJlZmZiLCBMImJhc2UiLCBYRkFfRUxFTUVOVF9CYXNlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhiMGU1NDg1ZCwgTCJiaW5kIiwgWEZBX0VMRU1FTlRfQmluZCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YjQ1ZDYxYjIsIEwiY29tcHJlc3Npb24iLCBYRkFfRUxFTUVOVF9Db21wcmVzc2lvbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhiNTYzZjBmZiwgTCJ1c2VyIiwgWEZBX0VMRU1FTlRfVXNlciwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCi0gICAgezB4YjU4NDhhZDUsIEwicmVjdGFuZ2xlIiwgWEZBX0VMRU1FTlRfUmVjdGFuZ2xlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YjZkYWNiNzIsIEwiZWZmZWN0aXZlT3V0cHV0UG9saWN5IiwgWEZBX0VMRU1FTlRfRWZmZWN0aXZlT3V0cHV0UG9saWN5LCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhiN2Q3NjU0ZCwgTCJBREJFX0pTRGVidWdnZXIiLCBYRkFfRUxFTUVOVF9BREJFX0pTRGVidWdnZXIsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweGJhYjM3ZjczLCBMImFjcm9iYXQ3IiwgWEZBX0VMRU1FTlRfQWNyb2JhdDcsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YmM3MDA4MWUsIEwiaW50ZXJhY3RpdmUiLCBYRkFfRUxFTUVOVF9JbnRlcmFjdGl2ZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4YmM4ZmEzNTAsIEwibG9jYWxlIiwgWEZBX0VMRU1FTlRfTG9jYWxlLCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YmNkNDQ5NDAsIEwiY3VycmVudFBhZ2UiLCBYRkFfRUxFTUVOVF9DdXJyZW50UGFnZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4YmRlOWFiZGEsIEwiZGF0YSIsIFhGQV9FTEVNRU5UX0RhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YmRlOWFiZGUsIEwiZGF0ZSIsIFhGQV9FTEVNRU5UX0RhdGUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIFhGQV9FTEVNRU5UX0Rlc2MsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhiZjRiNjQwNSwgTCJlbmNyeXB0IiwgWEZBX0VMRU1FTlRfRW5jcnlwdCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweGJmYTg3Y2NlLCBMImRyYXciLCBYRkFfRUxFTUVOVF9EcmF3LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCi0gICAgezB4YzE4MWZmNGIsIEwiZW5jcnlwdGlvbiIsIFhGQV9FTEVNRU5UX0VuY3J5cHRpb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YzE5NzBmNDAsIEwibWVyaWRpZW1OYW1lcyIsIFhGQV9FTEVNRU5UX01lcmlkaWVtTmFtZXMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YzVhZDlmNWUsIEwibWVzc2FnaW5nIiwgWEZBX0VMRU1FTlRfTWVzc2FnaW5nLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGM2OTU0OWY0LCBMInNwZWFrIiwgWEZBX0VMRU1FTlRfU3BlYWssIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCi0gICAgezB4Yzc3NDNkYzcsIEwiZGF0YUdyb3VwIiwgWEZBX0VMRU1FTlRfRGF0YUdyb3VwLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4YzdlYjIwZTksIEwiY29tbW9uIiwgWEZBX0VMRU1FTlRfQ29tbW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGM4NWQ0NTI4LCBMIiN0ZXh0IiwgWEZBX0VMRU1FTlRfU2hhcnB0ZXh0LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCB8IFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCB8IFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQotICAgIHsweGM4NjE1NTZhLCBMInBhZ2luYXRpb25PdmVycmlkZSIsIFhGQV9FTEVNRU5UX1BhZ2luYXRpb25PdmVycmlkZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4YzkwM2RhYmIsIEwicmVhc29ucyIsIFhGQV9FTEVNRU5UX1JlYXNvbnMsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhjOWE4MTI3ZiwgTCJzaWduYXR1cmVQcm9wZXJ0aWVzIiwgWEZBX0VMRU1FTlRfU2lnbmF0dXJlUHJvcGVydGllcywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGNhMDEwYzJkLCBMInRocmVzaG9sZCIsIFhGQV9FTEVNRU5UX1RocmVzaG9sZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4Y2I0YzVlOTYsIEwiYXBwZWFyYW5jZUZpbHRlciIsIFhGQV9FTEVNRU5UX0FwcGVhcmFuY2VGaWx0ZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGVDfSwNCi0gICAgezB4Y2M5MmFiYTcsIEwiZmlsbCIsIFhGQV9FTEVNRU5UX0ZpbGwsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhjZDMwOGI3NywgTCJmb250IiwgWEZBX0VMRU1FTlRfRm9udCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4Y2QzMDlmZjQsIEwiZm9ybSIsIFhGQV9FTEVNRU5UX0Zvcm0sIFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCi0gICAgezB4Y2ViY2NhMmQsIEwibWVkaXVtSW5mbyIsIFhGQV9FTEVNRU5UX01lZGl1bUluZm8sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4Y2ZlMGQ2NDMsIEwiY2VydGlmaWNhdGUiLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KLSAgICB7MHhkMDEyYzAzMywgTCJwYXNzd29yZCIsIFhGQV9FTEVNRU5UX1Bhc3N3b3JkLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KLSAgICB7MHhkMDE2MDRiZCwgTCJydW5TY3JpcHRzIiwgWEZBX0VMRU1FTlRfUnVuU2NyaXB0cywgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4ZDEyMjdlNmYsIEwidHJhY2UiLCBYRkFfRUxFTUVOVF9UcmFjZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhkMTUzMjg3NiwgTCJmbG9hdCIsIFhGQV9FTEVNRU5UX0Zsb2F0LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweGQxN2E2YzMwLCBMInJlbmRlclBvbGljeSIsIFhGQV9FTEVNRU5UX1JlbmRlclBvbGljeSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4ZDRiZjY4MjMsIEwibG9nUHNldWRvTW9kZWwiLCBYRkFfRUxFTUVOVF9Mb2dQc2V1ZG9Nb2RlbCwgWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0fSwNCi0gICAgezB4ZDU4YWE5NjIsIEwiZGVzdGluYXRpb24iLCBYRkFfRUxFTUVOVF9EZXN0aW5hdGlvbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCBYRkFfRUxFTUVOVF9WYWx1ZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGQ3YTE0NDYyLCBMImJvb2tlbmQiLCBYRkFfRUxFTUVOVF9Cb29rZW5kLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4ZDhjMzEyNTQsIEwiZXhPYmplY3QiLCBYRkFfRUxFTUVOVF9FeE9iamVjdCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGRhNmE4NTkwLCBMIm9wZW5BY3Rpb24iLCBYRkFfRUxFTUVOVF9PcGVuQWN0aW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGRhYjRmYjdkLCBMIm5ldmVyRW1iZWQiLCBYRkFfRUxFTUVOVF9OZXZlckVtYmVkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KLSAgICB7MHhkYjk4NDc1ZiwgTCJiaW5kSXRlbXMiLCBYRkFfRUxFTUVOVF9CaW5kSXRlbXMsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhkYmZiZTAyZSwgTCJjYWxjdWxhdGUiLCBYRkFfRUxFTUVOVF9DYWxjdWxhdGUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhkZDc2NzZlZCwgTCJwcmludCIsIFhGQV9FTEVNRU5UX1ByaW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhkZGUyNzNkNywgTCJleHRyYXMiLCBYRkFfRUxFTUVOVF9FeHRyYXMsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGRlMTQ2YjM0LCBMInByb3RvIiwgWEZBX0VMRU1FTlRfUHJvdG8sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhkZjA1OTMyMSwgTCJkU2lnRGF0YSIsIFhGQV9FTEVNRU5UX0RTaWdEYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4ZGZjY2YwMzAsIEwiY3JlYXRvciIsIFhGQV9FTEVNRU5UX0NyZWF0b3IsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweGRmZjc4YzZhLCBMImNvbm5lY3QiLCBYRkFfRUxFTUVOVF9Db25uZWN0LCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhlMTFhMmNiYywgTCJwZXJtaXNzaW9ucyIsIFhGQV9FTEVNRU5UX1Blcm1pc3Npb25zLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGUxNGM4MDFjLCBMImNvbm5lY3Rpb25TZXQiLCBYRkFfRUxFTUVOVF9Db25uZWN0aW9uU2V0LCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQotICAgIHsweGUxYzgzYTE0LCBMInN1Ym1pdCIsIFhGQV9FTEVNRU5UX1N1Ym1pdCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGUyOTgyMWNkLCBMInJhbmdlIiwgWEZBX0VMRU1FTlRfUmFuZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQotICAgIHsweGUzOGQ4M2M3LCBMImxpbmVhcml6ZWQiLCBYRkFfRUxFTUVOVF9MaW5lYXJpemVkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhlM2FhMjU3OCwgTCJwYWNrZXQiLCBYRkFfRUxFTUVOVF9QYWNrZXQsIFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfT0JKRUNUVFlQRV9Ob2RlQ30sDQotICAgIHsweGUzYWE4NjBlLCBMInJvb3RFbGVtZW50IiwgWEZBX0VMRU1FTlRfUm9vdEVsZW1lbnQsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KLSAgICB7MHhlM2U1NTNmYSwgTCJwbGFpbnRleHRNZXRhZGF0YSIsIFhGQV9FTEVNRU5UX1BsYWludGV4dE1ldGFkYXRhLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhlM2U2ZTRmMiwgTCJudW1iZXJTeW1ib2xzIiwgWEZBX0VMRU1FTlRfTnVtYmVyU3ltYm9scywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhlM2YwNjdmNiwgTCJwcmludEhpZ2hRdWFsaXR5IiwgWEZBX0VMRU1FTlRfUHJpbnRIaWdoUXVhbGl0eSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4ZTNmZDA3OGMsIEwiZHJpdmVyIiwgWEZBX0VMRU1FTlRfRHJpdmVyLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGU0OGIzNGYyLCBMImluY3JlbWVudGFsTG9hZCIsIFhGQV9FTEVNRU5UX0luY3JlbWVudGFsTG9hZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4ZTU1MGU3YzIsIEwic3ViamVjdEROIiwgWEZBX0VMRU1FTlRfU3ViamVjdEROLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlQ30sDQotICAgIHsweGU2NjY5YTc4LCBMImNvbXByZXNzTG9naWNhbFN0cnVjdHVyZSIsIFhGQV9FTEVNRU5UX0NvbXByZXNzTG9naWNhbFN0cnVjdHVyZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4ZTdhN2VhMDIsIEwiaW5jcmVtZW50YWxNZXJnZSIsIFhGQV9FTEVNRU5UX0luY3JlbWVudGFsTWVyZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweGU5NDg1MzBkLCBMInJhZGlhbCIsIFhGQV9FTEVNRU5UX1JhZGlhbCwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQotICAgIHsweGVhOGQ2OTk5LCBMInZhcmlhYmxlcyIsIFhGQV9FTEVNRU5UX1ZhcmlhYmxlcywgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQotICAgIHsweGVhYTE0MmMwLCBMInRpbWVQYXR0ZXJucyIsIFhGQV9FTEVNRU5UX1RpbWVQYXR0ZXJucywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhlYjk0M2E3MSwgTCJlZmZlY3RpdmVJbnB1dFBvbGljeSIsIFhGQV9FTEVNRU5UX0VmZmVjdGl2ZUlucHV0UG9saWN5LCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhlZjA0YTJiYywgTCJuYW1lQXR0ciIsIFhGQV9FTEVNRU5UX05hbWVBdHRyLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KLSAgICB7MHhmMDcyMjJhYiwgTCJjb25mb3JtYW5jZSIsIFhGQV9FTEVNRU5UX0NvbmZvcm1hbmNlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhmMGFhYWFkYywgTCJ0cmFuc2Zvcm0iLCBYRkFfRUxFTUVOVF9UcmFuc2Zvcm0sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4ZjE0MzNlODgsIEwibG9ja0RvY3VtZW50IiwgWEZBX0VMRU1FTlRfTG9ja0RvY3VtZW50LCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweGY1NGViOTk3LCBMImJyZWFrQWZ0ZXIiLCBYRkFfRUxFTUVOVF9CcmVha0FmdGVyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4ZjYxNmRhMjgsIEwibGluZSIsIFhGQV9FTEVNRU5UX0xpbmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhmNjE2ZjNkYywgTCJsaXN0IiwgWEZBX0VMRU1FTlRfTGlzdCwgWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5TGlzdH0sDQotICAgIHsweGY3MDU1ZmIxLCBMInNvdXJjZSIsIFhGQV9FTEVNRU5UX1NvdXJjZSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KLSAgICB7MHhmN2VlYmUxYywgTCJvY2N1ciIsIFhGQV9FTEVNRU5UX09jY3VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4ZjhkMTBkOTcsIEwicGlja1RyYXlCeVBERlNpemUiLCBYRkFfRUxFTUVOVF9QaWNrVHJheUJ5UERGU2l6ZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4ZjhmMTllM2EsIEwibW9udGhOYW1lcyIsIFhGQV9FTEVNRU5UX01vbnRoTmFtZXMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCi0gICAgezB4Zjk4NDE0OWIsIEwic2V2ZXJpdHkiLCBYRkFfRUxFTUVOVF9TZXZlcml0eSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4ZjliY2IwMzcsIEwiZ3JvdXBQYXJlbnQiLCBYRkFfRUxFTUVOVF9Hcm91cFBhcmVudCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCi0gICAgezB4ZmJjNDJmZmYsIEwiZG9jdW1lbnRBc3NlbWJseSIsIFhGQV9FTEVNRU5UX0RvY3VtZW50QXNzZW1ibHksIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQotICAgIHsweGZjNzgxNTlmLCBMIm51bWJlclN5bWJvbCIsIFhGQV9FTEVNRU5UX051bWJlclN5bWJvbCwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCi0gICAgezB4ZmNiZDYwNmMsIEwidGFnZ2VkIiwgWEZBX0VMRU1FTlRfVGFnZ2VkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KLSAgICB7MHhmZjA2MzgwMiwgTCJpdGVtcyIsIFhGQV9FTEVNRU5UX0l0ZW1zLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjUzNjMsIEwidG8iLCBYRkFfRUxFTUVOVF9UbywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDI1ODdlLCBMInVpIiwgWEZBX0VMRU1FTlRfVWksDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MWM2NDhiLCBMInJlY29yZFNldCIsIFhGQV9FTEVNRU5UX1JlY29yZFNldCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MTcxNDI4ZiwgTCJzdWJzZXRCZWxvdyIsIFhGQV9FTEVNRU5UX1N1YnNldEJlbG93LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MWEwNzc2YSwgTCJzdWJmb3JtU2V0IiwgWEZBX0VMRU1FTlRfU3ViZm9ybVNldCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KKyAgICB7MHgyMzQwZDcwLCBMImFkb2JlRXh0ZW5zaW9uTGV2ZWwiLCBYRkFfRUxFTUVOVF9BZG9iZUV4dGVuc2lvbkxldmVsLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MmMxYzdmMSwgTCJ0eXBlZmFjZSIsIFhGQV9FTEVNRU5UX1R5cGVmYWNlLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg1NTE4YzI1LCBMImJyZWFrIiwgWEZBX0VMRU1FTlRfQnJlYWssDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NWZmZjUyMywgTCJmb250SW5mbyIsIFhGQV9FTEVNRU5UX0ZvbnRJbmZvLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2NTNhMjI3LCBMIm51bWJlclBhdHRlcm4iLCBYRkFfRUxFTUVOVF9OdW1iZXJQYXR0ZXJuLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NjViNGEwNSwgTCJkeW5hbWljUmVuZGVyIiwgWEZBX0VMRU1FTlRfRHluYW1pY1JlbmRlciwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDdlNDM2MmUsIEwicHJpbnRTY2FsaW5nIiwgWEZBX0VMRU1FTlRfUHJpbnRTY2FsaW5nLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4N2ZlNmQzYSwgTCJjaGVja0J1dHRvbiIsIFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDgwY2Y1OGYsIEwiZGF0ZVBhdHRlcm5zIiwgWEZBX0VMRU1FTlRfRGF0ZVBhdHRlcm5zLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg4MTE5MjlkLCBMInNvdXJjZVNldCIsIFhGQV9FTEVNRU5UX1NvdXJjZVNldCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGV9LA0KKyAgICB7MHg5ZjlkNjEyLCBMImFtZCIsIFhGQV9FTEVNRU5UX0FtZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDlmOWVmYjYsIEwiYXJjIiwgWEZBX0VMRU1FTlRfQXJjLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGE0ODgzNWUsIEwiZGF5IiwgWEZBX0VMRU1FTlRfRGF5LCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YTYzMjhiOCwgTCJlcmEiLCBYRkFfRUxFTUVOVF9FcmEsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhhZTZhMGEwLCBMImpvZyIsIFhGQV9FTEVNRU5UX0pvZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGIxYjNkMjIsIEwibG9nIiwgWEZBX0VMRU1FTlRfTG9nLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiMzU0MzllLCBMIm1hcCIsIFhGQV9FTEVNRU5UX01hcCwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiMzU1MzAxLCBMIm1kcCIsIFhGQV9FTEVNRU5UX01kcCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiNDIwNDM4LCBMImJyZWFrQmVmb3JlIiwgWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjZhMDkxYywgTCJvaWQiLCBYRkFfRUxFTUVOVF9PaWQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweGI4NDM4OWYsIEwicGNsIiwgWEZBX0VMRU1FTlRfUGNsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiODQzZGJhLCBMInBkZiIsIFhGQV9FTEVNRU5UX1BkZiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YmI4ZGY1ZCwgTCJyZWYiLCBYRkFfRUxFTUVOVF9SZWYsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweGMwODBjZDAsIEwidXJpIiwgWEZBX0VMRU1FTlRfVXJpLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweGM1NmFmYmYsIEwieGRjIiwgWEZBX0VMRU1FTlRfWGRjLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1hkYywgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCisgICAgezB4YzU2YWZjYywgTCJ4ZHAiLCBYRkFfRUxFTUVOVF9YZHAsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGM1NmI5ZmYsIEwieGZhIiwgWEZBX0VMRU1FTlRfWGZhLCBYRkFfWERQUEFDS0VUX1hEUCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQorICAgIHsweGM1NmZjYjcsIEwieHNsIiwgWEZBX0VMRU1FTlRfWHNsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjOGI4OWQ2LCBMInpwbCIsIFhGQV9FTEVNRU5UX1pwbCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YzliYWU5NCwgTCJjYWNoZSIsIFhGQV9FTEVNRU5UX0NhY2hlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjYjAxNmJlLCBMIm1hcmdpbiIsIFhGQV9FTEVNRU5UX01hcmdpbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhlMTM3OGZlLCBMImtleVVzYWdlIiwgWEZBX0VMRU1FTlRfS2V5VXNhZ2UsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZmUzNTk2YSwgTCJleGNsdWRlIiwgWEZBX0VMRU1FTlRfRXhjbHVkZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDEwMzk1YWM3LCBMImNob2ljZUxpc3QiLCBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDEwNTllYzE4LCBMImxldmVsIiwgWEZBX0VMRU1FTlRfTGV2ZWwsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgxMDg3NDgwNCwgTCJsYWJlbFByaW50ZXIiLCBYRkFfRUxFTUVOVF9MYWJlbFByaW50ZXIsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDEwYzQwZTAzLCBMImNhbGVuZGFyU3ltYm9scyIsIFhGQV9FTEVNRU5UX0NhbGVuZGFyU3ltYm9scywNCisgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MTBmMWVhMjQsIEwicGFyYSIsIFhGQV9FTEVNRU5UX1BhcmEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MTBmMWVhMzcsIEwicGFydCIsIFhGQV9FTEVNRU5UX1BhcnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgxMTQwOTc1YiwgTCJwZGZhIiwgWEZBX0VMRU1FTlRfUGRmYSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MTE1NGVmZTYsIEwiZmlsdGVyIiwgWEZBX0VMRU1FTlRfRmlsdGVyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDEzZjQxZGUxLCBMInByZXNlbnQiLCBYRkFfRUxFTUVOVF9QcmVzZW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgxODI3ZTZlYSwgTCJwYWdpbmF0aW9uIiwgWEZBX0VMRU1FTlRfUGFnaW5hdGlvbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDE4NDYzNzA3LCBMImVuY29kaW5nIiwgWEZBX0VMRU1FTlRfRW5jb2RpbmcsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlQ30sDQorICAgIHsweDE4NWU0MWUyLCBMImV2ZW50IiwgWEZBX0VMRU1FTlRfRXZlbnQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MWFkYjE0MmQsIEwid2hpdGVzcGFjZSIsIFhGQV9FTEVNRU5UX1doaXRlc3BhY2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHgxZjNmNjRjMywgTCJkZWZhdWx0VWkiLCBYRkFfRUxFTUVOVF9EZWZhdWx0VWksDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjA0ZTg3Y2IsIEwiZGF0YU1vZGVsIiwgWEZBX0VMRU1FTlRfRGF0YU1vZGVsLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCisgICAgezB4MjA1N2IzNTAsIEwiYmFyY29kZSIsIFhGQV9FTEVNRU5UX0JhcmNvZGUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjA1OTZiYWQsIEwidGltZVBhdHRlcm4iLCBYRkFfRUxFTUVOVF9UaW1lUGF0dGVybiwNCisgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDIxMGI3NGQzLCBMImJhdGNoT3V0cHV0IiwgWEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDIxMmZmMGUyLCBMImVuZm9yY2UiLCBYRkFfRUxFTUVOVF9FbmZvcmNlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MjFkMzUxYjQsIEwiY3VycmVuY3lTeW1ib2xzIiwgWEZBX0VMRU1FTlRfQ3VycmVuY3lTeW1ib2xzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgyMWRiODNjNSwgTCJhZGRTaWxlbnRQcmludCIsIFhGQV9FTEVNRU5UX0FkZFNpbGVudFByaW50LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MjIyNjYyNTgsIEwicmVuYW1lIiwgWEZBX0VMRU1FTlRfUmVuYW1lLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4MjI2Y2E4ZjEsIEwib3BlcmF0aW9uIiwgWEZBX0VMRU1FTlRfT3BlcmF0aW9uLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDIzZTI3Yjg0LCBMInR5cGVmYWNlcyIsIFhGQV9FTEVNRU5UX1R5cGVmYWNlcywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjNmNGFhNzUsIEwic3ViamVjdEROcyIsIFhGQV9FTEVNRU5UX1N1YmplY3RETnMsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjQwZDVlOGUsIEwiaXNzdWVycyIsIFhGQV9FTEVNRU5UX0lzc3VlcnMsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjQ1N2EwMzMsIEwic2lnbmF0dXJlUHNldWRvTW9kZWwiLCBYRkFfRUxFTUVOVF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCwNCisgICAgIFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdH0sDQorICAgIHsweDI0YTUyZjhhLCBMIndzZGxDb25uZWN0aW9uIiwgWEZBX0VMRU1FTlRfV3NkbENvbm5lY3Rpb24sDQorICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgyNTRlYmQwNywgTCJkZWJ1ZyIsIFhGQV9FTEVNRU5UX0RlYnVnLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgyNjU1YzY2YSwgTCJkZWx0YSIsIFhGQV9FTEVNRU5UX0RlbHRhLCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdH0sDQorICAgIHsweDI2YzBkYWVjLCBMImVyYU5hbWVzIiwgWEZBX0VMRU1FTlRfRXJhTmFtZXMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDI3M2FiMDNiLCBMIm1vZGlmeUFubm90cyIsIFhGQV9FTEVNRU5UX01vZGlmeUFubm90cywNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDI3ODc1YmI0LCBMInN0YXJ0Tm9kZSIsIFhGQV9FTEVNRU5UX1N0YXJ0Tm9kZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDI4NWQwZGJjLCBMImJ1dHRvbiIsIFhGQV9FTEVNRU5UX0J1dHRvbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgyOGRlZTZlOSwgTCJmb3JtYXQiLCBYRkFfRUxFTUVOVF9Gb3JtYXQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MmEyMzM0OWUsIEwiYm9yZGVyIiwgWEZBX0VMRU1FTlRfQm9yZGVyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDJhZTY3ZjE5LCBMImFyZWEiLCBYRkFfRUxFTUVOVF9BcmVhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQorICAgIHsweDJjM2M0YzY3LCBMImh5cGhlbmF0aW9uIiwgWEZBX0VMRU1FTlRfSHlwaGVuYXRpb24sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MmQwOGFmODUsIEwidGV4dCIsIFhGQV9FTEVNRU5UX1RleHQsDQorICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDJkNzFiMDBmLCBMInRpbWUiLCBYRkFfRUxFTUVOVF9UaW1lLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgWEZBX0VMRU1FTlRfVHlwZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDJmZTA1N2U5LCBMIm92ZXJwcmludCIsIFhGQV9FTEVNRU5UX092ZXJwcmludCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDMwMmFlZTE2LCBMImNlcnRpZmljYXRlcyIsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcywNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgzMGIyMjdkZiwgTCJlbmNyeXB0aW9uTWV0aG9kcyIsIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2RzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDMyYjkwMGQxLCBMInNldFByb3BlcnR5IiwgWEZBX0VMRU1FTlRfU2V0UHJvcGVydHksDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MzM3ZDllNDUsIEwicHJpbnRlck5hbWUiLCBYRkFfRUxFTUVOVF9QcmludGVyTmFtZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDMzZWRkYTRiLCBMInN0YXJ0UGFnZSIsIFhGQV9FTEVNRU5UX1N0YXJ0UGFnZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDM4MTk0M2U0LCBMInBhZ2VPZmZzZXQiLCBYRkFfRUxFTUVOVF9QYWdlT2Zmc2V0LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgzODIxMDZjZCwgTCJkYXRlVGltZSIsIFhGQV9FTEVNRU5UX0RhdGVUaW1lLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgzODZlNzQyMSwgTCJjb21iIiwgWEZBX0VMRU1FTlRfQ29tYiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgzOTBhY2Q5ZSwgTCJwYXR0ZXJuIiwgWEZBX0VMRU1FTlRfUGF0dGVybiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgzOTQyMTYzZSwgTCJpZkVtcHR5IiwgWEZBX0VMRU1FTlRfSWZFbXB0eSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDM5OTQ0YTdiLCBMInN1cHByZXNzQmFubmVyIiwgWEZBX0VMRU1FTlRfU3VwcHJlc3NCYW5uZXIsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgzYjNjM2RjYSwgTCJvdXRwdXRCaW4iLCBYRkFfRUxFTUVOVF9PdXRwdXRCaW4sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgzYjhhNDAyNCwgTCJmaWVsZCIsIFhGQV9FTEVNRU5UX0ZpZWxkLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQorICAgIHsweDNjMTUzNTJmLCBMImFnZW50IiwgWEZBX0VMRU1FTlRfQWdlbnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDNkN2U4NjY4LCBMIm91dHB1dFhTTCIsIFhGQV9FTEVNRU5UX091dHB1dFhTTCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4M2UxYzkxYzUsIEwiYWRqdXN0RGF0YSIsIFhGQV9FTEVNRU5UX0FkanVzdERhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHgzZTdhOTQwOCwgTCJhdXRvU2F2ZSIsIFhGQV9FTEVNRU5UX0F1dG9TYXZlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4M2VjZWFkOTQsIEwiY29udGVudEFyZWEiLCBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KKyAgICB7MHgzZWYzMzRlMywgTCJldmVudFBzZXVkb01vZGVsIiwgWEZBX0VMRU1FTlRfRXZlbnRQc2V1ZG9Nb2RlbCwNCisgICAgIFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdH0sDQorICAgIHsweDNmYWRhZWMwLCBMIndzZGxBZGRyZXNzIiwgWEZBX0VMRU1FTlRfV3NkbEFkZHJlc3MsDQorICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4NDA2MjNiNWIsIEwic29saWQiLCBYRkFfRUxFTUVOVF9Tb2xpZCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg0MWYwYmQ3NiwgTCJkYXRlVGltZVN5bWJvbHMiLCBYRkFfRUxFTUVOVF9EYXRlVGltZVN5bWJvbHMsDQorICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg0NDRlNzUyMywgTCJlbmNyeXB0aW9uTGV2ZWwiLCBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTGV2ZWwsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg0NTIzYWY1NSwgTCJlZGdlIiwgWEZBX0VMRU1FTlRfRWRnZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg0NWQ1ZTNjMSwgTCJzdGlwcGxlIiwgWEZBX0VMRU1FTlRfU3RpcHBsZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg0NzVlNGU4NywgTCJhdHRyaWJ1dGVzIiwgWEZBX0VMRU1FTlRfQXR0cmlidXRlcywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDQ4N2E4Yzg3LCBMInZlcnNpb25Db250cm9sIiwgWEZBX0VMRU1FTlRfVmVyc2lvbkNvbnRyb2wsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDQ4ZTUyNDhjLCBMIm1lcmlkaWVtIiwgWEZBX0VMRU1FTlRfTWVyaWRpZW0sIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg0OGYzNjcxOSwgTCJleGNsR3JvdXAiLCBYRkFfRUxFTUVOVF9FeGNsR3JvdXAsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCisgICAgezB4NDk3NzM1NmIsIEwidG9vbFRpcCIsIFhGQV9FTEVNRU5UX1Rvb2xUaXAsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDQ5OWFmZWNjLCBMImNvbXByZXNzIiwgWEZBX0VMRU1FTlRfQ29tcHJlc3MsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDRhMGM0OTQ4LCBMInJlYXNvbiIsIFhGQV9FTEVNRU5UX1JlYXNvbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4NGJkY2NlMTMsIEwiZXhlY3V0ZSIsIFhGQV9FTEVNRU5UX0V4ZWN1dGUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NGM1NmIyMTYsIEwiY29udGVudENvcHkiLCBYRkFfRUxFTUVOVF9Db250ZW50Q29weSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDRjYzE3NmQzLCBMImRhdGVUaW1lRWRpdCIsIFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg0ZTFlMzliNiwgTCJjb25maWciLCBYRkFfRUxFTUVOVF9Db25maWcsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCisgICAgezB4NGUyZDYwODMsIEwiaW1hZ2UiLCBYRkFfRUxFTUVOVF9JbWFnZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NGU4MTQxNTAsIEwiI3hIVE1MIiwgWEZBX0VMRU1FTlRfU2hhcnB4SFRNTCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0IHwNCisgICAgICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQgfCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8DQorICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg0ZjIzODhjMSwgTCJudW1iZXJPZkNvcGllcyIsIFhGQV9FTEVNRU5UX051bWJlck9mQ29waWVzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NGY1MTJlMzAsIEwiYmVoYXZpb3JPdmVycmlkZSIsIFhGQV9FTEVNRU5UX0JlaGF2aW9yT3ZlcnJpZGUsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg0ZmRjMzQ1NCwgTCJ0aW1lU3RhbXAiLCBYRkFfRUxFTUVOVF9UaW1lU3RhbXAsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NTFkOTA1NDYsIEwibW9udGgiLCBYRkFfRUxFTUVOVF9Nb250aCwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDUyMzQzN2U0LCBMInZpZXdlclByZWZlcmVuY2VzIiwgWEZBX0VMRU1FTlRfVmlld2VyUHJlZmVyZW5jZXMsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDUzYWJjMWM2LCBMInNjcmlwdE1vZGVsIiwgWEZBX0VMRU1FTlRfU2NyaXB0TW9kZWwsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg1NDAzNGMyZiwgTCJkZWNpbWFsIiwgWEZBX0VMRU1FTlRfRGVjaW1hbCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NTQyMDJjOWUsIEwic3ViZm9ybSIsIFhGQV9FTEVNRU5UX1N1YmZvcm0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCisgICAgezB4NTQyYzczMDAsIEwic2VsZWN0IiwgWEZBX0VMRU1FTlRfU2VsZWN0LCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4NTQzNmQxOTgsIEwid2luZG93IiwgWEZBX0VMRU1FTlRfV2luZG93LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4NTQ3M2I2ZGMsIEwibG9jYWxlU2V0IiwgWEZBX0VMRU1FTlRfTG9jYWxlU2V0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCisgICAgezB4NTZhZTE3OWUsIEwiaGFuZGxlciIsIFhGQV9FTEVNRU5UX0hhbmRsZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDU3MDBiZDVmLCBMImhvc3RQc2V1ZG9Nb2RlbCIsIFhGQV9FTEVNRU5UX0hvc3RQc2V1ZG9Nb2RlbCwNCisgICAgIFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdH0sDQorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgWEZBX0VMRU1FTlRfUHJlc2VuY2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg1Nzc5ZDY1ZiwgTCJyZWNvcmQiLCBYRkFfRUxFTUVOVF9SZWNvcmQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg1OWM4ZjI3ZCwgTCJlbWJlZCIsIFhGQV9FTEVNRU5UX0VtYmVkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NWE1MGU5ZTYsIEwidmVyc2lvbiIsIFhGQV9FTEVNRU5UX1ZlcnNpb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg1YjgzODNkZiwgTCJjb21tYW5kIiwgWEZBX0VMRU1FTlRfQ29tbWFuZCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NWM0M2M2YzMsIEwiY29waWVzIiwgWEZBX0VMRU1FTlRfQ29waWVzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NWUwYzJjNDksIEwic3RhcGxlIiwgWEZBX0VMRU1FTlRfU3RhcGxlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg1ZTUwODNkZCwgTCJzdWJtaXRGb3JtYXQiLCBYRkFfRUxFTUVOVF9TdWJtaXRGb3JtYXQsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg1ZThjNWQyMCwgTCJib29sZWFuIiwgWEZBX0VMRU1FTlRfQm9vbGVhbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NjA0OTBhODUsIEwibWVzc2FnZSIsIFhGQV9FTEVNRU5UX01lc3NhZ2UsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NjBkNGM4YjEsIEwib3V0cHV0IiwgWEZBX0VMRU1FTlRfT3V0cHV0LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2MTgxMDA4MSwgTCJwc01hcCIsIFhGQV9FTEVNRU5UX1BzTWFwLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2MmJkOTA0YiwgTCJleGNsdWRlTlMiLCBYRkFfRUxFTUVOVF9FeGNsdWRlTlMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg2NjlkNGY3NywgTCJhc3Npc3QiLCBYRkFfRUxFTUVOVF9Bc3Npc3QsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NjczMzRhMWMsIEwicGljdHVyZSIsIFhGQV9FTEVNRU5UX1BpY3R1cmUsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDY3ZmU3MzM0LCBMInRyYXZlcnNhbCIsIFhGQV9FTEVNRU5UX1RyYXZlcnNhbCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2ODk0NTg5YywgTCJzaWxlbnRQcmludCIsIFhGQV9FTEVNRU5UX1NpbGVudFByaW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2OGExNmJiZCwgTCJ3ZWJDbGllbnQiLCBYRkFfRUxFTUVOVF9XZWJDbGllbnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDY5ZjExNWRmLCBMImxheW91dFBzZXVkb01vZGVsIiwgWEZBX0VMRU1FTlRfTGF5b3V0UHNldWRvTW9kZWwsDQorICAgICBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3R9LA0KKyAgICB7MHg2YTRiYzA4NCwgTCJwcm9kdWNlciIsIFhGQV9FTEVNRU5UX1Byb2R1Y2VyLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NmE5ZTA0YzksIEwiY29ybmVyIiwgWEZBX0VMRU1FTlRfQ29ybmVyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDZjY2Q3Mjc0LCBMIm1zZ0lkIiwgWEZBX0VMRU1FTlRfTXNnSWQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg2ZTY3OTIxZiwgTCJjb2xvciIsIFhGQV9FTEVNRU5UX0NvbG9yLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDZlYzIxN2E1LCBMImtlZXAiLCBYRkFfRUxFTUVOVF9LZWVwLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDZlZWYxMTE2LCBMInF1ZXJ5IiwgWEZBX0VMRU1FTlRfUXVlcnksIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDcwMzNiZmQ1LCBMImluc2VydCIsIFhGQV9FTEVNRU5UX0luc2VydCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDcwNGFmMzg5LCBMImltYWdlRWRpdCIsIFhGQV9FTEVNRU5UX0ltYWdlRWRpdCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg3MjMzMDE4YSwgTCJ2YWxpZGF0ZSIsIFhGQV9FTEVNRU5UX1ZhbGlkYXRlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg3MmJhNDdiNCwgTCJkaWdlc3RNZXRob2RzIiwgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kcywNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg3MmYyYWE3YSwgTCJudW1iZXJQYXR0ZXJucyIsIFhGQV9FTEVNRU5UX051bWJlclBhdHRlcm5zLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg3NGNhZWQyOSwgTCJwYWdlU2V0IiwgWEZBX0VMRU1FTlRfUGFnZVNldCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KKyAgICB7MHg3NTY4ZTZhZSwgTCJpbnRlZ2VyIiwgWEZBX0VMRU1FTlRfSW50ZWdlciwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NzYxODJkYjksIEwic29hcEFkZHJlc3MiLCBYRkFfRUxFTUVOVF9Tb2FwQWRkcmVzcywNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg3NzMxNDZjNSwgTCJlcXVhdGUiLCBYRkFfRUxFTUVOVF9FcXVhdGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg3N2Q0NDlkZCwgTCJmb3JtRmllbGRGaWxsaW5nIiwgWEZBX0VMRU1FTlRfRm9ybUZpZWxkRmlsbGluZywNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDc4ODlkNjhhLCBMInBhZ2VSYW5nZSIsIFhGQV9FTEVNRU5UX1BhZ2VSYW5nZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDdiYWNhMmUzLCBMInVwZGF0ZSIsIFhGQV9FTEVNRU5UX1VwZGF0ZSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDdjZTg5MDAxLCBMImNvbm5lY3RTdHJpbmciLCBYRkFfRUxFTUVOVF9Db25uZWN0U3RyaW5nLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4N2Q5ZmQ3YzUsIEwibW9kZSIsIFhGQV9FTEVNRU5UX01vZGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg3ZTdlODQ1ZSwgTCJsYXlvdXQiLCBYRkFfRUxFTUVOVF9MYXlvdXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg3ZTg0NWMzNCwgTCIjeG1sIiwgWEZBX0VMRU1FTlRfU2hhcnB4bWwsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDdmYjM0MWRmLCBMInhzZENvbm5lY3Rpb24iLCBYRkFfRUxFTUVOVF9Yc2RDb25uZWN0aW9uLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4N2ZmYjUxY2MsIEwidHJhdmVyc2UiLCBYRkFfRUxFTUVOVF9UcmF2ZXJzZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg4MDIwM2I1YSwgTCJlbmNvZGluZ3MiLCBYRkFfRUxFTUVOVF9FbmNvZGluZ3MsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ODAzNTUwZmMsIEwidGVtcGxhdGUiLCBYRkFfRUxFTUVOVF9UZW1wbGF0ZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQorICAgIHsweDgwM2Q1YmJjLCBMImFjcm9iYXQiLCBYRkFfRUxFTUVOVF9BY3JvYmF0LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg4MjFkNjU2OSwgTCJ2YWxpZGF0aW9uTWVzc2FnaW5nIiwgWEZBX0VMRU1FTlRfVmFsaWRhdGlvbk1lc3NhZ2luZywNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDgzMGU2ODhmLCBMInNpZ25pbmciLCBYRkFfRUxFTUVOVF9TaWduaW5nLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDgzYTU1MGQyLCBMImRhdGFXaW5kb3ciLCBYRkFfRUxFTUVOVF9EYXRhV2luZG93LCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3R9LA0KKyAgICB7MHg4M2RhYjlmNSwgTCJzY3JpcHQiLCBYRkFfRUxFTUVOVF9TY3JpcHQsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDg0MTFlYmNkLCBMImFkZFZpZXdlclByZWZlcmVuY2VzIiwgWEZBX0VMRU1FTlRfQWRkVmlld2VyUHJlZmVyZW5jZXMsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg4Nzc3NjQyZSwgTCJhbHdheXNFbWJlZCIsIFhGQV9FTEVNRU5UX0Fsd2F5c0VtYmVkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4ODc3YTZiMzksIEwicGFzc3dvcmRFZGl0IiwgWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDg3ZTg0Yzk5LCBMIm51bWVyaWNFZGl0IiwgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ODg1MmNkZWMsIEwiZW5jcnlwdGlvbk1ldGhvZCIsIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2QsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlQ30sDQorICAgIHsweDg5MWY0NjA2LCBMImNoYW5nZSIsIFhGQV9FTEVNRU5UX0NoYW5nZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDg5OTM5ZjM2LCBMInBhZ2VBcmVhIiwgWEZBX0VMRU1FTlRfUGFnZUFyZWEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCisgICAgezB4OGE5ZDYyNDcsIEwic3VibWl0VXJsIiwgWEZBX0VMRU1FTlRfU3VibWl0VXJsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4OGFkOGI5MGYsIEwib2lkcyIsIFhGQV9FTEVNRU5UX09pZHMsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4OGIwMzZmMzIsIEwic2lnbmF0dXJlIiwgWEZBX0VMRU1FTlRfU2lnbmF0dXJlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDhiMTI4ZWZiLCBMIkFEQkVfSlNDb25zb2xlIiwgWEZBX0VMRU1FTlRfQURCRV9KU0NvbnNvbGUsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg4YmNmZTk2ZSwgTCJjYXB0aW9uIiwgWEZBX0VMRU1FTlRfQ2FwdGlvbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIFhGQV9FTEVNRU5UX1JlbGV2YW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4OGUzZjBhNGIsIEwiZmxpcExhYmVsIiwgWEZBX0VMRU1FTlRfRmxpcExhYmVsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4OTAwMjgwYjcsIEwiZXhEYXRhIiwgWEZBX0VMRU1FTlRfRXhEYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg5MWU4MDM1MiwgTCJkYXlOYW1lcyIsIFhGQV9FTEVNRU5UX0RheU5hbWVzLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg5MzExM2IxMSwgTCJzb2FwQWN0aW9uIiwgWEZBX0VMRU1FTlRfU29hcEFjdGlvbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg5MzhiMDlmNiwgTCJkZWZhdWx0VHlwZWZhY2UiLCBYRkFfRUxFTUVOVF9EZWZhdWx0VHlwZWZhY2UsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg5NWIzNzg5NywgTCJtYW5pZmVzdCIsIFhGQV9FTEVNRU5UX01hbmlmZXN0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDk3Yjc2YjU0LCBMIm92ZXJmbG93IiwgWEZBX0VMRU1FTlRfT3ZlcmZsb3csDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4OWE1Nzg2MWIsIEwibGluZWFyIiwgWEZBX0VMRU1FTlRfTGluZWFyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDlhZDVhODIxLCBMImN1cnJlbmN5U3ltYm9sIiwgWEZBX0VMRU1FTlRfQ3VycmVuY3lTeW1ib2wsDQorICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg5YzY0NzFiMywgTCJkZWxldGUiLCBYRkFfRUxFTUVOVF9EZWxldGUsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg5ZGVlYTYxZCwgTCJkZWx0YXMiLCBYRkFfRUxFTUVOVF9EZWx0YXMsIFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0fSwNCisgICAgezB4OWU2N2RlMjEsIEwiZGlnZXN0TWV0aG9kIiwgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZUN9LA0KKyAgICB7MHg5ZjNlOTUxMCwgTCJpbnN0YW5jZU1hbmFnZXIiLCBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhhMDc5OTg5MiwgTCJlcXVhdGVSYW5nZSIsIFhGQV9FTEVNRU5UX0VxdWF0ZVJhbmdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4YTA4NGEzODEsIEwibWVkaXVtIiwgWEZBX0VMRU1FTlRfTWVkaXVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGExMjExYjhiLCBMInRleHRFZGl0IiwgWEZBX0VMRU1FTlRfVGV4dEVkaXQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YTE3MDA4ZjAsIEwidGVtcGxhdGVDYWNoZSIsIFhGQV9FTEVNRU5UX1RlbXBsYXRlQ2FjaGUsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGE0ZjdiODhmLCBMImNvbXByZXNzT2JqZWN0U3RyZWFtIiwgWEZBX0VMRU1FTlRfQ29tcHJlc3NPYmplY3RTdHJlYW0sDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhhNjVmNWQxNywgTCJkYXRhVmFsdWUiLCBYRkFfRUxFTUVOVF9EYXRhVmFsdWUsIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YTZjYWFhODksIEwiYWNjZXNzaWJsZUNvbnRlbnQiLCBYRkFfRUxFTUVOVF9BY2Nlc3NpYmxlQ29udGVudCwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGE4YzdkNWUyLCBMIm5vZGVMaXN0IiwgWEZBX0VMRU1FTlRfTm9kZUxpc3QsIFhGQV9YRFBQQUNLRVRfWERQLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZUxpc3R9LA0KKyAgICB7MHhhOTRjYzAwYiwgTCJpbmNsdWRlWERQQ29udGVudCIsIFhGQV9FTEVNRU5UX0luY2x1ZGVYRFBDb250ZW50LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YTliMDgxYTEsIEwieG1sQ29ubmVjdGlvbiIsIFhGQV9FTEVNRU5UX1htbENvbm5lY3Rpb24sDQorICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhhYjJhM2I3NCwgTCJ2YWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcyIsDQorICAgICBYRkFfRUxFTUVOVF9WYWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGFiOGM1YTJiLCBMInNpZ25EYXRhIiwgWEZBX0VMRU1FTlRfU2lnbkRhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YWJhYTJjZWIsIEwicGFja2V0cyIsIFhGQV9FTEVNRU5UX1BhY2tldHMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhhZGJhMzU5YywgTCJkYXRlUGF0dGVybiIsIFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJuLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YWUyMjJiMmIsIEwiZHVwbGV4T3B0aW9uIiwgWEZBX0VMRU1FTlRfRHVwbGV4T3B0aW9uLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YjAxMmVmZmIsIEwiYmFzZSIsIFhGQV9FTEVNRU5UX0Jhc2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhiMGU1NDg1ZCwgTCJiaW5kIiwgWEZBX0VMRU1FTlRfQmluZCwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiNDVkNjFiMiwgTCJjb21wcmVzc2lvbiIsIFhGQV9FTEVNRU5UX0NvbXByZXNzaW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiNTYzZjBmZiwgTCJ1c2VyIiwgWEZBX0VMRU1FTlRfVXNlciwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweGI1ODQ4YWQ1LCBMInJlY3RhbmdsZSIsIFhGQV9FTEVNRU5UX1JlY3RhbmdsZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiNmRhY2I3MiwgTCJlZmZlY3RpdmVPdXRwdXRQb2xpY3kiLCBYRkFfRUxFTUVOVF9FZmZlY3RpdmVPdXRwdXRQb2xpY3ksDQorICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiN2Q3NjU0ZCwgTCJBREJFX0pTRGVidWdnZXIiLCBYRkFfRUxFTUVOVF9BREJFX0pTRGVidWdnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhiYWIzN2Y3MywgTCJhY3JvYmF0NyIsIFhGQV9FTEVNRU5UX0Fjcm9iYXQ3LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiYzcwMDgxZSwgTCJpbnRlcmFjdGl2ZSIsIFhGQV9FTEVNRU5UX0ludGVyYWN0aXZlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YmM4ZmEzNTAsIEwibG9jYWxlIiwgWEZBX0VMRU1FTlRfTG9jYWxlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGJjZDQ0OTQwLCBMImN1cnJlbnRQYWdlIiwgWEZBX0VMRU1FTlRfQ3VycmVudFBhZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhiZGU5YWJkYSwgTCJkYXRhIiwgWEZBX0VMRU1FTlRfRGF0YSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YmRlOWFiZGUsIEwiZGF0ZSIsIFhGQV9FTEVNRU5UX0RhdGUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCBYRkFfRUxFTUVOVF9EZXNjLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGJmNGI2NDA1LCBMImVuY3J5cHQiLCBYRkFfRUxFTUVOVF9FbmNyeXB0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhiZmE4N2NjZSwgTCJkcmF3IiwgWEZBX0VMRU1FTlRfRHJhdywNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KKyAgICB7MHhjMTgxZmY0YiwgTCJlbmNyeXB0aW9uIiwgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YzE5NzBmNDAsIEwibWVyaWRpZW1OYW1lcyIsIFhGQV9FTEVNRU5UX01lcmlkaWVtTmFtZXMsDQorICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGM1YWQ5ZjVlLCBMIm1lc3NhZ2luZyIsIFhGQV9FTEVNRU5UX01lc3NhZ2luZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YzY5NTQ5ZjQsIEwic3BlYWsiLCBYRkFfRUxFTUVOVF9TcGVhaywNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4Yzc3NDNkYzcsIEwiZGF0YUdyb3VwIiwgWEZBX0VMRU1FTlRfRGF0YUdyb3VwLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGM3ZWIyMGU5LCBMImNvbW1vbiIsIFhGQV9FTEVNRU5UX0NvbW1vbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Yzg1ZDQ1MjgsIEwiI3RleHQiLCBYRkFfRUxFTUVOVF9TaGFycHRleHQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCB8DQorICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfA0KKyAgICAgICAgIFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4Yzg2MTU1NmEsIEwicGFnaW5hdGlvbk92ZXJyaWRlIiwgWEZBX0VMRU1FTlRfUGFnaW5hdGlvbk92ZXJyaWRlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YzkwM2RhYmIsIEwicmVhc29ucyIsIFhGQV9FTEVNRU5UX1JlYXNvbnMsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YzlhODEyN2YsIEwic2lnbmF0dXJlUHJvcGVydGllcyIsIFhGQV9FTEVNRU5UX1NpZ25hdHVyZVByb3BlcnRpZXMsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Y2EwMTBjMmQsIEwidGhyZXNob2xkIiwgWEZBX0VMRU1FTlRfVGhyZXNob2xkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4Y2I0YzVlOTYsIEwiYXBwZWFyYW5jZUZpbHRlciIsIFhGQV9FTEVNRU5UX0FwcGVhcmFuY2VGaWx0ZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlQ30sDQorICAgIHsweGNjOTJhYmE3LCBMImZpbGwiLCBYRkFfRUxFTUVOVF9GaWxsLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGNkMzA4Yjc3LCBMImZvbnQiLCBYRkFfRUxFTUVOVF9Gb250LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGNkMzA5ZmY0LCBMImZvcm0iLCBYRkFfRUxFTUVOVF9Gb3JtLCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGV9LA0KKyAgICB7MHhjZWJjY2EyZCwgTCJtZWRpdW1JbmZvIiwgWEZBX0VMRU1FTlRfTWVkaXVtSW5mbywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Y2ZlMGQ2NDMsIEwiY2VydGlmaWNhdGUiLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4ZDAxMmMwMzMsIEwicGFzc3dvcmQiLCBYRkFfRUxFTUVOVF9QYXNzd29yZCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweGQwMTYwNGJkLCBMInJ1blNjcmlwdHMiLCBYRkFfRUxFTUVOVF9SdW5TY3JpcHRzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZDEyMjdlNmYsIEwidHJhY2UiLCBYRkFfRUxFTUVOVF9UcmFjZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZDE1MzI4NzYsIEwiZmxvYXQiLCBYRkFfRUxFTUVOVF9GbG9hdCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZDE3YTZjMzAsIEwicmVuZGVyUG9saWN5IiwgWEZBX0VMRU1FTlRfUmVuZGVyUG9saWN5LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZDRiZjY4MjMsIEwibG9nUHNldWRvTW9kZWwiLCBYRkFfRUxFTUVOVF9Mb2dQc2V1ZG9Nb2RlbCwNCisgICAgIFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdH0sDQorICAgIHsweGQ1OGFhOTYyLCBMImRlc3RpbmF0aW9uIiwgWEZBX0VMRU1FTlRfRGVzdGluYXRpb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIFhGQV9FTEVNRU5UX1ZhbHVlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGQ3YTE0NDYyLCBMImJvb2tlbmQiLCBYRkFfRUxFTUVOVF9Cb29rZW5kLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGQ4YzMxMjU0LCBMImV4T2JqZWN0IiwgWEZBX0VMRU1FTlRfRXhPYmplY3QsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZGE2YTg1OTAsIEwib3BlbkFjdGlvbiIsIFhGQV9FTEVNRU5UX09wZW5BY3Rpb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGRhYjRmYjdkLCBMIm5ldmVyRW1iZWQiLCBYRkFfRUxFTUVOVF9OZXZlckVtYmVkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4ZGI5ODQ3NWYsIEwiYmluZEl0ZW1zIiwgWEZBX0VMRU1FTlRfQmluZEl0ZW1zLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGRiZmJlMDJlLCBMImNhbGN1bGF0ZSIsIFhGQV9FTEVNRU5UX0NhbGN1bGF0ZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhkZDc2NzZlZCwgTCJwcmludCIsIFhGQV9FTEVNRU5UX1ByaW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZGRlMjczZDcsIEwiZXh0cmFzIiwgWEZBX0VMRU1FTlRfRXh0cmFzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGRlMTQ2YjM0LCBMInByb3RvIiwgWEZBX0VMRU1FTlRfUHJvdG8sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZGYwNTkzMjEsIEwiZFNpZ0RhdGEiLCBYRkFfRUxFTUVOVF9EU2lnRGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhkZmNjZjAzMCwgTCJjcmVhdG9yIiwgWEZBX0VMRU1FTlRfQ3JlYXRvciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGRmZjc4YzZhLCBMImNvbm5lY3QiLCBYRkFfRUxFTUVOVF9Db25uZWN0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGUxMWEyY2JjLCBMInBlcm1pc3Npb25zIiwgWEZBX0VMRU1FTlRfUGVybWlzc2lvbnMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGUxNGM4MDFjLCBMImNvbm5lY3Rpb25TZXQiLCBYRkFfRUxFTUVOVF9Db25uZWN0aW9uU2V0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGV9LA0KKyAgICB7MHhlMWM4M2ExNCwgTCJzdWJtaXQiLCBYRkFfRUxFTUVOVF9TdWJtaXQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZTI5ODIxY2QsIEwicmFuZ2UiLCBYRkFfRUxFTUVOVF9SYW5nZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGUzOGQ4M2M3LCBMImxpbmVhcml6ZWQiLCBYRkFfRUxFTUVOVF9MaW5lYXJpemVkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZTNhYTI1NzgsIEwicGFja2V0IiwgWEZBX0VMRU1FTlRfUGFja2V0LCBYRkFfWERQUEFDS0VUX1hEUCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVDfSwNCisgICAgezB4ZTNhYTg2MGUsIEwicm9vdEVsZW1lbnQiLCBYRkFfRUxFTUVOVF9Sb290RWxlbWVudCwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHhlM2U1NTNmYSwgTCJwbGFpbnRleHRNZXRhZGF0YSIsIFhGQV9FTEVNRU5UX1BsYWludGV4dE1ldGFkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZTNlNmU0ZjIsIEwibnVtYmVyU3ltYm9scyIsIFhGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsDQorICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGUzZjA2N2Y2LCBMInByaW50SGlnaFF1YWxpdHkiLCBYRkFfRUxFTUVOVF9QcmludEhpZ2hRdWFsaXR5LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZTNmZDA3OGMsIEwiZHJpdmVyIiwgWEZBX0VMRU1FTlRfRHJpdmVyLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhlNDhiMzRmMiwgTCJpbmNyZW1lbnRhbExvYWQiLCBYRkFfRUxFTUVOVF9JbmNyZW1lbnRhbExvYWQsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHhlNTUwZTdjMiwgTCJzdWJqZWN0RE4iLCBYRkFfRUxFTUVOVF9TdWJqZWN0RE4sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlQ30sDQorICAgIHsweGU2NjY5YTc4LCBMImNvbXByZXNzTG9naWNhbFN0cnVjdHVyZSIsDQorICAgICBYRkFfRUxFTUVOVF9Db21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhlN2E3ZWEwMiwgTCJpbmNyZW1lbnRhbE1lcmdlIiwgWEZBX0VMRU1FTlRfSW5jcmVtZW50YWxNZXJnZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGU5NDg1MzBkLCBMInJhZGlhbCIsIFhGQV9FTEVNRU5UX1JhZGlhbCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhlYThkNjk5OSwgTCJ2YXJpYWJsZXMiLCBYRkFfRUxFTUVOVF9WYXJpYWJsZXMsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCisgICAgezB4ZWFhMTQyYzAsIEwidGltZVBhdHRlcm5zIiwgWEZBX0VMRU1FTlRfVGltZVBhdHRlcm5zLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhlYjk0M2E3MSwgTCJlZmZlY3RpdmVJbnB1dFBvbGljeSIsIFhGQV9FTEVNRU5UX0VmZmVjdGl2ZUlucHV0UG9saWN5LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZWYwNGEyYmMsIEwibmFtZUF0dHIiLCBYRkFfRUxFTUVOVF9OYW1lQXR0ciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGYwNzIyMmFiLCBMImNvbmZvcm1hbmNlIiwgWEZBX0VMRU1FTlRfQ29uZm9ybWFuY2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhmMGFhYWFkYywgTCJ0cmFuc2Zvcm0iLCBYRkFfRUxFTUVOVF9UcmFuc2Zvcm0sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGYxNDMzZTg4LCBMImxvY2tEb2N1bWVudCIsIFhGQV9FTEVNRU5UX0xvY2tEb2N1bWVudCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZjU0ZWI5OTcsIEwiYnJlYWtBZnRlciIsIFhGQV9FTEVNRU5UX0JyZWFrQWZ0ZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZjYxNmRhMjgsIEwibGluZSIsIFhGQV9FTEVNRU5UX0xpbmUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZjYxNmYzZGMsIEwibGlzdCIsIFhGQV9FTEVNRU5UX0xpc3QsIFhGQV9YRFBQQUNLRVRfWERQLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlMaXN0fSwNCisgICAgezB4ZjcwNTVmYjEsIEwic291cmNlIiwgWEZBX0VMRU1FTlRfU291cmNlLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhmN2VlYmUxYywgTCJvY2N1ciIsIFhGQV9FTEVNRU5UX09jY3VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGY4ZDEwZDk3LCBMInBpY2tUcmF5QnlQREZTaXplIiwgWEZBX0VMRU1FTlRfUGlja1RyYXlCeVBERlNpemUsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhmOGYxOWUzYSwgTCJtb250aE5hbWVzIiwgWEZBX0VMRU1FTlRfTW9udGhOYW1lcywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Zjk4NDE0OWIsIEwic2V2ZXJpdHkiLCBYRkFfRUxFTUVOVF9TZXZlcml0eSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGY5YmNiMDM3LCBMImdyb3VwUGFyZW50IiwgWEZBX0VMRU1FTlRfR3JvdXBQYXJlbnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHhmYmM0MmZmZiwgTCJkb2N1bWVudEFzc2VtYmx5IiwgWEZBX0VMRU1FTlRfRG9jdW1lbnRBc3NlbWJseSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGZjNzgxNTlmLCBMIm51bWJlclN5bWJvbCIsIFhGQV9FTEVNRU5UX051bWJlclN5bWJvbCwNCisgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGZjYmQ2MDZjLCBMInRhZ2dlZCIsIFhGQV9FTEVNRU5UX1RhZ2dlZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGZmMDYzODAyLCBMIml0ZW1zIiwgWEZBX0VMRU1FTlRfSXRlbXMsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCiB9Ow0KLWV4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQUVsZW1lbnRDb3VudCA9IHNpemVvZihnX1hGQUVsZW1lbnREYXRhKSAvIHNpemVvZihYRkFfRUxFTUVOVElORk8pOw0KK2V4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQUVsZW1lbnRDb3VudCA9DQorICAgIHNpemVvZihnX1hGQUVsZW1lbnREYXRhKSAvIHNpemVvZihYRkFfRUxFTUVOVElORk8pOw0KIGV4dGVybiBjb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSBnX1hGQUVsZW1lbnRQcm9wZXJ0eUluZGV4W10gPSB7DQotICAgIHswLCA4fSwJezgsIDB9LAl7OCwgMTR9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDZ9LAl7MjgsIDB9LAl7MjgsIDB9LAl7MjgsIDF9LAl7MjksIDN9LAl7MzIsIDB9LAl7MzIsIDB9LAl7MzIsIDB9LAl7MzIsIDN9LAl7MzUsIDF9LAl7MzYsIDB9LAl7MzYsIDB9LAl7MzYsIDJ9LAl7MzgsIDB9LAl7MzgsIDB9LA0KLSAgICB7MzgsIDB9LAl7MzgsIDR9LAl7NDIsIDB9LAl7NDIsIDB9LAl7NDIsIDF9LAl7NDMsIDB9LAl7NDMsIDh9LAl7NTEsIDE5fSwJezcwLCAwfSwJezcwLCAwfSwJezcwLCAyfSwJezcyLCAxfSwJezczLCAwfSwJezczLCAyfSwJezc1LCA0fSwJezc5LCAxfSwJezgwLCAxfSwJezgxLCAwfSwJezgxLCAwfSwJezgxLCAzfSwNCi0gICAgezg0LCAwfSwJezg0LCA0fSwJezg4LCA0fSwJezkyLCAxfSwJezkzLCAwfSwJezkzLCA0fSwJezk3LCA5fSwJezEwNiwgMTR9LAl7MTIwLCAwfSwJezEyMCwgMH0sCXsxMjAsIDV9LAl7MTI1LCAwfSwJezEyNSwgMX0sCXsxMjYsIDB9LAl7MTI2LCAwfSwJezEyNiwgMH0sCXsxMjYsIDB9LAl7MTI2LCAwfSwJezEyNiwgMX0sCXsxMjcsIDB9LA0KLSAgICB7MTI3LCAwfSwJezEyNywgMH0sCXsxMjcsIDB9LAl7MTI3LCAwfSwJezEyNywgMH0sCXsxMjcsIDB9LAl7MTI3LCA2fSwJezEzMywgMX0sCXsxMzQsIDB9LAl7MTM0LCAxfSwJezEzNSwgMH0sCXsxMzUsIDB9LAl7MTM1LCAxfSwJezEzNiwgMn0sCXsxMzgsIDV9LAl7MTQzLCAyfSwJezE0NSwgMH0sCXsxNDUsIDB9LAl7MTQ1LCAwfSwJezE0NSwgMH0sDQotICAgIHsxNDUsIDB9LAl7MTQ1LCA1fSwJezE1MCwgMH0sCXsxNTAsIDB9LAl7MTUwLCAwfSwJezE1MCwgMH0sCXsxNTAsIDB9LAl7MTUwLCAwfSwJezE1MCwgMH0sCXsxNTAsIDJ9LAl7MTUyLCAwfSwJezE1MiwgMH0sCXsxNTIsIDB9LAl7MTUyLCAxN30sCXsxNjksIDB9LAl7MTY5LCAxfSwJezE3MCwgMH0sCXsxNzAsIDB9LAl7MTcwLCAyfSwJezE3MiwgMH0sDQotICAgIHsxNzIsIDB9LAl7MTcyLCAxfSwJezE3MywgMH0sCXsxNzMsIDB9LAl7MTczLCAyfSwJezE3NSwgMn0sCXsxNzcsIDB9LAl7MTc3LCAwfSwJezE3NywgMH0sCXsxNzcsIDExfSwJezE4OCwgMH0sCXsxODgsIDB9LAl7MTg4LCAwfSwJezE4OCwgMH0sCXsxODgsIDB9LAl7MTg4LCA0fSwJezE5MiwgM30sCXsxOTUsIDB9LAl7MTk1LCAwfSwJezE5NSwgMH0sDQotICAgIHsxOTUsIDB9LAl7MTk1LCAwfSwJezE5NSwgMH0sCXsxOTUsIDl9LAl7MjA0LCAwfSwJezIwNCwgMH0sCXsyMDQsIDE3fSwJezIyMSwgMH0sCXsyMjEsIDB9LAl7MjIxLCAwfSwJezIyMSwgMH0sCXsyMjEsIDB9LAl7MjIxLCAwfSwJezIyMSwgMH0sCXsyMjEsIDB9LAl7MjIxLCAwfSwJezIyMSwgNH0sCXsyMjUsIDB9LAl7MjI1LCAwfSwJezIyNSwgMH0sDQotICAgIHsyMjUsIDB9LAl7MjI1LCAyfSwJezIyNywgM30sCXsyMzAsIDB9LAl7MjMwLCAwfSwJezIzMCwgMn0sCXsyMzIsIDB9LAl7MjMyLCAxfSwJezIzMywgMn0sCXsyMzUsIDJ9LAl7MjM3LCAwfSwJezIzNywgMH0sCXsyMzcsIDJ9LAl7MjM5LCAwfSwJezIzOSwgMX0sCXsyNDAsIDF9LAl7MjQxLCAyfSwJezI0MywgMH0sCXsyNDMsIDN9LAl7MjQ2LCA0fSwNCi0gICAgezI1MCwgMH0sCXsyNTAsIDF9LAl7MjUxLCAyfSwJezI1MywgMH0sCXsyNTMsIDB9LAl7MjUzLCAwfSwJezI1MywgMH0sCXsyNTMsIDB9LAl7MjUzLCAwfSwJezI1MywgMH0sCXsyNTMsIDB9LAl7MjUzLCAwfSwJezI1MywgMH0sCXsyNTMsIDJ9LAl7MjU1LCAyfSwJezI1NywgMH0sCXsyNTcsIDZ9LAl7MjYzLCA1fSwJezI2OCwgMH0sCXsyNjgsIDB9LA0KLSAgICB7MjY4LCAwfSwJezI2OCwgM30sCXsyNzEsIDB9LAl7MjcxLCAwfSwJezI3MSwgM30sCXsyNzQsIDR9LAl7Mjc4LCAwfSwJezI3OCwgMH0sCXsyNzgsIDR9LAl7MjgyLCAwfSwJezI4MiwgMH0sCXsyODIsIDV9LAl7Mjg3LCAwfSwJezI4NywgNX0sCXsyOTIsIDB9LAl7MjkyLCAwfSwJezI5MiwgMH0sCXsyOTIsIDF9LAl7MjkzLCAwfSwJezI5MywgMH0sDQotICAgIHsyOTMsIDF9LAl7Mjk0LCAwfSwJezI5NCwgMn0sCXsyOTYsIDB9LAl7Mjk2LCAwfSwJezI5NiwgMH0sCXsyOTYsIDB9LAl7Mjk2LCAxfSwJezI5NywgMH0sCXsyOTcsIDB9LAl7Mjk3LCA0fSwJezMwMSwgMH0sCXszMDEsIDB9LAl7MzAxLCAwfSwJezMwMSwgMH0sCXszMDEsIDB9LAl7MzAxLCAwfSwJezMwMSwgMX0sCXszMDIsIDB9LAl7MzAyLCAyfSwNCi0gICAgezMwNCwgMH0sCXszMDQsIDB9LAl7MzA0LCAwfSwJezMwNCwgMH0sCXszMDQsIDF9LAl7MzA1LCA0fSwJezMwOSwgMH0sCXszMDksIDN9LAl7MzEyLCAwfSwJezMxMiwgMH0sCXszMTIsIDF9LAl7MzEzLCAwfSwJezMxMywgOH0sCXszMjEsIDB9LAl7MzIxLCAxMH0sCXszMzEsIDB9LAl7MzMxLCAxMH0sCXszNDEsIDF9LAl7MzQyLCAxMn0sCXszNTQsIDN9LA0KLSAgICB7MzU3LCAxfSwJezM1OCwgMH0sCXszNTgsIDB9LAl7MzU4LCAwfSwJezM1OCwgOH0sCXszNjYsIDB9LAl7MzY2LCAwfSwJezM2NiwgMH0sCXszNjYsIDB9LAl7MzY2LCAwfSwJezM2NiwgMH0sCXszNjYsIDd9LAl7MzczLCAyfSwJezM3NSwgMH0sCXszNzUsIDF9LAl7Mzc2LCAwfSwJezM3NiwgMH0sCXszNzYsIDB9LAl7Mzc2LCAwfSwJezM3NiwgMH0sDQotICAgIHszNzYsIDB9LAl7Mzc2LCAwfSwJezM3NiwgMH0sCXszNzYsIDEzfSwJezM4OSwgMH0sCXszODksIDF9LAl7MzkwLCAxfSwJezM5MSwgMH0sCXszOTEsIDB9LAl7MzkxLCAzfSwJezM5NCwgMH0sCXszOTQsIDB9LAl7Mzk0LCAwfSwJezM5NCwgMH0sCXszOTQsIDB9LAl7Mzk0LCA0fSwJezM5OCwgOX0sCXs0MDcsIDB9LAl7NDA3LCAxfSwJezQwOCwgMH0sDQotICAgIHs0MDgsIDB9LAl7NDA4LCAwfSwJezQwOCwgMH0sCXs0MDgsIDB9LAl7NDA4LCAxfSwJezQwOSwgMH0sCXs0MDksIDJ9LAl7NDExLCAwfSwJezQxMSwgMH0sCXs0MTEsIDB9LAl7NDExLCAwfSwJezQxMSwgMn0sCXs0MTMsIDB9LAl7NDEzLCAxfSwJezQxNCwgMH0sCXs0MTQsIDB9LAl7NDE0LCAwfSwJezQxNCwgN30sCXs0MjEsIDB9LAl7NDIxLCAxfSwNCi0gICAgezQyMiwgMX0sCXs0MjMsIDB9LAl7NDIzLCAxfSwJezQyNCwgMX0sCXs0MjUsIDB9LAl7NDI1LCAxfSwJezQyNiwgMH0sCXs0MjYsIDB9LAl7NDI2LCAwfSwJezQyNiwgMH0sCXs0MjYsIDB9LAl7NDI2LCAwfSwNCisgICAgezAsIDh9LCAgICB7OCwgMH0sICAgezgsIDE0fSwgICB7MjIsIDB9LCAgIHsyMiwgMH0sICAgezIyLCA2fSwgICB7MjgsIDB9LA0KKyAgICB7MjgsIDB9LCAgIHsyOCwgMX0sICB7MjksIDN9LCAgIHszMiwgMH0sICAgezMyLCAwfSwgICB7MzIsIDB9LCAgIHszMiwgM30sDQorICAgIHszNSwgMX0sICAgezM2LCAwfSwgIHszNiwgMH0sICAgezM2LCAyfSwgICB7MzgsIDB9LCAgIHszOCwgMH0sICAgezM4LCAwfSwNCisgICAgezM4LCA0fSwgICB7NDIsIDB9LCAgezQyLCAwfSwgICB7NDIsIDF9LCAgIHs0MywgMH0sICAgezQzLCA4fSwgICB7NTEsIDE5fSwNCisgICAgezcwLCAwfSwgICB7NzAsIDB9LCAgezcwLCAyfSwgICB7NzIsIDF9LCAgIHs3MywgMH0sICAgezczLCAyfSwgICB7NzUsIDR9LA0KKyAgICB7NzksIDF9LCAgIHs4MCwgMX0sICB7ODEsIDB9LCAgIHs4MSwgMH0sICAgezgxLCAzfSwgICB7ODQsIDB9LCAgIHs4NCwgNH0sDQorICAgIHs4OCwgNH0sICAgezkyLCAxfSwgIHs5MywgMH0sICAgezkzLCA0fSwgICB7OTcsIDl9LCAgIHsxMDYsIDE0fSwgezEyMCwgMH0sDQorICAgIHsxMjAsIDB9LCAgezEyMCwgNX0sIHsxMjUsIDB9LCAgezEyNSwgMX0sICB7MTI2LCAwfSwgIHsxMjYsIDB9LCAgezEyNiwgMH0sDQorICAgIHsxMjYsIDB9LCAgezEyNiwgMH0sIHsxMjYsIDF9LCAgezEyNywgMH0sICB7MTI3LCAwfSwgIHsxMjcsIDB9LCAgezEyNywgMH0sDQorICAgIHsxMjcsIDB9LCAgezEyNywgMH0sIHsxMjcsIDB9LCAgezEyNywgNn0sICB7MTMzLCAxfSwgIHsxMzQsIDB9LCAgezEzNCwgMX0sDQorICAgIHsxMzUsIDB9LCAgezEzNSwgMH0sIHsxMzUsIDF9LCAgezEzNiwgMn0sICB7MTM4LCA1fSwgIHsxNDMsIDJ9LCAgezE0NSwgMH0sDQorICAgIHsxNDUsIDB9LCAgezE0NSwgMH0sIHsxNDUsIDB9LCAgezE0NSwgMH0sICB7MTQ1LCA1fSwgIHsxNTAsIDB9LCAgezE1MCwgMH0sDQorICAgIHsxNTAsIDB9LCAgezE1MCwgMH0sIHsxNTAsIDB9LCAgezE1MCwgMH0sICB7MTUwLCAwfSwgIHsxNTAsIDJ9LCAgezE1MiwgMH0sDQorICAgIHsxNTIsIDB9LCAgezE1MiwgMH0sIHsxNTIsIDE3fSwgezE2OSwgMH0sICB7MTY5LCAxfSwgIHsxNzAsIDB9LCAgezE3MCwgMH0sDQorICAgIHsxNzAsIDJ9LCAgezE3MiwgMH0sIHsxNzIsIDB9LCAgezE3MiwgMX0sICB7MTczLCAwfSwgIHsxNzMsIDB9LCAgezE3MywgMn0sDQorICAgIHsxNzUsIDJ9LCAgezE3NywgMH0sIHsxNzcsIDB9LCAgezE3NywgMH0sICB7MTc3LCAxMX0sIHsxODgsIDB9LCAgezE4OCwgMH0sDQorICAgIHsxODgsIDB9LCAgezE4OCwgMH0sIHsxODgsIDB9LCAgezE4OCwgNH0sICB7MTkyLCAzfSwgIHsxOTUsIDB9LCAgezE5NSwgMH0sDQorICAgIHsxOTUsIDB9LCAgezE5NSwgMH0sIHsxOTUsIDB9LCAgezE5NSwgMH0sICB7MTk1LCA5fSwgIHsyMDQsIDB9LCAgezIwNCwgMH0sDQorICAgIHsyMDQsIDE3fSwgezIyMSwgMH0sIHsyMjEsIDB9LCAgezIyMSwgMH0sICB7MjIxLCAwfSwgIHsyMjEsIDB9LCAgezIyMSwgMH0sDQorICAgIHsyMjEsIDB9LCAgezIyMSwgMH0sIHsyMjEsIDB9LCAgezIyMSwgNH0sICB7MjI1LCAwfSwgIHsyMjUsIDB9LCAgezIyNSwgMH0sDQorICAgIHsyMjUsIDB9LCAgezIyNSwgMn0sIHsyMjcsIDN9LCAgezIzMCwgMH0sICB7MjMwLCAwfSwgIHsyMzAsIDJ9LCAgezIzMiwgMH0sDQorICAgIHsyMzIsIDF9LCAgezIzMywgMn0sIHsyMzUsIDJ9LCAgezIzNywgMH0sICB7MjM3LCAwfSwgIHsyMzcsIDJ9LCAgezIzOSwgMH0sDQorICAgIHsyMzksIDF9LCAgezI0MCwgMX0sIHsyNDEsIDJ9LCAgezI0MywgMH0sICB7MjQzLCAzfSwgIHsyNDYsIDR9LCAgezI1MCwgMH0sDQorICAgIHsyNTAsIDF9LCAgezI1MSwgMn0sIHsyNTMsIDB9LCAgezI1MywgMH0sICB7MjUzLCAwfSwgIHsyNTMsIDB9LCAgezI1MywgMH0sDQorICAgIHsyNTMsIDB9LCAgezI1MywgMH0sIHsyNTMsIDB9LCAgezI1MywgMH0sICB7MjUzLCAwfSwgIHsyNTMsIDJ9LCAgezI1NSwgMn0sDQorICAgIHsyNTcsIDB9LCAgezI1NywgNn0sIHsyNjMsIDV9LCAgezI2OCwgMH0sICB7MjY4LCAwfSwgIHsyNjgsIDB9LCAgezI2OCwgM30sDQorICAgIHsyNzEsIDB9LCAgezI3MSwgMH0sIHsyNzEsIDN9LCAgezI3NCwgNH0sICB7Mjc4LCAwfSwgIHsyNzgsIDB9LCAgezI3OCwgNH0sDQorICAgIHsyODIsIDB9LCAgezI4MiwgMH0sIHsyODIsIDV9LCAgezI4NywgMH0sICB7Mjg3LCA1fSwgIHsyOTIsIDB9LCAgezI5MiwgMH0sDQorICAgIHsyOTIsIDB9LCAgezI5MiwgMX0sIHsyOTMsIDB9LCAgezI5MywgMH0sICB7MjkzLCAxfSwgIHsyOTQsIDB9LCAgezI5NCwgMn0sDQorICAgIHsyOTYsIDB9LCAgezI5NiwgMH0sIHsyOTYsIDB9LCAgezI5NiwgMH0sICB7Mjk2LCAxfSwgIHsyOTcsIDB9LCAgezI5NywgMH0sDQorICAgIHsyOTcsIDR9LCAgezMwMSwgMH0sIHszMDEsIDB9LCAgezMwMSwgMH0sICB7MzAxLCAwfSwgIHszMDEsIDB9LCAgezMwMSwgMH0sDQorICAgIHszMDEsIDF9LCAgezMwMiwgMH0sIHszMDIsIDJ9LCAgezMwNCwgMH0sICB7MzA0LCAwfSwgIHszMDQsIDB9LCAgezMwNCwgMH0sDQorICAgIHszMDQsIDF9LCAgezMwNSwgNH0sIHszMDksIDB9LCAgezMwOSwgM30sICB7MzEyLCAwfSwgIHszMTIsIDB9LCAgezMxMiwgMX0sDQorICAgIHszMTMsIDB9LCAgezMxMywgOH0sIHszMjEsIDB9LCAgezMyMSwgMTB9LCB7MzMxLCAwfSwgIHszMzEsIDEwfSwgezM0MSwgMX0sDQorICAgIHszNDIsIDEyfSwgezM1NCwgM30sIHszNTcsIDF9LCAgezM1OCwgMH0sICB7MzU4LCAwfSwgIHszNTgsIDB9LCAgezM1OCwgOH0sDQorICAgIHszNjYsIDB9LCAgezM2NiwgMH0sIHszNjYsIDB9LCAgezM2NiwgMH0sICB7MzY2LCAwfSwgIHszNjYsIDB9LCAgezM2NiwgN30sDQorICAgIHszNzMsIDJ9LCAgezM3NSwgMH0sIHszNzUsIDF9LCAgezM3NiwgMH0sICB7Mzc2LCAwfSwgIHszNzYsIDB9LCAgezM3NiwgMH0sDQorICAgIHszNzYsIDB9LCAgezM3NiwgMH0sIHszNzYsIDB9LCAgezM3NiwgMH0sICB7Mzc2LCAxM30sIHszODksIDB9LCAgezM4OSwgMX0sDQorICAgIHszOTAsIDF9LCAgezM5MSwgMH0sIHszOTEsIDB9LCAgezM5MSwgM30sICB7Mzk0LCAwfSwgIHszOTQsIDB9LCAgezM5NCwgMH0sDQorICAgIHszOTQsIDB9LCAgezM5NCwgMH0sIHszOTQsIDR9LCAgezM5OCwgOX0sICB7NDA3LCAwfSwgIHs0MDcsIDF9LCAgezQwOCwgMH0sDQorICAgIHs0MDgsIDB9LCAgezQwOCwgMH0sIHs0MDgsIDB9LCAgezQwOCwgMH0sICB7NDA4LCAxfSwgIHs0MDksIDB9LCAgezQwOSwgMn0sDQorICAgIHs0MTEsIDB9LCAgezQxMSwgMH0sIHs0MTEsIDB9LCAgezQxMSwgMH0sICB7NDExLCAyfSwgIHs0MTMsIDB9LCAgezQxMywgMX0sDQorICAgIHs0MTQsIDB9LCAgezQxNCwgMH0sIHs0MTQsIDB9LCAgezQxNCwgN30sICB7NDIxLCAwfSwgIHs0MjEsIDF9LCAgezQyMiwgMX0sDQorICAgIHs0MjMsIDB9LCAgezQyMywgMX0sIHs0MjQsIDF9LCAgezQyNSwgMH0sICB7NDI1LCAxfSwgIHs0MjYsIDB9LCAgezQyNiwgMH0sDQorICAgIHs0MjYsIDB9LCAgezQyNiwgMH0sIHs0MjYsIDB9LCAgezQyNiwgMH0sDQogfTsNCiBleHRlcm4gY29uc3QgWEZBX1BST1BFUlRZIGdfWEZBRWxlbWVudFByb3BlcnR5RGF0YVtdID0gew0KLSAgICB7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LAl7WEZBX0VMRU1FTlRfSm9nLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1hkYywgMSwgMH0sCXtYRkFfRUxFTUVOVF9CYXRjaE91dHB1dCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9PdXRwdXRCaW4sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29tcHJlc3MsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU3RhcGxlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01lZGl1bUluZm8sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQotICAgIHtYRkFfRUxFTUVOVF9EZWZhdWx0VWksIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfQmFyY29kZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9CdXR0b24sIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX1BpY3R1cmUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfSW1hZ2VFZGl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9TaWduYXR1cmUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfVGV4dEVkaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KLSAgICB7WEZBX0VMRU1FTlRfRXhPYmplY3QsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JyZWFrLCAxLCAwfSwJe1hGQV9FTEVNRU5UX092ZXJmbG93LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQm9va2VuZCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfT2NjdXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1N1YnNldEJlbG93LCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX01hcCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FbWJlZCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9EYXRlUGF0dGVybiwgNCwgMH0sCXtYRkFfRUxFTUVOVF9FZGdlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ZpbGwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVG8sIDEsIDB9LAl7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX01vZGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVGhyZXNob2xkLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1NjcmlwdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Gb250SW5mbywgMSwgMH0sCXtYRkFfRUxFTUVOVF9Kb2csIDEsIDB9LAl7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BhZ2VPZmZzZXQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfT3V0cHV0QmluLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1N0YXBsZSwgMSwgMH0sDQotICAgIHtYRkFfRUxFTUVOVF9NZWRpdW1JbmZvLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Fkb2JlRXh0ZW5zaW9uTGV2ZWwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LAl7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BkZmEsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVmlld2VyUHJlZmVyZW5jZXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU2NyaXB0TW9kZWwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVmVyc2lvbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TdWJtaXRGb3JtYXQsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfU2lsZW50UHJpbnQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUHJvZHVjZXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29tcHJlc3Npb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfSW50ZXJhY3RpdmUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRW5jcnlwdGlvbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9SZW5kZXJQb2xpY3ksIDEsIDB9LAl7WEZBX0VMRU1FTlRfT3BlbkFjdGlvbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9DcmVhdG9yLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0xpbmVhcml6ZWQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVGFnZ2VkLCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX1VyaSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Yc2wsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGFja2V0cywgMSwgMH0sCXtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LAl7WEZBX0VMRU1FTlRfRGVidWcsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LAl7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ZsaXBMYWJlbCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9UZW1wbGF0ZUNhY2hlLCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9Gb250SW5mbywgMSwgMH0sCXtYRkFfRUxFTUVOVF9YZGMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRmxpcExhYmVsLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0VyYU5hbWVzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0RheU5hbWVzLCAyLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX01lcmlkaWVtTmFtZXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTW9udGhOYW1lcywgMiwgMH0sCXtYRkFfRUxFTUVOVF9IeXBoZW5hdGlvbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9BbWQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGFydCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9JbmNsdWRlWERQQ29udGVudCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db25mb3JtYW5jZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9NZHAsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1RpbWVTdGFtcCwgMSwgMH0sDQotICAgIHtYRkFfRUxFTUVOVF9IYW5kbGVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZHMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRW5jb2RpbmdzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1JlYXNvbnMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQXBwZWFyYW5jZUZpbHRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Mb2NrRG9jdW1lbnQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfWGRwLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NhY2hlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BhZ2luYXRpb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfT3ZlcnByaW50LCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX0JlaGF2aW9yT3ZlcnJpZGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29waWVzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX091dHB1dCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9WYWxpZGF0ZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9MYXlvdXQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU2NyaXB0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NvbW1vbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QYWdpbmF0aW9uT3ZlcnJpZGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRGVzdGluYXRpb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfSW5jcmVtZW50YWxNZXJnZSwgMSwgMH0sDQotICAgIHtYRkFfRUxFTUVOVF9FeGVjdXRlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX1NjcmlwdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9TaWduRGF0YSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU3VibWl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbCwgMywgMH0sCXtYRkFfRUxFTUVOVF9PcGVyYXRpb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfV3NkbEFkZHJlc3MsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU29hcEFkZHJlc3MsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfU29hcEFjdGlvbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FZmZlY3RpdmVPdXRwdXRQb2xpY3ksIDEsIDB9LAl7WEZBX0VMRU1FTlRfRWZmZWN0aXZlSW5wdXRQb2xpY3ksIDEsIDB9LAl7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0VyYSwgMiwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGljdHVyZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0VkZ2UsIDQsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfQ29ybmVyLCA0LCAwfSwJe1hGQV9FTEVNRU5UX0ZpbGwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0tleVVzYWdlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1N1YmplY3RETnMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfSXNzdWVycywgMSwgMH0sCXtYRkFfRUxFTUVOVF9TaWduaW5nLCAxLCAwfSwJe1hGQV9FTEVNRU5UX09pZHMsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfQ29sb3IsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1VpLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QYXJhLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Zvcm1hdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQXNzaXN0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1RyYXZlcnNhbCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9LZWVwLCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX1ZhbGlkYXRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NhcHRpb24sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQmluZCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9EZXNjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ZvbnQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVmFsdWUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ2FsY3VsYXRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9JdGVtcywgMiwgMH0sCXtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfRGVzYywgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NvbG9yLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db2xvciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BhcmEsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX0Fzc2lzdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9UcmF2ZXJzYWwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVmFsaWRhdGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ2FwdGlvbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9CaW5kLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ2FsY3VsYXRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX0NvbWIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ByZXNlbnQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQWNyb2JhdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9UcmFjZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QcmludFNjYWxpbmcsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRW5mb3JjZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9OdW1iZXJPZkNvcGllcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9QYWdlUmFuZ2UsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQWRkVmlld2VyUHJlZmVyZW5jZXMsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfQURCRV9KU0NvbnNvbGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRHVwbGV4T3B0aW9uLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0FEQkVfSlNEZWJ1Z2dlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QaWNrVHJheUJ5UERGU2l6ZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9CcmVhaywgMSwgMH0sCXtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGFyYSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQXNzaXN0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1RyYXZlcnNhbCwgMSwgMH0sDQotICAgIHtYRkFfRUxFTUVOVF9LZWVwLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ZhbGlkYXRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BhZ2VTZXQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfT3ZlcmZsb3csIDEsIDB9LAl7WEZBX0VMRU1FTlRfQmluZCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9EZXNjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Jvb2tlbmQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ2FsY3VsYXRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9WYXJpYWJsZXMsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfT2NjdXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUXVlcnksIDEsIDB9LAl7WEZBX0VMRU1FTlRfSW5zZXJ0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1VwZGF0ZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9EZWxldGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTXNnSWQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfU2V2ZXJpdHksIDEsIDB9LAl7WEZBX0VMRU1FTlRfVG8sIDEsIDB9LAl7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1R5cGUsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfVG9vbFRpcCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TcGVhaywgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQWRkU2lsZW50UHJpbnQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUHJpbnRlck5hbWUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LAl7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NvbG9yLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1JlY29yZFNldCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TZWxlY3QsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWVzc2FnZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9QaWN0dXJlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1NjcmlwdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfTnVtYmVyUGF0dGVybiwgNCwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfT2NjdXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1Jvb3RFbGVtZW50LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1NjcmlwdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1hzbCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TdGFydFBhZ2UsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfUmVsZXZhbnQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQmFzZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQXV0b1NhdmUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVmFsaWRhdGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQWNyb2JhdDcsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29tbW9uLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4Y2x1ZGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ3VycmVudFBhZ2UsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfUnVuU2NyaXB0cywgMSwgMH0sCXtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LAl7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NvbWIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01lZGl1bSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9EZXNjLCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9PY2N1ciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LAl7WEZBX0VMRU1FTlRfRmlsdGVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9NYW5pZmVzdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BhcmEsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRm9udCwgMSwgMH0sDQotICAgIHtYRkFfRUxFTUVOVF9WYWx1ZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRGF5LCA3LCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db2xvciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfT2NjdXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db21iLCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LAl7WEZBX0VMRU1FTlRfRmlsdGVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01hbmlmZXN0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BpY3R1cmUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTGV2ZWwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVHlwZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db21wcmVzc09iamVjdFN0cmVhbSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRWRnZSwgNCwgMH0sDQotICAgIHtYRkFfRUxFTUVOVF9Db3JuZXIsIDQsIDB9LAl7WEZBX0VMRU1FTlRfRmlsbCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9EeW5hbWljUmVuZGVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0RhdGVQYXR0ZXJucywgMSwgMH0sCXtYRkFfRUxFTUVOVF9DYWxlbmRhclN5bWJvbHMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ3VycmVuY3lTeW1ib2xzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1R5cGVmYWNlcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9EYXRlVGltZVN5bWJvbHMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTnVtYmVyUGF0dGVybnMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTnVtYmVyU3ltYm9scywgMSwgMH0sDQotICAgIHtYRkFfRUxFTUVOVF9UaW1lUGF0dGVybnMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1hzbCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TdGFydE5vZGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfT3V0cHV0WFNMLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0FkanVzdERhdGEsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQXR0cmlidXRlcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9XaW5kb3csIDEsIDB9LAl7WEZBX0VMRU1FTlRfUmVjb3JkLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1JhbmdlLCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX0luY3JlbWVudGFsTG9hZCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9UZXh0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1RpbWUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRGF0ZVRpbWUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfSW1hZ2UsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRGVjaW1hbCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Cb29sZWFuLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0ludGVnZXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXhEYXRhLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0RhdGUsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfRmxvYXQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ2VydGlmaWNhdGUsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVWksIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BhcmEsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0Fzc2lzdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9UcmF2ZXJzYWwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfS2VlcCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9DYXB0aW9uLCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRm9udCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9WYWx1ZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRW5jcnlwdGlvbkxldmVsLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0VuY3J5cHQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGVybWlzc2lvbnMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWVyaWRpZW0sIDIsIDB9LAl7WEZBX0VMRU1FTlRfU3VwcHJlc3NCYW5uZXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfVmVyc2lvbkNvbnRyb2wsIDEsIDB9LA0KLSAgICB7WEZBX0VMRU1FTlRfTG9jYWxlU2V0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1RlbXBsYXRlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ZhbGlkYXRpb25NZXNzYWdpbmcsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTG9jYWxlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0RhdGEsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTWVzc2FnaW5nLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BhdHRlcm4sIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfU29saWQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YgfCBYRkFfUFJPUEVSVFlGTEFHX0RlZmF1bHRPbmVPZn0sCXtYRkFfRUxFTUVOVF9TdGlwcGxlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0NvbG9yLCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX0xpbmVhciwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUmFkaWFsLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0ZpbGwsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX01hcCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9BcmMsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfVGV4dCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9UaW1lLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0RhdGVUaW1lLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCi0gICAge1hGQV9FTEVNRU5UX0ltYWdlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0RlY2ltYWwsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfQm9vbGVhbiwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9JbnRlZ2VyLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0V4RGF0YSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9SZWN0YW5nbGUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAl7WEZBX0VMRU1FTlRfRGF0ZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9GbG9hdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCXtYRkFfRUxFTUVOVF9MaW5lLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQotICAgIHtYRkFfRUxFTUVOVF9EZXN0aW5hdGlvbiwgMSwgMH0sCXtYRkFfRUxFTUVOVF9NZXNzYWdlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1NjcmlwdCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGljdHVyZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db25uZWN0U3RyaW5nLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1VzZXIsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGFzc3dvcmQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfTW9kaWZ5QW5ub3RzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0NvbnRlbnRDb3B5LCAxLCAwfSwNCi0gICAge1hGQV9FTEVNRU5UX0Zvcm1GaWVsZEZpbGxpbmcsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ2hhbmdlLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0FjY2Vzc2libGVDb250ZW50LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ByaW50LCAxLCAwfSwJe1hGQV9FTEVNRU5UX1BsYWludGV4dE1ldGFkYXRhLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1ByaW50SGlnaFF1YWxpdHksIDEsIDB9LAl7WEZBX0VMRU1FTlRfRG9jdW1lbnRBc3NlbWJseSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9FbmNyeXB0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX051bWJlclN5bWJvbCwgNSwgMH0sCXtYRkFfRUxFTUVOVF9Gb250SW5mbywgMSwgMH0sDQotICAgIHtYRkFfRUxFTUVOVF9YZGMsIDEsIDB9LAl7WEZBX0VMRU1FTlRfQ29sb3IsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwJe1hGQV9FTEVNRU5UX1RpbWVQYXR0ZXJuLCA0LCAwfSwJe1hGQV9FTEVNRU5UX1doaXRlc3BhY2UsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUmVuYW1lLCAxLCAwfSwJe1hGQV9FTEVNRU5UX0lmRW1wdHksIDEsIDB9LAl7WEZBX0VMRU1FTlRfUHJlc2VuY2UsIDEsIDB9LAl7WEZBX0VMRU1FTlRfUGljdHVyZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9OYW1lQXR0ciwgMSwgMH0sDQotICAgIHtYRkFfRUxFTUVOVF9Hcm91cFBhcmVudCwgMSwgMH0sCXtYRkFfRUxFTUVOVF9TY3JpcHQsIDEsIDB9LAl7WEZBX0VMRU1FTlRfRWRnZSwgMSwgMH0sCXtYRkFfRUxFTUVOVF9Db25uZWN0LCAxLCAwfSwJe1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sCXtYRkFfRUxFTUVOVF9Nb250aCwgMTIsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfSm9nLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1hkYywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9CYXRjaE91dHB1dCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PdXRwdXRCaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29tcHJlc3MsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3RhcGxlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01lZGl1bUluZm8sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9EZWZhdWx0VWksIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmFyY29kZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9CdXR0b24sIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX1BpY3R1cmUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfSW1hZ2VFZGl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9TaWduYXR1cmUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGV4dEVkaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXhPYmplY3QsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JyZWFrLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX092ZXJmbG93LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9va2VuZCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT2NjdXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1N1YnNldEJlbG93LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hcCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FbWJlZCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EYXRlUGF0dGVybiwgNCwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FZGdlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0ZpbGwsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVG8sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01vZGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGhyZXNob2xkLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1NjcmlwdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Gb250SW5mbywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Kb2csIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BhZ2VPZmZzZXQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT3V0cHV0QmluLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1N0YXBsZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NZWRpdW1JbmZvLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Fkb2JlRXh0ZW5zaW9uTGV2ZWwsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BkZmEsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmlld2VyUHJlZmVyZW5jZXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU2NyaXB0TW9kZWwsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmVyc2lvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TdWJtaXRGb3JtYXQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU2lsZW50UHJpbnQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUHJvZHVjZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29tcHJlc3Npb24sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfSW50ZXJhY3RpdmUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRW5jcnlwdGlvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9SZW5kZXJQb2xpY3ksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT3BlbkFjdGlvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DcmVhdG9yLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0xpbmVhcml6ZWQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGFnZ2VkLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1VyaSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Yc2wsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGFja2V0cywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGVidWcsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0ZsaXBMYWJlbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UZW1wbGF0ZUNhY2hlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Gb250SW5mbywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9YZGMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRmxpcExhYmVsLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0VyYU5hbWVzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0RheU5hbWVzLCAyLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01lcmlkaWVtTmFtZXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTW9udGhOYW1lcywgMiwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9IeXBoZW5hdGlvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9BbWQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGFydCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9JbmNsdWRlWERQQ29udGVudCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db25mb3JtYW5jZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NZHAsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RpbWVTdGFtcCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9IYW5kbGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZHMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRW5jb2RpbmdzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1JlYXNvbnMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQXBwZWFyYW5jZUZpbHRlciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Mb2NrRG9jdW1lbnQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfWGRwLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NhY2hlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BhZ2luYXRpb24sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT3ZlcnByaW50LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JlaGF2aW9yT3ZlcnJpZGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29waWVzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX091dHB1dCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WYWxpZGF0ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9MYXlvdXQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU2NyaXB0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbW1vbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QYWdpbmF0aW9uT3ZlcnJpZGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGVzdGluYXRpb24sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfSW5jcmVtZW50YWxNZXJnZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeGVjdXRlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX1NjcmlwdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9TaWduRGF0YSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3VibWl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbCwgMywgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PcGVyYXRpb24sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfV3NkbEFkZHJlc3MsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU29hcEFkZHJlc3MsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU29hcEFjdGlvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FZmZlY3RpdmVPdXRwdXRQb2xpY3ksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRWZmZWN0aXZlSW5wdXRQb2xpY3ksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0VyYSwgMiwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGljdHVyZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0VkZ2UsIDQsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29ybmVyLCA0LCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0ZpbGwsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0tleVVzYWdlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1N1YmplY3RETnMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfSXNzdWVycywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TaWduaW5nLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX09pZHMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29sb3IsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1VpLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QYXJhLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Zvcm1hdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQXNzaXN0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RyYXZlcnNhbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9LZWVwLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ZhbGlkYXRlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NhcHRpb24sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmluZCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EZXNjLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0ZvbnQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmFsdWUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2FsY3VsYXRlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9JdGVtcywgMiwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGVzYywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbG9yLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db2xvciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BhcmEsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Fzc2lzdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UcmF2ZXJzYWwsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmFsaWRhdGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2FwdGlvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9CaW5kLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2FsY3VsYXRlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbWIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ByZXNlbnQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQWNyb2JhdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UcmFjZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QcmludFNjYWxpbmcsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRW5mb3JjZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9OdW1iZXJPZkNvcGllcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QYWdlUmFuZ2UsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQWRkVmlld2VyUHJlZmVyZW5jZXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQURCRV9KU0NvbnNvbGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRHVwbGV4T3B0aW9uLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0FEQkVfSlNEZWJ1Z2dlciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QaWNrVHJheUJ5UERGU2l6ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9CcmVhaywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGFyYSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQXNzaXN0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RyYXZlcnNhbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9LZWVwLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ZhbGlkYXRlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BhZ2VTZXQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT3ZlcmZsb3csIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmluZCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EZXNjLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Jvb2tlbmQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2FsY3VsYXRlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WYXJpYWJsZXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT2NjdXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUXVlcnksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfSW5zZXJ0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1VwZGF0ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EZWxldGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTXNnSWQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU2V2ZXJpdHksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVG8sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1R5cGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVG9vbFRpcCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TcGVhaywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQWRkU2lsZW50UHJpbnQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUHJpbnRlck5hbWUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbG9yLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1JlY29yZFNldCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TZWxlY3QsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWVzc2FnZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QaWN0dXJlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1NjcmlwdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTnVtYmVyUGF0dGVybiwgNCwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT2NjdXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1Jvb3RFbGVtZW50LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1NjcmlwdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1hzbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TdGFydFBhZ2UsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUmVsZXZhbnQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmFzZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQXV0b1NhdmUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmFsaWRhdGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQWNyb2JhdDcsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29tbW9uLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4Y2x1ZGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ3VycmVudFBhZ2UsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUnVuU2NyaXB0cywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbWIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01lZGl1bSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EZXNjLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PY2N1ciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRmlsdGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYW5pZmVzdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BhcmEsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRm9udCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WYWx1ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGF5LCA3LCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db2xvciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT2NjdXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db21iLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRmlsdGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hbmlmZXN0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BpY3R1cmUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTGV2ZWwsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVHlwZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db21wcmVzc09iamVjdFN0cmVhbSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRWRnZSwgNCwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db3JuZXIsIDQsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRmlsbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EeW5hbWljUmVuZGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0RhdGVQYXR0ZXJucywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DYWxlbmRhclN5bWJvbHMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ3VycmVuY3lTeW1ib2xzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1R5cGVmYWNlcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EYXRlVGltZVN5bWJvbHMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTnVtYmVyUGF0dGVybnMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTnVtYmVyU3ltYm9scywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UaW1lUGF0dGVybnMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1hzbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TdGFydE5vZGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT3V0cHV0WFNMLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0FkanVzdERhdGEsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQXR0cmlidXRlcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9XaW5kb3csIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUmVjb3JkLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1JhbmdlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0luY3JlbWVudGFsTG9hZCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UZXh0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RpbWUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGF0ZVRpbWUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfSW1hZ2UsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGVjaW1hbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Cb29sZWFuLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0ludGVnZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXhEYXRhLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0RhdGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRmxvYXQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2VydGlmaWNhdGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVWksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BhcmEsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Fzc2lzdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UcmF2ZXJzYWwsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfS2VlcCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DYXB0aW9uLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRm9udCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WYWx1ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRW5jcnlwdGlvbkxldmVsLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0VuY3J5cHQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGVybWlzc2lvbnMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWVyaWRpZW0sIDIsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3VwcHJlc3NCYW5uZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmVyc2lvbkNvbnRyb2wsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTG9jYWxlU2V0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RlbXBsYXRlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ZhbGlkYXRpb25NZXNzYWdpbmcsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTG9jYWxlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0RhdGEsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWVzc2FnaW5nLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BhdHRlcm4sIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfU29saWQsIDEsDQorICAgICBYRkFfUFJPUEVSVFlGTEFHX09uZU9mIHwgWEZBX1BST1BFUlRZRkxBR19EZWZhdWx0T25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3RpcHBsZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9Db2xvciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9MaW5lYXIsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1JhZGlhbCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9GaWxsLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXAsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQXJjLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX1RleHQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGltZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9EYXRlVGltZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9JbWFnZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9EZWNpbWFsLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0Jvb2xlYW4sIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfSW50ZWdlciwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9FeERhdGEsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfUmVjdGFuZ2xlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0RhdGUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfRmxvYXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfTGluZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGVzdGluYXRpb24sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWVzc2FnZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TY3JpcHQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BpY3R1cmUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29ubmVjdFN0cmluZywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Vc2VyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1Bhc3N3b3JkLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01vZGlmeUFubm90cywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db250ZW50Q29weSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Gb3JtRmllbGRGaWxsaW5nLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NoYW5nZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9BY2Nlc3NpYmxlQ29udGVudCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QcmludCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QbGFpbnRleHRNZXRhZGF0YSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QcmludEhpZ2hRdWFsaXR5LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0RvY3VtZW50QXNzZW1ibHksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRW5jcnlwdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2wsIDUsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRm9udEluZm8sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbG9yLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UaW1lUGF0dGVybiwgNCwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9XaGl0ZXNwYWNlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1JlbmFtZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9JZkVtcHR5LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ByZXNlbmNlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BpY3R1cmUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTmFtZUF0dHIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfR3JvdXBQYXJlbnQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU2NyaXB0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0VkZ2UsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29ubmVjdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTW9udGgsIDEyLCAwfSwNCiB9Ow0KIGV4dGVybiBjb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSBnX1hGQUVsZW1lbnRDaGlsZHJlbkluZGV4W10gPSB7DQotICAgIHswLCAwfSwJezAsIDB9LAl7MCwgMH0sCXswLCAxfSwJezEsIDB9LAl7MSwgNH0sCXs1LCAwfSwJezUsIDB9LAl7NSwgMH0sCXs1LCAzfSwJezgsIDB9LAl7OCwgMH0sCXs4LCAwfSwJezgsIDB9LAl7OCwgMH0sCXs4LCAxfSwJezksIDB9LAl7OSwgMH0sCXs5LCAwfSwJezksIDB9LA0KLSAgICB7OSwgMH0sCXs5LCAwfSwJezksIDJ9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LA0KLSAgICB7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDB9LAl7MTEsIDh9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LAl7MTksIDB9LA0KLSAgICB7MTksIDB9LAl7MTksIDB9LAl7MTksIDF9LAl7MjAsIDF9LAl7MjEsIDF9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDB9LAl7MjIsIDd9LAl7MjksIDB9LAl7MjksIDB9LAl7MjksIDB9LAl7MjksIDB9LA0KLSAgICB7MjksIDB9LAl7MjksIDB9LAl7MjksIDF9LAl7MzAsIDF9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDB9LAl7MzEsIDR9LAl7MzUsIDJ9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LA0KLSAgICB7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDB9LAl7MzcsIDR9LAl7NDEsIDB9LAl7NDEsIDB9LAl7NDEsIDB9LAl7NDEsIDB9LAl7NDEsIDB9LAl7NDEsIDB9LAl7NDEsIDJ9LAl7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDB9LA0KLSAgICB7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDB9LAl7NDMsIDEzfSwJezU2LCAwfSwJezU2LCAwfSwJezU2LCAxfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwJezU3LCAwfSwNCi0gICAgezU3LCAwfSwJezU3LCAxfSwJezU4LCAwfSwJezU4LCAxfSwJezU5LCAwfSwJezU5LCAwfSwJezU5LCAwfSwJezU5LCAxfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAwfSwJezYwLCAxfSwJezYxLCAwfSwJezYxLCAwfSwJezYxLCAwfSwNCi0gICAgezYxLCAxfSwJezYyLCAwfSwJezYyLCAyfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAwfSwJezY0LCAxfSwJezY1LCAxfSwJezY2LCAxfSwJezY3LCAwfSwJezY3LCAxfSwNCi0gICAgezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCAwfSwJezY4LCA2fSwJezc0LCAwfSwJezc0LCAxfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwJezc1LCAwfSwNCi0gICAgezc1LCAxfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwNCi0gICAgezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAwfSwJezc2LCAyfSwJezc4LCAwfSwJezc4LCAwfSwJezc4LCAwfSwJezc4LCAxfSwJezc5LCAwfSwNCi0gICAgezc5LCAwfSwJezc5LCAxfSwJezgwLCAwfSwJezgwLCAwfSwJezgwLCAxfSwJezgxLCAwfSwJezgxLCAwfSwJezgxLCAxfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAwfSwJezgyLCAxfSwJezgzLCAwfSwNCi0gICAgezgzLCAwfSwJezgzLCAwfSwJezgzLCAwfSwJezgzLCAwfSwJezgzLCAwfSwJezgzLCAxMX0sCXs5NCwgMH0sCXs5NCwgMH0sCXs5NCwgMH0sCXs5NCwgMH0sCXs5NCwgMH0sCXs5NCwgMTF9LAl7MTA1LCAxMDZ9LAl7MjExLCAwfSwJezIxMSwgMH0sCXsyMTEsIDF9LAl7MjEyLCAwfSwJezIxMiwgM30sCXsyMTUsIDF9LAl7MjE2LCAwfSwNCi0gICAgezIxNiwgMH0sCXsyMTYsIDB9LAl7MjE2LCAwfSwJezIxNiwgMH0sCXsyMTYsIDB9LAl7MjE2LCAwfSwJezIxNiwgMH0sCXsyMTYsIDB9LAl7MjE2LCAwfSwJezIxNiwgMH0sCXsyMTYsIDB9LAl7MjE2LCAwfSwJezIxNiwgMTJ9LAl7MjI4LCAwfSwJezIyOCwgMH0sCXsyMjgsIDB9LAl7MjI4LCAwfSwJezIyOCwgMH0sCXsyMjgsIDB9LAl7MjI4LCAwfSwNCi0gICAgezIyOCwgMH0sCXsyMjgsIDB9LAl7MjI4LCAyfSwJezIzMCwgMH0sCXsyMzAsIDB9LAl7MjMwLCAwfSwJezIzMCwgMH0sCXsyMzAsIDB9LAl7MjMwLCAwfSwJezIzMCwgMH0sCXsyMzAsIDB9LAl7MjMwLCAxMH0sDQorICAgIHswLCAwfSwgICB7MCwgMH0sICAgezAsIDB9LCAgIHswLCAxfSwgICAgezEsIDB9LCAgIHsxLCA0fSwgICAgezUsIDB9LA0KKyAgICB7NSwgMH0sICAgezUsIDB9LCAgIHs1LCAzfSwgICB7OCwgMH0sICAgIHs4LCAwfSwgICB7OCwgMH0sICAgIHs4LCAwfSwNCisgICAgezgsIDB9LCAgIHs4LCAxfSwgICB7OSwgMH0sICAgezksIDB9LCAgICB7OSwgMH0sICAgezksIDB9LCAgICB7OSwgMH0sDQorICAgIHs5LCAwfSwgICB7OSwgMn0sICAgezExLCAwfSwgIHsxMSwgMH0sICAgezExLCAwfSwgIHsxMSwgMH0sICAgezExLCAwfSwNCisgICAgezExLCAwfSwgIHsxMSwgMH0sICB7MTEsIDB9LCAgezExLCAwfSwgICB7MTEsIDB9LCAgezExLCAwfSwgICB7MTEsIDB9LA0KKyAgICB7MTEsIDB9LCAgezExLCAwfSwgIHsxMSwgMH0sICB7MTEsIDB9LCAgIHsxMSwgMH0sICB7MTEsIDB9LCAgIHsxMSwgMH0sDQorICAgIHsxMSwgMH0sICB7MTEsIDB9LCAgezExLCAwfSwgIHsxMSwgMH0sICAgezExLCAwfSwgIHsxMSwgOH0sICAgezE5LCAwfSwNCisgICAgezE5LCAwfSwgIHsxOSwgMH0sICB7MTksIDB9LCAgezE5LCAwfSwgICB7MTksIDB9LCAgezE5LCAwfSwgICB7MTksIDB9LA0KKyAgICB7MTksIDB9LCAgezE5LCAwfSwgIHsxOSwgMH0sICB7MTksIDB9LCAgIHsxOSwgMH0sICB7MTksIDB9LCAgIHsxOSwgMX0sDQorICAgIHsyMCwgMX0sICB7MjEsIDF9LCAgezIyLCAwfSwgIHsyMiwgMH0sICAgezIyLCAwfSwgIHsyMiwgMH0sICAgezIyLCAwfSwNCisgICAgezIyLCAwfSwgIHsyMiwgMH0sICB7MjIsIDB9LCAgezIyLCAwfSwgICB7MjIsIDB9LCAgezIyLCA3fSwgICB7MjksIDB9LA0KKyAgICB7MjksIDB9LCAgezI5LCAwfSwgIHsyOSwgMH0sICB7MjksIDB9LCAgIHsyOSwgMH0sICB7MjksIDF9LCAgIHszMCwgMX0sDQorICAgIHszMSwgMH0sICB7MzEsIDB9LCAgezMxLCAwfSwgIHszMSwgMH0sICAgezMxLCAwfSwgIHszMSwgMH0sICAgezMxLCAwfSwNCisgICAgezMxLCAwfSwgIHszMSwgMH0sICB7MzEsIDR9LCAgezM1LCAyfSwgICB7MzcsIDB9LCAgezM3LCAwfSwgICB7MzcsIDB9LA0KKyAgICB7MzcsIDB9LCAgezM3LCAwfSwgIHszNywgMH0sICB7MzcsIDB9LCAgIHszNywgMH0sICB7MzcsIDB9LCAgIHszNywgMH0sDQorICAgIHszNywgMH0sICB7MzcsIDB9LCAgezM3LCAwfSwgIHszNywgMH0sICAgezM3LCA0fSwgIHs0MSwgMH0sICAgezQxLCAwfSwNCisgICAgezQxLCAwfSwgIHs0MSwgMH0sICB7NDEsIDB9LCAgezQxLCAwfSwgICB7NDEsIDJ9LCAgezQzLCAwfSwgICB7NDMsIDB9LA0KKyAgICB7NDMsIDB9LCAgezQzLCAwfSwgIHs0MywgMH0sICB7NDMsIDB9LCAgIHs0MywgMH0sICB7NDMsIDB9LCAgIHs0MywgMH0sDQorICAgIHs0MywgMTN9LCB7NTYsIDB9LCAgezU2LCAwfSwgIHs1NiwgMX0sICAgezU3LCAwfSwgIHs1NywgMH0sICAgezU3LCAwfSwNCisgICAgezU3LCAwfSwgIHs1NywgMH0sICB7NTcsIDB9LCAgezU3LCAwfSwgICB7NTcsIDB9LCAgezU3LCAwfSwgICB7NTcsIDB9LA0KKyAgICB7NTcsIDB9LCAgezU3LCAxfSwgIHs1OCwgMH0sICB7NTgsIDF9LCAgIHs1OSwgMH0sICB7NTksIDB9LCAgIHs1OSwgMH0sDQorICAgIHs1OSwgMX0sICB7NjAsIDB9LCAgezYwLCAwfSwgIHs2MCwgMH0sICAgezYwLCAwfSwgIHs2MCwgMH0sICAgezYwLCAwfSwNCisgICAgezYwLCAwfSwgIHs2MCwgMH0sICB7NjAsIDF9LCAgezYxLCAwfSwgICB7NjEsIDB9LCAgezYxLCAwfSwgICB7NjEsIDF9LA0KKyAgICB7NjIsIDB9LCAgezYyLCAyfSwgIHs2NCwgMH0sICB7NjQsIDB9LCAgIHs2NCwgMH0sICB7NjQsIDB9LCAgIHs2NCwgMH0sDQorICAgIHs2NCwgMH0sICB7NjQsIDB9LCAgezY0LCAwfSwgIHs2NCwgMH0sICAgezY0LCAwfSwgIHs2NCwgMH0sICAgezY0LCAwfSwNCisgICAgezY0LCAxfSwgIHs2NSwgMX0sICB7NjYsIDF9LCAgezY3LCAwfSwgICB7NjcsIDF9LCAgezY4LCAwfSwgICB7NjgsIDB9LA0KKyAgICB7NjgsIDB9LCAgezY4LCAwfSwgIHs2OCwgMH0sICB7NjgsIDB9LCAgIHs2OCwgMH0sICB7NjgsIDB9LCAgIHs2OCwgNn0sDQorICAgIHs3NCwgMH0sICB7NzQsIDF9LCAgezc1LCAwfSwgIHs3NSwgMH0sICAgezc1LCAwfSwgIHs3NSwgMH0sICAgezc1LCAwfSwNCisgICAgezc1LCAwfSwgIHs3NSwgMH0sICB7NzUsIDB9LCAgezc1LCAwfSwgICB7NzUsIDF9LCAgezc2LCAwfSwgICB7NzYsIDB9LA0KKyAgICB7NzYsIDB9LCAgezc2LCAwfSwgIHs3NiwgMH0sICB7NzYsIDB9LCAgIHs3NiwgMH0sICB7NzYsIDB9LCAgIHs3NiwgMH0sDQorICAgIHs3NiwgMH0sICB7NzYsIDB9LCAgezc2LCAwfSwgIHs3NiwgMH0sICAgezc2LCAwfSwgIHs3NiwgMH0sICAgezc2LCAwfSwNCisgICAgezc2LCAwfSwgIHs3NiwgMH0sICB7NzYsIDB9LCAgezc2LCAwfSwgICB7NzYsIDB9LCAgezc2LCAwfSwgICB7NzYsIDB9LA0KKyAgICB7NzYsIDB9LCAgezc2LCAwfSwgIHs3NiwgMH0sICB7NzYsIDB9LCAgIHs3NiwgMH0sICB7NzYsIDB9LCAgIHs3NiwgMH0sDQorICAgIHs3NiwgMH0sICB7NzYsIDB9LCAgezc2LCAwfSwgIHs3NiwgMn0sICAgezc4LCAwfSwgIHs3OCwgMH0sICAgezc4LCAwfSwNCisgICAgezc4LCAxfSwgIHs3OSwgMH0sICB7NzksIDB9LCAgezc5LCAxfSwgICB7ODAsIDB9LCAgezgwLCAwfSwgICB7ODAsIDF9LA0KKyAgICB7ODEsIDB9LCAgezgxLCAwfSwgIHs4MSwgMX0sICB7ODIsIDB9LCAgIHs4MiwgMH0sICB7ODIsIDB9LCAgIHs4MiwgMH0sDQorICAgIHs4MiwgMH0sICB7ODIsIDB9LCAgezgyLCAwfSwgIHs4MiwgMH0sICAgezgyLCAwfSwgIHs4MiwgMH0sICAgezgyLCAxfSwNCisgICAgezgzLCAwfSwgIHs4MywgMH0sICB7ODMsIDB9LCAgezgzLCAwfSwgICB7ODMsIDB9LCAgezgzLCAwfSwgICB7ODMsIDExfSwNCisgICAgezk0LCAwfSwgIHs5NCwgMH0sICB7OTQsIDB9LCAgezk0LCAwfSwgICB7OTQsIDB9LCAgezk0LCAxMX0sICB7MTA1LCAxMDZ9LA0KKyAgICB7MjExLCAwfSwgezIxMSwgMH0sIHsyMTEsIDF9LCB7MjEyLCAwfSwgIHsyMTIsIDN9LCB7MjE1LCAxfSwgIHsyMTYsIDB9LA0KKyAgICB7MjE2LCAwfSwgezIxNiwgMH0sIHsyMTYsIDB9LCB7MjE2LCAwfSwgIHsyMTYsIDB9LCB7MjE2LCAwfSwgIHsyMTYsIDB9LA0KKyAgICB7MjE2LCAwfSwgezIxNiwgMH0sIHsyMTYsIDB9LCB7MjE2LCAwfSwgIHsyMTYsIDB9LCB7MjE2LCAxMn0sIHsyMjgsIDB9LA0KKyAgICB7MjI4LCAwfSwgezIyOCwgMH0sIHsyMjgsIDB9LCB7MjI4LCAwfSwgIHsyMjgsIDB9LCB7MjI4LCAwfSwgIHsyMjgsIDB9LA0KKyAgICB7MjI4LCAwfSwgezIyOCwgMn0sIHsyMzAsIDB9LCB7MjMwLCAwfSwgIHsyMzAsIDB9LCB7MjMwLCAwfSwgIHsyMzAsIDB9LA0KKyAgICB7MjMwLCAwfSwgezIzMCwgMH0sIHsyMzAsIDB9LCB7MjMwLCAxMH0sDQogfTsNCiBleHRlcm4gY29uc3QgRlhfV09SRCBnX1hGQUVsZW1lbnRDaGlsZHJlbkRhdGFbXSA9IHsNCi0gICAgWEZBX0VMRU1FTlRfRXh0cmFzLAlYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LAlYRkFfRUxFTUVOVF9CcmVha0JlZm9yZSwJWEZBX0VMRU1FTlRfU3ViZm9ybSwJWEZBX0VMRU1FTlRfQnJlYWtBZnRlciwJWEZBX0VMRU1FTlRfQWx3YXlzRW1iZWQsCVhGQV9FTEVNRU5UX0RlZmF1bHRUeXBlZmFjZSwJWEZBX0VMRU1FTlRfTmV2ZXJFbWJlZCwJWEZBX0VMRU1FTlRfU291cmNlLAlYRkFfRUxFTUVOVF9FcXVhdGUsDQotICAgIFhGQV9FTEVNRU5UX0VxdWF0ZVJhbmdlLAlYRkFfRUxFTUVOVF9QcywJWEZBX0VMRU1FTlRfUGNsLAlYRkFfRUxFTUVOVF9QZGYsCVhGQV9FTEVNRU5UX1pwbCwJWEZBX0VMRU1FTlRfTGFiZWxQcmludGVyLAlYRkFfRUxFTUVOVF9XZWJDbGllbnQsCVhGQV9FTEVNRU5UX1N1Ym1pdFVybCwJWEZBX0VMRU1FTlRfRHJpdmVyLAlYRkFfRUxFTUVOVF9UeXBlZmFjZSwNCi0gICAgWEZBX0VMRU1FTlRfU3ViamVjdEROLAlYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZSwJWEZBX0VMRU1FTlRfU3ViZm9ybVNldCwJWEZBX0VMRU1FTlRfQXJlYSwJWEZBX0VMRU1FTlRfRmllbGQsCVhGQV9FTEVNRU5UX0V4Y2xHcm91cCwJWEZBX0VMRU1FTlRfU3ViZm9ybSwJWEZBX0VMRU1FTlRfRHJhdywJWEZBX0VMRU1FTlRfRXhPYmplY3QsCVhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2QsDQotICAgIFhGQV9FTEVNRU5UX1JlZiwJWEZBX0VMRU1FTlRfRXZlbnQsCVhGQV9FTEVNRU5UX1NldFByb3BlcnR5LAlYRkFfRUxFTUVOVF9CaW5kSXRlbXMsCVhGQV9FTEVNRU5UX0Nvbm5lY3QsCVhGQV9FTEVNRU5UX1BkZiwJWEZBX0VMRU1FTlRfRGVzdGluYXRpb24sCVhGQV9FTEVNRU5UX0V2ZW50LAlYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwJWEZBX0VMRU1FTlRfRmllbGQsDQotICAgIFhGQV9FTEVNRU5UX0Nvbm5lY3QsCVhGQV9FTEVNRU5UX0FnZW50LAlYRkFfRUxFTUVOVF9Qc01hcCwJWEZBX0VMRU1FTlRfU3ViZm9ybVNldCwJWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUsCVhGQV9FTEVNRU5UX0V2ZW50LAlYRkFfRUxFTUVOVF9BcmVhLAlYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwJWEZBX0VMRU1FTlRfRmllbGQsCVhGQV9FTEVNRU5UX0V4Y2xHcm91cCwNCi0gICAgWEZBX0VMRU1FTlRfU3ViZm9ybSwJWEZBX0VMRU1FTlRfRHJhdywJWEZBX0VMRU1FTlRfRXhPYmplY3QsCVhGQV9FTEVNRU5UX1Byb3RvLAlYRkFfRUxFTUVOVF9Db25uZWN0LAlYRkFfRUxFTUVOVF9CcmVha0FmdGVyLAlYRkFfRUxFTUVOVF9Mb2NhbGUsCVhGQV9FTEVNRU5UX1RleHQsCVhGQV9FTEVNRU5UX0ZvbnQsCVhGQV9FTEVNRU5UX1RyYXZlcnNlLA0KLSAgICBYRkFfRUxFTUVOVF9NYXAsCVhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZCwJWEZBX0VMRU1FTlRfUGFnZVNldCwJWEZBX0VMRU1FTlRfUGFnZUFyZWEsCVhGQV9FTEVNRU5UX0VuY29kaW5nLAlYRkFfRUxFTUVOVF9TdWJmb3JtLAlYRkFfRUxFTUVOVF9TdWJtaXRVcmwsCVhGQV9FTEVNRU5UX0NlcnRpZmljYXRlLAlYRkFfRUxFTUVOVF9BcmVhLAlYRkFfRUxFTUVOVF9GaWVsZCwNCi0gICAgWEZBX0VMRU1FTlRfQ29udGVudEFyZWEsCVhGQV9FTEVNRU5UX0V4Y2xHcm91cCwJWEZBX0VMRU1FTlRfU3ViZm9ybSwJWEZBX0VMRU1FTlRfRHJhdywJWEZBX0VMRU1FTlRfT2lkLAlYRkFfRUxFTUVOVF9SZWYsCVhGQV9FTEVNRU5UX0V4Y2x1ZGVOUywJWEZBX0VMRU1FTlRfVHJhbnNmb3JtLAlYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwJWEZBX0VMRU1FTlRfTWVzc2FnZSwNCi0gICAgWEZBX0VMRU1FTlRfTG9nLAlYRkFfRUxFTUVOVF9SZWFzb24sCVhGQV9FTEVNRU5UX0FyZWEsCVhGQV9FTEVNRU5UX1RleHQsCVhGQV9FTEVNRU5UX1RpbWUsCVhGQV9FTEVNRU5UX0RhdGVUaW1lLAlYRkFfRUxFTUVOVF9JbWFnZSwJWEZBX0VMRU1FTlRfRGVjaW1hbCwJWEZBX0VMRU1FTlRfQm9vbGVhbiwJWEZBX0VMRU1FTlRfSW50ZWdlciwNCi0gICAgWEZBX0VMRU1FTlRfRXhEYXRhLAlYRkFfRUxFTUVOVF9EYXRlLAlYRkFfRUxFTUVOVF9GbG9hdCwJWEZBX0VMRU1FTlRfRXhPYmplY3QsCVhGQV9FTEVNRU5UX1RleHQsCVhGQV9FTEVNRU5UX1RpbWUsCVhGQV9FTEVNRU5UX0RhdGVUaW1lLAlYRkFfRUxFTUVOVF9JbWFnZSwJWEZBX0VMRU1FTlRfRGVjaW1hbCwJWEZBX0VMRU1FTlRfQm9vbGVhbiwNCi0gICAgWEZBX0VMRU1FTlRfSW50ZWdlciwJWEZBX0VMRU1FTlRfRXhEYXRhLAlYRkFfRUxFTUVOVF9EYXRlLAlYRkFfRUxFTUVOVF9GbG9hdCwJWEZBX0VMRU1FTlRfRXh0cmFzLAlYRkFfRUxFTUVOVF9VaSwJWEZBX0VMRU1FTlRfU3ViZm9ybVNldCwJWEZBX0VMRU1FTlRfQnJlYWssCVhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLAlYRkFfRUxFTUVOVF9BcmMsDQotICAgIFhGQV9FTEVNRU5UX01kcCwJWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUsCVhGQV9FTEVNRU5UX09pZCwJWEZBX0VMRU1FTlRfUmVmLAlYRkFfRUxFTUVOVF9NYXJnaW4sCVhGQV9FTEVNRU5UX0tleVVzYWdlLAlYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LAlYRkFfRUxFTUVOVF9QYXJhLAlYRkFfRUxFTUVOVF9GaWx0ZXIsCVhGQV9FTEVNRU5UX0VuY29kaW5nLA0KLSAgICBYRkFfRUxFTUVOVF9FdmVudCwJWEZBX0VMRU1FTlRfRGVmYXVsdFVpLAlYRkFfRUxFTUVOVF9CYXJjb2RlLAlYRkFfRUxFTUVOVF9TdWJqZWN0RE5zLAlYRkFfRUxFTUVOVF9Jc3N1ZXJzLAlYRkFfRUxFTUVOVF9CdXR0b24sCVhGQV9FTEVNRU5UX0Zvcm1hdCwJWEZBX0VMRU1FTlRfQm9yZGVyLAlYRkFfRUxFTUVOVF9BcmVhLAlYRkFfRUxFTUVOVF9IeXBoZW5hdGlvbiwNCi0gICAgWEZBX0VMRU1FTlRfVGV4dCwJWEZBX0VMRU1FTlRfVGltZSwJWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzLAlYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwJWEZBX0VMRU1FTlRfRGF0ZVRpbWUsCVhGQV9FTEVNRU5UX0NvbWIsCVhGQV9FTEVNRU5UX1BhdHRlcm4sCVhGQV9FTEVNRU5UX0ZpZWxkLAlYRkFfRUxFTUVOVF9Db250ZW50QXJlYSwJWEZBX0VMRU1FTlRfU29saWQsDQotICAgIFhGQV9FTEVNRU5UX0VkZ2UsCVhGQV9FTEVNRU5UX1N0aXBwbGUsCVhGQV9FTEVNRU5UX0V4Y2xHcm91cCwJWEZBX0VMRU1FTlRfVG9vbFRpcCwJWEZBX0VMRU1FTlRfUmVhc29uLAlYRkFfRUxFTUVOVF9FeGVjdXRlLAlYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQsCVhGQV9FTEVNRU5UX0ltYWdlLAlYRkFfRUxFTUVOVF9UaW1lU3RhbXAsCVhGQV9FTEVNRU5UX0RlY2ltYWwsDQotICAgIFhGQV9FTEVNRU5UX1N1YmZvcm0sCVhGQV9FTEVNRU5UX0hhbmRsZXIsCVhGQV9FTEVNRU5UX0Jvb2xlYW4sCVhGQV9FTEVNRU5UX01lc3NhZ2UsCVhGQV9FTEVNRU5UX0Fzc2lzdCwJWEZBX0VMRU1FTlRfUGljdHVyZSwJWEZBX0VMRU1FTlRfVHJhdmVyc2FsLAlYRkFfRUxFTUVOVF9Db3JuZXIsCVhGQV9FTEVNRU5UX0NvbG9yLAlYRkFfRUxFTUVOVF9LZWVwLA0KLSAgICBYRkFfRUxFTUVOVF9JbWFnZUVkaXQsCVhGQV9FTEVNRU5UX1ZhbGlkYXRlLAlYRkFfRUxFTUVOVF9EaWdlc3RNZXRob2RzLAlYRkFfRUxFTUVOVF9QYWdlU2V0LAlYRkFfRUxFTUVOVF9JbnRlZ2VyLAlYRkFfRUxFTUVOVF9UcmF2ZXJzZSwJWEZBX0VMRU1FTlRfRW5jb2RpbmdzLAlYRkFfRUxFTUVOVF9TaWduaW5nLAlYRkFfRUxFTUVOVF9TY3JpcHQsCVhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCwNCi0gICAgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQsCVhGQV9FTEVNRU5UX1BhZ2VBcmVhLAlYRkFfRUxFTUVOVF9PaWRzLAlYRkFfRUxFTUVOVF9TaWduYXR1cmUsCVhGQV9FTEVNRU5UX0NhcHRpb24sCVhGQV9FTEVNRU5UX0V4RGF0YSwJWEZBX0VMRU1FTlRfTWFuaWZlc3QsCVhGQV9FTEVNRU5UX092ZXJmbG93LAlYRkFfRUxFTUVOVF9MaW5lYXIsCVhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZCwNCi0gICAgWEZBX0VMRU1FTlRfTWVkaXVtLAlYRkFfRUxFTUVOVF9UZXh0RWRpdCwJWEZBX0VMRU1FTlRfU2lnbkRhdGEsCVhGQV9FTEVNRU5UX1JlY3RhbmdsZSwJWEZBX0VMRU1FTlRfRGF0ZSwJWEZBX0VMRU1FTlRfRGVzYywJWEZBX0VMRU1FTlRfRW5jcnlwdCwJWEZBX0VMRU1FTlRfRHJhdywJWEZBX0VMRU1FTlRfU3BlYWssCVhGQV9FTEVNRU5UX1JlYXNvbnMsDQotICAgIFhGQV9FTEVNRU5UX0FwcGVhcmFuY2VGaWx0ZXIsCVhGQV9FTEVNRU5UX0ZpbGwsCVhGQV9FTEVNRU5UX0ZvbnQsCVhGQV9FTEVNRU5UX0NlcnRpZmljYXRlLAlYRkFfRUxFTUVOVF9GbG9hdCwJWEZBX0VMRU1FTlRfVmFsdWUsCVhGQV9FTEVNRU5UX0Jvb2tlbmQsCVhGQV9FTEVNRU5UX0V4T2JqZWN0LAlYRkFfRUxFTUVOVF9CaW5kSXRlbXMsCVhGQV9FTEVNRU5UX0NhbGN1bGF0ZSwNCi0gICAgWEZBX0VMRU1FTlRfRXh0cmFzLAlYRkFfRUxFTUVOVF9Db25uZWN0LAlYRkFfRUxFTUVOVF9TdWJtaXQsCVhGQV9FTEVNRU5UX1N1YmplY3RETiwJWEZBX0VMRU1FTlRfUmFkaWFsLAlYRkFfRUxFTUVOVF9WYXJpYWJsZXMsCVhGQV9FTEVNRU5UX0xvY2tEb2N1bWVudCwJWEZBX0VMRU1FTlRfQnJlYWtBZnRlciwJWEZBX0VMRU1FTlRfTGluZSwJWEZBX0VMRU1FTlRfT2NjdXIsDQotICAgIFhGQV9FTEVNRU5UX0l0ZW1zLAlYRkFfRUxFTUVOVF9FeHRyYXMsCVhGQV9FTEVNRU5UX1dzZGxDb25uZWN0aW9uLAlYRkFfRUxFTUVOVF9Yc2RDb25uZWN0aW9uLAlYRkFfRUxFTUVOVF9YbWxDb25uZWN0aW9uLAlYRkFfRUxFTUVOVF9TaWduRGF0YSwJWEZBX0VMRU1FTlRfVGV4dCwJWEZBX0VMRU1FTlRfVGltZSwJWEZBX0VMRU1FTlRfRGF0ZVRpbWUsCVhGQV9FTEVNRU5UX0ltYWdlLA0KLSAgICBYRkFfRUxFTUVOVF9EZWNpbWFsLAlYRkFfRUxFTUVOVF9Cb29sZWFuLAlYRkFfRUxFTUVOVF9JbnRlZ2VyLAlYRkFfRUxFTUVOVF9TY3JpcHQsCVhGQV9FTEVNRU5UX0V4RGF0YSwJWEZBX0VMRU1FTlRfTWFuaWZlc3QsCVhGQV9FTEVNRU5UX0RhdGUsCVhGQV9FTEVNRU5UX0Zsb2F0LAlYRkFfRUxFTUVOVF9Db21tYW5kLAlYRkFfRUxFTUVOVF9CaW5kLA0KLSAgICBYRkFfRUxFTUVOVF9UZXh0LAlYRkFfRUxFTUVOVF9UaW1lLAlYRkFfRUxFTUVOVF9EYXRlVGltZSwJWEZBX0VMRU1FTlRfSW1hZ2UsCVhGQV9FTEVNRU5UX0RlY2ltYWwsCVhGQV9FTEVNRU5UX0Jvb2xlYW4sCVhGQV9FTEVNRU5UX0ludGVnZXIsCVhGQV9FTEVNRU5UX0V4RGF0YSwJWEZBX0VMRU1FTlRfRGF0ZSwJWEZBX0VMRU1FTlRfRmxvYXQsDQorICAgIFhGQV9FTEVNRU5UX0V4dHJhcywNCisgICAgWEZBX0VMRU1FTlRfU3ViZm9ybVNldCwNCisgICAgWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUsDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm0sDQorICAgIFhGQV9FTEVNRU5UX0JyZWFrQWZ0ZXIsDQorICAgIFhGQV9FTEVNRU5UX0Fsd2F5c0VtYmVkLA0KKyAgICBYRkFfRUxFTUVOVF9EZWZhdWx0VHlwZWZhY2UsDQorICAgIFhGQV9FTEVNRU5UX05ldmVyRW1iZWQsDQorICAgIFhGQV9FTEVNRU5UX1NvdXJjZSwNCisgICAgWEZBX0VMRU1FTlRfRXF1YXRlLA0KKyAgICBYRkFfRUxFTUVOVF9FcXVhdGVSYW5nZSwNCisgICAgWEZBX0VMRU1FTlRfUHMsDQorICAgIFhGQV9FTEVNRU5UX1BjbCwNCisgICAgWEZBX0VMRU1FTlRfUGRmLA0KKyAgICBYRkFfRUxFTUVOVF9acGwsDQorICAgIFhGQV9FTEVNRU5UX0xhYmVsUHJpbnRlciwNCisgICAgWEZBX0VMRU1FTlRfV2ViQ2xpZW50LA0KKyAgICBYRkFfRUxFTUVOVF9TdWJtaXRVcmwsDQorICAgIFhGQV9FTEVNRU5UX0RyaXZlciwNCisgICAgWEZBX0VMRU1FTlRfVHlwZWZhY2UsDQorICAgIFhGQV9FTEVNRU5UX1N1YmplY3RETiwNCisgICAgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGUsDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQsDQorICAgIFhGQV9FTEVNRU5UX0FyZWEsDQorICAgIFhGQV9FTEVNRU5UX0ZpZWxkLA0KKyAgICBYRkFfRUxFTUVOVF9FeGNsR3JvdXAsDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm0sDQorICAgIFhGQV9FTEVNRU5UX0RyYXcsDQorICAgIFhGQV9FTEVNRU5UX0V4T2JqZWN0LA0KKyAgICBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTWV0aG9kLA0KKyAgICBYRkFfRUxFTUVOVF9SZWYsDQorICAgIFhGQV9FTEVNRU5UX0V2ZW50LA0KKyAgICBYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwNCisgICAgWEZBX0VMRU1FTlRfQmluZEl0ZW1zLA0KKyAgICBYRkFfRUxFTUVOVF9Db25uZWN0LA0KKyAgICBYRkFfRUxFTUVOVF9QZGYsDQorICAgIFhGQV9FTEVNRU5UX0Rlc3RpbmF0aW9uLA0KKyAgICBYRkFfRUxFTUVOVF9FdmVudCwNCisgICAgWEZBX0VMRU1FTlRfU2V0UHJvcGVydHksDQorICAgIFhGQV9FTEVNRU5UX0ZpZWxkLA0KKyAgICBYRkFfRUxFTUVOVF9Db25uZWN0LA0KKyAgICBYRkFfRUxFTUVOVF9BZ2VudCwNCisgICAgWEZBX0VMRU1FTlRfUHNNYXAsDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQsDQorICAgIFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlLA0KKyAgICBYRkFfRUxFTUVOVF9FdmVudCwNCisgICAgWEZBX0VMRU1FTlRfQXJlYSwNCisgICAgWEZBX0VMRU1FTlRfU2V0UHJvcGVydHksDQorICAgIFhGQV9FTEVNRU5UX0ZpZWxkLA0KKyAgICBYRkFfRUxFTUVOVF9FeGNsR3JvdXAsDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm0sDQorICAgIFhGQV9FTEVNRU5UX0RyYXcsDQorICAgIFhGQV9FTEVNRU5UX0V4T2JqZWN0LA0KKyAgICBYRkFfRUxFTUVOVF9Qcm90bywNCisgICAgWEZBX0VMRU1FTlRfQ29ubmVjdCwNCisgICAgWEZBX0VMRU1FTlRfQnJlYWtBZnRlciwNCisgICAgWEZBX0VMRU1FTlRfTG9jYWxlLA0KKyAgICBYRkFfRUxFTUVOVF9UZXh0LA0KKyAgICBYRkFfRUxFTUVOVF9Gb250LA0KKyAgICBYRkFfRUxFTUVOVF9UcmF2ZXJzZSwNCisgICAgWEZBX0VMRU1FTlRfTWFwLA0KKyAgICBYRkFfRUxFTUVOVF9EaWdlc3RNZXRob2QsDQorICAgIFhGQV9FTEVNRU5UX1BhZ2VTZXQsDQorICAgIFhGQV9FTEVNRU5UX1BhZ2VBcmVhLA0KKyAgICBYRkFfRUxFTUVOVF9FbmNvZGluZywNCisgICAgWEZBX0VMRU1FTlRfU3ViZm9ybSwNCisgICAgWEZBX0VMRU1FTlRfU3VibWl0VXJsLA0KKyAgICBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZSwNCisgICAgWEZBX0VMRU1FTlRfQXJlYSwNCisgICAgWEZBX0VMRU1FTlRfRmllbGQsDQorICAgIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhLA0KKyAgICBYRkFfRUxFTUVOVF9FeGNsR3JvdXAsDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm0sDQorICAgIFhGQV9FTEVNRU5UX0RyYXcsDQorICAgIFhGQV9FTEVNRU5UX09pZCwNCisgICAgWEZBX0VMRU1FTlRfUmVmLA0KKyAgICBYRkFfRUxFTUVOVF9FeGNsdWRlTlMsDQorICAgIFhGQV9FTEVNRU5UX1RyYW5zZm9ybSwNCisgICAgWEZBX0VMRU1FTlRfU2V0UHJvcGVydHksDQorICAgIFhGQV9FTEVNRU5UX01lc3NhZ2UsDQorICAgIFhGQV9FTEVNRU5UX0xvZywNCisgICAgWEZBX0VMRU1FTlRfUmVhc29uLA0KKyAgICBYRkFfRUxFTUVOVF9BcmVhLA0KKyAgICBYRkFfRUxFTUVOVF9UZXh0LA0KKyAgICBYRkFfRUxFTUVOVF9UaW1lLA0KKyAgICBYRkFfRUxFTUVOVF9EYXRlVGltZSwNCisgICAgWEZBX0VMRU1FTlRfSW1hZ2UsDQorICAgIFhGQV9FTEVNRU5UX0RlY2ltYWwsDQorICAgIFhGQV9FTEVNRU5UX0Jvb2xlYW4sDQorICAgIFhGQV9FTEVNRU5UX0ludGVnZXIsDQorICAgIFhGQV9FTEVNRU5UX0V4RGF0YSwNCisgICAgWEZBX0VMRU1FTlRfRGF0ZSwNCisgICAgWEZBX0VMRU1FTlRfRmxvYXQsDQorICAgIFhGQV9FTEVNRU5UX0V4T2JqZWN0LA0KKyAgICBYRkFfRUxFTUVOVF9UZXh0LA0KKyAgICBYRkFfRUxFTUVOVF9UaW1lLA0KKyAgICBYRkFfRUxFTUVOVF9EYXRlVGltZSwNCisgICAgWEZBX0VMRU1FTlRfSW1hZ2UsDQorICAgIFhGQV9FTEVNRU5UX0RlY2ltYWwsDQorICAgIFhGQV9FTEVNRU5UX0Jvb2xlYW4sDQorICAgIFhGQV9FTEVNRU5UX0ludGVnZXIsDQorICAgIFhGQV9FTEVNRU5UX0V4RGF0YSwNCisgICAgWEZBX0VMRU1FTlRfRGF0ZSwNCisgICAgWEZBX0VMRU1FTlRfRmxvYXQsDQorICAgIFhGQV9FTEVNRU5UX0V4dHJhcywNCisgICAgWEZBX0VMRU1FTlRfVWksDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQsDQorICAgIFhGQV9FTEVNRU5UX0JyZWFrLA0KKyAgICBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiwNCisgICAgWEZBX0VMRU1FTlRfQXJjLA0KKyAgICBYRkFfRUxFTUVOVF9NZHAsDQorICAgIFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlLA0KKyAgICBYRkFfRUxFTUVOVF9PaWQsDQorICAgIFhGQV9FTEVNRU5UX1JlZiwNCisgICAgWEZBX0VMRU1FTlRfTWFyZ2luLA0KKyAgICBYRkFfRUxFTUVOVF9LZXlVc2FnZSwNCisgICAgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCwNCisgICAgWEZBX0VMRU1FTlRfUGFyYSwNCisgICAgWEZBX0VMRU1FTlRfRmlsdGVyLA0KKyAgICBYRkFfRUxFTUVOVF9FbmNvZGluZywNCisgICAgWEZBX0VMRU1FTlRfRXZlbnQsDQorICAgIFhGQV9FTEVNRU5UX0RlZmF1bHRVaSwNCisgICAgWEZBX0VMRU1FTlRfQmFyY29kZSwNCisgICAgWEZBX0VMRU1FTlRfU3ViamVjdEROcywNCisgICAgWEZBX0VMRU1FTlRfSXNzdWVycywNCisgICAgWEZBX0VMRU1FTlRfQnV0dG9uLA0KKyAgICBYRkFfRUxFTUVOVF9Gb3JtYXQsDQorICAgIFhGQV9FTEVNRU5UX0JvcmRlciwNCisgICAgWEZBX0VMRU1FTlRfQXJlYSwNCisgICAgWEZBX0VMRU1FTlRfSHlwaGVuYXRpb24sDQorICAgIFhGQV9FTEVNRU5UX1RleHQsDQorICAgIFhGQV9FTEVNRU5UX1RpbWUsDQorICAgIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcywNCisgICAgWEZBX0VMRU1FTlRfU2V0UHJvcGVydHksDQorICAgIFhGQV9FTEVNRU5UX0RhdGVUaW1lLA0KKyAgICBYRkFfRUxFTUVOVF9Db21iLA0KKyAgICBYRkFfRUxFTUVOVF9QYXR0ZXJuLA0KKyAgICBYRkFfRUxFTUVOVF9GaWVsZCwNCisgICAgWEZBX0VMRU1FTlRfQ29udGVudEFyZWEsDQorICAgIFhGQV9FTEVNRU5UX1NvbGlkLA0KKyAgICBYRkFfRUxFTUVOVF9FZGdlLA0KKyAgICBYRkFfRUxFTUVOVF9TdGlwcGxlLA0KKyAgICBYRkFfRUxFTUVOVF9FeGNsR3JvdXAsDQorICAgIFhGQV9FTEVNRU5UX1Rvb2xUaXAsDQorICAgIFhGQV9FTEVNRU5UX1JlYXNvbiwNCisgICAgWEZBX0VMRU1FTlRfRXhlY3V0ZSwNCisgICAgWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0LA0KKyAgICBYRkFfRUxFTUVOVF9JbWFnZSwNCisgICAgWEZBX0VMRU1FTlRfVGltZVN0YW1wLA0KKyAgICBYRkFfRUxFTUVOVF9EZWNpbWFsLA0KKyAgICBYRkFfRUxFTUVOVF9TdWJmb3JtLA0KKyAgICBYRkFfRUxFTUVOVF9IYW5kbGVyLA0KKyAgICBYRkFfRUxFTUVOVF9Cb29sZWFuLA0KKyAgICBYRkFfRUxFTUVOVF9NZXNzYWdlLA0KKyAgICBYRkFfRUxFTUVOVF9Bc3Npc3QsDQorICAgIFhGQV9FTEVNRU5UX1BpY3R1cmUsDQorICAgIFhGQV9FTEVNRU5UX1RyYXZlcnNhbCwNCisgICAgWEZBX0VMRU1FTlRfQ29ybmVyLA0KKyAgICBYRkFfRUxFTUVOVF9Db2xvciwNCisgICAgWEZBX0VMRU1FTlRfS2VlcCwNCisgICAgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0LA0KKyAgICBYRkFfRUxFTUVOVF9WYWxpZGF0ZSwNCisgICAgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kcywNCisgICAgWEZBX0VMRU1FTlRfUGFnZVNldCwNCisgICAgWEZBX0VMRU1FTlRfSW50ZWdlciwNCisgICAgWEZBX0VMRU1FTlRfVHJhdmVyc2UsDQorICAgIFhGQV9FTEVNRU5UX0VuY29kaW5ncywNCisgICAgWEZBX0VMRU1FTlRfU2lnbmluZywNCisgICAgWEZBX0VMRU1FTlRfU2NyaXB0LA0KKyAgICBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQsDQorICAgIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0LA0KKyAgICBYRkFfRUxFTUVOVF9QYWdlQXJlYSwNCisgICAgWEZBX0VMRU1FTlRfT2lkcywNCisgICAgWEZBX0VMRU1FTlRfU2lnbmF0dXJlLA0KKyAgICBYRkFfRUxFTUVOVF9DYXB0aW9uLA0KKyAgICBYRkFfRUxFTUVOVF9FeERhdGEsDQorICAgIFhGQV9FTEVNRU5UX01hbmlmZXN0LA0KKyAgICBYRkFfRUxFTUVOVF9PdmVyZmxvdywNCisgICAgWEZBX0VMRU1FTlRfTGluZWFyLA0KKyAgICBYRkFfRUxFTUVOVF9EaWdlc3RNZXRob2QsDQorICAgIFhGQV9FTEVNRU5UX01lZGl1bSwNCisgICAgWEZBX0VMRU1FTlRfVGV4dEVkaXQsDQorICAgIFhGQV9FTEVNRU5UX1NpZ25EYXRhLA0KKyAgICBYRkFfRUxFTUVOVF9SZWN0YW5nbGUsDQorICAgIFhGQV9FTEVNRU5UX0RhdGUsDQorICAgIFhGQV9FTEVNRU5UX0Rlc2MsDQorICAgIFhGQV9FTEVNRU5UX0VuY3J5cHQsDQorICAgIFhGQV9FTEVNRU5UX0RyYXcsDQorICAgIFhGQV9FTEVNRU5UX1NwZWFrLA0KKyAgICBYRkFfRUxFTUVOVF9SZWFzb25zLA0KKyAgICBYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyLA0KKyAgICBYRkFfRUxFTUVOVF9GaWxsLA0KKyAgICBYRkFfRUxFTUVOVF9Gb250LA0KKyAgICBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZSwNCisgICAgWEZBX0VMRU1FTlRfRmxvYXQsDQorICAgIFhGQV9FTEVNRU5UX1ZhbHVlLA0KKyAgICBYRkFfRUxFTUVOVF9Cb29rZW5kLA0KKyAgICBYRkFfRUxFTUVOVF9FeE9iamVjdCwNCisgICAgWEZBX0VMRU1FTlRfQmluZEl0ZW1zLA0KKyAgICBYRkFfRUxFTUVOVF9DYWxjdWxhdGUsDQorICAgIFhGQV9FTEVNRU5UX0V4dHJhcywNCisgICAgWEZBX0VMRU1FTlRfQ29ubmVjdCwNCisgICAgWEZBX0VMRU1FTlRfU3VibWl0LA0KKyAgICBYRkFfRUxFTUVOVF9TdWJqZWN0RE4sDQorICAgIFhGQV9FTEVNRU5UX1JhZGlhbCwNCisgICAgWEZBX0VMRU1FTlRfVmFyaWFibGVzLA0KKyAgICBYRkFfRUxFTUVOVF9Mb2NrRG9jdW1lbnQsDQorICAgIFhGQV9FTEVNRU5UX0JyZWFrQWZ0ZXIsDQorICAgIFhGQV9FTEVNRU5UX0xpbmUsDQorICAgIFhGQV9FTEVNRU5UX09jY3VyLA0KKyAgICBYRkFfRUxFTUVOVF9JdGVtcywNCisgICAgWEZBX0VMRU1FTlRfRXh0cmFzLA0KKyAgICBYRkFfRUxFTUVOVF9Xc2RsQ29ubmVjdGlvbiwNCisgICAgWEZBX0VMRU1FTlRfWHNkQ29ubmVjdGlvbiwNCisgICAgWEZBX0VMRU1FTlRfWG1sQ29ubmVjdGlvbiwNCisgICAgWEZBX0VMRU1FTlRfU2lnbkRhdGEsDQorICAgIFhGQV9FTEVNRU5UX1RleHQsDQorICAgIFhGQV9FTEVNRU5UX1RpbWUsDQorICAgIFhGQV9FTEVNRU5UX0RhdGVUaW1lLA0KKyAgICBYRkFfRUxFTUVOVF9JbWFnZSwNCisgICAgWEZBX0VMRU1FTlRfRGVjaW1hbCwNCisgICAgWEZBX0VMRU1FTlRfQm9vbGVhbiwNCisgICAgWEZBX0VMRU1FTlRfSW50ZWdlciwNCisgICAgWEZBX0VMRU1FTlRfU2NyaXB0LA0KKyAgICBYRkFfRUxFTUVOVF9FeERhdGEsDQorICAgIFhGQV9FTEVNRU5UX01hbmlmZXN0LA0KKyAgICBYRkFfRUxFTUVOVF9EYXRlLA0KKyAgICBYRkFfRUxFTUVOVF9GbG9hdCwNCisgICAgWEZBX0VMRU1FTlRfQ29tbWFuZCwNCisgICAgWEZBX0VMRU1FTlRfQmluZCwNCisgICAgWEZBX0VMRU1FTlRfVGV4dCwNCisgICAgWEZBX0VMRU1FTlRfVGltZSwNCisgICAgWEZBX0VMRU1FTlRfRGF0ZVRpbWUsDQorICAgIFhGQV9FTEVNRU5UX0ltYWdlLA0KKyAgICBYRkFfRUxFTUVOVF9EZWNpbWFsLA0KKyAgICBYRkFfRUxFTUVOVF9Cb29sZWFuLA0KKyAgICBYRkFfRUxFTUVOVF9JbnRlZ2VyLA0KKyAgICBYRkFfRUxFTUVOVF9FeERhdGEsDQorICAgIFhGQV9FTEVNRU5UX0RhdGUsDQorICAgIFhGQV9FTEVNRU5UX0Zsb2F0LA0KIH07DQogZXh0ZXJuIGNvbnN0IFhGQV9FTEVNRU5USElFUkFSQ0hZIGdfWEZBRWxlbWVudEF0dHJpYnV0ZUluZGV4W10gPSB7DQotICAgIHswLCAzfSwJezMsIDJ9LAl7NSwgM30sCXs4LCAxMH0sCXsxOCwgMn0sCXsyMCwgNn0sCXsyNiwgMn0sCXsyOCwgMX0sCXsyOSwgMTN9LAl7NDIsIDJ9LAl7NDQsIDF9LAl7NDUsIDJ9LAl7NDcsIDJ9LAl7NDksIDd9LAl7NTYsIDB9LAl7NTYsIDR9LAl7NjAsIDJ9LAl7NjIsIDd9LAl7NjksIDB9LAl7NjksIDB9LA0KLSAgICB7NjksIDJ9LAl7NzEsIDJ9LAl7NzMsIDh9LAl7ODEsIDV9LAl7ODYsIDh9LAl7OTQsIDR9LAl7OTgsIDN9LAl7MTAxLCAzfSwJezEwNCwgM30sCXsxMDcsIDZ9LAl7MTEzLCAyfSwJezExNSwgMn0sCXsxMTcsIDJ9LAl7MTE5LCAyfSwJezEyMSwgM30sCXsxMjQsIDJ9LAl7MTI2LCA3fSwJezEzMywgMTN9LAl7MTQ2LCAyfSwJezE0OCwgNn0sDQotICAgIHsxNTQsIDJ9LAl7MTU2LCAzfSwJezE1OSwgMX0sCXsxNjAsIDE3fSwJezE3NywgMn0sCXsxNzksIDJ9LAl7MTgxLCA2fSwJezE4NywgMn0sCXsxODksIDJ9LAl7MTkxLCAzfSwJezE5NCwgN30sCXsyMDEsIDJ9LAl7MjAzLCAzfSwJezIwNiwgMH0sCXsyMDYsIDIxfSwJezIyNywgMX0sCXsyMjgsIDN9LAl7MjMxLCAyfSwJezIzMywgMH0sCXsyMzMsIDJ9LA0KLSAgICB7MjM1LCAyfSwJezIzNywgNn0sCXsyNDMsIDB9LAl7MjQzLCA0fSwJezI0NywgNH0sCXsyNTEsIDB9LAl7MjUxLCAyfSwJezI1MywgMn0sCXsyNTUsIDB9LAl7MjU1LCAwfSwJezI1NSwgMn0sCXsyNTcsIDJ9LAl7MjU5LCA0fSwJezI2MywgM30sCXsyNjYsIDd9LAl7MjczLCAxMH0sCXsyODMsIDl9LAl7MjkyLCA2fSwJezI5OCwgNH0sCXszMDIsIDJ9LA0KLSAgICB7MzA0LCAyfSwJezMwNiwgNn0sCXszMTIsIDR9LAl7MzE2LCAzfSwJezMxOSwgMn0sCXszMjEsIDJ9LAl7MzIzLCA0fSwJezMyNywgNH0sCXszMzEsIDR9LAl7MzM1LCA0fSwJezMzOSwgMn0sCXszNDEsIDJ9LAl7MzQzLCAyfSwJezM0NSwgMjJ9LAl7MzY3LCAzfSwJezM3MCwgMn0sCXszNzIsIDJ9LAl7Mzc0LCAyfSwJezM3NiwgOX0sCXszODUsIDB9LA0KLSAgICB7Mzg1LCA0fSwJezM4OSwgM30sCXszOTIsIDB9LAl7MzkyLCAyfSwJezM5NCwgN30sCXs0MDEsIDR9LAl7NDA1LCAyfSwJezQwNywgNH0sCXs0MTEsIDB9LAl7NDExLCAyMX0sCXs0MzIsIDR9LAl7NDM2LCAzfSwJezQzOSwgNH0sCXs0NDMsIDZ9LAl7NDQ5LCAyfSwJezQ1MSwgNX0sCXs0NTYsIDJ9LAl7NDU4LCA4fSwJezQ2NiwgMX0sCXs0NjcsIDJ9LA0KLSAgICB7NDY5LCAyfSwJezQ3MSwgNX0sCXs0NzYsIDB9LAl7NDc2LCAyfSwJezQ3OCwgMn0sCXs0ODAsIDZ9LAl7NDg2LCAyNn0sCXs1MTIsIDR9LAl7NTE2LCAyfSwJezUxOCwgMn0sCXs1MjAsIDR9LAl7NTI0LCAwfSwJezUyNCwgMn0sCXs1MjYsIDJ9LAl7NTI4LCAyfSwJezUzMCwgMn0sCXs1MzIsIDV9LAl7NTM3LCAyfSwJezUzOSwgM30sCXs1NDIsIDJ9LA0KLSAgICB7NTQ0LCA0fSwJezU0OCwgNX0sCXs1NTMsIDJ9LAl7NTU1LCAwfSwJezU1NSwgMn0sCXs1NTcsIDR9LAl7NTYxLCA1fSwJezU2NiwgM30sCXs1NjksIDJ9LAl7NTcxLCAzfSwJezU3NCwgMH0sCXs1NzQsIDJ9LAl7NTc2LCA5fSwJezU4NSwgMn0sCXs1ODcsIDV9LAl7NTkyLCA2fSwJezU5OCwgNX0sCXs2MDMsIDR9LAl7NjA3LCA0fSwJezYxMSwgOH0sDQotICAgIHs2MTksIDR9LAl7NjIzLCAwfSwJezYyMywgN30sCXs2MzAsIDR9LAl7NjM0LCA0fSwJezYzOCwgNX0sCXs2NDMsIDJ9LAl7NjQ1LCAyfSwJezY0NywgNH0sCXs2NTEsIDR9LAl7NjU1LCAyfSwJezY1NywgMn0sCXs2NTksIDF9LAl7NjYwLCAyfSwJezY2MiwgNX0sCXs2NjcsIDR9LAl7NjcxLCAzfSwJezY3NCwgMn0sCXs2NzYsIDJ9LAl7Njc4LCA0fSwNCi0gICAgezY4MiwgMH0sCXs2ODIsIDl9LAl7NjkxLCAyfSwJezY5MywgMn0sCXs2OTUsIDV9LAl7NzAwLCA0fSwJezcwNCwgM30sCXs3MDcsIDJ9LAl7NzA5LCAxMH0sCXs3MTksIDJ9LAl7NzIxLCA0fSwJezcyNSwgNH0sCXs3MjksIDJ9LAl7NzMxLCA2fSwJezczNywgMn0sCXs3MzksIDJ9LAl7NzQxLCA5fSwJezc1MCwgMX0sCXs3NTEsIDR9LAl7NzU1LCAzfSwNCi0gICAgezc1OCwgNX0sCXs3NjMsIDZ9LAl7NzY5LCA0fSwJezc3MywgMX0sCXs3NzQsIDR9LAl7Nzc4LCAwfSwJezc3OCwgM30sCXs3ODEsIDF9LAl7NzgyLCA1fSwJezc4NywgMTB9LAl7Nzk3LCA3fSwJezgwNCwgM30sCXs4MDcsIDJ9LAl7ODA5LCA1fSwJezgxNCwgMn0sCXs4MTYsIDB9LAl7ODE2LCAyfSwJezgxOCwgMn0sCXs4MjAsIDJ9LAl7ODIyLCA2fSwNCi0gICAgezgyOCwgMn0sCXs4MzAsIDF9LAl7ODMxLCAyfSwJezgzMywgMn0sCXs4MzUsIDh9LAl7ODQzLCAyfSwJezg0NSwgNH0sCXs4NDksIDR9LAl7ODUzLCA0fSwJezg1NywgMn0sCXs4NTksIDJ9LAl7ODYxLCAyfSwJezg2MywgM30sCXs4NjYsIDJ9LAl7ODY4LCAyfSwJezg3MCwgNH0sCXs4NzQsIDN9LAl7ODc3LCA1fSwJezg4MiwgMjB9LAl7OTAyLCAyfSwNCi0gICAgezkwNCwgMH0sCXs5MDQsIDJ9LAl7OTA2LCA2fSwJezkxMiwgMX0sCXs5MTMsIDJ9LAl7OTE1LCAxfSwJezkxNiwgMn0sCXs5MTgsIDR9LAl7OTIyLCAyfSwJezkyNCwgMn0sCXs5MjYsIDR9LAl7OTMwLCA0fSwJezkzNCwgMjB9LAl7OTU0LCAxfSwJezk1NSwgMn0sCXs5NTcsIDR9LAl7OTYxLCA0fSwJezk2NSwgMn0sCXs5NjcsIDJ9LAl7OTY5LCA0fSwNCi0gICAgezk3MywgMn0sCXs5NzUsIDB9LAl7OTc1LCAyfSwJezk3NywgNX0sCXs5ODIsIDV9LAl7OTg3LCA4fSwJezk5NSwgMn0sCXs5OTcsIDJ9LAl7OTk5LCA0fSwJezEwMDMsIDR9LAl7MTAwNywgMn0sCXsxMDA5LCA0fSwJezEwMTMsIDB9LAl7MTAxMywgMX0sCXsxMDE0LCAyfSwJezEwMTYsIDl9LAl7MTAyNSwgMn0sCXsxMDI3LCAwfSwJezEwMjcsIDh9LAl7MTAzNSwgMn0sDQotICAgIHsxMDM3LCAyfSwJezEwMzksIDB9LAl7MTAzOSwgNH0sCXsxMDQzLCAyfSwJezEwNDUsIDB9LAl7MTA0NSwgMn0sCXsxMDQ3LCAzfSwJezEwNTAsIDJ9LAl7MTA1MiwgNX0sCXsxMDU3LCAyfSwJezEwNTksIDJ9LAl7MTA2MSwgNH0sCXsxMDY1LCAzfSwJezEwNjgsIDB9LAl7MTA2OCwgNH0sCXsxMDcyLCAyfSwJezEwNzQsIDJ9LAl7MTA3NiwgM30sCXsxMDc5LCA0fSwJezEwODMsIDh9LA0KLSAgICB7MTA5MSwgNX0sCXsxMDk2LCAwfSwJezEwOTYsIDR9LAl7MTEwMCwgNn0sCXsxMTA2LCAyfSwJezExMDgsIDF9LAl7MTEwOSwgMn0sCXsxMTExLCAyfSwJezExMTMsIDJ9LAl7MTExNSwgMX0sCXsxMTE2LCAyfSwJezExMTgsIDd9LA0KKyAgICB7MCwgM30sICAgIHszLCAyfSwgICAgezUsIDN9LCAgICB7OCwgMTB9LCAgIHsxOCwgMn0sICAgezIwLCA2fSwgICB7MjYsIDJ9LA0KKyAgICB7MjgsIDF9LCAgIHsyOSwgMTN9LCAgezQyLCAyfSwgICB7NDQsIDF9LCAgIHs0NSwgMn0sICAgezQ3LCAyfSwgICB7NDksIDd9LA0KKyAgICB7NTYsIDB9LCAgIHs1NiwgNH0sICAgezYwLCAyfSwgICB7NjIsIDd9LCAgIHs2OSwgMH0sICAgezY5LCAwfSwgICB7NjksIDJ9LA0KKyAgICB7NzEsIDJ9LCAgIHs3MywgOH0sICAgezgxLCA1fSwgICB7ODYsIDh9LCAgIHs5NCwgNH0sICAgezk4LCAzfSwgICB7MTAxLCAzfSwNCisgICAgezEwNCwgM30sICB7MTA3LCA2fSwgIHsxMTMsIDJ9LCAgezExNSwgMn0sICB7MTE3LCAyfSwgIHsxMTksIDJ9LCAgezEyMSwgM30sDQorICAgIHsxMjQsIDJ9LCAgezEyNiwgN30sICB7MTMzLCAxM30sIHsxNDYsIDJ9LCAgezE0OCwgNn0sICB7MTU0LCAyfSwgIHsxNTYsIDN9LA0KKyAgICB7MTU5LCAxfSwgIHsxNjAsIDE3fSwgezE3NywgMn0sICB7MTc5LCAyfSwgIHsxODEsIDZ9LCAgezE4NywgMn0sICB7MTg5LCAyfSwNCisgICAgezE5MSwgM30sICB7MTk0LCA3fSwgIHsyMDEsIDJ9LCAgezIwMywgM30sICB7MjA2LCAwfSwgIHsyMDYsIDIxfSwgezIyNywgMX0sDQorICAgIHsyMjgsIDN9LCAgezIzMSwgMn0sICB7MjMzLCAwfSwgIHsyMzMsIDJ9LCAgezIzNSwgMn0sICB7MjM3LCA2fSwgIHsyNDMsIDB9LA0KKyAgICB7MjQzLCA0fSwgIHsyNDcsIDR9LCAgezI1MSwgMH0sICB7MjUxLCAyfSwgIHsyNTMsIDJ9LCAgezI1NSwgMH0sICB7MjU1LCAwfSwNCisgICAgezI1NSwgMn0sICB7MjU3LCAyfSwgIHsyNTksIDR9LCAgezI2MywgM30sICB7MjY2LCA3fSwgIHsyNzMsIDEwfSwgezI4MywgOX0sDQorICAgIHsyOTIsIDZ9LCAgezI5OCwgNH0sICB7MzAyLCAyfSwgIHszMDQsIDJ9LCAgezMwNiwgNn0sICB7MzEyLCA0fSwgIHszMTYsIDN9LA0KKyAgICB7MzE5LCAyfSwgIHszMjEsIDJ9LCAgezMyMywgNH0sICB7MzI3LCA0fSwgIHszMzEsIDR9LCAgezMzNSwgNH0sICB7MzM5LCAyfSwNCisgICAgezM0MSwgMn0sICB7MzQzLCAyfSwgIHszNDUsIDIyfSwgezM2NywgM30sICB7MzcwLCAyfSwgIHszNzIsIDJ9LCAgezM3NCwgMn0sDQorICAgIHszNzYsIDl9LCAgezM4NSwgMH0sICB7Mzg1LCA0fSwgIHszODksIDN9LCAgezM5MiwgMH0sICB7MzkyLCAyfSwgIHszOTQsIDd9LA0KKyAgICB7NDAxLCA0fSwgIHs0MDUsIDJ9LCAgezQwNywgNH0sICB7NDExLCAwfSwgIHs0MTEsIDIxfSwgezQzMiwgNH0sICB7NDM2LCAzfSwNCisgICAgezQzOSwgNH0sICB7NDQzLCA2fSwgIHs0NDksIDJ9LCAgezQ1MSwgNX0sICB7NDU2LCAyfSwgIHs0NTgsIDh9LCAgezQ2NiwgMX0sDQorICAgIHs0NjcsIDJ9LCAgezQ2OSwgMn0sICB7NDcxLCA1fSwgIHs0NzYsIDB9LCAgezQ3NiwgMn0sICB7NDc4LCAyfSwgIHs0ODAsIDZ9LA0KKyAgICB7NDg2LCAyNn0sIHs1MTIsIDR9LCAgezUxNiwgMn0sICB7NTE4LCAyfSwgIHs1MjAsIDR9LCAgezUyNCwgMH0sICB7NTI0LCAyfSwNCisgICAgezUyNiwgMn0sICB7NTI4LCAyfSwgIHs1MzAsIDJ9LCAgezUzMiwgNX0sICB7NTM3LCAyfSwgIHs1MzksIDN9LCAgezU0MiwgMn0sDQorICAgIHs1NDQsIDR9LCAgezU0OCwgNX0sICB7NTUzLCAyfSwgIHs1NTUsIDB9LCAgezU1NSwgMn0sICB7NTU3LCA0fSwgIHs1NjEsIDV9LA0KKyAgICB7NTY2LCAzfSwgIHs1NjksIDJ9LCAgezU3MSwgM30sICB7NTc0LCAwfSwgIHs1NzQsIDJ9LCAgezU3NiwgOX0sICB7NTg1LCAyfSwNCisgICAgezU4NywgNX0sICB7NTkyLCA2fSwgIHs1OTgsIDV9LCAgezYwMywgNH0sICB7NjA3LCA0fSwgIHs2MTEsIDh9LCAgezYxOSwgNH0sDQorICAgIHs2MjMsIDB9LCAgezYyMywgN30sICB7NjMwLCA0fSwgIHs2MzQsIDR9LCAgezYzOCwgNX0sICB7NjQzLCAyfSwgIHs2NDUsIDJ9LA0KKyAgICB7NjQ3LCA0fSwgIHs2NTEsIDR9LCAgezY1NSwgMn0sICB7NjU3LCAyfSwgIHs2NTksIDF9LCAgezY2MCwgMn0sICB7NjYyLCA1fSwNCisgICAgezY2NywgNH0sICB7NjcxLCAzfSwgIHs2NzQsIDJ9LCAgezY3NiwgMn0sICB7Njc4LCA0fSwgIHs2ODIsIDB9LCAgezY4MiwgOX0sDQorICAgIHs2OTEsIDJ9LCAgezY5MywgMn0sICB7Njk1LCA1fSwgIHs3MDAsIDR9LCAgezcwNCwgM30sICB7NzA3LCAyfSwgIHs3MDksIDEwfSwNCisgICAgezcxOSwgMn0sICB7NzIxLCA0fSwgIHs3MjUsIDR9LCAgezcyOSwgMn0sICB7NzMxLCA2fSwgIHs3MzcsIDJ9LCAgezczOSwgMn0sDQorICAgIHs3NDEsIDl9LCAgezc1MCwgMX0sICB7NzUxLCA0fSwgIHs3NTUsIDN9LCAgezc1OCwgNX0sICB7NzYzLCA2fSwgIHs3NjksIDR9LA0KKyAgICB7NzczLCAxfSwgIHs3NzQsIDR9LCAgezc3OCwgMH0sICB7Nzc4LCAzfSwgIHs3ODEsIDF9LCAgezc4MiwgNX0sICB7Nzg3LCAxMH0sDQorICAgIHs3OTcsIDd9LCAgezgwNCwgM30sICB7ODA3LCAyfSwgIHs4MDksIDV9LCAgezgxNCwgMn0sICB7ODE2LCAwfSwgIHs4MTYsIDJ9LA0KKyAgICB7ODE4LCAyfSwgIHs4MjAsIDJ9LCAgezgyMiwgNn0sICB7ODI4LCAyfSwgIHs4MzAsIDF9LCAgezgzMSwgMn0sICB7ODMzLCAyfSwNCisgICAgezgzNSwgOH0sICB7ODQzLCAyfSwgIHs4NDUsIDR9LCAgezg0OSwgNH0sICB7ODUzLCA0fSwgIHs4NTcsIDJ9LCAgezg1OSwgMn0sDQorICAgIHs4NjEsIDJ9LCAgezg2MywgM30sICB7ODY2LCAyfSwgIHs4NjgsIDJ9LCAgezg3MCwgNH0sICB7ODc0LCAzfSwgIHs4NzcsIDV9LA0KKyAgICB7ODgyLCAyMH0sIHs5MDIsIDJ9LCAgezkwNCwgMH0sICB7OTA0LCAyfSwgIHs5MDYsIDZ9LCAgezkxMiwgMX0sICB7OTEzLCAyfSwNCisgICAgezkxNSwgMX0sICB7OTE2LCAyfSwgIHs5MTgsIDR9LCAgezkyMiwgMn0sICB7OTI0LCAyfSwgIHs5MjYsIDR9LCAgezkzMCwgNH0sDQorICAgIHs5MzQsIDIwfSwgezk1NCwgMX0sICB7OTU1LCAyfSwgIHs5NTcsIDR9LCAgezk2MSwgNH0sICB7OTY1LCAyfSwgIHs5NjcsIDJ9LA0KKyAgICB7OTY5LCA0fSwgIHs5NzMsIDJ9LCAgezk3NSwgMH0sICB7OTc1LCAyfSwgIHs5NzcsIDV9LCAgezk4MiwgNX0sICB7OTg3LCA4fSwNCisgICAgezk5NSwgMn0sICB7OTk3LCAyfSwgIHs5OTksIDR9LCAgezEwMDMsIDR9LCB7MTAwNywgMn0sIHsxMDA5LCA0fSwgezEwMTMsIDB9LA0KKyAgICB7MTAxMywgMX0sIHsxMDE0LCAyfSwgezEwMTYsIDl9LCB7MTAyNSwgMn0sIHsxMDI3LCAwfSwgezEwMjcsIDh9LCB7MTAzNSwgMn0sDQorICAgIHsxMDM3LCAyfSwgezEwMzksIDB9LCB7MTAzOSwgNH0sIHsxMDQzLCAyfSwgezEwNDUsIDB9LCB7MTA0NSwgMn0sIHsxMDQ3LCAzfSwNCisgICAgezEwNTAsIDJ9LCB7MTA1MiwgNX0sIHsxMDU3LCAyfSwgezEwNTksIDJ9LCB7MTA2MSwgNH0sIHsxMDY1LCAzfSwgezEwNjgsIDB9LA0KKyAgICB7MTA2OCwgNH0sIHsxMDcyLCAyfSwgezEwNzQsIDJ9LCB7MTA3NiwgM30sIHsxMDc5LCA0fSwgezEwODMsIDh9LCB7MTA5MSwgNX0sDQorICAgIHsxMDk2LCAwfSwgezEwOTYsIDR9LCB7MTEwMCwgNn0sIHsxMTA2LCAyfSwgezExMDgsIDF9LCB7MTEwOSwgMn0sIHsxMTExLCAyfSwNCisgICAgezExMTMsIDJ9LCB7MTExNSwgMX0sIHsxMTE2LCAyfSwgezExMTgsIDd9LA0KIH07DQogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19YRkFFbGVtZW50QXR0cmlidXRlRGF0YVtdID0gew0KLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLA0KLSAgICBYRkFfQVRUUklCVVRFX01heCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfRW9mQWN0aW9uLAlYRkFfQVRUUklCVVRFX0N1cnNvclR5cGUsCVhGQV9BVFRSSUJVVEVfTG9ja1R5cGUsCVhGQV9BVFRSSUJVVEVfQm9mQWN0aW9uLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfQ3Vyc29yTG9jYXRpb24sCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLA0KLSAgICBYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1JlbGF0aW9uLAlYRkFfQVRUUklCVVRFX1JlbGV2YW50LAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfSWQsDQotICAgIFhGQV9BVFRSSUJVVEVfQmVmb3JlVGFyZ2V0LAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwJWEZBX0FUVFJJQlVURV9PdmVyZmxvd0xlYWRlciwJWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsCVhGQV9BVFRSSUJVVEVfU3RhcnROZXcsCVhGQV9BVFRSSUJVVEVfQm9va2VuZFRyYWlsZXIsCVhGQV9BVFRSSUJVVEVfQWZ0ZXIsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9Cb29rZW5kTGVhZGVyLA0KLSAgICBYRkFfQVRUUklCVVRFX0FmdGVyVGFyZ2V0LAlYRkFfQVRUUklCVVRFX0JlZm9yZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwsCVhGQV9BVFRSSUJVVEVfTWFyaywJWEZBX0FUVFJJQlVURV9TaGFwZSwJWEZBX0FUVFJJQlVURV9TaXplLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1N0YXJ0QW5nbGUsCVhGQV9BVFRSSUJVVEVfU3dlZXBBbmdsZSwJWEZBX0FUVFJJQlVURV9DaXJjdWxhciwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0hhbmQsCVhGQV9BVFRSSUJVVEVfRGVzYywNCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9CaW5kLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Gcm9tLA0KLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9QZXJtaXNzaW9ucywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfU3RhcnROZXcsCVhGQV9BVFRSSUJVVEVfVHJhaWxlciwNCi0gICAgWEZBX0FUVFJJQlVURV9UYXJnZXRUeXBlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfVGFyZ2V0LAlYRkFfQVRUUklCVVRFX0xlYWRlciwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfRGVzYywNCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfVGltZVN0YW1wLAlYRkFfQVRUUklCVVRFX1V1aWQsCVhGQV9BVFRSSUJVVEVfRGVzYywNCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LAlYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LA0KLSAgICBYRkFfQVRUUklCVVRFX1RvcEluc2V0LAlYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfTm9uUmVwdWRpYXRpb24sCVhGQV9BVFRSSUJVVEVfRW5jaXBoZXJPbmx5LAlYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfRGlnaXRhbFNpZ25hdHVyZSwJWEZBX0FUVFJJQlVURV9DcmxTaWduLA0KLSAgICBYRkFfQVRUUklCVVRFX0tleUFncmVlbWVudCwJWEZBX0FUVFJJQlVURV9LZXlFbmNpcGhlcm1lbnQsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EYXRhRW5jaXBoZXJtZW50LAlYRkFfQVRUUklCVVRFX0tleUNlcnRTaWduLAlYRkFfQVRUUklCVVRFX0RlY2lwaGVyT25seSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLA0KLSAgICBYRkFfQVRUUklCVVRFX09wZW4sCVhGQV9BVFRSSUJVVEVfQ29tbWl0T24sCVhGQV9BVFRSSUJVVEVfVGV4dEVudHJ5LAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX05hbWUsDQotICAgIFhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfSEFsaWduLAlYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1dpZG93cywJWEZBX0FUVFJJQlVURV9NYXJnaW5SaWdodCwJWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LAlYRkFfQVRUUklCVVRFX1JhZGl4T2Zmc2V0LAlYRkFfQVRUUklCVVRFX1ByZXNlcnZlLAlYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csDQotICAgIFhGQV9BVFRSSUJVVEVfVkFsaWduLAlYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsCVhGQV9BVFRSSUJVVEVfVGFiU3RvcHMsCVhGQV9BVFRSSUJVVEVfT3JwaGFucywJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsCVhGQV9BVFRSSUJVVEVfU3BhY2VBYm92ZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywNCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1ZlcnNpb24sCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9BZGRSZXZvY2F0aW9uSW5mbywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywNCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfUmVmLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9MaXN0ZW4sCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCi0gICAgWEZBX0FUVFJJQlVURV9BY3Rpdml0eSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9EYXRhUHJlcCwNCi0gICAgWEZBX0FUVFJJQlVURV9UeXBlLAlYRkFfQVRUUklCVVRFX1RleHRMb2NhdGlvbiwJWEZBX0FUVFJJQlVURV9Nb2R1bGVXaWR0aCwJWEZBX0FUVFJJQlVURV9QcmludENoZWNrRGlnaXQsCVhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LAlYRkFfQVRUUklCVVRFX1N0YXJ0Q2hhciwJWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwJWEZBX0FUVFJJQlVURV9XaWRlTmFycm93UmF0aW8sCVhGQV9BVFRSSUJVVEVfRXJyb3JDb3JyZWN0aW9uTGV2ZWwsCVhGQV9BVFRSSUJVVEVfVXBzTW9kZSwNCi0gICAgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwJWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EYXRhQ29sdW1uQ291bnQsCVhGQV9BVFRSSUJVVEVfUm93Q29sdW1uUmF0aW8sCVhGQV9BVFRSSUJVVEVfRGF0YUxlbmd0aCwJWEZBX0FUVFJJQlVURV9FbmRDaGFyLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfRm9ybWF0LAlYRkFfQVRUUklCVVRFX0Rlc2MsDQotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwNCi0gICAgWEZBX0FUVFJJQlVURV9PdXRwdXQsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JbnB1dCwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVHlwZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9UeXBlLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsDQotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSGlnaGxpZ2h0LAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX0JyZWFrLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwNCi0gICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0hhbmQsCVhGQV9BVFRSSUJVVEVfWCwJWEZBX0FUVFJJQlVURV9ZLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0xldmVsLAlYRkFfQVRUUklCVVRFX1JlbGV2YW50LA0KLSAgICBYRkFfQVRUUklCVVRFX0NvbFNwYW4sCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Xb3JkQ2hhcmFjdGVyQ291bnQsCVhGQV9BVFRSSUJVVEVfSHlwaGVuYXRlLAlYRkFfQVRUUklCVVRFX0V4Y2x1ZGVJbml0aWFsQ2FwLAlYRkFfQVRUUklCVVRFX1B1c2hDaGFyYWN0ZXJDb3VudCwJWEZBX0FUVFJJQlVURV9SZW1haW5DaGFyYWN0ZXJDb3VudCwNCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0V4Y2x1ZGVBbGxDYXBzLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfUmlkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9NYXhDaGFycywJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsDQotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9VcmwsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0NyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksDQotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9VcmxQb2xpY3ksCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9SZWYsCVhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwJWEZBX0FUVFJJQlVURV9UYXJnZXQsCVhGQV9BVFRSSUJVVEVfRGVzYywNCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9YLAlYRkFfQVRUUklCVVRFX1ksCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVHlwZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsDQotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0gsCVhGQV9BVFRSSUJVVEVfVywJWEZBX0FUVFJJQlVURV9YLAlYRkFfQVRUUklCVVRFX1ksCVhGQV9BVFRSSUJVVEVfSWQsDQotICAgIFhGQV9BVFRSSUJVVEVfSEFsaWduLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0FjY2VzcywJWEZBX0FUVFJJQlVURV9Sb3RhdGUsCVhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsCVhGQV9BVFRSSUJVVEVfVkFsaWduLAlYRkFfQVRUUklCVVRFX01heEgsCVhGQV9BVFRSSUJVVEVfTWF4VywJWEZBX0FUVFJJQlVURV9NaW5ILA0KLSAgICBYRkFfQVRUUklCVVRFX01pblcsCVhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsCVhGQV9BVFRSSUJVVEVfQ29sU3BhbiwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0xvY2FsZSwJWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLAlYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywNCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9ILAlYRkFfQVRUUklCVVRFX1csCVhGQV9BVFRSSUJVVEVfWCwJWEZBX0FUVFJJQlVURV9ZLA0KLSAgICBYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1JlbGV2YW50LAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwNCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfQ2FwLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9TdHJva2UsCVhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsCVhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1JhdGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfU291cmNlQmVsb3csCVhGQV9BVFRSSUJVVEVfT3V0cHV0QmVsb3csCVhGQV9BVFRSSUJVVEVfU291cmNlQWJvdmUsDQotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9ILAlYRkFfQVRUUklCVVRFX1csCVhGQV9BVFRSSUJVVEVfWCwJWEZBX0FUVFJJQlVURV9ZLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX0hBbGlnbiwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9BY2Nlc3MsDQotICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsCVhGQV9BVFRSSUJVVEVfVkFsaWduLAlYRkFfQVRUUklCVVRFX01heEgsCVhGQV9BVFRSSUJVVEVfTWF4VywJWEZBX0FUVFJJQlVURV9NaW5ILAlYRkFfQVRUUklCVVRFX01pblcsCVhGQV9BVFRSSUJVVEVfTGF5b3V0LAlYRkFfQVRUUklCVVRFX1JlbGV2YW50LAlYRkFfQVRUUklCVVRFX0NvbFNwYW4sCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCi0gICAgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLAlYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9SaWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9TY29wZSwJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLA0KLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sCVhGQV9BVFRSSUJVVEVfUnVuQXQsCVhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLA0KLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfUGlja2VyLAlYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsDQotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLAlYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9Bc3BlY3QsCVhGQV9BVFRSSUJVVEVfSHJlZiwJWEZBX0FUVFJJQlVURV9WYWx1ZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywNCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9UeXBlLAlYRkFfQVRUUklCVVRFX1NlcnZlciwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssDQotICAgIFhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0xlYWREaWdpdHMsCVhGQV9BVFRSSUJVVEVfSCwJWEZBX0FUVFJJQlVURV9XLAlYRkFfQVRUUklCVVRFX1gsCVhGQV9BVFRSSUJVVEVfWSwNCi0gICAgWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9IQWxpZ24sCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfQWxsb3dNYWNybywJWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsCVhGQV9BVFRSSUJVVEVfQWNjZXNzLAlYRkFfQVRUUklCVVRFX1ByZXNlbmNlLAlYRkFfQVRUUklCVVRFX1ZBbGlnbiwJWEZBX0FUVFJJQlVURV9NYXhILA0KLSAgICBYRkFfQVRUUklCVVRFX01heFcsCVhGQV9BVFRSSUJVVEVfTWluSCwJWEZBX0FUVFJJQlVURV9NaW5XLAlYRkFfQVRUUklCVVRFX0xheW91dCwJWEZBX0FUVFJJQlVURV9SZWxldmFudCwJWEZBX0FUVFJJQlVURV9NZXJnZU1vZGUsCVhGQV9BVFRSSUJVVEVfQ29sU3BhbiwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0xvY2FsZSwJWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLA0KLSAgICBYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSwJWEZBX0FUVFJJQlVURV9TY29wZSwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssDQotICAgIFhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywNCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVGltZW91dCwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9Nb2RlLA0KLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsDQotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfUm9sZSwNCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLA0KLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9TdHJva2UsCVhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsDQotICAgIFhGQV9BVFRSSUJVVEVfSW52ZXJ0ZWQsCVhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSm9pbiwJWEZBX0FUVFJJQlVURV9SYWRpdXMsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9DU3BhY2UsDQotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9WYWx1ZSwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OZXh0LAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9QcmV2aW91cywJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0ludGFjdCwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Db21tYW5kVHlwZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQotICAgIFhGQV9BVFRSSUJVVEVfRGF0YSwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfU2NyaXB0VGVzdCwJWEZBX0FUVFJJQlVURV9OdWxsVGVzdCwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9UeXBlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfUmVsYXRpb24sCVhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsCVhGQV9BVFRSSUJVVEVfRHVwbGV4SW1wb3NpdGlvbiwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KLSAgICBYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9UbywJWEZBX0FUVFJJQlVURV9Gb3JjZSwNCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0Zyb20sCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX1ZhbHVlLA0KLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfRGF0YURlc2NyaXB0aW9uLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1JlZiwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsDQotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0Jhc2VQcm9maWxlLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsDQotICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLAlYRkFfQVRUUklCVVRFX1J1bkF0LAlYRkFfQVRUUklCVVRFX0JpbmRpbmcsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLA0KLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfUGFzc3dvcmRDaGFyLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwNCi0gICAgWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwNCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24sCVhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLAlYRkFfQVRUUklCVVRFX1JlbGV2YW50LAlYRkFfQVRUUklCVVRFX0luaXRpYWxOdW1iZXIsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9OdW1iZXJlZCwJWEZBX0FUVFJJQlVURV9CbGFua09yTm90QmxhbmssCVhGQV9BVFRSSUJVVEVfRGVzYywNCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9UeXBlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLA0KLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1Jlc2VydmUsCVhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9QbGFjZW1lbnQsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsDQotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1JpZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsCVhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX01heExlbmd0aCwJWEZBX0FUVFJJQlVURV9IcmVmLA0KLSAgICBYRkFfQVRUUklCVVRFX0FiYnIsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX1dyaXRpbmdTY3JpcHQsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9BY3Rpb24sCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVHJhaWxlciwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX1RhcmdldCwJWEZBX0FUVFJJQlVURV9MZWFkZXIsCVhGQV9BVFRSSUJVVEVfSWQsDQotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9UbywJWEZBX0FUVFJJQlVURV9Vbmljb2RlUmFuZ2UsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Gcm9tLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVHJheU91dCwJWEZBX0FUVFJJQlVURV9Vc2UsDQotICAgIFhGQV9BVFRSSUJVVEVfT3JpZW50YXRpb24sCVhGQV9BVFRSSUJVVEVfSW1hZ2luZ0JCb3gsCVhGQV9BVFRSSUJVVEVfU2hvcnQsCVhGQV9BVFRSSUJVVEVfVHJheUluLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfU3RvY2ssCVhGQV9BVFRSSUJVVEVfTG9uZywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9WU2Nyb2xsUG9saWN5LAlYRkFfQVRUUklCVVRFX1VzZSwNCi0gICAgWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LAlYRkFfQVRUUklCVVRFX011bHRpTGluZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9NYXhFbnRyaWVzLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX05hbWUsDQotICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsCVhGQV9BVFRSSUJVVEVfQ29udGFpbnMsCVhGQV9BVFRSSUJVVEVfVmFsdWUsCVhGQV9BVFRSSUJVVEVfSXNOdWxsLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sDQotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1JlZiwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfVGFyZ2V0LAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywNCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9SZWYsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLA0KLSAgICBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9NYXRjaCwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwNCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9IYW5kLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsDQotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywNCi0gICAgWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9ILAlYRkFfQVRUUklCVVRFX1csCVhGQV9BVFRSSUJVVEVfWCwJWEZBX0FUVFJJQlVURV9ZLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX0hBbGlnbiwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwNCi0gICAgWEZBX0FUVFJJQlVURV9Sb3RhdGUsCVhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsCVhGQV9BVFRSSUJVVEVfVkFsaWduLAlYRkFfQVRUUklCVVRFX01heEgsCVhGQV9BVFRSSUJVVEVfTWF4VywJWEZBX0FUVFJJQlVURV9NaW5ILAlYRkFfQVRUUklCVVRFX01pblcsCVhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsCVhGQV9BVFRSSUJVVEVfQ29sU3BhbiwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KLSAgICBYRkFfQVRUUklCVVRFX0xvY2FsZSwJWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfUmlkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Qcmlvcml0eSwNCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rpc2FibGUsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfVmFsdWUsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwNCi0gICAgWEZBX0FUVFJJQlVURV9UeXBlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9UeXBlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQotICAgIFhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1ByZXNlbmNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2gsCVhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsCVhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsDQotICAgIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lLAlYRkFfQVRUUklCVVRFX0Jhc2VsaW5lU2hpZnQsCVhGQV9BVFRSSUJVVEVfT3ZlcmxpbmVQZXJpb2QsCVhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywJWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaFBlcmlvZCwJWEZBX0FUVFJJQlVURV9Gb250VmVydGljYWxTY2FsZSwJWEZBX0FUVFJJQlVURV9Qc05hbWUsCVhGQV9BVFRSSUJVVEVfU2l6ZSwJWEZBX0FUVFJJQlVURV9Qb3N0dXJlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQotICAgIFhGQV9BVFRSSUJVVEVfV2VpZ2h0LAlYRkFfQVRUUklCVVRFX1VuZGVybGluZVBlcmlvZCwJWEZBX0FUVFJJQlVURV9PdmVybGluZSwJWEZBX0FUVFJJQlVURV9HZW5lcmljRmFtaWx5LAlYRkFfQVRUUklCVVRFX0NoZWNrc3VtLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwNCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwNCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1JlbGV2YW50LA0KLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1RyYWlsZXIsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9MZWFkZXIsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsDQotICAgIFhGQV9BVFRSSUJVVEVfQ29kZVR5cGUsCVhGQV9BVFRSSUJVVEVfQXJjaGl2ZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0NvZGVCYXNlLAlYRkFfQVRUUklCVVRFX0NsYXNzSWQsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9SZWYsDQotICAgIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwJWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwJWEZBX0FUVFJJQlVURV9WYWx1ZVJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9PdmVycmlkZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsDQotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9WYWx1ZSwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9SZWYsCVhGQV9BVFRSSUJVVEVfVXNlLA0KLSAgICBYRkFfQVRUUklCVVRFX1RpbWVvdXQsCVhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwJWEZBX0FUVFJJQlVURV9Vc2FnZSwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0RlbGF5ZWRPcGVuLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfRm9ybWF0LA0KLSAgICBYRkFfQVRUUklCVVRFX0VtYmVkUERGLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfVGFyZ2V0LAlYRkFfQVRUUklCVVRFX1RleHRFbmNvZGluZywJWEZBX0FUVFJJQlVURV9YZHBDb250ZW50LAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsDQotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLA0KLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9OYW1lLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9EZWxpbWl0ZXIsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywNCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9UeXBlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTmFtZSwNCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX1JlZiwJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfSWQsDQotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1R5cGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfU3RhcnROZXcsCVhGQV9BVFRSSUJVVEVfVHJhaWxlciwJWEZBX0FUVFJJQlVURV9UYXJnZXRUeXBlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsCVhGQV9BVFRSSUJVVEVfVGFyZ2V0LA0KLSAgICBYRkFfQVRUUklCVVRFX0xlYWRlciwJWEZBX0FUVFJJQlVURV9JZCwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfU2xvcGUsCVhGQV9BVFRSSUJVVEVfVXNlaHJlZiwJWEZBX0FUVFJJQlVURV9IYW5kLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfVXNlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQotICAgIFhGQV9BVFRSSUJVVEVfSWQsCVhGQV9BVFRSSUJVVEVfTWF4LAlYRkFfQVRUUklCVVRFX01pbiwJWEZBX0FUVFJJQlVURV9Vc2UsCVhGQV9BVFRSSUJVVEVfSW5pdGlhbCwJWEZBX0FUVFJJQlVURV9Vc2VocmVmLAlYRkFfQVRUUklCVVRFX0Rlc2MsCVhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9BYmJyLAlYRkFfQVRUUklCVVRFX0Rlc2MsDQotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywJWEZBX0FUVFJJQlVURV9EZXNjLAlYRkFfQVRUUklCVVRFX0xvY2ssCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX05hbWUsCVhGQV9BVFRSSUJVVEVfRGVzYywJWEZBX0FUVFJJQlVURV9Mb2NrLAlYRkFfQVRUUklCVVRFX0lkLAlYRkFfQVRUUklCVVRFX05hbWUsDQotICAgIFhGQV9BVFRSSUJVVEVfUmVmLAlYRkFfQVRUUklCVVRFX1VzZSwJWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwJWEZBX0FUVFJJQlVURV9TYXZlLAlYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Fb2ZBY3Rpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfQ3Vyc29yVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Cb2ZBY3Rpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9DdXJzb3JMb2NhdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9CZWZvcmVUYXJnZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX092ZXJmbG93VGFyZ2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX092ZXJmbG93VHJhaWxlciwNCisgICAgWEZBX0FUVFJJQlVURV9TdGFydE5ldywNCisgICAgWEZBX0FUVFJJQlVURV9Cb29rZW5kVHJhaWxlciwNCisgICAgWEZBX0FUVFJJQlVURV9BZnRlciwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Jvb2tlbmRMZWFkZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfQWZ0ZXJUYXJnZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfQmVmb3JlLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCwNCisgICAgWEZBX0FUVFJJQlVURV9NYXJrLA0KKyAgICBYRkFfQVRUUklCVVRFX1NoYXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1NpemUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwNCisgICAgWEZBX0FUVFJJQlVURV9Td2VlcEFuZ2xlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NpcmN1bGFyLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSGFuZCwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0JpbmQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0Zyb20sDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfU2lnbmF0dXJlVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1Blcm1pc3Npb25zLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9TdGFydE5ldywNCisgICAgWEZBX0FUVFJJQlVURV9UcmFpbGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9UaW1lU3RhbXAsDQorICAgIFhGQV9BVFRSSUJVVEVfVXVpZCwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Ob25SZXB1ZGlhdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9FbmNpcGhlck9ubHksDQorICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9EaWdpdGFsU2lnbmF0dXJlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NybFNpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfS2V5QWdyZWVtZW50LA0KKyAgICBYRkFfQVRUUklCVVRFX0tleUVuY2lwaGVybWVudCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0RhdGFFbmNpcGhlcm1lbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfS2V5Q2VydFNpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfRGVjaXBoZXJPbmx5LA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfT3BlbiwNCisgICAgWEZBX0FUVFJJQlVURV9Db21taXRPbiwNCisgICAgWEZBX0FUVFJJQlVURV9UZXh0RW50cnksDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfVGV4dEluZGVudCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfV2lkb3dzLA0KKyAgICBYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LA0KKyAgICBYRkFfQVRUUklCVVRFX01hcmdpbkxlZnQsDQorICAgIFhGQV9BVFRSSUJVVEVfUmFkaXhPZmZzZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VydmUsDQorICAgIFhGQV9BVFRSSUJVVEVfU3BhY2VCZWxvdywNCisgICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfVGFiRGVmYXVsdCwNCisgICAgWEZBX0FUVFJJQlVURV9UYWJTdG9wcywNCisgICAgWEZBX0FUVFJJQlVURV9PcnBoYW5zLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTGluZUhlaWdodCwNCisgICAgWEZBX0FUVFJJQlVURV9TcGFjZUFib3ZlLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVmVyc2lvbiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0FkZFJldm9jYXRpb25JbmZvLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9SZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0xpc3RlbiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0FjdGl2aXR5LA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhUm93Q291bnQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0RhdGFQcmVwLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVGV4dExvY2F0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX01vZHVsZVdpZHRoLA0KKyAgICBYRkFfQVRUUklCVVRFX1ByaW50Q2hlY2tEaWdpdCwNCisgICAgWEZBX0FUVFJJQlVURV9Nb2R1bGVIZWlnaHQsDQorICAgIFhGQV9BVFRSSUJVVEVfU3RhcnRDaGFyLA0KKyAgICBYRkFfQVRUUklCVVRFX1RydW5jYXRlLA0KKyAgICBYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywNCisgICAgWEZBX0FUVFJJQlVURV9FcnJvckNvcnJlY3Rpb25MZXZlbCwNCisgICAgWEZBX0FUVFJJQlVURV9VcHNNb2RlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLA0KKyAgICBYRkFfQVRUUklCVVRFX0NoYXJFbmNvZGluZywNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwNCisgICAgWEZBX0FUVFJJQlVURV9Sb3dDb2x1bW5SYXRpbywNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhTGVuZ3RoLA0KKyAgICBYRkFfQVRUUklCVVRFX0VuZENoYXIsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Gb3JtYXQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX091dHB1dCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lucHV0LA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX0RhdGFEZXNjcmlwdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfQnJlYWssDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSGFuZCwNCisgICAgWEZBX0FUVFJJQlVURV9YLA0KKyAgICBYRkFfQVRUUklCVVRFX1ksDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfTGV2ZWwsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1dvcmRDaGFyYWN0ZXJDb3VudCwNCisgICAgWEZBX0FUVFJJQlVURV9IeXBoZW5hdGUsDQorICAgIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUluaXRpYWxDYXAsDQorICAgIFhGQV9BVFRSSUJVVEVfUHVzaENoYXJhY3RlckNvdW50LA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUFsbENhcHMsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9SaWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX01heENoYXJzLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VybCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfQ3JlZGVudGlhbFNlcnZlclBvbGljeSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1VybFBvbGljeSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX1RhcmdldCwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX1gsDQorICAgIFhGQV9BVFRSSUJVVEVfWSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfTnVtYmVyT2ZDZWxscywNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSCwNCisgICAgWEZBX0FUVFJJQlVURV9XLA0KKyAgICBYRkFfQVRUUklCVVRFX1gsDQorICAgIFhGQV9BVFRSSUJVVEVfWSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzLA0KKyAgICBYRkFfQVRUUklCVVRFX1JvdGF0ZSwNCisgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwNCisgICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4SCwNCisgICAgWEZBX0FUVFJJQlVURV9NYXhXLA0KKyAgICBYRkFfQVRUUklCVVRFX01pbkgsDQorICAgIFhGQV9BVFRSSUJVVEVfTWluVywNCisgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwNCisgICAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jYWxlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzS2V5LA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0gsDQorICAgIFhGQV9BVFRSSUJVVEVfVywNCisgICAgWEZBX0FUVFJJQlVURV9YLA0KKyAgICBYRkFfQVRUUklCVVRFX1ksDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9DYXAsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1N0cm9rZSwNCisgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwNCisgICAgWEZBX0FUVFJJQlVURV9UaGlja25lc3MsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfUmF0ZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9Tb3VyY2VCZWxvdywNCisgICAgWEZBX0FUVFJJQlVURV9PdXRwdXRCZWxvdywNCisgICAgWEZBX0FUVFJJQlVURV9Tb3VyY2VBYm92ZSwNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0gsDQorICAgIFhGQV9BVFRSSUJVVEVfVywNCisgICAgWEZBX0FUVFJJQlVURV9YLA0KKyAgICBYRkFfQVRUUklCVVRFX1ksDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfSEFsaWduLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FjY2VzcywNCisgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwNCisgICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4SCwNCisgICAgWEZBX0FUVFJJQlVURV9NYXhXLA0KKyAgICBYRkFfQVRUUklCVVRFX01pbkgsDQorICAgIFhGQV9BVFRSSUJVVEVfTWluVywNCisgICAgWEZBX0FUVFJJQlVURV9MYXlvdXQsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzS2V5LA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1JpZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX1Njb3BlLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9SdW5BdCwNCisgICAgWEZBX0FUVFJJQlVURV9FeGVjdXRlVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9QaWNrZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0FzcGVjdCwNCisgICAgWEZBX0FUVFJJQlVURV9IcmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1ZhbHVlLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfU2VydmVyLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9GcmFjRGlnaXRzLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTGVhZERpZ2l0cywNCisgICAgWEZBX0FUVFJJQlVURV9ILA0KKyAgICBYRkFfQVRUUklCVVRFX1csDQorICAgIFhGQV9BVFRSSUJVVEVfWCwNCisgICAgWEZBX0FUVFJJQlVURV9ZLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX0hBbGlnbiwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9BbGxvd01hY3JvLA0KKyAgICBYRkFfQVRUUklCVVRFX0NvbHVtbldpZHRocywNCisgICAgWEZBX0FUVFJJQlVURV9BY2Nlc3MsDQorICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVkFsaWduLA0KKyAgICBYRkFfQVRUUklCVVRFX01heEgsDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4VywNCisgICAgWEZBX0FUVFJJQlVURV9NaW5ILA0KKyAgICBYRkFfQVRUUklCVVRFX01pblcsDQorICAgIFhGQV9BVFRSSUJVVEVfTGF5b3V0LA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LA0KKyAgICBYRkFfQVRUUklCVVRFX01lcmdlTW9kZSwNCisgICAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jYWxlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVzdG9yZVN0YXRlLA0KKyAgICBYRkFfQVRUUklCVVRFX1Njb3BlLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UaW1lb3V0LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX01vZGUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Sb2xlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1N0cm9rZSwNCisgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwNCisgICAgWEZBX0FUVFJJQlVURV9JbnZlcnRlZCwNCisgICAgWEZBX0FUVFJJQlVURV9UaGlja25lc3MsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Kb2luLA0KKyAgICBYRkFfQVRUUklCVVRFX1JhZGl1cywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NTcGFjZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1ZhbHVlLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05leHQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1ByZXZpb3VzLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSW50YWN0LA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NvbW1hbmRUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9TY3JpcHRUZXN0LA0KKyAgICBYRkFfQVRUUklCVVRFX051bGxUZXN0LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Gb3JtYXRUZXN0LA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9SZWxhdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwNCisgICAgWEZBX0FUVFJJQlVURV9EdXBsZXhJbXBvc2l0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1RvLA0KKyAgICBYRkFfQVRUUklCVVRFX0ZvcmNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfRnJvbSwNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfVmFsdWUsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfQmFzZVByb2ZpbGUsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfUnVuQXQsDQorICAgIFhGQV9BVFRSSUJVVEVfQmluZGluZywNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sDQorICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfSW5pdGlhbE51bWJlciwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX051bWJlcmVkLA0KKyAgICBYRkFfQVRUUklCVVRFX0JsYW5rT3JOb3RCbGFuaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVzZXJ2ZSwNCisgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfUmlkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4TGVuZ3RoLA0KKyAgICBYRkFfQVRUUklCVVRFX0hyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfQWJiciwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfV3JpdGluZ1NjcmlwdCwNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FjdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UcmFpbGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX0xlYWRlciwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1RvLA0KKyAgICBYRkFfQVRUUklCVVRFX1VuaWNvZGVSYW5nZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0Zyb20sDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9UcmF5T3V0LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9PcmllbnRhdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9JbWFnaW5nQkJveCwNCisgICAgWEZBX0FUVFJJQlVURV9TaG9ydCwNCisgICAgWEZBX0FUVFJJQlVURV9UcmF5SW4sDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9TdG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9Mb25nLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1ZTY3JvbGxQb2xpY3ksDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FsbG93UmljaFRleHQsDQorICAgIFhGQV9BVFRSSUJVVEVfTXVsdGlMaW5lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX01heEVudHJpZXMsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Db250YWlucywNCisgICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwNCisgICAgWEZBX0FUVFJJQlVURV9Jc051bGwsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX0RhdGFEZXNjcmlwdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX01hdGNoLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0hhbmQsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0gsDQorICAgIFhGQV9BVFRSSUJVVEVfVywNCisgICAgWEZBX0FUVFJJQlVURV9YLA0KKyAgICBYRkFfQVRUUklCVVRFX1ksDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfSEFsaWduLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1JvdGF0ZSwNCisgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwNCisgICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4SCwNCisgICAgWEZBX0FUVFJJQlVURV9NYXhXLA0KKyAgICBYRkFfQVRUUklCVVRFX01pbkgsDQorICAgIFhGQV9BVFRSSUJVVEVfTWluVywNCisgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwNCisgICAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jYWxlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9SaWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1ByaW9yaXR5LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGlzYWJsZSwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaCwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwNCisgICAgWEZBX0FUVFJJQlVURV9Gb250SG9yaXpvbnRhbFNjYWxlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9LZXJuaW5nTW9kZSwNCisgICAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmUsDQorICAgIFhGQV9BVFRSSUJVVEVfQmFzZWxpbmVTaGlmdCwNCisgICAgWEZBX0FUVFJJQlVURV9PdmVybGluZVBlcmlvZCwNCisgICAgWEZBX0FUVFJJQlVURV9MZXR0ZXJTcGFjaW5nLA0KKyAgICBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoUGVyaW9kLA0KKyAgICBYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLA0KKyAgICBYRkFfQVRUUklCVVRFX1BzTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9TaXplLA0KKyAgICBYRkFfQVRUUklCVVRFX1Bvc3R1cmUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9XZWlnaHQsDQorICAgIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lUGVyaW9kLA0KKyAgICBYRkFfQVRUUklCVVRFX092ZXJsaW5lLA0KKyAgICBYRkFfQVRUUklCVVRFX0dlbmVyaWNGYW1pbHksDQorICAgIFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0xlYWRlciwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9BcmNoaXZlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29kZUJhc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfQ2xhc3NJZCwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX0xhYmVsUmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX092ZXJyaWRlLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1ZhbHVlLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVGltZW91dCwNCisgICAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzYWdlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVsYXllZE9wZW4sDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Gb3JtYXQsDQorICAgIFhGQV9BVFRSSUJVVEVfRW1iZWRQREYsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfVGV4dEVuY29kaW5nLA0KKyAgICBYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0RlbGltaXRlciwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfUmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9TdGFydE5ldywNCisgICAgWEZBX0FUVFJJQlVURV9UcmFpbGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9TbG9wZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0hhbmQsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9NYXgsDQorICAgIFhGQV9BVFRSSUJVVEVfTWluLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Jbml0aWFsLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0FiYnIsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9SZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1NhdmUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCiB9Ow0KIGV4dGVybiBjb25zdCBYRkFfUEFDS0VUSU5GTyBnX1hGQVBhY2tldERhdGFbXSA9IHsNCi0gICAgezB4MCwgTlVMTCwgWEZBX1hEUFBBQ0tFVF9VU0VSLCBOVUxMLCBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRNQU5ZfSwNCi0gICAgezB4ODExOTI5ZCwgTCJzb3VyY2VTZXQiLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1zb3VyY2Utc2V0LyIsIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQotICAgIHsweGI4NDNkYmEsIEwicGRmIiwgWEZBX1hEUFBBQ0tFVF9QZGYsIEwiaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvcGRmLyIsIFhGQV9YRFBQQUNLRVRfRkxBR1NfQ09NUExFVEVNQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQotICAgIHsweGM1NmFmYmYsIEwieGRjIiwgWEZBX1hEUFBBQ0tFVF9YZGMsIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZGMvIiwgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCi0gICAgezB4YzU2YWZjYywgTCJ4ZHAiLCBYRkFfWERQUEFDS0VUX1hEUCwgTCJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC8iLCBYRkFfWERQUEFDS0VUX0ZMQUdTX0NPTVBMRVRFTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KLSAgICB7MHgxMzJhOGZiYywgTCJ4bXBtZXRhIiwgWEZBX1hEUFBBQ0tFVF9YbXBtZXRhLCBMImh0dHA6Ly9ucy5hZG9iZS5jb20veG1wbWV0YS8iLCBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRNQU5ZfSwNCi0gICAgezB4NDhkMDA0YTgsIEwieGZkZiIsIFhGQV9YRFBQQUNLRVRfWGZkZiwgTCJodHRwOi8vbnMuYWRvYmUuY29tL3hmZGYvIiwgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCi0gICAgezB4NGUxZTM5YjYsIEwiY29uZmlnIiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94Y2kvIiwgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCi0gICAgezB4NTQ3M2I2ZGMsIEwibG9jYWxlU2V0IiwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtbG9jYWxlLXNldC8iLCBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KLSAgICB7MHg2MDM4NTgwYSwgTCJzdHlsZXNoZWV0IiwgWEZBX1hEUFBBQ0tFVF9TdHlsZXNoZWV0LCBMImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIsIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE1BTll9LA0KLSAgICB7MHg4MDM1NTBmYywgTCJ0ZW1wbGF0ZSIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUsIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtdGVtcGxhdGUvIiwgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCi0gICAgezB4OGIwMzZmMzIsIEwic2lnbmF0dXJlIiwgWEZBX1hEUFBBQ0tFVF9TaWduYXR1cmUsIEwiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIsIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQotICAgIHsweDk5Yjk1MDc5LCBMImRhdGFzZXRzIiwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLyIsIFhGQV9YRFBQQUNLRVRfRkxBR1NfUFJFRklYTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KLSAgICB7MHhjZDMwOWZmNCwgTCJmb3JtIiwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWZvcm0vIiwgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCi0gICAgezB4ZTE0YzgwMWMsIEwiY29ubmVjdGlvblNldCIsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1jb25uZWN0aW9uLXNldC8iLCBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KKyAgICB7MHgwLCBOVUxMLCBYRkFfWERQUEFDS0VUX1VTRVIsIE5VTEwsDQorICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRNQU5ZfSwNCisgICAgezB4ODExOTI5ZCwgTCJzb3VyY2VTZXQiLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwNCisgICAgIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtc291cmNlLXNldC8iLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4Yjg0M2RiYSwgTCJwZGYiLCBYRkFfWERQUEFDS0VUX1BkZiwgTCJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC9wZGYvIiwNCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfQ09NUExFVEVNQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweGM1NmFmYmYsIEwieGRjIiwgWEZBX1hEUFBBQ0tFVF9YZGMsIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZGMvIiwNCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweGM1NmFmY2MsIEwieGRwIiwgWEZBX1hEUFBBQ0tFVF9YRFAsIEwiaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvIiwNCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfQ09NUExFVEVNQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweDEzMmE4ZmJjLCBMInhtcG1ldGEiLCBYRkFfWERQUEFDS0VUX1htcG1ldGEsDQorICAgICBMImh0dHA6Ly9ucy5hZG9iZS5jb20veG1wbWV0YS8iLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUTUFOWX0sDQorICAgIHsweDQ4ZDAwNGE4LCBMInhmZGYiLCBYRkFfWERQUEFDS0VUX1hmZGYsIEwiaHR0cDovL25zLmFkb2JlLmNvbS94ZmRmLyIsDQorICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KKyAgICB7MHg0ZTFlMzliNiwgTCJjb25maWciLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94Y2kvIiwNCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweDU0NzNiNmRjLCBMImxvY2FsZVNldCIsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LA0KKyAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1sb2NhbGUtc2V0LyIsDQorICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KKyAgICB7MHg2MDM4NTgwYSwgTCJzdHlsZXNoZWV0IiwgWEZBX1hEUFBBQ0tFVF9TdHlsZXNoZWV0LA0KKyAgICAgTCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUTUFOWX0sDQorICAgIHsweDgwMzU1MGZjLCBMInRlbXBsYXRlIiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSwNCisgICAgIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtdGVtcGxhdGUvIiwNCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweDhiMDM2ZjMyLCBMInNpZ25hdHVyZSIsIFhGQV9YRFBQQUNLRVRfU2lnbmF0dXJlLA0KKyAgICAgTCJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiwNCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweDk5Yjk1MDc5LCBMImRhdGFzZXRzIiwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywNCisgICAgIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtZGF0YS8iLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19QUkVGSVhNQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweGNkMzA5ZmY0LCBMImZvcm0iLCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWZvcm0vIiwNCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweGUxNGM4MDFjLCBMImNvbm5lY3Rpb25TZXQiLCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsDQorICAgICBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWNvbm5lY3Rpb24tc2V0LyIsDQorICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KIH07DQotZXh0ZXJuIGNvbnN0IGludDMyX3QgZ19pWEZBUGFja2V0Q291bnQgPSBzaXplb2YoZ19YRkFQYWNrZXREYXRhKSAvIHNpemVvZihYRkFfUEFDS0VUSU5GTyk7DQorZXh0ZXJuIGNvbnN0IGludDMyX3QgZ19pWEZBUGFja2V0Q291bnQgPQ0KKyAgICBzaXplb2YoZ19YRkFQYWNrZXREYXRhKSAvIHNpemVvZihYRkFfUEFDS0VUSU5GTyk7DQogZXh0ZXJuIGNvbnN0IFhGQV9TQ1JJUFRISUVSQVJDSFkgZ19YRkFTY3JpcHRJbmRleFtdID0gew0KLSAgICB7MCwgMCwgMCwgMiwgMzE2fSwJezAsIDAsIDIsIDIsIDMxNn0sCXswLCAwLCA0LCAyLCAzMTZ9LAl7MCwgMCwgNiwgOCwgMzE2fSwJezAsIDAsIDE0LCA0LCAzMTZ9LAl7MCwgMCwgMTgsIDUsIDMxN30sCXswLCAwLCAyMywgMiwgMzE2fSwJezAsIDAsIDI1LCAxLCAzMTZ9LAl7MCwgMCwgMjYsIDEyLCAzMTZ9LAl7MCwgMCwgMzgsIDIsIDMxNn0sCXswLCAwLCA0MCwgMSwgMzE2fSwJezAsIDAsIDQxLCAzLCAzMTZ9LAl7MCwgMCwgNDQsIDIsIDMxNn0sCXswLCAwLCA0NiwgNiwgMzE2fSwJezAsIDAsIDUyLCAwLCAzMTZ9LAl7MCwgMCwgNTIsIDIsIDMxOX0sCXswLCAwLCA1NCwgMiwgMzE2fSwJezAsIDAsIDU2LCA2LCAzMTZ9LAl7MCwgMCwgNjIsIDAsIDMxNn0sCXswLCAwLCA2MiwgMCwgMzE2fSwNCi0gICAgezAsIDAsIDYyLCAyLCAzMTZ9LAl7MCwgMCwgNjQsIDIsIDMxNn0sCXswLCAwLCA2NiwgNiwgMzE2fSwJezAsIDAsIDcyLCA0LCAzMTZ9LAl7MCwgMCwgNzYsIDcsIDMxNn0sCXswLCAwLCA4MywgMiwgMzIwfSwJezAsIDAsIDg1LCAzLCAzMTZ9LAl7MCwgMCwgODgsIDMsIDMxNn0sCXswLCAwLCA5MSwgMiwgMzIwfSwJezAsIDAsIDkzLCA2LCAzMjB9LAl7MCwgMCwgOTksIDQsIDMxNn0sCXswLCAwLCAxMDMsIDIsIDMxNn0sCXswLCAwLCAxMDUsIDMsIDMxOX0sCXswLCAwLCAxMDgsIDQsIDMxNn0sCXswLCAwLCAxMTIsIDMsIDMxNn0sCXswLCAwLCAxMTUsIDIsIDMxNn0sCXswLCAwLCAxMTcsIDYsIDMxNn0sCXswLCAwLCAxMjMsIDEyLCAzMTZ9LAl7MCwgMCwgMTM1LCAyLCAzMTZ9LAl7MCwgMCwgMTM3LCA1LCAzMTZ9LA0KLSAgICB7MCwgMCwgMTQyLCAyLCAzMTZ9LAl7MCwgMCwgMTQ0LCAzLCAzMTZ9LAl7MCwgMCwgMTQ3LCAxLCAzMTZ9LAl7MCwgMCwgMTQ4LCAxNCwgMzE2fSwJezAsIDAsIDE2MiwgMiwgMzE2fSwJezAsIDAsIDE2NCwgMiwgMzE2fSwJezAsIDAsIDE2NiwgMywgMzE2fSwJezAsIDAsIDE2OSwgMiwgMzE2fSwJezAsIDAsIDE3MSwgMiwgMzE2fSwJezAsIDAsIDE3MywgMiwgMzE2fSwJezAsIDAsIDE3NSwgNCwgMzE2fSwJezAsIDAsIDE3OSwgMiwgMzE2fSwJezAsIDAsIDE4MSwgMiwgMzE2fSwJezAsIDAsIDE4MywgMCwgMzE5fSwJezAsIDAsIDE4MywgMjAsIDMxNn0sCXswLCAwLCAyMDMsIDEsIDMxNn0sCXswLCAwLCAyMDQsIDMsIDMxNn0sCXswLCAwLCAyMDcsIDIsIDMxNn0sCXswLCAwLCAyMDksIDAsIDMxNn0sCXswLCAwLCAyMDksIDIsIDMxNn0sDQotICAgIHswLCAwLCAyMTEsIDIsIDMxNn0sCXswLCAwLCAyMTMsIDQsIDMyMH0sCXswLCAwLCAyMTcsIDAsIDMxNn0sCXswLCAwLCAyMTcsIDEsIDMxNn0sCXswLCAwLCAyMTgsIDMsIDMxNn0sCXswLCA0LCAyMjEsIDAsIDMxMn0sCXs0LCAxLCAyMjEsIDEsIDMxNn0sCXs1LCAwLCAyMjIsIDIsIDMxNn0sCXs1LCAxLCAyMjQsIDMsIC0xfSwJezYsIDAsIDIyNywgMCwgMzE2fSwJezYsIDAsIDIyNywgMiwgMzE2fSwJezYsIDAsIDIyOSwgMiwgMzE2fSwJezYsIDAsIDIzMSwgMywgMzE2fSwJezYsIDAsIDIzNCwgMiwgMzE2fSwJezYsIDAsIDIzNiwgNiwgMzE2fSwJezYsIDAsIDI0MiwgMTAsIDMxN30sCXs2LCAwLCAyNTIsIDksIDMxNn0sCXs2LCAwLCAyNjEsIDUsIDMxOH0sCXs2LCAwLCAyNjYsIDQsIDMxOH0sCXs2LCAwLCAyNzAsIDIsIDMxNn0sDQotICAgIHs2LCAwLCAyNzIsIDIsIDMxNn0sCXs2LCAwLCAyNzQsIDUsIDMxNn0sCXs2LCAwLCAyNzksIDMsIDMxNn0sCXs2LCAwLCAyODIsIDIsIDMxNn0sCXs2LCAwLCAyODQsIDIsIDMxNn0sCXs2LCAwLCAyODYsIDIsIDMxNn0sCXs2LCAwLCAyODgsIDIsIDMxNn0sCXs2LCAwLCAyOTAsIDQsIDMxNn0sCXs2LCAwLCAyOTQsIDMsIDMxNn0sCXs2LCAwLCAyOTcsIDMsIDMxNn0sCXs2LCAwLCAzMDAsIDIsIDMxNn0sCXs2LCAwLCAzMDIsIDIsIDMxNn0sCXs2LCAwLCAzMDQsIDIsIDMxNn0sCXs2LCAxMywgMzA2LCAzNiwgMzE3fSwJezE5LCAwLCAzNDIsIDMsIDMxNn0sCXsxOSwgMCwgMzQ1LCAyLCAzMTZ9LAl7MTksIDAsIDM0NywgMiwgMzE2fSwJezE5LCAwLCAzNDksIDIsIDMxNn0sCXsxOSwgMCwgMzUxLCA3LCAzMTd9LAl7MTksIDIsIDM1OCwgMTYsIDMxMn0sDQotICAgIHsyMSwgMCwgMzc0LCAyLCAzMjB9LAl7MjEsIDAsIDM3NiwgMiwgMzE2fSwJezIxLCAwLCAzNzgsIDAsIDMxNn0sCXsyMSwgMCwgMzc4LCAyLCAzMTZ9LAl7MjEsIDAsIDM4MCwgNiwgMzE2fSwJezIxLCAwLCAzODYsIDMsIDMxNn0sCXsyMSwgMCwgMzg5LCAyLCAzMTZ9LAl7MjEsIDAsIDM5MSwgNCwgMzE2fSwJezIxLCAwLCAzOTUsIDAsIDMxNn0sCXsyMSwgNSwgMzk1LCAzMCwgMzE2fSwJezI2LCAwLCA0MjUsIDIsIDMyMH0sCXsyNiwgMCwgNDI3LCAzLCAzMTZ9LAl7MjYsIDAsIDQzMCwgMiwgMzIwfSwJezI2LCAwLCA0MzIsIDUsIDMxNn0sCXsyNiwgMCwgNDM3LCAyLCAzMTZ9LAl7MjYsIDAsIDQzOSwgMywgMzE2fSwJezI2LCAwLCA0NDIsIDIsIDMxNn0sCXsyNiwgMCwgNDQ0LCA4LCAzMTZ9LAl7MjYsIDAsIDQ1MiwgMSwgMzE2fSwJezI2LCAwLCA0NTMsIDIsIDMxNn0sDQotICAgIHsyNiwgMCwgNDU1LCAyLCAzMTZ9LAl7MjYsIDAsIDQ1NywgNCwgMzE2fSwJezI2LCAwLCA0NjEsIDAsIDMxNn0sCXsyNiwgMCwgNDYxLCAyLCAzMTZ9LAl7MjYsIDAsIDQ2MywgMiwgMzE2fSwJezI2LCAwLCA0NjUsIDYsIDMxOH0sCXsyNiwgNSwgNDcxLCAzMSwgMzE3fSwJezMxLCAwLCA1MDIsIDIsIDMyMH0sCXszMSwgMCwgNTA0LCAyLCAzMTZ9LAl7MzEsIDAsIDUwNiwgMiwgMzE2fSwJezMxLCAwLCA1MDgsIDQsIDMyMH0sCXszMSwgMTYsIDUxMiwgMTQsIDMxMn0sCXs0NywgMCwgNTI2LCAyLCAzMTZ9LAl7NDcsIDAsIDUyOCwgMiwgMzE2fSwJezQ3LCAwLCA1MzAsIDIsIDMxNn0sCXs0NywgMCwgNTMyLCAyLCAzMTZ9LAl7NDcsIDAsIDUzNCwgMywgMzE2fSwJezQ3LCAwLCA1MzcsIDIsIDMxNn0sCXs0NywgMCwgNTM5LCAzLCAzMTZ9LAl7NDcsIDAsIDU0MiwgMywgMzE2fSwNCi0gICAgezQ3LCAwLCA1NDUsIDQsIDMxOH0sCXs0NywgMCwgNTQ5LCA0LCAzMTZ9LAl7NDcsIDAsIDU1MywgMiwgMzE2fSwJezQ3LCAwLCA1NTUsIDAsIDMxNn0sCXs0NywgMCwgNTU1LCAyLCAzMTZ9LAl7NDcsIDAsIDU1NywgMywgMzE2fSwJezQ3LCAwLCA1NjAsIDYsIDMxNn0sCXs0NywgMCwgNTY2LCAyLCAzMTZ9LAl7NDcsIDAsIDU2OCwgMiwgMzE2fSwJezQ3LCAwLCA1NzAsIDMsIDMxNn0sCXs0NywgMTksIDU3MywgMSwgMzEyfSwJezY2LCAwLCA1NzQsIDIsIDMxNn0sCXs2NiwgMCwgNTc2LCA4LCAzMTZ9LAl7NjYsIDAsIDU4NCwgMiwgMzE2fSwJezY2LCAwLCA1ODYsIDQsIDMxNn0sCXs2NiwgMCwgNTkwLCA1LCAzMTZ9LAl7NjYsIDAsIDU5NSwgMywgMzE2fSwJezY2LCAwLCA1OTgsIDIsIDMyMH0sCXs2NiwgMCwgNjAwLCAzLCAzMTZ9LAl7NjYsIDAsIDYwMywgNywgMzE2fSwNCi0gICAgezY2LCAwLCA2MTAsIDMsIDMxNn0sCXs2NiwgMCwgNjEzLCAwLCAzMTZ9LAl7NjYsIDAsIDYxMywgNCwgMzE3fSwJezY2LCAwLCA2MTcsIDQsIDMxOH0sCXs2NiwgMCwgNjIxLCAyLCAzMjB9LAl7NjYsIDAsIDYyMywgNSwgMzE2fSwJezY2LCAwLCA2MjgsIDIsIDMxNn0sCXs2NiwgMCwgNjMwLCAyLCAzMTZ9LAl7NjYsIDAsIDYzMiwgMiwgMzIwfSwJezY2LCAwLCA2MzQsIDIsIDMyMH0sCXs2NiwgMCwgNjM2LCA0LCAzMTZ9LAl7NjYsIDAsIDY0MCwgMiwgMzE2fSwJezY2LCAwLCA2NDIsIDEsIDMxNn0sCXs2NiwgMCwgNjQzLCAxLCAzMTZ9LAl7NjYsIDAsIDY0NCwgNCwgMzE2fSwJezY2LCAwLCA2NDgsIDMsIDMxNn0sCXs2NiwgNywgNjUxLCAyLCAzMTl9LAl7NzMsIDAsIDY1MywgMiwgMzE2fSwJezczLCAwLCA2NTUsIDIsIDMxNn0sCXs3MywgMCwgNjU3LCAzLCAzMTZ9LA0KLSAgICB7NzMsIDQsIDY2MCwgNCwgMzEyfSwJezc3LCAwLCA2NjQsIDEwLCAzMTZ9LAl7NzcsIDAsIDY3NCwgMiwgMzE2fSwJezc3LCAwLCA2NzYsIDQsIDMxNn0sCXs3NywgMCwgNjgwLCA0LCAzMTZ9LAl7NzcsIDAsIDY4NCwgMywgMzE2fSwJezc3LCAwLCA2ODcsIDIsIDMxNn0sCXs3NywgMCwgNjg5LCAyLCAzMTZ9LAl7NzcsIDAsIDY5MSwgOCwgMzE3fSwJezc3LCAwLCA2OTksIDMsIDMxNn0sCXs3NywgMCwgNzAyLCAzLCAzMTZ9LAl7NzcsIDAsIDcwNSwgMiwgMzE2fSwJezc3LCAwLCA3MDcsIDIsIDMxNn0sCXs3NywgMCwgNzA5LCA1LCAzMTZ9LAl7NzcsIDAsIDcxNCwgNCwgMzE2fSwJezc3LCAwLCA3MTgsIDIsIDMxNn0sCXs3NywgMCwgNzIwLCA4LCAzMTh9LAl7NzcsIDAsIDcyOCwgMSwgMzE2fSwJezc3LCAwLCA3MjksIDIsIDMyMH0sCXs3NywgMCwgNzMxLCAzLCAzMTZ9LA0KLSAgICB7NzcsIDEsIDczNCwgNCwgMzE2fSwJezc4LCAwLCA3MzgsIDUsIDMxNn0sCXs3OCwgMCwgNzQzLCAzLCAzMTZ9LAl7NzgsIDAsIDc0NiwgMSwgMzE2fSwJezc4LCAwLCA3NDcsIDIsIDMyMH0sCXs3OCwgMCwgNzQ5LCAwLCAzMTN9LAl7NzgsIDAsIDc0OSwgMiwgMzE2fSwJezc4LCA1LCA3NTEsIDMsIDMxNn0sCXs4MywgMCwgNzU0LCA1LCAzMTZ9LAl7ODMsIDAsIDc1OSwgNywgMzE2fSwJezgzLCAwLCA3NjYsIDYsIDMxNn0sCXs4MywgMCwgNzcyLCAzLCAzMTZ9LAl7ODMsIDAsIDc3NSwgMiwgMzE2fSwJezgzLCAwLCA3NzcsIDUsIDMxNn0sCXs4MywgMCwgNzgyLCAyLCAzMTZ9LAl7ODMsIDAsIDc4NCwgMCwgMzE0fSwJezgzLCAwLCA3ODQsIDIsIDMxNn0sCXs4MywgMCwgNzg2LCAxLCAzMTZ9LAl7ODMsIDAsIDc4NywgMiwgMzE2fSwJezgzLCAwLCA3ODksIDUsIDMxNn0sDQotICAgIHs4MywgMCwgNzk0LCAyLCAzMTZ9LAl7ODMsIDAsIDc5NiwgMSwgMzE2fSwJezgzLCAwLCA3OTcsIDIsIDMxNn0sCXs4MywgMCwgNzk5LCAyLCAzMTZ9LAl7ODMsIDAsIDgwMSwgNiwgMzE2fSwJezgzLCAwLCA4MDcsIDIsIDMxNn0sCXs4MywgMCwgODA5LCAyLCAzMjB9LAl7ODMsIDAsIDgxMSwgMywgMzE2fSwJezgzLCAwLCA4MTQsIDQsIDMxNn0sCXs4MywgMCwgODE4LCAyLCAzMTZ9LAl7ODMsIDAsIDgyMCwgMiwgMzE2fSwJezgzLCAwLCA4MjIsIDIsIDMxNn0sCXs4MywgMCwgODI0LCAyLCAzMTZ9LAl7ODMsIDAsIDgyNiwgMiwgMzE2fSwJezgzLCAwLCA4MjgsIDIsIDMxNn0sCXs4MywgMCwgODMwLCA0LCAzMTh9LAl7ODMsIDEsIDgzNCwgMiwgMzE2fSwJezg0LCAwLCA4MzYsIDUsIDMxNn0sCXs4NCwgMCwgODQxLCAyMCwgMzE3fSwJezg0LCAwLCA4NjEsIDIsIDMxNn0sDQotICAgIHs4NCwgMCwgODYzLCAwLCAzMTZ9LAl7ODQsIDAsIDg2MywgMiwgMzE2fSwJezg0LCAwLCA4NjUsIDQsIDMyMH0sCXs4NCwgMCwgODY5LCAwLCAzMTZ9LAl7ODQsIDAsIDg2OSwgMiwgMzE2fSwJezg0LCAwLCA4NzEsIDEsIDMxNn0sCXs4NCwgMCwgODcyLCAyLCAzMTZ9LAl7ODQsIDAsIDg3NCwgMywgMzE2fSwJezg0LCAwLCA4NzcsIDIsIDMxNn0sCXs4NCwgMCwgODc5LCAyLCAzMTZ9LAl7ODQsIDAsIDg4MSwgNCwgMzE2fSwJezg0LCAwLCA4ODUsIDMsIDMxNn0sCXs4NCwgMCwgODg4LCAxNywgMzE2fSwJezg0LCA2LCA5MDUsIDEsIDMxOX0sCXs5MCwgMCwgOTA2LCAyLCAzMTZ9LAl7OTAsIDAsIDkwOCwgMiwgMzIwfSwJezkwLCAwLCA5MTAsIDIsIDMyMH0sCXs5MCwgMCwgOTEyLCAyLCAzMTZ9LAl7OTAsIDAsIDkxNCwgMiwgMzE2fSwJezkwLCAwLCA5MTYsIDQsIDMxOH0sDQotICAgIHs5MCwgMCwgOTIwLCAyLCAzMTZ9LAl7OTAsIDUsIDkyMiwgMCwgMzEyfSwJezk1LCAwLCA5MjIsIDIsIDMxNn0sCXs5NSwgMCwgOTI0LCA0LCAzMTZ9LAl7OTUsIDAsIDkyOCwgNCwgMzE2fSwJezk1LCAwLCA5MzIsIDYsIDMxNn0sCXs5NSwgMCwgOTM4LCAyLCAzMTZ9LAl7OTUsIDAsIDk0MCwgNCwgMzE2fSwJezk1LCAwLCA5NDQsIDMsIDMxNn0sCXs5NSwgMCwgOTQ3LCAzLCAzMTZ9LAl7OTUsIDAsIDk1MCwgMiwgMzE2fSwJezk1LCAwLCA5NTIsIDMsIDMxNn0sCXs5NSwgMCwgOTU1LCAwLCAzMTZ9LAl7OTUsIDAsIDk1NSwgMCwgMzE2fSwJezk1LCAwLCA5NTUsIDIsIDMxNn0sCXs5NSwgMCwgOTU3LCA3LCAzMTZ9LAl7OTUsIDAsIDk2NCwgMiwgMzE2fSwJezk1LCAwLCA5NjYsIDAsIDMxOX0sCXs5NSwgMCwgOTY2LCA3LCAzMTZ9LAl7OTUsIDAsIDk3MywgMiwgMzE2fSwNCi0gICAgezk1LCAwLCA5NzUsIDIsIDMxNn0sCXs5NSwgMywgOTc3LCAxLCAzMTZ9LAl7OTgsIDAsIDk3OCwgMiwgMzIwfSwJezk4LCAwLCA5ODAsIDQsIDMxNn0sCXs5OCwgMCwgOTg0LCAwLCAzMTZ9LAl7OTgsIDAsIDk4NCwgMiwgMzE2fSwJezk4LCAwLCA5ODYsIDIsIDMxNn0sCXs5OCwgMCwgOTg4LCA0LCAzMTZ9LAl7OTgsIDAsIDk5MiwgMSwgMzE2fSwJezk4LCAwLCA5OTMsIDIsIDMxNn0sCXs5OCwgMCwgOTk1LCAyLCAzMTZ9LAl7OTgsIDAsIDk5NywgMywgMzE2fSwJezk4LCAwLCAxMDAwLCAyLCAzMTd9LAl7OTgsIDAsIDEwMDIsIDAsIDMxNn0sCXs5OCwgMCwgMTAwMiwgNCwgMzE2fSwJezk4LCAwLCAxMDA2LCA0LCAzMTZ9LAl7OTgsIDAsIDEwMTAsIDIsIDMxNn0sCXs5OCwgMCwgMTAxMiwgMywgMzE2fSwJezk4LCAwLCAxMDE1LCA0LCAzMTZ9LAl7OTgsIDAsIDEwMTksIDcsIDMxNn0sDQotICAgIHs5OCwgMCwgMTAyNiwgNCwgMzE2fSwJezk4LCAwLCAxMDMwLCAxLCAzMTN9LAl7OTgsIDE3LCAxMDMxLCAzLCAzMTZ9LAl7MTE1LCAwLCAxMDM0LCA1LCAzMTZ9LAl7MTE1LCAwLCAxMDM5LCAyLCAzMTZ9LAl7MTE1LCAwLCAxMDQxLCAxLCAzMTZ9LAl7MTE1LCAwLCAxMDQyLCA0LCAzMTZ9LAl7MTE1LCAwLCAxMDQ2LCAyLCAzMTZ9LAl7MTE1LCAwLCAxMDQ4LCAyLCAzMTZ9LAl7MTE1LCAwLCAxMDUwLCAxLCAzMTZ9LAl7MTE1LCAwLCAxMDUxLCAyLCAzMTZ9LAl7MTE1LCAwLCAxMDUzLCA1LCAzMTZ9LAl7MTE1LCAwLCAxMDU4LCAxLCAtMX0sCXsxMTUsIDQsIDEwNTksIDEsIDMxMn0sCXsxMTksIDEsIDEwNjAsIDAsIDMxM30sCXsxMjAsIDIsIDEwNjAsIDgsIDMxMn0sCXsxMjIsIDExLCAxMDY4LCA2LCAzMTV9LAl7MTMzLCAyLCAxMDc0LCAwLCAzMTZ9LAl7MTM1LCAwLCAxMDc0LCAwLCAzMTZ9LAl7MTM1LCAzLCAxMDc0LCAyLCAzMTZ9LA0KLSAgICB7MTM4LCAwLCAxMDc2LCAyLCAzMTZ9LA0KKyAgICB7MCwgMCwgMCwgMiwgMzE2fSwgICAgICB7MCwgMCwgMiwgMiwgMzE2fSwgICAgICAgezAsIDAsIDQsIDIsIDMxNn0sDQorICAgIHswLCAwLCA2LCA4LCAzMTZ9LCAgICAgIHswLCAwLCAxNCwgNCwgMzE2fSwgICAgICB7MCwgMCwgMTgsIDUsIDMxN30sDQorICAgIHswLCAwLCAyMywgMiwgMzE2fSwgICAgIHswLCAwLCAyNSwgMSwgMzE2fSwgICAgICB7MCwgMCwgMjYsIDEyLCAzMTZ9LA0KKyAgICB7MCwgMCwgMzgsIDIsIDMxNn0sICAgICB7MCwgMCwgNDAsIDEsIDMxNn0sICAgICAgezAsIDAsIDQxLCAzLCAzMTZ9LA0KKyAgICB7MCwgMCwgNDQsIDIsIDMxNn0sICAgICB7MCwgMCwgNDYsIDYsIDMxNn0sICAgICAgezAsIDAsIDUyLCAwLCAzMTZ9LA0KKyAgICB7MCwgMCwgNTIsIDIsIDMxOX0sICAgICB7MCwgMCwgNTQsIDIsIDMxNn0sICAgICAgezAsIDAsIDU2LCA2LCAzMTZ9LA0KKyAgICB7MCwgMCwgNjIsIDAsIDMxNn0sICAgICB7MCwgMCwgNjIsIDAsIDMxNn0sICAgICAgezAsIDAsIDYyLCAyLCAzMTZ9LA0KKyAgICB7MCwgMCwgNjQsIDIsIDMxNn0sICAgICB7MCwgMCwgNjYsIDYsIDMxNn0sICAgICAgezAsIDAsIDcyLCA0LCAzMTZ9LA0KKyAgICB7MCwgMCwgNzYsIDcsIDMxNn0sICAgICB7MCwgMCwgODMsIDIsIDMyMH0sICAgICAgezAsIDAsIDg1LCAzLCAzMTZ9LA0KKyAgICB7MCwgMCwgODgsIDMsIDMxNn0sICAgICB7MCwgMCwgOTEsIDIsIDMyMH0sICAgICAgezAsIDAsIDkzLCA2LCAzMjB9LA0KKyAgICB7MCwgMCwgOTksIDQsIDMxNn0sICAgICB7MCwgMCwgMTAzLCAyLCAzMTZ9LCAgICAgezAsIDAsIDEwNSwgMywgMzE5fSwNCisgICAgezAsIDAsIDEwOCwgNCwgMzE2fSwgICAgezAsIDAsIDExMiwgMywgMzE2fSwgICAgIHswLCAwLCAxMTUsIDIsIDMxNn0sDQorICAgIHswLCAwLCAxMTcsIDYsIDMxNn0sICAgIHswLCAwLCAxMjMsIDEyLCAzMTZ9LCAgICB7MCwgMCwgMTM1LCAyLCAzMTZ9LA0KKyAgICB7MCwgMCwgMTM3LCA1LCAzMTZ9LCAgICB7MCwgMCwgMTQyLCAyLCAzMTZ9LCAgICAgezAsIDAsIDE0NCwgMywgMzE2fSwNCisgICAgezAsIDAsIDE0NywgMSwgMzE2fSwgICAgezAsIDAsIDE0OCwgMTQsIDMxNn0sICAgIHswLCAwLCAxNjIsIDIsIDMxNn0sDQorICAgIHswLCAwLCAxNjQsIDIsIDMxNn0sICAgIHswLCAwLCAxNjYsIDMsIDMxNn0sICAgICB7MCwgMCwgMTY5LCAyLCAzMTZ9LA0KKyAgICB7MCwgMCwgMTcxLCAyLCAzMTZ9LCAgICB7MCwgMCwgMTczLCAyLCAzMTZ9LCAgICAgezAsIDAsIDE3NSwgNCwgMzE2fSwNCisgICAgezAsIDAsIDE3OSwgMiwgMzE2fSwgICAgezAsIDAsIDE4MSwgMiwgMzE2fSwgICAgIHswLCAwLCAxODMsIDAsIDMxOX0sDQorICAgIHswLCAwLCAxODMsIDIwLCAzMTZ9LCAgIHswLCAwLCAyMDMsIDEsIDMxNn0sICAgICB7MCwgMCwgMjA0LCAzLCAzMTZ9LA0KKyAgICB7MCwgMCwgMjA3LCAyLCAzMTZ9LCAgICB7MCwgMCwgMjA5LCAwLCAzMTZ9LCAgICAgezAsIDAsIDIwOSwgMiwgMzE2fSwNCisgICAgezAsIDAsIDIxMSwgMiwgMzE2fSwgICAgezAsIDAsIDIxMywgNCwgMzIwfSwgICAgIHswLCAwLCAyMTcsIDAsIDMxNn0sDQorICAgIHswLCAwLCAyMTcsIDEsIDMxNn0sICAgIHswLCAwLCAyMTgsIDMsIDMxNn0sICAgICB7MCwgNCwgMjIxLCAwLCAzMTJ9LA0KKyAgICB7NCwgMSwgMjIxLCAxLCAzMTZ9LCAgICB7NSwgMCwgMjIyLCAyLCAzMTZ9LCAgICAgezUsIDEsIDIyNCwgMywgLTF9LA0KKyAgICB7NiwgMCwgMjI3LCAwLCAzMTZ9LCAgICB7NiwgMCwgMjI3LCAyLCAzMTZ9LCAgICAgezYsIDAsIDIyOSwgMiwgMzE2fSwNCisgICAgezYsIDAsIDIzMSwgMywgMzE2fSwgICAgezYsIDAsIDIzNCwgMiwgMzE2fSwgICAgIHs2LCAwLCAyMzYsIDYsIDMxNn0sDQorICAgIHs2LCAwLCAyNDIsIDEwLCAzMTd9LCAgIHs2LCAwLCAyNTIsIDksIDMxNn0sICAgICB7NiwgMCwgMjYxLCA1LCAzMTh9LA0KKyAgICB7NiwgMCwgMjY2LCA0LCAzMTh9LCAgICB7NiwgMCwgMjcwLCAyLCAzMTZ9LCAgICAgezYsIDAsIDI3MiwgMiwgMzE2fSwNCisgICAgezYsIDAsIDI3NCwgNSwgMzE2fSwgICAgezYsIDAsIDI3OSwgMywgMzE2fSwgICAgIHs2LCAwLCAyODIsIDIsIDMxNn0sDQorICAgIHs2LCAwLCAyODQsIDIsIDMxNn0sICAgIHs2LCAwLCAyODYsIDIsIDMxNn0sICAgICB7NiwgMCwgMjg4LCAyLCAzMTZ9LA0KKyAgICB7NiwgMCwgMjkwLCA0LCAzMTZ9LCAgICB7NiwgMCwgMjk0LCAzLCAzMTZ9LCAgICAgezYsIDAsIDI5NywgMywgMzE2fSwNCisgICAgezYsIDAsIDMwMCwgMiwgMzE2fSwgICAgezYsIDAsIDMwMiwgMiwgMzE2fSwgICAgIHs2LCAwLCAzMDQsIDIsIDMxNn0sDQorICAgIHs2LCAxMywgMzA2LCAzNiwgMzE3fSwgIHsxOSwgMCwgMzQyLCAzLCAzMTZ9LCAgICB7MTksIDAsIDM0NSwgMiwgMzE2fSwNCisgICAgezE5LCAwLCAzNDcsIDIsIDMxNn0sICAgezE5LCAwLCAzNDksIDIsIDMxNn0sICAgIHsxOSwgMCwgMzUxLCA3LCAzMTd9LA0KKyAgICB7MTksIDIsIDM1OCwgMTYsIDMxMn0sICB7MjEsIDAsIDM3NCwgMiwgMzIwfSwgICAgezIxLCAwLCAzNzYsIDIsIDMxNn0sDQorICAgIHsyMSwgMCwgMzc4LCAwLCAzMTZ9LCAgIHsyMSwgMCwgMzc4LCAyLCAzMTZ9LCAgICB7MjEsIDAsIDM4MCwgNiwgMzE2fSwNCisgICAgezIxLCAwLCAzODYsIDMsIDMxNn0sICAgezIxLCAwLCAzODksIDIsIDMxNn0sICAgIHsyMSwgMCwgMzkxLCA0LCAzMTZ9LA0KKyAgICB7MjEsIDAsIDM5NSwgMCwgMzE2fSwgICB7MjEsIDUsIDM5NSwgMzAsIDMxNn0sICAgezI2LCAwLCA0MjUsIDIsIDMyMH0sDQorICAgIHsyNiwgMCwgNDI3LCAzLCAzMTZ9LCAgIHsyNiwgMCwgNDMwLCAyLCAzMjB9LCAgICB7MjYsIDAsIDQzMiwgNSwgMzE2fSwNCisgICAgezI2LCAwLCA0MzcsIDIsIDMxNn0sICAgezI2LCAwLCA0MzksIDMsIDMxNn0sICAgIHsyNiwgMCwgNDQyLCAyLCAzMTZ9LA0KKyAgICB7MjYsIDAsIDQ0NCwgOCwgMzE2fSwgICB7MjYsIDAsIDQ1MiwgMSwgMzE2fSwgICAgezI2LCAwLCA0NTMsIDIsIDMxNn0sDQorICAgIHsyNiwgMCwgNDU1LCAyLCAzMTZ9LCAgIHsyNiwgMCwgNDU3LCA0LCAzMTZ9LCAgICB7MjYsIDAsIDQ2MSwgMCwgMzE2fSwNCisgICAgezI2LCAwLCA0NjEsIDIsIDMxNn0sICAgezI2LCAwLCA0NjMsIDIsIDMxNn0sICAgIHsyNiwgMCwgNDY1LCA2LCAzMTh9LA0KKyAgICB7MjYsIDUsIDQ3MSwgMzEsIDMxN30sICB7MzEsIDAsIDUwMiwgMiwgMzIwfSwgICAgezMxLCAwLCA1MDQsIDIsIDMxNn0sDQorICAgIHszMSwgMCwgNTA2LCAyLCAzMTZ9LCAgIHszMSwgMCwgNTA4LCA0LCAzMjB9LCAgICB7MzEsIDE2LCA1MTIsIDE0LCAzMTJ9LA0KKyAgICB7NDcsIDAsIDUyNiwgMiwgMzE2fSwgICB7NDcsIDAsIDUyOCwgMiwgMzE2fSwgICAgezQ3LCAwLCA1MzAsIDIsIDMxNn0sDQorICAgIHs0NywgMCwgNTMyLCAyLCAzMTZ9LCAgIHs0NywgMCwgNTM0LCAzLCAzMTZ9LCAgICB7NDcsIDAsIDUzNywgMiwgMzE2fSwNCisgICAgezQ3LCAwLCA1MzksIDMsIDMxNn0sICAgezQ3LCAwLCA1NDIsIDMsIDMxNn0sICAgIHs0NywgMCwgNTQ1LCA0LCAzMTh9LA0KKyAgICB7NDcsIDAsIDU0OSwgNCwgMzE2fSwgICB7NDcsIDAsIDU1MywgMiwgMzE2fSwgICAgezQ3LCAwLCA1NTUsIDAsIDMxNn0sDQorICAgIHs0NywgMCwgNTU1LCAyLCAzMTZ9LCAgIHs0NywgMCwgNTU3LCAzLCAzMTZ9LCAgICB7NDcsIDAsIDU2MCwgNiwgMzE2fSwNCisgICAgezQ3LCAwLCA1NjYsIDIsIDMxNn0sICAgezQ3LCAwLCA1NjgsIDIsIDMxNn0sICAgIHs0NywgMCwgNTcwLCAzLCAzMTZ9LA0KKyAgICB7NDcsIDE5LCA1NzMsIDEsIDMxMn0sICB7NjYsIDAsIDU3NCwgMiwgMzE2fSwgICAgezY2LCAwLCA1NzYsIDgsIDMxNn0sDQorICAgIHs2NiwgMCwgNTg0LCAyLCAzMTZ9LCAgIHs2NiwgMCwgNTg2LCA0LCAzMTZ9LCAgICB7NjYsIDAsIDU5MCwgNSwgMzE2fSwNCisgICAgezY2LCAwLCA1OTUsIDMsIDMxNn0sICAgezY2LCAwLCA1OTgsIDIsIDMyMH0sICAgIHs2NiwgMCwgNjAwLCAzLCAzMTZ9LA0KKyAgICB7NjYsIDAsIDYwMywgNywgMzE2fSwgICB7NjYsIDAsIDYxMCwgMywgMzE2fSwgICAgezY2LCAwLCA2MTMsIDAsIDMxNn0sDQorICAgIHs2NiwgMCwgNjEzLCA0LCAzMTd9LCAgIHs2NiwgMCwgNjE3LCA0LCAzMTh9LCAgICB7NjYsIDAsIDYyMSwgMiwgMzIwfSwNCisgICAgezY2LCAwLCA2MjMsIDUsIDMxNn0sICAgezY2LCAwLCA2MjgsIDIsIDMxNn0sICAgIHs2NiwgMCwgNjMwLCAyLCAzMTZ9LA0KKyAgICB7NjYsIDAsIDYzMiwgMiwgMzIwfSwgICB7NjYsIDAsIDYzNCwgMiwgMzIwfSwgICAgezY2LCAwLCA2MzYsIDQsIDMxNn0sDQorICAgIHs2NiwgMCwgNjQwLCAyLCAzMTZ9LCAgIHs2NiwgMCwgNjQyLCAxLCAzMTZ9LCAgICB7NjYsIDAsIDY0MywgMSwgMzE2fSwNCisgICAgezY2LCAwLCA2NDQsIDQsIDMxNn0sICAgezY2LCAwLCA2NDgsIDMsIDMxNn0sICAgIHs2NiwgNywgNjUxLCAyLCAzMTl9LA0KKyAgICB7NzMsIDAsIDY1MywgMiwgMzE2fSwgICB7NzMsIDAsIDY1NSwgMiwgMzE2fSwgICAgezczLCAwLCA2NTcsIDMsIDMxNn0sDQorICAgIHs3MywgNCwgNjYwLCA0LCAzMTJ9LCAgIHs3NywgMCwgNjY0LCAxMCwgMzE2fSwgICB7NzcsIDAsIDY3NCwgMiwgMzE2fSwNCisgICAgezc3LCAwLCA2NzYsIDQsIDMxNn0sICAgezc3LCAwLCA2ODAsIDQsIDMxNn0sICAgIHs3NywgMCwgNjg0LCAzLCAzMTZ9LA0KKyAgICB7NzcsIDAsIDY4NywgMiwgMzE2fSwgICB7NzcsIDAsIDY4OSwgMiwgMzE2fSwgICAgezc3LCAwLCA2OTEsIDgsIDMxN30sDQorICAgIHs3NywgMCwgNjk5LCAzLCAzMTZ9LCAgIHs3NywgMCwgNzAyLCAzLCAzMTZ9LCAgICB7NzcsIDAsIDcwNSwgMiwgMzE2fSwNCisgICAgezc3LCAwLCA3MDcsIDIsIDMxNn0sICAgezc3LCAwLCA3MDksIDUsIDMxNn0sICAgIHs3NywgMCwgNzE0LCA0LCAzMTZ9LA0KKyAgICB7NzcsIDAsIDcxOCwgMiwgMzE2fSwgICB7NzcsIDAsIDcyMCwgOCwgMzE4fSwgICAgezc3LCAwLCA3MjgsIDEsIDMxNn0sDQorICAgIHs3NywgMCwgNzI5LCAyLCAzMjB9LCAgIHs3NywgMCwgNzMxLCAzLCAzMTZ9LCAgICB7NzcsIDEsIDczNCwgNCwgMzE2fSwNCisgICAgezc4LCAwLCA3MzgsIDUsIDMxNn0sICAgezc4LCAwLCA3NDMsIDMsIDMxNn0sICAgIHs3OCwgMCwgNzQ2LCAxLCAzMTZ9LA0KKyAgICB7NzgsIDAsIDc0NywgMiwgMzIwfSwgICB7NzgsIDAsIDc0OSwgMCwgMzEzfSwgICAgezc4LCAwLCA3NDksIDIsIDMxNn0sDQorICAgIHs3OCwgNSwgNzUxLCAzLCAzMTZ9LCAgIHs4MywgMCwgNzU0LCA1LCAzMTZ9LCAgICB7ODMsIDAsIDc1OSwgNywgMzE2fSwNCisgICAgezgzLCAwLCA3NjYsIDYsIDMxNn0sICAgezgzLCAwLCA3NzIsIDMsIDMxNn0sICAgIHs4MywgMCwgNzc1LCAyLCAzMTZ9LA0KKyAgICB7ODMsIDAsIDc3NywgNSwgMzE2fSwgICB7ODMsIDAsIDc4MiwgMiwgMzE2fSwgICAgezgzLCAwLCA3ODQsIDAsIDMxNH0sDQorICAgIHs4MywgMCwgNzg0LCAyLCAzMTZ9LCAgIHs4MywgMCwgNzg2LCAxLCAzMTZ9LCAgICB7ODMsIDAsIDc4NywgMiwgMzE2fSwNCisgICAgezgzLCAwLCA3ODksIDUsIDMxNn0sICAgezgzLCAwLCA3OTQsIDIsIDMxNn0sICAgIHs4MywgMCwgNzk2LCAxLCAzMTZ9LA0KKyAgICB7ODMsIDAsIDc5NywgMiwgMzE2fSwgICB7ODMsIDAsIDc5OSwgMiwgMzE2fSwgICAgezgzLCAwLCA4MDEsIDYsIDMxNn0sDQorICAgIHs4MywgMCwgODA3LCAyLCAzMTZ9LCAgIHs4MywgMCwgODA5LCAyLCAzMjB9LCAgICB7ODMsIDAsIDgxMSwgMywgMzE2fSwNCisgICAgezgzLCAwLCA4MTQsIDQsIDMxNn0sICAgezgzLCAwLCA4MTgsIDIsIDMxNn0sICAgIHs4MywgMCwgODIwLCAyLCAzMTZ9LA0KKyAgICB7ODMsIDAsIDgyMiwgMiwgMzE2fSwgICB7ODMsIDAsIDgyNCwgMiwgMzE2fSwgICAgezgzLCAwLCA4MjYsIDIsIDMxNn0sDQorICAgIHs4MywgMCwgODI4LCAyLCAzMTZ9LCAgIHs4MywgMCwgODMwLCA0LCAzMTh9LCAgICB7ODMsIDEsIDgzNCwgMiwgMzE2fSwNCisgICAgezg0LCAwLCA4MzYsIDUsIDMxNn0sICAgezg0LCAwLCA4NDEsIDIwLCAzMTd9LCAgIHs4NCwgMCwgODYxLCAyLCAzMTZ9LA0KKyAgICB7ODQsIDAsIDg2MywgMCwgMzE2fSwgICB7ODQsIDAsIDg2MywgMiwgMzE2fSwgICAgezg0LCAwLCA4NjUsIDQsIDMyMH0sDQorICAgIHs4NCwgMCwgODY5LCAwLCAzMTZ9LCAgIHs4NCwgMCwgODY5LCAyLCAzMTZ9LCAgICB7ODQsIDAsIDg3MSwgMSwgMzE2fSwNCisgICAgezg0LCAwLCA4NzIsIDIsIDMxNn0sICAgezg0LCAwLCA4NzQsIDMsIDMxNn0sICAgIHs4NCwgMCwgODc3LCAyLCAzMTZ9LA0KKyAgICB7ODQsIDAsIDg3OSwgMiwgMzE2fSwgICB7ODQsIDAsIDg4MSwgNCwgMzE2fSwgICAgezg0LCAwLCA4ODUsIDMsIDMxNn0sDQorICAgIHs4NCwgMCwgODg4LCAxNywgMzE2fSwgIHs4NCwgNiwgOTA1LCAxLCAzMTl9LCAgICB7OTAsIDAsIDkwNiwgMiwgMzE2fSwNCisgICAgezkwLCAwLCA5MDgsIDIsIDMyMH0sICAgezkwLCAwLCA5MTAsIDIsIDMyMH0sICAgIHs5MCwgMCwgOTEyLCAyLCAzMTZ9LA0KKyAgICB7OTAsIDAsIDkxNCwgMiwgMzE2fSwgICB7OTAsIDAsIDkxNiwgNCwgMzE4fSwgICAgezkwLCAwLCA5MjAsIDIsIDMxNn0sDQorICAgIHs5MCwgNSwgOTIyLCAwLCAzMTJ9LCAgIHs5NSwgMCwgOTIyLCAyLCAzMTZ9LCAgICB7OTUsIDAsIDkyNCwgNCwgMzE2fSwNCisgICAgezk1LCAwLCA5MjgsIDQsIDMxNn0sICAgezk1LCAwLCA5MzIsIDYsIDMxNn0sICAgIHs5NSwgMCwgOTM4LCAyLCAzMTZ9LA0KKyAgICB7OTUsIDAsIDk0MCwgNCwgMzE2fSwgICB7OTUsIDAsIDk0NCwgMywgMzE2fSwgICAgezk1LCAwLCA5NDcsIDMsIDMxNn0sDQorICAgIHs5NSwgMCwgOTUwLCAyLCAzMTZ9LCAgIHs5NSwgMCwgOTUyLCAzLCAzMTZ9LCAgICB7OTUsIDAsIDk1NSwgMCwgMzE2fSwNCisgICAgezk1LCAwLCA5NTUsIDAsIDMxNn0sICAgezk1LCAwLCA5NTUsIDIsIDMxNn0sICAgIHs5NSwgMCwgOTU3LCA3LCAzMTZ9LA0KKyAgICB7OTUsIDAsIDk2NCwgMiwgMzE2fSwgICB7OTUsIDAsIDk2NiwgMCwgMzE5fSwgICAgezk1LCAwLCA5NjYsIDcsIDMxNn0sDQorICAgIHs5NSwgMCwgOTczLCAyLCAzMTZ9LCAgIHs5NSwgMCwgOTc1LCAyLCAzMTZ9LCAgICB7OTUsIDMsIDk3NywgMSwgMzE2fSwNCisgICAgezk4LCAwLCA5NzgsIDIsIDMyMH0sICAgezk4LCAwLCA5ODAsIDQsIDMxNn0sICAgIHs5OCwgMCwgOTg0LCAwLCAzMTZ9LA0KKyAgICB7OTgsIDAsIDk4NCwgMiwgMzE2fSwgICB7OTgsIDAsIDk4NiwgMiwgMzE2fSwgICAgezk4LCAwLCA5ODgsIDQsIDMxNn0sDQorICAgIHs5OCwgMCwgOTkyLCAxLCAzMTZ9LCAgIHs5OCwgMCwgOTkzLCAyLCAzMTZ9LCAgICB7OTgsIDAsIDk5NSwgMiwgMzE2fSwNCisgICAgezk4LCAwLCA5OTcsIDMsIDMxNn0sICAgezk4LCAwLCAxMDAwLCAyLCAzMTd9LCAgIHs5OCwgMCwgMTAwMiwgMCwgMzE2fSwNCisgICAgezk4LCAwLCAxMDAyLCA0LCAzMTZ9LCAgezk4LCAwLCAxMDA2LCA0LCAzMTZ9LCAgIHs5OCwgMCwgMTAxMCwgMiwgMzE2fSwNCisgICAgezk4LCAwLCAxMDEyLCAzLCAzMTZ9LCAgezk4LCAwLCAxMDE1LCA0LCAzMTZ9LCAgIHs5OCwgMCwgMTAxOSwgNywgMzE2fSwNCisgICAgezk4LCAwLCAxMDI2LCA0LCAzMTZ9LCAgezk4LCAwLCAxMDMwLCAxLCAzMTN9LCAgIHs5OCwgMTcsIDEwMzEsIDMsIDMxNn0sDQorICAgIHsxMTUsIDAsIDEwMzQsIDUsIDMxNn0sIHsxMTUsIDAsIDEwMzksIDIsIDMxNn0sICB7MTE1LCAwLCAxMDQxLCAxLCAzMTZ9LA0KKyAgICB7MTE1LCAwLCAxMDQyLCA0LCAzMTZ9LCB7MTE1LCAwLCAxMDQ2LCAyLCAzMTZ9LCAgezExNSwgMCwgMTA0OCwgMiwgMzE2fSwNCisgICAgezExNSwgMCwgMTA1MCwgMSwgMzE2fSwgezExNSwgMCwgMTA1MSwgMiwgMzE2fSwgIHsxMTUsIDAsIDEwNTMsIDUsIDMxNn0sDQorICAgIHsxMTUsIDAsIDEwNTgsIDEsIC0xfSwgIHsxMTUsIDQsIDEwNTksIDEsIDMxMn0sICB7MTE5LCAxLCAxMDYwLCAwLCAzMTN9LA0KKyAgICB7MTIwLCAyLCAxMDYwLCA4LCAzMTJ9LCB7MTIyLCAxMSwgMTA2OCwgNiwgMzE1fSwgezEzMywgMiwgMTA3NCwgMCwgMzE2fSwNCisgICAgezEzNSwgMCwgMTA3NCwgMCwgMzE2fSwgezEzNSwgMywgMTA3NCwgMiwgMzE2fSwgIHsxMzgsIDAsIDEwNzYsIDIsIDMxNn0sDQogfTsNCiBleHRlcm4gY29uc3QgWEZBX01FVEhPRElORk8gZ19Tb21NZXRob2REYXRhW10gPSB7DQotICAgIHsweDNjNzUyNDk1LCBMInZlcmlmeSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfVmVyaWZ5fSwJezB4YTY4NjM1ZjEsIEwic2lnbiIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfU2lnbn0sCXsweGE3ZjJjNWU2LCBMImVudW1lcmF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfRW51bWVyYXRlfSwNCi0gICAgezB4ZDhlZDE0NjcsIEwiY2xlYXIiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6U2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX0NsZWFyfSwJezB4NGJkY2NlMTMsIEwiZXhlY3V0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Xc2RsQ29ubmVjdGlvbl9FeGVjdXRlfSwJezB4MWMyOTZiYTQsIEwicmVzdG9yZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9EZWx0YV9SZXN0b3JlfSwNCi0gICAgezB4N2QxMjNhOSwgTCJjbGVhckl0ZW1zIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0NsZWFySXRlbXN9LAl7MHhmYjBiMDA3LCBMImV4ZWNFdmVudCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjRXZlbnR9LAl7MHg2NzE2Y2U5NywgTCJleGVjSW5pdGlhbGl6ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjSW5pdGlhbGl6ZX0sDQotICAgIHsweDdiYjkxOWMyLCBMImRlbGV0ZUl0ZW0iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRGVsZXRlSXRlbX0sCXsweDlmMDUzZDVlLCBMImdldFNhdmVJdGVtIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldFNhdmVJdGVtfSwJezB4YmJkMzI3NDcsIEwiYm91bmRJdGVtIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0JvdW5kSXRlbX0sDQotICAgIHsweGM0OTJkOTUwLCBMImdldEl0ZW1TdGF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9HZXRJdGVtU3RhdGV9LAl7MHhjNjAxM2NkMywgTCJleGVjQ2FsY3VsYXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0V4ZWNDYWxjdWxhdGV9LAl7MHhkODkzMGQwZSwgTCJzZXRJdGVtcyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9TZXRJdGVtc30sDQotICAgIHsweGUwZjE1MDQ1LCBMImdldERpc3BsYXlJdGVtIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldERpc3BsYXlJdGVtfSwJezB4ZTIzYWNkZGMsIEwic2V0SXRlbVN0YXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1NldEl0ZW1TdGF0ZX0sCXsweGUyZGZiMmY4LCBMImFkZEl0ZW0iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQWRkSXRlbX0sDQotICAgIHsweGVmOGNlNDhmLCBMImV4ZWNWYWxpZGF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjVmFsaWRhdGV9LAl7MHg0NjEwNzllZiwgTCJlbWl0IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfRW1pdH0sCXsweGZlYzkwYzYzLCBMInJlc2V0IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUmVzZXR9LA0KLSAgICB7MHhmYjBiMDA3LCBMImV4ZWNFdmVudCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY0V2ZW50fSwJezB4M2Q4MzIyMjEsIEwic2VsZWN0ZWRNZW1iZXIiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX1NlbGVjdGVkTWVtYmVyfSwJezB4NjcxNmNlOTcsIEwiZXhlY0luaXRpYWxpemUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNJbml0aWFsaXplfSwNCi0gICAgezB4YzYwMTNjZDMsIEwiZXhlY0NhbGN1bGF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY0NhbGN1bGF0ZX0sCXsweGVmOGNlNDhmLCBMImV4ZWNWYWxpZGF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY1ZhbGlkYXRlfSwJezB4ZmIwYjAwNywgTCJleGVjRXZlbnQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9FeGVjRXZlbnR9LA0KLSAgICB7MHg2NzE2Y2U5NywgTCJleGVjSW5pdGlhbGl6ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNJbml0aWFsaXplfSwJezB4YzYwMTNjZDMsIEwiZXhlY0NhbGN1bGF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNDYWxjdWxhdGV9LAl7MHhkOWI5YjFmMSwgTCJnZXRJbnZhbGlkT2JqZWN0cyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0dldEludmFsaWRPYmplY3RzfSwNCi0gICAgezB4ZWY4Y2U0OGYsIEwiZXhlY1ZhbGlkYXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY1ZhbGlkYXRlfSwJezB4YTM2NmI3YywgTCJleHBvcnREYXRhIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0V4cG9ydERhdGF9LAl7MHgxNmNjMjI2YywgTCJnb3RvVVJMIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0dvdG9VUkx9LA0KLSAgICB7MHgxZTA3MjJmNSwgTCJwYWdlRG93biIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QYWdlRG93bn0sCXsweDNlNjZjYjJjLCBMInNldEZvY3VzIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1NldEZvY3VzfSwJezB4NGFjOWZhYWUsIEwib3Blbkxpc3QiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfT3Blbkxpc3R9LA0KLSAgICB7MHg3Yjg5NzE0ZiwgTCJyZXNwb25zZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9SZXNwb25zZX0sCXsweDdmZDlmZDU4LCBMImRvY3VtZW50SW5CYXRjaCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Eb2N1bWVudEluQmF0Y2h9LAl7MHhhZjFkMDE5ZCwgTCJyZXNldERhdGEiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUmVzZXREYXRhfSwNCi0gICAgezB4YjA3YmUxM2MsIEwiYmVlcCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9CZWVwfSwJezB4YjE4ODJjYTAsIEwiZ2V0Rm9jdXMiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfR2V0Rm9jdXN9LAl7MHhiZjRiYTllZSwgTCJtZXNzYWdlQm94IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX01lc3NhZ2VCb3h9LA0KLSAgICB7MHhkNmQ0ZGJjMSwgTCJkb2N1bWVudENvdW50SW5CYXRjaCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Eb2N1bWVudENvdW50SW5CYXRjaH0sCXsweGRkNzY3NmVkLCBMInByaW50IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ByaW50fSwJezB4ZTJmODYzZDAsIEwiY3VycmVudERhdGVUaW1lIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0N1cnJlbnREYXRlVGltZX0sDQotICAgIHsweGY5OTVkMGY1LCBMImltcG9ydERhdGEiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfSW1wb3J0RGF0YX0sCXsweGZlYjk2YjYyLCBMInBhZ2VVcCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QYWdlVXB9LAl7MHg2OCwgTCJoIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IfSwNCi0gICAgezB4NzcsIEwidyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfV30sCXsweDc4LCBMIngiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1h9LAl7MHg3OSwgTCJ5IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9ZfSwNCi0gICAgezB4NTQ2MDIwNiwgTCJwYWdlQ291bnQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VDb3VudH0sCXsweDVlYjViMGYsIEwicGFnZVNwYW4iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VTcGFufSwJezB4MTBmMWIxYmQsIEwicGFnZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZX0sDQotICAgIHsweDFjMWU2MzE4LCBMInBhZ2VDb250ZW50IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlQ29udGVudH0sCXsweDFjMWY0YTVjLCBMImFic1BhZ2VDb3VudCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUNvdW50fSwJezB4MWVjNDdkYjUsIEwiYWJzUGFnZUNvdW50SW5CYXRjaCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUNvdW50SW5CYXRjaH0sDQotICAgIHsweDJlNGVjYmRiLCBMInNoZWV0Q291bnRJbkJhdGNoIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldENvdW50SW5CYXRjaH0sCXsweDJmY2ZmNGI1LCBMInJlbGF5b3V0IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWxheW91dH0sCXsweDNiZjFjMmE1LCBMImFic1BhZ2VTcGFuIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlU3Bhbn0sDQotICAgIHsweDU3NzVjMmNjLCBMImFic1BhZ2VJbkJhdGNoIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlSW5CYXRjaH0sCXsweDhjNWZlYjMyLCBMInNoZWV0SW5CYXRjaCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRJbkJhdGNofSwJezB4OGYzYTgzNzksIEwic2hlZXQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1NoZWV0fSwNCi0gICAgezB4OTZmM2M0Y2IsIEwicmVsYXlvdXRQYWdlQXJlYSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUmVsYXlvdXRQYWdlQXJlYX0sCXsweGQyYTRhNTQyLCBMInNoZWV0Q291bnQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1NoZWV0Q291bnR9LAl7MHhlNzRmMDY1MywgTCJhYnNQYWdlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlfSwNCi0gICAgezB4NDRjMzUyYWQsIEwiZm9ybU5vZGVzIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0Zvcm1Ob2Rlc30sCXsweDQ1ZWZiODQ3LCBMInJlbWVyZ2UiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfUmVtZXJnZX0sCXsweDY3MTZjZTk3LCBMImV4ZWNJbml0aWFsaXplIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNJbml0aWFsaXplfSwNCi0gICAgezB4NzEyYzZhZmEsIEwiY3JlYXRlTm9kZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9DcmVhdGVOb2RlfSwJezB4YThhMzVlMjUsIEwicmVjYWxjdWxhdGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfUmVjYWxjdWxhdGV9LAl7MHhjNjAxM2NkMywgTCJleGVjQ2FsY3VsYXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNDYWxjdWxhdGV9LA0KLSAgICB7MHhlZjhjZTQ4ZiwgTCJleGVjVmFsaWRhdGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRXhlY1ZhbGlkYXRlfSwJezB4NGNjMWMwZjksIEwibW92ZUN1cnJlbnRSZWNvcmQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Nb3ZlQ3VycmVudFJlY29yZH0sCXsweDU3NzlkNjVmLCBMInJlY29yZCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X1JlY29yZH0sDQotICAgIHsweDhhNDc2NDk4LCBMImdvdG9SZWNvcmQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Hb3RvUmVjb3JkfSwJezB4YWFjMjQxYzgsIEwiaXNSZWNvcmRHcm91cCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X0lzUmVjb3JkR3JvdXB9LAl7MHgxYzZmNDI3NywgTCJldmFsdWF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9NYW5pZmVzdF9FdmFsdWF0ZX0sDQotICAgIHsweDJhZmVjMmNjLCBMIm1vdmVJbnN0YW5jZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlfSwJezB4MmJmOTRhNjMsIEwicmVtb3ZlSW5zdGFuY2UiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX1JlbW92ZUluc3RhbmNlfSwJezB4MzAzYWRhZjQsIEwic2V0SW5zdGFuY2VzIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9TZXRJbnN0YW5jZXN9LA0KLSAgICB7MHg0ZDc2Yjg5ZSwgTCJhZGRJbnN0YW5jZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfQWRkSW5zdGFuY2V9LAl7MHhjNjYwZGM4YSwgTCJpbnNlcnRJbnN0YW5jZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfSW5zZXJ0SW5zdGFuY2V9LAl7MHhkZGZkMWVhMSwgTCJtZXRhZGF0YSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9EZXNjX01ldGFkYXRhfSwNCi0gICAgezB4NDRjMzUyYWQsIEwiZm9ybU5vZGVzIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRm9ybU5vZGVzfSwJezB4NDVlZmI4NDcsIEwicmVtZXJnZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX1JlbWVyZ2V9LAl7MHg2NzE2Y2U5NywgTCJleGVjSW5pdGlhbGl6ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0V4ZWNJbml0aWFsaXplfSwNCi0gICAgezB4YThhMzVlMjUsIEwicmVjYWxjdWxhdGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9SZWNhbGN1bGF0ZX0sCXsweGM2MDEzY2QzLCBMImV4ZWNDYWxjdWxhdGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9FeGVjQ2FsY3VsYXRlfSwJezB4ZWY4Y2U0OGYsIEwiZXhlY1ZhbGlkYXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRXhlY1ZhbGlkYXRlfSwNCi0gICAgezB4NjA0OTBhODUsIEwibWVzc2FnZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfTWVzc2FnZX0sCXsweDYwZWNmY2M5LCBMInRyYWNlRGVhY3RpdmF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VEZWFjdGl2YXRlfSwJezB4ODZhMGY0YzAsIEwidHJhY2VBY3RpdmF0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VBY3RpdmF0ZX0sDQotICAgIHsweDkzZWFjMzlhLCBMInRyYWNlRW5hYmxlZCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VFbmFibGVkfSwJezB4ZDEyMjdlNmYsIEwidHJhY2UiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlfSwJezB4MzZjMGVlMTQsIEwiZ2V0QXR0cmlidXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9HZXRBdHRyaWJ1dGV9LA0KLSAgICB7MHg1NDY4ZTJhMCwgTCJzZXRBdHRyaWJ1dGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X1NldEF0dHJpYnV0ZX0sCXsweGFkYzQ4ZGUyLCBMInJlbW92ZUF0dHJpYnV0ZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9QYWNrZXRfUmVtb3ZlQXR0cmlidXRlfSwJezB4Mzg0OGIzZiwgTCJuZXh0IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9OZXh0fSwNCi0gICAgezB4MTRlMjViYzgsIEwiY2FuY2VsQmF0Y2giLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0NhbmNlbEJhdGNofSwJezB4M2NlMDVkNjgsIEwiZmlyc3QiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0ZpcnN0fSwJezB4NjQ5ZTFlNjUsIEwidXBkYXRlQmF0Y2giLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1VwZGF0ZUJhdGNofSwNCi0gICAgezB4NmEzNDA1ZGQsIEwicHJldmlvdXMiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1ByZXZpb3VzfSwJezB4NzQ4MThmYjMsIEwiaXNCT0YiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0lzQk9GfSwJezB4NzRkMDdhNzYsIEwiaXNFT0YiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0lzRU9GfSwNCi0gICAgezB4NzYxM2NiNjYsIEwiY2FuY2VsIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9DYW5jZWx9LAl7MHg3YmFjYTJlMywgTCJ1cGRhdGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1VwZGF0ZX0sCXsweDhiOTBlMWYyLCBMIm9wZW4iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX09wZW59LA0KLSAgICB7MHg5YzY0NzFiMywgTCJkZWxldGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0RlbGV0ZX0sCXsweGE3MzE1MDkzLCBMImFkZE5ldyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQWRkTmV3fSwJezB4YTdjZTVmOGQsIEwicmVxdWVyeSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfUmVxdWVyeX0sDQotICAgIHsweGM3MzY4Njc0LCBMInJlc3luYyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfUmVzeW5jfSwJezB4ZDlmNDdmMzYsIEwiY2xvc2UiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0Nsb3NlfSwJezB4ZjU0NDgxZDQsIEwibGFzdCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfTGFzdH0sDQotICAgIHsweGY3OTY1NDYwLCBMImhhc0RhdGFDaGFuZ2VkIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9IYXNEYXRhQ2hhbmdlZH0sCXsweDYyNzVmNmFmLCBMIml0ZW0iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19JdGVtfSwJezB4NzAzM2JmZDUsIEwiaW5zZXJ0IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfSW5zZXJ0fSwNCi0gICAgezB4OWNhYjdjYWUsIEwicmVtb3ZlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfUmVtb3ZlfSwJezB4ZGExMmU1MTgsIEwiYXBwZW5kIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfQXBwZW5kfSwJezB4ZDg5MmEwNTQsIEwibmFtZWRJdGVtIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9UcmVlbGlzdENsYXNzX05hbWVkSXRlbX0sDQotICAgIHsweGJhMmRkMzg2LCBMInJlc29sdmVOb2RlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19SZXNvbHZlTm9kZX0sCXsweGU1MDllMmI5LCBMInJlc29sdmVOb2RlcyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGVzfSwJezB4MWJjYTFlYmQsIEwiYXBwbHlYU0wiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0FwcGx5WFNMfSwNCi0gICAgezB4MzZjMGVlMTQsIEwiZ2V0QXR0cmlidXRlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19HZXRBdHRyaWJ1dGV9LAl7MHg1NDY4ZTJhMCwgTCJzZXRBdHRyaWJ1dGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NldEF0dHJpYnV0ZX0sCXsweDVlZTAwOTk2LCBMInNldEVsZW1lbnQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NldEVsZW1lbnR9LA0KLSAgICB7MHg5MmRhZGE0ZiwgTCJzYXZlRmlsdGVyZWRYTUwiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NhdmVGaWx0ZXJlZFhNTH0sCXsweDljNDU2NTAwLCBMInNhdmVYTUwiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NhdmVYTUx9LAl7MHhhYmQzMjAwYSwgTCJnZXRFbGVtZW50IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19HZXRFbGVtZW50fSwNCi0gICAgezB4YjI2OWM2MGQsIEwiaXNQcm9wZXJ0eVNwZWNpZmllZCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfSXNQcm9wZXJ0eVNwZWNpZmllZH0sCXsweGI1MjhiZTkxLCBMImxvYWRYTUwiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0xvYWRYTUx9LAl7MHhkOWY0NjU5MSwgTCJjbG9uZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQ2xvbmV9LA0KLSAgICB7MHhlMDA2YTc2YiwgTCJhc3NpZ25Ob2RlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Bc3NpZ25Ob2RlfSwJezB4NzMwM2ZjZWEsIEwiZ2V0RGVsdGEiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQ29udGFpbmVyQ2xhc3NfR2V0RGVsdGF9LAl7MHhlNzc0MmM5ZCwgTCJnZXREZWx0YXMiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQ29udGFpbmVyQ2xhc3NfR2V0RGVsdGFzfSwNCi0gICAgezB4MzBmZjZhYWQsIEwiY2xlYXJFcnJvckxpc3QiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19DbGVhckVycm9yTGlzdH0sCXsweDcxMmM2YWZhLCBMImNyZWF0ZU5vZGUiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19DcmVhdGVOb2RlfSwJezB4ODNhNjQxMWQsIEwiaXNDb21wYXRpYmxlTlMiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19Jc0NvbXBhdGlibGVOU30sDQorICAgIHsweDNjNzUyNDk1LCBMInZlcmlmeSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9WZXJpZnl9LA0KKyAgICB7MHhhNjg2MzVmMSwgTCJzaWduIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9TaWdufSwNCisgICAgezB4YTdmMmM1ZTYsIEwiZW51bWVyYXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfRW51bWVyYXRlfSwNCisgICAgezB4ZDhlZDE0NjcsIEwiY2xlYXIiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9DbGVhcn0sDQorICAgIHsweDRiZGNjZTEzLCBMImV4ZWN1dGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1dzZGxDb25uZWN0aW9uX0V4ZWN1dGV9LA0KKyAgICB7MHgxYzI5NmJhNCwgTCJyZXN0b3JlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9EZWx0YV9SZXN0b3JlfSwNCisgICAgezB4N2QxMjNhOSwgTCJjbGVhckl0ZW1zIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9DbGVhckl0ZW1zfSwNCisgICAgezB4ZmIwYjAwNywgTCJleGVjRXZlbnQiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0V4ZWNFdmVudH0sDQorICAgIHsweDY3MTZjZTk3LCBMImV4ZWNJbml0aWFsaXplIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjSW5pdGlhbGl6ZX0sDQorICAgIHsweDdiYjkxOWMyLCBMImRlbGV0ZUl0ZW0iLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0RlbGV0ZUl0ZW19LA0KKyAgICB7MHg5ZjA1M2Q1ZSwgTCJnZXRTYXZlSXRlbSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfR2V0U2F2ZUl0ZW19LA0KKyAgICB7MHhiYmQzMjc0NywgTCJib3VuZEl0ZW0iLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0JvdW5kSXRlbX0sDQorICAgIHsweGM0OTJkOTUwLCBMImdldEl0ZW1TdGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfR2V0SXRlbVN0YXRlfSwNCisgICAgezB4YzYwMTNjZDMsIEwiZXhlY0NhbGN1bGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY0NhbGN1bGF0ZX0sDQorICAgIHsweGQ4OTMwZDBlLCBMInNldEl0ZW1zIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9TZXRJdGVtc30sDQorICAgIHsweGUwZjE1MDQ1LCBMImdldERpc3BsYXlJdGVtIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9HZXREaXNwbGF5SXRlbX0sDQorICAgIHsweGUyM2FjZGRjLCBMInNldEl0ZW1TdGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfU2V0SXRlbVN0YXRlfSwNCisgICAgezB4ZTJkZmIyZjgsIEwiYWRkSXRlbSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQWRkSXRlbX0sDQorICAgIHsweGVmOGNlNDhmLCBMImV4ZWNWYWxpZGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY1ZhbGlkYXRlfSwNCisgICAgezB4NDYxMDc5ZWYsIEwiZW1pdCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0VtaXR9LA0KKyAgICB7MHhmZWM5MGM2MywgTCJyZXNldCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9SZXNldH0sDQorICAgIHsweGZiMGIwMDcsIEwiZXhlY0V2ZW50IiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY0V2ZW50fSwNCisgICAgezB4M2Q4MzIyMjEsIEwic2VsZWN0ZWRNZW1iZXIiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9TZWxlY3RlZE1lbWJlcn0sDQorICAgIHsweDY3MTZjZTk3LCBMImV4ZWNJbml0aWFsaXplIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY0luaXRpYWxpemV9LA0KKyAgICB7MHhjNjAxM2NkMywgTCJleGVjQ2FsY3VsYXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY0NhbGN1bGF0ZX0sDQorICAgIHsweGVmOGNlNDhmLCBMImV4ZWNWYWxpZGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNWYWxpZGF0ZX0sDQorICAgIHsweGZiMGIwMDcsIEwiZXhlY0V2ZW50IiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNFdmVudH0sDQorICAgIHsweDY3MTZjZTk3LCBMImV4ZWNJbml0aWFsaXplIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNJbml0aWFsaXplfSwNCisgICAgezB4YzYwMTNjZDMsIEwiZXhlY0NhbGN1bGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9FeGVjQ2FsY3VsYXRlfSwNCisgICAgezB4ZDliOWIxZjEsIEwiZ2V0SW52YWxpZE9iamVjdHMiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fR2V0SW52YWxpZE9iamVjdHN9LA0KKyAgICB7MHhlZjhjZTQ4ZiwgTCJleGVjVmFsaWRhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY1ZhbGlkYXRlfSwNCisgICAgezB4YTM2NmI3YywgTCJleHBvcnREYXRhIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRXhwb3J0RGF0YX0sDQorICAgIHsweDE2Y2MyMjZjLCBMImdvdG9VUkwiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfR290b1VSTH0sDQorICAgIHsweDFlMDcyMmY1LCBMInBhZ2VEb3duIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QYWdlRG93bn0sDQorICAgIHsweDNlNjZjYjJjLCBMInNldEZvY3VzIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9TZXRGb2N1c30sDQorICAgIHsweDRhYzlmYWFlLCBMIm9wZW5MaXN0IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9PcGVuTGlzdH0sDQorICAgIHsweDdiODk3MTRmLCBMInJlc3BvbnNlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9SZXNwb25zZX0sDQorICAgIHsweDdmZDlmZDU4LCBMImRvY3VtZW50SW5CYXRjaCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRG9jdW1lbnRJbkJhdGNofSwNCisgICAgezB4YWYxZDAxOWQsIEwicmVzZXREYXRhIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUmVzZXREYXRhfSwNCisgICAgezB4YjA3YmUxM2MsIEwiYmVlcCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9CZWVwfSwNCisgICAgezB4YjE4ODJjYTAsIEwiZ2V0Rm9jdXMiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0dldEZvY3VzfSwNCisgICAgezB4YmY0YmE5ZWUsIEwibWVzc2FnZUJveCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9NZXNzYWdlQm94fSwNCisgICAgezB4ZDZkNGRiYzEsIEwiZG9jdW1lbnRDb3VudEluQmF0Y2giLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0RvY3VtZW50Q291bnRJbkJhdGNofSwNCisgICAgezB4ZGQ3Njc2ZWQsIEwicHJpbnQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ByaW50fSwNCisgICAgezB4ZTJmODYzZDAsIEwiY3VycmVudERhdGVUaW1lIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9DdXJyZW50RGF0ZVRpbWV9LA0KKyAgICB7MHhmOTk1ZDBmNSwgTCJpbXBvcnREYXRhIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ltcG9ydERhdGF9LA0KKyAgICB7MHhmZWI5NmI2MiwgTCJwYWdlVXAiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QYWdlVXB9LA0KKyAgICB7MHg2OCwgTCJoIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IfSwNCisgICAgezB4NzcsIEwidyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfV30sDQorICAgIHsweDc4LCBMIngiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1h9LA0KKyAgICB7MHg3OSwgTCJ5IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9ZfSwNCisgICAgezB4NTQ2MDIwNiwgTCJwYWdlQ291bnQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlQ291bnR9LA0KKyAgICB7MHg1ZWI1YjBmLCBMInBhZ2VTcGFuIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlU3Bhbn0sDQorICAgIHsweDEwZjFiMWJkLCBMInBhZ2UiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2V9LA0KKyAgICB7MHgxYzFlNjMxOCwgTCJwYWdlQ29udGVudCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VDb250ZW50fSwNCisgICAgezB4MWMxZjRhNWMsIEwiYWJzUGFnZUNvdW50IiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUNvdW50fSwNCisgICAgezB4MWVjNDdkYjUsIEwiYWJzUGFnZUNvdW50SW5CYXRjaCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VDb3VudEluQmF0Y2h9LA0KKyAgICB7MHgyZTRlY2JkYiwgTCJzaGVldENvdW50SW5CYXRjaCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1NoZWV0Q291bnRJbkJhdGNofSwNCisgICAgezB4MmZjZmY0YjUsIEwicmVsYXlvdXQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWxheW91dH0sDQorICAgIHsweDNiZjFjMmE1LCBMImFic1BhZ2VTcGFuIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZVNwYW59LA0KKyAgICB7MHg1Nzc1YzJjYywgTCJhYnNQYWdlSW5CYXRjaCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VJbkJhdGNofSwNCisgICAgezB4OGM1ZmViMzIsIEwic2hlZXRJbkJhdGNoIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRJbkJhdGNofSwNCisgICAgezB4OGYzYTgzNzksIEwic2hlZXQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldH0sDQorICAgIHsweDk2ZjNjNGNiLCBMInJlbGF5b3V0UGFnZUFyZWEiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWxheW91dFBhZ2VBcmVhfSwNCisgICAgezB4ZDJhNGE1NDIsIEwic2hlZXRDb3VudCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1NoZWV0Q291bnR9LA0KKyAgICB7MHhlNzRmMDY1MywgTCJhYnNQYWdlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlfSwNCisgICAgezB4NDRjMzUyYWQsIEwiZm9ybU5vZGVzIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9Gb3JtTm9kZXN9LA0KKyAgICB7MHg0NWVmYjg0NywgTCJyZW1lcmdlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZW1lcmdlfSwNCisgICAgezB4NjcxNmNlOTcsIEwiZXhlY0luaXRpYWxpemUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNJbml0aWFsaXplfSwNCisgICAgezB4NzEyYzZhZmEsIEwiY3JlYXRlTm9kZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfQ3JlYXRlTm9kZX0sDQorICAgIHsweGE4YTM1ZTI1LCBMInJlY2FsY3VsYXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZWNhbGN1bGF0ZX0sDQorICAgIHsweGM2MDEzY2QzLCBMImV4ZWNDYWxjdWxhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNDYWxjdWxhdGV9LA0KKyAgICB7MHhlZjhjZTQ4ZiwgTCJleGVjVmFsaWRhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNWYWxpZGF0ZX0sDQorICAgIHsweDRjYzFjMGY5LCBMIm1vdmVDdXJyZW50UmVjb3JkIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6Og0KKyAgICAgICAgIFNjcmlwdF9EYXRhV2luZG93X01vdmVDdXJyZW50UmVjb3JkfSwNCisgICAgezB4NTc3OWQ2NWYsIEwicmVjb3JkIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X1JlY29yZH0sDQorICAgIHsweDhhNDc2NDk4LCBMImdvdG9SZWNvcmQiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfR290b1JlY29yZH0sDQorICAgIHsweGFhYzI0MWM4LCBMImlzUmVjb3JkR3JvdXAiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfSXNSZWNvcmRHcm91cH0sDQorICAgIHsweDFjNmY0Mjc3LCBMImV2YWx1YXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9NYW5pZmVzdF9FdmFsdWF0ZX0sDQorICAgIHsweDJhZmVjMmNjLCBMIm1vdmVJbnN0YW5jZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01vdmVJbnN0YW5jZX0sDQorICAgIHsweDJiZjk0YTYzLCBMInJlbW92ZUluc3RhbmNlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSW5zdGFuY2V9LA0KKyAgICB7MHgzMDNhZGFmNCwgTCJzZXRJbnN0YW5jZXMiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9TZXRJbnN0YW5jZXN9LA0KKyAgICB7MHg0ZDc2Yjg5ZSwgTCJhZGRJbnN0YW5jZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0FkZEluc3RhbmNlfSwNCisgICAgezB4YzY2MGRjOGEsIEwiaW5zZXJ0SW5zdGFuY2UiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9JbnNlcnRJbnN0YW5jZX0sDQorICAgIHsweGRkZmQxZWExLCBMIm1ldGFkYXRhIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9EZXNjX01ldGFkYXRhfSwNCisgICAgezB4NDRjMzUyYWQsIEwiZm9ybU5vZGVzIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0Zvcm1Ob2Rlc30sDQorICAgIHsweDQ1ZWZiODQ3LCBMInJlbWVyZ2UiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fUmVtZXJnZX0sDQorICAgIHsweDY3MTZjZTk3LCBMImV4ZWNJbml0aWFsaXplIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0V4ZWNJbml0aWFsaXplfSwNCisgICAgezB4YThhMzVlMjUsIEwicmVjYWxjdWxhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fUmVjYWxjdWxhdGV9LA0KKyAgICB7MHhjNjAxM2NkMywgTCJleGVjQ2FsY3VsYXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0V4ZWNDYWxjdWxhdGV9LA0KKyAgICB7MHhlZjhjZTQ4ZiwgTCJleGVjVmFsaWRhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRXhlY1ZhbGlkYXRlfSwNCisgICAgezB4NjA0OTBhODUsIEwibWVzc2FnZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfTG9nUHNldWRvTW9kZWxfTWVzc2FnZX0sDQorICAgIHsweDYwZWNmY2M5LCBMInRyYWNlRGVhY3RpdmF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlRGVhY3RpdmF0ZX0sDQorICAgIHsweDg2YTBmNGMwLCBMInRyYWNlQWN0aXZhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTG9nUHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZUFjdGl2YXRlfSwNCisgICAgezB4OTNlYWMzOWEsIEwidHJhY2VFbmFibGVkIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTG9nUHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlRW5hYmxlZH0sDQorICAgIHsweGQxMjI3ZTZmLCBMInRyYWNlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2V9LA0KKyAgICB7MHgzNmMwZWUxNCwgTCJnZXRBdHRyaWJ1dGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9HZXRBdHRyaWJ1dGV9LA0KKyAgICB7MHg1NDY4ZTJhMCwgTCJzZXRBdHRyaWJ1dGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9TZXRBdHRyaWJ1dGV9LA0KKyAgICB7MHhhZGM0OGRlMiwgTCJyZW1vdmVBdHRyaWJ1dGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9SZW1vdmVBdHRyaWJ1dGV9LA0KKyAgICB7MHgzODQ4YjNmLCBMIm5leHQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX05leHR9LA0KKyAgICB7MHgxNGUyNWJjOCwgTCJjYW5jZWxCYXRjaCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0NhbmNlbEJhdGNofSwNCisgICAgezB4M2NlMDVkNjgsIEwiZmlyc3QiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9GaXJzdH0sDQorICAgIHsweDY0OWUxZTY1LCBMInVwZGF0ZUJhdGNoIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfVXBkYXRlQmF0Y2h9LA0KKyAgICB7MHg2YTM0MDVkZCwgTCJwcmV2aW91cyIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1ByZXZpb3VzfSwNCisgICAgezB4NzQ4MThmYjMsIEwiaXNCT0YiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9Jc0JPRn0sDQorICAgIHsweDc0ZDA3YTc2LCBMImlzRU9GIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfSXNFT0Z9LA0KKyAgICB7MHg3NjEzY2I2NiwgTCJjYW5jZWwiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9DYW5jZWx9LA0KKyAgICB7MHg3YmFjYTJlMywgTCJ1cGRhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9VcGRhdGV9LA0KKyAgICB7MHg4YjkwZTFmMiwgTCJvcGVuIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9PcGVufSwNCisgICAgezB4OWM2NDcxYjMsIEwiZGVsZXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfRGVsZXRlfSwNCisgICAgezB4YTczMTUwOTMsIEwiYWRkTmV3IiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQWRkTmV3fSwNCisgICAgezB4YTdjZTVmOGQsIEwicmVxdWVyeSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1JlcXVlcnl9LA0KKyAgICB7MHhjNzM2ODY3NCwgTCJyZXN5bmMiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9SZXN5bmN9LA0KKyAgICB7MHhkOWY0N2YzNiwgTCJjbG9zZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0Nsb3NlfSwNCisgICAgezB4ZjU0NDgxZDQsIEwibGFzdCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfTGFzdH0sDQorICAgIHsweGY3OTY1NDYwLCBMImhhc0RhdGFDaGFuZ2VkIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfSGFzRGF0YUNoYW5nZWR9LA0KKyAgICB7MHg2Mjc1ZjZhZiwgTCJpdGVtIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0l0ZW19LA0KKyAgICB7MHg3MDMzYmZkNSwgTCJpbnNlcnQiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfSW5zZXJ0fSwNCisgICAgezB4OWNhYjdjYWUsIEwicmVtb3ZlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX1JlbW92ZX0sDQorICAgIHsweGRhMTJlNTE4LCBMImFwcGVuZCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19BcHBlbmR9LA0KKyAgICB7MHhkODkyYTA1NCwgTCJuYW1lZEl0ZW0iLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9UcmVlbGlzdENsYXNzX05hbWVkSXRlbX0sDQorICAgIHsweGJhMmRkMzg2LCBMInJlc29sdmVOb2RlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGV9LA0KKyAgICB7MHhlNTA5ZTJiOSwgTCJyZXNvbHZlTm9kZXMiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19SZXNvbHZlTm9kZXN9LA0KKyAgICB7MHgxYmNhMWViZCwgTCJhcHBseVhTTCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0FwcGx5WFNMfSwNCisgICAgezB4MzZjMGVlMTQsIEwiZ2V0QXR0cmlidXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfR2V0QXR0cmlidXRlfSwNCisgICAgezB4NTQ2OGUyYTAsIEwic2V0QXR0cmlidXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2V0QXR0cmlidXRlfSwNCisgICAgezB4NWVlMDA5OTYsIEwic2V0RWxlbWVudCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NldEVsZW1lbnR9LA0KKyAgICB7MHg5MmRhZGE0ZiwgTCJzYXZlRmlsdGVyZWRYTUwiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19TYXZlRmlsdGVyZWRYTUx9LA0KKyAgICB7MHg5YzQ1NjUwMCwgTCJzYXZlWE1MIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZVhNTH0sDQorICAgIHsweGFiZDMyMDBhLCBMImdldEVsZW1lbnQiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19HZXRFbGVtZW50fSwNCisgICAgezB4YjI2OWM2MGQsIEwiaXNQcm9wZXJ0eVNwZWNpZmllZCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0lzUHJvcGVydHlTcGVjaWZpZWR9LA0KKyAgICB7MHhiNTI4YmU5MSwgTCJsb2FkWE1MIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTG9hZFhNTH0sDQorICAgIHsweGQ5ZjQ2NTkxLCBMImNsb25lIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQ2xvbmV9LA0KKyAgICB7MHhlMDA2YTc2YiwgTCJhc3NpZ25Ob2RlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQXNzaWduTm9kZX0sDQorICAgIHsweDczMDNmY2VhLCBMImdldERlbHRhIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YX0sDQorICAgIHsweGU3NzQyYzlkLCBMImdldERlbHRhcyIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQ29udGFpbmVyQ2xhc3NfR2V0RGVsdGFzfSwNCisgICAgezB4MzBmZjZhYWQsIEwiY2xlYXJFcnJvckxpc3QiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfQ2xlYXJFcnJvckxpc3R9LA0KKyAgICB7MHg3MTJjNmFmYSwgTCJjcmVhdGVOb2RlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NyZWF0ZU5vZGV9LA0KKyAgICB7MHg4M2E2NDExZCwgTCJpc0NvbXBhdGlibGVOUyIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19Jc0NvbXBhdGlibGVOU30sDQogfTsNCi1leHRlcm4gY29uc3QgaW50MzJfdCBnX2lTb21NZXRob2RDb3VudCA9IHNpemVvZihnX1NvbU1ldGhvZERhdGEpIC8gc2l6ZW9mKFhGQV9NRVRIT0RJTkZPKTsNCitleHRlcm4gY29uc3QgaW50MzJfdCBnX2lTb21NZXRob2RDb3VudCA9DQorICAgIHNpemVvZihnX1NvbU1ldGhvZERhdGEpIC8gc2l6ZW9mKFhGQV9NRVRIT0RJTkZPKTsNCiBleHRlcm4gY29uc3QgX1hGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPIGdfU29tQXR0cmlidXRlRGF0YVtdID0gew0KLSAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGIzNTQzYTYsIEwibWF4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWF4LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0NWE2ZGFmOCwgTCJlb2ZBY3Rpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Fb2ZBY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg1ZWM5NThjMCwgTCJjdXJzb3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ3Vyc29yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc5OTc1ZjJiLCBMImxvY2tUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTG9ja1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNTM0MGZmNSwgTCJib2ZBY3Rpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Cb2ZBY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM1NzYyMTU3LCBMImN1cnNvckxvY2F0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ3Vyc29yTG9jYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgxZWUyZDI0ZCwgTCJpbnN0YW5jZUluZGV4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9JbnN0YW5jZUluZGV4LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhjOTkzNzdlLCBMInJlbGF0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweDMxYjE5YzEsIEwibmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzMTA2YzNhLCBMImJlZm9yZVRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MTNhMDhiZGIsIEwib3ZlcmZsb3dUYXJnZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDE2OTEzNGExLCBMIm92ZXJmbG93TGVhZGVyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dMZWFkZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHgyMDkxNDM2NywgTCJvdmVyZmxvd1RyYWlsZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0NTNlYWYzOCwgTCJzdGFydE5ldyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1N0YXJ0TmV3LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NjQxMTBhYjUsIEwiYm9va2VuZFRyYWlsZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Cb29rZW5kVHJhaWxlciwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGI2YjQ0MTcyLCBMImFmdGVyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQWZ0ZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMzYzE0NDJmLCBMImJvb2tlbmRMZWFkZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Cb29rZW5kTGVhZGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4Y2IxNTA0NzksIEwiYWZ0ZXJUYXJnZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BZnRlclRhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGY0ZmZjZTczLCBMImJlZm9yZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0JlZm9yZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZV9SZWFkLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0N2NmYTQzYSwgTCJhbGxvd05ldXRyYWwiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg3YzJmZDgwYiwgTCJtYXJrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWFyaywgWEZBX1NDUklQVF9CYXNpY30sCXsweDhlZDE4MmQxLCBMInNoYXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU2hhcGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNjg2OTc1YiwgTCJzaXplIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU2l6ZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg1YzA1NDc1NSwgTCJzdGFydEFuZ2xlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc0Nzg4ZjhiLCBMInN3ZWVwQW5nbGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Td2VlcEFuZ2xlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OWQ4MzNkNzUsIEwiY2lyY3VsYXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9DaXJjdWxhciwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDk5NmZhOWIsIEwiaGFuZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hhbmQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiMGU1NDg1ZCwgTCJiaW5kIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQmluZCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjZDdmN2I1NCwgTCJmcm9tIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OGUyOWQ3OTQsIEwic2lnbmF0dXJlVHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGUxMWEyY2JjLCBMInBlcm1pc3Npb25zIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUGVybWlzc2lvbnMsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDQ1M2VhZjM4LCBMInN0YXJ0TmV3IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU3RhcnROZXcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg5ZGNjM2FiMywgTCJ0cmFpbGVyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE2MTE4Yzg5LCBMInRhcmdldFR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UYXJnZXRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UYXJnZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjYmNhZjY2ZCwgTCJsZWFkZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9MZWFkZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MmQ1NzRkNTgsIEwidGhpcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9YZmFfVGhpcywgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwJezB4NGZkYzM0NTQsIEwidGltZVN0YW1wIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVGltZVN0YW1wLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YjU5OGExZjcsIEwidXVpZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1V1aWQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4Y2ZlYTAyZSwgTCJsZWZ0SW5zZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgxMzU2Y2FmOCwgTCJib3R0b21JbnNldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MjU3NjQ0MzYsIEwidG9wSW5zZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhhNjkyNTIxLCBMInJpZ2h0SW5zZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDFlNDU5YjhmLCBMIm5vblJlcHVkaWF0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTm9uUmVwdWRpYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyYmIzZjQ3MCwgTCJlbmNpcGhlck9ubHkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9FbmNpcGhlck9ubHksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDVmNzYwYjUwLCBMImRpZ2l0YWxTaWduYXR1cmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EaWdpdGFsU2lnbmF0dXJlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NjlhYTIyOTIsIEwiY3JsU2lnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NybFNpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg5OGZkNGQ4MSwgTCJrZXlBZ3JlZW1lbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9LZXlBZ3JlZW1lbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNjY0MDRjYiwgTCJrZXlFbmNpcGhlcm1lbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9LZXlFbmNpcGhlcm1lbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGNhNWRjMjdjLCBMImRhdGFFbmNpcGhlcm1lbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EYXRhRW5jaXBoZXJtZW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZThmMTE4YTgsIEwia2V5Q2VydFNpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9LZXlDZXJ0U2lnbiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGZlYTUzZWM2LCBMImRlY2lwaGVyT25seSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0RlY2lwaGVyT25seSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg4YjkwZTFmMiwgTCJvcGVuIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3BlbiwgWEZBX1NDUklQVF9CYXNpY30sCXsweDk1N2ZhMDA2LCBMImNvbW1pdE9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiMTIxMjhiNywgTCJ0ZXh0RW50cnkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UZXh0RW50cnksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDIyODJjNzMsIEwiaEFsaWduIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OGQ0ZjFjNywgTCJ0ZXh0SW5kZW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVGV4dEluZGVudCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmE4MmQ5OWMsIEwibWFyZ2luUmlnaHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXJnaW5SaWdodCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDUzNDcyOWM5LCBMIm1hcmdpbkxlZnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4NTczOWQxZmYsIEwicmFkaXhPZmZzZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDU3NzY4MmFjLCBMInByZXNlcnZlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJlc2VydmUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3MzFlMDY2NSwgTCJzcGFjZUJlbG93IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU3BhY2VCZWxvdywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDdhN2NjMzQxLCBMInZBbGlnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sCXsweDgzNmQ0ZDdjLCBMInRhYkRlZmF1bHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UYWJEZWZhdWx0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OGZhMDE3OTAsIEwidGFiU3RvcHMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UYWJTdG9wcywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDRiMDE5MjEsIEwibGluZUhlaWdodCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhlMThiNTY1OSwgTCJzcGFjZUFib3ZlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU3BhY2VBYm92ZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZDg2MWY4YWYsIEwiYWRkUmV2b2NhdGlvbkluZm8iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BZGRSZXZvY2F0aW9uSW5mbywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmI4ZGY1ZCwgTCJyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDYxMjhkOGQsIEwiYWN0aXZpdHkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BY3Rpdml0eSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDQzZTM0OWIsIEwiZGF0YVJvd0NvdW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyOGUxN2U5MSwgTCJkYXRhUHJlcCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0RhdGFQcmVwLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzNjUwNTU3ZSwgTCJ0ZXh0TG9jYXRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzYjU4MjI4NiwgTCJtb2R1bGVXaWR0aCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01vZHVsZVdpZHRoLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4NTI2NjZmMWMsIEwicHJpbnRDaGVja0RpZ2l0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJpbnRDaGVja0RpZ2l0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NTQwNGQ2ZGYsIEwibW9kdWxlSGVpZ2h0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NWFiMjNiNmMsIEwic3RhcnRDaGFyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU3RhcnRDaGFyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4N2M3MzJhNjYsIEwidHJ1bmNhdGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhkMTgxZDYxLCBMIndpZGVOYXJyb3dSYXRpbyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywgWEZBX1NDUklQVF9CYXNpY30sCXsweDk5ODAwZDdhLCBMImVycm9yQ29ycmVjdGlvbkxldmVsIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRXJyb3JDb3JyZWN0aW9uTGV2ZWwsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg5YTYzZGEzZCwgTCJ1cHNNb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXBzTW9kZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGFmNzU0NjEzLCBMImNoZWNrc3VtIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiMDQ1ZmJjNSwgTCJjaGFyRW5jb2RpbmciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwMzVjNmIxLCBMImRhdGFDb2x1bW5Db3VudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGQzYzg0ZDI1LCBMInJvd0NvbHVtblJhdGlvIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUm93Q29sdW1uUmF0aW8sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhkNTdjNTEzYywgTCJkYXRhTGVuZ3RoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGF0YUxlbmd0aCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGY1NzVjYTc1LCBMImVuZENoYXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9FbmRDaGFyLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDI4ZGVlNmU5LCBMImZvcm1hdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg2MGQ0YzhiMSwgTCJvdXRwdXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PdXRwdXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGQ2YTM5OTkwLCBMImlucHV0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSW5wdXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJiNWRmNTFlLCBMImRhdGFEZXNjcmlwdGlvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0RhdGFEZXNjcmlwdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NmMwZDk2MDAsIEwiY3VycmVudFZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX0N1cnJlbnRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg5NDI2NDNmMCwgTCJzYXZlZFZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1NhdmVkVmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzhkYTRkYTcsIEwidGFyZ2V0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1RhcmdldCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGQ0Y2M1M2Y4LCBMImhpZ2hsaWdodCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hpZ2hsaWdodCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NTE4YzI1LCBMImJyZWFrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQnJlYWssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkOTk2ZmE5YiwgTCJoYW5kIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSGFuZCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9YLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4NzksIEwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ksIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzMWIxOWMxLCBMIm5hbWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MTA1OWVjMTgsIEwibGV2ZWwiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0ludGVnZXIsIFhGQV9BVFRSSUJVVEVfTGV2ZWwsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YWMwNmUyYjAsIEwiY29sU3BhbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbFNwYW4sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDIxYWVkLCBMImlkIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSWQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJmMTA1ZjcyLCBMIndvcmRDaGFyYWN0ZXJDb3VudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1dvcmRDaGFyYWN0ZXJDb3VudCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDNkMTIzYzI2LCBMImh5cGhlbmF0ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0h5cGhlbmF0ZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDY2NTM5YzQ4LCBMImV4Y2x1ZGVJbml0aWFsQ2FwIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUluaXRpYWxDYXAsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg2YTk1Yzk3NiwgTCJwdXNoQ2hhcmFjdGVyQ291bnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QdXNoQ2hhcmFjdGVyQ291bnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg5ODJiZDg5MiwgTCJyZW1haW5DaGFyYWN0ZXJDb3VudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhlNWM5NmQ2YSwgTCJleGNsdWRlQWxsQ2FwcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVBbGxDYXBzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg4YWYyZTY1NywgTCJtYXhDaGFycyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01heENoYXJzLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgwY2QzLCBMInVybCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VybCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YTY3MTAyNjIsIEwiY3JlZGVudGlhbFNlcnZlclBvbGljeSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMyYmEwOTIzLCBMInVybFBvbGljeSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VybFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzhkYTRkYTcsIEwidGFyZ2V0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3OGJmZjUzMSwgTCJudW1iZXJPZkNlbGxzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyLCBYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDY4LCBMImgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9ILCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzcsIEwidyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1csIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3OCwgTCJ4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9ZLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjI4MmM3MywgTCJoQWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDFhYmJkN2UwLCBMImRhdGFOb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EYXRhTm9kZSwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwJezB4MjU4Mzk4NTIsIEwiYWNjZXNzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQWNjZXNzLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmVlNzY3OGYsIEwicm90YXRlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUm90YXRlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4M2IxZGRkMDYsIEwiZmlsbENvbG9yIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9GaWxsQ29sb3IsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NTRjMzk5ZTMsIEwiZm9ybWF0dGVkVmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRm9ybWF0dGVkVmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDVhM2IzNzVkLCBMImJvcmRlckNvbG9yIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9Cb3JkZXJDb2xvciwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1ZTkzNmVkNiwgTCJmb250Q29sb3IiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0ZvbnRDb2xvciwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg2ODI2YzQwOCwgTCJwYXJlbnRTdWJmb3JtIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1BhcmVudFN1YmZvcm0sIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4NzliNjc0MzQsIEwibWFuZGF0b3J5TWVzc2FnZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5TWVzc2FnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3YTdjYzM0MSwgTCJ2QWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3YzJmZjZhZSwgTCJtYXhIIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWF4SCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDdjMmZmNmJkLCBMIm1heFciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4N2QwMjM1NmMsIEwibWluSCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01pbkgsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDAyMzU3YiwgTCJtaW5XIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWluVywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDg1ZmQ2ZmFmLCBMIm1hbmRhdG9yeSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg5NjRmYjQyZSwgTCJmb3JtYXRNZXNzYWdlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0Zvcm1hdE1lc3NhZ2UsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YTAzY2Y2MjcsIEwicmF3VmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNjBkZDIwMiwgTCJsZW5ndGgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfTGVuZ3RoLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGFjMDZlMmIwLCBMImNvbFNwYW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzhmYTM1MCwgTCJsb2NhbGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Mb2NhbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMmJkNDBmZCwgTCJhbmNob3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM0ZmVkMDliLCBMImFjY2Vzc0tleSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGNhYmZhM2QwLCBMInZhbGlkYXRpb25NZXNzYWdlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhkY2VjZDY2MywgTCJlZGl0VmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRWRpdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGUwN2U1MDYxLCBMInNlbGVjdGVkSW5kZXgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfU2VsZWN0ZWRJbmRleCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNjVlMzRiZSwgTCJib3JkZXJXaWR0aCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg2OCwgTCJoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9XLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzgsIEwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1gsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg3OSwgTCJ5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDg0Mzc5OCwgTCJmdWxsVGV4dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0Z1bGxUZXh0LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDFiNmQxY2Y1LCBMInJlZW50ZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9SZWVudGVyLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDFlNmZmYTlhLCBMInByZXZDb250ZW50VHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1ByZXZDb250ZW50VHlwZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyNWEzYzIwNiwgTCJzb2FwRmF1bHRTdHJpbmciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Tb2FwRmF1bHRTdHJpbmcsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmUwMGMwMDcsIEwibmV3Q29udGVudFR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdDb250ZW50VHlwZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg0NTcwNTAwZiwgTCJtb2RpZmllciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX01vZGlmaWVyLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDUwZTJlMzNiLCBMInNlbEVuZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NlbEVuZCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1N2RlODdjMiwgTCJwcmV2VGV4dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1ByZXZUZXh0LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDZlYTA0ZTBhLCBMInNvYXBGYXVsdENvZGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Tb2FwRmF1bHRDb2RlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDZmNjU1NmNmLCBMIm5ld1RleHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdUZXh0LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDg5MWY0NjA2LCBMImNoYW5nZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0NoYW5nZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg4ZmEzYzE5ZSwgTCJzaGlmdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NoaWZ0LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE5ZDliMmUxLCBMImtleURvd24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9LZXlEb3duLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJmYzg5ZGIyLCBMInNlbFN0YXJ0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU2VsU3RhcnQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzMyYTU4MTIsIEwiY29tbWl0S2V5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ29tbWl0S2V5LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM4ZGE0ZGE3LCBMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1RhcmdldCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YTJlMzUxNCwgTCJjYXAiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9DYXAsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDUzOTJlYTU4LCBMInN0cm9rZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1N0cm9rZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg5NDQ0NmRjYywgTCJ0aGlja25lc3MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UaGlja25lc3MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MWVjOGFiMmMsIEwicmF0ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JhdGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4N2IyOTYzMGEsIEwic291cmNlQmVsb3ciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Tb3VyY2VCZWxvdywgWEZBX1NDUklQVF9CYXNpY30sCXsweDhmYzM2YzBhLCBMIm91dHB1dEJlbG93IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3V0cHV0QmVsb3csIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhlOTk2YjJmZSwgTCJzb3VyY2VBYm92ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1NvdXJjZUFib3ZlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NjgsIEwiaCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0gsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg3NywgTCJ3IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVywgWEZBX1NDUklQVF9CYXNpY30sCXsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9YLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzksIEwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHgyMjgyYzczLCBMImhBbGlnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjIzMzMyZiwgTCJlcnJvclRleHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0Vycm9yVGV4dCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHgxYWJiZDdlMCwgTCJkYXRhTm9kZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGF0YU5vZGUsIC0xLCBYRkFfU0NSSVBUX09iamVjdH0sCXsweDI1ODM5ODUyLCBMImFjY2VzcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0FjY2VzcywgWEZBX1NDUklQVF9CYXNpY30sCXsweDNiMWRkZDA2LCBMImZpbGxDb2xvciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRmlsbENvbG9yLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1YTNiMzc1ZCwgTCJib3JkZXJDb2xvciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyQ29sb3IsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzliNjc0MzQsIEwibWFuZGF0b3J5TWVzc2FnZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5TWVzc2FnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg3YTdjYzM0MSwgTCJ2QWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3YzJmZjZhZSwgTCJtYXhIIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWF4SCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDdjMmZmNmJkLCBMIm1heFciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4N2QwMjM1NmMsIEwibWluSCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01pbkgsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDAyMzU3YiwgTCJtaW5XIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWluVywgWEZBX1NDUklQVF9CYXNpY30sCXsweDdlN2U4NDVlLCBMImxheW91dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xheW91dCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDg0NjU5OWY4LCBMInRyYW5zaWVudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfVHJhbnNpZW50LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDg1ZmQ2ZmFmLCBMIm1hbmRhdG9yeSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhhMDNjZjYyNywgTCJyYXdWYWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRGVmYXVsdEFuZFJhd1ZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRGVmYXVsdEFuZFJhd1ZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGFjMDZlMmIwLCBMImNvbFNwYW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMmJkNDBmZCwgTCJhbmNob3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM0ZmVkMDliLCBMImFjY2Vzc0tleSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGNhYmZhM2QwLCBMInZhbGlkYXRpb25NZXNzYWdlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNjVlMzRiZSwgTCJib3JkZXJXaWR0aCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZWRhOTAxN2EsIEwic2NvcGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TY29wZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NmNmYTgyOGEsIEwicnVuQXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SdW5BdCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGExYjBkMmY1LCBMImV4ZWN1dGVUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGU2Zjk5NDg3LCBMImhTY3JvbGxQb2xpY3kiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDQyZmVkMWZkLCBMImNvbnRlbnRUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NGZhNzIyYywgTCJ0cmFuc2ZlckVuY29kaW5nIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkMTcxYjI0MCwgTCJhc3BlY3QiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Bc3BlY3QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZGI1NWZlYzUsIEwiaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDdmNmZkM2Q3LCBMInNlcnZlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1NlcnZlciwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NGI4YmM4NDAsIEwiZnJhY0RpZ2l0cyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZGU3ZjkyYmEsIEwibGVhZERpZ2l0cyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xlYWREaWdpdHMsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg2OCwgTCJoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9XLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzgsIEwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1gsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg3OSwgTCJ5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDIyODJjNzMsIEwiaEFsaWduIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHgxNDE0ZDQzMSwgTCJhbGxvd01hY3JvIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQWxsb3dNYWNybywgWEZBX1NDUklQVF9CYXNpY30sCXsweDE1MTdkZmExLCBMImNvbHVtbldpZHRocyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbHVtbldpZHRocywgWEZBX1NDUklQVF9CYXNpY30sCXsweDFhYmJkN2UwLCBMImRhdGFOb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EYXRhTm9kZSwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCi0gICAgezB4MWVlMmQyNGQsIEwiaW5zdGFuY2VJbmRleCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fSW5zdGFuY2VJbmRleCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyNTgzOTg1MiwgTCJhY2Nlc3MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BY2Nlc3MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzYjFkZGQwNiwgTCJmaWxsQ29sb3IiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0ZpbGxDb2xvciwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NWEzYjM3NWQsIEwiYm9yZGVyQ29sb3IiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlckNvbG9yLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDdhN2NjMzQxLCBMInZBbGlnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDdjMmZmNmFlLCBMIm1heEgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXhILCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4N2MyZmY2YmQsIEwibWF4VyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01heFcsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDAyMzU2YywgTCJtaW5IIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWluSCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDdkMDIzNTdiLCBMIm1pblciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NaW5XLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4N2U3ZTg0NWUsIEwibGF5b3V0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTGF5b3V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDljYzE3ZDc1LCBMIm1lcmdlTW9kZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01lcmdlTW9kZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDlmM2U5NTEwLCBMImluc3RhbmNlTWFuYWdlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0luc3RhbmNlTWFuYWdlciwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwJezB4YWMwNmUyYjAsIEwiY29sU3BhbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbFNwYW4sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjOGZhMzUwLCBMImxvY2FsZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0xvY2FsZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMmJkNDBmZCwgTCJhbmNob3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGNhYmZhM2QwLCBMInZhbGlkYXRpb25NZXNzYWdlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhlNGMzYTVlNSwgTCJyZXN0b3JlU3RhdGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZXN0b3JlU3RhdGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhlZGE5MDE3YSwgTCJzY29wZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1Njb3BlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjY1ZTM0YmUsIEwiYm9yZGVyV2lkdGgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlcldpZHRoLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDVhNTBlOWU2LCBMInZlcnNpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSGFuZGxlcl9WZXJzaW9uLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NDEwN2VkLCBMImZveGl0QXBwVHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdEFwcFR5cGUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX05hbWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NjZjMWFlOSwgTCJ2YWxpZGF0aW9uc0VuYWJsZWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFsaWRhdGlvbnNFbmFibGVkLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDE0ZDA0NTAyLCBMInRpdGxlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1RpdGxlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDE5M2FmZThiLCBMImZveGl0TmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdE5hbWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzkyYWU0NDUsIEwicGxhdGZvcm0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUGxhdGZvcm0sIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NWE1MGU5ZTYsIEwidmVyc2lvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WZXJzaW9uLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDY2Y2IxZWVkLCBMInZhcmlhdGlvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYXJpYXRpb24sIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzcxN2NiYzQsIEwibGFuZ3VhZ2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTGFuZ3VhZ2UsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ODY2OTg5NjMsIEwiYXBwVHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9BcHBUeXBlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDk0ZmY5ZThkLCBMImNhbGN1bGF0aW9uc0VuYWJsZWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ2FsY3VsYXRpb25zRW5hYmxlZCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiY2Q0NDk0MCwgTCJjdXJyZW50UGFnZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9DdXJyZW50UGFnZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNDI4Njg3MCwgTCJmb3hpdFZlcnNpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRm94aXRWZXJzaW9uLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGQ1OTJiOTIwLCBMIm51bVBhZ2VzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX051bVBhZ2VzLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyNGQ4NTE2NywgTCJ0aW1lb3V0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVGltZW91dCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDlmZDdjNSwgTCJtb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTW9kZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDlmZDdjNSwgTCJtb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1Ym1pdEZvcm1hdF9Nb2RlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MjAzOGM5YjIsIEwicm9sZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JvbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZmNlZjg2YjUsIEwicmVhZHkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlYWR5LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1MzkyZWE1OCwgTCJzdHJva2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TdHJva2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4N2I5NWU2NjEsIEwiaW52ZXJ0ZWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9JbnZlcnRlZCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDk0NDQ2ZGNjLCBMInRoaWNrbmVzcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZThkZGRmNTAsIEwiam9pbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0pvaW4sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhlOTQ4YjlhOCwgTCJyYWRpdXMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SYWRpdXMsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YWJmYTZjNGYsIEwiY1NwYWNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ1NwYWNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4Mzg0OGIzZiwgTCJuZXh0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmV4dCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NmEzNDA1ZGQsIEwicHJldmlvdXMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QcmV2aW91cywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNTk1NDMsIEwiaW50YWN0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfSW50YWN0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyNjhiN2VjMSwgTCJjb21tYW5kVHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbW1hbmRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJkZTlhYmRhLCBMImRhdGEiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EYXRhLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1YjcwN2EzNSwgTCJzY3JpcHRUZXN0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfU2NyaXB0VGVzdCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDZiNmRkY2ZiLCBMIm51bGxUZXN0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTnVsbFRlc3QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZTY0YjExMjksIEwiZm9ybWF0VGVzdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Zvcm1hdFRlc3QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJmMTZhMzgyLCBMInR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhjOTkzNzdlLCBMInJlbGF0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDZlMjdmMWQsIEwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjUzNjMsIEwidG8iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UbywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDY2NjQyZjhmLCBMImZvcmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0ZvcmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjZDdmN2I1NCwgTCJmcm9tIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVmFsdWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyYjVkZjUxZSwgTCJkYXRhRGVzY3JpcHRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYjhkZjVkLCBMInJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjI2Y2E4ZjEsIEwib3BlcmF0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJmMTZhMzgyLCBMInR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJmMTZhMzgyLCBMInR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmYjY3MTg1LCBMInJlY29yZHNCZWZvcmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmRzQmVmb3JlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDIxZDVkZmNiLCBMImN1cnJlbnRSZWNvcmROdW1iZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19DdXJyZW50UmVjb3JkTnVtYmVyLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDMxMmFmMDQ0LCBMInJlY29yZHNBZnRlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X1JlY29yZHNBZnRlciwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg2YWFiMzdjYiwgTCJpc0RlZmluZWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Jc0RlZmluZWQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4NmNmYTgyOGEsIEwicnVuQXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SdW5BdCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGEwMjFiNzM4LCBMInN0YXRlbGVzcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TY3JpcHRfU3RhdGVsZXNzLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGFkYzRjNzdiLCBMImJpbmRpbmciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9CaW5kaW5nLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg3YTBjYzQ3MSwgTCJwYXNzd29yZENoYXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGU2Zjk5NDg3LCBMImhTY3JvbGxQb2xpY3kiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGU2Zjk5NDg3LCBMImhTY3JvbGxQb2xpY3kiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgxNGEzMmQ1MiwgTCJwYWdlUG9zaXRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg4MzQwZWE2NiwgTCJvZGRPckV2ZW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YTg1ZTc0ZjMsIEwiaW5pdGlhbE51bWJlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0luaXRpYWxOdW1iZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlOWJhNDcyLCBMIm51bWJlcmVkIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTnVtYmVyZWQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNzA3OThjMiwgTCJibGFua09yTm90QmxhbmsiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9CbGFua09yTm90QmxhbmssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDM0YWUxMDNjLCBMInJlc2VydmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZXNlcnZlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjIwMDkzMzksIEwicGxhY2VtZW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUGxhY2VtZW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NTRmYTcyMmMsIEwidHJhbnNmZXJFbmNvZGluZyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM0NTQ3YTA4LCBMIm1heExlbmd0aCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01heExlbmd0aCwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZGI1NWZlYzUsIEwiaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyOTQxOGJiNywgTCJhYmJyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQWJiciwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY1MzFiMDU5LCBMIndyaXRpbmdTY3JpcHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Xcml0aW5nU2NyaXB0LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHgxYjhkY2UzZSwgTCJhY3Rpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OWRjYzNhYjMsIEwidHJhaWxlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGNiY2FmNjZkLCBMImxlYWRlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweDMxYjE5YzEsIEwibmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGIzNTQzYTYsIEwibWF4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NYXgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YjM1NmNhNCwgTCJtaW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01pbiwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg2ZjU0NGQ0OSwgTCJjb3VudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfQ291bnQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjUzNjMsIEwidG8iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UbywgWEZBX1NDUklQVF9CYXNpY30sCXsweGEwOTMzOTU0LCBMInVuaWNvZGVSYW5nZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VuaWNvZGVSYW5nZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4Y2Q3ZjdiNTQsIEwiZnJvbSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Zyb20sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDRlZjNkMDJjLCBMIm9yaWVudGF0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3JpZW50YXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg2NWUzMGM2NywgTCJpbWFnaW5nQkJveCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0ltYWdpbmdCQm94LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4OTA0MWQ0YjAsIEwic2hvcnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TaG9ydCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZTM0OWQwNDQsIEwic3RvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TdG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjRhZmIwLCBMImxvbmciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Mb25nLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NWNlNjE5NSwgTCJ2U2Nyb2xsUG9saWN5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MWVmM2E2NGEsIEwiYWxsb3dSaWNoVGV4dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0FsbG93UmljaFRleHQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1YTMyZTQ5MywgTCJtdWx0aUxpbmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NdWx0aUxpbmUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGU2Zjk5NDg3LCBMImhTY3JvbGxQb2xpY3kiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNTI0ODJlMCwgTCJtYXhFbnRyaWVzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWF4RW50cmllcywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ODg1NTgwNWYsIEwiY29udGFpbnMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db250YWlucywgWEZBX1NDUklQVF9CYXNpY30sCXsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZTM3MmFlOTcsIEwiaXNOdWxsIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0lzTnVsbCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHgyYjVkZjUxZSwgTCJkYXRhRGVzY3JpcHRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJiOGRmNWQsIEwicmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyMjZjYThmMSwgTCJvcGVyYXRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM4ZGE0ZGE3LCBMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYjhkZjVkLCBMInJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NDJmZWQxZmQsIEwiY29udGVudFR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDU0ZmE3MjJjLCBMInRyYW5zZmVyRW5jb2RpbmciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmMTk3ODQ0ZCwgTCJtYXRjaCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01hdGNoLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGQ5OTZmYTliLCBMImhhbmQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjFhZWQsIEwiaWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9JZCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDMxYjE5YzEsIEwibmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDZlMjdmMWQsIEwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHgyOGRlZTZlOSwgTCJmb3JtYXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRW5jcnlwdF9Gb3JtYXQsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweDY4LCBMImgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9ILCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NzcsIEwidyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1csIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg3OCwgTCJ4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9ZLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjI4MmM3MywgTCJoQWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJlZTc2NzhmLCBMInJvdGF0ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JvdGF0ZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg3YTdjYzM0MSwgTCJ2QWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3YzJmZjZhZSwgTCJtYXhIIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWF4SCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDdjMmZmNmJkLCBMIm1heFciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4N2QwMjM1NmMsIEwibWluSCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX01pbkgsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3ZDAyMzU3YiwgTCJtaW5XIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTWluVywgWEZBX1NDUklQVF9CYXNpY30sCXsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhhMDNjZjYyNywgTCJyYXdWYWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGFjMDZlMmIwLCBMImNvbFNwYW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzhmYTM1MCwgTCJsb2NhbGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Mb2NhbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMmJkNDBmZCwgTCJhbmNob3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDM5Y2RiMGEyLCBMInByaW9yaXR5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUHJpb3JpdHksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGViNTExYjU0LCBMImRpc2FibGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EaXNhYmxlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJmMTZhMzgyLCBMInR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyMWFlZCwgTCJpZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjYjBhYzksIEwibGluZVRocm91Z2giLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJjMWM3ZjEsIEwidHlwZWZhY2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDhjNzRhZTksIEwiZm9udEhvcml6b250YWxTY2FsZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0ZvbnRIb3Jpem9udGFsU2NhbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDJjZDc5MDMzLCBMImtlcm5pbmdNb2RlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHgzYTAyNzNhNiwgTCJ1bmRlcmxpbmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHg0ODczYzYwMSwgTCJiYXNlbGluZVNoaWZ0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQmFzZWxpbmVTaGlmdCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDRiMzE5NzY3LCBMIm92ZXJsaW5lUGVyaW9kIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmVQZXJpb2QsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg3OTU0MzA1NSwgTCJsZXR0ZXJTcGFjaW5nIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDhlYzYyMDRjLCBMImxpbmVUaHJvdWdoUGVyaW9kIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2hQZXJpb2QsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg5MDdjNzcxOSwgTCJmb250VmVydGljYWxTY2FsZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YTY4Njk3NWIsIEwic2l6ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1NpemUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiNWU0OWJmMiwgTCJwb3N0dXJlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUG9zdHVyZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmQ2ZTFkODgsIEwid2VpZ2h0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfV2VpZ2h0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmQ5NmEwZTksIEwidW5kZXJsaW5lUGVyaW9kIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lUGVyaW9kLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzBlYzlmYTQsIEwib3ZlcmxpbmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9PdmVybGluZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGFmNzU0NjEzLCBMImNoZWNrc3VtIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fQ2hlY2tzdW0sIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZDZlMjdmMWQsIEwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhlYTcwOTBhMCwgTCJvdmVycmlkZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4OWRjYzNhYjMsIEwidHJhaWxlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGNiY2FmNjZkLCBMImxlYWRlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4NjBhNjFlZGQsIEwiY29kZVR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGIzNzNhODYyLCBMImFyY2hpdmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9BcmNoaXZlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhlMWEyNmI1NiwgTCJjb2RlQmFzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NvZGVCYXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZWIwOTEwMDMsIEwiY2xhc3NJZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0NsYXNzSWQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg0N2QwMzQ5MCwgTCJjb25uZWN0aW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMzOWE4OGJkLCBMImxhYmVsUmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTGFiZWxSZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhkNTBmOTAzYSwgTCJ2YWx1ZVJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGVhNzA5MGEwLCBMIm92ZXJyaWRlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeHRyYXNfVHlwZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmI4ZGY1ZCwgTCJyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDI0ZDg1MTY3LCBMInRpbWVvdXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UaW1lb3V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4NDdkMDM0OTAsIEwiY29ubmVjdGlvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NTJkOWFkNSwgTCJ1c2FnZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzYWdlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjODYwZjMwYSwgTCJkZWxheWVkT3BlbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0RlbGF5ZWRPcGVuLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDI4ZGVlNmU5LCBMImZvcm1hdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX1NDUklQVF9CYXNpY30sCXsweDgyNGYyMWI3LCBMImVtYmVkUERGIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRW1iZWRQREYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM4ZGE0ZGE3LCBMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGRjNzU2NzZjLCBMInRleHRFbmNvZGluZyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RleHRFbmNvZGluZywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY4ODllNzQ3LCBMInhkcENvbnRlbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9YZHBDb250ZW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweDk3YmU5MWIsIEwiY29udGVudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9QYWNrZXRfQ29udGVudCwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4NDE1NmVlM2YsIEwiZGVsaW1pdGVyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVsaW1pdGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHgyMWFlZCwgTCJpZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYjhkZjVkLCBMInJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjFhZWQsIEwiaWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9JZCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4NDUzZWFmMzgsIEwic3RhcnROZXciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TdGFydE5ldywgWEZBX1NDUklQVF9CYXNpY30sCXsweDlkY2MzYWIzLCBMInRyYWlsZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9UcmFpbGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YTYxMThjODksIEwidGFyZ2V0VHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGM4ZGE0ZGE3LCBMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCXsweGNiY2FmNjZkLCBMImxlYWRlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0xlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YWJlZjM3ZTMsIEwic2xvcGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9TbG9wZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZDk5NmZhOWIsIEwiaGFuZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0hhbmQsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhhNjBkZDIwMiwgTCJsZW5ndGgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19MZW5ndGgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjAxNDYsIEwiZGIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0RiLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiMzU0M2E2LCBMIm1heCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9PY2N1cl9NYXgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YjM1NmNhNCwgTCJtaW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfT2NjdXJfTWluLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4N2QwYjVmY2EsIEwiaW5pdGlhbCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0luaXRpYWwsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4Mjk0MThiYjcsIEwiYWJiciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0FiYnIsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGJlNTJkZmJmLCBMImRlc2MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZjZiNDc3NDksIEwibG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YmU1MmRmYmYsIEwiZGVzYyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweDMxYjE5YzEsIEwibmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiZTUyZGZiZiwgTCJkZXNjIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCXsweGY2YjQ3NzQ5LCBMImxvY2siLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQotICAgIHsweGJiOGRmNWQsIEwicmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4YTViNDEwY2YsIEwic2F2ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX1NhdmUsIFhGQV9TQ1JJUFRfQmFzaWN9LAl7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCXsweGIyYzgwODU3LCBMImNsYXNzTmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX09iamVjdDo6U2NyaXB0X09iamVjdENsYXNzX0NsYXNzTmFtZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHhhNjBkZDIwMiwgTCJsZW5ndGgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19MZW5ndGgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDlmOWQwZjksIEwiYWxsIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19BbGwsIC0xLCBYRkFfU0NSSVBUX09iamVjdH0sDQotICAgIHsweDRkZjE1NjU5LCBMIm5vZGVzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19Ob2RlcywgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwJezB4NzhhOGQ2Y2YsIEwiY2xhc3NBbGwiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0NsYXNzQWxsLCAtMSwgWEZBX1NDUklQVF9PYmplY3R9LAl7MHhjYWQ2ZDhjYSwgTCJwYXJlbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1BhcmVudCwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCi0gICAgezB4ZDU2NzljNzgsIEwiaW5kZXgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0luZGV4LCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGRiNWI0YmNlLCBMImNsYXNzSW5kZXgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0NsYXNzSW5kZXgsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4ZTQ5ODlhZGYsIEwic29tRXhwcmVzc2lvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfU29tRXhwcmVzc2lvbiwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KLSAgICB7MHgyMWFlZCwgTCJpZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLCBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwJezB4MjM0YTEsIEwibnMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX05zLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweDUwZDFhOWQxLCBMIm1vZGVsIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Nb2RlbCwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCi0gICAgezB4YWNiNDgyM2YsIEwiaXNDb250YWluZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0lzQ29udGFpbmVyLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGUzNzJhZTk3LCBMImlzTnVsbCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfSXNOdWxsLCAtMSwgWEZBX1NDUklQVF9CYXNpY30sCXsweGZlNjEyYTViLCBMIm9uZU9mQ2hpbGQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX09uZU9mQ2hpbGQsIC0xLCBYRkFfU0NSSVBUX09iamVjdH0sDQotICAgIHsweDk3YzFjNjUsIEwiY29udGV4dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NvbnRleHQsIC0xLCBYRkFfU0NSSVBUX09iamVjdH0sCXsweDU4YmUyODcwLCBMImFsaWFzTm9kZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0FsaWFzTm9kZSwgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwJezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCi0gICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGIzNTQzYTYsIEwibWF4IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXgsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDVhNmRhZjgsIEwiZW9mQWN0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Fb2ZBY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1ZWM5NThjMCwgTCJjdXJzb3JUeXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9DdXJzb3JUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Nzk5NzVmMmIsIEwibG9ja1R5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2tUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUzNDBmZjUsIEwiYm9mQWN0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Cb2ZBY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzU3NjIxNTcsIEwiY3Vyc29yTG9jYXRpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0N1cnNvckxvY2F0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDFlZTJkMjRkLCBMImluc3RhbmNlSW5kZXgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9JbnN0YW5jZUluZGV4LCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4Yzk5Mzc3ZSwgTCJyZWxhdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzEwNmMzYSwgTCJiZWZvcmVUYXJnZXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxM2EwOGJkYiwgTCJvdmVyZmxvd1RhcmdldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUYXJnZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxNjkxMzRhMSwgTCJvdmVyZmxvd0xlYWRlciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dMZWFkZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMDkxNDM2NywgTCJvdmVyZmxvd1RyYWlsZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX092ZXJmbG93VHJhaWxlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQ1M2VhZjM4LCBMInN0YXJ0TmV3IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TdGFydE5ldywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY0MTEwYWI1LCBMImJvb2tlbmRUcmFpbGVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Cb29rZW5kVHJhaWxlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGI2YjQ0MTcyLCBMImFmdGVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9BZnRlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjM2MxNDQyZiwgTCJib29rZW5kTGVhZGVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Cb29rZW5kTGVhZGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2IxNTA0NzksIEwiYWZ0ZXJUYXJnZXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FmdGVyVGFyZ2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjRmZmNlNzMsIEwiYmVmb3JlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9CZWZvcmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWVfUmVhZCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDdjZmE0M2EsIEwiYWxsb3dOZXV0cmFsIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YzJmZDgwYiwgTCJtYXJrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXJrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OGVkMTgyZDEsIEwic2hhcGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1NoYXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTY4Njk3NWIsIEwic2l6ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU2l6ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1YzA1NDc1NSwgTCJzdGFydEFuZ2xlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TdGFydEFuZ2xlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzQ3ODhmOGIsIEwic3dlZXBBbmdsZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU3dlZXBBbmdsZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDlkODMzZDc1LCBMImNpcmN1bGFyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9DaXJjdWxhciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkOTk2ZmE5YiwgTCJoYW5kIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGIwZTU0ODVkLCBMImJpbmQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0JpbmQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGNkN2Y3YjU0LCBMImZyb20iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Zyb20sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTI5ZDc5NCwgTCJzaWduYXR1cmVUeXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TaWduYXR1cmVUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGUxMWEyY2JjLCBMInBlcm1pc3Npb25zIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9QZXJtaXNzaW9ucywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0NTNlYWYzOCwgTCJzdGFydE5ldyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU3RhcnROZXcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5ZGNjM2FiMywgTCJ0cmFpbGVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UcmFpbGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTYxMThjODksIEwidGFyZ2V0VHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0VHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGNiY2FmNjZkLCBMImxlYWRlciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmQ1NzRkNTgsIEwidGhpcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9YZmFfVGhpcywNCisgICAgIC0xLCBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweDRmZGMzNDU0LCBMInRpbWVTdGFtcCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGltZVN0YW1wLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YjU5OGExZjcsIEwidXVpZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXVpZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGNmZWEwMmUsIEwibGVmdEluc2V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxMzU2Y2FmOCwgTCJib3R0b21JbnNldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyNTc2NDQzNiwgTCJ0b3BJbnNldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4YTY5MjUyMSwgTCJyaWdodEluc2V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxZTQ1OWI4ZiwgTCJub25SZXB1ZGlhdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTm9uUmVwdWRpYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyYmIzZjQ3MCwgTCJlbmNpcGhlck9ubHkiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0VuY2lwaGVyT25seSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1Zjc2MGI1MCwgTCJkaWdpdGFsU2lnbmF0dXJlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EaWdpdGFsU2lnbmF0dXJlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjlhYTIyOTIsIEwiY3JsU2lnbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ3JsU2lnbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDk4ZmQ0ZDgxLCBMImtleUFncmVlbWVudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfS2V5QWdyZWVtZW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTY2NDA0Y2IsIEwia2V5RW5jaXBoZXJtZW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9LZXlFbmNpcGhlcm1lbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2E1ZGMyN2MsIEwiZGF0YUVuY2lwaGVybWVudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGF0YUVuY2lwaGVybWVudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGU4ZjExOGE4LCBMImtleUNlcnRTaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9LZXlDZXJ0U2lnbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGZlYTUzZWM2LCBMImRlY2lwaGVyT25seSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVjaXBoZXJPbmx5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhiOTBlMWYyLCBMIm9wZW4iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX09wZW4sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5NTdmYTAwNiwgTCJjb21taXRPbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiMTIxMjhiNywgTCJ0ZXh0RW50cnkiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RleHRFbnRyeSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMjgyYzczLCBMImhBbGlnbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OGQ0ZjFjNywgTCJ0ZXh0SW5kZW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UZXh0SW5kZW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJhODJkOTljLCBMIm1hcmdpblJpZ2h0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXJnaW5SaWdodCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDUzNDcyOWM5LCBMIm1hcmdpbkxlZnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01hcmdpbkxlZnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NzM5ZDFmZiwgTCJyYWRpeE9mZnNldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmFkaXhPZmZzZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1Nzc2ODJhYywgTCJwcmVzZXJ2ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VydmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3MzFlMDY2NSwgTCJzcGFjZUJlbG93IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TcGFjZUJlbG93LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2E3Y2MzNDEsIEwidkFsaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4MzZkNGQ3YywgTCJ0YWJEZWZhdWx0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UYWJEZWZhdWx0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OGZhMDE3OTAsIEwidGFiU3RvcHMiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RhYlN0b3BzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ0YjAxOTIxLCBMImxpbmVIZWlnaHQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlMThiNTY1OSwgTCJzcGFjZUFib3ZlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TcGFjZUFib3ZlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkODYxZjhhZiwgTCJhZGRSZXZvY2F0aW9uSW5mbyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQWRkUmV2b2NhdGlvbkluZm8sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJiOGRmNWQsIEwicmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2MTI4ZDhkLCBMImFjdGl2aXR5IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9BY3Rpdml0eSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDNlMzQ5YiwgTCJkYXRhUm93Q291bnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0RhdGFSb3dDb3VudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyOGUxN2U5MSwgTCJkYXRhUHJlcCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGF0YVByZXAsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzY1MDU1N2UsIEwidGV4dExvY2F0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzYjU4MjI4NiwgTCJtb2R1bGVXaWR0aCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTW9kdWxlV2lkdGgsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1MjY2NmYxYywgTCJwcmludENoZWNrRGlnaXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ByaW50Q2hlY2tEaWdpdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU0MDRkNmRmLCBMIm1vZHVsZUhlaWdodCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NWFiMjNiNmMsIEwic3RhcnRDaGFyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TdGFydENoYXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YzczMmE2NiwgTCJ0cnVuY2F0ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHJ1bmNhdGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZDE4MWQ2MSwgTCJ3aWRlTmFycm93UmF0aW8iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDk5ODAwZDdhLCBMImVycm9yQ29ycmVjdGlvbkxldmVsIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9FcnJvckNvcnJlY3Rpb25MZXZlbCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDlhNjNkYTNkLCBMInVwc01vZGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1Vwc01vZGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhZjc1NDYxMywgTCJjaGVja3N1bSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiMDQ1ZmJjNSwgTCJjaGFyRW5jb2RpbmciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NoYXJFbmNvZGluZywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDM1YzZiMSwgTCJkYXRhQ29sdW1uQ291bnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQzYzg0ZDI1LCBMInJvd0NvbHVtblJhdGlvIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Sb3dDb2x1bW5SYXRpbywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ1N2M1MTNjLCBMImRhdGFMZW5ndGgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0RhdGFMZW5ndGgsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNTc1Y2E3NSwgTCJlbmRDaGFyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9FbmRDaGFyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjhkZWU2ZTksIEwiZm9ybWF0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Gb3JtYXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjBkNGM4YjEsIEwib3V0cHV0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9PdXRwdXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZhMzk5OTAsIEwiaW5wdXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0lucHV0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJiNWRmNTFlLCBMImRhdGFEZXNjcmlwdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGF0YURlc2NyaXB0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NmMwZDk2MDAsIEwiY3VycmVudFZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9EZWx0YV9DdXJyZW50VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDk0MjY0M2YwLCBMInNhdmVkVmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1NhdmVkVmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRGVsdGFfVGFyZ2V0LCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ0Y2M1M2Y4LCBMImhpZ2hsaWdodCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSGlnaGxpZ2h0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NTE4YzI1LCBMImJyZWFrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9CcmVhaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDk5NmZhOWIsIEwiaGFuZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSGFuZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxMDU5ZWMxOCwgTCJsZXZlbCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0ludGVnZXIsDQorICAgICBYRkFfQVRUUklCVVRFX0xldmVsLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YWMwNmUyYjAsIEwiY29sU3BhbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIxYWVkLCBMImlkIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9JZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjEwNWY3MiwgTCJ3b3JkQ2hhcmFjdGVyQ291bnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1dvcmRDaGFyYWN0ZXJDb3VudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDNkMTIzYzI2LCBMImh5cGhlbmF0ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSHlwaGVuYXRlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjY1MzljNDgsIEwiZXhjbHVkZUluaXRpYWxDYXAiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVJbml0aWFsQ2FwLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NmE5NWM5NzYsIEwicHVzaENoYXJhY3RlckNvdW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9QdXNoQ2hhcmFjdGVyQ291bnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5ODJiZDg5MiwgTCJyZW1haW5DaGFyYWN0ZXJDb3VudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVtYWluQ2hhcmFjdGVyQ291bnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTVjOTZkNmEsIEwiZXhjbHVkZUFsbENhcHMiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVBbGxDYXBzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhhZjJlNjU3LCBMIm1heENoYXJzIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXhDaGFycywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODBjZDMsIEwidXJsIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9VcmwsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTY3MTAyNjIsIEwiY3JlZGVudGlhbFNlcnZlclBvbGljeSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ3JlZGVudGlhbFNlcnZlclBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMmJhMDkyMywgTCJ1cmxQb2xpY3kiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VybFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc4YmZmNTMxLCBMIm51bWJlck9mQ2VsbHMiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OdW1iZXJPZkNlbGxzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY4LCBMImgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MWFiYmQ3ZTAsIEwiZGF0YU5vZGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EYXRhTm9kZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweDI1ODM5ODUyLCBMImFjY2VzcyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmVlNzY3OGYsIEwicm90YXRlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Sb3RhdGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzYjFkZGQwNiwgTCJmaWxsQ29sb3IiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9GaWxsQ29sb3IsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU0YzM5OWUzLCBMImZvcm1hdHRlZFZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9Gb3JtYXR0ZWRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NWEzYjM3NWQsIEwiYm9yZGVyQ29sb3IiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9Cb3JkZXJDb2xvciwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NWU5MzZlZDYsIEwiZm9udENvbG9yIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRm9udENvbG9yLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2ODI2YzQwOCwgTCJwYXJlbnRTdWJmb3JtIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9QYXJlbnRTdWJmb3JtLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3OWI2NzQzNCwgTCJtYW5kYXRvcnlNZXNzYWdlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5TWVzc2FnZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2E3Y2MzNDEsIEwidkFsaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YzJmZjZhZSwgTCJtYXhIIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXhILCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2MyZmY2YmQsIEwibWF4VyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWF4VywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdkMDIzNTZjLCBMIm1pbkgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01pbkgsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3ZDAyMzU3YiwgTCJtaW5XIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NaW5XLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ODVmZDZmYWYsIEwibWFuZGF0b3J5IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5LCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5NjRmYjQyZSwgTCJmb3JtYXRNZXNzYWdlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9Gb3JtYXRNZXNzYWdlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhMDNjZjYyNywgTCJyYXdWYWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNjBkZDIwMiwgTCJsZW5ndGgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0xlbmd0aCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YWMwNmUyYjAsIEwiY29sU3BhbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzhmYTM1MCwgTCJsb2NhbGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2FsZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMyYmQ0MGZkLCBMImFuY2hvclR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjNGZlZDA5YiwgTCJhY2Nlc3NLZXkiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGNhYmZhM2QwLCBMInZhbGlkYXRpb25NZXNzYWdlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fVmFsaWRhdGlvbk1lc3NhZ2UsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGRjZWNkNjYzLCBMImVkaXRWYWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRWRpdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlMDdlNTA2MSwgTCJzZWxlY3RlZEluZGV4IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9TZWxlY3RlZEluZGV4LCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNjVlMzRiZSwgTCJib3JkZXJXaWR0aCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlcldpZHRoLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY4LCBMImgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDg0Mzc5OCwgTCJmdWxsVGV4dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0Z1bGxUZXh0LA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxYjZkMWNmNSwgTCJyZWVudGVyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUmVlbnRlciwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MWU2ZmZhOWEsIEwicHJldkNvbnRlbnRUeXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1ByZXZDb250ZW50VHlwZSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjVhM2MyMDYsIEwic29hcEZhdWx0U3RyaW5nIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NvYXBGYXVsdFN0cmluZywNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmUwMGMwMDcsIEwibmV3Q29udGVudFR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfTmV3Q29udGVudFR5cGUsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQ1NzA1MDBmLCBMIm1vZGlmaWVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX01vZGlmaWVyLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1MGUyZTMzYiwgTCJzZWxFbmQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NlbEVuZCwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTdkZTg3YzIsIEwicHJldlRleHQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJldlRleHQsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDZlYTA0ZTBhLCBMInNvYXBGYXVsdENvZGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU29hcEZhdWx0Q29kZSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NmY2NTU2Y2YsIEwibmV3VGV4dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX05ld1RleHQsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDg5MWY0NjA2LCBMImNoYW5nZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ2hhbmdlLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZmEzYzE5ZSwgTCJzaGlmdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TaGlmdCwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTlkOWIyZTEsIEwia2V5RG93biIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0tleURvd24sDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJmYzg5ZGIyLCBMInNlbFN0YXJ0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NlbFN0YXJ0LA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMzJhNTgxMiwgTCJjb21taXRLZXkiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ29tbWl0S2V5LA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1RhcmdldCwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGEyZTM1MTQsIEwiY2FwIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9DYXAsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTM5MmVhNTgsIEwic3Ryb2tlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TdHJva2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5NDQ0NmRjYywgTCJ0aGlja25lc3MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MWVjOGFiMmMsIEwicmF0ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmF0ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YjI5NjMwYSwgTCJzb3VyY2VCZWxvdyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU291cmNlQmVsb3csIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZmMzNmMwYSwgTCJvdXRwdXRCZWxvdyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfT3V0cHV0QmVsb3csIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlOTk2YjJmZSwgTCJzb3VyY2VBYm92ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU291cmNlQWJvdmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY4LCBMImgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjIzMzMyZiwgTCJlcnJvclRleHQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FcnJvclRleHQsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDFhYmJkN2UwLCBMImRhdGFOb2RlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGF0YU5vZGUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9PYmplY3R9LA0KKyAgICB7MHgyNTgzOTg1MiwgTCJhY2Nlc3MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FjY2VzcywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDNiMWRkZDA2LCBMImZpbGxDb2xvciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0ZpbGxDb2xvciwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NWEzYjM3NWQsIEwiYm9yZGVyQ29sb3IiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9Cb3JkZXJDb2xvciwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzliNjc0MzQsIEwibWFuZGF0b3J5TWVzc2FnZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX01hbmRhdG9yeU1lc3NhZ2UsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdhN2NjMzQxLCBMInZBbGlnbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVkFsaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2MyZmY2YWUsIEwibWF4SCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWF4SCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdjMmZmNmJkLCBMIm1heFciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01heFcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3ZDAyMzU2YywgTCJtaW5IIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NaW5ILCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2QwMjM1N2IsIEwibWluVyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWluVywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdlN2U4NDVlLCBMImxheW91dCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTGF5b3V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ODQ2NTk5ZjgsIEwidHJhbnNpZW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfVHJhbnNpZW50LCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4NWZkNmZhZiwgTCJtYW5kYXRvcnkiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9NYW5kYXRvcnksIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGEwM2NmNjI3LCBMInJhd1ZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRGVmYXVsdEFuZFJhd1ZhbHVlLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9EZWZhdWx0QW5kUmF3VmFsdWUsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGFjMDZlMmIwLCBMImNvbFNwYW4iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NvbFNwYW4sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzJiZDQwZmQsIEwiYW5jaG9yVHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGM0ZmVkMDliLCBMImFjY2Vzc0tleSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzS2V5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2FiZmEzZDAsIEwidmFsaWRhdGlvbk1lc3NhZ2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjY1ZTM0YmUsIEwiYm9yZGVyV2lkdGgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9Cb3JkZXJXaWR0aCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZWRhOTAxN2EsIEwic2NvcGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1Njb3BlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0N2QwMzQ5MCwgTCJjb25uZWN0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NmNmYTgyOGEsIEwicnVuQXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1J1bkF0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTFiMGQyZjUsIEwiZXhlY3V0ZVR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0V4ZWN1dGVUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTZmOTk0ODcsIEwiaFNjcm9sbFBvbGljeSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NGZhNzIyYywgTCJ0cmFuc2ZlckVuY29kaW5nIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkMTcxYjI0MCwgTCJhc3BlY3QiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FzcGVjdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGRiNTVmZWM1LCBMImhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0hyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVmFsdWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2Y2ZmQzZDcsIEwic2VydmVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TZXJ2ZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDRiOGJjODQwLCBMImZyYWNEaWdpdHMiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZGU3ZjkyYmEsIEwibGVhZERpZ2l0cyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTGVhZERpZ2l0cywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY4LCBMImgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MTQxNGQ0MzEsIEwiYWxsb3dNYWNybyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQWxsb3dNYWNybywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDE1MTdkZmExLCBMImNvbHVtbldpZHRocyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29sdW1uV2lkdGhzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MWFiYmQ3ZTAsIEwiZGF0YU5vZGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EYXRhTm9kZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweDFlZTJkMjRkLCBMImluc3RhbmNlSW5kZXgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9JbnN0YW5jZUluZGV4LCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyNTgzOTg1MiwgTCJhY2Nlc3MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FjY2VzcywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDNiMWRkZDA2LCBMImZpbGxDb2xvciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0ZpbGxDb2xvciwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NWEzYjM3NWQsIEwiYm9yZGVyQ29sb3IiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9Cb3JkZXJDb2xvciwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2E3Y2MzNDEsIEwidkFsaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YzJmZjZhZSwgTCJtYXhIIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXhILCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2MyZmY2YmQsIEwibWF4VyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWF4VywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdkMDIzNTZjLCBMIm1pbkgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01pbkgsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3ZDAyMzU3YiwgTCJtaW5XIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NaW5XLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2U3ZTg0NWUsIEwibGF5b3V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9MYXlvdXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5Y2MxN2Q3NSwgTCJtZXJnZU1vZGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01lcmdlTW9kZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDlmM2U5NTEwLCBMImluc3RhbmNlTWFuYWdlciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9JbnN0YW5jZU1hbmFnZXIsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9PYmplY3R9LA0KKyAgICB7MHhhYzA2ZTJiMCwgTCJjb2xTcGFuIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjOGZhMzUwLCBMImxvY2FsZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9Mb2NhbGUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMyYmQ0MGZkLCBMImFuY2hvclR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjYWJmYTNkMCwgTCJ2YWxpZGF0aW9uTWVzc2FnZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX1ZhbGlkYXRpb25NZXNzYWdlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlNGMzYTVlNSwgTCJyZXN0b3JlU3RhdGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGVkYTkwMTdhLCBMInNjb3BlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TY29wZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2NWUzNGJlLCBMImJvcmRlcldpZHRoIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1YTUwZTllNiwgTCJ2ZXJzaW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9IYW5kbGVyX1ZlcnNpb24sIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0MTA3ZWQsIEwiZm94aXRBcHBUeXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdEFwcFR5cGUsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX05hbWUsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY2YzFhZTksIEwidmFsaWRhdGlvbnNFbmFibGVkIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0aW9uc0VuYWJsZWQsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDE0ZDA0NTAyLCBMInRpdGxlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9UaXRsZSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MTkzYWZlOGIsIEwiZm94aXROYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdE5hbWUsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDM5MmFlNDQ1LCBMInBsYXRmb3JtIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QbGF0Zm9ybSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NWE1MGU5ZTYsIEwidmVyc2lvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WZXJzaW9uLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2NmNiMWVlZCwgTCJ2YXJpYXRpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZhcmlhdGlvbiwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzcxN2NiYzQsIEwibGFuZ3VhZ2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0xhbmd1YWdlLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4NjY5ODk2MywgTCJhcHBUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0FwcFR5cGUsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDk0ZmY5ZThkLCBMImNhbGN1bGF0aW9uc0VuYWJsZWQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0NhbGN1bGF0aW9uc0VuYWJsZWQsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjZDQ0OTQwLCBMImN1cnJlbnRQYWdlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9DdXJyZW50UGFnZSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDQyODY4NzAsIEwiZm94aXRWZXJzaW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdFZlcnNpb24sDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ1OTJiOTIwLCBMIm51bVBhZ2VzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9OdW1QYWdlcywNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDI0ZDg1MTY3LCBMInRpbWVvdXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RpbWVvdXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2Q5ZmQ3YzUsIEwibW9kZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTW9kZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2Q5ZmQ3YzUsIEwibW9kZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU3VibWl0Rm9ybWF0X01vZGUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjAzOGM5YjIsIEwicm9sZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUm9sZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZmNlZjg2YjUsIEwicmVhZHkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWFkeSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDUzOTJlYTU4LCBMInN0cm9rZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU3Ryb2tlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2I5NWU2NjEsIEwiaW52ZXJ0ZWQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0ludmVydGVkLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OTQ0NDZkY2MsIEwidGhpY2tuZXNzIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UaGlja25lc3MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZThkZGRmNTAsIEwiam9pbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSm9pbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGU5NDhiOWE4LCBMInJhZGl1cyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmFkaXVzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGFiZmE2YzRmLCBMImNTcGFjZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ1NwYWNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDM4NDhiM2YsIEwibmV4dCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmV4dCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2YTM0MDVkZCwgTCJwcmV2aW91cyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJldmlvdXMsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNTk1NDMsIEwiaW50YWN0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9JbnRhY3QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjY4YjdlYzEsIEwiY29tbWFuZFR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NvbW1hbmRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZGU5YWJkYSwgTCJkYXRhIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EYXRhLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDViNzA3YTM1LCBMInNjcmlwdFRlc3QiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1NjcmlwdFRlc3QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2YjZkZGNmYiwgTCJudWxsVGVzdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTnVsbFRlc3QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGU2NGIxMTI5LCBMImZvcm1hdFRlc3QiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Zvcm1hdFRlc3QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4Yzk5Mzc3ZSwgTCJyZWxhdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDI1MzYzLCBMInRvIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UbywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY2NjQyZjhmLCBMImZvcmNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfRm9yY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2Q3ZjdiNTQsIEwiZnJvbSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJiNWRmNTFlLCBMImRhdGFEZXNjcmlwdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGF0YURlc2NyaXB0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmI4ZGY1ZCwgTCJyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMjZjYThmMSwgTCJvcGVyYXRpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmYjY3MTg1LCBMInJlY29yZHNCZWZvcmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9EYXRhV2luZG93X1JlY29yZHNCZWZvcmUsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIxZDVkZmNiLCBMImN1cnJlbnRSZWNvcmROdW1iZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRGF0YVdpbmRvdzo6DQorICAgICAgICAgU2NyaXB0X0RhdGFXaW5kb3dfQ3VycmVudFJlY29yZE51bWJlciwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzEyYWYwNDQsIEwicmVjb3Jkc0FmdGVyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRGF0YVdpbmRvdzo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmRzQWZ0ZXIsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDZhYWIzN2NiLCBMImlzRGVmaW5lZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Jc0RlZmluZWQsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2Y2ZhODI4YSwgTCJydW5BdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUnVuQXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhMDIxYjczOCwgTCJzdGF0ZWxlc3MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NjcmlwdF9TdGF0ZWxlc3MsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YWRjNGM3N2IsIEwiYmluZGluZyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQmluZGluZywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdhMGNjNDcxLCBMInBhc3N3b3JkQ2hhciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUGFzc3dvcmRDaGFyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGU2Zjk5NDg3LCBMImhTY3JvbGxQb2xpY3kiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGU2Zjk5NDg3LCBMImhTY3JvbGxQb2xpY3kiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxNGEzMmQ1MiwgTCJwYWdlUG9zaXRpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDgzNDBlYTY2LCBMIm9kZE9yRXZlbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTg1ZTc0ZjMsIEwiaW5pdGlhbE51bWJlciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSW5pdGlhbE51bWJlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTliYTQ3MiwgTCJudW1iZXJlZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTnVtYmVyZWQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNzA3OThjMiwgTCJibGFua09yTm90QmxhbmsiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0JsYW5rT3JOb3RCbGFuaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDM0YWUxMDNjLCBMInJlc2VydmUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1Jlc2VydmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjIwMDkzMzksIEwicGxhY2VtZW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9QbGFjZW1lbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDJmZWQxZmQsIEwiY29udGVudFR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTRmYTcyMmMsIEwidHJhbnNmZXJFbmNvZGluZyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGM0NTQ3YTA4LCBMIm1heExlbmd0aCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWF4TGVuZ3RoLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGRiNTVmZWM1LCBMImhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0hyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyOTQxOGJiNywgTCJhYmJyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9BYmJyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjUzMWIwNTksIEwid3JpdGluZ1NjcmlwdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfV3JpdGluZ1NjcmlwdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDFiOGRjZTNlLCBMImFjdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQWN0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDlkY2MzYWIzLCBMInRyYWlsZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzhkYTRkYTcsIEwidGFyZ2V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjYmNhZjY2ZCwgTCJsZWFkZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiMzU0M2E2LCBMIm1heCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01heCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YjM1NmNhNCwgTCJtaW4iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NaW4sIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDZmNTQ0ZDQ5LCBMImNvdW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfQ291bnQsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDI1MzYzLCBMInRvIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UbywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGEwOTMzOTU0LCBMInVuaWNvZGVSYW5nZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVW5pY29kZVJhbmdlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGNkN2Y3YjU0LCBMImZyb20iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Zyb20sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0ZWYzZDAyYywgTCJvcmllbnRhdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfT3JpZW50YXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2NWUzMGM2NywgTCJpbWFnaW5nQkJveCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSW1hZ2luZ0JCb3gsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5MDQxZDRiMCwgTCJzaG9ydCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU2hvcnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTM0OWQwNDQsIEwic3RvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1N0b2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNGFmYjAsIEwibG9uZyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9uZywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDVjZTYxOTUsIEwidlNjcm9sbFBvbGljeSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxZWYzYTY0YSwgTCJhbGxvd1JpY2hUZXh0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NWEzMmU0OTMsIEwibXVsdGlMaW5lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NdWx0aUxpbmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTZmOTk0ODcsIEwiaFNjcm9sbFBvbGljeSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNTI0ODJlMCwgTCJtYXhFbnRyaWVzIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXhFbnRyaWVzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQyZmVkMWZkLCBMImNvbnRlbnRUeXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDg4NTU4MDVmLCBMImNvbnRhaW5zIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db250YWlucywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGUzNzJhZTk3LCBMImlzTnVsbCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0lzTnVsbCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJiNWRmNTFlLCBMImRhdGFEZXNjcmlwdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGF0YURlc2NyaXB0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmI4ZGY1ZCwgTCJyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMjZjYThmMSwgTCJvcGVyYXRpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJiOGRmNWQsIEwicmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDJmZWQxZmQsIEwiY29udGVudFR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTRmYTcyMmMsIEwidHJhbnNmZXJFbmNvZGluZyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmMTk3ODQ0ZCwgTCJtYXRjaCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWF0Y2gsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDk5NmZhOWIsIEwiaGFuZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSGFuZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIxYWVkLCBMImlkIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9JZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDI4ZGVlNmU5LCBMImZvcm1hdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRW5jcnlwdF9Gb3JtYXQsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2OCwgTCJoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0gsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3NywgTCJ3IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1csIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3OCwgTCJ4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1gsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3OSwgTCJ5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMjgyYzczLCBMImhBbGlnbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJlZTc2NzhmLCBMInJvdGF0ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUm90YXRlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2E3Y2MzNDEsIEwidkFsaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YzJmZjZhZSwgTCJtYXhIIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXhILCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2MyZmY2YmQsIEwibWF4VyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWF4VywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdkMDIzNTZjLCBMIm1pbkgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01pbkgsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3ZDAyMzU3YiwgTCJtaW5XIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NaW5XLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTAzY2Y2MjcsIEwicmF3VmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YWMwNmUyYjAsIEwiY29sU3BhbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzhmYTM1MCwgTCJsb2NhbGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2FsZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMyYmQ0MGZkLCBMImFuY2hvclR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzljZGIwYTIsIEwicHJpb3JpdHkiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ByaW9yaXR5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGViNTExYjU0LCBMImRpc2FibGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rpc2FibGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVmFsdWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIxYWVkLCBMImlkIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9JZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2IwYWM5LCBMImxpbmVUaHJvdWdoIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJjMWM3ZjEsIEwidHlwZWZhY2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGVmYWNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OGM3NGFlOSwgTCJmb250SG9yaXpvbnRhbFNjYWxlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Gb250SG9yaXpvbnRhbFNjYWxlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJjZDc5MDMzLCBMImtlcm5pbmdNb2RlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9LZXJuaW5nTW9kZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDNhMDI3M2E2LCBMInVuZGVybGluZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDg3M2M2MDEsIEwiYmFzZWxpbmVTaGlmdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQmFzZWxpbmVTaGlmdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDRiMzE5NzY3LCBMIm92ZXJsaW5lUGVyaW9kIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9PdmVybGluZVBlcmlvZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc5NTQzMDU1LCBMImxldHRlclNwYWNpbmciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xldHRlclNwYWNpbmcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZWM2MjA0YywgTCJsaW5lVGhyb3VnaFBlcmlvZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2hQZXJpb2QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5MDdjNzcxOSwgTCJmb250VmVydGljYWxTY2FsZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRm9udFZlcnRpY2FsU2NhbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNjg2OTc1YiwgTCJzaXplIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TaXplLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YjVlNDliZjIsIEwicG9zdHVyZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUG9zdHVyZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZDZlMWQ4OCwgTCJ3ZWlnaHQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1dlaWdodCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJkOTZhMGU5LCBMInVuZGVybGluZVBlcmlvZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lUGVyaW9kLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzBlYzlmYTQsIEwib3ZlcmxpbmUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX092ZXJsaW5lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YWY3NTQ2MTMsIEwiY2hlY2tzdW0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fQ2hlY2tzdW0sIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZWE3MDkwYTAsIEwib3ZlcnJpZGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5ZGNjM2FiMywgTCJ0cmFpbGVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UcmFpbGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGNiY2FmNjZkLCBMImxlYWRlciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDYwYTYxZWRkLCBMImNvZGVUeXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGIzNzNhODYyLCBMImFyY2hpdmUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FyY2hpdmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTFhMjZiNTYsIEwiY29kZUJhc2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NvZGVCYXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZWIwOTEwMDMsIEwiY2xhc3NJZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ2xhc3NJZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMzlhODhiZCwgTCJsYWJlbFJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTGFiZWxSZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNTBmOTAzYSwgTCJ2YWx1ZVJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVmFsdWVSZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGVhNzA5MGEwLCBMIm92ZXJyaWRlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeHRyYXNfVHlwZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJiOGRmNWQsIEwicmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjRkODUxNjcsIEwidGltZW91dCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGltZW91dCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NTJkOWFkNSwgTCJ1c2FnZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNhZ2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Yzg2MGYzMGEsIEwiZGVsYXllZE9wZW4iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0RlbGF5ZWRPcGVuLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDI4ZGVlNmU5LCBMImZvcm1hdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRm9ybWF0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ODI0ZjIxYjcsIEwiZW1iZWRQREYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0VtYmVkUERGLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZGM3NTY3NmMsIEwidGV4dEVuY29kaW5nIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UZXh0RW5jb2RpbmcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmODg5ZTc0NywgTCJ4ZHBDb250ZW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9YZHBDb250ZW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OTdiZTkxYiwgTCJjb250ZW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9QYWNrZXRfQ29udGVudCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0MTU2ZWUzZiwgTCJkZWxpbWl0ZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0RlbGltaXRlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjFhZWQsIEwiaWQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYjhkZjVkLCBMInJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjFhZWQsIEwiaWQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQ1M2VhZjM4LCBMInN0YXJ0TmV3IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TdGFydE5ldywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDlkY2MzYWIzLCBMInRyYWlsZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNjExOGM4OSwgTCJ0YXJnZXRUeXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UYXJnZXRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2JjYWY2NmQsIEwibGVhZGVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9MZWFkZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YWJlZjM3ZTMsIEwic2xvcGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1Nsb3BlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ5OTZmYTliLCBMImhhbmQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0hhbmQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNjBkZDIwMiwgTCJsZW5ndGgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfTGVuZ3RoLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMDE0NiwgTCJkYiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfRGIsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YjM1NDNhNiwgTCJtYXgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfT2NjdXJfTWF4LA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiMzU2Y2E0LCBMIm1pbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9PY2N1cl9NaW4sDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3ZDBiNWZjYSwgTCJpbml0aWFsIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Jbml0aWFsLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDI5NDE4YmI3LCBMImFiYnIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FiYnIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYjhkZjVkLCBMInJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1YjQxMGNmLCBMInNhdmUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1NhdmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YjJjODA4NTcsIEwiY2xhc3NOYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX09iamVjdDo6U2NyaXB0X09iamVjdENsYXNzX0NsYXNzTmFtZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTYwZGQyMDIsIEwibGVuZ3RoIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0xlbmd0aCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OWY5ZDBmOSwgTCJhbGwiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19BbGwsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9PYmplY3R9LA0KKyAgICB7MHg0ZGYxNTY1OSwgTCJub2RlcyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX05vZGVzLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4NzhhOGQ2Y2YsIEwiY2xhc3NBbGwiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19DbGFzc0FsbCwgLTEsDQorICAgICBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweGNhZDZkOGNhLCBMInBhcmVudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1BhcmVudCwgLTEsDQorICAgICBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweGQ1Njc5Yzc4LCBMImluZGV4IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfSW5kZXgsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGRiNWI0YmNlLCBMImNsYXNzSW5kZXgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19DbGFzc0luZGV4LCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlNDk4OWFkZiwgTCJzb21FeHByZXNzaW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfU29tRXhwcmVzc2lvbiwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjFhZWQsIEwiaWQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjM0YTEsIEwibnMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX05zLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1MGQxYTlkMSwgTCJtb2RlbCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX01vZGVsLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4YWNiNDgyM2YsIEwiaXNDb250YWluZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Jc0NvbnRhaW5lciwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTM3MmFlOTcsIEwiaXNOdWxsIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfSXNOdWxsLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmZTYxMmE1YiwgTCJvbmVPZkNoaWxkIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfT25lT2ZDaGlsZCwgLTEsDQorICAgICBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweDk3YzFjNjUsIEwiY29udGV4dCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19Db250ZXh0LCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4NThiZTI4NzAsIEwiYWxpYXNOb2RlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0FsaWFzTm9kZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQogfTsNCi1leHRlcm4gY29uc3QgaW50MzJfdCBnX2lTb21BdHRyaWJ1dGVDb3VudCA9IHNpemVvZihnX1NvbUF0dHJpYnV0ZURhdGEpIC8gc2l6ZW9mKFhGQV9BVFRSSUJVVEVJTkZPKTsNCitleHRlcm4gY29uc3QgaW50MzJfdCBnX2lTb21BdHRyaWJ1dGVDb3VudCA9DQorICAgIHNpemVvZihnX1NvbUF0dHJpYnV0ZURhdGEpIC8gc2l6ZW9mKFhGQV9BVFRSSUJVVEVJTkZPKTsNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfYmFzaWNfaW1wLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuY3BwCmluZGV4IDUxOTVhMzYuLjJhYjA5NDkgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuY3BwCkBAIC0zOCw1OTcgKzM4LDU4OSBAQAogZXh0ZXJuIGNvbnN0IGludDMyX3QgZ19pU29tTWV0aG9kQ291bnQ7DQogZXh0ZXJuIGNvbnN0IFhGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPIGdfU29tQXR0cmlidXRlRGF0YVtdOw0KIGV4dGVybiBjb25zdCBpbnQzMl90IGdfaVNvbUF0dHJpYnV0ZUNvdW50Ow0KLVhGQV9MUENQQUNLRVRJTkZPIFhGQV9HZXRQYWNrZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSB3c05hbWUuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoID09IDApIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCBpTGVuZ3RoKTsNCi0gICAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gZ19pWEZBUGFja2V0Q291bnQgLSAxOw0KLSAgICBkbyB7DQotICAgICAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgWEZBX0xQQ1BBQ0tFVElORk8gcEluZm8gPSBnX1hGQVBhY2tldERhdGEgKyBpTWlkOw0KLSAgICAgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KLSAgICAgICAgICAgIHJldHVybiBwSW5mbzsNCi0gICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCi0gICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorWEZBX0xQQ1BBQ0tFVElORk8gWEZBX0dldFBhY2tldEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gd3NOYW1lLkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPT0gMCkgew0KICAgICByZXR1cm4gTlVMTDsNCi19DQotWEZBX0xQQ1BBQ0tFVElORk8gWEZBX0dldFBhY2tldEJ5SUQoRlhfRFdPUkQgZHdQYWNrZXQpDQotew0KLSAgICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFQYWNrZXRDb3VudCAtIDE7DQotICAgIGRvIHsNCi0gICAgICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICBGWF9EV09SRCBkd0ZpbmQgPSAoZ19YRkFQYWNrZXREYXRhICsgaU1pZCktPmVOYW1lOw0KLSAgICAgICAgaWYgKGR3UGFja2V0ID09IGR3RmluZCkgew0KLSAgICAgICAgICAgIHJldHVybiBnX1hGQVBhY2tldERhdGEgKyBpTWlkOw0KLSAgICAgICAgfSBlbHNlIGlmIChkd1BhY2tldCA8IGR3RmluZCkgew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLVhGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBYRkFfR2V0QXR0cmlidXRlRW51bUJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHdzTmFtZS5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIGlMZW5ndGgpOw0KLSAgICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFFbnVtQ291bnQgLSAxOw0KLSAgICBkbyB7DQotICAgICAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPIHBJbmZvID0gZ19YRkFFbnVtRGF0YSArIGlNaWQ7DQotICAgICAgICBpZiAodUhhc2ggPT0gcEluZm8tPnVIYXNoKSB7DQotICAgICAgICAgICAgcmV0dXJuIHBJbmZvOw0KLSAgICAgICAgfSBlbHNlIGlmICh1SGFzaCA8IHBJbmZvLT51SGFzaCkgew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLVhGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBYRkFfR2V0QXR0cmlidXRlRW51bUJ5SUQoWEZBX0FUVFJJQlVURUVOVU0gZU5hbWUpDQotew0KLSAgICByZXR1cm4gZ19YRkFFbnVtRGF0YSArIGVOYW1lOw0KLX0NCi1pbnQzMl90IFhGQV9HZXRBdHRyaWJ1dGVDb3VudCgpDQotew0KLSAgICByZXR1cm4gZ19pWEZBQXR0cmlidXRlQ291bnQ7DQotfQ0KLVhGQV9MUENBVFRSSUJVVEVJTkZPIFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSB3c05hbWUuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoID09IDApIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCBpTGVuZ3RoKTsNCi0gICAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gZ19pWEZBQXR0cmlidXRlQ291bnQgLSAxOw0KLSAgICBkbyB7DQotICAgICAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEluZm8gPSBnX1hGQUF0dHJpYnV0ZURhdGEgKyBpTWlkOw0KLSAgICAgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KLSAgICAgICAgICAgIHJldHVybiBwSW5mbzsNCi0gICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCi0gICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KLSAgICAgICAgfQ0KLSAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1YRkFfTFBDQVRUUklCVVRFSU5GTyBYRkFfR2V0QXR0cmlidXRlQnlJRChYRkFfQVRUUklCVVRFIGVOYW1lKQ0KLXsNCi0gICAgcmV0dXJuIChlTmFtZSA8IGdfaVhGQUF0dHJpYnV0ZUNvdW50KSA/IChnX1hGQUF0dHJpYnV0ZURhdGEgKyBlTmFtZSkgOiBOVUxMOw0KLX0NCi1GWF9CT09MIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUodm9pZCogJnBWYWx1ZSwgWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsIEZYX0RXT1JEIGR3UGFja2V0KQ0KLXsNCi0gICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEluZm8gPSBYRkFfR2V0QXR0cmlidXRlQnlJRChlQXR0cmlidXRlKTsNCi0gICAgaWYgKHBJbmZvID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoZHdQYWNrZXQgJiYgKGR3UGFja2V0ICYgcEluZm8tPmR3UGFja2V0cykgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmIChwSW5mby0+ZVR5cGUgPT0gZVR5cGUpIHsNCi0gICAgICAgIHBWYWx1ZSA9IHBJbmZvLT5wRGVmVmFsdWU7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfSBlbHNlIGlmIChwSW5mby0+ZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSkgew0KLSAgICAgICAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcEF0dHIgPSBYRkFfR2V0Tm90c3VyZUF0dHJpYnV0ZShlRWxlbWVudCwgZUF0dHJpYnV0ZSwgZVR5cGUpOw0KLSAgICAgICAgaWYgKHBBdHRyKSB7DQotICAgICAgICAgICAgcFZhbHVlID0gcEF0dHItPnBWYWx1ZTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLVhGQV9BVFRSSUJVVEVFTlVNIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bShYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLCBGWF9EV09SRCBkd1BhY2tldCkNCi17DQotICAgIHZvaWQqIHBWYWx1ZTsNCi0gICAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBlRWxlbWVudCwgZUF0dHJpYnV0ZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgZHdQYWNrZXQpKSB7DQotICAgICAgICByZXR1cm4gKFhGQV9BVFRSSUJVVEVFTlVNKSh1aW50cHRyX3QpcFZhbHVlOw0KLSAgICB9DQotICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KLX0NCi1DRlhfV2lkZVN0cmluZ0MgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9DZGF0YShYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLCBGWF9EV09SRCBkd1BhY2tldCkNCi17DQotICAgIHZvaWQqIHBWYWx1ZTsNCi0gICAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBlRWxlbWVudCwgZUF0dHJpYnV0ZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIGR3UGFja2V0KSkgew0KLSAgICAgICAgcmV0dXJuIChjb25zdCBGWF9XQ0hBUiopcFZhbHVlOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1GWF9CT09MIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQm9vbGVhbihYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLCBGWF9EV09SRCBkd1BhY2tldCkNCi17DQotICAgIHZvaWQqIHBWYWx1ZTsNCi0gICAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBlRWxlbWVudCwgZUF0dHJpYnV0ZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgZHdQYWNrZXQpKSB7DQotICAgICAgICByZXR1cm4gKEZYX0JPT0wpKHVpbnRwdHJfdClwVmFsdWU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1pbnQzMl90IFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfSW50ZWdlcihYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLCBGWF9EV09SRCBkd1BhY2tldCkNCi17DQotICAgIHZvaWQqIHBWYWx1ZTsNCi0gICAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBlRWxlbWVudCwgZUF0dHJpYnV0ZSwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgZHdQYWNrZXQpKSB7DQotICAgICAgICByZXR1cm4gKGludDMyX3QpKHVpbnRwdHJfdClwVmFsdWU7DQotICAgIH0NCi0gICAgcmV0dXJuIDA7DQotfQ0KLUNYRkFfTWVhc3VyZW1lbnQgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9NZWFzdXJlKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsIEZYX0RXT1JEIGR3UGFja2V0KQ0KLXsNCi0gICAgdm9pZCogcFZhbHVlOw0KLSAgICBpZiAoWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIGVFbGVtZW50LCBlQXR0cmlidXRlLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBkd1BhY2tldCkpIHsNCi0gICAgICAgIHJldHVybiAqKENYRkFfTWVhc3VyZW1lbnQqKXBWYWx1ZTsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ1hGQV9NZWFzdXJlbWVudCgpOw0KLX0NCi1pbnQzMl90IFhGQV9HZXRFbGVtZW50Q291bnQoKQ0KLXsNCi0gICAgcmV0dXJuIGdfaVhGQUVsZW1lbnRDb3VudDsNCi19DQotWEZBX0xQQ0VMRU1FTlRJTkZPIFhGQV9HZXRFbGVtZW50QnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gd3NOYW1lLkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQotICAgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaVhGQUVsZW1lbnRDb3VudCAtIDE7DQotICAgIGRvIHsNCi0gICAgICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICBYRkFfTFBDRUxFTUVOVElORk8gcEluZm8gPSBnX1hGQUVsZW1lbnREYXRhICsgaU1pZDsNCi0gICAgICAgIGlmICh1SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCi0gICAgICAgICAgICByZXR1cm4gcEluZm87DQotICAgICAgICB9IGVsc2UgaWYgKHVIYXNoIDwgcEluZm8tPnVIYXNoKSB7DQotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotWEZBX0xQQ0VMRU1FTlRJTkZPIFhGQV9HZXRFbGVtZW50QnlJRChYRkFfRUxFTUVOVCBlTmFtZSkNCi17DQotICAgIHJldHVybiAoZU5hbWUgPCBnX2lYRkFFbGVtZW50Q291bnQpID8gKGdfWEZBRWxlbWVudERhdGEgKyBlTmFtZSkgOiBOVUxMOw0KLX0NCi1jb25zdCBGWF9XT1JEKiBYRkFfR2V0RWxlbWVudENoaWxkcmVuKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBpbnQzMl90ICZpQ291bnQpDQotew0KLSAgICBpZiAoZUVsZW1lbnQgPj0gZ19pWEZBRWxlbWVudENvdW50KSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBYRkFfTFBDRUxFTUVOVEhJRVJBUkNIWSBwRWxlbWVudCA9IGdfWEZBRWxlbWVudENoaWxkcmVuSW5kZXggKyBlRWxlbWVudDsNCi0gICAgaUNvdW50ID0gcEVsZW1lbnQtPndDb3VudDsNCi0gICAgcmV0dXJuIGdfWEZBRWxlbWVudENoaWxkcmVuRGF0YSArIHBFbGVtZW50LT53U3RhcnQ7DQotfQ0KLWNvbnN0IHVpbnQ4X3QqIFhGQV9HZXRFbGVtZW50QXR0cmlidXRlcyhYRkFfRUxFTUVOVCBlRWxlbWVudCwgaW50MzJfdCAmaUNvdW50KQ0KLXsNCi0gICAgaWYgKGVFbGVtZW50ID49IGdfaVhGQUVsZW1lbnRDb3VudCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgWEZBX0xQQ0VMRU1FTlRISUVSQVJDSFkgcEVsZW1lbnQgPSBnX1hGQUVsZW1lbnRBdHRyaWJ1dGVJbmRleCArIGVFbGVtZW50Ow0KLSAgICBpQ291bnQgPSBwRWxlbWVudC0+d0NvdW50Ow0KLSAgICByZXR1cm4gZ19YRkFFbGVtZW50QXR0cmlidXRlRGF0YSArIHBFbGVtZW50LT53U3RhcnQ7DQotfQ0KLVhGQV9MUENBVFRSSUJVVEVJTkZPIFhGQV9HZXRBdHRyaWJ1dGVPZkVsZW1lbnQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgRlhfRFdPUkQgZHdQYWNrZXQpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIGNvbnN0IHVpbnQ4X3QqIHBBdHRyID0gWEZBX0dldEVsZW1lbnRBdHRyaWJ1dGVzKGVFbGVtZW50LCBpQ291bnQpOw0KLSAgICBpZiAocEF0dHIgPT0gTlVMTCB8fCBpQ291bnQgPCAxKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhfRFNQQVRlbXBsYXRlPHVpbnQ4X3Q+IHNlYXJjaDsNCi0gICAgaW50MzJfdCBpbmRleCA9IHNlYXJjaC5Mb29rdXAoZUF0dHJpYnV0ZSwgcEF0dHIsIGlDb3VudCk7DQotICAgIGlmIChpbmRleCA8IDApIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHJpYnV0ZSk7DQotICAgIEFTU0VSVChwSW5mbyAhPSBOVUxMKTsNCi0gICAgaWYgKGR3UGFja2V0ID09IFhGQV9YRFBQQUNLRVRfVU5LTk9XTikgew0KLSAgICAgICAgcmV0dXJuIHBJbmZvOw0KLSAgICB9DQotICAgIHJldHVybiAoZHdQYWNrZXQgJiBwSW5mby0+ZHdQYWNrZXRzKSA/IHBJbmZvIDogTlVMTDsNCi19DQotWEZBX0xQQ0VMRU1FTlRJTkZPIFhGQV9HZXRDaGlsZE9mRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0VMRU1FTlQgZUNoaWxkLCBGWF9EV09SRCBkd1BhY2tldCkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgY29uc3QgRlhfV09SRCogcENoaWxkID0gWEZBX0dldEVsZW1lbnRDaGlsZHJlbihlRWxlbWVudCwgaUNvdW50KTsNCi0gICAgaWYgKHBDaGlsZCA9PSBOVUxMIHx8IGlDb3VudCA8IDEpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENGWF9EU1BBVGVtcGxhdGU8RlhfV09SRD4gc2VhcmNoOw0KLSAgICBpbnQzMl90IGluZGV4ID0gc2VhcmNoLkxvb2t1cChlQ2hpbGQsIHBDaGlsZCwgaUNvdW50KTsNCi0gICAgaWYgKGluZGV4IDwgMCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBJbmZvID0gWEZBX0dldEVsZW1lbnRCeUlEKGVDaGlsZCk7DQotICAgIEFTU0VSVChwSW5mbyAhPSBOVUxMKTsNCi0gICAgaWYgKGR3UGFja2V0ID09IFhGQV9YRFBQQUNLRVRfVU5LTk9XTikgew0KLSAgICAgICAgcmV0dXJuIHBJbmZvOw0KLSAgICB9DQotICAgIHJldHVybiAoZHdQYWNrZXQgJiBwSW5mby0+ZHdQYWNrZXRzKSA/IHBJbmZvIDogTlVMTDsNCi19DQotWEZBX0xQQ1BST1BFUlRZIFhGQV9HZXRFbGVtZW50UHJvcGVydGllcyhYRkFfRUxFTUVOVCBlRWxlbWVudCwgaW50MzJfdCAmaUNvdW50KQ0KLXsNCi0gICAgaWYgKGVFbGVtZW50ID49IGdfaVhGQUVsZW1lbnRDb3VudCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgWEZBX0xQQ0VMRU1FTlRISUVSQVJDSFkgcEVsZW1lbnQgPSBnX1hGQUVsZW1lbnRQcm9wZXJ0eUluZGV4ICsgZUVsZW1lbnQ7DQotICAgIGlDb3VudCA9IHBFbGVtZW50LT53Q291bnQ7DQotICAgIHJldHVybiBnX1hGQUVsZW1lbnRQcm9wZXJ0eURhdGEgKyBwRWxlbWVudC0+d1N0YXJ0Ow0KLX0NCi1YRkFfTFBDUFJPUEVSVFkgWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KFhGQV9FTEVNRU5UIGVFbGVtZW50LCBYRkFfRUxFTUVOVCBlUHJvcGVydHksIEZYX0RXT1JEIGR3UGFja2V0KQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSAwOw0KLSAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnR5ID0gWEZBX0dldEVsZW1lbnRQcm9wZXJ0aWVzKGVFbGVtZW50LCBpQ291bnQpOw0KLSAgICBpZiAocFByb3BlcnR5ID09IE5VTEwgfHwgaUNvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gaUNvdW50IC0gMSwgaU1pZDsNCi0gICAgZG8gew0KLSAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICBYRkFfRUxFTUVOVCBlTmFtZSA9IChYRkFfRUxFTUVOVClwUHJvcGVydHlbaU1pZF0uZU5hbWU7DQotICAgICAgICBpZiAoZVByb3BlcnR5ID09IGVOYW1lKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9IGVsc2UgaWYgKGVQcm9wZXJ0eSA8IGVOYW1lKSB7DQotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KLSAgICBpZiAoaVN0YXJ0ID4gaUVuZCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBJbmZvID0gWEZBX0dldEVsZW1lbnRCeUlEKGVQcm9wZXJ0eSk7DQotICAgIEFTU0VSVChwSW5mbyAhPSBOVUxMKTsNCi0gICAgaWYgKGR3UGFja2V0ID09IFhGQV9YRFBQQUNLRVRfVU5LTk9XTikgew0KLSAgICAgICAgcmV0dXJuIHBQcm9wZXJ0eSArIGlNaWQ7DQotICAgIH0NCi0gICAgcmV0dXJuIChkd1BhY2tldCAmIHBJbmZvLT5kd1BhY2tldHMpID8gKHBQcm9wZXJ0eSArIGlNaWQpIDogTlVMTDsNCi19DQotWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUpDQotew0KLSAgICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFOb3RzdXJlQ291bnQgLSAxOw0KLSAgICBkbyB7DQotICAgICAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaU1pZDsNCi0gICAgICAgIGlmIChlRWxlbWVudCA9PSBwQXR0ci0+ZUVsZW1lbnQpIHsNCi0gICAgICAgICAgICBpZiAocEF0dHItPmVBdHRyaWJ1dGUgPT0gZUF0dHJpYnV0ZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSB8fCBlVHlwZSA9PSBwQXR0ci0+ZVR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwQXR0cjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlCZWZvcmUgPSBpTWlkIC0gMTsNCi0gICAgICAgICAgICAgICAgaWYoaUJlZm9yZSA+PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBwQXR0ciA9IGdfWEZBTm90c3VyZUF0dHJpYnV0ZXMgKyBpQmVmb3JlOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoZUVsZW1lbnQgPT0gcEF0dHItPmVFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocEF0dHItPmVBdHRyaWJ1dGUgPT0gZUF0dHJpYnV0ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSB8fCBlVHlwZSA9PSBwQXR0ci0+ZVR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQXR0cjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaUJlZm9yZSAtLTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihpQmVmb3JlIDwgMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaUJlZm9yZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlBZnRlciA9IGlNaWQgKyAxOw0KLSAgICAgICAgICAgICAgICBpZihpQWZ0ZXIgPD0gZ19pWEZBTm90c3VyZUNvdW50IC0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaUFmdGVyOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoZUVsZW1lbnQgPT0gcEF0dHItPmVFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocEF0dHItPmVBdHRyaWJ1dGUgPT0gZUF0dHJpYnV0ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSB8fCBlVHlwZSA9PSBwQXR0ci0+ZVR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQXR0cjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaUFmdGVyICsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlBZnRlciA+IGdfaVhGQU5vdHN1cmVDb3VudCAtIDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBdHRyID0gZ19YRkFOb3RzdXJlQXR0cmlidXRlcyArIGlBZnRlcjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGVFbGVtZW50IDwgcEF0dHItPmVFbGVtZW50KSB7DQotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotaW50MzJfdCBYRkFfR2V0TWV0aG9kQ291bnQoKQ0KLXsNCi0gICAgcmV0dXJuIGdfaVNvbU1ldGhvZENvdW50Ow0KLX0NCi1YRkFfTFBDTUVUSE9ESU5GTyBYRkFfR2V0TWV0aG9kQnlOYW1lKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWV0aG9kTmFtZSkNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHdzTWV0aG9kTmFtZS5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaW50MzJfdCBpRWxlbWVudEluZGV4ID0gZUVsZW1lbnQ7DQotICAgIHdoaWxlKGlFbGVtZW50SW5kZXggIT0gLTEpIHsNCi0gICAgICAgIFhGQV9MUENTQ1JJUFRISUVSQVJDSFkgc2NyaXB0SW5kZXggPSBnX1hGQVNjcmlwdEluZGV4ICsgaUVsZW1lbnRJbmRleDsNCi0gICAgICAgIGludDMyX3QgaWNvdW50ID0gc2NyaXB0SW5kZXgtPndNZXRob2RDb3VudDsNCi0gICAgICAgIGlmKGljb3VudCA9PSAwKSB7DQotICAgICAgICAgICAgaUVsZW1lbnRJbmRleCA9IHNjcmlwdEluZGV4LT53UGFyZW50SW5kZXg7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTWV0aG9kTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQotICAgICAgICBpbnQzMl90IGlTdGFydCA9IHNjcmlwdEluZGV4LT53TWV0aG9kU3RhcnQsIGlFbmQgPSBpU3RhcnQgKyBpY291bnQgLSAxOw0KLSAgICAgICAgZG8gew0KLSAgICAgICAgICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICAgICAgWEZBX0xQQ01FVEhPRElORk8gcEluZm8gPSBnX1NvbU1ldGhvZERhdGEgKyBpTWlkOw0KLSAgICAgICAgICAgIGlmICh1SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBJbmZvOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgICAgIGlFbGVtZW50SW5kZXggPSBzY3JpcHRJbmRleC0+d1BhcmVudEluZGV4Ow0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1YRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKFhGQV9FTEVNRU5UIGVFbGVtZW50LAljb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cmlidXRlTmFtZSkNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHdzQXR0cmlidXRlTmFtZS5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaW50MzJfdCBpRWxlbWVudEluZGV4ID0gZUVsZW1lbnQ7DQotICAgIHdoaWxlKGlFbGVtZW50SW5kZXggIT0gLTEpIHsNCi0gICAgICAgIFhGQV9MUENTQ1JJUFRISUVSQVJDSFkgc2NyaXB0SW5kZXggPSBnX1hGQVNjcmlwdEluZGV4ICsgaUVsZW1lbnRJbmRleDsNCi0gICAgICAgIGludDMyX3QgaWNvdW50ID0gc2NyaXB0SW5kZXgtPndBdHRyaWJ1dGVDb3VudDsNCi0gICAgICAgIGlmKGljb3VudCA9PSAwKSB7DQotICAgICAgICAgICAgaUVsZW1lbnRJbmRleCA9IHNjcmlwdEluZGV4LT53UGFyZW50SW5kZXg7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzQXR0cmlidXRlTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQotICAgICAgICBpbnQzMl90IGlTdGFydCA9IHNjcmlwdEluZGV4LT53QXR0cmlidXRlU3RhcnQsIGlFbmQgPSBpU3RhcnQgKyBpY291bnQgLSAxOw0KLSAgICAgICAgZG8gew0KLSAgICAgICAgICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICAgICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gcEluZm8gPSBnX1NvbUF0dHJpYnV0ZURhdGEgKyBpTWlkOw0KLSAgICAgICAgICAgIGlmICh1SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBJbmZvOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgICAgIGlFbGVtZW50SW5kZXggPSBzY3JpcHRJbmRleC0+d1BhcmVudEluZGV4Ow0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi12b2lkIENYRkFfTWVhc3VyZW1lbnQ6OlNldChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVhc3VyZSkNCi17DQotICAgIGlmICh3c01lYXN1cmUuSXNFbXB0eSgpKSB7DQotICAgICAgICBtX2ZWYWx1ZSA9IDA7DQotICAgICAgICBtX2VVbml0ID0gWEZBX1VOSVRfVW5rbm93bjsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlVc2VkTGVuID0gMDsNCi0gICAgaW50MzJfdCBpT2Zmc2V0ID0gKHdzTWVhc3VyZS5HZXRBdCgwKSA9PSBMJz0nKSA/IDEgOiAwOw0KLSAgICBGWF9GTE9BVCBmVmFsdWUgPSBGWF93Y3N0b2Yod3NNZWFzdXJlLkdldFB0cigpICsgaU9mZnNldCwgd3NNZWFzdXJlLkdldExlbmd0aCgpIC0gaU9mZnNldCwgJmlVc2VkTGVuKTsNCi0gICAgWEZBX1VOSVQgZVVuaXQgPSBHZXRVbml0KHdzTWVhc3VyZS5NaWQoaU9mZnNldCArIGlVc2VkTGVuKSk7DQotICAgIFNldChmVmFsdWUsIGVVbml0KTsNCi19DQotRlhfQk9PTCBDWEZBX01lYXN1cmVtZW50OjpUb1N0cmluZyhDRlhfV2lkZVN0cmluZyAmd3NNZWFzdXJlKSBjb25zdA0KLXsNCi0gICAgc3dpdGNoIChHZXRVbml0KCkpIHsNCi0gICAgICAgIGNhc2UgWEZBX1VOSVRfTW06DQotICAgICAgICAgICAgd3NNZWFzdXJlLkZvcm1hdChMIiUuOGdtbSIsIEdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgY2FzZSBYRkFfVU5JVF9QdDoNCi0gICAgICAgICAgICB3c01lYXN1cmUuRm9ybWF0KEwiJS44Z3B0IiwgR2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBjYXNlIFhGQV9VTklUX0luOg0KLSAgICAgICAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnaW4iLCBHZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGNhc2UgWEZBX1VOSVRfQ206DQotICAgICAgICAgICAgd3NNZWFzdXJlLkZvcm1hdChMIiUuOGdjbSIsIEdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgY2FzZSBYRkFfVU5JVF9NcDoNCi0gICAgICAgICAgICB3c01lYXN1cmUuRm9ybWF0KEwiJS44Z21wIiwgR2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBjYXNlIFhGQV9VTklUX1BjOg0KLSAgICAgICAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhncGMiLCBHZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGNhc2UgWEZBX1VOSVRfRW06DQotICAgICAgICAgICAgd3NNZWFzdXJlLkZvcm1hdChMIiUuOGdlbSIsIEdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgY2FzZSBYRkFfVU5JVF9QZXJjZW50Og0KLSAgICAgICAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnJSUiLCBHZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgd3NNZWFzdXJlLkZvcm1hdChMIiUuOGciLCBHZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi19DQotRlhfQk9PTCBDWEZBX01lYXN1cmVtZW50OjpUb1VuaXQoWEZBX1VOSVQgZVVuaXQsIEZYX0ZMT0FUICZmVmFsdWUpIGNvbnN0DQotew0KLSAgICBmVmFsdWUgPSBHZXRWYWx1ZSgpOw0KLSAgICBYRkFfVU5JVCBlRnJvbSA9IEdldFVuaXQoKTsNCi0gICAgaWYgKGVGcm9tID09IGVVbml0KSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKGVGcm9tKSB7DQotICAgICAgICBjYXNlIFhGQV9VTklUX1B0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfVU5JVF9NbToNCi0gICAgICAgICAgICBmVmFsdWUgKj0gNzIgLyAyLjU0ZiAvIDEwOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfVU5JVF9JbjoNCi0gICAgICAgICAgICBmVmFsdWUgKj0gNzI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9VTklUX0NtOg0KLSAgICAgICAgICAgIGZWYWx1ZSAqPSA3MiAvIDIuNTRmOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfVU5JVF9NcDoNCi0gICAgICAgICAgICBmVmFsdWUgKj0gMC4wMDFmOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfVU5JVF9QYzoNCi0gICAgICAgICAgICBmVmFsdWUgKj0gMTIuMGY7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGZWYWx1ZSA9IDA7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHN3aXRjaCAoZVVuaXQpIHsNCi0gICAgICAgIGNhc2UgWEZBX1VOSVRfUHQ6DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBjYXNlIFhGQV9VTklUX01tOg0KLSAgICAgICAgICAgIGZWYWx1ZSAvPSA3MiAvIDIuNTRmIC8gMTA7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBjYXNlIFhGQV9VTklUX0luOg0KLSAgICAgICAgICAgIGZWYWx1ZSAvPSA3MjsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGNhc2UgWEZBX1VOSVRfQ206DQotICAgICAgICAgICAgZlZhbHVlIC89IDcyIC8gMi41NGY7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBjYXNlIFhGQV9VTklUX01wOg0KLSAgICAgICAgICAgIGZWYWx1ZSAvPSAwLjAwMWY7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBjYXNlIFhGQV9VTklUX1BjOg0KLSAgICAgICAgICAgIGZWYWx1ZSAvPSAxMi4wZjsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgZlZhbHVlID0gMDsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1YRkFfVU5JVCBDWEZBX01lYXN1cmVtZW50OjpHZXRVbml0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVbml0KQ0KLXsNCi0gICAgaWYgKHdzVW5pdCA9PSBGWF9XU1RSQyhMIm1tIikpIHsNCi0gICAgICAgIHJldHVybiBYRkFfVU5JVF9NbTsNCi0gICAgfSBlbHNlIGlmICh3c1VuaXQgPT0gRlhfV1NUUkMoTCJwdCIpKSB7DQotICAgICAgICByZXR1cm4gWEZBX1VOSVRfUHQ7DQotICAgIH0gZWxzZSBpZiAod3NVbml0ID09IEZYX1dTVFJDKEwiaW4iKSkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9VTklUX0luOw0KLSAgICB9IGVsc2UgaWYgKHdzVW5pdCA9PSBGWF9XU1RSQyhMImNtIikpIHsNCi0gICAgICAgIHJldHVybiBYRkFfVU5JVF9DbTsNCi0gICAgfSBlbHNlIGlmICh3c1VuaXQgPT0gRlhfV1NUUkMoTCJwYyIpKSB7DQotICAgICAgICByZXR1cm4gWEZBX1VOSVRfUGM7DQotICAgIH0gZWxzZSBpZiAod3NVbml0ID09IEZYX1dTVFJDKEwibXAiKSkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9VTklUX01wOw0KLSAgICB9IGVsc2UgaWYgKHdzVW5pdCA9PSBGWF9XU1RSQyhMImVtIikpIHsNCi0gICAgICAgIHJldHVybiBYRkFfVU5JVF9FbTsNCi0gICAgfSBlbHNlIGlmICh3c1VuaXQgPT0gRlhfV1NUUkMoTCIlIikpIHsNCi0gICAgICAgIHJldHVybiBYRkFfVU5JVF9QZXJjZW50Ow0KKyAgfQ0KKyAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIGlMZW5ndGgpOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gZ19pWEZBUGFja2V0Q291bnQgLSAxOw0KKyAgZG8gew0KKyAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBYRkFfTFBDUEFDS0VUSU5GTyBwSW5mbyA9IGdfWEZBUGFja2V0RGF0YSArIGlNaWQ7DQorICAgIGlmICh1SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCisgICAgICByZXR1cm4gcEluZm87DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQogICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gWEZBX1VOSVRfVW5rbm93bjsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCiAgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLUlGWF9TdHJlYW0qIFhGQV9DcmVhdGVXaWRlVGV4dFJlYWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzQnVmZmVyKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDWEZBX1dpZGVUZXh0UmVhZCh3c0J1ZmZlcik7DQotfQ0KLUNYRkFfV2lkZVRleHRSZWFkOjpDWEZBX1dpZGVUZXh0UmVhZChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NCdWZmZXIpDQotICAgIDogbV93c0J1ZmZlcih3c0J1ZmZlcikNCi0gICAgLCBtX2lQb3NpdGlvbigwKQ0KLSAgICAsIG1faVJlZkNvdW50KDEpDQotew0KLX0NCi12b2lkIENYRkFfV2lkZVRleHRSZWFkOjpSZWxlYXNlKCkNCi17DQotICAgIGlmICgtLW1faVJlZkNvdW50IDwgMSkgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQorWEZBX0xQQ1BBQ0tFVElORk8gWEZBX0dldFBhY2tldEJ5SUQoRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaVhGQVBhY2tldENvdW50IC0gMTsNCisgIGRvIHsNCisgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgRlhfRFdPUkQgZHdGaW5kID0gKGdfWEZBUGFja2V0RGF0YSArIGlNaWQpLT5lTmFtZTsNCisgICAgaWYgKGR3UGFja2V0ID09IGR3RmluZCkgew0KKyAgICAgIHJldHVybiBnX1hGQVBhY2tldERhdGEgKyBpTWlkOw0KKyAgICB9IGVsc2UgaWYgKGR3UGFja2V0IDwgZHdGaW5kKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KICAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gTlVMTDsNCiB9DQotSUZYX1N0cmVhbSogQ1hGQV9XaWRlVGV4dFJlYWQ6OlJldGFpbigpDQotew0KLSAgICBtX2lSZWZDb3VudCsrOw0KLSAgICByZXR1cm4gdGhpczsNCi19DQotRlhfRFdPUkQgQ1hGQV9XaWRlVGV4dFJlYWQ6OkdldEFjY2Vzc01vZGVzKCkgY29uc3QNCi17DQotICAgIHJldHVybiBGWF9TVFJFQU1BQ0NFU1NfUmVhZCB8IEZYX1NUUkVBTUFDQ0VTU19UZXh0Ow0KLX0NCi1pbnQzMl90IENYRkFfV2lkZVRleHRSZWFkOjpHZXRMZW5ndGgoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCkgKiBzaXplb2YoRlhfV0NIQVIpOw0KLX0NCi1pbnQzMl90IENYRkFfV2lkZVRleHRSZWFkOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkNCi17DQotICAgIHN3aXRjaCAoZVNlZWspIHsNCi0gICAgICAgIGNhc2UgRlhfU1RSRUFNU0VFS19CZWdpbjoNCi0gICAgICAgICAgICBtX2lQb3NpdGlvbiA9IGlPZmZzZXQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQ3VycmVudDoNCi0gICAgICAgICAgICBtX2lQb3NpdGlvbiArPSBpT2Zmc2V0Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0VuZDoNCi0gICAgICAgICAgICBtX2lQb3NpdGlvbiA9IG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCkgKyBpT2Zmc2V0Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KK1hGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBYRkFfR2V0QXR0cmlidXRlRW51bUJ5TmFtZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHdzTmFtZS5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFFbnVtQ291bnQgLSAxOw0KKyAgZG8gew0KKyAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBYRkFfTFBDQVRUUklCVVRFRU5VTUlORk8gcEluZm8gPSBnX1hGQUVudW1EYXRhICsgaU1pZDsNCisgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgIHJldHVybiBwSW5mbzsNCisgICAgfSBlbHNlIGlmICh1SGFzaCA8IHBJbmZvLT51SGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCiAgICAgfQ0KLSAgICBpZiAobV9pUG9zaXRpb24gPCAwKSB7DQotICAgICAgICBtX2lQb3NpdGlvbiA9IDA7DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gTlVMTDsNCit9DQorWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPIFhGQV9HZXRBdHRyaWJ1dGVFbnVtQnlJRChYRkFfQVRUUklCVVRFRU5VTSBlTmFtZSkgew0KKyAgcmV0dXJuIGdfWEZBRW51bURhdGEgKyBlTmFtZTsNCit9DQoraW50MzJfdCBYRkFfR2V0QXR0cmlidXRlQ291bnQoKSB7DQorICByZXR1cm4gZ19pWEZBQXR0cmlidXRlQ291bnQ7DQorfQ0KK1hGQV9MUENBVFRSSUJVVEVJTkZPIFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHdzTmFtZS5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFBdHRyaWJ1dGVDb3VudCAtIDE7DQorICBkbyB7DQorICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBJbmZvID0gZ19YRkFBdHRyaWJ1dGVEYXRhICsgaU1pZDsNCisgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgIHJldHVybiBwSW5mbzsNCisgICAgfSBlbHNlIGlmICh1SGFzaCA8IHBJbmZvLT51SGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCiAgICAgfQ0KLSAgICBpZiAobV9pUG9zaXRpb24gPiBtX3dzQnVmZmVyLkdldExlbmd0aCgpKSB7DQotICAgICAgICBtX2lQb3NpdGlvbiA9IG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCk7DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gTlVMTDsNCit9DQorWEZBX0xQQ0FUVFJJQlVURUlORk8gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoWEZBX0FUVFJJQlVURSBlTmFtZSkgew0KKyAgcmV0dXJuIChlTmFtZSA8IGdfaVhGQUF0dHJpYnV0ZUNvdW50KSA/IChnX1hGQUF0dHJpYnV0ZURhdGEgKyBlTmFtZSkgOiBOVUxMOw0KK30NCitGWF9CT09MIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUodm9pZComIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UGFja2V0KSB7DQorICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKGVBdHRyaWJ1dGUpOw0KKyAgaWYgKHBJbmZvID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGR3UGFja2V0ICYmIChkd1BhY2tldCAmIHBJbmZvLT5kd1BhY2tldHMpID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBJbmZvLT5lVHlwZSA9PSBlVHlwZSkgew0KKyAgICBwVmFsdWUgPSBwSW5mby0+cERlZlZhbHVlOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0gZWxzZSBpZiAocEluZm8tPmVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUpIHsNCisgICAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcEF0dHIgPQ0KKyAgICAgICAgWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoZUVsZW1lbnQsIGVBdHRyaWJ1dGUsIGVUeXBlKTsNCisgICAgaWYgKHBBdHRyKSB7DQorICAgICAgcFZhbHVlID0gcEF0dHItPnBWYWx1ZTsNCisgICAgICByZXR1cm4gVFJVRTsNCiAgICAgfQ0KLSAgICByZXR1cm4gR2V0UG9zaXRpb24oKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotaW50MzJfdCBDWEZBX1dpZGVUZXh0UmVhZDo6R2V0UG9zaXRpb24oKQ0KLXsNCi0gICAgcmV0dXJuIG1faVBvc2l0aW9uICogc2l6ZW9mKEZYX1dDSEFSKTsNCitYRkFfQVRUUklCVVRFRU5VTSBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIHZvaWQqIHBWYWx1ZTsNCisgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgZUVsZW1lbnQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBkd1BhY2tldCkpIHsNCisgICAgcmV0dXJuIChYRkFfQVRUUklCVVRFRU5VTSkodWludHB0cl90KXBWYWx1ZTsNCisgIH0NCisgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KIH0NCi1GWF9CT09MIENYRkFfV2lkZVRleHRSZWFkOjpJc0VPRigpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9pUG9zaXRpb24gPj0gbV93c0J1ZmZlci5HZXRMZW5ndGgoKTsNCitDRlhfV2lkZVN0cmluZ0MgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9DZGF0YShYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIHZvaWQqIHBWYWx1ZTsNCisgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgZUVsZW1lbnQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgZHdQYWNrZXQpKSB7DQorICAgIHJldHVybiAoY29uc3QgRlhfV0NIQVIqKXBWYWx1ZTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1pbnQzMl90IENYRkFfV2lkZVRleHRSZWFkOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIEZYX0JPT0wgJmJFT1MsIGludDMyX3QgY29uc3QgKnBCeXRlU2l6ZSApDQotew0KLSAgICBpZiAoaU1heExlbmd0aCA+IG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCkgLSBtX2lQb3NpdGlvbikgew0KLSAgICAgICAgaU1heExlbmd0aCA9IG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCkgLSBtX2lQb3NpdGlvbjsNCitGWF9CT09MIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQm9vbGVhbihYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIHZvaWQqIHBWYWx1ZTsNCisgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgZUVsZW1lbnQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBkd1BhY2tldCkpIHsNCisgICAgcmV0dXJuIChGWF9CT09MKSh1aW50cHRyX3QpcFZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitpbnQzMl90IFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfSW50ZWdlcihYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIHZvaWQqIHBWYWx1ZTsNCisgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgZUVsZW1lbnQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBkd1BhY2tldCkpIHsNCisgICAgcmV0dXJuIChpbnQzMl90KSh1aW50cHRyX3QpcFZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK0NYRkFfTWVhc3VyZW1lbnQgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9NZWFzdXJlKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1BhY2tldCkgew0KKyAgdm9pZCogcFZhbHVlOw0KKyAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBlRWxlbWVudCwgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIGR3UGFja2V0KSkgew0KKyAgICByZXR1cm4gKihDWEZBX01lYXN1cmVtZW50KilwVmFsdWU7DQorICB9DQorICByZXR1cm4gQ1hGQV9NZWFzdXJlbWVudCgpOw0KK30NCitpbnQzMl90IFhGQV9HZXRFbGVtZW50Q291bnQoKSB7DQorICByZXR1cm4gZ19pWEZBRWxlbWVudENvdW50Ow0KK30NCitYRkFfTFBDRUxFTUVOVElORk8gWEZBX0dldEVsZW1lbnRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHdzTmFtZS5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFFbGVtZW50Q291bnQgLSAxOw0KKyAgZG8gew0KKyAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBYRkFfTFBDRUxFTUVOVElORk8gcEluZm8gPSBnX1hGQUVsZW1lbnREYXRhICsgaU1pZDsNCisgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgIHJldHVybiBwSW5mbzsNCisgICAgfSBlbHNlIGlmICh1SGFzaCA8IHBJbmZvLT51SGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCiAgICAgfQ0KLSAgICBGWFNZU193Y3NuY3B5KHBTdHIsIChjb25zdCBGWF9XQ0hBUiopbV93c0J1ZmZlciArIG1faVBvc2l0aW9uLCBpTWF4TGVuZ3RoKTsNCi0gICAgbV9pUG9zaXRpb24gKz0gaU1heExlbmd0aDsNCi0gICAgYkVPUyA9IElzRU9GKCk7DQotICAgIHJldHVybiBpTWF4TGVuZ3RoOw0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLUZYX1dPUkQgQ1hGQV9XaWRlVGV4dFJlYWQ6OkdldENvZGVQYWdlKCkgY29uc3QNCi17DQotICAgIHJldHVybiAoc2l6ZW9mKEZYX1dDSEFSKSA9PSAyKSA/IEZYX0NPREVQQUdFX1VURjE2TEUgOiBGWF9DT0RFUEFHRV9VVEYzMkxFOw0KK1hGQV9MUENFTEVNRU5USU5GTyBYRkFfR2V0RWxlbWVudEJ5SUQoWEZBX0VMRU1FTlQgZU5hbWUpIHsNCisgIHJldHVybiAoZU5hbWUgPCBnX2lYRkFFbGVtZW50Q291bnQpID8gKGdfWEZBRWxlbWVudERhdGEgKyBlTmFtZSkgOiBOVUxMOw0KIH0NCi1GWF9XT1JEIENYRkFfV2lkZVRleHRSZWFkOjpTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSkNCi17DQotICAgIHJldHVybiBHZXRDb2RlUGFnZSgpOw0KK2NvbnN0IEZYX1dPUkQqIFhGQV9HZXRFbGVtZW50Q2hpbGRyZW4oWEZBX0VMRU1FTlQgZUVsZW1lbnQsIGludDMyX3QmIGlDb3VudCkgew0KKyAgaWYgKGVFbGVtZW50ID49IGdfaVhGQUVsZW1lbnRDb3VudCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIFhGQV9MUENFTEVNRU5USElFUkFSQ0hZIHBFbGVtZW50ID0gZ19YRkFFbGVtZW50Q2hpbGRyZW5JbmRleCArIGVFbGVtZW50Ow0KKyAgaUNvdW50ID0gcEVsZW1lbnQtPndDb3VudDsNCisgIHJldHVybiBnX1hGQUVsZW1lbnRDaGlsZHJlbkRhdGEgKyBwRWxlbWVudC0+d1N0YXJ0Ow0KK30NCitjb25zdCB1aW50OF90KiBYRkFfR2V0RWxlbWVudEF0dHJpYnV0ZXMoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIGludDMyX3QmIGlDb3VudCkgew0KKyAgaWYgKGVFbGVtZW50ID49IGdfaVhGQUVsZW1lbnRDb3VudCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIFhGQV9MUENFTEVNRU5USElFUkFSQ0hZIHBFbGVtZW50ID0gZ19YRkFFbGVtZW50QXR0cmlidXRlSW5kZXggKyBlRWxlbWVudDsNCisgIGlDb3VudCA9IHBFbGVtZW50LT53Q291bnQ7DQorICByZXR1cm4gZ19YRkFFbGVtZW50QXR0cmlidXRlRGF0YSArIHBFbGVtZW50LT53U3RhcnQ7DQorfQ0KK1hGQV9MUENBVFRSSUJVVEVJTkZPIFhGQV9HZXRBdHRyaWJ1dGVPZkVsZW1lbnQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1BhY2tldCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgY29uc3QgdWludDhfdCogcEF0dHIgPSBYRkFfR2V0RWxlbWVudEF0dHJpYnV0ZXMoZUVsZW1lbnQsIGlDb3VudCk7DQorICBpZiAocEF0dHIgPT0gTlVMTCB8fCBpQ291bnQgPCAxKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX0RTUEFUZW1wbGF0ZTx1aW50OF90PiBzZWFyY2g7DQorICBpbnQzMl90IGluZGV4ID0gc2VhcmNoLkxvb2t1cChlQXR0cmlidXRlLCBwQXR0ciwgaUNvdW50KTsNCisgIGlmIChpbmRleCA8IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKGVBdHRyaWJ1dGUpOw0KKyAgQVNTRVJUKHBJbmZvICE9IE5VTEwpOw0KKyAgaWYgKGR3UGFja2V0ID09IFhGQV9YRFBQQUNLRVRfVU5LTk9XTikgew0KKyAgICByZXR1cm4gcEluZm87DQorICB9DQorICByZXR1cm4gKGR3UGFja2V0ICYgcEluZm8tPmR3UGFja2V0cykgPyBwSW5mbyA6IE5VTEw7DQorfQ0KK1hGQV9MUENFTEVNRU5USU5GTyBYRkFfR2V0Q2hpbGRPZkVsZW1lbnQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlQ2hpbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1BhY2tldCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgY29uc3QgRlhfV09SRCogcENoaWxkID0gWEZBX0dldEVsZW1lbnRDaGlsZHJlbihlRWxlbWVudCwgaUNvdW50KTsNCisgIGlmIChwQ2hpbGQgPT0gTlVMTCB8fCBpQ291bnQgPCAxKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX0RTUEFUZW1wbGF0ZTxGWF9XT1JEPiBzZWFyY2g7DQorICBpbnQzMl90IGluZGV4ID0gc2VhcmNoLkxvb2t1cChlQ2hpbGQsIHBDaGlsZCwgaUNvdW50KTsNCisgIGlmIChpbmRleCA8IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBYRkFfTFBDRUxFTUVOVElORk8gcEluZm8gPSBYRkFfR2V0RWxlbWVudEJ5SUQoZUNoaWxkKTsNCisgIEFTU0VSVChwSW5mbyAhPSBOVUxMKTsNCisgIGlmIChkd1BhY2tldCA9PSBYRkFfWERQUEFDS0VUX1VOS05PV04pIHsNCisgICAgcmV0dXJuIHBJbmZvOw0KKyAgfQ0KKyAgcmV0dXJuIChkd1BhY2tldCAmIHBJbmZvLT5kd1BhY2tldHMpID8gcEluZm8gOiBOVUxMOw0KK30NCitYRkFfTFBDUFJPUEVSVFkgWEZBX0dldEVsZW1lbnRQcm9wZXJ0aWVzKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUNvdW50KSB7DQorICBpZiAoZUVsZW1lbnQgPj0gZ19pWEZBRWxlbWVudENvdW50KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgWEZBX0xQQ0VMRU1FTlRISUVSQVJDSFkgcEVsZW1lbnQgPSBnX1hGQUVsZW1lbnRQcm9wZXJ0eUluZGV4ICsgZUVsZW1lbnQ7DQorICBpQ291bnQgPSBwRWxlbWVudC0+d0NvdW50Ow0KKyAgcmV0dXJuIGdfWEZBRWxlbWVudFByb3BlcnR5RGF0YSArIHBFbGVtZW50LT53U3RhcnQ7DQorfQ0KK1hGQV9MUENQUk9QRVJUWSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlUHJvcGVydHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1BhY2tldCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0eSA9IFhGQV9HZXRFbGVtZW50UHJvcGVydGllcyhlRWxlbWVudCwgaUNvdW50KTsNCisgIGlmIChwUHJvcGVydHkgPT0gTlVMTCB8fCBpQ291bnQgPCAxKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gaUNvdW50IC0gMSwgaU1pZDsNCisgIGRvIHsNCisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIFhGQV9FTEVNRU5UIGVOYW1lID0gKFhGQV9FTEVNRU5UKXBQcm9wZXJ0eVtpTWlkXS5lTmFtZTsNCisgICAgaWYgKGVQcm9wZXJ0eSA9PSBlTmFtZSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9IGVsc2UgaWYgKGVQcm9wZXJ0eSA8IGVOYW1lKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICBpZiAoaVN0YXJ0ID4gaUVuZCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIFhGQV9MUENFTEVNRU5USU5GTyBwSW5mbyA9IFhGQV9HZXRFbGVtZW50QnlJRChlUHJvcGVydHkpOw0KKyAgQVNTRVJUKHBJbmZvICE9IE5VTEwpOw0KKyAgaWYgKGR3UGFja2V0ID09IFhGQV9YRFBQQUNLRVRfVU5LTk9XTikgew0KKyAgICByZXR1cm4gcFByb3BlcnR5ICsgaU1pZDsNCisgIH0NCisgIHJldHVybiAoZHdQYWNrZXQgJiBwSW5mby0+ZHdQYWNrZXRzKSA/IChwUHJvcGVydHkgKyBpTWlkKSA6IE5VTEw7DQorfQ0KK1hGQV9MUENOT1RTVVJFQVRUUklCVVRFIFhGQV9HZXROb3RzdXJlQXR0cmlidXRlKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRSBlVHlwZSkgew0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gZ19pWEZBTm90c3VyZUNvdW50IC0gMTsNCisgIGRvIHsNCisgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaU1pZDsNCisgICAgaWYgKGVFbGVtZW50ID09IHBBdHRyLT5lRWxlbWVudCkgew0KKyAgICAgIGlmIChwQXR0ci0+ZUF0dHJpYnV0ZSA9PSBlQXR0cmlidXRlKSB7DQorICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSB8fCBlVHlwZSA9PSBwQXR0ci0+ZVR5cGUpIHsNCisgICAgICAgICAgcmV0dXJuIHBBdHRyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGludDMyX3QgaUJlZm9yZSA9IGlNaWQgLSAxOw0KKyAgICAgICAgaWYgKGlCZWZvcmUgPj0gMCkgew0KKyAgICAgICAgICBwQXR0ciA9IGdfWEZBTm90c3VyZUF0dHJpYnV0ZXMgKyBpQmVmb3JlOw0KKyAgICAgICAgICB3aGlsZSAoZUVsZW1lbnQgPT0gcEF0dHItPmVFbGVtZW50KSB7DQorICAgICAgICAgICAgaWYgKHBBdHRyLT5lQXR0cmlidXRlID09IGVBdHRyaWJ1dGUpIHsNCisgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFIHx8IGVUeXBlID09IHBBdHRyLT5lVHlwZSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcEF0dHI7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUJlZm9yZS0tOw0KKyAgICAgICAgICAgIGlmIChpQmVmb3JlIDwgMCkgew0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBBdHRyID0gZ19YRkFOb3RzdXJlQXR0cmlidXRlcyArIGlCZWZvcmU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgaUFmdGVyID0gaU1pZCArIDE7DQorICAgICAgICBpZiAoaUFmdGVyIDw9IGdfaVhGQU5vdHN1cmVDb3VudCAtIDEpIHsNCisgICAgICAgICAgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaUFmdGVyOw0KKyAgICAgICAgICB3aGlsZSAoZUVsZW1lbnQgPT0gcEF0dHItPmVFbGVtZW50KSB7DQorICAgICAgICAgICAgaWYgKHBBdHRyLT5lQXR0cmlidXRlID09IGVBdHRyaWJ1dGUpIHsNCisgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFIHx8IGVUeXBlID09IHBBdHRyLT5lVHlwZSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcEF0dHI7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUFmdGVyKys7DQorICAgICAgICAgICAgaWYgKGlBZnRlciA+IGdfaVhGQU5vdHN1cmVDb3VudCAtIDEpIHsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwQXR0ciA9IGdfWEZBTm90c3VyZUF0dHJpYnV0ZXMgKyBpQWZ0ZXI7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChlRWxlbWVudCA8IHBBdHRyLT5lRWxlbWVudCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK2ludDMyX3QgWEZBX0dldE1ldGhvZENvdW50KCkgew0KKyAgcmV0dXJuIGdfaVNvbU1ldGhvZENvdW50Ow0KK30NCitYRkFfTFBDTUVUSE9ESU5GTyBYRkFfR2V0TWV0aG9kQnlOYW1lKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01ldGhvZE5hbWUpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHdzTWV0aG9kTmFtZS5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IGlFbGVtZW50SW5kZXggPSBlRWxlbWVudDsNCisgIHdoaWxlIChpRWxlbWVudEluZGV4ICE9IC0xKSB7DQorICAgIFhGQV9MUENTQ1JJUFRISUVSQVJDSFkgc2NyaXB0SW5kZXggPSBnX1hGQVNjcmlwdEluZGV4ICsgaUVsZW1lbnRJbmRleDsNCisgICAgaW50MzJfdCBpY291bnQgPSBzY3JpcHRJbmRleC0+d01ldGhvZENvdW50Ow0KKyAgICBpZiAoaWNvdW50ID09IDApIHsNCisgICAgICBpRWxlbWVudEluZGV4ID0gc2NyaXB0SW5kZXgtPndQYXJlbnRJbmRleDsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTWV0aG9kTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICAgIGludDMyX3QgaVN0YXJ0ID0gc2NyaXB0SW5kZXgtPndNZXRob2RTdGFydCwgaUVuZCA9IGlTdGFydCArIGljb3VudCAtIDE7DQorICAgIGRvIHsNCisgICAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgIFhGQV9MUENNRVRIT0RJTkZPIHBJbmZvID0gZ19Tb21NZXRob2REYXRhICsgaU1pZDsNCisgICAgICBpZiAodUhhc2ggPT0gcEluZm8tPnVIYXNoKSB7DQorICAgICAgICByZXR1cm4gcEluZm87DQorICAgICAgfSBlbHNlIGlmICh1SGFzaCA8IHBJbmZvLT51SGFzaCkgew0KKyAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICB9DQorICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgaUVsZW1lbnRJbmRleCA9IHNjcmlwdEluZGV4LT53UGFyZW50SW5kZXg7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gWEZBX0dldFNjcmlwdEF0dHJpYnV0ZUJ5TmFtZSgNCisgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyaWJ1dGVOYW1lKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSB3c0F0dHJpYnV0ZU5hbWUuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA9PSAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBpRWxlbWVudEluZGV4ID0gZUVsZW1lbnQ7DQorICB3aGlsZSAoaUVsZW1lbnRJbmRleCAhPSAtMSkgew0KKyAgICBYRkFfTFBDU0NSSVBUSElFUkFSQ0hZIHNjcmlwdEluZGV4ID0gZ19YRkFTY3JpcHRJbmRleCArIGlFbGVtZW50SW5kZXg7DQorICAgIGludDMyX3QgaWNvdW50ID0gc2NyaXB0SW5kZXgtPndBdHRyaWJ1dGVDb3VudDsNCisgICAgaWYgKGljb3VudCA9PSAwKSB7DQorICAgICAgaUVsZW1lbnRJbmRleCA9IHNjcmlwdEluZGV4LT53UGFyZW50SW5kZXg7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0F0dHJpYnV0ZU5hbWUuR2V0UHRyKCksIGlMZW5ndGgpOw0KKyAgICBpbnQzMl90IGlTdGFydCA9IHNjcmlwdEluZGV4LT53QXR0cmlidXRlU3RhcnQsIGlFbmQgPSBpU3RhcnQgKyBpY291bnQgLSAxOw0KKyAgICBkbyB7DQorICAgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBwSW5mbyA9IGdfU29tQXR0cmlidXRlRGF0YSArIGlNaWQ7DQorICAgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgICAgcmV0dXJuIHBJbmZvOw0KKyAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgfQ0KKyAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgIGlFbGVtZW50SW5kZXggPSBzY3JpcHRJbmRleC0+d1BhcmVudEluZGV4Ow0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9NZWFzdXJlbWVudDo6U2V0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZWFzdXJlKSB7DQorICBpZiAod3NNZWFzdXJlLklzRW1wdHkoKSkgew0KKyAgICBtX2ZWYWx1ZSA9IDA7DQorICAgIG1fZVVuaXQgPSBYRkFfVU5JVF9Vbmtub3duOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlVc2VkTGVuID0gMDsNCisgIGludDMyX3QgaU9mZnNldCA9ICh3c01lYXN1cmUuR2V0QXQoMCkgPT0gTCc9JykgPyAxIDogMDsNCisgIEZYX0ZMT0FUIGZWYWx1ZSA9IEZYX3djc3RvZih3c01lYXN1cmUuR2V0UHRyKCkgKyBpT2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTWVhc3VyZS5HZXRMZW5ndGgoKSAtIGlPZmZzZXQsICZpVXNlZExlbik7DQorICBYRkFfVU5JVCBlVW5pdCA9IEdldFVuaXQod3NNZWFzdXJlLk1pZChpT2Zmc2V0ICsgaVVzZWRMZW4pKTsNCisgIFNldChmVmFsdWUsIGVVbml0KTsNCit9DQorRlhfQk9PTCBDWEZBX01lYXN1cmVtZW50OjpUb1N0cmluZyhDRlhfV2lkZVN0cmluZyYgd3NNZWFzdXJlKSBjb25zdCB7DQorICBzd2l0Y2ggKEdldFVuaXQoKSkgew0KKyAgICBjYXNlIFhGQV9VTklUX01tOg0KKyAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnbW0iLCBHZXRWYWx1ZSgpKTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVU5JVF9QdDoNCisgICAgICB3c01lYXN1cmUuRm9ybWF0KEwiJS44Z3B0IiwgR2V0VmFsdWUoKSk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgWEZBX1VOSVRfSW46DQorICAgICAgd3NNZWFzdXJlLkZvcm1hdChMIiUuOGdpbiIsIEdldFZhbHVlKCkpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIFhGQV9VTklUX0NtOg0KKyAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnY20iLCBHZXRWYWx1ZSgpKTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVU5JVF9NcDoNCisgICAgICB3c01lYXN1cmUuRm9ybWF0KEwiJS44Z21wIiwgR2V0VmFsdWUoKSk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgWEZBX1VOSVRfUGM6DQorICAgICAgd3NNZWFzdXJlLkZvcm1hdChMIiUuOGdwYyIsIEdldFZhbHVlKCkpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIFhGQV9VTklUX0VtOg0KKyAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnZW0iLCBHZXRWYWx1ZSgpKTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVU5JVF9QZXJjZW50Og0KKyAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnJSUiLCBHZXRWYWx1ZSgpKTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgZGVmYXVsdDoNCisgICAgICB3c01lYXN1cmUuRm9ybWF0KEwiJS44ZyIsIEdldFZhbHVlKCkpOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX01lYXN1cmVtZW50OjpUb1VuaXQoWEZBX1VOSVQgZVVuaXQsIEZYX0ZMT0FUJiBmVmFsdWUpIGNvbnN0IHsNCisgIGZWYWx1ZSA9IEdldFZhbHVlKCk7DQorICBYRkFfVU5JVCBlRnJvbSA9IEdldFVuaXQoKTsNCisgIGlmIChlRnJvbSA9PSBlVW5pdCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHN3aXRjaCAoZUZyb20pIHsNCisgICAgY2FzZSBYRkFfVU5JVF9QdDoNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVU5JVF9NbToNCisgICAgICBmVmFsdWUgKj0gNzIgLyAyLjU0ZiAvIDEwOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9VTklUX0luOg0KKyAgICAgIGZWYWx1ZSAqPSA3MjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVU5JVF9DbToNCisgICAgICBmVmFsdWUgKj0gNzIgLyAyLjU0ZjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVU5JVF9NcDoNCisgICAgICBmVmFsdWUgKj0gMC4wMDFmOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9VTklUX1BjOg0KKyAgICAgIGZWYWx1ZSAqPSAxMi4wZjsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBmVmFsdWUgPSAwOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHN3aXRjaCAoZVVuaXQpIHsNCisgICAgY2FzZSBYRkFfVU5JVF9QdDoNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVU5JVF9NbToNCisgICAgICBmVmFsdWUgLz0gNzIgLyAyLjU0ZiAvIDEwOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIFhGQV9VTklUX0luOg0KKyAgICAgIGZWYWx1ZSAvPSA3MjsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVU5JVF9DbToNCisgICAgICBmVmFsdWUgLz0gNzIgLyAyLjU0ZjsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVU5JVF9NcDoNCisgICAgICBmVmFsdWUgLz0gMC4wMDFmOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIFhGQV9VTklUX1BjOg0KKyAgICAgIGZWYWx1ZSAvPSAxMi4wZjsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgZGVmYXVsdDoNCisgICAgICBmVmFsdWUgPSAwOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorWEZBX1VOSVQgQ1hGQV9NZWFzdXJlbWVudDo6R2V0VW5pdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVW5pdCkgew0KKyAgaWYgKHdzVW5pdCA9PSBGWF9XU1RSQyhMIm1tIikpIHsNCisgICAgcmV0dXJuIFhGQV9VTklUX01tOw0KKyAgfSBlbHNlIGlmICh3c1VuaXQgPT0gRlhfV1NUUkMoTCJwdCIpKSB7DQorICAgIHJldHVybiBYRkFfVU5JVF9QdDsNCisgIH0gZWxzZSBpZiAod3NVbml0ID09IEZYX1dTVFJDKEwiaW4iKSkgew0KKyAgICByZXR1cm4gWEZBX1VOSVRfSW47DQorICB9IGVsc2UgaWYgKHdzVW5pdCA9PSBGWF9XU1RSQyhMImNtIikpIHsNCisgICAgcmV0dXJuIFhGQV9VTklUX0NtOw0KKyAgfSBlbHNlIGlmICh3c1VuaXQgPT0gRlhfV1NUUkMoTCJwYyIpKSB7DQorICAgIHJldHVybiBYRkFfVU5JVF9QYzsNCisgIH0gZWxzZSBpZiAod3NVbml0ID09IEZYX1dTVFJDKEwibXAiKSkgew0KKyAgICByZXR1cm4gWEZBX1VOSVRfTXA7DQorICB9IGVsc2UgaWYgKHdzVW5pdCA9PSBGWF9XU1RSQyhMImVtIikpIHsNCisgICAgcmV0dXJuIFhGQV9VTklUX0VtOw0KKyAgfSBlbHNlIGlmICh3c1VuaXQgPT0gRlhfV1NUUkMoTCIlIikpIHsNCisgICAgcmV0dXJuIFhGQV9VTklUX1BlcmNlbnQ7DQorICB9IGVsc2Ugew0KKyAgICByZXR1cm4gWEZBX1VOSVRfVW5rbm93bjsNCisgIH0NCit9DQorSUZYX1N0cmVhbSogWEZBX0NyZWF0ZVdpZGVUZXh0UmVhZChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NCdWZmZXIpIHsNCisgIHJldHVybiBGWF9ORVcgQ1hGQV9XaWRlVGV4dFJlYWQod3NCdWZmZXIpOw0KK30NCitDWEZBX1dpZGVUZXh0UmVhZDo6Q1hGQV9XaWRlVGV4dFJlYWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQnVmZmVyKQ0KKyAgICA6IG1fd3NCdWZmZXIod3NCdWZmZXIpLCBtX2lQb3NpdGlvbigwKSwgbV9pUmVmQ291bnQoMSkge30NCit2b2lkIENYRkFfV2lkZVRleHRSZWFkOjpSZWxlYXNlKCkgew0KKyAgaWYgKC0tbV9pUmVmQ291bnQgPCAxKSB7DQorICAgIGRlbGV0ZSB0aGlzOw0KKyAgfQ0KK30NCitJRlhfU3RyZWFtKiBDWEZBX1dpZGVUZXh0UmVhZDo6UmV0YWluKCkgew0KKyAgbV9pUmVmQ291bnQrKzsNCisgIHJldHVybiB0aGlzOw0KK30NCitGWF9EV09SRCBDWEZBX1dpZGVUZXh0UmVhZDo6R2V0QWNjZXNzTW9kZXMoKSBjb25zdCB7DQorICByZXR1cm4gRlhfU1RSRUFNQUNDRVNTX1JlYWQgfCBGWF9TVFJFQU1BQ0NFU1NfVGV4dDsNCit9DQoraW50MzJfdCBDWEZBX1dpZGVUZXh0UmVhZDo6R2V0TGVuZ3RoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCkgKiBzaXplb2YoRlhfV0NIQVIpOw0KK30NCitpbnQzMl90IENYRkFfV2lkZVRleHRSZWFkOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgew0KKyAgc3dpdGNoIChlU2Vlaykgew0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQmVnaW46DQorICAgICAgbV9pUG9zaXRpb24gPSBpT2Zmc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQ3VycmVudDoNCisgICAgICBtX2lQb3NpdGlvbiArPSBpT2Zmc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfRW5kOg0KKyAgICAgIG1faVBvc2l0aW9uID0gbV93c0J1ZmZlci5HZXRMZW5ndGgoKSArIGlPZmZzZXQ7DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAobV9pUG9zaXRpb24gPCAwKSB7DQorICAgIG1faVBvc2l0aW9uID0gMDsNCisgIH0NCisgIGlmIChtX2lQb3NpdGlvbiA+IG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCkpIHsNCisgICAgbV9pUG9zaXRpb24gPSBtX3dzQnVmZmVyLkdldExlbmd0aCgpOw0KKyAgfQ0KKyAgcmV0dXJuIEdldFBvc2l0aW9uKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRlVGV4dFJlYWQ6OkdldFBvc2l0aW9uKCkgew0KKyAgcmV0dXJuIG1faVBvc2l0aW9uICogc2l6ZW9mKEZYX1dDSEFSKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGVUZXh0UmVhZDo6SXNFT0YoKSBjb25zdCB7DQorICByZXR1cm4gbV9pUG9zaXRpb24gPj0gbV93c0J1ZmZlci5HZXRMZW5ndGgoKTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGVUZXh0UmVhZDo6UmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFT1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnN0KiBwQnl0ZVNpemUpIHsNCisgIGlmIChpTWF4TGVuZ3RoID4gbV93c0J1ZmZlci5HZXRMZW5ndGgoKSAtIG1faVBvc2l0aW9uKSB7DQorICAgIGlNYXhMZW5ndGggPSBtX3dzQnVmZmVyLkdldExlbmd0aCgpIC0gbV9pUG9zaXRpb247DQorICB9DQorICBGWFNZU193Y3NuY3B5KHBTdHIsIChjb25zdCBGWF9XQ0hBUiopbV93c0J1ZmZlciArIG1faVBvc2l0aW9uLCBpTWF4TGVuZ3RoKTsNCisgIG1faVBvc2l0aW9uICs9IGlNYXhMZW5ndGg7DQorICBiRU9TID0gSXNFT0YoKTsNCisgIHJldHVybiBpTWF4TGVuZ3RoOw0KK30NCitGWF9XT1JEIENYRkFfV2lkZVRleHRSZWFkOjpHZXRDb2RlUGFnZSgpIGNvbnN0IHsNCisgIHJldHVybiAoc2l6ZW9mKEZYX1dDSEFSKSA9PSAyKSA/IEZYX0NPREVQQUdFX1VURjE2TEUgOiBGWF9DT0RFUEFHRV9VVEYzMkxFOw0KK30NCitGWF9XT1JEIENYRkFfV2lkZVRleHRSZWFkOjpTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSkgew0KKyAgcmV0dXJuIEdldENvZGVQYWdlKCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuaAppbmRleCAxZThlNjRlLi40NmZmY2U5IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfYmFzaWNfaW1wLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2ltcC5oCkBAIC03LDY3ICs3LDYwIEBACiAjaWZuZGVmIF9YRkFfQkFTSUNfSU1QDQogI2RlZmluZSBfWEZBX0JBU0lDX0lNUA0KIHR5cGVkZWYgc3RydWN0IF9YRkFfTk9UU1VSRUFUVFJJQlVURSB7DQotICAgIFhGQV9FTEVNRU5UCQkJCWVFbGVtZW50Ow0KLSAgICBYRkFfQVRUUklCVVRFCQkJZUF0dHJpYnV0ZTsNCi0gICAgWEZBX0FUVFJJQlVURVRZUEUJCWVUeXBlOw0KLSAgICB2b2lkKgkJCQlwVmFsdWU7DQotfSBYRkFfTk9UU1VSRUFUVFJJQlVURSwgKiBYRkFfTFBOT1RTVVJFQVRUUklCVVRFOw0KLXR5cGVkZWYgWEZBX05PVFNVUkVBVFRSSUJVVEUgY29uc3QgKiBYRkFfTFBDTk9UU1VSRUFUVFJJQlVURTsNCi1YRkFfTFBDTk9UU1VSRUFUVFJJQlVURSBYRkFfR2V0Tm90c3VyZUF0dHJpYnV0ZShYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLCBYRkFfQVRUUklCVVRFVFlQRSBlVHlwZSA9IFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUpOw0KLWNsYXNzIENYRkFfV2lkZVRleHRSZWFkIDogcHVibGljIElGWF9TdHJlYW0NCi17DQotcHVibGljOg0KLSAgICBDWEZBX1dpZGVUZXh0UmVhZChjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NCdWZmZXIpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpOw0KLSAgICB2aXJ0dWFsIElGWF9TdHJlYW0qCQlSZXRhaW4oKTsNCisgIFhGQV9FTEVNRU5UIGVFbGVtZW50Ow0KKyAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlOw0KKyAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGU7DQorICB2b2lkKiBwVmFsdWU7DQorfSBYRkFfTk9UU1VSRUFUVFJJQlVURSwgKlhGQV9MUE5PVFNVUkVBVFRSSUJVVEU7DQordHlwZWRlZiBYRkFfTk9UU1VSRUFUVFJJQlVURSBjb25zdCogWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEU7DQorWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoDQorICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlID0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSk7DQorY2xhc3MgQ1hGQV9XaWRlVGV4dFJlYWQgOiBwdWJsaWMgSUZYX1N0cmVhbSB7DQorIHB1YmxpYzoNCisgIENYRkFfV2lkZVRleHRSZWFkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0J1ZmZlcik7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCBJRlhfU3RyZWFtKiBSZXRhaW4oKTsNCiANCi0gICAgdmlydHVhbCBGWF9EV09SRAkJCUdldEFjY2Vzc01vZGVzKCkgY29uc3Q7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldExlbmd0aCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCUdldFBvc2l0aW9uKCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0VPRigpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRBY2Nlc3NNb2RlcygpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRQb3NpdGlvbigpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgY29uc3Q7DQogDQotICAgIHZpcnR1YWwgaW50MzJfdAkJCVJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCVJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaU1heExlbmd0aCwgRlhfQk9PTCAmYkVPUywgaW50MzJfdCBjb25zdCAqcEJ5dGVTaXplID0gTlVMTCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCVdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJRmx1c2goKSB7fQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgeyByZXR1cm4gMDsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IFJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb25zdCogcEJ5dGVTaXplID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgV3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgV3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBGbHVzaCgpIHt9DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgeyByZXR1cm4gRkFMU0U7IH0NCiANCi0gICAgdmlydHVhbCBpbnQzMl90CQkJR2V0Qk9NKHVpbnQ4X3QgYm9tWzRdKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX1dPUkQJCQkJR2V0Q29kZVBhZ2UoKSBjb25zdDsNCi0gICAgdmlydHVhbCBGWF9XT1JECQkJCVNldENvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRCT00odWludDhfdCBib21bNF0pIGNvbnN0IHsgcmV0dXJuIDA7IH0NCisgIHZpcnR1YWwgRlhfV09SRCBHZXRDb2RlUGFnZSgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9XT1JEIFNldENvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlKTsNCiANCi0gICAgdmlydHVhbCB2b2lkCQkJCUxvY2soKSB7fQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJVW5sb2NrKCkge30NCisgIHZpcnR1YWwgdm9pZCBMb2NrKCkge30NCisgIHZpcnR1YWwgdm9pZCBVbmxvY2soKSB7fQ0KIA0KLSAgICB2aXJ0dWFsIElGWF9TdHJlYW0qCQlDcmVhdGVTaGFyZWRTdHJlYW0oRlhfRFdPUkQgZHdBY2Nlc3MsIGludDMyX3QgaU9mZnNldCwgaW50MzJfdCBpTGVuZ3RoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KKyAgdmlydHVhbCBJRlhfU3RyZWFtKiBDcmVhdGVTaGFyZWRTdHJlYW0oRlhfRFdPUkQgZHdBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQogDQotICAgIENGWF9XaWRlU3RyaW5nCQkJCUdldFNyY1RleHQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV93c0J1ZmZlcjsNCi0gICAgfQ0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQkJbV93c0J1ZmZlcjsNCi0gICAgaW50MzJfdAkJCQkJbV9pUG9zaXRpb247DQotICAgIGludDMyX3QJCQkJCW1faVJlZkNvdW50Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0U3JjVGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fd3NCdWZmZXI7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0J1ZmZlcjsNCisgIGludDMyX3QgbV9pUG9zaXRpb247DQorICBpbnQzMl90IG1faVJlZkNvdW50Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuY3BwCmluZGV4IGRiNDRmNTMuLjVlMmIzMWEgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhZGVzY3JpcHRpb25faW1wLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YWRlc2NyaXB0aW9uX2ltcC5jcHAKQEAgLTE3LDEwMCArMTcsMTExIEBACiAjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KICNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQogI2RlZmluZSBYRkFfSEFTSENPREVfR3JvdXAgMHhmN2Y3NWZjZA0KLWNsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9EREdyb3VwDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldEZpcnN0Q2hpbGQoQ1hGQV9Ob2RlKiBwRERHcm91cE5vZGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwRERHcm91cE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUoWEZBX0hBU0hDT0RFX0dyb3VwKTsNCi0gICAgfQ0KLSAgICBzdGF0aWMgaW5saW5lIENYRkFfTm9kZSogR2V0TmV4dFNpYmxpbmcoQ1hGQV9Ob2RlKiBwRERHcm91cE5vZGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwRERHcm91cE5vZGUtPkdldE5leHRTYW1lTmFtZVNpYmxpbmcoWEZBX0hBU0hDT0RFX0dyb3VwKTsNCi0gICAgfQ0KLSAgICBzdGF0aWMgaW5saW5lIENYRkFfTm9kZSogR2V0UGFyZW50KENYRkFfTm9kZSogcERER3JvdXBOb2RlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcERER3JvdXBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgfQ0KK2NsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9EREdyb3VwIHsNCisgcHVibGljOg0KKyAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldEZpcnN0Q2hpbGQoQ1hGQV9Ob2RlKiBwRERHcm91cE5vZGUpIHsNCisgICAgcmV0dXJuIHBEREdyb3VwTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShYRkFfSEFTSENPREVfR3JvdXApOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldE5leHRTaWJsaW5nKENYRkFfTm9kZSogcERER3JvdXBOb2RlKSB7DQorICAgIHJldHVybiBwRERHcm91cE5vZGUtPkdldE5leHRTYW1lTmFtZVNpYmxpbmcoWEZBX0hBU0hDT0RFX0dyb3VwKTsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Ob2RlKiBHZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwRERHcm91cE5vZGUpIHsNCisgICAgcmV0dXJuIHBEREdyb3VwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICB9DQogfTsNCi12b2lkIFhGQV9EYXRhRGVzY3JpcHRpb25fVXBkYXRlRGF0YVJlbGF0aW9uKENYRkFfTm9kZSogcERhdGFOb2RlLCBDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KHBEYXRhRGVzY3JpcHRpb25Ob2RlKTsNCi0gICAgZm9yKENYRkFfTm9kZSogcERhdGFDaGlsZCA9IHBEYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwRGF0YUNoaWxkOyBwRGF0YUNoaWxkID0gcERhdGFDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IHBEYXRhQ2hpbGQtPkdldE5hbWVIYXNoKCk7DQotICAgICAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBEYXRhQ2hpbGQtPkdldENsYXNzSUQoKTsNCi0gICAgICAgIGlmKCFkd05hbWVIYXNoKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0RER3JvdXA+IHNJdGVyYXRvcihwRGF0YURlc2NyaXB0aW9uTm9kZSk7DQotICAgICAgICBmb3IgKENYRkFfTm9kZSogcERER3JvdXBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcERER3JvdXBOb2RlOyBwRERHcm91cE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgaWYocERER3JvdXBOb2RlICE9IHBEYXRhRGVzY3JpcHRpb25Ob2RlKSB7DQotICAgICAgICAgICAgICAgIGlmKHBEREdyb3VwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0RhdGFHcm91cCkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2U7DQotICAgICAgICAgICAgICAgIGlmKCFwRERHcm91cE5vZGUtPlRyeU5hbWVzcGFjZSh3c05hbWVzcGFjZSkgfHwgd3NOYW1lc3BhY2UgIT0gRlhfV1NUUkMoTCJodHRwOi8vbnMuYWRvYmUuY29tL2RhdGEtZGVzY3JpcHRpb24vIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcERETm9kZSA9IHBEREdyb3VwTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShkd05hbWVIYXNoKTsNCi0gICAgICAgICAgICBpZighcERETm9kZSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYocERETm9kZS0+R2V0Q2xhc3NJRCgpICE9IGVUeXBlKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwRGF0YUNoaWxkLT5TZXREYXRhRGVzY3JpcHRpb25Ob2RlKHBERE5vZGUpOw0KLSAgICAgICAgICAgIFhGQV9EYXRhRGVzY3JpcHRpb25fVXBkYXRlRGF0YVJlbGF0aW9uKHBEYXRhQ2hpbGQsIHBERE5vZGUpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KK3ZvaWQgWEZBX0RhdGFEZXNjcmlwdGlvbl9VcGRhdGVEYXRhUmVsYXRpb24oQ1hGQV9Ob2RlKiBwRGF0YU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKSB7DQorICBGWFNZU19hc3NlcnQocERhdGFEZXNjcmlwdGlvbk5vZGUpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBEYXRhQ2hpbGQgPSBwRGF0YU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgcERhdGFDaGlsZDsNCisgICAgICAgcERhdGFDaGlsZCA9IHBEYXRhQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IHBEYXRhQ2hpbGQtPkdldE5hbWVIYXNoKCk7DQorICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcERhdGFDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoIWR3TmFtZUhhc2gpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KKyAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0RER3JvdXA+DQorICAgICAgICBzSXRlcmF0b3IocERhdGFEZXNjcmlwdGlvbk5vZGUpOw0KKyAgICBmb3IgKENYRkFfTm9kZSogcERER3JvdXBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcERER3JvdXBOb2RlOw0KKyAgICAgICAgIHBEREdyb3VwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICBpZiAocERER3JvdXBOb2RlICE9IHBEYXRhRGVzY3JpcHRpb25Ob2RlKSB7DQorICAgICAgICBpZiAocERER3JvdXBOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2U7DQorICAgICAgICBpZiAoIXBEREdyb3VwTm9kZS0+VHJ5TmFtZXNwYWNlKHdzTmFtZXNwYWNlKSB8fA0KKyAgICAgICAgICAgIHdzTmFtZXNwYWNlICE9IEZYX1dTVFJDKEwiaHR0cDovL25zLmFkb2JlLmNvbS9kYXRhLWRlc2NyaXB0aW9uLyIpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBERE5vZGUgPSBwRERHcm91cE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUoZHdOYW1lSGFzaCk7DQorICAgICAgaWYgKCFwREROb2RlKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKHBERE5vZGUtPkdldENsYXNzSUQoKSAhPSBlVHlwZSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHBEYXRhQ2hpbGQtPlNldERhdGFEZXNjcmlwdGlvbk5vZGUocERETm9kZSk7DQorICAgICAgWEZBX0RhdGFEZXNjcmlwdGlvbl9VcGRhdGVEYXRhUmVsYXRpb24ocERhdGFDaGlsZCwgcERETm9kZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCiB9DQotQ1hGQV9Ob2RlKiBYRkFfRGF0YURlc2NyaXB0aW9uX01heWJlQ3JlYXRlRGF0YU5vZGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBEYXRhUGFyZW50LCBYRkFfRUxFTUVOVCBlTm9kZVR5cGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKQ0KLXsNCi0gICAgaWYoIXBEYXRhUGFyZW50KSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUgKnBQYXJlbnRERE5vZGUgPSBwRGF0YVBhcmVudC0+R2V0RGF0YURlc2NyaXB0aW9uTm9kZSgpOw0KLSAgICBpZighcFBhcmVudERETm9kZSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlICpwRGF0YU5vZGUgPSBwRG9jdW1lbnQtPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgZU5vZGVUeXBlKTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwRGF0YU5vZGUpOw0KLSAgICAgICAgcERhdGFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQotICAgICAgICBwRGF0YU5vZGUtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7DQotICAgICAgICBwRGF0YVBhcmVudC0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlKTsNCi0gICAgICAgIHBEYXRhTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCi0gICAgICAgIHJldHVybiBwRGF0YU5vZGU7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0RER3JvdXA+IHNJdGVyYXRvcihwUGFyZW50REROb2RlKTsNCi0gICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwRERHcm91cE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwRERHcm91cE5vZGU7IHBEREdyb3VwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgICAgICBpZihwRERHcm91cE5vZGUgIT0gcFBhcmVudERETm9kZSkgew0KLSAgICAgICAgICAgICAgICBpZihwRERHcm91cE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9EYXRhR3JvdXApIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZXNwYWNlOw0KLSAgICAgICAgICAgICAgICBpZighcERER3JvdXBOb2RlLT5UcnlOYW1lc3BhY2Uod3NOYW1lc3BhY2UpIHx8IHdzTmFtZXNwYWNlICE9IEZYX1dTVFJDKEwiaHR0cDovL25zLmFkb2JlLmNvbS9kYXRhLWRlc2NyaXB0aW9uLyIpKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBERE5vZGUgPSBwRERHcm91cE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUod3NOYW1lKTsNCi0gICAgICAgICAgICBpZighcERETm9kZSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYocERETm9kZS0+R2V0Q2xhc3NJRCgpICE9IGVOb2RlVHlwZSkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1hGQV9Ob2RlICpwRGF0YU5vZGUgPSBwRG9jdW1lbnQtPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgZU5vZGVUeXBlKTsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQocERhdGFOb2RlKTsNCi0gICAgICAgICAgICBwRGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCi0gICAgICAgICAgICBwRGF0YU5vZGUtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7DQotICAgICAgICAgICAgaWYoZU5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSAmJiBwREROb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMpID09IFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhKSB7DQotICAgICAgICAgICAgICAgIHBEYXRhTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBEYXRhUGFyZW50LT5JbnNlcnRDaGlsZChwRGF0YU5vZGUpOw0KLSAgICAgICAgICAgIHBEYXRhTm9kZS0+U2V0RGF0YURlc2NyaXB0aW9uTm9kZShwREROb2RlKTsNCi0gICAgICAgICAgICBwRGF0YU5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkLCBUUlVFLCBGQUxTRSk7DQotICAgICAgICAgICAgcmV0dXJuIHBEYXRhTm9kZTsNCitDWEZBX05vZGUqIFhGQV9EYXRhRGVzY3JpcHRpb25fTWF5YmVDcmVhdGVEYXRhTm9kZSgNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICBDWEZBX05vZGUqIHBEYXRhUGFyZW50LA0KKyAgICBYRkFfRUxFTUVOVCBlTm9kZVR5cGUsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSB7DQorICBpZiAoIXBEYXRhUGFyZW50KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUGFyZW50REROb2RlID0gcERhdGFQYXJlbnQtPkdldERhdGFEZXNjcmlwdGlvbk5vZGUoKTsNCisgIGlmICghcFBhcmVudERETm9kZSkgew0KKyAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9DQorICAgICAgICBwRG9jdW1lbnQtPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgZU5vZGVUeXBlKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBEYXRhTm9kZSk7DQorICAgIHBEYXRhTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICBwRGF0YU5vZGUtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7DQorICAgIHBEYXRhUGFyZW50LT5JbnNlcnRDaGlsZChwRGF0YU5vZGUpOw0KKyAgICBwRGF0YU5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkLCBUUlVFLCBGQUxTRSk7DQorICAgIHJldHVybiBwRGF0YU5vZGU7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0RER3JvdXA+DQorICAgICAgICBzSXRlcmF0b3IocFBhcmVudERETm9kZSk7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwRERHcm91cE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwRERHcm91cE5vZGU7DQorICAgICAgICAgcERER3JvdXBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgIGlmIChwRERHcm91cE5vZGUgIT0gcFBhcmVudERETm9kZSkgew0KKyAgICAgICAgaWYgKHBEREdyb3VwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0RhdGFHcm91cCkgew0KKyAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCi0gICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2U7DQorICAgICAgICBpZiAoIXBEREdyb3VwTm9kZS0+VHJ5TmFtZXNwYWNlKHdzTmFtZXNwYWNlKSB8fA0KKyAgICAgICAgICAgIHdzTmFtZXNwYWNlICE9IEZYX1dTVFJDKEwiaHR0cDovL25zLmFkb2JlLmNvbS9kYXRhLWRlc2NyaXB0aW9uLyIpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBERE5vZGUgPSBwRERHcm91cE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUod3NOYW1lKTsNCisgICAgICBpZiAoIXBERE5vZGUpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAocERETm9kZS0+R2V0Q2xhc3NJRCgpICE9IGVOb2RlVHlwZSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0NCisgICAgICAgICAgcERvY3VtZW50LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIGVOb2RlVHlwZSk7DQorICAgICAgRlhTWVNfYXNzZXJ0KHBEYXRhTm9kZSk7DQorICAgICAgcERhdGFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICAgICAgcERhdGFOb2RlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgIGlmIChlTm9kZVR5cGUgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlICYmDQorICAgICAgICAgIHBERE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9Db250YWlucykgPT0NCisgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhKSB7DQorICAgICAgICBwRGF0YU5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9Db250YWlucywgWEZBX0FUVFJJQlVURUVOVU1fTWV0YURhdGEpOw0KKyAgICAgIH0NCisgICAgICBwRGF0YVBhcmVudC0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlKTsNCisgICAgICBwRGF0YU5vZGUtPlNldERhdGFEZXNjcmlwdGlvbk5vZGUocERETm9kZSk7DQorICAgICAgcERhdGFOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgIHJldHVybiBwRGF0YU5vZGU7DQogICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhZGVzY3JpcHRpb25faW1wLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YWRlc2NyaXB0aW9uX2ltcC5oCmluZGV4IDVhZTlmY2MuLmU2MTU2NjQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhZGVzY3JpcHRpb25faW1wLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuaApAQCAtNiw2ICs2LDExIEBACiANCiAjaWZuZGVmIF9YRkFfRE9DVU1FTlRfREFUQURFU0NSSVBUSU9OX0lNUF9IXw0KICNkZWZpbmUgX1hGQV9ET0NVTUVOVF9EQVRBREVTQ1JJUFRJT05fSU1QX0hfDQotdm9pZAkJWEZBX0RhdGFEZXNjcmlwdGlvbl9VcGRhdGVEYXRhUmVsYXRpb24oQ1hGQV9Ob2RlKiBwRGF0YU5vZGUsIENYRkFfTm9kZSogcERhdGFEZXNjcmlwdGlvbk5vZGUpOw0KLUNYRkFfTm9kZSoJWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwRGF0YVBhcmVudCwgWEZBX0VMRU1FTlQgZU5vZGVUeXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSk7DQordm9pZCBYRkFfRGF0YURlc2NyaXB0aW9uX1VwZGF0ZURhdGFSZWxhdGlvbihDWEZBX05vZGUqIHBEYXRhTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFEZXNjcmlwdGlvbk5vZGUpOw0KK0NYRkFfTm9kZSogWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKA0KKyAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgIENYRkFfTm9kZSogcERhdGFQYXJlbnQsDQorICAgIFhGQV9FTEVNRU5UIGVOb2RlVHlwZSwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpOw0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuY3BwCmluZGV4IDRlOWU4ZWQuLjJkOTMyYTAgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmNwcApAQCAtMjEsOTc1ICsyMSwxMjE1IEBACiAjaW5jbHVkZSAieGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuaCINCiAjaW5jbHVkZSAieGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmgiDQogI2luY2x1ZGUgInhmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgiDQotc3RhdGljIEZYX0JPT0wgWEZBX0dldE9jY3VySW5mbyhDWEZBX05vZGUqIHBPY2N1ck5vZGUsIGludDMyX3QmIGlNaW4sIGludDMyX3QmIGlNYXgsIGludDMyX3QmIGlJbml0KQ0KLXsNCi0gICAgaWYoIXBPY2N1ck5vZGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDWEZBX09jY3VyIG9jY3VyKHBPY2N1ck5vZGUpOw0KLSAgICByZXR1cm4gb2NjdXIuR2V0T2NjdXJJbmZvKGlNaW4sIGlNYXgsIGlJbml0KTsNCitzdGF0aWMgRlhfQk9PTCBYRkFfR2V0T2NjdXJJbmZvKENYRkFfTm9kZSogcE9jY3VyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWF4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUluaXQpIHsNCisgIGlmICghcE9jY3VyTm9kZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX09jY3VyIG9jY3VyKHBPY2N1ck5vZGUpOw0KKyAgcmV0dXJuIG9jY3VyLkdldE9jY3VySW5mbyhpTWluLCBpTWF4LCBpSW5pdCk7DQogfQ0KIHN0cnVjdCBYRkFfRGF0YU1lcmdlX1JlY3Vyc2VSZWNvcmQgew0KLSAgICBDWEZBX05vZGUgKnBUZW1wbGF0ZUNoaWxkOw0KLSAgICBDWEZBX05vZGUgKnBEYXRhQ2hpbGQ7DQorICBDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkOw0KKyAgQ1hGQV9Ob2RlKiBwRGF0YUNoaWxkOw0KIH07DQotc3RhdGljIENYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX0NyZWF0ZUNoaWxkKENYRkFfTm9kZSogcFZhbHVlTm9kZSwgWEZBX0VMRU1FTlQgaVR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlICogcENoaWxkTm9kZSA9IHBWYWx1ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgaWYgKCFwQ2hpbGROb2RlKSB7DQotICAgICAgICBpZiAoaVR5cGUgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfQ3JlYXRlQ2hpbGQoDQorICAgIENYRkFfTm9kZSogcFZhbHVlTm9kZSwNCisgICAgWEZBX0VMRU1FTlQgaVR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQorICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwVmFsdWVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICBpZiAoIXBDaGlsZE5vZGUpIHsNCisgICAgaWYgKGlUeXBlID09IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcENoaWxkTm9kZSA9IHBWYWx1ZU5vZGUtPkdldFByb3BlcnR5KDAsIGlUeXBlKTsNCisgIH0NCisgIHJldHVybiBwQ2hpbGROb2RlOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfTWF0Y2hOb25lQ3JlYXRlQ2hpbGQoDQorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gcEZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICBGWFNZU19hc3NlcnQocFdpZGdldERhdGEpOw0KKyAgWEZBX0VMRU1FTlQgZVVJVHlwZSA9IHBXaWRnZXREYXRhLT5HZXRVSVR5cGUoKTsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudCgNCisgICAgQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlLA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LA0KKyAgICBYRkFfRUxFTUVOVCBpVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCisgIGlmICghcFZhbHVlTm9kZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWFNZU19hc3NlcnQocFZhbHVlTm9kZS0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KKyAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0NCisgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfQ3JlYXRlQ2hpbGQocFZhbHVlTm9kZSwgaVR5cGUpOw0KKyAgaWYgKCFwQ2hpbGROb2RlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFhGQV9PQkpFQ1RUWVBFIG9iamVjdFR5cGUgPSBwQ2hpbGROb2RlLT5HZXRPYmplY3RUeXBlKCk7DQorICBzd2l0Y2ggKG9iamVjdFR5cGUpIHsNCisgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZTogew0KKyAgICAgIENYRkFfTm9kZSogcENvbnRlbnRSYXdEYXRhTm9kZSA9DQorICAgICAgICAgIHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICBpZiAoIXBDb250ZW50UmF3RGF0YU5vZGUpIHsNCisgICAgICAgIFhGQV9FTEVNRU5UIGVsZW1lbnQgPSBYRkFfRUxFTUVOVF9TaGFycHRleHQ7DQorICAgICAgICBpZiAocENoaWxkTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgICAgICBwQ2hpbGROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsNCisgICAgICAgICAgaWYgKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L2h0bWwiKSkpIHsNCisgICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTDsNCisgICAgICAgICAgfSBlbHNlIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC94bWwiKSkpIHsNCisgICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB4bWw7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCi0gICAgICAgIHBDaGlsZE5vZGUgPSBwVmFsdWVOb2RlLT5HZXRQcm9wZXJ0eSgwLCBpVHlwZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBDaGlsZE5vZGU7DQorICAgICAgICBwQ29udGVudFJhd0RhdGFOb2RlID0gcENoaWxkTm9kZS0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoZWxlbWVudCk7DQorICAgICAgICBwQ2hpbGROb2RlLT5JbnNlcnRDaGlsZChwQ29udGVudFJhd0RhdGFOb2RlKTsNCisgICAgICB9DQorICAgICAgcENvbnRlbnRSYXdEYXRhTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb250ZW50KTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlQzoNCisgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZToNCisgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlVjogew0KKyAgICAgIHBDaGlsZE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29udGVudCk7DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCi1zdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfTWF0Y2hOb25lQ3JlYXRlQ2hpbGQoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpDQotew0KLSAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gcEZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCk7DQotICAgIEZYU1lTX2Fzc2VydChwV2lkZ2V0RGF0YSk7DQotICAgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSBwV2lkZ2V0RGF0YS0+R2V0VUlUeXBlKCk7DQotfQ0KLXN0YXRpYyBGWF9CT09MIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LCBYRkFfRUxFTUVOVCBpVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV04pDQotew0KLSAgICBpZiAoIXBWYWx1ZU5vZGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQocFZhbHVlTm9kZS0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KLSAgICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfQ3JlYXRlQ2hpbGQocFZhbHVlTm9kZSwgaVR5cGUpOw0KLSAgICBpZiAoIXBDaGlsZE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBYRkFfT0JKRUNUVFlQRSBvYmplY3RUeXBlID0gcENoaWxkTm9kZS0+R2V0T2JqZWN0VHlwZSgpOw0KLSAgICBzd2l0Y2ggKG9iamVjdFR5cGUpIHsNCi0gICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGU6IHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwQ29udGVudFJhd0RhdGFOb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgICAgICBpZiAoIXBDb250ZW50UmF3RGF0YU5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVsZW1lbnQgPSBYRkFfRUxFTUVOVF9TaGFycHRleHQ7DQotICAgICAgICAgICAgICAgICAgICBpZiAocENoaWxkTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQvaHRtbCIpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB4bWw7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcENvbnRlbnRSYXdEYXRhTm9kZSA9IHBDaGlsZE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKGVsZW1lbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgcENoaWxkTm9kZS0+SW5zZXJ0Q2hpbGQocENvbnRlbnRSYXdEYXRhTm9kZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcENvbnRlbnRSYXdEYXRhTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb250ZW50KTsNCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEYXRhVG9Gb3JtID0gVFJVRSkgew0KKyAgcEZvcm1Ob2RlLT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgcERhdGFOb2RlKTsNCisgIHBEYXRhTm9kZS0+QWRkQmluZEl0ZW0ocEZvcm1Ob2RlKTsNCisgIFhGQV9FTEVNRU5UIGVDbGFzcyA9IHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGVDbGFzcyAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJiBlQ2xhc3MgIT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBwRm9ybU5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgIEZYU1lTX2Fzc2VydChwV2lkZ2V0RGF0YSk7DQorICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRTsNCisgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSBwV2lkZ2V0RGF0YS0+R2V0VUlUeXBlKCk7DQorICBDWEZBX1ZhbHVlIGRlZlZhbHVlID0gcEZvcm1Ob2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICBpZiAoIWJEYXRhVG9Gb3JtKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0ZWRWYWx1ZTsNCisgICAgc3dpdGNoIChlVUlUeXBlKSB7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQ6IHsNCisgICAgICAgIENYRkFfSW1hZ2UgaW1hZ2UgPSBkZWZWYWx1ZS5HZXRJbWFnZSgpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSHJlZjsNCisgICAgICAgIGlmIChpbWFnZSkgew0KKyAgICAgICAgICBpbWFnZS5HZXRDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgICBpbWFnZS5HZXRDb250ZW50VHlwZSh3c0NvbnRlbnRUeXBlKTsNCisgICAgICAgICAgaW1hZ2UuR2V0SHJlZih3c0hyZWYpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRGF0YUVsZW1lbnQgPQ0KKyAgICAgICAgICAgIChJRkRFX1hNTEVsZW1lbnQqKShwRGF0YU5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCkpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxEYXRhRWxlbWVudCk7DQorICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQorICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQorICAgICAgICBwRGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KKyAgICAgICAgaWYgKCF3c0hyZWYuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIHBYTUxEYXRhRWxlbWVudC0+U2V0U3RyaW5nKEZYX1dTVFJDKEwiaHJlZiIpLCB3c0hyZWYpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0Og0KKyAgICAgICAgZGVmVmFsdWUuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgICBpZiAocFdpZGdldERhdGEtPkdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1NlbFRleHRBcnJheTsNCisgICAgICAgICAgcFdpZGdldERhdGEtPkdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1NlbFRleHRBcnJheSk7DQorICAgICAgICAgIGludDMyX3QgaVNpemUgPSB3c1NlbFRleHRBcnJheS5HZXRTaXplKCk7DQorICAgICAgICAgIGlmIChpU2l6ZSA+PSAxKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBOVUxMOw0KKyAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFZhbHVlWE1MTm9kZSA9IE5VTEw7DQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgICAgICAgICAgcFZhbHVlID0gcERhdGFOb2RlLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KKyAgICAgICAgICAgICAgcFZhbHVlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwidmFsdWUiKSk7DQorICAgICAgICAgICAgICBwVmFsdWVYTUxOb2RlID0gcFZhbHVlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICAgICAgcERhdGFOb2RlLT5JbnNlcnRDaGlsZChwVmFsdWUpOw0KKyAgICAgICAgICAgICAgcFZhbHVlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1NlbFRleHRBcnJheVtpXSk7DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlQzoNCi0gICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGU6DQotICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVWOiB7DQotICAgICAgICAgICAgICAgIHBDaGlsZE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29udGVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1zdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKENYRkFfTm9kZSogcEZvcm1Ob2RlLCBDWEZBX05vZGUqIHBEYXRhTm9kZSwgRlhfQk9PTCBiRGF0YVRvRm9ybSA9IFRSVUUpDQotew0KLSAgICBwRm9ybU5vZGUtPlNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBwRGF0YU5vZGUpOw0KLSAgICBwRGF0YU5vZGUtPkFkZEJpbmRJdGVtKHBGb3JtTm9kZSk7DQotICAgIFhGQV9FTEVNRU5UIGVDbGFzcyA9IHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAoZUNsYXNzICE9IFhGQV9FTEVNRU5UX0ZpZWxkICYmIGVDbGFzcyAhPSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gcEZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCk7DQotICAgIEZYU1lTX2Fzc2VydChwV2lkZ2V0RGF0YSk7DQotICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFOw0KLSAgICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gcFdpZGdldERhdGEtPkdldFVJVHlwZSgpOw0KLSAgICBDWEZBX1ZhbHVlIGRlZlZhbHVlID0gcEZvcm1Ob2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQotICAgIGlmKCFiRGF0YVRvRm9ybSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0ZWRWYWx1ZTsNCi0gICAgICAgIHN3aXRjaCAoZVVJVHlwZSkgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0OiB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX0ltYWdlIGltYWdlID0gZGVmVmFsdWUuR2V0SW1hZ2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hyZWY7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5HZXRDb250ZW50KHdzVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLkdldENvbnRlbnRUeXBlKHdzQ29udGVudFR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLkdldEhyZWYod3NIcmVmKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCAqcFhNTERhdGFFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCAqKShwRGF0YU5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxEYXRhRWxlbWVudCk7DQotICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCF3c0hyZWYuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFhNTERhdGFFbGVtZW50LT5TZXRTdHJpbmcoRlhfV1NUUkMoTCJocmVmIiksIHdzSHJlZik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0Og0KLSAgICAgICAgICAgICAgICBkZWZWYWx1ZS5HZXRDaGlsZFZhbHVlQ29udGVudCh3c1ZhbHVlKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzU2VsVGV4dEFycmF5Ow0KLSAgICAgICAgICAgICAgICAgICAgcFdpZGdldERhdGEtPkdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1NlbFRleHRBcnJheSk7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTaXplID0gd3NTZWxUZXh0QXJyYXkuR2V0U2l6ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlTaXplID49IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBWYWx1ZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlICpwVmFsdWVYTUxOb2RlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZSA9IHBEYXRhTm9kZS0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwidmFsdWUiKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZVhNTE5vZGUgPSBwVmFsdWUtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZS0+SW5zZXJ0Q2hpbGQocFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1NlbFRleHRBcnJheVtpXSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUgKnBYTUxOb2RlID0gcERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGUpLT5TZXRTdHJpbmcoRlhfV1NUUkMoTCJ4ZmE6ZGF0YU5vZGUiKSwgRlhfV1NUUkMoTCJkYXRhR3JvdXAiKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjoNCi0gICAgICAgICAgICAgICAgZGVmVmFsdWUuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcFdpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KLSAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOiB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBDaGVja2VkID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVWYWx1ZVR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOOw0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIDsgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocENoaWxkLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVmFsdWUgdmFsdWVDaGlsZChwVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQ2hpbGQuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBJdGVtcyA9IHBDaGlsZC0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcEl0ZW1zKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwVGV4dCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGV4dC0+VHJ5Q29udGVudCh3c0NvbnRlbnQpICYmICh3c0NvbnRlbnQgPT0gd3NWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrZWQgPSBwQ2hpbGQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYWx1ZVR5cGUgPSBwVGV4dC0+R2V0Q2xhc3NJRCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0Zvcm1hdGVkVmFsdWUgPSB3c1ZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb250ZW50KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwQ2hlY2tlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcENoaWxkID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKCA7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDaGlsZCA9PSBwQ2hlY2tlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDaGlsZC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZSA9IHBDaGlsZC0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEl0ZW1zID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcyA/IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpIDogTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFRleHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGV4dCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGV4dC0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KHBWYWx1ZSwgd3NDb250ZW50LCBYRkFfRUxFTUVOVF9UZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0OiB7DQotICAgICAgICAgICAgICAgICAgICBkZWZWYWx1ZS5HZXRDaGlsZFZhbHVlQ29udGVudCh3c1ZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+Tm9ybWFsaXplTnVtU3RyKHdzVmFsdWUsIHdzT3V0cHV0KTsNCi0gICAgICAgICAgICAgICAgICAgIHdzVmFsdWUgPSB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gcEZvcm1Ob2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KHBWYWx1ZSwgd3NWYWx1ZSwgWEZBX0VMRU1FTlRfRmxvYXQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGRlZlZhbHVlLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOw0KLSAgICAgICAgICAgICAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgcERhdGFOb2RlLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzWE1MVmFsdWU7DQotICAgICAgICBwRGF0YU5vZGUtPlRyeUNvbnRlbnQod3NYTUxWYWx1ZSk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05vcm1haWxpemVWYWx1ZTsNCi0gICAgICAgIHBXaWRnZXREYXRhLT5HZXROb3JtYWxpemVEYXRhVmFsdWUod3NYTUxWYWx1ZSwgd3NOb3JtYWlsaXplVmFsdWUpOw0KLSAgICAgICAgcERhdGFOb2RlLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c05vcm1haWxpemVWYWx1ZSwgd3NYTUxWYWx1ZSk7DQotICAgICAgICBzd2l0Y2ggKGVVSVR5cGUpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDogew0KLSAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudChkZWZWYWx1ZS5HZXROb2RlKCksIHdzTm9ybWFpbGl6ZVZhbHVlLCBYRkFfRUxFTUVOVF9JbWFnZSk7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX0ltYWdlIGltYWdlID0gZGVmVmFsdWUuR2V0SW1hZ2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCAqcFhNTERhdGFFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCAqKShwRGF0YU5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwWE1MRGF0YUVsZW1lbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIcmVmOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBYTUxEYXRhRWxlbWVudC0+R2V0U3RyaW5nKEwieGZhOmNvbnRlbnRUeXBlIiwgd3NDb250ZW50VHlwZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3c0NvbnRlbnRUeXBlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5TZXRDb250ZW50VHlwZSh3c0NvbnRlbnRUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcFhNTERhdGFFbGVtZW50LT5HZXRTdHJpbmcoTCJocmVmIiwgd3NIcmVmKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdzSHJlZi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UuU2V0SHJlZih3c0hyZWYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3Q6DQotICAgICAgICAgICAgICAgIGlmIChwV2lkZ2V0RGF0YS0+R2V0Q2hvaWNlTGlzdE9wZW4oKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgaXRlbXM7DQotICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPkdldE5vZGVMaXN0KGl0ZW1zKTsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50cyA9IGl0ZW1zLkdldFNpemUoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpQ291bnRzID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzTm9ybWFpbGl6ZVZhbHVlLkVtcHR5KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NJdGVtOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudHM7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS0+VHJ5Q29udGVudCh3c0l0ZW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0l0ZW0gPSAoaUNvdW50cyA9PSAxKSA/IHdzSXRlbSA6IHdzSXRlbSArIEZYX1dTVFJDKEwiXG4iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NOb3JtYWlsaXplVmFsdWUgKz0gd3NJdGVtOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V4RGF0YSBleERhdGEgPSBkZWZWYWx1ZS5HZXRFeERhdGEoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQoZXhEYXRhICE9IE5VTEwpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4RGF0YS5TZXRDb250ZW50VHlwZSgoaUNvdW50cyA9PSAxKSA/IEZYX1dTVFJDKEwidGV4dC9wbGFpbiIpIDogRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1haWxpemVWYWx1ZSwgWEZBX0VMRU1FTlRfRXhEYXRhKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1haWxpemVWYWx1ZSwgWEZBX0VMRU1FTlRfVGV4dCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjoNCi0gICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudChkZWZWYWx1ZS5HZXROb2RlKCksIHdzTm9ybWFpbGl6ZVZhbHVlLCBYRkFfRUxFTUVOVF9UZXh0KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6IHsNCi0gICAgICAgICAgICAgICAgICAgIHBXaWRnZXREYXRhLT5TZXRTZWxlY3RlZE1lbWJlckJ5VmFsdWUod3NOb3JtYWlsaXplVmFsdWUsIGJOb3RpZnksIEZBTFNFLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQ6DQotICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1haWxpemVWYWx1ZSwgWEZBX0VMRU1FTlRfRGF0ZVRpbWUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0OiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7DQotICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0UGljdHVyZUNvbnRlbnQod3NQaWN0dXJlLCBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+Tm9ybWFsaXplTnVtU3RyKHdzTm9ybWFpbGl6ZVZhbHVlLCB3c091dHB1dCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NOb3JtYWlsaXplVmFsdWUgPSB3c091dHB1dDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1haWxpemVWYWx1ZSwgWEZBX0VMRU1FTlRfRmxvYXQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQmFyY29kZToNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0J1dHRvbjoNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdDoNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1NpZ25hdHVyZToNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHRFZGl0Og0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1haWxpemVWYWx1ZSwgWEZBX0VMRU1FTlRfVGV4dCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXN0YXRpYyBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfR2V0R2xvYmFsQmluZGluZyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIEZYX0RXT1JEIGR3TmFtZUhhc2gpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCi0gICAgcERvY3VtZW50LT5tX3JnR2xvYmFsQmluZGluZy5Mb29rdXAoZHdOYW1lSGFzaCwgcE5vZGUpOw0KLSAgICByZXR1cm4gcE5vZGU7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9EYXRhTWVyZ2VfUmVnaXN0ZXJHbG9iYWxCaW5kaW5nKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgRlhfRFdPUkQgZHdOYW1lSGFzaCwgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUpDQotew0KLSAgICBwRG9jdW1lbnQtPm1fcmdHbG9iYWxCaW5kaW5nLlNldEF0KGR3TmFtZUhhc2gsIHBEYXRhTm9kZSk7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9EYXRhTWVyZ2VfQ2xlYXJHbG9iYWxCaW5kaW5nKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCi17DQotICAgIHBEb2N1bWVudC0+bV9yZ0dsb2JhbEJpbmRpbmcuUmVtb3ZlQWxsKCk7DQotfQ0KLXN0YXRpYyBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfU2NvcGVNYXRjaEdsb2JhbEJpbmRpbmcoQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLCBGWF9EV09SRCBkd05hbWVIYXNoLCBYRkFfRUxFTUVOVCBlTWF0Y2hEYXRhTm9kZVR5cGUsIEZYX0JPT0wgYlVwTGV2ZWwgPSBUUlVFKQ0KLXsNCi0gICAgZm9yKENYRkFfTm9kZSAqcEN1ckRhdGFTY29wZSA9IHBEYXRhU2NvcGUsICpwTGFzdERhdGFTY29wZSA9IE5VTEw7DQotICAgICAgICAgICAgcEN1ckRhdGFTY29wZSAmJiBwQ3VyRGF0YVNjb3BlLT5HZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHM7DQotICAgICAgICAgICAgcExhc3REYXRhU2NvcGUgPSBwQ3VyRGF0YVNjb3BlLCBwQ3VyRGF0YVNjb3BlID0gcEN1ckRhdGFTY29wZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCi0gICAgICAgIGZvcihDWEZBX05vZGUqIHBEYXRhQ2hpbGQgPSBwQ3VyRGF0YVNjb3BlLT5HZXRGaXJzdENoaWxkQnlOYW1lKGR3TmFtZUhhc2gpOyBwRGF0YUNoaWxkOyBwRGF0YUNoaWxkID0gcERhdGFDaGlsZC0+R2V0TmV4dFNhbWVOYW1lU2libGluZyhkd05hbWVIYXNoKSkgew0KLSAgICAgICAgICAgIGlmKHBEYXRhQ2hpbGQgPT0gcExhc3REYXRhU2NvcGUgfHwgKGVNYXRjaERhdGFOb2RlVHlwZSAhPSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwgJiYgcERhdGFDaGlsZC0+R2V0Q2xhc3NJRCgpICE9IGVNYXRjaERhdGFOb2RlVHlwZSkgfHwgcERhdGFDaGlsZC0+SGFzQmluZEl0ZW0oKSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHBEYXRhQ2hpbGQ7DQotICAgICAgICB9DQotICAgICAgICBmb3IoQ1hGQV9Ob2RlKiBwRGF0YUNoaWxkID0gcEN1ckRhdGFTY29wZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsgcERhdGFDaGlsZDsgcERhdGFDaGlsZCA9IHBEYXRhQ2hpbGQtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UX0RhdGFHcm91cCkpIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IFhGQV9EYXRhTWVyZ2VfU2NvcGVNYXRjaEdsb2JhbEJpbmRpbmcocERhdGFDaGlsZCwgZHdOYW1lSGFzaCwgZU1hdGNoRGF0YU5vZGVUeXBlLCBGQUxTRSk7DQotICAgICAgICAgICAgaWYocERhdGFOb2RlKQl7DQotICAgICAgICAgICAgICAgIHJldHVybiBwRGF0YU5vZGU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoIWJVcExldmVsKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLXN0YXRpYyBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfRmluZEdsb2JhbERhdGFOb2RlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZSwgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLCBYRkFfRUxFTUVOVCBlTWF0Y2hOb2RlVHlwZSkNCi17DQotICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSB3c05hbWUuSXNFbXB0eSgpID8gMCA6IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgd3NOYW1lLkdldExlbmd0aCgpKTsNCi0gICAgaWYgKGR3TmFtZUhhc2ggIT0gMCkgew0KLSAgICAgICAgQ1hGQV9Ob2RlICpwQm91bmRlZCA9IFhGQV9EYXRhTWVyZ2VfR2V0R2xvYmFsQmluZGluZyhwRG9jdW1lbnQsIGR3TmFtZUhhc2gpOw0KLSAgICAgICAgaWYoIXBCb3VuZGVkKSB7DQotICAgICAgICAgICAgcEJvdW5kZWQgPSBYRkFfRGF0YU1lcmdlX1Njb3BlTWF0Y2hHbG9iYWxCaW5kaW5nKHBEYXRhU2NvcGUsIGR3TmFtZUhhc2gsIGVNYXRjaE5vZGVUeXBlKTsNCi0gICAgICAgICAgICBpZihwQm91bmRlZCkgew0KLSAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX1JlZ2lzdGVyR2xvYmFsQmluZGluZyhwRG9jdW1lbnQsIGR3TmFtZUhhc2gsIHBCb3VuZGVkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcEJvdW5kZWQ7DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLXN0YXRpYyBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfRmluZE9uY2VEYXRhTm9kZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9XaWRlU3RyaW5nQyB3c05hbWUsIENYRkFfTm9kZSogcERhdGFTY29wZSwgWEZBX0VMRU1FTlQgZU1hdGNoTm9kZVR5cGUpDQotew0KLSAgICBGWF9EV09SRCBkd05hbWVIYXNoID0gd3NOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQotICAgIGlmIChkd05hbWVIYXNoICE9IDApIHsNCi0gICAgICAgIGZvcihDWEZBX05vZGUgKnBDdXJEYXRhU2NvcGUgPSBwRGF0YVNjb3BlLCAqcExhc3REYXRhU2NvcGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBwQ3VyRGF0YVNjb3BlICYmIHBDdXJEYXRhU2NvcGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czsNCi0gICAgICAgICAgICAgICAgcExhc3REYXRhU2NvcGUgPSBwQ3VyRGF0YVNjb3BlLCBwQ3VyRGF0YVNjb3BlID0gcEN1ckRhdGFTY29wZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCi0gICAgICAgICAgICBmb3IoQ1hGQV9Ob2RlKiBwRGF0YUNoaWxkID0gcEN1ckRhdGFTY29wZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShkd05hbWVIYXNoKTsgcERhdGFDaGlsZDsgcERhdGFDaGlsZCA9IHBEYXRhQ2hpbGQtPkdldE5leHRTYW1lTmFtZVNpYmxpbmcoZHdOYW1lSGFzaCkpIHsNCi0gICAgICAgICAgICAgICAgaWYocERhdGFDaGlsZCA9PSBwTGFzdERhdGFTY29wZSB8fCAoZU1hdGNoTm9kZVR5cGUgIT0gWEZBX0VMRU1FTlRfRGF0YU1vZGVsICYmIHBEYXRhQ2hpbGQtPkdldENsYXNzSUQoKSAhPSBlTWF0Y2hOb2RlVHlwZSkgfHwgcERhdGFDaGlsZC0+SGFzQmluZEl0ZW0oKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBEYXRhQ2hpbGQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1zdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhUmVmRGF0YU5vZGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfV2lkZVN0cmluZ0Mgd3NSZWYsIENYRkFfTm9kZSogcERhdGFTY29wZSwgWEZBX0VMRU1FTlQgZU1hdGNoTm9kZVR5cGUsIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwgRlhfQk9PTCBiRm9yY2VCaW5kLCBGWF9CT09MIGJVcExldmVsID0gVFJVRSkNCi17DQotICAgIEZYX0RXT1JEIGRGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9CaW5kTmV3Ow0KLSAgICBpZiAoYlVwTGV2ZWwgfHwgd3NSZWYgIT0gRlhfV1NUUkMoTCJuYW1lIikpIHsNCi0gICAgICAgIGRGbGFncyB8PSAoWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyk7DQotICAgIH0NCi0gICAgWEZBX1JFU09MVkVOT0RFX1JTIHJzOw0KLSAgICBwRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+UmVzb2x2ZU9iamVjdHMocERhdGFTY29wZSwgd3NSZWYsIHJzLCBkRmxhZ3MsIHBUZW1wbGF0ZU5vZGUpOw0KLSAgICBpZiAocnMuZHdGbGFncyA9PSBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVBbGwgfHwgcnMuZHdGbGFncyA9PSBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVNaWRBbGwgfHwgcnMubm9kZXMuR2V0U2l6ZSgpID4gMSkgew0KLSAgICAgICAgcmV0dXJuIHBEb2N1bWVudC0+R2V0Tm90QmluZE5vZGUocnMubm9kZXMpOw0KLSAgICB9IGVsc2UgaWYgKHJzLmR3RmxhZ3MgPT0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlT25lKSB7DQotICAgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IChycy5ub2Rlcy5HZXRTaXplKCkgPiAwKSA/IHJzLm5vZGVzWzBdIDogTlVMTDsNCi0gICAgICAgIENYRkFfTm9kZSAqcE5vZGUgPSAocE9iamVjdCAmJiBwT2JqZWN0LT5Jc05vZGUoKSkgPyAoQ1hGQV9Ob2RlKilwT2JqZWN0IDogTlVMTDsNCi0gICAgICAgIGlmICghYkZvcmNlQmluZCAmJiAocE5vZGUgIT0gTlVMTCkgJiYgcE5vZGUtPkhhc0JpbmRJdGVtKCkpIHsNCi0gICAgICAgICAgICBwTm9kZSA9IE5VTEw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcE5vZGU7DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUNYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9GaW5kRm9ybURPTUluc3RhbmNlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgWEZBX0VMRU1FTlQgZUNsYXNzSUQsIEZYX0RXT1JEIGR3TmFtZUhhc2gsIENYRkFfTm9kZSogcEZvcm1QYXJlbnQpDQotew0KLSAgICBDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPSBwRm9ybVBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICBmb3IoOyBwRm9ybUNoaWxkOyBwRm9ybUNoaWxkID0gcEZvcm1DaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgaWYocEZvcm1DaGlsZC0+R2V0Q2xhc3NJRCgpID09IGVDbGFzc0lEICYmIHBGb3JtQ2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gZHdOYW1lSGFzaCAmJiBwRm9ybUNoaWxkLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KLSAgICAgICAgICAgIHJldHVybiBwRm9ybUNoaWxkOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1zdGF0aWMgRlhfQk9PTCBYRkFfTmVlZEdlbmVyYXRlRm9ybShDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkLCBGWF9CT09MIGJVc2VJbnN0YW5jZU1hbmFnZXIgPSBUUlVFKQ0KLXsNCi0gICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBpZihwVGVtcGxhdGVDaGlsZC0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfUHJvdG8gfHwgKGJVc2VJbnN0YW5jZU1hbmFnZXIgJiYgZVR5cGUgPT0gWEZBX0VMRU1FTlRfT2NjdXIpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUNYRkFfTm9kZSogWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBGb3JtUGFyZW50LCBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsIEZYX0JPT0wgYlJlY3Vyc2l2ZSwgQ1hGQV9Ob2RlQXJyYXkqIHBTdWJmb3JtQXJyYXkpDQotew0KLSAgICBDWEZBX05vZGUqIHBFeGlzdGluZ05vZGUgPSBOVUxMOw0KLSAgICBpZiAocFN1YmZvcm1BcnJheSA9PSBOVUxMKSB7DQotICAgICAgICBwRXhpc3RpbmdOb2RlID0gWEZBX0RhdGFNZXJnZV9GaW5kRm9ybURPTUluc3RhbmNlKHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpLCBwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpLCBwRm9ybVBhcmVudCk7DQotICAgIH0gZWxzZSBpZiAocFN1YmZvcm1BcnJheS0+R2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgcEV4aXN0aW5nTm9kZSA9IHBTdWJmb3JtQXJyYXktPkdldEF0KDApOw0KLSAgICAgICAgcFN1YmZvcm1BcnJheS0+UmVtb3ZlQXQoMCk7DQotICAgIH0NCi0gICAgaWYocEV4aXN0aW5nTm9kZSkgew0KLSAgICAgICAgaWYgKHBTdWJmb3JtQXJyYXkpIHsNCi0gICAgICAgICAgICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocEV4aXN0aW5nTm9kZSk7DQotICAgICAgICB9IGVsc2UgaWYgKHBFeGlzdGluZ05vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7DQotICAgICAgICAgICAgcEZvcm1QYXJlbnQtPlJlbW92ZUNoaWxkKHBFeGlzdGluZ05vZGUpOw0KLSAgICAgICAgICAgIHBGb3JtUGFyZW50LT5JbnNlcnRDaGlsZChwRXhpc3RpbmdOb2RlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBFeGlzdGluZ05vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCi0gICAgICAgIHBFeGlzdGluZ05vZGUtPlNldFRlbXBsYXRlTm9kZShwVGVtcGxhdGVOb2RlKTsNCi0gICAgICAgIGlmKGJSZWN1cnNpdmUgJiYgcEV4aXN0aW5nTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQotICAgICAgICAgICAgZm9yIChDWEZBX05vZGUgKnBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgICAgICBpZihYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcEV4aXN0aW5nTm9kZSwgcFRlbXBsYXRlQ2hpbGQsIGJSZWN1cnNpdmUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcEV4aXN0aW5nTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KLSAgICAgICAgcmV0dXJuIHBFeGlzdGluZ05vZGU7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IHBUZW1wbGF0ZU5vZGUtPkNsb25lVGVtcGxhdGVUb0Zvcm0oRkFMU0UpOw0KLSAgICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld05vZGUsIE5VTEwpOw0KLSAgICBpZihiUmVjdXJzaXZlKSB7DQotICAgICAgICBmb3IgKENYRkFfTm9kZSAqcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgaWYoWEZBX05lZWRHZW5lcmF0ZUZvcm0ocFRlbXBsYXRlQ2hpbGQpKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcE5ld0NoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkNsb25lVGVtcGxhdGVUb0Zvcm0oVFJVRSk7DQotICAgICAgICAgICAgICAgIHBOZXdOb2RlLT5JbnNlcnRDaGlsZChwTmV3Q2hpbGQsIE5VTEwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcE5ld05vZGU7DQotfQ0KLXN0YXRpYyBDWEZBX05vZGUqIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlSW5zdGFuY2VNYW5hZ2VyKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCwgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLCBDWEZBX05vZGVBcnJheSYgc3ViZm9ybXMpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NTdWJmb3JtTmFtZSA9IHBUZW1wbGF0ZU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzSW5zdE1nck5vZGVOYW1lID0gRlhfV1NUUkMoTCJfIikgKyB3c1N1YmZvcm1OYW1lOw0KLSAgICBGWF9EV09SRCBkd0luc3ROYW1lSGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzSW5zdE1nck5vZGVOYW1lLCB3c0luc3RNZ3JOb2RlTmFtZS5HZXRMZW5ndGgoKSk7DQotICAgIENYRkFfTm9kZSogcEV4aXN0aW5nTm9kZSA9IFhGQV9EYXRhTWVyZ2VfRmluZEZvcm1ET01JbnN0YW5jZShwRG9jdW1lbnQsIFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlciwgZHdJbnN0TmFtZUhhc2gsIHBGb3JtUGFyZW50KTsNCi0gICAgaWYocEV4aXN0aW5nTm9kZSkgew0KLSAgICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IHBUZW1wbGF0ZU5vZGUtPkdldE5hbWVIYXNoKCk7DQotICAgICAgICBmb3IoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBFeGlzdGluZ05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7IHBOb2RlOyApIHsNCi0gICAgICAgICAgICBYRkFfRUxFTUVOVCBlQ3VyVHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQotICAgICAgICAgICAgaWYgKGVDdXJUeXBlID09IFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcikgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKChlQ3VyVHlwZSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtKSAmJiAoZUN1clR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkpIHsNCi0gICAgICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChkd05hbWVIYXNoICE9IHBOb2RlLT5HZXROYW1lSGFzaCgpKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBOZXh0Tm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgIHBGb3JtUGFyZW50LT5SZW1vdmVDaGlsZChwTm9kZSk7DQotICAgICAgICAgICAgc3ViZm9ybXMuQWRkKHBOb2RlKTsNCi0gICAgICAgICAgICBwTm9kZSA9IHBOZXh0Tm9kZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBGb3JtUGFyZW50LT5SZW1vdmVDaGlsZChwRXhpc3RpbmdOb2RlKTsNCi0gICAgICAgIHBGb3JtUGFyZW50LT5JbnNlcnRDaGlsZChwRXhpc3RpbmdOb2RlKTsNCi0gICAgICAgIHBFeGlzdGluZ05vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCi0gICAgICAgIHBFeGlzdGluZ05vZGUtPlNldFRlbXBsYXRlTm9kZShwVGVtcGxhdGVOb2RlKTsNCi0gICAgICAgIHJldHVybiBwRXhpc3RpbmdOb2RlOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcE5ld05vZGUgPSBwRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpOw0KLSAgICBGWFNZU19hc3NlcnQocE5ld05vZGUpOw0KLSAgICB3c0luc3RNZ3JOb2RlTmFtZSA9IEZYX1dTVFJDKEwiXyIpICsgcFRlbXBsYXRlTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCi0gICAgcE5ld05vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NJbnN0TWdyTm9kZU5hbWUpOw0KLSAgICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld05vZGUsIE5VTEwpOw0KLSAgICBwTmV3Tm9kZS0+U2V0VGVtcGxhdGVOb2RlKHBUZW1wbGF0ZU5vZGUpOw0KLSAgICByZXR1cm4gcE5ld05vZGU7DQotfQ0KLXN0YXRpYyBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfRmluZE1hdGNoaW5nRGF0YU5vZGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsIENYRkFfTm9kZSogcERhdGFTY29wZSwgRlhfQk9PTCYgYkFjY2Vzc2VkRGF0YURPTSwgRlhfQk9PTCBiRm9yY2VCaW5kLCBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGU+KiBwSXRlcmF0b3IsIEZYX0JPT0wmIGJTZWxmTWF0Y2gsIFhGQV9BVFRSSUJVVEVFTlVNJiBlQmluZE1hdGNoLCBGWF9CT09MIGJVcExldmVsID0gVFJVRSkNCi17DQotICAgIEZYX0JPT0wgYk93bkl0ZXJhdG9yID0gRkFMU0U7DQotICAgIGlmKCFwSXRlcmF0b3IpIHsNCi0gICAgICAgIGJPd25JdGVyYXRvciA9IFRSVUU7DQotICAgICAgICBwSXRlcmF0b3IgPSBGWF9ORVcgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPihwVGVtcGxhdGVOb2RlKTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBSZXN1bHQgPSBOVUxMOw0KLSAgICBmb3IoQ1hGQV9Ob2RlKiBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5HZXRDdXJyZW50KCk7IHBDdXJUZW1wbGF0ZU5vZGU7ICkgew0KLSAgICAgICAgWEZBX0VMRU1FTlQgZU1hdGNoTm9kZVR5cGU7DQotICAgICAgICBzd2l0Y2gocEN1clRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KLSAgICAgICAgICAgICAgICBlTWF0Y2hOb2RlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFHcm91cDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9GaWVsZDogew0KLSAgICAgICAgICAgICAgICAgICAgZU1hdGNoTm9kZVR5cGUgPSBYRkFfRmllbGRJc011bHRpTGlzdEJveChwQ3VyVGVtcGxhdGVOb2RlKSA/IFhGQV9FTEVNRU5UX0RhdGFHcm91cCA6IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCi0gICAgICAgICAgICAgICAgZU1hdGNoTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGVPY2N1ciA9IHBDdXJUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX09jY3VyKTsNCi0gICAgICAgIGludDMyX3QgaU1pbiwgaU1heCwgaUluaXQ7DQotICAgICAgICBpZihwVGVtcGxhdGVOb2RlT2NjdXIgJiYgWEZBX0dldE9jY3VySW5mbyhwVGVtcGxhdGVOb2RlT2NjdXIsIGlNaW4sIGlNYXgsIGlJbml0KSAmJiBpTWF4ID09IDApIHsNCi0gICAgICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGVCaW5kID0gcEN1clRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQmluZCk7DQotICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTWF0Y2ggPSBwVGVtcGxhdGVOb2RlQmluZCA/IHBUZW1wbGF0ZU5vZGVCaW5kLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWF0Y2gpIDogWEZBX0FUVFJJQlVURUVOVU1fT25jZTsNCi0gICAgICAgIGVCaW5kTWF0Y2ggPSBlTWF0Y2g7DQotICAgICAgICBzd2l0Y2goZU1hdGNoKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOg0KLSAgICAgICAgICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fR2xvYmFsOg0KLSAgICAgICAgICAgICAgICBiQWNjZXNzZWREYXRhRE9NID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgaWYoIWJGb3JjZUJpbmQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChlTWF0Y2hOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhVmFsdWUgfHwgKGVNYXRjaE5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFHcm91cCAmJiBYRkFfRmllbGRJc011bHRpTGlzdEJveChwVGVtcGxhdGVOb2RlQmluZCkpKSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBHbG9iYWxCaW5kTm9kZSA9IFhGQV9EYXRhTWVyZ2VfRmluZEdsb2JhbERhdGFOb2RlKHBEb2N1bWVudCwgcEN1clRlbXBsYXRlTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKSwgcERhdGFTY29wZSwgZU1hdGNoTm9kZVR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoIXBHbG9iYWxCaW5kTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHBSZXN1bHQgPSBwR2xvYmFsQmluZE5vZGU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fT25jZTogew0KLSAgICAgICAgICAgICAgICAgICAgYkFjY2Vzc2VkRGF0YURPTSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBPbmNlQmluZE5vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRPbmNlRGF0YU5vZGUocERvY3VtZW50LCBwQ3VyVGVtcGxhdGVOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpLCBwRGF0YVNjb3BlLCBlTWF0Y2hOb2RlVHlwZSk7DQotICAgICAgICAgICAgICAgICAgICBpZighcE9uY2VCaW5kTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHBSZXN1bHQgPSBwT25jZUJpbmROb2RlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZjogew0KLSAgICAgICAgICAgICAgICAgICAgYkFjY2Vzc2VkRGF0YURPTSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhUmVmQmluZE5vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhUmVmRGF0YU5vZGUocERvY3VtZW50LCBwVGVtcGxhdGVOb2RlQmluZC0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYpLCBwRGF0YVNjb3BlLCBlTWF0Y2hOb2RlVHlwZSwgcFRlbXBsYXRlTm9kZSwgYkZvcmNlQmluZCwgYlVwTGV2ZWwpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYocERhdGFSZWZCaW5kTm9kZSAmJiBwRGF0YVJlZkJpbmROb2RlLT5HZXRDbGFzc0lEKCkgPT0gZU1hdGNoTm9kZVR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmVzdWx0ID0gcERhdGFSZWZCaW5kTm9kZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwUmVzdWx0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+U2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYocEN1clRlbXBsYXRlTm9kZSA9PSBwVGVtcGxhdGVOb2RlICYmIHBSZXN1bHQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIGJTZWxmTWF0Y2ggPSBUUlVFOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBwRGF0YU5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7DQorICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlKQ0KKyAgICAgICAgICAgICAgICAtPlNldFN0cmluZyhGWF9XU1RSQyhMInhmYTpkYXRhTm9kZSIpLCBGWF9XU1RSQyhMImRhdGFHcm91cCIpKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgcFdpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQogICAgICAgICB9DQogICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBpZihiT3duSXRlcmF0b3IpIHsNCi0gICAgICAgIGRlbGV0ZSBwSXRlcmF0b3I7DQotICAgIH0NCi0gICAgcmV0dXJuIHBSZXN1bHQ7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9EYXRhTWVyZ2VfU29ydFJlY3Vyc2VSZWNvcmQoQ0ZYX0FycmF5VGVtcGxhdGU8WEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkPiYgcmdSZWNvcmRzLCBDWEZBX05vZGUqIHBEYXRhU2NvcGUsIEZYX0JPT0wgYkNob2ljZU1vZGUgPSBGQUxTRSkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gcmdSZWNvcmRzLkdldFNpemUoKTsNCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8WEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkPiByZ1Jlc3VsdFJlY29yZDsNCi0gICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwRGF0YVNjb3BlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDaGlsZE5vZGU7IHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSByZ1JlY29yZHNbaV0ucERhdGFDaGlsZDsNCi0gICAgICAgICAgICBpZiAocENoaWxkTm9kZSA9PSBwTm9kZSkgew0KLSAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX1JlY3Vyc2VSZWNvcmQgc05ld1JlY29yZCA9IHtyZ1JlY29yZHNbaV0ucFRlbXBsYXRlQ2hpbGQsIHBOb2RlfTsNCi0gICAgICAgICAgICAgICAgcmdSZXN1bHRSZWNvcmQuQWRkKHNOZXdSZWNvcmQpOw0KLSAgICAgICAgICAgICAgICByZ1JlY29yZHMuUmVtb3ZlQXQoaSk7DQotICAgICAgICAgICAgICAgIGlDb3VudC0tOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjoNCisgICAgICAgIGRlZlZhbHVlLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJDaG9pY2VNb2RlICYmIHJnUmVzdWx0UmVjb3JkLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgIHBXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCisgICAgICAgIHBEYXRhTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOiB7DQorICAgICAgICBDWEZBX05vZGUqIHBDaGVja2VkID0gTlVMTDsNCisgICAgICAgIFhGQV9FTEVNRU5UIGVWYWx1ZVR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIGZvciAoOyBwQ2hpbGQ7IHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICBpZiAocENoaWxkLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZSA9IHBDaGlsZC0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KKyAgICAgICAgICBpZiAoIXBWYWx1ZSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIENYRkFfVmFsdWUgdmFsdWVDaGlsZChwVmFsdWUpOw0KKyAgICAgICAgICB2YWx1ZUNoaWxkLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDWEZBX05vZGUqIHBJdGVtcyA9IHBDaGlsZC0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpOw0KKyAgICAgICAgICBpZiAoIXBJdGVtcykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgaWYgKCFwVGV4dCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgICAgICAgICAgaWYgKHBUZXh0LT5UcnlDb250ZW50KHdzQ29udGVudCkgJiYgKHdzQ29udGVudCA9PSB3c1ZhbHVlKSkgew0KKyAgICAgICAgICAgIHBDaGVja2VkID0gcENoaWxkOw0KKyAgICAgICAgICAgIGVWYWx1ZVR5cGUgPSBwVGV4dC0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgICAgIHdzRm9ybWF0ZWRWYWx1ZSA9IHdzVmFsdWU7DQorICAgICAgICAgICAgcERhdGFOb2RlLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgICAgIHBGb3JtTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb250ZW50KTsNCiAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFwQ2hlY2tlZCkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHBDaGlsZCA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgZm9yICg7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgIGlmIChwQ2hpbGQgPT0gcENoZWNrZWQpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocENoaWxkLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZSA9IHBDaGlsZC0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KKyAgICAgICAgICBDWEZBX05vZGUqIHBJdGVtcyA9IHBDaGlsZC0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpOw0KKyAgICAgICAgICBDWEZBX05vZGUqIHBUZXh0ID0NCisgICAgICAgICAgICAgIHBJdGVtcyA/IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpIDogTlVMTDsNCisgICAgICAgICAgaWYgKHBUZXh0KSB7DQorICAgICAgICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICAgICAgICAgIGlmIChwVGV4dCkgew0KKyAgICAgICAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudChwVmFsdWUsIHdzQ29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9UZXh0KTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQ6IHsNCisgICAgICAgIGRlZlZhbHVlLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7DQorICAgICAgICBwV2lkZ2V0RGF0YS0+Tm9ybWFsaXplTnVtU3RyKHdzVmFsdWUsIHdzT3V0cHV0KTsNCisgICAgICAgIHdzVmFsdWUgPSB3c091dHB1dDsNCisgICAgICAgIHBXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCisgICAgICAgIHBEYXRhTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCisgICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gcEZvcm1Ob2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KHBWYWx1ZSwgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlRfRmxvYXQpOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGRlZlZhbHVlLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFdpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgcERhdGFOb2RlLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYgKHJnUmVzdWx0UmVjb3JkLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgIGlmICghYkNob2ljZU1vZGUpIHsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX1JlY3Vyc2VSZWNvcmQgc05ld1JlY29yZCA9IHtyZ1JlY29yZHNbaV0ucFRlbXBsYXRlQ2hpbGQsIHJnUmVjb3Jkc1tpXS5wRGF0YUNoaWxkfTsNCi0gICAgICAgICAgICAgICAgcmdSZXN1bHRSZWNvcmQuQWRkKHNOZXdSZWNvcmQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NYTUxWYWx1ZTsNCisgICAgcERhdGFOb2RlLT5UcnlDb250ZW50KHdzWE1MVmFsdWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05vcm1haWxpemVWYWx1ZTsNCisgICAgcFdpZGdldERhdGEtPkdldE5vcm1hbGl6ZURhdGFWYWx1ZSh3c1hNTFZhbHVlLCB3c05vcm1haWxpemVWYWx1ZSk7DQorICAgIHBEYXRhTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NOb3JtYWlsaXplVmFsdWUsIHdzWE1MVmFsdWUpOw0KKyAgICBzd2l0Y2ggKGVVSVR5cGUpIHsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDogew0KKyAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudCgNCisgICAgICAgICAgICBkZWZWYWx1ZS5HZXROb2RlKCksIHdzTm9ybWFpbGl6ZVZhbHVlLCBYRkFfRUxFTUVOVF9JbWFnZSk7DQorICAgICAgICBDWEZBX0ltYWdlIGltYWdlID0gZGVmVmFsdWUuR2V0SW1hZ2UoKTsNCisgICAgICAgIGlmIChpbWFnZSkgew0KKyAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBYTUxEYXRhRWxlbWVudCA9DQorICAgICAgICAgICAgICAoSUZERV9YTUxFbGVtZW50KikocERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpKTsNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxEYXRhRWxlbWVudCk7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSHJlZjsNCisgICAgICAgICAgcFhNTERhdGFFbGVtZW50LT5HZXRTdHJpbmcoTCJ4ZmE6Y29udGVudFR5cGUiLCB3c0NvbnRlbnRUeXBlKTsNCisgICAgICAgICAgaWYgKCF3c0NvbnRlbnRUeXBlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHBEYXRhTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQorICAgICAgICAgICAgaW1hZ2UuU2V0Q29udGVudFR5cGUod3NDb250ZW50VHlwZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcFhNTERhdGFFbGVtZW50LT5HZXRTdHJpbmcoTCJocmVmIiwgd3NIcmVmKTsNCisgICAgICAgICAgaWYgKCF3c0hyZWYuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgaW1hZ2UuU2V0SHJlZih3c0hyZWYpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3Q6DQorICAgICAgICBpZiAocFdpZGdldERhdGEtPkdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgaXRlbXM7DQorICAgICAgICAgIHBEYXRhTm9kZS0+R2V0Tm9kZUxpc3QoaXRlbXMpOw0KKyAgICAgICAgICBpbnQzMl90IGlDb3VudHMgPSBpdGVtcy5HZXRTaXplKCk7DQorICAgICAgICAgIGlmIChpQ291bnRzID4gMCkgew0KKyAgICAgICAgICAgIHdzTm9ybWFpbGl6ZVZhbHVlLkVtcHR5KCk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NJdGVtOw0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudHM7IGkrKykgew0KKyAgICAgICAgICAgICAgaXRlbXNbaV0tPlRyeUNvbnRlbnQod3NJdGVtKTsNCisgICAgICAgICAgICAgIHdzSXRlbSA9IChpQ291bnRzID09IDEpID8gd3NJdGVtIDogd3NJdGVtICsgRlhfV1NUUkMoTCJcbiIpOw0KKyAgICAgICAgICAgICAgd3NOb3JtYWlsaXplVmFsdWUgKz0gd3NJdGVtOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJnUmVjb3Jkcy5SZW1vdmVBbGwoKTsNCi0gICAgICAgIHJnUmVjb3Jkcy5Db3B5KHJnUmVzdWx0UmVjb3JkKTsNCi0gICAgfQ0KLX0NCi1zdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0NvcHlDb250YWluZXJfU3ViZm9ybVNldChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudE5vZGUsIENYRkFfTm9kZSogcERhdGFTY29wZSwgRlhfQk9PTCBiT25lSW5zdGFuY2UsIEZYX0JPT0wgYkRhdGFNZXJnZSkNCi17DQotICAgIFhGQV9FTEVNRU5UCWVFbGVtZW50ID0gcFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBDWEZBX05vZGUgKnBPY2N1ck5vZGUgPSBOVUxMOw0KLSAgICBDWEZBX05vZGUgKnBGaXJzdEluc3RhbmNlID0gTlVMTDsNCi0gICAgRlhfQk9PTCBiVXNlSW5zdGFuY2VNYW5hZ2VyID0gcEZvcm1QYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfQXJlYTsNCi0gICAgQ1hGQV9Ob2RlKiBwSW5zdE1nck5vZGUgPSBOVUxMOw0KLSAgICBDWEZBX05vZGVBcnJheSBzdWJmb3JtQXJyYXk7DQotICAgIENYRkFfTm9kZUFycmF5KiBwU2VhcmNoQXJyYXkgPSBOVUxMOw0KLSAgICBpZiAoIWJPbmVJbnN0YW5jZSAmJiAoZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCB8fCBlRWxlbWVudCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSkgew0KLSAgICAgICAgcEluc3RNZ3JOb2RlID0gYlVzZUluc3RhbmNlTWFuYWdlciA/IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlSW5zdGFuY2VNYW5hZ2VyKHBEb2N1bWVudCwgcEZvcm1QYXJlbnROb2RlLCBwVGVtcGxhdGVOb2RlLCBzdWJmb3JtQXJyYXkpIDogTlVMTDsNCi0gICAgICAgIGlmKENYRkFfTm9kZSogcE9jY3VyVGVtcGxhdGVOb2RlID0gcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpKSB7DQotICAgICAgICAgICAgcE9jY3VyTm9kZSA9IHBJbnN0TWdyTm9kZSAhPSBOVUxMID8gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwSW5zdE1nck5vZGUsIHBPY2N1clRlbXBsYXRlTm9kZSwgRkFMU0UpIDogcE9jY3VyVGVtcGxhdGVOb2RlOw0KLSAgICAgICAgfSBlbHNlIGlmIChwSW5zdE1nck5vZGUpIHsNCi0gICAgICAgICAgICBwT2NjdXJOb2RlID0gcEluc3RNZ3JOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQotICAgICAgICAgICAgaWYgKHBPY2N1ck5vZGUpIHsNCi0gICAgICAgICAgICAgICAgcE9jY3VyTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwSW5zdE1nck5vZGUpIHsNCi0gICAgICAgICAgICBwSW5zdE1nck5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCi0gICAgICAgICAgICBwU2VhcmNoQXJyYXkgPSAmc3ViZm9ybUFycmF5Ow0KLSAgICAgICAgICAgIGlmIChwRm9ybVBhcmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KLSAgICAgICAgICAgICAgICBiT25lSW5zdGFuY2UgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBpZiAoc3ViZm9ybUFycmF5LkdldFNpemUoKSA8IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBTZWFyY2hBcnJheSA9IE5VTEw7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKChwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpID09IDApICYmIChzdWJmb3JtQXJyYXkuR2V0U2l6ZSgpIDwgMSkpIHsNCi0gICAgICAgICAgICAgICAgcFNlYXJjaEFycmF5ID0gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaW50MzJfdCBpTWF4ID0gMSwgaUluaXQgPSAxLCBpTWluID0gMTsNCi0gICAgaWYoIWJPbmVJbnN0YW5jZSkgew0KLSAgICAgICAgWEZBX0dldE9jY3VySW5mbyhwT2NjdXJOb2RlLCBpTWluLCBpTWF4LCBpSW5pdCk7DQotICAgIH0NCi0gICAgWEZBX0FUVFJJQlVURUVOVU0JZVJlbGF0aW9uID0gZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCA/IHBUZW1wbGF0ZU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9SZWxhdGlvbikgOiBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkOw0KLSAgICBpbnQzMl90IGlDdXJSZXBlYXRJbmRleCA9IDA7DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVQYXJlbnRCaW5kTWF0Y2ggPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KLSAgICBpZiAoYkRhdGFNZXJnZSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPiBzTm9kZUl0ZXJhdG9yKHBUZW1wbGF0ZU5vZGUpOw0KLSAgICAgICAgRlhfQk9PTCBiQWNjZXNzZWREYXRhRE9NID0gRkFMU0U7DQotICAgICAgICBpZiAoZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCB8fCBlRWxlbWVudCA9PSBYRkFfRUxFTUVOVF9BcmVhKSB7DQotICAgICAgICAgICAgc05vZGVJdGVyYXRvci5Nb3ZlVG9OZXh0KCk7DQorICAgICAgICAgICAgQ1hGQV9FeERhdGEgZXhEYXRhID0gZGVmVmFsdWUuR2V0RXhEYXRhKCk7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGV4RGF0YSAhPSBOVUxMKTsNCisgICAgICAgICAgICBleERhdGEuU2V0Q29udGVudFR5cGUoKGlDb3VudHMgPT0gMSkgPyBGWF9XU1RSQyhMInRleHQvcGxhaW4iKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYX1dTVFJDKEwidGV4dC94bWwiKSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudCgNCisgICAgICAgICAgICAgIGRlZlZhbHVlLkdldE5vZGUoKSwgd3NOb3JtYWlsaXplVmFsdWUsIFhGQV9FTEVNRU5UX0V4RGF0YSk7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxDWEZBX05vZGUqLCBDWEZBX05vZGUqPiBzdWJmb3JtTWFwQXJyYXk7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgc3ViZm9ybUFycmF5Ow0KLSAgICAgICAgICAgIGZvciAoOyBpTWF4IDwgMCB8fCBpQ3VyUmVwZWF0SW5kZXggPCBpTWF4OyBpQ3VyUmVwZWF0SW5kZXgrKykgew0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWxmTWF0Y2ggPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUJpbmRNYXRjaCA9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gWEZBX0RhdGFNZXJnZV9GaW5kTWF0Y2hpbmdEYXRhTm9kZShwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGUsIHBEYXRhU2NvcGUsIGJBY2Nlc3NlZERhdGFET00sIEZBTFNFLCAmc05vZGVJdGVyYXRvciwgYlNlbGZNYXRjaCwgZUJpbmRNYXRjaCk7DQotICAgICAgICAgICAgICAgIGlmKCFwRGF0YU5vZGUgfHwgc05vZGVJdGVyYXRvci5HZXRDdXJyZW50KCkgIT0gcFRlbXBsYXRlTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZVBhcmVudEJpbmRNYXRjaCA9IGVCaW5kTWF0Y2g7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwRm9ybVBhcmVudE5vZGUsIHBUZW1wbGF0ZU5vZGUsIEZBTFNFLCBwU2VhcmNoQXJyYXkpOw0KLSAgICAgICAgICAgICAgICBpZighcEZpcnN0SW5zdGFuY2UpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBGaXJzdEluc3RhbmNlID0gcFN1YmZvcm1Ob2RlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocFN1YmZvcm1Ob2RlLCBwRGF0YU5vZGUpOw0KLSAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocFN1YmZvcm1Ob2RlKTsNCi0gICAgICAgICAgICAgICAgc3ViZm9ybU1hcEFycmF5LlNldEF0KHBTdWJmb3JtTm9kZSwgcERhdGFOb2RlKTsNCi0gICAgICAgICAgICAgICAgc3ViZm9ybUFycmF5LkFkZChwU3ViZm9ybU5vZGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWF9QT1NJVElPTiBwb3NpdGlvbiA9IHN1YmZvcm1NYXBBcnJheS5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgICAgICAgICAgZm9yKGludDMyX3QgaUluZGV4ID0gMDsgaUluZGV4IDwgc3ViZm9ybUFycmF5LkdldFNpemUoKTsgaUluZGV4ICsrKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm0gPSBzdWJmb3JtQXJyYXlbaUluZGV4XTsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSAoQ1hGQV9Ob2RlKilzdWJmb3JtTWFwQXJyYXkuR2V0VmFsdWVBdChwU3ViZm9ybSk7DQotICAgICAgICAgICAgICAgIGZvciAoQ1hGQV9Ob2RlICpwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBTdWJmb3JtLCBwVGVtcGxhdGVDaGlsZCwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBUZW1wbGF0ZUNoaWxkLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRlbXBsYXRlQ2hpbGQsIHBTdWJmb3JtLCBwRGF0YU5vZGUsIEZBTFNFLCBUUlVFLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc3ViZm9ybU1hcEFycmF5LlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KA0KKyAgICAgICAgICAgICAgZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1haWxpemVWYWx1ZSwgWEZBX0VMRU1FTlRfVGV4dCk7DQogICAgICAgICB9DQotICAgICAgICBmb3IgKDsgaU1heCA8IDAgfHwgaUN1clJlcGVhdEluZGV4IDwgaU1heDsgaUN1clJlcGVhdEluZGV4KyspIHsNCi0gICAgICAgICAgICBGWF9CT09MIGJTZWxmTWF0Y2ggPSBGQUxTRTsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBPbGROb2RlID0gc05vZGVJdGVyYXRvci5HZXRDdXJyZW50KCk7DQotICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUJpbmRNYXRjaCA9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQotICAgICAgICAgICAgaWYoIVhGQV9EYXRhTWVyZ2VfRmluZE1hdGNoaW5nRGF0YU5vZGUocERvY3VtZW50LCBwVGVtcGxhdGVOb2RlLCBwRGF0YVNjb3BlLCBiQWNjZXNzZWREYXRhRE9NLCBGQUxTRSwgJnNOb2RlSXRlcmF0b3IsIGJTZWxmTWF0Y2gsIGVCaW5kTWF0Y2gpKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihlQmluZE1hdGNoID09IFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWYgJiYgZVBhcmVudEJpbmRNYXRjaCA9PSBYRkFfQVRUUklCVVRFRU5VTV9EYXRhUmVmKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZVJlbGF0aW9uID09ICBYRkFfQVRUUklCVVRFRU5VTV9DaG9pY2UgfHwgZVJlbGF0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX1Vub3JkZXJlZCkgew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtU2V0Tm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcEZvcm1QYXJlbnROb2RlLCBwVGVtcGxhdGVOb2RlLCBGQUxTRSwgcFNlYXJjaEFycmF5KTsNCi0gICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBTdWJmb3JtU2V0Tm9kZSk7DQotICAgICAgICAgICAgICAgIGlmKCFwRmlyc3RJbnN0YW5jZSkgew0KLSAgICAgICAgICAgICAgICAgICAgcEZpcnN0SW5zdGFuY2UgPSBwU3ViZm9ybVNldE5vZGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8WEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkPiByZ0l0ZW1NYXRjaExpc3Q7DQotICAgICAgICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfTm9kZSo+IHJnSXRlbVVubWF0Y2hMaXN0Ow0KLSAgICAgICAgICAgICAgICBmb3IgKENYRkFfTm9kZSAqcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoWEZBX05lZWRHZW5lcmF0ZUZvcm0ocFRlbXBsYXRlQ2hpbGQsIGJVc2VJbnN0YW5jZU1hbmFnZXIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwU3ViZm9ybVNldE5vZGUsIHBUZW1wbGF0ZUNoaWxkLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihwVGVtcGxhdGVDaGlsZC0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBEYXRhTWF0Y2g7DQotICAgICAgICAgICAgICAgICAgICAgICAgYlNlbGZNYXRjaCA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVCaW5kTWF0Y2ggPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVSZWxhdGlvbiAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkICYmIChwRGF0YU1hdGNoID0gWEZBX0RhdGFNZXJnZV9GaW5kTWF0Y2hpbmdEYXRhTm9kZShwRG9jdW1lbnQsIHBUZW1wbGF0ZUNoaWxkLCBwRGF0YVNjb3BlLCBiQWNjZXNzZWREYXRhRE9NLCBGQUxTRSwgTlVMTCwgYlNlbGZNYXRjaCwgZUJpbmRNYXRjaCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfUmVjdXJzZVJlY29yZCBzTmV3UmVjb3JkID0ge3BUZW1wbGF0ZUNoaWxkLCBwRGF0YU1hdGNofTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYlNlbGZNYXRjaCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdJdGVtTWF0Y2hMaXN0Lkluc2VydEF0KDAsIHNOZXdSZWNvcmQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdJdGVtTWF0Y2hMaXN0LkFkZChzTmV3UmVjb3JkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnSXRlbVVubWF0Y2hMaXN0LkFkZChwVGVtcGxhdGVDaGlsZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHN3aXRjaChlUmVsYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2hvaWNlOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChyZ0l0ZW1NYXRjaExpc3QuR2V0U2l6ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9Tb3J0UmVjdXJzZVJlY29yZChyZ0l0ZW1NYXRjaExpc3QsIHBEYXRhU2NvcGUsIFRSVUUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHJnSXRlbU1hdGNoTGlzdFswXS5wVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1TZXROb2RlLCBwRGF0YVNjb3BlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1Vub3JkZXJlZDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZ0l0ZW1NYXRjaExpc3QuR2V0U2l6ZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX1NvcnRSZWN1cnNlUmVjb3JkKHJnSXRlbU1hdGNoTGlzdCwgcERhdGFTY29wZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMCwgY291bnQgPSByZ0l0ZW1NYXRjaExpc3QuR2V0U2l6ZSgpOyBpIDwgY291bnQ7IGkgKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHJnSXRlbU1hdGNoTGlzdFtpXS5wVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1TZXROb2RlLCBwRGF0YVNjb3BlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMCwgY291bnQgPSByZ0l0ZW1Vbm1hdGNoTGlzdC5HZXRTaXplKCk7IGkgPCBjb3VudDsgaSArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihyZ0l0ZW1Vbm1hdGNoTGlzdFtpXSwgcFN1YmZvcm1TZXROb2RlLCBwRGF0YVNjb3BlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtU2V0Tm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcEZvcm1QYXJlbnROb2RlLCBwVGVtcGxhdGVOb2RlLCBGQUxTRSwgcFNlYXJjaEFycmF5KTsNCi0gICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBTdWJmb3JtU2V0Tm9kZSk7DQotICAgICAgICAgICAgICAgIGlmKCFwRmlyc3RJbnN0YW5jZSkgew0KLSAgICAgICAgICAgICAgICAgICAgcEZpcnN0SW5zdGFuY2UgPSBwU3ViZm9ybVNldE5vZGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZm9yIChDWEZBX05vZGUgKnBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFhGQV9OZWVkR2VuZXJhdGVGb3JtKHBUZW1wbGF0ZUNoaWxkLCBiVXNlSW5zdGFuY2VNYW5hZ2VyKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFN1YmZvcm1TZXROb2RlLCBwVGVtcGxhdGVDaGlsZCwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBUZW1wbGF0ZUNoaWxkLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRlbXBsYXRlQ2hpbGQsIHBTdWJmb3JtU2V0Tm9kZSwgcERhdGFTY29wZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uOg0KKyAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudCgNCisgICAgICAgICAgICBkZWZWYWx1ZS5HZXROb2RlKCksIHdzTm9ybWFpbGl6ZVZhbHVlLCBYRkFfRUxFTUVOVF9UZXh0KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOiB7DQorICAgICAgICBwV2lkZ2V0RGF0YS0+U2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKHdzTm9ybWFpbGl6ZVZhbHVlLCBiTm90aWZ5LCBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQ6DQorICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KA0KKyAgICAgICAgICAgIGRlZlZhbHVlLkdldE5vZGUoKSwgd3NOb3JtYWlsaXplVmFsdWUsIFhGQV9FTEVNRU5UX0RhdGVUaW1lKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQ6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsNCisgICAgICAgIHBXaWRnZXREYXRhLT5HZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOw0KKyAgICAgICAgaWYgKHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7DQorICAgICAgICAgIHBXaWRnZXREYXRhLT5Ob3JtYWxpemVOdW1TdHIod3NOb3JtYWlsaXplVmFsdWUsIHdzT3V0cHV0KTsNCisgICAgICAgICAgd3NOb3JtYWlsaXplVmFsdWUgPSB3c091dHB1dDsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmKGlDdXJSZXBlYXRJbmRleCA9PSAwICYmIGJBY2Nlc3NlZERhdGFET00gPT0gRkFMU0UpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlMaW1pdCA9IGlNYXg7DQotICAgICAgICAgICAgaWYgKHBJbnN0TWdyTm9kZSAmJiBwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgaUxpbWl0ID0gc3ViZm9ybUFycmF5LkdldFNpemUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKGlMaW1pdCA8IGlNaW4pIHsNCi0gICAgICAgICAgICAgICAgICAgIGlMaW1pdCA9IGlJbml0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZvciAoOyAoaUxpbWl0IDwgMCB8fCBpQ3VyUmVwZWF0SW5kZXggPCBpTGltaXQpOyBpQ3VyUmVwZWF0SW5kZXgrKykgew0KLSAgICAgICAgICAgICAgICBpZiAocEluc3RNZ3JOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFNlYXJjaEFycmF5ICYmIHBTZWFyY2hBcnJheS0+R2V0U2l6ZSgpIDwgMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpICE9IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZWFyY2hBcnJheSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZighWEZBX0RhdGFNZXJnZV9GaW5kRm9ybURPTUluc3RhbmNlKHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpLCBwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpLCBwRm9ybVBhcmVudE5vZGUpKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcEZvcm1QYXJlbnROb2RlLCBwVGVtcGxhdGVOb2RlLCBGQUxTRSwgcFNlYXJjaEFycmF5KTsNCi0gICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBTdWJmb3JtTm9kZSk7DQotICAgICAgICAgICAgICAgIGlmKCFwRmlyc3RJbnN0YW5jZSkgew0KLSAgICAgICAgICAgICAgICAgICAgcEZpcnN0SW5zdGFuY2UgPSBwU3ViZm9ybU5vZGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZm9yIChDWEZBX05vZGUgKnBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFhGQV9OZWVkR2VuZXJhdGVGb3JtKHBUZW1wbGF0ZUNoaWxkLCBiVXNlSW5zdGFuY2VNYW5hZ2VyKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFN1YmZvcm1Ob2RlLCBwVGVtcGxhdGVDaGlsZCwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYocFRlbXBsYXRlQ2hpbGQtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihwVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1Ob2RlLCBwRGF0YVNjb3BlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoDQorICAgICAgICAgICAgZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1haWxpemVWYWx1ZSwgWEZBX0VMRU1FTlRfRmxvYXQpOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CYXJjb2RlOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnV0dG9uOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0Og0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU2lnbmF0dXJlOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dEVkaXQ6DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoDQorICAgICAgICAgICAgZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1haWxpemVWYWx1ZSwgWEZBX0VMRU1FTlRfVGV4dCk7DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBpbnQzMl90IGlNaW5pbWFsTGltaXQgPSBpQ3VyUmVwZWF0SW5kZXggPT0gMCA/IGlJbml0IDogaU1pbjsNCi0gICAgZm9yICg7IGlDdXJSZXBlYXRJbmRleCA8IGlNaW5pbWFsTGltaXQ7IGlDdXJSZXBlYXRJbmRleCsrKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtU2V0Tm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcEZvcm1QYXJlbnROb2RlLCBwVGVtcGxhdGVOb2RlLCBGQUxTRSwgcFNlYXJjaEFycmF5KTsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwU3ViZm9ybVNldE5vZGUpOw0KLSAgICAgICAgaWYoIXBGaXJzdEluc3RhbmNlKSB7DQotICAgICAgICAgICAgcEZpcnN0SW5zdGFuY2UgPSBwU3ViZm9ybVNldE5vZGU7DQotICAgICAgICB9DQotICAgICAgICBGWF9CT09MIGJGb3VuZCA9IEZBTFNFOw0KLSAgICAgICAgZm9yIChDWEZBX05vZGUgKnBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsNCi0gICAgICAgICAgICAgICAgWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwU3ViZm9ybVNldE5vZGUsIHBUZW1wbGF0ZUNoaWxkLCBUUlVFKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYocFRlbXBsYXRlQ2hpbGQtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQotICAgICAgICAgICAgICAgIGlmKGJGb3VuZCAmJiBlUmVsYXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQ2hvaWNlKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHBUZW1wbGF0ZUNoaWxkLCBwU3ViZm9ybVNldE5vZGUsIHBEYXRhU2NvcGUsIEZBTFNFLCBiRGF0YU1lcmdlKTsNCi0gICAgICAgICAgICAgICAgYkZvdW5kID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIHBGaXJzdEluc3RhbmNlOw0KKyAgfQ0KIH0NCi1zdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0NvcHlDb250YWluZXJfRmllbGQoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsIENYRkFfTm9kZSogcEZvcm1Ob2RlLCBDWEZBX05vZGUqIHBEYXRhU2NvcGUsIEZYX0JPT0wgYkRhdGFNZXJnZSwgRlhfQk9PTCBiVXBMZXZlbCA9IFRSVUUpDQotew0KLSAgICBDWEZBX05vZGUqIHBGaWVsZE5vZGUgPSBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBGb3JtTm9kZSwgcFRlbXBsYXRlTm9kZSwgRkFMU0UpOw0KLSAgICBGWFNZU19hc3NlcnQocEZpZWxkTm9kZSk7DQotICAgIGZvciAoQ1hGQV9Ob2RlICpwVGVtcGxhdGVDaGlsZE5vZGUgPSBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBUZW1wbGF0ZUNoaWxkTm9kZTsgcFRlbXBsYXRlQ2hpbGROb2RlID0gcFRlbXBsYXRlQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpZihYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZE5vZGUpKSB7DQotICAgICAgICAgICAgWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwRmllbGROb2RlLCBwVGVtcGxhdGVDaGlsZE5vZGUsIFRSVUUpOw0KLSAgICAgICAgfSBlbHNlIGlmIChwVGVtcGxhdGVOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwICYmIHBUZW1wbGF0ZUNoaWxkTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCi0gICAgICAgICAgICBpZiAocFRlbXBsYXRlQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCi0gICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9Db3B5Q29udGFpbmVyX0ZpZWxkKHBEb2N1bWVudCwgcFRlbXBsYXRlQ2hpbGROb2RlLCBwRmllbGROb2RlLCBOVUxMLCBGQUxTRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KK3N0YXRpYyBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfR2V0R2xvYmFsQmluZGluZyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUhhc2gpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgcERvY3VtZW50LT5tX3JnR2xvYmFsQmluZGluZy5Mb29rdXAoZHdOYW1lSGFzaCwgcE5vZGUpOw0KKyAgcmV0dXJuIHBOb2RlOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX1JlZ2lzdGVyR2xvYmFsQmluZGluZyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSkgew0KKyAgcERvY3VtZW50LT5tX3JnR2xvYmFsQmluZGluZy5TZXRBdChkd05hbWVIYXNoLCBwRGF0YU5vZGUpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX0NsZWFyR2xvYmFsQmluZGluZyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsNCisgIHBEb2N1bWVudC0+bV9yZ0dsb2JhbEJpbmRpbmcuUmVtb3ZlQWxsKCk7DQorfQ0KK3N0YXRpYyBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfU2NvcGVNYXRjaEdsb2JhbEJpbmRpbmcoDQorICAgIENYRkFfTm9kZSogcERhdGFTY29wZSwNCisgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCwNCisgICAgWEZBX0VMRU1FTlQgZU1hdGNoRGF0YU5vZGVUeXBlLA0KKyAgICBGWF9CT09MIGJVcExldmVsID0gVFJVRSkgew0KKyAgZm9yIChDWEZBX05vZGUgKnBDdXJEYXRhU2NvcGUgPSBwRGF0YVNjb3BlLCAqcExhc3REYXRhU2NvcGUgPSBOVUxMOw0KKyAgICAgICBwQ3VyRGF0YVNjb3BlICYmIHBDdXJEYXRhU2NvcGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czsNCisgICAgICAgcExhc3REYXRhU2NvcGUgPSBwQ3VyRGF0YVNjb3BlLA0KKyAgICAgICAgICAgICAgICAgcEN1ckRhdGFTY29wZSA9DQorICAgICAgICAgICAgICAgICAgICAgcEN1ckRhdGFTY29wZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCisgICAgZm9yIChDWEZBX05vZGUqIHBEYXRhQ2hpbGQgPSBwQ3VyRGF0YVNjb3BlLT5HZXRGaXJzdENoaWxkQnlOYW1lKGR3TmFtZUhhc2gpOw0KKyAgICAgICAgIHBEYXRhQ2hpbGQ7DQorICAgICAgICAgcERhdGFDaGlsZCA9IHBEYXRhQ2hpbGQtPkdldE5leHRTYW1lTmFtZVNpYmxpbmcoZHdOYW1lSGFzaCkpIHsNCisgICAgICBpZiAocERhdGFDaGlsZCA9PSBwTGFzdERhdGFTY29wZSB8fA0KKyAgICAgICAgICAoZU1hdGNoRGF0YU5vZGVUeXBlICE9IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCAmJg0KKyAgICAgICAgICAgcERhdGFDaGlsZC0+R2V0Q2xhc3NJRCgpICE9IGVNYXRjaERhdGFOb2RlVHlwZSkgfHwNCisgICAgICAgICAgcERhdGFDaGlsZC0+SGFzQmluZEl0ZW0oKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBwRGF0YUNoaWxkOw0KICAgICB9DQotICAgIGlmKGJEYXRhTWVyZ2UpIHsNCi0gICAgICAgIEZYX0JPT0wgYkFjY2Vzc2VkRGF0YURPTSA9IEZBTFNFOw0KLSAgICAgICAgRlhfQk9PTCBiU2VsZk1hdGNoID0gRkFMU0U7DQotICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlQmluZE1hdGNoOw0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRNYXRjaGluZ0RhdGFOb2RlKHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZSwgcERhdGFTY29wZSwgYkFjY2Vzc2VkRGF0YURPTSwgVFJVRSwgTlVMTCwgYlNlbGZNYXRjaCwgZUJpbmRNYXRjaCwgYlVwTGV2ZWwpOw0KLSAgICAgICAgaWYocERhdGFOb2RlKSB7DQotICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRmllbGROb2RlLCBwRGF0YU5vZGUpOw0KKyAgICBmb3IgKENYRkFfTm9kZSogcERhdGFDaGlsZCA9DQorICAgICAgICAgICAgIHBDdXJEYXRhU2NvcGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0RhdGFHcm91cCk7DQorICAgICAgICAgcERhdGFDaGlsZDsgcERhdGFDaGlsZCA9IHBEYXRhQ2hpbGQtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9EYXRhR3JvdXApKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBYRkFfRGF0YU1lcmdlX1Njb3BlTWF0Y2hHbG9iYWxCaW5kaW5nKA0KKyAgICAgICAgICBwRGF0YUNoaWxkLCBkd05hbWVIYXNoLCBlTWF0Y2hEYXRhTm9kZVR5cGUsIEZBTFNFKTsNCisgICAgICBpZiAocERhdGFOb2RlKSB7DQorICAgICAgICByZXR1cm4gcERhdGFOb2RlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJVcExldmVsKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmRHbG9iYWxEYXRhTm9kZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZU1hdGNoTm9kZVR5cGUpIHsNCisgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPQ0KKyAgICAgIHdzTmFtZS5Jc0VtcHR5KCkgPyAwIDogRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NOYW1lLkdldExlbmd0aCgpKTsNCisgIGlmIChkd05hbWVIYXNoICE9IDApIHsNCisgICAgQ1hGQV9Ob2RlKiBwQm91bmRlZCA9IFhGQV9EYXRhTWVyZ2VfR2V0R2xvYmFsQmluZGluZyhwRG9jdW1lbnQsIGR3TmFtZUhhc2gpOw0KKyAgICBpZiAoIXBCb3VuZGVkKSB7DQorICAgICAgcEJvdW5kZWQgPSBYRkFfRGF0YU1lcmdlX1Njb3BlTWF0Y2hHbG9iYWxCaW5kaW5nKHBEYXRhU2NvcGUsIGR3TmFtZUhhc2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVNYXRjaE5vZGVUeXBlKTsNCisgICAgICBpZiAocEJvdW5kZWQpIHsNCisgICAgICAgIFhGQV9EYXRhTWVyZ2VfUmVnaXN0ZXJHbG9iYWxCaW5kaW5nKHBEb2N1bWVudCwgZHdOYW1lSGFzaCwgcEJvdW5kZWQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcEJvdW5kZWQ7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorc3RhdGljIENYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9GaW5kT25jZURhdGFOb2RlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlTWF0Y2hOb2RlVHlwZSkgew0KKyAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9DQorICAgICAgd3NOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgaWYgKGR3TmFtZUhhc2ggIT0gMCkgew0KKyAgICBmb3IgKENYRkFfTm9kZSAqcEN1ckRhdGFTY29wZSA9IHBEYXRhU2NvcGUsICpwTGFzdERhdGFTY29wZSA9IE5VTEw7DQorICAgICAgICAgcEN1ckRhdGFTY29wZSAmJg0KKyAgICAgICAgIHBDdXJEYXRhU2NvcGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czsNCisgICAgICAgICBwTGFzdERhdGFTY29wZSA9IHBDdXJEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgIHBDdXJEYXRhU2NvcGUgPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgcEN1ckRhdGFTY29wZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCisgICAgICBmb3IgKENYRkFfTm9kZSogcERhdGFDaGlsZCA9DQorICAgICAgICAgICAgICAgcEN1ckRhdGFTY29wZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShkd05hbWVIYXNoKTsNCisgICAgICAgICAgIHBEYXRhQ2hpbGQ7DQorICAgICAgICAgICBwRGF0YUNoaWxkID0gcERhdGFDaGlsZC0+R2V0TmV4dFNhbWVOYW1lU2libGluZyhkd05hbWVIYXNoKSkgew0KKyAgICAgICAgaWYgKHBEYXRhQ2hpbGQgPT0gcExhc3REYXRhU2NvcGUgfHwNCisgICAgICAgICAgICAoZU1hdGNoTm9kZVR5cGUgIT0gWEZBX0VMRU1FTlRfRGF0YU1vZGVsICYmDQorICAgICAgICAgICAgIHBEYXRhQ2hpbGQtPkdldENsYXNzSUQoKSAhPSBlTWF0Y2hOb2RlVHlwZSkgfHwNCisgICAgICAgICAgICBwRGF0YUNoaWxkLT5IYXNCaW5kSXRlbSgpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBEYXRhQ2hpbGQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorc3RhdGljIENYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVJlZkRhdGFOb2RlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzUmVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVNYXRjaE5vZGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvcmNlQmluZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXBMZXZlbCA9IFRSVUUpIHsNCisgIEZYX0RXT1JEIGRGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9CaW5kTmV3Ow0KKyAgaWYgKGJVcExldmVsIHx8IHdzUmVmICE9IEZYX1dTVFJDKEwibmFtZSIpKSB7DQorICAgIGRGbGFncyB8PSAoWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyk7DQorICB9DQorICBYRkFfUkVTT0xWRU5PREVfUlMgcnM7DQorICBwRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+UmVzb2x2ZU9iamVjdHMocERhdGFTY29wZSwgd3NSZWYsIHJzLCBkRmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlTm9kZSk7DQorICBpZiAocnMuZHdGbGFncyA9PSBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVBbGwgfHwNCisgICAgICBycy5kd0ZsYWdzID09IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU1pZEFsbCB8fA0KKyAgICAgIHJzLm5vZGVzLkdldFNpemUoKSA+IDEpIHsNCisgICAgcmV0dXJuIHBEb2N1bWVudC0+R2V0Tm90QmluZE5vZGUocnMubm9kZXMpOw0KKyAgfSBlbHNlIGlmIChycy5kd0ZsYWdzID09IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU9uZSkgew0KKyAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IChycy5ub2Rlcy5HZXRTaXplKCkgPiAwKSA/IHJzLm5vZGVzWzBdIDogTlVMTDsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9DQorICAgICAgICAocE9iamVjdCAmJiBwT2JqZWN0LT5Jc05vZGUoKSkgPyAoQ1hGQV9Ob2RlKilwT2JqZWN0IDogTlVMTDsNCisgICAgaWYgKCFiRm9yY2VCaW5kICYmIChwTm9kZSAhPSBOVUxMKSAmJiBwTm9kZS0+SGFzQmluZEl0ZW0oKSkgew0KKyAgICAgIHBOb2RlID0gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gcE5vZGU7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVDbGFzc0lELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUhhc2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCkgew0KKyAgQ1hGQV9Ob2RlKiBwRm9ybUNoaWxkID0gcEZvcm1QYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwRm9ybUNoaWxkOw0KKyAgICAgICBwRm9ybUNoaWxkID0gcEZvcm1DaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocEZvcm1DaGlsZC0+R2V0Q2xhc3NJRCgpID09IGVDbGFzc0lEICYmDQorICAgICAgICBwRm9ybUNoaWxkLT5HZXROYW1lSGFzaCgpID09IGR3TmFtZUhhc2ggJiYNCisgICAgICAgIHBGb3JtQ2hpbGQtPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpKSB7DQorICAgICAgcmV0dXJuIHBGb3JtQ2hpbGQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfTmVlZEdlbmVyYXRlRm9ybShDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZUluc3RhbmNlTWFuYWdlciA9IFRSVUUpIHsNCisgIFhGQV9FTEVNRU5UIGVUeXBlID0gcFRlbXBsYXRlQ2hpbGQtPkdldENsYXNzSUQoKTsNCisgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAocFRlbXBsYXRlQ2hpbGQtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9Qcm90byB8fA0KKyAgICAgIChiVXNlSW5zdGFuY2VNYW5hZ2VyICYmIGVUeXBlID09IFhGQV9FTEVNRU5UX09jY3VyKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorQ1hGQV9Ob2RlKiBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBGb3JtUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVjdXJzaXZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkqIHBTdWJmb3JtQXJyYXkpIHsNCisgIENYRkFfTm9kZSogcEV4aXN0aW5nTm9kZSA9IE5VTEw7DQorICBpZiAocFN1YmZvcm1BcnJheSA9PSBOVUxMKSB7DQorICAgIHBFeGlzdGluZ05vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UoDQorICAgICAgICBwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGUtPkdldENsYXNzSUQoKSwgcFRlbXBsYXRlTm9kZS0+R2V0TmFtZUhhc2goKSwNCisgICAgICAgIHBGb3JtUGFyZW50KTsNCisgIH0gZWxzZSBpZiAocFN1YmZvcm1BcnJheS0+R2V0U2l6ZSgpID4gMCkgew0KKyAgICBwRXhpc3RpbmdOb2RlID0gcFN1YmZvcm1BcnJheS0+R2V0QXQoMCk7DQorICAgIHBTdWJmb3JtQXJyYXktPlJlbW92ZUF0KDApOw0KKyAgfQ0KKyAgaWYgKHBFeGlzdGluZ05vZGUpIHsNCisgICAgaWYgKHBTdWJmb3JtQXJyYXkpIHsNCisgICAgICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocEV4aXN0aW5nTm9kZSk7DQorICAgIH0gZWxzZSBpZiAocEV4aXN0aW5nTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICBwRm9ybVBhcmVudC0+UmVtb3ZlQ2hpbGQocEV4aXN0aW5nTm9kZSk7DQorICAgICAgcEZvcm1QYXJlbnQtPkluc2VydENoaWxkKHBFeGlzdGluZ05vZGUpOw0KKyAgICB9DQorICAgIHBFeGlzdGluZ05vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCisgICAgcEV4aXN0aW5nTm9kZS0+U2V0VGVtcGxhdGVOb2RlKHBUZW1wbGF0ZU5vZGUpOw0KKyAgICBpZiAoYlJlY3Vyc2l2ZSAmJiBwRXhpc3RpbmdOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCisgICAgICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQ0KKyAgICAgICAgICAgICAgIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgaWYgKFhGQV9OZWVkR2VuZXJhdGVGb3JtKHBUZW1wbGF0ZUNoaWxkKSkgew0KKyAgICAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBFeGlzdGluZ05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkLCBiUmVjdXJzaXZlKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgcEV4aXN0aW5nTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICByZXR1cm4gcEV4aXN0aW5nTm9kZTsNCisgIH0NCisgIENYRkFfTm9kZSogcE5ld05vZGUgPSBwVGVtcGxhdGVOb2RlLT5DbG9uZVRlbXBsYXRlVG9Gb3JtKEZBTFNFKTsNCisgIHBGb3JtUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3Tm9kZSwgTlVMTCk7DQorICBpZiAoYlJlY3Vyc2l2ZSkgew0KKyAgICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQ0KKyAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCkpIHsNCisgICAgICAgIENYRkFfTm9kZSogcE5ld0NoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkNsb25lVGVtcGxhdGVUb0Zvcm0oVFJVRSk7DQorICAgICAgICBwTmV3Tm9kZS0+SW5zZXJ0Q2hpbGQocE5ld0NoaWxkLCBOVUxMKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBwTmV3Tm9kZTsNCit9DQorc3RhdGljIENYRkFfTm9kZSogWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VJbnN0YW5jZU1hbmFnZXIoDQorICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCwNCisgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLA0KKyAgICBDWEZBX05vZGVBcnJheSYgc3ViZm9ybXMpIHsNCisgIENGWF9XaWRlU3RyaW5nQyB3c1N1YmZvcm1OYW1lID0gcFRlbXBsYXRlTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzSW5zdE1nck5vZGVOYW1lID0gRlhfV1NUUkMoTCJfIikgKyB3c1N1YmZvcm1OYW1lOw0KKyAgRlhfRFdPUkQgZHdJbnN0TmFtZUhhc2ggPQ0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzSW5zdE1nck5vZGVOYW1lLCB3c0luc3RNZ3JOb2RlTmFtZS5HZXRMZW5ndGgoKSk7DQorICBDWEZBX05vZGUqIHBFeGlzdGluZ05vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UoDQorICAgICAgcERvY3VtZW50LCBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIsIGR3SW5zdE5hbWVIYXNoLCBwRm9ybVBhcmVudCk7DQorICBpZiAocEV4aXN0aW5nTm9kZSkgew0KKyAgICBGWF9EV09SRCBkd05hbWVIYXNoID0gcFRlbXBsYXRlTm9kZS0+R2V0TmFtZUhhc2goKTsNCisgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0NCisgICAgICAgICAgICAgcEV4aXN0aW5nTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICBwTm9kZTspIHsNCisgICAgICBYRkFfRUxFTUVOVCBlQ3VyVHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgICAgaWYgKGVDdXJUeXBlID09IFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcikgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmICgoZUN1clR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgJiYNCisgICAgICAgICAgKGVDdXJUeXBlICE9IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpKSB7DQorICAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChkd05hbWVIYXNoICE9IHBOb2RlLT5HZXROYW1lSGFzaCgpKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgQ1hGQV9Ob2RlKiBwTmV4dE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICBwRm9ybVBhcmVudC0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KKyAgICAgIHN1YmZvcm1zLkFkZChwTm9kZSk7DQorICAgICAgcE5vZGUgPSBwTmV4dE5vZGU7DQorICAgIH0NCisgICAgcEZvcm1QYXJlbnQtPlJlbW92ZUNoaWxkKHBFeGlzdGluZ05vZGUpOw0KKyAgICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocEV4aXN0aW5nTm9kZSk7DQorICAgIHBFeGlzdGluZ05vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCisgICAgcEV4aXN0aW5nTm9kZS0+U2V0VGVtcGxhdGVOb2RlKHBUZW1wbGF0ZU5vZGUpOw0KKyAgICByZXR1cm4gcEV4aXN0aW5nTm9kZTsNCisgIH0NCisgIENYRkFfTm9kZSogcE5ld05vZGUgPSBwRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCktPkNyZWF0ZU5vZGUoDQorICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpOw0KKyAgRlhTWVNfYXNzZXJ0KHBOZXdOb2RlKTsNCisgIHdzSW5zdE1nck5vZGVOYW1lID0NCisgICAgICBGWF9XU1RSQyhMIl8iKSArIHBUZW1wbGF0ZU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICBwTmV3Tm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c0luc3RNZ3JOb2RlTmFtZSk7DQorICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld05vZGUsIE5VTEwpOw0KKyAgcE5ld05vZGUtPlNldFRlbXBsYXRlTm9kZShwVGVtcGxhdGVOb2RlKTsNCisgIHJldHVybiBwTmV3Tm9kZTsNCit9DQorc3RhdGljIENYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9GaW5kTWF0Y2hpbmdEYXRhTm9kZSgNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsDQorICAgIENYRkFfTm9kZSogcERhdGFTY29wZSwNCisgICAgRlhfQk9PTCYgYkFjY2Vzc2VkRGF0YURPTSwNCisgICAgRlhfQk9PTCBiRm9yY2VCaW5kLA0KKyAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4qDQorICAgICAgICBwSXRlcmF0b3IsDQorICAgIEZYX0JPT0wmIGJTZWxmTWF0Y2gsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNJiBlQmluZE1hdGNoLA0KKyAgICBGWF9CT09MIGJVcExldmVsID0gVFJVRSkgew0KKyAgRlhfQk9PTCBiT3duSXRlcmF0b3IgPSBGQUxTRTsNCisgIGlmICghcEl0ZXJhdG9yKSB7DQorICAgIGJPd25JdGVyYXRvciA9IFRSVUU7DQorICAgIHBJdGVyYXRvciA9IEZYX05FVyBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPA0KKyAgICAgICAgQ1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4ocFRlbXBsYXRlTm9kZSk7DQorICB9DQorICBDWEZBX05vZGUqIHBSZXN1bHQgPSBOVUxMOw0KKyAgZm9yIChDWEZBX05vZGUqIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPkdldEN1cnJlbnQoKTsNCisgICAgICAgcEN1clRlbXBsYXRlTm9kZTspIHsNCisgICAgWEZBX0VMRU1FTlQgZU1hdGNoTm9kZVR5cGU7DQorICAgIHN3aXRjaCAocEN1clRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KKyAgICAgICAgZU1hdGNoTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhR3JvdXA7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ZpZWxkOiB7DQorICAgICAgICBlTWF0Y2hOb2RlVHlwZSA9IFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KHBDdXJUZW1wbGF0ZU5vZGUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFhGQV9FTEVNRU5UX0RhdGFHcm91cA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCisgICAgICAgIGVNYXRjaE5vZGVUeXBlID0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZU9jY3VyID0NCisgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX09jY3VyKTsNCisgICAgaW50MzJfdCBpTWluLCBpTWF4LCBpSW5pdDsNCisgICAgaWYgKHBUZW1wbGF0ZU5vZGVPY2N1ciAmJg0KKyAgICAgICAgWEZBX0dldE9jY3VySW5mbyhwVGVtcGxhdGVOb2RlT2NjdXIsIGlNaW4sIGlNYXgsIGlJbml0KSAmJiBpTWF4ID09IDApIHsNCisgICAgICBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlQmluZCA9DQorICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9CaW5kKTsNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZU1hdGNoID0NCisgICAgICAgIHBUZW1wbGF0ZU5vZGVCaW5kID8gcFRlbXBsYXRlTm9kZUJpbmQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9NYXRjaCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fT25jZTsNCisgICAgZUJpbmRNYXRjaCA9IGVNYXRjaDsNCisgICAgc3dpdGNoIChlTWF0Y2gpIHsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6DQorICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0dsb2JhbDoNCisgICAgICAgIGJBY2Nlc3NlZERhdGFET00gPSBUUlVFOw0KKyAgICAgICAgaWYgKCFiRm9yY2VCaW5kKSB7DQorICAgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoZU1hdGNoTm9kZVR5cGUgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlIHx8DQorICAgICAgICAgICAgKGVNYXRjaE5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFHcm91cCAmJg0KKyAgICAgICAgICAgICBYRkFfRmllbGRJc011bHRpTGlzdEJveChwVGVtcGxhdGVOb2RlQmluZCkpKSB7DQorICAgICAgICAgIENYRkFfTm9kZSogcEdsb2JhbEJpbmROb2RlID0gWEZBX0RhdGFNZXJnZV9GaW5kR2xvYmFsRGF0YU5vZGUoDQorICAgICAgICAgICAgICBwRG9jdW1lbnQsIHBDdXJUZW1wbGF0ZU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSksDQorICAgICAgICAgICAgICBwRGF0YVNjb3BlLCBlTWF0Y2hOb2RlVHlwZSk7DQorICAgICAgICAgIGlmICghcEdsb2JhbEJpbmROb2RlKSB7DQorICAgICAgICAgICAgcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBSZXN1bHQgPSBwR2xvYmFsQmluZE5vZGU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fT25jZTogew0KKyAgICAgICAgYkFjY2Vzc2VkRGF0YURPTSA9IFRSVUU7DQorICAgICAgICBDWEZBX05vZGUqIHBPbmNlQmluZE5vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRPbmNlRGF0YU5vZGUoDQorICAgICAgICAgICAgcERvY3VtZW50LCBwQ3VyVGVtcGxhdGVOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpLA0KKyAgICAgICAgICAgIHBEYXRhU2NvcGUsIGVNYXRjaE5vZGVUeXBlKTsNCisgICAgICAgIGlmICghcE9uY2VCaW5kTm9kZSkgew0KKyAgICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFJlc3VsdCA9IHBPbmNlQmluZE5vZGU7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWY6IHsNCisgICAgICAgIGJBY2Nlc3NlZERhdGFET00gPSBUUlVFOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YVJlZkJpbmROb2RlID0gWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVJlZkRhdGFOb2RlKA0KKyAgICAgICAgICAgIHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZUJpbmQtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfUmVmKSwNCisgICAgICAgICAgICBwRGF0YVNjb3BlLCBlTWF0Y2hOb2RlVHlwZSwgcFRlbXBsYXRlTm9kZSwgYkZvcmNlQmluZCwgYlVwTGV2ZWwpOw0KKyAgICAgICAgaWYgKHBEYXRhUmVmQmluZE5vZGUgJiYNCisgICAgICAgICAgICBwRGF0YVJlZkJpbmROb2RlLT5HZXRDbGFzc0lEKCkgPT0gZU1hdGNoTm9kZVR5cGUpIHsNCisgICAgICAgICAgcFJlc3VsdCA9IHBEYXRhUmVmQmluZE5vZGU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIXBSZXN1bHQpIHsNCisgICAgICAgICAgcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+U2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAocEN1clRlbXBsYXRlTm9kZSA9PSBwVGVtcGxhdGVOb2RlICYmIHBSZXN1bHQgIT0gTlVMTCkgew0KKyAgICAgIGJTZWxmTWF0Y2ggPSBUUlVFOw0KKyAgICB9DQorICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKGJPd25JdGVyYXRvcikgew0KKyAgICBkZWxldGUgcEl0ZXJhdG9yOw0KKyAgfQ0KKyAgcmV0dXJuIHBSZXN1bHQ7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9EYXRhTWVyZ2VfU29ydFJlY3Vyc2VSZWNvcmQoDQorICAgIENGWF9BcnJheVRlbXBsYXRlPFhGQV9EYXRhTWVyZ2VfUmVjdXJzZVJlY29yZD4mIHJnUmVjb3JkcywNCisgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLA0KKyAgICBGWF9CT09MIGJDaG9pY2VNb2RlID0gRkFMU0UpIHsNCisgIGludDMyX3QgaUNvdW50ID0gcmdSZWNvcmRzLkdldFNpemUoKTsNCisgIENGWF9BcnJheVRlbXBsYXRlPFhGQV9EYXRhTWVyZ2VfUmVjdXJzZVJlY29yZD4gcmdSZXN1bHRSZWNvcmQ7DQorICBmb3IgKENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBEYXRhU2NvcGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgcENoaWxkTm9kZTsNCisgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcmdSZWNvcmRzW2ldLnBEYXRhQ2hpbGQ7DQorICAgICAgaWYgKHBDaGlsZE5vZGUgPT0gcE5vZGUpIHsNCisgICAgICAgIFhGQV9EYXRhTWVyZ2VfUmVjdXJzZVJlY29yZCBzTmV3UmVjb3JkID0ge3JnUmVjb3Jkc1tpXS5wVGVtcGxhdGVDaGlsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlfTsNCisgICAgICAgIHJnUmVzdWx0UmVjb3JkLkFkZChzTmV3UmVjb3JkKTsNCisgICAgICAgIHJnUmVjb3Jkcy5SZW1vdmVBdChpKTsNCisgICAgICAgIGlDb3VudC0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiQ2hvaWNlTW9kZSAmJiByZ1Jlc3VsdFJlY29yZC5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChyZ1Jlc3VsdFJlY29yZC5HZXRTaXplKCkgPiAwKSB7DQorICAgIGlmICghYkNob2ljZU1vZGUpIHsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgWEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkIHNOZXdSZWNvcmQgPSB7cmdSZWNvcmRzW2ldLnBUZW1wbGF0ZUNoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdSZWNvcmRzW2ldLnBEYXRhQ2hpbGR9Ow0KKyAgICAgICAgcmdSZXN1bHRSZWNvcmQuQWRkKHNOZXdSZWNvcmQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZ1JlY29yZHMuUmVtb3ZlQWxsKCk7DQorICAgIHJnUmVjb3Jkcy5Db3B5KHJnUmVzdWx0UmVjb3JkKTsNCisgIH0NCit9DQorc3RhdGljIENYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9Db3B5Q29udGFpbmVyX1N1YmZvcm1TZXQoDQorICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLA0KKyAgICBDWEZBX05vZGUqIHBGb3JtUGFyZW50Tm9kZSwNCisgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLA0KKyAgICBGWF9CT09MIGJPbmVJbnN0YW5jZSwNCisgICAgRlhfQk9PTCBiRGF0YU1lcmdlKSB7DQorICBYRkFfRUxFTUVOVCBlRWxlbWVudCA9IHBUZW1wbGF0ZU5vZGUtPkdldENsYXNzSUQoKTsNCisgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IE5VTEw7DQorICBDWEZBX05vZGUqIHBGaXJzdEluc3RhbmNlID0gTlVMTDsNCisgIEZYX0JPT0wgYlVzZUluc3RhbmNlTWFuYWdlciA9DQorICAgICAgcEZvcm1QYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfQXJlYTsNCisgIENYRkFfTm9kZSogcEluc3RNZ3JOb2RlID0gTlVMTDsNCisgIENYRkFfTm9kZUFycmF5IHN1YmZvcm1BcnJheTsNCisgIENYRkFfTm9kZUFycmF5KiBwU2VhcmNoQXJyYXkgPSBOVUxMOw0KKyAgaWYgKCFiT25lSW5zdGFuY2UgJiYNCisgICAgICAoZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCB8fCBlRWxlbWVudCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSkgew0KKyAgICBwSW5zdE1nck5vZGUgPQ0KKyAgICAgICAgYlVzZUluc3RhbmNlTWFuYWdlcg0KKyAgICAgICAgICAgID8gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VJbnN0YW5jZU1hbmFnZXIoDQorICAgICAgICAgICAgICAgICAgcERvY3VtZW50LCBwRm9ybVBhcmVudE5vZGUsIHBUZW1wbGF0ZU5vZGUsIHN1YmZvcm1BcnJheSkNCisgICAgICAgICAgICA6IE5VTEw7DQorICAgIGlmIChDWEZBX05vZGUqIHBPY2N1clRlbXBsYXRlTm9kZSA9DQorICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpKSB7DQorICAgICAgcE9jY3VyTm9kZSA9IHBJbnN0TWdyTm9kZSAhPSBOVUxMDQorICAgICAgICAgICAgICAgICAgICAgICA/IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERvY3VtZW50LCBwSW5zdE1nck5vZGUsIHBPY2N1clRlbXBsYXRlTm9kZSwgRkFMU0UpDQorICAgICAgICAgICAgICAgICAgICAgICA6IHBPY2N1clRlbXBsYXRlTm9kZTsNCisgICAgfSBlbHNlIGlmIChwSW5zdE1nck5vZGUpIHsNCisgICAgICBwT2NjdXJOb2RlID0gcEluc3RNZ3JOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQorICAgICAgaWYgKHBPY2N1ck5vZGUpIHsNCisgICAgICAgIHBPY2N1ck5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBJbnN0TWdyTm9kZSkgew0KKyAgICAgIHBJbnN0TWdyTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICAgIHBTZWFyY2hBcnJheSA9ICZzdWJmb3JtQXJyYXk7DQorICAgICAgaWYgKHBGb3JtUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICBiT25lSW5zdGFuY2UgPSBUUlVFOw0KKyAgICAgICAgaWYgKHN1YmZvcm1BcnJheS5HZXRTaXplKCkgPCAxKSB7DQorICAgICAgICAgIHBTZWFyY2hBcnJheSA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmICgocFRlbXBsYXRlTm9kZS0+R2V0TmFtZUhhc2goKSA9PSAwKSAmJg0KKyAgICAgICAgICAgICAgICAgKHN1YmZvcm1BcnJheS5HZXRTaXplKCkgPCAxKSkgew0KKyAgICAgICAgcFNlYXJjaEFycmF5ID0gTlVMTDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaU1heCA9IDEsIGlJbml0ID0gMSwgaU1pbiA9IDE7DQorICBpZiAoIWJPbmVJbnN0YW5jZSkgew0KKyAgICBYRkFfR2V0T2NjdXJJbmZvKHBPY2N1ck5vZGUsIGlNaW4sIGlNYXgsIGlJbml0KTsNCisgIH0NCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVSZWxhdGlvbiA9DQorICAgICAgZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldA0KKyAgICAgICAgICA/IHBUZW1wbGF0ZU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9SZWxhdGlvbikNCisgICAgICAgICAgOiBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkOw0KKyAgaW50MzJfdCBpQ3VyUmVwZWF0SW5kZXggPSAwOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZVBhcmVudEJpbmRNYXRjaCA9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorICBpZiAoYkRhdGFNZXJnZSkgew0KKyAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGU+DQorICAgICAgICBzTm9kZUl0ZXJhdG9yKHBUZW1wbGF0ZU5vZGUpOw0KKyAgICBGWF9CT09MIGJBY2Nlc3NlZERhdGFET00gPSBGQUxTRTsNCisgICAgaWYgKGVFbGVtZW50ID09IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQgfHwgZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfQXJlYSkgew0KKyAgICAgIHNOb2RlSXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX01hdGNoTm9uZUNyZWF0ZUNoaWxkKHBGaWVsZE5vZGUpOw0KKyAgICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxDWEZBX05vZGUqLCBDWEZBX05vZGUqPiBzdWJmb3JtTWFwQXJyYXk7DQorICAgICAgQ1hGQV9Ob2RlQXJyYXkgc3ViZm9ybUFycmF5Ow0KKyAgICAgIGZvciAoOyBpTWF4IDwgMCB8fCBpQ3VyUmVwZWF0SW5kZXggPCBpTWF4OyBpQ3VyUmVwZWF0SW5kZXgrKykgew0KKyAgICAgICAgRlhfQk9PTCBiU2VsZk1hdGNoID0gRkFMU0U7DQorICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlQmluZE1hdGNoID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gWEZBX0RhdGFNZXJnZV9GaW5kTWF0Y2hpbmdEYXRhTm9kZSgNCisgICAgICAgICAgICBwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGUsIHBEYXRhU2NvcGUsIGJBY2Nlc3NlZERhdGFET00sIEZBTFNFLA0KKyAgICAgICAgICAgICZzTm9kZUl0ZXJhdG9yLCBiU2VsZk1hdGNoLCBlQmluZE1hdGNoKTsNCisgICAgICAgIGlmICghcERhdGFOb2RlIHx8IHNOb2RlSXRlcmF0b3IuR2V0Q3VycmVudCgpICE9IHBUZW1wbGF0ZU5vZGUpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBlUGFyZW50QmluZE1hdGNoID0gZUJpbmRNYXRjaDsNCisgICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIoDQorICAgICAgICAgICAgcERvY3VtZW50LCBwRm9ybVBhcmVudE5vZGUsIHBUZW1wbGF0ZU5vZGUsIEZBTFNFLCBwU2VhcmNoQXJyYXkpOw0KKyAgICAgICAgaWYgKCFwRmlyc3RJbnN0YW5jZSkgew0KKyAgICAgICAgICBwRmlyc3RJbnN0YW5jZSA9IHBTdWJmb3JtTm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocFN1YmZvcm1Ob2RlLCBwRGF0YU5vZGUpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBTdWJmb3JtTm9kZSk7DQorICAgICAgICBzdWJmb3JtTWFwQXJyYXkuU2V0QXQocFN1YmZvcm1Ob2RlLCBwRGF0YU5vZGUpOw0KKyAgICAgICAgc3ViZm9ybUFycmF5LkFkZChwU3ViZm9ybU5vZGUpOw0KKyAgICAgIH0NCisgICAgICBGWF9QT1NJVElPTiBwb3NpdGlvbiA9IHN1YmZvcm1NYXBBcnJheS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgICAgZm9yIChpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IHN1YmZvcm1BcnJheS5HZXRTaXplKCk7IGlJbmRleCsrKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtID0gc3ViZm9ybUFycmF5W2lJbmRleF07DQorICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IChDWEZBX05vZGUqKXN1YmZvcm1NYXBBcnJheS5HZXRWYWx1ZUF0KHBTdWJmb3JtKTsNCisgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCA9DQorICAgICAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsNCisgICAgICAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBTdWJmb3JtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkLCBUUlVFKTsNCisgICAgICAgICAgfSBlbHNlIGlmIChwVGVtcGxhdGVDaGlsZC0+R2V0T2JqZWN0VHlwZSgpID09DQorICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRlbXBsYXRlQ2hpbGQsIHBTdWJmb3JtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlLCBGQUxTRSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHN1YmZvcm1NYXBBcnJheS5SZW1vdmVBbGwoKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gcEZpZWxkTm9kZTsNCisgICAgZm9yICg7IGlNYXggPCAwIHx8IGlDdXJSZXBlYXRJbmRleCA8IGlNYXg7IGlDdXJSZXBlYXRJbmRleCsrKSB7DQorICAgICAgRlhfQk9PTCBiU2VsZk1hdGNoID0gRkFMU0U7DQorICAgICAgQ1hGQV9Ob2RlKiBwT2xkTm9kZSA9IHNOb2RlSXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVCaW5kTWF0Y2ggPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgICAgIGlmICghWEZBX0RhdGFNZXJnZV9GaW5kTWF0Y2hpbmdEYXRhTm9kZSgNCisgICAgICAgICAgICAgIHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZSwgcERhdGFTY29wZSwgYkFjY2Vzc2VkRGF0YURPTSwgRkFMU0UsDQorICAgICAgICAgICAgICAmc05vZGVJdGVyYXRvciwgYlNlbGZNYXRjaCwgZUJpbmRNYXRjaCkpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAoZUJpbmRNYXRjaCA9PSBYRkFfQVRUUklCVVRFRU5VTV9EYXRhUmVmICYmDQorICAgICAgICAgIGVQYXJlbnRCaW5kTWF0Y2ggPT0gWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZikgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChlUmVsYXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQ2hvaWNlIHx8DQorICAgICAgICAgIGVSZWxhdGlvbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9Vbm9yZGVyZWQpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm1TZXROb2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIoDQorICAgICAgICAgICAgcERvY3VtZW50LCBwRm9ybVBhcmVudE5vZGUsIHBUZW1wbGF0ZU5vZGUsIEZBTFNFLCBwU2VhcmNoQXJyYXkpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBTdWJmb3JtU2V0Tm9kZSk7DQorICAgICAgICBpZiAoIXBGaXJzdEluc3RhbmNlKSB7DQorICAgICAgICAgIHBGaXJzdEluc3RhbmNlID0gcFN1YmZvcm1TZXROb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8WEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkPiByZ0l0ZW1NYXRjaExpc3Q7DQorICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX05vZGUqPiByZ0l0ZW1Vbm1hdGNoTGlzdDsNCisgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCA9DQorICAgICAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsNCisgICAgICAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBTdWJmb3JtU2V0Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGVDaGlsZCwgVFJVRSk7DQorICAgICAgICAgIH0gZWxzZSBpZiAocFRlbXBsYXRlQ2hpbGQtPkdldE9iamVjdFR5cGUoKSA9PQ0KKyAgICAgICAgICAgICAgICAgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhTWF0Y2g7DQorICAgICAgICAgICAgYlNlbGZNYXRjaCA9IEZBTFNFOw0KKyAgICAgICAgICAgIGVCaW5kTWF0Y2ggPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgICAgICAgICAgIGlmIChlUmVsYXRpb24gIT0gWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZCAmJg0KKyAgICAgICAgICAgICAgICAocERhdGFNYXRjaCA9IFhGQV9EYXRhTWVyZ2VfRmluZE1hdGNoaW5nRGF0YU5vZGUoDQorICAgICAgICAgICAgICAgICAgICAgcERvY3VtZW50LCBwVGVtcGxhdGVDaGlsZCwgcERhdGFTY29wZSwgYkFjY2Vzc2VkRGF0YURPTSwNCisgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgTlVMTCwgYlNlbGZNYXRjaCwgZUJpbmRNYXRjaCkpKSB7DQorICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX1JlY3Vyc2VSZWNvcmQgc05ld1JlY29yZCA9IHtwVGVtcGxhdGVDaGlsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhTWF0Y2h9Ow0KKyAgICAgICAgICAgICAgaWYgKGJTZWxmTWF0Y2gpIHsNCisgICAgICAgICAgICAgICAgcmdJdGVtTWF0Y2hMaXN0Lkluc2VydEF0KDAsIHNOZXdSZWNvcmQpOw0KKyAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcmdJdGVtTWF0Y2hMaXN0LkFkZChzTmV3UmVjb3JkKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmdJdGVtVW5tYXRjaExpc3QuQWRkKHBUZW1wbGF0ZUNoaWxkKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAoZVJlbGF0aW9uKSB7DQorICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2hvaWNlOiB7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHJnSXRlbU1hdGNoTGlzdC5HZXRTaXplKCkpOw0KKyAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfU29ydFJlY3Vyc2VSZWNvcmQocmdJdGVtTWF0Y2hMaXN0LCBwRGF0YVNjb3BlLCBUUlVFKTsNCisgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKA0KKyAgICAgICAgICAgICAgICByZ0l0ZW1NYXRjaExpc3RbMF0ucFRlbXBsYXRlQ2hpbGQsIHBTdWJmb3JtU2V0Tm9kZSwgcERhdGFTY29wZSk7DQorICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVW5vcmRlcmVkOiB7DQorICAgICAgICAgICAgaWYgKHJnSXRlbU1hdGNoTGlzdC5HZXRTaXplKCkpIHsNCisgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfU29ydFJlY3Vyc2VSZWNvcmQocmdJdGVtTWF0Y2hMaXN0LCBwRGF0YVNjb3BlKTsNCisgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgY291bnQgPSByZ0l0ZW1NYXRjaExpc3QuR2V0U2l6ZSgpOyBpIDwgY291bnQ7DQorICAgICAgICAgICAgICAgICAgIGkrKykgew0KKyAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKA0KKyAgICAgICAgICAgICAgICAgICAgcmdJdGVtTWF0Y2hMaXN0W2ldLnBUZW1wbGF0ZUNoaWxkLCBwU3ViZm9ybVNldE5vZGUsDQorICAgICAgICAgICAgICAgICAgICBwRGF0YVNjb3BlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBjb3VudCA9IHJnSXRlbVVubWF0Y2hMaXN0LkdldFNpemUoKTsgaSA8IGNvdW50Ow0KKyAgICAgICAgICAgICAgICAgaSsrKSB7DQorICAgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHJnSXRlbVVubWF0Y2hMaXN0W2ldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3ViZm9ybVNldE5vZGUsIHBEYXRhU2NvcGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybVNldE5vZGUgPSBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcigNCisgICAgICAgICAgICBwRG9jdW1lbnQsIHBGb3JtUGFyZW50Tm9kZSwgcFRlbXBsYXRlTm9kZSwgRkFMU0UsIHBTZWFyY2hBcnJheSk7DQorICAgICAgICBGWFNZU19hc3NlcnQocFN1YmZvcm1TZXROb2RlKTsNCisgICAgICAgIGlmICghcEZpcnN0SW5zdGFuY2UpIHsNCisgICAgICAgICAgcEZpcnN0SW5zdGFuY2UgPSBwU3ViZm9ybVNldE5vZGU7DQorICAgICAgICB9DQorICAgICAgICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQ0KKyAgICAgICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICBpZiAoWEZBX05lZWRHZW5lcmF0ZUZvcm0ocFRlbXBsYXRlQ2hpbGQsIGJVc2VJbnN0YW5jZU1hbmFnZXIpKSB7DQorICAgICAgICAgICAgWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwU3ViZm9ybVNldE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlQ2hpbGQsIFRSVUUpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHBUZW1wbGF0ZUNoaWxkLT5HZXRPYmplY3RUeXBlKCkgPT0NCisgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihwVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1TZXROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTY29wZSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlDdXJSZXBlYXRJbmRleCA9PSAwICYmIGJBY2Nlc3NlZERhdGFET00gPT0gRkFMU0UpIHsNCisgICAgICBpbnQzMl90IGlMaW1pdCA9IGlNYXg7DQorICAgICAgaWYgKHBJbnN0TWdyTm9kZSAmJiBwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpID09IDApIHsNCisgICAgICAgIGlMaW1pdCA9IHN1YmZvcm1BcnJheS5HZXRTaXplKCk7DQorICAgICAgICBpZiAoaUxpbWl0IDwgaU1pbikgew0KKyAgICAgICAgICBpTGltaXQgPSBpSW5pdDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZm9yICg7IChpTGltaXQgPCAwIHx8IGlDdXJSZXBlYXRJbmRleCA8IGlMaW1pdCk7IGlDdXJSZXBlYXRJbmRleCsrKSB7DQorICAgICAgICBpZiAocEluc3RNZ3JOb2RlKSB7DQorICAgICAgICAgIGlmIChwU2VhcmNoQXJyYXkgJiYgcFNlYXJjaEFycmF5LT5HZXRTaXplKCkgPCAxKSB7DQorICAgICAgICAgICAgaWYgKHBUZW1wbGF0ZU5vZGUtPkdldE5hbWVIYXNoKCkgIT0gMCkgew0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBTZWFyY2hBcnJheSA9IE5VTEw7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoIVhGQV9EYXRhTWVyZ2VfRmluZEZvcm1ET01JbnN0YW5jZSgNCisgICAgICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0TmFtZUhhc2goKSwgcEZvcm1QYXJlbnROb2RlKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIoDQorICAgICAgICAgICAgcERvY3VtZW50LCBwRm9ybVBhcmVudE5vZGUsIHBUZW1wbGF0ZU5vZGUsIEZBTFNFLCBwU2VhcmNoQXJyYXkpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBTdWJmb3JtTm9kZSk7DQorICAgICAgICBpZiAoIXBGaXJzdEluc3RhbmNlKSB7DQorICAgICAgICAgIHBGaXJzdEluc3RhbmNlID0gcFN1YmZvcm1Ob2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0NCisgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgaWYgKFhGQV9OZWVkR2VuZXJhdGVGb3JtKHBUZW1wbGF0ZUNoaWxkLCBiVXNlSW5zdGFuY2VNYW5hZ2VyKSkgew0KKyAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFN1YmZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkLCBUUlVFKTsNCisgICAgICAgICAgfSBlbHNlIGlmIChwVGVtcGxhdGVDaGlsZC0+R2V0T2JqZWN0VHlwZSgpID09DQorICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRlbXBsYXRlQ2hpbGQsIHBTdWJmb3JtTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2NvcGUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpbnQzMl90IGlNaW5pbWFsTGltaXQgPSBpQ3VyUmVwZWF0SW5kZXggPT0gMCA/IGlJbml0IDogaU1pbjsNCisgIGZvciAoOyBpQ3VyUmVwZWF0SW5kZXggPCBpTWluaW1hbExpbWl0OyBpQ3VyUmVwZWF0SW5kZXgrKykgew0KKyAgICBDWEZBX05vZGUqIHBTdWJmb3JtU2V0Tm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKA0KKyAgICAgICAgcERvY3VtZW50LCBwRm9ybVBhcmVudE5vZGUsIHBUZW1wbGF0ZU5vZGUsIEZBTFNFLCBwU2VhcmNoQXJyYXkpOw0KKyAgICBGWFNZU19hc3NlcnQocFN1YmZvcm1TZXROb2RlKTsNCisgICAgaWYgKCFwRmlyc3RJbnN0YW5jZSkgew0KKyAgICAgIHBGaXJzdEluc3RhbmNlID0gcFN1YmZvcm1TZXROb2RlOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYkZvdW5kID0gRkFMU0U7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCA9DQorICAgICAgICAgICAgIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgaWYgKFhGQV9OZWVkR2VuZXJhdGVGb3JtKHBUZW1wbGF0ZUNoaWxkLCBiVXNlSW5zdGFuY2VNYW5hZ2VyKSkgew0KKyAgICAgICAgWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwU3ViZm9ybVNldE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGVDaGlsZCwgVFJVRSk7DQorICAgICAgfSBlbHNlIGlmIChwVGVtcGxhdGVDaGlsZC0+R2V0T2JqZWN0VHlwZSgpID09DQorICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgICAgICBpZiAoYkZvdW5kICYmIGVSZWxhdGlvbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9DaG9pY2UpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHBUZW1wbGF0ZUNoaWxkLCBwU3ViZm9ybVNldE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2NvcGUsIEZBTFNFLCBiRGF0YU1lcmdlKTsNCisgICAgICAgIGJGb3VuZCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gcEZpcnN0SW5zdGFuY2U7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9Eb2N1bWVudDo6RGF0YU1lcmdlX0NvcHlDb250YWluZXIoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLCBDWEZBX05vZGUqIHBGb3JtTm9kZSwgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLCBGWF9CT09MIGJPbmVJbnN0YW5jZSAsIEZYX0JPT0wgYkRhdGFNZXJnZSAsIEZYX0JPT0wgYlVwTGV2ZWwpDQotew0KLSAgICBzd2l0Y2gocFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQ6DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0FyZWE6DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1BhZ2VBcmVhOg0KLSAgICAgICAgICAgIHJldHVybiBYRkFfRGF0YU1lcmdlX0NvcHlDb250YWluZXJfU3ViZm9ybVNldCh0aGlzLCBwVGVtcGxhdGVOb2RlLCBwRm9ybU5vZGUsIHBEYXRhU2NvcGUsIGJPbmVJbnN0YW5jZSwgYkRhdGFNZXJnZSk7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRmllbGQ6DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhOg0KLSAgICAgICAgICAgIHJldHVybiBYRkFfRGF0YU1lcmdlX0NvcHlDb250YWluZXJfRmllbGQodGhpcywgcFRlbXBsYXRlTm9kZSwgcEZvcm1Ob2RlLCBwRGF0YVNjb3BlLCBiRGF0YU1lcmdlLCBiVXBMZXZlbCk7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1BhZ2VTZXQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1ZhcmlhYmxlczoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCi0gICAgICAgICAgICBicmVhazsNCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0NvcHlDb250YWluZXJfRmllbGQoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRhdGFNZXJnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXBMZXZlbCA9IFRSVUUpIHsNCisgIENYRkFfTm9kZSogcEZpZWxkTm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKA0KKyAgICAgIHBEb2N1bWVudCwgcEZvcm1Ob2RlLCBwVGVtcGxhdGVOb2RlLCBGQUxTRSk7DQorICBGWFNZU19hc3NlcnQocEZpZWxkTm9kZSk7DQorICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGROb2RlID0NCisgICAgICAgICAgIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgcFRlbXBsYXRlQ2hpbGROb2RlOyBwVGVtcGxhdGVDaGlsZE5vZGUgPSBwVGVtcGxhdGVDaGlsZE5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZE5vZGUpKSB7DQorICAgICAgWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwRmllbGROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkTm9kZSwgVFJVRSk7DQorICAgIH0gZWxzZSBpZiAocFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCAmJg0KKyAgICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICBpZiAocFRlbXBsYXRlQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcl9GaWVsZChwRG9jdW1lbnQsIHBUZW1wbGF0ZUNoaWxkTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmllbGROb2RlLCBOVUxMLCBGQUxTRSk7DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKGJEYXRhTWVyZ2UpIHsNCisgICAgRlhfQk9PTCBiQWNjZXNzZWREYXRhRE9NID0gRkFMU0U7DQorICAgIEZYX0JPT0wgYlNlbGZNYXRjaCA9IEZBTFNFOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlQmluZE1hdGNoOw0KKyAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IFhGQV9EYXRhTWVyZ2VfRmluZE1hdGNoaW5nRGF0YU5vZGUoDQorICAgICAgICBwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGUsIHBEYXRhU2NvcGUsIGJBY2Nlc3NlZERhdGFET00sIFRSVUUsIE5VTEwsDQorICAgICAgICBiU2VsZk1hdGNoLCBlQmluZE1hdGNoLCBiVXBMZXZlbCk7DQorICAgIGlmIChwRGF0YU5vZGUpIHsNCisgICAgICBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKHBGaWVsZE5vZGUsIHBEYXRhTm9kZSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9NYXRjaE5vbmVDcmVhdGVDaGlsZChwRmllbGROb2RlKTsNCisgIH0NCisgIHJldHVybiBwRmllbGROb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfRG9jdW1lbnQ6OkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25lSW5zdGFuY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEYXRhTWVyZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVcExldmVsKSB7DQorICBzd2l0Y2ggKHBUZW1wbGF0ZU5vZGUtPkdldENsYXNzSUQoKSkgew0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQ6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9BcmVhOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1BhZ2VBcmVhOg0KKyAgICAgIHJldHVybiBYRkFfRGF0YU1lcmdlX0NvcHlDb250YWluZXJfU3ViZm9ybVNldCgNCisgICAgICAgICAgdGhpcywgcFRlbXBsYXRlTm9kZSwgcEZvcm1Ob2RlLCBwRGF0YVNjb3BlLCBiT25lSW5zdGFuY2UsIGJEYXRhTWVyZ2UpOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9GaWVsZDoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9EcmF3Og0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhOg0KKyAgICAgIHJldHVybiBYRkFfRGF0YU1lcmdlX0NvcHlDb250YWluZXJfRmllbGQoDQorICAgICAgICAgIHRoaXMsIHBUZW1wbGF0ZU5vZGUsIHBGb3JtTm9kZSwgcERhdGFTY29wZSwgYkRhdGFNZXJnZSwgYlVwTGV2ZWwpOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1BhZ2VTZXQ6DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfVmFyaWFibGVzOg0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQogI2RlZmluZSBYRkFfREFUQU1FUkdFX1VQREFURUJJTkRJTkdSRUxBVElPTlNfREZTDQogI2lmZGVmIFhGQV9EQVRBTUVSR0VfVVBEQVRFQklORElOR1JFTEFUSU9OU19ERlMNCi1zdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBGb3JtTm9kZSwgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLCBGWF9CT09MIGJEYXRhUmVmLCBGWF9CT09MIGJQYXJlbnREYXRhUmVmKQ0KLXsNCi0gICAgRlhfQk9PTCBiTWF0Y2hSZWYgPSBUUlVFOw0KLSAgICBYRkFfRUxFTUVOVCBlQ2xhc3NJRCA9IHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBGb3JtTm9kZS0+R2V0QmluZERhdGEoKTsNCi0gICAgaWYoZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXAgfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCi0gICAgICAgIENYRkFfTm9kZSAqcFRlbXBsYXRlTm9kZSA9IHBGb3JtTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7DQotICAgICAgICBDWEZBX05vZGUgKnBUZW1wbGF0ZU5vZGVCaW5kID0gcFRlbXBsYXRlTm9kZSA/IHBUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0JpbmQpIDogTlVMTDsNCi0gICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVNYXRjaCA9IHBUZW1wbGF0ZU5vZGVCaW5kID8gcFRlbXBsYXRlTm9kZUJpbmQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9NYXRjaCkgOiBYRkFfQVRUUklCVVRFRU5VTV9PbmNlOw0KLSAgICAgICAgc3dpdGNoKGVNYXRjaCkgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTm9uZToNCi0gICAgICAgICAgICAgICAgaWYgKCFiRGF0YVJlZiB8fCBiUGFyZW50RGF0YVJlZikgew0KLSAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX01hdGNoTm9uZUNyZWF0ZUNoaWxkKHBGb3JtTm9kZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9PbmNlOg0KLSAgICAgICAgICAgICAgICBpZiAoIWJEYXRhUmVmIHx8IGJQYXJlbnREYXRhUmVmKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRm9ybU5vZGUtPkdldE5hbWVIYXNoKCkgIT0gMCAmJiBwRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9TY29wZSkgIT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlRGF0YU5vZGVUeXBlID0gKGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3gocEZvcm1Ob2RlKSkgPyBYRkFfRUxFTUVOVF9EYXRhR3JvdXAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZSA9IFhGQV9EYXRhRGVzY3JpcHRpb25fTWF5YmVDcmVhdGVEYXRhTm9kZShwRG9jdW1lbnQsIHBEYXRhU2NvcGUsIGVEYXRhTm9kZVR5cGUsIHBGb3JtTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRm9ybU5vZGUsIHBEYXRhTm9kZSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcERhdGFOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9NYXRjaE5vbmVDcmVhdGVDaGlsZChwRm9ybU5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YVBhcmVudCA9IHBEYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocERhdGFQYXJlbnQgIT0gcERhdGFTY29wZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocERhdGFQYXJlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVBhcmVudC0+UmVtb3ZlQ2hpbGQocERhdGFOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTY29wZS0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9HbG9iYWw6DQotICAgICAgICAgICAgICAgIGlmICghYkRhdGFSZWYgfHwgYlBhcmVudERhdGFSZWYpIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwRm9ybU5vZGUtPkdldE5hbWVIYXNoKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZHdOYW1lSGFzaCAhPSAwICYmICFwRGF0YU5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUgPSBYRkFfRGF0YU1lcmdlX0dldEdsb2JhbEJpbmRpbmcocERvY3VtZW50LCBkd05hbWVIYXNoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighcERhdGFOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVEYXRhTm9kZVR5cGUgPSAoZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSAgfHwgWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3gocEZvcm1Ob2RlKSkgPyBYRkFfRUxFTUVOVF9EYXRhR3JvdXAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFJlY29yZE5vZGUgPSAoQ1hGQV9Ob2RlKilwRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1JlY29yZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZSA9IFhGQV9EYXRhRGVzY3JpcHRpb25fTWF5YmVDcmVhdGVEYXRhTm9kZShwRG9jdW1lbnQsIHBSZWNvcmROb2RlLCBlRGF0YU5vZGVUeXBlLCBwRm9ybU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwRGF0YU5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocEZvcm1Ob2RlLCBwRGF0YU5vZGUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfUmVnaXN0ZXJHbG9iYWxCaW5kaW5nKHBEb2N1bWVudCwgcEZvcm1Ob2RlLT5HZXROYW1lSGFzaCgpLCBwRGF0YU5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRm9ybU5vZGUsIHBEYXRhTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YU5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfTWF0Y2hOb25lQ3JlYXRlQ2hpbGQocEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWY6IHsNCi0gICAgICAgICAgICAgICAgICAgIGJNYXRjaFJlZiA9IGJEYXRhUmVmOw0KLSAgICAgICAgICAgICAgICAgICAgYlBhcmVudERhdGFSZWYgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGF0YU5vZGUgJiYgYkRhdGFSZWYpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWYgPSBwVGVtcGxhdGVOb2RlQmluZC0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5SZXNvbHZlT2JqZWN0cyhwRGF0YVNjb3BlLCB3c1JlZiwgcnMsIGRGbGFncywgcFRlbXBsYXRlTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSAocnMubm9kZXMuR2V0U2l6ZSgpID4gMCkgPyBycy5ub2Rlc1swXSA6IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlID0gKHBPYmplY3QgJiYgcE9iamVjdC0+SXNOb2RlKCkpID8gKENYRkFfTm9kZSopcE9iamVjdCA6IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocERhdGFOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocEZvcm1Ob2RlLCBwRGF0YU5vZGUsIHJzLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX0V4aXN0Tm9kZXMgPyBUUlVFIDogRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9NYXRjaE5vbmVDcmVhdGVDaGlsZChwRm9ybU5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEYXRhUmVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYXJlbnREYXRhUmVmKSB7DQorICBGWF9CT09MIGJNYXRjaFJlZiA9IFRSVUU7DQorICBYRkFfRUxFTUVOVCBlQ2xhc3NJRCA9IHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBwRm9ybU5vZGUtPkdldEJpbmREYXRhKCk7DQorICBpZiAoZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXAgfHwNCisgICAgICBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGVCaW5kID0NCisgICAgICAgIHBUZW1wbGF0ZU5vZGUgPyBwVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9CaW5kKQ0KKyAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVNYXRjaCA9DQorICAgICAgICBwVGVtcGxhdGVOb2RlQmluZCA/IHBUZW1wbGF0ZU5vZGVCaW5kLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWF0Y2gpDQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9BVFRSSUJVVEVFTlVNX09uY2U7DQorICAgIHN3aXRjaCAoZU1hdGNoKSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOg0KKyAgICAgICAgaWYgKCFiRGF0YVJlZiB8fCBiUGFyZW50RGF0YVJlZikgew0KKyAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfTWF0Y2hOb25lQ3JlYXRlQ2hpbGQocEZvcm1Ob2RlKTsNCiAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZihiTWF0Y2hSZWYgJiYgKGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9BcmVhIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpKSB7DQotICAgICAgICBmb3IoQ1hGQV9Ob2RlKiBwRm9ybUNoaWxkID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBGb3JtQ2hpbGQ7IHBGb3JtQ2hpbGQgPSBwRm9ybUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgaWYocEZvcm1DaGlsZC0+R2V0T2JqZWN0VHlwZSgpICE9IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX09uY2U6DQorICAgICAgICBpZiAoIWJEYXRhUmVmIHx8IGJQYXJlbnREYXRhUmVmKSB7DQorICAgICAgICAgIGlmICghcERhdGFOb2RlKSB7DQorICAgICAgICAgICAgaWYgKHBGb3JtTm9kZS0+R2V0TmFtZUhhc2goKSAhPSAwICYmDQorICAgICAgICAgICAgICAgIHBGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1Njb3BlKSAhPQ0KKyAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fTm9uZSkgew0KKyAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZURhdGFOb2RlVHlwZSA9IChlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KHBGb3JtTm9kZSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gWEZBX0VMRU1FTlRfRGF0YUdyb3VwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0VMRU1FTlRfRGF0YVZhbHVlOw0KKyAgICAgICAgICAgICAgcERhdGFOb2RlID0gWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKA0KKyAgICAgICAgICAgICAgICAgIHBEb2N1bWVudCwgcERhdGFTY29wZSwgZURhdGFOb2RlVHlwZSwNCisgICAgICAgICAgICAgICAgICBwRm9ybU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSkpOw0KKyAgICAgICAgICAgICAgaWYgKHBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKHBGb3JtTm9kZSwgcERhdGFOb2RlLCBGQUxTRSk7DQorICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKHBGb3JtQ2hpbGQtPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGlmICghcERhdGFOb2RlKSB7DQorICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfTWF0Y2hOb25lQ3JlYXRlQ2hpbGQocEZvcm1Ob2RlKTsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHBEb2N1bWVudCwgcEZvcm1DaGlsZCwgcERhdGFOb2RlID8gcERhdGFOb2RlIDogcERhdGFTY29wZSwgYkRhdGFSZWYsIGJQYXJlbnREYXRhUmVmKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhUGFyZW50ID0NCisgICAgICAgICAgICAgICAgcERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgICBpZiAocERhdGFQYXJlbnQgIT0gcERhdGFTY29wZSkgew0KKyAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBEYXRhUGFyZW50KTsNCisgICAgICAgICAgICAgIHBEYXRhUGFyZW50LT5SZW1vdmVDaGlsZChwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgICAgcERhdGFTY29wZS0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fR2xvYmFsOg0KKyAgICAgICAgaWYgKCFiRGF0YVJlZiB8fCBiUGFyZW50RGF0YVJlZikgew0KKyAgICAgICAgICBGWF9EV09SRCBkd05hbWVIYXNoID0gcEZvcm1Ob2RlLT5HZXROYW1lSGFzaCgpOw0KKyAgICAgICAgICBpZiAoZHdOYW1lSGFzaCAhPSAwICYmICFwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICBwRGF0YU5vZGUgPSBYRkFfRGF0YU1lcmdlX0dldEdsb2JhbEJpbmRpbmcocERvY3VtZW50LCBkd05hbWVIYXNoKTsNCisgICAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZURhdGFOb2RlVHlwZSA9IChlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KHBGb3JtTm9kZSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gWEZBX0VMRU1FTlRfRGF0YUdyb3VwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0VMRU1FTlRfRGF0YVZhbHVlOw0KKyAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUmVjb3JkTm9kZSA9DQorICAgICAgICAgICAgICAgICAgKENYRkFfTm9kZSopcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9SZWNvcmQpOw0KKyAgICAgICAgICAgICAgcERhdGFOb2RlID0gWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKA0KKyAgICAgICAgICAgICAgICAgIHBEb2N1bWVudCwgcFJlY29yZE5vZGUsIGVEYXRhTm9kZVR5cGUsDQorICAgICAgICAgICAgICAgICAgcEZvcm1Ob2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpKTsNCisgICAgICAgICAgICAgIGlmIChwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRm9ybU5vZGUsIHBEYXRhTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX1JlZ2lzdGVyR2xvYmFsQmluZGluZygNCisgICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudCwgcEZvcm1Ob2RlLT5HZXROYW1lSGFzaCgpLCBwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKHBGb3JtTm9kZSwgcERhdGFOb2RlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCFwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfTWF0Y2hOb25lQ3JlYXRlQ2hpbGQocEZvcm1Ob2RlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EYXRhUmVmOiB7DQorICAgICAgICBiTWF0Y2hSZWYgPSBiRGF0YVJlZjsNCisgICAgICAgIGJQYXJlbnREYXRhUmVmID0gVFJVRTsNCisgICAgICAgIGlmICghcERhdGFOb2RlICYmIGJEYXRhUmVmKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1JlZiA9DQorICAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlQmluZC0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYpOw0KKyAgICAgICAgICBGWF9EV09SRCBkRmxhZ3MgPQ0KKyAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGU7DQorICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByczsNCisgICAgICAgICAgcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPlJlc29sdmVPYmplY3RzKHBEYXRhU2NvcGUsIHdzUmVmLCBycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRGbGFncywgcFRlbXBsYXRlTm9kZSk7DQorICAgICAgICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKHJzLm5vZGVzLkdldFNpemUoKSA+IDApID8gcnMubm9kZXNbMF0gOiBOVUxMOw0KKyAgICAgICAgICBwRGF0YU5vZGUgPQ0KKyAgICAgICAgICAgICAgKHBPYmplY3QgJiYgcE9iamVjdC0+SXNOb2RlKCkpID8gKENYRkFfTm9kZSopcE9iamVjdCA6IE5VTEw7DQorICAgICAgICAgIGlmIChwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKA0KKyAgICAgICAgICAgICAgICBwRm9ybU5vZGUsIHBEYXRhTm9kZSwNCisgICAgICAgICAgICAgICAgcnMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfRXhpc3ROb2RlcyA/IFRSVUUgOiBGQUxTRSk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX01hdGNoTm9uZUNyZWF0ZUNoaWxkKHBGb3JtTm9kZSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KKyAgfQ0KKyAgaWYgKGJNYXRjaFJlZiAmJg0KKyAgICAgIChlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQgfHwNCisgICAgICAgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfQXJlYSB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSB8fA0KKyAgICAgICBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSkgew0KKyAgICBmb3IgKENYRkFfTm9kZSogcEZvcm1DaGlsZCA9DQorICAgICAgICAgICAgIHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgIHBGb3JtQ2hpbGQ7DQorICAgICAgICAgcEZvcm1DaGlsZCA9IHBGb3JtQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICBpZiAocEZvcm1DaGlsZC0+R2V0T2JqZWN0VHlwZSgpICE9IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAocEZvcm1DaGlsZC0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSkpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBYRkFfRGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocERvY3VtZW50LCBwRm9ybUNoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUgPyBwRGF0YU5vZGUgOiBwRGF0YVNjb3BlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGF0YVJlZiwgYlBhcmVudERhdGFSZWYpOw0KKyAgICB9DQorICB9DQogfQ0KICNlbHNlDQogc3RhdGljIHZvaWQgWEZBX0RhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsIENYRkFfTm9kZSogcERhdGFTY29wZSwgQ0ZYX1B0ckxpc3QmIHJnRm9ybU5vZGVMaXN0LCBDRlhfUHRyTGlzdCYgcmdEYXRhU2NvcGVMaXN0LCBGWF9CT09MIGJEIF9ERUJVRw0KQEAgLTEwMDEsMjcwICsxMjQxLDMxNyBAQAogICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBGb3JtTm9kZS0+R2V0QmluZERhdGEoKTsNCiAgICAgICAgIGlmKGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX0ZpZWxkKQ0KIHsNCi1DWEZBX05vZGUgKnBUZW1wbGF0ZU5vZGUgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KLSAgICBDWEZBX05vZGUgKnBUZW1wbGF0ZU5vZGVCaW5kID0gcFRlbXBsYXRlTm9kZSA/IHBUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0JpbmQpIDogTlVMTDsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZU1hdGNoID0gcFRlbXBsYXRlTm9kZUJpbmQgPyBwVGVtcGxhdGVOb2RlQmluZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX01hdGNoKSA6IFhGQV9BVFRSSUJVVEVFTlVNX09uY2U7DQotICAgIHN3aXRjaChlTWF0Y2gpIHsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTm9uZToNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fT25jZTogew0KLSAgICAgICAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGb3JtTm9kZS0+R2V0TmFtZUhhc2goKSAhPSAwICYmIHBGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1Njb3BlKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZURhdGFOb2RlVHlwZSA9IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gPyBYRkFfRUxFTUVOVF9EYXRhR3JvdXAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlID0gWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKHBEb2N1bWVudCwgcERhdGFTY29wZSwgZURhdGFOb2RlVHlwZSwgcEZvcm1Ob2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwRGF0YU5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRm9ybU5vZGUsIHBEYXRhTm9kZSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFQYXJlbnQgPSBwRGF0YU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYocERhdGFQYXJlbnQgIT0gcERhdGFTY29wZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwRGF0YVBhcmVudCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFQYXJlbnQtPlJlbW92ZUNoaWxkKHBEYXRhTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFTY29wZS0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fR2xvYmFsOiB7DQotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwRm9ybU5vZGUtPkdldE5hbWVIYXNoKCk7DQotICAgICAgICAgICAgICAgIGlmIChkd05hbWVIYXNoICE9IDAgJiYgIXBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlID0gWEZBX0RhdGFNZXJnZV9HZXRHbG9iYWxCaW5kaW5nKHBEb2N1bWVudCwgZHdOYW1lSGFzaCk7DQotICAgICAgICAgICAgICAgICAgICBpZighcERhdGFOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZURhdGFOb2RlVHlwZSA9IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gPyBYRkFfRUxFTUVOVF9EYXRhR3JvdXAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUmVjb3JkTm9kZSA9IChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfUmVjb3JkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUgPSBYRkFfRGF0YURlc2NyaXB0aW9uX01heWJlQ3JlYXRlRGF0YU5vZGUocERvY3VtZW50LCBwUmVjb3JkTm9kZSwgZURhdGFOb2RlVHlwZSwgcEZvcm1Ob2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKHBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocEZvcm1Ob2RlLCBwRGF0YU5vZGUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX1JlZ2lzdGVyR2xvYmFsQmluZGluZyhwRG9jdW1lbnQsIHBGb3JtTm9kZS0+R2V0TmFtZUhhc2goKSwgcERhdGFOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZjogew0KLSAgICAgICAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzUmVmID0gcFRlbXBsYXRlTm9kZUJpbmQtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfUmVmKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZTsNCi0gICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByczsNCi0gICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5SZXNvbHZlT2JqZWN0cyhwRGF0YVNjb3BlLCB3c1JlZiwgcnMsIGRGbGFncywgcFRlbXBsYXRlTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IChycy5ub2Rlcy5HZXRTaXplKCkgPiAwKSA/IHJzLm5vZGVzWzBdIDogTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZSA9IChwT2JqZWN0ICYmIHBPYmplY3QtPklzTm9kZSgpKSA/IChDWEZBX05vZGUqKXBPYmplY3QgOiBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgaWYocERhdGFOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRm9ybU5vZGUsIHBEYXRhTm9kZSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQorICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlQmluZCA9DQorICAgICAgcFRlbXBsYXRlTm9kZSA/IHBUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0JpbmQpDQorICAgICAgICAgICAgICAgICAgICA6IE5VTEw7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlTWF0Y2ggPQ0KKyAgICAgIHBUZW1wbGF0ZU5vZGVCaW5kID8gcFRlbXBsYXRlTm9kZUJpbmQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9NYXRjaCkNCisgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9BVFRSSUJVVEVFTlVNX09uY2U7DQorICBzd2l0Y2ggKGVNYXRjaCkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fT25jZTogew0KKyAgICAgIGlmICghcERhdGFOb2RlKSB7DQorICAgICAgICBpZiAocEZvcm1Ob2RlLT5HZXROYW1lSGFzaCgpICE9IDAgJiYNCisgICAgICAgICAgICBwRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9TY29wZSkgIT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZSkgew0KKyAgICAgICAgICBYRkFfRUxFTUVOVCBlRGF0YU5vZGVUeXBlID0gZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gWEZBX0VMRU1FTlRfRGF0YUdyb3VwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICAgIHBEYXRhTm9kZSA9IFhGQV9EYXRhRGVzY3JpcHRpb25fTWF5YmVDcmVhdGVEYXRhTm9kZSgNCisgICAgICAgICAgICAgIHBEb2N1bWVudCwgcERhdGFTY29wZSwgZURhdGFOb2RlVHlwZSwNCisgICAgICAgICAgICAgIHBGb3JtTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKSk7DQorICAgICAgICAgIGlmIChwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKHBGb3JtTm9kZSwgcERhdGFOb2RlLCBGQUxTRSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YVBhcmVudCA9IHBEYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBpZiAocERhdGFQYXJlbnQgIT0gcERhdGFTY29wZSkgew0KKyAgICAgICAgICBGWFNZU19hc3NlcnQocERhdGFQYXJlbnQpOw0KKyAgICAgICAgICBwRGF0YVBhcmVudC0+UmVtb3ZlQ2hpbGQocERhdGFOb2RlKTsNCisgICAgICAgICAgcERhdGFTY29wZS0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fR2xvYmFsOiB7DQorICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IHBGb3JtTm9kZS0+R2V0TmFtZUhhc2goKTsNCisgICAgICBpZiAoZHdOYW1lSGFzaCAhPSAwICYmICFwRGF0YU5vZGUpIHsNCisgICAgICAgIHBEYXRhTm9kZSA9IFhGQV9EYXRhTWVyZ2VfR2V0R2xvYmFsQmluZGluZyhwRG9jdW1lbnQsIGR3TmFtZUhhc2gpOw0KKyAgICAgICAgaWYgKCFwRGF0YU5vZGUpIHsNCisgICAgICAgICAgWEZBX0VMRU1FTlQgZURhdGFOb2RlVHlwZSA9IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFhGQV9FTEVNRU5UX0RhdGFHcm91cA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0VMRU1FTlRfRGF0YVZhbHVlOw0KKyAgICAgICAgICBDWEZBX05vZGUqIHBSZWNvcmROb2RlID0NCisgICAgICAgICAgICAgIChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfUmVjb3JkKTsNCisgICAgICAgICAgcERhdGFOb2RlID0gWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKA0KKyAgICAgICAgICAgICAgcERvY3VtZW50LCBwUmVjb3JkTm9kZSwgZURhdGFOb2RlVHlwZSwNCisgICAgICAgICAgICAgIHBGb3JtTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocERhdGFOb2RlKSB7DQorICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocEZvcm1Ob2RlLCBwRGF0YU5vZGUsIEZBTFNFKTsNCisgICAgICAgICAgWEZBX0RhdGFNZXJnZV9SZWdpc3Rlckdsb2JhbEJpbmRpbmcoDQorICAgICAgICAgICAgICBwRG9jdW1lbnQsIHBGb3JtTm9kZS0+R2V0TmFtZUhhc2goKSwgcERhdGFOb2RlKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZjogew0KKyAgICAgIGlmICghcERhdGFOb2RlKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWYgPSBwVGVtcGxhdGVOb2RlQmluZC0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYpOw0KKyAgICAgICAgRlhfRFdPUkQgZEZsYWdzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGU7DQorICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcnM7DQorICAgICAgICBwRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+UmVzb2x2ZU9iamVjdHMocERhdGFTY29wZSwgd3NSZWYsIHJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRGbGFncywgcFRlbXBsYXRlTm9kZSk7DQorICAgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IChycy5ub2Rlcy5HZXRTaXplKCkgPiAwKSA/IHJzLm5vZGVzWzBdIDogTlVMTDsNCisgICAgICAgIHBEYXRhTm9kZSA9IChwT2JqZWN0ICYmIHBPYmplY3QtPklzTm9kZSgpKSA/IChDWEZBX05vZGUqKXBPYmplY3QgOiBOVUxMOw0KKyAgICAgICAgaWYgKHBEYXRhTm9kZSkgew0KKyAgICAgICAgICBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKHBGb3JtTm9kZSwgcERhdGFOb2RlLCBGQUxTRSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgfQ0KIH0NCiBpZihlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0IHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX0FyZWEgfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpDQogew0KLWZvcihDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcEZvcm1DaGlsZDsgcEZvcm1DaGlsZCA9IHBGb3JtQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgIGlmKHBGb3JtQ2hpbGQtPkdldE9iamVjdFR5cGUoKSAhPSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZihwRm9ybUNoaWxkLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmdGb3JtTm9kZUxpc3QuQWRkVGFpbChwRm9ybUNoaWxkKTsNCi0gICAgICAgIHJnRGF0YVNjb3BlTGlzdC5BZGRUYWlsKHBEYXRhTm9kZSA/IHBEYXRhTm9kZSA6IHBEYXRhU2NvcGUpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgcEZvcm1DaGlsZDsNCisgICAgICAgcEZvcm1DaGlsZCA9IHBGb3JtQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgaWYgKHBGb3JtQ2hpbGQtPkdldE9iamVjdFR5cGUoKSAhPSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCisgICAgaWYgKHBGb3JtQ2hpbGQtPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgcmdGb3JtTm9kZUxpc3QuQWRkVGFpbChwRm9ybUNoaWxkKTsNCisgICAgcmdEYXRhU2NvcGVMaXN0LkFkZFRhaWwocERhdGFOb2RlID8gcERhdGFOb2RlIDogcERhdGFTY29wZSk7DQorICB9DQogfQ0KIH0NCiAjZW5kaWYNCi1DWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZShDWEZBX05vZGUqIHBQYXJlbnRGb3JtTm9kZSkNCi17DQotICAgIGZvcihDWEZBX05vZGUqIHBSb290Qm91bmROb2RlID0gcFBhcmVudEZvcm1Ob2RlOyBwUm9vdEJvdW5kTm9kZSAmJiBwUm9vdEJvdW5kTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGU7IHBSb290Qm91bmROb2RlID0gcFJvb3RCb3VuZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0QmluZERhdGEoKTsNCi0gICAgICAgIGlmKHBEYXRhU2NvcGUpIHsNCi0gICAgICAgICAgICByZXR1cm4gcERhdGFTY29wZTsNCi0gICAgICAgIH0NCitDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZShDWEZBX05vZGUqIHBQYXJlbnRGb3JtTm9kZSkgew0KKyAgZm9yIChDWEZBX05vZGUqIHBSb290Qm91bmROb2RlID0gcFBhcmVudEZvcm1Ob2RlOw0KKyAgICAgICBwUm9vdEJvdW5kTm9kZSAmJg0KKyAgICAgICBwUm9vdEJvdW5kTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGU7DQorICAgICAgIHBSb290Qm91bmROb2RlID0gcFJvb3RCb3VuZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7DQorICAgIENYRkFfTm9kZSogcERhdGFTY29wZSA9IHBSb290Qm91bmROb2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgICBpZiAocERhdGFTY29wZSkgew0KKyAgICAgIHJldHVybiBwRGF0YVNjb3BlOw0KICAgICB9DQotICAgIHJldHVybiAoQ1hGQV9Ob2RlKilwUGFyZW50Rm9ybU5vZGUtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0RhdGEpOw0KKyAgfQ0KKyAgcmV0dXJuIChDWEZBX05vZGUqKXBQYXJlbnRGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZSgNCisgICAgICBYRkFfSEFTSENPREVfRGF0YSk7DQogfQ0KLXZvaWQgQ1hGQV9Eb2N1bWVudDo6RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMoQ1hGQV9Ob2RlKiBwRm9ybVVwZGF0ZVJvb3QpDQotew0KLSAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUocEZvcm1VcGRhdGVSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQotICAgIGlmICghcERhdGFTY29wZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQordm9pZCBDWEZBX0RvY3VtZW50OjpEYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucygNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybVVwZGF0ZVJvb3QpIHsNCisgIENYRkFfTm9kZSogcERhdGFTY29wZSA9IFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZSgNCisgICAgICBwRm9ybVVwZGF0ZVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgIGlmICghcERhdGFTY29wZSkgew0KKyAgICByZXR1cm47DQorICB9DQogI2lmZGVmIFhGQV9EQVRBTUVSR0VfVVBEQVRFQklORElOR1JFTEFUSU9OU19ERlMNCi0gICAgWEZBX0RhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHRoaXMsIHBGb3JtVXBkYXRlUm9vdCwgcERhdGFTY29wZSwgRkFMU0UsIEZBTFNFKTsNCi0gICAgWEZBX0RhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHRoaXMsIHBGb3JtVXBkYXRlUm9vdCwgcERhdGFTY29wZSwgVFJVRSwgRkFMU0UpOw0KKyAgWEZBX0RhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHRoaXMsIHBGb3JtVXBkYXRlUm9vdCwgcERhdGFTY29wZSwgRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOw0KKyAgWEZBX0RhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHRoaXMsIHBGb3JtVXBkYXRlUm9vdCwgcERhdGFTY29wZSwgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7DQogI2Vsc2UNCi0gICAgQ0ZYX1B0ckxpc3QgcmdGb3JtTm9kZUxpc3QsIHJnRGF0YVNjb3BlTGlzdDsNCi0gICAgcmdGb3JtTm9kZUxpc3QuQWRkVGFpbChwRm9ybVVwZGF0ZVJvb3QpOw0KLSAgICByZ0RhdGFTY29wZUxpc3QuQWRkVGFpbChwRGF0YVNjb3BlKTsNCi0gICAgd2hpbGUocmdGb3JtTm9kZUxpc3QuR2V0Q291bnQoKSkgew0KLSAgICAgICAgRlhfUE9TSVRJT04gcG9zOw0KLSAgICAgICAgcG9zID0gcmdGb3JtTm9kZUxpc3QuR2V0SGVhZFBvc2l0aW9uKCk7DQotICAgICAgICBDWEZBX05vZGUgKnBDdXJGb3JtTm9kZSA9IChDWEZBX05vZGUqKXJnRm9ybU5vZGVMaXN0LkdldEF0KHBvcyk7DQotICAgICAgICByZ0Zvcm1Ob2RlTGlzdC5SZW1vdmVBdChwb3MpOw0KLSAgICAgICAgcG9zID0gcmdEYXRhU2NvcGVMaXN0LkdldEhlYWRQb3NpdGlvbigpOw0KLSAgICAgICAgQ1hGQV9Ob2RlICpwQ3VyRGF0YVNjb3BlID0gKENYRkFfTm9kZSopcmdEYXRhU2NvcGVMaXN0LkdldEF0KHBvcyk7DQotICAgICAgICByZ0RhdGFTY29wZUxpc3QuUmVtb3ZlQXQocG9zKTsNCi0gICAgICAgIFhGQV9EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyh0aGlzLCBwQ3VyRm9ybU5vZGUsIHBDdXJEYXRhU2NvcGUsIHJnRm9ybU5vZGVMaXN0LCByZ0RhdGFTY29wZUxpc3QpOw0KLSAgICB9DQorICBDRlhfUHRyTGlzdCByZ0Zvcm1Ob2RlTGlzdCwgcmdEYXRhU2NvcGVMaXN0Ow0KKyAgcmdGb3JtTm9kZUxpc3QuQWRkVGFpbChwRm9ybVVwZGF0ZVJvb3QpOw0KKyAgcmdEYXRhU2NvcGVMaXN0LkFkZFRhaWwocERhdGFTY29wZSk7DQorICB3aGlsZSAocmdGb3JtTm9kZUxpc3QuR2V0Q291bnQoKSkgew0KKyAgICBGWF9QT1NJVElPTiBwb3M7DQorICAgIHBvcyA9IHJnRm9ybU5vZGVMaXN0LkdldEhlYWRQb3NpdGlvbigpOw0KKyAgICBDWEZBX05vZGUqIHBDdXJGb3JtTm9kZSA9IChDWEZBX05vZGUqKXJnRm9ybU5vZGVMaXN0LkdldEF0KHBvcyk7DQorICAgIHJnRm9ybU5vZGVMaXN0LlJlbW92ZUF0KHBvcyk7DQorICAgIHBvcyA9IHJnRGF0YVNjb3BlTGlzdC5HZXRIZWFkUG9zaXRpb24oKTsNCisgICAgQ1hGQV9Ob2RlKiBwQ3VyRGF0YVNjb3BlID0gKENYRkFfTm9kZSopcmdEYXRhU2NvcGVMaXN0LkdldEF0KHBvcyk7DQorICAgIHJnRGF0YVNjb3BlTGlzdC5SZW1vdmVBdChwb3MpOw0KKyAgICBYRkFfRGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnModGhpcywgcEN1ckZvcm1Ob2RlLCBwQ3VyRGF0YVNjb3BlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdGb3JtTm9kZUxpc3QsIHJnRGF0YVNjb3BlTGlzdCk7DQorICB9DQogI2VuZGlmDQogfQ0KLUNYRkFfTm9kZSAqCUNYRkFfRG9jdW1lbnQ6OkdldE5vdEJpbmROb2RlKENYRkFfT2JqQXJyYXkmIGFycmF5Tm9kZXMpDQotew0KLSAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGFycmF5Tm9kZXMuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gYXJyYXlOb2Rlc1tpXTsNCi0gICAgICAgIGlmKCFwT2JqZWN0LT5Jc05vZGUoKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCgoQ1hGQV9Ob2RlKilwT2JqZWN0KS0+SGFzQmluZEl0ZW0oKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICgoQ1hGQV9Ob2RlKilwT2JqZWN0KTsNCitDWEZBX05vZGUqIENYRkFfRG9jdW1lbnQ6OkdldE5vdEJpbmROb2RlKENYRkFfT2JqQXJyYXkmIGFycmF5Tm9kZXMpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFycmF5Tm9kZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBhcnJheU5vZGVzW2ldOw0KKyAgICBpZiAoIXBPYmplY3QtPklzTm9kZSgpKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorICAgIGlmICgoKENYRkFfTm9kZSopcE9iamVjdCktPkhhc0JpbmRJdGVtKCkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gKChDWEZBX05vZGUqKXBPYmplY3QpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLXZvaWQgQ1hGQV9Eb2N1bWVudDo6RG9EYXRhTWVyZ2UoKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRGF0YXNldHNSb290ID0gKENYRkFfTm9kZSopR2V0WEZBTm9kZShYRkFfSEFTSENPREVfRGF0YXNldHMpOw0KLSAgICBpZighcERhdGFzZXRzUm9vdCkgew0KLSAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwRGF0YXNldHNYTUxOb2RlID0gSUZERV9YTUxFbGVtZW50OjpDcmVhdGUoRlhfV1NUUkMoTCJ4ZmE6ZGF0YXNldHMiKSk7DQotICAgICAgICBGWFNZU19hc3NlcnQocERhdGFzZXRzWE1MTm9kZSk7DQotICAgICAgICBwRGF0YXNldHNYTUxOb2RlLT5TZXRTdHJpbmcoRlhfV1NUUkMoTCJ4bWxuczp4ZmEiKSwgRlhfV1NUUkMoTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLzEuMC8iKSk7DQotICAgICAgICBwRGF0YXNldHNSb290ID0gQ3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpOw0KLSAgICAgICAgcERhdGFzZXRzUm9vdC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMImRhdGFzZXRzIikpOw0KLSAgICAgICAgbV9wUm9vdE5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCktPkluc2VydENoaWxkTm9kZShwRGF0YXNldHNYTUxOb2RlKTsNCi0gICAgICAgIG1fcFJvb3ROb2RlLT5JbnNlcnRDaGlsZChwRGF0YXNldHNSb290KTsNCi0gICAgICAgIHBEYXRhc2V0c1Jvb3QtPlNldFhNTE1hcHBpbmdOb2RlKHBEYXRhc2V0c1hNTE5vZGUpOw0KK3ZvaWQgQ1hGQV9Eb2N1bWVudDo6RG9EYXRhTWVyZ2UoKSB7DQorICBDWEZBX05vZGUqIHBEYXRhc2V0c1Jvb3QgPSAoQ1hGQV9Ob2RlKilHZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhc2V0cyk7DQorICBpZiAoIXBEYXRhc2V0c1Jvb3QpIHsNCisgICAgSUZERV9YTUxFbGVtZW50KiBwRGF0YXNldHNYTUxOb2RlID0NCisgICAgICAgIElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKEZYX1dTVFJDKEwieGZhOmRhdGFzZXRzIikpOw0KKyAgICBGWFNZU19hc3NlcnQocERhdGFzZXRzWE1MTm9kZSk7DQorICAgIHBEYXRhc2V0c1hNTE5vZGUtPlNldFN0cmluZygNCisgICAgICAgIEZYX1dTVFJDKEwieG1sbnM6eGZhIiksDQorICAgICAgICBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyIpKTsNCisgICAgcERhdGFzZXRzUm9vdCA9IENyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YU1vZGVsKTsNCisgICAgcERhdGFzZXRzUm9vdC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMImRhdGFzZXRzIikpOw0KKyAgICBtX3BSb290Tm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKS0+SW5zZXJ0Q2hpbGROb2RlKHBEYXRhc2V0c1hNTE5vZGUpOw0KKyAgICBtX3BSb290Tm9kZS0+SW5zZXJ0Q2hpbGQocERhdGFzZXRzUm9vdCk7DQorICAgIHBEYXRhc2V0c1Jvb3QtPlNldFhNTE1hcHBpbmdOb2RlKHBEYXRhc2V0c1hNTE5vZGUpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlICpwRGF0YVJvb3QgPSBOVUxMLCAqcEREUm9vdCA9IE5VTEw7DQorICBDRlhfV2lkZVN0cmluZyB3c0RhdGFzZXRzVVJJOw0KKyAgcERhdGFzZXRzUm9vdC0+VHJ5TmFtZXNwYWNlKHdzRGF0YXNldHNVUkkpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPQ0KKyAgICAgICAgICAgcERhdGFzZXRzUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICBwQ2hpbGROb2RlOw0KKyAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocENoaWxkTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0RhdGFHcm91cCkgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIENYRkFfTm9kZSAqcERhdGFSb290ID0gTlVMTCwgKnBERFJvb3QgPSBOVUxMOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGFzZXRzVVJJOw0KLSAgICBwRGF0YXNldHNSb290LT5UcnlOYW1lc3BhY2Uod3NEYXRhc2V0c1VSSSk7DQotICAgIGZvcihDWEZBX05vZGUgKnBDaGlsZE5vZGUgPSBwRGF0YXNldHNSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDaGlsZE5vZGU7IHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpZihwQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwKSB7DQotICAgICAgICAgICAgY29udGludWU7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZXNwYWNlVVJJOw0KKyAgICBpZiAoIXBERFJvb3QgJiYgcENoaWxkTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBYRkFfSEFTSENPREVfRGF0YURlc2NyaXB0aW9uKSB7DQorICAgICAgaWYgKCFwQ2hpbGROb2RlLT5UcnlOYW1lc3BhY2Uod3NOYW1lc3BhY2VVUkkpKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKHdzTmFtZXNwYWNlVVJJID09DQorICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL25zLmFkb2JlLmNvbS9kYXRhLWRlc2NyaXB0aW9uLyIpKSB7DQorICAgICAgICBwRERSb290ID0gcENoaWxkTm9kZTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoIXBEYXRhUm9vdCAmJiBwQ2hpbGROb2RlLT5HZXROYW1lSGFzaCgpID09IFhGQV9IQVNIQ09ERV9EYXRhKSB7DQorICAgICAgaWYgKCFwQ2hpbGROb2RlLT5UcnlOYW1lc3BhY2Uod3NOYW1lc3BhY2VVUkkpKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKHdzTmFtZXNwYWNlVVJJID09IHdzRGF0YXNldHNVUkkpIHsNCisgICAgICAgIHBEYXRhUm9vdCA9IHBDaGlsZE5vZGU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwRGF0YVJvb3QgJiYgcEREUm9vdCkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoIXBEYXRhUm9vdCkgew0KKyAgICBJRkRFX1hNTEVsZW1lbnQqIHBEYXRhUm9vdFhNTE5vZGUgPQ0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50OjpDcmVhdGUoRlhfV1NUUkMoTCJ4ZmE6ZGF0YSIpKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBEYXRhUm9vdFhNTE5vZGUpOw0KKyAgICBwRGF0YVJvb3QgPSBDcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFHcm91cCk7DQorICAgIHBEYXRhUm9vdC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMImRhdGEiKSk7DQorICAgIHBEYXRhUm9vdC0+U2V0WE1MTWFwcGluZ05vZGUocERhdGFSb290WE1MTm9kZSk7DQorICAgIHBEYXRhc2V0c1Jvb3QtPkluc2VydENoaWxkKHBEYXRhUm9vdCk7DQorICB9DQorICBDWEZBX05vZGUqIHBEYXRhVG9wTGV2ZWwgPQ0KKyAgICAgIHBEYXRhUm9vdC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsNCisgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwRGF0YVRvcExldmVsID8gcERhdGFUb3BMZXZlbC0+R2V0TmFtZUhhc2goKSA6IDA7DQorICBDWEZBX05vZGUqIHBUZW1wbGF0ZVJvb3QgPQ0KKyAgICAgIG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9UZW1wbGF0ZSk7DQorICBpZiAoIXBUZW1wbGF0ZVJvb3QpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaG9zZW4gPQ0KKyAgICAgIGR3TmFtZUhhc2ggIT0gMCA/IHBUZW1wbGF0ZVJvb3QtPkdldEZpcnN0Q2hpbGRCeU5hbWUoZHdOYW1lSGFzaCkgOiBOVUxMOw0KKyAgaWYgKCFwVGVtcGxhdGVDaG9zZW4gfHwNCisgICAgICBwVGVtcGxhdGVDaG9zZW4tPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgIHBUZW1wbGF0ZUNob3NlbiA9IHBUZW1wbGF0ZVJvb3QtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KKyAgfQ0KKyAgaWYgKCFwVGVtcGxhdGVDaG9zZW4pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwRm9ybVJvb3QgPSBtX3BSb290Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRm9ybSk7DQorICBGWF9CT09MIGJFbXB0eUZvcm0gPSBGQUxTRTsNCisgIGlmICghcEZvcm1Sb290KSB7DQorICAgIGJFbXB0eUZvcm0gPSBUUlVFOw0KKyAgICBwRm9ybVJvb3QgPSBDcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX0VMRU1FTlRfRm9ybSk7DQorICAgIEZYU1lTX2Fzc2VydChwRm9ybVJvb3QpOw0KKyAgICBwRm9ybVJvb3QtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgRlhfV1NUUkMoTCJmb3JtIikpOw0KKyAgICBtX3BSb290Tm9kZS0+SW5zZXJ0Q2hpbGQocEZvcm1Sb290LCBOVUxMKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4NCisgICAgICAgIHNJdGVyYXRvcihwRm9ybVJvb3QpOw0KKyAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOyBwTm9kZTsNCisgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSk7DQorICAgIH0NCisgIH0NCisgIENYRkFfTm9kZSogcFN1YmZvcm1TZXROb2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIoDQorICAgICAgdGhpcywgcEZvcm1Sb290LCBwVGVtcGxhdGVDaG9zZW4sIEZBTFNFKTsNCisgIEZYU1lTX2Fzc2VydChwU3ViZm9ybVNldE5vZGUpOw0KKyAgaWYgKCFwRGF0YVRvcExldmVsKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0Zvcm1OYW1lID0gcFN1YmZvcm1TZXROb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGFUb3BMZXZlbE5hbWUgPQ0KKyAgICAgICAgd3NGb3JtTmFtZS5Jc0VtcHR5KCkgPyBGWF9XU1RSQyhMImZvcm0iKSA6IHdzRm9ybU5hbWU7DQorICAgIElGREVfWE1MRWxlbWVudCogcERhdGFUb3BMZXZlbFhNTE5vZGUgPQ0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50OjpDcmVhdGUod3NEYXRhVG9wTGV2ZWxOYW1lKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBEYXRhVG9wTGV2ZWxYTUxOb2RlKTsNCisgICAgcERhdGFUb3BMZXZlbCA9IENyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsNCisgICAgcERhdGFUb3BMZXZlbC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c0RhdGFUb3BMZXZlbE5hbWUpOw0KKyAgICBwRGF0YVRvcExldmVsLT5TZXRYTUxNYXBwaW5nTm9kZShwRGF0YVRvcExldmVsWE1MTm9kZSk7DQorICAgIENYRkFfTm9kZSogcEJlZm9yZU5vZGUgPSBwRGF0YVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgcERhdGFSb290LT5JbnNlcnRDaGlsZChwRGF0YVRvcExldmVsLCBwQmVmb3JlTm9kZSk7DQorICB9DQorICBGWFNZU19hc3NlcnQocERhdGFUb3BMZXZlbCk7DQorICBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKHBTdWJmb3JtU2V0Tm9kZSwgcERhdGFUb3BMZXZlbCk7DQorICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQ0KKyAgICAgICAgICAgcFRlbXBsYXRlQ2hvc2VuLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgIHBUZW1wbGF0ZUNoaWxkOw0KKyAgICAgICBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCkpIHsNCisgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcih0aGlzLCBwU3ViZm9ybVNldE5vZGUsIHBUZW1wbGF0ZUNoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOw0KKyAgICB9IGVsc2UgaWYgKHBUZW1wbGF0ZUNoaWxkLT5HZXRPYmplY3RUeXBlKCkgPT0NCisgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgICAgRGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRlbXBsYXRlQ2hpbGQsIHBTdWJmb3JtU2V0Tm9kZSwgcERhdGFUb3BMZXZlbCk7DQorICAgIH0NCisgIH0NCisgIGlmIChwRERSb290KSB7DQorICAgIFhGQV9EYXRhRGVzY3JpcHRpb25fVXBkYXRlRGF0YVJlbGF0aW9uKHBEYXRhUm9vdCwgcEREUm9vdCk7DQorICB9DQorICBEYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwU3ViZm9ybVNldE5vZGUpOw0KKyAgQ1hGQV9Ob2RlKiBwUGFnZVNldE5vZGUgPQ0KKyAgICAgIHBTdWJmb3JtU2V0Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfUGFnZVNldCk7DQorICB3aGlsZSAocFBhZ2VTZXROb2RlKSB7DQorICAgIG1fcFBlbmRpbmdQYWdlU2V0LkFkZChwUGFnZVNldE5vZGUpOw0KKyAgICBDWEZBX05vZGUqIHBOZXh0UGFnZVNldE5vZGUgPQ0KKyAgICAgICAgcFBhZ2VTZXROb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9QYWdlU2V0KTsNCisgICAgcFN1YmZvcm1TZXROb2RlLT5SZW1vdmVDaGlsZChwUGFnZVNldE5vZGUpOw0KKyAgICBwUGFnZVNldE5vZGUgPSBwTmV4dFBhZ2VTZXROb2RlOw0KKyAgfQ0KKyAgaWYgKCFiRW1wdHlGb3JtKSB7DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4NCisgICAgICAgIHNJdGVyYXRvcihwRm9ybVJvb3QpOw0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCisgICAgd2hpbGUgKHBOb2RlKSB7DQorICAgICAgaWYgKHBOb2RlLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KKyAgICAgICAgaWYgKHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSB8fA0KKyAgICAgICAgICAgIHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQorICAgICAgICAgIENYRkFfTm9kZSogcE5leHQgPSBzSXRlcmF0b3IuU2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPlJlbW92ZUNoaWxkKHBOb2RlKTsNCisgICAgICAgICAgcE5vZGUgPSBwTmV4dDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlLCBGQUxTRSk7DQorICAgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCiAgICAgICAgIH0NCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZXNwYWNlVVJJOw0KLSAgICAgICAgaWYoIXBERFJvb3QgJiYgcENoaWxkTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBYRkFfSEFTSENPREVfRGF0YURlc2NyaXB0aW9uKSB7DQotICAgICAgICAgICAgaWYoIXBDaGlsZE5vZGUtPlRyeU5hbWVzcGFjZSh3c05hbWVzcGFjZVVSSSkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKHdzTmFtZXNwYWNlVVJJID09IEZYX1dTVFJDKEwiaHR0cDovL25zLmFkb2JlLmNvbS9kYXRhLWRlc2NyaXB0aW9uLyIpKSB7DQotICAgICAgICAgICAgICAgIHBERFJvb3QgPSBwQ2hpbGROb2RlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZighcERhdGFSb290ICYmIHBDaGlsZE5vZGUtPkdldE5hbWVIYXNoKCkgPT0gWEZBX0hBU0hDT0RFX0RhdGEpIHsNCi0gICAgICAgICAgICBpZighcENoaWxkTm9kZS0+VHJ5TmFtZXNwYWNlKHdzTmFtZXNwYWNlVVJJKSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYod3NOYW1lc3BhY2VVUkkgPT0gd3NEYXRhc2V0c1VSSSkgew0KLSAgICAgICAgICAgICAgICBwRGF0YVJvb3QgPSBwQ2hpbGROb2RlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmKHBEYXRhUm9vdCAmJiBwRERSb290KSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCk7DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmKCFwRGF0YVJvb3QpIHsNCi0gICAgICAgIElGREVfWE1MRWxlbWVudCogcERhdGFSb290WE1MTm9kZSA9IElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKEZYX1dTVFJDKEwieGZhOmRhdGEiKSk7DQotICAgICAgICBGWFNZU19hc3NlcnQocERhdGFSb290WE1MTm9kZSk7DQotICAgICAgICBwRGF0YVJvb3QgPSBDcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFHcm91cCk7DQotICAgICAgICBwRGF0YVJvb3QtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgRlhfV1NUUkMoTCJkYXRhIikpOw0KLSAgICAgICAgcERhdGFSb290LT5TZXRYTUxNYXBwaW5nTm9kZShwRGF0YVJvb3RYTUxOb2RlKTsNCi0gICAgICAgIHBEYXRhc2V0c1Jvb3QtPkluc2VydENoaWxkKHBEYXRhUm9vdCk7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwRGF0YVRvcExldmVsID0gcERhdGFSb290LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9EYXRhR3JvdXApOw0KLSAgICBGWF9EV09SRCBkd05hbWVIYXNoID0gcERhdGFUb3BMZXZlbCA/IHBEYXRhVG9wTGV2ZWwtPkdldE5hbWVIYXNoKCkgOiAwOw0KLSAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZVJvb3QgPSBtX3BSb290Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfVGVtcGxhdGUpOw0KLSAgICBpZiAoIXBUZW1wbGF0ZVJvb3QpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZUNob3NlbiA9IGR3TmFtZUhhc2ggIT0gMCA/IHBUZW1wbGF0ZVJvb3QtPkdldEZpcnN0Q2hpbGRCeU5hbWUoZHdOYW1lSGFzaCkgOiBOVUxMOw0KLSAgICBpZighcFRlbXBsYXRlQ2hvc2VuIHx8IHBUZW1wbGF0ZUNob3Nlbi0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCi0gICAgICAgIHBUZW1wbGF0ZUNob3NlbiA9IHBUZW1wbGF0ZVJvb3QtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KLSAgICB9DQotICAgIGlmKCFwVGVtcGxhdGVDaG9zZW4pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Gb3JtKTsNCi0gICAgRlhfQk9PTCBiRW1wdHlGb3JtID0gRkFMU0U7DQotICAgIGlmKCFwRm9ybVJvb3QpIHsNCi0gICAgICAgIGJFbXB0eUZvcm0gPSBUUlVFOw0KLSAgICAgICAgcEZvcm1Sb290ID0gQ3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9FTEVNRU5UX0Zvcm0pOw0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBGb3JtUm9vdCk7DQotICAgICAgICBwRm9ybVJvb3QtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgRlhfV1NUUkMoTCJmb3JtIikpOw0KLSAgICAgICAgbV9wUm9vdE5vZGUtPkluc2VydENoaWxkKHBGb3JtUm9vdCwgTlVMTCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+IHNJdGVyYXRvcihwRm9ybVJvb3QpOw0KLSAgICAgICAgZm9yKENYRkFfTm9kZSAqcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcFN1YmZvcm1TZXROb2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIodGhpcywgcEZvcm1Sb290LCBwVGVtcGxhdGVDaG9zZW4sIEZBTFNFKTsNCi0gICAgRlhTWVNfYXNzZXJ0KHBTdWJmb3JtU2V0Tm9kZSk7DQotICAgIGlmICghcERhdGFUb3BMZXZlbCkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzRm9ybU5hbWUgPSBwU3ViZm9ybVNldE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGFUb3BMZXZlbE5hbWUgPSB3c0Zvcm1OYW1lLklzRW1wdHkoKSA/IEZYX1dTVFJDKEwiZm9ybSIpIDogd3NGb3JtTmFtZTsNCi0gICAgICAgIElGREVfWE1MRWxlbWVudCogcERhdGFUb3BMZXZlbFhNTE5vZGUgPSBJRkRFX1hNTEVsZW1lbnQ6OkNyZWF0ZSh3c0RhdGFUb3BMZXZlbE5hbWUpOw0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBEYXRhVG9wTGV2ZWxYTUxOb2RlKTsNCi0gICAgICAgIHBEYXRhVG9wTGV2ZWwgPSBDcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFHcm91cCk7DQotICAgICAgICBwRGF0YVRvcExldmVsLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzRGF0YVRvcExldmVsTmFtZSk7DQotICAgICAgICBwRGF0YVRvcExldmVsLT5TZXRYTUxNYXBwaW5nTm9kZShwRGF0YVRvcExldmVsWE1MTm9kZSk7DQotICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmVOb2RlID0gcERhdGFSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICBwRGF0YVJvb3QtPkluc2VydENoaWxkKHBEYXRhVG9wTGV2ZWwsIHBCZWZvcmVOb2RlKTsNCi0gICAgfQ0KLSAgICBGWFNZU19hc3NlcnQocERhdGFUb3BMZXZlbCk7DQotICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocFN1YmZvcm1TZXROb2RlLCBwRGF0YVRvcExldmVsKTsNCi0gICAgZm9yIChDWEZBX05vZGUgKnBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hvc2VuLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpZiAoWEZBX05lZWRHZW5lcmF0ZUZvcm0ocFRlbXBsYXRlQ2hpbGQpKSB7DQotICAgICAgICAgICAgWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIodGhpcywgcFN1YmZvcm1TZXROb2RlLCBwVGVtcGxhdGVDaGlsZCwgVFJVRSk7DQotICAgICAgICB9IGVsc2UgaWYocFRlbXBsYXRlQ2hpbGQtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQotICAgICAgICAgICAgRGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRlbXBsYXRlQ2hpbGQsIHBTdWJmb3JtU2V0Tm9kZSwgcERhdGFUb3BMZXZlbCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYocEREUm9vdCkgew0KLSAgICAgICAgWEZBX0RhdGFEZXNjcmlwdGlvbl9VcGRhdGVEYXRhUmVsYXRpb24ocERhdGFSb290LCBwRERSb290KTsNCi0gICAgfQ0KLSAgICBEYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwU3ViZm9ybVNldE5vZGUpOw0KLSAgICBDWEZBX05vZGUqIHBQYWdlU2V0Tm9kZSA9IHBTdWJmb3JtU2V0Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfUGFnZVNldCk7DQotICAgIHdoaWxlIChwUGFnZVNldE5vZGUpIHsNCi0gICAgICAgIG1fcFBlbmRpbmdQYWdlU2V0LkFkZChwUGFnZVNldE5vZGUpOw0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwTmV4dFBhZ2VTZXROb2RlID0gcFBhZ2VTZXROb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9QYWdlU2V0KTsNCi0gICAgICAgIHBTdWJmb3JtU2V0Tm9kZS0+UmVtb3ZlQ2hpbGQocFBhZ2VTZXROb2RlKTsNCi0gICAgICAgIHBQYWdlU2V0Tm9kZSA9IHBOZXh0UGFnZVNldE5vZGU7DQotICAgIH0NCi0gICAgaWYoIWJFbXB0eUZvcm0pIHsNCi0gICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4gc0l0ZXJhdG9yKHBGb3JtUm9vdCk7DQotICAgICAgICBDWEZBX05vZGUgKnBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCi0gICAgICAgIHdoaWxlKHBOb2RlKSB7DQotICAgICAgICAgICAgaWYocE5vZGUtPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpKSB7DQotICAgICAgICAgICAgICAgIGlmKHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSB8fCBwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcikgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV4dCA9IHNJdGVyYXRvci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPlJlbW92ZUNoaWxkKHBOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIHBOb2RlID0gcE5leHQ7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCi0gICAgICAgICAgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQotICAgICAgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCisgIH0NCiB9DQotdm9pZCBDWEZBX0RvY3VtZW50OjpEb0RhdGFSZW1lcmdlKEZYX0JPT0wgYkRvRGF0YU1lcmdlKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRm9ybVJvb3QgPSAoQ1hGQV9Ob2RlKil0aGlzLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCi0gICAgaWYocEZvcm1Sb290KSB7DQotICAgICAgICB3aGlsZShDWEZBX05vZGUqIHBOb2RlID0gcEZvcm1Sb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCi0gICAgICAgICAgICBwRm9ybVJvb3QtPlJlbW92ZUNoaWxkKHBOb2RlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBGb3JtUm9vdC0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIE5VTEwpOw0KK3ZvaWQgQ1hGQV9Eb2N1bWVudDo6RG9EYXRhUmVtZXJnZShGWF9CT09MIGJEb0RhdGFNZXJnZSkgew0KKyAgQ1hGQV9Ob2RlKiBwRm9ybVJvb3QgPSAoQ1hGQV9Ob2RlKil0aGlzLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgIGlmIChwRm9ybVJvb3QpIHsNCisgICAgd2hpbGUgKENYRkFfTm9kZSogcE5vZGUgPSBwRm9ybVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KKyAgICAgIHBGb3JtUm9vdC0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KICAgICB9DQotICAgIFhGQV9EYXRhTWVyZ2VfQ2xlYXJHbG9iYWxCaW5kaW5nKHRoaXMpOw0KLSAgICBpZiAoYkRvRGF0YU1lcmdlKSB7DQotICAgICAgICBEb0RhdGFNZXJnZSgpOw0KLSAgICB9DQotICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yID0gR2V0TGF5b3V0UHJvY2Vzc29yKCk7DQotICAgIHBMYXlvdXRQcm9jZXNzb3ItPlNldEZvcmNlUmVMYXlvdXQoVFJVRSk7DQorICAgIHBGb3JtUm9vdC0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIE5VTEwpOw0KKyAgfQ0KKyAgWEZBX0RhdGFNZXJnZV9DbGVhckdsb2JhbEJpbmRpbmcodGhpcyk7DQorICBpZiAoYkRvRGF0YU1lcmdlKSB7DQorICAgIERvRGF0YU1lcmdlKCk7DQorICB9DQorICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFByb2Nlc3NvciA9IEdldExheW91dFByb2Nlc3NvcigpOw0KKyAgcExheW91dFByb2Nlc3Nvci0+U2V0Rm9yY2VSZUxheW91dChUUlVFKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuaAppbmRleCA5YjdiYzVhLi41ZGE0MTIxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuaApAQCAtNiw3ICs2LDE1IEBACiANCiAjaWZuZGVmIF9YRkFfRE9DVU1FTlRfREFUQU1FUkdFUl9JTVBfSF8NCiAjZGVmaW5lIF9YRkFfRE9DVU1FTlRfREFUQU1FUkdFUl9JTVBfSF8NCi1DWEZBX05vZGUqIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCwgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLCBGWF9CT09MIGJSZWN1cnNpdmUsIENYRkFfTm9kZUFycmF5KiBwU3ViZm9ybUFycmF5ID0gTlVMTCk7DQorQ1hGQV9Ob2RlKiBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcigNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICBDWEZBX05vZGUqIHBGb3JtUGFyZW50LA0KKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsDQorICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgQ1hGQV9Ob2RlQXJyYXkqIHBTdWJmb3JtQXJyYXkgPSBOVUxMKTsNCiBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZShDWEZBX05vZGUqIHBQYXJlbnRGb3JtTm9kZSk7DQotQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBYRkFfRUxFTUVOVCBlQ2xhc3NJRCwgRlhfRFdPUkQgZHdOYW1lSGFzaCwgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCk7DQorQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVDbGFzc0lELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUhhc2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCk7DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfaW1wLmNwcAppbmRleCA0ZjYwNDMzLi44ZTY1ZjJmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfaW1wLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfaW1wLmNwcApAQCAtMjQsMzk1ICsyNCw0MjIgQEAKICNpbmNsdWRlICJ4ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgiDQogI2luY2x1ZGUgInhmYV9zY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuaCINCiAjaW5jbHVkZSAieGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oIg0KLUNYRkFfRG9jdW1lbnQ6OkNYRkFfRG9jdW1lbnQoSVhGQV9Eb2NQYXJzZXIgKnBQYXJzZXIpDQotICAgIDogbV9wUGFyc2VyKHBQYXJzZXIpDQotICAgICwgbV9wTGF5b3V0UHJvY2Vzc29yKE5VTEwpDQotICAgICwgbV9wUm9vdE5vZGUoTlVMTCkNCi0gICAgLCBtX3BTY3JpcHRDb250ZXh0KE5VTEwpDQotICAgICwgbV9wTG9jYWxNZ3IoTlVMTCkNCi0gICAgLCBtX3BTY3JpcHREYXRhV2luZG93KE5VTEwpDQotICAgICwgbV9wU2NyaXB0RXZlbnQoTlVMTCkNCi0gICAgLCBtX3BTY3JpcHRIb3N0KE5VTEwpDQotICAgICwgbV9wU2NyaXB0TG9nKE5VTEwpDQotICAgICwgbV9wU2NyaXB0TGF5b3V0KE5VTEwpDQotICAgICwgbV9wU2NyaXB0U2lnbmF0dXJlKE5VTEwpDQotICAgICwgbV9kd0RvY0ZsYWdzKDApDQotICAgICwgbV9lQ3VyVmVyc2lvbk1vZGUoWEZBX1ZFUlNJT05fREVGQVVMVCkNCi17DQotICAgIEFTU0VSVChtX3BQYXJzZXIpOw0KK0NYRkFfRG9jdW1lbnQ6OkNYRkFfRG9jdW1lbnQoSVhGQV9Eb2NQYXJzZXIqIHBQYXJzZXIpDQorICAgIDogbV9wUGFyc2VyKHBQYXJzZXIpLA0KKyAgICAgIG1fcExheW91dFByb2Nlc3NvcihOVUxMKSwNCisgICAgICBtX3BSb290Tm9kZShOVUxMKSwNCisgICAgICBtX3BTY3JpcHRDb250ZXh0KE5VTEwpLA0KKyAgICAgIG1fcExvY2FsTWdyKE5VTEwpLA0KKyAgICAgIG1fcFNjcmlwdERhdGFXaW5kb3coTlVMTCksDQorICAgICAgbV9wU2NyaXB0RXZlbnQoTlVMTCksDQorICAgICAgbV9wU2NyaXB0SG9zdChOVUxMKSwNCisgICAgICBtX3BTY3JpcHRMb2coTlVMTCksDQorICAgICAgbV9wU2NyaXB0TGF5b3V0KE5VTEwpLA0KKyAgICAgIG1fcFNjcmlwdFNpZ25hdHVyZShOVUxMKSwNCisgICAgICBtX2R3RG9jRmxhZ3MoMCksDQorICAgICAgbV9lQ3VyVmVyc2lvbk1vZGUoWEZBX1ZFUlNJT05fREVGQVVMVCkgew0KKyAgQVNTRVJUKG1fcFBhcnNlcik7DQogfQ0KLUNYRkFfRG9jdW1lbnQ6On5DWEZBX0RvY3VtZW50KCkNCi17DQotICAgIGlmIChtX3BSb290Tm9kZSkgew0KLSAgICAgICAgZGVsZXRlIG1fcFJvb3ROb2RlOw0KLSAgICB9DQotICAgIFB1cmdlTm9kZXMoKTsNCitDWEZBX0RvY3VtZW50Ojp+Q1hGQV9Eb2N1bWVudCgpIHsNCisgIGlmIChtX3BSb290Tm9kZSkgew0KKyAgICBkZWxldGUgbV9wUm9vdE5vZGU7DQorICB9DQorICBQdXJnZU5vZGVzKCk7DQogfQ0KLXZvaWQgQ1hGQV9Eb2N1bWVudDo6Q2xlYXJMYXlvdXREYXRhKCkNCi17DQotICAgIGlmKG1fcExheW91dFByb2Nlc3Nvcikgew0KLSAgICAgICAgZGVsZXRlIG1fcExheW91dFByb2Nlc3NvcjsNCi0gICAgICAgIG1fcExheW91dFByb2Nlc3NvciA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKG1fcFNjcmlwdENvbnRleHQpIHsNCi0gICAgICAgIG1fcFNjcmlwdENvbnRleHQtPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcFNjcmlwdENvbnRleHQgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmIChtX3BMb2NhbE1ncikgew0KLSAgICAgICAgZGVsZXRlIG1fcExvY2FsTWdyOw0KLSAgICAgICAgbV9wTG9jYWxNZ3IgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKG1fcFNjcmlwdERhdGFXaW5kb3cpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BTY3JpcHREYXRhV2luZG93Ow0KLSAgICAgICAgbV9wU2NyaXB0RGF0YVdpbmRvdyA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYobV9wU2NyaXB0RXZlbnQpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BTY3JpcHRFdmVudDsNCi0gICAgICAgIG1fcFNjcmlwdEV2ZW50ID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wU2NyaXB0SG9zdCkgew0KLSAgICAgICAgZGVsZXRlIG1fcFNjcmlwdEhvc3Q7DQotICAgICAgICBtX3BTY3JpcHRIb3N0ID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAobV9wU2NyaXB0TG9nKSB7DQotICAgICAgICBkZWxldGUgbV9wU2NyaXB0TG9nOw0KLSAgICAgICAgbV9wU2NyaXB0TG9nID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZihtX3BTY3JpcHRMYXlvdXQpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BTY3JpcHRMYXlvdXQ7DQotICAgICAgICBtX3BTY3JpcHRMYXlvdXQgPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKG1fcFNjcmlwdFNpZ25hdHVyZSkgew0KLSAgICAgICAgZGVsZXRlIG1fcFNjcmlwdFNpZ25hdHVyZTsNCi0gICAgICAgIG1fcFNjcmlwdFNpZ25hdHVyZSA9IE5VTEw7DQotICAgIH0NCit2b2lkIENYRkFfRG9jdW1lbnQ6OkNsZWFyTGF5b3V0RGF0YSgpIHsNCisgIGlmIChtX3BMYXlvdXRQcm9jZXNzb3IpIHsNCisgICAgZGVsZXRlIG1fcExheW91dFByb2Nlc3NvcjsNCisgICAgbV9wTGF5b3V0UHJvY2Vzc29yID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BTY3JpcHRDb250ZXh0KSB7DQorICAgIG1fcFNjcmlwdENvbnRleHQtPlJlbGVhc2UoKTsNCisgICAgbV9wU2NyaXB0Q29udGV4dCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wTG9jYWxNZ3IpIHsNCisgICAgZGVsZXRlIG1fcExvY2FsTWdyOw0KKyAgICBtX3BMb2NhbE1nciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wU2NyaXB0RGF0YVdpbmRvdykgew0KKyAgICBkZWxldGUgbV9wU2NyaXB0RGF0YVdpbmRvdzsNCisgICAgbV9wU2NyaXB0RGF0YVdpbmRvdyA9IE5VTEw7DQorICB9DQorICBpZiAobV9wU2NyaXB0RXZlbnQpIHsNCisgICAgZGVsZXRlIG1fcFNjcmlwdEV2ZW50Ow0KKyAgICBtX3BTY3JpcHRFdmVudCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wU2NyaXB0SG9zdCkgew0KKyAgICBkZWxldGUgbV9wU2NyaXB0SG9zdDsNCisgICAgbV9wU2NyaXB0SG9zdCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wU2NyaXB0TG9nKSB7DQorICAgIGRlbGV0ZSBtX3BTY3JpcHRMb2c7DQorICAgIG1fcFNjcmlwdExvZyA9IE5VTEw7DQorICB9DQorICBpZiAobV9wU2NyaXB0TGF5b3V0KSB7DQorICAgIGRlbGV0ZSBtX3BTY3JpcHRMYXlvdXQ7DQorICAgIG1fcFNjcmlwdExheW91dCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wU2NyaXB0U2lnbmF0dXJlKSB7DQorICAgIGRlbGV0ZSBtX3BTY3JpcHRTaWduYXR1cmU7DQorICAgIG1fcFNjcmlwdFNpZ25hdHVyZSA9IE5VTEw7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Eb2N1bWVudDo6U2V0Um9vdChDWEZBX05vZGUqIHBOZXdSb290KQ0KLXsNCi0gICAgaWYobV9wUm9vdE5vZGUpIHsNCi0gICAgICAgIEFkZFB1cmdlTm9kZShtX3BSb290Tm9kZSk7DQotICAgIH0NCi0gICAgbV9wUm9vdE5vZGUgPSBwTmV3Um9vdDsNCi0gICAgUmVtb3ZlUHVyZ2VOb2RlKHBOZXdSb290KTsNCit2b2lkIENYRkFfRG9jdW1lbnQ6OlNldFJvb3QoQ1hGQV9Ob2RlKiBwTmV3Um9vdCkgew0KKyAgaWYgKG1fcFJvb3ROb2RlKSB7DQorICAgIEFkZFB1cmdlTm9kZShtX3BSb290Tm9kZSk7DQorICB9DQorICBtX3BSb290Tm9kZSA9IHBOZXdSb290Ow0KKyAgUmVtb3ZlUHVyZ2VOb2RlKHBOZXdSb290KTsNCiB9DQotSVhGQV9Ob3RpZnkqIENYRkFfRG9jdW1lbnQ6OkdldE5vdGlmeSgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wUGFyc2VyLT5HZXROb3RpZnkoKTsNCitJWEZBX05vdGlmeSogQ1hGQV9Eb2N1bWVudDo6R2V0Tm90aWZ5KCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcFBhcnNlci0+R2V0Tm90aWZ5KCk7DQogfQ0KLUNYRkFfT2JqZWN0KiBDWEZBX0RvY3VtZW50OjpHZXRYRkFOb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOb2RlTmFtZSkNCi17DQotICAgIHJldHVybiBHZXRYRkFOb2RlKEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTm9kZU5hbWUuR2V0UHRyKCksIHdzTm9kZU5hbWUuR2V0TGVuZ3RoKCkpKTsNCitDWEZBX09iamVjdCogQ1hGQV9Eb2N1bWVudDo6R2V0WEZBTm9kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTm9kZU5hbWUpIHsNCisgIHJldHVybiBHZXRYRkFOb2RlKA0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTm9kZU5hbWUuR2V0UHRyKCksIHdzTm9kZU5hbWUuR2V0TGVuZ3RoKCkpKTsNCiB9DQotQ1hGQV9PYmplY3QqIENYRkFfRG9jdW1lbnQ6OkdldFhGQU5vZGUoRlhfRFdPUkQgZHdOb2RlTmFtZUhhc2gpDQotew0KLSAgICBzd2l0Y2goZHdOb2RlTmFtZUhhc2gpIHsNCi0gICAgICAgIGNhc2UgWEZBX0hBU0hDT0RFX0RhdGE6IHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YXNldHNOb2RlID0gKENYRkFfTm9kZSopR2V0WEZBTm9kZShYRkFfSEFTSENPREVfRGF0YXNldHMpOw0KLSAgICAgICAgICAgICAgICBpZighcERhdGFzZXRzTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBEYXRhc2V0c0NoaWxkID0gcERhdGFzZXRzTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsgcERhdGFzZXRzQ2hpbGQ7IHBEYXRhc2V0c0NoaWxkID0gcERhdGFzZXRzQ2hpbGQtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UX0RhdGFHcm91cCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBEYXRhc2V0c0NoaWxkLT5HZXROYW1lSGFzaCgpICE9IFhGQV9IQVNIQ09ERV9EYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWVzcGFjZVVSSTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwRGF0YXNldHNDaGlsZC0+VHJ5TmFtZXNwYWNlKHdzTmFtZXNwYWNlVVJJKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRhc2V0c1VSSTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwRGF0YXNldHNOb2RlLT5UcnlOYW1lc3BhY2Uod3NEYXRhc2V0c1VSSSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKHdzTmFtZXNwYWNlVVJJID09IHdzRGF0YXNldHNVUkkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcERhdGFzZXRzQ2hpbGQ7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICBjYXNlIFhGQV9IQVNIQ09ERV9SZWNvcmQ6IHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YSA9IChDWEZBX05vZGUqKUdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0RhdGEpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcERhdGEgPyBwRGF0YS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRGF0YUdyb3VwKSA6IE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBYRkFfSEFTSENPREVfRGF0YVdpbmRvdzogew0KLSAgICAgICAgICAgICAgICBpZihtX3BTY3JpcHREYXRhV2luZG93ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcFNjcmlwdERhdGFXaW5kb3cgPSBGWF9ORVcgQ1NjcmlwdF9EYXRhV2luZG93KHRoaXMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBtX3BTY3JpcHREYXRhV2luZG93Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgWEZBX0hBU0hDT0RFX0V2ZW50OiB7DQotICAgICAgICAgICAgICAgIGlmKG1fcFNjcmlwdEV2ZW50ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcFNjcmlwdEV2ZW50ID0gRlhfTkVXIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbCh0aGlzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9wU2NyaXB0RXZlbnQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBYRkFfSEFTSENPREVfSG9zdDogew0KLSAgICAgICAgICAgICAgICBpZihtX3BTY3JpcHRIb3N0ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcFNjcmlwdEhvc3QgPSBGWF9ORVcgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwodGhpcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1fcFNjcmlwdEhvc3Q7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBYRkFfSEFTSENPREVfTG9nOiB7DQotICAgICAgICAgICAgICAgIGlmIChtX3BTY3JpcHRMb2cgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wU2NyaXB0TG9nID0gRlhfTkVXIENTY3JpcHRfTG9nUHNldWRvTW9kZWwodGhpcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1fcFNjcmlwdExvZzsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIFhGQV9IQVNIQ09ERV9TaWduYXR1cmU6IHsNCi0gICAgICAgICAgICAgICAgaWYobV9wU2NyaXB0U2lnbmF0dXJlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcFNjcmlwdFNpZ25hdHVyZSA9IEZYX05FVyBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKHRoaXMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBtX3BTY3JpcHRTaWduYXR1cmU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBYRkFfSEFTSENPREVfTGF5b3V0OiB7DQotICAgICAgICAgICAgICAgIGlmKG1fcFNjcmlwdExheW91dCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BTY3JpcHRMYXlvdXQgPSBGWF9ORVcgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbCh0aGlzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9wU2NyaXB0TGF5b3V0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKGR3Tm9kZU5hbWVIYXNoKTsNCi0gICAgfQ0KLX0NCi1DWEZBX05vZGUqIENYRkFfRG9jdW1lbnQ6OkNyZWF0ZU5vZGUoRlhfRFdPUkQgZHdQYWNrZXQsIFhGQV9FTEVNRU5UIGVFbGVtZW50KQ0KLXsNCi0gICAgWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldCA9IFhGQV9HZXRQYWNrZXRCeUlEKGR3UGFja2V0KTsNCi0gICAgcmV0dXJuIENyZWF0ZU5vZGUocFBhY2tldCwgZUVsZW1lbnQpOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfRG9jdW1lbnQ6OkNyZWF0ZU5vZGUoWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldCwgWEZBX0VMRU1FTlQgZUVsZW1lbnQpDQotew0KLSAgICBpZiAocFBhY2tldCA9PSBOVUxMKSB7DQorQ1hGQV9PYmplY3QqIENYRkFfRG9jdW1lbnQ6OkdldFhGQU5vZGUoRlhfRFdPUkQgZHdOb2RlTmFtZUhhc2gpIHsNCisgIHN3aXRjaCAoZHdOb2RlTmFtZUhhc2gpIHsNCisgICAgY2FzZSBYRkFfSEFTSENPREVfRGF0YTogew0KKyAgICAgIENYRkFfTm9kZSogcERhdGFzZXRzTm9kZSA9IChDWEZBX05vZGUqKUdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKTsNCisgICAgICBpZiAoIXBEYXRhc2V0c05vZGUpIHsNCiAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIFhGQV9MUENFTEVNRU5USU5GTyBwRWxlbWVudCA9IFhGQV9HZXRFbGVtZW50QnlJRChlRWxlbWVudCk7DQotICAgIGlmIChwRWxlbWVudCAmJiAocEVsZW1lbnQtPmR3UGFja2V0cyAmIHBQYWNrZXQtPmVOYW1lKSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IEZYX05FVyBDWEZBX05vZGUodGhpcywgcFBhY2tldC0+ZU5hbWUsIHBFbGVtZW50LT5lTmFtZSk7DQotICAgICAgICBpZihwTm9kZSkgew0KLSAgICAgICAgICAgIEFkZFB1cmdlTm9kZShwTm9kZSk7DQorICAgICAgfQ0KKyAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwRGF0YXNldHNDaGlsZCA9DQorICAgICAgICAgICAgICAgcERhdGFzZXRzTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsNCisgICAgICAgICAgIHBEYXRhc2V0c0NoaWxkOw0KKyAgICAgICAgICAgcERhdGFzZXRzQ2hpbGQgPQ0KKyAgICAgICAgICAgICAgIHBEYXRhc2V0c0NoaWxkLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9EYXRhR3JvdXApKSB7DQorICAgICAgICBpZiAocERhdGFzZXRzQ2hpbGQtPkdldE5hbWVIYXNoKCkgIT0gWEZBX0hBU0hDT0RFX0RhdGEpIHsNCisgICAgICAgICAgY29udGludWU7DQogICAgICAgICB9DQotICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWVzcGFjZVVSSTsNCisgICAgICAgIGlmICghcERhdGFzZXRzQ2hpbGQtPlRyeU5hbWVzcGFjZSh3c05hbWVzcGFjZVVSSSkpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGFzZXRzVVJJOw0KKyAgICAgICAgaWYgKCFwRGF0YXNldHNOb2RlLT5UcnlOYW1lc3BhY2Uod3NEYXRhc2V0c1VSSSkpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAod3NOYW1lc3BhY2VVUkkgPT0gd3NEYXRhc2V0c1VSSSkgew0KKyAgICAgICAgICByZXR1cm4gcERhdGFzZXRzQ2hpbGQ7DQorICAgICAgICB9DQorICAgICAgfQ0KICAgICB9DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIGNhc2UgWEZBX0hBU0hDT0RFX1JlY29yZDogew0KKyAgICAgIENYRkFfTm9kZSogcERhdGEgPSAoQ1hGQV9Ob2RlKilHZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhKTsNCisgICAgICByZXR1cm4gcERhdGEgPyBwRGF0YS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRGF0YUdyb3VwKSA6IE5VTEw7DQorICAgIH0NCisgICAgY2FzZSBYRkFfSEFTSENPREVfRGF0YVdpbmRvdzogew0KKyAgICAgIGlmIChtX3BTY3JpcHREYXRhV2luZG93ID09IE5VTEwpIHsNCisgICAgICAgIG1fcFNjcmlwdERhdGFXaW5kb3cgPSBGWF9ORVcgQ1NjcmlwdF9EYXRhV2luZG93KHRoaXMpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gbV9wU2NyaXB0RGF0YVdpbmRvdzsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9IQVNIQ09ERV9FdmVudDogew0KKyAgICAgIGlmIChtX3BTY3JpcHRFdmVudCA9PSBOVUxMKSB7DQorICAgICAgICBtX3BTY3JpcHRFdmVudCA9IEZYX05FVyBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwodGhpcyk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBtX3BTY3JpcHRFdmVudDsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9IQVNIQ09ERV9Ib3N0OiB7DQorICAgICAgaWYgKG1fcFNjcmlwdEhvc3QgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wU2NyaXB0SG9zdCA9IEZYX05FVyBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbCh0aGlzKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIG1fcFNjcmlwdEhvc3Q7DQorICAgIH0NCisgICAgY2FzZSBYRkFfSEFTSENPREVfTG9nOiB7DQorICAgICAgaWYgKG1fcFNjcmlwdExvZyA9PSBOVUxMKSB7DQorICAgICAgICBtX3BTY3JpcHRMb2cgPSBGWF9ORVcgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbCh0aGlzKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIG1fcFNjcmlwdExvZzsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9IQVNIQ09ERV9TaWduYXR1cmU6IHsNCisgICAgICBpZiAobV9wU2NyaXB0U2lnbmF0dXJlID09IE5VTEwpIHsNCisgICAgICAgIG1fcFNjcmlwdFNpZ25hdHVyZSA9IEZYX05FVyBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKHRoaXMpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gbV9wU2NyaXB0U2lnbmF0dXJlOw0KKyAgICB9DQorICAgIGNhc2UgWEZBX0hBU0hDT0RFX0xheW91dDogew0KKyAgICAgIGlmIChtX3BTY3JpcHRMYXlvdXQgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wU2NyaXB0TGF5b3V0ID0gRlhfTkVXIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwodGhpcyk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBtX3BTY3JpcHRMYXlvdXQ7DQorICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gbV9wUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUoZHdOb2RlTmFtZUhhc2gpOw0KKyAgfQ0KK30NCitDWEZBX05vZGUqIENYRkFfRG9jdW1lbnQ6OkNyZWF0ZU5vZGUoRlhfRFdPUkQgZHdQYWNrZXQsIFhGQV9FTEVNRU5UIGVFbGVtZW50KSB7DQorICBYRkFfTFBDUEFDS0VUSU5GTyBwUGFja2V0ID0gWEZBX0dldFBhY2tldEJ5SUQoZHdQYWNrZXQpOw0KKyAgcmV0dXJuIENyZWF0ZU5vZGUocFBhY2tldCwgZUVsZW1lbnQpOw0KK30NCitDWEZBX05vZGUqIENYRkFfRG9jdW1lbnQ6OkNyZWF0ZU5vZGUoWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQpIHsNCisgIGlmIChwUGFja2V0ID09IE5VTEwpIHsNCiAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBYRkFfTFBDRUxFTUVOVElORk8gcEVsZW1lbnQgPSBYRkFfR2V0RWxlbWVudEJ5SUQoZUVsZW1lbnQpOw0KKyAgaWYgKHBFbGVtZW50ICYmIChwRWxlbWVudC0+ZHdQYWNrZXRzICYgcFBhY2tldC0+ZU5hbWUpKSB7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBGWF9ORVcgQ1hGQV9Ob2RlKHRoaXMsIHBQYWNrZXQtPmVOYW1lLCBwRWxlbWVudC0+ZU5hbWUpOw0KKyAgICBpZiAocE5vZGUpIHsNCisgICAgICBBZGRQdXJnZU5vZGUocE5vZGUpOw0KKyAgICB9DQorICAgIHJldHVybiBwTm9kZTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi12b2lkIENYRkFfRG9jdW1lbnQ6OkFkZFB1cmdlTm9kZShDWEZBX05vZGUgKnBOb2RlKQ0KLXsNCi0gICAgbV9yZ1B1cmdlTm9kZXMuQWRkKHBOb2RlKTsNCit2b2lkIENYRkFfRG9jdW1lbnQ6OkFkZFB1cmdlTm9kZShDWEZBX05vZGUqIHBOb2RlKSB7DQorICBtX3JnUHVyZ2VOb2Rlcy5BZGQocE5vZGUpOw0KIH0NCi1GWF9CT09MIENYRkFfRG9jdW1lbnQ6OlJlbW92ZVB1cmdlTm9kZShDWEZBX05vZGUgKnBOb2RlKQ0KLXsNCi0gICAgcmV0dXJuIG1fcmdQdXJnZU5vZGVzLlJlbW92ZUtleShwTm9kZSk7DQorRlhfQk9PTCBDWEZBX0RvY3VtZW50OjpSZW1vdmVQdXJnZU5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgcmV0dXJuIG1fcmdQdXJnZU5vZGVzLlJlbW92ZUtleShwTm9kZSk7DQogfQ0KLXZvaWQgQ1hGQV9Eb2N1bWVudDo6UHVyZ2VOb2RlcygpDQotew0KLSAgICBGWF9QT1NJVElPTiBwc05vZGUgPSBtX3JnUHVyZ2VOb2Rlcy5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIHdoaWxlKHBzTm9kZSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZTsNCi0gICAgICAgIG1fcmdQdXJnZU5vZGVzLkdldE5leHRBc3NvYyhwc05vZGUsIHBOb2RlKTsNCi0gICAgICAgIGRlbGV0ZSBwTm9kZTsNCi0gICAgfQ0KLSAgICBtX3JnUHVyZ2VOb2Rlcy5SZW1vdmVBbGwoKTsNCit2b2lkIENYRkFfRG9jdW1lbnQ6OlB1cmdlTm9kZXMoKSB7DQorICBGWF9QT1NJVElPTiBwc05vZGUgPSBtX3JnUHVyZ2VOb2Rlcy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHNOb2RlKSB7DQorICAgIENYRkFfTm9kZSogcE5vZGU7DQorICAgIG1fcmdQdXJnZU5vZGVzLkdldE5leHRBc3NvYyhwc05vZGUsIHBOb2RlKTsNCisgICAgZGVsZXRlIHBOb2RlOw0KKyAgfQ0KKyAgbV9yZ1B1cmdlTm9kZXMuUmVtb3ZlQWxsKCk7DQogfQ0KLXZvaWQgQ1hGQV9Eb2N1bWVudDo6U2V0RmxhZyhGWF9EV09SRCBkd0ZsYWcsIEZYX0JPT0wgYk9uICkNCi17DQotICAgIGlmIChiT24pIHsNCi0gICAgICAgIG1fZHdEb2NGbGFncyB8PSBkd0ZsYWc7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX2R3RG9jRmxhZ3MgJj0gfmR3RmxhZzsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Eb2N1bWVudDo6U2V0RmxhZyhGWF9EV09SRCBkd0ZsYWcsIEZYX0JPT0wgYk9uKSB7DQorICBpZiAoYk9uKSB7DQorICAgIG1fZHdEb2NGbGFncyB8PSBkd0ZsYWc7DQorICB9IGVsc2Ugew0KKyAgICBtX2R3RG9jRmxhZ3MgJj0gfmR3RmxhZzsNCisgIH0NCiB9DQotRlhfQk9PTCBDWEZBX0RvY3VtZW50OjpJc0ludGVyYWN0aXZlKCkNCi17DQotICAgIGlmIChtX2R3RG9jRmxhZ3MgJiBYRkFfRE9DRkxBR19IYXNJbnRlcmFjdGl2ZSkgew0KLSAgICAgICAgcmV0dXJuIG1fZHdEb2NGbGFncyAmIFhGQV9ET0NGTEFHX0ludGVyYWN0aXZlOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcENvbmZpZyA9IChDWEZBX05vZGUqKXRoaXMtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0NvbmZpZyk7DQotICAgIGlmICghcENvbmZpZykgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzSW50ZXJhY3RpdmU7DQotICAgIENYRkFfTm9kZSogcFByZXNlbnQgPSBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9QcmVzZW50KTsNCi0gICAgaWYgKCFwUHJlc2VudCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcFBERiA9IHBQcmVzZW50LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9QZGYpOw0KLSAgICBpZiAoIXBQREYpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBJbnRlcmFjdGl2ZSA9IHBQREYtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0ludGVyYWN0aXZlKTsNCi0gICAgaWYgKHBJbnRlcmFjdGl2ZSkgew0KLSAgICAgICAgbV9kd0RvY0ZsYWdzIHw9IFhGQV9ET0NGTEFHX0hhc0ludGVyYWN0aXZlOw0KLSAgICAgICAgaWYgKHBJbnRlcmFjdGl2ZS0+VHJ5Q29udGVudCh3c0ludGVyYWN0aXZlKSAmJiB3c0ludGVyYWN0aXZlID09IEZYX1dTVFJDKEwiMSIpKSB7DQotICAgICAgICAgICAgbV9kd0RvY0ZsYWdzIHw9IFhGQV9ET0NGTEFHX0ludGVyYWN0aXZlOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQorRlhfQk9PTCBDWEZBX0RvY3VtZW50OjpJc0ludGVyYWN0aXZlKCkgew0KKyAgaWYgKG1fZHdEb2NGbGFncyAmIFhGQV9ET0NGTEFHX0hhc0ludGVyYWN0aXZlKSB7DQorICAgIHJldHVybiBtX2R3RG9jRmxhZ3MgJiBYRkFfRE9DRkxBR19JbnRlcmFjdGl2ZTsNCisgIH0NCisgIENYRkFfTm9kZSogcENvbmZpZyA9IChDWEZBX05vZGUqKXRoaXMtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0NvbmZpZyk7DQorICBpZiAoIXBDb25maWcpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NJbnRlcmFjdGl2ZTsNCisgIENYRkFfTm9kZSogcFByZXNlbnQgPSBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9QcmVzZW50KTsNCisgIGlmICghcFByZXNlbnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUERGID0gcFByZXNlbnQtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1BkZik7DQorICBpZiAoIXBQREYpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwSW50ZXJhY3RpdmUgPSBwUERGLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JbnRlcmFjdGl2ZSk7DQorICBpZiAocEludGVyYWN0aXZlKSB7DQorICAgIG1fZHdEb2NGbGFncyB8PSBYRkFfRE9DRkxBR19IYXNJbnRlcmFjdGl2ZTsNCisgICAgaWYgKHBJbnRlcmFjdGl2ZS0+VHJ5Q29udGVudCh3c0ludGVyYWN0aXZlKSAmJg0KKyAgICAgICAgd3NJbnRlcmFjdGl2ZSA9PSBGWF9XU1RSQyhMIjEiKSkgew0KKyAgICAgIG1fZHdEb2NGbGFncyB8PSBYRkFfRE9DRkxBR19JbnRlcmFjdGl2ZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1DWEZBX0xvY2FsZU1nciogQ1hGQV9Eb2N1bWVudDo6R2V0TG9jYWxNZ3IoKQ0KLXsNCi0gICAgaWYgKCFtX3BMb2NhbE1ncikgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMYW5ndWFnZTsNCi0gICAgICAgIHRoaXMtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0TGFuZ3VhZ2Uod3NMYW5ndWFnZSk7DQotICAgICAgICBtX3BMb2NhbE1nciA9IEZYX05FVyBDWEZBX0xvY2FsZU1ncigoQ1hGQV9Ob2RlKil0aGlzLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Mb2NhbGVTZXQpLCB3c0xhbmd1YWdlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wTG9jYWxNZ3I7DQorQ1hGQV9Mb2NhbGVNZ3IqIENYRkFfRG9jdW1lbnQ6OkdldExvY2FsTWdyKCkgew0KKyAgaWYgKCFtX3BMb2NhbE1ncikgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0xhbmd1YWdlOw0KKyAgICB0aGlzLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCktPkdldEFwcFByb3ZpZGVyKCktPkdldExhbmd1YWdlKHdzTGFuZ3VhZ2UpOw0KKyAgICBtX3BMb2NhbE1nciA9IEZYX05FVyBDWEZBX0xvY2FsZU1ncigNCisgICAgICAgIChDWEZBX05vZGUqKXRoaXMtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0xvY2FsZVNldCksIHdzTGFuZ3VhZ2UpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcExvY2FsTWdyOw0KIH0NCi1JWEZBX1NjcmlwdENvbnRleHQqIENYRkFfRG9jdW1lbnQ6OkluaXRTY3JpcHRDb250ZXh0KEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKQ0KLXsNCi0gICAgaWYgKCFtX3BTY3JpcHRDb250ZXh0KSB7DQotICAgICAgICBtX3BTY3JpcHRDb250ZXh0ID0gWEZBX1NjcmlwdENvbnRleHRfQ3JlYXRlKHRoaXMpOw0KLSAgICB9DQotICAgIG1fcFNjcmlwdENvbnRleHQtPkluaXRpYWxpemUoaFJ1bnRpbWUpOw0KLSAgICByZXR1cm4gbV9wU2NyaXB0Q29udGV4dDsNCitJWEZBX1NjcmlwdENvbnRleHQqIENYRkFfRG9jdW1lbnQ6OkluaXRTY3JpcHRDb250ZXh0KEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKSB7DQorICBpZiAoIW1fcFNjcmlwdENvbnRleHQpIHsNCisgICAgbV9wU2NyaXB0Q29udGV4dCA9IFhGQV9TY3JpcHRDb250ZXh0X0NyZWF0ZSh0aGlzKTsNCisgIH0NCisgIG1fcFNjcmlwdENvbnRleHQtPkluaXRpYWxpemUoaFJ1bnRpbWUpOw0KKyAgcmV0dXJuIG1fcFNjcmlwdENvbnRleHQ7DQogfQ0KLUlYRkFfU2NyaXB0Q29udGV4dCoJQ1hGQV9Eb2N1bWVudDo6R2V0U2NyaXB0Q29udGV4dCgpDQotew0KLSAgICBpZiAoIW1fcFNjcmlwdENvbnRleHQpIHsNCi0gICAgICAgIG1fcFNjcmlwdENvbnRleHQgPSBYRkFfU2NyaXB0Q29udGV4dF9DcmVhdGUodGhpcyk7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcFNjcmlwdENvbnRleHQ7DQorSVhGQV9TY3JpcHRDb250ZXh0KiBDWEZBX0RvY3VtZW50OjpHZXRTY3JpcHRDb250ZXh0KCkgew0KKyAgaWYgKCFtX3BTY3JpcHRDb250ZXh0KSB7DQorICAgIG1fcFNjcmlwdENvbnRleHQgPSBYRkFfU2NyaXB0Q29udGV4dF9DcmVhdGUodGhpcyk7DQorICB9DQorICByZXR1cm4gbV9wU2NyaXB0Q29udGV4dDsNCiB9DQotWEZBX1ZFUlNJT04gQ1hGQV9Eb2N1bWVudDo6UmVjb2duaXplWEZBVmVyc2lvbk51bWJlcihDRlhfV2lkZVN0cmluZyYgd3NUZW1wbGF0ZU5TKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVGVtcGxhdGVVUklQcmVmaXggPSBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1RlbXBsYXRlKS0+cFVSSTsNCi0gICAgRlhfU1RSU0laRSAgblByZWZpeExlbmd0aCA9IHdzVGVtcGxhdGVVUklQcmVmaXguR2V0TGVuZ3RoKCk7DQotICAgIGlmKENGWF9XaWRlU3RyaW5nQyh3c1RlbXBsYXRlTlMsIHdzVGVtcGxhdGVOUy5HZXRMZW5ndGgoKSkgIT0gd3NUZW1wbGF0ZVVSSVByZWZpeCkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9WRVJTSU9OX1VOS05PV047DQotICAgIH0NCi0gICAgRlhfU1RSU0laRSAgbkRvdFBvcyA9IHdzVGVtcGxhdGVOUy5GaW5kKCcuJywgblByZWZpeExlbmd0aCk7DQotICAgIGlmKG5Eb3RQb3MgPT0gKEZYX1NUUlNJWkUpLTEpIHsNCi0gICAgICAgIHJldHVybiBYRkFfVkVSU0lPTl9VTktOT1dOOw0KLSAgICB9DQotICAgIGludDhfdCBpTWFqb3IgPSBGWFNZU193dG9pKHdzVGVtcGxhdGVOUy5NaWQoblByZWZpeExlbmd0aCwgbkRvdFBvcyAtIG5QcmVmaXhMZW5ndGgpKTsNCi0gICAgaW50OF90IGlNaW5vciA9IEZYU1lTX3d0b2kod3NUZW1wbGF0ZU5TLk1pZChuRG90UG9zICsgMSwgd3NUZW1wbGF0ZU5TLkdldExlbmd0aCgpIC0gbkRvdFBvcyAtIDIpKTsNCi0gICAgWEZBX1ZFUlNJT04gZVZlcnNpb24gPSAoWEZBX1ZFUlNJT04pKChpbnQzMl90KWlNYWpvciAqIDEwMCArIGlNaW5vcik7DQotICAgIGlmKGVWZXJzaW9uIDwgWEZBX1ZFUlNJT05fTUlOIHx8IGVWZXJzaW9uID4gWEZBX1ZFUlNJT05fTUFYKSB7DQotICAgICAgICByZXR1cm4gWEZBX1ZFUlNJT05fVU5LTk9XTjsNCi0gICAgfQ0KLSAgICBtX2VDdXJWZXJzaW9uTW9kZSA9IGVWZXJzaW9uOw0KLSAgICByZXR1cm4gZVZlcnNpb247DQorWEZBX1ZFUlNJT04gQ1hGQV9Eb2N1bWVudDo6UmVjb2duaXplWEZBVmVyc2lvbk51bWJlcigNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGVtcGxhdGVOUykgew0KKyAgQ0ZYX1dpZGVTdHJpbmdDIHdzVGVtcGxhdGVVUklQcmVmaXggPQ0KKyAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfVGVtcGxhdGUpLT5wVVJJOw0KKyAgRlhfU1RSU0laRSBuUHJlZml4TGVuZ3RoID0gd3NUZW1wbGF0ZVVSSVByZWZpeC5HZXRMZW5ndGgoKTsNCisgIGlmIChDRlhfV2lkZVN0cmluZ0Mod3NUZW1wbGF0ZU5TLCB3c1RlbXBsYXRlTlMuR2V0TGVuZ3RoKCkpICE9DQorICAgICAgd3NUZW1wbGF0ZVVSSVByZWZpeCkgew0KKyAgICByZXR1cm4gWEZBX1ZFUlNJT05fVU5LTk9XTjsNCisgIH0NCisgIEZYX1NUUlNJWkUgbkRvdFBvcyA9IHdzVGVtcGxhdGVOUy5GaW5kKCcuJywgblByZWZpeExlbmd0aCk7DQorICBpZiAobkRvdFBvcyA9PSAoRlhfU1RSU0laRSktMSkgew0KKyAgICByZXR1cm4gWEZBX1ZFUlNJT05fVU5LTk9XTjsNCisgIH0NCisgIGludDhfdCBpTWFqb3IgPQ0KKyAgICAgIEZYU1lTX3d0b2kod3NUZW1wbGF0ZU5TLk1pZChuUHJlZml4TGVuZ3RoLCBuRG90UG9zIC0gblByZWZpeExlbmd0aCkpOw0KKyAgaW50OF90IGlNaW5vciA9IEZYU1lTX3d0b2koDQorICAgICAgd3NUZW1wbGF0ZU5TLk1pZChuRG90UG9zICsgMSwgd3NUZW1wbGF0ZU5TLkdldExlbmd0aCgpIC0gbkRvdFBvcyAtIDIpKTsNCisgIFhGQV9WRVJTSU9OIGVWZXJzaW9uID0gKFhGQV9WRVJTSU9OKSgoaW50MzJfdClpTWFqb3IgKiAxMDAgKyBpTWlub3IpOw0KKyAgaWYgKGVWZXJzaW9uIDwgWEZBX1ZFUlNJT05fTUlOIHx8IGVWZXJzaW9uID4gWEZBX1ZFUlNJT05fTUFYKSB7DQorICAgIHJldHVybiBYRkFfVkVSU0lPTl9VTktOT1dOOw0KKyAgfQ0KKyAgbV9lQ3VyVmVyc2lvbk1vZGUgPSBlVmVyc2lvbjsNCisgIHJldHVybiBlVmVyc2lvbjsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0RvY3VtZW50OjpHZXROb2RlQnlJRChDWEZBX05vZGUqIHBSb290LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSUQpDQotew0KLSAgICBpZighcFJvb3QgfHwgd3NJRC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENYRkFfTm9kZUl0ZXJhdG9yIHNJdGVyYXRvcihwUm9vdCk7DQotICAgIGZvcihDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7IHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSURWYWw7DQotICAgICAgICBpZihwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9JZCwgd3NJRFZhbCkgJiYgIXdzSURWYWwuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgaWYod3NJRFZhbCA9PSB3c0lEKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwTm9kZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCitDWEZBX05vZGUqIENYRkFfRG9jdW1lbnQ6OkdldE5vZGVCeUlEKENYRkFfTm9kZSogcFJvb3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSUQpIHsNCisgIGlmICghcFJvb3QgfHwgd3NJRC5Jc0VtcHR5KCkpIHsNCiAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDWEZBX05vZGVJdGVyYXRvciBzSXRlcmF0b3IocFJvb3QpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJRFZhbDsNCisgICAgaWYgKHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0lkLCB3c0lEVmFsKSAmJiAhd3NJRFZhbC5Jc0VtcHR5KCkpIHsNCisgICAgICBpZiAod3NJRFZhbCA9PSB3c0lEKSB7DQorICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotc3RhdGljIHZvaWQgWEZBX1Byb3RvTWVyZ2VfTWVyZ2VOb2RlUmVjdXJzZShDWEZBX0RvY3VtZW50ICpwRG9jdW1lbnQsIENYRkFfTm9kZSAqcERlc3ROb2RlUGFyZW50LCBDWEZBX05vZGUgKnBQcm90b05vZGUpDQotew0KLSAgICBDWEZBX05vZGUqIHBFeGlzdGluZ05vZGUgPSBOVUxMOw0KLSAgICBmb3IoQ1hGQV9Ob2RlKiBwRm9ybUNoaWxkID0gcERlc3ROb2RlUGFyZW50LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBGb3JtQ2hpbGQ7IHBGb3JtQ2hpbGQgPSBwRm9ybUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpZihwRm9ybUNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gcFByb3RvTm9kZS0+R2V0Q2xhc3NJRCgpICYmIHBGb3JtQ2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gcFByb3RvTm9kZS0+R2V0TmFtZUhhc2goKSAmJiBwRm9ybUNoaWxkLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KLSAgICAgICAgICAgIHBGb3JtQ2hpbGQtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCi0gICAgICAgICAgICBwRXhpc3RpbmdOb2RlID0gcEZvcm1DaGlsZDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCitzdGF0aWMgdm9pZCBYRkFfUHJvdG9NZXJnZV9NZXJnZU5vZGVSZWN1cnNlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERlc3ROb2RlUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUHJvdG9Ob2RlKSB7DQorICBDWEZBX05vZGUqIHBFeGlzdGluZ05vZGUgPSBOVUxMOw0KKyAgZm9yIChDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPQ0KKyAgICAgICAgICAgcERlc3ROb2RlUGFyZW50LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgIHBGb3JtQ2hpbGQ7DQorICAgICAgIHBGb3JtQ2hpbGQgPSBwRm9ybUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwRm9ybUNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gcFByb3RvTm9kZS0+R2V0Q2xhc3NJRCgpICYmDQorICAgICAgICBwRm9ybUNoaWxkLT5HZXROYW1lSGFzaCgpID09IHBQcm90b05vZGUtPkdldE5hbWVIYXNoKCkgJiYNCisgICAgICAgIHBGb3JtQ2hpbGQtPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpKSB7DQorICAgICAgcEZvcm1DaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgRkFMU0UpOw0KKyAgICAgIHBFeGlzdGluZ05vZGUgPSBwRm9ybUNoaWxkOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGlmIChwRXhpc3RpbmdOb2RlKSB7DQotICAgICAgICBwRXhpc3RpbmdOb2RlLT5TZXRUZW1wbGF0ZU5vZGUocFByb3RvTm9kZSk7DQotICAgICAgICBmb3IgKENYRkFfTm9kZSAqcFRlbXBsYXRlQ2hpbGQgPSBwUHJvdG9Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgWEZBX1Byb3RvTWVyZ2VfTWVyZ2VOb2RlUmVjdXJzZShwRG9jdW1lbnQsIHBFeGlzdGluZ05vZGUsIHBUZW1wbGF0ZUNoaWxkKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwRXhpc3RpbmdOb2RlKSB7DQorICAgIHBFeGlzdGluZ05vZGUtPlNldFRlbXBsYXRlTm9kZShwUHJvdG9Ob2RlKTsNCisgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0NCisgICAgICAgICAgICAgcFByb3RvTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICBYRkFfUHJvdG9NZXJnZV9NZXJnZU5vZGVSZWN1cnNlKHBEb2N1bWVudCwgcEV4aXN0aW5nTm9kZSwgcFRlbXBsYXRlQ2hpbGQpOw0KICAgICB9DQotICAgIENYRkFfTm9kZSogcE5ld05vZGUgPSBwUHJvdG9Ob2RlLT5DbG9uZShUUlVFKTsNCi0gICAgcE5ld05vZGUtPlNldFRlbXBsYXRlTm9kZShwUHJvdG9Ob2RlKTsNCi0gICAgcERlc3ROb2RlUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3Tm9kZSwgTlVMTCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5ld05vZGUgPSBwUHJvdG9Ob2RlLT5DbG9uZShUUlVFKTsNCisgIHBOZXdOb2RlLT5TZXRUZW1wbGF0ZU5vZGUocFByb3RvTm9kZSk7DQorICBwRGVzdE5vZGVQYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlLCBOVUxMKTsNCiB9DQotc3RhdGljIHZvaWQgWEZBX1Byb3RvTWVyZ2VfTWVyZ2VOb2RlKENYRkFfRG9jdW1lbnQgKnBEb2N1bWVudCwgQ1hGQV9Ob2RlICpwRGVzdE5vZGUsIENYRkFfTm9kZSAqcFByb3RvTm9kZSkNCi17DQotICAgIHsNCi0gICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yIHNJdGVyYXRvcihwRGVzdE5vZGUpOw0KLSAgICAgICAgZm9yKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpOw0KLSAgICAgICAgfQ0KK3N0YXRpYyB2b2lkIFhGQV9Qcm90b01lcmdlX01lcmdlTm9kZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERlc3ROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQcm90b05vZGUpIHsNCisgIHsNCisgICAgQ1hGQV9Ob2RlSXRlcmF0b3Igc0l0ZXJhdG9yKHBEZXN0Tm9kZSk7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBOb2RlOw0KKyAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKTsNCiAgICAgfQ0KLSAgICBwRGVzdE5vZGUtPlNldFRlbXBsYXRlTm9kZShwUHJvdG9Ob2RlKTsNCi0gICAgZm9yIChDWEZBX05vZGUgKnBUZW1wbGF0ZUNoaWxkID0gcFByb3RvTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgWEZBX1Byb3RvTWVyZ2VfTWVyZ2VOb2RlUmVjdXJzZShwRG9jdW1lbnQsIHBEZXN0Tm9kZSwgcFRlbXBsYXRlQ2hpbGQpOw0KKyAgfQ0KKyAgcERlc3ROb2RlLT5TZXRUZW1wbGF0ZU5vZGUocFByb3RvTm9kZSk7DQorICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQ0KKyAgICAgICAgICAgcFByb3RvTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICBwVGVtcGxhdGVDaGlsZDsNCisgICAgICAgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBYRkFfUHJvdG9NZXJnZV9NZXJnZU5vZGVSZWN1cnNlKHBEb2N1bWVudCwgcERlc3ROb2RlLCBwVGVtcGxhdGVDaGlsZCk7DQorICB9DQorICB7DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yIHNJdGVyYXRvcihwRGVzdE5vZGUpOw0KKyAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsNCisgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgRkFMU0UpOw0KICAgICB9DQotICAgIHsNCi0gICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yIHNJdGVyYXRvcihwRGVzdE5vZGUpOw0KLSAgICAgICAgZm9yKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENYRkFfRG9jdW1lbnQ6OkRvUHJvdG9NZXJnZSgpDQotew0KLSAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZVJvb3QgPSAoQ1hGQV9Ob2RlKilHZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9UZW1wbGF0ZSk7DQotICAgIGlmKCFwVGVtcGxhdGVSb290KSB7DQotICAgICAgICByZXR1cm47DQordm9pZCBDWEZBX0RvY3VtZW50OjpEb1Byb3RvTWVyZ2UoKSB7DQorICBDWEZBX05vZGUqIHBUZW1wbGF0ZVJvb3QgPSAoQ1hGQV9Ob2RlKilHZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9UZW1wbGF0ZSk7DQorICBpZiAoIXBUZW1wbGF0ZVJvb3QpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBDWEZBX05vZGUqPiBtSURNYXA7DQorICBDWEZBX05vZGVTZXQgc1VzZU5vZGVzOw0KKyAgQ1hGQV9Ob2RlSXRlcmF0b3Igc0l0ZXJhdG9yKHBUZW1wbGF0ZVJvb3QpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJRFZhbDsNCisgICAgaWYgKHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0lkLCB3c0lEVmFsKSAmJiAhd3NJRFZhbC5Jc0VtcHR5KCkpIHsNCisgICAgICBtSURNYXBbRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NJRFZhbC5HZXRQdHIoKSwgd3NJRFZhbC5HZXRMZW5ndGgoKSldID0NCisgICAgICAgICAgcE5vZGU7DQogICAgIH0NCi0gICAgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBDWEZBX05vZGUqPiBtSURNYXA7DQotICAgIENYRkFfTm9kZVNldCBzVXNlTm9kZXM7DQotICAgIENYRkFfTm9kZUl0ZXJhdG9yIHNJdGVyYXRvcihwVGVtcGxhdGVSb290KTsNCi0gICAgZm9yKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJRFZhbDsNCi0gICAgICAgIGlmKHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0lkLCB3c0lEVmFsKSAmJiAhd3NJRFZhbC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBtSURNYXBbRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NJRFZhbC5HZXRQdHIoKSwgd3NJRFZhbC5HZXRMZW5ndGgoKSldID0gcE5vZGU7DQotICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NVc2VWYWw7DQotICAgICAgICBpZihwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Vc2UsIHdzVXNlVmFsKSAmJiAhd3NVc2VWYWwuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgc1VzZU5vZGVzLkFkZChwTm9kZSk7DQotICAgICAgICB9IGVsc2UgaWYgKHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1VzZWhyZWYsIHdzVXNlVmFsKSAmJiAhd3NVc2VWYWwuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgc1VzZU5vZGVzLkFkZChwTm9kZSk7DQotICAgICAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c1VzZVZhbDsNCisgICAgaWYgKHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1VzZSwgd3NVc2VWYWwpICYmICF3c1VzZVZhbC5Jc0VtcHR5KCkpIHsNCisgICAgICBzVXNlTm9kZXMuQWRkKHBOb2RlKTsNCisgICAgfSBlbHNlIGlmIChwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Vc2VocmVmLCB3c1VzZVZhbCkgJiYNCisgICAgICAgICAgICAgICAhd3NVc2VWYWwuSXNFbXB0eSgpKSB7DQorICAgICAgc1VzZU5vZGVzLkFkZChwTm9kZSk7DQogICAgIH0NCi0gICAgRlhfUE9TSVRJT04gcG9zID0gc1VzZU5vZGVzLkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUgKHBvcykgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwVXNlSHJlZk5vZGUgPSBOVUxMOw0KLSAgICAgICAgc1VzZU5vZGVzLkdldE5leHRBc3NvYyhwb3MsIHBVc2VIcmVmTm9kZSk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1VzZVZhbDsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1VSSSwgd3NJRCwgd3NTT007DQotICAgICAgICBpZiAocFVzZUhyZWZOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1VzZWhyZWYsIHdzVXNlVmFsKSAmJiAhd3NVc2VWYWwuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgRlhfU1RSU0laRSB1U2hhcnBQb3MgPSB3c1VzZVZhbC5GaW5kKCcjJyk7DQotICAgICAgICAgICAgaWYodVNoYXJwUG9zIDwgMCkgew0KLSAgICAgICAgICAgICAgICB3c1VSSSA9IHdzVXNlVmFsOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHdzVVJJID0gQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwsIHVTaGFycFBvcyk7DQotICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgdUxlbiA9IHdzVXNlVmFsLkdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICBpZih1TGVuID49IHVTaGFycFBvcyArIDUgJiYgQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwgKyB1U2hhcnBQb3MsIDUpID09IEZYX1dTVFJDKEwiI3NvbSgiKSAmJiB3c1VzZVZhbFt1TGVuIC0gMV0gPT0gJyknKSB7DQotICAgICAgICAgICAgICAgICAgICB3c1NPTSA9IENGWF9XaWRlU3RyaW5nQygoY29uc3QgRlhfV0NIQVIqKXdzVXNlVmFsICsgdVNoYXJwUG9zICsgNSwgdUxlbiAtIDEgLSB1U2hhcnBQb3MgLSA1KTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzSUQgPSBDRlhfV2lkZVN0cmluZ0MoKGNvbnN0IEZYX1dDSEFSKil3c1VzZVZhbCArIHVTaGFycFBvcyArIDEsIHVMZW4gLSB1U2hhcnBQb3MgLSAxKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZihwVXNlSHJlZk5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVXNlLCB3c1VzZVZhbCkgJiYgIXdzVXNlVmFsLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIGlmKHdzVXNlVmFsWzBdID09ICcjJykgew0KLSAgICAgICAgICAgICAgICB3c0lEID0gQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwgKyAxLCB3c1VzZVZhbC5HZXRMZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHdzU09NID0gQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwsIHdzVXNlVmFsLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICB9DQorICB9DQorICBGWF9QT1NJVElPTiBwb3MgPSBzVXNlTm9kZXMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBDWEZBX05vZGUqIHBVc2VIcmVmTm9kZSA9IE5VTEw7DQorICAgIHNVc2VOb2Rlcy5HZXROZXh0QXNzb2MocG9zLCBwVXNlSHJlZk5vZGUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1VzZVZhbDsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVVJJLCB3c0lELCB3c1NPTTsNCisgICAgaWYgKHBVc2VIcmVmTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Vc2VocmVmLCB3c1VzZVZhbCkgJiYNCisgICAgICAgICF3c1VzZVZhbC5Jc0VtcHR5KCkpIHsNCisgICAgICBGWF9TVFJTSVpFIHVTaGFycFBvcyA9IHdzVXNlVmFsLkZpbmQoJyMnKTsNCisgICAgICBpZiAodVNoYXJwUG9zIDwgMCkgew0KKyAgICAgICAgd3NVUkkgPSB3c1VzZVZhbDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgd3NVUkkgPSBDRlhfV2lkZVN0cmluZ0MoKGNvbnN0IEZYX1dDSEFSKil3c1VzZVZhbCwgdVNoYXJwUG9zKTsNCisgICAgICAgIEZYX1NUUlNJWkUgdUxlbiA9IHdzVXNlVmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgaWYgKHVMZW4gPj0gdVNoYXJwUG9zICsgNSAmJg0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQygoY29uc3QgRlhfV0NIQVIqKXdzVXNlVmFsICsgdVNoYXJwUG9zLCA1KSA9PQ0KKyAgICAgICAgICAgICAgICBGWF9XU1RSQyhMIiNzb20oIikgJiYNCisgICAgICAgICAgICB3c1VzZVZhbFt1TGVuIC0gMV0gPT0gJyknKSB7DQorICAgICAgICAgIHdzU09NID0gQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwgKyB1U2hhcnBQb3MgKyA1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TGVuIC0gMSAtIHVTaGFycFBvcyAtIDUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NJRCA9IENGWF9XaWRlU3RyaW5nQygoY29uc3QgRlhfV0NIQVIqKXdzVXNlVmFsICsgdVNoYXJwUG9zICsgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TGVuIC0gdVNoYXJwUG9zIC0gMSk7DQogICAgICAgICB9DQotICAgICAgICBpZiAoIXdzVVJJLklzRW1wdHkoKSAmJiB3c1VSSSAhPSBGWF9XU1RSQyhMIi4iKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwUHJvdG9Ob2RlID0gTlVMTDsNCi0gICAgICAgIGlmKCF3c1NPTS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcyB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCi0gICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KLSAgICAgICAgICAgIGludDMyX3QgaVJldCA9IG1fcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHBVc2VIcmVmTm9kZSwgd3NTT00sIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCi0gICAgICAgICAgICBpZihpUmV0ID4gMCAmJiByZXNvdmVOb2RlUlMubm9kZXNbMF0tPklzTm9kZSgpKSB7DQotICAgICAgICAgICAgICAgIHBQcm90b05vZGUgPSAoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbMF07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmKCF3c0lELklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIGlmKCFtSURNYXAuTG9va3VwKEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzSUQuR2V0UHRyKCksIHdzSUQuR2V0TGVuZ3RoKCkpLCBwUHJvdG9Ob2RlKSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZighcFByb3RvTm9kZSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgWEZBX1Byb3RvTWVyZ2VfTWVyZ2VOb2RlKHRoaXMsIHBVc2VIcmVmTm9kZSwgcFByb3RvTm9kZSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHBVc2VIcmVmTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Vc2UsIHdzVXNlVmFsKSAmJg0KKyAgICAgICAgICAgICAgICF3c1VzZVZhbC5Jc0VtcHR5KCkpIHsNCisgICAgICBpZiAod3NVc2VWYWxbMF0gPT0gJyMnKSB7DQorICAgICAgICB3c0lEID0gQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwgKyAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1VzZVZhbC5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB3c1NPTSA9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwsIHdzVXNlVmFsLkdldExlbmd0aCgpKTsNCisgICAgICB9DQogICAgIH0NCisgICAgaWYgKCF3c1VSSS5Jc0VtcHR5KCkgJiYgd3NVUkkgIT0gRlhfV1NUUkMoTCIuIikpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBQcm90b05vZGUgPSBOVUxMOw0KKyAgICBpZiAoIXdzU09NLklzRW1wdHkoKSkgew0KKyAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCisgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgIGludDMyX3QgaVJldCA9IG1fcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHBVc2VIcmVmTm9kZSwgd3NTT00sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOw0KKyAgICAgIGlmIChpUmV0ID4gMCAmJiByZXNvdmVOb2RlUlMubm9kZXNbMF0tPklzTm9kZSgpKSB7DQorICAgICAgICBwUHJvdG9Ob2RlID0gKENYRkFfTm9kZSopcmVzb3ZlTm9kZVJTLm5vZGVzWzBdOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICghd3NJRC5Jc0VtcHR5KCkpIHsNCisgICAgICBpZiAoIW1JRE1hcC5Mb29rdXAoDQorICAgICAgICAgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0lELkdldFB0cigpLCB3c0lELkdldExlbmd0aCgpKSwNCisgICAgICAgICAgICAgIHBQcm90b05vZGUpKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFwUHJvdG9Ob2RlKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgWEZBX1Byb3RvTWVyZ2VfTWVyZ2VOb2RlKHRoaXMsIHBVc2VIcmVmTm9kZSwgcFByb3RvTm9kZSk7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmNwcAppbmRleCAwMzU1N2RkLi4yMmIyZjJjIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2xheW91dF9pbXAuY3BwCkBAIC0yMywxNzkgKzIzLDE2NiBAQAogI2luY2x1ZGUgInhmYV9sYXlvdXRfaXRlbWxheW91dC5oIg0KICNpbmNsdWRlICJ4ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmgiDQogI2luY2x1ZGUgInhmYV9sYXlvdXRfYXBwYWRhcHRlci5oIg0KLUNYRkFfTGF5b3V0UHJvY2Vzc29yKiBDWEZBX0RvY3VtZW50OjpHZXRMYXlvdXRQcm9jZXNzb3IoKQ0KLXsNCi0gICAgaWYoIW1fcExheW91dFByb2Nlc3Nvcikgew0KLSAgICAgICAgbV9wTGF5b3V0UHJvY2Vzc29yID0gRlhfTkVXIENYRkFfTGF5b3V0UHJvY2Vzc29yKHRoaXMpOw0KLSAgICAgICAgQVNTRVJUKG1fcExheW91dFByb2Nlc3Nvcik7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcExheW91dFByb2Nlc3NvcjsNCitDWEZBX0xheW91dFByb2Nlc3NvciogQ1hGQV9Eb2N1bWVudDo6R2V0TGF5b3V0UHJvY2Vzc29yKCkgew0KKyAgaWYgKCFtX3BMYXlvdXRQcm9jZXNzb3IpIHsNCisgICAgbV9wTGF5b3V0UHJvY2Vzc29yID0gRlhfTkVXIENYRkFfTGF5b3V0UHJvY2Vzc29yKHRoaXMpOw0KKyAgICBBU1NFUlQobV9wTGF5b3V0UHJvY2Vzc29yKTsNCisgIH0NCisgIHJldHVybiBtX3BMYXlvdXRQcm9jZXNzb3I7DQogfQ0KLUlYRkFfRG9jTGF5b3V0KiBDWEZBX0RvY3VtZW50OjpHZXREb2NMYXlvdXQoKQ0KLXsNCi0gICAgcmV0dXJuIEdldExheW91dFByb2Nlc3NvcigpOw0KK0lYRkFfRG9jTGF5b3V0KiBDWEZBX0RvY3VtZW50OjpHZXREb2NMYXlvdXQoKSB7DQorICByZXR1cm4gR2V0TGF5b3V0UHJvY2Vzc29yKCk7DQogfQ0KIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpDWEZBX0xheW91dFByb2Nlc3NvcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQotICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KQ0KLSAgICAsIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yKE5VTEwpDQotICAgICwgbV9wTGF5b3V0UGFnZU1ncihOVUxMKQ0KLSAgICAsIG1fblByb2dyZXNzQ291bnRlcigwKQ0KLSAgICAsIG1fYk5lZUxheW91dChUUlVFKQ0KLXsNCisgICAgOiBtX3BEb2N1bWVudChwRG9jdW1lbnQpLA0KKyAgICAgIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yKE5VTEwpLA0KKyAgICAgIG1fcExheW91dFBhZ2VNZ3IoTlVMTCksDQorICAgICAgbV9uUHJvZ3Jlc3NDb3VudGVyKDApLA0KKyAgICAgIG1fYk5lZUxheW91dChUUlVFKSB7fQ0KK0NYRkFfTGF5b3V0UHJvY2Vzc29yOjp+Q1hGQV9MYXlvdXRQcm9jZXNzb3IoKSB7DQorICBDbGVhckxheW91dERhdGEoKTsNCiB9DQotQ1hGQV9MYXlvdXRQcm9jZXNzb3I6On5DWEZBX0xheW91dFByb2Nlc3NvcigpDQotew0KLSAgICBDbGVhckxheW91dERhdGEoKTsNCitDWEZBX0RvY3VtZW50KiBDWEZBX0xheW91dFByb2Nlc3Nvcjo6R2V0RG9jdW1lbnQoKSBjb25zdCB7DQorICByZXR1cm4gbV9wRG9jdW1lbnQ7DQogfQ0KLUNYRkFfRG9jdW1lbnQqIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpHZXREb2N1bWVudCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wRG9jdW1lbnQ7DQotfQ0KLWludDMyX3QgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OlN0YXJ0TGF5b3V0KEZYX0JPT0wgYkZvcmNlUmVzdGFydCkNCi17DQotICAgIGlmICghYkZvcmNlUmVzdGFydCAmJiAhSXNOZWVkTGF5b3V0KCkpIHsNCi0gICAgICAgIHJldHVybiAxMDA7DQotICAgIH0NCi0gICAgaWYobV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3IpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BSb290SXRlbUxheW91dFByb2Nlc3NvcjsNCi0gICAgICAgIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yID0gTlVMTDsNCi0gICAgfQ0KLSAgICBtX25Qcm9ncmVzc0NvdW50ZXIgPSAwOw0KLSAgICBDWEZBX05vZGUqIHBGb3JtUGFja2V0Tm9kZSA9IChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCi0gICAgaWYgKCFwRm9ybVBhY2tldE5vZGUpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IHBGb3JtUGFja2V0Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQotICAgIGlmKCFwRm9ybVJvb3QpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBpZiAoIW1fcExheW91dFBhZ2VNZ3IpIHsNCi0gICAgICAgIG1fcExheW91dFBhZ2VNZ3IgPSBGWF9ORVcgQ1hGQV9MYXlvdXRQYWdlTWdyKHRoaXMpOw0KLSAgICB9DQotICAgIGlmICghbV9wTGF5b3V0UGFnZU1nci0+SW5pdExheW91dFBhZ2UocEZvcm1Sb290KSkgew0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIGlmICghbV9wTGF5b3V0UGFnZU1nci0+UHJlcGFyZUZpcnN0UGFnZShwRm9ybVJvb3QpKSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgbV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3IgPSBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBGb3JtUm9vdCwgbV9wTGF5b3V0UGFnZU1ncik7DQoraW50MzJfdCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6U3RhcnRMYXlvdXQoRlhfQk9PTCBiRm9yY2VSZXN0YXJ0KSB7DQorICBpZiAoIWJGb3JjZVJlc3RhcnQgJiYgIUlzTmVlZExheW91dCgpKSB7DQorICAgIHJldHVybiAxMDA7DQorICB9DQorICBpZiAobV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3IpIHsNCisgICAgZGVsZXRlIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yOw0KKyAgICBtX3BSb290SXRlbUxheW91dFByb2Nlc3NvciA9IE5VTEw7DQorICB9DQorICBtX25Qcm9ncmVzc0NvdW50ZXIgPSAwOw0KKyAgQ1hGQV9Ob2RlKiBwRm9ybVBhY2tldE5vZGUgPQ0KKyAgICAgIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgIGlmICghcEZvcm1QYWNrZXROb2RlKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIENYRkFfTm9kZSogcEZvcm1Sb290ID0NCisgICAgICBwRm9ybVBhY2tldE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KKyAgaWYgKCFwRm9ybVJvb3QpIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaWYgKCFtX3BMYXlvdXRQYWdlTWdyKSB7DQorICAgIG1fcExheW91dFBhZ2VNZ3IgPSBGWF9ORVcgQ1hGQV9MYXlvdXRQYWdlTWdyKHRoaXMpOw0KKyAgfQ0KKyAgaWYgKCFtX3BMYXlvdXRQYWdlTWdyLT5Jbml0TGF5b3V0UGFnZShwRm9ybVJvb3QpKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGlmICghbV9wTGF5b3V0UGFnZU1nci0+UHJlcGFyZUZpcnN0UGFnZShwRm9ybVJvb3QpKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yID0NCisgICAgICBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBGb3JtUm9vdCwgbV9wTGF5b3V0UGFnZU1ncik7DQogI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KLSAgICBtX3BSb290SXRlbUxheW91dFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BMYXlvdXRQYWdlTWdyOw0KKyAgbV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wTGF5b3V0UGFnZU1ncjsNCiAjZW5kaWYNCi0gICAgbV9uUHJvZ3Jlc3NDb3VudGVyID0gMTsNCi0gICAgcmV0dXJuIDA7DQorICBtX25Qcm9ncmVzc0NvdW50ZXIgPSAxOw0KKyAgcmV0dXJuIDA7DQogfQ0KLWludDMyX3QgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0KElGWF9QYXVzZSogcFBhdXNlICkNCi17DQotICAgIGlmIChtX25Qcm9ncmVzc0NvdW50ZXIgPCAxKSB7DQotICAgICAgICByZXR1cm4gLTE7DQoraW50MzJfdCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXQoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmIChtX25Qcm9ncmVzc0NvdW50ZXIgPCAxKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVTdGF0dXM7DQorICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yLT5HZXRGb3JtTm9kZSgpOw0KKyAgRlhfRkxPQVQgZlBvc1ggPSBwRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9YKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgRlhfRkxPQVQgZlBvc1kgPSBwRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9ZKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgZG8gew0KKyAgICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQgPSBtX3BMYXlvdXRQYWdlTWdyLT5HZXRBdmFpbEhlaWdodCgpOw0KKyAgICBlU3RhdHVzID0NCisgICAgICAgIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yLT5Eb0xheW91dChUUlVFLCBmQXZhaWxIZWlnaHQsIGZBdmFpbEhlaWdodCk7DQorICAgIGlmIChlU3RhdHVzICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgICAgICBtX25Qcm9ncmVzc0NvdW50ZXIrKzsNCiAgICAgfQ0KLSAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlU3RhdHVzOw0KLSAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9ICBtX3BSb290SXRlbUxheW91dFByb2Nlc3Nvci0+R2V0Rm9ybU5vZGUoKTsNCi0gICAgRlhfRkxPQVQgZlBvc1ggPSBwRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9YKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICBGWF9GTE9BVCBmUG9zWSA9IHBGb3JtTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1kpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgIGRvIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZBdmFpbEhlaWdodCA9IG1fcExheW91dFBhZ2VNZ3ItPkdldEF2YWlsSGVpZ2h0KCk7DQotICAgICAgICBlU3RhdHVzID0gbV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3ItPkRvTGF5b3V0KFRSVUUsIGZBdmFpbEhlaWdodCwgZkF2YWlsSGVpZ2h0KTsNCi0gICAgICAgIGlmKGVTdGF0dXMgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSkgew0KLSAgICAgICAgICAgIG1fblByb2dyZXNzQ291bnRlcisrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtID0gbV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCk7DQotICAgICAgICBpZihwTGF5b3V0SXRlbSkgew0KLSAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5tX3NQb3MuU2V0KGZQb3NYLCBmUG9zWSk7DQotICAgICAgICB9DQotICAgICAgICBtX3BMYXlvdXRQYWdlTWdyLT5TdWJtaXRDb250ZW50SXRlbShwTGF5b3V0SXRlbSwgZVN0YXR1cyk7DQotICAgIH0gd2hpbGUgKGVTdGF0dXMgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSAmJiAoIXBQYXVzZSB8fCAhcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSk7DQotICAgIGlmIChlU3RhdHVzID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCi0gICAgICAgIG1fcExheW91dFBhZ2VNZ3ItPkZpbmlzaFBhZ2luYXRlZFBhZ2VTZXRzKCk7DQotICAgICAgICBtX3BMYXlvdXRQYWdlTWdyLT5TeW5jTGF5b3V0RGF0YSgpOw0KLSAgICAgICAgbV9iTmVlTGF5b3V0ID0gRkFMU0U7DQotICAgICAgICBtX3JnQ2hhbmdlZENvbnRhaW5lcnMuUmVtb3ZlQWxsKCk7DQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9DQorICAgICAgICBtX3BSb290SXRlbUxheW91dFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKTsNCisgICAgaWYgKHBMYXlvdXRJdGVtKSB7DQorICAgICAgcExheW91dEl0ZW0tPm1fc1Bvcy5TZXQoZlBvc1gsIGZQb3NZKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gMTAwICogKGVTdGF0dXMgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSA/IG1fblByb2dyZXNzQ291bnRlciA6IG1fblByb2dyZXNzQ291bnRlciAtIDEpIC8gbV9uUHJvZ3Jlc3NDb3VudGVyOw0KLX0NCi1GWF9CT09MIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpJbmNyZW1lbnRMYXlvdXQoKQ0KLXsNCi0gICAgaWYgKG1fYk5lZUxheW91dCkgew0KLSAgICAgICAgU3RhcnRMYXlvdXQoVFJVRSk7DQotICAgICAgICByZXR1cm4gRG9MYXlvdXQoTlVMTCkgPT0gMTAwOw0KLSAgICB9DQotICAgIGZvciAoaW50MzJfdCBpID0gMCwgYyA9IG1fcmdDaGFuZ2VkQ29udGFpbmVycy5HZXRTaXplKCk7IGkgPCBjOyBpKyspIHsNCi0gICAgICAgIENYRkFfTm9kZSAqcE5vZGUgPSBtX3JnQ2hhbmdlZENvbnRhaW5lcnNbaV07DQotICAgICAgICBDWEZBX05vZGUgKnBQYXJlbnROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KLSAgICAgICAgaWYoIXBQYXJlbnROb2RlKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoIUNYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SW5jcmVtZW50UmVsYXlvdXROb2RlKHRoaXMsIHBOb2RlLCBwUGFyZW50Tm9kZSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgIH0NCisgICAgbV9wTGF5b3V0UGFnZU1nci0+U3VibWl0Q29udGVudEl0ZW0ocExheW91dEl0ZW0sIGVTdGF0dXMpOw0KKyAgfSB3aGlsZSAoZVN0YXR1cyAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lICYmDQorICAgICAgICAgICAoIXBQYXVzZSB8fCAhcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSk7DQorICBpZiAoZVN0YXR1cyA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQorICAgIG1fcExheW91dFBhZ2VNZ3ItPkZpbmlzaFBhZ2luYXRlZFBhZ2VTZXRzKCk7DQorICAgIG1fcExheW91dFBhZ2VNZ3ItPlN5bmNMYXlvdXREYXRhKCk7DQorICAgIG1fYk5lZUxheW91dCA9IEZBTFNFOw0KICAgICBtX3JnQ2hhbmdlZENvbnRhaW5lcnMuUmVtb3ZlQWxsKCk7DQotICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIDEwMCAqIChlU3RhdHVzID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUNCisgICAgICAgICAgICAgICAgICAgID8gbV9uUHJvZ3Jlc3NDb3VudGVyDQorICAgICAgICAgICAgICAgICAgICA6IG1fblByb2dyZXNzQ291bnRlciAtIDEpIC8NCisgICAgICAgICBtX25Qcm9ncmVzc0NvdW50ZXI7DQogfQ0KLWludDMyX3QgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkNvdW50UGFnZXMoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fcExheW91dFBhZ2VNZ3IgPyBtX3BMYXlvdXRQYWdlTWdyLT5HZXRQYWdlQ291bnQoKSA6IDA7DQotfQ0KLUlYRkFfTGF5b3V0UGFnZSogQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkdldFBhZ2UoaW50MzJfdCBpbmRleCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3BMYXlvdXRQYWdlTWdyID8gbV9wTGF5b3V0UGFnZU1nci0+R2V0UGFnZShpbmRleCkgOiBOVUxMOw0KLX0NCi1DWEZBX0xheW91dEl0ZW0qIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpHZXRMYXlvdXRJdGVtKENYRkFfTm9kZSAqcEZvcm1JdGVtKQ0KLXsNCi0gICAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKXBGb3JtSXRlbS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOw0KLX0NCi12b2lkIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpBZGRDaGFuZ2VkQ29udGFpbmVyKENYRkFfTm9kZSogcENvbnRhaW5lcikNCi17DQotICAgIGlmIChtX3JnQ2hhbmdlZENvbnRhaW5lcnMuRmluZChwQ29udGFpbmVyKSA8IDApIHsNCi0gICAgICAgIG1fcmdDaGFuZ2VkQ29udGFpbmVycy5BZGQocENvbnRhaW5lcik7DQorRlhfQk9PTCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6SW5jcmVtZW50TGF5b3V0KCkgew0KKyAgaWYgKG1fYk5lZUxheW91dCkgew0KKyAgICBTdGFydExheW91dChUUlVFKTsNCisgICAgcmV0dXJuIERvTGF5b3V0KE5VTEwpID09IDEwMDsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMCwgYyA9IG1fcmdDaGFuZ2VkQ29udGFpbmVycy5HZXRTaXplKCk7IGkgPCBjOyBpKyspIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcmdDaGFuZ2VkQ29udGFpbmVyc1tpXTsNCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9DQorICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgIGlmICghcFBhcmVudE5vZGUpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi19DQotQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkdldFJvb3RMYXlvdXRJdGVtKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3BMYXlvdXRQYWdlTWdyID8gbV9wTGF5b3V0UGFnZU1nci0+R2V0Um9vdExheW91dEl0ZW0oKSA6IE5VTEw7DQotfQ0KLXZvaWQgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkNsZWFyTGF5b3V0RGF0YSgpDQotew0KLSAgICBpZihtX3BMYXlvdXRQYWdlTWdyKSB7DQotICAgICAgICBkZWxldGUgbV9wTGF5b3V0UGFnZU1ncjsNCi0gICAgICAgIG1fcExheW91dFBhZ2VNZ3IgPSBOVUxMOw0KKyAgICBpZiAoIUNYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SW5jcmVtZW50UmVsYXlvdXROb2RlKHRoaXMsIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJlbnROb2RlKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBpZihtX3BSb290SXRlbUxheW91dFByb2Nlc3Nvcikgew0KLSAgICAgICAgZGVsZXRlIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yOw0KLSAgICAgICAgbV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3IgPSBOVUxMOw0KLSAgICB9DQotICAgIG1fblByb2dyZXNzQ291bnRlciA9IDA7DQorICB9DQorICBtX3JnQ2hhbmdlZENvbnRhaW5lcnMuUmVtb3ZlQWxsKCk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6SXNOZWVkTGF5b3V0KCkNCi17DQotICAgIHJldHVybiBtX2JOZWVMYXlvdXQgfHwgbV9yZ0NoYW5nZWRDb250YWluZXJzLkdldFNpemUoKSA+IDA7DQoraW50MzJfdCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6Q291bnRQYWdlcygpIGNvbnN0IHsNCisgIHJldHVybiBtX3BMYXlvdXRQYWdlTWdyID8gbV9wTGF5b3V0UGFnZU1nci0+R2V0UGFnZUNvdW50KCkgOiAwOw0KIH0NCi1DWEZBX0xheW91dEl0ZW1JbXBsOjpDWEZBX0xheW91dEl0ZW1JbXBsKENYRkFfTm9kZSAqcE5vZGUsIEZYX0JPT0wgYklzQ29udGVudExheW91dEl0ZW0pDQotICAgIDogbV9wRm9ybU5vZGUocE5vZGUpDQotICAgICwgbV9iSXNDb250ZW50TGF5b3V0SXRlbShiSXNDb250ZW50TGF5b3V0SXRlbSkNCi0gICAgLCBtX3BQYXJlbnQoTlVMTCkNCi0gICAgLCBtX3BOZXh0U2libGluZyhOVUxMKQ0KLSAgICAsIG1fcEZpcnN0Q2hpbGQoTlVMTCkNCi17DQorSVhGQV9MYXlvdXRQYWdlKiBDWEZBX0xheW91dFByb2Nlc3Nvcjo6R2V0UGFnZShpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICByZXR1cm4gbV9wTGF5b3V0UGFnZU1nciA/IG1fcExheW91dFBhZ2VNZ3ItPkdldFBhZ2UoaW5kZXgpIDogTlVMTDsNCiB9DQotQ1hGQV9MYXlvdXRJdGVtSW1wbDo6fkNYRkFfTGF5b3V0SXRlbUltcGwoKQ0KLXsNCitDWEZBX0xheW91dEl0ZW0qIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpHZXRMYXlvdXRJdGVtKENYRkFfTm9kZSogcEZvcm1JdGVtKSB7DQorICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopcEZvcm1JdGVtLT5HZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSk7DQogfQ0KLUNYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGw6OkNYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwoQ1hGQV9Ob2RlICpwTm9kZSkNCi0gICAgOiBDWEZBX0xheW91dEl0ZW1JbXBsKHBOb2RlLCBGQUxTRSksIG1fcE9sZFN1YmZvcm0oTlVMTCkNCi17DQordm9pZCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6QWRkQ2hhbmdlZENvbnRhaW5lcihDWEZBX05vZGUqIHBDb250YWluZXIpIHsNCisgIGlmIChtX3JnQ2hhbmdlZENvbnRhaW5lcnMuRmluZChwQ29udGFpbmVyKSA8IDApIHsNCisgICAgbV9yZ0NoYW5nZWRDb250YWluZXJzLkFkZChwQ29udGFpbmVyKTsNCisgIH0NCiB9DQotQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGw6OkNYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKENYRkFfTm9kZSAqcE5vZGUpDQotICAgIDogQ1hGQV9MYXlvdXRJdGVtSW1wbChwTm9kZSwgVFJVRSkNCi0gICAgLCBtX3BQcmV2KE5VTEwpDQotICAgICwgbV9wTmV4dChOVUxMKQ0KLSAgICAsIG1fZHdTdGF0dXMoMCkNCi17DQorQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkdldFJvb3RMYXlvdXRJdGVtKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcExheW91dFBhZ2VNZ3IgPyBtX3BMYXlvdXRQYWdlTWdyLT5HZXRSb290TGF5b3V0SXRlbSgpIDogTlVMTDsNCiB9DQotQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGw6On5DWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCgpDQotew0KLSAgICBpZiAobV9wRm9ybU5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKSA9PSB0aGlzKSB7DQotICAgICAgICBtX3BGb3JtTm9kZS0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksIE5VTEwpOw0KLSAgICB9DQordm9pZCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6Q2xlYXJMYXlvdXREYXRhKCkgew0KKyAgaWYgKG1fcExheW91dFBhZ2VNZ3IpIHsNCisgICAgZGVsZXRlIG1fcExheW91dFBhZ2VNZ3I7DQorICAgIG1fcExheW91dFBhZ2VNZ3IgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yKSB7DQorICAgIGRlbGV0ZSBtX3BSb290SXRlbUxheW91dFByb2Nlc3NvcjsNCisgICAgbV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3IgPSBOVUxMOw0KKyAgfQ0KKyAgbV9uUHJvZ3Jlc3NDb3VudGVyID0gMDsNCit9DQorRlhfQk9PTCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6SXNOZWVkTGF5b3V0KCkgew0KKyAgcmV0dXJuIG1fYk5lZUxheW91dCB8fCBtX3JnQ2hhbmdlZENvbnRhaW5lcnMuR2V0U2l6ZSgpID4gMDsNCit9DQorQ1hGQV9MYXlvdXRJdGVtSW1wbDo6Q1hGQV9MYXlvdXRJdGVtSW1wbChDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNDb250ZW50TGF5b3V0SXRlbSkNCisgICAgOiBtX3BGb3JtTm9kZShwTm9kZSksDQorICAgICAgbV9iSXNDb250ZW50TGF5b3V0SXRlbShiSXNDb250ZW50TGF5b3V0SXRlbSksDQorICAgICAgbV9wUGFyZW50KE5VTEwpLA0KKyAgICAgIG1fcE5leHRTaWJsaW5nKE5VTEwpLA0KKyAgICAgIG1fcEZpcnN0Q2hpbGQoTlVMTCkge30NCitDWEZBX0xheW91dEl0ZW1JbXBsOjp+Q1hGQV9MYXlvdXRJdGVtSW1wbCgpIHt9DQorQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbDo6Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbChDWEZBX05vZGUqIHBOb2RlKQ0KKyAgICA6IENYRkFfTGF5b3V0SXRlbUltcGwocE5vZGUsIEZBTFNFKSwgbV9wT2xkU3ViZm9ybShOVUxMKSB7fQ0KK0NYRkFfQ29udGVudExheW91dEl0ZW1JbXBsOjpDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbChDWEZBX05vZGUqIHBOb2RlKQ0KKyAgICA6IENYRkFfTGF5b3V0SXRlbUltcGwocE5vZGUsIFRSVUUpLA0KKyAgICAgIG1fcFByZXYoTlVMTCksDQorICAgICAgbV9wTmV4dChOVUxMKSwNCisgICAgICBtX2R3U3RhdHVzKDApIHt9DQorQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGw6On5DWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCgpIHsNCisgIGlmIChtX3BGb3JtTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpID09IHRoaXMpIHsNCisgICAgbV9wRm9ybU5vZGUtPlNldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZLCBOVUxMKTsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2xheW91dF9pbXAuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgKaW5kZXggMDU3MmI4OS4uMWFhNzU0YiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2xheW91dF9pbXAuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5oCkBAIC0xMCw0MyArMTAsMzYgQEAKIGNsYXNzIENYRkFfTGF5b3V0UGFnZU1ncjsNCiBjbGFzcyBDWEZBX0xheW91dEFwcEFkYXB0ZXI7DQogY2xhc3MgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbDsNCi1jbGFzcyBDWEZBX0xheW91dFByb2Nlc3NvciA6IHB1YmxpYyBJWEZBX0RvY0xheW91dA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQotICAgIH5DWEZBX0xheW91dFByb2Nlc3NvcigpOw0KLSAgICB2aXJ0dWFsIENYRkFfRG9jdW1lbnQqCQlHZXREb2N1bWVudCgpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsCWludDMyX3QJCQlTdGFydExheW91dChGWF9CT09MIGJGb3JjZVJlc3RhcnQgPSBGQUxTRSk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCURvTGF5b3V0KElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJbmNyZW1lbnRMYXlvdXQoKTsNCi0gICAgdmlydHVhbCBpbnQzMl90CQkJQ291bnRQYWdlcygpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIElYRkFfTGF5b3V0UGFnZSoJR2V0UGFnZShpbnQzMl90IGluZGV4KSBjb25zdDsNCi0gICAgdmlydHVhbCBDWEZBX0xheW91dEl0ZW0qCUdldExheW91dEl0ZW0oQ1hGQV9Ob2RlICpwRm9ybUl0ZW0pOw0KK2NsYXNzIENYRkFfTGF5b3V0UHJvY2Vzc29yIDogcHVibGljIElYRkFfRG9jTGF5b3V0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIH5DWEZBX0xheW91dFByb2Nlc3NvcigpOw0KKyAgdmlydHVhbCBDWEZBX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IFN0YXJ0TGF5b3V0KEZYX0JPT0wgYkZvcmNlUmVzdGFydCA9IEZBTFNFKTsNCisgIHZpcnR1YWwgaW50MzJfdCBEb0xheW91dChJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEluY3JlbWVudExheW91dCgpOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50UGFnZXMoKSBjb25zdDsNCisgIHZpcnR1YWwgSVhGQV9MYXlvdXRQYWdlKiBHZXRQYWdlKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgdmlydHVhbCBDWEZBX0xheW91dEl0ZW0qIEdldExheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0pOw0KIA0KLSAgICB2b2lkCQkJCUFkZENoYW5nZWRDb250YWluZXIoQ1hGQV9Ob2RlKiBwQ29udGFpbmVyKTsNCi0gICAgdm9pZAkJCQlTZXRGb3JjZVJlTGF5b3V0KEZYX0JPT0wgYkZvcmNlUmVzdGFydCkNCi0gICAgew0KLSAgICAgICAgbV9iTmVlTGF5b3V0ID0gYkZvcmNlUmVzdGFydDsNCi0gICAgfQ0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKglHZXRSb290TGF5b3V0SXRlbSgpIGNvbnN0Ow0KLSAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqCUdldFJvb3RSb290SXRlbUxheW91dFByb2Nlc3NvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BSb290SXRlbUxheW91dFByb2Nlc3NvcjsNCi0gICAgfQ0KLSAgICBDWEZBX0xheW91dFBhZ2VNZ3IqCQkJR2V0TGF5b3V0UGFnZU1ncigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BMYXlvdXRQYWdlTWdyOw0KLSAgICB9DQotcHJvdGVjdGVkOg0KLSAgICB2b2lkCQlDbGVhckxheW91dERhdGEoKTsNCisgIHZvaWQgQWRkQ2hhbmdlZENvbnRhaW5lcihDWEZBX05vZGUqIHBDb250YWluZXIpOw0KKyAgdm9pZCBTZXRGb3JjZVJlTGF5b3V0KEZYX0JPT0wgYkZvcmNlUmVzdGFydCkgeyBtX2JOZWVMYXlvdXQgPSBiRm9yY2VSZXN0YXJ0OyB9DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBHZXRSb290TGF5b3V0SXRlbSgpIGNvbnN0Ow0KKyAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBHZXRSb290Um9vdEl0ZW1MYXlvdXRQcm9jZXNzb3IoKSB7DQorICAgIHJldHVybiBtX3BSb290SXRlbUxheW91dFByb2Nlc3NvcjsNCisgIH0NCisgIENYRkFfTGF5b3V0UGFnZU1nciogR2V0TGF5b3V0UGFnZU1ncigpIHsgcmV0dXJuIG1fcExheW91dFBhZ2VNZ3I7IH0NCiANCi0gICAgRlhfQk9PTAkJSXNOZWVkTGF5b3V0KCk7DQorIHByb3RlY3RlZDoNCisgIHZvaWQgQ2xlYXJMYXlvdXREYXRhKCk7DQogDQotICAgIENYRkFfRG9jdW1lbnQqCQkJCW1fcERvY3VtZW50Ow0KLSAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqICAgbV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3I7DQotICAgIENYRkFfTGF5b3V0UGFnZU1ncioJCQltX3BMYXlvdXRQYWdlTWdyOw0KLSAgICBDWEZBX05vZGVBcnJheQkJCQltX3JnQ2hhbmdlZENvbnRhaW5lcnM7DQotICAgIHVpbnQzMl90CQkJCQltX25Qcm9ncmVzc0NvdW50ZXI7DQotICAgIEZYX0JPT0wJCQkJCQltX2JOZWVMYXlvdXQ7DQorICBGWF9CT09MIElzTmVlZExheW91dCgpOw0KKw0KKyAgQ1hGQV9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7DQorICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yOw0KKyAgQ1hGQV9MYXlvdXRQYWdlTWdyKiBtX3BMYXlvdXRQYWdlTWdyOw0KKyAgQ1hGQV9Ob2RlQXJyYXkgbV9yZ0NoYW5nZWRDb250YWluZXJzOw0KKyAgdWludDMyX3QgbV9uUHJvZ3Jlc3NDb3VudGVyOw0KKyAgRlhfQk9PTCBtX2JOZWVMYXlvdXQ7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfc2VyaWFsaXplLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9zZXJpYWxpemUuY3BwCmluZGV4IDY5YzgzNWYuLjYxYmU4OGQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9zZXJpYWxpemUuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9zZXJpYWxpemUuY3BwCkBAIC0xNyw1MjcgKzE3LDU3NiBAQAogI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCiAjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KICNpbmNsdWRlICJ4ZmFfZG9jdW1lbnRfc2VyaWFsaXplLmgiDQotSVhGQV9QYWNrZXRJbXBvcnQqIElYRkFfUGFja2V0SW1wb3J0OjpDcmVhdGUoQ1hGQV9Eb2N1bWVudCAqcERvY3VtZW50KQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDWEZBX0RhdGFJbXBvcnRlcihwRG9jdW1lbnQpOw0KK0lYRkFfUGFja2V0SW1wb3J0KiBJWEZBX1BhY2tldEltcG9ydDo6Q3JlYXRlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkgew0KKyAgcmV0dXJuIEZYX05FVyBDWEZBX0RhdGFJbXBvcnRlcihwRG9jdW1lbnQpOw0KIH0NCi1DWEZBX0RhdGFJbXBvcnRlcjo6Q1hGQV9EYXRhSW1wb3J0ZXIoQ1hGQV9Eb2N1bWVudCAqcERvY3VtZW50KQ0KLSAgICA6IG1fcERvY3VtZW50KHBEb2N1bWVudCkNCi17DQotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsNCitDWEZBX0RhdGFJbXBvcnRlcjo6Q1hGQV9EYXRhSW1wb3J0ZXIoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KKyAgICA6IG1fcERvY3VtZW50KHBEb2N1bWVudCkgew0KKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOw0KIH0NCi1GWF9CT09MIENYRkFfRGF0YUltcG9ydGVyOjpJbXBvcnREYXRhKElGWF9GaWxlUmVhZCogcERhdGFEb2N1bWVudCkNCi17DQotICAgIElYRkFfUGFyc2VyICpwRGF0YURvY3VtZW50UGFyc2VyID0gSVhGQV9QYXJzZXI6OkNyZWF0ZShtX3BEb2N1bWVudCk7DQotICAgIGlmKCFwRGF0YURvY3VtZW50UGFyc2VyKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYocERhdGFEb2N1bWVudFBhcnNlci0+U3RhcnRQYXJzZShwRGF0YURvY3VtZW50LCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSAhPSBYRkFfUEFSU0VTVEFUVVNfUmVhZHkpIHsNCi0gICAgICAgIHBEYXRhRG9jdW1lbnRQYXJzZXItPlJlbGVhc2UoKTsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZihwRGF0YURvY3VtZW50UGFyc2VyLT5Eb1BhcnNlKE5VTEwpIDwgWEZBX1BBUlNFU1RBVFVTX0RvbmUpIHsNCi0gICAgICAgIHBEYXRhRG9jdW1lbnRQYXJzZXItPlJlbGVhc2UoKTsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBJbXBvcnREYXRhUm9vdCA9IHBEYXRhRG9jdW1lbnRQYXJzZXItPkdldFJvb3ROb2RlKCk7DQotICAgIGlmKCFwSW1wb3J0RGF0YVJvb3QpIHsNCi0gICAgICAgIHBEYXRhRG9jdW1lbnRQYXJzZXItPlJlbGVhc2UoKTsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBEYXRhTW9kZWwgPSAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRGF0YXNldHMpOw0KLSAgICBpZiAoIXBEYXRhTW9kZWwpIHsNCi0gICAgICAgIHBEYXRhRG9jdW1lbnRQYXJzZXItPlJlbGVhc2UoKTsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhKTsNCi0gICAgaWYgKHBEYXRhTm9kZSkgew0KLSAgICAgICAgcERhdGFNb2RlbC0+UmVtb3ZlQ2hpbGQocERhdGFOb2RlKTsNCi0gICAgfQ0KLSAgICBpZiAocEltcG9ydERhdGFSb290LT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGF0YU1vZGVsKSB7DQotICAgICAgICB3aGlsZShDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwSW1wb3J0RGF0YVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KLSAgICAgICAgICAgIHBJbXBvcnREYXRhUm9vdC0+UmVtb3ZlQ2hpbGQocENoaWxkTm9kZSk7DQotICAgICAgICAgICAgcERhdGFNb2RlbC0+SW5zZXJ0Q2hpbGQocENoaWxkTm9kZSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gcEltcG9ydERhdGFSb290LT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICAgICAgSUZERV9YTUxOb2RlKiBwUGFyZW50WE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCk7DQotICAgICAgICBpZiAocFBhcmVudFhNTE5vZGUpIHsNCi0gICAgICAgICAgICBwUGFyZW50WE1MTm9kZS0+UmVtb3ZlQ2hpbGROb2RlKHBYTUxOb2RlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBEYXRhTW9kZWwtPkluc2VydENoaWxkKHBJbXBvcnREYXRhUm9vdCk7DQotICAgIH0NCi0gICAgbV9wRG9jdW1lbnQtPkRvRGF0YVJlbWVyZ2UoRkFMU0UpOw0KK0ZYX0JPT0wgQ1hGQV9EYXRhSW1wb3J0ZXI6OkltcG9ydERhdGEoSUZYX0ZpbGVSZWFkKiBwRGF0YURvY3VtZW50KSB7DQorICBJWEZBX1BhcnNlciogcERhdGFEb2N1bWVudFBhcnNlciA9IElYRkFfUGFyc2VyOjpDcmVhdGUobV9wRG9jdW1lbnQpOw0KKyAgaWYgKCFwRGF0YURvY3VtZW50UGFyc2VyKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwRGF0YURvY3VtZW50UGFyc2VyLT5TdGFydFBhcnNlKHBEYXRhRG9jdW1lbnQsIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpICE9DQorICAgICAgWEZBX1BBUlNFU1RBVFVTX1JlYWR5KSB7DQogICAgIHBEYXRhRG9jdW1lbnRQYXJzZXItPlJlbGVhc2UoKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwRGF0YURvY3VtZW50UGFyc2VyLT5Eb1BhcnNlKE5VTEwpIDwgWEZBX1BBUlNFU1RBVFVTX0RvbmUpIHsNCisgICAgcERhdGFEb2N1bWVudFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBJbXBvcnREYXRhUm9vdCA9IHBEYXRhRG9jdW1lbnRQYXJzZXItPkdldFJvb3ROb2RlKCk7DQorICBpZiAoIXBJbXBvcnREYXRhUm9vdCkgew0KKyAgICBwRGF0YURvY3VtZW50UGFyc2VyLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfTm9kZSogcERhdGFNb2RlbCA9DQorICAgICAgKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKTsNCisgIGlmICghcERhdGFNb2RlbCkgew0KKyAgICBwRGF0YURvY3VtZW50UGFyc2VyLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfTm9kZSogcERhdGFOb2RlID0gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0RhdGEpOw0KKyAgaWYgKHBEYXRhTm9kZSkgew0KKyAgICBwRGF0YU1vZGVsLT5SZW1vdmVDaGlsZChwRGF0YU5vZGUpOw0KKyAgfQ0KKyAgaWYgKHBJbXBvcnREYXRhUm9vdC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCkgew0KKyAgICB3aGlsZSAoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0NCisgICAgICAgICAgICAgICBwSW1wb3J0RGF0YVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KKyAgICAgIHBJbXBvcnREYXRhUm9vdC0+UmVtb3ZlQ2hpbGQocENoaWxkTm9kZSk7DQorICAgICAgcERhdGFNb2RlbC0+SW5zZXJ0Q2hpbGQocENoaWxkTm9kZSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBwSW1wb3J0RGF0YVJvb3QtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgIElGREVfWE1MTm9kZSogcFBhcmVudFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpOw0KKyAgICBpZiAocFBhcmVudFhNTE5vZGUpIHsNCisgICAgICBwUGFyZW50WE1MTm9kZS0+UmVtb3ZlQ2hpbGROb2RlKHBYTUxOb2RlKTsNCisgICAgfQ0KKyAgICBwRGF0YU1vZGVsLT5JbnNlcnRDaGlsZChwSW1wb3J0RGF0YVJvb3QpOw0KKyAgfQ0KKyAgbV9wRG9jdW1lbnQtPkRvRGF0YVJlbWVyZ2UoRkFMU0UpOw0KKyAgcERhdGFEb2N1bWVudFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIFhGQV9FeHBvcnRFbmNvZGVBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikNCi17DQotICAgIENGWF9XaWRlVGV4dEJ1ZiB0ZXh0QnVmOw0KLSAgICBpbnQzMl90IGlMZW4gPSBzdHIuR2V0TGVuZ3RoKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW47IGkrKykgew0KLSAgICAgICAgc3dpdGNoIChzdHJbaV0pIHsNCi0gICAgICAgICAgICBjYXNlICcmJzoNCi0gICAgICAgICAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZhbXA7Iik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJzwnOg0KLSAgICAgICAgICAgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmx0OyIpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICc+JzoNCi0gICAgICAgICAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZndDsiKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAnXCcnOg0KLSAgICAgICAgICAgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmFwb3M7Iik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ1wiJzoNCi0gICAgICAgICAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZxdW90OyIpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICB0ZXh0QnVmLkFwcGVuZENoYXIoc3RyW2ldKTsNCi0gICAgICAgIH0NCitDRlhfV2lkZVN0cmluZyBYRkFfRXhwb3J0RW5jb2RlQXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsNCisgIENGWF9XaWRlVGV4dEJ1ZiB0ZXh0QnVmOw0KKyAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbjsgaSsrKSB7DQorICAgIHN3aXRjaCAoc3RyW2ldKSB7DQorICAgICAgY2FzZSAnJic6DQorICAgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmFtcDsiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJzwnOg0KKyAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZsdDsiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJz4nOg0KKyAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZndDsiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImYXBvczsiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1wiJzoNCisgICAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImcXVvdDsiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICB0ZXh0QnVmLkFwcGVuZENoYXIoc3RyW2ldKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gdGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7DQorICB9DQorICByZXR1cm4gdGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIFhGQV9FeHBvcnRFbmNvZGVDb250ZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKQ0KLXsNCi0gICAgQ0ZYX1dpZGVUZXh0QnVmIHRleHRCdWY7DQotICAgIGludDMyX3QgaUxlbiA9IHN0ci5HZXRMZW5ndGgoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbjsgaSsrKSB7DQotICAgICAgICBGWF9XQ0hBUiBjaCA9IHN0ci5HZXRBdChpKTsNCi0gICAgICAgIGlmICghRkRFX0lzWE1MVmFsaWRDaGFyKGNoKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGNoID09ICcmJykgew0KLSAgICAgICAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImYW1wOyIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPCcpIHsNCi0gICAgICAgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmx0OyIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPicpIHsNCi0gICAgICAgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmd0OyIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXCcnKSB7DQotICAgICAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZhcG9zOyIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXCInKSB7DQotICAgICAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZxdW90OyIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnICcpIHsNCi0gICAgICAgICAgICBpZiAoaSAmJiBzdHIuR2V0QXQoaSAtIDEpICE9ICcgJykgew0KLSAgICAgICAgICAgICAgICB0ZXh0QnVmLkFwcGVuZENoYXIoJyAnKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJiN4MjA7Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB0ZXh0QnVmLkFwcGVuZENoYXIoc3RyLkdldEF0KGkpKTsNCi0gICAgICAgIH0NCitDRlhfV2lkZVN0cmluZyBYRkFfRXhwb3J0RW5jb2RlQ29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgew0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHRleHRCdWY7DQorICBpbnQzMl90IGlMZW4gPSBzdHIuR2V0TGVuZ3RoKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgRlhfV0NIQVIgY2ggPSBzdHIuR2V0QXQoaSk7DQorICAgIGlmICghRkRFX0lzWE1MVmFsaWRDaGFyKGNoKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIHJldHVybiB0ZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsNCi19DQotc3RhdGljIHZvaWQgWEZBX1NhdmVBdHRyaWJ1dGUoQ1hGQV9Ob2RlKiBwTm9kZSwgWEZBX0FUVFJJQlVURSBlTmFtZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsIEZYX0JPT0wgYlByb3RvLCBDRlhfV2lkZVN0cmluZyAmd3NPdXRwdXQpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICBpZiAoKCFiUHJvdG8gJiYgIXBOb2RlLT5IYXNBdHRyaWJ1dGUoKFhGQV9BVFRSSUJVVEUpZU5hbWUsIGJQcm90bykpIHx8ICFwTm9kZS0+R2V0QXR0cmlidXRlKChYRkFfQVRUUklCVVRFKWVOYW1lLCB3c1ZhbHVlLCBGQUxTRSkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICB3c1ZhbHVlID0gWEZBX0V4cG9ydEVuY29kZUF0dHJpYnV0ZSh3c1ZhbHVlKTsNCi0gICAgd3NPdXRwdXQgKz0gRlhfV1NUUkMoTCIgIik7DQotICAgIHdzT3V0cHV0ICs9IHdzTmFtZTsNCi0gICAgd3NPdXRwdXQgKz0gRlhfV1NUUkMoTCI9XCIiKTsNCi0gICAgd3NPdXRwdXQgKz0gd3NWYWx1ZTsNCi0gICAgd3NPdXRwdXQgKz0gRlhfV1NUUkMoTCJcIiIpOw0KLX0NCi1zdGF0aWMgRlhfQk9PTCBYRkFfRGF0YUV4cG9ydGVyX0F0dHJpYnV0ZVNhdmVJbkRhdGFNb2RlbChDWEZBX05vZGUqIHBOb2RlLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBGWF9CT09MIGJTYXZlSW5EYXRhTW9kZWwgPSBGQUxTRTsNCi0gICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSW1hZ2UpIHsNCi0gICAgICAgIHJldHVybiBiU2F2ZUluRGF0YU1vZGVsOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcFZhbHVlTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgaWYgKCFwVmFsdWVOb2RlIHx8IHBWYWx1ZU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9WYWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIGJTYXZlSW5EYXRhTW9kZWw7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwRmllbGROb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgIGlmIChwRmllbGROb2RlICYmIHBGaWVsZE5vZGUtPkdldEJpbmREYXRhKCkgJiYgZUF0dHJpYnV0ZSA9PSBYRkFfQVRUUklCVVRFX0hyZWYpIHsNCi0gICAgICAgIGJTYXZlSW5EYXRhTW9kZWwgPSBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBiU2F2ZUluRGF0YU1vZGVsOw0KLX0NCi1GWF9CT09MCVhGQV9EYXRhRXhwb3J0ZXJfQ29udGVudE5vZGVOZWVkdG9FeHBvcnQoQ1hGQV9Ob2RlKiBwQ29udGVudE5vZGUpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQotICAgIGlmICghcENvbnRlbnROb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCwgRkFMU0UsIEZBTFNFKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEZYU1lTX2Fzc2VydChwQ29udGVudE5vZGUtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZSk7DQotICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwQ29udGVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICBpZiAoIXBQYXJlbnROb2RlIHx8IHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfVmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcEdyYW5kUGFyZW50Tm9kZSA9IHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgaWYgKCFwR3JhbmRQYXJlbnROb2RlIHx8IHBHcmFuZFBhcmVudE5vZGUtPkdldE9iamVjdFR5cGUoKSAhPSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBpZiAocEdyYW5kUGFyZW50Tm9kZS0+R2V0QmluZERhdGEoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBwR3JhbmRQYXJlbnROb2RlLT5HZXRXaWRnZXREYXRhKCk7DQotICAgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSBwV2lkZ2V0RGF0YS0+R2V0VUlUeXBlKCk7DQotICAgIGlmIChlVUlUeXBlID09IFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1zdGF0aWMgdm9pZCBYRkFfRGF0YUV4cG9ydGVyX1JlY29nbml6ZVhGQVZlcnNpb25OdW1iZXIoQ1hGQV9Ob2RlICpwVGVtcGxhdGVSb290LCBDRlhfV2lkZVN0cmluZyYgd3NWZXJzaW9uTnVtYmVyKQ0KLXsNCi0gICAgd3NWZXJzaW9uTnVtYmVyLkVtcHR5KCk7DQotICAgIGlmKCFwVGVtcGxhdGVSb290KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wbGF0ZU5TOw0KLSAgICBpZighcFRlbXBsYXRlUm9vdC0+VHJ5TmFtZXNwYWNlKHdzVGVtcGxhdGVOUykpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBYRkFfVkVSU0lPTiBlVmVyc2lvbiA9IHBUZW1wbGF0ZVJvb3QtPkdldERvY3VtZW50KCktPlJlY29nbml6ZVhGQVZlcnNpb25OdW1iZXIod3NUZW1wbGF0ZU5TKTsNCi0gICAgaWYoZVZlcnNpb24gPT0gWEZBX1ZFUlNJT05fVU5LTk9XTikgew0KLSAgICAgICAgZVZlcnNpb24gPSBYRkFfVkVSU0lPTl9ERUZBVUxUOw0KLSAgICB9DQotICAgIHdzVmVyc2lvbk51bWJlci5Gb3JtYXQoTCIlaS4laSIsIGVWZXJzaW9uIC8gMTAwLCBlVmVyc2lvbiAlIDEwMCk7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlX0NoYW5nZWQoQ1hGQV9Ob2RlKiBwTm9kZSwgQ0ZYX1dpZGVUZXh0QnVmJiBidWYsIEZYX0JPT0wgYlNhdmVYTUwgPSBGQUxTRSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cnM7DQotICAgIGludDMyX3QgaUF0dHJzID0gMDsNCi0gICAgY29uc3QgdWludDhfdCogcEF0dHJzID0gWEZBX0dldEVsZW1lbnRBdHRyaWJ1dGVzKHBOb2RlLT5HZXRDbGFzc0lEKCksIGlBdHRycyk7DQotICAgIHdoaWxlIChpQXR0cnMtLSkgew0KLSAgICAgICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEF0dHIgPSBYRkFfR2V0QXR0cmlidXRlQnlJRCgoWEZBX0FUVFJJQlVURSlwQXR0cnNbaUF0dHJzXSk7DQotICAgICAgICBpZiAocEF0dHItPmVOYW1lID09IFhGQV9BVFRSSUJVVEVfTmFtZSB8fCAoWEZBX0RhdGFFeHBvcnRlcl9BdHRyaWJ1dGVTYXZlSW5EYXRhTW9kZWwocE5vZGUsIHBBdHRyLT5lTmFtZSkgJiYgIWJTYXZlWE1MKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyOw0KLSAgICAgICAgWEZBX1NhdmVBdHRyaWJ1dGUocE5vZGUsIHBBdHRyLT5lTmFtZSwgcEF0dHItPnBOYW1lLCBiU2F2ZVhNTCwgd3NBdHRyKTsNCi0gICAgICAgIHdzQXR0cnMgKz0gd3NBdHRyOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hpbGRyZW47DQotICAgIHN3aXRjaChwTm9kZS0+R2V0T2JqZWN0VHlwZSgpKSB7DQotICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlOiB7DQotICAgICAgICAgICAgICAgIGlmICghYlNhdmVYTUwgJiYgIVhGQV9EYXRhRXhwb3J0ZXJfQ29udGVudE5vZGVOZWVkdG9FeHBvcnQocE5vZGUpKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBSYXdWYWx1ZU5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgICAgICB3aGlsZShwUmF3VmFsdWVOb2RlICYmIHBSYXdWYWx1ZU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TaGFycHhIVE1MICYmIHBSYXdWYWx1ZU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TaGFycHRleHQgJiYgcFJhd1ZhbHVlTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1NoYXJweG1sKSB7DQotICAgICAgICAgICAgICAgICAgICBwUmF3VmFsdWVOb2RlID0gcFJhd1ZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZighcFJhd1ZhbHVlTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCi0gICAgICAgICAgICAgICAgcE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIGlmIChwUmF3VmFsdWVOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTCAmJiB3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQotICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBFeERhdGFYTUwgPSBwTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghcEV4RGF0YVhNTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwUmljaFRleHRYTUwgPSBwRXhEYXRhWE1MLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwUmljaFRleHRYTUwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIElGWF9NZW1vcnlTdHJlYW0qIHBNZW1TdHJlYW0gPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICBJRlhfU3RyZWFtICpwVGVtcFN0cmVhbSA9IElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbSgoSUZYX0ZpbGVXcml0ZSopcE1lbVN0cmVhbSwgRlhfU1RSRUFNQUNDRVNTX1RleHQgfCBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUgfCBGWF9TVFJFQU1BQ0NFU1NfQXBwZW5kKTsNCi0gICAgICAgICAgICAgICAgICAgIHBUZW1wU3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsNCi0gICAgICAgICAgICAgICAgICAgIHBSaWNoVGV4dFhNTC0+U2F2ZVhNTE5vZGUocFRlbXBTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgd3NDaGlsZHJlbiArPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKGNvbnN0IEZYX0NIQVIqKXBNZW1TdHJlYW0tPkdldEJ1ZmZlcigpLCBwTWVtU3RyZWFtLT5HZXRTaXplKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgcFRlbXBTdHJlYW0tPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIHBNZW1TdHJlYW0tPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwUmF3VmFsdWVOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU2hhcnB4bWwgICYmIHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSYXdWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIHBSYXdWYWx1ZU5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1Jhd1ZhbHVlLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAod3NSYXdWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTZWxUZXh0QXJyYXk7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDA7DQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlFbmQgPSB3c1Jhd1ZhbHVlLkZpbmQoTCdcbicsIGlTdGFydCk7DQotICAgICAgICAgICAgICAgICAgICBpRW5kID0gKGlFbmQgPT0gLTEpID8gd3NSYXdWYWx1ZS5HZXRMZW5ndGgoKSA6IGlFbmQ7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaUVuZCA+PSBpU3RhcnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1NlbFRleHRBcnJheS5BZGQod3NSYXdWYWx1ZS5NaWQoaVN0YXJ0LCBpRW5kIC0gaVN0YXJ0KSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0ID0gaUVuZCArIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlTdGFydCA+PSB3c1Jhd1ZhbHVlLkdldExlbmd0aCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpRW5kID0gd3NSYXdWYWx1ZS5GaW5kKEwnXG4nLCBpU3RhcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwUGFyZW50Tm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwUGFyZW50Tm9kZSk7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBHcmFuZHBhcmVudE5vZGUgPSBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocEdyYW5kcGFyZW50Tm9kZSk7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBib2R5VGFnTmFtZTsNCi0gICAgICAgICAgICAgICAgICAgIGJvZHlUYWdOYW1lID0gcEdyYW5kcGFyZW50Tm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChib2R5VGFnTmFtZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBib2R5VGFnTmFtZSA9IEZYX1dTVFJDKEwiTGlzdEJveDEiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIjwiKTsNCi0gICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCBib2R5VGFnTmFtZTsNCi0gICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIiB4bWxucz1cIlwiXG4+Iik7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCB3c1NlbFRleHRBcnJheS5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIjx2YWx1ZVxuPiIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCBYRkFfRXhwb3J0RW5jb2RlQ29udGVudCh3c1NlbFRleHRBcnJheVtpXSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiPC92YWx1ZVxuPiIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiPC8iKTsNCi0gICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCBib2R5VGFnTmFtZTsNCi0gICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIlxuPiIpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NDaGlsZHJlbiArPSBidWYuR2V0V2lkZVN0cmluZygpOw0KLSAgICAgICAgICAgICAgICAgICAgYnVmLkNsZWFyKCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZSA9IHBSYXdWYWx1ZU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NDaGlsZHJlbiArPSBYRkFfRXhwb3J0RW5jb2RlQ29udGVudCh3c1ZhbHVlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGU6DQotICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVDOg0KLSAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlVjogew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZSA9IHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlKTsNCi0gICAgICAgICAgICAgICAgd3NDaGlsZHJlbiArPSBYRkFfRXhwb3J0RW5jb2RlQ29udGVudCh3c1ZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSA9IHBOb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFwVGVtcGxhdGVOb2RlIHx8IHBUZW1wbGF0ZU5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfVU5LTk9XTikgIT0gcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfVU5LTk9XTikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJTYXZlWE1MID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDRlhfV2lkZVRleHRCdWYgbmV3QnVmOw0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICAgICAgd2hpbGUgKHBDaGlsZE5vZGUpIHsNCi0gICAgICAgICAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGVfQ2hhbmdlZChwQ2hpbGROb2RlLCBuZXdCdWYsIGJTYXZlWE1MKTsNCi0gICAgICAgICAgICAgICAgd3NDaGlsZHJlbiArPSBuZXdCdWYuR2V0V2lkZVN0cmluZygpOw0KLSAgICAgICAgICAgICAgICBuZXdCdWYuQ2xlYXIoKTsNCi0gICAgICAgICAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghYlNhdmVYTUwgJiYgIXdzQ2hpbGRyZW4uSXNFbXB0eSgpICYmIHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCi0gICAgICAgICAgICAgICAgd3NDaGlsZHJlbi5FbXB0eSgpOw0KLSAgICAgICAgICAgICAgICBiU2F2ZVhNTCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICAgICAgICAgIHdoaWxlIChwQ2hpbGROb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9DaGFuZ2VkKHBDaGlsZE5vZGUsIG5ld0J1ZiwgYlNhdmVYTUwpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NDaGlsZHJlbiArPSBuZXdCdWYuR2V0V2lkZVN0cmluZygpOw0KLSAgICAgICAgICAgICAgICAgICAgbmV3QnVmLkNsZWFyKCk7DQotICAgICAgICAgICAgICAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBpZiAoIXdzQ2hpbGRyZW4uSXNFbXB0eSgpIHx8ICF3c0F0dHJzLklzRW1wdHkoKSB8fCBwTm9kZS0+SGFzQXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSkpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0VsZW1lbnQ7DQotICAgICAgICBwTm9kZS0+R2V0Q2xhc3NOYW1lKHdzRWxlbWVudCk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQotICAgICAgICBYRkFfU2F2ZUF0dHJpYnV0ZShwTm9kZSwgWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMIm5hbWUiKSwgVFJVRSwgd3NOYW1lKTsNCi0gICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIjwiKTsNCi0gICAgICAgIGJ1ZiA8PCB3c0VsZW1lbnQ7DQotICAgICAgICBidWYgPDwgd3NOYW1lOw0KLSAgICAgICAgYnVmIDw8IHdzQXR0cnM7DQotICAgICAgICBpZiAod3NDaGlsZHJlbi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBidWYgPDwgRlhfV1NUUkMoTCJcbi8+Iik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIlxuPiIpOw0KLSAgICAgICAgICAgIGJ1ZiA8PCB3c0NoaWxkcmVuOw0KLSAgICAgICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIjwvIik7DQotICAgICAgICAgICAgYnVmIDw8IHdzRWxlbWVudDsNCi0gICAgICAgICAgICBidWYgPDwgRlhfV1NUUkMoTCJcbj4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi1zdGF0aWMgdm9pZCBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9Db250YWluZXIoQ1hGQV9Ob2RlKiBwTm9kZSwgSUZYX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiU2F2ZVhNTCA9IEZBTFNFKQ0KLXsNCi0gICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBpZiAoZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfRmllbGQgfHwgZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfRHJhdyB8fCAhcE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7DQotICAgICAgICBDRlhfV2lkZVRleHRCdWYgYnVmOw0KLSAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGVfQ2hhbmdlZChwTm9kZSwgYnVmLCBiU2F2ZVhNTCk7DQotICAgICAgICBGWF9TVFJTSVpFIG5MZW4gPSBidWYuR2V0TGVuZ3RoKCk7DQotICAgICAgICBpZiAobkxlbiA+IDApIHsNCi0gICAgICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZygoY29uc3QgRlhfV0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgbkxlbik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzRWxlbWVudDsNCi0gICAgcE5vZGUtPkdldENsYXNzTmFtZSh3c0VsZW1lbnQpOw0KLSAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIjwiLCAxKTsNCi0gICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcod3NFbGVtZW50LkdldFB0cigpLCB3c0VsZW1lbnQuR2V0TGVuZ3RoKCkpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsNCi0gICAgWEZBX1NhdmVBdHRyaWJ1dGUocE5vZGUsIFhGQV9BVFRSSUJVVEVfTmFtZSwgRlhfV1NUUkMoTCJuYW1lIiksIFRSVUUsIHdzT3V0cHV0KTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyczsNCi0gICAgaW50MzJfdCBpQXR0cnMgPSAwOw0KLSAgICBjb25zdCB1aW50OF90KiBwQXR0cnMgPSBYRkFfR2V0RWxlbWVudEF0dHJpYnV0ZXMocE5vZGUtPkdldENsYXNzSUQoKSwgaUF0dHJzKTsNCi0gICAgd2hpbGUgKGlBdHRycy0tKSB7DQotICAgICAgICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwQXR0ciA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKChYRkFfQVRUUklCVVRFKXBBdHRyc1tpQXR0cnNdKTsNCi0gICAgICAgIGlmIChwQXR0ci0+ZU5hbWUgPT0gWEZBX0FUVFJJQlVURV9OYW1lKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHI7DQotICAgICAgICBYRkFfU2F2ZUF0dHJpYnV0ZShwTm9kZSwgcEF0dHItPmVOYW1lLCBwQXR0ci0+cE5hbWUsIEZBTFNFLCB3c0F0dHIpOw0KLSAgICAgICAgd3NPdXRwdXQgKz0gd3NBdHRyOw0KLSAgICB9DQotICAgIGlmICghd3NPdXRwdXQuSXNFbXB0eSgpKSB7DQotICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZygoY29uc3QgRlhfV0NIQVIqKXdzT3V0cHV0LCB3c091dHB1dC5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgaWYgKHBDaGlsZE5vZGUpIHsNCi0gICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiXG4+IiwgMik7DQotICAgICAgICB3aGlsZSAocENoaWxkTm9kZSkgew0KLSAgICAgICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlX0NvbnRhaW5lcihwQ2hpbGROb2RlLCBwU3RyZWFtLCBiU2F2ZVhNTCk7DQotICAgICAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgICAgICB9DQotICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIjwvIiwgMik7DQotICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyh3c0VsZW1lbnQuR2V0UHRyKCksIHdzRWxlbWVudC5HZXRMZW5ndGgoKSk7DQotICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIlxuPiIsIDIpOw0KKyAgICBpZiAoY2ggPT0gJyYnKSB7DQorICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZhbXA7Iik7DQorICAgIH0gZWxzZSBpZiAoY2ggPT0gJzwnKSB7DQorICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZsdDsiKTsNCisgICAgfSBlbHNlIGlmIChjaCA9PSAnPicpIHsNCisgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmd0OyIpOw0KKyAgICB9IGVsc2UgaWYgKGNoID09ICdcJycpIHsNCisgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmFwb3M7Iik7DQorICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wiJykgew0KKyAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImcXVvdDsiKTsNCisgICAgfSBlbHNlIGlmIChjaCA9PSAnICcpIHsNCisgICAgICBpZiAoaSAmJiBzdHIuR2V0QXQoaSAtIDEpICE9ICcgJykgew0KKyAgICAgICAgdGV4dEJ1Zi5BcHBlbmRDaGFyKCcgJyk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImI3gyMDsiKTsNCisgICAgICB9DQogICAgIH0gZWxzZSB7DQotICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIlxuLz4iLCAzKTsNCisgICAgICB0ZXh0QnVmLkFwcGVuZENoYXIoc3RyLkdldEF0KGkpKTsNCiAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHRleHRCdWYuR2V0V2lkZVN0cmluZygpOw0KIH0NCi12b2lkIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlKENYRkFfTm9kZSogcE5vZGUsIElGWF9TdHJlYW0qIHBTdHJlYW0sIGNvbnN0IEZYX0NIQVIqIHBDaGVja3N1bSAsIEZYX0JPT0wgYlNhdmVYTUwpDQotew0KLSAgICBpZihwTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZSkgew0KLSAgICAgICAgc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBzX3B3c1RhZ05hbWUgPSBMIjxmb3JtIjsNCi0gICAgICAgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogc19wd3NDbG9zZSA9IEwiPC9mb3JtXG4+IjsNCi0gICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHNfcHdzVGFnTmFtZSwgRlhTWVNfd2NzbGVuKHNfcHdzVGFnTmFtZSkpOw0KLSAgICAgICAgaWYgKHBDaGVja3N1bSAhPSBOVUxMKSB7DQotICAgICAgICAgICAgc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBzX3B3Q2hlY2tzdW0gPSBMIiBjaGVja3N1bT1cIiI7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGVja3N1bSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChwQ2hlY2tzdW0sIEZYU1lTX3N0cmxlbihwQ2hlY2tzdW0pKTsNCi0gICAgICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhzX3B3Q2hlY2tzdW0sIEZYU1lTX3djc2xlbihzX3B3Q2hlY2tzdW0pKTsNCi0gICAgICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZygoY29uc3QgRlhfV0NIQVIqKXdzQ2hlY2tzdW0sIHdzQ2hlY2tzdW0uR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiXCIiLCAxKTsNCitzdGF0aWMgdm9pZCBYRkFfU2F2ZUF0dHJpYnV0ZShDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvdG8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgaWYgKCghYlByb3RvICYmICFwTm9kZS0+SGFzQXR0cmlidXRlKChYRkFfQVRUUklCVVRFKWVOYW1lLCBiUHJvdG8pKSB8fA0KKyAgICAgICFwTm9kZS0+R2V0QXR0cmlidXRlKChYRkFfQVRUUklCVVRFKWVOYW1lLCB3c1ZhbHVlLCBGQUxTRSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgd3NWYWx1ZSA9IFhGQV9FeHBvcnRFbmNvZGVBdHRyaWJ1dGUod3NWYWx1ZSk7DQorICB3c091dHB1dCArPSBGWF9XU1RSQyhMIiAiKTsNCisgIHdzT3V0cHV0ICs9IHdzTmFtZTsNCisgIHdzT3V0cHV0ICs9IEZYX1dTVFJDKEwiPVwiIik7DQorICB3c091dHB1dCArPSB3c1ZhbHVlOw0KKyAgd3NPdXRwdXQgKz0gRlhfV1NUUkMoTCJcIiIpOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfRGF0YUV4cG9ydGVyX0F0dHJpYnV0ZVNhdmVJbkRhdGFNb2RlbCgNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBGWF9CT09MIGJTYXZlSW5EYXRhTW9kZWwgPSBGQUxTRTsNCisgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0ltYWdlKSB7DQorICAgIHJldHVybiBiU2F2ZUluRGF0YU1vZGVsOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgaWYgKCFwVmFsdWVOb2RlIHx8IHBWYWx1ZU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9WYWx1ZSkgew0KKyAgICByZXR1cm4gYlNhdmVJbkRhdGFNb2RlbDsNCisgIH0NCisgIENYRkFfTm9kZSogcEZpZWxkTm9kZSA9IHBWYWx1ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgaWYgKHBGaWVsZE5vZGUgJiYgcEZpZWxkTm9kZS0+R2V0QmluZERhdGEoKSAmJg0KKyAgICAgIGVBdHRyaWJ1dGUgPT0gWEZBX0FUVFJJQlVURV9IcmVmKSB7DQorICAgIGJTYXZlSW5EYXRhTW9kZWwgPSBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIGJTYXZlSW5EYXRhTW9kZWw7DQorfQ0KK0ZYX0JPT0wgWEZBX0RhdGFFeHBvcnRlcl9Db250ZW50Tm9kZU5lZWR0b0V4cG9ydChDWEZBX05vZGUqIHBDb250ZW50Tm9kZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgaWYgKCFwQ29udGVudE5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50LCBGQUxTRSwgRkFMU0UpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChwQ29udGVudE5vZGUtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZSk7DQorICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gcENvbnRlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIGlmICghcFBhcmVudE5vZGUgfHwgcFBhcmVudE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9WYWx1ZSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIENYRkFfTm9kZSogcEdyYW5kUGFyZW50Tm9kZSA9IHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIGlmICghcEdyYW5kUGFyZW50Tm9kZSB8fA0KKyAgICAgIHBHcmFuZFBhcmVudE5vZGUtPkdldE9iamVjdFR5cGUoKSAhPSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKHBHcmFuZFBhcmVudE5vZGUtPkdldEJpbmREYXRhKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IHBHcmFuZFBhcmVudE5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSBwV2lkZ2V0RGF0YS0+R2V0VUlUeXBlKCk7DQorICBpZiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9EYXRhRXhwb3J0ZXJfUmVjb2duaXplWEZBVmVyc2lvbk51bWJlcigNCisgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVSb290LA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NWZXJzaW9uTnVtYmVyKSB7DQorICB3c1ZlcnNpb25OdW1iZXIuRW1wdHkoKTsNCisgIGlmICghcFRlbXBsYXRlUm9vdCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RlbXBsYXRlTlM7DQorICBpZiAoIXBUZW1wbGF0ZVJvb3QtPlRyeU5hbWVzcGFjZSh3c1RlbXBsYXRlTlMpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFhGQV9WRVJTSU9OIGVWZXJzaW9uID0NCisgICAgICBwVGVtcGxhdGVSb290LT5HZXREb2N1bWVudCgpLT5SZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKHdzVGVtcGxhdGVOUyk7DQorICBpZiAoZVZlcnNpb24gPT0gWEZBX1ZFUlNJT05fVU5LTk9XTikgew0KKyAgICBlVmVyc2lvbiA9IFhGQV9WRVJTSU9OX0RFRkFVTFQ7DQorICB9DQorICB3c1ZlcnNpb25OdW1iZXIuRm9ybWF0KEwiJWkuJWkiLCBlVmVyc2lvbiAvIDEwMCwgZVZlcnNpb24gJSAxMDApOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9DaGFuZ2VkKA0KKyAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICBDRlhfV2lkZVRleHRCdWYmIGJ1ZiwNCisgICAgRlhfQk9PTCBiU2F2ZVhNTCA9IEZBTFNFKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJzOw0KKyAgaW50MzJfdCBpQXR0cnMgPSAwOw0KKyAgY29uc3QgdWludDhfdCogcEF0dHJzID0gWEZBX0dldEVsZW1lbnRBdHRyaWJ1dGVzKHBOb2RlLT5HZXRDbGFzc0lEKCksIGlBdHRycyk7DQorICB3aGlsZSAoaUF0dHJzLS0pIHsNCisgICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEF0dHIgPQ0KKyAgICAgICAgWEZBX0dldEF0dHJpYnV0ZUJ5SUQoKFhGQV9BVFRSSUJVVEUpcEF0dHJzW2lBdHRyc10pOw0KKyAgICBpZiAocEF0dHItPmVOYW1lID09IFhGQV9BVFRSSUJVVEVfTmFtZSB8fA0KKyAgICAgICAgKFhGQV9EYXRhRXhwb3J0ZXJfQXR0cmlidXRlU2F2ZUluRGF0YU1vZGVsKHBOb2RlLCBwQXR0ci0+ZU5hbWUpICYmDQorICAgICAgICAgIWJTYXZlWE1MKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cjsNCisgICAgWEZBX1NhdmVBdHRyaWJ1dGUocE5vZGUsIHBBdHRyLT5lTmFtZSwgcEF0dHItPnBOYW1lLCBiU2F2ZVhNTCwgd3NBdHRyKTsNCisgICAgd3NBdHRycyArPSB3c0F0dHI7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NoaWxkcmVuOw0KKyAgc3dpdGNoIChwTm9kZS0+R2V0T2JqZWN0VHlwZSgpKSB7DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGU6IHsNCisgICAgICBpZiAoIWJTYXZlWE1MICYmICFYRkFfRGF0YUV4cG9ydGVyX0NvbnRlbnROb2RlTmVlZHRvRXhwb3J0KHBOb2RlKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogcFJhd1ZhbHVlTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgd2hpbGUgKHBSYXdWYWx1ZU5vZGUgJiYNCisgICAgICAgICAgICAgcFJhd1ZhbHVlTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1NoYXJweEhUTUwgJiYNCisgICAgICAgICAgICAgcFJhd1ZhbHVlTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1NoYXJwdGV4dCAmJg0KKyAgICAgICAgICAgICBwUmF3VmFsdWVOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU2hhcnB4bWwpIHsNCisgICAgICAgIHBSYXdWYWx1ZU5vZGUgPSBwUmF3VmFsdWVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoIXBSYXdWYWx1ZU5vZGUpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgIHBOb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgRkFMU0UpOw0KKyAgICAgIGlmIChwUmF3VmFsdWVOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTCAmJg0KKyAgICAgICAgICB3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQorICAgICAgICBJRkRFX1hNTE5vZGUqIHBFeERhdGFYTUwgPSBwTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgIGlmICghcEV4RGF0YVhNTCkgew0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCi0gICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiIHhtbG5zPVwiIiwgRlhTWVNfd2NzbGVuKEwiIHhtbG5zPVwiIikpOw0KLSAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBVUkkgPSBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0Zvcm0pLT5wVVJJOw0KLSAgICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcocFVSSSwgRlhTWVNfd2NzbGVuKHBVUkkpKTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmVyc2lvbk51bWJlcjsNCi0gICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVjb2duaXplWEZBVmVyc2lvbk51bWJlcigoQ1hGQV9Ob2RlKilwTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZShYRkFfWERQUEFDS0VUX1RlbXBsYXRlKSwgd3NWZXJzaW9uTnVtYmVyKTsNCi0gICAgICAgIGlmICh3c1ZlcnNpb25OdW1iZXIuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgd3NWZXJzaW9uTnVtYmVyID0gRlhfV1NUUkMoTCIyLjgiKTsNCisgICAgICAgIElGREVfWE1MTm9kZSogcFJpY2hUZXh0WE1MID0NCisgICAgICAgICAgICBwRXhEYXRhWE1MLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICAgaWYgKCFwUmljaFRleHRYTUwpIHsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQotICAgICAgICB3c1ZlcnNpb25OdW1iZXIgKz0gRlhfV1NUUkMoTCIvXCJcbj4iKTsNCi0gICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKChjb25zdCBGWF9XQ0hBUiopd3NWZXJzaW9uTnVtYmVyLCB3c1ZlcnNpb25OdW1iZXIuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgSUZYX01lbW9yeVN0cmVhbSogcE1lbVN0cmVhbSA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShUUlVFKTsNCisgICAgICAgIElGWF9TdHJlYW0qIHBUZW1wU3RyZWFtID0gSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKA0KKyAgICAgICAgICAgIChJRlhfRmlsZVdyaXRlKilwTWVtU3RyZWFtLCBGWF9TVFJFQU1BQ0NFU1NfVGV4dCB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCk7DQorICAgICAgICBwVGVtcFN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7DQorICAgICAgICBwUmljaFRleHRYTUwtPlNhdmVYTUxOb2RlKHBUZW1wU3RyZWFtKTsNCisgICAgICAgIHdzQ2hpbGRyZW4gKz0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KA0KKyAgICAgICAgICAgIChjb25zdCBGWF9DSEFSKilwTWVtU3RyZWFtLT5HZXRCdWZmZXIoKSwgcE1lbVN0cmVhbS0+R2V0U2l6ZSgpKTsNCisgICAgICAgIHBUZW1wU3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgICBwTWVtU3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgfSBlbHNlIGlmIChwUmF3VmFsdWVOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU2hhcnB4bWwgJiYNCisgICAgICAgICAgICAgICAgIHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSYXdWYWx1ZTsNCisgICAgICAgIHBSYXdWYWx1ZU5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1Jhd1ZhbHVlLCBGQUxTRSk7DQorICAgICAgICBpZiAod3NSYXdWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzU2VsVGV4dEFycmF5Ow0KKyAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwOw0KKyAgICAgICAgaW50MzJfdCBpRW5kID0gd3NSYXdWYWx1ZS5GaW5kKEwnXG4nLCBpU3RhcnQpOw0KKyAgICAgICAgaUVuZCA9IChpRW5kID09IC0xKSA/IHdzUmF3VmFsdWUuR2V0TGVuZ3RoKCkgOiBpRW5kOw0KKyAgICAgICAgd2hpbGUgKGlFbmQgPj0gaVN0YXJ0KSB7DQorICAgICAgICAgIHdzU2VsVGV4dEFycmF5LkFkZCh3c1Jhd1ZhbHVlLk1pZChpU3RhcnQsIGlFbmQgLSBpU3RhcnQpKTsNCisgICAgICAgICAgaVN0YXJ0ID0gaUVuZCArIDE7DQorICAgICAgICAgIGlmIChpU3RhcnQgPj0gd3NSYXdWYWx1ZS5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlFbmQgPSB3c1Jhd1ZhbHVlLkZpbmQoTCdcbicsIGlTdGFydCk7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBQYXJlbnROb2RlKTsNCisgICAgICAgIENYRkFfTm9kZSogcEdyYW5kcGFyZW50Tm9kZSA9DQorICAgICAgICAgICAgcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBHcmFuZHBhcmVudE5vZGUpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgYm9keVRhZ05hbWU7DQorICAgICAgICBib2R5VGFnTmFtZSA9IHBHcmFuZHBhcmVudE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgICAgICBpZiAoYm9keVRhZ05hbWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGJvZHlUYWdOYW1lID0gRlhfV1NUUkMoTCJMaXN0Qm94MSIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiPCIpOw0KKyAgICAgICAgYnVmIDw8IGJvZHlUYWdOYW1lOw0KKyAgICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiIHhtbG5zPVwiXCJcbj4iKTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHdzU2VsVGV4dEFycmF5LkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIjx2YWx1ZVxuPiIpOw0KKyAgICAgICAgICBidWYgPDwgWEZBX0V4cG9ydEVuY29kZUNvbnRlbnQod3NTZWxUZXh0QXJyYXlbaV0pOw0KKyAgICAgICAgICBidWYgPDwgRlhfV1NUUkMoTCI8L3ZhbHVlXG4+Iik7DQorICAgICAgICB9DQorICAgICAgICBidWYgPDwgRlhfV1NUUkMoTCI8LyIpOw0KKyAgICAgICAgYnVmIDw8IGJvZHlUYWdOYW1lOw0KKyAgICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiXG4+Iik7DQorICAgICAgICB3c0NoaWxkcmVuICs9IGJ1Zi5HZXRXaWRlU3RyaW5nKCk7DQorICAgICAgICBidWYuQ2xlYXIoKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWUgPSBwUmF3VmFsdWVOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlKTsNCisgICAgICAgIHdzQ2hpbGRyZW4gKz0gWEZBX0V4cG9ydEVuY29kZUNvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlOg0KKyAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVDOg0KKyAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVWOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWUgPSBwTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSk7DQorICAgICAgd3NDaGlsZHJlbiArPSBYRkFfRXhwb3J0RW5jb2RlQ29udGVudCh3c1ZhbHVlKTsNCisgICAgfSBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlID0gcE5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgICAgICAgaWYgKCFwVGVtcGxhdGVOb2RlIHx8DQorICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9VTktOT1dOKSAhPQ0KKyAgICAgICAgICAgICAgICBwTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9VTktOT1dOKSkgew0KKyAgICAgICAgICBiU2F2ZVhNTCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlVGV4dEJ1ZiBuZXdCdWY7DQorICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICB3aGlsZSAocENoaWxkTm9kZSkgew0KKyAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGVfQ2hhbmdlZChwQ2hpbGROb2RlLCBuZXdCdWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTYXZlWE1MKTsNCisgICAgICAgIHdzQ2hpbGRyZW4gKz0gbmV3QnVmLkdldFdpZGVTdHJpbmcoKTsNCisgICAgICAgIG5ld0J1Zi5DbGVhcigpOw0KKyAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgfQ0KKyAgICAgIGlmICghYlNhdmVYTUwgJiYgIXdzQ2hpbGRyZW4uSXNFbXB0eSgpICYmDQorICAgICAgICAgIHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCisgICAgICAgIHdzQ2hpbGRyZW4uRW1wdHkoKTsNCisgICAgICAgIGJTYXZlWE1MID0gVFJVRTsNCiAgICAgICAgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQogICAgICAgICB3aGlsZSAocENoaWxkTm9kZSkgew0KLSAgICAgICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlX0NvbnRhaW5lcihwQ2hpbGROb2RlLCBwU3RyZWFtKTsNCi0gICAgICAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGVfQ2hhbmdlZChwQ2hpbGROb2RlLCBuZXdCdWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNhdmVYTUwpOw0KKyAgICAgICAgICB3c0NoaWxkcmVuICs9IG5ld0J1Zi5HZXRXaWRlU3RyaW5nKCk7DQorICAgICAgICAgIG5ld0J1Zi5DbGVhcigpOw0KKyAgICAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCiAgICAgICAgIH0NCi0gICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHNfcHdzQ2xvc2UsIEZYU1lTX3djc2xlbihzX3B3c0Nsb3NlKSk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKCF3c0NoaWxkcmVuLklzRW1wdHkoKSB8fCAhd3NBdHRycy5Jc0VtcHR5KCkgfHwNCisgICAgICBwTm9kZS0+SGFzQXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSkpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzRWxlbWVudDsNCisgICAgcE5vZGUtPkdldENsYXNzTmFtZSh3c0VsZW1lbnQpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICAgIFhGQV9TYXZlQXR0cmlidXRlKHBOb2RlLCBYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwibmFtZSIpLCBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgICB3c05hbWUpOw0KKyAgICBidWYgPDwgRlhfV1NUUkMoTCI8Iik7DQorICAgIGJ1ZiA8PCB3c0VsZW1lbnQ7DQorICAgIGJ1ZiA8PCB3c05hbWU7DQorICAgIGJ1ZiA8PCB3c0F0dHJzOw0KKyAgICBpZiAod3NDaGlsZHJlbi5Jc0VtcHR5KCkpIHsNCisgICAgICBidWYgPDwgRlhfV1NUUkMoTCJcbi8+Iik7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9Db250YWluZXIocE5vZGUsIHBTdHJlYW0sIGJTYXZlWE1MKTsNCisgICAgICBidWYgPDwgRlhfV1NUUkMoTCJcbj4iKTsNCisgICAgICBidWYgPDwgd3NDaGlsZHJlbjsNCisgICAgICBidWYgPDwgRlhfV1NUUkMoTCI8LyIpOw0KKyAgICAgIGJ1ZiA8PCB3c0VsZW1lbnQ7DQorICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiXG4+Iik7DQogICAgIH0NCisgIH0NCiB9DQotSVhGQV9QYWNrZXRFeHBvcnQqIElYRkFfUGFja2V0RXhwb3J0OjpDcmVhdGUoQ1hGQV9Eb2N1bWVudCAqcERvY3VtZW50LCBYRkFfREFUQUZPUk1BVCBlRm9ybWF0ICkNCi17DQotICAgIHJldHVybiBGWF9ORVcgQ1hGQV9EYXRhRXhwb3J0ZXIocERvY3VtZW50KTsNCi19DQotQ1hGQV9EYXRhRXhwb3J0ZXI6OkNYRkFfRGF0YUV4cG9ydGVyKENYRkFfRG9jdW1lbnQgKnBEb2N1bWVudCkNCi0gICAgOiBtX3BEb2N1bWVudChwRG9jdW1lbnQpDQotew0KLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9EYXRhRXhwb3J0ZXI6OkV4cG9ydChJRlhfRmlsZVdyaXRlICpwV3JpdGUpDQotew0KLSAgICByZXR1cm4gRXhwb3J0KHBXcml0ZSwgbV9wRG9jdW1lbnQtPkdldFJvb3QoKSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9EYXRhRXhwb3J0ZXI6OkV4cG9ydChJRlhfRmlsZVdyaXRlICpwV3JpdGUsIENYRkFfTm9kZSAqcE5vZGUsIEZYX0RXT1JEIGR3RmxhZyAsIGNvbnN0IEZYX0NIQVIqIHBDaGVja3N1bSApDQotew0KLSAgICBBU1NFUlQocFdyaXRlICE9IE5VTEwpOw0KLSAgICBpZiAocFdyaXRlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCitzdGF0aWMgdm9pZCBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9Db250YWluZXIoDQorICAgIENYRkFfTm9kZSogcE5vZGUsDQorICAgIElGWF9TdHJlYW0qIHBTdHJlYW0sDQorICAgIEZYX0JPT0wgYlNhdmVYTUwgPSBGQUxTRSkgew0KKyAgWEZBX0VMRU1FTlQgZUVsZW1lbnQgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGVFbGVtZW50ID09IFhGQV9FTEVNRU5UX0ZpZWxkIHx8IGVFbGVtZW50ID09IFhGQV9FTEVNRU5UX0RyYXcgfHwNCisgICAgICAhcE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7DQorICAgIENGWF9XaWRlVGV4dEJ1ZiBidWY7DQorICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlX0NoYW5nZWQocE5vZGUsIGJ1ZiwgYlNhdmVYTUwpOw0KKyAgICBGWF9TVFJTSVpFIG5MZW4gPSBidWYuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChuTGVuID4gMCkgew0KKyAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKChjb25zdCBGWF9XQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBuTGVuKTsNCiAgICAgfQ0KLSAgICBJRlhfU3RyZWFtICpwU3RyZWFtID0gSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKHBXcml0ZSwgRlhfU1RSRUFNQUNDRVNTX1RleHQgfCBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUgfCBGWF9TVFJFQU1BQ0NFU1NfQXBwZW5kKTsNCi0gICAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NFbGVtZW50Ow0KKyAgcE5vZGUtPkdldENsYXNzTmFtZSh3c0VsZW1lbnQpOw0KKyAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCI8IiwgMSk7DQorICBwU3RyZWFtLT5Xcml0ZVN0cmluZyh3c0VsZW1lbnQuR2V0UHRyKCksIHdzRWxlbWVudC5HZXRMZW5ndGgoKSk7DQorICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsNCisgIFhGQV9TYXZlQXR0cmlidXRlKHBOb2RlLCBYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwibmFtZSIpLCBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyczsNCisgIGludDMyX3QgaUF0dHJzID0gMDsNCisgIGNvbnN0IHVpbnQ4X3QqIHBBdHRycyA9IFhGQV9HZXRFbGVtZW50QXR0cmlidXRlcyhwTm9kZS0+R2V0Q2xhc3NJRCgpLCBpQXR0cnMpOw0KKyAgd2hpbGUgKGlBdHRycy0tKSB7DQorICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBBdHRyID0NCisgICAgICAgIFhGQV9HZXRBdHRyaWJ1dGVCeUlEKChYRkFfQVRUUklCVVRFKXBBdHRyc1tpQXR0cnNdKTsNCisgICAgaWYgKHBBdHRyLT5lTmFtZSA9PSBYRkFfQVRUUklCVVRFX05hbWUpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBwU3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsNCi0gICAgRlhfQk9PTCBiUmV0ID0gRXhwb3J0KHBTdHJlYW0sIHBOb2RlLCBkd0ZsYWcsIHBDaGVja3N1bSk7DQotICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cjsNCisgICAgWEZBX1NhdmVBdHRyaWJ1dGUocE5vZGUsIHBBdHRyLT5lTmFtZSwgcEF0dHItPnBOYW1lLCBGQUxTRSwgd3NBdHRyKTsNCisgICAgd3NPdXRwdXQgKz0gd3NBdHRyOw0KKyAgfQ0KKyAgaWYgKCF3c091dHB1dC5Jc0VtcHR5KCkpIHsNCisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoKGNvbnN0IEZYX1dDSEFSKil3c091dHB1dCwgd3NPdXRwdXQuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGlmIChwQ2hpbGROb2RlKSB7DQorICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiXG4+IiwgMik7DQorICAgIHdoaWxlIChwQ2hpbGROb2RlKSB7DQorICAgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGVfQ29udGFpbmVyKHBDaGlsZE5vZGUsIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTYXZlWE1MKTsNCisgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIjwvIiwgMik7DQorICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHdzRWxlbWVudC5HZXRQdHIoKSwgd3NFbGVtZW50LkdldExlbmd0aCgpKTsNCisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCJcbj4iLCAyKTsNCisgIH0gZWxzZSB7DQorICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiXG4vPiIsIDMpOw0KKyAgfQ0KIH0NCi1GWF9CT09MIENYRkFfRGF0YUV4cG9ydGVyOjpFeHBvcnQoSUZYX1N0cmVhbSAqcFN0cmVhbSwgQ1hGQV9Ob2RlICpwTm9kZSwgRlhfRFdPUkQgZHdGbGFnLCBjb25zdCBGWF9DSEFSKiBwQ2hlY2tzdW0pDQotew0KLSAgICBJRkRFX1hNTERvYyogcFhNTERvYyA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0WE1MRG9jKCk7DQotICAgIGlmKHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlKSB7DQotICAgICAgICBzd2l0Y2ggKHBOb2RlLT5HZXRQYWNrZXRJRCgpKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX1hEUDogew0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBzX3B3c1ByZWFtYmxlID0gTCI8eGRwOnhkcCB4bWxuczp4ZHA9XCJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC9cIj4iOw0KLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoc19wd3NQcmVhbWJsZSwgRlhTWVNfd2NzbGVuKHNfcHdzUHJlYW1ibGUpKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihDWEZBX05vZGUgKnBDaGlsZCA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRXhwb3J0KHBTdHJlYW0sIHBDaGlsZCwgZHdGbGFnLCBwQ2hlY2tzdW0pOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBzX3B3c1Bvc3RhbWJsZSA9IEwiPC94ZHA6eGRwXG4+IjsNCi0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHNfcHdzUG9zdGFtYmxlLCBGWFNZU193Y3NsZW4oc19wd3NQb3N0YW1ibGUpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfRGF0YXNldHM6IHsNCi0gICAgICAgICAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwRWxlbWVudCB8fCBwRWxlbWVudC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBEYXRhTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocERhdGFOb2RlICE9IE5VTEwpOw0KLSAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUocERhdGFOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIHBYTUxEb2MtPlNhdmVYTUxOb2RlKHBTdHJlYW0sIHBFbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfRm9ybTogew0KLSAgICAgICAgICAgICAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGUocE5vZGUsIHBTdHJlYW0sIHBDaGVja3N1bSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlOg0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwRWxlbWVudCB8fCBwRWxlbWVudC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwWE1MRG9jLT5TYXZlWE1MTm9kZShwU3RyZWFtLCBwRWxlbWVudCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQordm9pZCBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZShDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBDaGVja3N1bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVYTUwpIHsNCisgIGlmIChwTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZSkgew0KKyAgICBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIHNfcHdzVGFnTmFtZSA9IEwiPGZvcm0iOw0KKyAgICBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIHNfcHdzQ2xvc2UgPSBMIjwvZm9ybVxuPiI7DQorICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHNfcHdzVGFnTmFtZSwgRlhTWVNfd2NzbGVuKHNfcHdzVGFnTmFtZSkpOw0KKyAgICBpZiAocENoZWNrc3VtICE9IE5VTEwpIHsNCisgICAgICBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIHNfcHdDaGVja3N1bSA9IEwiIGNoZWNrc3VtPVwiIjsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoZWNrc3VtID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHBDaGVja3N1bSwgRlhTWVNfc3RybGVuKHBDaGVja3N1bSkpOw0KKyAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHNfcHdDaGVja3N1bSwgRlhTWVNfd2NzbGVuKHNfcHdDaGVja3N1bSkpOw0KKyAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKChjb25zdCBGWF9XQ0hBUiopd3NDaGVja3N1bSwgd3NDaGVja3N1bS5HZXRMZW5ndGgoKSk7DQorICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCJcIiIsIDEpOw0KKyAgICB9DQorICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiIHhtbG5zPVwiIiwgRlhTWVNfd2NzbGVuKEwiIHhtbG5zPVwiIikpOw0KKyAgICBjb25zdCBGWF9XQ0hBUiogcFVSSSA9IFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRm9ybSktPnBVUkk7DQorICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHBVUkksIEZYU1lTX3djc2xlbihwVVJJKSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmVyc2lvbk51bWJlcjsNCisgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKA0KKyAgICAgICAgKENYRkFfTm9kZSopcE5vZGUtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSksDQorICAgICAgICB3c1ZlcnNpb25OdW1iZXIpOw0KKyAgICBpZiAod3NWZXJzaW9uTnVtYmVyLklzRW1wdHkoKSkgew0KKyAgICAgIHdzVmVyc2lvbk51bWJlciA9IEZYX1dTVFJDKEwiMi44Iik7DQorICAgIH0NCisgICAgd3NWZXJzaW9uTnVtYmVyICs9IEZYX1dTVFJDKEwiL1wiXG4+Iik7DQorICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKChjb25zdCBGWF9XQ0hBUiopd3NWZXJzaW9uTnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICB3c1ZlcnNpb25OdW1iZXIuR2V0TGVuZ3RoKCkpOw0KKyAgICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICB3aGlsZSAocENoaWxkTm9kZSkgew0KKyAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlX0NvbnRhaW5lcihwQ2hpbGROb2RlLCBwU3RyZWFtKTsNCisgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhzX3B3c0Nsb3NlLCBGWFNZU193Y3NsZW4oc19wd3NDbG9zZSkpOw0KKyAgfSBlbHNlIHsNCisgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGVfQ29udGFpbmVyKHBOb2RlLCBwU3RyZWFtLCBiU2F2ZVhNTCk7DQorICB9DQorfQ0KK0lYRkFfUGFja2V0RXhwb3J0KiBJWEZBX1BhY2tldEV4cG9ydDo6Q3JlYXRlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfREFUQUZPUk1BVCBlRm9ybWF0KSB7DQorICByZXR1cm4gRlhfTkVXIENYRkFfRGF0YUV4cG9ydGVyKHBEb2N1bWVudCk7DQorfQ0KK0NYRkFfRGF0YUV4cG9ydGVyOjpDWEZBX0RhdGFFeHBvcnRlcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQorICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KSB7DQorICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9EYXRhRXhwb3J0ZXI6OkV4cG9ydChJRlhfRmlsZVdyaXRlKiBwV3JpdGUpIHsNCisgIHJldHVybiBFeHBvcnQocFdyaXRlLCBtX3BEb2N1bWVudC0+R2V0Um9vdCgpKTsNCit9DQorRlhfQk9PTCBDWEZBX0RhdGFFeHBvcnRlcjo6RXhwb3J0KElGWF9GaWxlV3JpdGUqIHBXcml0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBwQ2hlY2tzdW0pIHsNCisgIEFTU0VSVChwV3JpdGUgIT0gTlVMTCk7DQorICBpZiAocFdyaXRlID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSUZYX1N0cmVhbSogcFN0cmVhbSA9IElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbSgNCisgICAgICBwV3JpdGUsDQorICAgICAgRlhfU1RSRUFNQUNDRVNTX1RleHQgfCBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUgfCBGWF9TVFJFQU1BQ0NFU1NfQXBwZW5kKTsNCisgIGlmIChwU3RyZWFtID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcFN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7DQorICBGWF9CT09MIGJSZXQgPSBFeHBvcnQocFN0cmVhbSwgcE5vZGUsIGR3RmxhZywgcENoZWNrc3VtKTsNCisgIHBTdHJlYW0tPlJlbGVhc2UoKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENYRkFfRGF0YUV4cG9ydGVyOjpFeHBvcnQoSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBwQ2hlY2tzdW0pIHsNCisgIElGREVfWE1MRG9jKiBwWE1MRG9jID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRYTUxEb2MoKTsNCisgIGlmIChwTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZSkgew0KKyAgICBzd2l0Y2ggKHBOb2RlLT5HZXRQYWNrZXRJRCgpKSB7DQorICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX1hEUDogew0KKyAgICAgICAgc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBzX3B3c1ByZWFtYmxlID0NCisgICAgICAgICAgICBMIjx4ZHA6eGRwIHhtbG5zOnhkcD1cImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwL1wiPiI7DQorICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhzX3B3c1ByZWFtYmxlLCBGWFNZU193Y3NsZW4oc19wd3NQcmVhbWJsZSkpOw0KKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZCA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgIHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgIEV4cG9ydChwU3RyZWFtLCBwQ2hpbGQsIGR3RmxhZywgcENoZWNrc3VtKTsNCiAgICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwRXhwb3J0Tm9kZSA9IHBOb2RlOw0KLSAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwRGF0YU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcENoaWxkTm9kZTsgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICBpZiAocENoaWxkTm9kZSAhPSBwTm9kZSkgew0KLSAgICAgICAgICAgICAgICBwRXhwb3J0Tm9kZSA9IHBEYXRhTm9kZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBzX3B3c1Bvc3RhbWJsZSA9IEwiPC94ZHA6eGRwXG4+IjsNCisgICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHNfcHdzUG9zdGFtYmxlLCBGWFNZU193Y3NsZW4oc19wd3NQb3N0YW1ibGUpKTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czogew0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9DQorICAgICAgICAgICAgKElGREVfWE1MRWxlbWVudCopcE5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICBpZiAoIXBFbGVtZW50IHx8IHBFbGVtZW50LT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQogICAgICAgICB9DQotICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcEV4cG9ydE5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQotICAgICAgICBpZighcEVsZW1lbnQgfHwgcEVsZW1lbnQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUocEV4cG9ydE5vZGUpOw0KLSAgICAgICAgcEVsZW1lbnQtPlNldFN0cmluZyhGWF9XU1RSQyhMInhtbG5zOnhmYSIpLCBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyIpKTsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwRGF0YU5vZGUgIT0gTlVMTCk7DQorICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX0RlYWxXaXRoRGF0YUdyb3VwTm9kZShwRGF0YU5vZGUpOw0KICAgICAgICAgcFhNTERvYy0+U2F2ZVhNTE5vZGUocFN0cmVhbSwgcEVsZW1lbnQpOw0KLSAgICAgICAgcEVsZW1lbnQtPlJlbW92ZUF0dHJpYnV0ZShMInhtbG5zOnhmYSIpOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1zdGF0aWMgdm9pZCBYRkFfRGF0YUV4cG9ydGVyX0dlbmVyYXRlQ2hlY2tzdW0oQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfV2lkZVN0cmluZyYgd3NDaGVja3N1bSkNCi17DQotfQ0KLXZvaWQgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUoQ1hGQV9Ob2RlICpwRGF0YU5vZGUpDQotew0KLSAgICBpZiAoIXBEYXRhTm9kZSB8fCBwRGF0YU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDaGlsZE51bSA9IDA7DQotICAgIGZvciAoQ1hGQV9Ob2RlICpwQ2hpbGROb2RlID0gcERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDaGlsZE5vZGU7IHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpQ2hpbGROdW0rKzsNCi0gICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfRGVhbFdpdGhEYXRhR3JvdXBOb2RlKHBDaGlsZE5vZGUpOw0KLSAgICB9DQotICAgIGlmIChwRGF0YU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EYXRhR3JvdXApIHsNCi0gICAgICAgIGlmIChpQ2hpbGROdW0gPiAwKSB7DQotICAgICAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MTm9kZSA9IHBEYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCi0gICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKnBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCAqKXBYTUxOb2RlOw0KLSAgICAgICAgICAgIGlmIChwWE1MRWxlbWVudC0+SGFzQXR0cmlidXRlKEwieGZhOmRhdGFOb2RlIikpIHsNCi0gICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQtPlJlbW92ZUF0dHJpYnV0ZShMInhmYTpkYXRhTm9kZSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MTm9kZSA9IHBEYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCi0gICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCAqKXBYTUxOb2RlKS0+U2V0U3RyaW5nKEZYX1dTVFJDKEwieGZhOmRhdGFOb2RlIiksIEZYX1dTVFJDKEwiZGF0YUdyb3VwIikpOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX0Zvcm06IHsNCisgICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlKHBOb2RlLCBwU3RyZWFtLCBwQ2hlY2tzdW0pOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlOg0KKyAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPQ0KKyAgICAgICAgICAgIChJRkRFX1hNTEVsZW1lbnQqKXBOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgaWYgKCFwRWxlbWVudCB8fCBwRWxlbWVudC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICAgICAgfQ0KKyAgICAgICAgcFhNTERvYy0+U2F2ZVhNTE5vZGUocFN0cmVhbSwgcEVsZW1lbnQpOw0KKyAgICAgIH0gYnJlYWs7DQogICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICBDWEZBX05vZGUqIHBFeHBvcnROb2RlID0gcE5vZGU7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0NCisgICAgICAgICAgICAgcERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgcENoaWxkTm9kZTsNCisgICAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIGlmIChwQ2hpbGROb2RlICE9IHBOb2RlKSB7DQorICAgICAgICBwRXhwb3J0Tm9kZSA9IHBEYXRhTm9kZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0NCisgICAgICAgIChJRkRFX1hNTEVsZW1lbnQqKXBFeHBvcnROb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBpZiAoIXBFbGVtZW50IHx8IHBFbGVtZW50LT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBYRkFfRGF0YUV4cG9ydGVyX0RlYWxXaXRoRGF0YUdyb3VwTm9kZShwRXhwb3J0Tm9kZSk7DQorICAgIHBFbGVtZW50LT5TZXRTdHJpbmcoRlhfV1NUUkMoTCJ4bWxuczp4ZmEiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyIpKTsNCisgICAgcFhNTERvYy0+U2F2ZVhNTE5vZGUocFN0cmVhbSwgcEVsZW1lbnQpOw0KKyAgICBwRWxlbWVudC0+UmVtb3ZlQXR0cmlidXRlKEwieG1sbnM6eGZhIik7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0RhdGFFeHBvcnRlcl9HZW5lcmF0ZUNoZWNrc3VtKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2hlY2tzdW0pIHt9DQordm9pZCBYRkFfRGF0YUV4cG9ydGVyX0RlYWxXaXRoRGF0YUdyb3VwTm9kZShDWEZBX05vZGUqIHBEYXRhTm9kZSkgew0KKyAgaWYgKCFwRGF0YU5vZGUgfHwgcERhdGFOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUNoaWxkTnVtID0gMDsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgIHBDaGlsZE5vZGU7DQorICAgICAgIHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlDaGlsZE51bSsrOw0KKyAgICBYRkFfRGF0YUV4cG9ydGVyX0RlYWxXaXRoRGF0YUdyb3VwTm9kZShwQ2hpbGROb2RlKTsNCisgIH0NCisgIGlmIChwRGF0YU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EYXRhR3JvdXApIHsNCisgICAgaWYgKGlDaGlsZE51bSA+IDApIHsNCisgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gcERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgIEZYU1lTX2Fzc2VydChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpOw0KKyAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZTsNCisgICAgICBpZiAocFhNTEVsZW1lbnQtPkhhc0F0dHJpYnV0ZShMInhmYTpkYXRhTm9kZSIpKSB7DQorICAgICAgICBwWE1MRWxlbWVudC0+UmVtb3ZlQXR0cmlidXRlKEwieGZhOmRhdGFOb2RlIik7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBwRGF0YU5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7DQorICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlKQ0KKyAgICAgICAgICAtPlNldFN0cmluZyhGWF9XU1RSQyhMInhmYTpkYXRhTm9kZSIpLCBGWF9XU1RSQyhMImRhdGFHcm91cCIpKTsNCisgICAgfQ0KKyAgfQ0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfc2VyaWFsaXplLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfc2VyaWFsaXplLmgKaW5kZXggZTJhM2NlNi4uNDM2ZTVmNSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X3NlcmlhbGl6ZS5oCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9zZXJpYWxpemUuaApAQCAtNiwzMCArNiwzMCBAQAogDQogI2lmbmRlZiBfWEZBX0RPQ1VNRU5UX1NFUklBTElaRV9IXw0KICNkZWZpbmUgX1hGQV9ET0NVTUVOVF9TRVJJQUxJWkVfSF8NCi1jbGFzcyBDWEZBX0RhdGFJbXBvcnRlciA6IHB1YmxpYyBJWEZBX1BhY2tldEltcG9ydA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRGF0YUltcG9ydGVyKENYRkFfRG9jdW1lbnQgKnBEb2N1bWVudCk7DQotICAgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUltcG9ydERhdGEoSUZYX0ZpbGVSZWFkKiBwRGF0YURvY3VtZW50KTsNCi1wcm90ZWN0ZWQ6DQotICAgIENYRkFfRG9jdW1lbnQJCQkJKm1fcERvY3VtZW50Ow0KK2NsYXNzIENYRkFfRGF0YUltcG9ydGVyIDogcHVibGljIElYRkFfUGFja2V0SW1wb3J0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9EYXRhSW1wb3J0ZXIoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEltcG9ydERhdGEoSUZYX0ZpbGVSZWFkKiBwRGF0YURvY3VtZW50KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7DQogfTsNCi1jbGFzcyBDWEZBX0RhdGFFeHBvcnRlciA6IHB1YmxpYyBJWEZBX1BhY2tldEV4cG9ydA0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfRGF0YUV4cG9ydGVyKENYRkFfRG9jdW1lbnQgKnBEb2N1bWVudCk7DQotICAgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUV4cG9ydChJRlhfRmlsZVdyaXRlICpwV3JpdGUpOw0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRXhwb3J0KElGWF9GaWxlV3JpdGUgKnBXcml0ZSwgQ1hGQV9Ob2RlICpwTm9kZSwgRlhfRFdPUkQgZHdGbGFnID0gMCwgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtID0gTlVMTCk7DQotcHJvdGVjdGVkOg0KLSAgICBGWF9CT09MCQkJCQkJRXhwb3J0KElGWF9TdHJlYW0gKnBTdHJlYW0sIENYRkFfTm9kZSAqcE5vZGUsIEZYX0RXT1JEIGR3RmxhZywgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtKTsNCi0gICAgQ1hGQV9Eb2N1bWVudAkJCQkqbV9wRG9jdW1lbnQ7DQorY2xhc3MgQ1hGQV9EYXRhRXhwb3J0ZXIgOiBwdWJsaWMgSVhGQV9QYWNrZXRFeHBvcnQgew0KKyBwdWJsaWM6DQorICBDWEZBX0RhdGFFeHBvcnRlcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgRXhwb3J0KElGWF9GaWxlV3JpdGUqIHBXcml0ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRXhwb3J0KElGWF9GaWxlV3JpdGUqIHBXcml0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtID0gTlVMTCk7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0JPT0wgRXhwb3J0KElGWF9TdHJlYW0qIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtKTsNCisgIENYRkFfRG9jdW1lbnQqIG1fcERvY3VtZW50Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfYXBwYWRhcHRlci5jcHAKaW5kZXggYjI3NmFiYy4uZjJkZDg0OCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuY3BwCkBAIC0yMCwxNjEgKzIwLDE2MyBAQAogI2luY2x1ZGUgInhmYV9sYXlvdXRfaXRlbWxheW91dC5oIg0KICNpbmNsdWRlICJ4ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmgiDQogI2luY2x1ZGUgInhmYV9sYXlvdXRfYXBwYWRhcHRlci5oIg0KLUlYRkFfRG9jTGF5b3V0KiBJWEZBX0xheW91dFBhZ2U6OkdldExheW91dCgpIGNvbnN0DQotew0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKil0aGlzOw0KLSAgICByZXR1cm4gcFRoaXMtPm1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpLT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCitJWEZBX0RvY0xheW91dCogSVhGQV9MYXlvdXRQYWdlOjpHZXRMYXlvdXQoKSBjb25zdCB7DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgcmV0dXJuIHBUaGlzLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0TGF5b3V0UHJvY2Vzc29yKCk7DQogfQ0KLWludDMyX3QgSVhGQV9MYXlvdXRQYWdlOjpHZXRQYWdlSW5kZXgoKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFRoaXMgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopdGhpczsNCi0gICAgcmV0dXJuIHBUaGlzLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0TGF5b3V0UHJvY2Vzc29yKCktPkdldExheW91dFBhZ2VNZ3IoKS0+R2V0UGFnZUluZGV4KChJWEZBX0xheW91dFBhZ2UqKXRoaXMpOw0KK2ludDMyX3QgSVhGQV9MYXlvdXRQYWdlOjpHZXRQYWdlSW5kZXgoKSBjb25zdCB7DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgcmV0dXJuIHBUaGlzLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKQ0KKyAgICAgIC0+R2V0TGF5b3V0UHJvY2Vzc29yKCkNCisgICAgICAtPkdldExheW91dFBhZ2VNZ3IoKQ0KKyAgICAgIC0+R2V0UGFnZUluZGV4KChJWEZBX0xheW91dFBhZ2UqKXRoaXMpOw0KIH0NCi12b2lkIElYRkFfTGF5b3V0UGFnZTo6R2V0UGFnZVNpemUoQ0ZYX1NpemVGICZzaXplKQ0KLXsNCi0gICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFRoaXMgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopdGhpczsNCi0gICAgc2l6ZS5TZXQoMCwgMCk7DQotICAgIENYRkFfTm9kZSAqcE1lZGl1bSA9IHBUaGlzLT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWVkaXVtKTsNCi0gICAgaWYgKHBNZWRpdW0pIHsNCi0gICAgICAgIHNpemUueCA9IHBNZWRpdW0tPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9TaG9ydCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgIHNpemUueSA9IHBNZWRpdW0tPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Mb25nKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgaWYgKHBNZWRpdW0tPkdldEVudW0oWEZBX0FUVFJJQlVURV9PcmllbnRhdGlvbikgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGFuZHNjYXBlKSB7DQotICAgICAgICAgICAgc2l6ZS5TZXQoc2l6ZS55LCBzaXplLngpOw0KK3ZvaWQgSVhGQV9MYXlvdXRQYWdlOjpHZXRQYWdlU2l6ZShDRlhfU2l6ZUYmIHNpemUpIHsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXRoaXM7DQorICBzaXplLlNldCgwLCAwKTsNCisgIENYRkFfTm9kZSogcE1lZGl1bSA9DQorICAgICAgcFRoaXMtPm1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NZWRpdW0pOw0KKyAgaWYgKHBNZWRpdW0pIHsNCisgICAgc2l6ZS54ID0gcE1lZGl1bS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1Nob3J0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBzaXplLnkgPSBwTWVkaXVtLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTG9uZykuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgaWYgKHBNZWRpdW0tPkdldEVudW0oWEZBX0FUVFJJQlVURV9PcmllbnRhdGlvbikgPT0NCisgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0xhbmRzY2FwZSkgew0KKyAgICAgIHNpemUuU2V0KHNpemUueSwgc2l6ZS54KTsNCisgICAgfQ0KKyAgfQ0KK30NCitDWEZBX05vZGUqIElYRkFfTGF5b3V0UGFnZTo6R2V0TWFzdGVyUGFnZSgpIGNvbnN0IHsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXRoaXM7DQorICByZXR1cm4gcFRoaXMtPm1fcEZvcm1Ob2RlOw0KK30NCitJWEZBX0xheW91dFBhZ2UqIENYRkFfTGF5b3V0SXRlbTo6R2V0UGFnZSgpIGNvbnN0IHsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXRoaXM7DQorICBmb3IgKENYRkFfTGF5b3V0SXRlbUltcGwqIHBDdXJOb2RlID0gcFRoaXM7IHBDdXJOb2RlOw0KKyAgICAgICBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5tX3BQYXJlbnQpIHsNCisgICAgaWYgKHBDdXJOb2RlLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgcmV0dXJuIChJWEZBX0xheW91dFBhZ2UqKXBDdXJOb2RlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0xheW91dEl0ZW06OkdldEZvcm1Ob2RlKCkgY29uc3Qgew0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgcmV0dXJuIHBUaGlzLT5tX3BGb3JtTm9kZTsNCit9DQordm9pZCBDWEZBX0xheW91dEl0ZW06OkdldFJlY3QoQ0ZYX1JlY3RGJiBydExheW91dCwgRlhfQk9PTCBiUmVsYXRpdmUpIGNvbnN0IHsNCisgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopdGhpczsNCisgIENGWF9Qb2ludEYgc1BvcyA9IHBUaGlzLT5tX3NQb3M7DQorICBDRlhfU2l6ZUYgc1NpemUgPSBwVGhpcy0+bV9zU2l6ZTsNCisgIGlmICghYlJlbGF0aXZlKSB7DQorICAgIGZvciAoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0gPSBwVGhpcy0+bV9wUGFyZW50OyBwTGF5b3V0SXRlbTsNCisgICAgICAgICBwTGF5b3V0SXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BQYXJlbnQpIHsNCisgICAgICBpZiAocExheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgc1BvcyArPSAoKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbSktPm1fc1BvczsNCisgICAgICAgIGlmIChDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0NCisgICAgICAgICAgICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcygNCisgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX01hcmdpbikpIHsNCisgICAgICAgICAgc1Bvcy5BZGQocE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpDQorICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9VTklUX1B0KSwNCisgICAgICAgICAgICAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkNCisgICAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VOSVRfUHQpKTsNCiAgICAgICAgIH0NCi0gICAgfQ0KLX0NCi1DWEZBX05vZGUqIElYRkFfTGF5b3V0UGFnZTo6R2V0TWFzdGVyUGFnZSgpIGNvbnN0DQotew0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKil0aGlzOw0KLSAgICByZXR1cm4gcFRoaXMtPm1fcEZvcm1Ob2RlOw0KLX0NCi1JWEZBX0xheW91dFBhZ2UqCUNYRkFfTGF5b3V0SXRlbTo6R2V0UGFnZSgpIGNvbnN0DQotew0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKil0aGlzOw0KLSAgICBmb3IoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcEN1ck5vZGUgPSBwVGhpczsgcEN1ck5vZGU7IHBDdXJOb2RlID0gcEN1ck5vZGUtPm1fcFBhcmVudCkgew0KLSAgICAgICAgaWYocEN1ck5vZGUtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCi0gICAgICAgICAgICByZXR1cm4gKElYRkFfTGF5b3V0UGFnZSopcEN1ck5vZGU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KKyAgICAgICAgICBzUG9zLkFkZChwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9YKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVU5JVF9QdCksDQorICAgICAgICAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1kpDQorICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9VTklUX1B0KSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfSBlbHNlIGlmIChwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PQ0KKyAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBydExheW91dC5TZXQoc1Bvcy54LCBzUG9zLnksIHNTaXplLngsIHNTaXplLnkpOw0KIH0NCi1DWEZBX05vZGUqIENYRkFfTGF5b3V0SXRlbTo6R2V0Rm9ybU5vZGUoKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKil0aGlzOw0KLSAgICByZXR1cm4gcFRoaXMtPm1fcEZvcm1Ob2RlOw0KK0NYRkFfTGF5b3V0SXRlbSogQ1hGQV9MYXlvdXRJdGVtOjpHZXRQYXJlbnQoKSBjb25zdCB7DQorICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0xheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKXBUaGlzLT5tX3BQYXJlbnQ7DQogfQ0KLXZvaWQgQ1hGQV9MYXlvdXRJdGVtOjpHZXRSZWN0KENGWF9SZWN0RiAmcnRMYXlvdXQsIEZYX0JPT0wgYlJlbGF0aXZlKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKil0aGlzOw0KLSAgICBDRlhfUG9pbnRGIHNQb3MgID0gcFRoaXMtPm1fc1BvczsNCi0gICAgQ0ZYX1NpemVGICBzU2l6ZSA9IHBUaGlzLT5tX3NTaXplOw0KLSAgICBpZiAoIWJSZWxhdGl2ZSkgew0KLSAgICAgICAgZm9yKENYRkFfTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtID0gcFRoaXMtPm1fcFBhcmVudDsgcExheW91dEl0ZW07IHBMYXlvdXRJdGVtID0gcExheW91dEl0ZW0tPm1fcFBhcmVudCkgew0KLSAgICAgICAgICAgIGlmKHBMYXlvdXRJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCi0gICAgICAgICAgICAgICAgc1BvcyArPSAoKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbSktPm1fc1BvczsNCi0gICAgICAgICAgICAgICAgaWYoQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9IHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKSkgew0KLSAgICAgICAgICAgICAgICAgICAgc1Bvcy5BZGQocE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCksIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCi0gICAgICAgICAgICAgICAgICAgIHNQb3MuQWRkKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1gpLlRvVW5pdChYRkFfVU5JVF9QdCksIHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1kpLlRvVW5pdChYRkFfVU5JVF9QdCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkdldEZpcnN0KCkgY29uc3Qgew0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDdXJOb2RlID0gcFRoaXM7DQorICB3aGlsZSAocEN1ck5vZGUtPm1fcFByZXYpIHsNCisgICAgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+bV9wUHJldjsNCisgIH0NCisgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKilwQ3VyTm9kZTsNCit9DQorQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkdldFByZXYoKSBjb25zdCB7DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRoaXMgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXRoaXM7DQorICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopcFRoaXMtPm1fcFByZXY7DQorfQ0KK0NYRkFfTGF5b3V0SXRlbSogQ1hGQV9MYXlvdXRJdGVtOjpHZXROZXh0KCkgY29uc3Qgew0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKXBUaGlzLT5tX3BOZXh0Ow0KK30NCitDWEZBX0xheW91dEl0ZW0qIENYRkFfTGF5b3V0SXRlbTo6R2V0TGFzdCgpIGNvbnN0IHsNCisgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopdGhpczsNCisgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ3VyTm9kZSA9IHBUaGlzOw0KKyAgd2hpbGUgKHBDdXJOb2RlLT5tX3BOZXh0KSB7DQorICAgIHBDdXJOb2RlID0gcEN1ck5vZGUtPm1fcE5leHQ7DQorICB9DQorICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopcEN1ck5vZGU7DQorfQ0KK2ludDMyX3QgQ1hGQV9MYXlvdXRJdGVtOjpHZXRJbmRleCgpIGNvbnN0IHsNCisgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopdGhpczsNCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ3VyTm9kZSA9IHBUaGlzOw0KKyAgd2hpbGUgKHBDdXJOb2RlLT5tX3BQcmV2KSB7DQorICAgIHBDdXJOb2RlID0gcEN1ck5vZGUtPm1fcFByZXY7DQorICAgIGlJbmRleCsrOw0KKyAgfQ0KKyAgcmV0dXJuIGlJbmRleDsNCit9DQoraW50MzJfdCBDWEZBX0xheW91dEl0ZW06OkdldENvdW50KCkgY29uc3Qgew0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKil0aGlzOw0KKyAgaW50MzJfdCBpQ291bnQgPSAxOw0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDdXJOb2RlID0gTlVMTDsNCisgIHBDdXJOb2RlID0gcFRoaXM7DQorICB3aGlsZSAocEN1ck5vZGUtPm1fcFByZXYpIHsNCisgICAgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+bV9wUHJldjsNCisgICAgaUNvdW50Kys7DQorICB9DQorICBwQ3VyTm9kZSA9IHBUaGlzOw0KKyAgd2hpbGUgKHBDdXJOb2RlLT5tX3BOZXh0KSB7DQorICAgIHBDdXJOb2RlID0gcEN1ck5vZGUtPm1fcE5leHQ7DQorICAgIGlDb3VudCsrOw0KKyAgfQ0KKyAgcmV0dXJuIGlDb3VudDsNCit9DQorRlhfRFdPUkQgWEZBX0dldFJlbGV2YW50KENYRkFfTm9kZSogcEZvcm1JdGVtLCBGWF9EV09SRCBkd1BhcmVudFJlbHZhbnQpIHsNCisgIEZYX0RXT1JEIGR3UmVsZXZhbnQgPSBYRkFfTEFZT1VUU1RBVFVTX1ZpZXdhYmxlIHwgWEZBX0xBWU9VVFNUQVRVU19QcmludGFibGU7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWxldmFudDsNCisgIGlmIChwRm9ybUl0ZW0tPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIHdzUmVsZXZhbnQpKSB7DQorICAgIGlmICh3c1JlbGV2YW50ID09IEZYX1dTVFJDKEwiK3ByaW50IikgfHwgd3NSZWxldmFudCA9PSBGWF9XU1RSQyhMInByaW50IikpIHsNCisgICAgICBkd1JlbGV2YW50ICY9IH5YRkFfTEFZT1VUU1RBVFVTX1ZpZXdhYmxlOw0KKyAgICB9IGVsc2UgaWYgKHdzUmVsZXZhbnQgPT0gRlhfV1NUUkMoTCItcHJpbnQiKSkgew0KKyAgICAgIGR3UmVsZXZhbnQgJj0gflhGQV9MQVlPVVRTVEFUVVNfUHJpbnRhYmxlOw0KICAgICB9DQotICAgIHJ0TGF5b3V0LlNldChzUG9zLngsIHNQb3MueSwgc1NpemUueCwgc1NpemUueSk7DQorICB9DQorICBpZiAoIShkd1BhcmVudFJlbHZhbnQgJiBYRkFfTEFZT1VUU1RBVFVTX1ZpZXdhYmxlKSAmJg0KKyAgICAgIChkd1JlbGV2YW50ICE9IFhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGUpKSB7DQorICAgIGR3UmVsZXZhbnQgJj0gflhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGU7DQorICB9DQorICBpZiAoIShkd1BhcmVudFJlbHZhbnQgJiBYRkFfTEFZT1VUU1RBVFVTX1ByaW50YWJsZSkgJiYNCisgICAgICAoZHdSZWxldmFudCAhPSBYRkFfTEFZT1VUU1RBVFVTX1ByaW50YWJsZSkpIHsNCisgICAgZHdSZWxldmFudCAmPSB+WEZBX0xBWU9VVFNUQVRVU19QcmludGFibGU7DQorICB9DQorICByZXR1cm4gZHdSZWxldmFudDsNCiB9DQotQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkdldFBhcmVudCgpIGNvbnN0DQotew0KLSAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0xheW91dEl0ZW1JbXBsKil0aGlzOw0KLSAgICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopcFRoaXMtPm1fcFBhcmVudDsNCi19DQotQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkdldEZpcnN0KCkgY29uc3QNCi17DQotICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopdGhpczsNCi0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDdXJOb2RlID0gcFRoaXM7DQotICAgIHdoaWxlKHBDdXJOb2RlLT5tX3BQcmV2KSB7DQotICAgICAgICBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5tX3BQcmV2Ow0KLSAgICB9DQotICAgIHJldHVybiAoQ1hGQV9MYXlvdXRJdGVtKilwQ3VyTm9kZTsNCi19DQotQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkdldFByZXYoKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUaGlzID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKil0aGlzOw0KLSAgICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopcFRoaXMtPm1fcFByZXY7DQotfQ0KLUNYRkFfTGF5b3V0SXRlbSogQ1hGQV9MYXlvdXRJdGVtOjpHZXROZXh0KCkgY29uc3QNCi17DQotICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopdGhpczsNCi0gICAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKXBUaGlzLT5tX3BOZXh0Ow0KLX0NCi1DWEZBX0xheW91dEl0ZW0qIENYRkFfTGF5b3V0SXRlbTo6R2V0TGFzdCgpIGNvbnN0DQotew0KLSAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRoaXMgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXRoaXM7DQotICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ3VyTm9kZSA9IHBUaGlzOw0KLSAgICB3aGlsZShwQ3VyTm9kZS0+bV9wTmV4dCkgew0KLSAgICAgICAgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+bV9wTmV4dDsNCi0gICAgfQ0KLSAgICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbSopcEN1ck5vZGU7DQotfQ0KLWludDMyX3QgQ1hGQV9MYXlvdXRJdGVtOjpHZXRJbmRleCgpIGNvbnN0DQotew0KLSAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRoaXMgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXRoaXM7DQotICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDdXJOb2RlID0gcFRoaXM7DQotICAgIHdoaWxlKHBDdXJOb2RlLT5tX3BQcmV2KSB7DQotICAgICAgICBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5tX3BQcmV2Ow0KLSAgICAgICAgaUluZGV4Kys7DQotICAgIH0NCi0gICAgcmV0dXJuIGlJbmRleDsNCi19DQotaW50MzJfdCBDWEZBX0xheW91dEl0ZW06OkdldENvdW50KCkgY29uc3QNCi17DQotICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVGhpcyA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopdGhpczsNCi0gICAgaW50MzJfdCBpQ291bnQgPSAxOw0KLSAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcEN1ck5vZGUgPSBOVUxMOw0KLSAgICBwQ3VyTm9kZSA9IHBUaGlzOw0KLSAgICB3aGlsZShwQ3VyTm9kZS0+bV9wUHJldikgew0KLSAgICAgICAgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+bV9wUHJldjsNCi0gICAgICAgIGlDb3VudCsrOw0KLSAgICB9DQotICAgIHBDdXJOb2RlID0gcFRoaXM7DQotICAgIHdoaWxlKHBDdXJOb2RlLT5tX3BOZXh0KSB7DQotICAgICAgICBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5tX3BOZXh0Ow0KLSAgICAgICAgaUNvdW50Kys7DQotICAgIH0NCi0gICAgcmV0dXJuIGlDb3VudDsNCi19DQotRlhfRFdPUkQgWEZBX0dldFJlbGV2YW50KENYRkFfTm9kZSogcEZvcm1JdGVtLCBGWF9EV09SRCBkd1BhcmVudFJlbHZhbnQpDQotew0KLSAgICBGWF9EV09SRCBkd1JlbGV2YW50ID0gWEZBX0xBWU9VVFNUQVRVU19WaWV3YWJsZSB8IFhGQV9MQVlPVVRTVEFUVVNfUHJpbnRhYmxlOw0KLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWxldmFudDsNCi0gICAgaWYgKHBGb3JtSXRlbS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWxldmFudCwgd3NSZWxldmFudCkpIHsNCi0gICAgICAgIGlmICh3c1JlbGV2YW50ID09IEZYX1dTVFJDKEwiK3ByaW50IikgfHwgd3NSZWxldmFudCA9PSBGWF9XU1RSQyhMInByaW50IikpIHsNCi0gICAgICAgICAgICBkd1JlbGV2YW50ICY9IH5YRkFfTEFZT1VUU1RBVFVTX1ZpZXdhYmxlOw0KLSAgICAgICAgfSBlbHNlIGlmICh3c1JlbGV2YW50ID09IEZYX1dTVFJDKEwiLXByaW50IikpIHsNCi0gICAgICAgICAgICBkd1JlbGV2YW50ICAmPSB+WEZBX0xBWU9VVFNUQVRVU19QcmludGFibGU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKCEoZHdQYXJlbnRSZWx2YW50ICYgWEZBX0xBWU9VVFNUQVRVU19WaWV3YWJsZSkgJiYgKGR3UmVsZXZhbnQgIT0gWEZBX0xBWU9VVFNUQVRVU19WaWV3YWJsZSkpIHsNCi0gICAgICAgIGR3UmVsZXZhbnQgJj0gflhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGU7DQotICAgIH0NCi0gICAgaWYgKCEoZHdQYXJlbnRSZWx2YW50ICYgWEZBX0xBWU9VVFNUQVRVU19QcmludGFibGUpICYmIChkd1JlbGV2YW50ICE9IFhGQV9MQVlPVVRTVEFUVVNfUHJpbnRhYmxlKSkgew0KLSAgICAgICAgZHdSZWxldmFudCAmPSB+WEZBX0xBWU9VVFNUQVRVU19QcmludGFibGU7DQotICAgIH0NCi0gICAgcmV0dXJuIGR3UmVsZXZhbnQ7DQotfQ0KLXZvaWQgWEZBX1JlbGVhc2VMYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbUltcGwgKnBMYXlvdXRJdGVtKQ0KLXsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcE5leHQsICpwTm9kZSA9IHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KLSAgICB3aGlsZSAocE5vZGUpIHsNCi0gICAgICAgIHBOZXh0ID0gcE5vZGUtPm1fcE5leHRTaWJsaW5nOw0KLSAgICAgICAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQotICAgICAgICBYRkFfUmVsZWFzZUxheW91dEl0ZW0ocE5vZGUpOw0KLSAgICAgICAgcE5vZGUgPSBwTmV4dDsNCi0gICAgfQ0KLSAgICBkZWxldGUgcExheW91dEl0ZW07DQordm9pZCBYRkFfUmVsZWFzZUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pIHsNCisgIENYRkFfTGF5b3V0SXRlbUltcGwgKnBOZXh0LCAqcE5vZGUgPSBwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgIHdoaWxlIChwTm9kZSkgew0KKyAgICBwTmV4dCA9IHBOb2RlLT5tX3BOZXh0U2libGluZzsNCisgICAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQorICAgIFhGQV9SZWxlYXNlTGF5b3V0SXRlbShwTm9kZSk7DQorICAgIHBOb2RlID0gcE5leHQ7DQorICB9DQorICBkZWxldGUgcExheW91dEl0ZW07DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfYXBwYWRhcHRlci5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmgKaW5kZXggYWI1MDUxNy4uZjQ5ZWQ1MSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmgKQEAgLTYsNjkgKzYsNjggQEAKIA0KICNpZm5kZWYgX1hGQV9MQVlPVVRfQVBQQURBUFRFUl9IXw0KICNkZWZpbmUgX1hGQV9MQVlPVVRfQVBQQURBUFRFUl9IXw0KLWNsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9QYWdlQXJlYUNvbnRhaW5lckxheW91dEl0ZW0NCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldEZpcnN0Q2hpbGQoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pDQotICAgIHsNCi0gICAgICAgIGlmKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCi0gICAgICAgICAgICByZXR1cm4gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQorY2xhc3MgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1BhZ2VBcmVhQ29udGFpbmVyTGF5b3V0SXRlbSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogR2V0Rmlyc3RDaGlsZCgNCisgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkgew0KKyAgICBpZiAocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KKyAgICAgIHJldHVybiAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQogICAgIH0NCi0gICAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBHZXROZXh0U2libGluZyhDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgIH0NCi0gICAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBHZXRQYXJlbnQoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcFBhcmVudDsNCi0gICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogR2V0TmV4dFNpYmxpbmcoDQorICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pIHsNCisgICAgcmV0dXJuIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICB9DQorICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldFBhcmVudCgNCisgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkgew0KKyAgICByZXR1cm4gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7DQorICB9DQogfTsNCi1jbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudEFyZWFDb250YWluZXJMYXlvdXRJdGVtDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBHZXRGaXJzdENoaWxkKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KLSAgICB7DQotICAgICAgICBmb3IoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOyBwQ2hpbGRJdGVtOyBwQ2hpbGRJdGVtID0gcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCi0gICAgICAgICAgICBpZihwQ2hpbGRJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcENoaWxkSXRlbTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBOVUxMOw0KK2NsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50QXJlYUNvbnRhaW5lckxheW91dEl0ZW0gew0KKyBwdWJsaWM6DQorICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldEZpcnN0Q2hpbGQoDQorICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pIHsNCisgICAgZm9yIChDWEZBX0xheW91dEl0ZW1JbXBsKiBwQ2hpbGRJdGVtID0gcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgICAgcENoaWxkSXRlbTsgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgaWYgKHBDaGlsZEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcENoaWxkSXRlbTsNCiAgICAgfQ0KLSAgICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldE5leHRTaWJsaW5nKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KLSAgICB7DQotICAgICAgICBmb3IoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsgcENoaWxkSXRlbTsgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQotICAgICAgICAgICAgaWYocENoaWxkSXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBDaGlsZEl0ZW07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldE5leHRTaWJsaW5nKA0KKyAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKSB7DQorICAgIGZvciAoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgICAgICBwQ2hpbGRJdGVtOyBwQ2hpbGRJdGVtID0gcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICBpZiAocENoaWxkSXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwQ2hpbGRJdGVtOw0KICAgICB9DQotICAgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogR2V0UGFyZW50KENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7DQotICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldFBhcmVudCgNCisgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkgew0KKyAgICByZXR1cm4gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7DQorICB9DQogfTsNCi1jbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudExheW91dEl0ZW0NCi17DQotcHVibGljOg0KLSAgICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBHZXRGaXJzdENoaWxkKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQotICAgIH0NCi0gICAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogR2V0TmV4dFNpYmxpbmcoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgIH0NCi0gICAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogR2V0UGFyZW50KENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcFBhcmVudDsNCi0gICAgfQ0KK2NsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50TGF5b3V0SXRlbSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIEdldEZpcnN0Q2hpbGQoDQorICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKSB7DQorICAgIHJldHVybiAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogR2V0TmV4dFNpYmxpbmcoDQorICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKSB7DQorICAgIHJldHVybiAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIEdldFBhcmVudCgNCisgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pIHsNCisgICAgcmV0dXJuIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcFBhcmVudDsNCisgIH0NCiB9Ow0KLUZYX0RXT1JECVhGQV9HZXRSZWxldmFudChDWEZBX05vZGUqIHBGb3JtSXRlbSwgRlhfRFdPUkQgZHdQYXJlbnRSZWx2YW50KTsNCi12b2lkCQlYRkFfUmVsZWFzZUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pOw0KK0ZYX0RXT1JEIFhGQV9HZXRSZWxldmFudChDWEZBX05vZGUqIHBGb3JtSXRlbSwgRlhfRFdPUkQgZHdQYXJlbnRSZWx2YW50KTsNCit2b2lkIFhGQV9SZWxlYXNlTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSk7DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfaXRlbWxheW91dC5jcHAKaW5kZXggZmM2ZWMyMC4uOTNmMGIwMSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuY3BwCkBAIC0yMCwyMzc2ICsyMCwyOTEwIEBACiAjaW5jbHVkZSAieGZhX2xheW91dF9pdGVtbGF5b3V0LmgiDQogI2luY2x1ZGUgInhmYV9sYXlvdXRfcGFnZW1ncl9uZXcuaCINCiAjaW5jbHVkZSAieGZhX2xheW91dF9hcHBhZGFwdGVyLmgiDQotQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IoQ1hGQV9Ob2RlICpwTm9kZSwgQ1hGQV9MYXlvdXRQYWdlTWdyKiBwUGFnZU1ncikNCi0gICAgOiBtX3BGb3JtTm9kZShwTm9kZSkNCi0gICAgLCBtX3BMYXlvdXRJdGVtKE5VTEwpDQotICAgICwgbV9wQ3VyQ2hpbGROb2RlKFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpDQotICAgICwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfTm9uZSkNCi0gICAgLCBtX3BDdXJDaGlsZFByZXByb2Nlc3NvcihOVUxMKQ0KLSAgICAsIG1fZlVzZWRTaXplKDApDQotICAgICwgbV9wUGFnZU1ncihwUGFnZU1ncikNCi0gICAgLCBtX2JIYXNBdmFpbEhlaWdodChUUlVFKQ0KK0NYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRQYWdlTWdyKiBwUGFnZU1ncikNCisgICAgOiBtX3BGb3JtTm9kZShwTm9kZSksDQorICAgICAgbV9wTGF5b3V0SXRlbShOVUxMKSwNCisgICAgICBtX3BDdXJDaGlsZE5vZGUoWEZBX0xBWU9VVF9JTlZBTElETk9ERSksDQorICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfTm9uZSksDQorICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IoTlVMTCksDQorICAgICAgbV9mVXNlZFNpemUoMCksDQorICAgICAgbV9wUGFnZU1ncihwUGFnZU1nciksDQorICAgICAgbV9iSGFzQXZhaWxIZWlnaHQoVFJVRSkNCiAjaWZkZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCi0gICAgLCBtX3BPbGRMYXlvdXRJdGVtKE5VTEwpDQorICAgICAgLA0KKyAgICAgIG1fcE9sZExheW91dEl0ZW0oTlVMTCkNCiAjZWxzZQ0KLSAgICAsIG1fcFBhZ2VNZ3JDcmVhdGVJdGVtKE5VTEwpDQorICAgICAgLA0KKyAgICAgIG1fcFBhZ2VNZ3JDcmVhdGVJdGVtKE5VTEwpDQogI2VuZGlmDQotICAgICwgbV9iS2VlcEJyZWFrRmluaXNoKEZBTFNFKQ0KLSAgICAsIG1fcEtlZXBIZWFkTm9kZShOVUxMKQ0KLSAgICAsIG1fcEtlZXBUYWlsTm9kZShOVUxMKQ0KLSAgICAsIG1fYklzUHJvY2Vzc0tlZXAoRkFMU0UpDQotICAgICwgbV9iQnJlYWtQZW5kaW5nKFRSVUUpDQotICAgICwgbV9mTGFzdFJvd1dpZHRoKDApDQotICAgICwgbV9mTGFzdFJvd1koMCkNCi0gICAgLCBtX2JVc2VJbmhlcmlhdGVkKEZBTFNFKQ0KLSAgICAsIG1fZldpZHRoTGltaXRlKDApDQotICAgICwgbV9lUHJlUHJvY2Vzc1JzKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wRm9ybU5vZGUgJiYgKG1fcEZvcm1Ob2RlLT5Jc0NvbnRhaW5lck5vZGUoKSB8fCBtX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Zvcm0pKTsNCisgICAgICAsDQorICAgICAgbV9iS2VlcEJyZWFrRmluaXNoKEZBTFNFKSwNCisgICAgICBtX3BLZWVwSGVhZE5vZGUoTlVMTCksDQorICAgICAgbV9wS2VlcFRhaWxOb2RlKE5VTEwpLA0KKyAgICAgIG1fYklzUHJvY2Vzc0tlZXAoRkFMU0UpLA0KKyAgICAgIG1fYkJyZWFrUGVuZGluZyhUUlVFKSwNCisgICAgICBtX2ZMYXN0Um93V2lkdGgoMCksDQorICAgICAgbV9mTGFzdFJvd1koMCksDQorICAgICAgbV9iVXNlSW5oZXJpYXRlZChGQUxTRSksDQorICAgICAgbV9mV2lkdGhMaW1pdGUoMCksDQorICAgICAgbV9lUHJlUHJvY2Vzc1JzKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BGb3JtTm9kZSAmJiAobV9wRm9ybU5vZGUtPklzQ29udGFpbmVyTm9kZSgpIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRm9ybSkpOw0KICNpZmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KLSAgICBtX3BPbGRMYXlvdXRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiltX3BGb3JtTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOw0KKyAgbV9wT2xkTGF5b3V0SXRlbSA9DQorICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiltX3BGb3JtTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOw0KICNlbmRpZg0KIH0NCi1DWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpDcmVhdGVDb250ZW50TGF5b3V0SXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSkNCi17DQotICAgIGlmKCFwRm9ybU5vZGUpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9IE5VTEw7DQorQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6Q3JlYXRlQ29udGVudExheW91dEl0ZW0oDQorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7DQorICBpZiAoIXBGb3JtTm9kZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9IE5VTEw7DQogI2lmZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQotICAgIGlmIChtX3BPbGRMYXlvdXRJdGVtKSB7DQotICAgICAgICBwTGF5b3V0SXRlbSA9IG1fcE9sZExheW91dEl0ZW07DQotICAgICAgICBtX3BPbGRMYXlvdXRJdGVtID0gbV9wT2xkTGF5b3V0SXRlbS0+bV9wTmV4dDsNCi0gICAgICAgIHJldHVybiBwTGF5b3V0SXRlbTsNCi0gICAgfQ0KLSAgICBwTGF5b3V0SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCktPk9uQ3JlYXRlTGF5b3V0SXRlbShwRm9ybU5vZGUpOw0KLSNlbHNlDQotICAgIHBMYXlvdXRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiltX3BQYWdlTWdyQ3JlYXRlSXRlbS0+RmluZE9yQ3JlYXRlTGF5b3V0SXRlbShwRm9ybU5vZGUpOw0KLSNlbmRpZg0KLSAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFByZXZMYXlvdXRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwRm9ybU5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKTsNCi0gICAgaWYocFByZXZMYXlvdXRJdGVtKSB7DQotICAgICAgICB3aGlsZShwUHJldkxheW91dEl0ZW0tPm1fcE5leHQpIHsNCi0gICAgICAgICAgICBwUHJldkxheW91dEl0ZW0gPSBwUHJldkxheW91dEl0ZW0tPm1fcE5leHQ7DQotICAgICAgICB9DQotICAgICAgICBwUHJldkxheW91dEl0ZW0tPm1fcE5leHQgPSBwTGF5b3V0SXRlbTsNCi0gICAgICAgIHBMYXlvdXRJdGVtLT5tX3BQcmV2ID0gcFByZXZMYXlvdXRJdGVtOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcEZvcm1Ob2RlLT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwgcExheW91dEl0ZW0pOw0KLSAgICB9DQorICBpZiAobV9wT2xkTGF5b3V0SXRlbSkgew0KKyAgICBwTGF5b3V0SXRlbSA9IG1fcE9sZExheW91dEl0ZW07DQorICAgIG1fcE9sZExheW91dEl0ZW0gPSBtX3BPbGRMYXlvdXRJdGVtLT5tX3BOZXh0Ow0KICAgICByZXR1cm4gcExheW91dEl0ZW07DQorICB9DQorICBwTGF5b3V0SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpDQorICAgICAgICAgICAgICAgICAgICAtPkdldFBhcnNlcigpDQorICAgICAgICAgICAgICAgICAgICAtPkdldE5vdGlmeSgpDQorICAgICAgICAgICAgICAgICAgICAtPk9uQ3JlYXRlTGF5b3V0SXRlbShwRm9ybU5vZGUpOw0KKyNlbHNlDQorICBwTGF5b3V0SXRlbSA9DQorICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiltX3BQYWdlTWdyQ3JlYXRlSXRlbS0+RmluZE9yQ3JlYXRlTGF5b3V0SXRlbSgNCisgICAgICAgICAgcEZvcm1Ob2RlKTsNCisjZW5kaWYNCisgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwUHJldkxheW91dEl0ZW0gPQ0KKyAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcEZvcm1Ob2RlLT5HZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSk7DQorICBpZiAocFByZXZMYXlvdXRJdGVtKSB7DQorICAgIHdoaWxlIChwUHJldkxheW91dEl0ZW0tPm1fcE5leHQpIHsNCisgICAgICBwUHJldkxheW91dEl0ZW0gPSBwUHJldkxheW91dEl0ZW0tPm1fcE5leHQ7DQorICAgIH0NCisgICAgcFByZXZMYXlvdXRJdGVtLT5tX3BOZXh0ID0gcExheW91dEl0ZW07DQorICAgIHBMYXlvdXRJdGVtLT5tX3BQcmV2ID0gcFByZXZMYXlvdXRJdGVtOw0KKyAgfSBlbHNlIHsNCisgICAgcEZvcm1Ob2RlLT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwgcExheW91dEl0ZW0pOw0KKyAgfQ0KKyAgcmV0dXJuIHBMYXlvdXRJdGVtOw0KIH0NCi1GWF9CT09MIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RmluZExheW91dEl0ZW1TcGxpdFBvcyhDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0sIEZYX0ZMT0FUIGZDdXJWZXJ0aWNhbE9mZnNldCwgRlhfRkxPQVQmIGZQcm9wb3NlZFNwbGl0UG9zLCBGWF9CT09MJiBiQXBwQ2hhbmdlLCBGWF9CT09MIGJDYWxjdWxhdGVNYXJnaW4gKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGU7DQotICAgIGlmIChmUHJvcG9zZWRTcGxpdFBvcyA+IGZDdXJWZXJ0aWNhbE9mZnNldCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OICYmIGZQcm9wb3NlZFNwbGl0UG9zIDw9IGZDdXJWZXJ0aWNhbE9mZnNldCArIHBMYXlvdXRJdGVtLT5tX3NTaXplLnkgLSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KLSAgICAgICAgc3dpdGNoKHBGb3JtTm9kZS0+R2V0SW50YWN0KCkpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6IHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFueUNoYW5nZWQgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ3VyVG9wTWFyZ2luID0gMCwgZkN1ckJvdHRvbU1hcmdpbiA9IDA7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0gcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NYXJnaW4pOw0KLSAgICAgICAgICAgICAgICAgICAgaWYocE1hcmdpbk5vZGUgJiYgYkNhbGN1bGF0ZU1hcmdpbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZDdXJUb3BNYXJnaW4gPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZDdXJCb3R0b21NYXJnaW4gPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhbmdlZCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZShiQ2hhbmdlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJDaGFuZ2VkID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUmVsU3BsaXRQb3MgPSBmUHJvcG9zZWRTcGxpdFBvcyAtIGZDdXJWZXJ0aWNhbE9mZnNldDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocE5vdGlmeS0+RmluZFNwbGl0UG9zKHBGb3JtTm9kZSwgKChDWEZBX0xheW91dEl0ZW0qKXBMYXlvdXRJdGVtKS0+R2V0SW5kZXgoKSwgZlJlbFNwbGl0UG9zKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFueUNoYW5nZWQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoYW5nZWQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlByb3Bvc2VkU3BsaXRQb3MgPSBmQ3VyVmVydGljYWxPZmZzZXQgKyBmUmVsU3BsaXRQb3M7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXBwQ2hhbmdlID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZQcm9wb3NlZFNwbGl0UG9zIDw9IGZDdXJWZXJ0aWNhbE9mZnNldCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlJlbFNwbGl0UG9zID0gZlByb3Bvc2VkU3BsaXRQb3MgLSBmQ3VyQm90dG9tTWFyZ2luOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7IHBDaGlsZEl0ZW07IHBDaGlsZEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDaGlsZE9mZnNldCA9IGZDdXJWZXJ0aWNhbE9mZnNldCArIGZDdXJUb3BNYXJnaW4gKyBwQ2hpbGRJdGVtLT5tX3NQb3MueTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXBwQ2hhbmdlID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGaW5kTGF5b3V0SXRlbVNwbGl0UG9zKHBDaGlsZEl0ZW0sIGZDaGlsZE9mZnNldCwgZlJlbFNwbGl0UG9zLCBiQXBwQ2hhbmdlLCBiQ2FsY3VsYXRlTWFyZ2luKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZlJlbFNwbGl0UG9zIC0gZkNoaWxkT2Zmc2V0IDwgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gJiYgYkFwcENoYW5nZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQcm9wb3NlZFNwbGl0UG9zID0gZlJlbFNwbGl0UG9zIC0gZkN1clRvcE1hcmdpbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlByb3Bvc2VkU3BsaXRQb3MgPSBmUmVsU3BsaXRQb3MgKyBmQ3VyQm90dG9tTWFyZ2luOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFueUNoYW5nZWQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoYW5nZWQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZlByb3Bvc2VkU3BsaXRQb3MgPD0gZkN1clZlcnRpY2FsT2Zmc2V0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJBbnlDaGFuZ2VkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYkFueUNoYW5nZWQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYToNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhOiB7DQotICAgICAgICAgICAgICAgICAgICBmUHJvcG9zZWRTcGxpdFBvcyA9IGZDdXJWZXJ0aWNhbE9mZnNldDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpGaW5kTGF5b3V0SXRlbVNwbGl0UG9zKA0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0sDQorICAgIEZYX0ZMT0FUIGZDdXJWZXJ0aWNhbE9mZnNldCwNCisgICAgRlhfRkxPQVQmIGZQcm9wb3NlZFNwbGl0UG9zLA0KKyAgICBGWF9CT09MJiBiQXBwQ2hhbmdlLA0KKyAgICBGWF9CT09MIGJDYWxjdWxhdGVNYXJnaW4pIHsNCisgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlOw0KKyAgaWYgKGZQcm9wb3NlZFNwbGl0UG9zID4gZkN1clZlcnRpY2FsT2Zmc2V0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gJiYNCisgICAgICBmUHJvcG9zZWRTcGxpdFBvcyA8PSBmQ3VyVmVydGljYWxPZmZzZXQgKyBwTGF5b3V0SXRlbS0+bV9zU2l6ZS55IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgc3dpdGNoIChwRm9ybU5vZGUtPkdldEludGFjdCgpKSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOiB7DQorICAgICAgICBGWF9CT09MIGJBbnlDaGFuZ2VkID0gRkFMU0U7DQorICAgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwRm9ybU5vZGUtPkdldERvY3VtZW50KCk7DQorICAgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IHBEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICAgICAgRlhfRkxPQVQgZkN1clRvcE1hcmdpbiA9IDAsIGZDdXJCb3R0b21NYXJnaW4gPSAwOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9DQorICAgICAgICAgICAgcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NYXJnaW4pOw0KKyAgICAgICAgaWYgKHBNYXJnaW5Ob2RlICYmIGJDYWxjdWxhdGVNYXJnaW4pIHsNCisgICAgICAgICAgZkN1clRvcE1hcmdpbiA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICAgIGZDdXJCb3R0b21NYXJnaW4gPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KICAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotc3RhdGljIFhGQV9BVFRSSUJVVEVFTlVNIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dldExheW91dChDWEZBX05vZGUqIHBGb3JtTm9kZSwgRlhfQk9PTCYgYlJvb3RGb3JjZVRiKQ0KLXsNCi0gICAgYlJvb3RGb3JjZVRiID0gRkFMU0U7DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXRNb2RlOw0KLSAgICBpZihwRm9ybU5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQsIGVMYXlvdXRNb2RlLCBGQUxTRSkpIHsNCi0gICAgICAgIHJldHVybiBlTGF5b3V0TW9kZTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUgKnBQYXJlbnROb2RlID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgaWYocFBhcmVudE5vZGUgJiYgcFBhcmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Gb3JtKSB7DQotICAgICAgICBiUm9vdEZvcmNlVGIgPSBUUlVFOw0KLSAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1RiOw0KLSAgICB9DQotICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbjsNCi19DQotc3RhdGljIEZYX0JPT0wJWEZBX0V4aXN0Q29udGFpbmVyS2VlcChDWEZBX05vZGUqICBwQ3VyTm9kZSwgRlhfQk9PTCBiUHJlRmluZCkNCi17DQotICAgIGlmKHBDdXJOb2RlID09IE5VTEwgfHwgIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocEN1ck5vZGUpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgWEZBX05PREVJVEVNIGVJdGVtVHlwZSA9IFhGQV9OT0RFSVRFTV9QcmV2U2libGluZzsNCi0gICAgaWYoIWJQcmVGaW5kKSB7DQotICAgICAgICBlSXRlbVR5cGUgPSBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmc7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwUHJlQ29udGFpbmVyID0gcEN1ck5vZGUtPkdldE5vZGVJdGVtKGVJdGVtVHlwZSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQotICAgIGlmKHBQcmVDb250YWluZXIgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcEtlZXAgPSBwQ3VyTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfS2VlcCk7DQotICAgIGlmIChwS2VlcCkgew0KLSAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVByZXZpb3VzOw0KLSAgICAgICAgWEZBX0FUVFJJQlVURSBlS2VlcFR5cGUgPSBYRkFfQVRUUklCVVRFX1ByZXZpb3VzOw0KLSAgICAgICAgaWYoIWJQcmVGaW5kKSB7DQotICAgICAgICAgICAgZUtlZXBUeXBlID0gWEZBX0FUVFJJQlVURV9OZXh0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBLZWVwLT5UcnlFbnVtKGVLZWVwVHlwZSwgZVByZXZpb3VzLCBGQUxTRSkpIHsNCi0gICAgICAgICAgICBpZihlUHJldmlvdXMgPT0gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEgfHwgZVByZXZpb3VzID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhKSB7DQorICAgICAgICBGWF9CT09MIGJDaGFuZ2VkID0gVFJVRTsNCisgICAgICAgIHdoaWxlIChiQ2hhbmdlZCkgew0KKyAgICAgICAgICBiQ2hhbmdlZCA9IEZBTFNFOw0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgRlhfRkxPQVQgZlJlbFNwbGl0UG9zID0gZlByb3Bvc2VkU3BsaXRQb3MgLSBmQ3VyVmVydGljYWxPZmZzZXQ7DQorICAgICAgICAgICAgaWYgKHBOb3RpZnktPkZpbmRTcGxpdFBvcygNCisgICAgICAgICAgICAgICAgICAgIHBGb3JtTm9kZSwgKChDWEZBX0xheW91dEl0ZW0qKXBMYXlvdXRJdGVtKS0+R2V0SW5kZXgoKSwNCisgICAgICAgICAgICAgICAgICAgIGZSZWxTcGxpdFBvcykpIHsNCisgICAgICAgICAgICAgIGJBbnlDaGFuZ2VkID0gVFJVRTsNCisgICAgICAgICAgICAgIGJDaGFuZ2VkID0gVFJVRTsNCisgICAgICAgICAgICAgIGZQcm9wb3NlZFNwbGl0UG9zID0gZkN1clZlcnRpY2FsT2Zmc2V0ICsgZlJlbFNwbGl0UG9zOw0KKyAgICAgICAgICAgICAgYkFwcENoYW5nZSA9IFRSVUU7DQorICAgICAgICAgICAgICBpZiAoZlByb3Bvc2VkU3BsaXRQb3MgPD0NCisgICAgICAgICAgICAgICAgICBmQ3VyVmVydGljYWxPZmZzZXQgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhfRkxPQVQgZlJlbFNwbGl0UG9zID0gZlByb3Bvc2VkU3BsaXRQb3MgLSBmQ3VyQm90dG9tTWFyZ2luOw0KKyAgICAgICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ2hpbGRJdGVtID0NCisgICAgICAgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICAgICAgICBwQ2hpbGRJdGVtOw0KKyAgICAgICAgICAgICAgIHBDaGlsZEl0ZW0gPQ0KKyAgICAgICAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgZkNoaWxkT2Zmc2V0ID0NCisgICAgICAgICAgICAgICAgZkN1clZlcnRpY2FsT2Zmc2V0ICsgZkN1clRvcE1hcmdpbiArIHBDaGlsZEl0ZW0tPm1fc1Bvcy55Ow0KKyAgICAgICAgICAgIEZYX0JPT0wgYkFwcENoYW5nZSA9IEZBTFNFOw0KKyAgICAgICAgICAgIGlmIChGaW5kTGF5b3V0SXRlbVNwbGl0UG9zKHBDaGlsZEl0ZW0sIGZDaGlsZE9mZnNldCwgZlJlbFNwbGl0UG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBcHBDaGFuZ2UsIGJDYWxjdWxhdGVNYXJnaW4pKSB7DQorICAgICAgICAgICAgICBpZiAoZlJlbFNwbGl0UG9zIC0gZkNoaWxkT2Zmc2V0IDwgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gJiYNCisgICAgICAgICAgICAgICAgICBiQXBwQ2hhbmdlKSB7DQorICAgICAgICAgICAgICAgIGZQcm9wb3NlZFNwbGl0UG9zID0gZlJlbFNwbGl0UG9zIC0gZkN1clRvcE1hcmdpbjsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGZQcm9wb3NlZFNwbGl0UG9zID0gZlJlbFNwbGl0UG9zICsgZkN1ckJvdHRvbU1hcmdpbjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJBbnlDaGFuZ2VkID0gVFJVRTsNCisgICAgICAgICAgICAgIGJDaGFuZ2VkID0gVFJVRTsNCisgICAgICAgICAgICAgIGlmIChmUHJvcG9zZWRTcGxpdFBvcyA8PQ0KKyAgICAgICAgICAgICAgICAgIGZDdXJWZXJ0aWNhbE9mZnNldCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKGJBbnlDaGFuZ2VkKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICB9DQotICAgIHBLZWVwID0gcFByZUNvbnRhaW5lci0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfS2VlcCk7DQotICAgIGlmICghcEtlZXApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlTmV4dDsNCi0gICAgWEZBX0FUVFJJQlVURSBlS2VlcFR5cGUgPSBYRkFfQVRUUklCVVRFX05leHQ7DQotICAgIGlmKCFiUHJlRmluZCkgew0KLSAgICAgICAgZUtlZXBUeXBlID0gWEZBX0FUVFJJQlVURV9QcmV2aW91czsNCi0gICAgfQ0KLSAgICBpZiAoIXBLZWVwLT5UcnlFbnVtKGVLZWVwVHlwZSwgZU5leHQsIEZBTFNFKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmKGVOZXh0ID09IFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhIHx8IGVOZXh0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhKSB7DQorICAgICAgICByZXR1cm4gYkFueUNoYW5nZWQ7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOg0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWE6IHsNCisgICAgICAgIGZQcm9wb3NlZFNwbGl0UG9zID0gZkN1clZlcnRpY2FsT2Zmc2V0Ow0KICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorc3RhdGljIFhGQV9BVFRSSUJVVEVFTlVNIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dldExheW91dCgNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsDQorICAgIEZYX0JPT0wmIGJSb290Rm9yY2VUYikgew0KKyAgYlJvb3RGb3JjZVRiID0gRkFMU0U7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0TW9kZTsNCisgIGlmIChwRm9ybU5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQsIGVMYXlvdXRNb2RlLCBGQUxTRSkpIHsNCisgICAgcmV0dXJuIGVMYXlvdXRNb2RlOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICBpZiAocFBhcmVudE5vZGUgJiYgcFBhcmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Gb3JtKSB7DQorICAgIGJSb290Rm9yY2VUYiA9IFRSVUU7DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9UYjsNCisgIH0NCisgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbjsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0V4aXN0Q29udGFpbmVyS2VlcChDWEZBX05vZGUqIHBDdXJOb2RlLCBGWF9CT09MIGJQcmVGaW5kKSB7DQorICBpZiAocEN1ck5vZGUgPT0gTlVMTCB8fCAhWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwQ3VyTm9kZSkpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgWEZBX05PREVJVEVNIGVJdGVtVHlwZSA9IFhGQV9OT0RFSVRFTV9QcmV2U2libGluZzsNCisgIGlmICghYlByZUZpbmQpIHsNCisgICAgZUl0ZW1UeXBlID0gWEZBX05PREVJVEVNX05leHRTaWJsaW5nOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUHJlQ29udGFpbmVyID0NCisgICAgICBwQ3VyTm9kZS0+R2V0Tm9kZUl0ZW0oZUl0ZW1UeXBlLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgIGlmIChwUHJlQ29udGFpbmVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwS2VlcCA9IHBDdXJOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9LZWVwKTsNCisgIGlmIChwS2VlcCkgew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlUHJldmlvdXM7DQorICAgIFhGQV9BVFRSSUJVVEUgZUtlZXBUeXBlID0gWEZBX0FUVFJJQlVURV9QcmV2aW91czsNCisgICAgaWYgKCFiUHJlRmluZCkgew0KKyAgICAgIGVLZWVwVHlwZSA9IFhGQV9BVFRSSUJVVEVfTmV4dDsNCisgICAgfQ0KKyAgICBpZiAocEtlZXAtPlRyeUVudW0oZUtlZXBUeXBlLCBlUHJldmlvdXMsIEZBTFNFKSkgew0KKyAgICAgIGlmIChlUHJldmlvdXMgPT0gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEgfHwNCisgICAgICAgICAgZVByZXZpb3VzID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHBLZWVwID0gcFByZUNvbnRhaW5lci0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfS2VlcCk7DQorICBpZiAoIXBLZWVwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVOZXh0Ow0KKyAgWEZBX0FUVFJJQlVURSBlS2VlcFR5cGUgPSBYRkFfQVRUUklCVVRFX05leHQ7DQorICBpZiAoIWJQcmVGaW5kKSB7DQorICAgIGVLZWVwVHlwZSA9IFhGQV9BVFRSSUJVVEVfUHJldmlvdXM7DQorICB9DQorICBpZiAoIXBLZWVwLT5UcnlFbnVtKGVLZWVwVHlwZSwgZU5leHQsIEZBTFNFKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoZU5leHQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEgfHwNCisgICAgICBlTmV4dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfRkxPQVQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpGaW5kU3BsaXRQb3MoRlhfRkxPQVQgZlByb3Bvc2VkU3BsaXRQb3MpDQotew0KLSAgICBBU1NFUlQobV9wTGF5b3V0SXRlbSk7DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPSBtX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQotICAgIEZYX0JPT0wgYkNhbGN1bGF0ZU1hcmdpbiA9IFRSVUU7DQotICAgIGlmKGVMYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24pIHsNCi0gICAgICAgIGJDYWxjdWxhdGVNYXJnaW4gPSBGQUxTRTsNCitGWF9GTE9BVCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkZpbmRTcGxpdFBvcyhGWF9GTE9BVCBmUHJvcG9zZWRTcGxpdFBvcykgew0KKyAgQVNTRVJUKG1fcExheW91dEl0ZW0pOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCA9IG1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsNCisgIEZYX0JPT0wgYkNhbGN1bGF0ZU1hcmdpbiA9IFRSVUU7DQorICBpZiAoZUxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbikgew0KKyAgICBiQ2FsY3VsYXRlTWFyZ2luID0gRkFMU0U7DQorICB9DQorICB3aGlsZSAoZlByb3Bvc2VkU3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICBGWF9CT09MIGJBcHBDaGFuZ2UgPSBGQUxTRTsNCisgICAgaWYgKCFGaW5kTGF5b3V0SXRlbVNwbGl0UG9zKG1fcExheW91dEl0ZW0sIDAsIGZQcm9wb3NlZFNwbGl0UG9zLCBiQXBwQ2hhbmdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGN1bGF0ZU1hcmdpbikpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICB3aGlsZShmUHJvcG9zZWRTcGxpdFBvcyA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQotICAgICAgICBGWF9CT09MIGJBcHBDaGFuZ2UgPSBGQUxTRTsNCi0gICAgICAgIGlmKCFGaW5kTGF5b3V0SXRlbVNwbGl0UG9zKG1fcExheW91dEl0ZW0sIDAsIGZQcm9wb3NlZFNwbGl0UG9zLCBiQXBwQ2hhbmdlLCBiQ2FsY3VsYXRlTWFyZ2luKSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBmUHJvcG9zZWRTcGxpdFBvczsNCisgIH0NCisgIHJldHVybiBmUHJvcG9zZWRTcGxpdFBvczsNCiB9DQotdm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlNwbGl0TGF5b3V0SXRlbShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0sIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwU2Vjb25kUGFyZW50LCBGWF9GTE9BVCBmU3BsaXRQb3MpDQotew0KLSAgICBGWF9GTE9BVCBmQ3VyVG9wTWFyZ2luID0gMCwgZkN1ckJvdHRvbU1hcmdpbiA9IDA7DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPSBtX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQotICAgIEZYX0JPT0wgYkNhbGN1bGF0ZU1hcmdpbiA9IFRSVUU7DQotICAgIGlmKGVMYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24pIHsNCi0gICAgICAgIGJDYWxjdWxhdGVNYXJnaW4gPSBGQUxTRTsNCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6U3BsaXRMYXlvdXRJdGVtKA0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0sDQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwU2Vjb25kUGFyZW50LA0KKyAgICBGWF9GTE9BVCBmU3BsaXRQb3MpIHsNCisgIEZYX0ZMT0FUIGZDdXJUb3BNYXJnaW4gPSAwLCBmQ3VyQm90dG9tTWFyZ2luID0gMDsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPSBtX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQorICBGWF9CT09MIGJDYWxjdWxhdGVNYXJnaW4gPSBUUlVFOw0KKyAgaWYgKGVMYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24pIHsNCisgICAgYkNhbGN1bGF0ZU1hcmdpbiA9IEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9DQorICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NYXJnaW4pOw0KKyAgaWYgKHBNYXJnaW5Ob2RlICYmIGJDYWxjdWxhdGVNYXJnaW4pIHsNCisgICAgZkN1clRvcE1hcmdpbiA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBmQ3VyQm90dG9tTWFyZ2luID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICB9DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFNlY29uZExheW91dEl0ZW0gPSBOVUxMOw0KKyAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yICYmDQorICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fcEZvcm1Ob2RlID09IHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSkgew0KKyAgICBwU2Vjb25kTGF5b3V0SXRlbSA9IG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5DcmVhdGVDb250ZW50TGF5b3V0SXRlbSgNCisgICAgICAgIHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSk7DQorICB9IGVsc2Ugew0KKyAgICBwU2Vjb25kTGF5b3V0SXRlbSA9IENyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSk7DQorICB9DQorICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBwTGF5b3V0SXRlbS0+bV9zUG9zLng7DQorICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS54ID0gcExheW91dEl0ZW0tPm1fc1NpemUueDsNCisgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NQb3MueSA9IDA7DQorICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS55ID0gcExheW91dEl0ZW0tPm1fc1NpemUueSAtIGZTcGxpdFBvczsNCisgIHBMYXlvdXRJdGVtLT5tX3NTaXplLnkgLT0gcFNlY29uZExheW91dEl0ZW0tPm1fc1NpemUueTsNCisgIGlmIChwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCkgew0KKyAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS55ICs9IGZDdXJUb3BNYXJnaW47DQorICB9DQorICBpZiAocFNlY29uZFBhcmVudCkgew0KKyAgICBwU2Vjb25kUGFyZW50LT5BZGRDaGlsZChwU2Vjb25kTGF5b3V0SXRlbSk7DQorICAgIGlmIChmQ3VyVG9wTWFyZ2luID4gMCAmJiBwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCkgew0KKyAgICAgIHBTZWNvbmRQYXJlbnQtPm1fc1NpemUueSArPSBmQ3VyVG9wTWFyZ2luOw0KKyAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwUGFyZW50SXRlbSA9DQorICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcFNlY29uZFBhcmVudC0+bV9wUGFyZW50Ow0KKyAgICAgIHdoaWxlIChwUGFyZW50SXRlbSkgew0KKyAgICAgICAgcFBhcmVudEl0ZW0tPm1fc1NpemUueSArPSBmQ3VyVG9wTWFyZ2luOw0KKyAgICAgICAgcFBhcmVudEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBQYXJlbnRJdGVtLT5tX3BQYXJlbnQ7DQorICAgICAgfQ0KICAgICB9DQotICAgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPSBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX01hcmdpbik7DQotICAgIGlmKHBNYXJnaW5Ob2RlICYmIGJDYWxjdWxhdGVNYXJnaW4pIHsNCi0gICAgICAgIGZDdXJUb3BNYXJnaW4gPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgZkN1ckJvdHRvbU1hcmdpbiA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgIH0NCi0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBTZWNvbmRMYXlvdXRJdGVtID0gTlVMTDsNCi0gICAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yICYmIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5tX3BGb3JtTm9kZSA9PSBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUpIHsNCi0gICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtID0gbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPkNyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwU2Vjb25kTGF5b3V0SXRlbSA9IENyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSk7DQotICAgIH0NCi0gICAgcFNlY29uZExheW91dEl0ZW0tPm1fc1Bvcy54ID0gcExheW91dEl0ZW0tPm1fc1Bvcy54Ow0KLSAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS54ID0gcExheW91dEl0ZW0tPm1fc1NpemUueDsNCi0gICAgcFNlY29uZExheW91dEl0ZW0tPm1fc1Bvcy55ID0gMDsNCi0gICAgcFNlY29uZExheW91dEl0ZW0tPm1fc1NpemUueSA9IHBMYXlvdXRJdGVtLT5tX3NTaXplLnkgLSBmU3BsaXRQb3M7DQotICAgIHBMYXlvdXRJdGVtLT5tX3NTaXplLnkgLT0gcFNlY29uZExheW91dEl0ZW0tPm1fc1NpemUueTsNCi0gICAgaWYocExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQpIHsNCi0gICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLnkgKz0gZkN1clRvcE1hcmdpbjsNCi0gICAgfQ0KLSAgICBpZiAocFNlY29uZFBhcmVudCkgew0KLSAgICAgICAgcFNlY29uZFBhcmVudC0+QWRkQ2hpbGQocFNlY29uZExheW91dEl0ZW0pOw0KLSAgICAgICAgaWYoZkN1clRvcE1hcmdpbiA+IDAgJiYgcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQpIHsNCi0gICAgICAgICAgICBwU2Vjb25kUGFyZW50LT5tX3NTaXplLnkgKz0gZkN1clRvcE1hcmdpbjsNCi0gICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFBhcmVudEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBTZWNvbmRQYXJlbnQtPm1fcFBhcmVudDsNCi0gICAgICAgICAgICB3aGlsZShwUGFyZW50SXRlbSkgew0KLSAgICAgICAgICAgICAgICBwUGFyZW50SXRlbS0+bV9zU2l6ZS55ICs9IGZDdXJUb3BNYXJnaW47DQotICAgICAgICAgICAgICAgIHBQYXJlbnRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwUGFyZW50SXRlbS0+bV9wUGFyZW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3BQYXJlbnQgPSBwTGF5b3V0SXRlbS0+bV9wUGFyZW50Ow0KLSAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KLSAgICAgICAgcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcFNlY29uZExheW91dEl0ZW07DQotICAgIH0NCi0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwgKnBDaGlsZHJlbiA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQotICAgIHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkID0gTlVMTDsNCi0gICAgRlhfRkxPQVQgbEhlaWdodEZvcktlZXAgPSAwOw0KLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+IGtlZXBMYXlvdXRJdGVtczsNCi0gICAgRlhfRkxPQVQgZkFkZE1hcmdpbkhlaWdodCA9IDA7DQotICAgIGZvcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCAqcENoaWxkSXRlbSA9IHBDaGlsZHJlbiwgKnBDaGlsZE5leHQgPSBOVUxMOyBwQ2hpbGRJdGVtOyBwQ2hpbGRJdGVtID0gcENoaWxkTmV4dCkgew0KLSAgICAgICAgcENoaWxkTmV4dCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgICAgICBwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZyA9IE5VTEw7DQotICAgICAgICBpZiAoZlNwbGl0UG9zIDw9IGZDdXJUb3BNYXJnaW4gKyBwQ2hpbGRJdGVtLT5tX3NQb3MueSArIGZDdXJCb3R0b21NYXJnaW4gKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KLSAgICAgICAgICAgIGlmKCFYRkFfRXhpc3RDb250YWluZXJLZWVwKHBDaGlsZEl0ZW0tPm1fcEZvcm1Ob2RlLCBUUlVFKSkgew0KLSAgICAgICAgICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSAtPSBmU3BsaXRQb3MgLSBmQ3VyQm90dG9tTWFyZ2luOw0KLSAgICAgICAgICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSArPSBsSGVpZ2h0Rm9yS2VlcDsNCi0gICAgICAgICAgICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgKz0gZkFkZE1hcmdpbkhlaWdodDsNCi0gICAgICAgICAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPkFkZENoaWxkKHBDaGlsZEl0ZW0pOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmKGxIZWlnaHRGb3JLZWVwIDwgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IGtlZXBMYXlvdXRJdGVtcy5HZXRTaXplKCk7IGlJbmRleCArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsICpwUHJlSXRlbSA9IGtlZXBMYXlvdXRJdGVtc1tpSW5kZXhdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwUHJlSXRlbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFByZUl0ZW0tPm1fc1Bvcy55IC09IGZTcGxpdFBvczsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwUHJlSXRlbS0+bV9zUG9zLnkgPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVJdGVtLT5tX3NQb3MueSA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUHJlSXRlbS0+bV9zUG9zLnkgKyBwUHJlSXRlbS0+bV9zU2l6ZS55ID4gbEhlaWdodEZvcktlZXApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZUl0ZW0tPm1fc1Bvcy55ID0gbEhlaWdodEZvcktlZXA7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxIZWlnaHRGb3JLZWVwICs9IHBQcmVJdGVtLT5tX3NTaXplLnk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLnkgKz0gcFByZUl0ZW0tPm1fc1NpemUueTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNlY29uZFBhcmVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlY29uZFBhcmVudC0+bV9zU2l6ZS55ICs9IHBQcmVJdGVtLT5tX3NTaXplLnk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPkFkZENoaWxkKHBQcmVJdGVtKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSAtPSBmU3BsaXRQb3M7DQotICAgICAgICAgICAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICs9IGxIZWlnaHRGb3JLZWVwOw0KLSAgICAgICAgICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSArPSBmQWRkTWFyZ2luSGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICBwU2Vjb25kTGF5b3V0SXRlbS0+QWRkQ2hpbGQocENoaWxkSXRlbSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChmU3BsaXRQb3MgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiA+PSBmQ3VyVG9wTWFyZ2luICsgZkN1ckJvdHRvbU1hcmdpbiArIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICsgcENoaWxkSXRlbS0+bV9zU2l6ZS55KSB7DQotICAgICAgICAgICAgcExheW91dEl0ZW0tPkFkZENoaWxkKHBDaGlsZEl0ZW0pOw0KLSAgICAgICAgICAgIGlmKFhGQV9FeGlzdENvbnRhaW5lcktlZXAocENoaWxkSXRlbS0+bV9wRm9ybU5vZGUsIEZBTFNFKSkgew0KLSAgICAgICAgICAgICAgICBrZWVwTGF5b3V0SXRlbXMuQWRkKHBDaGlsZEl0ZW0pOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGtlZXBMYXlvdXRJdGVtcy5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZPbGRIZWlnaHQgPSBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KLSAgICAgICAgICAgIFNwbGl0TGF5b3V0SXRlbShwQ2hpbGRJdGVtLCBwU2Vjb25kTGF5b3V0SXRlbSwgZlNwbGl0UG9zIC0gZkN1clRvcE1hcmdpbiAtIGZDdXJCb3R0b21NYXJnaW4gLSBwQ2hpbGRJdGVtLT5tX3NQb3MueSk7DQotICAgICAgICAgICAgZkFkZE1hcmdpbkhlaWdodCA9IHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLnkgLSBmT2xkSGVpZ2h0Ow0KLSAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5BZGRDaGlsZChwQ2hpbGRJdGVtKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6U3BsaXRMYXlvdXRJdGVtKEZYX0ZMT0FUIGZTcGxpdFBvcykNCi17DQotICAgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsNCi0gICAgU3BsaXRMYXlvdXRJdGVtKG1fcExheW91dEl0ZW0sIE5VTEwsIGZTcGxpdFBvcyk7DQotICAgIHJldHVybjsNCi19DQotdm9pZCBDWEZBX0xheW91dEl0ZW1JbXBsOjpBZGRDaGlsZChDWEZBX0xheW91dEl0ZW1JbXBsICpwQ2hpbGRJdGVtKQ0KLXsNCi0gICAgaWYocENoaWxkSXRlbS0+bV9wUGFyZW50KSB7DQotICAgICAgICBwQ2hpbGRJdGVtLT5tX3BQYXJlbnQtPlJlbW92ZUNoaWxkKHBDaGlsZEl0ZW0pOw0KLSAgICB9DQotICAgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IHRoaXM7DQotICAgIGlmKG1fcEZpcnN0Q2hpbGQgPT0gTlVMTCkgew0KLSAgICAgICAgbV9wRmlyc3RDaGlsZCA9IHBDaGlsZEl0ZW07DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwRXhpc3RpbmdDaGlsZEl0ZW0gPSBtX3BGaXJzdENoaWxkOw0KLSAgICAgICAgd2hpbGUocEV4aXN0aW5nQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgICAgIHBFeGlzdGluZ0NoaWxkSXRlbSA9IHBFeGlzdGluZ0NoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgICAgICB9DQotICAgICAgICBwRXhpc3RpbmdDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcENoaWxkSXRlbTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTGF5b3V0SXRlbUltcGw6OkFkZEhlYWRDaGlsZChDWEZBX0xheW91dEl0ZW1JbXBsICpwQ2hpbGRJdGVtKQ0KLXsNCi0gICAgaWYocENoaWxkSXRlbS0+bV9wUGFyZW50KSB7DQotICAgICAgICBwQ2hpbGRJdGVtLT5tX3BQYXJlbnQtPlJlbW92ZUNoaWxkKHBDaGlsZEl0ZW0pOw0KLSAgICB9DQotICAgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IHRoaXM7DQotICAgIGlmKG1fcEZpcnN0Q2hpbGQgPT0gTlVMTCkgew0KLSAgICAgICAgbV9wRmlyc3RDaGlsZCA9IHBDaGlsZEl0ZW07DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwRXhpc3RpbmdDaGlsZEl0ZW0gPSBtX3BGaXJzdENoaWxkOw0KLSAgICAgICAgbV9wRmlyc3RDaGlsZCA9IHBDaGlsZEl0ZW07DQotICAgICAgICBtX3BGaXJzdENoaWxkLT5tX3BOZXh0U2libGluZyA9IHBFeGlzdGluZ0NoaWxkSXRlbTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTGF5b3V0SXRlbUltcGw6Okluc2VydENoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwgKnBCZWZvcmVJdGVtLCBDWEZBX0xheW91dEl0ZW1JbXBsICpwQ2hpbGRJdGVtKQ0KLXsNCi0gICAgaWYocEJlZm9yZUl0ZW0tPm1fcFBhcmVudCAhPSB0aGlzKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYocENoaWxkSXRlbS0+bV9wUGFyZW50KSB7DQotICAgICAgICBwQ2hpbGRJdGVtLT5tX3BQYXJlbnQgPSBOVUxMOw0KLSAgICB9DQotICAgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IHRoaXM7DQotICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBFeGlzdGluZ0NoaWxkSXRlbSA9IHBCZWZvcmVJdGVtLT5tX3BOZXh0U2libGluZzsNCi0gICAgcEJlZm9yZUl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcENoaWxkSXRlbTsNCi0gICAgcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBwRXhpc3RpbmdDaGlsZEl0ZW07DQotfQ0KLXZvaWQgQ1hGQV9MYXlvdXRJdGVtSW1wbDo6UmVtb3ZlQ2hpbGQoQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcENoaWxkSXRlbSkNCi17DQotICAgIGlmKHBDaGlsZEl0ZW0tPm1fcFBhcmVudCAhPSB0aGlzKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYobV9wRmlyc3RDaGlsZCA9PSBwQ2hpbGRJdGVtKSB7DQotICAgICAgICBtX3BGaXJzdENoaWxkID0gcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwRXhpc3RpbmdDaGlsZEl0ZW0gPSBtX3BGaXJzdENoaWxkOw0KLSAgICAgICAgd2hpbGUocEV4aXN0aW5nQ2hpbGRJdGVtICYmIHBFeGlzdGluZ0NoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcgIT0gcENoaWxkSXRlbSkgew0KLSAgICAgICAgICAgIHBFeGlzdGluZ0NoaWxkSXRlbSA9IHBFeGlzdGluZ0NoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgICAgICB9DQotICAgICAgICBpZihwRXhpc3RpbmdDaGlsZEl0ZW0pIHsNCi0gICAgICAgICAgICBwRXhpc3RpbmdDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgICAgICB9DQotICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3BQYXJlbnQgPSBwTGF5b3V0SXRlbS0+bV9wUGFyZW50Ow0KKyAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgIHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZyA9IHBTZWNvbmRMYXlvdXRJdGVtOw0KKyAgfQ0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDaGlsZHJlbiA9DQorICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgIHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkID0gTlVMTDsNCisgIEZYX0ZMT0FUIGxIZWlnaHRGb3JLZWVwID0gMDsNCisgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4ga2VlcExheW91dEl0ZW1zOw0KKyAgRlhfRkxPQVQgZkFkZE1hcmdpbkhlaWdodCA9IDA7DQorICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsICpwQ2hpbGRJdGVtID0gcENoaWxkcmVuLCAqcENoaWxkTmV4dCA9IE5VTEw7DQorICAgICAgIHBDaGlsZEl0ZW07IHBDaGlsZEl0ZW0gPSBwQ2hpbGROZXh0KSB7DQorICAgIHBDaGlsZE5leHQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KICAgICBwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZyA9IE5VTEw7DQotICAgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IE5VTEw7DQotfQ0KLUNYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkV4dHJhY3RMYXlvdXRJdGVtKCkNCi17DQotICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9IG1fcExheW91dEl0ZW07DQotICAgIGlmKHBMYXlvdXRJdGVtKSB7DQotICAgICAgICBtX3BMYXlvdXRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgICAgICBwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBOVUxMOw0KLSAgICB9DQotI2lmZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQotICAgIGlmIChtX25DdXJDaGlsZE5vZGVTdGFnZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lICYmIG1fcE9sZExheW91dEl0ZW0gJiYgbV9wT2xkTGF5b3V0SXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQotICAgICAgICBpZiAobV9wT2xkTGF5b3V0SXRlbS0+bV9wUHJldikgew0KLSAgICAgICAgICAgIG1fcE9sZExheW91dEl0ZW0tPm1fcFByZXYtPm1fcE5leHQgPSBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BPbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBtX3BPbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0RG9jTGF5b3V0KCk7DQotICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcE9sZExheW91dEl0ZW0gPSBtX3BPbGRMYXlvdXRJdGVtOw0KLSAgICAgICAgd2hpbGUgKHBPbGRMYXlvdXRJdGVtKSB7DQotICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBOZXh0T2xkTGF5b3V0SXRlbSA9IHBPbGRMYXlvdXRJdGVtLT5tX3BOZXh0Ow0KLSAgICAgICAgICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwgKENYRkFfTGF5b3V0SXRlbSopcE9sZExheW91dEl0ZW0sIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KLSAgICAgICAgICAgIGRlbGV0ZSBwT2xkTGF5b3V0SXRlbTsNCi0gICAgICAgICAgICBwT2xkTGF5b3V0SXRlbSA9IHBOZXh0T2xkTGF5b3V0SXRlbTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcE9sZExheW91dEl0ZW0gPSBOVUxMOw0KLSAgICB9DQotI2VuZGlmDQotICAgIHJldHVybiBwTGF5b3V0SXRlbTsNCi19DQotc3RhdGljIEZYX0JPT0wgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmluZEJyZWFrTm9kZShDWEZBX05vZGUqIHBDb250YWluZXJOb2RlLCBDWEZBX05vZGUqJiBwQ3VyQWN0aW9uTm9kZSwgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwgRlhfQk9PTCBiQnJlYWtCZWZvcmUpDQotew0KLSAgICBGWF9CT09MIGJGaW5kUnMgPSBGQUxTRTsNCi0gICAgZm9yKENYRkFfTm9kZSAqcEJyZWFrTm9kZSA9IHBDb250YWluZXJOb2RlOyBwQnJlYWtOb2RlOyBwQnJlYWtOb2RlID0gcEJyZWFrTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlVHlwZSA9IFhGQV9BVFRSSUJVVEVfQmVmb3JlOw0KLSAgICAgICAgaWYoIWJCcmVha0JlZm9yZSkgew0KLSAgICAgICAgICAgIGVBdHRyaWJ1dGVUeXBlID0gWEZBX0FUVFJJQlVURV9BZnRlcjsNCi0gICAgICAgIH0NCi0gICAgICAgIHN3aXRjaChwQnJlYWtOb2RlLT5HZXRDbGFzc0lEKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlOiB7DQotICAgICAgICAgICAgICAgICAgICBpZihiQnJlYWtCZWZvcmUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IHBCcmVha05vZGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtCZWZvcmU7DQotICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmRScyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVha0FmdGVyOiB7DQotICAgICAgICAgICAgICAgICAgICBpZighYkJyZWFrQmVmb3JlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQnJlYWtOb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQWZ0ZXI7DQotICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmRScyA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVhazoNCi0gICAgICAgICAgICAgICAgaWYocEJyZWFrTm9kZS0+R2V0RW51bShlQXR0cmlidXRlVHlwZSkgIT0gWEZBX0FUVFJJQlVURUVOVU1fQXV0bykgew0KLSAgICAgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQnJlYWtOb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtCZWZvcmU7DQotICAgICAgICAgICAgICAgICAgICBpZighYkJyZWFrQmVmb3JlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtBZnRlcjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJGaW5kUnMgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGJGaW5kUnMpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gYkZpbmRSczsNCi19DQotI2lmZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQotc3RhdGljIHZvaWQgWEZBX0RlbGV0ZUxheW91dEdlbmVyYXRlZE5vZGUoQ1hGQV9Ob2RlKiBwR2VuZXJhdGVOb2RlKQ0KLXsNCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBwR2VuZXJhdGVOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0ID0gcEdlbmVyYXRlTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0RG9jTGF5b3V0KCk7DQotICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4gc0l0ZXJhdG9yKHBHZW5lcmF0ZU5vZGUpOw0KLSAgICBmb3IoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBOb2RlOyBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ3VyTGF5b3V0SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcE5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKTsNCi0gICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTmV4dExheW91dEl0ZW0gPSBOVUxMOw0KLSAgICAgICAgd2hpbGUgKHBDdXJMYXlvdXRJdGVtKSB7DQotICAgICAgICAgICAgcE5leHRMYXlvdXRJdGVtID0gcEN1ckxheW91dEl0ZW0tPm1fcE5leHQ7DQotICAgICAgICAgICAgcE5vdGlmeS0+T25MYXlvdXRFdmVudChwRG9jTGF5b3V0LCAoQ1hGQV9MYXlvdXRJdGVtKilwQ3VyTGF5b3V0SXRlbSwgWEZBX0xBWU9VVEVWRU5UX0l0ZW1SZW1vdmluZyk7DQotICAgICAgICAgICAgZGVsZXRlIHBDdXJMYXlvdXRJdGVtOw0KLSAgICAgICAgICAgIHBDdXJMYXlvdXRJdGVtID0gcE5leHRMYXlvdXRJdGVtOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHBHZW5lcmF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLT5SZW1vdmVDaGlsZChwR2VuZXJhdGVOb2RlKTsNCi19DQotI2VuZGlmDQotdm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZShDWEZBX05vZGUqJiBwQ3VyQWN0aW9uTm9kZSwgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwgQ1hGQV9Ob2RlKiBwUGFyZW50Q29udGFpbmVyLCBGWF9CT09MIGJVc2VQYWdlQnJlYWspDQotew0KLSAgICBDWEZBX05vZGUgKnBFbnRpcmVDb250YWluZXIgPSBwUGFyZW50Q29udGFpbmVyOw0KLSAgICBDWEZBX05vZGUqIHBDaGlsZENvbnRhaW5lciA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7DQotICAgIHN3aXRjaCAobkN1clN0YWdlKSB7DQotICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQmVmb3JlOg0KLSAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0FmdGVyOiB7DQotICAgICAgICAgICAgICAgIHBDaGlsZENvbnRhaW5lciA9IHBDdXJBY3Rpb25Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgaWYgKGZTcGxpdFBvcyA8PSBmQ3VyVG9wTWFyZ2luICsgcENoaWxkSXRlbS0+bV9zUG9zLnkgKyBmQ3VyQm90dG9tTWFyZ2luICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICBpZiAoIVhGQV9FeGlzdENvbnRhaW5lcktlZXAocENoaWxkSXRlbS0+bV9wRm9ybU5vZGUsIFRSVUUpKSB7DQorICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSAtPSBmU3BsaXRQb3MgLSBmQ3VyQm90dG9tTWFyZ2luOw0KKyAgICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgKz0gbEhlaWdodEZvcktlZXA7DQorICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSArPSBmQWRkTWFyZ2luSGVpZ2h0Ow0KKyAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPkFkZENoaWxkKHBDaGlsZEl0ZW0pOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobEhlaWdodEZvcktlZXAgPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaUluZGV4ID0gMDsgaUluZGV4IDwga2VlcExheW91dEl0ZW1zLkdldFNpemUoKTsNCisgICAgICAgICAgICAgICBpSW5kZXgrKykgew0KKyAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwUHJlSXRlbSA9IGtlZXBMYXlvdXRJdGVtc1tpSW5kZXhdOw0KKyAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwUHJlSXRlbSk7DQorICAgICAgICAgICAgcFByZUl0ZW0tPm1fc1Bvcy55IC09IGZTcGxpdFBvczsNCisgICAgICAgICAgICBpZiAocFByZUl0ZW0tPm1fc1Bvcy55IDwgMCkgew0KKyAgICAgICAgICAgICAgcFByZUl0ZW0tPm1fc1Bvcy55ID0gMDsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0tlZXA6DQotICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcjoNCi0gICAgICAgICAgICBwQ2hpbGRDb250YWluZXIgPSBwQ3VyQWN0aW9uTm9kZTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcENoaWxkQ29udGFpbmVyID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBzd2l0Y2gobkN1clN0YWdlKSB7DQotICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0tlZXA6IHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwQnJlYWtBZnRlck5vZGUgPSBwQ2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgICAgICAgICAgICAgaWYoIW1fYktlZXBCcmVha0ZpbmlzaCAmJiBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GaW5kQnJlYWtOb2RlKHBCcmVha0FmdGVyTm9kZSwgcEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwgRkFMU0UpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZ290byBDaGVja05leHRDaGlsZENvbnRhaW5lcjsNCisgICAgICAgICAgICBpZiAocFByZUl0ZW0tPm1fc1Bvcy55ICsgcFByZUl0ZW0tPm1fc1NpemUueSA+IGxIZWlnaHRGb3JLZWVwKSB7DQorICAgICAgICAgICAgICBwUHJlSXRlbS0+bV9zUG9zLnkgPSBsSGVpZ2h0Rm9yS2VlcDsNCisgICAgICAgICAgICAgIGxIZWlnaHRGb3JLZWVwICs9IHBQcmVJdGVtLT5tX3NTaXplLnk7DQorICAgICAgICAgICAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS55ICs9IHBQcmVJdGVtLT5tX3NTaXplLnk7DQorICAgICAgICAgICAgICBpZiAocFNlY29uZFBhcmVudCkgew0KKyAgICAgICAgICAgICAgICBwU2Vjb25kUGFyZW50LT5tX3NTaXplLnkgKz0gcFByZUl0ZW0tPm1fc1NpemUueTsNCisgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICB9DQotICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX05vbmU6IHsNCi0gICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZExlYWRlcjoNCi0gICAgICAgICAgICAgICAgZm9yKENYRkFfTm9kZSAqcEJvb2tlbmROb2RlID0gcEN1ckFjdGlvbk5vZGUgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSA/IHBFbnRpcmVDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSA6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBCb29rZW5kTm9kZTsgcEJvb2tlbmROb2RlID0gcEJvb2tlbmROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocEJvb2tlbmROb2RlLT5HZXRDbGFzc0lEKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Jvb2tlbmQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVhazoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQm9va2VuZE5vZGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0Jvb2tlbmRMZWFkZXI7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsNCi0gICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQmVmb3JlOg0KLSAgICAgICAgICAgICAgICBpZihwQ3VyQWN0aW9uTm9kZSAhPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBCcmVha0JlZm9yZU5vZGUgPSBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFtX2JLZWVwQnJlYWtGaW5pc2ggJiYgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmluZEJyZWFrTm9kZShwQnJlYWtCZWZvcmVOb2RlLCBwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLCBUUlVFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKG1fYklzUHJvY2Vzc0tlZXApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihQcm9jZXNzS2VlcE5vZGVzRm9yQnJlYWtCZWZvcmUocEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwgcENoaWxkQ29udGFpbmVyKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gQ2hlY2tOZXh0Q2hpbGRDb250YWluZXI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IHBDaGlsZENvbnRhaW5lcjsNCi0gICAgICAgICAgICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcjsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBnb3RvIENoZWNrTmV4dENoaWxkQ29udGFpbmVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyOiB7DQotICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsNCi0gICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQWZ0ZXI6IHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDdXJBY3Rpb25Ob2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBCcmVha0FmdGVyTm9kZSA9IHBDaGlsZENvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFtX2JLZWVwQnJlYWtGaW5pc2ggJiYgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmluZEJyZWFrTm9kZShwQnJlYWtBZnRlck5vZGUsIHBDdXJBY3Rpb25Ob2RlLCBuQ3VyU3RhZ2UsIEZBTFNFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBCcmVha0FmdGVyTm9kZSA9IHBDdXJBY3Rpb25Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0ZpbmRCcmVha05vZGUocEJyZWFrQWZ0ZXJOb2RlLCBwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLCBGQUxTRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gQ2hlY2tOZXh0Q2hpbGRDb250YWluZXI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotQ2hlY2tOZXh0Q2hpbGRDb250YWluZXI6IHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwTmV4dENoaWxkQ29udGFpbmVyID0gcENoaWxkQ29udGFpbmVyID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUgPw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW50aXJlQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZywgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQotICAgICAgICAgICAgICAgIHdoaWxlKHBOZXh0Q2hpbGRDb250YWluZXIgJiYgcE5leHRDaGlsZENvbnRhaW5lci0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfTGF5b3V0R2VuZXJhdGVkTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFNhdmVOb2RlID0gcE5leHRDaGlsZENvbnRhaW5lcjsNCi0gICAgICAgICAgICAgICAgICAgIHBOZXh0Q2hpbGRDb250YWluZXIgPSBwTmV4dENoaWxkQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KLSNpZmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTYXZlTm9kZS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfRGVsZXRlTGF5b3V0R2VuZXJhdGVkTm9kZShwU2F2ZU5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKCFwTmV4dENoaWxkQ29udGFpbmVyKSB7DQotICAgICAgICAgICAgICAgICAgICBnb3RvIE5vTW9yZUNoaWxkQ29udGFpbmVyOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxhc3RLZWVwID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIGlmKFByb2Nlc3NLZWVwTm9kZXNGb3JDaGVja05leHQocEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwgcE5leHRDaGlsZENvbnRhaW5lciwgYkxhc3RLZWVwKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKCFtX2JLZWVwQnJlYWtGaW5pc2ggJiYgIWJMYXN0S2VlcCAmJiBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GaW5kQnJlYWtOb2RlKHBOZXh0Q2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSwgcEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwgVFJVRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IHBOZXh0Q2hpbGRDb250YWluZXI7DQotICAgICAgICAgICAgICAgIGlmKG1fYklzUHJvY2Vzc0tlZXApIHsNCi0gICAgICAgICAgICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0tlZXA7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi1Ob01vcmVDaGlsZENvbnRhaW5lcjogew0KLSAgICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7DQotICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kVHJhaWxlcjoNCi0gICAgICAgICAgICAgICAgZm9yKENYRkFfTm9kZSAqcEJvb2tlbmROb2RlID0gcEN1ckFjdGlvbk5vZGUgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSA/IHBFbnRpcmVDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSA6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBCb29rZW5kTm9kZTsgcEJvb2tlbmROb2RlID0gcEJvb2tlbmROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocEJvb2tlbmROb2RlLT5HZXRDbGFzc0lEKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Jvb2tlbmQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVhazoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQm9va2VuZE5vZGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0Jvb2tlbmRUcmFpbGVyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gTlVMTDsNCi0gICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzS2VlcE5vZGVzRm9yQ2hlY2tOZXh0KENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLCBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLCBDWEZBX05vZGUqJiBwTmV4dENvbnRhaW5lciwgRlhfQk9PTCYgYkxhc3RLZWVwTm9kZSkNCi17DQotICAgIEZYX0JPT0wgYkNhblNwbGl0ZSA9IHBOZXh0Q29udGFpbmVyLT5HZXRJbnRhY3QoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KLSAgICBGWF9CT09MIGJOZXh0S2VlcCA9IEZBTFNFOw0KLSAgICBpZihYRkFfRXhpc3RDb250YWluZXJLZWVwKHBOZXh0Q29udGFpbmVyLCBGQUxTRSkpIHsNCi0gICAgICAgIGJOZXh0S2VlcCA9IFRSVUU7DQotICAgIH0NCi0gICAgaWYoYk5leHRLZWVwICYmICFiQ2FuU3BsaXRlKSB7DQotICAgICAgICBpZighbV9iSXNQcm9jZXNzS2VlcCAmJiAhbV9iS2VlcEJyZWFrRmluaXNoKSB7DQotICAgICAgICAgICAgbV9wS2VlcEhlYWROb2RlID0gcE5leHRDb250YWluZXI7DQotICAgICAgICAgICAgbV9iSXNQcm9jZXNzS2VlcCA9IFRSVUU7DQorICAgICAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPkFkZENoaWxkKHBQcmVJdGVtKTsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KKyAgICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgLT0gZlNwbGl0UG9zOw0KKyAgICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgKz0gbEhlaWdodEZvcktlZXA7DQorICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSArPSBmQWRkTWFyZ2luSGVpZ2h0Ow0KKyAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPkFkZENoaWxkKHBDaGlsZEl0ZW0pOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChmU3BsaXRQb3MgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiA+PQ0KKyAgICAgICAgICAgICAgIGZDdXJUb3BNYXJnaW4gKyBmQ3VyQm90dG9tTWFyZ2luICsgcENoaWxkSXRlbS0+bV9zUG9zLnkgKw0KKyAgICAgICAgICAgICAgICAgICBwQ2hpbGRJdGVtLT5tX3NTaXplLnkpIHsNCisgICAgICBwTGF5b3V0SXRlbS0+QWRkQ2hpbGQocENoaWxkSXRlbSk7DQorICAgICAgaWYgKFhGQV9FeGlzdENvbnRhaW5lcktlZXAocENoaWxkSXRlbS0+bV9wRm9ybU5vZGUsIEZBTFNFKSkgew0KKyAgICAgICAga2VlcExheW91dEl0ZW1zLkFkZChwQ2hpbGRJdGVtKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAga2VlcExheW91dEl0ZW1zLlJlbW92ZUFsbCgpOw0KKyAgICAgIH0NCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIGlmKG1fYklzUHJvY2Vzc0tlZXAgJiYgbV9wS2VlcEhlYWROb2RlICE9IE5VTEwpIHsNCi0gICAgICAgICAgICBtX3BLZWVwVGFpbE5vZGUgPSBwTmV4dENvbnRhaW5lcjsNCi0gICAgICAgICAgICBpZighbV9iS2VlcEJyZWFrRmluaXNoICYmIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0ZpbmRCcmVha05vZGUocE5leHRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSwgcEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwgVFJVRSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcE5leHRDb250YWluZXIgPSBtX3BLZWVwSGVhZE5vZGU7DQotICAgICAgICAgICAgICAgIG1fYktlZXBCcmVha0ZpbmlzaCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIG1fcEtlZXBIZWFkTm9kZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgIG1fcEtlZXBUYWlsTm9kZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgIG1fYklzUHJvY2Vzc0tlZXAgPSBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmKG1fYktlZXBCcmVha0ZpbmlzaCkgew0KLSAgICAgICAgICAgICAgICBiTGFzdEtlZXBOb2RlID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9iS2VlcEJyZWFrRmluaXNoID0gRkFMU0U7DQorICAgICAgRlhfRkxPQVQgZk9sZEhlaWdodCA9IHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQorICAgICAgU3BsaXRMYXlvdXRJdGVtKA0KKyAgICAgICAgICBwQ2hpbGRJdGVtLCBwU2Vjb25kTGF5b3V0SXRlbSwNCisgICAgICAgICAgZlNwbGl0UG9zIC0gZkN1clRvcE1hcmdpbiAtIGZDdXJCb3R0b21NYXJnaW4gLSBwQ2hpbGRJdGVtLT5tX3NQb3MueSk7DQorICAgICAgZkFkZE1hcmdpbkhlaWdodCA9IHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLnkgLSBmT2xkSGVpZ2h0Ow0KKyAgICAgIHBMYXlvdXRJdGVtLT5BZGRDaGlsZChwQ2hpbGRJdGVtKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6U3BsaXRMYXlvdXRJdGVtKEZYX0ZMT0FUIGZTcGxpdFBvcykgew0KKyAgQVNTRVJUKG1fcExheW91dEl0ZW0pOw0KKyAgU3BsaXRMYXlvdXRJdGVtKG1fcExheW91dEl0ZW0sIE5VTEwsIGZTcGxpdFBvcyk7DQorICByZXR1cm47DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRJdGVtSW1wbDo6QWRkQ2hpbGQoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSkgew0KKyAgaWYgKHBDaGlsZEl0ZW0tPm1fcFBhcmVudCkgew0KKyAgICBwQ2hpbGRJdGVtLT5tX3BQYXJlbnQtPlJlbW92ZUNoaWxkKHBDaGlsZEl0ZW0pOw0KKyAgfQ0KKyAgcENoaWxkSXRlbS0+bV9wUGFyZW50ID0gdGhpczsNCisgIGlmIChtX3BGaXJzdENoaWxkID09IE5VTEwpIHsNCisgICAgbV9wRmlyc3RDaGlsZCA9IHBDaGlsZEl0ZW07DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwRXhpc3RpbmdDaGlsZEl0ZW0gPSBtX3BGaXJzdENoaWxkOw0KKyAgICB3aGlsZSAocEV4aXN0aW5nQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgIHBFeGlzdGluZ0NoaWxkSXRlbSA9IHBFeGlzdGluZ0NoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgIH0NCisgICAgcEV4aXN0aW5nQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZyA9IHBDaGlsZEl0ZW07DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRJdGVtSW1wbDo6QWRkSGVhZENoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwqIHBDaGlsZEl0ZW0pIHsNCisgIGlmIChwQ2hpbGRJdGVtLT5tX3BQYXJlbnQpIHsNCisgICAgcENoaWxkSXRlbS0+bV9wUGFyZW50LT5SZW1vdmVDaGlsZChwQ2hpbGRJdGVtKTsNCisgIH0NCisgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IHRoaXM7DQorICBpZiAobV9wRmlyc3RDaGlsZCA9PSBOVUxMKSB7DQorICAgIG1fcEZpcnN0Q2hpbGQgPSBwQ2hpbGRJdGVtOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcEV4aXN0aW5nQ2hpbGRJdGVtID0gbV9wRmlyc3RDaGlsZDsNCisgICAgbV9wRmlyc3RDaGlsZCA9IHBDaGlsZEl0ZW07DQorICAgIG1fcEZpcnN0Q2hpbGQtPm1fcE5leHRTaWJsaW5nID0gcEV4aXN0aW5nQ2hpbGRJdGVtOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0SXRlbUltcGw6Okluc2VydENoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwqIHBCZWZvcmVJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSkgew0KKyAgaWYgKHBCZWZvcmVJdGVtLT5tX3BQYXJlbnQgIT0gdGhpcykgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocENoaWxkSXRlbS0+bV9wUGFyZW50KSB7DQorICAgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IE5VTEw7DQorICB9DQorICBwQ2hpbGRJdGVtLT5tX3BQYXJlbnQgPSB0aGlzOw0KKyAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcEV4aXN0aW5nQ2hpbGRJdGVtID0gcEJlZm9yZUl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgcEJlZm9yZUl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcENoaWxkSXRlbTsNCisgIHBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcEV4aXN0aW5nQ2hpbGRJdGVtOw0KK30NCit2b2lkIENYRkFfTGF5b3V0SXRlbUltcGw6OlJlbW92ZUNoaWxkKENYRkFfTGF5b3V0SXRlbUltcGwqIHBDaGlsZEl0ZW0pIHsNCisgIGlmIChwQ2hpbGRJdGVtLT5tX3BQYXJlbnQgIT0gdGhpcykgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9wRmlyc3RDaGlsZCA9PSBwQ2hpbGRJdGVtKSB7DQorICAgIG1fcEZpcnN0Q2hpbGQgPSBwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBFeGlzdGluZ0NoaWxkSXRlbSA9IG1fcEZpcnN0Q2hpbGQ7DQorICAgIHdoaWxlIChwRXhpc3RpbmdDaGlsZEl0ZW0gJiYNCisgICAgICAgICAgIHBFeGlzdGluZ0NoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcgIT0gcENoaWxkSXRlbSkgew0KKyAgICAgIHBFeGlzdGluZ0NoaWxkSXRlbSA9IHBFeGlzdGluZ0NoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgIH0NCisgICAgaWYgKHBFeGlzdGluZ0NoaWxkSXRlbSkgew0KKyAgICAgIHBFeGlzdGluZ0NoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgfQ0KKyAgfQ0KKyAgcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBOVUxMOw0KKyAgcENoaWxkSXRlbS0+bV9wUGFyZW50ID0gTlVMTDsNCit9DQorQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RXh0cmFjdExheW91dEl0ZW0oKSB7DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0gPSBtX3BMYXlvdXRJdGVtOw0KKyAgaWYgKHBMYXlvdXRJdGVtKSB7DQorICAgIG1fcExheW91dEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCisgIH0NCisjaWZkZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgIGlmIChtX25DdXJDaGlsZE5vZGVTdGFnZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lICYmDQorICAgICAgbV9wT2xkTGF5b3V0SXRlbSAmJiBtX3BPbGRMYXlvdXRJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgaWYgKG1fcE9sZExheW91dEl0ZW0tPm1fcFByZXYpIHsNCisgICAgICBtX3BPbGRMYXlvdXRJdGVtLT5tX3BQcmV2LT5tX3BOZXh0ID0gTlVMTDsNCisgICAgfQ0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9DQorICAgICAgICBtX3BPbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9DQorICAgICAgICBtX3BPbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0RG9jTGF5b3V0KCk7DQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwT2xkTGF5b3V0SXRlbSA9IG1fcE9sZExheW91dEl0ZW07DQorICAgIHdoaWxlIChwT2xkTGF5b3V0SXRlbSkgew0KKyAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTmV4dE9sZExheW91dEl0ZW0gPSBwT2xkTGF5b3V0SXRlbS0+bV9wTmV4dDsNCisgICAgICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KHBEb2NMYXlvdXQsIChDWEZBX0xheW91dEl0ZW0qKXBPbGRMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xBWU9VVEVWRU5UX0l0ZW1SZW1vdmluZyk7DQorICAgICAgZGVsZXRlIHBPbGRMYXlvdXRJdGVtOw0KKyAgICAgIHBPbGRMYXlvdXRJdGVtID0gcE5leHRPbGRMYXlvdXRJdGVtOw0KKyAgICB9DQorICAgIG1fcE9sZExheW91dEl0ZW0gPSBOVUxMOw0KKyAgfQ0KKyNlbmRpZg0KKyAgcmV0dXJuIHBMYXlvdXRJdGVtOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GaW5kQnJlYWtOb2RlKA0KKyAgICBDWEZBX05vZGUqIHBDb250YWluZXJOb2RlLA0KKyAgICBDWEZBX05vZGUqJiBwQ3VyQWN0aW9uTm9kZSwNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwNCisgICAgRlhfQk9PTCBiQnJlYWtCZWZvcmUpIHsNCisgIEZYX0JPT0wgYkZpbmRScyA9IEZBTFNFOw0KKyAgZm9yIChDWEZBX05vZGUqIHBCcmVha05vZGUgPSBwQ29udGFpbmVyTm9kZTsgcEJyZWFrTm9kZTsNCisgICAgICAgcEJyZWFrTm9kZSA9IHBCcmVha05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlVHlwZSA9IFhGQV9BVFRSSUJVVEVfQmVmb3JlOw0KKyAgICBpZiAoIWJCcmVha0JlZm9yZSkgew0KKyAgICAgIGVBdHRyaWJ1dGVUeXBlID0gWEZBX0FUVFJJQlVURV9BZnRlcjsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKHBCcmVha05vZGUtPkdldENsYXNzSUQoKSkgew0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmU6IHsNCisgICAgICAgIGlmIChiQnJlYWtCZWZvcmUpIHsNCisgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQnJlYWtOb2RlOw0KKyAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0JlZm9yZTsNCisgICAgICAgICAgYkZpbmRScyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrQWZ0ZXI6IHsNCisgICAgICAgIGlmICghYkJyZWFrQmVmb3JlKSB7DQorICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJyZWFrTm9kZTsNCisgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtBZnRlcjsNCisgICAgICAgICAgYkZpbmRScyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrOg0KKyAgICAgICAgaWYgKHBCcmVha05vZGUtPkdldEVudW0oZUF0dHJpYnV0ZVR5cGUpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0F1dG8pIHsNCisgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQnJlYWtOb2RlOw0KKyAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0JlZm9yZTsNCisgICAgICAgICAgaWYgKCFiQnJlYWtCZWZvcmUpIHsNCisgICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0FmdGVyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJGaW5kUnMgPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKGJGaW5kUnMpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGJGaW5kUnM7DQorfQ0KKyNpZmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KK3N0YXRpYyB2b2lkIFhGQV9EZWxldGVMYXlvdXRHZW5lcmF0ZWROb2RlKENYRkFfTm9kZSogcEdlbmVyYXRlTm9kZSkgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBwR2VuZXJhdGVOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IHBHZW5lcmF0ZU5vZGUtPkdldERvY3VtZW50KCktPkdldERvY0xheW91dCgpOw0KKyAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlPiBzSXRlcmF0b3IoDQorICAgICAgcEdlbmVyYXRlTm9kZSk7DQorICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsNCisgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ3VyTGF5b3V0SXRlbSA9DQorICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBOb2RlLT5HZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSk7DQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTmV4dExheW91dEl0ZW0gPSBOVUxMOw0KKyAgICB3aGlsZSAocEN1ckxheW91dEl0ZW0pIHsNCisgICAgICBwTmV4dExheW91dEl0ZW0gPSBwQ3VyTGF5b3V0SXRlbS0+bV9wTmV4dDsNCisgICAgICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KHBEb2NMYXlvdXQsIChDWEZBX0xheW91dEl0ZW0qKXBDdXJMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xBWU9VVEVWRU5UX0l0ZW1SZW1vdmluZyk7DQorICAgICAgZGVsZXRlIHBDdXJMYXlvdXRJdGVtOw0KKyAgICAgIHBDdXJMYXlvdXRJdGVtID0gcE5leHRMYXlvdXRJdGVtOw0KKyAgICB9DQorICB9DQorICBwR2VuZXJhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+UmVtb3ZlQ2hpbGQocEdlbmVyYXRlTm9kZSk7DQorfQ0KKyNlbmRpZg0KK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgIENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLA0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLA0KKyAgICBDWEZBX05vZGUqIHBQYXJlbnRDb250YWluZXIsDQorICAgIEZYX0JPT0wgYlVzZVBhZ2VCcmVhaykgew0KKyAgQ1hGQV9Ob2RlKiBwRW50aXJlQ29udGFpbmVyID0gcFBhcmVudENvbnRhaW5lcjsNCisgIENYRkFfTm9kZSogcENoaWxkQ29udGFpbmVyID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsNCisgIHN3aXRjaCAobkN1clN0YWdlKSB7DQorICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtCZWZvcmU6DQorICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtBZnRlcjogew0KKyAgICAgIHBDaGlsZENvbnRhaW5lciA9IHBDdXJBY3Rpb25Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19LZWVwOg0KKyAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcjoNCisgICAgICBwQ2hpbGRDb250YWluZXIgPSBwQ3VyQWN0aW9uTm9kZTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBwQ2hpbGRDb250YWluZXIgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgc3dpdGNoIChuQ3VyU3RhZ2UpIHsNCisgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19LZWVwOiB7DQorICAgICAgQ1hGQV9Ob2RlKiBwQnJlYWtBZnRlck5vZGUgPQ0KKyAgICAgICAgICBwQ2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICBpZiAoIW1fYktlZXBCcmVha0ZpbmlzaCAmJg0KKyAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GaW5kQnJlYWtOb2RlKHBCcmVha0FmdGVyTm9kZSwgcEN1ckFjdGlvbk5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkN1clN0YWdlLCBGQUxTRSkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgZ290byBDaGVja05leHRDaGlsZENvbnRhaW5lcjsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX05vbmU6IHsNCisgICAgICBwQ3VyQWN0aW9uTm9kZSA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7DQorICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kTGVhZGVyOg0KKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBCb29rZW5kTm9kZSA9DQorICAgICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFDQorICAgICAgICAgICAgICAgICAgICAgPyBwRW50aXJlQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkNCisgICAgICAgICAgICAgICAgICAgICA6IHBDdXJBY3Rpb25Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICAgICBwQm9va2VuZE5vZGU7IHBCb29rZW5kTm9kZSA9IHBCb29rZW5kTm9kZS0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgc3dpdGNoIChwQm9va2VuZE5vZGUtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQm9va2VuZDoNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrOg0KKyAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQm9va2VuZE5vZGU7DQorICAgICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kTGVhZGVyOw0KKyAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCisgICAgICB7DQorICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7DQorICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQmVmb3JlOg0KKyAgICAgICAgICBpZiAocEN1ckFjdGlvbk5vZGUgIT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSkgew0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcEJyZWFrQmVmb3JlTm9kZSA9DQorICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICAgIGlmICghbV9iS2VlcEJyZWFrRmluaXNoICYmDQorICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0ZpbmRCcmVha05vZGUoDQorICAgICAgICAgICAgICAgICAgICBwQnJlYWtCZWZvcmVOb2RlLCBwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLCBUUlVFKSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobV9iSXNQcm9jZXNzS2VlcCkgew0KKyAgICAgICAgICAgICAgaWYgKFByb2Nlc3NLZWVwTm9kZXNGb3JCcmVha0JlZm9yZShwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hpbGRDb250YWluZXIpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGdvdG8gQ2hlY2tOZXh0Q2hpbGRDb250YWluZXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcENoaWxkQ29udGFpbmVyOw0KKyAgICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcjsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgIH0NCisgICAgICAgICAgZ290byBDaGVja05leHRDaGlsZENvbnRhaW5lcjsNCisgICAgICB9DQorICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyOiB7DQorICAgICAgcEN1ckFjdGlvbk5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOw0KKyAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtBZnRlcjogew0KKyAgICAgICAgaWYgKHBDdXJBY3Rpb25Ob2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwQnJlYWtBZnRlck5vZGUgPQ0KKyAgICAgICAgICAgICAgcENoaWxkQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgIGlmICghbV9iS2VlcEJyZWFrRmluaXNoICYmDQorICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GaW5kQnJlYWtOb2RlKA0KKyAgICAgICAgICAgICAgICAgIHBCcmVha0FmdGVyTm9kZSwgcEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwgRkFMU0UpKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBCcmVha0FmdGVyTm9kZSA9DQorICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0ZpbmRCcmVha05vZGUoDQorICAgICAgICAgICAgICAgICAgcEJyZWFrQWZ0ZXJOb2RlLCBwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLCBGQUxTRSkpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGdvdG8gQ2hlY2tOZXh0Q2hpbGRDb250YWluZXI7DQorICAgICAgfQ0KKyAgICB9DQorICAgIENoZWNrTmV4dENoaWxkQ29udGFpbmVyIDogew0KKyAgICAgIENYRkFfTm9kZSogcE5leHRDaGlsZENvbnRhaW5lciA9DQorICAgICAgICAgIHBDaGlsZENvbnRhaW5lciA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFDQorICAgICAgICAgICAgICA/IHBFbnRpcmVDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKQ0KKyAgICAgICAgICAgICAgOiBwQ2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgICAgICB3aGlsZSAocE5leHRDaGlsZENvbnRhaW5lciAmJg0KKyAgICAgICAgICAgICBwTmV4dENoaWxkQ29udGFpbmVyLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19MYXlvdXRHZW5lcmF0ZWROb2RlKSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwU2F2ZU5vZGUgPSBwTmV4dENoaWxkQ29udGFpbmVyOw0KKyAgICAgICAgcE5leHRDaGlsZENvbnRhaW5lciA9IHBOZXh0Q2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZywgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorI2lmZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQorICAgICAgICBpZiAocFNhdmVOb2RlLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KKyAgICAgICAgICBYRkFfRGVsZXRlTGF5b3V0R2VuZXJhdGVkTm9kZShwU2F2ZU5vZGUpOw0KKyAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgIH0NCisgICAgICBpZiAoIXBOZXh0Q2hpbGRDb250YWluZXIpIHsNCisgICAgICAgIGdvdG8gTm9Nb3JlQ2hpbGRDb250YWluZXI7DQorICAgICAgfQ0KKyAgICAgIEZYX0JPT0wgYkxhc3RLZWVwID0gRkFMU0U7DQorICAgICAgaWYgKFByb2Nlc3NLZWVwTm9kZXNGb3JDaGVja05leHQocEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dENoaWxkQ29udGFpbmVyLCBiTGFzdEtlZXApKSB7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIGlmICghbV9iS2VlcEJyZWFrRmluaXNoICYmICFiTGFzdEtlZXAgJiYNCisgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmluZEJyZWFrTm9kZSgNCisgICAgICAgICAgICAgIHBOZXh0Q2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSwNCisgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlLCBuQ3VyU3RhZ2UsIFRSVUUpKSB7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcE5leHRDaGlsZENvbnRhaW5lcjsNCisgICAgICBpZiAobV9iSXNQcm9jZXNzS2VlcCkgew0KKyAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfS2VlcDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyOw0KKyAgICAgIH0NCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgTm9Nb3JlQ2hpbGRDb250YWluZXIgOiB7DQorICAgICAgcEN1ckFjdGlvbk5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOw0KKyAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZFRyYWlsZXI6DQorICAgICAgICBmb3IgKENYRkFfTm9kZSogcEJvb2tlbmROb2RlID0NCisgICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUNCisgICAgICAgICAgICAgICAgICAgICA/IHBFbnRpcmVDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKQ0KKyAgICAgICAgICAgICAgICAgICAgIDogcEN1ckFjdGlvbk5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgICAgIHBCb29rZW5kTm9kZTsgcEJvb2tlbmROb2RlID0gcEJvb2tlbmROb2RlLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICBzd2l0Y2ggKHBCb29rZW5kTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Cb29rZW5kOg0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWs6DQorICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IHBCb29rZW5kTm9kZTsNCisgICAgICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0Jvb2tlbmRUcmFpbGVyOw0KKyAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGRlZmF1bHQ6DQorICAgICAgcEN1ckFjdGlvbk5vZGUgPSBOVUxMOw0KKyAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmU7DQorICB9DQogfQ0KLUZYX0JPT0wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzS2VlcE5vZGVzRm9yQnJlYWtCZWZvcmUoQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsIENYRkFfTm9kZSogcENvbnRhaW5lck5vZGUpDQotew0KLSAgICBpZihtX3BLZWVwVGFpbE5vZGUgPT0gcENvbnRhaW5lck5vZGUpIHsNCi0gICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gbV9wS2VlcEhlYWROb2RlOw0KK0ZYX0JPT0wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzS2VlcE5vZGVzRm9yQ2hlY2tOZXh0KA0KKyAgICBDWEZBX05vZGUqJiBwQ3VyQWN0aW9uTm9kZSwNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwNCisgICAgQ1hGQV9Ob2RlKiYgcE5leHRDb250YWluZXIsDQorICAgIEZYX0JPT0wmIGJMYXN0S2VlcE5vZGUpIHsNCisgIEZYX0JPT0wgYkNhblNwbGl0ZSA9IHBOZXh0Q29udGFpbmVyLT5HZXRJbnRhY3QoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgRlhfQk9PTCBiTmV4dEtlZXAgPSBGQUxTRTsNCisgIGlmIChYRkFfRXhpc3RDb250YWluZXJLZWVwKHBOZXh0Q29udGFpbmVyLCBGQUxTRSkpIHsNCisgICAgYk5leHRLZWVwID0gVFJVRTsNCisgIH0NCisgIGlmIChiTmV4dEtlZXAgJiYgIWJDYW5TcGxpdGUpIHsNCisgICAgaWYgKCFtX2JJc1Byb2Nlc3NLZWVwICYmICFtX2JLZWVwQnJlYWtGaW5pc2gpIHsNCisgICAgICBtX3BLZWVwSGVhZE5vZGUgPSBwTmV4dENvbnRhaW5lcjsNCisgICAgICBtX2JJc1Byb2Nlc3NLZWVwID0gVFJVRTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fYklzUHJvY2Vzc0tlZXAgJiYgbV9wS2VlcEhlYWROb2RlICE9IE5VTEwpIHsNCisgICAgICBtX3BLZWVwVGFpbE5vZGUgPSBwTmV4dENvbnRhaW5lcjsNCisgICAgICBpZiAoIW1fYktlZXBCcmVha0ZpbmlzaCAmJg0KKyAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GaW5kQnJlYWtOb2RlKA0KKyAgICAgICAgICAgICAgcE5leHRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSwNCisgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlLCBuQ3VyU3RhZ2UsIFRSVUUpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcE5leHRDb250YWluZXIgPSBtX3BLZWVwSGVhZE5vZGU7DQogICAgICAgICBtX2JLZWVwQnJlYWtGaW5pc2ggPSBUUlVFOw0KICAgICAgICAgbV9wS2VlcEhlYWROb2RlID0gTlVMTDsNCiAgICAgICAgIG1fcEtlZXBUYWlsTm9kZSA9IE5VTEw7DQogICAgICAgICBtX2JJc1Byb2Nlc3NLZWVwID0gRkFMU0U7DQotICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXI7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUgKnBCcmVha0FmdGVyTm9kZSA9IHBDb250YWluZXJOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgIGlmKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0ZpbmRCcmVha05vZGUocEJyZWFrQWZ0ZXJOb2RlLCBwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLCBGQUxTRSkpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKENYRkFfTm9kZSogcE5vZGUpDQotew0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlUHJlc2VuY2UgPSBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsNCi0gICAgcmV0dXJuIGVQcmVzZW5jZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlIHx8IGVQcmVzZW5jZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9JbnZpc2libGU7DQotfQ0KLXN0YXRpYyBpbmxpbmUgdm9pZCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJTcGVjZmllZFNpemUoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsIEZYX0ZMT0FUJiBmQ29udGFpbmVyV2lkdGgsIEZYX0ZMT0FUJiBmQ29udGFpbmVySGVpZ2h0LCBGWF9CT09MJiBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgRlhfQk9PTCYgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKQ0KLXsNCi0gICAgZkNvbnRhaW5lcldpZHRoID0gMDsNCi0gICAgZkNvbnRhaW5lckhlaWdodCA9IDA7DQotICAgIGJDb250YWluZXJXaWR0aEF1dG9TaXplID0gVFJVRTsNCi0gICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gVFJVRTsNCi0gICAgWEZBX0VMRU1FTlQgZUNsYXNzSUQgPSBwRm9ybU5vZGUtPkdldENsYXNzSUQoKTsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtVG1wVmFsdWU7DQotICAgIGlmKGJDb250YWluZXJXaWR0aEF1dG9TaXplICYmIChlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgJiYgcEZvcm1Ob2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVywgbVRtcFZhbHVlLCBGQUxTRSkgJiYgbVRtcFZhbHVlLkdldFZhbHVlKCkgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KLSAgICAgICAgZkNvbnRhaW5lcldpZHRoID0gbVRtcFZhbHVlLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgICAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IEZBTFNFOw0KLSAgICB9DQotICAgIGlmKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSAmJiAoZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApICYmIHBGb3JtTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0gsIG1UbXBWYWx1ZSwgRkFMU0UpICYmIG1UbXBWYWx1ZS5HZXRWYWx1ZSgpID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCi0gICAgICAgIGZDb250YWluZXJIZWlnaHQgPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IEZBTFNFOw0KLSAgICB9DQotICAgIGlmKGJDb250YWluZXJXaWR0aEF1dG9TaXplICYmIGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gJiYgcEZvcm1Ob2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWF4VywgbVRtcFZhbHVlLCBGQUxTRSkgJiYgbVRtcFZhbHVlLkdldFZhbHVlKCkgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KLSAgICAgICAgZkNvbnRhaW5lcldpZHRoID0gbVRtcFZhbHVlLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgICAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IEZBTFNFOw0KLSAgICB9DQotICAgIGlmKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSAmJiBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtICYmIHBGb3JtTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX01heEgsIG1UbXBWYWx1ZSwgRkFMU0UpICYmIG1UbXBWYWx1ZS5HZXRWYWx1ZSgpID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCi0gICAgICAgIGZDb250YWluZXJIZWlnaHQgPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IEZBTFNFOw0KLSAgICB9DQotfQ0KLXN0YXRpYyBpbmxpbmUgdm9pZCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJDb21wb25lbnRTaXplRnJvbUNvbnRlbnRTaXplDQotKENYRkFfTm9kZSogcEZvcm1Ob2RlLCBGWF9CT09MIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwgRlhfRkxPQVQmIGZDb250YWluZXJXaWR0aCwgRlhfQk9PTCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIEZYX0ZMT0FUIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgRlhfRkxPQVQmIGZDb250YWluZXJIZWlnaHQpDQotew0KLSAgICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0gcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NYXJnaW4pOw0KLSAgICBDWEZBX01lYXN1cmVtZW50IG1UbXBWYWx1ZTsNCi0gICAgaWYoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUpIHsNCi0gICAgICAgIGZDb250YWluZXJXaWR0aCA9IGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoOw0KLSAgICAgICAgaWYocE1hcmdpbk5vZGUpIHsNCi0gICAgICAgICAgICBpZihwTWFyZ2luTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwgbVRtcFZhbHVlLCBGQUxTRSkpIHsNCi0gICAgICAgICAgICAgICAgZkNvbnRhaW5lcldpZHRoICs9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihwTWFyZ2luTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQsIG1UbXBWYWx1ZSwgRkFMU0UpKSB7DQotICAgICAgICAgICAgICAgIGZDb250YWluZXJXaWR0aCArPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQotICAgICAgICBmQ29udGFpbmVySGVpZ2h0ID0gZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0Ow0KLSAgICAgICAgaWYocE1hcmdpbk5vZGUpIHsNCi0gICAgICAgICAgICBpZihwTWFyZ2luTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0LCBtVG1wVmFsdWUsIEZBTFNFKSkgew0KLSAgICAgICAgICAgICAgICBmQ29udGFpbmVySGVpZ2h0ICs9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihwTWFyZ2luTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LCBtVG1wVmFsdWUsIEZBTFNFKSkgew0KLSAgICAgICAgICAgICAgICBmQ29udGFpbmVySGVpZ2h0ICs9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6Q2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcyhDWEZBX05vZGUqIHBOb2RlLCBGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQsIEZYX0ZMT0FUJiBmQWJzb2x1dGVYLCBGWF9GTE9BVCYgZkFic29sdXRlWSkNCi17DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVBbmNob3JUeXBlID0gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlKTsNCi0gICAgaW50MzJfdCBuQW5jaG9yVHlwZSA9IDA7DQotICAgIHN3aXRjaChlQW5jaG9yVHlwZSkgew0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3BMZWZ0Og0KLSAgICAgICAgICAgIG5BbmNob3JUeXBlID0gMDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wQ2VudGVyOg0KLSAgICAgICAgICAgIG5BbmNob3JUeXBlID0gMTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wUmlnaHQ6DQotICAgICAgICAgICAgbkFuY2hvclR5cGUgPSAyOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVMZWZ0Og0KLSAgICAgICAgICAgIG5BbmNob3JUeXBlID0gMzsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlQ2VudGVyOg0KLSAgICAgICAgICAgIG5BbmNob3JUeXBlID0gNDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlUmlnaHQ6DQotICAgICAgICAgICAgbkFuY2hvclR5cGUgPSA1Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21MZWZ0Og0KLSAgICAgICAgICAgIG5BbmNob3JUeXBlID0gNjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tQ2VudGVyOg0KLSAgICAgICAgICAgIG5BbmNob3JUeXBlID0gNzsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tUmlnaHQ6DQotICAgICAgICAgICAgbkFuY2hvclR5cGUgPSA4Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBzdGF0aWMgY29uc3QgdWludDhfdCBuTmV4dFBvc1s0XVs5XSA9IHsgezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2LCAzLCAwLCA3LCA0LCAxLCA4LCA1LCAyfSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDB9LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCA1LCA4LCAxLCA0LCA3LCAwLCAzLCA2fSB9Ow0KLQ0KLSAgICBGWF9GTE9BVCBmQW5jaG9yWCA9IHBOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgRlhfRkxPQVQgZkFuY2hvclkgPSBwTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1kpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgIGludDMyX3QgblJvdGF0ZSA9IEZYU1lTX3JvdW5kKHBOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUm90YXRlKS5HZXRWYWx1ZSgpKTsNCi0gICAgblJvdGF0ZSA9IFhGQV9NYXBSb3RhdGlvbihuUm90YXRlKSAvIDkwOw0KLSAgICBpbnQzMl90IG5BYnNvbHV0ZUFuY2hvclR5cGUgPSBuTmV4dFBvc1tuUm90YXRlXVtuQW5jaG9yVHlwZV07DQotICAgIGZBYnNvbHV0ZVggPSBmQW5jaG9yWDsNCi0gICAgZkFic29sdXRlWSA9IGZBbmNob3JZOw0KLSAgICBzd2l0Y2gobkFic29sdXRlQW5jaG9yVHlwZSAvIDMpIHsNCi0gICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICBmQWJzb2x1dGVZIC09IGZIZWlnaHQgLyAyOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgIGZBYnNvbHV0ZVkgLT0gZkhlaWdodDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgc3dpdGNoKG5BYnNvbHV0ZUFuY2hvclR5cGUgJSAzKSB7DQotICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgZkFic29sdXRlWCAtPSBmV2lkdGggLyAyOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgIGZBYnNvbHV0ZVggLT0gZldpZHRoOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLX0NCi1zdGF0aWMgRlhfQk9PTCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GbG9hdEFsbW9zdEVxdWFsKEZYX0ZMT0FUIGYxLCBGWF9GTE9BVCBmMikNCi17DQotICAgIHJldHVybiBmMSA+PSBmMiAtIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OICYmIGYxIDw9IGYyICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT047DQotfQ0KLXN0YXRpYyBGWF9CT09MIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0Zsb2F0R3JlYXRlclRoYW4oRlhfRkxPQVQgZjEsIEZYX0ZMT0FUIGYyKQ0KLXsNCi0gICAgcmV0dXJuIGYxID4gZjIgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTjsNCi19DQotc3RhdGljIEZYX0JPT0wgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmxvYXRMZXNzVGhhbihGWF9GTE9BVCBmMSwgRlhfRkxPQVQgZjIpDQotew0KLSAgICByZXR1cm4gZjEgPCBmMiAtIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OOw0KLX0NCi1GWF9CT09MIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SW5jcmVtZW50UmVsYXlvdXROb2RlKENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yLCBDWEZBX05vZGUgKnBOb2RlLCBDWEZBX05vZGUgKnBQYXJlbnROb2RlKQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi12b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXRQYWdlQXJlYShDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZUFyZWFMYXlvdXRJdGVtKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlICpwRm9ybU5vZGUgPSBwUGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZTsNCi0gICAgQ1hGQV9Ob2RlICpwQ3VyQ2hpbGROb2RlID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsNCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMgbkN1ckNoaWxkTm9kZVN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfTm9uZTsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcEJlZm9yZUl0ZW0gPSBOVUxMOw0KLSAgICBmb3IoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKHBDdXJDaGlsZE5vZGUsIG5DdXJDaGlsZE5vZGVTdGFnZSwgcEZvcm1Ob2RlLCBGQUxTRSk7DQotICAgICAgICAgICAgcEN1ckNoaWxkTm9kZTsNCi0gICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUocEN1ckNoaWxkTm9kZSwgbkN1ckNoaWxkTm9kZVN0YWdlLCBwRm9ybU5vZGUsIEZBTFNFKSkgew0KLSAgICAgICAgaWYgKG5DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXIpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKHBDdXJDaGlsZE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciA9IEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocEN1ckNoaWxkTm9kZSwgTlVMTCk7DQotI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KLSAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCi0jZW5kaWYNCi0gICAgICAgIHBQcm9jZXNzb3ItPkRvTGF5b3V0KEZBTFNFLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCk7DQotICAgICAgICBpZighcFByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpKSB7DQotICAgICAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBGWF9GTE9BVCBmV2lkdGgsIGZIZWlnaHQ7DQotICAgICAgICBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KLSAgICAgICAgRlhfRkxPQVQgZkFic29sdXRlWCA9IDAsIGZBYnNvbHV0ZVkgPSAwOw0KLSAgICAgICAgQ2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcyhwQ3VyQ2hpbGROb2RlLCBmV2lkdGgsIGZIZWlnaHQsIGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KLSAgICAgICAgcFByb2Nlc3Nvci0+U2V0Q3VycmVudENvbXBvbmVudFBvcyhmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCi0gICAgICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBQcm9jZXNzSXRlbSA9IHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCk7DQotICAgICAgICBpZihwQmVmb3JlSXRlbSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgcFBhZ2VBcmVhTGF5b3V0SXRlbS0+QWRkSGVhZENoaWxkKHBQcm9jZXNzSXRlbSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPkluc2VydENoaWxkKHBCZWZvcmVJdGVtLCBwUHJvY2Vzc0l0ZW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcEJlZm9yZUl0ZW0gPSBwUHJvY2Vzc0l0ZW07DQotICAgICAgICBkZWxldGUgcFByb2Nlc3NvcjsNCi0gICAgfQ0KLSAgICBwQmVmb3JlSXRlbSA9IE5VTEw7DQotICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtID0gcFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCi0gICAgd2hpbGUgKHBMYXlvdXRJdGVtKSB7DQotICAgICAgICBpZiAoIXBMYXlvdXRJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkgfHwgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRHJhdykgew0KLSAgICAgICAgICAgIHBMYXlvdXRJdGVtID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RyYXcpIHsNCi0gICAgICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwTmV4dExheW91dEl0ZW0gPSBwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgICAgICAgICAgcFBhZ2VBcmVhTGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQocExheW91dEl0ZW0pOw0KLSAgICAgICAgICAgIGlmIChwQmVmb3JlSXRlbSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPkFkZEhlYWRDaGlsZChwTGF5b3V0SXRlbSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcFBhZ2VBcmVhTGF5b3V0SXRlbS0+SW5zZXJ0Q2hpbGQocEJlZm9yZUl0ZW0sIHBMYXlvdXRJdGVtKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcEJlZm9yZUl0ZW0gPSBwTGF5b3V0SXRlbTsNCi0gICAgICAgICAgICBwTGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0SXRlbTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXRQb3NpdGlvbmVkQ29udGFpbmVyKENYRkFfTGF5b3V0Q29udGV4dCogcENvbnRleHQpDQotew0KLSAgICBpZihtX3BMYXlvdXRJdGVtICE9IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOw0KLSAgICBGWF9CT09MIGJJZ25vcmVYWSA9IChtX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24pOw0KLSAgICBGWF9GTE9BVCBmQ29udGFpbmVyV2lkdGggPSAwLCBmQ29udGFpbmVySGVpZ2h0ID0gMDsNCi0gICAgRlhfQk9PTCAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBUUlVFLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBUUlVFOw0KLSAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJTcGVjZmllZFNpemUobV9wRm9ybU5vZGUsIGZDb250YWluZXJXaWR0aCwgZkNvbnRhaW5lckhlaWdodCwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSk7DQotICAgIEZYX0ZMT0FUIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gMCwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gMDsNCi0gICAgRlhfRkxPQVQgZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwLCBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOw0KLSAgICBpZihtX3BDdXJDaGlsZE5vZGUgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSkgew0KLSAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBGQUxTRSk7DQotICAgIH0NCi0gICAgaW50MzJfdCBpQ29sSW5kZXggPSAwOw0KLSAgICBmb3IoOyBtX3BDdXJDaGlsZE5vZGU7IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZShtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgRkFMU0UpKSB7DQotICAgICAgICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZihtX3BDdXJDaGlsZE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciA9IEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IobV9wQ3VyQ2hpbGROb2RlLCBtX3BQYWdlTWdyKTsNCi0jaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQotICAgICAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IG1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KLSNlbmRpZg0KLSAgICAgICAgaWYgKHBDb250ZXh0ICYmIHBDb250ZXh0LT5tX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocykgew0KLSAgICAgICAgICAgIGludDMyX3QgaUNvbFNwYW4gPSBtX3BDdXJDaGlsZE5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuKTsNCi0gICAgICAgICAgICBpZiAoaUNvbFNwYW4gPD0gcENvbnRleHQtPm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLT5HZXRTaXplKCkgLSBpQ29sSW5kZXgpIHsNCi0gICAgICAgICAgICAgICAgcENvbnRleHQtPm1fZkN1ckNvbHVtbldpZHRoID0gMDsNCi0gICAgICAgICAgICAgICAgcENvbnRleHQtPm1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBpZihpQ29sU3BhbiA9PSAtMSkgew0KLSAgICAgICAgICAgICAgICAgICAgaUNvbFNwYW4gPSBwQ29udGV4dC0+bV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMtPkdldFNpemUoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ29sU3BhbjsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bV9mQ3VyQ29sdW1uV2lkdGggKz0gcENvbnRleHQtPm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLT5HZXRBdChpQ29sSW5kZXggKyBpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+bV9mQ3VyQ29sdW1uV2lkdGggPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpQ29sSW5kZXggKz0gaUNvbFNwYW47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcFByb2Nlc3Nvci0+RG9MYXlvdXQoRkFMU0UsIFhGQV9MQVlPVVRfRkxPQVRfTUFYLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgcENvbnRleHQpOw0KLSAgICAgICAgaWYoIXBQcm9jZXNzb3ItPkhhc0xheW91dEl0ZW0oKSkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRkxPQVQgZldpZHRoLCBmSGVpZ2h0Ow0KLSAgICAgICAgcFByb2Nlc3Nvci0+R2V0Q3VycmVudENvbXBvbmVudFNpemUoZldpZHRoLCBmSGVpZ2h0KTsNCi0gICAgICAgIEZYX0JPT0wgYkNoYW5nZVBhcmVudFNpemUgPSBGQUxTRTsNCi0gICAgICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKG1fcEN1ckNoaWxkTm9kZSkpIHsNCi0gICAgICAgICAgICBiQ2hhbmdlUGFyZW50U2l6ZSA9IFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBGWF9GTE9BVCBmQWJzb2x1dGVYID0gMCwgZkFic29sdXRlWSA9IDA7DQotICAgICAgICBpZighYklnbm9yZVhZKSB7DQotICAgICAgICAgICAgQ2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcyhtX3BDdXJDaGlsZE5vZGUsIGZXaWR0aCwgZkhlaWdodCwgZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQotICAgICAgICB9DQotICAgICAgICBwUHJvY2Vzc29yLT5TZXRDdXJyZW50Q29tcG9uZW50UG9zKGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KLSAgICAgICAgaWYoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUpIHsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmQ2hpbGRTdXBwbGllZFdpZHRoID0gZkFic29sdXRlWCArIGZXaWR0aDsNCi0gICAgICAgICAgICBpZihiQ2hhbmdlUGFyZW50U2l6ZSkgew0KLSAgICAgICAgICAgICAgICBpZihmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA8IGZDaGlsZFN1cHBsaWVkV2lkdGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkNoaWxkU3VwcGxpZWRXaWR0aDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmKGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZFdpZHRoIDwgZkNoaWxkU3VwcGxpZWRXaWR0aCAmJiBtX3BDdXJDaGlsZE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQotICAgICAgICAgICAgICAgICAgICBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGZDaGlsZFN1cHBsaWVkV2lkdGg7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZihiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCi0gICAgICAgICAgICBGWF9GTE9BVCBmQ2hpbGRTdXBwbGllZEhlaWdodCA9IGZBYnNvbHV0ZVkgKyBmSGVpZ2h0Ow0KLSAgICAgICAgICAgIGlmKGJDaGFuZ2VQYXJlbnRTaXplKSB7DQotICAgICAgICAgICAgICAgIGlmKGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA8IGZDaGlsZFN1cHBsaWVkSGVpZ2h0KSB7DQotICAgICAgICAgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmQ2hpbGRTdXBwbGllZEhlaWdodDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmKGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZEhlaWdodCA8IGZDaGlsZFN1cHBsaWVkSGVpZ2h0ICYmIG1fcEN1ckNoaWxkTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCi0gICAgICAgICAgICAgICAgICAgIGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IGZDaGlsZFN1cHBsaWVkSGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7DQotICAgICAgICBkZWxldGUgcFByb2Nlc3NvcjsNCi0gICAgfQ0KLSAgICBYRkFfVkVSU0lPTiBlVmVyc2lvbiA9IG1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpLT5HZXRDdXJWZXJzaW9uTW9kZSgpOw0KLSAgICBpZihmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9PSAwICYmIGVWZXJzaW9uIDwgWEZBX1ZFUlNJT05fMjA3KSB7DQotICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZFdpZHRoOw0KLSAgICB9DQotICAgIGlmKGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9PSAwICYmIGVWZXJzaW9uIDwgWEZBX1ZFUlNJT05fMjA3KSB7DQotICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQ7DQotICAgIH0NCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyQ29tcG9uZW50U2l6ZUZyb21Db250ZW50U2l6ZShtX3BGb3JtTm9kZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLCBmQ29udGFpbmVyV2lkdGgsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LCBmQ29udGFpbmVySGVpZ2h0KTsNCi0gICAgU2V0Q3VycmVudENvbXBvbmVudFNpemUoZkNvbnRhaW5lcldpZHRoLCBmQ29udGFpbmVySGVpZ2h0KTsNCi19DQotc3RhdGljIGlubGluZSB2b2lkIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX1VwZGF0ZVdpZGdldFNpemUoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtLCBGWF9GTE9BVCYgZldpZHRoLCBGWF9GTE9BVCYgZkhlaWdodCkNCi17DQotICAgIENYRkFfTm9kZSAqcE5vZGUgPSBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGU7DQotICAgIEFTU0VSVChwTm9kZSk7DQotICAgIFhGQV9FTEVNRU5UIGVDbGFzc0lEID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCi0gICAgc3dpdGNoKGVDbGFzc0lEKSB7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0FyZWE6DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybVNldDogew0KLSAgICAgICAgICAgICAgICBpZihmV2lkdGggPCAtWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCi0gICAgICAgICAgICAgICAgICAgIGZXaWR0aCA9IHBMYXlvdXRJdGVtLT5tX3NTaXplLng7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYoZkhlaWdodCA8IC1YRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KLSAgICAgICAgICAgICAgICAgICAgZkhlaWdodCA9IHBMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EcmF3Og0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9GaWVsZDogew0KLSAgICAgICAgICAgICAgICBwTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpLT5TdGFydEZpZWxkRHJhd0xheW91dChwTm9kZSwgZldpZHRoLCBmSGVpZ2h0KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBBU1NFUlQoRkFMU0UpOw0KLSAgICB9DQotfQ0KLXN0YXRpYyBpbmxpbmUgdm9pZCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9SZWxvY2F0ZVRhYmxlUm93Q2VsbHMoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRSb3csIGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiYgcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMsIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQpDQotew0KLSAgICBGWF9GTE9BVCBmQ29udGFpbmVyV2lkdGggPSAwLCBmQ29udGFpbmVySGVpZ2h0ID0gMDsNCi0gICAgRlhfQk9PTCAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBUUlVFLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBUUlVFOw0KLSAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJTcGVjZmllZFNpemUocExheW91dFJvdy0+bV9wRm9ybU5vZGUsIGZDb250YWluZXJXaWR0aCwgZkNvbnRhaW5lckhlaWdodCwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSk7DQotICAgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPSBwTGF5b3V0Um93LT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCi0gICAgRlhfRkxPQVQgZkxlZnRJbnNldCA9IDAsIGZUb3BJbnNldCA9IDAsIGZSaWdodEluc2V0ID0gMCwgZkJvdHRvbUluc2V0ID0gMDsNCi0gICAgaWYocE1hcmdpbk5vZGUpIHsNCi0gICAgICAgIGZMZWZ0SW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgIGZUb3BJbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgICAgICBmUmlnaHRJbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgIGZCb3R0b21JbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aExpbWl0ID0gYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPyBYRkFfTEFZT1VUX0ZMT0FUX01BWCA6IGZDb250YWluZXJXaWR0aCAtIGZMZWZ0SW5zZXQgLSBmUmlnaHRJbnNldDsNCi0gICAgRlhfRkxPQVQgZkNvbnRlbnRDdXJyZW50SGVpZ2h0ID0gcExheW91dFJvdy0+bV9zU2l6ZS55IC0gZlRvcEluc2V0IC0gZkJvdHRvbUluc2V0Ow0KLSAgICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IDAsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IDA7DQotICAgIEZYX0ZMT0FUIGZDdXJyZW50Q29sWCA9IDA7DQotICAgIGludDMyX3QgbkN1cnJlbnRDb2xJZHggPSAwOw0KLSAgICBGWF9CT09MICBiTWV0V2hvbGVSb3dDZWxsID0gRkFMU0U7DQotICAgIGZvcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Um93LT5tX3BGaXJzdENoaWxkOyBwTGF5b3V0Q2hpbGQ7IHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgaW50MzJfdCBuT3JpZ2luYWxDb2xTcGFuID0gcExheW91dENoaWxkLT5tX3BGb3JtTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0NvbFNwYW4pOw0KLSAgICAgICAgaW50MzJfdCBuQ29sU3BhbiA9IG5PcmlnaW5hbENvbFNwYW47DQotICAgICAgICBGWF9GTE9BVCBmQ29sU3BhbldpZHRoID0gMDsNCi0gICAgICAgIGlmKG5Db2xTcGFuID09IC0xIHx8IG5DdXJyZW50Q29sSWR4ICsgbkNvbFNwYW4gPiByZ1NwZWNpZmllZENvbHVtbldpZHRocy5HZXRTaXplKCkpIHsNCi0gICAgICAgICAgICBuQ29sU3BhbiA9IHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLkdldFNpemUoKSAtIG5DdXJyZW50Q29sSWR4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBuQ29sU3BhbjsgaSArKykgew0KLSAgICAgICAgICAgIGZDb2xTcGFuV2lkdGggKz0gcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbbkN1cnJlbnRDb2xJZHggKyBpXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChuQ29sU3BhbiAhPSBuT3JpZ2luYWxDb2xTcGFuKSB7DQotICAgICAgICAgICAgZkNvbFNwYW5XaWR0aCA9IGJNZXRXaG9sZVJvd0NlbGwgPyAwIDogRlhfTUFYKGZDb2xTcGFuV2lkdGgsIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS55KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKG5PcmlnaW5hbENvbFNwYW4gPT0gLTEpIHsNCi0gICAgICAgICAgICBiTWV0V2hvbGVSb3dDZWxsID0gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLlNldChmQ3VycmVudENvbFgsIDApOw0KLSAgICAgICAgcExheW91dENoaWxkLT5tX3NTaXplLnggPSBmQ29sU3BhbldpZHRoOw0KLSAgICAgICAgaWYoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlKSkgew0KLSAgICAgICAgICAgIGZDdXJyZW50Q29sWCArPSBmQ29sU3BhbldpZHRoOw0KLSAgICAgICAgICAgIG5DdXJyZW50Q29sSWR4ICs9IG5Db2xTcGFuOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZOZXdIZWlnaHQgPSBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPyAtMSA6IGZDb250ZW50Q3VycmVudEhlaWdodDsNCi0gICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9VcGRhdGVXaWRnZXRTaXplKHBMYXlvdXRDaGlsZCwgZkNvbFNwYW5XaWR0aCwgZk5ld0hlaWdodCk7DQotICAgICAgICAgICAgcExheW91dENoaWxkLT5tX3NTaXplLnkgPSBmTmV3SGVpZ2h0Ow0KLSAgICAgICAgICAgIGlmKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgew0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ2hpbGRTdXBwbGllZEhlaWdodCA9IHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS55Ow0KLSAgICAgICAgICAgICAgICBpZihmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPCBmQ2hpbGRTdXBwbGllZEhlaWdodCkgew0KLSAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZkNoaWxkU3VwcGxpZWRIZWlnaHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQotICAgICAgICBmb3IoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dFJvdy0+bV9wRmlyc3RDaGlsZDsgcExheW91dENoaWxkOyBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsNCi0gICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9VcGRhdGVXaWRnZXRTaXplKHBMYXlvdXRDaGlsZCwgcExheW91dENoaWxkLT5tX3NTaXplLngsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCk7DQotICAgICAgICAgICAgRlhfRkxPQVQgZk9sZENoaWxkSGVpZ2h0ID0gcExheW91dENoaWxkLT5tX3NTaXplLnk7DQotICAgICAgICAgICAgcExheW91dENoaWxkLT5tX3NTaXplLnkgPSBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQ7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyYU5vZGUgPSBwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9QYXJhKTsNCi0gICAgICAgICAgICBpZihwUGFyYU5vZGUgJiYgcExheW91dENoaWxkLT5tX3BGaXJzdENoaWxkKSB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZPZmZIZWlnaHQgPSBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgLSBmT2xkQ2hpbGRIZWlnaHQ7DQotICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVWVHlwZSA9IHBQYXJhTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ZBbGlnbik7DQotICAgICAgICAgICAgICAgIHN3aXRjaChlVlR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZPZmZIZWlnaHQgPSBmT2ZmSGVpZ2h0IC8gMjsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZPZmZIZWlnaHQgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKGZPZmZIZWlnaHQgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBJbm5lckxheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Q2hpbGQtPm1fcEZpcnN0Q2hpbGQ7IHBJbm5lckxheW91dENoaWxkOyBwSW5uZXJMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcElubmVyTGF5b3V0Q2hpbGQtPm1fcE5leHRTaWJsaW5nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcElubmVyTGF5b3V0Q2hpbGQtPm1fc1Bvcy55ICs9IGZPZmZIZWlnaHQ7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUpIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZDaGlsZFN1cHBsaWVkV2lkdGggPSBmQ3VycmVudENvbFg7DQotICAgICAgICBpZihmQ29udGVudFdpZHRoTGltaXQgPCBYRkFfTEFZT1VUX0ZMT0FUX01BWCAmJiBmQ29udGVudFdpZHRoTGltaXQgPiBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7DQotICAgICAgICAgICAgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDb250ZW50V2lkdGhMaW1pdDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA8IGZDaGlsZFN1cHBsaWVkV2lkdGgpIHsNCi0gICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGZDaGlsZFN1cHBsaWVkV2lkdGg7DQotICAgICAgICB9DQorICAgICAgfQ0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmQ29udGFpbmVyV2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQ7DQorICAgICAgaWYgKG1fYktlZXBCcmVha0ZpbmlzaCkgew0KKyAgICAgICAgYkxhc3RLZWVwTm9kZSA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIG1fYktlZXBCcmVha0ZpbmlzaCA9IEZBTFNFOw0KICAgICB9DQotICAgIGlmKHBMYXlvdXRSb3ctPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KSA9PSBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3cpIHsNCi0gICAgICAgIGZvcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Um93LT5tX3BGaXJzdENoaWxkOyBwTGF5b3V0Q2hpbGQ7IHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggPSBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCAtIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggLSBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJDb21wb25lbnRTaXplRnJvbUNvbnRlbnRTaXplKHBMYXlvdXRSb3ctPm1fcEZvcm1Ob2RlLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIGZDb250YWluZXJXaWR0aCwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIGZDb250YWluZXJIZWlnaHQpOw0KLSAgICBwTGF5b3V0Um93LT5tX3NTaXplLlNldChmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi12b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXRUYWJsZUNvbnRhaW5lcihDWEZBX05vZGUqIHBMYXlvdXROb2RlKQ0KLXsNCi0gICAgaWYobV9wTGF5b3V0SXRlbSAhPSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQorRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlByb2Nlc3NLZWVwTm9kZXNGb3JCcmVha0JlZm9yZSgNCisgICAgQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsDQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsDQorICAgIENYRkFfTm9kZSogcENvbnRhaW5lck5vZGUpIHsNCisgIGlmIChtX3BLZWVwVGFpbE5vZGUgPT0gcENvbnRhaW5lck5vZGUpIHsNCisgICAgcEN1ckFjdGlvbk5vZGUgPSBtX3BLZWVwSGVhZE5vZGU7DQorICAgIG1fYktlZXBCcmVha0ZpbmlzaCA9IFRSVUU7DQorICAgIG1fcEtlZXBIZWFkTm9kZSA9IE5VTEw7DQorICAgIG1fcEtlZXBUYWlsTm9kZSA9IE5VTEw7DQorICAgIG1fYklzUHJvY2Vzc0tlZXAgPSBGQUxTRTsNCisgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIENYRkFfTm9kZSogcEJyZWFrQWZ0ZXJOb2RlID0NCisgICAgICBwQ29udGFpbmVyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0ZpbmRCcmVha05vZGUocEJyZWFrQWZ0ZXJOb2RlLCBwQ3VyQWN0aW9uTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DdXJTdGFnZSwgRkFMU0UpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZVByZXNlbmNlID0gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSk7DQorICByZXR1cm4gZVByZXNlbmNlID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUgfHwNCisgICAgICAgICBlUHJlc2VuY2UgPT0gWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlOw0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2ZpZWRTaXplKA0KKyAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSwNCisgICAgRlhfRkxPQVQmIGZDb250YWluZXJXaWR0aCwNCisgICAgRlhfRkxPQVQmIGZDb250YWluZXJIZWlnaHQsDQorICAgIEZYX0JPT0wmIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICBGWF9CT09MJiBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCisgIGZDb250YWluZXJXaWR0aCA9IDA7DQorICBmQ29udGFpbmVySGVpZ2h0ID0gMDsNCisgIGJDb250YWluZXJXaWR0aEF1dG9TaXplID0gVFJVRTsNCisgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IFRSVUU7DQorICBYRkFfRUxFTUVOVCBlQ2xhc3NJRCA9IHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtVG1wVmFsdWU7DQorICBpZiAoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgJiYNCisgICAgICAoZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApICYmDQorICAgICAgcEZvcm1Ob2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVywgbVRtcFZhbHVlLCBGQUxTRSkgJiYNCisgICAgICBtVG1wVmFsdWUuR2V0VmFsdWUoKSA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgIGZDb250YWluZXJXaWR0aCA9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSAmJg0KKyAgICAgIChlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgJiYNCisgICAgICBwRm9ybU5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9ILCBtVG1wVmFsdWUsIEZBTFNFKSAmJg0KKyAgICAgIG1UbXBWYWx1ZS5HZXRWYWx1ZSgpID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgZkNvbnRhaW5lckhlaWdodCA9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBGQUxTRTsNCisgIH0NCisgIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSAmJiBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtICYmDQorICAgICAgcEZvcm1Ob2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWF4VywgbVRtcFZhbHVlLCBGQUxTRSkgJiYNCisgICAgICBtVG1wVmFsdWUuR2V0VmFsdWUoKSA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgIGZDb250YWluZXJXaWR0aCA9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSAmJiBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtICYmDQorICAgICAgcEZvcm1Ob2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWF4SCwgbVRtcFZhbHVlLCBGQUxTRSkgJiYNCisgICAgICBtVG1wVmFsdWUuR2V0VmFsdWUoKSA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgIGZDb250YWluZXJIZWlnaHQgPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gRkFMU0U7DQorICB9DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZA0KK1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0NhbGN1bGF0ZUNvbnRhaW5lckNvbXBvbmVudFNpemVGcm9tQ29udGVudFNpemUoDQorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICBGWF9CT09MIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwNCisgICAgRlhfRkxPQVQmIGZDb250YWluZXJXaWR0aCwNCisgICAgRlhfQk9PTCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsDQorICAgIEZYX0ZMT0FUIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwNCisgICAgRlhfRkxPQVQmIGZDb250YWluZXJIZWlnaHQpIHsNCisgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPSBwRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX01hcmdpbik7DQorICBDWEZBX01lYXN1cmVtZW50IG1UbXBWYWx1ZTsNCisgIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgew0KKyAgICBmQ29udGFpbmVyV2lkdGggPSBmQ29udGVudENhbGN1bGF0ZWRXaWR0aDsNCisgICAgaWYgKHBNYXJnaW5Ob2RlKSB7DQorICAgICAgaWYgKHBNYXJnaW5Ob2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LCBtVG1wVmFsdWUsIEZBTFNFKSkgew0KKyAgICAgICAgZkNvbnRhaW5lcldpZHRoICs9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgIH0NCisgICAgICBpZiAocE1hcmdpbk5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LCBtVG1wVmFsdWUsIEZBTFNFKSkgew0KKyAgICAgICAgZkNvbnRhaW5lcldpZHRoICs9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZihwTGF5b3V0Tm9kZSA9PSBOVUxMKSB7DQotICAgICAgICBwTGF5b3V0Tm9kZSA9IG1fcEZvcm1Ob2RlOw0KKyAgfQ0KKyAgaWYgKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgew0KKyAgICBmQ29udGFpbmVySGVpZ2h0ID0gZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0Ow0KKyAgICBpZiAocE1hcmdpbk5vZGUpIHsNCisgICAgICBpZiAocE1hcmdpbk5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgbVRtcFZhbHVlLCBGQUxTRSkpIHsNCisgICAgICAgIGZDb250YWluZXJIZWlnaHQgKz0gbVRtcFZhbHVlLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwTWFyZ2luTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LCBtVG1wVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKSkgew0KKyAgICAgICAgZkNvbnRhaW5lckhlaWdodCArPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICB9DQogICAgIH0NCi0gICAgQVNTRVJUKG1fcEN1ckNoaWxkTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKTsNCi0gICAgbV9wTGF5b3V0SXRlbSA9IENyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKG1fcEZvcm1Ob2RlKTsNCi0gICAgRlhfRkxPQVQgZkNvbnRhaW5lcldpZHRoID0gMCwgZkNvbnRhaW5lckhlaWdodCA9IDA7DQotICAgIEZYX0JPT0wgIGJDb250YWluZXJXaWR0aEF1dG9TaXplID0gVFJVRSwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gVFJVRTsNCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2ZpZWRTaXplKG1fcEZvcm1Ob2RlLCBmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpOw0KLSAgICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IDAsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IDA7DQotICAgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPSBtX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCi0gICAgRlhfRkxPQVQgZkxlZnRJbnNldCA9IDAsIGZUb3BJbnNldCA9IDAsIGZSaWdodEluc2V0ID0gMCwgZkJvdHRvbUluc2V0ID0gMDsNCi0gICAgaWYocE1hcmdpbk5vZGUpIHsNCi0gICAgICAgIGZMZWZ0SW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgIGZUb3BJbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgICAgICBmUmlnaHRJbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgIGZCb3R0b21JbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpDYWxjdWxhdGVQb3NpdGlvbmVkQ29udGFpbmVyUG9zKA0KKyAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICBGWF9GTE9BVCBmV2lkdGgsDQorICAgIEZYX0ZMT0FUIGZIZWlnaHQsDQorICAgIEZYX0ZMT0FUJiBmQWJzb2x1dGVYLA0KKyAgICBGWF9GTE9BVCYgZkFic29sdXRlWSkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUFuY2hvclR5cGUgPSBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUpOw0KKyAgaW50MzJfdCBuQW5jaG9yVHlwZSA9IDA7DQorICBzd2l0Y2ggKGVBbmNob3JUeXBlKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDA7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wQ2VudGVyOg0KKyAgICAgIG5BbmNob3JUeXBlID0gMTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3BSaWdodDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlTGVmdDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDM7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlQ2VudGVyOg0KKyAgICAgIG5BbmNob3JUeXBlID0gNDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVSaWdodDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDU7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tTGVmdDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDY7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tQ2VudGVyOg0KKyAgICAgIG5BbmNob3JUeXBlID0gNzsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21SaWdodDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDg7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBzdGF0aWMgY29uc3QgdWludDhfdCBuTmV4dFBvc1s0XVs5XSA9IHt7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOH0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NiwgMywgMCwgNywgNCwgMSwgOCwgNSwgMn0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMH0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwgNSwgOCwgMSwgNCwgNywgMCwgMywgNn19Ow0KKw0KKyAgRlhfRkxPQVQgZkFuY2hvclggPSBwTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1gpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICBGWF9GTE9BVCBmQW5jaG9yWSA9IHBOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgIGludDMyX3QgblJvdGF0ZSA9DQorICAgICAgRlhTWVNfcm91bmQocE5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Sb3RhdGUpLkdldFZhbHVlKCkpOw0KKyAgblJvdGF0ZSA9IFhGQV9NYXBSb3RhdGlvbihuUm90YXRlKSAvIDkwOw0KKyAgaW50MzJfdCBuQWJzb2x1dGVBbmNob3JUeXBlID0gbk5leHRQb3NbblJvdGF0ZV1bbkFuY2hvclR5cGVdOw0KKyAgZkFic29sdXRlWCA9IGZBbmNob3JYOw0KKyAgZkFic29sdXRlWSA9IGZBbmNob3JZOw0KKyAgc3dpdGNoIChuQWJzb2x1dGVBbmNob3JUeXBlIC8gMykgew0KKyAgICBjYXNlIDE6DQorICAgICAgZkFic29sdXRlWSAtPSBmSGVpZ2h0IC8gMjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIGZBYnNvbHV0ZVkgLT0gZkhlaWdodDsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHN3aXRjaCAobkFic29sdXRlQW5jaG9yVHlwZSAlIDMpIHsNCisgICAgY2FzZSAxOg0KKyAgICAgIGZBYnNvbHV0ZVggLT0gZldpZHRoIC8gMjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIGZBYnNvbHV0ZVggLT0gZldpZHRoOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GbG9hdEFsbW9zdEVxdWFsKEZYX0ZMT0FUIGYxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZjIpIHsNCisgIHJldHVybiBmMSA+PSBmMiAtIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OICYmDQorICAgICAgICAgZjEgPD0gZjIgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTjsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmxvYXRHcmVhdGVyVGhhbihGWF9GTE9BVCBmMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGYyKSB7DQorICByZXR1cm4gZjEgPiBmMiArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GbG9hdExlc3NUaGFuKEZYX0ZMT0FUIGYxLCBGWF9GTE9BVCBmMikgew0KKyAgcmV0dXJuIGYxIDwgZjIgLSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTjsNCit9DQorRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkluY3JlbWVudFJlbGF5b3V0Tm9kZSgNCisgICAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm9jZXNzb3IsDQorICAgIENYRkFfTm9kZSogcE5vZGUsDQorICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0UGFnZUFyZWEoDQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYWdlQXJlYUxheW91dEl0ZW0pIHsNCisgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gcFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGU7DQorICBDWEZBX05vZGUqIHBDdXJDaGlsZE5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOw0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMgbkN1ckNoaWxkTm9kZVN0YWdlID0NCisgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Ob25lOw0KKyAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcEJlZm9yZUl0ZW0gPSBOVUxMOw0KKyAgZm9yIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgICAgICAgICBwQ3VyQ2hpbGROb2RlLCBuQ3VyQ2hpbGROb2RlU3RhZ2UsIHBGb3JtTm9kZSwgRkFMU0UpOw0KKyAgICAgICBwQ3VyQ2hpbGROb2RlOyBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgICAgICAgICBwQ3VyQ2hpbGROb2RlLCBuQ3VyQ2hpbGROb2RlU3RhZ2UsIHBGb3JtTm9kZSwgRkFMU0UpKSB7DQorICAgIGlmIChuQ3VyQ2hpbGROb2RlU3RhZ2UgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aExpbWl0ID0gYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPyBYRkFfTEFZT1VUX0ZMT0FUX01BWCA6IGZDb250YWluZXJXaWR0aCAtIGZMZWZ0SW5zZXQgLSBmUmlnaHRJbnNldDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29sdW1uV2lkdGhzOw0KLSAgICBpZiAocExheW91dE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQ29sdW1uV2lkdGhzLCB3c0NvbHVtbldpZHRocykpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd2lkdGhzOw0KLSAgICAgICAgaWYgKEZYX1NlcGFyYXRlU3RyaW5nVyh3c0NvbHVtbldpZHRocy5HZXRQdHIoKSwgd3NDb2x1bW5XaWR0aHMuR2V0TGVuZ3RoKCksIEwnICcsIHdpZHRocykgPiAwKSB7DQotICAgICAgICAgICAgaW50MzJfdCBpQ29scyA9IHdpZHRocy5HZXRTaXplKCk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXaWR0aDsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ29sczsgaSsrKSB7DQotICAgICAgICAgICAgICAgIHdzV2lkdGggPSB3aWR0aHNbaV07DQotICAgICAgICAgICAgICAgIHdzV2lkdGguVHJpbUxlZnQoTCcgJyk7DQotICAgICAgICAgICAgICAgIGlmICghd3NXaWR0aC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQgbWVhc3VyZSh3c1dpZHRoKTsNCi0gICAgICAgICAgICAgICAgICAgIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMuQWRkKG1lYXN1cmUuVG9Vbml0KFhGQV9VTklUX1B0KSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICAgIGlmIChwQ3VyQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgaW50MzJfdCBpU3BlY2lmaWVkQ29sdW1uQ291bnQgPSBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLkdldFNpemUoKTsNCi0gICAgQ1hGQV9MYXlvdXRDb250ZXh0IGxheW91dENvbnRleHQ7DQotICAgIGxheW91dENvbnRleHQubV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMgPSAmbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoczsNCi0gICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwTGF5b3V0Q29udGV4dCA9IGlTcGVjaWZpZWRDb2x1bW5Db3VudCA+IDAgID8gJmxheW91dENvbnRleHQgOiBOVUxMOw0KLSAgICBpZihtX3BDdXJDaGlsZE5vZGUgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSkgew0KLSAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBGQUxTRSk7DQotICAgIH0NCi0gICAgZm9yKDsgbV9wQ3VyQ2hpbGROb2RlOyBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUobV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsIEZBTFNFKSkgew0KLSAgICAgICAgbGF5b3V0Q29udGV4dC5tX2JDdXJDb2x1bW5XaWR0aEF2YWlhYmxlID0gRkFMU0U7DQotICAgICAgICBsYXlvdXRDb250ZXh0Lm1fZkN1ckNvbHVtbldpZHRoID0gMDsNCi0gICAgICAgIGlmIChtX25DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXIpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciA9IEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IobV9wQ3VyQ2hpbGROb2RlLCBtX3BQYWdlTWdyKTsNCisgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yID0NCisgICAgICAgIEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocEN1ckNoaWxkTm9kZSwgTlVMTCk7DQogI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KLSAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCiAjZW5kaWYNCi0gICAgICAgIHBQcm9jZXNzb3ItPkRvTGF5b3V0KEZBTFNFLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIHBMYXlvdXRDb250ZXh0KTsNCi0gICAgICAgIGlmKCFwUHJvY2Vzc29yLT5IYXNMYXlvdXRJdGVtKCkpIHsNCi0gICAgICAgICAgICBkZWxldGUgcFByb2Nlc3NvcjsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KLSAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgIHBQcm9jZXNzb3ItPkRvTGF5b3V0KEZBTFNFLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCk7DQorICAgIGlmICghcFByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpKSB7DQorICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgaW50MzJfdCBpUm93Q291bnQgPSAwLCBpQ29sQ291bnQgPSAwOw0KLSAgICB7DQotICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+IHJnUm93SXRlbXM7DQotICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiByZ1Jvd0l0ZW1zU3BhbjsNCi0gICAgICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiByZ1Jvd0l0ZW1zV2lkdGg7DQotICAgICAgICBmb3IoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsgcExheW91dENoaWxkOyBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsNCi0gICAgICAgICAgICBpZihwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocExheW91dENoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPSBwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsNCi0gICAgICAgICAgICBpZihlTGF5b3V0ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1JvdyAmJiBlTGF5b3V0ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3Jvdykgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwUm93TGF5b3V0Q2VsbCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dENoaWxkLT5tX3BGaXJzdENoaWxkKSB7DQotICAgICAgICAgICAgICAgIHJnUm93SXRlbXMuQWRkKHBSb3dMYXlvdXRDZWxsKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpQ29sU3BhbiA9IHBSb3dMYXlvdXRDZWxsLT5tX3BGb3JtTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0NvbFNwYW4pOw0KLSAgICAgICAgICAgICAgICByZ1Jvd0l0ZW1zU3Bhbi5BZGQoaUNvbFNwYW4pOw0KLSAgICAgICAgICAgICAgICByZ1Jvd0l0ZW1zV2lkdGguQWRkKHBSb3dMYXlvdXRDZWxsLT5tX3NTaXplLngpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlSb3dDb3VudCA9IHJnUm93SXRlbXMuR2V0U2l6ZSgpOw0KLSAgICAgICAgaUNvbENvdW50ID0gMDsNCi0gICAgICAgIEZYX0JPT0wgYk1vcmVDb2x1bW5zID0gVFJVRTsNCi0gICAgICAgIHdoaWxlKGJNb3JlQ29sdW1ucykgew0KLSAgICAgICAgICAgIGJNb3JlQ29sdW1ucyA9IEZBTFNFOw0KLSAgICAgICAgICAgIEZYX0JPT0wgYkF1dG9Db2wgPSBGQUxTRTsNCi0gICAgICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGlSb3dDb3VudDsgaSArKykgew0KLSAgICAgICAgICAgICAgICB3aGlsZShyZ1Jvd0l0ZW1zW2ldICE9IE5VTEwgJiYgKHJnUm93SXRlbXNTcGFuW2ldIDw9IDAgfHwgIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocmdSb3dJdGVtc1tpXS0+bV9wRm9ybU5vZGUpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBOZXdDZWxsID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilyZ1Jvd0l0ZW1zW2ldLT5tX3BOZXh0U2libGluZzsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHJnUm93SXRlbXNTcGFuW2ldIDwgMCAmJiBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHJnUm93SXRlbXNbaV0tPm1fcEZvcm1Ob2RlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBOZXdDZWxsID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJnUm93SXRlbXNbaV0gPSBwTmV3Q2VsbDsNCi0gICAgICAgICAgICAgICAgICAgIHJnUm93SXRlbXNTcGFuW2ldID0gcE5ld0NlbGwgPyBwTmV3Q2VsbC0+bV9wRm9ybU5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuKSA6IDA7DQotICAgICAgICAgICAgICAgICAgICByZ1Jvd0l0ZW1zV2lkdGhbaV0gPSBwTmV3Q2VsbCA/IHBOZXdDZWxsLT5tX3NTaXplLnggOiAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ2VsbCA9IHJnUm93SXRlbXNbaV07DQotICAgICAgICAgICAgICAgIGlmKCFwQ2VsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYk1vcmVDb2x1bW5zID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgaWYgKHJnUm93SXRlbXNTcGFuW2ldID09IDEpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpQ29sQ291bnQgPj0gaVNwZWNpZmllZENvbHVtbkNvdW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwLCBjID0gaUNvbENvdW50ICsgMSAtIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMuR2V0U2l6ZSgpOyBqIDwgYzsgaiArKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLkFkZCgwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAobV9yZ1NwZWNpZmllZENvbHVtbldpZHRoc1tpQ29sQ291bnRdIDwgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiQXV0b0NvbCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAoYkF1dG9Db2wgJiYgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoc1tpQ29sQ291bnRdIDwgcmdSb3dJdGVtc1dpZHRoW2ldKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoc1tpQ29sQ291bnRdID0gcmdSb3dJdGVtc1dpZHRoW2ldOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKGJNb3JlQ29sdW1ucykgew0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRmluYWxDb2x1bW5XaWR0aCA9IG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XTsNCi0gICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBpUm93Q291bnQ7IGkgKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFyZ1Jvd0l0ZW1zW2ldKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZ1Jvd0l0ZW1zU3BhbltpXS0tOw0KLSAgICAgICAgICAgICAgICAgICAgcmdSb3dJdGVtc1dpZHRoW2ldIC09IGZGaW5hbENvbHVtbldpZHRoOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlDb2xDb3VudCArKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICAgIEZYX0ZMT0FUIGZXaWR0aCwgZkhlaWdodDsNCisgICAgcFByb2Nlc3Nvci0+R2V0Q3VycmVudENvbXBvbmVudFNpemUoZldpZHRoLCBmSGVpZ2h0KTsNCisgICAgRlhfRkxPQVQgZkFic29sdXRlWCA9IDAsIGZBYnNvbHV0ZVkgPSAwOw0KKyAgICBDYWxjdWxhdGVQb3NpdGlvbmVkQ29udGFpbmVyUG9zKHBDdXJDaGlsZE5vZGUsIGZXaWR0aCwgZkhlaWdodCwgZkFic29sdXRlWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQWJzb2x1dGVZKTsNCisgICAgcFByb2Nlc3Nvci0+U2V0Q3VycmVudENvbXBvbmVudFBvcyhmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCisgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcFByb2Nlc3NJdGVtID0gcFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKTsNCisgICAgaWYgKHBCZWZvcmVJdGVtID09IE5VTEwpIHsNCisgICAgICBwUGFnZUFyZWFMYXlvdXRJdGVtLT5BZGRIZWFkQ2hpbGQocFByb2Nlc3NJdGVtKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwUGFnZUFyZWFMYXlvdXRJdGVtLT5JbnNlcnRDaGlsZChwQmVmb3JlSXRlbSwgcFByb2Nlc3NJdGVtKTsNCiAgICAgfQ0KLSAgICBGWF9GTE9BVCBmQ3VycmVudFJvd1kgPSAwOw0KLSAgICBmb3IoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsgcExheW91dENoaWxkOyBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsNCi0gICAgICAgIGlmKCFYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUpKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZihwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KLSAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVTdWJmb3JtTGF5b3V0ID0gcExheW91dENoaWxkLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQotICAgICAgICAgICAgaWYoZVN1YmZvcm1MYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm93IHx8IGVTdWJmb3JtTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3Jvdykgew0KLSAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9SZWxvY2F0ZVRhYmxlUm93Q2VsbHMocExheW91dENoaWxkLCBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLCBlU3ViZm9ybUxheW91dCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueSA9IGZDdXJyZW50Um93WTsNCi0gICAgICAgIGlmKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7DQotICAgICAgICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCA9IDA7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHN3aXRjaChwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduKSkgew0KLSAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54ID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoNCi0gICAgICAgICAgICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggPSAoZkNvbnRlbnRXaWR0aExpbWl0IC0gcExheW91dENoaWxkLT5tX3NTaXplLngpIC8gMiA7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCi0gICAgICAgICAgICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggPSBmQ29udGVudFdpZHRoTGltaXQgLSBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueDsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7DQotICAgICAgICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggKyBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueDsNCi0gICAgICAgICAgICBpZihmQ29udGVudFdpZHRoTGltaXQgPCBYRkFfTEFZT1VUX0ZMT0FUX01BWCAmJiBmQ29udGVudFdpZHRoTGltaXQgPiBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7DQotICAgICAgICAgICAgICAgIGZDaGlsZFN1cHBsaWVkV2lkdGggPSBmQ29udGVudFdpZHRoTGltaXQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA8IGZDaGlsZFN1cHBsaWVkV2lkdGgpIHsNCi0gICAgICAgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmQ2hpbGRTdXBwbGllZFdpZHRoOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZDdXJyZW50Um93WSArPSBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueTsNCisgICAgcEJlZm9yZUl0ZW0gPSBwUHJvY2Vzc0l0ZW07DQorICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgfQ0KKyAgcEJlZm9yZUl0ZW0gPSBOVUxMOw0KKyAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0gPSBwUGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgd2hpbGUgKHBMYXlvdXRJdGVtKSB7DQorICAgIGlmICghcExheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSB8fA0KKyAgICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRHJhdykgew0KKyAgICAgIHBMYXlvdXRJdGVtID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIGlmKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgew0KLSAgICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRIZWlnaHQgPSBmQ3VycmVudFJvd1k7DQotICAgICAgICBpZihmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPCBmQ2hpbGRTdXBwbGllZEhlaWdodCkgew0KLSAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IGZDaGlsZFN1cHBsaWVkSGVpZ2h0Ow0KLSAgICAgICAgfQ0KKyAgICBpZiAocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KKyAgICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBOZXh0TGF5b3V0SXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgICBwUGFnZUFyZWFMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwTGF5b3V0SXRlbSk7DQorICAgICAgaWYgKHBCZWZvcmVJdGVtID09IE5VTEwpIHsNCisgICAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPkFkZEhlYWRDaGlsZChwTGF5b3V0SXRlbSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPkluc2VydENoaWxkKHBCZWZvcmVJdGVtLCBwTGF5b3V0SXRlbSk7DQorICAgICAgfQ0KKyAgICAgIHBCZWZvcmVJdGVtID0gcExheW91dEl0ZW07DQorICAgICAgcExheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07DQogICAgIH0NCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyQ29tcG9uZW50U2l6ZUZyb21Db250ZW50U2l6ZShtX3BGb3JtTm9kZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLCBmQ29udGFpbmVyV2lkdGgsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LCBmQ29udGFpbmVySGVpZ2h0KTsNCi0gICAgU2V0Q3VycmVudENvbXBvbmVudFNpemUoZkNvbnRhaW5lcldpZHRoLCBmQ29udGFpbmVySGVpZ2h0KTsNCisgIH0NCiB9DQotc3RhdGljIHVpbnQ4X3QgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSEFsaWduRW51bVRvSW50KFhGQV9BVFRSSUJVVEVFTlVNIGVIQWxpZ24pDQotew0KLSAgICBzd2l0Y2goZUhBbGlnbikgew0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQotICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KLSAgICAgICAgICAgIHJldHVybiAyOw0KK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpEb0xheW91dFBvc2l0aW9uZWRDb250YWluZXIoDQorICAgIENYRkFfTGF5b3V0Q29udGV4dCogcENvbnRleHQpIHsNCisgIGlmIChtX3BMYXlvdXRJdGVtICE9IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wTGF5b3V0SXRlbSA9IENyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKG1fcEZvcm1Ob2RlKTsNCisgIEZYX0JPT0wgYklnbm9yZVhZID0gKG1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KSAhPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24pOw0KKyAgRlhfRkxPQVQgZkNvbnRhaW5lcldpZHRoID0gMCwgZkNvbnRhaW5lckhlaWdodCA9IDA7DQorICBGWF9CT09MIGJDb250YWluZXJXaWR0aEF1dG9TaXplID0gVFJVRSwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gVFJVRTsNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0NhbGN1bGF0ZUNvbnRhaW5lclNwZWNmaWVkU2l6ZSgNCisgICAgICBtX3BGb3JtTm9kZSwgZkNvbnRhaW5lcldpZHRoLCBmQ29udGFpbmVySGVpZ2h0LCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwNCisgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpOw0KKyAgRlhfRkxPQVQgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOw0KKyAgRlhfRkxPQVQgZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwLA0KKyAgICAgICAgICAgZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gMDsNCisgIGlmIChtX3BDdXJDaGlsZE5vZGUgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSkgew0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgRkFMU0UpOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ29sSW5kZXggPSAwOw0KKyAgZm9yICg7IG1fcEN1ckNoaWxkTm9kZTsgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKA0KKyAgICAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsIEZBTFNFKSkgew0KKyAgICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKG1fcEN1ckNoaWxkTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciA9DQorICAgICAgICBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKG1fcEN1ckNoaWxkTm9kZSwgbV9wUGFnZU1ncik7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IG1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KKyNlbmRpZg0KKyAgICBpZiAocENvbnRleHQgJiYgcENvbnRleHQtPm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzKSB7DQorICAgICAgaW50MzJfdCBpQ29sU3BhbiA9IG1fcEN1ckNoaWxkTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0NvbFNwYW4pOw0KKyAgICAgIGlmIChpQ29sU3BhbiA8PQ0KKyAgICAgICAgICBwQ29udGV4dC0+bV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMtPkdldFNpemUoKSAtIGlDb2xJbmRleCkgew0KKyAgICAgICAgcENvbnRleHQtPm1fZkN1ckNvbHVtbldpZHRoID0gMDsNCisgICAgICAgIHBDb250ZXh0LT5tX2JDdXJDb2x1bW5XaWR0aEF2YWlhYmxlID0gVFJVRTsNCisgICAgICAgIGlmIChpQ29sU3BhbiA9PSAtMSkgew0KKyAgICAgICAgICBpQ29sU3BhbiA9IHBDb250ZXh0LT5tX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocy0+R2V0U2l6ZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvbFNwYW47IGkrKykgew0KKyAgICAgICAgICBwQ29udGV4dC0+bV9mQ3VyQ29sdW1uV2lkdGggKz0NCisgICAgICAgICAgICAgIHBDb250ZXh0LT5tX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocy0+R2V0QXQoaUNvbEluZGV4ICsgaSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocENvbnRleHQtPm1fZkN1ckNvbHVtbldpZHRoID09IDApIHsNCisgICAgICAgICAgcENvbnRleHQtPm1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlDb2xJbmRleCArPSBpQ29sU3BhbjsNCisgICAgICB9DQorICAgIH0NCisgICAgcFByb2Nlc3Nvci0+RG9MYXlvdXQoRkFMU0UsIFhGQV9MQVlPVVRfRkxPQVRfTUFYLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOw0KKyAgICBpZiAoIXBQcm9jZXNzb3ItPkhhc0xheW91dEl0ZW0oKSkgew0KKyAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZXaWR0aCwgZkhlaWdodDsNCisgICAgcFByb2Nlc3Nvci0+R2V0Q3VycmVudENvbXBvbmVudFNpemUoZldpZHRoLCBmSGVpZ2h0KTsNCisgICAgRlhfQk9PTCBiQ2hhbmdlUGFyZW50U2l6ZSA9IEZBTFNFOw0KKyAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShtX3BDdXJDaGlsZE5vZGUpKSB7DQorICAgICAgYkNoYW5nZVBhcmVudFNpemUgPSBUUlVFOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZBYnNvbHV0ZVggPSAwLCBmQWJzb2x1dGVZID0gMDsNCisgICAgaWYgKCFiSWdub3JlWFkpIHsNCisgICAgICBDYWxjdWxhdGVQb3NpdGlvbmVkQ29udGFpbmVyUG9zKG1fcEN1ckNoaWxkTm9kZSwgZldpZHRoLCBmSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQorICAgIH0NCisgICAgcFByb2Nlc3Nvci0+U2V0Q3VycmVudENvbXBvbmVudFBvcyhmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCisgICAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7DQorICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZBYnNvbHV0ZVggKyBmV2lkdGg7DQorICAgICAgaWYgKGJDaGFuZ2VQYXJlbnRTaXplKSB7DQorICAgICAgICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPCBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7DQorICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkNoaWxkU3VwcGxpZWRXaWR0aDsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZFdpZHRoIDwgZkNoaWxkU3VwcGxpZWRXaWR0aCAmJg0KKyAgICAgICAgICAgIG1fcEN1ckNoaWxkTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCisgICAgICAgICAgZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmQ2hpbGRTdXBwbGllZFdpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQorICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRIZWlnaHQgPSBmQWJzb2x1dGVZICsgZkhlaWdodDsNCisgICAgICBpZiAoYkNoYW5nZVBhcmVudFNpemUpIHsNCisgICAgICAgIGlmIChmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPCBmQ2hpbGRTdXBwbGllZEhlaWdodCkgew0KKyAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmQ2hpbGRTdXBwbGllZEhlaWdodDsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZEhlaWdodCA8IGZDaGlsZFN1cHBsaWVkSGVpZ2h0ICYmDQorICAgICAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgICBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmQ2hpbGRTdXBwbGllZEhlaWdodDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7DQorICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgfQ0KKyAgWEZBX1ZFUlNJT04gZVZlcnNpb24gPSBtX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCisgIGlmIChmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9PSAwICYmIGVWZXJzaW9uIDwgWEZBX1ZFUlNJT05fMjA3KSB7DQorICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkV2lkdGg7DQorICB9DQorICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID09IDAgJiYgZVZlcnNpb24gPCBYRkFfVkVSU0lPTl8yMDcpIHsNCisgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0Ow0KKyAgfQ0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyQ29tcG9uZW50U2l6ZUZyb21Db250ZW50U2l6ZSgNCisgICAgICBtX3BGb3JtTm9kZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLA0KKyAgICAgIGZDb250YWluZXJXaWR0aCwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsDQorICAgICAgZkNvbnRhaW5lckhlaWdodCk7DQorICBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQpOw0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfVXBkYXRlV2lkZ2V0U2l6ZSgNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtLA0KKyAgICBGWF9GTE9BVCYgZldpZHRoLA0KKyAgICBGWF9GTE9BVCYgZkhlaWdodCkgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZTsNCisgIEFTU0VSVChwTm9kZSk7DQorICBYRkFfRUxFTUVOVCBlQ2xhc3NJRCA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICBzd2l0Y2ggKGVDbGFzc0lEKSB7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9BcmVhOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0OiB7DQorICAgICAgaWYgKGZXaWR0aCA8IC1YRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgZldpZHRoID0gcExheW91dEl0ZW0tPm1fc1NpemUueDsNCisgICAgICB9DQorICAgICAgaWYgKGZIZWlnaHQgPCAtWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgIGZIZWlnaHQgPSBwTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRmllbGQ6IHsNCisgICAgICBwTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpLT5TdGFydEZpZWxkRHJhd0xheW91dCgNCisgICAgICAgICAgcE5vZGUsIGZXaWR0aCwgZkhlaWdodCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgICBBU1NFUlQoRkFMU0UpOw0KKyAgfQ0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfUmVsb2NhdGVUYWJsZVJvd0NlbGxzKA0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dFJvdywNCisgICAgY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+JiByZ1NwZWNpZmllZENvbHVtbldpZHRocywNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCkgew0KKyAgRlhfRkxPQVQgZkNvbnRhaW5lcldpZHRoID0gMCwgZkNvbnRhaW5lckhlaWdodCA9IDA7DQorICBGWF9CT09MIGJDb250YWluZXJXaWR0aEF1dG9TaXplID0gVFJVRSwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gVFJVRTsNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0NhbGN1bGF0ZUNvbnRhaW5lclNwZWNmaWVkU2l6ZSgNCisgICAgICBwTGF5b3V0Um93LT5tX3BGb3JtTm9kZSwgZkNvbnRhaW5lcldpZHRoLCBmQ29udGFpbmVySGVpZ2h0LA0KKyAgICAgIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpOw0KKyAgQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9DQorICAgICAgcExheW91dFJvdy0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX01hcmdpbik7DQorICBGWF9GTE9BVCBmTGVmdEluc2V0ID0gMCwgZlRvcEluc2V0ID0gMCwgZlJpZ2h0SW5zZXQgPSAwLCBmQm90dG9tSW5zZXQgPSAwOw0KKyAgaWYgKHBNYXJnaW5Ob2RlKSB7DQorICAgIGZMZWZ0SW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGZUb3BJbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBmUmlnaHRJbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGZCb3R0b21JbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aExpbWl0ID0NCisgICAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA/IFhGQV9MQVlPVVRfRkxPQVRfTUFYDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmQ29udGFpbmVyV2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQ7DQorICBGWF9GTE9BVCBmQ29udGVudEN1cnJlbnRIZWlnaHQgPQ0KKyAgICAgIHBMYXlvdXRSb3ctPm1fc1NpemUueSAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsNCisgIEZYX0ZMT0FUIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gMCwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gMDsNCisgIEZYX0ZMT0FUIGZDdXJyZW50Q29sWCA9IDA7DQorICBpbnQzMl90IG5DdXJyZW50Q29sSWR4ID0gMDsNCisgIEZYX0JPT0wgYk1ldFdob2xlUm93Q2VsbCA9IEZBTFNFOw0KKyAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dENoaWxkID0NCisgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dFJvdy0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgcExheW91dENoaWxkOw0KKyAgICAgICBwTGF5b3V0Q2hpbGQgPQ0KKyAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Q2hpbGQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgIGludDMyX3Qgbk9yaWdpbmFsQ29sU3BhbiA9DQorICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfQ29sU3Bhbik7DQorICAgIGludDMyX3QgbkNvbFNwYW4gPSBuT3JpZ2luYWxDb2xTcGFuOw0KKyAgICBGWF9GTE9BVCBmQ29sU3BhbldpZHRoID0gMDsNCisgICAgaWYgKG5Db2xTcGFuID09IC0xIHx8DQorICAgICAgICBuQ3VycmVudENvbElkeCArIG5Db2xTcGFuID4gcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMuR2V0U2l6ZSgpKSB7DQorICAgICAgbkNvbFNwYW4gPSByZ1NwZWNpZmllZENvbHVtbldpZHRocy5HZXRTaXplKCkgLSBuQ3VycmVudENvbElkeDsNCisgICAgfQ0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ29sU3BhbjsgaSsrKSB7DQorICAgICAgZkNvbFNwYW5XaWR0aCArPSByZ1NwZWNpZmllZENvbHVtbldpZHRoc1tuQ3VycmVudENvbElkeCArIGldOw0KKyAgICB9DQorICAgIGlmIChuQ29sU3BhbiAhPSBuT3JpZ2luYWxDb2xTcGFuKSB7DQorICAgICAgZkNvbFNwYW5XaWR0aCA9DQorICAgICAgICAgIGJNZXRXaG9sZVJvd0NlbGwgPyAwIDogRlhfTUFYKGZDb2xTcGFuV2lkdGgsIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS55KTsNCisgICAgfQ0KKyAgICBpZiAobk9yaWdpbmFsQ29sU3BhbiA9PSAtMSkgew0KKyAgICAgIGJNZXRXaG9sZVJvd0NlbGwgPSBUUlVFOw0KKyAgICB9DQorICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLlNldChmQ3VycmVudENvbFgsIDApOw0KKyAgICBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueCA9IGZDb2xTcGFuV2lkdGg7DQorICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgZkN1cnJlbnRDb2xYICs9IGZDb2xTcGFuV2lkdGg7DQorICAgICAgbkN1cnJlbnRDb2xJZHggKz0gbkNvbFNwYW47DQorICAgICAgRlhfRkxPQVQgZk5ld0hlaWdodCA9DQorICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA/IC0xIDogZkNvbnRlbnRDdXJyZW50SGVpZ2h0Ow0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX1VwZGF0ZVdpZGdldFNpemUocExheW91dENoaWxkLCBmQ29sU3BhbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk5ld0hlaWdodCk7DQorICAgICAgcExheW91dENoaWxkLT5tX3NTaXplLnkgPSBmTmV3SGVpZ2h0Ow0KKyAgICAgIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZDaGlsZFN1cHBsaWVkSGVpZ2h0ID0gcExheW91dENoaWxkLT5tX3NTaXplLnk7DQorICAgICAgICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0IDwgZkNoaWxkU3VwcGxpZWRIZWlnaHQpIHsNCisgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZkNoaWxkU3VwcGxpZWRIZWlnaHQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQorICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRDaGlsZCA9DQorICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dFJvdy0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICBwTGF5b3V0Q2hpbGQ7DQorICAgICAgICAgcExheW91dENoaWxkID0NCisgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Q2hpbGQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfVXBkYXRlV2lkZ2V0U2l6ZSgNCisgICAgICAgICAgcExheW91dENoaWxkLCBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueCwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0KTsNCisgICAgICBGWF9GTE9BVCBmT2xkQ2hpbGRIZWlnaHQgPSBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueTsNCisgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueSA9IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodDsNCisgICAgICBDWEZBX05vZGUqIHBQYXJhTm9kZSA9DQorICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1BhcmEpOw0KKyAgICAgIGlmIChwUGFyYU5vZGUgJiYgcExheW91dENoaWxkLT5tX3BGaXJzdENoaWxkKSB7DQorICAgICAgICBGWF9GTE9BVCBmT2ZmSGVpZ2h0ID0gZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0IC0gZk9sZENoaWxkSGVpZ2h0Ow0KKyAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVZUeXBlID0gcFBhcmFOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVkFsaWduKTsNCisgICAgICAgIHN3aXRjaCAoZVZUeXBlKSB7DQorICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlOg0KKyAgICAgICAgICAgIGZPZmZIZWlnaHQgPSBmT2ZmSGVpZ2h0IC8gMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wOg0KKyAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGZPZmZIZWlnaHQgPSAwOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZPZmZIZWlnaHQgPiAwKSB7DQorICAgICAgICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBJbm5lckxheW91dENoaWxkID0NCisgICAgICAgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Q2hpbGQtPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgICAgICAgICAgcElubmVyTGF5b3V0Q2hpbGQ7DQorICAgICAgICAgICAgICAgcElubmVyTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbm5lckxheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgIHBJbm5lckxheW91dENoaWxkLT5tX3NQb3MueSArPSBmT2ZmSGVpZ2h0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUpIHsNCisgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDdXJyZW50Q29sWDsNCisgICAgaWYgKGZDb250ZW50V2lkdGhMaW1pdCA8IFhGQV9MQVlPVVRfRkxPQVRfTUFYICYmDQorICAgICAgICBmQ29udGVudFdpZHRoTGltaXQgPiBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7DQorICAgICAgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDb250ZW50V2lkdGhMaW1pdDsNCisgICAgfQ0KKyAgICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPCBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7DQorICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmQ2hpbGRTdXBwbGllZFdpZHRoOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGZDb250YWluZXJXaWR0aCAtIGZMZWZ0SW5zZXQgLSBmUmlnaHRJbnNldDsNCisgIH0NCisgIGlmIChwTGF5b3V0Um93LT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCkgPT0NCisgICAgICBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3cpIHsNCisgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dENoaWxkID0NCisgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Um93LT5tX3BGaXJzdENoaWxkOw0KKyAgICAgICAgIHBMYXlvdXRDaGlsZDsNCisgICAgICAgICBwTGF5b3V0Q2hpbGQgPQ0KKyAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXRDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54ID0gZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54IC0gcExheW91dENoaWxkLT5tX3NTaXplLng7DQorICAgIH0NCisgIH0NCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0NhbGN1bGF0ZUNvbnRhaW5lckNvbXBvbmVudFNpemVGcm9tQ29udGVudFNpemUoDQorICAgICAgcExheW91dFJvdy0+bV9wRm9ybU5vZGUsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwNCisgICAgICBmQ29udGFpbmVyV2lkdGgsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LA0KKyAgICAgIGZDb250YWluZXJIZWlnaHQpOw0KKyAgcExheW91dFJvdy0+bV9zU2l6ZS5TZXQoZkNvbnRhaW5lcldpZHRoLCBmQ29udGFpbmVySGVpZ2h0KTsNCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0VGFibGVDb250YWluZXIoQ1hGQV9Ob2RlKiBwTGF5b3V0Tm9kZSkgew0KKyAgaWYgKG1fcExheW91dEl0ZW0gIT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocExheW91dE5vZGUgPT0gTlVMTCkgew0KKyAgICBwTGF5b3V0Tm9kZSA9IG1fcEZvcm1Ob2RlOw0KKyAgfQ0KKyAgQVNTRVJUKG1fcEN1ckNoaWxkTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKTsNCisgIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7DQorICBGWF9GTE9BVCBmQ29udGFpbmVyV2lkdGggPSAwLCBmQ29udGFpbmVySGVpZ2h0ID0gMDsNCisgIEZYX0JPT0wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBUUlVFLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBUUlVFOw0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2ZpZWRTaXplKA0KKyAgICAgIG1fcEZvcm1Ob2RlLCBmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSk7DQorICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IDAsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IDA7DQorICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0NCisgICAgICBtX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCisgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmVG9wSW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQorICBpZiAocE1hcmdpbk5vZGUpIHsNCisgICAgZkxlZnRJbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZlRvcEluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGZSaWdodEluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZkJvdHRvbUluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICB9DQorICBGWF9GTE9BVCBmQ29udGVudFdpZHRoTGltaXQgPQ0KKyAgICAgIGJDb250YWluZXJXaWR0aEF1dG9TaXplID8gWEZBX0xBWU9VVF9GTE9BVF9NQVgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZDb250YWluZXJXaWR0aCAtIGZMZWZ0SW5zZXQgLSBmUmlnaHRJbnNldDsNCisgIENGWF9XaWRlU3RyaW5nQyB3c0NvbHVtbldpZHRoczsNCisgIGlmIChwTGF5b3V0Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsIHdzQ29sdW1uV2lkdGhzKSkgew0KKyAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdpZHRoczsNCisgICAgaWYgKEZYX1NlcGFyYXRlU3RyaW5nVyh3c0NvbHVtbldpZHRocy5HZXRQdHIoKSwgd3NDb2x1bW5XaWR0aHMuR2V0TGVuZ3RoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTCcgJywgd2lkdGhzKSA+IDApIHsNCisgICAgICBpbnQzMl90IGlDb2xzID0gd2lkdGhzLkdldFNpemUoKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1dpZHRoOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb2xzOyBpKyspIHsNCisgICAgICAgIHdzV2lkdGggPSB3aWR0aHNbaV07DQorICAgICAgICB3c1dpZHRoLlRyaW1MZWZ0KEwnICcpOw0KKyAgICAgICAgaWYgKCF3c1dpZHRoLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IG1lYXN1cmUod3NXaWR0aCk7DQorICAgICAgICAgIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMuQWRkKG1lYXN1cmUuVG9Vbml0KFhGQV9VTklUX1B0KSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpbnQzMl90IGlTcGVjaWZpZWRDb2x1bW5Db3VudCA9IG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMuR2V0U2l6ZSgpOw0KKyAgQ1hGQV9MYXlvdXRDb250ZXh0IGxheW91dENvbnRleHQ7DQorICBsYXlvdXRDb250ZXh0Lm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzID0gJm1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHM7DQorICBDWEZBX0xheW91dENvbnRleHQqIHBMYXlvdXRDb250ZXh0ID0NCisgICAgICBpU3BlY2lmaWVkQ29sdW1uQ291bnQgPiAwID8gJmxheW91dENvbnRleHQgOiBOVUxMOw0KKyAgaWYgKG1fcEN1ckNoaWxkTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKSB7DQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZSgNCisgICAgICAgIG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBGQUxTRSk7DQorICB9DQorICBmb3IgKDsgbV9wQ3VyQ2hpbGROb2RlOyBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgRkFMU0UpKSB7DQorICAgIGxheW91dENvbnRleHQubV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZSA9IEZBTFNFOw0KKyAgICBsYXlvdXRDb250ZXh0Lm1fZkN1ckNvbHVtbldpZHRoID0gMDsNCisgICAgaWYgKG1fbkN1ckNoaWxkTm9kZVN0YWdlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcikgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciA9DQorICAgICAgICBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKG1fcEN1ckNoaWxkTm9kZSwgbV9wUGFnZU1ncik7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IG1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KKyNlbmRpZg0KKyAgICBwUHJvY2Vzc29yLT5Eb0xheW91dChGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIFhGQV9MQVlPVVRfRkxPQVRfTUFYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0Q29udGV4dCk7DQorICAgIGlmICghcFByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpKSB7DQorICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7DQorICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgfQ0KKyAgaW50MzJfdCBpUm93Q291bnQgPSAwLCBpQ29sQ291bnQgPSAwOw0KKyAgew0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+IHJnUm93SXRlbXM7DQorICAgIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IHJnUm93SXRlbXNTcGFuOw0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9GTE9BVD4gcmdSb3dJdGVtc1dpZHRoOw0KKyAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0Q2hpbGQgPQ0KKyAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgICAgcExheW91dENoaWxkOw0KKyAgICAgICAgIHBMYXlvdXRDaGlsZCA9DQorICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgIGlmIChwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmICghWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPQ0KKyAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsNCisgICAgICBpZiAoZUxheW91dCAhPSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cgJiYNCisgICAgICAgICAgZUxheW91dCAhPSBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3cpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBSb3dMYXlvdXRDZWxsID0NCisgICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dENoaWxkLT5tX3BGaXJzdENoaWxkKSB7DQorICAgICAgICByZ1Jvd0l0ZW1zLkFkZChwUm93TGF5b3V0Q2VsbCk7DQorICAgICAgICBpbnQzMl90IGlDb2xTcGFuID0NCisgICAgICAgICAgICBwUm93TGF5b3V0Q2VsbC0+bV9wRm9ybU5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuKTsNCisgICAgICAgIHJnUm93SXRlbXNTcGFuLkFkZChpQ29sU3Bhbik7DQorICAgICAgICByZ1Jvd0l0ZW1zV2lkdGguQWRkKHBSb3dMYXlvdXRDZWxsLT5tX3NTaXplLngpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpUm93Q291bnQgPSByZ1Jvd0l0ZW1zLkdldFNpemUoKTsNCisgICAgaUNvbENvdW50ID0gMDsNCisgICAgRlhfQk9PTCBiTW9yZUNvbHVtbnMgPSBUUlVFOw0KKyAgICB3aGlsZSAoYk1vcmVDb2x1bW5zKSB7DQorICAgICAgYk1vcmVDb2x1bW5zID0gRkFMU0U7DQorICAgICAgRlhfQk9PTCBiQXV0b0NvbCA9IEZBTFNFOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlSb3dDb3VudDsgaSsrKSB7DQorICAgICAgICB3aGlsZSAocmdSb3dJdGVtc1tpXSAhPSBOVUxMICYmIChyZ1Jvd0l0ZW1zU3BhbltpXSA8PSAwIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ1Jvd0l0ZW1zW2ldLT5tX3BGb3JtTm9kZSkpKSB7DQorICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTmV3Q2VsbCA9DQorICAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXJnUm93SXRlbXNbaV0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgICAgICBpZiAocmdSb3dJdGVtc1NwYW5baV0gPCAwICYmIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnUm93SXRlbXNbaV0tPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgICAgIHBOZXdDZWxsID0gTlVMTDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICByZ1Jvd0l0ZW1zW2ldID0gcE5ld0NlbGw7DQorICAgICAgICAgIHJnUm93SXRlbXNTcGFuW2ldID0NCisgICAgICAgICAgICAgIHBOZXdDZWxsDQorICAgICAgICAgICAgICAgICAgPyBwTmV3Q2VsbC0+bV9wRm9ybU5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuKQ0KKyAgICAgICAgICAgICAgICAgIDogMDsNCisgICAgICAgICAgcmdSb3dJdGVtc1dpZHRoW2ldID0gcE5ld0NlbGwgPyBwTmV3Q2VsbC0+bV9zU2l6ZS54IDogMDsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ2VsbCA9IHJnUm93SXRlbXNbaV07DQorICAgICAgICBpZiAoIXBDZWxsKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYk1vcmVDb2x1bW5zID0gVFJVRTsNCisgICAgICAgIGlmIChyZ1Jvd0l0ZW1zU3BhbltpXSA9PSAxKSB7DQorICAgICAgICAgIGlmIChpQ29sQ291bnQgPj0gaVNwZWNpZmllZENvbHVtbkNvdW50KSB7DQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwLCBjID0gaUNvbENvdW50ICsgMSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRocy5HZXRTaXplKCk7DQorICAgICAgICAgICAgICAgICBqIDwgYzsgaisrKSB7DQorICAgICAgICAgICAgICBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLkFkZCgwKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XSA8DQorICAgICAgICAgICAgICBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgICAgIGJBdXRvQ29sID0gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYkF1dG9Db2wgJiYNCisgICAgICAgICAgICAgIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XSA8IHJnUm93SXRlbXNXaWR0aFtpXSkgew0KKyAgICAgICAgICAgIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XSA9IHJnUm93SXRlbXNXaWR0aFtpXTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoYk1vcmVDb2x1bW5zKSB7DQorICAgICAgICBGWF9GTE9BVCBmRmluYWxDb2x1bW5XaWR0aCA9IG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlSb3dDb3VudDsgaSsrKSB7DQorICAgICAgICAgIGlmICghcmdSb3dJdGVtc1tpXSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJnUm93SXRlbXNTcGFuW2ldLS07DQorICAgICAgICAgIHJnUm93SXRlbXNXaWR0aFtpXSAtPSBmRmluYWxDb2x1bW5XaWR0aDsNCisgICAgICAgIH0NCisgICAgICAgIGlDb2xDb3VudCsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgRlhfRkxPQVQgZkN1cnJlbnRSb3dZID0gMDsNCisgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRDaGlsZCA9DQorICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgIHBMYXlvdXRDaGlsZDsNCisgICAgICAgcExheW91dENoaWxkID0NCisgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgew0KKyAgICBpZiAoIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocExheW91dENoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAocExheW91dENoaWxkLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCisgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlU3ViZm9ybUxheW91dCA9DQorICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgICAgIGlmIChlU3ViZm9ybUxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cgfHwNCisgICAgICAgICAgZVN1YmZvcm1MYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmxfcm93KSB7DQorICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9SZWxvY2F0ZVRhYmxlUm93Q2VsbHMoDQorICAgICAgICAgICAgcExheW91dENoaWxkLCBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLCBlU3ViZm9ybUxheW91dCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnkgPSBmQ3VycmVudFJvd1k7DQorICAgIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgew0KKyAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggPSAwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHN3aXRjaCAocExheW91dENoaWxkLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbikpIHsNCiAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCiAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggPSAwOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KKyAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54ID0NCisgICAgICAgICAgICAgIChmQ29udGVudFdpZHRoTGltaXQgLSBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueCkgLyAyOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggPSBmQ29udGVudFdpZHRoTGltaXQgLSBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KICAgICB9DQorICAgIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgew0KKyAgICAgIEZYX0ZMT0FUIGZDaGlsZFN1cHBsaWVkV2lkdGggPQ0KKyAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54ICsgcExheW91dENoaWxkLT5tX3NTaXplLng7DQorICAgICAgaWYgKGZDb250ZW50V2lkdGhMaW1pdCA8IFhGQV9MQVlPVVRfRkxPQVRfTUFYICYmDQorICAgICAgICAgIGZDb250ZW50V2lkdGhMaW1pdCA+IGZDaGlsZFN1cHBsaWVkV2lkdGgpIHsNCisgICAgICAgIGZDaGlsZFN1cHBsaWVkV2lkdGggPSBmQ29udGVudFdpZHRoTGltaXQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA8IGZDaGlsZFN1cHBsaWVkV2lkdGgpIHsNCisgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkNoaWxkU3VwcGxpZWRXaWR0aDsNCisgICAgICB9DQorICAgIH0NCisgICAgZkN1cnJlbnRSb3dZICs9IHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS55Ow0KKyAgfQ0KKyAgaWYgKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgew0KKyAgICBGWF9GTE9BVCBmQ2hpbGRTdXBwbGllZEhlaWdodCA9IGZDdXJyZW50Um93WTsNCisgICAgaWYgKGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA8IGZDaGlsZFN1cHBsaWVkSGVpZ2h0KSB7DQorICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZkNoaWxkU3VwcGxpZWRIZWlnaHQ7DQorICAgIH0NCisgIH0NCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0NhbGN1bGF0ZUNvbnRhaW5lckNvbXBvbmVudFNpemVGcm9tQ29udGVudFNpemUoDQorICAgICAgbV9wRm9ybU5vZGUsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwNCisgICAgICBmQ29udGFpbmVyV2lkdGgsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LA0KKyAgICAgIGZDb250YWluZXJIZWlnaHQpOw0KKyAgU2V0Q3VycmVudENvbXBvbmVudFNpemUoZkNvbnRhaW5lcldpZHRoLCBmQ29udGFpbmVySGVpZ2h0KTsNCiB9DQotc3RhdGljIHZvaWQJWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfVXBkYXRlUGVuZGVkSXRlbUxheW91dChDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkNCi17DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPSBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KLSAgICBzd2l0Y2goZUxheW91dCkgew0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Sb3c6DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3JvdzoNCi0gICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9SZWxvY2F0ZVRhYmxlUm93Q2VsbHMocExheW91dEl0ZW0sIHBQcm9jZXNzb3ItPm1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMsIGVMYXlvdXQpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KK3N0YXRpYyB1aW50OF90IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0hBbGlnbkVudW1Ub0ludCgNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZUhBbGlnbikgew0KKyAgc3dpdGNoIChlSEFsaWduKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KKyAgICAgIHJldHVybiAxOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgIHJldHVybiAyOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIDA7DQorICB9DQogfQ0KLUZYX0JPT0wJQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpJc0FkZE5ld1Jvd0ZvclRyYWlsZXIoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUcmFpbGVySXRlbSkNCi17DQotICAgIGlmKCFwVHJhaWxlckl0ZW0pIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmV2lkdGggPSBwVHJhaWxlckl0ZW0tPm1fc1NpemUueDsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCA9IG1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsNCi0gICAgaWYoZUxheW91dCAhPSBYRkFfQVRUUklCVVRFRU5VTV9UYiAmJiBtX2ZXaWR0aExpbWl0ZSA+IGZXaWR0aCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KK3N0YXRpYyB2b2lkIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX1VwZGF0ZVBlbmRlZEl0ZW1MYXlvdXQoDQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0NCisgICAgICBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgc3dpdGNoIChlTGF5b3V0KSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm93Og0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3JvdzoNCisgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9SZWxvY2F0ZVRhYmxlUm93Q2VsbHMoDQorICAgICAgICAgIHBMYXlvdXRJdGVtLCBwUHJvY2Vzc29yLT5tX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLCBlTGF5b3V0KTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCiB9DQotc3RhdGljIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkVHJhaWxlckJlZm9yZVNwbGl0KENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwgRlhfRkxPQVQgZlNwbGl0UG9zLCBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRyYWlsZXJMYXlvdXRJdGVtLCBGWF9CT09MIGJVc2VJbmhlcml0ZWQgPSBGQUxTRSkNCi17DQotICAgIGlmKCFwVHJhaWxlckxheW91dEl0ZW0pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQotICAgIGlmKGJVc2VJbmhlcml0ZWQpIHsNCi0gICAgICAgIEZYX0ZMT0FUIGZOZXdTcGxpdFBvcyA9IDA7DQotICAgICAgICBpZihmU3BsaXRQb3MgLSBmSGVpZ2h0ID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCi0gICAgICAgICAgICBmTmV3U3BsaXRQb3MgPSBwUHJvY2Vzc29yLT5GaW5kU3BsaXRQb3MoZlNwbGl0UG9zIC0gZkhlaWdodCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZk5ld1NwbGl0UG9zID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCi0gICAgICAgICAgICBwUHJvY2Vzc29yLT5TcGxpdExheW91dEl0ZW0oZk5ld1NwbGl0UG9zKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9VcGRhdGVQZW5kZWRJdGVtTGF5b3V0KHBQcm9jZXNzb3IsIHBUcmFpbGVyTGF5b3V0SXRlbSk7DQotICAgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPSBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCi0gICAgRlhfRkxPQVQgZkxlZnRJbnNldCA9IDAsIGZUb3BJbnNldCA9IDAsIGZSaWdodEluc2V0ID0gMCwgZkJvdHRvbUluc2V0ID0gMDsNCi0gICAgaWYocE1hcmdpbk5vZGUpIHsNCi0gICAgICAgIGZMZWZ0SW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgIGZUb3BJbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgICAgICBmUmlnaHRJbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgIGZCb3R0b21JbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZldpZHRoID0gcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLng7DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPSBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQotICAgIGlmKCFwUHJvY2Vzc29yLT5Jc0FkZE5ld1Jvd0ZvclRyYWlsZXIocFRyYWlsZXJMYXlvdXRJdGVtKSkgew0KLSAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueSA9IHBQcm9jZXNzb3ItPm1fZkxhc3RSb3dZOw0KLSAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IHBQcm9jZXNzb3ItPm1fZkxhc3RSb3dXaWR0aDsNCi0gICAgICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUueCArPSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUueDsNCi0gICAgICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPkFkZENoaWxkKHBUcmFpbGVyTGF5b3V0SXRlbSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCitGWF9CT09MIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SXNBZGROZXdSb3dGb3JUcmFpbGVyKA0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRyYWlsZXJJdGVtKSB7DQorICBpZiAoIXBUcmFpbGVySXRlbSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9GTE9BVCBmV2lkdGggPSBwVHJhaWxlckl0ZW0tPm1fc1NpemUueDsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPSBtX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQorICBpZiAoZUxheW91dCAhPSBYRkFfQVRUUklCVVRFRU5VTV9UYiAmJiBtX2ZXaWR0aExpbWl0ZSA+IGZXaWR0aCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkVHJhaWxlckJlZm9yZVNwbGl0KA0KKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsDQorICAgIEZYX0ZMT0FUIGZTcGxpdFBvcywNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUcmFpbGVyTGF5b3V0SXRlbSwNCisgICAgRlhfQk9PTCBiVXNlSW5oZXJpdGVkID0gRkFMU0UpIHsNCisgIGlmICghcFRyYWlsZXJMYXlvdXRJdGVtKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUueTsNCisgIGlmIChiVXNlSW5oZXJpdGVkKSB7DQogICAgIEZYX0ZMT0FUIGZOZXdTcGxpdFBvcyA9IDA7DQotICAgIGlmKGZTcGxpdFBvcyAtIGZIZWlnaHQgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KLSAgICAgICAgZk5ld1NwbGl0UG9zID0gcFByb2Nlc3Nvci0+RmluZFNwbGl0UG9zKGZTcGxpdFBvcyAtIGZIZWlnaHQpOw0KKyAgICBpZiAoZlNwbGl0UG9zIC0gZkhlaWdodCA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgZk5ld1NwbGl0UG9zID0gcFByb2Nlc3Nvci0+RmluZFNwbGl0UG9zKGZTcGxpdFBvcyAtIGZIZWlnaHQpOw0KICAgICB9DQogICAgIGlmIChmTmV3U3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KLSAgICAgICAgcFByb2Nlc3Nvci0+U3BsaXRMYXlvdXRJdGVtKGZOZXdTcGxpdFBvcyk7DQotICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy55ID0gZk5ld1NwbGl0UG9zIC0gZlRvcEluc2V0IC0gZkJvdHRvbUluc2V0Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueSA9IGZTcGxpdFBvcyAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsNCisgICAgICBwUHJvY2Vzc29yLT5TcGxpdExheW91dEl0ZW0oZk5ld1NwbGl0UG9zKTsNCiAgICAgfQ0KLSAgICBzd2l0Y2gocFRyYWlsZXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbikpIHsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IGZMZWZ0SW5zZXQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KLSAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLnggLSBmUmlnaHRJbnNldCAtIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS54Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQotICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IChwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLnggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQgLSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUueCkgLyAyOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUueSArPSBmSGVpZ2h0Ow0KKyAgICByZXR1cm47DQorICB9DQorICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9VcGRhdGVQZW5kZWRJdGVtTGF5b3V0KHBQcm9jZXNzb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSk7DQorICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0NCisgICAgICBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCisgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmVG9wSW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQorICBpZiAocE1hcmdpbk5vZGUpIHsNCisgICAgZkxlZnRJbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZlRvcEluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGZSaWdodEluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZkJvdHRvbUluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICB9DQorICBGWF9GTE9BVCBmV2lkdGggPSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUueDsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPQ0KKyAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsNCisgIGlmICghcFByb2Nlc3Nvci0+SXNBZGROZXdSb3dGb3JUcmFpbGVyKHBUcmFpbGVyTGF5b3V0SXRlbSkpIHsNCisgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueSA9IHBQcm9jZXNzb3ItPm1fZkxhc3RSb3dZOw0KKyAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy54ID0gcFByb2Nlc3Nvci0+bV9mTGFzdFJvd1dpZHRoOw0KKyAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLnggKz0gcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLng7DQogICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPkFkZENoaWxkKHBUcmFpbGVyTGF5b3V0SXRlbSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0ZMT0FUIGZOZXdTcGxpdFBvcyA9IDA7DQorICBpZiAoZlNwbGl0UG9zIC0gZkhlaWdodCA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgIGZOZXdTcGxpdFBvcyA9IHBQcm9jZXNzb3ItPkZpbmRTcGxpdFBvcyhmU3BsaXRQb3MgLSBmSGVpZ2h0KTsNCisgIH0NCisgIGlmIChmTmV3U3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICBwUHJvY2Vzc29yLT5TcGxpdExheW91dEl0ZW0oZk5ld1NwbGl0UG9zKTsNCisgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueSA9IGZOZXdTcGxpdFBvcyAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsNCisgIH0gZWxzZSB7DQorICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSBmU3BsaXRQb3MgLSBmVG9wSW5zZXQgLSBmQm90dG9tSW5zZXQ7DQorICB9DQorICBzd2l0Y2ggKHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24pKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCisgICAgZGVmYXVsdDoNCisgICAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy54ID0gZkxlZnRJbnNldDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy54ID0gcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS54IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0SW5zZXQgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUueDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9DQorICAgICAgICAgIChwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLnggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQgLQ0KKyAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLngpIC8NCisgICAgICAgICAgMjsNCisgICAgICBicmVhazsNCisgIH0NCisgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUueSArPSBmSGVpZ2h0Ow0KKyAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocFRyYWlsZXJMYXlvdXRJdGVtKTsNCiB9Ow0KLXN0YXRpYyB2b2lkIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZExlYWRlckFmdGVyU3BsaXQoQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yLCBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExlYWRlckxheW91dEl0ZW0pDQotew0KLSAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9VcGRhdGVQZW5kZWRJdGVtTGF5b3V0KHBQcm9jZXNzb3IsIHBMZWFkZXJMYXlvdXRJdGVtKTsNCi0gICAgQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9IHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NYXJnaW4pOw0KLSAgICBGWF9GTE9BVCBmTGVmdEluc2V0ID0gMCwgZlRvcEluc2V0ID0gMCwgZlJpZ2h0SW5zZXQgPSAwLCBmQm90dG9tSW5zZXQgPSAwOw0KLSAgICBpZihwTWFyZ2luTm9kZSkgew0KLSAgICAgICAgZkxlZnRJbnNldCA9IHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgZlRvcEluc2V0ID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgIGZSaWdodEluc2V0ID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgZkJvdHRvbUluc2V0ID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gcExlYWRlckxheW91dEl0ZW0tPm1fc1NpemUueTsNCi0gICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsgcENoaWxkSXRlbTsgcENoaWxkSXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCi0gICAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICs9IGZIZWlnaHQ7DQotICAgIH0NCi0gICAgcExlYWRlckxheW91dEl0ZW0tPm1fc1Bvcy55ID0gMDsNCi0gICAgc3dpdGNoKHBMZWFkZXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbikpIHsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcExlYWRlckxheW91dEl0ZW0tPm1fc1Bvcy54ID0gZkxlZnRJbnNldDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQotICAgICAgICAgICAgcExlYWRlckxheW91dEl0ZW0tPm1fc1Bvcy54ID0gcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS54IC0gZlJpZ2h0SW5zZXQgLSBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS54Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQotICAgICAgICAgICAgcExlYWRlckxheW91dEl0ZW0tPm1fc1Bvcy54ID0gKHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUueCAtIGZMZWZ0SW5zZXQgLSBmUmlnaHRJbnNldCAtIHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NTaXplLngpIC8gMjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLnkgKz0gZkhlaWdodDsNCi0gICAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocExlYWRlckxheW91dEl0ZW0pOw0KK3N0YXRpYyB2b2lkIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZExlYWRlckFmdGVyU3BsaXQoDQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMZWFkZXJMYXlvdXRJdGVtKSB7DQorICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9VcGRhdGVQZW5kZWRJdGVtTGF5b3V0KHBQcm9jZXNzb3IsIHBMZWFkZXJMYXlvdXRJdGVtKTsNCisgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPQ0KKyAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NYXJnaW4pOw0KKyAgRlhfRkxPQVQgZkxlZnRJbnNldCA9IDAsIGZUb3BJbnNldCA9IDAsIGZSaWdodEluc2V0ID0gMCwgZkJvdHRvbUluc2V0ID0gMDsNCisgIGlmIChwTWFyZ2luTm9kZSkgew0KKyAgICBmTGVmdEluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBmVG9wSW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZlJpZ2h0SW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBmQm90dG9tSW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgIH0NCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSA9DQorICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKQ0KKyAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgIHBDaGlsZEl0ZW07DQorICAgICAgIHBDaGlsZEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICs9IGZIZWlnaHQ7DQorICB9DQorICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSAwOw0KKyAgc3dpdGNoIChwTGVhZGVyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24pKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCisgICAgZGVmYXVsdDoNCisgICAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBmTGVmdEluc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgIHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUueCAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0SW5zZXQgLSBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS54Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoNCisgICAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPQ0KKyAgICAgICAgICAocFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS54IC0gZkxlZnRJbnNldCAtIGZSaWdodEluc2V0IC0NCisgICAgICAgICAgIHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NTaXplLngpIC8NCisgICAgICAgICAgMjsNCisgICAgICBicmVhazsNCisgIH0NCisgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUueSArPSBmSGVpZ2h0Ow0KKyAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocExlYWRlckxheW91dEl0ZW0pOw0KIH07DQotc3RhdGljIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkUGVuZGluZ05vZGUoQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yLCBDWEZBX05vZGUqIHBQZW5kaW5nTm9kZSwgRlhfQk9PTCBiQnJlYWtQZW5kaW5nKQ0KLXsNCi0gICAgcFByb2Nlc3Nvci0+bV9yZ1BlbmRpbmdOb2Rlcy5BZGRUYWlsKHBQZW5kaW5nTm9kZSk7DQotICAgIHBQcm9jZXNzb3ItPm1fYkJyZWFrUGVuZGluZyA9IGJCcmVha1BlbmRpbmc7DQorc3RhdGljIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkUGVuZGluZ05vZGUoDQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwNCisgICAgQ1hGQV9Ob2RlKiBwUGVuZGluZ05vZGUsDQorICAgIEZYX0JPT0wgYkJyZWFrUGVuZGluZykgew0KKyAgcFByb2Nlc3Nvci0+bV9yZ1BlbmRpbmdOb2Rlcy5BZGRUYWlsKHBQZW5kaW5nTm9kZSk7DQorICBwUHJvY2Vzc29yLT5tX2JCcmVha1BlbmRpbmcgPSBiQnJlYWtQZW5kaW5nOw0KIH0NCi1zdGF0aWMgRlhfRkxPQVQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0UGVuZGluZ0l0ZW1zKENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwgQ1hGQV9Ob2RlKiBwQ3VyQ2hpbGROb2RlKQ0KLXsNCi0gICAgRlhfRkxPQVQgZlRvdGFsSGVpZ2h0ID0gMDsNCi0gICAgaWYocFByb2Nlc3Nvci0+bV9yZ1BlbmRpbmdOb2Rlcy5HZXRDb3VudCgpIDwgMSkgew0KLSAgICAgICAgcmV0dXJuIGZUb3RhbEhlaWdodDsNCi0gICAgfQ0KLSAgICBpZihwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtID09IE5VTEwpIHsNCi0gICAgICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0gPSBwUHJvY2Vzc29yLT5DcmVhdGVDb250ZW50TGF5b3V0SXRlbShwQ3VyQ2hpbGROb2RlKTsNCi0gICAgICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUuU2V0KDAsIDApOw0KLSAgICB9DQotICAgIHdoaWxlKHBQcm9jZXNzb3ItPm1fcmdQZW5kaW5nTm9kZXMuR2V0Q291bnQoKSA+IDApIHsNCi0gICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBQcm9jZXNzb3ItPm1fcmdQZW5kaW5nTm9kZXMuR2V0SGVhZFBvc2l0aW9uKCk7DQotICAgICAgICBDWEZBX05vZGUqIHBQZW5kaW5nTm9kZSA9IChDWEZBX05vZGUqKXBQcm9jZXNzb3ItPm1fcmdQZW5kaW5nTm9kZXMuR2V0QXQocG9zKTsNCi0gICAgICAgIHBQcm9jZXNzb3ItPm1fcmdQZW5kaW5nTm9kZXMuUmVtb3ZlQXQocG9zKTsNCi0gICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwUGVuZGluZ0xheW91dEl0ZW0gPSBOVUxMOw0KLSAgICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yICpwUGVuZGluZ1Byb2Nlc3NvciA9IEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocFBlbmRpbmdOb2RlLCBOVUxMKTsNCi0jaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQotICAgICAgICBwUGVuZGluZ1Byb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCi0jZW5kaWYNCi0gICAgICAgIHBQZW5kaW5nUHJvY2Vzc29yLT5Eb0xheW91dChGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgpOw0KLSAgICAgICAgcFBlbmRpbmdMYXlvdXRJdGVtID0gcFBlbmRpbmdQcm9jZXNzb3ItPkhhc0xheW91dEl0ZW0oKSA/IHBQZW5kaW5nUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpIDogTlVMTDsNCi0gICAgICAgIGRlbGV0ZSBwUGVuZGluZ1Byb2Nlc3NvcjsNCi0gICAgICAgIGlmKHBQZW5kaW5nTGF5b3V0SXRlbSkgew0KLSAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZExlYWRlckFmdGVyU3BsaXQocFByb2Nlc3NvciwgcFBlbmRpbmdMYXlvdXRJdGVtKTsNCi0gICAgICAgICAgICBpZihwUHJvY2Vzc29yLT5tX2JCcmVha1BlbmRpbmcpIHsNCi0gICAgICAgICAgICAgICAgZlRvdGFsSGVpZ2h0ICs9IHBQZW5kaW5nTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KK3N0YXRpYyBGWF9GTE9BVCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRQZW5kaW5nSXRlbXMoDQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwNCisgICAgQ1hGQV9Ob2RlKiBwQ3VyQ2hpbGROb2RlKSB7DQorICBGWF9GTE9BVCBmVG90YWxIZWlnaHQgPSAwOw0KKyAgaWYgKHBQcm9jZXNzb3ItPm1fcmdQZW5kaW5nTm9kZXMuR2V0Q291bnQoKSA8IDEpIHsNCiAgICAgcmV0dXJuIGZUb3RhbEhlaWdodDsNCisgIH0NCisgIGlmIChwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtID09IE5VTEwpIHsNCisgICAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbSA9DQorICAgICAgICBwUHJvY2Vzc29yLT5DcmVhdGVDb250ZW50TGF5b3V0SXRlbShwQ3VyQ2hpbGROb2RlKTsNCisgICAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS5TZXQoMCwgMCk7DQorICB9DQorICB3aGlsZSAocFByb2Nlc3Nvci0+bV9yZ1BlbmRpbmdOb2Rlcy5HZXRDb3VudCgpID4gMCkgew0KKyAgICBGWF9QT1NJVElPTiBwb3MgPSBwUHJvY2Vzc29yLT5tX3JnUGVuZGluZ05vZGVzLkdldEhlYWRQb3NpdGlvbigpOw0KKyAgICBDWEZBX05vZGUqIHBQZW5kaW5nTm9kZSA9DQorICAgICAgICAoQ1hGQV9Ob2RlKilwUHJvY2Vzc29yLT5tX3JnUGVuZGluZ05vZGVzLkdldEF0KHBvcyk7DQorICAgIHBQcm9jZXNzb3ItPm1fcmdQZW5kaW5nTm9kZXMuUmVtb3ZlQXQocG9zKTsNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBQZW5kaW5nTGF5b3V0SXRlbSA9IE5VTEw7DQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFBlbmRpbmdQcm9jZXNzb3IgPQ0KKyAgICAgICAgRlhfTkVXIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihwUGVuZGluZ05vZGUsIE5VTEwpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgcFBlbmRpbmdQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgIHBQZW5kaW5nUHJvY2Vzc29yLT5Eb0xheW91dChGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgpOw0KKyAgICBwUGVuZGluZ0xheW91dEl0ZW0gPSBwUGVuZGluZ1Byb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBQZW5kaW5nUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7DQorICAgIGRlbGV0ZSBwUGVuZGluZ1Byb2Nlc3NvcjsNCisgICAgaWYgKHBQZW5kaW5nTGF5b3V0SXRlbSkgew0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZExlYWRlckFmdGVyU3BsaXQocFByb2Nlc3NvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQZW5kaW5nTGF5b3V0SXRlbSk7DQorICAgICAgaWYgKHBQcm9jZXNzb3ItPm1fYkJyZWFrUGVuZGluZykgew0KKyAgICAgICAgZlRvdGFsSGVpZ2h0ICs9IHBQZW5kaW5nTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZUb3RhbEhlaWdodDsNCiB9DQotRlhfRkxPQVQJQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpJbnNlcnRLZWVwTGF5b3V0SXRlbXMoKQ0KLXsNCi0gICAgRlhfRkxPQVQgZlRvdGFsSGVpZ2h0ID0gMDsNCi0gICAgaWYobV9hcnJheUtlZXBJdGVtcy5HZXRTaXplKCkpIHsNCi0gICAgICAgIGlmKG1fcExheW91dEl0ZW0gPT0gTlVMTCkgew0KLSAgICAgICAgICAgIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7DQotICAgICAgICAgICAgbV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS5TZXQoMCwgMCk7DQotICAgICAgICB9DQotICAgICAgICBmb3IoaW50MzJfdCBpSW5kZXggPSBtX2FycmF5S2VlcEl0ZW1zLkdldFNpemUoKSAtIDE7IGlJbmRleCA+PSAwIDsgaUluZGV4IC0tKSB7DQotICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkTGVhZGVyQWZ0ZXJTcGxpdCh0aGlzLCBtX2FycmF5S2VlcEl0ZW1zW2lJbmRleF0pOw0KLSAgICAgICAgICAgIGZUb3RhbEhlaWdodCArPSBtX2FycmF5S2VlcEl0ZW1zW2lJbmRleF0tPm1fc1NpemUueTsNCi0gICAgICAgIH0NCitGWF9GTE9BVCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6Okluc2VydEtlZXBMYXlvdXRJdGVtcygpIHsNCisgIEZYX0ZMT0FUIGZUb3RhbEhlaWdodCA9IDA7DQorICBpZiAobV9hcnJheUtlZXBJdGVtcy5HZXRTaXplKCkpIHsNCisgICAgaWYgKG1fcExheW91dEl0ZW0gPT0gTlVMTCkgew0KKyAgICAgIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7DQorICAgICAgbV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS5TZXQoMCwgMCk7DQorICAgIH0NCisgICAgZm9yIChpbnQzMl90IGlJbmRleCA9IG1fYXJyYXlLZWVwSXRlbXMuR2V0U2l6ZSgpIC0gMTsgaUluZGV4ID49IDA7DQorICAgICAgICAgaUluZGV4LS0pIHsNCisgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRMZWFkZXJBZnRlclNwbGl0KHRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FycmF5S2VlcEl0ZW1zW2lJbmRleF0pOw0KKyAgICAgIGZUb3RhbEhlaWdodCArPSBtX2FycmF5S2VlcEl0ZW1zW2lJbmRleF0tPm1fc1NpemUueTsNCisgICAgfQ0KKyAgICBtX2FycmF5S2VlcEl0ZW1zLlJlbW92ZUFsbCgpOw0KKyAgfQ0KKyAgcmV0dXJuIGZUb3RhbEhlaWdodDsNCit9DQorRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlByb2Nlc3NLZWVwRm9yU3BsaXRlKA0KKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQYXJlbnRQcm9jZXNzb3IsDQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcENoaWxkUHJvY2Vzc29yLA0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlUmV0VmFsdWUsDQorICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4mIHJnQ3VyTGluZUxheW91dEl0ZW0sDQorICAgIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQorICAgIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd0hlaWdodCwNCisgICAgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93WSwNCisgICAgRlhfQk9PTCYgYkFkZGVkSXRlbUluUm93LA0KKyAgICBGWF9CT09MJiBiRm9yY2VFbmRQYWdlLA0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCYgcmVzdWx0KSB7DQorICBpZiAocFBhcmVudFByb2Nlc3NvciA9PSBOVUxMIHx8IHBDaGlsZFByb2Nlc3NvciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwUGFyZW50UHJvY2Vzc29yLT5tX3BDdXJDaGlsZE5vZGUtPkdldEludGFjdCgpICE9DQorICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX05vbmUgfHwNCisgICAgICAhcENoaWxkUHJvY2Vzc29yLT5tX2JIYXNBdmFpbEhlaWdodCkgew0KKyAgICBpZiAoWEZBX0V4aXN0Q29udGFpbmVyS2VlcChwUGFyZW50UHJvY2Vzc29yLT5tX3BDdXJDaGlsZE5vZGUsIFRSVUUpKSB7DQorICAgICAgRlhfRkxPQVQgZkNoaWxkV2lkdGgsIGZDaGlsZEhlaWdodDsNCisgICAgICBwQ2hpbGRQcm9jZXNzb3ItPkdldEN1cnJlbnRDb21wb25lbnRTaXplKGZDaGlsZFdpZHRoLCBmQ2hpbGRIZWlnaHQpOw0KKyAgICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4ga2VlcExheW91dEl0ZW1zOw0KKyAgICAgIGlmIChwUGFyZW50UHJvY2Vzc29yLT5KdWRnZVB1dE5leHRQYWdlKHBQYXJlbnRQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNoaWxkSGVpZ2h0LCBrZWVwTGF5b3V0SXRlbXMpKSB7DQogICAgICAgICBtX2FycmF5S2VlcEl0ZW1zLlJlbW92ZUFsbCgpOw0KLSAgICB9DQotICAgIHJldHVybiBmVG90YWxIZWlnaHQ7DQotfQ0KLUZYX0JPT0wJQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzS2VlcEZvclNwbGl0ZShDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQYXJlbnRQcm9jZXNzb3IsIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcENoaWxkUHJvY2Vzc29yLCBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlUmV0VmFsdWUsDQotICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+JiByZ0N1ckxpbmVMYXlvdXRJdGVtLCBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KLSAgICAgICAgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dZLCBGWF9CT09MJiBiQWRkZWRJdGVtSW5Sb3csIEZYX0JPT0wmIGJGb3JjZUVuZFBhZ2UsIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0JiByZXN1bHQpDQotew0KLSAgICBpZihwUGFyZW50UHJvY2Vzc29yID09IE5VTEwgfHwgcENoaWxkUHJvY2Vzc29yID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZihwUGFyZW50UHJvY2Vzc29yLT5tX3BDdXJDaGlsZE5vZGUtPkdldEludGFjdCgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmUgfHwgIXBDaGlsZFByb2Nlc3Nvci0+bV9iSGFzQXZhaWxIZWlnaHQpIHsNCi0gICAgICAgIGlmKFhGQV9FeGlzdENvbnRhaW5lcktlZXAocFBhcmVudFByb2Nlc3Nvci0+bV9wQ3VyQ2hpbGROb2RlLCBUUlVFKSkgew0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZDaGlsZFdpZHRoLCBmQ2hpbGRIZWlnaHQ7DQotICAgICAgICAgICAgcENoaWxkUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ2hpbGRXaWR0aCwgZkNoaWxkSGVpZ2h0KTsNCi0gICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+IGtlZXBMYXlvdXRJdGVtczsNCi0gICAgICAgICAgICBpZihwUGFyZW50UHJvY2Vzc29yLT5KdWRnZVB1dE5leHRQYWdlKHBQYXJlbnRQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0sIGZDaGlsZEhlaWdodCwga2VlcExheW91dEl0ZW1zKSkgew0KLSAgICAgICAgICAgICAgICBtX2FycmF5S2VlcEl0ZW1zLlJlbW92ZUFsbCgpOw0KLSAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpSW5kZXggPSAwOyBpSW5kZXggPCBrZWVwTGF5b3V0SXRlbXMuR2V0U2l6ZSgpOyBpSW5kZXgrKykgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBJdGVtID0ga2VlcExheW91dEl0ZW1zLkdldEF0KGlJbmRleCk7DQotICAgICAgICAgICAgICAgICAgICBwUGFyZW50UHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwSXRlbSk7DQotICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd1kgLT0gcEl0ZW0tPm1fc1NpemUueTsNCi0gICAgICAgICAgICAgICAgICAgIG1fYXJyYXlLZWVwSXRlbXMuQWRkKHBJdGVtKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBiQWRkZWRJdGVtSW5Sb3cgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1BhZ2VGdWxsQnJlYWs7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtLkFkZChwQ2hpbGRQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KLSAgICAgICAgICAgIGJBZGRlZEl0ZW1JblJvdyA9IFRSVUU7DQotICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGZDaGlsZFdpZHRoOw0KLSAgICAgICAgICAgIGlmKGZDb250ZW50Q3VyUm93SGVpZ2h0IDwgZkNoaWxkSGVpZ2h0ICkgew0KLSAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCA9IGZDaGlsZEhlaWdodDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0ID0gZVJldFZhbHVlOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IGtlZXBMYXlvdXRJdGVtcy5HZXRTaXplKCk7IGlJbmRleCsrKSB7DQorICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwSXRlbSA9IGtlZXBMYXlvdXRJdGVtcy5HZXRBdChpSW5kZXgpOw0KKyAgICAgICAgICBwUGFyZW50UHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwSXRlbSk7DQorICAgICAgICAgIGZDb250ZW50Q3VyUm93WSAtPSBwSXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgICAgICBtX2FycmF5S2VlcEl0ZW1zLkFkZChwSXRlbSk7DQogICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SnVkZ2VQdXROZXh0UGFnZShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFBhcmVudExheW91dEl0ZW0sICBGWF9GTE9BVCBmQ2hpbGRIZWlnaHQsIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4gJnBLZWVwSXRlbXMpDQotew0KLSAgICBpZihwUGFyZW50TGF5b3V0SXRlbSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRlhfRkxPQVQgZkl0ZW1zSGVpZ2h0ID0gMDsNCi0gICAgZm9yKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ2hpbGRMYXlvdXRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwUGFyZW50TGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsgcENoaWxkTGF5b3V0SXRlbTsgcENoaWxkTGF5b3V0SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcENoaWxkTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCi0gICAgICAgIGlmKFhGQV9FeGlzdENvbnRhaW5lcktlZXAocENoaWxkTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUsIEZBTFNFKSkgew0KLSAgICAgICAgICAgIHBLZWVwSXRlbXMuQWRkKHBDaGlsZExheW91dEl0ZW0pOw0KLSAgICAgICAgICAgIGZJdGVtc0hlaWdodCArPSBwQ2hpbGRMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBLZWVwSXRlbXMuUmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgZkl0ZW1zSGVpZ2h0ID0gMDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBmSXRlbXNIZWlnaHQgKz0gZkNoaWxkSGVpZ2h0Ow0KLSAgICBpZihtX3BQYWdlTWdyLT5HZXROZXh0QXZhaWxDb250ZW50SGVpZ2h0KGZJdGVtc0hlaWdodCkpIHsNCisgICAgICAgIGJBZGRlZEl0ZW1JblJvdyA9IFRSVUU7DQorICAgICAgICBiRm9yY2VFbmRQYWdlID0gVFJVRTsNCisgICAgICAgIHJlc3VsdCA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1BhZ2VGdWxsQnJlYWs7DQogICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbS5BZGQocENoaWxkUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsNCisgICAgICBiQWRkZWRJdGVtSW5Sb3cgPSBUUlVFOw0KKyAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBmQ2hpbGRXaWR0aDsNCisgICAgICBpZiAoZkNvbnRlbnRDdXJSb3dIZWlnaHQgPCBmQ2hpbGRIZWlnaHQpIHsNCisgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KKyAgICAgIH0NCisgICAgICByZXN1bHQgPSBlUmV0VmFsdWU7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6Okp1ZGdlUHV0TmV4dFBhZ2UoDQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwUGFyZW50TGF5b3V0SXRlbSwNCisgICAgRlhfRkxPQVQgZkNoaWxkSGVpZ2h0LA0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+JiBwS2VlcEl0ZW1zKSB7DQorICBpZiAocFBhcmVudExheW91dEl0ZW0gPT0gTlVMTCkgew0KICAgICByZXR1cm4gRkFMU0U7DQotfQ0KLXZvaWQJQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzVW5Vc2VCaW5kcyhDWEZBX05vZGUqIHBGb3JtTm9kZSkNCi17DQotICAgIGlmKCFwRm9ybU5vZGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+IHNJdGVyYXRvcihwRm9ybU5vZGUpOw0KLSAgICBmb3IoQ1hGQV9Ob2RlICpwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCk7IHBOb2RlOyBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgIGlmKHBOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcEJpbmROb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQotICAgICAgICAgICAgaWYgKHBCaW5kTm9kZSkgew0KLSAgICAgICAgICAgICAgICBwQmluZE5vZGUtPlJlbW92ZUJpbmRJdGVtKHBOb2RlKTsNCi0gICAgICAgICAgICAgICAgcE5vZGUtPlNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBOVUxMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSk7DQotICAgIH0NCi19DQotdm9pZAlDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlByb2Nlc3NVblVzZU92ZXJGbG93KENYRkFfTm9kZSogcExlYWRlck5vZGUsIENYRkFfTm9kZSogcFRyYWlsZXJOb2RlLCBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRyYWlsZXJJdGVtLCBDWEZBX05vZGUqIHBGb3JtTm9kZSkNCi17DQotICAgIFByb2Nlc3NVblVzZUJpbmRzKHBMZWFkZXJOb2RlKTsNCi0gICAgUHJvY2Vzc1VuVXNlQmluZHMocFRyYWlsZXJOb2RlKTsNCi0gICAgaWYocEZvcm1Ob2RlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZihwRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9PdmVyZmxvdyB8fCBwRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9CcmVhaykgew0KLSAgICAgICAgcEZvcm1Ob2RlID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgfQ0KLSAgICBpZihwTGVhZGVyTm9kZSAmJiBwRm9ybU5vZGUpIHsNCi0gICAgICAgIHBGb3JtTm9kZS0+UmVtb3ZlQ2hpbGQocExlYWRlck5vZGUpOw0KLSAgICB9DQotICAgIGlmKHBUcmFpbGVyTm9kZSAmJiBwRm9ybU5vZGUpIHsNCi0gICAgICAgIHBGb3JtTm9kZS0+UmVtb3ZlQ2hpbGQocFRyYWlsZXJOb2RlKTsNCi0gICAgfQ0KLSAgICBpZihwVHJhaWxlckl0ZW0pIHsNCi0gICAgICAgIFhGQV9SZWxlYXNlTGF5b3V0SXRlbShwVHJhaWxlckl0ZW0pOw0KLSAgICB9DQotfQ0KLXN0YXRpYyBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFRoaXMsIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciomIHBQcm9jZXNzb3IsDQotICAgICAgICBGWF9CT09MIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBGWF9CT09MIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgRlhfRkxPQVQgZkNvbnRhaW5lckhlaWdodCwgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwgdWludDhfdCYgdUN1ckhBbGlnblN0YXRlLCBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+ICgmcmdDdXJMaW5lTGF5b3V0SXRlbXMpWzNdLA0KLSAgICAgICAgRlhfQk9PTCBiVXNlQnJlYWtDb250cm9sLCBGWF9GTE9BVCBmQXZhaWxIZWlnaHQsIEZYX0ZMT0FUIGZSZWFsSGVpZ2h0LCBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dZLCBGWF9GTE9BVCYgZkNvbnRlbnRXaWR0aExpbWl0LCBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KLSAgICAgICAgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBGWF9CT09MJiBiQWRkZWRJdGVtSW5Sb3csIEZYX0JPT0wmIGJGb3JjZUVuZFBhZ2UsIENYRkFfTGF5b3V0Q29udGV4dCogcExheW91dENvbnRleHQgPSBOVUxMLCBGWF9CT09MIGJOZXdSb3cgPSBGQUxTRSkNCi17DQotICAgIEZYX0JPT0wgYlRha2VTcGFjZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUpOw0KLSAgICB1aW50OF90IHVIQWxpZ24gPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9IQWxpZ25FbnVtVG9JbnQocFRoaXMtPm1fcEN1ckNoaWxkTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbikpOw0KLSAgICBpZihiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgew0KLSAgICAgICAgdUhBbGlnbiA9IDA7DQotICAgIH0NCi0gICAgaWYoKGVGbG93U3RyYXRlZ3kgIT0gWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIgJiYgdUhBbGlnbiA8IHVDdXJIQWxpZ25TdGF0ZSkgfHwgKGVGbG93U3RyYXRlZ3kgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIgJiYgdUhBbGlnbiA+IHVDdXJIQWxpZ25TdGF0ZSkpIHsNCi0gICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Sb3dGdWxsQnJlYWs7DQotICAgIH0NCi0gICAgdUN1ckhBbGlnblN0YXRlID0gdUhBbGlnbjsNCi0gICAgRlhfQk9PTCBiSXNPd25TcGxpdGUgPSBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0SW50YWN0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCi0gICAgRlhfQk9PTCBiVXNlUmVhbEhlaWdodCA9IGJUYWtlU3BhY2UgJiYgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplICYmICBiSXNPd25TcGxpdGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+R2V0SW50YWN0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCi0gICAgRlhfQk9PTCBiSXNUcmFuc0hlaWdodCA9IGJUYWtlU3BhY2U7DQotICAgIGlmKGJJc1RyYW5zSGVpZ2h0ICYmICFiSXNPd25TcGxpdGUpIHsNCi0gICAgICAgIEZYX0JPT0wgYlJvb3RGb3JjZVRiID0gRkFMU0U7DQotICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0U3RyYXRlZ3kgPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9HZXRMYXlvdXQocFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUsIGJSb290Rm9yY2VUYik7DQotICAgICAgICBpZihlTGF5b3V0U3RyYXRlZ3kgPT0gWEZBX0FUVFJJQlVURUVOVU1fTHJfdGIgfHwgZUxheW91dFN0cmF0ZWd5ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiKSB7DQotICAgICAgICAgICAgYklzVHJhbnNIZWlnaHQgPSBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWF9CT09MIGJVc2VJbmhlcml0ZWQgPSBGQUxTRTsNCi0gICAgQ1hGQV9MYXlvdXRDb250ZXh0CWxheW91dENvbnRleHQ7DQotICAgIGlmIChwVGhpcy0+bV9wUGFnZU1ncikgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwT3ZlcmZsb3dOb2RlID0gcFRoaXMtPm1fcFBhZ2VNZ3ItPlF1ZXJ5T3ZlcmZsb3cocFRoaXMtPm1fcEZvcm1Ob2RlKTsNCi0gICAgICAgIGlmKHBPdmVyZmxvd05vZGUpIHsNCi0gICAgICAgICAgICBsYXlvdXRDb250ZXh0Lm1fcE92ZXJmbG93Tm9kZSA9IHBPdmVyZmxvd05vZGU7DQotICAgICAgICAgICAgbGF5b3V0Q29udGV4dC5tX3BPdmVyZmxvd1Byb2Nlc3NvciA9IHBUaGlzOw0KLSAgICAgICAgICAgIHBMYXlvdXRDb250ZXh0ID0gJmxheW91dENvbnRleHQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgZVJldFZhbHVlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCi0gICAgaWYoIWJOZXdSb3cgfHwgcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCi0gICAgICAgIGVSZXRWYWx1ZSA9IHBQcm9jZXNzb3ItPkRvTGF5b3V0KGJUYWtlU3BhY2UgPyBiVXNlQnJlYWtDb250cm9sIDogRkFMU0UsIGJVc2VSZWFsSGVpZ2h0ID8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWFsSGVpZ2h0IC0gZkNvbnRlbnRDdXJSb3dZIDogWEZBX0xBWU9VVF9GTE9BVF9NQVgsIGJJc1RyYW5zSGVpZ2h0ID8gZlJlYWxIZWlnaHQgLSBmQ29udGVudEN1clJvd1kgOiBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgcExheW91dENvbnRleHQpOw0KLSAgICAgICAgcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID0gZVJldFZhbHVlOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkl0ZW1zSGVpZ2h0ID0gMDsNCisgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDaGlsZExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwUGFyZW50TGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgcENoaWxkTGF5b3V0SXRlbTsNCisgICAgICAgcENoaWxkTGF5b3V0SXRlbSA9DQorICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBDaGlsZExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgIGlmIChYRkFfRXhpc3RDb250YWluZXJLZWVwKHBDaGlsZExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLCBGQUxTRSkpIHsNCisgICAgICBwS2VlcEl0ZW1zLkFkZChwQ2hpbGRMYXlvdXRJdGVtKTsNCisgICAgICBmSXRlbXNIZWlnaHQgKz0gcENoaWxkTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgZVJldFZhbHVlID0gcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzOw0KLSAgICAgICAgcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgICAgICBwS2VlcEl0ZW1zLlJlbW92ZUFsbCgpOw0KKyAgICAgIGZJdGVtc0hlaWdodCA9IDA7DQogICAgIH0NCi0gICAgaWYgKHBQcm9jZXNzb3ItPkhhc0xheW91dEl0ZW0oKSA9PSBGQUxTRSkJew0KKyAgfQ0KKyAgZkl0ZW1zSGVpZ2h0ICs9IGZDaGlsZEhlaWdodDsNCisgIGlmIChtX3BQYWdlTWdyLT5HZXROZXh0QXZhaWxDb250ZW50SGVpZ2h0KGZJdGVtc0hlaWdodCkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzVW5Vc2VCaW5kcyhDWEZBX05vZGUqIHBGb3JtTm9kZSkgew0KKyAgaWYgKCFwRm9ybU5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlPiBzSXRlcmF0b3IoDQorICAgICAgcEZvcm1Ob2RlKTsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCk7IHBOb2RlOw0KKyAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgaWYgKHBOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KKyAgICAgIENYRkFfTm9kZSogcEJpbmROb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgaWYgKHBCaW5kTm9kZSkgew0KKyAgICAgICAgcEJpbmROb2RlLT5SZW1vdmVCaW5kSXRlbShwTm9kZSk7DQorICAgICAgICBwTm9kZS0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIE5VTEwpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzVW5Vc2VPdmVyRmxvdygNCisgICAgQ1hGQV9Ob2RlKiBwTGVhZGVyTm9kZSwNCisgICAgQ1hGQV9Ob2RlKiBwVHJhaWxlck5vZGUsDQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVHJhaWxlckl0ZW0sDQorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7DQorICBQcm9jZXNzVW5Vc2VCaW5kcyhwTGVhZGVyTm9kZSk7DQorICBQcm9jZXNzVW5Vc2VCaW5kcyhwVHJhaWxlck5vZGUpOw0KKyAgaWYgKHBGb3JtTm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9PdmVyZmxvdyB8fA0KKyAgICAgIHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0JyZWFrKSB7DQorICAgIHBGb3JtTm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICB9DQorICBpZiAocExlYWRlck5vZGUgJiYgcEZvcm1Ob2RlKSB7DQorICAgIHBGb3JtTm9kZS0+UmVtb3ZlQ2hpbGQocExlYWRlck5vZGUpOw0KKyAgfQ0KKyAgaWYgKHBUcmFpbGVyTm9kZSAmJiBwRm9ybU5vZGUpIHsNCisgICAgcEZvcm1Ob2RlLT5SZW1vdmVDaGlsZChwVHJhaWxlck5vZGUpOw0KKyAgfQ0KKyAgaWYgKHBUcmFpbGVySXRlbSkgew0KKyAgICBYRkFfUmVsZWFzZUxheW91dEl0ZW0ocFRyYWlsZXJJdGVtKTsNCisgIH0NCit9DQorc3RhdGljIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydEZsb3dlZEl0ZW0oDQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFRoaXMsDQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciomIHBQcm9jZXNzb3IsDQorICAgIEZYX0JPT0wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsDQorICAgIEZYX0JPT0wgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLA0KKyAgICBGWF9GTE9BVCBmQ29udGFpbmVySGVpZ2h0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlRmxvd1N0cmF0ZWd5LA0KKyAgICB1aW50OF90JiB1Q3VySEFsaWduU3RhdGUsDQorICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4oJnJnQ3VyTGluZUxheW91dEl0ZW1zKVszXSwNCisgICAgRlhfQk9PTCBiVXNlQnJlYWtDb250cm9sLA0KKyAgICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQsDQorICAgIEZYX0ZMT0FUIGZSZWFsSGVpZ2h0LA0KKyAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dZLA0KKyAgICBGWF9GTE9BVCYgZkNvbnRlbnRXaWR0aExpbWl0LA0KKyAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dIZWlnaHQsDQorICAgIEZYX0JPT0wmIGJBZGRlZEl0ZW1JblJvdywNCisgICAgRlhfQk9PTCYgYkZvcmNlRW5kUGFnZSwNCisgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwTGF5b3V0Q29udGV4dCA9IE5VTEwsDQorICAgIEZYX0JPT0wgYk5ld1JvdyA9IEZBTFNFKSB7DQorICBGWF9CT09MIGJUYWtlU3BhY2UgPQ0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUpOw0KKyAgdWludDhfdCB1SEFsaWduID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSEFsaWduRW51bVRvSW50KA0KKyAgICAgIHBUaGlzLT5tX3BDdXJDaGlsZE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24pKTsNCisgIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgew0KKyAgICB1SEFsaWduID0gMDsNCisgIH0NCisgIGlmICgoZUZsb3dTdHJhdGVneSAhPSBYRkFfQVRUUklCVVRFRU5VTV9SbF90YiAmJiB1SEFsaWduIDwgdUN1ckhBbGlnblN0YXRlKSB8fA0KKyAgICAgIChlRmxvd1N0cmF0ZWd5ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiICYmIHVIQWxpZ24gPiB1Q3VySEFsaWduU3RhdGUpKSB7DQorICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Sb3dGdWxsQnJlYWs7DQorICB9DQorICB1Q3VySEFsaWduU3RhdGUgPSB1SEFsaWduOw0KKyAgRlhfQk9PTCBiSXNPd25TcGxpdGUgPQ0KKyAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgRlhfQk9PTCBiVXNlUmVhbEhlaWdodCA9DQorICAgICAgYlRha2VTcGFjZSAmJiBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgJiYgYklzT3duU3BsaXRlICYmDQorICAgICAgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLT5HZXRJbnRhY3QoKSA9PQ0KKyAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgRlhfQk9PTCBiSXNUcmFuc0hlaWdodCA9IGJUYWtlU3BhY2U7DQorICBpZiAoYklzVHJhbnNIZWlnaHQgJiYgIWJJc093blNwbGl0ZSkgew0KKyAgICBGWF9CT09MIGJSb290Rm9yY2VUYiA9IEZBTFNFOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0U3RyYXRlZ3kgPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9HZXRMYXlvdXQoDQorICAgICAgICBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZSwgYlJvb3RGb3JjZVRiKTsNCisgICAgaWYgKGVMYXlvdXRTdHJhdGVneSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Mcl90YiB8fA0KKyAgICAgICAgZUxheW91dFN0cmF0ZWd5ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiKSB7DQorICAgICAgYklzVHJhbnNIZWlnaHQgPSBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBiVXNlSW5oZXJpdGVkID0gRkFMU0U7DQorICBDWEZBX0xheW91dENvbnRleHQgbGF5b3V0Q29udGV4dDsNCisgIGlmIChwVGhpcy0+bV9wUGFnZU1ncikgew0KKyAgICBDWEZBX05vZGUqIHBPdmVyZmxvd05vZGUgPQ0KKyAgICAgICAgcFRoaXMtPm1fcFBhZ2VNZ3ItPlF1ZXJ5T3ZlcmZsb3cocFRoaXMtPm1fcEZvcm1Ob2RlKTsNCisgICAgaWYgKHBPdmVyZmxvd05vZGUpIHsNCisgICAgICBsYXlvdXRDb250ZXh0Lm1fcE92ZXJmbG93Tm9kZSA9IHBPdmVyZmxvd05vZGU7DQorICAgICAgbGF5b3V0Q29udGV4dC5tX3BPdmVyZmxvd1Byb2Nlc3NvciA9IHBUaGlzOw0KKyAgICAgIHBMYXlvdXRDb250ZXh0ID0gJmxheW91dENvbnRleHQ7DQorICAgIH0NCisgIH0NCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXRWYWx1ZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmU7DQorICBpZiAoIWJOZXdSb3cgfHwNCisgICAgICBwUHJvY2Vzc29yLT5tX2VQcmVQcm9jZXNzUnMgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSkgew0KKyAgICBlUmV0VmFsdWUgPSBwUHJvY2Vzc29yLT5Eb0xheW91dCgNCisgICAgICAgIGJUYWtlU3BhY2UgPyBiVXNlQnJlYWtDb250cm9sIDogRkFMU0UsDQorICAgICAgICBiVXNlUmVhbEhlaWdodCA/IGZSZWFsSGVpZ2h0IC0gZkNvbnRlbnRDdXJSb3dZIDogWEZBX0xBWU9VVF9GTE9BVF9NQVgsDQorICAgICAgICBiSXNUcmFuc0hlaWdodCA/IGZSZWFsSGVpZ2h0IC0gZkNvbnRlbnRDdXJSb3dZIDogWEZBX0xBWU9VVF9GTE9BVF9NQVgsDQorICAgICAgICBwTGF5b3V0Q29udGV4dCk7DQorICAgIHBQcm9jZXNzb3ItPm1fZVByZVByb2Nlc3NScyA9IGVSZXRWYWx1ZTsNCisgIH0gZWxzZSB7DQorICAgIGVSZXRWYWx1ZSA9IHBQcm9jZXNzb3ItPm1fZVByZVByb2Nlc3NSczsNCisgICAgcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgIH0NCisgIGlmIChwUHJvY2Vzc29yLT5IYXNMYXlvdXRJdGVtKCkgPT0gRkFMU0UpIHsNCisgICAgcmV0dXJuIGVSZXRWYWx1ZTsNCisgIH0NCisgIEZYX0ZMT0FUIGZDaGlsZFdpZHRoLCBmQ2hpbGRIZWlnaHQ7DQorICBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ2hpbGRXaWR0aCwgZkNoaWxkSGVpZ2h0KTsNCisgIGlmIChiVXNlUmVhbEhlaWdodCAmJiBmUmVhbEhlaWdodCA8IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgIGZSZWFsSGVpZ2h0ID0gWEZBX0xBWU9VVF9GTE9BVF9NQVg7DQorICAgIGZBdmFpbEhlaWdodCA9IFhGQV9MQVlPVVRfRkxPQVRfTUFYOw0KKyAgfQ0KKyAgaWYgKCFiVGFrZVNwYWNlIHx8DQorICAgICAgKGZDaGlsZFdpZHRoIDw9IGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB8fA0KKyAgICAgIChmQ29udGVudFdpZHRoTGltaXQgLSBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggPD0NCisgICAgICAgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pKSB7DQorICAgIENYRkFfTm9kZSAqcE92ZXJmbG93TGVhZGVyTm9kZSA9IE5VTEwsICpwT3ZlcmZsb3dUcmFpbGVyTm9kZSA9IE5VTEwsDQorICAgICAgICAgICAgICAqcEZvcm1Ob2RlID0gTlVMTDsNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUcmFpbGVyTGF5b3V0SXRlbSA9IE5VTEw7DQorICAgIEZYX0JPT0wgYklzQWRkVHJhaWxlckhlaWdodCA9IEZBTFNFOw0KKyAgICBpZiAocFRoaXMtPm1fcFBhZ2VNZ3IgJiYNCisgICAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lKSB7DQorICAgICAgcEZvcm1Ob2RlID0gcFRoaXMtPm1fcFBhZ2VNZ3ItPlF1ZXJ5T3ZlcmZsb3cocFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUpOw0KKyAgICAgIGlmIChwRm9ybU5vZGUgPT0gTlVMTCAmJiBwTGF5b3V0Q29udGV4dCAmJg0KKyAgICAgICAgICBwTGF5b3V0Q29udGV4dC0+bV9wT3ZlcmZsb3dQcm9jZXNzb3IpIHsNCisgICAgICAgIHBGb3JtTm9kZSA9IHBMYXlvdXRDb250ZXh0LT5tX3BPdmVyZmxvd05vZGU7DQorICAgICAgICBiVXNlSW5oZXJpdGVkID0gVFJVRTsNCisgICAgICB9DQorICAgICAgaWYgKHBUaGlzLT5tX3BQYWdlTWdyLT5Qcm9jZXNzT3ZlcmZsb3cocEZvcm1Ob2RlLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1RyYWlsZXJOb2RlLCBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSkpIHsNCisgICAgICAgIGlmIChwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd1RyYWlsZXJOb2RlKSkgew0KKyAgICAgICAgICBpZiAocE92ZXJmbG93VHJhaWxlck5vZGUpIHsNCisgICAgICAgICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBPdmVyZmxvd0xlYWRlclByb2Nlc3NvciA9DQorICAgICAgICAgICAgICAgIEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocE92ZXJmbG93VHJhaWxlck5vZGUsIE5VTEwpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgICAgICBwT3ZlcmZsb3dMZWFkZXJQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0NCisgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgICAgICAgICAgcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5Eb0xheW91dChGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgpOw0KKyAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSA9DQorICAgICAgICAgICAgICAgIHBPdmVyZmxvd0xlYWRlclByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpDQorICAgICAgICAgICAgICAgICAgICA/IHBPdmVyZmxvd0xlYWRlclByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKQ0KKyAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KKyAgICAgICAgICAgIGRlbGV0ZSBwT3ZlcmZsb3dMZWFkZXJQcm9jZXNzb3I7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGJVc2VJbmhlcml0ZWQpIHsNCisgICAgICAgICAgICBiSXNBZGRUcmFpbGVySGVpZ2h0ID0NCisgICAgICAgICAgICAgICAgcFRoaXMtPklzQWRkTmV3Um93Rm9yVHJhaWxlcihwVHJhaWxlckxheW91dEl0ZW0pOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGJJc0FkZFRyYWlsZXJIZWlnaHQgPQ0KKyAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5Jc0FkZE5ld1Jvd0ZvclRyYWlsZXIocFRyYWlsZXJMYXlvdXRJdGVtKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYklzQWRkVHJhaWxlckhlaWdodCkgew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZUcmFpbGVySGVpZ2h0ID0gcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQorICAgICAgICAgICAgZkNoaWxkSGVpZ2h0ICs9IGZUcmFpbGVySGVpZ2h0Ow0KKyAgICAgICAgICAgIGJJc0FkZFRyYWlsZXJIZWlnaHQgPSBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYlRha2VTcGFjZSB8fA0KKyAgICAgICAgZkNvbnRlbnRDdXJSb3dZICsgZkNoaWxkSGVpZ2h0IDw9DQorICAgICAgICAgICAgZkF2YWlsSGVpZ2h0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gfHwNCisgICAgICAgICghYkNvbnRhaW5lckhlaWdodEF1dG9TaXplICYmDQorICAgICAgICAgcFRoaXMtPm1fZlVzZWRTaXplICsgZkF2YWlsSGVpZ2h0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gPj0NCisgICAgICAgICAgICAgZkNvbnRhaW5lckhlaWdodCkpIHsNCisgICAgICBpZiAoIWJUYWtlU3BhY2UgfHwgZVJldFZhbHVlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgICAgICAgIGlmIChwUHJvY2Vzc29yLT5tX2JVc2VJbmhlcmlhdGVkKSB7DQorICAgICAgICAgIGlmIChwVHJhaWxlckxheW91dEl0ZW0pIHsNCisgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRUcmFpbGVyQmVmb3JlU3BsaXQoDQorICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IsIGZDaGlsZEhlaWdodCwgcFRyYWlsZXJMYXlvdXRJdGVtKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocFByb2Nlc3Nvci0+SnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwT3ZlcmZsb3dMZWFkZXJOb2RlKSkgew0KKyAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKHBQcm9jZXNzb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93TGVhZGVyTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQgPSBGQUxTRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChiSXNBZGRUcmFpbGVySGVpZ2h0KSB7DQorICAgICAgICAgICAgZkNoaWxkSGVpZ2h0IC09IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBQcm9jZXNzb3ItPlByb2Nlc3NVblVzZU92ZXJGbG93KHBPdmVyZmxvd0xlYWRlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1RyYWlsZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0sIHBGb3JtTm9kZSk7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcENoaWxkTGF5b3V0SXRlbSA9DQorICAgICAgICAgICAgcFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKTsNCisgICAgICAgIGlmIChYRkFfRXhpc3RDb250YWluZXJLZWVwKHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLCBGQUxTRSkgJiYNCisgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0SW50YWN0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZSkgew0KKyAgICAgICAgICBwVGhpcy0+bV9hcnJheUtlZXBJdGVtcy5BZGQocENoaWxkTGF5b3V0SXRlbSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBwVGhpcy0+bV9hcnJheUtlZXBJdGVtcy5SZW1vdmVBbGwoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLkFkZChwQ2hpbGRMYXlvdXRJdGVtKTsNCisgICAgICAgIGJBZGRlZEl0ZW1JblJvdyA9IFRSVUU7DQorICAgICAgICBpZiAoYlRha2VTcGFjZSkgew0KKyAgICAgICAgICBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gZkNoaWxkV2lkdGg7DQorICAgICAgICAgIGlmIChmQ29udGVudEN1clJvd0hlaWdodCA8IGZDaGlsZEhlaWdodCkgew0KKyAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrKSB7DQorICAgICAgICAgIGlmIChwUHJvY2Vzc29yLT5tX2JVc2VJbmhlcmlhdGVkKSB7DQorICAgICAgICAgICAgaWYgKHBUcmFpbGVyTGF5b3V0SXRlbSkgew0KKyAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkVHJhaWxlckJlZm9yZVNwbGl0KA0KKyAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IsIGZDaGlsZEhlaWdodCwgcFRyYWlsZXJMYXlvdXRJdGVtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBQcm9jZXNzb3ItPkp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocE92ZXJmbG93TGVhZGVyTm9kZSkpIHsNCisgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKA0KKyAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IsIHBPdmVyZmxvd0xlYWRlck5vZGUsIEZBTFNFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9iVXNlSW5oZXJpYXRlZCA9IEZBTFNFOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChiSXNBZGRUcmFpbGVySGVpZ2h0KSB7DQorICAgICAgICAgICAgICBmQ2hpbGRIZWlnaHQgLT0gcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBQcm9jZXNzb3ItPlByb2Nlc3NVblVzZU92ZXJGbG93KHBPdmVyZmxvd0xlYWRlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5BZGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7DQorICAgICAgICBiQWRkZWRJdGVtSW5Sb3cgPSBUUlVFOw0KKyAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGZDaGlsZFdpZHRoOw0KKyAgICAgICAgaWYgKGZDb250ZW50Q3VyUm93SGVpZ2h0IDwgZkNoaWxkSGVpZ2h0KSB7DQorICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KKyAgICAgICAgfQ0KICAgICAgICAgcmV0dXJuIGVSZXRWYWx1ZTsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmQ2hpbGRXaWR0aCwgZkNoaWxkSGVpZ2h0Ow0KLSAgICBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ2hpbGRXaWR0aCwgZkNoaWxkSGVpZ2h0KTsNCi0gICAgaWYgKGJVc2VSZWFsSGVpZ2h0ICYmIGZSZWFsSGVpZ2h0IDwgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCi0gICAgICAgIGZSZWFsSGVpZ2h0ID0gWEZBX0xBWU9VVF9GTE9BVF9NQVg7DQotICAgICAgICBmQXZhaWxIZWlnaHQgPSBYRkFfTEFZT1VUX0ZMT0FUX01BWDsNCi0gICAgfQ0KLSAgICBpZiAoIWJUYWtlU3BhY2UgfHwgKGZDaGlsZFdpZHRoIDw9IGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB8fCAoZkNvbnRlbnRXaWR0aExpbWl0IC0gZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIDw9IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlICpwT3ZlcmZsb3dMZWFkZXJOb2RlID0gTlVMTCwgKnBPdmVyZmxvd1RyYWlsZXJOb2RlID0gTlVMTCwgKnBGb3JtTm9kZSA9IE5VTEw7DQotICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRyYWlsZXJMYXlvdXRJdGVtID0gTlVMTDsNCi0gICAgICAgIEZYX0JPT0wgYklzQWRkVHJhaWxlckhlaWdodCA9IEZBTFNFOw0KLSAgICAgICAgaWYocFRoaXMtPm1fcFBhZ2VNZ3IgJiYgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEludGFjdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpIHsNCi0gICAgICAgICAgICBwRm9ybU5vZGUgPSBwVGhpcy0+bV9wUGFnZU1nci0+UXVlcnlPdmVyZmxvdyhwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZSk7DQotICAgICAgICAgICAgaWYocEZvcm1Ob2RlID09IE5VTEwgJiYgcExheW91dENvbnRleHQgJiYgcExheW91dENvbnRleHQtPm1fcE92ZXJmbG93UHJvY2Vzc29yKSB7DQotICAgICAgICAgICAgICAgIHBGb3JtTm9kZSA9IHBMYXlvdXRDb250ZXh0LT5tX3BPdmVyZmxvd05vZGU7DQotICAgICAgICAgICAgICAgIGJVc2VJbmhlcml0ZWQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlUmVzdWx0Ow0KKyAgICAgIGlmIChwVGhpcy0+UHJvY2Vzc0tlZXBGb3JTcGxpdGUoDQorICAgICAgICAgICAgICBwVGhpcywgcFByb2Nlc3NvciwgZVJldFZhbHVlLCByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXSwNCisgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGZDb250ZW50Q3VyUm93WSwNCisgICAgICAgICAgICAgIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwgZVJlc3VsdCkpIHsNCisgICAgICAgIHJldHVybiBlUmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICBiRm9yY2VFbmRQYWdlID0gVFJVRTsNCisgICAgICBGWF9GTE9BVCBmU3BsaXRQb3MgPQ0KKyAgICAgICAgICBwUHJvY2Vzc29yLT5GaW5kU3BsaXRQb3MoZkF2YWlsSGVpZ2h0IC0gZkNvbnRlbnRDdXJSb3dZKTsNCisgICAgICBpZiAoZlNwbGl0UG9zID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPQ0KKyAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsNCisgICAgICAgIGlmIChlTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RiICYmDQorICAgICAgICAgICAgZVJldFZhbHVlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgICAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsNCisgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KKyAgICAgICAgICBiQWRkZWRJdGVtSW5Sb3cgPSBUUlVFOw0KKyAgICAgICAgICBpZiAoYlRha2VTcGFjZSkgew0KKyAgICAgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBmQ2hpbGRXaWR0aDsNCisgICAgICAgICAgICBpZiAoZkNvbnRlbnRDdXJSb3dIZWlnaHQgPCBmQ2hpbGRIZWlnaHQpIHsNCisgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcE92ZXJmbG93TGVhZGVyTm9kZSwgcE92ZXJmbG93VHJhaWxlck5vZGUsIEZBTFNFLCBGQUxTRSkpIHsNCi0gICAgICAgICAgICAgICAgaWYocFByb2Nlc3Nvci0+SnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwT3ZlcmZsb3dUcmFpbGVyTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBPdmVyZmxvd1RyYWlsZXJOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yICpwT3ZlcmZsb3dMZWFkZXJQcm9jZXNzb3IgPSBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBPdmVyZmxvd1RyYWlsZXJOb2RlLCBOVUxMKTsNCi0jaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQotICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd0xlYWRlclByb2Nlc3Nvci0+RG9MYXlvdXQoRkFMU0UsIFhGQV9MQVlPVVRfRkxPQVRfTUFYKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0gPSBwT3ZlcmZsb3dMZWFkZXJQcm9jZXNzb3ItPkhhc0xheW91dEl0ZW0oKSA/IHBPdmVyZmxvd0xlYWRlclByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSA6IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBPdmVyZmxvd0xlYWRlclByb2Nlc3NvcjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGJVc2VJbmhlcml0ZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiSXNBZGRUcmFpbGVySGVpZ2h0ID0gcFRoaXMtPklzQWRkTmV3Um93Rm9yVHJhaWxlcihwVHJhaWxlckxheW91dEl0ZW0pOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiSXNBZGRUcmFpbGVySGVpZ2h0ID0gcFByb2Nlc3Nvci0+SXNBZGROZXdSb3dGb3JUcmFpbGVyKHBUcmFpbGVyTGF5b3V0SXRlbSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZihiSXNBZGRUcmFpbGVySGVpZ2h0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRyYWlsZXJIZWlnaHQgPSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUueTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmQ2hpbGRIZWlnaHQgKz0gZlRyYWlsZXJIZWlnaHQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgYklzQWRkVHJhaWxlckhlaWdodCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1BhZ2VGdWxsQnJlYWs7DQogICAgICAgICB9DQotICAgICAgICBpZighYlRha2VTcGFjZSB8fCBmQ29udGVudEN1clJvd1kgKyBmQ2hpbGRIZWlnaHQgPD0gZkF2YWlsSGVpZ2h0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gfHwNCi0gICAgICAgICAgICAgICAgKCFiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgJiYgcFRoaXMtPm1fZlVzZWRTaXplICsgZkF2YWlsSGVpZ2h0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gPj0gZkNvbnRhaW5lckhlaWdodCkpIHsNCi0gICAgICAgICAgICBpZighYlRha2VTcGFjZSB8fCBlUmV0VmFsdWUgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSkgew0KLSAgICAgICAgICAgICAgICBpZihwUHJvY2Vzc29yLT5tX2JVc2VJbmhlcmlhdGVkKSB7DQotICAgICAgICAgICAgICAgICAgICBpZihwVHJhaWxlckxheW91dEl0ZW0pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRUcmFpbGVyQmVmb3JlU3BsaXQocFByb2Nlc3NvciwgZkNoaWxkSGVpZ2h0LCBwVHJhaWxlckxheW91dEl0ZW0pOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYocFByb2Nlc3Nvci0+SnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwT3ZlcmZsb3dMZWFkZXJOb2RlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKHBQcm9jZXNzb3IsIHBPdmVyZmxvd0xlYWRlck5vZGUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGJJc0FkZFRyYWlsZXJIZWlnaHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmQ2hpbGRIZWlnaHQgLT0gcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLCBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ2hpbGRMYXlvdXRJdGVtID0gcFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKTsNCi0gICAgICAgICAgICAgICAgaWYoWEZBX0V4aXN0Q29udGFpbmVyS2VlcChwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZSwgRkFMU0UpICYmIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lKSB7DQotICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9hcnJheUtlZXBJdGVtcy5BZGQocENoaWxkTGF5b3V0SXRlbSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9hcnJheUtlZXBJdGVtcy5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5BZGQocENoaWxkTGF5b3V0SXRlbSk7DQotICAgICAgICAgICAgICAgIGJBZGRlZEl0ZW1JblJvdyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGlmKGJUYWtlU3BhY2UpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBmQ2hpbGRXaWR0aDsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGZDb250ZW50Q3VyUm93SGVpZ2h0IDwgZkNoaWxkSGVpZ2h0ICkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmKGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrKSB7DQotICAgICAgICAgICAgICAgICAgICBpZihwUHJvY2Vzc29yLT5tX2JVc2VJbmhlcmlhdGVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFRyYWlsZXJMYXlvdXRJdGVtKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFRyYWlsZXJCZWZvcmVTcGxpdChwUHJvY2Vzc29yLCBmQ2hpbGRIZWlnaHQsIHBUcmFpbGVyTGF5b3V0SXRlbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBQcm9jZXNzb3ItPkp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocE92ZXJmbG93TGVhZGVyTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkUGVuZGluZ05vZGUocFByb2Nlc3NvciwgcE92ZXJmbG93TGVhZGVyTm9kZSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX2JVc2VJbmhlcmlhdGVkID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJJc0FkZFRyYWlsZXJIZWlnaHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNoaWxkSGVpZ2h0IC09IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLCBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLkFkZChwUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsNCi0gICAgICAgICAgICAgICAgYkFkZGVkSXRlbUluUm93ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGZDaGlsZFdpZHRoOw0KLSAgICAgICAgICAgICAgICBpZihmQ29udGVudEN1clJvd0hlaWdodCA8IGZDaGlsZEhlaWdodCApIHsNCi0gICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBlUmV0VmFsdWU7DQotICAgICAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Ob2RlICpwVGVtcExlYWRlck5vZGUgPSBOVUxMLCAqcFRlbXBUcmFpbGVyTm9kZSA9IE5VTEw7DQorICAgICAgICBpZiAocFRoaXMtPm1fcFBhZ2VNZ3IgJiYgIXBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQgJiYNCisgICAgICAgICAgICBlUmV0VmFsdWUgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhaykgew0KKyAgICAgICAgICBwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcFRlbXBMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wVHJhaWxlck5vZGUsIEZBTFNFLCBUUlVFKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwVHJhaWxlckxheW91dEl0ZW0gJiYgYklzQWRkVHJhaWxlckhlaWdodCkgew0KKyAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRUcmFpbGVyQmVmb3JlU3BsaXQoDQorICAgICAgICAgICAgICBwUHJvY2Vzc29yLCBmU3BsaXRQb3MsIHBUcmFpbGVyTGF5b3V0SXRlbSwgYlVzZUluaGVyaXRlZCk7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXN1bHQ7DQotICAgICAgICAgICAgaWYocFRoaXMtPlByb2Nlc3NLZWVwRm9yU3BsaXRlKHBUaGlzLCBwUHJvY2Vzc29yLCBlUmV0VmFsdWUsIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBmQ29udGVudEN1clJvd1ksIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwgZVJlc3VsdCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVSZXN1bHQ7DQorICAgICAgICAgIHBQcm9jZXNzb3ItPlNwbGl0TGF5b3V0SXRlbShmU3BsaXRQb3MpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJVc2VJbmhlcml0ZWQpIHsNCisgICAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsNCisgICAgICAgICAgcFRoaXMtPm1fYlVzZUluaGVyaWF0ZWQgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgJiYNCisgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQtPm1fcE5leHRTaWJsaW5nID09DQorICAgICAgICAgICAgICAgICAgTlVMTCAmJg0KKyAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZC0+bV9wRm9ybU5vZGUtPkhhc0ZsYWcoDQorICAgICAgICAgICAgICAgICAgWEZBX05PREVGTEFHX0xheW91dEdlbmVyYXRlZE5vZGUpKSB7DQorICAgICAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0sIHBGb3JtTm9kZSk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKHBQcm9jZXNzb3ItPkp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocE92ZXJmbG93TGVhZGVyTm9kZSkpIHsNCisgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKA0KKyAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IsIHBPdmVyZmxvd0xlYWRlck5vZGUsIEZBTFNFKTsNCiAgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ2hpbGRXaWR0aCwgZkNoaWxkSGVpZ2h0KTsNCisgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KKyAgICAgICAgICBiQWRkZWRJdGVtSW5Sb3cgPSBUUlVFOw0KKyAgICAgICAgICBpZiAoYlRha2VTcGFjZSkgew0KKyAgICAgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBmQ2hpbGRXaWR0aDsNCisgICAgICAgICAgICBpZiAoZkNvbnRlbnRDdXJSb3dIZWlnaHQgPCBmQ2hpbGRIZWlnaHQpIHsNCisgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1BhZ2VGdWxsQnJlYWs7DQorICAgICAgfSBlbHNlIGlmIChmQ29udGVudEN1clJvd1kgPD0gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgIHBQcm9jZXNzb3ItPkdldEN1cnJlbnRDb21wb25lbnRTaXplKGZDaGlsZFdpZHRoLCBmQ2hpbGRIZWlnaHQpOw0KKyAgICAgICAgaWYgKHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3ItPkdldE5leHRBdmFpbENvbnRlbnRIZWlnaHQoZkNoaWxkSGVpZ2h0KSkgew0KKyAgICAgICAgICBDWEZBX05vZGUgKnBUZW1wTGVhZGVyTm9kZSA9IE5VTEwsICpwVGVtcFRyYWlsZXJOb2RlID0gTlVMTDsNCisgICAgICAgICAgaWYgKHBUaGlzLT5tX3BQYWdlTWdyKSB7DQorICAgICAgICAgICAgaWYgKHBGb3JtTm9kZSA9PSBOVUxMICYmIHBMYXlvdXRDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgIHBGb3JtTm9kZSA9IHBMYXlvdXRDb250ZXh0LT5tX3BPdmVyZmxvd1Byb2Nlc3Nvci0+bV9wRm9ybU5vZGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBUaGlzLT5tX3BQYWdlTWdyLT5Qcm9jZXNzT3ZlcmZsb3cocEZvcm1Ob2RlLCBwVGVtcExlYWRlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFRyYWlsZXJOb2RlLCBGQUxTRSwgVFJVRSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGJVc2VJbmhlcml0ZWQpIHsNCisgICAgICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1RyYWlsZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsNCisgICAgICAgICAgICBwVGhpcy0+bV9iVXNlSW5oZXJpYXRlZCA9IFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1BhZ2VGdWxsQnJlYWs7DQorICAgICAgICB9DQorICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5BZGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7DQorICAgICAgICBiQWRkZWRJdGVtSW5Sb3cgPSBUUlVFOw0KKyAgICAgICAgaWYgKGJUYWtlU3BhY2UpIHsNCisgICAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGZDaGlsZFdpZHRoOw0KKyAgICAgICAgICBpZiAoZkNvbnRlbnRDdXJSb3dIZWlnaHQgPCBmQ2hpbGRIZWlnaHQpIHsNCisgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCA9IGZDaGlsZEhlaWdodDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQorICAgICAgICAgIGJGb3JjZUVuZFBhZ2UgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBlUmV0VmFsdWU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPQ0KKyAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsNCisgICAgICAgIGlmIChwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0SW50YWN0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZSAmJg0KKyAgICAgICAgICAgIGVMYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGIpIHsNCisgICAgICAgICAgaWYgKHBUaGlzLT5tX3BQYWdlTWdyKSB7DQorICAgICAgICAgICAgcFRoaXMtPm1fcFBhZ2VNZ3ItPlByb2Nlc3NPdmVyZmxvdyhwRm9ybU5vZGUsIHBPdmVyZmxvd0xlYWRlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocFRyYWlsZXJMYXlvdXRJdGVtKSB7DQorICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkVHJhaWxlckJlZm9yZVNwbGl0KHBQcm9jZXNzb3IsIGZTcGxpdFBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocFByb2Nlc3Nvci0+SnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwT3ZlcmZsb3dMZWFkZXJOb2RlKSkgew0KKyAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKHBQcm9jZXNzb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93TGVhZGVyTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpZiAoZVJldFZhbHVlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgICAgICAgICAgICBpZiAocEZvcm1Ob2RlID09IE5VTEwgJiYgcExheW91dENvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgcEZvcm1Ob2RlID0gcExheW91dENvbnRleHQtPm1fcE92ZXJmbG93UHJvY2Vzc29yLT5tX3BGb3JtTm9kZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBUaGlzLT5tX3BQYWdlTWdyKSB7DQorICAgICAgICAgICAgICBwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcE92ZXJmbG93TGVhZGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsIEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGJVc2VJbmhlcml0ZWQpIHsNCisgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPlByb2Nlc3NVblVzZU92ZXJGbG93KHBPdmVyZmxvd0xlYWRlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsNCisgICAgICAgICAgICAgIHBUaGlzLT5tX2JVc2VJbmhlcmlhdGVkID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1Jvd0Z1bGxCcmVhazsNCisgIH0NCisgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KK30NCitYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0Rmxvd2VkQ29udGFpbmVyKA0KKyAgICBGWF9CT09MIGJVc2VCcmVha0NvbnRyb2wsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVGbG93U3RyYXRlZ3ksDQorICAgIEZYX0ZMT0FUIGZIZWlnaHRMaW1pdCwNCisgICAgRlhfRkxPQVQgZlJlYWxIZWlnaHQsDQorICAgIENYRkFfTGF5b3V0Q29udGV4dCogcENvbnRleHQsDQorICAgIEZYX0JPT0wgYlJvb3RGb3JjZVRiKSB7DQorICBtX2JIYXNBdmFpbEhlaWdodCA9IFRSVUU7DQorICBGWF9GTE9BVCBmQ29udGFpbmVyV2lkdGggPSAwLCBmQ29udGFpbmVySGVpZ2h0ID0gMDsNCisgIEZYX0JPT0wgYkJyZWFrRG9uZSA9IEZBTFNFOw0KKyAgRlhfQk9PTCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IFRSVUUsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IFRSVUU7DQorICBGWF9CT09MIGJGb3JjZUVuZFBhZ2UgPSBGQUxTRTsNCisgIEZYX0JPT0wgYklzTWFudWFsQnJlYWsgPSBGQUxTRTsNCisgIGlmIChtX3BDdXJDaGlsZFByZXByb2Nlc3Nvcikgew0KKyAgICBtX3BDdXJDaGlsZFByZXByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID0NCisgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmU7DQorICB9DQorICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJTcGVjZmllZFNpemUoDQorICAgICAgbV9wRm9ybU5vZGUsIGZDb250YWluZXJXaWR0aCwgZkNvbnRhaW5lckhlaWdodCwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsDQorICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKTsNCisgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZSkgew0KKyAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IEZBTFNFOw0KKyAgICBmQ29udGFpbmVyV2lkdGggPSBwQ29udGV4dC0+bV9mQ3VyQ29sdW1uV2lkdGg7DQorICB9DQorICBpZiAoIWJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgew0KKyAgICBmQ29udGFpbmVySGVpZ2h0IC09IG1fZlVzZWRTaXplOw0KKyAgfQ0KKyAgaWYgKCFiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IG1fcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgRlhfQk9PTCBiRm9jclRiID0gRkFMU0U7DQorICAgIGlmIChwUGFyZW50Tm9kZSAmJg0KKyAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR2V0TGF5b3V0KHBQYXJlbnROb2RlLCBiRm9jclRiKSA9PQ0KKyAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Jvdykgew0KKyAgICAgIENYRkFfTm9kZSogcENoaWxkQ29udGFpbmVyID0gbV9wRm9ybU5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICBYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgICAgaWYgKHBDaGlsZENvbnRhaW5lciAmJg0KKyAgICAgICAgICBwQ2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSkgew0KKyAgICAgICAgZkNvbnRhaW5lckhlaWdodCA9IDA7DQorICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9DQorICAgICAgbV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX01hcmdpbik7DQorICBGWF9GTE9BVCBmTGVmdEluc2V0ID0gMCwgZlRvcEluc2V0ID0gMCwgZlJpZ2h0SW5zZXQgPSAwLCBmQm90dG9tSW5zZXQgPSAwOw0KKyAgaWYgKHBNYXJnaW5Ob2RlKSB7DQorICAgIGZMZWZ0SW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGZUb3BJbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBmUmlnaHRJbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGZCb3R0b21JbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aExpbWl0ID0NCisgICAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA/IFhGQV9MQVlPVVRfRkxPQVRfTUFYDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmQ29udGFpbmVyV2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQ7DQorICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IDAsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IDA7DQorICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQgPSBmSGVpZ2h0TGltaXQgLSBmVG9wSW5zZXQgLSBmQm90dG9tSW5zZXQ7DQorICBpZiAoZkF2YWlsSGVpZ2h0IDwgMCkgew0KKyAgICBtX2JIYXNBdmFpbEhlaWdodCA9IEZBTFNFOw0KKyAgfQ0KKyAgZlJlYWxIZWlnaHQgPSBmUmVhbEhlaWdodCAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsNCisgIEZYX0ZMT0FUIGZDb250ZW50Q3VyUm93WSA9IDA7DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dENoaWxkID0gTlVMTDsNCisgIGlmIChtX3BMYXlvdXRJdGVtICE9IE5VTEwpIHsNCisgICAgaWYgKG1fbkN1ckNoaWxkTm9kZVN0YWdlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUgJiYNCisgICAgICAgIGVGbG93U3RyYXRlZ3kgIT0gWEZBX0FUVFJJQlVURUVOVU1fVGIpIHsNCisgICAgICBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dE5leHQgPSBwTGF5b3V0Q2hpbGQ7IHBMYXlvdXROZXh0Ow0KKyAgICAgICAgICAgcExheW91dE5leHQgPQ0KKyAgICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICBpZiAocExheW91dE5leHQtPm1fc1Bvcy55ICE9IHBMYXlvdXRDaGlsZC0+bV9zUG9zLnkpIHsNCisgICAgICAgICAgcExheW91dENoaWxkID0gcExheW91dE5leHQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRUZW1wQ2hpbGQgPQ0KKyAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgICAgcExheW91dFRlbXBDaGlsZCAhPSBwTGF5b3V0Q2hpbGQ7DQorICAgICAgICAgcExheW91dFRlbXBDaGlsZCA9DQorICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dFRlbXBDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgNCisgICAgICAgICAgICAgIHBMYXlvdXRUZW1wQ2hpbGQtPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgRlhfRkxPQVQgZkNoaWxkQ29udGVudFdpZHRoID0NCisgICAgICAgICAgICBwTGF5b3V0VGVtcENoaWxkLT5tX3NQb3MueCArIHBMYXlvdXRUZW1wQ2hpbGQtPm1fc1NpemUueDsNCisgICAgICAgIEZYX0ZMT0FUIGZDaGlsZENvbnRlbnRIZWlnaHQgPQ0KKyAgICAgICAgICAgIHBMYXlvdXRUZW1wQ2hpbGQtPm1fc1Bvcy55ICsgcExheW91dFRlbXBDaGlsZC0+bV9zU2l6ZS55Ow0KKyAgICAgICAgaWYgKGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoIDwgZkNoaWxkQ29udGVudFdpZHRoKSB7DQorICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkNoaWxkQ29udGVudFdpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA8IGZDaGlsZENvbnRlbnRIZWlnaHQpIHsNCisgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZkNoaWxkQ29udGVudEhlaWdodDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBMYXlvdXRDaGlsZCkgew0KKyAgICAgIGZDb250ZW50Q3VyUm93WSA9IHBMYXlvdXRDaGlsZC0+bV9zUG9zLnk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZkNvbnRlbnRDdXJSb3dZID0gZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0Ow0KKyAgICB9DQorICB9DQorICBmQ29udGVudEN1clJvd1kgKz0gSW5zZXJ0S2VlcExheW91dEl0ZW1zKCk7DQorICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfTm9uZSkgew0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgVFJVRSk7DQorICB9DQorICBmQ29udGVudEN1clJvd1kgKz0NCisgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRQZW5kaW5nSXRlbXModGhpcywgbV9wRm9ybU5vZGUpOw0KKyAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yICYmDQorICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyKSB7DQorICAgIGlmIChYRkFfRXhpc3RDb250YWluZXJLZWVwKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5HZXRGb3JtTm9kZSgpLCBGQUxTRSkpIHsNCisgICAgICBtX3BLZWVwSGVhZE5vZGUgPSBtX3BDdXJDaGlsZE5vZGU7DQorICAgICAgbV9iSXNQcm9jZXNzS2VlcCA9IFRSVUU7DQorICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19LZWVwOw0KKyAgICB9DQorICB9DQorICB3aGlsZSAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZSkgew0KKyAgICBGWF9GTE9BVCBmQ29udGVudEN1clJvd0hlaWdodCA9IDA7DQorICAgIEZYX0ZMT0FUIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCA9IGZDb250ZW50V2lkdGhMaW1pdDsNCisgICAgbV9mV2lkdGhMaW1pdGUgPSBmQ29udGVudEN1clJvd0F2YWlsV2lkdGg7DQorICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4gcmdDdXJMaW5lTGF5b3V0SXRlbXNbM107DQorICAgIHVpbnQ4X3QgdUN1ckhBbGlnblN0YXRlID0NCisgICAgICAgIChlRmxvd1N0cmF0ZWd5ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiID8gMCA6IDIpOw0KKyAgICBpZiAocExheW91dENoaWxkKSB7DQorICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dE5leHQgPSBwTGF5b3V0Q2hpbGQ7IHBMYXlvdXROZXh0Ow0KKyAgICAgICAgICAgcExheW91dE5leHQgPQ0KKyAgICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICBpZiAocExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nID09IE5VTEwgJiYgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgJiYNCisgICAgICAgICAgICBtX3BDdXJDaGlsZFByZXByb2Nlc3Nvci0+bV9wRm9ybU5vZGUgPT0gcExheW91dE5leHQtPm1fcEZvcm1Ob2RlKSB7DQorICAgICAgICAgIHBMYXlvdXROZXh0LT5tX3BOZXh0ID0gbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fcExheW91dEl0ZW07DQorICAgICAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtID0gcExheW91dE5leHQ7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdWludDhfdCB1SEFsaWduID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSEFsaWduRW51bVRvSW50KA0KKyAgICAgICAgICAgIHBMYXlvdXROZXh0LT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbikpOw0KKyAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBMYXlvdXROZXh0KTsNCisgICAgICAgIGlmIChlRmxvd1N0cmF0ZWd5ID09IFhGQV9BVFRSSUJVVEVFTlVNX0xyX3RiKSB7DQorICAgICAgICAgIGlmICh1SEFsaWduID4gdUN1ckhBbGlnblN0YXRlKSB7DQorICAgICAgICAgICAgdUN1ckhBbGlnblN0YXRlID0gdUhBbGlnbjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmICh1SEFsaWduIDwgdUN1ckhBbGlnblN0YXRlKSB7DQorICAgICAgICAgIHVDdXJIQWxpZ25TdGF0ZSA9IHVIQWxpZ247DQorICAgICAgICB9DQorICAgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0TmV4dC0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgIGlmIChwTGF5b3V0TmV4dC0+bV9zU2l6ZS55ID4gZkNvbnRlbnRDdXJSb3dIZWlnaHQpIHsNCisgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCA9IHBMYXlvdXROZXh0LT5tX3NTaXplLnk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IHBMYXlvdXROZXh0LT5tX3NTaXplLng7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmICgoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPT0NCisgICAgICAgICAgcExheW91dENoaWxkKSB7DQorICAgICAgICBtX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkID0gTlVMTDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXROZXh0ID0NCisgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgICBmb3IgKDsgcExheW91dE5leHQ7DQorICAgICAgICAgICAgIHBMYXlvdXROZXh0ID0NCisgICAgICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICAgIGlmICgoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXROZXh0LT5tX3BOZXh0U2libGluZyA9PQ0KKyAgICAgICAgICAgICAgcExheW91dENoaWxkKSB7DQorICAgICAgICAgICAgcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dE5leHRUZW1wID0NCisgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Q2hpbGQ7DQorICAgICAgd2hpbGUgKHBMYXlvdXROZXh0VGVtcCkgew0KKyAgICAgICAgcExheW91dE5leHRUZW1wLT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBTYXZlTGF5b3V0TmV4dCA9DQorICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0TmV4dFRlbXAtPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgICAgcExheW91dE5leHRUZW1wLT5tX3BOZXh0U2libGluZyA9IE5VTEw7DQorICAgICAgICBwTGF5b3V0TmV4dFRlbXAgPSBwU2F2ZUxheW91dE5leHQ7DQorICAgICAgfQ0KKyAgICAgIHBMYXlvdXRDaGlsZCA9IE5VTEw7DQorICAgIH0NCisgICAgd2hpbGUgKG1fcEN1ckNoaWxkTm9kZSkgew0KKyAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciA9IE5VTEw7DQorICAgICAgRlhfQk9PTCBiQWRkZWRJdGVtSW5Sb3cgPSBGQUxTRTsNCisgICAgICBmQ29udGVudEN1clJvd1kgKz0NCisgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0UGVuZGluZ0l0ZW1zKHRoaXMsIG1fcEZvcm1Ob2RlKTsNCisgICAgICBzd2l0Y2ggKG1fbkN1ckNoaWxkTm9kZVN0YWdlKSB7DQorICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0tlZXA6DQorICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX05vbmU6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0JlZm9yZTogew0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaUluZGV4ID0gMDsgaUluZGV4IDwgbV9hcnJheUtlZXBJdGVtcy5HZXRTaXplKCk7DQorICAgICAgICAgICAgICAgaUluZGV4KyspIHsNCisgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcEl0ZW0gPSBtX2FycmF5S2VlcEl0ZW1zLkdldEF0KGlJbmRleCk7DQorICAgICAgICAgICAgbV9wTGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQocEl0ZW0pOw0KKyAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCAtPSBwSXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIENYRkFfTm9kZSAqcExlYWRlck5vZGUgPSBOVUxMLCAqcFRyYWlsZXJOb2RlID0gTlVMTDsNCisgICAgICAgICAgRlhfQk9PTCBiQ3JlYXRlUGFnZSA9IEZBTFNFOw0KKyAgICAgICAgICBpZiAoYlVzZUJyZWFrQ29udHJvbCAmJiBtX3BQYWdlTWdyICYmDQorICAgICAgICAgICAgICBtX3BQYWdlTWdyLT5Qcm9jZXNzQnJlYWtCZWZvcmVPckFmdGVyKG1fcEN1ckNoaWxkTm9kZSwgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlYWRlck5vZGUsIHBUcmFpbGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNyZWF0ZVBhZ2UpICYmDQorICAgICAgICAgICAgICBtX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0Zvcm0gJiYgYkNyZWF0ZVBhZ2UpIHsNCisgICAgICAgICAgICBpZiAoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwTGVhZGVyTm9kZSkpIHsNCisgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKHRoaXMsIHBMZWFkZXJOb2RlLCBUUlVFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKEp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocFRyYWlsZXJOb2RlKSkgew0KKyAgICAgICAgICAgICAgaWYgKG1fcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+R2V0Q2xhc3NJRCgpID09DQorICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0Zvcm0gJiYNCisgICAgICAgICAgICAgICAgICBtX3BMYXlvdXRJdGVtID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkUGVuZGluZ05vZGUodGhpcywgcFRyYWlsZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciA9DQorICAgICAgICAgICAgICAgICAgICBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBUcmFpbGVyTm9kZSwgTlVMTCk7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IG1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgdGhpcywgcFByb2Nlc3NvciwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsDQorICAgICAgICAgICAgICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250YWluZXJIZWlnaHQsIGVGbG93U3RyYXRlZ3ksDQorICAgICAgICAgICAgICAgICAgICB1Q3VySEFsaWduU3RhdGUsIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRfRkxPQVRfTUFYLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgZkNvbnRlbnRDdXJSb3dZLA0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0LCBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCwgYkFkZGVkSXRlbUluUm93LCBiRm9yY2VFbmRQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOw0KKyAgICAgICAgICAgICAgICBkZWxldGUgcFByb2Nlc3NvcjsNCisgICAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IE5VTEw7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZSgNCisgICAgICAgICAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsIFRSVUUpOw0KICAgICAgICAgICAgIGJGb3JjZUVuZFBhZ2UgPSBUUlVFOw0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGxpdFBvcyA9IHBQcm9jZXNzb3ItPkZpbmRTcGxpdFBvcyhmQXZhaWxIZWlnaHQgLSBmQ29udGVudEN1clJvd1kpOw0KLSAgICAgICAgICAgIGlmIChmU3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KLSAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0gcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KLSAgICAgICAgICAgICAgICBpZihlTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RiICYmIGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQotICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLCBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYkFkZGVkSXRlbUluUm93ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGJUYWtlU3BhY2UpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gZkNoaWxkV2lkdGg7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZkNvbnRlbnRDdXJSb3dIZWlnaHQgPCBmQ2hpbGRIZWlnaHQgKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcFRlbXBMZWFkZXJOb2RlID0gTlVMTCwgKnBUZW1wVHJhaWxlck5vZGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBpZihwVGhpcy0+bV9wUGFnZU1nciAmJiAhcFByb2Nlc3Nvci0+bV9iVXNlSW5oZXJpYXRlZCAmJiBlUmV0VmFsdWUgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhaykgew0KLSAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fcFBhZ2VNZ3ItPlByb2Nlc3NPdmVyZmxvdyhwRm9ybU5vZGUsIHBUZW1wTGVhZGVyTm9kZSwgcFRlbXBUcmFpbGVyTm9kZSwgRkFMU0UsIFRSVUUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKHBUcmFpbGVyTGF5b3V0SXRlbSAmJiBiSXNBZGRUcmFpbGVySGVpZ2h0KSB7DQotICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRUcmFpbGVyQmVmb3JlU3BsaXQocFByb2Nlc3NvciwgZlNwbGl0UG9zLCBwVHJhaWxlckxheW91dEl0ZW0sIGJVc2VJbmhlcml0ZWQpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+U3BsaXRMYXlvdXRJdGVtKGZTcGxpdFBvcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYoYlVzZUluaGVyaXRlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwgcE92ZXJmbG93VHJhaWxlck5vZGUsIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIHBUaGlzLT5tX2JVc2VJbmhlcmlhdGVkID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgJiYgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZC0+bV9wTmV4dFNpYmxpbmcgPT0gTlVMTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkLT5tX3BGb3JtTm9kZS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfTGF5b3V0R2VuZXJhdGVkTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLCBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd0xlYWRlck5vZGUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKHBQcm9jZXNzb3IsIHBPdmVyZmxvd0xlYWRlck5vZGUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYocFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPkdldEN1cnJlbnRDb21wb25lbnRTaXplKGZDaGlsZFdpZHRoLCBmQ2hpbGRIZWlnaHQpOw0KLSAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYkFkZGVkSXRlbUluUm93ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGJUYWtlU3BhY2UpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gZkNoaWxkV2lkdGg7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZkNvbnRlbnRDdXJSb3dIZWlnaHQgPCBmQ2hpbGRIZWlnaHQgKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhazsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGZDb250ZW50Q3VyUm93WSA8PSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KLSAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ2hpbGRXaWR0aCwgZkNoaWxkSGVpZ2h0KTsNCi0gICAgICAgICAgICAgICAgaWYocFByb2Nlc3Nvci0+bV9wUGFnZU1nci0+R2V0TmV4dEF2YWlsQ29udGVudEhlaWdodChmQ2hpbGRIZWlnaHQpKSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBUZW1wTGVhZGVyTm9kZSA9IE5VTEwsICpwVGVtcFRyYWlsZXJOb2RlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBUaGlzLT5tX3BQYWdlTWdyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocEZvcm1Ob2RlID09IE5VTEwgJiYgcExheW91dENvbnRleHQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybU5vZGUgPSBwTGF5b3V0Q29udGV4dC0+bV9wT3ZlcmZsb3dQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcFRlbXBMZWFkZXJOb2RlLCBwVGVtcFRyYWlsZXJOb2RlLCBGQUxTRSwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZihiVXNlSW5oZXJpdGVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwgcE92ZXJmbG93VHJhaWxlck5vZGUsIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9iVXNlSW5oZXJpYXRlZCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5BZGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7DQotICAgICAgICAgICAgICAgIGJBZGRlZEl0ZW1JblJvdyA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGlmKGJUYWtlU3BhY2UpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBmQ2hpbGRXaWR0aDsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGZDb250ZW50Q3VyUm93SGVpZ2h0IDwgZkNoaWxkSGVpZ2h0ICkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gZkNoaWxkSGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQotICAgICAgICAgICAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVSZXRWYWx1ZTsNCisgICAgICAgICAgICBiSXNNYW51YWxCcmVhayA9IFRSVUU7DQorICAgICAgICAgICAgZ290byBTdXNwZW5kQW5kQ3JlYXRlTmV3Um93Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0FmdGVyOiB7DQorICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXN1bHQ7DQorICAgICAgICAgIENYRkFfTm9kZSAqcExlYWRlck5vZGUgPSBOVUxMLCAqcFRyYWlsZXJOb2RlID0gTlVMTDsNCisgICAgICAgICAgRlhfQk9PTCBiQ3JlYXRlUGFnZSA9IEZBTFNFOw0KKyAgICAgICAgICBpZiAoYlVzZUJyZWFrQ29udHJvbCAmJiBtX3BQYWdlTWdyICYmDQorICAgICAgICAgICAgICBtX3BQYWdlTWdyLT5Qcm9jZXNzQnJlYWtCZWZvcmVPckFmdGVyKG1fcEN1ckNoaWxkTm9kZSwgRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWFkZXJOb2RlLCBwVHJhaWxlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDcmVhdGVQYWdlKSAmJg0KKyAgICAgICAgICAgICAgbV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9Gb3JtKSB7DQorICAgICAgICAgICAgaWYgKEp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocFRyYWlsZXJOb2RlKSkgew0KKyAgICAgICAgICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yID0NCisgICAgICAgICAgICAgICAgICBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBUcmFpbGVyTm9kZSwgTlVMTCk7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisjZW5kaWYNCisgICAgICAgICAgICAgIGVSZXN1bHQgPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKA0KKyAgICAgICAgICAgICAgICAgIHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgICAgICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRhaW5lckhlaWdodCwgZUZsb3dTdHJhdGVneSwNCisgICAgICAgICAgICAgICAgICB1Q3VySEFsaWduU3RhdGUsIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBGQUxTRSwNCisgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIGZDb250ZW50Q3VyUm93WSwNCisgICAgICAgICAgICAgICAgICBmQ29udGVudFdpZHRoTGltaXQsIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwNCisgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCwgYkFkZGVkSXRlbUluUm93LCBiRm9yY2VFbmRQYWdlLA0KKyAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsNCisgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghYkNyZWF0ZVBhZ2UpIHsNCisgICAgICAgICAgICAgIGlmIChKdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBMZWFkZXJOb2RlKSkgew0KKyAgICAgICAgICAgICAgICBDYWxjdWxhdGVSb3dDaGlsZFBvc2l0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXMsIGVGbG93U3RyYXRlZ3ksDQorICAgICAgICAgICAgICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93WSwgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGZDb250ZW50V2lkdGhMaW1pdCk7DQorICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zLT5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yID0NCisgICAgICAgICAgICAgICAgICAgIEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocExlYWRlck5vZGUsIE5VTEwpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0Rmxvd2VkSXRlbSgNCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGFpbmVySGVpZ2h0LCBlRmxvd1N0cmF0ZWd5LA0KKyAgICAgICAgICAgICAgICAgICAgdUN1ckhBbGlnblN0YXRlLCByZ0N1ckxpbmVMYXlvdXRJdGVtcywgRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIGZDb250ZW50Q3VyUm93WSwNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50V2lkdGhMaW1pdCwgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwNCisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPSBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQotICAgICAgICAgICAgICAgIGlmKHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lICYmIGVMYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGIpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBUaGlzLT5tX3BQYWdlTWdyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fcFBhZ2VNZ3ItPlByb2Nlc3NPdmVyZmxvdyhwRm9ybU5vZGUsIHBPdmVyZmxvd0xlYWRlck5vZGUsIHBPdmVyZmxvd1RyYWlsZXJOb2RlLCBGQUxTRSwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZihwVHJhaWxlckxheW91dEl0ZW0pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRUcmFpbGVyQmVmb3JlU3BsaXQocFByb2Nlc3NvciwgZlNwbGl0UG9zLCBwVHJhaWxlckxheW91dEl0ZW0pOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYocFByb2Nlc3Nvci0+SnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwT3ZlcmZsb3dMZWFkZXJOb2RlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKHBQcm9jZXNzb3IsIHBPdmVyZmxvd0xlYWRlck5vZGUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocEZvcm1Ob2RlID09IE5VTEwgJiYgcExheW91dENvbnRleHQgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybU5vZGUgPSBwTGF5b3V0Q29udGV4dC0+bV9wT3ZlcmZsb3dQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwVGhpcy0+bV9wUGFnZU1ncikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcE92ZXJmbG93TGVhZGVyTm9kZSwgcE92ZXJmbG93VHJhaWxlck5vZGUsIEZBTFNFLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoYlVzZUluaGVyaXRlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLCBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpcy0+bV9iVXNlSW5oZXJpYXRlZCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrOw0KKyAgICAgICAgICAgICAgaWYgKEp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocExlYWRlck5vZGUpKSB7DQorICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKHRoaXMsIHBMZWFkZXJOb2RlLCBUUlVFKTsNCisgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUm93RnVsbEJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KLX0NCi1YRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0Rmxvd2VkQ29udGFpbmVyKEZYX0JPT0wgYlVzZUJyZWFrQ29udHJvbCwgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwgRlhfRkxPQVQgZkhlaWdodExpbWl0LCBGWF9GTE9BVCBmUmVhbEhlaWdodCwgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCwgRlhfQk9PTCBiUm9vdEZvcmNlVGIpDQotew0KLSAgICBtX2JIYXNBdmFpbEhlaWdodCA9IFRSVUU7DQotICAgIEZYX0ZMT0FUIGZDb250YWluZXJXaWR0aCA9IDAsIGZDb250YWluZXJIZWlnaHQgPSAwOw0KLSAgICBGWF9CT09MIGJCcmVha0RvbmUgPSBGQUxTRTsNCi0gICAgRlhfQk9PTCAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBUUlVFLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBUUlVFOw0KLSAgICBGWF9CT09MICBiRm9yY2VFbmRQYWdlID0gRkFMU0U7DQotICAgIEZYX0JPT0wgIGJJc01hbnVhbEJyZWFrID0gRkFMU0U7DQotICAgIGlmKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKSB7DQotICAgICAgICBtX3BDdXJDaGlsZFByZXByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCi0gICAgfQ0KLSAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJTcGVjZmllZFNpemUobV9wRm9ybU5vZGUsIGZDb250YWluZXJXaWR0aCwgZkNvbnRhaW5lckhlaWdodCwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSk7DQotICAgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZSkgew0KLSAgICAgICAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBGQUxTRTsNCi0gICAgICAgIGZDb250YWluZXJXaWR0aCA9IHBDb250ZXh0LT5tX2ZDdXJDb2x1bW5XaWR0aDsNCi0gICAgfQ0KLSAgICBpZighYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQotICAgICAgICBmQ29udGFpbmVySGVpZ2h0IC09IG1fZlVzZWRTaXplOw0KLSAgICB9DQotICAgIGlmKCFiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBtX3BGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICBGWF9CT09MIGJGb2NyVGIgPSBGQUxTRTsNCi0gICAgICAgIGlmKHBQYXJlbnROb2RlICYmIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dldExheW91dChwUGFyZW50Tm9kZSwgYkZvY3JUYikgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm93KSB7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRDb250YWluZXIgPSBtX3BGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KLSAgICAgICAgICAgIGlmKHBDaGlsZENvbnRhaW5lciAmJiBwQ2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZywgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgZkNvbnRhaW5lckhlaWdodCA9IDA7DQotICAgICAgICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IFRSVUU7DQorICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKA0KKyAgICAgICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgVFJVRSk7DQorICAgICAgICAgICAgaWYgKGJDcmVhdGVQYWdlKSB7DQorICAgICAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gVFJVRTsNCisgICAgICAgICAgICAgIGJJc01hbnVhbEJyZWFrID0gVFJVRTsNCisgICAgICAgICAgICAgIGlmIChtX25DdXJDaGlsZE5vZGVTdGFnZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lKSB7DQorICAgICAgICAgICAgICAgIGJCcmVha0RvbmUgPSBUUlVFOw0KKyAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0gbV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX01hcmdpbik7DQotICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmVG9wSW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQotICAgIGlmKHBNYXJnaW5Ob2RlKSB7DQotICAgICAgICBmTGVmdEluc2V0ID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgICAgICBmVG9wSW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgZlJpZ2h0SW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgICAgICBmQm90dG9tSW5zZXQgPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICB9DQotICAgIEZYX0ZMT0FUIGZDb250ZW50V2lkdGhMaW1pdCA9IGJDb250YWluZXJXaWR0aEF1dG9TaXplID8gWEZBX0xBWU9VVF9GTE9BVF9NQVggOiBmQ29udGFpbmVyV2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQ7DQotICAgIEZYX0ZMT0FUIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gMCwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gMDsNCi0gICAgRlhfRkxPQVQgZkF2YWlsSGVpZ2h0ID0gZkhlaWdodExpbWl0IC0gZlRvcEluc2V0IC0gZkJvdHRvbUluc2V0Ow0KLSAgICBpZihmQXZhaWxIZWlnaHQgPCAwKSB7DQotICAgICAgICBtX2JIYXNBdmFpbEhlaWdodCA9IEZBTFNFOw0KLSAgICB9DQotICAgIGZSZWFsSGVpZ2h0ID0gZlJlYWxIZWlnaHQgLSBmVG9wSW5zZXQgLSBmQm90dG9tSW5zZXQ7DQotICAgIEZYX0ZMT0FUIGZDb250ZW50Q3VyUm93WSA9IDA7DQotICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0Q2hpbGQgPSBOVUxMOw0KLSAgICBpZihtX3BMYXlvdXRJdGVtICE9IE5VTEwpIHsNCi0gICAgICAgIGlmIChtX25DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lICYmIGVGbG93U3RyYXRlZ3kgIT0gWEZBX0FUVFJJQlVURUVOVU1fVGIpIHsNCi0gICAgICAgICAgICBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQotICAgICAgICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dE5leHQgPSBwTGF5b3V0Q2hpbGQ7IHBMYXlvdXROZXh0OyBwTGF5b3V0TmV4dCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nKSB7DQotICAgICAgICAgICAgICAgIGlmIChwTGF5b3V0TmV4dC0+bV9zUG9zLnkgIT0gcExheW91dENoaWxkLT5tX3NQb3MueSkgew0KLSAgICAgICAgICAgICAgICAgICAgcExheW91dENoaWxkID0gcExheW91dE5leHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBmb3IoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRUZW1wQ2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7IHBMYXlvdXRUZW1wQ2hpbGQgIT0gcExheW91dENoaWxkOyBwTGF5b3V0VGVtcENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0VGVtcENoaWxkLT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgICAgIGlmKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocExheW91dFRlbXBDaGlsZC0+bV9wRm9ybU5vZGUpKSB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDaGlsZENvbnRlbnRXaWR0aCA9IHBMYXlvdXRUZW1wQ2hpbGQtPm1fc1Bvcy54ICsgcExheW91dFRlbXBDaGlsZC0+bV9zU2l6ZS54Ow0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ2hpbGRDb250ZW50SGVpZ2h0ID0gcExheW91dFRlbXBDaGlsZC0+bV9zUG9zLnkgKyBwTGF5b3V0VGVtcENoaWxkLT5tX3NTaXplLnk7DQotICAgICAgICAgICAgICAgIGlmKGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoIDwgZkNoaWxkQ29udGVudFdpZHRoKSB7DQotICAgICAgICAgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGZDaGlsZENvbnRlbnRXaWR0aDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZihmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPCBmQ2hpbGRDb250ZW50SGVpZ2h0KSB7DQotICAgICAgICAgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmQ2hpbGRDb250ZW50SGVpZ2h0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBMYXlvdXRDaGlsZCkgew0KLSAgICAgICAgICAgIGZDb250ZW50Q3VyUm93WSA9IHBMYXlvdXRDaGlsZC0+bV9zUG9zLnk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZDb250ZW50Q3VyUm93WSA9IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBmQ29udGVudEN1clJvd1kgKz0gSW5zZXJ0S2VlcExheW91dEl0ZW1zKCk7DQotICAgIGlmKG1fbkN1ckNoaWxkTm9kZVN0YWdlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX05vbmUpIHsNCi0gICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZShtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgVFJVRSk7DQotICAgIH0NCi0gICAgZkNvbnRlbnRDdXJSb3dZICs9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydFBlbmRpbmdJdGVtcyh0aGlzLCBtX3BGb3JtTm9kZSk7DQotICAgIGlmKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yICYmIG1fbkN1ckNoaWxkTm9kZVN0YWdlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcikgew0KLSAgICAgICAgaWYoWEZBX0V4aXN0Q29udGFpbmVyS2VlcChtX3BDdXJDaGlsZFByZXByb2Nlc3Nvci0+R2V0Rm9ybU5vZGUoKSwgRkFMU0UpKSB7DQotICAgICAgICAgICAgbV9wS2VlcEhlYWROb2RlID0gbV9wQ3VyQ2hpbGROb2RlOw0KLSAgICAgICAgICAgIG1fYklzUHJvY2Vzc0tlZXAgPSBUUlVFOw0KLSAgICAgICAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfS2VlcDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB3aGlsZShtX25DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lKSB7DQotICAgICAgICBGWF9GTE9BVCBmQ29udGVudEN1clJvd0hlaWdodCA9IDA7DQotICAgICAgICBGWF9GTE9BVCBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggPSBmQ29udGVudFdpZHRoTGltaXQ7DQotICAgICAgICBtX2ZXaWR0aExpbWl0ZSA9IGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aDsNCi0gICAgICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4gcmdDdXJMaW5lTGF5b3V0SXRlbXNbM107DQotICAgICAgICB1aW50OF90IHVDdXJIQWxpZ25TdGF0ZSA9IChlRmxvd1N0cmF0ZWd5ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiID8gMCA6IDIpOw0KLSAgICAgICAgaWYgKHBMYXlvdXRDaGlsZCkgew0KLSAgICAgICAgICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXROZXh0ID0gcExheW91dENoaWxkOyBwTGF5b3V0TmV4dDsgcExheW91dE5leHQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXROZXh0LT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgICAgICAgICBpZiAocExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nID09IE5VTEwgJiYgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgJiYgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fcEZvcm1Ob2RlID09IHBMYXlvdXROZXh0LT5tX3BGb3JtTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgcExheW91dE5leHQtPm1fcE5leHQgPSBtX3BDdXJDaGlsZFByZXByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbTsNCi0gICAgICAgICAgICAgICAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtID0gcExheW91dE5leHQ7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB1aW50OF90IHVIQWxpZ24gPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9IQWxpZ25FbnVtVG9JbnQocExheW91dE5leHQtPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduKSk7DQotICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLkFkZChwTGF5b3V0TmV4dCk7DQotICAgICAgICAgICAgICAgIGlmIChlRmxvd1N0cmF0ZWd5ID09IFhGQV9BVFRSSUJVVEVFTlVNX0xyX3RiKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAodUhBbGlnbiA+IHVDdXJIQWxpZ25TdGF0ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVDdXJIQWxpZ25TdGF0ZSA9IHVIQWxpZ247DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodUhBbGlnbiA8IHVDdXJIQWxpZ25TdGF0ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgdUN1ckhBbGlnblN0YXRlID0gdUhBbGlnbjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0TmV4dC0+bV9wRm9ybU5vZGUpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAocExheW91dE5leHQtPm1fc1NpemUueSA+IGZDb250ZW50Q3VyUm93SGVpZ2h0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBwTGF5b3V0TmV4dC0+bV9zU2l6ZS55Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IHBMYXlvdXROZXh0LT5tX3NTaXplLng7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCA9PSBwTGF5b3V0Q2hpbGQpIHsNCi0gICAgICAgICAgICAgICAgbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCA9IE5VTEw7DQorICAgICAgICAgICAgZ290byBTdXNwZW5kQW5kQ3JlYXRlTmV3Um93Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kTGVhZGVyOiB7DQorICAgICAgICAgIENYRkFfTm9kZSogcExlYWRlck5vZGUgPSBOVUxMOw0KKyAgICAgICAgICBpZiAobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IpIHsNCisgICAgICAgICAgICBwUHJvY2Vzc29yID0gbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3I7DQorICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKG1fcFBhZ2VNZ3IgJiYNCisgICAgICAgICAgICAgICAgICAgICBtX3BQYWdlTWdyLT5Qcm9jZXNzQm9va2VuZExlYWRlck9yVHJhaWxlcigNCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLCBUUlVFLCBwTGVhZGVyTm9kZSkpIHsNCisgICAgICAgICAgICBwUHJvY2Vzc29yID0NCisgICAgICAgICAgICAgICAgRlhfTkVXIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihwTGVhZGVyTm9kZSwgbV9wUGFnZU1ncik7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKHBQcm9jZXNzb3IpIHsNCisgICAgICAgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0Rmxvd2VkSXRlbSgNCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGFpbmVySGVpZ2h0LCBlRmxvd1N0cmF0ZWd5LA0KKyAgICAgICAgICAgICAgICAgICAgdUN1ckhBbGlnblN0YXRlLCByZ0N1ckxpbmVMYXlvdXRJdGVtcywgYlVzZUJyZWFrQ29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgIGZBdmFpbEhlaWdodCwgZlJlYWxIZWlnaHQsIGZDb250ZW50Q3VyUm93WSwNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50V2lkdGhMaW1pdCwgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwNCisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQorICAgICAgICAgICAgICBnb3RvIFN1c3BlbmRBbmRDcmVhdGVOZXdSb3c7DQogICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXROZXh0ID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiltX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KLSAgICAgICAgICAgICAgICBmb3IgKDsgcExheW91dE5leHQ7IHBMYXlvdXROZXh0ID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0TmV4dC0+bV9wTmV4dFNpYmxpbmcpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXROZXh0LT5tX3BOZXh0U2libGluZyA9PSBwTGF5b3V0Q2hpbGQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0TmV4dC0+bV9wTmV4dFNpYmxpbmcgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBkZWxldGUgcFByb2Nlc3NvcjsNCisgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBOVUxMOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dE5leHRUZW1wID0gKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwTGF5b3V0Q2hpbGQ7DQotICAgICAgICAgICAgd2hpbGUgKHBMYXlvdXROZXh0VGVtcCkgew0KLSAgICAgICAgICAgICAgICBwTGF5b3V0TmV4dFRlbXAtPm1fcFBhcmVudCA9IE5VTEw7DQotICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwU2F2ZUxheW91dE5leHQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBMYXlvdXROZXh0VGVtcC0+bV9wTmV4dFNpYmxpbmc7DQotICAgICAgICAgICAgICAgIHBMYXlvdXROZXh0VGVtcC0+bV9wTmV4dFNpYmxpbmcgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBwTGF5b3V0TmV4dFRlbXAgPSBwU2F2ZUxheW91dE5leHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBMYXlvdXRDaGlsZCA9IE5VTEw7DQotICAgICAgICB9DQotICAgICAgICB3aGlsZShtX3BDdXJDaGlsZE5vZGUpIHsNCi0gICAgICAgICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IgPSBOVUxMOw0KLSAgICAgICAgICAgIEZYX0JPT0wgYkFkZGVkSXRlbUluUm93ID0gRkFMU0U7DQotICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dZICs9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydFBlbmRpbmdJdGVtcyh0aGlzLCBtX3BGb3JtTm9kZSk7DQotICAgICAgICAgICAgc3dpdGNoKG1fbkN1ckNoaWxkTm9kZVN0YWdlKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfS2VlcDoNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Ob25lOg0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtCZWZvcmU6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpSW5kZXggPSAwOyBpSW5kZXggPCBtX2FycmF5S2VlcEl0ZW1zLkdldFNpemUoKTsgaUluZGV4KyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBJdGVtID0gbV9hcnJheUtlZXBJdGVtcy5HZXRBdChpSW5kZXgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwSXRlbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCAtPSBwSXRlbS0+bV9zU2l6ZS55Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBMZWFkZXJOb2RlID0gTlVMTCwgKnBUcmFpbGVyTm9kZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3JlYXRlUGFnZSA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJVc2VCcmVha0NvbnRyb2wgJiYgbV9wUGFnZU1nciAmJiBtX3BQYWdlTWdyLT5Qcm9jZXNzQnJlYWtCZWZvcmVPckFmdGVyKG1fcEN1ckNoaWxkTm9kZSwgVFJVRSwgcExlYWRlck5vZGUsIHBUcmFpbGVyTm9kZSwgYkNyZWF0ZVBhZ2UpICYmIG1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRm9ybQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYkNyZWF0ZVBhZ2UpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwTGVhZGVyTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKHRoaXMsIHBMZWFkZXJOb2RlLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihKdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBUcmFpbGVyTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1fcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Zvcm0gJiYgbV9wTGF5b3V0SXRlbSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkUGVuZGluZ05vZGUodGhpcywgcFRyYWlsZXJOb2RlLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yICpwUHJvY2Vzc29yID0gRlhfTkVXIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihwVHJhaWxlck5vZGUsIE5VTEwpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kVHJhaWxlcjogew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBUcmFpbGVyTm9kZSA9IE5VTEw7DQorICAgICAgICAgIGlmIChtX3BDdXJDaGlsZFByZXByb2Nlc3Nvcikgew0KKyAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBtX3BDdXJDaGlsZFByZXByb2Nlc3NvcjsNCisgICAgICAgICAgICBtX3BDdXJDaGlsZFByZXByb2Nlc3NvciA9IE5VTEw7DQorICAgICAgICAgIH0gZWxzZSBpZiAobV9wUGFnZU1nciAmJg0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFBhZ2VNZ3ItPlByb2Nlc3NCb29rZW5kTGVhZGVyT3JUcmFpbGVyKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIEZBTFNFLCBwVHJhaWxlck5vZGUpKSB7DQorICAgICAgICAgICAgcFByb2Nlc3NvciA9DQorICAgICAgICAgICAgICAgIEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocFRyYWlsZXJOb2RlLCBtX3BQYWdlTWdyKTsNCiAjaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IG1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KICNlbmRpZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydEZsb3dlZEl0ZW0odGhpcywgcFByb2Nlc3NvciwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRhaW5lckhlaWdodCwgZUZsb3dTdHJhdGVneSwgdUN1ckhBbGlnblN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXMsIEZBTFNFLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIGZDb250ZW50Q3VyUm93WSwgZkNvbnRlbnRXaWR0aExpbWl0LCBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCwgYkFkZGVkSXRlbUluUm93LCBiRm9yY2VFbmRQYWdlLCBwQ29udGV4dCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZvcmNlRW5kUGFnZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJc01hbnVhbEJyZWFrID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBTdXNwZW5kQW5kQ3JlYXRlTmV3Um93Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQWZ0ZXI6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlUmVzdWx0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcExlYWRlck5vZGUgPSBOVUxMLCAqcFRyYWlsZXJOb2RlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDcmVhdGVQYWdlID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoYlVzZUJyZWFrQ29udHJvbCAmJiBtX3BQYWdlTWdyICYmIG1fcFBhZ2VNZ3ItPlByb2Nlc3NCcmVha0JlZm9yZU9yQWZ0ZXIobV9wQ3VyQ2hpbGROb2RlLCBGQUxTRSwgcExlYWRlck5vZGUsIHBUcmFpbGVyTm9kZSwgYkNyZWF0ZVBhZ2UpICYmIG1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRm9ybSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihKdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBUcmFpbGVyTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciAqcFByb2Nlc3NvciA9IEZYX05FVyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocFRyYWlsZXJOb2RlLCBOVUxMKTsNCi0jaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IG1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVJlc3VsdCA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydEZsb3dlZEl0ZW0odGhpcywgcFByb2Nlc3NvciwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRhaW5lckhlaWdodCwgZUZsb3dTdHJhdGVneSwgdUN1ckhBbGlnblN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIFhGQV9MQVlPVVRfRkxPQVRfTUFYLCBmQ29udGVudEN1clJvd1ksIGZDb250ZW50V2lkdGhMaW1pdCwgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBiQWRkZWRJdGVtSW5Sb3csIGJGb3JjZUVuZFBhZ2UsIHBDb250ZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWJDcmVhdGVQYWdlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihKdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBMZWFkZXJOb2RlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24ocmdDdXJMaW5lTGF5b3V0SXRlbXMsIGVGbG93U3RyYXRlZ3ksIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LCBmQ29udGVudEN1clJvd1ksIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBmQ29udGVudFdpZHRoTGltaXQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zLT5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IgKnBQcm9jZXNzb3IgPSBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBMZWFkZXJOb2RlLCBOVUxMKTsNCi0jaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCi0jZW5kaWYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250YWluZXJIZWlnaHQsIGVGbG93U3RyYXRlZ3ksIHVDdXJIQWxpZ25TdGF0ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIFhGQV9MQVlPVVRfRkxPQVRfTUFYLCBmQ29udGVudEN1clJvd1ksIGZDb250ZW50V2lkdGhMaW1pdCwgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwgcENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwTGVhZGVyTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRQZW5kaW5nTm9kZSh0aGlzLCBwTGVhZGVyTm9kZSwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYkNyZWF0ZVBhZ2UpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGb3JjZUVuZFBhZ2UgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklzTWFudWFsQnJlYWsgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCcmVha0RvbmUgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kTGVhZGVyOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTGVhZGVyTm9kZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBtX3BDdXJDaGlsZFByZXByb2Nlc3NvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihtX3BQYWdlTWdyICYmIG1fcFBhZ2VNZ3ItPlByb2Nlc3NCb29rZW5kTGVhZGVyT3JUcmFpbGVyKG1fcEN1ckNoaWxkTm9kZSwgVFJVRSwgcExlYWRlck5vZGUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBMZWFkZXJOb2RlLCBtX3BQYWdlTWdyKTsNCi0jaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQotI2VuZGlmDQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBQcm9jZXNzb3IpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0Rmxvd2VkSXRlbSh0aGlzLCBwUHJvY2Vzc29yLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGFpbmVySGVpZ2h0LCBlRmxvd1N0cmF0ZWd5LCB1Q3VySEFsaWduU3RhdGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXMsIGJVc2VCcmVha0NvbnRyb2wsIGZBdmFpbEhlaWdodCwgZlJlYWxIZWlnaHQsIGZDb250ZW50Q3VyUm93WSwgZkNvbnRlbnRXaWR0aExpbWl0LCBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwgcENvbnRleHQpICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kVHJhaWxlcjogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRyYWlsZXJOb2RlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJDaGlsZFByZXByb2Nlc3NvciA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKG1fcFBhZ2VNZ3IgJiYgbV9wUGFnZU1nci0+UHJvY2Vzc0Jvb2tlbmRMZWFkZXJPclRyYWlsZXIobV9wQ3VyQ2hpbGROb2RlLCBGQUxTRSwgcFRyYWlsZXJOb2RlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yID0gRlhfTkVXIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihwVHJhaWxlck5vZGUsIG1fcFBhZ2VNZ3IpOw0KLSNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCi0jZW5kaWYNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFByb2Nlc3Nvcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250YWluZXJIZWlnaHQsIGVGbG93U3RyYXRlZ3ksIHVDdXJIQWxpZ25TdGF0ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtcywgYlVzZUJyZWFrQ29udHJvbCwgZkF2YWlsSGVpZ2h0LCBmUmVhbEhlaWdodCwgZkNvbnRlbnRDdXJSb3dZLCBmQ29udGVudFdpZHRoTGltaXQsIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCwgYkFkZGVkSXRlbUluUm93LCBiRm9yY2VFbmRQYWdlLCBwQ29udGV4dCkgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBTdXNwZW5kQW5kQ3JlYXRlTmV3Um93Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcjoNCi0gICAgICAgICAgICAgICAgICAgIEFTU0VSVChtX3BDdXJDaGlsZE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKG1fcEN1ckNoaWxkTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoZkNvbnRlbnRDdXJSb3dZID49IGZIZWlnaHRMaW1pdCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OICYmIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UobV9wQ3VyQ2hpbGROb2RlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJGb3JjZUVuZFBhZ2UgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKG1fcEN1ckNoaWxkTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOZXdSb3cgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJDaGlsZFByZXByb2Nlc3NvciA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZXdSb3cgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBGWF9ORVcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKG1fcEN1ckNoaWxkTm9kZSwgbV9wUGFnZU1ncik7DQotI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IG1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRQZW5kaW5nSXRlbXMocFByb2Nlc3NvciwgbV9wQ3VyQ2hpbGROb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBycyA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydEZsb3dlZEl0ZW0odGhpcywgcFByb2Nlc3NvciwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRhaW5lckhlaWdodCwgZUZsb3dTdHJhdGVneSwgdUN1ckhBbGlnblN0YXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXMsIGJVc2VCcmVha0NvbnRyb2wsIGZBdmFpbEhlaWdodCwgZlJlYWxIZWlnaHQsIGZDb250ZW50Q3VyUm93WSwgZkNvbnRlbnRXaWR0aExpbWl0LCBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCwgYkFkZGVkSXRlbUluUm93LCBiRm9yY2VFbmRQYWdlLCBwQ29udGV4dCwgYk5ld1Jvdyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHJzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfTWFudWFsQnJlYWs6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXNNYW51YWxCcmVhayA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhazoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGb3JjZUVuZFBhZ2UgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1Jvd0Z1bGxCcmVhazoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dZICs9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydFBlbmRpbmdJdGVtcyhwUHJvY2Vzc29yLCBtX3BDdXJDaGlsZE5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lOg0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBUUlVFKTsNCi0gICAgICAgICAgICBpZihiQWRkZWRJdGVtSW5Sb3cgJiYgZUZsb3dTdHJhdGVneSA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYikgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocFByb2Nlc3Nvcikgew0KKyAgICAgICAgICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgdGhpcywgcFByb2Nlc3NvciwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsDQorICAgICAgICAgICAgICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250YWluZXJIZWlnaHQsIGVGbG93U3RyYXRlZ3ksDQorICAgICAgICAgICAgICAgICAgICB1Q3VySEFsaWduU3RhdGUsIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBiVXNlQnJlYWtDb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgZkF2YWlsSGVpZ2h0LCBmUmVhbEhlaWdodCwgZkNvbnRlbnRDdXJSb3dZLA0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0LCBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCwgYkFkZGVkSXRlbUluUm93LCBiRm9yY2VFbmRQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsNCiAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IE5VTEw7DQogICAgICAgICAgICAgfQ0KLVN1c3BlbmRBbmRDcmVhdGVOZXdSb3c6DQotICAgICAgICAgICAgaWYgKHBQcm9jZXNzb3IpIHsNCi0gICAgICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBwUHJvY2Vzc29yOw0KLSAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyOg0KKyAgICAgICAgICBBU1NFUlQobV9wQ3VyQ2hpbGROb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSk7DQorICAgICAgICAgIGlmIChtX3BDdXJDaGlsZE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCiAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIENhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24ocmdDdXJMaW5lTGF5b3V0SXRlbXMsIGVGbG93U3RyYXRlZ3ksIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIGZDb250ZW50Q3VyUm93WSwgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGZDb250ZW50V2lkdGhMaW1pdCwgYlJvb3RGb3JjZVRiKTsNCi0gICAgICAgIG1fZldpZHRoTGltaXRlID0gZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoOw0KLSAgICAgICAgaWYoYkZvcmNlRW5kUGFnZSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIEZYX0JPT0wgYlJldFZhbHVlID0gKG1fbkN1ckNoaWxkTm9kZVN0YWdlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUgJiYgbV9yZ1BlbmRpbmdOb2Rlcy5HZXRDb3VudCgpID09IDApOw0KLSAgICBpZihiQnJlYWtEb25lKSB7DQotICAgICAgICBiUmV0VmFsdWUgPSBGQUxTRTsNCi0gICAgfQ0KLSAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJDb21wb25lbnRTaXplRnJvbUNvbnRlbnRTaXplKG1fcEZvcm1Ob2RlLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIGZDb250YWluZXJXaWR0aCwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIGZDb250YWluZXJIZWlnaHQpOw0KLSAgICBpZihmQ29udGFpbmVySGVpZ2h0ID49IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OIHx8IG1fcExheW91dEl0ZW0gfHwgYlJldFZhbHVlKSB7DQotICAgICAgICBpZihtX3BMYXlvdXRJdGVtID09IE5VTEwpIHsNCi0gICAgICAgICAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoZkNvbnRhaW5lckhlaWdodCA8IDAgKSB7DQotICAgICAgICAgICAgZkNvbnRhaW5lckhlaWdodCA9IDA7DQotICAgICAgICB9DQotICAgICAgICBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQpOw0KLSAgICAgICAgaWYoYkZvcmNlRW5kUGFnZSkgew0KLSAgICAgICAgICAgIG1fZlVzZWRTaXplID0gMDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9mVXNlZFNpemUgKz0gbV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBiUmV0VmFsdWUgPyBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lIDogKGJJc01hbnVhbEJyZWFrID8gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfTWFudWFsQnJlYWsgOiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrKTsNCi19DQotRlhfQk9PTAkgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkNhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24oQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqPigmcmdDdXJMaW5lTGF5b3V0SXRlbXMpWzNdLCBYRkFfQVRUUklCVVRFRU5VTSBlRmxvd1N0cmF0ZWd5LCBGWF9CT09MIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwNCi0gICAgICAgIEZYX0JPT0wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIEZYX0ZMT0FUJiBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwgRlhfRkxPQVQmIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93WSwgRlhfRkxPQVQgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIEZYX0ZMT0FUIGZDb250ZW50V2lkdGhMaW1pdCwgIEZYX0JPT0wgYlJvb3RGb3JjZVRiKQ0KLXsNCi0gICAgaW50MzJfdCBuR3JvdXBMZW5ndGhzWzNdID0gezAsIDAsIDB9Ow0KLSAgICBGWF9GTE9BVCAgZkdyb3VwV2lkdGhzWzNdID0gezAsIDAsIDB9Ow0KLSAgICBpbnQzMl90IG5Ub3RhbExlbmd0aCA9IDA7DQotICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSArKykgew0KLSAgICAgICAgbkdyb3VwTGVuZ3Roc1tpXSA9IHJnQ3VyTGluZUxheW91dEl0ZW1zW2ldLkdldFNpemUoKTsNCi0gICAgICAgIGZvcihpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzW2ldLCBqID0gMDsgaiA8IGM7IGorKykgew0KLSAgICAgICAgICAgIG5Ub3RhbExlbmd0aCsrOw0KLSAgICAgICAgICAgIGlmKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocmdDdXJMaW5lTGF5b3V0SXRlbXNbaV1bal0tPm1fcEZvcm1Ob2RlKSkgew0KLSAgICAgICAgICAgICAgICBmR3JvdXBXaWR0aHNbaV0gKz0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbaV1bal0tPm1fc1NpemUueDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYoIW5Ub3RhbExlbmd0aCkgew0KLSAgICAgICAgaWYoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQotICAgICAgICAgICAgRlhfRkxPQVQgZk5ld0hlaWdodCA9IGZDb250ZW50Q3VyUm93WTsNCi0gICAgICAgICAgICBpZihmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPiBmTmV3SGVpZ2h0KSB7DQotICAgICAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IGZOZXdIZWlnaHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmKG1fcExheW91dEl0ZW0gPT0gTlVMTCkgew0KLSAgICAgICAgbV9wTGF5b3V0SXRlbSA9IENyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKG1fcEZvcm1Ob2RlKTsNCi0gICAgfQ0KLSAgICBpZiAoZUZsb3dTdHJhdGVneSAhPSBYRkFfQVRUUklCVVRFRU5VTV9SbF90Yikgew0KLSAgICAgICAgRlhfRkxPQVQgZkN1clBvczsNCi0gICAgICAgIGZDdXJQb3MgPSAwOw0KLSAgICAgICAgZm9yKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbMF0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQotICAgICAgICAgICAgaWYoYlJvb3RGb3JjZVRiKSB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVk7DQotICAgICAgICAgICAgICAgIENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MocmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fcEZvcm1Ob2RlLCByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9zU2l6ZS54LCByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9zU2l6ZS55LCBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCi0gICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1Bvcy5TZXQoZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGZDb250ZW50Q3VyUm93WSA+PSBmSGVpZ2h0TGltaXQgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiAmJg0KKyAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShtX3BDdXJDaGlsZE5vZGUpKSB7DQorICAgICAgICAgICAgYkZvcmNlRW5kUGFnZSA9IFRSVUU7DQorICAgICAgICAgICAgZ290byBTdXNwZW5kQW5kQ3JlYXRlTmV3Um93Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChtX3BDdXJDaGlsZE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7DQorICAgICAgICAgICAgRlhfQk9PTCBiTmV3Um93ID0gRkFMU0U7DQorICAgICAgICAgICAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKSB7DQorICAgICAgICAgICAgICBwUHJvY2Vzc29yID0gbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3I7DQorICAgICAgICAgICAgICBtX3BDdXJDaGlsZFByZXByb2Nlc3NvciA9IE5VTEw7DQorICAgICAgICAgICAgICBiTmV3Um93ID0gVFJVRTsNCiAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9zUG9zLlNldChmQ3VyUG9zLCBmQ29udGVudEN1clJvd1kpOw0KLSAgICAgICAgICAgICAgICBpZihYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3BGb3JtTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZDdXJQb3MgKz0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1NpemUueDsNCi0gICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgcFByb2Nlc3NvciA9DQorICAgICAgICAgICAgICAgICAgRlhfTkVXIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihtX3BDdXJDaGlsZE5vZGUsIG1fcFBhZ2VNZ3IpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQogICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdKTsNCi0gICAgICAgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZkN1clBvcyA9IChmQ29udGVudFdpZHRoTGltaXQgKyBmR3JvdXBXaWR0aHNbMF0gLSBmR3JvdXBXaWR0aHNbMV0gLSBmR3JvdXBXaWR0aHNbMl0pIC8gMjsNCi0gICAgICAgIGZvcihpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzWzFdLCBqID0gMDsgaiA8IGM7IGorKykgew0KLSAgICAgICAgICAgIGlmKGJSb290Rm9yY2VUYikgew0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZOw0KLSAgICAgICAgICAgICAgICBDYWxjdWxhdGVQb3NpdGlvbmVkQ29udGFpbmVyUG9zKHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3BGb3JtTm9kZSwgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1NpemUueCwgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1NpemUueSwgZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQotICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NQb3MuU2V0KGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NQb3MuU2V0KGZDdXJQb3MsIGZDb250ZW50Q3VyUm93WSk7DQotICAgICAgICAgICAgICAgIGlmKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fcEZvcm1Ob2RlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZkN1clBvcyArPSByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zU2l6ZS54Ow0KLSAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0UGVuZGluZ0l0ZW1zKHBQcm9jZXNzb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1ckNoaWxkTm9kZSk7DQorICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgcnMgPQ0KKyAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgdGhpcywgcFByb2Nlc3NvciwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsDQorICAgICAgICAgICAgICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250YWluZXJIZWlnaHQsIGVGbG93U3RyYXRlZ3ksDQorICAgICAgICAgICAgICAgICAgICB1Q3VySEFsaWduU3RhdGUsIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBiVXNlQnJlYWtDb250cm9sLA0KKyAgICAgICAgICAgICAgICAgICAgZkF2YWlsSGVpZ2h0LCBmUmVhbEhlaWdodCwgZkNvbnRlbnRDdXJSb3dZLA0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0LCBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCwgYkFkZGVkSXRlbUluUm93LCBiRm9yY2VFbmRQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIGJOZXdSb3cpOw0KKyAgICAgICAgICAgIHN3aXRjaCAocnMpIHsNCisgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfTWFudWFsQnJlYWs6DQorICAgICAgICAgICAgICAgIGJJc01hbnVhbEJyZWFrID0gVFJVRTsNCisgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhazoNCisgICAgICAgICAgICAgICAgYkZvcmNlRW5kUGFnZSA9IFRSVUU7DQorICAgICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1Jvd0Z1bGxCcmVhazoNCisgICAgICAgICAgICAgICAgZ290byBTdXNwZW5kQW5kQ3JlYXRlTmV3Um93Ow0KKyAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOg0KKyAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dZICs9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydFBlbmRpbmdJdGVtcygNCisgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IsIG1fcEN1ckNoaWxkTm9kZSk7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgICAgICAgICAgICAgICBwUHJvY2Vzc29yID0gTlVMTDsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0pOw0KLSAgICAgICAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7DQotICAgICAgICB9DQotICAgICAgICBmQ3VyUG9zID0gZkNvbnRlbnRXaWR0aExpbWl0IC0gZkdyb3VwV2lkdGhzWzJdOw0KLSAgICAgICAgZm9yKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbMl0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQotICAgICAgICAgICAgaWYoYlJvb3RGb3JjZVRiKSB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVk7DQotICAgICAgICAgICAgICAgIENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MocmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fcEZvcm1Ob2RlLCByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zU2l6ZS54LCByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zU2l6ZS55LCBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCi0gICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1Bvcy5TZXQoZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1Bvcy5TZXQoZkN1clBvcywgZkNvbnRlbnRDdXJSb3dZKTsNCi0gICAgICAgICAgICAgICAgaWYoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShyZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9wRm9ybU5vZGUpKSB7DQotICAgICAgICAgICAgICAgICAgICBmQ3VyUG9zICs9IHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NTaXplLng7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0pOw0KLSAgICAgICAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWF9GTE9BVCBmQ3VyUG9zOw0KLSAgICAgICAgZkN1clBvcyA9IGZHcm91cFdpZHRoc1swXTsNCi0gICAgICAgIGZvcihpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzWzBdLCBqID0gMDsgaiA8IGM7IGorKykgew0KLSAgICAgICAgICAgIGlmKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fcEZvcm1Ob2RlKSkgew0KLSAgICAgICAgICAgICAgICBmQ3VyUG9zIC09IHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NTaXplLng7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NQb3MuU2V0KGZDdXJQb3MsIGZDb250ZW50Q3VyUm93WSk7DQotICAgICAgICAgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0pOw0KLSAgICAgICAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7DQotICAgICAgICB9DQotICAgICAgICBmQ3VyUG9zID0gKGZDb250ZW50V2lkdGhMaW1pdCArIGZHcm91cFdpZHRoc1swXSArIGZHcm91cFdpZHRoc1sxXSAtIGZHcm91cFdpZHRoc1syXSkgLyAyOw0KLSAgICAgICAgZm9yKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbMV0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQotICAgICAgICAgICAgaWYoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShyZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9wRm9ybU5vZGUpKSB7DQotICAgICAgICAgICAgICAgIGZDdXJQb3MgLT0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1NpemUueDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1Bvcy5TZXQoZkN1clBvcywgZkNvbnRlbnRDdXJSb3dZKTsNCi0gICAgICAgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXSk7DQotICAgICAgICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsNCi0gICAgICAgIH0NCi0gICAgICAgIGZDdXJQb3MgPSBmQ29udGVudFdpZHRoTGltaXQ7DQotICAgICAgICBmb3IoaW50MzJfdCBjID0gbkdyb3VwTGVuZ3Roc1syXSwgaiA9IDA7IGogPCBjOyBqKyspIHsNCi0gICAgICAgICAgICBpZihYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3BGb3JtTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgZkN1clBvcyAtPSByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zU2l6ZS54Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zUG9zLlNldChmQ3VyUG9zLCBmQ29udGVudEN1clJvd1kpOw0KLSAgICAgICAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdKTsNCi0gICAgICAgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIG1fZkxhc3RSb3dZID0gZkNvbnRlbnRDdXJSb3dZOw0KLSAgICBmQ29udGVudEN1clJvd1kgKz0gZkNvbnRlbnRDdXJSb3dIZWlnaHQ7DQotICAgIGlmKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7DQotICAgICAgICBGWF9GTE9BVCBmQ2hpbGRTdXBwbGllZFdpZHRoID0gZkdyb3VwV2lkdGhzWzBdOw0KLSAgICAgICAgaWYoZkNvbnRlbnRXaWR0aExpbWl0IDwgWEZBX0xBWU9VVF9GTE9BVF9NQVggJiYgZkNvbnRlbnRXaWR0aExpbWl0ID4gZkNoaWxkU3VwcGxpZWRXaWR0aCkgew0KLSAgICAgICAgICAgIGZDaGlsZFN1cHBsaWVkV2lkdGggPSBmQ29udGVudFdpZHRoTGltaXQ7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPCBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7DQotICAgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmQ2hpbGRTdXBwbGllZFdpZHRoOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgew0KLSAgICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRIZWlnaHQgPSBmQ29udGVudEN1clJvd1k7DQotICAgICAgICBpZihmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPCBmQ2hpbGRTdXBwbGllZEhlaWdodCkgew0KLSAgICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IGZDaGlsZFN1cHBsaWVkSGVpZ2h0Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6R2V0U3ViZm9ybVNldFBhcmVudChDWEZBX05vZGUqIHBTdWJmb3JtU2V0KQ0KLXsNCi0gICAgaWYocFN1YmZvcm1TZXQgJiYgcFN1YmZvcm1TZXQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0KSB7DQotICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSBwU3ViZm9ybVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICB3aGlsZShwUGFyZW50KSB7DQotICAgICAgICAgICAgaWYocFBhcmVudC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBQYXJlbnQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcFN1YmZvcm1TZXQ7DQotfQ0KLXZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpEb0xheW91dEZpZWxkKCkNCi17DQotICAgIGlmKG1fcExheW91dEl0ZW0gIT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEFTU0VSVChtX3BDdXJDaGlsZE5vZGUgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSk7DQotICAgIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7DQotICAgIGlmICghbV9wTGF5b3V0SXRlbSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpOw0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IHBEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gLTE7DQotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IC0xOw0KLSAgICBwTm90aWZ5LT5TdGFydEZpZWxkRHJhd0xheW91dChtX3BGb3JtTm9kZSwgZldpZHRoLCBmSGVpZ2h0KTsNCi0gICAgaW50MzJfdCBuUm90YXRlID0gRlhTWVNfcm91bmQobV9wRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Sb3RhdGUpLkdldFZhbHVlKCkpOw0KLSAgICBuUm90YXRlID0gWEZBX01hcFJvdGF0aW9uKG5Sb3RhdGUpOw0KLSAgICBpZihuUm90YXRlID09IDkwIHx8IG5Sb3RhdGUgPT0gMjcwKSB7DQotICAgICAgICBGWF9GTE9BVCBmVG1wID0gZldpZHRoOw0KLSAgICAgICAgZldpZHRoID0gZkhlaWdodDsNCi0gICAgICAgIGZIZWlnaHQgPSBmVG1wOw0KLSAgICB9DQotICAgIFNldEN1cnJlbnRDb21wb25lbnRTaXplKGZXaWR0aCwgZkhlaWdodCk7DQotfQ0KLVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXQoRlhfQk9PTCBiVXNlQnJlYWtDb250cm9sLCBGWF9GTE9BVCBmSGVpZ2h0TGltaXQsIEZYX0ZMT0FUIGZSZWFsSGVpZ2h0LCBDWEZBX0xheW91dENvbnRleHQqIHBDb250ZXh0KQ0KLXsNCi0gICAgWEZBX0VMRU1FTlQgZUNsYXNzSUQgPSBtX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBzd2l0Y2goZUNsYXNzSUQpIHsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJlYToNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOg0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0OiB7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJvb3RGb3JjZVRiID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcExheW91dE5vZGUgPSBHZXRTdWJmb3JtU2V0UGFyZW50KG1fcEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dFN0cmF0ZWd5ID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR2V0TGF5b3V0KHBMYXlvdXROb2RlLCBiUm9vdEZvcmNlVGIpOw0KLSAgICAgICAgICAgICAgICBzd2l0Y2goZUxheW91dFN0cmF0ZWd5KSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RiOg0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Mcl90YjoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGI6DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvTGF5b3V0Rmxvd2VkQ29udGFpbmVyKGJVc2VCcmVha0NvbnRyb2wsIGVMYXlvdXRTdHJhdGVneSwgZkhlaWdodExpbWl0LCBmUmVhbEhlaWdodCwgcENvbnRleHQsIGJSb290Rm9yY2VUYik7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uOg0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Sb3c6DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3JvdzoNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgRG9MYXlvdXRQb3NpdGlvbmVkQ29udGFpbmVyKHBDb250ZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX25DdXJDaGlsZE5vZGVTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmU7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmU7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIERvTGF5b3V0VGFibGVDb250YWluZXIocExheW91dE5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRmllbGQ6DQotICAgICAgICAgICAgRG9MYXlvdXRGaWVsZCgpOw0KLSAgICAgICAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZTsNCi0gICAgICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ29udGVudEFyZWE6DQotICAgICAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmU6DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZSgNCisgICAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsIFRSVUUpOw0KKyAgICAgIGlmIChiQWRkZWRJdGVtSW5Sb3cgJiYgZUZsb3dTdHJhdGVneSA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYikgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzoNCisgICAgICBpZiAocFByb2Nlc3Nvcikgew0KKyAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBwUHJvY2Vzc29yOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCiAgICAgfQ0KLX0NCi12b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6R2V0Q3VycmVudENvbXBvbmVudFBvcyhGWF9GTE9BVCYgZkFic29sdXRlWCwgRlhfRkxPQVQmIGZBYnNvbHV0ZVkpDQotew0KLSAgICBBU1NFUlQobV9wTGF5b3V0SXRlbSk7DQotICAgIGZBYnNvbHV0ZVggPSBtX3BMYXlvdXRJdGVtLT5tX3NQb3MueDsNCi0gICAgZkFic29sdXRlWSA9IG1fcExheW91dEl0ZW0tPm1fc1Bvcy55Ow0KLX0NCi12b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6R2V0Q3VycmVudENvbXBvbmVudFNpemUoRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZIZWlnaHQpDQotew0KLSAgICBBU1NFUlQobV9wTGF5b3V0SXRlbSk7DQotICAgIGZXaWR0aCA9IG1fcExheW91dEl0ZW0tPm1fc1NpemUueDsNCi0gICAgZkhlaWdodCA9IG1fcExheW91dEl0ZW0tPm1fc1NpemUueTsNCi19DQotdm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlNldEN1cnJlbnRDb21wb25lbnRQb3MoRlhfRkxPQVQgZkFic29sdXRlWCwgRlhfRkxPQVQgZkFic29sdXRlWSkNCi17DQotICAgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsNCi0gICAgbV9wTGF5b3V0SXRlbS0+bV9zUG9zLlNldChmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCi19DQotdm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlNldEN1cnJlbnRDb21wb25lbnRTaXplKEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgZkhlaWdodCkNCi17DQotICAgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsNCi0gICAgbV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS5TZXQoZldpZHRoLCBmSGVpZ2h0KTsNCi19DQotRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6Okp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpDQotew0KLSAgICBpZihwRm9ybU5vZGUgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICBDYWxjdWxhdGVSb3dDaGlsZFBvc2l0aW9uKHJnQ3VyTGluZUxheW91dEl0ZW1zLCBlRmxvd1N0cmF0ZWd5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd1ksIGZDb250ZW50Q3VyUm93SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50V2lkdGhMaW1pdCwgYlJvb3RGb3JjZVRiKTsNCisgICAgbV9mV2lkdGhMaW1pdGUgPSBmQ29udGVudEN1clJvd0F2YWlsV2lkdGg7DQorICAgIGlmIChiRm9yY2VFbmRQYWdlKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGUgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KLSAgICBpZiAoIXBUZW1wbGF0ZSkgew0KLSAgICAgICAgcFRlbXBsYXRlID0gcEZvcm1Ob2RlOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmV0VmFsdWUgPQ0KKyAgICAgIChtX25DdXJDaGlsZE5vZGVTdGFnZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lICYmDQorICAgICAgIG1fcmdQZW5kaW5nTm9kZXMuR2V0Q291bnQoKSA9PSAwKTsNCisgIGlmIChiQnJlYWtEb25lKSB7DQorICAgIGJSZXRWYWx1ZSA9IEZBTFNFOw0KKyAgfQ0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyQ29tcG9uZW50U2l6ZUZyb21Db250ZW50U2l6ZSgNCisgICAgICBtX3BGb3JtTm9kZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLA0KKyAgICAgIGZDb250YWluZXJXaWR0aCwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsDQorICAgICAgZkNvbnRhaW5lckhlaWdodCk7DQorICBpZiAoZkNvbnRhaW5lckhlaWdodCA+PSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiB8fCBtX3BMYXlvdXRJdGVtIHx8DQorICAgICAgYlJldFZhbHVlKSB7DQorICAgIGlmIChtX3BMYXlvdXRJdGVtID09IE5VTEwpIHsNCisgICAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOw0KICAgICB9DQotICAgIENYRkFfT2NjdXIgTm9kZU9jY3VyID0gcFRlbXBsYXRlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQotICAgIGludDMyX3QgaU1heCA9IE5vZGVPY2N1ci5HZXRNYXgoKTsNCi0gICAgaWYgKGlNYXggPiAtMSkgew0KLSAgICAgICAgaW50MzJfdCBpQ291bnQgPSAoaW50MzJfdCkodWludHB0cl90KW1fUGVuZGluZ05vZGVzQ291bnQuR2V0VmFsdWVBdChwVGVtcGxhdGUpOw0KLSAgICAgICAgaWYgKGlDb3VudCA+PSBpTWF4KSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICBpZiAoZkNvbnRhaW5lckhlaWdodCA8IDApIHsNCisgICAgICBmQ29udGFpbmVySGVpZ2h0ID0gMDsNCisgICAgfQ0KKyAgICBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQpOw0KKyAgICBpZiAoYkZvcmNlRW5kUGFnZSkgew0KKyAgICAgIG1fZlVzZWRTaXplID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX2ZVc2VkU2l6ZSArPSBtX3BMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBiUmV0VmFsdWUNCisgICAgICAgICAgICAgPyBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lDQorICAgICAgICAgICAgIDogKGJJc01hbnVhbEJyZWFrID8gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfTWFudWFsQnJlYWsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrKTsNCit9DQorRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkNhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24oDQorICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4oJnJnQ3VyTGluZUxheW91dEl0ZW1zKVszXSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwNCisgICAgRlhfQk9PTCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsDQorICAgIEZYX0JPT0wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsDQorICAgIEZYX0ZMT0FUJiBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwNCisgICAgRlhfRkxPQVQmIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwNCisgICAgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93WSwNCisgICAgRlhfRkxPQVQgZkNvbnRlbnRDdXJSb3dIZWlnaHQsDQorICAgIEZYX0ZMT0FUIGZDb250ZW50V2lkdGhMaW1pdCwNCisgICAgRlhfQk9PTCBiUm9vdEZvcmNlVGIpIHsNCisgIGludDMyX3Qgbkdyb3VwTGVuZ3Roc1szXSA9IHswLCAwLCAwfTsNCisgIEZYX0ZMT0FUIGZHcm91cFdpZHRoc1szXSA9IHswLCAwLCAwfTsNCisgIGludDMyX3QgblRvdGFsTGVuZ3RoID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICBuR3JvdXBMZW5ndGhzW2ldID0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbaV0uR2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbaV0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQorICAgICAgblRvdGFsTGVuZ3RoKys7DQorICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoDQorICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1tpXVtqXS0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICBmR3JvdXBXaWR0aHNbaV0gKz0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbaV1bal0tPm1fc1NpemUueDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmICghblRvdGFsTGVuZ3RoKSB7DQorICAgIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCisgICAgICBGWF9GTE9BVCBmTmV3SGVpZ2h0ID0gZkNvbnRlbnRDdXJSb3dZOw0KKyAgICAgIGlmIChmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPiBmTmV3SGVpZ2h0KSB7DQorICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmTmV3SGVpZ2h0Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9wTGF5b3V0SXRlbSA9PSBOVUxMKSB7DQorICAgIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7DQorICB9DQorICBpZiAoZUZsb3dTdHJhdGVneSAhPSBYRkFfQVRUUklCVVRFRU5VTV9SbF90Yikgew0KKyAgICBGWF9GTE9BVCBmQ3VyUG9zOw0KKyAgICBmQ3VyUG9zID0gMDsNCisgICAgZm9yIChpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzWzBdLCBqID0gMDsgaiA8IGM7IGorKykgew0KKyAgICAgIGlmIChiUm9vdEZvcmNlVGIpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVk7DQorICAgICAgICBDYWxjdWxhdGVQb3NpdGlvbmVkQ29udGFpbmVyUG9zKHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3BGb3JtTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1NpemUueCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1NpemUueSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQorICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9zUG9zLlNldChmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1Bvcy5TZXQoZkN1clBvcywgZkNvbnRlbnRDdXJSb3dZKTsNCisgICAgICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKA0KKyAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgIGZDdXJQb3MgKz0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1NpemUueDsNCiAgICAgICAgIH0NCi0gICAgICAgIGlDb3VudCsrOw0KLSAgICAgICAgbV9QZW5kaW5nTm9kZXNDb3VudC5TZXRBdChwVGVtcGxhdGUsICh2b2lkKikodWludHB0cl90KShpQ291bnQpKTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXSk7DQorICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsNCiAgICAgfQ0KKyAgICBmQ3VyUG9zID0gKGZDb250ZW50V2lkdGhMaW1pdCArIGZHcm91cFdpZHRoc1swXSAtIGZHcm91cFdpZHRoc1sxXSAtDQorICAgICAgICAgICAgICAgZkdyb3VwV2lkdGhzWzJdKSAvDQorICAgICAgICAgICAgICAyOw0KKyAgICBmb3IgKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbMV0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQorICAgICAgaWYgKGJSb290Rm9yY2VUYikgew0KKyAgICAgICAgRlhfRkxPQVQgZkFic29sdXRlWCwgZkFic29sdXRlWTsNCisgICAgICAgIENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MocmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zU2l6ZS54LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zU2l6ZS55LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCisgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NQb3MuU2V0KGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zUG9zLlNldChmQ3VyUG9zLCBmQ29udGVudEN1clJvd1kpOw0KKyAgICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoDQorICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgZkN1clBvcyArPSByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zU2l6ZS54Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXSk7DQorICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsNCisgICAgfQ0KKyAgICBmQ3VyUG9zID0gZkNvbnRlbnRXaWR0aExpbWl0IC0gZkdyb3VwV2lkdGhzWzJdOw0KKyAgICBmb3IgKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbMl0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQorICAgICAgaWYgKGJSb290Rm9yY2VUYikgew0KKyAgICAgICAgRlhfRkxPQVQgZkFic29sdXRlWCwgZkFic29sdXRlWTsNCisgICAgICAgIENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MocmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zU2l6ZS54LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zU2l6ZS55LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCisgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NQb3MuU2V0KGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zUG9zLlNldChmQ3VyUG9zLCBmQ29udGVudEN1clJvd1kpOw0KKyAgICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoDQorICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgZkN1clBvcyArPSByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zU2l6ZS54Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXSk7DQorICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgRlhfRkxPQVQgZkN1clBvczsNCisgICAgZkN1clBvcyA9IGZHcm91cFdpZHRoc1swXTsNCisgICAgZm9yIChpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzWzBdLCBqID0gMDsgaiA8IGM7IGorKykgew0KKyAgICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKA0KKyAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgZkN1clBvcyAtPSByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9zU2l6ZS54Ow0KKyAgICAgIH0NCisgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9zUG9zLlNldChmQ3VyUG9zLCBmQ29udGVudEN1clJvd1kpOw0KKyAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdKTsNCisgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOw0KKyAgICB9DQorICAgIGZDdXJQb3MgPSAoZkNvbnRlbnRXaWR0aExpbWl0ICsgZkdyb3VwV2lkdGhzWzBdICsgZkdyb3VwV2lkdGhzWzFdIC0NCisgICAgICAgICAgICAgICBmR3JvdXBXaWR0aHNbMl0pIC8NCisgICAgICAgICAgICAgIDI7DQorICAgIGZvciAoaW50MzJfdCBjID0gbkdyb3VwTGVuZ3Roc1sxXSwgaiA9IDA7IGogPCBjOyBqKyspIHsNCisgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgNCisgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgIGZDdXJQb3MgLT0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1NpemUueDsNCisgICAgICB9DQorICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1Bvcy5TZXQoZkN1clBvcywgZkNvbnRlbnRDdXJSb3dZKTsNCisgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXSk7DQorICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsNCisgICAgfQ0KKyAgICBmQ3VyUG9zID0gZkNvbnRlbnRXaWR0aExpbWl0Ow0KKyAgICBmb3IgKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbMl0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQorICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoDQorICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICBmQ3VyUG9zIC09IHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NTaXplLng7DQorICAgICAgfQ0KKyAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NQb3MuU2V0KGZDdXJQb3MsIGZDb250ZW50Q3VyUm93WSk7DQorICAgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0pOw0KKyAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7DQorICAgIH0NCisgIH0NCisgIG1fZkxhc3RSb3dZID0gZkNvbnRlbnRDdXJSb3dZOw0KKyAgZkNvbnRlbnRDdXJSb3dZICs9IGZDb250ZW50Q3VyUm93SGVpZ2h0Ow0KKyAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7DQorICAgIEZYX0ZMT0FUIGZDaGlsZFN1cHBsaWVkV2lkdGggPSBmR3JvdXBXaWR0aHNbMF07DQorICAgIGlmIChmQ29udGVudFdpZHRoTGltaXQgPCBYRkFfTEFZT1VUX0ZMT0FUX01BWCAmJg0KKyAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0ID4gZkNoaWxkU3VwcGxpZWRXaWR0aCkgew0KKyAgICAgIGZDaGlsZFN1cHBsaWVkV2lkdGggPSBmQ29udGVudFdpZHRoTGltaXQ7DQorICAgIH0NCisgICAgaWYgKGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoIDwgZkNoaWxkU3VwcGxpZWRXaWR0aCkgew0KKyAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkNoaWxkU3VwcGxpZWRXaWR0aDsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgew0KKyAgICBGWF9GTE9BVCBmQ2hpbGRTdXBwbGllZEhlaWdodCA9IGZDb250ZW50Q3VyUm93WTsNCisgICAgaWYgKGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA8IGZDaGlsZFN1cHBsaWVkSGVpZ2h0KSB7DQorICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZkNoaWxkU3VwcGxpZWRIZWlnaHQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitDWEZBX05vZGUqIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6R2V0U3ViZm9ybVNldFBhcmVudCgNCisgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybVNldCkgew0KKyAgaWYgKHBTdWJmb3JtU2V0ICYmIHBTdWJmb3JtU2V0LT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkgew0KKyAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSBwU3ViZm9ybVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIHdoaWxlIChwUGFyZW50KSB7DQorICAgICAgaWYgKHBQYXJlbnQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0KSB7DQorICAgICAgICByZXR1cm4gcFBhcmVudDsNCisgICAgICB9DQorICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcFN1YmZvcm1TZXQ7DQorfQ0KK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpEb0xheW91dEZpZWxkKCkgew0KKyAgaWYgKG1fcExheW91dEl0ZW0gIT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBBU1NFUlQobV9wQ3VyQ2hpbGROb2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpOw0KKyAgbV9wTGF5b3V0SXRlbSA9IENyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKG1fcEZvcm1Ob2RlKTsNCisgIGlmICghbV9wTGF5b3V0SXRlbSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBGWF9GTE9BVCBmSGVpZ2h0ID0gLTE7DQorICBGWF9GTE9BVCBmV2lkdGggPSAtMTsNCisgIHBOb3RpZnktPlN0YXJ0RmllbGREcmF3TGF5b3V0KG1fcEZvcm1Ob2RlLCBmV2lkdGgsIGZIZWlnaHQpOw0KKyAgaW50MzJfdCBuUm90YXRlID0NCisgICAgICBGWFNZU19yb3VuZChtX3BGb3JtTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JvdGF0ZSkuR2V0VmFsdWUoKSk7DQorICBuUm90YXRlID0gWEZBX01hcFJvdGF0aW9uKG5Sb3RhdGUpOw0KKyAgaWYgKG5Sb3RhdGUgPT0gOTAgfHwgblJvdGF0ZSA9PSAyNzApIHsNCisgICAgRlhfRkxPQVQgZlRtcCA9IGZXaWR0aDsNCisgICAgZldpZHRoID0gZkhlaWdodDsNCisgICAgZkhlaWdodCA9IGZUbXA7DQorICB9DQorICBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KK30NCitYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0KA0KKyAgICBGWF9CT09MIGJVc2VCcmVha0NvbnRyb2wsDQorICAgIEZYX0ZMT0FUIGZIZWlnaHRMaW1pdCwNCisgICAgRlhfRkxPQVQgZlJlYWxIZWlnaHQsDQorICAgIENYRkFfTGF5b3V0Q29udGV4dCogcENvbnRleHQpIHsNCisgIFhGQV9FTEVNRU5UIGVDbGFzc0lEID0gbV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKTsNCisgIHN3aXRjaCAoZUNsYXNzSUQpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0FyZWE6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQ6IHsNCisgICAgICBGWF9CT09MIGJSb290Rm9yY2VUYiA9IEZBTFNFOw0KKyAgICAgIENYRkFfTm9kZSogcExheW91dE5vZGUgPSBHZXRTdWJmb3JtU2V0UGFyZW50KG1fcEZvcm1Ob2RlKTsNCisgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0U3RyYXRlZ3kgPQ0KKyAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9HZXRMYXlvdXQocExheW91dE5vZGUsIGJSb290Rm9yY2VUYik7DQorICAgICAgc3dpdGNoIChlTGF5b3V0U3RyYXRlZ3kpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVGI6DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xyX3RiOg0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SbF90YjoNCisgICAgICAgICAgcmV0dXJuIERvTGF5b3V0Rmxvd2VkQ29udGFpbmVyKGJVc2VCcmVha0NvbnRyb2wsIGVMYXlvdXRTdHJhdGVneSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZIZWlnaHRMaW1pdCwgZlJlYWxIZWlnaHQsIHBDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJvb3RGb3JjZVRiKTsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb246DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JvdzoNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmxfcm93Og0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgRG9MYXlvdXRQb3NpdGlvbmVkQ29udGFpbmVyKHBDb250ZXh0KTsNCisgICAgICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lOw0KKyAgICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVGFibGU6DQorICAgICAgICAgIERvTGF5b3V0VGFibGVDb250YWluZXIocExheW91dE5vZGUpOw0KKyAgICAgICAgICBtX25DdXJDaGlsZE5vZGVTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmU7DQorICAgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRmllbGQ6DQorICAgICAgRG9MYXlvdXRGaWVsZCgpOw0KKyAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZTsNCisgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYToNCisgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgIH0NCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkdldEN1cnJlbnRDb21wb25lbnRQb3MoRlhfRkxPQVQmIGZBYnNvbHV0ZVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZBYnNvbHV0ZVkpIHsNCisgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsNCisgIGZBYnNvbHV0ZVggPSBtX3BMYXlvdXRJdGVtLT5tX3NQb3MueDsNCisgIGZBYnNvbHV0ZVkgPSBtX3BMYXlvdXRJdGVtLT5tX3NQb3MueTsNCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkdldEN1cnJlbnRDb21wb25lbnRTaXplKEZYX0ZMT0FUJiBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmSGVpZ2h0KSB7DQorICBBU1NFUlQobV9wTGF5b3V0SXRlbSk7DQorICBmV2lkdGggPSBtX3BMYXlvdXRJdGVtLT5tX3NTaXplLng7DQorICBmSGVpZ2h0ID0gbV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6U2V0Q3VycmVudENvbXBvbmVudFBvcyhGWF9GTE9BVCBmQWJzb2x1dGVYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZBYnNvbHV0ZVkpIHsNCisgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsNCisgIG1fcExheW91dEl0ZW0tPm1fc1Bvcy5TZXQoZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQorfQ0KK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShGWF9GTE9BVCBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZIZWlnaHQpIHsNCisgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsNCisgIG1fcExheW91dEl0ZW0tPm1fc1NpemUuU2V0KGZXaWR0aCwgZkhlaWdodCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpKdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKA0KKyAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSkgew0KKyAgaWYgKHBGb3JtTm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfTm9kZSogcFRlbXBsYXRlID0gcEZvcm1Ob2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCisgIGlmICghcFRlbXBsYXRlKSB7DQorICAgIHBUZW1wbGF0ZSA9IHBGb3JtTm9kZTsNCisgIH0NCisgIENYRkFfT2NjdXIgTm9kZU9jY3VyID0gcFRlbXBsYXRlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQorICBpbnQzMl90IGlNYXggPSBOb2RlT2NjdXIuR2V0TWF4KCk7DQorICBpZiAoaU1heCA+IC0xKSB7DQorICAgIGludDMyX3QgaUNvdW50ID0NCisgICAgICAgIChpbnQzMl90KSh1aW50cHRyX3QpbV9QZW5kaW5nTm9kZXNDb3VudC5HZXRWYWx1ZUF0KHBUZW1wbGF0ZSk7DQorICAgIGlmIChpQ291bnQgPj0gaU1heCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpQ291bnQrKzsNCisgICAgbV9QZW5kaW5nTm9kZXNDb3VudC5TZXRBdChwVGVtcGxhdGUsICh2b2lkKikodWludHB0cl90KShpQ291bnQpKTsNCiAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaAppbmRleCAyN2NiNWIyLi43ZDkwNmYyIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaApAQCAtOSwxODIgKzksMTc4IEBACiAjZGVmaW5lIFhGQV9MQVlPVVRfSU5WQUxJRE5PREUgKChDWEZBX05vZGUqKShpbnRwdHJfdCktMSkNCiAjZGVmaW5lIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OICgwLjAwMDVmKQ0KICNpbmNsdWRlICJmbG9hdC5oIg0KLSNkZWZpbmUgWEZBX0xBWU9VVF9GTE9BVF9NQVgJRkxUX01BWA0KKyNkZWZpbmUgWEZBX0xBWU9VVF9GTE9BVF9NQVggRkxUX01BWA0KIGNsYXNzIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcjsNCiBjbGFzcyBDWEZBX0xheW91dFBhZ2VNZ3I7DQogY2xhc3MgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbDsNCiBjbGFzcyBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbDsNCiBlbnVtIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IHsNCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSwNCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhaywNCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUm93RnVsbEJyZWFrLA0KLSAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9NYW51YWxCcmVhaywNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUsDQorICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrLA0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUm93RnVsbEJyZWFrLA0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfTWFudWFsQnJlYWssDQogfTsNCiBlbnVtIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzIHsNCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfTm9uZSwNCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZExlYWRlciwNCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtCZWZvcmUsDQotICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0tlZXAsDQotICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lciwNCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtBZnRlciwNCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZFRyYWlsZXIsDQotICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUsDQorICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Ob25lLA0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZExlYWRlciwNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQmVmb3JlLA0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfS2VlcCwNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lciwNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQWZ0ZXIsDQorICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kVHJhaWxlciwNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUsDQogfTsNCiANCi1jbGFzcyBDWEZBX0xheW91dENvbnRleHQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0xheW91dENvbnRleHQoKTogbV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMoTlVMTCkNCi0gICAgICAgICwgbV9mQ3VyQ29sdW1uV2lkdGgoMCkNCi0gICAgICAgICwgbV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZShGQUxTRSkNCi0gICAgICAgICwgbV9wT3ZlcmZsb3dQcm9jZXNzb3IoTlVMTCkNCi0gICAgICAgICwgbV9wT3ZlcmZsb3dOb2RlKE5VTEwpDQotICAgIHsNCi0gICAgfQ0KLSAgICB+Q1hGQV9MYXlvdXRDb250ZXh0KCkNCi0gICAgew0KLSAgICAgICAgbV9wT3ZlcmZsb3dQcm9jZXNzb3IgPSBOVUxMOw0KLSAgICB9DQotICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiogICAgbV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHM7DQotICAgIEZYX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgbV9mQ3VyQ29sdW1uV2lkdGg7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZTsNCi0gICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiAgICAgICBtX3BPdmVyZmxvd1Byb2Nlc3NvcjsNCi0gICAgQ1hGQV9Ob2RlKiAgICAgICAgICAgICAgICAgICAgICBtX3BPdmVyZmxvd05vZGU7DQorY2xhc3MgQ1hGQV9MYXlvdXRDb250ZXh0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9MYXlvdXRDb250ZXh0KCkNCisgICAgICA6IG1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzKE5VTEwpLA0KKyAgICAgICAgbV9mQ3VyQ29sdW1uV2lkdGgoMCksDQorICAgICAgICBtX2JDdXJDb2x1bW5XaWR0aEF2YWlhYmxlKEZBTFNFKSwNCisgICAgICAgIG1fcE92ZXJmbG93UHJvY2Vzc29yKE5VTEwpLA0KKyAgICAgICAgbV9wT3ZlcmZsb3dOb2RlKE5VTEwpIHt9DQorICB+Q1hGQV9MYXlvdXRDb250ZXh0KCkgeyBtX3BPdmVyZmxvd1Byb2Nlc3NvciA9IE5VTEw7IH0NCisgIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiogbV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHM7DQorICBGWF9GTE9BVCBtX2ZDdXJDb2x1bW5XaWR0aDsNCisgIEZYX0JPT0wgbV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZTsNCisgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogbV9wT3ZlcmZsb3dQcm9jZXNzb3I7DQorICBDWEZBX05vZGUqIG1fcE92ZXJmbG93Tm9kZTsNCiB9Ow0KIA0KLWNsYXNzIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihDWEZBX05vZGUgKnBOb2RlLCBDWEZBX0xheW91dFBhZ2VNZ3IqIHBQYWdlTWdyKTsNCitjbGFzcyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3Igew0KKyBwdWJsaWM6DQorICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IoQ1hGQV9Ob2RlKiBwTm9kZSwgQ1hGQV9MYXlvdXRQYWdlTWdyKiBwUGFnZU1ncik7DQogDQotICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0ICAgRG9MYXlvdXQoRlhfQk9PTCBiVXNlQnJlYWtDb250cm9sLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmSGVpZ2h0TGltaXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlJlYWxIZWlnaHQgPSBYRkFfTEFZT1VUX0ZMT0FUX01BWCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dENvbnRleHQqIHBDb250ZXh0ID0gTlVMTCk7DQorICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBEb0xheW91dCgNCisgICAgICBGWF9CT09MIGJVc2VCcmVha0NvbnRyb2wsDQorICAgICAgRlhfRkxPQVQgZkhlaWdodExpbWl0LA0KKyAgICAgIEZYX0ZMT0FUIGZSZWFsSGVpZ2h0ID0gWEZBX0xBWU9VVF9GTE9BVF9NQVgsDQorICAgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCA9IE5VTEwpOw0KIA0KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRDb21wb25lbnRQb3MoRlhfRkxPQVQmIGZBYnNvbHV0ZVgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkFic29sdXRlWSk7DQorICB2b2lkIEdldEN1cnJlbnRDb21wb25lbnRQb3MoRlhfRkxPQVQmIGZBYnNvbHV0ZVgsIEZYX0ZMT0FUJiBmQWJzb2x1dGVZKTsNCiANCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50Q29tcG9uZW50U2l6ZShGWF9GTE9BVCYgZldpZHRoLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkhlaWdodCk7DQorICB2b2lkIEdldEN1cnJlbnRDb21wb25lbnRTaXplKEZYX0ZMT0FUJiBmV2lkdGgsIEZYX0ZMT0FUJiBmSGVpZ2h0KTsNCiANCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRDdXJyZW50Q29tcG9uZW50UG9zKEZYX0ZMT0FUIGZBYnNvbHV0ZVgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQWJzb2x1dGVZKTsNCisgIHZvaWQgU2V0Q3VycmVudENvbXBvbmVudFBvcyhGWF9GTE9BVCBmQWJzb2x1dGVYLCBGWF9GTE9BVCBmQWJzb2x1dGVZKTsNCiANCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShGWF9GTE9BVCBmV2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkhlaWdodCk7DQotICAgIGlubGluZSBDWEZBX05vZGUqICAgICAgICAgICAgICAgR2V0Rm9ybU5vZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wRm9ybU5vZGU7DQotICAgIH0NCi0gICAgaW5saW5lIEZYX0JPT0wgICAgICAgICAgICAgICAgICBIYXNMYXlvdXRJdGVtKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcExheW91dEl0ZW0gIT0gTlVMTDsNCi0gICAgfQ0KLSAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogICAgIEV4dHJhY3RMYXlvdXRJdGVtKCk7DQorICB2b2lkIFNldEN1cnJlbnRDb21wb25lbnRTaXplKEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgZkhlaWdodCk7DQorICBpbmxpbmUgQ1hGQV9Ob2RlKiBHZXRGb3JtTm9kZSgpIHsgcmV0dXJuIG1fcEZvcm1Ob2RlOyB9DQorICBpbmxpbmUgRlhfQk9PTCBIYXNMYXlvdXRJdGVtKCkgeyByZXR1cm4gbV9wTGF5b3V0SXRlbSAhPSBOVUxMOyB9DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogRXh0cmFjdExheW91dEl0ZW0oKTsNCiANCi0gICAgc3RhdGljIEZYX0JPT0wgICAgICBJbmNyZW1lbnRSZWxheW91dE5vZGUoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm9jZXNzb3IsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBOb2RlLCBDWEZBX05vZGUgKnBQYXJlbnROb2RlKTsNCi0gICAgc3RhdGljIHZvaWQJCUNhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MoQ1hGQV9Ob2RlKiBwTm9kZSwgRlhfRkxPQVQgZldpZHRoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkhlaWdodCwgRlhfRkxPQVQmIGZBYnNvbHV0ZVgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkFic29sdXRlWSk7DQotICAgIHN0YXRpYyBGWF9CT09MICAgICAgRmluZExheW91dEl0ZW1TcGxpdFBvcyhDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ3VyVmVydGljYWxPZmZzZXQsIEZYX0ZMT0FUJiBmUHJvcG9zZWRTcGxpdFBvcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJBcHBDaGFuZ2UsIEZYX0JPT0wgYkNhbGN1bGF0ZU1hcmdpbiA9IFRSVUUpOw0KLSAgICBGWF9GTE9BVCAgICAgICAgICAgIEZpbmRTcGxpdFBvcyhGWF9GTE9BVCBmUHJvcG9zZWRTcGxpdFBvcyk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgU3BsaXRMYXlvdXRJdGVtKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBTZWNvbmRQYXJlbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGxpdFBvcyk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgU3BsaXRMYXlvdXRJdGVtKEZYX0ZMT0FUIGZTcGxpdFBvcyk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgSnVkZ2VQdXROZXh0UGFnZShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFBhcmVudExheW91dEl0ZW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ2hpbGRIZWlnaHQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqPiAmcEtlZXBJdGVtcyk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgUHJvY2Vzc0tlZXBGb3JTcGxpdGUoQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUGFyZW50UHJvY2Vzc29yLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcENoaWxkUHJvY2Vzc29yLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXRWYWx1ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+JiByZ0N1ckxpbmVMYXlvdXRJdGVtLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93SGVpZ2h0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd1ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkFkZGVkSXRlbUluUm93LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJGb3JjZUVuZFBhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQmIHJlc3VsdCk7DQotICAgIEZYX0ZMT0FUICAgICAgICAgICAgSW5zZXJ0S2VlcExheW91dEl0ZW1zKCk7DQotICAgIHZvaWQgICAgICAgICAgICAgICAgRG9MYXlvdXRQYWdlQXJlYShDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZUFyZWFMYXlvdXRJdGVtKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBDYWxjdWxhdGVSb3dDaGlsZFBvc2l0aW9uKENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4oJnJnQ3VyTGluZUxheW91dEl0ZW1zKVszXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVGbG93U3RyYXRlZ3ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93WSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50Q3VyUm93SGVpZ2h0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aExpbWl0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUm9vdEZvcmNlVGIgPSBGQUxTRSk7DQorICBzdGF0aWMgRlhfQk9PTCBJbmNyZW1lbnRSZWxheW91dE5vZGUoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm9jZXNzb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlKTsNCisgIHN0YXRpYyB2b2lkIENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MoQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkFic29sdXRlWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZBYnNvbHV0ZVkpOw0KKyAgc3RhdGljIEZYX0JPT0wgRmluZExheW91dEl0ZW1TcGxpdFBvcyhDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDdXJWZXJ0aWNhbE9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZQcm9wb3NlZFNwbGl0UG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQXBwQ2hhbmdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDYWxjdWxhdGVNYXJnaW4gPSBUUlVFKTsNCisgIEZYX0ZMT0FUIEZpbmRTcGxpdFBvcyhGWF9GTE9BVCBmUHJvcG9zZWRTcGxpdFBvcyk7DQorICB2b2lkIFNwbGl0TGF5b3V0SXRlbShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFNlY29uZFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGxpdFBvcyk7DQorICB2b2lkIFNwbGl0TGF5b3V0SXRlbShGWF9GTE9BVCBmU3BsaXRQb3MpOw0KKyAgRlhfQk9PTCBKdWRnZVB1dE5leHRQYWdlKA0KKyAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwUGFyZW50TGF5b3V0SXRlbSwNCisgICAgICBGWF9GTE9BVCBmQ2hpbGRIZWlnaHQsDQorICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqPiYgcEtlZXBJdGVtcyk7DQorICBGWF9CT09MIFByb2Nlc3NLZWVwRm9yU3BsaXRlKA0KKyAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFBhcmVudFByb2Nlc3NvciwNCisgICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBDaGlsZFByb2Nlc3NvciwNCisgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlUmV0VmFsdWUsDQorICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqPiYgcmdDdXJMaW5lTGF5b3V0SXRlbSwNCisgICAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICAgIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd0hlaWdodCwNCisgICAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dZLA0KKyAgICAgIEZYX0JPT0wmIGJBZGRlZEl0ZW1JblJvdywNCisgICAgICBGWF9CT09MJiBiRm9yY2VFbmRQYWdlLA0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0JiByZXN1bHQpOw0KKyAgRlhfRkxPQVQgSW5zZXJ0S2VlcExheW91dEl0ZW1zKCk7DQorICB2b2lkIERvTGF5b3V0UGFnZUFyZWEoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFBhZ2VBcmVhTGF5b3V0SXRlbSk7DQorICBGWF9CT09MIENhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24oDQorICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqPigmcmdDdXJMaW5lTGF5b3V0SXRlbXMpWzNdLA0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVGbG93U3RyYXRlZ3ksDQorICAgICAgRlhfQk9PTCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsDQorICAgICAgRlhfQk9PTCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwNCisgICAgICBGWF9GTE9BVCYgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsDQorICAgICAgRlhfRkxPQVQmIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwNCisgICAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dZLA0KKyAgICAgIEZYX0ZMT0FUIGZDb250ZW50Q3VyUm93SGVpZ2h0LA0KKyAgICAgIEZYX0ZMT0FUIGZDb250ZW50V2lkdGhMaW1pdCwNCisgICAgICBGWF9CT09MIGJSb290Rm9yY2VUYiA9IEZBTFNFKTsNCiANCi0gICAgdm9pZCAgICAgICAgICAgICAgICBQcm9jZXNzVW5Vc2VPdmVyRmxvdyhDWEZBX05vZGUqIHBMZWFkZXJOb2RlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRyYWlsZXJOb2RlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwVHJhaWxlckl0ZW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOw0KLSAgICB2b2lkICAgICAgICAgICAgICAgIFByb2Nlc3NVblVzZUJpbmRzKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICBJc0FkZE5ld1Jvd0ZvclRyYWlsZXIoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUcmFpbGVySXRlbSk7DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihDWEZBX05vZGUqIHBGb3JtTm9kZSk7DQotICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSk7DQotcHJvdGVjdGVkOg0KKyAgdm9pZCBQcm9jZXNzVW5Vc2VPdmVyRmxvdyhDWEZBX05vZGUqIHBMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUcmFpbGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBUcmFpbGVySXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOw0KKyAgdm9pZCBQcm9jZXNzVW5Vc2VCaW5kcyhDWEZBX05vZGUqIHBGb3JtTm9kZSk7DQorICBGWF9CT09MIElzQWRkTmV3Um93Rm9yVHJhaWxlcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcFRyYWlsZXJJdGVtKTsNCisgIEZYX0JPT0wgSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihDWEZBX05vZGUqIHBGb3JtTm9kZSk7DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogQ3JlYXRlQ29udGVudExheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOw0KIA0KLSAgICB2b2lkICAgICAgICBEb0xheW91dFBvc2l0aW9uZWRDb250YWluZXIoQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCA9IE5VTEwpOw0KLSAgICB2b2lkCURvTGF5b3V0VGFibGVDb250YWluZXIoQ1hGQV9Ob2RlKiBwTGF5b3V0Tm9kZSk7DQotICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IERvTGF5b3V0Rmxvd2VkQ29udGFpbmVyKEZYX0JPT0wgYlVzZUJyZWFrQ29udHJvbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkhlaWdodExpbWl0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUmVhbEhlaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCA9IE5VTEwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJvb3RGb3JjZVRiID0gRkFMU0UpOw0KLSAgICB2b2lkCURvTGF5b3V0RmllbGQoKTsNCi0gICAgdm9pZAlYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Q29udGFpbmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlUGFnZUJyZWFrKTsNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEb0xheW91dFBvc2l0aW9uZWRDb250YWluZXIoQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCA9IE5VTEwpOw0KKyAgdm9pZCBEb0xheW91dFRhYmxlQ29udGFpbmVyKENYRkFfTm9kZSogcExheW91dE5vZGUpOw0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgRG9MYXlvdXRGbG93ZWRDb250YWluZXIoDQorICAgICAgRlhfQk9PTCBiVXNlQnJlYWtDb250cm9sLA0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVGbG93U3RyYXRlZ3ksDQorICAgICAgRlhfRkxPQVQgZkhlaWdodExpbWl0LA0KKyAgICAgIEZYX0ZMT0FUIGZSZWFsSGVpZ2h0LA0KKyAgICAgIENYRkFfTGF5b3V0Q29udGV4dCogcENvbnRleHQgPSBOVUxMLA0KKyAgICAgIEZYX0JPT0wgYlJvb3RGb3JjZVRiID0gRkFMU0UpOw0KKyAgdm9pZCBEb0xheW91dEZpZWxkKCk7DQorICB2b2lkIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZSgNCisgICAgICBDWEZBX05vZGUqJiBwQ3VyQWN0aW9uTm9kZSwNCisgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLA0KKyAgICAgIENYRkFfTm9kZSogcFBhcmVudENvbnRhaW5lciwNCisgICAgICBGWF9CT09MIGJVc2VQYWdlQnJlYWspOw0KIA0KLSAgICBGWF9CT09MICAgICBQcm9jZXNzS2VlcE5vZGVzRm9yQ2hlY2tOZXh0KENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcE5leHRDb250YWluZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkxhc3RLZWVwTm9kZSk7DQorICBGWF9CT09MIFByb2Nlc3NLZWVwTm9kZXNGb3JDaGVja05leHQoQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwTmV4dENvbnRhaW5lciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiTGFzdEtlZXBOb2RlKTsNCiANCi0gICAgRlhfQk9PTCAgICAgUHJvY2Vzc0tlZXBOb2Rlc0ZvckJyZWFrQmVmb3JlKENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcENvbnRhaW5lck5vZGUpOw0KKyAgRlhfQk9PTCBQcm9jZXNzS2VlcE5vZGVzRm9yQnJlYWtCZWZvcmUoDQorICAgICAgQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsDQorICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwNCisgICAgICBDWEZBX05vZGUqIHBDb250YWluZXJOb2RlKTsNCiANCi0gICAgQ1hGQV9Ob2RlKiAgR2V0U3ViZm9ybVNldFBhcmVudChDWEZBX05vZGUqIHBTdWJmb3JtU2V0KTsNCisgIENYRkFfTm9kZSogR2V0U3ViZm9ybVNldFBhcmVudChDWEZBX05vZGUqIHBTdWJmb3JtU2V0KTsNCiANCi1wdWJsaWM6DQotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYktlZXBCcmVha0ZpbmlzaDsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSXNQcm9jZXNzS2VlcDsNCi0gICAgQ1hGQV9Ob2RlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wS2VlcEhlYWROb2RlOw0KLSAgICBDWEZBX05vZGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BLZWVwVGFpbE5vZGU7DQotICAgIENYRkFfTm9kZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvcm1Ob2RlOw0KLSAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCoJICAgICAgICAgICAgICAgICAgICBtX3BMYXlvdXRJdGVtOw0KKyBwdWJsaWM6DQorICBGWF9CT09MIG1fYktlZXBCcmVha0ZpbmlzaDsNCisgIEZYX0JPT0wgbV9iSXNQcm9jZXNzS2VlcDsNCisgIENYRkFfTm9kZSogbV9wS2VlcEhlYWROb2RlOw0KKyAgQ1hGQV9Ob2RlKiBtX3BLZWVwVGFpbE5vZGU7DQorICBDWEZBX05vZGUqIG1fcEZvcm1Ob2RlOw0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIG1fcExheW91dEl0ZW07DQogI2lmZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQotICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKgkgICAgICAgICAgICAgICAgICAgIG1fcE9sZExheW91dEl0ZW07DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogbV9wT2xkTGF5b3V0SXRlbTsNCiAjZWxzZQ0KLSAgICBDWEZBX0xheW91dFBhZ2VNZ3IqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisgIENYRkFfTGF5b3V0UGFnZU1nciogbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQogI2VuZGlmDQotICAgIENYRkFfTm9kZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1ckNoaWxkTm9kZTsNCi0gICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3I7DQotICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzICAgICAgICAgICAgICAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlOw0KLSAgICBGWF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZVc2VkU2l6ZTsNCi0gICAgQ1hGQV9MYXlvdXRQYWdlTWdyKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUGFnZU1ncjsNCi0gICAgQ0ZYX1B0ckxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9yZ1BlbmRpbmdOb2RlczsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQnJlYWtQZW5kaW5nOw0KLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9GTE9BVD4gICAgICAgICAgICAgICAgICAgICBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzOw0KLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCo+ICBtX2FycmF5S2VlcEl0ZW1zOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1BlbmRpbmdOb2Rlc0NvdW50Ow0KLSAgICBGWF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZMYXN0Um93V2lkdGg7DQotICAgIEZYX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZkxhc3RSb3dZOw0KLSAgICBGWF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZXaWR0aExpbWl0ZTsNCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iVXNlSW5oZXJpYXRlZDsNCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgICAgICAgICAgICAgICAgICAgbV9lUHJlUHJvY2Vzc1JzOw0KLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JIYXNBdmFpbEhlaWdodDsNCisgIENYRkFfTm9kZSogbV9wQ3VyQ2hpbGROb2RlOw0KKyAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBtX3BDdXJDaGlsZFByZXByb2Nlc3NvcjsNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzIG1fbkN1ckNoaWxkTm9kZVN0YWdlOw0KKyAgRlhfRkxPQVQgbV9mVXNlZFNpemU7DQorICBDWEZBX0xheW91dFBhZ2VNZ3IqIG1fcFBhZ2VNZ3I7DQorICBDRlhfUHRyTGlzdCBtX3JnUGVuZGluZ05vZGVzOw0KKyAgRlhfQk9PTCBtX2JCcmVha1BlbmRpbmc7DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9GTE9BVD4gbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoczsNCisgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKj4gbV9hcnJheUtlZXBJdGVtczsNCisgIENGWF9NYXBQdHJUb1B0ciBtX1BlbmRpbmdOb2Rlc0NvdW50Ow0KKyAgRlhfRkxPQVQgbV9mTGFzdFJvd1dpZHRoOw0KKyAgRlhfRkxPQVQgbV9mTGFzdFJvd1k7DQorICBGWF9GTE9BVCBtX2ZXaWR0aExpbWl0ZTsNCisgIEZYX0JPT0wgbV9iVXNlSW5oZXJpYXRlZDsNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IG1fZVByZVByb2Nlc3NSczsNCisgIEZYX0JPT0wgbV9iSGFzQXZhaWxIZWlnaHQ7DQogfTsNCiBGWF9CT09MIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoQ1hGQV9Ob2RlKiBwTm9kZSk7DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9wYWdlbWdyX25ldy5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmNwcAppbmRleCA2OTk1MDBkLi5iYTZkNzJlIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmNwcApAQCAtMjIsMTY1OSArMjIsMjAzMSBAQAogI2luY2x1ZGUgInhmYV9sYXlvdXRfcGFnZW1ncl9uZXcuaCINCiAjaW5jbHVkZSAieGZhX2xheW91dF9hcHBhZGFwdGVyLmgiDQogQ1hGQV9MYXlvdXRQYWdlTWdyOjpDWEZBX0xheW91dFBhZ2VNZ3IoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm9jZXNzb3IpDQotICAgIDogbV9wTGF5b3V0UHJvY2Vzc29yKHBMYXlvdXRQcm9jZXNzb3IpDQotICAgICwgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdChOVUxMKQ0KLSAgICAsIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdChOVUxMKQ0KLSAgICAsIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQoTlVMTCkNCi0gICAgLCBtX25DdXJQYWdlQ291bnQoMCkNCi0gICAgLCBtX3BDdXJQYWdlQXJlYShOVUxMKQ0KLSAgICAsIG1fZVBhZ2VTZXRNb2RlKFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlKQ0KLSAgICAsIG1fbkF2YWlsUGFnZXMoMCkNCi0gICAgLCBtX3BQYWdlU2V0Q3VyUm9vdChOVUxMKQ0KLSAgICAsIG1fYkNyZWF0ZU92ZXJGbG93UGFnZShGQUxTRSkNCi17DQorICAgIDogbV9wTGF5b3V0UHJvY2Vzc29yKHBMYXlvdXRQcm9jZXNzb3IpLA0KKyAgICAgIG1fcFRlbXBsYXRlUGFnZVNldFJvb3QoTlVMTCksDQorICAgICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290KE5VTEwpLA0KKyAgICAgIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQoTlVMTCksDQorICAgICAgbV9uQ3VyUGFnZUNvdW50KDApLA0KKyAgICAgIG1fcEN1clBhZ2VBcmVhKE5VTEwpLA0KKyAgICAgIG1fZVBhZ2VTZXRNb2RlKFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlKSwNCisgICAgICBtX25BdmFpbFBhZ2VzKDApLA0KKyAgICAgIG1fcFBhZ2VTZXRDdXJSb290KE5VTEwpLA0KKyAgICAgIG1fYkNyZWF0ZU92ZXJGbG93UGFnZShGQUxTRSkge30NCitDWEZBX0xheW91dFBhZ2VNZ3I6On5DWEZBX0xheW91dFBhZ2VNZ3IoKSB7DQorICBDbGVhckRhdGEoKTsNCisgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtID0gR2V0Um9vdExheW91dEl0ZW0oKTsNCisgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBOZXh0TGF5b3V0ID0gTlVMTDsNCisgIGZvciAoOyBwTGF5b3V0SXRlbTsgcExheW91dEl0ZW0gPSBwTmV4dExheW91dCkgew0KKyAgICBwTmV4dExheW91dCA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgWEZBX1JlbGVhc2VMYXlvdXRJdGVtKHBMYXlvdXRJdGVtKTsNCisgIH0NCiB9DQotQ1hGQV9MYXlvdXRQYWdlTWdyOjp+Q1hGQV9MYXlvdXRQYWdlTWdyKCkNCi17DQotICAgIENsZWFyRGF0YSgpOw0KLSAgICBDWEZBX0xheW91dEl0ZW1JbXBsICpwTGF5b3V0SXRlbSA9IEdldFJvb3RMYXlvdXRJdGVtKCk7DQotICAgIENYRkFfTGF5b3V0SXRlbUltcGwgKnBOZXh0TGF5b3V0ID0gTlVMTDsNCi0gICAgZm9yKDsgcExheW91dEl0ZW07IHBMYXlvdXRJdGVtID0gcE5leHRMYXlvdXQpIHsNCi0gICAgICAgIHBOZXh0TGF5b3V0ID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KLSAgICAgICAgWEZBX1JlbGVhc2VMYXlvdXRJdGVtKHBMYXlvdXRJdGVtKTsNCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6SW5pdExheW91dFBhZ2UoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpIHsNCisgIFByZXBhcmVMYXlvdXQoKTsNCisgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSA9IHBGb3JtTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7DQorICBpZiAoIXBUZW1wbGF0ZU5vZGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCA9IHBUZW1wbGF0ZU5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KKyAgQVNTRVJUKG1fcFRlbXBsYXRlUGFnZVNldFJvb3QpOw0KKyAgaWYgKG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdCkgew0KKyAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QtPm1fcFBhcmVudCA9IE5VTEw7DQorICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdC0+bV9wRmlyc3RDaGlsZCA9IE5VTEw7DQorICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdC0+bV9wTmV4dFNpYmxpbmcgPSBOVUxMOw0KKyAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QtPm1fcEZvcm1Ob2RlID0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdDsNCisgIH0gZWxzZSB7DQorICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdCA9DQorICAgICAgICBGWF9ORVcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbChtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KTsNCisgIH0NCisgIG1fcFBhZ2VTZXRDdXJSb290ID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbV9wUGFnZVNldExheW91dEl0ZW1Sb290KTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVSZWxhdGlvbiA9DQorICAgICAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0RW51bShYRkFfQVRUUklCVVRFX1JlbGF0aW9uKTsNCisgIGlmIChlUmVsYXRpb24gIT0gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bikgew0KKyAgICBtX2VQYWdlU2V0TW9kZSA9IGVSZWxhdGlvbjsNCisgIH0NCisgIEluaXRQYWdlU2V0TWFwKCk7DQorICBDWEZBX05vZGUqIHBQYWdlQXJlYSA9IE5VTEw7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBmb3IgKHBQYWdlQXJlYSA9IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgcFBhZ2VBcmVhOw0KKyAgICAgICBwUGFnZUFyZWEgPSBwUGFnZUFyZWEtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgaWYgKHBQYWdlQXJlYS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgaUNvdW50Kys7DQorICAgICAgaWYgKHBQYWdlQXJlYS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQogICAgIH0NCi19DQotRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OkluaXRMYXlvdXRQYWdlKENYRkFfTm9kZSogcEZvcm1Ob2RlKQ0KLXsNCi0gICAgUHJlcGFyZUxheW91dCgpOw0KLSAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KLSAgICBpZiAoIXBUZW1wbGF0ZU5vZGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290ID0gcFRlbXBsYXRlTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfUGFnZVNldCk7DQotICAgIEFTU0VSVChtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KTsNCi0gICAgaWYgKG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdCkgew0KLSAgICAgICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290LT5tX3BQYXJlbnQgPSBOVUxMOw0KLSAgICAgICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290LT5tX3BGaXJzdENoaWxkID0gTlVMTDsNCi0gICAgICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdC0+bV9wTmV4dFNpYmxpbmcgPSBOVUxMOw0KLSAgICAgICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290LT5tX3BGb3JtTm9kZSA9IG1fcFRlbXBsYXRlUGFnZVNldFJvb3Q7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QgPSBGWF9ORVcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbChtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KTsNCi0gICAgfQ0KLSAgICBtX3BQYWdlU2V0Q3VyUm9vdCA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCi0gICAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksICh2b2lkKiltX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QpOw0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlUmVsYXRpb24gPSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUmVsYXRpb24pOw0KLSAgICBpZihlUmVsYXRpb24gIT0gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bikgew0KLSAgICAgICAgbV9lUGFnZVNldE1vZGUgPSBlUmVsYXRpb247DQotICAgIH0NCi0gICAgSW5pdFBhZ2VTZXRNYXAoKTsNCi0gICAgQ1hGQV9Ob2RlKiBwUGFnZUFyZWEgPSBOVUxMOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIGZvciAocFBhZ2VBcmVhID0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwUGFnZUFyZWE7IHBQYWdlQXJlYSA9IHBQYWdlQXJlYS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgaWYgKHBQYWdlQXJlYS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQotICAgICAgICAgICAgaUNvdW50Kys7DQotICAgICAgICAgICAgaWYgKHBQYWdlQXJlYS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoaUNvdW50ID4gMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBUZW1wbGF0ZU5vZGUtPkdldERvY3VtZW50KCk7DQotICAgIElYRkFfT2JqRmFjdG9yeSogcE9iakZhY3RvcnkgPSBwRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCk7DQotICAgIHBQYWdlQXJlYSA9IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1BhZ2VBcmVhKTsNCisgIH0NCisgIGlmIChpQ291bnQgPiAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBUZW1wbGF0ZU5vZGUtPkdldERvY3VtZW50KCk7DQorICBJWEZBX09iakZhY3RvcnkqIHBPYmpGYWN0b3J5ID0gcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KKyAgcFBhZ2VBcmVhID0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGFnZUFyZWEpOw0KKyAgaWYgKCFwUGFnZUFyZWEpIHsNCisgICAgcFBhZ2VBcmVhID0gcE9iakZhY3RvcnktPkNyZWF0ZU5vZGUobV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0UGFja2V0SUQoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlRfUGFnZUFyZWEpOw0KICAgICBpZiAoIXBQYWdlQXJlYSkgew0KLSAgICAgICAgcFBhZ2VBcmVhID0gcE9iakZhY3RvcnktPkNyZWF0ZU5vZGUobV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0UGFja2V0SUQoKSwgWEZBX0VMRU1FTlRfUGFnZUFyZWEpOw0KLSAgICAgICAgaWYoIXBQYWdlQXJlYSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkluc2VydENoaWxkKHBQYWdlQXJlYSwgTlVMTCk7DQotICAgICAgICBwUGFnZUFyZWEtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWEgPSBwUGFnZUFyZWEtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+SW5zZXJ0Q2hpbGQocFBhZ2VBcmVhLCBOVUxMKTsNCisgICAgcFBhZ2VBcmVhLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICB9DQorICBDWEZBX05vZGUqIHBDb250ZW50QXJlYSA9IHBQYWdlQXJlYS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpOw0KKyAgaWYgKCFwQ29udGVudEFyZWEpIHsNCisgICAgcENvbnRlbnRBcmVhID0gcE9iakZhY3RvcnktPkNyZWF0ZU5vZGUocFBhZ2VBcmVhLT5HZXRQYWNrZXRJRCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQogICAgIGlmICghcENvbnRlbnRBcmVhKSB7DQotICAgICAgICBwQ29udGVudEFyZWEgPSBwT2JqRmFjdG9yeS0+Q3JlYXRlTm9kZShwUGFnZUFyZWEtPkdldFBhY2tldElEKCksIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCi0gICAgICAgIGlmKCFwQ29udGVudEFyZWEpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBwUGFnZUFyZWEtPkluc2VydENoaWxkKHBDb250ZW50QXJlYSwgTlVMTCk7DQotICAgICAgICBwQ29udGVudEFyZWEtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCi0gICAgICAgIHBDb250ZW50QXJlYS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1gsIENYRkFfTWVhc3VyZW1lbnQoMC4yNWYsIFhGQV9VTklUX0luKSk7DQotICAgICAgICBwQ29udGVudEFyZWEtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9ZLCBDWEZBX01lYXN1cmVtZW50KDAuMjVmLCBYRkFfVU5JVF9JbikpOw0KLSAgICAgICAgcENvbnRlbnRBcmVhLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVywgQ1hGQV9NZWFzdXJlbWVudCg4LjBmLCBYRkFfVU5JVF9JbikpOw0KLSAgICAgICAgcENvbnRlbnRBcmVhLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCwgQ1hGQV9NZWFzdXJlbWVudCgxMC41ZiwgWEZBX1VOSVRfSW4pKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwTWVkaXVtICA9IHBQYWdlQXJlYS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWVkaXVtKTsNCi0gICAgaWYgKCFwTWVkaXVtKSB7DQotICAgICAgICBwTWVkaXVtID0gcE9iakZhY3RvcnktPkNyZWF0ZU5vZGUocFBhZ2VBcmVhLT5HZXRQYWNrZXRJRCgpLCBYRkFfRUxFTUVOVF9NZWRpdW0pOw0KLSAgICAgICAgaWYoIXBDb250ZW50QXJlYSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBQYWdlQXJlYS0+SW5zZXJ0Q2hpbGQocE1lZGl1bSwgTlVMTCk7DQotICAgICAgICBwTWVkaXVtLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQotICAgICAgICBwTWVkaXVtLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2hvcnQsIENYRkFfTWVhc3VyZW1lbnQoOC41ZiwgWEZBX1VOSVRfSW4pKTsNCi0gICAgICAgIHBNZWRpdW0tPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Mb25nLCBDWEZBX01lYXN1cmVtZW50KDExLjBmLCBYRkFfVU5JVF9JbikpOw0KKyAgICBwUGFnZUFyZWEtPkluc2VydENoaWxkKHBDb250ZW50QXJlYSwgTlVMTCk7DQorICAgIHBDb250ZW50QXJlYS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICBwQ29udGVudEFyZWEtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCgwLjI1ZiwgWEZBX1VOSVRfSW4pKTsNCisgICAgcENvbnRlbnRBcmVhLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQoMC4yNWYsIFhGQV9VTklUX0luKSk7DQorICAgIHBDb250ZW50QXJlYS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KDguMGYsIFhGQV9VTklUX0luKSk7DQorICAgIHBDb250ZW50QXJlYS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KDEwLjVmLCBYRkFfVU5JVF9JbikpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTWVkaXVtID0gcFBhZ2VBcmVhLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9NZWRpdW0pOw0KKyAgaWYgKCFwTWVkaXVtKSB7DQorICAgIHBNZWRpdW0gPQ0KKyAgICAgICAgcE9iakZhY3RvcnktPkNyZWF0ZU5vZGUocFBhZ2VBcmVhLT5HZXRQYWNrZXRJRCgpLCBYRkFfRUxFTUVOVF9NZWRpdW0pOw0KKyAgICBpZiAoIXBDb250ZW50QXJlYSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCisgICAgcFBhZ2VBcmVhLT5JbnNlcnRDaGlsZChwTWVkaXVtLCBOVUxMKTsNCisgICAgcE1lZGl1bS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICBwTWVkaXVtLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2hvcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCg4LjVmLCBYRkFfVU5JVF9JbikpOw0KKyAgICBwTWVkaXVtLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTG9uZywNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KDExLjBmLCBYRkFfVU5JVF9JbikpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpQcmVwYXJlRmlyc3RQYWdlKENYRkFfTm9kZSogcFJvb3RTdWJmb3JtKQ0KLXsNCi0gICAgRlhfQk9PTCBiUHJvQnJlYWtCZWZvcmUgPSBGQUxTRTsNCi0gICAgQ1hGQV9Ob2RlKiBwQnJlYWtCZWZvcmVOb2RlID0gTlVMTDsNCi0gICAgd2hpbGUgKHBSb290U3ViZm9ybSkgew0KLSAgICAgICAgZm9yKENYRkFfTm9kZSogcEJyZWFrTm9kZSA9IHBSb290U3ViZm9ybS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQnJlYWtOb2RlOyBwQnJlYWtOb2RlID0gcEJyZWFrTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcEJyZWFrTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICAgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9CcmVha0JlZm9yZSB8fCAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfQnJlYWsgJiYgcEJyZWFrTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0JlZm9yZSkgIT0gWEZBX0FUVFJJQlVURUVOVU1fQXV0bykpIHsNCi0gICAgICAgICAgICAgICAgYlByb0JyZWFrQmVmb3JlID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgcEJyZWFrQmVmb3JlTm9kZSA9IHBCcmVha05vZGU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiUHJvQnJlYWtCZWZvcmUpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJlcGFyZUZpcnN0UGFnZShDWEZBX05vZGUqIHBSb290U3ViZm9ybSkgew0KKyAgRlhfQk9PTCBiUHJvQnJlYWtCZWZvcmUgPSBGQUxTRTsNCisgIENYRkFfTm9kZSogcEJyZWFrQmVmb3JlTm9kZSA9IE5VTEw7DQorICB3aGlsZSAocFJvb3RTdWJmb3JtKSB7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwQnJlYWtOb2RlID0NCisgICAgICAgICAgICAgcFJvb3RTdWJmb3JtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgcEJyZWFrTm9kZTsNCisgICAgICAgICBwQnJlYWtOb2RlID0gcEJyZWFrTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcEJyZWFrTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9CcmVha0JlZm9yZSB8fA0KKyAgICAgICAgICAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfQnJlYWsgJiYNCisgICAgICAgICAgIHBCcmVha05vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9CZWZvcmUpICE9DQorICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fQXV0bykpIHsNCiAgICAgICAgIGJQcm9CcmVha0JlZm9yZSA9IFRSVUU7DQotICAgICAgICBwUm9vdFN1YmZvcm0gPSBwUm9vdFN1YmZvcm0tPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KLSAgICAgICAgd2hpbGUgKHBSb290U3ViZm9ybSAmJiAhWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwUm9vdFN1YmZvcm0pKSB7DQotICAgICAgICAgICAgcFJvb3RTdWJmb3JtID0gcFJvb3RTdWJmb3JtLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCi0gICAgICAgIH0NCisgICAgICAgIHBCcmVha0JlZm9yZU5vZGUgPSBwQnJlYWtOb2RlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KICAgICB9DQotICAgIENYRkFfTm9kZSogcExlYWRlciwgKnBUcmFpbGVyOw0KLSAgICBpZiAocEJyZWFrQmVmb3JlTm9kZSAmJiBFeGVjdXRlQnJlYWtCZWZvcmVPckFmdGVyKHBCcmVha0JlZm9yZU5vZGUsIFRSVUUsIHBMZWFkZXIsIHBUcmFpbGVyKSkgew0KLSAgICAgICAgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRIZWFkUG9zaXRpb24oKTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KKyAgICBpZiAoYlByb0JyZWFrQmVmb3JlKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgcmV0dXJuIEFwcGVuZE5ld1BhZ2UoVFJVRSk7DQorICAgIGJQcm9CcmVha0JlZm9yZSA9IFRSVUU7DQorICAgIHBSb290U3ViZm9ybSA9IHBSb290U3ViZm9ybS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICAgIHdoaWxlIChwUm9vdFN1YmZvcm0gJiYNCisgICAgICAgICAgICFYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBSb290U3ViZm9ybSkpIHsNCisgICAgICBwUm9vdFN1YmZvcm0gPSBwUm9vdFN1YmZvcm0tPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KKyAgICB9DQorICB9DQorICBDWEZBX05vZGUgKnBMZWFkZXIsICpwVHJhaWxlcjsNCisgIGlmIChwQnJlYWtCZWZvcmVOb2RlICYmDQorICAgICAgRXhlY3V0ZUJyZWFrQmVmb3JlT3JBZnRlcihwQnJlYWtCZWZvcmVOb2RlLCBUUlVFLCBwTGVhZGVyLCBwVHJhaWxlcikpIHsNCisgICAgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRIZWFkUG9zaXRpb24oKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gQXBwZW5kTmV3UGFnZShUUlVFKTsNCiB9DQotRlhfQk9PTCAgQ1hGQV9MYXlvdXRQYWdlTWdyOjpBcHBlbmROZXdQYWdlKEZYX0JPT0wgYkZpcnN0VGVtUGFnZSkNCi17DQotICAgIGlmKG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgIT0gbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldFRhaWxQb3NpdGlvbigpKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBQYWdlTm9kZSA9IEdldE5leHRBdmFpbFBhZ2VBcmVhKE5VTEwpOw0KLSAgICBpZiAoIXBQYWdlTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmIChiRmlyc3RUZW1QYWdlICYmIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPT0gTlVMTCkgew0KLSAgICAgICAgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRIZWFkUG9zaXRpb24oKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gIWJGaXJzdFRlbVBhZ2UgfHwgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCAhPSBOVUxMOw0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpBcHBlbmROZXdQYWdlKEZYX0JPT0wgYkZpcnN0VGVtUGFnZSkgew0KKyAgaWYgKG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgIT0NCisgICAgICBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0VGFpbFBvc2l0aW9uKCkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDWEZBX05vZGUqIHBQYWdlTm9kZSA9IEdldE5leHRBdmFpbFBhZ2VBcmVhKE5VTEwpOw0KKyAgaWYgKCFwUGFnZU5vZGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJGaXJzdFRlbVBhZ2UgJiYgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9PSBOVUxMKSB7DQorICAgIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPSBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0SGVhZFBvc2l0aW9uKCk7DQorICB9DQorICByZXR1cm4gIWJGaXJzdFRlbVBhZ2UgfHwgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCAhPSBOVUxMOw0KIH0NCi1zdGF0aWMgdm9pZCBYRkFfTGF5b3V0SXRlbU1ncl9SZW9yZGVyTGF5b3V0SXRlbVRvVGFpbChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkNCi17DQotICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRMYXlvdXRJdGVtID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7DQotICAgIGlmKCFwUGFyZW50TGF5b3V0SXRlbSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBOZXh0ID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KLSAgICBwUGFyZW50TGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQocExheW91dEl0ZW0pOw0KLSAgICBwUGFyZW50TGF5b3V0SXRlbS0+QWRkQ2hpbGQocExheW91dEl0ZW0pOw0KK3N0YXRpYyB2b2lkIFhGQV9MYXlvdXRJdGVtTWdyX1Jlb3JkZXJMYXlvdXRJdGVtVG9UYWlsKA0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkgew0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFBhcmVudExheW91dEl0ZW0gPQ0KKyAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wUGFyZW50Ow0KKyAgaWYgKCFwUGFyZW50TGF5b3V0SXRlbSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwTmV4dCA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgIHBQYXJlbnRMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwTGF5b3V0SXRlbSk7DQorICBwUGFyZW50TGF5b3V0SXRlbS0+QWRkQ2hpbGQocExheW91dEl0ZW0pOw0KIH0NCi1zdGF0aWMgdm9pZCBYRkFfTGF5b3V0SXRlbU1ncl9SZW1vdmVMYXlvdXRJdGVtKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KLXsNCi0gICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFBhcmVudExheW91dEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcFBhcmVudDsNCi0gICAgaWYoIXBQYXJlbnRMYXlvdXRJdGVtKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcE5leHQgPSBwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgIHBQYXJlbnRMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwTGF5b3V0SXRlbSk7DQorc3RhdGljIHZvaWQgWEZBX0xheW91dEl0ZW1NZ3JfUmVtb3ZlTGF5b3V0SXRlbSgNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pIHsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRMYXlvdXRJdGVtID0NCisgICAgICAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcFBhcmVudDsNCisgIGlmICghcFBhcmVudExheW91dEl0ZW0pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcE5leHQgPSBwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICBwUGFyZW50TGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQocExheW91dEl0ZW0pOw0KIH0NCi12b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6UmVtb3ZlTGF5b3V0UmVjb3JkKENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkLCBDWEZBX0NvbnRhaW5lclJlY29yZCogcFByZXZSZWNvcmQpDQotew0KLSAgICBpZighcE5ld1JlY29yZCB8fCAhcFByZXZSZWNvcmQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZihwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCAhPSBwUHJldlJlY29yZC0+cEN1clBhZ2VTZXQpIHsNCi0gICAgICAgIFhGQV9MYXlvdXRJdGVtTWdyX1JlbW92ZUxheW91dEl0ZW0ocE5ld1JlY29yZC0+cEN1clBhZ2VTZXQpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmKHBOZXdSZWNvcmQtPnBDdXJQYWdlQXJlYSAhPSBwUHJldlJlY29yZC0+cEN1clBhZ2VBcmVhKSB7DQotICAgICAgICBYRkFfTGF5b3V0SXRlbU1ncl9SZW1vdmVMYXlvdXRJdGVtKHBOZXdSZWNvcmQtPnBDdXJQYWdlQXJlYSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYocE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhICE9IHBQcmV2UmVjb3JkLT5wQ3VyQ29udGVudEFyZWEpIHsNCi0gICAgICAgIFhGQV9MYXlvdXRJdGVtTWdyX1JlbW92ZUxheW91dEl0ZW0ocE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpSZW1vdmVMYXlvdXRSZWNvcmQoQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcFByZXZSZWNvcmQpIHsNCisgIGlmICghcE5ld1JlY29yZCB8fCAhcFByZXZSZWNvcmQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ICE9IHBQcmV2UmVjb3JkLT5wQ3VyUGFnZVNldCkgew0KKyAgICBYRkFfTGF5b3V0SXRlbU1ncl9SZW1vdmVMYXlvdXRJdGVtKHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0KTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBOZXdSZWNvcmQtPnBDdXJQYWdlQXJlYSAhPSBwUHJldlJlY29yZC0+cEN1clBhZ2VBcmVhKSB7DQorICAgIFhGQV9MYXlvdXRJdGVtTWdyX1JlbW92ZUxheW91dEl0ZW0ocE5ld1JlY29yZC0+cEN1clBhZ2VBcmVhKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBOZXdSZWNvcmQtPnBDdXJDb250ZW50QXJlYSAhPSBwUHJldlJlY29yZC0+cEN1ckNvbnRlbnRBcmVhKSB7DQorICAgIFhGQV9MYXlvdXRJdGVtTWdyX1JlbW92ZUxheW91dEl0ZW0ocE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6UmVvcmRlclBlbmRpbmdMYXlvdXRSZWNvcmRUb1RhaWwoQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwUHJldlJlY29yZCkNCi17DQotICAgIGlmKCFwTmV3UmVjb3JkIHx8ICFwUHJldlJlY29yZCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmKHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ICE9IHBQcmV2UmVjb3JkLT5wQ3VyUGFnZVNldCkgew0KLSAgICAgICAgWEZBX0xheW91dEl0ZW1NZ3JfUmVvcmRlckxheW91dEl0ZW1Ub1RhaWwocE5ld1JlY29yZC0+cEN1clBhZ2VTZXQpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmKHBOZXdSZWNvcmQtPnBDdXJQYWdlQXJlYSAhPSBwUHJldlJlY29yZC0+cEN1clBhZ2VBcmVhKSB7DQotICAgICAgICBYRkFfTGF5b3V0SXRlbU1ncl9SZW9yZGVyTGF5b3V0SXRlbVRvVGFpbChwTmV3UmVjb3JkLT5wQ3VyUGFnZUFyZWEpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmKHBOZXdSZWNvcmQtPnBDdXJDb250ZW50QXJlYSAhPSBwUHJldlJlY29yZC0+cEN1ckNvbnRlbnRBcmVhKSB7DQotICAgICAgICBYRkFfTGF5b3V0SXRlbU1ncl9SZW9yZGVyTGF5b3V0SXRlbVRvVGFpbChwTmV3UmVjb3JkLT5wQ3VyQ29udGVudEFyZWEpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OlJlb3JkZXJQZW5kaW5nTGF5b3V0UmVjb3JkVG9UYWlsKA0KKyAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCwNCisgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBQcmV2UmVjb3JkKSB7DQorICBpZiAoIXBOZXdSZWNvcmQgfHwgIXBQcmV2UmVjb3JkKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCAhPSBwUHJldlJlY29yZC0+cEN1clBhZ2VTZXQpIHsNCisgICAgWEZBX0xheW91dEl0ZW1NZ3JfUmVvcmRlckxheW91dEl0ZW1Ub1RhaWwocE5ld1JlY29yZC0+cEN1clBhZ2VTZXQpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocE5ld1JlY29yZC0+cEN1clBhZ2VBcmVhICE9IHBQcmV2UmVjb3JkLT5wQ3VyUGFnZUFyZWEpIHsNCisgICAgWEZBX0xheW91dEl0ZW1NZ3JfUmVvcmRlckxheW91dEl0ZW1Ub1RhaWwocE5ld1JlY29yZC0+cEN1clBhZ2VBcmVhKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBOZXdSZWNvcmQtPnBDdXJDb250ZW50QXJlYSAhPSBwUHJldlJlY29yZC0+cEN1ckNvbnRlbnRBcmVhKSB7DQorICAgIFhGQV9MYXlvdXRJdGVtTWdyX1Jlb3JkZXJMYXlvdXRJdGVtVG9UYWlsKHBOZXdSZWNvcmQtPnBDdXJDb250ZW50QXJlYSk7DQorICAgIHJldHVybjsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OlN1Ym1pdENvbnRlbnRJdGVtKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ29udGVudExheW91dEl0ZW0sIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVTdGF0dXMpDQotew0KLSAgICBpZihwQ29udGVudExheW91dEl0ZW0pIHsNCi0gICAgICAgIEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1ckNvbnRlbnRBcmVhLT5BZGRDaGlsZChwQ29udGVudExheW91dEl0ZW0pOw0KLSAgICAgICAgbV9iQ3JlYXRlT3ZlckZsb3dQYWdlID0gRkFMU0U7DQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OlN1Ym1pdENvbnRlbnRJdGVtKA0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcENvbnRlbnRMYXlvdXRJdGVtLA0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlU3RhdHVzKSB7DQorICBpZiAocENvbnRlbnRMYXlvdXRJdGVtKSB7DQorICAgIEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1ckNvbnRlbnRBcmVhLT5BZGRDaGlsZChwQ29udGVudExheW91dEl0ZW0pOw0KKyAgICBtX2JDcmVhdGVPdmVyRmxvd1BhZ2UgPSBGQUxTRTsNCisgIH0NCisgIGlmIChlU3RhdHVzICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgICAgaWYgKGVTdGF0dXMgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhayAmJg0KKyAgICAgICAgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9PQ0KKyAgICAgICAgICAgIG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRUYWlsUG9zaXRpb24oKSkgew0KKyAgICAgIEFwcGVuZE5ld1BhZ2UoKTsNCiAgICAgfQ0KLSAgICBpZihlU3RhdHVzICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCi0gICAgICAgIGlmKGVTdGF0dXMgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhayAmJiBtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkID09IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRUYWlsUG9zaXRpb24oKSkgew0KLSAgICAgICAgICAgIEFwcGVuZE5ld1BhZ2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPSBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0VGFpbFBvc2l0aW9uKCk7DQotICAgICAgICBtX3BDdXJQYWdlQXJlYSA9IEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1clBhZ2VBcmVhLT5tX3BGb3JtTm9kZTsNCi0gICAgfQ0KKyAgICBtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkID0gbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldFRhaWxQb3NpdGlvbigpOw0KKyAgICBtX3BDdXJQYWdlQXJlYSA9IEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1clBhZ2VBcmVhLT5tX3BGb3JtTm9kZTsNCisgIH0NCiB9DQotRlhfRkxPQVQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpHZXRBdmFpbEhlaWdodCgpDQotew0KLSAgICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQgPSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJDb250ZW50QXJlYS0+bV9wRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9IKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLSAgICBpZiAoZkF2YWlsSGVpZ2h0IDwgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCi0gICAgICAgIGlmIChtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkID09IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRIZWFkUG9zaXRpb24oKSkgew0KLSAgICAgICAgICAgIGZBdmFpbEhlaWdodCA9IDA7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZBdmFpbEhlaWdodCA9IFhGQV9MQVlPVVRfRkxPQVRfTUFYOw0KLSAgICAgICAgfQ0KK0ZYX0ZMT0FUIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0QXZhaWxIZWlnaHQoKSB7DQorICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQgPQ0KKyAgICAgIEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKQ0KKyAgICAgICAgICAtPnBDdXJDb250ZW50QXJlYS0+bV9wRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9IKQ0KKyAgICAgICAgICAuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgIGlmIChmQXZhaWxIZWlnaHQgPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICBpZiAobV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9PQ0KKyAgICAgICAgbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldEhlYWRQb3NpdGlvbigpKSB7DQorICAgICAgZkF2YWlsSGVpZ2h0ID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICBmQXZhaWxIZWlnaHQgPSBYRkFfTEFZT1VUX0ZMT0FUX01BWDsNCiAgICAgfQ0KLSAgICByZXR1cm4gZkF2YWlsSGVpZ2h0Ow0KKyAgfQ0KKyAgcmV0dXJuIGZBdmFpbEhlaWdodDsNCiB9DQotc3RhdGljIENYRkFfTm9kZSogWEZBX1Jlc29sdmVCcmVha1RhcmdldChDWEZBX05vZGUqIHBQYWdlU2V0Um9vdCwgRlhfQk9PTCBiTmV3RXhwclN0eWxlLCBDRlhfV2lkZVN0cmluZ0MmIHdzVGFyZ2V0RXhwcikNCi17DQotICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlU2V0Um9vdC0+R2V0RG9jdW1lbnQoKTsNCi0gICAgaWYod3NUYXJnZXRFeHByLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYXJnZXRBbGwgPSB3c1RhcmdldEV4cHI7DQotICAgIHdzVGFyZ2V0QWxsLlRyaW1MZWZ0KCk7DQotICAgIHdzVGFyZ2V0QWxsLlRyaW1SaWdodCgpOw0KLSAgICBpbnQzMl90IGlTcGxpdGVJbmRleCA9IDA7DQotICAgIEZYX0JPT0wgYlRhcmdldEFsbEZpbmQgPSBUUlVFOw0KLSAgICB3aGlsZShpU3BsaXRlSW5kZXggIT0gLTEpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGFyZ2V0RXhwcjsNCi0gICAgICAgIGludDMyX3QgaVNwbGl0ZU5leHRJbmRleCA9IDA7DQotICAgICAgICBpZighYlRhcmdldEFsbEZpbmQpIHsNCi0gICAgICAgICAgICBpU3BsaXRlTmV4dEluZGV4ID0gd3NUYXJnZXRBbGwuRmluZCgnICcsIGlTcGxpdGVJbmRleCk7DQotICAgICAgICAgICAgd3NUYXJnZXRFeHByID0gd3NUYXJnZXRBbGwuTWlkKGlTcGxpdGVJbmRleCwgaVNwbGl0ZU5leHRJbmRleCAtIGlTcGxpdGVJbmRleCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdzVGFyZ2V0RXhwciA9IHdzVGFyZ2V0QWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYod3NUYXJnZXRFeHByLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYlRhcmdldEFsbEZpbmQgPSBGQUxTRTsNCi0gICAgICAgIGlmKHdzVGFyZ2V0RXhwci5HZXRBdCgwKSA9PSAnIycpIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUgKnBOb2RlID0gcERvY3VtZW50LT5HZXROb2RlQnlJRCgoQ1hGQV9Ob2RlKilwRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1RlbXBsYXRlKSwgd3NUYXJnZXRFeHByLk1pZCgxKSk7DQotICAgICAgICAgICAgaWYocE5vZGUpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBOb2RlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZihiTmV3RXhwclN0eWxlKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9jZXNzZWRUYXJnZXQgPSAgd3NUYXJnZXRFeHByOw0KLSAgICAgICAgICAgIGlmKHdzVGFyZ2V0RXhwci5MZWZ0KDQpID09IEZYX1dTVFJDKEwic29tKCIpICYmIHdzVGFyZ2V0RXhwci5SaWdodCgxKSA9PSBGWF9XU1RSQyhMIikiKSkgew0KLSAgICAgICAgICAgICAgICB3c1Byb2Nlc3NlZFRhcmdldCA9IHdzVGFyZ2V0RXhwci5NaWQoNCwgd3NUYXJnZXRFeHByLkdldExlbmd0aCgpIC0gNSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByczsNCi0gICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IHBEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5SZXNvbHZlT2JqZWN0cyhwUGFnZVNldFJvb3QsIHdzUHJvY2Vzc2VkVGFyZ2V0LCBycywgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfCBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcyB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQpOw0KLSAgICAgICAgICAgIGlmKGlDb3VudCA+IDAgJiYgcnMubm9kZXNbMF0tPklzTm9kZSgpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKilycy5ub2Rlc1swXTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpU3BsaXRlSW5kZXggPSBpU3BsaXRlTmV4dEluZGV4Ow0KLSAgICB9DQorc3RhdGljIENYRkFfTm9kZSogWEZBX1Jlc29sdmVCcmVha1RhcmdldChDWEZBX05vZGUqIHBQYWdlU2V0Um9vdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5ld0V4cHJTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyYgd3NUYXJnZXRFeHByKSB7DQorICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZVNldFJvb3QtPkdldERvY3VtZW50KCk7DQorICBpZiAod3NUYXJnZXRFeHByLklzRW1wdHkoKSkgew0KICAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGFyZ2V0QWxsID0gd3NUYXJnZXRFeHByOw0KKyAgd3NUYXJnZXRBbGwuVHJpbUxlZnQoKTsNCisgIHdzVGFyZ2V0QWxsLlRyaW1SaWdodCgpOw0KKyAgaW50MzJfdCBpU3BsaXRlSW5kZXggPSAwOw0KKyAgRlhfQk9PTCBiVGFyZ2V0QWxsRmluZCA9IFRSVUU7DQorICB3aGlsZSAoaVNwbGl0ZUluZGV4ICE9IC0xKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGFyZ2V0RXhwcjsNCisgICAgaW50MzJfdCBpU3BsaXRlTmV4dEluZGV4ID0gMDsNCisgICAgaWYgKCFiVGFyZ2V0QWxsRmluZCkgew0KKyAgICAgIGlTcGxpdGVOZXh0SW5kZXggPSB3c1RhcmdldEFsbC5GaW5kKCcgJywgaVNwbGl0ZUluZGV4KTsNCisgICAgICB3c1RhcmdldEV4cHIgPQ0KKyAgICAgICAgICB3c1RhcmdldEFsbC5NaWQoaVNwbGl0ZUluZGV4LCBpU3BsaXRlTmV4dEluZGV4IC0gaVNwbGl0ZUluZGV4KTsNCisgICAgfSBlbHNlIHsNCisgICAgICB3c1RhcmdldEV4cHIgPSB3c1RhcmdldEFsbDsNCisgICAgfQ0KKyAgICBpZiAod3NUYXJnZXRFeHByLklzRW1wdHkoKSkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGJUYXJnZXRBbGxGaW5kID0gRkFMU0U7DQorICAgIGlmICh3c1RhcmdldEV4cHIuR2V0QXQoMCkgPT0gJyMnKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBEb2N1bWVudC0+R2V0Tm9kZUJ5SUQoDQorICAgICAgICAgIChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfVGVtcGxhdGUpLA0KKyAgICAgICAgICB3c1RhcmdldEV4cHIuTWlkKDEpKTsNCisgICAgICBpZiAocE5vZGUpIHsNCisgICAgICAgIHJldHVybiBwTm9kZTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoYk5ld0V4cHJTdHlsZSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvY2Vzc2VkVGFyZ2V0ID0gd3NUYXJnZXRFeHByOw0KKyAgICAgIGlmICh3c1RhcmdldEV4cHIuTGVmdCg0KSA9PSBGWF9XU1RSQyhMInNvbSgiKSAmJg0KKyAgICAgICAgICB3c1RhcmdldEV4cHIuUmlnaHQoMSkgPT0gRlhfV1NUUkMoTCIpIikpIHsNCisgICAgICAgIHdzUHJvY2Vzc2VkVGFyZ2V0ID0gd3NUYXJnZXRFeHByLk1pZCg0LCB3c1RhcmdldEV4cHIuR2V0TGVuZ3RoKCkgLSA1KTsNCisgICAgICB9DQorICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJzOw0KKyAgICAgIGludDMyX3QgaUNvdW50ID0gcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPlJlc29sdmVPYmplY3RzKA0KKyAgICAgICAgICBwUGFnZVNldFJvb3QsIHdzUHJvY2Vzc2VkVGFyZ2V0LCBycywNCisgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfA0KKyAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfA0KKyAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1BhcmVudCk7DQorICAgICAgaWYgKGlDb3VudCA+IDAgJiYgcnMubm9kZXNbMF0tPklzTm9kZSgpKSB7DQorICAgICAgICByZXR1cm4gKENYRkFfTm9kZSopcnMubm9kZXNbMF07DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlTcGxpdGVJbmRleCA9IGlTcGxpdGVOZXh0SW5kZXg7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQogDQotRlhfQk9PTCBYRkFfTGF5b3V0UGFnZU1ncl9SdW5CcmVha1Rlc3RTY3JpcHQoQ1hGQV9Ob2RlKiBwVGVzdFNjcmlwdCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCi0gICAgcFRlc3RTY3JpcHQtPlRyeUNvbnRlbnQod3NFeHByZXNzaW9uKTsNCi0gICAgaWYod3NFeHByZXNzaW9uLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIHBUZXN0U2NyaXB0LT5HZXREb2N1bWVudCgpLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCktPlJ1blNjcmlwdChwVGVzdFNjcmlwdCwgcFRlc3RTY3JpcHQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpKTsNCitGWF9CT09MIFhGQV9MYXlvdXRQYWdlTWdyX1J1bkJyZWFrVGVzdFNjcmlwdChDWEZBX05vZGUqIHBUZXN0U2NyaXB0KSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICBwVGVzdFNjcmlwdC0+VHJ5Q29udGVudCh3c0V4cHJlc3Npb24pOw0KKyAgaWYgKHdzRXhwcmVzc2lvbi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gcFRlc3RTY3JpcHQtPkdldERvY3VtZW50KCktPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKS0+UnVuU2NyaXB0KA0KKyAgICAgIHBUZXN0U2NyaXB0LCBwVGVzdFNjcmlwdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpKTsNCiB9DQotQ1hGQV9Db250YWluZXJSZWNvcmQqIENYRkFfTGF5b3V0UGFnZU1ncjo6Q3JlYXRlQ29udGFpbmVyUmVjb3JkKENYRkFfTm9kZSogcFBhZ2VOb2RlLCBGWF9CT09MIGJDcmVhdGVOZXcpDQotew0KLSAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9IEZYX05FVyBDWEZBX0NvbnRhaW5lclJlY29yZCgpOw0KLSAgICBpZihtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkKSB7DQotICAgICAgICBpZighSXNQYWdlU2V0Um9vdE9yZGVyZWRPY2N1cnJlbmNlKCkgfHwgcFBhZ2VOb2RlID09IE5VTEwpIHsNCi0gICAgICAgICAgICAqcE5ld1JlY29yZCA9ICpHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCk7DQotICAgICAgICAgICAgbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkFkZFRhaWwocE5ld1JlY29yZCk7DQotICAgICAgICAgICAgcmV0dXJuIHBOZXdSZWNvcmQ7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX05vZGUqIHBQYWdlU2V0ID0gcFBhZ2VOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgIGlmKCFiQ3JlYXRlTmV3KSB7DQotICAgICAgICAgICAgaWYocFBhZ2VTZXQgPT0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgew0KLSAgICAgICAgICAgICAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCA9IG1fcFBhZ2VTZXRDdXJSb290Ow0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRMYXlvdXRJdGVtID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBQYWdlU2V0LT5HZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSk7DQotICAgICAgICAgICAgICAgIGlmKHBQYXJlbnRMYXlvdXRJdGVtID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBQYXJlbnRMYXlvdXRJdGVtID0gbV9wUGFnZVNldEN1clJvb3Q7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcE5ld1JlY29yZC0+cEN1clBhZ2VTZXQgPSBwUGFyZW50TGF5b3V0SXRlbTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRQYWdlU2V0TGF5b3V0ID0gTlVMTDsNCi0gICAgICAgICAgICBpZihwUGFnZVNldCA9PSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlU2V0LT5tX3BGb3JtTm9kZSkgew0KLSAgICAgICAgICAgICAgICBwUGFyZW50UGFnZVNldExheW91dCA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlU2V0LT5tX3BQYXJlbnQ7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcFBhcmVudFBhZ2VTZXRMYXlvdXQgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFBhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLT5HZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYWdlU2V0TGF5b3V0SXRlbSA9IEZYX05FVyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKHBQYWdlU2V0KTsNCi0gICAgICAgICAgICBwUGFnZVNldC0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksICh2b2lkKilwUGFnZVNldExheW91dEl0ZW0pOw0KLSAgICAgICAgICAgIGlmKHBQYXJlbnRQYWdlU2V0TGF5b3V0ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFByZVBhZ2VTZXQgPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQotICAgICAgICAgICAgICAgIHdoaWxlKHBQcmVQYWdlU2V0LT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgICAgICAgICAgICAgcFByZVBhZ2VTZXQgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFByZVBhZ2VTZXQtPm1fcE5leHRTaWJsaW5nOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBQcmVQYWdlU2V0LT5tX3BOZXh0U2libGluZyA9IHBQYWdlU2V0TGF5b3V0SXRlbTsNCi0gICAgICAgICAgICAgICAgbV9wUGFnZVNldEN1clJvb3QgPSBwUGFnZVNldExheW91dEl0ZW07DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcFBhcmVudFBhZ2VTZXRMYXlvdXQtPkFkZENoaWxkKHBQYWdlU2V0TGF5b3V0SXRlbSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ID0gcFBhZ2VTZXRMYXlvdXRJdGVtOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYocFBhZ2VOb2RlKSB7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IHBQYWdlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICAgICAgaWYocFBhZ2VTZXQgPT0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgew0KLSAgICAgICAgICAgICAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZVNldExheW91dEl0ZW0gPSBGWF9ORVcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbChwUGFnZVNldCk7DQotICAgICAgICAgICAgICAgIHBQYWdlU2V0LT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwgKHZvaWQqKXBQYWdlU2V0TGF5b3V0SXRlbSk7DQotICAgICAgICAgICAgICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdC0+QWRkQ2hpbGQocFBhZ2VTZXRMYXlvdXRJdGVtKTsNCi0gICAgICAgICAgICAgICAgcE5ld1JlY29yZC0+cEN1clBhZ2VTZXQgPSBwUGFnZVNldExheW91dEl0ZW07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCi0gICAgICAgIH0NCitDWEZBX0NvbnRhaW5lclJlY29yZCogQ1hGQV9MYXlvdXRQYWdlTWdyOjpDcmVhdGVDb250YWluZXJSZWNvcmQoDQorICAgIENYRkFfTm9kZSogcFBhZ2VOb2RlLA0KKyAgICBGWF9CT09MIGJDcmVhdGVOZXcpIHsNCisgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gRlhfTkVXIENYRkFfQ29udGFpbmVyUmVjb3JkKCk7DQorICBpZiAobV9wQ3VycmVudENvbnRhaW5lclJlY29yZCkgew0KKyAgICBpZiAoIUlzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpIHx8IHBQYWdlTm9kZSA9PSBOVUxMKSB7DQorICAgICAgKnBOZXdSZWNvcmQgPSAqR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpOw0KKyAgICAgIG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5BZGRUYWlsKHBOZXdSZWNvcmQpOw0KKyAgICAgIHJldHVybiBwTmV3UmVjb3JkOw0KICAgICB9DQotICAgIG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5BZGRUYWlsKHBOZXdSZWNvcmQpOw0KLSAgICByZXR1cm4gcE5ld1JlY29yZDsNCisgICAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IHBQYWdlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIGlmICghYkNyZWF0ZU5ldykgew0KKyAgICAgIGlmIChwUGFnZVNldCA9PSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KSB7DQorICAgICAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCA9IG1fcFBhZ2VTZXRDdXJSb290Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFyZW50TGF5b3V0SXRlbSA9DQorICAgICAgICAgICAgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBQYWdlU2V0LT5HZXRVc2VyRGF0YSgNCisgICAgICAgICAgICAgICAgWEZBX0xBWU9VVElURU1LRVkpOw0KKyAgICAgICAgaWYgKHBQYXJlbnRMYXlvdXRJdGVtID09IE5VTEwpIHsNCisgICAgICAgICAgcFBhcmVudExheW91dEl0ZW0gPSBtX3BQYWdlU2V0Q3VyUm9vdDsNCisgICAgICAgIH0NCisgICAgICAgIHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ID0gcFBhcmVudExheW91dEl0ZW07DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRQYWdlU2V0TGF5b3V0ID0gTlVMTDsNCisgICAgICBpZiAocFBhZ2VTZXQgPT0gR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyUGFnZVNldC0+bV9wRm9ybU5vZGUpIHsNCisgICAgICAgIHBQYXJlbnRQYWdlU2V0TGF5b3V0ID0NCisgICAgICAgICAgICAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpDQorICAgICAgICAgICAgICAgIC0+cEN1clBhZ2VTZXQtPm1fcFBhcmVudDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcFBhcmVudFBhZ2VTZXRMYXlvdXQgPQ0KKyAgICAgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUGFnZVNldC0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9QYXJlbnQpDQorICAgICAgICAgICAgICAgIC0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOw0KKyAgICAgIH0NCisgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZVNldExheW91dEl0ZW0gPQ0KKyAgICAgICAgICBGWF9ORVcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbChwUGFnZVNldCk7DQorICAgICAgcFBhZ2VTZXQtPlNldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZLCAodm9pZCopcFBhZ2VTZXRMYXlvdXRJdGVtKTsNCisgICAgICBpZiAocFBhcmVudFBhZ2VTZXRMYXlvdXQgPT0gTlVMTCkgew0KKyAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFByZVBhZ2VTZXQgPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQorICAgICAgICB3aGlsZSAocFByZVBhZ2VTZXQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgICAgIHBQcmVQYWdlU2V0ID0NCisgICAgICAgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUHJlUGFnZVNldC0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICB9DQorICAgICAgICBwUHJlUGFnZVNldC0+bV9wTmV4dFNpYmxpbmcgPSBwUGFnZVNldExheW91dEl0ZW07DQorICAgICAgICBtX3BQYWdlU2V0Q3VyUm9vdCA9IHBQYWdlU2V0TGF5b3V0SXRlbTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcFBhcmVudFBhZ2VTZXRMYXlvdXQtPkFkZENoaWxkKHBQYWdlU2V0TGF5b3V0SXRlbSk7DQorICAgICAgfQ0KKyAgICAgIHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ID0gcFBhZ2VTZXRMYXlvdXRJdGVtOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAocFBhZ2VOb2RlKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IHBQYWdlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgaWYgKHBQYWdlU2V0ID09IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QpIHsNCisgICAgICAgIHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZVNldExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgIEZYX05FVyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKHBQYWdlU2V0KTsNCisgICAgICAgIHBQYWdlU2V0LT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwgKHZvaWQqKXBQYWdlU2V0TGF5b3V0SXRlbSk7DQorICAgICAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QtPkFkZENoaWxkKHBQYWdlU2V0TGF5b3V0SXRlbSk7DQorICAgICAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCA9IHBQYWdlU2V0TGF5b3V0SXRlbTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgcE5ld1JlY29yZC0+cEN1clBhZ2VTZXQgPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQorICAgIH0NCisgIH0NCisgIG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5BZGRUYWlsKHBOZXdSZWNvcmQpOw0KKyAgcmV0dXJuIHBOZXdSZWNvcmQ7DQogfQ0KLXZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpBZGRQYWdlQXJlYUxheW91dEl0ZW0oQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsIENYRkFfTm9kZSogcE5ld1BhZ2VBcmVhKQ0KLXsNCi0gICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcE5ld1BhZ2VBcmVhTGF5b3V0SXRlbSA9IE5VTEw7DQotICAgIGlmIChtX1BhZ2VBcnJheS5HZXRTaXplKCkgPiBtX25BdmFpbFBhZ2VzKSB7DQotICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ29udGFpbmVySXRlbSA9IG1fUGFnZUFycmF5W21fbkF2YWlsUGFnZXNdOw0KLSAgICAgICAgcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlID0gcE5ld1BhZ2VBcmVhOw0KLSAgICAgICAgbV9uQXZhaWxQYWdlcysrOw0KLSAgICAgICAgcE5ld1BhZ2VBcmVhTGF5b3V0SXRlbSA9IHBDb250YWluZXJJdGVtOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBwTmV3UGFnZUFyZWEtPkdldERvY3VtZW50KCktPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDb250YWluZXJJdGVtID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBOb3RpZnktPk9uQ3JlYXRlTGF5b3V0SXRlbShwTmV3UGFnZUFyZWEpOw0KLSAgICAgICAgbV9QYWdlQXJyYXkuQWRkKHBDb250YWluZXJJdGVtKTsNCi0gICAgICAgIG1fbkF2YWlsUGFnZXMrKzsNCi0gICAgICAgIHBOb3RpZnktPk9uUGFnZUV2ZW50KChJWEZBX0xheW91dFBhZ2UqKXBDb250YWluZXJJdGVtLCBYRkFfUEFHRUVWRU5UX1BhZ2VBZGRlZCwgKHZvaWQqKSh1aW50cHRyX3QpbV9uQXZhaWxQYWdlcyk7DQotICAgICAgICBwTmV3UGFnZUFyZWFMYXlvdXRJdGVtID0gcENvbnRhaW5lckl0ZW07DQotICAgIH0NCi0gICAgcE5ld1JlY29yZC0+cEN1clBhZ2VTZXQtPkFkZENoaWxkKHBOZXdQYWdlQXJlYUxheW91dEl0ZW0pOw0KLSAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZUFyZWEgPSBwTmV3UGFnZUFyZWFMYXlvdXRJdGVtOw0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpBZGRQYWdlQXJlYUxheW91dEl0ZW0oQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdQYWdlQXJlYSkgew0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcE5ld1BhZ2VBcmVhTGF5b3V0SXRlbSA9IE5VTEw7DQorICBpZiAobV9QYWdlQXJyYXkuR2V0U2l6ZSgpID4gbV9uQXZhaWxQYWdlcykgew0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ29udGFpbmVySXRlbSA9IG1fUGFnZUFycmF5W21fbkF2YWlsUGFnZXNdOw0KKyAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUgPSBwTmV3UGFnZUFyZWE7DQorICAgIG1fbkF2YWlsUGFnZXMrKzsNCisgICAgcE5ld1BhZ2VBcmVhTGF5b3V0SXRlbSA9IHBDb250YWluZXJJdGVtOw0KKyAgfSBlbHNlIHsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPQ0KKyAgICAgICAgcE5ld1BhZ2VBcmVhLT5HZXREb2N1bWVudCgpLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDb250YWluZXJJdGVtID0NCisgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwTm90aWZ5LT5PbkNyZWF0ZUxheW91dEl0ZW0oDQorICAgICAgICAgICAgcE5ld1BhZ2VBcmVhKTsNCisgICAgbV9QYWdlQXJyYXkuQWRkKHBDb250YWluZXJJdGVtKTsNCisgICAgbV9uQXZhaWxQYWdlcysrOw0KKyAgICBwTm90aWZ5LT5PblBhZ2VFdmVudCgoSVhGQV9MYXlvdXRQYWdlKilwQ29udGFpbmVySXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BBR0VFVkVOVF9QYWdlQWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikodWludHB0cl90KW1fbkF2YWlsUGFnZXMpOw0KKyAgICBwTmV3UGFnZUFyZWFMYXlvdXRJdGVtID0gcENvbnRhaW5lckl0ZW07DQorICB9DQorICBwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldC0+QWRkQ2hpbGQocE5ld1BhZ2VBcmVhTGF5b3V0SXRlbSk7DQorICBwTmV3UmVjb3JkLT5wQ3VyUGFnZUFyZWEgPSBwTmV3UGFnZUFyZWFMYXlvdXRJdGVtOw0KKyAgcE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhID0gTlVMTDsNCit9DQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OkFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbSgNCisgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsDQorICAgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhKSB7DQorICBpZiAocENvbnRlbnRBcmVhID09IE5VTEwpIHsNCiAgICAgcE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhID0gTlVMTDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcE5ld0NvbnRlbnRBcmVhTGF5b3V0SXRlbSA9DQorICAgICAgRlhfTkVXIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwocENvbnRlbnRBcmVhKTsNCisgIEFTU0VSVChwTmV3UmVjb3JkLT5wQ3VyUGFnZUFyZWEpOw0KKyAgcE5ld1JlY29yZC0+cEN1clBhZ2VBcmVhLT5BZGRDaGlsZChwTmV3Q29udGVudEFyZWFMYXlvdXRJdGVtKTsNCisgIHBOZXdSZWNvcmQtPnBDdXJDb250ZW50QXJlYSA9IHBOZXdDb250ZW50QXJlYUxheW91dEl0ZW07DQogfQ0KLXZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpBZGRDb250ZW50QXJlYUxheW91dEl0ZW0oQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsIENYRkFfTm9kZSogcENvbnRlbnRBcmVhKQ0KLXsNCi0gICAgaWYocENvbnRlbnRBcmVhID09IE5VTEwpIHsNCi0gICAgICAgIHBOZXdSZWNvcmQtPnBDdXJDb250ZW50QXJlYSA9IE5VTEw7DQotICAgICAgICByZXR1cm47DQorY2xhc3MgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1BhZ2VTZXRDb250YWluZXJMYXlvdXRJdGVtIHsNCisgcHVibGljOg0KKyAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBHZXRGaXJzdENoaWxkKA0KKyAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKSB7DQorICAgIGlmIChwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSA9DQorICAgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICB3aGlsZSAocENoaWxkSXRlbSAmJg0KKyAgICAgICAgICAgICBwQ2hpbGRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICAgIHBDaGlsZEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBwQ2hpbGRJdGVtOw0KICAgICB9DQotICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBOZXdDb250ZW50QXJlYUxheW91dEl0ZW0gPSBGWF9ORVcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbChwQ29udGVudEFyZWEpOw0KLSAgICBBU1NFUlQocE5ld1JlY29yZC0+cEN1clBhZ2VBcmVhKTsNCi0gICAgcE5ld1JlY29yZC0+cEN1clBhZ2VBcmVhLT5BZGRDaGlsZChwTmV3Q29udGVudEFyZWFMYXlvdXRJdGVtKTsNCi0gICAgcE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhID0gcE5ld0NvbnRlbnRBcmVhTGF5b3V0SXRlbTsNCi19DQotY2xhc3MgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1BhZ2VTZXRDb250YWluZXJMYXlvdXRJdGVtDQotew0KLXB1YmxpYzoNCi0gICAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBHZXRGaXJzdENoaWxkKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KLSAgICB7DQotICAgICAgICBpZihwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQotICAgICAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCi0gICAgICAgICAgICB3aGlsZShwQ2hpbGRJdGVtICYmIHBDaGlsZEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KLSAgICAgICAgICAgICAgICBwQ2hpbGRJdGVtID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gcENoaWxkSXRlbTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBOVUxMOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogR2V0TmV4dFNpYmxpbmcoDQorICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0pIHsNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcENoaWxkSXRlbSA9DQorICAgICAgICAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICB3aGlsZSAocENoaWxkSXRlbSAmJg0KKyAgICAgICAgICAgcENoaWxkSXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgcENoaWxkSXRlbSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZzsNCiAgICAgfQ0KLSAgICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldE5leHRTaWJsaW5nKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KLSAgICB7DQotICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ2hpbGRJdGVtID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCi0gICAgICAgIHdoaWxlKHBDaGlsZEl0ZW0gJiYgcENoaWxkSXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQotICAgICAgICAgICAgcENoaWxkSXRlbSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwQ2hpbGRJdGVtOw0KLSAgICB9DQotICAgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogR2V0UGFyZW50KENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7DQotICAgIH0NCisgICAgcmV0dXJuIHBDaGlsZEl0ZW07DQorICB9DQorICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIEdldFBhcmVudCgNCisgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSkgew0KKyAgICByZXR1cm4gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7DQorICB9DQogfTsNCi12b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6RmluaXNoUGFnaW5hdGVkUGFnZVNldHMoKQ0KLXsNCi0gICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFJvb3RQYWdlU2V0TGF5b3V0SXRlbSA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCi0gICAgZm9yICg7IHBSb290UGFnZVNldExheW91dEl0ZW07IHBSb290UGFnZVNldExheW91dEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFJvb3RQYWdlU2V0TGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCi0gICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1BhZ2VTZXRDb250YWluZXJMYXlvdXRJdGVtPiBzSXRlcmF0b3IocFJvb3RQYWdlU2V0TGF5b3V0SXRlbSk7DQotICAgICAgICBmb3IoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCAqcFBhZ2VTZXRMYXlvdXRJdGVtID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcFBhZ2VTZXRMYXlvdXRJdGVtOyBwUGFnZVNldExheW91dEl0ZW0gPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVBhZ2VSZWxhdGlvbiA9IHBQYWdlU2V0TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9SZWxhdGlvbik7DQotICAgICAgICAgICAgc3dpdGNoKGVQYWdlUmVsYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZToNCi0gICAgICAgICAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NMYXN0UGFnZVNldCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxleFBhZ2luYXRlZDoNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EdXBsZXhQYWdpbmF0ZWQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbSA9IE5VTEw7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUGFnZUFyZWFDb3VudCA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKENYRkFfTGF5b3V0SXRlbUltcGwqIHBQYWdlQXJlYUxheW91dEl0ZW0gPSBwUGFnZVNldExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7IHBQYWdlQXJlYUxheW91dEl0ZW07IHBQYWdlQXJlYUxheW91dEl0ZW0gPSBwUGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwUGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGFnZUFyZWFDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbSA9IHBQYWdlQXJlYUxheW91dEl0ZW07DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9TaW1wbGV4RHVwbGV4KHBQYWdlU2V0TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUsIE5VTEwsIE5VTEwsIE5VTEwsIFRSVUUsIFRSVUUsIG5QYWdlQXJlYUNvdW50ID09IDEgPyBYRkFfQVRUUklCVVRFRU5VTV9Pbmx5IDogWEZBX0FUVFJJQlVURUVOVU1fTGFzdCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChuUGFnZUFyZWFDb3VudCA9PSAxICYmICFGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9TaW1wbGV4RHVwbGV4KHBQYWdlU2V0TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUsIE5VTEwsIE5VTEwsIE5VTEwsIFRSVUUsIFRSVUUsIFhGQV9BVFRSSUJVVEVFTlVNX0xhc3QpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwTm9kZSA9IG1fcEN1clBhZ2VBcmVhOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVDdXJDaG9pY2UgPSBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZUN1ckNob2ljZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9MYXN0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVPZGRPckV2ZW4gPSBYRkFfQVRUUklCVVRFRU5VTV9Bbnk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLCBlT2RkT3JFdmVuKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUxhc3RDaG9pY2UgPSBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZUxhc3RDaG9pY2UgPT0gWEZBX0FUVFJJQlVURUVOVU1fRmlyc3QgJiYgKGVQYWdlUmVsYXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxleFBhZ2luYXRlZCB8fCBlT2RkT3JFdmVuICE9IFhGQV9BVFRSSUJVVEVFTlVNX09kZCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwUmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocFJlY29yZCwgcE5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzYWJsZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+IHJnVXNlZEhlaWdodHM7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKENYRkFfTGF5b3V0SXRlbUltcGwqIHBDaGlsZExheW91dEl0ZW0gPSBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsgcENoaWxkTGF5b3V0SXRlbTsgcENoaWxkTGF5b3V0SXRlbSA9IHBDaGlsZExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDaGlsZExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZVc2VkSGVpZ2h0ID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKENYRkFfTGF5b3V0SXRlbUltcGwqIHBDb250ZW50Q2hpbGRMYXlvdXRJdGVtID0gcENoaWxkTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsgcENvbnRlbnRDaGlsZExheW91dEl0ZW07IHBDb250ZW50Q2hpbGRMYXlvdXRJdGVtID0gcENvbnRlbnRDaGlsZExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcENvbnRlbnRDaGlsZExheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlVzZWRIZWlnaHQgKz0gKChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcENvbnRlbnRDaGlsZExheW91dEl0ZW0pLT5tX3NTaXplLnk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdVc2VkSGVpZ2h0cy5BZGQoZlVzZWRIZWlnaHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDdXJDb250ZW50QXJlYUluZGV4ID0gLTE7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKENYRkFfTm9kZSogcENvbnRlbnRBcmVhTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDb250ZW50QXJlYU5vZGU7IHBDb250ZW50QXJlYU5vZGUgPSBwQ29udGVudEFyZWFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZW50QXJlYU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaUN1ckNvbnRlbnRBcmVhSW5kZXgrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmdVc2VkSGVpZ2h0c1tpQ3VyQ29udGVudEFyZWFJbmRleF0gPiBwQ29udGVudEFyZWFOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCkuVG9Vbml0KFhGQV9VTklUX1B0KSArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVXNhYmxlID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihiVXNhYmxlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBDaGlsZExheW91dEl0ZW0gPSBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWFOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExhc3RQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlID0gcE5vZGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKHBDaGlsZExheW91dEl0ZW0gJiYgcENvbnRlbnRBcmVhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocENoaWxkTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGlsZExheW91dEl0ZW0gPSBwQ2hpbGRMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZW50QXJlYU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUgPSBwQ29udGVudEFyZWFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUgPSBwQ29udGVudEFyZWFOb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbSA9IHBDaGlsZExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRlbnRBcmVhTm9kZSA9IHBDb250ZW50QXJlYU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYocE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24pID09IFhGQV9BVFRSSUJVVEVFTlVNX0xhc3QpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBSZWNvcmQsIHBOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6RmluaXNoUGFnaW5hdGVkUGFnZVNldHMoKSB7DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUm9vdFBhZ2VTZXRMYXlvdXRJdGVtID0NCisgICAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQorICBmb3IgKDsgcFJvb3RQYWdlU2V0TGF5b3V0SXRlbTsNCisgICAgICAgcFJvb3RQYWdlU2V0TGF5b3V0SXRlbSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUm9vdFBhZ2VTZXRMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1BhZ2VTZXRDb250YWluZXJMYXlvdXRJdGVtPg0KKyAgICAgICAgc0l0ZXJhdG9yKHBSb290UGFnZVNldExheW91dEl0ZW0pOw0KKyAgICBmb3IgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYWdlU2V0TGF5b3V0SXRlbSA9DQorICAgICAgICAgICAgIHNJdGVyYXRvci5HZXRDdXJyZW50KCk7DQorICAgICAgICAgcFBhZ2VTZXRMYXlvdXRJdGVtOyBwUGFnZVNldExheW91dEl0ZW0gPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVBhZ2VSZWxhdGlvbiA9DQorICAgICAgICAgIHBQYWdlU2V0TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9SZWxhdGlvbik7DQorICAgICAgc3dpdGNoIChlUGFnZVJlbGF0aW9uKSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlOg0KKyAgICAgICAgZGVmYXVsdDogeyBQcm9jZXNzTGFzdFBhZ2VTZXQoKTsgfSBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxleFBhZ2luYXRlZDoNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRHVwbGV4UGFnaW5hdGVkOiB7DQorICAgICAgICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBMYXN0UGFnZUFyZWFMYXlvdXRJdGVtID0gTlVMTDsNCisgICAgICAgICAgaW50MzJfdCBuUGFnZUFyZWFDb3VudCA9IDA7DQorICAgICAgICAgIGZvciAoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcFBhZ2VBcmVhTGF5b3V0SXRlbSA9DQorICAgICAgICAgICAgICAgICAgIHBQYWdlU2V0TGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICAgICAgICBwUGFnZUFyZWFMYXlvdXRJdGVtOw0KKyAgICAgICAgICAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0gPSBwUGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgIGlmIChwUGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9DQorICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQotaW50MzJfdCBDWEZBX0xheW91dFBhZ2VNZ3I6OkdldFBhZ2VDb3VudCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9QYWdlQXJyYXkuR2V0U2l6ZSgpOw0KLX0NCi1JWEZBX0xheW91dFBhZ2UqIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0UGFnZShpbnQzMl90IGluZGV4KSBjb25zdA0KLXsNCi0gICAgaWYgKG1fUGFnZUFycmF5LkdldFNpemUoKSA+IGluZGV4KSB7DQotICAgICAgICByZXR1cm4gKElYRkFfTGF5b3V0UGFnZSopbV9QYWdlQXJyYXlbaW5kZXhdOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1pbnQzMl90IENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0UGFnZUluZGV4KElYRkFfTGF5b3V0UGFnZSogcFBhZ2UpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9QYWdlQXJyYXkuRmluZCgoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFBhZ2UpOw0KLX0NCi1GWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6UnVuQnJlYWsoWEZBX0VMRU1FTlQgZUJyZWFrVHlwZSwgWEZBX0FUVFJJQlVURUVOVU0gZVRhcmdldFR5cGUsIENYRkFfTm9kZSogcFRhcmdldCwgRlhfQk9PTCBiU3RhcnROZXcpDQotew0KLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCi0gICAgc3dpdGNoKGVUYXJnZXRUeXBlKSB7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOg0KLSAgICAgICAgICAgIGlmIChwVGFyZ2V0ICYmIHBUYXJnZXQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KLSAgICAgICAgICAgICAgICBwVGFyZ2V0ID0gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCFwVGFyZ2V0IHx8ICFtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkIHx8IHBUYXJnZXQgIT0gR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyQ29udGVudEFyZWEtPm1fcEZvcm1Ob2RlIHx8IGJTdGFydE5ldykgew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYWdlQXJlYSA9IE5VTEw7DQotICAgICAgICAgICAgICAgIGlmKHBUYXJnZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBQYWdlQXJlYSA9IHBUYXJnZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBQYWdlQXJlYSA9IEdldE5leHRBdmFpbFBhZ2VBcmVhKHBQYWdlQXJlYSwgcFRhcmdldCk7DQotICAgICAgICAgICAgICAgIGJSZXQgPSBwUGFnZUFyZWEgIT0gTlVMTDsNCi0gICAgICAgICAgICB9DQorICAgICAgICAgICAgblBhZ2VBcmVhQ291bnQrKzsNCisgICAgICAgICAgICBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbSA9IHBQYWdlQXJlYUxheW91dEl0ZW07DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCFwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbSkgew0KICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYToNCi0gICAgICAgICAgICBpZiAocFRhcmdldCAmJiBwVGFyZ2V0LT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCi0gICAgICAgICAgICAgICAgcFRhcmdldCA9IE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghcFRhcmdldCB8fCAhbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCB8fCBwVGFyZ2V0ICE9IEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1clBhZ2VBcmVhLT5tX3BGb3JtTm9kZSB8fCBiU3RhcnROZXcpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFnZUFyZWEgPSBHZXROZXh0QXZhaWxQYWdlQXJlYShwVGFyZ2V0LCBOVUxMLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgYlJldCA9IHBQYWdlQXJlYSAhPSBOVUxMOw0KLSAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoIUZpbmRQYWdlQXJlYUZyb21QYWdlU2V0X1NpbXBsZXhEdXBsZXgoDQorICAgICAgICAgICAgICAgICAgcFBhZ2VTZXRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSwgTlVMTCwgTlVMTCwgTlVMTCwgVFJVRSwgVFJVRSwNCisgICAgICAgICAgICAgICAgICBuUGFnZUFyZWFDb3VudCA9PSAxID8gWEZBX0FUVFJJQlVURUVOVU1fT25seQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfQVRUUklCVVRFRU5VTV9MYXN0KSAmJg0KKyAgICAgICAgICAgICAgKG5QYWdlQXJlYUNvdW50ID09IDEgJiYNCisgICAgICAgICAgICAgICAhRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleCgNCisgICAgICAgICAgICAgICAgICAgcFBhZ2VTZXRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSwgTlVMTCwgTlVMTCwgTlVMTCwgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgVFJVRSwgWEZBX0FUVFJJQlVURUVOVU1fTGFzdCkpKSB7DQogICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VPZGQ6DQotICAgICAgICAgICAgaWYgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQotICAgICAgICAgICAgICAgIHBUYXJnZXQgPSBOVUxMOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BDdXJQYWdlQXJlYTsNCisgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUN1ckNob2ljZSA9DQorICAgICAgICAgICAgICBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbik7DQorICAgICAgICAgIGlmIChlQ3VyQ2hvaWNlID09IFhGQV9BVFRSSUJVVEVFTlVNX0xhc3QpIHsNCisgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlT2RkT3JFdmVuID0gWEZBX0FUVFJJQlVURUVOVU1fQW55Ow0KKyAgICAgICAgICAgIHBOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLCBlT2RkT3JFdmVuKTsNCisgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGFzdENob2ljZSA9DQorICAgICAgICAgICAgICAgIHBMYXN0UGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RW51bSgNCisgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVfUGFnZVBvc2l0aW9uKTsNCisgICAgICAgICAgICBpZiAoZUxhc3RDaG9pY2UgPT0gWEZBX0FUVFJJQlVURUVOVU1fRmlyc3QgJiYNCisgICAgICAgICAgICAgICAgKGVQYWdlUmVsYXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxleFBhZ2luYXRlZCB8fA0KKyAgICAgICAgICAgICAgICAgZU9kZE9yRXZlbiAhPSBYRkFfQVRUUklCVVRFRU5VTV9PZGQpKSB7DQorICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcFJlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KKyAgICAgICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBSZWNvcmQsIHBOb2RlKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAobV9uQXZhaWxQYWdlcyAlIDIgIT0gMSB8fCAhbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCB8fCAocFRhcmdldCAmJiBwVGFyZ2V0ICE9IEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1clBhZ2VBcmVhLT5tX3BGb3JtTm9kZSkgfHwgYlN0YXJ0TmV3KSB7DQotICAgICAgICAgICAgICAgIGlmKG1fbkF2YWlsUGFnZXMgJSAyID09IDEpIHsNCi0gICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX0JPT0wgYlVzYWJsZSA9IFRSVUU7DQorICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiByZ1VzZWRIZWlnaHRzOw0KKyAgICAgICAgICBmb3IgKENYRkFfTGF5b3V0SXRlbUltcGwqIHBDaGlsZExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgICAgICAgICBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICAgICAgICBwQ2hpbGRMYXlvdXRJdGVtOw0KKyAgICAgICAgICAgICAgIHBDaGlsZExheW91dEl0ZW0gPSBwQ2hpbGRMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgIGlmIChwQ2hpbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9DQorICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VFdmVuOg0KLSAgICAgICAgICAgIGlmIChwVGFyZ2V0ICYmIHBUYXJnZXQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KLSAgICAgICAgICAgICAgICBwVGFyZ2V0ID0gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG1fbkF2YWlsUGFnZXMgJSAyICE9IDAgfHwgIW1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgfHwgKHBUYXJnZXQgJiYgcFRhcmdldCAhPSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlQXJlYS0+bV9wRm9ybU5vZGUpICB8fCBiU3RhcnROZXcpIHsNCi0gICAgICAgICAgICAgICAgaWYobV9uQXZhaWxQYWdlcyAlIDIgPT0gMCkgew0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BdXRvOg0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazs7DQotICAgIH0NCi0gICAgcmV0dXJuIGJSZXQ7DQotfQ0KLUZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpFeGVjdXRlQnJlYWtCZWZvcmVPckFmdGVyKENYRkFfTm9kZSogcEN1ck5vZGUsIEZYX0JPT0wgYkJlZm9yZSwgQ1hGQV9Ob2RlKiAmcEJyZWFrTGVhZGVyVGVtcGxhdGUsIENYRkFfTm9kZSogJnBCcmVha1RyYWlsZXJUZW1wbGF0ZSkNCi17DQotICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcEN1ck5vZGUtPkdldENsYXNzSUQoKTsNCi0gICAgc3dpdGNoKGVUeXBlKSB7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlOg0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVha0FmdGVyOiB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0JyZWFrTGVhZGVyLCB3c0JyZWFrVHJhaWxlcjsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBwQ3VyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcENvbnRhaW5lciA9IHBGb3JtTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YXJ0TmV3ID0gcEN1ck5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9TdGFydE5ldykgIT0gMDsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwU2NyaXB0ID0gcEN1ck5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1NjcmlwdCk7DQotICAgICAgICAgICAgICAgIGlmKHBTY3JpcHQgJiYgIVhGQV9MYXlvdXRQYWdlTWdyX1J1bkJyZWFrVGVzdFNjcmlwdChwU2NyaXB0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1RhcmdldCA9IHBDdXJOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1RhcmdldCk7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRhcmdldCA9IFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQobV9wVGVtcGxhdGVQYWdlU2V0Um9vdCwgVFJVRSwgd3NUYXJnZXQpOw0KLSAgICAgICAgICAgICAgICB3c0JyZWFrVHJhaWxlciA9IHBDdXJOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1RyYWlsZXIpOw0KLSAgICAgICAgICAgICAgICB3c0JyZWFrTGVhZGVyID0gcEN1ck5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTGVhZGVyKTsNCi0gICAgICAgICAgICAgICAgcEJyZWFrTGVhZGVyVGVtcGxhdGUgID0gWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBUUlVFLCB3c0JyZWFrTGVhZGVyKTsNCi0gICAgICAgICAgICAgICAgcEJyZWFrVHJhaWxlclRlbXBsYXRlID0gWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBUUlVFLCB3c0JyZWFrVHJhaWxlcik7DQotICAgICAgICAgICAgICAgIGlmKFJ1bkJyZWFrKGVUeXBlLCBwQ3VyTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUpLCBwVGFyZ2V0LCBiU3RhcnROZXcpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRDb3VudCgpID4gMCAmJiBtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkID09IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRIZWFkUG9zaXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBlVHlwZSA9PSBYRkFfRUxFTUVOVF9CcmVha0JlZm9yZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwUGFyZW50Tm9kZSB8fCBwRm9ybU5vZGUgIT0gcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmVudE5vZGUgPSBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXBQYXJlbnROb2RlIHx8IHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRm9ybSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrOiB7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YXJ0TmV3ID0gcEN1ck5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9TdGFydE5ldykgIT0gMDsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVGFyZ2V0ID0gcEN1ck5vZGUtPkdldENEYXRhKGJCZWZvcmUgPyBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCA6IFhGQV9BVFRSSUJVVEVfQWZ0ZXJUYXJnZXQpOw0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUYXJnZXQgPSBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KG1fcFRlbXBsYXRlUGFnZVNldFJvb3QsIFRSVUUsIHdzVGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgaWYoUnVuQnJlYWsoYkJlZm9yZSA/IFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlIDogWEZBX0VMRU1FTlRfQnJlYWtBZnRlciwgcEN1ck5vZGUtPkdldEVudW0oYkJlZm9yZSA/IFhGQV9BVFRSSUJVVEVfQmVmb3JlIDogWEZBX0FUVFJJQlVURV9BZnRlciksIHBUYXJnZXQsIGJTdGFydE5ldykpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9TZXRMYXlvdXRHZW5lcmF0ZWROb2RlRmxhZyhDWEZBX05vZGUqIHBOb2RlKQ0KLXsNCi0gICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0xheW91dEdlbmVyYXRlZE5vZGUsIFRSVUUsIEZBTFNFKTsNCi0gICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFLCBGQUxTRSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpQcm9jZXNzQnJlYWtCZWZvcmVPckFmdGVyKENYRkFfTm9kZSogcEJyZWFrTm9kZSwgRlhfQk9PTCBiQmVmb3JlLCBDWEZBX05vZGUqICZwQnJlYWtMZWFkZXJOb2RlLCBDWEZBX05vZGUqICZwQnJlYWtUcmFpbGVyTm9kZSwgRlhfQk9PTCYgYkNyZWF0ZVBhZ2UpDQotew0KLSAgICBDWEZBX05vZGUgKnBMZWFkZXJUZW1wbGF0ZSA9IE5VTEwsICpwVHJhaWxlclRlbXBsYXRlID0gTlVMTDsNCi0gICAgQ1hGQV9Ob2RlICpwRm9ybU5vZGUgPSBwQnJlYWtOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCi0gICAgaWYoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwRm9ybU5vZGUpKSB7DQotICAgICAgICBiQ3JlYXRlUGFnZSA9IEV4ZWN1dGVCcmVha0JlZm9yZU9yQWZ0ZXIocEJyZWFrTm9kZSwgYkJlZm9yZSwgcExlYWRlclRlbXBsYXRlLCBwVHJhaWxlclRlbXBsYXRlKTsNCi0gICAgICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBCcmVha05vZGUtPkdldERvY3VtZW50KCk7DQotICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUgPSBOVUxMOw0KLSAgICAgICAgcEZvcm1Ob2RlID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCi0gICAgICAgIGlmKHBMZWFkZXJUZW1wbGF0ZSkgew0KLSAgICAgICAgICAgIGlmKCFwRGF0YVNjb3BlKSB7DQotICAgICAgICAgICAgICAgIHBEYXRhU2NvcGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUocEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcEJyZWFrTGVhZGVyTm9kZSA9IHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocExlYWRlclRlbXBsYXRlLCBwRm9ybU5vZGUsIHBEYXRhU2NvcGUsIFRSVUUpOw0KLSAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocEJyZWFrTGVhZGVyTm9kZSk7DQotICAgICAgICAgICAgWEZBX1NldExheW91dEdlbmVyYXRlZE5vZGVGbGFnKHBCcmVha0xlYWRlck5vZGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYocFRyYWlsZXJUZW1wbGF0ZSkgew0KLSAgICAgICAgICAgIGlmKCFwRGF0YVNjb3BlKSB7DQotICAgICAgICAgICAgICAgIHBEYXRhU2NvcGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUocEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcEJyZWFrVHJhaWxlck5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHBUcmFpbGVyVGVtcGxhdGUsIHBGb3JtTm9kZSwgcERhdGFTY29wZSwgVFJVRSk7DQotICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwQnJlYWtUcmFpbGVyTm9kZSk7DQotICAgICAgICAgICAgWEZBX1NldExheW91dEdlbmVyYXRlZE5vZGVGbGFnKHBCcmVha1RyYWlsZXJOb2RlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OlByb2Nlc3NCb29rZW5kTGVhZGVyT3JUcmFpbGVyKENYRkFfTm9kZSogcEJvb2tlbmROb2RlLCBGWF9CT09MIGJMZWFkZXIsIENYRkFfTm9kZSogJnBCb29rZW5kQXBwZW5kTm9kZSkNCi17DQotICAgIENYRkFfTm9kZSogcExlYWRlclRlbXBsYXRlID0gTlVMTDsNCi0gICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBwQm9va2VuZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KLSAgICBpZihSZXNvbHZlQm9va2VuZExlYWRlck9yVHJhaWxlcihwQm9va2VuZE5vZGUsIGJMZWFkZXIsIHBMZWFkZXJUZW1wbGF0ZSkpIHsNCi0gICAgICAgIENYRkFfRG9jdW1lbnQgKnBEb2N1bWVudCA9IHBCb29rZW5kTm9kZS0+R2V0RG9jdW1lbnQoKTsNCi0gICAgICAgIENYRkFfTm9kZSAgICAgKnBEYXRhU2NvcGUgPSBOVUxMOw0KLSAgICAgICAgaWYocExlYWRlclRlbXBsYXRlKSB7DQotICAgICAgICAgICAgaWYoIXBEYXRhU2NvcGUpIHsNCi0gICAgICAgICAgICAgICAgcERhdGFTY29wZSA9IFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZShwRm9ybU5vZGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwQm9va2VuZEFwcGVuZE5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHBMZWFkZXJUZW1wbGF0ZSwgcEZvcm1Ob2RlLCBwRGF0YVNjb3BlLCBUUlVFKTsNCi0gICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHBCb29rZW5kQXBwZW5kTm9kZSk7DQotICAgICAgICAgICAgWEZBX1NldExheW91dEdlbmVyYXRlZE5vZGVGbGFnKHBCb29rZW5kQXBwZW5kTm9kZSk7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfTGF5b3V0UGFnZU1ncjo6QnJlYWtPdmVyZmxvdyhDWEZBX05vZGUqIHBPdmVyZmxvd05vZGUsIENYRkFfTm9kZSomIHBMZWFkZXJUZW1wbGF0ZSwgQ1hGQV9Ob2RlKiYgcFRyYWlsZXJUZW1wbGF0ZSwgRlhfQk9PTCBiQ3JlYXRlUGFnZSApDQotew0KLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd0xlYWRlciwgd3NPdmVyZmxvd1RyYWlsZXI7DQotICAgIENYRkFfTm9kZSAqcENvbnRhaW5lciA9IHBPdmVyZmxvd05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCi0gICAgaWYocE92ZXJmbG93Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0JyZWFrKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd0xlYWRlcjsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93VGFyZ2V0Ow0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dUcmFpbGVyOw0KLSAgICAgICAgcE92ZXJmbG93Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9PdmVyZmxvd0xlYWRlciwgd3NPdmVyZmxvd0xlYWRlcik7DQotICAgICAgICBwT3ZlcmZsb3dOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93VHJhaWxlciwgd3NPdmVyZmxvd1RyYWlsZXIpOw0KLSAgICAgICAgcE92ZXJmbG93Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwgd3NPdmVyZmxvd1RhcmdldCk7DQotICAgICAgICBpZiAoIXdzT3ZlcmZsb3dMZWFkZXIuSXNFbXB0eSgpIHx8ICF3c092ZXJmbG93VHJhaWxlci5Jc0VtcHR5KCkgfHwgIXdzT3ZlcmZsb3dUYXJnZXQuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgaWYoIXdzT3ZlcmZsb3dUYXJnZXQuSXNFbXB0eSgpICYmIGJDcmVhdGVQYWdlICYmICFtX2JDcmVhdGVPdmVyRmxvd1BhZ2UpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0ID0gWEZBX1Jlc29sdmVCcmVha1RhcmdldCh0aGlzLT5tX3BUZW1wbGF0ZVBhZ2VTZXRSb290LCBUUlVFLCB3c092ZXJmbG93VGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgaWYocFRhcmdldCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9iQ3JlYXRlT3ZlckZsb3dQYWdlID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChwVGFyZ2V0LT5HZXRDbGFzc0lEKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1BhZ2VBcmVhOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5CcmVhayhYRkFfRUxFTUVOVF9PdmVyZmxvdywgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEsIHBUYXJnZXQsIFRSVUUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5CcmVhayhYRkFfRUxFTUVOVF9PdmVyZmxvdywgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEsIHBUYXJnZXQsIFRSVUUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZighYkNyZWF0ZVBhZ2UpIHsNCi0gICAgICAgICAgICAgICAgcExlYWRlclRlbXBsYXRlICA9IFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgVFJVRSwgd3NPdmVyZmxvd0xlYWRlcik7DQotICAgICAgICAgICAgICAgIHBUcmFpbGVyVGVtcGxhdGUgPSBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIFRSVUUsIHdzT3ZlcmZsb3dUcmFpbGVyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHBPdmVyZmxvd05vZGU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfSBlbHNlIGlmKHBPdmVyZmxvd05vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9PdmVyZmxvdykgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dUYXJnZXQ7DQotICAgICAgICBwT3ZlcmZsb3dOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0xlYWRlciwgd3NPdmVyZmxvd0xlYWRlcik7DQotICAgICAgICBwT3ZlcmZsb3dOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1RyYWlsZXIsIHdzT3ZlcmZsb3dUcmFpbGVyKTsNCi0gICAgICAgIHBPdmVyZmxvd05vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCB3c092ZXJmbG93VGFyZ2V0KTsNCi0gICAgICAgIGlmKCF3c092ZXJmbG93VGFyZ2V0LklzRW1wdHkoKSAmJiBiQ3JlYXRlUGFnZSAmJiAhbV9iQ3JlYXRlT3ZlckZsb3dQYWdlKSB7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0ID0gWEZBX1Jlc29sdmVCcmVha1RhcmdldCh0aGlzLT5tX3BUZW1wbGF0ZVBhZ2VTZXRSb290LCBUUlVFLCB3c092ZXJmbG93VGFyZ2V0KTsNCi0gICAgICAgICAgICBpZihwVGFyZ2V0KSB7DQotICAgICAgICAgICAgICAgIG1fYkNyZWF0ZU92ZXJGbG93UGFnZSA9IFRSVUU7DQotICAgICAgICAgICAgICAgIHN3aXRjaChwVGFyZ2V0LT5HZXRDbGFzc0lEKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6DQotICAgICAgICAgICAgICAgICAgICAgICAgUnVuQnJlYWsoWEZBX0VMRU1FTlRfT3ZlcmZsb3csIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhLCBwVGFyZ2V0LCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ29udGVudEFyZWE6DQotICAgICAgICAgICAgICAgICAgICAgICAgUnVuQnJlYWsoWEZBX0VMRU1FTlRfT3ZlcmZsb3csIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhLCBwVGFyZ2V0LCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZighYkNyZWF0ZVBhZ2UpIHsNCi0gICAgICAgICAgICBwTGVhZGVyVGVtcGxhdGUgID0gWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBUUlVFLCB3c092ZXJmbG93TGVhZGVyKTsNCi0gICAgICAgICAgICBwVHJhaWxlclRlbXBsYXRlID0gWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBUUlVFLCB3c092ZXJmbG93VHJhaWxlcik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcE92ZXJmbG93Tm9kZTsNCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OlByb2Nlc3NPdmVyZmxvdyhDWEZBX05vZGUqIHBGb3JtTm9kZSwgQ1hGQV9Ob2RlKiAmcExlYWRlck5vZGUsIENYRkFfTm9kZSogJnBUcmFpbGVyTm9kZSwgIEZYX0JPT0wgYkRhdGFNZXJnZSwgRlhfQk9PTCBiQ3JlYXRlUGFnZSkNCi17DQotICAgIGlmKHBGb3JtTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlICpwTGVhZGVyVGVtcGxhdGUgPSBOVUxMLCAqcFRyYWlsZXJUZW1wbGF0ZSA9IE5VTEw7DQotICAgIEZYX0JPT0wgYklzT3ZlcmZsb3dOb2RlID0gRkFMU0U7DQotICAgIGlmKHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX092ZXJmbG93IHx8IHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0JyZWFrKQl7DQotICAgICAgICBiSXNPdmVyZmxvd05vZGUgPSBUUlVFOw0KLSAgICB9DQotICAgIGZvcihDWEZBX05vZGUqIHBDdXJOb2RlID0gYklzT3ZlcmZsb3dOb2RlID8gcEZvcm1Ob2RlIDogcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDdXJOb2RlOyBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5HZXROb2RlSXRlbSgoWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkpIHsNCi0gICAgICAgIGlmKEJyZWFrT3ZlcmZsb3cocEN1ck5vZGUsIHBMZWFkZXJUZW1wbGF0ZSwgcFRyYWlsZXJUZW1wbGF0ZSwgYkNyZWF0ZVBhZ2UpKSB7DQotICAgICAgICAgICAgaWYoYklzT3ZlcmZsb3dOb2RlKSB7DQotICAgICAgICAgICAgICAgIHBGb3JtTm9kZSA9IHBDdXJOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCAqcERvY3VtZW50ID0gcEN1ck5vZGUtPkdldERvY3VtZW50KCk7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlICAgICAqcERhdGFTY29wZSA9IE5VTEw7DQotICAgICAgICAgICAgaWYocExlYWRlclRlbXBsYXRlKSB7DQotICAgICAgICAgICAgICAgIGlmKCFwRGF0YVNjb3BlKSB7DQotICAgICAgICAgICAgICAgICAgICBwRGF0YVNjb3BlID0gWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVNjb3BlKHBGb3JtTm9kZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcExlYWRlck5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHBMZWFkZXJUZW1wbGF0ZSwgcEZvcm1Ob2RlLCBwRGF0YVNjb3BlLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwTGVhZGVyTm9kZSk7DQotICAgICAgICAgICAgICAgIFhGQV9TZXRMYXlvdXRHZW5lcmF0ZWROb2RlRmxhZyhwTGVhZGVyTm9kZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKHBUcmFpbGVyVGVtcGxhdGUpIHsNCi0gICAgICAgICAgICAgICAgaWYoIXBEYXRhU2NvcGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBEYXRhU2NvcGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUocEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwVHJhaWxlck5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHBUcmFpbGVyVGVtcGxhdGUsIHBGb3JtTm9kZSwgcERhdGFTY29wZSwgVFJVRSk7DQotICAgICAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocFRyYWlsZXJOb2RlKTsNCi0gICAgICAgICAgICAgICAgWEZBX1NldExheW91dEdlbmVyYXRlZE5vZGVGbGFnKHBUcmFpbGVyTm9kZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoYklzT3ZlcmZsb3dOb2RlKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6UmVzb2x2ZUJvb2tlbmRMZWFkZXJPclRyYWlsZXIoQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUsIEZYX0JPT0wgYkxlYWRlciwgQ1hGQV9Ob2RlKiAmcEJvb2tlbmRBcHBlbmRUZW1wbGF0ZSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nQyB3c0Jvb2tlbmRMZWFkZXI7DQotICAgIENYRkFfTm9kZSAqcENvbnRhaW5lciA9IHBCb29rZW5kTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSktPkdldFRlbXBsYXRlTm9kZSgpOw0KLSAgICBpZihwQm9va2VuZE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9CcmVhaykgew0KLSAgICAgICAgcEJvb2tlbmROb2RlLT5UcnlDRGF0YShiTGVhZGVyID8gWEZBX0FUVFJJQlVURV9Cb29rZW5kTGVhZGVyIDogWEZBX0FUVFJJQlVURV9Cb29rZW5kVHJhaWxlciwgd3NCb29rZW5kTGVhZGVyKTsNCi0gICAgICAgIGlmICghd3NCb29rZW5kTGVhZGVyLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIHBCb29rZW5kQXBwZW5kVGVtcGxhdGUgID0gWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBGQUxTRSwgd3NCb29rZW5kTGVhZGVyKTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfSBlbHNlIGlmKHBCb29rZW5kTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Jvb2tlbmQpIHsNCi0gICAgICAgIHBCb29rZW5kTm9kZS0+VHJ5Q0RhdGEoYkxlYWRlciA/IFhGQV9BVFRSSUJVVEVfTGVhZGVyIDogWEZBX0FUVFJJQlVURV9UcmFpbGVyLCB3c0Jvb2tlbmRMZWFkZXIpOw0KLSAgICAgICAgcEJvb2tlbmRBcHBlbmRUZW1wbGF0ZSAgPSBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIFRSVUUsIHdzQm9va2VuZExlYWRlcik7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpGaW5kUGFnZUFyZWFGcm9tUGFnZVNldChDWEZBX05vZGUqIHBQYWdlU2V0LCBDWEZBX05vZGUqIHBTdGFydENoaWxkLCBDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSwgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEsIEZYX0JPT0wgYk5ld1BhZ2UsIEZYX0JPT0wgYlF1ZXJ5KQ0KLXsNCi0gICAgaWYocFBhZ2VTZXQgPT0gTlVMTCAmJiBwU3RhcnRDaGlsZCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaW50MzJfdCBpUGFnZVNldENvdW50ID0gMDsNCi0gICAgaWYoSXNQYWdlU2V0Um9vdE9yZGVyZWRPY2N1cnJlbmNlKCkpIHsNCi0gICAgICAgIHJldHVybiBGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9PcmRlcmVkKHBQYWdlU2V0LCBwU3RhcnRDaGlsZCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnkpOw0KLSAgICB9DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVQcmVmZXJyZWRQb3NpdGlvbiA9IG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPyBYRkFfQVRUUklCVVRFRU5VTV9SZXN0IDogWEZBX0FUVFJJQlVURUVOVU1fRmlyc3Q7DQotICAgIHJldHVybiBGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9TaW1wbGV4RHVwbGV4KHBQYWdlU2V0LCBwU3RhcnRDaGlsZCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnksIGVQcmVmZXJyZWRQb3NpdGlvbik7DQotfQ0KLUZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9PcmRlcmVkKENYRkFfTm9kZSogcFBhZ2VTZXQsIENYRkFfTm9kZSogcFN0YXJ0Q2hpbGQsIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhLCBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSwgRlhfQk9PTCBiTmV3UGFnZSwgRlhfQk9PTCBiUXVlcnkpDQotew0KLSAgICBpbnQzMl90IGlQYWdlU2V0Q291bnQgPSAwOw0KLSAgICBpZighcFN0YXJ0Q2hpbGQgJiYgIWJRdWVyeSkgew0KLSAgICAgICAgbV9wUGFnZVNldE1hcC5Mb29rdXAocFBhZ2VTZXQsIGlQYWdlU2V0Q291bnQpOw0KLSAgICAgICAgaW50MzJfdCBpTWF4ID0gLTE7DQotICAgICAgICBDWEZBX05vZGUqIHBPY2N1ck5vZGUgPSBwUGFnZVNldC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KLSAgICAgICAgaWYocE9jY3VyTm9kZSkgew0KLSAgICAgICAgICAgIHBPY2N1ck5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NYXgsIGlNYXgsIEZBTFNFKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpTWF4ID49IDAgJiYgaU1heCA8PSBpUGFnZVNldENvdW50KSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIEZYX0JPT0wgYlJlcyA9IEZBTFNFOw0KLSAgICBDWEZBX05vZGUgKnBDdXJyZW50Tm9kZSA9IHBTdGFydENoaWxkID8gcFN0YXJ0Q2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykgOiBwUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICBmb3IoOyBwQ3VycmVudE5vZGU7IHBDdXJyZW50Tm9kZSA9IHBDdXJyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgaWYocEN1cnJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCi0gICAgICAgICAgICBpZigocFRhcmdldFBhZ2VBcmVhID09IHBDdXJyZW50Tm9kZSB8fCBwVGFyZ2V0UGFnZUFyZWEgPT0gTlVMTCkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHBDdXJyZW50Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBUYXJnZXRQYWdlQXJlYSA9PSBwQ3VycmVudE5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVNaW5QYWdlUmVjb3JkKHBDdXJyZW50Tm9kZSwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldFBhZ2VBcmVhID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmICghYlF1ZXJ5KSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZChwQ3VycmVudE5vZGUsIHBTdGFydENoaWxkID09IE5VTEwpOw0KLSAgICAgICAgICAgICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJyZW50Tm9kZSk7DQotICAgICAgICAgICAgICAgICAgICBpZihwVGFyZ2V0Q29udGVudEFyZWEgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBUYXJnZXRDb250ZW50QXJlYSA9IHBDdXJyZW50Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBUYXJnZXRDb250ZW50QXJlYSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9wQ3VyUGFnZUFyZWEgPSBwQ3VycmVudE5vZGU7DQotICAgICAgICAgICAgICAgIG1fbkN1clBhZ2VDb3VudCA9IDE7DQotICAgICAgICAgICAgICAgIGJSZXMgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoIWJRdWVyeSkgew0KLSAgICAgICAgICAgICAgICBDcmVhdGVNaW5QYWdlUmVjb3JkKHBDdXJyZW50Tm9kZSwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZihwQ3VycmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQotICAgICAgICAgICAgaWYoRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfT3JkZXJlZChwQ3VycmVudE5vZGUsIE5VTEwsIHBUYXJnZXRQYWdlQXJlYSwgcFRhcmdldENvbnRlbnRBcmVhLCBiTmV3UGFnZSwgYlF1ZXJ5KSkgew0KLSAgICAgICAgICAgICAgICBiUmVzID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKCFiUXVlcnkpIHsNCi0gICAgICAgICAgICAgICAgQ3JlYXRlTWluUGFnZVNldFJlY29yZChwQ3VycmVudE5vZGUsIFRSVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZighcFN0YXJ0Q2hpbGQgJiYgYlJlcyAmJiAhYlF1ZXJ5KSB7DQotICAgICAgICBtX3BQYWdlU2V0TWFwLlNldEF0KHBQYWdlU2V0LCArKyBpUGFnZVNldENvdW50KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gYlJlczsNCi19DQotRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OkZpbmRQYWdlQXJlYUZyb21QYWdlU2V0X1NpbXBsZXhEdXBsZXgoQ1hGQV9Ob2RlKiBwUGFnZVNldCwgQ1hGQV9Ob2RlKiBwU3RhcnRDaGlsZCwgQ1hGQV9Ob2RlKiBwVGFyZ2V0UGFnZUFyZWEsIENYRkFfTm9kZSogcFRhcmdldENvbnRlbnRBcmVhLCBGWF9CT09MIGJOZXdQYWdlLCBGWF9CT09MIGJRdWVyeSwgWEZBX0FUVFJJQlVURUVOVU0gZVByZWZlcnJlZFBvc2l0aW9uKQ0KLXsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUFkdmlzZWRQYWdlUG9zaXRpb24gPSBwVGFyZ2V0UGFnZUFyZWEgPyBwVGFyZ2V0UGFnZUFyZWEtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24pIDogKFhGQV9BVFRSSUJVVEVFTlVNKSAtIDE7DQotICAgIGNvbnN0IFhGQV9BVFRSSUJVVEVFTlVNIGVGYWxsYmFja1Bvc2l0aW9uID0gWEZBX0FUVFJJQlVURUVOVU1fQW55Ow0KLSAgICBDWEZBX05vZGUgKnBQcmVmZXJyZWRQYWdlQXJlYSA9IE5VTEwsICpwRmFsbGJhY2tQYWdlQXJlYSA9IE5VTEw7DQotICAgIENYRkFfTm9kZSogcEN1cnJlbnROb2RlID0gTlVMTDsNCi0gICAgaWYgKCFwU3RhcnRDaGlsZCB8fCBwU3RhcnRDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQotICAgICAgICBwQ3VycmVudE5vZGUgPSBwUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcEN1cnJlbnROb2RlID0gcFN0YXJ0Q2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgIH0NCi0gICAgZm9yKDsgcEN1cnJlbnROb2RlOyBwQ3VycmVudE5vZGUgPSBwQ3VycmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgIGlmKHBDdXJyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQotICAgICAgICAgICAgaWYoIU1hdGNoUGFnZUFyZWFPZGRPckV2ZW4ocEN1cnJlbnROb2RlLCBGQUxTRSkpIHsNCisgICAgICAgICAgICBGWF9GTE9BVCBmVXNlZEhlaWdodCA9IDA7DQorICAgICAgICAgICAgZm9yIChDWEZBX0xheW91dEl0ZW1JbXBsKiBwQ29udGVudENoaWxkTGF5b3V0SXRlbSA9DQorICAgICAgICAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICAgICAgICAgIHBDb250ZW50Q2hpbGRMYXlvdXRJdGVtOw0KKyAgICAgICAgICAgICAgICAgcENvbnRlbnRDaGlsZExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgICAgICAgICAgIHBDb250ZW50Q2hpbGRMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgICAgaWYgKCFwQ29udGVudENoaWxkTGF5b3V0SXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgZlVzZWRIZWlnaHQgKz0NCisgICAgICAgICAgICAgICAgICAoKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwQ29udGVudENoaWxkTGF5b3V0SXRlbSkNCisgICAgICAgICAgICAgICAgICAgICAgLT5tX3NTaXplLnk7DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVDdXJQYWdlUG9zaXRpb24gPSBwQ3VycmVudE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24pOw0KLSAgICAgICAgICAgIGlmKGVQcmVmZXJyZWRQb3NpdGlvbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9MYXN0KSB7DQotICAgICAgICAgICAgICAgIGlmIChlQ3VyUGFnZVBvc2l0aW9uICE9IGVQcmVmZXJyZWRQb3NpdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKG1fZVBhZ2VTZXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX1NpbXBsZXhQYWdpbmF0ZWQgfHwgcEN1cnJlbnROb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9BbnkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBQcmVmZXJyZWRQYWdlQXJlYSA9IHBDdXJyZW50Tm9kZTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7DQotICAgICAgICAgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VycmVudE5vZGUpOw0KLSAgICAgICAgICAgICAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcEN1cnJlbnROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkpOw0KLSAgICAgICAgICAgICAgICBwUHJlZmVycmVkUGFnZUFyZWEgPSBwQ3VycmVudE5vZGU7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYoZVByZWZlcnJlZFBvc2l0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX09ubHkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGVDdXJQYWdlUG9zaXRpb24gIT0gZVByZWZlcnJlZFBvc2l0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAobV9lUGFnZVNldE1vZGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fRHVwbGV4UGFnaW5hdGVkIHx8IHBDdXJyZW50Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX09kZE9yRXZlbikgPT0gWEZBX0FUVFJJQlVURUVOVU1fQW55KSB7DQotICAgICAgICAgICAgICAgICAgICBwUHJlZmVycmVkUGFnZUFyZWEgPSBwQ3VycmVudE5vZGU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgcmdVc2VkSGVpZ2h0cy5BZGQoZlVzZWRIZWlnaHQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludDMyX3QgaUN1ckNvbnRlbnRBcmVhSW5kZXggPSAtMTsNCisgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDb250ZW50QXJlYU5vZGUgPQ0KKyAgICAgICAgICAgICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGU7DQorICAgICAgICAgICAgICAgcENvbnRlbnRBcmVhTm9kZSA9DQorICAgICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBpZiAocENvbnRlbnRBcmVhTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoKHBUYXJnZXRQYWdlQXJlYSA9PSBwQ3VycmVudE5vZGUgfHwgcFRhcmdldFBhZ2VBcmVhID09IE5VTEwpKSB7DQotICAgICAgICAgICAgICAgIGlmIChwQ3VycmVudE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBpZihwVGFyZ2V0UGFnZUFyZWEgPT0gcEN1cnJlbnROb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcEN1cnJlbnROb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0UGFnZUFyZWEgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYoKGVQcmVmZXJyZWRQb3NpdGlvbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9SZXN0ICYmIGVDdXJQYWdlUG9zaXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQW55KSB8fCBlQ3VyUGFnZVBvc2l0aW9uID09IGVQcmVmZXJyZWRQb3NpdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgcFByZWZlcnJlZFBhZ2VBcmVhID0gcEN1cnJlbnROb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihlQ3VyUGFnZVBvc2l0aW9uID09IGVGYWxsYmFja1Bvc2l0aW9uICYmICFwRmFsbGJhY2tQYWdlQXJlYSkgew0KLSAgICAgICAgICAgICAgICAgICAgcEZhbGxiYWNrUGFnZUFyZWEgPSBwQ3VycmVudE5vZGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHBUYXJnZXRQYWdlQXJlYSAmJiAhTWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihwVGFyZ2V0UGFnZUFyZWEsIEZBTFNFKSkgew0KLSAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KLSAgICAgICAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcEN1cnJlbnROb2RlKTsNCi0gICAgICAgICAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJyZW50Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpKTsNCisgICAgICAgICAgICBpQ3VyQ29udGVudEFyZWFJbmRleCsrOw0KKyAgICAgICAgICAgIGlmIChyZ1VzZWRIZWlnaHRzW2lDdXJDb250ZW50QXJlYUluZGV4XSA+DQorICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9IKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VOSVRfUHQpICsNCisgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICAgICAgICBiVXNhYmxlID0gRkFMU0U7DQorICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYocEN1cnJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KLSAgICAgICAgICAgIGlmKEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0X1NpbXBsZXhEdXBsZXgocEN1cnJlbnROb2RlLCBOVUxMLCBwVGFyZ2V0UGFnZUFyZWEsIHBUYXJnZXRDb250ZW50QXJlYSwgYk5ld1BhZ2UsIGJRdWVyeSwgZVByZWZlcnJlZFBvc2l0aW9uKSkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYlVzYWJsZSkgew0KKyAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBDaGlsZExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgICAgICBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBDb250ZW50QXJlYU5vZGUgPQ0KKyAgICAgICAgICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgIHBMYXN0UGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSA9IHBOb2RlOw0KKyAgICAgICAgICAgIHdoaWxlIChwQ2hpbGRMYXlvdXRJdGVtICYmIHBDb250ZW50QXJlYU5vZGUpIHsNCisgICAgICAgICAgICAgIGlmIChwQ2hpbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9DQorICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCisgICAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbSA9IHBDaGlsZExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmIChwQ29udGVudEFyZWFOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCisgICAgICAgICAgICAgICAgcENvbnRlbnRBcmVhTm9kZSA9DQorICAgICAgICAgICAgICAgICAgICBwQ29udGVudEFyZWFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHBDaGlsZExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlID0gcENvbnRlbnRBcmVhTm9kZTsNCisgICAgICAgICAgICAgIHBDaGlsZExheW91dEl0ZW0gPSBwQ2hpbGRMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUgPQ0KKyAgICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQogICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2UgaWYgKHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUGFnZVBvc2l0aW9uKSA9PQ0KKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0xhc3QpIHsNCisgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcFJlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KKyAgICAgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwUmVjb3JkLCBwTm9kZSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK2ludDMyX3QgQ1hGQV9MYXlvdXRQYWdlTWdyOjpHZXRQYWdlQ291bnQoKSBjb25zdCB7DQorICByZXR1cm4gbV9QYWdlQXJyYXkuR2V0U2l6ZSgpOw0KK30NCitJWEZBX0xheW91dFBhZ2UqIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0UGFnZShpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICBpZiAobV9QYWdlQXJyYXkuR2V0U2l6ZSgpID4gaW5kZXgpIHsNCisgICAgcmV0dXJuIChJWEZBX0xheW91dFBhZ2UqKW1fUGFnZUFycmF5W2luZGV4XTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitpbnQzMl90IENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0UGFnZUluZGV4KElYRkFfTGF5b3V0UGFnZSogcFBhZ2UpIGNvbnN0IHsNCisgIHJldHVybiBtX1BhZ2VBcnJheS5GaW5kKChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUGFnZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpSdW5CcmVhayhYRkFfRUxFTUVOVCBlQnJlYWtUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlVGFyZ2V0VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGFydE5ldykgew0KKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICBzd2l0Y2ggKGVUYXJnZXRUeXBlKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE6DQorICAgICAgaWYgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICBwVGFyZ2V0ID0gTlVMTDsNCisgICAgICB9DQorICAgICAgaWYgKCFwVGFyZ2V0IHx8ICFtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkIHx8DQorICAgICAgICAgIHBUYXJnZXQgIT0NCisgICAgICAgICAgICAgIEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1ckNvbnRlbnRBcmVhLT5tX3BGb3JtTm9kZSB8fA0KKyAgICAgICAgICBiU3RhcnROZXcpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFBhZ2VBcmVhID0gTlVMTDsNCisgICAgICAgIGlmIChwVGFyZ2V0KSB7DQorICAgICAgICAgIHBQYWdlQXJlYSA9IHBUYXJnZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KICAgICAgICAgfQ0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcEN1clBhZ2VBcmVhID0gTlVMTDsNCi0gICAgaWYocFByZWZlcnJlZFBhZ2VBcmVhKSB7DQotICAgICAgICBwQ3VyUGFnZUFyZWEgPSBwUHJlZmVycmVkUGFnZUFyZWE7DQotICAgIH0gZWxzZSBpZihwRmFsbGJhY2tQYWdlQXJlYSkgew0KLSAgICAgICAgcEN1clBhZ2VBcmVhID0gcEZhbGxiYWNrUGFnZUFyZWE7DQotICAgIH0NCi0gICAgaWYgKCFwQ3VyUGFnZUFyZWEpIHsNCisgICAgICAgIHBQYWdlQXJlYSA9IEdldE5leHRBdmFpbFBhZ2VBcmVhKHBQYWdlQXJlYSwgcFRhcmdldCk7DQorICAgICAgICBiUmV0ID0gcFBhZ2VBcmVhICE9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhOg0KKyAgICAgIGlmIChwVGFyZ2V0ICYmIHBUYXJnZXQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgICAgcFRhcmdldCA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGlmICghcFRhcmdldCB8fCAhbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCB8fA0KKyAgICAgICAgICBwVGFyZ2V0ICE9IEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1clBhZ2VBcmVhLT5tX3BGb3JtTm9kZSB8fA0KKyAgICAgICAgICBiU3RhcnROZXcpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFBhZ2VBcmVhID0gR2V0TmV4dEF2YWlsUGFnZUFyZWEocFRhcmdldCwgTlVMTCwgVFJVRSk7DQorICAgICAgICBiUmV0ID0gcFBhZ2VBcmVhICE9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VPZGQ6DQorICAgICAgaWYgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICBwVGFyZ2V0ID0gTlVMTDsNCisgICAgICB9DQorICAgICAgaWYgKG1fbkF2YWlsUGFnZXMgJSAyICE9IDEgfHwgIW1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgfHwNCisgICAgICAgICAgKHBUYXJnZXQgJiYNCisgICAgICAgICAgIHBUYXJnZXQgIT0gR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyUGFnZUFyZWEtPm1fcEZvcm1Ob2RlKSB8fA0KKyAgICAgICAgICBiU3RhcnROZXcpIHsNCisgICAgICAgIGlmIChtX25BdmFpbFBhZ2VzICUgMiA9PSAxKSB7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VFdmVuOg0KKyAgICAgIGlmIChwVGFyZ2V0ICYmIHBUYXJnZXQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgICAgcFRhcmdldCA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX25BdmFpbFBhZ2VzICUgMiAhPSAwIHx8ICFtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkIHx8DQorICAgICAgICAgIChwVGFyZ2V0ICYmDQorICAgICAgICAgICBwVGFyZ2V0ICE9IEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1clBhZ2VBcmVhLT5tX3BGb3JtTm9kZSkgfHwNCisgICAgICAgICAgYlN0YXJ0TmV3KSB7DQorICAgICAgICBpZiAobV9uQXZhaWxQYWdlcyAlIDIgPT0gMCkgew0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BdXRvOg0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgICAgIDsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6RXhlY3V0ZUJyZWFrQmVmb3JlT3JBZnRlcigNCisgICAgQ1hGQV9Ob2RlKiBwQ3VyTm9kZSwNCisgICAgRlhfQk9PTCBiQmVmb3JlLA0KKyAgICBDWEZBX05vZGUqJiBwQnJlYWtMZWFkZXJUZW1wbGF0ZSwNCisgICAgQ1hGQV9Ob2RlKiYgcEJyZWFrVHJhaWxlclRlbXBsYXRlKSB7DQorICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBDdXJOb2RlLT5HZXRDbGFzc0lEKCk7DQorICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmU6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWtBZnRlcjogew0KKyAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0JyZWFrTGVhZGVyLCB3c0JyZWFrVHJhaWxlcjsNCisgICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHBDdXJOb2RlLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgICAgQ1hGQV9Ob2RlKiBwQ29udGFpbmVyID0gcEZvcm1Ob2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCisgICAgICBGWF9CT09MIGJTdGFydE5ldyA9IHBDdXJOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfU3RhcnROZXcpICE9IDA7DQorICAgICAgQ1hGQV9Ob2RlKiBwU2NyaXB0ID0gcEN1ck5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1NjcmlwdCk7DQorICAgICAgaWYgKHBTY3JpcHQgJiYgIVhGQV9MYXlvdXRQYWdlTWdyX1J1bkJyZWFrVGVzdFNjcmlwdChwU2NyaXB0KSkgew0KICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmICghYlF1ZXJ5KSB7DQotICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KLSAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJQYWdlQXJlYSk7DQotICAgICAgICBpZihwVGFyZ2V0Q29udGVudEFyZWEgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHBUYXJnZXRDb250ZW50QXJlYSA9IHBDdXJQYWdlQXJlYS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBUYXJnZXRDb250ZW50QXJlYSk7DQotICAgIH0NCi0gICAgbV9wQ3VyUGFnZUFyZWEgPSBwQ3VyUGFnZUFyZWE7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6TWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihDWEZBX05vZGUqIHBQYWdlQXJlYSwgRlhfQk9PTCBiTGFzdE1hdGNoKQ0KLXsNCi0gICAgaWYgKG1fZVBhZ2VTZXRNb2RlICE9IFhGQV9BVFRSSUJVVEVFTlVNX0R1cGxleFBhZ2luYXRlZCkgew0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NUYXJnZXQgPSBwQ3VyTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9UYXJnZXQpOw0KKyAgICAgIENYRkFfTm9kZSogcFRhcmdldCA9DQorICAgICAgICAgIFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQobV9wVGVtcGxhdGVQYWdlU2V0Um9vdCwgVFJVRSwgd3NUYXJnZXQpOw0KKyAgICAgIHdzQnJlYWtUcmFpbGVyID0gcEN1ck5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVHJhaWxlcik7DQorICAgICAgd3NCcmVha0xlYWRlciA9IHBDdXJOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX0xlYWRlcik7DQorICAgICAgcEJyZWFrTGVhZGVyVGVtcGxhdGUgPQ0KKyAgICAgICAgICBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIFRSVUUsIHdzQnJlYWtMZWFkZXIpOw0KKyAgICAgIHBCcmVha1RyYWlsZXJUZW1wbGF0ZSA9DQorICAgICAgICAgIFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgVFJVRSwgd3NCcmVha1RyYWlsZXIpOw0KKyAgICAgIGlmIChSdW5CcmVhayhlVHlwZSwgcEN1ck5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9UYXJnZXRUeXBlKSwgcFRhcmdldCwNCisgICAgICAgICAgICAgICAgICAgYlN0YXJ0TmV3KSkgew0KICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZU9kZE9yRXZlbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0FueTsNCi0gICAgcFBhZ2VBcmVhLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLCBlT2RkT3JFdmVuKTsNCi0gICAgaWYgKGVPZGRPckV2ZW4gIT0gWEZBX0FUVFJJQlVURUVOVU1fQW55KSB7DQotICAgICAgICBpbnQzMl90IGlQYWdlQ291bnQgPSBHZXRQYWdlQ291bnQoKTsNCi0gICAgICAgIGlmIChiTGFzdE1hdGNoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGVPZGRPckV2ZW4gPT0gWEZBX0FUVFJJQlVURUVOVU1fT2RkID8gaVBhZ2VDb3VudCAlIDIgPT0gMSA6IGlQYWdlQ291bnQgJSAyID09IDA7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0Q291bnQoKSA+IDAgJiYNCisgICAgICAgICAgICBtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkID09DQorICAgICAgICAgICAgICAgIG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRIZWFkUG9zaXRpb24oKSAmJg0KKyAgICAgICAgICAgIGVUeXBlID09IFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlKSB7DQorICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgICAgICAgIGlmICghcFBhcmVudE5vZGUgfHwNCisgICAgICAgICAgICAgIHBGb3JtTm9kZSAhPQ0KKyAgICAgICAgICAgICAgICAgIHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwUGFyZW50Tm9kZSA9IHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgaWYgKCFwUGFyZW50Tm9kZSB8fCBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0Zvcm0pIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICByZXR1cm4gVFJVRTsNCiAgICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlT2RkT3JFdmVuID09IFhGQV9BVFRSSUJVVEVFTlVNX09kZCA/IGlQYWdlQ291bnQgJSAyID09IDAgOiBpUGFnZUNvdW50ICUgMiA9PSAxOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVhazogew0KKyAgICAgIEZYX0JPT0wgYlN0YXJ0TmV3ID0gcEN1ck5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9TdGFydE5ldykgIT0gMDsNCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NUYXJnZXQgPSBwQ3VyTm9kZS0+R2V0Q0RhdGEoDQorICAgICAgICAgIGJCZWZvcmUgPyBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCA6IFhGQV9BVFRSSUJVVEVfQWZ0ZXJUYXJnZXQpOw0KKyAgICAgIENYRkFfTm9kZSogcFRhcmdldCA9DQorICAgICAgICAgIFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQobV9wVGVtcGxhdGVQYWdlU2V0Um9vdCwgVFJVRSwgd3NUYXJnZXQpOw0KKyAgICAgIGlmIChSdW5CcmVhayhiQmVmb3JlID8gWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUgOiBYRkFfRUxFTUVOVF9CcmVha0FmdGVyLA0KKyAgICAgICAgICAgICAgICAgICBwQ3VyTm9kZS0+R2V0RW51bShiQmVmb3JlID8gWEZBX0FUVFJJQlVURV9CZWZvcmUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9BVFRSSUJVVEVfQWZ0ZXIpLA0KKyAgICAgICAgICAgICAgICAgICBwVGFyZ2V0LCBiU3RhcnROZXcpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9TZXRMYXlvdXRHZW5lcmF0ZWROb2RlRmxhZyhDWEZBX05vZGUqIHBOb2RlKSB7DQorICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfTGF5b3V0R2VuZXJhdGVkTm9kZSwgVFJVRSwgRkFMU0UpOw0KKyAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFLCBGQUxTRSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpQcm9jZXNzQnJlYWtCZWZvcmVPckFmdGVyKA0KKyAgICBDWEZBX05vZGUqIHBCcmVha05vZGUsDQorICAgIEZYX0JPT0wgYkJlZm9yZSwNCisgICAgQ1hGQV9Ob2RlKiYgcEJyZWFrTGVhZGVyTm9kZSwNCisgICAgQ1hGQV9Ob2RlKiYgcEJyZWFrVHJhaWxlck5vZGUsDQorICAgIEZYX0JPT0wmIGJDcmVhdGVQYWdlKSB7DQorICBDWEZBX05vZGUgKnBMZWFkZXJUZW1wbGF0ZSA9IE5VTEwsICpwVHJhaWxlclRlbXBsYXRlID0gTlVMTDsNCisgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gcEJyZWFrTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwRm9ybU5vZGUpKSB7DQorICAgIGJDcmVhdGVQYWdlID0gRXhlY3V0ZUJyZWFrQmVmb3JlT3JBZnRlcihwQnJlYWtOb2RlLCBiQmVmb3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlYWRlclRlbXBsYXRlLCBwVHJhaWxlclRlbXBsYXRlKTsNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcEJyZWFrTm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlID0gTlVMTDsNCisgICAgcEZvcm1Ob2RlID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICBpZiAocExlYWRlclRlbXBsYXRlKSB7DQorICAgICAgaWYgKCFwRGF0YVNjb3BlKSB7DQorICAgICAgICBwRGF0YVNjb3BlID0gWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVNjb3BlKHBGb3JtTm9kZSk7DQorICAgICAgfQ0KKyAgICAgIHBCcmVha0xlYWRlck5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKA0KKyAgICAgICAgICBwTGVhZGVyVGVtcGxhdGUsIHBGb3JtTm9kZSwgcERhdGFTY29wZSwgVFJVRSk7DQorICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwQnJlYWtMZWFkZXJOb2RlKTsNCisgICAgICBYRkFfU2V0TGF5b3V0R2VuZXJhdGVkTm9kZUZsYWcocEJyZWFrTGVhZGVyTm9kZSk7DQorICAgIH0NCisgICAgaWYgKHBUcmFpbGVyVGVtcGxhdGUpIHsNCisgICAgICBpZiAoIXBEYXRhU2NvcGUpIHsNCisgICAgICAgIHBEYXRhU2NvcGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUocEZvcm1Ob2RlKTsNCisgICAgICB9DQorICAgICAgcEJyZWFrVHJhaWxlck5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKA0KKyAgICAgICAgICBwVHJhaWxlclRlbXBsYXRlLCBwRm9ybU5vZGUsIHBEYXRhU2NvcGUsIFRSVUUpOw0KKyAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocEJyZWFrVHJhaWxlck5vZGUpOw0KKyAgICAgIFhGQV9TZXRMYXlvdXRHZW5lcmF0ZWROb2RlRmxhZyhwQnJlYWtUcmFpbGVyTm9kZSk7DQogICAgIH0NCiAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9MYXlvdXRQYWdlTWdyOjpHZXROZXh0QXZhaWxQYWdlQXJlYShDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSwgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEsIEZYX0JPT0wgYk5ld1BhZ2UsIEZYX0JPT0wgYlF1ZXJ5KQ0KLXsNCi0gICAgaWYobV9wQ3VyUGFnZUFyZWEgPT0gTlVMTCkgew0KLSAgICAgICAgRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXQobV9wVGVtcGxhdGVQYWdlU2V0Um9vdCwgTlVMTCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnkpOw0KLSAgICAgICAgQVNTRVJUKG1fcEN1clBhZ2VBcmVhKTsNCi0gICAgICAgIHJldHVybiBtX3BDdXJQYWdlQXJlYTsNCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJvY2Vzc0Jvb2tlbmRMZWFkZXJPclRyYWlsZXIoDQorICAgIENYRkFfTm9kZSogcEJvb2tlbmROb2RlLA0KKyAgICBGWF9CT09MIGJMZWFkZXIsDQorICAgIENYRkFfTm9kZSomIHBCb29rZW5kQXBwZW5kTm9kZSkgew0KKyAgQ1hGQV9Ob2RlKiBwTGVhZGVyVGVtcGxhdGUgPSBOVUxMOw0KKyAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBwQm9va2VuZE5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgIFhGQV9OT0RFSVRFTV9QYXJlbnQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgaWYgKFJlc29sdmVCb29rZW5kTGVhZGVyT3JUcmFpbGVyKHBCb29rZW5kTm9kZSwgYkxlYWRlciwgcExlYWRlclRlbXBsYXRlKSkgew0KKyAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwQm9va2VuZE5vZGUtPkdldERvY3VtZW50KCk7DQorICAgIENYRkFfTm9kZSogcERhdGFTY29wZSA9IE5VTEw7DQorICAgIGlmIChwTGVhZGVyVGVtcGxhdGUpIHsNCisgICAgICBpZiAoIXBEYXRhU2NvcGUpIHsNCisgICAgICAgIHBEYXRhU2NvcGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUocEZvcm1Ob2RlKTsNCisgICAgICB9DQorICAgICAgcEJvb2tlbmRBcHBlbmROb2RlID0gcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcigNCisgICAgICAgICAgcExlYWRlclRlbXBsYXRlLCBwRm9ybU5vZGUsIHBEYXRhU2NvcGUsIFRSVUUpOw0KKyAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocEJvb2tlbmRBcHBlbmROb2RlKTsNCisgICAgICBYRkFfU2V0TGF5b3V0R2VuZXJhdGVkTm9kZUZsYWcocEJvb2tlbmRBcHBlbmROb2RlKTsNCisgICAgICByZXR1cm4gVFJVRTsNCiAgICAgfQ0KLSAgICBpZihwVGFyZ2V0UGFnZUFyZWEgPT0gTlVMTCB8fCBwVGFyZ2V0UGFnZUFyZWEgPT0gbV9wQ3VyUGFnZUFyZWEpIHsNCi0gICAgICAgIGlmKCFiTmV3UGFnZSAmJiBHZXROZXh0Q29udGVudEFyZWEocFRhcmdldENvbnRlbnRBcmVhKSkgew0KLSAgICAgICAgICAgIHJldHVybiBtX3BDdXJQYWdlQXJlYTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0xheW91dFBhZ2VNZ3I6OkJyZWFrT3ZlcmZsb3coQ1hGQV9Ob2RlKiBwT3ZlcmZsb3dOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSomIHBMZWFkZXJUZW1wbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwVHJhaWxlclRlbXBsYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZVBhZ2UpIHsNCisgIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93TGVhZGVyLCB3c092ZXJmbG93VHJhaWxlcjsNCisgIENYRkFfTm9kZSogcENvbnRhaW5lciA9DQorICAgICAgcE92ZXJmbG93Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKQ0KKyAgICAgICAgICAtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgaWYgKHBPdmVyZmxvd05vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9CcmVhaykgew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd0xlYWRlcjsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dUYXJnZXQ7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93VHJhaWxlcjsNCisgICAgcE92ZXJmbG93Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9PdmVyZmxvd0xlYWRlciwgd3NPdmVyZmxvd0xlYWRlcik7DQorICAgIHBPdmVyZmxvd05vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUcmFpbGVyLCB3c092ZXJmbG93VHJhaWxlcik7DQorICAgIHBPdmVyZmxvd05vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUYXJnZXQsIHdzT3ZlcmZsb3dUYXJnZXQpOw0KKyAgICBpZiAoIXdzT3ZlcmZsb3dMZWFkZXIuSXNFbXB0eSgpIHx8ICF3c092ZXJmbG93VHJhaWxlci5Jc0VtcHR5KCkgfHwNCisgICAgICAgICF3c092ZXJmbG93VGFyZ2V0LklzRW1wdHkoKSkgew0KKyAgICAgIGlmICghd3NPdmVyZmxvd1RhcmdldC5Jc0VtcHR5KCkgJiYgYkNyZWF0ZVBhZ2UgJiYNCisgICAgICAgICAgIW1fYkNyZWF0ZU92ZXJGbG93UGFnZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0ID0gWEZBX1Jlc29sdmVCcmVha1RhcmdldCgNCisgICAgICAgICAgICB0aGlzLT5tX3BUZW1wbGF0ZVBhZ2VTZXRSb290LCBUUlVFLCB3c092ZXJmbG93VGFyZ2V0KTsNCisgICAgICAgIGlmIChwVGFyZ2V0KSB7DQorICAgICAgICAgIG1fYkNyZWF0ZU92ZXJGbG93UGFnZSA9IFRSVUU7DQorICAgICAgICAgIHN3aXRjaCAocFRhcmdldC0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlQXJlYToNCisgICAgICAgICAgICAgIFJ1bkJyZWFrKFhGQV9FTEVNRU5UX092ZXJmbG93LCBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgIHBUYXJnZXQsIFRSVUUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYToNCisgICAgICAgICAgICAgIFJ1bkJyZWFrKFhGQV9FTEVNRU5UX092ZXJmbG93LCBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgIHBUYXJnZXQsIFRSVUUpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBpZihJc1BhZ2VTZXRSb290T3JkZXJlZE9jY3VycmVuY2UoKSkgew0KLSAgICAgICAgICAgIGludDMyX3QgaU1heCA9IC0xOw0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IG1fcEN1clBhZ2VBcmVhLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQotICAgICAgICAgICAgaWYocE9jY3VyTm9kZSkgew0KLSAgICAgICAgICAgICAgICBwT2NjdXJOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBGQUxTRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKChpTWF4IDwgMCB8fCBtX25DdXJQYWdlQ291bnQgPCBpTWF4KSkgew0KLSAgICAgICAgICAgICAgICBpZiAoIWJRdWVyeSkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQobV9wQ3VyUGFnZUFyZWEpOw0KLSAgICAgICAgICAgICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIG1fcEN1clBhZ2VBcmVhKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBUYXJnZXRDb250ZW50QXJlYSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhID0gbV9wQ3VyUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIEFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwVGFyZ2V0Q29udGVudEFyZWEpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fbkN1clBhZ2VDb3VudCArKzsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZighYlF1ZXJ5ICYmIElzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpKSB7DQotICAgICAgICBDcmVhdGVNaW5QYWdlUmVjb3JkKG1fcEN1clBhZ2VBcmVhLCBGQUxTRSwgVFJVRSk7DQotICAgIH0NCi0gICAgaWYoRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXQobV9wQ3VyUGFnZUFyZWEtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLCBtX3BDdXJQYWdlQXJlYSwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnkpKSB7DQotICAgICAgICByZXR1cm4gbV9wQ3VyUGFnZUFyZWE7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IG1fcEN1clBhZ2VBcmVhLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgd2hpbGUoVFJVRSkgew0KLSAgICAgICAgaWYgKEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0KHBQYWdlU2V0LCBOVUxMLCBwVGFyZ2V0UGFnZUFyZWEsIHBUYXJnZXRDb250ZW50QXJlYSwgYk5ld1BhZ2UsIGJRdWVyeSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gbV9wQ3VyUGFnZUFyZWE7DQotICAgICAgICB9DQotICAgICAgICBpZighYlF1ZXJ5ICYmIElzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpKSB7DQotICAgICAgICAgICAgQ3JlYXRlTWluUGFnZVNldFJlY29yZChwUGFnZVNldCk7DQotICAgICAgICB9DQotICAgICAgICBpZihGaW5kUGFnZUFyZWFGcm9tUGFnZVNldChOVUxMLCBwUGFnZVNldCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnkpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYocFBhZ2VTZXQgPT0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFBhZ2VTZXQgPSBwUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgfQ0KKyAgICAgIGlmICghYkNyZWF0ZVBhZ2UpIHsNCisgICAgICAgIHBMZWFkZXJUZW1wbGF0ZSA9DQorICAgICAgICAgICAgWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBUUlVFLCB3c092ZXJmbG93TGVhZGVyKTsNCisgICAgICAgIHBUcmFpbGVyVGVtcGxhdGUgPQ0KKyAgICAgICAgICAgIFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgVFJVRSwgd3NPdmVyZmxvd1RyYWlsZXIpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcE92ZXJmbG93Tm9kZTsNCiAgICAgfQ0KICAgICByZXR1cm4gTlVMTDsNCi19DQotc3RhdGljIEZYX0JPT0wgWEZBX0xheW91dFBhZ2VNZ3JfQ2hlY2tDb250ZW50QXJlYU5vdFVzZWQoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFBhZ2VBcmVhTGF5b3V0SXRlbSwgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWEsIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqJiBwQ29udGVudEFyZWFMYXlvdXRJdGVtKQ0KLXsNCi0gICAgZm9yKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7IHBMYXlvdXRJdGVtOyBwTGF5b3V0SXRlbSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCi0gICAgICAgIGlmKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSA9PSBwQ29udGVudEFyZWEpIHsNCi0gICAgICAgICAgICBpZihwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYUxheW91dEl0ZW0gPSBwTGF5b3V0SXRlbTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTAlDWEZBX0xheW91dFBhZ2VNZ3I6OkdldE5leHRDb250ZW50QXJlYShDWEZBX05vZGUqIHBDb250ZW50QXJlYSkNCi17DQotICAgIENYRkFfTm9kZSogcEN1ckNvbnRlbnROb2RlID0gR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyQ29udGVudEFyZWEtPm1fcEZvcm1Ob2RlOw0KLSAgICBpZihwQ29udGVudEFyZWEgPT0gTlVMTCkgew0KLSAgICAgICAgcENvbnRlbnRBcmVhID0gcEN1ckNvbnRlbnROb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQotICAgICAgICBpZihwQ29udGVudEFyZWEgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmKHBDb250ZW50QXJlYS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkgIT0gbV9wQ3VyUGFnZUFyZWEpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ29udGVudEFyZWFMYXlvdXQgPSBOVUxMOw0KLSAgICAgICAgaWYoIVhGQV9MYXlvdXRQYWdlTWdyX0NoZWNrQ29udGVudEFyZWFOb3RVc2VkKEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1clBhZ2VBcmVhLCBwQ29udGVudEFyZWEsIHBDb250ZW50QXJlYUxheW91dCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBpZihwQ29udGVudEFyZWFMYXlvdXQpIHsNCi0gICAgICAgICAgICBpZihwQ29udGVudEFyZWFMYXlvdXQtPm1fcEZvcm1Ob2RlICE9IHBDdXJDb250ZW50Tm9kZSkgew0KLSAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KLSAgICAgICAgICAgICAgICBwTmV3UmVjb3JkLT5wQ3VyQ29udGVudEFyZWEgPSBwQ29udGVudEFyZWFMYXlvdXQ7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCi0gICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDb250ZW50QXJlYSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi12b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6SW5pdFBhZ2VTZXRNYXAoKQ0KLXsNCi0gICAgaWYoIUlzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlSXRlcmF0b3Igc0l0ZXJhdG9yKG1fcFRlbXBsYXRlUGFnZVNldFJvb3QpOw0KLSAgICBmb3IgKENYRkFfTm9kZSogcFBhZ2VTZXROb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcFBhZ2VTZXROb2RlOyBwUGFnZVNldE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICBpZihwUGFnZVNldE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQotICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVJlbGF0aW9uID0gcFBhZ2VTZXROb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUmVsYXRpb24pOw0KLSAgICAgICAgICAgIGlmKGVSZWxhdGlvbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZSkgew0KLSAgICAgICAgICAgICAgICBtX3BQYWdlU2V0TWFwLlNldEF0KHBQYWdlU2V0Tm9kZSwgMCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLWludDMyX3QgQ1hGQV9MYXlvdXRQYWdlTWdyOjpDcmVhdGVNaW5QYWdlUmVjb3JkKENYRkFfTm9kZSogcFBhZ2VBcmVhLCBGWF9CT09MIGJUYXJnZXRQYWdlQXJlYSwgRlhfQk9PTCBiQ3JlYXRlTGFzdCkNCi17DQotICAgIGlmKHBQYWdlQXJlYSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBPY2N1ck5vZGUgPSBwUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX09jY3VyKTsNCi0gICAgaW50MzJfdCBpTWluID0gMDsNCi0gICAgaWYoKHBPY2N1ck5vZGUgJiYgcE9jY3VyTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01pbiwgaU1pbiwgRkFMU0UpKSB8fCBiVGFyZ2V0UGFnZUFyZWEpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhID0gcFBhZ2VBcmVhLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQotICAgICAgICBpZiAoaU1pbiA8IDEgJiYgYlRhcmdldFBhZ2VBcmVhICYmICFwQ29udGVudEFyZWEpIHsNCi0gICAgICAgICAgICBpTWluID0gMTsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaSA9IDA7DQotICAgICAgICBpZihiQ3JlYXRlTGFzdCkgew0KLSAgICAgICAgICAgIGkgPSBtX25DdXJQYWdlQ291bnQ7DQotICAgICAgICB9DQotICAgICAgICBmb3IoOyBpIDwgaU1pbjsgaSsrKSB7DQotICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCi0gICAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcFBhZ2VBcmVhKTsNCi0gICAgICAgICAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcENvbnRlbnRBcmVhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaU1pbjsNCi19DQotdm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OkNyZWF0ZU1pblBhZ2VTZXRSZWNvcmQoQ1hGQV9Ob2RlKiBwUGFnZVNldCwgRlhfQk9PTCBiQ3JlYXRlQWxsKQ0KLXsNCi0gICAgaWYocFBhZ2VTZXQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUN1clNldENvdW50ID0gMDsNCi0gICAgaWYoIW1fcFBhZ2VTZXRNYXAuTG9va3VwKHBQYWdlU2V0LCBpQ3VyU2V0Q291bnQpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYoYkNyZWF0ZUFsbCkgew0KLSAgICAgICAgaUN1clNldENvdW50ID0gMDsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBPY2N1ck5vZGUgPSBwUGFnZVNldC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KLSAgICBpbnQzMl90IGlNaW4gPSAwOw0KLSAgICBpZihwT2NjdXJOb2RlICYmIHBPY2N1ck5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIEZBTFNFKSkgew0KLSAgICAgICAgaWYoaUN1clNldENvdW50IDwgaU1pbikgew0KLSAgICAgICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgaU1pbiAtIGlDdXJTZXRDb3VudDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIGZvcihDWEZBX05vZGUgKnBDdXJyZW50UGFnZU5vZGUgPSBwUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ3VycmVudFBhZ2VOb2RlOyBwQ3VycmVudFBhZ2VOb2RlID0gcEN1cnJlbnRQYWdlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYocEN1cnJlbnRQYWdlTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTWluUGFnZVJlY29yZChwQ3VycmVudFBhZ2VOb2RlLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYocEN1cnJlbnRQYWdlTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKHBDdXJyZW50UGFnZU5vZGUsIFRSVUUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fcFBhZ2VTZXRNYXAuU2V0QXQocFBhZ2VTZXQsIGlNaW4pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpDcmVhdGVOZXh0TWluUmVjb3JkKENYRkFfTm9kZSogcFJlY29yZE5vZGUpDQotew0KLSAgICBpZihwUmVjb3JkTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgZm9yKENYRkFfTm9kZSAqcEN1cnJlbnROb2RlID0gcFJlY29yZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7IHBDdXJyZW50Tm9kZTsgcEN1cnJlbnROb2RlID0gcEN1cnJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpZihwQ3VycmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KLSAgICAgICAgICAgIENyZWF0ZU1pblBhZ2VSZWNvcmQocEN1cnJlbnROb2RlLCBGQUxTRSk7DQotICAgICAgICB9IGVsc2UgaWYocEN1cnJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KLSAgICAgICAgICAgIENyZWF0ZU1pblBhZ2VTZXRSZWNvcmQocEN1cnJlbnROb2RlLCBUUlVFKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJvY2Vzc0xhc3RQYWdlU2V0KCkNCi17DQotICAgIENyZWF0ZU1pblBhZ2VSZWNvcmQobV9wQ3VyUGFnZUFyZWEsIEZBTFNFLCBUUlVFKTsNCi0gICAgQ3JlYXRlTmV4dE1pblJlY29yZChtX3BDdXJQYWdlQXJlYSk7DQotICAgIENYRkFfTm9kZSogcFBhZ2VTZXQgPSBtX3BDdXJQYWdlQXJlYS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgIHdoaWxlKFRSVUUpIHsNCi0gICAgICAgIENyZWF0ZU1pblBhZ2VTZXRSZWNvcmQocFBhZ2VTZXQpOw0KLSAgICAgICAgaWYocFBhZ2VTZXQgPT0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgew0KKyAgfSBlbHNlIGlmIChwT3ZlcmZsb3dOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfT3ZlcmZsb3cpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dUYXJnZXQ7DQorICAgIHBPdmVyZmxvd05vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTGVhZGVyLCB3c092ZXJmbG93TGVhZGVyKTsNCisgICAgcE92ZXJmbG93Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UcmFpbGVyLCB3c092ZXJmbG93VHJhaWxlcik7DQorICAgIHBPdmVyZmxvd05vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCB3c092ZXJmbG93VGFyZ2V0KTsNCisgICAgaWYgKCF3c092ZXJmbG93VGFyZ2V0LklzRW1wdHkoKSAmJiBiQ3JlYXRlUGFnZSAmJiAhbV9iQ3JlYXRlT3ZlckZsb3dQYWdlKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0ID0gWEZBX1Jlc29sdmVCcmVha1RhcmdldCh0aGlzLT5tX3BUZW1wbGF0ZVBhZ2VTZXRSb290LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgd3NPdmVyZmxvd1RhcmdldCk7DQorICAgICAgaWYgKHBUYXJnZXQpIHsNCisgICAgICAgIG1fYkNyZWF0ZU92ZXJGbG93UGFnZSA9IFRSVUU7DQorICAgICAgICBzd2l0Y2ggKHBUYXJnZXQtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1BhZ2VBcmVhOg0KKyAgICAgICAgICAgIFJ1bkJyZWFrKFhGQV9FTEVNRU5UX092ZXJmbG93LCBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYSwgcFRhcmdldCwNCisgICAgICAgICAgICAgICAgICAgICBUUlVFKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYToNCisgICAgICAgICAgICBSdW5CcmVhayhYRkFfRUxFTUVOVF9PdmVyZmxvdywgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEsDQorICAgICAgICAgICAgICAgICAgICAgcFRhcmdldCwgVFJVRSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQotICAgICAgICBDcmVhdGVOZXh0TWluUmVjb3JkKHBQYWdlU2V0KTsNCi0gICAgICAgIHBQYWdlU2V0ID0gcFBhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgICBpZiAoIWJDcmVhdGVQYWdlKSB7DQorICAgICAgcExlYWRlclRlbXBsYXRlID0NCisgICAgICAgICAgWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBUUlVFLCB3c092ZXJmbG93TGVhZGVyKTsNCisgICAgICBwVHJhaWxlclRlbXBsYXRlID0NCisgICAgICAgICAgWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBUUlVFLCB3c092ZXJmbG93VHJhaWxlcik7DQorICAgIH0NCisgICAgcmV0dXJuIHBPdmVyZmxvd05vZGU7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OkdldE5leHRBdmFpbENvbnRlbnRIZWlnaHQoRlhfRkxPQVQgZkNoaWxkSGVpZ2h0KQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwQ3VyQ29udGVudE5vZGUgPSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJDb250ZW50QXJlYS0+bV9wRm9ybU5vZGU7DQotICAgIGlmKHBDdXJDb250ZW50Tm9kZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcEN1ckNvbnRlbnROb2RlID0gcEN1ckNvbnRlbnROb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQotICAgIGlmKHBDdXJDb250ZW50Tm9kZSkgew0KLSAgICAgICAgRlhfRkxPQVQgZk5leHRDb250ZW50SGVpZ2h0ID0gcEN1ckNvbnRlbnROb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgIHJldHVybiBmTmV4dENvbnRlbnRIZWlnaHQgPiBmQ2hpbGRIZWlnaHQgPyBUUlVFIDogRkFMU0U7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwUGFnZU5vZGUgPSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlQXJlYS0+bV9wRm9ybU5vZGU7DQotICAgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IHBQYWdlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KLSAgICBpbnQzMl90IGlNYXggPSAwOw0KLSAgICBpZihwT2NjdXJOb2RlICYmIHBPY2N1ck5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NYXgsIGlNYXgsIEZBTFNFKSkgew0KLSAgICAgICAgaWYobV9uQ3VyUGFnZUNvdW50ID09IGlNYXgpIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBTcmNQYWdlID0gbV9wQ3VyUGFnZUFyZWE7DQotICAgICAgICAgICAgaW50MzJfdCBuU3JjUGFnZUNvdW50ID0gbV9uQ3VyUGFnZUNvdW50Ow0KLSAgICAgICAgICAgIEZYX1BPU0lUSU9OIHBzU3JjUmVjb3JkID0gbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldFRhaWxQb3NpdGlvbigpOw0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcE5leHRQYWdlID0gR2V0TmV4dEF2YWlsUGFnZUFyZWEoTlVMTCwgTlVMTCwgRkFMU0UsIFRSVUUpOw0KLSAgICAgICAgICAgIG1fcEN1clBhZ2VBcmVhID0gcFNyY1BhZ2U7DQotICAgICAgICAgICAgbV9uQ3VyUGFnZUNvdW50ID0gblNyY1BhZ2VDb3VudDsNCi0gICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcFByZXZSZWNvcmQgPSAoQ1hGQV9Db250YWluZXJSZWNvcmQqKW1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXROZXh0KHBzU3JjUmVjb3JkKTsNCi0gICAgICAgICAgICB3aGlsZSAocHNTcmNSZWNvcmQpIHsNCi0gICAgICAgICAgICAgICAgRlhfUE9TSVRJT04gcHNTYXZlUmVjb3JkID0gcHNTcmNSZWNvcmQ7DQotICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwSW5zZXJ0UmVjb3JkID0gKENYRkFfQ29udGFpbmVyUmVjb3JkKiltX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0TmV4dChwc1NyY1JlY29yZCk7DQotICAgICAgICAgICAgICAgIFJlbW92ZUxheW91dFJlY29yZChwSW5zZXJ0UmVjb3JkLCBwUHJldlJlY29yZCk7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBwSW5zZXJ0UmVjb3JkOw0KLSAgICAgICAgICAgICAgICBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuUmVtb3ZlQXQocHNTYXZlUmVjb3JkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYocE5leHRQYWdlKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhID0gcE5leHRQYWdlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQotICAgICAgICAgICAgICAgIGlmKHBDb250ZW50QXJlYSkgew0KLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk5leHRDb250ZW50SGVpZ2h0ID0gcENvbnRlbnRBcmVhLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGZOZXh0Q29udGVudEhlaWdodCA+IGZDaGlsZEhlaWdodCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJvY2Vzc092ZXJmbG93KENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcExlYWRlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwVHJhaWxlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEYXRhTWVyZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDcmVhdGVQYWdlKSB7DQorICBpZiAocEZvcm1Ob2RlID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlICpwTGVhZGVyVGVtcGxhdGUgPSBOVUxMLCAqcFRyYWlsZXJUZW1wbGF0ZSA9IE5VTEw7DQorICBGWF9CT09MIGJJc092ZXJmbG93Tm9kZSA9IEZBTFNFOw0KKyAgaWYgKHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX092ZXJmbG93IHx8DQorICAgICAgcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQnJlYWspIHsNCisgICAgYklzT3ZlcmZsb3dOb2RlID0gVFJVRTsNCisgIH0NCisgIGZvciAoQ1hGQV9Ob2RlKiBwQ3VyTm9kZSA9DQorICAgICAgICAgICBiSXNPdmVyZmxvd05vZGUgPyBwRm9ybU5vZGUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICBwQ3VyTm9kZTsgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+R2V0Tm9kZUl0ZW0oKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpKSB7DQorICAgIGlmIChCcmVha092ZXJmbG93KHBDdXJOb2RlLCBwTGVhZGVyVGVtcGxhdGUsIHBUcmFpbGVyVGVtcGxhdGUsDQorICAgICAgICAgICAgICAgICAgICAgIGJDcmVhdGVQYWdlKSkgew0KKyAgICAgIGlmIChiSXNPdmVyZmxvd05vZGUpIHsNCisgICAgICAgIHBGb3JtTm9kZSA9IHBDdXJOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICB9DQorICAgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcEN1ck5vZGUtPkdldERvY3VtZW50KCk7DQorICAgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlID0gTlVMTDsNCisgICAgICBpZiAocExlYWRlclRlbXBsYXRlKSB7DQorICAgICAgICBpZiAoIXBEYXRhU2NvcGUpIHsNCisgICAgICAgICAgcERhdGFTY29wZSA9IFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZShwRm9ybU5vZGUpOw0KICAgICAgICAgfQ0KKyAgICAgICAgcExlYWRlck5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKA0KKyAgICAgICAgICAgIHBMZWFkZXJUZW1wbGF0ZSwgcEZvcm1Ob2RlLCBwRGF0YVNjb3BlLCBUUlVFKTsNCisgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocExlYWRlck5vZGUpOw0KKyAgICAgICAgWEZBX1NldExheW91dEdlbmVyYXRlZE5vZGVGbGFnKHBMZWFkZXJOb2RlKTsNCisgICAgICB9DQorICAgICAgaWYgKHBUcmFpbGVyVGVtcGxhdGUpIHsNCisgICAgICAgIGlmICghcERhdGFTY29wZSkgew0KKyAgICAgICAgICBwRGF0YVNjb3BlID0gWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVNjb3BlKHBGb3JtTm9kZSk7DQorICAgICAgICB9DQorICAgICAgICBwVHJhaWxlck5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKA0KKyAgICAgICAgICAgIHBUcmFpbGVyVGVtcGxhdGUsIHBGb3JtTm9kZSwgcERhdGFTY29wZSwgVFJVRSk7DQorICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHBUcmFpbGVyTm9kZSk7DQorICAgICAgICBYRkFfU2V0TGF5b3V0R2VuZXJhdGVkTm9kZUZsYWcocFRyYWlsZXJOb2RlKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWEgPSBwUGFnZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCi0gICAgRlhfRkxPQVQgZk5leHRDb250ZW50SGVpZ2h0ID0gcENvbnRlbnRBcmVhLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgaWYgKGZOZXh0Q29udGVudEhlaWdodCA8IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgaWYgKGJJc092ZXJmbG93Tm9kZSkgew0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGlmKGZOZXh0Q29udGVudEhlaWdodCA+IGZDaGlsZEhlaWdodCkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpSZXNvbHZlQm9va2VuZExlYWRlck9yVHJhaWxlcigNCisgICAgQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUsDQorICAgIEZYX0JPT0wgYkxlYWRlciwNCisgICAgQ1hGQV9Ob2RlKiYgcEJvb2tlbmRBcHBlbmRUZW1wbGF0ZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmdDIHdzQm9va2VuZExlYWRlcjsNCisgIENYRkFfTm9kZSogcENvbnRhaW5lciA9DQorICAgICAgcEJvb2tlbmROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkNCisgICAgICAgICAgLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCisgIGlmIChwQm9va2VuZE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9CcmVhaykgew0KKyAgICBwQm9va2VuZE5vZGUtPlRyeUNEYXRhKA0KKyAgICAgICAgYkxlYWRlciA/IFhGQV9BVFRSSUJVVEVfQm9va2VuZExlYWRlciA6IFhGQV9BVFRSSUJVVEVfQm9va2VuZFRyYWlsZXIsDQorICAgICAgICB3c0Jvb2tlbmRMZWFkZXIpOw0KKyAgICBpZiAoIXdzQm9va2VuZExlYWRlci5Jc0VtcHR5KCkpIHsNCisgICAgICBwQm9va2VuZEFwcGVuZFRlbXBsYXRlID0NCisgICAgICAgICAgWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBGQUxTRSwgd3NCb29rZW5kTGVhZGVyKTsNCisgICAgICByZXR1cm4gVFJVRTsNCiAgICAgfQ0KICAgICByZXR1cm4gRkFMU0U7DQorICB9IGVsc2UgaWYgKHBCb29rZW5kTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Jvb2tlbmQpIHsNCisgICAgcEJvb2tlbmROb2RlLT5UcnlDRGF0YSgNCisgICAgICAgIGJMZWFkZXIgPyBYRkFfQVRUUklCVVRFX0xlYWRlciA6IFhGQV9BVFRSSUJVVEVfVHJhaWxlciwNCisgICAgICAgIHdzQm9va2VuZExlYWRlcik7DQorICAgIHBCb29rZW5kQXBwZW5kVGVtcGxhdGUgPQ0KKyAgICAgICAgWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBUUlVFLCB3c0Jvb2tlbmRMZWFkZXIpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotdm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OkNsZWFyRGF0YSgpDQotew0KLSAgICBDbGVhclJlY29yZExpc3QoKTsNCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6RmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXQoDQorICAgIENYRkFfTm9kZSogcFBhZ2VTZXQsDQorICAgIENYRkFfTm9kZSogcFN0YXJ0Q2hpbGQsDQorICAgIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhLA0KKyAgICBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSwNCisgICAgRlhfQk9PTCBiTmV3UGFnZSwNCisgICAgRlhfQk9PTCBiUXVlcnkpIHsNCisgIGlmIChwUGFnZVNldCA9PSBOVUxMICYmIHBTdGFydENoaWxkID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBpUGFnZVNldENvdW50ID0gMDsNCisgIGlmIChJc1BhZ2VTZXRSb290T3JkZXJlZE9jY3VycmVuY2UoKSkgew0KKyAgICByZXR1cm4gRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfT3JkZXJlZChwUGFnZVNldCwgcFN0YXJ0Q2hpbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUYXJnZXRQYWdlQXJlYSwgcFRhcmdldENvbnRlbnRBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmV3UGFnZSwgYlF1ZXJ5KTsNCisgIH0NCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVQcmVmZXJyZWRQb3NpdGlvbiA9IG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFhGQV9BVFRSSUJVVEVFTlVNX1Jlc3QNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0Ow0KKyAgcmV0dXJuIEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0X1NpbXBsZXhEdXBsZXgoDQorICAgICAgcFBhZ2VTZXQsIHBTdGFydENoaWxkLCBwVGFyZ2V0UGFnZUFyZWEsIHBUYXJnZXRDb250ZW50QXJlYSwgYk5ld1BhZ2UsDQorICAgICAgYlF1ZXJ5LCBlUHJlZmVycmVkUG9zaXRpb24pOw0KIH0NCi12b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6Q2xlYXJSZWNvcmRMaXN0KCkNCi17DQotICAgIGlmICghbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgew0KLSAgICAgICAgcmV0dXJuOw0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9PcmRlcmVkKA0KKyAgICBDWEZBX05vZGUqIHBQYWdlU2V0LA0KKyAgICBDWEZBX05vZGUqIHBTdGFydENoaWxkLA0KKyAgICBDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSwNCisgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEsDQorICAgIEZYX0JPT0wgYk5ld1BhZ2UsDQorICAgIEZYX0JPT0wgYlF1ZXJ5KSB7DQorICBpbnQzMl90IGlQYWdlU2V0Q291bnQgPSAwOw0KKyAgaWYgKCFwU3RhcnRDaGlsZCAmJiAhYlF1ZXJ5KSB7DQorICAgIG1fcFBhZ2VTZXRNYXAuTG9va3VwKHBQYWdlU2V0LCBpUGFnZVNldENvdW50KTsNCisgICAgaW50MzJfdCBpTWF4ID0gLTE7DQorICAgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IHBQYWdlU2V0LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQorICAgIGlmIChwT2NjdXJOb2RlKSB7DQorICAgICAgcE9jY3VyTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01heCwgaU1heCwgRkFMU0UpOw0KICAgICB9DQotICAgIGlmKG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRDb3VudCgpID4gMCkgew0KLSAgICAgICAgRlhfUE9TSVRJT04gc1BvczsNCi0gICAgICAgIHNQb3MgPSBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0SGVhZFBvc2l0aW9uKCk7DQotICAgICAgICB3aGlsZShzUG9zKSB7DQotICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBSZWNvcmQgPSAoQ1hGQV9Db250YWluZXJSZWNvcmQqKW1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXROZXh0KHNQb3MpOw0KLSAgICAgICAgICAgIGRlbGV0ZSBwUmVjb3JkOw0KKyAgICBpZiAoaU1heCA+PSAwICYmIGlNYXggPD0gaVBhZ2VTZXRDb3VudCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBiUmVzID0gRkFMU0U7DQorICBDWEZBX05vZGUqIHBDdXJyZW50Tm9kZSA9DQorICAgICAgcFN0YXJ0Q2hpbGQgPyBwU3RhcnRDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKQ0KKyAgICAgICAgICAgICAgICAgIDogcFBhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwQ3VycmVudE5vZGU7DQorICAgICAgIHBDdXJyZW50Tm9kZSA9IHBDdXJyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocEN1cnJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICBpZiAoKHBUYXJnZXRQYWdlQXJlYSA9PSBwQ3VycmVudE5vZGUgfHwgcFRhcmdldFBhZ2VBcmVhID09IE5VTEwpKSB7DQorICAgICAgICBpZiAocEN1cnJlbnROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgPT0NCisgICAgICAgICAgICBOVUxMKSB7DQorICAgICAgICAgIGlmIChwVGFyZ2V0UGFnZUFyZWEgPT0gcEN1cnJlbnROb2RlKSB7DQorICAgICAgICAgICAgQ3JlYXRlTWluUGFnZVJlY29yZChwQ3VycmVudE5vZGUsIFRSVUUpOw0KKyAgICAgICAgICAgIHBUYXJnZXRQYWdlQXJlYSA9IE5VTEw7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY29udGludWU7DQogICAgICAgICB9DQotICAgICAgICBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuUmVtb3ZlQWxsKCk7DQorICAgICAgICBpZiAoIWJRdWVyeSkgew0KKyAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9DQorICAgICAgICAgICAgICBDcmVhdGVDb250YWluZXJSZWNvcmQocEN1cnJlbnROb2RlLCBwU3RhcnRDaGlsZCA9PSBOVUxMKTsNCisgICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJyZW50Tm9kZSk7DQorICAgICAgICAgIGlmIChwVGFyZ2V0Q29udGVudEFyZWEgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBUYXJnZXRDb250ZW50QXJlYSA9DQorICAgICAgICAgICAgICAgIHBDdXJyZW50Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwVGFyZ2V0Q29udGVudEFyZWEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wQ3VyUGFnZUFyZWEgPSBwQ3VycmVudE5vZGU7DQorICAgICAgICBtX25DdXJQYWdlQ291bnQgPSAxOw0KKyAgICAgICAgYlJlcyA9IFRSVUU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaWYgKCFiUXVlcnkpIHsNCisgICAgICAgIENyZWF0ZU1pblBhZ2VSZWNvcmQocEN1cnJlbnROb2RlLCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHBDdXJyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICBpZiAoRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfT3JkZXJlZChwQ3VycmVudE5vZGUsIE5VTEwsIHBUYXJnZXRQYWdlQXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJRdWVyeSkpIHsNCisgICAgICAgIGJSZXMgPSBUUlVFOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmICghYlF1ZXJ5KSB7DQorICAgICAgICBDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKHBDdXJyZW50Tm9kZSwgVFJVRSk7DQorICAgICAgfQ0KICAgICB9DQotICAgIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPSBOVUxMOw0KLSAgICBtX3BDdXJQYWdlQXJlYSA9IE5VTEw7DQotICAgIG1fbkN1clBhZ2VDb3VudCA9IDA7DQotICAgIG1fYkNyZWF0ZU92ZXJGbG93UGFnZSA9IEZBTFNFOw0KLSAgICBtX3BQYWdlU2V0TWFwLlJlbW92ZUFsbCgpOw0KKyAgfQ0KKyAgaWYgKCFwU3RhcnRDaGlsZCAmJiBiUmVzICYmICFiUXVlcnkpIHsNCisgICAgbV9wUGFnZVNldE1hcC5TZXRBdChwUGFnZVNldCwgKytpUGFnZVNldENvdW50KTsNCisgIH0NCisgIHJldHVybiBiUmVzOw0KIH0NCi1DWEZBX0xheW91dEl0ZW1JbXBsKiBDWEZBX0xheW91dFBhZ2VNZ3I6OkZpbmRPckNyZWF0ZUxheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpDQotew0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9TaW1wbGV4RHVwbGV4KA0KKyAgICBDWEZBX05vZGUqIHBQYWdlU2V0LA0KKyAgICBDWEZBX05vZGUqIHBTdGFydENoaWxkLA0KKyAgICBDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSwNCisgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEsDQorICAgIEZYX0JPT0wgYk5ld1BhZ2UsDQorICAgIEZYX0JPT0wgYlF1ZXJ5LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlUHJlZmVycmVkUG9zaXRpb24pIHsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVBZHZpc2VkUGFnZVBvc2l0aW9uID0NCisgICAgICBwVGFyZ2V0UGFnZUFyZWEgPyBwVGFyZ2V0UGFnZUFyZWEtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24pDQorICAgICAgICAgICAgICAgICAgICAgIDogKFhGQV9BVFRSSUJVVEVFTlVNKS0xOw0KKyAgY29uc3QgWEZBX0FUVFJJQlVURUVOVU0gZUZhbGxiYWNrUG9zaXRpb24gPSBYRkFfQVRUUklCVVRFRU5VTV9Bbnk7DQorICBDWEZBX05vZGUgKnBQcmVmZXJyZWRQYWdlQXJlYSA9IE5VTEwsICpwRmFsbGJhY2tQYWdlQXJlYSA9IE5VTEw7DQorICBDWEZBX05vZGUqIHBDdXJyZW50Tm9kZSA9IE5VTEw7DQorICBpZiAoIXBTdGFydENoaWxkIHx8IHBTdGFydENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgcEN1cnJlbnROb2RlID0gcFBhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIH0gZWxzZSB7DQorICAgIHBDdXJyZW50Tm9kZSA9IHBTdGFydENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgZm9yICg7IHBDdXJyZW50Tm9kZTsNCisgICAgICAgcEN1cnJlbnROb2RlID0gcEN1cnJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwQ3VycmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgIGlmICghTWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihwQ3VycmVudE5vZGUsIEZBTFNFKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVDdXJQYWdlUG9zaXRpb24gPQ0KKyAgICAgICAgICBwQ3VycmVudE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24pOw0KKyAgICAgIGlmIChlUHJlZmVycmVkUG9zaXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fTGFzdCkgew0KKyAgICAgICAgaWYgKGVDdXJQYWdlUG9zaXRpb24gIT0gZVByZWZlcnJlZFBvc2l0aW9uKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fZVBhZ2VTZXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX1NpbXBsZXhQYWdpbmF0ZWQgfHwNCisgICAgICAgICAgICBwQ3VycmVudE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4pID09DQorICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0FueSkgew0KKyAgICAgICAgICBwUHJlZmVycmVkUGFnZUFyZWEgPSBwQ3VycmVudE5vZGU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCisgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VycmVudE5vZGUpOw0KKyAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJyZW50Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSk7DQorICAgICAgICBwUHJlZmVycmVkUGFnZUFyZWEgPSBwQ3VycmVudE5vZGU7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfSBlbHNlIGlmIChlUHJlZmVycmVkUG9zaXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fT25seSkgew0KKyAgICAgICAgaWYgKGVDdXJQYWdlUG9zaXRpb24gIT0gZVByZWZlcnJlZFBvc2l0aW9uKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fZVBhZ2VTZXRNb2RlICE9IFhGQV9BVFRSSUJVVEVFTlVNX0R1cGxleFBhZ2luYXRlZCB8fA0KKyAgICAgICAgICAgIHBDdXJyZW50Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX09kZE9yRXZlbikgPT0NCisgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fQW55KSB7DQorICAgICAgICAgIHBQcmVmZXJyZWRQYWdlQXJlYSA9IHBDdXJyZW50Tm9kZTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmICgocFRhcmdldFBhZ2VBcmVhID09IHBDdXJyZW50Tm9kZSB8fCBwVGFyZ2V0UGFnZUFyZWEgPT0gTlVMTCkpIHsNCisgICAgICAgIGlmIChwQ3VycmVudE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSA9PQ0KKyAgICAgICAgICAgIE5VTEwpIHsNCisgICAgICAgICAgaWYgKHBUYXJnZXRQYWdlQXJlYSA9PSBwQ3VycmVudE5vZGUpIHsNCisgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KKyAgICAgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VycmVudE5vZGUpOw0KKyAgICAgICAgICAgIHBUYXJnZXRQYWdlQXJlYSA9IE5VTEw7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoKGVQcmVmZXJyZWRQb3NpdGlvbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9SZXN0ICYmDQorICAgICAgICAgICAgIGVDdXJQYWdlUG9zaXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQW55KSB8fA0KKyAgICAgICAgICAgIGVDdXJQYWdlUG9zaXRpb24gPT0gZVByZWZlcnJlZFBvc2l0aW9uKSB7DQorICAgICAgICAgIHBQcmVmZXJyZWRQYWdlQXJlYSA9IHBDdXJyZW50Tm9kZTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2UgaWYgKGVDdXJQYWdlUG9zaXRpb24gPT0gZUZhbGxiYWNrUG9zaXRpb24gJiYNCisgICAgICAgICAgICAgICAgICAgIXBGYWxsYmFja1BhZ2VBcmVhKSB7DQorICAgICAgICAgIHBGYWxsYmFja1BhZ2VBcmVhID0gcEN1cnJlbnROb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAocFRhcmdldFBhZ2VBcmVhICYmDQorICAgICAgICAgICAgICAgICAhTWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihwVGFyZ2V0UGFnZUFyZWEsIEZBTFNFKSkgew0KKyAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCisgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VycmVudE5vZGUpOw0KKyAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJyZW50Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHBDdXJyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICBpZiAoRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleCgNCisgICAgICAgICAgICAgIHBDdXJyZW50Tm9kZSwgTlVMTCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLA0KKyAgICAgICAgICAgICAgYlF1ZXJ5LCBlUHJlZmVycmVkUG9zaXRpb24pKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIENYRkFfTm9kZSogcEN1clBhZ2VBcmVhID0gTlVMTDsNCisgIGlmIChwUHJlZmVycmVkUGFnZUFyZWEpIHsNCisgICAgcEN1clBhZ2VBcmVhID0gcFByZWZlcnJlZFBhZ2VBcmVhOw0KKyAgfSBlbHNlIGlmIChwRmFsbGJhY2tQYWdlQXJlYSkgew0KKyAgICBwQ3VyUGFnZUFyZWEgPSBwRmFsbGJhY2tQYWdlQXJlYTsNCisgIH0NCisgIGlmICghcEN1clBhZ2VBcmVhKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghYlF1ZXJ5KSB7DQorICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7DQorICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VyUGFnZUFyZWEpOw0KKyAgICBpZiAocFRhcmdldENvbnRlbnRBcmVhID09IE5VTEwpIHsNCisgICAgICBwVGFyZ2V0Q29udGVudEFyZWEgPQ0KKyAgICAgICAgICBwQ3VyUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgfQ0KKyAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcFRhcmdldENvbnRlbnRBcmVhKTsNCisgIH0NCisgIG1fcEN1clBhZ2VBcmVhID0gcEN1clBhZ2VBcmVhOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpNYXRjaFBhZ2VBcmVhT2RkT3JFdmVuKENYRkFfTm9kZSogcFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxhc3RNYXRjaCkgew0KKyAgaWYgKG1fZVBhZ2VTZXRNb2RlICE9IFhGQV9BVFRSSUJVVEVFTlVNX0R1cGxleFBhZ2luYXRlZCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVPZGRPckV2ZW4gPSBYRkFfQVRUUklCVVRFRU5VTV9Bbnk7DQorICBwUGFnZUFyZWEtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sIGVPZGRPckV2ZW4pOw0KKyAgaWYgKGVPZGRPckV2ZW4gIT0gWEZBX0FUVFJJQlVURUVOVU1fQW55KSB7DQorICAgIGludDMyX3QgaVBhZ2VDb3VudCA9IEdldFBhZ2VDb3VudCgpOw0KKyAgICBpZiAoYkxhc3RNYXRjaCkgew0KKyAgICAgIHJldHVybiBlT2RkT3JFdmVuID09IFhGQV9BVFRSSUJVVEVFTlVNX09kZCA/IGlQYWdlQ291bnQgJSAyID09IDENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpUGFnZUNvdW50ICUgMiA9PSAwOw0KKyAgICB9DQorICAgIHJldHVybiBlT2RkT3JFdmVuID09IFhGQV9BVFRSSUJVVEVFTlVNX09kZCA/IGlQYWdlQ291bnQgJSAyID09IDANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaVBhZ2VDb3VudCAlIDIgPT0gMTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitDWEZBX05vZGUqIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0TmV4dEF2YWlsUGFnZUFyZWEoDQorICAgIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhLA0KKyAgICBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSwNCisgICAgRlhfQk9PTCBiTmV3UGFnZSwNCisgICAgRlhfQk9PTCBiUXVlcnkpIHsNCisgIGlmIChtX3BDdXJQYWdlQXJlYSA9PSBOVUxMKSB7DQorICAgIEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0KG1fcFRlbXBsYXRlUGFnZVNldFJvb3QsIE5VTEwsIHBUYXJnZXRQYWdlQXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhLCBiTmV3UGFnZSwgYlF1ZXJ5KTsNCisgICAgQVNTRVJUKG1fcEN1clBhZ2VBcmVhKTsNCisgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KKyAgfQ0KKyAgaWYgKHBUYXJnZXRQYWdlQXJlYSA9PSBOVUxMIHx8IHBUYXJnZXRQYWdlQXJlYSA9PSBtX3BDdXJQYWdlQXJlYSkgew0KKyAgICBpZiAoIWJOZXdQYWdlICYmIEdldE5leHRDb250ZW50QXJlYShwVGFyZ2V0Q29udGVudEFyZWEpKSB7DQorICAgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KKyAgICB9DQorICAgIGlmIChJc1BhZ2VTZXRSb290T3JkZXJlZE9jY3VycmVuY2UoKSkgew0KKyAgICAgIGludDMyX3QgaU1heCA9IC0xOw0KKyAgICAgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9DQorICAgICAgICAgIG1fcEN1clBhZ2VBcmVhLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQorICAgICAgaWYgKHBPY2N1ck5vZGUpIHsNCisgICAgICAgIHBPY2N1ck5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NYXgsIGlNYXgsIEZBTFNFKTsNCisgICAgICB9DQorICAgICAgaWYgKChpTWF4IDwgMCB8fCBtX25DdXJQYWdlQ291bnQgPCBpTWF4KSkgew0KKyAgICAgICAgaWYgKCFiUXVlcnkpIHsNCisgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPQ0KKyAgICAgICAgICAgICAgQ3JlYXRlQ29udGFpbmVyUmVjb3JkKG1fcEN1clBhZ2VBcmVhKTsNCisgICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIG1fcEN1clBhZ2VBcmVhKTsNCisgICAgICAgICAgaWYgKHBUYXJnZXRDb250ZW50QXJlYSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhID0NCisgICAgICAgICAgICAgICAgbV9wQ3VyUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcFRhcmdldENvbnRlbnRBcmVhKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fbkN1clBhZ2VDb3VudCsrOw0KKyAgICAgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFiUXVlcnkgJiYgSXNQYWdlU2V0Um9vdE9yZGVyZWRPY2N1cnJlbmNlKCkpIHsNCisgICAgQ3JlYXRlTWluUGFnZVJlY29yZChtX3BDdXJQYWdlQXJlYSwgRkFMU0UsIFRSVUUpOw0KKyAgfQ0KKyAgaWYgKEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0KG1fcEN1clBhZ2VBcmVhLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJQYWdlQXJlYSwgcFRhcmdldFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUYXJnZXRDb250ZW50QXJlYSwgYk5ld1BhZ2UsIGJRdWVyeSkpIHsNCisgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IG1fcEN1clBhZ2VBcmVhLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGlmIChGaW5kUGFnZUFyZWFGcm9tUGFnZVNldChwUGFnZVNldCwgTlVMTCwgcFRhcmdldFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhLCBiTmV3UGFnZSwgYlF1ZXJ5KSkgew0KKyAgICAgIHJldHVybiBtX3BDdXJQYWdlQXJlYTsNCisgICAgfQ0KKyAgICBpZiAoIWJRdWVyeSAmJiBJc1BhZ2VTZXRSb290T3JkZXJlZE9jY3VycmVuY2UoKSkgew0KKyAgICAgIENyZWF0ZU1pblBhZ2VTZXRSZWNvcmQocFBhZ2VTZXQpOw0KKyAgICB9DQorICAgIGlmIChGaW5kUGFnZUFyZWFGcm9tUGFnZVNldChOVUxMLCBwUGFnZVNldCwgcFRhcmdldFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhLCBiTmV3UGFnZSwgYlF1ZXJ5KSkgew0KKyAgICAgIHJldHVybiBtX3BDdXJQYWdlQXJlYTsNCisgICAgfQ0KKyAgICBpZiAocFBhZ2VTZXQgPT0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHBQYWdlU2V0ID0gcFBhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9MYXlvdXRQYWdlTWdyX0NoZWNrQ29udGVudEFyZWFOb3RVc2VkKA0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZUFyZWFMYXlvdXRJdGVtLA0KKyAgICBDWEZBX05vZGUqIHBDb250ZW50QXJlYSwNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbComIHBDb250ZW50QXJlYUxheW91dEl0ZW0pIHsNCisgIGZvciAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgIHBMYXlvdXRJdGVtOw0KKyAgICAgICBwTGF5b3V0SXRlbSA9DQorICAgICAgICAgICAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgIGlmIChwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUgPT0gcENvbnRlbnRBcmVhKSB7DQorICAgICAgaWYgKHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkID09IE5VTEwpIHsNCisgICAgICAgIHBDb250ZW50QXJlYUxheW91dEl0ZW0gPSBwTGF5b3V0SXRlbTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0TmV4dENvbnRlbnRBcmVhKENYRkFfTm9kZSogcENvbnRlbnRBcmVhKSB7DQorICBDWEZBX05vZGUqIHBDdXJDb250ZW50Tm9kZSA9DQorICAgICAgR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyQ29udGVudEFyZWEtPm1fcEZvcm1Ob2RlOw0KKyAgaWYgKHBDb250ZW50QXJlYSA9PSBOVUxMKSB7DQorICAgIHBDb250ZW50QXJlYSA9DQorICAgICAgICBwQ3VyQ29udGVudE5vZGUtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgaWYgKHBDb250ZW50QXJlYSA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAocENvbnRlbnRBcmVhLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSAhPSBtX3BDdXJQYWdlQXJlYSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ29udGVudEFyZWFMYXlvdXQgPSBOVUxMOw0KKyAgICBpZiAoIVhGQV9MYXlvdXRQYWdlTWdyX0NoZWNrQ29udGVudEFyZWFOb3RVc2VkKA0KKyAgICAgICAgICAgIEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1clBhZ2VBcmVhLCBwQ29udGVudEFyZWEsDQorICAgICAgICAgICAgcENvbnRlbnRBcmVhTGF5b3V0KSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAocENvbnRlbnRBcmVhTGF5b3V0KSB7DQorICAgICAgaWYgKHBDb250ZW50QXJlYUxheW91dC0+bV9wRm9ybU5vZGUgIT0gcEN1ckNvbnRlbnROb2RlKSB7DQorICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KKyAgICAgICAgcE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhID0gcENvbnRlbnRBcmVhTGF5b3V0Ow0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7DQorICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcENvbnRlbnRBcmVhKTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6SW5pdFBhZ2VTZXRNYXAoKSB7DQorICBpZiAoIUlzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZUl0ZXJhdG9yIHNJdGVyYXRvcihtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KTsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwUGFnZVNldE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwUGFnZVNldE5vZGU7DQorICAgICAgIHBQYWdlU2V0Tm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgaWYgKHBQYWdlU2V0Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlUmVsYXRpb24gPQ0KKyAgICAgICAgICBwUGFnZVNldE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9SZWxhdGlvbik7DQorICAgICAgaWYgKGVSZWxhdGlvbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZSkgew0KKyAgICAgICAgbV9wUGFnZVNldE1hcC5TZXRBdChwUGFnZVNldE5vZGUsIDApOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCitpbnQzMl90IENYRkFfTGF5b3V0UGFnZU1ncjo6Q3JlYXRlTWluUGFnZVJlY29yZChDWEZBX05vZGUqIHBQYWdlQXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUYXJnZXRQYWdlQXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDcmVhdGVMYXN0KSB7DQorICBpZiAocFBhZ2VBcmVhID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBDWEZBX05vZGUqIHBPY2N1ck5vZGUgPSBwUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX09jY3VyKTsNCisgIGludDMyX3QgaU1pbiA9IDA7DQorICBpZiAoKHBPY2N1ck5vZGUgJiYgcE9jY3VyTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01pbiwgaU1pbiwgRkFMU0UpKSB8fA0KKyAgICAgIGJUYXJnZXRQYWdlQXJlYSkgew0KKyAgICBDWEZBX05vZGUqIHBDb250ZW50QXJlYSA9DQorICAgICAgICBwUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgaWYgKGlNaW4gPCAxICYmIGJUYXJnZXRQYWdlQXJlYSAmJiAhcENvbnRlbnRBcmVhKSB7DQorICAgICAgaU1pbiA9IDE7DQorICAgIH0NCisgICAgaW50MzJfdCBpID0gMDsNCisgICAgaWYgKGJDcmVhdGVMYXN0KSB7DQorICAgICAgaSA9IG1fbkN1clBhZ2VDb3VudDsNCisgICAgfQ0KKyAgICBmb3IgKDsgaSA8IGlNaW47IGkrKykgew0KKyAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7DQorICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBQYWdlQXJlYSk7DQorICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDb250ZW50QXJlYSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpTWluOw0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6Q3JlYXRlTWluUGFnZVNldFJlY29yZChDWEZBX05vZGUqIHBQYWdlU2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZUFsbCkgew0KKyAgaWYgKHBQYWdlU2V0ID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ3VyU2V0Q291bnQgPSAwOw0KKyAgaWYgKCFtX3BQYWdlU2V0TWFwLkxvb2t1cChwUGFnZVNldCwgaUN1clNldENvdW50KSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYkNyZWF0ZUFsbCkgew0KKyAgICBpQ3VyU2V0Q291bnQgPSAwOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwT2NjdXJOb2RlID0gcFBhZ2VTZXQtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX09jY3VyKTsNCisgIGludDMyX3QgaU1pbiA9IDA7DQorICBpZiAocE9jY3VyTm9kZSAmJiBwT2NjdXJOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWluLCBpTWluLCBGQUxTRSkpIHsNCisgICAgaWYgKGlDdXJTZXRDb3VudCA8IGlNaW4pIHsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTWluIC0gaUN1clNldENvdW50OyBpKyspIHsNCisgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwQ3VycmVudFBhZ2VOb2RlID0NCisgICAgICAgICAgICAgICAgIHBQYWdlU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgIHBDdXJyZW50UGFnZU5vZGU7IHBDdXJyZW50UGFnZU5vZGUgPSBwQ3VycmVudFBhZ2VOb2RlLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgaWYgKHBDdXJyZW50UGFnZU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgICAgICAgIENyZWF0ZU1pblBhZ2VSZWNvcmQocEN1cnJlbnRQYWdlTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHBDdXJyZW50UGFnZU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgICAgICAgQ3JlYXRlTWluUGFnZVNldFJlY29yZChwQ3VycmVudFBhZ2VOb2RlLCBUUlVFKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBtX3BQYWdlU2V0TWFwLlNldEF0KHBQYWdlU2V0LCBpTWluKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6Q3JlYXRlTmV4dE1pblJlY29yZChDWEZBX05vZGUqIHBSZWNvcmROb2RlKSB7DQorICBpZiAocFJlY29yZE5vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBmb3IgKENYRkFfTm9kZSogcEN1cnJlbnROb2RlID0NCisgICAgICAgICAgIHBSZWNvcmROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICBwQ3VycmVudE5vZGU7DQorICAgICAgIHBDdXJyZW50Tm9kZSA9IHBDdXJyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocEN1cnJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICBDcmVhdGVNaW5QYWdlUmVjb3JkKHBDdXJyZW50Tm9kZSwgRkFMU0UpOw0KKyAgICB9IGVsc2UgaWYgKHBDdXJyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICBDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKHBDdXJyZW50Tm9kZSwgVFJVRSk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OlByb2Nlc3NMYXN0UGFnZVNldCgpIHsNCisgIENyZWF0ZU1pblBhZ2VSZWNvcmQobV9wQ3VyUGFnZUFyZWEsIEZBTFNFLCBUUlVFKTsNCisgIENyZWF0ZU5leHRNaW5SZWNvcmQobV9wQ3VyUGFnZUFyZWEpOw0KKyAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IG1fcEN1clBhZ2VBcmVhLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIENyZWF0ZU1pblBhZ2VTZXRSZWNvcmQocFBhZ2VTZXQpOw0KKyAgICBpZiAocFBhZ2VTZXQgPT0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIENyZWF0ZU5leHRNaW5SZWNvcmQocFBhZ2VTZXQpOw0KKyAgICBwUGFnZVNldCA9IHBQYWdlU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OkdldE5leHRBdmFpbENvbnRlbnRIZWlnaHQoRlhfRkxPQVQgZkNoaWxkSGVpZ2h0KSB7DQorICBDWEZBX05vZGUqIHBDdXJDb250ZW50Tm9kZSA9DQorICAgICAgR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyQ29udGVudEFyZWEtPm1fcEZvcm1Ob2RlOw0KKyAgaWYgKHBDdXJDb250ZW50Tm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHBDdXJDb250ZW50Tm9kZSA9DQorICAgICAgcEN1ckNvbnRlbnROb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQorICBpZiAocEN1ckNvbnRlbnROb2RlKSB7DQorICAgIEZYX0ZMT0FUIGZOZXh0Q29udGVudEhlaWdodCA9DQorICAgICAgICBwQ3VyQ29udGVudE5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9IKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICByZXR1cm4gZk5leHRDb250ZW50SGVpZ2h0ID4gZkNoaWxkSGVpZ2h0ID8gVFJVRSA6IEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUGFnZU5vZGUgPSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlQXJlYS0+bV9wRm9ybU5vZGU7DQorICBDWEZBX05vZGUqIHBPY2N1ck5vZGUgPSBwUGFnZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX09jY3VyKTsNCisgIGludDMyX3QgaU1heCA9IDA7DQorICBpZiAocE9jY3VyTm9kZSAmJiBwT2NjdXJOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBGQUxTRSkpIHsNCisgICAgaWYgKG1fbkN1clBhZ2VDb3VudCA9PSBpTWF4KSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwU3JjUGFnZSA9IG1fcEN1clBhZ2VBcmVhOw0KKyAgICAgIGludDMyX3QgblNyY1BhZ2VDb3VudCA9IG1fbkN1clBhZ2VDb3VudDsNCisgICAgICBGWF9QT1NJVElPTiBwc1NyY1JlY29yZCA9IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRUYWlsUG9zaXRpb24oKTsNCisgICAgICBDWEZBX05vZGUqIHBOZXh0UGFnZSA9IEdldE5leHRBdmFpbFBhZ2VBcmVhKE5VTEwsIE5VTEwsIEZBTFNFLCBUUlVFKTsNCisgICAgICBtX3BDdXJQYWdlQXJlYSA9IHBTcmNQYWdlOw0KKyAgICAgIG1fbkN1clBhZ2VDb3VudCA9IG5TcmNQYWdlQ291bnQ7DQorICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBQcmV2UmVjb3JkID0NCisgICAgICAgICAgKENYRkFfQ29udGFpbmVyUmVjb3JkKiltX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0TmV4dCgNCisgICAgICAgICAgICAgIHBzU3JjUmVjb3JkKTsNCisgICAgICB3aGlsZSAocHNTcmNSZWNvcmQpIHsNCisgICAgICAgIEZYX1BPU0lUSU9OIHBzU2F2ZVJlY29yZCA9IHBzU3JjUmVjb3JkOw0KKyAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBJbnNlcnRSZWNvcmQgPQ0KKyAgICAgICAgICAgIChDWEZBX0NvbnRhaW5lclJlY29yZCopbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldE5leHQoDQorICAgICAgICAgICAgICAgIHBzU3JjUmVjb3JkKTsNCisgICAgICAgIFJlbW92ZUxheW91dFJlY29yZChwSW5zZXJ0UmVjb3JkLCBwUHJldlJlY29yZCk7DQorICAgICAgICBkZWxldGUgcEluc2VydFJlY29yZDsNCisgICAgICAgIG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5SZW1vdmVBdChwc1NhdmVSZWNvcmQpOw0KKyAgICAgIH0NCisgICAgICBpZiAocE5leHRQYWdlKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBDb250ZW50QXJlYSA9DQorICAgICAgICAgICAgcE5leHRQYWdlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQorICAgICAgICBpZiAocENvbnRlbnRBcmVhKSB7DQorICAgICAgICAgIEZYX0ZMT0FUIGZOZXh0Q29udGVudEhlaWdodCA9DQorICAgICAgICAgICAgICBwQ29udGVudEFyZWEtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9IKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgICBpZiAoZk5leHRDb250ZW50SGVpZ2h0ID4gZkNoaWxkSGVpZ2h0KSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICBDWEZBX05vZGUqIHBDb250ZW50QXJlYSA9DQorICAgICAgcFBhZ2VOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQorICBGWF9GTE9BVCBmTmV4dENvbnRlbnRIZWlnaHQgPQ0KKyAgICAgIHBDb250ZW50QXJlYS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0gpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICBpZiAoZk5leHRDb250ZW50SGVpZ2h0IDwgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAoZk5leHRDb250ZW50SGVpZ2h0ID4gZkNoaWxkSGVpZ2h0KSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6Q2xlYXJEYXRhKCkgew0KKyAgQ2xlYXJSZWNvcmRMaXN0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpDbGVhclJlY29yZExpc3QoKSB7DQorICBpZiAoIW1fcFRlbXBsYXRlUGFnZVNldFJvb3QpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRDb3VudCgpID4gMCkgew0KKyAgICBGWF9QT1NJVElPTiBzUG9zOw0KKyAgICBzUG9zID0gbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldEhlYWRQb3NpdGlvbigpOw0KKyAgICB3aGlsZSAoc1Bvcykgew0KKyAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwUmVjb3JkID0NCisgICAgICAgICAgKENYRkFfQ29udGFpbmVyUmVjb3JkKiltX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0TmV4dChzUG9zKTsNCisgICAgICBkZWxldGUgcFJlY29yZDsNCisgICAgfQ0KKyAgICBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuUmVtb3ZlQWxsKCk7DQorICB9DQorICBtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkID0gTlVMTDsNCisgIG1fcEN1clBhZ2VBcmVhID0gTlVMTDsNCisgIG1fbkN1clBhZ2VDb3VudCA9IDA7DQorICBtX2JDcmVhdGVPdmVyRmxvd1BhZ2UgPSBGQUxTRTsNCisgIG1fcFBhZ2VTZXRNYXAuUmVtb3ZlQWxsKCk7DQorfQ0KK0NYRkFfTGF5b3V0SXRlbUltcGwqIENYRkFfTGF5b3V0UGFnZU1ncjo6RmluZE9yQ3JlYXRlTGF5b3V0SXRlbSgNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpIHsNCiAjaWYgZGVmaW5lZChfWEZBX0xBWU9VVElURU1fTUFQQ0FDSEVfKQ0KLSAgICBpZiAobV9Ob2RlVG9Db250ZW50LkdldENvdW50KCkgPiAwKSB7DQotICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0gPSBOVUxMOw0KLSAgICAgICAgaWYgKG1fTm9kZVRvQ29udGVudC5Mb29rdXAocEZvcm1Ob2RlLCAodm9pZComKXBMYXlvdXRJdGVtKSkgew0KLSAgICAgICAgICAgIGlmIChwTGF5b3V0SXRlbS0+bV9wTmV4dCkgew0KLSAgICAgICAgICAgICAgICBtX05vZGVUb0NvbnRlbnQuU2V0QXQocEZvcm1Ob2RlLCBwTGF5b3V0SXRlbS0+bV9wTmV4dCk7DQotICAgICAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5tX3BOZXh0LT5tX3BQcmV2ID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgcExheW91dEl0ZW0tPm1fcE5leHQgPSBOVUxMOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIG1fTm9kZVRvQ29udGVudC5SZW1vdmVLZXkocEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlID0gcEZvcm1Ob2RlOw0KLSAgICAgICAgICAgIHJldHVybiBwTGF5b3V0SXRlbTsNCi0gICAgICAgIH0NCisgIGlmIChtX05vZGVUb0NvbnRlbnQuR2V0Q291bnQoKSA+IDApIHsNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtID0gTlVMTDsNCisgICAgaWYgKG1fTm9kZVRvQ29udGVudC5Mb29rdXAocEZvcm1Ob2RlLCAodm9pZComKXBMYXlvdXRJdGVtKSkgew0KKyAgICAgIGlmIChwTGF5b3V0SXRlbS0+bV9wTmV4dCkgew0KKyAgICAgICAgbV9Ob2RlVG9Db250ZW50LlNldEF0KHBGb3JtTm9kZSwgcExheW91dEl0ZW0tPm1fcE5leHQpOw0KKyAgICAgICAgcExheW91dEl0ZW0tPm1fcE5leHQtPm1fcFByZXYgPSBOVUxMOw0KKyAgICAgICAgcExheW91dEl0ZW0tPm1fcE5leHQgPSBOVUxMOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX05vZGVUb0NvbnRlbnQuUmVtb3ZlS2V5KHBGb3JtTm9kZSk7DQorICAgICAgfQ0KKyAgICAgIHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSA9IHBGb3JtTm9kZTsNCisgICAgICByZXR1cm4gcExheW91dEl0ZW07DQogICAgIH0NCisgIH0NCiAjZW5kaWYNCi0gICAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW1JbXBsKilwRm9ybU5vZGUtPkdldERvY3VtZW50KCktPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKS0+T25DcmVhdGVMYXlvdXRJdGVtKHBGb3JtTm9kZSk7DQorICByZXR1cm4gKENYRkFfTGF5b3V0SXRlbUltcGwqKXBGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKQ0KKyAgICAgIC0+R2V0UGFyc2VyKCkNCisgICAgICAtPkdldE5vdGlmeSgpDQorICAgICAgLT5PbkNyZWF0ZUxheW91dEl0ZW0ocEZvcm1Ob2RlKTsNCiB9DQogI2lmIGRlZmluZWQoX1hGQV9MQVlPVVRJVEVNX01BUENBQ0hFXykNCi12b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6U2F2ZUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtSW1wbCogcFBhcmVudExheW91dEl0ZW0pDQotew0KLSAgICBDWEZBX0xheW91dEl0ZW1JbXBsICpwTmV4dExheW91dEl0ZW0sICpwQ3VyTGF5b3V0SXRlbSA9IHBQYXJlbnRMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KLSAgICB3aGlsZSAocEN1ckxheW91dEl0ZW0pIHsNCi0gICAgICAgIHBOZXh0TGF5b3V0SXRlbSA9IHBDdXJMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCi0gICAgICAgIGlmIChwQ3VyTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCkgew0KLSAgICAgICAgICAgIFNhdmVMYXlvdXRJdGVtKHBDdXJMYXlvdXRJdGVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwQ3VyTGF5b3V0SXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQotICAgICAgICAgICAgaWYgKG1fTm9kZVRvQ29udGVudC5HZXRWYWx1ZUF0KHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSkgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBwQ3VyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPlNldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZLCBOVUxMKTsNCi0gICAgICAgICAgICAgICAgbV9Ob2RlVG9Db250ZW50LlNldEF0KHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSwgcEN1ckxheW91dEl0ZW0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAocEN1ckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCi0gICAgICAgICAgICBkZWxldGUgcEN1ckxheW91dEl0ZW07DQotICAgICAgICAgICAgcEN1ckxheW91dEl0ZW0gPSBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBDdXJMYXlvdXRJdGVtKSB7DQotICAgICAgICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcFBhcmVudCA9IE5VTEw7DQotICAgICAgICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCi0gICAgICAgICAgICBwQ3VyTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCA9IE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBwQ3VyTGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0SXRlbTsNCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6U2F2ZUxheW91dEl0ZW0oDQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRMYXlvdXRJdGVtKSB7DQorICBDWEZBX0xheW91dEl0ZW1JbXBsICpwTmV4dExheW91dEl0ZW0sDQorICAgICAgKnBDdXJMYXlvdXRJdGVtID0gcFBhcmVudExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICB3aGlsZSAocEN1ckxheW91dEl0ZW0pIHsNCisgICAgcE5leHRMYXlvdXRJdGVtID0gcEN1ckxheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICBpZiAocEN1ckxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQpIHsNCisgICAgICBTYXZlTGF5b3V0SXRlbShwQ3VyTGF5b3V0SXRlbSk7DQogICAgIH0NCisgICAgaWYgKHBDdXJMYXlvdXRJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICBpZiAobV9Ob2RlVG9Db250ZW50LkdldFZhbHVlQXQocEN1ckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlKSA9PSBOVUxMKSB7DQorICAgICAgICBwQ3VyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPlNldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZLCBOVUxMKTsNCisgICAgICAgIG1fTm9kZVRvQ29udGVudC5TZXRBdChwQ3VyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUsIHBDdXJMYXlvdXRJdGVtKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAocEN1ckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0NCisgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgIGRlbGV0ZSBwQ3VyTGF5b3V0SXRlbTsNCisgICAgICBwQ3VyTGF5b3V0SXRlbSA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKHBDdXJMYXlvdXRJdGVtKSB7DQorICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcFBhcmVudCA9IE5VTEw7DQorICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCisgICAgICBwQ3VyTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCA9IE5VTEw7DQorICAgIH0NCisgICAgcEN1ckxheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07DQorICB9DQogfQ0KICNlbGlmIGRlZmluZWQoX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8pDQotc3RhdGljIHZvaWQgWEZBX1N5bmNSZW1vdmVMYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRMYXlvdXRJdGVtLCBJWEZBX05vdGlmeSogcE5vdGlmeSwgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQpDQotew0KLSAgICBDWEZBX0xheW91dEl0ZW1JbXBsICpwTmV4dExheW91dEl0ZW0sICpwQ3VyTGF5b3V0SXRlbSA9IHBQYXJlbnRMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KLSAgICB3aGlsZSAocEN1ckxheW91dEl0ZW0pIHsNCi0gICAgICAgIHBOZXh0TGF5b3V0SXRlbSA9IHBDdXJMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCitzdGF0aWMgdm9pZCBYRkFfU3luY1JlbW92ZUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtSW1wbCogcFBhcmVudExheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCkgew0KKyAgQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcE5leHRMYXlvdXRJdGVtLA0KKyAgICAgICpwQ3VyTGF5b3V0SXRlbSA9IHBQYXJlbnRMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgd2hpbGUgKHBDdXJMYXlvdXRJdGVtKSB7DQorICAgIHBOZXh0TGF5b3V0SXRlbSA9IHBDdXJMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgaWYgKHBDdXJMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkKSB7DQorICAgICAgWEZBX1N5bmNSZW1vdmVMYXlvdXRJdGVtKHBDdXJMYXlvdXRJdGVtLCBwTm90aWZ5LCBwRG9jTGF5b3V0KTsNCisgICAgfQ0KKyAgICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KHBEb2NMYXlvdXQsIChDWEZBX0xheW91dEl0ZW0qKXBDdXJMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICBkZWxldGUgcEN1ckxheW91dEl0ZW07DQorICAgIHBDdXJMYXlvdXRJdGVtID0gcE5leHRMYXlvdXRJdGVtOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6U2F2ZUxheW91dEl0ZW0oDQorICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRMYXlvdXRJdGVtKSB7DQorICBDWEZBX0xheW91dEl0ZW1JbXBsICpwTmV4dExheW91dEl0ZW0sDQorICAgICAgKnBDdXJMYXlvdXRJdGVtID0gcFBhcmVudExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICB3aGlsZSAocEN1ckxheW91dEl0ZW0pIHsNCisgICAgcE5leHRMYXlvdXRJdGVtID0gcEN1ckxheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICBpZiAocEN1ckxheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RmxhZygpOw0KKyAgICAgIGlmIChkd0ZsYWcgJiAoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9DQorICAgICAgICAgICAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPQ0KKyAgICAgICAgICAgIG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldERvY3VtZW50KCktPkdldERvY0xheW91dCgpOw0KICAgICAgICAgaWYgKHBDdXJMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkKSB7DQotICAgICAgICAgICAgWEZBX1N5bmNSZW1vdmVMYXlvdXRJdGVtKHBDdXJMYXlvdXRJdGVtLCBwTm90aWZ5LCBwRG9jTGF5b3V0KTsNCisgICAgICAgICAgWEZBX1N5bmNSZW1vdmVMYXlvdXRJdGVtKHBDdXJMYXlvdXRJdGVtLCBwTm90aWZ5LCBwRG9jTGF5b3V0KTsNCiAgICAgICAgIH0NCi0gICAgICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwgKENYRkFfTGF5b3V0SXRlbSopcEN1ckxheW91dEl0ZW0sIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgICAgcE5vdGlmeS0+T25MYXlvdXRFdmVudChwRG9jTGF5b3V0LCAoQ1hGQV9MYXlvdXRJdGVtKilwQ3VyTGF5b3V0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xBWU9VVEVWRU5UX0l0ZW1SZW1vdmluZyk7DQogICAgICAgICBkZWxldGUgcEN1ckxheW91dEl0ZW07DQogICAgICAgICBwQ3VyTGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0SXRlbTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoZHdGbGFnICYgWEZBX05PREVGTEFHX0xheW91dEdlbmVyYXRlZE5vZGUpIHsNCisgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4NCisgICAgICAgICAgICBzSXRlcmF0b3IocEN1ckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlKTsNCisgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBOb2RlOw0KKyAgICAgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi19DQotdm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OlNhdmVMYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRMYXlvdXRJdGVtKQ0KLXsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcE5leHRMYXlvdXRJdGVtLCAqcEN1ckxheW91dEl0ZW0gPSBwUGFyZW50TGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCi0gICAgd2hpbGUgKHBDdXJMYXlvdXRJdGVtKSB7DQotICAgICAgICBwTmV4dExheW91dEl0ZW0gPSBwQ3VyTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgICAgICBpZiAocEN1ckxheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KLSAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RmxhZygpOw0KLSAgICAgICAgICAgIGlmIChkd0ZsYWcgJiAoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQotICAgICAgICAgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgICAgICAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldERvY3VtZW50KCktPkdldERvY0xheW91dCgpOw0KLSAgICAgICAgICAgICAgICBpZiAocEN1ckxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQpIHsNCi0gICAgICAgICAgICAgICAgICAgIFhGQV9TeW5jUmVtb3ZlTGF5b3V0SXRlbShwQ3VyTGF5b3V0SXRlbSwgcE5vdGlmeSwgcERvY0xheW91dCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcE5vdGlmeS0+T25MYXlvdXRFdmVudChwRG9jTGF5b3V0LCAoQ1hGQV9MYXlvdXRJdGVtKilwQ3VyTGF5b3V0SXRlbSwgWEZBX0xBWU9VVEVWRU5UX0l0ZW1SZW1vdmluZyk7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBwQ3VyTGF5b3V0SXRlbTsNCi0gICAgICAgICAgICAgICAgcEN1ckxheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZHdGbGFnICYgWEZBX05PREVGTEFHX0xheW91dEdlbmVyYXRlZE5vZGUpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlPiBzSXRlcmF0b3IocEN1ckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICAgICAgZm9yKENYRkFfTm9kZSAqcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgVFJVRSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBDdXJMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkKSB7DQotICAgICAgICAgICAgU2F2ZUxheW91dEl0ZW0ocEN1ckxheW91dEl0ZW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcFBhcmVudCA9IE5VTEw7DQotICAgICAgICBwQ3VyTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBOVUxMOw0KLSAgICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPSBOVUxMOw0KLSAgICAgICAgaWYgKCFwQ3VyTGF5b3V0SXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpICYmIHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQotICAgICAgICAgICAgZGVsZXRlIHBDdXJMYXlvdXRJdGVtOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcEN1ckxheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07DQorICAgIGlmIChwQ3VyTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCkgew0KKyAgICAgIFNhdmVMYXlvdXRJdGVtKHBDdXJMYXlvdXRJdGVtKTsNCiAgICAgfQ0KKyAgICBwQ3VyTGF5b3V0SXRlbS0+bV9wUGFyZW50ID0gTlVMTDsNCisgICAgcEN1ckxheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCisgICAgcEN1ckxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPSBOVUxMOw0KKyAgICBpZiAoIXBDdXJMYXlvdXRJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkgJiYNCisgICAgICAgIHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgZGVsZXRlIHBDdXJMYXlvdXRJdGVtOw0KKyAgICB9DQorICAgIHBDdXJMYXlvdXRJdGVtID0gcE5leHRMYXlvdXRJdGVtOw0KKyAgfQ0KIH0NCiAjZW5kaWYNCi1DWEZBX05vZGUqIENYRkFfTGF5b3V0UGFnZU1ncjo6UXVlcnlPdmVyZmxvdyhDWEZBX05vZGUqIHBGb3JtTm9kZSwgQ1hGQV9MYXlvdXRDb250ZXh0KiBwTGF5b3V0Q29udGV4dCkNCi17DQotICAgIGZvcihDWEZBX05vZGUqIHBDdXJOb2RlID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDdXJOb2RlOyBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5HZXROb2RlSXRlbSgoWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkpIHsNCi0gICAgICAgIGlmKHBDdXJOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQnJlYWspIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd0xlYWRlcjsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd1RhcmdldDsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd1RyYWlsZXI7DQotICAgICAgICAgICAgcEN1ck5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dMZWFkZXIsIHdzT3ZlcmZsb3dMZWFkZXIpOw0KLSAgICAgICAgICAgIHBDdXJOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93VHJhaWxlciwgd3NPdmVyZmxvd1RyYWlsZXIpOw0KLSAgICAgICAgICAgIHBDdXJOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93VGFyZ2V0LCB3c092ZXJmbG93VGFyZ2V0KTsNCi0gICAgICAgICAgICBpZiAoIXdzT3ZlcmZsb3dMZWFkZXIuSXNFbXB0eSgpIHx8ICF3c092ZXJmbG93VHJhaWxlci5Jc0VtcHR5KCkgfHwgIXdzT3ZlcmZsb3dUYXJnZXQuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwQ3VyTm9kZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9IGVsc2UgaWYocEN1ck5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9PdmVyZmxvdykgew0KLSAgICAgICAgICAgIHJldHVybiBwQ3VyTm9kZTsNCi0gICAgICAgIH0NCitDWEZBX05vZGUqIENYRkFfTGF5b3V0UGFnZU1ncjo6UXVlcnlPdmVyZmxvdygNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsDQorICAgIENYRkFfTGF5b3V0Q29udGV4dCogcExheW91dENvbnRleHQpIHsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwQ3VyTm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICBwQ3VyTm9kZTsgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+R2V0Tm9kZUl0ZW0oKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpKSB7DQorICAgIGlmIChwQ3VyTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0JyZWFrKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dMZWFkZXI7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dUYXJnZXQ7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dUcmFpbGVyOw0KKyAgICAgIHBDdXJOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLCB3c092ZXJmbG93TGVhZGVyKTsNCisgICAgICBwQ3VyTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsIHdzT3ZlcmZsb3dUcmFpbGVyKTsNCisgICAgICBwQ3VyTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwgd3NPdmVyZmxvd1RhcmdldCk7DQorICAgICAgaWYgKCF3c092ZXJmbG93TGVhZGVyLklzRW1wdHkoKSB8fCAhd3NPdmVyZmxvd1RyYWlsZXIuSXNFbXB0eSgpIHx8DQorICAgICAgICAgICF3c092ZXJmbG93VGFyZ2V0LklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIHBDdXJOb2RlOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfSBlbHNlIGlmIChwQ3VyTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX092ZXJmbG93KSB7DQorICAgICAgcmV0dXJuIHBDdXJOb2RlOw0KICAgICB9DQotICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLXZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpNZXJnZVBhZ2VTZXRDb250ZW50cygpDQotew0KLSAgICBDWEZBX0RvY3VtZW50ICpwRG9jdW1lbnQgPSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5HZXREb2N1bWVudCgpOw0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IHBEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IHBEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQotICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBSb290TGF5b3V0ID0gdGhpcy0+R2V0Um9vdExheW91dEl0ZW0oKTsNCi0gICAgew0KLSAgICAgICAgZm9yKGludDMyX3QgaUluZGV4ID0gMDsgaUluZGV4IDwgcERvY3VtZW50LT5tX3BQZW5kaW5nUGFnZVNldC5HZXRTaXplKCk7IGlJbmRleCArKykgew0KLSAgICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4gc0l0ZXJhdG9yKHBEb2N1bWVudC0+bV9wUGVuZGluZ1BhZ2VTZXQuR2V0QXQoaUluZGV4KSk7DQotICAgICAgICAgICAgZm9yKENYRkFfTm9kZSAqcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgIGlmKHBOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmluZE5vZGUgPSBwTm9kZS0+R2V0QmluZERhdGEoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQmluZE5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwQmluZE5vZGUtPlJlbW92ZUJpbmRJdGVtKHBOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIE5VTEwpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpNZXJnZVBhZ2VTZXRDb250ZW50cygpIHsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldERvY3VtZW50KCk7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IHBEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBwRG9jdW1lbnQtPkdldERvY0xheW91dCgpOw0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFJvb3RMYXlvdXQgPSB0aGlzLT5HZXRSb290TGF5b3V0SXRlbSgpOw0KKyAgew0KKyAgICBmb3IgKGludDMyX3QgaUluZGV4ID0gMDsgaUluZGV4IDwgcERvY3VtZW50LT5tX3BQZW5kaW5nUGFnZVNldC5HZXRTaXplKCk7DQorICAgICAgICAgaUluZGV4KyspIHsNCisgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+DQorICAgICAgICAgIHNJdGVyYXRvcihwRG9jdW1lbnQtPm1fcFBlbmRpbmdQYWdlU2V0LkdldEF0KGlJbmRleCkpOw0KKyAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBOb2RlOw0KKyAgICAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICBpZiAocE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7DQorICAgICAgICAgIENYRkFfTm9kZSogcEJpbmROb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgICAgIGlmIChwQmluZE5vZGUpIHsNCisgICAgICAgICAgICBwQmluZE5vZGUtPlJlbW92ZUJpbmRJdGVtKHBOb2RlKTsNCisgICAgICAgICAgICBwTm9kZS0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIE5VTEwpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBDWEZBX05vZGUqIHBQZW5kaW5nUGFnZVNldCA9IE5VTEw7DQorICBmb3IgKDsgcFJvb3RMYXlvdXQ7DQorICAgICAgIHBSb290TGF5b3V0ID0NCisgICAgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUm9vdExheW91dC0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgcFBlbmRpbmdQYWdlU2V0ID0gTlVMTDsNCisgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTwNCisgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwsDQorICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudEFyZWFDb250YWluZXJMYXlvdXRJdGVtPg0KKyAgICAgICAgaXRlcmF0b3IocFJvb3RMYXlvdXQpOw0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtID0NCisgICAgICAgIGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgICAgQVNTRVJUKHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0NCisgICAgICAgICAgIFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KKyAgICBpZiAoaUluZGV4IDwgcERvY3VtZW50LT5tX3BQZW5kaW5nUGFnZVNldC5HZXRTaXplKCkpIHsNCisgICAgICBwUGVuZGluZ1BhZ2VTZXQgPSBwRG9jdW1lbnQtPm1fcFBlbmRpbmdQYWdlU2V0LkdldEF0KGlJbmRleCk7DQorICAgICAgaUluZGV4Kys7DQorICAgIH0NCisgICAgaWYgKCFwUGVuZGluZ1BhZ2VTZXQpIHsNCisgICAgICBpZiAocFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldFBhY2tldElEKCkgPT0NCisgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSkgew0KKyAgICAgICAgcFBlbmRpbmdQYWdlU2V0ID0NCisgICAgICAgICAgICBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+Q2xvbmVUZW1wbGF0ZVRvRm9ybShGQUxTRSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBQZW5kaW5nUGFnZVNldCA9IHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldFVzZXJEYXRhKA0KKyAgICAgICAgICAgIFhGQV9MQVlPVVRJVEVNS0VZKSA9PSBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtKSB7DQorICAgICAgcFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPlNldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsNCisgICAgfQ0KKyAgICBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSA9IHBQZW5kaW5nUGFnZVNldDsNCisgICAgcFBlbmRpbmdQYWdlU2V0LT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlLCBGQUxTRSk7DQorICAgIGZvciAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCk7DQorICAgICAgICAgcENvbnRhaW5lckl0ZW07IHBDb250YWluZXJJdGVtID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZTsNCisgICAgICBpZiAocE5vZGUtPkdldFBhY2tldElEKCkgIT0gWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIHN3aXRjaCAocE5vZGUtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlU2V0OiB7DQorICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwQ29udGFpbmVySXRlbS0+bV9wUGFyZW50LT5tX3BGb3JtTm9kZTsNCisgICAgICAgICAgcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIoDQorICAgICAgICAgICAgICBwRG9jdW1lbnQsIHBQYXJlbnROb2RlLCBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUsIFRSVUUpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6IHsNCisgICAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcEZvcm1MYXlvdXQgPSBwQ29udGFpbmVySXRlbTsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBDb250YWluZXJJdGVtLT5tX3BQYXJlbnQtPm1fcEZvcm1Ob2RlOw0KKyAgICAgICAgICBGWF9CT09MIGJJc0V4aXN0Rm9ybSA9IFRSVUU7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpTGV2ZWwgPSAwOyBpTGV2ZWwgPCAzOyBpTGV2ZWwrKykgew0KKyAgICAgICAgICAgIHBGb3JtTGF5b3V0ID0NCisgICAgICAgICAgICAgICAgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBGb3JtTGF5b3V0LT5tX3BGaXJzdENoaWxkOw0KKyAgICAgICAgICAgIGlmIChpTGV2ZWwgPT0gMikgew0KKyAgICAgICAgICAgICAgd2hpbGUgKHBGb3JtTGF5b3V0ICYmDQorICAgICAgICAgICAgICAgICAgICAgIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoDQorICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtTGF5b3V0LT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgcEZvcm1MYXlvdXQgPQ0KKyAgICAgICAgICAgICAgICAgICAgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBGb3JtTGF5b3V0LT5tX3BOZXh0U2libGluZzsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBGb3JtTGF5b3V0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIGJJc0V4aXN0Rm9ybSA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChiSXNFeGlzdEZvcm0pIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdTdWJmb3JtID0gcEZvcm1MYXlvdXQtPm1fcEZvcm1Ob2RlOw0KKyAgICAgICAgICAgIGlmIChwQ29udGFpbmVySXRlbS0+bV9wT2xkU3ViZm9ybSAhPSBOVUxMICYmDQorICAgICAgICAgICAgICAgIHBDb250YWluZXJJdGVtLT5tX3BPbGRTdWJmb3JtICE9IHBOZXdTdWJmb3JtKSB7DQorICAgICAgICAgICAgICBDWEZBX05vZGUqIHBFeGlzdGluZ05vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UoDQorICAgICAgICAgICAgICAgICAgcERvY3VtZW50LCBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSwNCisgICAgICAgICAgICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldE5hbWVIYXNoKCksIHBQYXJlbnROb2RlKTsNCisgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVySXRlcmF0b3Igc0l0ZXJhdG9yKHBFeGlzdGluZ05vZGUpOw0KKyAgICAgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgICAgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgICAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KKyAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtID0NCisgICAgICAgICAgICAgICAgICAgICAgKENYRkFfTGF5b3V0SXRlbUltcGwqKXBOb2RlLT5HZXRVc2VyRGF0YSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRJVEVNS0VZKTsNCisgICAgICAgICAgICAgICAgICBpZiAocExheW91dEl0ZW0pIHsNCisgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENYRkFfTGF5b3V0SXRlbSopcExheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBMYXlvdXRJdGVtOw0KKyAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAocEV4aXN0aW5nTm9kZSkgew0KKyAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZS0+UmVtb3ZlQ2hpbGQocEV4aXN0aW5nTm9kZSk7DQorICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgQ1hGQV9Ob2RlKiBwUGVuZGluZ1BhZ2VTZXQgPSBOVUxMOw0KLSAgICBmb3IoOyBwUm9vdExheW91dDsgcFJvb3RMYXlvdXQgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogKXBSb290TGF5b3V0LT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgcFBlbmRpbmdQYWdlU2V0ID0gTlVMTDsNCi0gICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRBcmVhQ29udGFpbmVyTGF5b3V0SXRlbT4gaXRlcmF0b3IocFJvb3RMYXlvdXQpOw0KLSAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCi0gICAgICAgIEFTU0VSVChwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KLSAgICAgICAgaWYoaUluZGV4IDwgcERvY3VtZW50LT5tX3BQZW5kaW5nUGFnZVNldC5HZXRTaXplKCkpIHsNCi0gICAgICAgICAgICBwUGVuZGluZ1BhZ2VTZXQgPSBwRG9jdW1lbnQtPm1fcFBlbmRpbmdQYWdlU2V0LkdldEF0KGlJbmRleCk7DQotICAgICAgICAgICAgaUluZGV4ICsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoIXBQZW5kaW5nUGFnZVNldCkgew0KLSAgICAgICAgICAgIGlmKHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUpIHsNCi0gICAgICAgICAgICAgICAgcFBlbmRpbmdQYWdlU2V0ID0gcFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkNsb25lVGVtcGxhdGVUb0Zvcm0oRkFMU0UpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBQZW5kaW5nUGFnZVNldCA9IHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlOw0KKyAgICAgICAgICAgIHBDb250YWluZXJJdGVtLT5tX3BPbGRTdWJmb3JtID0gcE5ld1N1YmZvcm07DQorICAgICAgICAgIH0NCisgICAgICAgICAgcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlID0gcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcigNCisgICAgICAgICAgICAgIHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSwgcFBhcmVudE5vZGUsDQorICAgICAgICAgICAgICAoQ1hGQV9Ob2RlKilwRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1JlY29yZCksIFRSVUUpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ29udGVudEFyZWE6IHsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBDb250YWluZXJJdGVtLT5tX3BQYXJlbnQtPm1fcEZvcm1Ob2RlOw0KKyAgICAgICAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkTm9kZSA9DQorICAgICAgICAgICAgICAgICAgIHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgcENoaWxkTm9kZTsNCisgICAgICAgICAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgIGlmIChwQ2hpbGROb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKSAhPSBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpID09IHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0pIHsNCi0gICAgICAgICAgICBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksIE5VTEwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUgPSBwUGVuZGluZ1BhZ2VTZXQ7DQotICAgICAgICBwUGVuZGluZ1BhZ2VTZXQtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCi0gICAgICAgIGZvcihDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKTsgcENvbnRhaW5lckl0ZW07IHBDb250YWluZXJJdGVtID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZTsNCi0gICAgICAgICAgICBpZihwTm9kZS0+R2V0UGFja2V0SUQoKSAhPSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzd2l0Y2gocE5vZGUtPkdldENsYXNzSUQoKSkgew0KLSAgICAgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1BhZ2VTZXQ6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gIHBDb250YWluZXJJdGVtLT5tX3BQYXJlbnQtPm1fcEZvcm1Ob2RlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFBhcmVudE5vZGUsIHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlQXJlYTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBGb3JtTGF5b3V0ID0gcENvbnRhaW5lckl0ZW07DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBDb250YWluZXJJdGVtLT5tX3BQYXJlbnQtPm1fcEZvcm1Ob2RlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzRXhpc3RGb3JtID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpTGV2ZWwgPSAwOyBpTGV2ZWwgPCAzOyBpTGV2ZWwgKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1MYXlvdXQgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcEZvcm1MYXlvdXQtPm1fcEZpcnN0Q2hpbGQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlMZXZlbCA9PSAyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShwRm9ybUxheW91dCAmJiAhWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwRm9ybUxheW91dC0+bV9wRm9ybU5vZGUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1MYXlvdXQgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcEZvcm1MYXlvdXQtPm1fcE5leHRTaWJsaW5nOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBGb3JtTGF5b3V0ID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJc0V4aXN0Rm9ybSA9IEZBTFNFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoYklzRXhpc3RGb3JtKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcE5ld1N1YmZvcm0gPSBwRm9ybUxheW91dC0+bV9wRm9ybU5vZGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQ29udGFpbmVySXRlbS0+bV9wT2xkU3ViZm9ybSAhPSBOVUxMICYmIHBDb250YWluZXJJdGVtLT5tX3BPbGRTdWJmb3JtICE9IHBOZXdTdWJmb3JtKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBFeGlzdGluZ05vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UocERvY3VtZW50LCBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSwgcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXROYW1lSGFzaCgpLCBwUGFyZW50Tm9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lckl0ZXJhdG9yIHNJdGVyYXRvcihwRXhpc3RpbmdOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihDWEZBX05vZGUgKnBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7IHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0gPSAoQ1hGQV9MYXlvdXRJdGVtSW1wbCopcE5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocExheW91dEl0ZW0pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwgKENYRkFfTGF5b3V0SXRlbSopcExheW91dEl0ZW0sIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBMYXlvdXRJdGVtOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocEV4aXN0aW5nTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJlbnROb2RlLT5SZW1vdmVDaGlsZChwRXhpc3RpbmdOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wT2xkU3ViZm9ybSA9IHBOZXdTdWJmb3JtOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSwgcFBhcmVudE5vZGUsIChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfUmVjb3JkKSwgVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwQ29udGFpbmVySXRlbS0+bV9wUGFyZW50LT5tX3BGb3JtTm9kZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcENoaWxkTm9kZTsgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocENoaWxkTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCkgIT0gcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUgPSBwQ2hpbGROb2RlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmKCFwUGVuZGluZ1BhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRm9ybVRvcGxldmVsU3ViZm9ybSA9ICgoQ1hGQV9Ob2RlKilwRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pKS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQotICAgICAgICAgICAgcEZvcm1Ub3BsZXZlbFN1YmZvcm0tPkluc2VydENoaWxkKHBQZW5kaW5nUGFnZVNldCk7DQotICAgICAgICB9DQotICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHBQZW5kaW5nUGFnZVNldCk7DQotICAgICAgICBwUGVuZGluZ1BhZ2VTZXQtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUgPSBwQ2hpbGROb2RlOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KICAgICB9DQotICAgIHBQZW5kaW5nUGFnZVNldCA9IEdldFJvb3RMYXlvdXRJdGVtKCktPm1fcEZvcm1Ob2RlOw0KLSAgICB3aGlsZShwUGVuZGluZ1BhZ2VTZXQpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcE5leHRQZW5kaW5nUGFnZVNldCA9IHBQZW5kaW5nUGFnZVNldC0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlRfUGFnZVNldCk7DQotICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+IHNJdGVyYXRvcihwUGVuZGluZ1BhZ2VTZXQpOw0KLSAgICAgICAgQ1hGQV9Ob2RlICpwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7DQotICAgICAgICB3aGlsZShwTm9kZSkgew0KLSAgICAgICAgICAgIGlmKHBOb2RlLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KLSAgICAgICAgICAgICAgICBpZihwTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVDdXJJZCA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZUN1cklkID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhIHx8IGVDdXJJZCA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJJdGVyYXRvciBpdGVDaGlsZChwTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gaXRlQ2hpbGQuTW92ZVRvTmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBwQ2hpbGROb2RlOyBwQ2hpbGROb2RlID0gaXRlQ2hpbGQuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtID0gKENYRkFfTGF5b3V0SXRlbUltcGwqKXBDaGlsZE5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocExheW91dEl0ZW0pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwgKENYRkFfTGF5b3V0SXRlbSopcExheW91dEl0ZW0sIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBMYXlvdXRJdGVtOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlQ3VySWQgIT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9IChDWEZBX0xheW91dEl0ZW1JbXBsKilwTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBMYXlvdXRJdGVtKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwgKENYRkFfTGF5b3V0SXRlbSopcExheW91dEl0ZW0sIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcExheW91dEl0ZW07DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV4dCA9IHNJdGVyYXRvci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPlJlbW92ZUNoaWxkKHBOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIHBOb2RlID0gcE5leHQ7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCi0gICAgICAgICAgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQotICAgICAgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBwUGVuZGluZ1BhZ2VTZXQgPSBwTmV4dFBlbmRpbmdQYWdlU2V0Ow0KKyAgICBpZiAoIXBQZW5kaW5nUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCisgICAgICBDWEZBX05vZGUqIHBGb3JtVG9wbGV2ZWxTdWJmb3JtID0NCisgICAgICAgICAgKChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSkpDQorICAgICAgICAgICAgICAtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KKyAgICAgIHBGb3JtVG9wbGV2ZWxTdWJmb3JtLT5JbnNlcnRDaGlsZChwUGVuZGluZ1BhZ2VTZXQpOw0KICAgICB9DQotfQ0KLXZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpMYXlvdXRQYWdlU2V0Q29udGVudHMoKQ0KLXsNCi0gICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFJvb3RMYXlvdXRJdGVtID0gdGhpcy0+R2V0Um9vdExheW91dEl0ZW0oKTsNCi0gICAgZm9yKDsgcFJvb3RMYXlvdXRJdGVtOyBwUm9vdExheW91dEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFJvb3RMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudEFyZWFDb250YWluZXJMYXlvdXRJdGVtPiBpdGVyYXRvcihwUm9vdExheW91dEl0ZW0pOw0KLSAgICAgICAgZm9yKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDb250YWluZXJJdGVtID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwQ29udGFpbmVySXRlbTsgcENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlOw0KLSAgICAgICAgICAgIHN3aXRjaChwTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6DQotICAgICAgICAgICAgICAgICAgICBtX3BMYXlvdXRQcm9jZXNzb3ItPkdldFJvb3RSb290SXRlbUxheW91dFByb2Nlc3NvcigpLT5Eb0xheW91dFBhZ2VBcmVhKHBDb250YWluZXJJdGVtKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgWEZBX1N5bmNDb250YWluZXIoSVhGQV9Ob3RpZnkqIHBOb3RpZnksIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0LCBDWEZBX0xheW91dEl0ZW1JbXBsKiBwQ29udGFpbmVySXRlbSwgRlhfRFdPUkQgZHdSZWxldmFudCwgRlhfQk9PTCBiVmlzaWJsZSwgaW50MzJfdCBuUGFnZUluZGV4KQ0KLXsNCi0gICAgRlhfQk9PTCBiVmlzaWJsZUl0ZW0gPSBGQUxTRTsNCi0gICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAwOw0KLSAgICBGWF9EV09SRCBkd1JlbGV2YW50Q29udGFpbmVyID0gMDsNCi0gICAgaWYgKGJWaXNpYmxlKSB7DQotICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0cmlidXRlVmFsdWUgPSBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSk7DQotICAgICAgICBpZihlQXR0cmlidXRlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSB8fCBlQXR0cmlidXRlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bikgew0KLSAgICAgICAgICAgIGJWaXNpYmxlSXRlbSA9IFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBkd1JlbGV2YW50Q29udGFpbmVyID0gWEZBX0dldFJlbGV2YW50KHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSwgZHdSZWxldmFudCk7DQotICAgICAgICBkd1N0YXR1cyA9IChiVmlzaWJsZUl0ZW0gPyBYRkFfTEFZT1VUU1RBVFVTX1Zpc2libGUgOiAwKSB8IGR3UmVsZXZhbnRDb250YWluZXI7DQotICAgIH0NCi0gICAgcE5vdGlmeS0+T25MYXlvdXRFdmVudChwRG9jTGF5b3V0LCAoQ1hGQV9MYXlvdXRJdGVtKilwQ29udGFpbmVySXRlbSwgWEZBX0xBWU9VVEVWRU5UX0l0ZW1BZGRlZCwgKHZvaWQqKSh1aW50cHRyX3QpblBhZ2VJbmRleCwgKHZvaWQqKSh1aW50cHRyX3QpZHdTdGF0dXMpOw0KLSAgICBDWEZBX0xheW91dEl0ZW1JbXBsICpwQ2hpbGQgPSBwQ29udGFpbmVySXRlbS0+bV9wRmlyc3RDaGlsZDsNCi0gICAgd2hpbGUgKHBDaGlsZCkgew0KLSAgICAgICAgaWYgKCFwQ2hpbGQtPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KLSAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dFNpYmxpbmc7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBYRkFfU3luY0NvbnRhaW5lcihwTm90aWZ5LCBwRG9jTGF5b3V0LCBwQ2hpbGQsIGR3UmVsZXZhbnRDb250YWluZXIsIGJWaXNpYmxlSXRlbSwgblBhZ2VJbmRleCk7DQotICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHRTaWJsaW5nOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpTeW5jTGF5b3V0RGF0YSgpDQotew0KLSAgICBNZXJnZVBhZ2VTZXRDb250ZW50cygpOw0KLSAgICBMYXlvdXRQYWdlU2V0Q29udGVudHMoKTsNCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5HZXREb2N1bWVudCgpLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGludDMyX3QgblBhZ2VJZHggPSAtMTsNCi0gICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFJvb3RMYXlvdXRJdGVtID0gdGhpcy0+R2V0Um9vdExheW91dEl0ZW0oKTsNCi0gICAgZm9yKDsgcFJvb3RMYXlvdXRJdGVtOyBwUm9vdExheW91dEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFJvb3RMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudEFyZWFDb250YWluZXJMYXlvdXRJdGVtPiBpdGVyYXRvclBhcmVudChwUm9vdExheW91dEl0ZW0pOw0KLSAgICAgICAgZm9yKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDb250YWluZXJJdGVtID0gaXRlcmF0b3JQYXJlbnQuR2V0Q3VycmVudCgpOyBwQ29udGFpbmVySXRlbTsgcENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvclBhcmVudC5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgICAgICBzd2l0Y2gocENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlQXJlYTogew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5QYWdlSWR4Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdSZWxldmFudCA9IFhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGUgfCBYRkFfTEFZT1VUU1RBVFVTX1ByaW50YWJsZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTGF5b3V0SXRlbSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0xheW91dEl0ZW0+IGl0ZXJhdG9yKChDWEZBX0xheW91dEl0ZW0qKXBDb250YWluZXJJdGVtKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoQ1hGQV9MYXlvdXRJdGVtKiBwQ2hpbGRMYXlvdXRJdGVtID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwQ2hpbGRMYXlvdXRJdGVtOykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgoQ1hGQV9MYXlvdXRJdGVtSW1wbCopcENoaWxkTGF5b3V0SXRlbSktPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbSA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ29udGVudEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBDaGlsZExheW91dEl0ZW07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZpc2libGUgPSAocENvbnRlbnRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdSZWxldmFudENoaWxkID0gWEZBX0dldFJlbGV2YW50KHBDb250ZW50SXRlbS0+bV9wRm9ybU5vZGUsIGR3UmVsZXZhbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfU3luY0NvbnRhaW5lcihwTm90aWZ5LCBtX3BMYXlvdXRQcm9jZXNzb3IsIHBDb250ZW50SXRlbSwgZHdSZWxldmFudENoaWxkLCBiVmlzaWJsZSwgblBhZ2VJZHgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hpbGRMYXlvdXRJdGVtID0gaXRlcmF0b3IuU2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGludDMyX3QgblBhZ2UgPSBtX1BhZ2VBcnJheS5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gblBhZ2UgLSAxOyBpID49IG1fbkF2YWlsUGFnZXM7IGktLSkgew0KLSAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFBhZ2UgPSBtX1BhZ2VBcnJheVtpXTsNCi0gICAgICAgIG1fUGFnZUFycmF5LlJlbW92ZUF0KGkpOw0KLSAgICAgICAgcE5vdGlmeS0+T25QYWdlRXZlbnQoKElYRkFfTGF5b3V0UGFnZSopcFBhZ2UsIFhGQV9QQUdFRVZFTlRfUGFnZVJlbW92ZWQpOw0KLSAgICAgICAgZGVsZXRlIHBQYWdlOw0KLSAgICB9DQotICAgIENsZWFyUmVjb3JkTGlzdCgpOw0KLX0NCi12b2lkIFhGQV9SZWxlYXNlTGF5b3V0SXRlbV9Ob1BhZ2VBcmVhKENYRkFfTGF5b3V0SXRlbUltcGwgKnBMYXlvdXRJdGVtKQ0KLXsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCAqcE5leHQsICpwTm9kZSA9IHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHBQZW5kaW5nUGFnZVNldCk7DQorICAgIHBQZW5kaW5nUGFnZVNldC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgfQ0KKyAgcFBlbmRpbmdQYWdlU2V0ID0gR2V0Um9vdExheW91dEl0ZW0oKS0+bV9wRm9ybU5vZGU7DQorICB3aGlsZSAocFBlbmRpbmdQYWdlU2V0KSB7DQorICAgIENYRkFfTm9kZSogcE5leHRQZW5kaW5nUGFnZVNldCA9DQorICAgICAgICBwUGVuZGluZ1BhZ2VTZXQtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KKyAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+DQorICAgICAgICBzSXRlcmF0b3IocFBlbmRpbmdQYWdlU2V0KTsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7DQogICAgIHdoaWxlIChwTm9kZSkgew0KLSAgICAgICAgcE5leHQgPSBwTm9kZS0+bV9wTmV4dFNpYmxpbmc7DQotICAgICAgICBwTm9kZS0+bV9wUGFyZW50ID0gTlVMTDsNCi0gICAgICAgIFhGQV9SZWxlYXNlTGF5b3V0SXRlbV9Ob1BhZ2VBcmVhKHBOb2RlKTsNCi0gICAgICAgIHBOb2RlID0gcE5leHQ7DQorICAgICAgaWYgKHBOb2RlLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KKyAgICAgICAgaWYgKHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICBYRkFfRUxFTUVOVCBlQ3VySWQgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgICBpZiAoZUN1cklkID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhIHx8IGVDdXJJZCA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgICAgICAgQ1hGQV9Db250YWluZXJJdGVyYXRvciBpdGVDaGlsZChwTm9kZSk7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gaXRlQ2hpbGQuTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICAgIGZvciAoOyBwQ2hpbGROb2RlOyBwQ2hpbGROb2RlID0gaXRlQ2hpbGQuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9DQorICAgICAgICAgICAgICAgICAgKENYRkFfTGF5b3V0SXRlbUltcGwqKXBDaGlsZE5vZGUtPkdldFVzZXJEYXRhKA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VUSVRFTUtFWSk7DQorICAgICAgICAgICAgICBpZiAocExheW91dEl0ZW0pIHsNCisgICAgICAgICAgICAgICAgcE5vdGlmeS0+T25MYXlvdXRFdmVudChwRG9jTGF5b3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDWEZBX0xheW91dEl0ZW0qKXBMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgICAgICAgICAgICBkZWxldGUgcExheW91dEl0ZW07DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2UgaWYgKGVDdXJJZCAhPSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KKyAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtID0NCisgICAgICAgICAgICAgICAgKENYRkFfTGF5b3V0SXRlbUltcGwqKXBOb2RlLT5HZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSk7DQorICAgICAgICAgICAgaWYgKHBMYXlvdXRJdGVtKSB7DQorICAgICAgICAgICAgICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KHBEb2NMYXlvdXQsIChDWEZBX0xheW91dEl0ZW0qKXBMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VURVZFTlRfSXRlbVJlbW92aW5nKTsNCisgICAgICAgICAgICAgIGRlbGV0ZSBwTGF5b3V0SXRlbTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV4dCA9IHNJdGVyYXRvci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCk7DQorICAgICAgICAgIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KKyAgICAgICAgICBwTm9kZSA9IHBOZXh0Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCisgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCi0gICAgICAgIGRlbGV0ZSBwTGF5b3V0SXRlbTsNCi0gICAgfQ0KKyAgICBwUGVuZGluZ1BhZ2VTZXQgPSBwTmV4dFBlbmRpbmdQYWdlU2V0Ow0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJlcGFyZUxheW91dCgpDQotew0KLSAgICBtX3BQYWdlU2V0Q3VyUm9vdCA9IE5VTEw7DQotICAgIG1fZVBhZ2VTZXRNb2RlID0gWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2U7DQotICAgIG1fbkF2YWlsUGFnZXMgPSAwOw0KLSAgICBDbGVhclJlY29yZExpc3QoKTsNCi0gICAgaWYgKCFtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QpIHsNCi0gICAgICAgIHJldHVybjsNCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6TGF5b3V0UGFnZVNldENvbnRlbnRzKCkgew0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFJvb3RMYXlvdXRJdGVtID0gdGhpcy0+R2V0Um9vdExheW91dEl0ZW0oKTsNCisgIGZvciAoOyBwUm9vdExheW91dEl0ZW07DQorICAgICAgIHBSb290TGF5b3V0SXRlbSA9DQorICAgICAgICAgICAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFJvb3RMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPA0KKyAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCwNCisgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50QXJlYUNvbnRhaW5lckxheW91dEl0ZW0+DQorICAgICAgICBpdGVyYXRvcihwUm9vdExheW91dEl0ZW0pOw0KKyAgICBmb3IgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDb250YWluZXJJdGVtID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KKyAgICAgICAgIHBDb250YWluZXJJdGVtOyBwQ29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGU7DQorICAgICAgc3dpdGNoIChwTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1BhZ2VBcmVhOg0KKyAgICAgICAgICBtX3BMYXlvdXRQcm9jZXNzb3ItPkdldFJvb3RSb290SXRlbUxheW91dFByb2Nlc3NvcigpDQorICAgICAgICAgICAgICAtPkRvTGF5b3V0UGFnZUFyZWEocENvbnRhaW5lckl0ZW0pOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUm9vdExheW91dEl0ZW0gPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQotICAgIGlmKHBSb290TGF5b3V0SXRlbSAmJiBwUm9vdExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRm9ybSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwUGFnZVNldEZvcm1Ob2RlID0gcFJvb3RMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZTsNCi0gICAgICAgIHBSb290TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldERvY3VtZW50KCktPm1fcFBlbmRpbmdQYWdlU2V0LlJlbW92ZUFsbCgpOw0KLSAgICAgICAgaWYgKHBQYWdlU2V0Rm9ybU5vZGUtPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQotICAgICAgICAgICAgWEZBX1JlbGVhc2VMYXlvdXRJdGVtKHBSb290TGF5b3V0SXRlbSk7DQotICAgICAgICAgICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290ID0gTlVMTDsNCi0gICAgICAgICAgICBwUm9vdExheW91dEl0ZW0gPSBOVUxMOw0KLSAgICAgICAgICAgIHBQYWdlU2V0Rm9ybU5vZGUgPSBOVUxMOw0KLSAgICAgICAgICAgIG1fUGFnZUFycmF5LlJlbW92ZUFsbCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2hpbGUocFBhZ2VTZXRGb3JtTm9kZSkgew0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcE5leHRQYWdlU2V0ID0gcFBhZ2VTZXRGb3JtTm9kZS0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlRfUGFnZVNldCk7DQotICAgICAgICAgICAgcFBhZ2VTZXRGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPlJlbW92ZUNoaWxkKHBQYWdlU2V0Rm9ybU5vZGUsIEZBTFNFKTsNCi0gICAgICAgICAgICBwUm9vdExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpLT5tX3BQZW5kaW5nUGFnZVNldC5BZGQocFBhZ2VTZXRGb3JtTm9kZSk7DQotICAgICAgICAgICAgcFBhZ2VTZXRGb3JtTm9kZSA9IHBOZXh0UGFnZVNldDsNCi0gICAgICAgIH0NCisgIH0NCit9DQordm9pZCBYRkFfU3luY0NvbnRhaW5lcihJWEZBX05vdGlmeSogcE5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtSW1wbCogcENvbnRhaW5lckl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1JlbGV2YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmlzaWJsZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBhZ2VJbmRleCkgew0KKyAgRlhfQk9PTCBiVmlzaWJsZUl0ZW0gPSBGQUxTRTsNCisgIEZYX0RXT1JEIGR3U3RhdHVzID0gMDsNCisgIEZYX0RXT1JEIGR3UmVsZXZhbnRDb250YWluZXIgPSAwOw0KKyAgaWYgKGJWaXNpYmxlKSB7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyaWJ1dGVWYWx1ZSA9DQorICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSk7DQorICAgIGlmIChlQXR0cmlidXRlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSB8fA0KKyAgICAgICAgZUF0dHJpYnV0ZVZhbHVlID09IFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd24pIHsNCisgICAgICBiVmlzaWJsZUl0ZW0gPSBUUlVFOw0KICAgICB9DQorICAgIGR3UmVsZXZhbnRDb250YWluZXIgPQ0KKyAgICAgICAgWEZBX0dldFJlbGV2YW50KHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSwgZHdSZWxldmFudCk7DQorICAgIGR3U3RhdHVzID0NCisgICAgICAgIChiVmlzaWJsZUl0ZW0gPyBYRkFfTEFZT1VUU1RBVFVTX1Zpc2libGUgOiAwKSB8IGR3UmVsZXZhbnRDb250YWluZXI7DQorICB9DQorICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KA0KKyAgICAgIHBEb2NMYXlvdXQsIChDWEZBX0xheW91dEl0ZW0qKXBDb250YWluZXJJdGVtLCBYRkFfTEFZT1VURVZFTlRfSXRlbUFkZGVkLA0KKyAgICAgICh2b2lkKikodWludHB0cl90KW5QYWdlSW5kZXgsICh2b2lkKikodWludHB0cl90KWR3U3RhdHVzKTsNCisgIENYRkFfTGF5b3V0SXRlbUltcGwqIHBDaGlsZCA9IHBDb250YWluZXJJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICBpZiAoIXBDaGlsZC0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQorICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0U2libGluZzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBYRkFfU3luY0NvbnRhaW5lcihwTm90aWZ5LCBwRG9jTGF5b3V0LCBwQ2hpbGQsIGR3UmVsZXZhbnRDb250YWluZXIsDQorICAgICAgICAgICAgICAgICAgICAgIGJWaXNpYmxlSXRlbSwgblBhZ2VJbmRleCk7DQorICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dFNpYmxpbmc7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpTeW5jTGF5b3V0RGF0YSgpIHsNCisgIE1lcmdlUGFnZVNldENvbnRlbnRzKCk7DQorICBMYXlvdXRQYWdlU2V0Q29udGVudHMoKTsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0NCisgICAgICBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5HZXREb2N1bWVudCgpLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpbnQzMl90IG5QYWdlSWR4ID0gLTE7DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUm9vdExheW91dEl0ZW0gPSB0aGlzLT5HZXRSb290TGF5b3V0SXRlbSgpOw0KKyAgZm9yICg7IHBSb290TGF5b3V0SXRlbTsNCisgICAgICAgcFJvb3RMYXlvdXRJdGVtID0NCisgICAgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUm9vdExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8DQorICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsLA0KKyAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRBcmVhQ29udGFpbmVyTGF5b3V0SXRlbT4NCisgICAgICAgIGl0ZXJhdG9yUGFyZW50KHBSb290TGF5b3V0SXRlbSk7DQorICAgIGZvciAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcENvbnRhaW5lckl0ZW0gPQ0KKyAgICAgICAgICAgICBpdGVyYXRvclBhcmVudC5HZXRDdXJyZW50KCk7DQorICAgICAgICAgcENvbnRhaW5lckl0ZW07IHBDb250YWluZXJJdGVtID0gaXRlcmF0b3JQYXJlbnQuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgc3dpdGNoIChwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlQXJlYTogew0KKyAgICAgICAgICBuUGFnZUlkeCsrOw0KKyAgICAgICAgICBGWF9EV09SRCBkd1JlbGV2YW50ID0NCisgICAgICAgICAgICAgIFhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGUgfCBYRkFfTEFZT1VUU1RBVFVTX1ByaW50YWJsZTsNCisgICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0xheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0xheW91dEl0ZW0+DQorICAgICAgICAgIGl0ZXJhdG9yKChDWEZBX0xheW91dEl0ZW0qKXBDb250YWluZXJJdGVtKTsNCisgICAgICAgICAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBDaGlsZExheW91dEl0ZW0gPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7DQorICAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbTspIHsNCisgICAgICAgICAgICBpZiAoISgoQ1hGQV9MYXlvdXRJdGVtSW1wbCopcENoaWxkTGF5b3V0SXRlbSkNCisgICAgICAgICAgICAgICAgICAgICAtPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbSA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcENvbnRlbnRJdGVtID0NCisgICAgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwQ2hpbGRMYXlvdXRJdGVtOw0KKyAgICAgICAgICAgIEZYX0JPT0wgYlZpc2libGUgPQ0KKyAgICAgICAgICAgICAgICAocENvbnRlbnRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKSA9PQ0KKyAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSk7DQorICAgICAgICAgICAgRlhfRFdPUkQgZHdSZWxldmFudENoaWxkID0NCisgICAgICAgICAgICAgICAgWEZBX0dldFJlbGV2YW50KHBDb250ZW50SXRlbS0+bV9wRm9ybU5vZGUsIGR3UmVsZXZhbnQpOw0KKyAgICAgICAgICAgIFhGQV9TeW5jQ29udGFpbmVyKHBOb3RpZnksIG1fcExheW91dFByb2Nlc3NvciwgcENvbnRlbnRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UmVsZXZhbnRDaGlsZCwgYlZpc2libGUsIG5QYWdlSWR4KTsNCisgICAgICAgICAgICBwQ2hpbGRMYXlvdXRJdGVtID0gaXRlcmF0b3IuU2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpbnQzMl90IG5QYWdlID0gbV9QYWdlQXJyYXkuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSBuUGFnZSAtIDE7IGkgPj0gbV9uQXZhaWxQYWdlczsgaS0tKSB7DQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYWdlID0gbV9QYWdlQXJyYXlbaV07DQorICAgIG1fUGFnZUFycmF5LlJlbW92ZUF0KGkpOw0KKyAgICBwTm90aWZ5LT5PblBhZ2VFdmVudCgoSVhGQV9MYXlvdXRQYWdlKilwUGFnZSwgWEZBX1BBR0VFVkVOVF9QYWdlUmVtb3ZlZCk7DQorICAgIGRlbGV0ZSBwUGFnZTsNCisgIH0NCisgIENsZWFyUmVjb3JkTGlzdCgpOw0KK30NCit2b2lkIFhGQV9SZWxlYXNlTGF5b3V0SXRlbV9Ob1BhZ2VBcmVhKENYRkFfTGF5b3V0SXRlbUltcGwqIHBMYXlvdXRJdGVtKSB7DQorICBDWEZBX0xheW91dEl0ZW1JbXBsICpwTmV4dCwgKnBOb2RlID0gcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICB3aGlsZSAocE5vZGUpIHsNCisgICAgcE5leHQgPSBwTm9kZS0+bV9wTmV4dFNpYmxpbmc7DQorICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgICBYRkFfUmVsZWFzZUxheW91dEl0ZW1fTm9QYWdlQXJlYShwTm9kZSk7DQorICAgIHBOb2RlID0gcE5leHQ7DQorICB9DQorICBpZiAocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgZGVsZXRlIHBMYXlvdXRJdGVtOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJlcGFyZUxheW91dCgpIHsNCisgIG1fcFBhZ2VTZXRDdXJSb290ID0gTlVMTDsNCisgIG1fZVBhZ2VTZXRNb2RlID0gWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2U7DQorICBtX25BdmFpbFBhZ2VzID0gMDsNCisgIENsZWFyUmVjb3JkTGlzdCgpOw0KKyAgaWYgKCFtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcFJvb3RMYXlvdXRJdGVtID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgaWYgKHBSb290TGF5b3V0SXRlbSAmJg0KKyAgICAgIHBSb290TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQorICAgIENYRkFfTm9kZSogcFBhZ2VTZXRGb3JtTm9kZSA9IHBSb290TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGU7DQorICAgIHBSb290TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldERvY3VtZW50KCktPm1fcFBlbmRpbmdQYWdlU2V0LlJlbW92ZUFsbCgpOw0KKyAgICBpZiAocFBhZ2VTZXRGb3JtTm9kZS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZCkpIHsNCisgICAgICBYRkFfUmVsZWFzZUxheW91dEl0ZW0ocFJvb3RMYXlvdXRJdGVtKTsNCisgICAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QgPSBOVUxMOw0KKyAgICAgIHBSb290TGF5b3V0SXRlbSA9IE5VTEw7DQorICAgICAgcFBhZ2VTZXRGb3JtTm9kZSA9IE5VTEw7DQorICAgICAgbV9QYWdlQXJyYXkuUmVtb3ZlQWxsKCk7DQorICAgIH0NCisgICAgd2hpbGUgKHBQYWdlU2V0Rm9ybU5vZGUpIHsNCisgICAgICBDWEZBX05vZGUqIHBOZXh0UGFnZVNldCA9DQorICAgICAgICAgIHBQYWdlU2V0Rm9ybU5vZGUtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KKyAgICAgIHBQYWdlU2V0Rm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpDQorICAgICAgICAgIC0+UmVtb3ZlQ2hpbGQocFBhZ2VTZXRGb3JtTm9kZSwgRkFMU0UpOw0KKyAgICAgIHBSb290TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldERvY3VtZW50KCktPm1fcFBlbmRpbmdQYWdlU2V0LkFkZCgNCisgICAgICAgICAgcFBhZ2VTZXRGb3JtTm9kZSk7DQorICAgICAgcFBhZ2VTZXRGb3JtTm9kZSA9IHBOZXh0UGFnZVNldDsNCisgICAgfQ0KKyAgfQ0KICNpZiBkZWZpbmVkKF9YRkFfTEFZT1VUSVRFTV9NQVBDQUNIRV8pIHx8IGRlZmluZWQoX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8pDQotICAgIHBSb290TGF5b3V0SXRlbSA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCi0gICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcE5leHRMYXlvdXQgPSBOVUxMOw0KLSAgICBmb3IoOyBwUm9vdExheW91dEl0ZW07IHBSb290TGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0KSB7DQotICAgICAgICBwTmV4dExheW91dCA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUm9vdExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KLSAgICAgICAgU2F2ZUxheW91dEl0ZW0ocFJvb3RMYXlvdXRJdGVtKTsNCi0gICAgICAgIGRlbGV0ZSBwUm9vdExheW91dEl0ZW07DQotICAgIH0NCi0gICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290ID0gTlVMTDsNCisgIHBSb290TGF5b3V0SXRlbSA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBOZXh0TGF5b3V0ID0gTlVMTDsNCisgIGZvciAoOyBwUm9vdExheW91dEl0ZW07IHBSb290TGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0KSB7DQorICAgIHBOZXh0TGF5b3V0ID0NCisgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwUm9vdExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICBTYXZlTGF5b3V0SXRlbShwUm9vdExheW91dEl0ZW0pOw0KKyAgICBkZWxldGUgcFJvb3RMYXlvdXRJdGVtOw0KKyAgfQ0KKyAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290ID0gTlVMTDsNCiAjZWxzZQ0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcExheW91dFByb2Nlc3Nvci0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBwUm9vdExheW91dEl0ZW0gPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQotICAgIGZvcig7IHBSb290TGF5b3V0SXRlbTsgcFJvb3RMYXlvdXRJdGVtID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBSb290TGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCi0gICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1BhZ2VBcmVhQ29udGFpbmVyTGF5b3V0SXRlbT4gaXRlcmF0b3IocFJvb3RMYXlvdXRJdGVtKTsNCi0gICAgICAgIGZvcihDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcENvbnRhaW5lckl0ZW07IHBDb250YWluZXJJdGVtID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgaWYocENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9MYXlvdXRJdGVtLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfTGF5b3V0SXRlbT4gaXRlcmF0b3IoKENYRkFfTGF5b3V0SXRlbSopcENvbnRhaW5lckl0ZW0pOw0KLSAgICAgICAgICAgIGZvcihDWEZBX0xheW91dEl0ZW1JbXBsKiBwTGF5b3V0SXRlbSA9IChDWEZBX0xheW91dEl0ZW1JbXBsKilpdGVyYXRvci5HZXRDdXJyZW50KCk7IHBMYXlvdXRJdGVtOyBwTGF5b3V0SXRlbSA9IChDWEZBX0xheW91dEl0ZW1JbXBsKilpdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFwTGF5b3V0SXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KG1fcExheW91dFByb2Nlc3NvciwgKENYRkFfTGF5b3V0SXRlbSopcExheW91dEl0ZW0sIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwTm90aWZ5LT5PblBhZ2VFdmVudCgoSVhGQV9MYXlvdXRQYWdlKilwQ29udGFpbmVySXRlbSwgWEZBX1BBR0VFVkVOVF9QYWdlUmVtb3ZlZCk7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9DQorICAgICAgbV9wTGF5b3V0UHJvY2Vzc29yLT5HZXREb2N1bWVudCgpLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBwUm9vdExheW91dEl0ZW0gPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQorICBmb3IgKDsgcFJvb3RMYXlvdXRJdGVtOw0KKyAgICAgICBwUm9vdExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBSb290TGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9QYWdlQXJlYUNvbnRhaW5lckxheW91dEl0ZW0+DQorICAgICAgICBpdGVyYXRvcihwUm9vdExheW91dEl0ZW0pOw0KKyAgICBmb3IgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDb250YWluZXJJdGVtID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KKyAgICAgICAgIHBDb250YWluZXJJdGVtOyBwQ29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgIGlmIChwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9MYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0xheW91dEl0ZW0+DQorICAgICAgaXRlcmF0b3IoKENYRkFfTGF5b3V0SXRlbSopcENvbnRhaW5lckl0ZW0pOw0KKyAgICAgIGZvciAoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgICAgIChDWEZBX0xheW91dEl0ZW1JbXBsKilpdGVyYXRvci5HZXRDdXJyZW50KCk7DQorICAgICAgICAgICBwTGF5b3V0SXRlbTsNCisgICAgICAgICAgIHBMYXlvdXRJdGVtID0gKENYRkFfTGF5b3V0SXRlbUltcGwqKWl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgaWYgKCFwTGF5b3V0SXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgfQ0KKyAgICAgICAgcE5vdGlmeS0+T25MYXlvdXRFdmVudChtX3BMYXlvdXRQcm9jZXNzb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDWEZBX0xheW91dEl0ZW0qKXBMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VURVZFTlRfSXRlbVJlbW92aW5nKTsNCisgICAgICB9DQorICAgICAgcE5vdGlmeS0+T25QYWdlRXZlbnQoKElYRkFfTGF5b3V0UGFnZSopcENvbnRhaW5lckl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BBR0VFVkVOVF9QYWdlUmVtb3ZlZCk7DQogICAgIH0NCi0gICAgcFJvb3RMYXlvdXRJdGVtID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTmV4dExheW91dCA9IE5VTEw7DQotICAgIGZvcig7IHBSb290TGF5b3V0SXRlbTsgcFJvb3RMYXlvdXRJdGVtID0gcE5leHRMYXlvdXQpIHsNCi0gICAgICAgIHBOZXh0TGF5b3V0ID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBSb290TGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQotICAgICAgICBYRkFfUmVsZWFzZUxheW91dEl0ZW1fTm9QYWdlQXJlYShwUm9vdExheW91dEl0ZW0pOw0KLSAgICB9DQotICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdCA9IE5VTEw7DQorICB9DQorICBwUm9vdExheW91dEl0ZW0gPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTmV4dExheW91dCA9IE5VTEw7DQorICBmb3IgKDsgcFJvb3RMYXlvdXRJdGVtOyBwUm9vdExheW91dEl0ZW0gPSBwTmV4dExheW91dCkgew0KKyAgICBwTmV4dExheW91dCA9DQorICAgICAgICAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCopcFJvb3RMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgWEZBX1JlbGVhc2VMYXlvdXRJdGVtX05vUGFnZUFyZWEocFJvb3RMYXlvdXRJdGVtKTsNCisgIH0NCisgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdCA9IE5VTEw7DQogI2VuZGlmDQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfcGFnZW1ncl9uZXcuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfcGFnZW1ncl9uZXcuaAppbmRleCBiZjgyYTM1Li42NWZiNjlmIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9wYWdlbWdyX25ldy5oCkBAIC02LDk3ICs2LDE0NyBAQAogDQogI2lmbmRlZiBfWEZBX0xBWU9VVF9QQUdFTUdSX0hfDQogI2RlZmluZSBfWEZBX0xBWU9VVF9QQUdFTUdSX0hfDQotY2xhc3MgQ1hGQV9Db250YWluZXJSZWNvcmQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX0NvbnRhaW5lclJlY29yZChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZVNldCA9IE5VTEwsIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBQYWdlQXJlYSA9IE5VTEwsIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDb250ZW50QXJlYSA9IE5VTEwpDQotICAgICAgICA6IHBDdXJQYWdlU2V0KHBQYWdlU2V0KSwgcEN1clBhZ2VBcmVhKHBQYWdlQXJlYSksIHBDdXJDb250ZW50QXJlYShwQ29udGVudEFyZWEpDQotICAgIHsNCi0gICAgfQ0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ3VyUGFnZVNldDsNCi0gICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcEN1clBhZ2VBcmVhOw0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwQ3VyQ29udGVudEFyZWE7DQorY2xhc3MgQ1hGQV9Db250YWluZXJSZWNvcmQgew0KKyBwdWJsaWM6DQorICBDWEZBX0NvbnRhaW5lclJlY29yZChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZVNldCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwUGFnZUFyZWEgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcENvbnRlbnRBcmVhID0gTlVMTCkNCisgICAgICA6IHBDdXJQYWdlU2V0KHBQYWdlU2V0KSwNCisgICAgICAgIHBDdXJQYWdlQXJlYShwUGFnZUFyZWEpLA0KKyAgICAgICAgcEN1ckNvbnRlbnRBcmVhKHBDb250ZW50QXJlYSkge30NCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIHBDdXJQYWdlU2V0Ow0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcEN1clBhZ2VBcmVhOw0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogcEN1ckNvbnRlbnRBcmVhOw0KIH07DQotY2xhc3MgQ1hGQV9MYXlvdXRQYWdlTWdyDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9MYXlvdXRQYWdlTWdyKENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yKTsNCi0gICAgfkNYRkFfTGF5b3V0UGFnZU1ncigpOw0KLSAgICBGWF9CT09MCQlJbml0TGF5b3V0UGFnZShDWEZBX05vZGUqIHBGb3JtTm9kZSk7DQotICAgIEZYX0JPT0wJCVByZXBhcmVGaXJzdFBhZ2UoQ1hGQV9Ob2RlKiBwUm9vdFN1YmZvcm0pOw0KLSAgICBGWF9GTE9BVAlHZXRBdmFpbEhlaWdodCgpOw0KLSAgICBGWF9CT09MCQlHZXROZXh0QXZhaWxDb250ZW50SGVpZ2h0KEZYX0ZMT0FUIGZDaGlsZEhlaWdodCk7DQotICAgIHZvaWQJCVN1Ym1pdENvbnRlbnRJdGVtKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwQ29udGVudExheW91dEl0ZW0sIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVTdGF0dXMpOw0KLSAgICB2b2lkCQlGaW5pc2hQYWdpbmF0ZWRQYWdlU2V0cygpOw0KLSAgICB2b2lkCQlTeW5jTGF5b3V0RGF0YSgpOw0KLSAgICBpbnQzMl90CQkJR2V0UGFnZUNvdW50KCkgY29uc3Q7DQotICAgIElYRkFfTGF5b3V0UGFnZSoJR2V0UGFnZShpbnQzMl90IGluZGV4KSBjb25zdDsNCi0gICAgaW50MzJfdAkJCUdldFBhZ2VJbmRleChJWEZBX0xheW91dFBhZ2UqIHBQYWdlKSBjb25zdDsNCi0gICAgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqCUdldFJvb3RMYXlvdXRJdGVtKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCi0gICAgfQ0KLSAgICBGWF9CT09MCQlQcm9jZXNzQnJlYWtCZWZvcmVPckFmdGVyKENYRkFfTm9kZSogcEJyZWFrTm9kZSwgRlhfQk9PTCBiQmVmb3JlLCBDWEZBX05vZGUqICZwQnJlYWtMZWFkZXJOb2RlLCBDWEZBX05vZGUqICZwQnJlYWtUcmFpbGVyTm9kZSwgRlhfQk9PTCYgYkNyZWF0ZVBhZ2UpOw0KLSAgICBGWF9CT09MCQlQcm9jZXNzT3ZlcmZsb3coQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsIENYRkFfTm9kZSogJnBMZWFkZXJOb2RlLCBDWEZBX05vZGUqICZwVHJhaWxlck5vZGUsIEZYX0JPT0wgYkRhdGFNZXJnZSA9IEZBTFNFLCBGWF9CT09MIGJDcmVhdGVQYWdlID0gVFJVRSk7DQotICAgIENYRkFfTm9kZSoJUXVlcnlPdmVyZmxvdyhDWEZBX05vZGUqIHBGb3JtTm9kZSwgQ1hGQV9MYXlvdXRDb250ZXh0KiBwTGF5b3V0Q29udGV4dCA9IE5VTEwpOw0KLSAgICBGWF9CT09MCQlQcm9jZXNzQm9va2VuZExlYWRlck9yVHJhaWxlcihDWEZBX05vZGUqIHBCb29rZW5kTm9kZSwgRlhfQk9PTCBiTGVhZGVyLCBDWEZBX05vZGUqICZwQm9va2VuZEFwcGVuZE5vZGUpOw0KLSAgICBDWEZBX0xheW91dEl0ZW1JbXBsKiBGaW5kT3JDcmVhdGVMYXlvdXRJdGVtKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsNCi1wcm90ZWN0ZWQ6DQotICAgIEZYX0JPT0wgCUFwcGVuZE5ld1BhZ2UoRlhfQk9PTCBiRmlyc3RUZW1QYWdlID0gRkFMU0UpOw0KLSAgICB2b2lkCQlSZW9yZGVyUGVuZGluZ0xheW91dFJlY29yZFRvVGFpbChDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCwgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBQcmV2UmVjb3JkKTsNCi0gICAgdm9pZAkJUmVtb3ZlTGF5b3V0UmVjb3JkKENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkLCBDWEZBX0NvbnRhaW5lclJlY29yZCogcFByZXZSZWNvcmQpOw0KLSAgICBpbmxpbmUgQ1hGQV9Db250YWluZXJSZWNvcmQqIEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKQ0KLSAgICB7DQotICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcmVzdWx0ID0gKChDWEZBX0NvbnRhaW5lclJlY29yZCopbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldEF0KG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQpKTsNCi0gICAgICAgIEFTU0VSVChyZXN1bHQpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLSAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogQ3JlYXRlQ29udGFpbmVyUmVjb3JkKENYRkFfTm9kZSogcFBhZ2VOb2RlID0gTlVMTCwgRlhfQk9PTCBiQ3JlYXRlTmV3ID0gRkFMU0UpOw0KLSAgICB2b2lkCQlBZGRQYWdlQXJlYUxheW91dEl0ZW0oQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsIENYRkFfTm9kZSogcE5ld1BhZ2VBcmVhKTsNCi0gICAgdm9pZAkJQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkLCBDWEZBX05vZGUqIHBDb250ZW50QXJlYSk7DQotICAgIEZYX0JPT0wJCVJ1bkJyZWFrKFhGQV9FTEVNRU5UIGVCcmVha1R5cGUsIFhGQV9BVFRSSUJVVEVFTlVNIGVUYXJnZXRUeXBlLCBDWEZBX05vZGUqIHBUYXJnZXQsIEZYX0JPT0wgYlN0YXJ0TmV3KTsNCi0gICAgQ1hGQV9Ob2RlKglCcmVha092ZXJmbG93KENYRkFfTm9kZSogcE92ZXJmbG93Tm9kZSwgQ1hGQV9Ob2RlKiYgcExlYWRlclRlbXBsYXRlLCBDWEZBX05vZGUqJiBwVHJhaWxlclRlbXBsYXRlLCBGWF9CT09MIGJDcmVhdGVQYWdlID0gVFJVRSk7DQotICAgIEZYX0JPT0wJCVJlc29sdmVCb29rZW5kTGVhZGVyT3JUcmFpbGVyKENYRkFfTm9kZSogcEJvb2tlbmROb2RlLCBGWF9CT09MIGJMZWFkZXIsIENYRkFfTm9kZSogJnBCb29rZW5kQXBwZW5kVGVtcGxhdGUpOw0KLSAgICBGWF9CT09MCQlFeGVjdXRlQnJlYWtCZWZvcmVPckFmdGVyKENYRkFfTm9kZSogcEN1ck5vZGUsIEZYX0JPT0wgYkJlZm9yZSwgQ1hGQV9Ob2RlKiAmcEJyZWFrTGVhZGVyVGVtcGxhdGUsIENYRkFfTm9kZSogJnBCcmVha1RyYWlsZXJUZW1wbGF0ZSk7DQorY2xhc3MgQ1hGQV9MYXlvdXRQYWdlTWdyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9MYXlvdXRQYWdlTWdyKENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yKTsNCisgIH5DWEZBX0xheW91dFBhZ2VNZ3IoKTsNCisgIEZYX0JPT0wgSW5pdExheW91dFBhZ2UoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOw0KKyAgRlhfQk9PTCBQcmVwYXJlRmlyc3RQYWdlKENYRkFfTm9kZSogcFJvb3RTdWJmb3JtKTsNCisgIEZYX0ZMT0FUIEdldEF2YWlsSGVpZ2h0KCk7DQorICBGWF9CT09MIEdldE5leHRBdmFpbENvbnRlbnRIZWlnaHQoRlhfRkxPQVQgZkNoaWxkSGVpZ2h0KTsNCisgIHZvaWQgU3VibWl0Q29udGVudEl0ZW0oQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBDb250ZW50TGF5b3V0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgZVN0YXR1cyk7DQorICB2b2lkIEZpbmlzaFBhZ2luYXRlZFBhZ2VTZXRzKCk7DQorICB2b2lkIFN5bmNMYXlvdXREYXRhKCk7DQorICBpbnQzMl90IEdldFBhZ2VDb3VudCgpIGNvbnN0Ow0KKyAgSVhGQV9MYXlvdXRQYWdlKiBHZXRQYWdlKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXRQYWdlSW5kZXgoSVhGQV9MYXlvdXRQYWdlKiBwUGFnZSkgY29uc3Q7DQorICBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCogR2V0Um9vdExheW91dEl0ZW0oKSBjb25zdCB7DQorICAgIHJldHVybiBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQorICB9DQorICBGWF9CT09MIFByb2Nlc3NCcmVha0JlZm9yZU9yQWZ0ZXIoQ1hGQV9Ob2RlKiBwQnJlYWtOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJlZm9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwQnJlYWtMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSomIHBCcmVha1RyYWlsZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJDcmVhdGVQYWdlKTsNCisgIEZYX0JPT0wgUHJvY2Vzc092ZXJmbG93KENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcExlYWRlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwVHJhaWxlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEYXRhTWVyZ2UgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZVBhZ2UgPSBUUlVFKTsNCisgIENYRkFfTm9kZSogUXVlcnlPdmVyZmxvdyhDWEZBX05vZGUqIHBGb3JtTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dENvbnRleHQqIHBMYXlvdXRDb250ZXh0ID0gTlVMTCk7DQorICBGWF9CT09MIFByb2Nlc3NCb29rZW5kTGVhZGVyT3JUcmFpbGVyKENYRkFfTm9kZSogcEJvb2tlbmROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMZWFkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSomIHBCb29rZW5kQXBwZW5kTm9kZSk7DQorICBDWEZBX0xheW91dEl0ZW1JbXBsKiBGaW5kT3JDcmVhdGVMYXlvdXRJdGVtKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsNCiANCi0gICAgaW50MzJfdAlDcmVhdGVNaW5QYWdlUmVjb3JkKENYRkFfTm9kZSogcFBhZ2VBcmVhLCBGWF9CT09MIGJUYXJnZXRQYWdlQXJlYSwgRlhfQk9PTCBiQ3JlYXRlTGFzdCA9IEZBTFNFKTsNCi0gICAgdm9pZAkJQ3JlYXRlTWluUGFnZVNldFJlY29yZChDWEZBX05vZGUqIHBQYWdlU2V0LCBGWF9CT09MIGJDcmVhdGVBbGwgPSBGQUxTRSk7DQotICAgIHZvaWQJCUNyZWF0ZU5leHRNaW5SZWNvcmQoQ1hGQV9Ob2RlKiBwUmVjb3JkTm9kZSk7DQotICAgIEZYX0JPT0wJCUZpbmRQYWdlQXJlYUZyb21QYWdlU2V0KENYRkFfTm9kZSogcFBhZ2VTZXQsIENYRkFfTm9kZSogcFN0YXJ0Q2hpbGQsIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhID0gTlVMTCwgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEgPSBOVUxMLCBGWF9CT09MIGJOZXdQYWdlID0gRkFMU0UsIEZYX0JPT0wgYlF1ZXJ5ID0gRkFMU0UpOw0KLSAgICBGWF9CT09MCQlGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9PcmRlcmVkKENYRkFfTm9kZSogcFBhZ2VTZXQsIENYRkFfTm9kZSogcFN0YXJ0Q2hpbGQsIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhID0gTlVMTCwgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEgPSBOVUxMLCBGWF9CT09MIGJOZXdQYWdlID0gRkFMU0UsIEZYX0JPT0wgYlF1ZXJ5ID0gRkFMU0UpOw0KLSAgICBGWF9CT09MCQlGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9TaW1wbGV4RHVwbGV4KENYRkFfTm9kZSogcFBhZ2VTZXQsIENYRkFfTm9kZSogcFN0YXJ0Q2hpbGQsIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhID0gTlVMTCwgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEgPSBOVUxMLCBGWF9CT09MIGJOZXdQYWdlID0gRkFMU0UsIEZYX0JPT0wgYlF1ZXJ5ID0gRkFMU0UsIFhGQV9BVFRSSUJVVEVFTlVNIGVQcmVmZXJyZWRQb3NpdGlvbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0KTsNCi0gICAgRlhfQk9PTAkJTWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihDWEZBX05vZGUqIHBQYWdlQXJlYSwgRlhfQk9PTCBiTGFzdE1hdGNoKTsNCi0gICAgQ1hGQV9Ob2RlKglHZXROZXh0QXZhaWxQYWdlQXJlYShDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSwgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEgPSBOVUxMLCBGWF9CT09MIGJOZXdQYWdlID0gRkFMU0UsIEZYX0JPT0wgYlF1ZXJ5ID0gRkFMU0UpOw0KLSAgICBGWF9CT09MCQlHZXROZXh0Q29udGVudEFyZWEoQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEpOw0KLSAgICB2b2lkCQlJbml0UGFnZVNldE1hcCgpOw0KLSAgICB2b2lkCQlQcm9jZXNzTGFzdFBhZ2VTZXQoKTsNCi0gICAgaW5saW5lCUZYX0JPT0wJSXNQYWdlU2V0Um9vdE9yZGVyZWRPY2N1cnJlbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fZVBhZ2VTZXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlOw0KLSAgICB9DQotICAgIHZvaWQJCUNsZWFyRGF0YSgpOw0KLSAgICB2b2lkCQlDbGVhclJlY29yZExpc3QoKTsNCi0gICAgdm9pZAkJTWVyZ2VQYWdlU2V0Q29udGVudHMoKTsNCi0gICAgdm9pZAkJTGF5b3V0UGFnZVNldENvbnRlbnRzKCk7DQotICAgIHZvaWQJCVByZXBhcmVMYXlvdXQoKTsNCi0gICAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqCQkJCW1fcExheW91dFByb2Nlc3NvcjsNCi0gICAgQ1hGQV9Ob2RlKgkJCQkJCQltX3BUZW1wbGF0ZVBhZ2VTZXRSb290Ow0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKgkJbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKgkJbV9wUGFnZVNldEN1clJvb3Q7DQotICAgIEZYX1BPU0lUSU9OCQkJCQkJCW1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQ7DQotICAgIENGWF9QdHJMaXN0CQkJCQkJCW1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZDsNCi0gICAgQ1hGQV9Ob2RlKgkJCQkJCQltX3BDdXJQYWdlQXJlYTsNCi0gICAgaW50MzJfdAkJCQkJCQltX25BdmFpbFBhZ2VzOw0KLSAgICBpbnQzMl90CQkJCQkJCW1fbkN1clBhZ2VDb3VudDsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0JCQkJCW1fZVBhZ2VTZXRNb2RlOw0KLSAgICBGWF9CT09MCQkJCQkJCQltX2JDcmVhdGVPdmVyRmxvd1BhZ2U7DQotICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxDWEZBX05vZGUqLCBpbnQzMl90PiBtX3BQYWdlU2V0TWFwOw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9CT09MIEFwcGVuZE5ld1BhZ2UoRlhfQk9PTCBiRmlyc3RUZW1QYWdlID0gRkFMU0UpOw0KKyAgdm9pZCBSZW9yZGVyUGVuZGluZ0xheW91dFJlY29yZFRvVGFpbChDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBQcmV2UmVjb3JkKTsNCisgIHZvaWQgUmVtb3ZlTGF5b3V0UmVjb3JkKENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBQcmV2UmVjb3JkKTsNCisgIGlubGluZSBDWEZBX0NvbnRhaW5lclJlY29yZCogR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpIHsNCisgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHJlc3VsdCA9DQorICAgICAgICAoKENYRkFfQ29udGFpbmVyUmVjb3JkKiltX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0QXQoDQorICAgICAgICAgICAgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCkpOw0KKyAgICBBU1NFUlQocmVzdWx0KTsNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBDcmVhdGVDb250YWluZXJSZWNvcmQoQ1hGQV9Ob2RlKiBwUGFnZU5vZGUgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDcmVhdGVOZXcgPSBGQUxTRSk7DQorICB2b2lkIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcE5ld1BhZ2VBcmVhKTsNCisgIHZvaWQgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWEpOw0KKyAgRlhfQk9PTCBSdW5CcmVhayhYRkFfRUxFTUVOVCBlQnJlYWtUeXBlLA0KKyAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlVGFyZ2V0VHlwZSwNCisgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0LA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGFydE5ldyk7DQorICBDWEZBX05vZGUqIEJyZWFrT3ZlcmZsb3coQ1hGQV9Ob2RlKiBwT3ZlcmZsb3dOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSomIHBMZWFkZXJUZW1wbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwVHJhaWxlclRlbXBsYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZVBhZ2UgPSBUUlVFKTsNCisgIEZYX0JPT0wgUmVzb2x2ZUJvb2tlbmRMZWFkZXJPclRyYWlsZXIoQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxlYWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcEJvb2tlbmRBcHBlbmRUZW1wbGF0ZSk7DQorICBGWF9CT09MIEV4ZWN1dGVCcmVha0JlZm9yZU9yQWZ0ZXIoQ1hGQV9Ob2RlKiBwQ3VyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCZWZvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcEJyZWFrTGVhZGVyVGVtcGxhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcEJyZWFrVHJhaWxlclRlbXBsYXRlKTsNCisNCisgIGludDMyX3QgQ3JlYXRlTWluUGFnZVJlY29yZChDWEZBX05vZGUqIHBQYWdlQXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUYXJnZXRQYWdlQXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDcmVhdGVMYXN0ID0gRkFMU0UpOw0KKyAgdm9pZCBDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKENYRkFfTm9kZSogcFBhZ2VTZXQsIEZYX0JPT0wgYkNyZWF0ZUFsbCA9IEZBTFNFKTsNCisgIHZvaWQgQ3JlYXRlTmV4dE1pblJlY29yZChDWEZBX05vZGUqIHBSZWNvcmROb2RlKTsNCisgIEZYX0JPT0wgRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXQoQ1hGQV9Ob2RlKiBwUGFnZVNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwU3RhcnRDaGlsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0UGFnZUFyZWEgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5ld1BhZ2UgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUXVlcnkgPSBGQUxTRSk7DQorICBGWF9CT09MIEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0X09yZGVyZWQoQ1hGQV9Ob2RlKiBwUGFnZVNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTdGFydENoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTmV3UGFnZSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlF1ZXJ5ID0gRkFMU0UpOw0KKyAgRlhfQk9PTCBGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9TaW1wbGV4RHVwbGV4KA0KKyAgICAgIENYRkFfTm9kZSogcFBhZ2VTZXQsDQorICAgICAgQ1hGQV9Ob2RlKiBwU3RhcnRDaGlsZCwNCisgICAgICBDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSA9IE5VTEwsDQorICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEgPSBOVUxMLA0KKyAgICAgIEZYX0JPT0wgYk5ld1BhZ2UgPSBGQUxTRSwNCisgICAgICBGWF9CT09MIGJRdWVyeSA9IEZBTFNFLA0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVQcmVmZXJyZWRQb3NpdGlvbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0KTsNCisgIEZYX0JPT0wgTWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihDWEZBX05vZGUqIHBQYWdlQXJlYSwgRlhfQk9PTCBiTGFzdE1hdGNoKTsNCisgIENYRkFfTm9kZSogR2V0TmV4dEF2YWlsUGFnZUFyZWEoQ1hGQV9Ob2RlKiBwVGFyZ2V0UGFnZUFyZWEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRhcmdldENvbnRlbnRBcmVhID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTmV3UGFnZSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJRdWVyeSA9IEZBTFNFKTsNCisgIEZYX0JPT0wgR2V0TmV4dENvbnRlbnRBcmVhKENYRkFfTm9kZSogcFRhcmdldENvbnRlbnRBcmVhKTsNCisgIHZvaWQgSW5pdFBhZ2VTZXRNYXAoKTsNCisgIHZvaWQgUHJvY2Vzc0xhc3RQYWdlU2V0KCk7DQorICBpbmxpbmUgRlhfQk9PTCBJc1BhZ2VTZXRSb290T3JkZXJlZE9jY3VycmVuY2UoKSB7DQorICAgIHJldHVybiBtX2VQYWdlU2V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZTsNCisgIH0NCisgIHZvaWQgQ2xlYXJEYXRhKCk7DQorICB2b2lkIENsZWFyUmVjb3JkTGlzdCgpOw0KKyAgdm9pZCBNZXJnZVBhZ2VTZXRDb250ZW50cygpOw0KKyAgdm9pZCBMYXlvdXRQYWdlU2V0Q29udGVudHMoKTsNCisgIHZvaWQgUHJlcGFyZUxheW91dCgpOw0KKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIG1fcExheW91dFByb2Nlc3NvcjsNCisgIENYRkFfTm9kZSogbV9wVGVtcGxhdGVQYWdlU2V0Um9vdDsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqIG1fcFBhZ2VTZXRDdXJSb290Ow0KKyAgRlhfUE9TSVRJT04gbV9wQ3VycmVudENvbnRhaW5lclJlY29yZDsNCisgIENGWF9QdHJMaXN0IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZDsNCisgIENYRkFfTm9kZSogbV9wQ3VyUGFnZUFyZWE7DQorICBpbnQzMl90IG1fbkF2YWlsUGFnZXM7DQorICBpbnQzMl90IG1fbkN1clBhZ2VDb3VudDsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIG1fZVBhZ2VTZXRNb2RlOw0KKyAgRlhfQk9PTCBtX2JDcmVhdGVPdmVyRmxvd1BhZ2U7DQorICBDRlhfTWFwUHRyVGVtcGxhdGU8Q1hGQV9Ob2RlKiwgaW50MzJfdD4gbV9wUGFnZVNldE1hcDsNCiAjaWZkZWYgX1hGQV9MQVlPVVRJVEVNX01BUENBQ0hFXw0KLSAgICB2b2lkCQkJCQkJU2F2ZUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtSW1wbCogcFBhcmVudExheW91dEl0ZW0pOw0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCQkJbV9Ob2RlVG9Db250ZW50Ow0KKyAgdm9pZCBTYXZlTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW1JbXBsKiBwUGFyZW50TGF5b3V0SXRlbSk7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9Ob2RlVG9Db250ZW50Ow0KICNlbGlmIGRlZmluZWQoX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8pDQotICAgIHZvaWQJCQkJCQlTYXZlTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW1JbXBsKiBwUGFyZW50TGF5b3V0SXRlbSk7DQorICB2b2lkIFNhdmVMYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbUltcGwqIHBQYXJlbnRMYXlvdXRJdGVtKTsNCiAjZW5kaWYNCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCo+CQkJCW1fUGFnZUFycmF5Ow0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtSW1wbCo+IG1fUGFnZUFycmF5Ow0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxlLmNwcAppbmRleCA2YzExMDM4Li5iMGQzMTgxIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxlLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxlLmNwcApAQCAtMTksMzU3ICsxOSwzNjYgQEAKICNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQogI2luY2x1ZGUgInhmYV9sb2NhbGUuaCINCiANCi1zdGF0aWMgY29uc3QgRlhfV0NIQVIqIGdfRlhfUGVyY2VudCA9ICBMInosenp6LHp6eix6enosenp6LHp6eiUiOw0KK3N0YXRpYyBjb25zdCBGWF9XQ0hBUiogZ19GWF9QZXJjZW50ID0gTCJ6LHp6eix6enosenp6LHp6eix6enolIjsNCiBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIGdfRlhfQ3VycmVuY3kgPSBMIiR6LHp6eix6enosenp6LHp6eix6ejkuOTkiOw0KIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogZ19GWF9EZWNpbWFsID0gTCJ6LHp6eix6enosenp6LHp6eix6ejkuenp6IjsNCiBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIGdfRlhfSW50ZWdlciA9IEwieix6enosenp6LHp6eix6enosenp6IjsNCi1DWEZBX1hNTExvY2FsZTo6Q1hGQV9YTUxMb2NhbGUoQ1hNTF9FbGVtZW50KiBwTG9jYWxlRGF0YSkNCi17DQotICAgIG1fcExvY2FsZURhdGEgPSBwTG9jYWxlRGF0YTsNCitDWEZBX1hNTExvY2FsZTo6Q1hGQV9YTUxMb2NhbGUoQ1hNTF9FbGVtZW50KiBwTG9jYWxlRGF0YSkgew0KKyAgbV9wTG9jYWxlRGF0YSA9IHBMb2NhbGVEYXRhOw0KIH0NCi1DWEZBX1hNTExvY2FsZTo6fkNYRkFfWE1MTG9jYWxlKCkNCi17DQotICAgIGlmIChtX3BMb2NhbGVEYXRhKSB7DQotICAgICAgICBkZWxldGUgbV9wTG9jYWxlRGF0YTsNCi0gICAgfQ0KK0NYRkFfWE1MTG9jYWxlOjp+Q1hGQV9YTUxMb2NhbGUoKSB7DQorICBpZiAobV9wTG9jYWxlRGF0YSkgew0KKyAgICBkZWxldGUgbV9wTG9jYWxlRGF0YTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX1hNTExvY2FsZTo6UmVsZWFzZSgpDQotew0KLSAgICBkZWxldGUgdGhpczsNCit2b2lkIENYRkFfWE1MTG9jYWxlOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXROYW1lKCkNCi17DQotICAgIHJldHVybiBtX3BMb2NhbGVEYXRhID8gbV9wTG9jYWxlRGF0YS0+R2V0QXR0clZhbHVlKEZYX0JTVFJDKCJuYW1lIikpIDogQ0ZYX1dpZGVTdHJpbmcoKTsNCitDRlhfV2lkZVN0cmluZyBDWEZBX1hNTExvY2FsZTo6R2V0TmFtZSgpIHsNCisgIHJldHVybiBtX3BMb2NhbGVEYXRhID8gbV9wTG9jYWxlRGF0YS0+R2V0QXR0clZhbHVlKEZYX0JTVFJDKCJuYW1lIikpDQorICAgICAgICAgICAgICAgICAgICAgICA6IENGWF9XaWRlU3RyaW5nKCk7DQogfQ0KLXZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTCBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdA0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNTeW1ib2xzOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQotICAgIHN3aXRjaCAoZVR5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWw6DQotICAgICAgICAgICAgYnNTeW1ib2xzID0gRlhfQlNUUkMoIm51bWJlclN5bWJvbHMiKTsNCi0gICAgICAgICAgICB3c05hbWUgPSBGWF9XU1RSQyhMImRlY2ltYWwiKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nOg0KLSAgICAgICAgICAgIGJzU3ltYm9scyA9IEZYX0JTVFJDKCJudW1iZXJTeW1ib2xzIik7DQotICAgICAgICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCJncm91cGluZyIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudDoNCi0gICAgICAgICAgICBic1N5bWJvbHMgPSBGWF9CU1RSQygibnVtYmVyU3ltYm9scyIpOw0KLSAgICAgICAgICAgIHdzTmFtZSA9IEZYX1dTVFJDKEwicGVyY2VudCIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfTWludXM6DQotICAgICAgICAgICAgYnNTeW1ib2xzID0gKEZYX0JTVFJDKCJudW1iZXJTeW1ib2xzIikpOw0KLSAgICAgICAgICAgIHdzTmFtZSA9IEZYX1dTVFJDKEwibWludXMiKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX1plcm86DQotICAgICAgICAgICAgYnNTeW1ib2xzID0gKEZYX0JTVFJDKCJudW1iZXJTeW1ib2xzIikpOw0KLSAgICAgICAgICAgIHdzTmFtZSA9IEZYX1dTVFJDKEwiemVybyIpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2w6DQotICAgICAgICAgICAgYnNTeW1ib2xzID0gKEZYX0JTVFJDKCJjdXJyZW5jeVN5bWJvbHMiKSk7DQotICAgICAgICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCJzeW1ib2wiKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5TmFtZToNCi0gICAgICAgICAgICBic1N5bWJvbHMgPSAoRlhfQlNUUkMoImN1cnJlbmN5U3ltYm9scyIpKTsNCi0gICAgICAgICAgICB3c05hbWUgPSBGWF9XU1RSQyhMImlzb25hbWUiKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KEZYX0JTVFJDKCIiKSwgYnNTeW1ib2xzKTsNCi0gICAgaWYgKCFwRWxlbWVudCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEdldFBhdHRlcm4ocEVsZW1lbnQsIENGWF9CeXRlU3RyaW5nQygoY29uc3QgRlhfQ0hBUiopYnNTeW1ib2xzLCBic1N5bWJvbHMuR2V0TGVuZ3RoKCkgLSAxKSwgd3NOYW1lLCB3c051bVN5bWJvbCk7DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c051bVN5bWJvbCkgY29uc3Qgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNTeW1ib2xzOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgc3dpdGNoIChlVHlwZSkgew0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsOg0KKyAgICAgIGJzU3ltYm9scyA9IEZYX0JTVFJDKCJudW1iZXJTeW1ib2xzIik7DQorICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCJkZWNpbWFsIik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nOg0KKyAgICAgIGJzU3ltYm9scyA9IEZYX0JTVFJDKCJudW1iZXJTeW1ib2xzIik7DQorICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCJncm91cGluZyIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50Og0KKyAgICAgIGJzU3ltYm9scyA9IEZYX0JTVFJDKCJudW1iZXJTeW1ib2xzIik7DQorICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCJwZXJjZW50Iik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzOg0KKyAgICAgIGJzU3ltYm9scyA9IChGWF9CU1RSQygibnVtYmVyU3ltYm9scyIpKTsNCisgICAgICB3c05hbWUgPSBGWF9XU1RSQyhMIm1pbnVzIik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX1plcm86DQorICAgICAgYnNTeW1ib2xzID0gKEZYX0JTVFJDKCJudW1iZXJTeW1ib2xzIikpOw0KKyAgICAgIHdzTmFtZSA9IEZYX1dTVFJDKEwiemVybyIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbDoNCisgICAgICBic1N5bWJvbHMgPSAoRlhfQlNUUkMoImN1cnJlbmN5U3ltYm9scyIpKTsNCisgICAgICB3c05hbWUgPSBGWF9XU1RSQyhMInN5bWJvbCIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeU5hbWU6DQorICAgICAgYnNTeW1ib2xzID0gKEZYX0JTVFJDKCJjdXJyZW5jeVN5bWJvbHMiKSk7DQorICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCJpc29uYW1lIik7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9IG1fcExvY2FsZURhdGEtPkdldEVsZW1lbnQoRlhfQlNUUkMoIiIpLCBic1N5bWJvbHMpOw0KKyAgaWYgKCFwRWxlbWVudCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBHZXRQYXR0ZXJuKHBFbGVtZW50LCBDRlhfQnl0ZVN0cmluZ0MoKGNvbnN0IEZYX0NIQVIqKWJzU3ltYm9scywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic1N5bWJvbHMuR2V0TGVuZ3RoKCkgLSAxKSwNCisgICAgICAgICAgICAgd3NOYW1lLCB3c051bVN5bWJvbCk7DQogfQ0KLXZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldERhdGVUaW1lU3ltYm9scyhDRlhfV2lkZVN0cmluZyYgd3NEdFN5bWJvbCkgY29uc3QNCi17DQotICAgIGlmICghbV9wTG9jYWxlRGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9CeXRlU3RyaW5nIGJzU3BhY2U7DQotICAgIENYTUxfRWxlbWVudCogcE51bWJlclN5bWJvbHMgPSBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KGJzU3BhY2UsIEZYX0JTVFJDKCJkYXRlVGltZVN5bWJvbHMiKSk7DQotICAgIGlmICghcE51bWJlclN5bWJvbHMpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICB3c0R0U3ltYm9sID0gcE51bWJlclN5bWJvbHMtPkdldENvbnRlbnQoMCk7DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdCB7DQorICBpZiAoIW1fcExvY2FsZURhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNTcGFjZTsNCisgIENYTUxfRWxlbWVudCogcE51bWJlclN5bWJvbHMgPQ0KKyAgICAgIG1fcExvY2FsZURhdGEtPkdldEVsZW1lbnQoYnNTcGFjZSwgRlhfQlNUUkMoImRhdGVUaW1lU3ltYm9scyIpKTsNCisgIGlmICghcE51bWJlclN5bWJvbHMpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgd3NEdFN5bWJvbCA9IHBOdW1iZXJTeW1ib2xzLT5HZXRDb250ZW50KDApOw0KIH0NCi12b2lkIENYRkFfWE1MTG9jYWxlOjpHZXRNb250aE5hbWUoaW50MzJfdCBuTW9udGgsIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwgRlhfQk9PTCBiQWJiciApIGNvbnN0DQotew0KLSAgICB3c01vbnRoTmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKEZYX0JTVFJDKCJtb250aCIpLCBuTW9udGgsIGJBYmJyKTsNCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXRNb250aE5hbWUoaW50MzJfdCBuTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWJicikgY29uc3Qgew0KKyAgd3NNb250aE5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbChGWF9CU1RSQygibW9udGgiKSwgbk1vbnRoLCBiQWJicik7DQogfQ0KLXZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldERheU5hbWUoaW50MzJfdCBuV2VlaywgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwgRlhfQk9PTCBiQWJiciApIGNvbnN0DQotew0KLSAgICB3c0RheU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbChGWF9CU1RSQygiZGF5IiksIG5XZWVrLCBiQWJicik7DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0RGF5TmFtZShpbnQzMl90IG5XZWVrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIpIGNvbnN0IHsNCisgIHdzRGF5TmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKEZYX0JTVFJDKCJkYXkiKSwgbldlZWssIGJBYmJyKTsNCiB9DQotdm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwgRlhfQk9PTCBiQU0gKSBjb25zdA0KLXsNCi0gICAgd3NNZXJpZGllbU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbChGWF9CU1RSQygibWVyaWRpZW0iKSwgYkFNID8gMCA6IDEsIEZBTFNFKTsNCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXRNZXJpZGllbU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVyaWRpZW1OYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBTSkgY29uc3Qgew0KKyAgd3NNZXJpZGllbU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbChGWF9CU1RSQygibWVyaWRpZW0iKSwgYkFNID8gMCA6IDEsIEZBTFNFKTsNCiB9DQotdm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSBjb25zdA0KLXsNCi0gICAgSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBwUHJvdmlkZXIgPSBJWEZBX1RpbWVab25lUHJvdmlkZXI6OkdldCgpOw0KLSAgICBwUHJvdmlkZXItPkdldFRpbWVab25lKHR6KTsNCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopIGNvbnN0IHsNCisgIElYRkFfVGltZVpvbmVQcm92aWRlciogcFByb3ZpZGVyID0gSVhGQV9UaW1lWm9uZVByb3ZpZGVyOjpHZXQoKTsNCisgIHBQcm92aWRlci0+R2V0VGltZVpvbmUodHopOw0KIH0NCi12b2lkIENYRkFfWE1MTG9jYWxlOjpHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEICkgY29uc3QNCi17DQotICAgIHdzRXJhTmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKEZYX0JTVFJDKCJlcmEiKSwgYkFEID8gMSA6IDAsIEZBTFNFKTsNCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEKSBjb25zdCB7DQorICB3c0VyYU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbChGWF9CU1RSQygiZXJhIiksIGJBRCA/IDEgOiAwLCBGQUxTRSk7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXRDYWxlbmRhclN5bWJvbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN5bWJvbCwgaW50IGluZGV4LCBGWF9CT09MIGJBYmJyKSBjb25zdA0KLXsNCi0gICAgQ0ZYX0J5dGVTdHJpbmcgcHN0clN5bWJvbE5hbWVzID0gc3ltYm9sICsgIk5hbWVzIjsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2xOYW1lID0gTCIiOw0KLSAgICBpZiAobV9wTG9jYWxlRGF0YSkgew0KLSAgICAgICAgQ1hNTF9FbGVtZW50ICpwQ2hpbGQgPSBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KCIiLCBGWF9CU1RSQygiY2FsZW5kYXJTeW1ib2xzIikpOw0KLSAgICAgICAgaWYgKHBDaGlsZCkgew0KLSAgICAgICAgICAgIENYTUxfRWxlbWVudCAqcFN5bWJvbE5hbWVzID0gcENoaWxkLT5HZXRFbGVtZW50KCIiLCBwc3RyU3ltYm9sTmFtZXMpOw0KLSAgICAgICAgICAgIGlmIChwU3ltYm9sTmFtZXMpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHBTeW1ib2xOYW1lcy0+R2V0QXR0ckludGVnZXIoRlhfQlNUUkMoImFiYnIiKSkgIT0gYkFiYnIpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBTeW1ib2xOYW1lcyA9IHBDaGlsZC0+R2V0RWxlbWVudCgiIiwgcHN0clN5bWJvbE5hbWVzLCAxKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAocFN5bWJvbE5hbWVzICYmIHBTeW1ib2xOYW1lcy0+R2V0QXR0ckludGVnZXIoRlhfQlNUUkMoImFiYnIiKSkgPT0gYkFiYnIpIHsNCi0gICAgICAgICAgICAgICAgICAgIENYTUxfRWxlbWVudCAqcFN5bWJvbE5hbWUgPSBwU3ltYm9sTmFtZXMtPkdldEVsZW1lbnQoIiIsIHN5bWJvbCwgaW5kZXgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTeW1ib2xOYW1lKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NTeW1ib2xOYW1lID0gcFN5bWJvbE5hbWUtPkdldENvbnRlbnQoMCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9YTUxMb2NhbGU6OkdldENhbGVuZGFyU3ltYm9sKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3ltYm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIpIGNvbnN0IHsNCisgIENGWF9CeXRlU3RyaW5nIHBzdHJTeW1ib2xOYW1lcyA9IHN5bWJvbCArICJOYW1lcyI7DQorICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbE5hbWUgPSBMIiI7DQorICBpZiAobV9wTG9jYWxlRGF0YSkgew0KKyAgICBDWE1MX0VsZW1lbnQqIHBDaGlsZCA9DQorICAgICAgICBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KCIiLCBGWF9CU1RSQygiY2FsZW5kYXJTeW1ib2xzIikpOw0KKyAgICBpZiAocENoaWxkKSB7DQorICAgICAgQ1hNTF9FbGVtZW50KiBwU3ltYm9sTmFtZXMgPSBwQ2hpbGQtPkdldEVsZW1lbnQoIiIsIHBzdHJTeW1ib2xOYW1lcyk7DQorICAgICAgaWYgKHBTeW1ib2xOYW1lcykgew0KKyAgICAgICAgaWYgKHBTeW1ib2xOYW1lcy0+R2V0QXR0ckludGVnZXIoRlhfQlNUUkMoImFiYnIiKSkgIT0gYkFiYnIpIHsNCisgICAgICAgICAgcFN5bWJvbE5hbWVzID0gcENoaWxkLT5HZXRFbGVtZW50KCIiLCBwc3RyU3ltYm9sTmFtZXMsIDEpOw0KICAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiB3c1N5bWJvbE5hbWU7DQotfQ0KLXZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0DQotew0KLSAgICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudChGWF9CU1RSQygiIiksIEZYX0JTVFJDKCJkYXRlUGF0dGVybnMiKSk7DQotICAgIGlmIChwRWxlbWVudCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KLSAgICBzd2l0Y2ggKGVUeXBlKSB7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ6DQotICAgICAgICAgICAgd3NOYW1lID0gTCJzaG9ydCI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdDoNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW06DQotICAgICAgICAgICAgd3NOYW1lID0gTCJtZWQiOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0Z1bGw6DQotICAgICAgICAgICAgd3NOYW1lID0gTCJmdWxsIjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nOg0KLSAgICAgICAgICAgIHdzTmFtZSA9IEwibG9uZyI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgR2V0UGF0dGVybihwRWxlbWVudCwgRlhfQlNUUkMoImRhdGVQYXR0ZXJuIiksIHdzTmFtZSwgd3NQYXR0ZXJuKTsNCi19DQotdm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3QNCi17DQotICAgIENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KEZYX0JTVFJDKCIiKSwgRlhfQlNUUkMoInRpbWVQYXR0ZXJucyIpKTsNCi0gICAgaWYgKHBFbGVtZW50ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQotICAgIHN3aXRjaCAoZVR5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydDoNCi0gICAgICAgICAgICB3c05hbWUgPSBMInNob3J0IjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0Og0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bToNCi0gICAgICAgICAgICB3c05hbWUgPSBMIm1lZCI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoNCi0gICAgICAgICAgICB3c05hbWUgPSBMImZ1bGwiOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmc6DQotICAgICAgICAgICAgd3NOYW1lID0gTCJsb25nIjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBHZXRQYXR0ZXJuKHBFbGVtZW50LCBGWF9CU1RSQygidGltZVBhdHRlcm4iKSwgd3NOYW1lLCB3c1BhdHRlcm4pOw0KLX0NCi12b2lkIENYRkFfWE1MTG9jYWxlOjpHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdA0KLXsNCi0gICAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9IG1fcExvY2FsZURhdGEtPkdldEVsZW1lbnQoRlhfQlNUUkMoIiIpLCBGWF9CU1RSQygibnVtYmVyUGF0dGVybnMiKSk7DQotICAgIGlmIChwRWxlbWVudCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgc3dpdGNoIChlVHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX1BlcmNlbnQ6DQotICAgICAgICAgICAgd3NQYXR0ZXJuID0gZ19GWF9QZXJjZW50Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX0N1cnJlbmN5Og0KLSAgICAgICAgICAgIHdzUGF0dGVybiA9IGdfRlhfQ3VycmVuY3k7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fRGVjaW1hbDoNCi0gICAgICAgICAgICB3c1BhdHRlcm4gPSBnX0ZYX0RlY2ltYWw7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fSW50ZWdlcjoNCi0gICAgICAgICAgICB3c1BhdHRlcm4gPSBnX0ZYX0ludGVnZXI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0UGF0dGVybihDWE1MX0VsZW1lbnQqIHBFbGVtZW50LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3QNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gcEVsZW1lbnQtPkNvdW50RWxlbWVudHMoRlhfQlNUUkMoIiIpLCBic1RhZyk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICBDWE1MX0VsZW1lbnQqIHBDaGlsZCA9IHBFbGVtZW50LT5HZXRFbGVtZW50KEZYX0JTVFJDKCIiKSwgYnNUYWcsIGkpOw0KLSAgICAgICAgaWYgKHBDaGlsZC0+R2V0QXR0clZhbHVlKEZYX0JTVFJDKCJuYW1lIikpID09IHdzTmFtZSkgew0KLSAgICAgICAgICAgIHdzUGF0dGVybiA9IHBDaGlsZC0+R2V0Q29udGVudCgwKTsNCi0gICAgICAgICAgICByZXR1cm47DQorICAgICAgICBpZiAocFN5bWJvbE5hbWVzICYmDQorICAgICAgICAgICAgcFN5bWJvbE5hbWVzLT5HZXRBdHRySW50ZWdlcihGWF9CU1RSQygiYWJiciIpKSA9PSBiQWJicikgew0KKyAgICAgICAgICBDWE1MX0VsZW1lbnQqIHBTeW1ib2xOYW1lID0NCisgICAgICAgICAgICAgIHBTeW1ib2xOYW1lcy0+R2V0RWxlbWVudCgiIiwgc3ltYm9sLCBpbmRleCk7DQorICAgICAgICAgIGlmIChwU3ltYm9sTmFtZSkgew0KKyAgICAgICAgICAgIHdzU3ltYm9sTmFtZSA9IHBTeW1ib2xOYW1lLT5HZXRDb250ZW50KDApOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQorICAgICAgfQ0KICAgICB9DQorICB9DQorICByZXR1cm4gd3NTeW1ib2xOYW1lOw0KIH0NCi1DWEZBX05vZGVMb2NhbGU6OkNYRkFfTm9kZUxvY2FsZShDWEZBX05vZGUgKnBMb2NhbGUpDQotew0KLSAgICBtX3BMb2NhbGUgPSBwTG9jYWxlOw0KK3ZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgew0KKyAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9DQorICAgICAgbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudChGWF9CU1RSQygiIiksIEZYX0JTVFJDKCJkYXRlUGF0dGVybnMiKSk7DQorICBpZiAocEVsZW1lbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydDoNCisgICAgICB3c05hbWUgPSBMInNob3J0IjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQ6DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW06DQorICAgICAgd3NOYW1lID0gTCJtZWQiOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoNCisgICAgICB3c05hbWUgPSBMImZ1bGwiOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzoNCisgICAgICB3c05hbWUgPSBMImxvbmciOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgR2V0UGF0dGVybihwRWxlbWVudCwgRlhfQlNUUkMoImRhdGVQYXR0ZXJuIiksIHdzTmFtZSwgd3NQYXR0ZXJuKTsNCiB9DQotQ1hGQV9Ob2RlTG9jYWxlOjp+Q1hGQV9Ob2RlTG9jYWxlKCkNCi17DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCB7DQorICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0NCisgICAgICBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KEZYX0JTVFJDKCIiKSwgRlhfQlNUUkMoInRpbWVQYXR0ZXJucyIpKTsNCisgIGlmIChwRWxlbWVudCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0Og0KKyAgICAgIHdzTmFtZSA9IEwic2hvcnQiOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdDoNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bToNCisgICAgICB3c05hbWUgPSBMIm1lZCI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOg0KKyAgICAgIHdzTmFtZSA9IEwiZnVsbCI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nOg0KKyAgICAgIHdzTmFtZSA9IEwibG9uZyI7DQorICAgICAgYnJlYWs7DQorICB9DQorICBHZXRQYXR0ZXJuKHBFbGVtZW50LCBGWF9CU1RSQygidGltZVBhdHRlcm4iKSwgd3NOYW1lLCB3c1BhdHRlcm4pOw0KIH0NCi12b2lkIENYRkFfTm9kZUxvY2FsZTo6UmVsZWFzZSgpDQotew0KLSAgICBkZWxldGUgdGhpczsNCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgew0KKyAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9DQorICAgICAgbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudChGWF9CU1RSQygiIiksIEZYX0JTVFJDKCJudW1iZXJQYXR0ZXJucyIpKTsNCisgIGlmIChwRWxlbWVudCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX1BlcmNlbnQ6DQorICAgICAgd3NQYXR0ZXJuID0gZ19GWF9QZXJjZW50Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fQ3VycmVuY3k6DQorICAgICAgd3NQYXR0ZXJuID0gZ19GWF9DdXJyZW5jeTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX0RlY2ltYWw6DQorICAgICAgd3NQYXR0ZXJuID0gZ19GWF9EZWNpbWFsOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fSW50ZWdlcjoNCisgICAgICB3c1BhdHRlcm4gPSBnX0ZYX0ludGVnZXI7DQorICAgICAgYnJlYWs7DQorICB9DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0TmFtZSgpDQotew0KLSAgICByZXR1cm4gbV9wTG9jYWxlID8gbV9wTG9jYWxlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpIDogTlVMTDsNCi19DQotdm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTCBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdA0KLXsNCi0gICAgc3dpdGNoIChlVHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbDoNCi0gICAgICAgICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2xzLCBGWF9XU1RSQyhMImRlY2ltYWwiKSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZzoNCi0gICAgICAgICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2xzLCBGWF9XU1RSQyhMImdyb3VwaW5nIikpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudDoNCi0gICAgICAgICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2xzLCBGWF9XU1RSQyhMInBlcmNlbnQiKSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51czoNCi0gICAgICAgICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2xzLCBGWF9XU1RSQyhMIm1pbnVzIikpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfWmVybzoNCi0gICAgICAgICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2xzLCBGWF9XU1RSQyhMInplcm8iKSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbDoNCi0gICAgICAgICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbHMsIEZYX1dTVFJDKEwic3ltYm9sIikpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lOYW1lOg0KLSAgICAgICAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9scywgRlhfV1NUUkMoTCJpc29uYW1lIikpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KK3ZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldFBhdHRlcm4oQ1hNTF9FbGVtZW50KiBwRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0IHsNCisgIGludDMyX3QgaUNvdW50ID0gcEVsZW1lbnQtPkNvdW50RWxlbWVudHMoRlhfQlNUUkMoIiIpLCBic1RhZyk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDWE1MX0VsZW1lbnQqIHBDaGlsZCA9IHBFbGVtZW50LT5HZXRFbGVtZW50KEZYX0JTVFJDKCIiKSwgYnNUYWcsIGkpOw0KKyAgICBpZiAocENoaWxkLT5HZXRBdHRyVmFsdWUoRlhfQlNUUkMoIm5hbWUiKSkgPT0gd3NOYW1lKSB7DQorICAgICAgd3NQYXR0ZXJuID0gcENoaWxkLT5HZXRDb250ZW50KDApOw0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Ob2RlICpwU3ltYm9scyA9IG1fcExvY2FsZSA/IG1fcExvY2FsZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRGF0ZVRpbWVTeW1ib2xzKSA6IE5VTEw7DQotICAgIHdzRHRTeW1ib2wgPSBwU3ltYm9scyA/IHBTeW1ib2xzLT5HZXRDb250ZW50KCkgOiBDRlhfV2lkZVN0cmluZygpOw0KK0NYRkFfTm9kZUxvY2FsZTo6Q1hGQV9Ob2RlTG9jYWxlKENYRkFfTm9kZSogcExvY2FsZSkgew0KKyAgbV9wTG9jYWxlID0gcExvY2FsZTsNCiB9DQotdm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldE1vbnRoTmFtZShpbnQzMl90IG5Nb250aCwgQ0ZYX1dpZGVTdHJpbmcmIHdzTW9udGhOYW1lLCBGWF9CT09MIGJBYmJyICkgY29uc3QNCi17DQotICAgIHdzTW9udGhOYW1lID0gR2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlRfTW9udGhOYW1lcywgbk1vbnRoLCBiQWJicik7DQorQ1hGQV9Ob2RlTG9jYWxlOjp+Q1hGQV9Ob2RlTG9jYWxlKCkge30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6UmVsZWFzZSgpIHsNCisgIGRlbGV0ZSB0aGlzOw0KIH0NCi12b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0RGF5TmFtZShpbnQzMl90IG5XZWVrLCBDRlhfV2lkZVN0cmluZyYgd3NEYXlOYW1lLCBGWF9CT09MIGJBYmJyICkgY29uc3QNCi17DQotICAgIHdzRGF5TmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKFhGQV9FTEVNRU5UX0RheU5hbWVzLCBuV2VlaywgYkFiYnIpOw0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0TmFtZSgpIHsNCisgIHJldHVybiBtX3BMb2NhbGUgPyBtX3BMb2NhbGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSkgOiBOVUxMOw0KIH0NCi12b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwgRlhfQk9PTCBiQU0gKSBjb25zdA0KLXsNCi0gICAgd3NNZXJpZGllbU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbChYRkFfRUxFTUVOVF9NZXJpZGllbU5hbWVzLCBiQU0gPyAwIDogMSwgRkFMU0UpOw0KK3ZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c051bVN5bWJvbCkgY29uc3Qgew0KKyAgc3dpdGNoIChlVHlwZSkgew0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsOg0KKyAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsIEZYX1dTVFJDKEwiZGVjaW1hbCIpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfR3JvdXBpbmc6DQorICAgICAgd3NOdW1TeW1ib2wgPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfTnVtYmVyU3ltYm9scywgRlhfV1NUUkMoTCJncm91cGluZyIpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudDoNCisgICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2xzLCBGWF9XU1RSQyhMInBlcmNlbnQiKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzOg0KKyAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsIEZYX1dTVFJDKEwibWludXMiKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX1plcm86DQorICAgICAgd3NOdW1TeW1ib2wgPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfTnVtYmVyU3ltYm9scywgRlhfV1NUUkMoTCJ6ZXJvIikpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbDoNCisgICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbHMsIEZYX1dTVFJDKEwic3ltYm9sIikpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeU5hbWU6DQorICAgICAgd3NOdW1TeW1ib2wgPQ0KKyAgICAgICAgICBHZXRTeW1ib2woWEZBX0VMRU1FTlRfQ3VycmVuY3lTeW1ib2xzLCBGWF9XU1RSQyhMImlzb25hbWUiKSk7DQorICAgICAgYnJlYWs7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopIGNvbnN0DQotew0KLSAgICBJWEZBX1RpbWVab25lUHJvdmlkZXIqIHBQcm92aWRlciA9IElYRkFfVGltZVpvbmVQcm92aWRlcjo6R2V0KCk7DQotICAgIHBQcm92aWRlci0+R2V0VGltZVpvbmUodHopOw0KK3ZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpHZXREYXRlVGltZVN5bWJvbHMoQ0ZYX1dpZGVTdHJpbmcmIHdzRHRTeW1ib2wpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcFN5bWJvbHMgPQ0KKyAgICAgIG1fcExvY2FsZSA/IG1fcExvY2FsZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRGF0ZVRpbWVTeW1ib2xzKSA6IE5VTEw7DQorICB3c0R0U3ltYm9sID0gcFN5bWJvbHMgPyBwU3ltYm9scy0+R2V0Q29udGVudCgpIDogQ0ZYX1dpZGVTdHJpbmcoKTsNCiB9DQotdm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldEVyYU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRXJhTmFtZSwgRlhfQk9PTCBiQUQgKSBjb25zdA0KLXsNCi0gICAgd3NFcmFOYW1lID0gR2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlRfRXJhTmFtZXMsIGJBRCA/IDEgOiAwLCBGQUxTRSk7DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldE1vbnRoTmFtZShpbnQzMl90IG5Nb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIpIGNvbnN0IHsNCisgIHdzTW9udGhOYW1lID0gR2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlRfTW9udGhOYW1lcywgbk1vbnRoLCBiQWJicik7DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpHZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdA0KLXsNCi0gICAgc3dpdGNoIChlVHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0Og0KLSAgICAgICAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9EYXRlUGF0dGVybnMsIEZYX1dTVFJDKEwic2hvcnQiKSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOg0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQ6DQotICAgICAgICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJucywgRlhfV1NUUkMoTCJtZWQiKSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoNCi0gICAgICAgICAgICB3c1BhdHRlcm4gPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfRGF0ZVBhdHRlcm5zLCBGWF9XU1RSQyhMImZ1bGwiKSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzoNCi0gICAgICAgICAgICB3c1BhdHRlcm4gPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfRGF0ZVBhdHRlcm5zLCBGWF9XU1RSQyhMImxvbmciKSk7DQotICAgICAgICAgICAgYnJlYWs7DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldERheU5hbWUoaW50MzJfdCBuV2VlaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NEYXlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIpIGNvbnN0IHsNCisgIHdzRGF5TmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKFhGQV9FTEVNRU5UX0RheU5hbWVzLCBuV2VlaywgYkFiYnIpOw0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFNKSBjb25zdCB7DQorICB3c01lcmlkaWVtTmFtZSA9DQorICAgICAgR2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlRfTWVyaWRpZW1OYW1lcywgYkFNID8gMCA6IDEsIEZBTFNFKTsNCit9DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikgY29uc3Qgew0KKyAgSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBwUHJvdmlkZXIgPSBJWEZBX1RpbWVab25lUHJvdmlkZXI6OkdldCgpOw0KKyAgcFByb3ZpZGVyLT5HZXRUaW1lWm9uZSh0eik7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEKSBjb25zdCB7DQorICB3c0VyYU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbChYRkFfRUxFTUVOVF9FcmFOYW1lcywgYkFEID8gMSA6IDAsIEZBTFNFKTsNCit9DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0IHsNCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0Og0KKyAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9EYXRlUGF0dGVybnMsIEZYX1dTVFJDKEwic2hvcnQiKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW06DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0Og0KKyAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9EYXRlUGF0dGVybnMsIEZYX1dTVFJDKEwibWVkIikpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoNCisgICAgICB3c1BhdHRlcm4gPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfRGF0ZVBhdHRlcm5zLCBGWF9XU1RSQyhMImZ1bGwiKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nOg0KKyAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9EYXRlUGF0dGVybnMsIEZYX1dTVFJDKEwibG9uZyIpKTsNCisgICAgICBicmVhazsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0IHsNCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0Og0KKyAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9UaW1lUGF0dGVybnMsIEZYX1dTVFJDKEwic2hvcnQiKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW06DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0Og0KKyAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9UaW1lUGF0dGVybnMsIEZYX1dTVFJDKEwibWVkIikpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoNCisgICAgICB3c1BhdHRlcm4gPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfVGltZVBhdHRlcm5zLCBGWF9XU1RSQyhMImZ1bGwiKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nOg0KKyAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9UaW1lUGF0dGVybnMsIEZYX1dTVFJDKEwibG9uZyIpKTsNCisgICAgICBicmVhazsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldE51bVBhdHRlcm4oRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgew0KKyAgc3dpdGNoIChlVHlwZSkgew0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fUGVyY2VudDoNCisgICAgICB3c1BhdHRlcm4gPSBnX0ZYX1BlcmNlbnQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9DdXJyZW5jeToNCisgICAgICB3c1BhdHRlcm4gPSBnX0ZYX0N1cnJlbmN5Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fRGVjaW1hbDoNCisgICAgICB3c1BhdHRlcm4gPSBnX0ZYX0RlY2ltYWw7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9JbnRlZ2VyOg0KKyAgICAgIHdzUGF0dGVybiA9IGdfRlhfSW50ZWdlcjsNCisgICAgICBicmVhazsNCisgIH0NCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGVMb2NhbGU6OkdldE5vZGVCeU5hbWUoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBDaGlsZCA9DQorICAgICAgcFBhcmVudCA/IHBQYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSA6IE5VTEw7DQorICB3aGlsZSAocENoaWxkKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hpbGQ7DQorICAgIGlmIChwQ2hpbGQtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzQ2hpbGQpKSB7DQorICAgICAgaWYgKHdzQ2hpbGQgPT0gd3NOYW1lKSB7DQorICAgICAgICByZXR1cm4gcENoaWxkOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotdm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0DQotew0KLSAgICBzd2l0Y2ggKGVUeXBlKSB7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ6DQotICAgICAgICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX1RpbWVQYXR0ZXJucywgRlhfV1NUUkMoTCJzaG9ydCIpKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW06DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdDoNCi0gICAgICAgICAgICB3c1BhdHRlcm4gPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfVGltZVBhdHRlcm5zLCBGWF9XU1RSQyhMIm1lZCIpKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOg0KLSAgICAgICAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9UaW1lUGF0dGVybnMsIEZYX1dTVFJDKEwiZnVsbCIpKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nOg0KLSAgICAgICAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9UaW1lUGF0dGVybnMsIEZYX1dTVFJDKEwibG9uZyIpKTsNCi0gICAgICAgICAgICBicmVhazsNCitDRlhfV2lkZVN0cmluZyBDWEZBX05vZGVMb2NhbGU6OkdldFN5bWJvbCgNCisgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3ltYm9sX3R5cGUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcFN5bWJvbHMgPSBtX3BMb2NhbGUgPyBtX3BMb2NhbGUtPkdldENoaWxkKDAsIGVFbGVtZW50KSA6IE5VTEw7DQorICBDWEZBX05vZGUqIHBTeW1ib2wgPSBHZXROb2RlQnlOYW1lKHBTeW1ib2xzLCBzeW1ib2xfdHlwZSk7DQorICByZXR1cm4gcFN5bWJvbCA/IHBTeW1ib2wtPkdldENvbnRlbnQoKSA6IENGWF9XaWRlU3RyaW5nKCk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBDYWxlbmRhciA9DQorICAgICAgbV9wTG9jYWxlID8gbV9wTG9jYWxlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9DYWxlbmRhclN5bWJvbHMpIDogTlVMTDsNCisgIGlmIChwQ2FsZW5kYXIpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBDYWxlbmRhci0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoZUVsZW1lbnQpOw0KKyAgICBmb3IgKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKGVFbGVtZW50KSkgew0KKyAgICAgIGlmIChwTm9kZS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX0FiYnIpID09IGJBYmJyKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBTeW1ib2wgPSBwTm9kZS0+R2V0Q2hpbGQoaW5kZXgsIFhGQV9FTEVNRU5UX1VOS05PV04pOw0KKyAgICAgICAgcmV0dXJuIHBTeW1ib2wgPyBwU3ltYm9sLT5HZXRDb250ZW50KCkgOiBDRlhfV2lkZVN0cmluZygpOw0KKyAgICAgIH0NCiAgICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3QNCi17DQotICAgIHN3aXRjaCAoZVR5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9QZXJjZW50Og0KLSAgICAgICAgICAgIHdzUGF0dGVybiA9IGdfRlhfUGVyY2VudDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9DdXJyZW5jeToNCi0gICAgICAgICAgICB3c1BhdHRlcm4gPSBnX0ZYX0N1cnJlbmN5Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX0RlY2ltYWw6DQotICAgICAgICAgICAgd3NQYXR0ZXJuID0gZ19GWF9EZWNpbWFsOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX0ludGVnZXI6DQotICAgICAgICAgICAgd3NQYXR0ZXJuID0gZ19GWF9JbnRlZ2VyOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotfQ0KLUNYRkFfTm9kZSogQ1hGQV9Ob2RlTG9jYWxlOjpHZXROb2RlQnlOYW1lKENYRkFfTm9kZSAqcFBhcmVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIGNvbnN0DQotew0KLSAgICBDWEZBX05vZGUgKnBDaGlsZCA9IHBQYXJlbnQgPyBwUGFyZW50LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkgOiBOVUxMOw0KLSAgICB3aGlsZSAocENoaWxkKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoaWxkOw0KLSAgICAgICAgaWYgKHBDaGlsZC0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NDaGlsZCkpIHsNCi0gICAgICAgICAgICBpZiAod3NDaGlsZCA9PSB3c05hbWUpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBDaGlsZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0U3ltYm9sKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN5bWJvbF90eXBlKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9Ob2RlICpwU3ltYm9scyA9IG1fcExvY2FsZSA/IG1fcExvY2FsZS0+R2V0Q2hpbGQoMCwgZUVsZW1lbnQpIDogTlVMTDsNCi0gICAgQ1hGQV9Ob2RlICpwU3ltYm9sID0gR2V0Tm9kZUJ5TmFtZShwU3ltYm9scywgc3ltYm9sX3R5cGUpOw0KLSAgICByZXR1cm4gcFN5bWJvbCA/IHBTeW1ib2wtPkdldENvbnRlbnQoKSA6IENGWF9XaWRlU3RyaW5nKCk7DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlQgZUVsZW1lbnQsIGludCBpbmRleCwgRlhfQk9PTCBiQWJicikgY29uc3QNCi17DQotICAgIENYRkFfTm9kZSAqcENhbGVuZGFyID0gbV9wTG9jYWxlID8gbV9wTG9jYWxlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9DYWxlbmRhclN5bWJvbHMpIDogTlVMTDsNCi0gICAgaWYgKHBDYWxlbmRhcikgew0KLSAgICAgICAgQ1hGQV9Ob2RlICpwTm9kZSA9IHBDYWxlbmRhci0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoZUVsZW1lbnQpOw0KLSAgICAgICAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhlRWxlbWVudCkpIHsNCi0gICAgICAgICAgICBpZiAocE5vZGUtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9BYmJyKSA9PSBiQWJicikgew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBTeW1ib2wgPSBwTm9kZS0+R2V0Q2hpbGQoaW5kZXgsIFhGQV9FTEVNRU5UX1VOS05PV04pOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcFN5bWJvbCA/IHBTeW1ib2wtPkdldENvbnRlbnQoKSA6IENGWF9XaWRlU3RyaW5nKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOw0KKyAgfQ0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGUuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGUuaAppbmRleCAzMjllYmMyLi5jOWE3MTM2IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxlLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZS5oCkBAIC02LDU2ICs2LDgzIEBACiANCiAjaWZuZGVmIF9GWEZBX0xPQ0FMRV9IDQogI2RlZmluZSBfRlhGQV9MT0NBTEVfSA0KLWNsYXNzIENYRkFfWE1MTG9jYWxlIDogcHVibGljIElGWF9Mb2NhbGUNCi17DQotcHVibGljOg0KLSAgICBDWEZBX1hNTExvY2FsZShDWE1MX0VsZW1lbnQqIHBMb2NhbGVEYXRhKTsNCi0gICAgdmlydHVhbCB2b2lkCVJlbGVhc2UoKTsNCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXROYW1lKCk7DQotICAgIHZpcnR1YWwgdm9pZAlHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c051bVN5bWJvbCkgY29uc3Q7DQorY2xhc3MgQ1hGQV9YTUxMb2NhbGUgOiBwdWJsaWMgSUZYX0xvY2FsZSB7DQorIHB1YmxpYzoNCisgIENYRkFfWE1MTG9jYWxlKENYTUxfRWxlbWVudCogcExvY2FsZURhdGEpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0TmFtZSgpOw0KKyAgdmlydHVhbCB2b2lkIEdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NOdW1TeW1ib2wpIGNvbnN0Ow0KIA0KLSAgICB2aXJ0dWFsIHZvaWQJR2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCUdldE1vbnRoTmFtZShpbnQzMl90IG5Nb250aCwgQ0ZYX1dpZGVTdHJpbmcmIHdzTW9udGhOYW1lLCBGWF9CT09MIGJBYmJyID0gVFJVRSkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAlHZXREYXlOYW1lKGludDMyX3QgbldlZWssIENGWF9XaWRlU3RyaW5nJiB3c0RheU5hbWUsIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCUdldE1lcmlkaWVtTmFtZShDRlhfV2lkZVN0cmluZyYgd3NNZXJpZGllbU5hbWUsIEZYX0JPT0wgYkFNID0gVFJVRSkgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAlHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJR2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLCBGWF9CT09MIGJBRCA9IFRSVUUpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldERhdGVUaW1lU3ltYm9scyhDRlhfV2lkZVN0cmluZyYgd3NEdFN5bWJvbCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NNb250aE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXREYXlOYW1lKGludDMyX3QgbldlZWssDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NEYXlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWJiciA9IFRSVUUpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldE1lcmlkaWVtTmFtZShDRlhfV2lkZVN0cmluZyYgd3NNZXJpZGllbU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFNID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEID0gVFJVRSkgY29uc3Q7DQogDQotICAgIHZpcnR1YWwgdm9pZAlHZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCUdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldE51bVBhdHRlcm4oRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCiANCi1wcm90ZWN0ZWQ6DQotICAgIH5DWEZBX1hNTExvY2FsZSgpOw0KLSAgICB2b2lkCQkJR2V0UGF0dGVybihDWE1MX0VsZW1lbnQqIHBFbGVtZW50LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQotICAgIENGWF9XaWRlU3RyaW5nCUdldENhbGVuZGFyU3ltYm9sKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3ltYm9sLCBpbnQgaW5kZXgsIEZYX0JPT0wgYkFiYnIpIGNvbnN0Ow0KLXByaXZhdGU6DQotICAgIENYTUxfRWxlbWVudCoJbV9wTG9jYWxlRGF0YTsNCisgcHJvdGVjdGVkOg0KKyAgfkNYRkFfWE1MTG9jYWxlKCk7DQorICB2b2lkIEdldFBhdHRlcm4oQ1hNTF9FbGVtZW50KiBwRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0Q2FsZW5kYXJTeW1ib2woY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzeW1ib2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyKSBjb25zdDsNCisNCisgcHJpdmF0ZToNCisgIENYTUxfRWxlbWVudCogbV9wTG9jYWxlRGF0YTsNCiB9Ow0KLWNsYXNzIENYRkFfTm9kZUxvY2FsZSA6IHB1YmxpYyBJRlhfTG9jYWxlDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9Ob2RlTG9jYWxlKENYRkFfTm9kZSogcExvY2FsZSk7DQotICAgIHZpcnR1YWwgdm9pZAlSZWxlYXNlKCk7DQotICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0TmFtZSgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJR2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NOdW1TeW1ib2wpIGNvbnN0Ow0KK2NsYXNzIENYRkFfTm9kZUxvY2FsZSA6IHB1YmxpYyBJRlhfTG9jYWxlIHsNCisgcHVibGljOg0KKyAgQ1hGQV9Ob2RlTG9jYWxlKENYRkFfTm9kZSogcExvY2FsZSk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXROYW1lKCk7DQorICB2aXJ0dWFsIHZvaWQgR2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c051bVN5bWJvbCkgY29uc3Q7DQogDQotICAgIHZpcnR1YWwgdm9pZAlHZXREYXRlVGltZVN5bWJvbHMoQ0ZYX1dpZGVTdHJpbmcmIHdzRHRTeW1ib2wpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJR2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLCBDRlhfV2lkZVN0cmluZyYgd3NNb250aE5hbWUsIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCUdldERheU5hbWUoaW50MzJfdCBuV2VlaywgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwgRlhfQk9PTCBiQWJiciA9IFRSVUUpIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJR2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwgRlhfQk9PTCBiQU0gPSBUUlVFKSBjb25zdDsNCi0gICAgdmlydHVhbCB2b2lkCUdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAlHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRNb250aE5hbWUoaW50MzJfdCBuTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWJiciA9IFRSVUUpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldERheU5hbWUoaW50MzJfdCBuV2VlaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RheU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQU0gPSBUUlVFKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldEVyYU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRXJhTmFtZSwgRlhfQk9PTCBiQUQgPSBUUlVFKSBjb25zdDsNCiANCi0gICAgdmlydHVhbCB2b2lkCUdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KLSAgICB2aXJ0dWFsIHZvaWQJR2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQotICAgIHZpcnR1YWwgdm9pZAlHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCi1wcm90ZWN0ZWQ6DQotICAgIH5DWEZBX05vZGVMb2NhbGUoKTsNCi0gICAgQ1hGQV9Ob2RlKgkJR2V0Tm9kZUJ5TmFtZShDWEZBX05vZGUgKnBQYXJlbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSBjb25zdDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJR2V0U3ltYm9sKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN5bWJvbF90eXBlKSBjb25zdDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcJR2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlQgZUVsZW1lbnQsIGludCBpbmRleCwgRlhfQk9PTCBiQWJicikgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldE51bVBhdHRlcm4oRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCiANCi0gICAgQ1hGQV9Ob2RlKgkJbV9wTG9jYWxlOw0KKyBwcm90ZWN0ZWQ6DQorICB+Q1hGQV9Ob2RlTG9jYWxlKCk7DQorICBDWEZBX05vZGUqIEdldE5vZGVCeU5hbWUoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSBjb25zdDsNCisgIENGWF9XaWRlU3RyaW5nIEdldFN5bWJvbChYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN5bWJvbF90eXBlKSBjb25zdDsNCisgIENGWF9XaWRlU3RyaW5nIEdldENhbGVuZGFyU3ltYm9sKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWJicikgY29uc3Q7DQorDQorICBDWEZBX05vZGUqIG1fcExvY2FsZTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZW1nci5jcHAKaW5kZXggZjg2NGJjMi4uYWQ4ZTgyMiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZW1nci5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZW1nci5jcHAKQEAgLTIwLDkxNyArMjAsMTI4OCBAQAogI2luY2x1ZGUgInhmYV9sb2NhbGUuaCINCiANCiBjb25zdCB1aW50OF90IGdfZW5VU19Mb2NhbGVbXSA9IHsNCi0gICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2RSwgMHg5QiwgMHgzMCwgMHgxNCwgMHg3RCwgMHg5RiwgMHhCNCwgMHg3RiwgMHg0MCwgMHhENiwgMHgyQSwgMHhCNSwgMHg1MiwgMHg1NiwgMHg2RiwNCi0gICAgMHg4RiwgMHhBOSwgMHg4OCwgMHhBNSwgMHg2QywgMHgyNCwgMHg5QiwgMHgzQSwgMHhEMSwgMHg1NSwgMHgyMiwgMHg1NSwgMHhCNSwgMHhCRSwgMHg0QywgMHgwRSwgMHhEQywgMHgwNSwgMHgzNCwgMHhCMCwNCi0gICAgMHgyMywgMHg4MywgMHgzNywgMHgwNSwgMHhFRCwgMHhFMywgMHg2NywgMHgwNywgMHhDMywgMHhDMCwgMHhGNiwgMHgyNCwgMHhDMiwgMHg0QiwgMHg3QywgMHhDRiwgMHgzRCwgMHhFNywgMHhFNiwgMHhERSwNCi0gICAgMHg2MywgMHgzMCwgMHg4NCwgMHgyNSwgMHg0RiwgMHg2OSwgMHgwOSwgMHgwMSwgMHhBMywgMHgxNSwgMHhBQywgMHgxMCwgMHhCMCwgMHhFRiwgMHg0RiwgMHgwOSwgMHgwQSwgMHgzMiwgMHhBOCwgMHhEMywNCi0gICAgMHgxNSwgMHhEQSwgMHhCMCwgMHg0MywgMHg1OSwgMHhENCwgMHhGOSwgMHhGNSwgMHhCQSwgMHgwMiwgMHg1MSwgMHhBNCwgMHhGNCwgMHgwNiwgMHg5MSwgMHg1MCwgMHg1MywgMHg1OSwgMHg0NiwgMHg0NSwNCi0gICAgMHg3MiwgMHhBQSwgMHhGNiwgMHhCQywgMHhBQywgMHg4RCwgMHhFQSwgMHgyMCwgMHhFMCwgMHhDMCwgMHg0NSwgMHg0MSwgMHg5OSwgMHg2MiwgMHg1NCwgMHg5QywgMHgzNSwgMHhGOSwgMHg4MywgMHg4MiwNCi0gICAgMHg2QiwgMHhCMywgMHgyNiwgMHhGNywgMHg5NCwgMHg0OSwgMHgyQSwgMHg0RSwgMHgyMSwgMHhFRSwgMHhDMiwgMHhENywgMHhBRiwgMHgwQywgMHhCRSwgMHg4NSwgMHhCRCwgMHhGMCwgMHgyNiwgMHg2MiwNCi0gICAgMHgyQSwgMHhEMiwgMHhEQywgMHg0MSwgMHhENywgMHg0NywgMHg1MSwgMHg5NCwgMHgxRSwgMHhBRSwgMHhBQiwgMHhCRiwgMHg5NywgMHgwQywgMHgzQywgMHg2MCwgMHhFOSwgMHgzMiwgMHhENywgMHhGMiwNCi0gICAgMHgyMCwgMHhFQiwgMHhDNiwgMHg4MSwgMHgxMywgMHgzOCwgMHgzNiwgMHg1MCwgMHhFRCwgMHg0MSwgMHgzOCwgMHg5OSwgMHhBRiwgMHg2OSwgMHhDMywgMHg3RCwgMHhGOCwgMHgwMywgMHhGRiwgMHhFNSwNCi0gICAgMHgxNywgMHg0NCwgMHg5MCwgMHhEQSwgMHgwOSwgMHgzQywgMHhCMiwgMHhBOCwgMHhFNywgMHg5RCwgMHhBMywgMHg4MCwgMHhFRSwgMHhGNywgMHg2MiwgMHg4NSwgMHhERSwgMHhBMywgMHg5MSwgMHg3MywNCi0gICAgMHgzRSwgMHhENywgMHg3QywgMHg4NiwgMHhGOSwgMHhFQywgMHg5QSwgMHg2QiwgMHg5NiwgMHhDRiwgMHgyQiwgMHg5RiwgMHg1NSwgMHgzRSwgMHg5RiwgMHg3QywgMHgwRSwgMHhGOSwgMHhEQywgMHhGMSwNCi0gICAgMHgxOSwgMHhGMywgMHg3RiwgMHg0RiwgMHgzMiwgMHg3QSwgMHgzMiwgMHhCNywgMHg5MCwgMHg1QSwgMHg5MSwgMHg0NCwgMHhBQSwgMHg1QiwgMHg0RSwgMHg3NSwgMHhBRSwgMHhENywgMHg1RCwgMHg5MiwNCi0gICAgMHhDNCwgMHhEQywgMHg4MSwgMHg3NiwgMHgxMiwgMHg2QSwgMHgxQiwgMHg3QiwgMHg4NiwgMHg4QywgMHhCOSwgMHhFOCwgMHgyRSwgMHg5NywgMHhDMiwgMHgwMSwgMHhCNywgMHhBMiwgMHhCMCwgMHhBMSwNCi0gICAgMHg4NCwgMHgzNiwgMHg1MiwgMHg4QywgMHg0MSwgMHgzQywgMHhGNCwgMHgzNSwgMHhFQSwgMHg3MSwgMHhCNCwgMHg2QiwgMHhBNiwgMHg1OSwgMHhCQiwgMHg1MywgMHhCQiwgMHg0RCwgMHhCQiwgMHg0NSwNCi0gICAgMHhCQiwgMHgzOSwgMHhCQiwgMHgyRiwgMHhCQiwgMHgyOSwgMHg3RiwgMHgzRiwgMHhGQSwgMHgyMSwgMHhDRCwgMHgwQSwgMHhBOCwgMHhGQSwgMHg2NywgMHhDRiwgMHg4NCwgMHg2NCwgMHgxRCwgMHgyQiwNCi0gICAgMHg3NywgMHhGQiwgMHg2MCwgMHhDNCwgMHgyMywgMHg4RiwgMHg1NiwgMHgwMiwgMHg0RiwgMHgyQiwgMHgyOCwgMHgwNCwgMHgwNCwgMHgzNSwgMHhENSwgMHhENCwgMHg4QSwgMHg3QywgMHhGOCwgMHgxOCwNCi0gICAgMHg2MiwgMHhGRCwgMHhEQiwgMHgyNSwgMHhDOCwgMHgzQSwgMHgxQSwgMHg0MiwgMHgzQywgMHgxMCwgMHg3NSwgMHg2MCwgMHg5RCwgMHgxMSwgMHg1RCwgMHhFMywgMHgwRCwgMHgzQywgMHhEMiwgMHhBNiwNCi0gICAgMHgwMSwgMHhDMSwgMHhDRSwgMHg3QiwgMHgzQSwgMHg0NCwgMHhFNiwgMHgwMCwgMHhGOSwgMHgyMSwgMHhDQiwgMHgxMiwgMHg5MSwgMHg4RCwgMHhCQSwgMHgxNiwgMHg0MSwgMHhBQywgMHhBRSwgMHgyMCwNCi0gICAgMHg1QSwgMHgwNCwgMHhERiwgMHhENCwgMHhBNSwgMHgyNywgMHgxQywgMHhCOCwgMHg1NiwgMHgyMSwgMHgyMywgMHgyRCwgMHgzOSwgMHgzQiwgMHgyMCwgMHg3MiwgMHhBMSwgMHhBOCwgMHg4MiwgMHhFQywNCi0gICAgMHhBQywgMHhCOSwgMHg0MCwgMHg1MiwgMHhFNywgMHg1QywgMHgzNCwgMHg0QSwgMHg4NCwgMHgyMywgMHhFQywgMHhFMSwgMHhFMywgMHhDOSwgMHg4NCwgMHgwQSwgMHg2OCwgMHg4QSwgMHg2QSwgMHgzNCwNCi0gICAgMHhGMSwgMHgyOCwgMHg5QSwgMHg0QywgMHg5QywgMHhERiwgMHhDNSwgMHhGMSwgMHg1RCwgMHg5MiwgMHgwNCwgMHhFQiwgMHhFMCwgMHgyNSwgMHhDNCwgMHgyMywgMHg5MiwgMHg1NSwgMHg2MSwgMHgzMiwNCi0gICAgMHhFQSwgMHg2NSwgMHg5QSwgMHhGMywgMHhBNCwgMHg4MywgMHg2NCwgMHg4NiwgMHhDMCwgMHhDQywgMHhBOSwgMHgyNSwgMHgxRSwgMHgzRSwgMHg5RSwgMHhDQywgMHg2NSwgMHg4QywgMHhEQSwgMHgyOSwNCi0gICAgMHhBQywgMHhERiwgMHhFQywgMHg0RiwgMHhBNywgMHgzOCwgMHhGQiwgMHhGOSwgMHhCOSwgMHhBQSwgMHg5MywgMHg0RCwgMHhCNCwgMHhGRCwgMHhGRCwgMHg0QywgMHhGMywgMHgyRiwgMHhFRCwgMHg0QiwNCi0gICAgMHg2NywgMHhDRSwgMHg5OCwgMHhBNCwgMHg3NCwgMHg0QywgMHhFQSwgMHg1MywgMHhGMSwgMHg5RiwgMHg0MywgMHg5MywgMHhEOCwgMHhCNCwgMHhBMiwgMHgzMCwgMHhGRCwgMHhFMiwgMHg0MSwgMHhBNCwNCi0gICAgMHg1RCwgMHhCNCwgMHhFRCwgMHhGMiwgMHhCNiwgMHg2RCwgMHhEQiwgMHgxMCwgMHg0RiwgMHg3OCwgMHg0RSwgMHgyMSwgMHgyMywgMHg0QywgMHhBNSwgMHgxMCwgMHhDMCwgMHhEMiwgMHgxMywgMHgyMiwNCi0gICAgMHg2RiwgMHgzQSwgMHhFOSwgMHg3MiwgMHhGOSwgMHhFNywgMHg3QSwgMHg1OCwgMHhERSwgMHhDQywgMHhBQywgMHg3MiwgMHgwNCwgMHg5MSwgMHgwMiwgMHg2QiwgMHhDQywgMHhERiwgMHg1RiwgMHg3OSwNCi0gICAgMHg1NCwgMHhEOCwgMHg5QSwgMHg2MiwgMHgyOCwgMHhENCwgMHgwRiwgMHgzQSwgMHgwOSwgMHg0RCwgMHhEOSwgMHgwQywgMHhEMiwgMHhBMiwgMHhBMiwgMHg2QSwgMHhGMywgMHg2RiwgMHg3QiwgMHg3RCwNCi0gICAgMHg5NywgMHhCNiwgMHhENSwgMHhDMywgMHhCQiwgMHg5NSwgMHhDQiwgMHg2MywgMHhBMSwgMHgzNywgMHg3RSwgMHgzMSwgMHg4QiwgMHgzRiwgMHg3NCwgMHg3RCwgMHgzNSwgMHg4QiwgMHg1RSwgMHgxNSwNCi0gICAgMHg0QywgMHhENiwgMHg4OCwgMHhCQywgMHg5RCwgMHg0NSwgMHg2RSwgMHg0MSwgMHg3MCwgMHg0NCwgMHhERSwgMHhCOSwgMHg1QywgMHgzQywgMHgxRCwgMHg1QiwgMHgyMSwgMHhGRCwgMHgxNiwgMHgwQywNCi0gICAgMHg0RSwgMHg0QywgMHg4MSwgMHhGRSwgMHg2NiwgMHgzQiwgMHgwNywgMHg2QSwgMHg5QiwgMHhENCwgMHhBOSwgMHgzMSwgMHhDOSwgMHhCQiwgMHgyNSwgMHg4QywgMHhBMiwgMHhBOCwgMHhCOSwgMHg1RSwNCi0gICAgMHgyMCwgMHhGMiwgMHg5NCwgMHg0NCwgMHhCMywgMHg0NSwgMHg2MywgMHhDQiwgMHg1RCwgMHgwOSwgMHhCNiwgMHg3QiwgMHhENSwgMHg1OCwgMHhGNywgMHg1NSwgMHhBNCwgMHg5NiwgMHg3RiwgMHgwMSwNCi0gICAgMHg3NSwgMHgzNywgMHgxQiwgMHg4QiwNCisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2RSwgMHg5QiwgMHgzMCwgMHgxNCwgMHg3RCwgMHg5RiwgMHhCNCwNCisgICAgMHg3RiwgMHg0MCwgMHhENiwgMHgyQSwgMHhCNSwgMHg1MiwgMHg1NiwgMHg2RiwgMHg4RiwgMHhBOSwgMHg4OCwgMHhBNSwNCisgICAgMHg2QywgMHgyNCwgMHg5QiwgMHgzQSwgMHhEMSwgMHg1NSwgMHgyMiwgMHg1NSwgMHhCNSwgMHhCRSwgMHg0QywgMHgwRSwNCisgICAgMHhEQywgMHgwNSwgMHgzNCwgMHhCMCwgMHgyMywgMHg4MywgMHgzNywgMHgwNSwgMHhFRCwgMHhFMywgMHg2NywgMHgwNywNCisgICAgMHhDMywgMHhDMCwgMHhGNiwgMHgyNCwgMHhDMiwgMHg0QiwgMHg3QywgMHhDRiwgMHgzRCwgMHhFNywgMHhFNiwgMHhERSwNCisgICAgMHg2MywgMHgzMCwgMHg4NCwgMHgyNSwgMHg0RiwgMHg2OSwgMHgwOSwgMHgwMSwgMHhBMywgMHgxNSwgMHhBQywgMHgxMCwNCisgICAgMHhCMCwgMHhFRiwgMHg0RiwgMHgwOSwgMHgwQSwgMHgzMiwgMHhBOCwgMHhEMywgMHgxNSwgMHhEQSwgMHhCMCwgMHg0MywNCisgICAgMHg1OSwgMHhENCwgMHhGOSwgMHhGNSwgMHhCQSwgMHgwMiwgMHg1MSwgMHhBNCwgMHhGNCwgMHgwNiwgMHg5MSwgMHg1MCwNCisgICAgMHg1MywgMHg1OSwgMHg0NiwgMHg0NSwgMHg3MiwgMHhBQSwgMHhGNiwgMHhCQywgMHhBQywgMHg4RCwgMHhFQSwgMHgyMCwNCisgICAgMHhFMCwgMHhDMCwgMHg0NSwgMHg0MSwgMHg5OSwgMHg2MiwgMHg1NCwgMHg5QywgMHgzNSwgMHhGOSwgMHg4MywgMHg4MiwNCisgICAgMHg2QiwgMHhCMywgMHgyNiwgMHhGNywgMHg5NCwgMHg0OSwgMHgyQSwgMHg0RSwgMHgyMSwgMHhFRSwgMHhDMiwgMHhENywNCisgICAgMHhBRiwgMHgwQywgMHhCRSwgMHg4NSwgMHhCRCwgMHhGMCwgMHgyNiwgMHg2MiwgMHgyQSwgMHhEMiwgMHhEQywgMHg0MSwNCisgICAgMHhENywgMHg0NywgMHg1MSwgMHg5NCwgMHgxRSwgMHhBRSwgMHhBQiwgMHhCRiwgMHg5NywgMHgwQywgMHgzQywgMHg2MCwNCisgICAgMHhFOSwgMHgzMiwgMHhENywgMHhGMiwgMHgyMCwgMHhFQiwgMHhDNiwgMHg4MSwgMHgxMywgMHgzOCwgMHgzNiwgMHg1MCwNCisgICAgMHhFRCwgMHg0MSwgMHgzOCwgMHg5OSwgMHhBRiwgMHg2OSwgMHhDMywgMHg3RCwgMHhGOCwgMHgwMywgMHhGRiwgMHhFNSwNCisgICAgMHgxNywgMHg0NCwgMHg5MCwgMHhEQSwgMHgwOSwgMHgzQywgMHhCMiwgMHhBOCwgMHhFNywgMHg5RCwgMHhBMywgMHg4MCwNCisgICAgMHhFRSwgMHhGNywgMHg2MiwgMHg4NSwgMHhERSwgMHhBMywgMHg5MSwgMHg3MywgMHgzRSwgMHhENywgMHg3QywgMHg4NiwNCisgICAgMHhGOSwgMHhFQywgMHg5QSwgMHg2QiwgMHg5NiwgMHhDRiwgMHgyQiwgMHg5RiwgMHg1NSwgMHgzRSwgMHg5RiwgMHg3QywNCisgICAgMHgwRSwgMHhGOSwgMHhEQywgMHhGMSwgMHgxOSwgMHhGMywgMHg3RiwgMHg0RiwgMHgzMiwgMHg3QSwgMHgzMiwgMHhCNywNCisgICAgMHg5MCwgMHg1QSwgMHg5MSwgMHg0NCwgMHhBQSwgMHg1QiwgMHg0RSwgMHg3NSwgMHhBRSwgMHhENywgMHg1RCwgMHg5MiwNCisgICAgMHhDNCwgMHhEQywgMHg4MSwgMHg3NiwgMHgxMiwgMHg2QSwgMHgxQiwgMHg3QiwgMHg4NiwgMHg4QywgMHhCOSwgMHhFOCwNCisgICAgMHgyRSwgMHg5NywgMHhDMiwgMHgwMSwgMHhCNywgMHhBMiwgMHhCMCwgMHhBMSwgMHg4NCwgMHgzNiwgMHg1MiwgMHg4QywNCisgICAgMHg0MSwgMHgzQywgMHhGNCwgMHgzNSwgMHhFQSwgMHg3MSwgMHhCNCwgMHg2QiwgMHhBNiwgMHg1OSwgMHhCQiwgMHg1MywNCisgICAgMHhCQiwgMHg0RCwgMHhCQiwgMHg0NSwgMHhCQiwgMHgzOSwgMHhCQiwgMHgyRiwgMHhCQiwgMHgyOSwgMHg3RiwgMHgzRiwNCisgICAgMHhGQSwgMHgyMSwgMHhDRCwgMHgwQSwgMHhBOCwgMHhGQSwgMHg2NywgMHhDRiwgMHg4NCwgMHg2NCwgMHgxRCwgMHgyQiwNCisgICAgMHg3NywgMHhGQiwgMHg2MCwgMHhDNCwgMHgyMywgMHg4RiwgMHg1NiwgMHgwMiwgMHg0RiwgMHgyQiwgMHgyOCwgMHgwNCwNCisgICAgMHgwNCwgMHgzNSwgMHhENSwgMHhENCwgMHg4QSwgMHg3QywgMHhGOCwgMHgxOCwgMHg2MiwgMHhGRCwgMHhEQiwgMHgyNSwNCisgICAgMHhDOCwgMHgzQSwgMHgxQSwgMHg0MiwgMHgzQywgMHgxMCwgMHg3NSwgMHg2MCwgMHg5RCwgMHgxMSwgMHg1RCwgMHhFMywNCisgICAgMHgwRCwgMHgzQywgMHhEMiwgMHhBNiwgMHgwMSwgMHhDMSwgMHhDRSwgMHg3QiwgMHgzQSwgMHg0NCwgMHhFNiwgMHgwMCwNCisgICAgMHhGOSwgMHgyMSwgMHhDQiwgMHgxMiwgMHg5MSwgMHg4RCwgMHhCQSwgMHgxNiwgMHg0MSwgMHhBQywgMHhBRSwgMHgyMCwNCisgICAgMHg1QSwgMHgwNCwgMHhERiwgMHhENCwgMHhBNSwgMHgyNywgMHgxQywgMHhCOCwgMHg1NiwgMHgyMSwgMHgyMywgMHgyRCwNCisgICAgMHgzOSwgMHgzQiwgMHgyMCwgMHg3MiwgMHhBMSwgMHhBOCwgMHg4MiwgMHhFQywgMHhBQywgMHhCOSwgMHg0MCwgMHg1MiwNCisgICAgMHhFNywgMHg1QywgMHgzNCwgMHg0QSwgMHg4NCwgMHgyMywgMHhFQywgMHhFMSwgMHhFMywgMHhDOSwgMHg4NCwgMHgwQSwNCisgICAgMHg2OCwgMHg4QSwgMHg2QSwgMHgzNCwgMHhGMSwgMHgyOCwgMHg5QSwgMHg0QywgMHg5QywgMHhERiwgMHhDNSwgMHhGMSwNCisgICAgMHg1RCwgMHg5MiwgMHgwNCwgMHhFQiwgMHhFMCwgMHgyNSwgMHhDNCwgMHgyMywgMHg5MiwgMHg1NSwgMHg2MSwgMHgzMiwNCisgICAgMHhFQSwgMHg2NSwgMHg5QSwgMHhGMywgMHhBNCwgMHg4MywgMHg2NCwgMHg4NiwgMHhDMCwgMHhDQywgMHhBOSwgMHgyNSwNCisgICAgMHgxRSwgMHgzRSwgMHg5RSwgMHhDQywgMHg2NSwgMHg4QywgMHhEQSwgMHgyOSwgMHhBQywgMHhERiwgMHhFQywgMHg0RiwNCisgICAgMHhBNywgMHgzOCwgMHhGQiwgMHhGOSwgMHhCOSwgMHhBQSwgMHg5MywgMHg0RCwgMHhCNCwgMHhGRCwgMHhGRCwgMHg0QywNCisgICAgMHhGMywgMHgyRiwgMHhFRCwgMHg0QiwgMHg2NywgMHhDRSwgMHg5OCwgMHhBNCwgMHg3NCwgMHg0QywgMHhFQSwgMHg1MywNCisgICAgMHhGMSwgMHg5RiwgMHg0MywgMHg5MywgMHhEOCwgMHhCNCwgMHhBMiwgMHgzMCwgMHhGRCwgMHhFMiwgMHg0MSwgMHhBNCwNCisgICAgMHg1RCwgMHhCNCwgMHhFRCwgMHhGMiwgMHhCNiwgMHg2RCwgMHhEQiwgMHgxMCwgMHg0RiwgMHg3OCwgMHg0RSwgMHgyMSwNCisgICAgMHgyMywgMHg0QywgMHhBNSwgMHgxMCwgMHhDMCwgMHhEMiwgMHgxMywgMHgyMiwgMHg2RiwgMHgzQSwgMHhFOSwgMHg3MiwNCisgICAgMHhGOSwgMHhFNywgMHg3QSwgMHg1OCwgMHhERSwgMHhDQywgMHhBQywgMHg3MiwgMHgwNCwgMHg5MSwgMHgwMiwgMHg2QiwNCisgICAgMHhDQywgMHhERiwgMHg1RiwgMHg3OSwgMHg1NCwgMHhEOCwgMHg5QSwgMHg2MiwgMHgyOCwgMHhENCwgMHgwRiwgMHgzQSwNCisgICAgMHgwOSwgMHg0RCwgMHhEOSwgMHgwQywgMHhEMiwgMHhBMiwgMHhBMiwgMHg2QSwgMHhGMywgMHg2RiwgMHg3QiwgMHg3RCwNCisgICAgMHg5NywgMHhCNiwgMHhENSwgMHhDMywgMHhCQiwgMHg5NSwgMHhDQiwgMHg2MywgMHhBMSwgMHgzNywgMHg3RSwgMHgzMSwNCisgICAgMHg4QiwgMHgzRiwgMHg3NCwgMHg3RCwgMHgzNSwgMHg4QiwgMHg1RSwgMHgxNSwgMHg0QywgMHhENiwgMHg4OCwgMHhCQywNCisgICAgMHg5RCwgMHg0NSwgMHg2RSwgMHg0MSwgMHg3MCwgMHg0NCwgMHhERSwgMHhCOSwgMHg1QywgMHgzQywgMHgxRCwgMHg1QiwNCisgICAgMHgyMSwgMHhGRCwgMHgxNiwgMHgwQywgMHg0RSwgMHg0QywgMHg4MSwgMHhGRSwgMHg2NiwgMHgzQiwgMHgwNywgMHg2QSwNCisgICAgMHg5QiwgMHhENCwgMHhBOSwgMHgzMSwgMHhDOSwgMHhCQiwgMHgyNSwgMHg4QywgMHhBMiwgMHhBOCwgMHhCOSwgMHg1RSwNCisgICAgMHgyMCwgMHhGMiwgMHg5NCwgMHg0NCwgMHhCMywgMHg0NSwgMHg2MywgMHhDQiwgMHg1RCwgMHgwOSwgMHhCNiwgMHg3QiwNCisgICAgMHhENSwgMHg1OCwgMHhGNywgMHg1NSwgMHhBNCwgMHg5NiwgMHg3RiwgMHgwMSwgMHg3NSwgMHgzNywgMHgxQiwgMHg4QiwNCiB9Ow0KIGNvbnN0IHVpbnQ4X3QgZ19lbkdCX0xvY2FsZVtdID0gew0KLSAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweEQxLCAweDZFLCAweEQzLCAweDMwLCAweDE0LCAweDdELCAweDQ3LCAweEUyLCAweDFGLCAweEEyLCAweDg4LCAweDQ5LCAweDIwLCAweDZELCAweDMzLCAweDNDLA0KLSAgICAweDZFLCAweEVBLCAweDJDLCAweDc1LCAweEVCLCAweEQ2LCAweDMyLCAweEM4LCAweEE4LCAweDQ4LCAweEM1LCAweEM0LCAweDVFLCAweDkwLCAweDlCLCAweDc4LCAweDhELCAweDU5LCAweDYyLCAweDU3LA0KLSAgICAweDRFLCAweENDLCAweDk0LCAweEZDLCAweDAyLCAweDlGLCAweEMwLCAweDIzLCAweENGLCAweDA4LCAweEYxLCAweDAxLCAweEJDLCAweEYwLCAweDJGLCAweDQ4LCAweEZCLCAweDBDLCAweDZFLCAweDFBLA0KLSAgICAweDI3LCAweDRCLCAweDFDLCAweEFGLCAweDY0LCAweDc5LCAweDg5LCAweEVGLCAweEI5LCAweEU3LCAweERDLCAweERFLCAweDdCLCAweDlDLCAweEI4LCAweDE5LCAweEM1LCAweDIyLCAweDIwLCAweDMxLA0KLSAgICAweDc1LCAweDM4LCAweDQ5LCAweEU4LCAweDkxLCAweDRCLCAweEY5LCAweEE3LCAweEU5LCAweEIxLCAweEVCLCAweDg0LCAweDM0LCAweDBELCAweDhFLCAweERDLCAweEJCLCAweEFGLCAweEJGLCAweEVFLA0KLSAgICAweDdFLCAweEZFLCAweDc4LCAweDBFLCAweEI3LCAweEJGLCAweERGLCAweDdFLCAweEJGLCAweDcwLCAweEYxLCAweEE4LCAweDI0LCAweEYyLCAweDkwLCAweDQ4LCAweDNGLCAweDRGLCAweDk2LCAweDIyLA0KLSAgICAweDRFLCAweEI1LCAweDY2LCAweDI1LCAweEU5LCAweDRBLCAweDQ4LCAweDQ2LCAweDM4LCAweDMwLCAweDEyLCAweEMxLCAweEIzLCAweEU4LCAweDAyLCAweEUwLCAweDU0LCAweEFGLCAweEYxLCAweDM5LA0KLSAgICAweEUxLCAweDhBLCAweEM4LCAweDdDLCAweDg0LCAweEFBLCAweEYwLCAweEU5LCAweDEzLCAweDhELCAweDlGLCAweEQxLCAweEE1LCAweEI0LCAweDI2LCAweDNDLCAweDIyLCAweDgzLCAweEE4LCAweDg3LA0KLSAgICAweDhFLCAweEQ3LCAweDkyLCAweEM1LCAweDE2LCAweDZFLCAweDVGLCAweDdGLCAweEFFLCAweDM4LCAweEI1LCAweDgwLCAweDcxLCAweDlGLCAweDM5LCAweDU2LCAweDJCLCAweDk1LCAweDY2LCAweDNELA0KLSAgICAweEQ4LCAweEE3LCAweEVCLCAweDhDLCAweDI2LCAweDRCLCAweDJBLCAweDdCLCAweDk5LCAweDc3LCAweDQxLCAweDI2LCAweDZDLCAweEY4LCAweDg1LCAweEY4LCAweDYyLCAweDE3LCAweDRDLCAweDY4LA0KLSAgICAweDYwLCAweDI2LCAweDUwLCAweENCLCAweEEyLCAweDlBLCAweEI3LCAweDg5LCAweDFDLCAweEIyLCAweDVDLCAweENBLCAweDIzLCAweEY3LCAweDk1LCAweERCLCAweDcyLCAweENFLCAweEU2LCAweDlBLA0KLSAgICAweENELCAweDMwLCAweDlCLCAweDVELCAweDQzLCAweENELCAweEIyLCAweDc5LCAweDY1LCAweEIzLCAweENBLCAweEU2LCAweDkzLCAweENELCAweDIxLCAweDlCLCAweDNCLCAweDM2LCAweDYzLCAweDFFLA0KLSAgICAweEY2LCAweDI0LCAweDI0LCAweEI5LCAweDdFLCAweDg0LCAweDYwLCAweDg1LCAweDdELCAweDA1LCAweDhGLCAweDFDLCAweDc0LCAweDVFLCAweEFFLCAweEFCLCAweDI0LCAweEY2LCAweDQ0LCAweDBGLA0KLSAgICAweDVBLCAweDI4LCAweDlBLCAweDlBLCAweEQ4LCAweDI1LCAweDBELCAweDc5LCAweDFGLCAweDVELCAweDQ0LCAweDRBLCAweEY2LCAweEMwLCAweDMzLCAweEM5LCAweDRDLCAweEM4LCAweDI3LCAweDk5LA0KLSAgICAweDkyLCAweDZELCAweDEwLCAweDM1LCAweDdELCAweEI1LCAweDdBLCAweDZDLCAweEVELCAweDlBLCAweDZFLCAweEQ2LCAweEVDLCAweEQ0LCAweDZDLCAweEQzLCAweDZDLCAweEQxLCAweDZDLCAweENFLA0KLSAgICAweEVDLCAweENCLCAweDZDLCAweENBLCAweERFLCAweDRGLCAweDQyLCAweDYxLCAweDAyLCAweDQ2LCAweDkzLCAweEZBLCAweERELCAweEQzLCAweDIxLCAweDFFLCAweDdCLCAweEUwLCAweDZFLCAweDFELA0KLSAgICAweEI0LCAweDc4LCAweDc4LCAweDZFLCAweDI0LCAweDUwLCAweEI3LCAweDAyLCAweDIwLCAweDU0LCAweDEyLCAweDVELCAweDBELCAweDU2LCAweEY4LCAweEY4LCAweDY0LCAweDg0LCAweENBLCAweDdCLA0KLSAgICAweDk1LCAweEMwLCAweEUzLCAweDQ5LCAweDEzLCAweEEyLCAweDg2LCAweDU4LCAweDA2LCAweEM2LCAweDE5LCAweDUxLCAweDM1LCAweDlFLCAweEQxLCAweDM5LCAweEM5LCAweDMyLCAweDJBLCAweEY5LA0KLSAgICAweDY2LCAweDRGLCAweDlCLCAweDQ4LCAweDFGLCAweDIwLCAweEQ3LCAweDJBLCAweDhFLCAweDVELCAweDdDLCAweDBBLCAweEQ3LCAweEFFLCAweDMzLCAweDcxLCAweDNDLCAweEI4LCAweDlDLCAweDhGLA0KLSAgICAweDcwLCAweDk1LCAweDAzLCAweDM2LCAweDU0LCAweEEzLCAweDhFLCAweDU2LCAweEM2LCAweDgyLCAweEFGLCAweDVDLCAweEZDLCAweDM4LCAweDRELCAweDQyLCAweDQzLCAweDJELCAweDE5LCAweEFBLA0KLSAgICAweDQ4LCAweDIzLCAweDIxLCAweDMzLCAweEQwLCAweDRDLCAweDkwLCAweEU3LCAweDIxLCAweEFCLCAweDA2LCAweDc1LCAweDQ2LCAweDA0LCAweDIwLCAweDYzLCAweDQ5LCAweDZCLCAweEU0LCAweDU2LA0KLSAgICAweEQ0LCAweDE5LCAweDc5LCAweDM2LCAweDNCLCAweEY0LCAweEJDLCAweDQzLCAweERGLCAweDc3LCAweEFFLCAweDQ2LCAweEE4LCAweEM1LCAweDMxLCAweDBBLCAweDc0LCAweDY2LCAweDdELCAweDk0LA0KLSAgICAweDY0LCAweDMzLCAweDZBLCAweEFELCAweDE4LCAweEMwLCAweEQ3LCAweDgzLCAweDZFLCAweDE0LCAweDNELCAweDNBLCAweEVBLCAweENDLCAweEE0LCAweDhELCAweDVBLCAweDAwLCAweDU2LCAweEVGLA0KLSAgICAweEY0LCAweDM0LCAweEY3LCAweEMyLCAweDlCLCAweDU5LCAweDkyLCAweEZBLCAweEE3LCAweDkzLCAweEIzLCAweERCLCAweDRCLCAweDEyLCAweEJELCAweDI5LCAweEFFLCAweDJBLCAweDYzLCAweERBLA0KLSAgICAweDI0LCAweEQwLCAweDcxLCAweDU1LCAweDFFLCAweDg5LCAweEY3LCAweEVFLCAweDc0LCAweDYyLCAweERELCAweDA5LCAweDYwLCAweEYwLCAweDM4LCAweDA2LCAweDJFLCAweDJFLCAweDc2LCAweDhCLA0KLSAgICAweEUyLCAweDYwLCAweEJGLCAweDI4LCAweDhBLCAweDExLCAweEVBLCAweEYwLCAweDdBLCAweDg1LCAweEI0LCAweDMwLCAweDUwLCAweDUyLCAweDUyLCAweDFFLCAweEU0LCAweDJFLCAweDdFLCAweDU2LA0KLSAgICAweDQ5LCAweDBGLCAweDBFLCAweDA2LCAweDJBLCAweEQ3LCAweDU0LCAweDA2LCAweDk0LCAweDY3LCAweEZBLCAweDI3LCAweDc3LCAweDJDLCAweDJBLCAweDY0LCAweDc0LCAweERFLCAweDE0LCAweEFBLA0KLSAgICAweDg3LCAweEVCLCAweDg0LCAweEJBLCAweDZDLCAweDQ4LCAweDAzLCAweDk2LCAweDEwLCAweEQ4LCAweEVDLCAweEZELCAweDVBLCAweDVGLCAweEE1LCAweDRELCAweDc1LCAweEYzLCAweDY3LCAweDJBLA0KLSAgICAweEQ0LCAweDlBLCAweDk1LCAweDNCLCAweEJELCAweDNCLCAweDg4LCAweERGLCAweDc0LCAweEJELCAweDMzLCAweDg4LCAweDlFLCAweDMwLCAweEFFLCAweDUyLCAweDE3LCAweEVGLCAweDBELCAweDIyLA0KLSAgICAweDE3LCAweDU0LCAweDBBLCAweDE3LCAweEJGLCAweEVDLCAweDczLCAweDUxLCAweDc3LCAweDZDLCAweDQwLCAweDZBLCAweERCLCAweDFCLCAweDI3LCAweEJBLCAweDQwLCAweEZELCAweDdDLCAweDZELA0KLSAgICAweDAyLCAweDE3LCAweEZGLCAweEY5LCAweDBFLCAweEU3LCAweDQ0LCAweDg3LCAweEQwLCAweEFGLCAweEExLCAweDI1LCAweDJDLCAweDE1LCAweEU1LCAweEMyLCAweEM1LCAweEQzLCAweEUzLCAweEY5LA0KLSAgICAweDYwLCAweDUxLCAweERCLCAweEYzLCAweEJFLCAweDA0LCAweDk5LCAweENELCAweDk2LCAweEVGLCAweDQyLCAweEJFLCAweEE2LCAweEQ3LCAweDI0LCAweDI4LCAweDBGLCAweEJCLCAweDdBLCAweEE5LA0KLSAgICAweDZCLCAweDc5LCAweDM5LCAweDdDLCAweERBLCAweDg0LCAweENFLCAweDFDLCAweEFDLCAweDQwLCAweDZELCAweDY2LCAweDlELCAweDY2LCAweDlDLCAweDA5LCAweEZFLCAweDYwLCAweEZBLCAweDQ0LA0KLSAgICAweDI4LCAweEM5LCAweEE4LCAweDc0LCAweEZDLCAweDJDLCAweEI0LCAweEU2LCAweEM3LCAweDIxLCAweDdDLCAweDUwLCAweDM4LCAweDczLCAweEY2LCAweDFGLCAweEMyLCAweDBDLCAweDNFLCAweDk2LA0KLSAgICAweEU4LCAweEVELCAweDE2LCAweEMyLCAweDU4LCAweDkyLCAweDI1LCAweEJDLCAweDJFLCAweDBGLCAweDEzLCAweDE2LCAweDExLCAweDYxLCAweEQ2LCAweEY0LCAweDFCLCAweDUxLCAweEE4LCAweDFCLA0KLSAgICAweEUyLCAweDRDLCAweDQ1LCAweDE2LCAweEIxLCAweEEwLCAweDlDLCAweDYzLCAweEVGLCAweEMzLCAweDZCLCAweEM3LCAweERCLCAweDQ2LCAweDg1LCAweDkxLCAweDgzLCAweDQ4LCAweEQ0LCAweEQ0LA0KLSAgICAweEY3LCAweDVCLCAweDdFLCAweDE0LCAweDk4LCAweEFCLCAweDcyLCAweDMyLCAweEU3LCAweEVELCAweDE2LCAweDkyLCAweDJGLCAweDA2LCAweDkwLCAweEJDLCAweDVDLCAweEYxLCAweEQ1LCAweDY3LA0KLSAgICAweEIxLCAweEUxLCAweEU5LCAweEU2LCAweEQwLCAweEZELCAweDlFLCAweDk1LCAweDUxLCAweEY1LCAweDE5LCAweDBCLCAweENCLCAweDdGLCAweDhFLCAweDY5LCAweEFDLCAweEQwDQotfTsNCisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2RSwgMHhEMywgMHgzMCwgMHgxNCwgMHg3RCwgMHg0NywgMHhFMiwNCisgICAgMHgxRiwgMHhBMiwgMHg4OCwgMHg0OSwgMHgyMCwgMHg2RCwgMHgzMywgMHgzQywgMHg2RSwgMHhFQSwgMHgyQywgMHg3NSwNCisgICAgMHhFQiwgMHhENiwgMHgzMiwgMHhDOCwgMHhBOCwgMHg0OCwgMHhDNSwgMHhDNCwgMHg1RSwgMHg5MCwgMHg5QiwgMHg3OCwNCisgICAgMHg4RCwgMHg1OSwgMHg2MiwgMHg1NywgMHg0RSwgMHhDQywgMHg5NCwgMHhGQywgMHgwMiwgMHg5RiwgMHhDMCwgMHgyMywNCisgICAgMHhDRiwgMHgwOCwgMHhGMSwgMHgwMSwgMHhCQywgMHhGMCwgMHgyRiwgMHg0OCwgMHhGQiwgMHgwQywgMHg2RSwgMHgxQSwNCisgICAgMHgyNywgMHg0QiwgMHgxQywgMHhBRiwgMHg2NCwgMHg3OSwgMHg4OSwgMHhFRiwgMHhCOSwgMHhFNywgMHhEQywgMHhERSwNCisgICAgMHg3QiwgMHg5QywgMHhCOCwgMHgxOSwgMHhDNSwgMHgyMiwgMHgyMCwgMHgzMSwgMHg3NSwgMHgzOCwgMHg0OSwgMHhFOCwNCisgICAgMHg5MSwgMHg0QiwgMHhGOSwgMHhBNywgMHhFOSwgMHhCMSwgMHhFQiwgMHg4NCwgMHgzNCwgMHgwRCwgMHg4RSwgMHhEQywNCisgICAgMHhCQiwgMHhBRiwgMHhCRiwgMHhFRSwgMHg3RSwgMHhGRSwgMHg3OCwgMHgwRSwgMHhCNywgMHhCRiwgMHhERiwgMHg3RSwNCisgICAgMHhCRiwgMHg3MCwgMHhGMSwgMHhBOCwgMHgyNCwgMHhGMiwgMHg5MCwgMHg0OCwgMHgzRiwgMHg0RiwgMHg5NiwgMHgyMiwNCisgICAgMHg0RSwgMHhCNSwgMHg2NiwgMHgyNSwgMHhFOSwgMHg0QSwgMHg0OCwgMHg0NiwgMHgzOCwgMHgzMCwgMHgxMiwgMHhDMSwNCisgICAgMHhCMywgMHhFOCwgMHgwMiwgMHhFMCwgMHg1NCwgMHhBRiwgMHhGMSwgMHgzOSwgMHhFMSwgMHg4QSwgMHhDOCwgMHg3QywNCisgICAgMHg4NCwgMHhBQSwgMHhGMCwgMHhFOSwgMHgxMywgMHg4RCwgMHg5RiwgMHhEMSwgMHhBNSwgMHhCNCwgMHgyNiwgMHgzQywNCisgICAgMHgyMiwgMHg4MywgMHhBOCwgMHg4NywgMHg4RSwgMHhENywgMHg5MiwgMHhDNSwgMHgxNiwgMHg2RSwgMHg1RiwgMHg3RiwNCisgICAgMHhBRSwgMHgzOCwgMHhCNSwgMHg4MCwgMHg3MSwgMHg5RiwgMHgzOSwgMHg1NiwgMHgyQiwgMHg5NSwgMHg2NiwgMHgzRCwNCisgICAgMHhEOCwgMHhBNywgMHhFQiwgMHg4QywgMHgyNiwgMHg0QiwgMHgyQSwgMHg3QiwgMHg5OSwgMHg3NywgMHg0MSwgMHgyNiwNCisgICAgMHg2QywgMHhGOCwgMHg4NSwgMHhGOCwgMHg2MiwgMHgxNywgMHg0QywgMHg2OCwgMHg2MCwgMHgyNiwgMHg1MCwgMHhDQiwNCisgICAgMHhBMiwgMHg5QSwgMHhCNywgMHg4OSwgMHgxQywgMHhCMiwgMHg1QywgMHhDQSwgMHgyMywgMHhGNywgMHg5NSwgMHhEQiwNCisgICAgMHg3MiwgMHhDRSwgMHhFNiwgMHg5QSwgMHhDRCwgMHgzMCwgMHg5QiwgMHg1RCwgMHg0MywgMHhDRCwgMHhCMiwgMHg3OSwNCisgICAgMHg2NSwgMHhCMywgMHhDQSwgMHhFNiwgMHg5MywgMHhDRCwgMHgyMSwgMHg5QiwgMHgzQiwgMHgzNiwgMHg2MywgMHgxRSwNCisgICAgMHhGNiwgMHgyNCwgMHgyNCwgMHhCOSwgMHg3RSwgMHg4NCwgMHg2MCwgMHg4NSwgMHg3RCwgMHgwNSwgMHg4RiwgMHgxQywNCisgICAgMHg3NCwgMHg1RSwgMHhBRSwgMHhBQiwgMHgyNCwgMHhGNiwgMHg0NCwgMHgwRiwgMHg1QSwgMHgyOCwgMHg5QSwgMHg5QSwNCisgICAgMHhEOCwgMHgyNSwgMHgwRCwgMHg3OSwgMHgxRiwgMHg1RCwgMHg0NCwgMHg0QSwgMHhGNiwgMHhDMCwgMHgzMywgMHhDOSwNCisgICAgMHg0QywgMHhDOCwgMHgyNywgMHg5OSwgMHg5MiwgMHg2RCwgMHgxMCwgMHgzNSwgMHg3RCwgMHhCNSwgMHg3QSwgMHg2QywNCisgICAgMHhFRCwgMHg5QSwgMHg2RSwgMHhENiwgMHhFQywgMHhENCwgMHg2QywgMHhEMywgMHg2QywgMHhEMSwgMHg2QywgMHhDRSwNCisgICAgMHhFQywgMHhDQiwgMHg2QywgMHhDQSwgMHhERSwgMHg0RiwgMHg0MiwgMHg2MSwgMHgwMiwgMHg0NiwgMHg5MywgMHhGQSwNCisgICAgMHhERCwgMHhEMywgMHgyMSwgMHgxRSwgMHg3QiwgMHhFMCwgMHg2RSwgMHgxRCwgMHhCNCwgMHg3OCwgMHg3OCwgMHg2RSwNCisgICAgMHgyNCwgMHg1MCwgMHhCNywgMHgwMiwgMHgyMCwgMHg1NCwgMHgxMiwgMHg1RCwgMHgwRCwgMHg1NiwgMHhGOCwgMHhGOCwNCisgICAgMHg2NCwgMHg4NCwgMHhDQSwgMHg3QiwgMHg5NSwgMHhDMCwgMHhFMywgMHg0OSwgMHgxMywgMHhBMiwgMHg4NiwgMHg1OCwNCisgICAgMHgwNiwgMHhDNiwgMHgxOSwgMHg1MSwgMHgzNSwgMHg5RSwgMHhEMSwgMHgzOSwgMHhDOSwgMHgzMiwgMHgyQSwgMHhGOSwNCisgICAgMHg2NiwgMHg0RiwgMHg5QiwgMHg0OCwgMHgxRiwgMHgyMCwgMHhENywgMHgyQSwgMHg4RSwgMHg1RCwgMHg3QywgMHgwQSwNCisgICAgMHhENywgMHhBRSwgMHgzMywgMHg3MSwgMHgzQywgMHhCOCwgMHg5QywgMHg4RiwgMHg3MCwgMHg5NSwgMHgwMywgMHgzNiwNCisgICAgMHg1NCwgMHhBMywgMHg4RSwgMHg1NiwgMHhDNiwgMHg4MiwgMHhBRiwgMHg1QywgMHhGQywgMHgzOCwgMHg0RCwgMHg0MiwNCisgICAgMHg0MywgMHgyRCwgMHgxOSwgMHhBQSwgMHg0OCwgMHgyMywgMHgyMSwgMHgzMywgMHhEMCwgMHg0QywgMHg5MCwgMHhFNywNCisgICAgMHgyMSwgMHhBQiwgMHgwNiwgMHg3NSwgMHg0NiwgMHgwNCwgMHgyMCwgMHg2MywgMHg0OSwgMHg2QiwgMHhFNCwgMHg1NiwNCisgICAgMHhENCwgMHgxOSwgMHg3OSwgMHgzNiwgMHgzQiwgMHhGNCwgMHhCQywgMHg0MywgMHhERiwgMHg3NywgMHhBRSwgMHg0NiwNCisgICAgMHhBOCwgMHhDNSwgMHgzMSwgMHgwQSwgMHg3NCwgMHg2NiwgMHg3RCwgMHg5NCwgMHg2NCwgMHgzMywgMHg2QSwgMHhBRCwNCisgICAgMHgxOCwgMHhDMCwgMHhENywgMHg4MywgMHg2RSwgMHgxNCwgMHgzRCwgMHgzQSwgMHhFQSwgMHhDQywgMHhBNCwgMHg4RCwNCisgICAgMHg1QSwgMHgwMCwgMHg1NiwgMHhFRiwgMHhGNCwgMHgzNCwgMHhGNywgMHhDMiwgMHg5QiwgMHg1OSwgMHg5MiwgMHhGQSwNCisgICAgMHhBNywgMHg5MywgMHhCMywgMHhEQiwgMHg0QiwgMHgxMiwgMHhCRCwgMHgyOSwgMHhBRSwgMHgyQSwgMHg2MywgMHhEQSwNCisgICAgMHgyNCwgMHhEMCwgMHg3MSwgMHg1NSwgMHgxRSwgMHg4OSwgMHhGNywgMHhFRSwgMHg3NCwgMHg2MiwgMHhERCwgMHgwOSwNCisgICAgMHg2MCwgMHhGMCwgMHgzOCwgMHgwNiwgMHgyRSwgMHgyRSwgMHg3NiwgMHg4QiwgMHhFMiwgMHg2MCwgMHhCRiwgMHgyOCwNCisgICAgMHg4QSwgMHgxMSwgMHhFQSwgMHhGMCwgMHg3QSwgMHg4NSwgMHhCNCwgMHgzMCwgMHg1MCwgMHg1MiwgMHg1MiwgMHgxRSwNCisgICAgMHhFNCwgMHgyRSwgMHg3RSwgMHg1NiwgMHg0OSwgMHgwRiwgMHgwRSwgMHgwNiwgMHgyQSwgMHhENywgMHg1NCwgMHgwNiwNCisgICAgMHg5NCwgMHg2NywgMHhGQSwgMHgyNywgMHg3NywgMHgyQywgMHgyQSwgMHg2NCwgMHg3NCwgMHhERSwgMHgxNCwgMHhBQSwNCisgICAgMHg4NywgMHhFQiwgMHg4NCwgMHhCQSwgMHg2QywgMHg0OCwgMHgwMywgMHg5NiwgMHgxMCwgMHhEOCwgMHhFQywgMHhGRCwNCisgICAgMHg1QSwgMHg1RiwgMHhBNSwgMHg0RCwgMHg3NSwgMHhGMywgMHg2NywgMHgyQSwgMHhENCwgMHg5QSwgMHg5NSwgMHgzQiwNCisgICAgMHhCRCwgMHgzQiwgMHg4OCwgMHhERiwgMHg3NCwgMHhCRCwgMHgzMywgMHg4OCwgMHg5RSwgMHgzMCwgMHhBRSwgMHg1MiwNCisgICAgMHgxNywgMHhFRiwgMHgwRCwgMHgyMiwgMHgxNywgMHg1NCwgMHgwQSwgMHgxNywgMHhCRiwgMHhFQywgMHg3MywgMHg1MSwNCisgICAgMHg3NywgMHg2QywgMHg0MCwgMHg2QSwgMHhEQiwgMHgxQiwgMHgyNywgMHhCQSwgMHg0MCwgMHhGRCwgMHg3QywgMHg2RCwNCisgICAgMHgwMiwgMHgxNywgMHhGRiwgMHhGOSwgMHgwRSwgMHhFNywgMHg0NCwgMHg4NywgMHhEMCwgMHhBRiwgMHhBMSwgMHgyNSwNCisgICAgMHgyQywgMHgxNSwgMHhFNSwgMHhDMiwgMHhDNSwgMHhEMywgMHhFMywgMHhGOSwgMHg2MCwgMHg1MSwgMHhEQiwgMHhGMywNCisgICAgMHhCRSwgMHgwNCwgMHg5OSwgMHhDRCwgMHg5NiwgMHhFRiwgMHg0MiwgMHhCRSwgMHhBNiwgMHhENywgMHgyNCwgMHgyOCwNCisgICAgMHgwRiwgMHhCQiwgMHg3QSwgMHhBOSwgMHg2QiwgMHg3OSwgMHgzOSwgMHg3QywgMHhEQSwgMHg4NCwgMHhDRSwgMHgxQywNCisgICAgMHhBQywgMHg0MCwgMHg2RCwgMHg2NiwgMHg5RCwgMHg2NiwgMHg5QywgMHgwOSwgMHhGRSwgMHg2MCwgMHhGQSwgMHg0NCwNCisgICAgMHgyOCwgMHhDOSwgMHhBOCwgMHg3NCwgMHhGQywgMHgyQywgMHhCNCwgMHhFNiwgMHhDNywgMHgyMSwgMHg3QywgMHg1MCwNCisgICAgMHgzOCwgMHg3MywgMHhGNiwgMHgxRiwgMHhDMiwgMHgwQywgMHgzRSwgMHg5NiwgMHhFOCwgMHhFRCwgMHgxNiwgMHhDMiwNCisgICAgMHg1OCwgMHg5MiwgMHgyNSwgMHhCQywgMHgyRSwgMHgwRiwgMHgxMywgMHgxNiwgMHgxMSwgMHg2MSwgMHhENiwgMHhGNCwNCisgICAgMHgxQiwgMHg1MSwgMHhBOCwgMHgxQiwgMHhFMiwgMHg0QywgMHg0NSwgMHgxNiwgMHhCMSwgMHhBMCwgMHg5QywgMHg2MywNCisgICAgMHhFRiwgMHhDMywgMHg2QiwgMHhDNywgMHhEQiwgMHg0NiwgMHg4NSwgMHg5MSwgMHg4MywgMHg0OCwgMHhENCwgMHhENCwNCisgICAgMHhGNywgMHg1QiwgMHg3RSwgMHgxNCwgMHg5OCwgMHhBQiwgMHg3MiwgMHgzMiwgMHhFNywgMHhFRCwgMHgxNiwgMHg5MiwNCisgICAgMHgyRiwgMHgwNiwgMHg5MCwgMHhCQywgMHg1QywgMHhGMSwgMHhENSwgMHg2NywgMHhCMSwgMHhFMSwgMHhFOSwgMHhFNiwNCisgICAgMHhEMCwgMHhGRCwgMHg5RSwgMHg5NSwgMHg1MSwgMHhGNSwgMHgxOSwgMHgwQiwgMHhDQiwgMHg3RiwgMHg4RSwgMHg2OSwNCisgICAgMHhBQywgMHhEMH07DQogY29uc3QgdWludDhfdCBnX3poQ05fTG9jYWxlW10gPSB7DQotICAgIDB4NzgsIDB4OUMsIDB4RUQsIDB4NTYsIDB4NDEsIDB4NEYsIDB4RDQsIDB4NDAsIDB4MTQsIDB4QkUsIDB4OUIsIDB4RjgsIDB4MUYsIDB4OUEsIDB4NDYsIDB4NTIsIDB4NEQsIDB4NTgsIDB4NDYsIDB4OEYsDQotICAgIDB4OTAsIDB4RDIsIDB4NjQsIDB4MDMsIDB4MDgsIDB4MDYsIDB4QkIsIDB4MjEsIDB4OTYsIDB4NjgsIDB4RTAsIDB4NjIsIDB4QkEsIDB4RUQsIDB4QjAsIDB4MkQsIDB4NkMsIDB4M0IsIDB4NjQsIDB4QjYsDQotICAgIDB4MEQsIDB4NkUsIDB4NEYsIDB4MTgsIDB4ODIsIDB4ODIsIDB4QzIsIDB4NDUsIDB4ODksIDB4OUEsIDB4ODAsIDB4RTEsIDB4NjQsIDB4M0MsIDB4MjgsIDB4OUUsIDB4OEMsIDB4MDEsIDB4MjIsIDB4RjEsDQotICAgIDB4Q0YsIDB4QjAsIDB4Q0IsIDB4OTEsIDB4QkYsIDB4RTAsIDB4OUIsIDB4RUQsIDB4QjQsIDB4QjQsIDB4REQsIDB4RDksIDB4QjUsIDB4M0YsIDB4QzAsIDB4M0QsIDB4Q0QsIDB4RkIsIDB4REUsIDB4RjcsDQotICAgIDB4N0QsIDB4RjMsIDB4REUsIDB4RUIsIDB4NzQsIDB4QjYsIDB4NkEsIDB4OTMsIDB4NTgsIDB4NjYsIDB4MTMsIDB4NEIsIDB4QkUsIDB4RTksIDB4RTEsIDB4NDksIDB4MzksIDB4NzIsIDB4OUUsIDB4NEYsDQotICAgIDB4RDUsIDB4NjQsIDB4QzksIDB4QzYsIDB4MkQsIDB4NkIsIDB4NTIsIDB4QkUsIDB4M0MsIDB4M0QsIDB4RTksIDB4N0UsIDB4NzgsIDB4N0QsIDB4RjcsIDB4RUEsIDB4QzcsIDB4RTYsIDB4RTUsIDB4QzUsDQotICAgIDB4RkIsIDB4RUIsIDB4REYsIDB4N0IsIDB4MTAsIDB4NzcsIDB4MEUsIDB4MkYsIDB4RUUsIDB4QzksIDB4OUEsIDB4Q0EsIDB4MTQsIDB4QkUsIDB4NkQsIDB4NTIsIDB4QTMsIDB4RUQsIDB4RDUsIDB4NDksDQotICAgIDB4QjMsIDB4QzUsIDB4QzUsIDB4MEQsIDB4OEEsIDB4MUIsIDB4ODQsIDB4QkEsIDB4QTYsIDB4MEYsIDB4MEMsIDB4OEYsIDB4RjgsIDB4ODEsIDB4NTMsIDB4MDMsIDB4QjgsIDB4QzUsIDB4RDcsIDB4REEsDQotICAgIDB4RTUsIDB4RTksIDB4NjYsIDB4RjcsIDB4NjgsIDB4NDcsIDB4NDUsIDB4NzEsIDB4NzQsIDB4RkIsIDB4NTYsIDB4MDIsIDB4OUYsIDB4RUYsIDB4MDksIDB4RTEsIDB4RDMsIDB4NUQsIDB4MTEsIDB4REMsDQotICAgIDB4MzksIDB4M0MsIDB4MTQsIDB4OUIsIDB4MUMsIDB4MDgsIDB4RDksIDB4REIsIDB4MjcsIDB4NjIsIDB4RUYsIDB4MkQsIDB4MzEsIDB4RkIsIDB4OUIsIDB4OTAsIDB4N0QsIDB4RjYsIDB4NTksIDB4QzgsDQotICAgIDB4REUsIDB4N0YsIDB4MzksIDB4MDAsIDB4MUUsIDB4RDAsIDB4MjgsIDB4Q0IsIDB4MTQsIDB4N0IsIDB4NDUsIDB4OTksIDB4MzEsIDB4MjUsIDB4QzQsIDB4NUUsIDB4MjQsIDB4OTksIDB4RjUsIDB4M0EsDQotICAgIDB4OUQsIDB4OTQsIDB4MUYsIDB4QzgsIDB4RkYsIDB4QTcsIDB4NTcsIDB4N0EsIDB4N0EsIDB4QjYsIDB4RDksIDB4RTYsIDB4MDcsIDB4MEUsIDB4NTYsIDB4NUEsIDB4RjcsIDB4RDMsIDB4NzEsIDB4RjcsDQotICAgIDB4RTgsIDB4QjgsIDB4RkIsIDB4RjEsIDB4OEIsIDB4OEEsIDB4NTgsIDB4MTgsIDB4RTcsIDB4MzksIDB4MEEsIDB4N0IsIDB4ODgsIDB4RDAsIDB4RjMsIDB4M0QsIDB4MjEsIDB4NzcsIDB4NTcsIDB4ODAsDQotICAgIDB4QzIsIDB4MjQsIDB4ODUsIDB4MEUsIDB4MDcsIDB4MjIsIDB4RUUsIDB4RjYsIDB4NDksIDB4OEEsIDB4QTIsIDB4QjQsIDB4QzgsIDB4NEMsIDB4QzEsIDB4OTksIDB4ODcsIDB4REQsIDB4NTMsIDB4MTUsDQotICAgIDB4NkEsIDB4MkUsIDB4NTYsIDB4NUIsIDB4QUMsIDB4QjMsIDB4NTgsIDB4NjEsIDB4QjEsIDB4QjYsIDB4NjIsIDB4NTUsIDB4MDMsIDB4RUIsIDB4RjEsIDB4MzAsIDB4NzUsIDB4NkQsIDB4MTcsIDB4N0IsDQotICAgIDB4QzksIDB4NkIsIDB4Q0IsIDB4NDMsIDB4RDgsIDB4RTAsIDB4NEQsIDB4NjcsIDB4OUYsIDB4MEQsIDB4M0UsIDB4MDEsIDB4MzIsIDB4NUMsIDB4NDgsIDB4QkUsIDB4RUQsIDB4NEIsIDB4QTIsIDB4QkMsDQotICAgIDB4MTMsIDB4MjAsIDB4OTgsIDB4OUEsIDB4REMsIDB4MTUsIDB4NTYsIDB4NTAsIDB4QzEsIDB4RjcsIDB4Q0UsIDB4RjYsIDB4NTYsIDB4NjcsIDB4NzcsIDB4NUYsIDB4NDUsIDB4MkMsIDB4OEMsIDB4RjMsDQotICAgIDB4MUMsIDB4NEQsIDB4MjEsIDB4OTQsIDB4NkEsIDB4NTgsIDB4NTAsIDB4QjgsIDB4NzEsIDB4RTIsIDB4NUUsIDB4MDIsIDB4QkMsIDB4NjAsIDB4MDYsIDB4MDEsIDB4QTYsIDB4N0UsIDB4RUYsIDB4OTksDQotICAgIDB4QTcsIDB4MTEsIDB4QkYsIDB4OEUsIDB4NTYsIDB4QzIsIDB4NjYsIDB4NTMsIDB4RDYsIDB4OTYsIDB4RTAsIDB4QTcsIDB4NzQsIDB4Q0UsIDB4N0UsIDB4MkEsIDB4QkEsIDB4MDIsIDB4QTcsIDB4NDcsDQotICAgIDB4OTksIDB4NTYsIDB4NjAsIDB4QkMsIDB4Q0EsIDB4MEMsIDB4RkMsIDB4NTgsIDB4RUYsIDB4QTksIDB4QTQsIDB4RTAsIDB4QzcsIDB4MUQsIDB4OUEsIDB4QzQsIDB4NkYsIDB4MEMsIDB4NzAsIDB4MjgsDQotICAgIDB4QTEsIDB4RjYsIDB4QjAsIDB4MUQsIDB4OEIsIDB4MkIsIDB4N0EsIDB4NjUsIDB4QkEsIDB4MDQsIDB4QkYsIDB4RTUsIDB4MTAsIDB4MUEsIDB4MzAsIDB4ODUsIDB4OTAsIDB4OEYsIDB4NzIsIDB4RUQsDQotICAgIDB4MDIsIDB4MTAsIDB4QjgsIDB4NUUsIDB4QTYsIDB4RkQsIDB4NEMsIDB4OTQsIDB4NkIsIDB4QkYsIDB4RUEsIDB4MzgsIDB4NTAsIDB4RUYsIDB4MkYsIDB4NDUsIDB4RDcsIDB4OTUsIDB4Q0UsIDB4Q0UsDQotICAgIDB4MkIsIDB4QzUsIDB4MzAsIDB4OTQsIDB4QUIsIDB4QUYsIDB4RUYsIDB4MTQsIDB4NjksIDB4NTksIDB4NDUsIDB4MTksIDB4NDUsIDB4QzEsIDB4MkUsIDB4RDcsIDB4QkQsIDB4RDgsIDB4QTAsIDB4ODQsDQotICAgIDB4QkMsIDB4RDcsIDB4M0UsIDB4QTgsIDB4MjcsIDB4NzQsIDB4N0QsIDB4QzIsIDB4MzAsIDB4NEEsIDB4MDgsIDB4NzgsIDB4RkYsIDB4NTUsIDB4QTYsIDB4RTgsIDB4QTMsIDB4QTMsIDB4NUMsIDB4QkIsDQotICAgIDB4N0MsIDB4N0UsIDB4OEIsIDB4ODAsIDB4MjUsIDB4MDcsIDB4NjIsIDB4RDYsIDB4RjQsIDB4NTcsIDB4RDcsIDB4RTYsIDB4QkMsIDB4OTYsIDB4MzEsIDB4MzMsIDB4RkQsIDB4NzAsIDB4RTMsIDB4RDksDQotICAgIDB4MEIsIDB4NjcsIDB4M0UsIDB4NUEsIDB4OEUsIDB4NjcsIDB4OTYsIDB4MjUsIDB4ODEsIDB4Q0UsIDB4MEYsIDB4QkQsIDB4M0EsIDB4QTYsIDB4MzcsIDB4ODMsIDB4Q0IsIDB4QzUsIDB4QkMsIDB4MTIsDQotICAgIDB4QzAsIDB4RTAsIDB4MDAsIDB4NUIsIDB4QjIsIDB4MTYsIDB4OEQsIDB4NDYsIDB4RDEsIDB4RjgsIDB4NTgsIDB4MTQsIDB4NDUsIDB4MkEsIDB4Q0EsIDB4RjEsIDB4RkEsIDB4OEMsIDB4QjgsIDB4RDAsDQotICAgIDB4MEEsIDB4MjksIDB4QzUsIDB4QkUsIDB4RDUsIDB4OTYsIDB4QjUsIDB4M0IsIDB4QjEsIDB4NzQsIDB4N0MsIDB4QkMsIDB4QTQsIDB4NzIsIDB4MUQsIDB4NTMsIDB4MEIsIDB4RkIsIDB4MDEsIDB4REYsDQotICAgIDB4NzIsIDB4NDQsIDB4QTAsIDB4NDIsIDB4ODUsIDB4Q0EsIDB4NTMsIDB4QTMsIDB4QTQsIDB4QjksIDB4NUMsIDB4QzgsIDB4NkQsIDB4NkQsIDB4NkMsIDB4QjksIDB4OUUsIDB4MDksIDB4RTcsIDB4NjAsDQotICAgIDB4MkMsIDB4RDEsIDB4QzcsIDB4RTksIDB4QTIsIDB4M0EsIDB4RkQsIDB4MDcsIDB4MjcsIDB4RTEsIDB4QkEsIDB4Q0IsIDB4MUUsIDB4RkIsIDB4NjgsIDB4MjksIDB4N0UsIDB4NUEsIDB4RjUsIDB4NDgsDQotICAgIDB4MjksIDB4QkEsIDB4RTcsIDB4RkEsIDB4NjEsIDB4NEIsIDB4RDYsIDB4MkEsIDB4QTUsIDB4QzgsIDB4MTEsIDB4QTYsIDB4NDQsIDB4RDYsIDB4RUUsIDB4RjcsIDB4NzMsIDB4NTEsIDB4QkUsIDB4NkQsDQotICAgIDB4NDAsIDB4OTIsIDB4QjEsIDB4QTcsIDB4OTMsIDB4QzgsIDB4MDMsIDB4QzksIDB4RjksIDB4RUEsIDB4MDUsIDB4QjIsIDB4NzYsIDB4RkQsIDB4MDcsIDB4RUUsIDB4RDcsIDB4M0MsIDB4QTMsIDB4REYsDQotICAgIDB4ODQsIDB4NkIsIDB4REMsIDB4MTYsIDB4NjEsIDB4MEIsIDB4NTksIDB4OUIsIDB4QUEsIDB4MkQsIDB4OTUsIDB4MTYsIDB4NjUsIDB4ODcsIDB4REUsIDB4MkYsIDB4NDEsIDB4QzUsIDB4NkEsIDB4RDksDQotICAgIDB4Q0IsIDB4RDAsIDB4NUUsIDB4QzcsIDB4MkIsIDB4QTYsIDB4QzUsIDB4RUUsIDB4QzcsIDB4NjQsIDB4QzksIDB4QkQsIDB4QUEsIDB4MzYsIDB4QTksIDB4NjMsIDB4QzksIDB4ODAsIDB4NTcsIDB4NTEsDQotICAgIDB4MzIsIDB4MDIsIDB4NUIsIDB4N0EsIDB4MkMsIDB4QTMsIDB4MkMsIDB4OUYsIDB4OTMsIDB4RjQsIDB4MzYsIDB4N0MsIDB4NzUsIDB4RDksIDB4RDIsIDB4MDIsIDB4MEMsIDB4NEMsIDB4OTgsIDB4NzYsDQotICAgIDB4N0QsIDB4OTcsIDB4RjgsIDB4MDMsIDB4RDMsIDB4NTMsIDB4MjQsIDB4QTQsIDB4MkUsIDB4QTYsIDB4Q0MsIDB4NUYsIDB4OTgsIDB4OEYsIDB4NEIsIDB4NTgsIDB4NzAsIDB4RkYsIDB4NDEsIDB4OTgsDQotICAgIDB4QzMsIDB4NzUsIDB4OEEsIDB4MzcsIDB4ODYsIDB4MTAsIDB4QUEsIDB4RDQsIDB4QUMsIDB4QzMsIDB4NEIsIDB4MzUsIDB4OTgsIDB4QjAsIDB4RTgsIDB4OTgsIDB4QUUsIDB4MzAsIDB4M0QsIDB4NEYsDQotICAgIDB4QTIsIDB4NzAsIDB4Q0QsIDB4OTQsIDB4NjYsIDB4NDksIDB4RTAsIDB4QjgsIDB4MTYsIDB4RUIsIDB4QTMsIDB4RjIsIDB4RjQsIDB4OTEsIDB4QTQsIDB4MEYsIDB4QTMsIDB4NDIsIDB4Q0IsIDB4OTYsDQotICAgIDB4NDMsIDB4MTIsIDB4RUEsIDB4OTMsIDB4MjEsIDB4OUIsIDB4MDIsIDB4NzMsIDB4RDgsIDB4NjgsIDB4MzksIDB4QTksIDB4MUQsIDB4RkEsIDB4OEQsIDB4NTUsIDB4RDIsIDB4RTMsIDB4RjEsIDB4N0QsDQotICAgIDB4RDEsIDB4Q0QsIDB4MzMsIDB4NjMsIDB4NTEsIDB4RkMsIDB4MTUsIDB4MEQsIDB4Q0IsIDB4QkYsIDB4QzAsIDB4RTQsIDB4M0QsIDB4NDANCi19Ow0KKyAgICAweDc4LCAweDlDLCAweEVELCAweDU2LCAweDQxLCAweDRGLCAweEQ0LCAweDQwLCAweDE0LCAweEJFLCAweDlCLCAweEY4LA0KKyAgICAweDFGLCAweDlBLCAweDQ2LCAweDUyLCAweDRELCAweDU4LCAweDQ2LCAweDhGLCAweDkwLCAweEQyLCAweDY0LCAweDAzLA0KKyAgICAweDA4LCAweDA2LCAweEJCLCAweDIxLCAweDk2LCAweDY4LCAweEUwLCAweDYyLCAweEJBLCAweEVELCAweEIwLCAweDJELA0KKyAgICAweDZDLCAweDNCLCAweDY0LCAweEI2LCAweDBELCAweDZFLCAweDRGLCAweDE4LCAweDgyLCAweDgyLCAweEMyLCAweDQ1LA0KKyAgICAweDg5LCAweDlBLCAweDgwLCAweEUxLCAweDY0LCAweDNDLCAweDI4LCAweDlFLCAweDhDLCAweDAxLCAweDIyLCAweEYxLA0KKyAgICAweENGLCAweEIwLCAweENCLCAweDkxLCAweEJGLCAweEUwLCAweDlCLCAweEVELCAweEI0LCAweEI0LCAweERELCAweEQ5LA0KKyAgICAweEI1LCAweDNGLCAweEMwLCAweDNELCAweENELCAweEZCLCAweERFLCAweEY3LCAweDdELCAweEYzLCAweERFLCAweEVCLA0KKyAgICAweDc0LCAweEI2LCAweDZBLCAweDkzLCAweDU4LCAweDY2LCAweDEzLCAweDRCLCAweEJFLCAweEU5LCAweEUxLCAweDQ5LA0KKyAgICAweDM5LCAweDcyLCAweDlFLCAweDRGLCAweEQ1LCAweDY0LCAweEM5LCAweEM2LCAweDJELCAweDZCLCAweDUyLCAweEJFLA0KKyAgICAweDNDLCAweDNELCAweEU5LCAweDdFLCAweDc4LCAweDdELCAweEY3LCAweEVBLCAweEM3LCAweEU2LCAweEU1LCAweEM1LA0KKyAgICAweEZCLCAweEVCLCAweERGLCAweDdCLCAweDEwLCAweDc3LCAweDBFLCAweDJGLCAweEVFLCAweEM5LCAweDlBLCAweENBLA0KKyAgICAweDE0LCAweEJFLCAweDZELCAweDUyLCAweEEzLCAweEVELCAweEQ1LCAweDQ5LCAweEIzLCAweEM1LCAweEM1LCAweDBELA0KKyAgICAweDhBLCAweDFCLCAweDg0LCAweEJBLCAweEE2LCAweDBGLCAweDBDLCAweDhGLCAweEY4LCAweDgxLCAweDUzLCAweDAzLA0KKyAgICAweEI4LCAweEM1LCAweEQ3LCAweERBLCAweEU1LCAweEU5LCAweDY2LCAweEY3LCAweDY4LCAweDQ3LCAweDQ1LCAweDcxLA0KKyAgICAweDc0LCAweEZCLCAweDU2LCAweDAyLCAweDlGLCAweEVGLCAweDA5LCAweEUxLCAweEQzLCAweDVELCAweDExLCAweERDLA0KKyAgICAweDM5LCAweDNDLCAweDE0LCAweDlCLCAweDFDLCAweDA4LCAweEQ5LCAweERCLCAweDI3LCAweDYyLCAweEVGLCAweDJELA0KKyAgICAweDMxLCAweEZCLCAweDlCLCAweDkwLCAweDdELCAweEY2LCAweDU5LCAweEM4LCAweERFLCAweDdGLCAweDM5LCAweDAwLA0KKyAgICAweDFFLCAweEQwLCAweDI4LCAweENCLCAweDE0LCAweDdCLCAweDQ1LCAweDk5LCAweDMxLCAweDI1LCAweEM0LCAweDVFLA0KKyAgICAweDI0LCAweDk5LCAweEY1LCAweDNBLCAweDlELCAweDk0LCAweDFGLCAweEM4LCAweEZGLCAweEE3LCAweDU3LCAweDdBLA0KKyAgICAweDdBLCAweEI2LCAweEQ5LCAweEU2LCAweDA3LCAweDBFLCAweDU2LCAweDVBLCAweEY3LCAweEQzLCAweDcxLCAweEY3LA0KKyAgICAweEU4LCAweEI4LCAweEZCLCAweEYxLCAweDhCLCAweDhBLCAweDU4LCAweDE4LCAweEU3LCAweDM5LCAweDBBLCAweDdCLA0KKyAgICAweDg4LCAweEQwLCAweEYzLCAweDNELCAweDIxLCAweDc3LCAweDU3LCAweDgwLCAweEMyLCAweDI0LCAweDg1LCAweDBFLA0KKyAgICAweDA3LCAweDIyLCAweEVFLCAweEY2LCAweDQ5LCAweDhBLCAweEEyLCAweEI0LCAweEM4LCAweDRDLCAweEMxLCAweDk5LA0KKyAgICAweDg3LCAweERELCAweDUzLCAweDE1LCAweDZBLCAweDJFLCAweDU2LCAweDVCLCAweEFDLCAweEIzLCAweDU4LCAweDYxLA0KKyAgICAweEIxLCAweEI2LCAweDYyLCAweDU1LCAweDAzLCAweEVCLCAweEYxLCAweDMwLCAweDc1LCAweDZELCAweDE3LCAweDdCLA0KKyAgICAweEM5LCAweDZCLCAweENCLCAweDQzLCAweEQ4LCAweEUwLCAweDRELCAweDY3LCAweDlGLCAweDBELCAweDNFLCAweDAxLA0KKyAgICAweDMyLCAweDVDLCAweDQ4LCAweEJFLCAweEVELCAweDRCLCAweEEyLCAweEJDLCAweDEzLCAweDIwLCAweDk4LCAweDlBLA0KKyAgICAweERDLCAweDE1LCAweDU2LCAweDUwLCAweEMxLCAweEY3LCAweENFLCAweEY2LCAweDU2LCAweDY3LCAweDc3LCAweDVGLA0KKyAgICAweDQ1LCAweDJDLCAweDhDLCAweEYzLCAweDFDLCAweDRELCAweDIxLCAweDk0LCAweDZBLCAweDU4LCAweDUwLCAweEI4LA0KKyAgICAweDcxLCAweEUyLCAweDVFLCAweDAyLCAweEJDLCAweDYwLCAweDA2LCAweDAxLCAweEE2LCAweDdFLCAweEVGLCAweDk5LA0KKyAgICAweEE3LCAweDExLCAweEJGLCAweDhFLCAweDU2LCAweEMyLCAweDY2LCAweDUzLCAweEQ2LCAweDk2LCAweEUwLCAweEE3LA0KKyAgICAweDc0LCAweENFLCAweDdFLCAweDJBLCAweEJBLCAweDAyLCAweEE3LCAweDQ3LCAweDk5LCAweDU2LCAweDYwLCAweEJDLA0KKyAgICAweENBLCAweDBDLCAweEZDLCAweDU4LCAweEVGLCAweEE5LCAweEE0LCAweEUwLCAweEM3LCAweDFELCAweDlBLCAweEM0LA0KKyAgICAweDZGLCAweDBDLCAweDcwLCAweDI4LCAweEExLCAweEY2LCAweEIwLCAweDFELCAweDhCLCAweDJCLCAweDdBLCAweDY1LA0KKyAgICAweEJBLCAweDA0LCAweEJGLCAweEU1LCAweDEwLCAweDFBLCAweDMwLCAweDg1LCAweDkwLCAweDhGLCAweDcyLCAweEVELA0KKyAgICAweDAyLCAweDEwLCAweEI4LCAweDVFLCAweEE2LCAweEZELCAweDRDLCAweDk0LCAweDZCLCAweEJGLCAweEVBLCAweDM4LA0KKyAgICAweDUwLCAweEVGLCAweDJGLCAweDQ1LCAweEQ3LCAweDk1LCAweENFLCAweENFLCAweDJCLCAweEM1LCAweDMwLCAweDk0LA0KKyAgICAweEFCLCAweEFGLCAweEVGLCAweDE0LCAweDY5LCAweDU5LCAweDQ1LCAweDE5LCAweDQ1LCAweEMxLCAweDJFLCAweEQ3LA0KKyAgICAweEJELCAweEQ4LCAweEEwLCAweDg0LCAweEJDLCAweEQ3LCAweDNFLCAweEE4LCAweDI3LCAweDc0LCAweDdELCAweEMyLA0KKyAgICAweDMwLCAweDRBLCAweDA4LCAweDc4LCAweEZGLCAweDU1LCAweEE2LCAweEU4LCAweEEzLCAweEEzLCAweDVDLCAweEJCLA0KKyAgICAweDdDLCAweDdFLCAweDhCLCAweDgwLCAweDI1LCAweDA3LCAweDYyLCAweEQ2LCAweEY0LCAweDU3LCAweEQ3LCAweEU2LA0KKyAgICAweEJDLCAweDk2LCAweDMxLCAweDMzLCAweEZELCAweDcwLCAweEUzLCAweEQ5LCAweDBCLCAweDY3LCAweDNFLCAweDVBLA0KKyAgICAweDhFLCAweDY3LCAweDk2LCAweDI1LCAweDgxLCAweENFLCAweDBGLCAweEJELCAweDNBLCAweEE2LCAweDM3LCAweDgzLA0KKyAgICAweENCLCAweEM1LCAweEJDLCAweDEyLCAweEMwLCAweEUwLCAweDAwLCAweDVCLCAweEIyLCAweDE2LCAweDhELCAweDQ2LA0KKyAgICAweEQxLCAweEY4LCAweDU4LCAweDE0LCAweDQ1LCAweDJBLCAweENBLCAweEYxLCAweEZBLCAweDhDLCAweEI4LCAweEQwLA0KKyAgICAweDBBLCAweDI5LCAweEM1LCAweEJFLCAweEQ1LCAweDk2LCAweEI1LCAweDNCLCAweEIxLCAweDc0LCAweDdDLCAweEJDLA0KKyAgICAweEE0LCAweDcyLCAweDFELCAweDUzLCAweDBCLCAweEZCLCAweDAxLCAweERGLCAweDcyLCAweDQ0LCAweEEwLCAweDQyLA0KKyAgICAweDg1LCAweENBLCAweDUzLCAweEEzLCAweEE0LCAweEI5LCAweDVDLCAweEM4LCAweDZELCAweDZELCAweDZDLCAweEI5LA0KKyAgICAweDlFLCAweDA5LCAweEU3LCAweDYwLCAweDJDLCAweEQxLCAweEM3LCAweEU5LCAweEEyLCAweDNBLCAweEZELCAweDA3LA0KKyAgICAweDI3LCAweEUxLCAweEJBLCAweENCLCAweDFFLCAweEZCLCAweDY4LCAweDI5LCAweDdFLCAweDVBLCAweEY1LCAweDQ4LA0KKyAgICAweDI5LCAweEJBLCAweEU3LCAweEZBLCAweDYxLCAweDRCLCAweEQ2LCAweDJBLCAweEE1LCAweEM4LCAweDExLCAweEE2LA0KKyAgICAweDQ0LCAweEQ2LCAweEVFLCAweEY3LCAweDczLCAweDUxLCAweEJFLCAweDZELCAweDQwLCAweDkyLCAweEIxLCAweEE3LA0KKyAgICAweDkzLCAweEM4LCAweDAzLCAweEM5LCAweEY5LCAweEVBLCAweDA1LCAweEIyLCAweDc2LCAweEZELCAweDA3LCAweEVFLA0KKyAgICAweEQ3LCAweDNDLCAweEEzLCAweERGLCAweDg0LCAweDZCLCAweERDLCAweDE2LCAweDYxLCAweDBCLCAweDU5LCAweDlCLA0KKyAgICAweEFBLCAweDJELCAweDk1LCAweDE2LCAweDY1LCAweDg3LCAweERFLCAweDJGLCAweDQxLCAweEM1LCAweDZBLCAweEQ5LA0KKyAgICAweENCLCAweEQwLCAweDVFLCAweEM3LCAweDJCLCAweEE2LCAweEM1LCAweEVFLCAweEM3LCAweDY0LCAweEM5LCAweEJELA0KKyAgICAweEFBLCAweDM2LCAweEE5LCAweDYzLCAweEM5LCAweDgwLCAweDU3LCAweDUxLCAweDMyLCAweDAyLCAweDVCLCAweDdBLA0KKyAgICAweDJDLCAweEEzLCAweDJDLCAweDlGLCAweDkzLCAweEY0LCAweDM2LCAweDdDLCAweDc1LCAweEQ5LCAweEQyLCAweDAyLA0KKyAgICAweDBDLCAweDRDLCAweDk4LCAweDc2LCAweDdELCAweDk3LCAweEY4LCAweDAzLCAweEQzLCAweDUzLCAweDI0LCAweEE0LA0KKyAgICAweDJFLCAweEE2LCAweENDLCAweDVGLCAweDk4LCAweDhGLCAweDRCLCAweDU4LCAweDcwLCAweEZGLCAweDQxLCAweDk4LA0KKyAgICAweEMzLCAweDc1LCAweDhBLCAweDM3LCAweDg2LCAweDEwLCAweEFBLCAweEQ0LCAweEFDLCAweEMzLCAweDRCLCAweDM1LA0KKyAgICAweDk4LCAweEIwLCAweEU4LCAweDk4LCAweEFFLCAweDMwLCAweDNELCAweDRGLCAweEEyLCAweDcwLCAweENELCAweDk0LA0KKyAgICAweDY2LCAweDQ5LCAweEUwLCAweEI4LCAweDE2LCAweEVCLCAweEEzLCAweEYyLCAweEY0LCAweDkxLCAweEE0LCAweDBGLA0KKyAgICAweEEzLCAweDQyLCAweENCLCAweDk2LCAweDQzLCAweDEyLCAweEVBLCAweDkzLCAweDIxLCAweDlCLCAweDAyLCAweDczLA0KKyAgICAweEQ4LCAweDY4LCAweDM5LCAweEE5LCAweDFELCAweEZBLCAweDhELCAweDU1LCAweEQyLCAweEUzLCAweEYxLCAweDdELA0KKyAgICAweEQxLCAweENELCAweDMzLCAweDYzLCAweDUxLCAweEZDLCAweDE1LCAweDBELCAweENCLCAweEJGLCAweEMwLCAweEU0LA0KKyAgICAweDNELCAweDQwfTsNCiBjb25zdCB1aW50OF90IGdfemhUV19Mb2NhbGVbXSA9IHsNCi0gICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NywgMHhDRCwgMHg0RiwgMHhENCwgMHg0MCwgMHgxNCwgMHgzRiwgMHg2MywgMHhFMiwgMHhGRiwgMHgzMCwgMHg2OSwgMHgyMCwgMHhENSwgMHgwNCwgMHhBOCwgMHgxRSwNCi0gICAgMHgyMSwgMHhBNSwgMHhDOSwgMHhDNiwgMHg0NSwgMHgzMCwgMHg1OCwgMHg0MiwgMHhFQywgMHg0NiwgMHgyMiwgMHgxNywgMHgzMywgMHhEQiwgMHgwRSwgMHhEQiwgMHhDMiwgMHhCNiwgMHg0MywgMHg2NiwNCi0gICAgMHhEQiwgMHhDMCwgMHhGNiwgMHgyNCwgMHgxMiwgMHgxNCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhDNCwgMHg4RiwgMHg4MCwgMHhFMSwgMHg2NCwgMHgzQywgMHgyOCwgMHg4OSwgMHgwNywgMHgwRiwgMHgyQywNCi0gICAgMHg1MSwgMHhGRiwgMHgxQSwgMHg3NiwgMHgzOSwgMHhGQSwgMHgyRiwgMHgzOCwgMHhEMywgMHgyRiwgMHhGQSwgMHhCMSwgMHhCMywgMHhENCwgMHhDNCwgMHhBMywgMHg3QiwgMHg5QSwgMHhGNywgMHhERSwNCi0gICAgMHhFRiwgMHhGNywgMHhFNiwgMHhCRCwgMHhERiwgMHhCQywgMHg3RCwgMHhEOSwgMHg5NSwgMHg5QiwgMHg1OCwgMHg4NywgMHg0RCwgMHgwNCwgMHgxQywgMHg2OCwgMHhBMywgMHgyOSwgMHhDMSwgMHgzNywNCi0gICAgMHgxRiwgMHhENywgMHgxNiwgMHgwNSwgMHg2MCwgMHhBMCwgMHg5NiwgMHgzRSwgMHgyNSwgMHg5QywgMHg5RiwgMHg5RSwgMHhGNCwgMHhERSwgMHgzRSwgMHhCRiwgMHg3MSwgMHhEMSwgMHhEOSwgMHgzQywNCi0gICAgMHhGRiwgMHhGOSwgMHhFNiwgMHhGNywgMHg4RiwgMHhCRCwgMHhFRSwgMHhBQiwgMHg2RiwgMHhCRCwgMHhDRSwgMHhBRiwgMHg5QiwgMHg4MiwgMHg3MiwgMHhGRCwgMHgxQSwgMHgwMCwgMHgzMiwgMHg2MywNCi0gICAgMHgzOSwgMHgwNiwgMHgyNCwgMHg1QSwgMHhEQiwgMHhBRSwgMHhFMywgMHg2NiwgMHgyQiwgMHg0QSwgMHhEMCwgMHgyMCwgMHhBOCwgMHg4MSwgMHg4OSwgMHgwNSwgMHgxRCwgMHg4NiwgMHgxQSwgMHgwMiwNCi0gICAgMHhCMiwgMHg4RCwgMHgxRCwgMHhENywgMHg5QywgMHhBNywgMHhBMSwgMHgxNiwgMHhCMywgMHg4NywgMHg0MiwgMHg1QiwgMHgzOSwgMHgzRiwgMHg3RCwgMHhEMiwgMHgzQiwgMHhEQSwgMHg5MSwgMHhBNSwNCi0gICAgMHhEMCwgMHg0QSwgMHgwNywgMHhDRSwgMHhGNiwgMHgzOCwgMHg4MSwgMHhEMywgMHhERCwgMHhGRSwgMHg4MSwgMHhFRSwgMHhFMSwgMHgyMSwgMHgyRiwgMHhENSwgMHgwMSwgMHg4NywgMHhCMSwgMHg3RCwNCi0gICAgMHhDMiwgMHhCQiwgMHg2MywgMHg4QiwgMHhDNywgMHhGOCwgMHhDMiwgMHg2MSwgMHg3NCwgMHgzRSwgMHg3MiwgMHgxOCwgMHhGQiwgMHg5QiwgMHhEQywgMHgwMCwgMHhCNywgMHg3OSwgMHgxNiwgMHhDQiwNCi0gICAgMHhGNywgMHgwRiwgMHhBMiwgMHg3MywgMHgyMiwgMHg2MSwgMHg1QSwgMHg1MiwgMHgwMCwgMHhFQiwgMHg3NSwgMHgzMiwgMHgyNSwgMHhEQywgMHgxNiwgMHhGRSwgMHg2QiwgMHhGQiwgMHg4RiwgMHhCNCwNCi0gICAgMHgzNSwgMHg2MCwgMHgzQiwgMHgzNSwgMHhBQywgMHhENCwgMHg1MiwgMHg3QSwgMHhFRiwgMHg4RiwgMHg3QiwgMHg0NywgMHhDNywgMHhCRCwgMHg3NywgMHg5RiwgMHg2NCwgMHg4OSwgMHg5OSwgMHgzOSwNCi0gICAgMHgzRiwgMHhCRCwgMHhBRiwgMHhCRiwgMHhGRiwgMHg2QywgMHg4RiwgMHg4MywgMHhERiwgMHhFRCwgMHhFQiwgMHhBNywgMHg0QSwgMHg3MywgMHhGMiwgMHgxQywgMHhGNCwgMHhDNywgMHg2RiwgMHg5RiwNCi0gICAgMHgyNCwgMHg3RSwgMHgxMCwgMHg5QywgMHhGQSwgMHgzNCwgMHg5MSwgMHgxQiwgMHg4RiwgMHg4MCwgMHg1RCwgMHhFOCwgMHhBMywgMHhEOCwgMHg0MSwgMHhCMSwgMHhGNiwgMHg2MiwgMHhENSwgMHhDNSwNCi0gICAgMHg3QSwgMHg4QiwgMHg5NSwgMHgwRSwgMHhBQywgMHhEMSwgMHg0NiwgMHhDNCwgMHgzMiwgMHgyQywgMHg2NCwgMHhBNywgMHg1NywgMHg0MywgMHhFNCwgMHhBMiwgMHhENywgMHhCRCwgMHhFOCwgMHhFRSwNCi0gICAgMHhCMywgMHg4NywgMHg4QSwgMHgxRCwgMHhGOSwgMHhGMCwgMHhDQiwgMHg0MiwgMHgxOCwgMHg1QywgMHg5QSwgMHhBOSwgMHg0QiwgMHgxMCwgMHg4MSwgMHhBOSwgMHhGQywgMHhENCwgMHhBMiwgMHgzNSwNCi0gICAgMHg3RCwgMHhFRCwgMHg2RSwgMHg2RiwgMHg3NSwgMHg3NywgMHhGNywgMHg2NSwgMHg4OSwgMHg5OSwgMHgzOSwgMHg3RiwgMHhFMiwgMHgwNCwgMHhDMSwgMHgyOSwgMHhFNiwgMHhEMiwgMHg2NSwgMHgyNywNCi0gICAgMHhFNSwgMHhCNiwgMHg1RCwgMHhFOCwgMHgzNSwgMHhBMCwgMHg4QiwgMHgxNiwgMHhBMCwgMHhFQiwgMHgyMiwgMHhFMiwgMHgyNCwgMHhEMiwgMHgyNywgMHg5RSwgMHg2OCwgMHgyMSwgMHgyRSwgMHg3QiwNCi0gICAgMHhDRCwgMHhBNiwgMHhBMCwgMHgzQywgMHhBMiwgMHgxRiwgMHhCMSwgMHhEQiwgMHhGOSwgMHgyRSwgMHhBQSwgMHgyMiwgMHg5RCwgMHg0MSwgMHhCMSwgMHgyQSwgMHhEMiwgMHg4NywgMHgxMCwgMHhBNywNCi0gICAgMHhFOSwgMHg4NywgMHhFOSwgMHg5MiwgMHg1MCwgMHg3OCwgMHgzOSwgMHg5QSwgMHhEOCwgMHg2OSwgMHg3MCwgMHg3MiwgMHg5NCwgMHhFMiwgMHhEQiwgMHhDOCwgMHgwOCwgMHhFOSwgMHg5MiwgMHgyQSwNCi0gICAgMHg1NSwgMHg0QiwgMHgzMSwgMHg1QSwgMHgyNiwgMHgyNiwgMHgyRSwgMHg5RiwgMHgwMywgMHg0MCwgMHhDNiwgMHgxMywgMHhDOSwgMHhFMSwgMHg1QSwgMHg3NiwgMHg0RSwgMHg4RSwgMHg5NCwgMHgyNywNCi0gICAgMHgyMywgMHg0NywgMHhDNSwgMHgzNCwgMHhDNSwgMHhERSwgMHg4NywgMHhBNywgMHhBMiwgMHhBQSwgMHg4QSwgMHhERCwgMHg5RCwgMHg2NywgMHhBMiwgMHhBNiwgMHg4OSwgMHgxNywgMHg5RiwgMHg1RiwNCi0gICAgMHg4QiwgMHg2MCwgMHg0OSwgMHg5NiwgMHg1MiwgMHgwQywgMHg1RSwgMHg4QSwgMHg1MCwgMHg4RCwgMHhGRSwgMHgyOSwgMHg0QSwgMHgyNSwgMHgwOCwgMHhFNCwgMHhBOCwgMHgwMCwgMHg3MywgMHg1MiwNCi0gICAgMHg1NSwgMHgyNywgMHgzNSwgMHhBRCwgMHgxNCwgMHgyNSwgMHhEMiwgMHgyMywgMHgyNCwgMHhFNSwgMHgxOSwgMHg0QywgMHg4RCwgMHg1QywgMHhFRiwgMHhEMSwgMHg3MCwgMHhENCwgMHhBOCwgMHgzNywNCi0gICAgMHg5RSwgMHg5OCwgMHgxOSwgMHhFOCwgMHhBQywgMHhBQywgMHhDRSwgMHhEQSwgMHgyRCwgMHg2RCwgMHhCQSwgMHg3QSwgMHg3NywgMHg3RCwgMHg3MSwgMHhDMywgMHg5QywgMHhGMywgMHg5NywgMHg0MiwNCi0gICAgMHgxMSwgMHhEMywgMHhBMCwgMHg4MCwgMHhFOSwgMHg3OCwgMHg3NiwgMHgxRCwgMHg5MSwgMHhBQywgMHg5MiwgMHgxOSwgMHg1RiwgMHg1NCwgMHgxNCwgMHhGNSwgMHhEMSwgMHg5OSwgMHhENywgMHgwNSwNCi0gICAgMHhDNSwgMHgxRiwgMHhGNSwgMHhGRCwgMHg4OSwgMHg3MSwgMHhERiwgMHhGNywgMHg2NSwgMHgyOSwgMHg4MywgMHhFMywgMHg1MywgMHg3NSwgMHg4RiwgMHgxMCwgMHhFNCwgMHhFOCwgMHg2RCwgMHg0MSwNCi0gICAgMHgxOSwgMHgwRSwgMHhDOSwgMHgxMywgMHgxMywgMHhBNSwgMHhCOSwgMHg2QiwgMHg4OCwgMHhFOCwgMHhDOCwgMHg3MSwgMHhBMywgMHg2QiwgMHg0NywgMHg4QSwgMHgzQywgMHhBNiwgMHg0NywgMHhBMSwNCi0gICAgMHg4NywgMHhBNCwgMHhBRiwgMHhDQiwgMHg1NiwgMHg4NywgMHhCMiwgMHhBRSwgMHgyOCwgMHhCRCwgMHg4MSwgMHg3NCwgMHhDQiwgMHg4NiwgMHg3NCwgMHg0OCwgMHhDNiwgMHhFMywgMHgyQywgMHg2MSwNCi0gICAgMHg5OCwgMHg0QiwgMHg2OCwgMHgxMCwgMHhFQywgMHhBRCwgMHg1OSwgMHg2QywgMHgyNiwgMHg0NiwgMHg0QiwgMHgzMiwgMHg5MiwgMHgwRSwgMHg0NiwgMHg0QSwgMHgxMiwgMHg2QywgMHhDQiwgMHhGMSwNCi0gICAgMHg1QSwgMHg4MiwgMHgzMiwgMHg1NiwgMHgxMiwgMHhFRSwgMHgyMywgMHg4MiwgMHgwNSwgMHhFNSwgMHg1NiwgMHgwMSwgMHg3RCwgMHgyOSwgMHg0QywgMHhFNiwgMHhCRCwgMHhFMywgMHhDNywgMHhDOCwNCi0gICAgMHgyOCwgMHg5MywgMHg3NSwgMHhDNiwgMHg2MywgMHgxOCwgMHgxOCwgMHg4MiwgMHgzMiwgMHg1RiwgMHgxQiwgMHhBNiwgMHgyQiwgMHgyOSwgMHg4MywgMHgxOCwgMHhDMCwgMHhCMiwgMHg1QSwgMHg5OCwNCi0gICAgMHgxRCwgMHgwNCwgMHhBNSwgMHhCNiwgMHg1OCwgMHhGRCwgMHgwQiwgMHg1QSwgMHhGQSwgMHgyMSwgMHgwQSwgMHhBNCwgMHg2MCwgMHgyNywgMHgxNiwgMHhFQSwgMHg2NiwgMHg0QiwgMHhBMCwgMHhCRCwNCi0gICAgMHg4NiwgMHg5NiwgMHhBMSwgMHgxRSwgMHhBRiwgMHhFMCwgMHhEOCwgMHg4QywgMHg3MiwgMHg1NiwgMHgwQywgMHg1QywgMHg0NywgMHg0MCwgMHhBNSwgMHhBRiwgMHgwNSwgMHgzNCwgMHhENywgMHgwMCwNCi0gICAgMHhGNywgMHgwNSwgMHhBOSwgMHgyRiwgMHg0QywgMHg2RCwgMHhEMywgMHg5RiwgMHg5MCwgMHgwNiwgMHg1OCwgMHhBMCwgMHgzMiwgMHg3MiwgMHgwMCwgMHg5NiwgMHg2MywgMHg2MSwgMHg2NywgMHgwMCwNCi0gICAgMHhFMCwgMHgwRSwgMHhGNiwgMHg4OCwgMHg4NSwgMHgwOCwgMHhCQiwgMHg4NSwgMHg4MywgMHgwOCwgMHg0QiwgMHg1OSwgMHhCMCwgMHhBRSwgMHg4NCwgMHhDQywgMHhBMiwgMHgzQSwgMHg0MSwgMHhFQiwNCi0gICAgMHgwMywgMHgyMSwgMHgxNSwgMHgwMiwgMHhFQiwgMHhGNCwgMHg4QiwgMHgzOCwgMHgwOCwgMHg1MiwgMHgzMywgMHhBMSwgMHhDNSwgMHgwMSwgMHhDQywgMHg2MSwgMHhERiwgMHg1QiwgMHg4NSwgMHg2MCwNCi0gICAgMHgwNiwgMHhCQiwgMHhBNiwgMHhBNSwgMHhCMywgMHg5RSwgMHhDNiwgMHgxRSwgMHhERSwgMHgwMywgMHhFQSwgMHg2MCwgMHgzMCwgMHgxNSwgMHg0MCwgMHgzNywgMHg3MSwgMHgwQywgMHg3RSwgMHgzMCwNCi0gICAgMHhGMCwgMHg2QSwgMHgwRCwgMHg1RiwgMHgyMSwgMHg3NywgMHhGNCwgMHgyQSwgMHg2RCwgMHhDRiwgMHg2OSwgMHhBQywgMHhFMCwgMHgwMCwgMHgxOSwgMHhERSwgMHgxRSwgMHgyQywgMHhCNiwgMHhENCwNCi0gICAgMHg3QiwgMHhDQSwgMHg1MiwgMHhGOCwgMHg2NywgMHg0MSwgMHhGOSwgMHgwMywgMHgxMSwgMHhDMiwgMHg0QSwgMHhDOQ0KLX07DQorICAgIDB4NzgsIDB4OUMsIDB4RUQsIDB4NTcsIDB4Q0QsIDB4NEYsIDB4RDQsIDB4NDAsIDB4MTQsIDB4M0YsIDB4NjMsIDB4RTIsDQorICAgIDB4RkYsIDB4MzAsIDB4NjksIDB4MjAsIDB4RDUsIDB4MDQsIDB4QTgsIDB4MUUsIDB4MjEsIDB4QTUsIDB4QzksIDB4QzYsDQorICAgIDB4NDUsIDB4MzAsIDB4NTgsIDB4NDIsIDB4RUMsIDB4NDYsIDB4MjIsIDB4MTcsIDB4MzMsIDB4REIsIDB4MEUsIDB4REIsDQorICAgIDB4QzIsIDB4QjYsIDB4NDMsIDB4NjYsIDB4REIsIDB4QzAsIDB4RjYsIDB4MjQsIDB4MTIsIDB4MTQsIDB4MTQsIDB4NjIsDQorICAgIDB4QTIsIDB4QzQsIDB4OEYsIDB4ODAsIDB4RTEsIDB4NjQsIDB4M0MsIDB4MjgsIDB4ODksIDB4MDcsIDB4MEYsIDB4MkMsDQorICAgIDB4NTEsIDB4RkYsIDB4MUEsIDB4NzYsIDB4MzksIDB4RkEsIDB4MkYsIDB4MzgsIDB4RDMsIDB4MkYsIDB4RkEsIDB4QjEsDQorICAgIDB4QjMsIDB4RDQsIDB4QzQsIDB4QTMsIDB4N0IsIDB4OUEsIDB4RjcsIDB4REUsIDB4RUYsIDB4RjcsIDB4RTYsIDB4QkQsDQorICAgIDB4REYsIDB4QkMsIDB4N0QsIDB4RDksIDB4OTUsIDB4OUIsIDB4NTgsIDB4ODcsIDB4NEQsIDB4MDQsIDB4MUMsIDB4NjgsDQorICAgIDB4QTMsIDB4MjksIDB4QzEsIDB4MzcsIDB4MUYsIDB4RDcsIDB4MTYsIDB4MDUsIDB4NjAsIDB4QTAsIDB4OTYsIDB4M0UsDQorICAgIDB4MjUsIDB4OUMsIDB4OUYsIDB4OUUsIDB4RjQsIDB4REUsIDB4M0UsIDB4QkYsIDB4NzEsIDB4RDEsIDB4RDksIDB4M0MsDQorICAgIDB4RkYsIDB4RjksIDB4RTYsIDB4RjcsIDB4OEYsIDB4QkQsIDB4RUUsIDB4QUIsIDB4NkYsIDB4QkQsIDB4Q0UsIDB4QUYsDQorICAgIDB4OUIsIDB4ODIsIDB4NzIsIDB4RkQsIDB4MUEsIDB4MDAsIDB4MzIsIDB4NjMsIDB4MzksIDB4MDYsIDB4MjQsIDB4NUEsDQorICAgIDB4REIsIDB4QUUsIDB4RTMsIDB4NjYsIDB4MkIsIDB4NEEsIDB4RDAsIDB4MjAsIDB4QTgsIDB4ODEsIDB4ODksIDB4MDUsDQorICAgIDB4MUQsIDB4ODYsIDB4MUEsIDB4MDIsIDB4QjIsIDB4OEQsIDB4MUQsIDB4RDcsIDB4OUMsIDB4QTcsIDB4QTEsIDB4MTYsDQorICAgIDB4QjMsIDB4ODcsIDB4NDIsIDB4NUIsIDB4MzksIDB4M0YsIDB4N0QsIDB4RDIsIDB4M0IsIDB4REEsIDB4OTEsIDB4QTUsDQorICAgIDB4RDAsIDB4NEEsIDB4MDcsIDB4Q0UsIDB4RjYsIDB4MzgsIDB4ODEsIDB4RDMsIDB4REQsIDB4RkUsIDB4ODEsIDB4RUUsDQorICAgIDB4RTEsIDB4MjEsIDB4MkYsIDB4RDUsIDB4MDEsIDB4ODcsIDB4QjEsIDB4N0QsIDB4QzIsIDB4QkIsIDB4NjMsIDB4OEIsDQorICAgIDB4QzcsIDB4RjgsIDB4QzIsIDB4NjEsIDB4NzQsIDB4M0UsIDB4NzIsIDB4MTgsIDB4RkIsIDB4OUIsIDB4REMsIDB4MDAsDQorICAgIDB4QjcsIDB4NzksIDB4MTYsIDB4Q0IsIDB4RjcsIDB4MEYsIDB4QTIsIDB4NzMsIDB4MjIsIDB4NjEsIDB4NUEsIDB4NTIsDQorICAgIDB4MDAsIDB4RUIsIDB4NzUsIDB4MzIsIDB4MjUsIDB4REMsIDB4MTYsIDB4RkUsIDB4NkIsIDB4RkIsIDB4OEYsIDB4QjQsDQorICAgIDB4MzUsIDB4NjAsIDB4M0IsIDB4MzUsIDB4QUMsIDB4RDQsIDB4NTIsIDB4N0EsIDB4RUYsIDB4OEYsIDB4N0IsIDB4NDcsDQorICAgIDB4QzcsIDB4QkQsIDB4NzcsIDB4OUYsIDB4NjQsIDB4ODksIDB4OTksIDB4MzksIDB4M0YsIDB4QkQsIDB4QUYsIDB4QkYsDQorICAgIDB4RkYsIDB4NkMsIDB4OEYsIDB4ODMsIDB4REYsIDB4RUQsIDB4RUIsIDB4QTcsIDB4NEEsIDB4NzMsIDB4RjIsIDB4MUMsDQorICAgIDB4RjQsIDB4QzcsIDB4NkYsIDB4OUYsIDB4MjQsIDB4N0UsIDB4MTAsIDB4OUMsIDB4RkEsIDB4MzQsIDB4OTEsIDB4MUIsDQorICAgIDB4OEYsIDB4ODAsIDB4NUQsIDB4RTgsIDB4QTMsIDB4RDgsIDB4NDEsIDB4QjEsIDB4RjYsIDB4NjIsIDB4RDUsIDB4QzUsDQorICAgIDB4N0EsIDB4OEIsIDB4OTUsIDB4MEUsIDB4QUMsIDB4RDEsIDB4NDYsIDB4QzQsIDB4MzIsIDB4MkMsIDB4NjQsIDB4QTcsDQorICAgIDB4NTcsIDB4NDMsIDB4RTQsIDB4QTIsIDB4RDcsIDB4QkQsIDB4RTgsIDB4RUUsIDB4QjMsIDB4ODcsIDB4OEEsIDB4MUQsDQorICAgIDB4RjksIDB4RjAsIDB4Q0IsIDB4NDIsIDB4MTgsIDB4NUMsIDB4OUEsIDB4QTksIDB4NEIsIDB4MTAsIDB4ODEsIDB4QTksDQorICAgIDB4RkMsIDB4RDQsIDB4QTIsIDB4MzUsIDB4N0QsIDB4RUQsIDB4NkUsIDB4NkYsIDB4NzUsIDB4NzcsIDB4RjcsIDB4NjUsDQorICAgIDB4ODksIDB4OTksIDB4MzksIDB4N0YsIDB4RTIsIDB4MDQsIDB4QzEsIDB4MjksIDB4RTYsIDB4RDIsIDB4NjUsIDB4MjcsDQorICAgIDB4RTUsIDB4QjYsIDB4NUQsIDB4RTgsIDB4MzUsIDB4QTAsIDB4OEIsIDB4MTYsIDB4QTAsIDB4RUIsIDB4MjIsIDB4RTIsDQorICAgIDB4MjQsIDB4RDIsIDB4MjcsIDB4OUUsIDB4NjgsIDB4MjEsIDB4MkUsIDB4N0IsIDB4Q0QsIDB4QTYsIDB4QTAsIDB4M0MsDQorICAgIDB4QTIsIDB4MUYsIDB4QjEsIDB4REIsIDB4RjksIDB4MkUsIDB4QUEsIDB4MjIsIDB4OUQsIDB4NDEsIDB4QjEsIDB4MkEsDQorICAgIDB4RDIsIDB4ODcsIDB4MTAsIDB4QTcsIDB4RTksIDB4ODcsIDB4RTksIDB4OTIsIDB4NTAsIDB4NzgsIDB4MzksIDB4OUEsDQorICAgIDB4RDgsIDB4NjksIDB4NzAsIDB4NzIsIDB4OTQsIDB4RTIsIDB4REIsIDB4QzgsIDB4MDgsIDB4RTksIDB4OTIsIDB4MkEsDQorICAgIDB4NTUsIDB4NEIsIDB4MzEsIDB4NUEsIDB4MjYsIDB4MjYsIDB4MkUsIDB4OUYsIDB4MDMsIDB4NDAsIDB4QzYsIDB4MTMsDQorICAgIDB4QzksIDB4RTEsIDB4NUEsIDB4NzYsIDB4NEUsIDB4OEUsIDB4OTQsIDB4MjcsIDB4MjMsIDB4NDcsIDB4QzUsIDB4MzQsDQorICAgIDB4QzUsIDB4REUsIDB4ODcsIDB4QTcsIDB4QTIsIDB4QUEsIDB4OEEsIDB4REQsIDB4OUQsIDB4NjcsIDB4QTIsIDB4QTYsDQorICAgIDB4ODksIDB4MTcsIDB4OUYsIDB4NUYsIDB4OEIsIDB4NjAsIDB4NDksIDB4OTYsIDB4NTIsIDB4MEMsIDB4NUUsIDB4OEEsDQorICAgIDB4NTAsIDB4OEQsIDB4RkUsIDB4MjksIDB4NEEsIDB4MjUsIDB4MDgsIDB4RTQsIDB4QTgsIDB4MDAsIDB4NzMsIDB4NTIsDQorICAgIDB4NTUsIDB4MjcsIDB4MzUsIDB4QUQsIDB4MTQsIDB4MjUsIDB4RDIsIDB4MjMsIDB4MjQsIDB4RTUsIDB4MTksIDB4NEMsDQorICAgIDB4OEQsIDB4NUMsIDB4RUYsIDB4RDEsIDB4NzAsIDB4RDQsIDB4QTgsIDB4MzcsIDB4OUUsIDB4OTgsIDB4MTksIDB4RTgsDQorICAgIDB4QUMsIDB4QUMsIDB4Q0UsIDB4REEsIDB4MkQsIDB4NkQsIDB4QkEsIDB4N0EsIDB4NzcsIDB4N0QsIDB4NzEsIDB4QzMsDQorICAgIDB4OUMsIDB4RjMsIDB4OTcsIDB4NDIsIDB4MTEsIDB4RDMsIDB4QTAsIDB4ODAsIDB4RTksIDB4NzgsIDB4NzYsIDB4MUQsDQorICAgIDB4OTEsIDB4QUMsIDB4OTIsIDB4MTksIDB4NUYsIDB4NTQsIDB4MTQsIDB4RjUsIDB4RDEsIDB4OTksIDB4RDcsIDB4MDUsDQorICAgIDB4QzUsIDB4MUYsIDB4RjUsIDB4RkQsIDB4ODksIDB4NzEsIDB4REYsIDB4RjcsIDB4NjUsIDB4MjksIDB4ODMsIDB4RTMsDQorICAgIDB4NTMsIDB4NzUsIDB4OEYsIDB4MTAsIDB4RTQsIDB4RTgsIDB4NkQsIDB4NDEsIDB4MTksIDB4MEUsIDB4QzksIDB4MTMsDQorICAgIDB4MTMsIDB4QTUsIDB4QjksIDB4NkIsIDB4ODgsIDB4RTgsIDB4QzgsIDB4NzEsIDB4QTMsIDB4NkIsIDB4NDcsIDB4OEEsDQorICAgIDB4M0MsIDB4QTYsIDB4NDcsIDB4QTEsIDB4ODcsIDB4QTQsIDB4QUYsIDB4Q0IsIDB4NTYsIDB4ODcsIDB4QjIsIDB4QUUsDQorICAgIDB4MjgsIDB4QkQsIDB4ODEsIDB4NzQsIDB4Q0IsIDB4ODYsIDB4NzQsIDB4NDgsIDB4QzYsIDB4RTMsIDB4MkMsIDB4NjEsDQorICAgIDB4OTgsIDB4NEIsIDB4NjgsIDB4MTAsIDB4RUMsIDB4QUQsIDB4NTksIDB4NkMsIDB4MjYsIDB4NDYsIDB4NEIsIDB4MzIsDQorICAgIDB4OTIsIDB4MEUsIDB4NDYsIDB4NEEsIDB4MTIsIDB4NkMsIDB4Q0IsIDB4RjEsIDB4NUEsIDB4ODIsIDB4MzIsIDB4NTYsDQorICAgIDB4MTIsIDB4RUUsIDB4MjMsIDB4ODIsIDB4MDUsIDB4RTUsIDB4NTYsIDB4MDEsIDB4N0QsIDB4MjksIDB4NEMsIDB4RTYsDQorICAgIDB4QkQsIDB4RTMsIDB4QzcsIDB4QzgsIDB4MjgsIDB4OTMsIDB4NzUsIDB4QzYsIDB4NjMsIDB4MTgsIDB4MTgsIDB4ODIsDQorICAgIDB4MzIsIDB4NUYsIDB4MUIsIDB4QTYsIDB4MkIsIDB4MjksIDB4ODMsIDB4MTgsIDB4QzAsIDB4QjIsIDB4NUEsIDB4OTgsDQorICAgIDB4MUQsIDB4MDQsIDB4QTUsIDB4QjYsIDB4NTgsIDB4RkQsIDB4MEIsIDB4NUEsIDB4RkEsIDB4MjEsIDB4MEEsIDB4QTQsDQorICAgIDB4NjAsIDB4MjcsIDB4MTYsIDB4RUEsIDB4NjYsIDB4NEIsIDB4QTAsIDB4QkQsIDB4ODYsIDB4OTYsIDB4QTEsIDB4MUUsDQorICAgIDB4QUYsIDB4RTAsIDB4RDgsIDB4OEMsIDB4NzIsIDB4NTYsIDB4MEMsIDB4NUMsIDB4NDcsIDB4NDAsIDB4QTUsIDB4QUYsDQorICAgIDB4MDUsIDB4MzQsIDB4RDcsIDB4MDAsIDB4RjcsIDB4MDUsIDB4QTksIDB4MkYsIDB4NEMsIDB4NkQsIDB4RDMsIDB4OUYsDQorICAgIDB4OTAsIDB4MDYsIDB4NTgsIDB4QTAsIDB4MzIsIDB4NzIsIDB4MDAsIDB4OTYsIDB4NjMsIDB4NjEsIDB4NjcsIDB4MDAsDQorICAgIDB4RTAsIDB4MEUsIDB4RjYsIDB4ODgsIDB4ODUsIDB4MDgsIDB4QkIsIDB4ODUsIDB4ODMsIDB4MDgsIDB4NEIsIDB4NTksDQorICAgIDB4QjAsIDB4QUUsIDB4ODQsIDB4Q0MsIDB4QTIsIDB4M0EsIDB4NDEsIDB4RUIsIDB4MDMsIDB4MjEsIDB4MTUsIDB4MDIsDQorICAgIDB4RUIsIDB4RjQsIDB4OEIsIDB4MzgsIDB4MDgsIDB4NTIsIDB4MzMsIDB4QTEsIDB4QzUsIDB4MDEsIDB4Q0MsIDB4NjEsDQorICAgIDB4REYsIDB4NUIsIDB4ODUsIDB4NjAsIDB4MDYsIDB4QkIsIDB4QTYsIDB4QTUsIDB4QjMsIDB4OUUsIDB4QzYsIDB4MUUsDQorICAgIDB4REUsIDB4MDMsIDB4RUEsIDB4NjAsIDB4MzAsIDB4MTUsIDB4NDAsIDB4MzcsIDB4NzEsIDB4MEMsIDB4N0UsIDB4MzAsDQorICAgIDB4RjAsIDB4NkEsIDB4MEQsIDB4NUYsIDB4MjEsIDB4NzcsIDB4RjQsIDB4MkEsIDB4NkQsIDB4Q0YsIDB4NjksIDB4QUMsDQorICAgIDB4RTAsIDB4MDAsIDB4MTksIDB4REUsIDB4MUUsIDB4MkMsIDB4QjYsIDB4RDQsIDB4N0IsIDB4Q0EsIDB4NTIsIDB4RjgsDQorICAgIDB4NjcsIDB4NDEsIDB4RjksIDB4MDMsIDB4MTEsIDB4QzIsIDB4NEEsIDB4Qzl9Ow0KIGNvbnN0IHVpbnQ4X3QgZ196aEhLX0xvY2FsZVtdID0gew0KLSAgICAweDc4LCAweDlDLCAweEE1LCAweDU3LCAweDRELCAweDRGLCAweDEzLCAweDQxLCAweDE4LCAweDNFLCAweDYzLCAweEUyLCAweDdGLCAweDk4LCAweDZDLCAweDIwLCAweDBCLCAweDA5LCAweDUwLCAweDhBLA0KLSAgICAweDlGLCAweDI1LCAweENCLCAweDI2LCAweDQ0LCAweDkwLCAweDlBLCAweDVBLCAweDQzLCAweDJDLCAweEQxLCAweEM4LCAweEM1LCAweDZDLCAweDc3LCAweDg3LCAweEVFLCAweDQyLCAweDc3LCAweDg3LA0KLSAgICAweDRDLCAweEI3LCAweEMxLCAweDZFLCAweDNDLCAweDg4LCAweDA0LCAweEE1LCAweDVBLCAweDJFLCAweDRBLCAweDU0LCAweDAyLCAweDg2LCAweDc4LCAweDUwLCAweDBGLCAweDQ4LCAweEJDLCAweDc4LA0KLSAgICAweDY4LCAweDg5LCAweEM2LCAweDNGLCAweDQzLCAweDhCLCAweDlFLCAweEZDLCAweDBCLCAweENFLCAweEVDLCAweDE3LCAweEZCLCAweDM1LCAweDZELCAweDhELCAweDNELCAweENELCAweEZCLCAweEJDLA0KLSAgICAweENGLCAweEYzLCAweENFLCAweEZCLCAweDNFLCAweDMzLCAweDNCLCAweDAxLCAweEExLCAweDhDLCAweDY0LCAweEE5LCAweDBDLCAweDgxLCAweDIxLCAweEU5LCAweDcwLCAweDlBLCAweEIzLCAweEQ0LA0KLSAgICAweDg3LCAweEQ5LCAweDFDLCAweDA3LCAweDE0LCAweDU4LCAweDkxLCAweEE3LCAweEI5LCAweEQzLCAweEU2LCAweDcxLCAweEU3LCAweENELCAweEYzLCAweEUxLCAweEIzLCAweEQ2LCAweEM2LCAweEU5LA0KLSAgICAweDhGLCAweEQ3LCAweDdGLCAweEJFLCAweDM3LCAweDdFLCAweDdGLCAweERBLCAweEVCLCAweDM0LCAweEJGLCAweDlFLCAweEQ1LCAweDVCLCAweEVELCAweEVELCAweEEzLCAweDVGLCAweDFGLCAweDFBLA0KLSAgICAweDlELCAweERELCAweDlGLCAweEVELCAweEM2LCAweEM5LCAweDA4LCAweDI3LCAweDVFLCAweEJDLCAweDAwLCAweDgwLCAweDQwLCAweDhCLCAweDE4LCAweDhBLCAweDg0LCAweDBCLCAweDM1LCAweEJELA0KLSAgICAweDg4LCAweENBLCAweDE1LCAweEI3LCAweDVFLCAweDA5LCAweEMzLCAweDEyLCAweEMyLCAweDlBLCAweDY0LCAweDUwLCAweEQ2LCAweDAwLCAweDEwLCAweDc0LCAweDY0LCAweDk4LCAweEVBLCAweDFELA0KLSAgICAweDkyLCAweEFBLCAweEQwLCAweDc4LCAweEMwLCAweDg5LCAweEM1LCAweEQzLCAweEU2LCAweDkzLCAweENFLCAweEMxLCAweEI2LCAweDkwLCAweDcyLCAweEEyLCAweDYwLCAweEUyLCAweEE0LCAweEMxLA0KLSAgICAweDQ4LCAweDM0LCAweEVCLCAweEM5LCAweDg5LCAweEY2LCAweEZFLCAweDNFLCAweEFCLCAweEQ0LCAweDJFLCAweDQzLCAweEIxLCAweDc1LCAweENDLCAweERBLCAweDYzLCAweDkzLCAweEE1LCAweDM4LA0KLSAgICAweDYyLCAweDI4LCAweDVBLCAweEVGLCAweDE5LCAweDhBLCAweDlELCAweDBELCAweDY2LCAweDgyLCAweDM5LCAweDNDLCAweENELCAweDQ1LCAweEU3LCAweDA3LCAweEVFLCAweERBLCAweEI3LCAweDMwLA0KLSAgICAweDY4LCAweDI5LCAweDkwLCAweDhBLCAweDQ1LCAweDNDLCAweENELCAweEE1LCAweEI5LCAweDYwLCAweDk1LCAweDc0LCAweDcyLCAweEYxLCAweEM5LCAweDY0LCAweEY4LCAweDUyLCAweDMyLCAweDdDLA0KLSAgICAweDM5LCAweDE5LCAweEJFLCAweDkyLCAweDBDLCAweDVGLCAweDRELCAweDg2LCAweEFGLCAweDI1LCAweEMzLCAweEQ3LCAweDkzLCAweEUxLCAweDRDLCAweDMyLCAweDlDLCAweDlFLCAweDYwLCAweEUwLA0KLSAgICAweDhDLCAweDM5LCAweEQzLCAweDkzLCAweDNELCAweDBELCAweDU0LCAweEE0LCAweDVBLCAweEUwLCAweDQ2LCAweDkyLCAweDQ4LCAweEVDLCAweEJDLCAweDNCLCAweEVDLCAweDFDLCAweDFDLCAweDc2LA0KLSAgICAweERFLCAweDdFLCAweDE0LCAweDUyLCAweDM0LCAweDhDLCAweEUwLCAweEU0LCAweEMwLCAweDkyLCAweEYxLCAweDkzLCAweDA2LCAweDgzLCAweDVGLCAweDRGLCAweEM0LCAweEM5LCAweDU1LCAweDY1LA0KLSAgICAweEQ0LCAweEQ5LCAweDRELCAweEU2LCAweDZGLCAweDFELCAweEZCLCAweDM4LCAweEIwLCAweDU3LCAweDA5LCAweDQzLCAweDQ0LCAweEVFLCAweDgwLCAweEFELCAweDhFLCAweENELCAweDExLCAweDlGLA0KLSAgICAweDIwLCAweERFLCAweDdCLCAweEJDLCAweEVCLCAweDc4LCAweEJGLCAweEYxLCAweDRFLCAweEJCLCAweEY2LCAweEE4LCAweDQzLCAweEFDLCAweDI5LCAweDFBLCAweEQ0LCAweDgzLCAweERGLCAweEJGLA0KLSAgICAweDBCLCAweDkxLCAweEVELCAweDVFLCAweEI0LCAweDc3LCAweEU4LCAweDQxLCAweDc5LCAweDQwLCAweDM0LCAweEZELCAweDMyLCAweDk2LCAweDA2LCAweEU3LCAweDYxLCAweDYwLCAweDEzLCAweDg4LA0KLSAgICAweEE1LCAweDQwLCAweDdELCAweDEyLCAweDkxLCAweDlFLCAweEJFLCAweEI0LCAweEI3LCAweDM2LCAweERCLCAweEY1LCAweDFELCAweDIxLCAweDQ1LCAweEMzLCAweDA4LCAweEVFLCAweDgzLCAweEMwLA0KLSAgICAweDVFLCAweDc5LCAweDVBLCAweEYyLCAweEEyLCAweEE1LCAweDIyLCAweDRGLCAweDlBLCAweDgzLCAweDJBLCAweDkyLCAweDA5LCAweDE3LCAweDI0LCAweEQzLCAweDg0LCAweEQ4LCAweEYwLCAweEFELA0KLSAgICAweEY3LCAweDExLCAweEY3LCAweEQ1LCAweDVCLCAweEFFLCAweDk2LCAweENCLCAweDlDLCAweEY4LCAweDgwLCAweEZDLCAweEY4LCAweDc2LCAweEVCLCAweDFCLCAweDlGLCAweEU3LCAweEM5LCAweDFELA0KLSAgICAweEU0LCAweDY3LCAweDc5LCAweDcyLCAweDEwLCAweDNDLCAweDk4LCAweDIzLCAweDNGLCAweDZBLCAweDhDLCAweEFGLCAweDYxLCAweDE1LCAweDI5LCAweDIzLCAweEEzLCAweEM0LCAweDI4LCAweEQyLA0KLSAgICAweDk3LCAweDVFLCAweDg3LCAweENBLCAweEZGLCAweEM4LCAweDJCLCAweDJBLCAweEMyLCAweDI2LCAweDJELCAweEQwLCAweDUzLCAweDBFLCAweDQwLCAweDA4LCAweDcxLCAweDdELCAweDMyLCAweDM1LA0KLSAgICAweDNELCAweEUyLCAweDUzLCAweDAwLCAweDA5LCAweEY5LCAweDM0LCAweEEzLCAweEFBLCAweDdDLCAweDY3LCAweEVGLCAweDI5LCAweDlGLCAweENGLCAweEYzLCAweEVELCAweEVELCAweDY3LCAweDdDLA0KLSAgICAweEExLCAweEMwLCAweDlGLCAweDdELCAweDdFLCAweEM1LCAweDgzLCAweDI1LCAweDIxLCAweDE1LCAweDUwLCAweEIwLCAweDRBLCAweDM4LCAweDJFLCAweDI1LCAweDk3LCAweEU4LCAweEFCLCAweDgwLA0KLSAgICAweDZELCAweDEzLCAweEQxLCAweDRGLCAweEU1LCAweEYzLCAweDUzLCAweDg1LCAweDQyLCAweDVGLCAweDEyLCAweEQ3LCAweDlBLCAweDE5LCAweEFBLCAweDg5LCAweDBBLCAweEE4LCAweDE5LCAweDkxLA0KLSAgICAweEQxLCAweERELCAweDRCLCAweEIzLCAweDQ4LCAweDUwLCAweEVGLCAweDI2LCAweENELCAweDRCLCAweEM2LCAweENBLCAweDZBLCAweDU2LCAweEFGLCAweDE0LCAweEU2LCAweDY2LCAweDZGLCAweEFFLA0KLSAgICAweERGLCAweDdGLCAweEE0LCAweEU2LCAweEFDLCAweDI1LCAweEM3LCAweEMzLCAweDIwLCAweEM5LCAweDU2LCAweDFBLCAweDU1LCAweEJELCAweDA4LCAweDcxLCAweEQ4LCAweEM4LCAweDEwLCAweEU2LA0KLSAgICAweEY2LCAweDQ0LCAweDMwLCAweEYyLCAweDJELCAweEM4LCAweDlDLCAweDY4LCAweDhELCAweDVBLCAweDU2LCAweDY2LCAweERDLCAweEIyLCAweDJDLCAweDIxLCAweDE1LCAweEUyLCAweEIxLCAweEE1LA0KLSAgICAweDcyLCAweDE1LCAweDYzLCAweDY4LCAweEM4LCAweDM1LCAweDRFLCAweDFDLCAweDc0LCAweEM0LCAweDk5LCAweENDLCAweEUzLCAweDYxLCAweDdGLCAweDM5LCAweEQyLCAweDc3LCAweDlELCAweDM1LA0KLSAgICAweDg4LCAweDY1LCAweDY4LCAweDk4LCAweDZFLCAweDBCLCAweDQzLCAweDcxLCAweDFELCAweEY1LCAweDI2LCAweDM2LCAweDhGLCAweDNGLCAweEUzLCAweEY5LCAweEQ4LCAweDAzLCAweDYxLCAweEM4LA0KLSAgICAweDJELCAweEFGLCAweDQwLCAweDU5LCAweEQzLCAweDI1LCAweDcyLCAweDVGLCAweEM2LCAweEJELCAweDJBLCAweDRFLCAweDlBLCAweDI5LCAweDI4LCAweDYxLCAweDU0LCAweDVELCAweEQzLCAweEU4LA0KLSAgICAweEY1LCAweDE4LCAweEVELCAweDUzLCAweEUxLCAweDRGLCAweDMwLCAweEQ0LCAweEE3LCAweDQwLCAweEQ3LCAweDhDLCAweDZBLCAweDg1LCAweDEzLCAweEM3LCAweEZBLCAweEE0LCAweDVCLCAweDEwLA0KLSAgICAweDIzLCAweDRFLCAweDlDLCAweDg4LCAweEIxLCAweENGLCAweDhELCAweDA5LCAweDlELCAweEJELCAweDc3LCAweDMwLCAweDIxLCAweDY3LCAweEMyLCAweEEwLCAweDc3LCAweDIzLCAweEVELCAweDgwLA0KLSAgICAweDEzLCAweEIzLCAweEI5LCAweDQxLCAweEYyLCAweDZDLCAweDg1LCAweDE4LCAweDVELCAweDU0LCAweDVBLCAweDA1LCAweEQxLCAweDA1LCAweDk1LCAweENELCAweEZFLCAweDgzLCAweDJDLCAweDc4LA0KLSAgICAweDEwLCAweDMxLCAweDkxLCAweEZELCAweDZFLCAweEM2LCAweEZBLCAweEE2LCAweEVGLCAweDQxLCAweDZELCAweDBELCAweDJFLCAweDRCLCAweEIyLCAweEY3LCAweDRDLCAweDdCLCAweEExLCAweDVCLA0KLSAgICAweDczLCAweDQ2LCAweDQxLCAweDQ1LCAweDA4LCAweEYyLCAweEU0LCAweEI0LCAweDQwLCAweEMxLCAweDU0LCAweEMwLCAweDZELCAweDJFLCAweDk1LCAweDQ4LCAweENCLCAweEQ3LCAweEM4LCAweERGLA0KLSAgICAweDkyLCAweDBBLCAweDU4LCAweDIwLCAweDM2LCAweDMyLCAweDA4LCAweDlBLCAweEExLCAweDIxLCAweEEzLCAweDBCLCAweEUxLCAweDA2LCAweEFBLCAweDYyLCAweDBELCAweDYyLCAweEJBLCAweDBCLA0KLSAgICAweDgzLCAweEUxLCAweEI0LCAweEIyLCAweEEwLCAweEY1LCAweEE0LCAweDY0LCAweDYxLCAweDExLCAweEMzLCAweEY1LCAweEFFLCAweDk0LCAweDE5LCAweDJDLCAweDE1LCAweEM5LCAweDQ3LCAweEQ5LA0KLSAgICAweDhELCAweEIyLCAweEE4LCAweDRBLCAweDFBLCAweDgzLCAweDkwLCAweDQzLCAweDU2LCAweDc1LCAweDU1LCAweDAyLCAweEYzLCAweEM4LCAweDU0LCAweDM1LCAweDk5LCAweENFLCAweDM0LCAweDc2LA0KLSAgICAweEVGLCAweDE2LCAweEM4LCAweDc3LCAweDI3LCAweDEzLCAweDAzLCAweDY0LCAweDE1LCAweDc5LCAweEU0LCAweEJCLCAweDVELCAweEI3LCAweDJFLCAweEEwLCAweDFFLCAweDc2LCAweEJCLCAweEE3LA0KLSAgICAweDUyLCAweEFCLCAweDFBLCAweEE1LCAweDE1LCAweDY0LCAweDMzLCAweDlELCAweERELCAweEVELCAweDQ3LCAweDJFLCAweDcwLCAweDlFLCAweDQyLCAweENBLCAweEY5LCAweDI3LCAweDQyLCAweEZDLA0KLSAgICAweDBCLCAweEQ5LCAweDBFLCAweDRCLCAweEVEDQotfTsNCisgICAgMHg3OCwgMHg5QywgMHhBNSwgMHg1NywgMHg0RCwgMHg0RiwgMHgxMywgMHg0MSwgMHgxOCwgMHgzRSwgMHg2MywgMHhFMiwNCisgICAgMHg3RiwgMHg5OCwgMHg2QywgMHgyMCwgMHgwQiwgMHgwOSwgMHg1MCwgMHg4QSwgMHg5RiwgMHgyNSwgMHhDQiwgMHgyNiwNCisgICAgMHg0NCwgMHg5MCwgMHg5QSwgMHg1QSwgMHg0MywgMHgyQywgMHhEMSwgMHhDOCwgMHhDNSwgMHg2QywgMHg3NywgMHg4NywNCisgICAgMHhFRSwgMHg0MiwgMHg3NywgMHg4NywgMHg0QywgMHhCNywgMHhDMSwgMHg2RSwgMHgzQywgMHg4OCwgMHgwNCwgMHhBNSwNCisgICAgMHg1QSwgMHgyRSwgMHg0QSwgMHg1NCwgMHgwMiwgMHg4NiwgMHg3OCwgMHg1MCwgMHgwRiwgMHg0OCwgMHhCQywgMHg3OCwNCisgICAgMHg2OCwgMHg4OSwgMHhDNiwgMHgzRiwgMHg0MywgMHg4QiwgMHg5RSwgMHhGQywgMHgwQiwgMHhDRSwgMHhFQywgMHgxNywNCisgICAgMHhGQiwgMHgzNSwgMHg2RCwgMHg4RCwgMHgzRCwgMHhDRCwgMHhGQiwgMHhCQywgMHhDRiwgMHhGMywgMHhDRSwgMHhGQiwNCisgICAgMHgzRSwgMHgzMywgMHgzQiwgMHgwMSwgMHhBMSwgMHg4QywgMHg2NCwgMHhBOSwgMHgwQywgMHg4MSwgMHgyMSwgMHhFOSwNCisgICAgMHg3MCwgMHg5QSwgMHhCMywgMHhENCwgMHg4NywgMHhEOSwgMHgxQywgMHgwNywgMHgxNCwgMHg1OCwgMHg5MSwgMHhBNywNCisgICAgMHhCOSwgMHhEMywgMHhFNiwgMHg3MSwgMHhFNywgMHhDRCwgMHhGMywgMHhFMSwgMHhCMywgMHhENiwgMHhDNiwgMHhFOSwNCisgICAgMHg4RiwgMHhENywgMHg3RiwgMHhCRSwgMHgzNywgMHg3RSwgMHg3RiwgMHhEQSwgMHhFQiwgMHgzNCwgMHhCRiwgMHg5RSwNCisgICAgMHhENSwgMHg1QiwgMHhFRCwgMHhFRCwgMHhBMywgMHg1RiwgMHgxRiwgMHgxQSwgMHg5RCwgMHhERCwgMHg5RiwgMHhFRCwNCisgICAgMHhDNiwgMHhDOSwgMHgwOCwgMHgyNywgMHg1RSwgMHhCQywgMHgwMCwgMHg4MCwgMHg0MCwgMHg4QiwgMHgxOCwgMHg4QSwNCisgICAgMHg4NCwgMHgwQiwgMHgzNSwgMHhCRCwgMHg4OCwgMHhDQSwgMHgxNSwgMHhCNywgMHg1RSwgMHgwOSwgMHhDMywgMHgxMiwNCisgICAgMHhDMiwgMHg5QSwgMHg2NCwgMHg1MCwgMHhENiwgMHgwMCwgMHgxMCwgMHg3NCwgMHg2NCwgMHg5OCwgMHhFQSwgMHgxRCwNCisgICAgMHg5MiwgMHhBQSwgMHhEMCwgMHg3OCwgMHhDMCwgMHg4OSwgMHhDNSwgMHhEMywgMHhFNiwgMHg5MywgMHhDRSwgMHhDMSwNCisgICAgMHhCNiwgMHg5MCwgMHg3MiwgMHhBMiwgMHg2MCwgMHhFMiwgMHhBNCwgMHhDMSwgMHg0OCwgMHgzNCwgMHhFQiwgMHhDOSwNCisgICAgMHg4OSwgMHhGNiwgMHhGRSwgMHgzRSwgMHhBQiwgMHhENCwgMHgyRSwgMHg0MywgMHhCMSwgMHg3NSwgMHhDQywgMHhEQSwNCisgICAgMHg2MywgMHg5MywgMHhBNSwgMHgzOCwgMHg2MiwgMHgyOCwgMHg1QSwgMHhFRiwgMHgxOSwgMHg4QSwgMHg5RCwgMHgwRCwNCisgICAgMHg2NiwgMHg4MiwgMHgzOSwgMHgzQywgMHhDRCwgMHg0NSwgMHhFNywgMHgwNywgMHhFRSwgMHhEQSwgMHhCNywgMHgzMCwNCisgICAgMHg2OCwgMHgyOSwgMHg5MCwgMHg4QSwgMHg0NSwgMHgzQywgMHhDRCwgMHhBNSwgMHhCOSwgMHg2MCwgMHg5NSwgMHg3NCwNCisgICAgMHg3MiwgMHhGMSwgMHhDOSwgMHg2NCwgMHhGOCwgMHg1MiwgMHgzMiwgMHg3QywgMHgzOSwgMHgxOSwgMHhCRSwgMHg5MiwNCisgICAgMHgwQywgMHg1RiwgMHg0RCwgMHg4NiwgMHhBRiwgMHgyNSwgMHhDMywgMHhENywgMHg5MywgMHhFMSwgMHg0QywgMHgzMiwNCisgICAgMHg5QywgMHg5RSwgMHg2MCwgMHhFMCwgMHg4QywgMHgzOSwgMHhEMywgMHg5MywgMHgzRCwgMHgwRCwgMHg1NCwgMHhBNCwNCisgICAgMHg1QSwgMHhFMCwgMHg0NiwgMHg5MiwgMHg0OCwgMHhFQywgMHhCQywgMHgzQiwgMHhFQywgMHgxQywgMHgxQywgMHg3NiwNCisgICAgMHhERSwgMHg3RSwgMHgxNCwgMHg1MiwgMHgzNCwgMHg4QywgMHhFMCwgMHhFNCwgMHhDMCwgMHg5MiwgMHhGMSwgMHg5MywNCisgICAgMHgwNiwgMHg4MywgMHg1RiwgMHg0RiwgMHhDNCwgMHhDOSwgMHg1NSwgMHg2NSwgMHhENCwgMHhEOSwgMHg0RCwgMHhFNiwNCisgICAgMHg2RiwgMHgxRCwgMHhGQiwgMHgzOCwgMHhCMCwgMHg1NywgMHgwOSwgMHg0MywgMHg0NCwgMHhFRSwgMHg4MCwgMHhBRCwNCisgICAgMHg4RSwgMHhDRCwgMHgxMSwgMHg5RiwgMHgyMCwgMHhERSwgMHg3QiwgMHhCQywgMHhFQiwgMHg3OCwgMHhCRiwgMHhGMSwNCisgICAgMHg0RSwgMHhCQiwgMHhGNiwgMHhBOCwgMHg0MywgMHhBQywgMHgyOSwgMHgxQSwgMHhENCwgMHg4MywgMHhERiwgMHhCRiwNCisgICAgMHgwQiwgMHg5MSwgMHhFRCwgMHg1RSwgMHhCNCwgMHg3NywgMHhFOCwgMHg0MSwgMHg3OSwgMHg0MCwgMHgzNCwgMHhGRCwNCisgICAgMHgzMiwgMHg5NiwgMHgwNiwgMHhFNywgMHg2MSwgMHg2MCwgMHgxMywgMHg4OCwgMHhBNSwgMHg0MCwgMHg3RCwgMHgxMiwNCisgICAgMHg5MSwgMHg5RSwgMHhCRSwgMHhCNCwgMHhCNywgMHgzNiwgMHhEQiwgMHhGNSwgMHgxRCwgMHgyMSwgMHg0NSwgMHhDMywNCisgICAgMHgwOCwgMHhFRSwgMHg4MywgMHhDMCwgMHg1RSwgMHg3OSwgMHg1QSwgMHhGMiwgMHhBMiwgMHhBNSwgMHgyMiwgMHg0RiwNCisgICAgMHg5QSwgMHg4MywgMHgyQSwgMHg5MiwgMHgwOSwgMHgxNywgMHgyNCwgMHhEMywgMHg4NCwgMHhEOCwgMHhGMCwgMHhBRCwNCisgICAgMHhGNywgMHgxMSwgMHhGNywgMHhENSwgMHg1QiwgMHhBRSwgMHg5NiwgMHhDQiwgMHg5QywgMHhGOCwgMHg4MCwgMHhGQywNCisgICAgMHhGOCwgMHg3NiwgMHhFQiwgMHgxQiwgMHg5RiwgMHhFNywgMHhDOSwgMHgxRCwgMHhFNCwgMHg2NywgMHg3OSwgMHg3MiwNCisgICAgMHgxMCwgMHgzQywgMHg5OCwgMHgyMywgMHgzRiwgMHg2QSwgMHg4QywgMHhBRiwgMHg2MSwgMHgxNSwgMHgyOSwgMHgyMywNCisgICAgMHhBMywgMHhDNCwgMHgyOCwgMHhEMiwgMHg5NywgMHg1RSwgMHg4NywgMHhDQSwgMHhGRiwgMHhDOCwgMHgyQiwgMHgyQSwNCisgICAgMHhDMiwgMHgyNiwgMHgyRCwgMHhEMCwgMHg1MywgMHgwRSwgMHg0MCwgMHgwOCwgMHg3MSwgMHg3RCwgMHgzMiwgMHgzNSwNCisgICAgMHgzRCwgMHhFMiwgMHg1MywgMHgwMCwgMHgwOSwgMHhGOSwgMHgzNCwgMHhBMywgMHhBQSwgMHg3QywgMHg2NywgMHhFRiwNCisgICAgMHgyOSwgMHg5RiwgMHhDRiwgMHhGMywgMHhFRCwgMHhFRCwgMHg2NywgMHg3QywgMHhBMSwgMHhDMCwgMHg5RiwgMHg3RCwNCisgICAgMHg3RSwgMHhDNSwgMHg4MywgMHgyNSwgMHgyMSwgMHgxNSwgMHg1MCwgMHhCMCwgMHg0QSwgMHgzOCwgMHgyRSwgMHgyNSwNCisgICAgMHg5NywgMHhFOCwgMHhBQiwgMHg4MCwgMHg2RCwgMHgxMywgMHhEMSwgMHg0RiwgMHhFNSwgMHhGMywgMHg1MywgMHg4NSwNCisgICAgMHg0MiwgMHg1RiwgMHgxMiwgMHhENywgMHg5QSwgMHgxOSwgMHhBQSwgMHg4OSwgMHgwQSwgMHhBOCwgMHgxOSwgMHg5MSwNCisgICAgMHhEMSwgMHhERCwgMHg0QiwgMHhCMywgMHg0OCwgMHg1MCwgMHhFRiwgMHgyNiwgMHhDRCwgMHg0QiwgMHhDNiwgMHhDQSwNCisgICAgMHg2QSwgMHg1NiwgMHhBRiwgMHgxNCwgMHhFNiwgMHg2NiwgMHg2RiwgMHhBRSwgMHhERiwgMHg3RiwgMHhBNCwgMHhFNiwNCisgICAgMHhBQywgMHgyNSwgMHhDNywgMHhDMywgMHgyMCwgMHhDOSwgMHg1NiwgMHgxQSwgMHg1NSwgMHhCRCwgMHgwOCwgMHg3MSwNCisgICAgMHhEOCwgMHhDOCwgMHgxMCwgMHhFNiwgMHhGNiwgMHg0NCwgMHgzMCwgMHhGMiwgMHgyRCwgMHhDOCwgMHg5QywgMHg2OCwNCisgICAgMHg4RCwgMHg1QSwgMHg1NiwgMHg2NiwgMHhEQywgMHhCMiwgMHgyQywgMHgyMSwgMHgxNSwgMHhFMiwgMHhCMSwgMHhBNSwNCisgICAgMHg3MiwgMHgxNSwgMHg2MywgMHg2OCwgMHhDOCwgMHgzNSwgMHg0RSwgMHgxQywgMHg3NCwgMHhDNCwgMHg5OSwgMHhDQywNCisgICAgMHhFMywgMHg2MSwgMHg3RiwgMHgzOSwgMHhEMiwgMHg3NywgMHg5RCwgMHgzNSwgMHg4OCwgMHg2NSwgMHg2OCwgMHg5OCwNCisgICAgMHg2RSwgMHgwQiwgMHg0MywgMHg3MSwgMHgxRCwgMHhGNSwgMHgyNiwgMHgzNiwgMHg4RiwgMHgzRiwgMHhFMywgMHhGOSwNCisgICAgMHhEOCwgMHgwMywgMHg2MSwgMHhDOCwgMHgyRCwgMHhBRiwgMHg0MCwgMHg1OSwgMHhEMywgMHgyNSwgMHg3MiwgMHg1RiwNCisgICAgMHhDNiwgMHhCRCwgMHgyQSwgMHg0RSwgMHg5QSwgMHgyOSwgMHgyOCwgMHg2MSwgMHg1NCwgMHg1RCwgMHhEMywgMHhFOCwNCisgICAgMHhGNSwgMHgxOCwgMHhFRCwgMHg1MywgMHhFMSwgMHg0RiwgMHgzMCwgMHhENCwgMHhBNywgMHg0MCwgMHhENywgMHg4QywNCisgICAgMHg2QSwgMHg4NSwgMHgxMywgMHhDNywgMHhGQSwgMHhBNCwgMHg1QiwgMHgxMCwgMHgyMywgMHg0RSwgMHg5QywgMHg4OCwNCisgICAgMHhCMSwgMHhDRiwgMHg4RCwgMHgwOSwgMHg5RCwgMHhCRCwgMHg3NywgMHgzMCwgMHgyMSwgMHg2NywgMHhDMiwgMHhBMCwNCisgICAgMHg3NywgMHgyMywgMHhFRCwgMHg4MCwgMHgxMywgMHhCMywgMHhCOSwgMHg0MSwgMHhGMiwgMHg2QywgMHg4NSwgMHgxOCwNCisgICAgMHg1RCwgMHg1NCwgMHg1QSwgMHgwNSwgMHhEMSwgMHgwNSwgMHg5NSwgMHhDRCwgMHhGRSwgMHg4MywgMHgyQywgMHg3OCwNCisgICAgMHgxMCwgMHgzMSwgMHg5MSwgMHhGRCwgMHg2RSwgMHhDNiwgMHhGQSwgMHhBNiwgMHhFRiwgMHg0MSwgMHg2RCwgMHgwRCwNCisgICAgMHgyRSwgMHg0QiwgMHhCMiwgMHhGNywgMHg0QywgMHg3QiwgMHhBMSwgMHg1QiwgMHg3MywgMHg0NiwgMHg0MSwgMHg0NSwNCisgICAgMHgwOCwgMHhGMiwgMHhFNCwgMHhCNCwgMHg0MCwgMHhDMSwgMHg1NCwgMHhDMCwgMHg2RCwgMHgyRSwgMHg5NSwgMHg0OCwNCisgICAgMHhDQiwgMHhENywgMHhDOCwgMHhERiwgMHg5MiwgMHgwQSwgMHg1OCwgMHgyMCwgMHgzNiwgMHgzMiwgMHgwOCwgMHg5QSwNCisgICAgMHhBMSwgMHgyMSwgMHhBMywgMHgwQiwgMHhFMSwgMHgwNiwgMHhBQSwgMHg2MiwgMHgwRCwgMHg2MiwgMHhCQSwgMHgwQiwNCisgICAgMHg4MywgMHhFMSwgMHhCNCwgMHhCMiwgMHhBMCwgMHhGNSwgMHhBNCwgMHg2NCwgMHg2MSwgMHgxMSwgMHhDMywgMHhGNSwNCisgICAgMHhBRSwgMHg5NCwgMHgxOSwgMHgyQywgMHgxNSwgMHhDOSwgMHg0NywgMHhEOSwgMHg4RCwgMHhCMiwgMHhBOCwgMHg0QSwNCisgICAgMHgxQSwgMHg4MywgMHg5MCwgMHg0MywgMHg1NiwgMHg3NSwgMHg1NSwgMHgwMiwgMHhGMywgMHhDOCwgMHg1NCwgMHgzNSwNCisgICAgMHg5OSwgMHhDRSwgMHgzNCwgMHg3NiwgMHhFRiwgMHgxNiwgMHhDOCwgMHg3NywgMHgyNywgMHgxMywgMHgwMywgMHg2NCwNCisgICAgMHgxNSwgMHg3OSwgMHhFNCwgMHhCQiwgMHg1RCwgMHhCNywgMHgyRSwgMHhBMCwgMHgxRSwgMHg3NiwgMHhCQiwgMHhBNywNCisgICAgMHg1MiwgMHhBQiwgMHgxQSwgMHhBNSwgMHgxNSwgMHg2NCwgMHgzMywgMHg5RCwgMHhERCwgMHhFRCwgMHg0NywgMHgyRSwNCisgICAgMHg3MCwgMHg5RSwgMHg0MiwgMHhDQSwgMHhGOSwgMHgyNywgMHg0MiwgMHhGQywgMHgwQiwgMHhEOSwgMHgwRSwgMHg0QiwNCisgICAgMHhFRH07DQogY29uc3QgdWludDhfdCBnX2phSlBfTG9jYWxlW10gPSB7DQotICAgIDB4NzgsIDB4OUMsIDB4RUQsIDB4NTYsIDB4Q0IsIDB4NkUsIDB4RDMsIDB4NDAsIDB4MTQsIDB4NUQsIDB4MTcsIDB4ODksIDB4N0YsIDB4MTgsIDB4NTksIDB4MjAsIDB4ODMsIDB4RDQsIDB4RDYsIDB4MEQsDQotICAgIDB4RUYsIDB4NTYsIDB4QUUsIDB4QTUsIDB4OEEsIDB4OTYsIDB4ODYsIDB4MTYsIDB4QTMsIDB4MDgsIDB4NTcsIDB4QTAsIDB4NzYsIDB4ODMsIDB4MjYsIDB4RjYsIDB4MzQsIDB4OTksIDB4MzYsIDB4OUUsDQotICAgIDB4QTksIDB4MjYsIDB4QjYsIDB4NEEsIDB4QkMsIDB4RTIsIDB4MjEsIDB4MjAsIDB4NDgsIDB4NzQsIDB4MDEsIDB4MUIsIDB4MDQsIDB4NDQsIDB4NjIsIDB4NTUsIDB4NDAsIDB4MDIsIDB4MDQsIDB4OEIsDQotICAgIDB4NkUsIDB4RDgsIDB4RDAsIDB4QUYsIDB4NDksIDB4NUEsIDB4NTYsIDB4RkMsIDB4MDIsIDB4MzMsIDB4N0UsIDB4QzUsIDB4OEUsIDB4RUQsIDB4RTAsIDB4RUUsIDB4RjEsIDB4MjIsIDB4OTksIDB4N0IsDQotICAgIDB4N0MsIDB4Q0UsIDB4RjUsIDB4QkQsIDB4RTcsIDB4OEUsIDB4NDcsIDB4NTYsIDB4NUIsIDB4RDQsIDB4ODQsIDB4MkQsIDB4MDQsIDB4MDgsIDB4QjQsIDB4RDEsIDB4QkMsIDB4QjQsIDB4MDUsIDB4RUYsDQotICAgIDB4QUYsIDB4RDQsIDB4MjQsIDB4NjAsIDB4QTEsIDB4QjYsIDB4MzksIDB4MkYsIDB4MEQsIDB4REUsIDB4RUMsIDB4MUYsIDB4N0YsIDB4RkYsIDB4NzYsIDB4OEUsIDB4RkYsIDB4MEQsIDB4N0EsIDB4NUYsDQotICAgIDB4Q0YsIDB4NEIsIDB4REEsIDB4RTksIDB4NTMsIDB4MDAsIDB4QTgsIDB4ODIsIDB4NEMsIDB4MkMsIDB4QzgsIDB4OEMsIDB4OEUsIDB4NUQsIDB4QTcsIDB4QUQsIDB4NzYsIDB4QTgsIDB4NkIsIDB4MzAsDQotICAgIDB4RDQsIDB4QTAsIDB4MEMsIDB4NDMsIDB4MjIsIDB4NTgsIDB4MTMsIDB4NDAsIDB4QjUsIDB4MjksIDB4NzEsIDB4OUEsIDB4QjcsIDB4RjksIDB4QUQsIDB4QjYsIDB4ODgsIDB4MjcsIDB4ODIsIDB4NTgsDQotICAgIDB4QUIsIDB4MEMsIDB4N0EsIDB4NUQsIDB4NTUsIDB4MDksIDB4RDYsIDB4MDksIDB4RjgsIDB4NDIsIDB4M0UsIDB4N0MsIDB4MzEsIDB4MUYsIDB4QkUsIDB4OTQsIDB4MEYsIDB4NUYsIDB4Q0UsIDB4ODcsDQotICAgIDB4QUYsIDB4RTQsIDB4QzMsIDB4NTcsIDB4RjMsIDB4RTEsIDB4NkIsIDB4RjksIDB4RjAsIDB4NkMsIDB4M0UsIDB4NUMsIDB4OTksIDB4MjksIDB4QzAsIDB4MEIsIDB4RkEsIDB4QUMsIDB4OEMsIDB4MzQsDQotICAgIDB4MEEsIDB4QzIsIDB4NzUsIDB4RUMsIDB4NTMsIDB4RDIsIDB4MzcsIDB4MDAsIDB4RUIsIDB4NzUsIDB4MzYsIDB4MkYsIDB4NTUsIDB4QTQsIDB4RkYsIDB4MDYsIDB4OUUsIDB4QzQsIDB4NDAsIDB4MEIsDQotICAgIDB4NzYsIDB4MTIsIDB4REIsIDB4OEUsIDB4NDcsIDB4OUEsIDB4RDgsIDB4QkUsIDB4RUYsIDB4N0IsIDB4RkMsIDB4NTcsIDB4NTUsIDB4NDQsIDB4MzgsIDB4QzQsIDB4N0IsIDB4REQsIDB4NUMsIDB4RkMsDQotICAgIDB4RTgsIDB4RDEsIDB4OTcsIDB4N0MsIDB4RkUsIDB4OEYsIDB4ODMsIDB4ODIsIDB4M0MsIDB4OUYsIDB4NzMsIDB4RjEsIDB4REYsIDB4Q0YsIDB4NUYsIDB4RTUsIDB4RTIsIDB4RkQsIDB4REUsIDB4ODcsDQotICAgIDB4MTEsIDB4MUMsIDB4RjgsIDB4QUIsIDB4OUMsIDB4MjYsIDB4NDYsIDB4RjYsIDB4NDAsIDB4RDgsIDB4NEQsIDB4QjYsIDB4OEYsIDB4NkMsIDB4MDcsIDB4RDksIDB4REEsIDB4QjMsIDB4NTUsIDB4NjcsDQotICAgIDB4RUIsIDB4Q0QsIDB4NTYsIDB4NUEsIDB4NUMsIDB4QTMsIDB4OEQsIDB4MTgsIDB4QjYsIDB4MzAsIDB4QjIsIDB4OTMsIDB4MkYsIDB4NzksIDB4MDgsIDB4NjksIDB4RkQsIDB4QkQsIDB4NkUsIDB4RkYsDQotICAgIDB4QzUsIDB4MUUsIDB4MUYsIDB4NEUsIDB4MDQsIDB4NjQsIDB4NkYsIDB4RkYsIDB4N0EsIDB4OTksIDB4QkUsIDB4MEQsIDB4ODYsIDB4NjEsIDB4RTIsIDB4MjEsIDB4ODgsIDB4QzEsIDB4NDQsIDB4N0UsDQotICAgIDB4MUUsIDB4NjksIDB4NDcsIDB4MDcsIDB4MEYsIDB4RkIsIDB4NEYsIDB4OUYsIDB4RjgsIDB4RDksIDB4NDUsIDB4MTgsIDB4RTMsIDB4QzcsIDB4RkIsIDB4ODcsIDB4ODMsIDB4NzcsIDB4MUYsIDB4NjMsDQotICAgIDB4MTAsIDB4RjgsIDB4QUIsIDB4NDgsIDB4Q0IsIDB4OEYsIDB4MkQsIDB4NjUsIDB4RTQsIDB4REMsIDB4MEEsIDB4NTAsIDB4MEIsIDB4M0EsIDB4QTgsIDB4MDYsIDB4MUQsIDB4MDcsIDB4MzEsIDB4MTIsDQotICAgIDB4NUIsIDB4MUYsIDB4MjMsIDB4RTEsIDB4RDEsIDB4QjYsIDB4RTksIDB4QjYsIDB4NUEsIDB4OTIsIDB4QjYsIDB4Q0UsIDB4MkYsIDB4QjksIDB4RkYsIDB4RjMsIDB4NDAsIDB4RDYsIDB4NjUsIDB4NkUsDQotICAgIDB4QjgsIDB4QkMsIDB4MjgsIDB4RjMsIDB4NDEsIDB4QzgsIDB4NEIsIDB4RkMsIDB4MTIsIDB4QkUsIDB4QzQsIDB4OTIsIDB4QTIsIDB4MUMsIDB4MkQsIDB4NEEsIDB4MUEsIDB4MDUsIDB4MzksIDB4NEEsDQotICAgIDB4RTksIDB4NkQsIDB4NjQsIDB4MDUsIDB4NzIsIDB4NDUsIDB4RDcsIDB4OTUsIDB4QzUsIDB4QzUsIDB4NTIsIDB4OUEsIDB4NzYsIDB4OTMsIDB4MzIsIDB4NDcsIDB4QTgsIDB4RjIsIDB4MzUsIDB4MDAsDQotICAgIDB4QTQsIDB4OTAsIDB4RDAsIDB4MTAsIDB4MDcsIDB4REIsIDB4MjMsIDB4ODYsIDB4MjQsIDB4OTAsIDB4OTQsIDB4MjEsIDB4NTUsIDB4NzksIDB4RjAsIDB4RjYsIDB4QjEsIDB4QUMsIDB4RUIsIDB4NzIsDQotICAgIDB4QkYsIDB4RkIsIDB4NEMsIDB4MzYsIDB4MEMsIDB4RjksIDB4RTgsIDB4RDMsIDB4NkIsIDB4NzksIDB4NDMsIDB4NTUsIDB4MTIsIDB4RjQsIDB4MjIsIDB4N0QsIDB4NjAsIDB4NDYsIDB4NzUsIDB4NEUsDQotICAgIDB4RDcsIDB4RTcsIDB4MEMsIDB4NjMsIDB4QUUsIDB4OUMsIDB4QzYsIDB4MzcsIDB4MjAsIDB4OTQsIDB4OTQsIDB4MTIsIDB4ODQsIDB4REQsIDB4MEIsIDB4QzksIDB4MjgsIDB4NUYsIDB4NzQsIDB4M0UsDQotICAgIDB4RDIsIDB4NjcsIDB4QjgsIDB4MTUsIDB4RDYsIDB4MzgsIDB4MUEsIDB4RUQsIDB4OEYsIDB4NjUsIDB4NDgsIDB4QjYsIDB4QjYsIDB4QUIsIDB4NzYsIDB4REIsIDB4NTgsIDB4NUEsIDB4QkMsIDB4QjEsDQotICAgIDB4N0IsIDB4RUYsIDB4NDEsIDB4NzMsIDB4RDUsIDB4REIsIDB4MDgsIDB4MEMsIDB4NEIsIDB4OTIsIDB4N0MsIDB4MjUsIDB4NzEsIDB4RUQsIDB4M0EsIDB4NjIsIDB4NjksIDB4RDcsIDB4NTIsIDB4NTgsDQotICAgIDB4NTgsIDB4MTIsIDB4QzcsIDB4RjgsIDB4MEUsIDB4MzcsIDB4MjUsIDB4Q0QsIDB4OUIsIDB4RjQsIDB4QkMsIDB4RDksIDB4NjksIDB4Q0YsIDB4RjMsIDB4NTQsIDB4MjUsIDB4QzUsIDB4MkIsIDB4OTYsDQotICAgIDB4OUEsIDB4MkUsIDB4NjMsIDB4ODgsIDB4OTgsIDB4MUQsIDB4NDksIDB4M0IsIDB4RTMsIDB4OEIsIDB4NEIsIDB4MEIsIDB4NzcsIDB4MTAsIDB4MzMsIDB4MTEsIDB4NzEsIDB4QzIsIDB4NjcsIDB4OUUsDQotICAgIDB4Q0QsIDB4RUEsIDB4ODQsIDB4MTksIDB4OTksIDB4MDYsIDB4RTIsIDB4QTYsIDB4ODYsIDB4N0QsIDB4NEUsIDB4QTQsIDB4QTEsIDB4MzAsIDB4QkQsIDB4ODUsIDB4NEMsIDB4NkMsIDB4NDMsIDB4QkUsDQotICAgIDB4MUIsIDB4QTYsIDB4QTMsIDB4MkMsIDB4QzEsIDB4RUQsIDB4NDIsIDB4NDEsIDB4ODMsIDB4NTEsIDB4NzcsIDB4MDcsIDB4OEIsIDB4RjksIDB4NEYsIDB4OTYsIDB4NTQsIDB4QzQsIDB4MUQsIDB4OUMsDQotICAgIDB4MkQsIDB4MjksIDB4QjAsIDB4MzEsIDB4NzEsIDB4REIsIDB4OTIsIDB4MzYsIDB4NTUsIDB4OTIsIDB4RUUsIDB4MjEsIDB4NDYsIDB4MjUsIDB4NkQsIDB4MjYsIDB4QzMsIDB4MUUsIDB4MUEsIDB4OTMsDQotICAgIDB4MUEsIDB4NzYsIDB4MzQsIDB4ODksIDB4OTQsIDB4MzMsIDB4NjksIDB4MzAsIDB4REEsIDB4ODEsIDB4N0UsIDB4MjAsIDB4NjksIDB4N0YsIDB4MEUsIDB4RjksIDB4ODksIDB4OUQsIDB4NjYsIDB4OEMsDQotICAgIDB4NTEsIDB4RTEsIDB4MzYsIDB4MTUsIDB4MEIsIDB4NDksIDB4NUIsIDB4QTksIDB4QUQsIDB4OUYsIDB4NDAsIDB4OTYsIDB4MUMsIDB4NDQsIDB4NDYsIDB4RTQsIDB4MUYsIDB4N0YsIDB4OTksIDB4QkEsDQotICAgIDB4QzUsIDB4REIsIDB4REUsIDB4RDksIDB4NDEsIDB4OUIsIDB4RDAsIDB4OEMsIDB4NEUsIDB4REIsIDB4MjgsIDB4MEMsIDB4NzMsIDB4QUUsIDB4NTIsIDB4Q0YsIDB4REQsIDB4ODYsIDB4NjAsIDB4OTksDQotICAgIDB4M0EsIDB4NEQsIDB4NkMsIDB4ODIsIDB4MUEsIDB4QTMsIDB4NTMsIDB4NzcsIDB4NkYsIDB4MDIsIDB4NUQsIDB4NTIsIDB4QzYsIDB4OTEsIDB4NzUsIDB4NEMsIDB4Q0MsIDB4MjYsIDB4OEQsIDB4QzgsDQotICAgIDB4NzcsIDB4MEEsIDB4QzgsIDB4N0EsIDB4ODcsIDB4N0YsIDB4MkEsIDB4NUEsIDB4ODIsIDB4NTUsIDB4NDQsIDB4QzAsIDB4MDQsIDB4NTMsIDB4MzIsIDB4ODYsIDB4NzAsIDB4OUQsIDB4QkEsIDB4MEMsDQotICAgIDB4MjMsIDB4MDYsIDB4MEMsIDB4QzcsIDB4MkEsIDB4NjAsIDB4MkMsIDB4NTgsIDB4QjQsIDB4OEUsIDB4NDAsIDB4MEQsIDB4RkYsIDB4OTMsIDB4NTIsIDB4NDUsIDB4NzUsIDB4ODYsIDB4NzYsIDB4QzcsDQotICAgIDB4NTIsIDB4MTYsIDB4MTgsIDB4QUMsIDB4RjMsIDB4MTcsIDB4NzcsIDB4MUMsIDB4NjUsIDB4QUQsIDB4MDksIDB4RjEsIDB4NTgsIDB4MDIsIDB4NkYsIDB4QTksIDB4MjEsIDB4NkEsIDB4MDEsIDB4QjcsDQotICAgIDB4QzYsIDB4RDIsIDB4MEMsIDB4NUEsIDB4OEEsIDB4QTYsIDB4NzcsIDB4NUMsIDB4RDIsIDB4RDgsIDB4QTIsIDB4M0UsIDB4MzMsIDB4MTgsIDB4ODksIDB4N0YsIDB4QUEsIDB4MjUsIDB4RTYsIDB4QTksDQotICAgIDB4MkEsIDB4QzEsIDB4ODcsIDB4QkQsIDB4RjYsIDB4MTcsIDB4NkMsIDB4NDIsIDB4MDgsIDB4MjENCi19Ow0KKyAgICAweDc4LCAweDlDLCAweEVELCAweDU2LCAweENCLCAweDZFLCAweEQzLCAweDQwLCAweDE0LCAweDVELCAweDE3LCAweDg5LA0KKyAgICAweDdGLCAweDE4LCAweDU5LCAweDIwLCAweDgzLCAweEQ0LCAweEQ2LCAweDBELCAweEVGLCAweDU2LCAweEFFLCAweEE1LA0KKyAgICAweDhBLCAweDk2LCAweDg2LCAweDE2LCAweEEzLCAweDA4LCAweDU3LCAweEEwLCAweDc2LCAweDgzLCAweDI2LCAweEY2LA0KKyAgICAweDM0LCAweDk5LCAweDM2LCAweDlFLCAweEE5LCAweDI2LCAweEI2LCAweDRBLCAweEJDLCAweEUyLCAweDIxLCAweDIwLA0KKyAgICAweDQ4LCAweDc0LCAweDAxLCAweDFCLCAweDA0LCAweDQ0LCAweDYyLCAweDU1LCAweDQwLCAweDAyLCAweDA0LCAweDhCLA0KKyAgICAweDZFLCAweEQ4LCAweEQwLCAweEFGLCAweDQ5LCAweDVBLCAweDU2LCAweEZDLCAweDAyLCAweDMzLCAweDdFLCAweEM1LA0KKyAgICAweDhFLCAweEVELCAweEUwLCAweEVFLCAweEYxLCAweDIyLCAweDk5LCAweDdCLCAweDdDLCAweENFLCAweEY1LCAweEJELA0KKyAgICAweEU3LCAweDhFLCAweDQ3LCAweDU2LCAweDVCLCAweEQ0LCAweDg0LCAweDJELCAweDA0LCAweDA4LCAweEI0LCAweEQxLA0KKyAgICAweEJDLCAweEI0LCAweDA1LCAweEVGLCAweEFGLCAweEQ0LCAweDI0LCAweDYwLCAweEExLCAweEI2LCAweDM5LCAweDJGLA0KKyAgICAweDBELCAweERFLCAweEVDLCAweDFGLCAweDdGLCAweEZGLCAweDc2LCAweDhFLCAweEZGLCAweDBELCAweDdBLCAweDVGLA0KKyAgICAweENGLCAweDRCLCAweERBLCAweEU5LCAweDUzLCAweDAwLCAweEE4LCAweDgyLCAweDRDLCAweDJDLCAweEM4LCAweDhDLA0KKyAgICAweDhFLCAweDVELCAweEE3LCAweEFELCAweDc2LCAweEE4LCAweDZCLCAweDMwLCAweEQ0LCAweEEwLCAweDBDLCAweDQzLA0KKyAgICAweDIyLCAweDU4LCAweDEzLCAweDQwLCAweEI1LCAweDI5LCAweDcxLCAweDlBLCAweEI3LCAweEY5LCAweEFELCAweEI2LA0KKyAgICAweDg4LCAweDI3LCAweDgyLCAweDU4LCAweEFCLCAweDBDLCAweDdBLCAweDVELCAweDU1LCAweDA5LCAweEQ2LCAweDA5LA0KKyAgICAweEY4LCAweDQyLCAweDNFLCAweDdDLCAweDMxLCAweDFGLCAweEJFLCAweDk0LCAweDBGLCAweDVGLCAweENFLCAweDg3LA0KKyAgICAweEFGLCAweEU0LCAweEMzLCAweDU3LCAweEYzLCAweEUxLCAweDZCLCAweEY5LCAweEYwLCAweDZDLCAweDNFLCAweDVDLA0KKyAgICAweDk5LCAweDI5LCAweEMwLCAweDBCLCAweEZBLCAweEFDLCAweDhDLCAweDM0LCAweDBBLCAweEMyLCAweDc1LCAweEVDLA0KKyAgICAweDUzLCAweEQyLCAweDM3LCAweDAwLCAweEVCLCAweDc1LCAweDM2LCAweDJGLCAweDU1LCAweEE0LCAweEZGLCAweDA2LA0KKyAgICAweDlFLCAweEM0LCAweDQwLCAweDBCLCAweDc2LCAweDEyLCAweERCLCAweDhFLCAweDQ3LCAweDlBLCAweEQ4LCAweEJFLA0KKyAgICAweEVGLCAweDdCLCAweEZDLCAweDU3LCAweDU1LCAweDQ0LCAweDM4LCAweEM0LCAweDdCLCAweERELCAweDVDLCAweEZDLA0KKyAgICAweEU4LCAweEQxLCAweDk3LCAweDdDLCAweEZFLCAweDhGLCAweDgzLCAweDgyLCAweDNDLCAweDlGLCAweDczLCAweEYxLA0KKyAgICAweERGLCAweENGLCAweDVGLCAweEU1LCAweEUyLCAweEZELCAweERFLCAweDg3LCAweDExLCAweDFDLCAweEY4LCAweEFCLA0KKyAgICAweDlDLCAweDI2LCAweDQ2LCAweEY2LCAweDQwLCAweEQ4LCAweDRELCAweEI2LCAweDhGLCAweDZDLCAweDA3LCAweEQ5LA0KKyAgICAweERBLCAweEIzLCAweDU1LCAweDY3LCAweEVCLCAweENELCAweDU2LCAweDVBLCAweDVDLCAweEEzLCAweDhELCAweDE4LA0KKyAgICAweEI2LCAweDMwLCAweEIyLCAweDkzLCAweDJGLCAweDc5LCAweDA4LCAweDY5LCAweEZELCAweEJELCAweDZFLCAweEZGLA0KKyAgICAweEM1LCAweDFFLCAweDFGLCAweDRFLCAweDA0LCAweDY0LCAweDZGLCAweEZGLCAweDdBLCAweDk5LCAweEJFLCAweDBELA0KKyAgICAweDg2LCAweDYxLCAweEUyLCAweDIxLCAweDg4LCAweEMxLCAweDQ0LCAweDdFLCAweDFFLCAweDY5LCAweDQ3LCAweDA3LA0KKyAgICAweDBGLCAweEZCLCAweDRGLCAweDlGLCAweEY4LCAweEQ5LCAweDQ1LCAweDE4LCAweEUzLCAweEM3LCAweEZCLCAweDg3LA0KKyAgICAweDgzLCAweDc3LCAweDFGLCAweDYzLCAweDEwLCAweEY4LCAweEFCLCAweDQ4LCAweENCLCAweDhGLCAweDJELCAweDY1LA0KKyAgICAweEU0LCAweERDLCAweDBBLCAweDUwLCAweDBCLCAweDNBLCAweEE4LCAweDA2LCAweDFELCAweDA3LCAweDMxLCAweDEyLA0KKyAgICAweDVCLCAweDFGLCAweDIzLCAweEUxLCAweEQxLCAweEI2LCAweEU5LCAweEI2LCAweDVBLCAweDkyLCAweEI2LCAweENFLA0KKyAgICAweDJGLCAweEI5LCAweEZGLCAweEYzLCAweDQwLCAweEQ2LCAweDY1LCAweDZFLCAweEI4LCAweEJDLCAweDI4LCAweEYzLA0KKyAgICAweDQxLCAweEM4LCAweDRCLCAweEZDLCAweDEyLCAweEJFLCAweEM0LCAweDkyLCAweEEyLCAweDFDLCAweDJELCAweDRBLA0KKyAgICAweDFBLCAweDA1LCAweDM5LCAweDRBLCAweEU5LCAweDZELCAweDY0LCAweDA1LCAweDcyLCAweDQ1LCAweEQ3LCAweDk1LA0KKyAgICAweEM1LCAweEM1LCAweDUyLCAweDlBLCAweDc2LCAweDkzLCAweDMyLCAweDQ3LCAweEE4LCAweEYyLCAweDM1LCAweDAwLA0KKyAgICAweEE0LCAweDkwLCAweEQwLCAweDEwLCAweDA3LCAweERCLCAweDIzLCAweDg2LCAweDI0LCAweDkwLCAweDk0LCAweDIxLA0KKyAgICAweDU1LCAweDc5LCAweEYwLCAweEY2LCAweEIxLCAweEFDLCAweEVCLCAweDcyLCAweEJGLCAweEZCLCAweDRDLCAweDM2LA0KKyAgICAweDBDLCAweEY5LCAweEU4LCAweEQzLCAweDZCLCAweDc5LCAweDQzLCAweDU1LCAweDEyLCAweEY0LCAweDIyLCAweDdELA0KKyAgICAweDYwLCAweDQ2LCAweDc1LCAweDRFLCAweEQ3LCAweEU3LCAweDBDLCAweDYzLCAweEFFLCAweDlDLCAweEM2LCAweDM3LA0KKyAgICAweDIwLCAweDk0LCAweDk0LCAweDEyLCAweDg0LCAweERELCAweDBCLCAweEM5LCAweDI4LCAweDVGLCAweDc0LCAweDNFLA0KKyAgICAweEQyLCAweDY3LCAweEI4LCAweDE1LCAweEQ2LCAweDM4LCAweDFBLCAweEVELCAweDhGLCAweDY1LCAweDQ4LCAweEI2LA0KKyAgICAweEI2LCAweEFCLCAweDc2LCAweERCLCAweDU4LCAweDVBLCAweEJDLCAweEIxLCAweDdCLCAweEVGLCAweDQxLCAweDczLA0KKyAgICAweEQ1LCAweERCLCAweDA4LCAweDBDLCAweDRCLCAweDkyLCAweDdDLCAweDI1LCAweDcxLCAweEVELCAweDNBLCAweDYyLA0KKyAgICAweDY5LCAweEQ3LCAweDUyLCAweDU4LCAweDU4LCAweDEyLCAweEM3LCAweEY4LCAweDBFLCAweDM3LCAweDI1LCAweENELA0KKyAgICAweDlCLCAweEY0LCAweEJDLCAweEQ5LCAweDY5LCAweENGLCAweEYzLCAweDU0LCAweDI1LCAweEM1LCAweDJCLCAweDk2LA0KKyAgICAweDlBLCAweDJFLCAweDYzLCAweDg4LCAweDk4LCAweDFELCAweDQ5LCAweDNCLCAweEUzLCAweDhCLCAweDRCLCAweDBCLA0KKyAgICAweDc3LCAweDEwLCAweDMzLCAweDExLCAweDcxLCAweEMyLCAweDY3LCAweDlFLCAweENELCAweEVBLCAweDg0LCAweDE5LA0KKyAgICAweDk5LCAweDA2LCAweEUyLCAweEE2LCAweDg2LCAweDdELCAweDRFLCAweEE0LCAweEExLCAweDMwLCAweEJELCAweDg1LA0KKyAgICAweDRDLCAweDZDLCAweDQzLCAweEJFLCAweDFCLCAweEE2LCAweEEzLCAweDJDLCAweEMxLCAweEVELCAweDQyLCAweDQxLA0KKyAgICAweDgzLCAweDUxLCAweDc3LCAweDA3LCAweDhCLCAweEY5LCAweDRGLCAweDk2LCAweDU0LCAweEM0LCAweDFELCAweDlDLA0KKyAgICAweDJELCAweDI5LCAweEIwLCAweDMxLCAweDcxLCAweERCLCAweDkyLCAweDM2LCAweDU1LCAweDkyLCAweEVFLCAweDIxLA0KKyAgICAweDQ2LCAweDI1LCAweDZELCAweDI2LCAweEMzLCAweDFFLCAweDFBLCAweDkzLCAweDFBLCAweDc2LCAweDM0LCAweDg5LA0KKyAgICAweDk0LCAweDMzLCAweDY5LCAweDMwLCAweERBLCAweDgxLCAweDdFLCAweDIwLCAweDY5LCAweDdGLCAweDBFLCAweEY5LA0KKyAgICAweDg5LCAweDlELCAweDY2LCAweDhDLCAweDUxLCAweEUxLCAweDM2LCAweDE1LCAweDBCLCAweDQ5LCAweDVCLCAweEE5LA0KKyAgICAweEFELCAweDlGLCAweDQwLCAweDk2LCAweDFDLCAweDQ0LCAweDQ2LCAweEU0LCAweDFGLCAweDdGLCAweDk5LCAweEJBLA0KKyAgICAweEM1LCAweERCLCAweERFLCAweEQ5LCAweDQxLCAweDlCLCAweEQwLCAweDhDLCAweDRFLCAweERCLCAweDI4LCAweDBDLA0KKyAgICAweDczLCAweEFFLCAweDUyLCAweENGLCAweERELCAweDg2LCAweDYwLCAweDk5LCAweDNBLCAweDRELCAweDZDLCAweDgyLA0KKyAgICAweDFBLCAweEEzLCAweDUzLCAweDc3LCAweDZGLCAweDAyLCAweDVELCAweDUyLCAweEM2LCAweDkxLCAweDc1LCAweDRDLA0KKyAgICAweENDLCAweDI2LCAweDhELCAweEM4LCAweDc3LCAweDBBLCAweEM4LCAweDdBLCAweDg3LCAweDdGLCAweDJBLCAweDVBLA0KKyAgICAweDgyLCAweDU1LCAweDQ0LCAweEMwLCAweDA0LCAweDUzLCAweDMyLCAweDg2LCAweDcwLCAweDlELCAweEJBLCAweDBDLA0KKyAgICAweDIzLCAweDA2LCAweDBDLCAweEM3LCAweDJBLCAweDYwLCAweDJDLCAweDU4LCAweEI0LCAweDhFLCAweDQwLCAweDBELA0KKyAgICAweEZGLCAweDkzLCAweDUyLCAweDQ1LCAweDc1LCAweDg2LCAweDc2LCAweEM3LCAweDUyLCAweDE2LCAweDE4LCAweEFDLA0KKyAgICAweEYzLCAweDE3LCAweDc3LCAweDFDLCAweDY1LCAweEFELCAweDA5LCAweEYxLCAweDU4LCAweDAyLCAweDZGLCAweEE5LA0KKyAgICAweDIxLCAweDZBLCAweDAxLCAweEI3LCAweEM2LCAweEQyLCAweDBDLCAweDVBLCAweDhBLCAweEE2LCAweDc3LCAweDVDLA0KKyAgICAweEQyLCAweEQ4LCAweEEyLCAweDNFLCAweDMzLCAweDE4LCAweDg5LCAweDdGLCAweEFBLCAweDI1LCAweEU2LCAweEE5LA0KKyAgICAweDJBLCAweEMxLCAweDg3LCAweEJELCAweEY2LCAweDE3LCAweDZDLCAweDQyLCAweDA4LCAweDIxfTsNCiBjb25zdCB1aW50OF90IGdfa29LUl9Mb2NhbGVbXSA9IHsNCi0gICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NiwgMHg0RCwgMHg2QiwgMHhENCwgMHg0MCwgMHgxOCwgMHgzRSwgMHg1NywgMHhGMCwgMHgzRiwgMHgwQywgMHhDMSwgMHgxMiwgMHg4NSwgMHg3NiwgMHhCNywgMHhFQiwNCi0gICAgMHg3NywgMHg0QiwgMHgxQSwgMHgyOCwgMHg2RSwgMHg2RCwgMHg2NSwgMHg4RCwgMHg5NCwgMHhBNiwgMHg1OCwgMHhFQywgMHg0NSwgMHg2NiwgMHg5MywgMHhFOSwgMHgyNiwgMHhFRCwgMHgyNiwgMHg1MywNCi0gICAgMHgyNiwgMHgwOSwgMHg3NSwgMHg3MywgMHhBRSwgMHg1MiwgMHhGMCwgMHhFMiwgMHhBMSwgMHg4NywgMHhFQSwgMHg2RSwgMHhCMSwgMHgwNywgMHgxMSwgMHgyQSwgMHg4OCwgMHgyMiwgMHgyMiwgMHgxRSwNCi0gICAgMHgxNCwgMHg3RiwgMHg4RCwgMHg2MiwgMHg2RCwgMHg4QSwgMHg3RiwgMHhDMSwgMHhDOSwgMHhFNywgMHhFNiwgMHg2MywgMHhCMiwgMHg0RCwgMHhFRiwgMHhFRSwgMHg2MSwgMHg5OSwgMHhGNywgMHg5OSwNCi0gICAgMHhFNywgMHg3OSwgMHhGMywgMHhCRSwgMHhDRiwgMHg0QywgMHg1RSwgMHgyMiwgMHg3NCwgMHhCMSwgMHgwMiwgMHhCQiwgMHgwOCwgMHg5OCwgMHhEMCwgMHg0MCwgMHhCMywgMHhEQywgMHgyNiwgMHg3RSwNCi0gICAgMHhEQywgMHg1QSwgMHhFNiwgMHg4MCwgMHg4QSwgMHgyQywgMHg2NSwgMHg5NiwgMHhGQiwgMHgzNSwgMHgzOCwgMHgzOCwgMHhGRSwgMHgzNCwgMHhGOCwgMHhGRCwgMHhFMSwgMHhGRCwgMHhFNSwgMHhFMywNCi0gICAgMHhENywgMHg0NywgMHgzRiwgMHhGQiwgMHhERiwgMHhBRiwgMHg3MCwgMHhFMiwgMHhDNSwgMHgwQiwgMHgwMCwgMHgwOCwgMHgzRSwgMHhERiwgMHg1NCwgMHgyMSwgMHg5MSwgMHg3QiwgMHg0NiwgMHgxQiwNCi0gICAgMHg3NywgMHhBRCwgMHg0OCwgMHhEQSwgMHgyMSwgMHhBOCwgMHg4MywgMHg4OSwgMHgwRSwgMHg0RCwgMHg5RiwgMHgzNSwgMHgwNiwgMHgwNCwgMHgwMywgMHg5QiwgMHhCNiwgMHhGNiwgMHg4MCwgMHg2RSwNCi0gICAgMHg1OSwgMHg3RSwgMHgzQywgMHgxNiwgMHhDNiwgMHg2MiwgMHhDMywgMHhFQiwgMHhFRiwgMHgwOSwgMHhGNSwgMHg3MCwgMHg5RCwgMHg4MiwgMHhBRiwgMHhCMiwgMHhFMSwgMHg2QiwgMHg2QywgMHhGOCwNCi0gICAgMHgzQSwgMHgxQiwgMHhCRSwgMHhDMSwgMHg4NiwgMHg2RiwgMHhCMiwgMHhFMSwgMHg1QiwgMHg2QywgMHhGOCwgMHgzNiwgMHgxQiwgMHg5RSwgMHg2NiwgMHhDMywgMHg4RCwgMHhBOSwgMHgxMiwgMHhCQywNCi0gICAgMHhBNCwgMHhDRiwgMHg0NiwgMHhBRSwgMHg1MSwgMHgxMCwgMHhBRCwgMHgxMywgMHg5RiwgMHhEMiwgMHhCRSwgMHgwMSwgMHhEOCwgMHg2RSwgMHg5MywgMHg1OSwgMHhBRSwgMHhDMSwgMHhGRCwgMHgzNywNCi0gICAgMHhGMCwgMHgzQywgMHgwNiwgMHhBQSwgMHhCMCwgMHg5NywgMHhCQSwgMHg3NiwgMHgzNCwgMHgxMiwgMHhCRCwgMHg4MywgMHg2RiwgMHhERSwgMHhBQiwgMHgzRCwgMHhGQSwgMHgyRiwgMHhENCwgMHhGRCwNCi0gICAgMHg3MCwgMHg4OCwgMHhGNywgMHhGNywgMHg5OCwgMHhGOCwgMHhFOSwgMHg0QiwgMHgzNiwgMHhFRSwgMHhFRCwgMHhFRSwgMHgzMywgMHhGMSwgMHg5MywgMHg3NywgMHg0NywgMHg0QywgMHhGQywgMHhDRiwNCi0gICAgMHhENywgMHg1RCwgMHg3NiwgMHhGRSwgMHg2NywgMHg4NywgMHgzOSwgMHgxQywgMHgwNCwgMHgyQiwgMHg0NiwgMHgxMywgMHhCOSwgMHgzQiwgMHgxMCwgMHg3NSwgMHg1MywgMHhFQywgMHhBMywgMHhEOCwNCi0gICAgMHg0MSwgMHhCMSwgMHhGNiwgMHg2MiwgMHhENSwgMHhDNSwgMHg3QSwgMHg4QiwgMHg5NSwgMHg5NiwgMHhENywgMHg2OCwgMHgyMCwgMHhBMiwgMHhBQiwgMHgzQSwgMHgzMiwgMHhEMiwgMHgyRiwgMHg3OSwNCi0gICAgMHgwNCwgMHg4OSwgMHhERSwgMHhGRSwgMHgxQiwgMHhFRiwgMHg3MCwgMHg4NywgMHgxRSwgMHg0RSwgMHgwQywgMHgxNCwgMHhCNiwgMHg0RiwgMHhGQiwgMHhCOSwgMHg2RCwgMHgzMCwgMHgwQywgMHg1MywNCi0gICAgMHgwRiwgMHg0MSwgMHgwNCwgMHhBNiwgMHhGMiwgMHhEMywgMHg4OCwgMHg1NiwgMHhGOSwgMHhEMSwgMHhFQiwgMHhCRiwgMHgwOCwgMHhCMiwgMHhGQiwgMHg2MSwgMHg4MiwgMHg3QiwgMHgzQiwgMHgwMywNCi0gICAgMHhCQSwgMHg5NSwgMHg4MCwgMHgyMCwgMHg1OCwgMHhDNSwgMHg1QSwgMHgzQSwgMHhCNiwgMHhFQSwgMHhCOSwgMHhCOSwgMHgxNSwgMHhBMiwgMHgyQSwgMHhCNCwgMHhEMSwgMHgxMiwgMHhCNCwgMHg2RCwNCi0gICAgMHg0NCwgMHhDQywgMHhDNCwgMHhGQSwgMHgwNCwgMHg4OSwgMHg0NiwgMHhEQiwgMHhCQSwgMHhEMywgMHhFRCwgMHg3MiwgMHhFMiwgMHgyMywgMHhGQSwgMHhFMywgMHg0RiwgMHg5RSwgMHhFRSwgMHhGMCwNCi0gICAgMHg0MCwgMHhFMiwgMHhBOSwgMHhFMywgMHgzQywgMHg2OCwgMHhGMiwgMHhGNCwgMHgyOCwgMHg3OCwgMHgzMCwgMHg0RiwgMHg3RiwgMHhCRSwgMHgzNSwgMHg4OSwgMHhBQSwgMHgyQywgMHg0RCwgMHgxNywNCi0gICAgMHg5QiwgMHg5RCwgMHhEMiwgMHgzNCwgMHg5NSwgMHgzMiwgMHgxOCwgMHg0OCwgMHgwRCwgMHgxMywgMHhENCwgMHg4MCwgMHgyNCwgMHhENSwgMHg0MCwgMHhCMywgMHg1OSwgMHg0OSwgMHg2NSwgMHg2OSwNCi0gICAgMHg5OCwgMHhEOCwgMHhCRSwgMHhBRSwgMHg0QywgMHgwNSwgMHg0MCwgMHgwNiwgMHg4OSwgMHg5QywgMHhCMSwgMHg3NSwgMHgyMywgMHhFNywgMHg0QywgMHgwQSwgMHhDOSwgMHgzOCwgMHgzMywgMHgwNywNCi0gICAgMHgzNCwgMHg4RCwgMHhGNywgMHg5RSwgMHgwRiwgMHg2OCwgMHg0QiwgMHgxMiwgMHg3RiwgMHhGMiwgMHg4NSwgMHhCNiwgMHgyNiwgMHhDQiwgMHhCQywgMHhGNywgMHg3OSwgMHg5NywgMHgwNywgMHg2QiwNCi0gICAgMHg0MiwgMHgzRCwgMHgyNSwgMHgyQSwgMHhDQiwgMHgxMiwgMHgxQSwgMHg1MywgMHg5QSwgMHhBNSwgMHg1MiwgMHg4RSwgMHhDMCwgMHgxQSwgMHg5QSwgMHg2MiwgMHg0NiwgMHg5MiwgMHg2NiwgMHg2NCwNCi0gICAgMHhCOSwgMHg5MiwgMHgyNCwgMHhGMiwgMHgyNSwgMHgxNCwgMHhFNSwgMHgxNSwgMHhCRSwgMHgyNywgMHgzOSwgMHgwNywgMHhBMiwgMHhEQiwgMHhCMiwgMHg0MiwgMHhEMSwgMHhGOCwgMHgwQSwgMHgyRCwNCi0gICAgMHg0MCwgMHg3MywgMHg2MywgMHg3MywgMHhEMSwgMHhCMCwgMHhFNCwgMHhGOSwgMHhFNiwgMHhERCwgMHhFRCwgMHhENSwgMHgyNywgMHg1QSwgMHhDQiwgMHg1RCwgMHgwQiwgMHhBRCwgMHg0QywgMHg5MywNCi0gICAgMHgwMiwgMHhBNSwgMHhFOSwgMHgxOCwgMHg2RCwgMHg0NCwgMHhCMiwgMHg3RSwgMHg2NiwgMHhCMCwgMHhBOCwgMHgyOCwgMHg4QSwgMHhEMSwgMHg5NywgMHg0MCwgMHhFMSwgMHg0NCwgMHg3NywgMHhDMiwNCi0gICAgMHg3NSwgMHhBNywgMHg2QiwgMHhBRSwgMHhFQiwgMHgwQSwgMHhGNSwgMHgwQywgMHhBRiwgMHg1QywgMHhBQSwgMHgzOCwgMHg4NCwgMHgyMCwgMHg1MywgMHhFOSwgMHg3MSwgMHhFMiwgMHhBNSwgMHg0MCwNCi0gICAgMHg1QywgMHg1OSwgMHhCOCwgMHg4NSwgMHg4OCwgMHg4MiwgMHg0QywgMHgzQiwgMHg3QSwgMHhFNiwgMHg3OCwgMHg1MSwgMHhFNywgMHg5QiwgMHg1MSwgMHg2OCwgMHgyMCwgMHg2OSwgMHg2QSwgMHhEOCwNCi0gICAgMHhFNywgMHg1OCwgMHgxNiwgMHg4QSwgMHhEMiwgMHhBQiwgMHg0OCwgMHhEMSwgMHgwRCwgMHg0OCwgMHhFRiwgMHg0OSwgMHgyRCwgMHhDRSwgMHgxMiwgMHg2RSwgMHg5NywgMHgwQSwgMHgzQSwgMHgwNCwNCi0gICAgMHgzQiwgMHg1QiwgMHhCQSwgMHg3RiwgMHgyNywgMHgyNiwgMHgyQSwgMHgyQSwgMHg5MiwgMHgwRSwgMHhDNiwgMHgyQiwgMHgwQSwgMHgwQywgMHhERCwgMHg3NCwgMHgyQywgMHg0RSwgMHg5QywgMHhBQywNCi0gICAgMHg0OCwgMHg3NywgMHgxMSwgMHhDMSwgMHg5QywgMHgzOCwgMHg1NSwgMHg2MCwgMHgwRiwgMHg4RCwgMHhDOSwgMHgxQywgMHg3NiwgMHg3QywgMHgxMiwgMHgxOSwgMHg2NywgMHhCMiwgMHg2MCwgMHg3QywNCi0gICAgMHgwNywgMHg4MywgMHg4MCwgMHgxMywgMHhGRiwgMHhGRSwgMHg3OCwgMHg0QiwgMHgwNywgMHg1NCwgMHg4NiwgMHgzMSwgMHg0MiwgMHhBNSwgMHg1QiwgMHhEOCwgMHg1RiwgMHg3MCwgMHg2MiwgMHg2QiwNCi0gICAgMHg3OSwgMHhGNSwgMHgxQywgMHhCMiwgMHhGNCwgMHg0MSwgMHgxNCwgMHg0NCwgMHhDMSwgMHg4NCwgMHgyQywgMHhENCwgMHhFRCwgMHhDRiwgMHg4MSwgMHhERSwgMHgxNiwgMHg1QSwgMHg4NywgMHg0QSwNCi0gICAgMHgzQywgMHg5MCwgMHhFMywgMHgzMCwgMHhDQSwgMHgzOSwgMHhBNywgMHhFMiwgMHgzNiwgMHgwMiwgMHg1MiwgMHhDRiwgMHgzMSwgMHgzQiwgMHgxQiwgMHgxOCwgMHhDOCwgMHhCNiwgMHgwQSwgMHgyNCwNCi0gICAgMHhBRSwgMHhDRSwgMHg2NCwgMHg0QSwgMHgzRCwgMHhGQSwgMHg3NSwgMHhBOCwgMHg4MiwgMHgyNSwgMHhFQSwgMHg2NCwgMHgwOSwgMHg0MSwgMHgzNywgMHg3NSwgMHg2QywgMHg4RSwgMHgyMCwgMHhEQywNCi0gICAgMHhDMSwgMHgwRSwgMHhEMSwgMHgxMSwgMHhGMSwgMHg5RiwgMHg1MiwgMHhDMiwgMHgwOCwgMHhBQiwgMHg1OSwgMHhEMiwgMHhDRiwgMHhBNCwgMHgyQywgMHhBMiwgMHgzNiwgMHg0MSwgMHhEQiwgMHgyMywNCi0gICAgMHgyOSwgMHg3MywgMHgwNCwgMHhCNiwgMHhFOSwgMHg4QiwgMHgzOCwgMHg4QSwgMHhCMiwgMHhBMiwgMHg0MSwgMHhCRCwgMHg4NCwgMHhEMCwgMHhDMiwgMHhBRSwgMHhCMywgMHgwOSwgMHhDMSwgMHgwMiwNCi0gICAgMHhCNiwgMHgzNSwgMHg1RCwgMHhGMSwgMHg3QiwgMHg5QSwgMHg3QywgMHg3OCwgMHhBRiwgMHhENCwgMHg5QSwgMHg4OCwgMHg0QywgMHgwRCwgMHg1MCwgMHgzNCwgMHgxQywgMHg5MywgMHg5NywgMHg0NywNCi0gICAgMHgzRSwgMHg5QSwgMHg3MiwgMHgzQiwgMHg4MSwgMHhERCwgMHhGNywgMHg0NywgMHhEMiwgMHg2NCwgMHg5QywgMHhBMSwgMHgwNSwgMHg1MywgMHgyRCwgMHg3NSwgMHg5RSwgMHg0MiwgMHgzRCwgMHhGQywNCi0gICAgMHhGQywgMHgxNywgMHhGRiwgMHgwMSwgMHhEQywgMHhGMSwgMHgxOCwgMHhEMw0KLX07DQorICAgIDB4NzgsIDB4OUMsIDB4RUQsIDB4NTYsIDB4NEQsIDB4NkIsIDB4RDQsIDB4NDAsIDB4MTgsIDB4M0UsIDB4NTcsIDB4RjAsDQorICAgIDB4M0YsIDB4MEMsIDB4QzEsIDB4MTIsIDB4ODUsIDB4NzYsIDB4QjcsIDB4RUIsIDB4NzcsIDB4NEIsIDB4MUEsIDB4MjgsDQorICAgIDB4NkUsIDB4NkQsIDB4NjUsIDB4OEQsIDB4OTQsIDB4QTYsIDB4NTgsIDB4RUMsIDB4NDUsIDB4NjYsIDB4OTMsIDB4RTksDQorICAgIDB4MjYsIDB4RUQsIDB4MjYsIDB4NTMsIDB4MjYsIDB4MDksIDB4NzUsIDB4NzMsIDB4QUUsIDB4NTIsIDB4RjAsIDB4RTIsDQorICAgIDB4QTEsIDB4ODcsIDB4RUEsIDB4NkUsIDB4QjEsIDB4MDcsIDB4MTEsIDB4MkEsIDB4ODgsIDB4MjIsIDB4MjIsIDB4MUUsDQorICAgIDB4MTQsIDB4N0YsIDB4OEQsIDB4NjIsIDB4NkQsIDB4OEEsIDB4N0YsIDB4QzEsIDB4QzksIDB4RTcsIDB4RTYsIDB4NjMsDQorICAgIDB4QjIsIDB4NEQsIDB4RUYsIDB4RUUsIDB4NjEsIDB4OTksIDB4RjcsIDB4OTksIDB4RTcsIDB4NzksIDB4RjMsIDB4QkUsDQorICAgIDB4Q0YsIDB4NEMsIDB4NUUsIDB4MjIsIDB4NzQsIDB4QjEsIDB4MDIsIDB4QkIsIDB4MDgsIDB4OTgsIDB4RDAsIDB4NDAsDQorICAgIDB4QjMsIDB4REMsIDB4MjYsIDB4N0UsIDB4REMsIDB4NUEsIDB4RTYsIDB4ODAsIDB4OEEsIDB4MkMsIDB4NjUsIDB4OTYsDQorICAgIDB4RkIsIDB4MzUsIDB4MzgsIDB4MzgsIDB4RkUsIDB4MzQsIDB4RjgsIDB4RkQsIDB4RTEsIDB4RkQsIDB4RTUsIDB4RTMsDQorICAgIDB4RDcsIDB4NDcsIDB4M0YsIDB4RkIsIDB4REYsIDB4QUYsIDB4NzAsIDB4RTIsIDB4QzUsIDB4MEIsIDB4MDAsIDB4MDgsDQorICAgIDB4M0UsIDB4REYsIDB4NTQsIDB4MjEsIDB4OTEsIDB4N0IsIDB4NDYsIDB4MUIsIDB4NzcsIDB4QUQsIDB4NDgsIDB4REEsDQorICAgIDB4MjEsIDB4QTgsIDB4ODMsIDB4ODksIDB4MEUsIDB4NEQsIDB4OUYsIDB4MzUsIDB4MDYsIDB4MDQsIDB4MDMsIDB4OUIsDQorICAgIDB4QjYsIDB4RjYsIDB4ODAsIDB4NkUsIDB4NTksIDB4N0UsIDB4M0MsIDB4MTYsIDB4QzYsIDB4NjIsIDB4QzMsIDB4RUIsDQorICAgIDB4RUYsIDB4MDksIDB4RjUsIDB4NzAsIDB4OUQsIDB4ODIsIDB4QUYsIDB4QjIsIDB4RTEsIDB4NkIsIDB4NkMsIDB4RjgsDQorICAgIDB4M0EsIDB4MUIsIDB4QkUsIDB4QzEsIDB4ODYsIDB4NkYsIDB4QjIsIDB4RTEsIDB4NUIsIDB4NkMsIDB4RjgsIDB4MzYsDQorICAgIDB4MUIsIDB4OUUsIDB4NjYsIDB4QzMsIDB4OEQsIDB4QTksIDB4MTIsIDB4QkMsIDB4QTQsIDB4Q0YsIDB4NDYsIDB4QUUsDQorICAgIDB4NTEsIDB4MTAsIDB4QUQsIDB4MTMsIDB4OUYsIDB4RDIsIDB4QkUsIDB4MDEsIDB4RDgsIDB4NkUsIDB4OTMsIDB4NTksDQorICAgIDB4QUUsIDB4QzEsIDB4RkQsIDB4MzcsIDB4RjAsIDB4M0MsIDB4MDYsIDB4QUEsIDB4QjAsIDB4OTcsIDB4QkEsIDB4NzYsDQorICAgIDB4MzQsIDB4MTIsIDB4QkQsIDB4ODMsIDB4NkYsIDB4REUsIDB4QUIsIDB4M0QsIDB4RkEsIDB4MkYsIDB4RDQsIDB4RkQsDQorICAgIDB4NzAsIDB4ODgsIDB4RjcsIDB4RjcsIDB4OTgsIDB4RjgsIDB4RTksIDB4NEIsIDB4MzYsIDB4RUUsIDB4RUQsIDB4RUUsDQorICAgIDB4MzMsIDB4RjEsIDB4OTMsIDB4NzcsIDB4NDcsIDB4NEMsIDB4RkMsIDB4Q0YsIDB4RDcsIDB4NUQsIDB4NzYsIDB4RkUsDQorICAgIDB4NjcsIDB4ODcsIDB4MzksIDB4MUMsIDB4MDQsIDB4MkIsIDB4NDYsIDB4MTMsIDB4QjksIDB4M0IsIDB4MTAsIDB4NzUsDQorICAgIDB4NTMsIDB4RUMsIDB4QTMsIDB4RDgsIDB4NDEsIDB4QjEsIDB4RjYsIDB4NjIsIDB4RDUsIDB4QzUsIDB4N0EsIDB4OEIsDQorICAgIDB4OTUsIDB4OTYsIDB4RDcsIDB4NjgsIDB4MjAsIDB4QTIsIDB4QUIsIDB4M0EsIDB4MzIsIDB4RDIsIDB4MkYsIDB4NzksDQorICAgIDB4MDQsIDB4ODksIDB4REUsIDB4RkUsIDB4MUIsIDB4RUYsIDB4NzAsIDB4ODcsIDB4MUUsIDB4NEUsIDB4MEMsIDB4MTQsDQorICAgIDB4QjYsIDB4NEYsIDB4RkIsIDB4QjksIDB4NkQsIDB4MzAsIDB4MEMsIDB4NTMsIDB4MEYsIDB4NDEsIDB4MDQsIDB4QTYsDQorICAgIDB4RjIsIDB4RDMsIDB4ODgsIDB4NTYsIDB4RjksIDB4RDEsIDB4RUIsIDB4QkYsIDB4MDgsIDB4QjIsIDB4RkIsIDB4NjEsDQorICAgIDB4ODIsIDB4N0IsIDB4M0IsIDB4MDMsIDB4QkEsIDB4OTUsIDB4ODAsIDB4MjAsIDB4NTgsIDB4QzUsIDB4NUEsIDB4M0EsDQorICAgIDB4QjYsIDB4RUEsIDB4QjksIDB4QjksIDB4MTUsIDB4QTIsIDB4MkEsIDB4QjQsIDB4RDEsIDB4MTIsIDB4QjQsIDB4NkQsDQorICAgIDB4NDQsIDB4Q0MsIDB4QzQsIDB4RkEsIDB4MDQsIDB4ODksIDB4NDYsIDB4REIsIDB4QkEsIDB4RDMsIDB4RUQsIDB4NzIsDQorICAgIDB4RTIsIDB4MjMsIDB4RkEsIDB4RTMsIDB4NEYsIDB4OUUsIDB4RUUsIDB4RjAsIDB4NDAsIDB4RTIsIDB4QTksIDB4RTMsDQorICAgIDB4M0MsIDB4NjgsIDB4RjIsIDB4RjQsIDB4MjgsIDB4NzgsIDB4MzAsIDB4NEYsIDB4N0YsIDB4QkUsIDB4MzUsIDB4ODksDQorICAgIDB4QUEsIDB4MkMsIDB4NEQsIDB4MTcsIDB4OUIsIDB4OUQsIDB4RDIsIDB4MzQsIDB4OTUsIDB4MzIsIDB4MTgsIDB4NDgsDQorICAgIDB4MEQsIDB4MTMsIDB4RDQsIDB4ODAsIDB4MjQsIDB4RDUsIDB4NDAsIDB4QjMsIDB4NTksIDB4NDksIDB4NjUsIDB4NjksDQorICAgIDB4OTgsIDB4RDgsIDB4QkUsIDB4QUUsIDB4NEMsIDB4MDUsIDB4NDAsIDB4MDYsIDB4ODksIDB4OUMsIDB4QjEsIDB4NzUsDQorICAgIDB4MjMsIDB4RTcsIDB4NEMsIDB4MEEsIDB4QzksIDB4MzgsIDB4MzMsIDB4MDcsIDB4MzQsIDB4OEQsIDB4RjcsIDB4OUUsDQorICAgIDB4MEYsIDB4NjgsIDB4NEIsIDB4MTIsIDB4N0YsIDB4RjIsIDB4ODUsIDB4QjYsIDB4MjYsIDB4Q0IsIDB4QkMsIDB4RjcsDQorICAgIDB4NzksIDB4OTcsIDB4MDcsIDB4NkIsIDB4NDIsIDB4M0QsIDB4MjUsIDB4MkEsIDB4Q0IsIDB4MTIsIDB4MUEsIDB4NTMsDQorICAgIDB4OUEsIDB4QTUsIDB4NTIsIDB4OEUsIDB4QzAsIDB4MUEsIDB4OUEsIDB4NjIsIDB4NDYsIDB4OTIsIDB4NjYsIDB4NjQsDQorICAgIDB4QjksIDB4OTIsIDB4MjQsIDB4RjIsIDB4MjUsIDB4MTQsIDB4RTUsIDB4MTUsIDB4QkUsIDB4MjcsIDB4MzksIDB4MDcsDQorICAgIDB4QTIsIDB4REIsIDB4QjIsIDB4NDIsIDB4RDEsIDB4RjgsIDB4MEEsIDB4MkQsIDB4NDAsIDB4NzMsIDB4NjMsIDB4NzMsDQorICAgIDB4RDEsIDB4QjAsIDB4RTQsIDB4RjksIDB4RTYsIDB4REQsIDB4RUQsIDB4RDUsIDB4MjcsIDB4NUEsIDB4Q0IsIDB4NUQsDQorICAgIDB4MEIsIDB4QUQsIDB4NEMsIDB4OTMsIDB4MDIsIDB4QTUsIDB4RTksIDB4MTgsIDB4NkQsIDB4NDQsIDB4QjIsIDB4N0UsDQorICAgIDB4NjYsIDB4QjAsIDB4QTgsIDB4MjgsIDB4OEEsIDB4RDEsIDB4OTcsIDB4NDAsIDB4RTEsIDB4NDQsIDB4NzcsIDB4QzIsDQorICAgIDB4NzUsIDB4QTcsIDB4NkIsIDB4QUUsIDB4RUIsIDB4MEEsIDB4RjUsIDB4MEMsIDB4QUYsIDB4NUMsIDB4QUEsIDB4MzgsDQorICAgIDB4ODQsIDB4MjAsIDB4NTMsIDB4RTksIDB4NzEsIDB4RTIsIDB4QTUsIDB4NDAsIDB4NUMsIDB4NTksIDB4QjgsIDB4ODUsDQorICAgIDB4ODgsIDB4ODIsIDB4NEMsIDB4M0IsIDB4N0EsIDB4RTYsIDB4NzgsIDB4NTEsIDB4RTcsIDB4OUIsIDB4NTEsIDB4NjgsDQorICAgIDB4MjAsIDB4NjksIDB4NkEsIDB4RDgsIDB4RTcsIDB4NTgsIDB4MTYsIDB4OEEsIDB4RDIsIDB4QUIsIDB4NDgsIDB4RDEsDQorICAgIDB4MEQsIDB4NDgsIDB4RUYsIDB4NDksIDB4MkQsIDB4Q0UsIDB4MTIsIDB4NkUsIDB4OTcsIDB4MEEsIDB4M0EsIDB4MDQsDQorICAgIDB4M0IsIDB4NUIsIDB4QkEsIDB4N0YsIDB4MjcsIDB4MjYsIDB4MkEsIDB4MkEsIDB4OTIsIDB4MEUsIDB4QzYsIDB4MkIsDQorICAgIDB4MEEsIDB4MEMsIDB4REQsIDB4NzQsIDB4MkMsIDB4NEUsIDB4OUMsIDB4QUMsIDB4NDgsIDB4NzcsIDB4MTEsIDB4QzEsDQorICAgIDB4OUMsIDB4MzgsIDB4NTUsIDB4NjAsIDB4MEYsIDB4OEQsIDB4QzksIDB4MUMsIDB4NzYsIDB4N0MsIDB4MTIsIDB4MTksDQorICAgIDB4NjcsIDB4QjIsIDB4NjAsIDB4N0MsIDB4MDcsIDB4ODMsIDB4ODAsIDB4MTMsIDB4RkYsIDB4RkUsIDB4NzgsIDB4NEIsDQorICAgIDB4MDcsIDB4NTQsIDB4ODYsIDB4MzEsIDB4NDIsIDB4QTUsIDB4NUIsIDB4RDgsIDB4NUYsIDB4NzAsIDB4NjIsIDB4NkIsDQorICAgIDB4NzksIDB4RjUsIDB4MUMsIDB4QjIsIDB4RjQsIDB4NDEsIDB4MTQsIDB4NDQsIDB4QzEsIDB4ODQsIDB4MkMsIDB4RDQsDQorICAgIDB4RUQsIDB4Q0YsIDB4ODEsIDB4REUsIDB4MTYsIDB4NUEsIDB4ODcsIDB4NEEsIDB4M0MsIDB4OTAsIDB4RTMsIDB4MzAsDQorICAgIDB4Q0EsIDB4MzksIDB4QTcsIDB4RTIsIDB4MzYsIDB4MDIsIDB4NTIsIDB4Q0YsIDB4MzEsIDB4M0IsIDB4MUIsIDB4MTgsDQorICAgIDB4QzgsIDB4QjYsIDB4MEEsIDB4MjQsIDB4QUUsIDB4Q0UsIDB4NjQsIDB4NEEsIDB4M0QsIDB4RkEsIDB4NzUsIDB4QTgsDQorICAgIDB4ODIsIDB4MjUsIDB4RUEsIDB4NjQsIDB4MDksIDB4NDEsIDB4MzcsIDB4NzUsIDB4NkMsIDB4OEUsIDB4MjAsIDB4REMsDQorICAgIDB4QzEsIDB4MEUsIDB4RDEsIDB4MTEsIDB4RjEsIDB4OUYsIDB4NTIsIDB4QzIsIDB4MDgsIDB4QUIsIDB4NTksIDB4RDIsDQorICAgIDB4Q0YsIDB4QTQsIDB4MkMsIDB4QTIsIDB4MzYsIDB4NDEsIDB4REIsIDB4MjMsIDB4MjksIDB4NzMsIDB4MDQsIDB4QjYsDQorICAgIDB4RTksIDB4OEIsIDB4MzgsIDB4OEEsIDB4QjIsIDB4QTIsIDB4NDEsIDB4QkQsIDB4ODQsIDB4RDAsIDB4QzIsIDB4QUUsDQorICAgIDB4QjMsIDB4MDksIDB4QzEsIDB4MDIsIDB4QjYsIDB4MzUsIDB4NUQsIDB4RjEsIDB4N0IsIDB4OUEsIDB4N0MsIDB4NzgsDQorICAgIDB4QUYsIDB4RDQsIDB4OUEsIDB4ODgsIDB4NEMsIDB4MEQsIDB4NTAsIDB4MzQsIDB4MUMsIDB4OTMsIDB4OTcsIDB4NDcsDQorICAgIDB4M0UsIDB4OUEsIDB4NzIsIDB4M0IsIDB4ODEsIDB4REQsIDB4RjcsIDB4NDcsIDB4RDIsIDB4NjQsIDB4OUMsIDB4QTEsDQorICAgIDB4MDUsIDB4NTMsIDB4MkQsIDB4NzUsIDB4OUUsIDB4NDIsIDB4M0QsIDB4RkMsIDB4RkMsIDB4MTcsIDB4RkYsIDB4MDEsDQorICAgIDB4REMsIDB4RjEsIDB4MTgsIDB4RDN9Ow0KIGNvbnN0IHVpbnQ4X3QgZ19lc0VTX0xvY2FsZVtdID0gew0KLSAgICAweDc4LCAweDlDLCAweDlELCAweDU2LCAweENGLCAweDZCLCAweEQ0LCAweDQwLCAweDE0LCAweEJFLCAweDBCLCAweEZFLCAweDBGLCAweDIxLCAweDU4LCAweDU2LCAweEExLCAweERELCAweEQxLCAweDYzLA0KLSAgICAweENCLCAweDM2LCAweDUwLCAweERBLCAweERBLCAweDk1LCAweDFBLCAweDU5LCAweDlBLCAweEFBLCAweEQ4LCAweDhCLCAweDRDLCAweDkyLCAweEU5LCAweEVFLCAweEI0LCAweEM5LCAweENDLCAweDMyLA0KLSAgICAweDQ5LCAweDJDLCAweDlCLCAweEEzLCAweEUwLCAweDQxLCAweDEwLCAweDBCLCAweERFLCAweDhBLCAweDI3LCAweDBGLCAweDFFLCAweDA0LCAweDhCLCAweDc3LCAweDUxLCAweDNDLCAweEY0LCAweDNGLA0KLSAgICAweDExLCAweDZBLCAweEVCLCAweEM5LCAweDdGLCAweEMxLCAweDM3LCAweDlCLCAweDQ5LCAweDM2LCAweDNGLCAweDY2LCAweEQ3LCAweDYwLCAweDRFLCAweEYzLCAweEJFLCAweEY3LCAweDdELCAweDJGLA0KLSAgICAweEVGLCAweDdELCAweDkzLCAweDRDLCAweEQyLCAweDBCLCAweEI4LCAweDg3LCAweDAzLCAweDYyLCAweDMwLCAweDFDLCAweDkyLCAweDc1LCAweDkzLCAweDQ0LCAweENGLCAweEI3LCAweDFELCAweEQzLA0KLSAgICAweEYwLCAweDQ5LCAweEU0LCAweEFELCAweDlCLCAweEQ3LCAweDFGLCAweDdGLCAweDVDLCAweDlELCAweDlFLCAweDVGLCAweEJELCAweDNFLCAweEJCLCAweEZFLCAweDcyLCAweDdFLCAweEJCLCAweDA4LA0KLSAgICAweEZFLCAweDdDLCAweDdCLCAweDczLCAweEY5LCAweEZFLCAweEZCLCAweEVGLCAweEIzLCAweDU3LCAweEJGLCAweERFLCAweEJFLCAweEJCLCAweEZDLCAweDdBLCAweDdBLCAweEM3LCAweEI0LCAweDdBLA0KLSAgICAweEIyLCAweDAwLCAweEYzLCAweEIxLCAweDcwLCAweDI2LCAweEExLCAweENCLCAweDgzLCAweDQ4LCAweEQ1LCAweDFBLCAweDBBLCAweDMyLCAweEU0LCAweDgyLCAweDYyLCAweDA2LCAweDhDLCAweDkwLA0KLSAgICAweEIzLCAweDc4LCAweEY0LCAweDA4LCAweEUwLCAweDQ4LCAweEFELCAweDJELCAweEMyLCAweDg4LCAweEUwLCAweDNELCAweDk0LCAweDA1LCAweDM3LCAweDZGLCAweDI4LCAweEY0LCAweDkwLCAweEI4LA0KLSAgICAweDQyLCAweDg3LCAweDg3LCAweDU4LCAweEE0LCAweDRELCAweDE0LCAweEJCLCAweDgyLCAweDA2LCAweDFBLCAweEVFLCAweEE0LCAweDQ5LCAweDNELCAweDRBLCAweDE4LCAweEQ1LCAweEExLCAweDgxLA0KLSAgICAweDA2LCAweEM1LCAweDQzLCAweDFFLCAweEM1LCAweDRELCAweDM4LCAweDIyLCAweEUzLCAweDk4LCAweDkyLCAweDEwLCAweDFBLCAweDZDLCAweEE0LCAweEI4LCAweDE3LCAweDI3LCAweDNBLCAweDlDLA0KLSAgICAweEYxLCAweDE3LCAweDczLCAweDE0LCAweDNFLCAweEY1LCAweDFBLCAweDE5LCAweDU0LCAweDcyLCAweDI5LCAweDI3LCAweDRFLCAweDIzLCAweDAzLCAweEJCLCAweEFFLCAweDU4LCAweDM3LCAweEVGLA0KLSAgICAweDk5LCAweDI1LCAweEYzLCAweDc0LCAweEQ2LCAweEU5LCAweDZDLCAweEQzLCAweDk5LCAweEE2LCAweEIzLCAweDRDLCAweEU3LCAweDk4LCAweENFLCAweDJGLCAweDlELCAweDVCLCAweDNBLCAweEFCLA0KLSAgICAweDc0LCAweDFFLCAweEU5LCAweEZDLCAweEQxLCAweDM5LCAweDMzLCAweERGLCAweDEzLCAweDFGLCAweDRGLCAweEQ0LCAweDUzLCAweDA0LCAweDJCLCAweENCLCAweEU3LCAweDIxLCAweDY1LCAweEYyLA0KLSAgICAweEY2LCAweDMyLCAweEM4LCAweEIyLCAweDU2LCAweDkwLCAweDMwLCAweDEyLCAweDU1LCAweDEwLCAweDMwLCAweDIxLCAweEFFLCAweDQzLCAweEY0LCAweEUyLCAweDkzLCAweEYwLCAweDc4LCAweDUwLA0KLSAgICAweDgzLCAweDhGLCAweDEyLCAweEYyLCAweEEyLCAweDA2LCAweEMxLCAweEZFLCAweDg5LCAweDdBLCAweEMxLCAweEU4LCAweEUyLCAweDgzLCAweDhCLCAweEZELCAweEQ5LCAweDZELCAweDUxLCAweEQxLA0KLSAgICAweDU1LCAweEE5LCAweEMzLCAweEQyLCAweDlFLCAweEE5LCAweDU2LCAweEVCLCAweDZELCAweEQ2LCAweDlCLCAweDZDLCAweDc0LCAweDU4LCAweEVGLCAweEFELCAweERFLCAweDU4LCAweEEzLCAweDI5LA0KLSAgICAweDdELCAweDQ3LCAweDIxLCAweDExLCAweEQ0LCAweDg3LCAweDg3LCAweDJELCAweDdGLCAweEZELCAweDU0LCAweDY4LCAweDZELCAweEQ4LCAweEUwLCAweDZFLCAweDFFLCAweDk0LCAweDc4LCAweEQ2LA0KLSAgICAweEEwLCAweDk2LCAweDQwLCAweEQ1LCAweDBBLCAweDgwLCAweDEwLCAweDgxLCAweDU1LCAweDM1LCAweDU4LCAweDU5LCAweEI4LCAweEJCLCAweEQ5LCAweEVELCAweDIxLCAweEI5LCAweENBLCAweDUyLA0KLSAgICAweDk2LCAweDVGLCAweDA2LCAweDUwLCAweDQxLCAweDk2LCAweDQxLCAweEVELCAweEE4LCAweEM4LCAweEJBLCAweDhGLCAweEM5LCAweDAwLCAweEM3LCAweDMxLCAweDE4LCAweDNELCAweERELCAweEQ3LA0KLSAgICAweDIyLCAweDUyLCAweEU3LCAweEM4LCAweDYxLCAweDEyLCAweDA0LCAweEE2LCAweEI1LCAweDBELCAweDk3LCAweEIxLCAweEQ1LCAweDgxLCAweEEzLCAweEM5LCAweEU4LCAweEQ4LCAweDcwLCAweDY1LA0KLSAgICAweEFCLCAweDY3LCAweDcwLCAweEM5LCAweDY5LCAweDBCLCAweDRELCAweEFELCAweEEwLCAweDJBLCAweDExLCAweDcwLCAweDM2LCAweDM0LCAweEFELCAweEZGLCAweDU1LCAweDg3LCAweEM0LCAweDA3LA0KLSAgICAweEYxLCAweDE2LCAweEIyLCAweDZELCAweEQ0LCAweDUyLCAweDExLCAweDhELCAweEI4LCAweDg4LCAweDY3LCAweDlBLCAweDg2LCAweDAyLCAweDU1LCAweDY2LCAweDA2LCAweDIwLCAweEE2LCAweDYxLA0KLSAgICAweEM5LCAweDgzLCAweDUyLCAweDU0LCAweEYxLCAweEEwLCAweERGLCAweEVGLCAweEY0LCAweEExLCAweEZELCAweDBFLCAweDVDLCAweDBFLCAweDlDLCAweEQyLCAweDA3LCAweDNELCAweDU0LCAweDYyLA0KLSAgICAweEQ2LCAweENBLCAweDU0LCAweDI2LCAweEVGLCAweEY3LCAweEQ3LCAweDZDLCAweDdCLCAweENELCAweDcxLCAweDVBLCAweDQ5LCAweEE2LCAweEUzLCAweDJBLCAweDQxLCAweDBCLCAweEJBLCAweDlBLA0KLSAgICAweDU1LCAweDBBLCAweDFBLCAweDZDLCAweDU0LCAweDk5LCAweDRCLCAweDU5LCAweEI1LCAweDBGLCAweDU4LCAweEJFLCAweEZELCAweDNCLCAweDg5LCAweDFELCAweDFGLCAweDhGLCAweEMyLCAweEM4LA0KLSAgICAweEQ5LCAweERFLCAweEJBLCAweDdGLCAweEYyLCAweDE0LCAweDhGLCAweDc2LCAweEQzLCAweDgzLCAweENDLCAweDlDLCAweDMyLCAweDA5LCAweDc0LCAweDJDLCAweDA5LCAweDVELCAweDIyLCAweDY2LA0KLSAgICAweDBFLCAweDU1LCAweDYyLCAweEQ1LCAweDA4LCAweDYwLCAweEYwLCAweDlDLCAweDdBLCAweEE2LCAweDk1LCAweDJFLCAweEE3LCAweEU5LCAweDZBLCAweDM3LCAweDRELCAweEQzLCAweDFFLCAweEFBLA0KLSAgICAweEYwLCAweDFBLCAweDg1LCAweDk0LCAweEQwLCAweDRCLCAweDg0LCAweDIwLCAweENDLCAweDlCLCAweEU0LCAweENBLCAweEQ1LCAweDU1LCAweEUzLCAweDU2LCAweDRCLCAweEU5LCAweDk4LCAweDA4LA0KLSAgICAweDhGLCAweEIwLCAweDU4LCAweDI5LCAweDk3LCAweDM0LCAweDJBLCAweDU0LCAweDZCLCAweEJELCAweDI4LCAweDk0LCAweDRGLCAweDU3LCAweDA5LCAweDU1LCAweDU5LCAweDlGLCAweDc4LCAweDM0LA0KLSAgICAweEM0LCAweEIwLCAweEUzLCAweENCLCAweEI5LCAweDNFLCAweDRCLCAweEQ3LCAweEQ1LCAweEM1LCAweDk3LCAweDk2LCAweDI3LCAweDYzLCAweDJBLCAweDM3LCAweEJBLCAweERCLCAweDhBLCAweDVGLA0KLSAgICAweDc0LCAweEJELCAweEQ0LCAweDhBLCAweDBFLCAweDg3LCAweDZDLCAweDEyLCAweDk5LCAweEQ2LCAweDRBLCAweDJCLCAweDcyLCAweDBBLCAweDlGLCAweDZGLCAweEQzLCAweEJBLCAweERCLCAweEU0LA0KLSAgICAweEEyLCAweEVBLCAweEQ4LCAweDgwLCAweEU0LCAweEJFLCAweDE3LCAweDRFLCAweDU0LCAweDgxLCAweEZDLCAweEY5LCAweDlBLCAweDA2LCAweEE2LCAweEY1LCAweEYzLCAweEU1LCAweDY3LCAweDM4LA0KLSAgICAweDNFLCAweDJBLCAweDhDLCAweDY2LCAweDExLCAweEE1LCAweEExLCAweDExLCAweDk3LCAweDBCLCAweDM4LCAweDM1LCAweDFFLCAweEVGLCAweEI1LCAweDE2LCAweDk1LCAweDRELCAweDZGLCAweDRBLA0KLSAgICAweDUwLCAweEJELCAweDVCLCAweEY5LCAweDMyLCAweDRDLCAweEM2LCAweEU0LCAweDEwLCAweDdCLCAweEYyLCAweDFDLCAweENDLCAweDk3LCAweEFBLCAweDk2LCAweDNELCAweDgxLCAweDFGLCAweDFGLA0KLSAgICAweERGLCAweDE4LCAweDgwLCAweDE3LCAweEE4LCAweENDLCAweENDLCAweEQzLCAweDE0LCAweEZFLCAweDQ2LCAweEQ4LCAweERDLCAweEY0LCAweDI2LCAweDRGLCAweDA0LCAweDdDLCAweDc3LCAweDBDLA0KLSAgICAweDI3LCAweEY2LCAweEI1LCAweEY5LCAweDBELCAweDlGLCAweEJCLCAweEM0LCAweDE4LCAweEQwLCAweDdGLCAweDEwLCAweEZBLCAweEYyLCAweDY3LCAweEVBLCAweDY0LCAweDAxLCAweDYxLCAweDQzLA0KLSAgICAweDYwLCAweDE3LCAweDVFLCAweDk4LCAweEY5LCAweDg0LCAweEZELCAweDExLCAweEE2LCAweERBLCAweEY0LCAweDJFLCAweDRGLCAweDkzLCAweDYzLCAweDZDLCAweEVDLCAweEYwLCAweDc4LCAweDQ0LA0KLSAgICAweDNELCAweDM5LCAweEM3LCAweENBLCAweDkzLCAweDA3LCAweDg2LCAweEJELCAweDg4LCAweDBBLCAweDIzLCAweDdCLCAweDIzLCAweDlFLCAweDUzLCAweEY3LCAweDE2LCAweERDLCAweDE0LCAweDk4LA0KLSAgICAweDQzLCAweDM5LCAweDk5LCAweEYxLCAweDcwLCAweDAxLCAweEM5LCAweEUxLCAweDJELCAweDQ4LCAweEY2LCAweDI0LCAweDYxLCAweEMzLCAweDIzLCAweDNFLCAweEU1LCAweEE5LCAweEU2LCAweEQwLA0KLSAgICAweDZDLCAweENGLCAweDY0LCAweDk0LCAweEZELCAweEZDLCAweEMyLCAweEYyLCAweDJGLCAweDdDLCAweERDLCAweENDLCAweDJGLA0KKyAgICAweDc4LCAweDlDLCAweDlELCAweDU2LCAweENGLCAweDZCLCAweEQ0LCAweDQwLCAweDE0LCAweEJFLCAweDBCLCAweEZFLA0KKyAgICAweDBGLCAweDIxLCAweDU4LCAweDU2LCAweEExLCAweERELCAweEQxLCAweDYzLCAweENCLCAweDM2LCAweDUwLCAweERBLA0KKyAgICAweERBLCAweDk1LCAweDFBLCAweDU5LCAweDlBLCAweEFBLCAweEQ4LCAweDhCLCAweDRDLCAweDkyLCAweEU5LCAweEVFLA0KKyAgICAweEI0LCAweEM5LCAweENDLCAweDMyLCAweDQ5LCAweDJDLCAweDlCLCAweEEzLCAweEUwLCAweDQxLCAweDEwLCAweDBCLA0KKyAgICAweERFLCAweDhBLCAweDI3LCAweDBGLCAweDFFLCAweDA0LCAweDhCLCAweDc3LCAweDUxLCAweDNDLCAweEY0LCAweDNGLA0KKyAgICAweDExLCAweDZBLCAweEVCLCAweEM5LCAweDdGLCAweEMxLCAweDM3LCAweDlCLCAweDQ5LCAweDM2LCAweDNGLCAweDY2LA0KKyAgICAweEQ3LCAweDYwLCAweDRFLCAweEYzLCAweEJFLCAweEY3LCAweDdELCAweDJGLCAweEVGLCAweDdELCAweDkzLCAweDRDLA0KKyAgICAweEQyLCAweDBCLCAweEI4LCAweDg3LCAweDAzLCAweDYyLCAweDMwLCAweDFDLCAweDkyLCAweDc1LCAweDkzLCAweDQ0LA0KKyAgICAweENGLCAweEI3LCAweDFELCAweEQzLCAweEYwLCAweDQ5LCAweEU0LCAweEFELCAweDlCLCAweEQ3LCAweDFGLCAweDdGLA0KKyAgICAweDVDLCAweDlELCAweDlFLCAweDVGLCAweEJELCAweDNFLCAweEJCLCAweEZFLCAweDcyLCAweDdFLCAweEJCLCAweDA4LA0KKyAgICAweEZFLCAweDdDLCAweDdCLCAweDczLCAweEY5LCAweEZFLCAweEZCLCAweEVGLCAweEIzLCAweDU3LCAweEJGLCAweERFLA0KKyAgICAweEJFLCAweEJCLCAweEZDLCAweDdBLCAweDdBLCAweEM3LCAweEI0LCAweDdBLCAweEIyLCAweDAwLCAweEYzLCAweEIxLA0KKyAgICAweDcwLCAweDI2LCAweEExLCAweENCLCAweDgzLCAweDQ4LCAweEQ1LCAweDFBLCAweDBBLCAweDMyLCAweEU0LCAweDgyLA0KKyAgICAweDYyLCAweDA2LCAweDhDLCAweDkwLCAweEIzLCAweDc4LCAweEY0LCAweDA4LCAweEUwLCAweDQ4LCAweEFELCAweDJELA0KKyAgICAweEMyLCAweDg4LCAweEUwLCAweDNELCAweDk0LCAweDA1LCAweDM3LCAweDZGLCAweDI4LCAweEY0LCAweDkwLCAweEI4LA0KKyAgICAweDQyLCAweDg3LCAweDg3LCAweDU4LCAweEE0LCAweDRELCAweDE0LCAweEJCLCAweDgyLCAweDA2LCAweDFBLCAweEVFLA0KKyAgICAweEE0LCAweDQ5LCAweDNELCAweDRBLCAweDE4LCAweEQ1LCAweEExLCAweDgxLCAweDA2LCAweEM1LCAweDQzLCAweDFFLA0KKyAgICAweEM1LCAweDRELCAweDM4LCAweDIyLCAweEUzLCAweDk4LCAweDkyLCAweDEwLCAweDFBLCAweDZDLCAweEE0LCAweEI4LA0KKyAgICAweDE3LCAweDI3LCAweDNBLCAweDlDLCAweEYxLCAweDE3LCAweDczLCAweDE0LCAweDNFLCAweEY1LCAweDFBLCAweDE5LA0KKyAgICAweDU0LCAweDcyLCAweDI5LCAweDI3LCAweDRFLCAweDIzLCAweDAzLCAweEJCLCAweEFFLCAweDU4LCAweDM3LCAweEVGLA0KKyAgICAweDk5LCAweDI1LCAweEYzLCAweDc0LCAweEQ2LCAweEU5LCAweDZDLCAweEQzLCAweDk5LCAweEE2LCAweEIzLCAweDRDLA0KKyAgICAweEU3LCAweDk4LCAweENFLCAweDJGLCAweDlELCAweDVCLCAweDNBLCAweEFCLCAweDc0LCAweDFFLCAweEU5LCAweEZDLA0KKyAgICAweEQxLCAweDM5LCAweDMzLCAweERGLCAweDEzLCAweDFGLCAweDRGLCAweEQ0LCAweDUzLCAweDA0LCAweDJCLCAweENCLA0KKyAgICAweEU3LCAweDIxLCAweDY1LCAweEYyLCAweEY2LCAweDMyLCAweEM4LCAweEIyLCAweDU2LCAweDkwLCAweDMwLCAweDEyLA0KKyAgICAweDU1LCAweDEwLCAweDMwLCAweDIxLCAweEFFLCAweDQzLCAweEY0LCAweEUyLCAweDkzLCAweEYwLCAweDc4LCAweDUwLA0KKyAgICAweDgzLCAweDhGLCAweDEyLCAweEYyLCAweEEyLCAweDA2LCAweEMxLCAweEZFLCAweDg5LCAweDdBLCAweEMxLCAweEU4LA0KKyAgICAweEUyLCAweDgzLCAweDhCLCAweEZELCAweEQ5LCAweDZELCAweDUxLCAweEQxLCAweDU1LCAweEE5LCAweEMzLCAweEQyLA0KKyAgICAweDlFLCAweEE5LCAweDU2LCAweEVCLCAweDZELCAweEQ2LCAweDlCLCAweDZDLCAweDc0LCAweDU4LCAweEVGLCAweEFELA0KKyAgICAweERFLCAweDU4LCAweEEzLCAweDI5LCAweDdELCAweDQ3LCAweDIxLCAweDExLCAweEQ0LCAweDg3LCAweDg3LCAweDJELA0KKyAgICAweDdGLCAweEZELCAweDU0LCAweDY4LCAweDZELCAweEQ4LCAweEUwLCAweDZFLCAweDFFLCAweDk0LCAweDc4LCAweEQ2LA0KKyAgICAweEEwLCAweDk2LCAweDQwLCAweEQ1LCAweDBBLCAweDgwLCAweDEwLCAweDgxLCAweDU1LCAweDM1LCAweDU4LCAweDU5LA0KKyAgICAweEI4LCAweEJCLCAweEQ5LCAweEVELCAweDIxLCAweEI5LCAweENBLCAweDUyLCAweDk2LCAweDVGLCAweDA2LCAweDUwLA0KKyAgICAweDQxLCAweDk2LCAweDQxLCAweEVELCAweEE4LCAweEM4LCAweEJBLCAweDhGLCAweEM5LCAweDAwLCAweEM3LCAweDMxLA0KKyAgICAweDE4LCAweDNELCAweERELCAweEQ3LCAweDIyLCAweDUyLCAweEU3LCAweEM4LCAweDYxLCAweDEyLCAweDA0LCAweEE2LA0KKyAgICAweEI1LCAweDBELCAweDk3LCAweEIxLCAweEQ1LCAweDgxLCAweEEzLCAweEM5LCAweEU4LCAweEQ4LCAweDcwLCAweDY1LA0KKyAgICAweEFCLCAweDY3LCAweDcwLCAweEM5LCAweDY5LCAweDBCLCAweDRELCAweEFELCAweEEwLCAweDJBLCAweDExLCAweDcwLA0KKyAgICAweDM2LCAweDM0LCAweEFELCAweEZGLCAweDU1LCAweDg3LCAweEM0LCAweDA3LCAweEYxLCAweDE2LCAweEIyLCAweDZELA0KKyAgICAweEQ0LCAweDUyLCAweDExLCAweDhELCAweEI4LCAweDg4LCAweDY3LCAweDlBLCAweDg2LCAweDAyLCAweDU1LCAweDY2LA0KKyAgICAweDA2LCAweDIwLCAweEE2LCAweDYxLCAweEM5LCAweDgzLCAweDUyLCAweDU0LCAweEYxLCAweEEwLCAweERGLCAweEVGLA0KKyAgICAweEY0LCAweEExLCAweEZELCAweDBFLCAweDVDLCAweDBFLCAweDlDLCAweEQyLCAweDA3LCAweDNELCAweDU0LCAweDYyLA0KKyAgICAweEQ2LCAweENBLCAweDU0LCAweDI2LCAweEVGLCAweEY3LCAweEQ3LCAweDZDLCAweDdCLCAweENELCAweDcxLCAweDVBLA0KKyAgICAweDQ5LCAweEE2LCAweEUzLCAweDJBLCAweDQxLCAweDBCLCAweEJBLCAweDlBLCAweDU1LCAweDBBLCAweDFBLCAweDZDLA0KKyAgICAweDU0LCAweDk5LCAweDRCLCAweDU5LCAweEI1LCAweDBGLCAweDU4LCAweEJFLCAweEZELCAweDNCLCAweDg5LCAweDFELA0KKyAgICAweDFGLCAweDhGLCAweEMyLCAweEM4LCAweEQ5LCAweERFLCAweEJBLCAweDdGLCAweEYyLCAweDE0LCAweDhGLCAweDc2LA0KKyAgICAweEQzLCAweDgzLCAweENDLCAweDlDLCAweDMyLCAweDA5LCAweDc0LCAweDJDLCAweDA5LCAweDVELCAweDIyLCAweDY2LA0KKyAgICAweDBFLCAweDU1LCAweDYyLCAweEQ1LCAweDA4LCAweDYwLCAweEYwLCAweDlDLCAweDdBLCAweEE2LCAweDk1LCAweDJFLA0KKyAgICAweEE3LCAweEU5LCAweDZBLCAweDM3LCAweDRELCAweEQzLCAweDFFLCAweEFBLCAweEYwLCAweDFBLCAweDg1LCAweDk0LA0KKyAgICAweEQwLCAweDRCLCAweDg0LCAweDIwLCAweENDLCAweDlCLCAweEU0LCAweENBLCAweEQ1LCAweDU1LCAweEUzLCAweDU2LA0KKyAgICAweDRCLCAweEU5LCAweDk4LCAweDA4LCAweDhGLCAweEIwLCAweDU4LCAweDI5LCAweDk3LCAweDM0LCAweDJBLCAweDU0LA0KKyAgICAweDZCLCAweEJELCAweDI4LCAweDk0LCAweDRGLCAweDU3LCAweDA5LCAweDU1LCAweDU5LCAweDlGLCAweDc4LCAweDM0LA0KKyAgICAweEM0LCAweEIwLCAweEUzLCAweENCLCAweEI5LCAweDNFLCAweDRCLCAweEQ3LCAweEQ1LCAweEM1LCAweDk3LCAweDk2LA0KKyAgICAweDI3LCAweDYzLCAweDJBLCAweDM3LCAweEJBLCAweERCLCAweDhBLCAweDVGLCAweDc0LCAweEJELCAweEQ0LCAweDhBLA0KKyAgICAweDBFLCAweDg3LCAweDZDLCAweDEyLCAweDk5LCAweEQ2LCAweDRBLCAweDJCLCAweDcyLCAweDBBLCAweDlGLCAweDZGLA0KKyAgICAweEQzLCAweEJBLCAweERCLCAweEU0LCAweEEyLCAweEVBLCAweEQ4LCAweDgwLCAweEU0LCAweEJFLCAweDE3LCAweDRFLA0KKyAgICAweDU0LCAweDgxLCAweEZDLCAweEY5LCAweDlBLCAweDA2LCAweEE2LCAweEY1LCAweEYzLCAweEU1LCAweDY3LCAweDM4LA0KKyAgICAweDNFLCAweDJBLCAweDhDLCAweDY2LCAweDExLCAweEE1LCAweEExLCAweDExLCAweDk3LCAweDBCLCAweDM4LCAweDM1LA0KKyAgICAweDFFLCAweEVGLCAweEI1LCAweDE2LCAweDk1LCAweDRELCAweDZGLCAweDRBLCAweDUwLCAweEJELCAweDVCLCAweEY5LA0KKyAgICAweDMyLCAweDRDLCAweEM2LCAweEU0LCAweDEwLCAweDdCLCAweEYyLCAweDFDLCAweENDLCAweDk3LCAweEFBLCAweDk2LA0KKyAgICAweDNELCAweDgxLCAweDFGLCAweDFGLCAweERGLCAweDE4LCAweDgwLCAweDE3LCAweEE4LCAweENDLCAweENDLCAweEQzLA0KKyAgICAweDE0LCAweEZFLCAweDQ2LCAweEQ4LCAweERDLCAweEY0LCAweDI2LCAweDRGLCAweDA0LCAweDdDLCAweDc3LCAweDBDLA0KKyAgICAweDI3LCAweEY2LCAweEI1LCAweEY5LCAweDBELCAweDlGLCAweEJCLCAweEM0LCAweDE4LCAweEQwLCAweDdGLCAweDEwLA0KKyAgICAweEZBLCAweEYyLCAweDY3LCAweEVBLCAweDY0LCAweDAxLCAweDYxLCAweDQzLCAweDYwLCAweDE3LCAweDVFLCAweDk4LA0KKyAgICAweEY5LCAweDg0LCAweEZELCAweDExLCAweEE2LCAweERBLCAweEY0LCAweDJFLCAweDRGLCAweDkzLCAweDYzLCAweDZDLA0KKyAgICAweEVDLCAweEYwLCAweDc4LCAweDQ0LCAweDNELCAweDM5LCAweEM3LCAweENBLCAweDkzLCAweDA3LCAweDg2LCAweEJELA0KKyAgICAweDg4LCAweDBBLCAweDIzLCAweDdCLCAweDIzLCAweDlFLCAweDUzLCAweEY3LCAweDE2LCAweERDLCAweDE0LCAweDk4LA0KKyAgICAweDQzLCAweDM5LCAweDk5LCAweEYxLCAweDcwLCAweDAxLCAweEM5LCAweEUxLCAweDJELCAweDQ4LCAweEY2LCAweDI0LA0KKyAgICAweDYxLCAweEMzLCAweDIzLCAweDNFLCAweEU1LCAweEE5LCAweEU2LCAweEQwLCAweDZDLCAweENGLCAweDY0LCAweDk0LA0KKyAgICAweEZELCAweEZDLCAweEMyLCAweEYyLCAweDJGLCAweDdDLCAweERDLCAweENDLCAweDJGLA0KIH07DQogY29uc3QgdWludDhfdCBnX2VzTEFfTG9jYWxlW10gPSB7DQotICAgIDB4NzgsIDB4OUMsIDB4OUQsIDB4NTYsIDB4Q0QsIDB4NEUsIDB4REMsIDB4MzAsIDB4MTAsIDB4M0UsIDB4NTMsIDB4QTksIDB4RUYsIDB4NjAsIDB4NDUsIDB4NDUsIDB4ODAsIDB4MDQsIDB4OUIsIDB4RjYsDQotICAgIDB4QjgsIDB4MjgsIDB4NDQsIDB4NUEsIDB4MDEsIDB4QTUsIDB4MTUsIDB4MEQsIDB4NUEsIDB4NzUsIDB4NTEsIDB4NEIsIDB4QjksIDB4NTQsIDB4NEUsIDB4NjIsIDB4MzYsIDB4ODYsIDB4QzQsIDB4NUUsDQotICAgIDB4MzksIDB4MDksIDB4NjgsIDB4QTMsIDB4QkUsIDB4NDAsIDB4NEYsIDB4M0QsIDB4RjQsIDB4RDQsIDB4NjMsIDB4MkIsIDB4MjEsIDB4QjUsIDB4MDcsIDB4RDQsIDB4NDcsIDB4RTgsIDB4ODEsIDB4NjcsDQotICAgIDB4NDEsIDB4RjAsIDB4MTgsIDB4OUQsIDB4RkMsIDB4NkUsIDB4MTIsIDB4M0IsIDB4RTksIDB4RDIsIDB4OUMsIDB4M0MsIDB4REYsIDB4N0MsIDB4OUYsIDB4NzcsIDB4RTYsIDB4QjMsIDB4MzMsIDB4MUIsDQotICAgIDB4QzMsIDB4RTcsIDB4MEUsIDB4RjYsIDB4MDksIDB4NjIsIDB4MzgsIDB4MjAsIDB4M0IsIDB4MUEsIDB4MDksIDB4M0YsIDB4NUEsIDB4MjcsIDB4MUEsIDB4NzIsIDB4NDksIDB4RTgsIDB4RUMsIDB4NjgsDQotICAgIDB4MEYsIDB4RDcsIDB4N0YsIDB4RUUsIDB4QkYsIDB4REMsIDB4REMsIDB4N0YsIDB4RkUsIDB4RjYsIDB4RjAsIDB4RkIsIDB4NjYsIDB4RkQsIDB4RUUsIDB4QzcsIDB4NEYsIDB4ODgsIDB4RUYsIDB4QkUsDQotICAgIDB4NUUsIDB4NkYsIDB4NjgsIDB4RTYsIDB4RDMsIDB4MjcsIDB4MDgsIDB4MTksIDB4QTksIDB4OEEsIDB4QjksIDB4NTgsIDB4NEMsIDB4RTYsIDB4ODEsIDB4Q0QsIDB4RkQsIDB4QjAsIDB4RDgsIDB4NjAsDQotICAgIDB4MkEsIDB4QzgsIDB4OTQsIDB4MEIsIDB4OEEsIDB4NTksIDB4Q0EsIDB4NUEsIDB4NDEsIDB4NDYsIDB4QzAsIDB4NTksIDB4RTQsIDB4MUQsIDB4NDEsIDB4MkEsIDB4NEMsIDB4RTMsIDB4OTUsIDB4M0MsDQotICAgIDB4MzYsIDB4MDksIDB4MjMsIDB4ODIsIDB4MUIsIDB4N0EsIDB4MUUsIDB4RDQsIDB4RjAsIDB4MzMsIDB4NjIsIDB4MEIsIDB4NzUsIDB4MjYsIDB4QzAsIDB4MjIsIDB4NTEsIDB4RTEsIDB4RDgsIDB4MTYsDQotICAgIDB4RDQsIDB4NTcsIDB4RjIsIDB4RTcsIDB4MkEsIDB4RkEsIDB4NzksIDB4Q0MsIDB4QTgsIDB4MUEsIDB4RjcsIDB4OTUsIDB4MzgsIDB4OUUsIDB4RjIsIDB4MzAsIDB4NTIsIDB4MjUsIDB4NDIsIDB4MzIsDQotICAgIDB4OEIsIDB4MjgsIDB4MDksIDB4QTAsIDB4NUMsIDB4NDUsIDB4OTIsIDB4M0IsIDB4NTEsIDB4QUMsIDB4Q0UsIDB4MzAsIDB4N0UsIDB4RDksIDB4QTksIDB4NzIsIDB4QTksIDB4MjMsIDB4RTUsIDB4NTAsDQotICAgIDB4QjEsIDB4QUUsIDB4MUMsIDB4QUMsIDB4M0IsIDB4OEEsIDB4QjAsIDB4NkQsIDB4OEIsIDB4MUQsIDB4RUQsIDB4ODUsIDB4RDYsIDB4QjIsIDB4NTYsIDB4NkQsIDB4QUMsIDB4REEsIDB4NTQsIDB4QjUsDQotICAgIDB4QTUsIDB4NkEsIDB4NDMsIDB4RDUsIDB4N0UsIDB4QUEsIDB4REQsIDB4NTQsIDB4N0IsIDB4QTksIDB4MzYsIDB4NTIsIDB4RUQsIDB4QTAsIDB4REEsIDB4M0QsIDB4QjUsIDB4NkYsIDB4RkQsIDB4OEUsDQotICAgIDB4QjksIDB4NzgsIDB4NUUsIDB4QkIsIDB4ODEsIDB4MTAsIDB4OTksIDB4MkUsIDB4MEYsIDB4MjgsIDB4NEIsIDB4Q0IsIDB4NDksIDB4ODMsIDB4MEEsIDB4RjUsIDB4NjMsIDB4NDYsIDB4QzIsIDB4MTYsDQotICAgIDB4MDYsIDB4MTYsIDB4NDUsIDB4MzIsIDB4NDgsIDB4NkYsIDB4N0YsIDB4MDksIDB4ODcsIDB4RkIsIDB4NTIsIDB4RTIsIDB4M0MsIDB4MjYsIDB4OTcsIDB4MTIsIDB4MDgsIDB4MjcsIDB4MkUsIDB4RTQsDQotICAgIDB4OEQsIDB4QzMsIDB4REIsIDB4RUYsIDB4MzYsIDB4NzYsIDB4MTcsIDB4MjUsIDB4QTAsIDB4NkMsIDB4QTUsIDB4QTgsIDB4QkEsIDB4NzUsIDB4Q0EsIDB4NDUsIDB4RjksIDB4NzIsIDB4RTksIDB4NzIsDQotICAgIDB4RTEsIDB4OEEsIDB4QUEsIDB4RTUsIDB4N0EsIDB4RTUsIDB4NjIsIDB4MTUsIDB4ODUsIDB4NzYsIDB4NTcsIDB4MTksIDB4MTAsIDB4NDEsIDB4NUQsIDB4QjgsIDB4QjYsIDB4RjUsIDB4NTcsIDB4QkMsDQotICAgIDB4ODAsIDB4Q0MsIDB4OTEsIDB4MDUsIDB4NjcsIDB4NTEsIDB4MDYsIDB4Q0QsIDB4RDQsIDB4QjgsIDB4OTUsIDB4NDIsIDB4OEIsIDB4QjAsIDB4QjYsIDB4MzksIDB4MTEsIDB4QjgsIDB4QjYsIDB4MkYsDQotICAgIDB4NDQsIDB4MjYsIDB4MUUsIDB4RUMsIDB4MEUsIDB4MEMsIDB4M0QsIDB4NUQsIDB4NTUsIDB4OTAsIDB4NUIsIDB4ODcsIDB4NTAsIDB4QjYsIDB4MkEsIDB4NDUsIDB4MzAsIDB4QTUsIDB4RjQsIDB4RDYsDQotICAgIDB4OTgsIDB4Q0EsIDB4NTEsIDB4MTcsIDB4NDcsIDB4NjQsIDB4OEMsIDB4QTMsIDB4MDgsIDB4MEUsIDB4QTYsIDB4NzIsIDB4QkIsIDB4NDIsIDB4OEEsIDB4NDksIDB4NzYsIDB4MTYsIDB4RkIsIDB4QkUsDQotICAgIDB4NjYsIDB4RUUsIDB4QzMsIDB4ODMsIDB4RjYsIDB4RDYsIDB4NjAsIDB4MjIsIDB4QTIsIDB4MzUsIDB4MEIsIDB4OUUsIDB4N0MsIDB4RjUsIDB4MDEsIDB4OUUsIDB4RDQsIDB4ODksIDB4NEEsIDB4RDMsDQotICAgIDB4QjUsIDB4ODksIDB4Q0YsIDB4RDksIDB4NTQsIDB4MzMsIDB4RkYsIDB4NUYsIDB4MUYsIDB4MTAsIDB4MTcsIDB4RTQsIDB4N0IsIDB4QkEsIDB4NjUsIDB4RTksIDB4NEIsIDB4NkIsIDB4NDIsIDB4OEYsDQotICAgIDB4OEIsIDB4NjgsIDB4QTEsIDB4NkEsIDB4NkIsIDB4MTAsIDB4NkEsIDB4MjAsIDB4ODUsIDB4MjMsIDB4MTEsIDB4MEQsIDB4NUEsIDB4OEUsIDB4RDQsIDB4OTAsIDB4ODYsIDB4MjMsIDB4OUUsIDB4QjcsDQotICAgIDB4NkQsIDB4NTksIDB4REIsIDB4OTMsIDB4MDksIDB4MUEsIDB4QTEsIDB4NTMsIDB4NDMsIDB4QUYsIDB4QjEsIDB4QkEsIDB4NjQsIDB4QjksIDB4MDcsIDB4OEYsIDB4OTYsIDB4NjUsIDB4QUQsIDB4MkYsDQotICAgIDB4NTQsIDB4NEIsIDB4NjksIDB4OEEsIDB4RDYsIDB4MzMsIDB4OTUsIDB4MkMsIDB4NDksIDB4M0IsIDB4NkYsIDB4RjUsIDB4NTksIDB4REMsIDB4ODUsIDB4NjMsIDB4NDAsIDB4Q0IsIDB4MEIsIDB4NzIsDQotICAgIDB4MTAsIDB4NUIsIDB4RDEsIDB4ODUsIDB4MTcsIDB4ODQsIDB4OTMsIDB4RkQsIDB4QkQsIDB4OTcsIDB4NTcsIDB4RUYsIDB4QjEsIDB4NzcsIDB4OTgsIDB4OUMsIDB4RTYsIDB4ODYsIDB4RDUsIDB4NDksDQotICAgIDB4OTksIDB4OTIsIDB4QzUsIDB4ODEsIDB4NEQsIDB4NDQsIDB4RDMsIDB4QjUsIDB4MDYsIDB4NTYsIDB4NTQsIDB4MDUsIDB4MTgsIDB4REMsIDB4NkQsIDB4NDcsIDB4MzMsIDB4OTMsIDB4Q0QsIDB4MjQsDQotICAgIDB4MTksIDB4MEUsIDB4OTIsIDB4MjQsIDB4MzEsIDB4RjQsIDB4MDYsIDB4QUYsIDB4NUIsIDB4RUEsIDB4QzQsIDB4NDIsIDB4MTAsIDB4RTYsIDB4Q0MsIDB4MzUsIDB4RjMsIDB4NTksIDB4MkUsIDB4MUUsDQotICAgIDB4MEUsIDB4M0YsIDB4QUQsIDB4NTcsIDB4Q0IsIDB4OEQsIDB4QTUsIDB4RjcsIDB4OTksIDB4MTEsIDB4RTEsIDB4MTAsIDB4MTYsIDB4MTUsIDB4MjUsIDB4QUMsIDB4Q0EsIDB4QkEsIDB4RDQsIDB4MUIsDQotICAgIDB4QTksIDB4OUYsIDB4QUEsIDB4QzcsIDB4NDUsIDB4REIsIDB4MkIsIDB4NEQsIDB4QTgsIDB4RDgsIDB4REUsIDB4MjUsIDB4MEUsIDB4MEQsIDB4MzAsIDB4NUMsIDB4OEUsIDB4NDEsIDB4QjksIDB4NEIsDQotICAgIDB4OUUsIDB4RUUsIDB4MTQsIDB4NEMsIDB4MDUsIDB4OEYsIDB4NjcsIDB4MzQsIDB4QkQsIDB4MTcsIDB4OUIsIDB4NEIsIDB4MkEsIDB4QUEsIDB4MEUsIDB4NTYsIDB4OTcsIDB4MTQsIDB4QzAsIDB4ODQsDQotICAgIDB4OEYsIDB4NDMsIDB4Q0QsIDB4REMsIDB4NUEsIDB4OTIsIDB4OUUsIDB4QzAsIDB4NzcsIDB4ODcsIDB4NjYsIDB4M0UsIDB4OTcsIDB4RDgsIDB4MEIsIDB4NjMsIDB4MUEsIDB4NjcsIDB4NUYsIDB4MUUsDQotICAgIDB4NEMsIDB4QzMsIDB4OTksIDB4MjYsIDB4NTgsIDB4REUsIDB4QzksIDB4MkMsIDB4ODAsIDB4MDMsIDB4ODQsIDB4NTksIDB4RDQsIDB4QzgsIDB4RjcsIDB4NjgsIDB4NjgsIDB4QzgsIDB4RDMsIDB4ODUsDQotICAgIDB4NjYsIDB4NUEsIDB4MjcsIDB4NDcsIDB4OEYsIDB4OTAsIDB4RDUsIDB4OEYsIDB4NDEsIDB4MTIsIDB4NjUsIDB4QzMsIDB4NTAsIDB4QUEsIDB4M0EsIDB4N0QsIDB4RjUsIDB4RTcsIDB4MzMsIDB4NzIsDQotICAgIDB4ODYsIDB4OUQsIDB4NzIsIDB4RTgsIDB4OTYsIDB4NjEsIDB4QjEsIDB4QTcsIDB4MzUsIDB4ODcsIDB4QUYsIDB4MzksIDB4MTcsIDB4OEQsIDB4QzEsIDB4MUQsIDB4NUQsIDB4NEQsIDB4QTAsIDB4RjAsDQotICAgIDB4NDksIDB4QzUsIDB4N0EsIDB4MDgsIDB4QkIsIDB4M0MsIDB4MTYsIDB4RjAsIDB4MTcsIDB4ODgsIDB4MjYsIDB4OTEsIDB4REIsIDB4QzEsIDB4MTgsIDB4QjksIDB4REMsIDB4MjYsIDB4NjgsIDB4NEMsDQotICAgIDB4RkYsIDB4NDksIDB4NzksIDB4OTUsIDB4N0UsIDB4MUYsIDB4NUUsIDB4RjUsIDB4NTIsIDB4NDYsIDB4MDIsIDB4REIsIDB4RjAsIDB4QUUsIDB4RjUsIDB4NTEsIDB4OEUsIDB4M0QsIDB4NEMsIDB4M0IsDQotICAgIDB4MDgsIDB4ODcsIDB4M0MsIDB4ODksIDB4MkYsIDB4MzAsIDB4M0EsIDB4RTAsIDB4OTEsIDB4NDcsIDB4OUQsIDB4QjQsIDB4QTcsIDB4QUQsIDB4NzcsIDB4QUYsIDB4OTEsIDB4RDUsIDB4NEYsIDB4MDYsDQotICAgIDB4MDMsIDB4MUMsIDB4OEYsIDB4OTcsIDB4RTQsIDB4QjcsIDB4QkQsIDB4M0YsIDB4MEQsIDB4REMsIDB4NjksIDB4REEsIDB4MjUsIDB4N0EsIDB4RDMsIDB4NEIsIDB4OUIsIDB4RjAsIDB4QTUsIDB4NjgsDQotICAgIDB4RDYsIDB4M0MsIDB4NjYsIDB4RDMsIDB4NzMsIDB4OUUsIDB4MzEsIDB4RjMsIDB4MjIsIDB4QjMsIDB4MTEsIDB4NTcsIDB4M0IsIDB4NEYsIDB4NDMsIDB4Q0YsIDB4M0YsIDB4RUYsIDB4Q0QsIDB4QkYsDQotICAgIDB4QzQsIDB4QjUsIDB4RDQsIDB4MDQNCi19Ow0KKyAgICAweDc4LCAweDlDLCAweDlELCAweDU2LCAweENELCAweDRFLCAweERDLCAweDMwLCAweDEwLCAweDNFLCAweDUzLCAweEE5LA0KKyAgICAweEVGLCAweDYwLCAweDQ1LCAweDQ1LCAweDgwLCAweDA0LCAweDlCLCAweEY2LCAweEI4LCAweDI4LCAweDQ0LCAweDVBLA0KKyAgICAweDAxLCAweEE1LCAweDE1LCAweDBELCAweDVBLCAweDc1LCAweDUxLCAweDRCLCAweEI5LCAweDU0LCAweDRFLCAweDYyLA0KKyAgICAweDM2LCAweDg2LCAweEM0LCAweDVFLCAweDM5LCAweDA5LCAweDY4LCAweEEzLCAweEJFLCAweDQwLCAweDRGLCAweDNELA0KKyAgICAweEY0LCAweEQ0LCAweDYzLCAweDJCLCAweDIxLCAweEI1LCAweDA3LCAweEQ0LCAweDQ3LCAweEU4LCAweDgxLCAweDY3LA0KKyAgICAweDQxLCAweEYwLCAweDE4LCAweDlELCAweEZDLCAweDZFLCAweDEyLCAweDNCLCAweEU5LCAweEQyLCAweDlDLCAweDNDLA0KKyAgICAweERGLCAweDdDLCAweDlGLCAweDc3LCAweEU2LCAweEIzLCAweDMzLCAweDFCLCAweEMzLCAweEU3LCAweDBFLCAweEY2LA0KKyAgICAweDA5LCAweDYyLCAweDM4LCAweDIwLCAweDNCLCAweDFBLCAweDA5LCAweDNGLCAweDVBLCAweDI3LCAweDFBLCAweDcyLA0KKyAgICAweDQ5LCAweEU4LCAweEVDLCAweDY4LCAweDBGLCAweEQ3LCAweDdGLCAweEVFLCAweEJGLCAweERDLCAweERDLCAweDdGLA0KKyAgICAweEZFLCAweEY2LCAweEYwLCAweEZCLCAweDY2LCAweEZELCAweEVFLCAweEM3LCAweDRGLCAweDg4LCAweEVGLCAweEJFLA0KKyAgICAweDVFLCAweDZGLCAweDY4LCAweEU2LCAweEQzLCAweDI3LCAweDA4LCAweDE5LCAweEE5LCAweDhBLCAweEI5LCAweDU4LA0KKyAgICAweDRDLCAweEU2LCAweDgxLCAweENELCAweEZELCAweEIwLCAweEQ4LCAweDYwLCAweDJBLCAweEM4LCAweDk0LCAweDBCLA0KKyAgICAweDhBLCAweDU5LCAweENBLCAweDVBLCAweDQxLCAweDQ2LCAweEMwLCAweDU5LCAweEU0LCAweDFELCAweDQxLCAweDJBLA0KKyAgICAweDRDLCAweEUzLCAweDk1LCAweDNDLCAweDM2LCAweDA5LCAweDIzLCAweDgyLCAweDFCLCAweDdBLCAweDFFLCAweEQ0LA0KKyAgICAweEYwLCAweDMzLCAweDYyLCAweDBCLCAweDc1LCAweDI2LCAweEMwLCAweDIyLCAweDUxLCAweEUxLCAweEQ4LCAweDE2LA0KKyAgICAweEQ0LCAweDU3LCAweEYyLCAweEU3LCAweDJBLCAweEZBLCAweDc5LCAweENDLCAweEE4LCAweDFBLCAweEY3LCAweDk1LA0KKyAgICAweDM4LCAweDlFLCAweEYyLCAweDMwLCAweDUyLCAweDI1LCAweDQyLCAweDMyLCAweDhCLCAweDI4LCAweDA5LCAweEEwLA0KKyAgICAweDVDLCAweDQ1LCAweDkyLCAweDNCLCAweDUxLCAweEFDLCAweENFLCAweDMwLCAweDdFLCAweEQ5LCAweEE5LCAweDcyLA0KKyAgICAweEE5LCAweDIzLCAweEU1LCAweDUwLCAweEIxLCAweEFFLCAweDFDLCAweEFDLCAweDNCLCAweDhBLCAweEIwLCAweDZELA0KKyAgICAweDhCLCAweDFELCAweEVELCAweDg1LCAweEQ2LCAweEIyLCAweDU2LCAweDZELCAweEFDLCAweERBLCAweDU0LCAweEI1LA0KKyAgICAweEE1LCAweDZBLCAweDQzLCAweEQ1LCAweDdFLCAweEFBLCAweERELCAweDU0LCAweDdCLCAweEE5LCAweDM2LCAweDUyLA0KKyAgICAweEVELCAweEEwLCAweERBLCAweDNELCAweEI1LCAweDZGLCAweEZELCAweDhFLCAweEI5LCAweDc4LCAweDVFLCAweEJCLA0KKyAgICAweDgxLCAweDEwLCAweDk5LCAweDJFLCAweDBGLCAweDI4LCAweDRCLCAweENCLCAweDQ5LCAweDgzLCAweDBBLCAweEY1LA0KKyAgICAweDYzLCAweDQ2LCAweEMyLCAweDE2LCAweDA2LCAweDE2LCAweDQ1LCAweDMyLCAweDQ4LCAweDZGLCAweDdGLCAweDA5LA0KKyAgICAweDg3LCAweEZCLCAweDUyLCAweEUyLCAweDNDLCAweDI2LCAweDk3LCAweDEyLCAweDA4LCAweDI3LCAweDJFLCAweEU0LA0KKyAgICAweDhELCAweEMzLCAweERCLCAweEVGLCAweDM2LCAweDc2LCAweDE3LCAweDI1LCAweEEwLCAweDZDLCAweEE1LCAweEE4LA0KKyAgICAweEJBLCAweDc1LCAweENBLCAweDQ1LCAweEY5LCAweDcyLCAweEU5LCAweDcyLCAweEUxLCAweDhBLCAweEFBLCAweEU1LA0KKyAgICAweDdBLCAweEU1LCAweDYyLCAweDE1LCAweDg1LCAweDc2LCAweDU3LCAweDE5LCAweDEwLCAweDQxLCAweDVELCAweEI4LA0KKyAgICAweEI2LCAweEY1LCAweDU3LCAweEJDLCAweDgwLCAweENDLCAweDkxLCAweDA1LCAweDY3LCAweDUxLCAweDA2LCAweENELA0KKyAgICAweEQ0LCAweEI4LCAweDk1LCAweDQyLCAweDhCLCAweEIwLCAweEI2LCAweDM5LCAweDExLCAweEI4LCAweEI2LCAweDJGLA0KKyAgICAweDQ0LCAweDI2LCAweDFFLCAweEVDLCAweDBFLCAweDBDLCAweDNELCAweDVELCAweDU1LCAweDkwLCAweDVCLCAweDg3LA0KKyAgICAweDUwLCAweEI2LCAweDJBLCAweDQ1LCAweDMwLCAweEE1LCAweEY0LCAweEQ2LCAweDk4LCAweENBLCAweDUxLCAweDE3LA0KKyAgICAweDQ3LCAweDY0LCAweDhDLCAweEEzLCAweDA4LCAweDBFLCAweEE2LCAweDcyLCAweEJCLCAweDQyLCAweDhBLCAweDQ5LA0KKyAgICAweDc2LCAweDE2LCAweEZCLCAweEJFLCAweDY2LCAweEVFLCAweEMzLCAweDgzLCAweEY2LCAweEQ2LCAweDYwLCAweDIyLA0KKyAgICAweEEyLCAweDM1LCAweDBCLCAweDlFLCAweDdDLCAweEY1LCAweDAxLCAweDlFLCAweEQ0LCAweDg5LCAweDRBLCAweEQzLA0KKyAgICAweEI1LCAweDg5LCAweENGLCAweEQ5LCAweDU0LCAweDMzLCAweEZGLCAweDVGLCAweDFGLCAweDEwLCAweDE3LCAweEU0LA0KKyAgICAweDdCLCAweEJBLCAweDY1LCAweEU5LCAweDRCLCAweDZCLCAweDQyLCAweDhGLCAweDhCLCAweDY4LCAweEExLCAweDZBLA0KKyAgICAweDZCLCAweDEwLCAweDZBLCAweDIwLCAweDg1LCAweDIzLCAweDExLCAweDBELCAweDVBLCAweDhFLCAweEQ0LCAweDkwLA0KKyAgICAweDg2LCAweDIzLCAweDlFLCAweEI3LCAweDZELCAweDU5LCAweERCLCAweDkzLCAweDA5LCAweDFBLCAweEExLCAweDUzLA0KKyAgICAweDQzLCAweEFGLCAweEIxLCAweEJBLCAweDY0LCAweEI5LCAweDA3LCAweDhGLCAweDk2LCAweDY1LCAweEFELCAweDJGLA0KKyAgICAweDU0LCAweDRCLCAweDY5LCAweDhBLCAweEQ2LCAweDMzLCAweDk1LCAweDJDLCAweDQ5LCAweDNCLCAweDZGLCAweEY1LA0KKyAgICAweDU5LCAweERDLCAweDg1LCAweDYzLCAweDQwLCAweENCLCAweDBCLCAweDcyLCAweDEwLCAweDVCLCAweEQxLCAweDg1LA0KKyAgICAweDE3LCAweDg0LCAweDkzLCAweEZELCAweEJELCAweDk3LCAweDU3LCAweEVGLCAweEIxLCAweDc3LCAweDk4LCAweDlDLA0KKyAgICAweEU2LCAweDg2LCAweEQ1LCAweDQ5LCAweDk5LCAweDkyLCAweEM1LCAweDgxLCAweDRELCAweDQ0LCAweEQzLCAweEI1LA0KKyAgICAweDA2LCAweDU2LCAweDU0LCAweDA1LCAweDE4LCAweERDLCAweDZELCAweDQ3LCAweDMzLCAweDkzLCAweENELCAweDI0LA0KKyAgICAweDE5LCAweDBFLCAweDkyLCAweDI0LCAweDMxLCAweEY0LCAweDA2LCAweEFGLCAweDVCLCAweEVBLCAweEM0LCAweDQyLA0KKyAgICAweDEwLCAweEU2LCAweENDLCAweDM1LCAweEYzLCAweDU5LCAweDJFLCAweDFFLCAweDBFLCAweDNGLCAweEFELCAweDU3LA0KKyAgICAweENCLCAweDhELCAweEE1LCAweEY3LCAweDk5LCAweDExLCAweEUxLCAweDEwLCAweDE2LCAweDE1LCAweDI1LCAweEFDLA0KKyAgICAweENBLCAweEJBLCAweEQ0LCAweDFCLCAweEE5LCAweDlGLCAweEFBLCAweEM3LCAweDQ1LCAweERCLCAweDJCLCAweDRELA0KKyAgICAweEE4LCAweEQ4LCAweERFLCAweDI1LCAweDBFLCAweDBELCAweDMwLCAweDVDLCAweDhFLCAweDQxLCAweEI5LCAweDRCLA0KKyAgICAweDlFLCAweEVFLCAweDE0LCAweDRDLCAweDA1LCAweDhGLCAweDY3LCAweDM0LCAweEJELCAweDE3LCAweDlCLCAweDRCLA0KKyAgICAweDJBLCAweEFBLCAweDBFLCAweDU2LCAweDk3LCAweDE0LCAweEMwLCAweDg0LCAweDhGLCAweDQzLCAweENELCAweERDLA0KKyAgICAweDVBLCAweDkyLCAweDlFLCAweEMwLCAweDc3LCAweDg3LCAweDY2LCAweDNFLCAweDk3LCAweEQ4LCAweDBCLCAweDYzLA0KKyAgICAweDFBLCAweDY3LCAweDVGLCAweDFFLCAweDRDLCAweEMzLCAweDk5LCAweDI2LCAweDU4LCAweERFLCAweEM5LCAweDJDLA0KKyAgICAweDgwLCAweDAzLCAweDg0LCAweDU5LCAweEQ0LCAweEM4LCAweEY3LCAweDY4LCAweDY4LCAweEM4LCAweEQzLCAweDg1LA0KKyAgICAweDY2LCAweDVBLCAweDI3LCAweDQ3LCAweDhGLCAweDkwLCAweEQ1LCAweDhGLCAweDQxLCAweDEyLCAweDY1LCAweEMzLA0KKyAgICAweDUwLCAweEFBLCAweDNBLCAweDdELCAweEY1LCAweEU3LCAweDMzLCAweDcyLCAweDg2LCAweDlELCAweDcyLCAweEU4LA0KKyAgICAweDk2LCAweDYxLCAweEIxLCAweEE3LCAweDM1LCAweDg3LCAweEFGLCAweDM5LCAweDE3LCAweDhELCAweEMxLCAweDFELA0KKyAgICAweDVELCAweDRELCAweEEwLCAweEYwLCAweDQ5LCAweEM1LCAweDdBLCAweDA4LCAweEJCLCAweDNDLCAweDE2LCAweEYwLA0KKyAgICAweDE3LCAweDg4LCAweDI2LCAweDkxLCAweERCLCAweEMxLCAweDE4LCAweEI5LCAweERDLCAweDI2LCAweDY4LCAweDRDLA0KKyAgICAweEZGLCAweDQ5LCAweDc5LCAweDk1LCAweDdFLCAweDFGLCAweDVFLCAweEY1LCAweDUyLCAweDQ2LCAweDAyLCAweERCLA0KKyAgICAweEYwLCAweEFFLCAweEY1LCAweDUxLCAweDhFLCAweDNELCAweDRDLCAweDNCLCAweDA4LCAweDg3LCAweDNDLCAweDg5LA0KKyAgICAweDJGLCAweDMwLCAweDNBLCAweEUwLCAweDkxLCAweDQ3LCAweDlELCAweEI0LCAweEE3LCAweEFELCAweDc3LCAweEFGLA0KKyAgICAweDkxLCAweEQ1LCAweDRGLCAweDA2LCAweDAzLCAweDFDLCAweDhGLCAweDk3LCAweEU0LCAweEI3LCAweEJELCAweDNGLA0KKyAgICAweDBELCAweERDLCAweDY5LCAweERBLCAweDI1LCAweDdBLCAweEQzLCAweDRCLCAweDlCLCAweEYwLCAweEE1LCAweDY4LA0KKyAgICAweEQ2LCAweDNDLCAweDY2LCAweEQzLCAweDczLCAweDlFLCAweDMxLCAweEYzLCAweDIyLCAweEIzLCAweDExLCAweDU3LA0KKyAgICAweDNCLCAweDRGLCAweDQzLCAweENGLCAweDNGLCAweEVGLCAweENELCAweEJGLCAweEM0LCAweEI1LCAweEQ0LCAweDA0fTsNCiBjb25zdCB1aW50OF90IGdfZGVERV9Mb2FjYWxlW10gPSB7DQotICAgIDB4NzgsIDB4OUMsIDB4OTUsIDB4NTYsIDB4NEQsIDB4NkYsIDB4RDQsIDB4MzAsIDB4MTAsIDB4QkQsIDB4MjMsIDB4RjEsIDB4MUYsIDB4QUMsIDB4ODgsIDB4QUEsIDB4MjAsIDB4QjUsIDB4MUIsIDB4MzgsDQotICAgIDB4QjYsIDB4REEsIDB4NDYsIDB4NUEsIDB4NzUsIDB4RkIsIDB4NDEsIDB4NEIsIDB4Q0EsIDB4QUEsIDB4NjksIDB4NDEsIDB4RjQsIDB4ODIsIDB4QkMsIDB4ODksIDB4QkIsIDB4NzEsIDB4OUIsIDB4RDgsDQotICAgIDB4MkIsIDB4QzcsIDB4NjksIDB4QjUsIDB4MzksIDB4RjIsIDB4MzcsIDB4QjgsIDB4NzIsIDB4MDQsIDB4NzEsIDB4RTQsIDB4MDQsIDB4MTcsIDB4RkUsIDB4MDksIDB4NTIsIDB4MjUsIDB4N0UsIDB4MDYsDQotICAgIDB4OTMsIDB4OEQsIDB4OTMsIDB4MjYsIDB4QjYsIDB4QkIsIDB4MEQsIDB4QjksIDB4QUMsIDB4RTcsIDB4Q0QsIDB4N0IsIDB4QjMsIDB4MzMsIDB4Q0YsIDB4ODksIDB4OTMsIDB4NjEsIDB4QzIsIDB4NDMsDQotICAgIDB4OUMsIDB4MTAsIDB4QzQsIDB4NzAsIDB4NEEsIDB4NzYsIDB4OUMsIDB4ODgsIDB4N0MsIDB4MUMsIDB4RUYsIDB4MzksIDB4MjgsIDB4MjIsIDB4NTksIDB4QjgsIDB4RTMsIDB4REMsIDB4RkQsIDB4RkEsDQotICAgIDB4RjEsIDB4RjcsIDB4RkIsIDB4QjcsIDB4RTcsIDB4RjAsIDB4NzMsIDB4RjcsIDB4RjksIDB4RTcsIDB4MEIsIDB4QzcsIDB4MUIsIDB4OTYsIDB4NDQsIDB4MTYsIDB4NjEsIDB4MTEsIDB4MkMsIDB4RDIsDQotICAgIDB4MjksIDB4NEYsIDB4MzIsIDB4QTUsIDB4OTksIDB4MDksIDB4MzIsIDB4RTMsIDB4ODIsIDB4NjIsIDB4MDYsIDB4OEMsIDB4OTQsIDB4MzMsIDB4MTksIDB4OUYsIDB4MDAsIDB4OUMsIDB4QTksIDB4QjUsDQotICAgIDB4NzcsIDB4ODQsIDB4NTksIDB4OEUsIDB4QzUsIDB4RDAsIDB4QUQsIDB4QTIsIDB4QTcsIDB4NEYsIDB4MTQsIDB4QkMsIDB4NEYsIDB4QTYsIDB4QzIsIDB4ODYsIDB4RkIsIDB4QkYsIDB4QkYsIDB4ODgsDQotICAgIDB4QzIsIDB4NDAsIDB4NDcsIDB4NzMsIDB4NDEsIDB4MTMsIDB4OTMsIDB4OEIsIDB4QTksIDB4ODEsIDB4MUQsIDB4RTUsIDB4Q0MsIDB4MDYsIDB4MjYsIDB4MjYsIDB4MzgsIDB4Q0EsIDB4NjcsIDB4NzksDQotICAgIDB4MjYsIDB4MEQsIDB4MzgsIDB4MjAsIDB4NzMsIDB4NDksIDB4RDIsIDB4MjksIDB4MzEsIDB4NUIsIDB4N0IsIDB4N0IsIDB4MkQsIDB4QjksIDB4MEQsIDB4M0YsIDB4RTEsIDB4MzcsIDB4NzYsIDB4QzEsDQotICAgIDB4OTgsIDB4MTQsIDB4N0EsIDB4QzIsIDB4NkQsIDB4MTksIDB4NTQsIDB4RjMsIDB4OTYsIDB4MTEsIDB4QzIsIDB4RDMsIDB4QTksIDB4RDgsIDB4NzEsIDB4NUUsIDB4MzksIDB4MkQsIDB4REYsIDB4NkMsDQotICAgIDB4QTYsIDB4OTksIDB4MjYsIDB4RDgsIDB4RUQsIDB4RUEsIDB4NkIsIDB4OTYsIDB4Q0QsIDB4MkIsIDB4OUIsIDB4NTUsIDB4MzYsIDB4OUYsIDB4NkMsIDB4MEUsIDB4RDksIDB4REMsIDB4QjEsIDB4MTksDQotICAgIDB4RjMsIDB4QjAsIDB4MjcsIDB4MTEsIDB4NUUsIDB4QTgsIDB4MUIsIDB4MDgsIDB4NTYsIDB4NUUsIDB4QzAsIDB4MTksIDB4OTMsIDB4MTgsIDB4RkUsIDB4QkUsIDB4MEMsIDB4QUEsIDB4QUMsIDB4RTcsDQotICAgIDB4NzMsIDB4MDMsIDB4MUEsIDB4NTMsIDB4QzIsIDB4MzIsIDB4ODMsIDB4NDcsIDB4QTUsIDB4QkMsIDB4RTUsIDB4NjEsIDB4REMsIDB4NjUsIDB4NDIsIDB4NDEsIDB4MjIsIDB4MEMsIDB4RUUsIDB4QkUsDQotICAgIDB4MjAsIDB4NTQsIDB4QzcsIDB4MDIsIDB4OUMsIDB4NzYsIDB4NzgsIDB4NkUsIDB4RDMsIDB4NUEsIDB4QUIsIDB4Q0QsIDB4RDYsIDB4QzYsIDB4NTUsIDB4RkQsIDB4NkEsIDB4QUQsIDB4NkEsIDB4NkQsDQotICAgIDB4NkEsIDB4MEQsIDB4NkEsIDB4QUQsIDB4NjksIDB4MkQsIDB4NjksIDB4REQsIDB4RDgsIDB4MUIsIDB4NDksIDB4ODksIDB4QTAsIDB4MTEsIDB4MjUsIDB4NjksIDB4RkQsIDB4RDQsIDB4QTksIDB4RDAsDQotICAgIDB4MUIsIDB4RjksIDB4RTAsIDB4NkMsIDB4MUQsIDB4QjQsIDB4NzgsIDB4REUsIDB4NDQsIDB4NEIsIDB4QjgsIDB4REQsIDB4MEEsIDB4ODAsIDB4MTAsIDB4ODEsIDB4NTUsIDB4MzUsIDB4NTgsIDB4NzksDQotICAgIDB4MzcsIDB4MDMsIDB4QjQsIDB4MUIsIDB4OEIsIDB4QzEsIDB4RDAsIDB4MkQsIDB4ODMsIDB4MkEsIDB4RUIsIDB4MzEsIDB4MEQsIDB4NzMsIDB4MUIsIDB4NDksIDB4MTksIDB4NjgsIDB4RTcsIDB4NDQsDQotICAgIDB4MzUsIDB4ODEsIDB4MjQsIDB4MTMsIDB4MkMsIDB4MjUsIDB4MTEsIDB4NkMsIDB4QjksIDB4QjMsIDB4NEQsIDB4QTQsIDB4MEUsIDB4OTEsIDB4Q0IsIDB4M0MsIDB4NDksIDB4MUMsIDB4NkYsIDB4MEYsDQotICAgIDB4QUUsIDB4MEQsIDB4MzQsIDB4MUUsIDB4MjAsIDB4MUYsIDB4MkUsIDB4RjQsIDB4MDEsIDB4QUUsIDB4NzIsIDB4RDYsIDB4ODYsIDB4QUIsIDB4MTUsIDB4NTIsIDB4RDIsIDB4ODQsIDB4QjMsIDB4OTksDQotICAgIDB4RTMsIDB4RkQsIDB4QTcsIDB4MjgsIDB4MjUsIDB4MTEsIDB4NjgsIDB4QzYsIDB4MDMsIDB4REYsIDB4MUYsIDB4RjQsIDB4NTQsIDB4NjQsIDB4MzEsIDB4MTcsIDB4RjIsIDB4NUUsIDB4NjMsIDB4MjgsDQotICAgIDB4REMsIDB4Q0UsIDB4ODgsIDB4MDAsIDB4NDgsIDB4OUEsIDB4QjYsIDB4NDYsIDB4NkUsIDB4NDUsIDB4OUQsIDB4OTEsIDB4MEYsIDB4QjcsIDB4N0QsIDB4N0YsIDB4MUQsIDB4OUQsIDB4QzcsIDB4MDIsDQotICAgIDB4QUQsIDB4NUYsIDB4MEMsIDB4REQsIDB4MTYsIDB4NEIsIDB4MkIsIDB4RDEsIDB4MTksIDB4RjYsIDB4QjAsIDB4NTQsIDB4NkQsIDB4MDcsIDB4MDEsIDB4RUEsIDB4MjMsIDB4NTksIDB4OEUsIDB4NUEsDQotICAgIDB4MkIsIDB4N0EsIDB4RjAsIDB4RDUsIDB4QTAsIDB4NEIsIDB4ODUsIDB4NDEsIDB4NzcsIDB4M0IsIDB4NTMsIDB4MjksIDB4QTMsIDB4Q0UsIDB4MDAsIDB4QUIsIDB4RjcsIDB4RkEsIDB4RTAsIDB4Q0EsDQotICAgIDB4OTcsIDB4RDcsIDB4ODcsIDB4NjksIDB4MTYsIDB4RUMsIDB4OEQsIDB4RjcsIDB4NkYsIDB4REYsIDB4RTMsIDB4RjgsIDB4QjgsIDB4QjgsIDB4QTgsIDB4QUMsIDB4NjksIDB4OTMsIDB4NDAsIDB4QzcsDQotICAgIDB4RjIsIDB4RjIsIDB4NjgsIDB4QkMsIDB4RjcsIDB4QTcsIDB4MTMsIDB4QUIsIDB4NEUsIDB4MDAsIDB4ODMsIDB4NUIsIDB4MzMsIDB4NzQsIDB4QkMsIDB4NjIsIDB4QTMsIDB4MjgsIDB4QjYsIDB4MDYsDQotICAgIDB4NDUsIDB4MDEsIDB4QzcsIDB4NDYsIDB4ODcsIDB4NjcsIDB4MTQsIDB4NTIsIDB4QzIsIDB4MzAsIDB4MTcsIDB4ODIsIDB4QjAsIDB4NzAsIDB4NTEsIDB4MkIsIDB4QjcsIDB4QjYsIDB4RDAsIDB4QjMsDQotICAgIDB4OUUsIDB4RDIsIDB4MzksIDB4MTEsIDB4MjEsIDB4NjEsIDB4NTIsIDB4MjksIDB4RDcsIDB4MkMsIDB4MkEsIDB4NTcsIDB4NkIsIDB4QkQsIDB4MjksIDB4NTQsIDB4NEYsIDB4RDcsIDB4MDksIDB4OUIsDQotICAgIDB4MTcsIDB4NkIsIDB4NDgsIDB4NTMsIDB4MEMsIDB4RkIsIDB4QkQsIDB4NTEsIDB4RUIsIDB4QUIsIDB4QjQsIDB4QUUsIDB4NkUsIDB4REUsIDB4QTksIDB4M0MsIDB4OUYsIDB4RDMsIDB4NzIsIDB4QUIsDQotICAgIDB4MDcsIDB4QkQsIDB4RjgsIDB4NEQsIDB4RDcsIDB4NkIsIDB4QkQsIDB4RTgsIDB4MjksIDB4NjUsIDB4NzksIDB4RTYsIDB4NzgsIDB4OUIsIDB4QkQsIDB4QzgsIDB4MDUsIDB4MTEsIDB4REMsIDB4RjEsDQotICAgIDB4NUUsIDB4OUEsIDB4NUMsIDB4QjcsIDB4M0IsIDB4MzYsIDB4MjAsIDB4QjUsIDB4RUYsIDB4OEQsIDB4MTMsIDB4NUQsIDB4QTAsIDB4QkUsIDB4QzEsIDB4OTYsIDB4ODEsIDB4RTMsIDB4RkQsIDB4RjksDQotICAgIDB4RjQsIDB4MTUsIDB4Q0UsIDB4OEEsIDB4MEUsIDB4QzMsIDB4MkMsIDB4QTIsIDB4MzQsIDB4MzQsIDB4RTMsIDB4RTUsIDB4MDIsIDB4OEUsIDB4ODgsIDB4RjMsIDB4RDMsIDB4REUsIDB4QTIsIDB4QjYsDQotICAgIDB4RTksIDB4QTYsIDB4QzQsIDB4RDUsIDB4QkIsIDB4MkQsIDB4OUYsIDB4ODYsIDB4QzUsIDB4OUMsIDB4NUMsIDB4RTIsIDB4QjAsIDB4M0MsIDB4RkEsIDB4RUEsIDB4QTUsIDB4QUEsIDB4RTUsIDB4MkYsDQotICAgIDB4RTAsIDB4MTMsIDB4MjcsIDB4NDIsIDB4MTMsIDB4RjAsIDB4QzIsIDB4NkQsIDB4MzMsIDB4RUIsIDB4MzQsIDB4NjUsIDB4OTQsIDB4QjMsIDB4MDcsIDB4RDMsIDB4QkIsIDB4M0MsIDB4MTcsIDB4OTQsDQotICAgIDB4MDgsIDB4MTQsIDB4QzgsIDB4QzgsIDB4OUEsIDB4MUYsIDB4NDUsIDB4RjAsIDB4NjksIDB4ODEsIDB4MjYsIDB4RjQsIDB4MTEsIDB4QzIsIDB4MjEsIDB4N0MsIDB4MzUsIDB4OTEsIDB4REIsIDB4MTUsDQotICAgIDB4ODQsIDB4OTEsIDB4QzAsIDB4NTMsIDB4NzgsIDB4NjAsIDB4MUUsIDB4MjYsIDB4OUMsIDB4QzUsIDB4OTgsIDB4NUEsIDB4RDMsIDB4QzcsIDB4QkMsIDB4QzgsIDB4QUYsIDB4MzEsIDB4M0EsIDB4RTAsDQotICAgIDB4MzIsIDB4QTYsIDB4NjEsIDB4MzksIDB4QzcsIDB4RTYsIDB4QkIsIDB4RDcsIDB4QzgsIDB4NUYsIDB4NDUsIDB4ODUsIDB4OTEsIDB4QzMsIDB4OTgsIDB4RDcsIDB4RDQsIDB4RDMsIDB4MTUsIDB4N0YsDQotICAgIDB4MEEsIDB4Q0MsIDB4NTksIDB4MzksIDB4MTksIDB4N0EsIDB4QjMsIDB4ODIsIDB4MDQsIDB4NkYsIDB4RkEsIDB4QzcsIDB4NDksIDB4RkUsIDB4MjIsIDB4NjcsIDB4QjMsIDB4MkIsIDB4QkUsIDB4RTQsDQotICAgIDB4QTksIDB4RTYsIDB4REMsIDB4RkIsIDB4M0QsIDB4MkIsIDB4QTMsIDB4RUEsIDB4NzMsIDB4MTYsIDB4OTYsIDB4RkYsIDB4MDAsIDB4MjksIDB4MjcsIDB4QUYsIDB4MTcsDQorICAgIDB4NzgsIDB4OUMsIDB4OTUsIDB4NTYsIDB4NEQsIDB4NkYsIDB4RDQsIDB4MzAsIDB4MTAsIDB4QkQsIDB4MjMsIDB4RjEsDQorICAgIDB4MUYsIDB4QUMsIDB4ODgsIDB4QUEsIDB4MjAsIDB4QjUsIDB4MUIsIDB4MzgsIDB4QjYsIDB4REEsIDB4NDYsIDB4NUEsDQorICAgIDB4NzUsIDB4RkIsIDB4NDEsIDB4NEIsIDB4Q0EsIDB4QUEsIDB4NjksIDB4NDEsIDB4RjQsIDB4ODIsIDB4QkMsIDB4ODksDQorICAgIDB4QkIsIDB4NzEsIDB4OUIsIDB4RDgsIDB4MkIsIDB4QzcsIDB4NjksIDB4QjUsIDB4MzksIDB4RjIsIDB4MzcsIDB4QjgsDQorICAgIDB4NzIsIDB4MDQsIDB4NzEsIDB4RTQsIDB4MDQsIDB4MTcsIDB4RkUsIDB4MDksIDB4NTIsIDB4MjUsIDB4N0UsIDB4MDYsDQorICAgIDB4OTMsIDB4OEQsIDB4OTMsIDB4MjYsIDB4QjYsIDB4QkIsIDB4MEQsIDB4QjksIDB4QUMsIDB4RTcsIDB4Q0QsIDB4N0IsDQorICAgIDB4QjMsIDB4MzMsIDB4Q0YsIDB4ODksIDB4OTMsIDB4NjEsIDB4QzIsIDB4NDMsIDB4OUMsIDB4MTAsIDB4QzQsIDB4NzAsDQorICAgIDB4NEEsIDB4NzYsIDB4OUMsIDB4ODgsIDB4N0MsIDB4MUMsIDB4RUYsIDB4MzksIDB4MjgsIDB4MjIsIDB4NTksIDB4QjgsDQorICAgIDB4RTMsIDB4REMsIDB4RkQsIDB4RkEsIDB4RjEsIDB4RjcsIDB4RkIsIDB4QjcsIDB4RTcsIDB4RjAsIDB4NzMsIDB4RjcsDQorICAgIDB4RjksIDB4RTcsIDB4MEIsIDB4QzcsIDB4MUIsIDB4OTYsIDB4NDQsIDB4MTYsIDB4NjEsIDB4MTEsIDB4MkMsIDB4RDIsDQorICAgIDB4MjksIDB4NEYsIDB4MzIsIDB4QTUsIDB4OTksIDB4MDksIDB4MzIsIDB4RTMsIDB4ODIsIDB4NjIsIDB4MDYsIDB4OEMsDQorICAgIDB4OTQsIDB4MzMsIDB4MTksIDB4OUYsIDB4MDAsIDB4OUMsIDB4QTksIDB4QjUsIDB4NzcsIDB4ODQsIDB4NTksIDB4OEUsDQorICAgIDB4QzUsIDB4RDAsIDB4QUQsIDB4QTIsIDB4QTcsIDB4NEYsIDB4MTQsIDB4QkMsIDB4NEYsIDB4QTYsIDB4QzIsIDB4ODYsDQorICAgIDB4RkIsIDB4QkYsIDB4QkYsIDB4ODgsIDB4QzIsIDB4NDAsIDB4NDcsIDB4NzMsIDB4NDEsIDB4MTMsIDB4OTMsIDB4OEIsDQorICAgIDB4QTksIDB4ODEsIDB4MUQsIDB4RTUsIDB4Q0MsIDB4MDYsIDB4MjYsIDB4MjYsIDB4MzgsIDB4Q0EsIDB4NjcsIDB4NzksDQorICAgIDB4MjYsIDB4MEQsIDB4MzgsIDB4MjAsIDB4NzMsIDB4NDksIDB4RDIsIDB4MjksIDB4MzEsIDB4NUIsIDB4N0IsIDB4N0IsDQorICAgIDB4MkQsIDB4QjksIDB4MEQsIDB4M0YsIDB4RTEsIDB4MzcsIDB4NzYsIDB4QzEsIDB4OTgsIDB4MTQsIDB4N0EsIDB4QzIsDQorICAgIDB4NkQsIDB4MTksIDB4NTQsIDB4RjMsIDB4OTYsIDB4MTEsIDB4QzIsIDB4RDMsIDB4QTksIDB4RDgsIDB4NzEsIDB4NUUsDQorICAgIDB4MzksIDB4MkQsIDB4REYsIDB4NkMsIDB4QTYsIDB4OTksIDB4MjYsIDB4RDgsIDB4RUQsIDB4RUEsIDB4NkIsIDB4OTYsDQorICAgIDB4Q0QsIDB4MkIsIDB4OUIsIDB4NTUsIDB4MzYsIDB4OUYsIDB4NkMsIDB4MEUsIDB4RDksIDB4REMsIDB4QjEsIDB4MTksDQorICAgIDB4RjMsIDB4QjAsIDB4MjcsIDB4MTEsIDB4NUUsIDB4QTgsIDB4MUIsIDB4MDgsIDB4NTYsIDB4NUUsIDB4QzAsIDB4MTksDQorICAgIDB4OTMsIDB4MTgsIDB4RkUsIDB4QkUsIDB4MEMsIDB4QUEsIDB4QUMsIDB4RTcsIDB4NzMsIDB4MDMsIDB4MUEsIDB4NTMsDQorICAgIDB4QzIsIDB4MzIsIDB4ODMsIDB4NDcsIDB4QTUsIDB4QkMsIDB4RTUsIDB4NjEsIDB4REMsIDB4NjUsIDB4NDIsIDB4NDEsDQorICAgIDB4MjIsIDB4MEMsIDB4RUUsIDB4QkUsIDB4MjAsIDB4NTQsIDB4QzcsIDB4MDIsIDB4OUMsIDB4NzYsIDB4NzgsIDB4NkUsDQorICAgIDB4RDMsIDB4NUEsIDB4QUIsIDB4Q0QsIDB4RDYsIDB4QzYsIDB4NTUsIDB4RkQsIDB4NkEsIDB4QUQsIDB4NkEsIDB4NkQsDQorICAgIDB4NkEsIDB4MEQsIDB4NkEsIDB4QUQsIDB4NjksIDB4MkQsIDB4NjksIDB4REQsIDB4RDgsIDB4MUIsIDB4NDksIDB4ODksDQorICAgIDB4QTAsIDB4MTEsIDB4MjUsIDB4NjksIDB4RkQsIDB4RDQsIDB4QTksIDB4RDAsIDB4MUIsIDB4RjksIDB4RTAsIDB4NkMsDQorICAgIDB4MUQsIDB4QjQsIDB4NzgsIDB4REUsIDB4NDQsIDB4NEIsIDB4QjgsIDB4REQsIDB4MEEsIDB4ODAsIDB4MTAsIDB4ODEsDQorICAgIDB4NTUsIDB4MzUsIDB4NTgsIDB4NzksIDB4MzcsIDB4MDMsIDB4QjQsIDB4MUIsIDB4OEIsIDB4QzEsIDB4RDAsIDB4MkQsDQorICAgIDB4ODMsIDB4MkEsIDB4RUIsIDB4MzEsIDB4MEQsIDB4NzMsIDB4MUIsIDB4NDksIDB4MTksIDB4NjgsIDB4RTcsIDB4NDQsDQorICAgIDB4MzUsIDB4ODEsIDB4MjQsIDB4MTMsIDB4MkMsIDB4MjUsIDB4MTEsIDB4NkMsIDB4QjksIDB4QjMsIDB4NEQsIDB4QTQsDQorICAgIDB4MEUsIDB4OTEsIDB4Q0IsIDB4M0MsIDB4NDksIDB4MUMsIDB4NkYsIDB4MEYsIDB4QUUsIDB4MEQsIDB4MzQsIDB4MUUsDQorICAgIDB4MjAsIDB4MUYsIDB4MkUsIDB4RjQsIDB4MDEsIDB4QUUsIDB4NzIsIDB4RDYsIDB4ODYsIDB4QUIsIDB4MTUsIDB4NTIsDQorICAgIDB4RDIsIDB4ODQsIDB4QjMsIDB4OTksIDB4RTMsIDB4RkQsIDB4QTcsIDB4MjgsIDB4MjUsIDB4MTEsIDB4NjgsIDB4QzYsDQorICAgIDB4MDMsIDB4REYsIDB4MUYsIDB4RjQsIDB4NTQsIDB4NjQsIDB4MzEsIDB4MTcsIDB4RjIsIDB4NUUsIDB4NjMsIDB4MjgsDQorICAgIDB4REMsIDB4Q0UsIDB4ODgsIDB4MDAsIDB4NDgsIDB4OUEsIDB4QjYsIDB4NDYsIDB4NkUsIDB4NDUsIDB4OUQsIDB4OTEsDQorICAgIDB4MEYsIDB4QjcsIDB4N0QsIDB4N0YsIDB4MUQsIDB4OUQsIDB4QzcsIDB4MDIsIDB4QUQsIDB4NUYsIDB4MEMsIDB4REQsDQorICAgIDB4MTYsIDB4NEIsIDB4MkIsIDB4RDEsIDB4MTksIDB4RjYsIDB4QjAsIDB4NTQsIDB4NkQsIDB4MDcsIDB4MDEsIDB4RUEsDQorICAgIDB4MjMsIDB4NTksIDB4OEUsIDB4NUEsIDB4MkIsIDB4N0EsIDB4RjAsIDB4RDUsIDB4QTAsIDB4NEIsIDB4ODUsIDB4NDEsDQorICAgIDB4NzcsIDB4M0IsIDB4NTMsIDB4MjksIDB4QTMsIDB4Q0UsIDB4MDAsIDB4QUIsIDB4RjcsIDB4RkEsIDB4RTAsIDB4Q0EsDQorICAgIDB4OTcsIDB4RDcsIDB4ODcsIDB4NjksIDB4MTYsIDB4RUMsIDB4OEQsIDB4RjcsIDB4NkYsIDB4REYsIDB4RTMsIDB4RjgsDQorICAgIDB4QjgsIDB4QjgsIDB4QTgsIDB4QUMsIDB4NjksIDB4OTMsIDB4NDAsIDB4QzcsIDB4RjIsIDB4RjIsIDB4NjgsIDB4QkMsDQorICAgIDB4RjcsIDB4QTcsIDB4MTMsIDB4QUIsIDB4NEUsIDB4MDAsIDB4ODMsIDB4NUIsIDB4MzMsIDB4NzQsIDB4QkMsIDB4NjIsDQorICAgIDB4QTMsIDB4MjgsIDB4QjYsIDB4MDYsIDB4NDUsIDB4MDEsIDB4QzcsIDB4NDYsIDB4ODcsIDB4NjcsIDB4MTQsIDB4NTIsDQorICAgIDB4QzIsIDB4MzAsIDB4MTcsIDB4ODIsIDB4QjAsIDB4NzAsIDB4NTEsIDB4MkIsIDB4QjcsIDB4QjYsIDB4RDAsIDB4QjMsDQorICAgIDB4OUUsIDB4RDIsIDB4MzksIDB4MTEsIDB4MjEsIDB4NjEsIDB4NTIsIDB4MjksIDB4RDcsIDB4MkMsIDB4MkEsIDB4NTcsDQorICAgIDB4NkIsIDB4QkQsIDB4MjksIDB4NTQsIDB4NEYsIDB4RDcsIDB4MDksIDB4OUIsIDB4MTcsIDB4NkIsIDB4NDgsIDB4NTMsDQorICAgIDB4MEMsIDB4RkIsIDB4QkQsIDB4NTEsIDB4RUIsIDB4QUIsIDB4QjQsIDB4QUUsIDB4NkUsIDB4REUsIDB4QTksIDB4M0MsDQorICAgIDB4OUYsIDB4RDMsIDB4NzIsIDB4QUIsIDB4MDcsIDB4QkQsIDB4RjgsIDB4NEQsIDB4RDcsIDB4NkIsIDB4QkQsIDB4RTgsDQorICAgIDB4MjksIDB4NjUsIDB4NzksIDB4RTYsIDB4NzgsIDB4OUIsIDB4QkQsIDB4QzgsIDB4MDUsIDB4MTEsIDB4REMsIDB4RjEsDQorICAgIDB4NUUsIDB4OUEsIDB4NUMsIDB4QjcsIDB4M0IsIDB4MzYsIDB4MjAsIDB4QjUsIDB4RUYsIDB4OEQsIDB4MTMsIDB4NUQsDQorICAgIDB4QTAsIDB4QkUsIDB4QzEsIDB4OTYsIDB4ODEsIDB4RTMsIDB4RkQsIDB4RjksIDB4RjQsIDB4MTUsIDB4Q0UsIDB4OEEsDQorICAgIDB4MEUsIDB4QzMsIDB4MkMsIDB4QTIsIDB4MzQsIDB4MzQsIDB4RTMsIDB4RTUsIDB4MDIsIDB4OEUsIDB4ODgsIDB4RjMsDQorICAgIDB4RDMsIDB4REUsIDB4QTIsIDB4QjYsIDB4RTksIDB4QTYsIDB4QzQsIDB4RDUsIDB4QkIsIDB4MkQsIDB4OUYsIDB4ODYsDQorICAgIDB4QzUsIDB4OUMsIDB4NUMsIDB4RTIsIDB4QjAsIDB4M0MsIDB4RkEsIDB4RUEsIDB4QTUsIDB4QUEsIDB4RTUsIDB4MkYsDQorICAgIDB4RTAsIDB4MTMsIDB4MjcsIDB4NDIsIDB4MTMsIDB4RjAsIDB4QzIsIDB4NkQsIDB4MzMsIDB4RUIsIDB4MzQsIDB4NjUsDQorICAgIDB4OTQsIDB4QjMsIDB4MDcsIDB4RDMsIDB4QkIsIDB4M0MsIDB4MTcsIDB4OTQsIDB4MDgsIDB4MTQsIDB4QzgsIDB4QzgsDQorICAgIDB4OUEsIDB4MUYsIDB4NDUsIDB4RjAsIDB4NjksIDB4ODEsIDB4MjYsIDB4RjQsIDB4MTEsIDB4QzIsIDB4MjEsIDB4N0MsDQorICAgIDB4MzUsIDB4OTEsIDB4REIsIDB4MTUsIDB4ODQsIDB4OTEsIDB4QzAsIDB4NTMsIDB4NzgsIDB4NjAsIDB4MUUsIDB4MjYsDQorICAgIDB4OUMsIDB4QzUsIDB4OTgsIDB4NUEsIDB4RDMsIDB4QzcsIDB4QkMsIDB4QzgsIDB4QUYsIDB4MzEsIDB4M0EsIDB4RTAsDQorICAgIDB4MzIsIDB4QTYsIDB4NjEsIDB4MzksIDB4QzcsIDB4RTYsIDB4QkIsIDB4RDcsIDB4QzgsIDB4NUYsIDB4NDUsIDB4ODUsDQorICAgIDB4OTEsIDB4QzMsIDB4OTgsIDB4RDcsIDB4RDQsIDB4RDMsIDB4MTUsIDB4N0YsIDB4MEEsIDB4Q0MsIDB4NTksIDB4MzksDQorICAgIDB4MTksIDB4N0EsIDB4QjMsIDB4ODIsIDB4MDQsIDB4NkYsIDB4RkEsIDB4QzcsIDB4NDksIDB4RkUsIDB4MjIsIDB4NjcsDQorICAgIDB4QjMsIDB4MkIsIDB4QkUsIDB4RTQsIDB4QTksIDB4RTYsIDB4REMsIDB4RkIsIDB4M0QsIDB4MkIsIDB4QTMsIDB4RUEsDQorICAgIDB4NzMsIDB4MTYsIDB4OTYsIDB4RkYsIDB4MDAsIDB4MjksIDB4MjcsIDB4QUYsIDB4MTcsDQogfTsNCiBjb25zdCB1aW50OF90IGdfZnJGUl9Mb2NhbGVbXSA9IHsNCi0gICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHg0RCwgMHg2RiwgMHhEMywgMHg0MCwgMHgxMCwgMHhCRCwgMHgyMywgMHhGMSwgMHgxRiwgMHg1NiwgMHgxNiwgMHg1NSwgMHg0MSwgMHg2QSwgMHhCRCwgMHg3MCwNCi0gICAgMHg0QywgMHg5NSwgMHg1QSwgMHhBQSwgMHhGQSwgMHgxNSwgMHgyOCwgMHg0NiwgMHg1MSwgMHg1MywgMHg0MCwgMHhGNCwgMHg4MiwgMHgzNiwgMHhGNiwgMHgzNiwgMHhERSwgMHhENCwgMHhERSwgMHg4RCwNCi0gICAgMHhENiwgMHg3NiwgMHg0QSwgMHg3QywgMHhFNCwgMHgzRiwgMHg3MCwgMHhFMiwgMHhDMiwgMHhCNSwgMHgxMiwgMHg4OCwgMHgwMywgMHg0NywgMHhDNCwgMHg4NSwgMHhGRSwgMHgxMywgMHgyNCwgMHgxMCwNCi0gICAgMHgzRiwgMHg4MywgMHg3MSwgMHhCQywgMHg3NiwgMHhFRCwgMHg1RCwgMHgyNywgMHhCOCwgMHhCRSwgMHg2NCwgMHhFNywgMHhDRCwgMHg3QiwgMHhFMywgMHg5OSwgMHhCNywgMHhGNiwgMHhDNiwgMHhGRCwNCi0gICAgMHg1MCwgMHg3OCwgMHgyNCwgMHhBNCwgMHg4OCwgMHg5MywgMHg4OCwgMHhFRSwgMHg1QSwgMHgxNywgMHhGMiwgMHhFRCwgMHhEMSwgMHhBOSwgMHg4NSwgMHg3QywgMHgxQSwgMHg3QiwgMHhCQiwgMHhENiwNCi0gICAgMHg5RiwgMHg2RiwgMHgxRiwgMHhGRSwgMHg3RSwgMHhGRCwgMHhGMiwgMHgxMCwgMHg3RSwgMHg3RSwgMHg3RiwgMHhGQywgMHhGMSwgMHhDOCwgMHg3MiwgMHhGQSwgMHgzOSwgMHg5MSwgMHhGQiwgMHg0NCwNCi0gICAgMHg4RSwgMHgxNiwgMHhEMSwgMHg1OCwgMHg4NCwgMHhCMSwgMHhEMiwgMHg0QywgMHgyNCwgMHg5RCwgMHgwOCwgMHhDOSwgMHgwOCwgMHgwNywgMHg0NiwgMHgyNCwgMHg3OCwgMHgxMiwgMHhCQywgMHgwMCwNCi0gICAgMHgzOCwgMHg1NiwgMHg2QiwgMHg2NywgMHg0QSwgMHhGOCwgMHg5QywgMHg1MSwgMHhEOSwgMHhDNywgMHg0NSwgMHg3OCwgMHhGRiwgMHg5RSwgMHhDMiwgMHgyRiwgMHg2RSwgMHhBRSwgMHhFNywgMHhCMiwNCi0gICAgMHgyRCwgMHgxMSwgMHgxMSwgMHgxOSwgMHgxQiwgMHgyMCwgMHgwMSwgMHg2RSwgMHhEOCwgMHg0MiwgMHg2NSwgMHgwNiwgMHgzNiwgMHg0RCwgMHgxOSwgMHg2RiwgMHgwMywgMHhDMywgMHg5MCwgMHgyNiwNCi0gICAgMHg2NiwgMHg1OSwgMHg3MSwgMHhGMywgMHhERCwgMHg0NCwgMHg2MywgMHgzQSwgMHg0QiwgMHg2OCwgMHgzNCwgMHg5NiwgMHhENCwgMHhDOCwgMHgwOCwgMHgyRiwgMHgxMSwgMHg2RCwgMHgzOCwgMHgxNywNCi0gICAgMHhGMywgMHg3NiwgMHg4MSwgMHg3RiwgMHg3MywgMHhFRCwgMHhFOSwgMHgxOSwgMHg1QywgMHgzMywgMHhBOSwgMHgyNCwgMHgyRSwgMHgyMywgMHg0NCwgMHhDNiwgMHg2MywgMHhCOSwgMHg2QiwgMHgzRCwNCi0gICAgMHhCMSwgMHhFQSwgMHhERSwgMHhEOSwgMHhFRCwgMHhDRSwgMHg5OSwgMHhGMCwgMHgyQSwgMHhERiwgMHhEQSwgMHg5OCwgMHg3NywgMHhCMCwgMHhDRCwgMHg5NCwgMHhBRiwgMHgzNiwgMHhDRCwgMHhFNCwNCi0gICAgMHg4MiwgMHg2MSwgMHgyNiwgMHgwOCwgMHg2RSwgMHg5OSwgMHg2MCwgMHhFRSwgMHg5NCwgMHhCRCwgMHhEQSwgMHgyNSwgMHg5RiwgMHgyQywgMHhENCwgMHg2MywgMHgwNSwgMHgyQiwgMHhDNywgMHg2NywNCi0gICAgMHgxMSwgMHhFMSwgMHg1RSwgMHgwMCwgMHhBRSwgMHhFNiwgMHg1MSwgMHg5MSwgMHg3NiwgMHhDMiwgMHg5NCwgMHhGQiwgMHhBQywgMHg4MSwgMHg4MCwgMHgyNSwgMHgzQSwgMHg0MiwgMHhBNSwgMHgyNywNCi0gICAgMHhBOSwgMHgwNiwgMHg0RSwgMHg2OSwgMHhBQSwgMHgyMSwgMHg3MywgMHg3OCwgMHhDQywgMHgwRCwgMHg1QSwgMHgwQywgMHhGNywgMHhBRiwgMHg0MSwgMHhCOCwgMHg2QSwgMHhBOSwgMHhENiwgMHg1RSwNCi0gICAgMHg2RCwgMHgwQiwgMHg1NSwgMHg5RiwgMHhCNiwgMHhERSwgMHhBMywgMHhBRCwgMHhCNywgMHg2OCwgMHhFQiwgMHgxRCwgMHhEQSwgMHg3QSwgMHg3NywgMHhCNiwgMHhERSwgMHg5QywgMHhBRCwgMHgzNywNCi0gICAgMHg2NiwgMHhCNywgMHhCNywgMHgwNSwgMHhDNSwgMHg5OCwgMHhDRiwgMHg2OCwgMHg1NCwgMHhCRSwgMHg5MSwgMHgyQSwgMHg3NCwgMHhGNiwgMHg1QywgMHhGMCwgMHhCNywgMHgwQywgMHg2QSwgMHgzQywNCi0gICAgMHg2NywgMHhBOCwgMHgyNSwgMHg3MCwgMHhCMywgMHgwMiwgMHgyMCwgMHg1NCwgMHgxMiwgMHg1NSwgMHgwRCwgMHg1NiwgMHhGMCwgMHg3QywgMHhEOSwgMHhFOCwgMHg5OSwgMHhCRCwgMHhCRCwgMHgwRiwNCi0gICAgMHhGNywgMHhDRiwgMHhDMywgMHgyMiwgMHhFRiwgMHg5MCwgMHg5OSwgMHg4RSwgMHhFMiwgMHg0QSwgMHg5NiwgMHgwNywgMHhEQSwgMHgzOSwgMHg1MiwgMHhDQywgMHg5MSwgMHhEMCwgMHgyMSwgMHg0OSwNCi0gICAgMHgxMiwgMHgyQSwgMHhGOSwgMHg3MiwgMHg4RiwgMHhBQiwgMHhBOCwgMHgzQywgMHg5OCwgMHhEMiwgMHgzMCwgMHhCNCwgMHg5QywgMHg0MywgMHhCOCwgMHhEMCwgMHgwMSwgMHg3MiwgMHhFMSwgMHg0MiwNCi0gICAgMHg2RiwgMHhFMCwgMHhDQSwgMHhBNywgMHhBRCwgMHg5OCwgMHg1QSwgMHgxOSwgMHgyNSwgMHgwQywgMHgwNSwgMHg5RiwgMHg1OCwgMHhDRSwgMHhERCwgMHgzNCwgMHhCMCwgMHhDRiwgMHg0QSwgMHg4MiwNCi0gICAgMHgzQSwgMHhGMSwgMHhFMywgMHg0MCwgMHhDOCwgMHgwNCwgMHgxNCwgMHgwNywgMHhEOCwgMHg3NSwgMHg3MSwgMHg4QiwgMHgwMiwgMHgzNywgMHhBNiwgMHgwMywgMHgyMCwgMHg2MSwgMHg1MSwgMHg2RCwNCi0gICAgMHhEQSwgMHg1QSwgMHhENCwgMHg5OCwgMHg3NiwgMHgzMCwgMHhEOCwgMHg0NCwgMHgwMSwgMHhEQSwgMHg4NCwgMHgyRSwgMHhDRSwgMHhGQiwgMHhCOCwgMHg0NiwgMHhEMiwgMHgyQSwgMHgzNCwgMHgwNiwNCi0gICAgMHgxRCwgMHgwQywgMHg3NiwgMHg1QywgMHg3NywgMHg2NywgMHgzNCwgMHhFQSwgMHgyNCwgMHg1OSwgMHhDRSwgMHg1OSwgMHgyQSwgMHgzQSwgMHhGMCwgMHhENSwgMHg5QywgMHg0QiwgMHg4NSwgMHg0MSwNCi0gICAgMHhDNywgMHg4RCwgMHhBMSwgMHg5NCwgMHg0RiwgMHg2NywgMHg4MCwgMHg5NSwgMHhCQiwgMHg3QywgMHg0QywgMHhEQywgMHhFOSwgMHhFNSwgMHgyMCwgMHg4QSwgMHg0NywgMHg4NywgMHgwNywgMHg0NywNCi0gICAgMHg1NywgMHhBRiwgMHhERiwgMHgwNSwgMHgyNywgMHhEOSwgMHg3OSwgMHhFMSwgMHg0QywgMHg5RCwgMHgwNCwgMHgzQSwgMHg5RSwgMHg0NiwgMHg2MywgMHgyQSwgMHg2RiwgMHhFRCwgMHg2OSwgMHhDNCwNCi0gICAgMHhBQSwgMHgxMywgMHhDMCwgMHhFMCwgMHhDMSwgMHhGNCwgMHgyQywgMHgyNywgMHhEQiwgMHhDQSwgMHhCMiwgMHg5RSwgMHg5RCwgMHg2NSwgMHg1OSwgMHgxRiwgMHgzNywgMHg3OCwgMHg0NiwgMHgyMSwNCi0gICAgMHgyNSwgMHhGNCwgMHg1MiwgMHgyOSwgMHgyOSwgMHhGNywgMHgxNiwgMHhBNSwgMHhCMiwgMHhENywgMHg0MywgMHgwRiwgMHgzQSwgMHg0QSwgMHg2NywgMHg3MCwgMHg3NiwgMHg1MCwgMHg5RSwgMHgyOCwNCi0gICAgMHhFNSwgMHg0NiwgMHg4QiwgMHgwQSwgMHg2QiwgMHhBRCwgMHg1NywgMHg4NSwgMHhDQSwgMHhFOSwgMHgxQSwgMHhBMSwgMHgyQSwgMHhFQiwgMHg1MywgMHgwRiwgMHg0RSwgMHgzMywgMHhEOCwgMHhFRSwNCi0gICAgMHhBRCwgMHg1MiwgMHg1RiwgMHhBNCwgMHg3NSwgMHg3NSwgMHhGNSwgMHg2RiwgMHgyQiwgMHhEMiwgMHgxOSwgMHhDQiwgMHhCNywgMHhGQSwgMHhFNywgMHhBNywgMHg0RSwgMHg4MiwgMHhBQSwgMHhFRCwNCi0gICAgMHg4RCwgMHg0RSwgMHhGNCwgMHg4OCwgMHhGMSwgMHgzNCwgMHhCNiwgMHg5QywgMHhFRCwgMHg0RSwgMHhFNCwgMHg4QywgMHg0QSwgMHg2MSwgMHgzOSwgMHg4RiwgMHg0RCwgMHgyRSwgMHg2RSwgMHhDRSwNCi0gICAgMHgwRCwgMHg0OCwgMHg2OSwgMHg3QywgMHg2NSwgMHg0NSwgMHgxMywgMHgyOCwgMHg5RiwgMHhCMCwgMHg2NSwgMHg2MCwgMHgzOSwgMHhCRiwgMHhERSwgMHg3RiwgMHg4NiwgMHg2MywgMHhBMiwgMHhDMSwNCi0gICAgMHgzMCwgMHg4QiwgMHgyOCwgMHgwRCwgMHg4QiwgMHg0NSwgMHhCRSwgMHg4MCwgMHhEMywgMHhFMSwgMHhFNSwgMHg2OSwgMHg2NywgMHg1MSwgMHhERCwgMHg3NSwgMHg1MywgMHg4MiwgMHhGNSwgMHg2RSwNCi0gICAgMHhGMywgMHhENywgMHg2MSwgMHgzMSwgMHhBMywgMHgxNywgMHhDNCwgMHhDQiwgMHg0RiwgMHhCRSwgMHg3MiwgMHhBOSwgMHg2QSwgMHhCOSwgMHgwQiwgMHhGOCwgMHhGQSwgMHhGMSwgMHhEMSwgMHgxMCwNCi0gICAgMHhCQywgMHhDMCwgMHg3NSwgMHg2NiwgMHg5OSwgMHg2NiwgMHg5QywgMHgwOSwgMHhCRSwgMHgzMiwgMHhCRCwgMHgyRiwgMHhEMiwgMHhGQywgMHgzQiwgMHgwOCwgMHg4RCwgMHgxMiwgMHhCRiwgMHgzNSwNCi0gICAgMHhCRiwgMHhFNywgMHg4QiwgMHgzMSwgMHg0NSwgMHg0MywgMHhGNiwgMHgxRiwgMHhDMiwgMHg4MCwgMHhDMiwgMHg1NywgMHhDNiwgMHhENSwgMHgxQSwgMHhDMiwgMHg5RSwgMHgyNCwgMHg2MywgMHg3OCwNCi0gICAgMHg2MywgMHg1NiwgMHgxMywgMHhDRSwgMHgwMiwgMHhDMiwgMHg1QSwgMHhEMywgMHgyNywgMHgyMiwgMHg0QiwgMHgyRiwgMHgwOSwgMHgzQSwgMHgxNiwgMHg0OSwgMHhDMCwgMHhCQywgMHg3QywgMHg4RSwNCi0gICAgMHhFRCwgMHg1NywgMHg0RiwgMHg5MSwgMHhCQiwgMHg4RSwgMHgwQSwgMHgyMywgMHg3QiwgMHg4MSwgMHgyOCwgMHhBOSwgMHhBNywgMHg2QiwgMHg2RSwgMHgwQSwgMHhDQywgMHg0OSwgMHgzRSwgMHgxOSwNCi0gICAgMHg3QSwgMHhCRSwgMHg4NiwgMHgzNCwgMHgxMiwgMHgxRCwgMHg0OCwgMHhFRSwgMHgyMiwgMHhFNSwgMHg5MywgMHhBOSwgMHg1OCwgMHhGMiwgMHg1NCwgMHg3MywgMHhGOCwgMHg3NiwgMHhDRiwgMHhGMiwNCi0gICAgMHhBOCwgMHhGOCwgMHhEMiwgMHg4NSwgMHhFNSwgMHgzRiwgMHg1RCwgMHg0OSwgMHhCRSwgMHgxQg0KLX07DQorICAgIDB4NzgsIDB4OUMsIDB4OTUsIDB4NTYsIDB4NEQsIDB4NkYsIDB4RDMsIDB4NDAsIDB4MTAsIDB4QkQsIDB4MjMsIDB4RjEsDQorICAgIDB4MUYsIDB4NTYsIDB4MTYsIDB4NTUsIDB4NDEsIDB4NkEsIDB4QkQsIDB4NzAsIDB4NEMsIDB4OTUsIDB4NUEsIDB4QUEsDQorICAgIDB4RkEsIDB4MTUsIDB4MjgsIDB4NDYsIDB4NTEsIDB4NTMsIDB4NDAsIDB4RjQsIDB4ODIsIDB4MzYsIDB4RjYsIDB4MzYsDQorICAgIDB4REUsIDB4RDQsIDB4REUsIDB4OEQsIDB4RDYsIDB4NzYsIDB4NEEsIDB4N0MsIDB4RTQsIDB4M0YsIDB4NzAsIDB4RTIsDQorICAgIDB4QzIsIDB4QjUsIDB4MTIsIDB4ODgsIDB4MDMsIDB4NDcsIDB4QzQsIDB4ODUsIDB4RkUsIDB4MTMsIDB4MjQsIDB4MTAsDQorICAgIDB4M0YsIDB4ODMsIDB4NzEsIDB4QkMsIDB4NzYsIDB4RUQsIDB4NUQsIDB4MjcsIDB4QjgsIDB4QkUsIDB4NjQsIDB4RTcsDQorICAgIDB4Q0QsIDB4N0IsIDB4RTMsIDB4OTksIDB4QjcsIDB4RjYsIDB4QzYsIDB4RkQsIDB4NTAsIDB4NzgsIDB4MjQsIDB4QTQsDQorICAgIDB4ODgsIDB4OTMsIDB4ODgsIDB4RUUsIDB4NUEsIDB4MTcsIDB4RjIsIDB4RUQsIDB4RDEsIDB4QTksIDB4ODUsIDB4N0MsDQorICAgIDB4MUEsIDB4N0IsIDB4QkIsIDB4RDYsIDB4OUYsIDB4NkYsIDB4MUYsIDB4RkUsIDB4N0UsIDB4RkQsIDB4RjIsIDB4MTAsDQorICAgIDB4N0UsIDB4N0UsIDB4N0YsIDB4RkMsIDB4RjEsIDB4QzgsIDB4NzIsIDB4RkEsIDB4MzksIDB4OTEsIDB4RkIsIDB4NDQsDQorICAgIDB4OEUsIDB4MTYsIDB4RDEsIDB4NTgsIDB4ODQsIDB4QjEsIDB4RDIsIDB4NEMsIDB4MjQsIDB4OUQsIDB4MDgsIDB4QzksDQorICAgIDB4MDgsIDB4MDcsIDB4NDYsIDB4MjQsIDB4NzgsIDB4MTIsIDB4QkMsIDB4MDAsIDB4MzgsIDB4NTYsIDB4NkIsIDB4NjcsDQorICAgIDB4NEEsIDB4RjgsIDB4OUMsIDB4NTEsIDB4RDksIDB4QzcsIDB4NDUsIDB4NzgsIDB4RkYsIDB4OUUsIDB4QzIsIDB4MkYsDQorICAgIDB4NkUsIDB4QUUsIDB4RTcsIDB4QjIsIDB4MkQsIDB4MTEsIDB4MTEsIDB4MTksIDB4MUIsIDB4MjAsIDB4MDEsIDB4NkUsDQorICAgIDB4RDgsIDB4NDIsIDB4NjUsIDB4MDYsIDB4MzYsIDB4NEQsIDB4MTksIDB4NkYsIDB4MDMsIDB4QzMsIDB4OTAsIDB4MjYsDQorICAgIDB4NjYsIDB4NTksIDB4NzEsIDB4RjMsIDB4REQsIDB4NDQsIDB4NjMsIDB4M0EsIDB4NEIsIDB4NjgsIDB4MzQsIDB4OTYsDQorICAgIDB4RDQsIDB4QzgsIDB4MDgsIDB4MkYsIDB4MTEsIDB4NkQsIDB4MzgsIDB4MTcsIDB4RjMsIDB4NzYsIDB4ODEsIDB4N0YsDQorICAgIDB4NzMsIDB4RUQsIDB4RTksIDB4MTksIDB4NUMsIDB4MzMsIDB4QTksIDB4MjQsIDB4MkUsIDB4MjMsIDB4NDQsIDB4QzYsDQorICAgIDB4NjMsIDB4QjksIDB4NkIsIDB4M0QsIDB4QjEsIDB4RUEsIDB4REUsIDB4RDksIDB4RUQsIDB4Q0UsIDB4OTksIDB4RjAsDQorICAgIDB4MkEsIDB4REYsIDB4REEsIDB4OTgsIDB4NzcsIDB4QjAsIDB4Q0QsIDB4OTQsIDB4QUYsIDB4MzYsIDB4Q0QsIDB4RTQsDQorICAgIDB4ODIsIDB4NjEsIDB4MjYsIDB4MDgsIDB4NkUsIDB4OTksIDB4NjAsIDB4RUUsIDB4OTQsIDB4QkQsIDB4REEsIDB4MjUsDQorICAgIDB4OUYsIDB4MkMsIDB4RDQsIDB4NjMsIDB4MDUsIDB4MkIsIDB4QzcsIDB4NjcsIDB4MTEsIDB4RTEsIDB4NUUsIDB4MDAsDQorICAgIDB4QUUsIDB4RTYsIDB4NTEsIDB4OTEsIDB4NzYsIDB4QzIsIDB4OTQsIDB4RkIsIDB4QUMsIDB4ODEsIDB4ODAsIDB4MjUsDQorICAgIDB4M0EsIDB4NDIsIDB4QTUsIDB4MjcsIDB4QTksIDB4MDYsIDB4NEUsIDB4NjksIDB4QUEsIDB4MjEsIDB4NzMsIDB4NzgsDQorICAgIDB4Q0MsIDB4MEQsIDB4NUEsIDB4MEMsIDB4RjcsIDB4QUYsIDB4NDEsIDB4QjgsIDB4NkEsIDB4QTksIDB4RDYsIDB4NUUsDQorICAgIDB4NkQsIDB4MEIsIDB4NTUsIDB4OUYsIDB4QjYsIDB4REUsIDB4QTMsIDB4QUQsIDB4QjcsIDB4NjgsIDB4RUIsIDB4MUQsDQorICAgIDB4REEsIDB4N0EsIDB4NzcsIDB4QjYsIDB4REUsIDB4OUMsIDB4QUQsIDB4MzcsIDB4NjYsIDB4QjcsIDB4QjcsIDB4MDUsDQorICAgIDB4QzUsIDB4OTgsIDB4Q0YsIDB4NjgsIDB4NTQsIDB4QkUsIDB4OTEsIDB4MkEsIDB4NzQsIDB4RjYsIDB4NUMsIDB4RjAsDQorICAgIDB4QjcsIDB4MEMsIDB4NkEsIDB4M0MsIDB4NjcsIDB4QTgsIDB4MjUsIDB4NzAsIDB4QjMsIDB4MDIsIDB4MjAsIDB4NTQsDQorICAgIDB4MTIsIDB4NTUsIDB4MEQsIDB4NTYsIDB4RjAsIDB4N0MsIDB4RDksIDB4RTgsIDB4OTksIDB4QkQsIDB4QkQsIDB4MEYsDQorICAgIDB4RjcsIDB4Q0YsIDB4QzMsIDB4MjIsIDB4RUYsIDB4OTAsIDB4OTksIDB4OEUsIDB4RTIsIDB4NEEsIDB4OTYsIDB4MDcsDQorICAgIDB4REEsIDB4MzksIDB4NTIsIDB4Q0MsIDB4OTEsIDB4RDAsIDB4MjEsIDB4NDksIDB4MTIsIDB4MkEsIDB4RjksIDB4NzIsDQorICAgIDB4OEYsIDB4QUIsIDB4QTgsIDB4M0MsIDB4OTgsIDB4RDIsIDB4MzAsIDB4QjQsIDB4OUMsIDB4NDMsIDB4QjgsIDB4RDAsDQorICAgIDB4MDEsIDB4NzIsIDB4RTEsIDB4NDIsIDB4NkYsIDB4RTAsIDB4Q0EsIDB4QTcsIDB4QUQsIDB4OTgsIDB4NUEsIDB4MTksDQorICAgIDB4MjUsIDB4MEMsIDB4MDUsIDB4OUYsIDB4NTgsIDB4Q0UsIDB4REQsIDB4MzQsIDB4QjAsIDB4Q0YsIDB4NEEsIDB4ODIsDQorICAgIDB4M0EsIDB4RjEsIDB4RTMsIDB4NDAsIDB4QzgsIDB4MDQsIDB4MTQsIDB4MDcsIDB4RDgsIDB4NzUsIDB4NzEsIDB4OEIsDQorICAgIDB4MDIsIDB4MzcsIDB4QTYsIDB4MDMsIDB4MjAsIDB4NjEsIDB4NTEsIDB4NkQsIDB4REEsIDB4NUEsIDB4RDQsIDB4OTgsDQorICAgIDB4NzYsIDB4MzAsIDB4RDgsIDB4NDQsIDB4MDEsIDB4REEsIDB4ODQsIDB4MkUsIDB4Q0UsIDB4RkIsIDB4QjgsIDB4NDYsDQorICAgIDB4RDIsIDB4MkEsIDB4MzQsIDB4MDYsIDB4MUQsIDB4MEMsIDB4NzYsIDB4NUMsIDB4NzcsIDB4NjcsIDB4MzQsIDB4RUEsDQorICAgIDB4MjQsIDB4NTksIDB4Q0UsIDB4NTksIDB4MkEsIDB4M0EsIDB4RjAsIDB4RDUsIDB4OUMsIDB4NEIsIDB4ODUsIDB4NDEsDQorICAgIDB4QzcsIDB4OEQsIDB4QTEsIDB4OTQsIDB4NEYsIDB4NjcsIDB4ODAsIDB4OTUsIDB4QkIsIDB4N0MsIDB4NEMsIDB4REMsDQorICAgIDB4RTksIDB4RTUsIDB4MjAsIDB4OEEsIDB4NDcsIDB4ODcsIDB4MDcsIDB4NDcsIDB4NTcsIDB4QUYsIDB4REYsIDB4MDUsDQorICAgIDB4MjcsIDB4RDksIDB4NzksIDB4RTEsIDB4NEMsIDB4OUQsIDB4MDQsIDB4M0EsIDB4OUUsIDB4NDYsIDB4NjMsIDB4MkEsDQorICAgIDB4NkYsIDB4RUQsIDB4NjksIDB4QzQsIDB4QUEsIDB4MTMsIDB4QzAsIDB4RTAsIDB4QzEsIDB4RjQsIDB4MkMsIDB4MjcsDQorICAgIDB4REIsIDB4Q0EsIDB4QjIsIDB4OUUsIDB4OUQsIDB4NjUsIDB4NTksIDB4MUYsIDB4MzcsIDB4NzgsIDB4NDYsIDB4MjEsDQorICAgIDB4MjUsIDB4RjQsIDB4NTIsIDB4MjksIDB4MjksIDB4RjcsIDB4MTYsIDB4QTUsIDB4QjIsIDB4RDcsIDB4NDMsIDB4MEYsDQorICAgIDB4M0EsIDB4NEEsIDB4NjcsIDB4NzAsIDB4NzYsIDB4NTAsIDB4OUUsIDB4MjgsIDB4RTUsIDB4NDYsIDB4OEIsIDB4MEEsDQorICAgIDB4NkIsIDB4QUQsIDB4NTcsIDB4ODUsIDB4Q0EsIDB4RTksIDB4MUEsIDB4QTEsIDB4MkEsIDB4RUIsIDB4NTMsIDB4MEYsDQorICAgIDB4NEUsIDB4MzMsIDB4RDgsIDB4RUUsIDB4QUQsIDB4NTIsIDB4NUYsIDB4QTQsIDB4NzUsIDB4NzUsIDB4RjUsIDB4NkYsDQorICAgIDB4MkIsIDB4RDIsIDB4MTksIDB4Q0IsIDB4QjcsIDB4RkEsIDB4RTcsIDB4QTcsIDB4NEUsIDB4ODIsIDB4QUEsIDB4RUQsDQorICAgIDB4OEQsIDB4NEUsIDB4RjQsIDB4ODgsIDB4RjEsIDB4MzQsIDB4QjYsIDB4OUMsIDB4RUQsIDB4NEUsIDB4RTQsIDB4OEMsDQorICAgIDB4NEEsIDB4NjEsIDB4MzksIDB4OEYsIDB4NEQsIDB4MkUsIDB4NkUsIDB4Q0UsIDB4MEQsIDB4NDgsIDB4NjksIDB4N0MsDQorICAgIDB4NjUsIDB4NDUsIDB4MTMsIDB4MjgsIDB4OUYsIDB4QjAsIDB4NjUsIDB4NjAsIDB4MzksIDB4QkYsIDB4REUsIDB4N0YsDQorICAgIDB4ODYsIDB4NjMsIDB4QTIsIDB4QzEsIDB4MzAsIDB4OEIsIDB4MjgsIDB4MEQsIDB4OEIsIDB4NDUsIDB4QkUsIDB4ODAsDQorICAgIDB4RDMsIDB4RTEsIDB4RTUsIDB4NjksIDB4NjcsIDB4NTEsIDB4REQsIDB4NzUsIDB4NTMsIDB4ODIsIDB4RjUsIDB4NkUsDQorICAgIDB4RjMsIDB4RDcsIDB4NjEsIDB4MzEsIDB4QTMsIDB4MTcsIDB4QzQsIDB4Q0IsIDB4NEYsIDB4QkUsIDB4NzIsIDB4QTksDQorICAgIDB4NkEsIDB4QjksIDB4MEIsIDB4RjgsIDB4RkEsIDB4RjEsIDB4RDEsIDB4MTAsIDB4QkMsIDB4QzAsIDB4NzUsIDB4NjYsDQorICAgIDB4OTksIDB4NjYsIDB4OUMsIDB4MDksIDB4QkUsIDB4MzIsIDB4QkQsIDB4MkYsIDB4RDIsIDB4RkMsIDB4M0IsIDB4MDgsDQorICAgIDB4OEQsIDB4MTIsIDB4QkYsIDB4MzUsIDB4QkYsIDB4RTcsIDB4OEIsIDB4MzEsIDB4NDUsIDB4NDMsIDB4RjYsIDB4MUYsDQorICAgIDB4QzIsIDB4ODAsIDB4QzIsIDB4NTcsIDB4QzYsIDB4RDUsIDB4MUEsIDB4QzIsIDB4OUUsIDB4MjQsIDB4NjMsIDB4NzgsDQorICAgIDB4NjMsIDB4NTYsIDB4MTMsIDB4Q0UsIDB4MDIsIDB4QzIsIDB4NUEsIDB4RDMsIDB4MjcsIDB4MjIsIDB4NEIsIDB4MkYsDQorICAgIDB4MDksIDB4M0EsIDB4MTYsIDB4NDksIDB4QzAsIDB4QkMsIDB4N0MsIDB4OEUsIDB4RUQsIDB4NTcsIDB4NEYsIDB4OTEsDQorICAgIDB4QkIsIDB4OEUsIDB4MEEsIDB4MjMsIDB4N0IsIDB4ODEsIDB4MjgsIDB4QTksIDB4QTcsIDB4NkIsIDB4NkUsIDB4MEEsDQorICAgIDB4Q0MsIDB4NDksIDB4M0UsIDB4MTksIDB4N0EsIDB4QkUsIDB4ODYsIDB4MzQsIDB4MTIsIDB4MUQsIDB4NDgsIDB4RUUsDQorICAgIDB4MjIsIDB4RTUsIDB4OTMsIDB4QTksIDB4NTgsIDB4RjIsIDB4NTQsIDB4NzMsIDB4RjgsIDB4NzYsIDB4Q0YsIDB4RjIsDQorICAgIDB4QTgsIDB4RjgsIDB4RDIsIDB4ODUsIDB4RTUsIDB4M0YsIDB4NUQsIDB4NDksIDB4QkUsIDB4MUJ9Ow0KIGNvbnN0IHVpbnQ4X3QgZ19pdElUX0xvY2FsZVtdID0gew0KLSAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweEQxLCAweDZBLCAweEQ0LCAweDQwLCAweDE0LCAweDdELCAweDE3LCAweEZDLCAweDg3LCAweDIxLCAweDU4LCAweDUwLCAweDY4LCAweDNCLCAweEZBLCAweEQ4LA0KLSAgICAweDkyLCAweDA2LCAweDRBLCAweDVCLCAweEJCLCAweEE1LCAweDQ2LCAweDk2LCAweEVFLCAweEFBLCAweEQ4LCAweDE3LCAweDk5LCAweDY0LCAweEE2LCAweEQ5LCAweEIxLCAweEM5LCAweENDLCAweDMyLA0KLSAgICAweDQ5LCAweDVBLCAweDkyLCAweDQ3LCAweEYxLCAweEMxLCAweDM3LCAweDdGLCAweDQyLCAweDEwLCAweDQxLCAweEYxLCAweDIzLCAweEZDLCAweDEzLCAweEExLCAweEUyLCAweDY3LCAweDc4LCAweEIzLA0KLSAgICAweDk5LCAweEE0LCAweEM5LCAweDY0LCAweEJBLCAweEE2LCAweDc5LCAweEQ5LCAweEI5LCAweEU3LCAweDlFLCAweDczLCAweDczLCAweEVGLCAweDk5LCAweDY0LCAweDM2LCAweDZFLCAweDJDLCAweDQzLA0KLSAgICAweDEyLCAweDMzLCAweDI0LCAweDQ4LCAweEMyLCAweEY2LCAweDFDLCAweDlFLCAweEJELCAweDNCLCAweDk5LCAweDNCLCAweDg4LCAweEIyLCAweDM0LCAweERDLCAweDczLCAweEZFLCAweDdDLCAweEZDLA0KLSAgICAweDdDLCAweEYzLCAweEU1LCAweEVCLCAweENELCAweEE3LCAweDZGLCAweDdGLCAweDdGLCAweEZFLCAweDc4LCAweERDLCAweDA2LCAweDRGLCAweDFDLCAweENGLCAweEFELCAweDE0LCAweDgyLCAweDEyLA0KLSAgICAweDM1LCAweDJCLCAweDkyLCAweDQwLCAweEM2LCAweEE5LCAweDE2LCAweDQ3LCAweDhBLCAweDQ1LCAweDUyLCAweDcxLCAweDIyLCAweDgwLCAweDkxLCAweDQ4LCAweDkxLCAweDJELCAweDVFLCAweDAyLA0KLSAgICAweDlDLCAweEVBLCAweEI1LCAweDE3LCAweDMxLCAweDIxLCAweDA4LCAweDk3LCAweDJFLCAweEFFLCAweEMzLCAweDg3LCAweDBGLCAweDM0LCAweDdFLCAweEMxLCAweDgyLCAweDQwLCAweEQ5LCAweDEyLA0KLSAgICAweDA5LCAweDUxLCAweEU1LCAweDEwLCAweDI1LCAweDRCLCAweEM1LCAweDYzLCAweDY2LCAweDIxLCAweDQ3LCAweDkxLCAweEE1LCAweDQ2LCAweEM0LCAweEYzLCAweDQ4LCAweDBDLCAweEUxLCAweDM4LA0KLSAgICAweDhGLCAweDYyLCAweDBCLCAweDlCLCAweDQ0LCAweDMyLCAweENELCAweDg2LCAweDcwLCAweENBLCAweEIyLCAweDhDLCAweDI1LCAweDgxLCAweDFBLCAweERFLCAweDU1LCAweDY2LCAweDk5LCAweEI0LA0KLSAgICAweEUxLCAweDQyLCAweDVFLCAweEQ5LCAweDA1LCAweDk0LCAweDg3LCAweDY2LCAweDAyLCAweDc3LCAweEFDLCAweDZBLCAweDc4LCAweEFCLCAweDA4LCAweDExLCAweDMwLCAweDY2LCAweENGLCAweDc5LA0KLSAgICAweEU2LCAweDc0LCAweDFDLCAweEI0LCAweEI5LCAweDY3LCAweDMzLCAweENFLCAweDY2LCAweDlCLCAweENELCAweDMzLCAweDlCLCAweDYxLCAweDM2LCAweEI3LCAweDZDLCAweDU2LCAweEQ5LCAweDdDLA0KLSAgICAweEIyLCAweDM5LCAweDY0LCAweDczLCAweEM3LCAweDY2LCAweENDLCAweERELCAweDlFLCAweDUwLCAweDUyLCAweEU4LCAweDQ3LCAweDA5LCAweDU2LCAweDFFLCAweDk1LCAweDA5LCAweDEzLCAweDNDLA0KLSAgICAweDI0LCAweDJFLCAweEFFLCAweEEyLCAweDNBLCAweDBELCAweDNELCAweDBBLCAweDQ2LCAweDdGLCAweDdELCAweEVGLCAweDYxLCAweEUwLCAweDQzLCAweDM2LCAweDA0LCAweDk5LCAweDBBLCAweDY1LA0KLSAgICAweDNDLCAweDgwLCAweEUxLCAweEUxLCAweEI5LCAweDFBLCAweDgwLCAweDU3LCAweDRDLCAweDMwLCAweDY1LCAweDgyLCAweDI5LCAweDA5LCAweDQ4LCAweEY1LCAweDkwLCAweDY4LCAweDA4LCAweEI3LA0KLSAgICAweENELCAweDc1LCAweDFBLCAweEVELCAweDZDLCAweDlELCAweEVFLCAweEQ4LCAweDZDLCAweEQ2LCAweDZDLCAweEQ0LCAweEVDLCAweEQxLCAweDZDLCAweENFLCAweEVDLCAweENCLCAweDZDLCAweEM5LA0KLSAgICAweERFLCAweDBGLCAweDE0LCAweEUyLCAweDk0LCAweEIzLCAweEE0LCAweDc5LCAweDExLCAweDc1LCAweEU4LCAweEVELCAweEZCLCAweDYwLCAweDcxLCAweDEzLCAweDc0LCAweDc4LCAweERFLCAweEQ0LA0KLSAgICAweDQ4LCAweEUwLCAweDdFLCAweDA1LCAweDQwLCAweDk4LCAweDIyLCAweEJBLCAweDFBLCAweEFDLCAweDNDLCAweDcyLCAweEUwLCAweEUyLCAweEVBLCAweEI3LCAweDRFLCAweDc4LCAweEY0LCAweDM2LA0KLSAgICAweEM0LCAweDJELCAweEIxLCAweDBBLCAweDhDLCAweDAzLCAweEEzLCAweDZFLCAweDNDLCAweDYzLCAweDUzLCAweDAyLCAweDZGLCAweDk2LCAweDEyLCAweEFCLCAweDhELCAweDZELCAweDIzLCAweDdELA0KLSAgICAweDlBLCAweDVDLCAweEU0LCAweDcxLCAweEVDLCAweDc4LCAweDQ3LCAweDcwLCAweEExLCAweDQzLCAweEU0LCAweEMzLCAweDg1LCAweERFLCAweEMyLCAweDU1LCAweENELCAweEQ3LCAweDMyLCAweDhELA0KLSAgICAweDMyLCAweDVBLCAweDE4LCAweDRCLCAweDExLCAweDM5LCAweERFLCAweEUxLCAweEZELCAweDQ0LCAweDA5LCAweEEzLCAweDk1LCAweDA2LCAweDgzLCAweDA0LCAweDhGLCAweDEyLCAweEE0LCAweDBCLA0KLSAgICAweEE5LCAweDMyLCAweDJELCAweEIxLCAweDI5LCAweDcwLCAweDZGLCAweDNFLCAweDAwLCAweDMyLCAweDlFLCAweDc0LCAweEU2LCAweEVELCAweDQ0LCAweEJELCAweDc5LCAweDI3LCAweDkzLCAweDVELA0KLSAgICAweERGLCAweERGLCAweDlELCAweENELCAweEQwLCAweEI5LCAweDhCLCAweDNCLCAweDFDLCAweEEzLCAweDQwLCAweDZGLCAweEQyLCAweEZCLCAweDI4LCAweDU2LCAweDYzLCAweDM2LCAweEY3LCAweDE4LA0KLSAgICAweEMxLCAweEQ3LCAweDUzLCAweEFFLCAweDE0LCAweDAzLCAweDNBLCAweEVFLCAweDhELCAweEE0LCAweDVELCAweDlBLCAweDAzLCAweEQ2LCAweEVDLCAweEYyLCAweDcxLCAweEUxLCAweEQzLCAweENCLA0KLSAgICAweDQ5LCAweDkyLCAweENFLCAweDhFLCAweDBFLCAweDlGLCAweDVGLCAweEJGLCAweDIxLCAweDhCLCAweEQzLCAweEYyLCAweEJDLCAweEY2LCAweEE1LCAweDRCLCAweDAyLCAweDlELCAweEM4LCAweDkzLA0KLSAgICAweDgwLCAweEE5LCAweDVCLCAweDczLCAweDdBLCAweEIxLCAweEVFLCAweDA0LCAweDMwLCAweDc4LCAweDE0LCAweDQzLCAweEM3LCAweDJCLCAweDM3LCAweENCLCAweDcyLCAweDY3LCAweEJCLCAweDJDLA0KLSAgICAweDRCLCAweDE3LCAweEY3LCAweDc4LCAweDgzLCAweDQyLCAweDVBLCAweDE4LCAweEU2LCAweDRBLCAweDMxLCAweDExLCAweDE2LCAweDhFLCAweEY3LCAweDA4LCAweEQ1LCAweERBLCAweDlELCAweDlELA0KLSAgICAweDkxLCAweEQyLCAweDI1LCAweDlDLCAweDE1LCAweDRDLCAweDY0LCAweEZBLCAweDlFLCAweDFCLCAweDE2LCAweDE1LCAweDM2LCAweDVBLCAweDZGLCAweDBCLCAweDM1LCAweEQzLCAweEY1LCAweDQyLA0KLSAgICAweDVELCAweDk2LCAweEIyLCAweDkwLCAweDI3LCAweDA0LCAweDM2LCAweDdCLCAweEIzLCAweEQxLCAweEQ3LCAweDY5LCAweDUzLCAweERELCAweEZFLCAweEFELCAweENBLCAweDdDLCAweEM5LCAweEFCLA0KLSAgICAweDlELCAweERFLCAweDFFLCAweEM1LCAweDZGLCAweEJCLCAweERFLCAweDE4LCAweDQ1LCAweDRGLCAweEI4LCAweEM4LCAweDUzLCAweEM3LCAweERCLCAweDFBLCAweDQ1LCAweDJFLCAweDk5LCAweDkyLA0KLSAgICAweDhFLCAweEY3LCAweDc0LCAweEM4LCAweEM1LCAweEZELCAweEIxLCAweDAxLCAweDY5LCAweDdDLCAweDZGLCAweDlELCAweEU4LCAweDAzLCAweENELCAweDAzLCAweEI2LCAweDBBLCAweDFDLCAweEVGLA0KLSAgICAweEY3LCAweDA3LCAweDM4LCAweDY1LCAweEZCLCAweDhDLCAweDYxLCAweDkxLCAweEU2LCAweDIzLCAweDI1LCAweDk1LCAweEQ1LCAweDAyLCAweDBFLCAweDg3LCAweDU3LCAweDY3LCAweEEzLCAweDQ1LA0KLSAgICAweDVELCAweEQzLCAweDg3LCAweDEyLCAweDZDLCAweDc2LCAweDVCLCAweEJELCAweDBELCAweEM1LCAweDkyLCAweDVELCAweDkwLCAweEIwLCAweDNBLCAweEVBLCAweDlBLCAweEE1LCAweEFFLCAweEU1LA0KLSAgICAweDE3LCAweEYwLCAweDk1LCAweDQzLCAweEQxLCAweDE0LCAweEJDLCAweEMwLCAweDVELCAweDY2LCAweDkzLCAweEU2LCAweDgyLCAweDRCLCAweDcxLCAweDY3LCAweEZBLCAweDQwLCAweEU2LCAweDhBLA0KLSAgICAweDMzLCAweDg1LCAweDY2LCAweDE5LCAweEI1LCAweEU2LCAweEY3LCAweEE5LCAweDBDLCAweDE4LCAweDlBLCAweEYyLCAweEZGLCAweDEwLCAweDI2LCAweDBDLCAweEJFLCAweDIzLCAweEFFLCAweEQ3LA0KLSAgICAweDEwLCAweEY2LCAweDE1LCAweDA5LCAweEUwLCAweDg1LCAweEI5LCAweDlCLCAweDMwLCAweDVGLCAweDEwLCAweDZFLCAweDRELCAweDlGLCAweENBLCAweDMyLCAweEJGLCAweDI0LCAweEU4LCAweDU4LA0KLSAgICAweDY2LCAweDBCLCAweDFFLCAweDU2LCAweDczLCAweDZDLCAweEJELCAweDNFLCAweDQxLCAweEZFLCAweDNBLCAweDJBLCAweDhDLCAweDFDLCAweDJFLCAweDY0LCAweDQzLCAweDNELCAweDVCLCAweDczLA0KLSAgICAweDUzLCAweDYwLCAweDQ2LCAweEQ1LCAweDY0LCAweEU4LCAweEM1LCAweDFBLCAweEQyLCAweDRDLCAweDhFLCAweDIwLCAweEY5LCAweDQ1LCAweDJFLCAweEEyLCAweEY3LCAweDcyLCAweEM1LCAweEQzLA0KLSAgICAweENELCAweEUxLCAweERCLCAweDNELCAweEFCLCAweEEyLCAweEZBLCAweEQzLCAweDE2LCAweDk2LCAweEZGLCAweDAwLCAweDIwLCAweDhCLCAweEJFLCAweEY3DQotfTsNCisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2QSwgMHhENCwgMHg0MCwgMHgxNCwgMHg3RCwgMHgxNywgMHhGQywNCisgICAgMHg4NywgMHgyMSwgMHg1OCwgMHg1MCwgMHg2OCwgMHgzQiwgMHhGQSwgMHhEOCwgMHg5MiwgMHgwNiwgMHg0QSwgMHg1QiwNCisgICAgMHhCQiwgMHhBNSwgMHg0NiwgMHg5NiwgMHhFRSwgMHhBQSwgMHhEOCwgMHgxNywgMHg5OSwgMHg2NCwgMHhBNiwgMHhEOSwNCisgICAgMHhCMSwgMHhDOSwgMHhDQywgMHgzMiwgMHg0OSwgMHg1QSwgMHg5MiwgMHg0NywgMHhGMSwgMHhDMSwgMHgzNywgMHg3RiwNCisgICAgMHg0MiwgMHgxMCwgMHg0MSwgMHhGMSwgMHgyMywgMHhGQywgMHgxMywgMHhBMSwgMHhFMiwgMHg2NywgMHg3OCwgMHhCMywNCisgICAgMHg5OSwgMHhBNCwgMHhDOSwgMHg2NCwgMHhCQSwgMHhBNiwgMHg3OSwgMHhEOSwgMHhCOSwgMHhFNywgMHg5RSwgMHg3MywNCisgICAgMHg3MywgMHhFRiwgMHg5OSwgMHg2NCwgMHgzNiwgMHg2RSwgMHgyQywgMHg0MywgMHgxMiwgMHgzMywgMHgyNCwgMHg0OCwNCisgICAgMHhDMiwgMHhGNiwgMHgxQywgMHg5RSwgMHhCRCwgMHgzQiwgMHg5OSwgMHgzQiwgMHg4OCwgMHhCMiwgMHgzNCwgMHhEQywNCisgICAgMHg3MywgMHhGRSwgMHg3QywgMHhGQywgMHg3QywgMHhGMywgMHhFNSwgMHhFQiwgMHhDRCwgMHhBNywgMHg2RiwgMHg3RiwNCisgICAgMHg3RiwgMHhGRSwgMHg3OCwgMHhEQywgMHgwNiwgMHg0RiwgMHgxQywgMHhDRiwgMHhBRCwgMHgxNCwgMHg4MiwgMHgxMiwNCisgICAgMHgzNSwgMHgyQiwgMHg5MiwgMHg0MCwgMHhDNiwgMHhBOSwgMHgxNiwgMHg0NywgMHg4QSwgMHg0NSwgMHg1MiwgMHg3MSwNCisgICAgMHgyMiwgMHg4MCwgMHg5MSwgMHg0OCwgMHg5MSwgMHgyRCwgMHg1RSwgMHgwMiwgMHg5QywgMHhFQSwgMHhCNSwgMHgxNywNCisgICAgMHgzMSwgMHgyMSwgMHgwOCwgMHg5NywgMHgyRSwgMHhBRSwgMHhDMywgMHg4NywgMHgwRiwgMHgzNCwgMHg3RSwgMHhDMSwNCisgICAgMHg4MiwgMHg0MCwgMHhEOSwgMHgxMiwgMHgwOSwgMHg1MSwgMHhFNSwgMHgxMCwgMHgyNSwgMHg0QiwgMHhDNSwgMHg2MywNCisgICAgMHg2NiwgMHgyMSwgMHg0NywgMHg5MSwgMHhBNSwgMHg0NiwgMHhDNCwgMHhGMywgMHg0OCwgMHgwQywgMHhFMSwgMHgzOCwNCisgICAgMHg4RiwgMHg2MiwgMHgwQiwgMHg5QiwgMHg0NCwgMHgzMiwgMHhDRCwgMHg4NiwgMHg3MCwgMHhDQSwgMHhCMiwgMHg4QywNCisgICAgMHgyNSwgMHg4MSwgMHgxQSwgMHhERSwgMHg1NSwgMHg2NiwgMHg5OSwgMHhCNCwgMHhFMSwgMHg0MiwgMHg1RSwgMHhEOSwNCisgICAgMHgwNSwgMHg5NCwgMHg4NywgMHg2NiwgMHgwMiwgMHg3NywgMHhBQywgMHg2QSwgMHg3OCwgMHhBQiwgMHgwOCwgMHgxMSwNCisgICAgMHgzMCwgMHg2NiwgMHhDRiwgMHg3OSwgMHhFNiwgMHg3NCwgMHgxQywgMHhCNCwgMHhCOSwgMHg2NywgMHgzMywgMHhDRSwNCisgICAgMHg2NiwgMHg5QiwgMHhDRCwgMHgzMywgMHg5QiwgMHg2MSwgMHgzNiwgMHhCNywgMHg2QywgMHg1NiwgMHhEOSwgMHg3QywNCisgICAgMHhCMiwgMHgzOSwgMHg2NCwgMHg3MywgMHhDNywgMHg2NiwgMHhDQywgMHhERCwgMHg5RSwgMHg1MCwgMHg1MiwgMHhFOCwNCisgICAgMHg0NywgMHgwOSwgMHg1NiwgMHgxRSwgMHg5NSwgMHgwOSwgMHgxMywgMHgzQywgMHgyNCwgMHgyRSwgMHhBRSwgMHhBMiwNCisgICAgMHgzQSwgMHgwRCwgMHgzRCwgMHgwQSwgMHg0NiwgMHg3RiwgMHg3RCwgMHhFRiwgMHg2MSwgMHhFMCwgMHg0MywgMHgzNiwNCisgICAgMHgwNCwgMHg5OSwgMHgwQSwgMHg2NSwgMHgzQywgMHg4MCwgMHhFMSwgMHhFMSwgMHhCOSwgMHgxQSwgMHg4MCwgMHg1NywNCisgICAgMHg0QywgMHgzMCwgMHg2NSwgMHg4MiwgMHgyOSwgMHgwOSwgMHg0OCwgMHhGNSwgMHg5MCwgMHg2OCwgMHgwOCwgMHhCNywNCisgICAgMHhDRCwgMHg3NSwgMHgxQSwgMHhFRCwgMHg2QywgMHg5RCwgMHhFRSwgMHhEOCwgMHg2QywgMHhENiwgMHg2QywgMHhENCwNCisgICAgMHhFQywgMHhEMSwgMHg2QywgMHhDRSwgMHhFQywgMHhDQiwgMHg2QywgMHhDOSwgMHhERSwgMHgwRiwgMHgxNCwgMHhFMiwNCisgICAgMHg5NCwgMHhCMywgMHhBNCwgMHg3OSwgMHgxMSwgMHg3NSwgMHhFOCwgMHhFRCwgMHhGQiwgMHg2MCwgMHg3MSwgMHgxMywNCisgICAgMHg3NCwgMHg3OCwgMHhERSwgMHhENCwgMHg0OCwgMHhFMCwgMHg3RSwgMHgwNSwgMHg0MCwgMHg5OCwgMHgyMiwgMHhCQSwNCisgICAgMHgxQSwgMHhBQywgMHgzQywgMHg3MiwgMHhFMCwgMHhFMiwgMHhFQSwgMHhCNywgMHg0RSwgMHg3OCwgMHhGNCwgMHgzNiwNCisgICAgMHhDNCwgMHgyRCwgMHhCMSwgMHgwQSwgMHg4QywgMHgwMywgMHhBMywgMHg2RSwgMHgzQywgMHg2MywgMHg1MywgMHgwMiwNCisgICAgMHg2RiwgMHg5NiwgMHgxMiwgMHhBQiwgMHg4RCwgMHg2RCwgMHgyMywgMHg3RCwgMHg5QSwgMHg1QywgMHhFNCwgMHg3MSwNCisgICAgMHhFQywgMHg3OCwgMHg0NywgMHg3MCwgMHhBMSwgMHg0MywgMHhFNCwgMHhDMywgMHg4NSwgMHhERSwgMHhDMiwgMHg1NSwNCisgICAgMHhDRCwgMHhENywgMHgzMiwgMHg4RCwgMHgzMiwgMHg1QSwgMHgxOCwgMHg0QiwgMHgxMSwgMHgzOSwgMHhERSwgMHhFMSwNCisgICAgMHhGRCwgMHg0NCwgMHgwOSwgMHhBMywgMHg5NSwgMHgwNiwgMHg4MywgMHgwNCwgMHg4RiwgMHgxMiwgMHhBNCwgMHgwQiwNCisgICAgMHhBOSwgMHgzMiwgMHgyRCwgMHhCMSwgMHgyOSwgMHg3MCwgMHg2RiwgMHgzRSwgMHgwMCwgMHgzMiwgMHg5RSwgMHg3NCwNCisgICAgMHhFNiwgMHhFRCwgMHg0NCwgMHhCRCwgMHg3OSwgMHgyNywgMHg5MywgMHg1RCwgMHhERiwgMHhERiwgMHg5RCwgMHhDRCwNCisgICAgMHhEMCwgMHhCOSwgMHg4QiwgMHgzQiwgMHgxQywgMHhBMywgMHg0MCwgMHg2RiwgMHhEMiwgMHhGQiwgMHgyOCwgMHg1NiwNCisgICAgMHg2MywgMHgzNiwgMHhGNywgMHgxOCwgMHhDMSwgMHhENywgMHg1MywgMHhBRSwgMHgxNCwgMHgwMywgMHgzQSwgMHhFRSwNCisgICAgMHg4RCwgMHhBNCwgMHg1RCwgMHg5QSwgMHgwMywgMHhENiwgMHhFQywgMHhGMiwgMHg3MSwgMHhFMSwgMHhEMywgMHhDQiwNCisgICAgMHg0OSwgMHg5MiwgMHhDRSwgMHg4RSwgMHgwRSwgMHg5RiwgMHg1RiwgMHhCRiwgMHgyMSwgMHg4QiwgMHhEMywgMHhGMiwNCisgICAgMHhCQywgMHhGNiwgMHhBNSwgMHg0QiwgMHgwMiwgMHg5RCwgMHhDOCwgMHg5MywgMHg4MCwgMHhBOSwgMHg1QiwgMHg3MywNCisgICAgMHg3QSwgMHhCMSwgMHhFRSwgMHgwNCwgMHgzMCwgMHg3OCwgMHgxNCwgMHg0MywgMHhDNywgMHgyQiwgMHgzNywgMHhDQiwNCisgICAgMHg3MiwgMHg2NywgMHhCQiwgMHgyQywgMHg0QiwgMHgxNywgMHhGNywgMHg3OCwgMHg4MywgMHg0MiwgMHg1QSwgMHgxOCwNCisgICAgMHhFNiwgMHg0QSwgMHgzMSwgMHgxMSwgMHgxNiwgMHg4RSwgMHhGNywgMHgwOCwgMHhENSwgMHhEQSwgMHg5RCwgMHg5RCwNCisgICAgMHg5MSwgMHhEMiwgMHgyNSwgMHg5QywgMHgxNSwgMHg0QywgMHg2NCwgMHhGQSwgMHg5RSwgMHgxQiwgMHgxNiwgMHgxNSwNCisgICAgMHgzNiwgMHg1QSwgMHg2RiwgMHgwQiwgMHgzNSwgMHhEMywgMHhGNSwgMHg0MiwgMHg1RCwgMHg5NiwgMHhCMiwgMHg5MCwNCisgICAgMHgyNywgMHgwNCwgMHgzNiwgMHg3QiwgMHhCMywgMHhEMSwgMHhENywgMHg2OSwgMHg1MywgMHhERCwgMHhGRSwgMHhBRCwNCisgICAgMHhDQSwgMHg3QywgMHhDOSwgMHhBQiwgMHg5RCwgMHhERSwgMHgxRSwgMHhDNSwgMHg2RiwgMHhCQiwgMHhERSwgMHgxOCwNCisgICAgMHg0NSwgMHg0RiwgMHhCOCwgMHhDOCwgMHg1MywgMHhDNywgMHhEQiwgMHgxQSwgMHg0NSwgMHgyRSwgMHg5OSwgMHg5MiwNCisgICAgMHg4RSwgMHhGNywgMHg3NCwgMHhDOCwgMHhDNSwgMHhGRCwgMHhCMSwgMHgwMSwgMHg2OSwgMHg3QywgMHg2RiwgMHg5RCwNCisgICAgMHhFOCwgMHgwMywgMHhDRCwgMHgwMywgMHhCNiwgMHgwQSwgMHgxQywgMHhFRiwgMHhGNywgMHgwNywgMHgzOCwgMHg2NSwNCisgICAgMHhGQiwgMHg4QywgMHg2MSwgMHg5MSwgMHhFNiwgMHgyMywgMHgyNSwgMHg5NSwgMHhENSwgMHgwMiwgMHgwRSwgMHg4NywNCisgICAgMHg1NywgMHg2NywgMHhBMywgMHg0NSwgMHg1RCwgMHhEMywgMHg4NywgMHgxMiwgMHg2QywgMHg3NiwgMHg1QiwgMHhCRCwNCisgICAgMHgwRCwgMHhDNSwgMHg5MiwgMHg1RCwgMHg5MCwgMHhCMCwgMHgzQSwgMHhFQSwgMHg5QSwgMHhBNSwgMHhBRSwgMHhFNSwNCisgICAgMHgxNywgMHhGMCwgMHg5NSwgMHg0MywgMHhEMSwgMHgxNCwgMHhCQywgMHhDMCwgMHg1RCwgMHg2NiwgMHg5MywgMHhFNiwNCisgICAgMHg4MiwgMHg0QiwgMHg3MSwgMHg2NywgMHhGQSwgMHg0MCwgMHhFNiwgMHg4QSwgMHgzMywgMHg4NSwgMHg2NiwgMHgxOSwNCisgICAgMHhCNSwgMHhFNiwgMHhGNywgMHhBOSwgMHgwQywgMHgxOCwgMHg5QSwgMHhGMiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwQywNCisgICAgMHhCRSwgMHgyMywgMHhBRSwgMHhENywgMHgxMCwgMHhGNiwgMHgxNSwgMHgwOSwgMHhFMCwgMHg4NSwgMHhCOSwgMHg5QiwNCisgICAgMHgzMCwgMHg1RiwgMHgxMCwgMHg2RSwgMHg0RCwgMHg5RiwgMHhDQSwgMHgzMiwgMHhCRiwgMHgyNCwgMHhFOCwgMHg1OCwNCisgICAgMHg2NiwgMHgwQiwgMHgxRSwgMHg1NiwgMHg3MywgMHg2QywgMHhCRCwgMHgzRSwgMHg0MSwgMHhGRSwgMHgzQSwgMHgyQSwNCisgICAgMHg4QywgMHgxQywgMHgyRSwgMHg2NCwgMHg0MywgMHgzRCwgMHg1QiwgMHg3MywgMHg1MywgMHg2MCwgMHg0NiwgMHhENSwNCisgICAgMHg2NCwgMHhFOCwgMHhDNSwgMHgxQSwgMHhEMiwgMHg0QywgMHg4RSwgMHgyMCwgMHhGOSwgMHg0NSwgMHgyRSwgMHhBMiwNCisgICAgMHhGNywgMHg3MiwgMHhDNSwgMHhEMywgMHhDRCwgMHhFMSwgMHhEQiwgMHgzRCwgMHhBQiwgMHhBMiwgMHhGQSwgMHhEMywNCisgICAgMHgxNiwgMHg5NiwgMHhGRiwgMHgwMCwgMHgyMCwgMHg4QiwgMHhCRSwgMHhGN307DQogY29uc3QgdWludDhfdCBnX3B0QlJfTG9jYWxlW10gPSB7DQotICAgIDB4NzgsIDB4OUMsIDB4OUQsIDB4NTYsIDB4M0QsIDB4NkYsIDB4RDQsIDB4NDAsIDB4MTAsIDB4QUQsIDB4ODMsIDB4QzQsIDB4N0YsIDB4NTgsIDB4NTksIDB4ODksIDB4MEUsIDB4QTQsIDB4MjQsIDB4ODYsDQotICAgIDB4OTIsIDB4QzgsIDB4NjcsIDB4RTksIDB4OTIsIDB4MEIsIDB4MzksIDB4OTQsIDB4MTgsIDB4OUQsIDB4Q0UsIDB4MTEsIDB4ODgsIDB4MzQsIDB4NjgsIDB4NkQsIDB4RUYsIDB4RDksIDB4OUIsIDB4RDgsDQotICAgIDB4QkIsIDB4QzcsIDB4REEsIDB4NEUsIDB4QjAsIDB4NkIsIDB4MUEsIDB4M0EsIDB4MjgsIDB4MjksIDB4NTMsIDB4MjAsIDB4MkEsIDB4NDQsIDB4ODMsIDB4NDQsIDB4NDksIDB4OTEsIDB4REYsIDB4ODIsDQotICAgIDB4QjgsIDB4OUYsIDB4QzEsIDB4RkEsIDB4RjMsIDB4RkMsIDB4QjEsIDB4MzYsIDB4MDYsIDB4MzcsIDB4REUsIDB4OTksIDB4NzksIDB4NkYsIDB4M0QsIDB4RjMsIDB4NzYsIDB4NzYsIDB4NjQsIDB4QzUsDQotICAgIDB4QTUsIDB4MjYsIDB4NzQsIDB4MTEsIDB4MjAsIDB4RDAsIDB4NDMsIDB4NjMsIDB4NjksIDB4MTUsIDB4QkMsIDB4M0UsIDB4NUMsIDB4NDgsIDB4QzAsIDB4NDIsIDB4QkUsIDB4MzksIDB4OTYsIDB4RDYsDQotICAgIDB4MUYsIDB4NkYsIDB4RDcsIDB4MUYsIDB4REUsIDB4RkQsIDB4N0UsIDB4RkYsIDB4NjksIDB4RkQsIDB4RUQsIDB4RUIsIDB4ODMsIDB4NUYsIDB4M0YsIDB4QkUsIDB4QUYsIDB4M0YsIDB4RkYsIDB4N0MsDQotICAgIDB4MjgsIDB4QTksIDB4RjcsIDB4RUYsIDB4MDEsIDB4QTAsIDB4MjQsIDB4MTQsIDB4NjIsIDB4NDEsIDB4QTYsIDB4NDcsIDB4OUUsIDB4NDEsIDB4NUQsIDB4M0YsIDB4NjcsIDB4REIsIDB4MEMsIDB4RDksDQotICAgIDB4OTQsIDB4NjEsIDB4NDgsIDB4MTIsIDB4RDQsIDB4MTYsIDB4NTAsIDB4M0MsIDB4NEEsIDB4MDIsIDB4RTcsIDB4MzksIDB4MEYsIDB4RjksIDB4ODksIDB4QkQsIDB4OTUsIDB4RDksIDB4RUEsIDB4MjUsDQotICAgIDB4MjQsIDB4MDgsIDB4MzMsIDB4QUEsIDB4QzgsIDB4OTksIDB4NTksIDB4ODksIDB4MkMsIDB4RDEsIDB4MzUsIDB4NjIsIDB4MUQsIDB4MzEsIDB4MEYsIDB4QjIsIDB4QkIsIDB4MkYsIDB4QTIsIDB4MDAsDQotICAgIDB4MzQsIDB4MTgsIDB4NzYsIDB4ODUsIDB4MDQsIDB4MkMsIDB4ODIsIDB4NUYsIDB4ODYsIDB4QzQsIDB4MTEsIDB4RkIsIDB4NUQsIDB4QTEsIDB4MUYsIDB4REEsIDB4RDQsIDB4MEYsIDB4NDQsIDB4MDEsDQotICAgIDB4MUYsIDB4MDUsIDB4QzgsIDB4MzMsIDB4ODQsIDB4QjksIDB4RDIsIDB4MzAsIDB4MDgsIDB4QzUsIDB4MTEsIDB4NDIsIDB4QUYsIDB4QkIsIDB4NDgsIDB4MTYsIDB4OEEsIDB4OUIsIDB4MjEsIDB4OTAsDQotICAgIDB4QUYsIDB4NEIsIDB4MDksIDB4QUIsIDB4OTIsIDB4MDIsIDB4NjgsIDB4MTgsIDB4NkMsIDB4MkMsIDB4M0QsIDB4OTYsIDB4MUEsIDB4REEsIDB4OEEsIDB4NzUsIDB4MTUsIDB4MkIsIDB4MkEsIDB4OTYsDQotICAgIDB4NTMsIDB4MkMsIDB4QTYsIDB4NTgsIDB4NEIsIDB4QjEsIDB4OTIsIDB4NjIsIDB4MUQsIDB4QzUsIDB4MjIsIDB4OEEsIDB4RjUsIDB4MTMsIDB4NkIsIDB4MjcsIDB4OTYsIDB4QUQsIDB4NUYsIDB4MzEsDQotICAgIDB4MEIsIDB4NDYsIDB4OTUsIDB4MTYsIDB4RTQsIDB4OTYsIDB4NkEsIDB4NTEsIDB4MEYsIDB4OTMsIDB4MjQsIDB4OUQsIDB4QzQsIDB4MjgsIDB4QkQsIDB4M0UsIDB4QjIsIDB4NDMsIDB4REUsIDB4RDIsDQotICAgIDB4N0IsIDB4NEIsIDB4REUsIDB4ODAsIDB4QjAsIDB4MTEsIDB4MEIsIDB4MTAsIDB4NkYsIDB4M0UsIDB4NzEsIDB4RTgsIDB4NEQsIDB4MDgsIDB4NTksIDB4RDAsIDB4MTUsIDB4QzIsIDB4QTQsIDB4MjMsDQotICAgIDB4RTQsIDB4QTMsIDB4QjcsIDB4NUQsIDB4OTEsIDB4QkIsIDB4NUIsIDB4MDMsIDB4NUEsIDB4OUIsIDB4RTQsIDB4NDAsIDB4QkEsIDB4MTIsIDB4RDQsIDB4RDMsIDB4MzgsIDB4RkYsIDB4QkMsIDB4QjAsDQotICAgIDB4NzYsIDB4NTEsIDB4RUQsIDB4NTIsIDB4REEsIDB4MTUsIDB4QjQsIDB4MTMsIDB4NkYsIDB4RTcsIDB4MkIsIDB4QzgsIDB4QjMsIDB4M0IsIDB4NDksIDB4MEYsIDB4MzEsIDB4NkMsIDB4NjEsIDB4RTQsDQotICAgIDB4NTUsIDB4MkYsIDB4N0YsIDB4RUUsIDB4NTIsIDB4MjcsIDB4MUEsIDB4M0YsIDB4QTQsIDB4QzIsIDB4QTgsIDB4ODcsIDB4RTYsIDB4OEQsIDB4MTAsIDB4RDgsIDB4OTgsIDB4OTUsIDB4Q0QsIDB4MTEsDQotICAgIDB4ODMsIDB4OTUsIDB4N0QsIDB4QjksIDB4QTUsIDB4MUUsIDB4MUUsIDB4MjksIDB4NzIsIDB4RjIsIDB4MkUsIDB4MUQsIDB4OTMsIDB4NjksIDB4RTksIDB4MDAsIDB4RTksIDB4QUEsIDB4MjAsIDB4RjAsDQotICAgIDB4RDksIDB4MjUsIDB4MzcsIDB4ODYsIDB4NTcsIDB4RTYsIDB4QjUsIDB4NjAsIDB4ODAsIDB4RTYsIDB4MzAsIDB4RTAsIDB4RjIsIDB4OTAsIDB4NTIsIDB4RTgsIDB4RDIsIDB4OTMsIDB4Q0YsIDB4QjcsDQotICAgIDB4NjUsIDB4RTgsIDB4QkEsIDB4OTIsIDB4N0EsIDB4Q0MsIDB4OUYsIDB4NUQsIDB4MzAsIDB4MUQsIDB4RjEsIDB4MjksIDB4MDksIDB4NDYsIDB4MUEsIDB4N0YsIDB4QjIsIDB4RDUsIDB4MkIsIDB4RkUsDQotICAgIDB4MjQsIDB4MzIsIDB4OTQsIDB4QTQsIDB4QUUsIDB4NUQsIDB4NUMsIDB4NEEsIDB4NkMsIDB4NDksIDB4RkQsIDB4N0YsIDB4QkUsIDB4ODcsIDB4MkMsIDB4NEUsIDB4OUYsIDB4Q0EsIDB4OUEsIDB4MjYsDQotICAgIDB4MEYsIDB4RTYsIDB4RjgsIDB4MEUsIDB4NjUsIDB4QzEsIDB4ODYsIDB4RDUsIDB4RTQsIDB4MDAsIDB4NTAsIDB4RjMsIDB4RTQsIDB4OTIsIDB4MDQsIDB4RDgsIDB4NkIsIDB4NDgsIDB4NTIsIDB4RjEsDQotICAgIDB4RDQsIDB4MjQsIDB4OTksIDB4Q0QsIDB4NDYsIDB4MEUsIDB4MkYsIDB4NjUsIDB4QzQsIDB4RUYsIDB4RDUsIDB4NDgsIDB4RDcsIDB4NDcsIDB4RkUsIDB4MDgsIDB4NUMsIDB4MjgsIDB4NzIsIDB4MDUsDQotICAgIDB4REMsIDB4QzUsIDB4Q0UsIDB4QTQsIDB4NDgsIDB4QzksIDB4MTksIDB4NzcsIDB4MzgsIDB4MzUsIDB4NTUsIDB4NjEsIDB4MzYsIDB4M0IsIDB4RDAsIDB4QjQsIDB4MDMsIDB4NUQsIDB4MUYsIDB4QzQsDQotICAgIDB4QzgsIDB4MzUsIDB4NDgsIDB4MzksIDB4NEQsIDB4NDIsIDB4MjIsIDB4NDAsIDB4QTMsIDB4REMsIDB4QkMsIDB4MjcsIDB4Q0UsIDB4QjksIDB4QjcsIDB4NjgsIDB4OTQsIDB4OTMsIDB4NDgsIDB4QjMsDQotICAgIDB4QUUsIDB4NjYsIDB4OUUsIDB4QUYsIDB4MUYsIDB4NEYsIDB4OUYsIDB4REUsIDB4QkMsIDB4ODQsIDB4Q0UsIDB4NjksIDB4N0MsIDB4OTEsIDB4RTksIDB4NTYsIDB4MDUsIDB4QTUsIDB4NEMsIDB4MTIsDQotICAgIDB4N0EsIDB4MDYsIDB4NjIsIDB4NzUsIDB4RjEsIDB4NkEsIDB4QkUsIDB4M0MsIDB4MjcsIDB4RUUsIDB4RTMsIDB4RkQsIDB4NkQsIDB4NEEsIDB4NkEsIDB4QkMsIDB4MUIsIDB4QzcsIDB4NEYsIDB4RjYsDQotICAgIDB4RTMsIDB4OTgsIDB4MEYsIDB4QjMsIDB4MUEsIDB4QUUsIDB4OUIsIDB4NkEsIDB4ODYsIDB4OEMsIDB4MjEsIDB4NjIsIDB4NDYsIDB4OTIsIDB4QkEsIDB4MEQsIDB4MEEsIDB4RjYsIDB4NjAsIDB4RjIsDQotICAgIDB4MEEsIDB4MzEsIDB4MTMsIDB4OTEsIDB4MjAsIDB4RkYsIDB4RUUsIDB4NEUsIDB4OUIsIDB4OTcsIDB4MDgsIDB4RDIsIDB4MkEsIDB4QTIsIDB4MkMsIDB4NkMsIDB4NTMsIDB4RUIsIDB4NTYsIDB4REQsDQotICAgIDB4OTUsIDB4NkYsIDB4NkYsIDB4MjEsIDB4MTMsIDB4N0IsIDB4OTAsIDB4MzcsIDB4QzYsIDB4NkUsIDB4QjEsIDB4NEIsIDB4MTYsIDB4RUUsIDB4MjQsIDB4RDgsIDB4OEMsIDB4ODYsIDB4MkIsIDB4OUMsDQotICAgIDB4MzQsIDB4QzMsIDB4RkUsIDB4NDAsIDB4NDYsIDB4NTksIDB4QzEsIDB4Q0UsIDB4NDAsIDB4MDIsIDB4RUYsIDB4QUYsIDB4RDAsIDB4OTcsIDB4RDQsIDB4QkQsIDB4ODEsIDB4RjAsIDB4MTgsIDB4MzEsDQotICAgIDB4MkEsIDB4QTksIDB4OEYsIDB4NUEsIDB4RTgsIDB4OEQsIDB4MzAsIDB4QjUsIDB4MDMsIDB4MkYsIDB4NEUsIDB4QTMsIDB4QTYsIDB4NEMsIDB4REQsIDB4NTksIDB4QjQsIDB4NjEsIDB4NkEsIDB4NDgsDQotICAgIDB4RUEsIDB4NjIsIDB4OUIsIDB4NEYsIDB4QTIsIDB4MUEsIDB4QTAsIDB4ODcsIDB4ODQsIDB4N0QsIDB4OUEsIDB4MkMsIDB4MjQsIDB4RjUsIDB4NzAsIDB4NzEsIDB4RjYsIDB4MEYsIDB4QjQsIDB4RUEsDQotICAgIDB4MzksIDB4QjQsIDB4NDgsIDB4RTksIDB4MjgsIDB4NkMsIDB4QTUsIDB4OUQsIDB4REMsIDB4RkIsIDB4NjgsIDB4ODUsIDB4OTYsIDB4RDAsIDB4MkMsIDB4QzYsIDB4NkQsIDB4NjEsIDB4RTYsIDB4N0IsDQotICAgIDB4NkEsIDB4MTEsIDB4RkYsIDB4QzMsIDB4QjMsIDB4QzAsIDB4OUMsIDB4Q0IsIDB4MjMsIDB4OEIsIDB4MDEsIDB4OTgsIDB4NjAsIDB4NEEsIDB4N0EsIDB4MDAsIDB4NDcsIDB4MzQsIDB4NjQsIDB4MTgsDQotICAgIDB4MzEsIDB4QTAsIDB4MDcsIDB4NTYsIDB4MDcsIDB4NjIsIDB4NjIsIDB4NTEsIDB4MDMsIDB4ODEsIDB4MzksIDB4RkUsIDB4MkIsIDB4NjQsIDB4ODYsIDB4MEMsIDB4ODYsIDB4NkUsIDB4N0EsIDB4MjEsDQotICAgIDB4MTMsIDB4MDYsIDB4MEQsIDB4N0UsIDB4QzMsIDB4RkEsIDB4MjAsIDB4RTcsIDB4MEUsIDB4QzQsIDB4MUQsIDB4ODAsIDB4NTMsIDB4MUEsIDB4ODcsIDB4NTcsIDB4MTAsIDB4OUMsIDB4RDAsIDB4QzAsDQotICAgIDB4QzEsIDB4NjYsIDB4NTIsIDB4RDMsIDB4REUsIDB4OEIsIDB4NjcsIDB4NDAsIDB4RUIsIDB4MDcsIDB4NzMsIDB4MDEsIDB4NEMsIDB4ODcsIDB4MTYsIDB4RTAsIDB4NDUsIDB4RUYsIDB4QTcsIDB4MzksDQotICAgIDB4RDYsIDB4NEUsIDB4QUEsIDB4MDQsIDB4NjcsIDB4QkQsIDB4MzAsIDB4OUQsIDB4MEUsIDB4ODIsIDB4NjksIDB4NTEsIDB4NDgsIDB4RUMsIDB4NEIsIDB4OUEsIDB4MjIsIDB4QjMsIDB4MjQsIDB4RDMsDQotICAgIDB4QzEsIDB4NTYsIDB4MzksIDB4NEYsIDB4NDUsIDB4Q0UsIDB4RkUsIDB4RjcsIDB4RDUsIDB4M0YsIDB4MzAsIDB4QkIsIDB4RDksIDB4OUINCi19Ow0KKyAgICAweDc4LCAweDlDLCAweDlELCAweDU2LCAweDNELCAweDZGLCAweEQ0LCAweDQwLCAweDEwLCAweEFELCAweDgzLCAweEM0LA0KKyAgICAweDdGLCAweDU4LCAweDU5LCAweDg5LCAweDBFLCAweEE0LCAweDI0LCAweDg2LCAweDkyLCAweEM4LCAweDY3LCAweEU5LA0KKyAgICAweDkyLCAweDBCLCAweDM5LCAweDk0LCAweDE4LCAweDlELCAweENFLCAweDExLCAweDg4LCAweDM0LCAweDY4LCAweDZELA0KKyAgICAweEVGLCAweEQ5LCAweDlCLCAweEQ4LCAweEJCLCAweEM3LCAweERBLCAweDRFLCAweEIwLCAweDZCLCAweDFBLCAweDNBLA0KKyAgICAweDI4LCAweDI5LCAweDUzLCAweDIwLCAweDJBLCAweDQ0LCAweDgzLCAweDQ0LCAweDQ5LCAweDkxLCAweERGLCAweDgyLA0KKyAgICAweEI4LCAweDlGLCAweEMxLCAweEZBLCAweEYzLCAweEZDLCAweEIxLCAweDM2LCAweDA2LCAweDM3LCAweERFLCAweDk5LA0KKyAgICAweDc5LCAweDZGLCAweDNELCAweEYzLCAweDc2LCAweDc2LCAweDY0LCAweEM1LCAweEE1LCAweDI2LCAweDc0LCAweDExLA0KKyAgICAweDIwLCAweEQwLCAweDQzLCAweDYzLCAweDY5LCAweDE1LCAweEJDLCAweDNFLCAweDVDLCAweDQ4LCAweEMwLCAweDQyLA0KKyAgICAweEJFLCAweDM5LCAweDk2LCAweEQ2LCAweDFGLCAweDZGLCAweEQ3LCAweDFGLCAweERFLCAweEZELCAweDdFLCAweEZGLA0KKyAgICAweDY5LCAweEZELCAweEVELCAweEVCLCAweDgzLCAweDVGLCAweDNGLCAweEJFLCAweEFGLCAweDNGLCAweEZGLCAweDdDLA0KKyAgICAweDI4LCAweEE5LCAweEY3LCAweEVGLCAweDAxLCAweEEwLCAweDI0LCAweDE0LCAweDYyLCAweDQxLCAweEE2LCAweDQ3LA0KKyAgICAweDlFLCAweDQxLCAweDVELCAweDNGLCAweDY3LCAweERCLCAweDBDLCAweEQ5LCAweDk0LCAweDYxLCAweDQ4LCAweDEyLA0KKyAgICAweEQ0LCAweDE2LCAweDUwLCAweDNDLCAweDRBLCAweDAyLCAweEU3LCAweDM5LCAweDBGLCAweEY5LCAweDg5LCAweEJELA0KKyAgICAweDk1LCAweEQ5LCAweEVBLCAweDI1LCAweDI0LCAweDA4LCAweDMzLCAweEFBLCAweEM4LCAweDk5LCAweDU5LCAweDg5LA0KKyAgICAweDJDLCAweEQxLCAweDM1LCAweDYyLCAweDFELCAweDMxLCAweDBGLCAweEIyLCAweEJCLCAweDJGLCAweEEyLCAweDAwLA0KKyAgICAweDM0LCAweDE4LCAweDc2LCAweDg1LCAweDA0LCAweDJDLCAweDgyLCAweDVGLCAweDg2LCAweEM0LCAweDExLCAweEZCLA0KKyAgICAweDVELCAweEExLCAweDFGLCAweERBLCAweEQ0LCAweDBGLCAweDQ0LCAweDAxLCAweDFGLCAweDA1LCAweEM4LCAweDMzLA0KKyAgICAweDg0LCAweEI5LCAweEQyLCAweDMwLCAweDA4LCAweEM1LCAweDExLCAweDQyLCAweEFGLCAweEJCLCAweDQ4LCAweDE2LA0KKyAgICAweDhBLCAweDlCLCAweDIxLCAweDkwLCAweEFGLCAweDRCLCAweDA5LCAweEFCLCAweDkyLCAweDAyLCAweDY4LCAweDE4LA0KKyAgICAweDZDLCAweDJDLCAweDNELCAweDk2LCAweDFBLCAweERBLCAweDhBLCAweDc1LCAweDE1LCAweDJCLCAweDJBLCAweDk2LA0KKyAgICAweDUzLCAweDJDLCAweEE2LCAweDU4LCAweDRCLCAweEIxLCAweDkyLCAweDYyLCAweDFELCAweEM1LCAweDIyLCAweDhBLA0KKyAgICAweEY1LCAweDEzLCAweDZCLCAweDI3LCAweDk2LCAweEFELCAweDVGLCAweDMxLCAweDBCLCAweDQ2LCAweDk1LCAweDE2LA0KKyAgICAweEU0LCAweDk2LCAweDZBLCAweDUxLCAweDBGLCAweDkzLCAweDI0LCAweDlELCAweEM0LCAweDI4LCAweEJELCAweDNFLA0KKyAgICAweEIyLCAweDQzLCAweERFLCAweEQyLCAweDdCLCAweDRCLCAweERFLCAweDgwLCAweEIwLCAweDExLCAweDBCLCAweDEwLA0KKyAgICAweDZGLCAweDNFLCAweDcxLCAweEU4LCAweDRELCAweDA4LCAweDU5LCAweEQwLCAweDE1LCAweEMyLCAweEE0LCAweDIzLA0KKyAgICAweEU0LCAweEEzLCAweEI3LCAweDVELCAweDkxLCAweEJCLCAweDVCLCAweDAzLCAweDVBLCAweDlCLCAweEU0LCAweDQwLA0KKyAgICAweEJBLCAweDEyLCAweEQ0LCAweEQzLCAweDM4LCAweEZGLCAweEJDLCAweEIwLCAweDc2LCAweDUxLCAweEVELCAweDUyLA0KKyAgICAweERBLCAweDE1LCAweEI0LCAweDEzLCAweDZGLCAweEU3LCAweDJCLCAweEM4LCAweEIzLCAweDNCLCAweDQ5LCAweDBGLA0KKyAgICAweDMxLCAweDZDLCAweDYxLCAweEU0LCAweDU1LCAweDJGLCAweDdGLCAweEVFLCAweDUyLCAweDI3LCAweDFBLCAweDNGLA0KKyAgICAweEE0LCAweEMyLCAweEE4LCAweDg3LCAweEU2LCAweDhELCAweDEwLCAweEQ4LCAweDk4LCAweDk1LCAweENELCAweDExLA0KKyAgICAweDgzLCAweDk1LCAweDdELCAweEI5LCAweEE1LCAweDFFLCAweDFFLCAweDI5LCAweDcyLCAweEYyLCAweDJFLCAweDFELA0KKyAgICAweDkzLCAweDY5LCAweEU5LCAweDAwLCAweEU5LCAweEFBLCAweDIwLCAweEYwLCAweEQ5LCAweDI1LCAweDM3LCAweDg2LA0KKyAgICAweDU3LCAweEU2LCAweEI1LCAweDYwLCAweDgwLCAweEU2LCAweDMwLCAweEUwLCAweEYyLCAweDkwLCAweDUyLCAweEU4LA0KKyAgICAweEQyLCAweDkzLCAweENGLCAweEI3LCAweDY1LCAweEU4LCAweEJBLCAweDkyLCAweDdBLCAweENDLCAweDlGLCAweDVELA0KKyAgICAweDMwLCAweDFELCAweEYxLCAweDI5LCAweDA5LCAweDQ2LCAweDFBLCAweDdGLCAweEIyLCAweEQ1LCAweDJCLCAweEZFLA0KKyAgICAweDI0LCAweDMyLCAweDk0LCAweEE0LCAweEFFLCAweDVELCAweDVDLCAweDRBLCAweDZDLCAweDQ5LCAweEZELCAweDdGLA0KKyAgICAweEJFLCAweDg3LCAweDJDLCAweDRFLCAweDlGLCAweENBLCAweDlBLCAweDI2LCAweDBGLCAweEU2LCAweEY4LCAweDBFLA0KKyAgICAweDY1LCAweEMxLCAweDg2LCAweEQ1LCAweEU0LCAweDAwLCAweDUwLCAweEYzLCAweEU0LCAweDkyLCAweDA0LCAweEQ4LA0KKyAgICAweDZCLCAweDQ4LCAweDUyLCAweEYxLCAweEQ0LCAweDI0LCAweDk5LCAweENELCAweDQ2LCAweDBFLCAweDJGLCAweDY1LA0KKyAgICAweEM0LCAweEVGLCAweEQ1LCAweDQ4LCAweEQ3LCAweDQ3LCAweEZFLCAweDA4LCAweDVDLCAweDI4LCAweDcyLCAweDA1LA0KKyAgICAweERDLCAweEM1LCAweENFLCAweEE0LCAweDQ4LCAweEM5LCAweDE5LCAweDc3LCAweDM4LCAweDM1LCAweDU1LCAweDYxLA0KKyAgICAweDM2LCAweDNCLCAweEQwLCAweEI0LCAweDAzLCAweDVELCAweDFGLCAweEM0LCAweEM4LCAweDM1LCAweDQ4LCAweDM5LA0KKyAgICAweDRELCAweDQyLCAweDIyLCAweDQwLCAweEEzLCAweERDLCAweEJDLCAweDI3LCAweENFLCAweEI5LCAweEI3LCAweDY4LA0KKyAgICAweDk0LCAweDkzLCAweDQ4LCAweEIzLCAweEFFLCAweDY2LCAweDlFLCAweEFGLCAweDFGLCAweDRGLCAweDlGLCAweERFLA0KKyAgICAweEJDLCAweDg0LCAweENFLCAweDY5LCAweDdDLCAweDkxLCAweEU5LCAweDU2LCAweDA1LCAweEE1LCAweDRDLCAweDEyLA0KKyAgICAweDdBLCAweDA2LCAweDYyLCAweDc1LCAweEYxLCAweDZBLCAweEJFLCAweDNDLCAweDI3LCAweEVFLCAweEUzLCAweEZELA0KKyAgICAweDZELCAweDRBLCAweDZBLCAweEJDLCAweDFCLCAweEM3LCAweDRGLCAweEY2LCAweEUzLCAweDk4LCAweDBGLCAweEIzLA0KKyAgICAweDFBLCAweEFFLCAweDlCLCAweDZBLCAweDg2LCAweDhDLCAweDIxLCAweDYyLCAweDQ2LCAweDkyLCAweEJBLCAweDBELA0KKyAgICAweDBBLCAweEY2LCAweDYwLCAweEYyLCAweDBBLCAweDMxLCAweDEzLCAweDkxLCAweDIwLCAweEZGLCAweEVFLCAweDRFLA0KKyAgICAweDlCLCAweDk3LCAweDA4LCAweEQyLCAweDJBLCAweEEyLCAweDJDLCAweDZDLCAweDUzLCAweEVCLCAweDU2LCAweERELA0KKyAgICAweDk1LCAweDZGLCAweDZGLCAweDIxLCAweDEzLCAweDdCLCAweDkwLCAweDM3LCAweEM2LCAweDZFLCAweEIxLCAweDRCLA0KKyAgICAweDE2LCAweEVFLCAweDI0LCAweEQ4LCAweDhDLCAweDg2LCAweDJCLCAweDlDLCAweDM0LCAweEMzLCAweEZFLCAweDQwLA0KKyAgICAweDQ2LCAweDU5LCAweEMxLCAweENFLCAweDQwLCAweDAyLCAweEVGLCAweEFGLCAweEQwLCAweDk3LCAweEQ0LCAweEJELA0KKyAgICAweDgxLCAweEYwLCAweDE4LCAweDMxLCAweDJBLCAweEE5LCAweDhGLCAweDVBLCAweEU4LCAweDhELCAweDMwLCAweEI1LA0KKyAgICAweDAzLCAweDJGLCAweDRFLCAweEEzLCAweEE2LCAweDRDLCAweERELCAweDU5LCAweEI0LCAweDYxLCAweDZBLCAweDQ4LA0KKyAgICAweEVBLCAweDYyLCAweDlCLCAweDRGLCAweEEyLCAweDFBLCAweEEwLCAweDg3LCAweDg0LCAweDdELCAweDlBLCAweDJDLA0KKyAgICAweDI0LCAweEY1LCAweDcwLCAweDcxLCAweEY2LCAweDBGLCAweEI0LCAweEVBLCAweDM5LCAweEI0LCAweDQ4LCAweEU5LA0KKyAgICAweDI4LCAweDZDLCAweEE1LCAweDlELCAweERDLCAweEZCLCAweDY4LCAweDg1LCAweDk2LCAweEQwLCAweDJDLCAweEM2LA0KKyAgICAweDZELCAweDYxLCAweEU2LCAweDdCLCAweDZBLCAweDExLCAweEZGLCAweEMzLCAweEIzLCAweEMwLCAweDlDLCAweENCLA0KKyAgICAweDIzLCAweDhCLCAweDAxLCAweDk4LCAweDYwLCAweDRBLCAweDdBLCAweDAwLCAweDQ3LCAweDM0LCAweDY0LCAweDE4LA0KKyAgICAweDMxLCAweEEwLCAweDA3LCAweDU2LCAweDA3LCAweDYyLCAweDYyLCAweDUxLCAweDAzLCAweDgxLCAweDM5LCAweEZFLA0KKyAgICAweDJCLCAweDY0LCAweDg2LCAweDBDLCAweDg2LCAweDZFLCAweDdBLCAweDIxLCAweDEzLCAweDA2LCAweDBELCAweDdFLA0KKyAgICAweEMzLCAweEZBLCAweDIwLCAweEU3LCAweDBFLCAweEM0LCAweDFELCAweDgwLCAweDUzLCAweDFBLCAweDg3LCAweDU3LA0KKyAgICAweDEwLCAweDlDLCAweEQwLCAweEMwLCAweEMxLCAweDY2LCAweDUyLCAweEQzLCAweERFLCAweDhCLCAweDY3LCAweDQwLA0KKyAgICAweEVCLCAweDA3LCAweDczLCAweDAxLCAweDRDLCAweDg3LCAweDE2LCAweEUwLCAweDQ1LCAweEVGLCAweEE3LCAweDM5LA0KKyAgICAweEQ2LCAweDRFLCAweEFBLCAweDA0LCAweDY3LCAweEJELCAweDMwLCAweDlELCAweDBFLCAweDgyLCAweDY5LCAweDUxLA0KKyAgICAweDQ4LCAweEVDLCAweDRCLCAweDlBLCAweDIyLCAweEIzLCAweDI0LCAweEQzLCAweEMxLCAweDU2LCAweDM5LCAweDRGLA0KKyAgICAweDQ1LCAweENFLCAweEZFLCAweEY3LCAweEQ1LCAweDNGLCAweDMwLCAweEJCLCAweEQ5LCAweDlCfTsNCiBjb25zdCB1aW50OF90IGdfbmxOTF9Mb2NhbGVbXSA9IHsNCi0gICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHg0RCwgMHg0RiwgMHhEQywgMHgzMCwgMHgxMCwgMHgzRCwgMHg1MywgMHhBOSwgMHhGRiwgMHhDMSwgMHg4QSwgMHg4QSwgMHg2OCwgMHgyNSwgMHg5NiwgMHgyRCwNCi0gICAgMHg0NywgMHg1MCwgMHg4OCwgMHhCNCwgMHgwNSwgMHgwQSwgMHgxNSwgMHgwNCwgMHhBRCwgMHg1OCwgMHhEQSwgMHhBQSwgMHg1QywgMHgyQSwgMHg2RiwgMHg2MiwgMHg3NiwgMHhCRCwgMHgyNCwgMHhGNiwNCi0gICAgMHhDQSwgMHg4OSwgMHg0MSwgMHhDOSwgMHhCMSwgMHg1MiwgMHg4RiwgMHhGRCwgMHgyNywgMHhBRCwgMHhEQSwgMHg1QiwgMHhGRiwgMHg0RiwgMHhBNSwgMHg0QSwgMHhGQywgMHg4QywgMHg4RSwgMHhGMywNCi0gICAgMHg0NSwgMHgxMiwgMHgzQiwgMHg2OSwgMHhDOCwgMHgwNSwgMHhDRiwgMHg5QiwgMHhGNywgMHhCQywgMHgzMywgMHhDRiwgMHhDRSwgMHgxMCwgMHgzQiwgMHhFMCwgMHgxRSwgMHgwRSwgMHgwOCwgMHg2MiwNCi0gICAgMHgzOCwgMHgyNCwgMHgwNywgMHgxNiwgMHgwQiwgMHgzRSwgMHg1RiwgMHg5QywgMHg1QiwgMHhDOCwgMHgyNywgMHg5MSwgMHg3NywgMHg2MCwgMHgzRCwgMHg3QywgMHhGQiwgMHhGRCwgMHhGNywgMHhFQiwNCi0gICAgMHhBRiwgMHg4NywgMHg5RiwgMHgzRiwgMHg1RSwgMHhFNiwgMHhBQiwgMHg1NywgMHg5NiwgMHhGMywgMHhGQywgMHgxOSwgMHg0MiwgMHhCNiwgMHhFMiwgMHgzMywgMHgxRiwgMHg4QiwgMHg1OSwgMHgxMiwNCi0gICAgMHhDRSwgMHg3OSwgMHgxMCwgMHgxNSwgMHhEMiwgMHg4NSwgMHgyMCwgMHgwQiwgMHgyRSwgMHgyOCwgMHg2NiwgMHg4QSwgMHhCNSwgMHg4MSwgMHhFQywgMHg5MCwgMHhCMywgMHg3OCwgMHg3OSwgMHgwMSwNCi0gICAgMHhBOSwgMHg0OCwgMHhDNSwgMHgxQiwgMHg3OSwgMHhFQywgMHhBQywgMHgzMCwgMHg5MywgMHg1OCwgMHg1MCwgMHg3QiwgMHg5QywgMHg4NywgMHhCNSwgMHhDQywgMHgwRCwgMHg5OSwgMHg4QiwgMHg4RSwNCi0gICAgMHg1NCwgMHg4OCwgMHhCMSwgMHg4OCwgMHgwRCwgMHgzOCwgMHg1RSwgMHgwQiwgMHgxQSwgMHg5OCwgMHhGOCwgMHhDNCwgMHhCNCwgMHhDQiwgMHg0QSwgMHgzMiwgMHgzMywgMHgxQywgMHg5OCwgMHg2MCwNCi0gICAgMHgyQywgMHgxNywgMHgzMiwgMHg4QSwgMHg2NSwgMHg2NCwgMHg0OCwgMHg0NSwgMHg2NCwgMHgxRCwgMHg5MywgMHg3MCwgMHg0RSwgMHg4NCwgMHgyMSwgMHhDNywgMHg2RiwgMHg2MywgMHg2RSwgMHhDRSwNCi0gICAgMHgzMCwgMHg3RSwgMHhENywgMHgyNSwgMHhGMiwgMHg4OSwgMHhENywgMHg0RSwgMHhBMSwgMHg2MiwgMHg1RCwgMHgxOSwgMHg1OCwgMHgzNywgMHgxNCwgMHhFMSwgMHhGOSwgMHg1QywgMHgxQywgMHg1OCwNCi0gICAgMHhCQiwgMHg1NiwgMHhDQiwgMHg1OSwgMHhCMywgMHhBQiwgMHgyNiwgMHg4MywgMHhCQSwgMHhFQywgMHg3QywgMHg4QSwgMHg5OSwgMHg2NiwgMHgyRiwgMHhDRCwgMHg1NiwgMHg5QSwgMHg1RCwgMHgzNCwNCi0gICAgMHhGQiwgMHg2NywgMHhGNiwgMHhDRSwgMHg2QywgMHg1QiwgMHhCRiwgMHg2MywgMHgzRSwgMHg0RSwgMHg2QSwgMHgxNywgMHgxMCwgMHgyMiwgMHgyNywgMHhFNSwgMHg3MCwgMHg3MSwgMHhBMSwgMHgxQSwNCi0gICAgMHhCNSwgMHhBRSwgMHg0MCwgMHhCOCwgMHg1RSwgMHgwNiwgMHhENCwgMHhBNywgMHgyQywgMHhEMiwgMHhEMSwgMHg3QiwgMHg0RSwgMHg0QywgMHhCMCwgMHgwRiwgMHhGQiwgMHgxMiwgMHhBMSwgMHhFMywNCi0gICAgMHg3NywgMHg4MiwgMHhBRSwgMHg3NCwgMHgzNCwgMHhDNSwgMHg3MSwgMHg5MywgMHg4QywgMHhCMiwgMHg5NSwgMHhBMSwgMHhGMiwgMHhENiwgMHg0OSwgMHhFNywgMHgyRCwgMHg2OCwgMHhFNSwgMHg2QiwNCi0gICAgMHg5NSwgMHg2QiwgMHg0NSwgMHg2QiwgMHhFNSwgMHg2QSwgMHg3NSwgMHg2QSwgMHgyNSwgMHg3NiwgMHgxNywgMHgxNywgMHgxMiwgMHg0MSwgMHg3RCwgMHg0QSwgMHhDMiwgMHhGQSwgMHhDQiwgMHg1RCwNCi0gICAgMHg0MCwgMHhDRSwgMHhDNCwgMHg4NSwgMHg2MywgMHgyOCwgMHg4MywgMHg2NiwgMHg2QSwgMHhEQSwgMHg0QSwgMHhBMSwgMHhDNywgMHhCMCwgMHhCNiwgMHgzOSwgMHgxMSwgMHhCOCwgMHhCNiwgMHgyRiwNCi0gICAgMHg0NCwgMHhDRSwgMHg5QiwgMHg0MywgMHg3QiwgMHhBQywgMHhGRSwgMHg1NiwgMHhDMCwgMHhFNCwgMHhBOCwgMHgwMiwgMHg1MCwgMHhCNiwgMHgyQSwgMHgwNSwgMHgzMCwgMHg5QiwgMHhDNiwgMHhBRCwNCi0gICAgMHhFMSwgMHg5NCwgMHhBMywgMHgzRSwgMHgxOCwgMHgzRSwgMHhDNSwgMHgzMSwgMHhCOCwgMHhDRSwgMHgyQSwgMHg4MywgMHgyQiwgMHhBNCwgMHg5OCwgMHg1RiwgMHgzNywgMHgzMiwgMHgwOCwgMHgyQywNCi0gICAgMHhFNywgMHgxOCwgMHgxRSwgMHg3NCwgMHg4NCwgMHg1QywgMHg3OCwgMHhEMCwgMHgyNywgMHg3OCwgMHg1NCwgMHhFRiwgMHgxNSwgMHhCMywgMHg0QiwgMHgxQSwgMHg3MCwgMHhCNiwgMHhCMCwgMHg5QywNCi0gICAgMHhBNywgMHhBQSwgMHg0MiwgMHhFMiwgMHg4MywgMHg2OCwgMHgwNCwgMHg5QSwgMHhEMSwgMHg2MCwgMHg0RCwgMHhCNCwgMHhFNCwgMHgyMiwgMHhDRSwgMHg1NCwgMHgyMywgMHg1RCwgMHg4MSwgMHg1MCwNCi0gICAgMHgwMywgMHgyOSwgMHg3QSwgMHg4RiwgMHg2OSwgMHhEOCwgMHhFQSwgMHhCRCwgMHg4NiwgMHgzNCwgMHg3QSwgMHgzRiwgMHhERCwgMHg3NywgMHhERCwgMHhGRCwgMHhEOSwgMHg2QywgMHgwQiwgMHg0OSwNCi0gICAgMHgyOSwgMHhCNiwgMHhEMCwgMHhCNSwgMHgzRCwgMHhBRSwgMHgxMSwgMHhCQiwgMHg5NCwgMHg3OSwgMHhFQiwgMHg4NSwgMHg3MiwgMHhBMCwgMHgyNiwgMHg2QiwgMHhCQywgMHg5MCwgMHgwQywgMHgxMiwNCi0gICAgMHgxNCwgMHg1RCwgMHgyQiwgMHg0OSwgMHg5QiwgMHhBRiwgMHg3QSwgMHg2RSwgMHg3NSwgMHg1OCwgMHg5QywgMHhGNywgMHgxNSwgMHhBMCwgMHhFNSwgMHgyNSwgMHgzOCwgMHg0OSwgMHg1QywgMHhGRiwNCi0gICAgMHhGNiwgMHgzNCwgMHg4QywgMHg2NiwgMHhDNywgMHg0NywgMHg2RiwgMHhFRiwgMHgzRiwgMHhFMiwgMHhFNSwgMHg1OSwgMHg3QSwgMHg5RCwgMHg1QiwgMHg1NSwgMHgyNywgMHg2NSwgMHg0QSwgMHgyNiwNCi0gICAgMHhENSwgMHgyMCwgMHg2RSwgMHhGQSwgMHhENSwgMHhDMCwgMHhDQSwgMHg3RiwgMHg5NCwgMHg1MiwgMHhERCwgMHg1RCwgMHhDRiwgMHg3MiwgMHhEMiwgMHhFRCwgMHgzNCwgMHhERCwgMHhEQiwgMHg0OSwNCi0gICAgMHhEMywgMHhENCwgMHgxRSwgMHgzNywgMHg3OCwgMHhERCwgMHg1MiwgMHg0RiwgMHgwQSwgMHg0MSwgMHg5OCwgMHg5NywgMHg1OCwgMHhDRSwgMHgwQiwgMHg5NCwgMHhBQiwgMHhGNywgMHhGNiwgMHhBMiwNCi0gICAgMHhDMSwgMHhFQSwgMHgzNSwgMHgxMSwgMHgxRSwgMHg2MSwgMHg3MSwgMHhGMSwgMHhDMywgMHg5QiwgMHhCQSwgMHg0RSwgMHgzOSwgMHhBMiwgMHg3NSwgMHg1MSwgMHg3NSwgMHhGNiwgMHhEOCwgMHhFQywNCi0gICAgMHg0NiwgMHgxMywgMHgyQSwgMHhCNiwgMHg4NywgMHg5OSwgMHg0QSwgMHg0MywgMHgwQywgMHg5NywgMHg2MSwgMHhCQiwgMHhEQywgMHgyNSwgMHg0RiwgMHg3NywgMHgwQSwgMHgxNiwgMHg4MiwgMHhDQiwNCi0gICAgMHgzNSwgMHg1NSwgMHg5NywgMHg2MCwgMHg2NywgMHhBMCwgMHhBMiwgMHhFQSwgMHg2MCwgMHg3MywgMHhBMCwgMHgyMCwgMHhBNCwgMHg0QywgMHg0NiwgMHg5NiwgMHgzMywgMHgxQSwgMHg0OCwgMHg0RiwNCi0gICAgMHg4OSwgMHhFMCwgMHg5NiwgMHhGMywgMHg1QSwgMHg2MywgMHgzRiwgMHgxQSwgMHhEMywgMHgzOCwgMHhGMSwgMHhGMiwgMHgzOCwgMHgxQSwgMHhDRSwgMHgzNCwgMHhDMSwgMHhGMiwgMHgxQSwgMHg2NiwNCi0gICAgMHg4MSwgMHhFNSwgMHhGQywgMHhGOSwgMHhGMiwgMHgxRCwgMHhFNiwgMHg0QywgMHg4MywgMHhEMSwgMHhBMywgMHhBMiwgMHgxMSwgMHg1NywgMHgwQiwgMHgxOCwgMHgyRCwgMHhFRiwgMHgyRiwgMHg5RiwNCi0gICAgMHgyMCwgMHhBQiwgMHgxRiwgMHg4NCwgMHgyNiwgMHhDQSwgMHgwNiwgMHg5RCwgMHg1NiwgMHhCNywgMHg3QSwgMHhEOSwgMHg5MywgMHgzNSwgMHhCOSwgMHhDMSwgMHg1RSwgMHgzOSwgMHg0QywgMHhDQiwNCi0gICAgMHhCMCwgMHhEOCwgMHhEMywgMHg0RCwgMHhFMCwgMHhGQiwgMHhDQywgMHg0NywgMHg1MywgMHhGMCwgMHg2NywgMHg2QywgMHgyNiwgMHg1MCwgMHg0NiwgMHgzOSwgMHhFQiwgMHgyMSwgMHgxQywgMHg3MiwNCi0gICAgMHgyOSwgMHgyOCwgMHgxMSwgMHg2OCwgMHgxNiwgMHhGQiwgMHgxRCwgMHg4QywgMHg4OSwgMHgwRiwgMHhERiwgMHgzRiwgMHg2OCwgMHg0QSwgMHhGRiwgMHg0QiwgMHgzOSwgMHg4NSwgMHhFRiwgMHgzRCwNCi0gICAgMHg3MiwgMHhERiwgMHg0QiwgMHg5OSwgMHgwOCwgMHgzQywgMHg4NywgMHg3NywgMHhBQywgMHg4RiwgMHg3MiwgMHhCNSwgMHhDNCwgMHhCNCwgMHg4MywgMHg3MCwgMHhDNiwgMHg1MywgMHg3OSwgMHg4QiwNCi0gICAgMHhEMSwgMHgwOSwgMHg4RiwgMHg5NywgMHhENCwgMHg1MywgMHgzRCwgMHg4RCwgMHgzRSwgMHhCQywgMHg0MywgMHg2RSwgMHgzRiwgMHgxOSwgMHgwQywgMHhGMCwgMHg5NiwgMHhCQywgMHgyNCwgMHg1RiwNCi0gICAgMHhGNiwgMHhGRSwgMHgzNCwgMHg3MCwgMHgxNywgMHhBQSwgMHg0QiwgMHg3NCwgMHhERSwgMHg0QiwgMHg5QiwgMHhGMSwgMHg0MSwgMHgzNCwgMHgzNywgMHg5MSwgMHg2QywgMHhCMSwgMHhFMiwgMHgxOSwNCi0gICAgMHgzMywgMHgyRiwgMHgzMiwgMHgxQiwgMHg2RCwgMHhCNSwgMHhGMywgMHhCNCwgMHhDNywgMHhGOSwgMHhBNywgMHhCQSwgMHhGMywgMHgwRiwgMHhENSwgMHhGQSwgMHhDMCwgMHhGQQ0KLX07DQorICAgIDB4NzgsIDB4OUMsIDB4OTUsIDB4NTYsIDB4NEQsIDB4NEYsIDB4REMsIDB4MzAsIDB4MTAsIDB4M0QsIDB4NTMsIDB4QTksDQorICAgIDB4RkYsIDB4QzEsIDB4OEEsIDB4OEEsIDB4NjgsIDB4MjUsIDB4OTYsIDB4MkQsIDB4NDcsIDB4NTAsIDB4ODgsIDB4QjQsDQorICAgIDB4MDUsIDB4MEEsIDB4MTUsIDB4MDQsIDB4QUQsIDB4NTgsIDB4REEsIDB4QUEsIDB4NUMsIDB4MkEsIDB4NkYsIDB4NjIsDQorICAgIDB4NzYsIDB4QkQsIDB4MjQsIDB4RjYsIDB4Q0EsIDB4ODksIDB4NDEsIDB4QzksIDB4QjEsIDB4NTIsIDB4OEYsIDB4RkQsDQorICAgIDB4MjcsIDB4QUQsIDB4REEsIDB4NUIsIDB4RkYsIDB4NEYsIDB4QTUsIDB4NEEsIDB4RkMsIDB4OEMsIDB4OEUsIDB4RjMsDQorICAgIDB4NDUsIDB4MTIsIDB4M0IsIDB4NjksIDB4QzgsIDB4MDUsIDB4Q0YsIDB4OUIsIDB4RjcsIDB4QkMsIDB4MzMsIDB4Q0YsDQorICAgIDB4Q0UsIDB4MTAsIDB4M0IsIDB4RTAsIDB4MUUsIDB4MEUsIDB4MDgsIDB4NjIsIDB4MzgsIDB4MjQsIDB4MDcsIDB4MTYsDQorICAgIDB4MEIsIDB4M0UsIDB4NUYsIDB4OUMsIDB4NUIsIDB4QzgsIDB4MjcsIDB4OTEsIDB4NzcsIDB4NjAsIDB4M0QsIDB4N0MsDQorICAgIDB4RkIsIDB4RkQsIDB4RjcsIDB4RUIsIDB4QUYsIDB4ODcsIDB4OUYsIDB4M0YsIDB4NUUsIDB4RTYsIDB4QUIsIDB4NTcsDQorICAgIDB4OTYsIDB4RjMsIDB4RkMsIDB4MTksIDB4NDIsIDB4QjYsIDB4RTIsIDB4MzMsIDB4MUYsIDB4OEIsIDB4NTksIDB4MTIsDQorICAgIDB4Q0UsIDB4NzksIDB4MTAsIDB4MTUsIDB4RDIsIDB4ODUsIDB4MjAsIDB4MEIsIDB4MkUsIDB4MjgsIDB4NjYsIDB4OEEsDQorICAgIDB4QjUsIDB4ODEsIDB4RUMsIDB4OTAsIDB4QjMsIDB4NzgsIDB4NzksIDB4MDEsIDB4QTksIDB4NDgsIDB4QzUsIDB4MUIsDQorICAgIDB4NzksIDB4RUMsIDB4QUMsIDB4MzAsIDB4OTMsIDB4NTgsIDB4NTAsIDB4N0IsIDB4OUMsIDB4ODcsIDB4QjUsIDB4Q0MsDQorICAgIDB4MEQsIDB4OTksIDB4OEIsIDB4OEUsIDB4NTQsIDB4ODgsIDB4QjEsIDB4ODgsIDB4MEQsIDB4MzgsIDB4NUUsIDB4MEIsDQorICAgIDB4MUEsIDB4OTgsIDB4RjgsIDB4QzQsIDB4QjQsIDB4Q0IsIDB4NEEsIDB4MzIsIDB4MzMsIDB4MUMsIDB4OTgsIDB4NjAsDQorICAgIDB4MkMsIDB4MTcsIDB4MzIsIDB4OEEsIDB4NjUsIDB4NjQsIDB4NDgsIDB4NDUsIDB4NjQsIDB4MUQsIDB4OTMsIDB4NzAsDQorICAgIDB4NEUsIDB4ODQsIDB4MjEsIDB4QzcsIDB4NkYsIDB4NjMsIDB4NkUsIDB4Q0UsIDB4MzAsIDB4N0UsIDB4RDcsIDB4MjUsDQorICAgIDB4RjIsIDB4ODksIDB4RDcsIDB4NEUsIDB4QTEsIDB4NjIsIDB4NUQsIDB4MTksIDB4NTgsIDB4MzcsIDB4MTQsIDB4RTEsDQorICAgIDB4RjksIDB4NUMsIDB4MUMsIDB4NTgsIDB4QkIsIDB4NTYsIDB4Q0IsIDB4NTksIDB4QjMsIDB4QUIsIDB4MjYsIDB4ODMsDQorICAgIDB4QkEsIDB4RUMsIDB4N0MsIDB4OEEsIDB4OTksIDB4NjYsIDB4MkYsIDB4Q0QsIDB4NTYsIDB4OUEsIDB4NUQsIDB4MzQsDQorICAgIDB4RkIsIDB4NjcsIDB4RjYsIDB4Q0UsIDB4NkMsIDB4NUIsIDB4QkYsIDB4NjMsIDB4M0UsIDB4NEUsIDB4NkEsIDB4MTcsDQorICAgIDB4MTAsIDB4MjIsIDB4MjcsIDB4RTUsIDB4NzAsIDB4NzEsIDB4QTEsIDB4MUEsIDB4QjUsIDB4QUUsIDB4NDAsIDB4QjgsDQorICAgIDB4NUUsIDB4MDYsIDB4RDQsIDB4QTcsIDB4MkMsIDB4RDIsIDB4RDEsIDB4N0IsIDB4NEUsIDB4NEMsIDB4QjAsIDB4MEYsDQorICAgIDB4RkIsIDB4MTIsIDB4QTEsIDB4RTMsIDB4NzcsIDB4ODIsIDB4QUUsIDB4NzQsIDB4MzQsIDB4QzUsIDB4NzEsIDB4OTMsDQorICAgIDB4OEMsIDB4QjIsIDB4OTUsIDB4QTEsIDB4RjIsIDB4RDYsIDB4NDksIDB4RTcsIDB4MkQsIDB4NjgsIDB4RTUsIDB4NkIsDQorICAgIDB4OTUsIDB4NkIsIDB4NDUsIDB4NkIsIDB4RTUsIDB4NkEsIDB4NzUsIDB4NkEsIDB4MjUsIDB4NzYsIDB4MTcsIDB4MTcsDQorICAgIDB4MTIsIDB4NDEsIDB4N0QsIDB4NEEsIDB4QzIsIDB4RkEsIDB4Q0IsIDB4NUQsIDB4NDAsIDB4Q0UsIDB4QzQsIDB4ODUsDQorICAgIDB4NjMsIDB4MjgsIDB4ODMsIDB4NjYsIDB4NkEsIDB4REEsIDB4NEEsIDB4QTEsIDB4QzcsIDB4QjAsIDB4QjYsIDB4MzksDQorICAgIDB4MTEsIDB4QjgsIDB4QjYsIDB4MkYsIDB4NDQsIDB4Q0UsIDB4OUIsIDB4NDMsIDB4N0IsIDB4QUMsIDB4RkUsIDB4NTYsDQorICAgIDB4QzAsIDB4RTQsIDB4QTgsIDB4MDIsIDB4NTAsIDB4QjYsIDB4MkEsIDB4MDUsIDB4MzAsIDB4OUIsIDB4QzYsIDB4QUQsDQorICAgIDB4RTEsIDB4OTQsIDB4QTMsIDB4M0UsIDB4MTgsIDB4M0UsIDB4QzUsIDB4MzEsIDB4QjgsIDB4Q0UsIDB4MkEsIDB4ODMsDQorICAgIDB4MkIsIDB4QTQsIDB4OTgsIDB4NUYsIDB4MzcsIDB4MzIsIDB4MDgsIDB4MkMsIDB4RTcsIDB4MTgsIDB4MUUsIDB4NzQsDQorICAgIDB4ODQsIDB4NUMsIDB4NzgsIDB4RDAsIDB4MjcsIDB4NzgsIDB4NTQsIDB4RUYsIDB4MTUsIDB4QjMsIDB4NEIsIDB4MUEsDQorICAgIDB4NzAsIDB4QjYsIDB4QjAsIDB4OUMsIDB4QTcsIDB4QUEsIDB4NDIsIDB4RTIsIDB4ODMsIDB4NjgsIDB4MDQsIDB4OUEsDQorICAgIDB4RDEsIDB4NjAsIDB4NEQsIDB4QjQsIDB4RTQsIDB4MjIsIDB4Q0UsIDB4NTQsIDB4MjMsIDB4NUQsIDB4ODEsIDB4NTAsDQorICAgIDB4MDMsIDB4MjksIDB4N0EsIDB4OEYsIDB4NjksIDB4RDgsIDB4RUEsIDB4QkQsIDB4ODYsIDB4MzQsIDB4N0EsIDB4M0YsDQorICAgIDB4REQsIDB4NzcsIDB4REQsIDB4RkQsIDB4RDksIDB4NkMsIDB4MEIsIDB4NDksIDB4MjksIDB4QjYsIDB4RDAsIDB4QjUsDQorICAgIDB4M0QsIDB4QUUsIDB4MTEsIDB4QkIsIDB4OTQsIDB4NzksIDB4RUIsIDB4ODUsIDB4NzIsIDB4QTAsIDB4MjYsIDB4NkIsDQorICAgIDB4QkMsIDB4OTAsIDB4MEMsIDB4MTIsIDB4MTQsIDB4NUQsIDB4MkIsIDB4NDksIDB4OUIsIDB4QUYsIDB4N0EsIDB4NkUsDQorICAgIDB4NzUsIDB4NTgsIDB4OUMsIDB4RjcsIDB4MTUsIDB4QTAsIDB4RTUsIDB4MjUsIDB4MzgsIDB4NDksIDB4NUMsIDB4RkYsDQorICAgIDB4RjYsIDB4MzQsIDB4OEMsIDB4NjYsIDB4QzcsIDB4NDcsIDB4NkYsIDB4RUYsIDB4M0YsIDB4RTIsIDB4RTUsIDB4NTksDQorICAgIDB4N0EsIDB4OUQsIDB4NUIsIDB4NTUsIDB4MjcsIDB4NjUsIDB4NEEsIDB4MjYsIDB4RDUsIDB4MjAsIDB4NkUsIDB4RkEsDQorICAgIDB4RDUsIDB4QzAsIDB4Q0EsIDB4N0YsIDB4OTQsIDB4NTIsIDB4REQsIDB4NUQsIDB4Q0YsIDB4NzIsIDB4RDIsIDB4RUQsDQorICAgIDB4MzQsIDB4REQsIDB4REIsIDB4NDksIDB4RDMsIDB4RDQsIDB4MUUsIDB4MzcsIDB4NzgsIDB4REQsIDB4NTIsIDB4NEYsDQorICAgIDB4MEEsIDB4NDEsIDB4OTgsIDB4OTcsIDB4NTgsIDB4Q0UsIDB4MEIsIDB4OTQsIDB4QUIsIDB4RjcsIDB4RjYsIDB4QTIsDQorICAgIDB4QzEsIDB4RUEsIDB4MzUsIDB4MTEsIDB4MUUsIDB4NjEsIDB4NzEsIDB4RjEsIDB4QzMsIDB4OUIsIDB4QkEsIDB4NEUsDQorICAgIDB4MzksIDB4QTIsIDB4NzUsIDB4NTEsIDB4NzUsIDB4RjYsIDB4RDgsIDB4RUMsIDB4NDYsIDB4MTMsIDB4MkEsIDB4QjYsDQorICAgIDB4ODcsIDB4OTksIDB4NEEsIDB4NDMsIDB4MEMsIDB4OTcsIDB4NjEsIDB4QkIsIDB4REMsIDB4MjUsIDB4NEYsIDB4NzcsDQorICAgIDB4MEEsIDB4MTYsIDB4ODIsIDB4Q0IsIDB4MzUsIDB4NTUsIDB4OTcsIDB4NjAsIDB4NjcsIDB4QTAsIDB4QTIsIDB4RUEsDQorICAgIDB4NjAsIDB4NzMsIDB4QTAsIDB4MjAsIDB4QTQsIDB4NEMsIDB4NDYsIDB4OTYsIDB4MzMsIDB4MUEsIDB4NDgsIDB4NEYsDQorICAgIDB4ODksIDB4RTAsIDB4OTYsIDB4RjMsIDB4NUEsIDB4NjMsIDB4M0YsIDB4MUEsIDB4RDMsIDB4MzgsIDB4RjEsIDB4RjIsDQorICAgIDB4MzgsIDB4MUEsIDB4Q0UsIDB4MzQsIDB4QzEsIDB4RjIsIDB4MUEsIDB4NjYsIDB4ODEsIDB4RTUsIDB4RkMsIDB4RjksDQorICAgIDB4RjIsIDB4MUQsIDB4RTYsIDB4NEMsIDB4ODMsIDB4RDEsIDB4QTMsIDB4QTIsIDB4MTEsIDB4NTcsIDB4MEIsIDB4MTgsDQorICAgIDB4MkQsIDB4RUYsIDB4MkYsIDB4OUYsIDB4MjAsIDB4QUIsIDB4MUYsIDB4ODQsIDB4MjYsIDB4Q0EsIDB4MDYsIDB4OUQsDQorICAgIDB4NTYsIDB4QjcsIDB4N0EsIDB4RDksIDB4OTMsIDB4MzUsIDB4QjksIDB4QzEsIDB4NUUsIDB4MzksIDB4NEMsIDB4Q0IsDQorICAgIDB4QjAsIDB4RDgsIDB4RDMsIDB4NEQsIDB4RTAsIDB4RkIsIDB4Q0MsIDB4NDcsIDB4NTMsIDB4RjAsIDB4NjcsIDB4NkMsDQorICAgIDB4MjYsIDB4NTAsIDB4NDYsIDB4MzksIDB4RUIsIDB4MjEsIDB4MUMsIDB4NzIsIDB4MjksIDB4MjgsIDB4MTEsIDB4NjgsDQorICAgIDB4MTYsIDB4RkIsIDB4MUQsIDB4OEMsIDB4ODksIDB4MEYsIDB4REYsIDB4M0YsIDB4NjgsIDB4NEEsIDB4RkYsIDB4NEIsDQorICAgIDB4MzksIDB4ODUsIDB4RUYsIDB4M0QsIDB4NzIsIDB4REYsIDB4NEIsIDB4OTksIDB4MDgsIDB4M0MsIDB4ODcsIDB4NzcsDQorICAgIDB4QUMsIDB4OEYsIDB4NzIsIDB4QjUsIDB4QzQsIDB4QjQsIDB4ODMsIDB4NzAsIDB4QzYsIDB4NTMsIDB4NzksIDB4OEIsDQorICAgIDB4RDEsIDB4MDksIDB4OEYsIDB4OTcsIDB4RDQsIDB4NTMsIDB4M0QsIDB4OEQsIDB4M0UsIDB4QkMsIDB4NDMsIDB4NkUsDQorICAgIDB4M0YsIDB4MTksIDB4MEMsIDB4RjAsIDB4OTYsIDB4QkMsIDB4MjQsIDB4NUYsIDB4RjYsIDB4RkUsIDB4MzQsIDB4NzAsDQorICAgIDB4MTcsIDB4QUEsIDB4NEIsIDB4NzQsIDB4REUsIDB4NEIsIDB4OUIsIDB4RjEsIDB4NDEsIDB4MzQsIDB4MzcsIDB4OTEsDQorICAgIDB4NkMsIDB4QjEsIDB4RTIsIDB4MTksIDB4MzMsIDB4MkYsIDB4MzIsIDB4MUIsIDB4NkQsIDB4QjUsIDB4RjMsIDB4QjQsDQorICAgIDB4QzcsIDB4RjksIDB4QTcsIDB4QkEsIDB4RjMsIDB4MEYsIDB4RDUsIDB4RkEsIDB4QzAsIDB4RkF9Ow0KIGNvbnN0IHVpbnQ4X3QgZ19ydVJVX0xvY2FsZVtdID0gew0KLSAgICAweDc4LCAweDlDLCAweEFELCAweDU3LCAweDRELCAweDRGLCAweDEzLCAweDQxLCAweDE4LCAweDNFLCAweDYzLCAweEUyLCAweDdGLCAweDk4LCAweDZDLCAweDI0LCAweDY4LCAweDAyLCAweEFELCAweDFFLA0KLSAgICAweDI1LCAweDY1LCAweDEzLCAweDIyLCAweDBBLCAweDA2LCAweEQ3LCAweDkwLCAweDE2LCAweDM0LCAweDcyLCAweDMxLCAweERCLCAweERELCAweEExLCAweDVELCAweEU4LCAweEVFLCAweDkwLCAweEU5LA0KLSAgICAweDZFLCAweEIwLCAweDdCLCAweDJBLCAweDg1LCAweEU4LCAweDA1LCAweDI1LCAweEUxLCAweEEwLCAweDQ3LCAweEY0LCAweEU0LCAweEM5LCAweDUwLCAweEJFLCAweDEyLCAweDgyLCAweEI2LCAweDI0LA0KLSAgICAweEZFLCAweDgyLCAweEQ5LCAweEZGLCAweDYwLCAweEQ0LCAweDlGLCAweEUxLCAweDNCLCAweEZCLCAweEQxLCAweEVFLCAweEI3LCAweEM1LCAweEQ4LCAweDFFLCAweDNBLCAweEYzLCAweDNFLCAweENGLA0KLSAgICAweEYzLCAweENFLCAweEZCLCAweEI1LCAweEQzLCAweEI2LCAweEQ0LCAweDIwLCAweDhBLCAweERDLCAweEMwLCAweEM4LCAweDkwLCAweDc1LCAweDNDLCAweDIzLCAweDUwLCAweEVCLCAweDY1LCAweDc5LA0KLSAgICAweDQ1LCAweDQwLCAweDJBLCAweDZFLCAweDJBLCAweDMzLCAweEMyLCAweDhGLCAweEFCLCAweERELCAweERGLCAweDQ3LCAweDVGLCAweDZFLCAweEMzLCAweEM3LCAweEFGLCAweERFLCAweDg3LCAweDlGLA0KLSAgICAweEVGLCAweDhGLCAweEVFLCAweDA4LCAweEUyLCAweENELCAweDFCLCAweDA4LCAweDk1LCAweDM4LCAweERGLCAweDUwLCAweDY1LCAweDVBLCAweDY5LCAweEU5LCAweDU1LCAweEQyLCAweDY4LCAweEZBLA0KLSAgICAweEQyLCAweDFBLCAweEM1LCAweDM1LCAweDQyLCAweDM1LCAweEQ5LCAweEUwLCAweEFDLCAweDMxLCAweDU0LCAweEQyLCAweDg5LCAweDYxLCAweEQ2LCAweDlGLCAweDAyLCAweEQ0LCAweEU0LCAweEZCLA0KLSAgICAweDMxLCAweDZGLCAweDJGLCAweDNBLCAweEZCLCAweEFDLCAweEM3LCAweDRFLCAweDU4LCAweEQ3LCAweDY5LCAweDNCLCAweEZCLCAweEE1LCAweEEyLCAweDY3LCAweDBCLCAweEMzLCAweEJCLCAweEVDLA0KLSAgICAweDlDLCAweDlELCAweDM4LCAweDZELCAweEQ2LCAweDY1LCAweDVGLCAweDUzLCAweDA5LCAweEVDLCAweDlCLCAweEFCLCAweEVELCAweEIwLCAweDZFLCAweDFBLCAweEQ4LCAweDY1LCAweDU3LCAweEEwLA0KLSAgICAweDNELCAweENGLCAweEQzLCAweEE2LCAweDAyLCAweDE3LCAweENFLCAweDNCLCAweEQ2LCAweENCLCAweDg2LCAweDMyLCAweERDLCAweDc1LCAweDIxLCAweDkxLCAweDUzLCAweDY3LCAweEM3LCAweEQ5LA0KLSAgICAweENFLCAweDA4LCAweEM3LCAweEQ5LCAweDg2LCAweDUwLCAweDdBLCAweDRFLCAweDA3LCAweDcyLCAweDNFLCAweENFLCAweEM4LCAweDk3LCAweEY1LCAweEQ5LCAweDY1LCAweDNFLCAweEExLCAweEM3LA0KLSAgICAweEZBLCAweDc5LCAweEYwLCAweDE5LCAweDFDLCAweDcxLCAweDA5LCAweDkxLCAweEM0LCAweDA5LCAweEM4LCAweDVGLCAweDBGLCAweDFBLCAweDEwLCAweDZFLCAweDA4LCAweDkyLCAweEFCLCAweDU1LA0KLSAgICAweDNBLCAweDIzLCAweERDLCAweDEzLCAweDkyLCAweDlELCAweDI5LCAweEU0LCAweDM0LCAweDI1LCAweDBELCAweDFCLCAweEExLCAweDFGLCAweDk5LCAweEIyLCAweEZGLCAweERELCAweDhBLCAweEQ0LA0KLSAgICAweEQ4LCAweEZELCAweDFFLCAweEE0LCAweDA2LCAweEUxLCAweDE2LCAweDNGLCAweDE1LCAweEYxLCAweEFCLCAweDlFLCAweDhBLCAweEI5LCAweDI1LCAweDJGLCAweEU0LCAweEQ3LCAweDVBLCAweDk1LA0KLSAgICAweDVCLCAweEExLCAweEQxLCAweDg3LCAweDlELCAweDA4LCAweDAxLCAweEY2LCAweDIxLCAweDk4LCAweDRCLCAweDNFLCAweDlGLCAweDdFLCAweDUwLCAweDdCLCAweEVDLCAweEJDLCAweDU0LCAweEU0LA0KLSAgICAweEQ4LCAweDkwLCAweDc0LCAweDA1LCAweDMxLCAweEY1LCAweDAwLCAweDNDLCAweDczLCAweDg3LCAweDc4LCAweDBGLCAweEQ2LCAweDE3LCAweEVDLCAweDMyLCAweDRFLCAweDNBLCAweDgxLCAweDcyLA0KLSAgICAweEY3LCAweEMxLCAweDRGLCAweDFBLCAweDA4LCAweEMzLCAweEQ4LCAweDc2LCAweEY1LCAweERELCAweDM4LCAweEYwLCAweDA2LCAweENFLCAweEVELCAweDQwLCAweDE0LCAweEU3LCAweDQwLCAweDM4LA0KLSAgICAweDRELCAweDlDLCAweEVCLCAweEVDLCAweDAzLCAweDA4LCAweDBFLCAweDlELCAweEQ3LCAweDQ5LCAweEU1LCAweEI2LCAweEIzLCAweEMzLCAweDhFLCAweEUxLCAweERELCAweEY3LCAweERBLCAweEVDLA0KLSAgICAweDgzLCAweEM4LCAweDVELCAweEE1LCAweEU0LCAweDFDLCAweDlCLCAweDJFLCAweEQ3LCAweEZGLCAweDgxLCAweEIzLCAweDFELCAweDNGLCAweEYyLCAweDkwLCAweEY1LCAweEUyLCAweEE2LCAweDAzLA0KLSAgICAweEE3LCAweDEzLCAweDM3LCAweDdELCAweDcyLCAweERBLCAweDcxLCAweEQzLCAweEU3LCAweDI0LCAweEVCLCAweDMwLCAweDQ1LCAweEM4LCAweDhFLCAweEIzLCAweDQzLCAweEQ1LCAweDMxLCAweEQ1LA0KLSAgICAweDU0LCAweDBELCAweEVCLCAweEUxLCAweEVCLCAweEM5LCAweDM3LCAweDg5LCAweEIzLCAweDEyLCAweEI0LCAweDMzLCAweEQ4LCAweDQ0LCAweEExLCAweEE1LCAweDE4LCAweDg0LCAweDg2LCAweERCLA0KLSAgICAweDkwLCAweDczLCAweDRDLCAweEU1LCAweDkwLCAweDVGLCAweEQ4LCAweEYxLCAweDkxLCAweEU5LCAweDIzLCAweEQ2LCAweDJCLCAweDM4LCAweDZGLCAweDYxLCAweDZDLCAweEI4LCAweDYxLCAweDg4LA0KLSAgICAweDQ0LCAweDhELCAweEM4LCAweDVELCAweDA1LCAweDZBLCAweEI4LCAweDZBLCAweDhCLCAweEIxLCAweEJCLCAweEQ2LCAweEIzLCAweEFBLCAweEIyLCAweDg5LCAweDk3LCAweDY0LCAweEQzLCAweEM0LA0KLSAgICAweEQ0LCAweDE4LCAweEQ0LCAweDdFLCAweDYwLCAweEYxLCAweEFGLCAweEUzLCAweDM1LCAweEFCLCAweEQxLCAweDEwLCAweEM0LCAweDM5LCAweDI0LCAweEMxLCAweDBCLCAweEJELCAweDgwLCAweDE3LA0KLSAgICAweDlBLCAweDgwLCAweDI3LCAweDY0LCAweDgyLCAweDU3LCAweDYyLCAweDQwLCAweENELCAweEQyLCAweDM2LCAweDg4LCAweDUxLCAweEZCLCAweDU3LCAweEFELCAweDhFLCAweDU1LCAweDkwLCAweENFLA0KLSAgICAweDE1LCAweDI0LCAweEE5LCAweEMwLCAweDk1LCAweDIzLCAweDY5LCAweDlBLCAweDc1LCAweDQyLCAweENELCAweEExLCAweDJBLCAweEFFLCAweDQxLCAweDI4LCAweDYyLCAweEYxLCAweDhCLCAweDYwLA0KLSAgICAweDZBLCAweDdBLCAweEFDLCAweDA4LCAweDIxLCAweDRCLCAweEE0LCAweDA4LCAweDBCLCAweEQzLCAweDkyLCAweDM0LCAweDVELCAweEE5LCAweEEwLCAweEQ1LCAweDUyLCAweDMxLCAweDQ0LCAweEM5LA0KLSAgICAweEQyLCAweDc4LCAweEM5LCAweDVGLCAweDRGLCAweEUzLCAweDI2LCAweEVELCAweDRCLCAweDQ2LCAweDEyLCAweEY4LCAweDE5LCAweDczLCAweDQ5LCAweDlDLCAweENGLCAweEIzLCAweDhELCAweEU1LA0KLSAgICAweEU2LCAweEI3LCAweDdDLCAweDE5LCAweEFDLCAweEMxLCAweDFDLCAweENDLCAweENCLCAweEM2LCAweEZBLCAweEM2LCAweDgyLCAweERFLCAweEFDLCAweDNDLCAweDlDLCAweDdCLCAweEI0LCAweEY1LA0KLSAgICAweEZDLCAweDU1LCAweDdELCAweEQxLCAweDVFLCAweEY1LCAweDhBLCAweDE0LCAweDI2LCAweEI5LCAweDRBLCAweEMzLCAweEQyLCAweEFCLCAweDk4LCAweDQ2LCAweDJCLCAweDE1LCAweEIxLCAweEY5LA0KLSAgICAweDIxLCAweDgxLCAweDBELCAweDY2LCAweDU5LCAweDExLCAweDQ0LCAweDdCLCAweEQyLCAweEI2LCAweEVGLCAweDE3LCAweDZDLCAweERCLCAweDJFLCAweDE1LCAweDIzLCAweEJDLCAweDZDLCAweEE5LA0KLSAgICAweDYyLCAweDUxLCAweDhBLCAweDBELCAweEE1LCAweDM1LCAweEQ0LCAweERFLCAweDFBLCAweDU5LCAweEJCLCAweDg5LCAweEE5LCAweDgyLCAweDBELCAweEQzLCAweDk3LCAweDhFLCAweDI3LCAweDc1LA0KLSAgICAweEJDLCAweDFFLCAweDg5LCAweDFDLCAweDA2LCAweDc5LCAweDBELCAweDUzLCAweDFELCAweDhCLCAweDlBLCAweDdDLCAweEY3LCAweDJBLCAweDU2LCAweDM0LCAweDVELCAweDg2LCAweDIxLCAweDk4LA0KLSAgICAweDBDLCAweEJDLCAweDc4LCAweDcwLCAweEE2LCAweEEwLCAweDQ2LCAweDg5LCAweEI1LCAweEE5LCAweEYxLCAweDExLCAweEY4LCAweEZFLCAweDcxLCAweDQ0LCAweEM5LCAweDIwLCAweDg1LCAweEYxLA0KLSAgICAweDExLCAweDA1LCAweEJBLCAweDY2LCAweDU4LCAweDRELCAweDQxLCAweDlDLCAweDFBLCAweDkxLCAweDZFLCAweDYzLCAweDRBLCAweDA0LCAweEYxLCAweDZFLCAweDgyLCAweDNELCAweEFDLCAweDRDLA0KLSAgICAweEE0LCAweEUxLCAweDQxLCAweDM3LCAweDIyLCAweEE1LCAweDg5LCAweDFBLCAweDgzLCAweDI5LCAweDc0LCAweDM3LCAweDgyLCAweEU4LCAweDdFLCAweDQ3LCAweDQ3LCAweDE5LCAweDM5LCAweDJBLA0KLSAgICAweEFELCAweDQ5LCAweEY4LCAweDQyLCAweDEwLCAweENCLCAweDJCLCAweEU1LCAweDZCLCAweEM4LCAweEMyLCAweDlELCAweDQ4LCAweDg4LCAweERDLCAweEFCLCAweDJFLCAweDExLCAweDM3LCAweDdGLA0KLSAgICAweENBLCAweDVCLCAweDlCLCAweDc4LCAweDRELCAweDU2LCAweDgyLCAweEJCLCAweDM1LCAweEQ4LCAweEZBLCAweDNFLCAweEE1LCAweDE2LCAweEZDLCAweEUwLCAweDU0LCAweEQxLCAweDEyLCAweEQ0LA0KLSAgICAweEE3LCAweDk4LCAweDRFLCAweEQwLCAweDBDLCAweDhELCAweDE4LCAweDM5LCAweDg0LCAweDA3LCAweEM0LCAweEEyLCAweDFBLCAweEE2LCAweEE4LCAweDYyLCAweEFBLCAweDE5LCAweDhDLCAweDU5LA0KLSAgICAweDk1LCAweDU0LCAweDMxLCAweDVBLCAweEQyLCAweEZFLCAweDRBLCAweDU5LCAweEMwLCAweDU1LCAweDhBLCAweEI3LCAweDcyLCAweDI5LCAweEIzLCAweDU0LCAweEFFLCAweEMyLCAweDIzLCAweDk2LA0KLSAgICAweDQ3LCAweDU5LCAweEFFLCAweENCLCAweDVBLCAweDA2LCAweDYxLCAweDkxLCAweEQ4LCAweEQ2LCAweDg2LCAweDhDLCAweEU2LCAweDg5LCAweDU5LCAweEQ3LCAweDE0LCAweDlFLCAweEQzLCAweEQ0LA0KLSAgICAweEIzLCAweEM3LCAweDQ4LCAweENBLCAweDI3LCAweDQzLCAweDAxLCAweDk0LCAweDNBLCAweDA5LCAweEM4LCAweEU1LCAweERDLCAweEEzLCAweDgxLCAweDVCLCAweEUzLCAweDU5LCAweEEyLCAweDI3LA0KLSAgICAweEI5LCAweEI0LCAweDBBLCAweDE5LCAweDg5LCAweDI2LCAweEI1LCAweDJDLCAweEEzLCAweEI2LCAweDRFLCAweDVDLCAweEE2LCAweDE3LCAweEE0LCAweDdCLCAweEIzLCAweDg1LCAweEZBLCAweDU5LA0KLSAgICAweDJBLCAweDdBLCAweEZGLCAweDNELCAweEM0LCAweDNGLCAweERFLCAweENCLCAweDhCLCAweEM0DQotfTsNCi1zdGF0aWMgSUZYX0xvY2FsZSogWEZBX0dldExvY2FsZUZyb21CdWZmZXIoY29uc3QgdWludDhfdCogcEJ1ZiwgaW50IG5CdWZMZW4pDQotew0KLSAgICBpZiAocEJ1ZiA9PSBOVUxMIHx8IG5CdWZMZW4gPD0gMCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0ZYX0dFTW9kdWxlKiBwR2VNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpOw0KLSAgICBpZiAoIXBHZU1vZHVsZSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyID0gcEdlTW9kdWxlLT5HZXRDb2RlY01vZHVsZSgpOw0KLSAgICBpZiAoIXBDb2RlY01ncikgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ1hNTF9FbGVtZW50KiBwTG9jYWxlID0gTlVMTDsNCi0gICAgdWludDhfdCogcE91dCA9IE5VTEw7DQotICAgIEZYX0RXT1JEIGR3U2l6ZTsNCi0gICAgcENvZGVjTWdyLT5HZXRGbGF0ZU1vZHVsZSgpLT5GbGF0ZU9yTFpXRGVjb2RlKEZBTFNFLA0KLSAgICAgICAgICAgIHBCdWYsIG5CdWZMZW4sIFRSVUUsIDAsIDAsIDAsIDAsIDAsIHBPdXQsIGR3U2l6ZSk7DQotICAgIGlmIChwT3V0KSB7DQotICAgICAgICBwTG9jYWxlID0gQ1hNTF9FbGVtZW50OjpQYXJzZShwT3V0LCBkd1NpemUpOw0KLSAgICAgICAgRlhfRnJlZShwT3V0KTsNCi0gICAgfQ0KLSAgICBpZiAocExvY2FsZSkgew0KLSAgICAgICAgcmV0dXJuIEZYX05FVyBDWEZBX1hNTExvY2FsZShwTG9jYWxlKTsNCi0gICAgfQ0KKyAgICAweDc4LCAweDlDLCAweEFELCAweDU3LCAweDRELCAweDRGLCAweDEzLCAweDQxLCAweDE4LCAweDNFLCAweDYzLCAweEUyLA0KKyAgICAweDdGLCAweDk4LCAweDZDLCAweDI0LCAweDY4LCAweDAyLCAweEFELCAweDFFLCAweDI1LCAweDY1LCAweDEzLCAweDIyLA0KKyAgICAweDBBLCAweDA2LCAweEQ3LCAweDkwLCAweDE2LCAweDM0LCAweDcyLCAweDMxLCAweERCLCAweERELCAweEExLCAweDVELA0KKyAgICAweEU4LCAweEVFLCAweDkwLCAweEU5LCAweDZFLCAweEIwLCAweDdCLCAweDJBLCAweDg1LCAweEU4LCAweDA1LCAweDI1LA0KKyAgICAweEUxLCAweEEwLCAweDQ3LCAweEY0LCAweEU0LCAweEM5LCAweDUwLCAweEJFLCAweDEyLCAweDgyLCAweEI2LCAweDI0LA0KKyAgICAweEZFLCAweDgyLCAweEQ5LCAweEZGLCAweDYwLCAweEQ0LCAweDlGLCAweEUxLCAweDNCLCAweEZCLCAweEQxLCAweEVFLA0KKyAgICAweEI3LCAweEM1LCAweEQ4LCAweDFFLCAweDNBLCAweEYzLCAweDNFLCAweENGLCAweEYzLCAweENFLCAweEZCLCAweEI1LA0KKyAgICAweEQzLCAweEI2LCAweEQ0LCAweDIwLCAweDhBLCAweERDLCAweEMwLCAweEM4LCAweDkwLCAweDc1LCAweDNDLCAweDIzLA0KKyAgICAweDUwLCAweEVCLCAweDY1LCAweDc5LCAweDQ1LCAweDQwLCAweDJBLCAweDZFLCAweDJBLCAweDMzLCAweEMyLCAweDhGLA0KKyAgICAweEFCLCAweERELCAweERGLCAweDQ3LCAweDVGLCAweDZFLCAweEMzLCAweEM3LCAweEFGLCAweERFLCAweDg3LCAweDlGLA0KKyAgICAweEVGLCAweDhGLCAweEVFLCAweDA4LCAweEUyLCAweENELCAweDFCLCAweDA4LCAweDk1LCAweDM4LCAweERGLCAweDUwLA0KKyAgICAweDY1LCAweDVBLCAweDY5LCAweEU5LCAweDU1LCAweEQyLCAweDY4LCAweEZBLCAweEQyLCAweDFBLCAweEM1LCAweDM1LA0KKyAgICAweDQyLCAweDM1LCAweEQ5LCAweEUwLCAweEFDLCAweDMxLCAweDU0LCAweEQyLCAweDg5LCAweDYxLCAweEQ2LCAweDlGLA0KKyAgICAweDAyLCAweEQ0LCAweEU0LCAweEZCLCAweDMxLCAweDZGLCAweDJGLCAweDNBLCAweEZCLCAweEFDLCAweEM3LCAweDRFLA0KKyAgICAweDU4LCAweEQ3LCAweDY5LCAweDNCLCAweEZCLCAweEE1LCAweEEyLCAweDY3LCAweDBCLCAweEMzLCAweEJCLCAweEVDLA0KKyAgICAweDlDLCAweDlELCAweDM4LCAweDZELCAweEQ2LCAweDY1LCAweDVGLCAweDUzLCAweDA5LCAweEVDLCAweDlCLCAweEFCLA0KKyAgICAweEVELCAweEIwLCAweDZFLCAweDFBLCAweEQ4LCAweDY1LCAweDU3LCAweEEwLCAweDNELCAweENGLCAweEQzLCAweEE2LA0KKyAgICAweDAyLCAweDE3LCAweENFLCAweDNCLCAweEQ2LCAweENCLCAweDg2LCAweDMyLCAweERDLCAweDc1LCAweDIxLCAweDkxLA0KKyAgICAweDUzLCAweDY3LCAweEM3LCAweEQ5LCAweENFLCAweDA4LCAweEM3LCAweEQ5LCAweDg2LCAweDUwLCAweDdBLCAweDRFLA0KKyAgICAweDA3LCAweDcyLCAweDNFLCAweENFLCAweEM4LCAweDk3LCAweEY1LCAweEQ5LCAweDY1LCAweDNFLCAweEExLCAweEM3LA0KKyAgICAweEZBLCAweDc5LCAweEYwLCAweDE5LCAweDFDLCAweDcxLCAweDA5LCAweDkxLCAweEM0LCAweDA5LCAweEM4LCAweDVGLA0KKyAgICAweDBGLCAweDFBLCAweDEwLCAweDZFLCAweDA4LCAweDkyLCAweEFCLCAweDU1LCAweDNBLCAweDIzLCAweERDLCAweDEzLA0KKyAgICAweDkyLCAweDlELCAweDI5LCAweEU0LCAweDM0LCAweDI1LCAweDBELCAweDFCLCAweEExLCAweDFGLCAweDk5LCAweEIyLA0KKyAgICAweEZGLCAweERELCAweDhBLCAweEQ0LCAweEQ4LCAweEZELCAweDFFLCAweEE0LCAweDA2LCAweEUxLCAweDE2LCAweDNGLA0KKyAgICAweDE1LCAweEYxLCAweEFCLCAweDlFLCAweDhBLCAweEI5LCAweDI1LCAweDJGLCAweEU0LCAweEQ3LCAweDVBLCAweDk1LA0KKyAgICAweDVCLCAweEExLCAweEQxLCAweDg3LCAweDlELCAweDA4LCAweDAxLCAweEY2LCAweDIxLCAweDk4LCAweDRCLCAweDNFLA0KKyAgICAweDlGLCAweDdFLCAweDUwLCAweDdCLCAweEVDLCAweEJDLCAweDU0LCAweEU0LCAweEQ4LCAweDkwLCAweDc0LCAweDA1LA0KKyAgICAweDMxLCAweEY1LCAweDAwLCAweDNDLCAweDczLCAweDg3LCAweDc4LCAweDBGLCAweEQ2LCAweDE3LCAweEVDLCAweDMyLA0KKyAgICAweDRFLCAweDNBLCAweDgxLCAweDcyLCAweEY3LCAweEMxLCAweDRGLCAweDFBLCAweDA4LCAweEMzLCAweEQ4LCAweDc2LA0KKyAgICAweEY1LCAweERELCAweDM4LCAweEYwLCAweDA2LCAweENFLCAweEVELCAweDQwLCAweDE0LCAweEU3LCAweDQwLCAweDM4LA0KKyAgICAweDRELCAweDlDLCAweEVCLCAweEVDLCAweDAzLCAweDA4LCAweDBFLCAweDlELCAweEQ3LCAweDQ5LCAweEU1LCAweEI2LA0KKyAgICAweEIzLCAweEMzLCAweDhFLCAweEUxLCAweERELCAweEY3LCAweERBLCAweEVDLCAweDgzLCAweEM4LCAweDVELCAweEE1LA0KKyAgICAweEU0LCAweDFDLCAweDlCLCAweDJFLCAweEQ3LCAweEZGLCAweDgxLCAweEIzLCAweDFELCAweDNGLCAweEYyLCAweDkwLA0KKyAgICAweEY1LCAweEUyLCAweEE2LCAweDAzLCAweEE3LCAweDEzLCAweDM3LCAweDdELCAweDcyLCAweERBLCAweDcxLCAweEQzLA0KKyAgICAweEU3LCAweDI0LCAweEVCLCAweDMwLCAweDQ1LCAweEM4LCAweDhFLCAweEIzLCAweDQzLCAweEQ1LCAweDMxLCAweEQ1LA0KKyAgICAweDU0LCAweDBELCAweEVCLCAweEUxLCAweEVCLCAweEM5LCAweDM3LCAweDg5LCAweEIzLCAweDEyLCAweEI0LCAweDMzLA0KKyAgICAweEQ4LCAweDQ0LCAweEExLCAweEE1LCAweDE4LCAweDg0LCAweDg2LCAweERCLCAweDkwLCAweDczLCAweDRDLCAweEU1LA0KKyAgICAweDkwLCAweDVGLCAweEQ4LCAweEYxLCAweDkxLCAweEU5LCAweDIzLCAweEQ2LCAweDJCLCAweDM4LCAweDZGLCAweDYxLA0KKyAgICAweDZDLCAweEI4LCAweDYxLCAweDg4LCAweDQ0LCAweDhELCAweEM4LCAweDVELCAweDA1LCAweDZBLCAweEI4LCAweDZBLA0KKyAgICAweDhCLCAweEIxLCAweEJCLCAweEQ2LCAweEIzLCAweEFBLCAweEIyLCAweDg5LCAweDk3LCAweDY0LCAweEQzLCAweEM0LA0KKyAgICAweEQ0LCAweDE4LCAweEQ0LCAweDdFLCAweDYwLCAweEYxLCAweEFGLCAweEUzLCAweDM1LCAweEFCLCAweEQxLCAweDEwLA0KKyAgICAweEM0LCAweDM5LCAweDI0LCAweEMxLCAweDBCLCAweEJELCAweDgwLCAweDE3LCAweDlBLCAweDgwLCAweDI3LCAweDY0LA0KKyAgICAweDgyLCAweDU3LCAweDYyLCAweDQwLCAweENELCAweEQyLCAweDM2LCAweDg4LCAweDUxLCAweEZCLCAweDU3LCAweEFELA0KKyAgICAweDhFLCAweDU1LCAweDkwLCAweENFLCAweDE1LCAweDI0LCAweEE5LCAweEMwLCAweDk1LCAweDIzLCAweDY5LCAweDlBLA0KKyAgICAweDc1LCAweDQyLCAweENELCAweEExLCAweDJBLCAweEFFLCAweDQxLCAweDI4LCAweDYyLCAweEYxLCAweDhCLCAweDYwLA0KKyAgICAweDZBLCAweDdBLCAweEFDLCAweDA4LCAweDIxLCAweDRCLCAweEE0LCAweDA4LCAweDBCLCAweEQzLCAweDkyLCAweDM0LA0KKyAgICAweDVELCAweEE5LCAweEEwLCAweEQ1LCAweDUyLCAweDMxLCAweDQ0LCAweEM5LCAweEQyLCAweDc4LCAweEM5LCAweDVGLA0KKyAgICAweDRGLCAweEUzLCAweDI2LCAweEVELCAweDRCLCAweDQ2LCAweDEyLCAweEY4LCAweDE5LCAweDczLCAweDQ5LCAweDlDLA0KKyAgICAweENGLCAweEIzLCAweDhELCAweEU1LCAweEU2LCAweEI3LCAweDdDLCAweDE5LCAweEFDLCAweEMxLCAweDFDLCAweENDLA0KKyAgICAweENCLCAweEM2LCAweEZBLCAweEM2LCAweDgyLCAweERFLCAweEFDLCAweDNDLCAweDlDLCAweDdCLCAweEI0LCAweEY1LA0KKyAgICAweEZDLCAweDU1LCAweDdELCAweEQxLCAweDVFLCAweEY1LCAweDhBLCAweDE0LCAweDI2LCAweEI5LCAweDRBLCAweEMzLA0KKyAgICAweEQyLCAweEFCLCAweDk4LCAweDQ2LCAweDJCLCAweDE1LCAweEIxLCAweEY5LCAweDIxLCAweDgxLCAweDBELCAweDY2LA0KKyAgICAweDU5LCAweDExLCAweDQ0LCAweDdCLCAweEQyLCAweEI2LCAweEVGLCAweDE3LCAweDZDLCAweERCLCAweDJFLCAweDE1LA0KKyAgICAweDIzLCAweEJDLCAweDZDLCAweEE5LCAweDYyLCAweDUxLCAweDhBLCAweDBELCAweEE1LCAweDM1LCAweEQ0LCAweERFLA0KKyAgICAweDFBLCAweDU5LCAweEJCLCAweDg5LCAweEE5LCAweDgyLCAweDBELCAweEQzLCAweDk3LCAweDhFLCAweDI3LCAweDc1LA0KKyAgICAweEJDLCAweDFFLCAweDg5LCAweDFDLCAweDA2LCAweDc5LCAweDBELCAweDUzLCAweDFELCAweDhCLCAweDlBLCAweDdDLA0KKyAgICAweEY3LCAweDJBLCAweDU2LCAweDM0LCAweDVELCAweDg2LCAweDIxLCAweDk4LCAweDBDLCAweEJDLCAweDc4LCAweDcwLA0KKyAgICAweEE2LCAweEEwLCAweDQ2LCAweDg5LCAweEI1LCAweEE5LCAweEYxLCAweDExLCAweEY4LCAweEZFLCAweDcxLCAweDQ0LA0KKyAgICAweEM5LCAweDIwLCAweDg1LCAweEYxLCAweDExLCAweDA1LCAweEJBLCAweDY2LCAweDU4LCAweDRELCAweDQxLCAweDlDLA0KKyAgICAweDFBLCAweDkxLCAweDZFLCAweDYzLCAweDRBLCAweDA0LCAweEYxLCAweDZFLCAweDgyLCAweDNELCAweEFDLCAweDRDLA0KKyAgICAweEE0LCAweEUxLCAweDQxLCAweDM3LCAweDIyLCAweEE1LCAweDg5LCAweDFBLCAweDgzLCAweDI5LCAweDc0LCAweDM3LA0KKyAgICAweDgyLCAweEU4LCAweDdFLCAweDQ3LCAweDQ3LCAweDE5LCAweDM5LCAweDJBLCAweEFELCAweDQ5LCAweEY4LCAweDQyLA0KKyAgICAweDEwLCAweENCLCAweDJCLCAweEU1LCAweDZCLCAweEM4LCAweEMyLCAweDlELCAweDQ4LCAweDg4LCAweERDLCAweEFCLA0KKyAgICAweDJFLCAweDExLCAweDM3LCAweDdGLCAweENBLCAweDVCLCAweDlCLCAweDc4LCAweDRELCAweDU2LCAweDgyLCAweEJCLA0KKyAgICAweDM1LCAweEQ4LCAweEZBLCAweDNFLCAweEE1LCAweDE2LCAweEZDLCAweEUwLCAweDU0LCAweEQxLCAweDEyLCAweEQ0LA0KKyAgICAweEE3LCAweDk4LCAweDRFLCAweEQwLCAweDBDLCAweDhELCAweDE4LCAweDM5LCAweDg0LCAweDA3LCAweEM0LCAweEEyLA0KKyAgICAweDFBLCAweEE2LCAweEE4LCAweDYyLCAweEFBLCAweDE5LCAweDhDLCAweDU5LCAweDk1LCAweDU0LCAweDMxLCAweDVBLA0KKyAgICAweEQyLCAweEZFLCAweDRBLCAweDU5LCAweEMwLCAweDU1LCAweDhBLCAweEI3LCAweDcyLCAweDI5LCAweEIzLCAweDU0LA0KKyAgICAweEFFLCAweEMyLCAweDIzLCAweDk2LCAweDQ3LCAweDU5LCAweEFFLCAweENCLCAweDVBLCAweDA2LCAweDYxLCAweDkxLA0KKyAgICAweEQ4LCAweEQ2LCAweDg2LCAweDhDLCAweEU2LCAweDg5LCAweDU5LCAweEQ3LCAweDE0LCAweDlFLCAweEQzLCAweEQ0LA0KKyAgICAweEIzLCAweEM3LCAweDQ4LCAweENBLCAweDI3LCAweDQzLCAweDAxLCAweDk0LCAweDNBLCAweDA5LCAweEM4LCAweEU1LA0KKyAgICAweERDLCAweEEzLCAweDgxLCAweDVCLCAweEUzLCAweDU5LCAweEEyLCAweDI3LCAweEI5LCAweEI0LCAweDBBLCAweDE5LA0KKyAgICAweDg5LCAweDI2LCAweEI1LCAweDJDLCAweEEzLCAweEI2LCAweDRFLCAweDVDLCAweEE2LCAweDE3LCAweEE0LCAweDdCLA0KKyAgICAweEIzLCAweDg1LCAweEZBLCAweDU5LCAweDJBLCAweDdBLCAweEZGLCAweDNELCAweEM0LCAweDNGLCAweERFLCAweENCLA0KKyAgICAweDhCLCAweEM0fTsNCitzdGF0aWMgSUZYX0xvY2FsZSogWEZBX0dldExvY2FsZUZyb21CdWZmZXIoY29uc3QgdWludDhfdCogcEJ1ZiwgaW50IG5CdWZMZW4pIHsNCisgIGlmIChwQnVmID09IE5VTEwgfHwgbkJ1ZkxlbiA8PSAwKSB7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX0dFTW9kdWxlKiBwR2VNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpOw0KKyAgaWYgKCFwR2VNb2R1bGUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDQ29kZWNfTW9kdWxlTWdyKiBwQ29kZWNNZ3IgPSBwR2VNb2R1bGUtPkdldENvZGVjTW9kdWxlKCk7DQorICBpZiAoIXBDb2RlY01ncikgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENYTUxfRWxlbWVudCogcExvY2FsZSA9IE5VTEw7DQorICB1aW50OF90KiBwT3V0ID0gTlVMTDsNCisgIEZYX0RXT1JEIGR3U2l6ZTsNCisgIHBDb2RlY01nci0+R2V0RmxhdGVNb2R1bGUoKS0+RmxhdGVPckxaV0RlY29kZShGQUxTRSwgcEJ1ZiwgbkJ1ZkxlbiwgVFJVRSwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCBwT3V0LCBkd1NpemUpOw0KKyAgaWYgKHBPdXQpIHsNCisgICAgcExvY2FsZSA9IENYTUxfRWxlbWVudDo6UGFyc2UocE91dCwgZHdTaXplKTsNCisgICAgRlhfRnJlZShwT3V0KTsNCisgIH0NCisgIGlmIChwTG9jYWxlKSB7DQorICAgIHJldHVybiBGWF9ORVcgQ1hGQV9YTUxMb2NhbGUocExvY2FsZSk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotc3RhdGljIEZYX1dPUkQgWEZBX0dldExhbmd1YWdlKENGWF9XaWRlU3RyaW5nIHdzTGFuZ3VhZ2UpDQotew0KLSAgICBGWF9XT1JEIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2VuX1VTOw0KLSAgICBpZiAod3NMYW5ndWFnZS5HZXRMZW5ndGgoKSA8IDIpIHsNCi0gICAgICAgIHJldHVybiBkd0xhbmd1ZUlEOw0KLSAgICB9DQotICAgIHdzTGFuZ3VhZ2UuTWFrZUxvd2VyKCk7DQotICAgIEZYX0RXT1JEIGR3SURGaXJzdCAgPSB3c0xhbmd1YWdlLkdldEF0KDApIDw8IDggfCB3c0xhbmd1YWdlLkdldEF0KDEpOw0KLSAgICBGWF9EV09SRCBkd0lEU2Vjb25kID0gd3NMYW5ndWFnZS5HZXRMZW5ndGgoKSA+PSA1ID8gd3NMYW5ndWFnZS5HZXRBdCgzKSA8PCA4IHwgd3NMYW5ndWFnZS5HZXRBdCg0KSA6IDA7DQotICAgIHN3aXRjaCAoZHdJREZpcnN0KSB7DQotICAgICAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAneicsICdoJyk6IHsNCi0gICAgICAgICAgICAgICAgaWYgKGR3SURTZWNvbmQgPT0gRlhCU1RSX0lEKDAsIDAsICdjJywgJ24nKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfemhfQ047DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ3QnLCAndycpKSB7DQotICAgICAgICAgICAgICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF96aF9UVzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkd0lEU2Vjb25kID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICdrJykpIHsNCi0gICAgICAgICAgICAgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX3poX0hLOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2onLCAnYScpOg0KLSAgICAgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2phX0pQOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2snLCAnbycpOg0KLSAgICAgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2tvX0tSOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2UnLCAnbicpOiB7DQotICAgICAgICAgICAgICAgIGlmIChkd0lEU2Vjb25kID09IEZYQlNUUl9JRCgwLCAwLCAnZycsICdiJykpIHsNCi0gICAgICAgICAgICAgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2VuX0dCOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfZW5fVVM7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnZCcsICdlJyk6DQotICAgICAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfZGVfREU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnZicsICdyJyk6DQotICAgICAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfZnJfRlI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnZScsICdzJyk6IHsNCi0gICAgICAgICAgICAgICAgaWYgKGR3SURTZWNvbmQgPT0gRlhCU1RSX0lEKDAsIDAsICdlJywgJ3MnKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfZXNfRVM7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9lc19MQTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdpJywgJ3QnKToNCi0gICAgICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9pdF9JVDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdwJywgJ3QnKToNCi0gICAgICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9wdF9CUjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICduJywgJ2wnKToNCi0gICAgICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9ubF9OTDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdyJywgJ3UnKToNCi0gICAgICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9ydV9SVTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KK3N0YXRpYyBGWF9XT1JEIFhGQV9HZXRMYW5ndWFnZShDRlhfV2lkZVN0cmluZyB3c0xhbmd1YWdlKSB7DQorICBGWF9XT1JEIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2VuX1VTOw0KKyAgaWYgKHdzTGFuZ3VhZ2UuR2V0TGVuZ3RoKCkgPCAyKSB7DQogICAgIHJldHVybiBkd0xhbmd1ZUlEOw0KKyAgfQ0KKyAgd3NMYW5ndWFnZS5NYWtlTG93ZXIoKTsNCisgIEZYX0RXT1JEIGR3SURGaXJzdCA9IHdzTGFuZ3VhZ2UuR2V0QXQoMCkgPDwgOCB8IHdzTGFuZ3VhZ2UuR2V0QXQoMSk7DQorICBGWF9EV09SRCBkd0lEU2Vjb25kID0gd3NMYW5ndWFnZS5HZXRMZW5ndGgoKSA+PSA1DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gd3NMYW5ndWFnZS5HZXRBdCgzKSA8PCA4IHwgd3NMYW5ndWFnZS5HZXRBdCg0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7DQorICBzd2l0Y2ggKGR3SURGaXJzdCkgew0KKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAneicsICdoJyk6IHsNCisgICAgICBpZiAoZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2MnLCAnbicpKSB7DQorICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF96aF9DTjsNCisgICAgICB9IGVsc2UgaWYgKGR3SURTZWNvbmQgPT0gRlhCU1RSX0lEKDAsIDAsICd0JywgJ3cnKSkgew0KKyAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfemhfVFc7DQorICAgICAgfSBlbHNlIGlmIChkd0lEU2Vjb25kID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICdrJykpIHsNCisgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX3poX0hLOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2onLCAnYScpOg0KKyAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2phX0pQOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnaycsICdvJyk6DQorICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfa29fS1I7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdlJywgJ24nKTogew0KKyAgICAgIGlmIChkd0lEU2Vjb25kID09IEZYQlNUUl9JRCgwLCAwLCAnZycsICdiJykpIHsNCisgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2VuX0dCOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9lbl9VUzsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdkJywgJ2UnKToNCisgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9kZV9ERTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2YnLCAncicpOg0KKyAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2ZyX0ZSOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnZScsICdzJyk6IHsNCisgICAgICBpZiAoZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2UnLCAncycpKSB7DQorICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9lc19FUzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfZXNfTEE7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnaScsICd0Jyk6DQorICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfaXRfSVQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdwJywgJ3QnKToNCisgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9wdF9CUjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ24nLCAnbCcpOg0KKyAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX25sX05MOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAncicsICd1Jyk6DQorICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfcnVfUlU7DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gZHdMYW5ndWVJRDsNCiB9DQogQ1hGQV9Mb2NhbGVNZ3I6OkNYRkFfTG9jYWxlTWdyKENYRkFfTm9kZSogcExvY2FsZVNldCwgQ0ZYX1dpZGVTdHJpbmcgd3NEZWZsY2lkKQ0KLSAgICA6IG1fZHdMb2NhbGVGbGFncygweDAwKQ0KLXsNCi0gICAgbV9kd0RlZmxjaWQgPSBYRkFfR2V0TGFuZ3VhZ2Uod3NEZWZsY2lkKTsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZUxvY2FsZSA9IE5VTEw7DQotICAgIGlmIChwTG9jYWxlU2V0ICYmIChwTm9kZUxvY2FsZSA9IHBMb2NhbGVTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkpIHsNCi0gICAgICAgIHdoaWxlIChwTm9kZUxvY2FsZSkgew0KLSAgICAgICAgICAgIG1fTG9jYWxlQXJyYXkuQWRkKEZYX05FVyBDWEZBX05vZGVMb2NhbGUocE5vZGVMb2NhbGUpKTsNCi0gICAgICAgICAgICBwTm9kZUxvY2FsZSA9IHBOb2RlTG9jYWxlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgfQ0KKyAgICA6IG1fZHdMb2NhbGVGbGFncygweDAwKSB7DQorICBtX2R3RGVmbGNpZCA9IFhGQV9HZXRMYW5ndWFnZSh3c0RlZmxjaWQpOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZUxvY2FsZSA9IE5VTEw7DQorICBpZiAocExvY2FsZVNldCAmJg0KKyAgICAgIChwTm9kZUxvY2FsZSA9IHBMb2NhbGVTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkpIHsNCisgICAgd2hpbGUgKHBOb2RlTG9jYWxlKSB7DQorICAgICAgbV9Mb2NhbGVBcnJheS5BZGQoRlhfTkVXIENYRkFfTm9kZUxvY2FsZShwTm9kZUxvY2FsZSkpOw0KKyAgICAgIHBOb2RlTG9jYWxlID0gcE5vZGVMb2NhbGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQogICAgIH0NCi0gICAgbV9wRGVmTG9jYWxlID0gR2V0TG9jYWxlQnlOYW1lKHdzRGVmbGNpZCk7DQorICB9DQorICBtX3BEZWZMb2NhbGUgPSBHZXRMb2NhbGVCeU5hbWUod3NEZWZsY2lkKTsNCiB9DQotQ1hGQV9Mb2NhbGVNZ3I6On5DWEZBX0xvY2FsZU1ncigpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IG1fTG9jYWxlQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgKChJRlhfTG9jYWxlKiltX0xvY2FsZUFycmF5W2ldKS0+UmVsZWFzZSgpOw0KLSAgICB9DQotICAgIGludDMyX3QgaVhtbHMgPSBtX1hNTExvY2FsZUFycmF5LkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVhtbHM7IGorKykgew0KLSAgICAgICAgKChJRlhfTG9jYWxlKiltX1hNTExvY2FsZUFycmF5W2pdKS0+UmVsZWFzZSgpOw0KLSAgICB9DQorQ1hGQV9Mb2NhbGVNZ3I6On5DWEZBX0xvY2FsZU1ncigpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9Mb2NhbGVBcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAoKElGWF9Mb2NhbGUqKW1fTG9jYWxlQXJyYXlbaV0pLT5SZWxlYXNlKCk7DQorICB9DQorICBpbnQzMl90IGlYbWxzID0gbV9YTUxMb2NhbGVBcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpWG1sczsgaisrKSB7DQorICAgICgoSUZYX0xvY2FsZSopbV9YTUxMb2NhbGVBcnJheVtqXSktPlJlbGVhc2UoKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0xvY2FsZU1ncjo6UmVsZWFzZSgpDQotew0KLSAgICBkZWxldGUgdGhpczsNCit2b2lkIENYRkFfTG9jYWxlTWdyOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQogfQ0KLUZYX1dPUkQgQ1hGQV9Mb2NhbGVNZ3I6OkdldERlZkxvY2FsZUlEKCkNCi17DQotICAgIHJldHVybiBtX2R3RGVmbGNpZDsNCitGWF9XT1JEIENYRkFfTG9jYWxlTWdyOjpHZXREZWZMb2NhbGVJRCgpIHsNCisgIHJldHVybiBtX2R3RGVmbGNpZDsNCiB9DQotSUZYX0xvY2FsZSogQ1hGQV9Mb2NhbGVNZ3I6OkdldERlZkxvY2FsZSgpDQotew0KLSAgICBpZiAobV9wRGVmTG9jYWxlKSB7DQotICAgICAgICByZXR1cm4gbV9wRGVmTG9jYWxlOw0KLSAgICB9IGVsc2UgaWYgKG1fTG9jYWxlQXJyYXkuR2V0U2l6ZSgpKSB7DQotICAgICAgICByZXR1cm4gKElGWF9Mb2NhbGUqKW1fTG9jYWxlQXJyYXlbMF07DQotICAgIH0gZWxzZSBpZiAobV9YTUxMb2NhbGVBcnJheS5HZXRTaXplKCkpIHsNCi0gICAgICAgIHJldHVybiAoSUZYX0xvY2FsZSopbV9YTUxMb2NhbGVBcnJheVswXTsNCi0gICAgfQ0KLSAgICBtX3BEZWZMb2NhbGUgPSBHZXRMb2NhbGUobV9kd0RlZmxjaWQpOw0KLSAgICBpZiAobV9wRGVmTG9jYWxlICE9IE5VTEwpIHsNCi0gICAgICAgIG1fWE1MTG9jYWxlQXJyYXkuQWRkKG1fcERlZkxvY2FsZSk7DQotICAgIH0NCitJRlhfTG9jYWxlKiBDWEZBX0xvY2FsZU1ncjo6R2V0RGVmTG9jYWxlKCkgew0KKyAgaWYgKG1fcERlZkxvY2FsZSkgew0KICAgICByZXR1cm4gbV9wRGVmTG9jYWxlOw0KKyAgfSBlbHNlIGlmIChtX0xvY2FsZUFycmF5LkdldFNpemUoKSkgew0KKyAgICByZXR1cm4gKElGWF9Mb2NhbGUqKW1fTG9jYWxlQXJyYXlbMF07DQorICB9IGVsc2UgaWYgKG1fWE1MTG9jYWxlQXJyYXkuR2V0U2l6ZSgpKSB7DQorICAgIHJldHVybiAoSUZYX0xvY2FsZSopbV9YTUxMb2NhbGVBcnJheVswXTsNCisgIH0NCisgIG1fcERlZkxvY2FsZSA9IEdldExvY2FsZShtX2R3RGVmbGNpZCk7DQorICBpZiAobV9wRGVmTG9jYWxlICE9IE5VTEwpIHsNCisgICAgbV9YTUxMb2NhbGVBcnJheS5BZGQobV9wRGVmTG9jYWxlKTsNCisgIH0NCisgIHJldHVybiBtX3BEZWZMb2NhbGU7DQogfQ0KLUlGWF9Mb2NhbGUqIENYRkFfTG9jYWxlTWdyOjpHZXRMb2NhbGUoRlhfV09SRCBsY2lkKQ0KLXsNCi0gICAgSUZYX0xvY2FsZSogcExvY2FsID0gTlVMTDsNCi0gICAgc3dpdGNoIChsY2lkKSB7DQotICAgICAgICBjYXNlIFhGQV9MQU5HSURfemhfQ046DQotICAgICAgICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ196aENOX0xvY2FsZSwgc2l6ZW9mKGdfemhDTl9Mb2NhbGUpKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0xBTkdJRF96aF9UVzoNCi0gICAgICAgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX3poVFdfTG9jYWxlLCBzaXplb2YoZ196aFRXX0xvY2FsZSkpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfTEFOR0lEX3poX0hLOg0KLSAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfemhIS19Mb2NhbGUsIHNpemVvZihnX3poSEtfTG9jYWxlKSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9MQU5HSURfamFfSlA6DQotICAgICAgICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19qYUpQX0xvY2FsZSwgc2l6ZW9mKGdfamFKUF9Mb2NhbGUpKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0xBTkdJRF9rb19LUjoNCi0gICAgICAgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2tvS1JfTG9jYWxlLCBzaXplb2YoZ19rb0tSX0xvY2FsZSkpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfTEFOR0lEX2VuX0dCOg0KLSAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZW5HQl9Mb2NhbGUsIHNpemVvZihnX2VuR0JfTG9jYWxlKSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9MQU5HSURfZXNfTEE6DQotICAgICAgICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19lc0xBX0xvY2FsZSwgc2l6ZW9mKGdfZXNMQV9Mb2NhbGUpKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0xBTkdJRF9lc19FUzoNCi0gICAgICAgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2VzRVNfTG9jYWxlLCBzaXplb2YoZ19lc0VTX0xvY2FsZSkpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfTEFOR0lEX2RlX0RFOg0KLSAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZGVERV9Mb2FjYWxlLCBzaXplb2YoZ19kZURFX0xvYWNhbGUpKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0xBTkdJRF9mcl9GUjoNCi0gICAgICAgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2ZyRlJfTG9jYWxlLCBzaXplb2YoZ19mckZSX0xvY2FsZSkpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfTEFOR0lEX2l0X0lUOg0KLSAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfaXRJVF9Mb2NhbGUsIHNpemVvZihnX2l0SVRfTG9jYWxlKSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9MQU5HSURfcHRfQlI6DQotICAgICAgICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19wdEJSX0xvY2FsZSwgc2l6ZW9mKGdfcHRCUl9Mb2NhbGUpKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0xBTkdJRF9ubF9OTDoNCi0gICAgICAgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX25sTkxfTG9jYWxlLCBzaXplb2YoZ19ubE5MX0xvY2FsZSkpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfTEFOR0lEX3J1X1JVOg0KLSAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfcnVSVV9Mb2NhbGUsIHNpemVvZihnX3J1UlVfTG9jYWxlKSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9MQU5HSURfZW5fVVM6DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZW5VU19Mb2NhbGUsIHNpemVvZihnX2VuVVNfTG9jYWxlKSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgcmV0dXJuIHBMb2NhbDsNCitJRlhfTG9jYWxlKiBDWEZBX0xvY2FsZU1ncjo6R2V0TG9jYWxlKEZYX1dPUkQgbGNpZCkgew0KKyAgSUZYX0xvY2FsZSogcExvY2FsID0gTlVMTDsNCisgIHN3aXRjaCAobGNpZCkgew0KKyAgICBjYXNlIFhGQV9MQU5HSURfemhfQ046DQorICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ196aENOX0xvY2FsZSwgc2l6ZW9mKGdfemhDTl9Mb2NhbGUpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFOR0lEX3poX1RXOg0KKyAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfemhUV19Mb2NhbGUsIHNpemVvZihnX3poVFdfTG9jYWxlKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBTkdJRF96aF9ISzoNCisgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX3poSEtfTG9jYWxlLCBzaXplb2YoZ196aEhLX0xvY2FsZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQU5HSURfamFfSlA6DQorICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19qYUpQX0xvY2FsZSwgc2l6ZW9mKGdfamFKUF9Mb2NhbGUpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFOR0lEX2tvX0tSOg0KKyAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfa29LUl9Mb2NhbGUsIHNpemVvZihnX2tvS1JfTG9jYWxlKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBTkdJRF9lbl9HQjoNCisgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2VuR0JfTG9jYWxlLCBzaXplb2YoZ19lbkdCX0xvY2FsZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQU5HSURfZXNfTEE6DQorICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19lc0xBX0xvY2FsZSwgc2l6ZW9mKGdfZXNMQV9Mb2NhbGUpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFOR0lEX2VzX0VTOg0KKyAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZXNFU19Mb2NhbGUsIHNpemVvZihnX2VzRVNfTG9jYWxlKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBTkdJRF9kZV9ERToNCisgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2RlREVfTG9hY2FsZSwgc2l6ZW9mKGdfZGVERV9Mb2FjYWxlKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBTkdJRF9mcl9GUjoNCisgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2ZyRlJfTG9jYWxlLCBzaXplb2YoZ19mckZSX0xvY2FsZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQU5HSURfaXRfSVQ6DQorICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19pdElUX0xvY2FsZSwgc2l6ZW9mKGdfaXRJVF9Mb2NhbGUpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFOR0lEX3B0X0JSOg0KKyAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfcHRCUl9Mb2NhbGUsIHNpemVvZihnX3B0QlJfTG9jYWxlKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBTkdJRF9ubF9OTDoNCisgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX25sTkxfTG9jYWxlLCBzaXplb2YoZ19ubE5MX0xvY2FsZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQU5HSURfcnVfUlU6DQorICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19ydVJVX0xvY2FsZSwgc2l6ZW9mKGdfcnVSVV9Mb2NhbGUpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFOR0lEX2VuX1VTOg0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZW5VU19Mb2NhbGUsIHNpemVvZihnX2VuVVNfTG9jYWxlKSk7DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gcExvY2FsOw0KIH0NCi1JRlhfTG9jYWxlKiBDWEZBX0xvY2FsZU1ncjo6R2V0TG9jYWxlQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbGVOYW1lKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBtX0xvY2FsZUFycmF5LkdldFNpemUoKTsNCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gKChJRlhfTG9jYWxlKiltX0xvY2FsZUFycmF5W2ldKTsNCi0gICAgICAgIGlmIChwTG9jYWxlLT5HZXROYW1lKCkgPT0gd3NMb2NhbGVOYW1lKSB7DQotICAgICAgICAgICAgcmV0dXJuIHBMb2NhbGU7DQotICAgICAgICB9DQorSUZYX0xvY2FsZSogQ1hGQV9Mb2NhbGVNZ3I6OkdldExvY2FsZUJ5TmFtZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xvY2FsZU5hbWUpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9Mb2NhbGVBcnJheS5HZXRTaXplKCk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSAoKElGWF9Mb2NhbGUqKW1fTG9jYWxlQXJyYXlbaV0pOw0KKyAgICBpZiAocExvY2FsZS0+R2V0TmFtZSgpID09IHdzTG9jYWxlTmFtZSkgew0KKyAgICAgIHJldHVybiBwTG9jYWxlOw0KICAgICB9DQotICAgIGludDMyX3QgaUxlbiA9IHdzTG9jYWxlTmFtZS5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW4gPCAyKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3QgaUxlbiA9IHdzTG9jYWxlTmFtZS5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuIDwgMikgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlDb3VudCA9IG1fWE1MTG9jYWxlQXJyYXkuR2V0U2l6ZSgpOw0KKyAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSAoKElGWF9Mb2NhbGUqKW1fWE1MTG9jYWxlQXJyYXlbaV0pOw0KKyAgICBpZiAocExvY2FsZS0+R2V0TmFtZSgpID09IHdzTG9jYWxlTmFtZSkgew0KKyAgICAgIHJldHVybiBwTG9jYWxlOw0KICAgICB9DQotICAgIGlDb3VudCA9IG1fWE1MTG9jYWxlQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSAoKElGWF9Mb2NhbGUqKW1fWE1MTG9jYWxlQXJyYXlbaV0pOw0KLSAgICAgICAgaWYgKHBMb2NhbGUtPkdldE5hbWUoKSA9PSB3c0xvY2FsZU5hbWUpIHsNCi0gICAgICAgICAgICByZXR1cm4gcExvY2FsZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWF9XT1JEIGR3TGFuZ3VlSUQgPSBYRkFfR2V0TGFuZ3VhZ2Uod3NMb2NhbGVOYW1lKTsNCi0gICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsZShkd0xhbmd1ZUlEKTsNCi0gICAgaWYgKHBMb2NhbGUgIT0gTlVMTCkgew0KLSAgICAgICAgbV9YTUxMb2NhbGVBcnJheS5BZGQocExvY2FsZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBMb2NhbGU7DQorICB9DQorICBGWF9XT1JEIGR3TGFuZ3VlSUQgPSBYRkFfR2V0TGFuZ3VhZ2Uod3NMb2NhbGVOYW1lKTsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbGUoZHdMYW5ndWVJRCk7DQorICBpZiAocExvY2FsZSAhPSBOVUxMKSB7DQorICAgIG1fWE1MTG9jYWxlQXJyYXkuQWRkKHBMb2NhbGUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBMb2NhbGU7DQogfQ0KLXZvaWQgQ1hGQV9Mb2NhbGVNZ3I6OlNldERlZkxvY2FsZShJRlhfTG9jYWxlKiBwTG9jYWxlKQ0KLXsNCi0gICAgbV9wRGVmTG9jYWxlID0gcExvY2FsZTsNCit2b2lkIENYRkFfTG9jYWxlTWdyOjpTZXREZWZMb2NhbGUoSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgbV9wRGVmTG9jYWxlID0gcExvY2FsZTsNCiB9DQotQ0ZYX1dpZGVTdHJpbmdDCUNYRkFfTG9jYWxlTWdyOjpHZXRDb25maWdMb2NhbGVOYW1lKENYRkFfTm9kZSogcENvbmZpZykNCi17DQotICAgIGlmICghKG1fZHdMb2NhbGVGbGFncyAmIDB4MDEpKSB7DQotICAgICAgICBtX3dzQ29uZmlnTG9jYWxlLkVtcHR5KCk7DQotICAgICAgICBpZiAocENvbmZpZykgew0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcENoaWxkZkNvbmZpZyA9IHBDb25maWctPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0Fjcm9iYXQpOw0KLSAgICAgICAgICAgIGlmICghcENoaWxkZkNvbmZpZykgew0KLSAgICAgICAgICAgICAgICBwQ2hpbGRmQ29uZmlnID0gcENvbmZpZy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfUHJlc2VudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcENvbW1vbiA9IHBDaGlsZGZDb25maWcgPyBwQ2hpbGRmQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db21tb24pIDogTlVMTDsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBMb2NhbGUgPSBwQ29tbW9uID8gcENvbW1vbi0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTG9jYWxlKSA6IE5VTEw7DQotICAgICAgICAgICAgaWYgKHBMb2NhbGUpIHsNCi0gICAgICAgICAgICAgICAgcExvY2FsZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgbV93c0NvbmZpZ0xvY2FsZSwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIG1fZHdMb2NhbGVGbGFncyB8PSAweDAxOw0KK0NGWF9XaWRlU3RyaW5nQyBDWEZBX0xvY2FsZU1ncjo6R2V0Q29uZmlnTG9jYWxlTmFtZShDWEZBX05vZGUqIHBDb25maWcpIHsNCisgIGlmICghKG1fZHdMb2NhbGVGbGFncyAmIDB4MDEpKSB7DQorICAgIG1fd3NDb25maWdMb2NhbGUuRW1wdHkoKTsNCisgICAgaWYgKHBDb25maWcpIHsNCisgICAgICBDWEZBX05vZGUqIHBDaGlsZGZDb25maWcgPQ0KKyAgICAgICAgICBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9BY3JvYmF0KTsNCisgICAgICBpZiAoIXBDaGlsZGZDb25maWcpIHsNCisgICAgICAgIHBDaGlsZGZDb25maWcgPSBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9QcmVzZW50KTsNCisgICAgICB9DQorICAgICAgQ1hGQV9Ob2RlKiBwQ29tbW9uID0NCisgICAgICAgICAgcENoaWxkZkNvbmZpZw0KKyAgICAgICAgICAgICAgPyBwQ2hpbGRmQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db21tb24pDQorICAgICAgICAgICAgICA6IE5VTEw7DQorICAgICAgQ1hGQV9Ob2RlKiBwTG9jYWxlID0NCisgICAgICAgICAgcENvbW1vbiA/IHBDb21tb24tPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0xvY2FsZSkgOiBOVUxMOw0KKyAgICAgIGlmIChwTG9jYWxlKSB7DQorICAgICAgICBwTG9jYWxlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCBtX3dzQ29uZmlnTG9jYWxlLCBGQUxTRSk7DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiBtX3dzQ29uZmlnTG9jYWxlOw0KKyAgICBtX2R3TG9jYWxlRmxhZ3MgfD0gMHgwMTsNCisgIH0NCisgIHJldHVybiBtX3dzQ29uZmlnTG9jYWxlOw0KIH0NCi1zdGF0aWMgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyICpnX3BQcm92aWRlciA9IE5VTEw7DQotSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBJWEZBX1RpbWVab25lUHJvdmlkZXI6OkNyZWF0ZSgpDQotew0KLSAgICBGWFNZU19hc3NlcnQoIWdfcFByb3ZpZGVyKTsNCitzdGF0aWMgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyKiBnX3BQcm92aWRlciA9IE5VTEw7DQorSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBJWEZBX1RpbWVab25lUHJvdmlkZXI6OkNyZWF0ZSgpIHsNCisgIEZYU1lTX2Fzc2VydCghZ19wUHJvdmlkZXIpOw0KKyAgZ19wUHJvdmlkZXIgPSBGWF9ORVcgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyKCk7DQorICByZXR1cm4gZ19wUHJvdmlkZXI7DQorfQ0KK0lYRkFfVGltZVpvbmVQcm92aWRlciogSVhGQV9UaW1lWm9uZVByb3ZpZGVyOjpHZXQoKSB7DQorICBpZiAoIWdfcFByb3ZpZGVyKSB7DQogICAgIGdfcFByb3ZpZGVyID0gRlhfTkVXIENYRkFfVGltZVpvbmVQcm92aWRlcigpOw0KLSAgICByZXR1cm4gZ19wUHJvdmlkZXI7DQorICB9DQorICByZXR1cm4gZ19wUHJvdmlkZXI7DQogfQ0KLUlYRkFfVGltZVpvbmVQcm92aWRlciogSVhGQV9UaW1lWm9uZVByb3ZpZGVyOjpHZXQoKQ0KLXsNCi0gICAgaWYgKCFnX3BQcm92aWRlcikgew0KLSAgICAgICAgZ19wUHJvdmlkZXIgPSBGWF9ORVcgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGdfcFByb3ZpZGVyOw0KLX0NCi12b2lkIElYRkFfVGltZVpvbmVQcm92aWRlcjo6RGVzdHJveSgpDQotew0KLSAgICBkZWxldGUgZ19wUHJvdmlkZXI7DQotICAgIGdfcFByb3ZpZGVyID0gTlVMTDsNCit2b2lkIElYRkFfVGltZVpvbmVQcm92aWRlcjo6RGVzdHJveSgpIHsNCisgIGRlbGV0ZSBnX3BQcm92aWRlcjsNCisgIGdfcFByb3ZpZGVyID0gTlVMTDsNCiB9DQogI2luY2x1ZGUgPHRpbWUuaD4NCi1DWEZBX1RpbWVab25lUHJvdmlkZXI6OkNYRkFfVGltZVpvbmVQcm92aWRlcigpDQotew0KLSNpZiBfRlhNX1BMQVRGT1JNXz09X0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KLSAgICBfdHpzZXQoKTsNCi0gICAgbV90ei50ekhvdXIgPSAoaW50OF90KShfdGltZXpvbmUgLyAzNjAwICogLTEpOw0KLSAgICBtX3R6LnR6TWludXRlID0gKGludDhfdCkoKEZYU1lTX2FicyhfdGltZXpvbmUpICUgMzYwMCkgLyA2MCk7DQorQ1hGQV9UaW1lWm9uZVByb3ZpZGVyOjpDWEZBX1RpbWVab25lUHJvdmlkZXIoKSB7DQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgIF90enNldCgpOw0KKyAgbV90ei50ekhvdXIgPSAoaW50OF90KShfdGltZXpvbmUgLyAzNjAwICogLTEpOw0KKyAgbV90ei50ek1pbnV0ZSA9IChpbnQ4X3QpKChGWFNZU19hYnMoX3RpbWV6b25lKSAlIDM2MDApIC8gNjApOw0KICNlbHNlDQotICAgIHR6c2V0KCk7DQotICAgIG1fdHoudHpIb3VyID0gKGludDhfdCkodGltZXpvbmUgLyAzNjAwICogLTEpOw0KLSAgICBtX3R6LnR6TWludXRlID0gKGludDhfdCkoKEZYU1lTX2FicygoaW50KXRpbWV6b25lKSAlIDM2MDApIC8gNjApOw0KKyAgdHpzZXQoKTsNCisgIG1fdHoudHpIb3VyID0gKGludDhfdCkodGltZXpvbmUgLyAzNjAwICogLTEpOw0KKyAgbV90ei50ek1pbnV0ZSA9IChpbnQ4X3QpKChGWFNZU19hYnMoKGludCl0aW1lem9uZSkgJSAzNjAwKSAvIDYwKTsNCiAjZW5kaWYNCiB9DQotQ1hGQV9UaW1lWm9uZVByb3ZpZGVyOjp+Q1hGQV9UaW1lWm9uZVByb3ZpZGVyKCkNCi17DQorQ1hGQV9UaW1lWm9uZVByb3ZpZGVyOjp+Q1hGQV9UaW1lWm9uZVByb3ZpZGVyKCkge30NCit2b2lkIENYRkFfVGltZVpvbmVQcm92aWRlcjo6U2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSB7DQorICBtX3R6ID0gdHo7DQogfQ0KLXZvaWQgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyOjpTZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopDQotew0KLSAgICBtX3R6ID0gdHo7DQotfQ0KLXZvaWQgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyOjpHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopDQotew0KLSAgICB0eiA9IG1fdHo7DQordm9pZCBDWEZBX1RpbWVab25lUHJvdmlkZXI6OkdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikgew0KKyAgdHogPSBtX3R6Ow0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxldmFsdWUuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZXZhbHVlLmNwcAppbmRleCBiOGQxNTI2Li5iZjg3YzhhIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxldmFsdWUuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGV2YWx1ZS5jcHAKQEAgLTE2LDk2MSArMTYsOTkxIEBACiAjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCiAjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KICNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQotc3RhdGljIGNvbnN0IEZYX0RPVUJMRSBmcmFjdGlvbl9zY2FsZXNbXSA9IHswLjEsIDAuMDEsIDAuMDAxLCAwLjAwMDEsIDAuMDAwMDEsIDAuMDAwMDAxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAxLCAwLjAwMDAwMDAxLCAwLjAwMDAwMDAwMSwgMC4wMDAwMDAwMDAxLCAwLjAwMDAwMDAwMDAxLCAwLjAwMDAwMDAwMDAwMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMSwgMC4wMDAwMDAwMDAwMDAwMSwgMC4wMDAwMDAwMDAwMDAwMDEsIDAuMDAwMDAwMDAwMDAwMDAwMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KLXN0YXRpYyBGWF9CT09MIElzQWxwaGEoRlhfV0NIQVIgYykNCi17DQotICAgIHJldHVybiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJyk7DQorc3RhdGljIGNvbnN0IEZYX0RPVUJMRSBmcmFjdGlvbl9zY2FsZXNbXSA9IHswLjEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAwMDAwMDF9Ow0KK3N0YXRpYyBGWF9CT09MIElzQWxwaGEoRlhfV0NIQVIgYykgew0KKyAgcmV0dXJuIChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKTsNCiB9DQotQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZSgpDQotew0KLSAgICBtX2R3VHlwZSA9IFhGQV9WVF9OVUxMOw0KLSAgICBtX2JWYWxpZCA9IFRSVUU7DQotICAgIG1fcExvY2FsZU1nciA9IE5VTEw7DQorQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZSgpIHsNCisgIG1fZHdUeXBlID0gWEZBX1ZUX05VTEw7DQorICBtX2JWYWxpZCA9IFRSVUU7DQorICBtX3BMb2NhbGVNZ3IgPSBOVUxMOw0KIH0NCi1DWEZBX0xvY2FsZVZhbHVlOjpDWEZBX0xvY2FsZVZhbHVlKGNvbnN0IENYRkFfTG9jYWxlVmFsdWUmIHZhbHVlKQ0KLXsNCi0gICAgbV9kd1R5cGUgPSBYRkFfVlRfTlVMTDsNCi0gICAgbV9iVmFsaWQgPSBUUlVFOw0KLSAgICBtX3BMb2NhbGVNZ3IgPSBOVUxMOw0KLSAgICAqdGhpcyA9IHZhbHVlOw0KK0NYRkFfTG9jYWxlVmFsdWU6OkNYRkFfTG9jYWxlVmFsdWUoY29uc3QgQ1hGQV9Mb2NhbGVWYWx1ZSYgdmFsdWUpIHsNCisgIG1fZHdUeXBlID0gWEZBX1ZUX05VTEw7DQorICBtX2JWYWxpZCA9IFRSVUU7DQorICBtX3BMb2NhbGVNZ3IgPSBOVUxMOw0KKyAgKnRoaXMgPSB2YWx1ZTsNCiB9DQotQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZShGWF9EV09SRCBkd1R5cGUsIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKQ0KLXsNCi0gICAgbV9kd1R5cGUgPSBkd1R5cGU7DQotICAgIG1fYlZhbGlkID0gKG1fZHdUeXBlICE9IFhGQV9WVF9OVUxMKTsNCi0gICAgbV9wTG9jYWxlTWdyID0gcExvY2FsZU1ncjsNCitDWEZBX0xvY2FsZVZhbHVlOjpDWEZBX0xvY2FsZVZhbHVlKEZYX0RXT1JEIGR3VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKSB7DQorICBtX2R3VHlwZSA9IGR3VHlwZTsNCisgIG1fYlZhbGlkID0gKG1fZHdUeXBlICE9IFhGQV9WVF9OVUxMKTsNCisgIG1fcExvY2FsZU1nciA9IHBMb2NhbGVNZ3I7DQogfQ0KLUNYRkFfTG9jYWxlVmFsdWU6OkNYRkFfTG9jYWxlVmFsdWUoRlhfRFdPUkQgZHdUeXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IpDQotew0KLSAgICBtX3dzVmFsdWUgPSB3c1ZhbHVlOw0KLSAgICBtX2R3VHlwZSA9IGR3VHlwZTsNCi0gICAgbV9wTG9jYWxlTWdyID0gcExvY2FsZU1ncjsNCi0gICAgbV9iVmFsaWQgPSBWYWxpZGF0ZUNhbm9uaWNhbFZhbHVlKHdzVmFsdWUsIGR3VHlwZSk7DQorQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZShGWF9EV09SRCBkd1R5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKSB7DQorICBtX3dzVmFsdWUgPSB3c1ZhbHVlOw0KKyAgbV9kd1R5cGUgPSBkd1R5cGU7DQorICBtX3BMb2NhbGVNZ3IgPSBwTG9jYWxlTWdyOw0KKyAgbV9iVmFsaWQgPSBWYWxpZGF0ZUNhbm9uaWNhbFZhbHVlKHdzVmFsdWUsIGR3VHlwZSk7DQogfQ0KLUNYRkFfTG9jYWxlVmFsdWU6OkNYRkFfTG9jYWxlVmFsdWUoRlhfRFdPUkQgZHdUeXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlLCBDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncikNCi17DQotICAgIG1fcExvY2FsZU1nciA9IHBMb2NhbGVNZ3I7DQotICAgIG1fYlZhbGlkID0gVFJVRTsNCi0gICAgbV9kd1R5cGUgPSBkd1R5cGU7DQotICAgIG1fYlZhbGlkID0gUGFyc2VQYXR0ZXJuVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KK0NYRkFfTG9jYWxlVmFsdWU6OkNYRkFfTG9jYWxlVmFsdWUoRlhfRFdPUkQgZHdUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IpIHsNCisgIG1fcExvY2FsZU1nciA9IHBMb2NhbGVNZ3I7DQorICBtX2JWYWxpZCA9IFRSVUU7DQorICBtX2R3VHlwZSA9IGR3VHlwZTsNCisgIG1fYlZhbGlkID0gUGFyc2VQYXR0ZXJuVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KIH0NCi1DWEZBX0xvY2FsZVZhbHVlJiBDWEZBX0xvY2FsZVZhbHVlOjpvcGVyYXRvciA9IChjb25zdCBDWEZBX0xvY2FsZVZhbHVlJiB2YWx1ZSkNCi17DQotICAgIG1fd3NWYWx1ZSA9IHZhbHVlLm1fd3NWYWx1ZTsNCi0gICAgbV9kd1R5cGUgPSB2YWx1ZS5tX2R3VHlwZTsNCi0gICAgbV9iVmFsaWQgPSB2YWx1ZS5tX2JWYWxpZDsNCi0gICAgbV9wTG9jYWxlTWdyID0gdmFsdWUubV9wTG9jYWxlTWdyOw0KLSAgICByZXR1cm4gKnRoaXM7DQorQ1hGQV9Mb2NhbGVWYWx1ZSYgQ1hGQV9Mb2NhbGVWYWx1ZTo6b3BlcmF0b3I9KGNvbnN0IENYRkFfTG9jYWxlVmFsdWUmIHZhbHVlKSB7DQorICBtX3dzVmFsdWUgPSB2YWx1ZS5tX3dzVmFsdWU7DQorICBtX2R3VHlwZSA9IHZhbHVlLm1fZHdUeXBlOw0KKyAgbV9iVmFsaWQgPSB2YWx1ZS5tX2JWYWxpZDsNCisgIG1fcExvY2FsZU1nciA9IHZhbHVlLm1fcExvY2FsZU1ncjsNCisgIHJldHVybiAqdGhpczsNCiB9DQotQ1hGQV9Mb2NhbGVWYWx1ZTo6fkNYRkFfTG9jYWxlVmFsdWUoKQ0KLXsNCi19DQotc3RhdGljIEZYX0xPQ0FMRUNBVEVHT1JZIFhGQV9WYWx1Z2VDYXRlZ29yeShGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnksIEZYX0RXT1JEIGR3VmFsdWVUeXBlKQ0KLXsNCi0gICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duKSB7DQotICAgICAgICBzd2l0Y2ggKGR3VmFsdWVUeXBlKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfVlRfQk9PTEVBTjoNCi0gICAgICAgICAgICBjYXNlIFhGQV9WVF9JTlRFR0VSOg0KLSAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0RFQ0lNQUw6DQotICAgICAgICAgICAgY2FzZSBYRkFfVlRfRkxPQVQ6DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9OdW07DQotICAgICAgICAgICAgY2FzZSBYRkFfVlRfVEVYVDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ7DQotICAgICAgICAgICAgY2FzZSBYRkFfVlRfREFURToNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU7DQotICAgICAgICAgICAgY2FzZSBYRkFfVlRfVElNRToNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU7DQotICAgICAgICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTsNCi0gICAgICAgIH0NCitDWEZBX0xvY2FsZVZhbHVlOjp+Q1hGQV9Mb2NhbGVWYWx1ZSgpIHt9DQorc3RhdGljIEZYX0xPQ0FMRUNBVEVHT1JZIFhGQV9WYWx1Z2VDYXRlZ29yeShGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1ZhbHVlVHlwZSkgew0KKyAgaWYgKGVDYXRlZ29yeSA9PSBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duKSB7DQorICAgIHN3aXRjaCAoZHdWYWx1ZVR5cGUpIHsNCisgICAgICBjYXNlIFhGQV9WVF9CT09MRUFOOg0KKyAgICAgIGNhc2UgWEZBX1ZUX0lOVEVHRVI6DQorICAgICAgY2FzZSBYRkFfVlRfREVDSU1BTDoNCisgICAgICBjYXNlIFhGQV9WVF9GTE9BVDoNCisgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9OdW07DQorICAgICAgY2FzZSBYRkFfVlRfVEVYVDoNCisgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9UZXh0Ow0KKyAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6DQorICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZTsNCisgICAgICBjYXNlIFhGQV9WVF9USU1FOg0KKyAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU7DQorICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6DQorICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7DQogICAgIH0NCi0gICAgcmV0dXJuIGVDYXRlZ29yeTsNCisgIH0NCisgIHJldHVybiBlQ2F0ZWdvcnk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6VmFsaWRhdGVWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgSUZYX0xvY2FsZSogcExvY2FsZSwgQ0ZYX1dpZGVTdHJpbmcqIHBNYXRjaEZvcm1hdCApDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsNCi0gICAgSUZYX0xvY2FsZSogbG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsNCi0gICAgaWYgKHBMb2NhbGUpIHsNCi0gICAgICAgIG1fcExvY2FsZU1nci0+U2V0RGVmTG9jYWxlKHBMb2NhbGUpOw0KLSAgICB9DQotICAgIElGWF9Gb3JtYXRTdHJpbmcqIHBGb3JtYXQgPSBJRlhfRm9ybWF0U3RyaW5nOjpDcmVhdGUobV9wTG9jYWxlTWdyLCBGQUxTRSk7DQotICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NQYXR0ZXJuczsNCi0gICAgcEZvcm1hdC0+U3BsaXRGb3JtYXRTdHJpbmcod3NQYXR0ZXJuLCB3c1BhdHRlcm5zKTsNCi0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQotICAgIGludDMyX3QgaUNvdW50ID0gd3NQYXR0ZXJucy5HZXRTaXplKCk7DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGZvciAoOyBpIDwgaUNvdW50ICYmICFiUmV0OyBpKyspIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0ID0gd3NQYXR0ZXJuc1tpXTsNCi0gICAgICAgIEZYX0xPQ0FMRUNBVEVHT1JZIGVDYXRlZ29yeSA9IHBGb3JtYXQtPkdldENhdGVnb3J5KHdzRm9ybWF0KTsNCi0gICAgICAgIGVDYXRlZ29yeSA9IFhGQV9WYWx1Z2VDYXRlZ29yeShlQ2F0ZWdvcnksIG1fZHdUeXBlKTsNCi0gICAgICAgIHN3aXRjaCAoZUNhdGVnb3J5KSB7DQotICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9OdWxsOg0KLSAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VOdWxsKHdzVmFsdWUsIHdzRm9ybWF0KTsNCi0gICAgICAgICAgICAgICAgaWYgKCFiUmV0KSB7DQotICAgICAgICAgICAgICAgICAgICBiUmV0ID0gd3NWYWx1ZS5Jc0VtcHR5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvOg0KLSAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VaZXJvKHdzVmFsdWUsIHdzRm9ybWF0KTsNCi0gICAgICAgICAgICAgICAgaWYgKCFiUmV0KSB7DQotICAgICAgICAgICAgICAgICAgICBiUmV0ID0gd3NWYWx1ZSA9PSBGWF9XU1RSQyhMIjAiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bTogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZk51bTsNCi0gICAgICAgICAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZU51bSh3c1ZhbHVlLCB3c0Zvcm1hdCwgZk51bSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIWJSZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0TnVtKHdzVmFsdWUsIHdzRm9ybWF0LCB3c091dHB1dCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGV4dDoNCi0gICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlVGV4dCh3c1ZhbHVlLCB3c0Zvcm1hdCwgd3NPdXRwdXQpOw0KLSAgICAgICAgICAgICAgICB3c091dHB1dC5FbXB0eSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoIWJSZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXRUZXh0KHdzVmFsdWUsIHdzRm9ybWF0LCB3c091dHB1dCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfVW5pdGltZSBkdDsNCi0gICAgICAgICAgICAgICAgICAgIGJSZXQgPSBWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NWYWx1ZSwgZHQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiUmV0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9EYXRlLCBkdCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiUmV0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXREYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgd3NPdXRwdXQsIEZYX0RBVEVUSU1FVFlQRV9EYXRlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGltZTogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7DQotICAgICAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX1RpbWUsIGR0KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghYlJldCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXREYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgd3NPdXRwdXQsIEZYX0RBVEVUSU1FVFlQRV9UaW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7DQotICAgICAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lLCBkdCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIWJSZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIHdzT3V0cHV0LCBGWF9EQVRFVElNRVRZUEVfRGF0ZVRpbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBiUmV0ID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChiUmV0ICYmIHBNYXRjaEZvcm1hdCkgew0KLSAgICAgICAgKnBNYXRjaEZvcm1hdCA9IHdzUGF0dGVybnNbaSAtIDFdOw0KLSAgICB9DQotICAgIHBGb3JtYXQtPlJlbGVhc2UoKTsNCi0gICAgaWYgKHBMb2NhbGUpIHsNCi0gICAgICAgIG1fcExvY2FsZU1nci0+U2V0RGVmTG9jYWxlKGxvY2FsZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIGJSZXQ7DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfTG9jYWxlVmFsdWU6OkdldFZhbHVlKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3dzVmFsdWU7DQotfQ0KLUZYX0RXT1JEIENYRkFfTG9jYWxlVmFsdWU6OkdldFR5cGUoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fZHdUeXBlOw0KLX0NCi12b2lkIENYRkFfTG9jYWxlVmFsdWU6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBGWF9EV09SRCBkd1R5cGUpDQotew0KLSAgICBtX3dzVmFsdWUgPSB3c1ZhbHVlOw0KLSAgICBtX2R3VHlwZSA9IGR3VHlwZTsNCi19DQotQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0VGV4dCgpIGNvbnN0DQotew0KLSAgICBpZiAobV9iVmFsaWQgJiYgbV9kd1R5cGUgPT0gWEZBX1ZUX1RFWFQpIHsNCi0gICAgICAgIHJldHVybiBtX3dzVmFsdWU7DQotICAgIH0NCi0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQotfQ0KLUZYX0ZMT0FUIENYRkFfTG9jYWxlVmFsdWU6OkdldE51bSgpIGNvbnN0DQotew0KLSAgICBpZiAobV9iVmFsaWQgJiYgKG1fZHdUeXBlID09IFhGQV9WVF9CT09MRUFOIHx8IG1fZHdUeXBlID09IFhGQV9WVF9JTlRFR0VSIHx8DQotICAgICAgICAgICAgICAgICAgICAgbV9kd1R5cGUgPT0gWEZBX1ZUX0RFQ0lNQUwgfHwgbV9kd1R5cGUgPT0gWEZBX1ZUX0ZMT0FUKSkgew0KLSAgICAgICAgaW50NjRfdCBuSW50ZWdyYWwgPSAwOw0KLSAgICAgICAgRlhfRFdPUkQgZHdGcmFjdGlvbmFsID0gMDsNCi0gICAgICAgIGludDMyX3QgbkV4cG9uZW50ID0gMDsNCi0gICAgICAgIGludCBjYyA9IDA7DQotICAgICAgICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFLCBiRXhwU2lnbiA9IEZBTFNFOw0KLSAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IChjb25zdCBGWF9XQ0hBUiopbV93c1ZhbHVlOw0KLSAgICAgICAgaW50IGxlbiA9IG1fd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCi0gICAgICAgIHdoaWxlIChYRkFfSXNTcGFjZShzdHJbY2NdKSAmJiBjYyA8IGxlbikgew0KLSAgICAgICAgICAgIGNjKys7DQotICAgICAgICB9DQotICAgICAgICBpZiAoY2MgPj0gbGVuKSB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgICAgICBpZiAoc3RyWzBdID09ICcrJykgew0KLSAgICAgICAgICAgIGNjKys7DQotICAgICAgICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsNCi0gICAgICAgICAgICBiTmVnYXRpdmUgPSBUUlVFOw0KLSAgICAgICAgICAgIGNjKys7DQotICAgICAgICB9DQotICAgICAgICBpbnQgbkludGVncmFsTGVuID0gMDsNCi0gICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcuJyB8fCAhWEZBX0lzRGlnaXQoc3RyW2NjXSkgfHwgbkludGVncmFsTGVuID4gMTcpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG5JbnRlZ3JhbCA9IG5JbnRlZ3JhbCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCi0gICAgICAgICAgICBjYyArKzsNCi0gICAgICAgICAgICBuSW50ZWdyYWxMZW4rKzsNCi0gICAgICAgIH0NCi0gICAgICAgIG5JbnRlZ3JhbCA9IGJOZWdhdGl2ZSA/IC1uSW50ZWdyYWwgOiBuSW50ZWdyYWw7DQotICAgICAgICBpbnQgc2NhbGUgPSAwOw0KLSAgICAgICAgZG91YmxlIGZyYWN0aW9uID0gMC4wOw0KLSAgICAgICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7DQotICAgICAgICAgICAgY2MgKys7DQotICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQotICAgICAgICAgICAgICAgIGZyYWN0aW9uICs9IGZyYWN0aW9uX3NjYWxlc1tzY2FsZV0gKiAoc3RyW2NjXSAtICcwJyk7DQotICAgICAgICAgICAgICAgIHNjYWxlICsrOw0KLSAgICAgICAgICAgICAgICBjYyArKzsNCi0gICAgICAgICAgICAgICAgaWYgKHNjYWxlID09IHNpemVvZiBmcmFjdGlvbl9zY2FsZXMgLyBzaXplb2YoZG91YmxlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZHdGcmFjdGlvbmFsID0gKEZYX0RXT1JEKShmcmFjdGlvbiAqIDQyOTQ5NjcyOTYuMCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoY2MgPCBsZW4gJiYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgew0KLSAgICAgICAgICAgIGNjICsrOw0KLSAgICAgICAgICAgIGlmIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQotICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcuJyB8fCAhWEZBX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG5FeHBvbmVudCA9IG5FeHBvbmVudCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCi0gICAgICAgICAgICAgICAgY2MgKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG5FeHBvbmVudCA9IGJFeHBTaWduID8gLW5FeHBvbmVudCA6IG5FeHBvbmVudDsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IChGWF9GTE9BVCkoZHdGcmFjdGlvbmFsIC8gNDI5NDk2NzI5Ni4wKTsNCi0gICAgICAgIGZWYWx1ZSA9IG5JbnRlZ3JhbCArIChuSW50ZWdyYWwgPj0gMCA/IGZWYWx1ZSA6IC1mVmFsdWUpOw0KLSAgICAgICAgaWYgKG5FeHBvbmVudCAhPSAwKSB7DQotICAgICAgICAgICAgZlZhbHVlICo9IEZYU1lTX3BvdygxMCwgKEZYX0ZMT0FUKW5FeHBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZlZhbHVlOw0KLSAgICB9DQotICAgIHJldHVybiAwOw0KLX0NCi1GWF9ET1VCTEUgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0RG91YmxlTnVtKCkgY29uc3QNCi17DQotICAgIGlmIChtX2JWYWxpZCAmJiAobV9kd1R5cGUgPT0gWEZBX1ZUX0JPT0xFQU4gfHwgbV9kd1R5cGUgPT0gWEZBX1ZUX0lOVEVHRVIgfHwNCi0gICAgICAgICAgICAgICAgICAgICBtX2R3VHlwZSA9PSBYRkFfVlRfREVDSU1BTCB8fCBtX2R3VHlwZSA9PSBYRkFfVlRfRkxPQVQpKSB7DQotICAgICAgICBpbnQ2NF90IG5JbnRlZ3JhbCA9IDA7DQotICAgICAgICBGWF9EV09SRCBkd0ZyYWN0aW9uYWwgPSAwOw0KLSAgICAgICAgaW50MzJfdCBuRXhwb25lbnQgPSAwOw0KLSAgICAgICAgaW50MzJfdCBjYyA9IDA7DQotICAgICAgICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFLCBiRXhwU2lnbiA9IEZBTFNFOw0KLSAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IChjb25zdCBGWF9XQ0hBUiopbV93c1ZhbHVlOw0KLSAgICAgICAgaW50IGxlbiA9IG1fd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCi0gICAgICAgIHdoaWxlIChYRkFfSXNTcGFjZShzdHJbY2NdKSAmJiBjYyA8IGxlbikgew0KLSAgICAgICAgICAgIGNjKys7DQotICAgICAgICB9DQotICAgICAgICBpZiAoY2MgPj0gbGVuKSB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgICAgICBpZiAoc3RyWzBdID09ICcrJykgew0KLSAgICAgICAgICAgIGNjKys7DQotICAgICAgICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsNCi0gICAgICAgICAgICBiTmVnYXRpdmUgPSBUUlVFOw0KLSAgICAgICAgICAgIGNjKys7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IG5JbnRlZ3JhbExlbiA9IDA7DQotICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCi0gICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pIHx8IG5JbnRlZ3JhbExlbiA+IDE3KSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBuSW50ZWdyYWwgPSBuSW50ZWdyYWwgKiAxMCArIHN0cltjY10gLSAnMCc7DQotICAgICAgICAgICAgY2MgKys7DQotICAgICAgICAgICAgbkludGVncmFsTGVuKys7DQotICAgICAgICB9DQotICAgICAgICBuSW50ZWdyYWwgPSBiTmVnYXRpdmUgPyAtbkludGVncmFsIDogbkludGVncmFsOw0KLSAgICAgICAgaW50MzJfdCBzY2FsZSA9IDA7DQotICAgICAgICBGWF9ET1VCTEUgZnJhY3Rpb24gPSAwLjA7DQotICAgICAgICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsNCi0gICAgICAgICAgICBjYyArKzsNCi0gICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCi0gICAgICAgICAgICAgICAgZnJhY3Rpb24gKz0gZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsNCi0gICAgICAgICAgICAgICAgc2NhbGUgKys7DQotICAgICAgICAgICAgICAgIGNjICsrOw0KLSAgICAgICAgICAgICAgICBpZiAoc2NhbGUgPT0gc2l6ZW9mIGZyYWN0aW9uX3NjYWxlcyAvIHNpemVvZihGWF9ET1VCTEUpDQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkd0ZyYWN0aW9uYWwgPSAoRlhfRFdPUkQpKGZyYWN0aW9uICogNDI5NDk2NzI5Ni4wKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChjYyA8IGxlbiAmJiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQotICAgICAgICAgICAgY2MgKys7DQotICAgICAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQotICAgICAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KLSAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgew0KLSAgICAgICAgICAgICAgICAgICAgYkV4cFNpZ24gPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCi0gICAgICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbkV4cG9uZW50ID0gbkV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KLSAgICAgICAgICAgICAgICBjYyArKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbkV4cG9uZW50ID0gYkV4cFNpZ24gPyAtbkV4cG9uZW50IDogbkV4cG9uZW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IChkd0ZyYWN0aW9uYWwgLyA0Mjk0OTY3Mjk2LjApOw0KLSAgICAgICAgZFZhbHVlID0gbkludGVncmFsICsgKG5JbnRlZ3JhbCA+PSAwID8gZFZhbHVlIDogLWRWYWx1ZSk7DQotICAgICAgICBpZiAobkV4cG9uZW50ICE9IDApIHsNCi0gICAgICAgICAgICBkVmFsdWUgKj0gRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpbkV4cG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBkVmFsdWU7DQotICAgIH0NCi0gICAgcmV0dXJuIDA7DQotfQ0KLUNGWF9Vbml0aW1lIENYRkFfTG9jYWxlVmFsdWU6OkdldERhdGUoKSBjb25zdA0KLXsNCi0gICAgaWYgKG1fYlZhbGlkICYmIG1fZHdUeXBlID09IFhGQV9WVF9EQVRFKSB7DQotICAgICAgICBDRlhfVW5pdGltZSBkdDsNCi0gICAgICAgIEZYX0RhdGVGcm9tQ2Fub25pY2FsKG1fd3NWYWx1ZSwgZHQpOw0KLSAgICAgICAgcmV0dXJuIGR0Ow0KLSAgICB9DQotICAgIHJldHVybiBDRlhfVW5pdGltZSgpOw0KLX0NCi1DRlhfVW5pdGltZSBDWEZBX0xvY2FsZVZhbHVlOjpHZXRUaW1lKCkgY29uc3QNCi17DQotICAgIGlmIChtX2JWYWxpZCAmJiBtX2R3VHlwZSA9PSBYRkFfVlRfVElNRSkgew0KLSAgICAgICAgQ0ZYX1VuaXRpbWUgZHQoMCk7DQotICAgICAgICBGWFNZU19hc3NlcnQobV9wTG9jYWxlTWdyKTsNCi0gICAgICAgIEZYX1RpbWVGcm9tQ2Fub25pY2FsKG1fd3NWYWx1ZSwgZHQsIG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCkpOw0KLSAgICAgICAgcmV0dXJuIGR0Ow0KLSAgICB9DQotICAgIHJldHVybiBDRlhfVW5pdGltZSgpOw0KLX0NCi1DRlhfVW5pdGltZSBDWEZBX0xvY2FsZVZhbHVlOjpHZXREYXRlVGltZSgpIGNvbnN0DQotew0KLSAgICBpZiAobV9iVmFsaWQgJiYgbV9kd1R5cGUgPT0gWEZBX1ZUX0RBVEVUSU1FKSB7DQotICAgICAgICBpbnQzMl90IGluZGV4ID0gbV93c1ZhbHVlLkZpbmQoJ1QnKTsNCi0gICAgICAgIENGWF9Vbml0aW1lIGR0Ow0KLSAgICAgICAgRlhfRGF0ZUZyb21DYW5vbmljYWwobV93c1ZhbHVlLkxlZnQoaW5kZXgpLCBkdCk7DQotICAgICAgICBGWFNZU19hc3NlcnQobV9wTG9jYWxlTWdyKTsNCi0gICAgICAgIEZYX1RpbWVGcm9tQ2Fub25pY2FsKG1fd3NWYWx1ZS5SaWdodChtX3dzVmFsdWUuR2V0TGVuZ3RoKCkgLSBpbmRleCAtIDEpLCBkdCwgbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKSk7DQotICAgICAgICByZXR1cm4gZHQ7DQotICAgIH0NCi0gICAgcmV0dXJuIENGWF9Vbml0aW1lKCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KQ0KLXsNCi0gICAgbV9kd1R5cGUgPSBYRkFfVlRfVEVYVDsNCi0gICAgbV93c1ZhbHVlID0gd3NUZXh0Ow0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSkNCi17DQotICAgIG1fZHdUeXBlID0gWEZBX1ZUX1RFWFQ7DQotICAgIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzVGV4dCwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KLX0NCi1GWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldE51bShGWF9GTE9BVCBmTnVtKQ0KLXsNCi0gICAgbV9kd1R5cGUgPSBYRkFfVlRfRkxPQVQ7DQotICAgIG1fd3NWYWx1ZS5Gb3JtYXQoTCIlLjhnIiwgKEZYX0RPVUJMRSlmTnVtKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0TnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c051bSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpDQotew0KLSAgICBtX2R3VHlwZSA9IFhGQV9WVF9GTE9BVDsNCi0gICAgcmV0dXJuIG1fYlZhbGlkID0gUGFyc2VQYXR0ZXJuVmFsdWUod3NOdW0sIHdzRm9ybWF0LCBwTG9jYWxlKTsNCi19DQotRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXREYXRlKGNvbnN0IENGWF9Vbml0aW1lJiBkKQ0KLXsNCi0gICAgbV9kd1R5cGUgPSBYRkFfVlRfREFURTsNCi0gICAgbV93c1ZhbHVlLkZvcm1hdChMIiUwNGQtJTAyZC0lMDJkIiwgZC5HZXRZZWFyKCksIGQuR2V0TW9udGgoKSwgZC5HZXREYXkoKSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlKQ0KLXsNCi0gICAgbV9kd1R5cGUgPSBYRkFfVlRfREFURTsNCi0gICAgcmV0dXJuIG1fYlZhbGlkID0gUGFyc2VQYXR0ZXJuVmFsdWUod3NEYXRlLCB3c0Zvcm1hdCwgcExvY2FsZSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0VGltZShjb25zdCBDRlhfVW5pdGltZSYgdCkNCi17DQotICAgIG1fZHdUeXBlID0gWEZBX1ZUX1RJTUU7DQotICAgIG1fd3NWYWx1ZS5Gb3JtYXQoTCIlMDJkOiUwMmQ6JTAyZCIsIHQuR2V0SG91cigpLCB0LkdldE1pbnV0ZSgpLCB0LkdldFNlY29uZCgpKTsNCi0gICAgaWYgKHQuR2V0TWlsbGlzZWNvbmQoKSA+IDApIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCi0gICAgICAgIHdzVGVtcC5Gb3JtYXQoTCIlOjAzZCIsIHQuR2V0TWlsbGlzZWNvbmQoKSk7DQotICAgICAgICBtX3dzVmFsdWUgKz0gd3NUZW1wOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldFRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LCBJRlhfTG9jYWxlKiBwTG9jYWxlKQ0KLXsNCi0gICAgbV9kd1R5cGUgPSBYRkFfVlRfVElNRTsNCi0gICAgcmV0dXJuIG1fYlZhbGlkID0gUGFyc2VQYXR0ZXJuVmFsdWUod3NUaW1lLCB3c0Zvcm1hdCwgcExvY2FsZSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0RGF0ZVRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIGR0KQ0KLXsNCi0gICAgbV9kd1R5cGUgPSBYRkFfVlRfREFURVRJTUU7DQotICAgIG1fd3NWYWx1ZS5Gb3JtYXQoTCIlMDRkLSUwMmQtJTAyZFQlMDJkOiUwMmQ6JTAyZCIsIGR0LkdldFllYXIoKSwgZHQuR2V0TW9udGgoKSwgZHQuR2V0RGF5KCksDQotICAgICAgICAgICAgICAgICAgICAgZHQuR2V0SG91cigpLCBkdC5HZXRNaW51dGUoKSwgZHQuR2V0U2Vjb25kKCkpOw0KLSAgICBpZiAoZHQuR2V0TWlsbGlzZWNvbmQoKSA+IDApIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCi0gICAgICAgIHdzVGVtcC5Gb3JtYXQoTCIlOjAzZCIsIGR0LkdldE1pbGxpc2Vjb25kKCkpOw0KLSAgICAgICAgbV93c1ZhbHVlICs9IHdzVGVtcDsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXREYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlVGltZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSkNCi17DQotICAgIG1fZHdUeXBlID0gWEZBX1ZUX0RBVEVUSU1FOw0KLSAgICByZXR1cm4gbV9iVmFsaWQgPSBQYXJzZVBhdHRlcm5WYWx1ZSh3c0RhdGVUaW1lLCB3c0Zvcm1hdCwgcExvY2FsZSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6Rm9ybWF0UGF0dGVybnMoQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzdWx0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQotICAgICAgICBYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUpIGNvbnN0DQotew0KLSAgICB3c1Jlc3VsdC5FbXB0eSgpOw0KLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCi0gICAgSUZYX0Zvcm1hdFN0cmluZyogcEZvcm1hdCA9IElGWF9Gb3JtYXRTdHJpbmc6OkNyZWF0ZShtX3BMb2NhbGVNZ3IsIEZBTFNFKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1BhdHRlcm5zOw0KLSAgICBwRm9ybWF0LT5TcGxpdEZvcm1hdFN0cmluZyh3c0Zvcm1hdCwgd3NQYXR0ZXJucyk7DQotICAgIGludDMyX3QgaUNvdW50ID0gd3NQYXR0ZXJucy5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQotICAgICAgICBiUmV0ID0gRm9ybWF0U2luZ2xlUGF0dGVybih3c1Jlc3VsdCwgd3NQYXR0ZXJuc1tpXSwgcExvY2FsZSwgZVZhbHVlVHlwZSk7DQotICAgICAgICBpZiAoYlJldCkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHBGb3JtYXQtPlJlbGVhc2UoKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6Rm9ybWF0U2luZ2xlUGF0dGVybihDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSwNCi0gICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgY29uc3QNCi17DQotICAgIElGWF9Mb2NhbGUqIGxvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQotICAgIGlmIChwTG9jYWxlKSB7DQotICAgICAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShwTG9jYWxlKTsNCi0gICAgfQ0KLSAgICB3c1Jlc3VsdC5FbXB0eSgpOw0KLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCi0gICAgSUZYX0Zvcm1hdFN0cmluZyogcEZvcm1hdCA9IElGWF9Gb3JtYXRTdHJpbmc6OkNyZWF0ZShtX3BMb2NhbGVNZ3IsIEZBTFNFKTsNCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBwTWF0Y2hGb3JtYXQpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzT3V0cHV0Ow0KKyAgSUZYX0xvY2FsZSogbG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsNCisgIGlmIChwTG9jYWxlKSB7DQorICAgIG1fcExvY2FsZU1nci0+U2V0RGVmTG9jYWxlKHBMb2NhbGUpOw0KKyAgfQ0KKyAgSUZYX0Zvcm1hdFN0cmluZyogcEZvcm1hdCA9IElGWF9Gb3JtYXRTdHJpbmc6OkNyZWF0ZShtX3BMb2NhbGVNZ3IsIEZBTFNFKTsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NQYXR0ZXJuczsNCisgIHBGb3JtYXQtPlNwbGl0Rm9ybWF0U3RyaW5nKHdzUGF0dGVybiwgd3NQYXR0ZXJucyk7DQorICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgIGludDMyX3QgaUNvdW50ID0gd3NQYXR0ZXJucy5HZXRTaXplKCk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yICg7IGkgPCBpQ291bnQgJiYgIWJSZXQ7IGkrKykgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdCA9IHdzUGF0dGVybnNbaV07DQogICAgIEZYX0xPQ0FMRUNBVEVHT1JZIGVDYXRlZ29yeSA9IHBGb3JtYXQtPkdldENhdGVnb3J5KHdzRm9ybWF0KTsNCiAgICAgZUNhdGVnb3J5ID0gWEZBX1ZhbHVnZUNhdGVnb3J5KGVDYXRlZ29yeSwgbV9kd1R5cGUpOw0KICAgICBzd2l0Y2ggKGVDYXRlZ29yeSkgew0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9OdWxsOg0KLSAgICAgICAgICAgIGlmIChtX3dzVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXROdWxsKHdzRm9ybWF0LCB3c1Jlc3VsdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvOg0KLSAgICAgICAgICAgIGlmIChtX3dzVmFsdWUgPT0gRlhfV1NUUkMoTCIwIikpIHsNCi0gICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdFplcm8od3NGb3JtYXQsIHdzUmVzdWx0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bToNCi0gICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0TnVtKG1fd3NWYWx1ZSwgd3NGb3JtYXQsIHdzUmVzdWx0KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGV4dDoNCi0gICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0VGV4dChtX3dzVmFsdWUsIHdzRm9ybWF0LCB3c1Jlc3VsdCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU6DQotICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKG1fd3NWYWx1ZSwgd3NGb3JtYXQsIHdzUmVzdWx0LCBGWF9EQVRFVElNRVRZUEVfRGF0ZSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU6DQotICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKG1fd3NWYWx1ZSwgd3NGb3JtYXQsIHdzUmVzdWx0LCBGWF9EQVRFVElNRVRZUEVfVGltZSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOg0KLSAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXREYXRlVGltZShtX3dzVmFsdWUsIHdzRm9ybWF0LCB3c1Jlc3VsdCwgRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgd3NSZXN1bHQgPSBtX3dzVmFsdWU7DQotICAgICAgICAgICAgYlJldCA9IFRSVUU7DQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9OdWxsOg0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlTnVsbCh3c1ZhbHVlLCB3c0Zvcm1hdCk7DQorICAgICAgICBpZiAoIWJSZXQpIHsNCisgICAgICAgICAgYlJldCA9IHdzVmFsdWUuSXNFbXB0eSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvOg0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlWmVybyh3c1ZhbHVlLCB3c0Zvcm1hdCk7DQorICAgICAgICBpZiAoIWJSZXQpIHsNCisgICAgICAgICAgYlJldCA9IHdzVmFsdWUgPT0gRlhfV1NUUkMoTCIwIik7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bTogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZk51bTsNCisgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZU51bSh3c1ZhbHVlLCB3c0Zvcm1hdCwgZk51bSk7DQorICAgICAgICBpZiAoIWJSZXQpIHsNCisgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdE51bSh3c1ZhbHVlLCB3c0Zvcm1hdCwgd3NPdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGV4dDoNCisgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZVRleHQod3NWYWx1ZSwgd3NGb3JtYXQsIHdzT3V0cHV0KTsNCisgICAgICAgIHdzT3V0cHV0LkVtcHR5KCk7DQorICAgICAgICBpZiAoIWJSZXQpIHsNCisgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdFRleHQod3NWYWx1ZSwgd3NGb3JtYXQsIHdzT3V0cHV0KTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZTogew0KKyAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7DQorICAgICAgICBiUmV0ID0gVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzVmFsdWUsIGR0KTsNCisgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX0RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0KTsNCisgICAgICAgICAgaWYgKCFiUmV0KSB7DQorICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LCB3c091dHB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFX0RhdGUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lOiB7DQorICAgICAgICBDRlhfVW5pdGltZSBkdDsNCisgICAgICAgIGJSZXQgPQ0KKyAgICAgICAgICAgIHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9UaW1lLCBkdCk7DQorICAgICAgICBpZiAoIWJSZXQpIHsNCisgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LCB3c091dHB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9UaW1lKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOiB7DQorICAgICAgICBDRlhfVW5pdGltZSBkdDsNCisgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZURhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lLCBkdCk7DQorICAgICAgICBpZiAoIWJSZXQpIHsNCisgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LCB3c091dHB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJSZXQgPSBGQUxTRTsNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHBGb3JtYXQtPlJlbGVhc2UoKTsNCi0gICAgaWYgKCFiUmV0ICYmIChlQ2F0ZWdvcnkgIT0gRlhfTE9DQUxFQ0FURUdPUllfTnVtIHx8IGVWYWx1ZVR5cGUgIT0gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSkgew0KLSAgICAgICAgd3NSZXN1bHQgPSBtX3dzVmFsdWU7DQotICAgIH0NCi0gICAgaWYgKHBMb2NhbGUpIHsNCi0gICAgICAgIG1fcExvY2FsZU1nci0+U2V0RGVmTG9jYWxlKGxvY2FsZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIGJSZXQ7DQorICB9DQorICBpZiAoYlJldCAmJiBwTWF0Y2hGb3JtYXQpIHsNCisgICAgKnBNYXRjaEZvcm1hdCA9IHdzUGF0dGVybnNbaSAtIDFdOw0KKyAgfQ0KKyAgcEZvcm1hdC0+UmVsZWFzZSgpOw0KKyAgaWYgKHBMb2NhbGUpIHsNCisgICAgbV9wTG9jYWxlTWdyLT5TZXREZWZMb2NhbGUobG9jYWxlKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KIH0NCi1zdGF0aWMgRlhfQk9PTCBYRkFfVmFsdWVTcGxpdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lLCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lKQ0KLXsNCi0gICAgd3NEYXRlID0gTCIiOw0KLSAgICB3c1RpbWUgPSBMIiI7DQotICAgIGlmICh3c0RhdGVUaW1lLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTG9jYWxlVmFsdWU6OkdldFZhbHVlKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fd3NWYWx1ZTsNCit9DQorRlhfRFdPUkQgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0VHlwZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX2R3VHlwZTsNCit9DQordm9pZCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VHlwZSkgew0KKyAgbV93c1ZhbHVlID0gd3NWYWx1ZTsNCisgIG1fZHdUeXBlID0gZHdUeXBlOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0xvY2FsZVZhbHVlOjpHZXRUZXh0KCkgY29uc3Qgew0KKyAgaWYgKG1fYlZhbGlkICYmIG1fZHdUeXBlID09IFhGQV9WVF9URVhUKSB7DQorICAgIHJldHVybiBtX3dzVmFsdWU7DQorICB9DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCit9DQorRlhfRkxPQVQgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0TnVtKCkgY29uc3Qgew0KKyAgaWYgKG1fYlZhbGlkICYmIChtX2R3VHlwZSA9PSBYRkFfVlRfQk9PTEVBTiB8fCBtX2R3VHlwZSA9PSBYRkFfVlRfSU5URUdFUiB8fA0KKyAgICAgICAgICAgICAgICAgICBtX2R3VHlwZSA9PSBYRkFfVlRfREVDSU1BTCB8fCBtX2R3VHlwZSA9PSBYRkFfVlRfRkxPQVQpKSB7DQorICAgIGludDY0X3QgbkludGVncmFsID0gMDsNCisgICAgRlhfRFdPUkQgZHdGcmFjdGlvbmFsID0gMDsNCisgICAgaW50MzJfdCBuRXhwb25lbnQgPSAwOw0KKyAgICBpbnQgY2MgPSAwOw0KKyAgICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFLCBiRXhwU2lnbiA9IEZBTFNFOw0KKyAgICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKiltX3dzVmFsdWU7DQorICAgIGludCBsZW4gPSBtX3dzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICAgIHdoaWxlIChYRkFfSXNTcGFjZShzdHJbY2NdKSAmJiBjYyA8IGxlbikgew0KKyAgICAgIGNjKys7DQogICAgIH0NCi0gICAgaW50IG5TcGxpdEluZGV4ID0gLTE7DQotICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCdUJyk7DQotICAgIGlmIChuU3BsaXRJbmRleCA8IDApIHsNCi0gICAgICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCcgJyk7DQorICAgIGlmIChjYyA+PSBsZW4pIHsNCisgICAgICByZXR1cm4gMDsNCiAgICAgfQ0KLSAgICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIGlmIChzdHJbMF0gPT0gJysnKSB7DQorICAgICAgY2MrKzsNCisgICAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7DQorICAgICAgYk5lZ2F0aXZlID0gVFJVRTsNCisgICAgICBjYysrOw0KICAgICB9DQotICAgIHdzRGF0ZSA9IHdzRGF0ZVRpbWUuTGVmdChuU3BsaXRJbmRleCk7DQotICAgIHdzVGltZSA9IHdzRGF0ZVRpbWUuUmlnaHQod3NEYXRlVGltZS5HZXRMZW5ndGgoKSAtIG5TcGxpdEluZGV4IC0gMSk7DQorICAgIGludCBuSW50ZWdyYWxMZW4gPSAwOw0KKyAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pIHx8IG5JbnRlZ3JhbExlbiA+IDE3KSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgbkludGVncmFsID0gbkludGVncmFsICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgIGNjKys7DQorICAgICAgbkludGVncmFsTGVuKys7DQorICAgIH0NCisgICAgbkludGVncmFsID0gYk5lZ2F0aXZlID8gLW5JbnRlZ3JhbCA6IG5JbnRlZ3JhbDsNCisgICAgaW50IHNjYWxlID0gMDsNCisgICAgZG91YmxlIGZyYWN0aW9uID0gMC4wOw0KKyAgICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsNCisgICAgICBjYysrOw0KKyAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgZnJhY3Rpb24gKz0gZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsNCisgICAgICAgIHNjYWxlKys7DQorICAgICAgICBjYysrOw0KKyAgICAgICAgaWYgKHNjYWxlID09IHNpemVvZiBmcmFjdGlvbl9zY2FsZXMgLyBzaXplb2YoZG91YmxlKSB8fA0KKyAgICAgICAgICAgICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZHdGcmFjdGlvbmFsID0gKEZYX0RXT1JEKShmcmFjdGlvbiAqIDQyOTQ5NjcyOTYuMCk7DQorICAgIH0NCisgICAgaWYgKGNjIDwgbGVuICYmIChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsNCisgICAgICBjYysrOw0KKyAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgIGNjKys7DQorICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJy0nKSB7DQorICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCisgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkV4cG9uZW50ID0gbkV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgY2MrKzsNCisgICAgICB9DQorICAgICAgbkV4cG9uZW50ID0gYkV4cFNpZ24gPyAtbkV4cG9uZW50IDogbkV4cG9uZW50Ow0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IChGWF9GTE9BVCkoZHdGcmFjdGlvbmFsIC8gNDI5NDk2NzI5Ni4wKTsNCisgICAgZlZhbHVlID0gbkludGVncmFsICsgKG5JbnRlZ3JhbCA+PSAwID8gZlZhbHVlIDogLWZWYWx1ZSk7DQorICAgIGlmIChuRXhwb25lbnQgIT0gMCkgew0KKyAgICAgIGZWYWx1ZSAqPSBGWFNZU19wb3coMTAsIChGWF9GTE9BVCluRXhwb25lbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBmVmFsdWU7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorRlhfRE9VQkxFIENYRkFfTG9jYWxlVmFsdWU6OkdldERvdWJsZU51bSgpIGNvbnN0IHsNCisgIGlmIChtX2JWYWxpZCAmJiAobV9kd1R5cGUgPT0gWEZBX1ZUX0JPT0xFQU4gfHwgbV9kd1R5cGUgPT0gWEZBX1ZUX0lOVEVHRVIgfHwNCisgICAgICAgICAgICAgICAgICAgbV9kd1R5cGUgPT0gWEZBX1ZUX0RFQ0lNQUwgfHwgbV9kd1R5cGUgPT0gWEZBX1ZUX0ZMT0FUKSkgew0KKyAgICBpbnQ2NF90IG5JbnRlZ3JhbCA9IDA7DQorICAgIEZYX0RXT1JEIGR3RnJhY3Rpb25hbCA9IDA7DQorICAgIGludDMyX3QgbkV4cG9uZW50ID0gMDsNCisgICAgaW50MzJfdCBjYyA9IDA7DQorICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0UsIGJFeHBTaWduID0gRkFMU0U7DQorICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKW1fd3NWYWx1ZTsNCisgICAgaW50IGxlbiA9IG1fd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCisgICAgd2hpbGUgKFhGQV9Jc1NwYWNlKHN0cltjY10pICYmIGNjIDwgbGVuKSB7DQorICAgICAgY2MrKzsNCisgICAgfQ0KKyAgICBpZiAoY2MgPj0gbGVuKSB7DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgaWYgKHN0clswXSA9PSAnKycpIHsNCisgICAgICBjYysrOw0KKyAgICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsNCisgICAgICBiTmVnYXRpdmUgPSBUUlVFOw0KKyAgICAgIGNjKys7DQorICAgIH0NCisgICAgaW50MzJfdCBuSW50ZWdyYWxMZW4gPSAwOw0KKyAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pIHx8IG5JbnRlZ3JhbExlbiA+IDE3KSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgbkludGVncmFsID0gbkludGVncmFsICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgIGNjKys7DQorICAgICAgbkludGVncmFsTGVuKys7DQorICAgIH0NCisgICAgbkludGVncmFsID0gYk5lZ2F0aXZlID8gLW5JbnRlZ3JhbCA6IG5JbnRlZ3JhbDsNCisgICAgaW50MzJfdCBzY2FsZSA9IDA7DQorICAgIEZYX0RPVUJMRSBmcmFjdGlvbiA9IDAuMDsNCisgICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7DQorICAgICAgY2MrKzsNCisgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgIGZyYWN0aW9uICs9IGZyYWN0aW9uX3NjYWxlc1tzY2FsZV0gKiAoc3RyW2NjXSAtICcwJyk7DQorICAgICAgICBzY2FsZSsrOw0KKyAgICAgICAgY2MrKzsNCisgICAgICAgIGlmIChzY2FsZSA9PSBzaXplb2YgZnJhY3Rpb25fc2NhbGVzIC8gc2l6ZW9mKEZYX0RPVUJMRSkgfHwNCisgICAgICAgICAgICAhWEZBX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGR3RnJhY3Rpb25hbCA9IChGWF9EV09SRCkoZnJhY3Rpb24gKiA0Mjk0OTY3Mjk2LjApOw0KKyAgICB9DQorICAgIGlmIChjYyA8IGxlbiAmJiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQorICAgICAgY2MrKzsNCisgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgew0KKyAgICAgICAgICBiRXhwU2lnbiA9IFRSVUU7DQorICAgICAgICAgIGNjKys7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG5FeHBvbmVudCA9IG5FeHBvbmVudCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgIGNjKys7DQorICAgICAgfQ0KKyAgICAgIG5FeHBvbmVudCA9IGJFeHBTaWduID8gLW5FeHBvbmVudCA6IG5FeHBvbmVudDsNCisgICAgfQ0KKyAgICBGWF9ET1VCTEUgZFZhbHVlID0gKGR3RnJhY3Rpb25hbCAvIDQyOTQ5NjcyOTYuMCk7DQorICAgIGRWYWx1ZSA9IG5JbnRlZ3JhbCArIChuSW50ZWdyYWwgPj0gMCA/IGRWYWx1ZSA6IC1kVmFsdWUpOw0KKyAgICBpZiAobkV4cG9uZW50ICE9IDApIHsNCisgICAgICBkVmFsdWUgKj0gRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpbkV4cG9uZW50KTsNCisgICAgfQ0KKyAgICByZXR1cm4gZFZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK0NGWF9Vbml0aW1lIENYRkFfTG9jYWxlVmFsdWU6OkdldERhdGUoKSBjb25zdCB7DQorICBpZiAobV9iVmFsaWQgJiYgbV9kd1R5cGUgPT0gWEZBX1ZUX0RBVEUpIHsNCisgICAgQ0ZYX1VuaXRpbWUgZHQ7DQorICAgIEZYX0RhdGVGcm9tQ2Fub25pY2FsKG1fd3NWYWx1ZSwgZHQpOw0KKyAgICByZXR1cm4gZHQ7DQorICB9DQorICByZXR1cm4gQ0ZYX1VuaXRpbWUoKTsNCit9DQorQ0ZYX1VuaXRpbWUgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0VGltZSgpIGNvbnN0IHsNCisgIGlmIChtX2JWYWxpZCAmJiBtX2R3VHlwZSA9PSBYRkFfVlRfVElNRSkgew0KKyAgICBDRlhfVW5pdGltZSBkdCgwKTsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcExvY2FsZU1ncik7DQorICAgIEZYX1RpbWVGcm9tQ2Fub25pY2FsKG1fd3NWYWx1ZSwgZHQsIG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCkpOw0KKyAgICByZXR1cm4gZHQ7DQorICB9DQorICByZXR1cm4gQ0ZYX1VuaXRpbWUoKTsNCit9DQorQ0ZYX1VuaXRpbWUgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0RGF0ZVRpbWUoKSBjb25zdCB7DQorICBpZiAobV9iVmFsaWQgJiYgbV9kd1R5cGUgPT0gWEZBX1ZUX0RBVEVUSU1FKSB7DQorICAgIGludDMyX3QgaW5kZXggPSBtX3dzVmFsdWUuRmluZCgnVCcpOw0KKyAgICBDRlhfVW5pdGltZSBkdDsNCisgICAgRlhfRGF0ZUZyb21DYW5vbmljYWwobV93c1ZhbHVlLkxlZnQoaW5kZXgpLCBkdCk7DQorICAgIEZYU1lTX2Fzc2VydChtX3BMb2NhbGVNZ3IpOw0KKyAgICBGWF9UaW1lRnJvbUNhbm9uaWNhbChtX3dzVmFsdWUuUmlnaHQobV93c1ZhbHVlLkdldExlbmd0aCgpIC0gaW5kZXggLSAxKSwgZHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCkpOw0KKyAgICByZXR1cm4gZHQ7DQorICB9DQorICByZXR1cm4gQ0ZYX1VuaXRpbWUoKTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIG1fZHdUeXBlID0gWEZBX1ZUX1RFWFQ7DQorICBtX3dzVmFsdWUgPSB3c1RleHQ7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgbV9kd1R5cGUgPSBYRkFfVlRfVEVYVDsNCisgIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzVGV4dCwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldE51bShGWF9GTE9BVCBmTnVtKSB7DQorICBtX2R3VHlwZSA9IFhGQV9WVF9GTE9BVDsNCisgIG1fd3NWYWx1ZS5Gb3JtYXQoTCIlLjhnIiwgKEZYX0RPVUJMRSlmTnVtKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldE51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpIHsNCisgIG1fZHdUeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgcmV0dXJuIG1fYlZhbGlkID0gUGFyc2VQYXR0ZXJuVmFsdWUod3NOdW0sIHdzRm9ybWF0LCBwTG9jYWxlKTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXREYXRlKGNvbnN0IENGWF9Vbml0aW1lJiBkKSB7DQorICBtX2R3VHlwZSA9IFhGQV9WVF9EQVRFOw0KKyAgbV93c1ZhbHVlLkZvcm1hdChMIiUwNGQtJTAyZC0lMDJkIiwgZC5HZXRZZWFyKCksIGQuR2V0TW9udGgoKSwgZC5HZXREYXkoKSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXREYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgbV9kd1R5cGUgPSBYRkFfVlRfREFURTsNCisgIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzRGF0ZSwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldFRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIHQpIHsNCisgIG1fZHdUeXBlID0gWEZBX1ZUX1RJTUU7DQorICBtX3dzVmFsdWUuRm9ybWF0KEwiJTAyZDolMDJkOiUwMmQiLCB0LkdldEhvdXIoKSwgdC5HZXRNaW51dGUoKSwNCisgICAgICAgICAgICAgICAgICAgdC5HZXRTZWNvbmQoKSk7DQorICBpZiAodC5HZXRNaWxsaXNlY29uZCgpID4gMCkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgIHdzVGVtcC5Gb3JtYXQoTCIlOjAzZCIsIHQuR2V0TWlsbGlzZWNvbmQoKSk7DQorICAgIG1fd3NWYWx1ZSArPSB3c1RlbXA7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgbV9kd1R5cGUgPSBYRkFfVlRfVElNRTsNCisgIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzVGltZSwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCkgew0KKyAgbV9kd1R5cGUgPSBYRkFfVlRfREFURVRJTUU7DQorICBtX3dzVmFsdWUuRm9ybWF0KEwiJTA0ZC0lMDJkLSUwMmRUJTAyZDolMDJkOiUwMmQiLCBkdC5HZXRZZWFyKCksDQorICAgICAgICAgICAgICAgICAgIGR0LkdldE1vbnRoKCksIGR0LkdldERheSgpLCBkdC5HZXRIb3VyKCksIGR0LkdldE1pbnV0ZSgpLA0KKyAgICAgICAgICAgICAgICAgICBkdC5HZXRTZWNvbmQoKSk7DQorICBpZiAoZHQuR2V0TWlsbGlzZWNvbmQoKSA+IDApIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICB3c1RlbXAuRm9ybWF0KEwiJTowM2QiLCBkdC5HZXRNaWxsaXNlY29uZCgpKTsNCisgICAgbV93c1ZhbHVlICs9IHdzVGVtcDsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgbV9kd1R5cGUgPSBYRkFfVlRfREFURVRJTUU7DQorICByZXR1cm4gbV9iVmFsaWQgPSBQYXJzZVBhdHRlcm5WYWx1ZSh3c0RhdGVUaW1lLCB3c0Zvcm1hdCwgcExvY2FsZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6Rm9ybWF0UGF0dGVybnMoQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgY29uc3Qgew0KKyAgd3NSZXN1bHQuRW1wdHkoKTsNCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgSUZYX0Zvcm1hdFN0cmluZyogcEZvcm1hdCA9IElGWF9Gb3JtYXRTdHJpbmc6OkNyZWF0ZShtX3BMb2NhbGVNZ3IsIEZBTFNFKTsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NQYXR0ZXJuczsNCisgIHBGb3JtYXQtPlNwbGl0Rm9ybWF0U3RyaW5nKHdzRm9ybWF0LCB3c1BhdHRlcm5zKTsNCisgIGludDMyX3QgaUNvdW50ID0gd3NQYXR0ZXJucy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBiUmV0ID0gRm9ybWF0U2luZ2xlUGF0dGVybih3c1Jlc3VsdCwgd3NQYXR0ZXJuc1tpXSwgcExvY2FsZSwgZVZhbHVlVHlwZSk7DQorICAgIGlmIChiUmV0KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHBGb3JtYXQtPlJlbGVhc2UoKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OkZvcm1hdFNpbmdsZVBhdHRlcm4oDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICBYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUpIGNvbnN0IHsNCisgIElGWF9Mb2NhbGUqIGxvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICBpZiAocExvY2FsZSkgew0KKyAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShwTG9jYWxlKTsNCisgIH0NCisgIHdzUmVzdWx0LkVtcHR5KCk7DQorICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgIElGWF9Gb3JtYXRTdHJpbmcqIHBGb3JtYXQgPSBJRlhfRm9ybWF0U3RyaW5nOjpDcmVhdGUobV9wTG9jYWxlTWdyLCBGQUxTRSk7DQorICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBwRm9ybWF0LT5HZXRDYXRlZ29yeSh3c0Zvcm1hdCk7DQorICBlQ2F0ZWdvcnkgPSBYRkFfVmFsdWdlQ2F0ZWdvcnkoZUNhdGVnb3J5LCBtX2R3VHlwZSk7DQorICBzd2l0Y2ggKGVDYXRlZ29yeSkgew0KKyAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bGw6DQorICAgICAgaWYgKG1fd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXROdWxsKHdzRm9ybWF0LCB3c1Jlc3VsdCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm86DQorICAgICAgaWYgKG1fd3NWYWx1ZSA9PSBGWF9XU1RSQyhMIjAiKSkgew0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdFplcm8od3NGb3JtYXQsIHdzUmVzdWx0KTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVtOg0KKyAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXROdW0obV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ6DQorICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdFRleHQobV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU6DQorICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKG1fd3NWYWx1ZSwgd3NGb3JtYXQsIHdzUmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEVfRGF0ZSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGltZToNCisgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUobV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9UaW1lKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZToNCisgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUobV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSk7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgd3NSZXN1bHQgPSBtX3dzVmFsdWU7DQorICAgICAgYlJldCA9IFRSVUU7DQorICB9DQorICBwRm9ybWF0LT5SZWxlYXNlKCk7DQorICBpZiAoIWJSZXQgJiYgKGVDYXRlZ29yeSAhPSBGWF9MT0NBTEVDQVRFR09SWV9OdW0gfHwNCisgICAgICAgICAgICAgICAgZVZhbHVlVHlwZSAhPSBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpKSB7DQorICAgIHdzUmVzdWx0ID0gbV93c1ZhbHVlOw0KKyAgfQ0KKyAgaWYgKHBMb2NhbGUpIHsNCisgICAgbV9wTG9jYWxlTWdyLT5TZXREZWZMb2NhbGUobG9jYWxlKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfVmFsdWVTcGxpdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RpbWUpIHsNCisgIHdzRGF0ZSA9IEwiIjsNCisgIHdzVGltZSA9IEwiIjsNCisgIGlmICh3c0RhdGVUaW1lLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQgblNwbGl0SW5kZXggPSAtMTsNCisgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCdUJyk7DQorICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQorICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCcgJyk7DQorICB9DQorICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHdzRGF0ZSA9IHdzRGF0ZVRpbWUuTGVmdChuU3BsaXRJbmRleCk7DQorICB3c1RpbWUgPSB3c0RhdGVUaW1lLlJpZ2h0KHdzRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBuU3BsaXRJbmRleCAtIDEpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6VmFsaWRhdGVDYW5vbmljYWxWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdWVHlwZSkgew0KKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQogICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlQ2Fub25pY2FsVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIEZYX0RXT1JEIGR3VlR5cGUpDQotew0KLSAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgIH0NCisgIENGWF9Vbml0aW1lIGR0Ow0KKyAgc3dpdGNoIChkd1ZUeXBlKSB7DQorICAgIGNhc2UgWEZBX1ZUX0RBVEU6IHsNCisgICAgICBpZiAoVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzVmFsdWUsIGR0KSkgew0KICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOw0KKyAgICAgIGlmIChYRkFfVmFsdWVTcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSAmJg0KKyAgICAgICAgICBWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NEYXRlLCBkdCkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgQ0ZYX1VuaXRpbWUgZHQ7DQotICAgIHN3aXRjaCAoZHdWVHlwZSkgew0KLSAgICAgICAgY2FzZSBYRkFfVlRfREFURTogew0KLSAgICAgICAgICAgICAgICBpZiAoVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzVmFsdWUsIGR0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7DQotICAgICAgICAgICAgICAgIGlmIChYRkFfVmFsdWVTcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSAmJiBWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NEYXRlLCBkdCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIFhGQV9WVF9USU1FOiB7DQotICAgICAgICAgICAgICAgIGlmIChWYWxpZGF0ZUNhbm9uaWNhbFRpbWUod3NWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOw0KLSAgICAgICAgICAgICAgICBpZiAoWEZBX1ZhbHVlU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkgJiYgVmFsaWRhdGVDYW5vbmljYWxUaW1lKHdzVGltZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIFhGQV9WVF9EQVRFVElNRTogew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCi0gICAgICAgICAgICAgICAgaWYgKFhGQV9WYWx1ZVNwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpICYmIFZhbGlkYXRlQ2Fub25pY2FsRGF0ZSh3c0RhdGUsIGR0KSAmJiBWYWxpZGF0ZUNhbm9uaWNhbFRpbWUod3NUaW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1ZUX1RJTUU6IHsNCisgICAgICBpZiAoVmFsaWRhdGVDYW5vbmljYWxUaW1lKHdzVmFsdWUpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7DQorICAgICAgaWYgKFhGQV9WYWx1ZVNwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpICYmDQorICAgICAgICAgIFZhbGlkYXRlQ2Fub25pY2FsVGltZSh3c1RpbWUpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIFhGQV9WVF9EQVRFVElNRTogew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOw0KKyAgICAgIGlmIChYRkFfVmFsdWVTcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSAmJg0KKyAgICAgICAgICBWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NEYXRlLCBkdCkgJiYgVmFsaWRhdGVDYW5vbmljYWxUaW1lKHdzVGltZSkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlQ2Fub25pY2FsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLCBDRlhfVW5pdGltZSYgdW5EYXRlKQ0KLXsNCi0gICAgY29uc3QgRlhfV09SRCBMYXN0RGF5WzEyXSA9IHszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsNCi0gICAgY29uc3QgRlhfV09SRCB3Q291bnRZID0gNCwgd0NvdW50TSA9IDIsIHdDb3VudEQgPSAyOw0KLSAgICBpbnQgbkxlbiA9IHdzRGF0ZS5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKG5MZW4gPCB3Q291bnRZIHx8IG5MZW4gPiB3Q291bnRZICsgd0NvdW50TSArIHdDb3VudEQgKyAyKSB7DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZUNhbm9uaWNhbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfVW5pdGltZSYgdW5EYXRlKSB7DQorICBjb25zdCBGWF9XT1JEIExhc3REYXlbMTJdID0gezMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9Ow0KKyAgY29uc3QgRlhfV09SRCB3Q291bnRZID0gNCwgd0NvdW50TSA9IDIsIHdDb3VudEQgPSAyOw0KKyAgaW50IG5MZW4gPSB3c0RhdGUuR2V0TGVuZ3RoKCk7DQorICBpZiAobkxlbiA8IHdDb3VudFkgfHwgbkxlbiA+IHdDb3VudFkgKyB3Q291bnRNICsgd0NvdW50RCArIDIpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiU3ltYm9sID0gKHdzRGF0ZS5GaW5kKDB4MkQpID09IC0xKSA/IEZBTFNFIDogVFJVRTsNCisgIEZYX1dPUkQgd1llYXIgPSAwLCB3TW9udGggPSAwLCB3RGF5ID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwRGF0ZSA9IChjb25zdCBGWF9XQ0hBUiopd3NEYXRlOw0KKyAgaW50IG5JbmRleCA9IDAsIG5TdGFydCA9IDA7DQorICB3aGlsZSAocERhdGVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCA8IHdDb3VudFkpIHsNCisgICAgaWYgKCFYRkFfSXNEaWdpdChwRGF0ZVtuSW5kZXhdKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3WWVhciA9IChwRGF0ZVtuSW5kZXhdIC0gJzAnKSArIHdZZWFyICogMTA7DQorICAgIG5JbmRleCsrOw0KKyAgfQ0KKyAgaWYgKGJTeW1ib2wpIHsNCisgICAgaWYgKHBEYXRlW25JbmRleF0gIT0gMHgyRCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBuSW5kZXgrKzsNCisgIH0NCisgIG5TdGFydCA9IG5JbmRleDsNCisgIHdoaWxlIChwRGF0ZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IC0gblN0YXJ0IDwgd0NvdW50TSAmJiBuSW5kZXggPCBuTGVuKSB7DQorICAgIGlmICghWEZBX0lzRGlnaXQocERhdGVbbkluZGV4XSkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgd01vbnRoID0gKHBEYXRlW25JbmRleF0gLSAnMCcpICsgd01vbnRoICogMTA7DQorICAgIG5JbmRleCsrOw0KKyAgfQ0KKyAgaWYgKGJTeW1ib2wpIHsNCisgICAgaWYgKHBEYXRlW25JbmRleF0gIT0gMHgyRCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBuSW5kZXgrKzsNCisgIH0NCisgIG5TdGFydCA9IG5JbmRleDsNCisgIHdoaWxlIChwRGF0ZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IC0gblN0YXJ0IDwgd0NvdW50RCAmJiBuSW5kZXggPCBuTGVuKSB7DQorICAgIGlmICghWEZBX0lzRGlnaXQocERhdGVbbkluZGV4XSkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgd0RheSA9IChwRGF0ZVtuSW5kZXhdIC0gJzAnKSArIHdEYXkgKiAxMDsNCisgICAgbkluZGV4Kys7DQorICB9DQorICBpZiAobkluZGV4ICE9IG5MZW4pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHdZZWFyIDwgMTkwMCB8fCB3WWVhciA+IDIwMjkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHdNb250aCA8IDEgfHwgd01vbnRoID4gMTIpIHsNCisgICAgaWYgKHdNb250aCA9PSAwICYmIG5MZW4gPT0gd0NvdW50WSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICh3RGF5IDwgMSkgew0KKyAgICBpZiAod0RheSA9PSAwICYmIChuTGVuID09IHdDb3VudFkgKyB3Q291bnRNKSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICh3TW9udGggPT0gMikgew0KKyAgICBpZiAod1llYXIgJSA0MDAgPT0gMCB8fCAod1llYXIgJSAxMDAgIT0gMCAmJiB3WWVhciAlIDQgPT0gMCkpIHsNCisgICAgICBpZiAod0RheSA+IDI5KSB7DQogICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiU3ltYm9sID0gKHdzRGF0ZS5GaW5kKDB4MkQpID09IC0xKSA/IEZBTFNFIDogVFJVRTsNCi0gICAgRlhfV09SRCB3WWVhciA9IDAsIHdNb250aCA9IDAsIHdEYXkgPSAwOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogcERhdGUgPSAoY29uc3QgRlhfV0NIQVIqKXdzRGF0ZTsNCi0gICAgaW50IG5JbmRleCA9IDAsIG5TdGFydCA9IDA7DQotICAgIHdoaWxlIChwRGF0ZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IDwgd0NvdW50WSkgew0KLSAgICAgICAgaWYgKCFYRkFfSXNEaWdpdChwRGF0ZVtuSW5kZXhdKSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHdZZWFyID0gKHBEYXRlW25JbmRleF0gLSAnMCcpICsgd1llYXIgKiAxMDsNCi0gICAgICAgIG5JbmRleCsrOw0KLSAgICB9DQotICAgIGlmIChiU3ltYm9sKSB7DQotICAgICAgICBpZiAocERhdGVbbkluZGV4XSAhPSAweDJEKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbkluZGV4Kys7DQotICAgIH0NCi0gICAgblN0YXJ0ID0gbkluZGV4Ow0KLSAgICB3aGlsZSAocERhdGVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCAtIG5TdGFydCA8IHdDb3VudE0gJiYgbkluZGV4IDwgbkxlbikgew0KLSAgICAgICAgaWYgKCFYRkFfSXNEaWdpdChwRGF0ZVtuSW5kZXhdKSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHdNb250aCA9IChwRGF0ZVtuSW5kZXhdIC0gJzAnKSArIHdNb250aCAqIDEwOw0KLSAgICAgICAgbkluZGV4Kys7DQotICAgIH0NCi0gICAgaWYgKGJTeW1ib2wpIHsNCi0gICAgICAgIGlmIChwRGF0ZVtuSW5kZXhdICE9IDB4MkQpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBuSW5kZXgrKzsNCi0gICAgfQ0KLSAgICBuU3RhcnQgPSBuSW5kZXg7DQotICAgIHdoaWxlIChwRGF0ZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IC0gblN0YXJ0IDwgd0NvdW50RCAmJiBuSW5kZXggPCBuTGVuKSB7DQotICAgICAgICBpZiAoIVhGQV9Jc0RpZ2l0KHBEYXRlW25JbmRleF0pKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd0RheSA9IChwRGF0ZVtuSW5kZXhdIC0gJzAnKSArIHdEYXkgKiAxMDsNCi0gICAgICAgIG5JbmRleCsrOw0KLSAgICB9DQotICAgIGlmIChuSW5kZXggIT0gbkxlbikgew0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAod0RheSA+IDI4KSB7DQogICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmICh3WWVhciA8IDE5MDAgfHwgd1llYXIgPiAyMDI5KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKHdNb250aCA8IDEgfHwgd01vbnRoID4gMTIpIHsNCi0gICAgICAgIGlmICh3TW9udGggPT0gMCAmJiBuTGVuID09IHdDb3VudFkpIHsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAod0RheSA8IDEpIHsNCi0gICAgICAgIGlmICh3RGF5ID09IDAgJiYgKG5MZW4gPT0gd0NvdW50WSArIHdDb3VudE0pKSB7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKHdNb250aCA9PSAyKSB7DQotICAgICAgICBpZiAod1llYXIgJSA0MDAgPT0gMCB8fCAod1llYXIgJSAxMDAgIT0gMCAmJiB3WWVhciAlIDQgPT0gMCkpIHsNCi0gICAgICAgICAgICBpZiAod0RheSA+IDI5KSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmICh3RGF5ID4gMjgpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmICh3RGF5ID4gTGFzdERheVt3TW9udGggLSAxXSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENGWF9Vbml0aW1lIHV0Ow0KLSAgICB1dC5TZXQod1llYXIsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHdNb250aCksIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHdEYXkpKTsNCi0gICAgdW5EYXRlID0gdW5EYXRlICsgdXQ7DQotICAgIHJldHVybiBUUlVFOw0KKyAgfSBlbHNlIGlmICh3RGF5ID4gTGFzdERheVt3TW9udGggLSAxXSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfVW5pdGltZSB1dDsNCisgIHV0LlNldCh3WWVhciwgc3RhdGljX2Nhc3Q8dWludDhfdD4od01vbnRoKSwgc3RhdGljX2Nhc3Q8dWludDhfdD4od0RheSkpOw0KKyAgdW5EYXRlID0gdW5EYXRlICsgdXQ7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZUNhbm9uaWNhbFRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZSkNCi17DQotICAgIGludCBuTGVuID0gd3NUaW1lLkdldExlbmd0aCgpOw0KLSAgICBpZiAobkxlbiA8IDIpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlQ2Fub25pY2FsVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lKSB7DQorICBpbnQgbkxlbiA9IHdzVGltZS5HZXRMZW5ndGgoKTsNCisgIGlmIChuTGVuIDwgMikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBjb25zdCBGWF9XT1JEIHdDb3VudEggPSAyLCB3Q291bnRNID0gMiwgd0NvdW50UyA9IDIsIHdDb3VudEYgPSAzOw0KKyAgRlhfQk9PTCBiU3ltYm9sID0gKHdzVGltZS5GaW5kKCc6JykgPT0gLTEpID8gRkFMU0UgOiBUUlVFOw0KKyAgRlhfV09SRCB3SG91ciA9IDAsIHdNaW51dGUgPSAwLCB3U2Vjb25kID0gMCwgd0ZyYWN0aW9uID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwVGltZSA9IChjb25zdCBGWF9XQ0hBUiopd3NUaW1lOw0KKyAgaW50IG5JbmRleCA9IDAsIG5TdGFydCA9IDA7DQorICB3aGlsZSAocFRpbWVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCAtIG5TdGFydCA8IHdDb3VudEgpIHsNCisgICAgaWYgKCFYRkFfSXNEaWdpdChwVGltZVtuSW5kZXhdKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBjb25zdCBGWF9XT1JEIHdDb3VudEggPSAyLCB3Q291bnRNID0gMiwgd0NvdW50UyA9IDIsIHdDb3VudEYgPSAzOw0KLSAgICBGWF9CT09MIGJTeW1ib2wgPSAod3NUaW1lLkZpbmQoJzonKSA9PSAtMSkgPyBGQUxTRSA6IFRSVUU7DQotICAgIEZYX1dPUkQgd0hvdXIgPSAwLCB3TWludXRlID0gMCwgd1NlY29uZCA9IDAsIHdGcmFjdGlvbiA9IDA7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwVGltZSA9IChjb25zdCBGWF9XQ0hBUiopd3NUaW1lOw0KLSAgICBpbnQgbkluZGV4ID0gMCwgblN0YXJ0ID0gMDsNCi0gICAgd2hpbGUgKHBUaW1lW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRIKSB7DQorICAgIHdIb3VyID0gKHBUaW1lW25JbmRleF0gLSAnMCcpICsgd0hvdXIgKiAxMDsNCisgICAgbkluZGV4Kys7DQorICB9DQorICBpZiAoYlN5bWJvbCkgew0KKyAgICBpZiAobkluZGV4IDwgbkxlbiAmJiBwVGltZVtuSW5kZXhdICE9ICc6Jykgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBuSW5kZXgrKzsNCisgIH0NCisgIG5TdGFydCA9IG5JbmRleDsNCisgIHdoaWxlIChwVGltZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IC0gblN0YXJ0IDwgd0NvdW50TSAmJiBuSW5kZXggPCBuTGVuKSB7DQorICAgIGlmICghWEZBX0lzRGlnaXQocFRpbWVbbkluZGV4XSkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgd01pbnV0ZSA9IChwVGltZVtuSW5kZXhdIC0gJzAnKSArIHdNaW51dGUgKiAxMDsNCisgICAgbkluZGV4Kys7DQorICB9DQorICBpZiAoYlN5bWJvbCkgew0KKyAgICBpZiAobkluZGV4IDwgbkxlbiAmJiBwVGltZVtuSW5kZXhdICE9ICc6Jykgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBuSW5kZXgrKzsNCisgIH0NCisgIG5TdGFydCA9IG5JbmRleDsNCisgIHdoaWxlIChwVGltZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IC0gblN0YXJ0IDwgd0NvdW50UyAmJiBuSW5kZXggPCBuTGVuKSB7DQorICAgIGlmICghWEZBX0lzRGlnaXQocFRpbWVbbkluZGV4XSkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgd1NlY29uZCA9IChwVGltZVtuSW5kZXhdIC0gJzAnKSArIHdTZWNvbmQgKiAxMDsNCisgICAgbkluZGV4Kys7DQorICB9DQorICBpZiAod3NUaW1lLkZpbmQoJy4nKSA+IDApIHsNCisgICAgaWYgKHBUaW1lW25JbmRleF0gIT0gJy4nKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG5JbmRleCsrOw0KKyAgICBuU3RhcnQgPSBuSW5kZXg7DQorICAgIHdoaWxlIChwVGltZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IC0gblN0YXJ0IDwgd0NvdW50RiAmJg0KKyAgICAgICAgICAgbkluZGV4IDwgbkxlbikgew0KKyAgICAgIGlmICghWEZBX0lzRGlnaXQocFRpbWVbbkluZGV4XSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgd0ZyYWN0aW9uID0gKHBUaW1lW25JbmRleF0gLSAnMCcpICsgd0ZyYWN0aW9uICogMTA7DQorICAgICAgbkluZGV4Kys7DQorICAgIH0NCisgIH0NCisgIGlmIChuSW5kZXggPCBuTGVuKSB7DQorICAgIGlmIChwVGltZVtuSW5kZXhdID09ICdaJykgew0KKyAgICAgIG5JbmRleCsrOw0KKyAgICB9IGVsc2UgaWYgKHBUaW1lW25JbmRleF0gPT0gJy0nIHx8IHBUaW1lW25JbmRleF0gPT0gJysnKSB7DQorICAgICAgaW50MTZfdCBuT2Zmc2V0SCA9IDAsIG5PZmZzZXRNID0gMDsNCisgICAgICBuSW5kZXgrKzsNCisgICAgICBuU3RhcnQgPSBuSW5kZXg7DQorICAgICAgd2hpbGUgKHBUaW1lW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRIICYmDQorICAgICAgICAgICAgIG5JbmRleCA8IG5MZW4pIHsNCiAgICAgICAgIGlmICghWEZBX0lzRGlnaXQocFRpbWVbbkluZGV4XSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgICAgIH0NCi0gICAgICAgIHdIb3VyID0gKHBUaW1lW25JbmRleF0gLSAnMCcpICsgd0hvdXIgKiAxMDsNCisgICAgICAgIG5PZmZzZXRIID0gKHBUaW1lW25JbmRleF0gLSAnMCcpICsgbk9mZnNldEggKiAxMDsNCiAgICAgICAgIG5JbmRleCsrOw0KLSAgICB9DQotICAgIGlmIChiU3ltYm9sKSB7DQorICAgICAgfQ0KKyAgICAgIGlmIChiU3ltYm9sKSB7DQogICAgICAgICBpZiAobkluZGV4IDwgbkxlbiAmJiBwVGltZVtuSW5kZXhdICE9ICc6Jykgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICAgICAgfQ0KICAgICAgICAgbkluZGV4Kys7DQotICAgIH0NCi0gICAgblN0YXJ0ID0gbkluZGV4Ow0KLSAgICB3aGlsZSAocFRpbWVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCAtIG5TdGFydCA8IHdDb3VudE0gJiYgbkluZGV4IDwgbkxlbikgew0KKyAgICAgIH0NCisgICAgICBuU3RhcnQgPSBuSW5kZXg7DQorICAgICAgd2hpbGUgKHBUaW1lW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRNICYmDQorICAgICAgICAgICAgIG5JbmRleCA8IG5MZW4pIHsNCiAgICAgICAgIGlmICghWEZBX0lzRGlnaXQocFRpbWVbbkluZGV4XSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgICAgIH0NCi0gICAgICAgIHdNaW51dGUgPSAocFRpbWVbbkluZGV4XSAtICcwJykgKyB3TWludXRlICogMTA7DQorICAgICAgICBuT2Zmc2V0TSA9IChwVGltZVtuSW5kZXhdIC0gJzAnKSArIG5PZmZzZXRNICogMTA7DQogICAgICAgICBuSW5kZXgrKzsNCi0gICAgfQ0KLSAgICBpZiAoYlN5bWJvbCkgew0KLSAgICAgICAgaWYgKG5JbmRleCA8IG5MZW4gJiYgcFRpbWVbbkluZGV4XSAhPSAnOicpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBuSW5kZXgrKzsNCi0gICAgfQ0KLSAgICBuU3RhcnQgPSBuSW5kZXg7DQotICAgIHdoaWxlIChwVGltZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IC0gblN0YXJ0IDwgd0NvdW50UyAmJiBuSW5kZXggPCBuTGVuKSB7DQotICAgICAgICBpZiAoIVhGQV9Jc0RpZ2l0KHBUaW1lW25JbmRleF0pKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd1NlY29uZCA9IChwVGltZVtuSW5kZXhdIC0gJzAnKSArIHdTZWNvbmQgKiAxMDsNCi0gICAgICAgIG5JbmRleCsrOw0KLSAgICB9DQotICAgIGlmICh3c1RpbWUuRmluZCgnLicpID4gMCkgew0KLSAgICAgICAgaWYgKHBUaW1lW25JbmRleF0gIT0gJy4nKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbkluZGV4Kys7DQotICAgICAgICBuU3RhcnQgPSBuSW5kZXg7DQotICAgICAgICB3aGlsZSAocFRpbWVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCAtIG5TdGFydCA8IHdDb3VudEYgJiYgbkluZGV4IDwgbkxlbikgew0KLSAgICAgICAgICAgIGlmICghWEZBX0lzRGlnaXQocFRpbWVbbkluZGV4XSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3RnJhY3Rpb24gPSAocFRpbWVbbkluZGV4XSAtICcwJykgKyB3RnJhY3Rpb24gKiAxMDsNCi0gICAgICAgICAgICBuSW5kZXgrKzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAobkluZGV4IDwgbkxlbikgew0KLSAgICAgICAgaWYgKHBUaW1lW25JbmRleF0gPT0gJ1onKSB7DQotICAgICAgICAgICAgbkluZGV4Kys7DQotICAgICAgICB9IGVsc2UgaWYgKHBUaW1lW25JbmRleF0gPT0gJy0nIHx8IHBUaW1lW25JbmRleF0gPT0gJysnKSB7DQotICAgICAgICAgICAgaW50MTZfdCBuT2Zmc2V0SCA9IDAsIG5PZmZzZXRNID0gMDsNCi0gICAgICAgICAgICBuSW5kZXgrKzsNCi0gICAgICAgICAgICBuU3RhcnQgPSBuSW5kZXg7DQotICAgICAgICAgICAgd2hpbGUgKHBUaW1lW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRIICYmIG5JbmRleCA8IG5MZW4pIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFYRkFfSXNEaWdpdChwVGltZVtuSW5kZXhdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG5PZmZzZXRIID0gKHBUaW1lW25JbmRleF0gLSAnMCcpICsgbk9mZnNldEggKiAxMDsNCi0gICAgICAgICAgICAgICAgbkluZGV4Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChiU3ltYm9sKSB7DQotICAgICAgICAgICAgICAgIGlmIChuSW5kZXggPCBuTGVuICYmIHBUaW1lW25JbmRleF0gIT0gJzonKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbkluZGV4Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG5TdGFydCA9IG5JbmRleDsNCi0gICAgICAgICAgICB3aGlsZSAocFRpbWVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCAtIG5TdGFydCA8IHdDb3VudE0gJiYgbkluZGV4IDwgbkxlbikgew0KLSAgICAgICAgICAgICAgICBpZiAoIVhGQV9Jc0RpZ2l0KHBUaW1lW25JbmRleF0pKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbk9mZnNldE0gPSAocFRpbWVbbkluZGV4XSAtICcwJykgKyBuT2Zmc2V0TSAqIDEwOw0KLSAgICAgICAgICAgICAgICBuSW5kZXgrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG5PZmZzZXRIID4gMTIpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAobk9mZnNldE0gPj0gNjApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAobkluZGV4ICE9IG5MZW4pIHsNCisgICAgICB9DQorICAgICAgaWYgKG5PZmZzZXRIID4gMTIpIHsNCiAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAod0hvdXIgPj0gMjQpIHsNCisgICAgICB9DQorICAgICAgaWYgKG5PZmZzZXRNID49IDYwKSB7DQogICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmICh3TWludXRlID49IDYwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKHdTZWNvbmQgPj0gNjApIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAod0ZyYWN0aW9uID4gOTk5KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAobkluZGV4ICE9IG5MZW4pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHdIb3VyID49IDI0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICh3TWludXRlID49IDYwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICh3U2Vjb25kID49IDYwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICh3RnJhY3Rpb24gPiA5OTkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6VmFsaWRhdGVDYW5vbmljYWxEYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlVGltZSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOw0KLSAgICBpZiAod3NEYXRlVGltZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpbnQgblNwbGl0SW5kZXggPSAtMTsNCi0gICAgblNwbGl0SW5kZXggPSB3c0RhdGVUaW1lLkZpbmQoJ1QnKTsNCi0gICAgaWYgKG5TcGxpdEluZGV4IDwgMCkgew0KLSAgICAgICAgblNwbGl0SW5kZXggPSB3c0RhdGVUaW1lLkZpbmQoJyAnKTsNCi0gICAgfQ0KLSAgICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgd3NEYXRlID0gd3NEYXRlVGltZS5MZWZ0KG5TcGxpdEluZGV4KTsNCi0gICAgd3NUaW1lID0gd3NEYXRlVGltZS5SaWdodCh3c0RhdGVUaW1lLkdldExlbmd0aCgpIC0gblNwbGl0SW5kZXggLSAxKTsNCi0gICAgQ0ZYX1VuaXRpbWUgZHQ7DQotICAgIHJldHVybiBWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NEYXRlLCBkdCkgJiYgVmFsaWRhdGVDYW5vbmljYWxUaW1lKHdzVGltZSk7DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZUNhbm9uaWNhbERhdGVUaW1lKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlVGltZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7DQorICBpZiAod3NEYXRlVGltZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50IG5TcGxpdEluZGV4ID0gLTE7DQorICBuU3BsaXRJbmRleCA9IHdzRGF0ZVRpbWUuRmluZCgnVCcpOw0KKyAgaWYgKG5TcGxpdEluZGV4IDwgMCkgew0KKyAgICBuU3BsaXRJbmRleCA9IHdzRGF0ZVRpbWUuRmluZCgnICcpOw0KKyAgfQ0KKyAgaWYgKG5TcGxpdEluZGV4IDwgMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3c0RhdGUgPSB3c0RhdGVUaW1lLkxlZnQoblNwbGl0SW5kZXgpOw0KKyAgd3NUaW1lID0gd3NEYXRlVGltZS5SaWdodCh3c0RhdGVUaW1lLkdldExlbmd0aCgpIC0gblNwbGl0SW5kZXggLSAxKTsNCisgIENGWF9Vbml0aW1lIGR0Ow0KKyAgcmV0dXJuIFZhbGlkYXRlQ2Fub25pY2FsRGF0ZSh3c0RhdGUsIGR0KSAmJiBWYWxpZGF0ZUNhbm9uaWNhbFRpbWUod3NUaW1lKTsNCiB9DQotRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpQYXJzZVBhdHRlcm5WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgSUZYX0xvY2FsZSogcExvY2FsZSkNCi17DQotICAgIElGWF9Mb2NhbGUqIGxvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQotICAgIGlmIChwTG9jYWxlKSB7DQotICAgICAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShwTG9jYWxlKTsNCi0gICAgfQ0KLSAgICBJRlhfRm9ybWF0U3RyaW5nKiBwRm9ybWF0ID0gSUZYX0Zvcm1hdFN0cmluZzo6Q3JlYXRlKG1fcExvY2FsZU1nciwgRkFMU0UpOw0KLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzUGF0dGVybnM7DQotICAgIHBGb3JtYXQtPlNwbGl0Rm9ybWF0U3RyaW5nKHdzUGF0dGVybiwgd3NQYXR0ZXJucyk7DQotICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IHdzUGF0dGVybnMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQgJiYgIWJSZXQ7IGkrKykgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQgPSB3c1BhdHRlcm5zW2ldOw0KLSAgICAgICAgRlhfTE9DQUxFQ0FURUdPUlkgZUNhdGVnb3J5ID0gcEZvcm1hdC0+R2V0Q2F0ZWdvcnkod3NGb3JtYXQpOw0KLSAgICAgICAgZUNhdGVnb3J5ID0gWEZBX1ZhbHVnZUNhdGVnb3J5KGVDYXRlZ29yeSwgbV9kd1R5cGUpOw0KLSAgICAgICAgc3dpdGNoIChlQ2F0ZWdvcnkpIHsNCi0gICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bGw6DQotICAgICAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZU51bGwod3NWYWx1ZSwgd3NGb3JtYXQpOw0KLSAgICAgICAgICAgICAgICBpZiAoYlJldCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV93c1ZhbHVlLkVtcHR5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvOg0KLSAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VaZXJvKHdzVmFsdWUsIHdzRm9ybWF0KTsNCi0gICAgICAgICAgICAgICAgaWYgKGJSZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fd3NWYWx1ZSA9IEZYX1dTVFJDKEwiMCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVtOiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBmTnVtOw0KLSAgICAgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlTnVtKHdzVmFsdWUsIHdzRm9ybWF0LCBmTnVtKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiUmV0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV93c1ZhbHVlID0gZk51bTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0Og0KLSAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VUZXh0KHdzVmFsdWUsIHdzRm9ybWF0LCBtX3dzVmFsdWUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lIGR0Ow0KLSAgICAgICAgICAgICAgICAgICAgYlJldCA9IFZhbGlkYXRlQ2Fub25pY2FsRGF0ZSh3c1ZhbHVlLCBkdCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIWJSZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX0RhdGUsIGR0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChiUmV0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgU2V0RGF0ZShkdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGltZTogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7DQotICAgICAgICAgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX1RpbWUsIGR0KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiUmV0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgU2V0VGltZShkdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lIGR0Ow0KLSAgICAgICAgICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSwgZHQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJSZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXREYXRlVGltZShkdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIG1fd3NWYWx1ZSA9IHdzVmFsdWU7DQotICAgICAgICAgICAgICAgIGJSZXQgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlBhcnNlUGF0dGVyblZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpIHsNCisgIElGWF9Mb2NhbGUqIGxvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICBpZiAocExvY2FsZSkgew0KKyAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShwTG9jYWxlKTsNCisgIH0NCisgIElGWF9Gb3JtYXRTdHJpbmcqIHBGb3JtYXQgPSBJRlhfRm9ybWF0U3RyaW5nOjpDcmVhdGUobV9wTG9jYWxlTWdyLCBGQUxTRSk7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzUGF0dGVybnM7DQorICBwRm9ybWF0LT5TcGxpdEZvcm1hdFN0cmluZyh3c1BhdHRlcm4sIHdzUGF0dGVybnMpOw0KKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICBpbnQzMl90IGlDb3VudCA9IHdzUGF0dGVybnMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50ICYmICFiUmV0OyBpKyspIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQgPSB3c1BhdHRlcm5zW2ldOw0KKyAgICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBwRm9ybWF0LT5HZXRDYXRlZ29yeSh3c0Zvcm1hdCk7DQorICAgIGVDYXRlZ29yeSA9IFhGQV9WYWx1Z2VDYXRlZ29yeShlQ2F0ZWdvcnksIG1fZHdUeXBlKTsNCisgICAgc3dpdGNoIChlQ2F0ZWdvcnkpIHsNCisgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bGw6DQorICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VOdWxsKHdzVmFsdWUsIHdzRm9ybWF0KTsNCisgICAgICAgIGlmIChiUmV0KSB7DQorICAgICAgICAgIG1fd3NWYWx1ZS5FbXB0eSgpOw0KICAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmICghYlJldCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvOg0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlWmVybyh3c1ZhbHVlLCB3c0Zvcm1hdCk7DQorICAgICAgICBpZiAoYlJldCkgew0KKyAgICAgICAgICBtX3dzVmFsdWUgPSBGWF9XU1RSQyhMIjAiKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVtOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyBmTnVtOw0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlTnVtKHdzVmFsdWUsIHdzRm9ybWF0LCBmTnVtKTsNCisgICAgICAgIGlmIChiUmV0KSB7DQorICAgICAgICAgIG1fd3NWYWx1ZSA9IGZOdW07DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0Og0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlVGV4dCh3c1ZhbHVlLCB3c0Zvcm1hdCwgbV93c1ZhbHVlKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZTogew0KKyAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7DQorICAgICAgICBiUmV0ID0gVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzVmFsdWUsIGR0KTsNCisgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX0RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0KTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiUmV0KSB7DQorICAgICAgICAgIFNldERhdGUoZHQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGltZTogew0KKyAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7DQorICAgICAgICBiUmV0ID0NCisgICAgICAgICAgICBwRm9ybWF0LT5QYXJzZURhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LCBGWF9EQVRFVElNRVRZUEVfVGltZSwgZHQpOw0KKyAgICAgICAgaWYgKGJSZXQpIHsNCisgICAgICAgICAgU2V0VGltZShkdCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTogew0KKyAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7DQorICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSwgZHQpOw0KKyAgICAgICAgaWYgKGJSZXQpIHsNCisgICAgICAgICAgU2V0RGF0ZVRpbWUoZHQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGRlZmF1bHQ6DQogICAgICAgICBtX3dzVmFsdWUgPSB3c1ZhbHVlOw0KKyAgICAgICAgYlJldCA9IFRSVUU7DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBwRm9ybWF0LT5SZWxlYXNlKCk7DQotICAgIGlmIChwTG9jYWxlKSB7DQotICAgICAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShsb2NhbGUpOw0KLSAgICB9DQotICAgIHJldHVybiBiUmV0Ow0KKyAgfQ0KKyAgaWYgKCFiUmV0KSB7DQorICAgIG1fd3NWYWx1ZSA9IHdzVmFsdWU7DQorICB9DQorICBwRm9ybWF0LT5SZWxlYXNlKCk7DQorICBpZiAocExvY2FsZSkgew0KKyAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShsb2NhbGUpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQogfQ0KLXZvaWQgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0TnVtYmVyaWNGb3JtYXQoQ0ZYX1dpZGVTdHJpbmcgJndzRm9ybWF0LCBpbnQzMl90IG5JbnRMZW4sIGludDMyX3QgbkRlY0xlbiwgRlhfQk9PTCBiU2lnbiApDQotew0KLSAgICBGWFNZU19hc3NlcnQod3NGb3JtYXQuSXNFbXB0eSgpKTsNCi0gICAgRlhTWVNfYXNzZXJ0KG5JbnRMZW4gPj0gLTEgJiYgbkRlY0xlbiA+PSAtMSk7DQotICAgIGludDMyX3QgblRvdGFsTGVuIFwNCi0gICAgICAgID0gKG5JbnRMZW4gPj0gMCA/IG5JbnRMZW4gOiAyKSBcDQotICAgICAgICAgICsgKGJTaWduID8gMSA6IDApIFwNCi0gICAgICAgICAgKyAobkRlY0xlbiA+PSAwID8gbkRlY0xlbiA6IDIpIFwNCi0gICAgICAgICAgKyAobkRlY0xlbiA9PSAwID8gMCA6IDEpOw0KLSAgICBGWF9XQ0hBUiogbHBCdWYgPSB3c0Zvcm1hdC5HZXRCdWZmZXIoblRvdGFsTGVuKTsNCi0gICAgaW50MzJfdCBuUG9zID0gMDsNCi0gICAgaWYgKGJTaWduKSB7DQotICAgICAgICBscEJ1ZltuUG9zKytdID0gTCdzJzsNCit2b2lkIENYRkFfTG9jYWxlVmFsdWU6OkdldE51bWJlcmljRm9ybWF0KENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkludExlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkRlY0xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNpZ24pIHsNCisgIEZYU1lTX2Fzc2VydCh3c0Zvcm1hdC5Jc0VtcHR5KCkpOw0KKyAgRlhTWVNfYXNzZXJ0KG5JbnRMZW4gPj0gLTEgJiYgbkRlY0xlbiA+PSAtMSk7DQorICBpbnQzMl90IG5Ub3RhbExlbiA9IChuSW50TGVuID49IDAgPyBuSW50TGVuIDogMikgKyAoYlNpZ24gPyAxIDogMCkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAobkRlY0xlbiA+PSAwID8gbkRlY0xlbiA6IDIpICsgKG5EZWNMZW4gPT0gMCA/IDAgOiAxKTsNCisgIEZYX1dDSEFSKiBscEJ1ZiA9IHdzRm9ybWF0LkdldEJ1ZmZlcihuVG90YWxMZW4pOw0KKyAgaW50MzJfdCBuUG9zID0gMDsNCisgIGlmIChiU2lnbikgew0KKyAgICBscEJ1ZltuUG9zKytdID0gTCdzJzsNCisgIH0NCisgIGlmIChuSW50TGVuID09IC0xKSB7DQorICAgIGxwQnVmW25Qb3MrK10gPSBMJ3onOw0KKyAgICBscEJ1ZltuUG9zKytdID0gTCcqJzsNCisgIH0gZWxzZSB7DQorICAgIHdoaWxlIChuSW50TGVuKSB7DQorICAgICAgbHBCdWZbblBvcysrXSA9IEwneic7DQorICAgICAgbkludExlbi0tOw0KICAgICB9DQotICAgIGlmIChuSW50TGVuID09IC0xKSB7DQotICAgICAgICBscEJ1ZltuUG9zKytdID0gTCd6JzsNCi0gICAgICAgIGxwQnVmW25Qb3MrK10gPSBMJyonOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgd2hpbGUgKG5JbnRMZW4pIHsNCi0gICAgICAgICAgICBscEJ1ZltuUG9zKytdID0gTCd6JzsNCi0gICAgICAgICAgICBuSW50TGVuIC0tOw0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgaWYgKG5EZWNMZW4gIT0gMCkgew0KKyAgICBscEJ1ZltuUG9zKytdID0gTCcuJzsNCisgIH0NCisgIGlmIChuRGVjTGVuID09IC0xKSB7DQorICAgIGxwQnVmW25Qb3MrK10gPSBMJ3onOw0KKyAgICBscEJ1ZltuUG9zKytdID0gTCcqJzsNCisgIH0gZWxzZSB7DQorICAgIHdoaWxlIChuRGVjTGVuKSB7DQorICAgICAgbHBCdWZbblBvcysrXSA9IEwneic7DQorICAgICAgbkRlY0xlbi0tOw0KICAgICB9DQotICAgIGlmIChuRGVjTGVuICE9IDApIHsNCi0gICAgICAgIGxwQnVmW25Qb3MrK10gPSBMJy4nOw0KLSAgICB9DQotICAgIGlmIChuRGVjTGVuID09IC0xKSB7DQotICAgICAgICBscEJ1ZltuUG9zKytdID0gTCd6JzsNCi0gICAgICAgIGxwQnVmW25Qb3MrK10gPSBMJyonOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgd2hpbGUgKG5EZWNMZW4pIHsNCi0gICAgICAgICAgICBscEJ1ZltuUG9zKytdID0gTCd6JzsNCi0gICAgICAgICAgICBuRGVjTGVuIC0tOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHdzRm9ybWF0LlJlbGVhc2VCdWZmZXIoblRvdGFsTGVuKTsNCisgIH0NCisgIHdzRm9ybWF0LlJlbGVhc2VCdWZmZXIoblRvdGFsTGVuKTsNCiB9DQotRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZU51bWVyaWNUZW1wKENGWF9XaWRlU3RyaW5nJiB3c051bWVyaWMsIENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwgSUZYX0xvY2FsZSogcExvY2FsZSAsIGludDMyX3QqIHBvcyApDQotew0KLSAgICBpZiAod3NGb3JtYXQuSXNFbXB0eSgpIHx8IHdzTnVtZXJpYy5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6VmFsaWRhdGVOdW1lcmljVGVtcChDRlhfV2lkZVN0cmluZyYgd3NOdW1lcmljLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBvcykgew0KKyAgaWYgKHdzRm9ybWF0LklzRW1wdHkoKSB8fCB3c051bWVyaWMuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIHBOdW0gPSB3c051bWVyaWMuY19zdHIoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwRm10ID0gd3NGb3JtYXQuY19zdHIoKTsNCisgIGludDMyX3QgbiA9IDAsIG5mID0gMDsNCisgIEZYX1dDSEFSIGMgPSBwTnVtW25dOw0KKyAgRlhfV0NIQVIgY2YgPSBwRm10W25mXTsNCisgIGlmIChjZiA9PSBMJ3MnKSB7DQorICAgIGlmIChjID09IEwnLScgfHwgYyA9PSBMJysnKSB7DQorICAgICAgKytuOw0KICAgICB9DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwTnVtID0gd3NOdW1lcmljLmNfc3RyKCk7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwRm10ID0gd3NGb3JtYXQuY19zdHIoKTsNCi0gICAgaW50MzJfdCBuID0gMCwgbmYgPSAwOw0KLSAgICBGWF9XQ0hBUiBjCT0gcE51bVtuXTsNCi0gICAgRlhfV0NIQVIgY2YJPSBwRm10W25mXTsNCi0gICAgaWYgKGNmID09IEwncycpIHsNCi0gICAgICAgIGlmIChjID09IEwnLScgfHwgYyA9PSBMJysnKSB7DQotICAgICAgICAgICAgKytuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgKytuZjsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJMaW1pdCA9IFRSVUU7DQotICAgIGludDMyX3QgbkNvdW50CQk9IHdzTnVtZXJpYy5HZXRMZW5ndGgoKTsNCi0gICAgaW50MzJfdCBuQ291bnRGbXQJPSB3c0Zvcm1hdC5HZXRMZW5ndGgoKTsNCi0gICAgd2hpbGUgKG4gPCBuQ291bnQgJiYgKGJMaW1pdCA/IG5mIDwgbkNvdW50Rm10IDogVFJVRSkgJiYgWEZBX0lzRGlnaXQoYyA9IHBOdW1bbl0pKSB7DQotICAgICAgICBpZiAoYkxpbWl0ID09IFRSVUUpIHsNCi0gICAgICAgICAgICBpZiAoKGNmID0gcEZtdFtuZl0pID09IEwnKicpIHsNCi0gICAgICAgICAgICAgICAgYkxpbWl0ID0gRkFMU0U7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChjZiA9PSBMJ3onKSB7DQotICAgICAgICAgICAgICAgIG5mICsrOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBuICsrOw0KLSAgICB9DQotICAgIGlmIChuID09IG5Db3VudCkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgaWYgKG5mID09IG5Db3VudEZtdCkgew0KKyAgICArK25mOw0KKyAgfQ0KKyAgRlhfQk9PTCBiTGltaXQgPSBUUlVFOw0KKyAgaW50MzJfdCBuQ291bnQgPSB3c051bWVyaWMuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IG5Db3VudEZtdCA9IHdzRm9ybWF0LkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKG4gPCBuQ291bnQgJiYgKGJMaW1pdCA/IG5mIDwgbkNvdW50Rm10IDogVFJVRSkgJiYNCisgICAgICAgICBYRkFfSXNEaWdpdChjID0gcE51bVtuXSkpIHsNCisgICAgaWYgKGJMaW1pdCA9PSBUUlVFKSB7DQorICAgICAgaWYgKChjZiA9IHBGbXRbbmZdKSA9PSBMJyonKSB7DQorICAgICAgICBiTGltaXQgPSBGQUxTRTsNCisgICAgICB9IGVsc2UgaWYgKGNmID09IEwneicpIHsNCisgICAgICAgIG5mKys7DQorICAgICAgfSBlbHNlIHsNCiAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQogICAgIH0NCi0gICAgd2hpbGUgKG5mIDwgbkNvdW50Rm10ICYmIChjZiA9IHBGbXRbbmZdKSAhPSBMJy4nKSB7DQotICAgICAgICBGWFNZU19hc3NlcnQoY2YgPT0gTCd6JyB8fCBjZiA9PSBMJyonKTsNCi0gICAgICAgICsrbmY7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NEZWNpbWFsU3ltYm9sOw0KLSAgICBpZiAocExvY2FsZSkgew0KLSAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzRGVjaW1hbFN5bWJvbCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICB3c0RlY2ltYWxTeW1ib2wgPSBDRlhfV2lkZVN0cmluZyhMJy4nKTsNCi0gICAgfQ0KLSAgICBpZiAocEZtdFtuZl0gIT0gTCcuJykgew0KKyAgICBuKys7DQorICB9DQorICBpZiAobiA9PSBuQ291bnQpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAobmYgPT0gbkNvdW50Rm10KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHdoaWxlIChuZiA8IG5Db3VudEZtdCAmJiAoY2YgPSBwRm10W25mXSkgIT0gTCcuJykgew0KKyAgICBGWFNZU19hc3NlcnQoY2YgPT0gTCd6JyB8fCBjZiA9PSBMJyonKTsNCisgICAgKytuZjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRGVjaW1hbFN5bWJvbDsNCisgIGlmIChwTG9jYWxlKSB7DQorICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c0RlY2ltYWxTeW1ib2wpOw0KKyAgfSBlbHNlIHsNCisgICAgd3NEZWNpbWFsU3ltYm9sID0gQ0ZYX1dpZGVTdHJpbmcoTCcuJyk7DQorICB9DQorICBpZiAocEZtdFtuZl0gIT0gTCcuJykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAod3NEZWNpbWFsU3ltYm9sICE9IENGWF9XaWRlU3RyaW5nQyhjKSAmJiBjICE9IEwnLicpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgKytuZjsNCisgICsrbjsNCisgIGJMaW1pdCA9IFRSVUU7DQorICB3aGlsZSAobiA8IG5Db3VudCAmJiAoYkxpbWl0ID8gbmYgPCBuQ291bnRGbXQgOiBUUlVFKSAmJg0KKyAgICAgICAgIFhGQV9Jc0RpZ2l0KGMgPSBwTnVtW25dKSkgew0KKyAgICBpZiAoYkxpbWl0ID09IFRSVUUpIHsNCisgICAgICBpZiAoKGNmID0gcEZtdFtuZl0pID09IEwnKicpIHsNCisgICAgICAgIGJMaW1pdCA9IEZBTFNFOw0KKyAgICAgIH0gZWxzZSBpZiAoY2YgPT0gTCd6Jykgew0KKyAgICAgICAgbmYrKzsNCisgICAgICB9IGVsc2Ugew0KICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAod3NEZWNpbWFsU3ltYm9sICE9IENGWF9XaWRlU3RyaW5nQyhjKSAmJiBjICE9IEwnLicpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICArKyBuZjsNCi0gICAgKysgbjsNCi0gICAgYkxpbWl0ID0gVFJVRTsNCi0gICAgd2hpbGUgKG4gPCBuQ291bnQgJiYgKGJMaW1pdCA/IG5mIDwgbkNvdW50Rm10IDogVFJVRSkgJiYgWEZBX0lzRGlnaXQoYyA9IHBOdW1bbl0pKSB7DQotICAgICAgICBpZiAoYkxpbWl0ID09IFRSVUUpIHsNCi0gICAgICAgICAgICBpZiAoKGNmID0gcEZtdFtuZl0pID09IEwnKicpIHsNCi0gICAgICAgICAgICAgICAgYkxpbWl0ID0gRkFMU0U7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChjZiA9PSBMJ3onKSB7DQotICAgICAgICAgICAgICAgIG5mICsrOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBuICsrOw0KLSAgICB9DQotICAgIHJldHVybiBuID09IG5Db3VudDsNCisgICAgbisrOw0KKyAgfQ0KKyAgcmV0dXJuIG4gPT0gbkNvdW50Ow0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfb2JqZWN0X2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfb2JqZWN0X2ltcC5jcHAKaW5kZXggYzZkYjIyMy4uZWZhM2Q5OCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX29iamVjdF9pbXAuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9vYmplY3RfaW1wLmNwcApAQCAtMTksNTEwNyArMTksNTQ2NiBAQAogI2luY2x1ZGUgInhmYV9iYXNpY19pbXAuaCINCiAjaW5jbHVkZSAieGZhX2RvY3VtZW50X2xheW91dF9pbXAuaCINCiBDWEZBX09iamVjdDo6Q1hGQV9PYmplY3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9EV09SRCB1RmxhZ3MpDQotICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KQ0KLSAgICAsIG1fdUZsYWdzKHVGbGFncykNCi17DQorICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KSwgbV91RmxhZ3ModUZsYWdzKSB7fQ0KK3ZvaWQgQ1hGQV9PYmplY3Q6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgY29uc3Qgew0KKyAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50ID0gWEZBX0dldEVsZW1lbnRCeUlEKEdldENsYXNzSUQoKSk7DQorICBBU1NFUlQocEVsZW1lbnQgIT0gTlVMTCk7DQorICB3c05hbWUgPSBwRWxlbWVudC0+cE5hbWU7DQogfQ0KLXZvaWQgQ1hGQV9PYmplY3Q6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZ0MgJndzTmFtZSkgY29uc3QNCi17DQotICAgIFhGQV9MUENFTEVNRU5USU5GTyBwRWxlbWVudCA9IFhGQV9HZXRFbGVtZW50QnlJRChHZXRDbGFzc0lEKCkpOw0KLSAgICBBU1NFUlQocEVsZW1lbnQgIT0gTlVMTCk7DQotICAgIHdzTmFtZSA9IHBFbGVtZW50LT5wTmFtZTsNCit1aW50MzJfdCBDWEZBX09iamVjdDo6R2V0Q2xhc3NIYXNoQ29kZSgpIGNvbnN0IHsNCisgIFhGQV9MUENFTEVNRU5USU5GTyBwRWxlbWVudCA9IFhGQV9HZXRFbGVtZW50QnlJRChHZXRDbGFzc0lEKCkpOw0KKyAgQVNTRVJUKHBFbGVtZW50ICE9IE5VTEwpOw0KKyAgcmV0dXJuIHBFbGVtZW50LT51SGFzaDsNCiB9DQotdWludDMyX3QgQ1hGQV9PYmplY3Q6OkdldENsYXNzSGFzaENvZGUoKSBjb25zdA0KLXsNCi0gICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50ID0gWEZBX0dldEVsZW1lbnRCeUlEKEdldENsYXNzSUQoKSk7DQotICAgIEFTU0VSVChwRWxlbWVudCAhPSBOVUxMKTsNCi0gICAgcmV0dXJuIHBFbGVtZW50LT51SGFzaDsNCitYRkFfRUxFTUVOVCBDWEZBX09iamVjdDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIGlmIChJc05vZGUoKSkgew0KKyAgICByZXR1cm4gKChjb25zdCBDWEZBX05vZGUqKXRoaXMpLT5HZXRDbGFzc0lEKCk7DQorICB9IGVsc2UgaWYgKElzT3JkaW5hcnlPYmplY3QoKSkgew0KKyAgICByZXR1cm4gKChjb25zdCBDWEZBX09yZGluYXJ5T2JqZWN0Kil0aGlzKS0+R2V0Q2xhc3NJRCgpOw0KKyAgfSBlbHNlIGlmIChJc05vZGVMaXN0KCkpIHsNCisgICAgcmV0dXJuICgoY29uc3QgQ1hGQV9Ob2RlTGlzdCopdGhpcyktPkdldENsYXNzSUQoKTsNCisgIH0gZWxzZSBpZiAoSXNPcmRpbmFyeUxpc3QoKSkgew0KKyAgICByZXR1cm4gWEZBX0VMRU1FTlRfTGlzdDsNCisgIH0NCisgIEFTU0VSVChGQUxTRSk7DQorICByZXR1cm4gKFhGQV9FTEVNRU5UKTA7DQogfQ0KLVhGQV9FTEVNRU5UIENYRkFfT2JqZWN0OjpHZXRDbGFzc0lEKCkgY29uc3QNCi17DQotICAgIGlmIChJc05vZGUoKSkgew0KLSAgICAgICAgcmV0dXJuICgoY29uc3QgQ1hGQV9Ob2RlKil0aGlzKS0+R2V0Q2xhc3NJRCgpOw0KLSAgICB9IGVsc2UgaWYoSXNPcmRpbmFyeU9iamVjdCgpKSB7DQotICAgICAgICByZXR1cm4gKChjb25zdCBDWEZBX09yZGluYXJ5T2JqZWN0Kil0aGlzKS0+R2V0Q2xhc3NJRCgpOw0KLSAgICB9IGVsc2UgaWYoSXNOb2RlTGlzdCgpKSB7DQotICAgICAgICByZXR1cm4gKChjb25zdCBDWEZBX05vZGVMaXN0Kil0aGlzKS0+R2V0Q2xhc3NJRCgpOw0KLSAgICB9IGVsc2UgaWYoSXNPcmRpbmFyeUxpc3QoKSkJew0KLSAgICAgICAgcmV0dXJuIFhGQV9FTEVNRU5UX0xpc3Q7DQotICAgIH0NCi0gICAgQVNTRVJUKEZBTFNFKTsNCi0gICAgcmV0dXJuIChYRkFfRUxFTUVOVCkwOw0KK3ZvaWQgQ1hGQV9PYmplY3Q6OlNjcmlwdF9PYmplY3RDbGFzc19DbGFzc05hbWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghYlNldHRpbmcpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIGNsYXNzTmFtZTsNCisgICAgR2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoDQorICAgICAgICBoVmFsdWUsIEZYX1VURjhFbmNvZGUoY2xhc3NOYW1lLkdldFB0cigpLCBjbGFzc05hbWUuR2V0TGVuZ3RoKCkpKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9PYmplY3Q6OlNjcmlwdF9PYmplY3RDbGFzc19DbGFzc05hbWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKCFiU2V0dGluZykgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIGNsYXNzTmFtZTsNCi0gICAgICAgIEdldENsYXNzTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUoY2xhc3NOYW1lLkdldFB0cigpLCBjbGFzc05hbWUuR2V0TGVuZ3RoKCkpKTsNCit2b2lkIENYRkFfT2JqZWN0OjpUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShpbnQzMl90IGlTdHJpbmdJRCwgLi4uKSB7DQorICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCktPkdldEFwcFByb3ZpZGVyKCk7DQorICBGWFNZU19hc3NlcnQocEFwcFByb3ZpZGVyKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KKyAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKGlTdHJpbmdJRCwgd3NGb3JtYXQpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlOw0KKyAgdmFfbGlzdCBhcmdfcHRyOw0KKyAgdmFfc3RhcnQoYXJnX3B0ciwgaVN0cmluZ0lEKTsNCisgIHdzTWVzc2FnZS5Gb3JtYXRWKChjb25zdCBGWF9XQ0hBUiopd3NGb3JtYXQsIGFyZ19wdHIpOw0KKyAgdmFfZW5kKGFyZ19wdHIpOw0KKyAgRlhKU0VfVGhyb3dNZXNzYWdlKEZYX0JTVFJDKCIiKSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9VVEY4RW5jb2RlKHdzTWVzc2FnZSwgd3NNZXNzYWdlLkdldExlbmd0aCgpKSk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9EZWxldGVXaWRlU3RyaW5nKHZvaWQqIHBEYXRhKSB7DQorICBpZiAocERhdGEpIHsNCisgICAgZGVsZXRlIChDRlhfV2lkZVN0cmluZyopcERhdGE7DQorICB9DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9Db3B5V2lkZVN0cmluZyh2b2lkKiYgcERhdGEpIHsNCisgIGlmIChwRGF0YSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyogcE5ld0RhdGEgPSBGWF9ORVcgQ0ZYX1dpZGVTdHJpbmcoKihDRlhfV2lkZVN0cmluZyopcERhdGEpOw0KKyAgICBwRGF0YSA9IHBOZXdEYXRhOw0KKyAgfQ0KK30NCitzdGF0aWMgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyBkZWxldGVXaWRlU3RyaW5nQ2FsbEJhY2sgPSB7DQorICAgIFhGQV9EZWxldGVXaWRlU3RyaW5nLCBYRkFfQ29weVdpZGVTdHJpbmd9Ow0KK3N0YXRpYyBYRkFfT0JKRUNUVFlQRSBYRkFfR2V0RWxlbWVudE9iamVjdFR5cGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQpIHsNCisgIFhGQV9MUENFTEVNRU5USU5GTyBwRWxlbWVudCA9IFhGQV9HZXRFbGVtZW50QnlJRChlRWxlbWVudCk7DQorICBBU1NFUlQocEVsZW1lbnQgIT0gTlVMTCk7DQorICByZXR1cm4gKFhGQV9PQkpFQ1RUWVBFKXBFbGVtZW50LT5lT2JqZWN0VHlwZTsNCit9DQorQ1hGQV9Ob2RlOjpDWEZBX05vZGUoQ1hGQV9Eb2N1bWVudCogcERvYywgRlhfV09SRCBlUGFja2V0LCBYRkFfRUxFTUVOVCBlRWxlbWVudCkNCisgICAgOiBDWEZBX09iamVjdChwRG9jLCBYRkFfR2V0RWxlbWVudE9iamVjdFR5cGUoZUVsZW1lbnQpKSwNCisgICAgICBtX3BQYXJlbnQoTlVMTCksDQorICAgICAgbV9wTmV4dChOVUxMKSwNCisgICAgICBtX3BDaGlsZChOVUxMKSwNCisgICAgICBtX3BMYXN0Q2hpbGQoTlVMTCksDQorICAgICAgbV9wWE1MTm9kZShOVUxMKSwNCisgICAgICBtX2VQYWNrZXQoZVBhY2tldCksDQorICAgICAgbV9lTm9kZUNsYXNzKGVFbGVtZW50KSwNCisgICAgICBtX2R3TmFtZUhhc2goMCksDQorICAgICAgbV9wQXV4Tm9kZShOVUxMKSwNCisgICAgICBtX3BNYXBNb2R1bGVEYXRhKE5VTEwpIHsNCisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsNCit9DQorQ1hGQV9Ob2RlOjp+Q1hGQV9Ob2RlKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFBhcmVudCA9PSBOVUxMKTsNCisgIFJlbW92ZU1hcE1vZHVsZUtleSgpOw0KKyAgQ1hGQV9Ob2RlICpwTmV4dCwgKnBOb2RlID0gbV9wQ2hpbGQ7DQorICB3aGlsZSAocE5vZGUpIHsNCisgICAgcE5leHQgPSBwTm9kZS0+bV9wTmV4dDsNCisgICAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQorICAgIGRlbGV0ZSBwTm9kZTsNCisgICAgcE5vZGUgPSBwTmV4dDsNCisgIH0NCisgIGlmIChtX3BYTUxOb2RlICYmIEhhc0ZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUpKSB7DQorICAgIG1fcFhNTE5vZGUtPlJlbGVhc2UoKTsNCisgIH0NCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSkgew0KKyAgSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KKyAgQ1hGQV9Ob2RlKiBwQ2xvbmUgPSBwRmFjdG9yeS0+Q3JlYXRlTm9kZShtX2VQYWNrZXQsIG1fZU5vZGVDbGFzcyk7DQorICBpZiAoIXBDbG9uZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIE1lcmdlQWxsRGF0YShwQ2xvbmUpOw0KKyAgcENsb25lLT5VcGRhdGVOYW1lSGFzaCgpOw0KKyAgaWYgKElzTmVlZFNhdmluZ1hNTE5vZGUoKSkgew0KKyAgICBJRkRFX1hNTE5vZGUqIHBDbG9uZVhNTCA9IE5VTEw7DQorICAgIGlmIChJc0F0dHJpYnV0ZUluWE1MKCkpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICAgICAgdGhpcy0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lLCBGQUxTRSk7DQorICAgICAgSUZERV9YTUxFbGVtZW50KiBwQ2xvbmVYTUxFbGVtZW50ID0gSUZERV9YTUxFbGVtZW50OjpDcmVhdGUod3NOYW1lKTsNCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZSA9IHRoaXMtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUpOw0KKyAgICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHBDbG9uZVhNTEVsZW1lbnQtPlNldFRleHREYXRhKHdzVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBwQ2xvbmVYTUwgPSBwQ2xvbmVYTUxFbGVtZW50Ow0KKyAgICAgIHBDbG9uZVhNTEVsZW1lbnQgPSBOVUxMOw0KKyAgICAgIHBDbG9uZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgICAgcENsb25lWE1MID0gbV9wWE1MTm9kZS0+Q2xvbmUoRkFMU0UpOw0KICAgICB9DQorICAgIHBDbG9uZS0+U2V0WE1MTWFwcGluZ05vZGUocENsb25lWE1MKTsNCisgICAgcENsb25lLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBUUlVFLCBGQUxTRSk7DQorICB9DQorICBpZiAoYlJlY3Vyc2l2ZSkgew0KKyAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ2hpbGQ7DQorICAgICAgICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgcENsb25lLT5JbnNlcnRDaGlsZChwQ2hpbGQtPkNsb25lKGJSZWN1cnNpdmUpKTsNCisgICAgfQ0KKyAgfQ0KKyAgcENsb25lLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICBwQ2xvbmUtPlNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBOVUxMKTsNCisgIHJldHVybiBwQ2xvbmU7DQogfQ0KLXZvaWQgQ1hGQV9PYmplY3Q6OlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKGludDMyX3QgaVN0cmluZ0lELCAuLi4pDQotew0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXROb2RlSXRlbShYRkFfTk9ERUlURU0gZUl0ZW0pIGNvbnN0IHsNCisgIHN3aXRjaCAoZUl0ZW0pIHsNCisgICAgY2FzZSBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmc6DQorICAgICAgcmV0dXJuIG1fcE5leHQ7DQorICAgIGNhc2UgWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQ6DQorICAgICAgcmV0dXJuIG1fcENoaWxkOw0KKyAgICBjYXNlIFhGQV9OT0RFSVRFTV9QYXJlbnQ6DQorICAgICAgcmV0dXJuIG1fcFBhcmVudDsNCisgICAgY2FzZSBYRkFfTk9ERUlURU1fUHJldlNpYmxpbmc6DQorICAgICAgaWYgKG1fcFBhcmVudCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwU2libGluZyA9IG1fcFBhcmVudC0+bV9wQ2hpbGQ7DQorICAgICAgICBDWEZBX05vZGUqIHBQcmV2ID0gTlVMTDsNCisgICAgICAgIHdoaWxlIChwU2libGluZyAmJiBwU2libGluZyAhPSB0aGlzKSB7DQorICAgICAgICAgIHBQcmV2ID0gcFNpYmxpbmc7DQorICAgICAgICAgIHBTaWJsaW5nID0gcFNpYmxpbmctPm1fcE5leHQ7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcFByZXY7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXROb2RlSXRlbShYRkFfTk9ERUlURU0gZUl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PQkpFQ1RUWVBFIGVUeXBlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIHN3aXRjaCAoZUl0ZW0pIHsNCisgICAgY2FzZSBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmc6DQorICAgICAgcE5vZGUgPSBtX3BOZXh0Ow0KKyAgICAgIGlmIChlVHlwZSAhPSBYRkFfT0JKRUNUVFlQRU1BU0spDQorICAgICAgICB3aGlsZSAocE5vZGUgJiYgcE5vZGUtPkdldE9iamVjdFR5cGUoKSAhPSBlVHlwZSkgew0KKyAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5tX3BOZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkOg0KKyAgICAgIHBOb2RlID0gbV9wQ2hpbGQ7DQorICAgICAgaWYgKGVUeXBlICE9IFhGQV9PQkpFQ1RUWVBFTUFTSykNCisgICAgICAgIHdoaWxlIChwTm9kZSAmJiBwTm9kZS0+R2V0T2JqZWN0VHlwZSgpICE9IGVUeXBlKSB7DQorICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHQ7DQorICAgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX05PREVJVEVNX1BhcmVudDoNCisgICAgICBwTm9kZSA9IG1fcFBhcmVudDsNCisgICAgICBpZiAoZVR5cGUgIT0gWEZBX09CSkVDVFRZUEVNQVNLKQ0KKyAgICAgICAgd2hpbGUgKHBOb2RlICYmIHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgIT0gZVR5cGUpIHsNCisgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wUGFyZW50Ow0KKyAgICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9OT0RFSVRFTV9QcmV2U2libGluZzoNCisgICAgICBpZiAobV9wUGFyZW50KSB7DQorICAgICAgICBDWEZBX05vZGUqIHBTaWJsaW5nID0gbV9wUGFyZW50LT5tX3BDaGlsZDsNCisgICAgICAgIHdoaWxlIChwU2libGluZyAmJiBwU2libGluZyAhPSB0aGlzKSB7DQorICAgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfT0JKRUNUVFlQRU1BU0sgfHwNCisgICAgICAgICAgICAgIGVUeXBlID09IHBTaWJsaW5nLT5HZXRPYmplY3RUeXBlKCkpIHsNCisgICAgICAgICAgICBwTm9kZSA9IHBTaWJsaW5nOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBTaWJsaW5nID0gcFNpYmxpbmctPm1fcE5leHQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIHBOb2RlOw0KK30NCitpbnQzMl90IENYRkFfTm9kZTo6R2V0Tm9kZUxpc3QoQ1hGQV9Ob2RlQXJyYXkmIG5vZGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1R5cGVGaWx0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50RmlsdGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZXZlbCkgew0KKyAgaWYgKC0taUxldmVsIDwgMCkgew0KKyAgICByZXR1cm4gbm9kZXMuR2V0U2l6ZSgpOw0KKyAgfQ0KKyAgaWYgKGVFbGVtZW50RmlsdGVyICE9IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsNCisgICAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICAgIGlmIChwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBlRWxlbWVudEZpbHRlcikgew0KKyAgICAgICAgbm9kZXMuQWRkKHBDaGlsZCk7DQorICAgICAgICBpZiAoaUxldmVsID4gMCkgew0KKyAgICAgICAgICBHZXROb2RlTGlzdChub2RlcywgZHdUeXBlRmlsdGVyLCBlRWxlbWVudEZpbHRlciwgaUxldmVsKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICB9DQorICB9IGVsc2UgaWYgKGR3VHlwZUZpbHRlciA9PQ0KKyAgICAgICAgICAgICAoWEZBX05PREVGSUxURVJfQ2hpbGRyZW4gfCBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzKSkgew0KKyAgICBDWEZBX05vZGUqIHBDaGlsZCA9IG1fcENoaWxkOw0KKyAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgbm9kZXMuQWRkKHBDaGlsZCk7DQorICAgICAgaWYgKGlMZXZlbCA+IDApIHsNCisgICAgICAgIEdldE5vZGVMaXN0KG5vZGVzLCBkd1R5cGVGaWx0ZXIsIGVFbGVtZW50RmlsdGVyLCBpTGV2ZWwpOw0KKyAgICAgIH0NCisgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoZHdUeXBlRmlsdGVyICE9IDApIHsNCisgICAgRlhfQk9PTCBiRmlsdGVyQ2hpbGRyZW4gPSAoZHdUeXBlRmlsdGVyICYgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4pICE9IDA7DQorICAgIEZYX0JPT0wgYkZpbHRlclByb3BlcnRpZXMgPSAoZHdUeXBlRmlsdGVyICYgWEZBX05PREVGSUxURVJfUHJvcGVydGllcykgIT0gMDsNCisgICAgRlhfQk9PTCBiRmlsdGVyT25lT2ZQcm9wZXJ0aWVzID0NCisgICAgICAgIChkd1R5cGVGaWx0ZXIgJiBYRkFfTk9ERUZJTFRFUl9PbmVPZlByb3BlcnR5KSAhPSAwOw0KKyAgICBDWEZBX05vZGUqIHBDaGlsZCA9IG1fcENoaWxkOw0KKyAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KA0KKyAgICAgICAgICBHZXRDbGFzc0lEKCksIHBDaGlsZC0+R2V0Q2xhc3NJRCgpLCBYRkFfWERQUEFDS0VUX1VOS05PV04pOw0KKyAgICAgIGlmIChwUHJvcGVydCkgew0KKyAgICAgICAgaWYgKGJGaWx0ZXJQcm9wZXJ0aWVzKSB7DQorICAgICAgICAgIG5vZGVzLkFkZChwQ2hpbGQpOw0KKyAgICAgICAgfSBlbHNlIGlmIChiRmlsdGVyT25lT2ZQcm9wZXJ0aWVzICYmDQorICAgICAgICAgICAgICAgICAgIChwUHJvcGVydC0+dUZsYWdzICYgWEZBX1BST1BFUlRZRkxBR19PbmVPZikpIHsNCisgICAgICAgICAgbm9kZXMuQWRkKHBDaGlsZCk7DQorICAgICAgICB9IGVsc2UgaWYgKGJGaWx0ZXJDaGlsZHJlbiAmJg0KKyAgICAgICAgICAgICAgICAgICAocENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzIHx8DQorICAgICAgICAgICAgICAgICAgICBwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSkgew0KKyAgICAgICAgICBub2Rlcy5BZGQocENoaWxkKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGJGaWx0ZXJDaGlsZHJlbikgew0KKyAgICAgICAgICBub2Rlcy5BZGQocENoaWxkKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICB9DQorICAgIGlmIChiRmlsdGVyT25lT2ZQcm9wZXJ0aWVzICYmIG5vZGVzLkdldFNpemUoKSA8IDEpIHsNCisgICAgICBpbnQzMl90IGlQcm9wZXJ0aWVzID0gMDsNCisgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnR5ID0NCisgICAgICAgICAgWEZBX0dldEVsZW1lbnRQcm9wZXJ0aWVzKEdldENsYXNzSUQoKSwgaVByb3BlcnRpZXMpOw0KKyAgICAgIGlmIChwUHJvcGVydHkgPT0gTlVMTCB8fCBpUHJvcGVydGllcyA8IDEpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpUHJvcGVydGllczsgaSsrKSB7DQorICAgICAgICBpZiAocFByb3BlcnR5W2ldLnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfRGVmYXVsdE9uZU9mKSB7DQorICAgICAgICAgIElYRkFfT2JqRmFjdG9yeSogcEZhY3RvcnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldEZhY3RvcnkoKTsNCisgICAgICAgICAgWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldCA9IFhGQV9HZXRQYWNrZXRCeUlEKEdldFBhY2tldElEKCkpOw0KKyAgICAgICAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0NCisgICAgICAgICAgICAgIHBGYWN0b3J5LT5DcmVhdGVOb2RlKHBQYWNrZXQsIChYRkFfRUxFTUVOVClwUHJvcGVydHlbaV0uZU5hbWUpOw0KKyAgICAgICAgICBpZiAoIXBOZXdOb2RlKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgSW5zZXJ0Q2hpbGQocE5ld05vZGUsIE5VTEwpOw0KKyAgICAgICAgICBwTmV3Tm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgICBub2Rlcy5BZGQocE5ld05vZGUpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBub2Rlcy5HZXRTaXplKCk7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpDcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBGYWN0b3J5LT5DcmVhdGVOb2RlKG1fZVBhY2tldCwgZUVsZW1lbnQpOw0KKyAgcE5vZGUtPlNldEZsYWcoZHdGbGFncyk7DQorICByZXR1cm4gcE5vZGU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpDbG9uZVRlbXBsYXRlVG9Gb3JtKEZYX0JPT0wgYlJlY3Vyc2l2ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlKTsNCisgIElYRkFfT2JqRmFjdG9yeSogcEZhY3RvcnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldEZhY3RvcnkoKTsNCisgIENYRkFfTm9kZSogcENsb25lID0gcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Gb3JtLCBtX2VOb2RlQ2xhc3MpOw0KKyAgaWYgKCFwQ2xvbmUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwQ2xvbmUtPlNldFRlbXBsYXRlTm9kZSh0aGlzKTsNCisgIHBDbG9uZS0+VXBkYXRlTmFtZUhhc2goKTsNCisgIHBDbG9uZS0+U2V0WE1MTWFwcGluZ05vZGUoR2V0WE1MTWFwcGluZ05vZGUoKSk7DQorICBpZiAoYlJlY3Vyc2l2ZSkgew0KKyAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ2hpbGQ7DQorICAgICAgICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgcENsb25lLT5JbnNlcnRDaGlsZChwQ2hpbGQtPkNsb25lVGVtcGxhdGVUb0Zvcm0oYlJlY3Vyc2l2ZSkpOw0KKyAgICB9DQorICB9DQorICBwQ2xvbmUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgIHJldHVybiBwQ2xvbmU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRUZW1wbGF0ZU5vZGUoKSB7DQorICByZXR1cm4gbV9wQXV4Tm9kZTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNldFRlbXBsYXRlTm9kZShDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUpIHsNCisgIG1fcEF1eE5vZGUgPSBwVGVtcGxhdGVOb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0QmluZERhdGEoKSB7DQorICBBU1NFUlQoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KKyAgcmV0dXJuIChDWEZBX05vZGUqKUdldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKTsNCit9DQoraW50MzJfdCBDWEZBX05vZGU6OkdldEJpbmRJdGVtcyhDWEZBX05vZGVBcnJheSYgZm9ybUl0ZW1zKSB7DQorICBpZiAobV91RmxhZ3MgJiBYRkFfTk9ERUZMQUdfQmluZEZvcm1JdGVtcykgew0KKyAgICBDWEZBX05vZGVBcnJheSogcEl0ZW1zID0gTlVMTDsNCisgICAgVHJ5T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsICh2b2lkKiYpcEl0ZW1zKTsNCisgICAgZm9ybUl0ZW1zLkNvcHkoKnBJdGVtcyk7DQorICAgIHJldHVybiBmb3JtSXRlbXMuR2V0U2l6ZSgpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSAoQ1hGQV9Ob2RlKilHZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSk7DQorICBpZiAocEZvcm1Ob2RlKSB7DQorICAgIGZvcm1JdGVtcy5BZGQocEZvcm1Ob2RlKTsNCisgIH0NCisgIHJldHVybiBmb3JtSXRlbXMuR2V0U2l6ZSgpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YU5vZGVEZWxldGVCaW5kSXRlbSh2b2lkKiBwRGF0YSkgew0KKyAgaWYgKHBEYXRhKSB7DQorICAgIGRlbGV0ZSAoKENYRkFfTm9kZUFycmF5KilwRGF0YSk7DQorICB9DQorfQ0KK3N0YXRpYyBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGRlbGV0ZUJpbmRJdGVtQ2FsbEJhY2sgPSB7DQorICAgIFhGQV9EYXRhTm9kZURlbGV0ZUJpbmRJdGVtLCBOVUxMfTsNCitpbnQzMl90IENYRkFfTm9kZTo6QWRkQmluZEl0ZW0oQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpIHsNCisgIEFTU0VSVChwRm9ybU5vZGUpOw0KKyAgaWYgKG1fdUZsYWdzICYgWEZBX05PREVGTEFHX0JpbmRGb3JtSXRlbXMpIHsNCisgICAgQ1hGQV9Ob2RlQXJyYXkqIHBJdGVtcyA9IE5VTEw7DQorICAgIFRyeU9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCAodm9pZComKXBJdGVtcyk7DQorICAgIEFTU0VSVChwSXRlbXMpOw0KKyAgICBpZiAocEl0ZW1zLT5GaW5kKHBGb3JtTm9kZSkgPCAwKSB7DQorICAgICAgcEl0ZW1zLT5BZGQocEZvcm1Ob2RlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcEl0ZW1zLT5HZXRTaXplKCk7DQorICB9DQorICBDWEZBX05vZGUqIHBPbGRGb3JtSXRlbSA9IChDWEZBX05vZGUqKUdldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKTsNCisgIGlmICghcE9sZEZvcm1JdGVtKSB7DQorICAgIFNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBwRm9ybU5vZGUpOw0KKyAgICByZXR1cm4gMTsNCisgIH0gZWxzZSBpZiAocE9sZEZvcm1JdGVtID09IHBGb3JtTm9kZSkgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIENYRkFfTm9kZUFycmF5KiBwSXRlbXMgPSBGWF9ORVcgQ1hGQV9Ob2RlQXJyYXk7DQorICBTZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgcEl0ZW1zLCAmZGVsZXRlQmluZEl0ZW1DYWxsQmFjayk7DQorICBwSXRlbXMtPkFkZChwT2xkRm9ybUl0ZW0pOw0KKyAgcEl0ZW1zLT5BZGQocEZvcm1Ob2RlKTsNCisgIG1fdUZsYWdzIHw9IFhGQV9OT0RFRkxBR19CaW5kRm9ybUl0ZW1zOw0KKyAgcmV0dXJuIDI7DQorfQ0KK2ludDMyX3QgQ1hGQV9Ob2RlOjpSZW1vdmVCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSkgew0KKyAgaWYgKG1fdUZsYWdzICYgWEZBX05PREVGTEFHX0JpbmRGb3JtSXRlbXMpIHsNCisgICAgQ1hGQV9Ob2RlQXJyYXkqIHBJdGVtcyA9IE5VTEw7DQorICAgIFRyeU9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCAodm9pZComKXBJdGVtcyk7DQorICAgIEFTU0VSVChwSXRlbXMpOw0KKyAgICBpbnQzMl90IGlJbmRleCA9IHBJdGVtcy0+RmluZChwRm9ybU5vZGUpOw0KKyAgICBpbnQzMl90IGlDb3VudCA9IHBJdGVtcy0+R2V0U2l6ZSgpOw0KKyAgICBpZiAoaUluZGV4ID49IDApIHsNCisgICAgICBpZiAoaUluZGV4ICE9IGlDb3VudCAtIDEpIHsNCisgICAgICAgIHBJdGVtcy0+U2V0QXQoaUluZGV4LCBwSXRlbXMtPkdldEF0KGlDb3VudCAtIDEpKTsNCisgICAgICB9DQorICAgICAgcEl0ZW1zLT5SZW1vdmVBdChpQ291bnQgLSAxKTsNCisgICAgICBpZiAoaUNvdW50ID09IDIpIHsNCisgICAgICAgIENYRkFfTm9kZSogcExhc3RGb3JtTm9kZSA9IHBJdGVtcy0+R2V0QXQoMCk7DQorICAgICAgICBTZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgcExhc3RGb3JtTm9kZSk7DQorICAgICAgICBtX3VGbGFncyAmPSB+WEZBX05PREVGTEFHX0JpbmRGb3JtSXRlbXM7DQorICAgICAgfQ0KKyAgICAgIGlDb3VudC0tOw0KKyAgICB9DQorICAgIHJldHVybiBpQ291bnQ7DQorICB9DQorICBDWEZBX05vZGUqIHBPbGRGb3JtSXRlbSA9IChDWEZBX05vZGUqKUdldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKTsNCisgIGlmIChwT2xkRm9ybUl0ZW0gPT0gcEZvcm1Ob2RlKSB7DQorICAgIFNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBOVUxMKTsNCisgICAgcE9sZEZvcm1JdGVtID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBwT2xkRm9ybUl0ZW0gPT0gTlVMTCA/IDAgOiAxOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6SGFzQmluZEl0ZW0oKSB7DQorICByZXR1cm4gKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgJiYNCisgICAgICAgICBHZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSkgIT0gTlVMTDsNCit9DQorQ1hGQV9XaWRnZXREYXRhKiBDWEZBX05vZGU6OkdldFdpZGdldERhdGEoKSB7DQorICByZXR1cm4gKENYRkFfV2lkZ2V0RGF0YSopR2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfV2lkZ2V0RGF0YSk7DQorfQ0KK0NYRkFfV2lkZ2V0RGF0YSogQ1hGQV9Ob2RlOjpHZXRDb250YWluZXJXaWRnZXREYXRhKCkgew0KKyAgaWYgKEdldFBhY2tldElEKCkgIT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgWEZBX0VMRU1FTlQgY2xhc3NJRCA9IEdldENsYXNzSUQoKTsNCisgIGlmIChjbGFzc0lEID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIGlmIChwUGFyZW50Tm9kZSAmJiBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChjbGFzc0lEID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgIENYRkFfV2lkZ2V0RGF0YSogcEZpZWxkV2lkZ2V0RGF0YSA9IHRoaXMtPkdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKHBGaWVsZFdpZGdldERhdGEgJiYNCisgICAgICAgIHBGaWVsZFdpZGdldERhdGEtPkdldENob2ljZUxpc3RPcGVuKCkgPT0NCisgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsNCisgICAgICBpZiAocEZpZWxkV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgcEZpZWxkV2lkZ2V0RGF0YS0+R2V0UGljdHVyZUNvbnRlbnQod3NQaWN0dXJlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7DQorICAgICAgfQ0KKyAgICAgIGlmICghd3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcmV0dXJuIHBGaWVsZFdpZGdldERhdGE7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gdGhpcy0+R2V0QmluZERhdGEoKTsNCisgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIHBGaWVsZFdpZGdldERhdGEgPSBOVUxMOw0KKyAgICAgIENYRkFfTm9kZUFycmF5IGZvcm1Ob2RlczsNCisgICAgICBwRGF0YU5vZGUtPkdldEJpbmRJdGVtcyhmb3JtTm9kZXMpOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGZvcm1Ob2Rlcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBmb3JtTm9kZXMuR2V0QXQoaSk7DQorICAgICAgICBpZiAoIXBGb3JtTm9kZSB8fCBwRm9ybU5vZGUtPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEZpZWxkV2lkZ2V0RGF0YSA9IHBGb3JtTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICAgICAgaWYgKHBGaWVsZFdpZGdldERhdGEpIHsNCisgICAgICAgICAgcEZpZWxkV2lkZ2V0RGF0YS0+R2V0UGljdHVyZUNvbnRlbnQod3NQaWN0dXJlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghd3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHBGaWVsZFdpZGdldERhdGEgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcEZpZWxkV2lkZ2V0RGF0YTsNCisgICAgfQ0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwR3JhbmROb2RlID0NCisgICAgICBwUGFyZW50Tm9kZSA/IHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSA6IE5VTEw7DQorICBDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPQ0KKyAgICAgIChwUGFyZW50Tm9kZSAmJiBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhbHVlKQ0KKyAgICAgICAgICA/IHBQYXJlbnROb2RlDQorICAgICAgICAgIDogTlVMTDsNCisgIGlmICghcFZhbHVlTm9kZSkgew0KKyAgICBwVmFsdWVOb2RlID0gKHBHcmFuZE5vZGUgJiYgcEdyYW5kTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhbHVlKQ0KKyAgICAgICAgICAgICAgICAgICAgID8gcEdyYW5kTm9kZQ0KKyAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsNCisgIH0NCisgIENYRkFfTm9kZSogcFBhcmVudE9mVmFsdWVOb2RlID0NCisgICAgICBwVmFsdWVOb2RlID8gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkgOiBOVUxMOw0KKyAgcmV0dXJuIHBQYXJlbnRPZlZhbHVlTm9kZSA/IHBQYXJlbnRPZlZhbHVlTm9kZS0+R2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OkdldExvY2FsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxlTmFtZSkgew0KKyAgQ1hGQV9Ob2RlKiBwRm9ybSA9IChDWEZBX05vZGUqKUdldERvY3VtZW50KCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgQ1hGQV9Ob2RlKiBwVG9wU3ViZm9ybSA9IHBGb3JtLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCisgIEZYU1lTX2Fzc2VydChwVG9wU3ViZm9ybSk7DQorICBDWEZBX05vZGUqIHBMb2NhbGVOb2RlID0gdGhpczsNCisgIEZYX0JPT0wgYkxvY2FsZSA9IEZBTFNFOw0KKyAgZG8gew0KKyAgICBiTG9jYWxlID0gcExvY2FsZU5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTG9jYWxlLCB3c0xvY2FsZU5hbWUsIEZBTFNFKTsNCisgICAgaWYgKCFiTG9jYWxlKSB7DQorICAgICAgcExvY2FsZU5vZGUgPSBwTG9jYWxlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIH0NCisgIH0gd2hpbGUgKHBMb2NhbGVOb2RlICYmIHBMb2NhbGVOb2RlICE9IHBUb3BTdWJmb3JtICYmICFiTG9jYWxlKTsNCisgIGlmIChiTG9jYWxlKSB7DQorICAgIHJldHVybiBiTG9jYWxlOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQ29uZmlnID0NCisgICAgICAoQ1hGQV9Ob2RlKilHZXREb2N1bWVudCgpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Db25maWcpOw0KKyAgd3NMb2NhbGVOYW1lID0gR2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKS0+R2V0Q29uZmlnTG9jYWxlTmFtZShwQ29uZmlnKTsNCisgIGlmICghd3NMb2NhbGVOYW1lLklzRW1wdHkoKSkgew0KKyAgICBiTG9jYWxlID0gVFJVRTsNCisgIH0NCisgIGlmIChiTG9jYWxlKSB7DQorICAgIHJldHVybiBiTG9jYWxlOw0KKyAgfQ0KKyAgaWYgKHBUb3BTdWJmb3JtKSB7DQorICAgIGJMb2NhbGUgPSBwVG9wU3ViZm9ybS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Mb2NhbGUsIHdzTG9jYWxlTmFtZSwgRkFMU0UpOw0KKyAgfQ0KKyAgaWYgKGJMb2NhbGUpIHsNCisgICAgcmV0dXJuIGJMb2NhbGU7DQorICB9DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKS0+R2V0RGVmTG9jYWxlKCk7DQorICBpZiAocExvY2FsZSkgew0KKyAgICB3c0xvY2FsZU5hbWUgPSBwTG9jYWxlLT5HZXROYW1lKCk7DQorICAgIGJMb2NhbGUgPSBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIGJMb2NhbGU7DQorfQ0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfTm9kZTo6R2V0SW50YWN0KCkgew0KKyAgWEZBX0VMRU1FTlQgZUVsZW1lbnQgPSBHZXRDbGFzc0lEKCk7DQorICBDWEZBX05vZGUqIHBLZWVwID0gR2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfS2VlcCk7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0VHlwZSA9IEdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgaWYgKHBLZWVwKSB7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVJbnRhY3Q7DQorICAgIGlmIChwS2VlcC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX0ludGFjdCwgZUludGFjdCwgRkFMU0UpKSB7DQorICAgICAgaWYgKGVJbnRhY3QgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZSAmJg0KKyAgICAgICAgICBlTGF5b3V0VHlwZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cgJiYNCisgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldEN1clZlcnNpb25Nb2RlKCkgPCBYRkFfVkVSU0lPTl8yMDgpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFByZXZpZXdSb3cgPQ0KKyAgICAgICAgICAgIEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QcmV2U2libGluZywgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgICAgICBpZiAocFByZXZpZXdSb3cgJiYNCisgICAgICAgICAgICBwUHJldmlld1Jvdy0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCkgPT0NCisgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fUm93KSB7DQorICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVWYWx1ZTsNCisgICAgICAgICAgaWYgKHBLZWVwLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfUHJldmlvdXMsIGVWYWx1ZSwgRkFMU0UpKSB7DQorICAgICAgICAgICAgaWYgKGVWYWx1ZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSB8fA0KKyAgICAgICAgICAgICAgICBlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEpIHsNCisgICAgICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwS2VlcCA9DQorICAgICAgICAgICAgICBwUHJldmlld1Jvdy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfS2VlcCk7DQorICAgICAgICAgIGlmIChwS2VlcCkgew0KKyAgICAgICAgICAgIGlmIChwS2VlcC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX05leHQsIGVWYWx1ZSwgRkFMU0UpKSB7DQorICAgICAgICAgICAgICBpZiAoZVZhbHVlID09IFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhIHx8DQorICAgICAgICAgICAgICAgICAgZVZhbHVlID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIGVJbnRhY3Q7DQorICAgIH0NCisgIH0NCisgIHN3aXRjaCAoZUVsZW1lbnQpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KKyAgICAgIHN3aXRjaCAoZUxheW91dFR5cGUpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb246DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JvdzoNCisgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9UYjoNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVGFibGU6DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xyX3RiOg0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SbF90YjoNCisgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRmllbGQ6IHsNCisgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgaWYgKCFwUGFyZW50Tm9kZSB8fCBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE7DQorICAgICAgfQ0KKyAgICAgIGlmIChwUGFyZW50Tm9kZS0+R2V0SW50YWN0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZSkgew0KKyAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVBhckxheW91dCA9DQorICAgICAgICAgICAgcFBhcmVudE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgICAgICAgaWYgKGVQYXJMYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24gfHwNCisgICAgICAgICAgICBlUGFyTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdyB8fA0KKyAgICAgICAgICAgIGVQYXJMYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGFibGUpIHsNCisgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorICAgICAgICB9DQorICAgICAgICBYRkFfVkVSU0lPTiB2ZXJzaW9uID0gbV9wRG9jdW1lbnQtPkdldEN1clZlcnNpb25Nb2RlKCk7DQorICAgICAgICBpZiAoZVBhckxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYiAmJiB2ZXJzaW9uIDwgWEZBX1ZFUlNJT05fMjA4KSB7DQorICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQgbWVhc3VyZUg7DQorICAgICAgICAgIGlmICh0aGlzLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCwgbWVhc3VyZUgsIEZBTFNFKSkgew0KKyAgICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQorICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXREYXRhRGVzY3JpcHRpb25Ob2RlKCkgew0KKyAgaWYgKG1fZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQorICAgIHJldHVybiBtX3BBdXhOb2RlOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTZXREYXRhRGVzY3JpcHRpb25Ob2RlKENYRkFfTm9kZSogcERhdGFEZXNjcmlwdGlvbk5vZGUpIHsNCisgIEZYU1lTX2Fzc2VydChtX2VQYWNrZXQgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyk7DQorICBtX3BBdXhOb2RlID0gcERhdGFEZXNjcmlwdGlvbk5vZGU7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1Jlc29sdmVOb2RlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlc29sdmVOb2RlIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICB3c0V4cHJlc3Npb24gPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQorICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiByZWZOb2RlID0gdGhpczsNCisgIGlmIChyZWZOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfWGZhKSB7DQorICAgIHJlZk5vZGUgPSAoQ1hGQV9Ob2RlKilwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwNCisgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCisgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQorICBpbnQzMl90IGlSZXQgPSBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocmVmTm9kZSwgd3NFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCisgIGlmIChpUmV0IDwgMSkgew0KKyAgICByZXR1cm4gRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgIH0NCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBOVUxMOw0KKyAgaWYgKHJlc292ZU5vZGVSUy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2Rlcykgew0KKyAgICBDWEZBX09iamVjdCogcE5vZGUgPSByZXNvdmVOb2RlUlMubm9kZXNbMF07DQorICAgIGhWYWx1ZSA9IHBTY3JpcHRDb250ZXh0LT5HZXRKU1ZhbHVlRnJvbU1hcChwTm9kZSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBoVmFsdWUpOw0KKyAgfSBlbHNlIHsNCisgICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gbHBBdHRyaWJ1dGVJbmZvID0gcmVzb3ZlTm9kZVJTLnBTY3JpcHRBdHRyaWJ1dGU7DQorICAgIGlmIChscEF0dHJpYnV0ZUluZm8gJiYgbHBBdHRyaWJ1dGVJbmZvLT5lVmFsdWVUeXBlID09IFhGQV9TQ1JJUFRfT2JqZWN0KSB7DQorICAgICAgaFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKHBTY3JpcHRDb250ZXh0LT5HZXRSdW50aW1lKCkpOw0KKyAgICAgIChyZXNvdmVOb2RlUlMubm9kZXNbMF0tPioobHBBdHRyaWJ1dGVJbmZvLT5scGZuQ2FsbGJhY2spKSgNCisgICAgICAgICAgaFZhbHVlLCBGQUxTRSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgaFZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19SZXNvbHZlTm9kZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwicmVzb2x2ZU5vZGVzIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICB3c0V4cHJlc3Npb24gPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmICghaFZhbHVlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwNCisgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8DQorICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQorICBDWEZBX05vZGUqIHJlZk5vZGUgPSB0aGlzOw0KKyAgaWYgKHJlZk5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9YZmEpIHsNCisgICAgcmVmTm9kZSA9IChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCisgIH0NCisgIFNjcmlwdF9Tb21fUmVzb2x2ZU5vZGVMaXN0KGhWYWx1ZSwgd3NFeHByZXNzaW9uLCBkd0ZsYWcsIHJlZk5vZGUpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9SZXNvbHZlTm9kZUxpc3QoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcmVmTm9kZSkgew0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQorICBpZiAocmVmTm9kZSA9PSBOVUxMKSB7DQorICAgIHJlZk5vZGUgPSB0aGlzOw0KKyAgfQ0KKyAgaW50MzJfdCBpUmV0ID0gcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHJlZk5vZGUsIHdzRXhwcmVzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdmVOb2RlUlMsIGR3RmxhZyk7DQorICBDWEZBX0FycmF5Tm9kZUxpc3QqIHBOb2RlTGlzdCA9IEZYX05FVyBDWEZBX0FycmF5Tm9kZUxpc3QobV9wRG9jdW1lbnQpOw0KKyAgaWYgKHJlc292ZU5vZGVSUy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2Rlcykgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCByZXNvdmVOb2RlUlMubm9kZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICBpZiAocmVzb3ZlTm9kZVJTLm5vZGVzW2ldLT5Jc05vZGUoKSkgew0KKyAgICAgICAgcE5vZGVMaXN0LT5BcHBlbmQoKENYRkFfTm9kZSopcmVzb3ZlTm9kZVJTLm5vZGVzW2ldKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfSFZBTFVFQXJyYXkgaFZhbHVlQXJyYXkocFNjcmlwdENvbnRleHQtPkdldFJ1bnRpbWUoKSk7DQorICAgIGlmIChyZXNvdmVOb2RlUlMuR2V0QXR0cmlidXRlUmVzdWx0KGhWYWx1ZUFycmF5KSA+IDApIHsNCisgICAgICBDWEZBX09iakFycmF5IG9iamVjdEFycmF5Ow0KKyAgICAgIGhWYWx1ZUFycmF5LkdldEF0dHJpYnV0ZU9iamVjdChvYmplY3RBcnJheSk7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgb2JqZWN0QXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGlmIChvYmplY3RBcnJheVtpXS0+SXNOb2RlKCkpIHsNCisgICAgICAgICAgcE5vZGVMaXN0LT5BcHBlbmQoKENYRkFfTm9kZSopb2JqZWN0QXJyYXlbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0KGhWYWx1ZSwgKENYRkFfT2JqZWN0KilwTm9kZUxpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmlwdENvbnRleHQtPkdldEpzZU5vcm1hbENsYXNzKCkpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19BbGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0gZWxzZSB7DQorICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgICAgR2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0gd3NOYW1lICsgRlhfV1NUUkMoTCJbKl0iKTsNCisgICAgU2NyaXB0X1NvbV9SZXNvbHZlTm9kZUxpc3QoaFZhbHVlLCB3c0V4cHJlc3Npb24sIGR3RmxhZyk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX05vZGVzKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCiAgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpLT5HZXRBcHBQcm92aWRlcigpOw0KICAgICBGWFNZU19hc3NlcnQocEFwcFByb3ZpZGVyKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQotICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhpU3RyaW5nSUQsIHdzRm9ybWF0KTsNCiAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlOw0KLSAgICB2YV9saXN0IGFyZ19wdHI7DQotICAgIHZhX3N0YXJ0KGFyZ19wdHIsIGlTdHJpbmdJRCk7DQotICAgIHdzTWVzc2FnZS5Gb3JtYXRWKChjb25zdCBGWF9XQ0hBUiopd3NGb3JtYXQsIGFyZ19wdHIpOw0KLSAgICB2YV9lbmQoYXJnX3B0cik7DQotICAgIEZYSlNFX1Rocm93TWVzc2FnZShGWF9CU1RSQygiIiksIEZYX1VURjhFbmNvZGUod3NNZXNzYWdlLCB3c01lc3NhZ2UuR2V0TGVuZ3RoKCkpKTsNCisgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVW5hYmxlX1RPX1NFVCwgd3NNZXNzYWdlKTsNCisgICAgRlhKU0VfVGhyb3dNZXNzYWdlKEZYX0JTVFJDKCIiKSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX1VURjhFbmNvZGUod3NNZXNzYWdlLCB3c01lc3NhZ2UuR2V0TGVuZ3RoKCkpKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfQXR0YWNoTm9kZUxpc3QqIHBOb2RlTGlzdCA9DQorICAgICAgICBGWF9ORVcgQ1hGQV9BdHRhY2hOb2RlTGlzdChtX3BEb2N1bWVudCwgdGhpcyk7DQorICAgIEZYSlNFX1ZhbHVlX1NldE9iamVjdChoVmFsdWUsIChDWEZBX09iamVjdCopcE5vZGVMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmlwdENvbnRleHQtPkdldEpzZU5vcm1hbENsYXNzKCkpOw0KKyAgfQ0KIH0NCi1zdGF0aWMgdm9pZCBYRkFfRGVsZXRlV2lkZVN0cmluZyh2b2lkKiBwRGF0YSkNCi17DQotICAgIGlmIChwRGF0YSkgew0KLSAgICAgICAgZGVsZXRlIChDRlhfV2lkZVN0cmluZyopcERhdGE7DQotICAgIH0NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19DbGFzc0FsbChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0gZWxzZSB7DQorICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWU7DQorICAgIHRoaXMtPkdldENsYXNzTmFtZSh3c05hbWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24gPSBGWF9XU1RSQyhMIiMiKSArIHdzTmFtZSArIEZYX1dTVFJDKEwiWypdIik7DQorICAgIFNjcmlwdF9Tb21fUmVzb2x2ZU5vZGVMaXN0KGhWYWx1ZSwgd3NFeHByZXNzaW9uLCBkd0ZsYWcpOw0KKyAgfQ0KIH0NCi1zdGF0aWMgdm9pZCBYRkFfQ29weVdpZGVTdHJpbmcodm9pZComIHBEYXRhKQ0KLXsNCi0gICAgaWYgKHBEYXRhKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyogcE5ld0RhdGEgPSBGWF9ORVcgQ0ZYX1dpZGVTdHJpbmcoKihDRlhfV2lkZVN0cmluZyopcERhdGEpOw0KLSAgICAgICAgcERhdGEgPSBwTmV3RGF0YTsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19QYXJlbnQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfTm9kZSogcFBhcmVudCA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICBpZiAocFBhcmVudCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldCgNCisgICAgICAgICAgaFZhbHVlLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwUGFyZW50KSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KICAgICB9DQorICB9DQogfQ0KLXN0YXRpYyBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGRlbGV0ZVdpZGVTdHJpbmdDYWxsQmFjayA9IHtYRkFfRGVsZXRlV2lkZVN0cmluZywgWEZBX0NvcHlXaWRlU3RyaW5nfTsNCi1zdGF0aWMgWEZBX09CSkVDVFRZUEUgWEZBX0dldEVsZW1lbnRPYmplY3RUeXBlKFhGQV9FTEVNRU5UIGVFbGVtZW50KQ0KLXsNCi0gICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50ID0gWEZBX0dldEVsZW1lbnRCeUlEKGVFbGVtZW50KTsNCi0gICAgQVNTRVJUKHBFbGVtZW50ICE9IE5VTEwpOw0KLSAgICByZXR1cm4gKFhGQV9PQkpFQ1RUWVBFKXBFbGVtZW50LT5lT2JqZWN0VHlwZTsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19JbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBHZXROb2RlU2FtZU5hbWVJbmRleCgpKTsNCisgIH0NCiB9DQotQ1hGQV9Ob2RlOjpDWEZBX05vZGUoQ1hGQV9Eb2N1bWVudCAqcERvYywgRlhfV09SRCBlUGFja2V0LCBYRkFfRUxFTUVOVCBlRWxlbWVudCkNCi0gICAgOiBDWEZBX09iamVjdChwRG9jLCBYRkFfR2V0RWxlbWVudE9iamVjdFR5cGUoZUVsZW1lbnQpKQ0KLSAgICAsIG1fcFBhcmVudChOVUxMKQ0KLSAgICAsIG1fcE5leHQoTlVMTCkNCi0gICAgLCBtX3BDaGlsZChOVUxMKQ0KLSAgICAsIG1fcExhc3RDaGlsZChOVUxMKQ0KLSAgICAsIG1fcFhNTE5vZGUoTlVMTCkNCi0gICAgLCBtX2VQYWNrZXQoZVBhY2tldCkNCi0gICAgLCBtX2VOb2RlQ2xhc3MoZUVsZW1lbnQpDQotICAgICwgbV9kd05hbWVIYXNoKDApDQotICAgICwgbV9wQXV4Tm9kZShOVUxMKQ0KLSAgICAsIG1fcE1hcE1vZHVsZURhdGEoTlVMTCkNCi17DQotICAgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19DbGFzc0luZGV4KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBHZXROb2RlU2FtZUNsYXNzSW5kZXgoKSk7DQorICB9DQogfQ0KLUNYRkFfTm9kZTo6fkNYRkFfTm9kZSgpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9wUGFyZW50ID09IE5VTEwpOw0KLSAgICBSZW1vdmVNYXBNb2R1bGVLZXkoKTsNCi0gICAgQ1hGQV9Ob2RlICpwTmV4dCwgKnBOb2RlID0gbV9wQ2hpbGQ7DQotICAgIHdoaWxlIChwTm9kZSkgew0KLSAgICAgICAgcE5leHQgPSBwTm9kZS0+bV9wTmV4dDsNCi0gICAgICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBOVUxMOw0KLSAgICAgICAgZGVsZXRlIHBOb2RlOw0KLSAgICAgICAgcE5vZGUgPSBwTmV4dDsNCi0gICAgfQ0KLSAgICBpZiAobV9wWE1MTm9kZSAmJiBIYXNGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlKSkgew0KLSAgICAgICAgbV9wWE1MTm9kZS0+UmVsZWFzZSgpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfU29tRXhwcmVzc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1NPTUV4cHJlc3Npb247DQorICAgIEdldFNPTUV4cHJlc3Npb24od3NTT01FeHByZXNzaW9uKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NTT01FeHByZXNzaW9uKSk7DQorICB9DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9Ob2RlOjpDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpDQotew0KLSAgICBJWEZBX09iakZhY3RvcnkgKnBGYWN0b3J5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCk7DQotICAgIENYRkFfTm9kZSAqcENsb25lID0gcEZhY3RvcnktPkNyZWF0ZU5vZGUobV9lUGFja2V0LCBtX2VOb2RlQ2xhc3MpOw0KLSAgICBpZighcENsb25lKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBNZXJnZUFsbERhdGEocENsb25lKTsNCi0gICAgcENsb25lLT5VcGRhdGVOYW1lSGFzaCgpOw0KLSAgICBpZiAoSXNOZWVkU2F2aW5nWE1MTm9kZSgpKSB7DQotICAgICAgICBJRkRFX1hNTE5vZGUqIHBDbG9uZVhNTCA9IE5VTEw7DQotICAgICAgICBpZiAoSXNBdHRyaWJ1dGVJblhNTCgpKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KLSAgICAgICAgICAgIHRoaXMtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSwgRkFMU0UpOw0KLSAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCogcENsb25lWE1MRWxlbWVudCA9IElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKHdzTmFtZSk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWUgPSB0aGlzLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlKTsNCi0gICAgICAgICAgICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIHBDbG9uZVhNTEVsZW1lbnQtPlNldFRleHREYXRhKHdzVmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwQ2xvbmVYTUwgPSBwQ2xvbmVYTUxFbGVtZW50Ow0KLSAgICAgICAgICAgIHBDbG9uZVhNTEVsZW1lbnQgPSBOVUxMOw0KLSAgICAgICAgICAgIHBDbG9uZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcENsb25lWE1MID0gbV9wWE1MTm9kZS0+Q2xvbmUoRkFMU0UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcENsb25lLT5TZXRYTUxNYXBwaW5nTm9kZShwQ2xvbmVYTUwpOw0KLSAgICAgICAgcENsb25lLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBUUlVFLCBGQUxTRSk7DQotICAgIH0NCi0gICAgaWYgKGJSZWN1cnNpdmUpIHsNCi0gICAgICAgIGZvcihDWEZBX05vZGUqIHBDaGlsZCA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICBwQ2xvbmUtPkluc2VydENoaWxkKHBDaGlsZC0+Q2xvbmUoYlJlY3Vyc2l2ZSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHBDbG9uZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KLSAgICBwQ2xvbmUtPlNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBOVUxMKTsNCi0gICAgcmV0dXJuIHBDbG9uZTsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19BcHBseVhTTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJhcHBseVhTTCIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgd3NFeHByZXNzaW9uID0NCisgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFeHByZXNzaW9uLCBic0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkpOw0KIH0NCi1DWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNIGVJdGVtKSBjb25zdA0KLXsNCi0gICAgc3dpdGNoIChlSXRlbSkgew0KLSAgICAgICAgY2FzZSBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmc6DQotICAgICAgICAgICAgcmV0dXJuIG1fcE5leHQ7DQotICAgICAgICBjYXNlIFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkOg0KLSAgICAgICAgICAgIHJldHVybiBtX3BDaGlsZDsNCi0gICAgICAgIGNhc2UgWEZBX05PREVJVEVNX1BhcmVudDoNCi0gICAgICAgICAgICByZXR1cm4gbV9wUGFyZW50Ow0KLSAgICAgICAgY2FzZSBYRkFfTk9ERUlURU1fUHJldlNpYmxpbmc6DQotICAgICAgICAgICAgaWYgKG1fcFBhcmVudCkgew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBTaWJsaW5nID0gbV9wUGFyZW50LT5tX3BDaGlsZDsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwUHJldiA9IE5VTEw7DQotICAgICAgICAgICAgICAgIHdoaWxlIChwU2libGluZyAmJiBwU2libGluZyAhPSB0aGlzKSB7DQotICAgICAgICAgICAgICAgICAgICBwUHJldiA9IHBTaWJsaW5nOw0KLSAgICAgICAgICAgICAgICAgICAgcFNpYmxpbmcgPSBwU2libGluZy0+bV9wTmV4dDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gcFByZXY7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTSBlSXRlbSwgWEZBX09CSkVDVFRZUEUgZVR5cGUpIGNvbnN0DQotew0KLSAgICBDWEZBX05vZGUgKnBOb2RlID0gTlVMTDsNCi0gICAgc3dpdGNoIChlSXRlbSkgew0KLSAgICAgICAgY2FzZSBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmc6DQotICAgICAgICAgICAgcE5vZGUgPSBtX3BOZXh0Ow0KLSAgICAgICAgICAgIGlmIChlVHlwZSAhPSBYRkFfT0JKRUNUVFlQRU1BU0spDQotICAgICAgICAgICAgICAgIHdoaWxlIChwTm9kZSAmJiBwTm9kZS0+R2V0T2JqZWN0VHlwZSgpICE9IGVUeXBlKSB7DQotICAgICAgICAgICAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5tX3BOZXh0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkOg0KLSAgICAgICAgICAgIHBOb2RlID0gbV9wQ2hpbGQ7DQotICAgICAgICAgICAgaWYgKGVUeXBlICE9IFhGQV9PQkpFQ1RUWVBFTUFTSykNCi0gICAgICAgICAgICAgICAgd2hpbGUgKHBOb2RlICYmIHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgIT0gZVR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX05PREVJVEVNX1BhcmVudDoNCi0gICAgICAgICAgICBwTm9kZSA9IG1fcFBhcmVudDsNCi0gICAgICAgICAgICBpZiAoZVR5cGUgIT0gWEZBX09CSkVDVFRZUEVNQVNLKQ0KLSAgICAgICAgICAgICAgICB3aGlsZSAocE5vZGUgJiYgcE5vZGUtPkdldE9iamVjdFR5cGUoKSAhPSBlVHlwZSkgew0KLSAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wUGFyZW50Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9OT0RFSVRFTV9QcmV2U2libGluZzoNCi0gICAgICAgICAgICBpZiAobV9wUGFyZW50KSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcFNpYmxpbmcgPSBtX3BQYXJlbnQtPm1fcENoaWxkOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAocFNpYmxpbmcgJiYgcFNpYmxpbmcgIT0gdGhpcykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVUeXBlID09IFhGQV9PQkpFQ1RUWVBFTUFTSyB8fCBlVHlwZSA9PSBwU2libGluZy0+R2V0T2JqZWN0VHlwZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBwU2libGluZzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHBTaWJsaW5nID0gcFNpYmxpbmctPm1fcE5leHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBwTm9kZTsNCi19DQotaW50MzJfdCBDWEZBX05vZGU6OkdldE5vZGVMaXN0KENYRkFfTm9kZUFycmF5ICZub2RlcywgRlhfRFdPUkQgZHdUeXBlRmlsdGVyICwgWEZBX0VMRU1FTlQgZUVsZW1lbnRGaWx0ZXIgLCBpbnQzMl90IGlMZXZlbCApDQotew0KLSAgICBpZiAoLS1pTGV2ZWwgPCAwKSB7DQotICAgICAgICByZXR1cm4gbm9kZXMuR2V0U2l6ZSgpOw0KLSAgICB9DQotICAgIGlmIChlRWxlbWVudEZpbHRlciAhPSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQotICAgICAgICBDWEZBX05vZGUgKnBDaGlsZCA9IG1fcENoaWxkOw0KLSAgICAgICAgd2hpbGUgKHBDaGlsZCkgew0KLSAgICAgICAgICAgIGlmIChwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBlRWxlbWVudEZpbHRlcikgew0KLSAgICAgICAgICAgICAgICBub2Rlcy5BZGQocENoaWxkKTsNCi0gICAgICAgICAgICAgICAgaWYgKGlMZXZlbCA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIEdldE5vZGVMaXN0KG5vZGVzLCBkd1R5cGVGaWx0ZXIsIGVFbGVtZW50RmlsdGVyLCBpTGV2ZWwpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChkd1R5cGVGaWx0ZXIgPT0gKFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuIHwgWEZBX05PREVGSUxURVJfUHJvcGVydGllcykpIHsNCi0gICAgICAgIENYRkFfTm9kZSAqcENoaWxkID0gbV9wQ2hpbGQ7DQotICAgICAgICB3aGlsZSAocENoaWxkKSB7DQotICAgICAgICAgICAgbm9kZXMuQWRkKHBDaGlsZCk7DQotICAgICAgICAgICAgaWYgKGlMZXZlbCA+IDApIHsNCi0gICAgICAgICAgICAgICAgR2V0Tm9kZUxpc3Qobm9kZXMsIGR3VHlwZUZpbHRlciwgZUVsZW1lbnRGaWx0ZXIsIGlMZXZlbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChkd1R5cGVGaWx0ZXIgIT0gMCkgew0KLSAgICAgICAgRlhfQk9PTCBiRmlsdGVyQ2hpbGRyZW4gPSAoZHdUeXBlRmlsdGVyICYgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4pICE9IDA7DQotICAgICAgICBGWF9CT09MIGJGaWx0ZXJQcm9wZXJ0aWVzID0gKGR3VHlwZUZpbHRlciAmIFhGQV9OT0RFRklMVEVSX1Byb3BlcnRpZXMpICE9IDA7DQotICAgICAgICBGWF9CT09MIGJGaWx0ZXJPbmVPZlByb3BlcnRpZXMgPSAoZHdUeXBlRmlsdGVyICYgWEZBX05PREVGSUxURVJfT25lT2ZQcm9wZXJ0eSkgIT0gMDsNCi0gICAgICAgIENYRkFfTm9kZSAqcENoaWxkID0gbV9wQ2hpbGQ7DQotICAgICAgICB3aGlsZSAocENoaWxkKSB7DQotICAgICAgICAgICAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KEdldENsYXNzSUQoKSwgcENoaWxkLT5HZXRDbGFzc0lEKCksIFhGQV9YRFBQQUNLRVRfVU5LTk9XTik7DQotICAgICAgICAgICAgaWYgKHBQcm9wZXJ0KSB7DQotICAgICAgICAgICAgICAgIGlmIChiRmlsdGVyUHJvcGVydGllcykgew0KLSAgICAgICAgICAgICAgICAgICAgbm9kZXMuQWRkKHBDaGlsZCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYkZpbHRlck9uZU9mUHJvcGVydGllcyAmJiAocFByb3BlcnQtPnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YpKSB7DQotICAgICAgICAgICAgICAgICAgICBub2Rlcy5BZGQocENoaWxkKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGJGaWx0ZXJDaGlsZHJlbiAmJiAocENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzIHx8IHBDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpKSB7DQotICAgICAgICAgICAgICAgICAgICBub2Rlcy5BZGQocENoaWxkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmIChiRmlsdGVyQ2hpbGRyZW4pIHsNCi0gICAgICAgICAgICAgICAgICAgIG5vZGVzLkFkZChwQ2hpbGQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiRmlsdGVyT25lT2ZQcm9wZXJ0aWVzICYmIG5vZGVzLkdldFNpemUoKSA8IDEpIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlQcm9wZXJ0aWVzID0gMDsNCi0gICAgICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnR5ID0gWEZBX0dldEVsZW1lbnRQcm9wZXJ0aWVzKEdldENsYXNzSUQoKSwgaVByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgIGlmIChwUHJvcGVydHkgPT0gTlVMTCB8fCBpUHJvcGVydGllcyA8IDEpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlQcm9wZXJ0aWVzOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgaWYgKHBQcm9wZXJ0eVtpXS51RmxhZ3MgJiBYRkFfUFJPUEVSVFlGTEFHX0RlZmF1bHRPbmVPZikgew0KLSAgICAgICAgICAgICAgICAgICAgSVhGQV9PYmpGYWN0b3J5ICpwRmFjdG9yeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICAgICAgWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldCA9IFhGQV9HZXRQYWNrZXRCeUlEKEdldFBhY2tldElEKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IHBGYWN0b3J5LT5DcmVhdGVOb2RlKHBQYWNrZXQsIChYRkFfRUxFTUVOVClwUHJvcGVydHlbaV0uZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYoIXBOZXdOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBJbnNlcnRDaGlsZChwTmV3Tm9kZSwgTlVMTCk7DQotICAgICAgICAgICAgICAgICAgICBwTmV3Tm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KLSAgICAgICAgICAgICAgICAgICAgbm9kZXMuQWRkKHBOZXdOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBub2Rlcy5HZXRTaXplKCk7DQotfQ0KLUNYRkFfTm9kZSogQ1hGQV9Ob2RlOjpDcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRUxFTUVOVCBlRWxlbWVudCwgRlhfRFdPUkQgZHdGbGFncykNCi17DQotICAgIElYRkFfT2JqRmFjdG9yeSAqcEZhY3RvcnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldEZhY3RvcnkoKTsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBGYWN0b3J5LT5DcmVhdGVOb2RlKG1fZVBhY2tldCwgZUVsZW1lbnQpOw0KLSAgICBwTm9kZS0+U2V0RmxhZyhkd0ZsYWdzKTsNCi0gICAgcmV0dXJuIHBOb2RlOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfTm9kZTo6Q2xvbmVUZW1wbGF0ZVRvRm9ybShGWF9CT09MIGJSZWN1cnNpdmUpDQotew0KLSAgICBGWFNZU19hc3NlcnQobV9lUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUpOw0KLSAgICBJWEZBX09iakZhY3RvcnkgKnBGYWN0b3J5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCk7DQotICAgIENYRkFfTm9kZSAqcENsb25lID0gcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Gb3JtLCBtX2VOb2RlQ2xhc3MpOw0KLSAgICBpZighcENsb25lKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBwQ2xvbmUtPlNldFRlbXBsYXRlTm9kZSh0aGlzKTsNCi0gICAgcENsb25lLT5VcGRhdGVOYW1lSGFzaCgpOw0KLSAgICBwQ2xvbmUtPlNldFhNTE1hcHBpbmdOb2RlKEdldFhNTE1hcHBpbmdOb2RlKCkpOw0KLSAgICBpZiAoYlJlY3Vyc2l2ZSkgew0KLSAgICAgICAgZm9yKENYRkFfTm9kZSogcENoaWxkID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ2hpbGQ7IHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgIHBDbG9uZS0+SW5zZXJ0Q2hpbGQocENoaWxkLT5DbG9uZVRlbXBsYXRlVG9Gb3JtKGJSZWN1cnNpdmUpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwQ2xvbmUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCi0gICAgcmV0dXJuIHBDbG9uZTsNCi19DQotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldFRlbXBsYXRlTm9kZSgpDQotew0KLSAgICByZXR1cm4gbV9wQXV4Tm9kZTsNCi19DQotdm9pZCBDWEZBX05vZGU6OlNldFRlbXBsYXRlTm9kZShDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUpDQotew0KLSAgICBtX3BBdXhOb2RlID0gcFRlbXBsYXRlTm9kZTsNCi19DQotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEJpbmREYXRhKCkNCi17DQotICAgIEFTU0VSVChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRm9ybSk7DQotICAgIHJldHVybiAoQ1hGQV9Ob2RlKilHZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSk7DQotfQ0KLWludDMyX3QgQ1hGQV9Ob2RlOjpHZXRCaW5kSXRlbXMoQ1hGQV9Ob2RlQXJyYXkmIGZvcm1JdGVtcykNCi17DQotICAgIGlmIChtX3VGbGFncyAmIFhGQV9OT0RFRkxBR19CaW5kRm9ybUl0ZW1zKSB7DQotICAgICAgICBDWEZBX05vZGVBcnJheSogcEl0ZW1zID0gTlVMTDsNCi0gICAgICAgIFRyeU9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCAodm9pZComKXBJdGVtcyk7DQotICAgICAgICBmb3JtSXRlbXMuQ29weSgqcEl0ZW1zKTsNCi0gICAgICAgIHJldHVybiBmb3JtSXRlbXMuR2V0U2l6ZSgpOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gKENYRkFfTm9kZSopR2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUpOw0KLSAgICBpZiAocEZvcm1Ob2RlKSB7DQotICAgICAgICBmb3JtSXRlbXMuQWRkKHBGb3JtTm9kZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIGZvcm1JdGVtcy5HZXRTaXplKCk7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9EYXRhTm9kZURlbGV0ZUJpbmRJdGVtKHZvaWQqIHBEYXRhKQ0KLXsNCi0gICAgaWYgKHBEYXRhKSB7DQotICAgICAgICBkZWxldGUgKChDWEZBX05vZGVBcnJheSopcERhdGEpOw0KLSAgICB9DQotfQ0KLXN0YXRpYyBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGRlbGV0ZUJpbmRJdGVtQ2FsbEJhY2sgPSB7WEZBX0RhdGFOb2RlRGVsZXRlQmluZEl0ZW0sIE5VTEx9Ow0KLWludDMyX3QgQ1hGQV9Ob2RlOjpBZGRCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSkNCi17DQotICAgIEFTU0VSVChwRm9ybU5vZGUpOw0KLSAgICBpZiAobV91RmxhZ3MgJiBYRkFfTk9ERUZMQUdfQmluZEZvcm1JdGVtcykgew0KLSAgICAgICAgQ1hGQV9Ob2RlQXJyYXkqIHBJdGVtcyA9IE5VTEw7DQotICAgICAgICBUcnlPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgKHZvaWQqJilwSXRlbXMpOw0KLSAgICAgICAgQVNTRVJUKHBJdGVtcyk7DQotICAgICAgICBpZiAocEl0ZW1zLT5GaW5kKHBGb3JtTm9kZSkgPCAwKSB7DQotICAgICAgICAgICAgcEl0ZW1zLT5BZGQocEZvcm1Ob2RlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwSXRlbXMtPkdldFNpemUoKTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBPbGRGb3JtSXRlbSA9IChDWEZBX05vZGUqKUdldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKTsNCi0gICAgaWYgKCFwT2xkRm9ybUl0ZW0pIHsNCi0gICAgICAgIFNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBwRm9ybU5vZGUpOw0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0gZWxzZSBpZiAocE9sZEZvcm1JdGVtID09IHBGb3JtTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlQXJyYXkqIHBJdGVtcyA9IEZYX05FVyBDWEZBX05vZGVBcnJheTsNCi0gICAgU2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIHBJdGVtcywgJmRlbGV0ZUJpbmRJdGVtQ2FsbEJhY2spOw0KLSAgICBwSXRlbXMtPkFkZChwT2xkRm9ybUl0ZW0pOw0KLSAgICBwSXRlbXMtPkFkZChwRm9ybU5vZGUpOw0KLSAgICBtX3VGbGFncyB8PSBYRkFfTk9ERUZMQUdfQmluZEZvcm1JdGVtczsNCi0gICAgcmV0dXJuIDI7DQotfQ0KLWludDMyX3QgQ1hGQV9Ob2RlOjpSZW1vdmVCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSkNCi17DQotICAgIGlmIChtX3VGbGFncyAmIFhGQV9OT0RFRkxBR19CaW5kRm9ybUl0ZW1zKSB7DQotICAgICAgICBDWEZBX05vZGVBcnJheSogcEl0ZW1zID0gTlVMTDsNCi0gICAgICAgIFRyeU9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCAodm9pZComKXBJdGVtcyk7DQotICAgICAgICBBU1NFUlQocEl0ZW1zKTsNCi0gICAgICAgIGludDMyX3QgaUluZGV4ID0gcEl0ZW1zLT5GaW5kKHBGb3JtTm9kZSk7DQotICAgICAgICBpbnQzMl90IGlDb3VudCA9IHBJdGVtcy0+R2V0U2l6ZSgpOw0KLSAgICAgICAgaWYgKGlJbmRleCA+PSAwKSB7DQotICAgICAgICAgICAgaWYgKGlJbmRleCAhPSBpQ291bnQgLSAxKSB7DQotICAgICAgICAgICAgICAgIHBJdGVtcy0+U2V0QXQoaUluZGV4LCBwSXRlbXMtPkdldEF0KGlDb3VudCAtIDEpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcEl0ZW1zLT5SZW1vdmVBdChpQ291bnQgLSAxKTsNCi0gICAgICAgICAgICBpZiAoaUNvdW50ID09IDIpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTGFzdEZvcm1Ob2RlID0gcEl0ZW1zLT5HZXRBdCgwKTsNCi0gICAgICAgICAgICAgICAgU2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIHBMYXN0Rm9ybU5vZGUpOw0KLSAgICAgICAgICAgICAgICBtX3VGbGFncyAmPSB+WEZBX05PREVGTEFHX0JpbmRGb3JtSXRlbXM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlDb3VudC0tOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGlDb3VudDsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBPbGRGb3JtSXRlbSA9IChDWEZBX05vZGUqKUdldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKTsNCi0gICAgaWYocE9sZEZvcm1JdGVtID09IHBGb3JtTm9kZSkgew0KLSAgICAgICAgU2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIE5VTEwpOw0KLSAgICAgICAgcE9sZEZvcm1JdGVtID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gcE9sZEZvcm1JdGVtID09IE5VTEwgPyAwIDogMTsNCi19DQotRlhfQk9PTCBDWEZBX05vZGU6Okhhc0JpbmRJdGVtKCkNCi17DQotICAgIHJldHVybiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSAmJiBHZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSkgIT0gTlVMTDsNCi19DQotQ1hGQV9XaWRnZXREYXRhKiBDWEZBX05vZGU6OkdldFdpZGdldERhdGEoKQ0KLXsNCi0gICAgcmV0dXJuIChDWEZBX1dpZGdldERhdGEqKUdldE9iamVjdChYRkFfQVRUUklCVVRFX1dpZGdldERhdGEpOw0KLX0NCi1DWEZBX1dpZGdldERhdGEqIENYRkFfTm9kZTo6R2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpDQotew0KLSAgICBpZiAoR2V0UGFja2V0SUQoKSAhPSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIFhGQV9FTEVNRU5UIGNsYXNzSUQgPSBHZXRDbGFzc0lEKCk7DQotICAgIGlmIChjbGFzc0lEID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICBpZiAocFBhcmVudE5vZGUgJiYgcFBhcmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGlmIChjbGFzc0lEID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQotICAgICAgICBDWEZBX1dpZGdldERhdGEqIHBGaWVsZFdpZGdldERhdGEgPSB0aGlzLT5HZXRXaWRnZXREYXRhKCk7DQotICAgICAgICBpZiAocEZpZWxkV2lkZ2V0RGF0YSAmJiBwRmllbGRXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsNCi0gICAgICAgICAgICBpZiAocEZpZWxkV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgICAgICAgICBwRmllbGRXaWRnZXREYXRhLT5HZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIXdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBGaWVsZFdpZGdldERhdGE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gdGhpcy0+R2V0QmluZERhdGEoKTsNCi0gICAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcEZpZWxkV2lkZ2V0RGF0YSA9IE5VTEw7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgZm9ybU5vZGVzOw0KLSAgICAgICAgICAgIHBEYXRhTm9kZS0+R2V0QmluZEl0ZW1zKGZvcm1Ob2Rlcyk7DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9ybU5vZGVzLkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gZm9ybU5vZGVzLkdldEF0KGkpOw0KLSAgICAgICAgICAgICAgICBpZiAoIXBGb3JtTm9kZSB8fCBwRm9ybU5vZGUtPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwRmllbGRXaWRnZXREYXRhID0gcEZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCk7DQotICAgICAgICAgICAgICAgIGlmIChwRmllbGRXaWRnZXREYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICBwRmllbGRXaWRnZXREYXRhLT5HZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmICghd3NQaWN0dXJlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcEZpZWxkV2lkZ2V0RGF0YSA9IE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBwRmllbGRXaWRnZXREYXRhOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcEdyYW5kTm9kZSA9IHBQYXJlbnROb2RlID8gcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpIDogTlVMTDsNCi0gICAgQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlID0gKHBQYXJlbnROb2RlICYmIHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFsdWUpID8gcFBhcmVudE5vZGUgOiBOVUxMOw0KLSAgICBpZiAoIXBWYWx1ZU5vZGUpIHsNCi0gICAgICAgIHBWYWx1ZU5vZGUgPSAocEdyYW5kTm9kZSAmJiBwR3JhbmROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFsdWUpID8gcEdyYW5kTm9kZSA6IE5VTEw7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwUGFyZW50T2ZWYWx1ZU5vZGUgPSBwVmFsdWVOb2RlID8gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkgOiBOVUxMOw0KLSAgICByZXR1cm4gcFBhcmVudE9mVmFsdWVOb2RlID8gcFBhcmVudE9mVmFsdWVOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCkgOiBOVUxMOw0KLX0NCi1GWF9CT09MCUNYRkFfTm9kZTo6R2V0TG9jYWxlTmFtZShDRlhfV2lkZVN0cmluZyYgd3NMb2NhbGVOYW1lKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRm9ybSA9IChDWEZBX05vZGUqKUdldERvY3VtZW50KCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KLSAgICBDWEZBX05vZGUqIHBUb3BTdWJmb3JtID0gcEZvcm0tPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KLSAgICBGWFNZU19hc3NlcnQocFRvcFN1YmZvcm0pOw0KLSAgICBDWEZBX05vZGUqIHBMb2NhbGVOb2RlID0gdGhpczsNCi0gICAgRlhfQk9PTCBiTG9jYWxlID0gRkFMU0U7DQotICAgIGRvIHsNCi0gICAgICAgIGJMb2NhbGUgPSBwTG9jYWxlTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Mb2NhbGUsIHdzTG9jYWxlTmFtZSwgRkFMU0UpOw0KLSAgICAgICAgaWYgKCFiTG9jYWxlKSB7DQotICAgICAgICAgICAgcExvY2FsZU5vZGUgPSBwTG9jYWxlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKHBMb2NhbGVOb2RlICYmIHBMb2NhbGVOb2RlICE9IHBUb3BTdWJmb3JtICYmICFiTG9jYWxlKTsNCi0gICAgaWYgKGJMb2NhbGUpIHsNCi0gICAgICAgIHJldHVybiBiTG9jYWxlOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcENvbmZpZyA9IChDWEZBX05vZGUqKUdldERvY3VtZW50KCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0NvbmZpZyk7DQotICAgIHdzTG9jYWxlTmFtZSA9IEdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCktPkdldENvbmZpZ0xvY2FsZU5hbWUocENvbmZpZyk7DQotICAgIGlmICghd3NMb2NhbGVOYW1lLklzRW1wdHkoKSkgew0KLSAgICAgICAgYkxvY2FsZSA9IFRSVUU7DQotICAgIH0NCi0gICAgaWYgKGJMb2NhbGUpIHsNCi0gICAgICAgIHJldHVybiBiTG9jYWxlOw0KLSAgICB9DQotICAgIGlmIChwVG9wU3ViZm9ybSkgew0KLSAgICAgICAgYkxvY2FsZSA9IHBUb3BTdWJmb3JtLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0xvY2FsZSwgd3NMb2NhbGVOYW1lLCBGQUxTRSk7DQotICAgIH0NCi0gICAgaWYgKGJMb2NhbGUpIHsNCi0gICAgICAgIHJldHVybiBiTG9jYWxlOw0KLSAgICB9DQotICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpLT5HZXREZWZMb2NhbGUoKTsNCi0gICAgaWYgKHBMb2NhbGUpIHsNCi0gICAgICAgIHdzTG9jYWxlTmFtZSA9IHBMb2NhbGUtPkdldE5hbWUoKTsNCi0gICAgICAgIGJMb2NhbGUgPSBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBiTG9jYWxlOw0KLX0NCi1YRkFfQVRUUklCVVRFRU5VTSBDWEZBX05vZGU6OkdldEludGFjdCgpDQotew0KLSAgICBYRkFfRUxFTUVOVCBlRWxlbWVudCA9IEdldENsYXNzSUQoKTsNCi0gICAgQ1hGQV9Ob2RlKiBwS2VlcCA9IEdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0tlZXApOw0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0VHlwZSA9IEdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KLSAgICBpZiAocEtlZXApIHsNCi0gICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVJbnRhY3Q7DQotICAgICAgICBpZiAocEtlZXAtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9JbnRhY3QsIGVJbnRhY3QsIEZBTFNFKSkgew0KLSAgICAgICAgICAgIGlmKGVJbnRhY3QgPT0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZSAmJiBlTGF5b3V0VHlwZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cgJiYgIG1fcERvY3VtZW50LT5HZXRDdXJWZXJzaW9uTW9kZSgpIDwgWEZBX1ZFUlNJT05fMjA4KSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFByZXZpZXdSb3cgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KLSAgICAgICAgICAgICAgICBpZihwUHJldmlld1JvdyAmJiBwUHJldmlld1Jvdy0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm93KSB7DQotICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICBpZihwS2VlcC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1ByZXZpb3VzLCBlVmFsdWUsIEZBTFNFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVWYWx1ZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSB8fCBlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEtlZXAgPSBwUHJldmlld1Jvdy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfS2VlcCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAocEtlZXApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEtlZXAtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9OZXh0LCBlVmFsdWUsIEZBTFNFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEgfHwgZVZhbHVlID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVJbnRhY3Q7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgc3dpdGNoIChlRWxlbWVudCkgew0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KLSAgICAgICAgICAgIHN3aXRjaCAoZUxheW91dFR5cGUpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbjoNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Sb3c6DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE7DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVGI6DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVGFibGU6DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGI6DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGI6DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRmllbGQ6IHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgICAgICAgICBpZiAoIXBQYXJlbnROb2RlIHx8IHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAocFBhcmVudE5vZGUtPkdldEludGFjdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpIHsNCi0gICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVQYXJMYXlvdXQgPSBwUGFyZW50Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZVBhckxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbiB8fCBlUGFyTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdyB8fCBlUGFyTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBYRkFfVkVSU0lPTiB2ZXJzaW9uID0gbV9wRG9jdW1lbnQtPkdldEN1clZlcnNpb25Nb2RlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZVBhckxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYiAmJiB2ZXJzaW9uIDwgWEZBX1ZFUlNJT05fMjA4KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCBtZWFzdXJlSDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0gsIG1lYXN1cmVILCBGQUxTRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQotICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCi19DQotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldERhdGFEZXNjcmlwdGlvbk5vZGUoKQ0KLXsNCi0gICAgaWYobV9lUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCi0gICAgICAgIHJldHVybiBtX3BBdXhOb2RlOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2V0RGF0YURlc2NyaXB0aW9uTm9kZShDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG1fZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKTsNCi0gICAgbV9wQXV4Tm9kZSA9IHBEYXRhRGVzY3JpcHRpb25Ob2RlOw0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19SZXNvbHZlTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVzb2x2ZU5vZGUiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQXNzaWduTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImFzc2lnbk5vZGUiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIGludDMyX3QgaUFjdGlvbiA9IDA7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQogICAgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQotICAgIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQotICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KLSAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiByZWZOb2RlID0gdGhpczsNCi0gICAgaWYocmVmTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1hmYSkgew0KLSAgICAgICAgcmVmTm9kZSA9IChDWEZBX05vZGUqKXBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQotICAgIH0NCi0gICAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQotICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQotICAgIGludDMyX3QgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhyZWZOb2RlLCB3c0V4cHJlc3Npb24sIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCi0gICAgaWYgKGlSZXQgPCAxKSB7DQotICAgICAgICByZXR1cm4gRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgfQ0KLSAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gTlVMTDsNCi0gICAgaWYgKHJlc292ZU5vZGVSUy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2Rlcykgew0KLSAgICAgICAgQ1hGQV9PYmplY3QqIHBOb2RlID0gcmVzb3ZlTm9kZVJTLm5vZGVzWzBdOw0KLSAgICAgICAgaFZhbHVlID0gcFNjcmlwdENvbnRleHQtPkdldEpTVmFsdWVGcm9tTWFwKHBOb2RlKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBoVmFsdWUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gbHBBdHRyaWJ1dGVJbmZvID0gcmVzb3ZlTm9kZVJTLnBTY3JpcHRBdHRyaWJ1dGU7DQotICAgICAgICBpZiAobHBBdHRyaWJ1dGVJbmZvICYmIGxwQXR0cmlidXRlSW5mby0+ZVZhbHVlVHlwZSA9PSBYRkFfU0NSSVBUX09iamVjdCkgew0KLSAgICAgICAgICAgIGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShwU2NyaXB0Q29udGV4dC0+R2V0UnVudGltZSgpKTsNCi0gICAgICAgICAgICAocmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT4qKGxwQXR0cmlidXRlSW5mby0+bHBmbkNhbGxiYWNrKSkoaFZhbHVlLCBGQUxTRSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgaFZhbHVlKTsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9DQotICAgIH0NCisgICAgd3NFeHByZXNzaW9uID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMykgew0KKyAgICBpQWN0aW9uID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1Jlc29sdmVOb2RlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVzb2x2ZU5vZGVzIik7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0Nsb25lKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImNsb25lIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYkNsb25lID0gVFJVRTsNCisgIGJDbG9uZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDApID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICBDWEZBX05vZGUqIHBDbG9uZU5vZGUgPSB0aGlzLT5DbG9uZShiQ2xvbmUpOw0KKyAgRlhKU0VfVmFsdWVfU2V0KA0KKyAgICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocENsb25lTm9kZSkpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19HZXRBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZ2V0QXR0cmlidXRlIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICB3c0V4cHJlc3Npb24gPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgdGhpcy0+R2V0QXR0cmlidXRlKHdzRXhwcmVzc2lvbiwgd3NWYWx1ZSk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NWYWx1ZSkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19HZXRFbGVtZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAyKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZ2V0RWxlbWVudCIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICBpbnQzMl90IGlWYWx1ZSA9IDA7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQogICAgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQotICAgIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQotICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCi0gICAgaWYgKCFoVmFsdWUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcyB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCi0gICAgQ1hGQV9Ob2RlKiByZWZOb2RlID0gdGhpczsNCi0gICAgaWYocmVmTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1hmYSkgew0KLSAgICAgICAgcmVmTm9kZSA9IChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCi0gICAgfQ0KLSAgICBTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChoVmFsdWUsIHdzRXhwcmVzc2lvbiwgZHdGbGFnLCByZWZOb2RlKTsNCisgICAgd3NFeHByZXNzaW9uID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgIGlWYWx1ZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpOw0KKyAgfQ0KKyAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50SW5mbyA9IFhGQV9HZXRFbGVtZW50QnlOYW1lKHdzRXhwcmVzc2lvbik7DQorICBDWEZBX05vZGUqIHBOb2RlID0gdGhpcy0+R2V0UHJvcGVydHkoaVZhbHVlLCBwRWxlbWVudEluZm8tPmVOYW1lKTsNCisgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOb2RlKSk7DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChGWEpTRV9IVkFMVUUgaFZhbHVlLCBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24sIEZYX0RXT1JEIGR3RmxhZywgQ1hGQV9Ob2RlKiByZWZOb2RlKQ0KLXsNCi0gICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KLSAgICBpZihyZWZOb2RlID09IE5VTEwpIHsNCi0gICAgICAgIHJlZk5vZGUgPSB0aGlzOw0KLSAgICB9DQotICAgIGludDMyX3QgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhyZWZOb2RlLCB3c0V4cHJlc3Npb24sIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCi0gICAgQ1hGQV9BcnJheU5vZGVMaXN0KiBwTm9kZUxpc3QgPSBGWF9ORVcgQ1hGQV9BcnJheU5vZGVMaXN0KG1fcERvY3VtZW50KTsNCi0gICAgaWYgKHJlc292ZU5vZGVSUy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2Rlcykgew0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcmVzb3ZlTm9kZVJTLm5vZGVzLkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgaWYgKHJlc292ZU5vZGVSUy5ub2Rlc1tpXS0+SXNOb2RlKCkpIHsNCi0gICAgICAgICAgICAgICAgcE5vZGVMaXN0LT5BcHBlbmQoKENYRkFfTm9kZSopcmVzb3ZlTm9kZVJTLm5vZGVzW2ldKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0hWQUxVRUFycmF5IGhWYWx1ZUFycmF5KHBTY3JpcHRDb250ZXh0LT5HZXRSdW50aW1lKCkpOw0KLSAgICAgICAgaWYgKHJlc292ZU5vZGVSUy5HZXRBdHRyaWJ1dGVSZXN1bHQoaFZhbHVlQXJyYXkpID4gMCkgew0KLSAgICAgICAgICAgIENYRkFfT2JqQXJyYXkgb2JqZWN0QXJyYXk7DQotICAgICAgICAgICAgaFZhbHVlQXJyYXkuR2V0QXR0cmlidXRlT2JqZWN0KG9iamVjdEFycmF5KTsNCi0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBvYmplY3RBcnJheS5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0QXJyYXlbaV0tPklzTm9kZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBwTm9kZUxpc3QtPkFwcGVuZCgoQ1hGQV9Ob2RlKilvYmplY3RBcnJheVtpXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0KGhWYWx1ZSwgKENYRkFfT2JqZWN0KilwTm9kZUxpc3QsIHBTY3JpcHRDb250ZXh0LT5HZXRKc2VOb3JtYWxDbGFzcygpKTsNCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfQWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQotICAgICAgICBHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0gd3NOYW1lICsgRlhfV1NUUkMoTCJbKl0iKTsNCi0gICAgICAgIFNjcmlwdF9Tb21fUmVzb2x2ZU5vZGVMaXN0KGhWYWx1ZSwgd3NFeHByZXNzaW9uLCBkd0ZsYWcpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX05vZGVzKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KLSAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCktPkdldEFwcFByb3ZpZGVyKCk7DQotICAgICAgICBGWFNZU19hc3NlcnQocEFwcFByb3ZpZGVyKTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCi0gICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX1VuYWJsZV9UT19TRVQsIHdzTWVzc2FnZSk7DQotICAgICAgICBGWEpTRV9UaHJvd01lc3NhZ2UoRlhfQlNUUkMoIiIpLCBGWF9VVEY4RW5jb2RlKHdzTWVzc2FnZSwgd3NNZXNzYWdlLkdldExlbmd0aCgpKSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX0F0dGFjaE5vZGVMaXN0KiBwTm9kZUxpc3QgPSBGWF9ORVcgQ1hGQV9BdHRhY2hOb2RlTGlzdChtX3BEb2N1bWVudCwgdGhpcyk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QoaFZhbHVlLCAoQ1hGQV9PYmplY3QqKXBOb2RlTGlzdCwgcFNjcmlwdENvbnRleHQtPkdldEpzZU5vcm1hbENsYXNzKCkpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0NsYXNzQWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lOw0KLSAgICAgICAgdGhpcy0+R2V0Q2xhc3NOYW1lKHdzTmFtZSk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24gPSBGWF9XU1RSQyhMIiMiKSArIHdzTmFtZSArIEZYX1dTVFJDKEwiWypdIik7DQotICAgICAgICBTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChoVmFsdWUsIHdzRXhwcmVzc2lvbiwgZHdGbGFnKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19QYXJlbnQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICBpZiAocFBhcmVudCkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBQYXJlbnQpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0luZGV4KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBHZXROb2RlU2FtZU5hbWVJbmRleCgpKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19DbGFzc0luZGV4KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBHZXROb2RlU2FtZUNsYXNzSW5kZXgoKSk7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfU29tRXhwcmVzc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NPTUV4cHJlc3Npb247DQotICAgICAgICBHZXRTT01FeHByZXNzaW9uKHdzU09NRXhwcmVzc2lvbik7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1NPTUV4cHJlc3Npb24pKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19BcHBseVhTTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiYXBwbHlYU0wiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfSXNQcm9wZXJ0eVNwZWNpZmllZCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDMpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJpc1Byb3BlcnR5U3BlY2lmaWVkIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgIEZYX0JPT0wgYlBhcmVudCA9IFRSVUU7DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQogICAgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQotICAgIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0Fzc2lnbk5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDMpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiYXNzaWduTm9kZSIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCi0gICAgaW50MzJfdCBpQWN0aW9uID0gMDsNCi0gICAgaWYgKGlMZW5ndGggPj0gMSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCi0gICAgICAgIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgaWYgKGlMZW5ndGggPj0gMikgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQotICAgICAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDMpIHsNCi0gICAgICAgIGlBY3Rpb24gPSBwQXJndW1lbnRzLT5HZXRJbnQzMigyKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19DbG9uZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiY2xvbmUiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJDbG9uZSA9IFRSVUU7DQotICAgIGJDbG9uZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDApID09IDAgPyBGQUxTRSA6IFRSVUU7DQotICAgIENYRkFfTm9kZSogcENsb25lTm9kZSA9IHRoaXMtPkNsb25lKGJDbG9uZSk7DQotICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwQ2xvbmVOb2RlKSk7DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0dldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZ2V0QXR0cmlidXRlIik7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KLSAgICB3c0V4cHJlc3Npb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFeHByZXNzaW9uLCBic0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICB0aGlzLT5HZXRBdHRyaWJ1dGUod3NFeHByZXNzaW9uLCB3c1ZhbHVlKTsNCi0gICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQotICAgIGlmIChoVmFsdWUpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19HZXRFbGVtZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAyKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImdldEVsZW1lbnQiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQotICAgIGludDMyX3QgaVZhbHVlID0gMDsNCi0gICAgaWYgKGlMZW5ndGggPj0gMSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCi0gICAgICAgIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgaWYgKGlMZW5ndGggPj0gMikgew0KLSAgICAgICAgaVZhbHVlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSk7DQotICAgIH0NCisgICAgd3NFeHByZXNzaW9uID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgIGJQYXJlbnQgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMykgew0KKyAgICBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigyKTsNCisgIH0NCisgIEZYX0JPT0wgYkhhcyA9IEZBTFNFOw0KKyAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEF0dHJpYnV0ZUluZm8gPSBYRkFfR2V0QXR0cmlidXRlQnlOYW1lKHdzRXhwcmVzc2lvbik7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgaWYgKHBBdHRyaWJ1dGVJbmZvKSB7DQorICAgIGJIYXMgPSB0aGlzLT5IYXNBdHRyaWJ1dGUocEF0dHJpYnV0ZUluZm8tPmVOYW1lKTsNCisgIH0NCisgIGlmICghYkhhcykgew0KICAgICBYRkFfTFBDRUxFTUVOVElORk8gcEVsZW1lbnRJbmZvID0gWEZBX0dldEVsZW1lbnRCeU5hbWUod3NFeHByZXNzaW9uKTsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHRoaXMtPkdldFByb3BlcnR5KGlWYWx1ZSwgcEVsZW1lbnRJbmZvLT5lTmFtZSk7DQotICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTm9kZSkpOw0KKyAgICBiSGFzID0gKHRoaXMtPkdldFByb3BlcnR5KGlJbmRleCwgcEVsZW1lbnRJbmZvLT5lTmFtZSkgIT0gTlVMTCk7DQorICB9DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIGJIYXMpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Jc1Byb3BlcnR5U3BlY2lmaWVkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAzKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImlzUHJvcGVydHlTcGVjaWZpZWQiKTsNCi0gICAgICAgIHJldHVybjsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Mb2FkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAzKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwibG9hZFhNTCIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICBGWF9CT09MIGJJZ25vcmVSb290ID0gVFJVRTsNCisgIEZYX0JPT0wgYk92ZXJ3cml0ZSA9IDA7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIHdzRXhwcmVzc2lvbiA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFeHByZXNzaW9uLCBic0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkpOw0KKyAgICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkgew0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQotICAgIEZYX0JPT0wgYlBhcmVudCA9IFRSVUU7DQotICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgaWYgKGlMZW5ndGggPj0gMSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCi0gICAgICAgIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgaWYgKGlMZW5ndGggPj0gMikgew0KLSAgICAgICAgYlBhcmVudCA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpID09IDAgPyBGQUxTRSA6IFRSVUU7DQotICAgIH0NCi0gICAgaWYgKGlMZW5ndGggPj0gMykgew0KLSAgICAgICAgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMik7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiSGFzID0gRkFMU0U7DQotICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBBdHRyaWJ1dGVJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5TmFtZSh3c0V4cHJlc3Npb24pOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICBpZihwQXR0cmlidXRlSW5mbykgew0KLSAgICAgICAgYkhhcyA9IHRoaXMtPkhhc0F0dHJpYnV0ZShwQXR0cmlidXRlSW5mby0+ZU5hbWUpOw0KLSAgICB9DQotICAgIGlmICghYkhhcykgew0KLSAgICAgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50SW5mbyA9IFhGQV9HZXRFbGVtZW50QnlOYW1lKHdzRXhwcmVzc2lvbik7DQotICAgICAgICBiSGFzID0gKHRoaXMtPkdldFByb3BlcnR5KGlJbmRleCwgcEVsZW1lbnRJbmZvLT5lTmFtZSkgIT0gTlVMTCk7DQotICAgIH0NCi0gICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQotICAgIGlmIChoVmFsdWUpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiSGFzKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Mb2FkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAzKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImxvYWRYTUwiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQotICAgIEZYX0JPT0wgYklnbm9yZVJvb3QgPSBUUlVFOw0KLSAgICBGWF9CT09MIGJPdmVyd3JpdGUgPSAwOw0KLSAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KLSAgICAgICAgd3NFeHByZXNzaW9uID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCi0gICAgICAgIGlmICh3c0V4cHJlc3Npb24uSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCi0gICAgICAgIGJJZ25vcmVSb290ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCi0gICAgfQ0KLSAgICBpZiAoaUxlbmd0aCA+PSAzKSB7DQotICAgICAgICBiT3ZlcndyaXRlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMikgPT0gMCA/IEZBTFNFIDogVFJVRTsNCi0gICAgfQ0KLSAgICBJWEZBX1BhcnNlciogcFBhcnNlciA9IElYRkFfUGFyc2VyOjpDcmVhdGUobV9wRG9jdW1lbnQpOw0KLSAgICBpZiAoIXBQYXJzZXIpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gTlVMTDsNCi0gICAgaW50MzJfdCBpUGFyc2VyU3RhdHVzID0gcFBhcnNlci0+UGFyc2VYTUxEYXRhKHdzRXhwcmVzc2lvbiwgcFhNTE5vZGUsIE5VTEwpOw0KLSAgICBpZiAoaVBhcnNlclN0YXR1cyAhPSBYRkFfUEFSU0VTVEFUVVNfRG9uZSB8fCAhcFhNTE5vZGUpIHsNCi0gICAgICAgIHBQYXJzZXItPlJlbGVhc2UoKTsNCi0gICAgICAgIHBQYXJzZXIgPSBOVUxMOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChiSWdub3JlUm9vdCAmJiAocFhNTE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50IHx8IFhGQV9SZWNvZ25pemVSaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZSkpKSB7DQotICAgICAgICBiSWdub3JlUm9vdCA9IEZBTFNFOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcEZha2VSb290ID0gdGhpcy0+Q2xvbmUoRkFMU0UpOw0KLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb250ZW50VHlwZSA9IHRoaXMtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUpOw0KLSAgICBpZiAoIXdzQ29udGVudFR5cGUuSXNFbXB0eSgpKSB7DQotICAgICAgICBwRmFrZVJvb3QtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KLSAgICB9DQotICAgIElGREVfWE1MTm9kZSogcEZha2VYTUxSb290ID0gcEZha2VSb290LT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICBpZiAoIXBGYWtlWE1MUm9vdCkgew0KLSAgICAgICAgSUZERV9YTUxOb2RlKiBwVGhpc1hNTFJvb3QgPSB0aGlzLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICAgICAgcEZha2VYTUxSb290ID0gcFRoaXNYTUxSb290ID8gcFRoaXNYTUxSb290LT5DbG9uZShGQUxTRSkgOiBOVUxMOw0KLSAgICB9DQotICAgIGlmICghcEZha2VYTUxSb290KSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDbGFzc05hbWU7DQotICAgICAgICB0aGlzLT5HZXRDbGFzc05hbWUod3NDbGFzc05hbWUpOw0KLSAgICAgICAgcEZha2VYTUxSb290ID0gSUZERV9YTUxFbGVtZW50OjpDcmVhdGUod3NDbGFzc05hbWUpOw0KLSAgICB9DQotICAgIGlmIChiSWdub3JlUm9vdCkgew0KLSAgICAgICAgSUZERV9YTUxOb2RlICpwWE1MQ2hpbGQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCi0gICAgICAgIHdoaWxlIChwWE1MQ2hpbGQpIHsNCi0gICAgICAgICAgICBJRkRFX1hNTE5vZGUgKiBwWE1MU2libGluZyA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZyk7DQotICAgICAgICAgICAgcFhNTE5vZGUtPlJlbW92ZUNoaWxkTm9kZShwWE1MQ2hpbGQpOw0KLSAgICAgICAgICAgIHBGYWtlWE1MUm9vdC0+SW5zZXJ0Q2hpbGROb2RlKHBYTUxDaGlsZCk7DQotICAgICAgICAgICAgcFhNTENoaWxkID0gcFhNTFNpYmxpbmc7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBJRkRFX1hNTE5vZGUgKnBYTUxQYXJlbnQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpOw0KLSAgICAgICAgaWYgKHBYTUxQYXJlbnQpIHsNCi0gICAgICAgICAgICBwWE1MUGFyZW50LT5SZW1vdmVDaGlsZE5vZGUocFhNTE5vZGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcEZha2VYTUxSb290LT5JbnNlcnRDaGlsZE5vZGUocFhNTE5vZGUpOw0KLSAgICB9DQotICAgIHBQYXJzZXItPkNvbnN0cnVjdFhGQU5vZGUocEZha2VSb290LCBwRmFrZVhNTFJvb3QpOw0KLSAgICBwRmFrZVJvb3QgPSBwUGFyc2VyLT5HZXRSb290Tm9kZSgpOw0KLSAgICBpZiAocEZha2VSb290KSB7DQotICAgICAgICBpZiAoYk92ZXJ3cml0ZSkgew0KLSAgICAgICAgICAgIENYRkFfTm9kZSAqcENoaWxkID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcE5ld0NoaWxkID0gcEZha2VSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICAgICAgaW50MzJfdCBpbmRleCA9IDA7DQotICAgICAgICAgICAgd2hpbGUgKHBOZXdDaGlsZCkgew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBJdGVtID0gcE5ld0NoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgICAgICBwRmFrZVJvb3QtPlJlbW92ZUNoaWxkKHBOZXdDaGlsZCk7DQotICAgICAgICAgICAgICAgIHRoaXMtPkluc2VydENoaWxkKGluZGV4KyssIHBOZXdDaGlsZCk7DQotICAgICAgICAgICAgICAgIHBOZXdDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KLSAgICAgICAgICAgICAgICBwTmV3Q2hpbGQgPSBwSXRlbTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd2hpbGUgKHBDaGlsZCkgew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBJdGVtID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgICAgICB0aGlzLT5SZW1vdmVDaGlsZChwQ2hpbGQpOw0KLSAgICAgICAgICAgICAgICBwRmFrZVJvb3QtPkluc2VydENoaWxkKHBDaGlsZCk7DQotICAgICAgICAgICAgICAgIHBDaGlsZCA9IHBJdGVtOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0gJiYgR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KLSAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBUZW1wWE1MTm9kZSA9IHRoaXMtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQotICAgICAgICAgICAgICAgIHRoaXMtPlNldFhNTE1hcHBpbmdOb2RlKHBGYWtlWE1MUm9vdCk7DQotICAgICAgICAgICAgICAgIHRoaXMtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBUZW1wWE1MTm9kZSAmJiBwVGVtcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KSA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICBwRmFrZVhNTFJvb3QgPSBwVGVtcFhNTE5vZGU7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBwRmFrZVhNTFJvb3QgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIE1vdmVCdWZmZXJNYXBEYXRhKHBGYWtlUm9vdCwgdGhpcywgWEZBX0NhbGNEYXRhLCBUUlVFKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwRmFrZVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgICAgICAgICB3aGlsZSAocENoaWxkKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcEl0ZW0gPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgICAgICAgICAgICAgIHBGYWtlUm9vdC0+UmVtb3ZlQ2hpbGQocENoaWxkKTsNCi0gICAgICAgICAgICAgICAgdGhpcy0+SW5zZXJ0Q2hpbGQocENoaWxkKTsNCi0gICAgICAgICAgICAgICAgcENoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQotICAgICAgICAgICAgICAgIHBDaGlsZCA9IHBJdGVtOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwRmFrZVhNTFJvb3QpIHsNCi0gICAgICAgICAgICBwRmFrZVJvb3QtPlNldFhNTE1hcHBpbmdOb2RlKHBGYWtlWE1MUm9vdCk7DQotICAgICAgICAgICAgcEZha2VSb290LT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBUUlVFLCBGQUxTRSk7DQotICAgICAgICB9DQotICAgICAgICBwRmFrZVJvb3QtPlNldEZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQsIFRSVUUsIEZBTFNFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChwRmFrZVhNTFJvb3QpIHsNCi0gICAgICAgICAgICBwRmFrZVhNTFJvb3QtPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICBwRmFrZVhNTFJvb3QgPSBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgIGJJZ25vcmVSb290ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgYk92ZXJ3cml0ZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICB9DQorICBJWEZBX1BhcnNlciogcFBhcnNlciA9IElYRkFfUGFyc2VyOjpDcmVhdGUobV9wRG9jdW1lbnQpOw0KKyAgaWYgKCFwUGFyc2VyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBOVUxMOw0KKyAgaW50MzJfdCBpUGFyc2VyU3RhdHVzID0gcFBhcnNlci0+UGFyc2VYTUxEYXRhKHdzRXhwcmVzc2lvbiwgcFhNTE5vZGUsIE5VTEwpOw0KKyAgaWYgKGlQYXJzZXJTdGF0dXMgIT0gWEZBX1BBUlNFU1RBVFVTX0RvbmUgfHwgIXBYTUxOb2RlKSB7DQogICAgIHBQYXJzZXItPlJlbGVhc2UoKTsNCiAgICAgcFBhcnNlciA9IE5VTEw7DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NhdmVGaWx0ZXJlZFhNTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZVhNTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMSkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJzYXZlWE1MIik7DQotICAgICAgICByZXR1cm47DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiSWdub3JlUm9vdCAmJiAocFhNTE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50IHx8DQorICAgICAgICAgICAgICAgICAgICAgIFhGQV9SZWNvZ25pemVSaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZSkpKSB7DQorICAgIGJJZ25vcmVSb290ID0gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBGYWtlUm9vdCA9IHRoaXMtPkNsb25lKEZBTFNFKTsNCisgIENGWF9XaWRlU3RyaW5nQyB3c0NvbnRlbnRUeXBlID0gdGhpcy0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSk7DQorICBpZiAoIXdzQ29udGVudFR5cGUuSXNFbXB0eSgpKSB7DQorICAgIHBGYWtlUm9vdC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQorICB9DQorICBJRkRFX1hNTE5vZGUqIHBGYWtlWE1MUm9vdCA9IHBGYWtlUm9vdC0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgIGlmICghcEZha2VYTUxSb290KSB7DQorICAgIElGREVfWE1MTm9kZSogcFRoaXNYTUxSb290ID0gdGhpcy0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgcEZha2VYTUxSb290ID0gcFRoaXNYTUxSb290ID8gcFRoaXNYTUxSb290LT5DbG9uZShGQUxTRSkgOiBOVUxMOw0KKyAgfQ0KKyAgaWYgKCFwRmFrZVhNTFJvb3QpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ2xhc3NOYW1lOw0KKyAgICB0aGlzLT5HZXRDbGFzc05hbWUod3NDbGFzc05hbWUpOw0KKyAgICBwRmFrZVhNTFJvb3QgPSBJRkRFX1hNTEVsZW1lbnQ6OkNyZWF0ZSh3c0NsYXNzTmFtZSk7DQorICB9DQorICBpZiAoYklnbm9yZVJvb3QpIHsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MQ2hpbGQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgd2hpbGUgKHBYTUxDaGlsZCkgew0KKyAgICAgIElGREVfWE1MTm9kZSogcFhNTFNpYmxpbmcgPQ0KKyAgICAgICAgICBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpOw0KKyAgICAgIHBYTUxOb2RlLT5SZW1vdmVDaGlsZE5vZGUocFhNTENoaWxkKTsNCisgICAgICBwRmFrZVhNTFJvb3QtPkluc2VydENoaWxkTm9kZShwWE1MQ2hpbGQpOw0KKyAgICAgIHBYTUxDaGlsZCA9IHBYTUxTaWJsaW5nOw0KICAgICB9DQotICAgIEZYX0JPT0wgYlByZXR0eU1vZGUgPSBGQUxTRTsNCi0gICAgaWYgKGlMZW5ndGggPT0gMSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNQcmV0dHkgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KLSAgICAgICAgaWYgKGJzUHJldHR5LkVxdWFsKEZYX0JTVFJDKCJwcmV0dHkiKSkpIHsNCi0gICAgICAgICAgICBiUHJldHR5TW9kZSA9IFRSVUU7DQorICB9IGVsc2Ugew0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxQYXJlbnQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpOw0KKyAgICBpZiAocFhNTFBhcmVudCkgew0KKyAgICAgIHBYTUxQYXJlbnQtPlJlbW92ZUNoaWxkTm9kZShwWE1MTm9kZSk7DQorICAgIH0NCisgICAgcEZha2VYTUxSb290LT5JbnNlcnRDaGlsZE5vZGUocFhNTE5vZGUpOw0KKyAgfQ0KKyAgcFBhcnNlci0+Q29uc3RydWN0WEZBTm9kZShwRmFrZVJvb3QsIHBGYWtlWE1MUm9vdCk7DQorICBwRmFrZVJvb3QgPSBwUGFyc2VyLT5HZXRSb290Tm9kZSgpOw0KKyAgaWYgKHBGYWtlUm9vdCkgew0KKyAgICBpZiAoYk92ZXJ3cml0ZSkgew0KKyAgICAgIENYRkFfTm9kZSogcENoaWxkID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgIENYRkFfTm9kZSogcE5ld0NoaWxkID0gcEZha2VSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgICAgd2hpbGUgKHBOZXdDaGlsZCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IHBOZXdDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgIHBGYWtlUm9vdC0+UmVtb3ZlQ2hpbGQocE5ld0NoaWxkKTsNCisgICAgICAgIHRoaXMtPkluc2VydENoaWxkKGluZGV4KyssIHBOZXdDaGlsZCk7DQorICAgICAgICBwTmV3Q2hpbGQtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgICAgIHBOZXdDaGlsZCA9IHBJdGVtOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBJdGVtID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgdGhpcy0+UmVtb3ZlQ2hpbGQocENoaWxkKTsNCisgICAgICAgIHBGYWtlUm9vdC0+SW5zZXJ0Q2hpbGQocENoaWxkKTsNCisgICAgICAgIHBDaGlsZCA9IHBJdGVtOw0KKyAgICAgIH0NCisgICAgICBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0gJiYNCisgICAgICAgICAgR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICAgICAgSUZERV9YTUxOb2RlKiBwVGVtcFhNTE5vZGUgPSB0aGlzLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgdGhpcy0+U2V0WE1MTWFwcGluZ05vZGUocEZha2VYTUxSb290KTsNCisgICAgICAgIHRoaXMtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgIGlmIChwVGVtcFhNTE5vZGUgJiYNCisgICAgICAgICAgICBwVGVtcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KSA9PSBOVUxMKSB7DQorICAgICAgICAgIHBGYWtlWE1MUm9vdCA9IHBUZW1wWE1MTm9kZTsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQotICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICBwRmFrZVhNTFJvb3QgPSBOVUxMOw0KICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBNb3ZlQnVmZmVyTWFwRGF0YShwRmFrZVJvb3QsIHRoaXMsIFhGQV9DYWxjRGF0YSwgVFJVRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwRmFrZVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBJdGVtID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgcEZha2VSb290LT5SZW1vdmVDaGlsZChwQ2hpbGQpOw0KKyAgICAgICAgdGhpcy0+SW5zZXJ0Q2hpbGQocENoaWxkKTsNCisgICAgICAgIHBDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgcENoaWxkID0gcEl0ZW07DQorICAgICAgfQ0KICAgICB9DQotICAgIENGWF9CeXRlU3RyaW5nQyBic1hNTEhlYWRlciA9IEZYX0JTVFJDKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpOw0KLSAgICBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCi0gICAgICAgIElGWF9NZW1vcnlTdHJlYW0qIHBNZW1vcnlTdHJlYW0gPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oVFJVRSk7DQotICAgICAgICBpZiAoIXBNZW1vcnlTdHJlYW0pIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIGJzWE1MSGVhZGVyKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBJRlhfU3RyZWFtICpwU3RyZWFtID0gSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKChJRlhfRmlsZVdyaXRlKilwTWVtb3J5U3RyZWFtLCBGWF9TVFJFQU1BQ0NFU1NfVGV4dCB8IEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSB8IEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpOw0KLSAgICAgICAgaWYgKCFwU3RyZWFtKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBic1hNTEhlYWRlcik7DQotICAgICAgICAgICAgcE1lbW9yeVN0cmVhbS0+UmVsZWFzZSgpOw0KLSAgICAgICAgICAgIHBNZW1vcnlTdHJlYW0gPSBOVUxMOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCisgICAgaWYgKHBGYWtlWE1MUm9vdCkgew0KKyAgICAgIHBGYWtlUm9vdC0+U2V0WE1MTWFwcGluZ05vZGUocEZha2VYTUxSb290KTsNCisgICAgICBwRmFrZVJvb3QtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCisgICAgfQ0KKyAgICBwRmFrZVJvb3QtPlNldEZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQsIFRSVUUsIEZBTFNFKTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChwRmFrZVhNTFJvb3QpIHsNCisgICAgICBwRmFrZVhNTFJvb3QtPlJlbGVhc2UoKTsNCisgICAgICBwRmFrZVhNTFJvb3QgPSBOVUxMOw0KKyAgICB9DQorICB9DQorICBwUGFyc2VyLT5SZWxlYXNlKCk7DQorICBwUGFyc2VyID0gTlVMTDsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZUZpbHRlcmVkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZVhNTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInNhdmVYTUwiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUHJldHR5TW9kZSA9IEZBTFNFOw0KKyAgaWYgKGlMZW5ndGggPT0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1ByZXR0eSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIGlmIChic1ByZXR0eS5FcXVhbChGWF9CU1RSQygicHJldHR5IikpKSB7DQorICAgICAgYlByZXR0eU1vZGUgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmdDIGJzWE1MSGVhZGVyID0NCisgICAgICBGWF9CU1RSQygiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKTsNCisgIGlmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRm9ybSkgew0KKyAgICBJRlhfTWVtb3J5U3RyZWFtKiBwTWVtb3J5U3RyZWFtID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKFRSVUUpOw0KKyAgICBpZiAoIXBNZW1vcnlTdHJlYW0pIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIGJzWE1MSGVhZGVyKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSUZYX1N0cmVhbSogcFN0cmVhbSA9IElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbSgNCisgICAgICAgIChJRlhfRmlsZVdyaXRlKilwTWVtb3J5U3RyZWFtLA0KKyAgICAgICAgRlhfU1RSRUFNQUNDRVNTX1RleHQgfCBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUgfCBGWF9TVFJFQU1BQ0NFU1NfQXBwZW5kKTsNCisgICAgaWYgKCFwU3RyZWFtKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBic1hNTEhlYWRlcik7DQorICAgICAgcE1lbW9yeVN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICAgIHBNZW1vcnlTdHJlYW0gPSBOVUxMOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwU3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsNCisgICAgcFN0cmVhbS0+V3JpdGVEYXRhKGJzWE1MSGVhZGVyLkdldFB0cigpLCBic1hNTEhlYWRlci5HZXRMZW5ndGgoKSk7DQorICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlKHRoaXMsIHBTdHJlYW0sIE5VTEwsIFRSVUUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKA0KKyAgICAgICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgIENGWF9CeXRlU3RyaW5nQyhwTWVtb3J5U3RyZWFtLT5HZXRCdWZmZXIoKSwgcE1lbW9yeVN0cmVhbS0+R2V0U2l6ZSgpKSk7DQorICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgcFN0cmVhbSA9IE5VTEw7DQorICAgIGlmIChwTWVtb3J5U3RyZWFtKSB7DQorICAgICAgcE1lbW9yeVN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICAgIHBNZW1vcnlTdHJlYW0gPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybjsNCisgIH0gZWxzZSBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQorICAgIElGREVfWE1MTm9kZSogcEVsZW1lbnQgPSB0aGlzLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBpZiAoIXBFbGVtZW50IHx8IHBFbGVtZW50LT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgYnNYTUxIZWFkZXIpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfRGF0YUV4cG9ydGVyX0RlYWxXaXRoRGF0YUdyb3VwTm9kZSh0aGlzKTsNCisgICAgSUZYX01lbW9yeVN0cmVhbSogcE1lbW9yeVN0cmVhbSA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShUUlVFKTsNCisgICAgaWYgKCFwTWVtb3J5U3RyZWFtKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBic1hNTEhlYWRlcik7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChwTWVtb3J5U3RyZWFtKSB7DQorICAgICAgSUZYX1N0cmVhbSogcFN0cmVhbSA9IElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbSgNCisgICAgICAgICAgKElGWF9GaWxlV3JpdGUqKXBNZW1vcnlTdHJlYW0sIEZYX1NUUkVBTUFDQ0VTU19UZXh0IHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpOw0KKyAgICAgIGlmIChwU3RyZWFtKSB7DQogICAgICAgICBwU3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsNCiAgICAgICAgIHBTdHJlYW0tPldyaXRlRGF0YShic1hNTEhlYWRlci5HZXRQdHIoKSwgYnNYTUxIZWFkZXIuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGUodGhpcywgcFN0cmVhbSwgTlVMTCwgVFJVRSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIENGWF9CeXRlU3RyaW5nQyhwTWVtb3J5U3RyZWFtLT5HZXRCdWZmZXIoKSwgcE1lbW9yeVN0cmVhbS0+R2V0U2l6ZSgpKSk7DQorICAgICAgICBwRWxlbWVudC0+U2F2ZVhNTE5vZGUocFN0cmVhbSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyhwTWVtb3J5U3RyZWFtLT5HZXRCdWZmZXIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlTdHJlYW0tPkdldFNpemUoKSkpOw0KICAgICAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOw0KICAgICAgICAgcFN0cmVhbSA9IE5VTEw7DQotICAgICAgICBpZiAocE1lbW9yeVN0cmVhbSkgew0KLSAgICAgICAgICAgIHBNZW1vcnlTdHJlYW0tPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICBwTWVtb3J5U3RyZWFtID0gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybjsNCi0gICAgfSBlbHNlIGlmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCi0gICAgICAgIElGREVfWE1MTm9kZSogcEVsZW1lbnQgPSB0aGlzLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICAgICAgaWYoIXBFbGVtZW50IHx8IHBFbGVtZW50LT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgYnNYTUxIZWFkZXIpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfRGVhbFdpdGhEYXRhR3JvdXBOb2RlKHRoaXMpOw0KLSAgICAgICAgSUZYX01lbW9yeVN0cmVhbSogcE1lbW9yeVN0cmVhbSA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShUUlVFKTsNCi0gICAgICAgIGlmICghcE1lbW9yeVN0cmVhbSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgYnNYTUxIZWFkZXIpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwTWVtb3J5U3RyZWFtKSB7DQotICAgICAgICAgICAgSUZYX1N0cmVhbSAqcFN0cmVhbSA9IElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbSgoSUZYX0ZpbGVXcml0ZSopcE1lbW9yeVN0cmVhbSwgRlhfU1RSRUFNQUNDRVNTX1RleHQgfCBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUgfCBGWF9TVFJFQU1BQ0NFU1NfQXBwZW5kKTsNCi0gICAgICAgICAgICBpZiAocFN0cmVhbSkgew0KLSAgICAgICAgICAgICAgICBwU3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsNCi0gICAgICAgICAgICAgICAgcFN0cmVhbS0+V3JpdGVEYXRhKGJzWE1MSGVhZGVyLkdldFB0cigpLCBic1hNTEhlYWRlci5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgIHBFbGVtZW50LT5TYXZlWE1MTm9kZShwU3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBDRlhfQnl0ZVN0cmluZ0MocE1lbW9yeVN0cmVhbS0+R2V0QnVmZmVyKCksIHBNZW1vcnlTdHJlYW0tPkdldFNpemUoKSkpOw0KLSAgICAgICAgICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgICAgIHBTdHJlYW0gPSBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocE1lbW9yeVN0cmVhbSkgew0KLSAgICAgICAgICAgICAgICBwTWVtb3J5U3RyZWFtLT5SZWxlYXNlKCk7DQotICAgICAgICAgICAgICAgIHBNZW1vcnlTdHJlYW0gPSBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCIiKSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwTWVtb3J5U3RyZWFtKSB7DQorICAgICAgICBwTWVtb3J5U3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgICBwTWVtb3J5U3RyZWFtID0gTlVMTDsNCisgICAgICB9DQorICAgICAgcmV0dXJuOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCIiKSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoICE9IDIpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwic2V0QXR0cmlidXRlIik7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyaWJ1dGU7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmlidXRlVmFsdWU7DQotICAgIENGWF9CeXRlU3RyaW5nIGJzQXR0cmlidXRlVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KLSAgICBDRlhfQnl0ZVN0cmluZyBic0F0dHJpYnV0ZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQotICAgIHdzQXR0cmlidXRlVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNBdHRyaWJ1dGVWYWx1ZSwgYnNBdHRyaWJ1dGVWYWx1ZS5HZXRMZW5ndGgoKSk7DQotICAgIHdzQXR0cmlidXRlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQXR0cmlidXRlLCBic0F0dHJpYnV0ZS5HZXRMZW5ndGgoKSk7DQotICAgIHRoaXMtPlNldEF0dHJpYnV0ZSh3c0F0dHJpYnV0ZSwgd3NBdHRyaWJ1dGVWYWx1ZSwgVFJVRSk7DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMikgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInNldEF0dHJpYnV0ZSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJpYnV0ZTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmlidXRlVmFsdWU7DQorICBDRlhfQnl0ZVN0cmluZyBic0F0dHJpYnV0ZVZhbHVlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgIENGWF9CeXRlU3RyaW5nIGJzQXR0cmlidXRlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCisgIHdzQXR0cmlidXRlVmFsdWUgPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0F0dHJpYnV0ZVZhbHVlLCBic0F0dHJpYnV0ZVZhbHVlLkdldExlbmd0aCgpKTsNCisgIHdzQXR0cmlidXRlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQXR0cmlidXRlLCBic0F0dHJpYnV0ZS5HZXRMZW5ndGgoKSk7DQorICB0aGlzLT5TZXRBdHRyaWJ1dGUod3NBdHRyaWJ1dGUsIHdzQXR0cmlidXRlVmFsdWUsIFRSVUUpOw0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19TZXRFbGVtZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggIT0gMSAmJiBpTGVuZ3RoICE9IDIpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwic2V0RWxlbWVudCIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQotICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCi0gICAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQotICAgICAgICB3c05hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lLCBic05hbWUuR2V0TGVuZ3RoKCkpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2V0RWxlbWVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDEgJiYgaUxlbmd0aCAhPSAyKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwic2V0RWxlbWVudCIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQorICAgIHdzTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWUsIGJzTmFtZS5HZXRMZW5ndGgoKSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX05zKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZVNwYWNlOw0KLSAgICAgICAgdGhpcy0+VHJ5TmFtZXNwYWNlKHdzTmFtZVNwYWNlKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzTmFtZVNwYWNlKSk7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTW9kZWwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAodGhpcy0+R2V0TW9kZWxOb2RlKCkpKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Jc0NvbnRhaW5lcihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgdGhpcy0+SXNDb250YWluZXJOb2RlKCkpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0lzTnVsbChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAodGhpcy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgRkFMU0UpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHN0clZhbHVlOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsICFUcnlDb250ZW50KHN0clZhbHVlKSB8fCBzdHJWYWx1ZS5Jc0VtcHR5KCkpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX09uZU9mQ2hpbGQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgcHJvcGVydHM7DQotICAgICAgICBpbnQzMl90IGlTaXplID0gdGhpcy0+R2V0Tm9kZUxpc3QocHJvcGVydHMsIFhGQV9OT0RFRklMVEVSX09uZU9mUHJvcGVydHkpOw0KLSAgICAgICAgaWYgKGlTaXplID4gMCkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHByb3BlcnRzWzBdKSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIENYRkFfQXJyYXlOb2RlTGlzdCogcEZvcm1Ob2RlcyA9IEZYX05FVyBDWEZBX0FycmF5Tm9kZUxpc3QobV9wRG9jdW1lbnQpOw0KLSAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgKENYRkFfT2JqZWN0KilwRm9ybU5vZGVzLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKc2VOb3JtYWxDbGFzcygpKTsNCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NsZWFyRXJyb3JMaXN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfQ3JlYXRlTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgU2NyaXB0X1RlbXBsYXRlX0NyZWF0ZU5vZGUocEFyZ3VtZW50cyk7DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19Jc0NvbXBhdGlibGVOUyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoIDwgMSkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJpc0NvbXBhdGlibGVOUyIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTnMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9IGVsc2Ugew0KICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWVTcGFjZTsNCi0gICAgaWYgKGlMZW5ndGggPj0gMSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lU3BhY2UgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KLSAgICAgICAgd3NOYW1lU3BhY2UgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lU3BhY2UsIGJzTmFtZVNwYWNlLkdldExlbmd0aCgpKTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c05vZGVOYW1lU3BhY2U7DQotICAgIHRoaXMtPlRyeU5hbWVzcGFjZSh3c05vZGVOYW1lU3BhY2UpOw0KLSAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCi0gICAgaWYgKGhWYWx1ZSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIHdzTm9kZU5hbWVTcGFjZS5FcXVhbCh3c05hbWVTcGFjZSkpOw0KLSAgICB9DQorICAgIHRoaXMtPlRyeU5hbWVzcGFjZSh3c05hbWVTcGFjZSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzTmFtZVNwYWNlKSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19Db250ZXh0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTW9kZWwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPkdldE1vZGVsTm9kZSgpKSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19BbGlhc05vZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Jc0NvbnRhaW5lcihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCB0aGlzLT5Jc0NvbnRhaW5lck5vZGUoKSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0ludGVnZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBTZXRJbnRlZ2VyKGVBdHRyaWJ1dGUsIEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihoVmFsdWUpLCBUUlVFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBHZXRJbnRlZ2VyKGVBdHRyaWJ1dGUpKTsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Jc051bGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0gZWxzZSB7DQorICAgIGlmICh0aGlzLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBGQUxTRSk7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHN0clZhbHVlOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgIVRyeUNvbnRlbnQoc3RyVmFsdWUpIHx8IHN0clZhbHVlLklzRW1wdHkoKSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0ludGVnZXJSZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmICghYlNldHRpbmcpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBHZXRJbnRlZ2VyKGVBdHRyaWJ1dGUpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfT25lT2ZDaGlsZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX05vZGVBcnJheSBwcm9wZXJ0czsNCisgICAgaW50MzJfdCBpU2l6ZSA9IHRoaXMtPkdldE5vZGVMaXN0KHByb3BlcnRzLCBYRkFfTk9ERUZJTFRFUl9PbmVPZlByb3BlcnR5KTsNCisgICAgaWYgKGlTaXplID4gMCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldCgNCisgICAgICAgICAgaFZhbHVlLA0KKyAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwcm9wZXJ0c1swXSkpOw0KICAgICB9DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0woRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBTZXRCb29sZWFuKGVBdHRyaWJ1dGUsIEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihoVmFsdWUpLCBUUlVFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBHZXRCb29sZWFuKGVBdHRyaWJ1dGUpID8gRlhfQlNUUkMoIjEiKSA6IEZYX0JTVFJDKCIwIikpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQ29udGFpbmVyQ2xhc3NfR2V0RGVsdGFzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIENYRkFfQXJyYXlOb2RlTGlzdCogcEZvcm1Ob2RlcyA9IEZYX05FVyBDWEZBX0FycmF5Tm9kZUxpc3QobV9wRG9jdW1lbnQpOw0KKyAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIChDWEZBX09iamVjdCopcEZvcm1Ob2RlcywNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKc2VOb3JtYWxDbGFzcygpKTsNCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTFJlYWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKCFiU2V0dGluZykgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEdldEJvb2xlYW4oZUF0dHJpYnV0ZSkgPyBGWF9CU1RSQygiMSIpIDogRlhfQlNUUkMoIjAiKSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NsZWFyRXJyb3JMaXN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU2VuZEF0dHJpYnV0ZUNoYW5nZU1lc3NhZ2Uodm9pZCogZUF0dHJpYnV0ZSwgdm9pZCogZVZhbHVlLCBGWF9CT09MIGJTY3JpcHRNb2RpZnkpDQotew0KLSAgICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCi0gICAgaWYgKCFwTGF5b3V0UHJvKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBkd1BhY2tldCA9IHRoaXMtPkdldFBhY2tldElEKCk7DQotICAgIGlmIChkd1BhY2tldCAmIFhGQV9YRFBQQUNLRVRfRm9ybSkgew0KLSAgICAgICAgRlhfQk9PTCBiTmVlZEZpbmRDb250YWluZXIgPSBGQUxTRTsNCi0gICAgICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gdGhpcy0+R2V0Q2xhc3NJRCgpOw0KLSAgICAgICAgc3dpdGNoIChlVHlwZSkgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2FwdGlvbjoNCi0gICAgICAgICAgICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsIGVWYWx1ZSwgdGhpcywgdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ZvbnQ6DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYXJhOiB7DQotICAgICAgICAgICAgICAgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQ2FwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLCBlVmFsdWUsIHBQYXJlbnROb2RlLCBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCB0aGlzLCBwUGFyZW50Tm9kZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9NYXJnaW46IHsNCi0gICAgICAgICAgICAgICAgICAgIGJOZWVkRmluZENvbnRhaW5lciA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlUGFyZW50VHlwZSA9IHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFBhcmVudE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsIGVWYWx1ZSwgdGhpcywgcFBhcmVudE5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlUGFyZW50VHlwZSA9PSBYRkFfRUxFTUVOVF9DYXB0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsIGVWYWx1ZSwgcFBhcmVudE5vZGUsIHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVWkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsIGVWYWx1ZSwgcE5vZGUsIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ29tYjogew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRWRpdE5vZGUgPSB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSBwRWRpdE5vZGUtPkdldENsYXNzSUQoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwRWRpdE5vZGUgJiYgKGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0IHx8IGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQgfHwgZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9UZXh0RWRpdCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBVSU5vZGUgPSBwRWRpdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVUlOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLCBlVmFsdWUsIHBVSU5vZGUsIHBVSU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CdXR0b246DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CYXJjb2RlOg0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDoNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdDoNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0Og0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0Og0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dEVkaXQ6IHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBVSU5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCBwVUlOb2RlLCBwVUlOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjogew0KLSAgICAgICAgICAgICAgICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBVSU5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCBwVUlOb2RlLCBwVUlOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9LZWVwOg0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQm9va2VuZDoNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrOg0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWtBZnRlcjoNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlOg0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfT3ZlcmZsb3c6DQotICAgICAgICAgICAgICAgIGJOZWVkRmluZENvbnRhaW5lciA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJlYToNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9GaWVsZDoNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0Og0KLSAgICAgICAgICAgICAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKHRoaXMpOw0KLSAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCB0aGlzLCB0aGlzKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TaGFycHRleHQ6DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TaGFycHhtbDoNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1NoYXJweEhUTUw6IHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRleHROb2RlID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBUZXh0Tm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFZhbHVlTm9kZSA9IHBUZXh0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBWYWx1ZU5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBWYWx1ZU5vZGUtPkdldENsYXNzSUQoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9WYWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZWVkRmluZENvbnRhaW5lciA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBWYWx1ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwTm9kZSAmJiBwTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJTY3JpcHRNb2RpZnkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZU5vZGUgPSBwTm9kZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCBwVmFsdWVOb2RlLCBwTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsIGVWYWx1ZSwgcE5vZGUsIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBWYWx1ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE5vZGUgJiYgcE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCBwVmFsdWVOb2RlLCBwTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYk5lZWRGaW5kQ29udGFpbmVyKSB7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gdGhpczsNCi0gICAgICAgICAgICB3aGlsZSAocFBhcmVudCkgew0KLSAgICAgICAgICAgICAgICBpZiAocFBhcmVudC0+SXNDb250YWluZXJOb2RlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHBQYXJlbnQpIHsNCi0gICAgICAgICAgICAgICAgcExheW91dFByby0+QWRkQ2hhbmdlZENvbnRhaW5lcihwUGFyZW50KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLCB0aGlzLCB0aGlzKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19DcmVhdGVOb2RlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9UZW1wbGF0ZV9DcmVhdGVOb2RlKHBBcmd1bWVudHMpOw0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzelZhbHVlOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgc3pWYWx1ZSk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VmFsdWUsIHN6VmFsdWUuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgU2V0QXR0cmlidXRlKGVBdHRyaWJ1dGUsIHdzVmFsdWUsIFRSVUUpOw0KLSAgICAgICAgaWYoZUF0dHJpYnV0ZSA9PSBYRkFfQVRUUklCVVRFX1VzZSAmJiB0aGlzLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGVzYykgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVXNlVmFsID0gd3NWYWx1ZSwgd3NJRCwgd3NTT007DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlID0gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1RlbXBsYXRlKTsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBQcm90b1Jvb3QgPSBwVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9TdWJmb3JtKS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfUHJvdG8pOw0KLSAgICAgICAgICAgIGlmKCF3c1VzZVZhbC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgaWYod3NVc2VWYWxbMF0gPT0gJyMnKSB7DQotICAgICAgICAgICAgICAgICAgICB3c0lEID0gQ0ZYX1dpZGVTdHJpbmcoKGNvbnN0IEZYX1dDSEFSKil3c1VzZVZhbCArIDEsIHdzVXNlVmFsLkdldExlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB3c1NPTSA9IENGWF9XaWRlU3RyaW5nKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwsIHdzVXNlVmFsLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBQcm90b05vZGUgPSBOVUxMOw0KLSAgICAgICAgICAgIGlmKCF3c1NPTS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQotICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaVJldCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPlJlc29sdmVPYmplY3RzKHBQcm90b1Jvb3QsIHdzU09NLCByZXNvdmVOb2RlUlMsIGR3RmxhZyk7DQotICAgICAgICAgICAgICAgIGlmKGlSZXQgPiAwICYmIHJlc292ZU5vZGVSUy5ub2Rlc1swXS0+SXNOb2RlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBQcm90b05vZGUgPSAoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbMF07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2UgaWYoIXdzSUQuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIHBQcm90b05vZGUgPSBtX3BEb2N1bWVudC0+R2V0Tm9kZUJ5SUQocFByb3RvUm9vdCwgd3NJRCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKHBQcm90b05vZGUpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwSGVhZENoaWxkID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAocEhlYWRDaGlsZCkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwU2libGluZyA9IHBIZWFkQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgICAgICAgICAgICAgICAgICBSZW1vdmVDaGlsZChwSGVhZENoaWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIHBIZWFkQ2hpbGQgPSBwU2libGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQcm90b0Zvcm0gPSBwUHJvdG9Ob2RlLT5DbG9uZVRlbXBsYXRlVG9Gb3JtKFRSVUUpOw0KLSAgICAgICAgICAgICAgICBwSGVhZENoaWxkID0gcFByb3RvRm9ybS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAocEhlYWRDaGlsZCkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwU2libGluZyA9IHBIZWFkQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgICAgICAgICAgICAgICAgICBwUHJvdG9Gb3JtLT5SZW1vdmVDaGlsZChwSGVhZENoaWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIEluc2VydENoaWxkKHBIZWFkQ2hpbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgcEhlYWRDaGlsZCA9IHBTaWJsaW5nOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fcERvY3VtZW50LT5SZW1vdmVQdXJnZU5vZGUocFByb3RvRm9ybSk7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvdG9Gb3JtOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgICAgICBHZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1ZhbHVlLCB3c1ZhbHVlLkdldExlbmd0aCgpKSk7DQotICAgIH0NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfSXNDb21wYXRpYmxlTlMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJpc0NvbXBhdGlibGVOUyIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWVTcGFjZTsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lU3BhY2UgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICB3c05hbWVTcGFjZSA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lU3BhY2UsIGJzTmFtZVNwYWNlLkdldExlbmd0aCgpKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzTm9kZU5hbWVTcGFjZTsNCisgIHRoaXMtPlRyeU5hbWVzcGFjZSh3c05vZGVOYW1lU3BhY2UpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCB3c05vZGVOYW1lU3BhY2UuRXF1YWwod3NOYW1lU3BhY2UpKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBpZiAoIWJTZXR0aW5nKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICAgICAgR2V0QXR0cmlidXRlKGVBdHRyaWJ1dGUsIHdzVmFsdWUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NWYWx1ZSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19Db250ZXh0KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0FsaWFzTm9kZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgU2V0SW50ZWdlcihlQXR0cmlidXRlLCBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKSwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgR2V0SW50ZWdlcihlQXR0cmlidXRlKSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfV3NkbENvbm5lY3Rpb25fRXhlY3V0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmICgoYXJnYyA9PSAwKSB8fCAoYXJnYyA9PSAxKSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImV4ZWN1dGUiKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0ludGVnZXJSZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghYlNldHRpbmcpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIEdldEludGVnZXIoZUF0dHJpYnV0ZSkpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9EZWx0YV9SZXN0b3JlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJyZXN0b3JlIik7DQotICAgIH0NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgU2V0Qm9vbGVhbihlQXR0cmlidXRlLCBGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4oaFZhbHVlKSwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKA0KKyAgICAgICAgaFZhbHVlLCBHZXRCb29sZWFuKGVBdHRyaWJ1dGUpID8gRlhfQlNUUkMoIjEiKSA6IEZYX0JTVFJDKCIwIikpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX0N1cnJlbnRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0xSZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghYlNldHRpbmcpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZygNCisgICAgICAgIGhWYWx1ZSwgR2V0Qm9vbGVhbihlQXR0cmlidXRlKSA/IEZYX0JTVFJDKCIxIikgOiBGWF9CU1RSQygiMCIpKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRGVsdGFfU2F2ZWRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1RhcmdldChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9NZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9TT01fTUVTU0FHRVRZUEUgaU1lc3NhZ2VUeXBlKQ0KLXsNCi0gICAgQ1hGQV9XaWRnZXREYXRhICpwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYk5ldyA9IEZBTFNFOw0KLSAgICBDWEZBX1ZhbGlkYXRlIHZhbGlkYXRlID0gcFdpZGdldERhdGEtPkdldFZhbGlkYXRlKCk7DQotICAgIGlmICghdmFsaWRhdGUpIHsNCi0gICAgICAgIHZhbGlkYXRlID0gcFdpZGdldERhdGEtPkdldFZhbGlkYXRlKFRSVUUpOw0KLSAgICAgICAgYk5ldyA9IFRSVUU7DQotICAgIH0NCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic01lc3NhZ2U7DQotICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic01lc3NhZ2UpOw0KLSAgICAgICAgc3dpdGNoIChpTWVzc2FnZVR5cGUpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9TT01fVmFsaWRhdGlvbk1lc3NhZ2U6DQotICAgICAgICAgICAgICAgIHZhbGlkYXRlLlNldFNjcmlwdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic01lc3NhZ2UsIGJzTWVzc2FnZS5HZXRMZW5ndGgoKSkpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9TT01fRm9ybWF0TWVzc2FnZToNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGUuU2V0Rm9ybWF0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTWVzc2FnZSwgYnNNZXNzYWdlLkdldExlbmd0aCgpKSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX1NPTV9NYW5kYXRvcnlNZXNzYWdlOg0KLSAgICAgICAgICAgICAgICB2YWxpZGF0ZS5TZXROdWxsTWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTWVzc2FnZSwgYnNNZXNzYWdlLkdldExlbmd0aCgpKSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiTmV3KSB7DQotICAgICAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBOb3RpZnktPkFkZENhbGNWYWxpZGF0ZSh0aGlzKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCi0gICAgICAgIHN3aXRjaCAoaU1lc3NhZ2VUeXBlKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfU09NX1ZhbGlkYXRpb25NZXNzYWdlOg0KLSAgICAgICAgICAgICAgICB2YWxpZGF0ZS5HZXRTY3JpcHRNZXNzYWdlVGV4dCh3c01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9TT01fRm9ybWF0TWVzc2FnZToNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGUuR2V0Rm9ybWF0TWVzc2FnZVRleHQod3NNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfU09NX01hbmRhdG9yeU1lc3NhZ2U6DQotICAgICAgICAgICAgICAgIHZhbGlkYXRlLkdldE51bGxNZXNzYWdlVGV4dCh3c01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzTWVzc2FnZSkpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX1ZhbGlkYXRpb25NZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIFNjcmlwdF9Tb21fTWVzc2FnZShoVmFsdWUsIGJTZXR0aW5nLCBYRkFfU09NX1ZhbGlkYXRpb25NZXNzYWdlKTsNCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9MZW5ndGgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9XaWRnZXREYXRhICpwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgICAgIGlmICghcFdpZGdldERhdGEpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgMCk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIHBXaWRnZXREYXRhLT5Db3VudENob2ljZUxpc3RJdGVtcyhUUlVFKSk7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIFhGQV9FTEVNRU5UIGNsYXNzSUQgPSBHZXRDbGFzc0lEKCk7DQotICAgIGlmKGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCi0gICAgICAgIFNjcmlwdF9GaWVsZF9EZWZhdWx0VmFsdWUoaFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0gZWxzZSBpZihjbGFzc0lEID09IFhGQV9FTEVNRU5UX0RyYXcpIHsNCi0gICAgICAgIFNjcmlwdF9EcmF3X0RlZmF1bHRWYWx1ZShoVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfSBlbHNlIGlmIChjbGFzc0lEID09IFhGQV9FTEVNRU5UX0Jvb2xlYW4pIHsNCi0gICAgICAgIFNjcmlwdF9Cb29sZWFuX1ZhbHVlKGhWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV3VmFsdWU7DQotICAgICAgICBpZiAoIShGWEpTRV9WYWx1ZV9Jc051bGwoaFZhbHVlKSB8fCBGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChoVmFsdWUpKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIG5ld1ZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgobmV3VmFsdWUsIG5ld1ZhbHVlLkdldExlbmd0aCgpKTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NOZXdWYWx1ZSk7DQotICAgICAgICBDWEZBX1dpZGdldERhdGEqIHBDb250YWluZXJXaWRnZXREYXRhID0gTlVMTDsNCi0gICAgICAgIGlmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCi0gICAgICAgICAgICBDWEZBX05vZGVBcnJheSBmb3JtTm9kZXM7DQotICAgICAgICAgICAgdGhpcy0+R2V0QmluZEl0ZW1zKGZvcm1Ob2Rlcyk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGZvcm1Ob2Rlcy5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IGZvcm1Ob2Rlcy5HZXRBdChpKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFwRm9ybU5vZGUgfHwgcEZvcm1Ob2RlLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19IYXNSZW1vdmVkKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEgPSBwRm9ybU5vZGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0UGljdHVyZUNvbnRlbnQod3NQaWN0dXJlLCBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoIXdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBDb250YWluZXJXaWRnZXREYXRhID0gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQotICAgICAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEgPSBHZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAocENvbnRhaW5lcldpZGdldERhdGEpIHsNCi0gICAgICAgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzTmV3VmFsdWUsIHdzRm9ybWF0VmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU2V0U2NyaXB0Q29udGVudCh3c05ld1ZhbHVlLCB3c0Zvcm1hdFZhbHVlLCBUUlVFLCBUUlVFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNvbnRlbnQgPSBHZXRTY3JpcHRDb250ZW50KFRSVUUpOw0KLSAgICAgICAgaWYoY29udGVudC5Jc0VtcHR5KCkgJiYgY2xhc3NJRCAhPSBYRkFfRUxFTUVOVF9UZXh0ICYmIGNsYXNzSUQgIT0gWEZBX0VMRU1FTlRfU3VibWl0VXJsKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjbGFzc0lEID09IFhGQV9FTEVNRU5UX0ludGVnZXIpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgRlhTWVNfd3RvaShjb250ZW50KSkJOw0KLSAgICAgICAgfSBlbHNlIGlmIChjbGFzc0lEID09IFhGQV9FTEVNRU5UX0Zsb2F0IHx8IGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRGVjaW1hbCkgew0KLSAgICAgICAgICAgIENGWF9EZWNpbWFsIGRlY2ltYWwoY29udGVudCk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoaFZhbHVlLCAoRlhfRkxPQVQpKGRvdWJsZSlkZWNpbWFsKTsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TZW5kQXR0cmlidXRlQ2hhbmdlTWVzc2FnZSgNCisgICAgdm9pZCogZUF0dHJpYnV0ZSwNCisgICAgdm9pZCogZVZhbHVlLA0KKyAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkpIHsNCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KKyAgaWYgKCFwTGF5b3V0UHJvKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9EV09SRCBkd1BhY2tldCA9IHRoaXMtPkdldFBhY2tldElEKCk7DQorICBpZiAoZHdQYWNrZXQgJiBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgRlhfQk9PTCBiTmVlZEZpbmRDb250YWluZXIgPSBGQUxTRTsNCisgICAgWEZBX0VMRU1FTlQgZVR5cGUgPSB0aGlzLT5HZXRDbGFzc0lEKCk7DQorICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NhcHRpb246DQorICAgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSBUUlVFOw0KKyAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFsdWUsIHRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ZvbnQ6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYXJhOiB7DQorICAgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSBUUlVFOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgaWYgKHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQ2FwdGlvbikgew0KKyAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhbHVlLCBwUGFyZW50Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCiAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUoY29udGVudCwgY29udGVudC5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhbHVlLCB0aGlzLCBwUGFyZW50Tm9kZSk7DQogICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX01hcmdpbjogew0KKyAgICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gVFJVRTsNCisgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgIFhGQV9FTEVNRU5UIGVQYXJlbnRUeXBlID0gcFBhcmVudE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgICAgIGlmIChwUGFyZW50Tm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYWx1ZSwgdGhpcywgcFBhcmVudE5vZGUpOw0KKyAgICAgICAgfSBlbHNlIGlmIChlUGFyZW50VHlwZSA9PSBYRkFfRUxFTUVOVF9DYXB0aW9uKSB7DQorICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFsdWUsIHBQYXJlbnROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVWkpIHsNCisgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFsdWUsIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ29tYjogew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwRWRpdE5vZGUgPSB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSBwRWRpdE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgICAgIGlmIChwRWRpdE5vZGUgJiYgKGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0IHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICBlVUlUeXBlID09IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0IHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICBlVUlUeXBlID09IFhGQV9FTEVNRU5UX1RleHRFZGl0KSkgew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBVSU5vZGUgPSBwRWRpdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICBpZiAocFVJTm9kZSkgew0KKyAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYWx1ZSwgcFVJTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVUlOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnV0dG9uOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQmFyY29kZToNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3Q6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQ6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdDoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdDoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHRFZGl0OiB7DQorICAgICAgICBDWEZBX05vZGUqIHBVSU5vZGUgPSB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgIGlmIChwVUlOb2RlKSB7DQorICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFsdWUsIHBVSU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVSU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b246IHsNCisgICAgICAgIGJOZWVkRmluZENvbnRhaW5lciA9IFRSVUU7DQorICAgICAgICBDWEZBX05vZGUqIHBVSU5vZGUgPSB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgIGlmIChwVUlOb2RlKSB7DQorICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFsdWUsIHBVSU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVSU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfS2VlcDoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Jvb2tlbmQ6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVhazoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrQWZ0ZXI6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVha0JlZm9yZToNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX092ZXJmbG93Og0KKyAgICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gVFJVRTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJlYToNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9GaWVsZDoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0Og0KKyAgICAgICAgcExheW91dFByby0+QWRkQ2hhbmdlZENvbnRhaW5lcih0aGlzKTsNCisgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhbHVlLCB0aGlzLCB0aGlzKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU2hhcnB0ZXh0Og0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU2hhcnB4bWw6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TaGFycHhIVE1MOiB7DQorICAgICAgICBDWEZBX05vZGUqIHBUZXh0Tm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgaWYgKCFwVGV4dE5vZGUpIHsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlID0gcFRleHROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgIGlmICghcFZhbHVlTm9kZSkgew0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBWYWx1ZU5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9WYWx1ZSkgew0KKyAgICAgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSBUUlVFOw0KKyAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgIGlmIChwTm9kZSAmJiBwTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICAgICAgICBpZiAoYlNjcmlwdE1vZGlmeSkgew0KKyAgICAgICAgICAgICAgcFZhbHVlTm9kZSA9IHBOb2RlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFsdWUsIHBWYWx1ZU5vZGUsIHBOb2RlKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFsdWUsIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBwVmFsdWVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgICBpZiAocE5vZGUgJiYgcE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7DQorICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYWx1ZSwgcFZhbHVlTm9kZSwgcE5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQorICAgIGlmIChiTmVlZEZpbmRDb250YWluZXIpIHsNCisgICAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSB0aGlzOw0KKyAgICAgIHdoaWxlIChwUGFyZW50KSB7DQorICAgICAgICBpZiAocFBhcmVudC0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwUGFyZW50KSB7DQorICAgICAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKHBQYXJlbnQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsIGVWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgdGhpcyk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZV9SZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgc3pWYWx1ZSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VmFsdWUsIHN6VmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBTZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NWYWx1ZSwgVFJVRSk7DQorICAgIGlmIChlQXR0cmlidXRlID09IFhGQV9BVFRSSUJVVEVfVXNlICYmDQorICAgICAgICB0aGlzLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGVzYykgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVXNlVmFsID0gd3NWYWx1ZSwgd3NJRCwgd3NTT007DQorICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlID0NCisgICAgICAgICAgKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1RlbXBsYXRlKTsNCisgICAgICBDWEZBX05vZGUqIHBQcm90b1Jvb3QgPQ0KKyAgICAgICAgICBwVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9TdWJmb3JtKQ0KKyAgICAgICAgICAgICAgLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Qcm90byk7DQorICAgICAgaWYgKCF3c1VzZVZhbC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGlmICh3c1VzZVZhbFswXSA9PSAnIycpIHsNCisgICAgICAgICAgd3NJRCA9IENGWF9XaWRlU3RyaW5nKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwgKyAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NVc2VWYWwuR2V0TGVuZ3RoKCkgLSAxKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzU09NID0NCisgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwsIHdzVXNlVmFsLkdldExlbmd0aCgpKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgQ1hGQV9Ob2RlKiBwUHJvdG9Ob2RlID0gTlVMTDsNCisgICAgICBpZiAoIXdzU09NLklzRW1wdHkoKSkgew0KKyAgICAgICAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQorICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgICAgaW50MzJfdCBpUmV0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+UmVzb2x2ZU9iamVjdHMoDQorICAgICAgICAgICAgcFByb3RvUm9vdCwgd3NTT00sIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCisgICAgICAgIGlmIChpUmV0ID4gMCAmJiByZXNvdmVOb2RlUlMubm9kZXNbMF0tPklzTm9kZSgpKSB7DQorICAgICAgICAgIHBQcm90b05vZGUgPSAoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbMF07DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmICghd3NJRC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHBQcm90b05vZGUgPSBtX3BEb2N1bWVudC0+R2V0Tm9kZUJ5SUQocFByb3RvUm9vdCwgd3NJRCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwUHJvdG9Ob2RlKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBIZWFkQ2hpbGQgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICB3aGlsZSAocEhlYWRDaGlsZCkgew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBTaWJsaW5nID0NCisgICAgICAgICAgICAgIHBIZWFkQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgIFJlbW92ZUNoaWxkKHBIZWFkQ2hpbGQpOw0KKyAgICAgICAgICBwSGVhZENoaWxkID0gcFNpYmxpbmc7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUqIHBQcm90b0Zvcm0gPSBwUHJvdG9Ob2RlLT5DbG9uZVRlbXBsYXRlVG9Gb3JtKFRSVUUpOw0KKyAgICAgICAgcEhlYWRDaGlsZCA9IHBQcm90b0Zvcm0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIHdoaWxlIChwSGVhZENoaWxkKSB7DQorICAgICAgICAgIENYRkFfTm9kZSogcFNpYmxpbmcgPQ0KKyAgICAgICAgICAgICAgcEhlYWRDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgcFByb3RvRm9ybS0+UmVtb3ZlQ2hpbGQocEhlYWRDaGlsZCk7DQorICAgICAgICAgIEluc2VydENoaWxkKHBIZWFkQ2hpbGQpOw0KKyAgICAgICAgICBwSGVhZENoaWxkID0gcFNpYmxpbmc7DQorICAgICAgICB9DQorICAgICAgICBtX3BEb2N1bWVudC0+UmVtb3ZlUHVyZ2VOb2RlKHBQcm90b0Zvcm0pOw0KKyAgICAgICAgZGVsZXRlIHBQcm90b0Zvcm07DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICBHZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VURjhFbmNvZGUod3NWYWx1ZSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmdSZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoIWJTZXR0aW5nKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgIEdldEF0dHJpYnV0ZShlQXR0cmlidXRlLCB3c1ZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVVRGOEVuY29kZSh3c1ZhbHVlLCB3c1ZhbHVlLkdldExlbmd0aCgpKSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1dzZGxDb25uZWN0aW9uX0V4ZWN1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPT0gMCkgfHwgKGFyZ2MgPT0gMSkpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImV4ZWN1dGUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9EZWx0YV9SZXN0b3JlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJyZXN0b3JlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRGVsdGFfQ3VycmVudFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9EZWx0YV9TYXZlZFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1RhcmdldChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX01lc3NhZ2UoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfU09NX01FU1NBR0VUWVBFIGlNZXNzYWdlVHlwZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiTmV3ID0gRkFMU0U7DQorICBDWEZBX1ZhbGlkYXRlIHZhbGlkYXRlID0gcFdpZGdldERhdGEtPkdldFZhbGlkYXRlKCk7DQorICBpZiAoIXZhbGlkYXRlKSB7DQorICAgIHZhbGlkYXRlID0gcFdpZGdldERhdGEtPkdldFZhbGlkYXRlKFRSVUUpOw0KKyAgICBiTmV3ID0gVFJVRTsNCisgIH0NCisgIGlmIChiU2V0dGluZykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic01lc3NhZ2U7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzTWVzc2FnZSk7DQorICAgIHN3aXRjaCAoaU1lc3NhZ2VUeXBlKSB7DQorICAgICAgY2FzZSBYRkFfU09NX1ZhbGlkYXRpb25NZXNzYWdlOg0KKyAgICAgICAgdmFsaWRhdGUuU2V0U2NyaXB0TWVzc2FnZVRleHQoDQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTWVzc2FnZSwgYnNNZXNzYWdlLkdldExlbmd0aCgpKSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9TT01fRm9ybWF0TWVzc2FnZToNCisgICAgICAgIHZhbGlkYXRlLlNldEZvcm1hdE1lc3NhZ2VUZXh0KA0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic01lc3NhZ2UsIGJzTWVzc2FnZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfU09NX01hbmRhdG9yeU1lc3NhZ2U6DQorICAgICAgICB2YWxpZGF0ZS5TZXROdWxsTWVzc2FnZVRleHQoDQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTWVzc2FnZSwgYnNNZXNzYWdlLkdldExlbmd0aCgpKSk7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKCFiTmV3KSB7DQorICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICAgIGlmICghcE5vdGlmeSkgew0KICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBwTm90aWZ5LT5BZGRDYWxjVmFsaWRhdGUodGhpcyk7DQogICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgY29udGVudCA9IEdldFNjcmlwdENvbnRlbnQoVFJVRSk7DQotICAgIGlmIChjb250ZW50LklzRW1wdHkoKSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUoY29udGVudCwgY29udGVudC5HZXRMZW5ndGgoKSkpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlOw0KKyAgICBzd2l0Y2ggKGlNZXNzYWdlVHlwZSkgew0KKyAgICAgIGNhc2UgWEZBX1NPTV9WYWxpZGF0aW9uTWVzc2FnZToNCisgICAgICAgIHZhbGlkYXRlLkdldFNjcmlwdE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9TT01fRm9ybWF0TWVzc2FnZToNCisgICAgICAgIHZhbGlkYXRlLkdldEZvcm1hdE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9TT01fTWFuZGF0b3J5TWVzc2FnZToNCisgICAgICAgIHZhbGlkYXRlLkdldE51bGxNZXNzYWdlVGV4dCh3c01lc3NhZ2UpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzTWVzc2FnZSkpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Jvb2xlYW5fVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBuZXdWYWx1ZTsNCi0gICAgICAgIGlmICghKEZYSlNFX1ZhbHVlX0lzTnVsbChoVmFsdWUpIHx8IEZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGhWYWx1ZSkpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgbmV3VmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpVmFsdWUgPSBGWFNZU19hdG9pKG5ld1ZhbHVlKTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VmFsdWUgPSAoaVZhbHVlID09IDApID8gRlhfV1NUUkMoTCIwIikgOiBGWF9XU1RSQyhMIjEiKTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NOZXdWYWx1ZSk7DQotICAgICAgICBDWEZBX1dpZGdldERhdGEqIHBDb250YWluZXJXaWRnZXREYXRhID0gR2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KLSAgICAgICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQotICAgICAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c05ld1ZhbHVlLCB3c0Zvcm1hdFZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFNldFNjcmlwdENvbnRlbnQod3NOZXdWYWx1ZSwgd3NGb3JtYXRWYWx1ZSwgVFJVRSwgVFJVRSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gR2V0U2NyaXB0Q29udGVudChUUlVFKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCB3c1ZhbHVlLkVxdWFsKEZYX1dTVFJDKEwiMSIpKSA/IFRSVUUgOiBGQUxTRSk7DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fVmFsaWRhdGlvbk1lc3NhZ2UoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X1NvbV9NZXNzYWdlKGhWYWx1ZSwgYlNldHRpbmcsIFhGQV9TT01fVmFsaWRhdGlvbk1lc3NhZ2UpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0xlbmd0aChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgMCk7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBwV2lkZ2V0RGF0YS0+Q291bnRDaG9pY2VMaXN0SXRlbXMoVFJVRSkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBYRkFfRUxFTUVOVCBjbGFzc0lEID0gR2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgU2NyaXB0X0ZpZWxkX0RlZmF1bHRWYWx1ZShoVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsNCisgICAgcmV0dXJuOw0KKyAgfSBlbHNlIGlmIChjbGFzc0lEID09IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgU2NyaXB0X0RyYXdfRGVmYXVsdFZhbHVlKGhWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOw0KKyAgICByZXR1cm47DQorICB9IGVsc2UgaWYgKGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfQm9vbGVhbikgew0KKyAgICBTY3JpcHRfQm9vbGVhbl9WYWx1ZShoVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIG5ld1ZhbHVlOw0KKyAgICBpZiAoIShGWEpTRV9WYWx1ZV9Jc051bGwoaFZhbHVlKSB8fCBGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChoVmFsdWUpKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIG5ld1ZhbHVlKTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05ld1ZhbHVlID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChuZXdWYWx1ZSwgbmV3VmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzTmV3VmFsdWUpOw0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBDb250YWluZXJXaWRnZXREYXRhID0gTlVMTDsNCisgICAgaWYgKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgew0KKyAgICAgIENYRkFfTm9kZUFycmF5IGZvcm1Ob2RlczsNCisgICAgICB0aGlzLT5HZXRCaW5kSXRlbXMoZm9ybU5vZGVzKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9ybU5vZGVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IGZvcm1Ob2Rlcy5HZXRBdChpKTsNCisgICAgICAgIGlmICghcEZvcm1Ob2RlIHx8IHBGb3JtTm9kZS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZCkpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IHBGb3JtTm9kZS0+R2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KKyAgICAgICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQorICAgICAgICAgIHBDb250YWluZXJXaWRnZXREYXRhLT5HZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghd3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHBDb250YWluZXJXaWRnZXREYXRhID0gTlVMTDsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IEdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgICAgfQ0KKyAgICBpZiAocENvbnRhaW5lcldpZGdldERhdGEpIHsNCisgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzTmV3VmFsdWUsIHdzRm9ybWF0VmFsdWUpOw0KKyAgICB9DQorICAgIFNldFNjcmlwdENvbnRlbnQod3NOZXdWYWx1ZSwgd3NGb3JtYXRWYWx1ZSwgVFJVRSwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZyBjb250ZW50ID0gR2V0U2NyaXB0Q29udGVudChUUlVFKTsNCisgICAgaWYgKGNvbnRlbnQuSXNFbXB0eSgpICYmIGNsYXNzSUQgIT0gWEZBX0VMRU1FTlRfVGV4dCAmJg0KKyAgICAgICAgY2xhc3NJRCAhPSBYRkFfRUxFTUVOVF9TdWJtaXRVcmwpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQorICAgIH0gZWxzZSBpZiAoY2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9JbnRlZ2VyKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIEZYU1lTX3d0b2koY29udGVudCkpOw0KKyAgICB9IGVsc2UgaWYgKGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRmxvYXQgfHwgY2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9EZWNpbWFsKSB7DQorICAgICAgQ0ZYX0RlY2ltYWwgZGVjaW1hbChjb250ZW50KTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChoVmFsdWUsIChGWF9GTE9BVCkoZG91YmxlKWRlY2ltYWwpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVVRGOEVuY29kZShjb250ZW50LCBjb250ZW50LkdldExlbmd0aCgpKSk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIGNvbnRlbnQgPSBHZXRTY3JpcHRDb250ZW50KFRSVUUpOw0KKyAgaWYgKGNvbnRlbnQuSXNFbXB0eSgpKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoaFZhbHVlKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VURjhFbmNvZGUoY29udGVudCwgY29udGVudC5HZXRMZW5ndGgoKSkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Jvb2xlYW5fVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgbmV3VmFsdWU7DQorICAgIGlmICghKEZYSlNFX1ZhbHVlX0lzTnVsbChoVmFsdWUpIHx8IEZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGhWYWx1ZSkpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgbmV3VmFsdWUpOw0KKyAgICB9DQorICAgIGludDMyX3QgaVZhbHVlID0gRlhTWVNfYXRvaShuZXdWYWx1ZSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VmFsdWUgPSAoaVZhbHVlID09IDApID8gRlhfV1NUUkMoTCIwIikgOiBGWF9XU1RSQyhMIjEiKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c05ld1ZhbHVlKTsNCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IEdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQorICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c05ld1ZhbHVlLCB3c0Zvcm1hdFZhbHVlKTsNCisgICAgfQ0KKyAgICBTZXRTY3JpcHRDb250ZW50KHdzTmV3VmFsdWUsIHdzRm9ybWF0VmFsdWUsIFRSVUUsIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IEdldFNjcmlwdENvbnRlbnQoVFJVRSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUuRXF1YWwoRlhfV1NUUkMoTCIxIikpID8gVFJVRSA6IEZBTFNFKTsNCisgIH0NCiB9DQogc3RydWN0IFhGQV9FeGVjRXZlbnRQYXJhSW5mbyB7DQotcHVibGljOg0KLSAgICB1aW50MzJfdCBtX3VIYXNoOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogbV9scGNFdmVudE5hbWU7DQotICAgIFhGQV9FVkVOVFRZUEUgbV9ldmVudFR5cGU7DQotICAgIHVpbnQzMl90IG1fdmFsaWRGbGFnczsNCisgcHVibGljOg0KKyAgdWludDMyX3QgbV91SGFzaDsNCisgIGNvbnN0IEZYX1dDSEFSKiBtX2xwY0V2ZW50TmFtZTsNCisgIFhGQV9FVkVOVFRZUEUgbV9ldmVudFR5cGU7DQorICB1aW50MzJfdCBtX3ZhbGlkRmxhZ3M7DQogfTsNCiBzdGF0aWMgY29uc3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvIGdzX2V2ZW50UGFyYUluZm9zW10gPSB7DQotICAgIHsweDAyYTZjNTVhLCBMInBvc3RTdWJtaXQiLAlYRkFfRVZFTlRfUG9zdFN1Ym1pdCwJMH0sDQotICAgIHsweDBhYjQ2NmJiLCBMInByZVN1Ym1pdCIsCVhGQV9FVkVOVF9QcmVTdWJtaXQsCTB9LA0KLSAgICB7MHgxMDlkN2NlNywgTCJtb3VzZUVudGVyIiwJWEZBX0VWRU5UX01vdXNlRW50ZXIsCTV9LA0KLSAgICB7MHgxN2ZhZDM3MywgTCJwb3N0UHJpbnQiLAlYRkFfRVZFTlRfUG9zdFByaW50LAkwfSwNCi0gICAgezB4MWJmYzcyZDksIEwicHJlT3BlbiIsCVhGQV9FVkVOVF9QcmVPcGVuLAkJN30sDQotICAgIHsweDIxOTZhNDUyLCBMImluaXRpYWxpemUiLAlYRkFfRVZFTlRfSW5pdGlhbGl6ZSwJMX0sDQotICAgIHsweDI3NDEwZjAzLCBMIm1vdXNlRXhpdCIsCVhGQV9FVkVOVF9Nb3VzZUV4aXQsCTV9LA0KLSAgICB7MHgzM2M0M2RlYywgTCJkb2NDbG9zZSIsCVhGQV9FVkVOVF9Eb2NDbG9zZSwJCTB9LA0KLSAgICB7MHgzNjFmYTFiNiwgTCJwcmVTYXZlIiwJWEZBX0VWRU5UX1ByZVNhdmUsCQkwfSwNCi0gICAgezB4MzZmMWM2ZDgsIEwicHJlU2lnbiIsCVhGQV9FVkVOVF9QcmVTaWduLAkJNn0sDQotICAgIHsweDQ3MzFkNmJhLCBMImV4aXQiLAkJWEZBX0VWRU5UX0V4aXQsCQkJMn0sDQotICAgIHsweDU2YmY0NTZiLCBMImRvY1JlYWR5IiwJWEZBX0VWRU5UX0RvY1JlYWR5LAkJMH0sDQotICAgIHsweDcyMzMwMThhLCBMInZhbGlkYXRlIiwJWEZBX0VWRU5UX1ZhbGlkYXRlLAkJMX0sDQotICAgIHsweDg4MDgzODVlLCBMImluZGV4Q2hhbmdlIiwgWEZBX0VWRU5UX0luZGV4Q2hhbmdlLAkzfSwNCi0gICAgezB4ODkxZjQ2MDYsIEwiY2hhbmdlIiwJCVhGQV9FVkVOVF9DaGFuZ2UsCQk0fSwNCi0gICAgezB4OTUyOGE3YjQsIEwicHJlUHJpbnQiLAlYRkFfRVZFTlRfUHJlUHJpbnQsCQkwfSwNCi0gICAgezB4OWY2OTNiMjEsIEwibW91c2VEb3duIiwJWEZBX0VWRU5UX01vdXNlRG93biwJNX0sDQotICAgIHsweGNkY2U1NmIzLCBMImZ1bGwiLAkJWEZBX0VWRU5UX0Z1bGwsCQkJNH0sDQotICAgIHsweGQ1NzZkMDhlLCBMIm1vdXNlVXAiLAlYRkFfRVZFTlRfTW91c2VVcCwJCTV9LA0KLSAgICB7MHhkOTU2NTdhNiwgTCJjbGljayIsCQlYRkFfRVZFTlRfQ2xpY2ssCQk0fSwNCi0gICAgezB4ZGJmYmUwMmUsIEwiY2FsY3VsYXRlIiwJWEZBX0VWRU5UX0NhbGN1bGF0ZSwJMX0sDQotICAgIHsweGUyNWZhN2I4LCBMInBvc3RPcGVuIiwJWEZBX0VWRU5UX1Bvc3RPcGVuLAkJN30sDQotICAgIHsweGUyOGRjZTdlLCBMImVudGVyIiwJCVhGQV9FVkVOVF9FbnRlciwJCTJ9LA0KLSAgICB7MHhmYzgyZDY5NSwgTCJwb3N0U2F2ZSIsCVhGQV9FVkVOVF9Qb3N0U2F2ZSwJCTB9LA0KLSAgICB7MHhmZDU0ZmJiNywgTCJwb3N0U2lnbiIsCVhGQV9FVkVOVF9Qb3N0U2lnbiwJCTZ9LA0KKyAgICB7MHgwMmE2YzU1YSwgTCJwb3N0U3VibWl0IiwgWEZBX0VWRU5UX1Bvc3RTdWJtaXQsIDB9LA0KKyAgICB7MHgwYWI0NjZiYiwgTCJwcmVTdWJtaXQiLCBYRkFfRVZFTlRfUHJlU3VibWl0LCAwfSwNCisgICAgezB4MTA5ZDdjZTcsIEwibW91c2VFbnRlciIsIFhGQV9FVkVOVF9Nb3VzZUVudGVyLCA1fSwNCisgICAgezB4MTdmYWQzNzMsIEwicG9zdFByaW50IiwgWEZBX0VWRU5UX1Bvc3RQcmludCwgMH0sDQorICAgIHsweDFiZmM3MmQ5LCBMInByZU9wZW4iLCBYRkFfRVZFTlRfUHJlT3BlbiwgN30sDQorICAgIHsweDIxOTZhNDUyLCBMImluaXRpYWxpemUiLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSwgMX0sDQorICAgIHsweDI3NDEwZjAzLCBMIm1vdXNlRXhpdCIsIFhGQV9FVkVOVF9Nb3VzZUV4aXQsIDV9LA0KKyAgICB7MHgzM2M0M2RlYywgTCJkb2NDbG9zZSIsIFhGQV9FVkVOVF9Eb2NDbG9zZSwgMH0sDQorICAgIHsweDM2MWZhMWI2LCBMInByZVNhdmUiLCBYRkFfRVZFTlRfUHJlU2F2ZSwgMH0sDQorICAgIHsweDM2ZjFjNmQ4LCBMInByZVNpZ24iLCBYRkFfRVZFTlRfUHJlU2lnbiwgNn0sDQorICAgIHsweDQ3MzFkNmJhLCBMImV4aXQiLCBYRkFfRVZFTlRfRXhpdCwgMn0sDQorICAgIHsweDU2YmY0NTZiLCBMImRvY1JlYWR5IiwgWEZBX0VWRU5UX0RvY1JlYWR5LCAwfSwNCisgICAgezB4NzIzMzAxOGEsIEwidmFsaWRhdGUiLCBYRkFfRVZFTlRfVmFsaWRhdGUsIDF9LA0KKyAgICB7MHg4ODA4Mzg1ZSwgTCJpbmRleENoYW5nZSIsIFhGQV9FVkVOVF9JbmRleENoYW5nZSwgM30sDQorICAgIHsweDg5MWY0NjA2LCBMImNoYW5nZSIsIFhGQV9FVkVOVF9DaGFuZ2UsIDR9LA0KKyAgICB7MHg5NTI4YTdiNCwgTCJwcmVQcmludCIsIFhGQV9FVkVOVF9QcmVQcmludCwgMH0sDQorICAgIHsweDlmNjkzYjIxLCBMIm1vdXNlRG93biIsIFhGQV9FVkVOVF9Nb3VzZURvd24sIDV9LA0KKyAgICB7MHhjZGNlNTZiMywgTCJmdWxsIiwgWEZBX0VWRU5UX0Z1bGwsIDR9LA0KKyAgICB7MHhkNTc2ZDA4ZSwgTCJtb3VzZVVwIiwgWEZBX0VWRU5UX01vdXNlVXAsIDV9LA0KKyAgICB7MHhkOTU2NTdhNiwgTCJjbGljayIsIFhGQV9FVkVOVF9DbGljaywgNH0sDQorICAgIHsweGRiZmJlMDJlLCBMImNhbGN1bGF0ZSIsIFhGQV9FVkVOVF9DYWxjdWxhdGUsIDF9LA0KKyAgICB7MHhlMjVmYTdiOCwgTCJwb3N0T3BlbiIsIFhGQV9FVkVOVF9Qb3N0T3BlbiwgN30sDQorICAgIHsweGUyOGRjZTdlLCBMImVudGVyIiwgWEZBX0VWRU5UX0VudGVyLCAyfSwNCisgICAgezB4ZmM4MmQ2OTUsIEwicG9zdFNhdmUiLCBYRkFfRVZFTlRfUG9zdFNhdmUsIDB9LA0KKyAgICB7MHhmZDU0ZmJiNywgTCJwb3N0U2lnbiIsIFhGQV9FVkVOVF9Qb3N0U2lnbiwgNn0sDQogfTsNCi1jb25zdCBYRkFfRXhlY0V2ZW50UGFyYUluZm8qIEdldEV2ZW50UGFyYUluZm9CeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V2ZW50TmFtZSkNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHdzRXZlbnROYW1lLkdldExlbmd0aCgpOw0KLSAgICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzRXZlbnROYW1lLkdldFB0cigpLCBpTGVuZ3RoKTsNCi0gICAgY29uc3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvKiBldmVudFBhcmFJbmZvID0gTlVMTDsNCi0gICAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gKHNpemVvZihnc19ldmVudFBhcmFJbmZvcykgLyBzaXplb2YoZ3NfZXZlbnRQYXJhSW5mb3NbMF0pKSAtIDE7DQotICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgIGRvIHsNCi0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KLSAgICAgICAgZXZlbnRQYXJhSW5mbyA9ICZnc19ldmVudFBhcmFJbmZvc1tpTWlkXTsNCi0gICAgICAgIGlmICh1SGFzaCA9PSBldmVudFBhcmFJbmZvLT5tX3VIYXNoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGV2ZW50UGFyYUluZm87DQotICAgICAgICB9IGVsc2UgaWYgKHVIYXNoIDwgZXZlbnRQYXJhSW5mby0+bV91SGFzaCkgew0KLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQotICAgICAgICB9DQotICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLXZvaWQgWEZBX1NUUklOR19UT19SR0IoQ0ZYX1dpZGVTdHJpbmcgJnN0clJHQiwgaW50MzJfdCAmciwgaW50MzJfdCAmZywgaW50MzJfdCAmYikNCi17DQotICAgIHIgPSAwOw0KLSAgICBnID0gMDsNCi0gICAgYiA9IDA7DQotICAgIEZYX1dDSEFSIHplcm8gPSAnMCc7DQotICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgaW50MzJfdCBpTGVuID0gc3RyUkdCLkdldExlbmd0aCgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuOyArK2kpIHsNCi0gICAgICAgIEZYX1dDSEFSIGNoID0gc3RyUkdCLkdldEF0KGkpOw0KLSAgICAgICAgaWYgKGNoID09IEwnLCcpIHsNCi0gICAgICAgICAgICArK2lJbmRleDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpSW5kZXggPiAyKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlWYWx1ZSA9IGNoIC0gemVybzsNCi0gICAgICAgIGlmIChpVmFsdWUgPj0gMCAmJiBpVmFsdWUgPD0gOSkgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaUluZGV4KSB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIHIgPSByICogMTAgKyBpVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgZyA9IGcgKiAxMCArIGlWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgYiA9IGIgKiAxMCArIGlWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9Cb3JkZXJDb2xvcihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KLSAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gcFdpZGdldERhdGEtPkdldEJvcmRlcihUUlVFKTsNCi0gICAgaW50MzJfdCBpU2l6ZSA9IGJvcmRlci5Db3VudEVkZ2VzKCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHN0ckNvbG9yOw0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWU7DQotICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCi0gICAgICAgIHN0ckNvbG9yID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgaW50MzJfdCByID0gMCwgZyA9IDAsIGIgPSAwOw0KLSAgICAgICAgWEZBX1NUUklOR19UT19SR0Ioc3RyQ29sb3IsIHIsIGcsIGIpOw0KLSAgICAgICAgRlhfQVJHQiByZ2IgPSBBcmdiRW5jb2RlKDEwMCwgciwgZywgYik7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQotICAgICAgICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZShpKTsNCi0gICAgICAgICAgICBlZGdlLlNldENvbG9yKHJnYik7DQotICAgICAgICB9DQorY29uc3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvKiBHZXRFdmVudFBhcmFJbmZvQnlOYW1lKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXZlbnROYW1lKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSB3c0V2ZW50TmFtZS5HZXRMZW5ndGgoKTsNCisgIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NFdmVudE5hbWUuR2V0UHRyKCksIGlMZW5ndGgpOw0KKyAgY29uc3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvKiBldmVudFBhcmFJbmZvID0gTlVMTDsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgaUVuZCA9IChzaXplb2YoZ3NfZXZlbnRQYXJhSW5mb3MpIC8gc2l6ZW9mKGdzX2V2ZW50UGFyYUluZm9zWzBdKSkgLSAxOw0KKyAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgIGRvIHsNCisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIGV2ZW50UGFyYUluZm8gPSAmZ3NfZXZlbnRQYXJhSW5mb3NbaU1pZF07DQorICAgIGlmICh1SGFzaCA9PSBldmVudFBhcmFJbmZvLT5tX3VIYXNoKSB7DQorICAgICAgcmV0dXJuIGV2ZW50UGFyYUluZm87DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBldmVudFBhcmFJbmZvLT5tX3VIYXNoKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZSgwKTsNCi0gICAgICAgIEZYX0FSR0IJY29sb3IgPSBlZGdlLkdldENvbG9yKCk7DQotICAgICAgICBpbnQzMl90IGEsIHIsIGcsIGI7DQotICAgICAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByLCBnLCBiKTsNCi0gICAgICAgIHN0ckNvbG9yLkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYik7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZShzdHJDb2xvcikpOw0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KICAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gTlVMTDsNCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KK3ZvaWQgWEZBX1NUUklOR19UT19SR0IoQ0ZYX1dpZGVTdHJpbmcmIHN0clJHQiwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHIsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgYikgew0KKyAgciA9IDA7DQorICBnID0gMDsNCisgIGIgPSAwOw0KKyAgRlhfV0NIQVIgemVybyA9ICcwJzsNCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIGludDMyX3QgaUxlbiA9IHN0clJHQi5HZXRMZW5ndGgoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW47ICsraSkgew0KKyAgICBGWF9XQ0hBUiBjaCA9IHN0clJHQi5HZXRBdChpKTsNCisgICAgaWYgKGNoID09IEwnLCcpIHsNCisgICAgICArK2lJbmRleDsNCiAgICAgfQ0KLSAgICBDWEZBX0JvcmRlciBib3JkZXIgPSBwV2lkZ2V0RGF0YS0+R2V0Qm9yZGVyKFRSVUUpOw0KLSAgICBpbnQzMl90IGlTaXplID0gYm9yZGVyLkNvdW50RWRnZXMoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaGlja25lc3M7DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzVmFsdWUpOw0KLSAgICAgICAgd3NUaGlja25lc3MgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQotICAgICAgICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZShpKTsNCi0gICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IHRoaWNrbmVzcyh3c1RoaWNrbmVzcyk7DQotICAgICAgICAgICAgZWRnZS5TZXRNU1RoaWNrbmVzcyh0aGlja25lc3MpOw0KLSAgICAgICAgfQ0KKyAgICBpZiAoaUluZGV4ID4gMikgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGludDMyX3QgaVZhbHVlID0gY2ggLSB6ZXJvOw0KKyAgICBpZiAoaVZhbHVlID49IDAgJiYgaVZhbHVlIDw9IDkpIHsNCisgICAgICBzd2l0Y2ggKGlJbmRleCkgew0KKyAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICByID0gciAqIDEwICsgaVZhbHVlOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgZyA9IGcgKiAxMCArIGlWYWx1ZTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBiID0gYiAqIDEwICsgaVZhbHVlOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyQ29sb3IoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gcFdpZGdldERhdGEtPkdldEJvcmRlcihUUlVFKTsNCisgIGludDMyX3QgaVNpemUgPSBib3JkZXIuQ291bnRFZGdlcygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ29sb3I7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgIHN0ckNvbG9yID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBpbnQzMl90IHIgPSAwLCBnID0gMCwgYiA9IDA7DQorICAgIFhGQV9TVFJJTkdfVE9fUkdCKHN0ckNvbG9yLCByLCBnLCBiKTsNCisgICAgRlhfQVJHQiByZ2IgPSBBcmdiRW5jb2RlKDEwMCwgciwgZywgYik7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsNCisgICAgICBDWEZBX0VkZ2UgZWRnZSA9IGJvcmRlci5HZXRFZGdlKGkpOw0KKyAgICAgIGVkZ2UuU2V0Q29sb3IocmdiKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZSgwKTsNCisgICAgRlhfQVJHQiBjb2xvciA9IGVkZ2UuR2V0Q29sb3IoKTsNCisgICAgaW50MzJfdCBhLCByLCBnLCBiOw0KKyAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByLCBnLCBiKTsNCisgICAgc3RyQ29sb3IuRm9ybWF0KEwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUoc3RyQ29sb3IpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gcFdpZGdldERhdGEtPkdldEJvcmRlcihUUlVFKTsNCisgIGludDMyX3QgaVNpemUgPSBib3JkZXIuQ291bnRFZGdlcygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUaGlja25lc3M7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgIHdzVGhpY2tuZXNzID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQorICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZShpKTsNCisgICAgICBDWEZBX01lYXN1cmVtZW50IHRoaWNrbmVzcyh3c1RoaWNrbmVzcyk7DQorICAgICAgZWRnZS5TZXRNU1RoaWNrbmVzcyh0aGlja25lc3MpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0VkZ2UgZWRnZSA9IGJvcmRlci5HZXRFZGdlKDApOw0KKyAgICBDWEZBX01lYXN1cmVtZW50IHRoaWNrbmVzcyA9IGVkZ2UuR2V0TVNUaGlja25lc3MoKTsNCisgICAgdGhpY2tuZXNzLlRvU3RyaW5nKHdzVGhpY2tuZXNzKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NUaGlja25lc3MpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fRmlsbENvbG9yKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gcFdpZGdldERhdGEtPkdldEJvcmRlcihUUlVFKTsNCisgIENYRkFfRmlsbCBib3JkZXJmaWxsID0gYm9yZGVyLkdldEZpbGwoVFJVRSk7DQorICBDWEZBX05vZGUqIHBOb2RlID0gKENYRkFfTm9kZSopYm9yZGVyZmlsbDsNCisgIGlmICghcE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCisgICAgd3NDb2xvciA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCisgICAgaW50MzJfdCByLCBnLCBiOw0KKyAgICBYRkFfU1RSSU5HX1RPX1JHQih3c0NvbG9yLCByLCBnLCBiKTsNCisgICAgRlhfQVJHQiBjb2xvciA9IEFyZ2JFbmNvZGUoMHhmZiwgciwgZywgYik7DQorICAgIGJvcmRlcmZpbGwuU2V0Q29sb3IoY29sb3IpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhfQVJHQiBjb2xvciA9IGJvcmRlcmZpbGwuR2V0Q29sb3IoKTsNCisgICAgaW50MzJfdCBhLCByLCBnLCBiOw0KKyAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByLCBnLCBiKTsNCisgICAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0NvbG9yKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RhdGFOb2RlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghYlNldHRpbmcpIHsNCisgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBHZXRCaW5kRGF0YSgpOw0KKyAgICBpZiAocERhdGFOb2RlKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0KA0KKyAgICAgICAgICBoVmFsdWUsDQorICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBEYXRhTm9kZSkpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZSgwKTsNCi0gICAgICAgIENYRkFfTWVhc3VyZW1lbnQgdGhpY2tuZXNzID0gZWRnZS5HZXRNU1RoaWNrbmVzcygpOw0KLSAgICAgICAgdGhpY2tuZXNzLlRvU3RyaW5nKHdzVGhpY2tuZXNzKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVGhpY2tuZXNzKSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9GaWxsQ29sb3IoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfQm9yZGVyIGJvcmRlciA9IHBXaWRnZXREYXRhLT5HZXRCb3JkZXIoVFJVRSk7DQotICAgIENYRkFfRmlsbCBib3JkZXJmaWxsID0gYm9yZGVyLkdldEZpbGwoVFJVRSk7DQotICAgIENYRkFfTm9kZSAqcE5vZGUgPSAoQ1hGQV9Ob2RlKilib3JkZXJmaWxsOw0KLSAgICBpZiAoIXBOb2RlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQotICAgICAgICB3c0NvbG9yID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgaW50MzJfdCByLCBnLCBiOw0KLSAgICAgICAgWEZBX1NUUklOR19UT19SR0Iod3NDb2xvciwgciwgZywgYik7DQotICAgICAgICBGWF9BUkdCIGNvbG9yID0gQXJnYkVuY29kZSgweGZmLCByLCBnLCBiKTsNCi0gICAgICAgIGJvcmRlcmZpbGwuU2V0Q29sb3IoY29sb3IpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhfQVJHQiBjb2xvciA9IGJvcmRlcmZpbGwuR2V0Q29sb3IoKTsNCi0gICAgICAgIGludDMyX3QgYSwgciwgZywgYjsNCi0gICAgICAgIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHIsIGcsIGIpOw0KLSAgICAgICAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NDb2xvcikpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RhdGFOb2RlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmICghYlNldHRpbmcpIHsNCi0gICAgICAgIENYRkFfTm9kZSAqcERhdGFOb2RlID0gR2V0QmluZERhdGEoKTsNCi0gICAgICAgIGlmIChwRGF0YU5vZGUpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwRGF0YU5vZGUpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0RyYXdfRGVmYXVsdFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhoVmFsdWUpKSB7DQotICAgICAgICAgICAgQ1hGQV9XaWRnZXREYXRhICpwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgICAgICAgICBGWFNZU19hc3NlcnQocFdpZGdldERhdGEpOw0KLSAgICAgICAgICAgIFhGQV9FTEVNRU5UIHVpVHlwZSA9IHBXaWRnZXREYXRhLT5HZXRVSVR5cGUoKTsNCi0gICAgICAgICAgICBpZiAodWlUeXBlID09IFhGQV9FTEVNRU5UX1RleHQpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV3VmFsdWU7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIG5ld1ZhbHVlKTsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXdWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChuZXdWYWx1ZSwgbmV3VmFsdWUuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzTmV3VmFsdWUpOw0KLSAgICAgICAgICAgICAgICBTZXRTY3JpcHRDb250ZW50KHdzTmV3VmFsdWUsIHdzRm9ybWF0VmFsdWUsIFRSVUUsIFRSVUUpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZih1aVR5cGUgIT0gWEZBX0VMRU1FTlRfSW1hZ2UpIHsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyBjb250ZW50ID0gR2V0U2NyaXB0Q29udGVudChUUlVFKTsNCi0gICAgICAgIGlmKGNvbnRlbnQuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZShjb250ZW50LCBjb250ZW50LkdldExlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9EZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChoVmFsdWUpKSB7DQotICAgICAgICAgICAgcFdpZGdldERhdGEtPm1fYlByZU51bGwgPSBwV2lkZ2V0RGF0YS0+bV9iSXNOdWxsOw0KLSAgICAgICAgICAgIHBXaWRnZXREYXRhLT5tX2JJc051bGwgPSBUUlVFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwV2lkZ2V0RGF0YS0+bV9iUHJlTnVsbCA9IHBXaWRnZXREYXRhLT5tX2JJc051bGw7DQotICAgICAgICAgICAgcFdpZGdldERhdGEtPm1fYklzTnVsbCA9IEZBTFNFOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRHJhd19EZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGhWYWx1ZSkpIHsNCisgICAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICAgIEZYU1lTX2Fzc2VydChwV2lkZ2V0RGF0YSk7DQorICAgICAgWEZBX0VMRU1FTlQgdWlUeXBlID0gcFdpZGdldERhdGEtPkdldFVJVHlwZSgpOw0KKyAgICAgIGlmICh1aVR5cGUgPT0gWEZBX0VMRU1FTlRfVGV4dCkgew0KICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV3VmFsdWU7DQotICAgICAgICBpZiAoIShGWEpTRV9WYWx1ZV9Jc051bGwoaFZhbHVlKSB8fCBGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChoVmFsdWUpKSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIG5ld1ZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VGV4dCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChuZXdWYWx1ZSwgbmV3VmFsdWUuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgQ1hGQV9Ob2RlICpwVUlDaGlsZCA9IHBXaWRnZXREYXRhLT5HZXRVSUNoaWxkKCk7DQotICAgICAgICBpZiAocFVJQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCkgew0KLSAgICAgICAgICAgIGludDMyX3QgaUxlYWREaWdpdHMgPSAwOw0KLSAgICAgICAgICAgIGludDMyX3QgaUZyYWNEaWdpdHMgPSAwOw0KLSAgICAgICAgICAgIHBXaWRnZXREYXRhLT5HZXRMZWFkRGlnaXRzKGlMZWFkRGlnaXRzKTsNCi0gICAgICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0RnJhY0RpZ2l0cyhpRnJhY0RpZ2l0cyk7DQotICAgICAgICAgICAgd3NOZXdUZXh0ID0gWEZBX051bWVyaWNMaW1pdCh3c05ld1RleHQsIGlMZWFkRGlnaXRzLCBpRnJhY0RpZ2l0cyk7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX1dpZGdldERhdGEqIHBDb250YWluZXJXaWRnZXREYXRhID0gR2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRUZXh0KHdzTmV3VGV4dCk7DQotICAgICAgICBpZiAocENvbnRhaW5lcldpZGdldERhdGEpIHsNCi0gICAgICAgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzTmV3VGV4dCwgd3NGb3JtYXRUZXh0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIFNldFNjcmlwdENvbnRlbnQod3NOZXdUZXh0LCB3c0Zvcm1hdFRleHQsIFRSVUUsIFRSVUUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgbmV3VmFsdWUpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXdWYWx1ZSA9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KG5ld1ZhbHVlLCBuZXdWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzTmV3VmFsdWUpOw0KKyAgICAgICAgU2V0U2NyaXB0Q29udGVudCh3c05ld1ZhbHVlLCB3c0Zvcm1hdFZhbHVlLCBUUlVFLCBUUlVFKTsNCisgICAgICB9IGVsc2UgaWYgKHVpVHlwZSAhPSBYRkFfRUxFTUVOVF9JbWFnZSkgew0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgY29udGVudCA9IEdldFNjcmlwdENvbnRlbnQoVFJVRSk7DQorICAgIGlmIChjb250ZW50LklzRW1wdHkoKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoaFZhbHVlKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNvbnRlbnQgPSBHZXRTY3JpcHRDb250ZW50KFRSVUUpOw0KLSAgICAgICAgaWYoY29udGVudC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VVEY4RW5jb2RlKGNvbnRlbnQsIGNvbnRlbnQuR2V0TGVuZ3RoKCkpKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0RlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChoVmFsdWUpKSB7DQorICAgICAgcFdpZGdldERhdGEtPm1fYlByZU51bGwgPSBwV2lkZ2V0RGF0YS0+bV9iSXNOdWxsOw0KKyAgICAgIHBXaWRnZXREYXRhLT5tX2JJc051bGwgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBXaWRnZXREYXRhLT5tX2JQcmVOdWxsID0gcFdpZGdldERhdGEtPm1fYklzTnVsbDsNCisgICAgICBwV2lkZ2V0RGF0YS0+bV9iSXNOdWxsID0gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgbmV3VmFsdWU7DQorICAgIGlmICghKEZYSlNFX1ZhbHVlX0lzTnVsbChoVmFsdWUpIHx8IEZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGhWYWx1ZSkpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgbmV3VmFsdWUpOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VGV4dCA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgobmV3VmFsdWUsIG5ld1ZhbHVlLkdldExlbmd0aCgpKTsNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IHBXaWRnZXREYXRhLT5HZXRVSUNoaWxkKCk7DQorICAgIGlmIChwVUlDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0KSB7DQorICAgICAgaW50MzJfdCBpTGVhZERpZ2l0cyA9IDA7DQorICAgICAgaW50MzJfdCBpRnJhY0RpZ2l0cyA9IDA7DQorICAgICAgcFdpZGdldERhdGEtPkdldExlYWREaWdpdHMoaUxlYWREaWdpdHMpOw0KKyAgICAgIHBXaWRnZXREYXRhLT5HZXRGcmFjRGlnaXRzKGlGcmFjRGlnaXRzKTsNCisgICAgICB3c05ld1RleHQgPSBYRkFfTnVtZXJpY0xpbWl0KHdzTmV3VGV4dCwgaUxlYWREaWdpdHMsIGlGcmFjRGlnaXRzKTsNCisgICAgfQ0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBDb250YWluZXJXaWRnZXREYXRhID0gR2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFRleHQod3NOZXdUZXh0KTsNCisgICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQorICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c05ld1RleHQsIHdzRm9ybWF0VGV4dCk7DQorICAgIH0NCisgICAgU2V0U2NyaXB0Q29udGVudCh3c05ld1RleHQsIHdzRm9ybWF0VGV4dCwgVFJVRSwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZyBjb250ZW50ID0gR2V0U2NyaXB0Q29udGVudChUUlVFKTsNCisgICAgaWYgKGNvbnRlbnQuSXNFbXB0eSgpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBwV2lkZ2V0RGF0YS0+R2V0VUlDaGlsZCgpOw0KKyAgICAgIFhGQV9FTEVNRU5UIGVVSSA9IHBVSUNoaWxkLT5HZXRDbGFzc0lEKCk7DQorICAgICAgQ1hGQV9WYWx1ZSBkZWZWYWwgPSBwV2lkZ2V0RGF0YS0+R2V0Rm9ybVZhbHVlKCk7DQorICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IGRlZlZhbC5HZXROb2RlKCktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICBpZiAocE5vZGUgJiYgcE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EZWNpbWFsKSB7DQorICAgICAgICBpZiAoZVVJID09IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0ICYmDQorICAgICAgICAgICAgKHBOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cykgPT0gLTEpKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoDQorICAgICAgICAgICAgICBoVmFsdWUsIEZYX1VURjhFbmNvZGUoY29udGVudCwgY29udGVudC5HZXRMZW5ndGgoKSkpOw0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUgKnBVSUNoaWxkID0gcFdpZGdldERhdGEtPkdldFVJQ2hpbGQoKTsNCi0gICAgICAgICAgICBYRkFfRUxFTUVOVCBlVUkgPSBwVUlDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KLSAgICAgICAgICAgIENYRkFfVmFsdWUgZGVmVmFsID0gcFdpZGdldERhdGEtPkdldEZvcm1WYWx1ZSgpOw0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBkZWZWYWwuR2V0Tm9kZSgpLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICAgICAgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGVjaW1hbCkgew0KLSAgICAgICAgICAgICAgICBpZihlVUkgPT0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQgICYmIChwTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMpID09IC0xKSkgew0KLSAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUoY29udGVudCwgY29udGVudC5HZXRMZW5ndGgoKSkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0RlY2ltYWwgZGVjaW1hbChjb250ZW50KTsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGhWYWx1ZSwgKEZYX0ZMT0FUKShkb3VibGUpZGVjaW1hbCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSW50ZWdlcikgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgRlhTWVNfd3RvaShjb250ZW50KSkJOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocE5vZGUgJiYgcE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Cb29sZWFuKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBGWFNZU193dG9pKGNvbnRlbnQpID09IDAgPyBGQUxTRSA6IFRSVUUpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocE5vZGUgJiYgcE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9GbG9hdCkgew0KLSAgICAgICAgICAgICAgICBDRlhfRGVjaW1hbCBkZWNpbWFsKGNvbnRlbnQpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChoVmFsdWUsIChGWF9GTE9BVCkoZG91YmxlKWRlY2ltYWwpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKGNvbnRlbnQsIGNvbnRlbnQuR2V0TGVuZ3RoKCkpKTsNCi0gICAgICAgICAgICB9DQorICAgICAgICAgIENGWF9EZWNpbWFsIGRlY2ltYWwoY29udGVudCk7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGhWYWx1ZSwgKEZYX0ZMT0FUKShkb3VibGUpZGVjaW1hbCk7DQogICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmIChwTm9kZSAmJiBwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0ludGVnZXIpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBGWFNZU193dG9pKGNvbnRlbnQpKTsNCisgICAgICB9IGVsc2UgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQm9vbGVhbikgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIEZYU1lTX3d0b2koY29udGVudCkgPT0gMCA/IEZBTFNFIDogVFJVRSk7DQorICAgICAgfSBlbHNlIGlmIChwTm9kZSAmJiBwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Zsb2F0KSB7DQorICAgICAgICBDRlhfRGVjaW1hbCBkZWNpbWFsKGNvbnRlbnQpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoaFZhbHVlLCAoRlhfRkxPQVQpKGRvdWJsZSlkZWNpbWFsKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VURjhFbmNvZGUoY29udGVudCwgY29udGVudC5HZXRMZW5ndGgoKSkpOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0VkaXRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRWRpdFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgIHBXaWRnZXREYXRhLT5TZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOw0KKyAgfSBlbHNlIHsNCisgICAgcFdpZGdldERhdGEtPkdldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fRm9udENvbG9yKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Gb250IGZvbnQgPSBwV2lkZ2V0RGF0YS0+R2V0Rm9udChUUlVFKTsNCisgIENYRkFfTm9kZSogcE5vZGUgPSAoQ1hGQV9Ob2RlKilmb250Ow0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbG9yOw0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWU7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzVmFsdWUpOw0KKyAgICB3c0NvbG9yID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBpbnQzMl90IHIsIGcsIGI7DQorICAgIFhGQV9TVFJJTkdfVE9fUkdCKHdzQ29sb3IsIHIsIGcsIGIpOw0KKyAgICBGWF9BUkdCIGNvbG9yID0gQXJnYkVuY29kZSgweGZmLCByLCBnLCBiKTsNCisgICAgZm9udC5TZXRDb2xvcihjb2xvcik7DQorICB9IGVsc2Ugew0KKyAgICBGWF9BUkdCIGNvbG9yID0gZm9udC5HZXRDb2xvcigpOw0KKyAgICBpbnQzMl90IGEsIHIsIGcsIGI7DQorICAgIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHIsIGcsIGIpOw0KKyAgICB3c0NvbG9yLkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYik7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzQ29sb3IpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9Gb3JtYXRNZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X1NvbV9NZXNzYWdlKGhWYWx1ZSwgYlNldHRpbmcsIFhGQV9TT01fRm9ybWF0TWVzc2FnZSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRm9ybWF0dGVkVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgIHBXaWRnZXREYXRhLT5TZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgfSBlbHNlIHsNCisgICAgcFdpZGdldERhdGEtPkdldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSA9IHBXaWRnZXREYXRhLT5HZXRWYWxpZGF0ZShUUlVFKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgIHZhbGlkYXRlLlNldE51bGxUZXN0KHdzVmFsdWUpOw0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBpVmFsdWUgPSB2YWxpZGF0ZS5HZXROdWxsVGVzdCgpOw0KKyAgICBYRkFfTFBDQVRUUklCVVRFRU5VTUlORk8gcEluZm8gPQ0KKyAgICAgICAgWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKChYRkFfQVRUUklCVVRFRU5VTSlpVmFsdWUpOw0KKyAgICBpZiAocEluZm8pIHsNCisgICAgICB3c1ZhbHVlID0gcEluZm8tPnBOYW1lOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5TWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X1NvbV9NZXNzYWdlKGhWYWx1ZSwgYlNldHRpbmcsIFhGQV9TT01fTWFuZGF0b3J5TWVzc2FnZSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfUGFyZW50U3ViZm9ybShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1NlbGVjdGVkSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgaW50MzJfdCBpSW5kZXggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCisgICAgaWYgKGlJbmRleCA9PSAtMSkgew0KKyAgICAgIHBXaWRnZXREYXRhLT5DbGVhckFsbFNlbGVjdGlvbnMoKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcFdpZGdldERhdGEtPlNldEl0ZW1TdGF0ZShpSW5kZXgsIFRSVUUsIFRSVUUsIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIHBXaWRnZXREYXRhLT5HZXRTZWxlY3RlZEl0ZW0oKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQ2xlYXJJdGVtcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwV2lkZ2V0RGF0YS0+RGVsZXRlSXRlbSgtMSwgVFJVRSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBldmVudFN0cmluZyA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIGludDMyX3QgaVJldCA9IGV4ZWNTaW5nbGVFdmVudEJ5TmFtZSgNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChldmVudFN0cmluZywgZXZlbnRTdHJpbmcuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgWEZBX0VMRU1FTlRfRmllbGQpOw0KKyAgICBpZiAoZXZlbnRTdHJpbmcgPT0gRlhfQlNUUkMoInZhbGlkYXRlIikpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlSZXQgPT0gWEZBX0VWRU5URVJST1JfRXJyb3IpID8gRkFMU0UgOiBUUlVFKSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZXhlY0V2ZW50Iik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9Jbml0aWFsaXplLCBGQUxTRSwgRkFMU0UpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjSW5pdGlhbGl6ZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0RlbGV0ZUl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZGVsZXRlSXRlbSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KKyAgRlhfQk9PTCBiVmFsdWUgPSBwV2lkZ2V0RGF0YS0+RGVsZXRlSXRlbShpSW5kZXgsIFRSVUUsIFRSVUUpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiVmFsdWUpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldFNhdmVJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImdldFNhdmVJdGVtIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICBpZiAoaUluZGV4IDwgMCkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgRlhfQk9PTCBiSGFzSXRlbSA9IHBXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0SXRlbSh3c1ZhbHVlLCBpSW5kZXgsIFRSVUUpOw0KKyAgaWYgKGJIYXNJdGVtKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VVEY4RW5jb2RlKHdzVmFsdWUsIHdzVmFsdWUuR2V0TGVuZ3RoKCkpKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQm91bmRJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImJvdW5kSXRlbSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQm91bmRWYWx1ZTsNCisgIHBXaWRnZXREYXRhLT5HZXRJdGVtVmFsdWUod3NWYWx1ZSwgd3NCb3VuZFZhbHVlKTsNCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0JvdW5kVmFsdWUpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9HZXRJdGVtU3RhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZ2V0SXRlbVN0YXRlIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICBGWF9CT09MIGJWYWx1ZSA9IHBXaWRnZXREYXRhLT5HZXRJdGVtU3RhdGUoaUluZGV4KTsNCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgYlZhbHVlKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfQ2FsY3VsYXRlLCBGQUxTRSwgRkFMU0UpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjQ2FsY3VsYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfU2V0SXRlbXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykge30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldERpc3BsYXlJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImdldERpc3BsYXlJdGVtIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICBpZiAoaUluZGV4IDwgMCkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgRlhfQk9PTCBiSGFzSXRlbSA9IHBXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0SXRlbSh3c1ZhbHVlLCBpSW5kZXgsIEZBTFNFKTsNCisgIGlmIChiSGFzSXRlbSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVVRGOEVuY29kZSh3c1ZhbHVlLCB3c1ZhbHVlLkdldExlbmd0aCgpKSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1NldEl0ZW1TdGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDIpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJzZXRJdGVtU3RhdGUiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgIEZYX0JPT0wgYkFkZCA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICBpZiAoYkFkZCkgew0KKyAgICBwV2lkZ2V0RGF0YS0+U2V0SXRlbVN0YXRlKGlJbmRleCwgVFJVRSwgVFJVRSwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBpZiAocFdpZGdldERhdGEtPkdldEl0ZW1TdGF0ZShpSW5kZXgpKSB7DQorICAgICAgcFdpZGdldERhdGEtPlNldEl0ZW1TdGF0ZShpSW5kZXgsIEZBTFNFLCBUUlVFLCBUUlVFKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0FkZEl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDIpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJhZGRJdGVtIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzTGFiZWw7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0xhYmxlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgd3NMYWJlbCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0xhYmxlLCBic0xhYmxlLkdldExlbmd0aCgpKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQorICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICB9DQorICBwV2lkZ2V0RGF0YS0+SW5zZXJ0SXRlbSh3c0xhYmVsLCB3c1ZhbHVlLCAtMSwgVFJVRSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGludDMyX3QgaVJldCA9DQorICAgICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9WYWxpZGF0ZSwgRkFMU0UsIEZBTFNFKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlSZXQgPT0gWEZBX0VWRU5URVJST1JfRXJyb3IpID8gRkFMU0UgOiBUUlVFKSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZXhlY1ZhbGlkYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0Vycm9yVGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghYlNldHRpbmcpIHsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0RlZmF1bHRBbmRSYXdWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiU2V0dGluZykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCisgICAgcFdpZGdldERhdGEtPlNldFNlbGVjdGVkTWVtYmVyQnlWYWx1ZSgNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKSwgVFJVRSwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gR2V0U2NyaXB0Q29udGVudChUUlVFKTsNCisgICAgWEZBX1ZFUlNJT04gY3VyVmVyc2lvbiA9IEdldERvY3VtZW50KCktPkdldEN1clZlcnNpb25Nb2RlKCk7DQorICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSAmJiBjdXJWZXJzaW9uID49IFhGQV9WRVJTSU9OXzMwMCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoaFZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1ZhbHVlKSk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfVHJhbnNpZW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjRXZlbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGV2ZW50U3RyaW5nID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgZXhlY1NpbmdsZUV2ZW50QnlOYW1lKA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGV2ZW50U3RyaW5nLCBldmVudFN0cmluZy5HZXRMZW5ndGgoKSksDQorICAgICAgICBYRkFfRUxFTUVOVF9FeGNsR3JvdXApOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleGVjRXZlbnQiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfU2VsZWN0ZWRNZW1iZXIoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPT0gMCkgfHwgKGFyZ2MgPT0gMSkpIHsNCiAgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCiAgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzVmFsdWUpOw0KLSAgICAgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCi0gICAgICAgIHBXaWRnZXREYXRhLT5TZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0VmFsdWUod3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9Gb250Q29sb3IoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfRm9udCBmb250ID0gcFdpZGdldERhdGEtPkdldEZvbnQoVFJVRSk7DQotICAgIENYRkFfTm9kZSAqcE5vZGUgPSAoQ1hGQV9Ob2RlKilmb250Ow0KLSAgICBpZiAoIXBOb2RlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQotICAgICAgICB3c0NvbG9yID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgaW50MzJfdCByLCBnLCBiOw0KLSAgICAgICAgWEZBX1NUUklOR19UT19SR0Iod3NDb2xvciwgciwgZywgYik7DQotICAgICAgICBGWF9BUkdCIGNvbG9yID0gQXJnYkVuY29kZSgweGZmLCByLCBnLCBiKTsNCi0gICAgICAgIGZvbnQuU2V0Q29sb3IoY29sb3IpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhfQVJHQiBjb2xvciA9IGZvbnQuR2V0Q29sb3IoKTsNCi0gICAgICAgIGludDMyX3QgYSwgciwgZywgYjsNCi0gICAgICAgIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHIsIGcsIGIpOw0KLSAgICAgICAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NDb2xvcikpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRm9ybWF0TWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBTY3JpcHRfU29tX01lc3NhZ2UoaFZhbHVlLCBiU2V0dGluZywgWEZBX1NPTV9Gb3JtYXRNZXNzYWdlKTsNCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9Gb3JtYXR0ZWRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KLSAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQotICAgICAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgcFdpZGdldERhdGEtPlNldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0VmFsdWUod3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9NYW5kYXRvcnkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfVmFsaWRhdGUgdmFsaWRhdGUgPSBwV2lkZ2V0RGF0YS0+R2V0VmFsaWRhdGUoVFJVRSk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzVmFsdWUpOw0KLSAgICAgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCi0gICAgICAgIHZhbGlkYXRlLlNldE51bGxUZXN0KHdzVmFsdWUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaW50MzJfdCBpVmFsdWUgPSB2YWxpZGF0ZS5HZXROdWxsVGVzdCgpOw0KLSAgICAgICAgWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPIHBJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKChYRkFfQVRUUklCVVRFRU5VTSlpVmFsdWUpOw0KLSAgICAgICAgaWYgKHBJbmZvKSB7DQotICAgICAgICAgICAgd3NWYWx1ZSA9IHBJbmZvLT5wTmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9NYW5kYXRvcnlNZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIFNjcmlwdF9Tb21fTWVzc2FnZShoVmFsdWUsIGJTZXR0aW5nLCBYRkFfU09NX01hbmRhdG9yeU1lc3NhZ2UpOw0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1BhcmVudFN1YmZvcm0oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfU2VsZWN0ZWRJbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KLSAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBpbnQzMl90IGlJbmRleCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihoVmFsdWUpOw0KLSAgICAgICAgaWYgKGlJbmRleCA9PSAtMSkgew0KLSAgICAgICAgICAgIHBXaWRnZXREYXRhLT5DbGVhckFsbFNlbGVjdGlvbnMoKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBwV2lkZ2V0RGF0YS0+U2V0SXRlbVN0YXRlKGlJbmRleCwgVFJVRSwgVFJVRSwgVFJVRSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgcFdpZGdldERhdGEtPkdldFNlbGVjdGVkSXRlbSgpKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0NsZWFySXRlbXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQotICAgIGlmICghcFdpZGdldERhdGEpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwV2lkZ2V0RGF0YS0+RGVsZXRlSXRlbSgtMSwgVFJVRSk7DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZXZlbnRTdHJpbmcgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KLSAgICAgICAgaW50MzJfdCBpUmV0ID0gZXhlY1NpbmdsZUV2ZW50QnlOYW1lKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChldmVudFN0cmluZywgZXZlbnRTdHJpbmcuR2V0TGVuZ3RoKCkpLCBYRkFfRUxFTUVOVF9GaWVsZCk7DQotICAgICAgICBpZiAoZXZlbnRTdHJpbmcgPT0gRlhfQlNUUkMoInZhbGlkYXRlIikpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksICgoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9FcnJvcikgPyBGQUxTRSA6IFRSVUUpKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZXhlY0V2ZW50Iik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9Jbml0aWFsaXplLCBGQUxTRSwgRkFMU0UpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleGVjSW5pdGlhbGl6ZSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRGVsZXRlSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZGVsZXRlSXRlbSIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQotICAgIGlmICghcFdpZGdldERhdGEpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KLSAgICBGWF9CT09MIGJWYWx1ZSA9IHBXaWRnZXREYXRhLT5EZWxldGVJdGVtKGlJbmRleCwgVFJVRSwgVFJVRSk7DQotICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KLSAgICBpZiAoaFZhbHVlKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgYlZhbHVlKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldFNhdmVJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggIT0gMSkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJnZXRTYXZlSXRlbSIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQotICAgIGlmIChpSW5kZXggPCAwKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwUmV0dXJuTm9kZSA9IE5VTEw7DQorICAgICAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICAgICAgcFJldHVybk5vZGUgPSBwV2lkZ2V0RGF0YS0+R2V0U2VsZWN0ZWRNZW1iZXIoKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pOYW1lOw0KKyAgICAgICAgc3pOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgICAgIHBSZXR1cm5Ob2RlID0gcFdpZGdldERhdGEtPlNldFNlbGVjdGVkTWVtYmVyKA0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUsIHN6TmFtZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgIH0NCisgICAgICBpZiAocFJldHVybk5vZGUpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldCgNCisgICAgICAgICAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBSZXR1cm5Ob2RlKSk7DQorICAgICAgfSBlbHNlIHsNCiAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICByZXR1cm47DQorICAgICAgfQ0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInNlbGVjdGVkTWVtYmVyIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImV4ZWNJbml0aWFsaXplIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjQ2FsY3VsYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpbnQzMl90IGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfVmFsaWRhdGUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9FcnJvcikgPyBGQUxTRSA6IFRSVUUpKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjVmFsaWRhdGUiKTsNCisgIH0NCit9DQorc3RhdGljIENYRkFfTm9kZSogWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKENYRkFfTm9kZSogcEluc3RNZ3JOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleCkgew0KKyAgQVNTRVJUKHBJbnN0TWdyTm9kZSk7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBGWF9EV09SRCBkd05hbWVIYXNoID0gMDsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgWEZBX0VMRU1FTlQgZUN1clR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoZUN1clR5cGUgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKChlQ3VyVHlwZSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtKSAmJg0KKyAgICAgICAgKGVDdXJUeXBlICE9IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZSA9IHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0luc3ROYW1lID0gcEluc3RNZ3JOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgIGlmICh3c0luc3ROYW1lLkdldExlbmd0aCgpIDwgMSB8fCB3c0luc3ROYW1lLkdldEF0KDApICE9ICdfJyB8fA0KKyAgICAgICAgICB3c0luc3ROYW1lLk1pZCgxKSAhPSB3c05hbWUpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBkd05hbWVIYXNoID0gcE5vZGUtPkdldE5hbWVIYXNoKCk7DQorICAgIH0NCisgICAgaWYgKGR3TmFtZUhhc2ggIT0gcE5vZGUtPkdldE5hbWVIYXNoKCkpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpQ291bnQrKzsNCisgICAgaWYgKGlDb3VudCA+IGlJbmRleCkgew0KKyAgICAgIHJldHVybiBwTm9kZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0luc3RhbmNlSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBpbnQzMl90IGlUbyA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihoVmFsdWUpOw0KKyAgICBpbnQzMl90IGlGcm9tID0gU3ViZm9ybV9hbmRfU3ViZm9ybVNldF9JbnN0YW5jZUluZGV4KCk7DQorICAgIENYRkFfTm9kZSogcE1hbmFnZXJOb2RlID0gTlVMTDsNCisgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKTsNCisgICAgICAgICBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpKSB7DQorICAgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQorICAgICAgICBwTWFuYWdlck5vZGUgPSBwTm9kZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocE1hbmFnZXJOb2RlKSB7DQorICAgICAgcE1hbmFnZXJOb2RlLT5JbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlKGlUbywgaUZyb20pOw0KKyAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgQ1hGQV9Ob2RlKiBwVG9JbnN0YW5jZSA9DQorICAgICAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbShwTWFuYWdlck5vZGUsIGlUbyk7DQorICAgICAgaWYgKHBUb0luc3RhbmNlICYmIHBUb0luc3RhbmNlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgcE5vdGlmeS0+UnVuU3ViZm9ybUluZGV4Q2hhbmdlKHBUb0luc3RhbmNlKTsNCisgICAgICB9DQorICAgICAgQ1hGQV9Ob2RlKiBwRnJvbUluc3RhbmNlID0NCisgICAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHBNYW5hZ2VyTm9kZSwgaUZyb20pOw0KKyAgICAgIGlmIChwRnJvbUluc3RhbmNlICYmIHBGcm9tSW5zdGFuY2UtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocEZyb21JbnN0YW5jZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgU3ViZm9ybV9hbmRfU3ViZm9ybVNldF9JbnN0YW5jZUluZGV4KCkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fSW5zdGFuY2VNYW5hZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoIWJTZXR0aW5nKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWUgPSB0aGlzLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICBDWEZBX05vZGUqIHBJbnN0YW5jZU1nciA9IE5VTEw7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QcmV2U2libGluZyk7DQorICAgICAgICAgcE5vZGUgIT0gTlVMTDsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKSkgew0KKyAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcikgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zdE1nck5hbWUgPSBwTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCisgICAgICAgIGlmICh3c0luc3RNZ3JOYW1lLkdldExlbmd0aCgpID49IDEgJiYgd3NJbnN0TWdyTmFtZS5HZXRBdCgwKSA9PSAnXycgJiYNCisgICAgICAgICAgICB3c0luc3RNZ3JOYW1lLk1pZCgxKSA9PSB3c05hbWUpIHsNCisgICAgICAgICAgcEluc3RhbmNlTWdyID0gcE5vZGU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBJbnN0YW5jZU1ncikgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldCgNCisgICAgICAgICAgaFZhbHVlLA0KKyAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwSW5zdGFuY2VNZ3IpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9Mb2NhbGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0xvY2FsZU5hbWU7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzTG9jYWxlTmFtZSk7DQorICAgIHRoaXMtPlNldENEYXRhKA0KKyAgICAgICAgWEZBX0FUVFJJQlVURV9Mb2NhbGUsDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNMb2NhbGVOYW1lLCBic0xvY2FsZU5hbWUuR2V0TGVuZ3RoKCkpLCBUUlVFLA0KKyAgICAgICAgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0xvY2FsZU5hbWU7DQorICAgIEdldExvY2FsZU5hbWUod3NMb2NhbGVOYW1lKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZygNCisgICAgICAgIGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0xvY2FsZU5hbWUsIHdzTG9jYWxlTmFtZS5HZXRMZW5ndGgoKSkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBldmVudFN0cmluZyA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIGV4ZWNTaW5nbGVFdmVudEJ5TmFtZSgNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChldmVudFN0cmluZywgZXZlbnRTdHJpbmcuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImV4ZWNFdmVudCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9Jbml0aWFsaXplKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZXhlY0luaXRpYWxpemUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjQ2FsY3VsYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaW50MzJfdCBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX1ZhbGlkYXRlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlSZXQgPT0gWEZBX0VWRU5URVJST1JfRXJyb3IpID8gRkFMU0UgOiBUUlVFKSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZXhlY1ZhbGlkYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9HZXRJbnZhbGlkT2JqZWN0cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZ2V0SW52YWxpZE9iamVjdHMiKTsNCisgIH0NCit9DQoraW50MzJfdCBDWEZBX05vZGU6OlN1YmZvcm1fYW5kX1N1YmZvcm1TZXRfSW5zdGFuY2VJbmRleCgpIHsNCisgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKTsgcE5vZGUgIT0gTlVMTDsNCisgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKSkgew0KKyAgICBpZiAoKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgfHwNCisgICAgICAgIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpKSB7DQorICAgICAgaW5kZXgrKzsNCisgICAgfSBlbHNlIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGluZGV4Ow0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0Zvcm1Ob2RlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZm9ybU5vZGVzIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfUmVtZXJnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgICAgbV9wRG9jdW1lbnQtPkRvRGF0YVJlbWVyZ2UoVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlbWVyZ2UiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCiAgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCiAgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICBGWF9CT09MIGJIYXNJdGVtID0gcFdpZGdldERhdGEtPkdldENob2ljZUxpc3RJdGVtKHdzVmFsdWUsIGlJbmRleCwgVFJVRSk7DQotICAgIGlmIChiSGFzSXRlbSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUsIHdzVmFsdWUuR2V0TGVuZ3RoKCkpKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBUUlVFKTsNCiAgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjSW5pdGlhbGl6ZSIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0JvdW5kSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiYm91bmRJdGVtIik7DQotICAgICAgICByZXR1cm47DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9DcmVhdGVOb2RlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCA0KSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyBzdHJUYWdOYW1lOw0KKyAgICBDRlhfV2lkZVN0cmluZyBzdHJOYW1lOw0KKyAgICBDRlhfV2lkZVN0cmluZyBzdHJOYW1lU3BhY2U7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzVGFnTmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIHN0clRhZ05hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNUYWdOYW1lLCBic1RhZ05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICAgIHN0ck5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lLCBic05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZVNwYWNlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygyKTsNCisgICAgICAgIHN0ck5hbWVTcGFjZSA9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTmFtZVNwYWNlLCBic05hbWVTcGFjZS5HZXRMZW5ndGgoKSk7DQorICAgICAgfQ0KICAgICB9DQorICAgIFhGQV9MUENFTEVNRU5USU5GTyBwRWxlbWVudCA9IFhGQV9HZXRFbGVtZW50QnlOYW1lKHN0clRhZ05hbWUpOw0KKyAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0gQ3JlYXRlU2FtZVBhY2tldE5vZGUocEVsZW1lbnQtPmVOYW1lKTsNCisgICAgaWYgKCFwTmV3Tm9kZSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKCFzdHJOYW1lLklzRW1wdHkoKSkgew0KKyAgICAgICAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVPZkVsZW1lbnQocEVsZW1lbnQtPmVOYW1lLCBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX1VOS05PV04pKSB7DQorICAgICAgICAgIHBOZXdOb2RlLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCBzdHJOYW1lLCBUUlVFKTsNCisgICAgICAgICAgaWYgKHBOZXdOb2RlLT5HZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCisgICAgICAgICAgICBwTmV3Tm9kZS0+Q3JlYXRlWE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoDQorICAgICAgICAgICAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5ld05vZGUpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfTk9UX0hBVkVfUFJPUEVSVFksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopc3RyVGFnTmFtZSwgTCJuYW1lIik7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldCgNCisgICAgICAgICAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOZXdOb2RlKSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImNyZWF0ZU5vZGUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZWNhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgRlhfQk9PTCBiU2NyaXB0RmxhZ3MgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJyZWNhbGN1bGF0ZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQogICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQogICAgIGlmICghcFdpZGdldERhdGEpIHsNCi0gICAgICAgIHJldHVybjsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIFRSVUUpOw0KICAgICB9DQotICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0JvdW5kVmFsdWU7DQotICAgIHBXaWRnZXREYXRhLT5HZXRJdGVtVmFsdWUod3NWYWx1ZSwgd3NCb3VuZFZhbHVlKTsNCi0gICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQotICAgIGlmIChoVmFsdWUpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzQm91bmRWYWx1ZSkpOw0KLSAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImV4ZWNDYWxjdWxhdGUiKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9HZXRJdGVtU3RhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCAhPSAxKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImdldEl0ZW1TdGF0ZSIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQogICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQogICAgIGlmICghcFdpZGdldERhdGEpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KLSAgICBGWF9CT09MIGJWYWx1ZSA9IHBXaWRnZXREYXRhLT5HZXRJdGVtU3RhdGUoaUluZGV4KTsNCi0gICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQotICAgIGlmIChoVmFsdWUpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiVmFsdWUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUsIEZBTFNFLCBGQUxTRSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImV4ZWNDYWxjdWxhdGUiKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIFRSVUUpOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImV4ZWNWYWxpZGF0ZSIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1NldEl0ZW1zKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldERpc3BsYXlJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggIT0gMSkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJnZXREaXNwbGF5SXRlbSIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQotICAgIGlmIChpSW5kZXggPCAwKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9NYW5pZmVzdF9FdmFsdWF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCiAgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCiAgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICBGWF9CT09MIGJIYXNJdGVtID0gcFdpZGdldERhdGEtPkdldENob2ljZUxpc3RJdGVtKHdzVmFsdWUsIGlJbmRleCwgRkFMU0UpOw0KLSAgICBpZiAoYkhhc0l0ZW0pIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRlhfVVRGOEVuY29kZSh3c1ZhbHVlLCB3c1ZhbHVlLkdldExlbmd0aCgpKSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgVFJVRSk7DQogICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZXZhbHVhdGUiKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9TZXRJdGVtU3RhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCAhPSAyKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInNldEl0ZW1TdGF0ZSIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQotICAgIGlmICghcFdpZGdldERhdGEpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KLSAgICBGWF9CT09MIGJBZGQgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KLSAgICBpZiAoYkFkZCkgew0KLSAgICAgICAgcFdpZGdldERhdGEtPlNldEl0ZW1TdGF0ZShpSW5kZXgsIFRSVUUsIFRSVUUsIFRSVUUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKHBXaWRnZXREYXRhLT5HZXRJdGVtU3RhdGUoaUluZGV4KSkgew0KLSAgICAgICAgICAgIHBXaWRnZXREYXRhLT5TZXRJdGVtU3RhdGUoaUluZGV4LCBGQUxTRSwgVFJVRSwgVFJVRSk7DQotICAgICAgICB9DQotICAgIH0NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NYXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgcmV0dXJuOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9PY2N1ciBub2RlT2NjdXIgPSBHZXRPY2N1ck5vZGUoKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIG5vZGVPY2N1ci5HZXRNYXgoKSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQWRkSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMikgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJhZGRJdGVtIik7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTGFiZWw7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzTGFibGUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KLSAgICAgICAgd3NMYWJlbCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0xhYmxlLCBic0xhYmxlLkdldExlbmd0aCgpKTsNCi0gICAgfQ0KLSAgICBpZiAoaUxlbmd0aCA+PSAyKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCi0gICAgICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgcFdpZGdldERhdGEtPkluc2VydEl0ZW0od3NMYWJlbCwgd3NWYWx1ZSwgLTEsIFRSVUUpOw0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01pbihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICByZXR1cm47DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX09jY3VyIG5vZGVPY2N1ciA9IEdldE9jY3VyTm9kZSgpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgbm9kZU9jY3VyLkdldE1pbigpKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgICAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaW50MzJfdCBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX1ZhbGlkYXRlLCBGQUxTRSwgRkFMU0UpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgKChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX0Vycm9yKSA/IEZBTFNFIDogVFJVRSkpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleGVjVmFsaWRhdGUiKTsNCitzdGF0aWMgaW50MzJfdCBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KENYRkFfTm9kZSogcEluc3RNZ3JOb2RlKSB7DQorICBBU1NFUlQocEluc3RNZ3JOb2RlKTsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSAwOw0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBYRkFfRUxFTUVOVCBlQ3VyVHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgIGlmIChlQ3VyVHlwZSA9PSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KKyAgICBpZiAoKGVDdXJUeXBlICE9IFhGQV9FTEVNRU5UX1N1YmZvcm0pICYmDQorICAgICAgICAoZUN1clR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lID0gcE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zdE5hbWUgPSBwSW5zdE1nck5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgICAgaWYgKHdzSW5zdE5hbWUuR2V0TGVuZ3RoKCkgPCAxIHx8IHdzSW5zdE5hbWUuR2V0QXQoMCkgIT0gJ18nIHx8DQorICAgICAgICAgIHdzSW5zdE5hbWUuTWlkKDEpICE9IHdzTmFtZSkgew0KKyAgICAgICAgcmV0dXJuIGlDb3VudDsNCisgICAgICB9DQorICAgICAgZHdOYW1lSGFzaCA9IHBOb2RlLT5HZXROYW1lSGFzaCgpOw0KKyAgICB9DQorICAgIGlmIChkd05hbWVIYXNoICE9IHBOb2RlLT5HZXROYW1lSGFzaCgpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaUNvdW50Kys7DQorICB9DQorICByZXR1cm4gaUNvdW50Ow0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FcnJvclRleHQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKCFiU2V0dGluZykgew0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCitzdGF0aWMgdm9pZA0KK1hGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVvcmRlckRhdGFOb2Rlc19Tb3J0Tm9kZUFycmF5QnlEb2N1bWVudElkeCgNCisgICAgY29uc3QgQ1hGQV9Ob2RlU2V0JiByZ05vZGVTZXQsDQorICAgIENYRkFfTm9kZUFycmF5JiByZ05vZGVBcnJheSwNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4mIHJnSWR4QXJyYXkpIHsNCisgIGludDMyX3QgaUNvdW50ID0gcmdOb2RlU2V0LkdldENvdW50KCk7DQorICByZ05vZGVBcnJheS5TZXRTaXplKGlDb3VudCk7DQorICByZ0lkeEFycmF5LlNldFNpemUoaUNvdW50KTsNCisgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlJbmRleCA9IC0xLCBpVG90YWxJbmRleCA9IC0xOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBGWF9QT1NJVElPTiBwb3MgPSByZ05vZGVTZXQuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgcmdOb2RlU2V0LkdldE5leHRBc3NvYyhwb3MsIHBOb2RlKTsNCisgIGZvciAocE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkNCisgICAgICAgICAgICAgICAgICAgLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgIHBOb2RlICYmIGlJbmRleCA8IGlDb3VudDsNCisgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpVG90YWxJbmRleCsrOw0KKyAgICBpZiAocmdOb2RlU2V0Lkxvb2t1cChwTm9kZSkpIHsNCisgICAgICBpSW5kZXgrKzsNCisgICAgICByZ05vZGVBcnJheVtpSW5kZXhdID0gcE5vZGU7DQorICAgICAgcmdJZHhBcnJheVtpSW5kZXhdID0gaVRvdGFsSW5kZXg7DQogICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRGVmYXVsdEFuZFJhd1ZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQotICAgIGlmKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzVmFsdWUpOw0KLSAgICAgICAgcFdpZGdldERhdGEtPlNldFNlbGVjdGVkTWVtYmVyQnlWYWx1ZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSksIFRSVUUsIFRSVUUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IEdldFNjcmlwdENvbnRlbnQoVFJVRSk7DQotICAgICAgICBYRkFfVkVSU0lPTiBjdXJWZXJzaW9uID0gR2V0RG9jdW1lbnQoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCi0gICAgICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSAmJiBjdXJWZXJzaW9uID49IFhGQV9WRVJTSU9OXzMwMCkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoaFZhbHVlKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NWYWx1ZSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX1RyYW5zaWVudChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjRXZlbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAxKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBldmVudFN0cmluZyA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQotICAgICAgICBleGVjU2luZ2xlRXZlbnRCeU5hbWUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGV2ZW50U3RyaW5nLCBldmVudFN0cmluZy5HZXRMZW5ndGgoKSksIFhGQV9FTEVNRU5UX0V4Y2xHcm91cCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImV4ZWNFdmVudCIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX1NlbGVjdGVkTWVtYmVyKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKChhcmdjID09IDApIHx8IChhcmdjID09IDEpKSB7DQotICAgICAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KLSAgICAgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIENYRkFfTm9kZSAqIHBSZXR1cm5Ob2RlID0gTlVMTDsNCi0gICAgICAgICAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgICAgICAgICAgICAgIHBSZXR1cm5Ob2RlID0gcFdpZGdldERhdGEtPkdldFNlbGVjdGVkTWVtYmVyKCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pOYW1lOw0KLSAgICAgICAgICAgICAgICBzek5hbWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KLSAgICAgICAgICAgICAgICBwUmV0dXJuTm9kZSA9IHBXaWRnZXREYXRhLT5TZXRTZWxlY3RlZE1lbWJlcihDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pOYW1lLCBzek5hbWUuR2V0TGVuZ3RoKCkpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHBSZXR1cm5Ob2RlKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwUmV0dXJuTm9kZSkpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJzZWxlY3RlZE1lbWJlciIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0luaXRpYWxpemUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleGVjSW5pdGlhbGl6ZSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgICAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfQ2FsY3VsYXRlKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZXhlY0NhbGN1bGF0ZSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfVmFsaWRhdGUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgKChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX0Vycm9yKSA/IEZBTFNFIDogVFJVRSkpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleGVjVmFsaWRhdGUiKTsNCi0gICAgfQ0KLX0NCi1zdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0oQ1hGQV9Ob2RlICpwSW5zdE1nck5vZGUsIGludDMyX3QgaUluZGV4KQ0KLXsNCi0gICAgQVNTRVJUKHBJbnN0TWdyTm9kZSk7DQotICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IDA7DQotICAgIGZvcihDWEZBX05vZGUqIHBOb2RlID0gcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgWEZBX0VMRU1FTlQgZUN1clR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICAgICAgaWYgKGVDdXJUeXBlID09IFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcikgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKChlQ3VyVHlwZSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtKSAmJiAoZUN1clR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpQ291bnQgPT0gMCkgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWUgPSBwTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJbnN0TmFtZSA9IHBJbnN0TWdyTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCi0gICAgICAgICAgICBpZiAod3NJbnN0TmFtZS5HZXRMZW5ndGgoKSA8IDEgfHwgd3NJbnN0TmFtZS5HZXRBdCgwKSAhPSAnXycgfHwgd3NJbnN0TmFtZS5NaWQoMSkgIT0gd3NOYW1lKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkd05hbWVIYXNoID0gcE5vZGUtPkdldE5hbWVIYXNoKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZHdOYW1lSGFzaCAhPSBwTm9kZS0+R2V0TmFtZUhhc2goKSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaUNvdW50ICsrOw0KLSAgICAgICAgaWYgKGlDb3VudCA+IGlJbmRleCkgew0KLSAgICAgICAgICAgIHJldHVybiBwTm9kZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fSW5zdGFuY2VJbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIGludDMyX3QgaVRvID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSk7DQotICAgICAgICBpbnQzMl90IGlGcm9tID0gU3ViZm9ybV9hbmRfU3ViZm9ybVNldF9JbnN0YW5jZUluZGV4KCk7DQotICAgICAgICBDWEZBX05vZGUgKnBNYW5hZ2VyTm9kZSA9IE5VTEw7DQotICAgICAgICBmb3IgKENYRkFfTm9kZSAqcE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpOyBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpKSB7DQotICAgICAgICAgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQotICAgICAgICAgICAgICAgIHBNYW5hZ2VyTm9kZSA9IHBOb2RlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAocE1hbmFnZXJOb2RlKSB7DQotICAgICAgICAgICAgcE1hbmFnZXJOb2RlLT5JbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlKGlUbywgaUZyb20pOw0KLSAgICAgICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgICAgICAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBUb0luc3RhbmNlID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHBNYW5hZ2VyTm9kZSwgaVRvKTsNCi0gICAgICAgICAgICBpZiAocFRvSW5zdGFuY2UgJiYgcFRvSW5zdGFuY2UtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQotICAgICAgICAgICAgICAgIHBOb3RpZnktPlJ1blN1YmZvcm1JbmRleENoYW5nZShwVG9JbnN0YW5jZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcEZyb21JbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbShwTWFuYWdlck5vZGUsIGlGcm9tKTsNCi0gICAgICAgICAgICBpZiAocEZyb21JbnN0YW5jZSAmJiBwRnJvbUluc3RhbmNlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KLSAgICAgICAgICAgICAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocEZyb21JbnN0YW5jZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIFN1YmZvcm1fYW5kX1N1YmZvcm1TZXRfSW5zdGFuY2VJbmRleCgpKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fSW5zdGFuY2VNYW5hZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmICghYlNldHRpbmcpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWUgPSB0aGlzLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwSW5zdGFuY2VNZ3IgPSBOVUxMOw0KLSAgICAgICAgZm9yIChDWEZBX05vZGUgKnBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKTsgcE5vZGUgIT0gTlVMTDsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKSkgew0KLSAgICAgICAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcikgew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJbnN0TWdyTmFtZSA9IHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KLSAgICAgICAgICAgICAgICBpZiAod3NJbnN0TWdyTmFtZS5HZXRMZW5ndGgoKSA+PSAxICYmIHdzSW5zdE1nck5hbWUuR2V0QXQoMCkgPT0gJ18nICYmIHdzSW5zdE1nck5hbWUuTWlkKDEpID09IHdzTmFtZSkgew0KLSAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlTWdyID0gcE5vZGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBJbnN0YW5jZU1ncikgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBJbnN0YW5jZU1ncikpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9Mb2NhbGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0xvY2FsZU5hbWU7DQotICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic0xvY2FsZU5hbWUpOw0KLSAgICAgICAgdGhpcy0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Mb2NhbGUsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0xvY2FsZU5hbWUsIGJzTG9jYWxlTmFtZS5HZXRMZW5ndGgoKSksIFRSVUUsIFRSVUUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMb2NhbGVOYW1lOw0KLSAgICAgICAgR2V0TG9jYWxlTmFtZSh3c0xvY2FsZU5hbWUpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NMb2NhbGVOYW1lLCB3c0xvY2FsZU5hbWUuR2V0TGVuZ3RoKCkpKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZXZlbnRTdHJpbmcgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KLSAgICAgICAgZXhlY1NpbmdsZUV2ZW50QnlOYW1lKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChldmVudFN0cmluZywgZXZlbnRTdHJpbmcuR2V0TGVuZ3RoKCkpLCBYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZXhlY0V2ZW50Iik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0luaXRpYWxpemUpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleGVjSW5pdGlhbGl6ZSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0NhbGN1bGF0ZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImV4ZWNDYWxjdWxhdGUiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGludDMyX3QgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9WYWxpZGF0ZSk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCAoKGlSZXQgPT0gWEZBX0VWRU5URVJST1JfRXJyb3IpID8gRkFMU0UgOiBUUlVFKSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImV4ZWNWYWxpZGF0ZSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9HZXRJbnZhbGlkT2JqZWN0cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZ2V0SW52YWxpZE9iamVjdHMiKTsNCi0gICAgfQ0KLX0NCi1pbnQzMl90IENYRkFfTm9kZTo6U3ViZm9ybV9hbmRfU3ViZm9ybVNldF9JbnN0YW5jZUluZGV4KCkNCi17DQotICAgIGludDMyX3QgaW5kZXggPSAwOw0KLSAgICBmb3IgKENYRkFfTm9kZSAqcE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpOyBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpKSB7DQotICAgICAgICBpZiAoKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgfHwgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkpIHsNCi0gICAgICAgICAgICBpbmRleCsrOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaW5kZXg7DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRm9ybU5vZGVzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBUUlVFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZm9ybU5vZGVzIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZW1lcmdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICAgICAgbV9wRG9jdW1lbnQtPkRvRGF0YVJlbWVyZ2UoVFJVRSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlbWVyZ2UiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICAgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgICAgIGlmICghcFdpZGdldERhdGEpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBUUlVFKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZXhlY0luaXRpYWxpemUiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0NyZWF0ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHJUYWdOYW1lOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyTmFtZTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHN0ck5hbWVTcGFjZTsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVGFnTmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQotICAgICAgICBzdHJUYWdOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVGFnTmFtZSwgYnNUYWdOYW1lLkdldExlbmd0aCgpKTsNCi0gICAgICAgIGlmIChhcmdjID4gMSkgew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQotICAgICAgICAgICAgc3RyTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWUsIGJzTmFtZS5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgaWYgKGFyZ2MgPT0gMykgew0KLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic05hbWVTcGFjZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMik7DQotICAgICAgICAgICAgICAgIHN0ck5hbWVTcGFjZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWVTcGFjZSwgYnNOYW1lU3BhY2UuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIFhGQV9MUENFTEVNRU5USU5GTyBwRWxlbWVudCA9IFhGQV9HZXRFbGVtZW50QnlOYW1lKHN0clRhZ05hbWUpOw0KLSAgICAgICAgQ1hGQV9Ob2RlICpwTmV3Tm9kZSA9IENyZWF0ZVNhbWVQYWNrZXROb2RlKHBFbGVtZW50LT5lTmFtZSk7DQotICAgICAgICBpZiAoIXBOZXdOb2RlKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKCFzdHJOYW1lLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoIFhGQV9HZXRBdHRyaWJ1dGVPZkVsZW1lbnQocEVsZW1lbnQtPmVOYW1lLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBOZXdOb2RlLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCBzdHJOYW1lLCBUUlVFKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwTmV3Tm9kZS0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcE5ld05vZGUtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5ld05vZGUpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfTk9UX0hBVkVfUFJPUEVSVFksIChjb25zdCBGWF9XQ0hBUiopc3RyVGFnTmFtZSwgTCJuYW1lIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5ld05vZGUpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImNyZWF0ZU5vZGUiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX1JlY2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMSkgew0KLSAgICAgICAgRlhfQk9PTAliU2NyaXB0RmxhZ3MgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBUUlVFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVjYWxjdWxhdGUiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgICAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KLSAgICAgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIFRSVUUpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleGVjQ2FsY3VsYXRlIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgICAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KLSAgICAgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIFRSVUUpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleGVjVmFsaWRhdGUiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X01hbmlmZXN0X0V2YWx1YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICAgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgICAgIGlmICghcFdpZGdldERhdGEpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBUUlVFKTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZXZhbHVhdGUiKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NYXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9PY2N1ciBub2RlT2NjdXIgPSBHZXRPY2N1ck5vZGUoKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBub2RlT2NjdXIuR2V0TWF4KCkpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01pbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQotICAgICAgICByZXR1cm47DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX09jY3VyIG5vZGVPY2N1ciA9IEdldE9jY3VyTm9kZSgpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIG5vZGVPY2N1ci5HZXRNaW4oKSk7DQotICAgIH0NCi19DQotc3RhdGljIGludDMyX3QgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRDb3VudChDWEZBX05vZGUgKnBJbnN0TWdyTm9kZSkNCi17DQotICAgIEFTU0VSVChwSW5zdE1nck5vZGUpOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSAwOw0KLSAgICBmb3IoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgIFhGQV9FTEVNRU5UIGVDdXJUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCi0gICAgICAgIGlmIChlQ3VyVHlwZSA9PSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICgoZUN1clR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgJiYgKGVDdXJUeXBlICE9IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaUNvdW50ID09IDApIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lID0gcE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zdE5hbWUgPSBwSW5zdE1nck5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQotICAgICAgICAgICAgaWYgKHdzSW5zdE5hbWUuR2V0TGVuZ3RoKCkgPCAxIHx8IHdzSW5zdE5hbWUuR2V0QXQoMCkgIT0gJ18nIHx8IHdzSW5zdE5hbWUuTWlkKDEpICE9IHdzTmFtZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gaUNvdW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkd05hbWVIYXNoID0gcE5vZGUtPkdldE5hbWVIYXNoKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZHdOYW1lSGFzaCAhPSBwTm9kZS0+R2V0TmFtZUhhc2goKSkgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaUNvdW50ICsrOw0KLSAgICB9DQotICAgIHJldHVybiBpQ291bnQ7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVvcmRlckRhdGFOb2Rlc19Tb3J0Tm9kZUFycmF5QnlEb2N1bWVudElkeChjb25zdCBDWEZBX05vZGVTZXQmIHJnTm9kZVNldCwgQ1hGQV9Ob2RlQXJyYXkmIHJnTm9kZUFycmF5LCBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiYgcmdJZHhBcnJheSkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gcmdOb2RlU2V0LkdldENvdW50KCk7DQotICAgIHJnTm9kZUFycmF5LlNldFNpemUoaUNvdW50KTsNCi0gICAgcmdJZHhBcnJheS5TZXRTaXplKGlDb3VudCk7DQotICAgIGlmKGlDb3VudCA9PSAwKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBpSW5kZXggPSAtMSwgaVRvdGFsSW5kZXggPSAtMTsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHJnTm9kZVNldC5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIHJnTm9kZVNldC5HZXROZXh0QXNzb2MocG9zLCBwTm9kZSk7DQotICAgIGZvcihwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgIHBOb2RlICYmIGlJbmRleCA8IGlDb3VudDsNCi0gICAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpVG90YWxJbmRleCsrOw0KLSAgICAgICAgaWYocmdOb2RlU2V0Lkxvb2t1cChwTm9kZSkpIHsNCi0gICAgICAgICAgICBpSW5kZXggKys7DQotICAgICAgICAgICAgcmdOb2RlQXJyYXlbaUluZGV4XSA9IHBOb2RlOw0KLSAgICAgICAgICAgIHJnSWR4QXJyYXlbaUluZGV4XSA9IGlUb3RhbEluZGV4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQorICB9DQogfQ0KIHN0cnVjdCBDWEZBX0R1YWxOb2RlQXJyYXkgew0KLSAgICBDWEZBX05vZGVTZXQgZmlyc3ROb2RlTGlzdDsNCi0gICAgQ1hGQV9Ob2RlU2V0IHNlY29uZE5vZGVMaXN0Ow0KKyAgQ1hGQV9Ob2RlU2V0IGZpcnN0Tm9kZUxpc3Q7DQorICBDWEZBX05vZGVTZXQgc2Vjb25kTm9kZUxpc3Q7DQogfTsNCi1zdGF0aWMgdm9pZCBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX1Jlb3JkZXJEYXRhTm9kZXMoQ1hGQV9Ob2RlU2V0JiBzU2V0MSwgQ1hGQV9Ob2RlU2V0JiBzU2V0MiwgRlhfQk9PTCBiSW5zZXJ0QmVmb3JlKQ0KLXsNCi0gICAgQ0ZYX01hcFB0clRlbXBsYXRlPENYRkFfTm9kZSosIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9EdWFsTm9kZUFycmF5Kj4qPiByZ05vZGVMaXN0TWFwOw0KLSAgICBGWF9QT1NJVElPTiBwb3M7DQotICAgIHBvcyA9IHNTZXQxLkdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgd2hpbGUocG9zKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCi0gICAgICAgIHNTZXQxLkdldE5leHRBc3NvYyhwb3MsIHBOb2RlKTsNCi0gICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICBGWF9EV09SRCBkd05hbWVIYXNoID0gcE5vZGUtPkdldE5hbWVIYXNoKCk7DQotICAgICAgICBpZighcFBhcmVudE5vZGUgfHwgIWR3TmFtZUhhc2gpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9EdWFsTm9kZUFycmF5Kj4qIHBOb2RlTGlzdENoaWxkTWFwID0gcmdOb2RlTGlzdE1hcFtwUGFyZW50Tm9kZV07DQotICAgICAgICBpZighcE5vZGVMaXN0Q2hpbGRNYXApIHsNCi0gICAgICAgICAgICByZ05vZGVMaXN0TWFwW3BQYXJlbnROb2RlXSA9IHBOb2RlTGlzdENoaWxkTWFwID0gRlhfTkVXIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9EdWFsTm9kZUFycmF5Kj47DQotICAgICAgICB9DQotICAgICAgICBDWEZBX0R1YWxOb2RlQXJyYXkqIHBEdWFsTm9kZUFycmF5ID0gKCpwTm9kZUxpc3RDaGlsZE1hcClbZHdOYW1lSGFzaF07DQotICAgICAgICBpZighcER1YWxOb2RlQXJyYXkpIHsNCi0gICAgICAgICAgICAoKnBOb2RlTGlzdENoaWxkTWFwKVtkd05hbWVIYXNoXSA9IHBEdWFsTm9kZUFycmF5ID0gRlhfTkVXIENYRkFfRHVhbE5vZGVBcnJheTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBEdWFsTm9kZUFycmF5LT5maXJzdE5vZGVMaXN0LkFkZChwTm9kZSk7DQorc3RhdGljIHZvaWQgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW9yZGVyRGF0YU5vZGVzKENYRkFfTm9kZVNldCYgc1NldDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZVNldCYgc1NldDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluc2VydEJlZm9yZSkgew0KKyAgQ0ZYX01hcFB0clRlbXBsYXRlPENYRkFfTm9kZSosDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBDWEZBX0R1YWxOb2RlQXJyYXkqPio+DQorICAgICAgcmdOb2RlTGlzdE1hcDsNCisgIEZYX1BPU0lUSU9OIHBvczsNCisgIHBvcyA9IHNTZXQxLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwb3MpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICAgIHNTZXQxLkdldE5leHRBc3NvYyhwb3MsIHBOb2RlKTsNCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IHBOb2RlLT5HZXROYW1lSGFzaCgpOw0KKyAgICBpZiAoIXBQYXJlbnROb2RlIHx8ICFkd05hbWVIYXNoKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgcG9zID0gc1NldDIuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZShwb3MpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KLSAgICAgICAgc1NldDIuR2V0TmV4dEFzc29jKHBvcywgcE5vZGUpOw0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwTm9kZS0+R2V0TmFtZUhhc2goKTsNCi0gICAgICAgIGlmKCFwUGFyZW50Tm9kZSB8fCAhZHdOYW1lSGFzaCkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBDWEZBX0R1YWxOb2RlQXJyYXkqPiogcE5vZGVMaXN0Q2hpbGRNYXAgPSByZ05vZGVMaXN0TWFwW3BQYXJlbnROb2RlXTsNCi0gICAgICAgIGlmKCFwTm9kZUxpc3RDaGlsZE1hcCkgew0KLSAgICAgICAgICAgIHJnTm9kZUxpc3RNYXBbcFBhcmVudE5vZGVdID0gcE5vZGVMaXN0Q2hpbGRNYXAgPSBGWF9ORVcgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBDWEZBX0R1YWxOb2RlQXJyYXkqPjsNCi0gICAgICAgIH0NCi0gICAgICAgIENYRkFfRHVhbE5vZGVBcnJheSogcER1YWxOb2RlQXJyYXkgPSAoKnBOb2RlTGlzdENoaWxkTWFwKVtkd05hbWVIYXNoXTsNCi0gICAgICAgIGlmKCFwRHVhbE5vZGVBcnJheSkgew0KLSAgICAgICAgICAgICgqcE5vZGVMaXN0Q2hpbGRNYXApW2R3TmFtZUhhc2hdID0gcER1YWxOb2RlQXJyYXkgPSBGWF9ORVcgQ1hGQV9EdWFsTm9kZUFycmF5Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYocER1YWxOb2RlQXJyYXktPmZpcnN0Tm9kZUxpc3QuTG9va3VwKHBOb2RlKSkgew0KLSAgICAgICAgICAgIHBEdWFsTm9kZUFycmF5LT5maXJzdE5vZGVMaXN0LlJlbW92ZUtleShwTm9kZSk7DQorICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9EdWFsTm9kZUFycmF5Kj4qIHBOb2RlTGlzdENoaWxkTWFwID0NCisgICAgICAgIHJnTm9kZUxpc3RNYXBbcFBhcmVudE5vZGVdOw0KKyAgICBpZiAoIXBOb2RlTGlzdENoaWxkTWFwKSB7DQorICAgICAgcmdOb2RlTGlzdE1hcFtwUGFyZW50Tm9kZV0gPSBwTm9kZUxpc3RDaGlsZE1hcCA9DQorICAgICAgICAgIEZYX05FVyBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfRHVhbE5vZGVBcnJheSo+Ow0KKyAgICB9DQorICAgIENYRkFfRHVhbE5vZGVBcnJheSogcER1YWxOb2RlQXJyYXkgPSAoKnBOb2RlTGlzdENoaWxkTWFwKVtkd05hbWVIYXNoXTsNCisgICAgaWYgKCFwRHVhbE5vZGVBcnJheSkgew0KKyAgICAgICgqcE5vZGVMaXN0Q2hpbGRNYXApW2R3TmFtZUhhc2hdID0gcER1YWxOb2RlQXJyYXkgPQ0KKyAgICAgICAgICBGWF9ORVcgQ1hGQV9EdWFsTm9kZUFycmF5Ow0KKyAgICB9DQorICAgIHBEdWFsTm9kZUFycmF5LT5maXJzdE5vZGVMaXN0LkFkZChwTm9kZSk7DQorICB9DQorICBwb3MgPSBzU2V0Mi5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgICBzU2V0Mi5HZXROZXh0QXNzb2MocG9zLCBwTm9kZSk7DQorICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwTm9kZS0+R2V0TmFtZUhhc2goKTsNCisgICAgaWYgKCFwUGFyZW50Tm9kZSB8fCAhZHdOYW1lSGFzaCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9EdWFsTm9kZUFycmF5Kj4qIHBOb2RlTGlzdENoaWxkTWFwID0NCisgICAgICAgIHJnTm9kZUxpc3RNYXBbcFBhcmVudE5vZGVdOw0KKyAgICBpZiAoIXBOb2RlTGlzdENoaWxkTWFwKSB7DQorICAgICAgcmdOb2RlTGlzdE1hcFtwUGFyZW50Tm9kZV0gPSBwTm9kZUxpc3RDaGlsZE1hcCA9DQorICAgICAgICAgIEZYX05FVyBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfRHVhbE5vZGVBcnJheSo+Ow0KKyAgICB9DQorICAgIENYRkFfRHVhbE5vZGVBcnJheSogcER1YWxOb2RlQXJyYXkgPSAoKnBOb2RlTGlzdENoaWxkTWFwKVtkd05hbWVIYXNoXTsNCisgICAgaWYgKCFwRHVhbE5vZGVBcnJheSkgew0KKyAgICAgICgqcE5vZGVMaXN0Q2hpbGRNYXApW2R3TmFtZUhhc2hdID0gcER1YWxOb2RlQXJyYXkgPQ0KKyAgICAgICAgICBGWF9ORVcgQ1hGQV9EdWFsTm9kZUFycmF5Ow0KKyAgICB9DQorICAgIGlmIChwRHVhbE5vZGVBcnJheS0+Zmlyc3ROb2RlTGlzdC5Mb29rdXAocE5vZGUpKSB7DQorICAgICAgcER1YWxOb2RlQXJyYXktPmZpcnN0Tm9kZUxpc3QuUmVtb3ZlS2V5KHBOb2RlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwRHVhbE5vZGVBcnJheS0+c2Vjb25kTm9kZUxpc3QuQWRkKHBOb2RlKTsNCisgICAgfQ0KKyAgfQ0KKyAgcG9zID0gcmdOb2RlTGlzdE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBOVUxMOw0KKyAgICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfRHVhbE5vZGVBcnJheSo+KiBwTm9kZUxpc3RDaGlsZE1hcCA9IE5VTEw7DQorICAgIHJnTm9kZUxpc3RNYXAuR2V0TmV4dEFzc29jKHBvcywgcFBhcmVudE5vZGUsIHBOb2RlTGlzdENoaWxkTWFwKTsNCisgICAgaWYgKCFwTm9kZUxpc3RDaGlsZE1hcCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIEZYX1BPU0lUSU9OIGNoaWxkcG9zID0gcE5vZGVMaXN0Q2hpbGRNYXAtPkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKGNoaWxkcG9zKSB7DQorICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IDA7DQorICAgICAgQ1hGQV9EdWFsTm9kZUFycmF5KiBwRHVhbE5vZGVBcnJheSA9IE5VTEw7DQorICAgICAgcE5vZGVMaXN0Q2hpbGRNYXAtPkdldE5leHRBc3NvYyhjaGlsZHBvcywgZHdOYW1lSGFzaCwgcER1YWxOb2RlQXJyYXkpOw0KKyAgICAgIGlmICghcER1YWxOb2RlQXJyYXkpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAocER1YWxOb2RlQXJyYXktPmZpcnN0Tm9kZUxpc3QuR2V0Q291bnQoKSAhPSAwICYmDQorICAgICAgICAgIHBEdWFsTm9kZUFycmF5LT5zZWNvbmROb2RlTGlzdC5HZXRDb3VudCgpICE9IDApIHsNCisgICAgICAgIENYRkFfTm9kZUFycmF5IHJnTm9kZUFycmF5MSwgcmdOb2RlQXJyYXkyOw0KKyAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gcmdJZHhBcnJheTEsIHJnSWR4QXJyYXkyOw0KKyAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW9yZGVyRGF0YU5vZGVzX1NvcnROb2RlQXJyYXlCeURvY3VtZW50SWR4KA0KKyAgICAgICAgICAgIHBEdWFsTm9kZUFycmF5LT5maXJzdE5vZGVMaXN0LCByZ05vZGVBcnJheTEsIHJnSWR4QXJyYXkxKTsNCisgICAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVvcmRlckRhdGFOb2Rlc19Tb3J0Tm9kZUFycmF5QnlEb2N1bWVudElkeCgNCisgICAgICAgICAgICBwRHVhbE5vZGVBcnJheS0+c2Vjb25kTm9kZUxpc3QsIHJnTm9kZUFycmF5MiwgcmdJZHhBcnJheTIpOw0KKyAgICAgICAgaW50MzJfdCBpTGltaXQ7DQorICAgICAgICBDWEZBX05vZGUgKnBQYXJlbnROb2RlID0gTlVMTCwgKnBCZWZvcmVOb2RlID0gTlVMTDsNCisgICAgICAgIGlmIChiSW5zZXJ0QmVmb3JlKSB7DQorICAgICAgICAgIGlMaW1pdCA9IHJnSWR4QXJyYXkyWzBdOw0KKyAgICAgICAgICBwQmVmb3JlTm9kZSA9IHJnTm9kZUFycmF5MlswXTsNCisgICAgICAgICAgcFBhcmVudE5vZGUgPSBwQmVmb3JlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBEdWFsTm9kZUFycmF5LT5zZWNvbmROb2RlTGlzdC5BZGQocE5vZGUpOw0KKyAgICAgICAgICBpTGltaXQgPSByZ0lkeEFycmF5MltyZ0lkeEFycmF5Mi5HZXRTaXplKCkgLSAxXTsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwTGFzdE5vZGUgPSByZ05vZGVBcnJheTJbcmdJZHhBcnJheTIuR2V0U2l6ZSgpIC0gMV07DQorICAgICAgICAgIHBQYXJlbnROb2RlID0gcExhc3ROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgcEJlZm9yZU5vZGUgPSBwTGFzdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQogICAgICAgICB9DQorICAgICAgICBmb3IgKGludDMyX3QgaUlkeCA9IDAsIGlDb3VudCA9IHJnSWR4QXJyYXkxLkdldFNpemUoKTsgaUlkeCA8IGlDb3VudDsNCisgICAgICAgICAgICAgaUlkeCsrKSB7DQorICAgICAgICAgIENYRkFfTm9kZSogcEN1ck5vZGUgPSByZ05vZGVBcnJheTFbaUlkeF07DQorICAgICAgICAgIHBQYXJlbnROb2RlLT5SZW1vdmVDaGlsZChwQ3VyTm9kZSk7DQorICAgICAgICAgIHBQYXJlbnROb2RlLT5JbnNlcnRDaGlsZChwQ3VyTm9kZSwgcEJlZm9yZU5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBkZWxldGUgcER1YWxOb2RlQXJyYXk7DQogICAgIH0NCi0gICAgcG9zID0gcmdOb2RlTGlzdE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgIHdoaWxlIChwb3MpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBOVUxMOw0KLSAgICAgICAgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBDWEZBX0R1YWxOb2RlQXJyYXkqPiogcE5vZGVMaXN0Q2hpbGRNYXAgPSBOVUxMOw0KLSAgICAgICAgcmdOb2RlTGlzdE1hcC5HZXROZXh0QXNzb2MocG9zLCBwUGFyZW50Tm9kZSwgcE5vZGVMaXN0Q2hpbGRNYXApOw0KLSAgICAgICAgaWYoIXBOb2RlTGlzdENoaWxkTWFwKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBGWF9QT1NJVElPTiBjaGlsZHBvcyA9IHBOb2RlTGlzdENoaWxkTWFwLT5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgICAgICB3aGlsZShjaGlsZHBvcykgew0KLSAgICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSAwOw0KLSAgICAgICAgICAgIENYRkFfRHVhbE5vZGVBcnJheSogcER1YWxOb2RlQXJyYXkgPSBOVUxMOw0KLSAgICAgICAgICAgIHBOb2RlTGlzdENoaWxkTWFwLT5HZXROZXh0QXNzb2MoY2hpbGRwb3MsIGR3TmFtZUhhc2gsIHBEdWFsTm9kZUFycmF5KTsNCi0gICAgICAgICAgICBpZighcER1YWxOb2RlQXJyYXkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKHBEdWFsTm9kZUFycmF5LT5maXJzdE5vZGVMaXN0LkdldENvdW50KCkgIT0gMCAmJiBwRHVhbE5vZGVBcnJheS0+c2Vjb25kTm9kZUxpc3QuR2V0Q291bnQoKSAhPSAwKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5IHJnTm9kZUFycmF5MSwgcmdOb2RlQXJyYXkyOw0KLSAgICAgICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiByZ0lkeEFycmF5MSwgcmdJZHhBcnJheTI7DQotICAgICAgICAgICAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVvcmRlckRhdGFOb2Rlc19Tb3J0Tm9kZUFycmF5QnlEb2N1bWVudElkeChwRHVhbE5vZGVBcnJheS0+Zmlyc3ROb2RlTGlzdCwgcmdOb2RlQXJyYXkxLCByZ0lkeEFycmF5MSk7DQotICAgICAgICAgICAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVvcmRlckRhdGFOb2Rlc19Tb3J0Tm9kZUFycmF5QnlEb2N1bWVudElkeChwRHVhbE5vZGVBcnJheS0+c2Vjb25kTm9kZUxpc3QsIHJnTm9kZUFycmF5MiwgcmdJZHhBcnJheTIpOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlMaW1pdDsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwUGFyZW50Tm9kZSA9IE5VTEwsICpwQmVmb3JlTm9kZSA9IE5VTEw7DQotICAgICAgICAgICAgICAgIGlmKGJJbnNlcnRCZWZvcmUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlMaW1pdCA9IHJnSWR4QXJyYXkyWzBdOw0KLSAgICAgICAgICAgICAgICAgICAgcEJlZm9yZU5vZGUgPSByZ05vZGVBcnJheTJbMF07DQotICAgICAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZSA9IHBCZWZvcmVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlMaW1pdCA9IHJnSWR4QXJyYXkyW3JnSWR4QXJyYXkyLkdldFNpemUoKSAtIDFdOw0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwTGFzdE5vZGUgPSByZ05vZGVBcnJheTJbcmdJZHhBcnJheTIuR2V0U2l6ZSgpIC0gMV07DQotICAgICAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZSA9IHBMYXN0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgICAgICAgICAgICAgICAgICBwQmVmb3JlTm9kZSA9IHBMYXN0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBpSWR4ID0gMCwgaUNvdW50ID0gcmdJZHhBcnJheTEuR2V0U2l6ZSgpOyBpSWR4IDwgaUNvdW50OyBpSWR4KyspIHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEN1ck5vZGUgPSByZ05vZGVBcnJheTFbaUlkeF07DQotICAgICAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZS0+UmVtb3ZlQ2hpbGQocEN1ck5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmVudE5vZGUtPkluc2VydENoaWxkKHBDdXJOb2RlLCBwQmVmb3JlTm9kZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZGVsZXRlIHBEdWFsTm9kZUFycmF5Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcE5vZGVMaXN0Q2hpbGRNYXAtPlJlbW92ZUFsbCgpOw0KLSAgICB9DQotICAgIHJnTm9kZUxpc3RNYXAuUmVtb3ZlQWxsKCk7DQorICAgIHBOb2RlTGlzdENoaWxkTWFwLT5SZW1vdmVBbGwoKTsNCisgIH0NCisgIHJnTm9kZUxpc3RNYXAuUmVtb3ZlQWxsKCk7DQogfQ0KLXN0YXRpYyB2b2lkIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfSW5zZXJ0SXRlbShDWEZBX05vZGUgKnBJbnN0TWdyTm9kZSwgQ1hGQV9Ob2RlICpwTmV3SW5zdGFuY2UsIGludDMyX3QgaVBvcywgaW50MzJfdCBpQ291bnQgPSAtMSwgRlhfQk9PTCBiTW92ZURhdGFCaW5kaW5nTm9kZXMgPSBUUlVFKQ0KLXsNCi0gICAgaWYoaUNvdW50IDwgMCkgew0KLSAgICAgICAgaUNvdW50ID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRDb3VudChwSW5zdE1nck5vZGUpOw0KLSAgICB9DQotICAgIGlmKGlQb3MgPCAwKSB7DQotICAgICAgICBpUG9zID0gaUNvdW50Ow0KLSAgICB9DQotICAgIGlmKGlQb3MgPT0gaUNvdW50KSB7DQotICAgICAgICBDWEZBX05vZGUqIHBOZXh0U2libGluZyA9IGlDb3VudCA+IDAgPyBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0ocEluc3RNZ3JOb2RlLCBpQ291bnQgLSAxKS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgICAgIHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPkluc2VydENoaWxkKHBOZXdJbnN0YW5jZSwgcE5leHRTaWJsaW5nKTsNCi0gICAgICAgIGlmKGJNb3ZlRGF0YUJpbmRpbmdOb2Rlcykgew0KLSAgICAgICAgICAgIENYRkFfTm9kZVNldCBzTmV3LCBzQWZ0ZXI7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPiBzSXRlcmF0b3JOZXcocE5ld0luc3RhbmNlKTsNCi0gICAgICAgICAgICBmb3IoQ1hGQV9Ob2RlICpwTm9kZSA9IHNJdGVyYXRvck5ldy5HZXRDdXJyZW50KCk7IHBOb2RlOyBwTm9kZSA9IHNJdGVyYXRvck5ldy5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwRGF0YU5vZGUgPSBwTm9kZS0+R2V0QmluZERhdGEoKTsNCi0gICAgICAgICAgICAgICAgaWYoIXBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgc05ldy5BZGQocERhdGFOb2RlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPiBzSXRlcmF0b3JBZnRlcihwTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgIGZvcihDWEZBX05vZGUgKnBOb2RlID0gc0l0ZXJhdG9yQWZ0ZXIuR2V0Q3VycmVudCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3JBZnRlci5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwRGF0YU5vZGUgPSBwTm9kZS0+R2V0QmluZERhdGEoKTsNCi0gICAgICAgICAgICAgICAgaWYoIXBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgc0FmdGVyLkFkZChwRGF0YU5vZGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX1Jlb3JkZXJEYXRhTm9kZXMoc05ldywgc0FmdGVyLCBGQUxTRSk7DQorc3RhdGljIHZvaWQgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKA0KKyAgICBDWEZBX05vZGUqIHBJbnN0TWdyTm9kZSwNCisgICAgQ1hGQV9Ob2RlKiBwTmV3SW5zdGFuY2UsDQorICAgIGludDMyX3QgaVBvcywNCisgICAgaW50MzJfdCBpQ291bnQgPSAtMSwNCisgICAgRlhfQk9PTCBiTW92ZURhdGFCaW5kaW5nTm9kZXMgPSBUUlVFKSB7DQorICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICBpQ291bnQgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KHBJbnN0TWdyTm9kZSk7DQorICB9DQorICBpZiAoaVBvcyA8IDApIHsNCisgICAgaVBvcyA9IGlDb3VudDsNCisgIH0NCisgIGlmIChpUG9zID09IGlDb3VudCkgew0KKyAgICBDWEZBX05vZGUqIHBOZXh0U2libGluZyA9DQorICAgICAgICBpQ291bnQgPiAwDQorICAgICAgICAgICAgPyBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0ocEluc3RNZ3JOb2RlLCBpQ291bnQgLSAxKQ0KKyAgICAgICAgICAgICAgICAgIC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKQ0KKyAgICAgICAgICAgIDogcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICBwSW5zdE1nck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpDQorICAgICAgICAtPkluc2VydENoaWxkKHBOZXdJbnN0YW5jZSwgcE5leHRTaWJsaW5nKTsNCisgICAgaWYgKGJNb3ZlRGF0YUJpbmRpbmdOb2Rlcykgew0KKyAgICAgIENYRkFfTm9kZVNldCBzTmV3LCBzQWZ0ZXI7DQorICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4NCisgICAgICAgICAgc0l0ZXJhdG9yTmV3KHBOZXdJbnN0YW5jZSk7DQorICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yTmV3LkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvck5ldy5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfTm9kZSAqIHBCZWZvcmVJbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbShwSW5zdE1nck5vZGUsIGlQb3MpOw0KLSAgICAgICAgcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+SW5zZXJ0Q2hpbGQocE5ld0luc3RhbmNlLCBwQmVmb3JlSW5zdGFuY2UpOw0KLSAgICAgICAgaWYoYk1vdmVEYXRhQmluZGluZ05vZGVzKSB7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlU2V0IHNOZXcsIHNCZWZvcmU7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPiBzSXRlcmF0b3JOZXcocE5ld0luc3RhbmNlKTsNCi0gICAgICAgICAgICBmb3IoQ1hGQV9Ob2RlICpwTm9kZSA9IHNJdGVyYXRvck5ldy5HZXRDdXJyZW50KCk7IHBOb2RlOyBwTm9kZSA9IHNJdGVyYXRvck5ldy5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwRGF0YU5vZGUgPSBwTm9kZS0+R2V0QmluZERhdGEoKTsNCi0gICAgICAgICAgICAgICAgaWYoIXBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgc05ldy5BZGQocERhdGFOb2RlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPiBzSXRlcmF0b3JCZWZvcmUocEJlZm9yZUluc3RhbmNlKTsNCi0gICAgICAgICAgICBmb3IoQ1hGQV9Ob2RlICpwTm9kZSA9IHNJdGVyYXRvckJlZm9yZS5HZXRDdXJyZW50KCk7IHBOb2RlOyBwTm9kZSA9IHNJdGVyYXRvckJlZm9yZS5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwRGF0YU5vZGUgPSBwTm9kZS0+R2V0QmluZERhdGEoKTsNCi0gICAgICAgICAgICAgICAgaWYoIXBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgc0JlZm9yZS5BZGQocERhdGFOb2RlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW9yZGVyRGF0YU5vZGVzKHNOZXcsIHNCZWZvcmUsIFRSVUUpOw0KKyAgICAgICAgc05ldy5BZGQocERhdGFOb2RlKTsNCisgICAgICB9DQorICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4NCisgICAgICAgICAgc0l0ZXJhdG9yQWZ0ZXIocE5leHRTaWJsaW5nKTsNCisgICAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3JBZnRlci5HZXRDdXJyZW50KCk7IHBOb2RlOw0KKyAgICAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3JBZnRlci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCisgICAgICAgIHNBZnRlci5BZGQocERhdGFOb2RlKTsNCisgICAgICB9DQorICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW9yZGVyRGF0YU5vZGVzKHNOZXcsIHNBZnRlciwgRkFMU0UpOw0KICAgICB9DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSXRlbShDWEZBX05vZGUgKnBJbnN0TWdyTm9kZSwgQ1hGQV9Ob2RlICpwUmVtb3ZlSW5zdGFuY2UsIEZYX0JPT0wgYlJlbW92ZURhdGFCaW5kaW5nID0gVFJVRSkNCi17DQotICAgIHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPlJlbW92ZUNoaWxkKHBSZW1vdmVJbnN0YW5jZSk7DQotICAgIGlmKCFiUmVtb3ZlRGF0YUJpbmRpbmcpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGU+IHNJdGVyYXRvcihwUmVtb3ZlSW5zdGFuY2UpOw0KLSAgICBmb3IoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwRm9ybU5vZGU7IHBGb3JtTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcEZvcm1Ob2RlLT5HZXRCaW5kRGF0YSgpOw0KLSAgICAgICAgaWYoIXBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlSW5zdGFuY2UgPQ0KKyAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHBJbnN0TWdyTm9kZSwgaVBvcyk7DQorICAgIHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkNCisgICAgICAgIC0+SW5zZXJ0Q2hpbGQocE5ld0luc3RhbmNlLCBwQmVmb3JlSW5zdGFuY2UpOw0KKyAgICBpZiAoYk1vdmVEYXRhQmluZGluZ05vZGVzKSB7DQorICAgICAgQ1hGQV9Ob2RlU2V0IHNOZXcsIHNCZWZvcmU7DQorICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4NCisgICAgICAgICAgc0l0ZXJhdG9yTmV3KHBOZXdJbnN0YW5jZSk7DQorICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yTmV3LkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvck5ldy5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmKHBEYXRhTm9kZS0+UmVtb3ZlQmluZEl0ZW0ocEZvcm1Ob2RlKSA9PSAwKSB7DQotICAgICAgICAgICAgaWYoQ1hGQV9Ob2RlKiBwRGF0YVBhcmVudCA9IHBEYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCi0gICAgICAgICAgICAgICAgcERhdGFQYXJlbnQtPlJlbW92ZUNoaWxkKHBEYXRhTm9kZSk7DQotICAgICAgICAgICAgfQ0KKyAgICAgICAgc05ldy5BZGQocERhdGFOb2RlKTsNCisgICAgICB9DQorICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4NCisgICAgICAgICAgc0l0ZXJhdG9yQmVmb3JlKHBCZWZvcmVJbnN0YW5jZSk7DQorICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yQmVmb3JlLkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvckJlZm9yZS5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgIH0NCi0gICAgICAgIHBGb3JtTm9kZS0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIE5VTEwpOw0KKyAgICAgICAgc0JlZm9yZS5BZGQocERhdGFOb2RlKTsNCisgICAgICB9DQorICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW9yZGVyRGF0YU5vZGVzKHNOZXcsIHNCZWZvcmUsIFRSVUUpOw0KICAgICB9DQorICB9DQogfQ0KLXN0YXRpYyBDWEZBX05vZGUqIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfQ3JlYXRlSW5zdGFuY2UoQ1hGQV9Ob2RlICpwSW5zdE1nck5vZGUsIEZYX0JPT0wgYkRhdGFNZXJnZSkNCi17DQotICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBJbnN0TWdyTm9kZS0+R2V0RG9jdW1lbnQoKTsNCi0gICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlID0gcEluc3RNZ3JOb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCi0gICAgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCA9IHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgIENYRkFfTm9kZSogcERhdGFTY29wZSA9IE5VTEw7DQotICAgIGZvcihDWEZBX05vZGUqIHBSb290Qm91bmROb2RlID0gcEZvcm1QYXJlbnQ7IHBSb290Qm91bmROb2RlICYmIHBSb290Qm91bmROb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZTsgcFJvb3RCb3VuZE5vZGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCi0gICAgICAgIHBEYXRhU2NvcGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0QmluZERhdGEoKTsNCi0gICAgICAgIGlmKHBEYXRhU2NvcGUpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCitzdGF0aWMgdm9pZCBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX1JlbW92ZUl0ZW0oDQorICAgIENYRkFfTm9kZSogcEluc3RNZ3JOb2RlLA0KKyAgICBDWEZBX05vZGUqIHBSZW1vdmVJbnN0YW5jZSwNCisgICAgRlhfQk9PTCBiUmVtb3ZlRGF0YUJpbmRpbmcgPSBUUlVFKSB7DQorICBwSW5zdE1nck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLT5SZW1vdmVDaGlsZChwUmVtb3ZlSW5zdGFuY2UpOw0KKyAgaWYgKCFiUmVtb3ZlRGF0YUJpbmRpbmcpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPg0KKyAgICAgIHNJdGVyYXRvcihwUmVtb3ZlSW5zdGFuY2UpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBGb3JtTm9kZTsNCisgICAgICAgcEZvcm1Ob2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBGb3JtTm9kZS0+R2V0QmluZERhdGEoKTsNCisgICAgaWYgKCFwRGF0YU5vZGUpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBpZighcERhdGFTY29wZSkgew0KLSAgICAgICAgcERhdGFTY29wZSA9IChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfUmVjb3JkKTsNCi0gICAgICAgIEFTU0VSVChwRGF0YVNjb3BlKTsNCisgICAgaWYgKHBEYXRhTm9kZS0+UmVtb3ZlQmluZEl0ZW0ocEZvcm1Ob2RlKSA9PSAwKSB7DQorICAgICAgaWYgKENYRkFfTm9kZSogcERhdGFQYXJlbnQgPQ0KKyAgICAgICAgICAgICAgcERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSkgew0KKyAgICAgICAgcERhdGFQYXJlbnQtPlJlbW92ZUNoaWxkKHBEYXRhTm9kZSk7DQorICAgICAgfQ0KICAgICB9DQotICAgIENYRkFfTm9kZSAqcEluc3RhbmNlID0gcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihwVGVtcGxhdGVOb2RlLCBwRm9ybVBhcmVudCwgcERhdGFTY29wZSwgVFJVRSwgYkRhdGFNZXJnZSk7DQotICAgIGlmKHBJbnN0YW5jZSkgew0KLSAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwSW5zdGFuY2UpOw0KLSAgICAgICAgcEZvcm1QYXJlbnQtPlJlbW92ZUNoaWxkKHBJbnN0YW5jZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBJbnN0YW5jZTsNCisgICAgcEZvcm1Ob2RlLT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgTlVMTCk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0NvdW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgaW50MzJfdCBpRGVzaXJlZCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihoVmFsdWUpOw0KLSAgICAgICAgSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhpRGVzaXJlZCk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRDb3VudCh0aGlzKSk7DQorc3RhdGljIENYRkFfTm9kZSogWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9DcmVhdGVJbnN0YW5jZSgNCisgICAgQ1hGQV9Ob2RlKiBwSW5zdE1nck5vZGUsDQorICAgIEZYX0JPT0wgYkRhdGFNZXJnZSkgew0KKyAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcEluc3RNZ3JOb2RlLT5HZXREb2N1bWVudCgpOw0KKyAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlID0gcEluc3RNZ3JOb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCisgIENYRkFfTm9kZSogcEZvcm1QYXJlbnQgPSBwSW5zdE1nck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlID0gTlVMTDsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwUm9vdEJvdW5kTm9kZSA9IHBGb3JtUGFyZW50Ow0KKyAgICAgICBwUm9vdEJvdW5kTm9kZSAmJg0KKyAgICAgICBwUm9vdEJvdW5kTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGU7DQorICAgICAgIHBSb290Qm91bmROb2RlID0gcFJvb3RCb3VuZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7DQorICAgIHBEYXRhU2NvcGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0QmluZERhdGEoKTsNCisgICAgaWYgKHBEYXRhU2NvcGUpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KKyAgfQ0KKyAgaWYgKCFwRGF0YVNjb3BlKSB7DQorICAgIHBEYXRhU2NvcGUgPSAoQ1hGQV9Ob2RlKilwRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1JlY29yZCk7DQorICAgIEFTU0VSVChwRGF0YVNjb3BlKTsNCisgIH0NCisgIENYRkFfTm9kZSogcEluc3RhbmNlID0gcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcigNCisgICAgICBwVGVtcGxhdGVOb2RlLCBwRm9ybVBhcmVudCwgcERhdGFTY29wZSwgVFJVRSwgYkRhdGFNZXJnZSk7DQorICBpZiAocEluc3RhbmNlKSB7DQorICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocEluc3RhbmNlKTsNCisgICAgcEZvcm1QYXJlbnQtPlJlbW92ZUNoaWxkKHBJbnN0YW5jZSk7DQorICB9DQorICByZXR1cm4gcEluc3RhbmNlOw0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyAhPSAyKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVbmRlZmluZWQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBpRnJvbSA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KLSAgICBpbnQzMl90IGlUbyA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpOw0KLSAgICBJbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlKGlUbywgaUZyb20pOw0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcFRvSW5zdGFuY2UgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0odGhpcywgaVRvKTsNCi0gICAgaWYgKHBUb0luc3RhbmNlICYmIHBUb0luc3RhbmNlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KLSAgICAgICAgcE5vdGlmeS0+UnVuU3ViZm9ybUluZGV4Q2hhbmdlKHBUb0luc3RhbmNlKTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBGcm9tSW5zdGFuY2UgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0odGhpcywgaUZyb20pOw0KLSAgICBpZiAocEZyb21JbnN0YW5jZSAmJiBwRnJvbUluc3RhbmNlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KLSAgICAgICAgcE5vdGlmeS0+UnVuU3ViZm9ybUluZGV4Q2hhbmdlKHBGcm9tSW5zdGFuY2UpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX1JlbW92ZUluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgIT0gMSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQotICAgIGludDMyX3QgIGlDb3VudCAgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KHRoaXMpOw0KLSAgICBpZiAoaUluZGV4IDwgMCB8fCBpSW5kZXggPj0gaUNvdW50KSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOREVYX09VVF9PRl9CT1VORFMpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfT2NjdXIgbm9kZU9jY3VyID0gR2V0T2NjdXJOb2RlKCk7DQotICAgIGludDMyX3QgIGlNaW4gPSBub2RlT2NjdXIuR2V0TWluKCk7DQotICAgIGlmIChpQ291bnQgLSAxIDwgaU1pbikgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19WSU9MQVRFX0JPVU5EQVJZLCBMIm1pbiIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSAqcFJlbW92ZUluc3RhbmNlID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHRoaXMsIGlJbmRleCk7DQotICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSXRlbSh0aGlzLCBwUmVtb3ZlSW5zdGFuY2UpOw0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmIChwTm90aWZ5KSB7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IGlJbmRleDsgaSA8IGlDb3VudCAtIDE7IGkrKykgew0KLSAgICAgICAgICAgIENYRkFfTm9kZSAqcFN1YmZvcm1JbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbSh0aGlzLCBpKTsNCi0gICAgICAgICAgICBpZiAocFN1YmZvcm1JbnN0YW5jZSAmJiBwU3ViZm9ybUluc3RhbmNlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KLSAgICAgICAgICAgICAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocFN1YmZvcm1JbnN0YW5jZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KLSAgICBpZiAoIXBMYXlvdXRQcm8pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSk7DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjICE9IDEpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlEZXNpcmVkID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfQ291bnQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIGludDMyX3QgaURlc2lyZWQgPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCiAgICAgSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhpRGVzaXJlZCk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRDb3VudCh0aGlzKSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0FkZEluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmICgoYXJnYyAhPSAwKSAmJiAoYXJnYyAhPSAxKSkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJhZGRJbnN0YW5jZSIpOw0KLSAgICAgICAgcmV0dXJuOw0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01vdmVJbnN0YW5jZSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyAhPSAyKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpRnJvbSA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KKyAgaW50MzJfdCBpVG8gPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKTsNCisgIEluc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoaVRvLCBpRnJvbSk7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwVG9JbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbSh0aGlzLCBpVG8pOw0KKyAgaWYgKHBUb0luc3RhbmNlICYmIHBUb0luc3RhbmNlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocFRvSW5zdGFuY2UpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwRnJvbUluc3RhbmNlID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHRoaXMsIGlGcm9tKTsNCisgIGlmIChwRnJvbUluc3RhbmNlICYmIHBGcm9tSW5zdGFuY2UtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgIHBOb3RpZnktPlJ1blN1YmZvcm1JbmRleENoYW5nZShwRnJvbUluc3RhbmNlKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSW5zdGFuY2UoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgIT0gMSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVbmRlZmluZWQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICBpbnQzMl90IGlDb3VudCA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQodGhpcyk7DQorICBpZiAoaUluZGV4IDwgMCB8fCBpSW5kZXggPj0gaUNvdW50KSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5ERVhfT1VUX09GX0JPVU5EUyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfT2NjdXIgbm9kZU9jY3VyID0gR2V0T2NjdXJOb2RlKCk7DQorICBpbnQzMl90IGlNaW4gPSBub2RlT2NjdXIuR2V0TWluKCk7DQorICBpZiAoaUNvdW50IC0gMSA8IGlNaW4pIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19WSU9MQVRFX0JPVU5EQVJZLCBMIm1pbiIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHBSZW1vdmVJbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbSh0aGlzLCBpSW5kZXgpOw0KKyAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW1vdmVJdGVtKHRoaXMsIHBSZW1vdmVJbnN0YW5jZSk7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAocE5vdGlmeSkgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IGlJbmRleDsgaSA8IGlDb3VudCAtIDE7IGkrKykgew0KKyAgICAgIENYRkFfTm9kZSogcFN1YmZvcm1JbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbSh0aGlzLCBpKTsNCisgICAgICBpZiAocFN1YmZvcm1JbnN0YW5jZSAmJg0KKyAgICAgICAgICBwU3ViZm9ybUluc3RhbmNlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgcE5vdGlmeS0+UnVuU3ViZm9ybUluZGV4Q2hhbmdlKHBTdWJmb3JtSW5zdGFuY2UpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGWF9CT09MIGZGbGFncyA9IFRSVUU7DQotICAgIGlmIChhcmdjID09IDEpIHsNCi0gICAgICAgIGZGbGFncyA9IHBBcmd1bWVudHMtPkdldEludDMyKDApID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICB9DQorICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCisgIGlmICghcExheW91dFBybykgew0KKyAgICByZXR1cm47DQorICB9DQorICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKA0KKyAgICAgIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcygNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyAhPSAxKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpRGVzaXJlZCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KKyAgSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhpRGVzaXJlZCk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0FkZEluc3RhbmNlKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyAhPSAwKSAmJiAoYXJnYyAhPSAxKSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImFkZEluc3RhbmNlIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgZkZsYWdzID0gVFJVRTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgZkZsYWdzID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRDb3VudCh0aGlzKTsNCisgIENYRkFfT2NjdXIgbm9kZU9jY3VyID0gR2V0T2NjdXJOb2RlKCk7DQorICBpbnQzMl90IGlNYXggPSBub2RlT2NjdXIuR2V0TWF4KCk7DQorICBpZiAoaU1heCA+PSAwICYmIGlDb3VudCA+PSBpTWF4KSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVklPTEFURV9CT1VOREFSWSwgTCJtYXgiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTmV3SW5zdGFuY2UgPQ0KKyAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfQ3JlYXRlSW5zdGFuY2UodGhpcywgZkZsYWdzKTsNCisgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfSW5zZXJ0SXRlbSh0aGlzLCBwTmV3SW5zdGFuY2UsIGlDb3VudCwgaUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsNCisgIEZYSlNFX1ZhbHVlX1NldCgNCisgICAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOZXdJbnN0YW5jZSkpOw0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBOb3RpZnktPlJ1bk5vZGVJbml0aWFsaXplKHBOZXdJbnN0YW5jZSk7DQorICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCisgIGlmICghcExheW91dFBybykgew0KKyAgICByZXR1cm47DQorICB9DQorICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKA0KKyAgICAgIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0luc2VydEluc3RhbmNlKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyAhPSAxKSAmJiAoYXJnYyAhPSAyKSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImluc2VydEluc3RhbmNlIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICBGWF9CT09MIGJCaW5kID0gRkFMU0U7DQorICBpZiAoYXJnYyA9PSAyKSB7DQorICAgIGJCaW5kID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIH0NCisgIENYRkFfT2NjdXIgbm9kZU9jY3VyID0gR2V0T2NjdXJOb2RlKCk7DQorICBpbnQzMl90IGlDb3VudCA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQodGhpcyk7DQorICBpZiAoaUluZGV4IDwgMCB8fCBpSW5kZXggPiBpQ291bnQpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkRFWF9PVVRfT0ZfQk9VTkRTKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpTWF4ID0gbm9kZU9jY3VyLkdldE1heCgpOw0KKyAgaWYgKGlNYXggPj0gMCAmJiBpQ291bnQgPj0gaU1heCkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1ZJT0xBVEVfQk9VTkRBUlksIEwibWF4Iik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5ld0luc3RhbmNlID0NCisgICAgICBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0NyZWF0ZUluc3RhbmNlKHRoaXMsIGJCaW5kKTsNCisgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfSW5zZXJ0SXRlbSh0aGlzLCBwTmV3SW5zdGFuY2UsIGlJbmRleCwgaUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOw0KKyAgRlhKU0VfVmFsdWVfU2V0KA0KKyAgICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5ld0luc3RhbmNlKSk7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcE5vdGlmeS0+UnVuTm9kZUluaXRpYWxpemUocE5ld0luc3RhbmNlKTsNCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KKyAgaWYgKCFwTGF5b3V0UHJvKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIoDQorICAgICAgKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pKTsNCit9DQoraW50MzJfdCBDWEZBX05vZGU6Okluc3RhbmNlTWFuYWdlcl9TZXRJbnN0YW5jZXMoaW50MzJfdCBpRGVzaXJlZCkgew0KKyAgQ1hGQV9PY2N1ciBub2RlT2NjdXIgPSBHZXRPY2N1ck5vZGUoKTsNCisgIGludDMyX3QgaU1heCA9IG5vZGVPY2N1ci5HZXRNYXgoKTsNCisgIGludDMyX3QgaU1pbiA9IG5vZGVPY2N1ci5HZXRNaW4oKTsNCisgIGlmIChpRGVzaXJlZCA8IGlNaW4pIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19WSU9MQVRFX0JPVU5EQVJZLCBMIm1pbiIpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIGlmICgoaU1heCA+PSAwKSAmJiAoaURlc2lyZWQgPiBpTWF4KSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1ZJT0xBVEVfQk9VTkRBUlksIEwibWF4Iik7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KHRoaXMpOw0KKyAgaWYgKGlEZXNpcmVkID09IGlDb3VudCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChpRGVzaXJlZCA8IGlDb3VudCkgew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJbnN0TWFuYWdlck5hbWUgPSB0aGlzLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0luc3RhbmNlTmFtZSA9IHdzSW5zdE1hbmFnZXJOYW1lLklzRW1wdHkoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHdzSW5zdE1hbmFnZXJOYW1lDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogd3NJbnN0TWFuYWdlck5hbWUuTWlkKDEpOw0KKyAgICBGWF9EV09SRCBkSW5zdGFuY2VOYW1lSGFzaCA9DQorICAgICAgICB3c0luc3RhbmNlTmFtZS5Jc0VtcHR5KCkgPyAwIDogRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzSW5zdGFuY2VOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0luc3RhbmNlTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgIENYRkFfTm9kZSogcFByZXZTaWJsaW5nID0NCisgICAgICAgIChpRGVzaXJlZCA9PSAwKSA/IHRoaXMNCisgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbSh0aGlzLCBpRGVzaXJlZCAtIDEpOw0KKyAgICB3aGlsZSAoaUNvdW50ID4gaURlc2lyZWQpIHsNCisgICAgICBDWEZBX05vZGUqIHBSZW1vdmVJbnN0YW5jZSA9DQorICAgICAgICAgIHBQcmV2U2libGluZy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICBpZiAocFJlbW92ZUluc3RhbmNlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSAmJg0KKyAgICAgICAgICBwUmVtb3ZlSW5zdGFuY2UtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0KSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKHBSZW1vdmVJbnN0YW5jZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcikgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAocFJlbW92ZUluc3RhbmNlLT5HZXROYW1lSGFzaCgpID09IGRJbnN0YW5jZU5hbWVIYXNoKSB7DQorICAgICAgICBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX1JlbW92ZUl0ZW0odGhpcywgcFJlbW92ZUluc3RhbmNlKTsNCisgICAgICAgIGlDb3VudC0tOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpbnQzMl90IGlDb3VudCA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQodGhpcyk7DQotICAgIENYRkFfT2NjdXIgbm9kZU9jY3VyID0gR2V0T2NjdXJOb2RlKCk7DQotICAgIGludDMyX3QgaU1heCA9IG5vZGVPY2N1ci5HZXRNYXgoKTsNCi0gICAgaWYgKGlNYXggPj0gMCAmJiBpQ291bnQgPj0gaU1heCkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19WSU9MQVRFX0JPVU5EQVJZLCBMIm1heCIpOw0KLSAgICAgICAgcmV0dXJuOw0KKyAgfSBlbHNlIGlmIChpRGVzaXJlZCA+IGlDb3VudCkgew0KKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSBHZXRUZW1wbGF0ZU5vZGUoKTsNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICB3aGlsZSAoaUNvdW50IDwgaURlc2lyZWQpIHsNCisgICAgICBDWEZBX05vZGUqIHBOZXdJbnN0YW5jZSA9DQorICAgICAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfQ3JlYXRlSW5zdGFuY2UodGhpcywgVFJVRSk7DQorICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKHRoaXMsIHBOZXdJbnN0YW5jZSwgaUNvdW50LCBpQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsNCisgICAgICBpQ291bnQrKzsNCisgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgICB9DQorICAgICAgcE5vdGlmeS0+UnVuTm9kZUluaXRpYWxpemUocE5ld0luc3RhbmNlKTsNCiAgICAgfQ0KLSAgICBDWEZBX05vZGUqIHBOZXdJbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfQ3JlYXRlSW5zdGFuY2UodGhpcywgZkZsYWdzKTsNCi0gICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKHRoaXMsIHBOZXdJbnN0YW5jZSwgaUNvdW50LCBpQ291bnQsIEZBTFNFKTsNCi0gICAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOZXdJbnN0YW5jZSkpOw0KKyAgfQ0KKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm8gPSBtX3BEb2N1bWVudC0+R2V0TGF5b3V0UHJvY2Vzc29yKCk7DQorICBpZiAoIXBMYXlvdXRQcm8pIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKA0KKyAgICAgIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSk7DQorICByZXR1cm4gMDsNCit9DQoraW50MzJfdCBDWEZBX05vZGU6Okluc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoaW50MzJfdCBpVG8sIGludDMyX3QgaUZyb20pIHsNCisgIGludDMyX3QgaUNvdW50ID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRDb3VudCh0aGlzKTsNCisgIGlmIChpRnJvbSA+IGlDb3VudCB8fCBpVG8gPiBpQ291bnQgLSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5ERVhfT1VUX09GX0JPVU5EUyk7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgaWYgKGlGcm9tIDwgMCB8fCBpVG8gPCAwIHx8IGlGcm9tID09IGlUbykgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENYRkFfTm9kZSogcE1vdmVJbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbSh0aGlzLCBpRnJvbSk7DQorICBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX1JlbW92ZUl0ZW0odGhpcywgcE1vdmVJbnN0YW5jZSwgRkFMU0UpOw0KKyAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKHRoaXMsIHBNb3ZlSW5zdGFuY2UsIGlUbywgaUNvdW50IC0gMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsNCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KKyAgaWYgKCFwTGF5b3V0UHJvKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcExheW91dFByby0+QWRkQ2hhbmdlZENvbnRhaW5lcigNCisgICAgICAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSkpOw0KKyAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfT2NjdXJfTWF4KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIENYRkFfT2NjdXIgb2NjdXIodGhpcyk7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgaW50MzJfdCBpTWF4ID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSk7DQorICAgIG9jY3VyLlNldE1heChpTWF4KTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBvY2N1ci5HZXRNYXgoKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfT2NjdXJfTWluKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIENYRkFfT2NjdXIgb2NjdXIodGhpcyk7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgaW50MzJfdCBpTWluID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSk7DQorICAgIG9jY3VyLlNldE1pbihpTWluKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBvY2N1ci5HZXRNaW4oKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRGVzY19NZXRhZGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA9PSAwKSB8fCAoYXJnYyA9PSAxKSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZYX0JTVFJDKCIiKSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIm1ldGFkYXRhIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9Gb3JtTm9kZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgICBpZiAocERhdGFOb2RlKSB7DQorICAgICAgQ1hGQV9Ob2RlQXJyYXkgZm9ybUl0ZW1zOw0KKyAgICAgIGludDMyX3QgaVNpemUgPSBwRGF0YU5vZGUtPkdldEJpbmRJdGVtcyhmb3JtSXRlbXMpOw0KKyAgICAgIENYRkFfQXJyYXlOb2RlTGlzdCogcEZvcm1Ob2RlcyA9IEZYX05FVyBDWEZBX0FycmF5Tm9kZUxpc3QobV9wRG9jdW1lbnQpOw0KKyAgICAgIHBGb3JtTm9kZXMtPlNldEFycmF5Tm9kZUxpc3QoZm9ybUl0ZW1zKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QoDQorICAgICAgICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIChDWEZBX09iamVjdCopcEZvcm1Ob2RlcywNCisgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SnNlTm9ybWFsQ2xhc3MoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZm9ybU5vZGVzIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9SZW1lcmdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICBtX3BEb2N1bWVudC0+RG9EYXRhUmVtZXJnZShUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVtZXJnZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQogICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCiAgICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQorICAgICAgcmV0dXJuOw0KICAgICB9DQotICAgIHBOb3RpZnktPlJ1bk5vZGVJbml0aWFsaXplKHBOZXdJbnN0YW5jZSk7DQotICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KLSAgICBpZiAoIXBMYXlvdXRQcm8pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSk7DQorICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9Jbml0aWFsaXplKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZXhlY0luaXRpYWxpemUiKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfSW5zZXJ0SW5zdGFuY2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoKGFyZ2MgIT0gMSkgJiYgKGFyZ2MgIT0gMikpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiaW5zZXJ0SW5zdGFuY2UiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KLSAgICBGWF9CT09MIGJCaW5kID0gRkFMU0U7DQotICAgIGlmIChhcmdjID09IDIpIHsNCi0gICAgICAgIGJCaW5kID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCi0gICAgfQ0KLSAgICBDWEZBX09jY3VyIG5vZGVPY2N1ciA9IEdldE9jY3VyTm9kZSgpOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQodGhpcyk7DQotICAgIGlmIChpSW5kZXggPCAwIHx8IGlJbmRleCA+IGlDb3VudCkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkRFWF9PVVRfT0ZfQk9VTkRTKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlNYXggPSBub2RlT2NjdXIuR2V0TWF4KCk7DQotICAgIGlmIChpTWF4ID49IDAgJiYgaUNvdW50ID49IGlNYXgpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVklPTEFURV9CT1VOREFSWSwgTCJtYXgiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBOZXdJbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfQ3JlYXRlSW5zdGFuY2UodGhpcywgYkJpbmQpOw0KLSAgICBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0luc2VydEl0ZW0odGhpcywgcE5ld0luc3RhbmNlLCBpSW5kZXgsIGlDb3VudCwgVFJVRSk7DQotICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTmV3SW5zdGFuY2UpKTsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fUmVjYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9DQorICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0RXZlbnRQYXJhbSgpOw0KKyAgaWYgKHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9DYWxjdWxhdGUgfHwNCisgICAgICBwRXZlbnRQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgRlhfQk9PTCBiU2NyaXB0RmxhZ3MgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQogICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KLSAgICBwTm90aWZ5LT5SdW5Ob2RlSW5pdGlhbGl6ZShwTmV3SW5zdGFuY2UpOw0KLSAgICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCi0gICAgaWYgKCFwTGF5b3V0UHJvKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgcExheW91dFByby0+QWRkQ2hhbmdlZENvbnRhaW5lcigoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSkpOw0KLX0NCi1pbnQzMl90IENYRkFfTm9kZTo6SW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhpbnQzMl90IGlEZXNpcmVkKQ0KLXsNCi0gICAgQ1hGQV9PY2N1ciBub2RlT2NjdXIgPSBHZXRPY2N1ck5vZGUoKTsNCi0gICAgaW50MzJfdCBpTWF4ID0gbm9kZU9jY3VyLkdldE1heCgpOw0KLSAgICBpbnQzMl90IGlNaW4gPSBub2RlT2NjdXIuR2V0TWluKCk7DQotICAgIGlmIChpRGVzaXJlZCA8IGlNaW4pIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVklPTEFURV9CT1VOREFSWSwgTCJtaW4iKTsNCi0gICAgICAgIHJldHVybiAxOw0KLSAgICB9DQotICAgIGlmICgoaU1heCA+PSAwKSAmJiAoaURlc2lyZWQgPiBpTWF4KSkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19WSU9MQVRFX0JPVU5EQVJZLCBMIm1heCIpOw0KLSAgICAgICAgcmV0dXJuIDI7DQotICAgIH0NCi0gICAgaW50MzJfdCBpQ291bnQgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KHRoaXMpOw0KLSAgICBpZiAoaURlc2lyZWQgPT0gaUNvdW50KSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBpZihpRGVzaXJlZCA8IGlDb3VudCkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zdE1hbmFnZXJOYW1lID0gdGhpcy0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSW5zdGFuY2VOYW1lID0gd3NJbnN0TWFuYWdlck5hbWUuSXNFbXB0eSgpID8gd3NJbnN0TWFuYWdlck5hbWUgOiB3c0luc3RNYW5hZ2VyTmFtZS5NaWQoMSk7DQotICAgICAgICBGWF9EV09SRCBkSW5zdGFuY2VOYW1lSGFzaCA9IHdzSW5zdGFuY2VOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0luc3RhbmNlTmFtZSwgd3NJbnN0YW5jZU5hbWUuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwUHJldlNpYmxpbmcgPSAoaURlc2lyZWQgPT0gMCkgPyB0aGlzIDogWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHRoaXMsIGlEZXNpcmVkIC0gMSk7DQotICAgICAgICB3aGlsZShpQ291bnQgPiBpRGVzaXJlZCkgew0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcFJlbW92ZUluc3RhbmNlID0gcFByZXZTaWJsaW5nLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtICYmIHBSZW1vdmVJbnN0YW5jZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpIHsNCi0gICAgICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldE5hbWVIYXNoKCkgPT0gZEluc3RhbmNlTmFtZUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW1vdmVJdGVtKHRoaXMsIHBSZW1vdmVJbnN0YW5jZSk7DQotICAgICAgICAgICAgICAgIGlDb3VudC0tOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChpRGVzaXJlZCA+IGlDb3VudCkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlID0gR2V0VGVtcGxhdGVOb2RlKCk7DQotICAgICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgICAgICB3aGlsZSAoaUNvdW50IDwgaURlc2lyZWQpIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdJbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfQ3JlYXRlSW5zdGFuY2UodGhpcywgVFJVRSk7DQotICAgICAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKHRoaXMsIHBOZXdJbnN0YW5jZSwgaUNvdW50LCBpQ291bnQsIEZBTFNFKTsNCi0gICAgICAgICAgICBpQ291bnQgKys7DQotICAgICAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcE5vdGlmeS0+UnVuTm9kZUluaXRpYWxpemUocE5ld0luc3RhbmNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCi0gICAgaWYgKCFwTGF5b3V0UHJvKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSk7DQotICAgIHJldHVybiAwOw0KLX0NCi1pbnQzMl90IENYRkFfTm9kZTo6SW5zdGFuY2VNYW5hZ2VyX01vdmVJbnN0YW5jZShpbnQzMl90IGlUbywgaW50MzJfdCBpRnJvbSkNCi17DQotICAgIGludDMyX3QgaUNvdW50ID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRDb3VudCh0aGlzKTsNCi0gICAgaWYgKGlGcm9tID4gaUNvdW50IHx8IGlUbyA+IGlDb3VudCAtIDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5ERVhfT1VUX09GX0JPVU5EUyk7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfQ0KLSAgICBpZiAoaUZyb20gPCAwIHx8IGlUbyA8IDAgfHwgaUZyb20gPT0gaVRvKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUgKiBwTW92ZUluc3RhbmNlID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHRoaXMsIGlGcm9tKTsNCi0gICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW1vdmVJdGVtKHRoaXMsIHBNb3ZlSW5zdGFuY2UsIEZBTFNFKTsNCi0gICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKHRoaXMsIHBNb3ZlSW5zdGFuY2UsIGlUbywgaUNvdW50IC0gMSwgVFJVRSk7DQotICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KLSAgICBpZiAoIXBMYXlvdXRQcm8pIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIoKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pKTsNCi0gICAgcmV0dXJuIDA7DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfT2NjdXJfTWF4KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIENYRkFfT2NjdXIgb2NjdXIodGhpcyk7DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgaW50MzJfdCBpTWF4ID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSk7DQotICAgICAgICBvY2N1ci5TZXRNYXgoaU1heCk7DQorICAgIGlmIChiU2NyaXB0RmxhZ3MpIHsNCisgICAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfQ2FsY3VsYXRlKTsNCisgICAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfVmFsaWRhdGUpOw0KKyAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9SZWFkeSwgVFJVRSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgb2NjdXIuR2V0TWF4KCkpOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlY2FsY3VsYXRlIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfT2NjdXJfTWluKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIENYRkFfT2NjdXIgb2NjdXIodGhpcyk7DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgaW50MzJfdCBpTWluID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSk7DQotICAgICAgICBvY2N1ci5TZXRNaW4oaU1pbik7DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjQ2FsY3VsYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgb2NjdXIuR2V0TWluKCkpOw0KKyAgICAgIGludDMyX3QgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9WYWxpZGF0ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX0Vycm9yKSA/IEZBTFNFIDogVFJVRSkpOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImV4ZWNWYWxpZGF0ZSIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Rlc2NfTWV0YWRhdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoKGFyZ2MgPT0gMCkgfHwgKGFyZ2MgPT0gMSkpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRlhfQlNUUkMoIiIpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwibWV0YWRhdGEiKTsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fQ2hlY2tzdW0oRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDaGVja3N1bTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNDaGVja3N1bSk7DQorICAgIFNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NoZWNrc3VtLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQ2hlY2tzdW0sIGJzQ2hlY2tzdW0uR2V0TGVuZ3RoKCkpKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hlY2tzdW07DQorICAgIEdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCB3c0NoZWNrc3VtLCBGQUxTRSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoDQorICAgICAgICBoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NDaGVja3N1bSwgd3NDaGVja3N1bS5HZXRMZW5ndGgoKSkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9HZXRBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzQXR0cmlidXRlTmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmlidXRlVmFsdWU7DQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBpZiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlKQ0KKyAgICAgICAgICAtPkdldFN0cmluZyhDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNBdHRyaWJ1dGVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNBdHRyaWJ1dGVOYW1lLkdldExlbmd0aCgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgd3NBdHRyaWJ1dGVWYWx1ZSk7DQogICAgIH0NCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZygNCisgICAgICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICBGWF9VVEY4RW5jb2RlKHdzQXR0cmlidXRlVmFsdWUsIHdzQXR0cmlidXRlVmFsdWUuR2V0TGVuZ3RoKCkpKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZ2V0QXR0cmlidXRlIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9Gb3JtTm9kZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAxKSB7DQotICAgICAgICBDWEZBX05vZGUgKiBwRGF0YU5vZGUgPSAoQ1hGQV9Ob2RlICopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KLSAgICAgICAgaWYgKHBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgIENYRkFfTm9kZUFycmF5IGZvcm1JdGVtczsNCi0gICAgICAgICAgICBpbnQzMl90IGlTaXplID0gcERhdGFOb2RlLT5HZXRCaW5kSXRlbXMoZm9ybUl0ZW1zKTsNCi0gICAgICAgICAgICBDWEZBX0FycmF5Tm9kZUxpc3QgKnBGb3JtTm9kZXMgPSBGWF9ORVcgQ1hGQV9BcnJheU5vZGVMaXN0KG1fcERvY3VtZW50KTsNCi0gICAgICAgICAgICBwRm9ybU5vZGVzLT5TZXRBcnJheU5vZGVMaXN0KGZvcm1JdGVtcyk7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIChDWEZBX09iamVjdCopcEZvcm1Ob2RlcywgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SnNlTm9ybWFsQ2xhc3MoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJmb3JtTm9kZXMiKTsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9TZXRBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAyKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gR2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZSkNCisgICAgICAgICAgLT5TZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTmFtZSwgYnNOYW1lLkdldExlbmd0aCgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpKTsNCiAgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJzZXRBdHRyaWJ1dGUiKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX1JlbWVyZ2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgICAgICBtX3BEb2N1bWVudC0+RG9EYXRhUmVtZXJnZShUUlVFKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVtZXJnZSIpOw0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X1JlbW92ZUF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWUsIGJzTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBpZiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlOw0KKyAgICAgIGlmIChwWE1MRWxlbWVudC0+SGFzQXR0cmlidXRlKHdzTmFtZSkpIHsNCisgICAgICAgIHBYTUxFbGVtZW50LT5SZW1vdmVBdHRyaWJ1dGUod3NOYW1lKTsNCisgICAgICB9DQogICAgIH0NCisgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwicmVtb3ZlQXR0cmlidXRlIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9Jbml0aWFsaXplKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZXhlY0luaXRpYWxpemUiKTsNCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9Db250ZW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOZXdDb250ZW50Ow0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic05ld0NvbnRlbnQpOw0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gR2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZTsNCisgICAgICBwWE1MRWxlbWVudC0+U2V0VGV4dERhdGEoDQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05ld0NvbnRlbnQsIGJzTmV3Q29udGVudC5HZXRMZW5ndGgoKSkpOw0KICAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9SZWNhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEV2ZW50UGFyYW0oKTsNCi0gICAgaWYgKHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9DYWxjdWxhdGUgfHwgcEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpIHsNCi0gICAgICAgIHJldHVybjsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dERhdGE7DQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBpZiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlOw0KKyAgICAgIHBYTUxFbGVtZW50LT5HZXRUZXh0RGF0YSh3c1RleHREYXRhKTsNCiAgICAgfQ0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMSkgew0KLSAgICAgICAgRlhfQk9PTAliU2NyaXB0RmxhZ3MgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KLSAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJTY3JpcHRGbGFncykgew0KLSAgICAgICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUpOw0KLSAgICAgICAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9WYWxpZGF0ZSk7DQotICAgICAgICAgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX1JlYWR5LCBUUlVFKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlY2FsY3VsYXRlIik7DQotICAgIH0NCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZygNCisgICAgICAgIGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1RleHREYXRhLCB3c1RleHREYXRhLkdldExlbmd0aCgpKSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0NhbGN1bGF0ZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImV4ZWNDYWxjdWxhdGUiKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX05leHQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIm5leHQiKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpbnQzMl90IGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfVmFsaWRhdGUpOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgKChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX0Vycm9yKSA/IEZBTFNFIDogVFJVRSkpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleGVjVmFsaWRhdGUiKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0NhbmNlbEJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJjYW5jZWxCYXRjaCIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fQ2hlY2tzdW0oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0NoZWNrc3VtOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNDaGVja3N1bSk7DQotICAgICAgICBTZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQ2hlY2tzdW0sIGJzQ2hlY2tzdW0uR2V0TGVuZ3RoKCkpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hlY2tzdW07DQotICAgICAgICBHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgd3NDaGVja3N1bSwgRkFMU0UpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NDaGVja3N1bSwgd3NDaGVja3N1bS5HZXRMZW5ndGgoKSkpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfRmlyc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImZpcnN0Iik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X0dldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDEpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzQXR0cmlidXRlTmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJpYnV0ZVZhbHVlOw0KLSAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9CUdldFhNTE1hcHBpbmdOb2RlKCk7DQotICAgICAgICBpZiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQgKilwWE1MTm9kZSktPkdldFN0cmluZyhDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNBdHRyaWJ1dGVOYW1lLCBic0F0dHJpYnV0ZU5hbWUuR2V0TGVuZ3RoKCkpLCB3c0F0dHJpYnV0ZVZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRlhfVVRGOEVuY29kZSh3c0F0dHJpYnV0ZVZhbHVlLCB3c0F0dHJpYnV0ZVZhbHVlLkdldExlbmd0aCgpKSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImdldEF0dHJpYnV0ZSIpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfVXBkYXRlQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInVwZGF0ZUJhdGNoIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X1NldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDIpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCi0gICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICAgICAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGUpLT5TZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTmFtZSwgYnNOYW1lLkdldExlbmd0aCgpKSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInNldEF0dHJpYnV0ZSIpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfUHJldmlvdXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInByZXZpb3VzIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X1JlbW92ZUF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDEpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lLCBic05hbWUuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IEdldFhNTE1hcHBpbmdOb2RlKCk7DQotICAgICAgICBpZiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgSUZERV9YTUxFbGVtZW50ICpwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQgKilwWE1MTm9kZTsNCi0gICAgICAgICAgICBpZiAocFhNTEVsZW1lbnQtPkhhc0F0dHJpYnV0ZSh3c05hbWUpKSB7DQotICAgICAgICAgICAgICAgIHBYTUxFbGVtZW50LT5SZW1vdmVBdHRyaWJ1dGUod3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJyZW1vdmVBdHRyaWJ1dGUiKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0lzQk9GKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJpc0JPRiIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9Db250ZW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOZXdDb250ZW50Ow0KLSAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNOZXdDb250ZW50KTsNCi0gICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICAgICAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCAqcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGU7DQotICAgICAgICAgICAgcFhNTEVsZW1lbnQtPlNldFRleHREYXRhKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05ld0NvbnRlbnQsIGJzTmV3Q29udGVudC5HZXRMZW5ndGgoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0RGF0YTsNCi0gICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICAgICAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCAqcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50ICopcFhNTE5vZGU7DQotICAgICAgICAgICAgcFhNTEVsZW1lbnQtPkdldFRleHREYXRhKHdzVGV4dERhdGEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NUZXh0RGF0YSwgd3NUZXh0RGF0YS5HZXRMZW5ndGgoKSkpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfSXNFT0YoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImlzRU9GIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX05leHQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIm5leHQiKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0NhbmNlbChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiY2FuY2VsIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0NhbmNlbEJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJjYW5jZWxCYXRjaCIpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfVXBkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJ1cGRhdGUiKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfRmlyc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImZpcnN0Iik7DQotICAgIH0NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9PcGVuKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJvcGVuIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1VwZGF0ZUJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJ1cGRhdGVCYXRjaCIpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfRGVsZXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJkZWxldGUiKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfUHJldmlvdXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInByZXZpb3VzIik7DQotICAgIH0NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9BZGROZXcoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImFkZE5ldyIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9Jc0JPRihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiaXNCT0YiKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1JlcXVlcnkoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlcXVlcnkiKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfSXNFT0YoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImlzRU9GIik7DQotICAgIH0NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9SZXN5bmMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlc3luYyIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9DYW5jZWwoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImNhbmNlbCIpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQ2xvc2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImNsb3NlIik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1VwZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwidXBkYXRlIik7DQotICAgIH0NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9MYXN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJsYXN0Iik7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX09wZW4oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIm9wZW4iKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0hhc0RhdGFDaGFuZ2VkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJoYXNEYXRhQ2hhbmdlZCIpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9EZWxldGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImRlbGV0ZSIpOw0KLSAgICB9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfRGIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1hmYV9UaGlzKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoIWJTZXR0aW5nKSB7DQorICAgIENYRkFfT2JqZWN0KiBwVGhpcyA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBUaGlzKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBUaGlzKSk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0FkZE5ldyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiYWRkTmV3Iik7DQotICAgIH0NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0hhbmRsZXJfVmVyc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3VibWl0Rm9ybWF0X01vZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeHRyYXNfVHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NjcmlwdF9TdGF0ZWxlc3MoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUoRlhfV1NUUkMoTCIwIikpKTsNCiB9DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfUmVxdWVyeShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVxdWVyeSIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1Jlc3luYyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVzeW5jIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQ2xvc2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoYXJnYyA9PSAwKSB7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImNsb3NlIik7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfTGFzdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChhcmdjID09IDApIHsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwibGFzdCIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0hhc0RhdGFDaGFuZ2VkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGFyZ2MgPT0gMCkgew0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJoYXNEYXRhQ2hhbmdlZCIpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0RiKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfWGZhX1RoaXMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKCFiU2V0dGluZykgew0KLSAgICAgICAgQ1hGQV9PYmplY3QqIHBUaGlzID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBUaGlzKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBUaGlzKSk7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9IYW5kbGVyX1ZlcnNpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9TdWJtaXRGb3JtYXRfTW9kZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLX0NCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4dHJhc19UeXBlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU2NyaXB0X1N0YXRlbGVzcyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUoRlhfV1NUUkMoTCIwIikpKTsNCi19DQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FbmNyeXB0X0Zvcm1hdChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLX0NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0VuY3J5cHRfRm9ybWF0KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQ0KIGVudW0gWEZBX0tFWVRZUEUgew0KLSAgICBYRkFfS0VZVFlQRV9DdXN0b20sDQotICAgIFhGQV9LRVlUWVBFX0VsZW1lbnQsDQorICBYRkFfS0VZVFlQRV9DdXN0b20sDQorICBYRkFfS0VZVFlQRV9FbGVtZW50LA0KIH07DQotdm9pZCogWEZBX0dldE1hcEtleV9DdXN0b20oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0tleSkNCi17DQotICAgIEZYX0RXT1JEIGR3S2V5ID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NLZXkuR2V0UHRyKCksIHdzS2V5LkdldExlbmd0aCgpKTsNCi0gICAgcmV0dXJuICh2b2lkKikodWludHB0cl90KSgoZHdLZXkgPDwgMSkgfCBYRkFfS0VZVFlQRV9DdXN0b20pOw0KK3ZvaWQqIFhGQV9HZXRNYXBLZXlfQ3VzdG9tKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NLZXkpIHsNCisgIEZYX0RXT1JEIGR3S2V5ID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NLZXkuR2V0UHRyKCksIHdzS2V5LkdldExlbmd0aCgpKTsNCisgIHJldHVybiAodm9pZCopKHVpbnRwdHJfdCkoKGR3S2V5IDw8IDEpIHwgWEZBX0tFWVRZUEVfQ3VzdG9tKTsNCiB9DQotdm9pZCogWEZBX0dldE1hcEtleV9FbGVtZW50KFhGQV9FTEVNRU5UIGVFbGVtZW50LCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICByZXR1cm4gKHZvaWQqKSh1aW50cHRyX3QpKChlRWxlbWVudCA8PCAxNikgfCAoZUF0dHJpYnV0ZSA8PCA4KSB8IFhGQV9LRVlUWVBFX0VsZW1lbnQpOw0KK3ZvaWQqIFhGQV9HZXRNYXBLZXlfRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICByZXR1cm4gKHZvaWQqKSh1aW50cHRyX3QpKChlRWxlbWVudCA8PCAxNikgfCAoZUF0dHJpYnV0ZSA8PCA4KSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9LRVlUWVBFX0VsZW1lbnQpOw0KIH0NCi1zdGF0aWMgaW5saW5lIEZYX0JPT0wgWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoWEZBX0VMRU1FTlQgZUVsZW0sIFhGQV9BVFRSSUJVVEUgZUF0dHIsIHZvaWQqICZwS2V5KQ0KLXsNCi0gICAgcEtleSA9IFhGQV9HZXRNYXBLZXlfRWxlbWVudChlRWxlbSwgZUF0dHIpOw0KLSAgICByZXR1cm4gVFJVRTsNCitzdGF0aWMgaW5saW5lIEZYX0JPT0wgWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoWEZBX0VMRU1FTlQgZUVsZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBwS2V5KSB7DQorICBwS2V5ID0gWEZBX0dldE1hcEtleV9FbGVtZW50KGVFbGVtLCBlQXR0cik7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTAlDWEZBX05vZGU6Okhhc0F0dHJpYnV0ZShYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9CT09MIGJDYW5Jbmhlcml0ICkNCi17DQotICAgIHZvaWQqIHBLZXkgPSBOVUxMOw0KLSAgICBpZiAoIVhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KEdldENsYXNzSUQoKSwgZUF0dHIsIHBLZXkpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIEhhc01hcE1vZHVsZUtleShwS2V5LCBiQ2FuSW5oZXJpdCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURSBlQXR0ciwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlLCBGWF9CT09MIGJOb3RpZnkgICkNCi17DQotICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBBdHRyID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHIpOw0KLSAgICBpZiAocEF0dHIgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlID0gcEF0dHItPmVUeXBlOw0KLSAgICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSkgew0KLSAgICAgICAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcE5vdHN1cmUgPSBYRkFfR2V0Tm90c3VyZUF0dHJpYnV0ZShHZXRDbGFzc0lEKCksIHBBdHRyLT5lTmFtZSk7DQotICAgICAgICBlVHlwZSA9IHBOb3RzdXJlID8gcE5vdHN1cmUtPmVUeXBlIDogWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGE7DQotICAgIH0NCi0gICAgc3dpdGNoIChlVHlwZSkgew0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9FbnVtOiB7DQotICAgICAgICAgICAgICAgIFhGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBwRW51bSA9IFhGQV9HZXRBdHRyaWJ1dGVFbnVtQnlOYW1lKHdzVmFsdWUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gU2V0RW51bShwQXR0ci0+ZU5hbWUsIHBFbnVtID8gcEVudW0tPmVOYW1lIDogKFhGQV9BVFRSSUJVVEVFTlVNKShpbnRwdHJfdCkocEF0dHItPnBEZWZWYWx1ZSksIGJOb3RpZnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGE6DQotICAgICAgICAgICAgcmV0dXJuIFNldENEYXRhKHBBdHRyLT5lTmFtZSwgd3NWYWx1ZSwgYk5vdGlmeSk7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW46DQotICAgICAgICAgICAgcmV0dXJuIFNldEJvb2xlYW4ocEF0dHItPmVOYW1lLCB3c1ZhbHVlICE9IEZYX1dTVFJDKEwiMCIpLCBiTm90aWZ5KTsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlcjoNCi0gICAgICAgICAgICByZXR1cm4gU2V0SW50ZWdlcihwQXR0ci0+ZU5hbWUsIEZYU1lTX3JvdW5kKEZYX3djc3RvZih3c1ZhbHVlLkdldFB0cigpLCB3c1ZhbHVlLkdldExlbmd0aCgpKSksIGJOb3RpZnkpOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlOg0KLSAgICAgICAgICAgIHJldHVybiBTZXRNZWFzdXJlKHBBdHRyLT5lTmFtZSwgQ1hGQV9NZWFzdXJlbWVudCh3c1ZhbHVlKSwgYk5vdGlmeSk7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQorRlhfQk9PTCBDWEZBX05vZGU6Okhhc0F0dHJpYnV0ZShYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9CT09MIGJDYW5Jbmhlcml0KSB7DQorICB2b2lkKiBwS2V5ID0gTlVMTDsNCisgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEhhc01hcE1vZHVsZUtleShwS2V5LCBiQ2FuSW5oZXJpdCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURSBlQXR0ciwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgKQ0KLXsNCi0gICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEF0dHIgPSBYRkFfR2V0QXR0cmlidXRlQnlJRChlQXR0cik7DQotICAgIGlmIChwQXR0ciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUgPSBwQXR0ci0+ZVR5cGU7DQotICAgIGlmIChlVHlwZSA9PSBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFKSB7DQotICAgICAgICBYRkFfTFBDTk9UU1VSRUFUVFJJQlVURSBwTm90c3VyZSA9IFhGQV9HZXROb3RzdXJlQXR0cmlidXRlKEdldENsYXNzSUQoKSwgcEF0dHItPmVOYW1lKTsNCi0gICAgICAgIGVUeXBlID0gcE5vdHN1cmUgPyBwTm90c3VyZS0+ZVR5cGUgOiBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YTsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKGVUeXBlKSB7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0VudW06IHsNCi0gICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVZhbHVlOw0KLSAgICAgICAgICAgICAgICBpZiAoIVRyeUVudW0ocEF0dHItPmVOYW1lLCBlVmFsdWUsIGJVc2VEZWZhdWx0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdzVmFsdWUgPSBYRkFfR2V0QXR0cmlidXRlRW51bUJ5SUQoZVZhbHVlKS0+cE5hbWU7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGE6IHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWVDOw0KLSAgICAgICAgICAgICAgICBpZiAoIVRyeUNEYXRhKHBBdHRyLT5lTmFtZSwgd3NWYWx1ZUMsIGJVc2VEZWZhdWx0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdzVmFsdWUgPSB3c1ZhbHVlQzsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuOiB7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZhbHVlOw0KLSAgICAgICAgICAgICAgICBpZiAoIVRyeUJvb2xlYW4ocEF0dHItPmVOYW1lLCBiVmFsdWUsIGJVc2VEZWZhdWx0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdzVmFsdWUgPSBiVmFsdWUgPyBGWF9XU1RSQyhMIjEiKSA6IEZYX1dTVFJDKEwiMCIpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXI6IHsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWU7DQotICAgICAgICAgICAgICAgIGlmICghVHJ5SW50ZWdlcihwQXR0ci0+ZU5hbWUsIGlWYWx1ZSwgYlVzZURlZmF1bHQpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgd3NWYWx1ZS5Gb3JtYXQoTCIlZCIsIGlWYWx1ZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZTogew0KLSAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IG1WYWx1ZTsNCi0gICAgICAgICAgICAgICAgaWYgKCFUcnlNZWFzdXJlKHBBdHRyLT5lTmFtZSwgbVZhbHVlLCBiVXNlRGVmYXVsdCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtVmFsdWUuVG9TdHJpbmcod3NWYWx1ZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCitGWF9CT09MIENYRkFfTm9kZTo6U2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsNCisgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBBdHRyID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHIpOw0KKyAgaWYgKHBBdHRyID09IE5VTEwpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUgPSBwQXR0ci0+ZVR5cGU7DQorICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSkgew0KKyAgICBYRkFfTFBDTk9UU1VSRUFUVFJJQlVURSBwTm90c3VyZSA9DQorICAgICAgICBYRkFfR2V0Tm90c3VyZUF0dHJpYnV0ZShHZXRDbGFzc0lEKCksIHBBdHRyLT5lTmFtZSk7DQorICAgIGVUeXBlID0gcE5vdHN1cmUgPyBwTm90c3VyZS0+ZVR5cGUgOiBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YTsNCisgIH0NCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9FbnVtOiB7DQorICAgICAgWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPIHBFbnVtID0gWEZBX0dldEF0dHJpYnV0ZUVudW1CeU5hbWUod3NWYWx1ZSk7DQorICAgICAgcmV0dXJuIFNldEVudW0ocEF0dHItPmVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgIHBFbnVtID8gcEVudW0tPmVOYW1lDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoWEZBX0FUVFJJQlVURUVOVU0pKGludHB0cl90KShwQXR0ci0+cERlZlZhbHVlKSwNCisgICAgICAgICAgICAgICAgICAgICBiTm90aWZ5KTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YToNCisgICAgICByZXR1cm4gU2V0Q0RhdGEocEF0dHItPmVOYW1lLCB3c1ZhbHVlLCBiTm90aWZ5KTsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuOg0KKyAgICAgIHJldHVybiBTZXRCb29sZWFuKHBBdHRyLT5lTmFtZSwgd3NWYWx1ZSAhPSBGWF9XU1RSQyhMIjAiKSwgYk5vdGlmeSk7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlcjoNCisgICAgICByZXR1cm4gU2V0SW50ZWdlcigNCisgICAgICAgICAgcEF0dHItPmVOYW1lLA0KKyAgICAgICAgICBGWFNZU19yb3VuZChGWF93Y3N0b2Yod3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSkpLA0KKyAgICAgICAgICBiTm90aWZ5KTsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlOg0KKyAgICAgIHJldHVybiBTZXRNZWFzdXJlKHBBdHRyLT5lTmFtZSwgQ1hGQV9NZWFzdXJlbWVudCh3c1ZhbHVlKSwgYk5vdGlmeSk7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHIsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KQ0KLXsNCi0gICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEF0dHJpYnV0ZUluZm8gPSBYRkFfR2V0QXR0cmlidXRlQnlOYW1lKHdzVmFsdWUpOw0KLSAgICBpZiAocEF0dHJpYnV0ZUluZm8pIHsNCi0gICAgICAgIHJldHVybiBTZXRBdHRyaWJ1dGUocEF0dHJpYnV0ZUluZm8tPmVOYW1lLCB3c1ZhbHVlLCBiTm90aWZ5KTsNCi0gICAgfQ0KLSAgICB2b2lkKiBwS2V5ID0gWEZBX0dldE1hcEtleV9DdXN0b20od3NBdHRyKTsNCi0gICAgU2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWUpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX05vZGU6OkdldEF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0ciwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQpDQotew0KLSAgICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwQXR0cmlidXRlSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUod3NBdHRyKTsNCi0gICAgaWYgKHBBdHRyaWJ1dGVJbmZvKSB7DQotICAgICAgICByZXR1cm4gR2V0QXR0cmlidXRlKHBBdHRyaWJ1dGVJbmZvLT5lTmFtZSwgd3NWYWx1ZSwgYlVzZURlZmF1bHQpOw0KLSAgICB9DQotICAgIHZvaWQqIHBLZXkgPSBYRkFfR2V0TWFwS2V5X0N1c3RvbSh3c0F0dHIpOw0KLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZUM7DQotICAgIGlmIChHZXRNYXBNb2R1bGVTdHJpbmcocEtleSwgd3NWYWx1ZUMpKSB7DQotICAgICAgICB3c1ZhbHVlID0gd3NWYWx1ZUM7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpSZW1vdmVBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHIpDQotew0KLSAgICB2b2lkKiBwS2V5ID0gWEZBX0dldE1hcEtleV9DdXN0b20od3NBdHRyKTsNCi0gICAgUmVtb3ZlTWFwTW9kdWxlS2V5KHBLZXkpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX05vZGU6OlRyeUJvb2xlYW4oWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfQk9PTCAmYlZhbHVlLCBGWF9CT09MIGJVc2VEZWZhdWx0ICApDQotew0KLSAgICB2b2lkKiBwVmFsdWUgPSBOVUxMOw0KLSAgICBpZiAoIUdldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBiVXNlRGVmYXVsdCwgcFZhbHVlKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGJWYWx1ZSA9IChGWF9CT09MKSh1aW50cHRyX3QpcFZhbHVlOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX05vZGU6OlRyeUludGVnZXIoWEZBX0FUVFJJQlVURSBlQXR0ciwgaW50MzJfdCAmaVZhbHVlLCBGWF9CT09MIGJVc2VEZWZhdWx0KQ0KLXsNCi0gICAgdm9pZCogcFZhbHVlID0gTlVMTDsNCi0gICAgaWYgKCFHZXRWYWx1ZShlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgYlVzZURlZmF1bHQsIHBWYWx1ZSkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpVmFsdWUgPSAoaW50MzJfdCkodWludHB0cl90KXBWYWx1ZTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlFbnVtKFhGQV9BVFRSSUJVVEUgZUF0dHIsIFhGQV9BVFRSSUJVVEVFTlVNICZlVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQpDQotew0KLSAgICB2b2lkKiBwVmFsdWUgPSBOVUxMOw0KLSAgICBpZiAoIUdldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBiVXNlRGVmYXVsdCwgcFZhbHVlKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGVWYWx1ZSA9IChYRkFfQVRUUklCVVRFRU5VTSkodWludHB0cl90KXBWYWx1ZTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIENYRkFfTWVhc3VyZW1lbnQgbVZhbHVlLCBGWF9CT09MIGJOb3RpZnkgKQ0KLXsNCi0gICAgdm9pZCogcEtleSA9IE5VTEw7DQotICAgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBPbkNoYW5naW5nKGVBdHRyLCAmbVZhbHVlLCBiTm90aWZ5KTsNCi0gICAgU2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksICZtVmFsdWUsIHNpemVvZihDWEZBX01lYXN1cmVtZW50KSk7DQotICAgIE9uQ2hhbmdlZChlQXR0ciwgJm1WYWx1ZSwgYk5vdGlmeSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENYRkFfTm9kZTo6VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLCBDWEZBX01lYXN1cmVtZW50ICZtVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQpDQotew0KLSAgICB2b2lkKiBwS2V5ID0gTlVMTDsNCi0gICAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZvaWQqIHBWYWx1ZTsNCi0gICAgaW50MzJfdCBpQnl0ZXM7DQotICAgIGlmKEdldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCBwVmFsdWUsIGlCeXRlcykgJiYgaUJ5dGVzID09IHNpemVvZihtVmFsdWUpKSB7DQotICAgICAgICBGWF9tZW1jcHkoJm1WYWx1ZSwgcFZhbHVlLCBzaXplb2YobVZhbHVlKSk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBpZihiVXNlRGVmYXVsdCAmJiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgR2V0Q2xhc3NJRCgpLCBlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgbV9lUGFja2V0KSkgew0KLSAgICAgICAgRlhfbWVtY3B5KCZtVmFsdWUsIHBWYWx1ZSwgc2l6ZW9mKG1WYWx1ZSkpOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCitGWF9CT09MIENYRkFfTm9kZTo6R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQpIHsNCisgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBBdHRyID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHIpOw0KKyAgaWYgKHBBdHRyID09IE5VTEwpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfTm9kZTo6U2V0Q0RhdGEoWEZBX0FUVFJJQlVURSBlQXR0ciwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5KQ0KLXsNCi0gICAgdm9pZCogcEtleSA9IE5VTEw7DQotICAgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCisgIH0NCisgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlID0gcEF0dHItPmVUeXBlOw0KKyAgaWYgKGVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUpIHsNCisgICAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcE5vdHN1cmUgPQ0KKyAgICAgICAgWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoR2V0Q2xhc3NJRCgpLCBwQXR0ci0+ZU5hbWUpOw0KKyAgICBlVHlwZSA9IHBOb3RzdXJlID8gcE5vdHN1cmUtPmVUeXBlIDogWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGE7DQorICB9DQorICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfRW51bTogew0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVWYWx1ZTsNCisgICAgICBpZiAoIVRyeUVudW0ocEF0dHItPmVOYW1lLCBlVmFsdWUsIGJVc2VEZWZhdWx0KSkgew0KICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIE9uQ2hhbmdpbmcoZUF0dHIsICh2b2lkKikoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWUsIGJOb3RpZnkpOw0KLSAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgKnBDbG9uZSA9IEZYX05FVyBDRlhfV2lkZVN0cmluZyh3c1ZhbHVlKTsNCi0gICAgICAgIGlmIChwQ2xvbmUgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIFNldFVzZXJEYXRhKHBLZXksIHBDbG9uZSwgJmRlbGV0ZVdpZGVTdHJpbmdDYWxsQmFjayk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBTZXRNYXBNb2R1bGVTdHJpbmcocEtleSwgd3NWYWx1ZSk7DQotICAgICAgICBpZihlQXR0ciA9PSBYRkFfQVRUUklCVVRFX05hbWUpIHsNCi0gICAgICAgICAgICBVcGRhdGVOYW1lSGFzaCgpOw0KLSAgICAgICAgICAgIGlmIChYRkFfTFBDSlNCVUlMVElOSU5GTyBwQnVpbHRpbiA9IFhGQV9HZXRKU0J1aWx0aW5CeUhhc2gobV9kd05hbWVIYXNoKSkgew0KLSAgICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5BZGRKU0J1aWx0aW5PYmplY3QocEJ1aWx0aW4pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBPbkNoYW5nZWQoZUF0dHIsICh2b2lkKikoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnkpOw0KLSAgICBpZiAoSXNOZWVkU2F2aW5nWE1MTm9kZSgpICYmIGVBdHRyICE9IFhGQV9BVFRSSUJVVEVfUXVhbGlmaWVkTmFtZSAmJiBlQXR0ciAhPSBYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKSB7DQotICAgICAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9OYW1lICYmIChtX2VOb2RlQ2xhc3MgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlIHx8IG1fZU5vZGVDbGFzcyA9PSBYRkFfRUxFTUVOVF9EYXRhR3JvdXApKSB7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkgew0KLSAgICAgICAgICAgIEZERV9YTUxOT0RFVFlQRSBlWE1MVHlwZSA9IG1fcFhNTE5vZGUtPkdldFR5cGUoKTsNCi0gICAgICAgICAgICBzd2l0Y2ggKGVYTUxUeXBlKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDoNCi0gICAgICAgICAgICAgICAgICAgIGlmIChJc0F0dHJpYnV0ZUluWE1MKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSktPlNldFN0cmluZyhHZXRDRGF0YShYRkFfQVRUUklCVVRFX1F1YWxpZmllZE5hbWUpLCB3c1ZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVsZXRlQ2hpbGRyZW4gPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZERhdGFOb2RlID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ2hpbGREYXRhTm9kZTsgcENoaWxkRGF0YU5vZGUgPSBwQ2hpbGREYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgZm9ybU5vZGVzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDaGlsZERhdGFOb2RlLT5HZXRCaW5kSXRlbXMoZm9ybU5vZGVzKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVsZXRlQ2hpbGRyZW4gPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkRlbGV0ZUNoaWxkcmVuKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKS0+RGVsZXRlQ2hpbGRyZW4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpLT5TZXRUZXh0RGF0YSh3c1ZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6DQotICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MVGV4dCopbV9wWE1MTm9kZSktPlNldFRleHQod3NWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKGVBdHRyKTsNCi0gICAgICAgIGlmIChwSW5mbykgew0KLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChtX3BYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZSA9IHBJbmZvLT5wTmFtZTsNCi0gICAgICAgICAgICBpZihwSW5mby0+ZU5hbWUgPT0gWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSkgew0KLSAgICAgICAgICAgICAgICB3c0F0dHJOYW1lID0gRlhfV1NUUkMoTCJ4ZmE6IikgKyB3c0F0dHJOYW1lOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSktPlNldFN0cmluZyh3c0F0dHJOYW1lLCB3c1ZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KKyAgICAgIH0NCisgICAgICB3c1ZhbHVlID0gWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKGVWYWx1ZSktPnBOYW1lOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWVDOw0KKyAgICAgIGlmICghVHJ5Q0RhdGEocEF0dHItPmVOYW1lLCB3c1ZhbHVlQywgYlVzZURlZmF1bHQpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHdzVmFsdWUgPSB3c1ZhbHVlQzsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuOiB7DQorICAgICAgRlhfQk9PTCBiVmFsdWU7DQorICAgICAgaWYgKCFUcnlCb29sZWFuKHBBdHRyLT5lTmFtZSwgYlZhbHVlLCBiVXNlRGVmYXVsdCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgd3NWYWx1ZSA9IGJWYWx1ZSA/IEZYX1dTVFJDKEwiMSIpIDogRlhfV1NUUkMoTCIwIik7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlcjogew0KKyAgICAgIGludDMyX3QgaVZhbHVlOw0KKyAgICAgIGlmICghVHJ5SW50ZWdlcihwQXR0ci0+ZU5hbWUsIGlWYWx1ZSwgYlVzZURlZmF1bHQpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHdzVmFsdWUuRm9ybWF0KEwiJWQiLCBpVmFsdWUpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmU6IHsNCisgICAgICBDWEZBX01lYXN1cmVtZW50IG1WYWx1ZTsNCisgICAgICBpZiAoIVRyeU1lYXN1cmUocEF0dHItPmVOYW1lLCBtVmFsdWUsIGJVc2VEZWZhdWx0KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBtVmFsdWUuVG9TdHJpbmcod3NWYWx1ZSk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsNCisgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBBdHRyaWJ1dGVJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5TmFtZSh3c1ZhbHVlKTsNCisgIGlmIChwQXR0cmlidXRlSW5mbykgew0KKyAgICByZXR1cm4gU2V0QXR0cmlidXRlKHBBdHRyaWJ1dGVJbmZvLT5lTmFtZSwgd3NWYWx1ZSwgYk5vdGlmeSk7DQorICB9DQorICB2b2lkKiBwS2V5ID0gWEZBX0dldE1hcEtleV9DdXN0b20od3NBdHRyKTsNCisgIFNldE1hcE1vZHVsZVN0cmluZyhwS2V5LCB3c1ZhbHVlKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6R2V0QXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VEZWZhdWx0KSB7DQorICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwQXR0cmlidXRlSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUod3NBdHRyKTsNCisgIGlmIChwQXR0cmlidXRlSW5mbykgew0KKyAgICByZXR1cm4gR2V0QXR0cmlidXRlKHBBdHRyaWJ1dGVJbmZvLT5lTmFtZSwgd3NWYWx1ZSwgYlVzZURlZmF1bHQpOw0KKyAgfQ0KKyAgdm9pZCogcEtleSA9IFhGQV9HZXRNYXBLZXlfQ3VzdG9tKHdzQXR0cik7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZUM7DQorICBpZiAoR2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWVDKSkgew0KKyAgICB3c1ZhbHVlID0gd3NWYWx1ZUM7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlJlbW92ZUF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cikgew0KKyAgdm9pZCogcEtleSA9IFhGQV9HZXRNYXBLZXlfQ3VzdG9tKHdzQXR0cik7DQorICBSZW1vdmVNYXBNb2R1bGVLZXkocEtleSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlRyeUJvb2xlYW4oWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlRGVmYXVsdCkgew0KKyAgdm9pZCogcFZhbHVlID0gTlVMTDsNCisgIGlmICghR2V0VmFsdWUoZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIGJVc2VEZWZhdWx0LCBwVmFsdWUpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGJWYWx1ZSA9IChGWF9CT09MKSh1aW50cHRyX3QpcFZhbHVlOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQpIHsNCisgIHZvaWQqIHBWYWx1ZSA9IE5VTEw7DQorICBpZiAoIUdldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBiVXNlRGVmYXVsdCwgcFZhbHVlKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpVmFsdWUgPSAoaW50MzJfdCkodWludHB0cl90KXBWYWx1ZTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6VHJ5RW51bShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNJiBlVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlRGVmYXVsdCkgew0KKyAgdm9pZCogcFZhbHVlID0gTlVMTDsNCisgIGlmICghR2V0VmFsdWUoZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIGJVc2VEZWZhdWx0LCBwVmFsdWUpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGVWYWx1ZSA9IChYRkFfQVRUUklCVVRFRU5VTSkodWludHB0cl90KXBWYWx1ZTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQgbVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSkgew0KKyAgdm9pZCogcEtleSA9IE5VTEw7DQorICBpZiAoIVhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KEdldENsYXNzSUQoKSwgZUF0dHIsIHBLZXkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIE9uQ2hhbmdpbmcoZUF0dHIsICZtVmFsdWUsIGJOb3RpZnkpOw0KKyAgU2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksICZtVmFsdWUsIHNpemVvZihDWEZBX01lYXN1cmVtZW50KSk7DQorICBPbkNoYW5nZWQoZUF0dHIsICZtVmFsdWUsIGJOb3RpZnkpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCYgbVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQpIHsNCisgIHZvaWQqIHBLZXkgPSBOVUxMOw0KKyAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB2b2lkKiBwVmFsdWU7DQorICBpbnQzMl90IGlCeXRlczsNCisgIGlmIChHZXRNYXBNb2R1bGVCdWZmZXIocEtleSwgcFZhbHVlLCBpQnl0ZXMpICYmIGlCeXRlcyA9PSBzaXplb2YobVZhbHVlKSkgew0KKyAgICBGWF9tZW1jcHkoJm1WYWx1ZSwgcFZhbHVlLCBzaXplb2YobVZhbHVlKSk7DQogICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJVc2VEZWZhdWx0ICYmDQorICAgICAgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIEdldENsYXNzSUQoKSwgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBtX2VQYWNrZXQpKSB7DQorICAgIEZYX21lbWNweSgmbVZhbHVlLCBwVmFsdWUsIHNpemVvZihtVmFsdWUpKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRBdHRyaWJ1dGVWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5KQ0KLXsNCi0gICAgdm9pZCogcEtleSA9IE5VTEw7DQotICAgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBYRkFfQVRUUklCVVRFX1ZhbHVlLCBwS2V5KSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIE9uQ2hhbmdpbmcoWEZBX0FUVFJJQlVURV9WYWx1ZSwgKHZvaWQqKShjb25zdCBGWF9XQ0hBUiopd3NWYWx1ZSwgYk5vdGlmeSk7DQotICAgIENGWF9XaWRlU3RyaW5nICpwQ2xvbmUgPSBGWF9ORVcgQ0ZYX1dpZGVTdHJpbmcod3NWYWx1ZSk7DQorRlhfQk9PTCBDWEZBX05vZGU6OlNldENEYXRhKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSkgew0KKyAgdm9pZCogcEtleSA9IE5VTEw7DQorICBpZiAoIVhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KEdldENsYXNzSUQoKSwgZUF0dHIsIHBLZXkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIE9uQ2hhbmdpbmcoZUF0dHIsICh2b2lkKikoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWUsIGJOb3RpZnkpOw0KKyAgaWYgKGVBdHRyID09IFhGQV9BVFRSSUJVVEVfVmFsdWUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcqIHBDbG9uZSA9IEZYX05FVyBDRlhfV2lkZVN0cmluZyh3c1ZhbHVlKTsNCiAgICAgaWYgKHBDbG9uZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQogICAgIFNldFVzZXJEYXRhKHBLZXksIHBDbG9uZSwgJmRlbGV0ZVdpZGVTdHJpbmdDYWxsQmFjayk7DQotICAgIE9uQ2hhbmdlZChYRkFfQVRUUklCVVRFX1ZhbHVlLCAodm9pZCopKGNvbnN0IEZYX1dDSEFSKil3c1ZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5KTsNCi0gICAgaWYgKElzTmVlZFNhdmluZ1hNTE5vZGUoKSkgew0KLSAgICAgICAgRkRFX1hNTE5PREVUWVBFIGVYTUxUeXBlID0gbV9wWE1MTm9kZS0+R2V0VHlwZSgpOw0KLSAgICAgICAgc3dpdGNoIChlWE1MVHlwZSkgew0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDoNCi0gICAgICAgICAgICAgICAgaWYgKElzQXR0cmlidXRlSW5YTUwoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpLT5TZXRTdHJpbmcoR2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lKSwgd3NYTUxWYWx1ZSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWxldGVDaGlsZHJlbiA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZERhdGFOb2RlID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ2hpbGREYXRhTm9kZTsgcENoaWxkRGF0YU5vZGUgPSBwQ2hpbGREYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSBmb3JtTm9kZXM7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ2hpbGREYXRhTm9kZS0+R2V0QmluZEl0ZW1zKGZvcm1Ob2RlcykgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVsZXRlQ2hpbGRyZW4gPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJEZWxldGVDaGlsZHJlbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKS0+RGVsZXRlQ2hpbGRyZW4oKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKS0+U2V0VGV4dERhdGEod3NYTUxWYWx1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0Og0KLSAgICAgICAgICAgICAgICAoKElGREVfWE1MVGV4dCopbV9wWE1MTm9kZSktPlNldFRleHQod3NYTUxWYWx1ZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCi0gICAgICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFNldE1hcE1vZHVsZVN0cmluZyhwS2V5LCB3c1ZhbHVlKTsNCisgICAgaWYgKGVBdHRyID09IFhGQV9BVFRSSUJVVEVfTmFtZSkgew0KKyAgICAgIFVwZGF0ZU5hbWVIYXNoKCk7DQorICAgICAgaWYgKFhGQV9MUENKU0JVSUxUSU5JTkZPIHBCdWlsdGluID0NCisgICAgICAgICAgICAgIFhGQV9HZXRKU0J1aWx0aW5CeUhhc2gobV9kd05hbWVIYXNoKSkgew0KKyAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+QWRkSlNCdWlsdGluT2JqZWN0KHBCdWlsdGluKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wJQ1hGQV9Ob2RlOjpUcnlDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSwgRlhfQk9PTCBiVXNlRGVmYXVsdCwgRlhfQk9PTCBiUHJvdG8pDQotew0KLSAgICB2b2lkKiBwS2V5ID0gTlVMTDsNCi0gICAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgT25DaGFuZ2VkKGVBdHRyLCAodm9pZCopKGNvbnN0IEZYX1dDSEFSKil3c1ZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5KTsNCisgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkgJiYgZUF0dHIgIT0gWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lICYmDQorICAgICAgZUF0dHIgIT0gWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSkgew0KKyAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9OYW1lICYmDQorICAgICAgICAobV9lTm9kZUNsYXNzID09IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSB8fA0KKyAgICAgICAgIG1fZU5vZGVDbGFzcyA9PSBYRkFfRUxFTUVOVF9EYXRhR3JvdXApKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCiAgICAgaWYgKGVBdHRyID09IFhGQV9BVFRSSUJVVEVfVmFsdWUpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nICpwU3RyID0gKENGWF9XaWRlU3RyaW5nKilHZXRVc2VyRGF0YShwS2V5LCBiUHJvdG8pOw0KLSAgICAgICAgaWYgKHBTdHIpIHsNCi0gICAgICAgICAgICB3c1ZhbHVlID0gKnBTdHI7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZUM7DQotICAgICAgICBpZiAoR2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWVDKSkgew0KLSAgICAgICAgICAgIHdzVmFsdWUgPSB3c1ZhbHVlQzsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoIWJVc2VEZWZhdWx0KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgdm9pZCogcFZhbHVlID0gTlVMTDsNCi0gICAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBHZXRDbGFzc0lEKCksIGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgbV9lUGFja2V0KSkgew0KLSAgICAgICAgd3NWYWx1ZSA9IChjb25zdCBGWF9XQ0hBUiopcFZhbHVlOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfTm9kZTo6VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURSBlQXR0ciwgQ0ZYX1dpZGVTdHJpbmdDICZ3c1ZhbHVlLCBGWF9CT09MIGJVc2VEZWZhdWx0LCBGWF9CT09MIGJQcm90bykNCi17DQotICAgIHZvaWQqIHBLZXkgPSBOVUxMOw0KLSAgICBpZiAoIVhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KEdldENsYXNzSUQoKSwgZUF0dHIsIHBLZXkpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKGVBdHRyID09IFhGQV9BVFRSSUJVVEVfVmFsdWUpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nICpwU3RyID0gKENGWF9XaWRlU3RyaW5nKilHZXRVc2VyRGF0YShwS2V5LCBiUHJvdG8pOw0KLSAgICAgICAgaWYgKHBTdHIpIHsNCi0gICAgICAgICAgICB3c1ZhbHVlID0gKnBTdHI7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoR2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWUpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKCFiVXNlRGVmYXVsdCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHZvaWQqIHBWYWx1ZSA9IE5VTEw7DQotICAgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgR2V0Q2xhc3NJRCgpLCBlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIG1fZVBhY2tldCkpIHsNCi0gICAgICAgIHdzVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmdDKShjb25zdCBGWF9XQ0hBUiopcFZhbHVlOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfTm9kZTo6U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEUgZUF0dHIsIHZvaWQqIHBEYXRhLCBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvICkNCi17DQotICAgIHZvaWQqIHBLZXkgPSBOVUxMOw0KLSAgICBpZiAoIVhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KEdldENsYXNzSUQoKSwgZUF0dHIsIHBLZXkpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIFNldFVzZXJEYXRhKHBLZXksIHBEYXRhLCBwQ2FsbGJhY2tJbmZvKTsNCi19DQotRlhfQk9PTAlDWEZBX05vZGU6OlRyeU9iamVjdChYRkFfQVRUUklCVVRFIGVBdHRyLCB2b2lkKiAmcERhdGEpDQotew0KLSAgICB2b2lkKiBwS2V5ID0gTlVMTDsNCi0gICAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHBEYXRhID0gR2V0VXNlckRhdGEocEtleSk7DQotICAgIHJldHVybiBwRGF0YSAhPSBOVUxMOw0KLX0NCi1GWF9CT09MIENYRkFfTm9kZTo6U2V0VmFsdWUoWEZBX0FUVFJJQlVURSBlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsIHZvaWQqIHBWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KQ0KLXsNCi0gICAgdm9pZCogcEtleSA9IE5VTEw7DQotICAgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBPbkNoYW5naW5nKGVBdHRyLCBwVmFsdWUsIGJOb3RpZnkpOw0KLSAgICBTZXRNYXBNb2R1bGVWYWx1ZShwS2V5LCBwVmFsdWUpOw0KLSAgICBPbkNoYW5nZWQoZUF0dHIsIHBWYWx1ZSwgYk5vdGlmeSk7DQotICAgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkpIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChtX3BYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7DQotICAgICAgICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKGVBdHRyKTsNCi0gICAgICAgIGlmIChwSW5mbykgew0KLSAgICAgICAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9FbnVtOg0KLSAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpLT5TZXRTdHJpbmcocEluZm8tPnBOYW1lLCBYRkFfR2V0QXR0cmlidXRlRW51bUJ5SUQoKFhGQV9BVFRSSUJVVEVFTlVNKSh1aW50cHRyX3QpcFZhbHVlKS0+cE5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbjoNCi0gICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKS0+U2V0U3RyaW5nKHBJbmZvLT5wTmFtZSwgcFZhbHVlID8gRlhfV1NUUkMoTCIxIikgOiBGWF9XU1RSQyhMIjAiKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyOg0KLSAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpLT5TZXRJbnRlZ2VyKHBJbmZvLT5wTmFtZSwgKGludDMyX3QpKHVpbnRwdHJfdClwVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQoMCk7DQorICAgICAgRkRFX1hNTE5PREVUWVBFIGVYTUxUeXBlID0gbV9wWE1MTm9kZS0+R2V0VHlwZSgpOw0KKyAgICAgIHN3aXRjaCAoZVhNTFR5cGUpIHsNCisgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDoNCisgICAgICAgICAgaWYgKElzQXR0cmlidXRlSW5YTUwoKSkgew0KKyAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKQ0KKyAgICAgICAgICAgICAgICAtPlNldFN0cmluZyhHZXRDRGF0YShYRkFfQVRUUklCVVRFX1F1YWxpZmllZE5hbWUpLCB3c1ZhbHVlKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9CT09MIGJEZWxldGVDaGlsZHJlbiA9IFRSVUU7DQorICAgICAgICAgICAgaWYgKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgew0KKyAgICAgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZERhdGFOb2RlID0NCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgICAgcENoaWxkRGF0YU5vZGU7IHBDaGlsZERhdGFOb2RlID0gcENoaWxkRGF0YU5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgZm9ybU5vZGVzOw0KKyAgICAgICAgICAgICAgICBpZiAocENoaWxkRGF0YU5vZGUtPkdldEJpbmRJdGVtcyhmb3JtTm9kZXMpID4gMCkgew0KKyAgICAgICAgICAgICAgICAgIGJEZWxldGVDaGlsZHJlbiA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENYRkFfTm9kZTo6R2V0VmFsdWUoWEZBX0FUVFJJQlVURSBlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsIEZYX0JPT0wgYlVzZURlZmF1bHQsIHZvaWQqICZwVmFsdWUpDQotew0KLSAgICB2b2lkKiBwS2V5ID0gTlVMTDsNCi0gICAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmKEdldE1hcE1vZHVsZVZhbHVlKHBLZXksIHBWYWx1ZSkpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIGlmICghYlVzZURlZmF1bHQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIEdldENsYXNzSUQoKSwgZUF0dHIsIGVUeXBlLCBtX2VQYWNrZXQpOw0KLX0NCi1zdGF0aWMgdm9pZCBYRkFfRGVmYXVsdEZyZWVEYXRhKHZvaWQqIHBEYXRhKQ0KLXsNCi19DQotc3RhdGljIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8gZ3NfWEZBRGVmYXVsdEZyZWVEYXRhID0ge1hGQV9EZWZhdWx0RnJlZURhdGEsIE5VTEx9Ow0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRVc2VyRGF0YSh2b2lkKiBwS2V5LCB2b2lkKiBwRGF0YSwgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbyApDQotew0KLSAgICBTZXRNYXBNb2R1bGVCdWZmZXIocEtleSwgJnBEYXRhLCBzaXplb2Yodm9pZCopLCBwQ2FsbGJhY2tJbmZvID8gcENhbGxiYWNrSW5mbyA6ICZnc19YRkFEZWZhdWx0RnJlZURhdGEpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX05vZGU6OlRyeVVzZXJEYXRhKHZvaWQqIHBLZXksIHZvaWQqICZwRGF0YSwgRlhfQk9PTCBiUHJvdG9BbHNvKQ0KLXsNCi0gICAgaW50MzJfdCBpQnl0ZXMgPSAwOw0KLSAgICBpZiAoIUdldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCBwRGF0YSwgaUJ5dGVzLCBiUHJvdG9BbHNvKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBpQnl0ZXMgPT0gc2l6ZW9mKHZvaWQqKSAmJiBGWFNZU19tZW1jcHkoJnBEYXRhLCBwRGF0YSwgaUJ5dGVzKTsNCi19DQotRlhfQk9PTCBDWEZBX05vZGU6OlNldFNjcmlwdENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LCBGWF9CT09MIGJTeW5jRGF0YSkNCi17DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KLSAgICBDWEZBX05vZGUqIHBCaW5kTm9kZSA9IE5VTEw7DQotICAgIHN3aXRjaCAoR2V0T2JqZWN0VHlwZSgpKSB7DQotICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGU6IHsNCi0gICAgICAgICAgICAgICAgaWYgKFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KHRoaXMpKSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZSA9IEdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcENoaWxkVmFsdWUgPSBwVmFsdWUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwQ2hpbGRWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBwQ2hpbGRWYWx1ZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHBDaGlsZFZhbHVlLT5TZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NDb250ZW50LCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBCaW5kID0gR2V0QmluZERhdGEoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiU3luY0RhdGEgJiYgcEJpbmQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzU2F2ZVRleHRBcnJheTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTaXplID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdzQ29udGVudC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSB3c0NvbnRlbnQuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUVuZCA9IHdzQ29udGVudC5GaW5kKEwnXG4nLCBpU3RhcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRW5kID0gKGlFbmQgPT0gLTEpID8gaUxlbmd0aCA6IGlFbmQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpRW5kID49IGlTdGFydCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NTYXZlVGV4dEFycmF5LkFkZCh3c0NvbnRlbnQuTWlkKGlTdGFydCwgaUVuZCAtIGlTdGFydCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0ID0gaUVuZCArIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaVN0YXJ0ID49IGlMZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmQgPSB3c0NvbnRlbnQuRmluZChMJ1xuJywgaVN0YXJ0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpRW5kIDwgMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzU2F2ZVRleHRBcnJheS5BZGQod3NDb250ZW50Lk1pZChpU3RhcnQsIGlMZW5ndGggLSBpU3RhcnQpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU2l6ZSA9IHdzU2F2ZVRleHRBcnJheS5HZXRTaXplKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlTaXplID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBCaW5kLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaW5kLT5SZW1vdmVDaGlsZChwQ2hpbGROb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5IHZhbHVlTm9kZXM7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURhdGFzID0gcEJpbmQtPkdldE5vZGVMaXN0KHZhbHVlTm9kZXMsIFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuLCBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaURhdGFzIDwgaVNpemUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFkZE5vZGVzID0gaVNpemUgLSBpRGF0YXM7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBWYWx1ZU5vZGVzID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpQWRkTm9kZXMtLSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWVOb2RlcyA9IHBCaW5kLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZU5vZGVzLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwidmFsdWUiKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlTm9kZXMtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpbmQtPkluc2VydENoaWxkKHBWYWx1ZU5vZGVzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZU5vZGVzID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpRGF0YXMgPiBpU2l6ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGVsTm9kZXMgPSBpRGF0YXMgLSBpU2l6ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpRGVsTm9kZXMtLSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmluZC0+UmVtb3ZlQ2hpbGQocEJpbmQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDWEZBX05vZGUgKnBWYWx1ZU5vZGUgPSBwQmluZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwVmFsdWVOb2RlOyBwVmFsdWVOb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NTYXZlVGV4dEFycmF5W2ldLCB3c1NhdmVUZXh0QXJyYXlbaV0sIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSBub2RlQXJyYXk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEJpbmQtPkdldEJpbmRJdGVtcyhub2RlQXJyYXkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5vZGVBcnJheS5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbm9kZUFycmF5W2ldOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE5vZGUgPT0gdGhpcykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c0NvbnRlbnQsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQotICAgICAgICAgICAgICAgICAgICBwTm9kZSA9IHRoaXM7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZSA9IEdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcENoaWxkVmFsdWUgPSBwVmFsdWUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwQ2hpbGRWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBwQ2hpbGRWYWx1ZS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzQ29udGVudCwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBCaW5kTm9kZSA9IEdldEJpbmREYXRhKCk7DQotICAgICAgICAgICAgICAgIGlmIChwQmluZE5vZGUgJiYgYlN5bmNEYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICBwQmluZE5vZGUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBGQUxTRSk7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSBub2RlQXJyYXk7DQotICAgICAgICAgICAgICAgICAgICBwQmluZE5vZGUtPkdldEJpbmRJdGVtcyhub2RlQXJyYXkpOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbm9kZUFycmF5LkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG5vZGVBcnJheVtpXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocE5vZGUgPT0gdGhpcykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c0NvbnRlbnQsIGJOb3RpZnksIFRSVUUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwQmluZE5vZGUgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBpZiAoYkRlbGV0ZUNoaWxkcmVuKSB7DQorICAgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSktPkRlbGV0ZUNoaWxkcmVuKCk7DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZTogew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KLSAgICAgICAgICAgICAgICBpZiAoR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgR2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NDb250ZW50VHlwZSA9IEZYX1dTVFJDKEwiIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgU2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcENvbnRlbnRSYXdEYXRhTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFwQ29udGVudFJhd0RhdGFOb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICBwQ29udGVudFJhd0RhdGFOb2RlID0gQ3JlYXRlU2FtZVBhY2tldE5vZGUoKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKSkgPyBYRkFfRUxFTUVOVF9TaGFycHhtbCA6IFhGQV9FTEVNRU5UX1NoYXJwdGV4dCk7DQotICAgICAgICAgICAgICAgICAgICBJbnNlcnRDaGlsZChwQ29udGVudFJhd0RhdGFOb2RlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gcENvbnRlbnRSYXdEYXRhTm9kZS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzWE1MVmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlQzoNCi0gICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGU6DQotICAgICAgICAgICAgcE5vZGUgPSB0aGlzOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlVjoNCi0gICAgICAgICAgICBwTm9kZSA9IHRoaXM7DQotICAgICAgICAgICAgaWYgKGJTeW5jRGF0YSAmJiBHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRm9ybSkgew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgICAgICAgICAgaWYgKHBQYXJlbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAocFBhcmVudCAmJiBwUGFyZW50LT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwUGFyZW50ICYmIHBQYXJlbnQtPklzQ29udGFpbmVyTm9kZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcEJpbmROb2RlID0gcFBhcmVudC0+R2V0QmluZERhdGEoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJpbmROb2RlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaW5kTm9kZS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzWE1MVmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpLT5TZXRUZXh0RGF0YSh3c1ZhbHVlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDoNCisgICAgICAgICAgKChJRkRFX1hNTFRleHQqKW1fcFhNTE5vZGUpLT5TZXRUZXh0KHdzVmFsdWUpOw0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgaWYgKEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgcE5vZGUgPSB0aGlzOw0KLSAgICAgICAgICAgICAgICBwQmluZE5vZGUgPSB0aGlzOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gVFJVRTsNCiAgICAgfQ0KLSAgICBpZiAocE5vZGUpIHsNCi0gICAgICAgIFNldEF0dHJpYnV0ZVZhbHVlKHdzQ29udGVudCwgd3NYTUxWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSk7DQotICAgICAgICBpZiAocEJpbmROb2RlICYmIGJTeW5jRGF0YSkgew0KLSAgICAgICAgICAgIENYRkFfTm9kZUFycmF5IG5vZGVBcnJheTsNCi0gICAgICAgICAgICBwQmluZE5vZGUtPkdldEJpbmRJdGVtcyhub2RlQXJyYXkpOw0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5vZGVBcnJheS5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbm9kZUFycmF5W2ldOw0KLSAgICAgICAgICAgICAgICBwTm9kZS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzQ29udGVudCwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBUUlVFOw0KKyAgICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKGVBdHRyKTsNCisgICAgaWYgKHBJbmZvKSB7DQorICAgICAgRlhTWVNfYXNzZXJ0KG1fcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJOYW1lID0gcEluZm8tPnBOYW1lOw0KKyAgICAgIGlmIChwSW5mby0+ZU5hbWUgPT0gWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSkgew0KKyAgICAgICAgd3NBdHRyTmFtZSA9IEZYX1dTVFJDKEwieGZhOiIpICsgd3NBdHRyTmFtZTsNCisgICAgICB9DQorICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpLT5TZXRTdHJpbmcod3NBdHRyTmFtZSwgd3NWYWx1ZSk7DQogICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6U2V0QXR0cmlidXRlVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSkgew0KKyAgdm9pZCogcEtleSA9IE5VTEw7DQorICBpZiAoIVhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KEdldENsYXNzSUQoKSwgWEZBX0FUVFJJQlVURV9WYWx1ZSwgcEtleSkpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfTm9kZTo6U2V0Q29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5LCAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LCBGWF9CT09MIGJTeW5jRGF0YSkNCi17DQotICAgIHJldHVybiBTZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NYTUxWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgYlN5bmNEYXRhKTsNCi19DQotQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9Ob2RlOjpHZXRTY3JpcHRDb250ZW50KEZYX0JPT0wgYlNjcmlwdE1vZGlmeSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCi0gICAgcmV0dXJuIFRyeUNvbnRlbnQod3NDb250ZW50LCBiU2NyaXB0TW9kaWZ5KSA/IHdzQ29udGVudCA6IENGWF9XaWRlU3RyaW5nKCk7DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfTm9kZTo6R2V0Q29udGVudCgpDQotew0KLSAgICByZXR1cm4gIEdldFNjcmlwdENvbnRlbnQoKTsNCi19DQotRlhfQk9PTCBDWEZBX05vZGU6OlRyeUNvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LCBGWF9CT09MIGJQcm90bykNCi17DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KLSAgICBzd2l0Y2ggKEdldE9iamVjdFR5cGUoKSkgew0KLSAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlOg0KLSAgICAgICAgICAgIGlmIChHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQotICAgICAgICAgICAgICAgIHBOb2RlID0gdGhpczsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZSA9IEdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFwVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBDaGlsZFZhbHVlID0gcFZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICAgICAgICAgIGlmIChwQ2hpbGRWYWx1ZSAmJiBYRkFfRmllbGRJc011bHRpTGlzdEJveCh0aGlzKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcENoaWxkVmFsdWUtPlNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBGWF9XU1RSQyhMInRleHQveG1sIikpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBwQ2hpbGRWYWx1ZSA/IHBDaGlsZFZhbHVlLT5UcnlDb250ZW50KHdzQ29udGVudCwgYlNjcmlwdE1vZGlmeSwgYlByb3RvKSA6IEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGU6IHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwQ29udGVudFJhd0RhdGFOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgICAgICBpZiAoIXBDb250ZW50UmF3RGF0YU5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVsZW1lbnQgPSBYRkFfRUxFTUVOVF9TaGFycHRleHQ7DQotICAgICAgICAgICAgICAgICAgICBpZiAoR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgR2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQvaHRtbCIpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB4bWw7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcENvbnRlbnRSYXdEYXRhTm9kZSA9IENyZWF0ZVNhbWVQYWNrZXROb2RlKGVsZW1lbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgSW5zZXJ0Q2hpbGQocENvbnRlbnRSYXdEYXRhTm9kZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBDb250ZW50UmF3RGF0YU5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50LCBiU2NyaXB0TW9kaWZ5LCBiUHJvdG8pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZUM6DQotICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVWOg0KLSAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZToNCi0gICAgICAgICAgICBwTm9kZSA9IHRoaXM7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGlmIChHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlKSB7DQotICAgICAgICAgICAgICAgIHBOb2RlID0gdGhpczsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgaWYgKHBOb2RlKSB7DQotICAgICAgICBpZiAoYlNjcmlwdE1vZGlmeSkgew0KLSAgICAgICAgICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KLSAgICAgICAgICAgIGlmIChwU2NyaXB0Q29udGV4dCkgew0KLSAgICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5BZGROb2Rlc09mUnVuU2NyaXB0KHRoaXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBUcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbnRlbnQsIEZBTFNFLCBiUHJvdG8pOw0KLSAgICB9DQorICB9DQorICBPbkNoYW5naW5nKFhGQV9BVFRSSUJVVEVfVmFsdWUsICh2b2lkKikoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWUsIGJOb3RpZnkpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcqIHBDbG9uZSA9IEZYX05FVyBDRlhfV2lkZVN0cmluZyh3c1ZhbHVlKTsNCisgIGlmIChwQ2xvbmUgPT0gTlVMTCkgew0KICAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUNYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRNb2RlbE5vZGUoKQ0KLXsNCi0gICAgc3dpdGNoKEdldFBhY2tldElEKCkpIHsNCi0gICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9YRFA6DQotICAgICAgICAgICAgcmV0dXJuIG1fcERvY3VtZW50LT5HZXRSb290KCk7DQotICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfQ29uZmlnOg0KLSAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfQ29uZmlnKTsNCi0gICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZToNCi0gICAgICAgICAgICByZXR1cm4gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1RlbXBsYXRlKTsNCi0gICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Gb3JtOg0KLSAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQotICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfRGF0YXNldHM6DQotICAgICAgICAgICAgcmV0dXJuIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhc2V0cyk7DQotICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0Og0KLSAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfTG9jYWxlU2V0KTsNCi0gICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0Og0KLSAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfQ29ubmVjdGlvblNldCk7DQotICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0Og0KLSAgICAgICAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfU291cmNlU2V0KTsNCi0gICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9YZGM6DQotICAgICAgICAgICAgcmV0dXJuIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9YZGMpOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gdGhpczsNCi0gICAgfQ0KLX0NCi1GWF9CT09MIENYRkFfTm9kZTo6VHJ5TmFtZXNwYWNlKENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZSkNCi17DQotICAgIHdzTmFtZXNwYWNlLkVtcHR5KCk7DQotICAgIGlmKHRoaXMtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGUgfHwgdGhpcy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhY2tldCkgew0KLSAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IHRoaXMtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQotICAgICAgICBpZighcFhNTE5vZGUgfHwgcFhNTE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlKS0+R2V0TmFtZXNwYWNlVVJJKHdzTmFtZXNwYWNlKTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9IGVsc2UgaWYodGhpcy0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQotICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gdGhpcy0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCi0gICAgICAgIGlmKCFwWE1MTm9kZSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKHBYTUxOb2RlLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYodGhpcy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSAmJiB0aGlzLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMpID09IFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhKSB7DQotICAgICAgICAgICAgcmV0dXJuIFhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZU5hbWVzcGFjZVF1YWxpZmllcigoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZSwgdGhpcy0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lKSwgd3NOYW1lc3BhY2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlKS0+R2V0TmFtZXNwYWNlVVJJKHdzTmFtZXNwYWNlKTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9Ob2RlICpwTW9kZWxOb2RlID0gR2V0TW9kZWxOb2RlKCk7DQotICAgICAgICByZXR1cm4gcE1vZGVsTm9kZS0+VHJ5TmFtZXNwYWNlKHdzTmFtZXNwYWNlKTsNCi0gICAgfQ0KLX0NCi1DWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0UHJvcGVydHkoaW50MzJfdCBpbmRleCwgWEZBX0VMRU1FTlQgZVByb3BlcnR5LCBGWF9CT09MIGJDcmVhdGVQcm9wZXJ0eSAgKQ0KLXsNCi0gICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQgPSBHZXRDbGFzc0lEKCk7DQotICAgIEZYX0RXT1JEIGR3UGFja2V0ID0gR2V0UGFja2V0SUQoKTsNCi0gICAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0eSA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChlRWxlbWVudCwgZVByb3BlcnR5LCBkd1BhY2tldCk7DQotICAgIGlmIChwUHJvcGVydHkgPT0gTlVMTCB8fCBpbmRleCA+PSBwUHJvcGVydHktPnVPY2N1cikgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlICpwTm9kZSA9IG1fcENoaWxkOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIGZvcig7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSA9PSBlUHJvcGVydHkpIHsNCi0gICAgICAgICAgICBpQ291bnQgKys7DQotICAgICAgICAgICAgaWYgKGlDb3VudCA+IGluZGV4KSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwTm9kZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKCFiQ3JlYXRlUHJvcGVydHkpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGlmIChwUHJvcGVydHktPnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YpIHsNCi0gICAgICAgIHBOb2RlID0gbV9wQ2hpbGQ7DQotICAgICAgICBmb3IoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgICAgIFhGQV9MUENQUk9QRVJUWSBwRXhpc3RQcm90ZXJ0eSA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChlRWxlbWVudCwgcE5vZGUtPkdldENsYXNzSUQoKSwgZHdQYWNrZXQpOw0KLSAgICAgICAgICAgIGlmIChwRXhpc3RQcm90ZXJ0eSAmJiAocEV4aXN0UHJvdGVydHktPnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBJWEZBX09iakZhY3RvcnkgKnBGYWN0b3J5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCk7DQotICAgIFhGQV9MUENQQUNLRVRJTkZPIHBQYWNrZXQgPSBYRkFfR2V0UGFja2V0QnlJRChkd1BhY2tldCk7DQotICAgIENYRkFfTm9kZSAqcE5ld05vZGU7DQotICAgIGZvciAoOyBpQ291bnQgPD0gaW5kZXggOyBpQ291bnQgKyspIHsNCi0gICAgICAgIHBOZXdOb2RlID0gcEZhY3RvcnktPkNyZWF0ZU5vZGUocFBhY2tldCwgZVByb3BlcnR5KTsNCi0gICAgICAgIGlmKCFwTmV3Tm9kZSkgew0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy0+SW5zZXJ0Q2hpbGQocE5ld05vZGUsIE5VTEwpOw0KLSAgICAgICAgcE5ld05vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcE5ld05vZGU7DQotfQ0KLWludDMyX3QgQ1hGQV9Ob2RlOjpDb3VudENoaWxkcmVuKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBGWF9CT09MIGJPbmx5Q2hpbGQpDQotew0KLSAgICBDWEZBX05vZGUgKnBOb2RlID0gbV9wQ2hpbGQ7DQotICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgZm9yKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IGVFbGVtZW50IHx8IGVFbGVtZW50ID09ICBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQotICAgICAgICAgICAgaWYoYk9ubHlDaGlsZCkgew0KLSAgICAgICAgICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoR2V0Q2xhc3NJRCgpLCBwTm9kZS0+R2V0Q2xhc3NJRCgpLCBYRkFfWERQUEFDS0VUX1VOS05PV04pOw0KLSAgICAgICAgICAgICAgICBpZihwUHJvcGVydCkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaUNvdW50ICsrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBpQ291bnQ7DQotfQ0KLUNYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRDaGlsZChpbnQzMl90IGluZGV4LCBYRkFfRUxFTUVOVCBlRWxlbWVudCwgRlhfQk9PTCBiT25seUNoaWxkKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEpOw0KLSAgICBDWEZBX05vZGUgKnBOb2RlID0gbV9wQ2hpbGQ7DQotICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgZm9yKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IGVFbGVtZW50IHx8IGVFbGVtZW50ID09ICBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQotICAgICAgICAgICAgaWYoYk9ubHlDaGlsZCkgew0KLSAgICAgICAgICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoR2V0Q2xhc3NJRCgpLCBwTm9kZS0+R2V0Q2xhc3NJRCgpLCBYRkFfWERQUEFDS0VUX1VOS05PV04pOw0KLSAgICAgICAgICAgICAgICBpZihwUHJvcGVydCkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaUNvdW50ICsrOw0KLSAgICAgICAgICAgIGlmIChpQ291bnQgPiBpbmRleCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcE5vZGU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1pbnQzMl90IENYRkFfTm9kZTo6SW5zZXJ0Q2hpbGQoaW50MzJfdCBpbmRleCwgQ1hGQV9Ob2RlICpwTm9kZSkNCi17DQotICAgIEFTU0VSVChwTm9kZSAhPSBOVUxMICYmIHBOb2RlLT5tX3BOZXh0ID09IE5VTEwpOw0KLSAgICBwTm9kZS0+bV9wUGFyZW50ID0gdGhpczsNCi0gICAgRlhfQk9PTCBiV2FzUHVyZ2VOb2RlID0gbV9wRG9jdW1lbnQtPlJlbW92ZVB1cmdlTm9kZShwTm9kZSk7DQotICAgIEZYU1lTX2Fzc2VydChiV2FzUHVyZ2VOb2RlID09IFRSVUUpOw0KLSAgICBpZiAobV9wQ2hpbGQgPT0gTlVMTCB8fCBpbmRleCA9PSAwKSB7DQotICAgICAgICBpZiAoaW5kZXggPiAwKSB7DQotICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcE5vZGUtPm1fcE5leHQgPSBtX3BDaGlsZDsNCi0gICAgICAgIG1fcENoaWxkID0gcE5vZGU7DQotICAgICAgICBpbmRleCA9IDA7DQotICAgIH0gZWxzZSBpZiAoaW5kZXggPCAwKSB7DQotICAgICAgICBtX3BMYXN0Q2hpbGQtPm1fcE5leHQgPSBwTm9kZTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfTm9kZSAqcFByZXYgPSBtX3BDaGlsZDsNCi0gICAgICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgICAgIHdoaWxlICgrK2lDb3VudCAhPSBpbmRleCAmJiBwUHJldi0+bV9wTmV4dCkgew0KLSAgICAgICAgICAgIHBQcmV2ID0gcFByZXYtPm1fcE5leHQ7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4ICE9IGlDb3VudCkgew0KLSAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBOb2RlLT5tX3BOZXh0ID0gcFByZXYtPm1fcE5leHQ7DQotICAgICAgICBwUHJldi0+bV9wTmV4dCA9IHBOb2RlOw0KLSAgICAgICAgaW5kZXggPSBpQ291bnQ7DQotICAgIH0NCi0gICAgaWYgKHBOb2RlLT5tX3BOZXh0ID09IE5VTEwpIHsNCi0gICAgICAgIG1fcExhc3RDaGlsZCA9IHBOb2RlOw0KLSAgICB9DQotICAgIEFTU0VSVChtX3BMYXN0Q2hpbGQgIT0gTlVMTCAmJiBtX3BMYXN0Q2hpbGQtPm1fcE5leHQgPT0gTlVMTCk7DQotICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19IYXNSZW1vdmVkLCBGQUxTRSk7DQotICAgIElYRkFfTm90aWZ5ICpwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKHBOb3RpZnkpIHsNCi0gICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfQ2hpbGRBZGRlZCwgcE5vZGUpOw0KLSAgICB9DQotICAgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkgJiYgcE5vZGUtPm1fcFhNTE5vZGUpIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChwTm9kZS0+bV9wWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpID09IE5VTEwpOw0KLSAgICAgICAgbV9wWE1MTm9kZS0+SW5zZXJ0Q2hpbGROb2RlKHBOb2RlLT5tX3BYTUxOb2RlLCBpbmRleCk7DQotICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfT3duWE1MTm9kZSwgRkFMU0UsIEZBTFNFKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gaW5kZXg7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpJbnNlcnRDaGlsZChDWEZBX05vZGUgKnBOb2RlLCBDWEZBX05vZGUgKnBCZWZvcmVOb2RlKQ0KLXsNCi0gICAgaWYgKCFwTm9kZSB8fCBwTm9kZS0+bV9wUGFyZW50ICE9IE5VTEwgfHwgKHBCZWZvcmVOb2RlICYmIHBCZWZvcmVOb2RlLT5tX3BQYXJlbnQgIT0gdGhpcykpIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiV2FzUHVyZ2VOb2RlID0gbV9wRG9jdW1lbnQtPlJlbW92ZVB1cmdlTm9kZShwTm9kZSk7DQotICAgIEZYU1lTX2Fzc2VydChiV2FzUHVyZ2VOb2RlID09IFRSVUUpOw0KLSAgICBpbnQzMl90IG5JbmRleCA9IC0xOw0KLSAgICBwTm9kZS0+bV9wUGFyZW50ID0gdGhpczsNCi0gICAgaWYgKG1fcENoaWxkID09IE5VTEwgfHwgcEJlZm9yZU5vZGUgPT0gbV9wQ2hpbGQpIHsNCi0gICAgICAgIHBOb2RlLT5tX3BOZXh0ID0gbV9wQ2hpbGQ7DQotICAgICAgICBtX3BDaGlsZCA9IHBOb2RlOw0KLSAgICAgICAgbkluZGV4ID0gMDsNCi0gICAgfSBlbHNlIGlmICghcEJlZm9yZU5vZGUpIHsNCi0gICAgICAgIHBOb2RlLT5tX3BOZXh0ID0gbV9wTGFzdENoaWxkLT5tX3BOZXh0Ow0KLSAgICAgICAgbV9wTGFzdENoaWxkLT5tX3BOZXh0ID0gcE5vZGU7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBuSW5kZXggPSAxOw0KLSAgICAgICAgQ1hGQV9Ob2RlICpwUHJldiA9IG1fcENoaWxkOw0KLSAgICAgICAgd2hpbGUgKHBQcmV2LT5tX3BOZXh0ICE9IHBCZWZvcmVOb2RlKSB7DQotICAgICAgICAgICAgcFByZXYgPSBwUHJldi0+bV9wTmV4dDsNCi0gICAgICAgICAgICBuSW5kZXgrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHBOb2RlLT5tX3BOZXh0ID0gcFByZXYtPm1fcE5leHQ7DQotICAgICAgICBwUHJldi0+bV9wTmV4dCA9IHBOb2RlOw0KLSAgICB9DQotICAgIGlmIChwTm9kZS0+bV9wTmV4dCA9PSBOVUxMKSB7DQotICAgICAgICBtX3BMYXN0Q2hpbGQgPSBwTm9kZTsNCi0gICAgfQ0KLSAgICBBU1NFUlQobV9wTGFzdENoaWxkICE9IE5VTEwgJiYgbV9wTGFzdENoaWxkLT5tX3BOZXh0ID09IE5VTEwpOw0KLSAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZCwgRkFMU0UpOw0KLSAgICBJWEZBX05vdGlmeSAqcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmIChwTm90aWZ5KSB7DQotICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX0NoaWxkQWRkZWQsIHBOb2RlKTsNCi0gICAgfQ0KLSAgICBpZiAoSXNOZWVkU2F2aW5nWE1MTm9kZSgpICYmIHBOb2RlLT5tX3BYTUxOb2RlKSB7DQotICAgICAgICBGWFNZU19hc3NlcnQocE5vZGUtPm1fcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KSA9PSBOVUxMKTsNCi0gICAgICAgIG1fcFhNTE5vZGUtPkluc2VydENoaWxkTm9kZShwTm9kZS0+bV9wWE1MTm9kZSwgbkluZGV4KTsNCi0gICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBGQUxTRSwgRkFMU0UpOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfTm9kZTo6RGVwcmVjYXRlZF9HZXRQcmV2U2libGluZygpDQotew0KLSAgICBpZighbV9wUGFyZW50KSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBmb3IgKENYRkFfTm9kZSAqcFNpYmxpbmcgPSBtX3BQYXJlbnQtPm1fcENoaWxkOyBwU2libGluZzsgcFNpYmxpbmcgPSBwU2libGluZy0+bV9wTmV4dCkgew0KLSAgICAgICAgaWYocFNpYmxpbmctPm1fcE5leHQgPT0gdGhpcykgew0KLSAgICAgICAgICAgIHJldHVybiBwU2libGluZzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotRlhfQk9PTCBDWEZBX05vZGU6OlJlbW92ZUNoaWxkKENYRkFfTm9kZSAqcE5vZGUsIEZYX0JPT0wgYk5vdGlmeSkNCi17DQotICAgIGlmIChwTm9kZSA9PSBOVUxMIHx8IHBOb2RlLT5tX3BQYXJlbnQgIT0gdGhpcykgew0KLSAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAobV9wQ2hpbGQgPT0gcE5vZGUpIHsNCi0gICAgICAgIG1fcENoaWxkID0gcE5vZGUtPm1fcE5leHQ7DQotICAgICAgICBpZiAobV9wTGFzdENoaWxkID09IHBOb2RlKSB7DQotICAgICAgICAgICAgbV9wTGFzdENoaWxkID0gcE5vZGUtPm1fcE5leHQ7DQotICAgICAgICB9DQotICAgICAgICBwTm9kZS0+bV9wTmV4dCA9IE5VTEw7DQotICAgICAgICBwTm9kZS0+bV9wUGFyZW50ID0gTlVMTDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfTm9kZSAqcFByZXYgPSBwTm9kZS0+RGVwcmVjYXRlZF9HZXRQcmV2U2libGluZygpOw0KLSAgICAgICAgcFByZXYtPm1fcE5leHQgPSBwTm9kZS0+bV9wTmV4dDsNCi0gICAgICAgIGlmIChtX3BMYXN0Q2hpbGQgPT0gcE5vZGUpIHsNCi0gICAgICAgICAgICBtX3BMYXN0Q2hpbGQgPSBwTm9kZS0+bV9wTmV4dCA/IHBOb2RlLT5tX3BOZXh0IDogcFByZXY7DQotICAgICAgICB9DQotICAgICAgICBwTm9kZS0+bV9wTmV4dCA9IE5VTEw7DQotICAgICAgICBwTm9kZS0+bV9wUGFyZW50ID0gTlVMTDsNCi0gICAgfQ0KLSAgICBBU1NFUlQobV9wTGFzdENoaWxkID09IE5VTEwgfHwgbV9wTGFzdENoaWxkLT5tX3BOZXh0ID09IE5VTEwpOw0KLSAgICBPblJlbW92ZWQodGhpcywgcE5vZGUsIGJOb3RpZnkpOw0KLSAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZCk7DQotICAgIG1fcERvY3VtZW50LT5BZGRQdXJnZU5vZGUocE5vZGUpOw0KLSAgICBpZiAoSXNOZWVkU2F2aW5nWE1MTm9kZSgpICYmIHBOb2RlLT5tX3BYTUxOb2RlKSB7DQotICAgICAgICBpZiAocE5vZGUtPklzQXR0cmlidXRlSW5YTUwoKSkgew0KLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwTm9kZS0+bV9wWE1MTm9kZSA9PSBtX3BYTUxOb2RlICYmIG1fcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCi0gICAgICAgICAgICBpZiAocE5vZGUtPm1fcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KikocE5vZGUtPm1fcFhNTE5vZGUpOw0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NBdHRyaWJ1dGVOYW1lID0gcE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfUXVhbGlmaWVkTmFtZSk7DQotICAgICAgICAgICAgICAgIHBYTUxFbGVtZW50LT5SZW1vdmVBdHRyaWJ1dGUod3NBdHRyaWJ1dGVOYW1lLkdldFB0cigpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KLSAgICAgICAgICAgIHBOb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUsIEZBTFNFKTsNCi0gICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBOZXdYTUxFbGVtZW50ID0gSUZERV9YTUxFbGVtZW50OjpDcmVhdGUod3NOYW1lKTsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZSA9IHRoaXMtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUpOw0KLSAgICAgICAgICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgcE5ld1hNTEVsZW1lbnQtPlNldFRleHREYXRhKHdzVmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwTm9kZS0+bV9wWE1MTm9kZSA9IHBOZXdYTUxFbGVtZW50Ow0KLSAgICAgICAgICAgIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd24pOw0KKyAgfQ0KKyAgU2V0VXNlckRhdGEocEtleSwgcENsb25lLCAmZGVsZXRlV2lkZVN0cmluZ0NhbGxCYWNrKTsNCisgIE9uQ2hhbmdlZChYRkFfQVRUUklCVVRFX1ZhbHVlLCAodm9pZCopKGNvbnN0IEZYX1dDSEFSKil3c1ZhbHVlLCBiTm90aWZ5LA0KKyAgICAgICAgICAgIGJTY3JpcHRNb2RpZnkpOw0KKyAgaWYgKElzTmVlZFNhdmluZ1hNTE5vZGUoKSkgew0KKyAgICBGREVfWE1MTk9ERVRZUEUgZVhNTFR5cGUgPSBtX3BYTUxOb2RlLT5HZXRUeXBlKCk7DQorICAgIHN3aXRjaCAoZVhNTFR5cGUpIHsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX0VsZW1lbnQ6DQorICAgICAgICBpZiAoSXNBdHRyaWJ1dGVJblhNTCgpKSB7DQorICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKQ0KKyAgICAgICAgICAgICAgLT5TZXRTdHJpbmcoR2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lKSwgd3NYTUxWYWx1ZSk7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1fcFhNTE5vZGUtPlJlbW92ZUNoaWxkTm9kZShwTm9kZS0+bV9wWE1MTm9kZSk7DQorICAgICAgICAgIEZYX0JPT0wgYkRlbGV0ZUNoaWxkcmVuID0gVFJVRTsNCisgICAgICAgICAgaWYgKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgew0KKyAgICAgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGREYXRhTm9kZSA9DQorICAgICAgICAgICAgICAgICAgICAgdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICAgICAgcENoaWxkRGF0YU5vZGU7IHBDaGlsZERhdGFOb2RlID0gcENoaWxkRGF0YU5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSBmb3JtTm9kZXM7DQorICAgICAgICAgICAgICBpZiAocENoaWxkRGF0YU5vZGUtPkdldEJpbmRJdGVtcyhmb3JtTm9kZXMpID4gMCkgew0KKyAgICAgICAgICAgICAgICBiRGVsZXRlQ2hpbGRyZW4gPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChiRGVsZXRlQ2hpbGRyZW4pIHsNCisgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSktPkRlbGV0ZUNoaWxkcmVuKCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpLT5TZXRUZXh0RGF0YSh3c1hNTFZhbHVlKTsNCiAgICAgICAgIH0NCi0gICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBUUlVFLCBGQUxTRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6DQorICAgICAgICAoKElGREVfWE1MVGV4dCopbV9wWE1MTm9kZSktPlNldFRleHQod3NYTUxWYWx1ZSk7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KICAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlRyeUNEYXRhKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VEZWZhdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm90bykgew0KKyAgdm9pZCogcEtleSA9IE5VTEw7DQorICBpZiAoIVhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KEdldENsYXNzSUQoKSwgZUF0dHIsIHBLZXkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ZhbHVlKSB7DQorICAgIENGWF9XaWRlU3RyaW5nKiBwU3RyID0gKENGWF9XaWRlU3RyaW5nKilHZXRVc2VyRGF0YShwS2V5LCBiUHJvdG8pOw0KKyAgICBpZiAocFN0cikgew0KKyAgICAgIHdzVmFsdWUgPSAqcFN0cjsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWVDOw0KKyAgICBpZiAoR2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWVDKSkgew0KKyAgICAgIHdzVmFsdWUgPSB3c1ZhbHVlQzsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFiVXNlRGVmYXVsdCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB2b2lkKiBwVmFsdWUgPSBOVUxMOw0KKyAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBHZXRDbGFzc0lEKCksIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIG1fZVBhY2tldCkpIHsNCisgICAgd3NWYWx1ZSA9IChjb25zdCBGWF9XQ0hBUiopcFZhbHVlOw0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEZpcnN0Q2hpbGRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIGNvbnN0DQotew0KLSAgICByZXR1cm4gR2V0Rmlyc3RDaGlsZEJ5TmFtZSh3c05hbWUuSXNFbXB0eSgpID8gMCA6IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgd3NOYW1lLkdldExlbmd0aCgpKSk7DQotfQ0KLUNYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRGaXJzdENoaWxkQnlOYW1lKEZYX0RXT1JEIGR3TmFtZUhhc2gpIGNvbnN0DQotew0KLSAgICBmb3IoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgIGlmKHBOb2RlLT5HZXROYW1lSGFzaCgpID09IGR3TmFtZUhhc2gpIHsNCi0gICAgICAgICAgICByZXR1cm4gcE5vZGU7DQotICAgICAgICB9DQorRlhfQk9PTCBDWEZBX05vZGU6OlRyeUNEYXRhKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlRGVmYXVsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvdG8pIHsNCisgIHZvaWQqIHBLZXkgPSBOVUxMOw0KKyAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyogcFN0ciA9IChDRlhfV2lkZVN0cmluZyopR2V0VXNlckRhdGEocEtleSwgYlByb3RvKTsNCisgICAgaWYgKHBTdHIpIHsNCisgICAgICB3c1ZhbHVlID0gKnBTdHI7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUNYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVCBlRWxlbWVudCkgY29uc3QNCi17DQotICAgIGZvcihDWEZBX05vZGUqIHBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgaWYocE5vZGUtPkdldENsYXNzSUQoKSA9PSBlRWxlbWVudCkgew0KLSAgICAgICAgICAgIHJldHVybiBwTm9kZTsNCi0gICAgICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmIChHZXRNYXBNb2R1bGVTdHJpbmcocEtleSwgd3NWYWx1ZSkpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCiAgICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmICghYlVzZURlZmF1bHQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdm9pZCogcFZhbHVlID0gTlVMTDsNCisgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgR2V0Q2xhc3NJRCgpLCBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBtX2VQYWNrZXQpKSB7DQorICAgIHdzVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmdDKShjb25zdCBGWF9XQ0hBUiopcFZhbHVlOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE5leHRTYW1lTmFtZVNpYmxpbmcoRlhfRFdPUkQgZHdOYW1lSGFzaCkgY29uc3QNCi17DQotICAgIGZvcihDWEZBX05vZGUqIHBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgIGlmKHBOb2RlLT5HZXROYW1lSGFzaCgpID09IGR3TmFtZUhhc2gpIHsNCi0gICAgICAgICAgICByZXR1cm4gcE5vZGU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorRlhfQk9PTCBDWEZBX05vZGU6OlNldE9iamVjdChYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvKSB7DQorICB2b2lkKiBwS2V5ID0gTlVMTDsNCisgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFNldFVzZXJEYXRhKHBLZXksIHBEYXRhLCBwQ2FsbGJhY2tJbmZvKTsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE5leHRTYW1lTmFtZVNpYmxpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05vZGVOYW1lKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIEdldE5leHRTYW1lTmFtZVNpYmxpbmcod3NOb2RlTmFtZS5Jc0VtcHR5KCkgPyAwIDogRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOb2RlTmFtZS5HZXRQdHIoKSwgd3NOb2RlTmFtZS5HZXRMZW5ndGgoKSkpOw0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlPYmplY3QoWEZBX0FUVFJJQlVURSBlQXR0ciwgdm9pZComIHBEYXRhKSB7DQorICB2b2lkKiBwS2V5ID0gTlVMTDsNCisgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcERhdGEgPSBHZXRVc2VyRGF0YShwS2V5KTsNCisgIHJldHVybiBwRGF0YSAhPSBOVUxMOw0KIH0NCi1DWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlQgZUVsZW1lbnQpIGNvbnN0DQotew0KLSAgICBmb3IoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpZihwTm9kZS0+R2V0Q2xhc3NJRCgpID09IGVFbGVtZW50KSB7DQotICAgICAgICAgICAgcmV0dXJuIHBOb2RlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1pbnQzMl90IENYRkFfTm9kZTo6R2V0Tm9kZVNhbWVOYW1lSW5kZXgoKSBjb25zdA0KLXsNCi0gICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcFNjcmlwdENvbnRleHQtPkdldEluZGV4QnlOYW1lKChDWEZBX05vZGUqKXRoaXMpOw0KLX0NCi1pbnQzMl90IENYRkFfTm9kZTo6R2V0Tm9kZVNhbWVDbGFzc0luZGV4KCkgY29uc3QNCi17DQotICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KLSAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgcmV0dXJuIHBTY3JpcHRDb250ZXh0LT5HZXRJbmRleEJ5Q2xhc3NOYW1lKChDWEZBX05vZGUqKXRoaXMpOw0KLX0NCi12b2lkIENYRkFfTm9kZTo6R2V0U09NRXhwcmVzc2lvbihDRlhfV2lkZVN0cmluZyYgd3NTT01FeHByZXNzaW9uKQ0KLXsNCi0gICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwU2NyaXB0Q29udGV4dC0+R2V0U29tRXhwcmVzc2lvbih0aGlzLCB3c1NPTUV4cHJlc3Npb24pOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0SW5zdGFuY2VNZ3JPZlN1YmZvcm0oKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwSW5zdGFuY2VNZ3IgPSBOVUxMOw0KLSAgICBpZiAobV9lUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfRm9ybSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgaWYgKCFwUGFyZW50Tm9kZSB8fCBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0FyZWEpIHsNCi0gICAgICAgICAgICByZXR1cm4gcEluc3RhbmNlTWdyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yIChDWEZBX05vZGUgKnBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKTsgcE5vZGUgIT0gTlVMTDsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKSkgew0KLSAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCi0gICAgICAgICAgICBpZiAoKGVUeXBlID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgZVR5cGUgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkgJiYgcE5vZGUtPm1fZHdOYW1lSGFzaCAhPSBtX2R3TmFtZUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZSA9IEdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0luc3ROYW1lID0gcE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQotICAgICAgICAgICAgICAgIGlmICh3c0luc3ROYW1lLkdldExlbmd0aCgpID4gMCAmJiB3c0luc3ROYW1lLkdldEF0KDApID09ICdfJyAmJiB3c0luc3ROYW1lLk1pZCgxKSA9PSB3c05hbWUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZU1nciA9IHBOb2RlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcEluc3RhbmNlTWdyOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0T2NjdXJOb2RlKCkNCi17DQotICAgIHJldHVybiBHZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpIYXNGbGFnKEZYX0RXT1JEIGR3RmxhZykgY29uc3QNCi17DQotICAgIGlmIChtX3VGbGFncyAmIGR3RmxhZykgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgc3dpdGNoIChkd0ZsYWcpIHsNCi0gICAgICAgIGNhc2UgWEZBX05PREVGTEFHX0hhc1JlbW92ZWQ6DQotICAgICAgICAgICAgcmV0dXJuIG1fcFBhcmVudCAmJiBtX3BQYXJlbnQtPkhhc0ZsYWcoZHdGbGFnKTsNCitGWF9CT09MIENYRkFfTm9kZTo6U2V0VmFsdWUoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5KSB7DQorICB2b2lkKiBwS2V5ID0gTlVMTDsNCisgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgT25DaGFuZ2luZyhlQXR0ciwgcFZhbHVlLCBiTm90aWZ5KTsNCisgIFNldE1hcE1vZHVsZVZhbHVlKHBLZXksIHBWYWx1ZSk7DQorICBPbkNoYW5nZWQoZUF0dHIsIHBWYWx1ZSwgYk5vdGlmeSk7DQorICBpZiAoSXNOZWVkU2F2aW5nWE1MTm9kZSgpKSB7DQorICAgIEZYU1lTX2Fzc2VydChtX3BYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7DQorICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHIpOw0KKyAgICBpZiAocEluZm8pIHsNCisgICAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0VudW06DQorICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKQ0KKyAgICAgICAgICAgICAgLT5TZXRTdHJpbmcoDQorICAgICAgICAgICAgICAgICAgcEluZm8tPnBOYW1lLA0KKyAgICAgICAgICAgICAgICAgIFhGQV9HZXRBdHRyaWJ1dGVFbnVtQnlJRCgoWEZBX0FUVFJJQlVURUVOVU0pKHVpbnRwdHJfdClwVmFsdWUpDQorICAgICAgICAgICAgICAgICAgICAgIC0+cE5hbWUpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbjoNCisgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpDQorICAgICAgICAgICAgICAtPlNldFN0cmluZyhwSW5mby0+cE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWUgPyBGWF9XU1RSQyhMIjEiKSA6IEZYX1dTVFJDKEwiMCIpKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXI6DQorICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKQ0KKyAgICAgICAgICAgICAgLT5TZXRJbnRlZ2VyKHBJbmZvLT5wTmFtZSwgKGludDMyX3QpKHVpbnRwdHJfdClwVmFsdWUpOw0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgICB9DQogICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6R2V0VmFsdWUoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBwVmFsdWUpIHsNCisgIHZvaWQqIHBLZXkgPSBOVUxMOw0KKyAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoR2V0TWFwTW9kdWxlVmFsdWUocEtleSwgcFZhbHVlKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmICghYlVzZURlZmF1bHQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBHZXRDbGFzc0lEKCksIGVBdHRyLCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZVBhY2tldCk7DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpTZXRGbGFnKEZYX0RXT1JEIGR3RmxhZywgRlhfQk9PTCBiT24gLCBGWF9CT09MIGJOb3RpZnkgKQ0KLXsNCi0gICAgaWYgKGJPbikgew0KLSAgICAgICAgc3dpdGNoIChkd0ZsYWcpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZDoNCi0gICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgIUhhc0ZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKSkgew0KLSAgICAgICAgICAgICAgICAgICAgSVhGQV9Ob3RpZnkgKnBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBOb3RpZnkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1JlYWR5KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KK3N0YXRpYyB2b2lkIFhGQV9EZWZhdWx0RnJlZURhdGEodm9pZCogcERhdGEpIHt9DQorc3RhdGljIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8gZ3NfWEZBRGVmYXVsdEZyZWVEYXRhID0gew0KKyAgICBYRkFfRGVmYXVsdEZyZWVEYXRhLCBOVUxMfTsNCitGWF9CT09MIENYRkFfTm9kZTo6U2V0VXNlckRhdGEodm9pZCogcEtleSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8qIHBDYWxsYmFja0luZm8pIHsNCisgIFNldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCAmcERhdGEsIHNpemVvZih2b2lkKiksDQorICAgICAgICAgICAgICAgICAgICAgcENhbGxiYWNrSW5mbyA/IHBDYWxsYmFja0luZm8gOiAmZ3NfWEZBRGVmYXVsdEZyZWVEYXRhKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6VHJ5VXNlckRhdGEodm9pZCogcEtleSwgdm9pZComIHBEYXRhLCBGWF9CT09MIGJQcm90b0Fsc28pIHsNCisgIGludDMyX3QgaUJ5dGVzID0gMDsNCisgIGlmICghR2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksIHBEYXRhLCBpQnl0ZXMsIGJQcm90b0Fsc28pKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBpQnl0ZXMgPT0gc2l6ZW9mKHZvaWQqKSAmJiBGWFNZU19tZW1jcHkoJnBEYXRhLCBwRGF0YSwgaUJ5dGVzKTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlNldFNjcmlwdENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bmNEYXRhKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIENYRkFfTm9kZSogcEJpbmROb2RlID0gTlVMTDsNCisgIHN3aXRjaCAoR2V0T2JqZWN0VHlwZSgpKSB7DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZTogew0KKyAgICAgIGlmIChYRkFfRmllbGRJc011bHRpTGlzdEJveCh0aGlzKSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBHZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgICAgICBDWEZBX05vZGUqIHBDaGlsZFZhbHVlID0gcFZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBGWFNZU19hc3NlcnQocENoaWxkVmFsdWUpOw0KKyAgICAgICAgcENoaWxkVmFsdWUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIEZYX1dTVFJDKEwidGV4dC94bWwiKSk7DQorICAgICAgICBwQ2hpbGRWYWx1ZS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzQ29udGVudCwgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JpcHRNb2RpZnksIEZBTFNFKTsNCisgICAgICAgIENYRkFfTm9kZSogcEJpbmQgPSBHZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgaWYgKGJTeW5jRGF0YSAmJiBwQmluZCkgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzU2F2ZVRleHRBcnJheTsNCisgICAgICAgICAgaW50MzJfdCBpU2l6ZSA9IDA7DQorICAgICAgICAgIGlmICghd3NDb250ZW50LklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMDsNCisgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSB3c0NvbnRlbnQuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgaW50MzJfdCBpRW5kID0gd3NDb250ZW50LkZpbmQoTCdcbicsIGlTdGFydCk7DQorICAgICAgICAgICAgaUVuZCA9IChpRW5kID09IC0xKSA/IGlMZW5ndGggOiBpRW5kOw0KKyAgICAgICAgICAgIHdoaWxlIChpRW5kID49IGlTdGFydCkgew0KKyAgICAgICAgICAgICAgd3NTYXZlVGV4dEFycmF5LkFkZCh3c0NvbnRlbnQuTWlkKGlTdGFydCwgaUVuZCAtIGlTdGFydCkpOw0KKyAgICAgICAgICAgICAgaVN0YXJ0ID0gaUVuZCArIDE7DQorICAgICAgICAgICAgICBpZiAoaVN0YXJ0ID49IGlMZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpRW5kID0gd3NDb250ZW50LkZpbmQoTCdcbicsIGlTdGFydCk7DQorICAgICAgICAgICAgICBpZiAoaUVuZCA8IDApIHsNCisgICAgICAgICAgICAgICAgd3NTYXZlVGV4dEFycmF5LkFkZCh3c0NvbnRlbnQuTWlkKGlTdGFydCwgaUxlbmd0aCAtIGlTdGFydCkpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpU2l6ZSA9IHdzU2F2ZVRleHRBcnJheS5HZXRTaXplKCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGlTaXplID09IDApIHsNCisgICAgICAgICAgICB3aGlsZSAoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0NCisgICAgICAgICAgICAgICAgICAgICAgIHBCaW5kLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgICAgICAgICAgIHBCaW5kLT5SZW1vdmVDaGlsZChwQ2hpbGROb2RlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgdmFsdWVOb2RlczsNCisgICAgICAgICAgICBpbnQzMl90IGlEYXRhcyA9IHBCaW5kLT5HZXROb2RlTGlzdCgNCisgICAgICAgICAgICAgICAgdmFsdWVOb2RlcywgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4sIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKGlEYXRhcyA8IGlTaXplKSB7DQorICAgICAgICAgICAgICBpbnQzMl90IGlBZGROb2RlcyA9IGlTaXplIC0gaURhdGFzOw0KKyAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlcyA9IE5VTEw7DQorICAgICAgICAgICAgICB3aGlsZSAoaUFkZE5vZGVzLS0gPiAwKSB7DQorICAgICAgICAgICAgICAgIHBWYWx1ZU5vZGVzID0NCisgICAgICAgICAgICAgICAgICAgIHBCaW5kLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KKyAgICAgICAgICAgICAgICBwVmFsdWVOb2Rlcy0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMInZhbHVlIikpOw0KKyAgICAgICAgICAgICAgICBwVmFsdWVOb2Rlcy0+Q3JlYXRlWE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgICAgICAgICAgcEJpbmQtPkluc2VydENoaWxkKHBWYWx1ZU5vZGVzKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHBWYWx1ZU5vZGVzID0gTlVMTDsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGlEYXRhcyA+IGlTaXplKSB7DQorICAgICAgICAgICAgICBpbnQzMl90IGlEZWxOb2RlcyA9IGlEYXRhcyAtIGlTaXplOw0KKyAgICAgICAgICAgICAgd2hpbGUgKGlEZWxOb2Rlcy0tID4gMCkgew0KKyAgICAgICAgICAgICAgICBwQmluZC0+UmVtb3ZlQ2hpbGQocEJpbmQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGludDMyX3QgaSA9IDA7DQorICAgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPQ0KKyAgICAgICAgICAgICAgICAgICAgIHBCaW5kLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgICBwVmFsdWVOb2RlOyBwVmFsdWVOb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICAgICAgcFZhbHVlTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NTYXZlVGV4dEFycmF5W2ldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NTYXZlVGV4dEFycmF5W2ldLCBGQUxTRSk7DQorICAgICAgICAgICAgICBpKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIENYRkFfTm9kZUFycmF5IG5vZGVBcnJheTsNCisgICAgICAgICAgcEJpbmQtPkdldEJpbmRJdGVtcyhub2RlQXJyYXkpOw0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBub2RlQXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbm9kZUFycmF5W2ldOw0KKyAgICAgICAgICAgIGlmIChwTm9kZSA9PSB0aGlzKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcE5vZGUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c0NvbnRlbnQsIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjcmlwdE1vZGlmeSwgRkFMU0UpOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBtX3VGbGFncyB8PSBkd0ZsYWc7DQorICAgICAgICBicmVhazsNCisgICAgICB9IGVsc2UgaWYgKEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgICAgIHBOb2RlID0gdGhpczsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBHZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgICAgICBDWEZBX05vZGUqIHBDaGlsZFZhbHVlID0gcFZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBGWFNZU19hc3NlcnQocENoaWxkVmFsdWUpOw0KKyAgICAgICAgcENoaWxkVmFsdWUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c0NvbnRlbnQsIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICAgIHBCaW5kTm9kZSA9IEdldEJpbmREYXRhKCk7DQorICAgICAgaWYgKHBCaW5kTm9kZSAmJiBiU3luY0RhdGEpIHsNCisgICAgICAgIHBCaW5kTm9kZS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzWE1MVmFsdWUsIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjcmlwdE1vZGlmeSwgRkFMU0UpOw0KKyAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgbm9kZUFycmF5Ow0KKyAgICAgICAgcEJpbmROb2RlLT5HZXRCaW5kSXRlbXMobm9kZUFycmF5KTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5vZGVBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbm9kZUFycmF5W2ldOw0KKyAgICAgICAgICBpZiAocE5vZGUgPT0gdGhpcykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBOb2RlLT5TZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NDb250ZW50LCBiTm90aWZ5LCBUUlVFLCBGQUxTRSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHBCaW5kTm9kZSA9IE5VTEw7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZTogew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICAgICAgaWYgKEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGEpIHsNCisgICAgICAgIEdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBGQUxTRSk7DQorICAgICAgICBpZiAod3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQvaHRtbCIpKSkgew0KKyAgICAgICAgICB3c0NvbnRlbnRUeXBlID0gRlhfV1NUUkMoTCIiKTsNCisgICAgICAgICAgU2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBDb250ZW50UmF3RGF0YU5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgaWYgKCFwQ29udGVudFJhd0RhdGFOb2RlKSB7DQorICAgICAgICBwQ29udGVudFJhd0RhdGFOb2RlID0NCisgICAgICAgICAgICBDcmVhdGVTYW1lUGFja2V0Tm9kZSgod3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQveG1sIikpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFhGQV9FTEVNRU5UX1NoYXJweG1sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0VMRU1FTlRfU2hhcnB0ZXh0KTsNCisgICAgICAgIEluc2VydENoaWxkKHBDb250ZW50UmF3RGF0YU5vZGUpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcENvbnRlbnRSYXdEYXRhTm9kZS0+U2V0U2NyaXB0Q29udGVudCgNCisgICAgICAgICAgd3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVDOg0KKyAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlOg0KKyAgICAgIHBOb2RlID0gdGhpczsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlVjoNCisgICAgICBwTm9kZSA9IHRoaXM7DQorICAgICAgaWYgKGJTeW5jRGF0YSAmJiBHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRm9ybSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBpZiAocFBhcmVudCkgew0KKyAgICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocFBhcmVudCAmJiBwUGFyZW50LT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFsdWUpIHsNCisgICAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICBpZiAocFBhcmVudCAmJiBwUGFyZW50LT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KKyAgICAgICAgICAgIHBCaW5kTm9kZSA9IHBQYXJlbnQtPkdldEJpbmREYXRhKCk7DQorICAgICAgICAgICAgaWYgKHBCaW5kTm9kZSkgew0KKyAgICAgICAgICAgICAgcEJpbmROb2RlLT5TZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NYTUxWYWx1ZSwgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBGQUxTRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGlmIChHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlKSB7DQorICAgICAgICBwTm9kZSA9IHRoaXM7DQorICAgICAgICBwQmluZE5vZGUgPSB0aGlzOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgIH0NCisgIGlmIChwTm9kZSkgew0KKyAgICBTZXRBdHRyaWJ1dGVWYWx1ZSh3c0NvbnRlbnQsIHdzWE1MVmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnkpOw0KKyAgICBpZiAocEJpbmROb2RlICYmIGJTeW5jRGF0YSkgew0KKyAgICAgIENYRkFfTm9kZUFycmF5IG5vZGVBcnJheTsNCisgICAgICBwQmluZE5vZGUtPkdldEJpbmRJdGVtcyhub2RlQXJyYXkpOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5vZGVBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG5vZGVBcnJheVtpXTsNCisgICAgICAgIHBOb2RlLT5TZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NDb250ZW50LCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bmNEYXRhKSB7DQorICByZXR1cm4gU2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzWE1MVmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBiU3luY0RhdGEpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX05vZGU6OkdldFNjcmlwdENvbnRlbnQoRlhfQk9PTCBiU2NyaXB0TW9kaWZ5KSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICByZXR1cm4gVHJ5Q29udGVudCh3c0NvbnRlbnQsIGJTY3JpcHRNb2RpZnkpID8gd3NDb250ZW50IDogQ0ZYX1dpZGVTdHJpbmcoKTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9Ob2RlOjpHZXRDb250ZW50KCkgew0KKyAgcmV0dXJuIEdldFNjcmlwdENvbnRlbnQoKTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlRyeUNvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvdG8pIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgc3dpdGNoIChHZXRPYmplY3RUeXBlKCkpIHsNCisgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlOg0KKyAgICAgIGlmIChHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgICAgICBwTm9kZSA9IHRoaXM7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gR2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KKyAgICAgICAgaWYgKCFwVmFsdWUpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRWYWx1ZSA9IHBWYWx1ZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgaWYgKHBDaGlsZFZhbHVlICYmIFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KHRoaXMpKSB7DQorICAgICAgICAgIHBDaGlsZFZhbHVlLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XU1RSQyhMInRleHQveG1sIikpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBDaGlsZFZhbHVlDQorICAgICAgICAgICAgICAgICAgID8gcENoaWxkVmFsdWUtPlRyeUNvbnRlbnQod3NDb250ZW50LCBiU2NyaXB0TW9kaWZ5LCBiUHJvdG8pDQorICAgICAgICAgICAgICAgICAgIDogRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlOiB7DQorICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudFJhd0RhdGFOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgIGlmICghcENvbnRlbnRSYXdEYXRhTm9kZSkgew0KKyAgICAgICAgWEZBX0VMRU1FTlQgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJwdGV4dDsNCisgICAgICAgIGlmIChHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICAgICAgICAgIEdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBGQUxTRSk7DQorICAgICAgICAgIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQorICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJweEhUTUw7DQorICAgICAgICAgIH0gZWxzZSBpZiAod3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQveG1sIikpKSB7DQorICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJweG1sOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwQ29udGVudFJhd0RhdGFOb2RlID0gQ3JlYXRlU2FtZVBhY2tldE5vZGUoZWxlbWVudCk7DQorICAgICAgICBJbnNlcnRDaGlsZChwQ29udGVudFJhd0RhdGFOb2RlKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIHBDb250ZW50UmF3RGF0YU5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50LCBiU2NyaXB0TW9kaWZ5LCBiUHJvdG8pOw0KKyAgICB9DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZUM6DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZVY6DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGU6DQorICAgICAgcE5vZGUgPSB0aGlzOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGlmIChHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlKSB7DQorICAgICAgICBwTm9kZSA9IHRoaXM7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKHBOb2RlKSB7DQorICAgIGlmIChiU2NyaXB0TW9kaWZ5KSB7DQorICAgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgICAgaWYgKHBTY3JpcHRDb250ZXh0KSB7DQorICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5BZGROb2Rlc09mUnVuU2NyaXB0KHRoaXMpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb250ZW50LCBGQUxTRSwgYlByb3RvKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE1vZGVsTm9kZSgpIHsNCisgIHN3aXRjaCAoR2V0UGFja2V0SUQoKSkgew0KKyAgICBjYXNlIFhGQV9YRFBQQUNLRVRfWERQOg0KKyAgICAgIHJldHVybiBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOw0KKyAgICBjYXNlIFhGQV9YRFBQQUNLRVRfQ29uZmlnOg0KKyAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfQ29uZmlnKTsNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlOg0KKyAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfVGVtcGxhdGUpOw0KKyAgICBjYXNlIFhGQV9YRFBQQUNLRVRfRm9ybToNCisgICAgICByZXR1cm4gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgICBjYXNlIFhGQV9YRFBQQUNLRVRfRGF0YXNldHM6DQorICAgICAgcmV0dXJuIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhc2V0cyk7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQ6DQorICAgICAgcmV0dXJuIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Mb2NhbGVTZXQpOw0KKyAgICBjYXNlIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldDoNCisgICAgICByZXR1cm4gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Nvbm5lY3Rpb25TZXQpOw0KKyAgICBjYXNlIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0Og0KKyAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfU291cmNlU2V0KTsNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX1hkYzoNCisgICAgICByZXR1cm4gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1hkYyk7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIHRoaXM7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlOYW1lc3BhY2UoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlKSB7DQorICB3c05hbWVzcGFjZS5FbXB0eSgpOw0KKyAgaWYgKHRoaXMtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGUgfHwNCisgICAgICB0aGlzLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFja2V0KSB7DQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSB0aGlzLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBpZiAoIXBYTUxOb2RlIHx8IHBYTUxOb2RlLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGUpLT5HZXROYW1lc3BhY2VVUkkod3NOYW1lc3BhY2UpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0gZWxzZSBpZiAodGhpcy0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSB0aGlzLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBpZiAoIXBYTUxOb2RlKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAodGhpcy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSAmJg0KKyAgICAgICAgdGhpcy0+R2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YSkgew0KKyAgICAgIHJldHVybiBYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIoDQorICAgICAgICAgIChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlLA0KKyAgICAgICAgICB0aGlzLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1F1YWxpZmllZE5hbWUpLCB3c05hbWVzcGFjZSk7DQorICAgIH0NCisgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlKS0+R2V0TmFtZXNwYWNlVVJJKHdzTmFtZXNwYWNlKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX05vZGUqIHBNb2RlbE5vZGUgPSBHZXRNb2RlbE5vZGUoKTsNCisgICAgcmV0dXJuIHBNb2RlbE5vZGUtPlRyeU5hbWVzcGFjZSh3c05hbWVzcGFjZSk7DQorICB9DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRQcm9wZXJ0eShpbnQzMl90IGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlUHJvcGVydHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZVByb3BlcnR5KSB7DQorICBYRkFfRUxFTUVOVCBlRWxlbWVudCA9IEdldENsYXNzSUQoKTsNCisgIEZYX0RXT1JEIGR3UGFja2V0ID0gR2V0UGFja2V0SUQoKTsNCisgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydHkgPQ0KKyAgICAgIFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChlRWxlbWVudCwgZVByb3BlcnR5LCBkd1BhY2tldCk7DQorICBpZiAocFByb3BlcnR5ID09IE5VTEwgfHwgaW5kZXggPj0gcFByb3BlcnR5LT51T2NjdXIpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wQ2hpbGQ7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBmb3IgKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gZVByb3BlcnR5KSB7DQorICAgICAgaUNvdW50Kys7DQorICAgICAgaWYgKGlDb3VudCA+IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoIWJDcmVhdGVQcm9wZXJ0eSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChwUHJvcGVydHktPnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YpIHsNCisgICAgcE5vZGUgPSBtX3BDaGlsZDsNCisgICAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgWEZBX0xQQ1BST1BFUlRZIHBFeGlzdFByb3RlcnR5ID0NCisgICAgICAgICAgWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KGVFbGVtZW50LCBwTm9kZS0+R2V0Q2xhc3NJRCgpLCBkd1BhY2tldCk7DQorICAgICAgaWYgKHBFeGlzdFByb3RlcnR5ICYmIChwRXhpc3RQcm90ZXJ0eS0+dUZsYWdzICYgWEZBX1BST1BFUlRZRkxBR19PbmVPZikpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KKyAgWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldCA9IFhGQV9HZXRQYWNrZXRCeUlEKGR3UGFja2V0KTsNCisgIENYRkFfTm9kZSogcE5ld05vZGU7DQorICBmb3IgKDsgaUNvdW50IDw9IGluZGV4OyBpQ291bnQrKykgew0KKyAgICBwTmV3Tm9kZSA9IHBGYWN0b3J5LT5DcmVhdGVOb2RlKHBQYWNrZXQsIGVQcm9wZXJ0eSk7DQorICAgIGlmICghcE5ld05vZGUpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICB0aGlzLT5JbnNlcnRDaGlsZChwTmV3Tm9kZSwgTlVMTCk7DQorICAgIHBOZXdOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICB9DQorICByZXR1cm4gcE5ld05vZGU7DQorfQ0KK2ludDMyX3QgQ1hGQV9Ob2RlOjpDb3VudENoaWxkcmVuKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBGWF9CT09MIGJPbmx5Q2hpbGQpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BDaGlsZDsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSA9PSBlRWxlbWVudCB8fCBlRWxlbWVudCA9PSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQorICAgICAgaWYgKGJPbmx5Q2hpbGQpIHsNCisgICAgICAgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydCA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudCgNCisgICAgICAgICAgICBHZXRDbGFzc0lEKCksIHBOb2RlLT5HZXRDbGFzc0lEKCksIFhGQV9YRFBQQUNLRVRfVU5LTk9XTik7DQorICAgICAgICBpZiAocFByb3BlcnQpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlDb3VudCsrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gaUNvdW50Ow0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0Q2hpbGQoaW50MzJfdCBpbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk9ubHlDaGlsZCkgew0KKyAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEpOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcENoaWxkOw0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IGVFbGVtZW50IHx8IGVFbGVtZW50ID09IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCisgICAgICBpZiAoYk9ubHlDaGlsZCkgew0KKyAgICAgICAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KA0KKyAgICAgICAgICAgIEdldENsYXNzSUQoKSwgcE5vZGUtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCisgICAgICAgIGlmIChwUHJvcGVydCkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaUNvdW50Kys7DQorICAgICAgaWYgKGlDb3VudCA+IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDWEZBX05vZGU6Okluc2VydENoaWxkKGludDMyX3QgaW5kZXgsIENYRkFfTm9kZSogcE5vZGUpIHsNCisgIEFTU0VSVChwTm9kZSAhPSBOVUxMICYmIHBOb2RlLT5tX3BOZXh0ID09IE5VTEwpOw0KKyAgcE5vZGUtPm1fcFBhcmVudCA9IHRoaXM7DQorICBGWF9CT09MIGJXYXNQdXJnZU5vZGUgPSBtX3BEb2N1bWVudC0+UmVtb3ZlUHVyZ2VOb2RlKHBOb2RlKTsNCisgIEZYU1lTX2Fzc2VydChiV2FzUHVyZ2VOb2RlID09IFRSVUUpOw0KKyAgaWYgKG1fcENoaWxkID09IE5VTEwgfHwgaW5kZXggPT0gMCkgew0KKyAgICBpZiAoaW5kZXggPiAwKSB7DQorICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIHBOb2RlLT5tX3BOZXh0ID0gbV9wQ2hpbGQ7DQorICAgIG1fcENoaWxkID0gcE5vZGU7DQorICAgIGluZGV4ID0gMDsNCisgIH0gZWxzZSBpZiAoaW5kZXggPCAwKSB7DQorICAgIG1fcExhc3RDaGlsZC0+bV9wTmV4dCA9IHBOb2RlOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9Ob2RlKiBwUHJldiA9IG1fcENoaWxkOw0KKyAgICBpbnQzMl90IGlDb3VudCA9IDA7DQorICAgIHdoaWxlICgrK2lDb3VudCAhPSBpbmRleCAmJiBwUHJldi0+bV9wTmV4dCkgew0KKyAgICAgIHBQcmV2ID0gcFByZXYtPm1fcE5leHQ7DQorICAgIH0NCisgICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCAhPSBpQ291bnQpIHsNCisgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgcE5vZGUtPm1fcE5leHQgPSBwUHJldi0+bV9wTmV4dDsNCisgICAgcFByZXYtPm1fcE5leHQgPSBwTm9kZTsNCisgICAgaW5kZXggPSBpQ291bnQ7DQorICB9DQorICBpZiAocE5vZGUtPm1fcE5leHQgPT0gTlVMTCkgew0KKyAgICBtX3BMYXN0Q2hpbGQgPSBwTm9kZTsNCisgIH0NCisgIEFTU0VSVChtX3BMYXN0Q2hpbGQgIT0gTlVMTCAmJiBtX3BMYXN0Q2hpbGQtPm1fcE5leHQgPT0gTlVMTCk7DQorICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZCwgRkFMU0UpOw0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKHBOb3RpZnkpIHsNCisgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9DaGlsZEFkZGVkLCBwTm9kZSk7DQorICB9DQorICBpZiAoSXNOZWVkU2F2aW5nWE1MTm9kZSgpICYmIHBOb2RlLT5tX3BYTUxOb2RlKSB7DQorICAgIEZYU1lTX2Fzc2VydChwTm9kZS0+bV9wWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpID09IE5VTEwpOw0KKyAgICBtX3BYTUxOb2RlLT5JbnNlcnRDaGlsZE5vZGUocE5vZGUtPm1fcFhNTE5vZGUsIGluZGV4KTsNCisgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIEZBTFNFLCBGQUxTRSk7DQorICB9DQorICByZXR1cm4gaW5kZXg7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpJbnNlcnRDaGlsZChDWEZBX05vZGUqIHBOb2RlLCBDWEZBX05vZGUqIHBCZWZvcmVOb2RlKSB7DQorICBpZiAoIXBOb2RlIHx8IHBOb2RlLT5tX3BQYXJlbnQgIT0gTlVMTCB8fA0KKyAgICAgIChwQmVmb3JlTm9kZSAmJiBwQmVmb3JlTm9kZS0+bV9wUGFyZW50ICE9IHRoaXMpKSB7DQorICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0JPT0wgYldhc1B1cmdlTm9kZSA9IG1fcERvY3VtZW50LT5SZW1vdmVQdXJnZU5vZGUocE5vZGUpOw0KKyAgRlhTWVNfYXNzZXJ0KGJXYXNQdXJnZU5vZGUgPT0gVFJVRSk7DQorICBpbnQzMl90IG5JbmRleCA9IC0xOw0KKyAgcE5vZGUtPm1fcFBhcmVudCA9IHRoaXM7DQorICBpZiAobV9wQ2hpbGQgPT0gTlVMTCB8fCBwQmVmb3JlTm9kZSA9PSBtX3BDaGlsZCkgew0KKyAgICBwTm9kZS0+bV9wTmV4dCA9IG1fcENoaWxkOw0KKyAgICBtX3BDaGlsZCA9IHBOb2RlOw0KKyAgICBuSW5kZXggPSAwOw0KKyAgfSBlbHNlIGlmICghcEJlZm9yZU5vZGUpIHsNCisgICAgcE5vZGUtPm1fcE5leHQgPSBtX3BMYXN0Q2hpbGQtPm1fcE5leHQ7DQorICAgIG1fcExhc3RDaGlsZC0+bV9wTmV4dCA9IHBOb2RlOw0KKyAgfSBlbHNlIHsNCisgICAgbkluZGV4ID0gMTsNCisgICAgQ1hGQV9Ob2RlKiBwUHJldiA9IG1fcENoaWxkOw0KKyAgICB3aGlsZSAocFByZXYtPm1fcE5leHQgIT0gcEJlZm9yZU5vZGUpIHsNCisgICAgICBwUHJldiA9IHBQcmV2LT5tX3BOZXh0Ow0KKyAgICAgIG5JbmRleCsrOw0KKyAgICB9DQorICAgIHBOb2RlLT5tX3BOZXh0ID0gcFByZXYtPm1fcE5leHQ7DQorICAgIHBQcmV2LT5tX3BOZXh0ID0gcE5vZGU7DQorICB9DQorICBpZiAocE5vZGUtPm1fcE5leHQgPT0gTlVMTCkgew0KKyAgICBtX3BMYXN0Q2hpbGQgPSBwTm9kZTsNCisgIH0NCisgIEFTU0VSVChtX3BMYXN0Q2hpbGQgIT0gTlVMTCAmJiBtX3BMYXN0Q2hpbGQtPm1fcE5leHQgPT0gTlVMTCk7DQorICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZCwgRkFMU0UpOw0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKHBOb3RpZnkpIHsNCisgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9DaGlsZEFkZGVkLCBwTm9kZSk7DQorICB9DQorICBpZiAoSXNOZWVkU2F2aW5nWE1MTm9kZSgpICYmIHBOb2RlLT5tX3BYTUxOb2RlKSB7DQorICAgIEZYU1lTX2Fzc2VydChwTm9kZS0+bV9wWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpID09IE5VTEwpOw0KKyAgICBtX3BYTUxOb2RlLT5JbnNlcnRDaGlsZE5vZGUocE5vZGUtPm1fcFhNTE5vZGUsIG5JbmRleCk7DQorICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBGQUxTRSwgRkFMU0UpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpEZXByZWNhdGVkX0dldFByZXZTaWJsaW5nKCkgew0KKyAgaWYgKCFtX3BQYXJlbnQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBmb3IgKENYRkFfTm9kZSogcFNpYmxpbmcgPSBtX3BQYXJlbnQtPm1fcENoaWxkOyBwU2libGluZzsNCisgICAgICAgcFNpYmxpbmcgPSBwU2libGluZy0+bV9wTmV4dCkgew0KKyAgICBpZiAocFNpYmxpbmctPm1fcE5leHQgPT0gdGhpcykgew0KKyAgICAgIHJldHVybiBwU2libGluZzsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpSZW1vdmVDaGlsZChDWEZBX05vZGUqIHBOb2RlLCBGWF9CT09MIGJOb3RpZnkpIHsNCisgIGlmIChwTm9kZSA9PSBOVUxMIHx8IHBOb2RlLT5tX3BQYXJlbnQgIT0gdGhpcykgew0KKyAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9wQ2hpbGQgPT0gcE5vZGUpIHsNCisgICAgbV9wQ2hpbGQgPSBwTm9kZS0+bV9wTmV4dDsNCisgICAgaWYgKG1fcExhc3RDaGlsZCA9PSBwTm9kZSkgew0KKyAgICAgIG1fcExhc3RDaGlsZCA9IHBOb2RlLT5tX3BOZXh0Ow0KKyAgICB9DQorICAgIHBOb2RlLT5tX3BOZXh0ID0gTlVMTDsNCisgICAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX05vZGUqIHBQcmV2ID0gcE5vZGUtPkRlcHJlY2F0ZWRfR2V0UHJldlNpYmxpbmcoKTsNCisgICAgcFByZXYtPm1fcE5leHQgPSBwTm9kZS0+bV9wTmV4dDsNCisgICAgaWYgKG1fcExhc3RDaGlsZCA9PSBwTm9kZSkgew0KKyAgICAgIG1fcExhc3RDaGlsZCA9IHBOb2RlLT5tX3BOZXh0ID8gcE5vZGUtPm1fcE5leHQgOiBwUHJldjsNCisgICAgfQ0KKyAgICBwTm9kZS0+bV9wTmV4dCA9IE5VTEw7DQorICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgfQ0KKyAgQVNTRVJUKG1fcExhc3RDaGlsZCA9PSBOVUxMIHx8IG1fcExhc3RDaGlsZC0+bV9wTmV4dCA9PSBOVUxMKTsNCisgIE9uUmVtb3ZlZCh0aGlzLCBwTm9kZSwgYk5vdGlmeSk7DQorICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZCk7DQorICBtX3BEb2N1bWVudC0+QWRkUHVyZ2VOb2RlKHBOb2RlKTsNCisgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkgJiYgcE5vZGUtPm1fcFhNTE5vZGUpIHsNCisgICAgaWYgKHBOb2RlLT5Jc0F0dHJpYnV0ZUluWE1MKCkpIHsNCisgICAgICBGWFNZU19hc3NlcnQocE5vZGUtPm1fcFhNTE5vZGUgPT0gbV9wWE1MTm9kZSAmJg0KKyAgICAgICAgICAgICAgICAgICBtX3BYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7DQorICAgICAgaWYgKHBOb2RlLT5tX3BYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKShwTm9kZS0+bV9wWE1MTm9kZSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NBdHRyaWJ1dGVOYW1lID0NCisgICAgICAgICAgICBwTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lKTsNCisgICAgICAgIHBYTUxFbGVtZW50LT5SZW1vdmVBdHRyaWJ1dGUod3NBdHRyaWJ1dGVOYW1lLkdldFB0cigpKTsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgICAgIHBOb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUsIEZBTFNFKTsNCisgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBOZXdYTUxFbGVtZW50ID0gSUZERV9YTUxFbGVtZW50OjpDcmVhdGUod3NOYW1lKTsNCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZSA9IHRoaXMtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUpOw0KKyAgICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHBOZXdYTUxFbGVtZW50LT5TZXRUZXh0RGF0YSh3c1ZhbHVlKTsNCisgICAgICB9DQorICAgICAgcE5vZGUtPm1fcFhNTE5vZGUgPSBwTmV3WE1MRWxlbWVudDsNCisgICAgICBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIG1fdUZsYWdzICY9IH5kd0ZsYWc7DQorICAgICAgbV9wWE1MTm9kZS0+UmVtb3ZlQ2hpbGROb2RlKHBOb2RlLT5tX3BYTUxOb2RlKTsNCiAgICAgfQ0KKyAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfT3duWE1MTm9kZSwgVFJVRSwgRkFMU0UpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpJc0F0dHJpYnV0ZUluWE1MKCkNCi17DQotICAgIHJldHVybiBHZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMpID09IFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhOw0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRGaXJzdENoaWxkQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSBjb25zdCB7DQorICByZXR1cm4gR2V0Rmlyc3RDaGlsZEJ5TmFtZSgNCisgICAgICB3c05hbWUuSXNFbXB0eSgpID8gMCA6IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTmFtZS5HZXRMZW5ndGgoKSkpOw0KIH0NCi12b2lkIENYRkFfTm9kZTo6T25SZW1vdmVkKENYRkFfTm9kZSAqcFBhcmVudCwgQ1hGQV9Ob2RlICpwUmVtb3ZlZCwgRlhfQk9PTCBiTm90aWZ5KQ0KLXsNCi0gICAgaWYgKGJOb3RpZnkgJiYgKHBQYXJlbnQgIT0gTlVMTCkpIHsNCi0gICAgICAgIElYRkFfTm90aWZ5ICpwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgICAgIGlmIChwTm90aWZ5KSB7DQotICAgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQocFBhcmVudCwgWEZBX05PREVFVkVOVF9DaGlsZFJlbW92ZWQsIHBSZW1vdmVkKTsNCi0gICAgICAgIH0NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0Rmlyc3RDaGlsZEJ5TmFtZShGWF9EV09SRCBkd05hbWVIYXNoKSBjb25zdCB7DQorICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBOb2RlOw0KKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBkd05hbWVIYXNoKSB7DQorICAgICAgcmV0dXJuIHBOb2RlOw0KICAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotdm9pZCBDWEZBX05vZGU6Ok9uQ2hhbmdpbmcoWEZBX0FUVFJJQlVURSBlQXR0ciwgdm9pZCogcE5ld1ZhbHVlLCBGWF9CT09MIGJOb3RpZnkpDQotew0KLSAgICBpZiAoYk5vdGlmeSAmJiBIYXNGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCkpIHsNCi0gICAgICAgIElYRkFfTm90aWZ5ICpwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgICAgIGlmIChwTm90aWZ5KSB7DQotICAgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5naW5nLCAodm9pZCopKHVpbnRwdHJfdCllQXR0ciwgcE5ld1ZhbHVlKTsNCi0gICAgICAgIH0NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlQgZUVsZW1lbnQpIGNvbnN0IHsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcE5vZGU7DQorICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gZUVsZW1lbnQpIHsNCisgICAgICByZXR1cm4gcE5vZGU7DQogICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi12b2lkIENYRkFfTm9kZTo6T25DaGFuZ2VkKFhGQV9BVFRSSUJVVEUgZUF0dHIsIHZvaWQqIHBOZXdWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5LCBGWF9CT09MIGJTY3JpcHRNb2RpZnkpDQotew0KLSAgICBpZiAoYk5vdGlmeSAmJiBIYXNGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCkpIHsNCi0gICAgICAgIFNjcmlwdF9BdHRyaWJ1dGVfU2VuZEF0dHJpYnV0ZUNoYW5nZU1lc3NhZ2UoKHZvaWQqKSh1aW50cHRyX3QpZUF0dHIsIHBOZXdWYWx1ZSwgYlNjcmlwdE1vZGlmeSk7DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE5leHRTYW1lTmFtZVNpYmxpbmcoRlhfRFdPUkQgZHdOYW1lSGFzaCkgY29uc3Qgew0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsgcE5vZGU7DQorICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgaWYgKHBOb2RlLT5HZXROYW1lSGFzaCgpID09IGR3TmFtZUhhc2gpIHsNCisgICAgICByZXR1cm4gcE5vZGU7DQogICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1pbnQzMl90IENYRkFfTm9kZTo6ZXhlY1NpbmdsZUV2ZW50QnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFdmVudE5hbWUsIFhGQV9FTEVNRU5UIGVFbGVtZW50VHlwZSkNCi17DQotICAgIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KLSAgICBjb25zdCBYRkFfRXhlY0V2ZW50UGFyYUluZm8qIGV2ZW50UGFyYUluZm8gPSBHZXRFdmVudFBhcmFJbmZvQnlOYW1lKHdzRXZlbnROYW1lKTsNCi0gICAgaWYgKGV2ZW50UGFyYUluZm8pIHsNCi0gICAgICAgIHVpbnQzMl90IHZhbGlkRmxhZ3MgPSBldmVudFBhcmFJbmZvLT5tX3ZhbGlkRmxhZ3M7DQotICAgICAgICBJWEZBX05vdGlmeSAqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICAgICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICAgICAgcmV0dXJuIGlSZXQ7DQotICAgICAgICB9DQotICAgICAgICBpZiAodmFsaWRGbGFncyA9PSAxKSB7DQotICAgICAgICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlKTsNCi0gICAgICAgIH0gZWxzZSBpZiAodmFsaWRGbGFncyA9PSAyKSB7DQotICAgICAgICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLCBGQUxTRSwgRkFMU0UpOw0KLSAgICAgICAgfSBlbHNlIGlmICh2YWxpZEZsYWdzID09IDMpIHsNCi0gICAgICAgICAgICBpZiAoZUVsZW1lbnRUeXBlID09IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCi0gICAgICAgICAgICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLCBGQUxTRSwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAodmFsaWRGbGFncyA9PSA0KSB7DQotICAgICAgICAgICAgaWYgKGVFbGVtZW50VHlwZSA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXAgfHwgZUVsZW1lbnRUeXBlID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcFBhcmVudE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgICAgICAgICAgaWYgKHBQYXJlbnROb2RlICYmIHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQotICAgICAgICAgICAgICAgICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsIEZBTFNFLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLCBGQUxTRSwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAodmFsaWRGbGFncyA9PSA1KSB7DQotICAgICAgICAgICAgaWYgKGVFbGVtZW50VHlwZSA9PSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KLSAgICAgICAgICAgICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsIEZBTFNFLCBGQUxTRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmICh2YWxpZEZsYWdzID09IDYpIHsNCi0gICAgICAgICAgICBDWEZBX1dpZGdldERhdGEgKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCi0gICAgICAgICAgICBpZiAocFdpZGdldERhdGEpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICogcFVJTm9kZSA9IHBXaWRnZXREYXRhLT5HZXRVSUNoaWxkKCk7DQotICAgICAgICAgICAgICAgIGlmIChwVUlOb2RlLT5tX2VOb2RlQ2xhc3MgPT0gWEZBX0VMRU1FTlRfU2lnbmF0dXJlKSB7DQotICAgICAgICAgICAgICAgICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsIEZBTFNFLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKHZhbGlkRmxhZ3MgPT0gNykgew0KLSAgICAgICAgICAgIENYRkFfV2lkZ2V0RGF0YSAqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KLSAgICAgICAgICAgIGlmIChwV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUgKiBwVUlOb2RlID0gcFdpZGdldERhdGEtPkdldFVJQ2hpbGQoKTsNCi0gICAgICAgICAgICAgICAgaWYgKChwVUlOb2RlLT5tX2VOb2RlQ2xhc3MgPT0gWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCkgJiYgKCFwV2lkZ2V0RGF0YS0+SXNMaXN0Qm94KCkpKSB7DQotICAgICAgICAgICAgICAgICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsIEZBTFNFLCBGQUxTRSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE5leHRTYW1lTmFtZVNpYmxpbmcoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOb2RlTmFtZSkgY29uc3Qgew0KKyAgcmV0dXJuIEdldE5leHRTYW1lTmFtZVNpYmxpbmcoDQorICAgICAgd3NOb2RlTmFtZS5Jc0VtcHR5KCkgPyAwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05vZGVOYW1lLkdldFB0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NOb2RlTmFtZS5HZXRMZW5ndGgoKSkpOw0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlQgZUVsZW1lbnQpIGNvbnN0IHsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7IHBOb2RlOw0KKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IGVFbGVtZW50KSB7DQorICAgICAgcmV0dXJuIHBOb2RlOw0KICAgICB9DQotICAgIHJldHVybiBpUmV0Ow0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpVcGRhdGVOYW1lSGFzaCgpDQotew0KLSAgICBYRkFfTFBDTk9UU1VSRUFUVFJJQlVURSBwTm90c3VyZSA9IFhGQV9HZXROb3RzdXJlQXR0cmlidXRlKEdldENsYXNzSUQoKSwgWEZBX0FUVFJJQlVURV9OYW1lKTsNCi0gICAgaWYoIXBOb3RzdXJlIHx8IHBOb3RzdXJlLT5lVHlwZSA9PSBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSkgew0KK2ludDMyX3QgQ1hGQV9Ob2RlOjpHZXROb2RlU2FtZU5hbWVJbmRleCgpIGNvbnN0IHsNCisgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICByZXR1cm4gcFNjcmlwdENvbnRleHQtPkdldEluZGV4QnlOYW1lKChDWEZBX05vZGUqKXRoaXMpOw0KK30NCitpbnQzMl90IENYRkFfTm9kZTo6R2V0Tm9kZVNhbWVDbGFzc0luZGV4KCkgY29uc3Qgew0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIHJldHVybiBwU2NyaXB0Q29udGV4dC0+R2V0SW5kZXhCeUNsYXNzTmFtZSgoQ1hGQV9Ob2RlKil0aGlzKTsNCit9DQordm9pZCBDWEZBX05vZGU6OkdldFNPTUV4cHJlc3Npb24oQ0ZYX1dpZGVTdHJpbmcmIHdzU09NRXhwcmVzc2lvbikgew0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBTY3JpcHRDb250ZXh0LT5HZXRTb21FeHByZXNzaW9uKHRoaXMsIHdzU09NRXhwcmVzc2lvbik7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRJbnN0YW5jZU1nck9mU3ViZm9ybSgpIHsNCisgIENYRkFfTm9kZSogcEluc3RhbmNlTWdyID0gTlVMTDsNCisgIGlmIChtX2VQYWNrZXQgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQorICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgaWYgKCFwUGFyZW50Tm9kZSB8fCBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0FyZWEpIHsNCisgICAgICByZXR1cm4gcEluc3RhbmNlTWdyOw0KKyAgICB9DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QcmV2U2libGluZyk7DQorICAgICAgICAgcE5vZGUgIT0gTlVMTDsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKSkgew0KKyAgICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgICBpZiAoKGVUeXBlID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgZVR5cGUgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkgJiYNCisgICAgICAgICAgcE5vZGUtPm1fZHdOYW1lSGFzaCAhPSBtX2R3TmFtZUhhc2gpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQogICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lID0gR2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCi0gICAgICAgIG1fZHdOYW1lSGFzaCA9IHdzTmFtZS5Jc0VtcHR5KCkgPyAwIDogRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCkpOw0KLSAgICB9IGVsc2UgaWYgKHBOb3RzdXJlLT5lVHlwZSA9PSBYRkFfQVRUUklCVVRFVFlQRV9FbnVtKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lID0gWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKEdldEVudW0oWEZBX0FUVFJJQlVURV9OYW1lKSktPnBOYW1lOw0KLSAgICAgICAgbV9kd05hbWVIYXNoID0gd3NOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi19DQotSUZERV9YTUxOb2RlKiBDWEZBX05vZGU6OkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCkNCi17DQotICAgIGlmICghbV9wWE1MTm9kZSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVGFnID0gR2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCi0gICAgICAgIG1fcFhNTE5vZGUgPSBJRkRFX1hNTEVsZW1lbnQ6OkNyZWF0ZSh3c1RhZyk7DQotICAgICAgICBTZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBUUlVFLCBGQUxTRSk7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcFhNTE5vZGU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpJc05lZWRTYXZpbmdYTUxOb2RlKCkNCi17DQotICAgIHJldHVybiBtX3BYTUxOb2RlICYmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMgfHwgR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1hmYSApOw0KLX0NCi1YRkFfTFBNQVBNT0RVTEVEQVRBCUNYRkFfTm9kZTo6R2V0TWFwTW9kdWxlRGF0YShGWF9CT09MIGJDcmVhdGVOZXcpDQotew0KLSAgICBpZiAoIW1fcE1hcE1vZHVsZURhdGEgJiYgYkNyZWF0ZU5ldykgew0KLSAgICAgICAgbV9wTWFwTW9kdWxlRGF0YSA9IEZYX05FVyBYRkFfTUFQTU9EVUxFREFUQTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wTWFwTW9kdWxlRGF0YTsNCi19DQotdm9pZCBDWEZBX05vZGU6OlNldE1hcE1vZHVsZVZhbHVlKHZvaWQqIHBLZXksIHZvaWQqIHBWYWx1ZSkNCi17DQotICAgIFhGQV9MUE1BUE1PRFVMRURBVEEgcE1vdWRsZSA9IHRoaXMtPkdldE1hcE1vZHVsZURhdGEoVFJVRSk7DQotICAgIGlmICghcE1vdWRsZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIHBNb3VkbGUtPm1fVmFsdWVNYXAuU2V0QXQocEtleSwgcFZhbHVlKTsNCi19DQotRlhfQk9PTCBDWEZBX05vZGU6OkdldE1hcE1vZHVsZVZhbHVlKHZvaWQqIHBLZXksIHZvaWQqICZwVmFsdWUpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gdGhpczsNCi0gICAgd2hpbGUgKHBOb2RlKSB7DQotICAgICAgICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBNb3VkbGUgPSBwTm9kZS0+R2V0TWFwTW9kdWxlRGF0YShGQUxTRSk7DQotICAgICAgICBpZiAocE1vdWRsZSAmJiBwTW91ZGxlLT5tX1ZhbHVlTWFwLkxvb2t1cChwS2V5LCBwVmFsdWUpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJbnN0TmFtZSA9IHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgICAgaWYgKHdzSW5zdE5hbWUuR2V0TGVuZ3RoKCkgPiAwICYmIHdzSW5zdE5hbWUuR2V0QXQoMCkgPT0gJ18nICYmDQorICAgICAgICAgICAgd3NJbnN0TmFtZS5NaWQoMSkgPT0gd3NOYW1lKSB7DQorICAgICAgICAgIHBJbnN0YW5jZU1nciA9IHBOb2RlOw0KICAgICAgICAgfQ0KLSAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0UGFja2V0SUQoKSAhPSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzID8gcE5vZGUtPkdldFRlbXBsYXRlTm9kZSgpIDogTlVMTDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gcEluc3RhbmNlTWdyOw0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2V0TWFwTW9kdWxlU3RyaW5nKHZvaWQqIHBLZXksIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSkNCi17DQotICAgIFNldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCAodm9pZCopd3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpOw0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRPY2N1ck5vZGUoKSB7DQorICByZXR1cm4gR2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KIH0NCi1GWF9CT09MIENYRkFfTm9kZTo6R2V0TWFwTW9kdWxlU3RyaW5nKHZvaWQqIHBLZXksIENGWF9XaWRlU3RyaW5nQyAmd3NWYWx1ZSkNCi17DQotICAgIHZvaWQqIHBWYWx1ZTsNCi0gICAgaW50MzJfdCBpQnl0ZXM7DQotICAgIGlmICghR2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksIHBWYWx1ZSwgaUJ5dGVzKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZ0MoKGNvbnN0IEZYX1dDSEFSKilwVmFsdWUsIGlCeXRlcyAvIHNpemVvZihGWF9XQ0hBUikpOw0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpIYXNGbGFnKEZYX0RXT1JEIGR3RmxhZykgY29uc3Qgew0KKyAgaWYgKG1fdUZsYWdzICYgZHdGbGFnKSB7DQogICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgc3dpdGNoIChkd0ZsYWcpIHsNCisgICAgY2FzZSBYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZDoNCisgICAgICByZXR1cm4gbV9wUGFyZW50ICYmIG1fcFBhcmVudC0+SGFzRmxhZyhkd0ZsYWcpOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi12b2lkIENYRkFfTm9kZTo6U2V0TWFwTW9kdWxlQnVmZmVyKHZvaWQqIHBLZXksIHZvaWQqIHBWYWx1ZSwgaW50MzJfdCBpQnl0ZXMsIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8qIHBDYWxsYmFja0luZm8gKQ0KLXsNCi0gICAgWEZBX0xQTUFQTU9EVUxFREFUQSBwTW91ZGxlID0gdGhpcy0+R2V0TWFwTW9kdWxlRGF0YShUUlVFKTsNCi0gICAgaWYgKCFwTW91ZGxlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgWEZBX0xQTUFQREFUQUJMT0NLICZwQnVmZmVyID0gcE1vdWRsZS0+bV9CdWZmZXJNYXBbcEtleV07DQotICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCi0gICAgICAgIHBCdWZmZXIgPSAoWEZBX0xQTUFQREFUQUJMT0NLKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihYRkFfTUFQREFUQUJMT0NLKSArIGlCeXRlcyk7DQotICAgIH0gZWxzZSBpZiAocEJ1ZmZlci0+aUJ5dGVzICE9IGlCeXRlcykgew0KLSAgICAgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsNCi0gICAgICAgICAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOw0KK3ZvaWQgQ1hGQV9Ob2RlOjpTZXRGbGFnKEZYX0RXT1JEIGR3RmxhZywgRlhfQk9PTCBiT24sIEZYX0JPT0wgYk5vdGlmeSkgew0KKyAgaWYgKGJPbikgew0KKyAgICBzd2l0Y2ggKGR3RmxhZykgew0KKyAgICAgIGNhc2UgWEZBX05PREVGTEFHX0luaXRpYWxpemVkOg0KKyAgICAgICAgaWYgKGJOb3RpZnkgJiYgIUhhc0ZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKSkgew0KKyAgICAgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgICAgICAgIGlmIChwTm90aWZ5KSB7DQorICAgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9SZWFkeSk7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCi0gICAgICAgIHBCdWZmZXIgPSAoWEZBX0xQTUFQREFUQUJMT0NLKUZYX1JlYWxsb2ModWludDhfdCwgcEJ1ZmZlciwgc2l6ZW9mKFhGQV9NQVBEQVRBQkxPQ0spICsgaUJ5dGVzKTsNCi0gICAgfSBlbHNlIGlmIChwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKSB7DQotICAgICAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvID0gcENhbGxiYWNrSW5mbzsNCi0gICAgcEJ1ZmZlci0+aUJ5dGVzID0gaUJ5dGVzOw0KLSAgICBGWFNZU19tZW1jcHkocEJ1ZmZlci0+R2V0RGF0YSgpLCBwVmFsdWUsIGlCeXRlcyk7DQorICAgIG1fdUZsYWdzIHw9IGR3RmxhZzsNCisgIH0gZWxzZSB7DQorICAgIG1fdUZsYWdzICY9IH5kd0ZsYWc7DQorICB9DQogfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpHZXRNYXBNb2R1bGVCdWZmZXIodm9pZCogcEtleSwgdm9pZCogJnBWYWx1ZSwgaW50MzJfdCAmaUJ5dGVzLCBGWF9CT09MIGJQcm90b0Fsc28pDQotew0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpJc0F0dHJpYnV0ZUluWE1MKCkgew0KKyAgcmV0dXJuIEdldEVudW0oWEZBX0FUVFJJQlVURV9Db250YWlucykgPT0gWEZBX0FUVFJJQlVURUVOVU1fTWV0YURhdGE7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpPblJlbW92ZWQoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUmVtb3ZlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSkgew0KKyAgaWYgKGJOb3RpZnkgJiYgKHBQYXJlbnQgIT0gTlVMTCkpIHsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAocE5vdGlmeSkgew0KKyAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHBQYXJlbnQsIFhGQV9OT0RFRVZFTlRfQ2hpbGRSZW1vdmVkLCBwUmVtb3ZlZCk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6Ok9uQ2hhbmdpbmcoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwTmV3VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5KSB7DQorICBpZiAoYk5vdGlmeSAmJiBIYXNGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCkpIHsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAocE5vdGlmeSkgew0KKyAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2luZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKHVpbnRwdHJfdCllQXR0ciwgcE5ld1ZhbHVlKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6T25DaGFuZ2VkKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwTmV3VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkpIHsNCisgIGlmIChiTm90aWZ5ICYmIEhhc0ZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKSkgew0KKyAgICBTY3JpcHRfQXR0cmlidXRlX1NlbmRBdHRyaWJ1dGVDaGFuZ2VNZXNzYWdlKCh2b2lkKikodWludHB0cl90KWVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXdWYWx1ZSwgYlNjcmlwdE1vZGlmeSk7DQorICB9DQorfQ0KK2ludDMyX3QgQ1hGQV9Ob2RlOjpleGVjU2luZ2xlRXZlbnRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V2ZW50TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50VHlwZSkgew0KKyAgaW50MzJfdCBpUmV0ID0gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICBjb25zdCBYRkFfRXhlY0V2ZW50UGFyYUluZm8qIGV2ZW50UGFyYUluZm8gPQ0KKyAgICAgIEdldEV2ZW50UGFyYUluZm9CeU5hbWUod3NFdmVudE5hbWUpOw0KKyAgaWYgKGV2ZW50UGFyYUluZm8pIHsNCisgICAgdWludDMyX3QgdmFsaWRGbGFncyA9IGV2ZW50UGFyYUluZm8tPm1fdmFsaWRGbGFnczsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBpZiAodmFsaWRGbGFncyA9PSAxKSB7DQorICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlKTsNCisgICAgfSBlbHNlIGlmICh2YWxpZEZsYWdzID09IDIpIHsNCisgICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBGQUxTRSk7DQorICAgIH0gZWxzZSBpZiAodmFsaWRGbGFncyA9PSAzKSB7DQorICAgICAgaWYgKGVFbGVtZW50VHlwZSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIEZBTFNFKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAodmFsaWRGbGFncyA9PSA0KSB7DQorICAgICAgaWYgKGVFbGVtZW50VHlwZSA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXAgfHwNCisgICAgICAgICAgZUVsZW1lbnRUeXBlID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBpZiAocFBhcmVudE5vZGUgJiYgcFBhcmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICh2YWxpZEZsYWdzID09IDUpIHsNCisgICAgICBpZiAoZUVsZW1lbnRUeXBlID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIEZBTFNFKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAodmFsaWRGbGFncyA9PSA2KSB7DQorICAgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgICAgICBpZiAocFdpZGdldERhdGEpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IHBXaWRnZXREYXRhLT5HZXRVSUNoaWxkKCk7DQorICAgICAgICBpZiAocFVJTm9kZS0+bV9lTm9kZUNsYXNzID09IFhGQV9FTEVNRU5UX1NpZ25hdHVyZSkgew0KKyAgICAgICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICh2YWxpZEZsYWdzID09IDcpIHsNCisgICAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICAgIGlmIChwV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwVUlOb2RlID0gcFdpZGdldERhdGEtPkdldFVJQ2hpbGQoKTsNCisgICAgICAgIGlmICgocFVJTm9kZS0+bV9lTm9kZUNsYXNzID09IFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QpICYmDQorICAgICAgICAgICAgKCFwV2lkZ2V0RGF0YS0+SXNMaXN0Qm94KCkpKSB7DQorICAgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBGQUxTRSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gaVJldDsNCit9DQordm9pZCBDWEZBX05vZGU6OlVwZGF0ZU5hbWVIYXNoKCkgew0KKyAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcE5vdHN1cmUgPQ0KKyAgICAgIFhGQV9HZXROb3RzdXJlQXR0cmlidXRlKEdldENsYXNzSUQoKSwgWEZBX0FUVFJJQlVURV9OYW1lKTsNCisgIGlmICghcE5vdHN1cmUgfHwgcE5vdHN1cmUtPmVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWUgPSBHZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICBtX2R3TmFtZUhhc2ggPQ0KKyAgICAgICAgd3NOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQorICB9IGVsc2UgaWYgKHBOb3RzdXJlLT5lVHlwZSA9PSBYRkFfQVRUUklCVVRFVFlQRV9FbnVtKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWUgPQ0KKyAgICAgICAgWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKEdldEVudW0oWEZBX0FUVFJJQlVURV9OYW1lKSktPnBOYW1lOw0KKyAgICBtX2R3TmFtZUhhc2ggPQ0KKyAgICAgICAgd3NOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQorICB9DQorfQ0KK0lGREVfWE1MTm9kZSogQ1hGQV9Ob2RlOjpDcmVhdGVYTUxNYXBwaW5nTm9kZSgpIHsNCisgIGlmICghbV9wWE1MTm9kZSkgew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NUYWcgPSBHZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICBtX3BYTUxOb2RlID0gSUZERV9YTUxFbGVtZW50OjpDcmVhdGUod3NUYWcpOw0KKyAgICBTZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBUUlVFLCBGQUxTRSk7DQorICB9DQorICByZXR1cm4gbV9wWE1MTm9kZTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OklzTmVlZFNhdmluZ1hNTE5vZGUoKSB7DQorICByZXR1cm4gbV9wWE1MTm9kZSAmJiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1hmYSk7DQorfQ0KK1hGQV9MUE1BUE1PRFVMRURBVEEgQ1hGQV9Ob2RlOjpHZXRNYXBNb2R1bGVEYXRhKEZYX0JPT0wgYkNyZWF0ZU5ldykgew0KKyAgaWYgKCFtX3BNYXBNb2R1bGVEYXRhICYmIGJDcmVhdGVOZXcpIHsNCisgICAgbV9wTWFwTW9kdWxlRGF0YSA9IEZYX05FVyBYRkFfTUFQTU9EVUxFREFUQTsNCisgIH0NCisgIHJldHVybiBtX3BNYXBNb2R1bGVEYXRhOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2V0TWFwTW9kdWxlVmFsdWUodm9pZCogcEtleSwgdm9pZCogcFZhbHVlKSB7DQorICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBNb3VkbGUgPSB0aGlzLT5HZXRNYXBNb2R1bGVEYXRhKFRSVUUpOw0KKyAgaWYgKCFwTW91ZGxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBNb3VkbGUtPm1fVmFsdWVNYXAuU2V0QXQocEtleSwgcFZhbHVlKTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OkdldE1hcE1vZHVsZVZhbHVlKHZvaWQqIHBLZXksIHZvaWQqJiBwVmFsdWUpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSB0aGlzOw0KKyAgd2hpbGUgKHBOb2RlKSB7DQorICAgIFhGQV9MUE1BUE1PRFVMRURBVEEgcE1vdWRsZSA9IHBOb2RlLT5HZXRNYXBNb2R1bGVEYXRhKEZBTFNFKTsNCisgICAgaWYgKHBNb3VkbGUgJiYgcE1vdWRsZS0+bV9WYWx1ZU1hcC5Mb29rdXAocEtleSwgcFZhbHVlKSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHBOb2RlID0gcE5vZGUtPkdldFBhY2tldElEKCkgIT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cw0KKyAgICAgICAgICAgICAgICA/IHBOb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKQ0KKyAgICAgICAgICAgICAgICA6IE5VTEw7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTZXRNYXBNb2R1bGVTdHJpbmcodm9pZCogcEtleSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlKSB7DQorICBTZXRNYXBNb2R1bGVCdWZmZXIocEtleSwgKHZvaWQqKXdzVmFsdWUuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6R2V0TWFwTW9kdWxlU3RyaW5nKHZvaWQqIHBLZXksIENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSkgew0KKyAgdm9pZCogcFZhbHVlOw0KKyAgaW50MzJfdCBpQnl0ZXM7DQorICBpZiAoIUdldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCBwVmFsdWUsIGlCeXRlcykpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nQygoY29uc3QgRlhfV0NIQVIqKXBWYWx1ZSwgaUJ5dGVzIC8gc2l6ZW9mKEZYX1dDSEFSKSk7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNldE1hcE1vZHVsZUJ1ZmZlcigNCisgICAgdm9pZCogcEtleSwNCisgICAgdm9pZCogcFZhbHVlLA0KKyAgICBpbnQzMl90IGlCeXRlcywNCisgICAgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbykgew0KKyAgWEZBX0xQTUFQTU9EVUxFREFUQSBwTW91ZGxlID0gdGhpcy0+R2V0TWFwTW9kdWxlRGF0YShUUlVFKTsNCisgIGlmICghcE1vdWRsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBYRkFfTFBNQVBEQVRBQkxPQ0smIHBCdWZmZXIgPSBwTW91ZGxlLT5tX0J1ZmZlck1hcFtwS2V5XTsNCisgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCisgICAgcEJ1ZmZlciA9IChYRkFfTFBNQVBEQVRBQkxPQ0spRlhfQWxsb2ModWludDhfdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFhGQV9NQVBEQVRBQkxPQ0spICsgaUJ5dGVzKTsNCisgIH0gZWxzZSBpZiAocEJ1ZmZlci0+aUJ5dGVzICE9IGlCeXRlcykgew0KKyAgICBpZiAocEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSkgew0KKyAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7DQorICAgIH0NCisgICAgcEJ1ZmZlciA9IChYRkFfTFBNQVBEQVRBQkxPQ0spRlhfUmVhbGxvYyh1aW50OF90LCBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihYRkFfTUFQREFUQUJMT0NLKSArIGlCeXRlcyk7DQorICB9IGVsc2UgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsNCisgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCisgIH0NCisgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mbyA9IHBDYWxsYmFja0luZm87DQorICBwQnVmZmVyLT5pQnl0ZXMgPSBpQnl0ZXM7DQorICBGWFNZU19tZW1jcHkocEJ1ZmZlci0+R2V0RGF0YSgpLCBwVmFsdWUsIGlCeXRlcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpHZXRNYXBNb2R1bGVCdWZmZXIodm9pZCogcEtleSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm90b0Fsc28pIHsNCisgIFhGQV9MUE1BUERBVEFCTE9DSyBwQnVmZmVyID0gTlVMTDsNCisgIENYRkFfTm9kZSogcE5vZGUgPSB0aGlzOw0KKyAgd2hpbGUgKHBOb2RlKSB7DQorICAgIFhGQV9MUE1BUE1PRFVMRURBVEEgcE1vdWRsZSA9IHBOb2RlLT5HZXRNYXBNb2R1bGVEYXRhKEZBTFNFKTsNCisgICAgaWYgKHBNb3VkbGUgJiYgcE1vdWRsZS0+bV9CdWZmZXJNYXAuTG9va3VwKHBLZXksIHBCdWZmZXIpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcE5vZGUgPSAoYlByb3RvQWxzbyAmJiBwTm9kZS0+R2V0UGFja2V0SUQoKSAhPSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKQ0KKyAgICAgICAgICAgICAgICA/IHBOb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKQ0KKyAgICAgICAgICAgICAgICA6IE5VTEw7DQorICB9DQorICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHBWYWx1ZSA9IHBCdWZmZXItPkdldERhdGEoKTsNCisgIGlCeXRlcyA9IHBCdWZmZXItPmlCeXRlczsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6SGFzTWFwTW9kdWxlS2V5KHZvaWQqIHBLZXksIEZYX0JPT0wgYlByb3RvQWxzbykgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHRoaXM7DQorICB3aGlsZSAocE5vZGUpIHsNCisgICAgdm9pZCogcFZhbDsNCisgICAgWEZBX0xQTUFQTU9EVUxFREFUQSBwTW91ZGxlID0gcE5vZGUtPkdldE1hcE1vZHVsZURhdGEoRkFMU0UpOw0KKyAgICBpZiAocE1vdWRsZSAmJg0KKyAgICAgICAgKHBNb3VkbGUtPm1fVmFsdWVNYXAuTG9va3VwKHBLZXksIHBWYWwpIHx8DQorICAgICAgICAgcE1vdWRsZS0+bV9CdWZmZXJNYXAuTG9va3VwKHBLZXksIChYRkFfTFBNQVBEQVRBQkxPQ0smKXBWYWwpKSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHBOb2RlID0gKGJQcm90b0Fsc28gJiYgcE5vZGUtPkdldFBhY2tldElEKCkgIT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykNCisgICAgICAgICAgICAgICAgPyBwTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCkNCisgICAgICAgICAgICAgICAgOiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfTm9kZTo6UmVtb3ZlTWFwTW9kdWxlS2V5KHZvaWQqIHBLZXkpIHsNCisgIFhGQV9MUE1BUE1PRFVMRURBVEEgcE1vdWRsZSA9IHRoaXMtPkdldE1hcE1vZHVsZURhdGEoRkFMU0UpOw0KKyAgaWYgKCFwTW91ZGxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwS2V5KSB7DQogICAgIFhGQV9MUE1BUERBVEFCTE9DSyBwQnVmZmVyID0gTlVMTDsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHRoaXM7DQotICAgIHdoaWxlIChwTm9kZSkgew0KLSAgICAgICAgWEZBX0xQTUFQTU9EVUxFREFUQSBwTW91ZGxlID0gcE5vZGUtPkdldE1hcE1vZHVsZURhdGEoRkFMU0UpOw0KLSAgICAgICAgaWYgKHBNb3VkbGUgJiYgcE1vdWRsZS0+bV9CdWZmZXJNYXAuTG9va3VwKHBLZXksIHBCdWZmZXIpKSB7DQotICAgICAgICAgICAgYnJlYWs7DQorICAgIHBNb3VkbGUtPm1fQnVmZmVyTWFwLkxvb2t1cChwS2V5LCBwQnVmZmVyKTsNCisgICAgaWYgKHBCdWZmZXIpIHsNCisgICAgICBpZiAocEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSkgew0KKyAgICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCisgICAgICB9DQorICAgICAgRlhfRnJlZShwQnVmZmVyKTsNCisgICAgfQ0KKyAgICBwTW91ZGxlLT5tX0J1ZmZlck1hcC5SZW1vdmVLZXkocEtleSk7DQorICAgIHBNb3VkbGUtPm1fVmFsdWVNYXAuUmVtb3ZlS2V5KHBLZXkpOw0KKyAgfSBlbHNlIHsNCisgICAgWEZBX0xQTUFQREFUQUJMT0NLIHBCdWZmZXI7DQorICAgIEZYX1BPU0lUSU9OIHBvc0J1ZmZlciA9IHBNb3VkbGUtPm1fQnVmZmVyTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBvc0J1ZmZlcikgew0KKyAgICAgIHBNb3VkbGUtPm1fQnVmZmVyTWFwLkdldE5leHRBc3NvYyhwb3NCdWZmZXIsIHBLZXksIHBCdWZmZXIpOw0KKyAgICAgIGlmIChwQnVmZmVyKSB7DQorICAgICAgICBpZiAocEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSkgew0KKyAgICAgICAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOw0KICAgICAgICAgfQ0KLSAgICAgICAgcE5vZGUgPSAoYlByb3RvQWxzbyAmJiBwTm9kZS0+R2V0UGFja2V0SUQoKSAhPSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSA/IHBOb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKSA6IE5VTEw7DQorICAgICAgICBGWF9GcmVlKHBCdWZmZXIpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBwTW91ZGxlLT5tX0J1ZmZlck1hcC5SZW1vdmVBbGwoKTsNCisgICAgcE1vdWRsZS0+bV9WYWx1ZU1hcC5SZW1vdmVBbGwoKTsNCisgICAgaWYgKHBNb3VkbGUpIHsNCisgICAgICBkZWxldGUgcE1vdWRsZTsNCisgICAgICBwTW91ZGxlID0gTlVMTDsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6TWVyZ2VBbGxEYXRhKHZvaWQqIHBEc3RNb2R1bGUsIEZYX0JPT0wgYlVzZVNyY0F0dHIpIHsNCisgIFhGQV9MUE1BUE1PRFVMRURBVEEgcERzdE1vZHVsZURhdGEgPQ0KKyAgICAgICgoQ1hGQV9Ob2RlKilwRHN0TW9kdWxlKS0+R2V0TWFwTW9kdWxlRGF0YShUUlVFKTsNCisgIGlmICghcERzdE1vZHVsZURhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgWEZBX0xQTUFQTU9EVUxFREFUQSBwU3JjTW9kdWxlRGF0YSA9IHRoaXMtPkdldE1hcE1vZHVsZURhdGEoRkFMU0UpOw0KKyAgaWYgKCFwU3JjTW9kdWxlRGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9QT1NJVElPTiBwc1ZhbHVlID0gcFNyY01vZHVsZURhdGEtPm1fVmFsdWVNYXAuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzVmFsdWUpIHsNCisgICAgdm9pZCogcEtleTsNCisgICAgdm9pZCogcFZhbHVlOw0KKyAgICBwU3JjTW9kdWxlRGF0YS0+bV9WYWx1ZU1hcC5HZXROZXh0QXNzb2MocHNWYWx1ZSwgcEtleSwgcFZhbHVlKTsNCisgICAgaWYgKGJVc2VTcmNBdHRyIHx8ICFwRHN0TW9kdWxlRGF0YS0+bV9WYWx1ZU1hcC5HZXRWYWx1ZUF0KHBLZXkpKSB7DQorICAgICAgcERzdE1vZHVsZURhdGEtPm1fVmFsdWVNYXAuU2V0QXQocEtleSwgcFZhbHVlKTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfUE9TSVRJT04gcHNCdWZmZXIgPSBwU3JjTW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzQnVmZmVyKSB7DQorICAgIHZvaWQqIHBLZXk7DQorICAgIFhGQV9MUE1BUERBVEFCTE9DSyBwU3JjQnVmZmVyOw0KKyAgICBwU3JjTW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuR2V0TmV4dEFzc29jKHBzQnVmZmVyLCBwS2V5LCBwU3JjQnVmZmVyKTsNCisgICAgWEZBX0xQTUFQREFUQUJMT0NLJiBwQnVmZmVyID0gcERzdE1vZHVsZURhdGEtPm1fQnVmZmVyTWFwW3BLZXldOw0KKyAgICBpZiAocEJ1ZmZlciAmJiAhYlVzZVNyY0F0dHIpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAocFNyY0J1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwU3JjQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSAmJg0KKyAgICAgICAgIXBTcmNCdWZmZXItPnBDYWxsYmFja0luZm8tPnBDb3B5KSB7DQorICAgICAgaWYgKHBCdWZmZXIpIHsNCisgICAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7DQorICAgICAgICBwRHN0TW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuUmVtb3ZlS2V5KHBLZXkpOw0KKyAgICAgIH0NCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KICAgICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgcEJ1ZmZlciA9IChYRkFfTFBNQVBEQVRBQkxPQ0spRlhfQWxsb2MoDQorICAgICAgICAgIHVpbnQ4X3QsIHNpemVvZihYRkFfTUFQREFUQUJMT0NLKSArIHBTcmNCdWZmZXItPmlCeXRlcyk7DQorICAgIH0gZWxzZSBpZiAocEJ1ZmZlci0+aUJ5dGVzICE9IHBTcmNCdWZmZXItPmlCeXRlcykgew0KKyAgICAgIGlmIChwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKSB7DQorICAgICAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOw0KKyAgICAgIH0NCisgICAgICBwQnVmZmVyID0gKFhGQV9MUE1BUERBVEFCTE9DSylGWF9SZWFsbG9jKA0KKyAgICAgICAgICB1aW50OF90LCBwQnVmZmVyLCBzaXplb2YoWEZBX01BUERBVEFCTE9DSykgKyBwU3JjQnVmZmVyLT5pQnl0ZXMpOw0KKyAgICB9IGVsc2UgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsNCisgICAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOw0KICAgICB9DQotICAgIHBWYWx1ZSA9IHBCdWZmZXItPkdldERhdGEoKTsNCi0gICAgaUJ5dGVzID0gcEJ1ZmZlci0+aUJ5dGVzOw0KLSAgICByZXR1cm4gVFJVRTsNCisgICAgaWYgKHBCdWZmZXIgPT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8gPSBwU3JjQnVmZmVyLT5wQ2FsbGJhY2tJbmZvOw0KKyAgICBwQnVmZmVyLT5pQnl0ZXMgPSBwU3JjQnVmZmVyLT5pQnl0ZXM7DQorICAgIEZYU1lTX21lbWNweShwQnVmZmVyLT5HZXREYXRhKCksIHBTcmNCdWZmZXItPkdldERhdGEoKSwgcFNyY0J1ZmZlci0+aUJ5dGVzKTsNCisgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cENvcHkpIHsNCisgICAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wQ29weSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOw0KKyAgICB9DQorICB9DQogfQ0KLUZYX0JPT0wgQ1hGQV9Ob2RlOjpIYXNNYXBNb2R1bGVLZXkodm9pZCogcEtleSwgRlhfQk9PTCBiUHJvdG9BbHNvKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHRoaXM7DQotICAgIHdoaWxlIChwTm9kZSkgew0KLSAgICAgICAgdm9pZCogcFZhbDsNCi0gICAgICAgIFhGQV9MUE1BUE1PRFVMRURBVEEgcE1vdWRsZSA9IHBOb2RlLT5HZXRNYXBNb2R1bGVEYXRhKEZBTFNFKTsNCi0gICAgICAgIGlmIChwTW91ZGxlICYmIChwTW91ZGxlLT5tX1ZhbHVlTWFwLkxvb2t1cChwS2V5LCBwVmFsKSB8fCBwTW91ZGxlLT5tX0J1ZmZlck1hcC5Mb29rdXAocEtleSwgKFhGQV9MUE1BUERBVEFCTE9DSyYpcFZhbCkpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgICAgICBwTm9kZSA9IChiUHJvdG9BbHNvICYmIHBOb2RlLT5HZXRQYWNrZXRJRCgpICE9IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpID8gcE5vZGUtPkdldFRlbXBsYXRlTm9kZSgpIDogTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpSZW1vdmVNYXBNb2R1bGVLZXkodm9pZCogcEtleSApDQotew0KLSAgICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBNb3VkbGUgPSB0aGlzLT5HZXRNYXBNb2R1bGVEYXRhKEZBTFNFKTsNCi0gICAgaWYgKCFwTW91ZGxlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKHBLZXkpIHsNCi0gICAgICAgIFhGQV9MUE1BUERBVEFCTE9DSyBwQnVmZmVyID0gTlVMTDsNCi0gICAgICAgIHBNb3VkbGUtPm1fQnVmZmVyTWFwLkxvb2t1cChwS2V5LCBwQnVmZmVyKTsNCi0gICAgICAgIGlmIChwQnVmZmVyKSB7DQotICAgICAgICAgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsNCi0gICAgICAgICAgICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBNb3VkbGUtPm1fQnVmZmVyTWFwLlJlbW92ZUtleShwS2V5KTsNCi0gICAgICAgIHBNb3VkbGUtPm1fVmFsdWVNYXAuUmVtb3ZlS2V5KHBLZXkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgWEZBX0xQTUFQREFUQUJMT0NLIHBCdWZmZXI7DQotICAgICAgICBGWF9QT1NJVElPTiBwb3NCdWZmZXIgPSBwTW91ZGxlLT5tX0J1ZmZlck1hcC5HZXRTdGFydFBvc2l0aW9uKCk7DQotICAgICAgICB3aGlsZSAocG9zQnVmZmVyKSB7DQotICAgICAgICAgICAgcE1vdWRsZS0+bV9CdWZmZXJNYXAuR2V0TmV4dEFzc29jKHBvc0J1ZmZlciwgcEtleSwgcEJ1ZmZlcik7DQotICAgICAgICAgICAgaWYgKHBCdWZmZXIpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBwTW91ZGxlLT5tX0J1ZmZlck1hcC5SZW1vdmVBbGwoKTsNCi0gICAgICAgIHBNb3VkbGUtPm1fVmFsdWVNYXAuUmVtb3ZlQWxsKCk7DQotICAgICAgICBpZiAocE1vdWRsZSkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBwTW91ZGxlOw0KLSAgICAgICAgICAgIHBNb3VkbGUgPSBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9Ob2RlOjpNZXJnZUFsbERhdGEodm9pZCogcERzdE1vZHVsZSwgRlhfQk9PTCBiVXNlU3JjQXR0ciApDQotew0KLSAgICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBEc3RNb2R1bGVEYXRhID0gKChDWEZBX05vZGUqKXBEc3RNb2R1bGUpLT5HZXRNYXBNb2R1bGVEYXRhKFRSVUUpOw0KLSAgICBpZiAoIXBEc3RNb2R1bGVEYXRhKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgWEZBX0xQTUFQTU9EVUxFREFUQSBwU3JjTW9kdWxlRGF0YSA9IHRoaXMtPkdldE1hcE1vZHVsZURhdGEoRkFMU0UpOw0KK3ZvaWQgQ1hGQV9Ob2RlOjpNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX05vZGUqIHBEc3RNb2R1bGUsIHZvaWQqIHBLZXkpIHsNCisgIGlmICghcERzdE1vZHVsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJOZWVkTW92ZSA9IFRSVUU7DQorICBpZiAoIXBLZXkpIHsNCisgICAgYk5lZWRNb3ZlID0gRkFMU0U7DQorICB9DQorICBpZiAocERzdE1vZHVsZS0+R2V0Q2xhc3NJRCgpICE9IHRoaXMtPkdldENsYXNzSUQoKSkgew0KKyAgICBiTmVlZE1vdmUgPSBGQUxTRTsNCisgIH0NCisgIFhGQV9MUE1BUE1PRFVMRURBVEEgcFNyY01vZHVsZURhdGEgPSBOVUxMOw0KKyAgWEZBX0xQTUFQTU9EVUxFREFUQSBwRHN0TW9kdWxlRGF0YSA9IE5VTEw7DQorICBpZiAoYk5lZWRNb3ZlKSB7DQorICAgIHBTcmNNb2R1bGVEYXRhID0gdGhpcy0+R2V0TWFwTW9kdWxlRGF0YShGQUxTRSk7DQogICAgIGlmICghcFNyY01vZHVsZURhdGEpIHsNCi0gICAgICAgIHJldHVybjsNCisgICAgICBiTmVlZE1vdmUgPSBGQUxTRTsNCiAgICAgfQ0KLSAgICBGWF9QT1NJVElPTiBwc1ZhbHVlID0gcFNyY01vZHVsZURhdGEtPm1fVmFsdWVNYXAuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHNWYWx1ZSkgew0KLSAgICAgICAgdm9pZCogcEtleTsNCi0gICAgICAgIHZvaWQqIHBWYWx1ZTsNCi0gICAgICAgIHBTcmNNb2R1bGVEYXRhLT5tX1ZhbHVlTWFwLkdldE5leHRBc3NvYyhwc1ZhbHVlLCBwS2V5LCBwVmFsdWUpOw0KLSAgICAgICAgaWYgKGJVc2VTcmNBdHRyIHx8ICFwRHN0TW9kdWxlRGF0YS0+bV9WYWx1ZU1hcC5HZXRWYWx1ZUF0KHBLZXkpKSB7DQotICAgICAgICAgICAgcERzdE1vZHVsZURhdGEtPm1fVmFsdWVNYXAuU2V0QXQocEtleSwgcFZhbHVlKTsNCi0gICAgICAgIH0NCisgICAgcERzdE1vZHVsZURhdGEgPSBwRHN0TW9kdWxlLT5HZXRNYXBNb2R1bGVEYXRhKFRSVUUpOw0KKyAgICBpZiAoIXBEc3RNb2R1bGVEYXRhKSB7DQorICAgICAgYk5lZWRNb3ZlID0gRkFMU0U7DQogICAgIH0NCi0gICAgRlhfUE9TSVRJT04gcHNCdWZmZXIgPSBwU3JjTW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHNCdWZmZXIpIHsNCi0gICAgICAgIHZvaWQqIHBLZXk7DQotICAgICAgICBYRkFfTFBNQVBEQVRBQkxPQ0sgcFNyY0J1ZmZlcjsNCi0gICAgICAgIHBTcmNNb2R1bGVEYXRhLT5tX0J1ZmZlck1hcC5HZXROZXh0QXNzb2MocHNCdWZmZXIsIHBLZXksIHBTcmNCdWZmZXIpOw0KLSAgICAgICAgWEZBX0xQTUFQREFUQUJMT0NLICZwQnVmZmVyID0gcERzdE1vZHVsZURhdGEtPm1fQnVmZmVyTWFwW3BLZXldOw0KLSAgICAgICAgaWYgKHBCdWZmZXIgJiYgIWJVc2VTcmNBdHRyKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAocFNyY0J1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwU3JjQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSAmJiAhcFNyY0J1ZmZlci0+cENhbGxiYWNrSW5mby0+cENvcHkpIHsNCi0gICAgICAgICAgICBpZiAocEJ1ZmZlcikgew0KLSAgICAgICAgICAgICAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOw0KLSAgICAgICAgICAgICAgICBwRHN0TW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuUmVtb3ZlS2V5KHBLZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCi0gICAgICAgICAgICBwQnVmZmVyID0gKFhGQV9MUE1BUERBVEFCTE9DSylGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoWEZBX01BUERBVEFCTE9DSykgKyBwU3JjQnVmZmVyLT5pQnl0ZXMpOw0KLSAgICAgICAgfSBlbHNlIGlmIChwQnVmZmVyLT5pQnl0ZXMgIT0gcFNyY0J1ZmZlci0+aUJ5dGVzKSB7DQotICAgICAgICAgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsNCi0gICAgICAgICAgICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcEJ1ZmZlciA9IChYRkFfTFBNQVBEQVRBQkxPQ0spRlhfUmVhbGxvYyh1aW50OF90LCBwQnVmZmVyLCBzaXplb2YoWEZBX01BUERBVEFCTE9DSykgKyBwU3JjQnVmZmVyLT5pQnl0ZXMpOw0KLSAgICAgICAgfSBlbHNlIGlmIChwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKSB7DQotICAgICAgICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8gPSBwU3JjQnVmZmVyLT5wQ2FsbGJhY2tJbmZvOw0KLSAgICAgICAgcEJ1ZmZlci0+aUJ5dGVzID0gcFNyY0J1ZmZlci0+aUJ5dGVzOw0KLSAgICAgICAgRlhTWVNfbWVtY3B5KHBCdWZmZXItPkdldERhdGEoKSwgcFNyY0J1ZmZlci0+R2V0RGF0YSgpLCBwU3JjQnVmZmVyLT5pQnl0ZXMpOw0KLSAgICAgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cENvcHkpIHsNCi0gICAgICAgICAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wQ29weSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOw0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgaWYgKGJOZWVkTW92ZSkgew0KKyAgICB2b2lkKiBwQnVmZmVyQmxvY2tEYXRhID0gcFNyY01vZHVsZURhdGEtPm1fQnVmZmVyTWFwLkdldFZhbHVlQXQocEtleSk7DQorICAgIGlmIChwQnVmZmVyQmxvY2tEYXRhKSB7DQorICAgICAgcFNyY01vZHVsZURhdGEtPm1fQnVmZmVyTWFwLlJlbW92ZUtleShwS2V5KTsNCisgICAgICBwRHN0TW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuUmVtb3ZlS2V5KHBLZXkpOw0KKyAgICAgIHBEc3RNb2R1bGVEYXRhLT5tX0J1ZmZlck1hcC5TZXRBdChwS2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWEZBX0xQTUFQREFUQUJMT0NLKXBCdWZmZXJCbG9ja0RhdGEpOw0KICAgICB9DQorICB9DQorICBpZiAocERzdE1vZHVsZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX05vZGVWKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBwRHN0TW9kdWxlLT5HZXRTY3JpcHRDb250ZW50KEZBTFNFKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c1ZhbHVlKTsNCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IHBEc3RNb2R1bGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgICAgaWYgKHBXaWRnZXREYXRhKSB7DQorICAgICAgcFdpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdFZhbHVlKTsNCisgICAgfQ0KKyAgICBwRHN0TW9kdWxlLT5TZXRTY3JpcHRDb250ZW50KHdzVmFsdWUsIHdzRm9ybWF0VmFsdWUsIFRSVUUsIFRSVUUpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfTm9kZTo6TW92ZUJ1ZmZlck1hcERhdGEoQ1hGQV9Ob2RlKiBwRHN0TW9kdWxlLCB2b2lkKiBwS2V5KQ0KLXsNCi0gICAgaWYgKCFwRHN0TW9kdWxlKSB7DQotICAgICAgICByZXR1cm47DQordm9pZCBDWEZBX05vZGU6Ok1vdmVCdWZmZXJNYXBEYXRhKENYRkFfTm9kZSogcFNyY01vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRHN0TW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwS2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWN1cnNpdmUpIHsNCisgIGlmICghcFNyY01vZHVsZSB8fCAhcERzdE1vZHVsZSB8fCAhcEtleSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlJlY3Vyc2l2ZSkgew0KKyAgICBDWEZBX05vZGUqIHBTcmNDaGlsZCA9IHBTcmNNb2R1bGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgQ1hGQV9Ob2RlKiBwRHN0Q2hpbGQgPSBwRHN0TW9kdWxlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGZvciAoOyBwU3JjQ2hpbGQgJiYgcERzdENoaWxkOw0KKyAgICAgICAgIHBTcmNDaGlsZCA9IHBTcmNDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSwNCisgICAgICAgICBwRHN0Q2hpbGQgPSBwRHN0Q2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICBNb3ZlQnVmZmVyTWFwRGF0YShwU3JjQ2hpbGQsIHBEc3RDaGlsZCwgcEtleSwgVFJVRSk7DQogICAgIH0NCi0gICAgRlhfQk9PTCBiTmVlZE1vdmUgPSBUUlVFOw0KLSAgICBpZiAoIXBLZXkpIHsNCi0gICAgICAgIGJOZWVkTW92ZSA9IEZBTFNFOw0KLSAgICB9DQotICAgIGlmIChwRHN0TW9kdWxlLT5HZXRDbGFzc0lEKCkgIT0gdGhpcy0+R2V0Q2xhc3NJRCgpKSB7DQotICAgICAgICBiTmVlZE1vdmUgPSBGQUxTRTsNCi0gICAgfQ0KLSAgICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBTcmNNb2R1bGVEYXRhID0gTlVMTDsNCi0gICAgWEZBX0xQTUFQTU9EVUxFREFUQSBwRHN0TW9kdWxlRGF0YSA9IE5VTEw7DQotICAgIGlmIChiTmVlZE1vdmUpIHsNCi0gICAgICAgIHBTcmNNb2R1bGVEYXRhID0gdGhpcy0+R2V0TWFwTW9kdWxlRGF0YShGQUxTRSk7DQotICAgICAgICBpZiAoIXBTcmNNb2R1bGVEYXRhKSB7DQotICAgICAgICAgICAgYk5lZWRNb3ZlID0gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBwRHN0TW9kdWxlRGF0YSA9IHBEc3RNb2R1bGUtPkdldE1hcE1vZHVsZURhdGEoVFJVRSk7DQotICAgICAgICBpZiAoIXBEc3RNb2R1bGVEYXRhKSB7DQotICAgICAgICAgICAgYk5lZWRNb3ZlID0gRkFMU0U7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGJOZWVkTW92ZSkgew0KLSAgICAgICAgdm9pZCogcEJ1ZmZlckJsb2NrRGF0YSA9IHBTcmNNb2R1bGVEYXRhLT5tX0J1ZmZlck1hcC5HZXRWYWx1ZUF0KHBLZXkpOw0KLSAgICAgICAgaWYgKHBCdWZmZXJCbG9ja0RhdGEpIHsNCi0gICAgICAgICAgICBwU3JjTW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuUmVtb3ZlS2V5KHBLZXkpOw0KLSAgICAgICAgICAgIHBEc3RNb2R1bGVEYXRhLT5tX0J1ZmZlck1hcC5SZW1vdmVLZXkocEtleSk7DQotICAgICAgICAgICAgcERzdE1vZHVsZURhdGEtPm1fQnVmZmVyTWFwLlNldEF0KHBLZXksIChYRkFfTFBNQVBEQVRBQkxPQ0spcEJ1ZmZlckJsb2NrRGF0YSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBEc3RNb2R1bGUtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Ob2RlVikgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IHBEc3RNb2R1bGUtPkdldFNjcmlwdENvbnRlbnQoRkFMU0UpOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c1ZhbHVlKTsNCi0gICAgICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBwRHN0TW9kdWxlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQotICAgICAgICBpZiAocFdpZGdldERhdGEpIHsNCi0gICAgICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0VmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcERzdE1vZHVsZS0+U2V0U2NyaXB0Q29udGVudCh3c1ZhbHVlLCB3c0Zvcm1hdFZhbHVlLCBUUlVFLCBUUlVFKTsNCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfTm9kZTo6TW92ZUJ1ZmZlck1hcERhdGEoQ1hGQV9Ob2RlKiBwU3JjTW9kdWxlLCBDWEZBX05vZGUqIHBEc3RNb2R1bGUsIHZvaWQqIHBLZXksIEZYX0JPT0wgYlJlY3Vyc2l2ZSApDQotew0KLSAgICBpZiAoIXBTcmNNb2R1bGUgfHwgIXBEc3RNb2R1bGUgfHwgIXBLZXkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoYlJlY3Vyc2l2ZSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwU3JjQ2hpbGQgPSBwU3JjTW9kdWxlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICBDWEZBX05vZGUqIHBEc3RDaGlsZCA9IHBEc3RNb2R1bGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgICAgIGZvciAoIDsgcFNyY0NoaWxkICYmIHBEc3RDaGlsZDsgcFNyY0NoaWxkID0gcFNyY0NoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpLCBwRHN0Q2hpbGQgPSBwRHN0Q2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICBNb3ZlQnVmZmVyTWFwRGF0YShwU3JjQ2hpbGQsIHBEc3RDaGlsZCwgcEtleSwgVFJVRSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcFNyY01vZHVsZS0+TW92ZUJ1ZmZlck1hcERhdGEocERzdE1vZHVsZSwgcEtleSk7DQorICB9DQorICBwU3JjTW9kdWxlLT5Nb3ZlQnVmZmVyTWFwRGF0YShwRHN0TW9kdWxlLCBwS2V5KTsNCiB9DQogQ1hGQV9Ob2RlTGlzdDo6Q1hGQV9Ob2RlTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQotICAgIDogQ1hGQV9PYmplY3QocERvY3VtZW50LCBYRkFfT0JKRUNUVFlQRV9Ob2RlTGlzdCkNCi17DQotICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkNhY2hlTGlzdCh0aGlzKTsNCisgICAgOiBDWEZBX09iamVjdChwRG9jdW1lbnQsIFhGQV9PQkpFQ1RUWVBFX05vZGVMaXN0KSB7DQorICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5DYWNoZUxpc3QodGhpcyk7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9Ob2RlTGlzdDo6TmFtZWRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKQ0KLXsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBHZXRMZW5ndGgoKTsNCi0gICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgd3NOYW1lLkdldExlbmd0aCgpKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgIENYRkFfTm9kZSogcmV0ID0gSXRlbShpKTsNCi0gICAgICAgIGlmIChkd0hhc2hDb2RlID09IHJldC0+R2V0TmFtZUhhc2goKSkgew0KLSAgICAgICAgICAgIHJldHVybiByZXQ7DQotICAgICAgICB9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGVMaXN0OjpOYW1lZEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsNCisgIGludDMyX3QgaUNvdW50ID0gR2V0TGVuZ3RoKCk7DQorICBGWF9EV09SRCBkd0hhc2hDb2RlID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDWEZBX05vZGUqIHJldCA9IEl0ZW0oaSk7DQorICAgIGlmIChkd0hhc2hDb2RlID09IHJldC0+R2V0TmFtZUhhc2goKSkgew0KKyAgICAgIHJldHVybiByZXQ7DQogICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotdm9pZAlDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0FwcGVuZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmKGFyZ2MgPT0gMSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlICpwTm9kZSA9IChDWEZBX05vZGUgKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQotICAgICAgICBpZihwTm9kZSkgew0KLSAgICAgICAgICAgIEFwcGVuZChwTm9kZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19BcHBlbmQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICAgIGlmIChwTm9kZSkgew0KKyAgICAgIEFwcGVuZChwTm9kZSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImFwcGVuZCIpOw0KKyAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImFwcGVuZCIpOw0KKyAgfQ0KIH0NCi12b2lkCUNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfSW5zZXJ0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYoYXJnYyA9PSAyKSB7DQotICAgICAgICBDWEZBX05vZGUgKnBOZXdOb2RlID0gKENYRkFfTm9kZSAqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCi0gICAgICAgIENYRkFfTm9kZSAqcEJlZm9yZU5vZGUgPSAoQ1hGQV9Ob2RlICopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDEpOw0KLSAgICAgICAgaWYocE5ld05vZGUpIHsNCi0gICAgICAgICAgICBJbnNlcnQocE5ld05vZGUsIHBCZWZvcmVOb2RlKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQotICAgICAgICB9DQordm9pZCBDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0luc2VydChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDIpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCisgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgxKTsNCisgICAgaWYgKHBOZXdOb2RlKSB7DQorICAgICAgSW5zZXJ0KHBOZXdOb2RlLCBwQmVmb3JlTm9kZSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImluc2VydCIpOw0KKyAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImluc2VydCIpOw0KKyAgfQ0KIH0NCi12b2lkCUNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfUmVtb3ZlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYoYXJnYyA9PSAxKSB7DQotICAgICAgICBDWEZBX05vZGUgKnBOb2RlID0gKENYRkFfTm9kZSAqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCi0gICAgICAgIGlmKHBOb2RlKSB7DQotICAgICAgICAgICAgUmVtb3ZlKHBOb2RlKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQotICAgICAgICB9DQordm9pZCBDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX1JlbW92ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCisgICAgaWYgKHBOb2RlKSB7DQorICAgICAgUmVtb3ZlKHBOb2RlKTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVtb3ZlIik7DQorICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQogICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVtb3ZlIik7DQorICB9DQogfQ0KLXZvaWQJQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19JdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYoYXJnYyA9PSAxKSB7DQotICAgICAgICBpbnQzMl90IGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KLSAgICAgICAgaWYoKGlJbmRleCA+PSAwKSAmJiAoaUluZGV4ICsgMSA8PSBHZXRMZW5ndGgoKSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAoSXRlbShpSW5kZXgpKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5ERVhfT1VUX09GX0JPVU5EUyk7DQotICAgICAgICB9DQordm9pZCBDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0l0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICAgIGlmICgoaUluZGV4ID49IDApICYmIChpSW5kZXggKyAxIDw9IEdldExlbmd0aCgpKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldCgNCisgICAgICAgICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAoSXRlbShpSW5kZXgpKSk7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIml0ZW0iKTsNCisgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOREVYX09VVF9PRl9CT1VORFMpOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIml0ZW0iKTsNCisgIH0NCiB9DQotdm9pZAlDWEZBX05vZGVMaXN0OjpTY3JpcHRfVHJlZWxpc3RDbGFzc19OYW1lZEl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZihhcmdjID09IDEpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN6TmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQotICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gTmFtZWRJdGVtKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUsIHN6TmFtZS5HZXRMZW5ndGgoKSkpOw0KLSAgICAgICAgaWYgKCFwTm9kZSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTm9kZSkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJuYW1lZEl0ZW0iKTsNCit2b2lkIENYRkFfTm9kZUxpc3Q6OlNjcmlwdF9UcmVlbGlzdENsYXNzX05hbWVkSXRlbSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIHN6TmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPQ0KKyAgICAgICAgTmFtZWRJdGVtKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUsIHN6TmFtZS5HZXRMZW5ndGgoKSkpOw0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5vZGUpKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwibmFtZWRJdGVtIik7DQorICB9DQogfQ0KLXZvaWQJQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19MZW5ndGgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYoIWJTZXR0aW5nKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgR2V0TGVuZ3RoKCkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19MZW5ndGgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghYlNldHRpbmcpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIEdldExlbmd0aCgpKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9DQogfQ0KIENYRkFfQXJyYXlOb2RlTGlzdDo6Q1hGQV9BcnJheU5vZGVMaXN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCi0gICAgOiBDWEZBX05vZGVMaXN0KHBEb2N1bWVudCkNCi17DQorICAgIDogQ1hGQV9Ob2RlTGlzdChwRG9jdW1lbnQpIHt9DQordm9pZCBDWEZBX0FycmF5Tm9kZUxpc3Q6OlNldEFycmF5Tm9kZUxpc3QoY29uc3QgQ1hGQV9Ob2RlQXJyYXkmIHNyY0FycmF5KSB7DQorICBpZiAoc3JjQXJyYXkuR2V0U2l6ZSgpID4gMCkgew0KKyAgICBtX2FycmF5LkNvcHkoc3JjQXJyYXkpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfQXJyYXlOb2RlTGlzdDo6U2V0QXJyYXlOb2RlTGlzdChjb25zdCBDWEZBX05vZGVBcnJheSAmc3JjQXJyYXkpDQotew0KLSAgICBpZiAoc3JjQXJyYXkuR2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgbV9hcnJheS5Db3B5KHNyY0FycmF5KTsNCi0gICAgfQ0KK2ludDMyX3QgQ1hGQV9BcnJheU5vZGVMaXN0OjpHZXRMZW5ndGgoKSB7DQorICByZXR1cm4gbV9hcnJheS5HZXRTaXplKCk7DQogfQ0KLWludDMyX3QgQ1hGQV9BcnJheU5vZGVMaXN0OjpHZXRMZW5ndGgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fYXJyYXkuR2V0U2l6ZSgpOw0KK0ZYX0JPT0wgQ1hGQV9BcnJheU5vZGVMaXN0OjpBcHBlbmQoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgbV9hcnJheS5BZGQocE5vZGUpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9BcnJheU5vZGVMaXN0OjpBcHBlbmQoQ1hGQV9Ob2RlKiBwTm9kZSkNCi17DQotICAgIG1fYXJyYXkuQWRkKHBOb2RlKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ1hGQV9BcnJheU5vZGVMaXN0OjpJbnNlcnQoQ1hGQV9Ob2RlKiBwTmV3Tm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSkNCi17DQotICAgIGlmIChwQmVmb3JlTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICBtX2FycmF5LkFkZChwTmV3Tm9kZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpbnQzMl90IGlTaXplID0gbV9hcnJheS5HZXRTaXplKCk7DQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQotICAgICAgICAgICAgaWYgKG1fYXJyYXlbaV0gPT0gcEJlZm9yZU5vZGUpIHsNCi0gICAgICAgICAgICAgICAgbV9hcnJheS5JbnNlcnRBdChpLCBwTmV3Tm9kZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX0FycmF5Tm9kZUxpc3Q6OlJlbW92ZShDWEZBX05vZGUqIHBOb2RlKQ0KLXsNCitGWF9CT09MIENYRkFfQXJyYXlOb2RlTGlzdDo6SW5zZXJ0KENYRkFfTm9kZSogcE5ld05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmVOb2RlKSB7DQorICBpZiAocEJlZm9yZU5vZGUgPT0gTlVMTCkgew0KKyAgICBtX2FycmF5LkFkZChwTmV3Tm9kZSk7DQorICB9IGVsc2Ugew0KICAgICBpbnQzMl90IGlTaXplID0gbV9hcnJheS5HZXRTaXplKCk7DQogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsNCi0gICAgICAgIGlmIChtX2FycmF5W2ldID09IHBOb2RlKSB7DQotICAgICAgICAgICAgbV9hcnJheS5SZW1vdmVBdChpKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCisgICAgICBpZiAobV9hcnJheVtpXSA9PSBwQmVmb3JlTm9kZSkgew0KKyAgICAgICAgbV9hcnJheS5JbnNlcnRBdChpLCBwTmV3Tm9kZSk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX0FycmF5Tm9kZUxpc3Q6Okl0ZW0oaW50MzJfdCBpSW5kZXgpDQotew0KLSAgICBpbnQzMl90IGlTaXplID0gbV9hcnJheS5HZXRTaXplKCk7DQotICAgIGlmIChpSW5kZXggPj0gMCAmJiBpSW5kZXggPCBpU2l6ZSkgew0KLSAgICAgICAgcmV0dXJuIG1fYXJyYXlbaUluZGV4XTsNCitGWF9CT09MIENYRkFfQXJyYXlOb2RlTGlzdDo6UmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpIHsNCisgIGludDMyX3QgaVNpemUgPSBtX2FycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsNCisgICAgaWYgKG1fYXJyYXlbaV0gPT0gcE5vZGUpIHsNCisgICAgICBtX2FycmF5LlJlbW92ZUF0KGkpOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUNYRkFfQXR0YWNoTm9kZUxpc3Q6OkNYRkFfQXR0YWNoTm9kZUxpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBBdHRhY2hOb2RlKQ0KLSAgICA6IENYRkFfTm9kZUxpc3QocERvY3VtZW50KQ0KLXsNCi0gICAgbV9wQXR0YWNoTm9kZSA9IHBBdHRhY2hOb2RlOw0KK0NYRkFfTm9kZSogQ1hGQV9BcnJheU5vZGVMaXN0OjpJdGVtKGludDMyX3QgaUluZGV4KSB7DQorICBpbnQzMl90IGlTaXplID0gbV9hcnJheS5HZXRTaXplKCk7DQorICBpZiAoaUluZGV4ID49IDAgJiYgaUluZGV4IDwgaVNpemUpIHsNCisgICAgcmV0dXJuIG1fYXJyYXlbaUluZGV4XTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCi1pbnQzMl90IENYRkFfQXR0YWNoTm9kZUxpc3Q6OkdldExlbmd0aCgpDQotew0KLSAgICByZXR1cm4gbV9wQXR0YWNoTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9VTktOT1dOLCBtX3BBdHRhY2hOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSA/IFRSVUUgOiBGQUxTRSk7DQorQ1hGQV9BdHRhY2hOb2RlTGlzdDo6Q1hGQV9BdHRhY2hOb2RlTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBBdHRhY2hOb2RlKQ0KKyAgICA6IENYRkFfTm9kZUxpc3QocERvY3VtZW50KSB7DQorICBtX3BBdHRhY2hOb2RlID0gcEF0dGFjaE5vZGU7DQogfQ0KLUZYX0JPT0wgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6QXBwZW5kKENYRkFfTm9kZSogcE5vZGUpDQotew0KLSAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQotICAgIGlmIChwUGFyZW50KSB7DQotICAgICAgICBwUGFyZW50LT5SZW1vdmVDaGlsZChwTm9kZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcEF0dGFjaE5vZGUtPkluc2VydENoaWxkKHBOb2RlKTsNCitpbnQzMl90IENYRkFfQXR0YWNoTm9kZUxpc3Q6OkdldExlbmd0aCgpIHsNCisgIHJldHVybiBtX3BBdHRhY2hOb2RlLT5Db3VudENoaWxkcmVuKA0KKyAgICAgIFhGQV9FTEVNRU5UX1VOS05PV04sDQorICAgICAgbV9wQXR0YWNoTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gPyBUUlVFIDogRkFMU0UpOw0KIH0NCi1GWF9CT09MIENYRkFfQXR0YWNoTm9kZUxpc3Q6Okluc2VydChDWEZBX05vZGUqIHBOZXdOb2RlLCBDWEZBX05vZGUqIHBCZWZvcmVOb2RlKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gcE5ld05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICBpZiAocFBhcmVudCkgew0KLSAgICAgICAgcFBhcmVudC0+UmVtb3ZlQ2hpbGQocE5ld05vZGUpOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BBdHRhY2hOb2RlLT5JbnNlcnRDaGlsZChwTmV3Tm9kZSwgcEJlZm9yZU5vZGUpOw0KK0ZYX0JPT0wgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6QXBwZW5kKENYRkFfTm9kZSogcE5vZGUpIHsNCisgIENYRkFfTm9kZSogcFBhcmVudCA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIGlmIChwUGFyZW50KSB7DQorICAgIHBQYXJlbnQtPlJlbW92ZUNoaWxkKHBOb2RlKTsNCisgIH0NCisgIHJldHVybiBtX3BBdHRhY2hOb2RlLT5JbnNlcnRDaGlsZChwTm9kZSk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6UmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpDQotew0KLSAgICByZXR1cm4gbV9wQXR0YWNoTm9kZS0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KK0ZYX0JPT0wgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6SW5zZXJ0KENYRkFfTm9kZSogcE5ld05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSkgew0KKyAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gcE5ld05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgaWYgKHBQYXJlbnQpIHsNCisgICAgcFBhcmVudC0+UmVtb3ZlQ2hpbGQocE5ld05vZGUpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEF0dGFjaE5vZGUtPkluc2VydENoaWxkKHBOZXdOb2RlLCBwQmVmb3JlTm9kZSk7DQogfQ0KLUNYRkFfTm9kZSogQ1hGQV9BdHRhY2hOb2RlTGlzdDo6SXRlbShpbnQzMl90IGlJbmRleCkNCi17DQotICAgIHJldHVybiBtX3BBdHRhY2hOb2RlLT5HZXRDaGlsZChpSW5kZXgsIFhGQV9FTEVNRU5UX1VOS05PV04sIG1fcEF0dGFjaE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtID8gVFJVRSA6IEZBTFNFKTsNCitGWF9CT09MIENYRkFfQXR0YWNoTm9kZUxpc3Q6OlJlbW92ZShDWEZBX05vZGUqIHBOb2RlKSB7DQorICByZXR1cm4gbV9wQXR0YWNoTm9kZS0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KK30NCitDWEZBX05vZGUqIENYRkFfQXR0YWNoTm9kZUxpc3Q6Okl0ZW0oaW50MzJfdCBpSW5kZXgpIHsNCisgIHJldHVybiBtX3BBdHRhY2hOb2RlLT5HZXRDaGlsZCgNCisgICAgICBpSW5kZXgsIFhGQV9FTEVNRU5UX1VOS05PV04sDQorICAgICAgbV9wQXR0YWNoTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gPyBUUlVFIDogRkFMU0UpOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfb2JqZWN0YWNjX2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfb2JqZWN0YWNjX2ltcC5jcHAKaW5kZXggNTVmNDc2OC4uYWI5ZTMzMyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX29iamVjdGFjY19pbXAuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9vYmplY3RhY2NfaW1wLmNwcApAQCAtMTYsNDE0OCArMTYsMzg1NCBAQAogI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQogI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCiAjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KLXN0YXRpYyBGWF9BUkdCCVhGQV9XU3RyaW5nVG9Db2xvcihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUpDQotew0KLSAgICB1aW50OF90IHIgPSAwLCBnID0gMCwgYiA9IDA7DQotICAgIGlmICh3c1ZhbHVlLkdldExlbmd0aCgpID09IDApIHsNCi0gICAgICAgIHJldHVybiAweGZmMDAwMDAwOw0KK3N0YXRpYyBGWF9BUkdCIFhGQV9XU3RyaW5nVG9Db2xvcihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUpIHsNCisgIHVpbnQ4X3QgciA9IDAsIGcgPSAwLCBiID0gMDsNCisgIGlmICh3c1ZhbHVlLkdldExlbmd0aCgpID09IDApIHsNCisgICAgcmV0dXJuIDB4ZmYwMDAwMDA7DQorICB9DQorICBpbnQgY2MgPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IHdzVmFsdWUuR2V0UHRyKCk7DQorICBpbnQgbGVuID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCisgIHdoaWxlIChYRkFfSXNTcGFjZShzdHJbY2NdKSAmJiBjYyA8IGxlbikgew0KKyAgICBjYysrOw0KKyAgfQ0KKyAgaWYgKGNjID49IGxlbikgew0KKyAgICByZXR1cm4gMHhmZjAwMDAwMDsNCisgIH0NCisgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICBpZiAoc3RyW2NjXSA9PSAnLCcgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaW50IGNjID0gMDsNCi0gICAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IHdzVmFsdWUuR2V0UHRyKCk7DQotICAgIGludCBsZW4gPSB3c1ZhbHVlLkdldExlbmd0aCgpOw0KKyAgICByID0gciAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgY2MrKzsNCisgIH0NCisgIGlmIChjYyA8IGxlbiAmJiBzdHJbY2NdID09ICcsJykgew0KKyAgICBjYysrOw0KICAgICB3aGlsZSAoWEZBX0lzU3BhY2Uoc3RyW2NjXSkgJiYgY2MgPCBsZW4pIHsNCi0gICAgICAgIGNjKys7DQotICAgIH0NCi0gICAgaWYgKGNjID49IGxlbikgew0KLSAgICAgICAgcmV0dXJuIDB4ZmYwMDAwMDA7DQorICAgICAgY2MrKzsNCiAgICAgfQ0KICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCi0gICAgICAgIGlmIChzdHJbY2NdID09ICcsJyB8fCAhWEZBX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIHIgPSByICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KLSAgICAgICAgY2MgKys7DQorICAgICAgaWYgKHN0cltjY10gPT0gJywnIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGcgPSBnICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgIGNjKys7DQogICAgIH0NCiAgICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJywnKSB7DQotICAgICAgICBjYyArKzsNCi0gICAgICAgIHdoaWxlIChYRkFfSXNTcGFjZShzdHJbY2NdKSAmJiBjYyA8IGxlbikgew0KLSAgICAgICAgICAgIGNjKys7DQorICAgICAgY2MrKzsNCisgICAgICB3aGlsZSAoWEZBX0lzU3BhY2Uoc3RyW2NjXSkgJiYgY2MgPCBsZW4pIHsNCisgICAgICAgIGNjKys7DQorICAgICAgfQ0KKyAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgaWYgKHN0cltjY10gPT0gJywnIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCi0gICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcsJyB8fCAhWEZBX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGcgPSBnICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KLSAgICAgICAgICAgIGNjICsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJywnKSB7DQotICAgICAgICAgICAgY2MgKys7DQotICAgICAgICAgICAgd2hpbGUgKFhGQV9Jc1NwYWNlKHN0cltjY10pICYmIGNjIDwgbGVuKSB7DQotICAgICAgICAgICAgICAgIGNjKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KLSAgICAgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLCcgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBiID0gYiAqIDEwICsgc3RyW2NjXSAtICcwJzsNCi0gICAgICAgICAgICAgICAgY2MgKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgICAgICAgYiA9IGIgKiAxMCArIHN0cltjY10gLSAnMCc7DQorICAgICAgICBjYysrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICByZXR1cm4gKDB4ZmYgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOw0KKyAgfQ0KKyAgcmV0dXJuICgweGZmIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsNCiB9DQotWEZBX0VMRU1FTlQgQ1hGQV9EYXRhOjpHZXRDbGFzc0lEKCkgY29uc3QNCi17DQotICAgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2xhc3NJRCgpIDogWEZBX0VMRU1FTlRfVU5LTk9XTjsNCitYRkFfRUxFTUVOVCBDWEZBX0RhdGE6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldENsYXNzSUQoKSA6IFhGQV9FTEVNRU5UX1VOS05PV047DQogfQ0KLUZYX0JPT0wgQ1hGQV9EYXRhOjpUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0ZMT0FUICZmVmFsdWUsIEZYX0JPT0wgYlVzZURlZmF1bHQgKSBjb25zdA0KLXsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCi0gICAgaWYgKG1fcE5vZGUtPlRyeU1lYXN1cmUoZUF0dHIsIG1zLCBiVXNlRGVmYXVsdCkpIHsNCi0gICAgICAgIGZWYWx1ZSA9IG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENYRkFfRGF0YTo6VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlRGVmYXVsdCkgY29uc3Qgew0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgIGlmIChtX3BOb2RlLT5UcnlNZWFzdXJlKGVBdHRyLCBtcywgYlVzZURlZmF1bHQpKSB7DQorICAgIGZWYWx1ZSA9IG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRGF0YTo6U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9GTE9BVCBmVmFsdWUpIHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXMoZlZhbHVlLCBYRkFfVU5JVF9QdCk7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShlQXR0ciwgbXMpOw0KK30NCitDWEZBX0ZpbGw6OkNYRkFfRmlsbChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCitDWEZBX0ZpbGw6On5DWEZBX0ZpbGwoKSB7fQ0KK2ludDMyX3QgQ1hGQV9GaWxsOjpHZXRQcmVzZW5jZSgpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UpOw0KK30NCit2b2lkIENYRkFfRmlsbDo6U2V0Q29sb3IoRlhfQVJHQiBjb2xvcikgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NvbG9yKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29sb3I7DQorICBpbnQgYSwgciwgZywgYjsNCisgIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHIsIGcsIGIpOw0KKyAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KKyAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOw0KK30NCitGWF9BUkdCIENYRkFfRmlsbDo6R2V0Q29sb3IoRlhfQk9PTCBiVGV4dCkgew0KKyAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db2xvcikpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29sb3I7DQorICAgIGlmIChwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvciwgRkFMU0UpKSB7DQorICAgICAgcmV0dXJuIFhGQV9XU3RyaW5nVG9Db2xvcih3c0NvbG9yKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ1hGQV9EYXRhOjpTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0ZMT0FUIGZWYWx1ZSkNCi17DQotICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoZlZhbHVlLCBYRkFfVU5JVF9QdCk7DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKGVBdHRyLCBtcyk7DQotfQ0KLUNYRkFfRmlsbDo6Q1hGQV9GaWxsKENYRkFfTm9kZSogcE5vZGUpDQotICAgIDogQ1hGQV9EYXRhKHBOb2RlKQ0KLXsNCi19DQotQ1hGQV9GaWxsOjp+Q1hGQV9GaWxsKCkNCi17DQotfQ0KLWludDMyX3QgQ1hGQV9GaWxsOjpHZXRQcmVzZW5jZSgpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsNCi19DQotdm9pZCBDWEZBX0ZpbGw6OlNldENvbG9yKEZYX0FSR0IgY29sb3IpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ29sb3IpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NvbG9yOw0KLSAgICBpbnQgYSwgciwgZywgYjsNCi0gICAgQXJnYkRlY29kZShjb2xvciwgYSwgciwgZywgYik7DQotICAgIHdzQ29sb3IuRm9ybWF0KEwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCi0gICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOw0KLX0NCi1GWF9BUkdCCUNYRkFfRmlsbDo6R2V0Q29sb3IoRlhfQk9PTCBiVGV4dCkNCi17DQotICAgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29sb3IpKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2xvcjsNCi0gICAgICAgIGlmIChwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvciwgRkFMU0UpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFhGQV9XU3RyaW5nVG9Db2xvcih3c0NvbG9yKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoYlRleHQpIHsNCi0gICAgICAgIHJldHVybiAweEZGMDAwMDAwOw0KLSAgICB9DQotICAgIHJldHVybiAweEZGRkZGRkZGOw0KLX0NCi1pbnQzMl90IENYRkFfRmlsbDo6R2V0RmlsbFR5cGUoKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgIHdoaWxlIChwQ2hpbGQpIHsNCi0gICAgICAgIGludDMyX3QgZVR5cGUgPSBwQ2hpbGQtPkdldENsYXNzSUQoKTsNCi0gICAgICAgIGlmIChlVHlwZSAhPSBYRkFfRUxFTUVOVF9Db2xvciAmJiBlVHlwZSAhPSBYRkFfRUxFTUVOVF9FeHRyYXMpIHsNCi0gICAgICAgICAgICByZXR1cm4gZVR5cGU7DQotICAgICAgICB9DQotICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgIH0NCi0gICAgcmV0dXJuIFhGQV9FTEVNRU5UX1NvbGlkOw0KLX0NCi1pbnQzMl90IENYRkFfRmlsbDo6R2V0UGF0dGVybihGWF9BUkdCJiBmb3JlQ29sb3IpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfUGF0dGVybik7DQotICAgIGlmIChDWEZBX05vZGUqIHBDb2xvciA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db2xvcikpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0NvbG9yOw0KLSAgICAgICAgcENvbG9yLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yLCBGQUxTRSk7DQotICAgICAgICBmb3JlQ29sb3IgPSBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBmb3JlQ29sb3IgPSAweEZGMDAwMDAwOw0KLSAgICB9DQotICAgIHJldHVybiBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1R5cGUpOw0KLX0NCi1pbnQzMl90IENYRkFfRmlsbDo6R2V0U3RpcHBsZShGWF9BUkdCJiBzdGlwcGxlQ29sb3IpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU3RpcHBsZSk7DQotICAgIGludDMyX3QgZUF0dHIgPSA1MDsNCi0gICAgcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9SYXRlLCBlQXR0cik7DQotICAgIGlmIChDWEZBX05vZGUqIHBDb2xvciA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db2xvcikpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0NvbG9yOw0KLSAgICAgICAgcENvbG9yLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yLCBGQUxTRSk7DQotICAgICAgICBzdGlwcGxlQ29sb3IgPSBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBzdGlwcGxlQ29sb3IgPSAweEZGMDAwMDAwOw0KLSAgICB9DQotICAgIHJldHVybiBlQXR0cjsNCi19DQotaW50MzJfdCBDWEZBX0ZpbGw6OkdldExpbmVhcihGWF9BUkdCJiBlbmRDb2xvcikNCi17DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9MaW5lYXIpOw0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvUmlnaHQ7DQotICAgIHBOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfVHlwZSwgZUF0dHIpOw0KLSAgICBpZiAoQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29sb3IpKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2xvcjsNCi0gICAgICAgIHBDb2xvci0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvciwgRkFMU0UpOw0KLSAgICAgICAgZW5kQ29sb3IgPSBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBlbmRDb2xvciA9IDB4RkYwMDAwMDA7DQotICAgIH0NCi0gICAgcmV0dXJuIGVBdHRyOw0KLX0NCi1pbnQzMl90IENYRkFfRmlsbDo6R2V0UmFkaWFsKEZYX0FSR0ImIGVuZENvbG9yKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1JhZGlhbCk7DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fVG9FZGdlOw0KLSAgICBwTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1R5cGUsIGVBdHRyKTsNCi0gICAgaWYgKENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0NvbG9yKSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29sb3I7DQotICAgICAgICBwQ29sb3ItPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IsIEZBTFNFKTsNCi0gICAgICAgIGVuZENvbG9yID0gWEZBX1dTdHJpbmdUb0NvbG9yKHdzQ29sb3IpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgZW5kQ29sb3IgPSAweEZGMDAwMDAwOw0KLSAgICB9DQotICAgIHJldHVybiBlQXR0cjsNCi19DQotRlhfQk9PTCBDWEZBX0ZpbGw6OlNldFByZXNlbmNlKGludDMyX3QgaVByZXNlbmNlKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlQcmVzZW5jZSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GaWxsOjpTZXRGaWxsVHlwZShpbnQzMl90IGlUeXBlKQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfRmlsbDo6U2V0UGF0dGVybihpbnQzMl90IGlQYXR0ZXJuLCBGWF9BUkdCIGZvcmVDb2xvcikNCi17DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9QYXR0ZXJuKTsNCi0gICAgQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ29sb3IpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NvbG9yOw0KLSAgICBpbnQgYSwgciwgZywgYjsNCi0gICAgQXJnYkRlY29kZShmb3JlQ29sb3IsIGEsIHIsIGcsIGIpOw0KLSAgICB3c0NvbG9yLkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYik7DQotICAgIHBDb2xvci0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvcik7DQotICAgIHJldHVybiBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1R5cGUsIChYRkFfQVRUUklCVVRFRU5VTSlpUGF0dGVybik7DQotfQ0KLUZYX0JPT0wgQ1hGQV9GaWxsOjpTZXRTdGlwcGxlKGludDMyX3QgaVN0aXBwbGUsIEZYX0FSR0Igc3RpcHBsZUNvbG9yKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1N0aXBwbGUpOw0KLSAgICBDWEZBX05vZGUqIHBDb2xvciA9IHBOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Db2xvcik7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQ29sb3I7DQotICAgIGludCBhLCByLCBnLCBiOw0KLSAgICBBcmdiRGVjb2RlKHN0aXBwbGVDb2xvciwgYSwgciwgZywgYik7DQotICAgIHdzQ29sb3IuRm9ybWF0KEwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCi0gICAgcENvbG9yLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCi0gICAgcmV0dXJuIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfUmF0ZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlTdGlwcGxlKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZpbGw6OlNldExpbmVhcihpbnQzMl90IGlMaW5lYXIsIEZYX0FSR0IgZW5kQ29sb3IpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTGluZWFyKTsNCi0gICAgQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ29sb3IpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NvbG9yOw0KLSAgICBpbnQgYSwgciwgZywgYjsNCi0gICAgQXJnYkRlY29kZShlbmRDb2xvciwgYSwgciwgZywgYik7DQotICAgIHdzQ29sb3IuRm9ybWF0KEwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCi0gICAgcENvbG9yLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCi0gICAgcmV0dXJuIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHlwZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlMaW5lYXIpOw0KLX0NCi1GWF9CT09MIENYRkFfRmlsbDo6U2V0UmFkaWFsKGludDMyX3QgaVJhZGlhbCwgRlhfQVJHQiBlbmRDb2xvcikNCi17DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9SYWRpYWwpOw0KLSAgICBDWEZBX05vZGUqIHBDb2xvciA9IHBOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Db2xvcik7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQ29sb3I7DQotICAgIGludCBhLCByLCBnLCBiOw0KLSAgICBBcmdiRGVjb2RlKGVuZENvbG9yLCBhLCByLCBnLCBiKTsNCi0gICAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KLSAgICBwQ29sb3ItPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOw0KLSAgICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9UeXBlLCAoWEZBX0FUVFJJQlVURUVOVU0paVJhZGlhbCk7DQotfQ0KLUNYRkFfTWFyZ2luOjpDWEZBX01hcmdpbihDWEZBX05vZGUqIHBOb2RlKQ0KLSAgICA6IENYRkFfRGF0YShwTm9kZSkNCi17DQotfQ0KLUZYX0JPT0wgQ1hGQV9NYXJnaW46OkdldExlZnRJbnNldChGWF9GTE9BVCAmZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQgKSBjb25zdA0KLXsNCi0gICAgZkluc2V0ID0gZkRlZkluc2V0Ow0KLSAgICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwgZkluc2V0KTsNCi19DQotRlhfQk9PTCBDWEZBX01hcmdpbjo6R2V0VG9wSW5zZXQoRlhfRkxPQVQgJmZJbnNldCwgRlhfRkxPQVQgZkRlZkluc2V0ICkgY29uc3QNCi17DQotICAgIGZJbnNldCA9IGZEZWZJbnNldDsNCi0gICAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgZkluc2V0KTsNCi19DQotRlhfQk9PTCBDWEZBX01hcmdpbjo6R2V0UmlnaHRJbnNldChGWF9GTE9BVCAmZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQgKSBjb25zdA0KLXsNCi0gICAgZkluc2V0ID0gZkRlZkluc2V0Ow0KLSAgICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQsIGZJbnNldCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9NYXJnaW46OkdldEJvdHRvbUluc2V0KEZYX0ZMT0FUICZmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCApIGNvbnN0DQotew0KLSAgICBmSW5zZXQgPSBmRGVmSW5zZXQ7DQotICAgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQsIGZJbnNldCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9NYXJnaW46OlNldExlZnRJbnNldChGWF9GTE9BVCBmSW5zZXQpDQotew0KLSAgICByZXR1cm4gU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwgZkluc2V0KTsNCi19DQotRlhfQk9PTCBDWEZBX01hcmdpbjo6U2V0VG9wSW5zZXQoRlhfRkxPQVQgZkluc2V0KQ0KLXsNCi0gICAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgZkluc2V0KTsNCi19DQotRlhfQk9PTCBDWEZBX01hcmdpbjo6U2V0UmlnaHRJbnNldChGWF9GTE9BVCBmSW5zZXQpDQotew0KLSAgICByZXR1cm4gU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQsIGZJbnNldCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9NYXJnaW46OlNldEJvdHRvbUluc2V0KEZYX0ZMT0FUIGZJbnNldCkNCi17DQotICAgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQsIGZJbnNldCk7DQotfQ0KLUNYRkFfRm9udDo6Q1hGQV9Gb250KENYRkFfTm9kZSogcE5vZGUpDQotICAgIDogQ1hGQV9EYXRhKHBOb2RlKQ0KLXsNCi19DQotRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRCYXNlbGluZVNoaWZ0KCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQmFzZWxpbmVTaGlmdCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi19DQotRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRIb3Jpem9udGFsU2NhbGUoKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCi0gICAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Gb250SG9yaXpvbnRhbFNjYWxlLCB3c1ZhbHVlKTsNCi0gICAgaW50MzJfdCBpU2NhbGUgPSBGWFNZU193dG9pKChjb25zdCBGWF9XQ0hBUiopd3NWYWx1ZSk7DQotICAgIHJldHVybiBpU2NhbGUgPiAwID8gKEZYX0ZMT0FUKWlTY2FsZSA6IDEwMC4wZjsNCi19DQotRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRWZXJ0aWNhbFNjYWxlKCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfRm9udFZlcnRpY2FsU2NhbGUsIHdzVmFsdWUpOw0KLSAgICBpbnQzMl90IGlTY2FsZSA9IEZYU1lTX3d0b2koKGNvbnN0IEZYX1dDSEFSKil3c1ZhbHVlKTsNCi0gICAgcmV0dXJuIGlTY2FsZSA+IDAgPyAoRlhfRkxPQVQpaVNjYWxlIDogMTAwLjBmOw0KLX0NCi1GWF9GTE9BVCBDWEZBX0ZvbnQ6OkdldExldHRlclNwYWNpbmcoKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWU7DQotICAgIGlmICghbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9MZXR0ZXJTcGFjaW5nLCB3c1ZhbHVlKSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtcyh3c1ZhbHVlKTsNCi0gICAgaWYgKG1zLkdldFVuaXQoKSA9PSBYRkFfVU5JVF9FbSkgew0KLSAgICAgICAgcmV0dXJuIG1zLkdldFZhbHVlKCkgKiBHZXRGb250U2l6ZSgpOw0KLSAgICB9DQotICAgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLX0NCi1pbnQzMl90IENYRkFfRm9udDo6R2V0TGluZVRocm91Z2goKQ0KLXsNCi0gICAgaW50MzJfdCBpVmFsdWUgPSAwOw0KLSAgICBtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2gsIGlWYWx1ZSk7DQotICAgIHJldHVybiBpVmFsdWU7DQotfQ0KLWludDMyX3QgQ1hGQV9Gb250OjpHZXRMaW5lVGhyb3VnaFBlcmlvZCgpDQotew0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsNCi0gICAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoUGVyaW9kLCBlQXR0cik7DQotICAgIHJldHVybiBlQXR0cjsNCi19DQotaW50MzJfdCBDWEZBX0ZvbnQ6OkdldE92ZXJsaW5lKCkNCi17DQotICAgIGludDMyX3QgaVZhbHVlID0gMDsNCi0gICAgbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX092ZXJsaW5lLCBpVmFsdWUpOw0KLSAgICByZXR1cm4gaVZhbHVlOw0KLX0NCi1pbnQzMl90IENYRkFfRm9udDo6R2V0T3ZlcmxpbmVQZXJpb2QoKQ0KLXsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9BbGw7DQotICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9PdmVybGluZVBlcmlvZCwgZUF0dHIpOw0KLSAgICByZXR1cm4gZUF0dHI7DQotfQ0KLWludDMyX3QgQ1hGQV9Gb250OjpHZXRVbmRlcmxpbmUoKQ0KLXsNCi0gICAgaW50MzJfdCBpVmFsdWUgPSAwOw0KLSAgICBtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lLCBpVmFsdWUpOw0KLSAgICByZXR1cm4gaVZhbHVlOw0KLX0NCi1pbnQzMl90IENYRkFfRm9udDo6R2V0VW5kZXJsaW5lUGVyaW9kKCkNCi17DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fQWxsOw0KLSAgICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lUGVyaW9kLCBlQXR0cik7DQotICAgIHJldHVybiBlQXR0cjsNCi19DQotRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRGb250U2l6ZSgpDQotew0KLSAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KLSAgICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2l6ZSwgbXMpOw0KLSAgICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi19DQotdm9pZCBDWEZBX0ZvbnQ6OkdldFR5cGVmYWNlKENGWF9XaWRlU3RyaW5nQyAmd3NUeXBlRmFjZSkNCi17DQotICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsIHdzVHlwZUZhY2UpOw0KLX0NCi1GWF9CT09MIENYRkFfRm9udDo6SXNCb2xkKCkNCi17DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fTm9ybWFsOw0KLSAgICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfV2VpZ2h0LCBlQXR0cik7DQotICAgIHJldHVybiBlQXR0ciA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb2xkOw0KLX0NCi1GWF9CT09MIENYRkFfRm9udDo6SXNJdGFsaWMoKQ0KLXsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob3JtYWw7DQotICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9Qb3N0dXJlLCBlQXR0cik7DQotICAgIHJldHVybiBlQXR0ciA9PSBYRkFfQVRUUklCVVRFRU5VTV9JdGFsaWM7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Gb250OjpJc1VzZUtlcm5pbmcoKQ0KLXsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KLSAgICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsIGVBdHRyKTsNCi0gICAgcmV0dXJuIGVBdHRyID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhaXI7DQotfQ0KLXZvaWQgQ1hGQV9Gb250OjpTZXRDb2xvcihGWF9BUkdCIGNvbG9yKQ0KLXsNCi0gICAgQ1hGQV9GaWxsIGZpbGwgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9GaWxsKTsNCi0gICAgZmlsbC5TZXRDb2xvcihjb2xvcik7DQotfQ0KLUZYX0FSR0IgQ1hGQV9Gb250OjpHZXRDb2xvcigpDQotew0KLSAgICBpZiAoQ1hGQV9GaWxsIGZpbGwgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9GaWxsKSkgew0KLSAgICAgICAgcmV0dXJuIGZpbGwuR2V0Q29sb3IoVFJVRSk7DQotICAgIH0NCisgIH0NCisgIGlmIChiVGV4dCkgew0KICAgICByZXR1cm4gMHhGRjAwMDAwMDsNCisgIH0NCisgIHJldHVybiAweEZGRkZGRkZGOw0KIH0NCi1GWF9CT09MIENYRkFfRm9udDo6U2V0QmFzZWxpbmVTaGlmdChGWF9GTE9BVCBmQmFzZWxpbmVTaGlmdCkNCi17DQotICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoZkJhc2VsaW5lU2hpZnQsIFhGQV9VTklUX1B0KTsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9CYXNlbGluZVNoaWZ0LCBtcyk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Gb250OjpTZXRIb3Jpem9udGFsU2NhbGUoRlhfRkxPQVQgZkhvcml6b250YWxTY2FsZSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgIHdzVmFsdWUuRm9ybWF0KEwiJWQiLCAoaW50MzJfdClmSG9yaXpvbnRhbFNjYWxlKTsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwgd3NWYWx1ZSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Gb250OjpTZXRWZXJ0aWNhbFNjYWxlKEZYX0ZMT0FUIGZWZXJ0aWNhbFNjYWxlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCi0gICAgd3NWYWx1ZS5Gb3JtYXQoTCIlZCIsIChpbnQzMl90KWZWZXJ0aWNhbFNjYWxlKTsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfRm9udFZlcnRpY2FsU2NhbGUsIHdzVmFsdWUpOw0KLX0NCi1GWF9CT09MIENYRkFfRm9udDo6U2V0TGV0dGVyU3BhY2luZyhGWF9GTE9BVCBmTGV0dGVyU3BhY2luZywgWEZBX1VOSVQgZVVuaXQpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Gb250OjpTZXRMaW5lVGhyb3VnaChpbnQzMl90IGlMaW5lVGhyb3VnaCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2gsIGlMaW5lVGhyb3VnaCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Gb250OjpTZXRMaW5lVGhyb3VnaFBlcmlvZChpbnQzMl90IGlMaW5lVGhyb3VnaFBlcmlvZCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2hQZXJpb2QsIChYRkFfQVRUUklCVVRFRU5VTSlpTGluZVRocm91Z2hQZXJpb2QpOw0KLX0NCi1GWF9CT09MIENYRkFfRm9udDo6U2V0T3ZlcmxpbmUoaW50MzJfdCBpT3ZlcmxpbmUpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX092ZXJsaW5lLCBpT3ZlcmxpbmUpOw0KLX0NCi1GWF9CT09MIENYRkFfRm9udDo6U2V0T3ZlcmxpbmVQZXJpb2QoaW50MzJfdCBpT3ZlcmxpbmVQZXJpb2QpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX092ZXJsaW5lUGVyaW9kLCAoWEZBX0FUVFJJQlVURUVOVU0paU92ZXJsaW5lUGVyaW9kKTsNCi19DQotRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldFVuZGVybGluZShpbnQzMl90IGlVbmRlcmxpbmUpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX1VuZGVybGluZSwgaVVuZGVybGluZSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Gb250OjpTZXRVbmRlcmxpbmVQZXJpb2QoaW50MzJfdCBpVW5kZXJsaW5lUGVyaW9kKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsIChYRkFfQVRUUklCVVRFRU5VTSlpVW5kZXJsaW5lUGVyaW9kKTsNCi19DQotQ1hGQV9DYXB0aW9uOjpDWEZBX0NhcHRpb24oQ1hGQV9Ob2RlKiBwTm9kZSkNCi0gICAgOiBDWEZBX0RhdGEocE5vZGUpDQotew0KLX0NCi1pbnQzMl90IENYRkFfQ2FwdGlvbjo6R2V0UHJlc2VuY2UoKQ0KLXsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlOw0KLSAgICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIGVBdHRyKTsNCi0gICAgcmV0dXJuIGVBdHRyOw0KLX0NCi1pbnQzMl90IENYRkFfQ2FwdGlvbjo6R2V0UGxhY2VtZW50VHlwZSgpDQotew0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ7DQotICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9QbGFjZW1lbnQsIGVBdHRyKTsNCi0gICAgcmV0dXJuIGVBdHRyOw0KLX0NCi1GWF9GTE9BVCBDWEZBX0NhcHRpb246OkdldFJlc2VydmUoKQ0KLXsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCi0gICAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1Jlc2VydmUsIG1zKTsNCi0gICAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotfQ0KLUNYRkFfTWFyZ2luIENYRkFfQ2FwdGlvbjo6R2V0TWFyZ2luKCkNCi17DQotICAgIHJldHVybiBDWEZBX01hcmdpbihtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWFyZ2luKSA6IE5VTEwpOw0KLX0NCi1DWEZBX0ZvbnQgQ1hGQV9DYXB0aW9uOjpHZXRGb250KCkNCi17DQotICAgIHJldHVybiBDWEZBX0ZvbnQobV9wTm9kZSA/IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0ZvbnQpIDogTlVMTCk7DQotfQ0KLUNYRkFfVmFsdWUgQ1hGQV9DYXB0aW9uOjpHZXRWYWx1ZSgpDQotew0KLSAgICByZXR1cm4gQ1hGQV9WYWx1ZShtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpIDogTlVMTCk7DQotfQ0KLUNYRkFfUGFyYSBDWEZBX0NhcHRpb246OkdldFBhcmEoKQ0KLXsNCi0gICAgcmV0dXJuIENYRkFfUGFyYShtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGFyYSkgOiBOVUxMKTsNCi19DQotRlhfQk9PTCBDWEZBX0NhcHRpb246OlNldFByZXNlbmNlKGludDMyX3QgaVByZXNlbmNlKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlQcmVzZW5jZSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9DYXB0aW9uOjpTZXRQbGFjZW1lbnRUeXBlKGludDMyX3QgaVR5cGUpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlUeXBlKTsNCi19DQotRlhfQk9PTCBDWEZBX0NhcHRpb246OlNldFJlc2VydmUoRlhfRkxPQVQgZlJlc2VydmUpDQotew0KLSAgICBDWEZBX01lYXN1cmVtZW50IG1zKGZSZXNlcnZlLCBYRkFfVU5JVF9QdCk7DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmVzZXJ2ZSwgbXMpOw0KLX0NCi1DWEZBX1BhcmE6OkNYRkFfUGFyYShDWEZBX05vZGUqIHBOb2RlKQ0KLSAgICA6IENYRkFfRGF0YShwTm9kZSkNCi17DQotfQ0KLWludDMyX3QgQ1hGQV9QYXJhOjpHZXRIb3Jpem9udGFsQWxpZ24oKQ0KLXsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Ow0KLSAgICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduLCBlQXR0cik7DQotICAgIHJldHVybiBlQXR0cjsNCi19DQotaW50MzJfdCBDWEZBX1BhcmE6OkdldFZlcnRpY2FsQWxpZ24oKQ0KLXsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A7DQotICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9WQWxpZ24sIGVBdHRyKTsNCi0gICAgcmV0dXJuIGVBdHRyOw0KLX0NCi1GWF9GTE9BVCBDWEZBX1BhcmE6OkdldExpbmVIZWlnaHQoKQ0KLXsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCi0gICAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsIG1zKTsNCi0gICAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotfQ0KLUZYX0ZMT0FUIENYRkFfUGFyYTo6R2V0TWFyZ2luTGVmdCgpDQotew0KLSAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KLSAgICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWFyZ2luTGVmdCwgbXMpOw0KLSAgICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi19DQotRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRNYXJnaW5SaWdodCgpDQotew0KLSAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KLSAgICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWFyZ2luUmlnaHQsIG1zKTsNCi0gICAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotfQ0KLWludDMyX3QgQ1hGQV9QYXJhOjpHZXRPcnBoYW5zKCkNCi17DQotICAgIGludDMyX3QgaVZhbHVlID0gMDsNCi0gICAgbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX09ycGhhbnMsIGlWYWx1ZSk7DQotICAgIHJldHVybiBpVmFsdWU7DQotfQ0KLUZYX0ZMT0FUIENYRkFfUGFyYTo6R2V0UmFkaXhPZmZzZXQoKQ0KLXsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCi0gICAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1JhZGl4T2Zmc2V0LCBtcyk7DQotICAgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLX0NCi1GWF9GTE9BVCBDWEZBX1BhcmE6OkdldFNwYWNlQWJvdmUoKQ0KLXsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCi0gICAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1NwYWNlQWJvdmUsIG1zKTsNCi0gICAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQotfQ0KLUZYX0ZMT0FUIENYRkFfUGFyYTo6R2V0U3BhY2VCZWxvdygpDQotew0KLSAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KLSAgICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU3BhY2VCZWxvdywgbXMpOw0KLSAgICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi19DQotRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRUZXh0SW5kZW50KCkNCi17DQotICAgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQotICAgIG1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9UZXh0SW5kZW50LCBtcyk7DQotICAgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KLX0NCi1pbnQzMl90IENYRkFfUGFyYTo6R2V0V2lkb3dzKCkNCi17DQotICAgIGludDMyX3QgaVZhbHVlID0gMDsNCi0gICAgbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX1dpZG93cywgaVZhbHVlKTsNCi0gICAgcmV0dXJuIGlWYWx1ZTsNCi19DQotRlhfQk9PTCBDWEZBX1BhcmE6OlNldEhvcml6b250YWxBbGlnbihpbnQzMl90IGlIb3Jpem9udGFsQWxpZ24pDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbiwgKFhGQV9BVFRSSUJVVEVFTlVNKWlIb3Jpem9udGFsQWxpZ24pOw0KLX0NCi1GWF9CT09MIENYRkFfUGFyYTo6U2V0VmVydGljYWxBbGlnbihpbnQzMl90IGlWZXJ0aWNhbEFsaWduKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9WQWxpZ24sIChYRkFfQVRUUklCVVRFRU5VTSlpVmVydGljYWxBbGlnbik7DQotfQ0KLUZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRMaW5lSGVpZ2h0KEZYX0ZMT0FUIGZMaW5lSGVpZ2h0KQ0KLXsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MaW5lSGVpZ2h0LCBtcyk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRNYXJnaW5MZWZ0KEZYX0ZMT0FUIGZNYXJnaW5MZWZ0KQ0KLXsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmTWFyZ2luTGVmdCwgWEZBX1VOSVRfUHQpOw0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX01hcmdpbkxlZnQsIG1zKTsNCi19DQotRlhfQk9PTCBDWEZBX1BhcmE6OlNldE1hcmdpblJpZ2h0KEZYX0ZMT0FUIGZNYXJnaW5SaWdodCkNCi17DQotICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoZk1hcmdpblJpZ2h0LCBYRkFfVU5JVF9QdCk7DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWFyZ2luUmlnaHQsIG1zKTsNCi19DQotRlhfQk9PTCBDWEZBX1BhcmE6OlNldE9ycGhhbnMoaW50MzJfdCBpT3JwaGFucykNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfT3JwaGFucywgaU9ycGhhbnMpOw0KLX0NCi1GWF9CT09MIENYRkFfUGFyYTo6U2V0UmFkaXhPZmZzZXQoRlhfRkxPQVQgZlJhZGl4T2Zmc2V0KQ0KLXsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmUmFkaXhPZmZzZXQsIFhGQV9VTklUX1B0KTsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwgbXMpOw0KLX0NCi1GWF9CT09MIENYRkFfUGFyYTo6U2V0U3BhY2VBYm92ZShGWF9GTE9BVCBmU3BhY2VBYm92ZSkNCi17DQotICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoZlNwYWNlQWJvdmUsIFhGQV9VTklUX1B0KTsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9TcGFjZUFib3ZlLCBtcyk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRTcGFjZUJlbG93KEZYX0ZMT0FUIGZTcGFjZUJlbG93KQ0KLXsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmU3BhY2VCZWxvdywgWEZBX1VOSVRfUHQpOw0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csIG1zKTsNCi19DQotRlhfQk9PTCBDWEZBX1BhcmE6OlNldFRleHRJbmRlbnQoRlhfRkxPQVQgZlRleHRJbmRlbnQpDQotew0KLSAgICBDWEZBX01lYXN1cmVtZW50IG1zKGZUZXh0SW5kZW50LCBYRkFfVU5JVF9QdCk7DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVGV4dEluZGVudCwgbXMpOw0KLX0NCi1GWF9CT09MIENYRkFfUGFyYTo6U2V0V2lkb3dzKGludDMyX3QgaVdpZG93cykNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfV2lkb3dzLCBpV2lkb3dzKTsNCi19DQotQ1hGQV9LZWVwOjpDWEZBX0tlZXAoQ1hGQV9Ob2RlICpwTm9kZSwgQ1hGQV9Ob2RlICpwUGFyZW50KQ0KLSAgICA6IENYRkFfRGF0YShwTm9kZSkNCi0gICAgLCBtX3BQYXJlbnQocFBhcmVudCkNCi17DQotfQ0KLWludDMyX3QgQ1hGQV9LZWVwOjpHZXRJbnRhY3QoKQ0KLXsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KLSAgICBzd2l0Y2ggKG1fcFBhcmVudC0+R2V0Q2xhc3NJRCgpKSB7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06IHsNCi0gICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHJTdWJGb3JtOw0KLSAgICAgICAgICAgICAgICBtX3BQYXJlbnQtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQsIGVBdHRyU3ViRm9ybSk7DQotICAgICAgICAgICAgICAgIGlmIChlQXR0clN1YkZvcm0gPT0gWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24gfHwgZUF0dHJTdWJGb3JtID09IFhGQV9BVFRSSUJVVEVFTlVNX1Jvdykgew0KLSAgICAgICAgICAgICAgICAgICAgZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCi0gICAgICAgICAgICBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCitpbnQzMl90IENYRkFfRmlsbDo6R2V0RmlsbFR5cGUoKSB7DQorICBDWEZBX05vZGUqIHBDaGlsZCA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgaW50MzJfdCBlVHlwZSA9IHBDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoZVR5cGUgIT0gWEZBX0VMRU1FTlRfQ29sb3IgJiYgZVR5cGUgIT0gWEZBX0VMRU1FTlRfRXh0cmFzKSB7DQorICAgICAgcmV0dXJuIGVUeXBlOw0KICAgICB9DQotICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9JbnRhY3QsIGVBdHRyLCBGQUxTRSk7DQotICAgIHJldHVybiBlQXR0cjsNCisgICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9FTEVNRU5UX1NvbGlkOw0KIH0NCi1pbnQzMl90IENYRkFfS2VlcDo6R2V0TmV4dCgpDQotew0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQotICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9OZXh0LCBlQXR0cik7DQotICAgIHJldHVybiBlQXR0cjsNCitpbnQzMl90IENYRkFfRmlsbDo6R2V0UGF0dGVybihGWF9BUkdCJiBmb3JlQ29sb3IpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9QYXR0ZXJuKTsNCisgIGlmIChDWEZBX05vZGUqIHBDb2xvciA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db2xvcikpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29sb3I7DQorICAgIHBDb2xvci0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvciwgRkFMU0UpOw0KKyAgICBmb3JlQ29sb3IgPSBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQorICB9IGVsc2Ugew0KKyAgICBmb3JlQ29sb3IgPSAweEZGMDAwMDAwOw0KKyAgfQ0KKyAgcmV0dXJuIHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHlwZSk7DQogfQ0KLWludDMyX3QgQ1hGQV9LZWVwOjpHZXRQcmV2aW91cygpDQotew0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQotICAgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9QcmV2aW91cywgZUF0dHIpOw0KLSAgICByZXR1cm4gZUF0dHI7DQoraW50MzJfdCBDWEZBX0ZpbGw6OkdldFN0aXBwbGUoRlhfQVJHQiYgc3RpcHBsZUNvbG9yKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU3RpcHBsZSk7DQorICBpbnQzMl90IGVBdHRyID0gNTA7DQorICBwTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX1JhdGUsIGVBdHRyKTsNCisgIGlmIChDWEZBX05vZGUqIHBDb2xvciA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db2xvcikpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29sb3I7DQorICAgIHBDb2xvci0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvciwgRkFMU0UpOw0KKyAgICBzdGlwcGxlQ29sb3IgPSBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQorICB9IGVsc2Ugew0KKyAgICBzdGlwcGxlQ29sb3IgPSAweEZGMDAwMDAwOw0KKyAgfQ0KKyAgcmV0dXJuIGVBdHRyOw0KIH0NCi1GWF9CT09MIENYRkFfS2VlcDo6U2V0SW50YWN0KGludDMyX3QgaUludGFjdCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfSW50YWN0LCAoWEZBX0FUVFJJQlVURUVOVU0paUludGFjdCk7DQoraW50MzJfdCBDWEZBX0ZpbGw6OkdldExpbmVhcihGWF9BUkdCJiBlbmRDb2xvcikgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0xpbmVhcik7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvUmlnaHQ7DQorICBwTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1R5cGUsIGVBdHRyKTsNCisgIGlmIChDWEZBX05vZGUqIHBDb2xvciA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db2xvcikpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29sb3I7DQorICAgIHBDb2xvci0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvciwgRkFMU0UpOw0KKyAgICBlbmRDb2xvciA9IFhGQV9XU3RyaW5nVG9Db2xvcih3c0NvbG9yKTsNCisgIH0gZWxzZSB7DQorICAgIGVuZENvbG9yID0gMHhGRjAwMDAwMDsNCisgIH0NCisgIHJldHVybiBlQXR0cjsNCiB9DQotRlhfQk9PTCBDWEZBX0tlZXA6OlNldE5leHQoaW50MzJfdCBpTmV4dCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfTmV4dCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlOZXh0KTsNCitpbnQzMl90IENYRkFfRmlsbDo6R2V0UmFkaWFsKEZYX0FSR0ImIGVuZENvbG9yKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfUmFkaWFsKTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fVG9FZGdlOw0KKyAgcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9UeXBlLCBlQXR0cik7DQorICBpZiAoQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29sb3IpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0NvbG9yOw0KKyAgICBwQ29sb3ItPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IsIEZBTFNFKTsNCisgICAgZW5kQ29sb3IgPSBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQorICB9IGVsc2Ugew0KKyAgICBlbmRDb2xvciA9IDB4RkYwMDAwMDA7DQorICB9DQorICByZXR1cm4gZUF0dHI7DQogfQ0KLUZYX0JPT0wgQ1hGQV9LZWVwOjpTZXRQcmV2aW91cyhpbnQzMl90IGlQcmV2aW91cykNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJldmlvdXMsIChYRkFfQVRUUklCVVRFRU5VTSlpUHJldmlvdXMpOw0KK0ZYX0JPT0wgQ1hGQV9GaWxsOjpTZXRQcmVzZW5jZShpbnQzMl90IGlQcmVzZW5jZSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlQcmVzZW5jZSk7DQogfQ0KLUNYRkFfRXZlbnQ6OkNYRkFfRXZlbnQoQ1hGQV9Ob2RlKiBwTm9kZSkNCi0gICAgOiBDWEZBX0RhdGEocE5vZGUpDQotew0KK0ZYX0JPT0wgQ1hGQV9GaWxsOjpTZXRGaWxsVHlwZShpbnQzMl90IGlUeXBlKSB7DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLWludDMyX3QgQ1hGQV9FdmVudDo6R2V0QWN0aXZpdHkoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BY3Rpdml0eSk7DQorRlhfQk9PTCBDWEZBX0ZpbGw6OlNldFBhdHRlcm4oaW50MzJfdCBpUGF0dGVybiwgRlhfQVJHQiBmb3JlQ29sb3IpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9QYXR0ZXJuKTsNCisgIENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NvbG9yKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29sb3I7DQorICBpbnQgYSwgciwgZywgYjsNCisgIEFyZ2JEZWNvZGUoZm9yZUNvbG9yLCBhLCByLCBnLCBiKTsNCisgIHdzQ29sb3IuRm9ybWF0KEwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCisgIHBDb2xvci0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvcik7DQorICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9UeXBlLCAoWEZBX0FUVFJJQlVURUVOVU0paVBhdHRlcm4pOw0KIH0NCi1pbnQzMl90IENYRkFfRXZlbnQ6OkdldEV2ZW50VHlwZSgpDQotew0KLSAgICBDWEZBX05vZGUqIHBDaGlsZCA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgd2hpbGUgKHBDaGlsZCkgew0KLSAgICAgICAgaW50MzJfdCBlVHlwZSA9IHBDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KLSAgICAgICAgaWYgKGVUeXBlICE9IFhGQV9FTEVNRU5UX0V4dHJhcykgew0KLSAgICAgICAgICAgIHJldHVybiBlVHlwZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCitGWF9CT09MIENYRkFfRmlsbDo6U2V0U3RpcHBsZShpbnQzMl90IGlTdGlwcGxlLCBGWF9BUkdCIHN0aXBwbGVDb2xvcikgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1N0aXBwbGUpOw0KKyAgQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ29sb3IpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCisgIGludCBhLCByLCBnLCBiOw0KKyAgQXJnYkRlY29kZShzdGlwcGxlQ29sb3IsIGEsIHIsIGcsIGIpOw0KKyAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KKyAgcENvbG9yLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCisgIHJldHVybiBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1JhdGUsIChYRkFfQVRUUklCVVRFRU5VTSlpU3RpcHBsZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GaWxsOjpTZXRMaW5lYXIoaW50MzJfdCBpTGluZWFyLCBGWF9BUkdCIGVuZENvbG9yKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTGluZWFyKTsNCisgIENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NvbG9yKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29sb3I7DQorICBpbnQgYSwgciwgZywgYjsNCisgIEFyZ2JEZWNvZGUoZW5kQ29sb3IsIGEsIHIsIGcsIGIpOw0KKyAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KKyAgcENvbG9yLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCisgIHJldHVybiBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1R5cGUsIChYRkFfQVRUUklCVVRFRU5VTSlpTGluZWFyKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZpbGw6OlNldFJhZGlhbChpbnQzMl90IGlSYWRpYWwsIEZYX0FSR0IgZW5kQ29sb3IpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9SYWRpYWwpOw0KKyAgQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ29sb3IpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCisgIGludCBhLCByLCBnLCBiOw0KKyAgQXJnYkRlY29kZShlbmRDb2xvciwgYSwgciwgZywgYik7DQorICB3c0NvbG9yLkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYik7DQorICBwQ29sb3ItPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOw0KKyAgcmV0dXJuIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHlwZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlSYWRpYWwpOw0KK30NCitDWEZBX01hcmdpbjo6Q1hGQV9NYXJnaW4oQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorRlhfQk9PTCBDWEZBX01hcmdpbjo6R2V0TGVmdEluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCkgY29uc3Qgew0KKyAgZkluc2V0ID0gZkRlZkluc2V0Ow0KKyAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OkdldFRvcEluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCkgY29uc3Qgew0KKyAgZkluc2V0ID0gZkRlZkluc2V0Ow0KKyAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgZkluc2V0KTsNCit9DQorRlhfQk9PTCBDWEZBX01hcmdpbjo6R2V0UmlnaHRJbnNldChGWF9GTE9BVCYgZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQpIGNvbnN0IHsNCisgIGZJbnNldCA9IGZEZWZJbnNldDsNCisgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCwgZkluc2V0KTsNCit9DQorRlhfQk9PTCBDWEZBX01hcmdpbjo6R2V0Qm90dG9tSW5zZXQoRlhfRkxPQVQmIGZJbnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRGVmSW5zZXQpIGNvbnN0IHsNCisgIGZJbnNldCA9IGZEZWZJbnNldDsNCisgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OlNldExlZnRJbnNldChGWF9GTE9BVCBmSW5zZXQpIHsNCisgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LCBmSW5zZXQpOw0KK30NCitGWF9CT09MIENYRkFfTWFyZ2luOjpTZXRUb3BJbnNldChGWF9GTE9BVCBmSW5zZXQpIHsNCisgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OlNldFJpZ2h0SW5zZXQoRlhfRkxPQVQgZkluc2V0KSB7DQorICByZXR1cm4gU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OlNldEJvdHRvbUluc2V0KEZYX0ZMT0FUIGZJbnNldCkgew0KKyAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCwgZkluc2V0KTsNCit9DQorQ1hGQV9Gb250OjpDWEZBX0ZvbnQoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRCYXNlbGluZVNoaWZ0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9CYXNlbGluZVNoaWZ0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitGWF9GTE9BVCBDWEZBX0ZvbnQ6OkdldEhvcml6b250YWxTY2FsZSgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0ZvbnRIb3Jpem9udGFsU2NhbGUsIHdzVmFsdWUpOw0KKyAgaW50MzJfdCBpU2NhbGUgPSBGWFNZU193dG9pKChjb25zdCBGWF9XQ0hBUiopd3NWYWx1ZSk7DQorICByZXR1cm4gaVNjYWxlID4gMCA/IChGWF9GTE9BVClpU2NhbGUgOiAxMDAuMGY7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfRm9udDo6R2V0VmVydGljYWxTY2FsZSgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLCB3c1ZhbHVlKTsNCisgIGludDMyX3QgaVNjYWxlID0gRlhTWVNfd3RvaSgoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWUpOw0KKyAgcmV0dXJuIGlTY2FsZSA+IDAgPyAoRlhfRkxPQVQpaVNjYWxlIDogMTAwLjBmOw0KK30NCitGWF9GTE9BVCBDWEZBX0ZvbnQ6OkdldExldHRlclNwYWNpbmcoKSB7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZTsNCisgIGlmICghbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9MZXR0ZXJTcGFjaW5nLCB3c1ZhbHVlKSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENYRkFfTWVhc3VyZW1lbnQgbXMod3NWYWx1ZSk7DQorICBpZiAobXMuR2V0VW5pdCgpID09IFhGQV9VTklUX0VtKSB7DQorICAgIHJldHVybiBtcy5HZXRWYWx1ZSgpICogR2V0Rm9udFNpemUoKTsNCisgIH0NCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitpbnQzMl90IENYRkFfRm9udDo6R2V0TGluZVRocm91Z2goKSB7DQorICBpbnQzMl90IGlWYWx1ZSA9IDA7DQorICBtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2gsIGlWYWx1ZSk7DQorICByZXR1cm4gaVZhbHVlOw0KK30NCitpbnQzMl90IENYRkFfRm9udDo6R2V0TGluZVRocm91Z2hQZXJpb2QoKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaFBlcmlvZCwgZUF0dHIpOw0KKyAgcmV0dXJuIGVBdHRyOw0KK30NCitpbnQzMl90IENYRkFfRm9udDo6R2V0T3ZlcmxpbmUoKSB7DQorICBpbnQzMl90IGlWYWx1ZSA9IDA7DQorICBtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmUsIGlWYWx1ZSk7DQorICByZXR1cm4gaVZhbHVlOw0KK30NCitpbnQzMl90IENYRkFfRm9udDo6R2V0T3ZlcmxpbmVQZXJpb2QoKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9PdmVybGluZVBlcmlvZCwgZUF0dHIpOw0KKyAgcmV0dXJuIGVBdHRyOw0KK30NCitpbnQzMl90IENYRkFfRm9udDo6R2V0VW5kZXJsaW5lKCkgew0KKyAgaW50MzJfdCBpVmFsdWUgPSAwOw0KKyAgbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX1VuZGVybGluZSwgaVZhbHVlKTsNCisgIHJldHVybiBpVmFsdWU7DQorfQ0KK2ludDMyX3QgQ1hGQV9Gb250OjpHZXRVbmRlcmxpbmVQZXJpb2QoKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsIGVBdHRyKTsNCisgIHJldHVybiBlQXR0cjsNCit9DQorRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRGb250U2l6ZSgpIHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2l6ZSwgbXMpOw0KKyAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorfQ0KK3ZvaWQgQ1hGQV9Gb250OjpHZXRUeXBlZmFjZShDRlhfV2lkZVN0cmluZ0MmIHdzVHlwZUZhY2UpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsIHdzVHlwZUZhY2UpOw0KK30NCitGWF9CT09MIENYRkFfRm9udDo6SXNCb2xkKCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob3JtYWw7DQorICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfV2VpZ2h0LCBlQXR0cik7DQorICByZXR1cm4gZUF0dHIgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm9sZDsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OklzSXRhbGljKCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob3JtYWw7DQorICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfUG9zdHVyZSwgZUF0dHIpOw0KKyAgcmV0dXJuIGVBdHRyID09IFhGQV9BVFRSSUJVVEVFTlVNX0l0YWxpYzsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OklzVXNlS2VybmluZygpIHsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9LZXJuaW5nTW9kZSwgZUF0dHIpOw0KKyAgcmV0dXJuIGVBdHRyID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhaXI7DQorfQ0KK3ZvaWQgQ1hGQV9Gb250OjpTZXRDb2xvcihGWF9BUkdCIGNvbG9yKSB7DQorICBDWEZBX0ZpbGwgZmlsbCA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0ZpbGwpOw0KKyAgZmlsbC5TZXRDb2xvcihjb2xvcik7DQorfQ0KK0ZYX0FSR0IgQ1hGQV9Gb250OjpHZXRDb2xvcigpIHsNCisgIGlmIChDWEZBX0ZpbGwgZmlsbCA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0ZpbGwpKSB7DQorICAgIHJldHVybiBmaWxsLkdldENvbG9yKFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIDB4RkYwMDAwMDA7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRCYXNlbGluZVNoaWZ0KEZYX0ZMT0FUIGZCYXNlbGluZVNoaWZ0KSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zKGZCYXNlbGluZVNoaWZ0LCBYRkFfVU5JVF9QdCk7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0Jhc2VsaW5lU2hpZnQsIG1zKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldEhvcml6b250YWxTY2FsZShGWF9GTE9BVCBmSG9yaXpvbnRhbFNjYWxlKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgd3NWYWx1ZS5Gb3JtYXQoTCIlZCIsIChpbnQzMl90KWZIb3Jpem9udGFsU2NhbGUpOw0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwgd3NWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRWZXJ0aWNhbFNjYWxlKEZYX0ZMT0FUIGZWZXJ0aWNhbFNjYWxlKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgd3NWYWx1ZS5Gb3JtYXQoTCIlZCIsIChpbnQzMl90KWZWZXJ0aWNhbFNjYWxlKTsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLCB3c1ZhbHVlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldExldHRlclNwYWNpbmcoRlhfRkxPQVQgZkxldHRlclNwYWNpbmcsIFhGQV9VTklUIGVVbml0KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRMaW5lVGhyb3VnaChpbnQzMl90IGlMaW5lVGhyb3VnaCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaCwgaUxpbmVUaHJvdWdoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldExpbmVUaHJvdWdoUGVyaW9kKGludDMyX3QgaUxpbmVUaHJvdWdoUGVyaW9kKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoUGVyaW9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFhGQV9BVFRSSUJVVEVFTlVNKWlMaW5lVGhyb3VnaFBlcmlvZCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRPdmVybGluZShpbnQzMl90IGlPdmVybGluZSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9PdmVybGluZSwgaU92ZXJsaW5lKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldE92ZXJsaW5lUGVyaW9kKGludDMyX3QgaU92ZXJsaW5lUGVyaW9kKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX092ZXJsaW5lUGVyaW9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFhGQV9BVFRSSUJVVEVFTlVNKWlPdmVybGluZVBlcmlvZCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRVbmRlcmxpbmUoaW50MzJfdCBpVW5kZXJsaW5lKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX1VuZGVybGluZSwgaVVuZGVybGluZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRVbmRlcmxpbmVQZXJpb2QoaW50MzJfdCBpVW5kZXJsaW5lUGVyaW9kKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1VuZGVybGluZVBlcmlvZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChYRkFfQVRUUklCVVRFRU5VTSlpVW5kZXJsaW5lUGVyaW9kKTsNCit9DQorQ1hGQV9DYXB0aW9uOjpDWEZBX0NhcHRpb24oQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQoraW50MzJfdCBDWEZBX0NhcHRpb246OkdldFByZXNlbmNlKCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlOw0KKyAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBlQXR0cik7DQorICByZXR1cm4gZUF0dHI7DQorfQ0KK2ludDMyX3QgQ1hGQV9DYXB0aW9uOjpHZXRQbGFjZW1lbnRUeXBlKCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Ow0KKyAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwgZUF0dHIpOw0KKyAgcmV0dXJuIGVBdHRyOw0KK30NCitGWF9GTE9BVCBDWEZBX0NhcHRpb246OkdldFJlc2VydmUoKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1Jlc2VydmUsIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitDWEZBX01hcmdpbiBDWEZBX0NhcHRpb246OkdldE1hcmdpbigpIHsNCisgIHJldHVybiBDWEZBX01hcmdpbihtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWFyZ2luKSA6IE5VTEwpOw0KK30NCitDWEZBX0ZvbnQgQ1hGQV9DYXB0aW9uOjpHZXRGb250KCkgew0KKyAgcmV0dXJuIENYRkFfRm9udChtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRm9udCkgOiBOVUxMKTsNCit9DQorQ1hGQV9WYWx1ZSBDWEZBX0NhcHRpb246OkdldFZhbHVlKCkgew0KKyAgcmV0dXJuIENYRkFfVmFsdWUobV9wTm9kZSA/IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKSA6IE5VTEwpOw0KK30NCitDWEZBX1BhcmEgQ1hGQV9DYXB0aW9uOjpHZXRQYXJhKCkgew0KKyAgcmV0dXJuIENYRkFfUGFyYShtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGFyYSkgOiBOVUxMKTsNCit9DQorRlhfQk9PTCBDWEZBX0NhcHRpb246OlNldFByZXNlbmNlKGludDMyX3QgaVByZXNlbmNlKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCAoWEZBX0FUVFJJQlVURUVOVU0paVByZXNlbmNlKTsNCit9DQorRlhfQk9PTCBDWEZBX0NhcHRpb246OlNldFBsYWNlbWVudFR5cGUoaW50MzJfdCBpVHlwZSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QbGFjZW1lbnQsIChYRkFfQVRUUklCVVRFRU5VTSlpVHlwZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9DYXB0aW9uOjpTZXRSZXNlcnZlKEZYX0ZMT0FUIGZSZXNlcnZlKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zKGZSZXNlcnZlLCBYRkFfVU5JVF9QdCk7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1Jlc2VydmUsIG1zKTsNCit9DQorQ1hGQV9QYXJhOjpDWEZBX1BhcmEoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQoraW50MzJfdCBDWEZBX1BhcmE6OkdldEhvcml6b250YWxBbGlnbigpIHsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdDsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24sIGVBdHRyKTsNCisgIHJldHVybiBlQXR0cjsNCit9DQoraW50MzJfdCBDWEZBX1BhcmE6OkdldFZlcnRpY2FsQWxpZ24oKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9WQWxpZ24sIGVBdHRyKTsNCisgIHJldHVybiBlQXR0cjsNCit9DQorRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRMaW5lSGVpZ2h0KCkgew0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgIG1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9MaW5lSGVpZ2h0LCBtcyk7DQorICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRNYXJnaW5MZWZ0KCkgew0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgIG1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LCBtcyk7DQorICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRNYXJnaW5SaWdodCgpIHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWFyZ2luUmlnaHQsIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitpbnQzMl90IENYRkFfUGFyYTo6R2V0T3JwaGFucygpIHsNCisgIGludDMyX3QgaVZhbHVlID0gMDsNCisgIG1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9PcnBoYW5zLCBpVmFsdWUpOw0KKyAgcmV0dXJuIGlWYWx1ZTsNCit9DQorRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRSYWRpeE9mZnNldCgpIHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmFkaXhPZmZzZXQsIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitGWF9GTE9BVCBDWEZBX1BhcmE6OkdldFNwYWNlQWJvdmUoKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1NwYWNlQWJvdmUsIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitGWF9GTE9BVCBDWEZBX1BhcmE6OkdldFNwYWNlQmVsb3coKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitGWF9GTE9BVCBDWEZBX1BhcmE6OkdldFRleHRJbmRlbnQoKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitpbnQzMl90IENYRkFfUGFyYTo6R2V0V2lkb3dzKCkgew0KKyAgaW50MzJfdCBpVmFsdWUgPSAwOw0KKyAgbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX1dpZG93cywgaVZhbHVlKTsNCisgIHJldHVybiBpVmFsdWU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRIb3Jpem9udGFsQWxpZ24oaW50MzJfdCBpSG9yaXpvbnRhbEFsaWduKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChYRkFfQVRUUklCVVRFRU5VTSlpSG9yaXpvbnRhbEFsaWduKTsNCit9DQorRlhfQk9PTCBDWEZBX1BhcmE6OlNldFZlcnRpY2FsQWxpZ24oaW50MzJfdCBpVmVydGljYWxBbGlnbikgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9WQWxpZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoWEZBX0FUVFJJQlVURUVOVU0paVZlcnRpY2FsQWxpZ24pOw0KK30NCitGWF9CT09MIENYRkFfUGFyYTo6U2V0TGluZUhlaWdodChGWF9GTE9BVCBmTGluZUhlaWdodCkgew0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGluZUhlaWdodCwgbXMpOw0KK30NCitGWF9CT09MIENYRkFfUGFyYTo6U2V0TWFyZ2luTGVmdChGWF9GTE9BVCBmTWFyZ2luTGVmdCkgew0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmTWFyZ2luTGVmdCwgWEZBX1VOSVRfUHQpOw0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LCBtcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRNYXJnaW5SaWdodChGWF9GTE9BVCBmTWFyZ2luUmlnaHQpIHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXMoZk1hcmdpblJpZ2h0LCBYRkFfVU5JVF9QdCk7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LCBtcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRPcnBoYW5zKGludDMyX3QgaU9ycGhhbnMpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfT3JwaGFucywgaU9ycGhhbnMpOw0KK30NCitGWF9CT09MIENYRkFfUGFyYTo6U2V0UmFkaXhPZmZzZXQoRlhfRkxPQVQgZlJhZGl4T2Zmc2V0KSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zKGZSYWRpeE9mZnNldCwgWEZBX1VOSVRfUHQpOw0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwgbXMpOw0KK30NCitGWF9CT09MIENYRkFfUGFyYTo6U2V0U3BhY2VBYm92ZShGWF9GTE9BVCBmU3BhY2VBYm92ZSkgew0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmU3BhY2VBYm92ZSwgWEZBX1VOSVRfUHQpOw0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9TcGFjZUFib3ZlLCBtcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRTcGFjZUJlbG93KEZYX0ZMT0FUIGZTcGFjZUJlbG93KSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zKGZTcGFjZUJlbG93LCBYRkFfVU5JVF9QdCk7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csIG1zKTsNCit9DQorRlhfQk9PTCBDWEZBX1BhcmE6OlNldFRleHRJbmRlbnQoRlhfRkxPQVQgZlRleHRJbmRlbnQpIHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXMoZlRleHRJbmRlbnQsIFhGQV9VTklUX1B0KTsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVGV4dEluZGVudCwgbXMpOw0KK30NCitGWF9CT09MIENYRkFfUGFyYTo6U2V0V2lkb3dzKGludDMyX3QgaVdpZG93cykgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9XaWRvd3MsIGlXaWRvd3MpOw0KK30NCitDWEZBX0tlZXA6OkNYRkFfS2VlcChDWEZBX05vZGUqIHBOb2RlLCBDWEZBX05vZGUqIHBQYXJlbnQpDQorICAgIDogQ1hGQV9EYXRhKHBOb2RlKSwgbV9wUGFyZW50KHBQYXJlbnQpIHt9DQoraW50MzJfdCBDWEZBX0tlZXA6OkdldEludGFjdCgpIHsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgIHN3aXRjaCAobV9wUGFyZW50LT5HZXRDbGFzc0lEKCkpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOiB7DQorICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHJTdWJGb3JtOw0KKyAgICAgIG1fcFBhcmVudC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX0xheW91dCwgZUF0dHJTdWJGb3JtKTsNCisgICAgICBpZiAoZUF0dHJTdWJGb3JtID09IFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uIHx8DQorICAgICAgICAgIGVBdHRyU3ViRm9ybSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cpIHsNCisgICAgICAgIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQorICAgICAgZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9JbnRhY3QsIGVBdHRyLCBGQUxTRSk7DQorICByZXR1cm4gZUF0dHI7DQorfQ0KK2ludDMyX3QgQ1hGQV9LZWVwOjpHZXROZXh0KCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX05leHQsIGVBdHRyKTsNCisgIHJldHVybiBlQXR0cjsNCit9DQoraW50MzJfdCBDWEZBX0tlZXA6OkdldFByZXZpb3VzKCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1ByZXZpb3VzLCBlQXR0cik7DQorICByZXR1cm4gZUF0dHI7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9LZWVwOjpTZXRJbnRhY3QoaW50MzJfdCBpSW50YWN0KSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0ludGFjdCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlJbnRhY3QpOw0KK30NCitGWF9CT09MIENYRkFfS2VlcDo6U2V0TmV4dChpbnQzMl90IGlOZXh0KSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX05leHQsIChYRkFfQVRUUklCVVRFRU5VTSlpTmV4dCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9LZWVwOjpTZXRQcmV2aW91cyhpbnQzMl90IGlQcmV2aW91cykgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QcmV2aW91cywgKFhGQV9BVFRSSUJVVEVFTlVNKWlQcmV2aW91cyk7DQorfQ0KK0NYRkFfRXZlbnQ6OkNYRkFfRXZlbnQoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQoraW50MzJfdCBDWEZBX0V2ZW50OjpHZXRBY3Rpdml0eSgpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQWN0aXZpdHkpOw0KK30NCitpbnQzMl90IENYRkFfRXZlbnQ6OkdldEV2ZW50VHlwZSgpIHsNCisgIENYRkFfTm9kZSogcENoaWxkID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICBpbnQzMl90IGVUeXBlID0gcENoaWxkLT5HZXRDbGFzc0lEKCk7DQorICAgIGlmIChlVHlwZSAhPSBYRkFfRUxFTUVOVF9FeHRyYXMpIHsNCisgICAgICByZXR1cm4gZVR5cGU7DQogICAgIH0NCi0gICAgcmV0dXJuIFhGQV9FTEVNRU5UX1VOS05PV047DQorICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgIH0NCisgIHJldHVybiBYRkFfRUxFTUVOVF9VTktOT1dOOw0KIH0NCi12b2lkIENYRkFfRXZlbnQ6OkdldFJlZihDRlhfV2lkZVN0cmluZ0MgJndzUmVmKQ0KLXsNCi0gICAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYsIHdzUmVmKTsNCit2b2lkIENYRkFfRXZlbnQ6OkdldFJlZihDRlhfV2lkZVN0cmluZ0MmIHdzUmVmKSB7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1JlZiwgd3NSZWYpOw0KIH0NCi1pbnQzMl90IENYRkFfRXZlbnQ6OkdldEV4ZWN1dGVSdW5BdCgpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQotICAgIHJldHVybiBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1J1bkF0KTsNCitpbnQzMl90IENYRkFfRXZlbnQ6OkdldEV4ZWN1dGVSdW5BdCgpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9FeGVjdXRlKTsNCisgIHJldHVybiBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1J1bkF0KTsNCiB9DQotaW50MzJfdCBDWEZBX0V2ZW50OjpHZXRFeGVjdXRlVHlwZSgpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQotICAgIHJldHVybiBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0V4ZWN1dGVUeXBlKTsNCitpbnQzMl90IENYRkFfRXZlbnQ6OkdldEV4ZWN1dGVUeXBlKCkgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0V4ZWN1dGUpOw0KKyAgcmV0dXJuIHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUpOw0KIH0NCi12b2lkIENYRkFfRXZlbnQ6OkdldEV4ZWN1dGVDb25uZWN0aW9uKENGWF9XaWRlU3RyaW5nICZ3c0Nvbm5lY3Rpb24pDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQotICAgIENGWF9XaWRlU3RyaW5nQyBjRGF0YTsNCi0gICAgcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgY0RhdGEpOw0KLSAgICB3c0Nvbm5lY3Rpb24gPSBjRGF0YTsNCit2b2lkIENYRkFfRXZlbnQ6OkdldEV4ZWN1dGVDb25uZWN0aW9uKENGWF9XaWRlU3RyaW5nJiB3c0Nvbm5lY3Rpb24pIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9FeGVjdXRlKTsNCisgIENGWF9XaWRlU3RyaW5nQyBjRGF0YTsNCisgIHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIGNEYXRhKTsNCisgIHdzQ29ubmVjdGlvbiA9IGNEYXRhOw0KIH0NCi1DWEZBX1NjcmlwdCBDWEZBX0V2ZW50OjpHZXRTY3JpcHQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1NjcmlwdCk7DQorQ1hGQV9TY3JpcHQgQ1hGQV9FdmVudDo6R2V0U2NyaXB0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1NjcmlwdCk7DQogfQ0KLUNYRkFfU3VibWl0IENYRkFfRXZlbnQ6OkdldFN1Ym1pdCgpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfU3VibWl0KTsNCitDWEZBX1N1Ym1pdCBDWEZBX0V2ZW50OjpHZXRTdWJtaXQoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfU3VibWl0KTsNCiB9DQotaW50MzJfdCBDWEZBX0V2ZW50OjpHZXRTaWduRGF0YU9wZXJhdGlvbigpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU2lnbkRhdGEpOw0KLSAgICByZXR1cm4gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9PcGVyYXRpb24pOw0KK2ludDMyX3QgQ1hGQV9FdmVudDo6R2V0U2lnbkRhdGFPcGVyYXRpb24oKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU2lnbkRhdGEpOw0KKyAgcmV0dXJuIHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uKTsNCiB9DQotdm9pZCBDWEZBX0V2ZW50OjpHZXRTaWduRGF0YVRhcmdldChDRlhfV2lkZVN0cmluZyAmd3NUYXJnZXQpDQotew0KLSAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1NpZ25EYXRhKSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ0RhdGE7DQotICAgICAgICBwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UYXJnZXQsIHdzQ0RhdGEpOw0KLSAgICAgICAgd3NUYXJnZXQgPSB3c0NEYXRhOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ1hGQV9FdmVudDo6U2V0QWN0aXZpdHkoaW50MzJfdCBpQWN0aXZpdHkpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0FjdGl2aXR5LCAoWEZBX0FUVFJJQlVURUVOVU0paUFjdGl2aXR5KTsNCi19DQotRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRFdmVudFR5cGUoaW50MzJfdCBpRXZlbnRUeXBlKQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfRXZlbnQ6OlNldEV4ZWN1dGVSdW5BdChpbnQzMl90IGlFeGVjdXRlUnVuQXQpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQotICAgIHJldHVybiBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1J1bkF0LCAoWEZBX0FUVFJJQlVURUVOVU0paUV4ZWN1dGVSdW5BdCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9FdmVudDo6U2V0RXhlY3V0ZVR5cGUoaW50MzJfdCBpRXhlY3V0ZVR5cGUpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQotICAgIHJldHVybiBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0V4ZWN1dGVUeXBlLCAoWEZBX0FUVFJJQlVURUVOVU0paUV4ZWN1dGVUeXBlKTsNCi19DQotRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRFeGVjdXRlQ29ubmVjdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb25uZWN0aW9uKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0V4ZWN1dGUpOw0KLSAgICByZXR1cm4gcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgd3NDb25uZWN0aW9uKTsNCi19DQotRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRTaWduRGF0YU9wZXJhdGlvbihpbnQzMl90IGlPcGVyYXRpb24pDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU2lnbkRhdGEpOw0KLSAgICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sIChYRkFfQVRUUklCVVRFRU5VTSlpT3BlcmF0aW9uKTsNCi19DQotRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRTaWduRGF0YVRhcmdldChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpDQotew0KLSAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1NpZ25EYXRhKSkgew0KLSAgICAgICAgcmV0dXJuIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1RhcmdldCwgd3NUYXJnZXQpOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotQ1hGQV9TY3JpcHQ6OkNYRkFfU2NyaXB0KENYRkFfTm9kZSogcE5vZGUpDQotICAgIDogQ1hGQV9EYXRhKHBOb2RlKQ0KLXsNCi19DQotdm9pZCBDWEZBX1NjcmlwdDo6R2V0QmluZGluZyhDRlhfV2lkZVN0cmluZyAmd3NCaW5kaW5nKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIGNEYXRhOw0KLSAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0JpbmRpbmcsIGNEYXRhKTsNCi0gICAgd3NCaW5kaW5nID0gY0RhdGE7DQotfQ0KLVhGQV9TQ1JJUFRUWVBFIENYRkFfU2NyaXB0OjpHZXRDb250ZW50VHlwZSgpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZ0MgY0RhdGE7DQotICAgIGlmIChtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBjRGF0YSwgRkFMU0UpKSB7DQotICAgICAgICBpZiAoY0RhdGEgPT0gRlhfV1NUUkMoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKSkgew0KLSAgICAgICAgICAgIHJldHVybiBYRkFfU0NSSVBUVFlQRV9KYXZhc2NyaXB0Ow0KLSAgICAgICAgfSBlbHNlIGlmIChjRGF0YSA9PSBGWF9XU1RSQyhMImFwcGxpY2F0aW9uL3gtZm9ybWNhbGMiKSkgew0KLSAgICAgICAgICAgIHJldHVybiBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIFhGQV9TQ1JJUFRUWVBFX1Vua293bjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gWEZBX1NDUklQVFRZUEVfRm9ybWNhbGM7DQotfQ0KLWludDMyX3QgQ1hGQV9TY3JpcHQ6OkdldFJ1bkF0KCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUnVuQXQpOw0KLX0NCi12b2lkIENYRkFfU2NyaXB0OjpHZXRFeHByZXNzaW9uKENGWF9XaWRlU3RyaW5nICZ3c0V4cHJlc3Npb24pDQotew0KLSAgICBtX3BOb2RlLT5UcnlDb250ZW50KHdzRXhwcmVzc2lvbik7DQotfQ0KLUZYX0JPT0wgQ1hGQV9TY3JpcHQ6OlNldEJpbmRpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQmluZGluZykNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0JpbmRpbmcsIHdzQmluZGluZyk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9TY3JpcHQ6OlNldENvbnRlbnRUeXBlKFhGQV9TQ1JJUFRUWVBFIGVUeXBlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlOw0KLSAgICBzd2l0Y2ggKGVUeXBlKSB7DQotICAgICAgICBjYXNlIFhGQV9TQ1JJUFRUWVBFX0phdmFzY3JpcHQ6DQotICAgICAgICAgICAgd3NUeXBlID0gTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYzoNCi0gICAgICAgICAgICB3c1R5cGUgPSBMImFwcGxpY2F0aW9uL3gtZm9ybWNhbGMiOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NUeXBlKTsNCi19DQotRlhfQk9PTCBDWEZBX1NjcmlwdDo6U2V0UnVuQXQoaW50MzJfdCBpUnVuQXQpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1J1bkF0LCAoWEZBX0FUVFJJQlVURUVOVU0paVJ1bkF0KTsNCi19DQotRlhfQk9PTCBDWEZBX1NjcmlwdDo6U2V0RXhwcmVzc2lvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NFeHByZXNzaW9uKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldENvbnRlbnQod3NFeHByZXNzaW9uLCB3c0V4cHJlc3Npb24pOw0KLX0NCi1DWEZBX1N1Ym1pdDo6Q1hGQV9TdWJtaXQoQ1hGQV9Ob2RlKiBwTm9kZSkNCi0gICAgOiBDWEZBX0RhdGEgKHBOb2RlKQ0KLXsNCi19DQotRlhfQk9PTCBDWEZBX1N1Ym1pdDo6SXNTdWJtaXRFbWJlZFBERigpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX0VtYmVkUERGKTsNCi19DQotaW50MzJfdCBDWEZBX1N1Ym1pdDo6R2V0U3VibWl0Rm9ybWF0KCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfRm9ybWF0KTsNCi19DQotdm9pZCBDWEZBX1N1Ym1pdDo6R2V0U3VibWl0VGFyZ2V0KENGWF9XaWRlU3RyaW5nQyAmd3NUYXJnZXQpDQotew0KLSAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1RhcmdldCwgd3NUYXJnZXQpOw0KLX0NCi1YRkFfVEVYVEVOQ09ESU5HIENYRkFfU3VibWl0OjpHZXRTdWJtaXRUZXh0RW5jb2RpbmcoKQ0KLXsNCit2b2lkIENYRkFfRXZlbnQ6OkdldFNpZ25EYXRhVGFyZ2V0KENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCkgew0KKyAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9TaWduRGF0YSkpIHsNCiAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ0RhdGE7DQotICAgIGlmICghbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UZXh0RW5jb2RpbmcsIHdzQ0RhdGEpKSB7DQotICAgICAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19Ob25lOw0KKyAgICBwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UYXJnZXQsIHdzQ0RhdGEpOw0KKyAgICB3c1RhcmdldCA9IHdzQ0RhdGE7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9FdmVudDo6U2V0QWN0aXZpdHkoaW50MzJfdCBpQWN0aXZpdHkpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQWN0aXZpdHksIChYRkFfQVRUUklCVVRFRU5VTSlpQWN0aXZpdHkpOw0KK30NCitGWF9CT09MIENYRkFfRXZlbnQ6OlNldEV2ZW50VHlwZShpbnQzMl90IGlFdmVudFR5cGUpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRFeGVjdXRlUnVuQXQoaW50MzJfdCBpRXhlY3V0ZVJ1bkF0KSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQorICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9SdW5BdCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlFeGVjdXRlUnVuQXQpOw0KK30NCitGWF9CT09MIENYRkFfRXZlbnQ6OlNldEV4ZWN1dGVUeXBlKGludDMyX3QgaUV4ZWN1dGVUeXBlKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQorICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9FeGVjdXRlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoWEZBX0FUVFJJQlVURUVOVU0paUV4ZWN1dGVUeXBlKTsNCit9DQorRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRFeGVjdXRlQ29ubmVjdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb25uZWN0aW9uKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQorICByZXR1cm4gcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgd3NDb25uZWN0aW9uKTsNCit9DQorRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRTaWduRGF0YU9wZXJhdGlvbihpbnQzMl90IGlPcGVyYXRpb24pIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9TaWduRGF0YSk7DQorICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sIChYRkFfQVRUUklCVVRFRU5VTSlpT3BlcmF0aW9uKTsNCit9DQorRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRTaWduRGF0YVRhcmdldChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU2lnbkRhdGEpKSB7DQorICAgIHJldHVybiBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9UYXJnZXQsIHdzVGFyZ2V0KTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ1hGQV9TY3JpcHQ6OkNYRkFfU2NyaXB0KENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KK3ZvaWQgQ1hGQV9TY3JpcHQ6OkdldEJpbmRpbmcoQ0ZYX1dpZGVTdHJpbmcmIHdzQmluZGluZykgew0KKyAgQ0ZYX1dpZGVTdHJpbmdDIGNEYXRhOw0KKyAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9CaW5kaW5nLCBjRGF0YSk7DQorICB3c0JpbmRpbmcgPSBjRGF0YTsNCit9DQorWEZBX1NDUklQVFRZUEUgQ1hGQV9TY3JpcHQ6OkdldENvbnRlbnRUeXBlKCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmdDIGNEYXRhOw0KKyAgaWYgKG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIGNEYXRhLCBGQUxTRSkpIHsNCisgICAgaWYgKGNEYXRhID09IEZYX1dTVFJDKEwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IikpIHsNCisgICAgICByZXR1cm4gWEZBX1NDUklQVFRZUEVfSmF2YXNjcmlwdDsNCisgICAgfSBlbHNlIGlmIChjRGF0YSA9PSBGWF9XU1RSQyhMImFwcGxpY2F0aW9uL3gtZm9ybWNhbGMiKSkgew0KKyAgICAgIHJldHVybiBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYzsNCisgICAgfSBlbHNlIHsNCisgICAgICByZXR1cm4gWEZBX1NDUklQVFRZUEVfVW5rb3duOw0KICAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUod3NDRGF0YSk7DQotICAgIGlmICh3c1ZhbHVlID09IEwiQmlnLUZpdmUiKSB7DQotICAgICAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19CaWc1Ow0KLSAgICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJmb250U3BlY2lmaWMiKSB7DQotICAgICAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19Gb250U3BlY2lmaWM7DQotICAgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIkdCSyIpIHsNCi0gICAgICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX0dCSzsNCi0gICAgfSBlbHNlIGlmICh3c1ZhbHVlID09IEwiR0ItMTgwMzAiKSB7DQotICAgICAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19HQjE4MDMwOw0KLSAgICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJHQi0yMzEyIikgew0KLSAgICAgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfR0IyMzEyOw0KLSAgICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJJU08tODg1OS1OTiIpIHsNCi0gICAgICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX0lTTzg4NTlOTjsNCi0gICAgfSBlbHNlIGlmICh3c1ZhbHVlID09IEwiS1NDLTU2MDEiKSB7DQotICAgICAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19LU0M1NjAxOw0KLSAgICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJTaGlmdC1KSVMiKSB7DQotICAgICAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19TaGlmdEpJUzsNCi0gICAgfSBlbHNlIGlmICh3c1ZhbHVlID09IEwiVUNTLTIiKSB7DQotICAgICAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19VQ1MyOw0KLSAgICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJVVEYtMTYiKSB7DQotICAgICAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19VVEYxNjsNCi0gICAgfSBlbHNlIGlmICh3c1ZhbHVlID09IEwiVVRGLTgiKSB7DQotICAgICAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19VVEY4Ow0KLSAgICB9DQorICB9DQorICByZXR1cm4gWEZBX1NDUklQVFRZUEVfRm9ybWNhbGM7DQorfQ0KK2ludDMyX3QgQ1hGQV9TY3JpcHQ6OkdldFJ1bkF0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9SdW5BdCk7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHQ6OkdldEV4cHJlc3Npb24oQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbikgew0KKyAgbV9wTm9kZS0+VHJ5Q29udGVudCh3c0V4cHJlc3Npb24pOw0KK30NCitGWF9CT09MIENYRkFfU2NyaXB0OjpTZXRCaW5kaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0JpbmRpbmcpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0JpbmRpbmcsIHdzQmluZGluZyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHQ6OlNldENvbnRlbnRUeXBlKFhGQV9TQ1JJUFRUWVBFIGVUeXBlKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1R5cGU7DQorICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgIGNhc2UgWEZBX1NDUklQVFRZUEVfSmF2YXNjcmlwdDoNCisgICAgICB3c1R5cGUgPSBMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1NDUklQVFRZUEVfRm9ybWNhbGM6DQorICAgICAgd3NUeXBlID0gTCJhcHBsaWNhdGlvbi94LWZvcm1jYWxjIjsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c1R5cGUpOw0KK30NCitGWF9CT09MIENYRkFfU2NyaXB0OjpTZXRSdW5BdChpbnQzMl90IGlSdW5BdCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9SdW5BdCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlSdW5BdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHQ6OlNldEV4cHJlc3Npb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbikgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENvbnRlbnQod3NFeHByZXNzaW9uLCB3c0V4cHJlc3Npb24pOw0KK30NCitDWEZBX1N1Ym1pdDo6Q1hGQV9TdWJtaXQoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorRlhfQk9PTCBDWEZBX1N1Ym1pdDo6SXNTdWJtaXRFbWJlZFBERigpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfRW1iZWRQREYpOw0KK30NCitpbnQzMl90IENYRkFfU3VibWl0OjpHZXRTdWJtaXRGb3JtYXQoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0Zvcm1hdCk7DQorfQ0KK3ZvaWQgQ1hGQV9TdWJtaXQ6OkdldFN1Ym1pdFRhcmdldChDRlhfV2lkZVN0cmluZ0MmIHdzVGFyZ2V0KSB7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1RhcmdldCwgd3NUYXJnZXQpOw0KK30NCitYRkFfVEVYVEVOQ09ESU5HIENYRkFfU3VibWl0OjpHZXRTdWJtaXRUZXh0RW5jb2RpbmcoKSB7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NDRGF0YTsNCisgIGlmICghbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UZXh0RW5jb2RpbmcsIHdzQ0RhdGEpKSB7DQogICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX05vbmU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlKHdzQ0RhdGEpOw0KKyAgaWYgKHdzVmFsdWUgPT0gTCJCaWctRml2ZSIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfQmlnNTsNCisgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMImZvbnRTcGVjaWZpYyIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfRm9udFNwZWNpZmljOw0KKyAgfSBlbHNlIGlmICh3c1ZhbHVlID09IEwiR0JLIikgew0KKyAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19HQks7DQorICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJHQi0xODAzMCIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfR0IxODAzMDsNCisgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIkdCLTIzMTIiKSB7DQorICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX0dCMjMxMjsNCisgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIklTTy04ODU5LU5OIikgew0KKyAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19JU084ODU5Tk47DQorICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJLU0MtNTYwMSIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfS1NDNTYwMTsNCisgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIlNoaWZ0LUpJUyIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfU2hpZnRKSVM7DQorICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJVQ1MtMiIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfVUNTMjsNCisgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIlVURi0xNiIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfVVRGMTY7DQorICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJVVEYtOCIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfVVRGODsNCisgIH0NCisgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX05vbmU7DQogfQ0KLXZvaWQgQ1hGQV9TdWJtaXQ6OkdldFN1Ym1pdFhEUENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmdDICZ3c0NvbnRlbnQpDQotew0KLSAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsIHdzQ29udGVudCk7DQordm9pZCBDWEZBX1N1Ym1pdDo6R2V0U3VibWl0WERQQ29udGVudChDRlhfV2lkZVN0cmluZ0MmIHdzQ29udGVudCkgew0KKyAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9YZHBDb250ZW50LCB3c0NvbnRlbnQpOw0KIH0NCi1GWF9CT09MIENYRkFfU3VibWl0OjpTZXRTdWJtaXRGb3JtYXQoaW50MzJfdCBpU3VibWl0Rm9ybWF0KQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9Gb3JtYXQsIChYRkFfQVRUUklCVVRFRU5VTSlpU3VibWl0Rm9ybWF0KTsNCitGWF9CT09MIENYRkFfU3VibWl0OjpTZXRTdWJtaXRGb3JtYXQoaW50MzJfdCBpU3VibWl0Rm9ybWF0KSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChYRkFfQVRUUklCVVRFRU5VTSlpU3VibWl0Rm9ybWF0KTsNCiB9DQotRlhfQk9PTCBDWEZBX1N1Ym1pdDo6U2V0U3VibWl0VGFyZ2V0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1RhcmdldCwgd3NUYXJnZXQpOw0KK0ZYX0JPT0wgQ1hGQV9TdWJtaXQ6OlNldFN1Ym1pdFRhcmdldChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1RhcmdldCwgd3NUYXJnZXQpOw0KIH0NCi1GWF9CT09MIENYRkFfU3VibWl0OjpTZXRTdWJtaXRUZXh0RW5jb2RpbmcoWEZBX1RFWFRFTkNPRElORyBlVGV4dEVuY29kaW5nKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCi0gICAgc3dpdGNoIChlVGV4dEVuY29kaW5nKSB7DQotICAgICAgICBjYXNlICBYRkFfVEVYVEVOQ09ESU5HX0JpZzU6DQotICAgICAgICAgICAgd3NWYWx1ZSA9IEwiQmlnLUZpdmUiOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0ZvbnRTcGVjaWZpYzoNCi0gICAgICAgICAgICB3c1ZhbHVlID0gTCJmb250U3BlY2lmaWMiOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0dCSzoNCi0gICAgICAgICAgICB3c1ZhbHVlID0gTCJHQksiOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0dCMTgwMzA6DQotICAgICAgICAgICAgd3NWYWx1ZSA9IEwiR0ItMTgwMzAiOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0dCMjMxMjoNCi0gICAgICAgICAgICB3c1ZhbHVlID0gTCJHQi0yMzEyIjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19JU084ODU5Tk46DQotICAgICAgICAgICAgd3NWYWx1ZSA9IEwiSVNPLTg4NTktTk4iOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0tTQzU2MDE6DQotICAgICAgICAgICAgd3NWYWx1ZSA9IEwiS1NDLTU2MDEiOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX1NoaWZ0SklTOg0KLSAgICAgICAgICAgIHdzVmFsdWUgPSBMIlNoaWZ0LUpJUyI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9URVhURU5DT0RJTkdfVUNTMjoNCi0gICAgICAgICAgICB3c1ZhbHVlID0gTCJVQ1MtMiI7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9URVhURU5DT0RJTkdfVVRGMTY6DQotICAgICAgICAgICAgd3NWYWx1ZSA9IEwiVVRGLTE2IjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19VVEY4Og0KLSAgICAgICAgICAgIHdzVmFsdWUgPSBMIlVURi04IjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVGV4dEVuY29kaW5nLCB3c1ZhbHVlKTsNCitGWF9CT09MIENYRkFfU3VibWl0OjpTZXRTdWJtaXRUZXh0RW5jb2RpbmcoWEZBX1RFWFRFTkNPRElORyBlVGV4dEVuY29kaW5nKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgc3dpdGNoIChlVGV4dEVuY29kaW5nKSB7DQorICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19CaWc1Og0KKyAgICAgIHdzVmFsdWUgPSBMIkJpZy1GaXZlIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0ZvbnRTcGVjaWZpYzoNCisgICAgICB3c1ZhbHVlID0gTCJmb250U3BlY2lmaWMiOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9URVhURU5DT0RJTkdfR0JLOg0KKyAgICAgIHdzVmFsdWUgPSBMIkdCSyI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19HQjE4MDMwOg0KKyAgICAgIHdzVmFsdWUgPSBMIkdCLTE4MDMwIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0dCMjMxMjoNCisgICAgICB3c1ZhbHVlID0gTCJHQi0yMzEyIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0lTTzg4NTlOTjoNCisgICAgICB3c1ZhbHVlID0gTCJJU08tODg1OS1OTiI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19LU0M1NjAxOg0KKyAgICAgIHdzVmFsdWUgPSBMIktTQy01NjAxIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX1NoaWZ0SklTOg0KKyAgICAgIHdzVmFsdWUgPSBMIlNoaWZ0LUpJUyI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19VQ1MyOg0KKyAgICAgIHdzVmFsdWUgPSBMIlVDUy0yIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX1VURjE2Og0KKyAgICAgIHdzVmFsdWUgPSBMIlVURi0xNiI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19VVEY4Og0KKyAgICAgIHdzVmFsdWUgPSBMIlVURi04IjsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1RleHRFbmNvZGluZywgd3NWYWx1ZSk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9TdWJtaXQ6OlNldFN1Ym1pdFhEUENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsIHdzQ29udGVudCk7DQorRlhfQk9PTCBDWEZBX1N1Ym1pdDo6U2V0U3VibWl0WERQQ29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50KSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9YZHBDb250ZW50LCB3c0NvbnRlbnQpOw0KIH0NCi1YRkFfRUxFTUVOVCBDWEZBX1ZhbHVlOjpHZXRDaGlsZFZhbHVlQ2xhc3NJRCgpDQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBYRkFfRUxFTUVOVF9VTktOT1dOOw0KLSAgICB9DQotICAgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSB7DQotICAgICAgICByZXR1cm4gcE5vZGUtPkdldENsYXNzSUQoKTsNCi0gICAgfQ0KK1hGQV9FTEVNRU5UIENYRkFfVmFsdWU6OkdldENoaWxkVmFsdWVDbGFzc0lEKCkgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQogICAgIHJldHVybiBYRkFfRUxFTUVOVF9VTktOT1dOOw0KKyAgfQ0KKyAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgcmV0dXJuIHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICB9DQorICByZXR1cm4gWEZBX0VMRU1FTlRfVU5LTk9XTjsNCiB9DQotRlhfQk9PTCBDWEZBX1ZhbHVlOjpHZXRDaGlsZFZhbHVlQ29udGVudChDRlhfV2lkZVN0cmluZyAmd3NDb250ZW50KQ0KLXsNCi0gICAgaWYgKCFtX3BOb2RlKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCi0gICAgICAgIHJldHVybiBwTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KLSAgICB9DQorRlhfQk9PTCBDWEZBX1ZhbHVlOjpHZXRDaGlsZFZhbHVlQ29udGVudChDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50KSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgcmV0dXJuIHBOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUNYRkFfQXJjIENYRkFfVmFsdWU6OkdldEFyYygpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZSA/IENYRkFfQXJjKG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgOiBOVUxMOw0KK0NYRkFfQXJjIENYRkFfVmFsdWU6OkdldEFyYygpIHsNCisgIHJldHVybiBtX3BOb2RlID8gQ1hGQV9BcmMobV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKQ0KKyAgICAgICAgICAgICAgICAgOiBOVUxMOw0KIH0NCi1DWEZBX0xpbmUgQ1hGQV9WYWx1ZTo6R2V0TGluZSgpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZSA/IENYRkFfTGluZShtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIDogTlVMTDsNCitDWEZBX0xpbmUgQ1hGQV9WYWx1ZTo6R2V0TGluZSgpIHsNCisgIHJldHVybiBtX3BOb2RlID8gQ1hGQV9MaW5lKG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkNCisgICAgICAgICAgICAgICAgIDogTlVMTDsNCiB9DQotQ1hGQV9SZWN0YW5nbGUgQ1hGQV9WYWx1ZTo6R2V0UmVjdGFuZ2xlKCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlID8gQ1hGQV9SZWN0YW5nbGUobV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSA6IE5VTEw7DQorQ1hGQV9SZWN0YW5nbGUgQ1hGQV9WYWx1ZTo6R2V0UmVjdGFuZ2xlKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUgPyBDWEZBX1JlY3RhbmdsZShtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpDQorICAgICAgICAgICAgICAgICA6IE5VTEw7DQogfQ0KLUNYRkFfVGV4dCBDWEZBX1ZhbHVlOjpHZXRUZXh0KCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlID8gQ1hGQV9UZXh0KG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgOiBOVUxMOw0KK0NYRkFfVGV4dCBDWEZBX1ZhbHVlOjpHZXRUZXh0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUgPyBDWEZBX1RleHQobV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKQ0KKyAgICAgICAgICAgICAgICAgOiBOVUxMOw0KIH0NCi1DWEZBX0V4RGF0YSBDWEZBX1ZhbHVlOjpHZXRFeERhdGEoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUgPyBDWEZBX0V4RGF0YShtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIDogTlVMTDsNCitDWEZBX0V4RGF0YSBDWEZBX1ZhbHVlOjpHZXRFeERhdGEoKSB7DQorICByZXR1cm4gbV9wTm9kZSA/IENYRkFfRXhEYXRhKG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkNCisgICAgICAgICAgICAgICAgIDogTlVMTDsNCiB9DQotQ1hGQV9JbWFnZSBDWEZBX1ZhbHVlOjpHZXRJbWFnZSgpDQotew0KLSAgICByZXR1cm4gQ1hGQV9JbWFnZShtX3BOb2RlID8gKG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgOiBOVUxMLCBUUlVFKTsNCitDWEZBX0ltYWdlIENYRkFfVmFsdWU6OkdldEltYWdlKCkgew0KKyAgcmV0dXJuIENYRkFfSW1hZ2UoDQorICAgICAgbV9wTm9kZSA/IChtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIDogTlVMTCwgVFJVRSk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9WYWx1ZTo6U2V0Q2hpbGRWYWx1ZUNvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwgRlhfQk9PTCBiTm90aWZ5ICwgWEZBX0VMRU1FTlQgaVR5cGUgKQ0KLXsNCi0gICAgaWYgKCFtX3BOb2RlKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorRlhfQk9PTCBDWEZBX1ZhbHVlOjpTZXRDaGlsZFZhbHVlQ29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgaVR5cGUpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICBpZiAoaVR5cGUgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICBpZiAoIXBOb2RlKSB7DQotICAgICAgICBpZiAoaVR5cGUgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgaVR5cGUpOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Q29udGVudCh3c0NvbnRlbnQpOw0KLSAgICBDWEZBX1dpZGdldERhdGEqIHBDb250YWluZXJXaWRnZXREYXRhID0gcE5vZGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCi0gICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQotICAgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzQ29udGVudCwgd3NGb3JtYXRDb250ZW50KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcE5vZGUtPlNldENvbnRlbnQod3NDb250ZW50LCB3c0Zvcm1hdENvbnRlbnQsIGJOb3RpZnkpOw0KKyAgICBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIGlUeXBlKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IHBOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQorICBpZiAocENvbnRhaW5lcldpZGdldERhdGEpIHsNCisgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c0NvbnRlbnQsIHdzRm9ybWF0Q29udGVudCk7DQorICB9DQorICByZXR1cm4gcE5vZGUtPlNldENvbnRlbnQod3NDb250ZW50LCB3c0Zvcm1hdENvbnRlbnQsIGJOb3RpZnkpOw0KIH0NCi1pbnQzMl90IENYRkFfTGluZTo6R2V0SGFuZCgpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hhbmQpOw0KK2ludDMyX3QgQ1hGQV9MaW5lOjpHZXRIYW5kKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IYW5kKTsNCiB9DQotRlhfQk9PTCBDWEZBX0xpbmU6OkdldFNsb3AoKQ0KLXsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZVNsb3AgPSBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfU2xvcGUpOw0KLSAgICByZXR1cm4gKGVTbG9wID09IFhGQV9BVFRSSUJVVEVFTlVNX1NsYXNoKSA/IFRSVUUgOiBGQUxTRTsNCitGWF9CT09MIENYRkFfTGluZTo6R2V0U2xvcCgpIHsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVTbG9wID0gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1Nsb3BlKTsNCisgIHJldHVybiAoZVNsb3AgPT0gWEZBX0FUVFJJQlVURUVOVU1fU2xhc2gpID8gVFJVRSA6IEZBTFNFOw0KIH0NCi1DWEZBX0VkZ2UgQ1hGQV9MaW5lOjpHZXRFZGdlKCkNCi17DQotICAgIHJldHVybiBDWEZBX0VkZ2UobV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRWRnZSkpOw0KK0NYRkFfRWRnZSBDWEZBX0xpbmU6OkdldEVkZ2UoKSB7DQorICByZXR1cm4gQ1hGQV9FZGdlKG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0VkZ2UpKTsNCiB9DQotRlhfQk9PTCBDWEZBX0xpbmU6OlNldEhhbmQoaW50MzJfdCBpSGFuZCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfSGFuZCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlIYW5kKTsNCitGWF9CT09MIENYRkFfTGluZTo6U2V0SGFuZChpbnQzMl90IGlIYW5kKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0hhbmQsIChYRkFfQVRUUklCVVRFRU5VTSlpSGFuZCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9MaW5lOjpTZXRTbG9wKGludDMyX3QgaVNsb3ApDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1Nsb3BlLCAoWEZBX0FUVFJJQlVURUVOVU0paVNsb3ApOw0KK0ZYX0JPT0wgQ1hGQV9MaW5lOjpTZXRTbG9wKGludDMyX3QgaVNsb3ApIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfU2xvcGUsIChYRkFfQVRUUklCVVRFRU5VTSlpU2xvcCk7DQogfQ0KLUNYRkFfVGV4dDo6Q1hGQV9UZXh0KENYRkFfTm9kZSogcE5vZGUpDQotICAgIDogQ1hGQV9EYXRhKHBOb2RlKQ0KLXsNCitDWEZBX1RleHQ6OkNYRkFfVGV4dChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCit2b2lkIENYRkFfVGV4dDo6R2V0TmFtZShDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgew0KKyAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KIH0NCi12b2lkIENYRkFfVGV4dDo6R2V0TmFtZShDRlhfV2lkZVN0cmluZ0MgJndzTmFtZSkNCi17DQotICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCitpbnQzMl90IENYRkFfVGV4dDo6R2V0TWF4Q2hhcnMoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01heENoYXJzKTsNCiB9DQotaW50MzJfdCBDWEZBX1RleHQ6OkdldE1heENoYXJzKCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4Q2hhcnMpOw0KK3ZvaWQgQ1hGQV9UZXh0OjpHZXRSaWQoQ0ZYX1dpZGVTdHJpbmdDJiB3c1JpZCkgew0KKyAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9SaWQsIHdzUmlkKTsNCiB9DQotdm9pZCBDWEZBX1RleHQ6OkdldFJpZChDRlhfV2lkZVN0cmluZ0MgJndzUmlkKQ0KLXsNCi0gICAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9SaWQsIHdzUmlkKTsNCit2b2lkIENYRkFfVGV4dDo6R2V0Q29udGVudChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBtX3BOb2RlLT5UcnlDb250ZW50KHdzVGV4dCk7DQogfQ0KLXZvaWQgQ1hGQV9UZXh0OjpHZXRDb250ZW50KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICBtX3BOb2RlLT5UcnlDb250ZW50KHdzVGV4dCk7DQordm9pZCBDWEZBX1RleHQ6OlNldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0LCBGWF9CT09MIGJOb3RpZnkpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NUZXh0KTsNCisgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBtX3BOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQorICBpZiAocENvbnRhaW5lcldpZGdldERhdGEpIHsNCisgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1RleHQsIHdzRm9ybWF0VmFsdWUpOw0KKyAgfQ0KKyAgbV9wTm9kZS0+U2V0Q29udGVudCh3c1RleHQsIHdzRm9ybWF0VmFsdWUsIGJOb3RpZnkpOw0KIH0NCi12b2lkIENYRkFfVGV4dDo6U2V0Q29udGVudChDRlhfV2lkZVN0cmluZyB3c1RleHQsIEZYX0JPT0wgYk5vdGlmeSApDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzVGV4dCk7DQotICAgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBtX3BOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQotICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1RleHQsIHdzRm9ybWF0VmFsdWUpOw0KLSAgICB9DQotICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NUZXh0LCB3c0Zvcm1hdFZhbHVlLCBiTm90aWZ5KTsNCitGWF9CT09MIENYRkFfVGV4dDo6U2V0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KIH0NCi1GWF9CT09MIENYRkFfVGV4dDo6U2V0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCitGWF9CT09MIENYRkFfVGV4dDo6U2V0TWF4Q2hhcnMoaW50MzJfdCBpTWF4Q2hhcnMpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4Q2hhcnMsIGlNYXhDaGFycyk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9UZXh0OjpTZXRNYXhDaGFycyhpbnQzMl90IGlNYXhDaGFycykNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4Q2hhcnMsIGlNYXhDaGFycyk7DQorRlhfQk9PTCBDWEZBX1RleHQ6OlNldFJpZChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSaWQpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1JpZCwgd3NSaWQpOw0KIH0NCi1GWF9CT09MIENYRkFfVGV4dDo6U2V0UmlkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JpZCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1JpZCwgd3NSaWQpOw0KK0NYRkFfRXhEYXRhOjpDWEZBX0V4RGF0YShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCit2b2lkIENYRkFfRXhEYXRhOjpHZXRDb250ZW50VHlwZShDRlhfV2lkZVN0cmluZ0MmIHdzQ29udGVudFR5cGUpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KIH0NCi1DWEZBX0V4RGF0YTo6Q1hGQV9FeERhdGEoQ1hGQV9Ob2RlKiBwTm9kZSkNCi0gICAgOiBDWEZBX0RhdGEocE5vZGUpDQotew0KK3ZvaWQgQ1hGQV9FeERhdGE6OkdldEhyZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c0hyZWYpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfSHJlZiwgd3NIcmVmKTsNCiB9DQotdm9pZCBDWEZBX0V4RGF0YTo6R2V0Q29udGVudFR5cGUoQ0ZYX1dpZGVTdHJpbmdDICZ3c0NvbnRlbnRUeXBlKQ0KLXsNCi0gICAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQoraW50MzJfdCBDWEZBX0V4RGF0YTo6R2V0TWF4TGVuZ3RoKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgpOw0KIH0NCi12b2lkIENYRkFfRXhEYXRhOjpHZXRIcmVmKENGWF9XaWRlU3RyaW5nQyAmd3NIcmVmKQ0KLXsNCi0gICAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9IcmVmLCB3c0hyZWYpOw0KK3ZvaWQgQ1hGQV9FeERhdGE6OkdldFJpZChDRlhfV2lkZVN0cmluZ0MmIHdzUmlkKSB7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1JpZCwgd3NSaWQpOw0KIH0NCi1pbnQzMl90IENYRkFfRXhEYXRhOjpHZXRNYXhMZW5ndGgoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgpOw0KK2ludDMyX3QgQ1hGQV9FeERhdGE6OkdldFRyYW5zZmVyRW5jb2RpbmcoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcpOw0KIH0NCi12b2lkIENYRkFfRXhEYXRhOjpHZXRSaWQoQ0ZYX1dpZGVTdHJpbmdDICZ3c1JpZCkNCi17DQotICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUmlkLCB3c1JpZCk7DQordm9pZCBDWEZBX0V4RGF0YTo6R2V0Q29udGVudChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBtX3BOb2RlLT5UcnlDb250ZW50KHdzVGV4dCk7DQogfQ0KLWludDMyX3QgQ1hGQV9FeERhdGE6OkdldFRyYW5zZmVyRW5jb2RpbmcoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nKTsNCitGWF9CT09MIENYRkFfRXhEYXRhOjpTZXRDb250ZW50VHlwZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KIH0NCi12b2lkIENYRkFfRXhEYXRhOjpHZXRDb250ZW50KENGWF9XaWRlU3RyaW5nICZ3c1RleHQpDQotew0KLSAgICBtX3BOb2RlLT5UcnlDb250ZW50KHdzVGV4dCk7DQorRlhfQk9PTCBDWEZBX0V4RGF0YTo6U2V0SHJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NIcmVmKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9IcmVmLCB3c0hyZWYpOw0KIH0NCi1GWF9CT09MIENYRkFfRXhEYXRhOjpTZXRDb250ZW50VHlwZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCitGWF9CT09MIENYRkFfRXhEYXRhOjpTZXRNYXhMZW5ndGgoaW50MzJfdCBpTWF4TGVuZ3RoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01heExlbmd0aCwgaU1heExlbmd0aCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9FeERhdGE6OlNldEhyZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSHJlZikNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0hyZWYsIHdzSHJlZik7DQorRlhfQk9PTCBDWEZBX0V4RGF0YTo6U2V0UmlkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JpZCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfUmlkLCB3c1JpZCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9FeERhdGE6OlNldE1heExlbmd0aChpbnQzMl90IGlNYXhMZW5ndGgpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01heExlbmd0aCwgaU1heExlbmd0aCk7DQorRlhfQk9PTCBDWEZBX0V4RGF0YTo6U2V0VHJhbnNmZXJFbmNvZGluZyhpbnQzMl90IGlUcmFuc2ZlckVuY29kaW5nKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoWEZBX0FUVFJJQlVURUVOVU0paVRyYW5zZmVyRW5jb2RpbmcpOw0KIH0NCi1GWF9CT09MIENYRkFfRXhEYXRhOjpTZXRSaWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmlkKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfUmlkLCB3c1JpZCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9FeERhdGE6OlNldFRyYW5zZmVyRW5jb2RpbmcoaW50MzJfdCBpVHJhbnNmZXJFbmNvZGluZykNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgKFhGQV9BVFRSSUJVVEVFTlVNKWlUcmFuc2ZlckVuY29kaW5nKTsNCi19DQotRlhfQk9PTCBDWEZBX0V4RGF0YTo6U2V0Q29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LCBGWF9CT09MIGJOb3RpZnkgLCAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LCBGWF9CT09MIGJTeW5jRGF0YSApDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzVGV4dCk7DQotICAgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBtX3BOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQotICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1RleHQsIHdzRm9ybWF0VmFsdWUpOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDb250ZW50KHdzVGV4dCwgd3NGb3JtYXRWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgYlN5bmNEYXRhKTsNCitGWF9CT09MIENYRkFfRXhEYXRhOjpTZXRDb250ZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW5jRGF0YSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c1RleHQpOw0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IG1fcE5vZGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KKyAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVGV4dCwgd3NGb3JtYXRWYWx1ZSk7DQorICB9DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q29udGVudCh3c1RleHQsIHdzRm9ybWF0VmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3luY0RhdGEpOw0KIH0NCiBDWEZBX0ltYWdlOjpDWEZBX0ltYWdlKENYRkFfTm9kZSogcE5vZGUsIEZYX0JPT0wgYkRlZlZhbHVlKQ0KLSAgICA6IENYRkFfRGF0YShwTm9kZSkNCi0gICAgLCBtX2JEZWZWYWx1ZShiRGVmVmFsdWUpDQotew0KKyAgICA6IENYRkFfRGF0YShwTm9kZSksIG1fYkRlZlZhbHVlKGJEZWZWYWx1ZSkge30NCitpbnQzMl90IENYRkFfSW1hZ2U6OkdldEFzcGVjdCgpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQXNwZWN0KTsNCiB9DQotaW50MzJfdCBDWEZBX0ltYWdlOjpHZXRBc3BlY3QoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9Bc3BlY3QpOw0KK0ZYX0JPT0wgQ1hGQV9JbWFnZTo6R2V0Q29udGVudFR5cGUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUpIHsNCisgIHJldHVybiBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCiB9DQotRlhfQk9PTCBDWEZBX0ltYWdlOjpHZXRDb250ZW50VHlwZShDRlhfV2lkZVN0cmluZyAmd3NDb250ZW50VHlwZSkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCitGWF9CT09MIENYRkFfSW1hZ2U6OkdldEhyZWYoQ0ZYX1dpZGVTdHJpbmcmIHdzSHJlZikgew0KKyAgaWYgKG1fYkRlZlZhbHVlKSB7DQorICAgIHJldHVybiBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0hyZWYsIHdzSHJlZik7DQorICB9DQorICByZXR1cm4gbV9wTm9kZS0+R2V0QXR0cmlidXRlKEZYX1dTVFJDKEwiaHJlZiIpLCB3c0hyZWYpOw0KIH0NCi1GWF9CT09MIENYRkFfSW1hZ2U6OkdldEhyZWYoQ0ZYX1dpZGVTdHJpbmcgJndzSHJlZikNCi17DQotICAgIGlmIChtX2JEZWZWYWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIAltX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0hyZWYsIHdzSHJlZik7DQoraW50MzJfdCBDWEZBX0ltYWdlOjpHZXRUcmFuc2ZlckVuY29kaW5nKCkgew0KKyAgaWYgKG1fYkRlZlZhbHVlKSB7DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZyk7DQorICB9DQorICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQmFzZTY0Ow0KK30NCitGWF9CT09MIENYRkFfSW1hZ2U6OkdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlRyeUNvbnRlbnQod3NUZXh0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ltYWdlOjpTZXRBc3BlY3QoaW50MzJfdCBpQXNwZWN0KSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0FzcGVjdCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlBc3BlY3QpOw0KK30NCitGWF9CT09MIENYRkFfSW1hZ2U6OlNldENvbnRlbnRUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JbWFnZTo6U2V0SHJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NIcmVmKSB7DQorICBpZiAobV9iRGVmVmFsdWUpIHsNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfSHJlZiwgd3NIcmVmKTsNCisgIH0NCisgIHJldHVybiBtX3BOb2RlLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9IcmVmLCB3c0hyZWYpOw0KK30NCitGWF9CT09MIENYRkFfSW1hZ2U6OlNldFRyYW5zZmVyRW5jb2RpbmcoaW50MzJfdCBpVHJhbnNmZXJFbmNvZGluZykgew0KKyAgaWYgKG1fYkRlZlZhbHVlKSB7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhGQV9BVFRSSUJVVEVFTlVNKWlUcmFuc2ZlckVuY29kaW5nKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfSW1hZ2U6OlNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c1RleHQpOw0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IG1fcE5vZGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KKyAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVGV4dCwgd3NGb3JtYXRWYWx1ZSk7DQorICB9DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q29udGVudCh3c1RleHQsIHdzRm9ybWF0VmFsdWUpOw0KK30NCitDWEZBX0NhbGN1bGF0ZTo6Q1hGQV9DYWxjdWxhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQoraW50MzJfdCBDWEZBX0NhbGN1bGF0ZTo6R2V0T3ZlcnJpZGUoKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ID0gWEZBX0FUVFJJQlVURUVOVU1fRXJyb3I7DQorICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsIGVBdHQsIEZBTFNFKTsNCisgIHJldHVybiBlQXR0Ow0KK30NCitDWEZBX1NjcmlwdCBDWEZBX0NhbGN1bGF0ZTo6R2V0U2NyaXB0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1NjcmlwdCk7DQorfQ0KK3ZvaWQgQ1hGQV9DYWxjdWxhdGU6OkdldE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWVzc2FnZSkpIHsNCisgICAgQ1hGQV9UZXh0IHRleHQocE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1RleHQpKTsNCisgICAgaWYgKHRleHQpIHsNCisgICAgICB0ZXh0LkdldENvbnRlbnQod3NNZXNzYWdlKTsNCiAgICAgfQ0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0QXR0cmlidXRlKEZYX1dTVFJDKEwiaHJlZiIpLCB3c0hyZWYpOw0KKyAgfQ0KIH0NCi1pbnQzMl90IENYRkFfSW1hZ2U6OkdldFRyYW5zZmVyRW5jb2RpbmcoKQ0KLXsNCi0gICAgaWYgKG1fYkRlZlZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcpOw0KLSAgICB9DQotICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9CYXNlNjQ7DQorRlhfQk9PTCBDWEZBX0NhbGN1bGF0ZTo6U2V0T3ZlcnJpZGUoaW50MzJfdCBpT3ZlcnJpZGUpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsIChYRkFfQVRUUklCVVRFRU5VTSlpT3ZlcnJpZGUpOw0KIH0NCi1GWF9CT09MIENYRkFfSW1hZ2U6OkdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcgJndzVGV4dCkNCi17DQotICAgIHJldHVybiAJbV9wTm9kZS0+VHJ5Q29udGVudCh3c1RleHQpOw0KK0ZYX0JPT0wgQ1hGQV9DYWxjdWxhdGU6OlNldE1lc3NhZ2VUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWVzc2FnZSkpIHsNCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1RleHQpOw0KKyAgICByZXR1cm4gcENoaWxkTm9kZS0+U2V0Q29udGVudCh3c01lc3NhZ2UsIHdzTWVzc2FnZSk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wgQ1hGQV9JbWFnZTo6U2V0QXNwZWN0KGludDMyX3QgaUFzcGVjdCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQXNwZWN0LCAoWEZBX0FUVFJJQlVURUVOVU0paUFzcGVjdCk7DQorQ1hGQV9WYWxpZGF0ZTo6Q1hGQV9WYWxpZGF0ZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCitpbnQzMl90IENYRkFfVmFsaWRhdGU6OkdldEZvcm1hdFRlc3QoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0Zvcm1hdFRlc3QpOw0KIH0NCi1GWF9CT09MIENYRkFfSW1hZ2U6OlNldENvbnRlbnRUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KK0ZYX0JPT0wgQ1hGQV9WYWxpZGF0ZTo6U2V0VGVzdFZhbHVlKGludDMyX3QgaVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZU5hbWUpIHsNCisgIFhGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBwSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVFbnVtQnlOYW1lKHdzVmFsdWUpOw0KKyAgaWYgKHBJbmZvKSB7DQorICAgIGVOYW1lID0gcEluZm8tPmVOYW1lOw0KKyAgfQ0KKyAgbV9wTm9kZS0+U2V0RW51bSgoWEZBX0FUVFJJQlVURSlpVHlwZSwgZU5hbWUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENYRkFfSW1hZ2U6OlNldEhyZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSHJlZikNCi17DQotICAgIGlmIChtX2JEZWZWYWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIAltX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0hyZWYsIHdzSHJlZik7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0hyZWYsIHdzSHJlZik7DQorRlhfQk9PTCBDWEZBX1ZhbGlkYXRlOjpTZXRGb3JtYXRUZXN0KENGWF9XaWRlU3RyaW5nIHdzVmFsdWUpIHsNCisgIHJldHVybiBTZXRUZXN0VmFsdWUoWEZBX0FUVFJJQlVURV9Gb3JtYXRUZXN0LCB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9XYXJuaW5nKTsNCiB9DQotRlhfQk9PTCBDWEZBX0ltYWdlOjpTZXRUcmFuc2ZlckVuY29kaW5nKGludDMyX3QgaVRyYW5zZmVyRW5jb2RpbmcpDQotew0KLSAgICBpZiAobV9iRGVmVmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgKFhGQV9BVFRSSUJVVEVFTlVNKWlUcmFuc2ZlckVuY29kaW5nKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENYRkFfVmFsaWRhdGU6OlNldE51bGxUZXN0KENGWF9XaWRlU3RyaW5nIHdzVmFsdWUpIHsNCisgIHJldHVybiBTZXRUZXN0VmFsdWUoWEZBX0FUVFJJQlVURV9OdWxsVGVzdCwgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQpOw0KIH0NCi1GWF9CT09MIENYRkFfSW1hZ2U6OlNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NUZXh0KTsNCi0gICAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IG1fcE5vZGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCi0gICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQotICAgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVGV4dCwgd3NGb3JtYXRWYWx1ZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldENvbnRlbnQod3NUZXh0LCB3c0Zvcm1hdFZhbHVlKTsNCitpbnQzMl90IENYRkFfVmFsaWRhdGU6OkdldE51bGxUZXN0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9OdWxsVGVzdCk7DQogfQ0KLUNYRkFfQ2FsY3VsYXRlOjpDWEZBX0NhbGN1bGF0ZShDWEZBX05vZGUqIHBOb2RlKQ0KLSAgICA6IENYRkFfRGF0YShwTm9kZSkNCi17DQoraW50MzJfdCBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHRUZXN0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9TY3JpcHRUZXN0KTsNCiB9DQotaW50MzJfdCBDWEZBX0NhbGN1bGF0ZTo6R2V0T3ZlcnJpZGUoKQ0KLXsNCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dCA9IFhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yOw0KLSAgICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsIGVBdHQsIEZBTFNFKTsNCi0gICAgcmV0dXJuIGVBdHQ7DQotfQ0KLUNYRkFfU2NyaXB0IENYRkFfQ2FsY3VsYXRlOjpHZXRTY3JpcHQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1NjcmlwdCk7DQotfQ0KLXZvaWQgQ1hGQV9DYWxjdWxhdGU6OkdldE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nICZ3c01lc3NhZ2UpDQotew0KLSAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX01lc3NhZ2UpKSB7DQotICAgICAgICBDWEZBX1RleHQgdGV4dChwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVGV4dCkpOw0KLSAgICAgICAgaWYgKHRleHQpIHsNCi0gICAgICAgICAgICB0ZXh0LkdldENvbnRlbnQod3NNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi1GWF9CT09MIENYRkFfQ2FsY3VsYXRlOjpTZXRPdmVycmlkZShpbnQzMl90IGlPdmVycmlkZSkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsIChYRkFfQVRUUklCVVRFRU5VTSlpT3ZlcnJpZGUpOw0KLX0NCi1GWF9CT09MIENYRkFfQ2FsY3VsYXRlOjpTZXRNZXNzYWdlVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlKQ0KLXsNCi0gICAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9NZXNzYWdlKSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1RleHQpOw0KLSAgICAgICAgcmV0dXJuIHBDaGlsZE5vZGUtPlNldENvbnRlbnQod3NNZXNzYWdlLCB3c01lc3NhZ2UpOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotQ1hGQV9WYWxpZGF0ZTo6Q1hGQV9WYWxpZGF0ZShDWEZBX05vZGUqIHBOb2RlKQ0KLSAgICA6IENYRkFfRGF0YShwTm9kZSkNCi17DQotfQ0KLWludDMyX3QgQ1hGQV9WYWxpZGF0ZTo6R2V0Rm9ybWF0VGVzdCgpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0Zvcm1hdFRlc3QpOw0KLX0NCi1GWF9CT09MIENYRkFfVmFsaWRhdGU6OlNldFRlc3RWYWx1ZShpbnQzMl90IGlUeXBlLCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSwgWEZBX0FUVFJJQlVURUVOVU0gZU5hbWUpDQotew0KLSAgICBYRkFfTFBDQVRUUklCVVRFRU5VTUlORk8gcEluZm8gPSBYRkFfR2V0QXR0cmlidXRlRW51bUJ5TmFtZSh3c1ZhbHVlKTsNCi0gICAgaWYgKHBJbmZvKSB7DQotICAgICAgICBlTmFtZSA9IHBJbmZvLT5lTmFtZTsNCi0gICAgfQ0KLSAgICBtX3BOb2RlLT5TZXRFbnVtKChYRkFfQVRUUklCVVRFKWlUeXBlLCBlTmFtZSwgRkFMU0UpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX1ZhbGlkYXRlOjpTZXRGb3JtYXRUZXN0KENGWF9XaWRlU3RyaW5nIHdzVmFsdWUpDQotew0KLSAgICByZXR1cm4gU2V0VGVzdFZhbHVlKFhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwgd3NWYWx1ZSwgWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZyk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9WYWxpZGF0ZTo6U2V0TnVsbFRlc3QoQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSkNCi17DQotICAgIHJldHVybiBTZXRUZXN0VmFsdWUoWEZBX0FUVFJJQlVURV9OdWxsVGVzdCwgd3NWYWx1ZSwgWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQpOw0KLX0NCi1pbnQzMl90IENYRkFfVmFsaWRhdGU6OkdldE51bGxUZXN0KCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTnVsbFRlc3QpOw0KLX0NCi1pbnQzMl90IENYRkFfVmFsaWRhdGU6OkdldFNjcmlwdFRlc3QoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9TY3JpcHRUZXN0KTsNCi19DQotdm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVzc2FnZVR5cGUpDQotew0KLSAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX01lc3NhZ2UsIEZBTFNFKSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlICpwSXRlbU5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgZm9yICg7IHBJdGVtTm9kZTsgcEl0ZW1Ob2RlID0gcEl0ZW1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgaWYgKHBJdGVtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1RleHQpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWU7DQotICAgICAgICAgICAgcEl0ZW1Ob2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQotICAgICAgICAgICAgaWYgKHdzTmFtZS5Jc0VtcHR5KCkgfHwgd3NOYW1lID09IHdzTWVzc2FnZVR5cGUpIHsNCi0gICAgICAgICAgICAgICAgcEl0ZW1Ob2RlLT5UcnlDb250ZW50KHdzTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQotdm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXRGb3JtYXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpDQotew0KLSAgICBTZXRNZXNzYWdlVGV4dCh3c01lc3NhZ2UsIEZYX1dTVFJDKEwiZm9ybWF0VGVzdCIpKTsNCi19DQotdm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRGb3JtYXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlKQ0KLXsNCi0gICAgR2V0TWVzc2FnZVRleHQod3NNZXNzYWdlLCBGWF9XU1RSQyhMImZvcm1hdFRlc3QiKSk7DQotfQ0KLXZvaWQgQ1hGQV9WYWxpZGF0ZTo6U2V0TnVsbE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSkNCi17DQotICAgIFNldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSwgRlhfV1NUUkMoTCJudWxsVGVzdCIpKTsNCi19DQotdm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXROdWxsTWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgJndzTWVzc2FnZSkNCi17DQotICAgIEdldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSwgRlhfV1NUUkMoTCJudWxsVGVzdCIpKTsNCi19DQotdm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVzc2FnZVR5cGUpDQotew0KLSAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX01lc3NhZ2UsIFRSVUUpKSB7DQotICAgICAgICBDWEZBX05vZGUgKnBJdGVtTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICBmb3IgKDsgcEl0ZW1Ob2RlOyBwSXRlbU5vZGUgPSBwSXRlbU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICBpZiAocEl0ZW1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfVGV4dCkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsNCi0gICAgICAgICAgICBwSXRlbU5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCi0gICAgICAgICAgICBpZiAod3NOYW1lLklzRW1wdHkoKSB8fCB3c05hbWUgPT0gd3NNZXNzYWdlVHlwZSkgew0KLSAgICAgICAgICAgICAgICBwSXRlbU5vZGUtPlNldENvbnRlbnQod3NNZXNzYWdlLCB3c01lc3NhZ2UsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIENYRkFfTm9kZSogcFRleHROb2RlID0gcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX1RleHQpOw0KLSAgICAgICAgcE5vZGUtPkluc2VydENoaWxkKHBUZXh0Tm9kZSk7DQotICAgICAgICBwVGV4dE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NNZXNzYWdlVHlwZSwgRkFMU0UpOw0KLSAgICAgICAgcFRleHROb2RlLT5TZXRDb250ZW50KHdzTWVzc2FnZSwgd3NNZXNzYWdlLCBGQUxTRSk7DQotICAgIH0NCi19DQotdm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyAmd3NNZXNzYWdlKQ0KLXsNCi0gICAgR2V0TWVzc2FnZVRleHQod3NNZXNzYWdlLCBGWF9XU1RSQyhMInNjcmlwdFRlc3QiKSk7DQotfQ0KLXZvaWQgQ1hGQV9WYWxpZGF0ZTo6U2V0U2NyaXB0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlKQ0KLXsNCi0gICAgU2V0TWVzc2FnZVRleHQod3NNZXNzYWdlLCBGWF9XU1RSQyhMInNjcmlwdFRlc3QiKSk7DQotfQ0KLXZvaWQgQ1hGQV9WYWxpZGF0ZTo6R2V0UGljdHVyZShDRlhfV2lkZVN0cmluZyAmd3NQaWN0dXJlKQ0KLXsNCi0gICAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9QaWN0dXJlKSkgew0KLSAgICAgICAgcE5vZGUtPlRyeUNvbnRlbnQod3NQaWN0dXJlKTsNCi0gICAgfQ0KLX0NCi1DWEZBX1NjcmlwdCBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1NjcmlwdCk7DQotfQ0KLUNYRkFfVmFyaWFibGVzOjpDWEZBX1ZhcmlhYmxlcyhDWEZBX05vZGUqIHBOb2RlKQ0KLSAgICA6IENYRkFfRGF0YShwTm9kZSkNCi17DQotfQ0KLWludDMyX3QgQ1hGQV9WYXJpYWJsZXM6OkNvdW50U2NyaXB0cygpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9TY3JpcHQpOw0KLX0NCi1DWEZBX1NjcmlwdCBDWEZBX1ZhcmlhYmxlczo6R2V0U2NyaXB0KGludDMyX3QgbkluZGV4KQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfU2NyaXB0KTsNCi19DQotQ1hGQV9CaW5kOjpDWEZBX0JpbmQoQ1hGQV9Ob2RlKiBwTm9kZSkNCi0gICAgOiBDWEZBX0RhdGEocE5vZGUpDQotew0KLX0NCi1pbnQzMl90IENYRkFfQmluZDo6R2V0TWF0Y2goKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9NYXRjaCk7DQotfQ0KLXZvaWQgQ1hGQV9CaW5kOjpHZXRSZWYoQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlZikNCi17DQotICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1JlZik7DQotfQ0KLXZvaWQgQ1hGQV9CaW5kOjpHZXRQaWN0dXJlKENGWF9XaWRlU3RyaW5nICZ3c1BpY3R1cmUpDQotew0KLSAgICBpZiAoQ1hGQV9Ob2RlKiBwUGljdHVyZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1BpY3R1cmUpKSB7DQotICAgICAgICBwUGljdHVyZS0+VHJ5Q29udGVudCh3c1BpY3R1cmUpOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgQ1hGQV9CaW5kOjpTZXRNYXRjaChpbnQzMl90IGlNYXRjaCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWF0Y2gsIChYRkFfQVRUUklCVVRFRU5VTSlpTWF0Y2gpOw0KLX0NCi1GWF9CT09MIENYRkFfQmluZDo6U2V0UmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlZikNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1JlZiwgd3NSZWYpOw0KLX0NCi1GWF9CT09MIENYRkFfQmluZDo6U2V0UGljdHVyZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQaWN0dXJlKQ0KLXsNCi0gICAgaWYgKENYRkFfTm9kZSogcFBpY3R1cmUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9QaWN0dXJlKSkgew0KLSAgICAgICAgcmV0dXJuIHBQaWN0dXJlLT5TZXRDb250ZW50KHdzUGljdHVyZSwgd3NQaWN0dXJlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUNYRkFfQXNzaXN0OjpDWEZBX0Fzc2lzdChDWEZBX05vZGUqIHBOb2RlKQ0KLSAgICA6IENYRkFfRGF0YShwTm9kZSkNCi17DQotfQ0KLUNYRkFfVG9vbFRpcCBDWEZBX0Fzc2lzdDo6R2V0VG9vbFRpcCgpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVG9vbFRpcCk7DQotfQ0KLUNYRkFfVG9vbFRpcDo6Q1hGQV9Ub29sVGlwKENYRkFfTm9kZSogcE5vZGUpDQotICAgIDogQ1hGQV9EYXRhKHBOb2RlKQ0KLXsNCi19DQotRlhfQk9PTCBDWEZBX1Rvb2xUaXA6OkdldFRpcChDRlhfV2lkZVN0cmluZyAmd3NUaXApDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+VHJ5Q29udGVudCh3c1RpcCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9Ub29sVGlwOjpTZXRUaXAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGlwKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldENvbnRlbnQod3NUaXAsIHdzVGlwKTsNCi19DQotQ1hGQV9CaW5kSXRlbXM6OkNYRkFfQmluZEl0ZW1zKENYRkFfTm9kZSogcE5vZGUpDQotICAgIDogQ1hGQV9EYXRhKHBOb2RlKQ0KLXsNCi19DQotdm9pZCBDWEZBX0JpbmRJdGVtczo6R2V0Q29ubmVjdGlvbihDRlhfV2lkZVN0cmluZ0MgJndzQ29ubmVjdGlvbikNCi17DQotICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgd3NDb25uZWN0aW9uKTsNCi19DQotdm9pZCBDWEZBX0JpbmRJdGVtczo6R2V0TGFiZWxSZWYoQ0ZYX1dpZGVTdHJpbmdDICZ3c0xhYmVsUmVmKQ0KLXsNCi0gICAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwgd3NMYWJlbFJlZik7DQotfQ0KLXZvaWQgQ1hGQV9CaW5kSXRlbXM6OkdldFZhbHVlUmVmKENGWF9XaWRlU3RyaW5nQyAmd3NWYWx1ZVJlZikNCi17DQotICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWVSZWYsIHdzVmFsdWVSZWYpOw0KLX0NCi12b2lkIENYRkFfQmluZEl0ZW1zOjpHZXRSZWYoQ0ZYX1dpZGVTdHJpbmdDICZ3c1JlZikNCi17DQotICAgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1JlZik7DQotfQ0KLUZYX0JPT0wgQ1hGQV9CaW5kSXRlbXM6OlNldENvbm5lY3Rpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29ubmVjdGlvbikNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIHdzQ29ubmVjdGlvbik7DQotfQ0KLUZYX0JPT0wgQ1hGQV9CaW5kSXRlbXM6OlNldExhYmVsUmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0xhYmVsUmVmKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTGFiZWxSZWYsIHdzTGFiZWxSZWYpOw0KLX0NCi1GWF9CT09MIENYRkFfQmluZEl0ZW1zOjpTZXRWYWx1ZVJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZVJlZikNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLCB3c1ZhbHVlUmVmKTsNCi19DQotRlhfQk9PTCBDWEZBX0JpbmRJdGVtczo6U2V0UmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlZikNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1JlZiwgd3NSZWYpOw0KLX0NCi1pbnQzMl90IENYRkFfQm94OjpHZXRCcmVhaygpIGNvbnN0DQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9DbG9zZTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0JyZWFrKTsNCi19DQotaW50MzJfdCBDWEZBX0JveDo6R2V0SGFuZCgpIGNvbnN0DQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9FdmVuOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSGFuZCk7DQotfQ0KLWludDMyX3QgQ1hGQV9Cb3g6OkdldFByZXNlbmNlKCkgY29uc3QNCi17DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbjsNCi0gICAgfQ0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsNCi19DQotaW50MzJfdCBDWEZBX0JveDo6Q291bnRDb3JuZXJzKCkgY29uc3QNCi17DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfQ29ybmVyKTsNCi19DQotQ1hGQV9Db3JuZXIgQ1hGQV9Cb3g6OkdldENvcm5lcihpbnQzMl90IG5JbmRleCkgY29uc3QNCi17DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIENYRkFfQ29ybmVyKG1fcE5vZGUtPkdldFByb3BlcnR5KG5JbmRleCwgWEZBX0VMRU1FTlRfQ29ybmVyLCBuSW5kZXggPT0gMCkpOw0KLX0NCi1pbnQzMl90IENYRkFfQm94OjpDb3VudEVkZ2VzKCkgY29uc3QNCi17DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfRWRnZSk7DQotfQ0KLUNYRkFfRWRnZSBDWEZBX0JveDo6R2V0RWRnZShpbnQzMl90IG5JbmRleCkgY29uc3QNCi17DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIENYRkFfRWRnZShtX3BOb2RlLT5HZXRQcm9wZXJ0eShuSW5kZXgsIFhGQV9FTEVNRU5UX0VkZ2UsIG5JbmRleCA9PSAwKSk7DQotfQ0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfR2V0U3Ryb2tlcyhDWEZBX05vZGUgKnBOb2RlLCBDWEZBX1N0cm9rZUFycmF5ICZzdHJva2VzLCBGWF9CT09MIGJOVUxMKQ0KLXsNCi0gICAgc3Ryb2tlcy5SZW1vdmVBbGwoKTsNCi0gICAgaWYgKCFwTm9kZSkgew0KK3ZvaWQgQ1hGQV9WYWxpZGF0ZTo6R2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZXNzYWdlVHlwZSkgew0KKyAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9NZXNzYWdlLCBGQUxTRSkpIHsNCisgICAgQ1hGQV9Ob2RlKiBwSXRlbU5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBmb3IgKDsgcEl0ZW1Ob2RlOw0KKyAgICAgICAgIHBJdGVtTm9kZSA9IHBJdGVtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIGlmIChwSXRlbU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9UZXh0KSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsNCisgICAgICBwSXRlbU5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCisgICAgICBpZiAod3NOYW1lLklzRW1wdHkoKSB8fCB3c05hbWUgPT0gd3NNZXNzYWdlVHlwZSkgew0KKyAgICAgICAgcEl0ZW1Ob2RlLT5UcnlDb250ZW50KHdzTWVzc2FnZSk7DQogICAgICAgICByZXR1cm47DQorICAgICAgfQ0KICAgICB9DQotICAgIHN0cm9rZXMuU2V0U2l6ZSg4KTsNCi0gICAgaW50MzJfdCBpLCBqOw0KLSAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDQ7IGkgKyspIHsNCi0gICAgICAgIENYRkFfQ29ybmVyIGNvcm5lciA9IENYRkFfQ29ybmVyKHBOb2RlLT5HZXRQcm9wZXJ0eShpLCBYRkFfRUxFTUVOVF9Db3JuZXIsIGkgPT0gMCkpOw0KLSAgICAgICAgaWYgKGNvcm5lci5Jc0V4aXN0SW5YTUwoKSB8fCBpID09IDApIHsNCi0gICAgICAgICAgICBzdHJva2VzLlNldEF0KGosIGNvcm5lcik7DQotICAgICAgICB9IGVsc2UgaWYgKGJOVUxMKSB7DQotICAgICAgICAgICAgc3Ryb2tlcy5TZXRBdChqLCBOVUxMKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoaSA9PSAxKSB7DQotICAgICAgICAgICAgc3Ryb2tlcy5TZXRBdChqLCBzdHJva2VzWzBdKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoaSA9PSAyKSB7DQotICAgICAgICAgICAgc3Ryb2tlcy5TZXRBdChqLCBzdHJva2VzWzBdKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgc3Ryb2tlcy5TZXRBdChqLCBzdHJva2VzWzJdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGogKys7DQotICAgICAgICBDWEZBX0VkZ2UgZWRnZSA9IENYRkFfRWRnZShwTm9kZS0+R2V0UHJvcGVydHkoaSwgWEZBX0VMRU1FTlRfRWRnZSwgaSA9PSAwKSk7DQotICAgICAgICBpZiAoZWRnZS5Jc0V4aXN0SW5YTUwoKSB8fCBpID09IDApIHsNCi0gICAgICAgICAgICBzdHJva2VzLlNldEF0KGosIGVkZ2UpOw0KLSAgICAgICAgfSBlbHNlIGlmIChiTlVMTCkgew0KLSAgICAgICAgICAgIHN0cm9rZXMuU2V0QXQoaiwgTlVMTCk7DQotICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMSkgew0KLSAgICAgICAgICAgIHN0cm9rZXMuU2V0QXQoaiwgc3Ryb2tlc1sxXSk7DQotICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMikgew0KLSAgICAgICAgICAgIHN0cm9rZXMuU2V0QXQoaiwgc3Ryb2tlc1sxXSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHN0cm9rZXMuU2V0QXQoaiwgc3Ryb2tlc1szXSk7DQotICAgICAgICB9DQotICAgICAgICBqICsrOw0KLSAgICB9DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9Cb3g6OkdldFN0cm9rZXMoQ1hGQV9TdHJva2VBcnJheSAmc3Ryb2tlcykgY29uc3QNCi17DQotICAgIFhGQV9CT1hfR2V0U3Ryb2tlcyhtX3BOb2RlLCBzdHJva2VzLCBGQUxTRSk7DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXRGb3JtYXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpIHsNCisgIFNldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSwgRlhfV1NUUkMoTCJmb3JtYXRUZXN0IikpOw0KIH0NCi1GWF9CT09MIENYRkFfQm94OjpJc0NpcmN1bGFyKCkgY29uc3QNCi17DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BOb2RlLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfQ2lyY3VsYXIpOw0KK3ZvaWQgQ1hGQV9WYWxpZGF0ZTo6R2V0Rm9ybWF0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSkgew0KKyAgR2V0TWVzc2FnZVRleHQod3NNZXNzYWdlLCBGWF9XU1RSQyhMImZvcm1hdFRlc3QiKSk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9Cb3g6OkdldFN0YXJ0QW5nbGUoRlhfRkxPQVQgJmZTdGFydEFuZ2xlKSBjb25zdA0KLXsNCi0gICAgZlN0YXJ0QW5nbGUgPSAwOw0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KLSAgICBGWF9CT09MIGJSZXQgPSBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwgbXMsIEZBTFNFKTsNCi0gICAgaWYgKGJSZXQpIHsNCi0gICAgICAgIGZTdGFydEFuZ2xlID0gbXMuR2V0VmFsdWUoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gYlJldDsNCit2b2lkIENYRkFfVmFsaWRhdGU6OlNldE51bGxNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpIHsNCisgIFNldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSwgRlhfV1NUUkMoTCJudWxsVGVzdCIpKTsNCiB9DQotRlhfQk9PTCBDWEZBX0JveDo6R2V0U3dlZXBBbmdsZShGWF9GTE9BVCAmZlN3ZWVwQW5nbGUpIGNvbnN0DQotew0KLSAgICBmU3dlZXBBbmdsZSA9IDM2MDsNCi0gICAgaWYgKCFtX3BOb2RlKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCi0gICAgRlhfQk9PTCBiUmV0ID0gbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1N3ZWVwQW5nbGUsIG1zLCBGQUxTRSk7DQotICAgIGlmIChiUmV0KSB7DQotICAgICAgICBmU3dlZXBBbmdsZSA9IG1zLkdldFZhbHVlKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGJSZXQ7DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXROdWxsTWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSkgew0KKyAgR2V0TWVzc2FnZVRleHQod3NNZXNzYWdlLCBGWF9XU1RSQyhMIm51bGxUZXN0IikpOw0KIH0NCi1DWEZBX0ZpbGwgQ1hGQV9Cb3g6OkdldEZpbGwoRlhfQk9PTCBiTW9kaWZpZWQpIGNvbnN0DQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KK3ZvaWQgQ1hGQV9WYWxpZGF0ZTo6U2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZXNzYWdlVHlwZSkgew0KKyAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9NZXNzYWdlLCBUUlVFKSkgew0KKyAgICBDWEZBX05vZGUqIHBJdGVtTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGZvciAoOyBwSXRlbU5vZGU7DQorICAgICAgICAgcEl0ZW1Ob2RlID0gcEl0ZW1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgaWYgKHBJdGVtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1RleHQpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lOw0KKyAgICAgIHBJdGVtTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICAgIGlmICh3c05hbWUuSXNFbXB0eSgpIHx8IHdzTmFtZSA9PSB3c01lc3NhZ2VUeXBlKSB7DQorICAgICAgICBwSXRlbU5vZGUtPlNldENvbnRlbnQod3NNZXNzYWdlLCB3c01lc3NhZ2UsIEZBTFNFKTsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQogICAgIH0NCi0gICAgQ1hGQV9Ob2RlICpwRmlsbE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9GaWxsLCBiTW9kaWZpZWQpOw0KLSAgICByZXR1cm4gQ1hGQV9GaWxsKHBGaWxsTm9kZSk7DQorICAgIENYRkFfTm9kZSogcFRleHROb2RlID0gcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX1RleHQpOw0KKyAgICBwTm9kZS0+SW5zZXJ0Q2hpbGQocFRleHROb2RlKTsNCisgICAgcFRleHROb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTWVzc2FnZVR5cGUsIEZBTFNFKTsNCisgICAgcFRleHROb2RlLT5TZXRDb250ZW50KHdzTWVzc2FnZSwgd3NNZXNzYWdlLCBGQUxTRSk7DQorICB9DQogfQ0KLUNYRkFfTWFyZ2luIENYRkFfQm94OjpHZXRNYXJnaW4oKSBjb25zdA0KLXsNCi0gICAgaWYgKCFtX3BOb2RlKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ1hGQV9NYXJnaW4obV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWFyZ2luKSk7DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlKSB7DQorICBHZXRNZXNzYWdlVGV4dCh3c01lc3NhZ2UsIEZYX1dTVFJDKEwic2NyaXB0VGVzdCIpKTsNCiB9DQotc3RhdGljIEZYX0JPT0wgWEZBX0JPWF9TYW1lU3R5bGVzKGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkgJnN0cm9rZXMpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IHN0cm9rZXMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaUNvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMSA9IHN0cm9rZXNbMF07DQotICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMiA9IHN0cm9rZXNbaV07DQotICAgICAgICBpZiAoIXN0cm9rZTIuSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghc3Ryb2tlMS5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgICAgIHN0cm9rZTEgPSBzdHJva2UyOw0KLSAgICAgICAgfSBlbHNlIGlmICghc3Ryb2tlMS5TYW1lU3R5bGVzKHN0cm9rZTIpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KK3ZvaWQgQ1hGQV9WYWxpZGF0ZTo6U2V0U2NyaXB0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlKSB7DQorICBTZXRNZXNzYWdlVGV4dCh3c01lc3NhZ2UsIEZYX1dTVFJDKEwic2NyaXB0VGVzdCIpKTsNCiB9DQotRlhfQk9PTCBDWEZBX0JveDo6U2FtZVN0eWxlcygpIGNvbnN0DQotew0KLSAgICBpZiAoSXNBcmMoKSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgQ1hGQV9TdHJva2VBcnJheSBzdHJva2VzOw0KLSAgICBYRkFfQk9YX0dldFN0cm9rZXMobV9wTm9kZSwgc3Ryb2tlcywgVFJVRSk7DQotICAgIHJldHVybiBYRkFfQk9YX1NhbWVTdHlsZXMoc3Ryb2tlcyk7DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRQaWN0dXJlKENGWF9XaWRlU3RyaW5nJiB3c1BpY3R1cmUpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGljdHVyZSkpIHsNCisgICAgcE5vZGUtPlRyeUNvbnRlbnQod3NQaWN0dXJlKTsNCisgIH0NCiB9DQotc3RhdGljIGludDMyX3QgWEZBX0JPWF8zRFN0eWxlKGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkgJnN0cm9rZXMsIENYRkFfU3Ryb2tlICZzdHJva2UpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IHN0cm9rZXMuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaUNvdW50IDwgMSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgc3Ryb2tlID0gc3Ryb2tlc1swXTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgaUNvdW50OyBpICsrKSB7DQotICAgICAgICBDWEZBX1N0cm9rZSBmaW5kID0gc3Ryb2tlc1tpXTsNCi0gICAgICAgIGlmICghZmluZC5Jc0V4aXN0SW5YTUwoKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFzdHJva2UuSXNFeGlzdEluWE1MKCkpIHsNCi0gICAgICAgICAgICBzdHJva2UgPSBmaW5kOw0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJva2UuR2V0U3Ryb2tlVHlwZSgpICE9IGZpbmQuR2V0U3Ryb2tlVHlwZSgpKSB7DQotICAgICAgICAgICAgc3Ryb2tlID0gZmluZDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpbnQzMl90IGlUeXBlID0gc3Ryb2tlLkdldFN0cm9rZVR5cGUoKTsNCi0gICAgaWYgKGlUeXBlID09IFhGQV9BVFRSSUJVVEVFTlVNX0xvd2VyZWQgfHwgaVR5cGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmFpc2VkIHx8DQotICAgICAgICAgICAgaVR5cGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fRXRjaGVkIHx8IGlUeXBlID09IFhGQV9BVFRSSUJVVEVFTlVNX0VtYm9zc2VkKSB7DQotICAgICAgICByZXR1cm4gaVR5cGU7DQotICAgIH0NCitDWEZBX1NjcmlwdCBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHQoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfU2NyaXB0KTsNCit9DQorQ1hGQV9WYXJpYWJsZXM6OkNYRkFfVmFyaWFibGVzKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KK2ludDMyX3QgQ1hGQV9WYXJpYWJsZXM6OkNvdW50U2NyaXB0cygpIHsNCisgIHJldHVybiBtX3BOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX1NjcmlwdCk7DQorfQ0KK0NYRkFfU2NyaXB0IENYRkFfVmFyaWFibGVzOjpHZXRTY3JpcHQoaW50MzJfdCBuSW5kZXgpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX1NjcmlwdCk7DQorfQ0KK0NYRkFfQmluZDo6Q1hGQV9CaW5kKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KK2ludDMyX3QgQ1hGQV9CaW5kOjpHZXRNYXRjaCgpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWF0Y2gpOw0KK30NCit2b2lkIENYRkFfQmluZDo6R2V0UmVmKENGWF9XaWRlU3RyaW5nQyYgd3NSZWYpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1JlZik7DQorfQ0KK3ZvaWQgQ1hGQV9CaW5kOjpHZXRQaWN0dXJlKENGWF9XaWRlU3RyaW5nJiB3c1BpY3R1cmUpIHsNCisgIGlmIChDWEZBX05vZGUqIHBQaWN0dXJlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGljdHVyZSkpIHsNCisgICAgcFBpY3R1cmUtPlRyeUNvbnRlbnQod3NQaWN0dXJlKTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0JpbmQ6OlNldE1hdGNoKGludDMyX3QgaU1hdGNoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX01hdGNoLCAoWEZBX0FUVFJJQlVURUVOVU0paU1hdGNoKTsNCit9DQorRlhfQk9PTCBDWEZBX0JpbmQ6OlNldFJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZWYpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1JlZiwgd3NSZWYpOw0KK30NCitGWF9CT09MIENYRkFfQmluZDo6U2V0UGljdHVyZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQaWN0dXJlKSB7DQorICBpZiAoQ1hGQV9Ob2RlKiBwUGljdHVyZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1BpY3R1cmUpKSB7DQorICAgIHJldHVybiBwUGljdHVyZS0+U2V0Q29udGVudCh3c1BpY3R1cmUsIHdzUGljdHVyZSk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfQXNzaXN0OjpDWEZBX0Fzc2lzdChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCitDWEZBX1Rvb2xUaXAgQ1hGQV9Bc3Npc3Q6OkdldFRvb2xUaXAoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVG9vbFRpcCk7DQorfQ0KK0NYRkFfVG9vbFRpcDo6Q1hGQV9Ub29sVGlwKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KK0ZYX0JPT0wgQ1hGQV9Ub29sVGlwOjpHZXRUaXAoQ0ZYX1dpZGVTdHJpbmcmIHdzVGlwKSB7DQorICByZXR1cm4gbV9wTm9kZS0+VHJ5Q29udGVudCh3c1RpcCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ub29sVGlwOjpTZXRUaXAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGlwKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q29udGVudCh3c1RpcCwgd3NUaXApOw0KK30NCitDWEZBX0JpbmRJdGVtczo6Q1hGQV9CaW5kSXRlbXMoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQordm9pZCBDWEZBX0JpbmRJdGVtczo6R2V0Q29ubmVjdGlvbihDRlhfV2lkZVN0cmluZ0MmIHdzQ29ubmVjdGlvbikgew0KKyAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCB3c0Nvbm5lY3Rpb24pOw0KK30NCit2b2lkIENYRkFfQmluZEl0ZW1zOjpHZXRMYWJlbFJlZihDRlhfV2lkZVN0cmluZ0MmIHdzTGFiZWxSZWYpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTGFiZWxSZWYsIHdzTGFiZWxSZWYpOw0KK30NCit2b2lkIENYRkFfQmluZEl0ZW1zOjpHZXRWYWx1ZVJlZihDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWVSZWYpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWVSZWYsIHdzVmFsdWVSZWYpOw0KK30NCit2b2lkIENYRkFfQmluZEl0ZW1zOjpHZXRSZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlZikgew0KKyAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYsIHdzUmVmKTsNCit9DQorRlhfQk9PTCBDWEZBX0JpbmRJdGVtczo6U2V0Q29ubmVjdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb25uZWN0aW9uKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCB3c0Nvbm5lY3Rpb24pOw0KK30NCitGWF9CT09MIENYRkFfQmluZEl0ZW1zOjpTZXRMYWJlbFJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMYWJlbFJlZikgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTGFiZWxSZWYsIHdzTGFiZWxSZWYpOw0KK30NCitGWF9CT09MIENYRkFfQmluZEl0ZW1zOjpTZXRWYWx1ZVJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZVJlZikgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWVSZWYsIHdzVmFsdWVSZWYpOw0KK30NCitGWF9CT09MIENYRkFfQmluZEl0ZW1zOjpTZXRSZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVmKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYsIHdzUmVmKTsNCit9DQoraW50MzJfdCBDWEZBX0JveDo6R2V0QnJlYWsoKSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0Nsb3NlOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9CcmVhayk7DQorfQ0KK2ludDMyX3QgQ1hGQV9Cb3g6OkdldEhhbmQoKSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0V2ZW47DQorICB9DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hhbmQpOw0KK30NCitpbnQzMl90IENYRkFfQm94OjpHZXRQcmVzZW5jZSgpIGNvbnN0IHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVuOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9Cb3g6OkNvdW50Q29ybmVycygpIGNvbnN0IHsNCisgIGlmICghbV9wTm9kZSkgew0KICAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiBtX3BOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX0Nvcm5lcik7DQogfQ0KLWludDMyX3QgQ1hGQV9Cb3g6OkdldDNEU3R5bGUoRlhfQk9PTCAmYlZpc2libGUsIEZYX0ZMT0FUICZmVGhpY2tuZXNzKSBjb25zdA0KLXsNCi0gICAgaWYgKElzQXJjKCkpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIENYRkFfU3Ryb2tlQXJyYXkgc3Ryb2tlczsNCi0gICAgWEZBX0JPWF9HZXRTdHJva2VzKG1fcE5vZGUsIHN0cm9rZXMsIFRSVUUpOw0KLSAgICBDWEZBX1N0cm9rZSBzdHJva2UoTlVMTCk7DQotICAgIGludDMyX3QgaVR5cGUgPSBYRkFfQk9YXzNEU3R5bGUoc3Ryb2tlcywgc3Ryb2tlKTsNCi0gICAgaWYgKGlUeXBlKSB7DQotICAgICAgICBiVmlzaWJsZSA9IHN0cm9rZS5Jc1Zpc2libGUoKTsNCi0gICAgICAgIGZUaGlja25lc3MgPSBzdHJva2UuR2V0VGhpY2tuZXNzKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGlUeXBlOw0KK0NYRkFfQ29ybmVyIENYRkFfQm94OjpHZXRDb3JuZXIoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBDWEZBX0Nvcm5lcigNCisgICAgICBtX3BOb2RlLT5HZXRQcm9wZXJ0eShuSW5kZXgsIFhGQV9FTEVNRU5UX0Nvcm5lciwgbkluZGV4ID09IDApKTsNCiB9DQotaW50MzJfdCBDWEZBX1N0cm9rZTo6R2V0UHJlc2VuY2UoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UpIDogWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlOw0KK2ludDMyX3QgQ1hGQV9Cb3g6OkNvdW50RWRnZXMoKSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9FZGdlKTsNCiB9DQotaW50MzJfdCBDWEZBX1N0cm9rZTo6R2V0Q2FwVHlwZSgpIGNvbnN0DQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmU7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9DYXApOw0KK0NYRkFfRWRnZSBDWEZBX0JveDo6R2V0RWRnZShpbnQzMl90IG5JbmRleCkgY29uc3Qgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIENYRkFfRWRnZShtX3BOb2RlLT5HZXRQcm9wZXJ0eShuSW5kZXgsIFhGQV9FTEVNRU5UX0VkZ2UsIG5JbmRleCA9PSAwKSk7DQogfQ0KLWludDMyX3QgQ1hGQV9TdHJva2U6OkdldFN0cm9rZVR5cGUoKSBjb25zdA0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfU3Ryb2tlKSA6IFhGQV9BVFRSSUJVVEVFTlVNX1NvbGlkOw0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfR2V0U3Ryb2tlcyhDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1N0cm9rZUFycmF5JiBzdHJva2VzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOVUxMKSB7DQorICBzdHJva2VzLlJlbW92ZUFsbCgpOw0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBzdHJva2VzLlNldFNpemUoOCk7DQorICBpbnQzMl90IGksIGo7DQorICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDQ7IGkrKykgew0KKyAgICBDWEZBX0Nvcm5lciBjb3JuZXIgPQ0KKyAgICAgICAgQ1hGQV9Db3JuZXIocE5vZGUtPkdldFByb3BlcnR5KGksIFhGQV9FTEVNRU5UX0Nvcm5lciwgaSA9PSAwKSk7DQorICAgIGlmIChjb3JuZXIuSXNFeGlzdEluWE1MKCkgfHwgaSA9PSAwKSB7DQorICAgICAgc3Ryb2tlcy5TZXRBdChqLCBjb3JuZXIpOw0KKyAgICB9IGVsc2UgaWYgKGJOVUxMKSB7DQorICAgICAgc3Ryb2tlcy5TZXRBdChqLCBOVUxMKTsNCisgICAgfSBlbHNlIGlmIChpID09IDEpIHsNCisgICAgICBzdHJva2VzLlNldEF0KGosIHN0cm9rZXNbMF0pOw0KKyAgICB9IGVsc2UgaWYgKGkgPT0gMikgew0KKyAgICAgIHN0cm9rZXMuU2V0QXQoaiwgc3Ryb2tlc1swXSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgc3Ryb2tlcy5TZXRBdChqLCBzdHJva2VzWzJdKTsNCisgICAgfQ0KKyAgICBqKys7DQorICAgIENYRkFfRWRnZSBlZGdlID0gQ1hGQV9FZGdlKHBOb2RlLT5HZXRQcm9wZXJ0eShpLCBYRkFfRUxFTUVOVF9FZGdlLCBpID09IDApKTsNCisgICAgaWYgKGVkZ2UuSXNFeGlzdEluWE1MKCkgfHwgaSA9PSAwKSB7DQorICAgICAgc3Ryb2tlcy5TZXRBdChqLCBlZGdlKTsNCisgICAgfSBlbHNlIGlmIChiTlVMTCkgew0KKyAgICAgIHN0cm9rZXMuU2V0QXQoaiwgTlVMTCk7DQorICAgIH0gZWxzZSBpZiAoaSA9PSAxKSB7DQorICAgICAgc3Ryb2tlcy5TZXRBdChqLCBzdHJva2VzWzFdKTsNCisgICAgfSBlbHNlIGlmIChpID09IDIpIHsNCisgICAgICBzdHJva2VzLlNldEF0KGosIHN0cm9rZXNbMV0pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHN0cm9rZXMuU2V0QXQoaiwgc3Ryb2tlc1szXSk7DQorICAgIH0NCisgICAgaisrOw0KKyAgfQ0KIH0NCi1GWF9GTE9BVCBDWEZBX1N0cm9rZTo6R2V0VGhpY2tuZXNzKCkgY29uc3QNCi17DQotICAgIHJldHVybiBHZXRNU1RoaWNrbmVzcygpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQordm9pZCBDWEZBX0JveDo6R2V0U3Ryb2tlcyhDWEZBX1N0cm9rZUFycmF5JiBzdHJva2VzKSBjb25zdCB7DQorICBYRkFfQk9YX0dldFN0cm9rZXMobV9wTm9kZSwgc3Ryb2tlcywgRkFMU0UpOw0KIH0NCi1DWEZBX01lYXN1cmVtZW50IENYRkFfU3Ryb2tlOjpHZXRNU1RoaWNrbmVzcygpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9UaGlja25lc3MpIDogWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9NZWFzdXJlKFhGQV9FTEVNRU5UX0VkZ2UsIFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLCBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KK0ZYX0JPT0wgQ1hGQV9Cb3g6OklzQ2lyY3VsYXIoKSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9DaXJjdWxhcik7DQogfQ0KLXZvaWQgQ1hGQV9TdHJva2U6OlNldFRoaWNrbmVzcyhGWF9GTE9BVCBmVGhpY2tuZXNzKQ0KLXsNCi0gICAgaWYgKCFtX3BOb2RlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9NZWFzdXJlbWVudCB0aGlja25lc3MoZlRoaWNrbmVzcywgWEZBX1VOSVRfUHQpOw0KLSAgICBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLCB0aGlja25lc3MpOw0KK0ZYX0JPT0wgQ1hGQV9Cb3g6OkdldFN0YXJ0QW5nbGUoRlhfRkxPQVQmIGZTdGFydEFuZ2xlKSBjb25zdCB7DQorICBmU3RhcnRBbmdsZSA9IDA7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgIEZYX0JPT0wgYlJldCA9IG1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9TdGFydEFuZ2xlLCBtcywgRkFMU0UpOw0KKyAgaWYgKGJSZXQpIHsNCisgICAgZlN0YXJ0QW5nbGUgPSBtcy5HZXRWYWx1ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQogfQ0KLXZvaWQgQ1hGQV9TdHJva2U6OlNldE1TVGhpY2tuZXNzKENYRkFfTWVhc3VyZW1lbnQgbXNUaGlua25lc3MpDQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLCBtc1RoaW5rbmVzcyk7DQorRlhfQk9PTCBDWEZBX0JveDo6R2V0U3dlZXBBbmdsZShGWF9GTE9BVCYgZlN3ZWVwQW5nbGUpIGNvbnN0IHsNCisgIGZTd2VlcEFuZ2xlID0gMzYwOw0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICBGWF9CT09MIGJSZXQgPSBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU3dlZXBBbmdsZSwgbXMsIEZBTFNFKTsNCisgIGlmIChiUmV0KSB7DQorICAgIGZTd2VlcEFuZ2xlID0gbXMuR2V0VmFsdWUoKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KIH0NCi1GWF9BUkdCIENYRkFfU3Ryb2tlOjpHZXRDb2xvcigpIGNvbnN0DQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiAweEZGMDAwMDAwOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db2xvcik7DQotICAgIGlmICghcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiAweEZGMDAwMDAwOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nQyB3c0NvbG9yOw0KLSAgICBwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvcik7DQotICAgIHJldHVybiBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQorQ1hGQV9GaWxsIENYRkFfQm94OjpHZXRGaWxsKEZYX0JPT0wgYk1vZGlmaWVkKSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDWEZBX05vZGUqIHBGaWxsTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0ZpbGwsIGJNb2RpZmllZCk7DQorICByZXR1cm4gQ1hGQV9GaWxsKHBGaWxsTm9kZSk7DQogfQ0KLXZvaWQgQ1hGQV9TdHJva2U6OlNldENvbG9yKEZYX0FSR0IgYXJnYikNCi17DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Db2xvcik7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQ29sb3I7DQotICAgIGludCBhLCByLCBnLCBiOw0KLSAgICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOw0KLSAgICB3c0NvbG9yLkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYik7DQotICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCitDWEZBX01hcmdpbiBDWEZBX0JveDo6R2V0TWFyZ2luKCkgY29uc3Qgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIENYRkFfTWFyZ2luKG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX01hcmdpbikpOw0KIH0NCi1pbnQzMl90IENYRkFfU3Ryb2tlOjpHZXRKb2luVHlwZSgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9Kb2luKSA6IFhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZTsNCi19DQotRlhfQk9PTCBDWEZBX1N0cm9rZTo6SXNJbnZlcnRlZCgpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9JbnZlcnRlZCkgOiBGQUxTRTsNCi19DQotRlhfRkxPQVQgQ1hGQV9TdHJva2U6OkdldFJhZGl1cygpIGNvbnN0DQotew0KLSAgICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SYWRpdXMpLlRvVW5pdChYRkFfVU5JVF9QdCkgOiAwOw0KLX0NCi1GWF9CT09MIENYRkFfU3Ryb2tlOjpTYW1lU3R5bGVzKENYRkFfU3Ryb2tlIHN0cm9rZSwgRlhfRFdPUkQgZHdGbGFncykgY29uc3QNCi17DQotICAgIGlmIChtX3BOb2RlID09IChDWEZBX05vZGUqKXN0cm9rZSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgaWYgKEZYU1lTX2ZhYnMoR2V0VGhpY2tuZXNzKCkgLSBzdHJva2UuR2V0VGhpY2tuZXNzKCkpID49IDAuMDFmKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgaWYgKChkd0ZsYWdzICYgWEZBX1NUUk9LRV9TQU1FU1RZTEVfTm9QcmVzZW5jZSkgPT0gMCAmJiBJc1Zpc2libGUoKSAhPSBzdHJva2UuSXNWaXNpYmxlKCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoR2V0U3Ryb2tlVHlwZSgpICE9IHN0cm9rZS5HZXRTdHJva2VUeXBlKCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZiAoR2V0Q29sb3IoKSAhPSBzdHJva2UuR2V0Q29sb3IoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGlmICgoZHdGbGFncyAmIFhGQV9TVFJPS0VfU0FNRVNUWUxFX0Nvcm5lcikgIT0gMCAmJiBGWFNZU19mYWJzKEdldFJhZGl1cygpIC0gc3Ryb2tlLkdldFJhZGl1cygpKSA+PSAwLjAxZikgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQorc3RhdGljIEZYX0JPT0wgWEZBX0JPWF9TYW1lU3R5bGVzKGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkmIHN0cm9rZXMpIHsNCisgIGludDMyX3QgaUNvdW50ID0gc3Ryb2tlcy5HZXRTaXplKCk7DQorICBpZiAoaUNvdW50IDwgMSkgew0KICAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfRkxPQVQgWEZBX0dldEVkZ2VUaGlja25lc3MoY29uc3QgQ1hGQV9TdHJva2VBcnJheSAmc3Ryb2tlcywgRlhfQk9PTCBiM0RTdHlsZSwgaW50MzJfdCBuSW5kZXgpDQotew0KLSAgICBGWF9GTE9BVCBmVGhpY2tuZXNzID0gMDsNCi0gICAgew0KLSAgICAgICAgaWYgKHN0cm9rZXNbbkluZGV4ICogMiArIDFdLkdldFByZXNlbmNlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KLSAgICAgICAgICAgIGlmIChuSW5kZXggPT0gMCkgew0KLSAgICAgICAgICAgICAgICBmVGhpY2tuZXNzICs9IDIuNWY7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZUaGlja25lc3MgKz0gc3Ryb2tlc1tuSW5kZXggKiAyICsgMV0uR2V0VGhpY2tuZXNzKCkgKiAoYjNEU3R5bGUgPyA0IDogMik7DQotICAgICAgICB9DQorICB9DQorICBDWEZBX1N0cm9rZSBzdHJva2UxID0gc3Ryb2tlc1swXTsNCisgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENYRkFfU3Ryb2tlIHN0cm9rZTIgPSBzdHJva2VzW2ldOw0KKyAgICBpZiAoIXN0cm9rZTIuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICByZXR1cm4gZlRoaWNrbmVzczsNCi19DQotQ1hGQV9XaWRnZXREYXRhOjpDWEZBX1dpZGdldERhdGEoQ1hGQV9Ob2RlICpwTm9kZSkNCi0gICAgOiBDWEZBX0RhdGEocE5vZGUpDQotICAgICwgbV9iSXNOdWxsKFRSVUUpDQotICAgICwgbV9iUHJlTnVsbChUUlVFKQ0KLSAgICAsIG1fcFVpQ2hpbGROb2RlKE5VTEwpDQotICAgICwgbV9lVUlUeXBlKFhGQV9FTEVNRU5UX1VOS05PV04pDQotew0KLX0NCi1DWEZBX05vZGUqIENYRkFfV2lkZ2V0RGF0YTo6R2V0VUlDaGlsZCgpDQotew0KLSAgICBpZiAobV9lVUlUeXBlID09IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCi0gICAgICAgIG1fcFVpQ2hpbGROb2RlID0gWEZBX0NyZWF0ZVVJQ2hpbGQobV9wTm9kZSwgbV9lVUlUeXBlKTsNCisgICAgaWYgKCFzdHJva2UxLklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgc3Ryb2tlMSA9IHN0cm9rZTI7DQorICAgIH0gZWxzZSBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICByZXR1cm4gbV9wVWlDaGlsZE5vZGU7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotWEZBX0VMRU1FTlQgQ1hGQV9XaWRnZXREYXRhOjpHZXRVSVR5cGUoKQ0KLXsNCi0gICAgR2V0VUlDaGlsZCgpOw0KLSAgICByZXR1cm4gbV9lVUlUeXBlOw0KK0ZYX0JPT0wgQ1hGQV9Cb3g6OlNhbWVTdHlsZXMoKSBjb25zdCB7DQorICBpZiAoSXNBcmMoKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIENYRkFfU3Ryb2tlQXJyYXkgc3Ryb2tlczsNCisgIFhGQV9CT1hfR2V0U3Ryb2tlcyhtX3BOb2RlLCBzdHJva2VzLCBUUlVFKTsNCisgIHJldHVybiBYRkFfQk9YX1NhbWVTdHlsZXMoc3Ryb2tlcyk7DQogfQ0KLUNGWF9XaWRlU3RyaW5nICBDWEZBX1dpZGdldERhdGE6OkdldFJhd1ZhbHVlKCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5HZXRDb250ZW50KCk7DQotfQ0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRBY2Nlc3MoRlhfQk9PTCBiVGVtcGxhdGUpDQotew0KLSAgICBpZiAoYlRlbXBsYXRlKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7DQotICAgICAgICBpZiAocE5vZGUpIHsNCi0gICAgICAgICAgICByZXR1cm4gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BY2Nlc3MpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wZW47DQorc3RhdGljIGludDMyX3QgWEZBX0JPWF8zRFN0eWxlKGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkmIHN0cm9rZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfU3Ryb2tlJiBzdHJva2UpIHsNCisgIGludDMyX3QgaUNvdW50ID0gc3Ryb2tlcy5HZXRTaXplKCk7DQorICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHN0cm9rZSA9IHN0cm9rZXNbMF07DQorICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDWEZBX1N0cm9rZSBmaW5kID0gc3Ryb2tlc1tpXTsNCisgICAgaWYgKCFmaW5kLklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGU7DQotICAgIHdoaWxlIChwTm9kZSkgew0KLSAgICAgICAgaW50MzJfdCBpQWNjID0gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BY2Nlc3MpOw0KLSAgICAgICAgaWYgKGlBY2MgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KLSAgICAgICAgICAgIHJldHVybiBpQWNjOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICAgIGlmICghc3Ryb2tlLklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgc3Ryb2tlID0gZmluZDsNCisgICAgfSBlbHNlIGlmIChzdHJva2UuR2V0U3Ryb2tlVHlwZSgpICE9IGZpbmQuR2V0U3Ryb2tlVHlwZSgpKSB7DQorICAgICAgc3Ryb2tlID0gZmluZDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpVHlwZSA9IHN0cm9rZS5HZXRTdHJva2VUeXBlKCk7DQorICBpZiAoaVR5cGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fTG93ZXJlZCB8fCBpVHlwZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9SYWlzZWQgfHwNCisgICAgICBpVHlwZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9FdGNoZWQgfHwNCisgICAgICBpVHlwZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9FbWJvc3NlZCkgew0KKyAgICByZXR1cm4gaVR5cGU7DQorICB9DQorICByZXR1cm4gMDsNCit9DQoraW50MzJfdCBDWEZBX0JveDo6R2V0M0RTdHlsZShGWF9CT09MJiBiVmlzaWJsZSwgRlhfRkxPQVQmIGZUaGlja25lc3MpIGNvbnN0IHsNCisgIGlmIChJc0FyYygpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgQ1hGQV9TdHJva2VBcnJheSBzdHJva2VzOw0KKyAgWEZBX0JPWF9HZXRTdHJva2VzKG1fcE5vZGUsIHN0cm9rZXMsIFRSVUUpOw0KKyAgQ1hGQV9TdHJva2Ugc3Ryb2tlKE5VTEwpOw0KKyAgaW50MzJfdCBpVHlwZSA9IFhGQV9CT1hfM0RTdHlsZShzdHJva2VzLCBzdHJva2UpOw0KKyAgaWYgKGlUeXBlKSB7DQorICAgIGJWaXNpYmxlID0gc3Ryb2tlLklzVmlzaWJsZSgpOw0KKyAgICBmVGhpY2tuZXNzID0gc3Ryb2tlLkdldFRoaWNrbmVzcygpOw0KKyAgfQ0KKyAgcmV0dXJuIGlUeXBlOw0KK30NCitpbnQzMl90IENYRkFfU3Ryb2tlOjpHZXRQcmVzZW5jZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKQ0KKyAgICAgICAgICAgICAgICAgOiBYRkFfQVRUUklCVVRFRU5VTV9JbnZpc2libGU7DQorfQ0KK2ludDMyX3QgQ1hGQV9TdHJva2U6OkdldENhcFR5cGUoKSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZTsNCisgIH0NCisgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ2FwKTsNCit9DQoraW50MzJfdCBDWEZBX1N0cm9rZTo6R2V0U3Ryb2tlVHlwZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1N0cm9rZSkNCisgICAgICAgICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fU29saWQ7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfU3Ryb2tlOjpHZXRUaGlja25lc3MoKSBjb25zdCB7DQorICByZXR1cm4gR2V0TVNUaGlja25lc3MoKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitDWEZBX01lYXN1cmVtZW50IENYRkFfU3Ryb2tlOjpHZXRNU1RoaWNrbmVzcygpIGNvbnN0IHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RoaWNrbmVzcykNCisgICAgICAgICAgICAgICAgIDogWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9NZWFzdXJlKFhGQV9FTEVNRU5UX0VkZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorfQ0KK3ZvaWQgQ1hGQV9TdHJva2U6OlNldFRoaWNrbmVzcyhGWF9GTE9BVCBmVGhpY2tuZXNzKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9NZWFzdXJlbWVudCB0aGlja25lc3MoZlRoaWNrbmVzcywgWEZBX1VOSVRfUHQpOw0KKyAgbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywgdGhpY2tuZXNzKTsNCit9DQordm9pZCBDWEZBX1N0cm9rZTo6U2V0TVNUaGlja25lc3MoQ1hGQV9NZWFzdXJlbWVudCBtc1RoaW5rbmVzcykgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9UaGlja25lc3MsIG1zVGhpbmtuZXNzKTsNCit9DQorRlhfQVJHQiBDWEZBX1N0cm9rZTo6R2V0Q29sb3IoKSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIDB4RkYwMDAwMDA7DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29sb3IpOw0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICByZXR1cm4gMHhGRjAwMDAwMDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nQyB3c0NvbG9yOw0KKyAgcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOw0KKyAgcmV0dXJuIFhGQV9XU3RyaW5nVG9Db2xvcih3c0NvbG9yKTsNCit9DQordm9pZCBDWEZBX1N0cm9rZTo6U2V0Q29sb3IoRlhfQVJHQiBhcmdiKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NvbG9yKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29sb3I7DQorICBpbnQgYSwgciwgZywgYjsNCisgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7DQorICB3c0NvbG9yLkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYik7DQorICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvcik7DQorfQ0KK2ludDMyX3QgQ1hGQV9TdHJva2U6OkdldEpvaW5UeXBlKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSm9pbikNCisgICAgICAgICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlOw0KK30NCitGWF9CT09MIENYRkFfU3Ryb2tlOjpJc0ludmVydGVkKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfSW52ZXJ0ZWQpIDogRkFMU0U7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfU3Ryb2tlOjpHZXRSYWRpdXMoKSBjb25zdCB7DQorICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SYWRpdXMpLlRvVW5pdChYRkFfVU5JVF9QdCkNCisgICAgICAgICAgICAgICAgIDogMDsNCit9DQorRlhfQk9PTCBDWEZBX1N0cm9rZTo6U2FtZVN0eWxlcyhDWEZBX1N0cm9rZSBzdHJva2UsIEZYX0RXT1JEIGR3RmxhZ3MpIGNvbnN0IHsNCisgIGlmIChtX3BOb2RlID09IChDWEZBX05vZGUqKXN0cm9rZSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChGWFNZU19mYWJzKEdldFRoaWNrbmVzcygpIC0gc3Ryb2tlLkdldFRoaWNrbmVzcygpKSA+PSAwLjAxZikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoKGR3RmxhZ3MgJiBYRkFfU1RST0tFX1NBTUVTVFlMRV9Ob1ByZXNlbmNlKSA9PSAwICYmDQorICAgICAgSXNWaXNpYmxlKCkgIT0gc3Ryb2tlLklzVmlzaWJsZSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChHZXRTdHJva2VUeXBlKCkgIT0gc3Ryb2tlLkdldFN0cm9rZVR5cGUoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoR2V0Q29sb3IoKSAhPSBzdHJva2UuR2V0Q29sb3IoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoKGR3RmxhZ3MgJiBYRkFfU1RST0tFX1NBTUVTVFlMRV9Db3JuZXIpICE9IDAgJiYNCisgICAgICBGWFNZU19mYWJzKEdldFJhZGl1cygpIC0gc3Ryb2tlLkdldFJhZGl1cygpKSA+PSAwLjAxZikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfRkxPQVQgWEZBX0dldEVkZ2VUaGlja25lc3MoY29uc3QgQ1hGQV9TdHJva2VBcnJheSYgc3Ryb2tlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGIzRFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7DQorICBGWF9GTE9BVCBmVGhpY2tuZXNzID0gMDsNCisgIHsNCisgICAgaWYgKHN0cm9rZXNbbkluZGV4ICogMiArIDFdLkdldFByZXNlbmNlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KKyAgICAgIGlmIChuSW5kZXggPT0gMCkgew0KKyAgICAgICAgZlRoaWNrbmVzcyArPSAyLjVmOw0KKyAgICAgIH0NCisgICAgICBmVGhpY2tuZXNzICs9IHN0cm9rZXNbbkluZGV4ICogMiArIDFdLkdldFRoaWNrbmVzcygpICogKGIzRFN0eWxlID8gNCA6IDIpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZlRoaWNrbmVzczsNCit9DQorQ1hGQV9XaWRnZXREYXRhOjpDWEZBX1dpZGdldERhdGEoQ1hGQV9Ob2RlKiBwTm9kZSkNCisgICAgOiBDWEZBX0RhdGEocE5vZGUpLA0KKyAgICAgIG1fYklzTnVsbChUUlVFKSwNCisgICAgICBtX2JQcmVOdWxsKFRSVUUpLA0KKyAgICAgIG1fcFVpQ2hpbGROb2RlKE5VTEwpLA0KKyAgICAgIG1fZVVJVHlwZShYRkFfRUxFTUVOVF9VTktOT1dOKSB7fQ0KK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXREYXRhOjpHZXRVSUNoaWxkKCkgew0KKyAgaWYgKG1fZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQorICAgIG1fcFVpQ2hpbGROb2RlID0gWEZBX0NyZWF0ZVVJQ2hpbGQobV9wTm9kZSwgbV9lVUlUeXBlKTsNCisgIH0NCisgIHJldHVybiBtX3BVaUNoaWxkTm9kZTsNCit9DQorWEZBX0VMRU1FTlQgQ1hGQV9XaWRnZXREYXRhOjpHZXRVSVR5cGUoKSB7DQorICBHZXRVSUNoaWxkKCk7DQorICByZXR1cm4gbV9lVUlUeXBlOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX1dpZGdldERhdGE6OkdldFJhd1ZhbHVlKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldENvbnRlbnQoKTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldEFjY2VzcyhGWF9CT09MIGJUZW1wbGF0ZSkgew0KKyAgaWYgKGJUZW1wbGF0ZSkgew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7DQorICAgIGlmIChwTm9kZSkgew0KKyAgICAgIHJldHVybiBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0FjY2Vzcyk7DQogICAgIH0NCiAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wZW47DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRBY2Nlc3NLZXkoQ0ZYX1dpZGVTdHJpbmdDICZ3c0FjY2Vzc0tleSkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgd3NBY2Nlc3NLZXkpOw0KLX0NCi1pbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0QW5jaG9yVHlwZSgpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUpOw0KLX0NCi1pbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0Q29sU3BhbigpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0NvbFNwYW4pOw0KLX0NCi1pbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0UHJlc2VuY2UoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSk7DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlOw0KLSAgICB3aGlsZSAocE5vZGUgJiYgcE5vZGUtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQotICAgICAgICBpbnQzMl90IGlBY2MgPSBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsNCi0gICAgICAgIGlmICggaUFjYyAhPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7DQotICAgICAgICAgICAgcmV0dXJuIGlBY2M7DQotICAgICAgICB9DQotICAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlOw0KKyAgd2hpbGUgKHBOb2RlKSB7DQorICAgIGludDMyX3QgaUFjYyA9IHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQWNjZXNzKTsNCisgICAgaWYgKGlBY2MgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KKyAgICAgIHJldHVybiBpQWNjOw0KICAgICB9DQotICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlOw0KKyAgICBwTm9kZSA9DQorICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICB9DQorICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fT3BlbjsNCiB9DQotaW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldFJvdGF0ZSgpDQotew0KLSAgICBDWEZBX01lYXN1cmVtZW50IG1zOw0KLSAgICBpZiAoIW1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Sb3RhdGUsIG1zLCBGQUxTRSkpIHsNCi0gICAgICAgIHJldHVybiAwOw0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRBY2Nlc3NLZXkoQ0ZYX1dpZGVTdHJpbmdDJiB3c0FjY2Vzc0tleSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQWNjZXNzS2V5LCB3c0FjY2Vzc0tleSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRBbmNob3JUeXBlKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlKTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldENvbFNwYW4oKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0NvbFNwYW4pOw0KK30NCitpbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0UHJlc2VuY2UoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlOw0KKyAgd2hpbGUgKHBOb2RlICYmIHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICBpbnQzMl90IGlBY2MgPSBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsNCisgICAgaWYgKGlBY2MgIT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KKyAgICAgIHJldHVybiBpQWNjOw0KICAgICB9DQotICAgIGludDMyX3QgaVJvdGF0ZSA9ICBGWFNZU19yb3VuZChtcy5HZXRWYWx1ZSgpKTsNCi0gICAgaVJvdGF0ZSA9IFhGQV9NYXBSb3RhdGlvbihpUm90YXRlKTsNCi0gICAgcmV0dXJuIGlSb3RhdGUgLyA5MCAqIDkwOw0KKyAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIH0NCisgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlOw0KIH0NCi1DWEZBX0JvcmRlciBDWEZBX1dpZGdldERhdGE6OkdldEJvcmRlcihGWF9CT09MIGJNb2RpZmllZCkNCi17DQotICAgIHJldHVybiBDWEZBX0JvcmRlcihtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Cb3JkZXIsIGJNb2RpZmllZCkpOw0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRSb3RhdGUoKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgaWYgKCFtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUm90YXRlLCBtcywgRkFMU0UpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCBpUm90YXRlID0gRlhTWVNfcm91bmQobXMuR2V0VmFsdWUoKSk7DQorICBpUm90YXRlID0gWEZBX01hcFJvdGF0aW9uKGlSb3RhdGUpOw0KKyAgcmV0dXJuIGlSb3RhdGUgLyA5MCAqIDkwOw0KIH0NCi1DWEZBX0NhcHRpb24gQ1hGQV9XaWRnZXREYXRhOjpHZXRDYXB0aW9uKEZYX0JPT0wgYk1vZGlmaWVkICkNCi17DQotICAgIHJldHVybiBDWEZBX0NhcHRpb24obV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ2FwdGlvbiwgYk1vZGlmaWVkKSk7DQorQ1hGQV9Cb3JkZXIgQ1hGQV9XaWRnZXREYXRhOjpHZXRCb3JkZXIoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIHJldHVybiBDWEZBX0JvcmRlcihtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Cb3JkZXIsIGJNb2RpZmllZCkpOw0KIH0NCi1DWEZBX0ZvbnQgQ1hGQV9XaWRnZXREYXRhOjpHZXRGb250KEZYX0JPT0wgYk1vZGlmaWVkICkNCi17DQotICAgIHJldHVybiBDWEZBX0ZvbnQobV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRm9udCwgYk1vZGlmaWVkKSk7DQorQ1hGQV9DYXB0aW9uIENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2FwdGlvbihGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIENYRkFfQ2FwdGlvbihtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DYXB0aW9uLCBiTW9kaWZpZWQpKTsNCiB9DQotQ1hGQV9NYXJnaW4gQ1hGQV9XaWRnZXREYXRhOjpHZXRNYXJnaW4oRlhfQk9PTCBiTW9kaWZpZWQgKQ0KLXsNCi0gICAgcmV0dXJuIENYRkFfTWFyZ2luKG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX01hcmdpbiwgYk1vZGlmaWVkKSk7DQorQ1hGQV9Gb250IENYRkFfV2lkZ2V0RGF0YTo6R2V0Rm9udChGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIENYRkFfRm9udChtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Gb250LCBiTW9kaWZpZWQpKTsNCiB9DQotQ1hGQV9QYXJhIENYRkFfV2lkZ2V0RGF0YTo6R2V0UGFyYShGWF9CT09MIGJNb2RpZmllZCApDQotew0KLSAgICByZXR1cm4gQ1hGQV9QYXJhKG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1BhcmEsIGJNb2RpZmllZCkpOw0KK0NYRkFfTWFyZ2luIENYRkFfV2lkZ2V0RGF0YTo6R2V0TWFyZ2luKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICByZXR1cm4gQ1hGQV9NYXJnaW4obV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTWFyZ2luLCBiTW9kaWZpZWQpKTsNCiB9DQotQ1hGQV9LZWVwIENYRkFfV2lkZ2V0RGF0YTo6R2V0S2VlcChGWF9CT09MIGJNb2RpZmllZCApDQotew0KLSAgICByZXR1cm4gQ1hGQV9LZWVwKG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0tlZXAsIGJNb2RpZmllZCksIG1fcE5vZGUpOw0KK0NYRkFfUGFyYSBDWEZBX1dpZGdldERhdGE6OkdldFBhcmEoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIHJldHVybiBDWEZBX1BhcmEobV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfUGFyYSwgYk1vZGlmaWVkKSk7DQogfQ0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRFdmVudExpc3QoQ1hGQV9Ob2RlQXJyYXkgJmV2ZW50cykNCi17DQotICAgIG1fcE5vZGUtPkdldE5vZGVMaXN0KGV2ZW50cywgMCwgWEZBX0VMRU1FTlRfRXZlbnQpOw0KK0NYRkFfS2VlcCBDWEZBX1dpZGdldERhdGE6OkdldEtlZXAoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIHJldHVybiBDWEZBX0tlZXAobV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfS2VlcCwgYk1vZGlmaWVkKSwNCisgICAgICAgICAgICAgICAgICAgbV9wTm9kZSk7DQogfQ0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRFdmVudEJ5QWN0aXZpdHkoaW50MzJfdCBpQWN0aXZpdHksIENYRkFfTm9kZUFycmF5ICZldmVudHMsIEZYX0JPT0wgYklzRm9ybVJlYWR5KQ0KLXsNCi0gICAgQ1hGQV9Ob2RlQXJyYXkgYWxsRXZlbnRzOw0KLSAgICBHZXRFdmVudExpc3QoYWxsRXZlbnRzKTsNCi0gICAgaW50MzJfdCBpQ291bnQgPSBhbGxFdmVudHMuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KLSAgICAgICAgQ1hGQV9FdmVudCBldmVudChhbGxFdmVudHNbaV0pOw0KLSAgICAgICAgaWYgKGV2ZW50LkdldEFjdGl2aXR5KCkgPT0gaUFjdGl2aXR5KSB7DQotICAgICAgICAgICAgaWYgKGlBY3Rpdml0eSA9PSBYRkFfQVRUUklCVVRFRU5VTV9SZWFkeSkgew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWY7DQotICAgICAgICAgICAgICAgIGV2ZW50LkdldFJlZih3c1JlZik7DQotICAgICAgICAgICAgICAgIGlmIChiSXNGb3JtUmVhZHkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICh3c1JlZiA9PSBDRlhfV2lkZVN0cmluZ0MoTCIkZm9ybSIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLkFkZChhbGxFdmVudHNbaV0pOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzUmVmID09IENGWF9XaWRlU3RyaW5nQyhMIiRsYXlvdXQiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5BZGQoYWxsRXZlbnRzW2ldKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGV2ZW50cy5BZGQoYWxsRXZlbnRzW2ldKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGV2ZW50cy5HZXRTaXplKCk7DQordm9pZCBDWEZBX1dpZGdldERhdGE6OkdldEV2ZW50TGlzdChDWEZBX05vZGVBcnJheSYgZXZlbnRzKSB7DQorICBtX3BOb2RlLT5HZXROb2RlTGlzdChldmVudHMsIDAsIFhGQV9FTEVNRU5UX0V2ZW50KTsNCiB9DQotQ1hGQV9WYWx1ZSBDWEZBX1dpZGdldERhdGE6OkdldERlZmF1bHRWYWx1ZShGWF9CT09MIGJNb2RpZmllZCApDQotew0KLSAgICBDWEZBX05vZGUqIHBUZW1Ob2RlID0gbV9wTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7DQotICAgIHJldHVybiBwVGVtTm9kZSA/IHBUZW1Ob2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSwgYk1vZGlmaWVkKSA6IE5VTEw7DQotfQ0KLUNYRkFfVmFsdWUgQ1hGQV9XaWRnZXREYXRhOjpHZXRGb3JtVmFsdWUoRlhfQk9PTCBiTW9kaWZpZWQgKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1ZhbHVlLCBiTW9kaWZpZWQpOw0KLX0NCi1DWEZBX0NhbGN1bGF0ZSBDWEZBX1dpZGdldERhdGE6OkdldENhbGN1bGF0ZShGWF9CT09MIGJNb2RpZmllZCApDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ2FsY3VsYXRlLCBiTW9kaWZpZWQpOw0KLX0NCi1DWEZBX1ZhbGlkYXRlIENYRkFfV2lkZ2V0RGF0YTo6R2V0VmFsaWRhdGUoRlhfQk9PTCBiTW9kaWZpZWQpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVmFsaWRhdGUsIGJNb2RpZmllZCk7DQotfQ0KLUNYRkFfVmFyaWFibGVzIENYRkFfV2lkZ2V0RGF0YTo6R2V0VmFyaWFibGVzKEZYX0JPT0wgYk1vZGlmaWVkICkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYXJpYWJsZXMsIGJNb2RpZmllZCk7DQotfQ0KLUNYRkFfQmluZCBDWEZBX1dpZGdldERhdGE6OkdldEJpbmQoRlhfQk9PTCBiTW9kaWZpZWQgKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0JpbmQsIGJNb2RpZmllZCk7DQotfQ0KLUNYRkFfQXNzaXN0IENYRkFfV2lkZ2V0RGF0YTo6R2V0QXNzaXN0KEZYX0JPT0wgYk1vZGlmaWVkICkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Bc3Npc3QsIGJNb2RpZmllZCk7DQotfQ0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRSZWxldmFudChDRlhfV2lkZVN0cmluZ0MgJndzUmVsZXZhbnQpDQotew0KLSAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1JlbGV2YW50LCB3c1JlbGV2YW50KTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldFdpZHRoKEZYX0ZMT0FUICZmV2lkdGgpDQotew0KLSAgICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1csIGZXaWR0aCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRIZWlnaHQoRlhfRkxPQVQgJmZIZWlnaHQpDQotew0KLSAgICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0gsIGZIZWlnaHQpOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0TWluV2lkdGgoRlhfRkxPQVQgJmZNaW5XaWR0aCkNCi17DQotICAgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWluVywgZk1pbldpZHRoKTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldE1pbkhlaWdodChGWF9GTE9BVCAmZk1pbkhlaWdodCkNCi17DQotICAgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWluSCwgZk1pbkhlaWdodCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRNYXhXaWR0aChGWF9GTE9BVCAmZk1heFdpZHRoKQ0KLXsNCi0gICAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhXLCBmTWF4V2lkdGgpOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0TWF4SGVpZ2h0KEZYX0ZMT0FUICZmTWF4SGVpZ2h0KQ0KLXsNCi0gICAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhILCBmTWF4SGVpZ2h0KTsNCi19DQotQ1hGQV9CaW5kSXRlbXMgQ1hGQV9XaWRnZXREYXRhOjpHZXRCaW5kSXRlbXMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0JpbmRJdGVtcyk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRBY2Nlc3MoaW50MzJfdCBpQWNjZXNzLCBGWF9CT09MIGJOb3RpZnkpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0FjY2VzcywgKFhGQV9BVFRSSUJVVEVFTlVNKWlBY2Nlc3MsIGJOb3RpZnkpOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0QWNjZXNzS2V5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0FjY2Vzc0tleSkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgd3NBY2Nlc3NLZXkpOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0QW5jaG9yVHlwZShpbnQzMl90IGlUeXBlKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLCAoWEZBX0FUVFJJQlVURUVOVU0paVR5cGUpOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0Q29sU3BhbihpbnQzMl90IGlDb2xTcGFuKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuLCAoWEZBX0FUVFJJQlVURUVOVU0paUNvbFNwYW4pOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0UHJlc2VuY2UoaW50MzJfdCBpUHJlc2VuY2UpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCAoWEZBX0FUVFJJQlVURUVOVU0paVByZXNlbmNlKTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldFJvdGF0ZShpbnQzMl90IGlSb3RhdGUpDQotew0KLSAgICBpUm90YXRlID0gWEZBX01hcFJvdGF0aW9uKGlSb3RhdGUpOw0KLSAgICBDWEZBX01lYXN1cmVtZW50IG1zKChGWF9GTE9BVClpUm90YXRlLCBYRkFfVU5JVF9BbmdsZSk7DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUm90YXRlLCBtcyk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRSZWxldmFudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZWxldmFudCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1JlbGV2YW50LCB3c1JlbGV2YW50KTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldFN0YXR1cyhGWF9EV09SRCBkd1N0YXR1cykNCi17DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldFdpZHRoKEZYX0ZMT0FUIGZXaWR0aCkNCi17DQotICAgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVywgZldpZHRoKTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldEhlaWdodChGWF9GTE9BVCBmSGVpZ2h0KQ0KLXsNCi0gICAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9ILCBmSGVpZ2h0KTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldE1pbldpZHRoKEZYX0ZMT0FUIGZNaW5XaWR0aCkNCi17DQotICAgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWluVywgZk1pbldpZHRoKTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldE1pbkhlaWdodChGWF9GTE9BVCBmTWluSGVpZ2h0KQ0KLXsNCi0gICAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9NaW5ILCBmTWluSGVpZ2h0KTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldE1heFdpZHRoKEZYX0ZMT0FUIGZNYXhXaWR0aCkNCi17DQotICAgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWF4VywgZk1heFdpZHRoKTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldE1heEhlaWdodChGWF9GTE9BVCBmTWF4SGVpZ2h0KQ0KLXsNCi0gICAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhILCBmTWF4SGVpZ2h0KTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldFBvcyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KQ0KLXsNCi0gICAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9YLCB4KSAmJiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSwgeSk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c05hbWUpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0QnV0dG9uSGlnaGxpZ2h0KGludDMyX3QgaUJ1dHRvbkhpZ2hsaWdodCkNCi17DQotICAgIENYRkFfTm9kZSogcFVpQ2hpbGROb2RlID0gR2V0VUlDaGlsZCgpOw0KLSAgICByZXR1cm4gcFVpQ2hpbGROb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfSGlnaGxpZ2h0LCAoWEZBX0FUVFJJQlVURUVOVU0paUJ1dHRvbkhpZ2hsaWdodCk7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRCdXR0b25Sb2xsb3Zlcihjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NSb2xsb3ZlciwgRlhfQk9PTCBiUmljaFRleHQpDQotew0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRCdXR0b25Eb3duKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Rvd24sIEZYX0JPT0wgYlJpY2hUZXh0KQ0KLXsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0Q2hlY2tCdXR0b25TaGFwZShpbnQzMl90IGlDaGVja0J1dHRvblNoYXBlKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwVWlDaGlsZE5vZGUgPSBHZXRVSUNoaWxkKCk7DQotICAgIHJldHVybiBwVWlDaGlsZE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9TaGFwZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlDaGVja0J1dHRvblNoYXBlKTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldENoZWNrQnV0dG9uTWFyayhpbnQzMl90IGlDaGVja0J1dHRvbk1hcmspDQotew0KLSAgICBDWEZBX05vZGUqIHBVaUNoaWxkTm9kZSA9IEdldFVJQ2hpbGQoKTsNCi0gICAgcmV0dXJuIHBVaUNoaWxkTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX01hcmssIChYRkFfQVRUUklCVVRFRU5VTSlpQ2hlY2tCdXR0b25NYXJrKTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldENoZWNrQnV0dG9uU2l6ZShGWF9GTE9BVCBmQ2hlY2tCdXR0b25NYXJrKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwVWlDaGlsZE5vZGUgPSBHZXRVSUNoaWxkKCk7DQotICAgIGlmIChwVWlDaGlsZE5vZGUpIHsNCi0gICAgICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoZkNoZWNrQnV0dG9uTWFyaywgWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgcmV0dXJuIHBVaUNoaWxkTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1NpemUsIG1zKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUNYRkFfQm9yZGVyIENYRkFfV2lkZ2V0RGF0YTo6R2V0VUlCb3JkZXIoRlhfQk9PTCBiTW9kaWZpZWQgKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCi0gICAgcmV0dXJuIHBVSUNoaWxkID8gcFVJQ2hpbGQtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0JvcmRlciwgYk1vZGlmaWVkKSA6IE5VTEw7DQotfQ0KLUNYRkFfTWFyZ2luIENYRkFfV2lkZ2V0RGF0YTo6R2V0VUlNYXJnaW4oRlhfQk9PTCBiTW9kaWZpZWQgKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCi0gICAgcmV0dXJuIHBVSUNoaWxkID8gcFVJQ2hpbGQtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX01hcmdpbiwgYk1vZGlmaWVkKSA6IE5VTEw7DQotfQ0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRVSU1hcmdpbihDRlhfUmVjdEYgJnJ0VUlNYXJnaW4pDQotew0KLSAgICBydFVJTWFyZ2luLlJlc2V0KCk7DQotICAgIENYRkFfTWFyZ2luIG1nVUkgPSBHZXRVSU1hcmdpbigpOw0KLSAgICBpZiAoIW1nVUkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX0JvcmRlciBib3JkZXIgPSBHZXRVSUJvcmRlcigpOw0KLSAgICBpZiAoYm9yZGVyICYmIGJvcmRlci5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQ7DQotICAgIEZYX0JPT0wgYkxlZnQgPSBtZ1VJLkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCi0gICAgRlhfQk9PTCBiVG9wID0gbWdVSS5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KLSAgICBGWF9CT09MIGJSaWdodCA9IG1nVUkuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQotICAgIEZYX0JPT0wgYkJvdHRvbSA9IG1nVUkuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsNCi0gICAgaWYgKGJvcmRlcikgew0KLSAgICAgICAgRlhfQk9PTCBiVmlzaWJsZSA9IEZBTFNFOw0KLSAgICAgICAgRlhfRkxPQVQgZlRoaWNrbmVzcyA9IDA7DQotICAgICAgICBib3JkZXIuR2V0M0RTdHlsZShiVmlzaWJsZSwgZlRoaWNrbmVzcyk7DQotICAgICAgICBpZiAoIWJMZWZ0IHx8ICFiVG9wIHx8ICFiUmlnaHQgfHwgIWJCb3R0b20pIHsNCi0gICAgICAgICAgICBDWEZBX1N0cm9rZUFycmF5IHN0cm9rZXM7DQotICAgICAgICAgICAgYm9yZGVyLkdldFN0cm9rZXMoc3Ryb2tlcyk7DQotICAgICAgICAgICAgaWYgKCFiVG9wKSB7DQotICAgICAgICAgICAgICAgIGZUb3BJbnNldCA9IFhGQV9HZXRFZGdlVGhpY2tuZXNzKHN0cm9rZXMsIGJWaXNpYmxlLCAwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCFiUmlnaHQpIHsNCi0gICAgICAgICAgICAgICAgZlJpZ2h0SW5zZXQgPSBYRkFfR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghYkJvdHRvbSkgew0KLSAgICAgICAgICAgICAgICBmQm90dG9tSW5zZXQgPSBYRkFfR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghYkxlZnQpIHsNCi0gICAgICAgICAgICAgICAgZkxlZnRJbnNldCA9IFhGQV9HZXRFZGdlVGhpY2tuZXNzKHN0cm9rZXMsIGJWaXNpYmxlLCAzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcnRVSU1hcmdpbi5TZXQoZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0KTsNCi19DQotaW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldEJ1dHRvbkhpZ2hsaWdodCgpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBpZiAocFVJQ2hpbGQpIHsNCi0gICAgICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hpZ2hsaWdodCk7DQotICAgIH0NCi0gICAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bShYRkFfRUxFTUVOVF9CdXR0b24sIFhGQV9BVFRSSUJVVEVfSGlnaGxpZ2h0LCBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QnV0dG9uUm9sbG92ZXIoQ0ZYX1dpZGVTdHJpbmcgJndzUm9sbG92ZXIsIEZYX0JPT0wgJmJSaWNoVGV4dCkNCi17DQotICAgIGlmIChDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0l0ZW1zKSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgd2hpbGUgKHBUZXh0KSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsNCi0gICAgICAgICAgICBwVGV4dC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KLSAgICAgICAgICAgIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJyb2xsb3ZlciIpKSB7DQotICAgICAgICAgICAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzUm9sbG92ZXIpOw0KLSAgICAgICAgICAgICAgICBiUmljaFRleHQgPSBwVGV4dC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICF3c1JvbGxvdmVyLklzRW1wdHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCdXR0b25Eb3duKENGWF9XaWRlU3RyaW5nICZ3c0Rvd24sIEZYX0JPT0wgJmJSaWNoVGV4dCkNCi17DQotICAgIGlmIChDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0l0ZW1zKSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgd2hpbGUocFRleHQpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lOw0KLSAgICAgICAgICAgIHBUZXh0LT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQotICAgICAgICAgICAgaWYgKHdzTmFtZSA9PSBGWF9XU1RSQyhMImRvd24iKSkgew0KLSAgICAgICAgICAgICAgICBwVGV4dC0+VHJ5Q29udGVudCh3c0Rvd24pOw0KLSAgICAgICAgICAgICAgICBiUmljaFRleHQgPSBwVGV4dC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICF3c0Rvd24uSXNFbXB0eSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwVGV4dCA9IHBUZXh0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotaW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldENoZWNrQnV0dG9uU2hhcGUoKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCi0gICAgaWYgKHBVSUNoaWxkKSB7DQotICAgICAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9TaGFwZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bShYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiwgWEZBX0FUVFJJQlVURV9TaGFwZSwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCi19DQotaW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldENoZWNrQnV0dG9uTWFyaygpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBpZiAocFVJQ2hpbGQpIHsNCi0gICAgICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX01hcmspOw0KLSAgICB9DQotICAgIHJldHVybiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sIFhGQV9BVFRSSUJVVEVfTWFyaywgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzUmFkaW9CdXR0b24oKQ0KLXsNCi0gICAgaWYgKENYRkFfTm9kZSogcFBhcmVudCA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7DQotICAgICAgICByZXR1cm4gcFBhcmVudC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0ZMT0FUIENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hlY2tCdXR0b25TaXplKCkNCi17DQotICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQotICAgIGlmIChwVUlDaGlsZCkgew0KLSAgICAgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2l6ZSkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9NZWFzdXJlKFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBYRkFfQVRUUklCVVRFX1NpemUsIFhGQV9YRFBQQUNLRVRfRm9ybSkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzQWxsb3dOZXV0cmFsKCkNCi17DQotICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQotICAgIGlmIChwVUlDaGlsZCkgew0KLSAgICAgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfQWxsb3dOZXV0cmFsKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9Cb29sZWFuKFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCi19DQotWEZBX0NIRUNLU1RBVEUgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaGVja1N0YXRlKCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRSYXdWYWx1ZSgpOw0KLSAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBYRkFfQ0hFQ0tTVEFURV9PZmY7DQotICAgIH0NCi0gICAgaWYgKENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICBpbnQzMl90IGkgPSAwOw0KLSAgICAgICAgd2hpbGUocFRleHQpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQotICAgICAgICAgICAgaWYgKHBUZXh0LT5UcnlDb250ZW50KHdzQ29udGVudCkgJiYgKHdzQ29udGVudCA9PSB3c1ZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gKFhGQV9DSEVDS1NUQVRFKWk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGkrKzsNCi0gICAgICAgICAgICBwVGV4dCA9IHBUZXh0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBYRkFfQ0hFQ0tTVEFURV9PZmY7DQotfQ0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpTZXRDaGVja1N0YXRlKFhGQV9DSEVDS1NUQVRFIGVDaGVja1N0YXRlLCBGWF9CT09MIGJOb3RpZnkpDQotew0KLSAgICBpZiAoQ1hGQV9XaWRnZXREYXRhIGV4Y2xHcm91cCA9IEdldEV4Y2xHcm91cE5vZGUoKSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCi0gICAgICAgIGlmIChlQ2hlY2tTdGF0ZSAhPSBYRkFfQ0hFQ0tTVEFURV9PZmYpIHsNCi0gICAgICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcykpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgICAgICBpZiAocFRleHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzVmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSAoKENYRkFfTm9kZSopZXhjbEdyb3VwKS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgZm9yICg7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgaWYgKHBDaGlsZC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBJdGVtID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcyk7DQotICAgICAgICAgICAgaWYgKCFwSXRlbSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwSXRlbWNoaWxkID0gcEl0ZW0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgICAgICAgICBpZiAoIXBJdGVtY2hpbGQpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHRleHQgPSBwSXRlbWNoaWxkLT5HZXRDb250ZW50KCk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGlsZFZhbHVlID0gdGV4dDsNCi0gICAgICAgICAgICBpZiAod3NWYWx1ZSAhPSB0ZXh0KSB7DQotICAgICAgICAgICAgICAgIHBJdGVtY2hpbGQgPSBwSXRlbWNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgICAgICBpZiAocEl0ZW1jaGlsZCkgew0KLSAgICAgICAgICAgICAgICAgICAgd3NDaGlsZFZhbHVlID0gcEl0ZW1jaGlsZC0+R2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgd3NDaGlsZFZhbHVlLkVtcHR5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1hGQV9XaWRnZXREYXRhIGNoKHBDaGlsZCk7DQotICAgICAgICAgICAgY2guU3luY1ZhbHVlKHdzQ2hpbGRWYWx1ZSwgYk5vdGlmeSk7DQotICAgICAgICB9DQotICAgICAgICBleGNsR3JvdXAuU3luY1ZhbHVlKHdzVmFsdWUsIGJOb3RpZnkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcyk7DQotICAgICAgICBpZiAoIXBJdGVtcykgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGludDMyX3QgaSA9IC0xOw0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KLSAgICAgICAgd2hpbGUgKHBUZXh0KSB7DQotICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgICAgIGlmIChpID09IGVDaGVja1N0YXRlKSB7DQotICAgICAgICAgICAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzQ29udGVudCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwVGV4dCA9IHBUZXh0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3luY1ZhbHVlKHdzQ29udGVudCwgYk5vdGlmeSk7DQotICAgIH0NCi19DQotQ1hGQV9Ob2RlKglDWEZBX1dpZGdldERhdGE6OkdldEV4Y2xHcm91cE5vZGUoKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwRXhjbCA9IChDWEZBX05vZGUqKW1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICBpZiAoIXBFeGNsIHx8IHBFeGNsLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gcEV4Y2w7DQotfQ0KLUNYRkFfTm9kZSogQ1hGQV9XaWRnZXREYXRhOjpHZXRTZWxlY3RlZE1lbWJlcigpDQotew0KLSAgICBDWEZBX05vZGUgKnBTZWxlY3RlZE1lbWJlciA9IE5VTEw7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzU3RhdGUgPSBHZXRSYXdWYWx1ZSgpOw0KLSAgICBpZiAod3NTdGF0ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBwU2VsZWN0ZWRNZW1iZXI7DQotICAgIH0NCi0gICAgZm9yIChDWEZBX05vZGUgKnBOb2RlID0gKENYRkFfTm9kZSopbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YShwTm9kZSk7DQotICAgICAgICBpZiAod2lkZ2V0RGF0YS5HZXRDaGVja1N0YXRlKCkgPT0gWEZBX0NIRUNLU1RBVEVfT24pIHsNCi0gICAgICAgICAgICBwU2VsZWN0ZWRNZW1iZXIgPSBwTm9kZTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcFNlbGVjdGVkTWVtYmVyOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfV2lkZ2V0RGF0YTo6U2V0U2VsZWN0ZWRNZW1iZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsIEZYX0JPT0wgYk5vdGlmeSkNCi17DQotICAgIENYRkFfTm9kZSAqcFNlbGVjdGVkTWVtYmVyID0gTlVMTDsNCi0gICAgRlhfRFdPUkQgbmFtZUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQotICAgIGZvciAoQ1hGQV9Ob2RlICpwTm9kZSA9IChDWEZBX05vZGUqKW1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcE5vZGUgIT0gTlVMTDsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgaWYgKHBOb2RlLT5HZXROYW1lSGFzaCgpID09IG5hbWVIYXNoKSB7DQotICAgICAgICAgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEocE5vZGUpOw0KLSAgICAgICAgICAgIHdpZGdldERhdGEuU2V0Q2hlY2tTdGF0ZShYRkFfQ0hFQ0tTVEFURV9PbiwgYk5vdGlmeSk7DQotICAgICAgICAgICAgcFNlbGVjdGVkTWVtYmVyID0gcE5vZGU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIHBTZWxlY3RlZE1lbWJlcjsNCi19DQotdm9pZCBDWEZBX1dpZGdldERhdGE6OlNldFNlbGVjdGVkTWVtYmVyQnlWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LCBGWF9CT09MIGJTeW5jRGF0YSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRXhjbEdyb3VwOw0KLSAgICBmb3IgKENYRkFfTm9kZSAqcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcyk7DQotICAgICAgICBpZiAoIXBJdGVtKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX05vZGUqIHBJdGVtY2hpbGQgPSBwSXRlbS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgaWYgKCFwSXRlbWNoaWxkKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoaWxkVmFsdWUgPSBwSXRlbWNoaWxkLT5HZXRDb250ZW50KCk7DQotICAgICAgICBpZiAod3NWYWx1ZSAhPSB3c0NoaWxkVmFsdWUpIHsNCi0gICAgICAgICAgICBwSXRlbWNoaWxkID0gcEl0ZW1jaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgICAgICAgICBpZiAocEl0ZW1jaGlsZCkgew0KLSAgICAgICAgICAgICAgICB3c0NoaWxkVmFsdWUgPSBwSXRlbWNoaWxkLT5HZXRDb250ZW50KCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgd3NDaGlsZFZhbHVlLkVtcHR5KCk7DQotICAgICAgICAgICAgfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRFdmVudEJ5QWN0aXZpdHkoaW50MzJfdCBpQWN0aXZpdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSYgZXZlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNGb3JtUmVhZHkpIHsNCisgIENYRkFfTm9kZUFycmF5IGFsbEV2ZW50czsNCisgIEdldEV2ZW50TGlzdChhbGxFdmVudHMpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBhbGxFdmVudHMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ1hGQV9FdmVudCBldmVudChhbGxFdmVudHNbaV0pOw0KKyAgICBpZiAoZXZlbnQuR2V0QWN0aXZpdHkoKSA9PSBpQWN0aXZpdHkpIHsNCisgICAgICBpZiAoaUFjdGl2aXR5ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JlYWR5KSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWY7DQorICAgICAgICBldmVudC5HZXRSZWYod3NSZWYpOw0KKyAgICAgICAgaWYgKGJJc0Zvcm1SZWFkeSkgew0KKyAgICAgICAgICBpZiAod3NSZWYgPT0gQ0ZYX1dpZGVTdHJpbmdDKEwiJGZvcm0iKSkgew0KKyAgICAgICAgICAgIGV2ZW50cy5BZGQoYWxsRXZlbnRzW2ldKTsNCisgICAgICAgICAgfQ0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB3c0V4Y2xHcm91cCA9IHdzVmFsdWU7DQorICAgICAgICAgIGlmICh3c1JlZiA9PSBDRlhfV2lkZVN0cmluZ0MoTCIkbGF5b3V0IikpIHsNCisgICAgICAgICAgICBldmVudHMuQWRkKGFsbEV2ZW50c1tpXSk7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCi0gICAgICAgIHBOb2RlLT5TZXRDb250ZW50KHdzQ2hpbGRWYWx1ZSwgd3NDaGlsZFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBGQUxTRSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGV2ZW50cy5BZGQoYWxsRXZlbnRzW2ldKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKG1fcE5vZGUpIHsNCi0gICAgICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NFeGNsR3JvdXAsIHdzRXhjbEdyb3VwLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KLSAgICB9DQorICB9DQorICByZXR1cm4gZXZlbnRzLkdldFNpemUoKTsNCiB9DQotQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldERhdGE6OkdldEV4Y2xHcm91cEZpcnN0TWVtYmVyKCkNCi17DQotICAgIENYRkFfTm9kZSogcEV4Y2wgPSBHZXROb2RlKCk7DQotICAgIGlmICghcEV4Y2wpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KK0NYRkFfVmFsdWUgQ1hGQV9XaWRnZXREYXRhOjpHZXREZWZhdWx0VmFsdWUoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIENYRkFfTm9kZSogcFRlbU5vZGUgPSBtX3BOb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCisgIHJldHVybiBwVGVtTm9kZSA/IHBUZW1Ob2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSwgYk1vZGlmaWVkKQ0KKyAgICAgICAgICAgICAgICAgIDogTlVMTDsNCit9DQorQ1hGQV9WYWx1ZSBDWEZBX1dpZGdldERhdGE6OkdldEZvcm1WYWx1ZShGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1ZhbHVlLCBiTW9kaWZpZWQpOw0KK30NCitDWEZBX0NhbGN1bGF0ZSBDWEZBX1dpZGdldERhdGE6OkdldENhbGN1bGF0ZShGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NhbGN1bGF0ZSwgYk1vZGlmaWVkKTsNCit9DQorQ1hGQV9WYWxpZGF0ZSBDWEZBX1dpZGdldERhdGE6OkdldFZhbGlkYXRlKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVmFsaWRhdGUsIGJNb2RpZmllZCk7DQorfQ0KK0NYRkFfVmFyaWFibGVzIENYRkFfV2lkZ2V0RGF0YTo6R2V0VmFyaWFibGVzKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVmFyaWFibGVzLCBiTW9kaWZpZWQpOw0KK30NCitDWEZBX0JpbmQgQ1hGQV9XaWRnZXREYXRhOjpHZXRCaW5kKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQmluZCwgYk1vZGlmaWVkKTsNCit9DQorQ1hGQV9Bc3Npc3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRBc3Npc3QoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Bc3Npc3QsIGJNb2RpZmllZCk7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRSZWxldmFudChDRlhfV2lkZVN0cmluZ0MmIHdzUmVsZXZhbnQpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIHdzUmVsZXZhbnQpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0V2lkdGgoRlhfRkxPQVQmIGZXaWR0aCkgew0KKyAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9XLCBmV2lkdGgpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0SGVpZ2h0KEZYX0ZMT0FUJiBmSGVpZ2h0KSB7DQorICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0gsIGZIZWlnaHQpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0TWluV2lkdGgoRlhfRkxPQVQmIGZNaW5XaWR0aCkgew0KKyAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NaW5XLCBmTWluV2lkdGgpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0TWluSGVpZ2h0KEZYX0ZMT0FUJiBmTWluSGVpZ2h0KSB7DQorICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX01pbkgsIGZNaW5IZWlnaHQpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0TWF4V2lkdGgoRlhfRkxPQVQmIGZNYXhXaWR0aCkgew0KKyAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhXLCBmTWF4V2lkdGgpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0TWF4SGVpZ2h0KEZYX0ZMT0FUJiBmTWF4SGVpZ2h0KSB7DQorICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX01heEgsIGZNYXhIZWlnaHQpOw0KK30NCitDWEZBX0JpbmRJdGVtcyBDWEZBX1dpZGdldERhdGE6OkdldEJpbmRJdGVtcygpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9CaW5kSXRlbXMpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0QWNjZXNzKGludDMyX3QgaUFjY2VzcywgRlhfQk9PTCBiTm90aWZ5KSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0FjY2VzcywgKFhGQV9BVFRSSUJVVEVFTlVNKWlBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBiTm90aWZ5KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldEFjY2Vzc0tleShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBY2Nlc3NLZXkpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgd3NBY2Nlc3NLZXkpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0QW5jaG9yVHlwZShpbnQzMl90IGlUeXBlKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsIChYRkFfQVRUUklCVVRFRU5VTSlpVHlwZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRDb2xTcGFuKGludDMyX3QgaUNvbFNwYW4pIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYRkFfQVRUUklCVVRFRU5VTSlpQ29sU3Bhbik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRQcmVzZW5jZShpbnQzMl90IGlQcmVzZW5jZSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlQcmVzZW5jZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRSb3RhdGUoaW50MzJfdCBpUm90YXRlKSB7DQorICBpUm90YXRlID0gWEZBX01hcFJvdGF0aW9uKGlSb3RhdGUpOw0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtcygoRlhfRkxPQVQpaVJvdGF0ZSwgWEZBX1VOSVRfQW5nbGUpOw0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Sb3RhdGUsIG1zKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldFJlbGV2YW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlbGV2YW50KSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWxldmFudCwgd3NSZWxldmFudCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRTdGF0dXMoRlhfRFdPUkQgZHdTdGF0dXMpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldFdpZHRoKEZYX0ZMT0FUIGZXaWR0aCkgew0KKyAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9XLCBmV2lkdGgpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0SGVpZ2h0KEZYX0ZMT0FUIGZIZWlnaHQpIHsNCisgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCwgZkhlaWdodCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRNaW5XaWR0aChGWF9GTE9BVCBmTWluV2lkdGgpIHsNCisgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWluVywgZk1pbldpZHRoKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldE1pbkhlaWdodChGWF9GTE9BVCBmTWluSGVpZ2h0KSB7DQorICByZXR1cm4gU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX01pbkgsIGZNaW5IZWlnaHQpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0TWF4V2lkdGgoRlhfRkxPQVQgZk1heFdpZHRoKSB7DQorICByZXR1cm4gU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX01heFcsIGZNYXhXaWR0aCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRNYXhIZWlnaHQoRlhfRkxPQVQgZk1heEhlaWdodCkgew0KKyAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhILCBmTWF4SGVpZ2h0KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldFBvcyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSB7DQorICByZXR1cm4gU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1gsIHgpICYmIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9ZLCB5KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldEJ1dHRvbkhpZ2hsaWdodChpbnQzMl90IGlCdXR0b25IaWdobGlnaHQpIHsNCisgIENYRkFfTm9kZSogcFVpQ2hpbGROb2RlID0gR2V0VUlDaGlsZCgpOw0KKyAgcmV0dXJuIHBVaUNoaWxkTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0hpZ2hsaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhGQV9BVFRSSUJVVEVFTlVNKWlCdXR0b25IaWdobGlnaHQpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0QnV0dG9uUm9sbG92ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUm9sbG92ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJpY2hUZXh0KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRCdXR0b25Eb3duKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Rvd24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmljaFRleHQpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldENoZWNrQnV0dG9uU2hhcGUoaW50MzJfdCBpQ2hlY2tCdXR0b25TaGFwZSkgew0KKyAgQ1hGQV9Ob2RlKiBwVWlDaGlsZE5vZGUgPSBHZXRVSUNoaWxkKCk7DQorICByZXR1cm4gcFVpQ2hpbGROb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfU2hhcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYRkFfQVRUUklCVVRFRU5VTSlpQ2hlY2tCdXR0b25TaGFwZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRDaGVja0J1dHRvbk1hcmsoaW50MzJfdCBpQ2hlY2tCdXR0b25NYXJrKSB7DQorICBDWEZBX05vZGUqIHBVaUNoaWxkTm9kZSA9IEdldFVJQ2hpbGQoKTsNCisgIHJldHVybiBwVWlDaGlsZE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9NYXJrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWEZBX0FUVFJJQlVURUVOVU0paUNoZWNrQnV0dG9uTWFyayk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRDaGVja0J1dHRvblNpemUoRlhfRkxPQVQgZkNoZWNrQnV0dG9uTWFyaykgew0KKyAgQ1hGQV9Ob2RlKiBwVWlDaGlsZE5vZGUgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAocFVpQ2hpbGROb2RlKSB7DQorICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoZkNoZWNrQnV0dG9uTWFyaywgWEZBX1VOSVRfUHQpOw0KKyAgICByZXR1cm4gcFVpQ2hpbGROb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2l6ZSwgbXMpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitDWEZBX0JvcmRlciBDWEZBX1dpZGdldERhdGE6OkdldFVJQm9yZGVyKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgcmV0dXJuIHBVSUNoaWxkID8gcFVJQ2hpbGQtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0JvcmRlciwgYk1vZGlmaWVkKQ0KKyAgICAgICAgICAgICAgICAgIDogTlVMTDsNCit9DQorQ1hGQV9NYXJnaW4gQ1hGQV9XaWRnZXREYXRhOjpHZXRVSU1hcmdpbihGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIHJldHVybiBwVUlDaGlsZCA/IHBVSUNoaWxkLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9NYXJnaW4sIGJNb2RpZmllZCkNCisgICAgICAgICAgICAgICAgICA6IE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRVSU1hcmdpbihDRlhfUmVjdEYmIHJ0VUlNYXJnaW4pIHsNCisgIHJ0VUlNYXJnaW4uUmVzZXQoKTsNCisgIENYRkFfTWFyZ2luIG1nVUkgPSBHZXRVSU1hcmdpbigpOw0KKyAgaWYgKCFtZ1VJKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfQm9yZGVyIGJvcmRlciA9IEdldFVJQm9yZGVyKCk7DQorICBpZiAoYm9yZGVyICYmIGJvcmRlci5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0Ow0KKyAgRlhfQk9PTCBiTGVmdCA9IG1nVUkuR2V0TGVmdEluc2V0KGZMZWZ0SW5zZXQpOw0KKyAgRlhfQk9PTCBiVG9wID0gbWdVSS5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KKyAgRlhfQk9PTCBiUmlnaHQgPSBtZ1VJLkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOw0KKyAgRlhfQk9PTCBiQm90dG9tID0gbWdVSS5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KKyAgaWYgKGJvcmRlcikgew0KKyAgICBGWF9CT09MIGJWaXNpYmxlID0gRkFMU0U7DQorICAgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSAwOw0KKyAgICBib3JkZXIuR2V0M0RTdHlsZShiVmlzaWJsZSwgZlRoaWNrbmVzcyk7DQorICAgIGlmICghYkxlZnQgfHwgIWJUb3AgfHwgIWJSaWdodCB8fCAhYkJvdHRvbSkgew0KKyAgICAgIENYRkFfU3Ryb2tlQXJyYXkgc3Ryb2tlczsNCisgICAgICBib3JkZXIuR2V0U3Ryb2tlcyhzdHJva2VzKTsNCisgICAgICBpZiAoIWJUb3ApIHsNCisgICAgICAgIGZUb3BJbnNldCA9IFhGQV9HZXRFZGdlVGhpY2tuZXNzKHN0cm9rZXMsIGJWaXNpYmxlLCAwKTsNCisgICAgICB9DQorICAgICAgaWYgKCFiUmlnaHQpIHsNCisgICAgICAgIGZSaWdodEluc2V0ID0gWEZBX0dldEVkZ2VUaGlja25lc3Moc3Ryb2tlcywgYlZpc2libGUsIDEpOw0KKyAgICAgIH0NCisgICAgICBpZiAoIWJCb3R0b20pIHsNCisgICAgICAgIGZCb3R0b21JbnNldCA9IFhGQV9HZXRFZGdlVGhpY2tuZXNzKHN0cm9rZXMsIGJWaXNpYmxlLCAyKTsNCisgICAgICB9DQorICAgICAgaWYgKCFiTGVmdCkgew0KKyAgICAgICAgZkxlZnRJbnNldCA9IFhGQV9HZXRFZGdlVGhpY2tuZXNzKHN0cm9rZXMsIGJWaXNpYmxlLCAzKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBFeGNsLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgIHdoaWxlIChwTm9kZSkgew0KLSAgICAgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCi0gICAgICAgICAgICByZXR1cm4gcE5vZGU7DQorICB9DQorICBydFVJTWFyZ2luLlNldChmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQpOw0KK30NCitpbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0QnV0dG9uSGlnaGxpZ2h0KCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIGlmIChwVUlDaGlsZCkgew0KKyAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IaWdobGlnaHQpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bSgNCisgICAgICBYRkFfRUxFTUVOVF9CdXR0b24sIFhGQV9BVFRSSUJVVEVfSGlnaGxpZ2h0LCBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QnV0dG9uUm9sbG92ZXIoQ0ZYX1dpZGVTdHJpbmcmIHdzUm9sbG92ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSaWNoVGV4dCkgew0KKyAgaWYgKENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpKSB7DQorICAgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgd2hpbGUgKHBUZXh0KSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsNCisgICAgICBwVGV4dC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICAgIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJyb2xsb3ZlciIpKSB7DQorICAgICAgICBwVGV4dC0+VHJ5Q29udGVudCh3c1JvbGxvdmVyKTsNCisgICAgICAgIGJSaWNoVGV4dCA9IHBUZXh0LT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhOw0KKyAgICAgICAgcmV0dXJuICF3c1JvbGxvdmVyLklzRW1wdHkoKTsNCisgICAgICB9DQorICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QnV0dG9uRG93bihDRlhfV2lkZVN0cmluZyYgd3NEb3duLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSaWNoVGV4dCkgew0KKyAgaWYgKENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpKSB7DQorICAgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgd2hpbGUgKHBUZXh0KSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsNCisgICAgICBwVGV4dC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICAgIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJkb3duIikpIHsNCisgICAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzRG93bik7DQorICAgICAgICBiUmljaFRleHQgPSBwVGV4dC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YTsNCisgICAgICAgIHJldHVybiAhd3NEb3duLklzRW1wdHkoKTsNCisgICAgICB9DQorICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitpbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hlY2tCdXR0b25TaGFwZSgpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAocFVJQ2hpbGQpIHsNCisgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfU2hhcGUpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bSgNCisgICAgICBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiwgWEZBX0FUVFJJQlVURV9TaGFwZSwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldENoZWNrQnV0dG9uTWFyaygpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAocFVJQ2hpbGQpIHsNCisgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWFyayk7DQorICB9DQorICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9FbnVtKA0KKyAgICAgIFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBYRkFfQVRUUklCVVRFX01hcmssIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpJc1JhZGlvQnV0dG9uKCkgew0KKyAgaWYgKENYRkFfTm9kZSogcFBhcmVudCA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7DQorICAgIHJldHVybiBwUGFyZW50LT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9GTE9BVCBDWEZBX1dpZGdldERhdGE6OkdldENoZWNrQnV0dG9uU2l6ZSgpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAocFVJQ2hpbGQpIHsNCisgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2l6ZSkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgIH0NCisgIHJldHVybiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX01lYXN1cmUoDQorICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBYRkFfQVRUUklCVVRFX1NpemUsIFhGQV9YRFBQQUNLRVRfRm9ybSkNCisgICAgICAuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzQWxsb3dOZXV0cmFsKCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIGlmIChwVUlDaGlsZCkgew0KKyAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQm9vbGVhbigNCisgICAgICBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiwgWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwsIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorfQ0KK1hGQV9DSEVDS1NUQVRFIENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hlY2tTdGF0ZSgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRSYXdWYWx1ZSgpOw0KKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBYRkFfQ0hFQ0tTVEFURV9PZmY7DQorICB9DQorICBpZiAoQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcykpIHsNCisgICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICB3aGlsZSAocFRleHQpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICAgICAgaWYgKHBUZXh0LT5UcnlDb250ZW50KHdzQ29udGVudCkgJiYgKHdzQ29udGVudCA9PSB3c1ZhbHVlKSkgew0KKyAgICAgICAgcmV0dXJuIChYRkFfQ0hFQ0tTVEFURSlpOw0KKyAgICAgIH0NCisgICAgICBpKys7DQorICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9DSEVDS1NUQVRFX09mZjsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OlNldENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5KSB7DQorICBpZiAoQ1hGQV9XaWRnZXREYXRhIGV4Y2xHcm91cCA9IEdldEV4Y2xHcm91cE5vZGUoKSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICBpZiAoZUNoZWNrU3RhdGUgIT0gWEZBX0NIRUNLU1RBVEVfT2ZmKSB7DQorICAgICAgaWYgKENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBpZiAocFRleHQpIHsNCisgICAgICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NWYWx1ZSk7DQogICAgICAgICB9DQotICAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBDaGlsZCA9DQorICAgICAgICAoKENYRkFfTm9kZSopZXhjbEdyb3VwKS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBmb3IgKDsgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICBpZiAocENoaWxkLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBJdGVtID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcyk7DQorICAgICAgaWYgKCFwSXRlbSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogcEl0ZW1jaGlsZCA9IHBJdGVtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgaWYgKCFwSXRlbWNoaWxkKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgdGV4dCA9IHBJdGVtY2hpbGQtPkdldENvbnRlbnQoKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoaWxkVmFsdWUgPSB0ZXh0Ow0KKyAgICAgIGlmICh3c1ZhbHVlICE9IHRleHQpIHsNCisgICAgICAgIHBJdGVtY2hpbGQgPSBwSXRlbWNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgaWYgKHBJdGVtY2hpbGQpIHsNCisgICAgICAgICAgd3NDaGlsZFZhbHVlID0gcEl0ZW1jaGlsZC0+R2V0Q29udGVudCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NDaGlsZFZhbHVlLkVtcHR5KCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIENYRkFfV2lkZ2V0RGF0YSBjaChwQ2hpbGQpOw0KKyAgICAgIGNoLlN5bmNWYWx1ZSh3c0NoaWxkVmFsdWUsIGJOb3RpZnkpOw0KKyAgICB9DQorICAgIGV4Y2xHcm91cC5TeW5jVmFsdWUod3NWYWx1ZSwgYk5vdGlmeSk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgaWYgKCFwSXRlbXMpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaW50MzJfdCBpID0gLTE7DQorICAgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgICB3aGlsZSAocFRleHQpIHsNCisgICAgICBpKys7DQorICAgICAgaWYgKGkgPT0gZUNoZWNrU3RhdGUpIHsNCisgICAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgICBTeW5jVmFsdWUod3NDb250ZW50LCBiTm90aWZ5KTsNCisgIH0NCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldERhdGE6OkdldEV4Y2xHcm91cE5vZGUoKSB7DQorICBDWEZBX05vZGUqIHBFeGNsID0gKENYRkFfTm9kZSopbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICBpZiAoIXBFeGNsIHx8IHBFeGNsLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBFeGNsOw0KIH0NCi1DWEZBX05vZGUqIENYRkFfV2lkZ2V0RGF0YTo6R2V0RXhjbEdyb3VwTmV4dE1lbWJlcihDWEZBX05vZGUqIHBOb2RlKQ0KLXsNCi0gICAgaWYgKCFwTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQorQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldERhdGE6OkdldFNlbGVjdGVkTWVtYmVyKCkgew0KKyAgQ1hGQV9Ob2RlKiBwU2VsZWN0ZWRNZW1iZXIgPSBOVUxMOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NTdGF0ZSA9IEdldFJhd1ZhbHVlKCk7DQorICBpZiAod3NTdGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIHBTZWxlY3RlZE1lbWJlcjsNCisgIH0NCisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9DQorICAgICAgICAgICAoQ1hGQV9Ob2RlKiltX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgIHBOb2RlICE9IE5VTEw7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEocE5vZGUpOw0KKyAgICBpZiAod2lkZ2V0RGF0YS5HZXRDaGVja1N0YXRlKCkgPT0gWEZBX0NIRUNLU1RBVEVfT24pIHsNCisgICAgICBwU2VsZWN0ZWRNZW1iZXIgPSBwTm9kZTsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBDWEZBX05vZGUqIHBOb2RlRmllbGQgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgd2hpbGUgKHBOb2RlRmllbGQpIHsNCi0gICAgICAgIGlmIChwTm9kZUZpZWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCi0gICAgICAgICAgICByZXR1cm4gcE5vZGVGaWVsZDsNCi0gICAgICAgIH0NCi0gICAgICAgIHBOb2RlRmllbGQgPSBwTm9kZUZpZWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgcmV0dXJuIHBTZWxlY3RlZE1lbWJlcjsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldERhdGE6OlNldFNlbGVjdGVkTWVtYmVyKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsNCisgIENYRkFfTm9kZSogcFNlbGVjdGVkTWVtYmVyID0gTlVMTDsNCisgIEZYX0RXT1JEIG5hbWVIYXNoID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQorICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPQ0KKyAgICAgICAgICAgKENYRkFfTm9kZSopbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBuYW1lSGFzaCkgew0KKyAgICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKHBOb2RlKTsNCisgICAgICB3aWRnZXREYXRhLlNldENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEVfT24sIGJOb3RpZnkpOw0KKyAgICAgIHBTZWxlY3RlZE1lbWJlciA9IHBOb2RlOw0KKyAgICAgIGJyZWFrOw0KICAgICB9DQorICB9DQorICByZXR1cm4gcFNlbGVjdGVkTWVtYmVyOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6U2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bmNEYXRhKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0V4Y2xHcm91cDsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcE5vZGU7DQorICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBJdGVtID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgaWYgKCFwSXRlbSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcEl0ZW1jaGlsZCA9IHBJdGVtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGlmICghcEl0ZW1jaGlsZCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hpbGRWYWx1ZSA9IHBJdGVtY2hpbGQtPkdldENvbnRlbnQoKTsNCisgICAgaWYgKHdzVmFsdWUgIT0gd3NDaGlsZFZhbHVlKSB7DQorICAgICAgcEl0ZW1jaGlsZCA9IHBJdGVtY2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgaWYgKHBJdGVtY2hpbGQpIHsNCisgICAgICAgIHdzQ2hpbGRWYWx1ZSA9IHBJdGVtY2hpbGQtPkdldENvbnRlbnQoKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgd3NDaGlsZFZhbHVlLkVtcHR5KCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdzRXhjbEdyb3VwID0gd3NWYWx1ZTsNCisgICAgfQ0KKyAgICBwTm9kZS0+U2V0Q29udGVudCh3c0NoaWxkVmFsdWUsIHdzQ2hpbGRWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOw0KKyAgfQ0KKyAgaWYgKG1fcE5vZGUpIHsNCisgICAgbV9wTm9kZS0+U2V0Q29udGVudCh3c0V4Y2xHcm91cCwgd3NFeGNsR3JvdXAsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgYlN5bmNEYXRhKTsNCisgIH0NCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldERhdGE6OkdldEV4Y2xHcm91cEZpcnN0TWVtYmVyKCkgew0KKyAgQ1hGQV9Ob2RlKiBwRXhjbCA9IEdldE5vZGUoKTsNCisgIGlmICghcEV4Y2wpIHsNCiAgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gcEV4Y2wtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChwTm9kZSkgew0KKyAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICAgIHJldHVybiBwTm9kZTsNCisgICAgfQ0KKyAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0Q29tbWl0T24oKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCi0gICAgaWYgKHBVSUNoaWxkKSB7DQotICAgICAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9Db21taXRPbik7DQorQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldERhdGE6OkdldEV4Y2xHcm91cE5leHRNZW1iZXIoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGVGaWVsZCA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgd2hpbGUgKHBOb2RlRmllbGQpIHsNCisgICAgaWYgKHBOb2RlRmllbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICAgIHJldHVybiBwTm9kZUZpZWxkOw0KICAgICB9DQotICAgIHJldHVybiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCwgWEZBX0FUVFJJQlVURV9Db21taXRPbiwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCisgICAgcE5vZGVGaWVsZCA9IHBOb2RlRmllbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCiB9DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkNCi17DQotICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQotICAgIGlmIChwVUlDaGlsZCkgew0KLSAgICAgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfVGV4dEVudHJ5KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9Cb29sZWFuKFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QsIFhGQV9BVFRSSUJVVEVfVGV4dEVudHJ5LCBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0Q29tbWl0T24oKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgaWYgKHBVSUNoaWxkKSB7DQorICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX0NvbW1pdE9uKTsNCisgIH0NCisgIHJldHVybiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oDQorICAgICAgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCwgWEZBX0FUVFJJQlVURV9Db21taXRPbiwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCiB9DQotaW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldENob2ljZUxpc3RPcGVuKCkNCi17DQotICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQotICAgIGlmIChwVUlDaGlsZCkgew0KLSAgICAgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3Blbik7DQotICAgIH0NCi0gICAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bShYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LCBYRkFfQVRUUklCVVRFX09wZW4sIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIGlmIChwVUlDaGlsZCkgew0KKyAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9UZXh0RW50cnkpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQm9vbGVhbigNCisgICAgICBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LCBYRkFfQVRUUklCVVRFX1RleHRFbnRyeSwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCiB9DQotRlhfQk9PTAlDWEZBX1dpZGdldERhdGE6OklzTGlzdEJveCgpDQotew0KLSAgICBpbnQzMl90IGlPcGVuTW9kZSA9IEdldENob2ljZUxpc3RPcGVuKCk7DQotICAgIHJldHVybiAoaU9wZW5Nb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX0Fsd2F5cyB8fCBpT3Blbk1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpOw0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0T3BlbigpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAocFVJQ2hpbGQpIHsNCisgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3Blbik7DQorICB9DQorICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9FbnVtKA0KKyAgICAgIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QsIFhGQV9BVFRSSUJVVEVfT3BlbiwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCiB9DQotaW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkNvdW50Q2hvaWNlTGlzdEl0ZW1zKEZYX0JPT0wgYlNhdmVWYWx1ZSkNCi17DQotICAgIENYRkFfTm9kZUFycmF5IHBJdGVtczsNCi0gICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IE5VTEw7DQotICAgIGludDMyX3QgaUNvdW50ID0gMDsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaUNvdW50Kys7DQotICAgICAgICBwSXRlbXMuQWRkKHBOb2RlKTsNCi0gICAgICAgIGlmIChpQ291bnQgPT0gMikgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmKGlDb3VudCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLSAgICBwSXRlbSA9IHBJdGVtc1swXTsNCi0gICAgaWYgKGlDb3VudCA+IDEpIHsNCi0gICAgICAgIEZYX0JPT0wgYkl0ZW1PbmVIYXNTYXZlID0gcEl0ZW1zWzBdLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQotICAgICAgICBGWF9CT09MIGJJdGVtVHdvSGFzU2F2ZSA9IHBJdGVtc1sxXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOw0KLSAgICAgICAgaWYgKGJJdGVtT25lSGFzU2F2ZSAhPSBiSXRlbVR3b0hhc1NhdmUgJiYgYlNhdmVWYWx1ZSA9PSBiSXRlbVR3b0hhc1NhdmUpIHsNCi0gICAgICAgICAgICBwSXRlbSA9IHBJdGVtc1sxXTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwSXRlbXMuUmVtb3ZlQWxsKCk7DQotICAgIHJldHVybiBwSXRlbS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9VTktOT1dOKTsNCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6SXNMaXN0Qm94KCkgew0KKyAgaW50MzJfdCBpT3Blbk1vZGUgPSBHZXRDaG9pY2VMaXN0T3BlbigpOw0KKyAgcmV0dXJuIChpT3Blbk1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fQWx3YXlzIHx8DQorICAgICAgICAgIGlPcGVuTW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCk7DQogfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0SXRlbShDRlhfV2lkZVN0cmluZyAmd3NUZXh0LCBpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiU2F2ZVZhbHVlICkNCi17DQotICAgIHdzVGV4dC5FbXB0eSgpOw0KLSAgICBDWEZBX05vZGVBcnJheSBwSXRlbXNBcnJheTsNCi0gICAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBOVUxMOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlDb3VudCsrOw0KLSAgICAgICAgcEl0ZW1zQXJyYXkuQWRkKHBOb2RlKTsNCi0gICAgICAgIGlmIChpQ291bnQgPT0gMikgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpDb3VudENob2ljZUxpc3RJdGVtcyhGWF9CT09MIGJTYXZlVmFsdWUpIHsNCisgIENYRkFfTm9kZUFycmF5IHBJdGVtczsNCisgIENYRkFfTm9kZSogcEl0ZW0gPSBOVUxMOw0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIGlmIChpQ291bnQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICBpQ291bnQrKzsNCisgICAgcEl0ZW1zLkFkZChwTm9kZSk7DQorICAgIGlmIChpQ291bnQgPT0gMikgew0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHBJdGVtcyA9IHBJdGVtc0FycmF5WzBdOw0KLSAgICBpZiAoaUNvdW50ID4gMSkgew0KLSAgICAgICAgRlhfQk9PTCBiSXRlbU9uZUhhc1NhdmUgPSBwSXRlbXNBcnJheVswXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOw0KLSAgICAgICAgRlhfQk9PTCBiSXRlbVR3b0hhc1NhdmUgPSBwSXRlbXNBcnJheVsxXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOw0KLSAgICAgICAgaWYgKGJJdGVtT25lSGFzU2F2ZSAhPSBiSXRlbVR3b0hhc1NhdmUgJiYgYlNhdmVWYWx1ZSA9PSBiSXRlbVR3b0hhc1NhdmUpIHsNCi0gICAgICAgICAgICBwSXRlbXMgPSBwSXRlbXNBcnJheVsxXTsNCi0gICAgICAgIH0NCisgIH0NCisgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHBJdGVtID0gcEl0ZW1zWzBdOw0KKyAgaWYgKGlDb3VudCA+IDEpIHsNCisgICAgRlhfQk9PTCBiSXRlbU9uZUhhc1NhdmUgPSBwSXRlbXNbMF0tPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsNCisgICAgRlhfQk9PTCBiSXRlbVR3b0hhc1NhdmUgPSBwSXRlbXNbMV0tPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsNCisgICAgaWYgKGJJdGVtT25lSGFzU2F2ZSAhPSBiSXRlbVR3b0hhc1NhdmUgJiYgYlNhdmVWYWx1ZSA9PSBiSXRlbVR3b0hhc1NhdmUpIHsNCisgICAgICBwSXRlbSA9IHBJdGVtc1sxXTsNCiAgICAgfQ0KLSAgICBpZiAocEl0ZW1zKSB7DQotICAgICAgICBDWEZBX05vZGUgKnBJdGVtID0gcEl0ZW1zLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX1VOS05PV04pOw0KLSAgICAgICAgaWYocEl0ZW0gIT0gTlVMTCkgew0KLSAgICAgICAgICAgIHBJdGVtLT5UcnlDb250ZW50KHdzVGV4dCk7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQorICB9DQorICBwSXRlbXMuUmVtb3ZlQWxsKCk7DQorICByZXR1cm4gcEl0ZW0tPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfVU5LTk9XTik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0SXRlbShDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVZhbHVlKSB7DQorICB3c1RleHQuRW1wdHkoKTsNCisgIENYRkFfTm9kZUFycmF5IHBJdGVtc0FycmF5Ow0KKyAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBOVUxMOw0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQorICAgIGlDb3VudCsrOw0KKyAgICBwSXRlbXNBcnJheS5BZGQocE5vZGUpOw0KKyAgICBpZiAoaUNvdW50ID09IDIpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGlDb3VudCA9PSAwKSB7DQogICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHBJdGVtcyA9IHBJdGVtc0FycmF5WzBdOw0KKyAgaWYgKGlDb3VudCA+IDEpIHsNCisgICAgRlhfQk9PTCBiSXRlbU9uZUhhc1NhdmUgPSBwSXRlbXNBcnJheVswXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOw0KKyAgICBGWF9CT09MIGJJdGVtVHdvSGFzU2F2ZSA9IHBJdGVtc0FycmF5WzFdLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgIGlmIChiSXRlbU9uZUhhc1NhdmUgIT0gYkl0ZW1Ud29IYXNTYXZlICYmIGJTYXZlVmFsdWUgPT0gYkl0ZW1Ud29IYXNTYXZlKSB7DQorICAgICAgcEl0ZW1zID0gcEl0ZW1zQXJyYXlbMV07DQorICAgIH0NCisgIH0NCisgIGlmIChwSXRlbXMpIHsNCisgICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IHBJdGVtcy0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9VTktOT1dOKTsNCisgICAgaWYgKHBJdGVtICE9IE5VTEwpIHsNCisgICAgICBwSXRlbS0+VHJ5Q29udGVudCh3c1RleHQpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0SXRlbXMoQ0ZYX1dpZGVTdHJpbmdBcnJheSAmd3NUZXh0QXJyYXksIEZYX0JPT0wgYlNhdmVWYWx1ZSApDQotew0KLSAgICBDWEZBX05vZGVBcnJheSBwSXRlbXM7DQotICAgIENYRkFfTm9kZSogcEl0ZW0gPSBOVUxMOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlDb3VudCsrOw0KLSAgICAgICAgcEl0ZW1zLkFkZChwTm9kZSk7DQotICAgICAgICBpZiAoaUNvdW50ID09IDIpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hvaWNlTGlzdEl0ZW1zKENGWF9XaWRlU3RyaW5nQXJyYXkmIHdzVGV4dEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVZhbHVlKSB7DQorICBDWEZBX05vZGVBcnJheSBwSXRlbXM7DQorICBDWEZBX05vZGUqIHBJdGVtID0gTlVMTDsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICBmb3IgKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBpZihpQ291bnQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgICBpQ291bnQrKzsNCisgICAgcEl0ZW1zLkFkZChwTm9kZSk7DQorICAgIGlmIChpQ291bnQgPT0gMikgew0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIHBJdGVtID0gcEl0ZW1zWzBdOw0KLSAgICBpZiAoaUNvdW50ID4gMSkgew0KLSAgICAgICAgRlhfQk9PTCBiSXRlbU9uZUhhc1NhdmUgPSBwSXRlbXNbMF0tPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsNCi0gICAgICAgIEZYX0JPT0wgYkl0ZW1Ud29IYXNTYXZlID0gcEl0ZW1zWzFdLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQotICAgICAgICBpZiAoYkl0ZW1PbmVIYXNTYXZlICE9IGJJdGVtVHdvSGFzU2F2ZSAmJiBiU2F2ZVZhbHVlID09IGJJdGVtVHdvSGFzU2F2ZSkgew0KLSAgICAgICAgICAgIHBJdGVtID0gcEl0ZW1zWzFdOw0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBJdGVtID0gcEl0ZW1zWzBdOw0KKyAgaWYgKGlDb3VudCA+IDEpIHsNCisgICAgRlhfQk9PTCBiSXRlbU9uZUhhc1NhdmUgPSBwSXRlbXNbMF0tPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsNCisgICAgRlhfQk9PTCBiSXRlbVR3b0hhc1NhdmUgPSBwSXRlbXNbMV0tPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsNCisgICAgaWYgKGJJdGVtT25lSGFzU2F2ZSAhPSBiSXRlbVR3b0hhc1NhdmUgJiYgYlNhdmVWYWx1ZSA9PSBiSXRlbVR3b0hhc1NhdmUpIHsNCisgICAgICBwSXRlbSA9IHBJdGVtc1sxXTsNCiAgICAgfQ0KLSAgICBwSXRlbXMuUmVtb3ZlQWxsKCk7DQotICAgIHBOb2RlID0gcEl0ZW0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBwTm9kZS0+VHJ5Q29udGVudCh3c1RleHRBcnJheS5BZGQoKSk7DQotICAgIH0NCisgIH0NCisgIHBJdGVtcy5SZW1vdmVBbGwoKTsNCisgIHBOb2RlID0gcEl0ZW0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBwTm9kZS0+VHJ5Q29udGVudCh3c1RleHRBcnJheS5BZGQoKSk7DQorICB9DQogfQ0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpDb3VudFNlbGVjdGVkSXRlbXMoKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1ZhbHVlQXJyYXk7DQotICAgIEdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1ZhbHVlQXJyYXkpOw0KLSAgICBpZiAoSXNMaXN0Qm94KCkgfHwgIUlzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkpIHsNCi0gICAgICAgIHJldHVybiB3c1ZhbHVlQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICB9DQotICAgIGludDMyX3QgaVNlbGVjdGVkID0gMDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1NhdmVUZXh0QXJyYXk7DQotICAgIEdldENob2ljZUxpc3RJdGVtcyh3c1NhdmVUZXh0QXJyYXksIFRSVUUpOw0KLSAgICBpbnQzMl90IGlWYWx1ZXMgPSB3c1ZhbHVlQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpVmFsdWVzOyBpKyspIHsNCi0gICAgICAgIGludDMyX3QgaVNhdmVzID0gd3NTYXZlVGV4dEFycmF5LkdldFNpemUoKTsNCi0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlTYXZlczsgaisrKSB7DQotICAgICAgICAgICAgaWYgKHdzVmFsdWVBcnJheVtpXSA9PSB3c1NhdmVUZXh0QXJyYXlbal0pIHsNCi0gICAgICAgICAgICAgICAgaVNlbGVjdGVkKys7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaVNlbGVjdGVkOw0KLX0NCi1pbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0U2VsZWN0ZWRJdGVtKGludDMyX3QgbkluZGV4ICkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NWYWx1ZUFycmF5Ow0KLSAgICBHZXRTZWxlY3RlZEl0ZW1zVmFsdWUod3NWYWx1ZUFycmF5KTsNCi0gICAgaW50MzJfdCBpU2VsZWN0ZWQgPSAwOw0KLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzU2F2ZVRleHRBcnJheTsNCi0gICAgR2V0Q2hvaWNlTGlzdEl0ZW1zKHdzU2F2ZVRleHRBcnJheSwgVFJVRSk7DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkNvdW50U2VsZWN0ZWRJdGVtcygpIHsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NWYWx1ZUFycmF5Ow0KKyAgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKHdzVmFsdWVBcnJheSk7DQorICBpZiAoSXNMaXN0Qm94KCkgfHwgIUlzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkpIHsNCisgICAgcmV0dXJuIHdzVmFsdWVBcnJheS5HZXRTaXplKCk7DQorICB9DQorICBpbnQzMl90IGlTZWxlY3RlZCA9IDA7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzU2F2ZVRleHRBcnJheTsNCisgIEdldENob2ljZUxpc3RJdGVtcyh3c1NhdmVUZXh0QXJyYXksIFRSVUUpOw0KKyAgaW50MzJfdCBpVmFsdWVzID0gd3NWYWx1ZUFycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlWYWx1ZXM7IGkrKykgew0KICAgICBpbnQzMl90IGlTYXZlcyA9IHdzU2F2ZVRleHRBcnJheS5HZXRTaXplKCk7DQogICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlTYXZlczsgaisrKSB7DQotICAgICAgICBpZiAod3NWYWx1ZUFycmF5W25JbmRleF0gPT0gd3NTYXZlVGV4dEFycmF5W2pdKSB7DQotICAgICAgICAgICAgcmV0dXJuIGo7DQotICAgICAgICB9DQorICAgICAgaWYgKHdzVmFsdWVBcnJheVtpXSA9PSB3c1NhdmVUZXh0QXJyYXlbal0pIHsNCisgICAgICAgIGlTZWxlY3RlZCsrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KICAgICB9DQotICAgIHJldHVybiAtMTsNCisgIH0NCisgIHJldHVybiBpU2VsZWN0ZWQ7DQogfQ0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRTZWxlY3RlZEl0ZW1zKENGWF9JbnQzMkFycmF5ICZpU2VsQXJyYXkpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzVmFsdWVBcnJheTsNCi0gICAgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKHdzVmFsdWVBcnJheSk7DQotICAgIGludDMyX3QgaVZhbHVlcyA9IHdzVmFsdWVBcnJheS5HZXRTaXplKCk7DQotICAgIGlmIChpVmFsdWVzIDwgMSkgew0KLSAgICAgICAgcmV0dXJuOw0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRTZWxlY3RlZEl0ZW0oaW50MzJfdCBuSW5kZXgpIHsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NWYWx1ZUFycmF5Ow0KKyAgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKHdzVmFsdWVBcnJheSk7DQorICBpbnQzMl90IGlTZWxlY3RlZCA9IDA7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzU2F2ZVRleHRBcnJheTsNCisgIEdldENob2ljZUxpc3RJdGVtcyh3c1NhdmVUZXh0QXJyYXksIFRSVUUpOw0KKyAgaW50MzJfdCBpU2F2ZXMgPSB3c1NhdmVUZXh0QXJyYXkuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVNhdmVzOyBqKyspIHsNCisgICAgaWYgKHdzVmFsdWVBcnJheVtuSW5kZXhdID09IHdzU2F2ZVRleHRBcnJheVtqXSkgew0KKyAgICAgIHJldHVybiBqOw0KICAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTYXZlVGV4dEFycmF5Ow0KLSAgICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCi0gICAgaW50MzJfdCBpU2F2ZXMgPSB3c1NhdmVUZXh0QXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpVmFsdWVzOyBpKyspIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlTYXZlczsgaisrKSB7DQotICAgICAgICAgICAgaWYgKHdzVmFsdWVBcnJheVtpXSA9PSB3c1NhdmVUZXh0QXJyYXlbal0pIHsNCi0gICAgICAgICAgICAgICAgaVNlbEFycmF5LkFkZChqKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQorICB9DQorICByZXR1cm4gLTE7DQogfQ0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRTZWxlY3RlZEl0ZW1zVmFsdWUoQ0ZYX1dpZGVTdHJpbmdBcnJheSAmd3NTZWxUZXh0QXJyYXkpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gR2V0UmF3VmFsdWUoKTsNCi0gICAgaWYgKEdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0U2VsZWN0ZWRJdGVtcyhDRlhfSW50MzJBcnJheSYgaVNlbEFycmF5KSB7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzVmFsdWVBcnJheTsNCisgIEdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1ZhbHVlQXJyYXkpOw0KKyAgaW50MzJfdCBpVmFsdWVzID0gd3NWYWx1ZUFycmF5LkdldFNpemUoKTsNCisgIGlmIChpVmFsdWVzIDwgMSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzU2F2ZVRleHRBcnJheTsNCisgIEdldENob2ljZUxpc3RJdGVtcyh3c1NhdmVUZXh0QXJyYXksIFRSVUUpOw0KKyAgaW50MzJfdCBpU2F2ZXMgPSB3c1NhdmVUZXh0QXJyYXkuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVZhbHVlczsgaSsrKSB7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlTYXZlczsgaisrKSB7DQorICAgICAgaWYgKHdzVmFsdWVBcnJheVtpXSA9PSB3c1NhdmVUZXh0QXJyYXlbal0pIHsNCisgICAgICAgIGlTZWxBcnJheS5BZGQoaik7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OkdldFNlbGVjdGVkSXRlbXNWYWx1ZSgNCisgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgd3NTZWxUZXh0QXJyYXkpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRSYXdWYWx1ZSgpOw0KKyAgaWYgKEdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCisgICAgaWYgKCF3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgIGludDMyX3QgaVN0YXJ0ID0gMDsNCisgICAgICBpbnQzMl90IGlMZW5ndGggPSB3c1ZhbHVlLkdldExlbmd0aCgpOw0KKyAgICAgIGludDMyX3QgaUVuZCA9IHdzVmFsdWUuRmluZChMJ1xuJywgaVN0YXJ0KTsNCisgICAgICBpRW5kID0gKGlFbmQgPT0gLTEpID8gaUxlbmd0aCA6IGlFbmQ7DQorICAgICAgd2hpbGUgKGlFbmQgPj0gaVN0YXJ0KSB7DQorICAgICAgICB3c1NlbFRleHRBcnJheS5BZGQod3NWYWx1ZS5NaWQoaVN0YXJ0LCBpRW5kIC0gaVN0YXJ0KSk7DQorICAgICAgICBpU3RhcnQgPSBpRW5kICsgMTsNCisgICAgICAgIGlmIChpU3RhcnQgPj0gaUxlbmd0aCkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlFbmQgPSB3c1ZhbHVlLkZpbmQoTCdcbicsIGlTdGFydCk7DQorICAgICAgICBpZiAoaUVuZCA8IDApIHsNCisgICAgICAgICAgd3NTZWxUZXh0QXJyYXkuQWRkKHdzVmFsdWUuTWlkKGlTdGFydCwgaUxlbmd0aCAtIGlTdGFydCkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgd3NTZWxUZXh0QXJyYXkuQWRkKHdzVmFsdWUpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4IDwgMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzU2F2ZVRleHRBcnJheTsNCisgIEdldENob2ljZUxpc3RJdGVtcyh3c1NhdmVUZXh0QXJyYXksIFRSVUUpOw0KKyAgaWYgKHdzU2F2ZVRleHRBcnJheS5HZXRTaXplKCkgPD0gbkluZGV4KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NWYWx1ZUFycmF5Ow0KKyAgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKHdzVmFsdWVBcnJheSk7DQorICBpbnQzMl90IGlWYWx1ZXMgPSB3c1ZhbHVlQXJyYXkuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVZhbHVlczsgaisrKSB7DQorICAgIGlmICh3c1ZhbHVlQXJyYXlbal0gPT0gd3NTYXZlVGV4dEFycmF5W25JbmRleF0pIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6U2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW5jRGF0YSkgew0KKyAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1NhdmVUZXh0QXJyYXk7DQorICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCisgIGlmICh3c1NhdmVUZXh0QXJyYXkuR2V0U2l6ZSgpIDw9IG5JbmRleCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlTZWwgPSAtMTsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NWYWx1ZUFycmF5Ow0KKyAgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKHdzVmFsdWVBcnJheSk7DQorICBpbnQzMl90IGlWYWx1ZXMgPSB3c1ZhbHVlQXJyYXkuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVZhbHVlczsgaisrKSB7DQorICAgIGlmICh3c1ZhbHVlQXJyYXlbal0gPT0gd3NTYXZlVGV4dEFycmF5W25JbmRleF0pIHsNCisgICAgICBpU2VsID0gajsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKEdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCisgICAgaWYgKGJTZWxlY3RlZCkgew0KKyAgICAgIGlmIChpU2VsIDwgMCkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IEdldFJhd1ZhbHVlKCk7DQogICAgICAgICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwOw0KLSAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgaW50MzJfdCBpRW5kID0gd3NWYWx1ZS5GaW5kKEwnXG4nLCBpU3RhcnQpOw0KLSAgICAgICAgICAgIGlFbmQgPSAoaUVuZCA9PSAtMSkgPyBpTGVuZ3RoIDogaUVuZDsNCi0gICAgICAgICAgICB3aGlsZSAoaUVuZCA+PSBpU3RhcnQpIHsNCi0gICAgICAgICAgICAgICAgd3NTZWxUZXh0QXJyYXkuQWRkKHdzVmFsdWUuTWlkKGlTdGFydCwgaUVuZCAtIGlTdGFydCkpOw0KLSAgICAgICAgICAgICAgICBpU3RhcnQgPSBpRW5kICsgMTsNCi0gICAgICAgICAgICAgICAgaWYgKGlTdGFydCA+PSBpTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpRW5kID0gd3NWYWx1ZS5GaW5kKEwnXG4nLCBpU3RhcnQpOw0KLSAgICAgICAgICAgICAgICBpZiAoaUVuZCA8IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzU2VsVGV4dEFycmF5LkFkZCh3c1ZhbHVlLk1pZChpU3RhcnQsIGlMZW5ndGggLSBpU3RhcnQpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCisgICAgICAgICAgd3NWYWx1ZSArPSBMIlxuIjsNCiAgICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHdzU2VsVGV4dEFycmF5LkFkZCh3c1ZhbHVlKTsNCisgICAgICAgIHdzVmFsdWUgKz0gd3NTYXZlVGV4dEFycmF5W25JbmRleF07DQorICAgICAgICBtX3BOb2RlLT5TZXRDb250ZW50KHdzVmFsdWUsIHdzVmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTeW5jRGF0YSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGlTZWwgPj0gMCkgew0KKyAgICAgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCisgICAgICBHZXRTZWxlY3RlZEl0ZW1zKGlTZWxBcnJheSk7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNlbEFycmF5LkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBpZiAoaVNlbEFycmF5W2ldID09IG5JbmRleCkgew0KKyAgICAgICAgICBpU2VsQXJyYXkuUmVtb3ZlQXQoaSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBTZXRTZWxlY3RkSXRlbXMoaVNlbEFycmF5LCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAoYlNlbGVjdGVkKSB7DQorICAgICAgaWYgKGlTZWwgPCAwKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NhdmVUZXh0ID0gd3NTYXZlVGV4dEFycmF5W25JbmRleF07DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFRleHQod3NTYXZlVGV4dCk7DQorICAgICAgICBHZXRGb3JtYXREYXRhVmFsdWUod3NTYXZlVGV4dCwgd3NGb3JtYXRUZXh0KTsNCisgICAgICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NTYXZlVGV4dCwgd3NGb3JtYXRUZXh0LCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3luY0RhdGEpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChpU2VsID49IDApIHsNCisgICAgICBtX3BOb2RlLT5TZXRDb250ZW50KENGWF9XaWRlU3RyaW5nKCksIENGWF9XaWRlU3RyaW5nKCksIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KKyAgICB9DQorICB9DQogfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRJdGVtU3RhdGUoaW50MzJfdCBuSW5kZXgpDQotew0KLSAgICBpZiAobkluZGV4IDwgMCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OlNldFNlbGVjdGRJdGVtcyhDRlhfSW50MzJBcnJheSYgaVNlbEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBpbnQzMl90IGlTaXplID0gaVNlbEFycmF5LkdldFNpemUoKTsNCisgIGlmIChpU2l6ZSA+PSAxKSB7DQogICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTYXZlVGV4dEFycmF5Ow0KICAgICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCi0gICAgaWYgKHdzU2F2ZVRleHRBcnJheS5HZXRTaXplKCkgPD0gbkluZGV4KSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzSXRlbVZhbHVlOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgd3NJdGVtVmFsdWUgPSAoaVNpemUgPT0gMSkNCisgICAgICAgICAgICAgICAgICAgICAgICA/IHdzU2F2ZVRleHRBcnJheVtpU2VsQXJyYXlbaV1dDQorICAgICAgICAgICAgICAgICAgICAgICAgOiB3c1NhdmVUZXh0QXJyYXlbaVNlbEFycmF5W2ldXSArIEZYX1dTVFJDKEwiXG4iKTsNCisgICAgICB3c1ZhbHVlICs9IHdzSXRlbVZhbHVlOw0KICAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NWYWx1ZUFycmF5Ow0KLSAgICBHZXRTZWxlY3RlZEl0ZW1zVmFsdWUod3NWYWx1ZUFycmF5KTsNCi0gICAgaW50MzJfdCBpVmFsdWVzID0gd3NWYWx1ZUFycmF5LkdldFNpemUoKTsNCi0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVZhbHVlczsgaisrKSB7DQotICAgICAgICBpZiAod3NWYWx1ZUFycmF5W2pdID09IHdzU2F2ZVRleHRBcnJheVtuSW5kZXhdKSB7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQod3NWYWx1ZSk7DQorICBpZiAoR2V0Q2hvaWNlTGlzdE9wZW4oKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCkgew0KKyAgICBHZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXQpOw0KKyAgfQ0KKyAgbV9wTm9kZS0+U2V0Q29udGVudCh3c1ZhbHVlLCB3c0Zvcm1hdCwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgYlN5bmNEYXRhKTsNCiB9DQotdm9pZCBDWEZBX1dpZGdldERhdGE6OlNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQsIEZYX0JPT0wgYk5vdGlmeSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LCBGWF9CT09MIGJTeW5jRGF0YSkNCi17DQotICAgIGlmIChuSW5kZXggPCAwKSB7DQotICAgICAgICByZXR1cm47DQordm9pZCBDWEZBX1dpZGdldERhdGE6OkNsZWFyQWxsU2VsZWN0aW9ucygpIHsNCisgIENYRkFfTm9kZSogcEJpbmQgPSBtX3BOb2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgaWYgKHBCaW5kICYmIEdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCisgICAgd2hpbGUgKENYRkFfTm9kZSogcENoaWxkTm9kZSA9DQorICAgICAgICAgICAgICAgcEJpbmQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KKyAgICAgIHBCaW5kLT5SZW1vdmVDaGlsZChwQ2hpbGROb2RlKTsNCiAgICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzU2F2ZVRleHRBcnJheTsNCi0gICAgR2V0Q2hvaWNlTGlzdEl0ZW1zKHdzU2F2ZVRleHRBcnJheSwgVFJVRSk7DQotICAgIGlmICh3c1NhdmVUZXh0QXJyYXkuR2V0U2l6ZSgpIDw9IG5JbmRleCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaVNlbCA9IC0xOw0KLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzVmFsdWVBcnJheTsNCi0gICAgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKHdzVmFsdWVBcnJheSk7DQotICAgIGludDMyX3QgaVZhbHVlcyA9IHdzVmFsdWVBcnJheS5HZXRTaXplKCk7DQotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlWYWx1ZXM7IGorKykgew0KLSAgICAgICAgaWYgKHdzVmFsdWVBcnJheVtqXSA9PSB3c1NhdmVUZXh0QXJyYXlbbkluZGV4XSkgew0KLSAgICAgICAgICAgIGlTZWwgPSBqOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChHZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7DQotICAgICAgICBpZiAoYlNlbGVjdGVkKSB7DQotICAgICAgICAgICAgaWYgKGlTZWwgPCAwKSB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRSYXdWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlICs9IEwiXG4iOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHdzVmFsdWUgKz0gd3NTYXZlVGV4dEFycmF5W25JbmRleF07DQotICAgICAgICAgICAgICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NWYWx1ZSwgd3NWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgYlN5bmNEYXRhKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGlTZWwgPj0gMCkgew0KLSAgICAgICAgICAgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCi0gICAgICAgICAgICBHZXRTZWxlY3RlZEl0ZW1zKGlTZWxBcnJheSk7DQotICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNlbEFycmF5LkdldFNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIGlmIChpU2VsQXJyYXlbaV0gPT0gbkluZGV4KSB7DQotICAgICAgICAgICAgICAgICAgICBpU2VsQXJyYXkuUmVtb3ZlQXQoaSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBTZXRTZWxlY3RkSXRlbXMoaVNlbEFycmF5LCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKGJTZWxlY3RlZCkgew0KLSAgICAgICAgICAgIGlmIChpU2VsIDwgMCkgew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NhdmVUZXh0ID0gd3NTYXZlVGV4dEFycmF5W25JbmRleF07DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VGV4dCh3c1NhdmVUZXh0KTsNCi0gICAgICAgICAgICAgICAgR2V0Rm9ybWF0RGF0YVZhbHVlKHdzU2F2ZVRleHQsIHdzRm9ybWF0VGV4dCk7DQotICAgICAgICAgICAgICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NTYXZlVGV4dCwgd3NGb3JtYXRUZXh0LCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoaVNlbCA+PSAwKSB7DQotICAgICAgICAgICAgbV9wTm9kZS0+U2V0Q29udGVudChDRlhfV2lkZVN0cmluZygpLCBDRlhfV2lkZVN0cmluZygpLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICB9IGVsc2Ugew0KKyAgICBTeW5jVmFsdWUoQ0ZYX1dpZGVTdHJpbmcoKSwgRkFMU0UpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfV2lkZ2V0RGF0YTo6U2V0U2VsZWN0ZEl0ZW1zKENGWF9JbnQzMkFycmF5ICZpU2VsQXJyYXksIEZYX0JPT0wgYk5vdGlmeSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LCBGWF9CT09MIGJTeW5jRGF0YSkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQotICAgIGludDMyX3QgaVNpemUgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KLSAgICBpZiAoaVNpemUgPj0gMSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1NhdmVUZXh0QXJyYXk7DQotICAgICAgICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSXRlbVZhbHVlOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KLSAgICAgICAgICAgIHdzSXRlbVZhbHVlID0gKGlTaXplID09IDEpID8gd3NTYXZlVGV4dEFycmF5W2lTZWxBcnJheVtpXV0gOiB3c1NhdmVUZXh0QXJyYXlbaVNlbEFycmF5W2ldXSArIEZYX1dTVFJDKEwiXG4iKTsNCi0gICAgICAgICAgICB3c1ZhbHVlICs9IHdzSXRlbVZhbHVlOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpJbnNlcnRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0xhYmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXdWYWx1ZSh3c1ZhbHVlKTsNCisgIGlmICh3c05ld1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICB3c05ld1ZhbHVlID0gd3NMYWJlbDsNCisgIH0NCisgIENYRkFfTm9kZUFycmF5IGxpc3RpdGVtczsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIENYRkFfTm9kZSogcEl0ZW1Ob2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgZm9yICg7IHBJdGVtTm9kZTsNCisgICAgICAgcEl0ZW1Ob2RlID0gcEl0ZW1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwSXRlbU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0KHdzVmFsdWUpOw0KLSAgICBpZiAoR2V0Q2hvaWNlTGlzdE9wZW4oKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCkgew0KLSAgICAgICAgR2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0KTsNCi0gICAgfQ0KLSAgICBtX3BOb2RlLT5TZXRDb250ZW50KHdzVmFsdWUsIHdzRm9ybWF0LCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOw0KLX0NCi12b2lkIENYRkFfV2lkZ2V0RGF0YTo6Q2xlYXJBbGxTZWxlY3Rpb25zKCkNCi17DQotICAgIENYRkFfTm9kZSogcEJpbmQgPSBtX3BOb2RlLT5HZXRCaW5kRGF0YSgpOw0KLSAgICBpZiAocEJpbmQgJiYgR2V0Q2hvaWNlTGlzdE9wZW4oKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCkgew0KLSAgICAgICAgd2hpbGUgKENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBCaW5kLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCi0gICAgICAgICAgICBwQmluZC0+UmVtb3ZlQ2hpbGQocENoaWxkTm9kZSk7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgICBTeW5jVmFsdWUoQ0ZYX1dpZGVTdHJpbmcoKSwgRkFMU0UpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpJbnNlcnRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c0xhYmVsLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NWYWx1ZSwgaW50MzJfdCBuSW5kZXggLCAgRlhfQk9PTCBiTm90aWZ5ICkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VmFsdWUod3NWYWx1ZSk7DQotICAgIGlmICh3c05ld1ZhbHVlLklzRW1wdHkoKSkgew0KLSAgICAgICAgd3NOZXdWYWx1ZSA9IHdzTGFiZWw7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlQXJyYXkgbGlzdGl0ZW1zOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIENYRkFfTm9kZSAqcEl0ZW1Ob2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICBmb3IgKDsgcEl0ZW1Ob2RlOyBwSXRlbU5vZGUgPSBwSXRlbU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgIGlmIChwSXRlbU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbGlzdGl0ZW1zLkFkZChwSXRlbU5vZGUpOw0KLSAgICAgICAgaUNvdW50ICsrOw0KLSAgICB9DQotICAgIGlmIChpQ291bnQgPCAxKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX0l0ZW1zKTsNCi0gICAgICAgIG1fcE5vZGUtPkluc2VydENoaWxkKC0xLCBwSXRlbXMpOw0KLSAgICAgICAgSW5zZXJ0TGlzdFRleHRJdGVtKHBJdGVtcywgd3NMYWJlbCwgbkluZGV4KTsNCi0gICAgICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IG1fcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX0l0ZW1zKTsNCi0gICAgICAgIG1fcE5vZGUtPkluc2VydENoaWxkKC0xLCBwU2F2ZUl0ZW1zKTsNCi0gICAgICAgIHBTYXZlSXRlbXMtPlNldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlLCBUUlVFKTsNCi0gICAgICAgIEluc2VydExpc3RUZXh0SXRlbShwU2F2ZUl0ZW1zLCB3c05ld1ZhbHVlLCBuSW5kZXgpOw0KLSAgICB9IGVsc2UgaWYgKGlDb3VudCA+IDEpIHsNCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykgew0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBsaXN0aXRlbXNbaV07DQotICAgICAgICAgICAgRlhfQk9PTCBiSGFzU2F2ZSA9IHBOb2RlLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQotICAgICAgICAgICAgaWYgKGJIYXNTYXZlKSB7DQotICAgICAgICAgICAgICAgIEluc2VydExpc3RUZXh0SXRlbShwTm9kZSwgd3NOZXdWYWx1ZSwgbkluZGV4KTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBJbnNlcnRMaXN0VGV4dEl0ZW0ocE5vZGUsIHdzTGFiZWwsIG5JbmRleCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IGxpc3RpdGVtc1swXTsNCi0gICAgICAgIHBOb2RlLT5TZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSwgRkFMU0UpOw0KLSAgICAgICAgcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSk7DQotICAgICAgICBDWEZBX05vZGUqIHBTYXZlSXRlbXMgPSBtX3BOb2RlLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRUxFTUVOVF9JdGVtcyk7DQotICAgICAgICBtX3BOb2RlLT5JbnNlcnRDaGlsZCgtMSwgcFNhdmVJdGVtcyk7DQotICAgICAgICBwU2F2ZUl0ZW1zLT5TZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSwgVFJVRSk7DQotICAgICAgICBwU2F2ZUl0ZW1zLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbik7DQotICAgICAgICBsaXN0aXRlbXMuUmVtb3ZlQWxsKCk7DQotICAgICAgICBDWEZBX05vZGUgKnBMaXN0Tm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICBpbnQzMl90IGkgPSAwOw0KLSAgICAgICAgd2hpbGUocExpc3ROb2RlKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPbGRWYWx1ZTsNCi0gICAgICAgICAgICBwTGlzdE5vZGUtPlRyeUNvbnRlbnQod3NPbGRWYWx1ZSk7DQotICAgICAgICAgICAgSW5zZXJ0TGlzdFRleHRJdGVtKHBTYXZlSXRlbXMsIHdzT2xkVmFsdWUsIGkpOw0KLSAgICAgICAgICAgIGkrKzsNCi0gICAgICAgICAgICBwTGlzdE5vZGUgPSBwTGlzdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgICAgICB9DQorICAgIGxpc3RpdGVtcy5BZGQocEl0ZW1Ob2RlKTsNCisgICAgaUNvdW50Kys7DQorICB9DQorICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgbV9wTm9kZS0+SW5zZXJ0Q2hpbGQoLTEsIHBJdGVtcyk7DQorICAgIEluc2VydExpc3RUZXh0SXRlbShwSXRlbXMsIHdzTGFiZWwsIG5JbmRleCk7DQorICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IG1fcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgbV9wTm9kZS0+SW5zZXJ0Q2hpbGQoLTEsIHBTYXZlSXRlbXMpOw0KKyAgICBwU2F2ZUl0ZW1zLT5TZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSwgVFJVRSk7DQorICAgIEluc2VydExpc3RUZXh0SXRlbShwU2F2ZUl0ZW1zLCB3c05ld1ZhbHVlLCBuSW5kZXgpOw0KKyAgfSBlbHNlIGlmIChpQ291bnQgPiAxKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykgew0KKyAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBsaXN0aXRlbXNbaV07DQorICAgICAgRlhfQk9PTCBiSGFzU2F2ZSA9IHBOb2RlLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgICAgaWYgKGJIYXNTYXZlKSB7DQorICAgICAgICBJbnNlcnRMaXN0VGV4dEl0ZW0ocE5vZGUsIHdzTmV3VmFsdWUsIG5JbmRleCk7DQorICAgICAgfSBlbHNlIHsNCiAgICAgICAgIEluc2VydExpc3RUZXh0SXRlbShwTm9kZSwgd3NMYWJlbCwgbkluZGV4KTsNCi0gICAgICAgIEluc2VydExpc3RUZXh0SXRlbShwU2F2ZUl0ZW1zLCB3c05ld1ZhbHVlLCBuSW5kZXgpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZighYk5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IGxpc3RpdGVtc1swXTsNCisgICAgcE5vZGUtPlNldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlLCBGQUxTRSk7DQorICAgIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpOw0KKyAgICBDWEZBX05vZGUqIHBTYXZlSXRlbXMgPSBtX3BOb2RlLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRUxFTUVOVF9JdGVtcyk7DQorICAgIG1fcE5vZGUtPkluc2VydENoaWxkKC0xLCBwU2F2ZUl0ZW1zKTsNCisgICAgcFNhdmVJdGVtcy0+U2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUsIFRSVUUpOw0KKyAgICBwU2F2ZUl0ZW1zLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbik7DQorICAgIGxpc3RpdGVtcy5SZW1vdmVBbGwoKTsNCisgICAgQ1hGQV9Ob2RlKiBwTGlzdE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICB3aGlsZSAocExpc3ROb2RlKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPbGRWYWx1ZTsNCisgICAgICBwTGlzdE5vZGUtPlRyeUNvbnRlbnQod3NPbGRWYWx1ZSk7DQorICAgICAgSW5zZXJ0TGlzdFRleHRJdGVtKHBTYXZlSXRlbXMsIHdzT2xkVmFsdWUsIGkpOw0KKyAgICAgIGkrKzsNCisgICAgICBwTGlzdE5vZGUgPSBwTGlzdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQogICAgIH0NCi0gICAgbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCktPk9uV2lkZ2V0RGF0YUV2ZW50KHRoaXMsIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbUFkZGVkLCAodm9pZCopKGNvbnN0IEZYX1dDSEFSKil3c0xhYmVsLCAodm9pZCopKGNvbnN0IEZYX1dDSEFSKil3c1ZhbHVlLCAodm9pZCopKHVpbnRwdHJfdCluSW5kZXgpOw0KKyAgICBJbnNlcnRMaXN0VGV4dEl0ZW0ocE5vZGUsIHdzTGFiZWwsIG5JbmRleCk7DQorICAgIEluc2VydExpc3RUZXh0SXRlbShwU2F2ZUl0ZW1zLCB3c05ld1ZhbHVlLCBuSW5kZXgpOw0KKyAgfQ0KKyAgaWYgKCFiTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldE5vdGlmeSgpLT5PbldpZGdldERhdGFFdmVudCgNCisgICAgICB0aGlzLCBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1BZGRlZCwgKHZvaWQqKShjb25zdCBGWF9XQ0hBUiopd3NMYWJlbCwNCisgICAgICAodm9pZCopKGNvbnN0IEZYX1dDSEFSKil3c1ZhbHVlLCAodm9pZCopKHVpbnRwdHJfdCluSW5kZXgpOw0KIH0NCi12b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0SXRlbUxhYmVsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcgJndzTGFiZWwpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIENYRkFfTm9kZUFycmF5IGxpc3RpdGVtczsNCi0gICAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgIGZvciAoOyBwSXRlbXM7IHBJdGVtcyA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgaWYgKHBJdGVtcy0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpQ291bnQrKzsNCi0gICAgICAgIGxpc3RpdGVtcy5BZGQocEl0ZW1zKTsNCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0SXRlbUxhYmVsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0xhYmVsKSB7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBDWEZBX05vZGVBcnJheSBsaXN0aXRlbXM7DQorICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwSXRlbXM7IHBJdGVtcyA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocEl0ZW1zLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBpZiAoaUNvdW50IDw9IDEpIHsNCi0gICAgICAgIHdzTGFiZWwgPSB3c1ZhbHVlOw0KKyAgICBpQ291bnQrKzsNCisgICAgbGlzdGl0ZW1zLkFkZChwSXRlbXMpOw0KKyAgfQ0KKyAgaWYgKGlDb3VudCA8PSAxKSB7DQorICAgIHdzTGFiZWwgPSB3c1ZhbHVlOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9Ob2RlKiBwTGFiZWxJdGVtcyA9IGxpc3RpdGVtc1swXTsNCisgICAgRlhfQk9PTCBiU2F2ZSA9IHBMYWJlbEl0ZW1zLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IE5VTEw7DQorICAgIGlmIChiU2F2ZSkgew0KKyAgICAgIHBTYXZlSXRlbXMgPSBwTGFiZWxJdGVtczsNCisgICAgICBwTGFiZWxJdGVtcyA9IGxpc3RpdGVtc1sxXTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfTm9kZSogcExhYmVsSXRlbXMgPSBsaXN0aXRlbXNbMF07DQotICAgICAgICBGWF9CT09MIGJTYXZlID0gcExhYmVsSXRlbXMtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsNCi0gICAgICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IE5VTEw7DQotICAgICAgICBpZiAoYlNhdmUpIHsNCi0gICAgICAgICAgICBwU2F2ZUl0ZW1zID0gcExhYmVsSXRlbXM7DQotICAgICAgICAgICAgcExhYmVsSXRlbXMgPSBsaXN0aXRlbXNbMV07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBTYXZlSXRlbXMgPSBsaXN0aXRlbXNbMV07DQotICAgICAgICB9DQotICAgICAgICBpQ291bnQgPSAwOw0KLSAgICAgICAgaW50MzJfdCBpU2VhcmNoID0gLTE7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQotICAgICAgICBDWEZBX05vZGUqIHBDaGlsZEl0ZW0gPSBwU2F2ZUl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICBmb3IgKDsgcENoaWxkSXRlbTsgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICBwQ2hpbGRJdGVtLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQotICAgICAgICAgICAgaWYgKHdzQ29udGVudCA9PSB3c1ZhbHVlKSB7DQotICAgICAgICAgICAgICAgIGlTZWFyY2ggPSBpQ291bnQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpQ291bnQgKys7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaVNlYXJjaCA8IDApIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwVGV4dCA9IHBMYWJlbEl0ZW1zLT5HZXRDaGlsZChpU2VhcmNoLCBYRkFfRUxFTUVOVF9VTktOT1dOKSkgew0KLSAgICAgICAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzTGFiZWwpOw0KLSAgICAgICAgfQ0KKyAgICAgIHBTYXZlSXRlbXMgPSBsaXN0aXRlbXNbMV07DQogICAgIH0NCisgICAgaUNvdW50ID0gMDsNCisgICAgaW50MzJfdCBpU2VhcmNoID0gLTE7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRJdGVtID0gcFNhdmVJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBmb3IgKDsgcENoaWxkSXRlbTsNCisgICAgICAgICBwQ2hpbGRJdGVtID0gcENoaWxkSXRlbS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIHBDaGlsZEl0ZW0tPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgICAgICBpZiAod3NDb250ZW50ID09IHdzVmFsdWUpIHsNCisgICAgICAgIGlTZWFyY2ggPSBpQ291bnQ7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaUNvdW50Kys7DQorICAgIH0NCisgICAgaWYgKGlTZWFyY2ggPCAwKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChDWEZBX05vZGUqIHBUZXh0ID0NCisgICAgICAgICAgICBwTGFiZWxJdGVtcy0+R2V0Q2hpbGQoaVNlYXJjaCwgWEZBX0VMRU1FTlRfVU5LTk9XTikpIHsNCisgICAgICBwVGV4dC0+VHJ5Q29udGVudCh3c0xhYmVsKTsNCisgICAgfQ0KKyAgfQ0KIH0NCi12b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0SXRlbVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUpDQotew0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIENYRkFfTm9kZUFycmF5IGxpc3RpdGVtczsNCi0gICAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgIGZvciAoOyBwSXRlbXM7IHBJdGVtcyA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KLSAgICAgICAgaWYgKHBJdGVtcy0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpQ291bnQrKzsNCi0gICAgICAgIGxpc3RpdGVtcy5BZGQocEl0ZW1zKTsNCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0SXRlbVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSB7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBDWEZBX05vZGVBcnJheSBsaXN0aXRlbXM7DQorICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwSXRlbXM7IHBJdGVtcyA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocEl0ZW1zLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBpZiAoaUNvdW50IDw9IDEpIHsNCi0gICAgICAgIHdzVmFsdWUgPSB3c0xhYmVsOw0KKyAgICBpQ291bnQrKzsNCisgICAgbGlzdGl0ZW1zLkFkZChwSXRlbXMpOw0KKyAgfQ0KKyAgaWYgKGlDb3VudCA8PSAxKSB7DQorICAgIHdzVmFsdWUgPSB3c0xhYmVsOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9Ob2RlKiBwTGFiZWxJdGVtcyA9IGxpc3RpdGVtc1swXTsNCisgICAgRlhfQk9PTCBiU2F2ZSA9IHBMYWJlbEl0ZW1zLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IE5VTEw7DQorICAgIGlmIChiU2F2ZSkgew0KKyAgICAgIHBTYXZlSXRlbXMgPSBwTGFiZWxJdGVtczsNCisgICAgICBwTGFiZWxJdGVtcyA9IGxpc3RpdGVtc1sxXTsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfTm9kZSogcExhYmVsSXRlbXMgPSBsaXN0aXRlbXNbMF07DQotICAgICAgICBGWF9CT09MIGJTYXZlID0gcExhYmVsSXRlbXMtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsNCi0gICAgICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IE5VTEw7DQotICAgICAgICBpZiAoYlNhdmUpIHsNCi0gICAgICAgICAgICBwU2F2ZUl0ZW1zID0gcExhYmVsSXRlbXM7DQotICAgICAgICAgICAgcExhYmVsSXRlbXMgPSBsaXN0aXRlbXNbMV07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHBTYXZlSXRlbXMgPSBsaXN0aXRlbXNbMV07DQotICAgICAgICB9DQotICAgICAgICBpQ291bnQgPSAwOw0KLSAgICAgICAgaW50MzJfdCBpU2VhcmNoID0gLTE7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQotICAgICAgICBDWEZBX05vZGUqIHBDaGlsZEl0ZW0gPSBwTGFiZWxJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgZm9yICg7IHBDaGlsZEl0ZW07IHBDaGlsZEl0ZW0gPSBwQ2hpbGRJdGVtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgcENoaWxkSXRlbS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KLSAgICAgICAgICAgIGlmICh3c0NvbnRlbnQgPT0gd3NMYWJlbCkgew0KLSAgICAgICAgICAgICAgICBpU2VhcmNoID0gaUNvdW50Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaUNvdW50ICsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlTZWFyY2ggPCAwKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKENYRkFfTm9kZSogcFRleHQgPSBwU2F2ZUl0ZW1zLT5HZXRDaGlsZChpU2VhcmNoLCBYRkFfRUxFTUVOVF9VTktOT1dOKSkgew0KLSAgICAgICAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzVmFsdWUpOw0KLSAgICAgICAgfQ0KKyAgICAgIHBTYXZlSXRlbXMgPSBsaXN0aXRlbXNbMV07DQogICAgIH0NCisgICAgaUNvdW50ID0gMDsNCisgICAgaW50MzJfdCBpU2VhcmNoID0gLTE7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRJdGVtID0gcExhYmVsSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgZm9yICg7IHBDaGlsZEl0ZW07DQorICAgICAgICAgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICBwQ2hpbGRJdGVtLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICAgICAgaWYgKHdzQ29udGVudCA9PSB3c0xhYmVsKSB7DQorICAgICAgICBpU2VhcmNoID0gaUNvdW50Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlDb3VudCsrOw0KKyAgICB9DQorICAgIGlmIChpU2VhcmNoIDwgMCkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwVGV4dCA9IHBTYXZlSXRlbXMtPkdldENoaWxkKGlTZWFyY2gsIFhGQV9FTEVNRU5UX1VOS05PV04pKSB7DQorICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NWYWx1ZSk7DQorICAgIH0NCisgIH0NCiB9DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkRlbGV0ZUl0ZW0oaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYk5vdGlmeSwgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LCBGWF9CT09MIGJTeW5jRGF0YSkNCi17DQotICAgIEZYX0JPT0wgYlNldFZhbHVlID0gRkFMU0U7DQotICAgIENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICBmb3IgKDsgcEl0ZW1zOyBwSXRlbXMgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCi0gICAgICAgIGlmIChwSXRlbXMtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG5JbmRleCA8IDApIHsNCi0gICAgICAgICAgICB3aGlsZSAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSB7DQotICAgICAgICAgICAgICAgIHBJdGVtcy0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKCFiU2V0VmFsdWUgJiYgcEl0ZW1zLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSkpIHsNCi0gICAgICAgICAgICAgICAgU2V0SXRlbVN0YXRlKG5JbmRleCwgRkFMU0UsIFRSVUUsIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7DQotICAgICAgICAgICAgICAgIGJTZXRWYWx1ZSA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludDMyX3QgaSA9IDA7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgIHdoaWxlIChwTm9kZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBuSW5kZXgpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBJdGVtcy0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6RGVsZXRlSXRlbShpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bmNEYXRhKSB7DQorICBGWF9CT09MIGJTZXRWYWx1ZSA9IEZBTFNFOw0KKyAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICBmb3IgKDsgcEl0ZW1zOyBwSXRlbXMgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgaWYgKHBJdGVtcy0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgaWYoIWJOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KKyAgICBpZiAobkluZGV4IDwgMCkgew0KKyAgICAgIHdoaWxlIChDWEZBX05vZGUqIHBOb2RlID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgICAgIHBJdGVtcy0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoIWJTZXRWYWx1ZSAmJiBwSXRlbXMtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKSkgew0KKyAgICAgICAgU2V0SXRlbVN0YXRlKG5JbmRleCwgRkFMU0UsIFRSVUUsIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7DQorICAgICAgICBiU2V0VmFsdWUgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpbnQzMl90IGkgPSAwOw0KKyAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICB3aGlsZSAocE5vZGUpIHsNCisgICAgICAgIGlmIChpID09IG5JbmRleCkgew0KKyAgICAgICAgICBwSXRlbXMtPlJlbW92ZUNoaWxkKHBOb2RlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpKys7DQorICAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBtX3BOb2RlLT5HZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKS0+T25XaWRnZXREYXRhRXZlbnQodGhpcywgWEZBX1dJREdFVEVWRU5UX0xpc3RJdGVtUmVtb3ZlZCwgKHZvaWQqKSh1aW50cHRyX3QpbkluZGV4KTsNCisgIH0NCisgIGlmICghYk5vdGlmeSkgew0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldE5vdGlmeSgpLT5PbldpZGdldERhdGFFdmVudCgNCisgICAgICB0aGlzLCBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1SZW1vdmVkLCAodm9pZCopKHVpbnRwdHJfdCluSW5kZXgpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRIb3Jpem9udGFsU2Nyb2xsUG9saWN5KCkNCi17DQotICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQotICAgIGlmIChwVUlDaGlsZCkgew0KLSAgICAgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSk7DQotICAgIH0NCi0gICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG87DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgaWYgKHBVSUNoaWxkKSB7DQorICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3kpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG87DQogfQ0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXROdW1iZXJPZkNlbGxzKCkNCi17DQotICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQotICAgIGlmICghcFVJQ2hpbGQpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBVSUNoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db21iKSkgew0KLSAgICAgICAgcmV0dXJuIHBOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTnVtYmVyT2ZDZWxscyk7DQotICAgIH0NCitpbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0TnVtYmVyT2ZDZWxscygpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAoIXBVSUNoaWxkKSB7DQogICAgIHJldHVybiAtMTsNCisgIH0NCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gcFVJQ2hpbGQtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0NvbWIpKSB7DQorICAgIHJldHVybiBwTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMpOw0KKyAgfQ0KKyAgcmV0dXJuIC0xOw0KIH0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6SXNEYXRlVGltZUVkaXRVc2VQaWNrZXIoKQ0KLXsNCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6SXNEYXRlVGltZUVkaXRVc2VQaWNrZXIoKSB7DQorICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlVHlwZSgpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICByZXR1cm4gcFVJQ2hpbGQgPyBwVUlDaGlsZC0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9UeXBlKSA6IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX0NoYXJFbmNvZGluZyhpbnQzMl90JiB2YWwpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c0NoYXJFbmNvZGluZzsNCisgIGlmIChwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsIHdzQ2hhckVuY29kaW5nKSkgew0KKyAgICBpZiAod3NDaGFyRW5jb2RpbmcuQ29tcGFyZU5vQ2FzZShMIlVURi0xNiIpKSB7DQorICAgICAgdmFsID0gQ0hBUl9FTkNPRElOR19VTklDT0RFOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGVsc2UgaWYgKHdzQ2hhckVuY29kaW5nLkNvbXBhcmVOb0Nhc2UoTCJVVEYtOCIpKSB7DQorICAgICAgdmFsID0gQ0hBUl9FTkNPRElOR19VVEY4Ow0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX0NoZWNrc3VtKGludDMyX3QmIHZhbCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVDaGVja3N1bTsNCisgIGlmIChwVUlDaGlsZC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBlQ2hlY2tzdW0pKSB7DQorICAgIHN3aXRjaCAoZUNoZWNrc3VtKSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOg0KKyAgICAgICAgdmFsID0gMDsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQXV0bzoNCisgICAgICAgIHZhbCA9IDE7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNXzFtb2QxMDoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwXzFtb2QxMToNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fMm1vZDEwOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX0RhdGFMZW5ndGgoaW50MzJfdCYgdmFsKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRhTGVuZ3RoOw0KKyAgaWYgKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0RhdGFMZW5ndGgsIHdzRGF0YUxlbmd0aCkpIHsNCisgICAgdmFsID0gRlhTWVNfd3RvaSh3c0RhdGFMZW5ndGgpOw0KICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlVHlwZSgpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICByZXR1cm4gcFVJQ2hpbGQgPyBwVUlDaGlsZC0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9UeXBlKSA6IE5VTEw7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX0NoYXJFbmNvZGluZyhpbnQzMl90JiB2YWwpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NoYXJFbmNvZGluZzsNCi0gICAgaWYocFVJQ2hpbGQtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQ2hhckVuY29kaW5nLCB3c0NoYXJFbmNvZGluZykpIHsNCi0gICAgICAgIGlmICh3c0NoYXJFbmNvZGluZy5Db21wYXJlTm9DYXNlKEwiVVRGLTE2IikpIHsNCi0gICAgICAgICAgICB2YWwgPSBDSEFSX0VOQ09ESU5HX1VOSUNPREU7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9IGVsc2UgaWYgKHdzQ2hhckVuY29kaW5nLkNvbXBhcmVOb0Nhc2UoTCJVVEYtOCIpKSB7DQotICAgICAgICAgICAgdmFsID0gQ0hBUl9FTkNPRElOR19VVEY4Ow0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX1N0YXJ0Q2hhcihGWF9DSEFSJiB2YWwpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NTdGFydEVuZENoYXI7DQorICBpZiAocFVJQ2hpbGQtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfU3RhcnRDaGFyLCB3c1N0YXJ0RW5kQ2hhcikpIHsNCisgICAgaWYgKHdzU3RhcnRFbmRDaGFyLkdldExlbmd0aCgpKSB7DQorICAgICAgdmFsID0gKEZYX0NIQVIpd3NTdGFydEVuZENoYXIuR2V0QXQoMCk7DQorICAgICAgcmV0dXJuIFRSVUU7DQogICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9DaGVja3N1bShpbnQzMl90JiB2YWwpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlQ2hlY2tzdW07DQotICAgIGlmIChwVUlDaGlsZC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBlQ2hlY2tzdW0pKSB7DQotICAgICAgICBzd2l0Y2ggKGVDaGVja3N1bSkgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTm9uZToNCi0gICAgICAgICAgICAgICAgdmFsID0gMDsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BdXRvOg0KLSAgICAgICAgICAgICAgICB2YWwgPSAxOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNXzFtb2QxMDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV8xbW9kMTBfMW1vZDExOg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNXzJtb2QxMDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfRW5kQ2hhcihGWF9DSEFSJiB2YWwpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NTdGFydEVuZENoYXI7DQorICBpZiAocFVJQ2hpbGQtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfRW5kQ2hhciwgd3NTdGFydEVuZENoYXIpKSB7DQorICAgIGlmICh3c1N0YXJ0RW5kQ2hhci5HZXRMZW5ndGgoKSkgew0KKyAgICAgIHZhbCA9IChGWF9DSEFSKXdzU3RhcnRFbmRDaGFyLkdldEF0KDApOw0KKyAgICAgIHJldHVybiBUUlVFOw0KICAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfRGF0YUxlbmd0aChpbnQzMl90JiB2YWwpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGFMZW5ndGg7DQotICAgIGlmKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0RhdGFMZW5ndGgsIHdzRGF0YUxlbmd0aCkpIHsNCi0gICAgICAgIHZhbCA9IEZYU1lTX3d0b2kod3NEYXRhTGVuZ3RoKTsNCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9FQ0xldmVsKGludDMyX3QmIHZhbCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRUNMZXZlbDsNCisgIGlmIChwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9FcnJvckNvcnJlY3Rpb25MZXZlbCwgd3NFQ0xldmVsKSkgew0KKyAgICB2YWwgPSBGWFNZU193dG9pKHdzRUNMZXZlbCk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVXaWR0aChpbnQzMl90JiB2YWwpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBDWEZBX01lYXN1cmVtZW50IG1Nb2R1bGVXaWR0aEhlaWdodDsNCisgIGlmIChwVUlDaGlsZC0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX01vZHVsZVdpZHRoLCBtTW9kdWxlV2lkdGhIZWlnaHQpKSB7DQorICAgIHZhbCA9IChpbnQzMl90KW1Nb2R1bGVXaWR0aEhlaWdodC5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlSGVpZ2h0KGludDMyX3QmIHZhbCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIENYRkFfTWVhc3VyZW1lbnQgbU1vZHVsZVdpZHRoSGVpZ2h0Ow0KKyAgaWYgKHBVSUNoaWxkLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LCBtTW9kdWxlV2lkdGhIZWlnaHQpKSB7DQorICAgIHZhbCA9IChpbnQzMl90KW1Nb2R1bGVXaWR0aEhlaWdodC5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfUHJpbnRDaGVja3N1bShGWF9CT09MJiB2YWwpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBGWF9CT09MIGJQcmludENoZWNrRGlnaXQ7DQorICBpZiAocFVJQ2hpbGQtPlRyeUJvb2xlYW4oWEZBX0FUVFJJQlVURV9QcmludENoZWNrRGlnaXQsIGJQcmludENoZWNrRGlnaXQpKSB7DQorICAgIHZhbCA9IGJQcmludENoZWNrRGlnaXQ7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9UZXh0TG9jYXRpb24oaW50MzJfdCYgdmFsKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZVRleHRMb2NhdGlvbjsNCisgIGlmIChwVUlDaGlsZC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1RleHRMb2NhdGlvbiwgZVRleHRMb2NhdGlvbikpIHsNCisgICAgc3dpdGNoIChlVGV4dExvY2F0aW9uKSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOg0KKyAgICAgICAgdmFsID0gQkNfVEVYVF9MT0NfTk9ORTsNCiAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfU3RhcnRDaGFyKEZYX0NIQVImIHZhbCkNCi17DQotICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQotICAgIENGWF9XaWRlU3RyaW5nQyB3c1N0YXJ0RW5kQ2hhcjsNCi0gICAgaWYocFVJQ2hpbGQtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfU3RhcnRDaGFyLCB3c1N0YXJ0RW5kQ2hhcikpIHsNCi0gICAgICAgIGlmKHdzU3RhcnRFbmRDaGFyLkdldExlbmd0aCgpKSB7DQotICAgICAgICAgICAgdmFsID0gKEZYX0NIQVIpd3NTdGFydEVuZENoYXIuR2V0QXQoMCk7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9FbmRDaGFyKEZYX0NIQVImIHZhbCkNCi17DQotICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQotICAgIENGWF9XaWRlU3RyaW5nQyB3c1N0YXJ0RW5kQ2hhcjsNCi0gICAgaWYocFVJQ2hpbGQtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfRW5kQ2hhciwgd3NTdGFydEVuZENoYXIpKSB7DQotICAgICAgICBpZih3c1N0YXJ0RW5kQ2hhci5HZXRMZW5ndGgoKSkgew0KLSAgICAgICAgICAgIHZhbCA9IChGWF9DSEFSKXdzU3RhcnRFbmRDaGFyLkdldEF0KDApOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfRUNMZXZlbChpbnQzMl90JiB2YWwpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0VDTGV2ZWw7DQotICAgIGlmKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0Vycm9yQ29ycmVjdGlvbkxldmVsLCB3c0VDTGV2ZWwpKSB7DQotICAgICAgICB2YWwgPSBGWFNZU193dG9pKHdzRUNMZXZlbCk7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BYm92ZToNCisgICAgICAgIHZhbCA9IEJDX1RFWFRfTE9DX0FCT1ZFOw0KICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVXaWR0aChpbnQzMl90JiB2YWwpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBDWEZBX01lYXN1cmVtZW50IG1Nb2R1bGVXaWR0aEhlaWdodDsNCi0gICAgaWYgKHBVSUNoaWxkLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTW9kdWxlV2lkdGgsIG1Nb2R1bGVXaWR0aEhlaWdodCkpIHsNCi0gICAgICAgIHZhbCA9IChpbnQzMl90KW1Nb2R1bGVXaWR0aEhlaWdodC5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3c6DQorICAgICAgICB2YWwgPSBCQ19URVhUX0xPQ19CRUxPVzsNCiAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlSGVpZ2h0KGludDMyX3QmIHZhbCkNCi17DQotICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQotICAgIENYRkFfTWVhc3VyZW1lbnQgbU1vZHVsZVdpZHRoSGVpZ2h0Ow0KLSAgICBpZiAocFVJQ2hpbGQtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Nb2R1bGVIZWlnaHQsIG1Nb2R1bGVXaWR0aEhlaWdodCkpIHsNCi0gICAgICAgIHZhbCA9IChpbnQzMl90KW1Nb2R1bGVXaWR0aEhlaWdodC5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQWJvdmVFbWJlZGRlZDoNCisgICAgICAgIHZhbCA9IEJDX1RFWFRfTE9DX0FCT1ZFRU1CRUQ7DQogICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX1ByaW50Q2hlY2tzdW0oRlhfQk9PTCYgdmFsKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCi0gICAgRlhfQk9PTCBiUHJpbnRDaGVja0RpZ2l0Ow0KLSAgICBpZihwVUlDaGlsZC0+VHJ5Qm9vbGVhbihYRkFfQVRUUklCVVRFX1ByaW50Q2hlY2tEaWdpdCwgYlByaW50Q2hlY2tEaWdpdCkpIHsNCi0gICAgICAgIHZhbCA9IGJQcmludENoZWNrRGlnaXQ7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9CZWxvd0VtYmVkZGVkOg0KKyAgICAgICAgdmFsID0gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRDsNCiAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX1RleHRMb2NhdGlvbihpbnQzMl90JiB2YWwpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlVGV4dExvY2F0aW9uOw0KLSAgICBpZiAocFVJQ2hpbGQtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sIGVUZXh0TG9jYXRpb24pKSB7DQotICAgICAgICBzd2l0Y2goZVRleHRMb2NhdGlvbikgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTm9uZToNCi0gICAgICAgICAgICAgICAgdmFsID0gQkNfVEVYVF9MT0NfTk9ORTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BYm92ZToNCi0gICAgICAgICAgICAgICAgdmFsID0gQkNfVEVYVF9MT0NfQUJPVkU7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3c6DQotICAgICAgICAgICAgICAgIHZhbCA9IEJDX1RFWFRfTE9DX0JFTE9XOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Fib3ZlRW1iZWRkZWQ6DQotICAgICAgICAgICAgICAgIHZhbCA9IEJDX1RFWFRfTE9DX0FCT1ZFRU1CRUQ7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3dFbWJlZGRlZDoNCi0gICAgICAgICAgICAgICAgdmFsID0gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRDsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX1RydW5jYXRlKEZYX0JPT0wmIHZhbCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIEZYX0JPT0wgYlRydW5jYXRlOw0KKyAgaWYgKHBVSUNoaWxkLT5UcnlCb29sZWFuKFhGQV9BVFRSSUJVVEVfVHJ1bmNhdGUsIGJUcnVuY2F0ZSkpIHsNCisgICAgdmFsID0gYlRydW5jYXRlOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfVHJ1bmNhdGUoRlhfQk9PTCYgdmFsKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCi0gICAgRlhfQk9PTCBiVHJ1bmNhdGU7DQotICAgIGlmKHBVSUNoaWxkLT5UcnlCb29sZWFuKFhGQV9BVFRSSUJVVEVfVHJ1bmNhdGUsIGJUcnVuY2F0ZSkpIHsNCi0gICAgICAgIHZhbCA9IGJUcnVuY2F0ZTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfV2lkZU5hcnJvd1JhdGlvKEZYX0ZMT0FUJiB2YWwpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1dpZGVOYXJyb3dSYXRpbzsNCi0gICAgaWYgKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywgd3NXaWRlTmFycm93UmF0aW8pKSB7DQotICAgICAgICBGWF9TVFJTSVpFIHB0UG9zID0gd3NXaWRlTmFycm93UmF0aW8uRmluZCgnOicpOw0KLSAgICAgICAgRlhfRkxPQVQgICBmUmF0aW8gPSAwOw0KLSAgICAgICAgaWYocHRQb3MgPj0gMCkgew0KLSAgICAgICAgICAgIGZSYXRpbyA9IChGWF9GTE9BVClGWFNZU193dG9pKHdzV2lkZU5hcnJvd1JhdGlvKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaW50MzJfdCBmQSwgZkI7DQotICAgICAgICAgICAgZkEgPSBGWFNZU193dG9pKHdzV2lkZU5hcnJvd1JhdGlvLkxlZnQocHRQb3MpKTsNCi0gICAgICAgICAgICBmQiA9IEZYU1lTX3d0b2kod3NXaWRlTmFycm93UmF0aW8uTWlkKHB0UG9zICsgMSkpOw0KLSAgICAgICAgICAgIGlmKGZCKSB7DQotICAgICAgICAgICAgICAgIGZSYXRpbyA9IChGWF9GTE9BVClmQSAvIGZCOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHZhbCA9IGZSYXRpbzsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotdm9pZCBDWEZBX1dpZGdldERhdGE6OkdldFBhc3N3b3JkQ2hhcihDRlhfV2lkZVN0cmluZyAmd3NQYXNzV29yZCkNCi17DQotICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQotICAgIGlmIChwVUlDaGlsZCkgew0KLSAgICAgICAgcFVJQ2hpbGQtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUGFzc3dvcmRDaGFyLCB3c1Bhc3NXb3JkKTsNCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9XaWRlTmFycm93UmF0aW8oRlhfRkxPQVQmIHZhbCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzV2lkZU5hcnJvd1JhdGlvOw0KKyAgaWYgKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywgd3NXaWRlTmFycm93UmF0aW8pKSB7DQorICAgIEZYX1NUUlNJWkUgcHRQb3MgPSB3c1dpZGVOYXJyb3dSYXRpby5GaW5kKCc6Jyk7DQorICAgIEZYX0ZMT0FUIGZSYXRpbyA9IDA7DQorICAgIGlmIChwdFBvcyA+PSAwKSB7DQorICAgICAgZlJhdGlvID0gKEZYX0ZMT0FUKUZYU1lTX3d0b2kod3NXaWRlTmFycm93UmF0aW8pOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgd3NQYXNzV29yZCA9IFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQ2RhdGEoWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0LCBYRkFfQVRUUklCVVRFX1Bhc3N3b3JkQ2hhciwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCisgICAgICBpbnQzMl90IGZBLCBmQjsNCisgICAgICBmQSA9IEZYU1lTX3d0b2kod3NXaWRlTmFycm93UmF0aW8uTGVmdChwdFBvcykpOw0KKyAgICAgIGZCID0gRlhTWVNfd3RvaSh3c1dpZGVOYXJyb3dSYXRpby5NaWQocHRQb3MgKyAxKSk7DQorICAgICAgaWYgKGZCKSB7DQorICAgICAgICBmUmF0aW8gPSAoRlhfRkxPQVQpZkEgLyBmQjsNCisgICAgICB9DQogICAgIH0NCisgICAgdmFsID0gZlJhdGlvOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzQWxsb3dSaWNoVGV4dCgpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBGWF9CT09MIGJWYWx1ZSA9IEZBTFNFOw0KLSAgICBpZiAocFVJQ2hpbGQgJiYgcFVJQ2hpbGQtPlRyeUJvb2xlYW4oWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LCBiVmFsdWUsIEZBTFNFKSkgew0KLSAgICAgICAgcmV0dXJuIGJWYWx1ZTsNCi0gICAgfQ0KLSAgICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKSkgew0KLSAgICAgICAgaWYgKENYRkFfTm9kZSogcENoaWxkID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KLSAgICAgICAgICAgIHJldHVybiBwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGE7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRQYXNzd29yZENoYXIoQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzc1dvcmQpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAocFVJQ2hpbGQpIHsNCisgICAgcFVJQ2hpbGQtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUGFzc3dvcmRDaGFyLCB3c1Bhc3NXb3JkKTsNCisgIH0gZWxzZSB7DQorICAgIHdzUGFzc1dvcmQgPSBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0NkYXRhKFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorICB9DQogfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpJc011bHRpTGluZSgpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBpZiAocFVJQ2hpbGQpIHsNCi0gICAgICAgIHJldHVybiBwVUlDaGlsZC0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX011bHRpTGluZSk7DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzQWxsb3dSaWNoVGV4dCgpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBGWF9CT09MIGJWYWx1ZSA9IEZBTFNFOw0KKyAgaWYgKHBVSUNoaWxkICYmDQorICAgICAgcFVJQ2hpbGQtPlRyeUJvb2xlYW4oWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LCBiVmFsdWUsIEZBTFNFKSkgew0KKyAgICByZXR1cm4gYlZhbHVlOw0KKyAgfQ0KKyAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSkpIHsNCisgICAgaWYgKENYRkFfTm9kZSogcENoaWxkID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KKyAgICAgIHJldHVybiBwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGE7DQogICAgIH0NCi0gICAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQm9vbGVhbihYRkFfRUxFTUVOVF9UZXh0RWRpdCwgWEZBX0FUVFJJQlVURV9NdWx0aUxpbmUsIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQogfQ0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRWZXJ0aWNhbFNjcm9sbFBvbGljeSgpDQotew0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KLSAgICBpZiAocFVJQ2hpbGQpIHsNCi0gICAgICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ZTY3JvbGxQb2xpY3kpOw0KLSAgICB9DQotICAgIHJldHVybiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlRfVGV4dEVkaXQsIFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6SXNNdWx0aUxpbmUoKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgaWYgKHBVSUNoaWxkKSB7DQorICAgIHJldHVybiBwVUlDaGlsZC0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX011bHRpTGluZSk7DQorICB9DQorICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9Cb29sZWFuKA0KKyAgICAgIFhGQV9FTEVNRU5UX1RleHRFZGl0LCBYRkFfQVRUUklCVVRFX011bHRpTGluZSwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCiB9DQotaW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldE1heENoYXJzKFhGQV9FTEVNRU5UJiBlVHlwZSkNCi17DQotICAgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpKSB7DQotICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSB7DQotICAgICAgICAgICAgc3dpdGNoKHBDaGlsZC0+R2V0Q2xhc3NJRCgpKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dDoNCi0gICAgICAgICAgICAgICAgICAgIGVUeXBlID0gWEZBX0VMRU1FTlRfVGV4dDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwQ2hpbGQtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9NYXhDaGFycyk7DQotICAgICAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhEYXRhOiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZVR5cGUgPSBYRkFfRUxFTUVOVF9FeERhdGE7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWF4ID0gcENoaWxkLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaU1heCA8IDAgPyAwIDogaU1heDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gMDsNCitpbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0VmVydGljYWxTY3JvbGxQb2xpY3koKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgaWYgKHBVSUNoaWxkKSB7DQorICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ZTY3JvbGxQb2xpY3kpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bSgNCisgICAgICBYRkFfRUxFTUVOVF9UZXh0RWRpdCwgWEZBX0FUVFJJQlVURV9WU2Nyb2xsUG9saWN5LCBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KIH0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0RnJhY0RpZ2l0cyhpbnQzMl90ICZpRnJhY0RpZ2l0cykNCi17DQotICAgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpKSB7DQotICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRGVjaW1hbCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gcENoaWxkLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywgaUZyYWNEaWdpdHMpOw0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRNYXhDaGFycyhYRkFfRUxFTUVOVCYgZVR5cGUpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpKSB7DQorICAgIGlmIChDWEZBX05vZGUqIHBDaGlsZCA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgICBzd2l0Y2ggKHBDaGlsZC0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHQ6DQorICAgICAgICAgIGVUeXBlID0gWEZBX0VMRU1FTlRfVGV4dDsNCisgICAgICAgICAgcmV0dXJuIHBDaGlsZC0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01heENoYXJzKTsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhEYXRhOiB7DQorICAgICAgICAgIGVUeXBlID0gWEZBX0VMRU1FTlRfRXhEYXRhOw0KKyAgICAgICAgICBpbnQzMl90IGlNYXggPSBwQ2hpbGQtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgpOw0KKyAgICAgICAgICByZXR1cm4gaU1heCA8IDAgPyAwIDogaU1heDsNCiAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBpRnJhY0RpZ2l0cyA9IC0xOw0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRMZWFkRGlnaXRzKGludDMyX3QgJmlMZWFkRGlnaXRzKQ0KLXsNCi0gICAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSkpIHsNCi0gICAgICAgIGlmIChDWEZBX05vZGUqIHBDaGlsZCA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9EZWNpbWFsKSkgew0KLSAgICAgICAgICAgIHJldHVybiBwQ2hpbGQtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9MZWFkRGlnaXRzLCBpTGVhZERpZ2l0cyk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaUxlYWREaWdpdHMgPSAtMTsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1zdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgWEZBX051bWVyaWNOb3JtYWxpemUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIElGWF9Mb2NhbGUqIHBMb2NhbGUpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0RlY2ltYWxTeW1ib2w7DQotICAgIGlmIChwTG9jYWxlKSB7DQotICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NEZWNpbWFsU3ltYm9sKTsNCi0gICAgfQ0KLSAgICBpZiAod3NEZWNpbWFsU3ltYm9sLklzRW1wdHkoKSkgew0KLSAgICAgICAgd3NEZWNpbWFsU3ltYm9sID0gJy4nOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VmFsdWUod3NWYWx1ZSk7DQotICAgIHdzTmV3VmFsdWUuVHJpbUxlZnQoTCIgIik7DQotICAgIHdzTmV3VmFsdWUuVHJpbUxlZnQoTCIwIik7DQotICAgIHdzTmV3VmFsdWUuVHJpbVJpZ2h0KEwiICIpOw0KLSAgICBpbnQzMl90IGlDb3VudAk9IHdzTmV3VmFsdWUuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChpQ291bnQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiMCIpOw0KLSAgICB9DQotICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQ7DQotICAgIEZYX1dDSEFSKiBwUmV0QnVmZmVyID0gd3NSZXQuR2V0QnVmZmVyKGlDb3VudCk7DQotICAgIGludDMyX3QgaURlc3RDb3VudCA9IDA7DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGlmICh3c05ld1ZhbHVlW2ldID09IEwnLScpIHsNCi0gICAgICAgIHBSZXRCdWZmZXJbaUluZGV4KytdID0gJy0nOw0KLSAgICB9IGVsc2UgaWYgKHdzTmV3VmFsdWVbaV0gPT0gTCcrJykgew0KLSAgICAgICAgaSsrOw0KLSAgICB9DQotICAgIEZYX0JPT0wJYkhhc1BvaW50ID0gRkFMU0U7DQotICAgIGludDMyX3QgbkNoYXJTdGFydCA9IC0xOw0KLSAgICBmb3IgKCA7IGkgPCBpQ291bnQ7IGkgKyspIHsNCi0gICAgICAgIEZYX1dDSEFSIHdjID0gd3NOZXdWYWx1ZVtpXTsNCi0gICAgICAgIGlmIChYRkFfSXNEaWdpdCh3YykpIHsNCi0gICAgICAgICAgICBpZiAobkNoYXJTdGFydCAhPSAtMSkgew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDaGFyKChjb25zdCBGWF9XQ0hBUiopd3NOZXdWYWx1ZSArIG5DaGFyU3RhcnQsIGkgLSBuQ2hhclN0YXJ0KTsNCi0gICAgICAgICAgICAgICAgaWYgKHdzQ2hhciA9PSAnLicgfHwgd3NDaGFyID09IHdzRGVjaW1hbFN5bWJvbCkgew0KLSAgICAgICAgICAgICAgICAgICAgYkhhc1BvaW50ID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIG5DaGFyU3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHBSZXRCdWZmZXJbMF0gPSAnMCc7DQotICAgICAgICAgICAgICAgICAgICBpQ291bnQgPSAxOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcFJldEJ1ZmZlcltpSW5kZXgrK10gPSB3YzsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiSGFzUG9pbnQpIHsNCi0gICAgICAgICAgICBwUmV0QnVmZmVyWzBdID0gJzAnOw0KLSAgICAgICAgICAgIGlDb3VudCA9IDE7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZiAobkNoYXJTdGFydCA9PSAtMSkgew0KLSAgICAgICAgICAgIG5DaGFyU3RhcnQgPSBpOw0KLSAgICAgICAgICAgIHBSZXRCdWZmZXJbaUluZGV4KytdID0gd2M7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgd3NSZXQuUmVsZWFzZUJ1ZmZlcihpQ291bnQpOw0KLSAgICByZXR1cm4gd3NSZXQ7DQotfQ0KLUNGWF9XaWRlU3RyaW5nIFhGQV9OdW1lcmljTGltaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIGludDMyX3QgaUxlYWQsIGludDMyX3QgaVRyZWFkKQ0KLXsNCi0gICAgaWYgKChpTGVhZCA9PSAtIDEpICAmJiAoaVRyZWFkID09IC0xKSkgew0KLSAgICAgICAgcmV0dXJuIHdzVmFsdWU7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQ7DQotICAgIGludDMyX3QgaUxlYWRfID0gMCwgaVRyZWFkXyA9IC0xOw0KLSAgICBpbnQzMl90IGlDb3VudCA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChpQ291bnQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIHdzVmFsdWU7DQotICAgIH0NCi0gICAgaW50MzJfdCBpID0gMDsNCi0gICAgaWYgKHdzVmFsdWVbaV0gPT0gTCctJykgew0KLSAgICAgICAgd3NSZXQgKz0gTCctJzsNCi0gICAgICAgIGkrKzsNCi0gICAgfQ0KLSAgICBmb3IgKDsgaSA8IGlDb3VudDsgaSArKykgew0KLSAgICAgICAgRlhfV0NIQVIgd2MgPSB3c1ZhbHVlW2ldOw0KLSAgICAgICAgaWYgKFhGQV9Jc0RpZ2l0KHdjKSkgew0KLSAgICAgICAgICAgIGlmIChpTGVhZCA+PSAwKSB7DQotICAgICAgICAgICAgICAgIGlMZWFkXyArKzsNCi0gICAgICAgICAgICAgICAgaWYgKGlMZWFkXyA+IGlMZWFkKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTCIwIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaVRyZWFkXyA+PSAwKSB7DQotICAgICAgICAgICAgICAgIGlUcmVhZF8gKys7DQotICAgICAgICAgICAgICAgIGlmIChpVHJlYWRfID4gaVRyZWFkKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaVRyZWFkICE9IC0xKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RlY2ltYWwgd3NEZWNpID0gQ0ZYX0RlY2ltYWwod3NWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NEZWNpLlNldFNjYWxlKGlUcmVhZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NSZXQgPSB3c0RlY2k7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3NSZXQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKHdjID09IEwnLicpIHsNCi0gICAgICAgICAgICBpVHJlYWRfID0gMDsNCi0gICAgICAgICAgICBpTGVhZCA9IC0xOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd3NSZXQgKz0gd2M7DQotICAgIH0NCi0gICAgcmV0dXJuIHdzUmV0Ow0KLX0NCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkNCi17DQotICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KLSAgICAgICAgU3luY1ZhbHVlKHdzVmFsdWUsIFRSVUUpOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgdGhpcy0+bV9iUHJlTnVsbCA9IHRoaXMtPm1fYklzTnVsbDsNCi0gICAgdGhpcy0+bV9iSXNOdWxsID0gRkFMU0U7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VGV4dCh3c1ZhbHVlKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KLSAgICBHZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIGVWYWx1ZVR5cGUpOw0KLSAgICBGWF9CT09MIGJWYWxpZGF0ZSA9IFRSVUU7DQotICAgIEZYX0JPT0wgYlN5bmNEYXRhID0gRkFMU0U7DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBHZXRVSUNoaWxkKCk7DQotICAgIGlmICghcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIFhGQV9FTEVNRU5UIHVpVHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQotICAgIGlmICghd3NQaWN0dXJlLklzRW1wdHkoKSkgew0KLSAgICAgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbE1nciA9IG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCk7DQotICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKTsNCi0gICAgICAgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUodGhpcyk7DQotICAgICAgICBiVmFsaWRhdGUgPSB3aWRnZXRWYWx1ZS5WYWxpZGF0ZVZhbHVlKHdzVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwgJndzUGljdHVyZSk7DQotICAgICAgICBpZiAoYlZhbGlkYXRlKSB7DQotICAgICAgICAgICAgd2lkZ2V0VmFsdWUgPSBDWEZBX0xvY2FsZVZhbHVlKHdpZGdldFZhbHVlLkdldFR5cGUoKSwgd3NOZXdUZXh0LCB3c1BpY3R1cmUsIHBMb2NhbGUsIHBMb2NhbE1ncik7DQotICAgICAgICAgICAgd3NOZXdUZXh0ID0gd2lkZ2V0VmFsdWUuR2V0VmFsdWUoKTsNCi0gICAgICAgICAgICBpZiAodWlUeXBlID09IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0KSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUxlYWREaWdpdHMgPSAwOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlGcmFjRGlnaXRzID0gMDsNCi0gICAgICAgICAgICAgICAgR2V0TGVhZERpZ2l0cyhpTGVhZERpZ2l0cyk7DQotICAgICAgICAgICAgICAgIEdldEZyYWNEaWdpdHMoaUZyYWNEaWdpdHMpOw0KLSAgICAgICAgICAgICAgICB3c05ld1RleHQgPSBYRkFfTnVtZXJpY0xpbWl0KHdzTmV3VGV4dCwgaUxlYWREaWdpdHMsIGlGcmFjRGlnaXRzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYlN5bmNEYXRhID0gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmICh1aVR5cGUgPT0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQpIHsNCi0gICAgICAgICAgICBpZiAod3NOZXdUZXh0ICE9IEZYX1dTVFJDKEwiMCIpKSB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgaUxlYWREaWdpdHMgPSAwOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGlGcmFjRGlnaXRzID0gMDsNCi0gICAgICAgICAgICAgICAgR2V0TGVhZERpZ2l0cyhpTGVhZERpZ2l0cyk7DQotICAgICAgICAgICAgICAgIEdldEZyYWNEaWdpdHMoaUZyYWNEaWdpdHMpOw0KLSAgICAgICAgICAgICAgICB3c05ld1RleHQgPSBYRkFfTnVtZXJpY0xpbWl0KHdzTmV3VGV4dCwgaUxlYWREaWdpdHMsIGlGcmFjRGlnaXRzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYlN5bmNEYXRhID0gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAodWlUeXBlICE9IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0IHx8IGJTeW5jRGF0YSkgew0KLSAgICAgICAgU3luY1ZhbHVlKHdzTmV3VGV4dCwgVFJVRSk7DQotICAgIH0NCi0gICAgcmV0dXJuIGJWYWxpZGF0ZTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldFBpY3R1cmVDb250ZW50KENGWF9XaWRlU3RyaW5nICZ3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkUgZVBpY3R1cmUpDQotew0KLSAgICBpZiAoZVBpY3R1cmUgPT0gWEZBX1ZBTFVFUElDVFVSRV9SYXcpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKHRoaXMpOw0KLSAgICBzd2l0Y2goZVBpY3R1cmUpIHsNCi0gICAgICAgIGNhc2UgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5OiB7DQotICAgICAgICAgICAgICAgIGlmIChDWEZBX05vZGUqIHBGb3JtYXQgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Gb3JtYXQpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwUGljdHVyZSA9IHBGb3JtYXQtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1BpY3R1cmUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQaWN0dXJlLT5UcnlDb250ZW50KHdzUGljdHVyZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YVBpY3R1cmUsIHdzVGltZVBpY3R1cmU7DQotICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbCgpOw0KLSAgICAgICAgICAgICAgICBpZiAoIXBMb2NhbGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1R5cGUgPSB3aWRnZXRWYWx1ZS5HZXRUeXBlKCk7DQotICAgICAgICAgICAgICAgIHN3aXRjaCAoZHdUeXBlKSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9WVF9EQVRFOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtLCB3c1BpY3R1cmUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfVElNRToNCi0gICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bSwgd3NQaWN0dXJlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEVUSU1FOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtLCB3c0RhdGFQaWN0dXJlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bSwgd3NUaW1lUGljdHVyZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NQaWN0dXJlID0gd3NEYXRhUGljdHVyZSArIEZYX1dTVFJDKEwiVCIpICsgd3NUaW1lUGljdHVyZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0RFQ0lNQUw6DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9WVF9GTE9BVDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBjYXNlIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDogew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBVSSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1VpKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBVSSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKENYRkFfTm9kZSogcFBpY3R1cmUgPSBwVUktPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1BpY3R1cmUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQaWN0dXJlLT5UcnlDb250ZW50KHdzUGljdHVyZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YVBpY3R1cmUsIHdzVGltZVBpY3R1cmU7DQotICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghcExvY2FsZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VHlwZSA9IHdpZGdldFZhbHVlLkdldFR5cGUoKTsNCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZHdUeXBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfREFURToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCwgd3NQaWN0dXJlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfVElNRToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCwgd3NQaWN0dXJlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQsIHdzRGF0YVBpY3R1cmUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0LCB3c1RpbWVQaWN0dXJlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQaWN0dXJlID0gd3NEYXRhUGljdHVyZSArIEwiVCIgKyB3c1RpbWVQaWN0dXJlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGNhc2UgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZDogew0KLSAgICAgICAgICAgICAgICBpZiAoQ1hGQV9CaW5kIGJpbmQgPSBHZXRCaW5kKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJpbmQuR2V0UGljdHVyZSh3c1BpY3R1cmUpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQogfQ0KLUlGWF9Mb2NhbGUqIENYRkFfV2lkZ2V0RGF0YTo6R2V0TG9jYWwoKQ0KLXsNCi0gICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIHBMb2NhbGU7DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEZyYWNEaWdpdHMoaW50MzJfdCYgaUZyYWNEaWdpdHMpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpKSB7DQorICAgIGlmIChDWEZBX05vZGUqIHBDaGlsZCA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9EZWNpbWFsKSkgew0KKyAgICAgIHJldHVybiBwQ2hpbGQtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9GcmFjRGlnaXRzLCBpRnJhY0RpZ2l0cyk7DQogICAgIH0NCi0gICAgRlhfQk9PTCBiTG9jYWxlID0gRkFMU0U7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTG9jYWxlTmFtZTsNCi0gICAgYkxvY2FsZSA9IG1fcE5vZGUtPkdldExvY2FsZU5hbWUod3NMb2NhbGVOYW1lKTsNCi0gICAgaWYgKGJMb2NhbGUpIHsNCi0gICAgICAgIGlmICh3c0xvY2FsZU5hbWUuRXF1YWwoRlhfV1NUUkMoTCJhbWJpZW50IikpKSB7DQotICAgICAgICAgICAgcExvY2FsZSA9IG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCktPkdldERlZkxvY2FsZSgpOw0KKyAgfQ0KKyAgaUZyYWNEaWdpdHMgPSAtMTsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldExlYWREaWdpdHMoaW50MzJfdCYgaUxlYWREaWdpdHMpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpKSB7DQorICAgIGlmIChDWEZBX05vZGUqIHBDaGlsZCA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9EZWNpbWFsKSkgew0KKyAgICAgIHJldHVybiBwQ2hpbGQtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9MZWFkRGlnaXRzLCBpTGVhZERpZ2l0cyk7DQorICAgIH0NCisgIH0NCisgIGlMZWFkRGlnaXRzID0gLTE7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3N0YXRpYyBDRlhfV2lkZVN0cmluZyBYRkFfTnVtZXJpY05vcm1hbGl6ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEZWNpbWFsU3ltYm9sOw0KKyAgaWYgKHBMb2NhbGUpIHsNCisgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzRGVjaW1hbFN5bWJvbCk7DQorICB9DQorICBpZiAod3NEZWNpbWFsU3ltYm9sLklzRW1wdHkoKSkgew0KKyAgICB3c0RlY2ltYWxTeW1ib2wgPSAnLic7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c05ld1ZhbHVlKHdzVmFsdWUpOw0KKyAgd3NOZXdWYWx1ZS5UcmltTGVmdChMIiAiKTsNCisgIHdzTmV3VmFsdWUuVHJpbUxlZnQoTCIwIik7DQorICB3c05ld1ZhbHVlLlRyaW1SaWdodChMIiAiKTsNCisgIGludDMyX3QgaUNvdW50ID0gd3NOZXdWYWx1ZS5HZXRMZW5ndGgoKTsNCisgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIwIik7DQorICB9DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyB3c1JldDsNCisgIEZYX1dDSEFSKiBwUmV0QnVmZmVyID0gd3NSZXQuR2V0QnVmZmVyKGlDb3VudCk7DQorICBpbnQzMl90IGlEZXN0Q291bnQgPSAwOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGlmICh3c05ld1ZhbHVlW2ldID09IEwnLScpIHsNCisgICAgcFJldEJ1ZmZlcltpSW5kZXgrK10gPSAnLSc7DQorICB9IGVsc2UgaWYgKHdzTmV3VmFsdWVbaV0gPT0gTCcrJykgew0KKyAgICBpKys7DQorICB9DQorICBGWF9CT09MIGJIYXNQb2ludCA9IEZBTFNFOw0KKyAgaW50MzJfdCBuQ2hhclN0YXJ0ID0gLTE7DQorICBmb3IgKDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIEZYX1dDSEFSIHdjID0gd3NOZXdWYWx1ZVtpXTsNCisgICAgaWYgKFhGQV9Jc0RpZ2l0KHdjKSkgew0KKyAgICAgIGlmIChuQ2hhclN0YXJ0ICE9IC0xKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDaGFyKChjb25zdCBGWF9XQ0hBUiopd3NOZXdWYWx1ZSArIG5DaGFyU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgLSBuQ2hhclN0YXJ0KTsNCisgICAgICAgIGlmICh3c0NoYXIgPT0gJy4nIHx8IHdzQ2hhciA9PSB3c0RlY2ltYWxTeW1ib2wpIHsNCisgICAgICAgICAgYkhhc1BvaW50ID0gVFJVRTsNCisgICAgICAgICAgbkNoYXJTdGFydCA9IC0xOw0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwTG9jYWxlID0gbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKS0+R2V0TG9jYWxlQnlOYW1lKHdzTG9jYWxlTmFtZSk7DQorICAgICAgICAgIHBSZXRCdWZmZXJbMF0gPSAnMCc7DQorICAgICAgICAgIGlDb3VudCA9IDE7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBwUmV0QnVmZmVyW2lJbmRleCsrXSA9IHdjOw0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIHJldHVybiBwTG9jYWxlOw0KKyAgICBpZiAoYkhhc1BvaW50KSB7DQorICAgICAgcFJldEJ1ZmZlclswXSA9ICcwJzsNCisgICAgICBpQ291bnQgPSAxOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChuQ2hhclN0YXJ0ID09IC0xKSB7DQorICAgICAgbkNoYXJTdGFydCA9IGk7DQorICAgICAgcFJldEJ1ZmZlcltpSW5kZXgrK10gPSB3YzsNCisgICAgfQ0KKyAgfQ0KKyAgd3NSZXQuUmVsZWFzZUJ1ZmZlcihpQ291bnQpOw0KKyAgcmV0dXJuIHdzUmV0Ow0KIH0NCi1zdGF0aWMgRlhfQk9PTCBYRkFfU3BsaXREYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlVGltZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZSkNCi17DQotICAgIHdzRGF0ZSA9IEwiIjsNCi0gICAgd3NUaW1lID0gTCIiOw0KLSAgICBpZiAod3NEYXRlVGltZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpbnQgblNwbGl0SW5kZXggPSAtMTsNCi0gICAgblNwbGl0SW5kZXggPSB3c0RhdGVUaW1lLkZpbmQoJ1QnKTsNCi0gICAgaWYgKG5TcGxpdEluZGV4IDwgMCkgew0KLSAgICAgICAgblNwbGl0SW5kZXggPSB3c0RhdGVUaW1lLkZpbmQoJyAnKTsNCi0gICAgfQ0KLSAgICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgd3NEYXRlID0gd3NEYXRlVGltZS5MZWZ0KG5TcGxpdEluZGV4KTsNCi0gICAgaWYgKCF3c0RhdGUuSXNFbXB0eSgpKSB7DQotICAgICAgICBpbnQzMl90IGlDb3VudCA9IHdzRGF0ZS5HZXRMZW5ndGgoKTsNCi0gICAgICAgIGludDMyX3QgaSA9IDA7DQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgICAgICBpZiAod3NEYXRlW2ldID49ICcwJyAmJiB3c0RhdGVbaV0gPD0gJzknKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCitDRlhfV2lkZVN0cmluZyBYRkFfTnVtZXJpY0xpbWl0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRyZWFkKSB7DQorICBpZiAoKGlMZWFkID09IC0xKSAmJiAoaVRyZWFkID09IC0xKSkgew0KKyAgICByZXR1cm4gd3NWYWx1ZTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzUmV0Ow0KKyAgaW50MzJfdCBpTGVhZF8gPSAwLCBpVHJlYWRfID0gLTE7DQorICBpbnQzMl90IGlDb3VudCA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgcmV0dXJuIHdzVmFsdWU7DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaWYgKHdzVmFsdWVbaV0gPT0gTCctJykgew0KKyAgICB3c1JldCArPSBMJy0nOw0KKyAgICBpKys7DQorICB9DQorICBmb3IgKDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIEZYX1dDSEFSIHdjID0gd3NWYWx1ZVtpXTsNCisgICAgaWYgKFhGQV9Jc0RpZ2l0KHdjKSkgew0KKyAgICAgIGlmIChpTGVhZCA+PSAwKSB7DQorICAgICAgICBpTGVhZF8rKzsNCisgICAgICAgIGlmIChpTGVhZF8gPiBpTGVhZCkgew0KKyAgICAgICAgICByZXR1cm4gTCIwIjsNCiAgICAgICAgIH0NCi0gICAgICAgIGlmIChpID09IGlDb3VudCkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9IGVsc2UgaWYgKGlUcmVhZF8gPj0gMCkgew0KKyAgICAgICAgaVRyZWFkXysrOw0KKyAgICAgICAgaWYgKGlUcmVhZF8gPiBpVHJlYWQpIHsNCisgICAgICAgICAgaWYgKGlUcmVhZCAhPSAtMSkgew0KKyAgICAgICAgICAgIENGWF9EZWNpbWFsIHdzRGVjaSA9IENGWF9EZWNpbWFsKHdzVmFsdWUpOw0KKyAgICAgICAgICAgIHdzRGVjaS5TZXRTY2FsZShpVHJlYWQpOw0KKyAgICAgICAgICAgIHdzUmV0ID0gd3NEZWNpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJldHVybiB3c1JldDsNCiAgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAod2MgPT0gTCcuJykgew0KKyAgICAgIGlUcmVhZF8gPSAwOw0KKyAgICAgIGlMZWFkID0gLTE7DQogICAgIH0NCi0gICAgd3NUaW1lID0gd3NEYXRlVGltZS5SaWdodCh3c0RhdGVUaW1lLkdldExlbmd0aCgpIC0gblNwbGl0SW5kZXggLSAxKTsNCi0gICAgaWYgKCF3c1RpbWUuSXNFbXB0eSgpKSB7DQotICAgICAgICBpbnQzMl90IGlDb3VudCA9IHdzVGltZS5HZXRMZW5ndGgoKTsNCi0gICAgICAgIGludDMyX3QgaSA9IDA7DQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCi0gICAgICAgICAgICBpZiAod3NUaW1lW2ldID49ICcwJyAmJiB3c1RpbWVbaV0gPD0gJzknKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpID09IGlDb3VudCkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KKyAgICB3c1JldCArPSB3YzsNCisgIH0NCisgIHJldHVybiB3c1JldDsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUpIHsNCisgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICBTeW5jVmFsdWUod3NWYWx1ZSwgVFJVRSk7DQogICAgIHJldHVybiBUUlVFOw0KLX0NCi0jaWZuZGVmIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCi1GWF9CT09MIENYRkFfRmllbGROb2RlX0lzUmljaFRleHRFZGl0KENYRkFfTm9kZSAqcEZpZWxkTm9kZSwgSUZERV9YTUxOb2RlIComcFhNTE5vZGUpDQotew0KLSAgICBGWF9CT09MIGJSaWNoVGV4dEVkaXQgPSBGQUxTRTsNCi0gICAgcFhNTE5vZGUgPSBOVUxMOw0KLSAgICBpZiAocEZpZWxkTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZSA9IHBGaWVsZE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCi0gICAgICAgIGlmICghcFZhbHVlKSB7DQotICAgICAgICAgICAgcmV0dXJuIGJSaWNoVGV4dEVkaXQ7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX05vZGUqIHBDaGlsZFZhbHVlID0gcFZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICBpZiAoIXBDaGlsZFZhbHVlKSB7DQotICAgICAgICAgICAgcmV0dXJuIGJSaWNoVGV4dEVkaXQ7DQotICAgICAgICB9DQotICAgICAgICBpZiAocENoaWxkVmFsdWUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGEpIHsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KLSAgICAgICAgICAgIHBDaGlsZFZhbHVlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgRkFMU0UpOw0KLSAgICAgICAgICAgIGJSaWNoVGV4dEVkaXQgPSB3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpOw0KLSAgICAgICAgICAgIGlmKGJSaWNoVGV4dEVkaXQpIHsNCi0gICAgICAgICAgICAgICAgRlhfQk9PTCBiWE1MSW5EYXRhID0gRkFMU0U7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcERhdGFOb2RlID0gcEZpZWxkTm9kZS0+R2V0QmluZERhdGEoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlICpwQmluZFhNTCA9IHBEYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwQmluZFhNTCk7DQotICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUgKnBWYWx1ZVhNTCA9IHBCaW5kWE1MLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZVhNTCAmJiBwVmFsdWVYTUwtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFhNTE5vZGUgPSBwVmFsdWVYTUw7DQotICAgICAgICAgICAgICAgICAgICAgICAgYlhNTEluRGF0YSA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKCFiWE1MSW5EYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICBwWE1MTm9kZSA9IHBDaGlsZFZhbHVlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBiUmljaFRleHRFZGl0Ow0KLX0NCi0jZW5kaWYNCi1GWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0VmFsdWUoQ0ZYX1dpZGVTdHJpbmcgJndzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkNCi17DQotI2lmZGVmIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCi0gICAgd3NWYWx1ZSA9IG1fcE5vZGUtPkdldENvbnRlbnQoKTsNCi0jZWxzZQ0KLSAgICBJRkRFX1hNTE5vZGUgKnBYTUxOb2RlID0gTlVMTDsNCi0gICAgRlhfQk9PTCBiUmljaFRleHRFZGl0ID0gQ1hGQV9GaWVsZE5vZGVfSXNSaWNoVGV4dEVkaXQobV9wTm9kZSwgcFhNTE5vZGUpOw0KLSAgICBpZiAoYlJpY2hUZXh0RWRpdCkgew0KLSAgICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dChwWE1MTm9kZSwgd3NWYWx1ZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICB3c1ZhbHVlID0gbV9wTm9kZS0+R2V0Q29udGVudCgpOw0KLSAgICB9DQotI2VuZGlmDQotICAgIGlmIChlVmFsdWVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSkgew0KLSAgICAgICAgR2V0SXRlbUxhYmVsKHdzVmFsdWUsIHdzVmFsdWUpOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsNCi0gICAgR2V0UGljdHVyZUNvbnRlbnQod3NQaWN0dXJlLCBlVmFsdWVUeXBlKTsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldFVJQ2hpbGQoKTsNCi0gICAgaWYgKCFwTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgWEZBX0VMRU1FTlQgdWlUeXBlID0gR2V0VUlDaGlsZCgpLT5HZXRDbGFzc0lEKCk7DQotICAgIHN3aXRjaCh1aVR5cGUpIHsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDogew0KLSAgICAgICAgICAgICAgICBpZiAoZVZhbHVlVHlwZSA9PSBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVNlbEl0ZW1JbmRleCA9IEdldFNlbGVjdGVkSXRlbSgwKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpU2VsSXRlbUluZGV4ID49IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBHZXRDaG9pY2VMaXN0SXRlbSh3c1ZhbHVlLCBpU2VsSXRlbUluZGV4KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1BpY3R1cmUuRW1wdHkoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQ6DQotICAgICAgICAgICAgaWYoZVZhbHVlVHlwZSAhPSBYRkFfVkFMVUVQSUNUVVJFX1JhdyAmJiB3c1BpY3R1cmUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbCgpOw0KLSAgICAgICAgICAgICAgICBpZiAoZVZhbHVlVHlwZSA9PSBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkgJiYgcExvY2FsZSkgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVOdW1TdHIod3NWYWx1ZSwgd3NPdXRwdXQpOw0KLSAgICAgICAgICAgICAgICAgICAgRm9ybWF0TnVtU3RyKHdzT3V0cHV0LCBwTG9jYWxlLCB3c091dHB1dCk7DQotICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlID0gd3NPdXRwdXQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGlmKHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIGlmIChJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKSkgew0KLSAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZSh0aGlzKTsNCi0gICAgICAgIENYRkFfTG9jYWxlTWdyICpwTG9jYWxNZ3IgPSBtX3BOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpOw0KLSAgICAgICAgc3dpdGNoICh3aWRnZXRWYWx1ZS5HZXRUeXBlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9WVF9EQVRFOiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChYRkFfU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGRhdGUoWEZBX1ZUX0RBVEUsIHdzRGF0ZSwgcExvY2FsTWdyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZS5Gb3JtYXRQYXR0ZXJucyh3c1ZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsIGVWYWx1ZVR5cGUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBYRkFfVlRfVElNRTogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7DQotICAgICAgICAgICAgICAgICAgICBpZiAoWEZBX1NwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB0aW1lKFhGQV9WVF9USU1FLCB3c1RpbWUsIHBMb2NhbE1ncik7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWUuRm9ybWF0UGF0dGVybnMod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCBlVmFsdWVUeXBlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCBlVmFsdWVUeXBlKTsNCi0gICAgfQ0KKyAgfQ0KKyAgdGhpcy0+bV9iUHJlTnVsbCA9IHRoaXMtPm1fYklzTnVsbDsNCisgIHRoaXMtPm1fYklzTnVsbCA9IEZBTFNFOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXdUZXh0KHdzVmFsdWUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KKyAgR2V0UGljdHVyZUNvbnRlbnQod3NQaWN0dXJlLCBlVmFsdWVUeXBlKTsNCisgIEZYX0JPT0wgYlZhbGlkYXRlID0gVFJVRTsNCisgIEZYX0JPT0wgYlN5bmNEYXRhID0gRkFMU0U7DQorICBDWEZBX05vZGUqIHBOb2RlID0gR2V0VUlDaGlsZCgpOw0KKyAgaWYgKCFwTm9kZSkgew0KICAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldE5vcm1hbGl6ZURhdGFWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsIENGWF9XaWRlU3RyaW5nICZ3c05vcm1hbGl6ZVZhbHVlKQ0KLXsNCi0gICAgd3NOb3JtYWxpemVWYWx1ZSA9IHdzVmFsdWU7DQotICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KLSAgICBHZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOw0KLSAgICBpZiAod3NQaWN0dXJlLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgRlhTWVNfYXNzZXJ0KEdldE5vZGUoKSk7DQotICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxNZ3IgPSBHZXROb2RlKCktPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCk7DQorICB9DQorICBYRkFfRUxFTUVOVCB1aVR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKCF3c1BpY3R1cmUuSXNFbXB0eSgpKSB7DQorICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxNZ3IgPSBtX3BOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpOw0KICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKTsNCiAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZSh0aGlzKTsNCi0gICAgaWYgKHdpZGdldFZhbHVlLlZhbGlkYXRlVmFsdWUod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCAmd3NQaWN0dXJlKSkgew0KLSAgICAgICAgd2lkZ2V0VmFsdWUgPSBDWEZBX0xvY2FsZVZhbHVlKHdpZGdldFZhbHVlLkdldFR5cGUoKSwgd3NOb3JtYWxpemVWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCBwTG9jYWxNZ3IpOw0KLSAgICAgICAgd3NOb3JtYWxpemVWYWx1ZSA9IHdpZGdldFZhbHVlLkdldFZhbHVlKCk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgYlZhbGlkYXRlID0NCisgICAgICAgIHdpZGdldFZhbHVlLlZhbGlkYXRlVmFsdWUod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCAmd3NQaWN0dXJlKTsNCisgICAgaWYgKGJWYWxpZGF0ZSkgew0KKyAgICAgIHdpZGdldFZhbHVlID0gQ1hGQV9Mb2NhbGVWYWx1ZSh3aWRnZXRWYWx1ZS5HZXRUeXBlKCksIHdzTmV3VGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQaWN0dXJlLCBwTG9jYWxlLCBwTG9jYWxNZ3IpOw0KKyAgICAgIHdzTmV3VGV4dCA9IHdpZGdldFZhbHVlLkdldFZhbHVlKCk7DQorICAgICAgaWYgKHVpVHlwZSA9PSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCkgew0KKyAgICAgICAgaW50MzJfdCBpTGVhZERpZ2l0cyA9IDA7DQorICAgICAgICBpbnQzMl90IGlGcmFjRGlnaXRzID0gMDsNCisgICAgICAgIEdldExlYWREaWdpdHMoaUxlYWREaWdpdHMpOw0KKyAgICAgICAgR2V0RnJhY0RpZ2l0cyhpRnJhY0RpZ2l0cyk7DQorICAgICAgICB3c05ld1RleHQgPSBYRkFfTnVtZXJpY0xpbWl0KHdzTmV3VGV4dCwgaUxlYWREaWdpdHMsIGlGcmFjRGlnaXRzKTsNCisgICAgICB9DQorICAgICAgYlN5bmNEYXRhID0gVFJVRTsNCiAgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKHVpVHlwZSA9PSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCkgew0KKyAgICAgIGlmICh3c05ld1RleHQgIT0gRlhfV1NUUkMoTCIwIikpIHsNCisgICAgICAgIGludDMyX3QgaUxlYWREaWdpdHMgPSAwOw0KKyAgICAgICAgaW50MzJfdCBpRnJhY0RpZ2l0cyA9IDA7DQorICAgICAgICBHZXRMZWFkRGlnaXRzKGlMZWFkRGlnaXRzKTsNCisgICAgICAgIEdldEZyYWNEaWdpdHMoaUZyYWNEaWdpdHMpOw0KKyAgICAgICAgd3NOZXdUZXh0ID0gWEZBX051bWVyaWNMaW1pdCh3c05ld1RleHQsIGlMZWFkRGlnaXRzLCBpRnJhY0RpZ2l0cyk7DQorICAgICAgfQ0KKyAgICAgIGJTeW5jRGF0YSA9IFRSVUU7DQorICAgIH0NCisgIH0NCisgIGlmICh1aVR5cGUgIT0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQgfHwgYlN5bmNEYXRhKSB7DQorICAgIFN5bmNWYWx1ZSh3c05ld1RleHQsIFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIGJWYWxpZGF0ZTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldFBpY3R1cmVDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c1BpY3R1cmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVBpY3R1cmUpIHsNCisgIGlmIChlUGljdHVyZSA9PSBYRkFfVkFMVUVQSUNUVVJFX1Jhdykgew0KICAgICByZXR1cm4gRkFMU0U7DQotfQ0KLUZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRGb3JtYXREYXRhVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlLCBDRlhfV2lkZVN0cmluZyAmd3NGb3JtYXRlZFZhbHVlKQ0KLXsNCi0gICAgd3NGb3JtYXRlZFZhbHVlID0gd3NWYWx1ZTsNCi0gICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7DQotICAgIEdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7DQotICAgIGlmICh3c1BpY3R1cmUuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBpZiAoSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCkpIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChHZXROb2RlKCkpOw0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZVZhbHVlID0gR2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQotICAgICAgICBpZiAoIXBOb2RlVmFsdWUpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKHRoaXMpOw0KKyAgc3dpdGNoIChlUGljdHVyZSkgew0KKyAgICBjYXNlIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheTogew0KKyAgICAgIGlmIChDWEZBX05vZGUqIHBGb3JtYXQgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Gb3JtYXQpKSB7DQorICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwUGljdHVyZSA9IHBGb3JtYXQtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1BpY3R1cmUpKSB7DQorICAgICAgICAgIGlmIChwUGljdHVyZS0+VHJ5Q29udGVudCh3c1BpY3R1cmUpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCi0gICAgICAgIENYRkFfTm9kZSogcFZhbHVlQ2hpbGQgPSBwTm9kZVZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgICAgICBpZiAoIXBWYWx1ZUNoaWxkKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50MzJfdCBpVlRUeXBlID0gWEZBX1ZUX05VTEw7DQotICAgICAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBWYWx1ZUNoaWxkLT5HZXRDbGFzc0lEKCk7DQotICAgICAgICBzd2l0Y2ggKGVUeXBlKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EZWNpbWFsOg0KLSAgICAgICAgICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0RFQ0lNQUw7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRmxvYXQ6DQotICAgICAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfRkxPQVQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZToNCi0gICAgICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9EQVRFOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RpbWU6DQotICAgICAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfVElNRTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlVGltZToNCi0gICAgICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9EQVRFVElNRTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Cb29sZWFuOg0KLSAgICAgICAgICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0JPT0xFQU47DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW50ZWdlcjoNCi0gICAgICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9JTlRFR0VSOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHQ6DQotICAgICAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfVEVYVDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9OVUxMOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIENYRkFfTG9jYWxlTWdyICpwTG9jYWxNZ3IgPSBHZXROb2RlKCktPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCk7DQotICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlKGlWVFR5cGUsIHdzVmFsdWUsIHBMb2NhbE1ncik7DQotICAgICAgICBzd2l0Y2ggKHdpZGdldFZhbHVlLkdldFR5cGUoKSkgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFhGQV9TcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgZGF0ZShYRkFfVlRfREFURSwgd3NEYXRlLCBwTG9jYWxNZ3IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRlLkZvcm1hdFBhdHRlcm5zKHdzRm9ybWF0ZWRWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFhGQV9TcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgdGltZShYRkFfVlRfVElNRSwgd3NUaW1lLCBwTG9jYWxNZ3IpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lLkZvcm1hdFBhdHRlcm5zKHdzRm9ybWF0ZWRWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NGb3JtYXRlZFZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotdm9pZCBDWEZBX1dpZGdldERhdGE6Ok5vcm1hbGl6ZU51bVN0cihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KQ0KLXsNCi0gICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgd3NPdXRwdXQgPSB3c1ZhbHVlOw0KLSAgICB3c091dHB1dC5UcmltTGVmdCgnMCcpOw0KLSAgICBpbnQzMl90IGRvdF9pbmRleCA9IHdzT3V0cHV0LkZpbmQoJy4nKTsNCi0gICAgaW50MzJfdCBpRnJhY0RpZ2l0cyA9IDA7DQotICAgIGlmICghd3NPdXRwdXQuSXNFbXB0eSgpICYmIGRvdF9pbmRleCA+PSAwICYmICghR2V0RnJhY0RpZ2l0cyhpRnJhY0RpZ2l0cykgfHwgaUZyYWNEaWdpdHMgIT0gLTEpKSB7DQotICAgICAgICB3c091dHB1dC5UcmltUmlnaHQoTCIwIik7DQotICAgICAgICB3c091dHB1dC5UcmltUmlnaHQoTCIuIik7DQotICAgIH0NCi0gICAgaWYgKHdzT3V0cHV0LklzRW1wdHkoKSB8fCB3c091dHB1dFswXSA9PSAnLicpIHsNCi0gICAgICAgIHdzT3V0cHV0Lkluc2VydCgwLCAnMCcpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpGb3JtYXROdW1TdHIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIElGWF9Mb2NhbGUqIHBMb2NhbGUsIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCi17DQotICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzU3JjTnVtID0gd3NWYWx1ZTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCi0gICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCi0gICAgRlhfQk9PTCBiTmVnID0gRkFMU0U7DQotICAgIGlmICh3c1NyY051bVswXSA9PSAnLScpIHsNCi0gICAgICAgIGJOZWcgPSBUUlVFOw0KLSAgICAgICAgd3NTcmNOdW0uRGVsZXRlKDAsIDEpOw0KLSAgICB9DQotICAgIGludDMyX3QgbGVuID0gd3NTcmNOdW0uR2V0TGVuZ3RoKCk7DQotICAgIGludDMyX3QgZG90X2luZGV4ID0gd3NTcmNOdW0uRmluZCgnLicpOw0KLSAgICBpZiAoZG90X2luZGV4ID09IC0xKSB7DQotICAgICAgICBkb3RfaW5kZXggPSBsZW47DQotICAgIH0NCi0gICAgaW50MzJfdCBjYyA9IGRvdF9pbmRleCAtIDE7DQotICAgIGlmIChjYyA+PSAwKSB7DQotICAgICAgICBpbnQgblBvcyA9IGRvdF9pbmRleCAlIDM7DQotICAgICAgICB3c091dHB1dC5FbXB0eSgpOw0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZG90X2luZGV4OyBpKyspIHsNCi0gICAgICAgICAgICBpZiAoaSAlIDMgPT0gblBvcyAmJiBpICE9IDApIHsNCi0gICAgICAgICAgICAgICAgd3NPdXRwdXQgKz0gd3NHcm91cFN5bWJvbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NPdXRwdXQgKz0gd3NTcmNOdW1baV07DQotICAgICAgICB9DQotICAgICAgICBpZiAoZG90X2luZGV4IDwgbGVuKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQotICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzU3ltYm9sKTsNCi0gICAgICAgICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsNCi0gICAgICAgICAgICB3c091dHB1dCArPSB3c1NyY051bS5SaWdodChsZW4gLSBkb3RfaW5kZXggLSAxKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiTmVnKSB7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOw0KLSAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsNCi0gICAgICAgICAgICB3c091dHB1dCA9IHdzTWludXN5bWJvbCArIHdzT3V0cHV0Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpTeW5jVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIEZYX0JPT0wgYk5vdGlmeSkNCi17DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NWYWx1ZSk7DQotICAgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBtX3BOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQotICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KLSAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdFZhbHVlKTsNCi0gICAgfQ0KLSAgICBtX3BOb2RlLT5TZXRDb250ZW50KHdzVmFsdWUsIHdzRm9ybWF0VmFsdWUsIGJOb3RpZnkpOw0KLX0NCi12b2lkIENYRkFfV2lkZ2V0RGF0YTo6SW5zZXJ0TGlzdFRleHRJdGVtKENYRkFfTm9kZSogcEl0ZW1zLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGV4dCwgaW50MzJfdCBuSW5kZXggKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VMRU1FTlRfVGV4dCk7DQotICAgIHBJdGVtcy0+SW5zZXJ0Q2hpbGQobkluZGV4LCBwVGV4dCk7DQotICAgIHBUZXh0LT5TZXRDb250ZW50KHdzVGV4dCwgd3NUZXh0LCBGQUxTRSwgRkFMU0UsIEZBTFNFKTsNCi19DQotQ1hGQV9GaWx0ZXIgQ1hGQV9XaWRnZXREYXRhOjpHZXRGaWx0ZXIoRlhfQk9PTCBiTW9kaWZpZWQpDQotew0KLSAgICBpZiAoIW1fcFVpQ2hpbGROb2RlKSB7DQotICAgICAgICByZXR1cm4gQ1hGQV9GaWx0ZXIoTlVMTCk7DQotICAgIH0NCi0gICAgcmV0dXJuIG1fcFVpQ2hpbGROb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9GaWx0ZXIsIGJNb2RpZmllZCk7DQotfQ0KLUNYRkFfTWFuaWZlc3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRNYW5pZmVzdChGWF9CT09MIGJNb2RpZmllZCkNCi17DQotICAgIGlmICghbV9wVWlDaGlsZE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBDWEZBX01hbmlmZXN0KE5VTEwpOw0KLSAgICB9DQotICAgIHJldHVybiBtX3BVaUNoaWxkTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTWFuaWZlc3QsIGJNb2RpZmllZCk7DQotfQ0KLUNYRkFfT2NjdXI6OkNYRkFfT2NjdXIoQ1hGQV9Ob2RlICpwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpDQoteyB9DQotaW50MzJfdCBDWEZBX09jY3VyOjpHZXRNYXgoKQ0KLXsNCi0gICAgaW50MzJfdCBpTWF4ID0gMTsNCi0gICAgaWYgKG1fcE5vZGUpIHsNCi0gICAgICAgIGlmKCFtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBUUlVFKSkgew0KLSAgICAgICAgICAgIGlNYXggPSAgR2V0TWluKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGlNYXg7DQotfQ0KLWludDMyX3QgQ1hGQV9PY2N1cjo6R2V0TWluKCkNCi17DQotICAgIGludDMyX3QgaU1pbiA9IDE7DQotICAgIGlmIChtX3BOb2RlKSB7DQotICAgICAgICBpZighbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01pbiwgaU1pbiwgVFJVRSkgfHwgaU1pbiA8IDApIHsNCi0gICAgICAgICAgICBpTWluID0gMTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaU1pbjsNCi19DQotaW50MzJfdCBDWEZBX09jY3VyOjpHZXRJbml0aWFsKCkNCi17DQotICAgIGludDMyX3QgaUluaXQgPSAxOw0KLSAgICBpZiAobV9wTm9kZSkgew0KLSAgICAgICAgaW50MzJfdCBpTWluID0gR2V0TWluKCk7DQotICAgICAgICBpZighbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX0luaXRpYWwsIGlJbml0LCBUUlVFKSB8fCBpSW5pdCA8IGlNaW4pIHsNCi0gICAgICAgICAgICBpSW5pdCA9IGlNaW47DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGlJbml0Ow0KLX0NCi1GWF9CT09MIENYRkFfT2NjdXI6OkdldE9jY3VySW5mbyhpbnQzMl90JiBpTWluLCBpbnQzMl90JiBpTWF4LCBpbnQzMl90JiBpSW5pdCkNCi17DQotICAgIGlmKCFtX3BOb2RlKSB7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YVBpY3R1cmUsIHdzVGltZVBpY3R1cmU7DQorICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCk7DQorICAgICAgaWYgKCFwTG9jYWxlKSB7DQogICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIEZYX0RXT1JEIGR3VHlwZSA9IHdpZGdldFZhbHVlLkdldFR5cGUoKTsNCisgICAgICBzd2l0Y2ggKGR3VHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfVlRfREFURToNCisgICAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGljdHVyZSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfVlRfVElNRToNCisgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGljdHVyZSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6DQorICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RhdGFQaWN0dXJlKTsNCisgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVGltZVBpY3R1cmUpOw0KKyAgICAgICAgICB3c1BpY3R1cmUgPSB3c0RhdGFQaWN0dXJlICsgRlhfV1NUUkMoTCJUIikgKyB3c1RpbWVQaWN0dXJlOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX1ZUX0RFQ0lNQUw6DQorICAgICAgICBjYXNlIFhGQV9WVF9GTE9BVDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYoIW1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIEZBTFNFKSB8fCBpTWluIDwgMCkgew0KLSAgICAgICAgaU1pbiA9IDE7DQotICAgIH0NCi0gICAgaWYoIW1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NYXgsIGlNYXgsIEZBTFNFKSkgew0KLSAgICAgICAgaWYoaU1pbiA9PSAwKSB7DQotICAgICAgICAgICAgaU1heCA9IDE7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlNYXggPSBpTWluOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDogew0KKyAgICAgIENYRkFfTm9kZSogcFVJID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVWkpOw0KKyAgICAgIGlmIChwVUkpIHsNCisgICAgICAgIGlmIChDWEZBX05vZGUqIHBQaWN0dXJlID0gcFVJLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9QaWN0dXJlKSkgew0KKyAgICAgICAgICBpZiAocFBpY3R1cmUtPlRyeUNvbnRlbnQod3NQaWN0dXJlKSkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YVBpY3R1cmUsIHdzVGltZVBpY3R1cmU7DQorICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKTsNCisgICAgICAgIGlmICghcExvY2FsZSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBGWF9EV09SRCBkd1R5cGUgPSB3aWRnZXRWYWx1ZS5HZXRUeXBlKCk7DQorICAgICAgICBzd2l0Y2ggKGR3VHlwZSkgew0KKyAgICAgICAgICBjYXNlIFhGQV9WVF9EQVRFOg0KKyAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQaWN0dXJlKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSBYRkFfVlRfVElNRToNCisgICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGljdHVyZSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEVUSU1FOg0KKyAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NEYXRhUGljdHVyZSk7DQorICAgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1RpbWVQaWN0dXJlKTsNCisgICAgICAgICAgICB3c1BpY3R1cmUgPSB3c0RhdGFQaWN0dXJlICsgTCJUIiArIHdzVGltZVBpY3R1cmU7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KICAgICB9DQotICAgIGlmKCFtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwgaUluaXQsIEZBTFNFKSB8fCBpSW5pdCA8IGlNaW4pIHsNCi0gICAgICAgIGlJbml0ID0gaU1pbjsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kOiB7DQorICAgICAgaWYgKENYRkFfQmluZCBiaW5kID0gR2V0QmluZCgpKSB7DQorICAgICAgICBiaW5kLkdldFBpY3R1cmUod3NQaWN0dXJlKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorSUZYX0xvY2FsZSogQ1hGQV9XaWRnZXREYXRhOjpHZXRMb2NhbCgpIHsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBwTG9jYWxlOw0KKyAgfQ0KKyAgRlhfQk9PTCBiTG9jYWxlID0gRkFMU0U7DQorICBDRlhfV2lkZVN0cmluZyB3c0xvY2FsZU5hbWU7DQorICBiTG9jYWxlID0gbV9wTm9kZS0+R2V0TG9jYWxlTmFtZSh3c0xvY2FsZU5hbWUpOw0KKyAgaWYgKGJMb2NhbGUpIHsNCisgICAgaWYgKHdzTG9jYWxlTmFtZS5FcXVhbChGWF9XU1RSQyhMImFtYmllbnQiKSkpIHsNCisgICAgICBwTG9jYWxlID0gbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKS0+R2V0RGVmTG9jYWxlKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcExvY2FsZSA9DQorICAgICAgICAgIG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCktPkdldExvY2FsZUJ5TmFtZSh3c0xvY2FsZU5hbWUpOw0KICAgICB9DQorICB9DQorICByZXR1cm4gcExvY2FsZTsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX1NwbGl0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUaW1lKSB7DQorICB3c0RhdGUgPSBMIiI7DQorICB3c1RpbWUgPSBMIiI7DQorICBpZiAod3NEYXRlVGltZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50IG5TcGxpdEluZGV4ID0gLTE7DQorICBuU3BsaXRJbmRleCA9IHdzRGF0ZVRpbWUuRmluZCgnVCcpOw0KKyAgaWYgKG5TcGxpdEluZGV4IDwgMCkgew0KKyAgICBuU3BsaXRJbmRleCA9IHdzRGF0ZVRpbWUuRmluZCgnICcpOw0KKyAgfQ0KKyAgaWYgKG5TcGxpdEluZGV4IDwgMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3c0RhdGUgPSB3c0RhdGVUaW1lLkxlZnQoblNwbGl0SW5kZXgpOw0KKyAgaWYgKCF3c0RhdGUuSXNFbXB0eSgpKSB7DQorICAgIGludDMyX3QgaUNvdW50ID0gd3NEYXRlLkdldExlbmd0aCgpOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBpZiAod3NEYXRlW2ldID49ICcwJyAmJiB3c0RhdGVbaV0gPD0gJzknKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGkgPT0gaUNvdW50KSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICB3c1RpbWUgPSB3c0RhdGVUaW1lLlJpZ2h0KHdzRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBuU3BsaXRJbmRleCAtIDEpOw0KKyAgaWYgKCF3c1RpbWUuSXNFbXB0eSgpKSB7DQorICAgIGludDMyX3QgaUNvdW50ID0gd3NUaW1lLkdldExlbmd0aCgpOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBpZiAod3NUaW1lW2ldID49ICcwJyAmJiB3c1RpbWVbaV0gPD0gJzknKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGkgPT0gaUNvdW50KSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorI2lmbmRlZiBYRkFfUEFSU0VfSEFTX0xJTkVJREVOVElGSUVSDQorRlhfQk9PTCBDWEZBX0ZpZWxkTm9kZV9Jc1JpY2hUZXh0RWRpdChDWEZBX05vZGUqIHBGaWVsZE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqJiBwWE1MTm9kZSkgew0KKyAgRlhfQk9PTCBiUmljaFRleHRFZGl0ID0gRkFMU0U7DQorICBwWE1MTm9kZSA9IE5VTEw7DQorICBpZiAocEZpZWxkTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgIENYRkFfTm9kZSogcFZhbHVlID0gcEZpZWxkTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KKyAgICBpZiAoIXBWYWx1ZSkgew0KKyAgICAgIHJldHVybiBiUmljaFRleHRFZGl0Ow0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcENoaWxkVmFsdWUgPSBwVmFsdWUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgaWYgKCFwQ2hpbGRWYWx1ZSkgew0KKyAgICAgIHJldHVybiBiUmljaFRleHRFZGl0Ow0KKyAgICB9DQorICAgIGlmIChwQ2hpbGRWYWx1ZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICAgICAgcENoaWxkVmFsdWUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOw0KKyAgICAgIGJSaWNoVGV4dEVkaXQgPSB3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpOw0KKyAgICAgIGlmIChiUmljaFRleHRFZGl0KSB7DQorICAgICAgICBGWF9CT09MIGJYTUxJbkRhdGEgPSBGQUxTRTsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcEZpZWxkTm9kZS0+R2V0QmluZERhdGEoKTsNCisgICAgICAgIGlmIChwRGF0YU5vZGUpIHsNCisgICAgICAgICAgSUZERV9YTUxOb2RlKiBwQmluZFhNTCA9IHBEYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBCaW5kWE1MKTsNCisgICAgICAgICAgSUZERV9YTUxOb2RlKiBwVmFsdWVYTUwgPQ0KKyAgICAgICAgICAgICAgcEJpbmRYTUwtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgICAgIGlmIChwVmFsdWVYTUwgJiYgcFZhbHVlWE1MLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgIHBYTUxOb2RlID0gcFZhbHVlWE1MOw0KKyAgICAgICAgICAgIGJYTUxJbkRhdGEgPSBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWJYTUxJbkRhdGEpIHsNCisgICAgICAgICAgcFhNTE5vZGUgPSBwQ2hpbGRWYWx1ZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBiUmljaFRleHRFZGl0Ow0KK30NCisjZW5kaWYNCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0VmFsdWUoQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgew0KKyNpZmRlZiBYRkFfUEFSU0VfSEFTX0xJTkVJREVOVElGSUVSDQorICB3c1ZhbHVlID0gbV9wTm9kZS0+R2V0Q29udGVudCgpOw0KKyNlbHNlDQorICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gTlVMTDsNCisgIEZYX0JPT0wgYlJpY2hUZXh0RWRpdCA9IENYRkFfRmllbGROb2RlX0lzUmljaFRleHRFZGl0KG1fcE5vZGUsIHBYTUxOb2RlKTsNCisgIGlmIChiUmljaFRleHRFZGl0KSB7DQorICAgIFhGQV9HZXRQbGFpblRleHRGcm9tUmljaFRleHQocFhNTE5vZGUsIHdzVmFsdWUpOw0KKyAgfSBlbHNlIHsNCisgICAgd3NWYWx1ZSA9IG1fcE5vZGUtPkdldENvbnRlbnQoKTsNCisgIH0NCisjZW5kaWYNCisgIGlmIChlVmFsdWVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSkgew0KKyAgICBHZXRJdGVtTGFiZWwod3NWYWx1ZSwgd3NWYWx1ZSk7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7DQorICBHZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIGVWYWx1ZVR5cGUpOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldFVJQ2hpbGQoKTsNCisgIGlmICghcE5vZGUpIHsNCiAgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBYRkFfRUxFTUVOVCB1aVR5cGUgPSBHZXRVSUNoaWxkKCktPkdldENsYXNzSUQoKTsNCisgIHN3aXRjaCAodWlUeXBlKSB7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDogew0KKyAgICAgIGlmIChlVmFsdWVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSkgew0KKyAgICAgICAgaW50MzJfdCBpU2VsSXRlbUluZGV4ID0gR2V0U2VsZWN0ZWRJdGVtKDApOw0KKyAgICAgICAgaWYgKGlTZWxJdGVtSW5kZXggPj0gMCkgew0KKyAgICAgICAgICBHZXRDaG9pY2VMaXN0SXRlbSh3c1ZhbHVlLCBpU2VsSXRlbUluZGV4KTsNCisgICAgICAgICAgd3NQaWN0dXJlLkVtcHR5KCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0Og0KKyAgICAgIGlmIChlVmFsdWVUeXBlICE9IFhGQV9WQUxVRVBJQ1RVUkVfUmF3ICYmIHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbCgpOw0KKyAgICAgICAgaWYgKGVWYWx1ZVR5cGUgPT0gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5ICYmIHBMb2NhbGUpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7DQorICAgICAgICAgIE5vcm1hbGl6ZU51bVN0cih3c1ZhbHVlLCB3c091dHB1dCk7DQorICAgICAgICAgIEZvcm1hdE51bVN0cih3c091dHB1dCwgcExvY2FsZSwgd3NPdXRwdXQpOw0KKyAgICAgICAgICB3c1ZhbHVlID0gd3NPdXRwdXQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAoSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCkpIHsNCisgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZSh0aGlzKTsNCisgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbE1nciA9IG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCk7DQorICAgIHN3aXRjaCAod2lkZ2V0VmFsdWUuR2V0VHlwZSgpKSB7DQorICAgICAgY2FzZSBYRkFfVlRfREFURTogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7DQorICAgICAgICBpZiAoWEZBX1NwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpKSB7DQorICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgZGF0ZShYRkFfVlRfREFURSwgd3NEYXRlLCBwTG9jYWxNZ3IpOw0KKyAgICAgICAgICBpZiAoZGF0ZS5Gb3JtYXRQYXR0ZXJucyh3c1ZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsIGVWYWx1ZVR5cGUpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIFhGQV9WVF9USU1FOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCisgICAgICAgIGlmIChYRkFfU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkpIHsNCisgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB0aW1lKFhGQV9WVF9USU1FLCB3c1RpbWUsIHBMb2NhbE1ncik7DQorICAgICAgICAgIGlmICh0aW1lLkZvcm1hdFBhdHRlcm5zKHdzVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwgZVZhbHVlVHlwZSkpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICB3aWRnZXRWYWx1ZS5Gb3JtYXRQYXR0ZXJucyh3c1ZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsIGVWYWx1ZVR5cGUpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLXZvaWQgQ1hGQV9PY2N1cjo6U2V0TWF4KGludDMyX3QgaU1heCkNCi17DQotICAgIGlNYXggPSAoaU1heCAhPSAtMSAmJiBpTWF4IDwgMSkgPyAxIDogaU1heDsNCi0gICAgbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01heCwgaU1heCwgRkFMU0UpOw0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXROb3JtYWxpemVEYXRhVmFsdWUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTm9ybWFsaXplVmFsdWUpIHsNCisgIHdzTm9ybWFsaXplVmFsdWUgPSB3c1ZhbHVlOw0KKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KKyAgR2V0UGljdHVyZUNvbnRlbnQod3NQaWN0dXJlLCBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsNCisgIGlmICh3c1BpY3R1cmUuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KEdldE5vZGUoKSk7DQorICBDWEZBX0xvY2FsZU1nciogcExvY2FsTWdyID0gR2V0Tm9kZSgpLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpOw0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCk7DQorICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKHRoaXMpOw0KKyAgaWYgKHdpZGdldFZhbHVlLlZhbGlkYXRlVmFsdWUod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCAmd3NQaWN0dXJlKSkgew0KKyAgICB3aWRnZXRWYWx1ZSA9IENYRkFfTG9jYWxlVmFsdWUod2lkZ2V0VmFsdWUuR2V0VHlwZSgpLCB3c05vcm1hbGl6ZVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQaWN0dXJlLCBwTG9jYWxlLCBwTG9jYWxNZ3IpOw0KKyAgICB3c05vcm1hbGl6ZVZhbHVlID0gd2lkZ2V0VmFsdWUuR2V0VmFsdWUoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRGb3JtYXREYXRhVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0ZWRWYWx1ZSkgew0KKyAgd3NGb3JtYXRlZFZhbHVlID0gd3NWYWx1ZTsNCisgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsNCisgIEdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7DQorICBpZiAod3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKSkgew0KKyAgICBGWFNZU19hc3NlcnQoR2V0Tm9kZSgpKTsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZVZhbHVlID0gR2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgIGlmICghcE5vZGVWYWx1ZSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBWYWx1ZUNoaWxkID0gcE5vZGVWYWx1ZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpZiAoIXBWYWx1ZUNoaWxkKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGludDMyX3QgaVZUVHlwZSA9IFhGQV9WVF9OVUxMOw0KKyAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBWYWx1ZUNoaWxkLT5HZXRDbGFzc0lEKCk7DQorICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RlY2ltYWw6DQorICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0RFQ0lNQUw7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Zsb2F0Og0KKyAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9GTE9BVDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZToNCisgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREFURTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGltZToNCisgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfVElNRTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWU6DQorICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0RBVEVUSU1FOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Cb29sZWFuOg0KKyAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9CT09MRUFOOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbnRlZ2VyOg0KKyAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9JTlRFR0VSOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0Og0KKyAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9URVhUOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfTlVMTDsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxNZ3IgPSBHZXROb2RlKCktPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCk7DQorICAgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoaVZUVHlwZSwgd3NWYWx1ZSwgcExvY2FsTWdyKTsNCisgICAgc3dpdGNoICh3aWRnZXRWYWx1ZS5HZXRUeXBlKCkpIHsNCisgICAgICBjYXNlIFhGQV9WVF9EQVRFOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCisgICAgICAgIGlmIChYRkFfU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkpIHsNCisgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBkYXRlKFhGQV9WVF9EQVRFLCB3c0RhdGUsIHBMb2NhbE1ncik7DQorICAgICAgICAgIGlmIChkYXRlLkZvcm1hdFBhdHRlcm5zKHdzRm9ybWF0ZWRWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKSkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBYRkFfVlRfVElNRTogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7DQorICAgICAgICBpZiAoWEZBX1NwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpKSB7DQorICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgdGltZShYRkFfVlRfVElNRSwgd3NUaW1lLCBwTG9jYWxNZ3IpOw0KKyAgICAgICAgICBpZiAodGltZS5Gb3JtYXRQYXR0ZXJucyh3c0Zvcm1hdGVkVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCkpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICB3aWRnZXRWYWx1ZS5Gb3JtYXRQYXR0ZXJucyh3c0Zvcm1hdGVkVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpOb3JtYWxpemVOdW1TdHIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsNCisgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICB3c091dHB1dCA9IHdzVmFsdWU7DQorICB3c091dHB1dC5UcmltTGVmdCgnMCcpOw0KKyAgaW50MzJfdCBkb3RfaW5kZXggPSB3c091dHB1dC5GaW5kKCcuJyk7DQorICBpbnQzMl90IGlGcmFjRGlnaXRzID0gMDsNCisgIGlmICghd3NPdXRwdXQuSXNFbXB0eSgpICYmIGRvdF9pbmRleCA+PSAwICYmDQorICAgICAgKCFHZXRGcmFjRGlnaXRzKGlGcmFjRGlnaXRzKSB8fCBpRnJhY0RpZ2l0cyAhPSAtMSkpIHsNCisgICAgd3NPdXRwdXQuVHJpbVJpZ2h0KEwiMCIpOw0KKyAgICB3c091dHB1dC5UcmltUmlnaHQoTCIuIik7DQorICB9DQorICBpZiAod3NPdXRwdXQuSXNFbXB0eSgpIHx8IHdzT3V0cHV0WzBdID09ICcuJykgew0KKyAgICB3c091dHB1dC5JbnNlcnQoMCwgJzAnKTsNCisgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OkZvcm1hdE51bVN0cihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsNCisgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1NyY051bSA9IHdzVmFsdWU7DQorICBDRlhfV2lkZVN0cmluZyB3c0dyb3VwU3ltYm9sOw0KKyAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCisgIEZYX0JPT0wgYk5lZyA9IEZBTFNFOw0KKyAgaWYgKHdzU3JjTnVtWzBdID09ICctJykgew0KKyAgICBiTmVnID0gVFJVRTsNCisgICAgd3NTcmNOdW0uRGVsZXRlKDAsIDEpOw0KKyAgfQ0KKyAgaW50MzJfdCBsZW4gPSB3c1NyY051bS5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgZG90X2luZGV4ID0gd3NTcmNOdW0uRmluZCgnLicpOw0KKyAgaWYgKGRvdF9pbmRleCA9PSAtMSkgew0KKyAgICBkb3RfaW5kZXggPSBsZW47DQorICB9DQorICBpbnQzMl90IGNjID0gZG90X2luZGV4IC0gMTsNCisgIGlmIChjYyA+PSAwKSB7DQorICAgIGludCBuUG9zID0gZG90X2luZGV4ICUgMzsNCisgICAgd3NPdXRwdXQuRW1wdHkoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZG90X2luZGV4OyBpKyspIHsNCisgICAgICBpZiAoaSAlIDMgPT0gblBvcyAmJiBpICE9IDApIHsNCisgICAgICAgIHdzT3V0cHV0ICs9IHdzR3JvdXBTeW1ib2w7DQorICAgICAgfQ0KKyAgICAgIHdzT3V0cHV0ICs9IHdzU3JjTnVtW2ldOw0KKyAgICB9DQorICAgIGlmIChkb3RfaW5kZXggPCBsZW4pIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NTeW1ib2wpOw0KKyAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KKyAgICAgIHdzT3V0cHV0ICs9IHdzU3JjTnVtLlJpZ2h0KGxlbiAtIGRvdF9pbmRleCAtIDEpOw0KKyAgICB9DQorICAgIGlmIChiTmVnKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOw0KKyAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsNCisgICAgICB3c091dHB1dCA9IHdzTWludXN5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpTeW5jVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzVmFsdWUpOw0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IG1fcE5vZGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KKyAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0VmFsdWUpOw0KKyAgfQ0KKyAgbV9wTm9kZS0+U2V0Q29udGVudCh3c1ZhbHVlLCB3c0Zvcm1hdFZhbHVlLCBiTm90aWZ5KTsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6Okluc2VydExpc3RUZXh0SXRlbShDWEZBX05vZGUqIHBJdGVtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgpIHsNCisgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX1RleHQpOw0KKyAgcEl0ZW1zLT5JbnNlcnRDaGlsZChuSW5kZXgsIHBUZXh0KTsNCisgIHBUZXh0LT5TZXRDb250ZW50KHdzVGV4dCwgd3NUZXh0LCBGQUxTRSwgRkFMU0UsIEZBTFNFKTsNCit9DQorQ1hGQV9GaWx0ZXIgQ1hGQV9XaWRnZXREYXRhOjpHZXRGaWx0ZXIoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIGlmICghbV9wVWlDaGlsZE5vZGUpIHsNCisgICAgcmV0dXJuIENYRkFfRmlsdGVyKE5VTEwpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcFVpQ2hpbGROb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9GaWx0ZXIsIGJNb2RpZmllZCk7DQorfQ0KK0NYRkFfTWFuaWZlc3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRNYW5pZmVzdChGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgaWYgKCFtX3BVaUNoaWxkTm9kZSkgew0KKyAgICByZXR1cm4gQ1hGQV9NYW5pZmVzdChOVUxMKTsNCisgIH0NCisgIHJldHVybiBtX3BVaUNoaWxkTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTWFuaWZlc3QsIGJNb2RpZmllZCk7DQorfQ0KK0NYRkFfT2NjdXI6OkNYRkFfT2NjdXIoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQoraW50MzJfdCBDWEZBX09jY3VyOjpHZXRNYXgoKSB7DQorICBpbnQzMl90IGlNYXggPSAxOw0KKyAgaWYgKG1fcE5vZGUpIHsNCisgICAgaWYgKCFtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBUUlVFKSkgew0KKyAgICAgIGlNYXggPSBHZXRNaW4oKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlNYXg7DQorfQ0KK2ludDMyX3QgQ1hGQV9PY2N1cjo6R2V0TWluKCkgew0KKyAgaW50MzJfdCBpTWluID0gMTsNCisgIGlmIChtX3BOb2RlKSB7DQorICAgIGlmICghbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01pbiwgaU1pbiwgVFJVRSkgfHwgaU1pbiA8IDApIHsNCisgICAgICBpTWluID0gMTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlNaW47DQorfQ0KK2ludDMyX3QgQ1hGQV9PY2N1cjo6R2V0SW5pdGlhbCgpIHsNCisgIGludDMyX3QgaUluaXQgPSAxOw0KKyAgaWYgKG1fcE5vZGUpIHsNCiAgICAgaW50MzJfdCBpTWluID0gR2V0TWluKCk7DQotICAgIGlmIChpTWF4ICE9IC0xICYmIGlNYXggPCBpTWluKSB7DQotICAgICAgICBpTWluID0gaU1heDsNCi0gICAgICAgIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIEZBTFNFKTsNCisgICAgaWYgKCFtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwgaUluaXQsIFRSVUUpIHx8DQorICAgICAgICBpSW5pdCA8IGlNaW4pIHsNCisgICAgICBpSW5pdCA9IGlNaW47DQogICAgIH0NCisgIH0NCisgIHJldHVybiBpSW5pdDsNCiB9DQotdm9pZCBDWEZBX09jY3VyOjpTZXRNaW4oaW50MzJfdCBpTWluKQ0KLXsNCi0gICAgaU1pbiA9IChpTWluIDwgMCkgPyAxIDogaU1pbjsNCitGWF9CT09MIENYRkFfT2NjdXI6OkdldE9jY3VySW5mbyhpbnQzMl90JiBpTWluLCBpbnQzMl90JiBpTWF4LCBpbnQzMl90JiBpSW5pdCkgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01pbiwgaU1pbiwgRkFMU0UpIHx8IGlNaW4gPCAwKSB7DQorICAgIGlNaW4gPSAxOw0KKyAgfQ0KKyAgaWYgKCFtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBGQUxTRSkpIHsNCisgICAgaWYgKGlNaW4gPT0gMCkgew0KKyAgICAgIGlNYXggPSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlNYXggPSBpTWluOw0KKyAgICB9DQorICB9DQorICBpZiAoIW1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9Jbml0aWFsLCBpSW5pdCwgRkFMU0UpIHx8DQorICAgICAgaUluaXQgPCBpTWluKSB7DQorICAgIGlJbml0ID0gaU1pbjsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfT2NjdXI6OlNldE1heChpbnQzMl90IGlNYXgpIHsNCisgIGlNYXggPSAoaU1heCAhPSAtMSAmJiBpTWF4IDwgMSkgPyAxIDogaU1heDsNCisgIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9NYXgsIGlNYXgsIEZBTFNFKTsNCisgIGludDMyX3QgaU1pbiA9IEdldE1pbigpOw0KKyAgaWYgKGlNYXggIT0gLTEgJiYgaU1heCA8IGlNaW4pIHsNCisgICAgaU1pbiA9IGlNYXg7DQogICAgIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIEZBTFNFKTsNCi0gICAgaW50MzJfdCBpTWF4ID0gR2V0TWF4KCk7DQotICAgIGlmIChpTWF4ID4gMCAmJiBpTWF4IDwgaU1pbikgew0KLSAgICAgICAgaU1heCA9IGlNaW47DQotICAgICAgICBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBGQUxTRSk7DQotICAgIH0NCisgIH0NCiB9DQotWEZBX0FUVFJJQlVURUVOVU0gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKENYRkFfTm9kZSogcE5vZGUsIFhGQV9BVFRSSUJVVEUgYXR0cmlidXRlVmFsdWUgPSBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVFTlVNIGVEZWZhdWx0VmFsdWUgPSBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbCkNCi17DQotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVUeXBlID0gZURlZmF1bHRWYWx1ZTsNCi0gICAgaWYgKHBOb2RlKSB7DQotICAgICAgICBpZiAoIXBOb2RlLT5UcnlFbnVtKGF0dHJpYnV0ZVZhbHVlLCBlVHlwZSwgVFJVRSkpIHsNCi0gICAgICAgICAgICBlVHlwZSA9IGVEZWZhdWx0VmFsdWU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGVUeXBlOw0KK3ZvaWQgQ1hGQV9PY2N1cjo6U2V0TWluKGludDMyX3QgaU1pbikgew0KKyAgaU1pbiA9IChpTWluIDwgMCkgPyAxIDogaU1pbjsNCisgIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIEZBTFNFKTsNCisgIGludDMyX3QgaU1heCA9IEdldE1heCgpOw0KKyAgaWYgKGlNYXggPiAwICYmIGlNYXggPCBpTWluKSB7DQorICAgIGlNYXggPSBpTWluOw0KKyAgICBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBGQUxTRSk7DQorICB9DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRGaWx0ZXJTdHJpbmcoWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NTdHJpbmdWYWx1ZTsNCi0gICAgaWYgKG1fcE5vZGUpIHsNCi0gICAgICAgIG1fcE5vZGUtPkdldEF0dHJpYnV0ZShlQXR0cmlidXRlLCB3c1N0cmluZ1ZhbHVlLCBGQUxTRSk7DQorWEZBX0FUVFJJQlVURUVOVU0gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKA0KKyAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICBYRkFfQVRUUklCVVRFIGF0dHJpYnV0ZVZhbHVlID0gWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlRGVmYXVsdFZhbHVlID0gWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWwpIHsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVUeXBlID0gZURlZmF1bHRWYWx1ZTsNCisgIGlmIChwTm9kZSkgew0KKyAgICBpZiAoIXBOb2RlLT5UcnlFbnVtKGF0dHJpYnV0ZVZhbHVlLCBlVHlwZSwgVFJVRSkpIHsNCisgICAgICBlVHlwZSA9IGVEZWZhdWx0VmFsdWU7DQogICAgIH0NCi0gICAgcmV0dXJuIHdzU3RyaW5nVmFsdWU7DQorICB9DQorICByZXR1cm4gZVR5cGU7DQogfQ0KLVhGQV9BVFRSSUJVVEVFTlVNIENYRkFfRmlsdGVyOjpHZXRBcHBlYXJhbmNlRmlsdGVyVHlwZSgpDQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbDsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBBcHBlYXJhbmNlRmlsdGVyTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0FwcGVhcmFuY2VGaWx0ZXIpOw0KLSAgICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKHBBcHBlYXJhbmNlRmlsdGVyTm9kZSk7DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9GaWx0ZXI6OkdldEZpbHRlclN0cmluZyhYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzU3RyaW5nVmFsdWU7DQorICBpZiAobV9wTm9kZSkgew0KKyAgICBtX3BOb2RlLT5HZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NTdHJpbmdWYWx1ZSwgRkFMU0UpOw0KKyAgfQ0KKyAgcmV0dXJuIHdzU3RyaW5nVmFsdWU7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRBcHBlYXJhbmNlRmlsdGVyQ29udGVudCgpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQotICAgIGlmIChtX3BOb2RlKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBBcHBlYXJhbmNlRmlsdGVyTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0FwcGVhcmFuY2VGaWx0ZXIpOw0KLSAgICAgICAgcEFwcGVhcmFuY2VGaWx0ZXJOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHdzQ29udGVudDsNCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0ZpbHRlcjo6R2V0QXBwZWFyYW5jZUZpbHRlclR5cGUoKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQXBwZWFyYW5jZUZpbHRlck5vZGUgPQ0KKyAgICAgIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0FwcGVhcmFuY2VGaWx0ZXIpOw0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShwQXBwZWFyYW5jZUZpbHRlck5vZGUpOw0KIH0NCi1YRkFfQVRUUklCVVRFRU5VTSBDWEZBX0ZpbHRlcjo6R2V0Q2VydGlmaWNhdGVzQ3JlZGVudGlhbFNlcnZlclBvbGljeSgpDQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbDsNCi0gICAgfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRBcHBlYXJhbmNlRmlsdGVyQ29udGVudCgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIGlmIChtX3BOb2RlKSB7DQorICAgIENYRkFfTm9kZSogcEFwcGVhcmFuY2VGaWx0ZXJOb2RlID0NCisgICAgICAgIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0FwcGVhcmFuY2VGaWx0ZXIpOw0KKyAgICBwQXBwZWFyYW5jZUZpbHRlck5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgIH0NCisgIHJldHVybiB3c0NvbnRlbnQ7DQorfQ0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNDcmVkZW50aWFsU2VydmVyUG9saWN5KCkgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbDsNCisgIH0NCisgIENYRkFfTm9kZSogcENlcnRzTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcyk7DQorICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKHBDZXJ0c05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVfQ3JlZGVudGlhbFNlcnZlclBvbGljeSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNVUkwoKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1VSTDsNCisgIGlmIChtX3BOb2RlKSB7DQogICAgIENYRkFfTm9kZSogcENlcnRzTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcyk7DQotICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUocENlcnRzTm9kZSwgWEZBX0FUVFJJQlVURV9DcmVkZW50aWFsU2VydmVyUG9saWN5KTsNCisgICAgcENlcnRzTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfVXJsLCB3c1VSTCwgRkFMU0UpOw0KKyAgfQ0KKyAgcmV0dXJuIHdzVVJMOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0Q2VydGlmaWNhdGVzVVJMKCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVVJMOw0KLSAgICBpZiAobV9wTm9kZSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwQ2VydHNOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzKTsNCi0gICAgICAgIHBDZXJ0c05vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1VybCwgd3NVUkwsIEZBTFNFKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gd3NVUkw7DQotfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNVUkxQb2xpY3koKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NVUkxQb2xpY3k7DQotICAgIGlmIChtX3BOb2RlKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBDZXJ0c05vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMpOw0KLSAgICAgICAgcENlcnRzTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfVXJsUG9saWN5LCB3c1VSTFBvbGljeSwgRkFMU0UpOw0KLSAgICB9DQotICAgIHJldHVybiB3c1VSTFBvbGljeTsNCi19DQotQ1hGQV9XcmFwQ2VydGlmaWNhdGUgQ1hGQV9GaWx0ZXI6OkdldENlcnRpZmljYXRlc0VuY3J5cHRpb24oRlhfQk9PTCBiTW9kaWZpZWQpDQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBDWEZBX1dyYXBDZXJ0aWZpY2F0ZShOVUxMKTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBDZXJ0c05vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMsIGJNb2RpZmllZCk7DQotICAgIHJldHVybiBDWEZBX1dyYXBDZXJ0aWZpY2F0ZShwQ2VydHNOb2RlID8gcENlcnRzTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbiwgYk1vZGlmaWVkKSA6IE5VTEwpOw0KLX0NCi1DWEZBX1dyYXBDZXJ0aWZpY2F0ZSBDWEZBX0ZpbHRlcjo6R2V0Q2VydGlmaWNhdGVzSXNzdWVycyhGWF9CT09MIGJNb2RpZmllZCApDQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBDWEZBX1dyYXBDZXJ0aWZpY2F0ZShOVUxMKTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBDZXJ0c05vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMsIGJNb2RpZmllZCk7DQotICAgIHJldHVybiBDWEZBX1dyYXBDZXJ0aWZpY2F0ZShwQ2VydHNOb2RlID8gcENlcnRzTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfSXNzdWVycywgYk1vZGlmaWVkKSA6IE5VTEwpOw0KLX0NCi1DRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0Q2VydGlmaWNhdGVzS2V5VXNhZ2VTdHJpbmcoWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKCFtX3BOb2RlKSB7DQotICAgICAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCi0gICAgfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNVUkxQb2xpY3koKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1VSTFBvbGljeTsNCisgIGlmIChtX3BOb2RlKSB7DQogICAgIENYRkFfTm9kZSogcENlcnRzTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcyk7DQotICAgIENYRkFfTm9kZSogcEtleVVzYWdlTm9kZSA9IHBDZXJ0c05vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0tleVVzYWdlKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyaWJ1dGVWYWx1ZTsNCi0gICAgcEtleVVzYWdlTm9kZS0+R2V0QXR0cmlidXRlKGVBdHRyaWJ1dGUsIHdzQXR0cmlidXRlVmFsdWUsIEZBTFNFKTsNCi0gICAgcmV0dXJuIHdzQXR0cmlidXRlVmFsdWU7DQorICAgIHBDZXJ0c05vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1VybFBvbGljeSwgd3NVUkxQb2xpY3ksIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiB3c1VSTFBvbGljeTsNCiB9DQotQ1hGQV9PaWRzIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNPaWRzKCkNCi17DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIENYRkFfT2lkcyhOVUxMKTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBDZXJ0c05vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMpOw0KLSAgICByZXR1cm4gQ1hGQV9PaWRzKHBDZXJ0c05vZGUgPyBwQ2VydHNOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9PaWRzKSA6IE5VTEwpOw0KK0NYRkFfV3JhcENlcnRpZmljYXRlIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNFbmNyeXB0aW9uKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIENYRkFfV3JhcENlcnRpZmljYXRlKE5VTEwpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQ2VydHNOb2RlID0NCisgICAgICBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMsIGJNb2RpZmllZCk7DQorICByZXR1cm4gQ1hGQV9XcmFwQ2VydGlmaWNhdGUoDQorICAgICAgcENlcnRzTm9kZSA/IHBDZXJ0c05vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0VuY3J5cHRpb24sIGJNb2RpZmllZCkNCisgICAgICAgICAgICAgICAgIDogTlVMTCk7DQogfQ0KLUNYRkFfV3JhcENlcnRpZmljYXRlIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNTaWduaW5nKEZYX0JPT0wgYk1vZGlmaWVkICkNCi17DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIENYRkFfV3JhcENlcnRpZmljYXRlKE5VTEwpOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcENlcnRzTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcywgYk1vZGlmaWVkKTsNCi0gICAgcmV0dXJuIENYRkFfV3JhcENlcnRpZmljYXRlKHBDZXJ0c05vZGUgPyBwQ2VydHNOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9TaWduaW5nLCBiTW9kaWZpZWQpIDogTlVMTCk7DQorQ1hGQV9XcmFwQ2VydGlmaWNhdGUgQ1hGQV9GaWx0ZXI6OkdldENlcnRpZmljYXRlc0lzc3VlcnMoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gQ1hGQV9XcmFwQ2VydGlmaWNhdGUoTlVMTCk7DQorICB9DQorICBDWEZBX05vZGUqIHBDZXJ0c05vZGUgPQ0KKyAgICAgIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcywgYk1vZGlmaWVkKTsNCisgIHJldHVybiBDWEZBX1dyYXBDZXJ0aWZpY2F0ZSgNCisgICAgICBwQ2VydHNOb2RlID8gcENlcnRzTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfSXNzdWVycywgYk1vZGlmaWVkKQ0KKyAgICAgICAgICAgICAgICAgOiBOVUxMKTsNCiB9DQotQ1hGQV9EaWdlc3RNZXRob2RzIENYRkFfRmlsdGVyOjpHZXREaWdlc3RNZXRob2RzKEZYX0JPT0wgYk1vZGlmaWVkICkNCi17DQotICAgIHJldHVybiBDWEZBX0RpZ2VzdE1ldGhvZHMobV9wTm9kZSA/IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZHMsIGJNb2RpZmllZCkgOiBOVUxMKTsNCitDRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0Q2VydGlmaWNhdGVzS2V5VXNhZ2VTdHJpbmcoDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQ2VydHNOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzKTsNCisgIENYRkFfTm9kZSogcEtleVVzYWdlTm9kZSA9IHBDZXJ0c05vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0tleVVzYWdlKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmlidXRlVmFsdWU7DQorICBwS2V5VXNhZ2VOb2RlLT5HZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NBdHRyaWJ1dGVWYWx1ZSwgRkFMU0UpOw0KKyAgcmV0dXJuIHdzQXR0cmlidXRlVmFsdWU7DQogfQ0KLUNYRkFfRW5jb2RpbmdzIENYRkFfRmlsdGVyOjpHZXRFbmNvZGluZ3MoRlhfQk9PTCBiTW9kaWZpZWQgKQ0KLXsNCi0gICAgcmV0dXJuIENYRkFfRW5jb2RpbmdzKG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9FbmNvZGluZ3MsIGJNb2RpZmllZCkgOiBOVUxMKTsNCitDWEZBX09pZHMgQ1hGQV9GaWx0ZXI6OkdldENlcnRpZmljYXRlc09pZHMoKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIENYRkFfT2lkcyhOVUxMKTsNCisgIH0NCisgIENYRkFfTm9kZSogcENlcnRzTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcyk7DQorICByZXR1cm4gQ1hGQV9PaWRzKHBDZXJ0c05vZGUgPyBwQ2VydHNOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9PaWRzKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCk7DQogfQ0KLUNYRkFfRW5jcnlwdGlvbk1ldGhvZHMgQ1hGQV9GaWx0ZXI6OkdldEVuY3J5cHRpb25NZXRob2RzKEZYX0JPT0wgYk1vZGlmaWVkICkNCi17DQotICAgIHJldHVybiBDWEZBX0VuY3J5cHRpb25NZXRob2RzKG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTWV0aG9kcywgYk1vZGlmaWVkKSA6IE5VTEwpOw0KK0NYRkFfV3JhcENlcnRpZmljYXRlIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNTaWduaW5nKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIENYRkFfV3JhcENlcnRpZmljYXRlKE5VTEwpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQ2VydHNOb2RlID0NCisgICAgICBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMsIGJNb2RpZmllZCk7DQorICByZXR1cm4gQ1hGQV9XcmFwQ2VydGlmaWNhdGUoDQorICAgICAgcENlcnRzTm9kZSA/IHBDZXJ0c05vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1NpZ25pbmcsIGJNb2RpZmllZCkNCisgICAgICAgICAgICAgICAgIDogTlVMTCk7DQogfQ0KLVhGQV9BVFRSSUJVVEVFTlVNIENYRkFfRmlsdGVyOjpHZXRIYW5kbGVyVHlwZSgpDQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbDsNCi0gICAgfQ0KK0NYRkFfRGlnZXN0TWV0aG9kcyBDWEZBX0ZpbHRlcjo6R2V0RGlnZXN0TWV0aG9kcyhGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIENYRkFfRGlnZXN0TWV0aG9kcygNCisgICAgICBtX3BOb2RlID8gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kcywgYk1vZGlmaWVkKQ0KKyAgICAgICAgICAgICAgOiBOVUxMKTsNCit9DQorQ1hGQV9FbmNvZGluZ3MgQ1hGQV9GaWx0ZXI6OkdldEVuY29kaW5ncyhGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIENYRkFfRW5jb2RpbmdzKA0KKyAgICAgIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9FbmNvZGluZ3MsIGJNb2RpZmllZCkNCisgICAgICAgICAgICAgIDogTlVMTCk7DQorfQ0KK0NYRkFfRW5jcnlwdGlvbk1ldGhvZHMgQ1hGQV9GaWx0ZXI6OkdldEVuY3J5cHRpb25NZXRob2RzKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICByZXR1cm4gQ1hGQV9FbmNyeXB0aW9uTWV0aG9kcygNCisgICAgICBtX3BOb2RlDQorICAgICAgICAgID8gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZHMsIGJNb2RpZmllZCkNCisgICAgICAgICAgOiBOVUxMKTsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9GaWx0ZXI6OkdldEhhbmRsZXJUeXBlKCkgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbDsNCisgIH0NCisgIENYRkFfTm9kZSogcEhhbmRsZXJOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfSGFuZGxlcik7DQorICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKHBIYW5kbGVyTm9kZSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRIYW5kbGVyQ29udGVudCgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIGlmIChtX3BOb2RlKSB7DQogICAgIENYRkFfTm9kZSogcEhhbmRsZXJOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfSGFuZGxlcik7DQotICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUocEhhbmRsZXJOb2RlKTsNCisgICAgcEhhbmRsZXJOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICB9DQorICByZXR1cm4gd3NDb250ZW50Ow0KIH0NCi1DRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0SGFuZGxlckNvbnRlbnQoKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KLSAgICBpZiAobV9wTm9kZSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwSGFuZGxlck5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9IYW5kbGVyKTsNCi0gICAgICAgIHBIYW5kbGVyTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KLSAgICB9DQotICAgIHJldHVybiB3c0NvbnRlbnQ7DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9GaWx0ZXI6OkdldGxvY2tEb2N1bWVudFR5cGUoKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTG9ja0RvY05vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Mb2NrRG9jdW1lbnQpOw0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShwTG9ja0RvY05vZGUpOw0KIH0NCi1YRkFfQVRUUklCVVRFRU5VTSBDWEZBX0ZpbHRlcjo6R2V0bG9ja0RvY3VtZW50VHlwZSgpDQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbDsNCi0gICAgfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRsb2NrRG9jdW1lbnRDb250ZW50KCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50ID0gRlhfV1NUUkMoTCJhdXRvIik7DQorICBpZiAobV9wTm9kZSkgew0KICAgICBDWEZBX05vZGUqIHBMb2NrRG9jTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0xvY2tEb2N1bWVudCk7DQotICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUocExvY2tEb2NOb2RlKTsNCisgICAgcExvY2tEb2NOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICB9DQorICByZXR1cm4gd3NDb250ZW50Ow0KIH0NCi1DRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0bG9ja0RvY3VtZW50Q29udGVudCgpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQgPSBGWF9XU1RSQyhMImF1dG8iKTsNCi0gICAgaWYgKG1fcE5vZGUpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcExvY2tEb2NOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTG9ja0RvY3VtZW50KTsNCi0gICAgICAgIHBMb2NrRG9jTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KLSAgICB9DQotICAgIHJldHVybiB3c0NvbnRlbnQ7DQotfQ0KLWludDMyX3QgQ1hGQV9GaWx0ZXI6OkdldE1EUFBlcm1pc3Npb25zKCkNCi17DQotICAgIGludDMyX3QgaVBlcm1pc3Npb25zID0gMjsNCi0gICAgaWYgKG1fcE5vZGUpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcE1EUE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9NZHApOw0KLSAgICAgICAgaWYgKCFwTURQTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX1Blcm1pc3Npb25zLCBpUGVybWlzc2lvbnMsIFRSVUUpKSB7DQotICAgICAgICAgICAgaVBlcm1pc3Npb25zID0gMjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaVBlcm1pc3Npb25zOw0KLX0NCi1YRkFfQVRUUklCVVRFRU5VTSBDWEZBX0ZpbHRlcjo6R2V0TURQU2lnbmF0dXJlVHlwZSgpDQotew0KLSAgICBpZiAoIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9GaWx0ZXI7DQotICAgIH0NCitpbnQzMl90IENYRkFfRmlsdGVyOjpHZXRNRFBQZXJtaXNzaW9ucygpIHsNCisgIGludDMyX3QgaVBlcm1pc3Npb25zID0gMjsNCisgIGlmIChtX3BOb2RlKSB7DQogICAgIENYRkFfTm9kZSogcE1EUE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9NZHApOw0KLSAgICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKHBNRFBOb2RlLCBYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsIFhGQV9BVFRSSUJVVEVFTlVNX0ZpbHRlcik7DQotfQ0KLUNYRkFfUmVhc29ucyBDWEZBX0ZpbHRlcjo6R2V0UmVhc29ucyhGWF9CT09MIGJNb2RpZmllZCApDQotew0KLSAgICByZXR1cm4gQ1hGQV9SZWFzb25zKG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9SZWFzb25zKSA6IE5VTEwpOw0KLX0NCi1DRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0VGltZVN0YW1wU2VydmVyKCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzU2VydmVyVVJJOw0KLSAgICBpZiAobV9wTm9kZSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwVGltZVN0YW1wTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1RpbWVTdGFtcCk7DQotICAgICAgICBwVGltZVN0YW1wTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfU2VydmVyLCB3c1NlcnZlclVSSSwgRkFMU0UpOw0KKyAgICBpZiAoIXBNRFBOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfUGVybWlzc2lvbnMsIGlQZXJtaXNzaW9ucywgVFJVRSkpIHsNCisgICAgICBpUGVybWlzc2lvbnMgPSAyOw0KICAgICB9DQotICAgIHJldHVybiB3c1NlcnZlclVSSTsNCisgIH0NCisgIHJldHVybiBpUGVybWlzc2lvbnM7DQogfQ0KLVhGQV9BVFRSSUJVVEVFTlVNIENYRkFfRmlsdGVyOjpHZXRUaW1lU3RhbXBUeXBlKCkNCi17DQotICAgIGlmICghbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsOw0KLSAgICB9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9GaWx0ZXI6OkdldE1EUFNpZ25hdHVyZVR5cGUoKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0ZpbHRlcjsNCisgIH0NCisgIENYRkFfTm9kZSogcE1EUE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9NZHApOw0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShwTURQTm9kZSwgWEZBX0FUVFJJQlVURV9TaWduYXR1cmVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9GaWx0ZXIpOw0KK30NCitDWEZBX1JlYXNvbnMgQ1hGQV9GaWx0ZXI6OkdldFJlYXNvbnMoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIHJldHVybiBDWEZBX1JlYXNvbnMobV9wTm9kZSA/IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1JlYXNvbnMpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMKTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9GaWx0ZXI6OkdldFRpbWVTdGFtcFNlcnZlcigpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzU2VydmVyVVJJOw0KKyAgaWYgKG1fcE5vZGUpIHsNCiAgICAgQ1hGQV9Ob2RlKiBwVGltZVN0YW1wTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1RpbWVTdGFtcCk7DQotICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUocFRpbWVTdGFtcE5vZGUpOw0KKyAgICBwVGltZVN0YW1wTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfU2VydmVyLCB3c1NlcnZlclVSSSwgRkFMU0UpOw0KKyAgfQ0KKyAgcmV0dXJuIHdzU2VydmVyVVJJOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDWEZBX0NlcnRpZmljYXRlOjpHZXRDZXJ0aWZpY2F0ZU5hbWUoKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KLSAgICBpZiAobV9wTm9kZSkgew0KLSAgICAgICAgbV9wTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lLCBGQUxTRSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHdzTmFtZTsNCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0ZpbHRlcjo6R2V0VGltZVN0YW1wVHlwZSgpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWw7DQorICB9DQorICBDWEZBX05vZGUqIHBUaW1lU3RhbXBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVGltZVN0YW1wKTsNCisgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUocFRpbWVTdGFtcE5vZGUpOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDWEZBX0NlcnRpZmljYXRlOjpHZXRDZXJ0aWZpY2F0ZUNvbnRlbnQoKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KLSAgICBpZiAobV9wTm9kZSkgew0KLSAgICAgICAgbV9wTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KLSAgICB9DQotICAgIHJldHVybiB3c0NvbnRlbnQ7DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9DZXJ0aWZpY2F0ZTo6R2V0Q2VydGlmaWNhdGVOYW1lKCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgaWYgKG1fcE5vZGUpIHsNCisgICAgbV9wTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lLCBGQUxTRSk7DQorICB9DQorICByZXR1cm4gd3NOYW1lOw0KIH0NCi1YRkFfQVRUUklCVVRFRU5VTSBDWEZBX1dyYXBDZXJ0aWZpY2F0ZTo6R2V0VHlwZSgpDQotew0KLSAgICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKG1fcE5vZGUpOw0KK0NGWF9XaWRlU3RyaW5nIENYRkFfQ2VydGlmaWNhdGU6OkdldENlcnRpZmljYXRlQ29udGVudCgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIGlmIChtX3BOb2RlKSB7DQorICAgIG1fcE5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgIH0NCisgIHJldHVybiB3c0NvbnRlbnQ7DQogfQ0KLWludDMyX3QgQ1hGQV9XcmFwQ2VydGlmaWNhdGU6OkNvdW50Q2VydGlmaWNhdGVzKCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZSkgOiAwOw0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfV3JhcENlcnRpZmljYXRlOjpHZXRUeXBlKCkgew0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlKTsNCiB9DQotQ1hGQV9DZXJ0aWZpY2F0ZSBDWEZBX1dyYXBDZXJ0aWZpY2F0ZTo6R2V0Q2VydGlmaWNhdGUoaW50MzJfdCBuSW5kZXgpDQotew0KLSAgICByZXR1cm4gQ1hGQV9DZXJ0aWZpY2F0ZSgobkluZGV4ID4gLTEgJiYgbV9wTm9kZSkgPyBtX3BOb2RlLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlKSA6IE5VTEwpOw0KK2ludDMyX3QgQ1hGQV9XcmFwQ2VydGlmaWNhdGU6OkNvdW50Q2VydGlmaWNhdGVzKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlKSA6IDA7DQogfQ0KLVhGQV9BVFRSSUJVVEVFTlVNIENYRkFfT2lkczo6R2V0T2lkc1R5cGUoKQ0KLXsNCi0gICAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlKTsNCitDWEZBX0NlcnRpZmljYXRlIENYRkFfV3JhcENlcnRpZmljYXRlOjpHZXRDZXJ0aWZpY2F0ZShpbnQzMl90IG5JbmRleCkgew0KKyAgcmV0dXJuIENYRkFfQ2VydGlmaWNhdGUoDQorICAgICAgKG5JbmRleCA+IC0xICYmIG1fcE5vZGUpDQorICAgICAgICAgID8gbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZSkNCisgICAgICAgICAgOiBOVUxMKTsNCiB9DQotaW50MzJfdCBDWEZBX09pZHM6OkNvdW50T2lkcygpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfT2lkKSA6IDA7DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9PaWRzOjpHZXRPaWRzVHlwZSgpIHsNCisgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSk7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfT2lkczo6R2V0T2lkQ29udGVudChpbnQzMl90IG5JbmRleCkNCi17DQotICAgIGlmIChuSW5kZXggPD0gLTEgfHwgIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcE9pZE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX09pZCk7DQotICAgIGlmICghcE9pZE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCi0gICAgcE9pZE5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCi0gICAgcmV0dXJuIHdzQ29udGVudDsNCitpbnQzMl90IENYRkFfT2lkczo6Q291bnRPaWRzKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX09pZCkgOiAwOw0KIH0NCi1YRkFfQVRUUklCVVRFRU5VTSBDWEZBX1N1YmplY3RETnM6OkdldFN1YmplY3RETnNUeXBlKCkNCi17DQotICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSk7DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9PaWRzOjpHZXRPaWRDb250ZW50KGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4IDw9IC0xIHx8ICFtX3BOb2RlKSB7DQorICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwT2lkTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfT2lkKTsNCisgIGlmICghcE9pZE5vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICBwT2lkTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgcmV0dXJuIHdzQ29udGVudDsNCiB9DQotaW50MzJfdCBDWEZBX1N1YmplY3RETnM6OkNvdW50U3ViamVjdEROcygpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfU3ViamVjdEROKSA6IDA7DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9TdWJqZWN0RE5zOjpHZXRTdWJqZWN0RE5zVHlwZSgpIHsNCisgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSk7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfU3ViamVjdEROczo6R2V0U3ViamVjdEROU3RyaW5nKGludDMyX3QgbkluZGV4LCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBpZiAobkluZGV4IDw9IC0xIHx8ICFtX3BOb2RlKSB7DQotICAgICAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBTdWJqZWN0RE5Ob2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9TdWJqZWN0RE4pOw0KLSAgICBpZiAoIXBTdWJqZWN0RE5Ob2RlKSB7DQotICAgICAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJpYnV0ZVZhbHVlOw0KLSAgICBwU3ViamVjdEROTm9kZS0+R2V0QXR0cmlidXRlKGVBdHRyaWJ1dGUsIHdzQXR0cmlidXRlVmFsdWUsIEZBTFNFKTsNCi0gICAgcmV0dXJuIHdzQXR0cmlidXRlVmFsdWU7DQoraW50MzJfdCBDWEZBX1N1YmplY3RETnM6OkNvdW50U3ViamVjdEROcygpIHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9TdWJqZWN0RE4pIDogMDsNCiB9DQotQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9TdWJqZWN0RE5zOjpHZXRTdWJqZWN0RE5Db250ZW50KGludDMyX3QgbkluZGV4KQ0KLXsNCi0gICAgaWYgKG5JbmRleCA8PSAtMSB8fCAhbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwU3ViamVjdEROTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfU3ViamVjdEROKTsNCi0gICAgaWYgKCFwU3ViamVjdEROTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KLSAgICBwU3ViamVjdEROTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KLSAgICByZXR1cm4gd3NDb250ZW50Ow0KK0NGWF9XaWRlU3RyaW5nIENYRkFfU3ViamVjdEROczo6R2V0U3ViamVjdEROU3RyaW5nKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKG5JbmRleCA8PSAtMSB8fCAhbV9wTm9kZSkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgIH0NCisgIENYRkFfTm9kZSogcFN1YmplY3RETk5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX1N1YmplY3RETik7DQorICBpZiAoIXBTdWJqZWN0RE5Ob2RlKSB7DQorICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyaWJ1dGVWYWx1ZTsNCisgIHBTdWJqZWN0RE5Ob2RlLT5HZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NBdHRyaWJ1dGVWYWx1ZSwgRkFMU0UpOw0KKyAgcmV0dXJuIHdzQXR0cmlidXRlVmFsdWU7DQogfQ0KLVhGQV9BVFRSSUJVVEVFTlVNIENYRkFfRGlnZXN0TWV0aG9kczo6R2V0RGlnZXN0TWV0aG9kc1R5cGUoKQ0KLXsNCi0gICAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlKTsNCitDRlhfV2lkZVN0cmluZyBDWEZBX1N1YmplY3RETnM6OkdldFN1YmplY3RETkNvbnRlbnQoaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChuSW5kZXggPD0gLTEgfHwgIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDWEZBX05vZGUqIHBTdWJqZWN0RE5Ob2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9TdWJqZWN0RE4pOw0KKyAgaWYgKCFwU3ViamVjdEROTm9kZSkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIHBTdWJqZWN0RE5Ob2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICByZXR1cm4gd3NDb250ZW50Ow0KIH0NCi1pbnQzMl90IENYRkFfRGlnZXN0TWV0aG9kczo6Q291bnREaWdlc3RNZXRob2RzKCkNCi17DQotICAgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9EaWdlc3RNZXRob2QpIDogMDsNCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0RpZ2VzdE1ldGhvZHM6OkdldERpZ2VzdE1ldGhvZHNUeXBlKCkgew0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlKTsNCiB9DQotQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9EaWdlc3RNZXRob2RzOjpHZXREaWdlc3RNZXRob2RDb250ZW50KGludDMyX3QgbkluZGV4KQ0KLXsNCi0gICAgaWYgKG5JbmRleCA8PSAtMSB8fCAhbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwRGlnZXN0TWV0aG9kTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kKTsNCi0gICAgaWYgKCFwRGlnZXN0TWV0aG9kTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KLSAgICBwRGlnZXN0TWV0aG9kTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KLSAgICByZXR1cm4gd3NDb250ZW50Ow0KK2ludDMyX3QgQ1hGQV9EaWdlc3RNZXRob2RzOjpDb3VudERpZ2VzdE1ldGhvZHMoKSB7DQorICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kKSA6IDA7DQogfQ0KLVhGQV9BVFRSSUJVVEVFTlVNIENYRkFfRW5jb2RpbmdzOjpHZXRFbmNvZGluZ3NUeXBlKCkNCi17DQotICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSk7DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9EaWdlc3RNZXRob2RzOjpHZXREaWdlc3RNZXRob2RDb250ZW50KGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4IDw9IC0xIHx8ICFtX3BOb2RlKSB7DQorICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwRGlnZXN0TWV0aG9kTm9kZSA9DQorICAgICAgbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9EaWdlc3RNZXRob2QpOw0KKyAgaWYgKCFwRGlnZXN0TWV0aG9kTm9kZSkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIHBEaWdlc3RNZXRob2ROb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICByZXR1cm4gd3NDb250ZW50Ow0KIH0NCi1pbnQzMl90IENYRkFfRW5jb2RpbmdzOjpDb3VudEVuY29kaW5ncygpDQotew0KLSAgICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfRW5jb2RpbmcpIDogMDsNCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0VuY29kaW5nczo6R2V0RW5jb2RpbmdzVHlwZSgpIHsNCisgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSk7DQogfQ0KLUNGWF9XaWRlU3RyaW5nIENYRkFfRW5jb2RpbmdzOjpHZXRFbmNvZGluZ0NvbnRlbnQoaW50MzJfdCBuSW5kZXgpDQotew0KLSAgICBpZiAobkluZGV4IDw9IC0xIHx8ICFtX3BOb2RlKSB7DQotICAgICAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBFbmNvZGluZ05vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX0VuY29kaW5nKTsNCi0gICAgaWYgKCFwRW5jb2RpbmdOb2RlKSB7DQotICAgICAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQotICAgIHBFbmNvZGluZ05vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCi0gICAgcmV0dXJuIHdzQ29udGVudDsNCitpbnQzMl90IENYRkFfRW5jb2RpbmdzOjpDb3VudEVuY29kaW5ncygpIHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9FbmNvZGluZykgOiAwOw0KIH0NCi1YRkFfQVRUUklCVVRFRU5VTSBDWEZBX0VuY3J5cHRpb25NZXRob2RzOjpHZXRFbmNyeXB0aW9uTWV0aG9kc1R5cGUoKQ0KLXsNCi0gICAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlKTsNCitDRlhfV2lkZVN0cmluZyBDWEZBX0VuY29kaW5nczo6R2V0RW5jb2RpbmdDb250ZW50KGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4IDw9IC0xIHx8ICFtX3BOb2RlKSB7DQorICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwRW5jb2RpbmdOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9FbmNvZGluZyk7DQorICBpZiAoIXBFbmNvZGluZ05vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICBwRW5jb2RpbmdOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICByZXR1cm4gd3NDb250ZW50Ow0KIH0NCi1pbnQzMl90IENYRkFfRW5jcnlwdGlvbk1ldGhvZHM6OkNvdW50RW5jcnlwdGlvbk1ldGhvZHMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2QpIDogMDsNCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0VuY3J5cHRpb25NZXRob2RzOjpHZXRFbmNyeXB0aW9uTWV0aG9kc1R5cGUoKSB7DQorICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKG1fcE5vZGUpOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDWEZBX0VuY3J5cHRpb25NZXRob2RzOjpHZXRFbmNyeXB0aW9uTWV0aG9kQ29udGVudChpbnQzMl90IG5JbmRleCkNCi17DQotICAgIGlmIChuSW5kZXggPD0gLTEgfHwgIW1fcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcEVuY3J5TWV0aG9kTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZCk7DQotICAgIGlmICghcEVuY3J5TWV0aG9kTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KLSAgICBwRW5jcnlNZXRob2ROb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQotICAgIHJldHVybiB3c0NvbnRlbnQ7DQoraW50MzJfdCBDWEZBX0VuY3J5cHRpb25NZXRob2RzOjpDb3VudEVuY3J5cHRpb25NZXRob2RzKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2QpIDogMDsNCiB9DQotWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9SZWFzb25zOjpHZXRSZWFzb25zVHlwZSgpDQotew0KLSAgICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKG1fcE5vZGUpOw0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRW5jcnlwdGlvbk1ldGhvZHM6OkdldEVuY3J5cHRpb25NZXRob2RDb250ZW50KA0KKyAgICBpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKG5JbmRleCA8PSAtMSB8fCAhbV9wTm9kZSkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgIH0NCisgIENYRkFfTm9kZSogcEVuY3J5TWV0aG9kTm9kZSA9DQorICAgICAgbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTWV0aG9kKTsNCisgIGlmICghcEVuY3J5TWV0aG9kTm9kZSkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIHBFbmNyeU1ldGhvZE5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgIHJldHVybiB3c0NvbnRlbnQ7DQogfQ0KLWludDMyX3QgQ1hGQV9SZWFzb25zOjpDb3VudFJlYXNvbnMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX1JlYXNvbikgOiAwOw0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfUmVhc29uczo6R2V0UmVhc29uc1R5cGUoKSB7DQorICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKG1fcE5vZGUpOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDWEZBX1JlYXNvbnM6OkdldFJlYXNvbkNvbnRlbnQoaW50MzJfdCBuSW5kZXgpDQotew0KLSAgICBpZiAobkluZGV4IDw9IC0xIHx8ICFtX3BOb2RlKSB7DQotICAgICAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBSZWFzb25Ob2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9SZWFzb24pOw0KLSAgICBpZiAoIXBSZWFzb25Ob2RlKSB7DQotICAgICAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQotICAgIHBSZWFzb25Ob2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQotICAgIHJldHVybiB3c0NvbnRlbnQ7DQoraW50MzJfdCBDWEZBX1JlYXNvbnM6OkNvdW50UmVhc29ucygpIHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9SZWFzb24pIDogMDsNCiB9DQotWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9NYW5pZmVzdDo6R2V0QWN0aW9uKCkNCi17DQotICAgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSwgWEZBX0FUVFJJQlVURV9BY3Rpb24sIFhGQV9BVFRSSUJVVEVFTlVNX0luY2x1ZGUpOw0KK0NGWF9XaWRlU3RyaW5nIENYRkFfUmVhc29uczo6R2V0UmVhc29uQ29udGVudChpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKG5JbmRleCA8PSAtMSB8fCAhbV9wTm9kZSkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgIH0NCisgIENYRkFfTm9kZSogcFJlYXNvbk5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FTEVNRU5UX1JlYXNvbik7DQorICBpZiAoIXBSZWFzb25Ob2RlKSB7DQorICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgcFJlYXNvbk5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgIHJldHVybiB3c0NvbnRlbnQ7DQogfQ0KLWludDMyX3QgQ1hGQV9NYW5pZmVzdDo6Q291bnRSZWl2ZXMoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX1JlZikgOiAwOw0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfTWFuaWZlc3Q6OkdldEFjdGlvbigpIHsNCisgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSwgWEZBX0FUVFJJQlVURV9BY3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0luY2x1ZGUpOw0KIH0NCi1DRlhfV2lkZVN0cmluZyBDWEZBX01hbmlmZXN0OjpHZXRSZWZDb250ZW50KGludDMyX3QgbkluZGV4KQ0KLXsNCi0gICAgaWYgKG5JbmRleCA8PSAtMSB8fCAhbV9wTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwUmVmTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfUmVmKTsNCi0gICAgaWYgKCFwUmVmTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KLSAgICBwUmVmTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KLSAgICByZXR1cm4gd3NDb250ZW50Ow0KK2ludDMyX3QgQ1hGQV9NYW5pZmVzdDo6Q291bnRSZWl2ZXMoKSB7DQorICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfUmVmKSA6IDA7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTWFuaWZlc3Q6OkdldFJlZkNvbnRlbnQoaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChuSW5kZXggPD0gLTEgfHwgIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDWEZBX05vZGUqIHBSZWZOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9SZWYpOw0KKyAgaWYgKCFwUmVmTm9kZSkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIHBSZWZOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICByZXR1cm4gd3NDb250ZW50Ow0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcC5jcHAKaW5kZXggODJlNjczOS4uMmEwMTMwMiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3BhcnNlcl9pbXAuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9wYXJzZXJfaW1wLmNwcApAQCAtMTgsMTQwNCArMTgsMTU5NCBAQAogI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCiAjaW5jbHVkZSAieGZhX2Jhc2ljX2ltcC5oIg0KICNpbmNsdWRlICJ4ZmFfcGFyc2VyX2ltcC5oIg0KLUlYRkFfUGFyc2VyKiBJWEZBX1BhcnNlcjo6Q3JlYXRlKElYRkFfT2JqRmFjdG9yeSAqcEZhY3RvcnksIEZYX0JPT0wgYkRvY3VtZW50UGFyc2VyKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDWEZBX1NpbXBsZVBhcnNlcihwRmFjdG9yeSwgYkRvY3VtZW50UGFyc2VyKTsNCitJWEZBX1BhcnNlciogSVhGQV9QYXJzZXI6OkNyZWF0ZShJWEZBX09iakZhY3RvcnkqIHBGYWN0b3J5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRvY3VtZW50UGFyc2VyKSB7DQorICByZXR1cm4gRlhfTkVXIENYRkFfU2ltcGxlUGFyc2VyKHBGYWN0b3J5LCBiRG9jdW1lbnRQYXJzZXIpOw0KIH0NCi1DWEZBX1NpbXBsZVBhcnNlcjo6Q1hGQV9TaW1wbGVQYXJzZXIoSVhGQV9PYmpGYWN0b3J5ICpwRmFjdG9yeSwgRlhfQk9PTCBiRG9jdW1lbnRQYXJzZXIgKQ0KLSAgICA6IG1fcFhNTFBhcnNlcihOVUxMKQ0KLSAgICAsIG1fcFhNTERvYyhOVUxMKQ0KLSAgICAsIG1fcFN0cmVhbShOVUxMKQ0KLSAgICAsIG1fcEZhY3RvcnkocEZhY3RvcnkpDQotICAgICwgbV9lUGFja2V0SUQoWEZBX1hEUFBBQ0tFVF9VTktOT1dOKQ0KLSAgICAsIG1fcFJvb3ROb2RlKE5VTEwpDQotICAgICwgbV9iRG9jdW1lbnRQYXJzZXIoYkRvY3VtZW50UGFyc2VyKQ0KLXsNCitDWEZBX1NpbXBsZVBhcnNlcjo6Q1hGQV9TaW1wbGVQYXJzZXIoSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRG9jdW1lbnRQYXJzZXIpDQorICAgIDogbV9wWE1MUGFyc2VyKE5VTEwpLA0KKyAgICAgIG1fcFhNTERvYyhOVUxMKSwNCisgICAgICBtX3BTdHJlYW0oTlVMTCksDQorICAgICAgbV9wRmFjdG9yeShwRmFjdG9yeSksDQorICAgICAgbV9lUGFja2V0SUQoWEZBX1hEUFBBQ0tFVF9VTktOT1dOKSwNCisgICAgICBtX3BSb290Tm9kZShOVUxMKSwNCisgICAgICBtX2JEb2N1bWVudFBhcnNlcihiRG9jdW1lbnRQYXJzZXIpIHt9DQorQ1hGQV9TaW1wbGVQYXJzZXI6On5DWEZBX1NpbXBsZVBhcnNlcigpIHsNCisgIENsb3NlUGFyc2VyKCk7DQogfQ0KLUNYRkFfU2ltcGxlUGFyc2VyOjp+Q1hGQV9TaW1wbGVQYXJzZXIoKQ0KLXsNCi0gICAgQ2xvc2VQYXJzZXIoKTsNCit2b2lkIENYRkFfU2ltcGxlUGFyc2VyOjpTZXRGYWN0b3J5KElYRkFfT2JqRmFjdG9yeSogcEZhY3RvcnkpIHsNCisgIG1fcEZhY3RvcnkgPSBwRmFjdG9yeTsNCiB9DQotdm9pZCBDWEZBX1NpbXBsZVBhcnNlcjo6U2V0RmFjdG9yeShJWEZBX09iakZhY3RvcnkqIHBGYWN0b3J5KQ0KLXsNCi0gICAgbV9wRmFjdG9yeSA9IHBGYWN0b3J5Ow0KLX0NCi1zdGF0aWMgSUZERV9YTUxOb2RlKiBYRkFfRkRFRXh0ZW5zaW9uX0dldERvY3VtZW50Tm9kZShJRkRFX1hNTERvYyAqcFhNTERvYywgRlhfQk9PTCBiVmVyaWZ5V2VsbEZvcm1uZXNzID0gRkFMU0UpDQotew0KLSAgICBpZighcFhNTERvYykgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgSUZERV9YTUxOb2RlKiBwWE1MRmFrZVJvb3QgPSBwWE1MRG9jLT5HZXRSb290KCk7DQotICAgIGZvcihJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gcFhNTEZha2VSb290LT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MTm9kZTsgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCi0gICAgICAgIGlmKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgIGlmKGJWZXJpZnlXZWxsRm9ybW5lc3MpIHsNCi0gICAgICAgICAgICAgICAgZm9yKElGREVfWE1MTm9kZSogcE5leHROb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpOyBwTmV4dE5vZGU7IHBOZXh0Tm9kZSA9IHBOZXh0Tm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBOZXh0Tm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHBYTUxOb2RlOw0KLSAgICAgICAgfQ0KLSAgICB9DQorc3RhdGljIElGREVfWE1MTm9kZSogWEZBX0ZERUV4dGVuc2lvbl9HZXREb2N1bWVudE5vZGUoDQorICAgIElGREVfWE1MRG9jKiBwWE1MRG9jLA0KKyAgICBGWF9CT09MIGJWZXJpZnlXZWxsRm9ybW5lc3MgPSBGQUxTRSkgew0KKyAgaWYgKCFwWE1MRG9jKSB7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgSUZERV9YTUxOb2RlKiBwWE1MRmFrZVJvb3QgPSBwWE1MRG9jLT5HZXRSb290KCk7DQorICBmb3IgKElGREVfWE1MTm9kZSogcFhNTE5vZGUgPQ0KKyAgICAgICAgICAgcFhNTEZha2VSb290LT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICBwWE1MTm9kZTsgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgIGlmIChiVmVyaWZ5V2VsbEZvcm1uZXNzKSB7DQorICAgICAgICBmb3IgKElGREVfWE1MTm9kZSogcE5leHROb2RlID0NCisgICAgICAgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgcE5leHROb2RlOw0KKyAgICAgICAgICAgICBwTmV4dE5vZGUgPSBwTmV4dE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgIGlmIChwTmV4dE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBwWE1MTm9kZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQogfQ0KLWludDMyX3QgQ1hGQV9TaW1wbGVQYXJzZXI6OlN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkICpwU3RyZWFtLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkNCi17DQotICAgIENsb3NlUGFyc2VyKCk7DQotICAgIG1fcEZpbGVSZWFkID0gcFN0cmVhbTsNCi0gICAgbV9wU3RyZWFtID0gSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKHBTdHJlYW0sIEZYX1NUUkVBTUFDQ0VTU19SZWFkIHwgRlhfU1RSRUFNQUNDRVNTX1RleHQpOw0KLSAgICBpZiAobV9wU3RyZWFtID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RyZWFtRXJyOw0KLSAgICB9DQotICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gbV9wU3RyZWFtLT5HZXRDb2RlUGFnZSgpOw0KLSAgICBpZiAod0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2TEUgJiYgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2QkUgJiYgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjgpIHsNCi0gICAgICAgIG1fcFN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7DQotICAgIH0NCi0gICAgbV9wWE1MRG9jID0gSUZERV9YTUxEb2M6OkNyZWF0ZSgpOw0KLSAgICBpZiAobV9wWE1MRG9jID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KLSAgICB9DQotICAgIG1fcFhNTFBhcnNlciA9IEZYX05FVyBDWEZBX1hNTFBhcnNlcihtX3BYTUxEb2MtPkdldFJvb3QoKSwgbV9wU3RyZWFtKTsNCi0gICAgaWYgKG1fcFhNTFBhcnNlciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0YXR1c0VycjsNCi0gICAgfQ0KLSAgICBpZiAoIW1fcFhNTERvYy0+TG9hZFhNTChtX3BYTUxQYXJzZXIpKSB7DQotICAgICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0YXR1c0VycjsNCi0gICAgfQ0KLSAgICBtX2VQYWNrZXRJRCA9IGVQYWNrZXRJRDsNCi0gICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19SZWFkeTsNCitpbnQzMl90IENYRkFfU2ltcGxlUGFyc2VyOjpTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7DQorICBDbG9zZVBhcnNlcigpOw0KKyAgbV9wRmlsZVJlYWQgPSBwU3RyZWFtOw0KKyAgbV9wU3RyZWFtID0gSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKA0KKyAgICAgIHBTdHJlYW0sIEZYX1NUUkVBTUFDQ0VTU19SZWFkIHwgRlhfU1RSRUFNQUNDRVNTX1RleHQpOw0KKyAgaWYgKG1fcFN0cmVhbSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RyZWFtRXJyOw0KKyAgfQ0KKyAgRlhfV09SRCB3Q29kZVBhZ2UgPSBtX3BTdHJlYW0tPkdldENvZGVQYWdlKCk7DQorICBpZiAod0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2TEUgJiYgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2QkUgJiYNCisgICAgICB3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGOCkgew0KKyAgICBtX3BTdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOw0KKyAgfQ0KKyAgbV9wWE1MRG9jID0gSUZERV9YTUxEb2M6OkNyZWF0ZSgpOw0KKyAgaWYgKG1fcFhNTERvYyA9PSBOVUxMKSB7DQorICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KKyAgfQ0KKyAgbV9wWE1MUGFyc2VyID0gRlhfTkVXIENYRkFfWE1MUGFyc2VyKG1fcFhNTERvYy0+R2V0Um9vdCgpLCBtX3BTdHJlYW0pOw0KKyAgaWYgKG1fcFhNTFBhcnNlciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KKyAgfQ0KKyAgaWYgKCFtX3BYTUxEb2MtPkxvYWRYTUwobV9wWE1MUGFyc2VyKSkgew0KKyAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0YXR1c0VycjsNCisgIH0NCisgIG1fZVBhY2tldElEID0gZVBhY2tldElEOw0KKyAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19SZWFkeTsNCiB9DQotaW50MzJfdCBDWEZBX1NpbXBsZVBhcnNlcjo6RG9QYXJzZShJRlhfUGF1c2UgKnBQYXVzZSkNCi17DQotICAgIGlmIChtX3BYTUxEb2MgPT0gTlVMTCB8fCBtX2VQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX1VOS05PV04pIHsNCi0gICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KLSAgICB9DQotICAgIGludDMyX3QgaVJldCA9IG1fcFhNTERvYy0+RG9Mb2FkKHBQYXVzZSk7DQotICAgIGlmIChpUmV0IDwgMCkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQotICAgIH0NCi0gICAgaWYgKGlSZXQgPCAxMDApIHsNCi0gICAgICAgIHJldHVybiBpUmV0IC8gMjsNCi0gICAgfQ0KLSAgICBtX3BSb290Tm9kZSA9IFBhcnNlQXNYRFBQYWNrZXQoWEZBX0ZERUV4dGVuc2lvbl9HZXREb2N1bWVudE5vZGUobV9wWE1MRG9jKSwgbV9lUGFja2V0SUQpOw0KK2ludDMyX3QgQ1hGQV9TaW1wbGVQYXJzZXI6OkRvUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmIChtX3BYTUxEb2MgPT0gTlVMTCB8fCBtX2VQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX1VOS05PV04pIHsNCisgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICB9DQorICBpbnQzMl90IGlSZXQgPSBtX3BYTUxEb2MtPkRvTG9hZChwUGF1c2UpOw0KKyAgaWYgKGlSZXQgPCAwKSB7DQorICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyOw0KKyAgfQ0KKyAgaWYgKGlSZXQgPCAxMDApIHsNCisgICAgcmV0dXJuIGlSZXQgLyAyOw0KKyAgfQ0KKyAgbV9wUm9vdE5vZGUgPSBQYXJzZUFzWERQUGFja2V0KFhGQV9GREVFeHRlbnNpb25fR2V0RG9jdW1lbnROb2RlKG1fcFhNTERvYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lUGFja2V0SUQpOw0KKyAgbV9wWE1MRG9jLT5DbG9zZVhNTCgpOw0KKyAgaWYgKG1fcFN0cmVhbSkgew0KKyAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgbV9wU3RyZWFtID0gTlVMTDsNCisgIH0NCisgIGlmICghbV9wUm9vdE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICB9DQorICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX0RvbmU7DQorfQ0KK2ludDMyX3QgQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlWE1MRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSomIHBYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgQ2xvc2VQYXJzZXIoKTsNCisgIHBYTUxOb2RlID0gTlVMTDsNCisgIElGWF9TdHJlYW0qIHBTdHJlYW0gPSBYRkFfQ3JlYXRlV2lkZVRleHRSZWFkKHdzWE1MKTsNCisgIGlmICghcFN0cmVhbSkgew0KKyAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0cmVhbUVycjsNCisgIH0NCisgIG1fcFN0cmVhbSA9IHBTdHJlYW07DQorICBtX3BYTUxEb2MgPSBJRkRFX1hNTERvYzo6Q3JlYXRlKCk7DQorICBpZiAobV9wWE1MRG9jID09IE5VTEwpIHsNCisgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICB9DQorICBDWEZBX1hNTFBhcnNlciogcFBhcnNlciA9DQorICAgICAgRlhfTkVXIENYRkFfWE1MUGFyc2VyKG1fcFhNTERvYy0+R2V0Um9vdCgpLCBtX3BTdHJlYW0pOw0KKyAgaWYgKHBQYXJzZXIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0YXR1c0VycjsNCisgIH0NCisjaWZkZWYgX1hGQV9WRVJJRllfQ2hlY2tzdW1fDQorICBwUGFyc2VyLT5tX2R3Q2hlY2tTdGF0dXMgPSAweDAzOw0KKyNlbmRpZg0KKyAgaWYgKCFtX3BYTUxEb2MtPkxvYWRYTUwocFBhcnNlcikpIHsNCisgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICB9DQorICBpbnQzMl90IGlSZXQgPSBtX3BYTUxEb2MtPkRvTG9hZChwUGF1c2UpOw0KKyAgaWYgKGlSZXQgPCAwIHx8IGlSZXQgPj0gMTAwKSB7DQogICAgIG1fcFhNTERvYy0+Q2xvc2VYTUwoKTsNCi0gICAgaWYgKG1fcFN0cmVhbSkgew0KLSAgICAgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQotICAgICAgICBtX3BTdHJlYW0gPSBOVUxMOw0KLSAgICB9DQotICAgIGlmKCFtX3BSb290Tm9kZSkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQotICAgIH0NCi0gICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19Eb25lOw0KKyAgfQ0KKyAgaWYgKGlSZXQgPCAwKSB7DQorICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyOw0KKyAgfQ0KKyAgaWYgKGlSZXQgPCAxMDApIHsNCisgICAgcmV0dXJuIGlSZXQgLyAyOw0KKyAgfQ0KKyAgaWYgKG1fcFN0cmVhbSkgew0KKyAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgbV9wU3RyZWFtID0gTlVMTDsNCisgIH0NCisgIHBYTUxOb2RlID0gWEZBX0ZERUV4dGVuc2lvbl9HZXREb2N1bWVudE5vZGUobV9wWE1MRG9jKTsNCisgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfRG9uZTsNCiB9DQotaW50MzJfdCBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VYTUxEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1hNTCwgSUZERV9YTUxOb2RlKiAmcFhNTE5vZGUsIElGWF9QYXVzZSAqcFBhdXNlKQ0KLXsNCi0gICAgQ2xvc2VQYXJzZXIoKTsNCi0gICAgcFhNTE5vZGUgPSBOVUxMOw0KLSAgICBJRlhfU3RyZWFtKiBwU3RyZWFtID0gWEZBX0NyZWF0ZVdpZGVUZXh0UmVhZCh3c1hNTCk7DQotICAgIGlmICghcFN0cmVhbSkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdHJlYW1FcnI7DQotICAgIH0NCi0gICAgbV9wU3RyZWFtID0gcFN0cmVhbTsNCi0gICAgbV9wWE1MRG9jID0gSUZERV9YTUxEb2M6OkNyZWF0ZSgpOw0KLSAgICBpZiAobV9wWE1MRG9jID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KLSAgICB9DQotICAgIENYRkFfWE1MUGFyc2VyICpwUGFyc2VyID0gRlhfTkVXIENYRkFfWE1MUGFyc2VyKG1fcFhNTERvYy0+R2V0Um9vdCgpLCBtX3BTdHJlYW0pOw0KLSAgICBpZiAocFBhcnNlciA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0YXR1c0VycjsNCi0gICAgfQ0KLSNpZmRlZiBfWEZBX1ZFUklGWV9DaGVja3N1bV8NCi0gICAgcFBhcnNlci0+bV9kd0NoZWNrU3RhdHVzID0gMHgwMzsNCi0jZW5kaWYNCi0gICAgaWYgKCFtX3BYTUxEb2MtPkxvYWRYTUwocFBhcnNlcikpIHsNCi0gICAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KLSAgICB9DQotICAgIGludDMyX3QgaVJldCA9IG1fcFhNTERvYy0+RG9Mb2FkKHBQYXVzZSk7DQotICAgIGlmIChpUmV0IDwgMCB8fCBpUmV0ID49IDEwMCkgew0KLSAgICAgICAgbV9wWE1MRG9jLT5DbG9zZVhNTCgpOw0KLSAgICB9DQotICAgIGlmIChpUmV0IDwgMCkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQotICAgIH0NCi0gICAgaWYgKGlSZXQgPCAxMDApIHsNCi0gICAgICAgIHJldHVybiBpUmV0IC8gMjsNCi0gICAgfQ0KLSAgICBpZiAobV9wU3RyZWFtKSB7DQotICAgICAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcFN0cmVhbSA9IE5VTEw7DQotICAgIH0NCi0gICAgcFhNTE5vZGUgPSBYRkFfRkRFRXh0ZW5zaW9uX0dldERvY3VtZW50Tm9kZShtX3BYTUxEb2MpOw0KLSAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX0RvbmU7DQotfQ0KLXZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OkNvbnN0cnVjdFhGQU5vZGUoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSkNCi17DQotICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEID0gKFhGQV9YRFBQQUNLRVQpcFhGQU5vZGUtPkdldFBhY2tldElEKCk7DQotICAgIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgew0KLSAgICAgICAgaWYgKHBYRkFOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlKSB7DQotICAgICAgICAgICAgZm9yIChJRkRFX1hNTE5vZGUgKnBYTUxDaGlsZCA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MQ2hpbGQ7IHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICAgICAgRkRFX1hNTE5PREVUWVBFIGVOb2RlVHlwZSA9IHBYTUxDaGlsZC0+R2V0VHlwZSgpOw0KLSAgICAgICAgICAgICAgICBpZihlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwWEZBQ2hpbGQgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFhGQUNoaWxkID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05vZGVTdHI7DQotICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkKS0+R2V0TG9jYWxUYWdOYW1lKHdzTm9kZVN0cik7DQotICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOb2RlU3RyKTsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hpbGRWYWx1ZTsNCi0jaWZkZWYgWEZBX1BBUlNFX0hBU19MSU5FSURFTlRJRklFUg0KLSAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzQ2hpbGRWYWx1ZSk7DQotI2Vsc2UNCi0gICAgICAgICAgICAgICAgICAgIFhGQV9Db252ZXJ0UmljaFRleHRUb1BsYWluVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzQ2hpbGRWYWx1ZSk7DQotI2VuZGlmDQotICAgICAgICAgICAgICAgICAgICBpZiAoIXdzQ2hpbGRWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ2hpbGRWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTENoaWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG1fcFJvb3ROb2RlID0gcFhGQU5vZGU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG1fcFJvb3ROb2RlID0gRGF0YUxvYWRlcihwWEZBTm9kZSwgcFhNTE5vZGUsIFRSVUUpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKHBYRkFOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGUpIHsNCi0gICAgICAgICAgICBQYXJzZUNvbnRlbnROb2RlKHBYRkFOb2RlLCBwWE1MTm9kZSwgZVBhY2tldElEKTsNCi0gICAgICAgICAgICBtX3BSb290Tm9kZSA9IHBYRkFOb2RlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX3BSb290Tm9kZSA9IE5vcm1hbExvYWRlcihwWEZBTm9kZSwgcFhNTE5vZGUsIGVQYWNrZXRJRCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQotRlhfQk9PTCBYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIoSUZERV9YTUxFbGVtZW50KiBwTm9kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1F1YWxpZmllciwgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKQ0KLXsNCi0gICAgaWYoIXBOb2RlKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgSUZERV9YTUxOb2RlKiBwRmFrZVJvb3QgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpSb290KTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOU0F0dHJpYnV0ZTsNCi0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQotICAgIGlmKHdzUXVhbGlmaWVyLklzRW1wdHkoKSkgew0KLSAgICAgICAgd3NOU0F0dHJpYnV0ZSA9IEZYX1dTVFJDKEwieG1sbnMiKTsNCi0gICAgICAgIGJSZXQgPSBUUlVFOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgd3NOU0F0dHJpYnV0ZSA9IEZYX1dTVFJDKEwieG1sbnM6IikgKyB3c1F1YWxpZmllcjsNCi0gICAgfQ0KLSAgICBmb3IoOyBwTm9kZSAhPSBwRmFrZVJvb3Q7IHBOb2RlID0gKElGREVfWE1MRWxlbWVudCopcE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KSkgew0KLSAgICAgICAgaWYocE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZihwTm9kZS0+SGFzQXR0cmlidXRlKHdzTlNBdHRyaWJ1dGUpKSB7DQotICAgICAgICAgICAgcE5vZGUtPkdldFN0cmluZyh3c05TQXR0cmlidXRlLCB3c05hbWVzcGFjZVVSSSk7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgd3NOYW1lc3BhY2VVUkkuRW1wdHkoKTsNCi0gICAgcmV0dXJuIGJSZXQ7DQotfQ0KLXN0YXRpYyBpbmxpbmUgdm9pZCBYRkFfRkRFRXh0ZW5zaW9uX0dldEVsZW1lbnRUYWdOYW1lc3BhY2VVUkkoSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCwgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOb2RlU3RyOw0KLSAgICBwRWxlbWVudC0+R2V0TmFtZXNwYWNlUHJlZml4KHdzTm9kZVN0cik7DQotICAgIGlmKCFYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIocEVsZW1lbnQsIHdzTm9kZVN0ciwgd3NOYW1lc3BhY2VVUkkpKSB7DQotICAgICAgICB3c05hbWVzcGFjZVVSSS5FbXB0eSgpOw0KLSAgICB9DQotfQ0KLXN0YXRpYyBGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShJRkRFX1hNTE5vZGUqIHBOb2RlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTG9jYWxUYWdOYW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZXNwYWNlVVJJUHJlZml4LCBGWF9EV09SRCBlTWF0Y2hGbGFncyA9IFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCkNCi17DQotICAgIGlmKCFwTm9kZSB8fCBwTm9kZS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0gcmVpbnRlcnByZXRfY2FzdDxJRkRFX1hNTEVsZW1lbnQqPihwTm9kZSk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTm9kZVN0cjsNCi0gICAgcEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c05vZGVTdHIpOw0KLSAgICBpZih3c05vZGVTdHIgIT0gd3NMb2NhbFRhZ05hbWUpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBYRkFfRkRFRXh0ZW5zaW9uX0dldEVsZW1lbnRUYWdOYW1lc3BhY2VVUkkocEVsZW1lbnQsIHdzTm9kZVN0cik7DQotICAgIGlmIChlTWF0Y2hGbGFncyAmIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCkgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgaWYoZU1hdGNoRmxhZ3MgJiBYRkFfWERQUEFDS0VUX0ZMQUdTX1BSRUZJWE1BVENIKSB7DQotICAgICAgICByZXR1cm4gd3NOb2RlU3RyLkxlZnQod3NOYW1lc3BhY2VVUklQcmVmaXguR2V0TGVuZ3RoKCkpID09IHdzTmFtZXNwYWNlVVJJUHJlZml4Ow0KLSAgICB9DQotICAgIHJldHVybiB3c05vZGVTdHIgPT0gd3NOYW1lc3BhY2VVUklQcmVmaXg7DQotfQ0KLXN0YXRpYyBGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fR2V0QXR0cmlidXRlTG9jYWxOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyaWJ1dGVOYW1lLCBDRlhfV2lkZVN0cmluZyYgd3NMb2NhbEF0dHJOYW1lKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZSh3c0F0dHJpYnV0ZU5hbWUpOw0KLSAgICBGWF9TVFJTSVpFIGlGaW5kID0gd3NBdHRyTmFtZS5GaW5kKEwnOicsIDApOw0KLSAgICBpZiAoaUZpbmQgPCAwKSB7DQotICAgICAgICB3c0xvY2FsQXR0ck5hbWUgPSB3c0F0dHJOYW1lOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgd3NMb2NhbEF0dHJOYW1lID0gd3NBdHRyTmFtZS5SaWdodCh3c0F0dHJOYW1lLkdldExlbmd0aCgpIC0gaUZpbmQgLSAxKTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotfQ0KLXN0YXRpYyBGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZUF0dHJpYnV0ZShJRkRFX1hNTEVsZW1lbnQgKnBFbGVtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cmlidXRlTmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxBdHRyTmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZSh3c0F0dHJpYnV0ZU5hbWUpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c05TUHJlZml4Ow0KLSAgICBpZihYRkFfRkRFRXh0ZW5zaW9uX0dldEF0dHJpYnV0ZUxvY2FsTmFtZSh3c0F0dHJpYnV0ZU5hbWUsIHdzTG9jYWxBdHRyTmFtZSkpIHsNCi0gICAgICAgIHdzTlNQcmVmaXggPSB3c0F0dHJOYW1lLkxlZnQod3NBdHRyaWJ1dGVOYW1lLkdldExlbmd0aCgpIC0gd3NMb2NhbEF0dHJOYW1lLkdldExlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0gICAgaWYod3NMb2NhbEF0dHJOYW1lID09IEZYX1dTVFJDKEwieG1sbnMiKSB8fCB3c05TUHJlZml4ID09IEZYX1dTVFJDKEwieG1sbnMiKSB8fCB3c05TUHJlZml4ID09IEZYX1dTVFJDKEwieG1sIikpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZighWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlTmFtZXNwYWNlUXVhbGlmaWVyKHBFbGVtZW50LCB3c05TUHJlZml4LCB3c05hbWVzcGFjZVVSSSkpIHsNCi0gICAgICAgIHdzTmFtZXNwYWNlVVJJLkVtcHR5KCk7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLXN0YXRpYyBGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fRmluZEF0dHJpYnV0ZVdpdGhOUyhJRkRFX1hNTEVsZW1lbnQgKnBFbGVtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTG9jYWxBdHRyaWJ1dGVOYW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZXNwYWNlVVJJUHJlZml4LCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgRlhfQk9PTCBiTWF0Y2hOU0FzUHJlZml4ID0gRkFMU0UpDQotew0KLSAgICBpZighcEVsZW1lbnQpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJOYW1lOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJWYWx1ZTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTlM7DQotICAgIGZvcihpbnQzMl90IGlBdHRyQ291bnQgPSBwRWxlbWVudC0+Q291bnRBdHRyaWJ1dGVzKCksIGkgPSAwOyBpIDwgaUF0dHJDb3VudDsgaSArKykgew0KLSAgICAgICAgcEVsZW1lbnQtPkdldEF0dHJpYnV0ZShpLCB3c0F0dHJOYW1lLCB3c0F0dHJWYWx1ZSk7DQotICAgICAgICBGWF9TVFJTSVpFIGlGaW5kID0gd3NBdHRyTmFtZS5GaW5kKEwnOicsIDApOw0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOU1ByZWZpeDsNCi0gICAgICAgIGlmIChpRmluZCA8IDApIHsNCi0gICAgICAgICAgICBpZih3c0xvY2FsQXR0cmlidXRlTmFtZSAhPSB3c0F0dHJOYW1lKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYod3NMb2NhbEF0dHJpYnV0ZU5hbWUgIT0gd3NBdHRyTmFtZS5SaWdodCh3c0F0dHJOYW1lLkdldExlbmd0aCgpIC0gaUZpbmQgLSAxKSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NOU1ByZWZpeCA9IHdzQXR0ck5hbWUuTGVmdChpRmluZCk7DQotICAgICAgICB9DQotICAgICAgICBpZighWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlTmFtZXNwYWNlUXVhbGlmaWVyKHBFbGVtZW50LCB3c05TUHJlZml4LCB3c0F0dHJOUykpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGJNYXRjaE5TQXNQcmVmaXgpIHsNCi0gICAgICAgICAgICBpZih3c0F0dHJOUy5MZWZ0KHdzTmFtZXNwYWNlVVJJUHJlZml4LkdldExlbmd0aCgpKSAhPSB3c05hbWVzcGFjZVVSSVByZWZpeCkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmKHdzQXR0ck5TICE9IHdzTmFtZXNwYWNlVVJJUHJlZml4KSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHdzVmFsdWUgPSB3c0F0dHJWYWx1ZTsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldChJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KLXsNCi0gICAgc3dpdGNoKGVQYWNrZXRJRCkgew0KLSAgICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX1VOS05PV046DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfWERQOg0KLSAgICAgICAgICAgIHJldHVybiBQYXJzZUFzWERQUGFja2V0X1hEUChwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpOw0KLSAgICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX0NvbmZpZzoNCi0gICAgICAgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9Db25maWcocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsNCi0gICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZToNCi0gICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Gb3JtOg0KLSAgICAgICAgICAgIHJldHVybiBQYXJzZUFzWERQUGFja2V0X1RlbXBsYXRlRm9ybShwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpOw0KLSAgICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzOg0KLSAgICAgICAgICAgIHJldHVybiBQYXJzZUFzWERQUGFja2V0X0RhdGEocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsNCi0gICAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9YZGM6DQotICAgICAgICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfWGRjKHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7DQotICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0Og0KLSAgICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQ6DQotICAgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0Og0KLSAgICAgICAgICAgIHJldHVybiBQYXJzZUFzWERQUGFja2V0X0xvY2FsZUNvbm5lY3Rpb25Tb3VyY2VTZXQocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfVXNlcihwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X1hEUChJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KLXsNCi0gICAgaWYoIVhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShwWE1MRG9jdW1lbnROb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPnBOYW1lLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPnBVUkksIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWERQKS0+ZUZsYWdzKSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwWEZBUm9vdE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfRUxFTUVOVF9YZmEpOw0KLSAgICBpZighcFhGQVJvb3ROb2RlKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBtX3BSb290Tm9kZSA9IHBYRkFSb290Tm9kZTsNCi0gICAgcFhGQVJvb3ROb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwieGZhIikpOw0KLSAgICB7DQotICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTERvY3VtZW50Tm9kZTsNCi0gICAgICAgIGludDMyX3QgaUF0dHJpYnV0ZUNvdW50ID0gcEVsZW1lbnQtPkNvdW50QXR0cmlidXRlcygpOw0KLSAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBpQXR0cmlidXRlQ291bnQ7IGkrKykgew0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmlOYW1lLCB3c0F0dHJpVmFsdWU7DQotICAgICAgICAgICAgcEVsZW1lbnQtPkdldEF0dHJpYnV0ZShpLCB3c0F0dHJpTmFtZSwgd3NBdHRyaVZhbHVlKTsNCi0gICAgICAgICAgICBpZih3c0F0dHJpTmFtZSA9PSBGWF9XU1RSQyhMInV1aWQiKSkgew0KLSAgICAgICAgICAgICAgICBwWEZBUm9vdE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVXVpZCwgd3NBdHRyaVZhbHVlKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYod3NBdHRyaU5hbWUgPT0gRlhfV1NUUkMoTCJ0aW1lU3RhbXAiKSkgew0KLSAgICAgICAgICAgICAgICBwWEZBUm9vdE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVGltZVN0YW1wLCB3c0F0dHJpVmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBJRkRFX1hNTE5vZGUqIHBYTUxDb25maWdET01Sb290ID0gTlVMTDsNCi0gICAgQ1hGQV9Ob2RlKiBwWEZBQ29uZmlnRE9NUm9vdCA9IE5VTEw7DQotICAgIHsNCi0gICAgICAgIGZvciAoSUZERV9YTUxOb2RlKiBwQ2hpbGRJdGVtID0gcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcENoaWxkSXRlbTsgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldEluZm8gPSBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyk7DQotICAgICAgICAgICAgaWYoIVhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShwQ2hpbGRJdGVtLCBwUGFja2V0SW5mby0+cE5hbWUsIHBQYWNrZXRJbmZvLT5wVVJJLCBwUGFja2V0SW5mby0+ZUZsYWdzKSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKENYRkFfTm9kZSAqIHBDaGlsZE5vZGUgPSBwWEZBUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUocFBhY2tldEluZm8tPnVIYXNoKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcFhNTENvbmZpZ0RPTVJvb3QgPSBwQ2hpbGRJdGVtOw0KLSAgICAgICAgICAgIHBYRkFDb25maWdET01Sb290ID0gUGFyc2VBc1hEUFBhY2tldF9Db25maWcocFhNTENvbmZpZ0RPTVJvb3QsIFhGQV9YRFBQQUNLRVRfQ29uZmlnKTsNCi0gICAgICAgICAgICBwWEZBUm9vdE5vZGUtPkluc2VydENoaWxkKHBYRkFDb25maWdET01Sb290LCBOVUxMKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBJRkRFX1hNTE5vZGUqIHBYTUxEYXRhc2V0c0RPTVJvb3QgPSBOVUxMOw0KLSAgICBJRkRFX1hNTE5vZGUqIHBYTUxGb3JtRE9NUm9vdCA9IE5VTEw7DQotICAgIHsNCi0gICAgICAgIGZvciAoSUZERV9YTUxOb2RlKiBwQ2hpbGRJdGVtID0gcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcENoaWxkSXRlbTsgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgaWYoIXBDaGlsZEl0ZW0gfHwgcENoaWxkSXRlbS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKHBDaGlsZEl0ZW0gPT0gcFhNTENvbmZpZ0RPTVJvb3QpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPSByZWludGVycHJldF9jYXN0PElGREVfWE1MRWxlbWVudCo+KHBDaGlsZEl0ZW0pOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGFja2V0TmFtZTsNCi0gICAgICAgICAgICBwRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzUGFja2V0TmFtZSk7DQotICAgICAgICAgICAgWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldEluZm8gPSBYRkFfR2V0UGFja2V0QnlOYW1lKHdzUGFja2V0TmFtZSk7DQotICAgICAgICAgICAgaWYgKHBQYWNrZXRJbmZvICYmIHBQYWNrZXRJbmZvLT5wVVJJKSB7DQotICAgICAgICAgICAgICAgIGlmKCFYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUocEVsZW1lbnQsIHBQYWNrZXRJbmZvLT5wTmFtZSwgcFBhY2tldEluZm8tPnBVUkksIHBQYWNrZXRJbmZvLT5lRmxhZ3MpKSB7DQotICAgICAgICAgICAgICAgICAgICBwUGFja2V0SW5mbyA9IE5VTEw7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0ID0gcFBhY2tldEluZm8gPyBwUGFja2V0SW5mby0+ZU5hbWUgOiBYRkFfWERQUEFDS0VUX1VTRVI7DQotICAgICAgICAgICAgaWYoZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX1hEUCkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQotICAgICAgICAgICAgICAgIGlmIChwWE1MRGF0YXNldHNET01Sb290KSB7DQotICAgICAgICAgICAgICAgICAgICBwWE1MRGF0YXNldHNET01Sb290ID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBYTUxEYXRhc2V0c0RPTVJvb3QgPSBwRWxlbWVudDsNCi0gICAgICAgICAgICB9IGVsc2UgaWYoZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCi0gICAgICAgICAgICAgICAgaWYgKHBYTUxGb3JtRE9NUm9vdCkgew0KLSAgICAgICAgICAgICAgICAgICAgcFhNTEZvcm1ET01Sb290ID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBYTUxGb3JtRE9NUm9vdCA9IHBFbGVtZW50Ow0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhY2tldE5vZGUgPSBQYXJzZUFzWERQUGFja2V0KHBFbGVtZW50LCBlUGFja2V0KTsNCi0gICAgICAgICAgICAgICAgaWYocFBhY2tldE5vZGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwUGFja2V0SW5mbyAmJiAocFBhY2tldEluZm8tPmVGbGFncyAmIFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORSkgJiYgcFhGQVJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKHBQYWNrZXRJbmZvLT51SGFzaCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHBYRkFSb290Tm9kZS0+SW5zZXJ0Q2hpbGQocFBhY2tldE5vZGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmKHBYTUxEYXRhc2V0c0RPTVJvb3QpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcFBhY2tldE5vZGUgPSBQYXJzZUFzWERQUGFja2V0KHBYTUxEYXRhc2V0c0RPTVJvb3QsIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpOw0KLSAgICAgICAgaWYgKHBQYWNrZXROb2RlKSB7DQotICAgICAgICAgICAgcFhGQVJvb3ROb2RlLT5JbnNlcnRDaGlsZChwUGFja2V0Tm9kZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYocFhNTEZvcm1ET01Sb290KSB7DQotICAgICAgICBDWEZBX05vZGUqIHBQYWNrZXROb2RlID0gUGFyc2VBc1hEUFBhY2tldChwWE1MRm9ybURPTVJvb3QsIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQotICAgICAgICBpZiAocFBhY2tldE5vZGUpIHsNCi0gICAgICAgICAgICBwWEZBUm9vdE5vZGUtPkluc2VydENoaWxkKHBQYWNrZXROb2RlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwWEZBUm9vdE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KLSAgICByZXR1cm4gcFhGQVJvb3ROb2RlOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X0NvbmZpZyhJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KLXsNCi0gICAgaWYoIVhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShwWE1MRG9jdW1lbnROb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyktPnBOYW1lLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyktPnBVUkksIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29uZmlnKS0+ZUZsYWdzKSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9FTEVNRU5UX0NvbmZpZyk7DQotICAgIGlmKCFwTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Db25maWcpLT5wTmFtZSk7DQotICAgIGlmKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCkpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRG9jdW1lbnROb2RlKTsNCi0gICAgcmV0dXJuIHBOb2RlOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X1RlbXBsYXRlRm9ybShJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQotICAgIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSkgew0KLSAgICAgICAgaWYoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfVGVtcGxhdGUpLT5wTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9UZW1wbGF0ZSktPnBVUkksIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfVGVtcGxhdGUpLT5lRmxhZ3MpKSB7DQotICAgICAgICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUsIFhGQV9FTEVNRU5UX1RlbXBsYXRlKTsNCi0gICAgICAgICAgICBpZighcE5vZGUpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfVGVtcGxhdGUpLT5wTmFtZSk7DQotICAgICAgICAgICAgaWYobV9iRG9jdW1lbnRQYXJzZXIpIHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkk7DQotICAgICAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTERvY3VtZW50RWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEb2N1bWVudE5vZGU7DQotICAgICAgICAgICAgICAgIHBYTUxEb2N1bWVudEVsZW1lbnQtPkdldE5hbWVzcGFjZVVSSSh3c05hbWVzcGFjZVVSSSk7DQotICAgICAgICAgICAgICAgIGlmICh3c05hbWVzcGFjZVVSSS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBYTUxEb2N1bWVudEVsZW1lbnQtPkdldFN0cmluZyhMInhtbG5zOnhmYSIsIHdzTmFtZXNwYWNlVVJJKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwTm9kZS0+R2V0RG9jdW1lbnQoKS0+UmVjb2duaXplWEZBVmVyc2lvbk51bWJlcih3c05hbWVzcGFjZVVSSSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCi0gICAgICAgIGlmKFhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShwWE1MRG9jdW1lbnROb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0Zvcm0pLT5wTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Gb3JtKS0+cFVSSSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Gb3JtKS0+ZUZsYWdzKSkgew0KLSAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTERvY3VtZW50RWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEb2N1bWVudE5vZGU7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGVja3N1bTsNCi0gICAgICAgICAgICBwWE1MRG9jdW1lbnRFbGVtZW50LT5HZXRTdHJpbmcoTCJjaGVja3N1bSIsIHdzQ2hlY2tzdW0pOw0KLSNpZmRlZiBfWEZBX1ZFUklGWV9DaGVja3N1bV8NCi0gICAgICAgICAgICBpZiAod3NDaGVja3N1bS5HZXRMZW5ndGgoKSAhPSAyOCB8fCBtX3BYTUxQYXJzZXItPm1fZHdDaGVja1N0YXR1cyAhPSAweDAzKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBJWEZBX0NoZWNrc3VtQ29udGV4dCAqcENoZWNrc3VtID0gWEZBX0NoZWNrc3VtX0NyZWF0ZSgpOw0KLSAgICAgICAgICAgIHBDaGVja3N1bS0+U3RhcnRDaGVja3N1bSgpOw0KLSAgICAgICAgICAgIHBDaGVja3N1bS0+VXBkYXRlQ2hlY2tzdW0obV9wRmlsZVJlYWQsIG1fcFhNTFBhcnNlci0+bV9uU3RhcnRbMF0sIG1fcFhNTFBhcnNlci0+bV9uU2l6ZVswXSk7DQotICAgICAgICAgICAgcENoZWNrc3VtLT5VcGRhdGVDaGVja3N1bShtX3BGaWxlUmVhZCwgbV9wWE1MUGFyc2VyLT5tX25TdGFydFsxXSwgbV9wWE1MUGFyc2VyLT5tX25TaXplWzFdKTsNCi0gICAgICAgICAgICBwQ2hlY2tzdW0tPkZpbmlzaENoZWNrc3VtKCk7DQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDaGVjazsNCi0gICAgICAgICAgICBwQ2hlY2tzdW0tPkdldENoZWNrc3VtKGJzQ2hlY2spOw0KLSAgICAgICAgICAgIHBDaGVja3N1bS0+UmVsZWFzZSgpOw0KLSAgICAgICAgICAgIGlmIChic0NoZWNrICE9IHdzQ2hlY2tzdW0uVVRGOEVuY29kZSgpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0jZW5kaWYNCi0gICAgICAgICAgICBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfRUxFTUVOVF9Gb3JtKTsNCi0gICAgICAgICAgICBpZighcE5vZGUpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRm9ybSktPnBOYW1lKTsNCi0gICAgICAgICAgICBwTm9kZS0+U2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sIHdzQ2hlY2tzdW0pOw0KLSAgICAgICAgICAgIENYRkFfTm9kZSogcFRlbXBsYXRlUm9vdCA9IG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9UZW1wbGF0ZSk7DQotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaG9zZW4gPSBwVGVtcGxhdGVSb290ID8gcFRlbXBsYXRlUm9vdC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSkgOiBOVUxMOw0KLSAgICAgICAgICAgIEZYX0JPT0wgYlVzZUF0dHJpYnV0ZSA9IFRSVUU7DQotICAgICAgICAgICAgaWYgKHBUZW1wbGF0ZUNob3NlbiAmJiBwVGVtcGxhdGVDaG9zZW4tPkdldEVudW0oWEZBX0FUVFJJQlVURV9SZXN0b3JlU3RhdGUpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0F1dG8pIHsNCi0gICAgICAgICAgICAgICAgYlVzZUF0dHJpYnV0ZSA9IEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZighTm9ybWFsTG9hZGVyKHBOb2RlLCBwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQsIGJVc2VBdHRyaWJ1dGUpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAocE5vZGUpIHsNCi0gICAgICAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRG9jdW1lbnROb2RlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcE5vZGU7DQotfQ0KLXN0YXRpYyBJRkRFX1hNTE5vZGUqIFhGQV9HZXREYXRhU2V0c0Zyb21YRFAoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlKQ0KLXsNCi0gICAgaWYgKFhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShwWE1MRG9jdW1lbnROb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+cE5hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5wVVJJLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+ZUZsYWdzKSkgew0KLSAgICAgICAgcmV0dXJuIHBYTUxEb2N1bWVudE5vZGU7DQotICAgIH0NCi0gICAgaWYgKCFYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUocFhNTERvY3VtZW50Tm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5wTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5wVVJJLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPmVGbGFncykpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGZvcihJRkRFX1hNTE5vZGUqIHBEYXRhc2V0c05vZGUgPSBwWE1MRG9jdW1lbnROb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwRGF0YXNldHNOb2RlOyBwRGF0YXNldHNOb2RlID0gcERhdGFzZXRzTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCi0gICAgICAgIGlmKCFYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUocERhdGFzZXRzTm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPnBOYW1lLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+cFVSSSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPmVGbGFncykpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwRGF0YXNldHNOb2RlOw0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X0RhdGEoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkNCi17DQotICAgIElGREVfWE1MTm9kZSogcERhdGFzZXRzWE1MTm9kZSA9IFhGQV9HZXREYXRhU2V0c0Zyb21YRFAocFhNTERvY3VtZW50Tm9kZSk7DQotICAgIGlmKHBEYXRhc2V0c1hNTE5vZGUpIHsNCi0gICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFNb2RlbCk7DQotICAgICAgICBpZighcE5vZGUpIHsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5wTmFtZSk7DQotICAgICAgICBpZighRGF0YUxvYWRlcihwTm9kZSwgcERhdGFzZXRzWE1MTm9kZSwgRkFMU0UpKSB7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocERhdGFzZXRzWE1MTm9kZSk7DQotICAgICAgICByZXR1cm4gcE5vZGU7DQotICAgIH0NCi0gICAgSUZERV9YTUxOb2RlKiBwRGF0YVhNTE5vZGUgPSBOVUxMOw0KLSAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIEZYX1dTVFJDKEwiZGF0YSIpLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+cFVSSSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPmVGbGFncykpIHsNCi0gICAgICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MRG9jdW1lbnROb2RlKS0+UmVtb3ZlQXR0cmlidXRlKEwieG1sbnM6eGZhIik7DQotICAgICAgICBwRGF0YVhNTE5vZGUgPSBwWE1MRG9jdW1lbnROb2RlOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwRGF0YUVsZW1lbnQgPSBJRkRFX1hNTEVsZW1lbnQ6OkNyZWF0ZShGWF9XU1RSQyhMInhmYTpkYXRhIikpOw0KLSAgICAgICAgSUZERV9YTUxOb2RlKiBwUGFyZW50WE1MTm9kZSA9IHBYTUxEb2N1bWVudE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KTsNCi0gICAgICAgIGlmIChwUGFyZW50WE1MTm9kZSkgew0KLSAgICAgICAgICAgIHBQYXJlbnRYTUxOb2RlLT5SZW1vdmVDaGlsZE5vZGUocFhNTERvY3VtZW50Tm9kZSk7DQotICAgICAgICB9DQotICAgICAgICBGWFNZU19hc3NlcnQocFhNTERvY3VtZW50Tm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpOw0KLSAgICAgICAgaWYgKHBYTUxEb2N1bWVudE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEb2N1bWVudE5vZGUpLT5SZW1vdmVBdHRyaWJ1dGUoTCJ4bWxuczp4ZmEiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBEYXRhRWxlbWVudC0+SW5zZXJ0Q2hpbGROb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KLSAgICAgICAgcERhdGFYTUxOb2RlID0gcERhdGFFbGVtZW50Ow0KLSAgICB9DQotICAgIGlmKHBEYXRhWE1MTm9kZSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsNCi0gICAgICAgIGlmKCFwTm9kZSkgew0KLSAgICAgICAgICAgIGlmIChwRGF0YVhNTE5vZGUgIT0gcFhNTERvY3VtZW50Tm9kZSkgew0KLSAgICAgICAgICAgICAgICBwRGF0YVhNTE5vZGUtPlJlbGVhc2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xvY2FsTmFtZTsNCi0gICAgICAgICgoSUZERV9YTUxFbGVtZW50KilwRGF0YVhNTE5vZGUpLT5HZXRMb2NhbFRhZ05hbWUod3NMb2NhbE5hbWUpOw0KLSAgICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NMb2NhbE5hbWUpOw0KLSAgICAgICAgaWYoIURhdGFMb2FkZXIocE5vZGUsIHBEYXRhWE1MTm9kZSwgVFJVRSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwRGF0YVhNTE5vZGUpOw0KLSAgICAgICAgaWYgKHBEYXRhWE1MTm9kZSAhPSBwWE1MRG9jdW1lbnROb2RlKSB7DQotICAgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwTm9kZTsNCi0gICAgfQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldF9Mb2NhbGVDb25uZWN0aW9uU291cmNlU2V0KElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpDQotew0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCi0gICAgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCkgew0KLSAgICAgICAgaWYoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfTG9jYWxlU2V0KS0+cE5hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfTG9jYWxlU2V0KS0+cFVSSSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Mb2NhbGVTZXQpLT5lRmxhZ3MpKSB7DQotICAgICAgICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfRUxFTUVOVF9Mb2NhbGVTZXQpOw0KLSAgICAgICAgICAgIGlmKCFwTm9kZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Mb2NhbGVTZXQpLT5wTmFtZSk7DQotICAgICAgICAgICAgaWYoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0gZWxzZSBpZihlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0KSB7DQotICAgICAgICBpZihYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUocFhNTERvY3VtZW50Tm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Db25uZWN0aW9uU2V0KS0+cE5hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCktPnBVUkksIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCktPmVGbGFncykpIHsNCi0gICAgICAgICAgICBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfRUxFTUVOVF9Db25uZWN0aW9uU2V0KTsNCi0gICAgICAgICAgICBpZighcE5vZGUpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCktPnBOYW1lKTsNCi0gICAgICAgICAgICBpZighTm9ybWFsTG9hZGVyKHBOb2RlLCBwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIGlmKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCkgew0KLSAgICAgICAgaWYoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfU291cmNlU2V0KS0+cE5hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfU291cmNlU2V0KS0+cFVSSSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Tb3VyY2VTZXQpLT5lRmxhZ3MpKSB7DQotICAgICAgICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfRUxFTUVOVF9Tb3VyY2VTZXQpOw0KLSAgICAgICAgICAgIGlmKCFwTm9kZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Tb3VyY2VTZXQpLT5wTmFtZSk7DQotICAgICAgICAgICAgaWYoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKHBOb2RlKSB7DQotICAgICAgICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBOb2RlOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X1hkYyhJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KLXsNCi0gICAgaWYoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWGRjKS0+cE5hbWUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWGRjKS0+cFVSSSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YZGMpLT5lRmxhZ3MpKSB7DQotICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX1hkYywgWEZBX0VMRU1FTlRfWGRjKTsNCi0gICAgICAgIGlmKCFwTm9kZSkgew0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YZGMpLT5wTmFtZSk7DQotICAgICAgICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7DQotICAgICAgICByZXR1cm4gcE5vZGU7DQotICAgIH0NCi0gICAgcmV0dXJuIE5VTEw7DQotfQ0KLUNYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXRfVXNlcihJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9FTEVNRU5UX1BhY2tldCk7DQotICAgIGlmKCFwTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KLSAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTERvY3VtZW50Tm9kZSktPkdldExvY2FsVGFnTmFtZSh3c05hbWUpOw0KLSAgICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KLSAgICBpZighVXNlclBhY2tldExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSkpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRG9jdW1lbnROb2RlKTsNCi0gICAgcmV0dXJuIHBOb2RlOw0KLX0NCi1DWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpVc2VyUGFja2V0TG9hZGVyKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTERvYykNCi17DQotICAgIHJldHVybiBwWEZBTm9kZTsNCi19DQotc3RhdGljIEZYX0JPT0wgWEZBX0ZERUV4dGVuc2lvbl9Jc1N0cmluZ0FsbFdoaXRlc3BhY2UoQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0KQ0KLXsNCi0gICAgd3NUZXh0LlRyaW1SaWdodChMIlx4MjBceDlceERceEEiKTsNCi0gICAgcmV0dXJuIHdzVGV4dC5Jc0VtcHR5KCk7DQotfQ0KLUNYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OkRhdGFMb2FkZXIoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwgSUZERV9YTUxOb2RlKiBwWE1MRG9jLCBGWF9CT09MIGJEb1RyYW5zZm9ybSApDQotew0KLSAgICBQYXJzZURhdGFHcm91cChwWEZBTm9kZSwgcFhNTERvYywgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyk7DQotICAgIHJldHVybiBwWEZBTm9kZTsNCi19DQotQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6Tm9ybWFsTG9hZGVyKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTERvYywgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQsIEZYX0JPT0wgYlVzZUF0dHJpYnV0ZSkNCi17DQotICAgIEZYX0JPT0wgYk9uZU9mUHJvcGVydHlGb3VuZCA9IEZBTFNFOw0KLSAgICBmb3IgKElGREVfWE1MTm9kZSAqcFhNTENoaWxkID0gcFhNTERvYy0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcFhNTENoaWxkOyBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBzd2l0Y2ggKHBYTUxDaGlsZC0+R2V0VHlwZSgpKSB7DQotICAgICAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7DQotICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKnBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkOw0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWdOYW1lOw0KLSAgICAgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c1RhZ05hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtSW5mbyA9IFhGQV9HZXRFbGVtZW50QnlOYW1lKHdzVGFnTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICBpZighcEVsZW1JbmZvKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnR5SW5mbyA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChwWEZBTm9kZS0+R2V0Q2xhc3NJRCgpLCBwRWxlbUluZm8tPmVOYW1lLCBlUGFja2V0SUQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBQcm9wZXJ0eUluZm8gJiYgKChwUHJvcGVydHlJbmZvLT51RmxhZ3MgJiAoWEZBX1BST1BFUlRZRkxBR19PbmVPZiB8IFhGQV9QUk9QRVJUWUZMQUdfRGVmYXVsdE9uZU9mKSkgIT0gMCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk9uZU9mUHJvcGVydHlGb3VuZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgYk9uZU9mUHJvcGVydHlGb3VuZCA9IFRSVUU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBYRkFDaGlsZCA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoZVBhY2tldElELCBwRWxlbUluZm8tPmVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwWEZBQ2hpbGQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0NvbmZpZykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NUYWdOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgSXNOZWVkVmFsdWUgPSBUUlVFOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDAsIGNvdW50ID0gcFhNTEVsZW1lbnQtPkNvdW50QXR0cmlidXRlcygpOyBpIDwgY291bnQ7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0clF1YWxpZmllZE5hbWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwWE1MRWxlbWVudC0+R2V0QXR0cmlidXRlKGksIHdzQXR0clF1YWxpZmllZE5hbWUsIHdzQXR0clZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfRkRFRXh0ZW5zaW9uX0dldEF0dHJpYnV0ZUxvY2FsTmFtZSh3c0F0dHJRdWFsaWZpZWROYW1lLCB3c0F0dHJOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih3c0F0dHJOYW1lID09IEZYX1dTVFJDKEwibmlsIikgJiYgd3NBdHRyVmFsdWUgPT0gRlhfV1NUUkMoTCJ0cnVlIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOZWVkVmFsdWUgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gbHBBdHRySW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUod3NBdHRyTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWxwQXR0ckluZm8pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYlVzZUF0dHJpYnV0ZSAmJiBscEF0dHJJbmZvLT5lTmFtZSAhPSBYRkFfQVRUUklCVVRFX05hbWUgJiYgbHBBdHRySW5mby0+ZU5hbWUgIT0gWEZBX0FUVFJJQlVURV9TYXZlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldEF0dHJpYnV0ZShscEF0dHJJbmZvLT5lTmFtZSwgd3NBdHRyVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAocEVsZW1JbmZvLT5lTmFtZSA9PSBYRkFfRUxFTUVOVF9WYWxpZGF0ZSB8fCBwRWxlbUluZm8tPmVOYW1lID09IFhGQV9FTEVNRU5UX0xvY2FsZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9Db25maWcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VDb250ZW50Tm9kZShwWEZBQ2hpbGQsIHBYTUxFbGVtZW50LCBlUGFja2V0SUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbExvYWRlcihwWEZBQ2hpbGQsIHBYTUxFbGVtZW50LCBlUGFja2V0SUQsIGJVc2VBdHRyaWJ1dGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChwWEZBQ2hpbGQtPkdldE9iamVjdFR5cGUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGU6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZToNCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVDOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZVY6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKElzTmVlZFZhbHVlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUNvbnRlbnROb2RlKHBYRkFDaGlsZCwgcFhNTEVsZW1lbnQsIGVQYWNrZXRJRCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsTG9hZGVyKHBYRkFDaGlsZCwgcFhNTEVsZW1lbnQsIGVQYWNrZXRJRCwgYlVzZUF0dHJpYnV0ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb246DQotICAgICAgICAgICAgICAgIFBhcnNlSW5zdHJ1Y3Rpb24ocFhGQU5vZGUsIChJRkRFX1hNTEluc3RydWN0aW9uKilwWE1MQ2hpbGQsIGVQYWNrZXRJRCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBwWEZBTm9kZTsNCi19DQotRlhfQk9PTCBYRkFfUmVjb2duaXplUmljaFRleHQoSUZERV9YTUxFbGVtZW50KiBwUmljaFRleHRYTUxOb2RlKQ0KLXsNCi0gICAgaWYgKHBSaWNoVGV4dFhNTE5vZGUpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZXNwYWNlVVJJOw0KLSAgICAgICAgWEZBX0ZERUV4dGVuc2lvbl9HZXRFbGVtZW50VGFnTmFtZXNwYWNlVVJJKHBSaWNoVGV4dFhNTE5vZGUsIHdzTmFtZXNwYWNlVVJJKTsNCi0gICAgICAgIGlmICh3c05hbWVzcGFjZVVSSSA9PSBGWF9XU1RSQyhMImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiKSkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotY2xhc3MgUmljaFRleHROb2RlVmlzaXRvcg0KLXsNCi1wdWJsaWM6DQotICAgIHN0YXRpYyBpbmxpbmUgSUZERV9YTUxOb2RlKiBHZXRGaXJzdENoaWxkKElGREVfWE1MTm9kZSogcE5vZGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCi0gICAgfQ0KLSAgICBzdGF0aWMgaW5saW5lIElGREVfWE1MTm9kZSogR2V0TmV4dFNpYmxpbmcoSUZERV9YTUxOb2RlKiBwTm9kZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsNCi0gICAgfQ0KLSAgICBzdGF0aWMgaW5saW5lIElGREVfWE1MTm9kZSogR2V0UGFyZW50KElGREVfWE1MTm9kZSogcE5vZGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpOw0KLSAgICB9DQotfTsNCi0jaWZuZGVmIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCi12b2lkIFhGQV9Db252ZXJ0UmljaFRleHRUb1BsYWluVGV4dChJRkRFX1hNTEVsZW1lbnQqIHBSaWNoVGV4dFhNTE5vZGUsIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCi17DQotICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8SUZERV9YTUxOb2RlLCBSaWNoVGV4dE5vZGVWaXNpdG9yPiBzSXRlcmF0b3IocFJpY2hUZXh0WE1MTm9kZSk7DQotICAgIENGWF9XaWRlVGV4dEJ1ZiB3c1BsYWluVGV4dEJ1ZjsNCi0gICAgZm9yKElGREVfWE1MTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICBzd2l0Y2gocE5vZGUtPkdldFR5cGUoKSkgew0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTFRleHQqKXBOb2RlKS0+R2V0VGV4dCh3c1RleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NQbGFpblRleHRCdWYgPDwgd3NUZXh0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxDaGFyRGF0YSopcE5vZGUpLT5HZXRDaGFyRGF0YSh3c1RleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NQbGFpblRleHRCdWYgPDwgd3NUZXh0Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHdzT3V0cHV0ID0gd3NQbGFpblRleHRCdWYuR2V0V2lkZVN0cmluZygpOw0KLX0NCi0jZW5kaWYNCi12b2lkIFhGQV9Db252ZXJ0WE1MVG9QbGFpblRleHQoSUZERV9YTUxFbGVtZW50KiBwUm9vdFhNTE5vZGUsIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkNCi17DQotICAgIGZvciAoSUZERV9YTUxOb2RlICpwWE1MQ2hpbGQgPSBwUm9vdFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7IHBYTUxDaGlsZDsgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KLSNpZmRlZiBfREVCVUcNCi0gICAgICAgIEZERV9YTUxOT0RFVFlQRSBub2RlVHlwZSA9IHBYTUxDaGlsZC0+R2V0VHlwZSgpOw0KLSNlbmRpZg0KLSAgICAgICAgc3dpdGNoKHBYTUxDaGlsZC0+R2V0VHlwZSgpKSB7DQotICAgICAgICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHREYXRhOw0KLSAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxDaGlsZCktPkdldFRleHREYXRhKHdzVGV4dERhdGEpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NUZXh0RGF0YSArPSBGWF9XU1RSQyhMIlxuIik7DQotICAgICAgICAgICAgICAgICAgICB3c091dHB1dCArPSB3c1RleHREYXRhOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTFRleHQqKXBYTUxDaGlsZCktPkdldFRleHQod3NUZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX0lzU3RyaW5nQWxsV2hpdGVzcGFjZSh3c1RleHQpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NUZXh0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6IHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hhckRhdGE7DQotICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MQ2hhckRhdGEqKXBYTUxDaGlsZCktPkdldENoYXJEYXRhKHdzQ2hhckRhdGEpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFhGQV9GREVFeHRlbnNpb25fSXNTdHJpbmdBbGxXaGl0ZXNwYWNlKHdzQ2hhckRhdGEpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0ID0gd3NDaGFyRGF0YTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi12b2lkIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUNvbnRlbnROb2RlKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KLXsNCi0gICAgWEZBX0VMRU1FTlQgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJwdGV4dDsNCi0gICAgaWYgKHBYRkFOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb250ZW50VHlwZSA9IHBYRkFOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlKTsNCi0gICAgICAgIGlmICh3c0NvbnRlbnRUeXBlID09IEZYX1dTVFJDKEwidGV4dC9odG1sIikpIHsNCi0gICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTDsNCi0gICAgICAgIH0gZWxzZSBpZiAod3NDb250ZW50VHlwZSA9PSBGWF9XU1RSQyhMInRleHQveG1sIikpIHsNCi0gICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB4bWw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTCkgew0KLSAgICAgICAgcFhGQU5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxOb2RlKTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICBmb3IgKElGREVfWE1MTm9kZSAqcFhNTENoaWxkID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7IHBYTUxDaGlsZDsgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KK3ZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OkNvbnN0cnVjdFhGQU5vZGUoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUpIHsNCisgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEID0gKFhGQV9YRFBQQUNLRVQpcFhGQU5vZGUtPkdldFBhY2tldElEKCk7DQorICBpZiAoZVBhY2tldElEID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCisgICAgaWYgKHBYRkFOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlKSB7DQorICAgICAgZm9yIChJRkRFX1hNTE5vZGUqIHBYTUxDaGlsZCA9DQorICAgICAgICAgICAgICAgcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgICAgICBwWE1MQ2hpbGQ7DQorICAgICAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQogICAgICAgICBGREVfWE1MTk9ERVRZUEUgZU5vZGVUeXBlID0gcFhNTENoaWxkLT5HZXRUeXBlKCk7DQotICAgICAgICBpZihlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIGlmIChlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgY29udGludWU7DQogICAgICAgICB9DQotICAgICAgICBpZihlbGVtZW50ID09IFhGQV9FTEVNRU5UX1NoYXJweEhUTUwpIHsNCi0gICAgICAgICAgICBpZihlTm9kZVR5cGUgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKFhGQV9SZWNvZ25pemVSaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQpKSB7DQorICAgICAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwWEZBQ2hpbGQgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KKyAgICAgICAgICBpZiAocFhGQUNoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgIH0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOb2RlU3RyOw0KKyAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkKS0+R2V0TG9jYWxUYWdOYW1lKHdzTm9kZVN0cik7DQorICAgICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05vZGVTdHIpOw0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoaWxkVmFsdWU7DQogI2lmZGVmIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCi0gICAgICAgICAgICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzVmFsdWUpOw0KKyAgICAgICAgICBYRkFfR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KChJRkRFX1hNTEVsZW1lbnQqKXBYTUxDaGlsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0NoaWxkVmFsdWUpOw0KICNlbHNlDQotICAgICAgICAgICAgICAgIFhGQV9Db252ZXJ0UmljaFRleHRUb1BsYWluVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzVmFsdWUpOw0KKyAgICAgICAgICBYRkFfQ29udmVydFJpY2hUZXh0VG9QbGFpblRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NDaGlsZFZhbHVlKTsNCiAjZW5kaWYNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU2hhcnB4bWwpIHsNCi0gICAgICAgICAgICBpZihlTm9kZVR5cGUgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgWEZBX0NvbnZlcnRYTUxUb1BsYWluVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzVmFsdWUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZihlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX1RleHQpIHsNCi0gICAgICAgICAgICAgICAgKChJRkRFX1hNTFRleHQqKXBYTUxDaGlsZCktPkdldFRleHQod3NWYWx1ZSk7DQotICAgICAgICAgICAgfSBlbHNlIGlmKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9DaGFyRGF0YSkgew0KLSAgICAgICAgICAgICAgICAoKElGREVfWE1MQ2hhckRhdGEqKXBYTUxDaGlsZCktPkdldENoYXJEYXRhKHdzVmFsdWUpOw0KLSAgICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCF3c0NoaWxkVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NoaWxkVmFsdWUpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOw0KKyAgICAgICAgICBwWEZBQ2hpbGQtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxDaGlsZCk7DQorICAgICAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG1fcFJvb3ROb2RlID0gcFhGQU5vZGU7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9wUm9vdE5vZGUgPSBEYXRhTG9hZGVyKHBYRkFOb2RlLCBwWE1MTm9kZSwgVFJVRSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmIChwWEZBTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlKSB7DQorICAgICAgUGFyc2VDb250ZW50Tm9kZShwWEZBTm9kZSwgcFhNTE5vZGUsIGVQYWNrZXRJRCk7DQorICAgICAgbV9wUm9vdE5vZGUgPSBwWEZBTm9kZTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3BSb290Tm9kZSA9IE5vcm1hbExvYWRlcihwWEZBTm9kZSwgcFhNTE5vZGUsIGVQYWNrZXRJRCk7DQorICAgIH0NCisgIH0NCit9DQorRlhfQk9PTCBYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIoDQorICAgIElGREVfWE1MRWxlbWVudCogcE5vZGUsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NRdWFsaWZpZXIsDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZVVSSSkgew0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRkRFX1hNTE5vZGUqIHBGYWtlUm9vdCA9IHBOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlJvb3QpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOU0F0dHJpYnV0ZTsNCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgaWYgKHdzUXVhbGlmaWVyLklzRW1wdHkoKSkgew0KKyAgICB3c05TQXR0cmlidXRlID0gRlhfV1NUUkMoTCJ4bWxucyIpOw0KKyAgICBiUmV0ID0gVFJVRTsNCisgIH0gZWxzZSB7DQorICAgIHdzTlNBdHRyaWJ1dGUgPSBGWF9XU1RSQyhMInhtbG5zOiIpICsgd3NRdWFsaWZpZXI7DQorICB9DQorICBmb3IgKDsgcE5vZGUgIT0gcEZha2VSb290Ow0KKyAgICAgICBwTm9kZSA9IChJRkRFX1hNTEVsZW1lbnQqKXBOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCkpIHsNCisgICAgaWYgKHBOb2RlLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChwTm9kZS0+SGFzQXR0cmlidXRlKHdzTlNBdHRyaWJ1dGUpKSB7DQorICAgICAgcE5vZGUtPkdldFN0cmluZyh3c05TQXR0cmlidXRlLCB3c05hbWVzcGFjZVVSSSk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHdzTmFtZXNwYWNlVVJJLkVtcHR5KCk7DQorICByZXR1cm4gYlJldDsNCit9DQorc3RhdGljIGlubGluZSB2b2lkIFhGQV9GREVFeHRlbnNpb25fR2V0RWxlbWVudFRhZ05hbWVzcGFjZVVSSSgNCisgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCwNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c05vZGVTdHI7DQorICBwRWxlbWVudC0+R2V0TmFtZXNwYWNlUHJlZml4KHdzTm9kZVN0cik7DQorICBpZiAoIVhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZU5hbWVzcGFjZVF1YWxpZmllcihwRWxlbWVudCwgd3NOb2RlU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NOYW1lc3BhY2VVUkkpKSB7DQorICAgIHdzTmFtZXNwYWNlVVJJLkVtcHR5KCk7DQorICB9DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZSgNCisgICAgSUZERV9YTUxOb2RlKiBwTm9kZSwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xvY2FsVGFnTmFtZSwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWVzcGFjZVVSSVByZWZpeCwNCisgICAgRlhfRFdPUkQgZU1hdGNoRmxhZ3MgPSBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0gpIHsNCisgIGlmICghcE5vZGUgfHwgcE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPSByZWludGVycHJldF9jYXN0PElGREVfWE1MRWxlbWVudCo+KHBOb2RlKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzTm9kZVN0cjsNCisgIHBFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUod3NOb2RlU3RyKTsNCisgIGlmICh3c05vZGVTdHIgIT0gd3NMb2NhbFRhZ05hbWUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgWEZBX0ZERUV4dGVuc2lvbl9HZXRFbGVtZW50VGFnTmFtZXNwYWNlVVJJKHBFbGVtZW50LCB3c05vZGVTdHIpOw0KKyAgaWYgKGVNYXRjaEZsYWdzICYgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKGVNYXRjaEZsYWdzICYgWEZBX1hEUFBBQ0tFVF9GTEFHU19QUkVGSVhNQVRDSCkgew0KKyAgICByZXR1cm4gd3NOb2RlU3RyLkxlZnQod3NOYW1lc3BhY2VVUklQcmVmaXguR2V0TGVuZ3RoKCkpID09DQorICAgICAgICAgICB3c05hbWVzcGFjZVVSSVByZWZpeDsNCisgIH0NCisgIHJldHVybiB3c05vZGVTdHIgPT0gd3NOYW1lc3BhY2VVUklQcmVmaXg7DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fR2V0QXR0cmlidXRlTG9jYWxOYW1lKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cmlidXRlTmFtZSwNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxBdHRyTmFtZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZSh3c0F0dHJpYnV0ZU5hbWUpOw0KKyAgRlhfU1RSU0laRSBpRmluZCA9IHdzQXR0ck5hbWUuRmluZChMJzonLCAwKTsNCisgIGlmIChpRmluZCA8IDApIHsNCisgICAgd3NMb2NhbEF0dHJOYW1lID0gd3NBdHRyTmFtZTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfSBlbHNlIHsNCisgICAgd3NMb2NhbEF0dHJOYW1lID0gd3NBdHRyTmFtZS5SaWdodCh3c0F0dHJOYW1lLkdldExlbmd0aCgpIC0gaUZpbmQgLSAxKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZUF0dHJpYnV0ZSgNCisgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHJpYnV0ZU5hbWUsDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c0xvY2FsQXR0ck5hbWUsDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZVVSSSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZSh3c0F0dHJpYnV0ZU5hbWUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOU1ByZWZpeDsNCisgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX0dldEF0dHJpYnV0ZUxvY2FsTmFtZSh3c0F0dHJpYnV0ZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NMb2NhbEF0dHJOYW1lKSkgew0KKyAgICB3c05TUHJlZml4ID0gd3NBdHRyTmFtZS5MZWZ0KHdzQXR0cmlidXRlTmFtZS5HZXRMZW5ndGgoKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NMb2NhbEF0dHJOYW1lLkdldExlbmd0aCgpIC0gMSk7DQorICB9DQorICBpZiAod3NMb2NhbEF0dHJOYW1lID09IEZYX1dTVFJDKEwieG1sbnMiKSB8fA0KKyAgICAgIHdzTlNQcmVmaXggPT0gRlhfV1NUUkMoTCJ4bWxucyIpIHx8IHdzTlNQcmVmaXggPT0gRlhfV1NUUkMoTCJ4bWwiKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoIVhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZU5hbWVzcGFjZVF1YWxpZmllcihwRWxlbWVudCwgd3NOU1ByZWZpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTmFtZXNwYWNlVVJJKSkgew0KKyAgICB3c05hbWVzcGFjZVVSSS5FbXB0eSgpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0ZERUV4dGVuc2lvbl9GaW5kQXR0cmlidXRlV2l0aE5TKA0KKyAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50LA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTG9jYWxBdHRyaWJ1dGVOYW1lLA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZXNwYWNlVVJJUHJlZml4LA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgRlhfQk9PTCBiTWF0Y2hOU0FzUHJlZml4ID0gRkFMU0UpIHsNCisgIGlmICghcEVsZW1lbnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQXR0clZhbHVlOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTlM7DQorICBmb3IgKGludDMyX3QgaUF0dHJDb3VudCA9IHBFbGVtZW50LT5Db3VudEF0dHJpYnV0ZXMoKSwgaSA9IDA7IGkgPCBpQXR0ckNvdW50Ow0KKyAgICAgICBpKyspIHsNCisgICAgcEVsZW1lbnQtPkdldEF0dHJpYnV0ZShpLCB3c0F0dHJOYW1lLCB3c0F0dHJWYWx1ZSk7DQorICAgIEZYX1NUUlNJWkUgaUZpbmQgPSB3c0F0dHJOYW1lLkZpbmQoTCc6JywgMCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTlNQcmVmaXg7DQorICAgIGlmIChpRmluZCA8IDApIHsNCisgICAgICBpZiAod3NMb2NhbEF0dHJpYnV0ZU5hbWUgIT0gd3NBdHRyTmFtZSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmICh3c0xvY2FsQXR0cmlidXRlTmFtZSAhPQ0KKyAgICAgICAgICB3c0F0dHJOYW1lLlJpZ2h0KHdzQXR0ck5hbWUuR2V0TGVuZ3RoKCkgLSBpRmluZCAtIDEpKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgd3NOU1ByZWZpeCA9IHdzQXR0ck5hbWUuTGVmdChpRmluZCk7DQorICAgIH0NCisgICAgaWYgKCFYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIocEVsZW1lbnQsIHdzTlNQcmVmaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzQXR0ck5TKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChiTWF0Y2hOU0FzUHJlZml4KSB7DQorICAgICAgaWYgKHdzQXR0ck5TLkxlZnQod3NOYW1lc3BhY2VVUklQcmVmaXguR2V0TGVuZ3RoKCkpICE9DQorICAgICAgICAgIHdzTmFtZXNwYWNlVVJJUHJlZml4KSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKHdzQXR0ck5TICE9IHdzTmFtZXNwYWNlVVJJUHJlZml4KSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgd3NWYWx1ZSA9IHdzQXR0clZhbHVlOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldChJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgc3dpdGNoIChlUGFja2V0SUQpIHsNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX1VOS05PV046DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9YRFA6DQorICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfWERQKHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Db25maWc6DQorICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfQ29uZmlnKHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZToNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX0Zvcm06DQorICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfVGVtcGxhdGVGb3JtKHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czoNCisgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9EYXRhKHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9YZGM6DQorICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfWGRjKHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQ6DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0Og0KKyAgICBjYXNlIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0Og0KKyAgICAgIHJldHVybiBQYXJzZUFzWERQUGFja2V0X0xvY2FsZUNvbm5lY3Rpb25Tb3VyY2VTZXQocFhNTERvY3VtZW50Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVQYWNrZXRJRCk7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfVXNlcihwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXRfWERQKA0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7DQorICBpZiAoIVhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZSgNCisgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5wTmFtZSwNCisgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5wVVJJLA0KKyAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPmVGbGFncykpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDWEZBX05vZGUqIHBYRkFSb290Tm9kZSA9DQorICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX1hEUCwgWEZBX0VMRU1FTlRfWGZhKTsNCisgIGlmICghcFhGQVJvb3ROb2RlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgbV9wUm9vdE5vZGUgPSBwWEZBUm9vdE5vZGU7DQorICBwWEZBUm9vdE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgRlhfV1NUUkMoTCJ4ZmEiKSk7DQorICB7DQorICAgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MRG9jdW1lbnROb2RlOw0KKyAgICBpbnQzMl90IGlBdHRyaWJ1dGVDb3VudCA9IHBFbGVtZW50LT5Db3VudEF0dHJpYnV0ZXMoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUF0dHJpYnV0ZUNvdW50OyBpKyspIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJpTmFtZSwgd3NBdHRyaVZhbHVlOw0KKyAgICAgIHBFbGVtZW50LT5HZXRBdHRyaWJ1dGUoaSwgd3NBdHRyaU5hbWUsIHdzQXR0cmlWYWx1ZSk7DQorICAgICAgaWYgKHdzQXR0cmlOYW1lID09IEZYX1dTVFJDKEwidXVpZCIpKSB7DQorICAgICAgICBwWEZBUm9vdE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVXVpZCwgd3NBdHRyaVZhbHVlKTsNCisgICAgICB9IGVsc2UgaWYgKHdzQXR0cmlOYW1lID09IEZYX1dTVFJDKEwidGltZVN0YW1wIikpIHsNCisgICAgICAgIHBYRkFSb290Tm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9UaW1lU3RhbXAsIHdzQXR0cmlWYWx1ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBJRkRFX1hNTE5vZGUqIHBYTUxDb25maWdET01Sb290ID0gTlVMTDsNCisgIENYRkFfTm9kZSogcFhGQUNvbmZpZ0RPTVJvb3QgPSBOVUxMOw0KKyAgew0KKyAgICBmb3IgKElGREVfWE1MTm9kZSogcENoaWxkSXRlbSA9DQorICAgICAgICAgICAgIHBYTUxEb2N1bWVudE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgICAgcENoaWxkSXRlbTsNCisgICAgICAgICBwQ2hpbGRJdGVtID0gcENoaWxkSXRlbS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICBYRkFfTFBDUEFDS0VUSU5GTyBwUGFja2V0SW5mbyA9IFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29uZmlnKTsNCisgICAgICBpZiAoIVhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShwQ2hpbGRJdGVtLCBwUGFja2V0SW5mby0+cE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldEluZm8tPnBVUkksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldEluZm8tPmVGbGFncykpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0NCisgICAgICAgICAgICAgIHBYRkFSb290Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShwUGFja2V0SW5mby0+dUhhc2gpKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgcFhNTENvbmZpZ0RPTVJvb3QgPSBwQ2hpbGRJdGVtOw0KKyAgICAgIHBYRkFDb25maWdET01Sb290ID0NCisgICAgICAgICAgUGFyc2VBc1hEUFBhY2tldF9Db25maWcocFhNTENvbmZpZ0RPTVJvb3QsIFhGQV9YRFBQQUNLRVRfQ29uZmlnKTsNCisgICAgICBwWEZBUm9vdE5vZGUtPkluc2VydENoaWxkKHBYRkFDb25maWdET01Sb290LCBOVUxMKTsNCisgICAgfQ0KKyAgfQ0KKyAgSUZERV9YTUxOb2RlKiBwWE1MRGF0YXNldHNET01Sb290ID0gTlVMTDsNCisgIElGREVfWE1MTm9kZSogcFhNTEZvcm1ET01Sb290ID0gTlVMTDsNCisgIHsNCisgICAgZm9yIChJRkRFX1hNTE5vZGUqIHBDaGlsZEl0ZW0gPQ0KKyAgICAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICAgIHBDaGlsZEl0ZW07DQorICAgICAgICAgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgICAgaWYgKCFwQ2hpbGRJdGVtIHx8IHBDaGlsZEl0ZW0tPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKHBDaGlsZEl0ZW0gPT0gcFhNTENvbmZpZ0RPTVJvb3QpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0NCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxJRkRFX1hNTEVsZW1lbnQqPihwQ2hpbGRJdGVtKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1BhY2tldE5hbWU7DQorICAgICAgcEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c1BhY2tldE5hbWUpOw0KKyAgICAgIFhGQV9MUENQQUNLRVRJTkZPIHBQYWNrZXRJbmZvID0gWEZBX0dldFBhY2tldEJ5TmFtZSh3c1BhY2tldE5hbWUpOw0KKyAgICAgIGlmIChwUGFja2V0SW5mbyAmJiBwUGFja2V0SW5mby0+cFVSSSkgew0KKyAgICAgICAgaWYgKCFYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUocEVsZW1lbnQsIHBQYWNrZXRJbmZvLT5wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWNrZXRJbmZvLT5wVVJJLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldEluZm8tPmVGbGFncykpIHsNCisgICAgICAgICAgcFBhY2tldEluZm8gPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXQgPQ0KKyAgICAgICAgICBwUGFja2V0SW5mbyA/IHBQYWNrZXRJbmZvLT5lTmFtZSA6IFhGQV9YRFBQQUNLRVRfVVNFUjsNCisgICAgICBpZiAoZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX1hEUCkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChlUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCisgICAgICAgIGlmIChwWE1MRGF0YXNldHNET01Sb290KSB7DQorICAgICAgICAgIHBYTUxEYXRhc2V0c0RPTVJvb3QgPSBOVUxMOw0KKyAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHBYTUxEYXRhc2V0c0RPTVJvb3QgPSBwRWxlbWVudDsNCisgICAgICB9IGVsc2UgaWYgKGVQYWNrZXQgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQorICAgICAgICBpZiAocFhNTEZvcm1ET01Sb290KSB7DQorICAgICAgICAgIHBYTUxGb3JtRE9NUm9vdCA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFhNTEZvcm1ET01Sb290ID0gcEVsZW1lbnQ7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfTm9kZSogcFBhY2tldE5vZGUgPSBQYXJzZUFzWERQUGFja2V0KHBFbGVtZW50LCBlUGFja2V0KTsNCisgICAgICAgIGlmIChwUGFja2V0Tm9kZSkgew0KKyAgICAgICAgICBpZiAocFBhY2tldEluZm8gJiYNCisgICAgICAgICAgICAgIChwUGFja2V0SW5mby0+ZUZsYWdzICYgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FKSAmJg0KKyAgICAgICAgICAgICAgcFhGQVJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKHBQYWNrZXRJbmZvLT51SGFzaCkpIHsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwWEZBUm9vdE5vZGUtPkluc2VydENoaWxkKHBQYWNrZXROb2RlKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChwWE1MRGF0YXNldHNET01Sb290KSB7DQorICAgIENYRkFfTm9kZSogcFBhY2tldE5vZGUgPQ0KKyAgICAgICAgUGFyc2VBc1hEUFBhY2tldChwWE1MRGF0YXNldHNET01Sb290LCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKTsNCisgICAgaWYgKHBQYWNrZXROb2RlKSB7DQorICAgICAgcFhGQVJvb3ROb2RlLT5JbnNlcnRDaGlsZChwUGFja2V0Tm9kZSk7DQorICAgIH0NCisgIH0NCisgIGlmIChwWE1MRm9ybURPTVJvb3QpIHsNCisgICAgQ1hGQV9Ob2RlKiBwUGFja2V0Tm9kZSA9DQorICAgICAgICBQYXJzZUFzWERQUGFja2V0KHBYTUxGb3JtRE9NUm9vdCwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCisgICAgaWYgKHBQYWNrZXROb2RlKSB7DQorICAgICAgcFhGQVJvb3ROb2RlLT5JbnNlcnRDaGlsZChwUGFja2V0Tm9kZSk7DQorICAgIH0NCisgIH0NCisgIHBYRkFSb290Tm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7DQorICByZXR1cm4gcFhGQVJvb3ROb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X0NvbmZpZygNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgaWYgKCFYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUoDQorICAgICAgICAgIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29uZmlnKS0+cE5hbWUsDQorICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29uZmlnKS0+cFVSSSwNCisgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Db25maWcpLT5lRmxhZ3MpKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9DQorICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX0VMRU1FTlRfQ29uZmlnKTsNCisgIGlmICghcE5vZGUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29uZmlnKS0+cE5hbWUpOw0KKyAgaWYgKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCkpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7DQorICByZXR1cm4gcE5vZGU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXRfVGVtcGxhdGVGb3JtKA0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSkgew0KKyAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKA0KKyAgICAgICAgICAgIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfVGVtcGxhdGUpLT5wTmFtZSwNCisgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1RlbXBsYXRlKS0+cFVSSSwNCisgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1RlbXBsYXRlKS0+ZUZsYWdzKSkgew0KKyAgICAgIHBOb2RlID0NCisgICAgICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX1RlbXBsYXRlLCBYRkFfRUxFTUVOVF9UZW1wbGF0ZSk7DQorICAgICAgaWYgKCFwTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfVGVtcGxhdGUpLT5wTmFtZSk7DQorICAgICAgaWYgKG1fYkRvY3VtZW50UGFyc2VyKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWVzcGFjZVVSSTsNCisgICAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTERvY3VtZW50RWxlbWVudCA9DQorICAgICAgICAgICAgKElGREVfWE1MRWxlbWVudCopcFhNTERvY3VtZW50Tm9kZTsNCisgICAgICAgIHBYTUxEb2N1bWVudEVsZW1lbnQtPkdldE5hbWVzcGFjZVVSSSh3c05hbWVzcGFjZVVSSSk7DQorICAgICAgICBpZiAod3NOYW1lc3BhY2VVUkkuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIHBYTUxEb2N1bWVudEVsZW1lbnQtPkdldFN0cmluZyhMInhtbG5zOnhmYSIsIHdzTmFtZXNwYWNlVVJJKTsNCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlLT5HZXREb2N1bWVudCgpLT5SZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKHdzTmFtZXNwYWNlVVJJKTsNCisgICAgICB9DQorICAgICAgaWYgKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQorICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUoDQorICAgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Gb3JtKS0+cE5hbWUsDQorICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Gb3JtKS0+cFVSSSwNCisgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0Zvcm0pLT5lRmxhZ3MpKSB7DQorICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRG9jdW1lbnRFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTERvY3VtZW50Tm9kZTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoZWNrc3VtOw0KKyAgICAgIHBYTUxEb2N1bWVudEVsZW1lbnQtPkdldFN0cmluZyhMImNoZWNrc3VtIiwgd3NDaGVja3N1bSk7DQorI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KKyAgICAgIGlmICh3c0NoZWNrc3VtLkdldExlbmd0aCgpICE9IDI4IHx8DQorICAgICAgICAgIG1fcFhNTFBhcnNlci0+bV9kd0NoZWNrU3RhdHVzICE9IDB4MDMpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBJWEZBX0NoZWNrc3VtQ29udGV4dCogcENoZWNrc3VtID0gWEZBX0NoZWNrc3VtX0NyZWF0ZSgpOw0KKyAgICAgIHBDaGVja3N1bS0+U3RhcnRDaGVja3N1bSgpOw0KKyAgICAgIHBDaGVja3N1bS0+VXBkYXRlQ2hlY2tzdW0obV9wRmlsZVJlYWQsIG1fcFhNTFBhcnNlci0+bV9uU3RhcnRbMF0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BYTUxQYXJzZXItPm1fblNpemVbMF0pOw0KKyAgICAgIHBDaGVja3N1bS0+VXBkYXRlQ2hlY2tzdW0obV9wRmlsZVJlYWQsIG1fcFhNTFBhcnNlci0+bV9uU3RhcnRbMV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BYTUxQYXJzZXItPm1fblNpemVbMV0pOw0KKyAgICAgIHBDaGVja3N1bS0+RmluaXNoQ2hlY2tzdW0oKTsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBic0NoZWNrOw0KKyAgICAgIHBDaGVja3N1bS0+R2V0Q2hlY2tzdW0oYnNDaGVjayk7DQorICAgICAgcENoZWNrc3VtLT5SZWxlYXNlKCk7DQorICAgICAgaWYgKGJzQ2hlY2sgIT0gd3NDaGVja3N1bS5VVEY4RW5jb2RlKCkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisjZW5kaWYNCisgICAgICBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfRUxFTUVOVF9Gb3JtKTsNCisgICAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Gb3JtKS0+cE5hbWUpOw0KKyAgICAgIHBOb2RlLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgd3NDaGVja3N1bSk7DQorICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVSb290ID0NCisgICAgICAgICAgbV9wUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1RlbXBsYXRlKTsNCisgICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZUNob3NlbiA9DQorICAgICAgICAgIHBUZW1wbGF0ZVJvb3QNCisgICAgICAgICAgICAgID8gcFRlbXBsYXRlUm9vdC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSkNCisgICAgICAgICAgICAgIDogTlVMTDsNCisgICAgICBGWF9CT09MIGJVc2VBdHRyaWJ1dGUgPSBUUlVFOw0KKyAgICAgIGlmIChwVGVtcGxhdGVDaG9zZW4gJiYNCisgICAgICAgICAgcFRlbXBsYXRlQ2hvc2VuLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUmVzdG9yZVN0YXRlKSAhPQ0KKyAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fQXV0bykgew0KKyAgICAgICAgYlVzZUF0dHJpYnV0ZSA9IEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElELCBiVXNlQXR0cmlidXRlKSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAocE5vZGUpIHsNCisgICAgcE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBOb2RlOw0KK30NCitzdGF0aWMgSUZERV9YTUxOb2RlKiBYRkFfR2V0RGF0YVNldHNGcm9tWERQKElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSkgew0KKyAgaWYgKFhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZSgNCisgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPnBOYW1lLA0KKyAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+cFVSSSwNCisgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPmVGbGFncykpIHsNCisgICAgcmV0dXJuIHBYTUxEb2N1bWVudE5vZGU7DQorICB9DQorICBpZiAoIVhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZSgNCisgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5wTmFtZSwNCisgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5wVVJJLA0KKyAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPmVGbGFncykpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBmb3IgKElGREVfWE1MTm9kZSogcERhdGFzZXRzTm9kZSA9DQorICAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICBwRGF0YXNldHNOb2RlOw0KKyAgICAgICBwRGF0YXNldHNOb2RlID0gcERhdGFzZXRzTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgaWYgKCFYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUoDQorICAgICAgICAgICAgcERhdGFzZXRzTm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPnBOYW1lLA0KKyAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5wVVJJLA0KKyAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5lRmxhZ3MpKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgcmV0dXJuIHBEYXRhc2V0c05vZGU7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldF9EYXRhKA0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7DQorICBJRkRFX1hNTE5vZGUqIHBEYXRhc2V0c1hNTE5vZGUgPSBYRkFfR2V0RGF0YVNldHNGcm9tWERQKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgaWYgKHBEYXRhc2V0c1hNTE5vZGUpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9DQorICAgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFNb2RlbCk7DQorICAgIGlmICghcE5vZGUpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPnBOYW1lKTsNCisgICAgaWYgKCFEYXRhTG9hZGVyKHBOb2RlLCBwRGF0YXNldHNYTUxOb2RlLCBGQUxTRSkpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocERhdGFzZXRzWE1MTm9kZSk7DQorICAgIHJldHVybiBwTm9kZTsNCisgIH0NCisgIElGREVfWE1MTm9kZSogcERhdGFYTUxOb2RlID0gTlVMTDsNCisgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUoDQorICAgICAgICAgIHBYTUxEb2N1bWVudE5vZGUsIEZYX1dTVFJDKEwiZGF0YSIpLA0KKyAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+cFVSSSwNCisgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPmVGbGFncykpIHsNCisgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEb2N1bWVudE5vZGUpLT5SZW1vdmVBdHRyaWJ1dGUoTCJ4bWxuczp4ZmEiKTsNCisgICAgcERhdGFYTUxOb2RlID0gcFhNTERvY3VtZW50Tm9kZTsNCisgIH0gZWxzZSB7DQorICAgIElGREVfWE1MRWxlbWVudCogcERhdGFFbGVtZW50ID0NCisgICAgICAgIElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKEZYX1dTVFJDKEwieGZhOmRhdGEiKSk7DQorICAgIElGREVfWE1MTm9kZSogcFBhcmVudFhNTE5vZGUgPQ0KKyAgICAgICAgcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpOw0KKyAgICBpZiAocFBhcmVudFhNTE5vZGUpIHsNCisgICAgICBwUGFyZW50WE1MTm9kZS0+UmVtb3ZlQ2hpbGROb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChwWE1MRG9jdW1lbnROb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7DQorICAgIGlmIChwWE1MRG9jdW1lbnROb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MRG9jdW1lbnROb2RlKS0+UmVtb3ZlQXR0cmlidXRlKEwieG1sbnM6eGZhIik7DQorICAgIH0NCisgICAgcERhdGFFbGVtZW50LT5JbnNlcnRDaGlsZE5vZGUocFhNTERvY3VtZW50Tm9kZSk7DQorICAgIHBEYXRhWE1MTm9kZSA9IHBEYXRhRWxlbWVudDsNCisgIH0NCisgIGlmIChwRGF0YVhNTE5vZGUpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9DQorICAgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFHcm91cCk7DQorICAgIGlmICghcE5vZGUpIHsNCisgICAgICBpZiAocERhdGFYTUxOb2RlICE9IHBYTUxEb2N1bWVudE5vZGUpIHsNCisgICAgICAgIHBEYXRhWE1MTm9kZS0+UmVsZWFzZSgpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0xvY2FsTmFtZTsNCisgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBEYXRhWE1MTm9kZSktPkdldExvY2FsVGFnTmFtZSh3c0xvY2FsTmFtZSk7DQorICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTG9jYWxOYW1lKTsNCisgICAgaWYgKCFEYXRhTG9hZGVyKHBOb2RlLCBwRGF0YVhNTE5vZGUsIFRSVUUpKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBEYXRhWE1MTm9kZSk7DQorICAgIGlmIChwRGF0YVhNTE5vZGUgIT0gcFhNTERvY3VtZW50Tm9kZSkgew0KKyAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Pd25YTUxOb2RlLCBUUlVFLCBGQUxTRSk7DQorICAgIH0NCisgICAgcmV0dXJuIHBOb2RlOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXRfTG9jYWxlQ29ubmVjdGlvblNvdXJjZVNldCgNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBpZiAoZVBhY2tldElEID09IFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0KSB7DQorICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUoDQorICAgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Mb2NhbGVTZXQpLT5wTmFtZSwNCisgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0xvY2FsZVNldCktPnBVUkksDQorICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Mb2NhbGVTZXQpLT5lRmxhZ3MpKSB7DQorICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9Mb2NhbGVTZXQpOw0KKyAgICAgIGlmICghcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0xvY2FsZVNldCktPnBOYW1lKTsNCisgICAgICBpZiAoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2UgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQpIHsNCisgICAgaWYgKFhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZSgNCisgICAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCktPnBOYW1lLA0KKyAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCktPnBVUkksDQorICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Db25uZWN0aW9uU2V0KS0+ZUZsYWdzKSkgew0KKyAgICAgIHBOb2RlID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0Nvbm5lY3Rpb25TZXQpOw0KKyAgICAgIGlmICghcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0Nvbm5lY3Rpb25TZXQpLT5wTmFtZSk7DQorICAgICAgaWYgKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQpIHsNCisgICAgaWYgKFhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZSgNCisgICAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1NvdXJjZVNldCktPnBOYW1lLA0KKyAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfU291cmNlU2V0KS0+cFVSSSwNCisgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1NvdXJjZVNldCktPmVGbGFncykpIHsNCisgICAgICBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX1NvdXJjZVNldCk7DQorICAgICAgaWYgKCFwTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfU291cmNlU2V0KS0+cE5hbWUpOw0KKyAgICAgIGlmICghTm9ybWFsTG9hZGVyKHBOb2RlLCBwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChwTm9kZSkgew0KKyAgICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7DQorICB9DQorICByZXR1cm4gcE5vZGU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXRfWGRjKA0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7DQorICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKA0KKyAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hkYyktPnBOYW1lLA0KKyAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hkYyktPnBVUkksDQorICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWGRjKS0+ZUZsYWdzKSkgew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0NCisgICAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9YZGMsIFhGQV9FTEVNRU5UX1hkYyk7DQorICAgIGlmICghcE5vZGUpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YZGMpLT5wTmFtZSk7DQorICAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRG9jdW1lbnROb2RlKTsNCisgICAgcmV0dXJuIHBOb2RlOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXRfVXNlcigNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9DQorICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX1hEUCwgWEZBX0VMRU1FTlRfUGFja2V0KTsNCisgIGlmICghcE5vZGUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICAoKElGREVfWE1MRWxlbWVudCopcFhNTERvY3VtZW50Tm9kZSktPkdldExvY2FsVGFnTmFtZSh3c05hbWUpOw0KKyAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCisgIGlmICghVXNlclBhY2tldExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSkpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7DQorICByZXR1cm4gcE5vZGU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlVzZXJQYWNrZXRMb2FkZXIoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTERvYykgew0KKyAgcmV0dXJuIHBYRkFOb2RlOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfRkRFRXh0ZW5zaW9uX0lzU3RyaW5nQWxsV2hpdGVzcGFjZShDRlhfV2lkZVN0cmluZyB3c1RleHQpIHsNCisgIHdzVGV4dC5UcmltUmlnaHQoTCJceDIwXHg5XHhEXHhBIik7DQorICByZXR1cm4gd3NUZXh0LklzRW1wdHkoKTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6RGF0YUxvYWRlcihDWEZBX05vZGUqIHBYRkFOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRG9UcmFuc2Zvcm0pIHsNCisgIFBhcnNlRGF0YUdyb3VwKHBYRkFOb2RlLCBwWE1MRG9jLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKTsNCisgIHJldHVybiBwWEZBTm9kZTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6Tm9ybWFsTG9hZGVyKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZUF0dHJpYnV0ZSkgew0KKyAgRlhfQk9PTCBiT25lT2ZQcm9wZXJ0eUZvdW5kID0gRkFMU0U7DQorICBmb3IgKElGREVfWE1MTm9kZSogcFhNTENoaWxkID0gcFhNTERvYy0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgcFhNTENoaWxkOw0KKyAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgIHN3aXRjaCAocFhNTENoaWxkLT5HZXRUeXBlKCkpIHsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX0VsZW1lbnQ6IHsNCisgICAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQ7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RhZ05hbWU7DQorICAgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnTmFtZSk7DQorICAgICAgICBYRkFfTFBDRUxFTUVOVElORk8gcEVsZW1JbmZvID0gWEZBX0dldEVsZW1lbnRCeU5hbWUod3NUYWdOYW1lKTsNCisgICAgICAgIGlmICghcEVsZW1JbmZvKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0eUluZm8gPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoDQorICAgICAgICAgICAgcFhGQU5vZGUtPkdldENsYXNzSUQoKSwgcEVsZW1JbmZvLT5lTmFtZSwgZVBhY2tldElEKTsNCisgICAgICAgIGlmIChwUHJvcGVydHlJbmZvICYmDQorICAgICAgICAgICAgKChwUHJvcGVydHlJbmZvLT51RmxhZ3MgJg0KKyAgICAgICAgICAgICAgKFhGQV9QUk9QRVJUWUZMQUdfT25lT2YgfCBYRkFfUFJPUEVSVFlGTEFHX0RlZmF1bHRPbmVPZikpICE9IDApKSB7DQorICAgICAgICAgIGlmIChiT25lT2ZQcm9wZXJ0eUZvdW5kKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYk9uZU9mUHJvcGVydHlGb3VuZCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUqIHBYRkFDaGlsZCA9DQorICAgICAgICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShlUGFja2V0SUQsIHBFbGVtSW5mby0+ZU5hbWUpOw0KKyAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0NvbmZpZykgew0KKyAgICAgICAgICBwWEZBQ2hpbGQtPlNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzVGFnTmFtZSk7DQorICAgICAgICB9DQorICAgICAgICBGWF9CT09MIElzTmVlZFZhbHVlID0gVFJVRTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgY291bnQgPSBwWE1MRWxlbWVudC0+Q291bnRBdHRyaWJ1dGVzKCk7IGkgPCBjb3VudDsNCisgICAgICAgICAgICAgaSsrKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0clF1YWxpZmllZE5hbWU7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0ck5hbWU7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0clZhbHVlOw0KKyAgICAgICAgICBwWE1MRWxlbWVudC0+R2V0QXR0cmlidXRlKGksIHdzQXR0clF1YWxpZmllZE5hbWUsIHdzQXR0clZhbHVlKTsNCisgICAgICAgICAgWEZBX0ZERUV4dGVuc2lvbl9HZXRBdHRyaWJ1dGVMb2NhbE5hbWUod3NBdHRyUXVhbGlmaWVkTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NBdHRyTmFtZSk7DQorICAgICAgICAgIGlmICh3c0F0dHJOYW1lID09IEZYX1dTVFJDKEwibmlsIikgJiYNCisgICAgICAgICAgICAgIHdzQXR0clZhbHVlID09IEZYX1dTVFJDKEwidHJ1ZSIpKSB7DQorICAgICAgICAgICAgSXNOZWVkVmFsdWUgPSBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBYRkFfTFBDQVRUUklCVVRFSU5GTyBscEF0dHJJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5TmFtZSh3c0F0dHJOYW1lKTsNCisgICAgICAgICAgaWYgKCFscEF0dHJJbmZvKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCFiVXNlQXR0cmlidXRlICYmIGxwQXR0ckluZm8tPmVOYW1lICE9IFhGQV9BVFRSSUJVVEVfTmFtZSAmJg0KKyAgICAgICAgICAgICAgbHBBdHRySW5mby0+ZU5hbWUgIT0gWEZBX0FUVFJJQlVURV9TYXZlKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcFhGQUNoaWxkLT5TZXRBdHRyaWJ1dGUobHBBdHRySW5mby0+ZU5hbWUsIHdzQXR0clZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOw0KKyAgICAgICAgaWYgKHBFbGVtSW5mby0+ZU5hbWUgPT0gWEZBX0VMRU1FTlRfVmFsaWRhdGUgfHwNCisgICAgICAgICAgICBwRWxlbUluZm8tPmVOYW1lID09IFhGQV9FTEVNRU5UX0xvY2FsZSkgew0KKyAgICAgICAgICBpZiAoZVBhY2tldElEID09IFhGQV9YRFBQQUNLRVRfQ29uZmlnKSB7DQorICAgICAgICAgICAgUGFyc2VDb250ZW50Tm9kZShwWEZBQ2hpbGQsIHBYTUxFbGVtZW50LCBlUGFja2V0SUQpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIE5vcm1hbExvYWRlcihwWEZBQ2hpbGQsIHBYTUxFbGVtZW50LCBlUGFja2V0SUQsIGJVc2VBdHRyaWJ1dGUpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoIChwWEZBQ2hpbGQtPkdldE9iamVjdFR5cGUoKSkgew0KKyAgICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlOg0KKyAgICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlOg0KKyAgICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVDOg0KKyAgICAgICAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVWOg0KKyAgICAgICAgICAgIGlmIChJc05lZWRWYWx1ZSkgew0KKyAgICAgICAgICAgICAgUGFyc2VDb250ZW50Tm9kZShwWEZBQ2hpbGQsIHBYTUxFbGVtZW50LCBlUGFja2V0SUQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBOb3JtYWxMb2FkZXIocFhGQUNoaWxkLCBwWE1MRWxlbWVudCwgZVBhY2tldElELCBiVXNlQXR0cmlidXRlKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb246DQorICAgICAgICBQYXJzZUluc3RydWN0aW9uKHBYRkFOb2RlLCAoSUZERV9YTUxJbnN0cnVjdGlvbiopcFhNTENoaWxkLCBlUGFja2V0SUQpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCiAgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGlmKCF3c1ZhbHVlLklzRW1wdHkoKSkgew0KLSAgICAgICAgaWYgKHBYRkFOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGUpIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUgKnBDb250ZW50UmF3RGF0YU5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKGVQYWNrZXRJRCwgZWxlbWVudCk7DQotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBDb250ZW50UmF3RGF0YU5vZGUpOw0KLSAgICAgICAgICAgIHBDb250ZW50UmF3RGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzVmFsdWUpOw0KLSAgICAgICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwQ29udGVudFJhd0RhdGFOb2RlKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcFhGQU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzVmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICB9DQorICByZXR1cm4gcFhGQU5vZGU7DQogfQ0KLXZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlRGF0YUdyb3VwKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KLXsNCi0gICAgZm9yIChJRkRFX1hNTE5vZGUgKnBYTUxDaGlsZCA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MQ2hpbGQ7IHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCi0gICAgICAgIHN3aXRjaCAocFhNTENoaWxkLT5HZXRUeXBlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0VsZW1lbnQ6IHsNCi0gICAgICAgICAgICAgICAgICAgIElGREVfWE1MRWxlbWVudCAqcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQ7DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkk7DQotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZERUV4dGVuc2lvbl9HZXRFbGVtZW50VGFnTmFtZXNwYWNlVVJJKHBYTUxFbGVtZW50LCB3c05hbWVzcGFjZVVSSSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYod3NOYW1lc3BhY2VVUkkgPT0gRlhfV1NUUkMoTCJodHRwOi8vd3d3LnhmYS5jb20vc2NoZW1hL3hmYS1wYWNrYWdlLyIpIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c05hbWVzcGFjZVVSSSA9PSBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXBhY2thZ2UvIikgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTmFtZXNwYWNlVVJJID09IEZYX1dTVFJDKEwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhTW9kZWw7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZU5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YU5vZGVBdHRyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKFhGQV9GREVFeHRlbnNpb25fRmluZEF0dHJpYnV0ZVdpdGhOUyhwWE1MRWxlbWVudCwgRlhfV1NUUkMoTCJkYXRhTm9kZSIpLCBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyIpLCB3c0RhdGFOb2RlQXR0cikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdzRGF0YU5vZGVBdHRyID09IEZYX1dTVFJDKEwiZGF0YUdyb3VwIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVOb2RlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFHcm91cDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3c0RhdGFOb2RlQXR0ciA9PSBGWF9XU1RSQyhMImRhdGFWYWx1ZSIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihYRkFfRkRFRXh0ZW5zaW9uX0ZpbmRBdHRyaWJ1dGVXaXRoTlMocFhNTEVsZW1lbnQsIEZYX1dTVFJDKEwiY29udGVudFR5cGUiKSwgRlhfV1NUUkMoTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLzEuMC8iKSwgd3NDb250ZW50VHlwZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3c0NvbnRlbnRUeXBlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU5vZGVUeXBlID0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElGREVfWE1MTm9kZSAqcFhNTERhdGFDaGlsZCA9IHBYTUxFbGVtZW50LT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOyBwWE1MRGF0YUNoaWxkOyBwWE1MRGF0YUNoaWxkID0gcFhNTERhdGFDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocFhNTERhdGFDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghWEZBX1JlY29nbml6ZVJpY2hUZXh0KChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEYXRhQ2hpbGQpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU5vZGVUeXBlID0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUgKnBYRkFDaGlsZCA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgZU5vZGVUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwWEZBQ2hpbGQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTm9kZU5hbWU7DQotICAgICAgICAgICAgICAgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzTm9kZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTm9kZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTmVlZFZhbHVlID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludDMyX3QgaSA9IDAsIGNvdW50ID0gcFhNTEVsZW1lbnQtPkNvdW50QXR0cmlidXRlcygpOyBpIDwgY291bnQ7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJRdWFsaWZpZWROYW1lOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZXNwYWNlVVJJOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWE1MRWxlbWVudC0+R2V0QXR0cmlidXRlKGksIHdzQXR0clF1YWxpZmllZE5hbWUsIHdzQXR0clZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIVhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZUF0dHJpYnV0ZShwWE1MRWxlbWVudCwgd3NBdHRyUXVhbGlmaWVkTmFtZSwgd3NBdHRyTmFtZSwgd3NBdHRyTmFtZXNwYWNlVVJJKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod3NBdHRyTmFtZSA9PSBGWF9XU1RSQyhMIm5pbCIpICYmIHdzQXR0clZhbHVlID09IEZYX1dTVFJDKEwidHJ1ZSIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmVlZFZhbHVlID0gRkFMU0U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3c0F0dHJOYW1lc3BhY2VVUkkgPT0gRlhfV1NUUkMoTCJodHRwOi8vd3d3LnhmYS5jb20vc2NoZW1hL3hmYS1wYWNrYWdlLyIpIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NBdHRyTmFtZXNwYWNlVVJJID09IEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtcGFja2FnZS8iKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzQXR0ck5hbWVzcGFjZVVSSSA9PSBGWF9XU1RSQyhMImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIikgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0F0dHJOYW1lc3BhY2VVUkkgPT0gRlhfV1NUUkMoTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLzEuMC8iKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwWEZBTWV0YURhdGEgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwWEZBTWV0YURhdGEgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBYRkFNZXRhRGF0YS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c0F0dHJOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1F1YWxpZmllZE5hbWUsIHdzQXR0clF1YWxpZmllZE5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWEZBTWV0YURhdGEtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQXR0clZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsIFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5JbnNlcnRDaGlsZChwWEZBTWV0YURhdGEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWEZBTWV0YURhdGEtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxFbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighYk5lZWRWYWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05pbE5hbWUgPSBGWF9XU1RSQyhMInhzaTpuaWwiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQtPlJlbW92ZUF0dHJpYnV0ZSh3c05pbE5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhR3JvdXApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJzZURhdGFHcm91cChwWEZBQ2hpbGQsIHBYTUxFbGVtZW50LCBlUGFja2V0SUQpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihiTmVlZFZhbHVlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRGF0YVZhbHVlKHBYRkFDaGlsZCwgcFhNTENoaWxkLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxFbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOiB7DQotICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTENoYXJEYXRhICpwWE1MQ2hhckRhdGEgPSAoSUZERV9YTUxDaGFyRGF0YSopcFhNTENoaWxkOw0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGFyRGF0YTsNCi0gICAgICAgICAgICAgICAgICAgIHBYTUxDaGFyRGF0YS0+R2V0Q2hhckRhdGEod3NDaGFyRGF0YSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9Jc1N0cmluZ0FsbFdoaXRlc3BhY2Uod3NDaGFyRGF0YSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcFhGQUNoaWxkID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NoYXJEYXRhKTsNCi0gICAgICAgICAgICAgICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MQ2hhckRhdGEpOw0KLSAgICAgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KLSAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxUZXh0ICpwWE1MVGV4dCA9IChJRkRFX1hNTFRleHQqKXBYTUxDaGlsZDsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCi0gICAgICAgICAgICAgICAgICAgIHBYTUxUZXh0LT5HZXRUZXh0KHdzVGV4dCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9Jc1N0cmluZ0FsbFdoaXRlc3BhY2Uod3NUZXh0KSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwWEZBQ2hpbGQgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFhGQUNoaWxkID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzVGV4dCk7DQotICAgICAgICAgICAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTFRleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb246DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KK0ZYX0JPT0wgWEZBX1JlY29nbml6ZVJpY2hUZXh0KElGREVfWE1MRWxlbWVudCogcFJpY2hUZXh0WE1MTm9kZSkgew0KKyAgaWYgKHBSaWNoVGV4dFhNTE5vZGUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkk7DQorICAgIFhGQV9GREVFeHRlbnNpb25fR2V0RWxlbWVudFRhZ05hbWVzcGFjZVVSSShwUmljaFRleHRYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NOYW1lc3BhY2VVUkkpOw0KKyAgICBpZiAod3NOYW1lc3BhY2VVUkkgPT0gRlhfV1NUUkMoTCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIikpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCiAgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi12b2lkIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZURhdGFWYWx1ZShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkNCi17DQotICAgIENGWF9XaWRlVGV4dEJ1ZiB3c1ZhbHVlVGV4dEJ1ZjsNCi0gICAgQ0ZYX1dpZGVUZXh0QnVmIHdzQ3VyVmFsdWVUZXh0QnVmOw0KLSAgICBGWF9CT09MIGJNYXJrQXNDb21wb3VuZCA9IEZBTFNFOw0KLSAgICBJRkRFX1hNTE5vZGUgKnBYTUxDdXJWYWx1ZU5vZGUgPSBOVUxMOw0KLSAgICBmb3IgKElGREVfWE1MTm9kZSAqcFhNTENoaWxkID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7IHBYTUxDaGlsZDsgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KLSAgICAgICAgRkRFX1hNTE5PREVUWVBFIGVOb2RlVHlwZSA9IHBYTUxDaGlsZC0+R2V0VHlwZSgpOw0KLSAgICAgICAgaWYoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQorY2xhc3MgUmljaFRleHROb2RlVmlzaXRvciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBpbmxpbmUgSUZERV9YTUxOb2RlKiBHZXRGaXJzdENoaWxkKElGREVfWE1MTm9kZSogcE5vZGUpIHsNCisgICAgcmV0dXJuIHBOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBJRkRFX1hNTE5vZGUqIEdldE5leHRTaWJsaW5nKElGREVfWE1MTm9kZSogcE5vZGUpIHsNCisgICAgcmV0dXJuIHBOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgSUZERV9YTUxOb2RlKiBHZXRQYXJlbnQoSUZERV9YTUxOb2RlKiBwTm9kZSkgew0KKyAgICByZXR1cm4gcE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KTsNCisgIH0NCit9Ow0KKyNpZm5kZWYgWEZBX1BBUlNFX0hBU19MSU5FSURFTlRJRklFUg0KK3ZvaWQgWEZBX0NvbnZlcnRSaWNoVGV4dFRvUGxhaW5UZXh0KElGREVfWE1MRWxlbWVudCogcFJpY2hUZXh0WE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsNCisgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8SUZERV9YTUxOb2RlLCBSaWNoVGV4dE5vZGVWaXNpdG9yPiBzSXRlcmF0b3IoDQorICAgICAgcFJpY2hUZXh0WE1MTm9kZSk7DQorICBDRlhfV2lkZVRleHRCdWYgd3NQbGFpblRleHRCdWY7DQorICBmb3IgKElGREVfWE1MTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsNCisgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgIHN3aXRjaCAocE5vZGUtPkdldFR5cGUoKSkgew0KKyAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KLSAgICAgICAgRlhfQk9PTCBiQnJlYWsgPSBGQUxTRTsNCi0gICAgICAgIGlmKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9UZXh0KSB7DQotICAgICAgICAgICAgKChJRkRFX1hNTFRleHQqKXBYTUxDaGlsZCktPkdldFRleHQod3NUZXh0KTsNCi0gICAgICAgICAgICBpZighcFhNTEN1clZhbHVlTm9kZSkgew0KLSAgICAgICAgICAgICAgICBwWE1MQ3VyVmFsdWVOb2RlID0gcFhNTENoaWxkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c0N1clZhbHVlVGV4dEJ1ZiA8PCB3c1RleHQ7DQotICAgICAgICB9IGVsc2UgaWYoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0NoYXJEYXRhKSB7DQotICAgICAgICAgICAgKChJRkRFX1hNTENoYXJEYXRhKilwWE1MQ2hpbGQpLT5HZXRDaGFyRGF0YSh3c1RleHQpOw0KLSAgICAgICAgICAgIGlmKCFwWE1MQ3VyVmFsdWVOb2RlKSB7DQotICAgICAgICAgICAgICAgIHBYTUxDdXJWYWx1ZU5vZGUgPSBwWE1MQ2hpbGQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdzQ3VyVmFsdWVUZXh0QnVmIDw8IHdzVGV4dDsNCi0gICAgICAgIH0gZWxzZSBpZihYRkFfUmVjb2duaXplUmljaFRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkKSkgew0KLSNpZmRlZiBYRkFfUEFSU0VfSEFTX0xJTkVJREVOVElGSUVSDQotICAgICAgICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzVGV4dCk7DQotI2Vsc2UNCi0gICAgICAgICAgICBYRkFfQ29udmVydFJpY2hUZXh0VG9QbGFpblRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkLCB3c1RleHQpOw0KLSNlbmRpZg0KLSAgICAgICAgICAgIGlmKCFwWE1MQ3VyVmFsdWVOb2RlKSB7DQotICAgICAgICAgICAgICAgIHBYTUxDdXJWYWx1ZU5vZGUgPSBwWE1MQ2hpbGQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdzQ3VyVmFsdWVUZXh0QnVmIDw8IHdzVGV4dDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgYk1hcmtBc0NvbXBvdW5kID0gVFJVRTsNCi0gICAgICAgICAgICBpZihwWE1MQ3VyVmFsdWVOb2RlKSB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0N1clZhbHVlID0gd3NDdXJWYWx1ZVRleHRCdWYuR2V0V2lkZVN0cmluZygpOw0KLSAgICAgICAgICAgICAgICBpZighd3NDdXJWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSAqcFhGQUNoaWxkID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShlUGFja2V0SUQsIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAocFhGQUNoaWxkID09IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgRlhfV1NUUkMoTCIiKSk7DQotICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ3VyVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCk7DQotICAgICAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxDdXJWYWx1ZU5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZVRleHRCdWYgPDwgd3NDdXJWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIHdzQ3VyVmFsdWVUZXh0QnVmLkNsZWFyKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcFhNTEN1clZhbHVlTm9kZSA9IE5VTEw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIENYRkFfTm9kZSAqcFhGQUNoaWxkID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShlUGFja2V0SUQsIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQotICAgICAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOb2RlU3RyOw0KLSAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQpLT5HZXRMb2NhbFRhZ05hbWUod3NOb2RlU3RyKTsNCi0gICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOb2RlU3RyKTsNCi0gICAgICAgICAgICBQYXJzZURhdGFWYWx1ZShwWEZBQ2hpbGQsIHBYTUxDaGlsZCwgZVBhY2tldElEKTsNCi0gICAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCi0gICAgICAgICAgICBwWEZBQ2hpbGQtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxDaGlsZCk7DQotICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0N1clZhbHVlID0gcFhGQUNoaWxkLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlKTsNCi0gICAgICAgICAgICB3c1ZhbHVlVGV4dEJ1ZiA8PCB3c0N1clZhbHVlOw0KLSAgICAgICAgfQ0KKyAgICAgICAgKChJRkRFX1hNTFRleHQqKXBOb2RlKS0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICAgICAgd3NQbGFpblRleHRCdWYgPDwgd3NUZXh0Ow0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MTk9ERV9DaGFyRGF0YTogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgKChJRkRFX1hNTENoYXJEYXRhKilwTm9kZSktPkdldENoYXJEYXRhKHdzVGV4dCk7DQorICAgICAgICB3c1BsYWluVGV4dEJ1ZiA8PCB3c1RleHQ7DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYocFhNTEN1clZhbHVlTm9kZSkgew0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ3VyVmFsdWUgPSB3c0N1clZhbHVlVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7DQotICAgICAgICBpZighd3NDdXJWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBpZihiTWFya0FzQ29tcG91bmQpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlICpwWEZBQ2hpbGQgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKGVQYWNrZXRJRCwgWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwiIikpOw0KLSAgICAgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ3VyVmFsdWUpOw0KLSAgICAgICAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCi0gICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MQ3VyVmFsdWVOb2RlKTsNCi0gICAgICAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgfQ0KKyAgd3NPdXRwdXQgPSB3c1BsYWluVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7DQorfQ0KKyNlbmRpZg0KK3ZvaWQgWEZBX0NvbnZlcnRYTUxUb1BsYWluVGV4dChJRkRFX1hNTEVsZW1lbnQqIHBSb290WE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSB7DQorICBmb3IgKElGREVfWE1MTm9kZSogcFhNTENoaWxkID0NCisgICAgICAgICAgIHBSb290WE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgcFhNTENoaWxkOw0KKyAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorI2lmZGVmIF9ERUJVRw0KKyAgICBGREVfWE1MTk9ERVRZUEUgbm9kZVR5cGUgPSBwWE1MQ2hpbGQtPkdldFR5cGUoKTsNCisjZW5kaWYNCisgICAgc3dpdGNoIChwWE1MQ2hpbGQtPkdldFR5cGUoKSkgew0KKyAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0RGF0YTsNCisgICAgICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQpLT5HZXRUZXh0RGF0YSh3c1RleHREYXRhKTsNCisgICAgICAgIHdzVGV4dERhdGEgKz0gRlhfV1NUUkMoTCJcbiIpOw0KKyAgICAgICAgd3NPdXRwdXQgKz0gd3NUZXh0RGF0YTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgKChJRkRFX1hNTFRleHQqKXBYTUxDaGlsZCktPkdldFRleHQod3NUZXh0KTsNCisgICAgICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX0lzU3RyaW5nQWxsV2hpdGVzcGFjZSh3c1RleHQpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSB3c1RleHQ7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYXJEYXRhOw0KKyAgICAgICAgKChJRkRFX1hNTENoYXJEYXRhKilwWE1MQ2hpbGQpLT5HZXRDaGFyRGF0YSh3c0NoYXJEYXRhKTsNCisgICAgICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX0lzU3RyaW5nQWxsV2hpdGVzcGFjZSh3c0NoYXJEYXRhKSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gd3NDaGFyRGF0YTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VDb250ZW50Tm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7DQorICBYRkFfRUxFTUVOVCBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB0ZXh0Ow0KKyAgaWYgKHBYRkFOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0NvbnRlbnRUeXBlID0NCisgICAgICAgIHBYRkFOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlKTsNCisgICAgaWYgKHdzQ29udGVudFR5cGUgPT0gRlhfV1NUUkMoTCJ0ZXh0L2h0bWwiKSkgew0KKyAgICAgIGVsZW1lbnQgPSBYRkFfRUxFTUVOVF9TaGFycHhIVE1MOw0KKyAgICB9IGVsc2UgaWYgKHdzQ29udGVudFR5cGUgPT0gRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKSB7DQorICAgICAgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJweG1sOw0KKyAgICB9DQorICB9DQorICBpZiAoZWxlbWVudCA9PSBYRkFfRUxFTUVOVF9TaGFycHhIVE1MKSB7DQorICAgIHBYRkFOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MTm9kZSk7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgZm9yIChJRkRFX1hNTE5vZGUqIHBYTUxDaGlsZCA9DQorICAgICAgICAgICBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgcFhNTENoaWxkOw0KKyAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgIEZERV9YTUxOT0RFVFlQRSBlTm9kZVR5cGUgPSBwWE1MQ2hpbGQtPkdldFR5cGUoKTsNCisgICAgaWYgKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChlbGVtZW50ID09IFhGQV9FTEVNRU5UX1NoYXJweEhUTUwpIHsNCisgICAgICBpZiAoZU5vZGVUeXBlICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAoWEZBX1JlY29nbml6ZVJpY2hUZXh0KChJRkRFX1hNTEVsZW1lbnQqKXBYTUxDaGlsZCkpIHsNCisjaWZkZWYgWEZBX1BBUlNFX0hBU19MSU5FSURFTlRJRklFUg0KKyAgICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzVmFsdWUpOw0KKyNlbHNlDQorICAgICAgICBYRkFfQ29udmVydFJpY2hUZXh0VG9QbGFpblRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkLCB3c1ZhbHVlKTsNCisjZW5kaWYNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBYRkFfRUxFTUVOVF9TaGFycHhtbCkgew0KKyAgICAgIGlmIChlTm9kZVR5cGUgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIFhGQV9Db252ZXJ0WE1MVG9QbGFpblRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkLCB3c1ZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX1RleHQpIHsNCisgICAgICAgICgoSUZERV9YTUxUZXh0KilwWE1MQ2hpbGQpLT5HZXRUZXh0KHdzVmFsdWUpOw0KKyAgICAgIH0gZWxzZSBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0NoYXJEYXRhKSB7DQorICAgICAgICAoKElGREVfWE1MQ2hhckRhdGEqKXBYTUxDaGlsZCktPkdldENoYXJEYXRhKHdzVmFsdWUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBicmVhazsNCisgIH0NCisgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgaWYgKHBYRkFOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGUpIHsNCisgICAgICBDWEZBX05vZGUqIHBDb250ZW50UmF3RGF0YU5vZGUgPQ0KKyAgICAgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKGVQYWNrZXRJRCwgZWxlbWVudCk7DQorICAgICAgRlhTWVNfYXNzZXJ0KHBDb250ZW50UmF3RGF0YU5vZGUpOw0KKyAgICAgIHBDb250ZW50UmF3RGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzVmFsdWUpOw0KKyAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwQ29udGVudFJhd0RhdGFOb2RlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwWEZBTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NWYWx1ZSk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VEYXRhR3JvdXAoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7DQorICBmb3IgKElGREVfWE1MTm9kZSogcFhNTENoaWxkID0NCisgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICBwWE1MQ2hpbGQ7DQorICAgICAgIHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgc3dpdGNoIChwWE1MQ2hpbGQtPkdldFR5cGUoKSkgew0KKyAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDogew0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxDaGlsZDsNCisgICAgICAgIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkk7DQorICAgICAgICAgIFhGQV9GREVFeHRlbnNpb25fR2V0RWxlbWVudFRhZ05hbWVzcGFjZVVSSShwWE1MRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTmFtZXNwYWNlVVJJKTsNCisgICAgICAgICAgaWYgKHdzTmFtZXNwYWNlVVJJID09DQorICAgICAgICAgICAgICAgICAgRlhfV1NUUkMoTCJodHRwOi8vd3d3LnhmYS5jb20vc2NoZW1hL3hmYS1wYWNrYWdlLyIpIHx8DQorICAgICAgICAgICAgICB3c05hbWVzcGFjZVVSSSA9PQ0KKyAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtcGFja2FnZS8iKSB8fA0KKyAgICAgICAgICAgICAgd3NOYW1lc3BhY2VVUkkgPT0NCisgICAgICAgICAgICAgICAgICBGWF9XU1RSQyhMImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIikpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoMCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBYRkFfRUxFTUVOVCBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhTW9kZWw7DQorICAgICAgICBpZiAoZU5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCkgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGFOb2RlQXR0cjsNCisgICAgICAgICAgaWYgKFhGQV9GREVFeHRlbnNpb25fRmluZEF0dHJpYnV0ZVdpdGhOUygNCisgICAgICAgICAgICAgICAgICBwWE1MRWxlbWVudCwgRlhfV1NUUkMoTCJkYXRhTm9kZSIpLA0KKyAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtZGF0YS8xLjAvIiksDQorICAgICAgICAgICAgICAgICAgd3NEYXRhTm9kZUF0dHIpKSB7DQorICAgICAgICAgICAgaWYgKHdzRGF0YU5vZGVBdHRyID09IEZYX1dTVFJDKEwiZGF0YUdyb3VwIikpIHsNCisgICAgICAgICAgICAgIGVOb2RlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFHcm91cDsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHdzRGF0YU5vZGVBdHRyID09IEZYX1dTVFJDKEwiZGF0YVZhbHVlIikpIHsNCisgICAgICAgICAgICAgIGVOb2RlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZTsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NWYWx1ZVRleHRCdWYgPDwgd3NDdXJWYWx1ZTsNCi0gICAgICAgICAgICB3c0N1clZhbHVlVGV4dEJ1Zi5DbGVhcigpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpIHsNCisgICAgICAgICAgaWYgKFhGQV9GREVFeHRlbnNpb25fRmluZEF0dHJpYnV0ZVdpdGhOUygNCisgICAgICAgICAgICAgICAgICBwWE1MRWxlbWVudCwgRlhfV1NUUkMoTCJjb250ZW50VHlwZSIpLA0KKyAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtZGF0YS8xLjAvIiksDQorICAgICAgICAgICAgICAgICAgd3NDb250ZW50VHlwZSkpIHsNCisgICAgICAgICAgICBpZiAoIXdzQ29udGVudFR5cGUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoZU5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCkgew0KKyAgICAgICAgICBmb3IgKElGREVfWE1MTm9kZSogcFhNTERhdGFDaGlsZCA9DQorICAgICAgICAgICAgICAgICAgIHBYTUxFbGVtZW50LT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICAgIHBYTUxEYXRhQ2hpbGQ7IHBYTUxEYXRhQ2hpbGQgPSBwWE1MRGF0YUNoaWxkLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBpZiAocFhNTERhdGFDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAgIGlmICghWEZBX1JlY29nbml6ZVJpY2hUZXh0KChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEYXRhQ2hpbGQpKSB7DQorICAgICAgICAgICAgICAgIGVOb2RlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFHcm91cDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoZU5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCkgew0KKyAgICAgICAgICBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUqIHBYRkFDaGlsZCA9DQorICAgICAgICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBlTm9kZVR5cGUpOw0KKyAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTm9kZU5hbWU7DQorICAgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzTm9kZU5hbWUpOw0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTm9kZU5hbWUpOw0KKyAgICAgICAgRlhfQk9PTCBiTmVlZFZhbHVlID0gVFJVRTsNCisgICAgICAgIGlmICgxKSB7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgY291bnQgPSBwWE1MRWxlbWVudC0+Q291bnRBdHRyaWJ1dGVzKCk7IGkgPCBjb3VudDsNCisgICAgICAgICAgICAgICBpKyspIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJRdWFsaWZpZWROYW1lOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0clZhbHVlOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0ck5hbWU7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZXNwYWNlVVJJOw0KKyAgICAgICAgICAgIHBYTUxFbGVtZW50LT5HZXRBdHRyaWJ1dGUoaSwgd3NBdHRyUXVhbGlmaWVkTmFtZSwgd3NBdHRyVmFsdWUpOw0KKyAgICAgICAgICAgIGlmICghWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlQXR0cmlidXRlKA0KKyAgICAgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQsIHdzQXR0clF1YWxpZmllZE5hbWUsIHdzQXR0ck5hbWUsDQorICAgICAgICAgICAgICAgICAgICB3c0F0dHJOYW1lc3BhY2VVUkkpKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHdzQXR0ck5hbWUgPT0gRlhfV1NUUkMoTCJuaWwiKSAmJg0KKyAgICAgICAgICAgICAgICB3c0F0dHJWYWx1ZSA9PSBGWF9XU1RSQyhMInRydWUiKSkgew0KKyAgICAgICAgICAgICAgYk5lZWRWYWx1ZSA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh3c0F0dHJOYW1lc3BhY2VVUkkgPT0NCisgICAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEuY29tL3NjaGVtYS94ZmEtcGFja2FnZS8iKSB8fA0KKyAgICAgICAgICAgICAgICB3c0F0dHJOYW1lc3BhY2VVUkkgPT0NCisgICAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtcGFja2FnZS8iKSB8fA0KKyAgICAgICAgICAgICAgICB3c0F0dHJOYW1lc3BhY2VVUkkgPT0NCisgICAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSB8fA0KKyAgICAgICAgICAgICAgICB3c0F0dHJOYW1lc3BhY2VVUkkgPT0NCisgICAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtZGF0YS8xLjAvIikpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoMCkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcFhGQU1ldGFEYXRhID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZSgNCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCisgICAgICAgICAgICBpZiAocFhGQU1ldGFEYXRhID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzQXR0ck5hbWUpOw0KKyAgICAgICAgICAgIHBYRkFNZXRhRGF0YS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NBdHRyUXVhbGlmaWVkTmFtZSk7DQorICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0F0dHJWYWx1ZSk7DQorICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhKTsNCisgICAgICAgICAgICBwWEZBQ2hpbGQtPkluc2VydENoaWxkKHBYRkFNZXRhRGF0YSk7DQorICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRWxlbWVudCk7DQorICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICghYk5lZWRWYWx1ZSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmlsTmFtZSA9IEZYX1dTVFJDKEwieHNpOm5pbCIpOw0KKyAgICAgICAgICAgIHBYTUxFbGVtZW50LT5SZW1vdmVBdHRyaWJ1dGUod3NOaWxOYW1lKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCk7DQorICAgICAgICBpZiAoZU5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFHcm91cCkgew0KKyAgICAgICAgICBQYXJzZURhdGFHcm91cChwWEZBQ2hpbGQsIHBYTUxFbGVtZW50LCBlUGFja2V0SUQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGJOZWVkVmFsdWUpIHsNCisgICAgICAgICAgICBQYXJzZURhdGFWYWx1ZShwWEZBQ2hpbGQsIHBYTUxDaGlsZCwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTEVsZW1lbnQpOw0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6IHsNCisgICAgICAgIElGREVfWE1MQ2hhckRhdGEqIHBYTUxDaGFyRGF0YSA9IChJRkRFX1hNTENoYXJEYXRhKilwWE1MQ2hpbGQ7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYXJEYXRhOw0KKyAgICAgICAgcFhNTENoYXJEYXRhLT5HZXRDaGFyRGF0YSh3c0NoYXJEYXRhKTsNCisgICAgICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX0lzU3RyaW5nQWxsV2hpdGVzcGFjZSh3c0NoYXJEYXRhKSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFhGQUNoaWxkID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQorICAgICAgICBpZiAocFhGQUNoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NoYXJEYXRhKTsNCisgICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOw0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MQ2hhckRhdGEpOw0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KKyAgICAgICAgSUZERV9YTUxUZXh0KiBwWE1MVGV4dCA9IChJRkRFX1hNTFRleHQqKXBYTUxDaGlsZDsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgIHBYTUxUZXh0LT5HZXRUZXh0KHdzVGV4dCk7DQorICAgICAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9Jc1N0cmluZ0FsbFdoaXRlc3BhY2Uod3NUZXh0KSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFhGQUNoaWxkID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQorICAgICAgICBpZiAocFhGQUNoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1RleHQpOw0KKyAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCk7DQorICAgICAgICBwWEZBQ2hpbGQtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxUZXh0KTsNCisgICAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgICB9DQorICAgICAgICBjb250aW51ZTsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOg0KKyAgICAgICAgY29udGludWU7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlRGF0YVZhbHVlKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzVmFsdWVUZXh0QnVmOw0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzQ3VyVmFsdWVUZXh0QnVmOw0KKyAgRlhfQk9PTCBiTWFya0FzQ29tcG91bmQgPSBGQUxTRTsNCisgIElGREVfWE1MTm9kZSogcFhNTEN1clZhbHVlTm9kZSA9IE5VTEw7DQorICBmb3IgKElGREVfWE1MTm9kZSogcFhNTENoaWxkID0NCisgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICBwWE1MQ2hpbGQ7DQorICAgICAgIHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgRkRFX1hNTE5PREVUWVBFIGVOb2RlVHlwZSA9IHBYTUxDaGlsZC0+R2V0VHlwZSgpOw0KKyAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBGWF9CT09MIGJCcmVhayA9IEZBTFNFOw0KKyAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX1RleHQpIHsNCisgICAgICAoKElGREVfWE1MVGV4dCopcFhNTENoaWxkKS0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICAgIGlmICghcFhNTEN1clZhbHVlTm9kZSkgew0KKyAgICAgICAgcFhNTEN1clZhbHVlTm9kZSA9IHBYTUxDaGlsZDsNCisgICAgICB9DQorICAgICAgd3NDdXJWYWx1ZVRleHRCdWYgPDwgd3NUZXh0Ow0KKyAgICB9IGVsc2UgaWYgKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9DaGFyRGF0YSkgew0KKyAgICAgICgoSUZERV9YTUxDaGFyRGF0YSopcFhNTENoaWxkKS0+R2V0Q2hhckRhdGEod3NUZXh0KTsNCisgICAgICBpZiAoIXBYTUxDdXJWYWx1ZU5vZGUpIHsNCisgICAgICAgIHBYTUxDdXJWYWx1ZU5vZGUgPSBwWE1MQ2hpbGQ7DQorICAgICAgfQ0KKyAgICAgIHdzQ3VyVmFsdWVUZXh0QnVmIDw8IHdzVGV4dDsNCisgICAgfSBlbHNlIGlmIChYRkFfUmVjb2duaXplUmljaFRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkKSkgew0KKyNpZmRlZiBYRkFfUEFSU0VfSEFTX0xJTkVJREVOVElGSUVSDQorICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzVGV4dCk7DQorI2Vsc2UNCisgICAgICBYRkFfQ29udmVydFJpY2hUZXh0VG9QbGFpblRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkLCB3c1RleHQpOw0KKyNlbmRpZg0KKyAgICAgIGlmICghcFhNTEN1clZhbHVlTm9kZSkgew0KKyAgICAgICAgcFhNTEN1clZhbHVlTm9kZSA9IHBYTUxDaGlsZDsNCisgICAgICB9DQorICAgICAgd3NDdXJWYWx1ZVRleHRCdWYgPDwgd3NUZXh0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJNYXJrQXNDb21wb3VuZCA9IFRSVUU7DQorICAgICAgaWYgKHBYTUxDdXJWYWx1ZU5vZGUpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0N1clZhbHVlID0gd3NDdXJWYWx1ZVRleHRCdWYuR2V0V2lkZVN0cmluZygpOw0KKyAgICAgICAgaWYgKCF3c0N1clZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBYRkFDaGlsZCA9DQorICAgICAgICAgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKGVQYWNrZXRJRCwgWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCisgICAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMIiIpKTsNCisgICAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0N1clZhbHVlKTsNCisgICAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCk7DQorICAgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTEN1clZhbHVlTm9kZSk7DQorICAgICAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgICAgd3NWYWx1ZVRleHRCdWYgPDwgd3NDdXJWYWx1ZTsNCisgICAgICAgICAgd3NDdXJWYWx1ZVRleHRCdWYuQ2xlYXIoKTsNCiAgICAgICAgIH0NCiAgICAgICAgIHBYTUxDdXJWYWx1ZU5vZGUgPSBOVUxMOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nQyB3c05vZGVWYWx1ZSA9IHdzVmFsdWVUZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsNCi0gICAgcFhGQU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzTm9kZVZhbHVlKTsNCi19DQotdm9pZCBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VJbnN0cnVjdGlvbihDWEZBX05vZGUgKnBYRkFOb2RlLCBJRkRFX1hNTEluc3RydWN0aW9uICpwWE1MSW5zdHJ1Y3Rpb24sIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKQ0KLXsNCi0gICAgaWYoIW1fYkRvY3VtZW50UGFyc2VyKSB7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogcFhGQUNoaWxkID0NCisgICAgICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShlUGFja2V0SUQsIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQorICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQogICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTm9kZVN0cjsNCisgICAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkKS0+R2V0TG9jYWxUYWdOYW1lKHdzTm9kZVN0cik7DQorICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTm9kZVN0cik7DQorICAgICAgUGFyc2VEYXRhVmFsdWUocFhGQUNoaWxkLCBwWE1MQ2hpbGQsIGVQYWNrZXRJRCk7DQorICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCk7DQorICAgICAgcFhGQUNoaWxkLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MQ2hpbGQpOw0KKyAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDdXJWYWx1ZSA9IHBYRkFDaGlsZC0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSk7DQorICAgICAgd3NWYWx1ZVRleHRCdWYgPDwgd3NDdXJWYWx1ZTsNCiAgICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1RhcmdldE5hbWU7DQotICAgIHBYTUxJbnN0cnVjdGlvbi0+R2V0VGFyZ2V0TmFtZSh3c1RhcmdldE5hbWUpOw0KLSAgICBpbnQzMl90IGlEYXRhQ291bnQgPSBwWE1MSW5zdHJ1Y3Rpb24tPkNvdW50RGF0YSgpOw0KLSAgICBpZiAod3NUYXJnZXROYW1lID09IEZYX1dTVFJDKEwib3JpZ2luYWxYRkFWZXJzaW9uIikpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YTsNCi0gICAgICAgIGlmKHBYTUxJbnN0cnVjdGlvbi0+R2V0RGF0YSgwLCB3c0RhdGEpICYmIChwWEZBTm9kZS0+R2V0RG9jdW1lbnQoKS0+UmVjb2duaXplWEZBVmVyc2lvbk51bWJlcih3c0RhdGEpICE9IFhGQV9WRVJTSU9OX1VOS05PV04pKSB7DQotICAgICAgICAgICAgd3NEYXRhLkVtcHR5KCk7DQotICAgICAgICAgICAgaWYgKHBYTUxJbnN0cnVjdGlvbi0+R2V0RGF0YSgxLCB3c0RhdGEpICYmIHdzRGF0YSA9PSBGWF9XU1RSQyhMInYyLjctc2NyaXB0aW5nOjEiKSkgew0KLSAgICAgICAgICAgICAgICBwWEZBTm9kZS0+R2V0RG9jdW1lbnQoKS0+U2V0RmxhZyhYRkFfRE9DRkxBR19TY3JpcHRpbmcsIFRSVUUpOw0KLSAgICAgICAgICAgIH0NCisgIH0NCisgIGlmIChwWE1MQ3VyVmFsdWVOb2RlKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0N1clZhbHVlID0gd3NDdXJWYWx1ZVRleHRCdWYuR2V0V2lkZVN0cmluZygpOw0KKyAgICBpZiAoIXdzQ3VyVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgaWYgKGJNYXJrQXNDb21wb3VuZCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwWEZBQ2hpbGQgPQ0KKyAgICAgICAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoZVBhY2tldElELCBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KKyAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybjsNCiAgICAgICAgIH0NCi0gICAgfSBlbHNlIGlmICh3c1RhcmdldE5hbWUgPT0gRlhfV1NUUkMoTCJhY3JvYmF0IikpIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YTsNCi0gICAgICAgIGlmIChwWE1MSW5zdHJ1Y3Rpb24tPkdldERhdGEoMCwgd3NEYXRhKSAmJiB3c0RhdGEgPT0gRlhfV1NUUkMoTCJKYXZhU2NyaXB0IikpIHsNCi0gICAgICAgICAgICBpZiAocFhNTEluc3RydWN0aW9uLT5HZXREYXRhKDEsIHdzRGF0YSkgJiYgd3NEYXRhID09IEZYX1dTVFJDKEwic3RyaWN0U2NvcGluZyIpKSB7DQotICAgICAgICAgICAgICAgIHBYRkFOb2RlLT5HZXREb2N1bWVudCgpLT5TZXRGbGFnKFhGQV9ET0NGTEFHX1N0cmljdFNjb3BpbmcsIFRSVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMIiIpKTsNCisgICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDdXJWYWx1ZSk7DQorICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCisgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTEN1clZhbHVlTm9kZSk7DQorICAgICAgICBwWEZBQ2hpbGQtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkLCBUUlVFLCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICAgIHdzVmFsdWVUZXh0QnVmIDw8IHdzQ3VyVmFsdWU7DQorICAgICAgd3NDdXJWYWx1ZVRleHRCdWYuQ2xlYXIoKTsNCiAgICAgfQ0KKyAgICBwWE1MQ3VyVmFsdWVOb2RlID0gTlVMTDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nQyB3c05vZGVWYWx1ZSA9IHdzVmFsdWVUZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsNCisgIHBYRkFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c05vZGVWYWx1ZSk7DQogfQ0KLXZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OkNsb3NlUGFyc2VyKCkNCi17DQotICAgIGlmIChtX3BYTUxEb2MpIHsNCi0gICAgICAgIG1fcFhNTERvYy0+UmVsZWFzZSgpOw0KLSAgICAgICAgbV9wWE1MRG9jID0gTlVMTDsNCit2b2lkIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUluc3RydWN0aW9uKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTEluc3RydWN0aW9uKiBwWE1MSW5zdHJ1Y3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgaWYgKCFtX2JEb2N1bWVudFBhcnNlcikgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RhcmdldE5hbWU7DQorICBwWE1MSW5zdHJ1Y3Rpb24tPkdldFRhcmdldE5hbWUod3NUYXJnZXROYW1lKTsNCisgIGludDMyX3QgaURhdGFDb3VudCA9IHBYTUxJbnN0cnVjdGlvbi0+Q291bnREYXRhKCk7DQorICBpZiAod3NUYXJnZXROYW1lID09IEZYX1dTVFJDKEwib3JpZ2luYWxYRkFWZXJzaW9uIikpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRhOw0KKyAgICBpZiAocFhNTEluc3RydWN0aW9uLT5HZXREYXRhKDAsIHdzRGF0YSkgJiYNCisgICAgICAgIChwWEZBTm9kZS0+R2V0RG9jdW1lbnQoKS0+UmVjb2duaXplWEZBVmVyc2lvbk51bWJlcih3c0RhdGEpICE9DQorICAgICAgICAgWEZBX1ZFUlNJT05fVU5LTk9XTikpIHsNCisgICAgICB3c0RhdGEuRW1wdHkoKTsNCisgICAgICBpZiAocFhNTEluc3RydWN0aW9uLT5HZXREYXRhKDEsIHdzRGF0YSkgJiYNCisgICAgICAgICAgd3NEYXRhID09IEZYX1dTVFJDKEwidjIuNy1zY3JpcHRpbmc6MSIpKSB7DQorICAgICAgICBwWEZBTm9kZS0+R2V0RG9jdW1lbnQoKS0+U2V0RmxhZyhYRkFfRE9DRkxBR19TY3JpcHRpbmcsIFRSVUUpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAobV9wU3RyZWFtKSB7DQotICAgICAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCi0gICAgICAgIG1fcFN0cmVhbSA9IE5VTEw7DQorICB9IGVsc2UgaWYgKHdzVGFyZ2V0TmFtZSA9PSBGWF9XU1RSQyhMImFjcm9iYXQiKSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGE7DQorICAgIGlmIChwWE1MSW5zdHJ1Y3Rpb24tPkdldERhdGEoMCwgd3NEYXRhKSAmJg0KKyAgICAgICAgd3NEYXRhID09IEZYX1dTVFJDKEwiSmF2YVNjcmlwdCIpKSB7DQorICAgICAgaWYgKHBYTUxJbnN0cnVjdGlvbi0+R2V0RGF0YSgxLCB3c0RhdGEpICYmDQorICAgICAgICAgIHdzRGF0YSA9PSBGWF9XU1RSQyhMInN0cmljdFNjb3BpbmciKSkgew0KKyAgICAgICAgcFhGQU5vZGUtPkdldERvY3VtZW50KCktPlNldEZsYWcoWEZBX0RPQ0ZMQUdfU3RyaWN0U2NvcGluZywgVFJVRSk7DQorICAgICAgfQ0KICAgICB9DQorICB9DQogfQ0KLUlYRkFfRG9jUGFyc2VyKiBJWEZBX0RvY1BhcnNlcjo6Q3JlYXRlKElYRkFfTm90aWZ5ICpwTm90aWZ5KQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDWEZBX0RvY3VtZW50UGFyc2VyKHBOb3RpZnkpOw0KK3ZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OkNsb3NlUGFyc2VyKCkgew0KKyAgaWYgKG1fcFhNTERvYykgew0KKyAgICBtX3BYTUxEb2MtPlJlbGVhc2UoKTsNCisgICAgbV9wWE1MRG9jID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BTdHJlYW0pIHsNCisgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQorICAgIG1fcFN0cmVhbSA9IE5VTEw7DQorICB9DQogfQ0KLUNYRkFfRG9jdW1lbnRQYXJzZXI6OkNYRkFfRG9jdW1lbnRQYXJzZXIoSVhGQV9Ob3RpZnkgKnBOb3RpZnkpDQotICAgIDogbV9wTm90aWZ5KHBOb3RpZnkpDQotICAgICwgbV9ub2RlUGFyc2VyKE5VTEwsIFRSVUUpDQotICAgICwgbV9wRG9jdW1lbnQoTlVMTCkNCi17DQorSVhGQV9Eb2NQYXJzZXIqIElYRkFfRG9jUGFyc2VyOjpDcmVhdGUoSVhGQV9Ob3RpZnkqIHBOb3RpZnkpIHsNCisgIHJldHVybiBGWF9ORVcgQ1hGQV9Eb2N1bWVudFBhcnNlcihwTm90aWZ5KTsNCiB9DQotQ1hGQV9Eb2N1bWVudFBhcnNlcjo6fkNYRkFfRG9jdW1lbnRQYXJzZXIoKQ0KLXsNCi0gICAgQ2xvc2VQYXJzZXIoKTsNCitDWEZBX0RvY3VtZW50UGFyc2VyOjpDWEZBX0RvY3VtZW50UGFyc2VyKElYRkFfTm90aWZ5KiBwTm90aWZ5KQ0KKyAgICA6IG1fcE5vdGlmeShwTm90aWZ5KSwgbV9ub2RlUGFyc2VyKE5VTEwsIFRSVUUpLCBtX3BEb2N1bWVudChOVUxMKSB7fQ0KK0NYRkFfRG9jdW1lbnRQYXJzZXI6On5DWEZBX0RvY3VtZW50UGFyc2VyKCkgew0KKyAgQ2xvc2VQYXJzZXIoKTsNCiB9DQotaW50MzJfdCBDWEZBX0RvY3VtZW50UGFyc2VyOjpTdGFydFBhcnNlKElGWF9GaWxlUmVhZCAqcFN0cmVhbSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQgKQ0KLXsNCi0gICAgQ2xvc2VQYXJzZXIoKTsNCi0gICAgaW50MzJfdCBuUmV0U3RhdHVzID0gbV9ub2RlUGFyc2VyLlN0YXJ0UGFyc2UocFN0cmVhbSwgZVBhY2tldElEKTsNCi0gICAgaWYoblJldFN0YXR1cyA9PSBYRkFfUEFSU0VTVEFUVVNfUmVhZHkpIHsNCi0gICAgICAgIG1fcERvY3VtZW50ID0gRlhfTkVXIENYRkFfRG9jdW1lbnQodGhpcyk7DQotICAgICAgICBtX25vZGVQYXJzZXIuU2V0RmFjdG9yeShtX3BEb2N1bWVudCk7DQotICAgIH0NCi0gICAgcmV0dXJuIG5SZXRTdGF0dXM7DQoraW50MzJfdCBDWEZBX0RvY3VtZW50UGFyc2VyOjpTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpIHsNCisgIENsb3NlUGFyc2VyKCk7DQorICBpbnQzMl90IG5SZXRTdGF0dXMgPSBtX25vZGVQYXJzZXIuU3RhcnRQYXJzZShwU3RyZWFtLCBlUGFja2V0SUQpOw0KKyAgaWYgKG5SZXRTdGF0dXMgPT0gWEZBX1BBUlNFU1RBVFVTX1JlYWR5KSB7DQorICAgIG1fcERvY3VtZW50ID0gRlhfTkVXIENYRkFfRG9jdW1lbnQodGhpcyk7DQorICAgIG1fbm9kZVBhcnNlci5TZXRGYWN0b3J5KG1fcERvY3VtZW50KTsNCisgIH0NCisgIHJldHVybiBuUmV0U3RhdHVzOw0KIH0NCi1pbnQzMl90IENYRkFfRG9jdW1lbnRQYXJzZXI6OkRvUGFyc2UoSUZYX1BhdXNlICpwUGF1c2UgKQ0KLXsNCi0gICAgaW50MzJfdCBuUmV0U3RhdHVzID0gbV9ub2RlUGFyc2VyLkRvUGFyc2UocFBhdXNlKTsNCi0gICAgaWYgKG5SZXRTdGF0dXMgPj0gWEZBX1BBUlNFU1RBVFVTX0RvbmUpIHsNCi0gICAgICAgIEZYU1lTX2Fzc2VydChtX3BEb2N1bWVudCk7DQotICAgICAgICBtX3BEb2N1bWVudC0+U2V0Um9vdChtX25vZGVQYXJzZXIuR2V0Um9vdE5vZGUoKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIG5SZXRTdGF0dXM7DQoraW50MzJfdCBDWEZBX0RvY3VtZW50UGFyc2VyOjpEb1BhcnNlKElGWF9QYXVzZSogcFBhdXNlKSB7DQorICBpbnQzMl90IG5SZXRTdGF0dXMgPSBtX25vZGVQYXJzZXIuRG9QYXJzZShwUGF1c2UpOw0KKyAgaWYgKG5SZXRTdGF0dXMgPj0gWEZBX1BBUlNFU1RBVFVTX0RvbmUpIHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcERvY3VtZW50KTsNCisgICAgbV9wRG9jdW1lbnQtPlNldFJvb3QobV9ub2RlUGFyc2VyLkdldFJvb3ROb2RlKCkpOw0KKyAgfQ0KKyAgcmV0dXJuIG5SZXRTdGF0dXM7DQogfQ0KLWludDMyX3QgQ1hGQV9Eb2N1bWVudFBhcnNlcjo6UGFyc2VYTUxEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1hNTCwgSUZERV9YTUxOb2RlKiAmcFhNTE5vZGUsIElGWF9QYXVzZSAqcFBhdXNlKQ0KLXsNCi0gICAgQ2xvc2VQYXJzZXIoKTsNCi0gICAgaW50MzJfdCBuUmV0U3RhdHVzID0gbV9ub2RlUGFyc2VyLlBhcnNlWE1MRGF0YSh3c1hNTCwgcFhNTE5vZGUsIE5VTEwpOw0KLSAgICBpZihuUmV0U3RhdHVzID09IFhGQV9QQVJTRVNUQVRVU19Eb25lICYmIHBYTUxOb2RlKSB7DQotICAgICAgICBtX3BEb2N1bWVudCA9IEZYX05FVyBDWEZBX0RvY3VtZW50KHRoaXMpOw0KLSAgICAgICAgbV9ub2RlUGFyc2VyLlNldEZhY3RvcnkobV9wRG9jdW1lbnQpOw0KLSAgICB9DQotICAgIHJldHVybiBuUmV0U3RhdHVzOw0KK2ludDMyX3QgQ1hGQV9Eb2N1bWVudFBhcnNlcjo6UGFyc2VYTUxEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqJiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgQ2xvc2VQYXJzZXIoKTsNCisgIGludDMyX3QgblJldFN0YXR1cyA9IG1fbm9kZVBhcnNlci5QYXJzZVhNTERhdGEod3NYTUwsIHBYTUxOb2RlLCBOVUxMKTsNCisgIGlmIChuUmV0U3RhdHVzID09IFhGQV9QQVJTRVNUQVRVU19Eb25lICYmIHBYTUxOb2RlKSB7DQorICAgIG1fcERvY3VtZW50ID0gRlhfTkVXIENYRkFfRG9jdW1lbnQodGhpcyk7DQorICAgIG1fbm9kZVBhcnNlci5TZXRGYWN0b3J5KG1fcERvY3VtZW50KTsNCisgIH0NCisgIHJldHVybiBuUmV0U3RhdHVzOw0KIH0NCi12b2lkIENYRkFfRG9jdW1lbnRQYXJzZXI6OkNvbnN0cnVjdFhGQU5vZGUoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSkNCi17DQotICAgIGlmICghcFhGQU5vZGUgfHwgIXBYTUxOb2RlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgbV9ub2RlUGFyc2VyLkNvbnN0cnVjdFhGQU5vZGUocFhGQU5vZGUsIHBYTUxOb2RlKTsNCi0gICAgQ1hGQV9Ob2RlKiBwUm9vdE5vZGUgPSBtX25vZGVQYXJzZXIuR2V0Um9vdE5vZGUoKTsNCi0gICAgaWYgKG1fcERvY3VtZW50ICYmIHBSb290Tm9kZSkgew0KLSAgICAgICAgbV9wRG9jdW1lbnQtPlNldFJvb3QocFJvb3ROb2RlKTsNCi0gICAgfQ0KK3ZvaWQgQ1hGQV9Eb2N1bWVudFBhcnNlcjo6Q29uc3RydWN0WEZBTm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlKSB7DQorICBpZiAoIXBYRkFOb2RlIHx8ICFwWE1MTm9kZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX25vZGVQYXJzZXIuQ29uc3RydWN0WEZBTm9kZShwWEZBTm9kZSwgcFhNTE5vZGUpOw0KKyAgQ1hGQV9Ob2RlKiBwUm9vdE5vZGUgPSBtX25vZGVQYXJzZXIuR2V0Um9vdE5vZGUoKTsNCisgIGlmIChtX3BEb2N1bWVudCAmJiBwUm9vdE5vZGUpIHsNCisgICAgbV9wRG9jdW1lbnQtPlNldFJvb3QocFJvb3ROb2RlKTsNCisgIH0NCiB9DQotdm9pZCBDWEZBX0RvY3VtZW50UGFyc2VyOjpDbG9zZVBhcnNlcigpDQotew0KLSAgICBpZiAobV9wRG9jdW1lbnQpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BEb2N1bWVudDsNCi0gICAgICAgIG1fcERvY3VtZW50ID0gTlVMTDsNCi0gICAgfQ0KLSAgICBtX25vZGVQYXJzZXIuQ2xvc2VQYXJzZXIoKTsNCit2b2lkIENYRkFfRG9jdW1lbnRQYXJzZXI6OkNsb3NlUGFyc2VyKCkgew0KKyAgaWYgKG1fcERvY3VtZW50KSB7DQorICAgIGRlbGV0ZSBtX3BEb2N1bWVudDsNCisgICAgbV9wRG9jdW1lbnQgPSBOVUxMOw0KKyAgfQ0KKyAgbV9ub2RlUGFyc2VyLkNsb3NlUGFyc2VyKCk7DQogfQ0KLUNYRkFfWE1MUGFyc2VyOjpDWEZBX1hNTFBhcnNlcihJRkRFX1hNTE5vZGUgKnBSb290LCBJRlhfU3RyZWFtICpwU3RyZWFtKQ0KLSAgICA6IG1fcFJvb3QocFJvb3QpDQotICAgICwgbV9wU3RyZWFtKHBTdHJlYW0pDQotICAgICwgbV9wUGFyc2VyKE5VTEwpDQotICAgICwgbV9kd1N0YXR1cyhGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUpDQotICAgICwgbV9wUGFyZW50KHBSb290KQ0KLSAgICAsIG1fcENoaWxkKE5VTEwpDQotICAgICwgbV9Ob2RlU3RhY2soMTYpDQotICAgICwgbV93czEoKQ0KLSAgICAsIG1fd3MyKCkNCitDWEZBX1hNTFBhcnNlcjo6Q1hGQV9YTUxQYXJzZXIoSUZERV9YTUxOb2RlKiBwUm9vdCwgSUZYX1N0cmVhbSogcFN0cmVhbSkNCisgICAgOiBtX3BSb290KHBSb290KSwNCisgICAgICBtX3BTdHJlYW0ocFN0cmVhbSksDQorICAgICAgbV9wUGFyc2VyKE5VTEwpLA0KKyAgICAgIG1fZHdTdGF0dXMoRkRFX1hNTFNZTlRBWFNUQVRVU19Ob25lKSwNCisgICAgICBtX3BQYXJlbnQocFJvb3QpLA0KKyAgICAgIG1fcENoaWxkKE5VTEwpLA0KKyAgICAgIG1fTm9kZVN0YWNrKDE2KSwNCisgICAgICBtX3dzMSgpLA0KKyAgICAgIG1fd3MyKCkNCiAjaWZkZWYgX1hGQV9WRVJJRllfQ2hlY2tzdW1fDQotICAgICwgbV9uRWxlbWVudFN0YXJ0KDApDQotICAgICwgbV9kd0NoZWNrU3RhdHVzKDApDQotICAgICwgbV9kd0N1cnJlbnRDaGVja1N0YXR1cygwKQ0KKyAgICAgICwNCisgICAgICBtX25FbGVtZW50U3RhcnQoMCksDQorICAgICAgbV9kd0NoZWNrU3RhdHVzKDApLA0KKyAgICAgIG1fZHdDdXJyZW50Q2hlY2tTdGF0dXMoMCkNCiAjZW5kaWYNCiB7DQotICAgIEFTU0VSVChtX3BQYXJlbnQgJiYgbV9wU3RyZWFtKTsNCi0gICAgbV9Ob2RlU3RhY2suUHVzaChtX3BQYXJlbnQpOw0KLSAgICBtX3BQYXJzZXIgPSBJRkRFX1hNTFN5bnRheFBhcnNlcjo6Q3JlYXRlKCk7DQotICAgIG1fcFBhcnNlci0+SW5pdChtX3BTdHJlYW0sIDMyICogMTAyNCwgMTAyNCAqIDEwMjQpOw0KKyAgQVNTRVJUKG1fcFBhcmVudCAmJiBtX3BTdHJlYW0pOw0KKyAgbV9Ob2RlU3RhY2suUHVzaChtX3BQYXJlbnQpOw0KKyAgbV9wUGFyc2VyID0gSUZERV9YTUxTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KKyAgbV9wUGFyc2VyLT5Jbml0KG1fcFN0cmVhbSwgMzIgKiAxMDI0LCAxMDI0ICogMTAyNCk7DQogfQ0KLUNYRkFfWE1MUGFyc2VyOjp+Q1hGQV9YTUxQYXJzZXIoKQ0KLXsNCi0gICAgaWYgKG1fcFBhcnNlcikgew0KLSAgICAgICAgbV9wUGFyc2VyLT5SZWxlYXNlKCk7DQotICAgIH0NCi0gICAgbV9Ob2RlU3RhY2suUmVtb3ZlQWxsKCk7DQotICAgIG1fd3MxLkVtcHR5KCk7DQotICAgIG1fd3MyLkVtcHR5KCk7DQorQ1hGQV9YTUxQYXJzZXI6On5DWEZBX1hNTFBhcnNlcigpIHsNCisgIGlmIChtX3BQYXJzZXIpIHsNCisgICAgbV9wUGFyc2VyLT5SZWxlYXNlKCk7DQorICB9DQorICBtX05vZGVTdGFjay5SZW1vdmVBbGwoKTsNCisgIG1fd3MxLkVtcHR5KCk7DQorICBtX3dzMi5FbXB0eSgpOw0KIH0NCi1pbnQzMl90IENYRkFfWE1MUGFyc2VyOjpEb1BhcnNlcihJRlhfUGF1c2UgKnBQYXVzZSkNCi17DQotICAgIGlmIChtX2R3U3RhdHVzID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3IpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBpZiAobV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUykgew0KLSAgICAgICAgcmV0dXJuIDEwMDsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlDb3VudCA9IDA7DQotICAgIHdoaWxlIChUUlVFKSB7DQotICAgICAgICBtX2R3U3RhdHVzID0gbV9wUGFyc2VyLT5Eb1N5bnRheFBhcnNlKCk7DQotICAgICAgICBzd2l0Y2ggKG1fZHdTdGF0dXMpIHsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25PcGVuOg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25DbG9zZToNCi0gICAgICAgICAgICAgICAgaWYgKG1fcENoaWxkKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudE9wZW46DQotI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KLSAgICAgICAgICAgICAgICBpZiAobV9kd0NoZWNrU3RhdHVzICE9IDB4MDMgJiYgbV9Ob2RlU3RhY2suR2V0U2l6ZSgpID09IDIpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fbkVsZW1lbnRTdGFydCA9IG1fcFBhcnNlci0+R2V0Q3VycmVudFBvcygpIC0gMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudEJyZWFrOg0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudENsb3NlOg0KLSAgICAgICAgICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0VGFnTmFtZShtX3dzMSk7DQotICAgICAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BDaGlsZCktPkdldFRhZ05hbWUobV93czIpOw0KLSAgICAgICAgICAgICAgICBpZiAobV93czEuR2V0TGVuZ3RoKCkgPiAwICYmICFtX3dzMS5FcXVhbChtX3dzMikpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV9Ob2RlU3RhY2suUG9wKCk7DQotICAgICAgICAgICAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPCAxKSB7DQotICAgICAgICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2R3Q3VycmVudENoZWNrU3RhdHVzICE9IDAgJiYgbV9Ob2RlU3RhY2suR2V0U2l6ZSgpID09IDIpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fblNpemVbbV9kd0N1cnJlbnRDaGVja1N0YXR1cyAtIDFdID0gbV9wUGFyc2VyLT5HZXRDdXJyZW50QmluYXJ5UG9zKCkgLSBtX25TdGFydFttX2R3Q3VycmVudENoZWNrU3RhdHVzIC0gMV07DQotICAgICAgICAgICAgICAgICAgICBtX2R3Q3VycmVudENoZWNrU3RhdHVzID0gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSNlbmRpZg0KLSAgICAgICAgICAgICAgICBtX3BQYXJlbnQgPSAoSUZERV9YTUxOb2RlKikqbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCi0gICAgICAgICAgICAgICAgaUNvdW50Kys7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXROYW1lOg0KLSAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUobV93czEpOw0KLSAgICAgICAgICAgICAgICBpZiAobV93czEgPT0gRlhfV1NUUkMoTCJvcmlnaW5hbFhGQVZlcnNpb24iKSB8fCBtX3dzMSA9PSBGWF9XU1RSQyhMImFjcm9iYXQiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBJRkRFX1hNTEluc3RydWN0aW9uOjpDcmVhdGUobV93czEpOw0KLSAgICAgICAgICAgICAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1fd3MxLkVtcHR5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYWdOYW1lOg0KLSAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldFRhZ05hbWUobV93czEpOw0KLSAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KLSAgICAgICAgICAgICAgICBtX05vZGVTdGFjay5QdXNoKG1fcENoaWxkKTsNCi0gICAgICAgICAgICAgICAgbV9wUGFyZW50ID0gbV9wQ2hpbGQ7DQotI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KLSAgICAgICAgICAgICAgICBpZiAobV9kd0NoZWNrU3RhdHVzICE9IDB4MDMgJiYgbV9Ob2RlU3RhY2suR2V0U2l6ZSgpID09IDMpIHsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGFnOw0KLSAgICAgICAgICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcENoaWxkKS0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICh3c1RhZyA9PSBGWF9XU1RSQyhMInRlbXBsYXRlIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3Q2hlY2tTdGF0dXMgfD0gMHgwMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3Q3VycmVudENoZWNrU3RhdHVzID0gMHgwMTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX25TdGFydFswXSA9IG1fcFBhcnNlci0+R2V0Q3VycmVudEJpbmFyeVBvcygpIC0gKG1fcFBhcnNlci0+R2V0Q3VycmVudFBvcygpIC0gbV9uRWxlbWVudFN0YXJ0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod3NUYWcgPT0gRlhfV1NUUkMoTCJkYXRhc2V0cyIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0NoZWNrU3RhdHVzIHw9IDB4MDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0N1cnJlbnRDaGVja1N0YXR1cyA9IDB4MDI7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9uU3RhcnRbMV0gPSBtX3BQYXJzZXItPkdldEN1cnJlbnRCaW5hcnlQb3MoKSAtIChtX3BQYXJzZXItPkdldEN1cnJlbnRQb3MoKSAtIG1fbkVsZW1lbnRTdGFydCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0jZW5kaWYNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpTmFtZToNCi0gICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpVmFsdWU6DQotICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MyKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wQ2hpbGQpLT5TZXRTdHJpbmcobV93czEsIG1fd3MyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtX3dzMS5FbXB0eSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGV4dDoNCi0gICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUZXh0RGF0YShtX3dzMSk7DQotICAgICAgICAgICAgICAgIG1fcENoaWxkID0gSUZERV9YTUxUZXh0OjpDcmVhdGUobV93czEpOw0KLSAgICAgICAgICAgICAgICBtX3BQYXJlbnQtPkluc2VydENoaWxkTm9kZShtX3BDaGlsZCk7DQotICAgICAgICAgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfQ0RhdGE6DQotICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0VGV4dERhdGEobV93czEpOw0KLSAgICAgICAgICAgICAgICBtX3BDaGlsZCA9IElGREVfWE1MQ2hhckRhdGE6OkNyZWF0ZShtX3dzMSk7DQotICAgICAgICAgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCi0gICAgICAgICAgICAgICAgbV9wQ2hpbGQgPSBtX3BQYXJlbnQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOg0KLSAgICAgICAgICAgICAgICBpZiAobV9wQ2hpbGQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1fd3MxLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoSUZERV9YTUxJbnN0cnVjdGlvbiopbV9wQ2hpbGQpLT5BcHBlbmREYXRhKG1fd3MxKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+R2V0VGFyZ2V0RGF0YShtX3dzMSk7DQotICAgICAgICAgICAgICAgICAgICAoKElGREVfWE1MSW5zdHJ1Y3Rpb24qKW1fcENoaWxkKS0+QXBwZW5kRGF0YShtX3dzMSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbV93czEuRW1wdHkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZiAobV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yIHx8IG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MpIHsNCitpbnQzMl90IENYRkFfWE1MUGFyc2VyOjpEb1BhcnNlcihJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgaWYgKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcikgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpZiAobV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUykgew0KKyAgICByZXR1cm4gMTAwOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgd2hpbGUgKFRSVUUpIHsNCisgICAgbV9kd1N0YXR1cyA9IG1fcFBhcnNlci0+RG9TeW50YXhQYXJzZSgpOw0KKyAgICBzd2l0Y2ggKG1fZHdTdGF0dXMpIHsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25PcGVuOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0luc3RydWN0aW9uQ2xvc2U6DQorICAgICAgICBpZiAobV9wQ2hpbGQpIHsNCisgICAgICAgICAgaWYgKG1fcENoaWxkLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCiAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KICAgICAgICAgfQ0KLSAgICAgICAgaWYgKHBQYXVzZSAhPSBOVUxMICYmIGlDb3VudCA+IDUwMCAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCisgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRPcGVuOg0KKyNpZmRlZiBfWEZBX1ZFUklGWV9DaGVja3N1bV8NCisgICAgICAgIGlmIChtX2R3Q2hlY2tTdGF0dXMgIT0gMHgwMyAmJiBtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMikgew0KKyAgICAgICAgICBtX25FbGVtZW50U3RhcnQgPSBtX3BQYXJzZXItPkdldEN1cnJlbnRQb3MoKSAtIDE7DQorICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudEJyZWFrOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRDbG9zZToNCisgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUYWdOYW1lKG1fd3MxKTsNCisgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BDaGlsZCktPkdldFRhZ05hbWUobV93czIpOw0KKyAgICAgICAgaWYgKG1fd3MxLkdldExlbmd0aCgpID4gMCAmJiAhbV93czEuRXF1YWwobV93czIpKSB7DQorICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG1fTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgICAgaWYgKG1fTm9kZVN0YWNrLkdldFNpemUoKSA8IDEpIHsNCisgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyNpZmRlZiBfWEZBX1ZFUklGWV9DaGVja3N1bV8NCisgICAgICAgIGVsc2UgaWYgKG1fZHdDdXJyZW50Q2hlY2tTdGF0dXMgIT0gMCAmJiBtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMikgew0KKyAgICAgICAgICBtX25TaXplW21fZHdDdXJyZW50Q2hlY2tTdGF0dXMgLSAxXSA9DQorICAgICAgICAgICAgICBtX3BQYXJzZXItPkdldEN1cnJlbnRCaW5hcnlQb3MoKSAtDQorICAgICAgICAgICAgICBtX25TdGFydFttX2R3Q3VycmVudENoZWNrU3RhdHVzIC0gMV07DQorICAgICAgICAgIG1fZHdDdXJyZW50Q2hlY2tTdGF0dXMgPSAwOw0KKyAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgICAgbV9wUGFyZW50ID0gKElGREVfWE1MTm9kZSopKm1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KKyAgICAgICAgaUNvdW50Kys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0TmFtZToNCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGFyZ2V0TmFtZShtX3dzMSk7DQorICAgICAgICBpZiAobV93czEgPT0gRlhfV1NUUkMoTCJvcmlnaW5hbFhGQVZlcnNpb24iKSB8fA0KKyAgICAgICAgICAgIG1fd3MxID09IEZYX1dTVFJDKEwiYWNyb2JhdCIpKSB7DQorICAgICAgICAgIG1fcENoaWxkID0gSUZERV9YTUxJbnN0cnVjdGlvbjo6Q3JlYXRlKG1fd3MxKTsNCisgICAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgbV9wQ2hpbGQgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV93czEuRW1wdHkoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYWdOYW1lOg0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUYWdOYW1lKG1fd3MxKTsNCisgICAgICAgIG1fcENoaWxkID0gSUZERV9YTUxFbGVtZW50OjpDcmVhdGUobV93czEpOw0KKyAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KKyAgICAgICAgbV9Ob2RlU3RhY2suUHVzaChtX3BDaGlsZCk7DQorICAgICAgICBtX3BQYXJlbnQgPSBtX3BDaGlsZDsNCisjaWZkZWYgX1hGQV9WRVJJRllfQ2hlY2tzdW1fDQorICAgICAgICBpZiAobV9kd0NoZWNrU3RhdHVzICE9IDB4MDMgJiYgbV9Ob2RlU3RhY2suR2V0U2l6ZSgpID09IDMpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWc7DQorICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BDaGlsZCktPkdldExvY2FsVGFnTmFtZSh3c1RhZyk7DQorICAgICAgICAgIGlmICh3c1RhZyA9PSBGWF9XU1RSQyhMInRlbXBsYXRlIikpIHsNCisgICAgICAgICAgICBtX2R3Q2hlY2tTdGF0dXMgfD0gMHgwMTsNCisgICAgICAgICAgICBtX2R3Q3VycmVudENoZWNrU3RhdHVzID0gMHgwMTsNCisgICAgICAgICAgICBtX25TdGFydFswXSA9IG1fcFBhcnNlci0+R2V0Q3VycmVudEJpbmFyeVBvcygpIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3BQYXJzZXItPkdldEN1cnJlbnRQb3MoKSAtIG1fbkVsZW1lbnRTdGFydCk7DQorICAgICAgICAgIH0gZWxzZSBpZiAod3NUYWcgPT0gRlhfV1NUUkMoTCJkYXRhc2V0cyIpKSB7DQorICAgICAgICAgICAgbV9kd0NoZWNrU3RhdHVzIHw9IDB4MDI7DQorICAgICAgICAgICAgbV9kd0N1cnJlbnRDaGVja1N0YXR1cyA9IDB4MDI7DQorICAgICAgICAgICAgbV9uU3RhcnRbMV0gPSBtX3BQYXJzZXItPkdldEN1cnJlbnRCaW5hcnlQb3MoKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAobV9wUGFyc2VyLT5HZXRDdXJyZW50UG9zKCkgLSBtX25FbGVtZW50U3RhcnQpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlOYW1lOg0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MxKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaVZhbHVlOg0KKyAgICAgICAgaWYgKG1fcENoaWxkKSB7DQorICAgICAgICAgIG1fcFBhcnNlci0+R2V0QXR0cmlidXRlTmFtZShtX3dzMik7DQorICAgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wQ2hpbGQpLT5TZXRTdHJpbmcobV93czEsIG1fd3MyKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgbV93czEuRW1wdHkoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UZXh0Og0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUZXh0RGF0YShtX3dzMSk7DQorICAgICAgICBtX3BDaGlsZCA9IElGREVfWE1MVGV4dDo6Q3JlYXRlKG1fd3MxKTsNCisgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCisgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0NEYXRhOg0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUZXh0RGF0YShtX3dzMSk7DQorICAgICAgICBtX3BDaGlsZCA9IElGREVfWE1MQ2hhckRhdGE6OkNyZWF0ZShtX3dzMSk7DQorICAgICAgICBtX3BQYXJlbnQtPkluc2VydENoaWxkTm9kZShtX3BDaGlsZCk7DQorICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOg0KKyAgICAgICAgaWYgKG1fcENoaWxkKSB7DQorICAgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQogICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCFtX3dzMS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAoKElGREVfWE1MSW5zdHJ1Y3Rpb24qKW1fcENoaWxkKS0+QXBwZW5kRGF0YShtX3dzMSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUYXJnZXREYXRhKG1fd3MxKTsNCisgICAgICAgICAgKChJRkRFX1hNTEluc3RydWN0aW9uKiltX3BDaGlsZCktPkFwcGVuZERhdGEobV93czEpOw0KICAgICAgICAgfQ0KKyAgICAgICAgbV93czEuRW1wdHkoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICByZXR1cm4gKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvciB8fCBtX05vZGVTdGFjay5HZXRTaXplKCkgIT0gMSkgPyAtMSA6IG1fcFBhcnNlci0+R2V0U3RhdHVzKCk7DQorICAgIGlmIChtX2R3U3RhdHVzID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3IgfHwNCisgICAgICAgIG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAocFBhdXNlICE9IE5VTEwgJiYgaUNvdW50ID4gNTAwICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvciB8fCBtX05vZGVTdGFjay5HZXRTaXplKCkgIT0gMSkNCisgICAgICAgICAgICAgPyAtMQ0KKyAgICAgICAgICAgICA6IG1fcFBhcnNlci0+R2V0U3RhdHVzKCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9wYXJzZXJfaW1wLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcC5oCmluZGV4IGNkZmJlNzAuLjllZTQwMGYgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9wYXJzZXJfaW1wLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3BhcnNlcl9pbXAuaApAQCAtOCwxMzAgKzgsMTI4IEBACiAjZGVmaW5lIF9YRkFfUEFSU0VSX0lNUA0KICNkZWZpbmUgX1hGQV9WRVJJRllfQ2hlY2tzdW1fDQogY2xhc3MgQ1hGQV9YTUxQYXJzZXI7DQotY2xhc3MgQ1hGQV9TaW1wbGVQYXJzZXIgOiBwdWJsaWMgSVhGQV9QYXJzZXINCi17DQotcHVibGljOg0KLSAgICBDWEZBX1NpbXBsZVBhcnNlcihJWEZBX09iakZhY3RvcnkgKnBGYWN0b3J5LCBGWF9CT09MIGJEb2N1bWVudFBhcnNlciA9IEZBTFNFKTsNCi0gICAgfkNYRkFfU2ltcGxlUGFyc2VyKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCitjbGFzcyBDWEZBX1NpbXBsZVBhcnNlciA6IHB1YmxpYyBJWEZBX1BhcnNlciB7DQorIHB1YmxpYzoNCisgIENYRkFfU2ltcGxlUGFyc2VyKElYRkFfT2JqRmFjdG9yeSogcEZhY3RvcnksIEZYX0JPT0wgYkRvY3VtZW50UGFyc2VyID0gRkFMU0UpOw0KKyAgfkNYRkFfU2ltcGxlUGFyc2VyKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCiANCi0gICAgdmlydHVhbCBpbnQzMl90CQkJU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQgKnBTdHJlYW0sIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEID0gWEZBX1hEUFBBQ0tFVF9YRFApOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlEb1BhcnNlKElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCVBhcnNlWE1MRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NYTUwsIElGREVfWE1MTm9kZSogJnBYTUxOb2RlLCBJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJQ29uc3RydWN0WEZBTm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlKTsNCi0gICAgdmlydHVhbCBJWEZBX09iakZhY3RvcnkqCUdldEZhY3RvcnkoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wRmFjdG9yeTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIENYRkFfTm9kZSoJCQlHZXRSb290Tm9kZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BSb290Tm9kZTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfWE1MRG9jKgkJR2V0WE1MRG9jKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcFhNTERvYzsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJQ2xvc2VQYXJzZXIoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENYRkFfTm9kZSoJCQkJUGFyc2VBc1hEUFBhY2tldAkJCQkJCQkoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQotICAgIENYRkFfTm9kZSoJCQkJUGFyc2VBc1hEUFBhY2tldF9YRFAJCQkJCQkoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQotICAgIENYRkFfTm9kZSoJCQkJUGFyc2VBc1hEUFBhY2tldF9Db25maWcJCQkJCQkoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQotICAgIENYRkFfTm9kZSoJCQkJUGFyc2VBc1hEUFBhY2tldF9UZW1wbGF0ZUZvcm0JCQkJKElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KLSAgICBDWEZBX05vZGUqCQkJCVBhcnNlQXNYRFBQYWNrZXRfRGF0YQkJCQkJCShJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCi0gICAgQ1hGQV9Ob2RlKgkJCQlQYXJzZUFzWERQUGFja2V0X0xvY2FsZUNvbm5lY3Rpb25Tb3VyY2VTZXQJKElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KLSAgICBDWEZBX05vZGUqCQkJCVBhcnNlQXNYRFBQYWNrZXRfWGRjCQkJCQkJKElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KLSAgICBDWEZBX05vZGUqCQkJCVBhcnNlQXNYRFBQYWNrZXRfVXNlcgkJCQkJCShJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCi0gICAgQ1hGQV9Ob2RlKgkJCQlOb3JtYWxMb2FkZXIJCQkJCQkJCShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxEb2MsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElELCBGWF9CT09MIGJVc2VBdHRyaWJ1dGUgPSBUUlVFKTsNCi0gICAgQ1hGQV9Ob2RlKgkJCQlEYXRhTG9hZGVyCQkJCQkJCQkJKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTERvYywgRlhfQk9PTCBiRG9UcmFuc2Zvcm0pOw0KLSAgICBDWEZBX05vZGUqCQkJCVVzZXJQYWNrZXRMb2FkZXIJCQkJCQkJKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTERvYyk7DQotICAgIHZvaWQJCQkJCVBhcnNlQ29udGVudE5vZGUJCQkJCQkJKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTE5vZGUsIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCi0gICAgdm9pZAkJCQkJUGFyc2VEYXRhVmFsdWUJCQkJCQkJCShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLCBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQotICAgIHZvaWQJCQkJCVBhcnNlRGF0YUdyb3VwCQkJCQkJCQkoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KLSAgICB2b2lkCQkJCQlQYXJzZUluc3RydWN0aW9uCQkJCQkJCShDWEZBX05vZGUgKnBYRkFOb2RlLCBJRkRFX1hNTEluc3RydWN0aW9uICpwWE1MSW5zdHJ1Y3Rpb24sIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJCQkJCVNldEZhY3RvcnkJCQkJCQkJCQkoSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSk7DQotICAgIENYRkFfWE1MUGFyc2VyKgkJCQltX3BYTUxQYXJzZXI7DQotICAgIElGREVfWE1MRG9jKgkJCQltX3BYTUxEb2M7DQotICAgIElGWF9TdHJlYW0qCQkJCQltX3BTdHJlYW07DQotICAgIElGWF9GaWxlUmVhZCoJCQkJbV9wRmlsZVJlYWQ7DQotICAgIElYRkFfT2JqRmFjdG9yeSoJCQltX3BGYWN0b3J5Ow0KLSAgICBDWEZBX05vZGUqCQkJCQltX3BSb290Tm9kZTsNCi0gICAgWEZBX1hEUFBBQ0tFVAkJCQltX2VQYWNrZXRJRDsNCi0gICAgRlhfQk9PTAkJCQkJCW1fYkRvY3VtZW50UGFyc2VyOw0KLSAgICBmcmllbmQgY2xhc3MgQ1hGQV9Eb2N1bWVudFBhcnNlcjsNCisgIHZpcnR1YWwgaW50MzJfdCBTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEID0gWEZBX1hEUFBBQ0tFVF9YRFApOw0KKyAgdmlydHVhbCBpbnQzMl90IERvUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisgIHZpcnR1YWwgaW50MzJfdCBQYXJzZVhNTERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqJiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RYRkFOb2RlKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTE5vZGUpOw0KKyAgdmlydHVhbCBJWEZBX09iakZhY3RvcnkqIEdldEZhY3RvcnkoKSBjb25zdCB7IHJldHVybiBtX3BGYWN0b3J5OyB9DQorICB2aXJ0dWFsIENYRkFfTm9kZSogR2V0Um9vdE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3BSb290Tm9kZTsgfQ0KKyAgdmlydHVhbCBJRkRFX1hNTERvYyogR2V0WE1MRG9jKCkgY29uc3QgeyByZXR1cm4gbV9wWE1MRG9jOyB9DQorICB2aXJ0dWFsIHZvaWQgQ2xvc2VQYXJzZXIoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0KElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICBDWEZBX05vZGUqIFBhcnNlQXNYRFBQYWNrZXRfWERQKElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KKyAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0X0NvbmZpZyhJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCisgIENYRkFfTm9kZSogUGFyc2VBc1hEUFBhY2tldF9UZW1wbGF0ZUZvcm0oSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICBDWEZBX05vZGUqIFBhcnNlQXNYRFBQYWNrZXRfRGF0YShJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICBDWEZBX05vZGUqIFBhcnNlQXNYRFBQYWNrZXRfTG9jYWxlQ29ubmVjdGlvblNvdXJjZVNldCgNCisgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KKyAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0X1hkYyhJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCisgIENYRkFfTm9kZSogUGFyc2VBc1hEUFBhY2tldF9Vc2VyKElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCisgIENYRkFfTm9kZSogTm9ybWFsTG9hZGVyKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZUF0dHJpYnV0ZSA9IFRSVUUpOw0KKyAgQ1hGQV9Ob2RlKiBEYXRhTG9hZGVyKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRvVHJhbnNmb3JtKTsNCisgIENYRkFfTm9kZSogVXNlclBhY2tldExvYWRlcihDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxEb2MpOw0KKyAgdm9pZCBQYXJzZUNvbnRlbnROb2RlKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICB2b2lkIFBhcnNlRGF0YVZhbHVlKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCisgIHZvaWQgUGFyc2VEYXRhR3JvdXAoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KKyAgdm9pZCBQYXJzZUluc3RydWN0aW9uKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxJbnN0cnVjdGlvbiogcFhNTEluc3RydWN0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBTZXRGYWN0b3J5KElYRkFfT2JqRmFjdG9yeSogcEZhY3RvcnkpOw0KKyAgQ1hGQV9YTUxQYXJzZXIqIG1fcFhNTFBhcnNlcjsNCisgIElGREVfWE1MRG9jKiBtX3BYTUxEb2M7DQorICBJRlhfU3RyZWFtKiBtX3BTdHJlYW07DQorICBJRlhfRmlsZVJlYWQqIG1fcEZpbGVSZWFkOw0KKyAgSVhGQV9PYmpGYWN0b3J5KiBtX3BGYWN0b3J5Ow0KKyAgQ1hGQV9Ob2RlKiBtX3BSb290Tm9kZTsNCisgIFhGQV9YRFBQQUNLRVQgbV9lUGFja2V0SUQ7DQorICBGWF9CT09MIG1fYkRvY3VtZW50UGFyc2VyOw0KKyAgZnJpZW5kIGNsYXNzIENYRkFfRG9jdW1lbnRQYXJzZXI7DQogfTsNCi1jbGFzcyBDWEZBX0RvY3VtZW50UGFyc2VyIDogcHVibGljIElYRkFfRG9jUGFyc2VyDQotew0KLXB1YmxpYzoNCi0gICAgQ1hGQV9Eb2N1bWVudFBhcnNlcihJWEZBX05vdGlmeSAqcE5vdGlmeSk7DQotICAgIH5DWEZBX0RvY3VtZW50UGFyc2VyKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlKCkNCi0gICAgew0KLSAgICAgICAgZGVsZXRlIHRoaXM7DQotICAgIH0NCi0gICAgdmlydHVhbCBpbnQzMl90CQkJU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQgKnBTdHJlYW0sIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEID0gWEZBX1hEUFBBQ0tFVF9YRFApOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCQlEb1BhcnNlKElGWF9QYXVzZSAqcFBhdXNlID0gTlVMTCk7DQotICAgIHZpcnR1YWwgaW50MzJfdAkJCVBhcnNlWE1MRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NYTUwsIElGREVfWE1MTm9kZSogJnBYTUxOb2RlLCBJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJQ29uc3RydWN0WEZBTm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlKTsNCi0gICAgdmlydHVhbCBJWEZBX09iakZhY3RvcnkqCUdldEZhY3RvcnkoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9ub2RlUGFyc2VyLkdldEZhY3RvcnkoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIENYRkFfTm9kZSoJCQlHZXRSb290Tm9kZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX25vZGVQYXJzZXIuR2V0Um9vdE5vZGUoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElGREVfWE1MRG9jKgkJR2V0WE1MRG9jKCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fbm9kZVBhcnNlci5HZXRYTUxEb2MoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIElYRkFfTm90aWZ5KgkJR2V0Tm90aWZ5KCkgY29uc3QNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1fcE5vdGlmeTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIENYRkFfRG9jdW1lbnQqCQlHZXREb2N1bWVudCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BEb2N1bWVudDsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJQ2xvc2VQYXJzZXIoKTsNCi1wcm90ZWN0ZWQ6DQotICAgIENYRkFfU2ltcGxlUGFyc2VyCQkJbV9ub2RlUGFyc2VyOw0KLSAgICBJWEZBX05vdGlmeSoJCQkJbV9wTm90aWZ5Ow0KLSAgICBDWEZBX0RvY3VtZW50KgkJCQltX3BEb2N1bWVudDsNCitjbGFzcyBDWEZBX0RvY3VtZW50UGFyc2VyIDogcHVibGljIElYRkFfRG9jUGFyc2VyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9Eb2N1bWVudFBhcnNlcihJWEZBX05vdGlmeSogcE5vdGlmeSk7DQorICB+Q1hGQV9Eb2N1bWVudFBhcnNlcigpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCA9IFhGQV9YRFBQQUNLRVRfWERQKTsNCisgIHZpcnR1YWwgaW50MzJfdCBEb1BhcnNlKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgUGFyc2VYTUxEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiYgcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0WEZBTm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlKTsNCisgIHZpcnR1YWwgSVhGQV9PYmpGYWN0b3J5KiBHZXRGYWN0b3J5KCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9ub2RlUGFyc2VyLkdldEZhY3RvcnkoKTsNCisgIH0NCisgIHZpcnR1YWwgQ1hGQV9Ob2RlKiBHZXRSb290Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fbm9kZVBhcnNlci5HZXRSb290Tm9kZSgpOyB9DQorICB2aXJ0dWFsIElGREVfWE1MRG9jKiBHZXRYTUxEb2MoKSBjb25zdCB7IHJldHVybiBtX25vZGVQYXJzZXIuR2V0WE1MRG9jKCk7IH0NCisgIHZpcnR1YWwgSVhGQV9Ob3RpZnkqIEdldE5vdGlmeSgpIGNvbnN0IHsgcmV0dXJuIG1fcE5vdGlmeTsgfQ0KKyAgdmlydHVhbCBDWEZBX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50OyB9DQorICB2aXJ0dWFsIHZvaWQgQ2xvc2VQYXJzZXIoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9TaW1wbGVQYXJzZXIgbV9ub2RlUGFyc2VyOw0KKyAgSVhGQV9Ob3RpZnkqIG1fcE5vdGlmeTsNCisgIENYRkFfRG9jdW1lbnQqIG1fcERvY3VtZW50Ow0KIH07DQogdHlwZWRlZiBDRlhfU3RhY2tUZW1wbGF0ZTxJRkRFX1hNTE5vZGUqPiBDWEZBX1hNTE5vZGVTdGFjazsNCi1jbGFzcyBDWEZBX1hNTFBhcnNlciA6IHB1YmxpYyBJRkRFX1hNTFBhcnNlcg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfWE1MUGFyc2VyKElGREVfWE1MTm9kZSAqcFJvb3QsIElGWF9TdHJlYW0gKnBTdHJlYW0pOw0KLSAgICB+Q1hGQV9YTUxQYXJzZXIoKTsNCitjbGFzcyBDWEZBX1hNTFBhcnNlciA6IHB1YmxpYyBJRkRFX1hNTFBhcnNlciB7DQorIHB1YmxpYzoNCisgIENYRkFfWE1MUGFyc2VyKElGREVfWE1MTm9kZSogcFJvb3QsIElGWF9TdHJlYW0qIHBTdHJlYW0pOw0KKyAgfkNYRkFfWE1MUGFyc2VyKCk7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBkZWxldGUgdGhpczsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGludDMyX3QJCURvUGFyc2VyKElGWF9QYXVzZSAqcFBhdXNlKTsNCi1wcm90ZWN0ZWQ6DQotICAgIElGREVfWE1MTm9kZQkJCSptX3BSb290Ow0KLSAgICBJRlhfU3RyZWFtCQkJCSptX3BTdHJlYW07DQotICAgIElGREVfWE1MU3ludGF4UGFyc2VyCSptX3BQYXJzZXI7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBEb1BhcnNlcihJRlhfUGF1c2UqIHBQYXVzZSk7DQogDQotICAgIElGREVfWE1MTm9kZQkJCSptX3BQYXJlbnQ7DQotICAgIElGREVfWE1MTm9kZQkJCSptX3BDaGlsZDsNCi0gICAgQ1hGQV9YTUxOb2RlU3RhY2sJCW1fTm9kZVN0YWNrOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3MxOw0KLSAgICBDRlhfV2lkZVN0cmluZwkJCW1fd3MyOw0KLSAgICBGWF9EV09SRAkJCQltX2R3U3RhdHVzOw0KKyBwcm90ZWN0ZWQ6DQorICBJRkRFX1hNTE5vZGUqIG1fcFJvb3Q7DQorICBJRlhfU3RyZWFtKiBtX3BTdHJlYW07DQorICBJRkRFX1hNTFN5bnRheFBhcnNlciogbV9wUGFyc2VyOw0KKw0KKyAgSUZERV9YTUxOb2RlKiBtX3BQYXJlbnQ7DQorICBJRkRFX1hNTE5vZGUqIG1fcENoaWxkOw0KKyAgQ1hGQV9YTUxOb2RlU3RhY2sgbV9Ob2RlU3RhY2s7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzMTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3MyOw0KKyAgRlhfRFdPUkQgbV9kd1N0YXR1czsNCiAjaWZkZWYgX1hGQV9WRVJJRllfQ2hlY2tzdW1fDQotcHVibGljOg0KLSAgICBGWF9GSUxFU0laRQkJCQltX25TdGFydFsyXTsNCi0gICAgc2l6ZV90CQkJCQltX25TaXplWzJdOw0KLSAgICBGWF9GSUxFU0laRQkJCQltX25FbGVtZW50U3RhcnQ7DQotICAgIEZYX1dPUkQJCQkJCW1fZHdDaGVja1N0YXR1czsNCi0gICAgRlhfV09SRAkJCQkJbV9kd0N1cnJlbnRDaGVja1N0YXR1czsNCisgcHVibGljOg0KKyAgRlhfRklMRVNJWkUgbV9uU3RhcnRbMl07DQorICBzaXplX3QgbV9uU2l6ZVsyXTsNCisgIEZYX0ZJTEVTSVpFIG1fbkVsZW1lbnRTdGFydDsNCisgIEZYX1dPUkQgbV9kd0NoZWNrU3RhdHVzOw0KKyAgRlhfV09SRCBtX2R3Q3VycmVudENoZWNrU3RhdHVzOw0KICNlbmRpZg0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9kYXRhd2luZG93LmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZGF0YXdpbmRvdy5jcHAKaW5kZXggZGMzOTNkNy4uZTBmNGZlZSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9kYXRhd2luZG93LmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2RhdGF3aW5kb3cuY3BwCkBAIC0xOCwzNCArMTgsMzEgQEAKICNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQogI2luY2x1ZGUgInhmYV9zY3JpcHRfZGF0YXdpbmRvdy5oIg0KIENTY3JpcHRfRGF0YVdpbmRvdzo6Q1NjcmlwdF9EYXRhV2luZG93KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCi0gICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfRGF0YVdpbmRvdykNCi17DQotICAgIG1fdVNjcmlwdEhhc2ggPSBYRkFfSEFTSENPREVfRGF0YVdpbmRvdzsNCisgICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfRGF0YVdpbmRvdykgew0KKyAgbV91U2NyaXB0SGFzaCA9IFhGQV9IQVNIQ09ERV9EYXRhV2luZG93Ow0KIH0NCi1DU2NyaXB0X0RhdGFXaW5kb3c6On5DU2NyaXB0X0RhdGFXaW5kb3coKQ0KLXsNCi19DQotdm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X01vdmVDdXJyZW50UmVjb3JkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLX0NCi12b2lkIENTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfUmVjb3JkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLX0NCi12b2lkIENTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfR290b1JlY29yZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi19DQotdm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X0lzUmVjb3JkR3JvdXAoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotfQ0KLXZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmRzQmVmb3JlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotfQ0KLXZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19DdXJyZW50UmVjb3JkTnVtYmVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotfQ0KLXZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmRzQWZ0ZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi19DQotdm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X0lzRGVmaW5lZChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KK0NTY3JpcHRfRGF0YVdpbmRvdzo6fkNTY3JpcHRfRGF0YVdpbmRvdygpIHt9DQordm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X01vdmVDdXJyZW50UmVjb3JkKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9DQordm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X0dvdG9SZWNvcmQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9DQordm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X0lzUmVjb3JkR3JvdXAoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9DQordm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X1JlY29yZHNCZWZvcmUoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30NCit2b2lkIENTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfQ3VycmVudFJlY29yZE51bWJlcigNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmRzQWZ0ZXIoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30NCit2b2lkIENTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfSXNEZWZpbmVkKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZGF0YXdpbmRvdy5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9kYXRhd2luZG93LmgKaW5kZXggNDhmZDQxNi4uODBlNzU2NSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9kYXRhd2luZG93LmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9kYXRhd2luZG93LmgKQEAgLTYsMTggKzYsMjUgQEAKIA0KICNpZm5kZWYgX1NDUklQVF9EQVRBV0lORE9XX0hfDQogI2RlZmluZSBfU0NSSVBUX0RBVEFXSU5ET1dfSF8NCi1jbGFzcyBDU2NyaXB0X0RhdGFXaW5kb3cgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdA0KLXsNCi1wdWJsaWM6DQotICAgIENTY3JpcHRfRGF0YVdpbmRvdyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KLSAgICB2aXJ0dWFsIH5DU2NyaXB0X0RhdGFXaW5kb3coKTsNCi0gICAgdm9pZAlTY3JpcHRfRGF0YVdpbmRvd19Nb3ZlQ3VycmVudFJlY29yZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0RhdGFXaW5kb3dfR290b1JlY29yZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfRGF0YVdpbmRvd19Jc1JlY29yZEdyb3VwKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9EYXRhV2luZG93X1JlY29yZHNCZWZvcmUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRGF0YVdpbmRvd19DdXJyZW50UmVjb3JkTnVtYmVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0RhdGFXaW5kb3dfUmVjb3Jkc0FmdGVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0RhdGFXaW5kb3dfSXNEZWZpbmVkKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorY2xhc3MgQ1NjcmlwdF9EYXRhV2luZG93IDogcHVibGljIENYRkFfT3JkaW5hcnlPYmplY3Qgew0KKyBwdWJsaWM6DQorICBDU2NyaXB0X0RhdGFXaW5kb3coQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIHZpcnR1YWwgfkNTY3JpcHRfRGF0YVdpbmRvdygpOw0KKyAgdm9pZCBTY3JpcHRfRGF0YVdpbmRvd19Nb3ZlQ3VycmVudFJlY29yZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0RhdGFXaW5kb3dfUmVjb3JkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRGF0YVdpbmRvd19Hb3RvUmVjb3JkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRGF0YVdpbmRvd19Jc1JlY29yZEdyb3VwKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmRzQmVmb3JlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRGF0YVdpbmRvd19DdXJyZW50UmVjb3JkTnVtYmVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmRzQWZ0ZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRGF0YVdpbmRvd19Jc0RlZmluZWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5jcHAKaW5kZXggNmUwNmEwZi4uNDc5YzI1OSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2V2ZW50cHNldWRvbW9kZWwuY3BwCkBAIC0xOCwyMDEgKzE4LDI1MyBAQAogI2luY2x1ZGUgInhmYV9kZWJ1Z19wYXJzZXIuaCINCiAjaW5jbHVkZSAieGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgiDQogQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KLSAgICA6IENYRkFfT3JkaW5hcnlPYmplY3QocERvY3VtZW50LCBYRkFfRUxFTUVOVF9FdmVudFBzZXVkb01vZGVsKQ0KLXsNCi0gICAgbV91U2NyaXB0SGFzaCA9IFhGQV9IQVNIQ09ERV9FdmVudDsNCisgICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfRXZlbnRQc2V1ZG9Nb2RlbCkgew0KKyAgbV91U2NyaXB0SGFzaCA9IFhGQV9IQVNIQ09ERV9FdmVudDsNCiB9DQotQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjp+Q1NjcmlwdF9FdmVudFBzZXVkb01vZGVsKCkNCi17DQorQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjp+Q1NjcmlwdF9FdmVudFBzZXVkb01vZGVsKCkge30NCit2b2lkIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCisgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgIH0NCiB9DQotdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TdHJpbmdQcm9wZXJ0eShGWEpTRV9IVkFMVUUgaFZhbHVlLCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZykNCi17DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzVmFsdWUpOw0KLSAgICAgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCi0gICAgfQ0KK3ZvaWQgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfSW50ZXJQcm9wZXJ0eShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBpVmFsdWUgPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpVmFsdWUpOw0KKyAgfQ0KIH0NCi12b2lkIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0ludGVyUHJvcGVydHkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgaW50MzJfdCYgaVZhbHVlLCBGWF9CT09MIGJTZXR0aW5nKQ0KLXsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBpVmFsdWUgPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpVmFsdWUpOw0KLSAgICB9DQordm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZykgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIGJWYWx1ZSA9IEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihoVmFsdWUpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIGJWYWx1ZSk7DQorICB9DQogfQ0KLXZvaWQgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQm9vbGVhblByb3BlcnR5KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wmIGJWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZykNCi17DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgYlZhbHVlID0gRlhKU0VfVmFsdWVfVG9Cb29sZWFuKGhWYWx1ZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgYlZhbHVlKTsNCi0gICAgfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfRFdPUkQgZHdGbGFnLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nKSB7DQorICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9IHBTY3JpcHRDb250ZXh0LT5HZXRFdmVudFBhcmFtKCk7DQorICBpZiAoIXBFdmVudFBhcmFtKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHN3aXRjaCAoZHdGbGFnKSB7DQorICAgIGNhc2UgWEZBX0VWRU5UX0NBTkNFTEFDVElPTjoNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoDQorICAgICAgICAgIGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYkNhbmNlbEFjdGlvbiwgYlNldHRpbmcpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9DSEFOR0U6DQorICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c0NoYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0dGluZyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VWRU5UX0NPTU1JVEtFWToNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9JbnRlclByb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1faUNvbW1pdEtleSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfRlVMTFRFWFQ6DQorICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c0Z1bGxUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfS0VZRE9XTjoNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iS2V5RG93biwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldHRpbmcpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9NT0RJRklFUjoNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iTW9kaWZpZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfTkVXQ09OVEVOVFRZUEU6DQorICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoDQorICAgICAgICAgIGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NOZXdDb250ZW50VHlwZSwgYlNldHRpbmcpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9ORVdURVhUOg0KKyAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NOZXdUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfUFJFVkNPTlRFTlRUWVBFOg0KKyAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KA0KKyAgICAgICAgICBoVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzUHJldkNvbnRlbnRUeXBlLCBiU2V0dGluZyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VWRU5UX1BSRVZURVhUOg0KKyAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NQcmV2VGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0dGluZyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VWRU5UX1JFRU5URVI6DQorICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQm9vbGVhblByb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYlJlZW50ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfU0VMRU5EOg0KKyAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0ludGVyUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9pU2VsRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldHRpbmcpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9TRUxTVEFSVDoNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9JbnRlclByb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1faVNlbFN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldHRpbmcpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9TSElGVDoNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iU2hpZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfU09BUEZBVUxUQ09ERToNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TdHJpbmdQcm9wZXJ0eSgNCisgICAgICAgICAgaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c1NvYXBGYXVsdENvZGUsIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfU09BUEZBVUxUU1RSSU5HOg0KKyAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KA0KKyAgICAgICAgICBoVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzU29hcEZhdWx0U3RyaW5nLCBiU2V0dGluZyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VWRU5UX1RBUkdFVDoNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCiB9DQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0RXT1JEIGR3RmxhZywgRlhfQk9PTCBiU2V0dGluZykNCi17DQotICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KLSAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9IHBTY3JpcHRDb250ZXh0LT5HZXRFdmVudFBhcmFtKCk7DQotICAgIGlmICghcEV2ZW50UGFyYW0pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKGR3RmxhZykgew0KLSAgICAgICAgY2FzZSBYRkFfRVZFTlRfQ0FOQ0VMQUNUSU9OOg0KLSAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0Jvb2xlYW5Qcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX2JDYW5jZWxBY3Rpb24sIGJTZXR0aW5nKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VWRU5UX0NIQU5HRToNCi0gICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TdHJpbmdQcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzQ2hhbmdlLCBiU2V0dGluZyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FVkVOVF9DT01NSVRLRVk6DQotICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfSW50ZXJQcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX2lDb21taXRLZXksIGJTZXR0aW5nKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VWRU5UX0ZVTExURVhUOg0KLSAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NGdWxsVGV4dCwgYlNldHRpbmcpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRVZFTlRfS0VZRE9XTjoNCi0gICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iS2V5RG93biwgYlNldHRpbmcpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRVZFTlRfTU9ESUZJRVI6DQotICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQm9vbGVhblByb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYk1vZGlmaWVyLCBiU2V0dGluZyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FVkVOVF9ORVdDT05URU5UVFlQRToNCi0gICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TdHJpbmdQcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzTmV3Q29udGVudFR5cGUsIGJTZXR0aW5nKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VWRU5UX05FV1RFWFQ6DQotICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c05ld1RleHQsIGJTZXR0aW5nKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VWRU5UX1BSRVZDT05URU5UVFlQRToNCi0gICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TdHJpbmdQcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzUHJldkNvbnRlbnRUeXBlLCBiU2V0dGluZyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FVkVOVF9QUkVWVEVYVDoNCi0gICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TdHJpbmdQcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzUHJldlRleHQsIGJTZXR0aW5nKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VWRU5UX1JFRU5URVI6DQotICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQm9vbGVhblByb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYlJlZW50ZXIsIGJTZXR0aW5nKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VWRU5UX1NFTEVORDoNCi0gICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9JbnRlclByb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1faVNlbEVuZCwgYlNldHRpbmcpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRVZFTlRfU0VMU1RBUlQ6DQotICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfSW50ZXJQcm9wZXJ0eShoVmFsdWUsIHBFdmVudFBhcmFtLT5tX2lTZWxTdGFydCwgYlNldHRpbmcpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRVZFTlRfU0hJRlQ6DQotICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQm9vbGVhblByb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYlNoaWZ0LCBiU2V0dGluZyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FVkVOVF9TT0FQRkFVTFRDT0RFOg0KLSAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NTb2FwRmF1bHRDb2RlLCBiU2V0dGluZyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FVkVOVF9TT0FQRkFVTFRTVFJJTkc6DQotICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c1NvYXBGYXVsdFN0cmluZywgYlNldHRpbmcpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRVZFTlRfVEFSR0VUOg0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9DYW5jZWxBY3Rpb24oDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfQ0FOQ0VMQUNUSU9OLCBiU2V0dGluZyk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9DYW5jZWxBY3Rpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfQ0FOQ0VMQUNUSU9OLCBiU2V0dGluZyk7DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0NoYW5nZSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9DSEFOR0UsIGJTZXR0aW5nKTsNCiB9DQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0NoYW5nZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9DSEFOR0UsIGJTZXR0aW5nKTsNCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ29tbWl0S2V5KA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX0NPTU1JVEtFWSwgYlNldHRpbmcpOw0KIH0NCi12b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ29tbWl0S2V5KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX0NPTU1JVEtFWSwgYlNldHRpbmcpOw0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9GdWxsVGV4dCgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9GVUxMVEVYVCwgYlNldHRpbmcpOw0KIH0NCi12b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfRnVsbFRleHQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfRlVMTFRFWFQsIGJTZXR0aW5nKTsNCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfS2V5RG93bigNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9LRVlET1dOLCBiU2V0dGluZyk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9LZXlEb3duKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX0tFWURPV04sIGJTZXR0aW5nKTsNCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfTW9kaWZpZXIoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfTU9ESUZJRVIsIGJTZXR0aW5nKTsNCiB9DQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX01vZGlmaWVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX01PRElGSUVSLCBiU2V0dGluZyk7DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX05ld0NvbnRlbnRUeXBlKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX05FV0NPTlRFTlRUWVBFLCBiU2V0dGluZyk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdDb250ZW50VHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9ORVdDT05URU5UVFlQRSwgYlNldHRpbmcpOw0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdUZXh0KA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX05FV1RFWFQsIGJTZXR0aW5nKTsNCiB9DQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX05ld1RleHQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfTkVXVEVYVCwgYlNldHRpbmcpOw0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2Q29udGVudFR5cGUoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfUFJFVkNPTlRFTlRUWVBFLCBiU2V0dGluZyk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2Q29udGVudFR5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfUFJFVkNPTlRFTlRUWVBFLCBiU2V0dGluZyk7DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1ByZXZUZXh0KA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX1BSRVZURVhULCBiU2V0dGluZyk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2VGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9QUkVWVEVYVCwgYlNldHRpbmcpOw0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9SZWVudGVyKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX1JFRU5URVIsIGJTZXR0aW5nKTsNCiB9DQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1JlZW50ZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfUkVFTlRFUiwgYlNldHRpbmcpOw0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxFbmQoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfU0VMRU5ELCBiU2V0dGluZyk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxFbmQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfU0VMRU5ELCBiU2V0dGluZyk7DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NlbFN0YXJ0KA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX1NFTFNUQVJULCBiU2V0dGluZyk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxTdGFydChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9TRUxTVEFSVCwgYlNldHRpbmcpOw0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TaGlmdCgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9TSElGVCwgYlNldHRpbmcpOw0KIH0NCi12b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU2hpZnQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfU0hJRlQsIGJTZXR0aW5nKTsNCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU29hcEZhdWx0Q29kZSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9TT0FQRkFVTFRDT0RFLCBiU2V0dGluZyk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Tb2FwRmF1bHRDb2RlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX1NPQVBGQVVMVENPREUsIGJTZXR0aW5nKTsNCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU29hcEZhdWx0U3RyaW5nKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX1NPQVBGQVVMVFNUUklORywgYlNldHRpbmcpOw0KIH0NCi12b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU29hcEZhdWx0U3RyaW5nKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX1NPQVBGQVVMVFNUUklORywgYlNldHRpbmcpOw0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9UYXJnZXQoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfVEFSR0VULCBiU2V0dGluZyk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9UYXJnZXQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfVEFSR0VULCBiU2V0dGluZyk7DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0VtaXQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtID0gcFNjcmlwdENvbnRleHQtPkdldEV2ZW50UGFyYW0oKTsNCisgIGlmICghcEV2ZW50UGFyYW0pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBwTm90aWZ5LT5HZXRXaWRnZXRIYW5kbGVyKCk7DQorICBpZiAoIXBXaWRnZXRIYW5kbGVyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocEV2ZW50UGFyYW0tPm1fcFRhcmdldCwgcEV2ZW50UGFyYW0pOw0KIH0NCi12b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfRW1pdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtID0gcFNjcmlwdENvbnRleHQtPkdldEV2ZW50UGFyYW0oKTsNCi0gICAgaWYgKCFwRXZlbnRQYXJhbSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IHBOb3RpZnktPkdldFdpZGdldEhhbmRsZXIoKTsNCi0gICAgaWYgKCFwV2lkZ2V0SGFuZGxlcikgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIHBXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocEV2ZW50UGFyYW0tPm1fcFRhcmdldCwgcEV2ZW50UGFyYW0pOw0KLX0NCi12b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUmVzZXQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KLSAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9IHBTY3JpcHRDb250ZXh0LT5HZXRFdmVudFBhcmFtKCk7DQotICAgIGlmICghcEV2ZW50UGFyYW0pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwRXZlbnRQYXJhbS0+UmVzZXQoKTsNCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUmVzZXQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtID0gcFNjcmlwdENvbnRleHQtPkdldEV2ZW50UGFyYW0oKTsNCisgIGlmICghcEV2ZW50UGFyYW0pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcEV2ZW50UGFyYW0tPlJlc2V0KCk7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgKaW5kZXggODNjNTllMC4uYWMyY2RmYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgKQEAgLTYsNTEgKzYsODYgQEAKIA0KICNpZm5kZWYgX1NDUklQVF9FVkVOVFBTRVVET01PREVMX0hfDQogI2RlZmluZSBfU0NSSVBUX0VWRU5UUFNFVURPTU9ERUxfSF8NCi0jZGVmaW5lIFhGQV9FVkVOVF9DSEFOR0UJCQkwDQotI2RlZmluZSBYRkFfRVZFTlRfQ09NTUlUS0VZCQkJMQ0KLSNkZWZpbmUgWEZBX0VWRU5UX0ZVTExURVhUCQkJMg0KLSNkZWZpbmUgWEZBX0VWRU5UX0tFWURPV04JCQkzDQotI2RlZmluZSBYRkFfRVZFTlRfTU9ESUZJRVIJCQk0DQotI2RlZmluZSBYRkFfRVZFTlRfTkVXQ09OVEVOVFRZUEUJNQ0KLSNkZWZpbmUgWEZBX0VWRU5UX05FV1RFWFQJCQk2DQotI2RlZmluZSBYRkFfRVZFTlRfUFJFVkNPTlRFTlRUWVBFCTcNCi0jZGVmaW5lIFhGQV9FVkVOVF9QUkVWVEVYVAkJCTgNCi0jZGVmaW5lIFhGQV9FVkVOVF9SRUVOVEVSCQkJOQ0KLSNkZWZpbmUgWEZBX0VWRU5UX1NFTEVORAkJCTEwDQotI2RlZmluZSBYRkFfRVZFTlRfU0VMU1RBUlQJCQkxMQ0KLSNkZWZpbmUgWEZBX0VWRU5UX1NISUZUCQkJCTEyDQotI2RlZmluZSBYRkFfRVZFTlRfU09BUEZBVUxUQ09ERQkJMTMNCi0jZGVmaW5lIFhGQV9FVkVOVF9TT0FQRkFVTFRTVFJJTkcJMTQNCi0jZGVmaW5lIFhGQV9FVkVOVF9UQVJHRVQJCQkxNQ0KLSNkZWZpbmUgWEZBX0VWRU5UX0NBTkNFTEFDVElPTgkJMTYNCi1jbGFzcyBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdA0KLXsNCi1wdWJsaWM6DQotICAgIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KLSAgICB2aXJ0dWFsIH5DU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwoKTsNCisjZGVmaW5lIFhGQV9FVkVOVF9DSEFOR0UgMA0KKyNkZWZpbmUgWEZBX0VWRU5UX0NPTU1JVEtFWSAxDQorI2RlZmluZSBYRkFfRVZFTlRfRlVMTFRFWFQgMg0KKyNkZWZpbmUgWEZBX0VWRU5UX0tFWURPV04gMw0KKyNkZWZpbmUgWEZBX0VWRU5UX01PRElGSUVSIDQNCisjZGVmaW5lIFhGQV9FVkVOVF9ORVdDT05URU5UVFlQRSA1DQorI2RlZmluZSBYRkFfRVZFTlRfTkVXVEVYVCA2DQorI2RlZmluZSBYRkFfRVZFTlRfUFJFVkNPTlRFTlRUWVBFIDcNCisjZGVmaW5lIFhGQV9FVkVOVF9QUkVWVEVYVCA4DQorI2RlZmluZSBYRkFfRVZFTlRfUkVFTlRFUiA5DQorI2RlZmluZSBYRkFfRVZFTlRfU0VMRU5EIDEwDQorI2RlZmluZSBYRkFfRVZFTlRfU0VMU1RBUlQgMTENCisjZGVmaW5lIFhGQV9FVkVOVF9TSElGVCAxMg0KKyNkZWZpbmUgWEZBX0VWRU5UX1NPQVBGQVVMVENPREUgMTMNCisjZGVmaW5lIFhGQV9FVkVOVF9TT0FQRkFVTFRTVFJJTkcgMTQNCisjZGVmaW5lIFhGQV9FVkVOVF9UQVJHRVQgMTUNCisjZGVmaW5lIFhGQV9FVkVOVF9DQU5DRUxBQ1RJT04gMTYNCitjbGFzcyBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdCB7DQorIHB1YmxpYzoNCisgIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KKyAgdmlydHVhbCB+Q1NjcmlwdF9FdmVudFBzZXVkb01vZGVsKCk7DQogDQotICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ2FuY2VsQWN0aW9uKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ2hhbmdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQ29tbWl0S2V5KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfRnVsbFRleHQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9LZXlEb3duKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfTW9kaWZpZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdDb250ZW50VHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX05ld1RleHQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2Q29udGVudFR5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2VGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1JlZW50ZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxFbmQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxTdGFydChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NoaWZ0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQJU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU29hcEZhdWx0Q29kZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NvYXBGYXVsdFN0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1RhcmdldChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9DYW5jZWxBY3Rpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9DaGFuZ2UoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Db21taXRLZXkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9GdWxsVGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9LZXlEb3duKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Nb2RpZmllcihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdDb250ZW50VHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdUZXh0KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2Q29udGVudFR5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2VGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9SZWVudGVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxFbmQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxTdGFydChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TaGlmdChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Tb2FwRmF1bHRDb2RlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Tb2FwRmF1bHRTdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9UYXJnZXQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KIA0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9FbWl0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9SZXNldChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCiANCi0gICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9FbWl0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Jlc2V0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZAlTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9EV09SRCBkd0ZsYWcsIEZYX0JPT0wgYlNldHRpbmcpOw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZyk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5jcHAKaW5kZXggNjk3Yzc1ZC4uN2I1NTdmMSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaG9zdHBzZXVkb21vZGVsLmNwcApAQCAtMTgsNzM3ICsxOCw3ODUgQEAKICNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQogI2luY2x1ZGUgInhmYV9zY3JpcHRfaG9zdHBzZXVkb21vZGVsLmgiDQogQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCi0gICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfSG9zdFBzZXVkb01vZGVsKQ0KLXsNCi0gICAgbV91U2NyaXB0SGFzaCA9IFhGQV9IQVNIQ09ERV9Ib3N0Ow0KKyAgICA6IENYRkFfT3JkaW5hcnlPYmplY3QocERvY3VtZW50LCBYRkFfRUxFTUVOVF9Ib3N0UHNldWRvTW9kZWwpIHsNCisgIG1fdVNjcmlwdEhhc2ggPSBYRkFfSEFTSENPREVfSG9zdDsNCiB9DQotQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6On5DU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbCgpDQotew0KK0NTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjp+Q1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwoKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTG9hZFN0cmluZygNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnksDQorICAgIEZYX0RXT1JEIGR3RmxhZykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkxvYWRTdHJpbmcoZHdGbGFnLCB3c1ZhbHVlKTsNCisgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCiB9DQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Mb2FkU3RyaW5nKEZYSlNFX0hWQUxVRSBoVmFsdWUsIElYRkFfTm90aWZ5KiBwTm90aWZ5LCBGWF9EV09SRCBkd0ZsYWcpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KLSAgICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5Mb2FkU3RyaW5nKGR3RmxhZywgd3NWYWx1ZSk7DQotICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0FwcFR5cGUoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0FwcFR5cGU7DQorICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRBcHBUeXBlKHdzQXBwVHlwZSk7DQorICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0FwcFR5cGUpKTsNCiB9DQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9BcHBUeXBlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQXBwVHlwZTsNCi0gICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0QXBwVHlwZSh3c0FwcFR5cGUpOw0KLSAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0FwcFR5cGUpKTsNCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0QXBwVHlwZSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzQXBwVHlwZTsNCisgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldEZveGl0QXBwVHlwZSh3c0FwcFR5cGUpOw0KKyAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NBcHBUeXBlKSk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRm94aXRBcHBUeXBlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQXBwVHlwZTsNCi0gICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0Rm94aXRBcHBUeXBlKHdzQXBwVHlwZSk7DQotICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzQXBwVHlwZSkpOw0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ2FsY3VsYXRpb25zRW5hYmxlZCgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Q2FsY3VsYXRpb25zRW5hYmxlZCgNCisgICAgICAgIGhEb2MsIEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihoVmFsdWUpKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiRW5hYmxlZCA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPklzQ2FsY3VsYXRpb25zRW5hYmxlZChoRG9jKTsNCisgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiRW5hYmxlZCk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ2FsY3VsYXRpb25zRW5hYmxlZChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPlNldENhbGN1bGF0aW9uc0VuYWJsZWQoaERvYywgRlhKU0VfVmFsdWVfVG9Cb29sZWFuKGhWYWx1ZSkpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYkVuYWJsZWQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5Jc0NhbGN1bGF0aW9uc0VuYWJsZWQoaERvYyk7DQotICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiRW5hYmxlZCk7DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9DdXJyZW50UGFnZSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Q3VycmVudFBhZ2UoaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlDdXJyZW50UGFnZSA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkdldEN1cnJlbnRQYWdlKGhEb2MpOw0KKyAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlDdXJyZW50UGFnZSk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ3VycmVudFBhZ2UoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRDdXJyZW50UGFnZShoRG9jLCBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBpQ3VycmVudFBhZ2UgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5HZXRDdXJyZW50UGFnZShoRG9jKTsNCi0gICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlDdXJyZW50UGFnZSk7DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9MYW5ndWFnZSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9MQU5HVUFHRSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzTGFuZ3VhZ2U7DQorICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRMYW5ndWFnZSh3c0xhbmd1YWdlKTsNCisgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzTGFuZ3VhZ2UpKTsNCiB9DQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9MYW5ndWFnZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19VTkFCTEVfU0VUX0xBTkdVQUdFKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0xhbmd1YWdlOw0KLSAgICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRMYW5ndWFnZSh3c0xhbmd1YWdlKTsNCi0gICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NMYW5ndWFnZSkpOw0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTnVtUGFnZXMoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9OVU1QQUdFUyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaU51bVBhZ2VzID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+Q291bnRQYWdlcyhoRG9jKTsNCisgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpTnVtUGFnZXMpOw0KIH0NCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX051bVBhZ2VzKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19VTkFCTEVfU0VUX05VTVBBR0VTKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlOdW1QYWdlcyA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkNvdW50UGFnZXMoaERvYyk7DQotICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpTnVtUGFnZXMpOw0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUGxhdGZvcm0oDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1VOQUJMRV9TRVRfUExBVEZPUk0pOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1BsYXRmb3JtOw0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0UGxhdGZvcm0od3NQbGF0Zm9ybSk7DQorICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1BsYXRmb3JtKSk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUGxhdGZvcm0oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9QTEFURk9STSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NQbGF0Zm9ybTsNCi0gICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0UGxhdGZvcm0od3NQbGF0Zm9ybSk7DQotICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzUGxhdGZvcm0pKTsNCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1RpdGxlKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCisgICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0VGl0bGUoDQorICAgICAgICBoRG9jLCBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0VGl0bGUoaERvYywgd3NUaXRsZSk7DQorICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1RpdGxlKSk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVGl0bGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWU7DQotICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCi0gICAgICAgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPlNldFRpdGxlKGhEb2MsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaXRsZTsNCi0gICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0VGl0bGUoaERvYywgd3NUaXRsZSk7DQotICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVGl0bGUpKTsNCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZhbGlkYXRpb25zRW5hYmxlZCgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0VmFsaWRhdGlvbnNFbmFibGVkKA0KKyAgICAgICAgaERvYywgRlhKU0VfVmFsdWVfVG9Cb29sZWFuKGhWYWx1ZSkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJFbmFibGVkID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+SXNWYWxpZGF0aW9uc0VuYWJsZWQoaERvYyk7DQorICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgYkVuYWJsZWQpOw0KIH0NCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZhbGlkYXRpb25zRW5hYmxlZChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPlNldFZhbGlkYXRpb25zRW5hYmxlZChoRG9jLCBGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4oaFZhbHVlKSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfQk9PTCBiRW5hYmxlZCA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPklzVmFsaWRhdGlvbnNFbmFibGVkKGhEb2MpOw0KLSAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgYkVuYWJsZWQpOw0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFyaWF0aW9uKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19VTkFCTEVfU0VUX1ZBUklBVElPTik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVmFyaWF0aW9uOw0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0VmFyaWF0aW9uKHdzVmFyaWF0aW9uKTsNCisgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFyaWF0aW9uKSk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFyaWF0aW9uKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9WQVJJQVRJT04pOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFyaWF0aW9uOw0KLSAgICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRWYXJpYXRpb24od3NWYXJpYXRpb24pOw0KLSAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1ZhcmlhdGlvbikpOw0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmVyc2lvbigNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9WRVJTSU9OKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWZXJzaW9uOw0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0VmVyc2lvbih3c1ZlcnNpb24pOw0KKyAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NWZXJzaW9uKSk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmVyc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChiU2V0dGluZykgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19VTkFCTEVfU0VUX1ZFUlNJT04pOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmVyc2lvbjsNCi0gICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0VmVyc2lvbih3c1ZlcnNpb24pOw0KLSAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1ZlcnNpb24pKTsNCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0VmVyc2lvbigNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9WRVJTSU9OKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWZXJzaW9uOw0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0Rm94aXRWZXJzaW9uKHdzVmVyc2lvbik7DQorICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1ZlcnNpb24pKTsNCiB9DQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdFZlcnNpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKQ0KLXsNCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9WRVJTSU9OKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZlcnNpb247DQotICAgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldEZveGl0VmVyc2lvbih3c1ZlcnNpb24pOw0KLSAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1ZlcnNpb24pKTsNCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX05hbWUoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0FwcE5hbWU7DQorICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRBcHBOYW1lKHdzQXBwTmFtZSk7DQorICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0FwcE5hbWUpKTsNCiB9DQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9OYW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQXBwTmFtZTsNCi0gICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0QXBwTmFtZSh3c0FwcE5hbWUpOw0KLSAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0FwcE5hbWUpKTsNCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0TmFtZSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRm94aXRBcHBOYW1lOw0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0Rm94aXRBcHBOYW1lKHdzRm94aXRBcHBOYW1lKTsNCisgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzRm94aXRBcHBOYW1lKSk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRm94aXROYW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkNCi17DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKGJTZXR0aW5nKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRm94aXRBcHBOYW1lOw0KLSAgICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRGb3hpdEFwcE5hbWUod3NGb3hpdEFwcE5hbWUpOw0KLSAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0ZveGl0QXBwTmFtZSkpOw0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfR290b1VSTCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZ290b1VSTCIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1VSTDsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVUkwgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICB3c1VSTCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1VSTCwgYnNVUkwuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+R290b1VSTChoRG9jLCB3c1VSTCk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfR290b1VSTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggIT0gMSkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJnb3RvVVJMIik7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NVUkw7DQotICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVVJMID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCi0gICAgICAgIHdzVVJMID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVVJMLCBic1VSTC5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+R290b1VSTChoRG9jLCB3c1VSTCk7DQotfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfT3Blbkxpc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwib3Blbkxpc3QiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KLSAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0VmFsdWUoMCk7DQotICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoaFZhbHVlKSkgew0KLSAgICAgICAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFZhbHVlLCBOVUxMKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGhWYWx1ZSkpIHsNCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1N0cmluZzsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1N0cmluZyk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzU3RyaW5nLCBic1N0cmluZy5HZXRMZW5ndGgoKSk7DQotICAgICAgICAgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgICAgICAgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpOw0KLSAgICAgICAgICAgIGlmICghcE9iamVjdCkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCi0gICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KLSAgICAgICAgICAgIGludDMyX3QgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwT2JqZWN0LCB3c0V4cHJlc3Npb24sIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCi0gICAgICAgICAgICBpZiAoaVJldCA8IDEgfHwgIXJlc292ZU5vZGVSUy5ub2Rlc1swXS0+SXNOb2RlKCkpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopcmVzb3ZlTm9kZVJTLm5vZGVzWzBdOw0KLSAgICAgICAgfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfT3Blbkxpc3QoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGlmICghbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIm9wZW5MaXN0Iik7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFZhbHVlKDApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoaFZhbHVlKSkgew0KKyAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFZhbHVlLCBOVUxMKTsNCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoaFZhbHVlKSkgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzU3RyaW5nOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzU3RyaW5nKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24gPQ0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNTdHJpbmcsIGJzU3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQogICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQotICAgIH0NCi0gICAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQotICAgIGlmICghcERvY0xheW91dCkgew0KICAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gcE5vdGlmeS0+R2V0SFdpZGdldChwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKSk7DQotICAgIGlmICghaFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPlNldEZvY3VzV2lkZ2V0KHBOb3RpZnktPkdldEhET0MoKSwgaFdpZGdldCk7DQotICAgIHBOb3RpZnktPk9wZW5Ecm9wRG93bkxpc3QoaFdpZGdldCk7DQotfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUmVzcG9uc2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDQpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVzcG9uc2UiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzUXVlc3Rpb247DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRGVmYXVsdEFuc3dlcjsNCi0gICAgRlhfQk9PTCBiTWFyayA9IEZBTFNFOw0KLSAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1F1ZXN0aW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCi0gICAgICAgIHdzUXVlc3Rpb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNRdWVzdGlvbiwgYnNRdWVzdGlvbi5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgaWYgKGlMZW5ndGggPj0gMikgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNUaXRsZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQotICAgICAgICB3c1RpdGxlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVGl0bGUsIGJzVGl0bGUuR2V0TGVuZ3RoKCkpOw0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDMpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRGVmYXVsdEFuc3dlciA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMik7DQotICAgICAgICB3c0RlZmF1bHRBbnN3ZXIgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNEZWZhdWx0QW5zd2VyLCBic0RlZmF1bHRBbnN3ZXIuR2V0TGVuZ3RoKCkpOw0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDQpIHsNCi0gICAgICAgIGJNYXJrID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMykgPT0gMCA/IEZBTFNFIDogVFJVRTsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Fuc3dlcjsNCi0gICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+UmVzcG9uc2Uod3NBbnN3ZXIsIHdzUXVlc3Rpb24sIHdzVGl0bGUsIHdzRGVmYXVsdEFuc3dlciwgYk1hcmspOw0KLSAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQotICAgIGlmIChoVmFsdWUpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzQW5zd2VyKSk7DQotICAgIH0NCi19DQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Eb2N1bWVudEluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBpQ3VyID0gcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0Q3VyRG9jdW1lbnRJbkJhdGNoKCk7DQotICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCi0gICAgaWYgKGhWYWx1ZSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlDdXIpOw0KLSAgICB9DQotfQ0KLXN0YXRpYyBpbnQzMl90IFhGQV9GaWx0ZXJOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLCBpbnQzMl90IG5TdGFydCwgQ0ZYX1dpZGVTdHJpbmcgJndzRmlsdGVyKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG5TdGFydCA+IC0xKTsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gd3NFeHByZXNzaW9uLkdldExlbmd0aCgpOw0KLSAgICBpZiAoblN0YXJ0ID49IGlMZW5ndGgpIHsNCi0gICAgICAgIHJldHVybiBpTGVuZ3RoOw0KLSAgICB9DQotICAgIEZYX1dDSEFSKiBwQnVmID0gd3NGaWx0ZXIuR2V0QnVmZmVyKGlMZW5ndGggLSBuU3RhcnQpOw0KLSAgICBpbnQzMl90IG5Db3VudCA9IDA7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3JjID0gd3NFeHByZXNzaW9uLkdldFB0cigpOw0KLSAgICBGWF9XQ0hBUiB3Q3VyOw0KLSAgICB3aGlsZSAoblN0YXJ0IDwgaUxlbmd0aCkgew0KLSAgICAgICAgd0N1ciA9IHBTcmNbblN0YXJ0ICsrXTsNCi0gICAgICAgIGlmICh3Q3VyID09ICcsJykgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcEJ1ZltuQ291bnQgKytdID0gd0N1cjsNCi0gICAgfQ0KLSAgICB3c0ZpbHRlci5SZWxlYXNlQnVmZmVyKG5Db3VudCk7DQotICAgIHdzRmlsdGVyLlRyaW1MZWZ0KCk7DQotICAgIHdzRmlsdGVyLlRyaW1SaWdodCgpOw0KLSAgICByZXR1cm4gblN0YXJ0Ow0KLX0NCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1Jlc2V0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMSkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJyZXNldERhdGEiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCi0gICAgaWYgKGlMZW5ndGggPj0gMSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCi0gICAgICAgIHdzRXhwcmVzc2lvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgaWYgKHdzRXhwcmVzc2lvbi5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIHBOb3RpZnktPlJlc2V0RGF0YSgpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaVN0YXJ0ID0gMDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCi0gICAgaW50MzJfdCBpRXhwTGVuZ3RoID0gd3NFeHByZXNzaW9uLkdldExlbmd0aCgpOw0KLSAgICB3aGlsZSAoaVN0YXJ0IDwgaUV4cExlbmd0aCkgew0KLSAgICAgICAgaVN0YXJ0ID0gWEZBX0ZpbHRlck5hbWUod3NFeHByZXNzaW9uLCBpU3RhcnQsIHdzTmFtZSk7DQotICAgICAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCi0gICAgICAgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQotICAgICAgICBpZiAoIXBPYmplY3QpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KLSAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCi0gICAgICAgIGludDMyX3QgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwT2JqZWN0LCB3c05hbWUsIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCi0gICAgICAgIGlmIChpUmV0IDwgMSB8fCAhcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Jc05vZGUoKSkgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbMF07DQotICAgICAgICBwTm90aWZ5LT5SZXNldERhdGEocE5vZGUtPkdldFdpZGdldERhdGEoKSk7DQotICAgIH0NCi0gICAgaWYgKCFwTm9kZSkgew0KLSAgICAgICAgcE5vdGlmeS0+UmVzZXREYXRhKCk7DQotICAgIH0NCi19DQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9CZWVwKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCA8IDAgfHwgaUxlbmd0aCA+IDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiYmVlcCIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgRlhfRFdPUkQgZHdUeXBlID0gNDsNCi0gICAgaWYgKGlMZW5ndGggPj0gMSkgew0KLSAgICAgICAgZHdUeXBlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQotICAgIH0NCi0gICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+QmVlcChkd1R5cGUpOw0KLX0NCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1NldEZvY3VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCAhPSAxKSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInNldEZvY3VzIik7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQotICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRWYWx1ZSgwKTsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChoVmFsdWUpKSB7DQotICAgICAgICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVmFsdWUsIE5VTEwpOw0KLSAgICAgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoaFZhbHVlKSkgew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzU3RyaW5nOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzU3RyaW5nKTsNCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNTdHJpbmcsIGJzU3RyaW5nLkdldExlbmd0aCgpKTsNCi0gICAgICAgICAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCi0gICAgICAgICAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQotICAgICAgICAgICAgaWYgKCFwT2JqZWN0KSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KLSAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQotICAgICAgICAgICAgaW50MzJfdCBpUmV0ID0gcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHBPYmplY3QsIHdzRXhwcmVzc2lvbiwgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOw0KLSAgICAgICAgICAgIGlmIChpUmV0IDwgMSB8fCAhcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Jc05vZGUoKSkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbMF07DQotICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsNCisgICAgICBpZiAoIXBPYmplY3QpIHsNCiAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlKTsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8DQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KKyAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQorICAgICAgaW50MzJfdCBpUmV0ID0gcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHBPYmplY3QsIHdzRXhwcmVzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOw0KKyAgICAgIGlmIChpUmV0IDwgMSB8fCAhcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Jc05vZGUoKSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBwTm9kZSA9IChDWEZBX05vZGUqKXJlc292ZU5vZGVSUy5ub2Rlc1swXTsNCiAgICAgfQ0KLSAgICBwTm90aWZ5LT5TZXRGb2N1c1dpZGdldE5vZGUocE5vZGUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQorICB9DQorICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgIGlmICghcERvY0xheW91dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX1dpZGdldCogaFdpZGdldCA9IHBOb3RpZnktPkdldEhXaWRnZXQocERvY0xheW91dC0+R2V0TGF5b3V0SXRlbShwTm9kZSkpOw0KKyAgaWYgKCFoV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPlNldEZvY3VzV2lkZ2V0KHBOb3RpZnktPkdldEhET0MoKSwgaFdpZGdldCk7DQorICBwTm90aWZ5LT5PcGVuRHJvcERvd25MaXN0KGhXaWRnZXQpOw0KIH0NCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0dldEZvY3VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBwTm90aWZ5LT5HZXRGb2N1c1dpZGdldE5vZGUoKTsNCi0gICAgaWYgKCFwTm9kZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTm9kZSkpOw0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUmVzcG9uc2UoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiA0KSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVzcG9uc2UiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzUXVlc3Rpb247DQorICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEZWZhdWx0QW5zd2VyOw0KKyAgRlhfQk9PTCBiTWFyayA9IEZBTFNFOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1F1ZXN0aW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgd3NRdWVzdGlvbiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1F1ZXN0aW9uLCBic1F1ZXN0aW9uLkdldExlbmd0aCgpKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNUaXRsZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQorICAgIHdzVGl0bGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNUaXRsZSwgYnNUaXRsZS5HZXRMZW5ndGgoKSk7DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAzKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRGVmYXVsdEFuc3dlciA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMik7DQorICAgIHdzRGVmYXVsdEFuc3dlciA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNEZWZhdWx0QW5zd2VyLCBic0RlZmF1bHRBbnN3ZXIuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gNCkgew0KKyAgICBiTWFyayA9IHBBcmd1bWVudHMtPkdldEludDMyKDMpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0Fuc3dlcjsNCisgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPlJlc3BvbnNlKHdzQW5zd2VyLCB3c1F1ZXN0aW9uLCB3c1RpdGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NEZWZhdWx0QW5zd2VyLCBiTWFyayk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NBbnN3ZXIpKTsNCisgIH0NCiB9DQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9NZXNzYWdlQm94KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDQpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwibWVzc2FnZUJveCIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlOw0KLSAgICBDRlhfV2lkZVN0cmluZyBic1RpdGxlOw0KLSAgICBGWF9EV09SRCBkd01lc3NhZ2VUeXBlID0gWEZBX01CSUNPTl9FcnJvcjsNCi0gICAgRlhfRFdPUkQgZHdCdXR0b25UeXBlID0gWEZBX01CX09LOw0KLSAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQotICAgICAgICBpZighU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0ZUFyZ3NGb3JNc2cocEFyZ3VtZW50cywgMCwgd3NNZXNzYWdlKSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoaUxlbmd0aCA+PSAyKSB7DQotICAgICAgICBpZighU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0ZUFyZ3NGb3JNc2cocEFyZ3VtZW50cywgMSwgYnNUaXRsZSkpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGlMZW5ndGggPj0gMykgew0KLSAgICAgICAgZHdNZXNzYWdlVHlwZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOw0KLSAgICAgICAgaWYgKGR3TWVzc2FnZVR5cGUgPiBYRkFfTUJJQ09OX1N0YXR1cykgew0KLSAgICAgICAgICAgIGR3TWVzc2FnZVR5cGUgPSBYRkFfTUJJQ09OX0Vycm9yOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDQpIHsNCi0gICAgICAgIGR3QnV0dG9uVHlwZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDMpOw0KLSAgICAgICAgaWYgKGR3QnV0dG9uVHlwZSA+IFhGQV9NQl9ZZXNOb0NhbmNlbCkgew0KLSAgICAgICAgICAgIGR3QnV0dG9uVHlwZSA9IFhGQV9NQl9PSzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpbnQzMl90IGlWYWx1ZSA9IHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPk1zZ0JveCh3c01lc3NhZ2UsIGJzVGl0bGUsIGR3TWVzc2FnZVR5cGUsIGR3QnV0dG9uVHlwZSk7DQotICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KLSAgICBpZiAoaFZhbHVlKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVZhbHVlKTsNCi0gICAgfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRG9jdW1lbnRJbkJhdGNoKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ3VyID0gcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0Q3VyRG9jdW1lbnRJbkJhdGNoKCk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlDdXIpOw0KKyAgfQ0KIH0NCi1GWF9CT09MIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZhbGlkYXRlQXJnc0Zvck1zZyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzLCBpbnQzMl90IGlBcmdJbmRleCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpDQotew0KLSAgICBpZihwQXJndW1lbnRzID09IE5VTEwgfHwgaUFyZ0luZGV4IDwgMCkJew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KK3N0YXRpYyBpbnQzMl90IFhGQV9GaWx0ZXJOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0ZpbHRlcikgew0KKyAgRlhTWVNfYXNzZXJ0KG5TdGFydCA+IC0xKTsNCisgIGludDMyX3QgaUxlbmd0aCA9IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKTsNCisgIGlmIChuU3RhcnQgPj0gaUxlbmd0aCkgew0KKyAgICByZXR1cm4gaUxlbmd0aDsNCisgIH0NCisgIEZYX1dDSEFSKiBwQnVmID0gd3NGaWx0ZXIuR2V0QnVmZmVyKGlMZW5ndGggLSBuU3RhcnQpOw0KKyAgaW50MzJfdCBuQ291bnQgPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTcmMgPSB3c0V4cHJlc3Npb24uR2V0UHRyKCk7DQorICBGWF9XQ0hBUiB3Q3VyOw0KKyAgd2hpbGUgKG5TdGFydCA8IGlMZW5ndGgpIHsNCisgICAgd0N1ciA9IHBTcmNbblN0YXJ0KytdOw0KKyAgICBpZiAod0N1ciA9PSAnLCcpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBGWF9CT09MIGJJc0pzVHlwZSA9IEZBTFNFOw0KLSAgICBpZihtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUeXBlKCkgPT0gWEZBX1NDUklQVExBTkdUWVBFX0phdmFzY3JpcHQpIHsNCi0gICAgICAgIGJJc0pzVHlwZSA9IFRSVUU7DQorICAgIHBCdWZbbkNvdW50KytdID0gd0N1cjsNCisgIH0NCisgIHdzRmlsdGVyLlJlbGVhc2VCdWZmZXIobkNvdW50KTsNCisgIHdzRmlsdGVyLlRyaW1MZWZ0KCk7DQorICB3c0ZpbHRlci5UcmltUmlnaHQoKTsNCisgIHJldHVybiBuU3RhcnQ7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUmVzZXREYXRhKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlc2V0RGF0YSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICB3c0V4cHJlc3Npb24gPQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCisgIH0NCisgIGlmICh3c0V4cHJlc3Npb24uSXNFbXB0eSgpKSB7DQorICAgIHBOb3RpZnktPlJlc2V0RGF0YSgpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlTdGFydCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIGludDMyX3QgaUV4cExlbmd0aCA9IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKTsNCisgIHdoaWxlIChpU3RhcnQgPCBpRXhwTGVuZ3RoKSB7DQorICAgIGlTdGFydCA9IFhGQV9GaWx0ZXJOYW1lKHdzRXhwcmVzc2lvbiwgaVN0YXJ0LCB3c05hbWUpOw0KKyAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICAgIHJldHVybjsNCiAgICAgfQ0KLSAgICBGWEpTRV9IVkFMVUUgaFZhbHVlQXJnID0gcEFyZ3VtZW50cy0+R2V0VmFsdWUoaUFyZ0luZGV4KTsNCi0gICAgaWYoIUZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhoVmFsdWVBcmcpICYmIGJJc0pzVHlwZSkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZUFyZyk7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsNCisgICAgaWYgKCFwT2JqZWN0KSB7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQotICAgIGlmKEZYSlNFX1ZhbHVlX0lzTnVsbChoVmFsdWVBcmcpKSB7DQotICAgICAgICB3c1ZhbHVlID0gRlhfV1NUUkMoTCIiKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJ5TWVzc2FnZTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWVBcmcsIGJ5TWVzc2FnZSk7DQotICAgICAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJ5TWVzc2FnZSwgYnlNZXNzYWdlLkdldExlbmd0aCgpKTsNCisgICAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8DQorICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCisgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgICAgaW50MzJfdCBpUmV0ID0NCisgICAgICAgIHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwT2JqZWN0LCB3c05hbWUsIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCisgICAgaWYgKGlSZXQgPCAxIHx8ICFyZXNvdmVOb2RlUlMubm9kZXNbMF0tPklzTm9kZSgpKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCisgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbMF07DQorICAgIHBOb3RpZnktPlJlc2V0RGF0YShwTm9kZS0+R2V0V2lkZ2V0RGF0YSgpKTsNCisgIH0NCisgIGlmICghcE5vZGUpIHsNCisgICAgcE5vdGlmeS0+UmVzZXREYXRhKCk7DQorICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQmVlcCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDAgfHwgaUxlbmd0aCA+IDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJiZWVwIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9EV09SRCBkd1R5cGUgPSA0Ow0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBkd1R5cGUgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgIH0NCisgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkJlZXAoZHdUeXBlKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9TZXRGb2N1cygNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwic2V0Rm9jdXMiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRWYWx1ZSgwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGhWYWx1ZSkpIHsNCisgICAgICBwTm9kZSA9IChDWEZBX05vZGUqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhWYWx1ZSwgTlVMTCk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGhWYWx1ZSkpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBic1N0cmluZzsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1N0cmluZyk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzU3RyaW5nLCBic1N0cmluZy5HZXRMZW5ndGgoKSk7DQorICAgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQorICAgICAgaWYgKCFwT2JqZWN0KSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCisgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgIGludDMyX3QgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwT2JqZWN0LCB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCisgICAgICBpZiAoaVJldCA8IDEgfHwgIXJlc292ZU5vZGVSUy5ub2Rlc1swXS0+SXNOb2RlKCkpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlKTsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbMF07DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgfQ0KKyAgcE5vdGlmeS0+U2V0Rm9jdXNXaWRnZXROb2RlKHBOb2RlKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9HZXRGb2N1cygNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBwTm90aWZ5LT5HZXRGb2N1c1dpZGdldE5vZGUoKTsNCisgIGlmICghcE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5vZGUpKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9NZXNzYWdlQm94KA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gNCkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIm1lc3NhZ2VCb3giKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCisgIENGWF9XaWRlU3RyaW5nIGJzVGl0bGU7DQorICBGWF9EV09SRCBkd01lc3NhZ2VUeXBlID0gWEZBX01CSUNPTl9FcnJvcjsNCisgIEZYX0RXT1JEIGR3QnV0dG9uVHlwZSA9IFhGQV9NQl9PSzsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgaWYgKCFTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZhbGlkYXRlQXJnc0Zvck1zZyhwQXJndW1lbnRzLCAwLCB3c01lc3NhZ2UpKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgIGlmICghU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0ZUFyZ3NGb3JNc2cocEFyZ3VtZW50cywgMSwgYnNUaXRsZSkpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgZHdNZXNzYWdlVHlwZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOw0KKyAgICBpZiAoZHdNZXNzYWdlVHlwZSA+IFhGQV9NQklDT05fU3RhdHVzKSB7DQorICAgICAgZHdNZXNzYWdlVHlwZSA9IFhGQV9NQklDT05fRXJyb3I7DQorICAgIH0NCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDQpIHsNCisgICAgZHdCdXR0b25UeXBlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMyk7DQorICAgIGlmIChkd0J1dHRvblR5cGUgPiBYRkFfTUJfWWVzTm9DYW5jZWwpIHsNCisgICAgICBkd0J1dHRvblR5cGUgPSBYRkFfTUJfT0s7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaVZhbHVlID0gcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+TXNnQm94KA0KKyAgICAgIHdzTWVzc2FnZSwgYnNUaXRsZSwgZHdNZXNzYWdlVHlwZSwgZHdCdXR0b25UeXBlKTsNCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVZhbHVlKTsNCisgIH0NCit9DQorRlhfQk9PTCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0ZUFyZ3NGb3JNc2coDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsDQorICAgIGludDMyX3QgaUFyZ0luZGV4LA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgew0KKyAgaWYgKHBBcmd1bWVudHMgPT0gTlVMTCB8fCBpQXJnSW5kZXggPCAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0JPT0wgYklzSnNUeXBlID0gRkFMU0U7DQorICBpZiAobV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VHlwZSgpID09DQorICAgICAgWEZBX1NDUklQVExBTkdUWVBFX0phdmFzY3JpcHQpIHsNCisgICAgYklzSnNUeXBlID0gVFJVRTsNCisgIH0NCisgIEZYSlNFX0hWQUxVRSBoVmFsdWVBcmcgPSBwQXJndW1lbnRzLT5HZXRWYWx1ZShpQXJnSW5kZXgpOw0KKyAgaWYgKCFGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoaFZhbHVlQXJnKSAmJiBiSXNKc1R5cGUpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQogICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlQXJnKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoaFZhbHVlQXJnKSkgew0KKyAgICB3c1ZhbHVlID0gRlhfV1NUUkMoTCIiKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ5TWVzc2FnZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZUFyZywgYnlNZXNzYWdlKTsNCisgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChieU1lc3NhZ2UsIGJ5TWVzc2FnZS5HZXRMZW5ndGgoKSk7DQorICB9DQorICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZUFyZyk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Eb2N1bWVudENvdW50SW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlWYWx1ZSA9IHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldERvY3VtZW50Q291bnRJbkJhdGNoKCk7DQotICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KLSAgICBpZiAoaFZhbHVlKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVZhbHVlKTsNCi0gICAgfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRG9jdW1lbnRDb3VudEluQmF0Y2goDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlWYWx1ZSA9IHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldERvY3VtZW50Q291bnRJbkJhdGNoKCk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlWYWx1ZSk7DQorICB9DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUHJpbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoICE9IDgpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicHJpbnQiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KLSAgICBGWF9EV09SRCBkd09wdGlvbnMgPSAwOw0KLSAgICBGWF9CT09MIGJTaG93RGlhbG9nID0gVFJVRTsNCi0gICAgaWYgKGlMZW5ndGggPj0gMSkgew0KLSAgICAgICAgYlNob3dEaWFsb2cgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KLSAgICB9DQotICAgIGlmKGJTaG93RGlhbG9nKSB7DQotICAgICAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX1Nob3dEaWFsb2c7DQotICAgIH0NCi0gICAgaW50MzJfdCBuU3RhcnRQYWdlID0gMDsNCi0gICAgaWYgKGlMZW5ndGggPj0gMikgew0KLSAgICAgICAgblN0YXJ0UGFnZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpOw0KLSAgICB9DQotICAgIGludDMyX3QgbkVuZFBhZ2UgPSAwOw0KLSAgICBpZiAoaUxlbmd0aCA+PSAzKSB7DQotICAgICAgICBuRW5kUGFnZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYkNhbkNhbmNlbCA9IFRSVUU7DQotICAgIGlmIChpTGVuZ3RoID49IDQpIHsNCi0gICAgICAgIGJDYW5DYW5jZWwgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigzKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KLSAgICB9DQotICAgIGlmKGJDYW5DYW5jZWwpIHsNCi0gICAgICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfQ2FuQ2FuY2VsOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYlNocmlua1BhZ2UgPSBUUlVFOw0KLSAgICBpZiAoaUxlbmd0aCA+PSA1KSB7DQotICAgICAgICBiU2hyaW5rUGFnZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDQpID09IDAgPyBGQUxTRSA6IFRSVUU7DQotICAgIH0NCi0gICAgaWYoYlNocmlua1BhZ2UpIHsNCi0gICAgICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfU2hyaW5rUGFnZTsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJBc0ltYWdlID0gVFJVRTsNCi0gICAgaWYgKGlMZW5ndGggPj0gNikgew0KLSAgICAgICAgYkFzSW1hZ2UgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig1KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KLSAgICB9DQotICAgIGlmKGJBc0ltYWdlKSB7DQotICAgICAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX0FzSW1hZ2U7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiUmV2ZXJzZU9yZGVyID0gVFJVRTsNCi0gICAgaWYgKGlMZW5ndGggPj0gNykgew0KLSAgICAgICAgYkFzSW1hZ2UgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig1KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KLSAgICB9DQotICAgIGJSZXZlcnNlT3JkZXIgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig2KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KLSAgICBpZihiUmV2ZXJzZU9yZGVyKSB7DQotICAgICAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX1JldmVyc2VPcmRlcjsNCi0gICAgfQ0KLSAgICBGWF9CT09MIGJQcmludEFubm90CT0gVFJVRTsNCi0gICAgaWYgKGlMZW5ndGggPj0gOCkgew0KLSAgICAgICAgYlByaW50QW5ub3QgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig3KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KLSAgICB9DQotICAgIGlmKGJQcmludEFubm90KSB7DQotICAgICAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX1ByaW50QW5ub3Q7DQotICAgIH0NCi0gICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+UHJpbnQoaERvYywgblN0YXJ0UGFnZSwgbkVuZFBhZ2UsIGR3T3B0aW9ucyk7DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QcmludCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSA4KSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicHJpbnQiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgRlhfRFdPUkQgZHdPcHRpb25zID0gMDsNCisgIEZYX0JPT0wgYlNob3dEaWFsb2cgPSBUUlVFOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBiU2hvd0RpYWxvZyA9IHBBcmd1bWVudHMtPkdldEludDMyKDApID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICB9DQorICBpZiAoYlNob3dEaWFsb2cpIHsNCisgICAgZHdPcHRpb25zIHw9IFhGQV9QUklOVE9QVF9TaG93RGlhbG9nOw0KKyAgfQ0KKyAgaW50MzJfdCBuU3RhcnRQYWdlID0gMDsNCisgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgblN0YXJ0UGFnZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpOw0KKyAgfQ0KKyAgaW50MzJfdCBuRW5kUGFnZSA9IDA7DQorICBpZiAoaUxlbmd0aCA+PSAzKSB7DQorICAgIG5FbmRQYWdlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMik7DQorICB9DQorICBGWF9CT09MIGJDYW5DYW5jZWwgPSBUUlVFOw0KKyAgaWYgKGlMZW5ndGggPj0gNCkgew0KKyAgICBiQ2FuQ2FuY2VsID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMykgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIH0NCisgIGlmIChiQ2FuQ2FuY2VsKSB7DQorICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfQ2FuQ2FuY2VsOw0KKyAgfQ0KKyAgRlhfQk9PTCBiU2hyaW5rUGFnZSA9IFRSVUU7DQorICBpZiAoaUxlbmd0aCA+PSA1KSB7DQorICAgIGJTaHJpbmtQYWdlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoNCkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIH0NCisgIGlmIChiU2hyaW5rUGFnZSkgew0KKyAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX1Nocmlua1BhZ2U7DQorICB9DQorICBGWF9CT09MIGJBc0ltYWdlID0gVFJVRTsNCisgIGlmIChpTGVuZ3RoID49IDYpIHsNCisgICAgYkFzSW1hZ2UgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig1KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJBc0ltYWdlKSB7DQorICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfQXNJbWFnZTsNCisgIH0NCisgIEZYX0JPT0wgYlJldmVyc2VPcmRlciA9IFRSVUU7DQorICBpZiAoaUxlbmd0aCA+PSA3KSB7DQorICAgIGJBc0ltYWdlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoNSkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIH0NCisgIGJSZXZlcnNlT3JkZXIgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig2KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgaWYgKGJSZXZlcnNlT3JkZXIpIHsNCisgICAgZHdPcHRpb25zIHw9IFhGQV9QUklOVE9QVF9SZXZlcnNlT3JkZXI7DQorICB9DQorICBGWF9CT09MIGJQcmludEFubm90ID0gVFJVRTsNCisgIGlmIChpTGVuZ3RoID49IDgpIHsNCisgICAgYlByaW50QW5ub3QgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig3KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJQcmludEFubm90KSB7DQorICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfUHJpbnRBbm5vdDsNCisgIH0NCisgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPlByaW50KGhEb2MsIG5TdGFydFBhZ2UsIG5FbmRQYWdlLCBkd09wdGlvbnMpOw0KIH0NCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ltcG9ydERhdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCA8IDAgfHwgaUxlbmd0aCA+IDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiaW1wb3J0RGF0YSIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aDsNCi0gICAgaWYgKGlMZW5ndGggPiAwKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0ZpbGVQYXRoID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCi0gICAgICAgIHdzRmlsZVBhdGggPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNGaWxlUGF0aCwgYnNGaWxlUGF0aC5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQotICAgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkltcG9ydERhdGEoaERvYywgd3NGaWxlUGF0aCk7DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9JbXBvcnREYXRhKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImltcG9ydERhdGEiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRmlsZVBhdGg7DQorICBpZiAoaUxlbmd0aCA+IDApIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNGaWxlUGF0aCA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIHdzRmlsZVBhdGggPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNGaWxlUGF0aCwgYnNGaWxlUGF0aC5HZXRMZW5ndGgoKSk7DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkltcG9ydERhdGEoaERvYywgd3NGaWxlUGF0aCk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRXhwb3J0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMikgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleHBvcnREYXRhIik7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aDsNCi0gICAgRlhfQk9PTCBiWERQID0gVFJVRTsNCi0gICAgaWYgKGlMZW5ndGggPj0gMSkgew0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNGaWxlUGF0aCA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQotICAgICAgICB3c0ZpbGVQYXRoID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRmlsZVBhdGgsIGJzRmlsZVBhdGguR2V0TGVuZ3RoKCkpOw0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCi0gICAgICAgIGJYRFAgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KLSAgICB9DQotICAgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkV4cG9ydERhdGEoaERvYywgd3NGaWxlUGF0aCwgYlhEUCk7DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9FeHBvcnREYXRhKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMikgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImV4cG9ydERhdGEiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aDsNCisgIEZYX0JPT0wgYlhEUCA9IFRSVUU7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRmlsZVBhdGggPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICB3c0ZpbGVQYXRoID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRmlsZVBhdGgsIGJzRmlsZVBhdGguR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICBiWERQID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIH0NCisgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkV4cG9ydERhdGEoaERvYywgd3NGaWxlUGF0aCwgYlhEUCk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUGFnZVVwKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KLSAgICBpbnQzMl90IG5DdXJQYWdlID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0Q3VycmVudFBhZ2UoaERvYyk7DQotICAgIGludDMyX3Qgbk5ld1BhZ2UgPSAwOw0KLSAgICBpZiAobkN1clBhZ2UgPD0gMSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIG5OZXdQYWdlID0gbkN1clBhZ2UgLSAxOw0KLSAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRDdXJyZW50UGFnZShoRG9jLCBuTmV3UGFnZSk7DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QYWdlVXAoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIGludDMyX3QgbkN1clBhZ2UgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5HZXRDdXJyZW50UGFnZShoRG9jKTsNCisgIGludDMyX3Qgbk5ld1BhZ2UgPSAwOw0KKyAgaWYgKG5DdXJQYWdlIDw9IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbk5ld1BhZ2UgPSBuQ3VyUGFnZSAtIDE7DQorICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRDdXJyZW50UGFnZShoRG9jLCBuTmV3UGFnZSk7DQogfQ0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUGFnZURvd24oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQotICAgIGludDMyX3QgbkN1clBhZ2UgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5HZXRDdXJyZW50UGFnZShoRG9jKTsNCi0gICAgaW50MzJfdCBuUGFnZUNvdW50ID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+Q291bnRQYWdlcyhoRG9jKTsNCi0gICAgaWYgKCFuUGFnZUNvdW50IHx8IG5DdXJQYWdlID09IG5QYWdlQ291bnQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpbnQzMl90IG5OZXdQYWdlID0gMDsNCi0gICAgaWYgKG5DdXJQYWdlID49IG5QYWdlQ291bnQpIHsNCi0gICAgICAgIG5OZXdQYWdlID0gblBhZ2VDb3VudCAtIDE7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBuTmV3UGFnZSA9IG5DdXJQYWdlICsgMTsNCi0gICAgfQ0KLSAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRDdXJyZW50UGFnZShoRG9jLCBuTmV3UGFnZSk7DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QYWdlRG93bigNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgaW50MzJfdCBuQ3VyUGFnZSA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkdldEN1cnJlbnRQYWdlKGhEb2MpOw0KKyAgaW50MzJfdCBuUGFnZUNvdW50ID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+Q291bnRQYWdlcyhoRG9jKTsNCisgIGlmICghblBhZ2VDb3VudCB8fCBuQ3VyUGFnZSA9PSBuUGFnZUNvdW50KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3Qgbk5ld1BhZ2UgPSAwOw0KKyAgaWYgKG5DdXJQYWdlID49IG5QYWdlQ291bnQpIHsNCisgICAgbk5ld1BhZ2UgPSBuUGFnZUNvdW50IC0gMTsNCisgIH0gZWxzZSB7DQorICAgIG5OZXdQYWdlID0gbkN1clBhZ2UgKyAxOw0KKyAgfQ0KKyAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Q3VycmVudFBhZ2UoaERvYywgbk5ld1BhZ2UpOw0KIH0NCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0N1cnJlbnREYXRlVGltZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KLSAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGFUaW1lID0gcE5vdGlmeS0+R2V0Q3VycmVudERhdGVUaW1lKCk7DQotICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KLSAgICBpZiAoaFZhbHVlKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0RhdGFUaW1lKSk7DQotICAgIH0NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0N1cnJlbnREYXRlVGltZSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRGF0YVRpbWUgPSBwTm90aWZ5LT5HZXRDdXJyZW50RGF0ZVRpbWUoKTsNCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0RhdGFUaW1lKSk7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaG9zdHBzZXVkb21vZGVsLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5oCmluZGV4IGVmOWQ4MWQuLjg1NzQwMWIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaG9zdHBzZXVkb21vZGVsLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaApAQCAtNiw0NSArNiw3OSBAQAogDQogI2lmbmRlZiBfU0NSSVBUX0hPU1RQU0VVRE9NT0RFTF9IXw0KICNkZWZpbmUgX1NDUklQVF9IT1NUUFNFVURPTU9ERUxfSF8NCi1jbGFzcyBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbCA6IHB1YmxpYyBDWEZBX09yZGluYXJ5T2JqZWN0DQotew0KLXB1YmxpYzoNCi0gICAgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCi0gICAgdmlydHVhbAl+Q1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwoKTsNCitjbGFzcyBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbCA6IHB1YmxpYyBDWEZBX09yZGluYXJ5T2JqZWN0IHsNCisgcHVibGljOg0KKyAgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIHZpcnR1YWwgfkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsKCk7DQogDQotICAgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9BcHBUeXBlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdEFwcFR5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0NhbGN1bGF0aW9uc0VuYWJsZWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0N1cnJlbnRQYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9MYW5ndWFnZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTnVtUGFnZXMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BsYXRmb3JtKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9UaXRsZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFsaWRhdGlvbnNFbmFibGVkKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQotICAgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYXJpYXRpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZlcnNpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCi0gICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0VmVyc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTmFtZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KLSAgICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRm94aXROYW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQXBwVHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRm94aXRBcHBUeXBlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ2FsY3VsYXRpb25zRW5hYmxlZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ3VycmVudFBhZ2UoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTGFuZ3VhZ2UoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTnVtUGFnZXMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUGxhdGZvcm0oRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVGl0bGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFsaWRhdGlvbnNFbmFibGVkKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFyaWF0aW9uKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmVyc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRm94aXRWZXJzaW9uKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTmFtZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRm94aXROYW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQogDQotICAgIHZvaWQJU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Hb3RvVVJMKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfT3Blbkxpc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9SZXNwb25zZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0RvY3VtZW50SW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1Jlc2V0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0JlZXAoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9TZXRGb2N1cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0dldEZvY3VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTWVzc2FnZUJveChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0RvY3VtZW50Q291bnRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUHJpbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9JbXBvcnREYXRhKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRXhwb3J0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BhZ2VVcChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BhZ2VEb3duKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ3VycmVudERhdGVUaW1lKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLXByb3RlY3RlZDoNCi0gICAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0xvYWRTdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgSVhGQV9Ob3RpZnkqIHBOb3RpZnksIEZYX0RXT1JEIGR3RmxhZyk7DQotICAgIEZYX0JPT0wgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0ZUFyZ3NGb3JNc2coQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cywgaW50MzJfdCBpQXJnSW5kZXgsIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKTsNCisgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Hb3RvVVJMKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX09wZW5MaXN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1Jlc3BvbnNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0RvY3VtZW50SW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9SZXNldERhdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQmVlcChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9TZXRGb2N1cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9HZXRGb2N1cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9NZXNzYWdlQm94KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0RvY3VtZW50Q291bnRJbkJhdGNoKA0KKyAgICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ByaW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ltcG9ydERhdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRXhwb3J0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QYWdlVXAoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUGFnZURvd24oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ3VycmVudERhdGVUaW1lKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTG9hZFN0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcpOw0KKyAgRlhfQk9PTCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZhbGlkYXRlQXJnc0Zvck1zZygNCisgICAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzLA0KKyAgICAgIGludDMyX3QgaUFyZ0luZGV4LA0KKyAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaW1wLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaW1wLmNwcAppbmRleCA4ZTc5Yjc1Li5hMGJjMWY1IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2ltcC5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9pbXAuY3BwCkBAIC0yMCw3MzEgKzIwLDgzMCBAQAogI2luY2x1ZGUgInhmYV9zY3JpcHRfcmVzb2x2ZXByb2Nlc3Nvci5oIg0KICNpbmNsdWRlICJ4ZmFfc2NyaXB0X25vZGVoZWxwZXIuaCINCiBDWEZBX1NjcmlwdENvbnRleHQ6OkNYRkFfU2NyaXB0Q29udGV4dChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQotICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KSwgbV9oSnNSdW50aW1lKE5VTEwpLCBtX2hKc0NvbnRleHQoTlVMTCksIG1faEpzQ2xhc3MoTlVMTCkNCi0gICAgLCBtX3BFdmVudFBhcmFtKE5VTEwpLCBtX3BSZXNvbHZlUHJvY2Vzc29yKE5VTEwpLCBtX2VTY3JpcHRUeXBlKFhGQV9TQ1JJUFRMQU5HVFlQRV9Vbmtvd24pDQotICAgICwgbV9oRk0ySlNDb250ZXh0KE5VTEwpLCBtX3BUaGlzT2JqZWN0KE5VTEwpLCBtX3BTY3JpcHROb2RlQXJyYXkoTlVMTCkNCi0gICAgLCBtX2R3QnVpbHRJbkluRmxhZ3MoMCkNCi0gICAgLCBtX2VSdW5BdFR5cGUoWEZBX0FUVFJJQlVURUVOVU1fQ2xpZW50KQ0KLXsNCi0gICAgRlhfbWVtc2V0KCZtX0pzR2xvYmFsQ2xhc3MsIDAsIHNpemVvZihGWEpTRV9DTEFTUykpOw0KLSAgICBGWF9tZW1zZXQoJm1fSnNOb3JtYWxDbGFzcywgMCwgc2l6ZW9mKEZYSlNFX0NMQVNTKSk7DQorICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KSwNCisgICAgICBtX2hKc1J1bnRpbWUoTlVMTCksDQorICAgICAgbV9oSnNDb250ZXh0KE5VTEwpLA0KKyAgICAgIG1faEpzQ2xhc3MoTlVMTCksDQorICAgICAgbV9wRXZlbnRQYXJhbShOVUxMKSwNCisgICAgICBtX3BSZXNvbHZlUHJvY2Vzc29yKE5VTEwpLA0KKyAgICAgIG1fZVNjcmlwdFR5cGUoWEZBX1NDUklQVExBTkdUWVBFX1Vua293biksDQorICAgICAgbV9oRk0ySlNDb250ZXh0KE5VTEwpLA0KKyAgICAgIG1fcFRoaXNPYmplY3QoTlVMTCksDQorICAgICAgbV9wU2NyaXB0Tm9kZUFycmF5KE5VTEwpLA0KKyAgICAgIG1fZHdCdWlsdEluSW5GbGFncygwKSwNCisgICAgICBtX2VSdW5BdFR5cGUoWEZBX0FUVFJJQlVURUVOVU1fQ2xpZW50KSB7DQorICBGWF9tZW1zZXQoJm1fSnNHbG9iYWxDbGFzcywgMCwgc2l6ZW9mKEZYSlNFX0NMQVNTKSk7DQorICBGWF9tZW1zZXQoJm1fSnNOb3JtYWxDbGFzcywgMCwgc2l6ZW9mKEZYSlNFX0NMQVNTKSk7DQogfQ0KLUNYRkFfU2NyaXB0Q29udGV4dDo6fkNYRkFfU2NyaXB0Q29udGV4dCgpDQotew0KLSAgICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwWEZBVG9IVmFsdWUuR2V0U3RhcnRQb3NpdGlvbigpOw0KK0NYRkFfU2NyaXB0Q29udGV4dDo6fkNYRkFfU2NyaXB0Q29udGV4dCgpIHsNCisgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBYRkFUb0hWYWx1ZS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgQ1hGQV9PYmplY3QqIHBYRkFPYmo7DQorICAgIEZYSlNFX0hWQUxVRSBwVmFsdWU7DQorICAgIG1fbWFwWEZBVG9IVmFsdWUuR2V0TmV4dEFzc29jKHBzLCBwWEZBT2JqLCBwVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHBWYWx1ZSk7DQorICB9DQorICBtX21hcFhGQVRvSFZhbHVlLlJlbW92ZUFsbCgpOw0KKyAgUmVsZWFzZVZhcmlhYmxlc01hcCgpOw0KKyAgaWYgKG1faEZNMkpTQ29udGV4dCkgew0KKyAgICBYRkFfRk0ySlNfQ29udGV4dFJlbGVhc2UobV9oRk0ySlNDb250ZXh0KTsNCisgICAgbV9oRk0ySlNDb250ZXh0ID0gTlVMTDsNCisgIH0NCisgIGlmIChtX2hKc0NvbnRleHQpIHsNCisgICAgRlhKU0VfQ29udGV4dF9SZWxlYXNlKG1faEpzQ29udGV4dCk7DQorICAgIG1faEpzQ29udGV4dCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wUmVzb2x2ZVByb2Nlc3Nvcikgew0KKyAgICBkZWxldGUgbV9wUmVzb2x2ZVByb2Nlc3NvcjsNCisgICAgbV9wUmVzb2x2ZVByb2Nlc3NvciA9IE5VTEw7DQorICB9DQorICBtX3VwT2JqZWN0QXJyYXkuUmVtb3ZlQWxsKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX0NhY2hlTGlzdEFycmF5LkdldFNpemUoKTsgaSsrKSB7DQorICAgIGRlbGV0ZSAoKENYRkFfTm9kZUxpc3QqKW1fQ2FjaGVMaXN0QXJyYXlbaV0pOw0KKyAgfQ0KKyAgbV9DYWNoZUxpc3RBcnJheS5SZW1vdmVBbGwoKTsNCisgIGlmIChtX2R3QnVpbHRJbkluRmxhZ3MgJiBYRkFfSlNCVUlMVElOX0hhc0NvdW50KSB7DQorICAgIEZYX1BPU0lUSU9OIHBzID0gbV9KU0J1aWx0SW5PYmplY3RzLkdldFN0YXJ0UG9zaXRpb24oKTsNCiAgICAgd2hpbGUgKHBzKSB7DQotICAgICAgICBDWEZBX09iamVjdCogcFhGQU9iajsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBwVmFsdWU7DQotICAgICAgICBtX21hcFhGQVRvSFZhbHVlLkdldE5leHRBc3NvYyhwcywgcFhGQU9iaiwgcFZhbHVlKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocFZhbHVlKTsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBic0tleTsNCisgICAgICB2b2lkKiBwVmFsdWUgPSBOVUxMOw0KKyAgICAgIG1fSlNCdWlsdEluT2JqZWN0cy5HZXROZXh0QXNzb2MocHMsIGJzS2V5LCBwVmFsdWUpOw0KKyAgICAgIGlmIChwVmFsdWUpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoKEZYSlNFX0hWQUxVRSlwVmFsdWUpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBtX21hcFhGQVRvSFZhbHVlLlJlbW92ZUFsbCgpOw0KLSAgICBSZWxlYXNlVmFyaWFibGVzTWFwKCk7DQotICAgIGlmKG1faEZNMkpTQ29udGV4dCkgew0KLSAgICAgICAgWEZBX0ZNMkpTX0NvbnRleHRSZWxlYXNlKG1faEZNMkpTQ29udGV4dCk7DQotICAgICAgICBtX2hGTTJKU0NvbnRleHQgPSBOVUxMOw0KKyAgICBtX0pTQnVpbHRJbk9iamVjdHMuUmVtb3ZlQWxsKCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpJbml0aWFsaXplKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKSB7DQorICBtX2hKc1J1bnRpbWUgPSBoUnVudGltZTsNCisgIERlZmluZUpzQ29udGV4dCgpOw0KKyAgRGVmaW5lSnNDbGFzcygpOw0KKyAgbV9wUmVzb2x2ZVByb2Nlc3NvciA9IEZYX05FVyBDWEZBX1Jlc29sdmVQcm9jZXNzb3I7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHRDb250ZXh0OjpSdW5TY3JpcHQoWEZBX1NDUklQVExBTkdUWVBFIGVTY3JpcHRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1NjcmlwdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX09iamVjdCogcFRoaXNPYmplY3QpIHsNCisgIENGWF9CeXRlU3RyaW5nIGJ0U2NyaXB0Ow0KKyAgWEZBX1NDUklQVExBTkdUWVBFIGVTYXZlVHlwZSA9IG1fZVNjcmlwdFR5cGU7DQorICBtX2VTY3JpcHRUeXBlID0gZVNjcmlwdFR5cGU7DQorICBpZiAoZVNjcmlwdFR5cGUgPT0gWEZBX1NDUklQVExBTkdUWVBFX0Zvcm1jYWxjKSB7DQorICAgIGlmICghbV9oRk0ySlNDb250ZXh0KSB7DQorICAgICAgbV9oRk0ySlNDb250ZXh0ID0gWEZBX0ZNMkpTX0NvbnRleHRDcmVhdGUoKTsNCisgICAgICBYRkFfRk0ySlNfQ29udGV4dEluaXRpYWxpemUobV9oRk0ySlNDb250ZXh0LCBtX2hKc1J1bnRpbWUsIG1faEpzQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQpOw0KICAgICB9DQotICAgIGlmKG1faEpzQ29udGV4dCkgew0KLSAgICAgICAgRlhKU0VfQ29udGV4dF9SZWxlYXNlKG1faEpzQ29udGV4dCk7DQotICAgICAgICBtX2hKc0NvbnRleHQgPSBOVUxMOw0KKyAgICBDRlhfV2lkZVRleHRCdWYgd3NKYXZhU2NyaXB0Ow0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Vycm9ySW5mbzsNCisgICAgaW50MzJfdCBpRmxhZ3MgPSBYRkFfRk0ySlNfVHJhbnNsYXRlKHdzU2NyaXB0LCB3c0phdmFTY3JpcHQsIHdzRXJyb3JJbmZvKTsNCisgICAgaWYgKGlGbGFncykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChoUmV0VmFsdWUpOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBpZihtX3BSZXNvbHZlUHJvY2Vzc29yKSB7DQotICAgICAgICBkZWxldGUgbV9wUmVzb2x2ZVByb2Nlc3NvcjsNCi0gICAgICAgIG1fcFJlc29sdmVQcm9jZXNzb3IgPSBOVUxMOw0KLSAgICB9DQotICAgIG1fdXBPYmplY3RBcnJheS5SZW1vdmVBbGwoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9DYWNoZUxpc3RBcnJheS5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgZGVsZXRlICgoQ1hGQV9Ob2RlTGlzdCopbV9DYWNoZUxpc3RBcnJheVtpXSk7DQotICAgIH0NCi0gICAgbV9DYWNoZUxpc3RBcnJheS5SZW1vdmVBbGwoKTsNCi0gICAgaWYgKG1fZHdCdWlsdEluSW5GbGFncyAmIFhGQV9KU0JVSUxUSU5fSGFzQ291bnQpIHsNCi0gICAgICAgIEZYX1BPU0lUSU9OIHBzID0gbV9KU0J1aWx0SW5PYmplY3RzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgYnRTY3JpcHQgPQ0KKyAgICAgICAgRlhfVVRGOEVuY29kZSh3c0phdmFTY3JpcHQuR2V0QnVmZmVyKCksIHdzSmF2YVNjcmlwdC5HZXRMZW5ndGgoKSk7DQorICB9IGVsc2Ugew0KKyAgICBpZiAoKG1fZHdCdWlsdEluSW5GbGFncyAmIFhGQV9KU0JVSUxUSU5fSW5pdGlhbGl6ZWQpID09IDApIHsNCisgICAgICBtX2R3QnVpbHRJbkluRmxhZ3MgPSBYRkFfSlNCVUlMVElOX0luaXRpYWxpemVkOw0KKyAgICAgIEZYX1BPU0lUSU9OIHBzID0gbV9KU0J1aWx0SW5PYmplY3RzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgICBpZiAocHMpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBoT2JqZWN0ID0gRlhKU0VfQ29udGV4dF9HZXRHbG9iYWxPYmplY3QobV9oSnNDb250ZXh0KTsNCiAgICAgICAgIHdoaWxlIChwcykgew0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5Ow0KLSAgICAgICAgICAgIHZvaWQqIHBWYWx1ZSA9IE5VTEw7DQotICAgICAgICAgICAgbV9KU0J1aWx0SW5PYmplY3RzLkdldE5leHRBc3NvYyhwcywgYnNLZXksIHBWYWx1ZSk7DQotICAgICAgICAgICAgaWYgKHBWYWx1ZSkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKChGWEpTRV9IVkFMVUUpcFZhbHVlKTsNCi0gICAgICAgICAgICB9DQorICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5Ow0KKyAgICAgICAgICB2b2lkKiBwVmFsdWU7DQorICAgICAgICAgIG1fSlNCdWlsdEluT2JqZWN0cy5HZXROZXh0QXNzb2MocHMsIGJzS2V5LCBwVmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9IVkFMVUUgaFByb3AgPSBGWEpTRV9WYWx1ZV9DcmVhdGUobV9oSnNSdW50aW1lKTsNCisgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoaE9iamVjdCwgYnNLZXksIGhQcm9wKSkgew0KKyAgICAgICAgICAgIG1fSlNCdWlsdEluT2JqZWN0cy5TZXRBdChic0tleSwgaFByb3ApOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0RlbGV0ZU9iamVjdFByb3AoaE9iamVjdCwgYnNLZXkpOw0KKyAgICAgICAgICAgIG1fZHdCdWlsdEluSW5GbGFncyB8PSBYRkFfSlNCVUlMVElOX0hhc0NvdW50Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fSlNCdWlsdEluT2JqZWN0cy5SZW1vdmVLZXkoYnNLZXkpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFByb3ApOw0KKyAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBtX0pTQnVpbHRJbk9iamVjdHMuUmVtb3ZlQWxsKCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhPYmplY3QpOw0KKyAgICAgIH0NCiAgICAgfQ0KKyAgICBidFNjcmlwdCA9IEZYX1VURjhFbmNvZGUod3NTY3JpcHQuR2V0UHRyKCksIHdzU2NyaXB0LkdldExlbmd0aCgpKTsNCisgIH0NCisgIENYRkFfT2JqZWN0KiBwT3JpZ2luYWxPYmplY3QgPSBtX3BUaGlzT2JqZWN0Ow0KKyAgbV9wVGhpc09iamVjdCA9IHBUaGlzT2JqZWN0Ow0KKyAgRlhKU0VfSFZBTFVFIHBWYWx1ZSA9IHBUaGlzT2JqZWN0ID8gR2V0SlNWYWx1ZUZyb21NYXAocFRoaXNPYmplY3QpIDogTlVMTDsNCisgIEZYX0JPT0wgYlJldCA9IEZYSlNFX0V4ZWN1dGVTY3JpcHQobV9oSnNDb250ZXh0LCBidFNjcmlwdCwgaFJldFZhbHVlLCBwVmFsdWUpOw0KKyAgbV9wVGhpc09iamVjdCA9IHBPcmlnaW5hbE9iamVjdDsNCisgIG1fZVNjcmlwdFR5cGUgPSBlU2F2ZVR5cGU7DQorICByZXR1cm4gYlJldDsNCiB9DQotdm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OkluaXRpYWxpemUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpDQotew0KLSAgICBtX2hKc1J1bnRpbWUgPSBoUnVudGltZTsNCi0gICAgRGVmaW5lSnNDb250ZXh0KCk7DQotICAgIERlZmluZUpzQ2xhc3MoKTsNCi0gICAgbV9wUmVzb2x2ZVByb2Nlc3NvciA9IEZYX05FVyBDWEZBX1Jlc29sdmVQcm9jZXNzb3I7DQotfQ0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpSZWxlYXNlKCkNCi17DQotICAgIGRlbGV0ZSB0aGlzOw0KLX0NCi1GWF9CT09MIENYRkFfU2NyaXB0Q29udGV4dDo6UnVuU2NyaXB0KFhGQV9TQ1JJUFRMQU5HVFlQRSBlU2NyaXB0VHlwZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1NjcmlwdCwgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwgQ1hGQV9PYmplY3QqIHBUaGlzT2JqZWN0ICkNCi17DQotICAgIENGWF9CeXRlU3RyaW5nIGJ0U2NyaXB0Ow0KLSAgICBYRkFfU0NSSVBUTEFOR1RZUEUgZVNhdmVUeXBlID0gbV9lU2NyaXB0VHlwZTsNCi0gICAgbV9lU2NyaXB0VHlwZSA9IGVTY3JpcHRUeXBlOw0KLSAgICBpZihlU2NyaXB0VHlwZSA9PSBYRkFfU0NSSVBUTEFOR1RZUEVfRm9ybWNhbGMpIHsNCi0gICAgICAgIGlmKCFtX2hGTTJKU0NvbnRleHQpIHsNCi0gICAgICAgICAgICBtX2hGTTJKU0NvbnRleHQgPSBYRkFfRk0ySlNfQ29udGV4dENyZWF0ZSgpOw0KLSAgICAgICAgICAgIFhGQV9GTTJKU19Db250ZXh0SW5pdGlhbGl6ZShtX2hGTTJKU0NvbnRleHQsIG1faEpzUnVudGltZSwgbV9oSnNDb250ZXh0LCBtX3BEb2N1bWVudCk7DQotICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVRleHRCdWYgd3NKYXZhU2NyaXB0Ow0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFcnJvckluZm87DQotICAgICAgICBpbnQzMl90IGlGbGFncyA9IFhGQV9GTTJKU19UcmFuc2xhdGUod3NTY3JpcHQsIHdzSmF2YVNjcmlwdCwgd3NFcnJvckluZm8pOw0KLSAgICAgICAgaWYoaUZsYWdzKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkKGhSZXRWYWx1ZSk7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnRTY3JpcHQgPSBGWF9VVEY4RW5jb2RlKHdzSmF2YVNjcmlwdC5HZXRCdWZmZXIoKSwgd3NKYXZhU2NyaXB0LkdldExlbmd0aCgpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmICgobV9kd0J1aWx0SW5JbkZsYWdzICYgWEZBX0pTQlVJTFRJTl9Jbml0aWFsaXplZCkgPT0gMCkgew0KLSAgICAgICAgICAgIG1fZHdCdWlsdEluSW5GbGFncyA9IFhGQV9KU0JVSUxUSU5fSW5pdGlhbGl6ZWQ7DQotICAgICAgICAgICAgRlhfUE9TSVRJT04gcHMgPSBtX0pTQnVpbHRJbk9iamVjdHMuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICAgICAgICAgIGlmIChwcykgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaE9iamVjdCA9IEZYSlNFX0NvbnRleHRfR2V0R2xvYmFsT2JqZWN0KG1faEpzQ29udGV4dCk7DQotICAgICAgICAgICAgICAgIHdoaWxlIChwcykgew0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNLZXk7DQotICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICBtX0pTQnVpbHRJbk9iamVjdHMuR2V0TmV4dEFzc29jKHBzLCBic0tleSwgcFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUHJvcCA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShtX2hKc1J1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoaE9iamVjdCwgYnNLZXksIGhQcm9wKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fSlNCdWlsdEluT2JqZWN0cy5TZXRBdChic0tleSwgaFByb3ApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0RlbGV0ZU9iamVjdFByb3AoaE9iamVjdCwgYnNLZXkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdCdWlsdEluSW5GbGFncyB8PSBYRkFfSlNCVUlMVElOX0hhc0NvdW50Ow0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0pTQnVpbHRJbk9iamVjdHMuUmVtb3ZlS2V5KGJzS2V5KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhQcm9wKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhPYmplY3QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGJ0U2NyaXB0ID0gRlhfVVRGOEVuY29kZSh3c1NjcmlwdC5HZXRQdHIoKSwgd3NTY3JpcHQuR2V0TGVuZ3RoKCkpOw0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eVNldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ1hGQV9PYmplY3QqIGxwT3JnaW5hbE5vZGUgPQ0KKyAgICAgIChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaE9iamVjdCwgTlVMTCk7DQorICBDWEZBX0RvY3VtZW50KiBwRG9jID0gbHBPcmdpbmFsTm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0NCisgICAgICAoQ1hGQV9TY3JpcHRDb250ZXh0KilwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBDWEZBX09iamVjdCogbHBDdXJOb2RlID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKGxwT3JnaW5hbE5vZGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgNCisgICAgICAoY29uc3QgRlhfQ0hBUiopc3pQcm9wTmFtZS5HZXRQdHIoKSwgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQorICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwNCisgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwNCisgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzOw0KKyAgQ1hGQV9Ob2RlKiBwUmVmTm9kZSA9IChDWEZBX05vZGUqKWxwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpOw0KKyAgaWYgKGxwT3JnaW5hbE5vZGUtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9WYXJpYWJsZXNUaGlzKSB7DQorICAgIHBSZWZOb2RlID0gKENYRkFfTm9kZSopbHBDdXJOb2RlOw0KKyAgfQ0KKyAgaWYgKGxwU2NyaXB0Q29udGV4dC0+UXVlcnlOb2RlQnlGbGFnKHBSZWZOb2RlLCB3c1Byb3BOYW1lLCBoVmFsdWUsIGR3RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobHBPcmdpbmFsTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX1ZhcmlhYmxlc1RoaXMpIHsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGhWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3RPd25Qcm9wKGhPYmplY3QsIHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQotICAgIENYRkFfT2JqZWN0ICpwT3JpZ2luYWxPYmplY3QgPSBtX3BUaGlzT2JqZWN0Ow0KLSAgICBtX3BUaGlzT2JqZWN0ID0gcFRoaXNPYmplY3Q7DQotICAgIEZYSlNFX0hWQUxVRSBwVmFsdWUgPSBwVGhpc09iamVjdCA/IEdldEpTVmFsdWVGcm9tTWFwKHBUaGlzT2JqZWN0KSA6IE5VTEw7DQotICAgIEZYX0JPT0wJYlJldCA9IEZYSlNFX0V4ZWN1dGVTY3JpcHQobV9oSnNDb250ZXh0LCBidFNjcmlwdCwgaFJldFZhbHVlLCBwVmFsdWUpOw0KLSAgICBtX3BUaGlzT2JqZWN0ID0gcE9yaWdpbmFsT2JqZWN0Ow0KLSAgICBtX2VTY3JpcHRUeXBlID0gZVNhdmVUeXBlOw0KLSAgICByZXR1cm4gYlJldDsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gcERvYy0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0R2xvYmFsUHJvcGVydHkocE5vdGlmeS0+R2V0SERPQygpLCBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFZhbHVlKTsNCiB9DQotdm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5U2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KLXsNCi0gICAgQ1hGQV9PYmplY3QqIGxwT3JnaW5hbE5vZGUgPSAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhPYmplY3QsIE5VTEwpOw0KLSAgICBDWEZBX0RvY3VtZW50KiBwRG9jID0gbHBPcmdpbmFsTm9kZS0+R2V0RG9jdW1lbnQoKTsNCi0gICAgQ1hGQV9TY3JpcHRDb250ZXh0KiBscFNjcmlwdENvbnRleHQgPSAoQ1hGQV9TY3JpcHRDb250ZXh0KilwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgIENYRkFfT2JqZWN0KiBscEN1ck5vZGUgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMobHBPcmdpbmFsTm9kZSk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvcE5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKGNvbnN0IEZYX0NIQVIqKXN6UHJvcE5hbWUuR2V0UHRyKCksIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpOw0KLSAgICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfCBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlczsNCi0gICAgQ1hGQV9Ob2RlKiBwUmVmTm9kZSA9IChDWEZBX05vZGUqKWxwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpOw0KLSAgICBpZihscE9yZ2luYWxOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfVmFyaWFibGVzVGhpcykgew0KLSAgICAgICAgcFJlZk5vZGUgPSAoQ1hGQV9Ob2RlKilscEN1ck5vZGU7DQorRlhfQk9PTCBDWEZBX1NjcmlwdENvbnRleHQ6OlF1ZXJ5Tm9kZUJ5RmxhZyhDWEZBX05vZGUqIHJlZk5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHByb3BuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcpIHsNCisgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvbHZlUnM7DQorICBpbnQzMl90IGlSZXQgPSBSZXNvbHZlT2JqZWN0cyhyZWZOb2RlLCBwcm9wbmFtZSwgcmVzb2x2ZVJzLCBkd0ZsYWcpOw0KKyAgRlhfQk9PTCBiUmVzdWx0ID0gRkFMU0U7DQorICBpZiAoaVJldCA+IDApIHsNCisgICAgYlJlc3VsdCA9IFRSVUU7DQorICAgIGlmIChyZXNvbHZlUnMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgcFZhbHVlID0gR2V0SlNWYWx1ZUZyb21NYXAocmVzb2x2ZVJzLm5vZGVzWzBdKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCBwVmFsdWUpOw0KKyAgICB9IGVsc2UgaWYgKHJlc29sdmVScy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9BdHRyaWJ1dGUpIHsNCisgICAgICBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBscEF0dHJpYnV0ZUluZm8gPSByZXNvbHZlUnMucFNjcmlwdEF0dHJpYnV0ZTsNCisgICAgICBpZiAobHBBdHRyaWJ1dGVJbmZvKSB7DQorICAgICAgICAocmVzb2x2ZVJzLm5vZGVzWzBdLT4qKGxwQXR0cmlidXRlSW5mby0+bHBmbkNhbGxiYWNrKSkoDQorICAgICAgICAgICAgaFZhbHVlLCBiU2V0dGluZywgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYobHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcocFJlZk5vZGUsIHdzUHJvcE5hbWUsIGhWYWx1ZSwgZHdGbGFnLCBUUlVFKSkgew0KKyAgfQ0KKyAgcmV0dXJuIGJSZXN1bHQ7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eUdldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ1hGQV9PYmplY3QqIHBPcmdpbmFsT2JqZWN0ID0NCisgICAgICAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhPYmplY3QsIE5VTEwpOw0KKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBPcmdpbmFsT2JqZWN0LT5HZXREb2N1bWVudCgpOw0KKyAgQ1hGQV9TY3JpcHRDb250ZXh0KiBscFNjcmlwdENvbnRleHQgPQ0KKyAgICAgIChDWEZBX1NjcmlwdENvbnRleHQqKXBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIENYRkFfT2JqZWN0KiBscEN1ck5vZGUgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yZ2luYWxPYmplY3QpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgNCisgICAgICAoY29uc3QgRlhfQ0hBUiopc3pQcm9wTmFtZS5HZXRQdHIoKSwgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQorICBpZiAobHBTY3JpcHRDb250ZXh0LT5HZXRUeXBlKCkgPT0gWEZBX1NDUklQVExBTkdUWVBFX0Zvcm1jYWxjKSB7DQorICAgIGlmIChzelByb3BOYW1lID09IEZYX0JTVFJDKEZPWElUX1hGQV9GTTJKU19GT1JNQ0FMQ19SVU5USU1FKSkgew0KKyAgICAgIFhGQV9GTTJKU19HbG9iYWxQcm9wZXJ0eUdldHRlcihscFNjcmlwdENvbnRleHQtPm1faEZNMkpTQ29udGV4dCwgaFZhbHVlKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgdWludDMyX3QgdUhhc2hDb2RlID0NCisgICAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzUHJvcE5hbWUsIHdzUHJvcE5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBpZiAodUhhc2hDb2RlICE9IFhGQV9IQVNIQ09ERV9MYXlvdXQpIHsNCisgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9DQorICAgICAgICAgIGxwU2NyaXB0Q29udGV4dC0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZSh1SGFzaENvZGUpOw0KKyAgICAgIGlmIChwT2JqZWN0KSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCBscFNjcmlwdENvbnRleHQtPkdldEpTVmFsdWVGcm9tTWFwKHBPYmplY3QpKTsNCiAgICAgICAgIHJldHVybjsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYobHBPcmdpbmFsTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX1ZhcmlhYmxlc1RoaXMpIHsNCi0gICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChoVmFsdWUpKSB7DQotICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0T3duUHJvcChoT2JqZWN0LCBzelByb3BOYW1lLCBoVmFsdWUpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IHBEb2MtPkdldE5vdGlmeSgpOw0KLSAgICBpZiAoIXBOb3RpZnkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRHbG9iYWxQcm9wZXJ0eShwTm90aWZ5LT5HZXRIRE9DKCksIHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQorICB9DQorICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8DQorICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlczsNCisgIENYRkFfTm9kZSogcFJlZk5vZGUgPSAoQ1hGQV9Ob2RlKilscFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsNCisgIGlmIChwT3JnaW5hbE9iamVjdC0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX1ZhcmlhYmxlc1RoaXMpIHsNCisgICAgcFJlZk5vZGUgPSAoQ1hGQV9Ob2RlKilscEN1ck5vZGU7DQorICB9DQorICBpZiAobHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcocFJlZk5vZGUsIHdzUHJvcE5hbWUsIGhWYWx1ZSwgZHdGbGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KKyAgaWYgKGxwU2NyaXB0Q29udGV4dC0+UXVlcnlOb2RlQnlGbGFnKHBSZWZOb2RlLCB3c1Byb3BOYW1lLCBoVmFsdWUsIGR3RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9PYmplY3QqIHBTY3JpcHRPYmplY3QgPQ0KKyAgICAgIGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JnaW5hbE9iamVjdCwgVFJVRSk7DQorICBpZiAocFNjcmlwdE9iamVjdCAmJg0KKyAgICAgIGxwU2NyaXB0Q29udGV4dC0+UXVlcnlWYXJpYWJsZUhWYWx1ZSgoQ1hGQV9Ob2RlKilwU2NyaXB0T2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelByb3BOYW1lLCBoVmFsdWUsIFRSVUUpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChscFNjcmlwdENvbnRleHQtPlF1ZXJ5QnVpbHRpbkhWYWx1ZShzelByb3BOYW1lLCBoVmFsdWUpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gcERvYy0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0R2xvYmFsUHJvcGVydHkocE5vdGlmeS0+R2V0SERPQygpLCBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFZhbHVlKTsNCiB9DQotRlhfQk9PTAlDWEZBX1NjcmlwdENvbnRleHQ6OlF1ZXJ5Tm9kZUJ5RmxhZyhDWEZBX05vZGUqIHJlZk5vZGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcHJvcG5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0RXT1JEIGR3RmxhZywgIEZYX0JPT0wgYlNldHRpbmcpDQotew0KLSAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb2x2ZVJzOw0KLSAgICBpbnQzMl90IGlSZXQgPSBSZXNvbHZlT2JqZWN0cyhyZWZOb2RlLCBwcm9wbmFtZSwgcmVzb2x2ZVJzLCBkd0ZsYWcpOw0KLSAgICBGWF9CT09MIGJSZXN1bHQgPSBGQUxTRTsNCi0gICAgaWYgKGlSZXQgPiAwKSB7DQotICAgICAgICBiUmVzdWx0ID0gVFJVRTsNCi0gICAgICAgIGlmKHJlc29sdmVScy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2Rlcykgew0KLSAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBwVmFsdWUgPSBHZXRKU1ZhbHVlRnJvbU1hcChyZXNvbHZlUnMubm9kZXNbMF0pOw0KLSAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIHBWYWx1ZSk7DQotICAgICAgICB9IGVsc2UgaWYocmVzb2x2ZVJzLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX0F0dHJpYnV0ZSkgew0KLSAgICAgICAgICAgIFhGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPIGxwQXR0cmlidXRlSW5mbyA9IHJlc29sdmVScy5wU2NyaXB0QXR0cmlidXRlOw0KLSAgICAgICAgICAgIGlmKGxwQXR0cmlidXRlSW5mbykgew0KLSAgICAgICAgICAgICAgICAocmVzb2x2ZVJzLm5vZGVzWzBdLT4qKGxwQXR0cmlidXRlSW5mby0+bHBmbkNhbGxiYWNrKSkoaFZhbHVlLCBiU2V0dGluZywgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGJSZXN1bHQ7DQotfQ0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eUdldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCi17DQotICAgIENYRkFfT2JqZWN0KiBwT3JnaW5hbE9iamVjdCA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaE9iamVjdCwgTlVMTCk7DQotICAgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwT3JnaW5hbE9iamVjdC0+R2V0RG9jdW1lbnQoKTsNCi0gICAgQ1hGQV9TY3JpcHRDb250ZXh0KiBscFNjcmlwdENvbnRleHQgPSAoQ1hGQV9TY3JpcHRDb250ZXh0KilwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgIENYRkFfT2JqZWN0KiBscEN1ck5vZGUgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yZ2luYWxPYmplY3QpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KChjb25zdCBGWF9DSEFSKilzelByb3BOYW1lLkdldFB0cigpLCBzelByb3BOYW1lLkdldExlbmd0aCgpKTsNCi0gICAgaWYgKGxwU2NyaXB0Q29udGV4dC0+R2V0VHlwZSgpID09IFhGQV9TQ1JJUFRMQU5HVFlQRV9Gb3JtY2FsYykgew0KLSAgICAgICAgaWYoc3pQcm9wTmFtZSA9PSBGWF9CU1RSQyhGT1hJVF9YRkFfRk0ySlNfRk9STUNBTENfUlVOVElNRSkpIHsNCi0gICAgICAgICAgICBYRkFfRk0ySlNfR2xvYmFsUHJvcGVydHlHZXR0ZXIobHBTY3JpcHRDb250ZXh0LT5tX2hGTTJKU0NvbnRleHQsIGhWYWx1ZSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdWludDMyX3QgdUhhc2hDb2RlID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NQcm9wTmFtZSwgd3NQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQotICAgICAgICBpZih1SGFzaENvZGUgIT0gWEZBX0hBU0hDT0RFX0xheW91dCkgew0KLSAgICAgICAgICAgIENYRkFfT2JqZWN0ICogcE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZSh1SGFzaENvZGUpOw0KLSAgICAgICAgICAgIGlmIChwT2JqZWN0KSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIGxwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAocE9iamVjdCkpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXM7DQotICAgIENYRkFfTm9kZSogcFJlZk5vZGUgPSAoQ1hGQV9Ob2RlKilscFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsNCi0gICAgaWYocE9yZ2luYWxPYmplY3QtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9WYXJpYWJsZXNUaGlzKSB7DQotICAgICAgICBwUmVmTm9kZSA9IChDWEZBX05vZGUqKWxwQ3VyTm9kZTsNCi0gICAgfQ0KLSAgICBpZihscFNjcmlwdENvbnRleHQtPlF1ZXJ5Tm9kZUJ5RmxhZyhwUmVmTm9kZSwgd3NQcm9wTmFtZSwgaFZhbHVlLCBkd0ZsYWcsIEZBTFNFKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbFByb3BlcnR5R2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDWEZBX09iamVjdCogcE9yZ2luYWxPYmplY3QgPQ0KKyAgICAgIChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaE9iamVjdCwgTlVMTCk7DQorICBpZiAocE9yZ2luYWxPYmplY3QgPT0gTlVMTCkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVbmRlZmluZWQoaFZhbHVlKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgNCisgICAgICAoY29uc3QgRlhfQ0hBUiopc3pQcm9wTmFtZS5HZXRQdHIoKSwgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQorICBDWEZBX1NjcmlwdENvbnRleHQqIGxwU2NyaXB0Q29udGV4dCA9DQorICAgICAgKENYRkFfU2NyaXB0Q29udGV4dCopcE9yZ2luYWxPYmplY3QtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsNCisgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPcmdpbmFsT2JqZWN0KTsNCisgIGlmICh3c1Byb3BOYW1lID09IEZYX1dTVFJDKEwieGZhIikpIHsNCisgICAgRlhKU0VfSFZBTFVFIHBWYWx1ZSA9IGxwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAoDQorICAgICAgICBscFNjcmlwdENvbnRleHQtPkdldERvY3VtZW50KCktPkdldFJvb3QoKSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIHBWYWx1ZSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwNCisgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzOw0KKyAgRlhfQk9PTCBiUmV0ID0gbHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcoDQorICAgICAgKENYRkFfTm9kZSopcE9iamVjdCwgd3NQcm9wTmFtZSwgaFZhbHVlLCBkd0ZsYWcsIEZBTFNFKTsNCisgIGlmIChiUmV0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwT2JqZWN0ID09IGxwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpIHx8DQorICAgICAgKGxwU2NyaXB0Q29udGV4dC0+R2V0VHlwZSgpID09IFhGQV9TQ1JJUFRMQU5HVFlQRV9KYXZhc2NyaXB0ICYmDQorICAgICAgICFscFNjcmlwdENvbnRleHQtPklzU3RyaWN0U2NvcGVJbkphdmFTY3JpcHQoKSkpIHsNCiAgICAgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCi0gICAgaWYobHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcocFJlZk5vZGUsIHdzUHJvcE5hbWUsIGhWYWx1ZSwgZHdGbGFnLCBGQUxTRSkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX09iamVjdCogcFNjcmlwdE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JnaW5hbE9iamVjdCwgVFJVRSk7DQotICAgIGlmIChwU2NyaXB0T2JqZWN0ICYmIGxwU2NyaXB0Q29udGV4dC0+UXVlcnlWYXJpYWJsZUhWYWx1ZSgoQ1hGQV9Ob2RlICopcFNjcmlwdE9iamVjdCwgc3pQcm9wTmFtZSwgaFZhbHVlLCBUUlVFKSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChscFNjcmlwdENvbnRleHQtPlF1ZXJ5QnVpbHRpbkhWYWx1ZShzelByb3BOYW1lLCBoVmFsdWUpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBwRG9jLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0R2xvYmFsUHJvcGVydHkocE5vdGlmeS0+R2V0SERPQygpLCBzelByb3BOYW1lLCBoVmFsdWUpOw0KKyAgICBiUmV0ID0gbHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcoKENYRkFfTm9kZSopcE9iamVjdCwgd3NQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhWYWx1ZSwgZHdGbGFnLCBGQUxTRSk7DQorICB9DQorICBpZiAoYlJldCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX09iamVjdCogcFNjcmlwdE9iamVjdCA9DQorICAgICAgbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPcmdpbmFsT2JqZWN0LCBUUlVFKTsNCisgIGlmIChwU2NyaXB0T2JqZWN0KSB7DQorICAgIGJSZXQgPSBscFNjcmlwdENvbnRleHQtPlF1ZXJ5VmFyaWFibGVIVmFsdWUoKENYRkFfTm9kZSopcFNjcmlwdE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelByb3BOYW1lLCBoVmFsdWUsIFRSVUUpOw0KKyAgfQ0KKyAgaWYgKCFiUmV0KSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChoVmFsdWUpOw0KKyAgfQ0KIH0NCi12b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcGVydHlHZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLSAgICBDWEZBX09iamVjdCogcE9yZ2luYWxPYmplY3QgPSAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhPYmplY3QsIE5VTEwpOw0KLSAgICBpZihwT3JnaW5hbE9iamVjdCA9PSBOVUxMKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVbmRlZmluZWQoaFZhbHVlKTsNCi0gICAgICAgIHJldHVybjsNCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcGVydHlTZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENYRkFfT2JqZWN0KiBwT3JnaW5hbE9iamVjdCA9DQorICAgICAgKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgIGlmIChwT3JnaW5hbE9iamVjdCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0NCisgICAgICAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT3JnaW5hbE9iamVjdC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yZ2luYWxPYmplY3QpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgNCisgICAgICAoY29uc3QgRlhfQ0hBUiopc3pQcm9wTmFtZS5HZXRQdHIoKSwgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQorICBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBscEF0dHJpYnV0ZUluZm8gPQ0KKyAgICAgIFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUocE9iamVjdC0+R2V0Q2xhc3NJRCgpLCB3c1Byb3BOYW1lKTsNCisgIGlmIChscEF0dHJpYnV0ZUluZm8pIHsNCisgICAgKHBPYmplY3QtPioobHBBdHRyaWJ1dGVJbmZvLT5scGZuQ2FsbGJhY2spKSgNCisgICAgICAgIGhWYWx1ZSwgVFJVRSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChwT2JqZWN0LT5Jc05vZGUoKSkgew0KKyAgICAgIGlmICh3c1Byb3BOYW1lLkdldEF0KDApID09ICcjJykgew0KKyAgICAgICAgd3NQcm9wTmFtZSA9IHdzUHJvcE5hbWUuUmlnaHQod3NQcm9wTmFtZS5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBOb2RlID0gKENYRkFfTm9kZSopcE9iamVjdDsNCisgICAgICBDWEZBX05vZGUqIHBQcm9wT3JDaGlsZCA9IE5VTEw7DQorICAgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIGxwRWxlbWVudEluZm8gPSBYRkFfR2V0RWxlbWVudEJ5TmFtZSh3c1Byb3BOYW1lKTsNCisgICAgICBpZiAobHBFbGVtZW50SW5mbykgew0KKyAgICAgICAgcFByb3BPckNoaWxkID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIGxwRWxlbWVudEluZm8tPmVOYW1lKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcFByb3BPckNoaWxkID0gcE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUod3NQcm9wTmFtZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwUHJvcE9yQ2hpbGQpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGVmYXVsdE5hbWUgPSBGWF9XU1RSQyhMIntkZWZhdWx0fSIpOw0KKyAgICAgICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gbHBBdHRyaWJ1dGVJbmZvID0NCisgICAgICAgICAgICBYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKHBQcm9wT3JDaGlsZC0+R2V0Q2xhc3NJRCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NEZWZhdWx0TmFtZSk7DQorICAgICAgICBpZiAobHBBdHRyaWJ1dGVJbmZvKSB7DQorICAgICAgICAgIChwUHJvcE9yQ2hpbGQtPioobHBBdHRyaWJ1dGVJbmZvLT5scGZuQ2FsbGJhY2spKSgNCisgICAgICAgICAgICAgIGhWYWx1ZSwgVFJVRSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KChjb25zdCBGWF9DSEFSKilzelByb3BOYW1lLkdldFB0cigpLCBzelByb3BOYW1lLkdldExlbmd0aCgpKTsNCi0gICAgQ1hGQV9TY3JpcHRDb250ZXh0KiBscFNjcmlwdENvbnRleHQgPSAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT3JnaW5hbE9iamVjdC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KLSAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JnaW5hbE9iamVjdCk7DQotICAgIGlmKHdzUHJvcE5hbWUgPT0gRlhfV1NUUkMoTCJ4ZmEiKSkgew0KLSAgICAgICAgRlhKU0VfSFZBTFVFIHBWYWx1ZSA9IGxwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAobHBTY3JpcHRDb250ZXh0LT5HZXREb2N1bWVudCgpLT5HZXRSb290KCkpOw0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwgcFZhbHVlKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzOw0KLSAgICBGWF9CT09MIGJSZXQgPSBscFNjcmlwdENvbnRleHQtPlF1ZXJ5Tm9kZUJ5RmxhZygoQ1hGQV9Ob2RlICopcE9iamVjdCwgd3NQcm9wTmFtZSwgaFZhbHVlLCBkd0ZsYWcsIEZBTFNFKTsNCi0gICAgaWYoYlJldCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChwT2JqZWN0ID09IGxwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpIHx8IChscFNjcmlwdENvbnRleHQtPkdldFR5cGUoKSA9PSBYRkFfU0NSSVBUTEFOR1RZUEVfSmF2YXNjcmlwdCAmJiAhbHBTY3JpcHRDb250ZXh0LT5Jc1N0cmljdFNjb3BlSW5KYXZhU2NyaXB0KCkpKSB7DQotICAgICAgICBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KLSAgICAgICAgYlJldCA9IGxwU2NyaXB0Q29udGV4dC0+UXVlcnlOb2RlQnlGbGFnKChDWEZBX05vZGUgKilwT2JqZWN0LCB3c1Byb3BOYW1lLCBoVmFsdWUsIGR3RmxhZywgRkFMU0UpOw0KLSAgICB9DQotICAgIGlmKGJSZXQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX09iamVjdCogcFNjcmlwdE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JnaW5hbE9iamVjdCwgVFJVRSk7DQorICAgIENYRkFfT2JqZWN0KiBwU2NyaXB0T2JqZWN0ID0NCisgICAgICAgIGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JnaW5hbE9iamVjdCwgVFJVRSk7DQogICAgIGlmIChwU2NyaXB0T2JqZWN0KSB7DQotICAgICAgICBiUmV0ID0gbHBTY3JpcHRDb250ZXh0LT5RdWVyeVZhcmlhYmxlSFZhbHVlKChDWEZBX05vZGUgKilwU2NyaXB0T2JqZWN0LCBzelByb3BOYW1lLCBoVmFsdWUsIFRSVUUpOw0KKyAgICAgIGxwU2NyaXB0Q29udGV4dC0+UXVlcnlWYXJpYWJsZUhWYWx1ZSgoQ1hGQV9Ob2RlKilwU2NyaXB0T2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelByb3BOYW1lLCBoVmFsdWUsIEZBTFNFKTsNCiAgICAgfQ0KLSAgICBpZiAoIWJSZXQpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChoVmFsdWUpOw0KLSAgICB9DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wZXJ0eVNldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCi17DQotICAgIENYRkFfT2JqZWN0KiBwT3JnaW5hbE9iamVjdCA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaE9iamVjdCwgTlVMTCk7DQotICAgIGlmKHBPcmdpbmFsT2JqZWN0ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX1NjcmlwdENvbnRleHQqIGxwU2NyaXB0Q29udGV4dCA9IChDWEZBX1NjcmlwdENvbnRleHQqKXBPcmdpbmFsT2JqZWN0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPcmdpbmFsT2JqZWN0KTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgoY29uc3QgRlhfQ0hBUiopc3pQcm9wTmFtZS5HZXRQdHIoKSwgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQotICAgIFhGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPIGxwQXR0cmlidXRlSW5mbyA9IFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUocE9iamVjdC0+R2V0Q2xhc3NJRCgpLCB3c1Byb3BOYW1lKTsNCi0gICAgaWYobHBBdHRyaWJ1dGVJbmZvKSB7DQotICAgICAgICAocE9iamVjdC0+KihscEF0dHJpYnV0ZUluZm8tPmxwZm5DYWxsYmFjaykpKGhWYWx1ZSwgVFJVRSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGlmKHBPYmplY3QtPklzTm9kZSgpKSB7DQotICAgICAgICAgICAgaWYod3NQcm9wTmFtZS5HZXRBdCgwKSA9PSAnIycpIHsNCi0gICAgICAgICAgICAgICAgd3NQcm9wTmFtZSA9IHdzUHJvcE5hbWUuUmlnaHQod3NQcm9wTmFtZS5HZXRMZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gKENYRkFfTm9kZSopcE9iamVjdDsNCi0gICAgICAgICAgICBDWEZBX05vZGUgKnBQcm9wT3JDaGlsZCA9IE5VTEw7DQotICAgICAgICAgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIGxwRWxlbWVudEluZm8gPSAgWEZBX0dldEVsZW1lbnRCeU5hbWUod3NQcm9wTmFtZSk7DQotICAgICAgICAgICAgaWYgKGxwRWxlbWVudEluZm8pIHsNCi0gICAgICAgICAgICAgICAgcFByb3BPckNoaWxkID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIGxwRWxlbWVudEluZm8tPmVOYW1lKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBwUHJvcE9yQ2hpbGQgPSBwTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZSh3c1Byb3BOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHBQcm9wT3JDaGlsZCkgew0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RlZmF1bHROYW1lID0gRlhfV1NUUkMoTCJ7ZGVmYXVsdH0iKTsNCi0gICAgICAgICAgICAgICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gbHBBdHRyaWJ1dGVJbmZvID0gWEZBX0dldFNjcmlwdEF0dHJpYnV0ZUJ5TmFtZShwUHJvcE9yQ2hpbGQtPkdldENsYXNzSUQoKSwgd3NEZWZhdWx0TmFtZSk7DQotICAgICAgICAgICAgICAgIGlmKGxwQXR0cmlidXRlSW5mbykgew0KLSAgICAgICAgICAgICAgICAgICAgKHBQcm9wT3JDaGlsZC0+KihscEF0dHJpYnV0ZUluZm8tPmxwZm5DYWxsYmFjaykpKGhWYWx1ZSwgVFJVRSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIENYRkFfT2JqZWN0KiBwU2NyaXB0T2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPcmdpbmFsT2JqZWN0LCBUUlVFKTsNCi0gICAgICAgIGlmIChwU2NyaXB0T2JqZWN0KSB7DQotICAgICAgICAgICAgbHBTY3JpcHRDb250ZXh0LT5RdWVyeVZhcmlhYmxlSFZhbHVlKChDWEZBX05vZGUgKilwU2NyaXB0T2JqZWN0LCBzelByb3BOYW1lLCBoVmFsdWUsIEZBTFNFKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KK2ludDMyX3QgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wVHlwZUdldHRlcigNCisgICAgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgIEZYX0JPT0wgYlF1ZXJ5SW4pIHsNCisgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgIGlmIChwT2JqZWN0ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfTm9uZTsNCisgIH0NCisgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0NCisgICAgICAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT2JqZWN0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPYmplY3QpOw0KKyAgWEZBX0VMRU1FTlQgb2JqRWxlbWVudCA9IHBPYmplY3QtPkdldENsYXNzSUQoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzUHJvcE5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoDQorICAgICAgKGNvbnN0IEZYX0NIQVIqKXN6UHJvcE5hbWUuR2V0UHRyKCksIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgaWYgKFhGQV9HZXRNZXRob2RCeU5hbWUob2JqRWxlbWVudCwgd3NQcm9wTmFtZSkpIHsNCisgICAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kOw0KKyAgfQ0KKyAgaWYgKGJRdWVyeUluICYmICFYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKG9iakVsZW1lbnQsIHdzUHJvcE5hbWUpKSB7DQorICAgIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX05vbmU7DQorICB9DQorICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eTsNCiB9DQotaW50MzJfdCBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbFByb3BUeXBlR2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWF9CT09MIGJRdWVyeUluKQ0KLXsNCi0gICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhPYmplY3QsIE5VTEwpOw0KLSAgICBpZihwT2JqZWN0ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX05vbmU7DQotICAgIH0NCi0gICAgQ1hGQV9TY3JpcHRDb250ZXh0KiBscFNjcmlwdENvbnRleHQgPSAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT2JqZWN0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQotICAgIHBPYmplY3QgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9iamVjdCk7DQotICAgIFhGQV9FTEVNRU5UIG9iakVsZW1lbnQgPSBwT2JqZWN0LT5HZXRDbGFzc0lEKCk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvcE5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKGNvbnN0IEZYX0NIQVIqKXN6UHJvcE5hbWUuR2V0UHRyKCksIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpOw0KLSAgICBpZihYRkFfR2V0TWV0aG9kQnlOYW1lKG9iakVsZW1lbnQsIHdzUHJvcE5hbWUpKSB7DQotICAgICAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9NZXRob2Q7DQotICAgIH0NCi0gICAgaWYgKGJRdWVyeUluICYmICFYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKG9iakVsZW1lbnQsIHdzUHJvcE5hbWUpKSB7DQotICAgICAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOw0KLSAgICB9DQotICAgIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX1Byb3BlcnR5Ow0KK2ludDMyX3QgQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wVHlwZUdldHRlcigNCisgICAgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgIEZYX0JPT0wgYlF1ZXJ5SW4pIHsNCisgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgIGlmIChwT2JqZWN0ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfTm9uZTsNCisgIH0NCisgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0NCisgICAgICAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT2JqZWN0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPYmplY3QpOw0KKyAgWEZBX0VMRU1FTlQgb2JqRWxlbWVudCA9IHBPYmplY3QtPkdldENsYXNzSUQoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzUHJvcE5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoDQorICAgICAgKGNvbnN0IEZYX0NIQVIqKXN6UHJvcE5hbWUuR2V0UHRyKCksIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgaWYgKFhGQV9HZXRNZXRob2RCeU5hbWUob2JqRWxlbWVudCwgd3NQcm9wTmFtZSkpIHsNCisgICAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kOw0KKyAgfQ0KKyAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHk7DQogfQ0KLWludDMyX3QJQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wVHlwZUdldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwgRlhfQk9PTCBiUXVlcnlJbikNCi17DQotICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCi0gICAgaWYocE9iamVjdCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOw0KLSAgICB9DQotICAgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0gKENYRkFfU2NyaXB0Q29udGV4dCopcE9iamVjdC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KLSAgICBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPYmplY3QpOw0KLSAgICBYRkFfRUxFTUVOVCBvYmpFbGVtZW50ID0gcE9iamVjdC0+R2V0Q2xhc3NJRCgpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KChjb25zdCBGWF9DSEFSKilzelByb3BOYW1lLkdldFB0cigpLCBzelByb3BOYW1lLkdldExlbmd0aCgpKTsNCi0gICAgaWYoWEZBX0dldE1ldGhvZEJ5TmFtZShvYmpFbGVtZW50LCB3c1Byb3BOYW1lKSkgew0KLSAgICAgICAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kOw0KLSAgICB9DQotICAgIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX1Byb3BlcnR5Ow0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxNZXRob2RDYWxsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpZiAocE9iamVjdCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0NCisgICAgICAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT2JqZWN0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPYmplY3QpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGdW5OYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KA0KKyAgICAgIChjb25zdCBGWF9DSEFSKilzekZ1bmNOYW1lLkdldFB0cigpLCBzekZ1bmNOYW1lLkdldExlbmd0aCgpKTsNCisgIFhGQV9MUENNRVRIT0RJTkZPIGxwTWV0aG9kSW5mbyA9DQorICAgICAgWEZBX0dldE1ldGhvZEJ5TmFtZShwT2JqZWN0LT5HZXRDbGFzc0lEKCksIHdzRnVuTmFtZSk7DQorICBpZiAoTlVMTCA9PSBscE1ldGhvZEluZm8pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgKHBPYmplY3QtPioobHBNZXRob2RJbmZvLT5scGZuQ2FsbGJhY2spKSgmYXJncyk7DQogfQ0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxNZXRob2RDYWxsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncykNCi17DQotICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQotICAgIGlmKHBPYmplY3QgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0gKENYRkFfU2NyaXB0Q29udGV4dCopcE9iamVjdC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KLSAgICBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPYmplY3QpOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Z1bk5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKGNvbnN0IEZYX0NIQVIqKXN6RnVuY05hbWUuR2V0UHRyKCksIHN6RnVuY05hbWUuR2V0TGVuZ3RoKCkpOw0KLSAgICBYRkFfTFBDTUVUSE9ESU5GTyBscE1ldGhvZEluZm8gPSBYRkFfR2V0TWV0aG9kQnlOYW1lKHBPYmplY3QtPkdldENsYXNzSUQoKSwgd3NGdW5OYW1lKTsNCi0gICAgaWYoTlVMTCA9PSBscE1ldGhvZEluZm8pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICAocE9iamVjdC0+KihscE1ldGhvZEluZm8tPmxwZm5DYWxsYmFjaykpKCZhcmdzKTsNCitGWF9CT09MIENYRkFfU2NyaXB0Q29udGV4dDo6SXNTdHJpY3RTY29wZUluSmF2YVNjcmlwdCgpIHsNCisgIHJldHVybiBtX3BEb2N1bWVudC0+SGFzRmxhZyhYRkFfRE9DRkxBR19TdHJpY3RTY29waW5nKTsNCiB9DQotRlhfQk9PTCBDWEZBX1NjcmlwdENvbnRleHQ6OklzU3RyaWN0U2NvcGVJbkphdmFTY3JpcHQoKQ0KLXsNCi0gICAgcmV0dXJuIG1fcERvY3VtZW50LT5IYXNGbGFnKFhGQV9ET0NGTEFHX1N0cmljdFNjb3BpbmcpOw0KK1hGQV9TQ1JJUFRMQU5HVFlQRSBDWEZBX1NjcmlwdENvbnRleHQ6OkdldFR5cGUoKSB7DQorICByZXR1cm4gbV9lU2NyaXB0VHlwZTsNCiB9DQotWEZBX1NDUklQVExBTkdUWVBFIENYRkFfU2NyaXB0Q29udGV4dDo6R2V0VHlwZSgpDQotew0KLSAgICByZXR1cm4gbV9lU2NyaXB0VHlwZTsNCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6RGVmaW5lSnNDb250ZXh0KCkgew0KKyAgbV9Kc0dsb2JhbENsYXNzLmNvbnN0cnVjdG9yID0gTlVMTDsNCisgIG1fSnNHbG9iYWxDbGFzcy5uYW1lID0gIlJvb3QiOw0KKyAgbV9Kc0dsb2JhbENsYXNzLnByb3BOdW0gPSAwOw0KKyAgbV9Kc0dsb2JhbENsYXNzLnByb3BlcnRpZXMgPSBOVUxMOw0KKyAgbV9Kc0dsb2JhbENsYXNzLm1ldGhOdW0gPSAwOw0KKyAgbV9Kc0dsb2JhbENsYXNzLm1ldGhvZHMgPSBOVUxMOw0KKyAgbV9Kc0dsb2JhbENsYXNzLmR5blByb3BHZXR0ZXIgPSBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5R2V0dGVyOw0KKyAgbV9Kc0dsb2JhbENsYXNzLmR5blByb3BTZXR0ZXIgPSBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5U2V0dGVyOw0KKyAgbV9Kc0dsb2JhbENsYXNzLmR5blByb3BUeXBlR2V0dGVyID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wVHlwZUdldHRlcjsNCisgIG1fSnNHbG9iYWxDbGFzcy5keW5Qcm9wRGVsZXRlciA9IE5VTEw7DQorICBtX0pzR2xvYmFsQ2xhc3MuZHluTWV0aG9kQ2FsbCA9IENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsTWV0aG9kQ2FsbDsNCisgIG1faEpzQ29udGV4dCA9IEZYSlNFX0NvbnRleHRfQ3JlYXRlKG1faEpzUnVudGltZSwgJm1fSnNHbG9iYWxDbGFzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRSb290KCkpOw0KKyAgRlhKU0VfQ29udGV4dF9FbmFibGVDb21wYXRpYmxlTW9kZSgNCisgICAgICBtX2hKc0NvbnRleHQsIEZYSlNFX0NPTVBBVElCTEVNT0RFRkxBR19DT05TVFJVQ1RPUkVYVFJBTUVUSE9EUyk7DQogfQ0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpEZWZpbmVKc0NvbnRleHQoKQ0KLXsNCi0gICAgbV9Kc0dsb2JhbENsYXNzLmNvbnN0cnVjdG9yID0gTlVMTDsNCi0gICAgbV9Kc0dsb2JhbENsYXNzLm5hbWUgPSAiUm9vdCI7DQotICAgIG1fSnNHbG9iYWxDbGFzcy5wcm9wTnVtID0gMDsNCi0gICAgbV9Kc0dsb2JhbENsYXNzLnByb3BlcnRpZXMgPSBOVUxMOw0KLSAgICBtX0pzR2xvYmFsQ2xhc3MubWV0aE51bSA9IDA7DQotICAgIG1fSnNHbG9iYWxDbGFzcy5tZXRob2RzID0gTlVMTDsNCi0gICAgbV9Kc0dsb2JhbENsYXNzLmR5blByb3BHZXR0ZXIgPSBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5R2V0dGVyOw0KLSAgICBtX0pzR2xvYmFsQ2xhc3MuZHluUHJvcFNldHRlciA9IENYRkFfU2NyaXB0Q29udGV4dDo6R2xvYmFsUHJvcGVydHlTZXR0ZXI7DQotICAgIG1fSnNHbG9iYWxDbGFzcy5keW5Qcm9wVHlwZUdldHRlciA9IENYRkFfU2NyaXB0Q29udGV4dDo6R2xvYmFsUHJvcFR5cGVHZXR0ZXI7DQotICAgIG1fSnNHbG9iYWxDbGFzcy5keW5Qcm9wRGVsZXRlciA9IE5VTEw7DQotICAgIG1fSnNHbG9iYWxDbGFzcy5keW5NZXRob2RDYWxsID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxNZXRob2RDYWxsOw0KLSAgICBtX2hKc0NvbnRleHQgPSBGWEpTRV9Db250ZXh0X0NyZWF0ZShtX2hKc1J1bnRpbWUsICZtX0pzR2xvYmFsQ2xhc3MsIG1fcERvY3VtZW50LT5HZXRSb290KCkpOw0KLSAgICBGWEpTRV9Db250ZXh0X0VuYWJsZUNvbXBhdGlibGVNb2RlKG1faEpzQ29udGV4dCwgRlhKU0VfQ09NUEFUSUJMRU1PREVGTEFHX0NPTlNUUlVDVE9SRVhUUkFNRVRIT0RTKTsNCitGWEpTRV9IQ09OVEVYVCBDWEZBX1NjcmlwdENvbnRleHQ6OkNyZWF0ZVZhcmlhYmxlc0NvbnRleHQoDQorICAgIENYRkFfTm9kZSogcFNjcmlwdE5vZGUsDQorICAgIENYRkFfTm9kZSogcFN1YmZvcm0pIHsNCisgIGlmIChwU2NyaXB0Tm9kZSA9PSBOVUxMIHx8IHBTdWJmb3JtID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAobV9tYXBWYXJpYWJsZVRvSFZhbHVlLkdldENvdW50KCkgPT0gMCkgew0KKyAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MuY29uc3RydWN0b3IgPSBOVUxMOw0KKyAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MubmFtZSA9ICJYRkFTY3JpcHRPYmplY3QiOw0KKyAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MucHJvcE51bSA9IDA7DQorICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5wcm9wZXJ0aWVzID0gTlVMTDsNCisgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLm1ldGhOdW0gPSAwOw0KKyAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MubWV0aG9kcyA9IE5VTEw7DQorICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5keW5Qcm9wR2V0dGVyID0NCisgICAgICAgIENYRkFfU2NyaXB0Q29udGV4dDo6R2xvYmFsUHJvcGVydHlHZXR0ZXI7DQorICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5keW5Qcm9wU2V0dGVyID0NCisgICAgICAgIENYRkFfU2NyaXB0Q29udGV4dDo6R2xvYmFsUHJvcGVydHlTZXR0ZXI7DQorICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5keW5Qcm9wVHlwZUdldHRlciA9DQorICAgICAgICBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbFByb3BUeXBlR2V0dGVyOw0KKyAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MuZHluUHJvcERlbGV0ZXIgPSBOVUxMOw0KKyAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MuZHluTWV0aG9kQ2FsbCA9DQorICAgICAgICBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbE1ldGhvZENhbGw7DQorICB9DQorICBDWEZBX1RoaXNQcm94eSogbHBWYXJpYWJsZU5vZGUgPSBGWF9ORVcgQ1hGQV9UaGlzUHJveHkocFN1YmZvcm0sIHBTY3JpcHROb2RlKTsNCisgIEZYSlNFX0hDT05URVhUIGhWYXJpYWJsZXNDb250ZXh0ID0gRlhKU0VfQ29udGV4dF9DcmVhdGUoDQorICAgICAgbV9oSnNSdW50aW1lLCAmbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLCAoQ1hGQV9PYmplY3QqKWxwVmFyaWFibGVOb2RlKTsNCisgIEZYSlNFX0NvbnRleHRfRW5hYmxlQ29tcGF0aWJsZU1vZGUoDQorICAgICAgaFZhcmlhYmxlc0NvbnRleHQsIEZYSlNFX0NPTVBBVElCTEVNT0RFRkxBR19DT05TVFJVQ1RPUkVYVFJBTUVUSE9EUyk7DQorICBtX21hcFZhcmlhYmxlVG9IVmFsdWUuU2V0QXQocFNjcmlwdE5vZGUsIGhWYXJpYWJsZXNDb250ZXh0KTsNCisgIHJldHVybiBoVmFyaWFibGVzQ29udGV4dDsNCiB9DQotRlhKU0VfSENPTlRFWFQgQ1hGQV9TY3JpcHRDb250ZXh0OjpDcmVhdGVWYXJpYWJsZXNDb250ZXh0KENYRkFfTm9kZSogcFNjcmlwdE5vZGUsIENYRkFfTm9kZSogcFN1YmZvcm0pDQotew0KLSAgICBpZihwU2NyaXB0Tm9kZSA9PSBOVUxMIHx8IHBTdWJmb3JtID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGlmKG1fbWFwVmFyaWFibGVUb0hWYWx1ZS5HZXRDb3VudCgpID09IDApIHsNCi0gICAgICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5jb25zdHJ1Y3RvciA9IE5VTEw7DQotICAgICAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MubmFtZSA9ICJYRkFTY3JpcHRPYmplY3QiOw0KLSAgICAgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLnByb3BOdW0gPSAwOw0KLSAgICAgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLnByb3BlcnRpZXMgPSBOVUxMOw0KLSAgICAgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLm1ldGhOdW0gPSAwOw0KLSAgICAgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLm1ldGhvZHMgPSBOVUxMOw0KLSAgICAgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLmR5blByb3BHZXR0ZXIgPSBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5R2V0dGVyOw0KLSAgICAgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLmR5blByb3BTZXR0ZXIgPSBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5U2V0dGVyOw0KLSAgICAgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLmR5blByb3BUeXBlR2V0dGVyID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wVHlwZUdldHRlcjsNCi0gICAgICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5keW5Qcm9wRGVsZXRlciA9IE5VTEw7DQotICAgICAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MuZHluTWV0aG9kQ2FsbCA9IENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsTWV0aG9kQ2FsbDsNCi0gICAgfQ0KLSAgICBDWEZBX1RoaXNQcm94eSogbHBWYXJpYWJsZU5vZGUgPSBGWF9ORVcgQ1hGQV9UaGlzUHJveHkocFN1YmZvcm0sIHBTY3JpcHROb2RlKTsNCi0gICAgRlhKU0VfSENPTlRFWFQgaFZhcmlhYmxlc0NvbnRleHQgPSBGWEpTRV9Db250ZXh0X0NyZWF0ZShtX2hKc1J1bnRpbWUsICZtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MsIChDWEZBX09iamVjdCopbHBWYXJpYWJsZU5vZGUpOw0KLSAgICBGWEpTRV9Db250ZXh0X0VuYWJsZUNvbXBhdGlibGVNb2RlKGhWYXJpYWJsZXNDb250ZXh0LCBGWEpTRV9DT01QQVRJQkxFTU9ERUZMQUdfQ09OU1RSVUNUT1JFWFRSQU1FVEhPRFMpOw0KLSAgICBtX21hcFZhcmlhYmxlVG9IVmFsdWUuU2V0QXQocFNjcmlwdE5vZGUsIGhWYXJpYWJsZXNDb250ZXh0KTsNCi0gICAgcmV0dXJuIGhWYXJpYWJsZXNDb250ZXh0Ow0KK0NYRkFfT2JqZWN0KiBDWEZBX1NjcmlwdENvbnRleHQ6OkdldFZhcmlhYmxlc1RoaXMoQ1hGQV9PYmplY3QqIHBPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHROb2RlKSB7DQorICBpZiAocE9iamVjdC0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX1ZhcmlhYmxlc1RoaXMpIHsNCisgICAgcmV0dXJuIGJTY3JpcHROb2RlID8gKChDWEZBX1RoaXNQcm94eSopcE9iamVjdCktPkdldFNjcmlwdE5vZGUoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgOiAoKENYRkFfVGhpc1Byb3h5KilwT2JqZWN0KS0+R2V0VGhpc05vZGUoKTsNCisgIH0NCisgIHJldHVybiBwT2JqZWN0Ow0KIH0NCi1DWEZBX09iamVjdCogQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRWYXJpYWJsZXNUaGlzKENYRkFfT2JqZWN0KiBwT2JqZWN0LCAgRlhfQk9PTCBiU2NyaXB0Tm9kZSkNCi17DQotICAgIGlmKHBPYmplY3QtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9WYXJpYWJsZXNUaGlzKSB7DQotICAgICAgICByZXR1cm4gYlNjcmlwdE5vZGUgPyAoKENYRkFfVGhpc1Byb3h5KilwT2JqZWN0KS0+R2V0U2NyaXB0Tm9kZSgpIDogKChDWEZBX1RoaXNQcm94eSopcE9iamVjdCktPkdldFRoaXNOb2RlKCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHBPYmplY3Q7DQotfQ0KLUZYX0JPT0wgQ1hGQV9TY3JpcHRDb250ZXh0OjpSdW5WYXJpYWJsZXNTY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSkNCi17DQotICAgIGlmKHBTY3JpcHROb2RlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZihwU2NyaXB0Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1NjcmlwdCkgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gcFNjcmlwdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KLSAgICAgICAgaWYoIXBQYXJlbnQgfHwgcFBhcmVudC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKG1fbWFwVmFyaWFibGVUb0hWYWx1ZS5HZXRWYWx1ZUF0KHBTY3JpcHROb2RlKSkgew0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ1hGQV9Ob2RlICpwVGV4dE5vZGUgPSBwU2NyaXB0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICAgICAgaWYgKCFwVGV4dE5vZGUpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NTY3JpcHQ7DQotICAgICAgICBpZighcFRleHROb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1NjcmlwdCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBidFNjcmlwdCA9IEZYX1VURjhFbmNvZGUod3NTY3JpcHQuR2V0UHRyKCksIHdzU2NyaXB0LkdldExlbmd0aCgpKTsNCi0gICAgICAgIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUobV9oSnNSdW50aW1lKTsNCi0gICAgICAgIENYRkFfTm9kZSogcFRoaXNPYmplY3QgPSBwUGFyZW50LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgICAgIEZYSlNFX0hDT05URVhUIGhWYXJpYWJsZXNDb250ZXh0ID0gQ3JlYXRlVmFyaWFibGVzQ29udGV4dChwU2NyaXB0Tm9kZSwgcFRoaXNPYmplY3QpOw0KLSAgICAgICAgQ1hGQV9PYmplY3QgKnBPcmlnaW5hbE9iamVjdCA9IG1fcFRoaXNPYmplY3Q7DQotICAgICAgICBtX3BUaGlzT2JqZWN0ID0gcFRoaXNPYmplY3Q7DQotICAgICAgICBGWF9CT09MCWJSZXQgPSBGWEpTRV9FeGVjdXRlU2NyaXB0KGhWYXJpYWJsZXNDb250ZXh0LCBidFNjcmlwdCwgaFJldFZhbHVlKTsNCi0gICAgICAgIG1fcFRoaXNPYmplY3QgPSBwT3JpZ2luYWxPYmplY3Q7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhSZXRWYWx1ZSk7DQotICAgICAgICByZXR1cm4gYlJldDsNCi0gICAgfQ0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotRlhfQk9PTCBDWEZBX1NjcmlwdENvbnRleHQ6OlF1ZXJ5VmFyaWFibGVIVmFsdWUoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJHZXR0ZXIpDQotew0KLSAgICBpZihwU2NyaXB0Tm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1NjcmlwdCkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogdmFyaWFibGVzTm9kZSA9IHBTY3JpcHROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCi0gICAgaWYoIXZhcmlhYmxlc05vZGUgfHwgdmFyaWFibGVzTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIEZYX0JPT0wgYlJlcyA9IEZBTFNFOw0KLSAgICB2b2lkKiBscFZhcmlhYmxlcyA9IG1fbWFwVmFyaWFibGVUb0hWYWx1ZS5HZXRWYWx1ZUF0KHBTY3JpcHROb2RlKTsNCi0gICAgaWYobHBWYXJpYWJsZXMpIHsNCi0gICAgICAgIEZYSlNFX0hDT05URVhUIGhWYXJpYWJsZUNvbnRleHQgPSAoRlhKU0VfSENPTlRFWFQpbHBWYXJpYWJsZXM7DQotICAgICAgICBGWEpTRV9IVkFMVUUgaE9iamVjdCA9IEZYSlNFX0NvbnRleHRfR2V0R2xvYmFsT2JqZWN0KGhWYXJpYWJsZUNvbnRleHQpOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIGhWYXJpYWJsZVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKG1faEpzUnVudGltZSk7DQotICAgICAgICBpZiAoIWJHZXR0ZXIpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3RPd25Qcm9wKGhPYmplY3QsIHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQotICAgICAgICAgICAgYlJlcyA9IFRSVUU7DQotICAgICAgICB9IGVsc2UgaWYoRlhKU0VfVmFsdWVfT2JqZWN0SGFzT3duUHJvcChoT2JqZWN0LCBzelByb3BOYW1lLCBGQUxTRSkpIHsNCi0gICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGhPYmplY3QsIHN6UHJvcE5hbWUsIGhWYXJpYWJsZVZhbHVlKTsNCi0gICAgICAgICAgICBpZihGWEpTRV9WYWx1ZV9Jc0Z1bmN0aW9uKGhWYXJpYWJsZVZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGdW5jdGlvbkJpbmQoaFZhbHVlLCBoVmFyaWFibGVWYWx1ZSwgaE9iamVjdCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChiR2V0dGVyKSB7DQotICAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIGhWYXJpYWJsZVZhbHVlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhcmlhYmxlVmFsdWUsIGhWYWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJSZXMgPSBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFyaWFibGVWYWx1ZSk7DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhPYmplY3QpOw0KLSAgICB9DQotICAgIHJldHVybiBiUmVzOw0KLX0NCi1GWF9CT09MIENYRkFfU2NyaXB0Q29udGV4dDo6UXVlcnlCdWlsdGluSFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCi17DQotICAgIHZvaWQqIHBCdWlsdGluID0gTlVMTDsNCi0gICAgaWYgKChtX2R3QnVpbHRJbkluRmxhZ3MgJiBYRkFfSlNCVUlMVElOX0hhc0NvdW50KSAmJiBtX0pTQnVpbHRJbk9iamVjdHMuTG9va3VwKHN6UHJvcE5hbWUsIHBCdWlsdGluKSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwgKEZYSlNFX0hWQUxVRSlwQnVpbHRpbik7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHRDb250ZXh0OjpSdW5WYXJpYWJsZXNTY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSkgew0KKyAgaWYgKHBTY3JpcHROb2RlID09IE5VTEwpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBTY3JpcHROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU2NyaXB0KSB7DQorICAgIENYRkFfTm9kZSogcFBhcmVudCA9IHBTY3JpcHROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgaWYgKCFwUGFyZW50IHx8IHBQYXJlbnQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKG1fbWFwVmFyaWFibGVUb0hWYWx1ZS5HZXRWYWx1ZUF0KHBTY3JpcHROb2RlKSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFRleHROb2RlID0gcFNjcmlwdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgaWYgKCFwVGV4dE5vZGUpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzU2NyaXB0Ow0KKyAgICBpZiAoIXBUZXh0Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NTY3JpcHQpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9CeXRlU3RyaW5nIGJ0U2NyaXB0ID0NCisgICAgICAgIEZYX1VURjhFbmNvZGUod3NTY3JpcHQuR2V0UHRyKCksIHdzU2NyaXB0LkdldExlbmd0aCgpKTsNCisgICAgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShtX2hKc1J1bnRpbWUpOw0KKyAgICBDWEZBX05vZGUqIHBUaGlzT2JqZWN0ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIEZYSlNFX0hDT05URVhUIGhWYXJpYWJsZXNDb250ZXh0ID0NCisgICAgICAgIENyZWF0ZVZhcmlhYmxlc0NvbnRleHQocFNjcmlwdE5vZGUsIHBUaGlzT2JqZWN0KTsNCisgICAgQ1hGQV9PYmplY3QqIHBPcmlnaW5hbE9iamVjdCA9IG1fcFRoaXNPYmplY3Q7DQorICAgIG1fcFRoaXNPYmplY3QgPSBwVGhpc09iamVjdDsNCisgICAgRlhfQk9PTCBiUmV0ID0gRlhKU0VfRXhlY3V0ZVNjcmlwdChoVmFyaWFibGVzQ29udGV4dCwgYnRTY3JpcHQsIGhSZXRWYWx1ZSk7DQorICAgIG1fcFRoaXNPYmplY3QgPSBwT3JpZ2luYWxPYmplY3Q7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFJldFZhbHVlKTsNCisgICAgcmV0dXJuIGJSZXQ7DQorICB9DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OlJlbGVhc2VWYXJpYWJsZXNNYXAoKQ0KLXsNCi0gICAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFZhcmlhYmxlVG9IVmFsdWUuR2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICB3aGlsZSAocHMpIHsNCi0gICAgICAgIENYRkFfT2JqZWN0KiBwU2NyaXB0Tm9kZTsNCi0gICAgICAgIEZYSlNFX0hDT05URVhUIGhWYXJpYWJsZUNvbnRleHQ7DQotICAgICAgICBtX21hcFZhcmlhYmxlVG9IVmFsdWUuR2V0TmV4dEFzc29jKHBzLCBwU2NyaXB0Tm9kZSwgaFZhcmlhYmxlQ29udGV4dCk7DQotICAgICAgICBGWEpTRV9IVkFMVUUgaE9iamVjdCA9IEZYSlNFX0NvbnRleHRfR2V0R2xvYmFsT2JqZWN0KGhWYXJpYWJsZUNvbnRleHQpOw0KLSAgICAgICAgQ1hGQV9PYmplY3QqIGxwQ3VyTm9kZSA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaE9iamVjdCwgTlVMTCk7DQotICAgICAgICBpZihscEN1ck5vZGUpIHsNCi0gICAgICAgICAgICBkZWxldGUgKENYRkFfVGhpc1Byb3h5KilscEN1ck5vZGU7DQotICAgICAgICAgICAgbHBDdXJOb2RlID0gTlVMTDsNCitGWF9CT09MIENYRkFfU2NyaXB0Q29udGV4dDo6UXVlcnlWYXJpYWJsZUhWYWx1ZSgNCisgICAgQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSwNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJHZXR0ZXIpIHsNCisgIGlmIChwU2NyaXB0Tm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1NjcmlwdCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHZhcmlhYmxlc05vZGUgPSBwU2NyaXB0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICBpZiAoIXZhcmlhYmxlc05vZGUgfHwgdmFyaWFibGVzTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9CT09MIGJSZXMgPSBGQUxTRTsNCisgIHZvaWQqIGxwVmFyaWFibGVzID0gbV9tYXBWYXJpYWJsZVRvSFZhbHVlLkdldFZhbHVlQXQocFNjcmlwdE5vZGUpOw0KKyAgaWYgKGxwVmFyaWFibGVzKSB7DQorICAgIEZYSlNFX0hDT05URVhUIGhWYXJpYWJsZUNvbnRleHQgPSAoRlhKU0VfSENPTlRFWFQpbHBWYXJpYWJsZXM7DQorICAgIEZYSlNFX0hWQUxVRSBoT2JqZWN0ID0gRlhKU0VfQ29udGV4dF9HZXRHbG9iYWxPYmplY3QoaFZhcmlhYmxlQ29udGV4dCk7DQorICAgIEZYSlNFX0hWQUxVRSBoVmFyaWFibGVWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShtX2hKc1J1bnRpbWUpOw0KKyAgICBpZiAoIWJHZXR0ZXIpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3RPd25Qcm9wKGhPYmplY3QsIHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQorICAgICAgYlJlcyA9IFRSVUU7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfT2JqZWN0SGFzT3duUHJvcChoT2JqZWN0LCBzelByb3BOYW1lLCBGQUxTRSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGhPYmplY3QsIHN6UHJvcE5hbWUsIGhWYXJpYWJsZVZhbHVlKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNGdW5jdGlvbihoVmFyaWFibGVWYWx1ZSkpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZ1bmN0aW9uQmluZChoVmFsdWUsIGhWYXJpYWJsZVZhbHVlLCBoT2JqZWN0KTsNCisgICAgICB9IGVsc2UgaWYgKGJHZXR0ZXIpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIGhWYXJpYWJsZVZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGhWYXJpYWJsZVZhbHVlLCBoVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBiUmVzID0gVFJVRTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYXJpYWJsZVZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoT2JqZWN0KTsNCisgIH0NCisgIHJldHVybiBiUmVzOw0KK30NCitGWF9CT09MIENYRkFfU2NyaXB0Q29udGV4dDo6UXVlcnlCdWlsdGluSFZhbHVlKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIHZvaWQqIHBCdWlsdGluID0gTlVMTDsNCisgIGlmICgobV9kd0J1aWx0SW5JbkZsYWdzICYgWEZBX0pTQlVJTFRJTl9IYXNDb3VudCkgJiYNCisgICAgICBtX0pTQnVpbHRJbk9iamVjdHMuTG9va3VwKHN6UHJvcE5hbWUsIHBCdWlsdGluKSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCAoRlhKU0VfSFZBTFVFKXBCdWlsdGluKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpSZWxlYXNlVmFyaWFibGVzTWFwKCkgew0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFZhcmlhYmxlVG9IVmFsdWUuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIENYRkFfT2JqZWN0KiBwU2NyaXB0Tm9kZTsNCisgICAgRlhKU0VfSENPTlRFWFQgaFZhcmlhYmxlQ29udGV4dDsNCisgICAgbV9tYXBWYXJpYWJsZVRvSFZhbHVlLkdldE5leHRBc3NvYyhwcywgcFNjcmlwdE5vZGUsIGhWYXJpYWJsZUNvbnRleHQpOw0KKyAgICBGWEpTRV9IVkFMVUUgaE9iamVjdCA9IEZYSlNFX0NvbnRleHRfR2V0R2xvYmFsT2JqZWN0KGhWYXJpYWJsZUNvbnRleHQpOw0KKyAgICBDWEZBX09iamVjdCogbHBDdXJOb2RlID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgICAgaWYgKGxwQ3VyTm9kZSkgew0KKyAgICAgIGRlbGV0ZSAoQ1hGQV9UaGlzUHJveHkqKWxwQ3VyTm9kZTsNCisgICAgICBscEN1ck5vZGUgPSBOVUxMOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaE9iamVjdCk7DQorICAgIEZYSlNFX0NvbnRleHRfUmVsZWFzZShoVmFyaWFibGVDb250ZXh0KTsNCisgICAgaFZhcmlhYmxlQ29udGV4dCA9IE5VTEw7DQorICB9DQorICBtX21hcFZhcmlhYmxlVG9IVmFsdWUuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpEZWZpbmVKc0NsYXNzKCkgew0KKyAgbV9Kc05vcm1hbENsYXNzLmNvbnN0cnVjdG9yID0gTlVMTDsNCisgIG1fSnNOb3JtYWxDbGFzcy5uYW1lID0gIlhGQU9iamVjdCI7DQorICBtX0pzTm9ybWFsQ2xhc3MucHJvcE51bSA9IDA7DQorICBtX0pzTm9ybWFsQ2xhc3MucHJvcGVydGllcyA9IE5VTEw7DQorICBtX0pzTm9ybWFsQ2xhc3MubWV0aE51bSA9IDA7DQorICBtX0pzTm9ybWFsQ2xhc3MubWV0aG9kcyA9IE5VTEw7DQorICBtX0pzTm9ybWFsQ2xhc3MuZHluUHJvcEdldHRlciA9IENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcGVydHlHZXR0ZXI7DQorICBtX0pzTm9ybWFsQ2xhc3MuZHluUHJvcFNldHRlciA9IENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcGVydHlTZXR0ZXI7DQorICBtX0pzTm9ybWFsQ2xhc3MuZHluUHJvcFR5cGVHZXR0ZXIgPSBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbFByb3BUeXBlR2V0dGVyOw0KKyAgbV9Kc05vcm1hbENsYXNzLmR5blByb3BEZWxldGVyID0gTlVMTDsNCisgIG1fSnNOb3JtYWxDbGFzcy5keW5NZXRob2RDYWxsID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxNZXRob2RDYWxsOw0KKyAgbV9oSnNDbGFzcyA9IEZYSlNFX0RlZmluZUNsYXNzKG1faEpzQ29udGV4dCwgJm1fSnNOb3JtYWxDbGFzcyk7DQorfQ0KK0ZYSlNFX0hDTEFTUyBDWEZBX1NjcmlwdENvbnRleHQ6OkdldEpzZU5vcm1hbENsYXNzKCkgew0KKyAgcmV0dXJuIG1faEpzQ2xhc3M7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpBZGRKU0J1aWx0aW5PYmplY3QoDQorICAgIFhGQV9MUENKU0JVSUxUSU5JTkZPIHBCdWl0aW5PYmplY3QpIHsNCisgIGlmIChtX2R3QnVpbHRJbkluRmxhZ3MgJiBYRkFfSlNCVUlMVElOX0luaXRpYWxpemVkKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fSlNCdWlsdEluT2JqZWN0cy5TZXRBdChwQnVpdGluT2JqZWN0LT5wTmFtZSwgKHZvaWQqKXBCdWl0aW5PYmplY3QpOw0KK30NCitpbnQzMl90IENYRkFfU2NyaXB0Q29udGV4dDo6UmVzb2x2ZU9iamVjdHMoQ1hGQV9PYmplY3QqIHJlZk5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc29sdmVOb2RlUlMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIGJpbmROb2RlKSB7DQorICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChtX2VTY3JpcHRUeXBlICE9IFhGQV9TQ1JJUFRMQU5HVFlQRV9Gb3JtY2FsYyB8fA0KKyAgICAgIChkd1N0eWxlcyAmIChYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzKSkpIHsNCisgICAgbV91cE9iamVjdEFycmF5LlJlbW92ZUFsbCgpOw0KKyAgfQ0KKyAgaWYgKHJlZk5vZGUgJiYNCisgICAgICAoZHdTdHlsZXMgJiAoWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncykpICYmDQorICAgICAgcmVmTm9kZS0+SXNOb2RlKCkpIHsNCisgICAgbV91cE9iamVjdEFycmF5LkFkZCgoQ1hGQV9Ob2RlKilyZWZOb2RlKTsNCisgIH0NCisgIEZYX0JPT0wgYk5leHRDcmVhdGUgPSBGQUxTRTsNCisgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSB7DQorICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+WEZBX1NldENyZWF0ZU5vZGVUeXBlKGJpbmROb2RlKTsNCisgIH0NCisgIG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9wQ3JlYXRlUGFyZW50ID0gTlVMTDsNCisgIG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9pQ3VyQWxsU3RhcnQgPSAtMTsNCisgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSBybmRGaW5kOw0KKyAgaW50MzJfdCBuU3RhcnQgPSAwOw0KKyAgaW50MzJfdCBuTGV2ZWwgPSAwOw0KKyAgaW50MzJfdCBuUmV0ID0gLTE7DQorICBybmRGaW5kLm1fcFNDID0gdGhpczsNCisgIENYRkFfT2JqQXJyYXkgZmluZE5vZGVzOw0KKyAgaWYgKHJlZk5vZGUgIT0gTlVMTCkgew0KKyAgICBmaW5kTm9kZXMuQWRkKHJlZk5vZGUpOw0KKyAgfSBlbHNlIHsNCisgICAgZmluZE5vZGVzLkFkZChtX3BEb2N1bWVudC0+R2V0Um9vdCgpKTsNCisgIH0NCisgIGludDMyX3Qgbk5vZGVzID0gMDsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIG5Ob2RlcyA9IGZpbmROb2Rlcy5HZXRTaXplKCk7DQorICAgIGludDMyX3QgaSA9IDA7DQorICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IGR3U3R5bGVzOw0KKyAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5tX2lDdXJTdGFydCA9IG5TdGFydDsNCisgICAgblN0YXJ0ID0gbV9wUmVzb2x2ZVByb2Nlc3Nvci0+WEZBX1Jlc29sdmVOb2Rlc19HZXRGaWx0ZXIod3NFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU3RhcnQsIHJuZEZpbmQpOw0KKyAgICBpZiAoblN0YXJ0IDwgMSkgew0KKyAgICAgIGlmICgoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgJiYgIWJOZXh0Q3JlYXRlKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IE5VTEw7DQorICAgICAgICBuU3RhcnQgPSBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1faUN1ckFsbFN0YXJ0Ow0KKyAgICAgICAgaWYgKG5TdGFydCAhPSAtMSkgew0KKyAgICAgICAgICBwRGF0YU5vZGUgPSBtX3BEb2N1bWVudC0+R2V0Tm90QmluZE5vZGUoZmluZE5vZGVzKTsNCisgICAgICAgICAgaWYgKHBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICBmaW5kTm9kZXMuQWRkKHBEYXRhTm9kZSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHBEYXRhTm9kZSA9IChDWEZBX05vZGUqKWZpbmROb2Rlc1swXTsNCisgICAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICBmaW5kTm9kZXMuQWRkKHBEYXRhTm9kZSk7DQorICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KLSAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoT2JqZWN0KTsNCi0gICAgICAgIEZYSlNFX0NvbnRleHRfUmVsZWFzZShoVmFyaWFibGVDb250ZXh0KTsNCi0gICAgICAgIGhWYXJpYWJsZUNvbnRleHQgPSBOVUxMOw0KLSAgICB9DQotICAgIG1fbWFwVmFyaWFibGVUb0hWYWx1ZS5SZW1vdmVBbGwoKTsNCi19DQotdm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OkRlZmluZUpzQ2xhc3MoKQ0KLXsNCi0gICAgbV9Kc05vcm1hbENsYXNzLmNvbnN0cnVjdG9yID0gTlVMTDsNCi0gICAgbV9Kc05vcm1hbENsYXNzLm5hbWUgPSAiWEZBT2JqZWN0IjsNCi0gICAgbV9Kc05vcm1hbENsYXNzLnByb3BOdW0gPSAwOw0KLSAgICBtX0pzTm9ybWFsQ2xhc3MucHJvcGVydGllcyA9IE5VTEw7DQotICAgIG1fSnNOb3JtYWxDbGFzcy5tZXRoTnVtID0gMDsNCi0gICAgbV9Kc05vcm1hbENsYXNzLm1ldGhvZHMgPSBOVUxMOw0KLSAgICBtX0pzTm9ybWFsQ2xhc3MuZHluUHJvcEdldHRlciA9IENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcGVydHlHZXR0ZXI7DQotICAgIG1fSnNOb3JtYWxDbGFzcy5keW5Qcm9wU2V0dGVyID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wZXJ0eVNldHRlcjsNCi0gICAgbV9Kc05vcm1hbENsYXNzLmR5blByb3BUeXBlR2V0dGVyID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wVHlwZUdldHRlcjsNCi0gICAgbV9Kc05vcm1hbENsYXNzLmR5blByb3BEZWxldGVyID0gTlVMTDsNCi0gICAgbV9Kc05vcm1hbENsYXNzLmR5bk1ldGhvZENhbGwgPSBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbE1ldGhvZENhbGw7DQotICAgIG1faEpzQ2xhc3MgPSBGWEpTRV9EZWZpbmVDbGFzcyhtX2hKc0NvbnRleHQsICZtX0pzTm9ybWFsQ2xhc3MpOw0KLX0NCi1GWEpTRV9IQ0xBU1MgQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRKc2VOb3JtYWxDbGFzcygpDQotew0KLSAgICByZXR1cm4gbV9oSnNDbGFzczsNCi19DQotdm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OkFkZEpTQnVpbHRpbk9iamVjdChYRkFfTFBDSlNCVUlMVElOSU5GTyBwQnVpdGluT2JqZWN0KQ0KLXsNCi0gICAgaWYgKG1fZHdCdWlsdEluSW5GbGFncyAmIFhGQV9KU0JVSUxUSU5fSW5pdGlhbGl6ZWQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBtX0pTQnVpbHRJbk9iamVjdHMuU2V0QXQocEJ1aXRpbk9iamVjdC0+cE5hbWUsICh2b2lkKilwQnVpdGluT2JqZWN0KTsNCi19DQotaW50MzJfdCBDWEZBX1NjcmlwdENvbnRleHQ6OlJlc29sdmVPYmplY3RzKENYRkFfT2JqZWN0KiByZWZOb2RlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXhwcmVzc2lvbiwgWEZBX1JFU09MVkVOT0RFX1JTJiByZXNvbHZlTm9kZVJTLCAgRlhfRFdPUkQgZHdTdHlsZXMsIENYRkFfTm9kZSogYmluZE5vZGUpDQotew0KLSAgICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaWYgKG1fZVNjcmlwdFR5cGUgIT0gWEZBX1NDUklQVExBTkdUWVBFX0Zvcm1jYWxjIHx8IChkd1N0eWxlcyAmIChYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzKSkpIHsNCi0gICAgICAgIG1fdXBPYmplY3RBcnJheS5SZW1vdmVBbGwoKTsNCi0gICAgfQ0KLSAgICBpZihyZWZOb2RlICYmIChkd1N0eWxlcyAmIChYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzKSkgJiYgcmVmTm9kZS0+SXNOb2RlKCkpIHsNCi0gICAgICAgIG1fdXBPYmplY3RBcnJheS5BZGQoKENYRkFfTm9kZSopcmVmTm9kZSk7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiTmV4dENyZWF0ZSA9IEZBTFNFOw0KLSAgICBpZihkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSB7DQotICAgICAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPlhGQV9TZXRDcmVhdGVOb2RlVHlwZShiaW5kTm9kZSk7DQotICAgIH0NCi0gICAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX3BDcmVhdGVQYXJlbnQgPSBOVUxMOw0KLSAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1faUN1ckFsbFN0YXJ0ID0gLTE7DQotICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSBybmRGaW5kOw0KLSAgICBpbnQzMl90IG5TdGFydCA9IDA7DQotICAgIGludDMyX3QgbkxldmVsID0gMDsNCi0gICAgaW50MzJfdCBuUmV0ID0gLTE7DQotICAgIHJuZEZpbmQubV9wU0MgPSB0aGlzOw0KLSAgICBDWEZBX09iakFycmF5IGZpbmROb2RlczsNCi0gICAgaWYgKHJlZk5vZGUgIT0gTlVMTCkgew0KLSAgICAgICAgZmluZE5vZGVzLkFkZChyZWZOb2RlKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIGZpbmROb2Rlcy5BZGQobV9wRG9jdW1lbnQtPkdldFJvb3QoKSk7DQotICAgIH0NCi0gICAgaW50MzJfdCBuTm9kZXMgPSAwOw0KLSAgICB3aGlsZSAoVFJVRSkgew0KLSAgICAgICAgbk5vZGVzID0gZmluZE5vZGVzLkdldFNpemUoKTsNCi0gICAgICAgIGludDMyX3QgaSA9IDA7DQotICAgICAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd1N0eWxlczsNCi0gICAgICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPm1faUN1clN0YXJ0ID0gblN0YXJ0Ow0KLSAgICAgICAgblN0YXJ0ID0gbV9wUmVzb2x2ZVByb2Nlc3Nvci0+WEZBX1Jlc29sdmVOb2Rlc19HZXRGaWx0ZXIod3NFeHByZXNzaW9uLCBuU3RhcnQsIHJuZEZpbmQpOw0KLSAgICAgICAgaWYgKG5TdGFydCA8IDEpIHsNCi0gICAgICAgICAgICBpZigoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgJiYgIWJOZXh0Q3JlYXRlKSB7DQotICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgblN0YXJ0ID0gbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX2lDdXJBbGxTdGFydDsNCi0gICAgICAgICAgICAgICAgaWYoblN0YXJ0ICE9IC0xKSB7DQotICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUgPSBtX3BEb2N1bWVudC0+R2V0Tm90QmluZE5vZGUoZmluZE5vZGVzKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBEYXRhTm9kZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5kTm9kZXMuQWRkKHBEYXRhTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBwRGF0YU5vZGUgPSAoQ1hGQV9Ob2RlKilmaW5kTm9kZXNbMF07DQotICAgICAgICAgICAgICAgICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgICAgICAgICBmaW5kTm9kZXMuQWRkKHBEYXRhTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBkd1N0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfQmluZDsNCi0gICAgICAgICAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KLSAgICAgICAgICAgICAgICBmaW5kTm9kZXMuQWRkKG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9wQWxsU3RhcnRQYXJlbnQpOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZihiTmV4dENyZWF0ZSkgew0KLSAgICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZSA9IG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+WEZBX1Jlc29sdmVOb2Rlc19DcmVhdGVOb2RlKHJuZEZpbmQubV93c05hbWUsIHJuZEZpbmQubV93c0NvbmRpdGlvbiwgblN0YXJ0ID09IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSA/IFRSVUUgOiBGQUxTRSwgdGhpcyk7DQotICAgICAgICAgICAgaWYoYkNyZWF0ZSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBDWEZBX09iakFycmF5IHJldE5vZGVzOw0KLSAgICAgICAgd2hpbGUgKGkgPCBuTm9kZXMpIHsNCi0JCQlGWF9CT09MIGJEYXRhQmluZCA9IEZBTFNFOw0KLSAgICAgICAgICAgIGlmKCgoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQmluZCkgfHwgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpKSAmJiBuTm9kZXMgPiAxKSB7DQotICAgICAgICAgICAgICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSBybmRCaW5kOw0KLSAgICAgICAgICAgICAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5YRkFfUmVzb2x2ZU5vZGVzX0dldEZpbHRlcih3c0V4cHJlc3Npb24sIG5TdGFydCwgcm5kQmluZCk7DQotICAgICAgICAgICAgICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPlhGQV9SZXNvbHZlTm9kZV9TZXRJbmRleERhdGFCaW5kKHJuZEJpbmQubV93c0NvbmRpdGlvbiwgaSwgbk5vZGVzKTsNCi0JCQkJYkRhdGFCaW5kID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcm5kRmluZC5tX0N1ck5vZGUgPSBmaW5kTm9kZXNbaSArK107DQotICAgICAgICAgICAgcm5kRmluZC5tX25MZXZlbCA9IG5MZXZlbDsNCi0gICAgICAgICAgICBybmRGaW5kLm1fZHdGbGFnID0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzOw0KLSAgICAgICAgICAgIG5SZXQgPSBtX3BSZXNvbHZlUHJvY2Vzc29yLT5YRkFfUmVzb2x2ZU5vZGVzKHJuZEZpbmQpOw0KLSAgICAgICAgICAgIGlmIChuUmV0IDwgMSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHJuZEZpbmQubV9kd0ZsYWcgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX0F0dHJpYnV0ZSAmJiBybmRGaW5kLm1fcFNjcmlwdEF0dHJpYnV0ZSAmJiBuU3RhcnQgPCB3c0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkpIHsNCi0gICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShtX2hKc1J1bnRpbWUpOw0KLSAgICAgICAgICAgICAgICAocm5kRmluZC5tX05vZGVzWzBdLT4qKHJuZEZpbmQubV9wU2NyaXB0QXR0cmlidXRlLT5scGZuQ2FsbGJhY2spKShoVmFsdWUsIEZBTFNFLCAoWEZBX0FUVFJJQlVURSlybmRGaW5kLm1fcFNjcmlwdEF0dHJpYnV0ZS0+ZUF0dHJpYnV0ZSk7DQotICAgICAgICAgICAgICAgIHJuZEZpbmQubV9Ob2Rlcy5TZXRBdCgwLCAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhWYWx1ZSwgTlVMTCkpOw0KLSAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludDMyX3QgaVNpemUgPSBtX3VwT2JqZWN0QXJyYXkuR2V0U2l6ZSgpOw0KLSAgICAgICAgICAgIGlmIChpU2l6ZSkgew0KLSAgICAgICAgICAgICAgICBtX3VwT2JqZWN0QXJyYXkuUmVtb3ZlQXQoaVNpemUgLSAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0Tm9kZXMuQXBwZW5kKHJuZEZpbmQubV9Ob2Rlcyk7DQotICAgICAgICAgICAgcm5kRmluZC5tX05vZGVzLlJlbW92ZUFsbCgpOw0KLQkJCWlmKGJEYXRhQmluZCl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0gICAgICAgIH0NCisgICAgICAgIGR3U3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9CaW5kOw0KICAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KLSAgICAgICAgbk5vZGVzID0gcmV0Tm9kZXMuR2V0U2l6ZSgpOw0KLSAgICAgICAgaWYgKG5Ob2RlcyA8IDEpIHsNCi0gICAgICAgICAgICBpZihkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSB7DQotICAgICAgICAgICAgICAgIGJOZXh0Q3JlYXRlID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgaWYobV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX3BDcmVhdGVQYXJlbnQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX3BDcmVhdGVQYXJlbnQgPSAoQ1hGQV9Ob2RlKilybmRGaW5kLm1fQ3VyTm9kZTsNCi0gICAgICAgICAgICAgICAgICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9pQ3JlYXRlQ291bnQgPSAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZSA9IG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+WEZBX1Jlc29sdmVOb2Rlc19DcmVhdGVOb2RlKHJuZEZpbmQubV93c05hbWUsIHJuZEZpbmQubV93c0NvbmRpdGlvbiwgblN0YXJ0ID09IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSA/IFRSVUUgOiBGQUxTRSwgdGhpcyk7DQotICAgICAgICAgICAgICAgIGlmKGJDcmVhdGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQorICAgICAgICBmaW5kTm9kZXMuQWRkKG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9wQWxsU3RhcnRQYXJlbnQpOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYk5leHRDcmVhdGUpIHsNCisgICAgICBGWF9CT09MIGJDcmVhdGUgPQ0KKyAgICAgICAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPlhGQV9SZXNvbHZlTm9kZXNfQ3JlYXRlTm9kZSgNCisgICAgICAgICAgICAgIHJuZEZpbmQubV93c05hbWUsIHJuZEZpbmQubV93c0NvbmRpdGlvbiwNCisgICAgICAgICAgICAgIG5TdGFydCA9PSB3c0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkgPyBUUlVFIDogRkFMU0UsIHRoaXMpOw0KKyAgICAgIGlmIChiQ3JlYXRlKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfT2JqQXJyYXkgcmV0Tm9kZXM7DQorICAgIHdoaWxlIChpIDwgbk5vZGVzKSB7DQorICAgICAgRlhfQk9PTCBiRGF0YUJpbmQgPSBGQUxTRTsNCisgICAgICBpZiAoKChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9CaW5kKSB8fA0KKyAgICAgICAgICAgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpKSAmJg0KKyAgICAgICAgICBuTm9kZXMgPiAxKSB7DQorICAgICAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgcm5kQmluZDsNCisgICAgICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPlhGQV9SZXNvbHZlTm9kZXNfR2V0RmlsdGVyKHdzRXhwcmVzc2lvbiwgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kQmluZCk7DQorICAgICAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5YRkFfUmVzb2x2ZU5vZGVfU2V0SW5kZXhEYXRhQmluZCgNCisgICAgICAgICAgICBybmRCaW5kLm1fd3NDb25kaXRpb24sIGksIG5Ob2Rlcyk7DQorICAgICAgICBiRGF0YUJpbmQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBybmRGaW5kLm1fQ3VyTm9kZSA9IGZpbmROb2Rlc1tpKytdOw0KKyAgICAgIHJuZEZpbmQubV9uTGV2ZWwgPSBuTGV2ZWw7DQorICAgICAgcm5kRmluZC5tX2R3RmxhZyA9IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2RlczsNCisgICAgICBuUmV0ID0gbV9wUmVzb2x2ZVByb2Nlc3Nvci0+WEZBX1Jlc29sdmVOb2RlcyhybmRGaW5kKTsNCisgICAgICBpZiAoblJldCA8IDEpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAocm5kRmluZC5tX2R3RmxhZyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlICYmDQorICAgICAgICAgIHJuZEZpbmQubV9wU2NyaXB0QXR0cmlidXRlICYmIG5TdGFydCA8IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShtX2hKc1J1bnRpbWUpOw0KKyAgICAgICAgKHJuZEZpbmQubV9Ob2Rlc1swXS0+KihybmRGaW5kLm1fcFNjcmlwdEF0dHJpYnV0ZS0+bHBmbkNhbGxiYWNrKSkoDQorICAgICAgICAgICAgaFZhbHVlLCBGQUxTRSwNCisgICAgICAgICAgICAoWEZBX0FUVFJJQlVURSlybmRGaW5kLm1fcFNjcmlwdEF0dHJpYnV0ZS0+ZUF0dHJpYnV0ZSk7DQorICAgICAgICBybmRGaW5kLm1fTm9kZXMuU2V0QXQoMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhWYWx1ZSwgTlVMTCkpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBpbnQzMl90IGlTaXplID0gbV91cE9iamVjdEFycmF5LkdldFNpemUoKTsNCisgICAgICBpZiAoaVNpemUpIHsNCisgICAgICAgIG1fdXBPYmplY3RBcnJheS5SZW1vdmVBdChpU2l6ZSAtIDEpOw0KKyAgICAgIH0NCisgICAgICByZXROb2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsNCisgICAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgaWYgKGJEYXRhQmluZCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgbk5vZGVzID0gcmV0Tm9kZXMuR2V0U2l6ZSgpOw0KKyAgICBpZiAobk5vZGVzIDwgMSkgew0KKyAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSB7DQorICAgICAgICBiTmV4dENyZWF0ZSA9IFRSVUU7DQorICAgICAgICBpZiAobV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX3BDcmVhdGVQYXJlbnQgPT0gTlVMTCkgew0KKyAgICAgICAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1fcENyZWF0ZVBhcmVudCA9DQorICAgICAgICAgICAgICAoQ1hGQV9Ob2RlKilybmRGaW5kLm1fQ3VyTm9kZTsNCisgICAgICAgICAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX2lDcmVhdGVDb3VudCA9IDE7DQogICAgICAgICB9DQotICAgICAgICBmaW5kTm9kZXMuQ29weShyZXROb2Rlcyk7DQotICAgICAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7DQotICAgICAgICBpZiAobkxldmVsID09IDApIHsNCi0gICAgICAgICAgICBkd1N0eWxlcyAmPSB+KFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MpOw0KKyAgICAgICAgRlhfQk9PTCBiQ3JlYXRlID0NCisgICAgICAgICAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPlhGQV9SZXNvbHZlTm9kZXNfQ3JlYXRlTm9kZSgNCisgICAgICAgICAgICAgICAgcm5kRmluZC5tX3dzTmFtZSwgcm5kRmluZC5tX3dzQ29uZGl0aW9uLA0KKyAgICAgICAgICAgICAgICBuU3RhcnQgPT0gd3NFeHByZXNzaW9uLkdldExlbmd0aCgpID8gVFJVRSA6IEZBTFNFLCB0aGlzKTsNCisgICAgICAgIGlmIChiQ3JlYXRlKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQotICAgICAgICBuTGV2ZWwgKys7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZighYk5leHRDcmVhdGUpIHsNCi0gICAgICAgIHJlc29sdmVOb2RlUlMuZHdGbGFncyA9IHJuZEZpbmQubV9kd0ZsYWc7DQotICAgICAgICBpZiAobk5vZGVzID4gMCkgew0KLSAgICAgICAgICAgIHJlc29sdmVOb2RlUlMubm9kZXMuQXBwZW5kKGZpbmROb2Rlcyk7DQotICAgICAgICB9DQotICAgICAgICBpZihybmRGaW5kLm1fZHdGbGFnID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9BdHRyaWJ1dGUpIHsNCi0gICAgICAgICAgICByZXNvbHZlTm9kZVJTLnBTY3JpcHRBdHRyaWJ1dGUgPSBybmRGaW5kLm1fcFNjcmlwdEF0dHJpYnV0ZTsNCi0gICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgIH0NCisgICAgZmluZE5vZGVzLkNvcHkocmV0Tm9kZXMpOw0KKyAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgIGlmIChuTGV2ZWwgPT0gMCkgew0KKyAgICAgIGR3U3R5bGVzICY9IH4oWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyk7DQogICAgIH0NCi0gICAgaWYoZHdTdHlsZXMgJiAoWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUgfCBYRkFfUkVTT0xWRU5PREVfQmluZCB8IFhGQV9SRVNPTFZFTk9ERV9CaW5kTmV3KSkgew0KLSAgICAgICAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+WEZBX1Jlc29sdmVOb2RlX1NldFJlc3VsdENyZWF0ZU5vZGUocmVzb2x2ZU5vZGVSUywgcm5kRmluZC5tX3dzQ29uZGl0aW9uKTsNCi0gICAgICAgIGlmICghYk5leHRDcmVhdGUgJiYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpKSB7DQotICAgICAgICAgICAgcmVzb2x2ZU5vZGVSUy5kd0ZsYWdzID0gWEZBX1JFU09WRU5PREVfUlNUWVBFX0V4aXN0Tm9kZXM7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzb2x2ZU5vZGVSUy5ub2Rlcy5HZXRTaXplKCk7DQorICAgIG5MZXZlbCsrOw0KKyAgfQ0KKyAgaWYgKCFiTmV4dENyZWF0ZSkgew0KKyAgICByZXNvbHZlTm9kZVJTLmR3RmxhZ3MgPSBybmRGaW5kLm1fZHdGbGFnOw0KKyAgICBpZiAobk5vZGVzID4gMCkgew0KKyAgICAgIHJlc29sdmVOb2RlUlMubm9kZXMuQXBwZW5kKGZpbmROb2Rlcyk7DQogICAgIH0NCi0gICAgcmV0dXJuIG5Ob2RlczsNCisgICAgaWYgKHJuZEZpbmQubV9kd0ZsYWcgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX0F0dHJpYnV0ZSkgew0KKyAgICAgIHJlc29sdmVOb2RlUlMucFNjcmlwdEF0dHJpYnV0ZSA9IHJuZEZpbmQubV9wU2NyaXB0QXR0cmlidXRlOw0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICB9DQorICBpZiAoZHdTdHlsZXMgJiAoWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUgfCBYRkFfUkVTT0xWRU5PREVfQmluZCB8DQorICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0JpbmROZXcpKSB7DQorICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPlhGQV9SZXNvbHZlTm9kZV9TZXRSZXN1bHRDcmVhdGVOb2RlKA0KKyAgICAgICAgcmVzb2x2ZU5vZGVSUywgcm5kRmluZC5tX3dzQ29uZGl0aW9uKTsNCisgICAgaWYgKCFiTmV4dENyZWF0ZSAmJiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkpIHsNCisgICAgICByZXNvbHZlTm9kZVJTLmR3RmxhZ3MgPSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfRXhpc3ROb2RlczsNCisgICAgfQ0KKyAgICByZXR1cm4gcmVzb2x2ZU5vZGVSUy5ub2Rlcy5HZXRTaXplKCk7DQorICB9DQorICByZXR1cm4gbk5vZGVzOw0KIH0NCi1GWEpTRV9IVkFMVUUgQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRKU1ZhbHVlRnJvbU1hcChDWEZBX09iamVjdCogcE9iamVjdCkNCi17DQotICAgIGlmICghcE9iamVjdCkgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgaWYocE9iamVjdC0+SXNOb2RlKCkpIHsNCi0gICAgICAgIFJ1blZhcmlhYmxlc1NjcmlwdCgoQ1hGQV9Ob2RlKilwT2JqZWN0KTsNCi0gICAgfQ0KLSAgICB2b2lkKiBwVmFsdWUgPSBtX21hcFhGQVRvSFZhbHVlLkdldFZhbHVlQXQocE9iamVjdCk7DQotICAgIGlmKHBWYWx1ZSA9PSBOVUxMKSB7DQotICAgICAgICBGWEpTRV9IVkFMVUUganNIdmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUobV9oSnNSdW50aW1lKTsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldE9iamVjdChqc0h2YWx1ZSwgcE9iamVjdCwgbV9oSnNDbGFzcyk7DQotICAgICAgICBtX21hcFhGQVRvSFZhbHVlLlNldEF0KHBPYmplY3QsIGpzSHZhbHVlKTsNCi0gICAgICAgIHBWYWx1ZSA9IGpzSHZhbHVlOw0KLSAgICB9DQotICAgIHJldHVybiAoRlhKU0VfSFZBTFVFKXBWYWx1ZTsNCitGWEpTRV9IVkFMVUUgQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRKU1ZhbHVlRnJvbU1hcChDWEZBX09iamVjdCogcE9iamVjdCkgew0KKyAgaWYgKCFwT2JqZWN0KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKHBPYmplY3QtPklzTm9kZSgpKSB7DQorICAgIFJ1blZhcmlhYmxlc1NjcmlwdCgoQ1hGQV9Ob2RlKilwT2JqZWN0KTsNCisgIH0NCisgIHZvaWQqIHBWYWx1ZSA9IG1fbWFwWEZBVG9IVmFsdWUuR2V0VmFsdWVBdChwT2JqZWN0KTsNCisgIGlmIChwVmFsdWUgPT0gTlVMTCkgew0KKyAgICBGWEpTRV9IVkFMVUUganNIdmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUobV9oSnNSdW50aW1lKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0KGpzSHZhbHVlLCBwT2JqZWN0LCBtX2hKc0NsYXNzKTsNCisgICAgbV9tYXBYRkFUb0hWYWx1ZS5TZXRBdChwT2JqZWN0LCBqc0h2YWx1ZSk7DQorICAgIHBWYWx1ZSA9IGpzSHZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIChGWEpTRV9IVkFMVUUpcFZhbHVlOw0KIH0NCi1pbnQzMl90CUNYRkFfU2NyaXB0Q29udGV4dDo6R2V0SW5kZXhCeU5hbWUoQ1hGQV9Ob2RlKiByZWZOb2RlKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlSGVscGVyKiBscE5vZGVIZWxwZXIgPSBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCk7DQotICAgIHJldHVybiBscE5vZGVIZWxwZXItPlhGQV9HZXRJbmRleChyZWZOb2RlLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsIGxwTm9kZUhlbHBlci0+WEZBX05vZGVJc1Byb3BlcnR5KHJlZk5vZGUpLCBGQUxTRSk7DQoraW50MzJfdCBDWEZBX1NjcmlwdENvbnRleHQ6OkdldEluZGV4QnlOYW1lKENYRkFfTm9kZSogcmVmTm9kZSkgew0KKyAgQ1hGQV9Ob2RlSGVscGVyKiBscE5vZGVIZWxwZXIgPSBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCk7DQorICByZXR1cm4gbHBOb2RlSGVscGVyLT5YRkFfR2V0SW5kZXgocmVmTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTm9kZUhlbHBlci0+WEZBX05vZGVJc1Byb3BlcnR5KHJlZk5vZGUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsNCiB9DQotaW50MzJfdAlDWEZBX1NjcmlwdENvbnRleHQ6OkdldEluZGV4QnlDbGFzc05hbWUoQ1hGQV9Ob2RlKiByZWZOb2RlKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlSGVscGVyKiBscE5vZGVIZWxwZXIgPSBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCk7DQotICAgIHJldHVybiBscE5vZGVIZWxwZXItPlhGQV9HZXRJbmRleChyZWZOb2RlLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsIGxwTm9kZUhlbHBlci0+WEZBX05vZGVJc1Byb3BlcnR5KHJlZk5vZGUpLCBUUlVFKTsNCitpbnQzMl90IENYRkFfU2NyaXB0Q29udGV4dDo6R2V0SW5kZXhCeUNsYXNzTmFtZShDWEZBX05vZGUqIHJlZk5vZGUpIHsNCisgIENYRkFfTm9kZUhlbHBlciogbHBOb2RlSGVscGVyID0gbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpOw0KKyAgcmV0dXJuIGxwTm9kZUhlbHBlci0+WEZBX0dldEluZGV4KHJlZk5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE5vZGVIZWxwZXItPlhGQV9Ob2RlSXNQcm9wZXJ0eShyZWZOb2RlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsNCiB9DQotdm9pZAkJQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRTb21FeHByZXNzaW9uKENYRkFfTm9kZSogcmVmTm9kZSwgQ0ZYX1dpZGVTdHJpbmcgJndzRXhwcmVzc2lvbikNCi17DQotICAgIENYRkFfTm9kZUhlbHBlciogbHBOb2RlSGVscGVyID0gbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpOw0KLSAgICBscE5vZGVIZWxwZXItPlhGQV9HZXROYW1lRXhwcmVzc2lvbihyZWZOb2RlLCB3c0V4cHJlc3Npb24sIFRSVUUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCk7DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OkdldFNvbUV4cHJlc3Npb24oQ1hGQV9Ob2RlKiByZWZOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0V4cHJlc3Npb24pIHsNCisgIENYRkFfTm9kZUhlbHBlciogbHBOb2RlSGVscGVyID0gbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpOw0KKyAgbHBOb2RlSGVscGVyLT5YRkFfR2V0TmFtZUV4cHJlc3Npb24ocmVmTm9kZSwgd3NFeHByZXNzaW9uLCBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xPR0lDX1RyYW5zcGFyZW50KTsNCiB9DQotdm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OlNldE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlQXJyYXkgKnBBcnJheSkNCi17DQotICAgIG1fcFNjcmlwdE5vZGVBcnJheSA9IHBBcnJheTsNCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6U2V0Tm9kZXNPZlJ1blNjcmlwdChDWEZBX05vZGVBcnJheSogcEFycmF5KSB7DQorICBtX3BTY3JpcHROb2RlQXJyYXkgPSBwQXJyYXk7DQogfQ0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpBZGROb2Rlc09mUnVuU2NyaXB0KGNvbnN0IENYRkFfTm9kZUFycmF5JiBub2RlcykNCi17DQotICAgIGlmICghbV9wU2NyaXB0Tm9kZUFycmF5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgIG1fcFNjcmlwdE5vZGVBcnJheS0+Q29weShub2Rlcyk7DQotICAgIH0NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6QWRkTm9kZXNPZlJ1blNjcmlwdChjb25zdCBDWEZBX05vZGVBcnJheSYgbm9kZXMpIHsNCisgIGlmICghbV9wU2NyaXB0Tm9kZUFycmF5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7DQorICAgIG1fcFNjcmlwdE5vZGVBcnJheS0+Q29weShub2Rlcyk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpBZGROb2Rlc09mUnVuU2NyaXB0KENYRkFfTm9kZSogcE5vZGUpDQotew0KLSAgICBpZiAoIW1fcFNjcmlwdE5vZGVBcnJheSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlmIChtX3BTY3JpcHROb2RlQXJyYXktPkZpbmQocE5vZGUpID09IC0xKSB7DQotICAgICAgICBtX3BTY3JpcHROb2RlQXJyYXktPkFkZChwTm9kZSk7DQotICAgIH0NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6QWRkTm9kZXNPZlJ1blNjcmlwdChDWEZBX05vZGUqIHBOb2RlKSB7DQorICBpZiAoIW1fcFNjcmlwdE5vZGVBcnJheSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9wU2NyaXB0Tm9kZUFycmF5LT5GaW5kKHBOb2RlKSA9PSAtMSkgew0KKyAgICBtX3BTY3JpcHROb2RlQXJyYXktPkFkZChwTm9kZSk7DQorICB9DQogfQ0KLUlYRkFfU2NyaXB0Q29udGV4dCogWEZBX1NjcmlwdENvbnRleHRfQ3JlYXRlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCi17DQotICAgIHJldHVybiBGWF9ORVcgQ1hGQV9TY3JpcHRDb250ZXh0KHBEb2N1bWVudCk7DQorSVhGQV9TY3JpcHRDb250ZXh0KiBYRkFfU2NyaXB0Q29udGV4dF9DcmVhdGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KSB7DQorICByZXR1cm4gRlhfTkVXIENYRkFfU2NyaXB0Q29udGV4dChwRG9jdW1lbnQpOw0KIH0NCiBzdGF0aWMgY29uc3QgWEZBX0pTQlVJTFRJTklORk8gZ3NfSlNCVUlMVElORGF0YVtdID0gew0KICAgICB7MHg4MTA4YjlhOSwgIk51bWJlciJ9LA0KICAgICB7MHhlMDdlM2ZiZSwgIkRhdGUifSwNCiB9Ow0KLWNvbnN0IGludDMyX3QgZ19pSlNCdWlsdGluQ291bnQgPSBzaXplb2YoWEZBX0pTQlVJTFRJTklORk8pIC8gc2l6ZW9mKFhGQV9KU0JVSUxUSU5JTkZPKTsNCi1YRkFfTFBDSlNCVUlMVElOSU5GTyBYRkFfR2V0SlNCdWlsdGluQnlIYXNoKHVpbnQzMl90IHVIYXNoQ29kZSkNCi17DQotICAgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaUpTQnVpbHRpbkNvdW50IC0gMSwgaU1pZDsNCi0gICAgZG8gew0KLSAgICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQotICAgICAgICBYRkFfTFBDSlNCVUlMVElOSU5GTyBwSW5mbyA9IGdzX0pTQlVJTFRJTkRhdGEgKyBpTWlkOw0KLSAgICAgICAgaWYgKHVIYXNoQ29kZSA9PSBwSW5mby0+dVVuaWNvZGVIYXNoKSB7DQotICAgICAgICAgICAgcmV0dXJuIHBJbmZvOw0KLSAgICAgICAgfSBlbHNlIGlmICh1SGFzaENvZGUgPCBwSW5mby0+dVVuaWNvZGVIYXNoKSB7DQotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCi0gICAgICAgIH0NCi0gICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KLSAgICByZXR1cm4gTlVMTDsNCitjb25zdCBpbnQzMl90IGdfaUpTQnVpbHRpbkNvdW50ID0NCisgICAgc2l6ZW9mKFhGQV9KU0JVSUxUSU5JTkZPKSAvIHNpemVvZihYRkFfSlNCVUlMVElOSU5GTyk7DQorWEZBX0xQQ0pTQlVJTFRJTklORk8gWEZBX0dldEpTQnVpbHRpbkJ5SGFzaCh1aW50MzJfdCB1SGFzaENvZGUpIHsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaUpTQnVpbHRpbkNvdW50IC0gMSwgaU1pZDsNCisgIGRvIHsNCisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIFhGQV9MUENKU0JVSUxUSU5JTkZPIHBJbmZvID0gZ3NfSlNCVUlMVElORGF0YSArIGlNaWQ7DQorICAgIGlmICh1SGFzaENvZGUgPT0gcEluZm8tPnVVbmljb2RlSGFzaCkgew0KKyAgICAgIHJldHVybiBwSW5mbzsNCisgICAgfSBlbHNlIGlmICh1SGFzaENvZGUgPCBwSW5mby0+dVVuaWNvZGVIYXNoKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gTlVMTDsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9pbXAuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaW1wLmgKaW5kZXggZDBiY2VlMy4uODNhMDZlNSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9pbXAuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2ltcC5oCkBAIC02LDEwOCArNiwxMTcgQEAKIA0KICNpZm5kZWYgX0ZYRkFfU0NSSVBUX0lNUF9IDQogI2RlZmluZSBfRlhGQV9TQ1JJUFRfSU1QX0gNCi0jZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lCQkJCTB4MDAwMg0KLSNkZWZpbmUgWEZBX0pTQlVJTFRJTl9Jbml0aWFsaXplZAkJCTB4MDAwMQ0KLSNkZWZpbmUgWEZBX0pTQlVJTFRJTl9IYXNDb3VudAkJCQkweDAwMDINCisjZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lIDB4MDAwMg0KKyNkZWZpbmUgWEZBX0pTQlVJTFRJTl9Jbml0aWFsaXplZCAweDAwMDENCisjZGVmaW5lIFhGQV9KU0JVSUxUSU5fSGFzQ291bnQgMHgwMDAyDQogY2xhc3MgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOw0KLWNsYXNzIENYRkFfU2NyaXB0Q29udGV4dCA6IHB1YmxpYyBJWEZBX1NjcmlwdENvbnRleHQNCi17DQotcHVibGljOg0KLSAgICBDWEZBX1NjcmlwdENvbnRleHQoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCi0gICAgfkNYRkFfU2NyaXB0Q29udGV4dCgpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUluaXRpYWxpemUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpOw0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJU2V0RXZlbnRQYXJhbShDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKQ0KLSAgICB7DQotICAgICAgICBtX3BFdmVudFBhcmFtID0gcEV2ZW50UGFyYW07DQotICAgIH0NCi0gICAgdmlydHVhbCBDWEZBX0V2ZW50UGFyYW0qCUdldEV2ZW50UGFyYW0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wRXZlbnRQYXJhbTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlSdW5TY3JpcHQoWEZBX1NDUklQVExBTkdUWVBFIGVTY3JpcHRUeXBlLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU2NyaXB0LCBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLCBDWEZBX09iamVjdCogcFRoaXNPYmplY3QgPSBOVUxMKTsNCitjbGFzcyBDWEZBX1NjcmlwdENvbnRleHQgOiBwdWJsaWMgSVhGQV9TY3JpcHRDb250ZXh0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9TY3JpcHRDb250ZXh0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQorICB+Q1hGQV9TY3JpcHRDb250ZXh0KCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpOw0KKyAgdmlydHVhbCB2b2lkIFNldEV2ZW50UGFyYW0oQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSkgew0KKyAgICBtX3BFdmVudFBhcmFtID0gcEV2ZW50UGFyYW07DQorICB9DQorICB2aXJ0dWFsIENYRkFfRXZlbnRQYXJhbSogR2V0RXZlbnRQYXJhbSgpIHsgcmV0dXJuIG1fcEV2ZW50UGFyYW07IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBSdW5TY3JpcHQoWEZBX1NDUklQVExBTkdUWVBFIGVTY3JpcHRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU2NyaXB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX09iamVjdCogcFRoaXNPYmplY3QgPSBOVUxMKTsNCiANCi0gICAgdmlydHVhbCBpbnQzMl90CQlSZXNvbHZlT2JqZWN0cyhDWEZBX09iamVjdCogcmVmTm9kZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V4cHJlc3Npb24sIFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb2x2ZU5vZGVSUywgIEZYX0RXT1JEIGR3U3R5bGVzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuLCBDWEZBX05vZGUqIGJpbmROb2RlID0gTlVMTCk7DQotICAgIHZpcnR1YWwgRlhKU0VfSFZBTFVFCUdldEpTVmFsdWVGcm9tTWFwKENYRkFfT2JqZWN0KiBwT2JqZWN0KTsNCi0gICAgdmlydHVhbCB2b2lkCQkJQ2FjaGVMaXN0KENYRkFfTm9kZUxpc3QqIHBMaXN0KQ0KLSAgICB7DQotICAgICAgICBtX0NhY2hlTGlzdEFycmF5LkFkZChwTGlzdCk7DQotICAgIH0NCi0gICAgdmlydHVhbCBDWEZBX09iamVjdCoJR2V0VGhpc09iamVjdCgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BUaGlzT2JqZWN0Ow0KLSAgICB9DQotICAgIHZpcnR1YWwgRlhKU0VfSFJVTlRJTUUJR2V0UnVudGltZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2hKc1J1bnRpbWU7DQotICAgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBSZXNvbHZlT2JqZWN0cyhDWEZBX09iamVjdCogcmVmTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXhwcmVzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc29sdmVOb2RlUlMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXMgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBiaW5kTm9kZSA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWEpTRV9IVkFMVUUgR2V0SlNWYWx1ZUZyb21NYXAoQ1hGQV9PYmplY3QqIHBPYmplY3QpOw0KKyAgdmlydHVhbCB2b2lkIENhY2hlTGlzdChDWEZBX05vZGVMaXN0KiBwTGlzdCkgeyBtX0NhY2hlTGlzdEFycmF5LkFkZChwTGlzdCk7IH0NCisgIHZpcnR1YWwgQ1hGQV9PYmplY3QqIEdldFRoaXNPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3BUaGlzT2JqZWN0OyB9DQorICB2aXJ0dWFsIEZYSlNFX0hSVU5USU1FIEdldFJ1bnRpbWUoKSBjb25zdCB7IHJldHVybiBtX2hKc1J1bnRpbWU7IH0NCiANCi0gICAgdmlydHVhbCBpbnQzMl90CQlHZXRJbmRleEJ5TmFtZShDWEZBX05vZGUqIHJlZk5vZGUpOw0KLSAgICB2aXJ0dWFsIGludDMyX3QJCUdldEluZGV4QnlDbGFzc05hbWUoQ1hGQV9Ob2RlKiByZWZOb2RlKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0U29tRXhwcmVzc2lvbihDWEZBX05vZGUqIHJlZk5vZGUsIENGWF9XaWRlU3RyaW5nICZ3c0V4cHJlc3Npb24pOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEluZGV4QnlOYW1lKENYRkFfTm9kZSogcmVmTm9kZSk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SW5kZXhCeUNsYXNzTmFtZShDWEZBX05vZGUqIHJlZk5vZGUpOw0KKyAgdmlydHVhbCB2b2lkIEdldFNvbUV4cHJlc3Npb24oQ1hGQV9Ob2RlKiByZWZOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbik7DQogDQotICAgIHZpcnR1YWwgdm9pZAkJCVNldE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlQXJyYXkgKnBBcnJheSk7DQotICAgIHZpcnR1YWwgdm9pZAkJCUFkZE5vZGVzT2ZSdW5TY3JpcHQoY29uc3QgQ1hGQV9Ob2RlQXJyYXkmIG5vZGVzKTsNCi0gICAgdmlydHVhbCB2b2lkCQkJQWRkTm9kZXNPZlJ1blNjcmlwdChDWEZBX05vZGUqIHBOb2RlKTsNCi0gICAgdmlydHVhbCBGWEpTRV9IQ0xBU1MJR2V0SnNlTm9ybWFsQ2xhc3MoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXROb2Rlc09mUnVuU2NyaXB0KENYRkFfTm9kZUFycmF5KiBwQXJyYXkpOw0KKyAgdmlydHVhbCB2b2lkIEFkZE5vZGVzT2ZSdW5TY3JpcHQoY29uc3QgQ1hGQV9Ob2RlQXJyYXkmIG5vZGVzKTsNCisgIHZpcnR1YWwgdm9pZCBBZGROb2Rlc09mUnVuU2NyaXB0KENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdmlydHVhbCBGWEpTRV9IQ0xBU1MgR2V0SnNlTm9ybWFsQ2xhc3MoKTsNCiANCi0gICAgdmlydHVhbAl2b2lkCQkJQWRkSlNCdWlsdGluT2JqZWN0KFhGQV9MUENKU0JVSUxUSU5JTkZPIHBCdWl0aW5PYmplY3QpOw0KLSAgICB2aXJ0dWFsCXZvaWQJCQlTZXRSdW5BdFR5cGUoWEZBX0FUVFJJQlVURUVOVU0gZVJ1bkF0KQ0KLSAgICB7DQotICAgICAgICBtX2VSdW5BdFR5cGUgPSBlUnVuQXQ7DQotICAgIH0NCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNSdW5BdENsaWVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2VSdW5BdFR5cGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fU2VydmVyOw0KLSAgICB9DQotICAgIEZYX0JPT0wJCQkJCVF1ZXJ5Tm9kZUJ5RmxhZyhDWEZBX05vZGUqIHJlZk5vZGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcHJvcG5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0RXT1JEIGR3RmxhZywgRlhfQk9PTCBiU2V0dGluZyk7DQotICAgIEZYX0JPT0wJCQkJCVF1ZXJ5VmFyaWFibGVIVmFsdWUoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJHZXR0ZXIpOw0KLSAgICBGWF9CT09MCQkJCQlRdWVyeUJ1aWx0aW5IVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCi0gICAgc3RhdGljIHZvaWQJCQkJR2xvYmFsUHJvcGVydHlHZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KLSAgICBzdGF0aWMgdm9pZAkJCQlHbG9iYWxQcm9wZXJ0eVNldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQotICAgIHN0YXRpYyB2b2lkCQkJCU5vcm1hbFByb3BlcnR5R2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCi0gICAgc3RhdGljIHZvaWQJCQkJTm9ybWFsUHJvcGVydHlTZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KLSAgICBzdGF0aWMgdm9pZAkJCQlOb3JtYWxNZXRob2RDYWxsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwgQ0ZYSlNFX0FyZ3VtZW50cyAmYXJncyk7DQotICAgIHN0YXRpYyBpbnQzMl90CQkJTm9ybWFsUHJvcFR5cGVHZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsIEZYX0JPT0wgYlF1ZXJ5SW4pOw0KLSAgICBzdGF0aWMgaW50MzJfdAkJCUdsb2JhbFByb3BUeXBlR2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWF9CT09MIGJRdWVyeUluKTsNCi0gICAgRlhfQk9PTAkJCQkJUnVuVmFyaWFibGVzU2NyaXB0KENYRkFfTm9kZSogcFNjcmlwdE5vZGUpOw0KLSAgICBDWEZBX09iamVjdCoJCQlHZXRWYXJpYWJsZXNUaGlzKENYRkFfT2JqZWN0KiBwT2JqZWN0LCBGWF9CT09MIGJTY3JpcHROb2RlID0gRkFMU0UpOw0KLSAgICB2b2lkCQkJCQlSZWxlYXNlVmFyaWFibGVzTWFwKCk7DQotICAgIEZYX0JPT0wJCQkJCUlzU3RyaWN0U2NvcGVJbkphdmFTY3JpcHQoKTsNCi0gICAgWEZBX1NDUklQVExBTkdUWVBFCQlHZXRUeXBlKCk7DQotICAgIENYRkFfTm9kZUFycmF5JgkJCUdldFVwT2JqZWN0QXJyYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV91cE9iamVjdEFycmF5Ow0KLSAgICB9DQotICAgIENYRkFfRG9jdW1lbnQqCQkJR2V0RG9jdW1lbnQoKSBjb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wRG9jdW1lbnQ7DQotICAgIH0NCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJCQkJCURlZmluZUpzQ29udGV4dCgpOw0KLSAgICBGWEpTRV9IQ09OVEVYVAkJCUNyZWF0ZVZhcmlhYmxlc0NvbnRleHQoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSwgQ1hGQV9Ob2RlKiBwU3ViZm9ybSk7DQorICB2aXJ0dWFsIHZvaWQgQWRkSlNCdWlsdGluT2JqZWN0KFhGQV9MUENKU0JVSUxUSU5JTkZPIHBCdWl0aW5PYmplY3QpOw0KKyAgdmlydHVhbCB2b2lkIFNldFJ1bkF0VHlwZShYRkFfQVRUUklCVVRFRU5VTSBlUnVuQXQpIHsgbV9lUnVuQXRUeXBlID0gZVJ1bkF0OyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNSdW5BdENsaWVudCgpIHsNCisgICAgcmV0dXJuIG1fZVJ1bkF0VHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9TZXJ2ZXI7DQorICB9DQorICBGWF9CT09MIFF1ZXJ5Tm9kZUJ5RmxhZyhDWEZBX05vZGUqIHJlZk5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHByb3BuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcpOw0KKyAgRlhfQk9PTCBRdWVyeVZhcmlhYmxlSFZhbHVlKENYRkFfTm9kZSogcFNjcmlwdE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiR2V0dGVyKTsNCisgIEZYX0JPT0wgUXVlcnlCdWlsdGluSFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KKyAgc3RhdGljIHZvaWQgR2xvYmFsUHJvcGVydHlHZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICBzdGF0aWMgdm9pZCBHbG9iYWxQcm9wZXJ0eVNldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCisgIHN0YXRpYyB2b2lkIE5vcm1hbFByb3BlcnR5R2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KKyAgc3RhdGljIHZvaWQgTm9ybWFsUHJvcGVydHlTZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICBzdGF0aWMgdm9pZCBOb3JtYWxNZXRob2RDYWxsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgaW50MzJfdCBOb3JtYWxQcm9wVHlwZUdldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJRdWVyeUluKTsNCisgIHN0YXRpYyBpbnQzMl90IEdsb2JhbFByb3BUeXBlR2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlF1ZXJ5SW4pOw0KKyAgRlhfQk9PTCBSdW5WYXJpYWJsZXNTY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSk7DQorICBDWEZBX09iamVjdCogR2V0VmFyaWFibGVzVGhpcyhDWEZBX09iamVjdCogcE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE5vZGUgPSBGQUxTRSk7DQorICB2b2lkIFJlbGVhc2VWYXJpYWJsZXNNYXAoKTsNCisgIEZYX0JPT0wgSXNTdHJpY3RTY29wZUluSmF2YVNjcmlwdCgpOw0KKyAgWEZBX1NDUklQVExBTkdUWVBFIEdldFR5cGUoKTsNCisgIENYRkFfTm9kZUFycmF5JiBHZXRVcE9iamVjdEFycmF5KCkgeyByZXR1cm4gbV91cE9iamVjdEFycmF5OyB9DQorICBDWEZBX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50OyB9DQogDQotICAgIHZvaWQJCQkJCURlZmluZUpzQ2xhc3MoKTsNCi0gICAgQ1hGQV9Eb2N1bWVudCoJCQkJCQkJCQltX3BEb2N1bWVudDsNCi0gICAgRlhKU0VfSENPTlRFWFQJCQkJCQkJCQltX2hKc0NvbnRleHQ7DQotICAgIEZYSlNFX0hSVU5USU1FCQkJCQkJCQkJbV9oSnNSdW50aW1lOw0KLSAgICBGWEpTRV9IQ0xBU1MJCQkJCQkJCQltX2hKc0NsYXNzOw0KLSAgICBYRkFfU0NSSVBUTEFOR1RZUEUJCQkJCQkJCW1fZVNjcmlwdFR5cGU7DQotICAgIEZYSlNFX0NMQVNTCQkJCQkJCQkJCW1fSnNHbG9iYWxDbGFzczsNCi0gICAgRlhKU0VfQ0xBU1MJCQkJCQkJCQkJbV9Kc05vcm1hbENsYXNzOw0KLSAgICBDRlhfTWFwUHRyVGVtcGxhdGU8Q1hGQV9PYmplY3QqLCBGWEpTRV9IVkFMVUU+ICBtX21hcFhGQVRvSFZhbHVlOw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERlZmluZUpzQ29udGV4dCgpOw0KKyAgRlhKU0VfSENPTlRFWFQgQ3JlYXRlVmFyaWFibGVzQ29udGV4dChDWEZBX05vZGUqIHBTY3JpcHROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtKTsNCiANCi0gICAgRlhKU0VfQ0xBU1MJCQkJCQkJCQkJbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzOw0KLSAgICBDRlhfTWFwUHRyVGVtcGxhdGU8Q1hGQV9PYmplY3QqLCBGWEpTRV9IQ09OVEVYVD4gbV9tYXBWYXJpYWJsZVRvSFZhbHVlOw0KLSAgICBDWEZBX0V2ZW50UGFyYW0qCQkJCQkJCQltX3BFdmVudFBhcmFtOw0KLSAgICBDWEZBX05vZGVBcnJheQkJCQkJCQkJCW1fdXBPYmplY3RBcnJheTsNCi0gICAgQ0ZYX1B0ckFycmF5CQkJCQkJCQkJbV9DYWNoZUxpc3RBcnJheTsNCi0gICAgQ1hGQV9Ob2RlQXJyYXkqCQkJCQkJCQkJbV9wU2NyaXB0Tm9kZUFycmF5Ow0KLSAgICBDWEZBX1Jlc29sdmVQcm9jZXNzb3IqCQkJCQkJCW1fcFJlc29sdmVQcm9jZXNzb3I7DQotICAgIFhGQV9IRk0ySlNDT05URVhUCQkJCQkJCQltX2hGTTJKU0NvbnRleHQ7DQotICAgIENYRkFfT2JqZWN0KgkJCQkJCQkJCW1fcFRoaXNPYmplY3Q7DQotICAgIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyCQkJCQkJCW1fSlNCdWlsdEluT2JqZWN0czsNCi0gICAgRlhfRFdPUkQJCQkJCQkJCQkJbV9kd0J1aWx0SW5JbkZsYWdzOw0KLSAgICBYRkFfQVRUUklCVVRFRU5VTQkJCQkJCQkJbV9lUnVuQXRUeXBlOw0KKyAgdm9pZCBEZWZpbmVKc0NsYXNzKCk7DQorICBDWEZBX0RvY3VtZW50KiBtX3BEb2N1bWVudDsNCisgIEZYSlNFX0hDT05URVhUIG1faEpzQ29udGV4dDsNCisgIEZYSlNFX0hSVU5USU1FIG1faEpzUnVudGltZTsNCisgIEZYSlNFX0hDTEFTUyBtX2hKc0NsYXNzOw0KKyAgWEZBX1NDUklQVExBTkdUWVBFIG1fZVNjcmlwdFR5cGU7DQorICBGWEpTRV9DTEFTUyBtX0pzR2xvYmFsQ2xhc3M7DQorICBGWEpTRV9DTEFTUyBtX0pzTm9ybWFsQ2xhc3M7DQorICBDRlhfTWFwUHRyVGVtcGxhdGU8Q1hGQV9PYmplY3QqLCBGWEpTRV9IVkFMVUU+IG1fbWFwWEZBVG9IVmFsdWU7DQorDQorICBGWEpTRV9DTEFTUyBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3M7DQorICBDRlhfTWFwUHRyVGVtcGxhdGU8Q1hGQV9PYmplY3QqLCBGWEpTRV9IQ09OVEVYVD4gbV9tYXBWYXJpYWJsZVRvSFZhbHVlOw0KKyAgQ1hGQV9FdmVudFBhcmFtKiBtX3BFdmVudFBhcmFtOw0KKyAgQ1hGQV9Ob2RlQXJyYXkgbV91cE9iamVjdEFycmF5Ow0KKyAgQ0ZYX1B0ckFycmF5IG1fQ2FjaGVMaXN0QXJyYXk7DQorICBDWEZBX05vZGVBcnJheSogbV9wU2NyaXB0Tm9kZUFycmF5Ow0KKyAgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yKiBtX3BSZXNvbHZlUHJvY2Vzc29yOw0KKyAgWEZBX0hGTTJKU0NPTlRFWFQgbV9oRk0ySlNDb250ZXh0Ow0KKyAgQ1hGQV9PYmplY3QqIG1fcFRoaXNPYmplY3Q7DQorICBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0ciBtX0pTQnVpbHRJbk9iamVjdHM7DQorICBGWF9EV09SRCBtX2R3QnVpbHRJbkluRmxhZ3M7DQorICBYRkFfQVRUUklCVVRFRU5VTSBtX2VSdW5BdFR5cGU7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuY3BwCmluZGV4IDI4MmRiZTIuLjQ5ZWZhM2IgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuY3BwCkBAIC0yMCw1MDUgKzIwLDUzNSBAQAogI2luY2x1ZGUgInhmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgiDQogI2luY2x1ZGUgInhmYV9sYXlvdXRfYXBwYWRhcHRlci5oIg0KIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KLSAgICA6IENYRkFfT3JkaW5hcnlPYmplY3QocERvY3VtZW50LCBYRkFfRUxFTUVOVF9MYXlvdXRQc2V1ZG9Nb2RlbCkNCi17DQotICAgIG1fdVNjcmlwdEhhc2ggPSBYRkFfSEFTSENPREVfTGF5b3V0Ow0KKyAgICA6IENYRkFfT3JkaW5hcnlPYmplY3QocERvY3VtZW50LCBYRkFfRUxFTUVOVF9MYXlvdXRQc2V1ZG9Nb2RlbCkgew0KKyAgbV91U2NyaXB0SGFzaCA9IFhGQV9IQVNIQ09ERV9MYXlvdXQ7DQogfQ0KLUNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6On5DU2NyaXB0X0xheW91dFBzZXVkb01vZGVsKCkNCi17DQorQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6fkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwoKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlYWR5KA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1VOQUJMRV9TRVRfUkVBRFkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlTdGF0dXMgPSBwTm90aWZ5LT5HZXRMYXlvdXRTdGF0dXMoKTsNCisgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBpU3RhdHVzID49IDIpOw0KIH0NCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWFkeShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpDQotew0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KLSAgICBpZiAoYlNldHRpbmcpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9SRUFEWSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaW50MzJfdCBpU3RhdHVzID0gcE5vdGlmeS0+R2V0TGF5b3V0U3RhdHVzKCk7DQotICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBpU3RhdHVzID49IDIpOw0KLX0NCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9IV1hZIGxheW91dE1vZGVsKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmICggaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDMpIHsNCi0gICAgICAgIGNvbnN0IEZYX1dDSEFSKiBtZXRob2ROYW1lID0gTlVMTDsNCi0gICAgICAgIHN3aXRjaCAobGF5b3V0TW9kZWwpIHsNCi0gICAgICAgICAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9IOg0KLSAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gTCJoIjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfVzoNCi0gICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IEwidyI7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1g6DQotICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBMIngiOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9ZOg0KLSAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gTCJ5IjsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBtZXRob2ROYW1lKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NVbml0ID0gRlhfV1NUUkMoTCJwdCIpOw0KLSAgICBpbnQzMl90IGlJbmRleCA9IDA7DQotICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCi0gICAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVW5pdCA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQotICAgICAgICBpZiAoIWJzVW5pdC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICB3c1VuaXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNVbml0LCBic1VuaXQuR2V0TGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDMpIHsNCi0gICAgICAgIGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOw0KLSAgICB9DQotICAgIGlmICghcE5vZGUpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCi0gICAgaWYgKCFwRG9jTGF5b3V0KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ0ZYX1JlY3RGIHJ0UmVjdDsNCi0gICAgQ1hGQV9NZWFzdXJlbWVudCBtZWFzdXJlOw0KLSAgICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gcERvY0xheW91dC0+R2V0TGF5b3V0SXRlbShwTm9kZSk7DQotICAgIGlmICghcExheW91dEl0ZW0pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICB3aGlsZSAoaUluZGV4ID4gMCAmJiBwTGF5b3V0SXRlbSkgew0KLSAgICAgICAgcExheW91dEl0ZW0gPSBwTGF5b3V0SXRlbS0+R2V0TmV4dCgpOw0KLSAgICAgICAgaUluZGV4IC0tOw0KLSAgICB9DQotICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCi0gICAgaWYgKCFwTGF5b3V0SXRlbSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoaFZhbHVlLCAwKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwTGF5b3V0SXRlbS0+R2V0UmVjdChydFJlY3QsIFRSVUUpOw0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0hXWFkoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsDQorICAgIFhGQV9MQVlPVVRNT0RFTF9IV1hZIGxheW91dE1vZGVsKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMykgew0KKyAgICBjb25zdCBGWF9XQ0hBUiogbWV0aG9kTmFtZSA9IE5VTEw7DQogICAgIHN3aXRjaCAobGF5b3V0TW9kZWwpIHsNCi0gICAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX0g6DQotICAgICAgICAgICAgbWVhc3VyZS5TZXQocnRSZWN0LmhlaWdodCwgWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfVzoNCi0gICAgICAgICAgICBtZWFzdXJlLlNldChydFJlY3Qud2lkdGgsIFhGQV9VTklUX1B0KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1g6DQotICAgICAgICAgICAgbWVhc3VyZS5TZXQocnRSZWN0LmxlZnQsIFhGQV9VTklUX1B0KTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1k6DQotICAgICAgICAgICAgbWVhc3VyZS5TZXQocnRSZWN0LnRvcCwgWEZBX1VOSVRfUHQpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX0g6DQorICAgICAgICBtZXRob2ROYW1lID0gTCJoIjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1c6DQorICAgICAgICBtZXRob2ROYW1lID0gTCJ3IjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1g6DQorICAgICAgICBtZXRob2ROYW1lID0gTCJ4IjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1k6DQorICAgICAgICBtZXRob2ROYW1lID0gTCJ5IjsNCisgICAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIFhGQV9VTklUIHVuaXQgPQltZWFzdXJlLkdldFVuaXQod3NVbml0KTsNCi0gICAgRlhfRkxPQVQgZlZhbHVlID0gbWVhc3VyZS5Ub1VuaXQodW5pdCk7DQotICAgIGZWYWx1ZSA9IEZYU1lTX3JvdW5kKGZWYWx1ZSAqIDEwMDApIC8gMTAwMC4wZjsNCi0gICAgaWYgKGhWYWx1ZSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoaFZhbHVlLCBmVmFsdWUpOw0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBtZXRob2ROYW1lKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBDRlhfV2lkZVN0cmluZyB3c1VuaXQgPSBGWF9XU1RSQyhMInB0Iik7DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1VuaXQgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICBpZiAoIWJzVW5pdC5Jc0VtcHR5KCkpIHsNCisgICAgICB3c1VuaXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNVbml0LCBic1VuaXQuR2V0TGVuZ3RoKCkpOw0KICAgICB9DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAzKSB7DQorICAgIGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOw0KKyAgfQ0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgIGlmICghcERvY0xheW91dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfUmVjdEYgcnRSZWN0Ow0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtZWFzdXJlOw0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IHBEb2NMYXlvdXQtPkdldExheW91dEl0ZW0ocE5vZGUpOw0KKyAgaWYgKCFwTGF5b3V0SXRlbSkgew0KKyAgICByZXR1cm47DQorICB9DQorICB3aGlsZSAoaUluZGV4ID4gMCAmJiBwTGF5b3V0SXRlbSkgew0KKyAgICBwTGF5b3V0SXRlbSA9IHBMYXlvdXRJdGVtLT5HZXROZXh0KCk7DQorICAgIGlJbmRleC0tOw0KKyAgfQ0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoIXBMYXlvdXRJdGVtKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGhWYWx1ZSwgMCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBMYXlvdXRJdGVtLT5HZXRSZWN0KHJ0UmVjdCwgVFJVRSk7DQorICBzd2l0Y2ggKGxheW91dE1vZGVsKSB7DQorICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX0g6DQorICAgICAgbWVhc3VyZS5TZXQocnRSZWN0LmhlaWdodCwgWEZBX1VOSVRfUHQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9XOg0KKyAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC53aWR0aCwgWEZBX1VOSVRfUHQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9YOg0KKyAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC5sZWZ0LCBYRkFfVU5JVF9QdCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1k6DQorICAgICAgbWVhc3VyZS5TZXQocnRSZWN0LnRvcCwgWEZBX1VOSVRfUHQpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgWEZBX1VOSVQgdW5pdCA9IG1lYXN1cmUuR2V0VW5pdCh3c1VuaXQpOw0KKyAgRlhfRkxPQVQgZlZhbHVlID0gbWVhc3VyZS5Ub1VuaXQodW5pdCk7DQorICBmVmFsdWUgPSBGWFNZU19yb3VuZChmVmFsdWUgKiAxMDAwKSAvIDEwMDAuMGY7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGhWYWx1ZSwgZlZhbHVlKTsNCisgIH0NCiB9DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfSChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0hXWFkocEFyZ3VtZW50cywgWEZBX0xBWU9VVE1PREVMX0gpOw0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0goDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9IKTsNCiB9DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfVyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0hXWFkocEFyZ3VtZW50cywgWEZBX0xBWU9VVE1PREVMX1cpOw0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1coDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9XKTsNCiB9DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfWChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0hXWFkocEFyZ3VtZW50cywgWEZBX0xBWU9VVE1PREVMX1gpOw0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1goDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9YKTsNCiB9DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfWShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0hXWFkocEFyZ3VtZW50cywgWEZBX0xBWU9VVE1PREVMX1kpOw0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1koDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9ZKTsNCiB9DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfTnVtYmVyZWRQYWdlQ291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cywgRlhfQk9PTCBiTnVtYmVyZWQpDQotew0KLSAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCi0gICAgaWYgKCFwRG9jTGF5b3V0KSB7DQotICAgICAgICByZXR1cm47DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfTnVtYmVyZWRQYWdlQ291bnQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsDQorICAgIEZYX0JPT0wgYk51bWJlcmVkKSB7DQorICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgIGlmICghcERvY0xheW91dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlQYWdlQ291bnQgPSAwOw0KKyAgaW50MzJfdCBpUGFnZU51bSA9IHBEb2NMYXlvdXQtPkNvdW50UGFnZXMoKTsNCisgIGlmIChiTnVtYmVyZWQpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVBhZ2VOdW07IGkrKykgew0KKyAgICAgIElYRkFfTGF5b3V0UGFnZSogcExheW91dFBhZ2UgPSBwRG9jTGF5b3V0LT5HZXRQYWdlKGkpOw0KKyAgICAgIGlmICghcExheW91dFBhZ2UpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBNYXN0ZXJQYWdlID0gcExheW91dFBhZ2UtPkdldE1hc3RlclBhZ2UoKTsNCisgICAgICBpZiAocE1hc3RlclBhZ2UtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9OdW1iZXJlZCkpIHsNCisgICAgICAgIGlQYWdlQ291bnQrKzsNCisgICAgICB9DQogICAgIH0NCi0gICAgaW50MzJfdCBpUGFnZUNvdW50ID0gMDsNCi0gICAgaW50MzJfdCBpUGFnZU51bSA9IHBEb2NMYXlvdXQtPkNvdW50UGFnZXMoKTsNCi0gICAgaWYgKGJOdW1iZXJlZCkgew0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVBhZ2VOdW07IGkrKykgew0KLSAgICAgICAgICAgIElYRkFfTGF5b3V0UGFnZSogcExheW91dFBhZ2UgPSBwRG9jTGF5b3V0LT5HZXRQYWdlKGkpOw0KLSAgICAgICAgICAgIGlmICghcExheW91dFBhZ2UpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQorICB9IGVsc2Ugew0KKyAgICBpUGFnZUNvdW50ID0gaVBhZ2VOdW07DQorICB9DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlQ291bnQpOw0KKyAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlQ291bnQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9OdW1iZXJlZFBhZ2VDb3VudChwQXJndW1lbnRzLCBUUlVFKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZVNwYW4oDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInBhZ2VTcGFuIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBwTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCisgIH0NCisgIGlmICghcE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQorICBpZiAoIXBEb2NMYXlvdXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gcERvY0xheW91dC0+R2V0TGF5b3V0SXRlbShwTm9kZSk7DQorICBpZiAoIXBMYXlvdXRJdGVtKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCAtMSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUxhc3QgPSBwTGF5b3V0SXRlbS0+R2V0TGFzdCgpLT5HZXRQYWdlKCktPkdldFBhZ2VJbmRleCgpOw0KKyAgaW50MzJfdCBpRmlyc3QgPSBwTGF5b3V0SXRlbS0+R2V0Rmlyc3QoKS0+R2V0UGFnZSgpLT5HZXRQYWdlSW5kZXgoKTsNCisgIGludDMyX3QgaVBhZ2VTcGFuID0gaUxhc3QgLSBpRmlyc3QgKyAxOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVBhZ2VTcGFuKTsNCisgIH0NCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VJbXAocEFyZ3VtZW50cywgRkFMU0UpOw0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9HZXRPYmpBcnJheSgNCisgICAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQsDQorICAgIGludDMyX3QgaVBhZ2VObywNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVHlwZSwNCisgICAgRlhfQk9PTCBiT25QYWdlQXJlYSwNCisgICAgQ1hGQV9Ob2RlQXJyYXkmIHJldEFycmF5KSB7DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0UGFnZSA9DQorICAgICAgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbUltcGwqKXBEb2NMYXlvdXQtPkdldFBhZ2UoaVBhZ2VObyk7DQorICBpZiAoIXBMYXlvdXRQYWdlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmICh3c1R5cGUgPT0gRlhfV1NUUkMoTCJwYWdlQXJlYSIpKSB7DQorICAgIGlmIChDWEZBX05vZGUqIHBNYXN0ZXJQYWdlID0gcExheW91dFBhZ2UtPm1fcEZvcm1Ob2RlKSB7DQorICAgICAgcmV0QXJyYXkuQWRkKHBNYXN0ZXJQYWdlKTsNCisgICAgfQ0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAod3NUeXBlID09IEZYX1dTVFJDKEwiY29udGVudEFyZWEiKSkgew0KKyAgICBmb3IgKENYRkFfTGF5b3V0SXRlbUltcGwqIHBJdGVtID0gcExheW91dFBhZ2UtPm1fcEZpcnN0Q2hpbGQ7IHBJdGVtOw0KKyAgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgaWYgKHBJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICByZXRBcnJheS5BZGQocEl0ZW0tPm1fcEZvcm1Ob2RlKTsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX01hcFB0clRvUHRyIGZvcm1JdGVtczsNCisgIGZvcm1JdGVtcy5Jbml0SGFzaFRhYmxlKDI1NiwgVFJVRSk7DQorICBpZiAod3NUeXBlLklzRW1wdHkoKSkgew0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwTWFzdGVyUGFnZSA9IHBMYXlvdXRQYWdlLT5tX3BGb3JtTm9kZSkgew0KKyAgICAgIHJldEFycmF5LkFkZChwTWFzdGVyUGFnZSk7DQorICAgIH0NCisgICAgZm9yIChDWEZBX0xheW91dEl0ZW1JbXBsKiBwSXRlbSA9IHBMYXlvdXRQYWdlLT5tX3BGaXJzdENoaWxkOyBwSXRlbTsNCisgICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgIGlmIChwSXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KKyAgICAgICAgcmV0QXJyYXkuQWRkKHBJdGVtLT5tX3BGb3JtTm9kZSk7DQorICAgICAgICBpZiAoIWJPblBhZ2VBcmVhKSB7DQorICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRMYXlvdXRJdGVtPg0KKyAgICAgICAgICBpdGVyYXRvcigoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBJdGVtLT5tX3BGaXJzdENoaWxkKTsNCisgICAgICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgICAgICAgICAgICAgICBwSXRlbUNoaWxkOyBwSXRlbUNoaWxkID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgaWYgKCFwSXRlbUNoaWxkLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBNYXN0ZXJQYWdlID0gcExheW91dFBhZ2UtPkdldE1hc3RlclBhZ2UoKTsNCi0gICAgICAgICAgICBpZiAocE1hc3RlclBhZ2UtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9OdW1iZXJlZCkpIHsNCi0gICAgICAgICAgICAgICAgaVBhZ2VDb3VudCsrOw0KKyAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50VHlwZSA9IHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICAgICAgaWYgKGVFbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJg0KKyAgICAgICAgICAgICAgICBlRWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfRHJhdyAmJg0KKyAgICAgICAgICAgICAgICBlRWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSAmJg0KKyAgICAgICAgICAgICAgICBlRWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfQXJlYSkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChmb3JtSXRlbXMuR2V0VmFsdWVBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3JtSXRlbXMuU2V0QXQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUsIHRoaXMpOw0KKyAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSk7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGJPblBhZ2VBcmVhKSB7DQorICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRMYXlvdXRJdGVtPg0KKyAgICAgICAgICBpdGVyYXRvcigoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBJdGVtKTsNCisgICAgICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgICAgICAgICAgICAgICBwSXRlbUNoaWxkOyBwSXRlbUNoaWxkID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgaWYgKCFwSXRlbUNoaWxkLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBYRkFfRUxFTUVOVCBlRWxlbWVudFR5cGUgPSBwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgICAgIGlmIChlRWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfRmllbGQgJiYNCisgICAgICAgICAgICAgICAgZUVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX0RyYXcgJiYNCisgICAgICAgICAgICAgICAgZUVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX1N1YmZvcm0gJiYNCisgICAgICAgICAgICAgICAgZUVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX0FyZWEpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZm9ybUl0ZW1zLkdldFZhbHVlQXQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZm9ybUl0ZW1zLlNldEF0KHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLCB0aGlzKTsNCisgICAgICAgICAgICByZXRBcnJheS5BZGQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybjsNCisgIH0NCisgIFhGQV9FTEVNRU5UIGVUeXBlID0gWEZBX0VMRU1FTlRfVU5LTk9XTjsNCisgIGlmICh3c1R5cGUgPT0gRlhfV1NUUkMoTCJmaWVsZCIpKSB7DQorICAgIGVUeXBlID0gWEZBX0VMRU1FTlRfRmllbGQ7DQorICB9IGVsc2UgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMImRyYXciKSkgew0KKyAgICBlVHlwZSA9IFhGQV9FTEVNRU5UX0RyYXc7DQorICB9IGVsc2UgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMInN1YmZvcm0iKSkgew0KKyAgICBlVHlwZSA9IFhGQV9FTEVNRU5UX1N1YmZvcm07DQorICB9IGVsc2UgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMImFyZWEiKSkgew0KKyAgICBlVHlwZSA9IFhGQV9FTEVNRU5UX0FyZWE7DQorICB9DQorICBpZiAoZVR5cGUgIT0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KKyAgICBmb3IgKENYRkFfTGF5b3V0SXRlbUltcGwqIHBJdGVtID0gcExheW91dFBhZ2UtPm1fcEZpcnN0Q2hpbGQ7IHBJdGVtOw0KKyAgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgaWYgKHBJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICBpZiAoIWJPblBhZ2VBcmVhKSB7DQorICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRMYXlvdXRJdGVtPg0KKyAgICAgICAgICBpdGVyYXRvcigoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBJdGVtLT5tX3BGaXJzdENoaWxkKTsNCisgICAgICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgICAgICAgICAgICAgICBwSXRlbUNoaWxkOyBwSXRlbUNoaWxkID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgaWYgKCFwSXRlbUNoaWxkLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBlVHlwZSkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChmb3JtSXRlbXMuR2V0VmFsdWVBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3JtSXRlbXMuU2V0QXQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUsIHRoaXMpOw0KKyAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGJPblBhZ2VBcmVhKSB7DQorICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRMYXlvdXRJdGVtPg0KKyAgICAgICAgICBpdGVyYXRvcigoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBJdGVtKTsNCisgICAgICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgICAgICAgICAgICAgICBwSXRlbUNoaWxkOyBwSXRlbUNoaWxkID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgaWYgKCFwSXRlbUNoaWxkLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBlVHlwZSkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChmb3JtSXRlbXMuR2V0VmFsdWVBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3JtSXRlbXMuU2V0QXQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUsIHRoaXMpOw0KKyAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlQ29udGVudCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDMpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJwYWdlQ29udGVudCIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyB3c1R5cGU7DQorICBGWF9CT09MIGJPblBhZ2VBcmVhID0gRkFMU0U7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1R5cGUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICB3c1R5cGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNUeXBlLCBic1R5cGUuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMykgew0KKyAgICBiT25QYWdlQXJlYSA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQorICBpZiAoIXBEb2NMYXlvdXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlQXJyYXkgcmV0QXJyYXk7DQorICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfR2V0T2JqQXJyYXkocERvY0xheW91dCwgaUluZGV4LCB3c1R5cGUsIGJPblBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldEFycmF5KTsNCisgIENYRkFfQXJyYXlOb2RlTGlzdCogcEFycmF5Tm9kZUxpc3QgPSBGWF9ORVcgQ1hGQV9BcnJheU5vZGVMaXN0KG1fcERvY3VtZW50KTsNCisgIHBBcnJheU5vZGVMaXN0LT5TZXRBcnJheU5vZGVMaXN0KHJldEFycmF5KTsNCisgIEZYSlNFX1ZhbHVlX1NldE9iamVjdChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChDWEZBX09iamVjdCopcEFycmF5Tm9kZUxpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SnNlTm9ybWFsQ2xhc3MoKSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VDb3VudCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX051bWJlcmVkUGFnZUNvdW50KHBBcmd1bWVudHMsIEZBTFNFKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUNvdW50SW5CYXRjaCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgaW50MzJfdCBpUGFnZUNvdW50ID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+QWJzUGFnZUNvdW50SW5CYXRjaChoRG9jKTsNCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVBhZ2VDb3VudCk7DQorICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1NoZWV0Q291bnRJbkJhdGNoKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBpbnQzMl90IGlQYWdlQ291bnQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TaGVldENvdW50SW5CYXRjaChoRG9jKTsNCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVBhZ2VDb3VudCk7DQorICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlbGF5b3V0KA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBDWEZBX05vZGUqIHBSb290Tm9kZSA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7DQorICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IHBSb290Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRm9ybSk7DQorICBGWFNZU19hc3NlcnQocEZvcm1Sb290KTsNCisgIENYRkFfTm9kZSogcENvbnRlbnRSb290Tm9kZSA9IHBGb3JtUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm9jZXNzb3IgPSBtX3BEb2N1bWVudC0+R2V0TGF5b3V0UHJvY2Vzc29yKCk7DQorICBpZiAocENvbnRlbnRSb290Tm9kZSkgew0KKyAgICBwTGF5b3V0UHJvY2Vzc29yLT5BZGRDaGFuZ2VkQ29udGFpbmVyKHBDb250ZW50Um9vdE5vZGUpOw0KKyAgfQ0KKyAgcExheW91dFByb2Nlc3Nvci0+U2V0Rm9yY2VSZUxheW91dChUUlVFKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZVNwYW4oDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlU3BhbihwQXJndW1lbnRzKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUluQmF0Y2goDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImFic1BhZ2VJbkJhdGNoIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBwTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCisgIH0NCisgIGlmICghcE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0ID0gbV9wRG9jdW1lbnQtPkdldERvY0xheW91dCgpOw0KKyAgaWYgKCFwRG9jTGF5b3V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gcE5vdGlmeS0+R2V0SFdpZGdldChwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKSk7DQorICBpZiAoIWhXaWRnZXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBpbnQzMl90IGlQYWdlQ291bnQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5BYnNQYWdlSW5CYXRjaChoRG9jLCBoV2lkZ2V0KTsNCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVBhZ2VDb3VudCk7DQorICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1NoZWV0SW5CYXRjaCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwic2hlZXRJbkJhdGNoIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBwTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCisgIH0NCisgIGlmICghcE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0ID0gbV9wRG9jdW1lbnQtPkdldERvY0xheW91dCgpOw0KKyAgaWYgKCFwRG9jTGF5b3V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gcE5vdGlmeS0+R2V0SFdpZGdldChwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKSk7DQorICBpZiAoIWhXaWRnZXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBpbnQzMl90IGlQYWdlQ291bnQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TaGVldEluQmF0Y2goaERvYywgaFdpZGdldCk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlQ291bnQpOw0KKyAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VJbXAocEFyZ3VtZW50cywgVFJVRSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlbGF5b3V0UGFnZUFyZWEoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRDb3VudCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX051bWJlcmVkUGFnZUNvdW50KHBBcmd1bWVudHMsIEZBTFNFKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VJbXAocEFyZ3VtZW50cywgVFJVRSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VJbXAoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsDQorICAgIEZYX0JPT0wgYkFic1BhZ2UpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBjb25zdCBGWF9XQ0hBUiogbWV0aG9kTmFtZTsNCisgICAgaWYgKGJBYnNQYWdlKSB7DQorICAgICAgbWV0aG9kTmFtZSA9IEwiYWJzUGFnZSI7DQogICAgIH0gZWxzZSB7DQotICAgICAgICBpUGFnZUNvdW50ID0gaVBhZ2VOdW07DQorICAgICAgbWV0aG9kTmFtZSA9IEwicGFnZSI7DQogICAgIH0NCi0gICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9ICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KLSAgICBpZiAoaFZhbHVlKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVBhZ2VDb3VudCk7DQotICAgIH0NCi19DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUNvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfTnVtYmVyZWRQYWdlQ291bnQocEFyZ3VtZW50cywgVFJVRSk7DQotfQ0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VTcGFuKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggIT0gMSkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJwYWdlU3BhbiIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KLSAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQotICAgICAgICBwTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCi0gICAgfQ0KLSAgICBpZiAoIXBOb2RlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQotICAgIGlmICghcERvY0xheW91dCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCi0gICAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IHBEb2NMYXlvdXQtPkdldExheW91dEl0ZW0ocE5vZGUpOw0KLSAgICBpZiAoIXBMYXlvdXRJdGVtKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgLTEpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUxhc3QgPSBwTGF5b3V0SXRlbS0+R2V0TGFzdCgpLT5HZXRQYWdlKCktPkdldFBhZ2VJbmRleCgpOw0KLSAgICBpbnQzMl90IGlGaXJzdCA9IHBMYXlvdXRJdGVtLT5HZXRGaXJzdCgpLT5HZXRQYWdlKCktPkdldFBhZ2VJbmRleCgpOw0KLSAgICBpbnQzMl90IGlQYWdlU3BhbiA9IGlMYXN0IC0gaUZpcnN0ICsgMTsNCi0gICAgaWYgKGhWYWx1ZSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlU3Bhbik7DQotICAgIH0NCi19DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VJbXAocEFyZ3VtZW50cywgRkFMU0UpOw0KLX0NCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9HZXRPYmpBcnJheShJWEZBX0RvY0xheW91dCogcERvY0xheW91dCwgaW50MzJfdCBpUGFnZU5vLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NUeXBlLCBGWF9CT09MIGJPblBhZ2VBcmVhLCBDWEZBX05vZGVBcnJheSAmcmV0QXJyYXkpDQotew0KLSAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKiBwTGF5b3V0UGFnZSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW1JbXBsKilwRG9jTGF5b3V0LT5HZXRQYWdlKGlQYWdlTm8pOw0KLSAgICBpZiAoIXBMYXlvdXRQYWdlKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMInBhZ2VBcmVhIikpIHsNCi0gICAgICAgIGlmIChDWEZBX05vZGUqIHBNYXN0ZXJQYWdlID0gcExheW91dFBhZ2UtPm1fcEZvcm1Ob2RlKSB7DQotICAgICAgICAgICAgcmV0QXJyYXkuQWRkKHBNYXN0ZXJQYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAod3NUeXBlID09IEZYX1dTVFJDKEwiY29udGVudEFyZWEiKSkgew0KLSAgICAgICAgZm9yKENYRkFfTGF5b3V0SXRlbUltcGwqIHBJdGVtID0gcExheW91dFBhZ2UtPm1fcEZpcnN0Q2hpbGQ7IHBJdGVtOyBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgICAgIGlmKHBJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQotICAgICAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbS0+bV9wRm9ybU5vZGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfTWFwUHRyVG9QdHIgZm9ybUl0ZW1zOw0KLSAgICBmb3JtSXRlbXMuSW5pdEhhc2hUYWJsZSgyNTYsIFRSVUUpOw0KLSAgICBpZiAod3NUeXBlLklzRW1wdHkoKSkgew0KLSAgICAgICAgaWYgKENYRkFfTm9kZSogcE1hc3RlclBhZ2UgPSBwTGF5b3V0UGFnZS0+bV9wRm9ybU5vZGUpIHsNCi0gICAgICAgICAgICByZXRBcnJheS5BZGQocE1hc3RlclBhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yKENYRkFfTGF5b3V0SXRlbUltcGwqIHBJdGVtID0gcExheW91dFBhZ2UtPm1fcEZpcnN0Q2hpbGQ7IHBJdGVtOyBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0U2libGluZykgew0KLSAgICAgICAgICAgIGlmKHBJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQotICAgICAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbS0+bV9wRm9ybU5vZGUpOw0KLSAgICAgICAgICAgICAgICBpZighYk9uUGFnZUFyZWEpIHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50TGF5b3V0SXRlbT4gaXRlcmF0b3IoKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKilwSXRlbS0+bV9wRmlyc3RDaGlsZCk7DQotICAgICAgICAgICAgICAgICAgICBmb3IoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqIHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7IHBJdGVtQ2hpbGQ7IHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighcEl0ZW1DaGlsZC0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlRWxlbWVudFR5cGUgPSBwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlRWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfRmllbGQgJiYgZUVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX0RyYXcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVFbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtICYmIGVFbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9BcmVhKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybUl0ZW1zLkdldFZhbHVlQXQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtSXRlbXMuU2V0QXQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUsIHRoaXMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZihiT25QYWdlQXJlYSkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRMYXlvdXRJdGVtPiBpdGVyYXRvcigoQ1hGQV9Db250ZW50TGF5b3V0SXRlbUltcGwqKXBJdGVtKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCogcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcEl0ZW1DaGlsZDsgcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwSXRlbUNoaWxkLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50VHlwZSA9IHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVFbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJiBlRWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfRHJhdw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZUVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX1N1YmZvcm0gJiYgZUVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX0FyZWEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtSXRlbXMuR2V0VmFsdWVBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1JdGVtcy5TZXRBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSwgdGhpcyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0QXJyYXkuQWRkKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV047DQotICAgIGlmICh3c1R5cGUgPT0gRlhfV1NUUkMoTCJmaWVsZCIpKSB7DQotICAgICAgICBlVHlwZSA9IFhGQV9FTEVNRU5UX0ZpZWxkOw0KLSAgICB9IGVsc2UgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMImRyYXciKSkgew0KLSAgICAgICAgZVR5cGUgPSBYRkFfRUxFTUVOVF9EcmF3Ow0KLSAgICB9IGVsc2UgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMInN1YmZvcm0iKSkgew0KLSAgICAgICAgZVR5cGUgPSBYRkFfRUxFTUVOVF9TdWJmb3JtOw0KLSAgICB9IGVsc2UgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMImFyZWEiKSkgew0KLSAgICAgICAgZVR5cGUgPSBYRkFfRUxFTUVOVF9BcmVhOw0KLSAgICB9DQotICAgIGlmIChlVHlwZSAhPSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQotICAgICAgICBmb3IoQ1hGQV9MYXlvdXRJdGVtSW1wbCogcEl0ZW0gPSBwTGF5b3V0UGFnZS0+bV9wRmlyc3RDaGlsZDsgcEl0ZW07IHBJdGVtID0gcEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQotICAgICAgICAgICAgaWYocEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCi0gICAgICAgICAgICAgICAgaWYoIWJPblBhZ2VBcmVhKSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudExheW91dEl0ZW0+IGl0ZXJhdG9yKChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcEl0ZW0tPm1fcEZpcnN0Q2hpbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwSXRlbUNoaWxkID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwSXRlbUNoaWxkOyBwSXRlbUNoaWxkID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXBJdGVtQ2hpbGQtPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gZVR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtSXRlbXMuR2V0VmFsdWVBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1JdGVtcy5TZXRBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSwgdGhpcyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0QXJyYXkuQWRkKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmKGJPblBhZ2VBcmVhKSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudExheW91dEl0ZW0+IGl0ZXJhdG9yKChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtSW1wbCopcEl0ZW0pOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yKENYRkFfQ29udGVudExheW91dEl0ZW1JbXBsKiBwSXRlbUNoaWxkID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwSXRlbUNoaWxkOyBwSXRlbUNoaWxkID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXBJdGVtQ2hpbGQtPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gZVR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtSXRlbXMuR2V0VmFsdWVBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1JdGVtcy5TZXRBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSwgdGhpcyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0QXJyYXkuQWRkKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLX0NCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlQ29udGVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMykgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJwYWdlQ29udGVudCIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGludDMyX3QgaUluZGV4ID0gMDsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlOw0KLSAgICBGWF9CT09MIGJPblBhZ2VBcmVhID0gRkFMU0U7DQotICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCi0gICAgICAgIGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzVHlwZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQotICAgICAgICB3c1R5cGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNUeXBlLCBic1R5cGUuR2V0TGVuZ3RoKCkpOw0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDMpIHsNCi0gICAgICAgIGJPblBhZ2VBcmVhID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMikgPT0gMCA/IEZBTFNFIDogVFJVRTsNCi0gICAgfQ0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0ID0gbV9wRG9jdW1lbnQtPkdldERvY0xheW91dCgpOw0KLSAgICBpZiAoIXBEb2NMYXlvdXQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGVBcnJheSByZXRBcnJheTsNCi0gICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0dldE9iakFycmF5KHBEb2NMYXlvdXQsIGlJbmRleCwgd3NUeXBlLCBiT25QYWdlQXJlYSwgcmV0QXJyYXkpOw0KLSAgICBDWEZBX0FycmF5Tm9kZUxpc3QqIHBBcnJheU5vZGVMaXN0ID0gRlhfTkVXIENYRkFfQXJyYXlOb2RlTGlzdChtX3BEb2N1bWVudCk7DQotICAgIHBBcnJheU5vZGVMaXN0LT5TZXRBcnJheU5vZGVMaXN0KHJldEFycmF5KTsNCi0gICAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIChDWEZBX09iamVjdCopcEFycmF5Tm9kZUxpc3QsIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpzZU5vcm1hbENsYXNzKCkpOw0KLX0NCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9OdW1iZXJlZFBhZ2VDb3VudChwQXJndW1lbnRzLCBGQUxTRSk7DQotfQ0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VDb3VudEluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQotICAgIGludDMyX3QgaVBhZ2VDb3VudCA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkFic1BhZ2VDb3VudEluQmF0Y2goaERvYyk7DQotICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCi0gICAgaWYgKGhWYWx1ZSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlQ291bnQpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1NoZWV0Q291bnRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KLSAgICBpbnQzMl90IGlQYWdlQ291bnQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TaGVldENvdW50SW5CYXRjaChoRG9jKTsNCi0gICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9ICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KLSAgICBpZiAoaFZhbHVlKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVBhZ2VDb3VudCk7DQotICAgIH0NCi19DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUmVsYXlvdXQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIENYRkFfTm9kZSogcFJvb3ROb2RlID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsNCi0gICAgQ1hGQV9Ob2RlKiBwRm9ybVJvb3QgPSBwUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0Zvcm0pOw0KLSAgICBGWFNZU19hc3NlcnQocEZvcm1Sb290KTsNCi0gICAgQ1hGQV9Ob2RlKiBwQ29udGVudFJvb3ROb2RlID0gcEZvcm1Sb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQotICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KLSAgICBpZiAocENvbnRlbnRSb290Tm9kZSkgew0KLSAgICAgICAgcExheW91dFByb2Nlc3Nvci0+QWRkQ2hhbmdlZENvbnRhaW5lcihwQ29udGVudFJvb3ROb2RlKTsNCi0gICAgfQ0KLSAgICBwTGF5b3V0UHJvY2Vzc29yLT5TZXRGb3JjZVJlTGF5b3V0KFRSVUUpOw0KLX0NCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlU3BhbihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VTcGFuKHBBcmd1bWVudHMpOw0KLX0NCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlSW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoICE9IDEpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiYWJzUGFnZUluQmF0Y2giKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCi0gICAgaWYgKGlMZW5ndGggPj0gMSkgew0KLSAgICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQotICAgIH0NCi0gICAgaWYgKCFwTm9kZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQotICAgIGlmICghcERvY0xheW91dCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gcE5vdGlmeS0+R2V0SFdpZGdldChwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKSk7DQotICAgIGlmICghaFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KLSAgICBpbnQzMl90IGlQYWdlQ291bnQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5BYnNQYWdlSW5CYXRjaChoRG9jLCBoV2lkZ2V0KTsNCi0gICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9ICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KLSAgICBpZiAoaFZhbHVlKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVBhZ2VDb3VudCk7DQotICAgIH0NCi19DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggIT0gMSkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJzaGVldEluQmF0Y2giKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCi0gICAgaWYgKGlMZW5ndGggPj0gMSkgew0KLSAgICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQotICAgIH0NCi0gICAgaWYgKCFwTm9kZSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQotICAgIGlmICghcERvY0xheW91dCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gcE5vdGlmeS0+R2V0SFdpZGdldChwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKSk7DQotICAgIGlmICghaFdpZGdldCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KLSAgICBpbnQzMl90IGlQYWdlQ291bnQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TaGVldEluQmF0Y2goaERvYywgaFdpZGdldCk7DQotICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCi0gICAgaWYgKGhWYWx1ZSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlQ291bnQpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1NoZWV0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUltcChwQXJndW1lbnRzLCBUUlVFKTsNCi19DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUmVsYXlvdXRQYWdlQXJlYShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi19DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRDb3VudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX051bWJlcmVkUGFnZUNvdW50KHBBcmd1bWVudHMsIEZBTFNFKTsNCi19DQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VJbXAocEFyZ3VtZW50cywgVFJVRSk7DQotfQ0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VJbXAoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cywgRlhfQk9PTCBiQWJzUGFnZSkNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCAhPSAxKSB7DQotICAgICAgICBjb25zdCBGWF9XQ0hBUiogbWV0aG9kTmFtZTsNCi0gICAgICAgIGlmIChiQWJzUGFnZSkgew0KLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBMImFic1BhZ2UiOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtZXRob2ROYW1lID0gTCJwYWdlIjsNCi0gICAgICAgIH0NCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIG1ldGhvZE5hbWUpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KLSAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQotICAgICAgICBwTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlQYWdlID0gMDsNCi0gICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9ICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KLSAgICBpZiAoIXBOb2RlICYmIGhWYWx1ZSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlKTsNCi0gICAgfQ0KLSAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCi0gICAgaWYgKCFwRG9jTGF5b3V0KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IHBEb2NMYXlvdXQtPkdldExheW91dEl0ZW0ocE5vZGUpOw0KLSAgICBpZiAoIXBMYXlvdXRJdGVtKSB7DQotICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgLTEpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGlQYWdlID0gcExheW91dEl0ZW0tPkdldEZpcnN0KCktPkdldFBhZ2UoKS0+R2V0UGFnZUluZGV4KCk7DQotICAgIGlmIChoVmFsdWUpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBiQWJzUGFnZSA/IGlQYWdlIDogaVBhZ2UgKyAxKTsNCi0gICAgfQ0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBtZXRob2ROYW1lKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgfQ0KKyAgaW50MzJfdCBpUGFnZSA9IDA7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmICghcE5vZGUgJiYgaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpUGFnZSk7DQorICB9DQorICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgIGlmICghcERvY0xheW91dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gcERvY0xheW91dC0+R2V0TGF5b3V0SXRlbShwTm9kZSk7DQorICBpZiAoIXBMYXlvdXRJdGVtKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCAtMSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlQYWdlID0gcExheW91dEl0ZW0tPkdldEZpcnN0KCktPkdldFBhZ2UoKS0+R2V0UGFnZUluZGV4KCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBiQWJzUGFnZSA/IGlQYWdlIDogaVBhZ2UgKyAxKTsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oCmluZGV4IGQ1ZWU1N2YuLjhhMzg4YmUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmgKQEAgLTcsNDIgKzcsNTIgQEAKICNpZm5kZWYgX1NDUklQVF9MQVlPVVRQU0VVRE9NT0RFTF9IXw0KICNkZWZpbmUgX1NDUklQVF9MQVlPVVRQU0VVRE9NT0RFTF9IXw0KIGVudW0gWEZBX0xBWU9VVE1PREVMX0hXWFkgew0KLSAgICBYRkFfTEFZT1VUTU9ERUxfSCwNCi0gICAgWEZBX0xBWU9VVE1PREVMX1csDQotICAgIFhGQV9MQVlPVVRNT0RFTF9YLA0KLSAgICBYRkFfTEFZT1VUTU9ERUxfWQ0KKyAgWEZBX0xBWU9VVE1PREVMX0gsDQorICBYRkFfTEFZT1VUTU9ERUxfVywNCisgIFhGQV9MQVlPVVRNT0RFTF9YLA0KKyAgWEZBX0xBWU9VVE1PREVMX1kNCiB9Ow0KLWNsYXNzIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdA0KLXsNCi1wdWJsaWM6DQotICAgIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCi0gICAgfkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwoKTsNCitjbGFzcyBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsIDogcHVibGljIENYRkFfT3JkaW5hcnlPYmplY3Qgew0KKyBwdWJsaWM6DQorICBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQorICB+Q1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbCgpOw0KIA0KLSAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWFkeShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUmVhZHkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KIA0KLSAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9IV1hZIGxheW91dE1vZGVsKTsNCi0gICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfSChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfVyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfWChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfWShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfTnVtYmVyZWRQYWdlQ291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cywgRlhfQk9PTCBiTnVtYmVyZWQpOw0KLSAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlQ291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VTcGFuKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlQ29udGVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUNvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldENvdW50SW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUmVsYXlvdXQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VTcGFuKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlSW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUmVsYXlvdXRQYWdlQXJlYShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRDb3VudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHZvaWQJU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0dldE9iakFycmF5KElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0LCBpbnQzMl90IGlQYWdlTm8sIGNvbnN0IENGWF9XaWRlU3RyaW5nICZ3c1R5cGUsIEZYX0JPT0wgYk9uUGFnZUFyZWEsIENYRkFfTm9kZUFycmF5ICZyZXRBcnJheSk7DQotICAgIHZvaWQJU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VJbXAoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cywgRlhfQk9PTCBiQWJzUGFnZSk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRNT0RFTF9IV1hZIGxheW91dE1vZGVsKTsNCisgIHZvaWQgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9XKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfWChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1koQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9OdW1iZXJlZFBhZ2VDb3VudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTnVtYmVyZWQpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUNvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZVNwYW4oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUNvbnRlbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnRJbkJhdGNoKA0KKyAgICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRDb3VudEluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWxheW91dChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VTcGFuKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldEluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlbGF5b3V0UGFnZUFyZWEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldENvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfR2V0T2JqQXJyYXkoSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYWdlTm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25QYWdlQXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5JiByZXRBcnJheSk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlSW1wKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFic1BhZ2UpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmNwcAppbmRleCA5YTQ0MDZmLi5iZGI4YzBiIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmNwcApAQCAtMTgsMjUgKzE4LDE3IEBACiAjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KICNpbmNsdWRlICJ4ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgiDQogQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6Q1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQotICAgIDogQ1hGQV9PcmRpbmFyeU9iamVjdChwRG9jdW1lbnQsIFhGQV9FTEVNRU5UX0xvZ1BzZXVkb01vZGVsKQ0KLXsNCi0gICAgbV91U2NyaXB0SGFzaCA9IFhGQV9IQVNIQ09ERV9Mb2c7DQorICAgIDogQ1hGQV9PcmRpbmFyeU9iamVjdChwRG9jdW1lbnQsIFhGQV9FTEVNRU5UX0xvZ1BzZXVkb01vZGVsKSB7DQorICBtX3VTY3JpcHRIYXNoID0gWEZBX0hBU0hDT0RFX0xvZzsNCiB9DQotQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6fkNTY3JpcHRfTG9nUHNldWRvTW9kZWwoKQ0KLXsNCi19DQotdm9pZCBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfTWVzc2FnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi19DQotdm9pZCBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VFbmFibGVkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLX0NCi12b2lkIENTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZUFjdGl2YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLX0NCi12b2lkIENTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZURlYWN0aXZhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotfQ0KLXZvaWQgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLX0NCitDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjp+Q1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbCgpIHt9DQordm9pZCBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfTWVzc2FnZSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykge30NCit2b2lkIENTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZUVuYWJsZWQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9DQordm9pZCBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VBY3RpdmF0ZSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykge30NCit2b2lkIENTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZURlYWN0aXZhdGUoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9DQordm9pZCBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2UoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5oCmluZGV4IDU2MTZmMTAuLjgwNTUxNmUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbG9ncHNldWRvbW9kZWwuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgKQEAgLTYsMTYgKzYsMTUgQEAKIA0KICNpZm5kZWYgX1NDUklQVF9MT0dQU0VVRE9NT0RFTF9IXw0KICNkZWZpbmUgX1NDUklQVF9MT0dQU0VVRE9NT0RFTF9IXw0KLWNsYXNzIENTY3JpcHRfTG9nUHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdA0KLXsNCi1wdWJsaWM6DQotICAgIENTY3JpcHRfTG9nUHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCi0gICAgdmlydHVhbAl+Q1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbCgpOw0KK2NsYXNzIENTY3JpcHRfTG9nUHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdCB7DQorIHB1YmxpYzoNCisgIENTY3JpcHRfTG9nUHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIHZpcnR1YWwgfkNTY3JpcHRfTG9nUHNldWRvTW9kZWwoKTsNCiANCi0gICAgdm9pZAlTY3JpcHRfTG9nUHNldWRvTW9kZWxfTWVzc2FnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCi0gICAgdm9pZAlTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VFbmFibGVkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZUFjdGl2YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZURlYWN0aXZhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTG9nUHNldWRvTW9kZWxfTWVzc2FnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlRW5hYmxlZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlQWN0aXZhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZURlYWN0aXZhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbm9kZWhlbHBlci5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X25vZGVoZWxwZXIuY3BwCmluZGV4IGExNTYyYTAuLjQ0ZWI2OTggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbm9kZWhlbHBlci5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ub2RlaGVscGVyLmNwcApAQCAtMTksMzc1ICsxOSw0MTUgQEAKICNpbmNsdWRlICJ4ZmFfc2NyaXB0X25vZGVoZWxwZXIuaCINCiAjaW5jbHVkZSAieGZhX3NjcmlwdF9pbXAuaCINCiBDWEZBX05vZGVIZWxwZXI6OkNYRkFfTm9kZUhlbHBlcih2b2lkKQ0KLSAgICA6IG1fZUxhc3RDcmVhdGVUeXBlKFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSksIG1fcENyZWF0ZVBhcmVudChOVUxMKQ0KLSAgICAsIG1faUNyZWF0ZUNvdW50KDApLCBtX2lDcmVhdGVGbGFnKFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU9uZSkNCi0gICAgLCBtX2lDdXJBbGxTdGFydCgtMSksIG1fcEFsbFN0YXJ0UGFyZW50KE5VTEwpDQotew0KKyAgICA6IG1fZUxhc3RDcmVhdGVUeXBlKFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSksDQorICAgICAgbV9wQ3JlYXRlUGFyZW50KE5VTEwpLA0KKyAgICAgIG1faUNyZWF0ZUNvdW50KDApLA0KKyAgICAgIG1faUNyZWF0ZUZsYWcoWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlT25lKSwNCisgICAgICBtX2lDdXJBbGxTdGFydCgtMSksDQorICAgICAgbV9wQWxsU3RhcnRQYXJlbnQoTlVMTCkge30NCitDWEZBX05vZGVIZWxwZXI6On5DWEZBX05vZGVIZWxwZXIodm9pZCkge30NCitDWEZBX05vZGUqIENYRkFfTm9kZUhlbHBlcjo6WEZBX1Jlc29sdmVOb2Rlc19HZXRPbmVDaGlsZCgNCisgICAgQ1hGQV9Ob2RlKiBwYXJlbnQsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwd3NOYW1lLA0KKyAgICBGWF9CT09MIGJJc0NsYXNzTmFtZSkgew0KKyAgaWYgKHBhcmVudCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlQXJyYXkgc2libGluZ3M7DQorICB1aW50MzJfdCB1TmFtZUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhwd3NOYW1lLCBGWFNZU193Y3NsZW4ocHdzTmFtZSkpOw0KKyAgWEZBX05vZGVBY2NfVHJhdmVyc2VBbnlTaWJsaW5ncyhwYXJlbnQsIHVOYW1lSGFzaCwgJnNpYmxpbmdzLCBiSXNDbGFzc05hbWUpOw0KKyAgaWYgKHNpYmxpbmdzLkdldFNpemUoKSA9PSAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHNpYmxpbmdzWzBdOw0KIH0NCi1DWEZBX05vZGVIZWxwZXI6On5DWEZBX05vZGVIZWxwZXIodm9pZCkNCi17DQoraW50MzJfdCBDWEZBX05vZGVIZWxwZXI6OlhGQV9Db3VudFNpYmxpbmdzKENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5KiBwU2libGluZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzQ2xhc3NOYW1lKSB7DQorICBDWEZBX05vZGUqIHBhcmVudCA9DQorICAgICAgWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocE5vZGUsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCisgIGlmIChwYXJlbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydCA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudCgNCisgICAgICBwYXJlbnQtPkdldENsYXNzSUQoKSwgcE5vZGUtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCisgIGlmICghcFByb3BlcnQgJiYgZUxvZ2ljVHlwZSA9PSBYRkFfTE9HSUNfVHJhbnNwYXJlbnQpIHsNCisgICAgcGFyZW50ID0gWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocE5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCk7DQorICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICB9DQorICBpZiAoYklzQ2xhc3NOYW1lKSB7DQorICAgIHJldHVybiBYRkFfTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKHBhcmVudCwgcE5vZGUtPkdldENsYXNzSGFzaENvZGUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpYmxpbmdzLCBlTG9naWNUeXBlLCBiSXNDbGFzc05hbWUpOw0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIFhGQV9Ob2RlQWNjX1RyYXZlcnNlU2libGluZ3MocGFyZW50LCBwTm9kZS0+R2V0TmFtZUhhc2goKSwgcFNpYmxpbmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTG9naWNUeXBlLCBiSXNDbGFzc05hbWUpOw0KKyAgfQ0KIH0NCi1DWEZBX05vZGUqICBDWEZBX05vZGVIZWxwZXI6OlhGQV9SZXNvbHZlTm9kZXNfR2V0T25lQ2hpbGQoQ1hGQV9Ob2RlKiBwYXJlbnQsIGNvbnN0IEZYX1dDSEFSKiBwd3NOYW1lLCBGWF9CT09MIGJJc0NsYXNzTmFtZSkNCi17DQotICAgIGlmKHBhcmVudCA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDWEZBX05vZGVBcnJheSBzaWJsaW5nczsNCi0gICAgdWludDMyX3QgdU5hbWVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHdzTmFtZSwgRlhTWVNfd2NzbGVuKHB3c05hbWUpKTsNCi0gICAgWEZBX05vZGVBY2NfVHJhdmVyc2VBbnlTaWJsaW5ncyhwYXJlbnQsIHVOYW1lSGFzaCwgJnNpYmxpbmdzLCBiSXNDbGFzc05hbWUpOw0KLSAgICBpZiAoc2libGluZ3MuR2V0U2l6ZSgpID09IDApIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIHJldHVybiBzaWJsaW5nc1swXTsNCi19DQotaW50MzJfdCAgQ1hGQV9Ob2RlSGVscGVyOjpYRkFfQ291bnRTaWJsaW5ncyhDWEZBX05vZGUqIHBOb2RlLCBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlLCBDWEZBX05vZGVBcnJheSAqcFNpYmxpbmdzLCBGWF9CT09MIGJJc0NsYXNzTmFtZSkNCi17DQotICAgIENYRkFfTm9kZSogcGFyZW50ID0gWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocE5vZGUsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCi0gICAgaWYocGFyZW50ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydCA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChwYXJlbnQtPkdldENsYXNzSUQoKSwgcE5vZGUtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCi0gICAgaWYoIXBQcm9wZXJ0ICYmIGVMb2dpY1R5cGUgPT0gWEZBX0xPR0lDX1RyYW5zcGFyZW50KSB7DQotICAgICAgICBwYXJlbnQgPSBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudChwTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50KTsNCi0gICAgICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmKGJJc0NsYXNzTmFtZSkgew0KLSAgICAgICAgcmV0dXJuIFhGQV9Ob2RlQWNjX1RyYXZlcnNlU2libGluZ3MocGFyZW50LCBwTm9kZS0+R2V0Q2xhc3NIYXNoQ29kZSgpLCBwU2libGluZ3MsIGVMb2dpY1R5cGUsIGJJc0NsYXNzTmFtZSk7DQoraW50MzJfdCBDWEZBX05vZGVIZWxwZXI6OlhGQV9Ob2RlQWNjX1RyYXZlcnNlQW55U2libGluZ3MoDQorICAgIENYRkFfTm9kZSogcGFyZW50LA0KKyAgICBGWF9EV09SRCBkTmFtZUhhc2gsDQorICAgIENYRkFfTm9kZUFycmF5KiBwU2libGluZ3MsDQorICAgIEZYX0JPT0wgYklzQ2xhc3NOYW1lKSB7DQorICBpZiAocGFyZW50ID09IE5VTEwgfHwgcFNpYmxpbmdzID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IG5Db3VudCA9IDA7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgQ1hGQV9Ob2RlQXJyYXkgcHJvcGVydGllczsNCisgIHBhcmVudC0+R2V0Tm9kZUxpc3QocHJvcGVydGllcywgWEZBX05PREVGSUxURVJfUHJvcGVydGllcyk7DQorICBpbnQzMl90IG5Qcm9wZXJ0aWVzID0gcHJvcGVydGllcy5HZXRTaXplKCk7DQorICBmb3IgKGkgPSAwOyBpIDwgblByb3BlcnRpZXM7ICsraSkgew0KKyAgICBDWEZBX05vZGUqIGNoaWxkID0gcHJvcGVydGllc1tpXTsNCisgICAgaWYgKGJJc0NsYXNzTmFtZSkgew0KKyAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IGROYW1lSGFzaCkgew0KKyAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KKyAgICAgICAgbkNvdW50Kys7DQorICAgICAgfQ0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuICBYRkFfTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKHBhcmVudCwgcE5vZGUtPkdldE5hbWVIYXNoKCksIHBTaWJsaW5ncywgZUxvZ2ljVHlwZSwgYklzQ2xhc3NOYW1lKTsNCisgICAgICBpZiAoY2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gZE5hbWVIYXNoKSB7DQorICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQorICAgICAgICBuQ291bnQrKzsNCisgICAgICB9DQogICAgIH0NCisgICAgaWYgKG5Db3VudCA+IDApIHsNCisgICAgICByZXR1cm4gbkNvdW50Ow0KKyAgICB9DQorICAgIG5Db3VudCArPSBYRkFfTm9kZUFjY19UcmF2ZXJzZUFueVNpYmxpbmdzKGNoaWxkLCBkTmFtZUhhc2gsIHBTaWJsaW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklzQ2xhc3NOYW1lKTsNCisgIH0NCisgIENYRkFfTm9kZUFycmF5IGNoaWxkcmVuOw0KKyAgcGFyZW50LT5HZXROb2RlTGlzdChjaGlsZHJlbiwgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4pOw0KKyAgaW50MzJfdCBuQ2hpbGRyZW4gPSBjaGlsZHJlbi5HZXRTaXplKCk7DQorICBmb3IgKGkgPSAwOyBpIDwgbkNoaWxkcmVuOyBpKyspIHsNCisgICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KKyAgICBpZiAoYklzQ2xhc3NOYW1lKSB7DQorICAgICAgaWYgKGNoaWxkLT5HZXRDbGFzc0hhc2hDb2RlKCkgPT0gZE5hbWVIYXNoKSB7DQorICAgICAgICBpZiAocFNpYmxpbmdzKSB7DQorICAgICAgICAgIHBTaWJsaW5ncy0+QWRkKGNoaWxkKTsNCisgICAgICAgIH0NCisgICAgICAgIG5Db3VudCsrOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoY2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gZE5hbWVIYXNoKSB7DQorICAgICAgICBpZiAocFNpYmxpbmdzKSB7DQorICAgICAgICAgIHBTaWJsaW5ncy0+QWRkKGNoaWxkKTsNCisgICAgICAgIH0NCisgICAgICAgIG5Db3VudCsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobkNvdW50ID4gMCkgew0KKyAgICAgIHJldHVybiBuQ291bnQ7DQorICAgIH0NCisgICAgbkNvdW50ICs9IFhGQV9Ob2RlQWNjX1RyYXZlcnNlQW55U2libGluZ3MoY2hpbGQsIGROYW1lSGFzaCwgcFNpYmxpbmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXNDbGFzc05hbWUpOw0KKyAgfQ0KKyAgcmV0dXJuIG5Db3VudDsNCiB9DQotaW50MzJfdCBDWEZBX05vZGVIZWxwZXI6OlhGQV9Ob2RlQWNjX1RyYXZlcnNlQW55U2libGluZ3MoQ1hGQV9Ob2RlKiBwYXJlbnQsIEZYX0RXT1JEIGROYW1lSGFzaCwgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywgRlhfQk9PTCBiSXNDbGFzc05hbWUgKQ0KLXsNCi0gICAgaWYocGFyZW50ID09IE5VTEwgfHwgcFNpYmxpbmdzID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIGludDMyX3QgbkNvdW50ID0gMDsNCi0gICAgaW50MzJfdCBpID0gMDsNCitpbnQzMl90IENYRkFfTm9kZUhlbHBlcjo6WEZBX05vZGVBY2NfVHJhdmVyc2VTaWJsaW5ncyhDWEZBX05vZGUqIHBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkTmFtZUhhc2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzQ2xhc3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzRmluZFByb3BlcnR5KSB7DQorICBpZiAocGFyZW50ID09IE5VTEwgfHwgcFNpYmxpbmdzID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IG5Db3VudCA9IDA7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaWYgKGJJc0ZpbmRQcm9wZXJ0eSkgew0KICAgICBDWEZBX05vZGVBcnJheSBwcm9wZXJ0aWVzOw0KICAgICBwYXJlbnQtPkdldE5vZGVMaXN0KHByb3BlcnRpZXMsIFhGQV9OT0RFRklMVEVSX1Byb3BlcnRpZXMpOw0KICAgICBpbnQzMl90IG5Qcm9wZXJ0aWVzID0gcHJvcGVydGllcy5HZXRTaXplKCk7DQogICAgIGZvciAoaSA9IDA7IGkgPCBuUHJvcGVydGllczsgKytpKSB7DQotICAgICAgICBDWEZBX05vZGUqIGNoaWxkID0gcHJvcGVydGllc1tpXTsNCi0gICAgICAgIGlmKGJJc0NsYXNzTmFtZSkgew0KLSAgICAgICAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IGROYW1lSGFzaCkgew0KLSAgICAgICAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQotICAgICAgICAgICAgICAgIG5Db3VudCArKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChjaGlsZC0+R2V0TmFtZUhhc2goKSA9PSBkTmFtZUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KLSAgICAgICAgICAgICAgICBuQ291bnQgKys7DQotICAgICAgICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogY2hpbGQgPSBwcm9wZXJ0aWVzW2ldOw0KKyAgICAgIGlmIChiSXNDbGFzc05hbWUpIHsNCisgICAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IGROYW1lSGFzaCkgew0KKyAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQorICAgICAgICAgIG5Db3VudCsrOw0KICAgICAgICAgfQ0KLSAgICAgICAgaWYobkNvdW50ID4gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBuQ291bnQ7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChjaGlsZC0+R2V0TmFtZUhhc2goKSA9PSBkTmFtZUhhc2gpIHsNCisgICAgICAgICAgaWYgKGNoaWxkLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZVNldCAmJg0KKyAgICAgICAgICAgICAgY2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9FeHRyYXMgJiYNCisgICAgICAgICAgICAgIGNoaWxkLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCisgICAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQorICAgICAgICAgICAgbkNvdW50Kys7DQorICAgICAgICAgIH0NCiAgICAgICAgIH0NCi0gICAgICAgIG5Db3VudCArPSBYRkFfTm9kZUFjY19UcmF2ZXJzZUFueVNpYmxpbmdzKGNoaWxkLCBkTmFtZUhhc2gsIHBTaWJsaW5ncywgYklzQ2xhc3NOYW1lKTsNCisgICAgICB9DQorICAgICAgaWYgKGNoaWxkLT5Jc1VubmFtZWQoKSAmJiBjaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICAgIG5Db3VudCArPSBYRkFfTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKGNoaWxkLCBkTmFtZUhhc2gsIHBTaWJsaW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMb2dpY1R5cGUsIGJJc0NsYXNzTmFtZSwgRkFMU0UpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBDWEZBX05vZGVBcnJheSBjaGlsZHJlbjsNCi0gICAgcGFyZW50LT5HZXROb2RlTGlzdChjaGlsZHJlbiwgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4pOw0KLSAgICBpbnQzMl90IG5DaGlsZHJlbiA9IGNoaWxkcmVuLkdldFNpemUoKTsNCi0gICAgZm9yIChpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSArKykgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KLSAgICAgICAgaWYoYklzQ2xhc3NOYW1lKSB7DQotICAgICAgICAgICAgaWYgKGNoaWxkLT5HZXRDbGFzc0hhc2hDb2RlKCkgPT0gZE5hbWVIYXNoKSB7DQotICAgICAgICAgICAgICAgIGlmIChwU2libGluZ3MpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBTaWJsaW5ncy0+QWRkKGNoaWxkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBuQ291bnQgKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoY2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gZE5hbWVIYXNoKSB7DQotICAgICAgICAgICAgICAgIGlmIChwU2libGluZ3MpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBTaWJsaW5ncy0+QWRkKGNoaWxkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBuQ291bnQgKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYobkNvdW50ID4gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBuQ291bnQ7DQotICAgICAgICB9DQotICAgICAgICBuQ291bnQgKz0gWEZBX05vZGVBY2NfVHJhdmVyc2VBbnlTaWJsaW5ncyhjaGlsZCwgZE5hbWVIYXNoLCBwU2libGluZ3MsIGJJc0NsYXNzTmFtZSk7DQorICAgIGlmIChuQ291bnQgPiAwKSB7DQorICAgICAgcmV0dXJuIG5Db3VudDsNCiAgICAgfQ0KLSAgICByZXR1cm4gbkNvdW50Ow0KLX0NCi1pbnQzMl90ICBDWEZBX05vZGVIZWxwZXI6OlhGQV9Ob2RlQWNjX1RyYXZlcnNlU2libGluZ3MoQ1hGQV9Ob2RlKiBwYXJlbnQsIEZYX0RXT1JEIGROYW1lSGFzaCwgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSwgRlhfQk9PTCBiSXNDbGFzc05hbWUsIEZYX0JPT0wgYklzRmluZFByb3BlcnR5KQ0KLXsNCi0gICAgaWYgKHBhcmVudCA9PSBOVUxMIHx8IHBTaWJsaW5ncyA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gMDsNCisgIH0NCisgIENYRkFfTm9kZUFycmF5IGNoaWxkcmVuOw0KKyAgcGFyZW50LT5HZXROb2RlTGlzdChjaGlsZHJlbiwgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4pOw0KKyAgaW50MzJfdCBuQ2hpbGRyZW4gPSBjaGlsZHJlbi5HZXRTaXplKCk7DQorICBmb3IgKGkgPSAwOyBpIDwgbkNoaWxkcmVuOyBpKyspIHsNCisgICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KKyAgICBpZiAoY2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCisgICAgICBjb250aW51ZTsNCiAgICAgfQ0KLSAgICBpbnQzMl90IG5Db3VudCA9IDA7DQotICAgIGludDMyX3QgaSA9IDA7DQotICAgIGlmKGJJc0ZpbmRQcm9wZXJ0eSkgew0KLSAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgcHJvcGVydGllczsNCi0gICAgICAgIHBhcmVudC0+R2V0Tm9kZUxpc3QocHJvcGVydGllcywgWEZBX05PREVGSUxURVJfUHJvcGVydGllcyk7DQotICAgICAgICBpbnQzMl90IG5Qcm9wZXJ0aWVzID0gcHJvcGVydGllcy5HZXRTaXplKCk7DQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgblByb3BlcnRpZXM7ICsraSkgew0KLSAgICAgICAgICAgIENYRkFfTm9kZSogY2hpbGQgPSBwcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIGlmKGJJc0NsYXNzTmFtZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSBkTmFtZUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBTaWJsaW5ncy0+QWRkKGNoaWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIG5Db3VudCArKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+R2V0TmFtZUhhc2goKSA9PSBkTmFtZUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZVNldCAmJiBjaGlsZC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0V4dHJhcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjaGlsZC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5Db3VudCArKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoY2hpbGQtPklzVW5uYW1lZCgpICYmIGNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KLSAgICAgICAgICAgICAgICBuQ291bnQgKz0gWEZBX05vZGVBY2NfVHJhdmVyc2VTaWJsaW5ncyhjaGlsZCwgZE5hbWVIYXNoLCBwU2libGluZ3MsIGVMb2dpY1R5cGUsIGJJc0NsYXNzTmFtZSwgRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCisgICAgaWYgKGJJc0NsYXNzTmFtZSkgew0KKyAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IGROYW1lSGFzaCkgew0KKyAgICAgICAgaWYgKHBTaWJsaW5ncykgew0KKyAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQogICAgICAgICB9DQotICAgICAgICBpZihuQ291bnQgPiAwKSB7DQotICAgICAgICAgICAgcmV0dXJuIG5Db3VudDsNCisgICAgICAgIG5Db3VudCsrOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoY2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gZE5hbWVIYXNoKSB7DQorICAgICAgICBpZiAocFNpYmxpbmdzKSB7DQorICAgICAgICAgIHBTaWJsaW5ncy0+QWRkKGNoaWxkKTsNCiAgICAgICAgIH0NCi0gICAgfQ0KLSAgICBDWEZBX05vZGVBcnJheSBjaGlsZHJlbjsNCi0gICAgcGFyZW50LT5HZXROb2RlTGlzdChjaGlsZHJlbiwgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4pOw0KLSAgICBpbnQzMl90IG5DaGlsZHJlbiA9IGNoaWxkcmVuLkdldFNpemUoKTsNCi0gICAgZm9yIChpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSArKykgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KLSAgICAgICAgaWYoY2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGJJc0NsYXNzTmFtZSkgew0KLSAgICAgICAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IGROYW1lSGFzaCkgew0KLSAgICAgICAgICAgICAgICBpZiAocFNpYmxpbmdzKSB7DQotICAgICAgICAgICAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbkNvdW50ICsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IGROYW1lSGFzaCkgew0KLSAgICAgICAgICAgICAgICBpZiAocFNpYmxpbmdzKSB7DQotICAgICAgICAgICAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbkNvdW50ICsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChlTG9naWNUeXBlID09IFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoWEZBX05vZGVJc1RyYW5zcGFyZW50KGNoaWxkKSAmJiBjaGlsZC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCi0gICAgICAgICAgICBuQ291bnQgKz0gWEZBX05vZGVBY2NfVHJhdmVyc2VTaWJsaW5ncyhjaGlsZCwgZE5hbWVIYXNoLCBwU2libGluZ3MsIGVMb2dpY1R5cGUsIGJJc0NsYXNzTmFtZSwgRkFMU0UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBuQ291bnQ7DQotfQ0KLUNYRkFfTm9kZSogIENYRkFfTm9kZUhlbHBlcjo6WEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwTm9kZSwgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSkNCi17DQotICAgIGlmICghcE5vZGUpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgbkNvdW50Kys7DQorICAgICAgfQ0KICAgICB9DQogICAgIGlmIChlTG9naWNUeXBlID09IFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KSB7DQotICAgICAgICByZXR1cm4gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgIGNvbnRpbnVlOw0KICAgICB9DQotICAgIENYRkFfTm9kZSogcGFyZW50Ow0KLSAgICBDWEZBX05vZGUqIG5vZGUgPSBwTm9kZTsNCi0gICAgd2hpbGUgKFRSVUUpIHsNCi0gICAgICAgIHBhcmVudCA9IFhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KG5vZGUpOw0KLSAgICAgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBYRkFfRUxFTUVOVCBwYXJlbnRFbGVtZW50ID0gcGFyZW50LT5HZXRDbGFzc0lEKCk7DQotICAgICAgICBpZiAoKCFwYXJlbnQtPklzVW5uYW1lZCgpICYmIHBhcmVudEVsZW1lbnQgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkgfHwgcGFyZW50RWxlbWVudCA9PSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIG5vZGUgPSBwYXJlbnQ7DQorICAgIGlmIChYRkFfTm9kZUlzVHJhbnNwYXJlbnQoY2hpbGQpICYmDQorICAgICAgICBjaGlsZC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICBuQ291bnQgKz0gWEZBX05vZGVBY2NfVHJhdmVyc2VTaWJsaW5ncyhjaGlsZCwgZE5hbWVIYXNoLCBwU2libGluZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxvZ2ljVHlwZSwgYklzQ2xhc3NOYW1lLCBGQUxTRSk7DQogICAgIH0NCi0gICAgcmV0dXJuIHBhcmVudDsNCisgIH0NCisgIHJldHVybiBuQ291bnQ7DQogfQ0KLWludDMyX3QgIENYRkFfTm9kZUhlbHBlcjo6WEZBX0dldEluZGV4KENYRkFfTm9kZSogcE5vZGUsIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsIEZYX0JPT0wgYklzUHJvcGVydHkgLCBGWF9CT09MIGJJc0NsYXNzSW5kZXggKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwYXJlbnQgPSBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudChwTm9kZSwgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KLSAgICBpZihwYXJlbnQgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGVIZWxwZXI6OlhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KA0KKyAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlKSB7DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKGVMb2dpY1R5cGUgPT0gWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpIHsNCisgICAgcmV0dXJuIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIH0NCisgIENYRkFfTm9kZSogcGFyZW50Ow0KKyAgQ1hGQV9Ob2RlKiBub2RlID0gcE5vZGU7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBwYXJlbnQgPSBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudChub2RlKTsNCisgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7DQorICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYoIWJJc1Byb3BlcnR5ICYmIGVMb2dpY1R5cGUgPT0gWEZBX0xPR0lDX1RyYW5zcGFyZW50KSB7DQotICAgICAgICBwYXJlbnQgPSBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudChwTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50KTsNCi0gICAgICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KKyAgICBYRkFfRUxFTUVOVCBwYXJlbnRFbGVtZW50ID0gcGFyZW50LT5HZXRDbGFzc0lEKCk7DQorICAgIGlmICgoIXBhcmVudC0+SXNVbm5hbWVkKCkgJiYgcGFyZW50RWxlbWVudCAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0KSB8fA0KKyAgICAgICAgcGFyZW50RWxlbWVudCA9PSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBGWF9EV09SRCBkd0hhc2hOYW1lID0gcE5vZGUtPkdldE5hbWVIYXNoKCk7DQotICAgIGlmKGJJc0NsYXNzSW5kZXgpIHsNCi0gICAgICAgIGR3SGFzaE5hbWUgPSBwTm9kZS0+R2V0Q2xhc3NIYXNoQ29kZSgpOw0KLSAgICB9DQotICAgIENYRkFfTm9kZUFycmF5IHNpYmxpbmdzOw0KLSAgICBpbnQzMl90IGlTaXplID0gWEZBX05vZGVBY2NfVHJhdmVyc2VTaWJsaW5ncyhwYXJlbnQsIGR3SGFzaE5hbWUsICZzaWJsaW5ncywgZUxvZ2ljVHlwZSwgYklzQ2xhc3NJbmRleCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsNCi0gICAgICAgIENYRkFfTm9kZSogY2hpbGQgPSBzaWJsaW5nc1tpXTsNCi0gICAgICAgIGlmIChjaGlsZCA9PSBwTm9kZSkgew0KLSAgICAgICAgICAgIHJldHVybiBpOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICAgIG5vZGUgPSBwYXJlbnQ7DQorICB9DQorICByZXR1cm4gcGFyZW50Ow0KK30NCitpbnQzMl90IENYRkFfTm9kZUhlbHBlcjo6WEZBX0dldEluZGV4KENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNQcm9wZXJ0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzQ2xhc3NJbmRleCkgew0KKyAgQ1hGQV9Ob2RlKiBwYXJlbnQgPQ0KKyAgICAgIFhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KHBOb2RlLCBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCk7DQorICBpZiAocGFyZW50ID09IE5VTEwpIHsNCiAgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAoIWJJc1Byb3BlcnR5ICYmIGVMb2dpY1R5cGUgPT0gWEZBX0xPR0lDX1RyYW5zcGFyZW50KSB7DQorICAgIHBhcmVudCA9IFhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KHBOb2RlLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQpOw0KKyAgICBpZiAocGFyZW50ID09IE5VTEwpIHsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdIYXNoTmFtZSA9IHBOb2RlLT5HZXROYW1lSGFzaCgpOw0KKyAgaWYgKGJJc0NsYXNzSW5kZXgpIHsNCisgICAgZHdIYXNoTmFtZSA9IHBOb2RlLT5HZXRDbGFzc0hhc2hDb2RlKCk7DQorICB9DQorICBDWEZBX05vZGVBcnJheSBzaWJsaW5nczsNCisgIGludDMyX3QgaVNpemUgPSBYRkFfTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKHBhcmVudCwgZHdIYXNoTmFtZSwgJnNpYmxpbmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxvZ2ljVHlwZSwgYklzQ2xhc3NJbmRleCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQorICAgIENYRkFfTm9kZSogY2hpbGQgPSBzaWJsaW5nc1tpXTsNCisgICAgaWYgKGNoaWxkID09IHBOb2RlKSB7DQorICAgICAgcmV0dXJuIGk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAwOw0KIH0NCi12b2lkIENYRkFfTm9kZUhlbHBlcjo6WEZBX0dldE5hbWVFeHByZXNzaW9uKENYRkFfTm9kZSogcmVmTm9kZSwgQ0ZYX1dpZGVTdHJpbmcgJndzTmFtZSwgRlhfQk9PTCBiSXNBbGxQYXRoLCBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlKQ0KLXsNCi0gICAgd3NOYW1lLkVtcHR5KCk7DQotICAgIGlmIChiSXNBbGxQYXRoKSB7DQotICAgICAgICBYRkFfR2V0TmFtZUV4cHJlc3Npb24ocmVmTm9kZSwgd3NOYW1lLCBGQUxTRSwgZUxvZ2ljVHlwZSk7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1BhcmVudDsNCi0gICAgICAgIENYRkFfTm9kZSogcGFyZW50ID0gWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocmVmTm9kZSwgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KLSAgICAgICAgd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7DQotICAgICAgICAgICAgWEZBX0dldE5hbWVFeHByZXNzaW9uKHBhcmVudCwgd3NQYXJlbnQsIEZBTFNFLCBlTG9naWNUeXBlKTsNCi0gICAgICAgICAgICB3c1BhcmVudCArPSBMIi4iOw0KLSAgICAgICAgICAgIHdzUGFyZW50ICs9IHdzTmFtZTsNCi0gICAgICAgICAgICB3c05hbWUgPSB3c1BhcmVudDsNCi0gICAgICAgICAgICBwYXJlbnQgPSBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudChwYXJlbnQsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1RhZ05hbWU7DQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3czsNCi0gICAgICAgIEZYX0JPT0wgYklzUHJvcGVydHkgPSBYRkFfTm9kZUlzUHJvcGVydHkocmVmTm9kZSk7DQotICAgICAgICBpZiAocmVmTm9kZS0+SXNVbm5hbWVkKCkgfHwgKGJJc1Byb3BlcnR5ICYmIHJlZk5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0KSkgew0KLSAgICAgICAgICAgIHJlZk5vZGUtPkdldENsYXNzTmFtZSh3c1RhZ05hbWUpOw0KLSAgICAgICAgICAgIHdzID0gd3NUYWdOYW1lOw0KLSAgICAgICAgICAgIHdzTmFtZS5Gb3JtYXQoTCIjJXNbJWRdIiwgKGNvbnN0IEZYX1dDSEFSKil3cywgWEZBX0dldEluZGV4KHJlZk5vZGUsIGVMb2dpY1R5cGUsIGJJc1Byb3BlcnR5LCBUUlVFKSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd3MgPSByZWZOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KLSAgICAgICAgd3MuUmVwbGFjZShMIi4iLCBMIlxcLiIpOw0KLSAgICAgICAgd3NOYW1lLkZvcm1hdChMIiVzWyVkXSIsIChjb25zdCBGWF9XQ0hBUiopd3MsIFhGQV9HZXRJbmRleChyZWZOb2RlLCBlTG9naWNUeXBlLCBiSXNQcm9wZXJ0eSwgRkFMU0UpKTsNCit2b2lkIENYRkFfTm9kZUhlbHBlcjo6WEZBX0dldE5hbWVFeHByZXNzaW9uKENYRkFfTm9kZSogcmVmTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0FsbFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlKSB7DQorICB3c05hbWUuRW1wdHkoKTsNCisgIGlmIChiSXNBbGxQYXRoKSB7DQorICAgIFhGQV9HZXROYW1lRXhwcmVzc2lvbihyZWZOb2RlLCB3c05hbWUsIEZBTFNFLCBlTG9naWNUeXBlKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXJlbnQ7DQorICAgIENYRkFfTm9kZSogcGFyZW50ID0NCisgICAgICAgIFhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KHJlZk5vZGUsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCisgICAgd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7DQorICAgICAgWEZBX0dldE5hbWVFeHByZXNzaW9uKHBhcmVudCwgd3NQYXJlbnQsIEZBTFNFLCBlTG9naWNUeXBlKTsNCisgICAgICB3c1BhcmVudCArPSBMIi4iOw0KKyAgICAgIHdzUGFyZW50ICs9IHdzTmFtZTsNCisgICAgICB3c05hbWUgPSB3c1BhcmVudDsNCisgICAgICBwYXJlbnQgPSBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudChwYXJlbnQsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCiAgICAgfQ0KKyAgICByZXR1cm47DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NUYWdOYW1lOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3czsNCisgICAgRlhfQk9PTCBiSXNQcm9wZXJ0eSA9IFhGQV9Ob2RlSXNQcm9wZXJ0eShyZWZOb2RlKTsNCisgICAgaWYgKHJlZk5vZGUtPklzVW5uYW1lZCgpIHx8DQorICAgICAgICAoYklzUHJvcGVydHkgJiYgcmVmTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VTZXQpKSB7DQorICAgICAgcmVmTm9kZS0+R2V0Q2xhc3NOYW1lKHdzVGFnTmFtZSk7DQorICAgICAgd3MgPSB3c1RhZ05hbWU7DQorICAgICAgd3NOYW1lLkZvcm1hdChMIiMlc1slZF0iLCAoY29uc3QgRlhfV0NIQVIqKXdzLA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX0dldEluZGV4KHJlZk5vZGUsIGVMb2dpY1R5cGUsIGJJc1Byb3BlcnR5LCBUUlVFKSk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHdzID0gcmVmTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCisgICAgd3MuUmVwbGFjZShMIi4iLCBMIlxcLiIpOw0KKyAgICB3c05hbWUuRm9ybWF0KEwiJXNbJWRdIiwgKGNvbnN0IEZYX1dDSEFSKil3cywNCisgICAgICAgICAgICAgICAgICBYRkFfR2V0SW5kZXgocmVmTm9kZSwgZUxvZ2ljVHlwZSwgYklzUHJvcGVydHksIEZBTFNFKSk7DQorICB9DQogfQ0KLUZYX0JPT0wJQ1hGQV9Ob2RlSGVscGVyOjpYRkFfTm9kZUlzVHJhbnNwYXJlbnQoQ1hGQV9Ob2RlKiByZWZOb2RlKQ0KLXsNCi0gICAgaWYocmVmTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgWEZBX0VMRU1FTlQgZVJlZk5vZGUgPSByZWZOb2RlLT5HZXRDbGFzc0lEKCk7DQotICAgIGlmKChyZWZOb2RlLT5Jc1VubmFtZWQoKSAmJiByZWZOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgfHwgZVJlZk5vZGUgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldA0KLSAgICAgICAgICAgIHx8IGVSZWZOb2RlID09IFhGQV9FTEVNRU5UX0FyZWEgfHwgZVJlZk5vZGUgPT0gWEZBX0VMRU1FTlRfUHJvdG8pIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQorRlhfQk9PTCBDWEZBX05vZGVIZWxwZXI6OlhGQV9Ob2RlSXNUcmFuc3BhcmVudChDWEZBX05vZGUqIHJlZk5vZGUpIHsNCisgIGlmIChyZWZOb2RlID09IE5VTEwpIHsNCiAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgWEZBX0VMRU1FTlQgZVJlZk5vZGUgPSByZWZOb2RlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoKHJlZk5vZGUtPklzVW5uYW1lZCgpICYmIHJlZk5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB8fA0KKyAgICAgIGVSZWZOb2RlID09IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQgfHwgZVJlZk5vZGUgPT0gWEZBX0VMRU1FTlRfQXJlYSB8fA0KKyAgICAgIGVSZWZOb2RlID09IFhGQV9FTEVNRU5UX1Byb3RvKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1GWF9CT09MIENYRkFfTm9kZUhlbHBlcjo6WEZBX0NyZWF0ZU5vZGVfRm9yQ29uZGl0aW9uKENGWF9XaWRlU3RyaW5nICYgd3NDb25kaXRpb24pDQotew0KLSAgICBpbnQzMl90IGlMZW4gPSB3c0NvbmRpdGlvbi5HZXRMZW5ndGgoKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NJbmRleCA9IEZYX1dTVFJDKEwiMCIpOzsNCi0gICAgRlhfQk9PTCBiQWxsID0gRkFMU0U7DQotICAgIGlmKGlMZW4gPT0gMCkgew0KLSAgICAgICAgbV9pQ3JlYXRlRmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU9uZTsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZih3c0NvbmRpdGlvbi5HZXRBdCgwKSA9PSAnWycpIHsNCi0gICAgICAgIGludDMyX3QgaSA9IDE7DQotICAgICAgICBmb3IgKDsgaSA8IGlMZW47ICsraSkgew0KLSAgICAgICAgICAgIEZYX1dDSEFSIGNoID0gd3NDb25kaXRpb25baV07DQotICAgICAgICAgICAgaWYgKGNoID09ICcgJykgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGNoID09ICcrJyB8fCBjaCA9PSAnLScpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKicpIHsNCi0gICAgICAgICAgICAgICAgYkFsbCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGJBbGwpIHsNCi0gICAgICAgICAgICB3c0luZGV4ID0gRlhfV1NUUkMoTCIxIik7DQotICAgICAgICAgICAgbV9pQ3JlYXRlRmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZUFsbDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbV9pQ3JlYXRlRmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU9uZTsNCi0gICAgICAgICAgICB3c0luZGV4ID0gd3NDb25kaXRpb24uTWlkKGksIGlMZW4gLSAxIC0gaSk7DQotICAgICAgICB9DQotICAgICAgICBpbnQzMl90IGlJbmRleCA9IHdzSW5kZXguR2V0SW50ZWdlcigpOw0KLSAgICAgICAgbV9pQ3JlYXRlQ291bnQgPSBpSW5kZXg7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlSGVscGVyOjpYRkFfQ3JlYXRlTm9kZV9Gb3JDb25kaXRpb24oDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c0NvbmRpdGlvbikgew0KKyAgaW50MzJfdCBpTGVuID0gd3NDb25kaXRpb24uR2V0TGVuZ3RoKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c0luZGV4ID0gRlhfV1NUUkMoTCIwIik7DQorICA7DQorICBGWF9CT09MIGJBbGwgPSBGQUxTRTsNCisgIGlmIChpTGVuID09IDApIHsNCisgICAgbV9pQ3JlYXRlRmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU9uZTsNCiAgICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1GWF9CT09MIENYRkFfTm9kZUhlbHBlcjo6WEZBX1Jlc29sdmVOb2Rlc19DcmVhdGVOb2RlKENGWF9XaWRlU3RyaW5nIHdzTmFtZSwgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sIEZYX0JPT0wgYkxhc3ROb2RlLCBDWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0KQ0KLXsNCi0gICAgaWYobV9wQ3JlYXRlUGFyZW50ID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICh3c0NvbmRpdGlvbi5HZXRBdCgwKSA9PSAnWycpIHsNCisgICAgaW50MzJfdCBpID0gMTsNCisgICAgZm9yICg7IGkgPCBpTGVuOyArK2kpIHsNCisgICAgICBGWF9XQ0hBUiBjaCA9IHdzQ29uZGl0aW9uW2ldOw0KKyAgICAgIGlmIChjaCA9PSAnICcpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoY2ggPT0gJysnIHx8IGNoID09ICctJykgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKicpIHsNCisgICAgICAgIGJBbGwgPSBUUlVFOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBGWF9CT09MIGJJc0NsYXNzTmFtZSA9IEZBTFNFOw0KLSAgICBGWF9CT09MIGJSZXN1bHQgPSBGQUxTRTsNCi0gICAgaWYod3NOYW1lLkdldEF0KDApID09ICchJykgew0KLSAgICAgICAgd3NOYW1lID0gd3NOYW1lLlJpZ2h0KHdzTmFtZS5HZXRMZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgbV9wQ3JlYXRlUGFyZW50ID0gIChDWEZBX05vZGUqKXBTY3JpcHRDb250ZXh0LT5HZXREb2N1bWVudCgpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhc2V0cyk7DQotICAgIH0NCi0gICAgaWYod3NOYW1lLkdldEF0KDApID09ICcjJykgew0KLSAgICAgICAgYklzQ2xhc3NOYW1lID0gVFJVRTsNCi0gICAgICAgIHdzTmFtZSA9IHdzTmFtZS5SaWdodCh3c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsNCi0gICAgfQ0KLSAgICBpZihtX2lDcmVhdGVDb3VudCA9PSAwKSB7DQotICAgICAgICBYRkFfQ3JlYXRlTm9kZV9Gb3JDb25kaXRpb24od3NDb25kaXRpb24pOw0KLSAgICB9DQotICAgIGlmKGJJc0NsYXNzTmFtZSkgew0KLSAgICAgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIGxwRWxlbWVudCA9IFhGQV9HZXRFbGVtZW50QnlOYW1lKHdzTmFtZSk7DQotICAgICAgICBpZihscEVsZW1lbnQgPT0gTlVMTCkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZvcihpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IG1faUNyZWF0ZUNvdW50OyBpSW5kZXggKyspIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0gbV9wQ3JlYXRlUGFyZW50LT5DcmVhdGVTYW1lUGFja2V0Tm9kZShscEVsZW1lbnQtPmVOYW1lKTsNCi0gICAgICAgICAgICBpZihwTmV3Tm9kZSkgew0KLSAgICAgICAgICAgICAgICBtX3BDcmVhdGVQYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlKTsNCi0gICAgICAgICAgICAgICAgaWYoaUluZGV4ID09IG1faUNyZWF0ZUNvdW50IC0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wQ3JlYXRlUGFyZW50ID0gcE5ld05vZGU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYlJlc3VsdCA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgICBpZiAoYkFsbCkgew0KKyAgICAgIHdzSW5kZXggPSBGWF9XU1RSQyhMIjEiKTsNCisgICAgICBtX2lDcmVhdGVGbGFnID0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlQWxsOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgWEZBX0VMRU1FTlQgZUNsYXNzVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFHcm91cDsNCi0gICAgICAgIGlmKGJMYXN0Tm9kZSkgew0KLSAgICAgICAgICAgIGVDbGFzc1R5cGUgPSBtX2VMYXN0Q3JlYXRlVHlwZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZvcihpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IG1faUNyZWF0ZUNvdW50OyBpSW5kZXggKyspIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0gbV9wQ3JlYXRlUGFyZW50LT5DcmVhdGVTYW1lUGFja2V0Tm9kZShlQ2xhc3NUeXBlKTsNCi0gICAgICAgICAgICBpZihwTmV3Tm9kZSkgew0KLSAgICAgICAgICAgICAgICBwTmV3Tm9kZS0+U2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCi0gICAgICAgICAgICAgICAgcE5ld05vZGUtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7DQotICAgICAgICAgICAgICAgIG1fcENyZWF0ZVBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld05vZGUpOw0KLSAgICAgICAgICAgICAgICBpZihpSW5kZXggPT0gbV9pQ3JlYXRlQ291bnQgLSAxKSB7DQotICAgICAgICAgICAgICAgICAgICBtX3BDcmVhdGVQYXJlbnQgPSBwTmV3Tm9kZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBiUmVzdWx0ID0gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQorICAgICAgbV9pQ3JlYXRlRmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU9uZTsNCisgICAgICB3c0luZGV4ID0gd3NDb25kaXRpb24uTWlkKGksIGlMZW4gLSAxIC0gaSk7DQogICAgIH0NCi0gICAgaWYoIWJSZXN1bHQpIHsNCi0gICAgICAgIG1fcENyZWF0ZVBhcmVudCA9IE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIGJSZXN1bHQ7DQorICAgIGludDMyX3QgaUluZGV4ID0gd3NJbmRleC5HZXRJbnRlZ2VyKCk7DQorICAgIG1faUNyZWF0ZUNvdW50ID0gaUluZGV4Ow0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotdm9pZCBDWEZBX05vZGVIZWxwZXI6OlhGQV9TZXRDcmVhdGVOb2RlVHlwZShDWEZBX05vZGUqIHJlZk5vZGUpDQotew0KLSAgICBpZihyZWZOb2RlID09IE5VTEwpIHsNCi0gICAgICAgIHJldHVybjsNCitGWF9CT09MIENYRkFfTm9kZUhlbHBlcjo6WEZBX1Jlc29sdmVOb2Rlc19DcmVhdGVOb2RlKA0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUsDQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uLA0KKyAgICBGWF9CT09MIGJMYXN0Tm9kZSwNCisgICAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCkgew0KKyAgaWYgKG1fcENyZWF0ZVBhcmVudCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0JPT0wgYklzQ2xhc3NOYW1lID0gRkFMU0U7DQorICBGWF9CT09MIGJSZXN1bHQgPSBGQUxTRTsNCisgIGlmICh3c05hbWUuR2V0QXQoMCkgPT0gJyEnKSB7DQorICAgIHdzTmFtZSA9IHdzTmFtZS5SaWdodCh3c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsNCisgICAgbV9wQ3JlYXRlUGFyZW50ID0gKENYRkFfTm9kZSopcFNjcmlwdENvbnRleHQtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUoDQorICAgICAgICBYRkFfSEFTSENPREVfRGF0YXNldHMpOw0KKyAgfQ0KKyAgaWYgKHdzTmFtZS5HZXRBdCgwKSA9PSAnIycpIHsNCisgICAgYklzQ2xhc3NOYW1lID0gVFJVRTsNCisgICAgd3NOYW1lID0gd3NOYW1lLlJpZ2h0KHdzTmFtZS5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgfQ0KKyAgaWYgKG1faUNyZWF0ZUNvdW50ID09IDApIHsNCisgICAgWEZBX0NyZWF0ZU5vZGVfRm9yQ29uZGl0aW9uKHdzQ29uZGl0aW9uKTsNCisgIH0NCisgIGlmIChiSXNDbGFzc05hbWUpIHsNCisgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIGxwRWxlbWVudCA9IFhGQV9HZXRFbGVtZW50QnlOYW1lKHdzTmFtZSk7DQorICAgIGlmIChscEVsZW1lbnQgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBpZihyZWZOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KLSAgICAgICAgbV9lTGFzdENyZWF0ZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhR3JvdXA7DQotICAgIH0gZWxzZSBpZihyZWZOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCi0gICAgICAgIG1fZUxhc3RDcmVhdGVUeXBlID0gWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3gocmVmTm9kZSkgPyBYRkFfRUxFTUVOVF9EYXRhR3JvdXAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQotICAgIH0gZWxzZSBpZihyZWZOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQotICAgICAgICBtX2VMYXN0Q3JlYXRlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZTsNCi0gICAgfQ0KLX0NCi1GWF9CT09MCUNYRkFfTm9kZUhlbHBlcjo6WEZBX05vZGVJc1Byb3BlcnR5KENYRkFfTm9kZSogcmVmTm9kZSkNCi17DQotICAgIEZYX0JPT0wgYlJlcyA9IEZBTFNFOw0KLSAgICBDWEZBX05vZGUqIHBhcmVudCA9IFhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KHJlZk5vZGUsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCi0gICAgaWYocGFyZW50ICE9IE5VTEwgJiYgcmVmTm9kZSAhPSBOVUxMKSB7DQotICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQocGFyZW50LT5HZXRDbGFzc0lEKCksIHJlZk5vZGUtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCi0gICAgICAgIGlmKHBQcm9wZXJ0KSB7DQotICAgICAgICAgICAgYlJlcyA9IFRSVUU7DQorICAgIGZvciAoaW50MzJfdCBpSW5kZXggPSAwOyBpSW5kZXggPCBtX2lDcmVhdGVDb3VudDsgaUluZGV4KyspIHsNCisgICAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0NCisgICAgICAgICAgbV9wQ3JlYXRlUGFyZW50LT5DcmVhdGVTYW1lUGFja2V0Tm9kZShscEVsZW1lbnQtPmVOYW1lKTsNCisgICAgICBpZiAocE5ld05vZGUpIHsNCisgICAgICAgIG1fcENyZWF0ZVBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld05vZGUpOw0KKyAgICAgICAgaWYgKGlJbmRleCA9PSBtX2lDcmVhdGVDb3VudCAtIDEpIHsNCisgICAgICAgICAgbV9wQ3JlYXRlUGFyZW50ID0gcE5ld05vZGU7DQogICAgICAgICB9DQorICAgICAgICBiUmVzdWx0ID0gVFJVRTsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIGJSZXM7DQorICB9IGVsc2Ugew0KKyAgICBYRkFfRUxFTUVOVCBlQ2xhc3NUeXBlID0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwOw0KKyAgICBpZiAoYkxhc3ROb2RlKSB7DQorICAgICAgZUNsYXNzVHlwZSA9IG1fZUxhc3RDcmVhdGVUeXBlOw0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBpSW5kZXggPSAwOyBpSW5kZXggPCBtX2lDcmVhdGVDb3VudDsgaUluZGV4KyspIHsNCisgICAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0gbV9wQ3JlYXRlUGFyZW50LT5DcmVhdGVTYW1lUGFja2V0Tm9kZShlQ2xhc3NUeXBlKTsNCisgICAgICBpZiAocE5ld05vZGUpIHsNCisgICAgICAgIHBOZXdOb2RlLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICAgICAgcE5ld05vZGUtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICBtX3BDcmVhdGVQYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlKTsNCisgICAgICAgIGlmIChpSW5kZXggPT0gbV9pQ3JlYXRlQ291bnQgLSAxKSB7DQorICAgICAgICAgIG1fcENyZWF0ZVBhcmVudCA9IHBOZXdOb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYlJlc3VsdCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoIWJSZXN1bHQpIHsNCisgICAgbV9wQ3JlYXRlUGFyZW50ID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBiUmVzdWx0Ow0KK30NCit2b2lkIENYRkFfTm9kZUhlbHBlcjo6WEZBX1NldENyZWF0ZU5vZGVUeXBlKENYRkFfTm9kZSogcmVmTm9kZSkgew0KKyAgaWYgKHJlZk5vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocmVmTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCisgICAgbV9lTGFzdENyZWF0ZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhR3JvdXA7DQorICB9IGVsc2UgaWYgKHJlZk5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICBtX2VMYXN0Q3JlYXRlVHlwZSA9IFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KHJlZk5vZGUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gWEZBX0VMRU1FTlRfRGF0YUdyb3VwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0VMRU1FTlRfRGF0YVZhbHVlOw0KKyAgfSBlbHNlIGlmIChyZWZOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgIG1fZUxhc3RDcmVhdGVUeXBlID0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfTm9kZUhlbHBlcjo6WEZBX05vZGVJc1Byb3BlcnR5KENYRkFfTm9kZSogcmVmTm9kZSkgew0KKyAgRlhfQk9PTCBiUmVzID0gRkFMU0U7DQorICBDWEZBX05vZGUqIHBhcmVudCA9DQorICAgICAgWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocmVmTm9kZSwgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KKyAgaWYgKHBhcmVudCAhPSBOVUxMICYmIHJlZk5vZGUgIT0gTlVMTCkgew0KKyAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoDQorICAgICAgICBwYXJlbnQtPkdldENsYXNzSUQoKSwgcmVmTm9kZS0+R2V0Q2xhc3NJRCgpLCBYRkFfWERQUEFDS0VUX1VOS05PV04pOw0KKyAgICBpZiAocFByb3BlcnQpIHsNCisgICAgICBiUmVzID0gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGJSZXM7DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbm9kZWhlbHBlci5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ub2RlaGVscGVyLmgKaW5kZXggNmFjOTdhYi4uN2VlYmYzMyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ub2RlaGVscGVyLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ub2RlaGVscGVyLmgKQEAgLTcsMzUgKzcsNTkgQEAKICNpZm5kZWYgX1hGQV9OT0RFSEVMUEVSX0hfDQogI2RlZmluZSBfWEZBX05PREVIRUxQRVJfSF8NCiBjbGFzcyBDWEZBX1NjcmlwdENvbnRleHQ7DQotZW51bSAgWEZBX0xPR0lDX1RZUEUgew0KLSAgICBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCwNCi0gICAgWEZBX0xPR0lDX1RyYW5zcGFyZW50LA0KK2VudW0gWEZBX0xPR0lDX1RZUEUgew0KKyAgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQsDQorICBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsDQogfTsNCi1jbGFzcyBDWEZBX05vZGVIZWxwZXINCi17DQotcHVibGljOg0KLSAgICBDWEZBX05vZGVIZWxwZXIodm9pZCk7DQotICAgIH5DWEZBX05vZGVIZWxwZXIodm9pZCk7DQotICAgIENYRkFfTm9kZSogIFhGQV9SZXNvbHZlTm9kZXNfR2V0T25lQ2hpbGQoQ1hGQV9Ob2RlKiBwYXJlbnQsIGNvbnN0IEZYX1dDSEFSKiBwd3NOYW1lLCBGWF9CT09MIGJJc0NsYXNzTmFtZSA9IEZBTFNFKTsNCi0gICAgQ1hGQV9Ob2RlKiAgWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwTm9kZSwgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSA9IFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCitjbGFzcyBDWEZBX05vZGVIZWxwZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX05vZGVIZWxwZXIodm9pZCk7DQorICB+Q1hGQV9Ob2RlSGVscGVyKHZvaWQpOw0KKyAgQ1hGQV9Ob2RlKiBYRkFfUmVzb2x2ZU5vZGVzX0dldE9uZUNoaWxkKENYRkFfTm9kZSogcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzQ2xhc3NOYW1lID0gRkFMU0UpOw0KKyAgQ1hGQV9Ob2RlKiBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudCgNCisgICAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUgPSBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCk7DQogDQotICAgIGludDMyX3QJWEZBX05vZGVBY2NfVHJhdmVyc2VTaWJsaW5ncyhDWEZBX05vZGUqIHBhcmVudCwgRlhfRFdPUkQgZE5hbWVIYXNoLCBDWEZBX05vZGVBcnJheSogcFNpYmxpbmdzLCBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlLCBGWF9CT09MIGJJc0NsYXNzTmFtZSA9IEZBTFNFLCBGWF9CT09MIGJJc0ZpbmRQcm9wZXJ0eSA9IFRSVUUpOw0KLSAgICBpbnQzMl90CVhGQV9Ob2RlQWNjX1RyYXZlcnNlQW55U2libGluZ3MoQ1hGQV9Ob2RlKiBwYXJlbnQsIEZYX0RXT1JEIGROYW1lSGFzaCwgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywgRlhfQk9PTCBiSXNDbGFzc05hbWUgPSBGQUxTRSk7DQotICAgIGludDMyX3QJWEZBX0NvdW50U2libGluZ3MoQ1hGQV9Ob2RlKiBwTm9kZSwgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSwgQ1hGQV9Ob2RlQXJyYXkgKnBTaWJsaW5ncywgRlhfQk9PTCBiSXNDbGFzc05hbWUgPSBGQUxTRSk7DQotICAgIGludDMyX3QgICAgWEZBX0dldEluZGV4KENYRkFfTm9kZSogcE5vZGUsIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUgPSBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCwgRlhfQk9PTCBiSXNQcm9wZXJ0eSA9IEZBTFNFLCBGWF9CT09MIGJJc0NsYXNzSW5kZXggPSBGQUxTRSk7DQotICAgIHZvaWQJCVhGQV9HZXROYW1lRXhwcmVzc2lvbihDWEZBX05vZGUqIHJlZk5vZGUsIENGWF9XaWRlU3RyaW5nICZ3c05hbWUsIEZYX0JPT0wgYklzQWxsUGF0aCwgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSA9IFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCi0gICAgRlhfQk9PTAkJWEZBX05vZGVJc1RyYW5zcGFyZW50KENYRkFfTm9kZSogcmVmTm9kZSk7DQotICAgIEZYX0JPT0wJCVhGQV9SZXNvbHZlTm9kZXNfQ3JlYXRlTm9kZShDRlhfV2lkZVN0cmluZyB3c05hbWUsIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uLCBGWF9CT09MIGJMYXN0Tm9kZSwgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCk7DQotICAgIEZYX0JPT0wJCVhGQV9DcmVhdGVOb2RlX0ZvckNvbmRpdGlvbihDRlhfV2lkZVN0cmluZyAmIHdzQ29uZGl0aW9uKTsNCi0gICAgdm9pZAkJWEZBX1NldENyZWF0ZU5vZGVUeXBlKENYRkFfTm9kZSogcmVmTm9kZSk7DQotICAgIEZYX0JPT0wJCVhGQV9Ob2RlSXNQcm9wZXJ0eShDWEZBX05vZGUqIHJlZk5vZGUpOw0KLXB1YmxpYzoNCi0gICAgWEZBX0VMRU1FTlQJCQkJCW1fZUxhc3RDcmVhdGVUeXBlOw0KLSAgICBDWEZBX05vZGUqCQkJCQltX3BDcmVhdGVQYXJlbnQ7DQotICAgIGludDMyX3QJCQkJCW1faUNyZWF0ZUNvdW50Ow0KLSAgICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEUJCW1faUNyZWF0ZUZsYWc7DQotICAgIGludDMyX3QJCQkJCW1faUN1ckFsbFN0YXJ0Ow0KLSAgICBDWEZBX05vZGUqCQkJCQltX3BBbGxTdGFydFBhcmVudDsNCisgIGludDMyX3QgWEZBX05vZGVBY2NfVHJhdmVyc2VTaWJsaW5ncyhDWEZBX05vZGUqIHBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkTmFtZUhhc2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzQ2xhc3NOYW1lID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNGaW5kUHJvcGVydHkgPSBUUlVFKTsNCisgIGludDMyX3QgWEZBX05vZGVBY2NfVHJhdmVyc2VBbnlTaWJsaW5ncyhDWEZBX05vZGUqIHBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkTmFtZUhhc2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0NsYXNzTmFtZSA9IEZBTFNFKTsNCisgIGludDMyX3QgWEZBX0NvdW50U2libGluZ3MoQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNDbGFzc05hbWUgPSBGQUxTRSk7DQorICBpbnQzMl90IFhGQV9HZXRJbmRleChDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSA9IFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNQcm9wZXJ0eSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNDbGFzc0luZGV4ID0gRkFMU0UpOw0KKyAgdm9pZCBYRkFfR2V0TmFtZUV4cHJlc3Npb24oDQorICAgICAgQ1hGQV9Ob2RlKiByZWZOb2RlLA0KKyAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWUsDQorICAgICAgRlhfQk9PTCBiSXNBbGxQYXRoLA0KKyAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUgPSBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCk7DQorICBGWF9CT09MIFhGQV9Ob2RlSXNUcmFuc3BhcmVudChDWEZBX05vZGUqIHJlZk5vZGUpOw0KKyAgRlhfQk9PTCBYRkFfUmVzb2x2ZU5vZGVzX0NyZWF0ZU5vZGUoQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMYXN0Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQpOw0KKyAgRlhfQk9PTCBYRkFfQ3JlYXRlTm9kZV9Gb3JDb25kaXRpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzQ29uZGl0aW9uKTsNCisgIHZvaWQgWEZBX1NldENyZWF0ZU5vZGVUeXBlKENYRkFfTm9kZSogcmVmTm9kZSk7DQorICBGWF9CT09MIFhGQV9Ob2RlSXNQcm9wZXJ0eShDWEZBX05vZGUqIHJlZk5vZGUpOw0KIA0KKyBwdWJsaWM6DQorICBYRkFfRUxFTUVOVCBtX2VMYXN0Q3JlYXRlVHlwZTsNCisgIENYRkFfTm9kZSogbV9wQ3JlYXRlUGFyZW50Ow0KKyAgaW50MzJfdCBtX2lDcmVhdGVDb3VudDsNCisgIFhGQV9SRVNPVkVOT0RFX1JTVFlQRSBtX2lDcmVhdGVGbGFnOw0KKyAgaW50MzJfdCBtX2lDdXJBbGxTdGFydDsNCisgIENYRkFfTm9kZSogbV9wQWxsU3RhcnRQYXJlbnQ7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3Jlc29sdmVwcm9jZXNzb3IuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmNwcAppbmRleCA4NTRlNGJhLi42YjYxYzUzIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3Jlc29sdmVwcm9jZXNzb3IuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfcmVzb2x2ZXByb2Nlc3Nvci5jcHAKQEAgLTIwLDc2NSArMjAsODExIEBACiAjaW5jbHVkZSAieGZhX3NjcmlwdF9ub2RlaGVscGVyLmgiDQogI2luY2x1ZGUgInhmYV9zY3JpcHRfaW1wLmgiDQogQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpDWEZBX1Jlc29sdmVQcm9jZXNzb3Iodm9pZCkNCi0gICAgOiBtX3BOb2RlSGVscGVyKE5VTEwpLCBtX2lDdXJTdGFydCgwKQ0KLXsNCi0gICAgbV9wTm9kZUhlbHBlciA9IEZYX05FVyBDWEZBX05vZGVIZWxwZXI7DQorICAgIDogbV9wTm9kZUhlbHBlcihOVUxMKSwgbV9pQ3VyU3RhcnQoMCkgew0KKyAgbV9wTm9kZUhlbHBlciA9IEZYX05FVyBDWEZBX05vZGVIZWxwZXI7DQogfQ0KLUNYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6fkNYRkFfUmVzb2x2ZVByb2Nlc3Nvcih2b2lkKQ0KLXsNCi0gICAgaWYobV9wTm9kZUhlbHBlcikgew0KLSAgICAgICAgZGVsZXRlIG1fcE5vZGVIZWxwZXI7DQotICAgICAgICBtX3BOb2RlSGVscGVyID0gTlVMTDsNCi0gICAgfQ0KK0NYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6fkNYRkFfUmVzb2x2ZVByb2Nlc3Nvcih2b2lkKSB7DQorICBpZiAobV9wTm9kZUhlbHBlcikgew0KKyAgICBkZWxldGUgbV9wTm9kZUhlbHBlcjsNCisgICAgbV9wTm9kZUhlbHBlciA9IE5VTEw7DQorICB9DQogfQ0KLWludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKQ0KLXsNCi0gICAgaWYgKHJuZC5tX0N1ck5vZGUgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIC0xOw0KK2ludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBpZiAocm5kLm1fQ3VyTm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGlmICghcm5kLm1fQ3VyTm9kZS0+SXNOb2RlKCkpIHsNCisgICAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMpIHsNCisgICAgICByZXR1cm4gWEZBX1Jlc29sdmVOb2Rlc19Gb3JBdHRyaWJ1dGVScyhybmQubV9DdXJOb2RlLCBybmQsIHJuZC5tX3dzTmFtZSk7DQogICAgIH0NCi0gICAgaWYoIXJuZC5tX0N1ck5vZGUtPklzTm9kZSgpKSB7DQotICAgICAgICBpZihybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzKSB7DQotICAgICAgICAgICAgcmV0dXJuIFhGQV9SZXNvbHZlTm9kZXNfRm9yQXR0cmlidXRlUnMocm5kLm1fQ3VyTm9kZSwgcm5kLCBybmQubV93c05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FueUNoaWxkKSB7DQotICAgICAgICByZXR1cm4gWEZBX1Jlc29sdmVOb2Rlc19BbnlDaGlsZChybmQpOw0KLSAgICB9DQotICAgIEZYX1dDSEFSIHdjaCA9IHJuZC5tX3dzTmFtZS5HZXRBdCgwKTsNCi0gICAgc3dpdGNoICh3Y2gpIHsNCi0gICAgICAgIGNhc2UgJyQnOg0KLSAgICAgICAgICAgIHJldHVybiBYRkFfUmVzb2x2ZU5vZGVzX0RvbGxhcihybmQpOw0KLSAgICAgICAgY2FzZSAnISc6DQotICAgICAgICAgICAgcmV0dXJuIFhGQV9SZXNvbHZlTm9kZXNfRXhjYWxtYXRvcnkocm5kKTsNCi0gICAgICAgIGNhc2UgJyMnOg0KLSAgICAgICAgICAgIHJldHVybiBYRkFfUmVzb2x2ZU5vZGVzX051bWJlclNpZ24ocm5kKTsNCi0gICAgICAgIGNhc2UgJyonOg0KLSAgICAgICAgICAgIHJldHVybiBYRkFfUmVzb2x2ZU5vZGVzX0FzdGVyaXNrKHJuZCk7DQotICAgICAgICBjYXNlICcuJzoNCi0gICAgICAgICAgICByZXR1cm4gWEZBX1Jlc29sdmVOb2Rlc19BbnlDaGlsZChybmQpOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICBpZiAocm5kLm1fdUhhc2hOYW1lID09IFhGQV9IQVNIQ09ERV9UaGlzICYmIHJuZC5tX25MZXZlbCA9PSAwKSB7DQotICAgICAgICBybmQubV9Ob2Rlcy5BZGQocm5kLm1fcFNDLT5HZXRUaGlzT2JqZWN0KCkpOw0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0gZWxzZSBpZihybmQubV9DdXJOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfWGZhKSB7DQotICAgICAgICBDWEZBX09iamVjdCogcE9iak5vZGUgPSBybmQubV9wU0MtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUocm5kLm1fdUhhc2hOYW1lKTsNCi0gICAgICAgIGlmKHBPYmpOb2RlKSB7DQotICAgICAgICAgICAgcm5kLm1fTm9kZXMuQWRkKHBPYmpOb2RlKTsNCi0gICAgICAgIH0gZWxzZSBpZiAocm5kLm1fdUhhc2hOYW1lID09IFhGQV9IQVNIQ09ERV9YZmEpIHsNCi0gICAgICAgICAgICBybmQubV9Ob2Rlcy5BZGQocm5kLm1fQ3VyTm9kZSk7DQotICAgICAgICB9IGVsc2UgaWYgKChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzKSAmJiBYRkFfUmVzb2x2ZU5vZGVzX0ZvckF0dHJpYnV0ZVJzKHJuZC5tX0N1ck5vZGUsIHJuZCwgcm5kLm1fd3NOYW1lKSkgew0KLSAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHJuZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKHJuZCwgcm5kLm1fd3NDb25kaXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IG5SZXQgPSBYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChybmQpOw0KLSAgICBpZiAoblJldCA8IDEgJiYgcm5kLm1fdUhhc2hOYW1lID09IFhGQV9IQVNIQ09ERV9YZmEpIHsNCi0gICAgICAgIHJuZC5tX05vZGVzLkFkZChybmQubV9wU0MtPkdldERvY3VtZW50KCktPkdldFJvb3QoKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCi19DQotaW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfQW55Q2hpbGQoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpDQotew0KLSAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBybmQubV93c05hbWUuUmlnaHQocm5kLm1fd3NOYW1lLkdldExlbmd0aCgpIC0gMSk7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247DQotICAgIENYRkFfTm9kZSogZmluZE5vZGUgPSBOVUxMOw0KLSAgICBDWEZBX05vZGVBcnJheSBzaWJsaW5nczsNCi0gICAgRlhfQk9PTCBiQ2xhc3NOYW1lID0gRkFMU0U7DQotICAgIGlmKHdzTmFtZS5HZXRBdCgwKSA9PSAnIycpIHsNCi0gICAgICAgIGJDbGFzc05hbWUgPSBUUlVFOw0KLSAgICAgICAgd3NOYW1lID0gd3NOYW1lLlJpZ2h0KHdzTmFtZS5HZXRMZW5ndGgoKSAtIDEpOw0KLSAgICB9DQotICAgIGZpbmROb2RlID0gbV9wTm9kZUhlbHBlci0+WEZBX1Jlc29sdmVOb2Rlc19HZXRPbmVDaGlsZCgoQ1hGQV9Ob2RlKilybmQubV9DdXJOb2RlLCB3c05hbWUsIGJDbGFzc05hbWUpOw0KLSAgICBpZiAoZmluZE5vZGUgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0gICAgaWYgKHdzQ29uZGl0aW9uLklzRW1wdHkoKSkgew0KLSAgICAgICAgcm5kLm1fTm9kZXMuQWRkKGZpbmROb2RlKTsNCi0gICAgICAgIHJldHVybiBybmQubV9Ob2Rlcy5HZXRTaXplKCk7DQotICAgIH0NCi0gICAgbV9wTm9kZUhlbHBlci0+WEZBX0NvdW50U2libGluZ3MoZmluZE5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwgKENYRkFfTm9kZUFycmF5Kikmcm5kLm1fTm9kZXMsIGJDbGFzc05hbWUpOw0KLSAgICBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKHJuZCwgd3NDb25kaXRpb24pOw0KLSAgICByZXR1cm4gcm5kLm1fTm9kZXMuR2V0U2l6ZSgpOw0KLX0NCi1pbnQzMl90IENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19Eb2xsYXIoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpDQotew0KLSAgICBDWEZBX09iakFycmF5ICZub2RlcyA9IHJuZC5tX05vZGVzOw0KLSAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBybmQubV93c05hbWU7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247DQotICAgIGludDMyX3QgaU5hbWVMZW4gPSB3c05hbWUuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTmFtZUxlbiA9PSAxKSB7DQotICAgICAgICBub2Rlcy5BZGQocm5kLm1fQ3VyTm9kZSk7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfQ0KLSAgICBpZiAocm5kLm1fbkxldmVsID4gMCkgew0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VygoY29uc3QgRlhfV0NIQVIqKXdzTmFtZSArIDEsIGlOYW1lTGVuIC0gMSk7DQotICAgIGlmIChkd05hbWVIYXNoID09IFhGQV9IQVNIQ09ERV9YZmEpIHsNCi0gICAgICAgIG5vZGVzLkFkZChybmQubV9wU0MtPkdldERvY3VtZW50KCktPkdldFJvb3QoKSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBDWEZBX09iamVjdCogcE9iak5vZGUgPSBybmQubV9wU0MtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUoZHdOYW1lSGFzaCk7DQotICAgICAgICBpZihwT2JqTm9kZSkgew0KLSAgICAgICAgICAgIHJuZC5tX05vZGVzLkFkZChwT2JqTm9kZSk7DQotICAgICAgICB9DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FueUNoaWxkKSB7DQorICAgIHJldHVybiBYRkFfUmVzb2x2ZU5vZGVzX0FueUNoaWxkKHJuZCk7DQorICB9DQorICBGWF9XQ0hBUiB3Y2ggPSBybmQubV93c05hbWUuR2V0QXQoMCk7DQorICBzd2l0Y2ggKHdjaCkgew0KKyAgICBjYXNlICckJzoNCisgICAgICByZXR1cm4gWEZBX1Jlc29sdmVOb2Rlc19Eb2xsYXIocm5kKTsNCisgICAgY2FzZSAnISc6DQorICAgICAgcmV0dXJuIFhGQV9SZXNvbHZlTm9kZXNfRXhjYWxtYXRvcnkocm5kKTsNCisgICAgY2FzZSAnIyc6DQorICAgICAgcmV0dXJuIFhGQV9SZXNvbHZlTm9kZXNfTnVtYmVyU2lnbihybmQpOw0KKyAgICBjYXNlICcqJzoNCisgICAgICByZXR1cm4gWEZBX1Jlc29sdmVOb2Rlc19Bc3RlcmlzayhybmQpOw0KKyAgICBjYXNlICcuJzoNCisgICAgICByZXR1cm4gWEZBX1Jlc29sdmVOb2Rlc19BbnlDaGlsZChybmQpOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKHJuZC5tX3VIYXNoTmFtZSA9PSBYRkFfSEFTSENPREVfVGhpcyAmJiBybmQubV9uTGV2ZWwgPT0gMCkgew0KKyAgICBybmQubV9Ob2Rlcy5BZGQocm5kLm1fcFNDLT5HZXRUaGlzT2JqZWN0KCkpOw0KKyAgICByZXR1cm4gMTsNCisgIH0gZWxzZSBpZiAocm5kLm1fQ3VyTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1hmYSkgew0KKyAgICBDWEZBX09iamVjdCogcE9iak5vZGUgPQ0KKyAgICAgICAgcm5kLm1fcFNDLT5HZXREb2N1bWVudCgpLT5HZXRYRkFOb2RlKHJuZC5tX3VIYXNoTmFtZSk7DQorICAgIGlmIChwT2JqTm9kZSkgew0KKyAgICAgIHJuZC5tX05vZGVzLkFkZChwT2JqTm9kZSk7DQorICAgIH0gZWxzZSBpZiAocm5kLm1fdUhhc2hOYW1lID09IFhGQV9IQVNIQ09ERV9YZmEpIHsNCisgICAgICBybmQubV9Ob2Rlcy5BZGQocm5kLm1fQ3VyTm9kZSk7DQorICAgIH0gZWxzZSBpZiAoKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMpICYmDQorICAgICAgICAgICAgICAgWEZBX1Jlc29sdmVOb2Rlc19Gb3JBdHRyaWJ1dGVScyhybmQubV9DdXJOb2RlLCBybmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmQubV93c05hbWUpKSB7DQorICAgICAgcmV0dXJuIDE7DQogICAgIH0NCiAgICAgaWYgKHJuZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgIFhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24ocm5kLCB3c0NvbmRpdGlvbik7DQorICAgICAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHJuZC5tX3dzQ29uZGl0aW9uKTsNCiAgICAgfQ0KICAgICByZXR1cm4gcm5kLm1fTm9kZXMuR2V0U2l6ZSgpOw0KKyAgfQ0KKyAgaW50MzJfdCBuUmV0ID0gWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwocm5kKTsNCisgIGlmIChuUmV0IDwgMSAmJiBybmQubV91SGFzaE5hbWUgPT0gWEZBX0hBU0hDT0RFX1hmYSkgew0KKyAgICBybmQubV9Ob2Rlcy5BZGQocm5kLm1fcFNDLT5HZXREb2N1bWVudCgpLT5HZXRSb290KCkpOw0KKyAgfQ0KKyAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCiB9DQotaW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfRXhjYWxtYXRvcnkoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpDQotew0KLSAgICBpZiAocm5kLm1fbkxldmVsID4gMCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQoraW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfQW55Q2hpbGQoDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBybmQubV93c05hbWUuUmlnaHQocm5kLm1fd3NOYW1lLkdldExlbmd0aCgpIC0gMSk7DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbiA9IHJuZC5tX3dzQ29uZGl0aW9uOw0KKyAgQ1hGQV9Ob2RlKiBmaW5kTm9kZSA9IE5VTEw7DQorICBDWEZBX05vZGVBcnJheSBzaWJsaW5nczsNCisgIEZYX0JPT0wgYkNsYXNzTmFtZSA9IEZBTFNFOw0KKyAgaWYgKHdzTmFtZS5HZXRBdCgwKSA9PSAnIycpIHsNCisgICAgYkNsYXNzTmFtZSA9IFRSVUU7DQorICAgIHdzTmFtZSA9IHdzTmFtZS5SaWdodCh3c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIH0NCisgIGZpbmROb2RlID0gbV9wTm9kZUhlbHBlci0+WEZBX1Jlc29sdmVOb2Rlc19HZXRPbmVDaGlsZCgNCisgICAgICAoQ1hGQV9Ob2RlKilybmQubV9DdXJOb2RlLCB3c05hbWUsIGJDbGFzc05hbWUpOw0KKyAgaWYgKGZpbmROb2RlID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAod3NDb25kaXRpb24uSXNFbXB0eSgpKSB7DQorICAgIHJuZC5tX05vZGVzLkFkZChmaW5kTm9kZSk7DQorICAgIHJldHVybiBybmQubV9Ob2Rlcy5HZXRTaXplKCk7DQorICB9DQorICBtX3BOb2RlSGVscGVyLT5YRkFfQ291bnRTaWJsaW5ncyhmaW5kTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENYRkFfTm9kZUFycmF5Kikmcm5kLm1fTm9kZXMsIGJDbGFzc05hbWUpOw0KKyAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsNCisgIHJldHVybiBybmQubV9Ob2Rlcy5HZXRTaXplKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX0RvbGxhcigNCisgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpIHsNCisgIENYRkFfT2JqQXJyYXkmIG5vZGVzID0gcm5kLm1fTm9kZXM7DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBybmQubV93c05hbWU7DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbiA9IHJuZC5tX3dzQ29uZGl0aW9uOw0KKyAgaW50MzJfdCBpTmFtZUxlbiA9IHdzTmFtZS5HZXRMZW5ndGgoKTsNCisgIGlmIChpTmFtZUxlbiA9PSAxKSB7DQorICAgIG5vZGVzLkFkZChybmQubV9DdXJOb2RlKTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBpZiAocm5kLm1fbkxldmVsID4gMCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBGWF9EV09SRCBkd05hbWVIYXNoID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VygoY29uc3QgRlhfV0NIQVIqKXdzTmFtZSArIDEsIGlOYW1lTGVuIC0gMSk7DQorICBpZiAoZHdOYW1lSGFzaCA9PSBYRkFfSEFTSENPREVfWGZhKSB7DQorICAgIG5vZGVzLkFkZChybmQubV9wU0MtPkdldERvY3VtZW50KCktPkdldFJvb3QoKSk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX09iamVjdCogcE9iak5vZGUgPSBybmQubV9wU0MtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUoZHdOYW1lSGFzaCk7DQorICAgIGlmIChwT2JqTm9kZSkgew0KKyAgICAgIHJuZC5tX05vZGVzLkFkZChwT2JqTm9kZSk7DQogICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBkYXRhc2V0cyA9IChDWEZBX05vZGUqKXJuZC5tX3BTQy0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRGF0YXNldHMpOw0KLSAgICBpZiAoZGF0YXNldHMgPT0gTlVMTCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAocm5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKHJuZCwgd3NDb25kaXRpb24pOw0KKyAgfQ0KKyAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCit9DQoraW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfRXhjYWxtYXRvcnkoDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBpZiAocm5kLm1fbkxldmVsID4gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENYRkFfTm9kZSogZGF0YXNldHMgPQ0KKyAgICAgIChDWEZBX05vZGUqKXJuZC5tX3BTQy0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRGF0YXNldHMpOw0KKyAgaWYgKGRhdGFzZXRzID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgcm5kRmluZDsNCisgIHJuZEZpbmQubV9wU0MgPSBybmQubV9wU0M7DQorICBybmRGaW5kLm1fQ3VyTm9kZSA9IGRhdGFzZXRzOw0KKyAgcm5kRmluZC5tX3dzTmFtZSA9IHJuZC5tX3dzTmFtZS5SaWdodChybmQubV93c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIHJuZEZpbmQubV91SGFzaE5hbWUgPQ0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHJuZEZpbmQubV93c05hbWUsIHJuZEZpbmQubV93c05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgcm5kRmluZC5tX25MZXZlbCA9IHJuZC5tX25MZXZlbCArIDE7DQorICBybmRGaW5kLm1fZHdTdHlsZXMgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW47DQorICBybmRGaW5kLm1fd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCisgIFhGQV9SZXNvbHZlTm9kZXMocm5kRmluZCk7DQorICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgcm5kLm1fTm9kZXMuQXBwZW5kKHJuZEZpbmQubV9Ob2Rlcyk7DQorICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCisgIH0NCisgIHJldHVybiBybmQubV9Ob2Rlcy5HZXRTaXplKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX051bWJlclNpZ24oDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBGWF9EV09SRCBkd1N0eWxlcyA9IHJuZC5tX2R3U3R5bGVzOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lID0gcm5kLm1fd3NOYW1lLlJpZ2h0KHJuZC5tX3dzTmFtZS5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCisgIENYRkFfTm9kZSogY3VyTm9kZSA9IChDWEZBX05vZGUqKXJuZC5tX0N1ck5vZGU7DQorICBpZiAoWEZBX1Jlc29sdmVOb2Rlc19Gb3JBdHRyaWJ1dGVScyhjdXJOb2RlLCBybmQsIHdzTmFtZSkpIHsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgcm5kRmluZDsNCisgIHJuZEZpbmQubV9wU0MgPSBybmQubV9wU0M7DQorICBybmRGaW5kLm1fbkxldmVsID0gcm5kLm1fbkxldmVsICsgMTsNCisgIHJuZEZpbmQubV9kd1N0eWxlcyA9IHJuZC5tX2R3U3R5bGVzOw0KKyAgcm5kRmluZC5tX2R3U3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lOw0KKyAgcm5kRmluZC5tX2R3U3R5bGVzICY9IH5YRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlczsNCisgIHJuZEZpbmQubV93c05hbWUgPSB3c05hbWU7DQorICBybmRGaW5kLm1fdUhhc2hOYW1lID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhybmRGaW5kLm1fd3NOYW1lLCBybmRGaW5kLm1fd3NOYW1lLkdldExlbmd0aCgpKTsNCisgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHdzQ29uZGl0aW9uOw0KKyAgcm5kRmluZC5tX0N1ck5vZGUgPSBjdXJOb2RlOw0KKyAgWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwocm5kRmluZCk7DQorICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgaWYgKHdzQ29uZGl0aW9uLkdldExlbmd0aCgpID09IDAgJiYgcm5kRmluZC5tX05vZGVzLkZpbmQoY3VyTm9kZSkgPj0gMCkgew0KKyAgICAgIHJuZC5tX05vZGVzLkFkZChjdXJOb2RlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBybmQubV9Ob2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsNCisgICAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7DQogICAgIH0NCi0gICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhIHJuZEZpbmQ7DQotICAgIHJuZEZpbmQubV9wU0MgPSBybmQubV9wU0M7DQotICAgIHJuZEZpbmQubV9DdXJOb2RlID0gZGF0YXNldHM7DQotICAgIHJuZEZpbmQubV93c05hbWUgPSBybmQubV93c05hbWUuUmlnaHQocm5kLm1fd3NOYW1lLkdldExlbmd0aCgpIC0gMSk7DQotICAgIHJuZEZpbmQubV91SGFzaE5hbWUgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhybmRGaW5kLm1fd3NOYW1lLCBybmRGaW5kLm1fd3NOYW1lLkdldExlbmd0aCgpKTsNCi0gICAgcm5kRmluZC5tX25MZXZlbCA9IHJuZC5tX25MZXZlbCArIDE7DQotICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbjsNCi0gICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247DQotICAgIFhGQV9SZXNvbHZlTm9kZXMocm5kRmluZCk7DQotICAgIGlmIChybmRGaW5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgcm5kLm1fTm9kZXMuQXBwZW5kKHJuZEZpbmQubV9Ob2Rlcyk7DQorICB9DQorICByZXR1cm4gcm5kLm1fTm9kZXMuR2V0U2l6ZSgpOw0KK30NCitpbnQzMl90IENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19Gb3JBdHRyaWJ1dGVScygNCisgICAgQ1hGQV9PYmplY3QqIGN1ck5vZGUsDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kLA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0ckF0dHIpIHsNCisgIFhGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPIGxwU2NyaXB0QXR0cmlidXRlID0NCisgICAgICBYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKGN1ck5vZGUtPkdldENsYXNzSUQoKSwgc3RyQXR0cik7DQorICBpZiAobHBTY3JpcHRBdHRyaWJ1dGUpIHsNCisgICAgcm5kLm1fcFNjcmlwdEF0dHJpYnV0ZSA9IGxwU2NyaXB0QXR0cmlidXRlOw0KKyAgICBybmQubV9Ob2Rlcy5BZGQoY3VyTm9kZSk7DQorICAgIHJuZC5tX2R3RmxhZyA9IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9BdHRyaWJ1dGU7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK2ludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbCgNCisgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpIHsNCisgIGlmIChybmQubV9uTGV2ZWwgPiAzMikgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmICghcm5kLm1fQ3VyTm9kZS0+SXNOb2RlKCkpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBDWEZBX05vZGUqIGN1ck5vZGUgPSAoQ1hGQV9Ob2RlKilybmQubV9DdXJOb2RlOw0KKyAgQ1hGQV9PYmpBcnJheSYgbm9kZXMgPSBybmQubV9Ob2RlczsNCisgIGludDMyX3Qgbk51bSA9IG5vZGVzLkdldFNpemUoKTsNCisgIEZYX0RXT1JEIGR3U3R5bGVzID0gcm5kLm1fZHdTdHlsZXM7DQorICBDRlhfV2lkZVN0cmluZyYgd3NOYW1lID0gcm5kLm1fd3NOYW1lOw0KKyAgdWludDMyX3QgdU5hbWVIYXNoID0gcm5kLm1fdUhhc2hOYW1lOw0KKyAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247DQorICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgcm5kRmluZDsNCisgIHJuZEZpbmQubV93c05hbWUgPSBybmQubV93c05hbWU7DQorICBybmRGaW5kLm1fd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCisgIHJuZEZpbmQubV9wU0MgPSBybmQubV9wU0M7DQorICBybmRGaW5kLm1fbkxldmVsID0gcm5kLm1fbkxldmVsICsgMTsNCisgIHJuZEZpbmQubV91SGFzaE5hbWUgPSB1TmFtZUhhc2g7DQorICBDWEZBX05vZGVBcnJheSBjaGlsZHJlbjsNCisgIENYRkFfTm9kZUFycmF5IHByb3BlcnRpZXM7DQorICBDWEZBX05vZGUqIHBWYXJpYWJsZXNOb2RlID0gTlVMTDsNCisgIENYRkFfTm9kZSogcFBhZ2VTZXROb2RlID0gTlVMTDsNCisgIENYRkFfTm9kZSogcENoaWxkID0gY3VyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICBpZiAocENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzKSB7DQorICAgICAgcFZhcmlhYmxlc05vZGUgPSBwQ2hpbGQ7DQorICAgICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2UgaWYgKHBDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICBwUGFnZVNldE5vZGUgPSBwQ2hpbGQ7DQorICAgICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydCA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudCgNCisgICAgICAgICAgY3VyTm9kZS0+R2V0Q2xhc3NJRCgpLCBwQ2hpbGQtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCisgICAgICBpZiAocFByb3BlcnQpIHsNCisgICAgICAgIHByb3BlcnRpZXMuQWRkKHBDaGlsZCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNoaWxkcmVuLkFkZChwQ2hpbGQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICB9DQorICBpZiAoKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMpICYmIHBWYXJpYWJsZXNOb2RlKSB7DQorICAgIHVpbnQzMl90IHVQcm9wSGFzaCA9IHBWYXJpYWJsZXNOb2RlLT5HZXRDbGFzc0hhc2hDb2RlKCk7DQorICAgIGlmICh1UHJvcEhhc2ggPT0gdU5hbWVIYXNoKSB7DQorICAgICAgbm9kZXMuQWRkKHBWYXJpYWJsZXNOb2RlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBybmRGaW5kLm1fQ3VyTm9kZSA9IHBWYXJpYWJsZXNOb2RlOw0KKyAgICAgIFhGQV9SZXNvbHZlTm9kZXNfU2V0U3R5bGVzRm9yQ2hpbGQoZHdTdHlsZXMsIHJuZEZpbmQpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzU2F2ZUNvbmRpdGlvbiA9IHJuZEZpbmQubV93c0NvbmRpdGlvbjsNCisgICAgICBybmRGaW5kLm1fd3NDb25kaXRpb24uRW1wdHkoKTsNCisgICAgICBYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChybmRGaW5kKTsNCisgICAgICBybmRGaW5kLm1fd3NDb25kaXRpb24gPSB3c1NhdmVDb25kaXRpb247DQorICAgICAgaWYgKHJuZEZpbmQubV9Ob2Rlcy5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICBub2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsNCiAgICAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCi19DQotaW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfTnVtYmVyU2lnbihDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCkNCi17DQotICAgIEZYX0RXT1JEIGR3U3R5bGVzID0gcm5kLm1fZHdTdHlsZXM7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZSA9IHJuZC5tX3dzTmFtZS5SaWdodChybmQubV93c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCi0gICAgQ1hGQV9Ob2RlKiBjdXJOb2RlID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCi0gICAgaWYoWEZBX1Jlc29sdmVOb2Rlc19Gb3JBdHRyaWJ1dGVScyhjdXJOb2RlLCBybmQsIHdzTmFtZSkpIHsNCisgICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IG5OdW0pIHsNCisgICAgICBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKHJuZCwgd3NDb25kaXRpb24pOw0KKyAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7DQogICAgICAgICByZXR1cm4gMTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIDA7DQogICAgIH0NCi0gICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhIHJuZEZpbmQ7DQotICAgIHJuZEZpbmQubV9wU0MgPSBybmQubV9wU0M7DQotICAgIHJuZEZpbmQubV9uTGV2ZWwgPSBybmQubV9uTGV2ZWwgKyAxOw0KLSAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBybmQubV9kd1N0eWxlczsNCi0gICAgcm5kRmluZC5tX2R3U3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lOw0KLSAgICBybmRGaW5kLm1fZHdTdHlsZXMgJj0gflhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzOw0KLSAgICBybmRGaW5kLm1fd3NOYW1lID0gd3NOYW1lOw0KLSAgICBybmRGaW5kLm1fdUhhc2hOYW1lID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocm5kRmluZC5tX3dzTmFtZSwgcm5kRmluZC5tX3dzTmFtZS5HZXRMZW5ndGgoKSk7DQotICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHdzQ29uZGl0aW9uOw0KLSAgICBybmRGaW5kLm1fQ3VyTm9kZSA9IGN1ck5vZGU7DQorICB9DQorICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4pIHsNCisgICAgRlhfQk9PTCBiU2V0RmxhZyA9IEZBTFNFOw0KKyAgICBpZiAocFBhZ2VTZXROb2RlICYmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzKSkgew0KKyAgICAgIGNoaWxkcmVuLkFkZChwUGFnZVNldE5vZGUpOw0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNoaWxkcmVuLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KKyAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7DQorICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSB1TmFtZUhhc2gpIHsNCisgICAgICAgICAgbm9kZXMuQWRkKGNoaWxkKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2UgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgbm9kZXMuQWRkKGNoaWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKG1fcE5vZGVIZWxwZXItPlhGQV9Ob2RlSXNUcmFuc3BhcmVudChjaGlsZCkgJiYNCisgICAgICAgICAgY2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgICBpZiAoIWJTZXRGbGFnKSB7DQorICAgICAgICAgIFhGQV9SZXNvbHZlTm9kZXNfU2V0U3R5bGVzRm9yQ2hpbGQoZHdTdHlsZXMsIHJuZEZpbmQpOw0KKyAgICAgICAgICBiU2V0RmxhZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBybmRGaW5kLm1fQ3VyTm9kZSA9IGNoaWxkOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTYXZlQ29uZGl0aW9uID0gcm5kRmluZC5tX3dzQ29uZGl0aW9uOw0KKyAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uLkVtcHR5KCk7DQorICAgICAgICBYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChybmRGaW5kKTsNCisgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHdzU2F2ZUNvbmRpdGlvbjsNCisgICAgICAgIGlmIChybmRGaW5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICBub2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsNCisgICAgICAgICAgcm5kRmluZC5tX05vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gbk51bSkgew0KKyAgICAgIGlmICghKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FMTCkpIHsNCisgICAgICAgIENYRkFfTm9kZUFycmF5IHVwQXJyYXlOb2RlczsNCisgICAgICAgIGlmIChtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzVHJhbnNwYXJlbnQoKENYRkFfTm9kZSopY3VyTm9kZSkpIHsNCisgICAgICAgICAgbV9wTm9kZUhlbHBlci0+WEZBX0NvdW50U2libGluZ3MoDQorICAgICAgICAgICAgICAoQ1hGQV9Ob2RlKilub2Rlc1swXSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LCAmdXBBcnJheU5vZGVzLA0KKyAgICAgICAgICAgICAgZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSA/IFRSVUUgOiBGQUxTRSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAodXBBcnJheU5vZGVzLkdldFNpemUoKSA+IG5vZGVzLkdldFNpemUoKSkgew0KKyAgICAgICAgICB1cEFycmF5Tm9kZXNbMF0gPSAoQ1hGQV9Ob2RlKilub2Rlc1swXTsNCisgICAgICAgICAgbm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgIG5vZGVzLkFwcGVuZCgoQ1hGQV9PYmpBcnJheSYpdXBBcnJheU5vZGVzKTsNCisgICAgICAgICAgdXBBcnJheU5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKHJuZCwgd3NDb25kaXRpb24pOw0KKyAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgIH0NCisgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzKSB7DQorICAgIGlmIChYRkFfUmVzb2x2ZU5vZGVzX0ZvckF0dHJpYnV0ZVJzKGN1ck5vZGUsIHJuZCwgd3NOYW1lKSkgew0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICB9DQorICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcykgew0KKyAgICBGWF9CT09MIGJTZXRGbGFnID0gRkFMU0U7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHByb3BlcnRpZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICBDWEZBX05vZGUqIGNoaWxkUHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldOw0KKyAgICAgIGlmIChjaGlsZFByb3BlcnR5LT5Jc1VubmFtZWQoKSkgew0KKyAgICAgICAgdWludDMyX3QgdVByb3BIYXNoID0gY2hpbGRQcm9wZXJ0eS0+R2V0Q2xhc3NIYXNoQ29kZSgpOw0KKyAgICAgICAgWEZBX0VMRU1FTlQgZU5hbWUgPSBjaGlsZFByb3BlcnR5LT5HZXRDbGFzc0lEKCk7DQorICAgICAgICBpZiAodVByb3BIYXNoID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgICBub2Rlcy5BZGQoY2hpbGRQcm9wZXJ0eSk7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmIChjaGlsZFByb3BlcnR5LT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCAmJg0KKyAgICAgICAgICAgICAgICAgY2hpbGRQcm9wZXJ0eS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0V4dHJhcyAmJg0KKyAgICAgICAgICAgICAgICAgY2hpbGRQcm9wZXJ0eS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQorICAgICAgICBub2Rlcy5BZGQoY2hpbGRQcm9wZXJ0eSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiBuTnVtKSB7DQorICAgICAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsNCisgICAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFByb3AgPSBOVUxMOw0KKyAgICBpZiAoWEZBX0VMRU1FTlRfU3ViZm9ybSA9PSBjdXJOb2RlLT5HZXRDbGFzc0lEKCkgJiYNCisgICAgICAgIFhGQV9IQVNIQ09ERV9PY2N1ciA9PSB1TmFtZUhhc2gpIHsNCisgICAgICBDWEZBX05vZGUqIHBJbnN0YW5jZU1hbmFnZXIgPQ0KKyAgICAgICAgICAoKENYRkFfTm9kZSopY3VyTm9kZSktPkdldEluc3RhbmNlTWdyT2ZTdWJmb3JtKCk7DQorICAgICAgaWYgKHBJbnN0YW5jZU1hbmFnZXIpIHsNCisgICAgICAgIHBQcm9wID0gcEluc3RhbmNlTWFuYWdlci0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfT2NjdXIsIFRSVUUpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBYRkFfTFBDRUxFTUVOVElORk8gcEVsZW1lbnQgPSBYRkFfR2V0RWxlbWVudEJ5TmFtZSh3c05hbWUpOw0KKyAgICAgIGlmIChwRWxlbWVudCkgew0KKyAgICAgICAgcFByb3AgPSAoKENYRkFfTm9kZSopY3VyTm9kZSkNCisgICAgICAgICAgICAgICAgICAgIC0+R2V0UHJvcGVydHkoMCwgcEVsZW1lbnQtPmVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWxlbWVudC0+ZU5hbWUgIT0gWEZBX0VMRU1FTlRfUGFnZVNldCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwUHJvcCkgew0KKyAgICAgIG5vZGVzLkFkZChwUHJvcCk7DQorICAgICAgcmV0dXJuIG5vZGVzLkdldFNpemUoKTsNCisgICAgfQ0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwYXJlbnROb2RlID0gbV9wTm9kZUhlbHBlci0+WEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQoDQorICAgICAgKENYRkFfTm9kZSopY3VyTm9kZSwgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KKyAgdWludDMyX3QgdUN1ckNsYXNzSGFzaCA9IGN1ck5vZGUtPkdldENsYXNzSGFzaENvZGUoKTsNCisgIGlmIChwYXJlbnROb2RlID09IE5VTEwpIHsNCisgICAgaWYgKHVDdXJDbGFzc0hhc2ggPT0gdU5hbWVIYXNoKSB7DQorICAgICAgbm9kZXMuQWRkKChDWEZBX05vZGUqKWN1ck5vZGUpOw0KKyAgICAgIFhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24ocm5kLCB3c0NvbmRpdGlvbik7DQorICAgICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncykgew0KKyAgICBDWEZBX05vZGUqIGNoaWxkID0gcGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBGWF9EV09SRCBkd1N1YlN0eWxlcyA9DQorICAgICAgICBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllczsNCisgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpIHsNCisgICAgICBkd1N1YlN0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZTsNCisgICAgfQ0KKyAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQUxMKSB7DQorICAgICAgZHdTdWJTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX0FMTDsNCisgICAgfQ0KKyAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd1N1YlN0eWxlczsNCisgICAgd2hpbGUgKGNoaWxkKSB7DQorICAgICAgaWYgKGNoaWxkID09IGN1ck5vZGUpIHsNCisgICAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7DQorICAgICAgICAgIGlmICh1Q3VyQ2xhc3NIYXNoID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgICAgIG5vZGVzLkFkZChjdXJOb2RlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgICAgIG5vZGVzLkFkZChjdXJOb2RlKTsNCisgICAgICAgICAgICBpZiAocm5kLm1fbkxldmVsID09IDAgJiYgd3NDb25kaXRpb24uR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgbm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgICBub2Rlcy5BZGQoY3VyTm9kZSk7DQorICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGNoaWxkID0gY2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpIHsNCisgICAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgICBub2Rlcy5BZGQoY2hpbGQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoY2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gdU5hbWVIYXNoKSB7DQorICAgICAgICBub2Rlcy5BZGQoY2hpbGQpOw0KKyAgICAgIH0NCisgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoDQorICAgICAgICAgIHBhcmVudE5vZGUtPkdldENsYXNzSUQoKSwgY2hpbGQtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCisgICAgICBGWF9CT09MIGJJbm5lclNlYXJjaCA9IEZBTFNFOw0KKyAgICAgIGlmIChwUHJvcGVydCkgew0KKyAgICAgICAgaWYgKChjaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcyB8fA0KKyAgICAgICAgICAgICBjaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpKSB7DQorICAgICAgICAgIGJJbm5lclNlYXJjaCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzVHJhbnNwYXJlbnQoY2hpbGQpKSB7DQorICAgICAgICAgIGJJbm5lclNlYXJjaCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChiSW5uZXJTZWFyY2gpIHsNCisgICAgICAgIHJuZEZpbmQubV9DdXJOb2RlID0gY2hpbGQ7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c09yaWdpbkNvbmRpdGlvbiA9IHJuZEZpbmQubV93c0NvbmRpdGlvbjsNCisgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbi5FbXB0eSgpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdPcmlnaW5TdHlsZSA9IHJuZEZpbmQubV9kd1N0eWxlczsNCisgICAgICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IGR3T3JpZ2luU3R5bGUgfCBYRkFfUkVTT0xWRU5PREVfQUxMOw0KKyAgICAgICAgWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwocm5kRmluZCk7DQorICAgICAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd09yaWdpblN0eWxlOw0KKyAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gd3NPcmlnaW5Db25kaXRpb247DQorICAgICAgICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgbm9kZXMuQXBwZW5kKHJuZEZpbmQubV9Ob2Rlcyk7DQorICAgICAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgY2hpbGQgPSBjaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gbk51bSkgew0KKyAgICAgIGlmIChtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzVHJhbnNwYXJlbnQocGFyZW50Tm9kZSkpIHsNCisgICAgICAgIENYRkFfTm9kZUFycmF5IHVwQXJyYXlOb2RlczsNCisgICAgICAgIG1fcE5vZGVIZWxwZXItPlhGQV9Db3VudFNpYmxpbmdzKA0KKyAgICAgICAgICAgIChDWEZBX05vZGUqKW5vZGVzWzBdLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsICZ1cEFycmF5Tm9kZXMsDQorICAgICAgICAgICAgZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSA/IFRSVUUgOiBGQUxTRSk7DQorICAgICAgICBpZiAodXBBcnJheU5vZGVzLkdldFNpemUoKSA+IG5vZGVzLkdldFNpemUoKSkgew0KKyAgICAgICAgICB1cEFycmF5Tm9kZXNbMF0gPSAoQ1hGQV9Ob2RlKilub2Rlc1swXTsNCisgICAgICAgICAgbm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgIG5vZGVzLkFwcGVuZCgoQ1hGQV9PYmpBcnJheSYpdXBBcnJheU5vZGVzKTsNCisgICAgICAgICAgdXBBcnJheU5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKHJuZCwgd3NDb25kaXRpb24pOw0KKyAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgIH0NCisgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQpIHsNCisgICAgRlhfRFdPUkQgZHdTdWJTdHlsZXMgPSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllczsNCisgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpIHsNCisgICAgICBkd1N1YlN0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZTsNCisgICAgfQ0KKyAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQUxMKSB7DQorICAgICAgZHdTdWJTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX0FMTDsNCisgICAgfQ0KKyAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd1N1YlN0eWxlczsNCisgICAgcm5kRmluZC5tX0N1ck5vZGUgPSBwYXJlbnROb2RlOw0KKyAgICBDWEZBX05vZGVBcnJheSYgYXJyYXkgPSBybmQubV9wU0MtPkdldFVwT2JqZWN0QXJyYXkoKTsNCisgICAgYXJyYXkuQWRkKHBhcmVudE5vZGUpOw0KICAgICBYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChybmRGaW5kKTsNCiAgICAgaWYgKHJuZEZpbmQubV9Ob2Rlcy5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICBpZih3c0NvbmRpdGlvbi5HZXRMZW5ndGgoKSA9PSAwICYmIHJuZEZpbmQubV9Ob2Rlcy5GaW5kKGN1ck5vZGUpID49IDApIHsNCi0gICAgICAgICAgICBybmQubV9Ob2Rlcy5BZGQoY3VyTm9kZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJuZC5tX05vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOw0KLSAgICAgICAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCi0gICAgICAgIH0NCisgICAgICBub2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsNCisgICAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7DQogICAgIH0NCi0gICAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCisgICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IG5OdW0pIHsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDA7DQogfQ0KLWludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX0ZvckF0dHJpYnV0ZVJzKENYRkFfT2JqZWN0KiBjdXJOb2RlLCBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHJBdHRyKQ0KLXsNCi0gICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gbHBTY3JpcHRBdHRyaWJ1dGUgPSBYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKGN1ck5vZGUtPkdldENsYXNzSUQoKSwgc3RyQXR0cik7DQotICAgIGlmKGxwU2NyaXB0QXR0cmlidXRlKSB7DQotICAgICAgICBybmQubV9wU2NyaXB0QXR0cmlidXRlID0gbHBTY3JpcHRBdHRyaWJ1dGU7DQotICAgICAgICBybmQubV9Ob2Rlcy5BZGQoY3VyTm9kZSk7DQotICAgICAgICBybmQubV9kd0ZsYWcgPSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlOw0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0NCitpbnQzMl90IENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19Bc3RlcmlzaygNCisgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpIHsNCisgIENYRkFfTm9kZSogY3VyTm9kZSA9IChDWEZBX05vZGUqKXJuZC5tX0N1ck5vZGU7DQorICBDWEZBX09iakFycmF5JiBub2RlcyA9IHJuZC5tX05vZGVzOw0KKyAgQ1hGQV9Ob2RlQXJyYXkgYXJyYXk7DQorICBjdXJOb2RlLT5HZXROb2RlTGlzdChhcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuIHwgWEZBX05PREVGSUxURVJfUHJvcGVydGllcyk7DQorICBub2Rlcy5BcHBlbmQoKENYRkFfT2JqQXJyYXkmKWFycmF5KTsNCisgIHJldHVybiBub2Rlcy5HZXRTaXplKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX1BvcFN0YWNrKA0KKyAgICBDRlhfSW50MzJBcnJheSYgc3RhY2spIHsNCisgIGludDMyX3QgblR5cGUgPSAtMTsNCisgIGludDMyX3QgaVNpemUgPSBzdGFjay5HZXRTaXplKCkgLSAxOw0KKyAgaWYgKGlTaXplID4gLTEpIHsNCisgICAgblR5cGUgPSBzdGFja1tpU2l6ZV07DQorICAgIHN0YWNrLlJlbW92ZUF0KGlTaXplLCAxKTsNCisgIH0NCisgIHJldHVybiBuVHlwZTsNCit9DQoraW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfR2V0RmlsdGVyKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXhwcmVzc2lvbiwNCisgICAgaW50MzJfdCBuU3RhcnQsDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBGWFNZU19hc3NlcnQoblN0YXJ0ID4gLTEpOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gd3NFeHByZXNzaW9uLkdldExlbmd0aCgpOw0KKyAgaWYgKG5TdGFydCA+PSBpTGVuZ3RoKSB7DQogICAgIHJldHVybiAwOw0KLX0NCi1pbnQzMl90IENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpDQotew0KLSAgICBpZiAocm5kLm1fbkxldmVsID4gMzIpIHsNCi0gICAgICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSA9IHJuZC5tX3dzTmFtZTsNCisgIENGWF9XaWRlU3RyaW5nJiB3c0NvbmRpdGlvbiA9IHJuZC5tX3dzQ29uZGl0aW9uOw0KKyAgRlhfV0NIQVIqIHBOYW1lQnVmID0gd3NOYW1lLkdldEJ1ZmZlcihpTGVuZ3RoIC0gblN0YXJ0KTsNCisgIEZYX1dDSEFSKiBwQ29uZGl0aW9uQnVmID0gd3NDb25kaXRpb24uR2V0QnVmZmVyKGlMZW5ndGggLSBuU3RhcnQpOw0KKyAgaW50MzJfdCBuQ291bnQgPSAwOw0KKyAgaW50MzJfdCBuTmFtZUNvdW50ID0gMDsNCisgIGludDMyX3QgbkNvbmRpdGlvbkNvdW50ID0gMDsNCisgIENGWF9JbnQzMkFycmF5IHN0YWNrOw0KKyAgaW50MzJfdCBuVHlwZSA9IC0xOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTcmMgPSB3c0V4cHJlc3Npb24uR2V0UHRyKCk7DQorICBGWF9XQ0hBUiB3UHJldiA9IDAsIHdDdXI7DQorICBGWF9CT09MIGJJc0NvbmRpdGlvbiA9IEZBTFNFOw0KKyAgd2hpbGUgKG5TdGFydCA8IGlMZW5ndGgpIHsNCisgICAgd0N1ciA9IHBTcmNbblN0YXJ0KytdOw0KKyAgICBpZiAod0N1ciA9PSAnLicpIHsNCisgICAgICBpZiAod1ByZXYgPT0gJ1xcJykgew0KKyAgICAgICAgcE5hbWVCdWZbbk5hbWVDb3VudCAtIDFdID0gd1ByZXYgPSAnLic7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKG5OYW1lQ291bnQgPT0gMCkgew0KKyAgICAgICAgcE5hbWVCdWZbbk5hbWVDb3VudCsrXSA9IHdDdXI7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgRlhfV0NIQVIgd0xvb2thaGVhZCA9IG5TdGFydCA8IGlMZW5ndGggPyBwU3JjW25TdGFydF0gOiAwOw0KKyAgICAgIGlmICh3TG9va2FoZWFkICE9ICdbJyAmJiB3TG9va2FoZWFkICE9ICcoJykgew0KKyAgICAgICAgaWYgKG5UeXBlIDwgMCkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQogICAgIH0NCi0gICAgaWYoIXJuZC5tX0N1ck5vZGUtPklzTm9kZSgpKSB7DQotICAgICAgICByZXR1cm4gMDsNCisgICAgaWYgKHdDdXIgPT0gJ1snIHx8IHdDdXIgPT0gJygnKSB7DQorICAgICAgYklzQ29uZGl0aW9uID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICh3Q3VyID09ICcuJyAmJiBuU3RhcnQgPCBpTGVuZ3RoICYmDQorICAgICAgICAgICAgICAgKHBTcmNbblN0YXJ0XSA9PSAnWycgfHwgcFNyY1tuU3RhcnRdID09ICcoJykpIHsNCisgICAgICBiSXNDb25kaXRpb24gPSBUUlVFOw0KICAgICB9DQotICAgIENYRkFfTm9kZSogY3VyTm9kZSA9IChDWEZBX05vZGUqKXJuZC5tX0N1ck5vZGU7DQotICAgIENYRkFfT2JqQXJyYXkgJm5vZGVzID0gcm5kLm1fTm9kZXM7DQotICAgIGludDMyX3Qgbk51bSA9IG5vZGVzLkdldFNpemUoKTsNCi0gICAgRlhfRFdPUkQgZHdTdHlsZXMgPSBybmQubV9kd1N0eWxlczsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgJndzTmFtZSA9IHJuZC5tX3dzTmFtZTsNCi0gICAgdWludDMyX3QgdU5hbWVIYXNoID0gcm5kLm1fdUhhc2hOYW1lOw0KLSAgICBDRlhfV2lkZVN0cmluZyAmd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCi0gICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhIHJuZEZpbmQ7DQotICAgIHJuZEZpbmQubV93c05hbWUgPSBybmQubV93c05hbWU7DQotICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHJuZC5tX3dzQ29uZGl0aW9uOw0KLSAgICBybmRGaW5kLm1fcFNDID0gcm5kLm1fcFNDOw0KLSAgICBybmRGaW5kLm1fbkxldmVsID0gcm5kLm1fbkxldmVsICsgMTsNCi0gICAgcm5kRmluZC5tX3VIYXNoTmFtZSA9IHVOYW1lSGFzaDsNCi0gICAgQ1hGQV9Ob2RlQXJyYXkgY2hpbGRyZW47DQotICAgIENYRkFfTm9kZUFycmF5IHByb3BlcnRpZXM7DQotICAgIENYRkFfTm9kZSoJcFZhcmlhYmxlc05vZGUgPSBOVUxMOw0KLSAgICBDWEZBX05vZGUqICBwUGFnZVNldE5vZGUgPSBOVUxMOw0KLSAgICBDWEZBX05vZGUgKnBDaGlsZCA9IGN1ck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgd2hpbGUgKHBDaGlsZCkgew0KLSAgICAgICAgaWYocENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzKSB7DQotICAgICAgICAgICAgcFZhcmlhYmxlc05vZGUgPSBwQ2hpbGQ7DQotICAgICAgICAgICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfSBlbHNlIGlmKHBDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCi0gICAgICAgICAgICBwUGFnZVNldE5vZGUgPSBwQ2hpbGQ7DQotICAgICAgICAgICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoY3VyTm9kZS0+R2V0Q2xhc3NJRCgpLCBwQ2hpbGQtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCi0gICAgICAgICAgICBpZihwUHJvcGVydCkgew0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLkFkZChwQ2hpbGQpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGNoaWxkcmVuLkFkZChwQ2hpbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCi0gICAgfQ0KLSAgICBpZigoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcykgJiYgcFZhcmlhYmxlc05vZGUpIHsNCi0gICAgICAgIHVpbnQzMl90IHVQcm9wSGFzaCA9IHBWYXJpYWJsZXNOb2RlLT5HZXRDbGFzc0hhc2hDb2RlKCk7DQotICAgICAgICBpZiAodVByb3BIYXNoID09IHVOYW1lSGFzaCkgew0KLSAgICAgICAgICAgIG5vZGVzLkFkZChwVmFyaWFibGVzTm9kZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJuZEZpbmQubV9DdXJOb2RlID0gcFZhcmlhYmxlc05vZGU7DQotICAgICAgICAgICAgWEZBX1Jlc29sdmVOb2Rlc19TZXRTdHlsZXNGb3JDaGlsZChkd1N0eWxlcywgcm5kRmluZCk7DQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTYXZlQ29uZGl0aW9uID0gcm5kRmluZC5tX3dzQ29uZGl0aW9uOw0KLSAgICAgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbi5FbXB0eSgpOw0KLSAgICAgICAgICAgIFhGQV9SZXNvbHZlTm9kZXNfTm9ybWFsKHJuZEZpbmQpOw0KLSAgICAgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHdzU2F2ZUNvbmRpdGlvbjsNCi0gICAgICAgICAgICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgbm9kZXMuQXBwZW5kKHJuZEZpbmQubV9Ob2Rlcyk7DQotICAgICAgICAgICAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gbk51bSkgew0KLSAgICAgICAgICAgIFhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24ocm5kLCB3c0NvbmRpdGlvbik7DQotICAgICAgICAgICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbikgew0KLSAgICAgICAgRlhfQk9PTCBiU2V0RmxhZyA9IEZBTFNFOw0KLSAgICAgICAgaWYocFBhZ2VTZXROb2RlICYmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzKSkgew0KLSAgICAgICAgICAgIGNoaWxkcmVuLkFkZChwUGFnZVNldE5vZGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yKGludDMyX3QgaSA9IDA7IGkgPCBjaGlsZHJlbi5HZXRTaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIENYRkFfTm9kZSogY2hpbGQgPSBjaGlsZHJlbltpXTsNCi0gICAgICAgICAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSB1TmFtZUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgICAgIG5vZGVzLkFkZChjaGlsZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgew0KLSAgICAgICAgICAgICAgICBub2Rlcy5BZGQoY2hpbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAobV9wTm9kZUhlbHBlci0+WEZBX05vZGVJc1RyYW5zcGFyZW50KGNoaWxkKSAmJiBjaGlsZC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCi0gICAgICAgICAgICAgICAgaWYoIWJTZXRGbGFnKSB7DQotICAgICAgICAgICAgICAgICAgICBYRkFfUmVzb2x2ZU5vZGVzX1NldFN0eWxlc0ZvckNoaWxkKGR3U3R5bGVzLCBybmRGaW5kKTsNCi0gICAgICAgICAgICAgICAgICAgIGJTZXRGbGFnID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBybmRGaW5kLm1fQ3VyTm9kZSA9IGNoaWxkOw0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NhdmVDb25kaXRpb24gPSBybmRGaW5kLm1fd3NDb25kaXRpb247DQotICAgICAgICAgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbi5FbXB0eSgpOw0KLSAgICAgICAgICAgICAgICBYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChybmRGaW5kKTsNCi0gICAgICAgICAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gd3NTYXZlQ29uZGl0aW9uOw0KLSAgICAgICAgICAgICAgICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIG5vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOw0KLSAgICAgICAgICAgICAgICAgICAgcm5kRmluZC5tX05vZGVzLlJlbW92ZUFsbCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IG5OdW0pIHsNCi0gICAgICAgICAgICBpZighKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FMTCkpIHsNCi0gICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgdXBBcnJheU5vZGVzOw0KLSAgICAgICAgICAgICAgICBpZihtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzVHJhbnNwYXJlbnQoKENYRkFfTm9kZSopY3VyTm9kZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPlhGQV9Db3VudFNpYmxpbmdzKChDWEZBX05vZGUqKW5vZGVzWzBdLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsICZ1cEFycmF5Tm9kZXMsIGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUgPyBUUlVFIDogRkFMU0UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKHVwQXJyYXlOb2Rlcy5HZXRTaXplKCkgPiBub2Rlcy5HZXRTaXplKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHVwQXJyYXlOb2Rlc1swXSA9IChDWEZBX05vZGUqKW5vZGVzWzBdOw0KLSAgICAgICAgICAgICAgICAgICAgbm9kZXMuUmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgICAgICAgICBub2Rlcy5BcHBlbmQoKENYRkFfT2JqQXJyYXkgJil1cEFycmF5Tm9kZXMpOw0KLSAgICAgICAgICAgICAgICAgICAgdXBBcnJheU5vZGVzLlJlbW92ZUFsbCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24ocm5kLCB3c0NvbmRpdGlvbik7DQotICAgICAgICAgICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzKSB7DQotICAgICAgICBpZihYRkFfUmVzb2x2ZU5vZGVzX0ZvckF0dHJpYnV0ZVJzKGN1ck5vZGUsIHJuZCwgd3NOYW1lKSkgew0KLSAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzKSB7DQotICAgICAgICBGWF9CT09MIGJTZXRGbGFnID0gRkFMU0U7DQotICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IHByb3BlcnRpZXMuR2V0U2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIGNoaWxkUHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIGlmKGNoaWxkUHJvcGVydHktPklzVW5uYW1lZCgpKSB7DQotICAgICAgICAgICAgICAgIHVpbnQzMl90IHVQcm9wSGFzaCA9IGNoaWxkUHJvcGVydHktPkdldENsYXNzSGFzaENvZGUoKTsNCi0gICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZU5hbWUgPSBjaGlsZFByb3BlcnR5LT5HZXRDbGFzc0lEKCk7DQotICAgICAgICAgICAgICAgIGlmICh1UHJvcEhhc2ggPT0gdU5hbWVIYXNoKSB7DQotICAgICAgICAgICAgICAgICAgICBub2Rlcy5BZGQoY2hpbGRQcm9wZXJ0eSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2UgaWYoY2hpbGRQcm9wZXJ0eS0+R2V0TmFtZUhhc2goKSA9PSB1TmFtZUhhc2ggJiYgY2hpbGRQcm9wZXJ0eS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0V4dHJhcw0KLSAgICAgICAgICAgICAgICAgICAgICAmJiBjaGlsZFByb3BlcnR5LT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCi0gICAgICAgICAgICAgICAgbm9kZXMuQWRkKGNoaWxkUHJvcGVydHkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiBuTnVtKSB7DQotICAgICAgICAgICAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsNCi0gICAgICAgICAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgICAgICBDWEZBX05vZGUqIHBQcm9wID0gTlVMTDsNCi0gICAgICAgIGlmKFhGQV9FTEVNRU5UX1N1YmZvcm0gPT0gY3VyTm9kZS0+R2V0Q2xhc3NJRCgpICYmIFhGQV9IQVNIQ09ERV9PY2N1ciA9PSB1TmFtZUhhc2gpIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHBJbnN0YW5jZU1hbmFnZXIgPSAoKENYRkFfTm9kZSopY3VyTm9kZSktPkdldEluc3RhbmNlTWdyT2ZTdWJmb3JtKCk7DQotICAgICAgICAgICAgaWYocEluc3RhbmNlTWFuYWdlcikgew0KLSAgICAgICAgICAgICAgICBwUHJvcCA9IHBJbnN0YW5jZU1hbmFnZXItPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX09jY3VyLCBUUlVFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFhGQV9MUENFTEVNRU5USU5GTyBwRWxlbWVudCA9IFhGQV9HZXRFbGVtZW50QnlOYW1lKHdzTmFtZSk7DQotICAgICAgICAgICAgaWYgKHBFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgIHBQcm9wID0gKChDWEZBX05vZGUqKWN1ck5vZGUpLT5HZXRQcm9wZXJ0eSgwLCBwRWxlbWVudC0+ZU5hbWUsIHBFbGVtZW50LT5lTmFtZSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAocFByb3ApIHsNCi0gICAgICAgICAgICBub2Rlcy5BZGQocFByb3ApOw0KLSAgICAgICAgICAgIHJldHVybiBub2Rlcy5HZXRTaXplKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwYXJlbnROb2RlID0gbV9wTm9kZUhlbHBlci0+WEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQoKENYRkFfTm9kZSAqKWN1ck5vZGUsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCi0gICAgdWludDMyX3QgdUN1ckNsYXNzSGFzaCA9IGN1ck5vZGUtPkdldENsYXNzSGFzaENvZGUoKTsNCi0gICAgaWYgKHBhcmVudE5vZGUgPT0gTlVMTCkgew0KLSAgICAgICAgaWYodUN1ckNsYXNzSGFzaCA9PSB1TmFtZUhhc2gpIHsNCi0gICAgICAgICAgICBub2Rlcy5BZGQoKENYRkFfTm9kZSopY3VyTm9kZSk7DQotICAgICAgICAgICAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsNCi0gICAgICAgICAgICBpZihub2Rlcy5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncykgew0KLSAgICAgICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IHBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgICAgIEZYX0RXT1JEIGR3U3ViU3R5bGVzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXM7DQotICAgICAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkgew0KLSAgICAgICAgICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FMTCkgew0KLSAgICAgICAgICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQotICAgICAgICB9DQotICAgICAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd1N1YlN0eWxlczsNCi0gICAgICAgIHdoaWxlIChjaGlsZCkgew0KLSAgICAgICAgICAgIGlmIChjaGlsZCA9PSBjdXJOb2RlKSB7DQotICAgICAgICAgICAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAodUN1ckNsYXNzSGFzaCA9PSB1TmFtZUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5BZGQoY3VyTm9kZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gdU5hbWVIYXNoKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuQWRkKGN1ck5vZGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJuZC5tX25MZXZlbCA9PSAwICYmIHdzQ29uZGl0aW9uLkdldExlbmd0aCgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuUmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLkFkZChjdXJOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSB1TmFtZUhhc2gpIHsNCi0gICAgICAgICAgICAgICAgICAgIG5vZGVzLkFkZChjaGlsZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgew0KLSAgICAgICAgICAgICAgICBub2Rlcy5BZGQoY2hpbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQocGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpLCBjaGlsZC0+R2V0Q2xhc3NJRCgpLCBYRkFfWERQUEFDS0VUX1VOS05PV04pOw0KLSAgICAgICAgICAgIEZYX0JPT0wgYklubmVyU2VhcmNoID0gRkFMU0U7DQotICAgICAgICAgICAgaWYocFByb3BlcnQpIHsNCi0gICAgICAgICAgICAgICAgaWYoKGNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzIHx8IGNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJJbm5lclNlYXJjaCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZihtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzVHJhbnNwYXJlbnQoY2hpbGQpKSB7DQotICAgICAgICAgICAgICAgICAgICBiSW5uZXJTZWFyY2ggPSBUUlVFOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChiSW5uZXJTZWFyY2gpIHsNCi0gICAgICAgICAgICAgICAgcm5kRmluZC5tX0N1ck5vZGUgPSBjaGlsZDsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPcmlnaW5Db25kaXRpb24gPSBybmRGaW5kLm1fd3NDb25kaXRpb247DQotICAgICAgICAgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbi5FbXB0eSgpOw0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCBkd09yaWdpblN0eWxlID0gcm5kRmluZC5tX2R3U3R5bGVzOw0KLSAgICAgICAgICAgICAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd09yaWdpblN0eWxlIHwgWEZBX1JFU09MVkVOT0RFX0FMTDsNCi0gICAgICAgICAgICAgICAgWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwocm5kRmluZCk7DQotICAgICAgICAgICAgICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IGR3T3JpZ2luU3R5bGU7DQotICAgICAgICAgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHdzT3JpZ2luQ29uZGl0aW9uOw0KLSAgICAgICAgICAgICAgICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIG5vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOw0KLSAgICAgICAgICAgICAgICAgICAgcm5kRmluZC5tX05vZGVzLlJlbW92ZUFsbCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gbk51bSkgew0KLSAgICAgICAgICAgIGlmKG1fcE5vZGVIZWxwZXItPlhGQV9Ob2RlSXNUcmFuc3BhcmVudChwYXJlbnROb2RlKSkgew0KLSAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSB1cEFycmF5Tm9kZXM7DQotICAgICAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPlhGQV9Db3VudFNpYmxpbmdzKChDWEZBX05vZGUqKW5vZGVzWzBdLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsICZ1cEFycmF5Tm9kZXMsIGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUgPyBUUlVFIDogRkFMU0UpOw0KLSAgICAgICAgICAgICAgICBpZih1cEFycmF5Tm9kZXMuR2V0U2l6ZSgpID4gbm9kZXMuR2V0U2l6ZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICB1cEFycmF5Tm9kZXNbMF0gPSAoQ1hGQV9Ob2RlKilub2Rlc1swXTsNCi0gICAgICAgICAgICAgICAgICAgIG5vZGVzLlJlbW92ZUFsbCgpOw0KLSAgICAgICAgICAgICAgICAgICAgbm9kZXMuQXBwZW5kKChDWEZBX09iakFycmF5ICYpdXBBcnJheU5vZGVzKTsNCi0gICAgICAgICAgICAgICAgICAgIHVwQXJyYXlOb2Rlcy5SZW1vdmVBbGwoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKHJuZCwgd3NDb25kaXRpb24pOw0KLSAgICAgICAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfUGFyZW50KSB7DQotICAgICAgICBGWF9EV09SRCBkd1N1YlN0eWxlcyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllczsNCi0gICAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7DQotICAgICAgICAgICAgZHdTdWJTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX1RhZ05hbWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQUxMKSB7DQotICAgICAgICAgICAgZHdTdWJTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX0FMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IGR3U3ViU3R5bGVzOw0KLSAgICAgICAgcm5kRmluZC5tX0N1ck5vZGUgPSBwYXJlbnROb2RlOw0KLSAgICAgICAgQ1hGQV9Ob2RlQXJyYXkmIGFycmF5ID0gcm5kLm1fcFNDLT5HZXRVcE9iamVjdEFycmF5KCk7DQotICAgICAgICBhcnJheS5BZGQocGFyZW50Tm9kZSk7DQotICAgICAgICBYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChybmRGaW5kKTsNCi0gICAgICAgIGlmIChybmRGaW5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgIG5vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOw0KLSAgICAgICAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiBuTnVtKSB7DQotICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIDA7DQotfQ0KLWludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX0FzdGVyaXNrKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBjdXJOb2RlID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCi0gICAgQ1hGQV9PYmpBcnJheSAmbm9kZXMgPSBybmQubV9Ob2RlczsNCi0gICAgQ1hGQV9Ob2RlQXJyYXkgYXJyYXk7DQotICAgIGN1ck5vZGUtPkdldE5vZGVMaXN0KGFycmF5LCBYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbiB8IFhGQV9OT0RFRklMVEVSX1Byb3BlcnRpZXMpOw0KLSAgICBub2Rlcy5BcHBlbmQoKENYRkFfT2JqQXJyYXkgJilhcnJheSk7DQotICAgIHJldHVybiBub2Rlcy5HZXRTaXplKCk7DQotfQ0KLWludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX1BvcFN0YWNrKENGWF9JbnQzMkFycmF5ICZzdGFjaykNCi17DQotICAgIGludDMyX3QgblR5cGUgPSAtMTsNCi0gICAgaW50MzJfdCBpU2l6ZSA9IHN0YWNrLkdldFNpemUoKSAtIDE7DQotICAgIGlmIChpU2l6ZSA+IC0xKSB7DQotICAgICAgICBuVHlwZSA9IHN0YWNrW2lTaXplXTsNCi0gICAgICAgIHN0YWNrLlJlbW92ZUF0KGlTaXplLCAxKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gblR5cGU7DQotfQ0KLWludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX0dldEZpbHRlcihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXhwcmVzc2lvbiwgaW50MzJfdCBuU3RhcnQsIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKQ0KLXsNCi0gICAgRlhTWVNfYXNzZXJ0KG5TdGFydCA+IC0xKTsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gd3NFeHByZXNzaW9uLkdldExlbmd0aCgpOw0KLSAgICBpZiAoblN0YXJ0ID49IGlMZW5ndGgpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWUgPSBybmQubV93c05hbWU7DQotICAgIENGWF9XaWRlU3RyaW5nJiB3c0NvbmRpdGlvbiA9IHJuZC5tX3dzQ29uZGl0aW9uOw0KLSAgICBGWF9XQ0hBUiogcE5hbWVCdWYgPSB3c05hbWUuR2V0QnVmZmVyKGlMZW5ndGggLSBuU3RhcnQpOw0KLSAgICBGWF9XQ0hBUiogcENvbmRpdGlvbkJ1ZiA9IHdzQ29uZGl0aW9uLkdldEJ1ZmZlcihpTGVuZ3RoIC0gblN0YXJ0KTsNCi0gICAgaW50MzJfdCBuQ291bnQgPSAwOw0KLSAgICBpbnQzMl90IG5OYW1lQ291bnQgPSAwOw0KLSAgICBpbnQzMl90IG5Db25kaXRpb25Db3VudCA9IDA7DQotICAgIENGWF9JbnQzMkFycmF5IHN0YWNrOw0KLSAgICBpbnQzMl90IG5UeXBlID0gLTE7DQotICAgIGNvbnN0IEZYX1dDSEFSKiBwU3JjID0gd3NFeHByZXNzaW9uLkdldFB0cigpOw0KLSAgICBGWF9XQ0hBUiB3UHJldiA9IDAsIHdDdXI7DQotICAgIEZYX0JPT0wgYklzQ29uZGl0aW9uID0gRkFMU0U7DQotICAgIHdoaWxlIChuU3RhcnQgPCBpTGVuZ3RoKSB7DQotICAgICAgICB3Q3VyID0gcFNyY1tuU3RhcnQgKytdOw0KLSAgICAgICAgaWYgKHdDdXIgPT0gJy4nKSB7DQotICAgICAgICAgICAgaWYgKHdQcmV2ID09ICdcXCcpIHsNCi0gICAgICAgICAgICAgICAgcE5hbWVCdWZbbk5hbWVDb3VudCAtIDFdID0gd1ByZXYgPSAnLic7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihuTmFtZUNvdW50ID09IDApIHsNCi0gICAgICAgICAgICAgICAgcE5hbWVCdWZbbk5hbWVDb3VudCArK10gPSB3Q3VyOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRlhfV0NIQVIgd0xvb2thaGVhZCA9IG5TdGFydCA8IGlMZW5ndGggPyBwU3JjIFtuU3RhcnRdIDogMDsNCi0gICAgICAgICAgICBpZih3TG9va2FoZWFkICE9ICdbJyAmJiB3TG9va2FoZWFkICE9ICcoJykgew0KLSAgICAgICAgICAgICAgICBpZiAoblR5cGUgPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3Q3VyID09ICdbJyB8fCB3Q3VyID09ICcoJykgew0KLSAgICAgICAgICAgIGJJc0NvbmRpdGlvbiA9IFRSVUU7DQotICAgICAgICB9IGVsc2UgaWYgKHdDdXIgPT0gJy4nICYmIG5TdGFydCA8IGlMZW5ndGggJiYgKHBTcmNbblN0YXJ0XSA9PSAnWycgfHwgcFNyY1tuU3RhcnRdID09ICcoJykpIHsNCi0gICAgICAgICAgICBiSXNDb25kaXRpb24gPSBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoYklzQ29uZGl0aW9uKSB7DQotICAgICAgICAgICAgcENvbmRpdGlvbkJ1ZltuQ29uZGl0aW9uQ291bnQgKytdID0gd0N1cjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcE5hbWVCdWZbbk5hbWVDb3VudCArK10gPSB3Q3VyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRlhfQk9PTCBiUmVjdXJzaXZlID0gVFJVRTsNCi0gICAgICAgIHN3aXRjaCAoblR5cGUpIHsNCi0gICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgIGlmICh3Q3VyID09ICddJykgew0KLSAgICAgICAgICAgICAgICAgICAgblR5cGUgPSBYRkFfUmVzb2x2ZU5vZGVzX1BvcFN0YWNrKHN0YWNrKTsNCi0gICAgICAgICAgICAgICAgICAgIGJSZWN1cnNpdmUgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgIGlmICh3Q3VyID09ICcpJykgew0KLSAgICAgICAgICAgICAgICAgICAgblR5cGUgPSBYRkFfUmVzb2x2ZU5vZGVzX1BvcFN0YWNrKHN0YWNrKTsNCi0gICAgICAgICAgICAgICAgICAgIGJSZWN1cnNpdmUgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgIGlmICh3Q3VyID09ICciJykgew0KLSAgICAgICAgICAgICAgICAgICAgblR5cGUgPSBYRkFfUmVzb2x2ZU5vZGVzX1BvcFN0YWNrKHN0YWNrKTsNCi0gICAgICAgICAgICAgICAgICAgIGJSZWN1cnNpdmUgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiUmVjdXJzaXZlKSB7DQotICAgICAgICAgICAgc3dpdGNoICh3Q3VyKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgJ1snOg0KLSAgICAgICAgICAgICAgICAgICAgc3RhY2suQWRkKG5UeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgIG5UeXBlID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICcoJzoNCi0gICAgICAgICAgICAgICAgICAgIHN0YWNrLkFkZChuVHlwZSk7DQotICAgICAgICAgICAgICAgICAgICBuVHlwZSA9IDE7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAnIic6DQotICAgICAgICAgICAgICAgICAgICBzdGFjay5BZGQoblR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgblR5cGUgPSAyOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgd1ByZXYgPSB3Q3VyOw0KLSAgICB9DQotICAgIGlmIChzdGFjay5HZXRTaXplKCkgPiAwKSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgd3NOYW1lLlJlbGVhc2VCdWZmZXIobk5hbWVDb3VudCk7DQotICAgIHdzTmFtZS5UcmltTGVmdCgpOw0KLSAgICB3c05hbWUuVHJpbVJpZ2h0KCk7DQotICAgIHdzQ29uZGl0aW9uLlJlbGVhc2VCdWZmZXIobkNvbmRpdGlvbkNvdW50KTsNCi0gICAgd3NDb25kaXRpb24uVHJpbUxlZnQoKTsNCi0gICAgd3NDb25kaXRpb24uVHJpbVJpZ2h0KCk7DQotICAgIHJuZC5tX3VIYXNoTmFtZSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZSwgd3NOYW1lLkdldExlbmd0aCgpKTsNCi0gICAgcmV0dXJuIG5TdGFydDsNCi19DQotdm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZV9Db25kaXRpb25BcnJheShpbnQzMl90IGlDdXJJbmRleCwgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sIGludDMyX3QgaUZvdW5kQ291bnQsIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlQXJyYXkgJmZpbmROb2RlcyA9IChDWEZBX05vZGVBcnJheSYpcm5kLm1fTm9kZXM7DQotICAgIGludDMyX3QgaUxlbiA9IHdzQ29uZGl0aW9uLkdldExlbmd0aCgpOw0KLSAgICBGWF9CT09MIGJSZWxhdGl2ZSA9IEZBTFNFOw0KLSAgICBGWF9CT09MIGJBbGwgPSBGQUxTRTsNCi0gICAgaW50MzJfdCBpID0gMTsNCi0gICAgZm9yICg7IGkgPCBpTGVuOyArK2kpIHsNCi0gICAgICAgIEZYX1dDSEFSIGNoID0gd3NDb25kaXRpb25baV07DQotICAgICAgICBpZiAoY2ggPT0gJyAnKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoY2ggPT0gJysnIHx8IGNoID09ICctJykgew0KLSAgICAgICAgICAgIGJSZWxhdGl2ZSA9IFRSVUU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcqJykgew0KLSAgICAgICAgICAgIGJBbGwgPSBUUlVFOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoYkFsbCkgew0KLSAgICAgICAgaWYocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgew0KLSAgICAgICAgICAgIGlmKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0JpbmQpIHsNCi0gICAgICAgICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50ID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCi0gICAgICAgICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3JlYXRlQ291bnQgPSAxOw0KLSAgICAgICAgICAgICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID0gLTE7DQotICAgICAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPm1fcEFsbFN0YXJ0UGFyZW50ID0gTlVMTDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZihtX3BOb2RlSGVscGVyLT5tX2lDdXJBbGxTdGFydCA9PSAtMSkgew0KLSAgICAgICAgICAgICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgPSBtX2lDdXJTdGFydDsNCi0gICAgICAgICAgICAgICAgICAgIG1fcE5vZGVIZWxwZXItPm1fcEFsbFN0YXJ0UGFyZW50ID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZihybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9CaW5kTmV3KSB7DQotICAgICAgICAgICAgaWYobV9wTm9kZUhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgPT0gLTEpIHsNCi0gICAgICAgICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgPSBtX2lDdXJTdGFydDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgaWYgKGlGb3VuZENvdW50ID09IDEgJiYgIWlMZW4pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0luZGV4Ow0KLSAgICB3c0luZGV4ID0gd3NDb25kaXRpb24uTWlkKGksIGlMZW4gLSAxIC0gaSk7DQotICAgIGludDMyX3QgaUluZGV4ID0gd3NJbmRleC5HZXRJbnRlZ2VyKCk7DQotICAgIGlmIChiUmVsYXRpdmUpIHsNCi0gICAgICAgIGlJbmRleCArPSBpQ3VySW5kZXg7DQotICAgIH0NCi0gICAgaWYgKGlGb3VuZENvdW50IDw9IGlJbmRleCB8fCBpSW5kZXggPCAwKSB7DQotICAgICAgICBpZihybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSB7DQotICAgICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50ID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCi0gICAgICAgICAgICBtX3BOb2RlSGVscGVyLT5tX2lDcmVhdGVDb3VudCA9IGlJbmRleCAtIGlGb3VuZENvdW50ICsgMTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgaWYgKGJJc0NvbmRpdGlvbikgew0KKyAgICAgIHBDb25kaXRpb25CdWZbbkNvbmRpdGlvbkNvdW50KytdID0gd0N1cjsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIENYRkFfTm9kZSogcmV0ID0gZmluZE5vZGVzW2lJbmRleF07DQotICAgICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7DQotICAgICAgICBmaW5kTm9kZXMuQWRkKHJldCk7DQorICAgICAgcE5hbWVCdWZbbk5hbWVDb3VudCsrXSA9IHdDdXI7DQogICAgIH0NCi19DQotdm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZV9Eb1ByZWRpY2F0ZUZpbHRlcihpbnQzMl90IGlDdXJJbmRleCwgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sIGludDMyX3QgaUZvdW5kQ291bnQsIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlQXJyYXkgJmZpbmROb2RlcyA9IChDWEZBX05vZGVBcnJheSYpcm5kLm1fTm9kZXM7DQotICAgIEZYU1lTX2Fzc2VydChpRm91bmRDb3VudCA9PSBmaW5kTm9kZXMuR2V0U2l6ZSgpKTsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KLSAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBDb250ZXh0ID0gTlVMTDsNCi0gICAgWEZBX1NDUklQVExBTkdUWVBFIGVMYW5nVHlwZSA9IFhGQV9TQ1JJUFRMQU5HVFlQRV9Vbmtvd247DQotICAgIGlmICh3c0NvbmRpdGlvbi5MZWZ0KDIpID09IEZYX1dTVFJDKEwiLlsiKSAmJiB3c0NvbmRpdGlvbi5SaWdodCgxKSA9PSBGWF9XU1RSQyhMIl0iKSkgew0KLSAgICAgICAgZUxhbmdUeXBlID0gWEZBX1NDUklQVExBTkdUWVBFX0Zvcm1jYWxjOw0KLSAgICB9IGVsc2UgaWYgKHdzQ29uZGl0aW9uLkxlZnQoMikgPT0gRlhfV1NUUkMoTCIuKCIpICYmIHdzQ29uZGl0aW9uLlJpZ2h0KDEpID09IEZYX1dTVFJDKEwiKSIpKSB7DQotICAgICAgICBlTGFuZ1R5cGUgPSBYRkFfU0NSSVBUTEFOR1RZUEVfSmF2YXNjcmlwdDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwQ29udGV4dCA9IHJuZC5tX3BTQzsNCi0gICAgd3NFeHByZXNzaW9uID0gd3NDb25kaXRpb24uTWlkKDIsIHdzQ29uZGl0aW9uLkdldExlbmd0aCgpIC0gMyk7DQotICAgIGZvcihpbnQzMl90IGkgPSBpRm91bmRDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7DQotICAgICAgICBDWEZBX09iamVjdCogbm9kZSA9IGZpbmROb2Rlc1tpXTsNCi0gICAgICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KLSAgICAgICAgRlhKU0VfSFZBTFVFIHBSZXRWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShybmQubV9wU0MtPkdldFJ1bnRpbWUoKSk7DQotICAgICAgICBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChlTGFuZ1R5cGUsIHdzRXhwcmVzc2lvbiwgcFJldFZhbHVlLCBub2RlKTsNCi0gICAgICAgIGlmKCFiUmV0IHx8ICFGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4ocFJldFZhbHVlKSkgew0KLSAgICAgICAgICAgIGZpbmROb2Rlcy5SZW1vdmVBdChpKTsNCisgICAgRlhfQk9PTCBiUmVjdXJzaXZlID0gVFJVRTsNCisgICAgc3dpdGNoIChuVHlwZSkgew0KKyAgICAgIGNhc2UgMDoNCisgICAgICAgIGlmICh3Q3VyID09ICddJykgew0KKyAgICAgICAgICBuVHlwZSA9IFhGQV9SZXNvbHZlTm9kZXNfUG9wU3RhY2soc3RhY2spOw0KKyAgICAgICAgICBiUmVjdXJzaXZlID0gRkFMU0U7DQogICAgICAgICB9DQotICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHBSZXRWYWx1ZSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDE6DQorICAgICAgICBpZiAod0N1ciA9PSAnKScpIHsNCisgICAgICAgICAgblR5cGUgPSBYRkFfUmVzb2x2ZU5vZGVzX1BvcFN0YWNrKHN0YWNrKTsNCisgICAgICAgICAgYlJlY3Vyc2l2ZSA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAyOg0KKyAgICAgICAgaWYgKHdDdXIgPT0gJyInKSB7DQorICAgICAgICAgIG5UeXBlID0gWEZBX1Jlc29sdmVOb2Rlc19Qb3BTdGFjayhzdGFjayk7DQorICAgICAgICAgIGJSZWN1cnNpdmUgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChiUmVjdXJzaXZlKSB7DQorICAgICAgc3dpdGNoICh3Q3VyKSB7DQorICAgICAgICBjYXNlICdbJzoNCisgICAgICAgICAgc3RhY2suQWRkKG5UeXBlKTsNCisgICAgICAgICAgblR5cGUgPSAwOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJygnOg0KKyAgICAgICAgICBzdGFjay5BZGQoblR5cGUpOw0KKyAgICAgICAgICBuVHlwZSA9IDE7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnIic6DQorICAgICAgICAgIHN0YWNrLkFkZChuVHlwZSk7DQorICAgICAgICAgIG5UeXBlID0gMjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHdQcmV2ID0gd0N1cjsNCisgIH0NCisgIGlmIChzdGFjay5HZXRTaXplKCkgPiAwKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIHdzTmFtZS5SZWxlYXNlQnVmZmVyKG5OYW1lQ291bnQpOw0KKyAgd3NOYW1lLlRyaW1MZWZ0KCk7DQorICB3c05hbWUuVHJpbVJpZ2h0KCk7DQorICB3c0NvbmRpdGlvbi5SZWxlYXNlQnVmZmVyKG5Db25kaXRpb25Db3VudCk7DQorICB3c0NvbmRpdGlvbi5UcmltTGVmdCgpOw0KKyAgd3NDb25kaXRpb24uVHJpbVJpZ2h0KCk7DQorICBybmQubV91SGFzaE5hbWUgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUsIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQorICByZXR1cm4gblN0YXJ0Ow0KK30NCit2b2lkIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2RlX0NvbmRpdGlvbkFycmF5KA0KKyAgICBpbnQzMl90IGlDdXJJbmRleCwNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sDQorICAgIGludDMyX3QgaUZvdW5kQ291bnQsDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBDWEZBX05vZGVBcnJheSYgZmluZE5vZGVzID0gKENYRkFfTm9kZUFycmF5JilybmQubV9Ob2RlczsNCisgIGludDMyX3QgaUxlbiA9IHdzQ29uZGl0aW9uLkdldExlbmd0aCgpOw0KKyAgRlhfQk9PTCBiUmVsYXRpdmUgPSBGQUxTRTsNCisgIEZYX0JPT0wgYkFsbCA9IEZBTFNFOw0KKyAgaW50MzJfdCBpID0gMTsNCisgIGZvciAoOyBpIDwgaUxlbjsgKytpKSB7DQorICAgIEZYX1dDSEFSIGNoID0gd3NDb25kaXRpb25baV07DQorICAgIGlmIChjaCA9PSAnICcpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoY2ggPT0gJysnIHx8IGNoID09ICctJykgew0KKyAgICAgIGJSZWxhdGl2ZSA9IFRSVUU7DQorICAgICAgYnJlYWs7DQorICAgIH0gZWxzZSBpZiAoY2ggPT0gJyonKSB7DQorICAgICAgYkFsbCA9IFRSVUU7DQorICAgICAgYnJlYWs7DQorICAgIH0gZWxzZSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChiQWxsKSB7DQorICAgIGlmIChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSB7DQorICAgICAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0JpbmQpIHsNCisgICAgICAgIG1fcE5vZGVIZWxwZXItPm1fcENyZWF0ZVBhcmVudCA9IChDWEZBX05vZGUqKXJuZC5tX0N1ck5vZGU7DQorICAgICAgICBtX3BOb2RlSGVscGVyLT5tX2lDcmVhdGVDb3VudCA9IDE7DQorICAgICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICBtX3BOb2RlSGVscGVyLT5tX2lDdXJBbGxTdGFydCA9IC0xOw0KKyAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQWxsU3RhcnRQYXJlbnQgPSBOVUxMOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9wTm9kZUhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgPT0gLTEpIHsNCisgICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgPSBtX2lDdXJTdGFydDsNCisgICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQWxsU3RhcnRQYXJlbnQgPSAoQ1hGQV9Ob2RlKilybmQubV9DdXJOb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9CaW5kTmV3KSB7DQorICAgICAgaWYgKG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID09IC0xKSB7DQorICAgICAgICBtX3BOb2RlSGVscGVyLT5tX2lDdXJBbGxTdGFydCA9IG1faUN1clN0YXJ0Ow0KKyAgICAgIH0NCiAgICAgfQ0KICAgICByZXR1cm47DQorICB9DQorICBpZiAoaUZvdW5kQ291bnQgPT0gMSAmJiAhaUxlbikgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0luZGV4Ow0KKyAgd3NJbmRleCA9IHdzQ29uZGl0aW9uLk1pZChpLCBpTGVuIC0gMSAtIGkpOw0KKyAgaW50MzJfdCBpSW5kZXggPSB3c0luZGV4LkdldEludGVnZXIoKTsNCisgIGlmIChiUmVsYXRpdmUpIHsNCisgICAgaUluZGV4ICs9IGlDdXJJbmRleDsNCisgIH0NCisgIGlmIChpRm91bmRDb3VudCA8PSBpSW5kZXggfHwgaUluZGV4IDwgMCkgew0KKyAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgew0KKyAgICAgIG1fcE5vZGVIZWxwZXItPm1fcENyZWF0ZVBhcmVudCA9IChDWEZBX05vZGUqKXJuZC5tX0N1ck5vZGU7DQorICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3JlYXRlQ291bnQgPSBpSW5kZXggLSBpRm91bmRDb3VudCArIDE7DQorICAgIH0NCisgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9Ob2RlKiByZXQgPSBmaW5kTm9kZXNbaUluZGV4XTsNCisgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICBmaW5kTm9kZXMuQWRkKHJldCk7DQorICB9DQogfQ0KLXZvaWQgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kLCBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbikNCi17DQotICAgIENYRkFfTm9kZUFycmF5ICZmaW5kTm9kZXMgPSAoQ1hGQV9Ob2RlQXJyYXkmKXJuZC5tX05vZGVzOw0KLSAgICBpbnQzMl90IGlDdXJySW5kZXggPSAwOw0KLSAgICBjb25zdCBDWEZBX05vZGVBcnJheSAmYXJyYXkgPSBybmQubV9wU0MtPkdldFVwT2JqZWN0QXJyYXkoKTsNCi0gICAgaW50MzJfdCBpU2l6ZSA9IGFycmF5LkdldFNpemUoKTsNCi0gICAgaWYgKGlTaXplKSB7DQotICAgICAgICBDWEZBX05vZGUqIGN1ck5vZGUgPSBhcnJheVtpU2l6ZSAtIDFdOw0KLSAgICAgICAgRlhfQk9PTCBiSXNQcm9wZXJ0eSA9ICBtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzUHJvcGVydHkoY3VyTm9kZSk7DQotICAgICAgICBpZihjdXJOb2RlLT5Jc1VubmFtZWQoKSB8fCAoYklzUHJvcGVydHkgJiYgY3VyTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VTZXQpKSB7DQotICAgICAgICAgICAgaUN1cnJJbmRleCA9IG1fcE5vZGVIZWxwZXItPlhGQV9HZXRJbmRleChjdXJOb2RlLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsIGJJc1Byb3BlcnR5LCBUUlVFKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaUN1cnJJbmRleCA9IG1fcE5vZGVIZWxwZXItPlhGQV9HZXRJbmRleChjdXJOb2RlLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsIGJJc1Byb3BlcnR5LCBGQUxTRSk7DQotICAgICAgICB9DQordm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZV9Eb1ByZWRpY2F0ZUZpbHRlcigNCisgICAgaW50MzJfdCBpQ3VySW5kZXgsDQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uLA0KKyAgICBpbnQzMl90IGlGb3VuZENvdW50LA0KKyAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCkgew0KKyAgQ1hGQV9Ob2RlQXJyYXkmIGZpbmROb2RlcyA9IChDWEZBX05vZGVBcnJheSYpcm5kLm1fTm9kZXM7DQorICBGWFNZU19hc3NlcnQoaUZvdW5kQ291bnQgPT0gZmluZE5vZGVzLkdldFNpemUoKSk7DQorICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICBJWEZBX1NjcmlwdENvbnRleHQqIHBDb250ZXh0ID0gTlVMTDsNCisgIFhGQV9TQ1JJUFRMQU5HVFlQRSBlTGFuZ1R5cGUgPSBYRkFfU0NSSVBUTEFOR1RZUEVfVW5rb3duOw0KKyAgaWYgKHdzQ29uZGl0aW9uLkxlZnQoMikgPT0gRlhfV1NUUkMoTCIuWyIpICYmDQorICAgICAgd3NDb25kaXRpb24uUmlnaHQoMSkgPT0gRlhfV1NUUkMoTCJdIikpIHsNCisgICAgZUxhbmdUeXBlID0gWEZBX1NDUklQVExBTkdUWVBFX0Zvcm1jYWxjOw0KKyAgfSBlbHNlIGlmICh3c0NvbmRpdGlvbi5MZWZ0KDIpID09IEZYX1dTVFJDKEwiLigiKSAmJg0KKyAgICAgICAgICAgICB3c0NvbmRpdGlvbi5SaWdodCgxKSA9PSBGWF9XU1RSQyhMIikiKSkgew0KKyAgICBlTGFuZ1R5cGUgPSBYRkFfU0NSSVBUTEFOR1RZUEVfSmF2YXNjcmlwdDsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBDb250ZXh0ID0gcm5kLm1fcFNDOw0KKyAgd3NFeHByZXNzaW9uID0gd3NDb25kaXRpb24uTWlkKDIsIHdzQ29uZGl0aW9uLkdldExlbmd0aCgpIC0gMyk7DQorICBmb3IgKGludDMyX3QgaSA9IGlGb3VuZENvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsNCisgICAgQ1hGQV9PYmplY3QqIG5vZGUgPSBmaW5kTm9kZXNbaV07DQorICAgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgICBGWEpTRV9IVkFMVUUgcFJldFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKHJuZC5tX3BTQy0+R2V0UnVudGltZSgpKTsNCisgICAgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoZUxhbmdUeXBlLCB3c0V4cHJlc3Npb24sIHBSZXRWYWx1ZSwgbm9kZSk7DQorICAgIGlmICghYlJldCB8fCAhRlhKU0VfVmFsdWVfVG9Cb29sZWFuKHBSZXRWYWx1ZSkpIHsNCisgICAgICBmaW5kTm9kZXMuUmVtb3ZlQXQoaSk7DQogICAgIH0NCi0gICAgaW50MzJfdCBpRm91bmRDb3VudCA9IGZpbmROb2Rlcy5HZXRTaXplKCk7DQotICAgIHdzQ29uZGl0aW9uLlRyaW1MZWZ0KCk7DQotICAgIHdzQ29uZGl0aW9uLlRyaW1SaWdodCgpOw0KLSAgICBpbnQzMl90IGlMZW4gPSB3c0NvbmRpdGlvbi5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKCFpTGVuKSB7DQotICAgICAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQUxMKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlGb3VuZENvdW50ID09IDEpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBpZiAoaUZvdW5kQ291bnQgPD0gaUN1cnJJbmRleCkgew0KLSAgICAgICAgICAgIGlmKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpIHsNCi0gICAgICAgICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50ID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCi0gICAgICAgICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3JlYXRlQ291bnQgPSBpQ3VyckluZGV4IC0gaUZvdW5kQ291bnQgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBDWEZBX05vZGUqIHJldCA9IGZpbmROb2Rlc1tpQ3VyckluZGV4XTsNCi0gICAgICAgICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7DQotICAgICAgICAgICAgZmluZE5vZGVzLkFkZChyZXQpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBGWF9XQ0hBUiB3VHlwZUNoYXIgPSB3c0NvbmRpdGlvblswXTsNCi0gICAgc3dpdGNoICh3VHlwZUNoYXIpIHsNCi0gICAgICAgIGNhc2UgJ1snOg0KLSAgICAgICAgICAgIFhGQV9SZXNvbHZlTm9kZV9Db25kaXRpb25BcnJheShpQ3VyckluZGV4LCB3c0NvbmRpdGlvbiwgaUZvdW5kQ291bnQsIHJuZCk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgY2FzZSAnKCc6DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgY2FzZSAnIic6DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgY2FzZSAnLic6DQotICAgICAgICAgICAgaWYoaUxlbiA+IDEgJiYgKHdzQ29uZGl0aW9uWzFdID09ICdbJyB8fCB3c0NvbmRpdGlvblsxXSA9PSAnKCcpKSB7DQotICAgICAgICAgICAgICAgIFhGQV9SZXNvbHZlTm9kZV9Eb1ByZWRpY2F0ZUZpbHRlcihpQ3VyckluZGV4LCB3c0NvbmRpdGlvbiwgaUZvdW5kQ291bnQsIHJuZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm47DQotICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwUmV0VmFsdWUpOw0KKyAgfQ0KKyAgcmV0dXJuOw0KIH0NCi12b2lkIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19TZXRTdHlsZXNGb3JDaGlsZChGWF9EV09SRCBkd1BhcmVudFN0eWxlcywgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpDQotew0KLSAgICBGWF9EV09SRCBkd1N1YlN0eWxlcyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbjsNCi0gICAgaWYgKGR3UGFyZW50U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpIHsNCi0gICAgICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lOw0KLSAgICB9DQotICAgIGR3U3ViU3R5bGVzICY9IH5YRkFfUkVTT0xWRU5PREVfUGFyZW50Ow0KLSAgICBkd1N1YlN0eWxlcyAmPSB+WEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KLSAgICBkd1N1YlN0eWxlcyAmPSB+WEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXM7DQotICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQotICAgIHJuZC5tX2R3U3R5bGVzID0gZHdTdWJTdHlsZXM7DQotfQ0KLWludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVfU2V0UmVzdWx0Q3JlYXRlTm9kZShYRkFfUkVTT0xWRU5PREVfUlMmIHJlc29sdmVOb2RlUlMsIENGWF9XaWRlU3RyaW5nICZ3c0xhc3RDb25kaXRpb24pDQotew0KLSAgICBpZihtX3BOb2RlSGVscGVyLT5tX3BDcmVhdGVQYXJlbnQpIHsNCi0gICAgICAgIHJlc29sdmVOb2RlUlMubm9kZXMuQWRkKG1fcE5vZGVIZWxwZXItPm1fcENyZWF0ZVBhcmVudCk7DQordm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24oDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kLA0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbikgew0KKyAgQ1hGQV9Ob2RlQXJyYXkmIGZpbmROb2RlcyA9IChDWEZBX05vZGVBcnJheSYpcm5kLm1fTm9kZXM7DQorICBpbnQzMl90IGlDdXJySW5kZXggPSAwOw0KKyAgY29uc3QgQ1hGQV9Ob2RlQXJyYXkmIGFycmF5ID0gcm5kLm1fcFNDLT5HZXRVcE9iamVjdEFycmF5KCk7DQorICBpbnQzMl90IGlTaXplID0gYXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKGlTaXplKSB7DQorICAgIENYRkFfTm9kZSogY3VyTm9kZSA9IGFycmF5W2lTaXplIC0gMV07DQorICAgIEZYX0JPT0wgYklzUHJvcGVydHkgPSBtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzUHJvcGVydHkoY3VyTm9kZSk7DQorICAgIGlmIChjdXJOb2RlLT5Jc1VubmFtZWQoKSB8fA0KKyAgICAgICAgKGJJc1Byb3BlcnR5ICYmIGN1ck5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0KSkgew0KKyAgICAgIGlDdXJySW5kZXggPSBtX3BOb2RlSGVscGVyLT5YRkFfR2V0SW5kZXgoY3VyTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklzUHJvcGVydHksIFRSVUUpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgbV9wTm9kZUhlbHBlci0+WEZBX0NyZWF0ZU5vZGVfRm9yQ29uZGl0aW9uKHdzTGFzdENvbmRpdGlvbik7DQorICAgICAgaUN1cnJJbmRleCA9IG1fcE5vZGVIZWxwZXItPlhGQV9HZXRJbmRleChjdXJOb2RlLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXNQcm9wZXJ0eSwgRkFMU0UpOw0KICAgICB9DQotICAgIHJlc29sdmVOb2RlUlMuZHdGbGFncyA9IG1fcE5vZGVIZWxwZXItPm1faUNyZWF0ZUZsYWc7DQotICAgIGlmKHJlc29sdmVOb2RlUlMuZHdGbGFncyA9PSBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVPbmUpIHsNCi0gICAgICAgIGlmKG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ICE9IC0xKSB7DQotICAgICAgICAgICAgcmVzb2x2ZU5vZGVSUy5kd0ZsYWdzID0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlTWlkQWxsOw0KLSAgICAgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpRm91bmRDb3VudCA9IGZpbmROb2Rlcy5HZXRTaXplKCk7DQorICB3c0NvbmRpdGlvbi5UcmltTGVmdCgpOw0KKyAgd3NDb25kaXRpb24uVHJpbVJpZ2h0KCk7DQorICBpbnQzMl90IGlMZW4gPSB3c0NvbmRpdGlvbi5HZXRMZW5ndGgoKTsNCisgIGlmICghaUxlbikgew0KKyAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQUxMKSB7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQotICAgIHJldHVybiByZXNvbHZlTm9kZVJTLm5vZGVzLkdldFNpemUoKTsNCi19DQotdm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZV9TZXRJbmRleERhdGFCaW5kKENGWF9XaWRlU3RyaW5nICZ3c05leHRDb25kaXRpb24sIGludDMyX3QgJmlJbmRleCwgaW50MzJfdCBpQ291bnQpDQotew0KLSAgICBpZihtX3BOb2RlSGVscGVyLT5YRkFfQ3JlYXRlTm9kZV9Gb3JDb25kaXRpb24od3NOZXh0Q29uZGl0aW9uKSkgew0KLSAgICAgICAgaWYobV9wTm9kZUhlbHBlci0+bV9lTGFzdENyZWF0ZVR5cGUgPT0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwKSB7DQotICAgICAgICAgICAgaUluZGV4ID0gMDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaUluZGV4ID0gaUNvdW50IC0gMTsNCi0gICAgICAgIH0NCisgICAgaWYgKGlGb3VuZENvdW50ID09IDEpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKGlGb3VuZENvdW50IDw9IGlDdXJySW5kZXgpIHsNCisgICAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgew0KKyAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50ID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCisgICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUNyZWF0ZUNvdW50ID0gaUN1cnJJbmRleCAtIGlGb3VuZENvdW50ICsgMTsNCisgICAgICB9DQorICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgIHJldHVybjsNCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIGlJbmRleCA9IGlDb3VudCAtIDE7DQorICAgICAgQ1hGQV9Ob2RlKiByZXQgPSBmaW5kTm9kZXNbaUN1cnJJbmRleF07DQorICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgIGZpbmROb2Rlcy5BZGQocmV0KTsNCisgICAgICByZXR1cm47DQogICAgIH0NCisgIH0NCisgIEZYX1dDSEFSIHdUeXBlQ2hhciA9IHdzQ29uZGl0aW9uWzBdOw0KKyAgc3dpdGNoICh3VHlwZUNoYXIpIHsNCisgICAgY2FzZSAnWyc6DQorICAgICAgWEZBX1Jlc29sdmVOb2RlX0NvbmRpdGlvbkFycmF5KGlDdXJySW5kZXgsIHdzQ29uZGl0aW9uLCBpRm91bmRDb3VudCwgcm5kKTsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgJygnOg0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSAnIic6DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlICcuJzoNCisgICAgICBpZiAoaUxlbiA+IDEgJiYgKHdzQ29uZGl0aW9uWzFdID09ICdbJyB8fCB3c0NvbmRpdGlvblsxXSA9PSAnKCcpKSB7DQorICAgICAgICBYRkFfUmVzb2x2ZU5vZGVfRG9QcmVkaWNhdGVGaWx0ZXIoaUN1cnJJbmRleCwgd3NDb25kaXRpb24sIGlGb3VuZENvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZCk7DQorICAgICAgfQ0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybjsNCisgIH0NCit9DQordm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfU2V0U3R5bGVzRm9yQ2hpbGQoDQorICAgIEZYX0RXT1JEIGR3UGFyZW50U3R5bGVzLA0KKyAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCkgew0KKyAgRlhfRFdPUkQgZHdTdWJTdHlsZXMgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW47DQorICBpZiAoZHdQYXJlbnRTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkgew0KKyAgICBkd1N1YlN0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZTsNCisgIH0NCisgIGR3U3ViU3R5bGVzICY9IH5YRkFfUkVTT0xWRU5PREVfUGFyZW50Ow0KKyAgZHdTdWJTdHlsZXMgJj0gflhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCisgIGR3U3ViU3R5bGVzICY9IH5YRkFfUkVTT0xWRU5PREVfUHJvcGVydGllczsNCisgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQorICBybmQubV9kd1N0eWxlcyA9IGR3U3ViU3R5bGVzOw0KK30NCitpbnQzMl90IENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2RlX1NldFJlc3VsdENyZWF0ZU5vZGUoDQorICAgIFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb2x2ZU5vZGVSUywNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTGFzdENvbmRpdGlvbikgew0KKyAgaWYgKG1fcE5vZGVIZWxwZXItPm1fcENyZWF0ZVBhcmVudCkgew0KKyAgICByZXNvbHZlTm9kZVJTLm5vZGVzLkFkZChtX3BOb2RlSGVscGVyLT5tX3BDcmVhdGVQYXJlbnQpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wTm9kZUhlbHBlci0+WEZBX0NyZWF0ZU5vZGVfRm9yQ29uZGl0aW9uKHdzTGFzdENvbmRpdGlvbik7DQorICB9DQorICByZXNvbHZlTm9kZVJTLmR3RmxhZ3MgPSBtX3BOb2RlSGVscGVyLT5tX2lDcmVhdGVGbGFnOw0KKyAgaWYgKHJlc29sdmVOb2RlUlMuZHdGbGFncyA9PSBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVPbmUpIHsNCisgICAgaWYgKG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ICE9IC0xKSB7DQorICAgICAgcmVzb2x2ZU5vZGVSUy5kd0ZsYWdzID0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlTWlkQWxsOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcmVzb2x2ZU5vZGVSUy5ub2Rlcy5HZXRTaXplKCk7DQorfQ0KK3ZvaWQgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVfU2V0SW5kZXhEYXRhQmluZCgNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmV4dENvbmRpdGlvbiwNCisgICAgaW50MzJfdCYgaUluZGV4LA0KKyAgICBpbnQzMl90IGlDb3VudCkgew0KKyAgaWYgKG1fcE5vZGVIZWxwZXItPlhGQV9DcmVhdGVOb2RlX0ZvckNvbmRpdGlvbih3c05leHRDb25kaXRpb24pKSB7DQorICAgIGlmIChtX3BOb2RlSGVscGVyLT5tX2VMYXN0Q3JlYXRlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhR3JvdXApIHsNCisgICAgICBpSW5kZXggPSAwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlJbmRleCA9IGlDb3VudCAtIDE7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlJbmRleCA9IGlDb3VudCAtIDE7DQorICB9DQogfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfcmVzb2x2ZXByb2Nlc3Nvci5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmgKaW5kZXggZmMxM2FhOS4uMmUxZjI1NCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmgKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmgKQEAgLTgsNjUgKzgsNzIgQEAKICNkZWZpbmUgX1hGQV9SRVNPTFZFUFJPQ0VTU09SX0hfDQogY2xhc3MgQ1hGQV9Ob2RlSGVscGVyOw0KIGNsYXNzIENYRkFfU2NyaXB0Q29udGV4dDsNCi1jbGFzcyBDWEZBX1Jlc29sdmVOb2Rlc0RhdGENCi17DQotcHVibGljOg0KLSAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEoQ1hGQV9TY3JpcHRDb250ZXh0ICpwU0MgPSBOVUxMKQ0KLSAgICAgICAgOiBtX3BTQyhwU0MpDQotICAgICAgICAsIG1fQ3VyTm9kZShOVUxMKQ0KLSAgICAgICAgLCBtX3dzTmFtZSgpDQotICAgICAgICAsIG1fdUhhc2hOYW1lKDApDQotICAgICAgICAsIG1fd3NDb25kaXRpb24oKQ0KLSAgICAgICAgLCBtX25MZXZlbCgwKQ0KLSAgICAgICAgLCBtX05vZGVzKCkNCi0gICAgICAgICwgbV9kd1N0eWxlcyhYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4pDQotICAgICAgICAsIG1fcFNjcmlwdEF0dHJpYnV0ZShOVUxMKQ0KLSAgICAgICAgLCBtX2R3RmxhZyhYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMpDQotICAgIHsNCi0gICAgfQ0KLSAgICB+Q1hGQV9SZXNvbHZlTm9kZXNEYXRhKCkNCi0gICAgew0KLSAgICAgICAgbV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCi0gICAgfQ0KLSAgICBDWEZBX1NjcmlwdENvbnRleHQqCQkJbV9wU0M7DQotICAgIENYRkFfT2JqZWN0KgkJCQltX0N1ck5vZGU7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJCW1fd3NOYW1lOw0KLSAgICB1aW50MzJfdAkJCQkJbV91SGFzaE5hbWU7DQotICAgIENGWF9XaWRlU3RyaW5nCQkJCW1fd3NDb25kaXRpb247DQotICAgIGludDMyX3QJCQkJCW1fbkxldmVsOw0KLSAgICBDWEZBX09iakFycmF5CQkJCW1fTm9kZXM7DQotICAgIEZYX0RXT1JECQkJCQltX2R3U3R5bGVzOw0KLSAgICBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTwltX3BTY3JpcHRBdHRyaWJ1dGU7DQotICAgIFhGQV9SRVNPVkVOT0RFX1JTVFlQRQkJbV9kd0ZsYWc7DQorY2xhc3MgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhKENYRkFfU2NyaXB0Q29udGV4dCogcFNDID0gTlVMTCkNCisgICAgICA6IG1fcFNDKHBTQyksDQorICAgICAgICBtX0N1ck5vZGUoTlVMTCksDQorICAgICAgICBtX3dzTmFtZSgpLA0KKyAgICAgICAgbV91SGFzaE5hbWUoMCksDQorICAgICAgICBtX3dzQ29uZGl0aW9uKCksDQorICAgICAgICBtX25MZXZlbCgwKSwNCisgICAgICAgIG1fTm9kZXMoKSwNCisgICAgICAgIG1fZHdTdHlsZXMoWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuKSwNCisgICAgICAgIG1fcFNjcmlwdEF0dHJpYnV0ZShOVUxMKSwNCisgICAgICAgIG1fZHdGbGFnKFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2Rlcykge30NCisgIH5DWEZBX1Jlc29sdmVOb2Rlc0RhdGEoKSB7IG1fTm9kZXMuUmVtb3ZlQWxsKCk7IH0NCisgIENYRkFfU2NyaXB0Q29udGV4dCogbV9wU0M7DQorICBDWEZBX09iamVjdCogbV9DdXJOb2RlOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c05hbWU7DQorICB1aW50MzJfdCBtX3VIYXNoTmFtZTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NDb25kaXRpb247DQorICBpbnQzMl90IG1fbkxldmVsOw0KKyAgQ1hGQV9PYmpBcnJheSBtX05vZGVzOw0KKyAgRlhfRFdPUkQgbV9kd1N0eWxlczsNCisgIFhGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPIG1fcFNjcmlwdEF0dHJpYnV0ZTsNCisgIFhGQV9SRVNPVkVOT0RFX1JTVFlQRSBtX2R3RmxhZzsNCiB9Ow0KLWNsYXNzIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcg0KLXsNCi1wdWJsaWM6DQotICAgIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcih2b2lkKTsNCi0gICAgfkNYRkFfUmVzb2x2ZVByb2Nlc3Nvcih2b2lkKTsNCi0gICAgaW50MzJfdAlYRkFfUmVzb2x2ZU5vZGVzKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKTsNCi0gICAgaW50MzJfdAlYRkFfUmVzb2x2ZU5vZGVzX0FueUNoaWxkKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKTsNCi0gICAgaW50MzJfdAlYRkFfUmVzb2x2ZU5vZGVzX0RvbGxhcihDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCk7DQotICAgIGludDMyX3QJWEZBX1Jlc29sdmVOb2Rlc19FeGNhbG1hdG9yeShDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCk7DQotICAgIGludDMyX3QJWEZBX1Jlc29sdmVOb2Rlc19OdW1iZXJTaWduKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKTsNCi0gICAgaW50MzJfdAlYRkFfUmVzb2x2ZU5vZGVzX0FzdGVyaXNrKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKTsNCi0gICAgaW50MzJfdAlYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCk7DQotICAgIGludDMyX3QJWEZBX1Jlc29sdmVOb2Rlc19Gb3JBdHRyaWJ1dGVScyhDWEZBX09iamVjdCogY3VyTm9kZSwgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyQXR0cik7DQotICAgIHZvaWQJCVhGQV9SZXNvbHZlTm9kZV9Db25kaXRpb25BcnJheShpbnQzMl90IGlDdXJJbmRleCwgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sIGludDMyX3QgaUZvdW5kQ291bnQsIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kKTsNCi0gICAgdm9pZAkJWEZBX1Jlc29sdmVOb2RlX0RvUHJlZGljYXRlRmlsdGVyKGludDMyX3QgaUN1ckluZGV4LCBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbiwgaW50MzJfdCBpRm91bmRDb3VudCwgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpOw0KLSAgICBpbnQzMl90CVhGQV9SZXNvbHZlTm9kZXNfR2V0RmlsdGVyKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLCBpbnQzMl90IG5TdGFydCwgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhICZybmQpOw0KLSAgICB2b2lkCQlYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSAmcm5kLCBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbik7DQotICAgIGludDMyX3QJWEZBX1Jlc29sdmVOb2Rlc19Qb3BTdGFjayhDRlhfSW50MzJBcnJheSAmc3RhY2spOw0KLSAgICB2b2lkCQlYRkFfUmVzb2x2ZU5vZGVzX1NldFN0eWxlc0ZvckNoaWxkKEZYX0RXT1JEIGR3UGFyZW50U3R5bGVzLCBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgJnJuZCk7DQotICAgIGludDMyX3QJWEZBX1Jlc29sdmVOb2RlX1NldFJlc3VsdENyZWF0ZU5vZGUoWEZBX1JFU09MVkVOT0RFX1JTJiByZXNvbHZlTm9kZVJTLCBDRlhfV2lkZVN0cmluZyAmd3NMYXN0Q29uZGl0aW9uKTsNCi0gICAgdm9pZAkgICAgWEZBX1Jlc29sdmVOb2RlX1NldEluZGV4RGF0YUJpbmQoQ0ZYX1dpZGVTdHJpbmcgJndzTmV4dENvbmRpdGlvbiwgaW50MzJfdCAmaUluZGV4LCBpbnQzMl90IGlDb3VudCk7DQotICAgIENYRkFfTm9kZUhlbHBlciogR2V0Tm9kZUhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BOb2RlSGVscGVyOw0KLSAgICB9DQotcHJpdmF0ZToNCi0gICAgQ1hGQV9Ob2RlSGVscGVyKiBtX3BOb2RlSGVscGVyOw0KLXB1YmxpYzoNCi0gICAgaW50MzJfdAkJIG1faUN1clN0YXJ0Ow0KK2NsYXNzIENYRkFfUmVzb2x2ZVByb2Nlc3NvciB7DQorIHB1YmxpYzoNCisgIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcih2b2lkKTsNCisgIH5DWEZBX1Jlc29sdmVQcm9jZXNzb3Iodm9pZCk7DQorICBpbnQzMl90IFhGQV9SZXNvbHZlTm9kZXMoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpOw0KKyAgaW50MzJfdCBYRkFfUmVzb2x2ZU5vZGVzX0FueUNoaWxkKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsNCisgIGludDMyX3QgWEZBX1Jlc29sdmVOb2Rlc19Eb2xsYXIoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpOw0KKyAgaW50MzJfdCBYRkFfUmVzb2x2ZU5vZGVzX0V4Y2FsbWF0b3J5KENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsNCisgIGludDMyX3QgWEZBX1Jlc29sdmVOb2Rlc19OdW1iZXJTaWduKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsNCisgIGludDMyX3QgWEZBX1Jlc29sdmVOb2Rlc19Bc3RlcmlzayhDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7DQorICBpbnQzMl90IFhGQV9SZXNvbHZlTm9kZXNfTm9ybWFsKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsNCisgIGludDMyX3QgWEZBX1Jlc29sdmVOb2Rlc19Gb3JBdHRyaWJ1dGVScyhDWEZBX09iamVjdCogY3VyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0ckF0dHIpOw0KKyAgdm9pZCBYRkFfUmVzb2x2ZU5vZGVfQ29uZGl0aW9uQXJyYXkoaW50MzJfdCBpQ3VySW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZvdW5kQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7DQorICB2b2lkIFhGQV9SZXNvbHZlTm9kZV9Eb1ByZWRpY2F0ZUZpbHRlcihpbnQzMl90IGlDdXJJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRm91bmRDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsNCisgIGludDMyX3QgWEZBX1Jlc29sdmVOb2Rlc19HZXRGaWx0ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7DQorICB2b2lkIFhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24oQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24pOw0KKyAgaW50MzJfdCBYRkFfUmVzb2x2ZU5vZGVzX1BvcFN0YWNrKENGWF9JbnQzMkFycmF5JiBzdGFjayk7DQorICB2b2lkIFhGQV9SZXNvbHZlTm9kZXNfU2V0U3R5bGVzRm9yQ2hpbGQoRlhfRFdPUkQgZHdQYXJlbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpOw0KKyAgaW50MzJfdCBYRkFfUmVzb2x2ZU5vZGVfU2V0UmVzdWx0Q3JlYXRlTm9kZShYRkFfUkVTT0xWRU5PREVfUlMmIHJlc29sdmVOb2RlUlMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0xhc3RDb25kaXRpb24pOw0KKyAgdm9pZCBYRkFfUmVzb2x2ZU5vZGVfU2V0SW5kZXhEYXRhQmluZChDRlhfV2lkZVN0cmluZyYgd3NOZXh0Q29uZGl0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50KTsNCisgIENYRkFfTm9kZUhlbHBlciogR2V0Tm9kZUhlbHBlcigpIHsgcmV0dXJuIG1fcE5vZGVIZWxwZXI7IH0NCisNCisgcHJpdmF0ZToNCisgIENYRkFfTm9kZUhlbHBlciogbV9wTm9kZUhlbHBlcjsNCisNCisgcHVibGljOg0KKyAgaW50MzJfdCBtX2lDdXJTdGFydDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5jcHAKaW5kZXggMzE3M2QxNC4uZjVjYTllMiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5jcHAKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5jcHAKQEAgLTE3LDEwNiArMTcsMTA3IEBACiAjaW5jbHVkZSAiLi4vY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KICNpbmNsdWRlICJ4ZmFfZGVidWdfcGFyc2VyLmgiDQogI2luY2x1ZGUgInhmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaCINCi1DU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCi0gICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfU2lnbmF0dXJlUHNldWRvTW9kZWwpDQotew0KLSAgICBtX3VTY3JpcHRIYXNoID0gWEZBX0hBU0hDT0RFX1NpZ25hdHVyZTsNCitDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKA0KKyAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQorICAgIDogQ1hGQV9PcmRpbmFyeU9iamVjdChwRG9jdW1lbnQsIFhGQV9FTEVNRU5UX1NpZ25hdHVyZVBzZXVkb01vZGVsKSB7DQorICBtX3VTY3JpcHRIYXNoID0gWEZBX0hBU0hDT0RFX1NpZ25hdHVyZTsNCiB9DQotQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6fkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwoKQ0KLXsNCitDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjp+Q1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCgpIHt9DQordm9pZCBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfVmVyaWZ5KA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gNCkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInZlcmlmeSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICB9DQorICBpbnQzMl90IGJWZXJpZnkgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5WZXJpZnkoaERvYywgcE5vZGUpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBiVmVyaWZ5KTsNCisgIH0NCiB9DQotdm9pZCBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfVmVyaWZ5KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiA0KSB7DQotICAgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInZlcmlmeSIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KLSAgICBpZiAoaUxlbmd0aCA+PSAxKSB7DQotICAgICAgICBwTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGJWZXJpZnkgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5WZXJpZnkoaERvYywgcE5vZGUpOw0KLSAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCi0gICAgaWYgKGhWYWx1ZSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGJWZXJpZnkpOw0KLSAgICB9DQordm9pZCBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfU2lnbigNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDMgfHwgaUxlbmd0aCA+IDcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJzaWduIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIENYRkFfTm9kZUxpc3QqIHBOb2RlTGlzdCA9IE5VTEw7DQorICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICBDRlhfV2lkZVN0cmluZyB3c1hNTElkZW50Ow0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBwTm9kZUxpc3QgPSAoQ1hGQV9Ob2RlTGlzdCopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICB3c0V4cHJlc3Npb24gPQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNYTUxJZGVudCA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMik7DQorICAgIHdzWE1MSWRlbnQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNYTUxJZGVudCwgYnNYTUxJZGVudC5HZXRMZW5ndGgoKSk7DQorICB9DQorICBGWF9CT09MIGJTaWduID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2lnbihoRG9jLCBwTm9kZUxpc3QsIHdzRXhwcmVzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzWE1MSWRlbnQpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiU2lnbik7DQorICB9DQogfQ0KLXZvaWQgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6U2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX1NpZ24oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykNCi17DQotICAgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KLSAgICBpZiAoaUxlbmd0aCA8IDMgfHwgaUxlbmd0aCA+IDcpIHsNCi0gICAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwic2lnbiIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQotICAgIENYRkFfTm9kZUxpc3QqIHBOb2RlTGlzdCA9IE5VTEw7DQotICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NYTUxJZGVudDsNCi0gICAgaWYgKGlMZW5ndGggPj0gMSkgew0KLSAgICAgICAgcE5vZGVMaXN0ID0gKENYRkFfTm9kZUxpc3QqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCi0gICAgfQ0KLSAgICBpZiAoaUxlbmd0aCA+PSAyKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KLSAgICAgICAgd3NFeHByZXNzaW9uID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCi0gICAgfQ0KLSAgICBpZiAoaUxlbmd0aCA+PSAzKSB7DQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1hNTElkZW50ID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygyKTsNCi0gICAgICAgIHdzWE1MSWRlbnQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNYTUxJZGVudCwgYnNYTUxJZGVudC5HZXRMZW5ndGgoKSk7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiU2lnbiA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPlNpZ24oaERvYywgcE5vZGVMaXN0LCB3c0V4cHJlc3Npb24sIHdzWE1MSWRlbnQpOw0KLSAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCi0gICAgaWYgKGhWYWx1ZSkgew0KLSAgICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIGJTaWduKTsNCi0gICAgfQ0KK3ZvaWQgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6U2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX0VudW1lcmF0ZSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAwKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZW51bWVyYXRlIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIENYRkFfTm9kZUxpc3QqIHBMaXN0ID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+RW51bWVyYXRlKGhEb2MpOw0KKyAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocExpc3QpKTsNCiB9DQotdm9pZCBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfRW51bWVyYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpDQotew0KLSAgICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCi0gICAgaWYgKGlMZW5ndGggIT0gMCkgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJlbnVtZXJhdGUiKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQotICAgIGlmICghcE5vdGlmeSkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KLSAgICBDWEZBX05vZGVMaXN0ICpwTGlzdCA9ICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5FbnVtZXJhdGUoaERvYyk7DQotICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTGlzdCkpOw0KLX0NCi12b2lkIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6OlNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9DbGVhcihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKQ0KLXsNCi0gICAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQotICAgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMikgew0KLSAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJjbGVhciIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCi0gICAgaWYgKCFwTm90aWZ5KSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQotICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KLSAgICBGWF9CT09MIGJDbGVhciA9IFRSVUU7DQotICAgIGlmIChpTGVuZ3RoID49IDEpIHsNCi0gICAgICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KLSAgICB9DQotICAgIGlmIChpTGVuZ3RoID49IDIpIHsNCi0gICAgICAgIGJDbGVhciA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpID09IDAgPyBGQUxTRSA6IFRSVUU7DQotICAgIH0NCi0gICAgRlhfQk9PTCBiRmxhZyA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkNsZWFyKGhEb2MsIHBOb2RlLCBiQ2xlYXIpOw0KLSAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQotICAgIGlmIChoVmFsdWUpIHsNCi0gICAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiRmxhZyk7DQotICAgIH0NCit2b2lkIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6OlNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9DbGVhcigNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDIpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJjbGVhciIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIEZYX0JPT0wgYkNsZWFyID0gVFJVRTsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgIGJDbGVhciA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICB9DQorICBGWF9CT09MIGJGbGFnID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+Q2xlYXIoaERvYywgcE5vZGUsIGJDbGVhcik7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIGJGbGFnKTsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oCmluZGV4IGQzODk4MjAuLjBjYTEwYjQgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3NpZ25hdHVyZXBzZXVkb21vZGVsLmgKQEAgLTYsMTQgKzYsMTMgQEAKIA0KICNpZm5kZWYgX1NDUklQVF9TSUdOQVRVUkVQU0VVRE9NT0RFTF9IXw0KICNkZWZpbmUgX1NDUklQVF9TSUdOQVRVUkVQU0VVRE9NT0RFTF9IXw0KLWNsYXNzIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdA0KLXsNCi1wdWJsaWM6DQotICAgIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCi0gICAgfkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwoKTsNCi0gICAgdm9pZAlTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfVmVyaWZ5KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9TaWduKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KLSAgICB2b2lkCVNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9FbnVtZXJhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQotICAgIHZvaWQJU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX0NsZWFyKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KK2NsYXNzIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdCB7DQorIHB1YmxpYzoNCisgIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIH5DU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKCk7DQorICB2b2lkIFNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9WZXJpZnkoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9TaWduKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfRW51bWVyYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfQ2xlYXIoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfdXRpbHNfaW1wLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV91dGlsc19pbXAuY3BwCmluZGV4IDA2Y2I2ZDkuLjFlN2Q5YmUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV91dGlsc19pbXAuY3BwCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV91dGlsc19pbXAuY3BwCkBAIC0xNiwzNzUgKzE2LDM4OSBAQAogI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQogI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCiAjaW5jbHVkZSAieGZhX2RlYnVnX3BhcnNlci5oIg0KLUNYRkFfTm9kZSogWEZBX0NyZWF0ZVVJQ2hpbGQoQ1hGQV9Ob2RlKiBwTm9kZSwgWEZBX0VMRU1FTlQmIGVXaWRnZXRUeXBlKQ0KLXsNCi0gICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KLSAgICBlV2lkZ2V0VHlwZSA9IGVUeXBlOw0KLSAgICBpZiAoZVR5cGUgIT0gWEZBX0VMRU1FTlRfRmllbGQgJiYgZVR5cGUgIT0gWEZBX0VMRU1FTlRfRHJhdykgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQorQ1hGQV9Ob2RlKiBYRkFfQ3JlYXRlVUlDaGlsZChDWEZBX05vZGUqIHBOb2RlLCBYRkFfRUxFTUVOVCYgZVdpZGdldFR5cGUpIHsNCisgIFhGQV9FTEVNRU5UIGVUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgIGVXaWRnZXRUeXBlID0gZVR5cGU7DQorICBpZiAoZVR5cGUgIT0gWEZBX0VMRU1FTlRfRmllbGQgJiYgZVR5cGUgIT0gWEZBX0VMRU1FTlRfRHJhdykgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGVXaWRnZXRUeXBlID0gWEZBX0VMRU1FTlRfVU5LTk9XTjsNCisgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOOw0KKyAgQ1hGQV9WYWx1ZSBkZWZWYWx1ZSA9IHBOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSwgVFJVRSk7DQorICBYRkFfRUxFTUVOVCBlVmFsdWVUeXBlID0gKFhGQV9FTEVNRU5UKWRlZlZhbHVlLkdldENoaWxkVmFsdWVDbGFzc0lEKCk7DQorICBzd2l0Y2ggKGVWYWx1ZVR5cGUpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9Cb29sZWFuOg0KKyAgICAgIGVVSVR5cGUgPSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9JbnRlZ2VyOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RlY2ltYWw6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRmxvYXQ6DQorICAgICAgZVVJVHlwZSA9IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0V4RGF0YToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0Og0KKyAgICAgIGVVSVR5cGUgPSBYRkFfRUxFTUVOVF9UZXh0RWRpdDsNCisgICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FTEVNRU5UX1RleHQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9UaW1lOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGVUaW1lOg0KKyAgICAgIGVVSVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2U6DQorICAgICAgZVVJVHlwZSA9IFhGQV9FTEVNRU5UX0ltYWdlRWRpdDsNCisgICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FTEVNRU5UX0ltYWdlOw0KKyAgICAgIGJyZWFrOw0KKyAgICAgIDsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9BcmM6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfTGluZToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9SZWN0YW5nbGU6DQorICAgICAgZVVJVHlwZSA9IFhGQV9FTEVNRU5UX0RlZmF1bHRVaTsNCisgICAgICBlV2lkZ2V0VHlwZSA9IGVWYWx1ZVR5cGU7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gTlVMTDsNCisgIENYRkFfTm9kZSogcFVJID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1VpLCBUUlVFKTsNCisgIENYRkFfTm9kZSogcENoaWxkID0gcFVJLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICBmb3IgKDsgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgWEZBX0VMRU1FTlQgZUNoaWxkID0gcENoaWxkLT5HZXRDbGFzc0lEKCk7DQorICAgIGlmIChlQ2hpbGQgPT0gWEZBX0VMRU1FTlRfRXh0cmFzIHx8IGVDaGlsZCA9PSBYRkFfRUxFTUVOVF9QaWN0dXJlKSB7DQorICAgICAgY29udGludWU7DQogICAgIH0NCi0gICAgZVdpZGdldFR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOOw0KLSAgICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gWEZBX0VMRU1FTlRfVU5LTk9XTjsNCi0gICAgQ1hGQV9WYWx1ZSBkZWZWYWx1ZSA9IHBOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSwgVFJVRSk7DQotICAgIFhGQV9FTEVNRU5UIGVWYWx1ZVR5cGUgPSAoWEZBX0VMRU1FTlQpZGVmVmFsdWUuR2V0Q2hpbGRWYWx1ZUNsYXNzSUQoKTsNCi0gICAgc3dpdGNoIChlVmFsdWVUeXBlKSB7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Jvb2xlYW46DQotICAgICAgICAgICAgZVVJVHlwZSA9IFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbnRlZ2VyOg0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EZWNpbWFsOg0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9GbG9hdDoNCi0gICAgICAgICAgICBlVUlUeXBlID0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4RGF0YToNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dDoNCi0gICAgICAgICAgICBlVUlUeXBlID0gWEZBX0VMRU1FTlRfVGV4dEVkaXQ7DQotICAgICAgICAgICAgZVdpZGdldFR5cGUgPSBYRkFfRUxFTUVOVF9UZXh0Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlOg0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UaW1lOg0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlVGltZToNCi0gICAgICAgICAgICBlVUlUeXBlID0gWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZToNCi0gICAgICAgICAgICBlVUlUeXBlID0gWEZBX0VMRU1FTlRfSW1hZ2VFZGl0Ow0KLSAgICAgICAgICAgIGVXaWRnZXRUeXBlID0gWEZBX0VMRU1FTlRfSW1hZ2U7DQotICAgICAgICAgICAgYnJlYWs7Ow0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9BcmM6DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0xpbmU6DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1JlY3RhbmdsZToNCi0gICAgICAgICAgICBlVUlUeXBlID0gWEZBX0VMRU1FTlRfRGVmYXVsdFVpOw0KLSAgICAgICAgICAgIGVXaWRnZXRUeXBlID0gZVZhbHVlVHlwZTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQorICAgIFhGQV9MUENQUk9QRVJUWSBwUHJvdGVydHkgPQ0KKyAgICAgICAgWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KFhGQV9FTEVNRU5UX1VpLCBlQ2hpbGQsIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorICAgIGlmIChwUHJvdGVydHkgJiYgKHBQcm90ZXJ0eS0+dUZsYWdzICYgWEZBX1BST1BFUlRZRkxBR19PbmVPZikpIHsNCisgICAgICBwVUlDaGlsZCA9IHBDaGlsZDsNCisgICAgICBicmVhazsNCiAgICAgfQ0KLSAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gTlVMTDsNCi0gICAgQ1hGQV9Ob2RlKiBwVUkgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVWksIFRSVUUpOw0KLSAgICBDWEZBX05vZGUgKnBDaGlsZCA9IHBVSS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KLSAgICBmb3IgKCA7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBYRkFfRUxFTUVOVCBlQ2hpbGQgPSBwQ2hpbGQtPkdldENsYXNzSUQoKTsNCi0gICAgICAgIGlmIChlQ2hpbGQgPT0gWEZBX0VMRU1FTlRfRXh0cmFzIHx8IGVDaGlsZCA9PSBYRkFfRUxFTUVOVF9QaWN0dXJlKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3RlcnR5ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KFhGQV9FTEVNRU5UX1VpLCBlQ2hpbGQsIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQotICAgICAgICBpZiAocFByb3RlcnR5ICYmIChwUHJvdGVydHktPnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YpKSB7DQotICAgICAgICAgICAgcFVJQ2hpbGQgPSBwQ2hpbGQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQorICB9DQorICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KKyAgICBYRkFfRUxFTUVOVCBlRHJhdyA9IHBVSUNoaWxkID8gcFVJQ2hpbGQtPkdldENsYXNzSUQoKSA6IFhGQV9FTEVNRU5UX1VOS05PV047DQorICAgIHN3aXRjaCAoZURyYXcpIHsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHRFZGl0Og0KKyAgICAgICAgZVdpZGdldFR5cGUgPSBYRkFfRUxFTUVOVF9UZXh0Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQ6DQorICAgICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FTEVNRU5UX0ltYWdlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGVXaWRnZXRUeXBlID0NCisgICAgICAgICAgICBlV2lkZ2V0VHlwZSA9PSBYRkFfRUxFTUVOVF9VTktOT1dOID8gWEZBX0VMRU1FTlRfVGV4dCA6IGVXaWRnZXRUeXBlOw0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCi0gICAgaWYoZVR5cGUgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KLSAgICAgICAgWEZBX0VMRU1FTlQgZURyYXcgPSBwVUlDaGlsZCA/IHBVSUNoaWxkLT5HZXRDbGFzc0lEKCkgOiBYRkFfRUxFTUVOVF9VTktOT1dOOw0KLSAgICAgICAgc3dpdGNoIChlRHJhdykgew0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dEVkaXQ6DQotICAgICAgICAgICAgICAgIGVXaWRnZXRUeXBlID0gWEZBX0VMRU1FTlRfVGV4dDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQ6DQotICAgICAgICAgICAgICAgIGVXaWRnZXRUeXBlID0gWEZBX0VMRU1FTlRfSW1hZ2U7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGVXaWRnZXRUeXBlID0gZVdpZGdldFR5cGUgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTiA/IFhGQV9FTEVNRU5UX1RleHQgOiBlV2lkZ2V0VHlwZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAocFVJQ2hpbGQgJiYgcFVJQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EZWZhdWx0VWkpIHsNCisgICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FTEVNRU5UX1RleHRFZGl0Ow0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgaWYgKHBVSUNoaWxkICYmIHBVSUNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGVmYXVsdFVpKSB7DQotICAgICAgICAgICAgZVdpZGdldFR5cGUgPSBYRkFfRUxFTUVOVF9UZXh0RWRpdDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZVdpZGdldFR5cGUgPSBwVUlDaGlsZCA/IHBVSUNoaWxkLT5HZXRDbGFzc0lEKCkgOiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9VTktOT1dOID8gWEZBX0VMRU1FTlRfVGV4dEVkaXQgOiBlVUlUeXBlKTsNCi0gICAgICAgIH0NCisgICAgICBlV2lkZ2V0VHlwZSA9IHBVSUNoaWxkDQorICAgICAgICAgICAgICAgICAgICAgICAgPyBwVUlDaGlsZC0+R2V0Q2xhc3NJRCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgOiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9VTktOT1dOID8gWEZBX0VMRU1FTlRfVGV4dEVkaXQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBlVUlUeXBlKTsNCiAgICAgfQ0KLSAgICBpZiAoIXBVSUNoaWxkKSB7DQotICAgICAgICBpZiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQotICAgICAgICAgICAgZVVJVHlwZSA9IFhGQV9FTEVNRU5UX1RleHRFZGl0Ow0KLSAgICAgICAgICAgICgoQ1hGQV9Ob2RlKilkZWZWYWx1ZSktPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1RleHQsIFRSVUUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFVJQ2hpbGQgPSBwVUktPkdldFByb3BlcnR5KDAsIGVVSVR5cGUsIFRSVUUpOw0KLSAgICB9IGVsc2UgaWYgKGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KLSAgICAgICAgc3dpdGNoIChwVUlDaGlsZC0+R2V0Q2xhc3NJRCgpKSB7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjogew0KLSAgICAgICAgICAgICAgICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX1RleHQ7DQotICAgICAgICAgICAgICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwSXRlbXMgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENYRkFfTm9kZSogcEl0ZW0gPSBwSXRlbXMtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1VOS05PV04pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYWx1ZVR5cGUgPSBwSXRlbS0+R2V0Q2xhc3NJRCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdDoNCi0gICAgICAgICAgICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGVUaW1lOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDoNCi0gICAgICAgICAgICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX0ltYWdlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0Og0KLSAgICAgICAgICAgICAgICBlVmFsdWVUeXBlID0gWEZBX0VMRU1FTlRfRmxvYXQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDogew0KLSAgICAgICAgICAgICAgICAgICAgZVZhbHVlVHlwZSA9IChwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX09wZW4pID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSA/IFhGQV9FTEVNRU5UX0V4RGF0YSA6IFhGQV9FTEVNRU5UX1RleHQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CYXJjb2RlOg0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnV0dG9uOg0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0Og0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU2lnbmF0dXJlOg0KLSAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dEVkaXQ6DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX1RleHQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgKChDWEZBX05vZGUqKWRlZlZhbHVlKS0+R2V0UHJvcGVydHkoMCwgZVZhbHVlVHlwZSwgVFJVRSk7DQorICB9DQorICBpZiAoIXBVSUNoaWxkKSB7DQorICAgIGlmIChlVUlUeXBlID09IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCisgICAgICBlVUlUeXBlID0gWEZBX0VMRU1FTlRfVGV4dEVkaXQ7DQorICAgICAgKChDWEZBX05vZGUqKWRlZlZhbHVlKS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVGV4dCwgVFJVRSk7DQogICAgIH0NCi0gICAgcmV0dXJuIHBVSUNoaWxkOw0KKyAgICBwVUlDaGlsZCA9IHBVSS0+R2V0UHJvcGVydHkoMCwgZVVJVHlwZSwgVFJVRSk7DQorICB9IGVsc2UgaWYgKGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KKyAgICBzd2l0Y2ggKHBVSUNoaWxkLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uOiB7DQorICAgICAgICBlVmFsdWVUeXBlID0gWEZBX0VMRU1FTlRfVGV4dDsNCisgICAgICAgIGlmIChDWEZBX05vZGUqIHBJdGVtcyA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcykpIHsNCisgICAgICAgICAgaWYgKENYRkFfTm9kZSogcEl0ZW0gPSBwSXRlbXMtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1VOS05PV04pKSB7DQorICAgICAgICAgICAgZVZhbHVlVHlwZSA9IHBJdGVtLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0Og0KKyAgICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGVUaW1lOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQ6DQorICAgICAgICBlVmFsdWVUeXBlID0gWEZBX0VMRU1FTlRfSW1hZ2U7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0Og0KKyAgICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX0Zsb2F0Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0OiB7DQorICAgICAgICBlVmFsdWVUeXBlID0gKHBVSUNoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3BlbikgPT0NCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpDQorICAgICAgICAgICAgICAgICAgICAgICAgID8gWEZBX0VMRU1FTlRfRXhEYXRhDQorICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0VMRU1FTlRfVGV4dDsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQmFyY29kZToNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0J1dHRvbjoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdDoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1NpZ25hdHVyZToNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHRFZGl0Og0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBlVmFsdWVUeXBlID0gWEZBX0VMRU1FTlRfVGV4dDsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgICgoQ1hGQV9Ob2RlKilkZWZWYWx1ZSktPkdldFByb3BlcnR5KDAsIGVWYWx1ZVR5cGUsIFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBVSUNoaWxkOw0KIH0NCi1DWEZBX0xvY2FsZVZhbHVlIFhGQV9HZXRMb2NhbGVWYWx1ZShDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhKQ0KLXsNCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZVZhbHVlID0gcFdpZGdldERhdGEtPkdldE5vZGUoKS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KLSAgICBpZiAoIXBOb2RlVmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBDWEZBX0xvY2FsZVZhbHVlKCk7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlKiBwVmFsdWVDaGlsZCA9IHBOb2RlVmFsdWUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgaWYgKCFwVmFsdWVDaGlsZCkgew0KLSAgICAgICAgcmV0dXJuIENYRkFfTG9jYWxlVmFsdWUoKTsNCi0gICAgfQ0KLSAgICBpbnQzMl90IGlWVFR5cGUgPSBYRkFfVlRfTlVMTDsNCi0gICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwVmFsdWVDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KLSAgICBzd2l0Y2ggKGVUeXBlKSB7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RlY2ltYWw6DQotICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9ERUNJTUFMOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9GbG9hdDoNCi0gICAgICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0ZMT0FUOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlOg0KLSAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREFURTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGltZToNCi0gICAgICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX1RJTUU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGVUaW1lOg0KLSAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREFURVRJTUU7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Jvb2xlYW46DQotICAgICAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9CT09MRUFOOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9JbnRlZ2VyOg0KLSAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfSU5URUdFUjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dDoNCi0gICAgICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX1RFWFQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfTlVMTDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gQ1hGQV9Mb2NhbGVWYWx1ZShpVlRUeXBlLCBwV2lkZ2V0RGF0YS0+R2V0UmF3VmFsdWUoKSwgcFdpZGdldERhdGEtPkdldE5vZGUoKS0+R2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKSk7DQorQ1hGQV9Mb2NhbGVWYWx1ZSBYRkFfR2V0TG9jYWxlVmFsdWUoQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSkgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZVZhbHVlID0NCisgICAgICBwV2lkZ2V0RGF0YS0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICBpZiAoIXBOb2RlVmFsdWUpIHsNCisgICAgcmV0dXJuIENYRkFfTG9jYWxlVmFsdWUoKTsNCisgIH0NCisgIENYRkFfTm9kZSogcFZhbHVlQ2hpbGQgPSBwTm9kZVZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICBpZiAoIXBWYWx1ZUNoaWxkKSB7DQorICAgIHJldHVybiBDWEZBX0xvY2FsZVZhbHVlKCk7DQorICB9DQorICBpbnQzMl90IGlWVFR5cGUgPSBYRkFfVlRfTlVMTDsNCisgIFhGQV9FTEVNRU5UIGVUeXBlID0gcFZhbHVlQ2hpbGQtPkdldENsYXNzSUQoKTsNCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9EZWNpbWFsOg0KKyAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREVDSU1BTDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9GbG9hdDoNCisgICAgICBpVlRUeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGU6DQorICAgICAgaVZUVHlwZSA9IFhGQV9WVF9EQVRFOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1RpbWU6DQorICAgICAgaVZUVHlwZSA9IFhGQV9WVF9USU1FOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGVUaW1lOg0KKyAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREFURVRJTUU7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQm9vbGVhbjoNCisgICAgICBpVlRUeXBlID0gWEZBX1ZUX0JPT0xFQU47DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfSW50ZWdlcjoNCisgICAgICBpVlRUeXBlID0gWEZBX1ZUX0lOVEVHRVI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dDoNCisgICAgICBpVlRUeXBlID0gWEZBX1ZUX1RFWFQ7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgaVZUVHlwZSA9IFhGQV9WVF9OVUxMOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIENYRkFfTG9jYWxlVmFsdWUoaVZUVHlwZSwgcFdpZGdldERhdGEtPkdldFJhd1ZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Tm9kZSgpLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpKTsNCiB9DQotdm9pZAlYRkFfR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KElGREVfWE1MTm9kZSAqcFhNTE5vZGUsIENGWF9XaWRlU3RyaW5nICZ3c1BsYWluVGV4dCkNCi17DQotICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgc3dpdGNoKHBYTUxOb2RlLT5HZXRUeXBlKCkpIHsNCi0gICAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDogew0KLSAgICAgICAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQgKnBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGU7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGFnOw0KLSAgICAgICAgICAgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsNCi0gICAgICAgICAgICAgICAgdWludDMyX3QgdVRhZyA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzVGFnLCB3c1RhZy5HZXRMZW5ndGgoKSwgVFJVRSk7DQotICAgICAgICAgICAgICAgIGlmICh1VGFnID09IDB4MDAwMWY3MTQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzUGxhaW5UZXh0ICs9IEwiXG4iOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVUYWcgPT0gMHgwMDAwMDA3MCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCF3c1BsYWluVGV4dC5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c1BsYWluVGV4dCArPSBMIlxuIjsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1VGFnID09IDB4YTQ4YWM2Mykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCF3c1BsYWluVGV4dC5Jc0VtcHR5KCkgJiYgd3NQbGFpblRleHRbd3NQbGFpblRleHQuR2V0TGVuZ3RoKCkgLSAxXSAhPSAnXG4nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NQbGFpblRleHQgKz0gTCJcbiI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6IHsNCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KLSAgICAgICAgICAgICAgICAoKElGREVfWE1MVGV4dCopcFhNTE5vZGUpLT5HZXRUZXh0KHdzQ29udGVudCk7DQotICAgICAgICAgICAgICAgIHdzUGxhaW5UZXh0ICs9IHdzQ29udGVudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOiB7DQotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hhckRhdGE7DQotICAgICAgICAgICAgICAgICgoSUZERV9YTUxDaGFyRGF0YSopcFhNTE5vZGUpLT5HZXRDaGFyRGF0YSh3c0NoYXJEYXRhKTsNCi0gICAgICAgICAgICAgICAgd3NQbGFpblRleHQgKz0gd3NDaGFyRGF0YTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGZvciAoSUZERV9YTUxOb2RlICpwQ2hpbGRYTUwgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsgcENoaWxkWE1MOyBwQ2hpbGRYTUwgPSBwQ2hpbGRYTUwtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQotICAgICAgICBYRkFfR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KHBDaGlsZFhNTCwgd3NQbGFpblRleHQpOw0KLSAgICB9DQotfQ0KLUZYX0JPT0wgWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3goQ1hGQV9Ob2RlKiBwRmllbGROb2RlKQ0KLXsNCi0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQotICAgIGlmICghcEZpZWxkTm9kZSkgew0KLSAgICAgICAgcmV0dXJuIGJSZXQ7DQotICAgIH0NCi0gICAgQ1hGQV9Ob2RlICpwVUlDaGlsZCA9IHBGaWVsZE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1VpKTsNCi0gICAgaWYgKHBVSUNoaWxkKSB7DQotICAgICAgICBDWEZBX05vZGUgKnBGaXJzdENoaWxkID0gcFVJQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCi0gICAgICAgIGlmIChwRmlyc3RDaGlsZCAmJiBwRmlyc3RDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QpIHsNCi0gICAgICAgICAgICBiUmV0ID0gcEZpcnN0Q2hpbGQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9PcGVuKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdDsNCit2b2lkIFhGQV9HZXRQbGFpblRleHRGcm9tUmljaFRleHQoSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGxhaW5UZXh0KSB7DQorICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBzd2l0Y2ggKHBYTUxOb2RlLT5HZXRUeXBlKCkpIHsNCisgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7DQorICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGFnOw0KKyAgICAgIHBYTUxFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUod3NUYWcpOw0KKyAgICAgIHVpbnQzMl90IHVUYWcgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c1RhZywgd3NUYWcuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICAgIGlmICh1VGFnID09IDB4MDAwMWY3MTQpIHsNCisgICAgICAgIHdzUGxhaW5UZXh0ICs9IEwiXG4iOw0KKyAgICAgIH0gZWxzZSBpZiAodVRhZyA9PSAweDAwMDAwMDcwKSB7DQorICAgICAgICBpZiAoIXdzUGxhaW5UZXh0LklzRW1wdHkoKSkgew0KKyAgICAgICAgICB3c1BsYWluVGV4dCArPSBMIlxuIjsNCiAgICAgICAgIH0NCi0gICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAodVRhZyA9PSAweGE0OGFjNjMpIHsNCisgICAgICAgIGlmICghd3NQbGFpblRleHQuSXNFbXB0eSgpICYmDQorICAgICAgICAgICAgd3NQbGFpblRleHRbd3NQbGFpblRleHQuR2V0TGVuZ3RoKCkgLSAxXSAhPSAnXG4nKSB7DQorICAgICAgICAgIHdzUGxhaW5UZXh0ICs9IEwiXG4iOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0OiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgICAgICgoSUZERV9YTUxUZXh0KilwWE1MTm9kZSktPkdldFRleHQod3NDb250ZW50KTsNCisgICAgICB3c1BsYWluVGV4dCArPSB3c0NvbnRlbnQ7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6IHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYXJEYXRhOw0KKyAgICAgICgoSUZERV9YTUxDaGFyRGF0YSopcFhNTE5vZGUpLT5HZXRDaGFyRGF0YSh3c0NoYXJEYXRhKTsNCisgICAgICB3c1BsYWluVGV4dCArPSB3c0NoYXJEYXRhOw0KKyAgICB9IGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgZm9yIChJRkRFX1hNTE5vZGUqIHBDaGlsZFhNTCA9DQorICAgICAgICAgICBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgcENoaWxkWE1MOw0KKyAgICAgICBwQ2hpbGRYTUwgPSBwQ2hpbGRYTUwtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgIFhGQV9HZXRQbGFpblRleHRGcm9tUmljaFRleHQocENoaWxkWE1MLCB3c1BsYWluVGV4dCk7DQorICB9DQorfQ0KK0ZYX0JPT0wgWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3goQ1hGQV9Ob2RlKiBwRmllbGROb2RlKSB7DQorICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgIGlmICghcEZpZWxkTm9kZSkgew0KICAgICByZXR1cm4gYlJldDsNCi19DQotRlhfQk9PTCBYRkFfSXNMYXlvdXRFbGVtZW50KFhGQV9FTEVNRU5UIGVFbGVtZW50LCBGWF9CT09MIGJMYXlvdXRDb250YWluZXIgKQ0KLXsNCi0gICAgc3dpdGNoIChlRWxlbWVudCkgew0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EcmF3Og0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9GaWVsZDoNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyOg0KLSAgICAgICAgICAgIHJldHVybiAhYkxheW91dENvbnRhaW5lcjsNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJlYToNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOg0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0Og0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlQXJlYToNCi0gICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRm9ybToNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IHBGaWVsZE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1VpKTsNCisgIGlmIChwVUlDaGlsZCkgew0KKyAgICBDWEZBX05vZGUqIHBGaXJzdENoaWxkID0gcFVJQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgaWYgKHBGaXJzdENoaWxkICYmIHBGaXJzdENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCkgew0KKyAgICAgIGJSZXQgPSBwRmlyc3RDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX09wZW4pID09DQorICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0Ow0KICAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KIH0NCi1GWF9CT09MIFhGQV9Jc1Rha2luZ3VwU3BhY2UoWEZBX0FUVFJJQlVURUVOVU0gZVByZXNlbmNlKQ0KLXsNCi0gICAgc3dpdGNoIChlUHJlc2VuY2UpIHsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZToNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlOg0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KK0ZYX0JPT0wgWEZBX0lzTGF5b3V0RWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwgRlhfQk9PTCBiTGF5b3V0Q29udGFpbmVyKSB7DQorICBzd2l0Y2ggKGVFbGVtZW50KSB7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9GaWVsZDoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXI6DQorICAgICAgcmV0dXJuICFiTGF5b3V0Q29udGFpbmVyOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0FyZWE6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybVNldDoNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlQXJlYToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9Gb3JtOg0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBYRkFfSXNGbG93aW5nTGF5b3V0KFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQpDQotew0KLSAgICBzd2l0Y2ggKGVMYXlvdXQpIHsNCi0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVGI6DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xyX3RiOg0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SbF90YjoNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIFhGQV9Jc1Rha2luZ3VwU3BhY2UoWEZBX0FUVFJJQlVURUVOVU0gZVByZXNlbmNlKSB7DQorICBzd2l0Y2ggKGVQcmVzZW5jZSkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGU6DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlOg0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotRlhfQk9PTCBYRkFfSXNIb3Jpem9udGFsRmxvdyhYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0KQ0KLXsNCi0gICAgc3dpdGNoIChlTGF5b3V0KSB7DQotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xyX3RiOg0KLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SbF90YjoNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIFhGQV9Jc0Zsb3dpbmdMYXlvdXQoWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCkgew0KKyAgc3dpdGNoIChlTGF5b3V0KSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVGI6DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGI6DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGI6DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KIH0NCi1zdGF0aWMgY29uc3QgRlhfRE9VQkxFIGZyYWN0aW9uX3NjYWxlc1tdID0gezAuMSwgMC4wMSwgMC4wMDEsIDAuMDAwMSwgMC4wMDAwMSwgMC4wMDAwMDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDEsIDAuMDAwMDAwMDEsIDAuMDAwMDAwMDAxLCAwLjAwMDAwMDAwMDEsIDAuMDAwMDAwMDAwMDEsIDAuMDAwMDAwMDAwMDAxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMDAxLCAwLjAwMDAwMDAwMDAwMDAxLCAwLjAwMDAwMDAwMDAwMDAwMSwgMC4wMDAwMDAwMDAwMDAwMDAxDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQotRlhfRE9VQkxFIFhGQV9XaWRlU3RyaW5nVG9Eb3VibGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJndzU3RyaW5nVmFsKQ0KLXsNCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IHdzU3RyaW5nVmFsOw0KLSAgICB3c1ZhbHVlLlRyaW1MZWZ0KCk7DQotICAgIHdzVmFsdWUuVHJpbVJpZ2h0KCk7DQotICAgIEZYX0JPT0wgYlZhbGlkID0gVFJVRTsNCi0gICAgaW50NjRfdCBuSW50ZWdyYWwgPSAwOw0KLSAgICBGWF9EV09SRCBkd0ZyYWN0aW9uYWwgPSAwOw0KLSAgICBpbnQzMl90IG5FeHBvbmVudCA9IDA7DQotICAgIGludDMyX3QgY2MgPSAwOw0KLSAgICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFLCBiRXhwU2lnbiA9IEZBTFNFOw0KLSAgICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1ZhbHVlOw0KLSAgICBpbnQzMl90IGxlbiA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7DQotICAgIGlmIChzdHJbMF0gPT0gJysnKSB7DQotICAgICAgICBjYysrOw0KLSAgICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsNCi0gICAgICAgIGJOZWdhdGl2ZSA9IFRSVUU7DQotICAgICAgICBjYysrOw0KK0ZYX0JPT0wgWEZBX0lzSG9yaXpvbnRhbEZsb3coWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCkgew0KKyAgc3dpdGNoIChlTGF5b3V0KSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGI6DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGI6DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitzdGF0aWMgY29uc3QgRlhfRE9VQkxFIGZyYWN0aW9uX3NjYWxlc1tdID0gezAuMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMDAwMX07DQorRlhfRE9VQkxFIFhGQV9XaWRlU3RyaW5nVG9Eb3VibGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3RyaW5nVmFsKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gd3NTdHJpbmdWYWw7DQorICB3c1ZhbHVlLlRyaW1MZWZ0KCk7DQorICB3c1ZhbHVlLlRyaW1SaWdodCgpOw0KKyAgRlhfQk9PTCBiVmFsaWQgPSBUUlVFOw0KKyAgaW50NjRfdCBuSW50ZWdyYWwgPSAwOw0KKyAgRlhfRFdPUkQgZHdGcmFjdGlvbmFsID0gMDsNCisgIGludDMyX3QgbkV4cG9uZW50ID0gMDsNCisgIGludDMyX3QgY2MgPSAwOw0KKyAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRSwgYkV4cFNpZ24gPSBGQUxTRTsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWU7DQorICBpbnQzMl90IGxlbiA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICBpZiAoc3RyWzBdID09ICcrJykgew0KKyAgICBjYysrOw0KKyAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7DQorICAgIGJOZWdhdGl2ZSA9IFRSVUU7DQorICAgIGNjKys7DQorICB9DQorICBpbnQzMl90IG5JbnRlZ3JhbExlbiA9IDA7DQorICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgaWYgKHN0cltjY10gPT0gJy4nIHx8IHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnIHx8DQorICAgICAgICBuSW50ZWdyYWxMZW4gPiAxNykgew0KKyAgICAgIGJyZWFrOw0KICAgICB9DQotICAgIGludDMyX3QgbkludGVncmFsTGVuID0gMDsNCisgICAgaWYgKCFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIG5JbnRlZ3JhbCA9IG5JbnRlZ3JhbCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgY2MrKzsNCisgICAgbkludGVncmFsTGVuKys7DQorICB9DQorICBuSW50ZWdyYWwgPSBiTmVnYXRpdmUgPyAtbkludGVncmFsIDogbkludGVncmFsOw0KKyAgaW50MzJfdCBzY2FsZSA9IDA7DQorICBGWF9ET1VCTEUgZnJhY3Rpb24gPSAwLjA7DQorICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsNCisgICAgY2MrKzsNCiAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQotICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScgfHwgbkludGVncmFsTGVuID4gMTcpIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghWEZBX0lzRGlnaXQoc3RyW2NjXSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIG5JbnRlZ3JhbCA9IG5JbnRlZ3JhbCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCi0gICAgICAgIGNjICsrOw0KLSAgICAgICAgbkludGVncmFsTGVuKys7DQorICAgICAgZnJhY3Rpb24gKz0gZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsNCisgICAgICBzY2FsZSsrOw0KKyAgICAgIGNjKys7DQorICAgICAgaWYgKGNjID09IGxlbikgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChzY2FsZSA9PSBzaXplb2YoZnJhY3Rpb25fc2NhbGVzKSAvIHNpemVvZihGWF9ET1VCTEUpIHx8DQorICAgICAgICAgIHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaWYgKCFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgICAgfQ0KICAgICB9DQotICAgIG5JbnRlZ3JhbCA9IGJOZWdhdGl2ZSA/IC1uSW50ZWdyYWwgOiBuSW50ZWdyYWw7DQotICAgIGludDMyX3Qgc2NhbGUgPSAwOw0KLSAgICBGWF9ET1VCTEUgZnJhY3Rpb24gPSAwLjA7DQotICAgIGlmIChjYyA8IGxlbiAmJiBzdHJbY2NdID09ICcuJykgew0KLSAgICAgICAgY2MgKys7DQotICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCi0gICAgICAgICAgICBmcmFjdGlvbiArPSBmcmFjdGlvbl9zY2FsZXNbc2NhbGVdICogKHN0cltjY10gLSAnMCcpOw0KLSAgICAgICAgICAgIHNjYWxlICsrOw0KLSAgICAgICAgICAgIGNjICsrOw0KLSAgICAgICAgICAgIGlmIChjYyA9PSBsZW4pIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChzY2FsZSA9PSBzaXplb2YgKGZyYWN0aW9uX3NjYWxlcykgLyBzaXplb2YoRlhfRE9VQkxFKQ0KLSAgICAgICAgICAgICAgICAgICAgfHwgc3RyW2NjXSA9PSAnRScNCi0gICAgICAgICAgICAgICAgICAgIHx8IHN0cltjY10gPT0gJ2UnKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIVhGQV9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGR3RnJhY3Rpb25hbCA9IChGWF9EV09SRCkoZnJhY3Rpb24gKiA0Mjk0OTY3Mjk2LjApOw0KKyAgICBkd0ZyYWN0aW9uYWwgPSAoRlhfRFdPUkQpKGZyYWN0aW9uICogNDI5NDk2NzI5Ni4wKTsNCisgIH0NCisgIGlmIChjYyA8IGxlbiAmJiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQorICAgIGNjKys7DQorICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgY2MrKzsNCisgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJy0nKSB7DQorICAgICAgICBiRXhwU2lnbiA9IFRSVUU7DQorICAgICAgICBjYysrOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZiAoY2MgPCBsZW4gJiYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgew0KLSAgICAgICAgY2MgKys7DQotICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCi0gICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCi0gICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJy0nKSB7DQotICAgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgY2MrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCi0gICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBuRXhwb25lbnQgPSBuRXhwb25lbnQgKiAxMCArIHN0cltjY10gLSAnMCc7DQotICAgICAgICAgICAgY2MgKys7DQotICAgICAgICB9DQotICAgICAgICBuRXhwb25lbnQgPSBiRXhwU2lnbiA/IC1uRXhwb25lbnQgOiBuRXhwb25lbnQ7DQorICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgIGlmIChzdHJbY2NdID09ICcuJyB8fCAhWEZBX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisgICAgICBuRXhwb25lbnQgPSBuRXhwb25lbnQgKiAxMCArIHN0cltjY10gLSAnMCc7DQorICAgICAgY2MrKzsNCiAgICAgfQ0KLSAgICBGWF9ET1VCTEUgZFZhbHVlID0gKGR3RnJhY3Rpb25hbCAvIDQyOTQ5NjcyOTYuMCk7DQotICAgIGRWYWx1ZSA9IG5JbnRlZ3JhbCArIChuSW50ZWdyYWwgPj0gMCA/IGRWYWx1ZSA6IC1kVmFsdWUpOw0KLSAgICBpZiAobkV4cG9uZW50ICE9IDApIHsNCi0gICAgICAgIGRWYWx1ZSAqPSBGWFNZU19wb3coMTAsIChGWF9GTE9BVCluRXhwb25lbnQpOw0KLSAgICB9DQotICAgIHJldHVybiBkVmFsdWU7DQorICAgIG5FeHBvbmVudCA9IGJFeHBTaWduID8gLW5FeHBvbmVudCA6IG5FeHBvbmVudDsNCisgIH0NCisgIEZYX0RPVUJMRSBkVmFsdWUgPSAoZHdGcmFjdGlvbmFsIC8gNDI5NDk2NzI5Ni4wKTsNCisgIGRWYWx1ZSA9IG5JbnRlZ3JhbCArIChuSW50ZWdyYWwgPj0gMCA/IGRWYWx1ZSA6IC1kVmFsdWUpOw0KKyAgaWYgKG5FeHBvbmVudCAhPSAwKSB7DQorICAgIGRWYWx1ZSAqPSBGWFNZU19wb3coMTAsIChGWF9GTE9BVCluRXhwb25lbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIGRWYWx1ZTsNCiB9DQogDQotRlhfRE9VQkxFIFhGQV9CeXRlU3RyaW5nVG9Eb3VibGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelN0cmluZ1ZhbCkNCi17DQotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pTdHJpbmdWYWwuR2V0Q1N0cigpLCBzelN0cmluZ1ZhbC5HZXRMZW5ndGgoKSk7DQotICAgIHJldHVybiBYRkFfV2lkZVN0cmluZ1RvRG91YmxlKHdzVmFsdWUpOw0KK0ZYX0RPVUJMRSBYRkFfQnl0ZVN0cmluZ1RvRG91YmxlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pTdHJpbmdWYWwpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelN0cmluZ1ZhbC5HZXRDU3RyKCksIHN6U3RyaW5nVmFsLkdldExlbmd0aCgpKTsNCisgIHJldHVybiBYRkFfV2lkZVN0cmluZ1RvRG91YmxlKHdzVmFsdWUpOw0KIH0NCiANCiBpbnQzMl90IFhGQV9NYXBSb3RhdGlvbihpbnQzMl90IG5Sb3RhdGlvbikgew0KLSAgICBuUm90YXRpb24gPSBuUm90YXRpb24gJSAzNjA7DQotICAgIG5Sb3RhdGlvbiA9IG5Sb3RhdGlvbiA8IDAgPyBuUm90YXRpb24gKyAzNjAgOiBuUm90YXRpb247DQotICAgIHJldHVybiBuUm90YXRpb247DQorICBuUm90YXRpb24gPSBuUm90YXRpb24gJSAzNjA7DQorICBuUm90YXRpb24gPSBuUm90YXRpb24gPCAwID8gblJvdGF0aW9uICsgMzYwIDogblJvdGF0aW9uOw0KKyAgcmV0dXJuIG5Sb3RhdGlvbjsNCiB9DQotDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3V0aWxzX2ltcF91bml0dGVzdC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfdXRpbHNfaW1wX3VuaXR0ZXN0LmNwcAppbmRleCBhOTY5ODcyLi4xNzQ2NzNlIDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfdXRpbHNfaW1wX3VuaXR0ZXN0LmNwcAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfdXRpbHNfaW1wX3VuaXR0ZXN0LmNwcApAQCAtNywzMCArNywxNyBAQAogI2luY2x1ZGUgIi4uL2NvbW1vbi94ZmFfdXRpbHMuaCIKIAogVEVTVChYZmFVdGlsc0ltcCwgWEZBX01hcFJvdGF0aW9uKSB7Ci0gICAgc3RydWN0IFRlc3RDYXNlIHsKLSAgICAgICAgaW50IGlucHV0OwotICAgICAgICBpbnQgZXhwZWN0ZWRfb3V0cHV0OwotICAgIH0gVGVzdENhc2VzW10gPSB7Ci0gICAgICAgIHstMTAwMDAwMCwgODB9LAotICAgICAgICB7LTM2MSwgMzU5fSwKLSAgICAgICAgey0zNjAsIDB9LAotICAgICAgICB7LTM1OSwgMX0sCi0gICAgICAgIHstOTEsIDI2OX0sCi0gICAgICAgIHstOTAsIDI3MH0sCi0gICAgICAgIHstODksIDI3MX0sCi0gICAgICAgIHstMSwgMzU5fSwKLSAgICAgICAgezAsIDB9LAotICAgICAgICB7MSwgMX0sCi0gICAgICAgIHs4OSwgODl9LAotICAgICAgICB7OTAsIDkwfSwKLSAgICAgICAgezkxLCA5MX0sCi0gICAgICAgIHszNTksIDM1OX0sCi0gICAgICAgIHszNjAsIDB9LAotICAgICAgICB7MzYxLCAxfSwKLSAgICAgICAgezEwMDAwMCwgMjgwfQotICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgc3RydWN0IFRlc3RDYXNlIHsKKyAgICBpbnQgaW5wdXQ7CisgICAgaW50IGV4cGVjdGVkX291dHB1dDsKKyAgfSBUZXN0Q2FzZXNbXSA9IHt7LTEwMDAwMDAsIDgwfSwgey0zNjEsIDM1OX0sIHstMzYwLCAwfSwgIHstMzU5LCAxfSwKKyAgICAgICAgICAgICAgICAgICB7LTkxLCAyNjl9LCAgICAgey05MCwgMjcwfSwgIHstODksIDI3MX0sIHstMSwgMzU5fSwKKyAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAgICAgICAgezEsIDF9LCAgICAgIHs4OSwgODl9LCAgIHs5MCwgOTB9LAorICAgICAgICAgICAgICAgICAgIHs5MSwgOTF9LCAgICAgICB7MzU5LCAzNTl9LCAgezM2MCwgMH0sICAgezM2MSwgMX0sCisgICAgICAgICAgICAgICAgICAgezEwMDAwMCwgMjgwfX07CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShUZXN0Q2FzZXMpOyArK2kpIHsKLSAgICAgICAgRVhQRUNUX0VRKFRlc3RDYXNlc1tpXS5leHBlY3RlZF9vdXRwdXQsIFhGQV9NYXBSb3RhdGlvbihUZXN0Q2FzZXNbaV0uaW5wdXQpKTsKLSAgICB9CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKFRlc3RDYXNlcyk7ICsraSkgeworICAgIEVYUEVDVF9FUShUZXN0Q2FzZXNbaV0uZXhwZWN0ZWRfb3V0cHV0LAorICAgICAgICAgICAgICBYRkFfTWFwUm90YXRpb24oVGVzdENhc2VzW2ldLmlucHV0KSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfZ3JhcGhpY3MuY3BwIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9ncmFwaGljcy5jcHAKaW5kZXggYTkxNWExNy4uODk2M2IxMSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9ncmFwaGljcy5jcHAKKysrIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9ncmFwaGljcy5jcHAKQEAgLTYsMTM5NSArNiwxMjIyIEBACiANCiAjaW5jbHVkZSAicHJlLmgiDQogI2luY2x1ZGUgImZ4X3BhdGhfZ2VuZXJhdG9yLmgiDQotY2xhc3MgQ0FHR19HcmFwaGljcw0KLXsNCi1wdWJsaWM6DQotICAgIENBR0dfR3JhcGhpY3MoKTsNCi0gICAgRlhfRVJSIENyZWF0ZShDRlhfR3JhcGhpY3MgKiBvd25lciwNCi0gICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgIHdpZHRoLA0KLSAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgaGVpZ2h0LA0KLSAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCAgIGZvcm1hdCk7DQotICAgIHZpcnR1YWwgfkNBR0dfR3JhcGhpY3MoKTsNCi1wcml2YXRlOg0KLSAgICBDRlhfR3JhcGhpY3MgKiAgX293bmVyOw0KK2NsYXNzIENBR0dfR3JhcGhpY3Mgew0KKyBwdWJsaWM6DQorICBDQUdHX0dyYXBoaWNzKCk7DQorICBGWF9FUlIgQ3JlYXRlKENGWF9HcmFwaGljcyogb3duZXIsDQorICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0KTsNCisgIHZpcnR1YWwgfkNBR0dfR3JhcGhpY3MoKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9HcmFwaGljcyogX293bmVyOw0KIH07DQotQ0ZYX0dyYXBoaWNzOjpDRlhfR3JhcGhpY3MoKQ0KLXsNCi0gICAgX3R5cGUJPSBGWF9DT05URVhUX05vbmU7DQotICAgIF9pbmZvLl9ncmFwaFN0YXRlLlNldERhc2hDb3VudCgwKTsNCi0gICAgX2luZm8uX2lzQW50aWFsaWFzaW5nCT0gVFJVRTsNCi0gICAgX2luZm8uX3N0cm9rZUFsaWdubWVudAk9IEZYX1NUUk9LRUFMSUdOTUVOVF9DZW50ZXI7DQotICAgIF9pbmZvLl9DVE0uUmVzZXQoKTsNCi0gICAgX2luZm8uX2lzQWN0T25EYXNoCQk9IEZBTFNFOw0KLSAgICBfaW5mby5fc3Ryb2tlQ29sb3IJCT0gTlVMTDsNCi0gICAgX2luZm8uX2ZpbGxDb2xvcgkJPSBOVUxMOw0KLSAgICBfaW5mby5fZm9udAkJCQk9IE5VTEw7DQotICAgIF9pbmZvLl9mb250U2l6ZQkJCT0gNDAuMDsNCi0gICAgX2luZm8uX2ZvbnRIU2NhbGUJCT0gMS4wOw0KLSAgICBfaW5mby5fZm9udFNwYWNpbmcJCT0gMC4wOw0KLSAgICBfcmVuZGVyRGV2aWNlCQkJPSBOVUxMOw0KLSAgICBfYWdnR3JhcGhpY3MgICAgICAgICAgICA9IE5VTEw7DQorQ0ZYX0dyYXBoaWNzOjpDRlhfR3JhcGhpY3MoKSB7DQorICBfdHlwZSA9IEZYX0NPTlRFWFRfTm9uZTsNCisgIF9pbmZvLl9ncmFwaFN0YXRlLlNldERhc2hDb3VudCgwKTsNCisgIF9pbmZvLl9pc0FudGlhbGlhc2luZyA9IFRSVUU7DQorICBfaW5mby5fc3Ryb2tlQWxpZ25tZW50ID0gRlhfU1RST0tFQUxJR05NRU5UX0NlbnRlcjsNCisgIF9pbmZvLl9DVE0uUmVzZXQoKTsNCisgIF9pbmZvLl9pc0FjdE9uRGFzaCA9IEZBTFNFOw0KKyAgX2luZm8uX3N0cm9rZUNvbG9yID0gTlVMTDsNCisgIF9pbmZvLl9maWxsQ29sb3IgPSBOVUxMOw0KKyAgX2luZm8uX2ZvbnQgPSBOVUxMOw0KKyAgX2luZm8uX2ZvbnRTaXplID0gNDAuMDsNCisgIF9pbmZvLl9mb250SFNjYWxlID0gMS4wOw0KKyAgX2luZm8uX2ZvbnRTcGFjaW5nID0gMC4wOw0KKyAgX3JlbmRlckRldmljZSA9IE5VTEw7DQorICBfYWdnR3JhcGhpY3MgPSBOVUxMOw0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpDcmVhdGUoQ0ZYX1JlbmRlckRldmljZSAqIHJlbmRlckRldmljZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTAkJCSAgIGlzQW50aWFsaWFzaW5nICkNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZW5kZXJEZXZpY2UsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQotICAgIGlmIChfdHlwZSAhPSBGWF9DT05URVhUX05vbmUpIHsNCi0gICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgfQ0KLSAgICBfdHlwZQkJCQkJPSBGWF9DT05URVhUX0RldmljZTsNCi0gICAgX2luZm8uX2lzQW50aWFsaWFzaW5nCT0gaXNBbnRpYWxpYXNpbmc7DQotICAgIF9yZW5kZXJEZXZpY2UJCQk9IHJlbmRlckRldmljZTsNCi0gICAgaWYgKF9yZW5kZXJEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX1NPRlRfQ0xJUCkgew0KLSAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgIH0NCi0gICAgcmV0dXJuIEZYX0VSUl9JbmRlZmluaXRlOw0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkNyZWF0ZShDRlhfUmVuZGVyRGV2aWNlKiByZW5kZXJEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNBbnRpYWxpYXNpbmcpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZW5kZXJEZXZpY2UsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICBpZiAoX3R5cGUgIT0gRlhfQ09OVEVYVF9Ob25lKSB7DQorICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgIH0NCisgIF90eXBlID0gRlhfQ09OVEVYVF9EZXZpY2U7DQorICBfaW5mby5faXNBbnRpYWxpYXNpbmcgPSBpc0FudGlhbGlhc2luZzsNCisgIF9yZW5kZXJEZXZpY2UgPSByZW5kZXJEZXZpY2U7DQorICBpZiAoX3JlbmRlckRldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfU09GVF9DTElQKSB7DQorICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX0VSUl9JbmRlZmluaXRlOw0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpDcmVhdGUoaW50MzJfdAkgd2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QJIGhlaWdodCwNCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpDcmVhdGUoaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgICAgICBpc05hdGl2ZSAgICAgICAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wJCSBpc0FudGlhbGlhc2luZyApDQotew0KLSAgICBpZiAoX3R5cGUgIT0gRlhfQ09OVEVYVF9Ob25lKSB7DQotICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgIH0NCi0gICAgX3R5cGUJCQkJCT0gRlhfQ09OVEVYVF9EZXZpY2U7DQotICAgIF9pbmZvLl9pc0FudGlhbGlhc2luZwk9IGlzQW50aWFsaWFzaW5nOw0KLSAgICB7DQotICAgICAgICBfYWdnR3JhcGhpY3MgPSBGWF9ORVcgQ0FHR19HcmFwaGljczsNCi0gICAgICAgIHJldHVybiBfYWdnR3JhcGhpY3MtPkNyZWF0ZSh0aGlzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOw0KLSAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNOYXRpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNBbnRpYWxpYXNpbmcpIHsNCisgIGlmIChfdHlwZSAhPSBGWF9DT05URVhUX05vbmUpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgfQ0KKyAgX3R5cGUgPSBGWF9DT05URVhUX0RldmljZTsNCisgIF9pbmZvLl9pc0FudGlhbGlhc2luZyA9IGlzQW50aWFsaWFzaW5nOw0KKyAgew0KKyAgICBfYWdnR3JhcGhpY3MgPSBGWF9ORVcgQ0FHR19HcmFwaGljczsNCisgICAgcmV0dXJuIF9hZ2dHcmFwaGljcy0+Q3JlYXRlKHRoaXMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7DQorICB9DQogfQ0KLUNGWF9HcmFwaGljczo6fkNGWF9HcmFwaGljcygpDQotew0KLSAgICBpZiAoX2FnZ0dyYXBoaWNzKSB7DQotICAgICAgICBkZWxldGUgX2FnZ0dyYXBoaWNzOw0KLSAgICAgICAgX2FnZ0dyYXBoaWNzID0gTlVMTDsNCi0gICAgfQ0KLSAgICBfcmVuZGVyRGV2aWNlID0gTlVMTDsNCi0gICAgX2luZm8uX2dyYXBoU3RhdGUuU2V0RGFzaENvdW50KDApOw0KLSAgICBfdHlwZQk9IEZYX0NPTlRFWFRfTm9uZTsNCitDRlhfR3JhcGhpY3M6On5DRlhfR3JhcGhpY3MoKSB7DQorICBpZiAoX2FnZ0dyYXBoaWNzKSB7DQorICAgIGRlbGV0ZSBfYWdnR3JhcGhpY3M7DQorICAgIF9hZ2dHcmFwaGljcyA9IE5VTEw7DQorICB9DQorICBfcmVuZGVyRGV2aWNlID0gTlVMTDsNCisgIF9pbmZvLl9ncmFwaFN0YXRlLlNldERhc2hDb3VudCgwKTsNCisgIF90eXBlID0gRlhfQ09OVEVYVF9Ob25lOw0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXREZXZpY2VDYXAoY29uc3QgaW50MzJfdCBjYXBJRCwgRlhfRGV2aWNlQ2FwICYgY2FwVmFsKQ0KLXsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBjYXBWYWwgPSBfcmVuZGVyRGV2aWNlLT5HZXREZXZpY2VDYXBzKGNhcElEKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkdldERldmljZUNhcChjb25zdCBpbnQzMl90IGNhcElELCBGWF9EZXZpY2VDYXAmIGNhcFZhbCkgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBjYXBWYWwgPSBfcmVuZGVyRGV2aWNlLT5HZXREZXZpY2VDYXBzKGNhcElEKTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiAgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpJc1ByaW50ZXJEZXZpY2UoRlhfQk9PTCAmIGlzUHJpbnRlcikNCi17DQotICAgIHN3aXRjaCAoX3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2VDbGFzcyA9IF9yZW5kZXJEZXZpY2UtPkdldERldmljZUNsYXNzKCk7DQotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VDbGFzcyA9PSBGWERDX1BSSU5URVIpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlzUHJpbnRlciA9IFRSVUU7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpc1ByaW50ZXIgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgICAgICAgICB9DQorRlhfRVJSIENGWF9HcmFwaGljczo6SXNQcmludGVyRGV2aWNlKEZYX0JPT0wmIGlzUHJpbnRlcikgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBpbnQzMl90IGRldmljZUNsYXNzID0gX3JlbmRlckRldmljZS0+R2V0RGV2aWNlQ2xhc3MoKTsNCisgICAgICBpZiAoZGV2aWNlQ2xhc3MgPT0gRlhEQ19QUklOVEVSKSB7DQorICAgICAgICBpc1ByaW50ZXIgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpc1ByaW50ZXIgPSBGQUxTRTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6RW5hYmxlQW50aWFsaWFzaW5nKEZYX0JPT0wgaXNBbnRpYWxpYXNpbmcpDQotew0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIF9pbmZvLl9pc0FudGlhbGlhc2luZyA9IGlzQW50aWFsaWFzaW5nOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgICAgICAgICB9DQorRlhfRVJSIENGWF9HcmFwaGljczo6RW5hYmxlQW50aWFsaWFzaW5nKEZYX0JPT0wgaXNBbnRpYWxpYXNpbmcpIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgX2luZm8uX2lzQW50aWFsaWFzaW5nID0gaXNBbnRpYWxpYXNpbmc7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6U2F2ZUdyYXBoU3RhdGUoKQ0KLXsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBfcmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsNCi0gICAgICAgICAgICAgICAgVEluZm8gKiBpbmZvID0gRlhfTkVXIFRJbmZvOw0KLSAgICAgICAgICAgICAgICBpbmZvLT5fZ3JhcGhTdGF0ZS5Db3B5KF9pbmZvLl9ncmFwaFN0YXRlKTsNCi0gICAgICAgICAgICAgICAgaW5mby0+X2lzQW50aWFsaWFzaW5nCT0gX2luZm8uX2lzQW50aWFsaWFzaW5nOw0KLSAgICAgICAgICAgICAgICBpbmZvLT5fc3Ryb2tlQWxpZ25tZW50CT0gX2luZm8uX3N0cm9rZUFsaWdubWVudDsNCi0gICAgICAgICAgICAgICAgaW5mby0+X0NUTQkJCQk9IF9pbmZvLl9DVE07DQotICAgICAgICAgICAgICAgIGluZm8tPl9pc0FjdE9uRGFzaAkJPSBfaW5mby5faXNBY3RPbkRhc2g7DQotICAgICAgICAgICAgICAgIGluZm8tPl9zdHJva2VDb2xvcgkJPSBfaW5mby5fc3Ryb2tlQ29sb3I7DQotICAgICAgICAgICAgICAgIGluZm8tPl9maWxsQ29sb3IJCT0gX2luZm8uX2ZpbGxDb2xvcjsNCi0gICAgICAgICAgICAgICAgaW5mby0+X2ZvbnQJCQkJPSBfaW5mby5fZm9udDsNCi0gICAgICAgICAgICAgICAgaW5mby0+X2ZvbnRTaXplCQkJPSBfaW5mby5fZm9udFNpemU7DQotICAgICAgICAgICAgICAgIGluZm8tPl9mb250SFNjYWxlCQk9IF9pbmZvLl9mb250SFNjYWxlOw0KLSAgICAgICAgICAgICAgICBpbmZvLT5fZm9udFNwYWNpbmcJCT0gX2luZm8uX2ZvbnRTcGFjaW5nOw0KLSAgICAgICAgICAgICAgICBfaW5mb1N0YWNrLkFkZChpbmZvKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNhdmVHcmFwaFN0YXRlKCkgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBfcmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgICAgICBUSW5mbyogaW5mbyA9IEZYX05FVyBUSW5mbzsNCisgICAgICBpbmZvLT5fZ3JhcGhTdGF0ZS5Db3B5KF9pbmZvLl9ncmFwaFN0YXRlKTsNCisgICAgICBpbmZvLT5faXNBbnRpYWxpYXNpbmcgPSBfaW5mby5faXNBbnRpYWxpYXNpbmc7DQorICAgICAgaW5mby0+X3N0cm9rZUFsaWdubWVudCA9IF9pbmZvLl9zdHJva2VBbGlnbm1lbnQ7DQorICAgICAgaW5mby0+X0NUTSA9IF9pbmZvLl9DVE07DQorICAgICAgaW5mby0+X2lzQWN0T25EYXNoID0gX2luZm8uX2lzQWN0T25EYXNoOw0KKyAgICAgIGluZm8tPl9zdHJva2VDb2xvciA9IF9pbmZvLl9zdHJva2VDb2xvcjsNCisgICAgICBpbmZvLT5fZmlsbENvbG9yID0gX2luZm8uX2ZpbGxDb2xvcjsNCisgICAgICBpbmZvLT5fZm9udCA9IF9pbmZvLl9mb250Ow0KKyAgICAgIGluZm8tPl9mb250U2l6ZSA9IF9pbmZvLl9mb250U2l6ZTsNCisgICAgICBpbmZvLT5fZm9udEhTY2FsZSA9IF9pbmZvLl9mb250SFNjYWxlOw0KKyAgICAgIGluZm8tPl9mb250U3BhY2luZyA9IF9pbmZvLl9mb250U3BhY2luZzsNCisgICAgICBfaW5mb1N0YWNrLkFkZChpbmZvKTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiAgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpSZXN0b3JlR3JhcGhTdGF0ZSgpDQotew0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIF9yZW5kZXJEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHNpemUgPSBfaW5mb1N0YWNrLkdldFNpemUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHNpemUgPD0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9JbnRlcm1lZGlhdGVfVmFsdWVfSW52YWxpZDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHRvcEluZGV4ID0gc2l6ZSAtIDE7DQotICAgICAgICAgICAgICAgIFRJbmZvICogaW5mbyA9IChUSW5mbyAqKSBfaW5mb1N0YWNrLkdldEF0KHRvcEluZGV4KTsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGluZm8sIEZYX0VSUl9JbnRlcm1lZGlhdGVfVmFsdWVfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLkNvcHkoaW5mby0+X2dyYXBoU3RhdGUpOw0KLSAgICAgICAgICAgICAgICBfaW5mby5faXNBbnRpYWxpYXNpbmcJPSBpbmZvLT5faXNBbnRpYWxpYXNpbmc7DQotICAgICAgICAgICAgICAgIF9pbmZvLl9zdHJva2VBbGlnbm1lbnQJPSBpbmZvLT5fc3Ryb2tlQWxpZ25tZW50Ow0KLSAgICAgICAgICAgICAgICBfaW5mby5fQ1RNCQkJCT0gaW5mby0+X0NUTTsNCi0gICAgICAgICAgICAgICAgX2luZm8uX2lzQWN0T25EYXNoCQk9IGluZm8tPl9pc0FjdE9uRGFzaDsNCi0gICAgICAgICAgICAgICAgX2luZm8uX3N0cm9rZUNvbG9yCQk9IGluZm8tPl9zdHJva2VDb2xvcjsNCi0gICAgICAgICAgICAgICAgX2luZm8uX2ZpbGxDb2xvcgkJPSBpbmZvLT5fZmlsbENvbG9yOw0KLSAgICAgICAgICAgICAgICBfaW5mby5fZm9udAkJCQk9IGluZm8tPl9mb250Ow0KLSAgICAgICAgICAgICAgICBfaW5mby5fZm9udFNpemUJCQk9IGluZm8tPl9mb250U2l6ZTsNCi0gICAgICAgICAgICAgICAgX2luZm8uX2ZvbnRIU2NhbGUJCT0gaW5mby0+X2ZvbnRIU2NhbGU7DQotICAgICAgICAgICAgICAgIF9pbmZvLl9mb250U3BhY2luZwkJPSBpbmZvLT5fZm9udFNwYWNpbmc7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBpbmZvOw0KLSAgICAgICAgICAgICAgICBpbmZvID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgX2luZm9TdGFjay5SZW1vdmVBdCh0b3BJbmRleCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpSZXN0b3JlR3JhcGhTdGF0ZSgpIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgX3JlbmRlckRldmljZS0+UmVzdG9yZVN0YXRlKCk7DQorICAgICAgaW50MzJfdCBzaXplID0gX2luZm9TdGFjay5HZXRTaXplKCk7DQorICAgICAgaWYgKHNpemUgPD0gMCkgew0KKyAgICAgICAgcmV0dXJuIEZYX0VSUl9JbnRlcm1lZGlhdGVfVmFsdWVfSW52YWxpZDsNCisgICAgICB9DQorICAgICAgaW50MzJfdCB0b3BJbmRleCA9IHNpemUgLSAxOw0KKyAgICAgIFRJbmZvKiBpbmZvID0gKFRJbmZvKilfaW5mb1N0YWNrLkdldEF0KHRvcEluZGV4KTsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaW5mbywgRlhfRVJSX0ludGVybWVkaWF0ZV9WYWx1ZV9JbnZhbGlkKTsNCisgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5Db3B5KGluZm8tPl9ncmFwaFN0YXRlKTsNCisgICAgICBfaW5mby5faXNBbnRpYWxpYXNpbmcgPSBpbmZvLT5faXNBbnRpYWxpYXNpbmc7DQorICAgICAgX2luZm8uX3N0cm9rZUFsaWdubWVudCA9IGluZm8tPl9zdHJva2VBbGlnbm1lbnQ7DQorICAgICAgX2luZm8uX0NUTSA9IGluZm8tPl9DVE07DQorICAgICAgX2luZm8uX2lzQWN0T25EYXNoID0gaW5mby0+X2lzQWN0T25EYXNoOw0KKyAgICAgIF9pbmZvLl9zdHJva2VDb2xvciA9IGluZm8tPl9zdHJva2VDb2xvcjsNCisgICAgICBfaW5mby5fZmlsbENvbG9yID0gaW5mby0+X2ZpbGxDb2xvcjsNCisgICAgICBfaW5mby5fZm9udCA9IGluZm8tPl9mb250Ow0KKyAgICAgIF9pbmZvLl9mb250U2l6ZSA9IGluZm8tPl9mb250U2l6ZTsNCisgICAgICBfaW5mby5fZm9udEhTY2FsZSA9IGluZm8tPl9mb250SFNjYWxlOw0KKyAgICAgIF9pbmZvLl9mb250U3BhY2luZyA9IGluZm8tPl9mb250U3BhY2luZzsNCisgICAgICBkZWxldGUgaW5mbzsNCisgICAgICBpbmZvID0gTlVMTDsNCisgICAgICBfaW5mb1N0YWNrLlJlbW92ZUF0KHRvcEluZGV4KTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiAgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXRMaW5lQ2FwKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCAmIGxpbmVDYXApDQotew0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIGxpbmVDYXAgPSBfaW5mby5fZ3JhcGhTdGF0ZS5tX0xpbmVDYXA7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXRMaW5lQ2FwKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCYgbGluZUNhcCkgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBsaW5lQ2FwID0gX2luZm8uX2dyYXBoU3RhdGUubV9MaW5lQ2FwOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldExpbmVDYXAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIGxpbmVDYXApDQotew0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLm1fTGluZUNhcCA9IGxpbmVDYXA7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRMaW5lQ2FwKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCBsaW5lQ2FwKSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLm1fTGluZUNhcCA9IGxpbmVDYXA7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6R2V0RGFzaENvdW50KGludDMyX3QgJiBkYXNoQ291bnQpDQotew0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIGRhc2hDb3VudCA9IF9pbmZvLl9ncmFwaFN0YXRlLm1fRGFzaENvdW50Ow0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgICAgICAgICB9DQorRlhfRVJSIENGWF9HcmFwaGljczo6R2V0RGFzaENvdW50KGludDMyX3QmIGRhc2hDb3VudCkgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBkYXNoQ291bnQgPSBfaW5mby5fZ3JhcGhTdGF0ZS5tX0Rhc2hDb3VudDsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiAgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXRMaW5lRGFzaChGWF9GTE9BVCAmIGRhc2hQaGFzZSwgRlhfRkxPQVQgKiBkYXNoQXJyYXkpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZGFzaEFycmF5LCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIGRhc2hQaGFzZSA9IF9pbmZvLl9ncmFwaFN0YXRlLm1fRGFzaFBoYXNlOw0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkoZGFzaEFycmF5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2luZm8uX2dyYXBoU3RhdGUubV9EYXNoQXJyYXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5tX0Rhc2hDb3VudCAqIHNpemVvZiAoRlhfRkxPQVQpKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkdldExpbmVEYXNoKEZYX0ZMT0FUJiBkYXNoUGhhc2UsIEZYX0ZMT0FUKiBkYXNoQXJyYXkpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChkYXNoQXJyYXksIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIGRhc2hQaGFzZSA9IF9pbmZvLl9ncmFwaFN0YXRlLm1fRGFzaFBoYXNlOw0KKyAgICAgIEZYU1lTX21lbWNweShkYXNoQXJyYXksIF9pbmZvLl9ncmFwaFN0YXRlLm1fRGFzaEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5tX0Rhc2hDb3VudCAqIHNpemVvZihGWF9GTE9BVCkpOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldExpbmVEYXNoKEZYX0ZMT0FUCWRhc2hQaGFzZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCAqCWRhc2hBcnJheSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90CWRhc2hDb3VudCkNCi17DQotICAgIGlmIChkYXNoQ291bnQgPiAwICYmICFkYXNoQXJyYXkpIHsNCi0gICAgICAgIHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0TGluZURhc2goRlhfRkxPQVQgZGFzaFBoYXNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBkYXNoQXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXNoQ291bnQpIHsNCisgIGlmIChkYXNoQ291bnQgPiAwICYmICFkYXNoQXJyYXkpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCisgIH0NCisgIGRhc2hDb3VudCA9IGRhc2hDb3VudCA8IDAgPyAwIDogZGFzaENvdW50Ow0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBGWF9GTE9BVCBzY2FsZSA9IDEuMDsNCisgICAgICBpZiAoX2luZm8uX2lzQWN0T25EYXNoKSB7DQorICAgICAgICBzY2FsZSA9IF9pbmZvLl9ncmFwaFN0YXRlLm1fTGluZVdpZHRoOw0KKyAgICAgIH0NCisgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5tX0Rhc2hQaGFzZSA9IGRhc2hQaGFzZTsNCisgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5TZXREYXNoQ291bnQoZGFzaENvdW50KTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkYXNoQ291bnQ7IGkrKykgew0KKyAgICAgICAgX2luZm8uX2dyYXBoU3RhdGUubV9EYXNoQXJyYXlbaV0gPSBkYXNoQXJyYXlbaV0gKiBzY2FsZTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCi0gICAgZGFzaENvdW50ID0gZGFzaENvdW50IDwgMCA/IDAgOiBkYXNoQ291bnQ7DQotICAgIHN3aXRjaCAoX3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgc2NhbGUgPSAxLjA7DQotICAgICAgICAgICAgICAgIGlmIChfaW5mby5faXNBY3RPbkRhc2gpIHsNCi0gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gX2luZm8uX2dyYXBoU3RhdGUubV9MaW5lV2lkdGg7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgX2luZm8uX2dyYXBoU3RhdGUubV9EYXNoUGhhc2UgPSBkYXNoUGhhc2U7DQotICAgICAgICAgICAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLlNldERhc2hDb3VudChkYXNoQ291bnQpOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkYXNoQ291bnQ7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgX2luZm8uX2dyYXBoU3RhdGUubV9EYXNoQXJyYXlbaV0gPSBkYXNoQXJyYXlbaV0gKiBzY2FsZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgICAgICAgICB9DQotICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6U2V0TGluZURhc2goRlhfRGFzaFN0eWxlIGRhc2hTdHlsZSkNCi17DQotICAgIHN3aXRjaCAoX3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFJlbmRlckRldmljZVNldExpbmVEYXNoKGRhc2hTdHlsZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldExpbmVEYXNoKEZYX0Rhc2hTdHlsZSBkYXNoU3R5bGUpIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgcmV0dXJuIFJlbmRlckRldmljZVNldExpbmVEYXNoKGRhc2hTdHlsZSk7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6R2V0TGluZUpvaW4oQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbiAmIGxpbmVKb2luKQ0KLXsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBsaW5lSm9pbiA9IF9pbmZvLl9ncmFwaFN0YXRlLm1fTGluZUpvaW47DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXRMaW5lSm9pbihDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luJiBsaW5lSm9pbikgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBsaW5lSm9pbiA9IF9pbmZvLl9ncmFwaFN0YXRlLm1fTGluZUpvaW47DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6U2V0TGluZUpvaW4oQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbiBsaW5lSm9pbikNCi17DQotICAgIHN3aXRjaCAoX3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgX2luZm8uX2dyYXBoU3RhdGUubV9MaW5lSm9pbiA9IGxpbmVKb2luOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgICAgICAgICB9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0TGluZUpvaW4oQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbiBsaW5lSm9pbikgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5tX0xpbmVKb2luID0gbGluZUpvaW47DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6R2V0TWl0ZXJMaW1pdChGWF9GTE9BVCAmIG1pdGVyTGltaXQpDQotew0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIG1pdGVyTGltaXQgPSBfaW5mby5fZ3JhcGhTdGF0ZS5tX01pdGVyTGltaXQ7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXRNaXRlckxpbWl0KEZYX0ZMT0FUJiBtaXRlckxpbWl0KSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIG1pdGVyTGltaXQgPSBfaW5mby5fZ3JhcGhTdGF0ZS5tX01pdGVyTGltaXQ7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6U2V0TWl0ZXJMaW1pdChGWF9GTE9BVCBtaXRlckxpbWl0KQ0KLXsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5tX01pdGVyTGltaXQgPSBtaXRlckxpbWl0Ow0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgICAgICAgICB9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0TWl0ZXJMaW1pdChGWF9GTE9BVCBtaXRlckxpbWl0KSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLm1fTWl0ZXJMaW1pdCA9IG1pdGVyTGltaXQ7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6R2V0TGluZVdpZHRoKEZYX0ZMT0FUICYgbGluZVdpZHRoKQ0KLXsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBsaW5lV2lkdGggPSBfaW5mby5fZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aDsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkdldExpbmVXaWR0aChGWF9GTE9BVCYgbGluZVdpZHRoKSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIGxpbmVXaWR0aCA9IF9pbmZvLl9ncmFwaFN0YXRlLm1fTGluZVdpZHRoOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldExpbmVXaWR0aChGWF9GTE9BVCBsaW5lV2lkdGgsIEZYX0JPT0wgaXNBY3RPbkRhc2ggKQ0KLXsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aAk9IGxpbmVXaWR0aDsNCi0gICAgICAgICAgICAgICAgX2luZm8uX2lzQWN0T25EYXNoCQkJCT0gaXNBY3RPbkRhc2g7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRMaW5lV2lkdGgoRlhfRkxPQVQgbGluZVdpZHRoLCBGWF9CT09MIGlzQWN0T25EYXNoKSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLm1fTGluZVdpZHRoID0gbGluZVdpZHRoOw0KKyAgICAgIF9pbmZvLl9pc0FjdE9uRGFzaCA9IGlzQWN0T25EYXNoOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OkdldFN0cm9rZUFsaWdubWVudChGWF9TdHJva2VBbGlnbm1lbnQgJiBzdHJva2VBbGlnbm1lbnQpDQotew0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIHN0cm9rZUFsaWdubWVudCA9IF9pbmZvLl9zdHJva2VBbGlnbm1lbnQ7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXRTdHJva2VBbGlnbm1lbnQoRlhfU3Ryb2tlQWxpZ25tZW50JiBzdHJva2VBbGlnbm1lbnQpIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgc3Ryb2tlQWxpZ25tZW50ID0gX2luZm8uX3N0cm9rZUFsaWdubWVudDsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiAgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRTdHJva2VBbGlnbm1lbnQoRlhfU3Ryb2tlQWxpZ25tZW50IHN0cm9rZUFsaWdubWVudCkNCi17DQotICAgIHN3aXRjaCAoX3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgX2luZm8uX3N0cm9rZUFsaWdubWVudCA9IHN0cm9rZUFsaWdubWVudDsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldFN0cm9rZUFsaWdubWVudChGWF9TdHJva2VBbGlnbm1lbnQgc3Ryb2tlQWxpZ25tZW50KSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9zdHJva2VBbGlnbm1lbnQgPSBzdHJva2VBbGlnbm1lbnQ7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6U2V0U3Ryb2tlQ29sb3IoQ0ZYX0NvbG9yICogY29sb3IpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoY29sb3IsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQotICAgIHN3aXRjaCAoX3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgX2luZm8uX3N0cm9rZUNvbG9yID0gY29sb3I7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRTdHJva2VDb2xvcihDRlhfQ29sb3IqIGNvbG9yKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoY29sb3IsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9zdHJva2VDb2xvciA9IGNvbG9yOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldEZpbGxDb2xvcihDRlhfQ29sb3IgKiBjb2xvcikNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChjb2xvciwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBfaW5mby5fZmlsbENvbG9yID0gY29sb3I7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRGaWxsQ29sb3IoQ0ZYX0NvbG9yKiBjb2xvcikgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGNvbG9yLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBfaW5mby5fZmlsbENvbG9yID0gY29sb3I7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6U3Ryb2tlUGF0aChDRlhfUGF0aCAqIHBhdGgsIENGWF9NYXRyaXggKiBtYXRyaXggKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBhdGgsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQotICAgIHN3aXRjaCAoX3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFJlbmRlckRldmljZVN0cm9rZVBhdGgocGF0aCwgbWF0cml4KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgICAgICAgICB9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U3Ryb2tlUGF0aChDRlhfUGF0aCogcGF0aCwgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGF0aCwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgcmV0dXJuIFJlbmRlckRldmljZVN0cm9rZVBhdGgocGF0aCwgbWF0cml4KTsNCiAgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpGaWxsUGF0aChDRlhfUGF0aCAqICAgcGF0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSAgZmlsbE1vZGUJLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKiBtYXRyaXgJKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBhdGgsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQotICAgIHN3aXRjaCAoX3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFJlbmRlckRldmljZUZpbGxQYXRoKHBhdGgsIGZpbGxNb2RlLCBtYXRyaXgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpGaWxsUGF0aChDRlhfUGF0aCogcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSBmaWxsTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwYXRoLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICByZXR1cm4gUmVuZGVyRGV2aWNlRmlsbFBhdGgocGF0aCwgZmlsbE1vZGUsIG1hdHJpeCk7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6Q2xpcFBhdGgoQ0ZYX1BhdGggKiAgIHBhdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUgIGZpbGxNb2RlCSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICogbWF0cml4CSkNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwYXRoLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgcmVzdWx0ID0gX3JlbmRlckRldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwYXRoLT5HZXRQYXRoRGF0YSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopIG1hdHJpeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsTW9kZSk7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9JbmRlZmluaXRlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkNsaXBQYXRoKENGWF9QYXRoKiBwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBhdGgsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIEZYX0JPT0wgcmVzdWx0ID0gX3JlbmRlckRldmljZS0+U2V0Q2xpcF9QYXRoRmlsbCgNCisgICAgICAgICAgcGF0aC0+R2V0UGF0aERhdGEoKSwgKENGWF9BZmZpbmVNYXRyaXgqKW1hdHJpeCwgZmlsbE1vZGUpOw0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9JbmRlZmluaXRlKTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiAgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSAqCSAgc291cmNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGICYgcG9pbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkJICBtYXRyaXggKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNvdXJjZSwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gUmVuZGVyRGV2aWNlRHJhd0ltYWdlKHNvdXJjZSwgcG9pbnQsIG1hdHJpeCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkRyYXdJbWFnZShDRlhfRElCU291cmNlKiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChzb3VyY2UsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIHJldHVybiBSZW5kZXJEZXZpY2VEcmF3SW1hZ2Uoc291cmNlLCBwb2ludCwgbWF0cml4KTsNCiAgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTdHJldGNoSW1hZ2UoQ0ZYX0RJQlNvdXJjZSAqCXNvdXJjZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGICYJcmVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCQltYXRyaXggKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNvdXJjZSwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gUmVuZGVyRGV2aWNlU3RyZXRjaEltYWdlKHNvdXJjZSwgcmVjdCwgbWF0cml4KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgICAgICAgICB9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U3RyZXRjaEltYWdlKENGWF9ESUJTb3VyY2UqIHNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChzb3VyY2UsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIHJldHVybiBSZW5kZXJEZXZpY2VTdHJldGNoSW1hZ2Uoc291cmNlLCByZWN0LCBtYXRyaXgpOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OkNvbmNhdE1hdHJpeChDRlhfTWF0cml4ICogbWF0cml4KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeCwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBfaW5mby5fQ1RNLkNvbmNhdCgqbWF0cml4KTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkNvbmNhdE1hdHJpeChDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtYXRyaXgsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9DVE0uQ29uY2F0KCptYXRyaXgpOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUNGWF9NYXRyaXggKiBDRlhfR3JhcGhpY3M6OkdldE1hdHJpeCgpDQotew0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBOVUxMKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICZfaW5mby5fQ1RNOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICAgICAgfQ0KK0NGWF9NYXRyaXgqIENGWF9HcmFwaGljczo6R2V0TWF0cml4KCkgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIE5VTEwpOw0KKyAgICAgIHJldHVybiAmX2luZm8uX0NUTTsNCiAgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBOVUxMOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OkdldENsaXBSZWN0KENGWF9SZWN0RiAmIHJlY3QpDQotew0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIEZYX1JFQ1QgciA9IF9yZW5kZXJEZXZpY2UtPkdldENsaXBCb3goKTsNCi0gICAgICAgICAgICAgICAgcmVjdC5sZWZ0CT0gKEZYX0ZMT0FUKSByLmxlZnQ7DQotICAgICAgICAgICAgICAgIHJlY3QudG9wCT0gKEZYX0ZMT0FUKSByLnRvcDsNCi0gICAgICAgICAgICAgICAgcmVjdC53aWR0aAk9IChGWF9GTE9BVCkgci5XaWR0aCgpOw0KLSAgICAgICAgICAgICAgICByZWN0LmhlaWdodAk9IChGWF9GTE9BVCkgci5IZWlnaHQoKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkdldENsaXBSZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBGWF9SRUNUIHIgPSBfcmVuZGVyRGV2aWNlLT5HZXRDbGlwQm94KCk7DQorICAgICAgcmVjdC5sZWZ0ID0gKEZYX0ZMT0FUKXIubGVmdDsNCisgICAgICByZWN0LnRvcCA9IChGWF9GTE9BVClyLnRvcDsNCisgICAgICByZWN0LndpZHRoID0gKEZYX0ZMT0FUKXIuV2lkdGgoKTsNCisgICAgICByZWN0LmhlaWdodCA9IChGWF9GTE9BVClyLkhlaWdodCgpOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiAmIHJlY3QpDQotew0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIEZYX1JFQ1QgcihGWFNZU19yb3VuZChyZWN0LmxlZnQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdC50b3ApLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdC5yaWdodCgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHJlY3QuYm90dG9tKCkpKTsNCi0gICAgICAgICAgICAgICAgRlhfQk9PTCByZXN1bHQgPSBfcmVuZGVyRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnIpOw0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgICAgICAgICB9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIEZYX1JFQ1QgcihGWFNZU19yb3VuZChyZWN0LmxlZnQpLCBGWFNZU19yb3VuZChyZWN0LnRvcCksDQorICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHJlY3QucmlnaHQoKSksIEZYU1lTX3JvdW5kKHJlY3QuYm90dG9tKCkpKTsNCisgICAgICBGWF9CT09MIHJlc3VsdCA9IF9yZW5kZXJEZXZpY2UtPlNldENsaXBfUmVjdCgmcik7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX01ldGhvZF9Ob3RfU3VwcG9ydGVkKTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiAgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpDbGVhckNsaXAoKQ0KLXsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBGWF9CT09MIHJlc3VsdCA9IEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpDbGVhckNsaXAoKSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIEZYX0JPT0wgcmVzdWx0ID0gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQpOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldEZvbnQoQ0ZYX0ZvbnQgKiBmb250KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGZvbnQsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQotICAgIHN3aXRjaCAoX3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgX2luZm8uX2ZvbnQgPSBmb250Ow0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgICAgICAgICB9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0Rm9udChDRlhfRm9udCogZm9udCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGZvbnQsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9mb250ID0gZm9udDsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiAgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRGb250U2l6ZShjb25zdCBGWF9GTE9BVCBzaXplKQ0KLXsNCi0gICAgRlhfRkxPQVQgZm9udFNpemUgPSBzaXplIDw9IDAgPyAxLjBmIDogc2l6ZTsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBfaW5mby5fZm9udFNpemUgPSBmb250U2l6ZTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldEZvbnRTaXplKGNvbnN0IEZYX0ZMT0FUIHNpemUpIHsNCisgIEZYX0ZMT0FUIGZvbnRTaXplID0gc2l6ZSA8PSAwID8gMS4wZiA6IHNpemU7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9mb250U2l6ZSA9IGZvbnRTaXplOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldEZvbnRIU2NhbGUoY29uc3QgRlhfRkxPQVQgc2NhbGUpDQotew0KLSAgICBGWF9GTE9BVCBmb250SFNjYWxlID0gc2NhbGUgPD0gMCA/IDEuMGYgOiBzY2FsZTsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBfaW5mby5fZm9udEhTY2FsZSA9IGZvbnRIU2NhbGU7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRGb250SFNjYWxlKGNvbnN0IEZYX0ZMT0FUIHNjYWxlKSB7DQorICBGWF9GTE9BVCBmb250SFNjYWxlID0gc2NhbGUgPD0gMCA/IDEuMGYgOiBzY2FsZTsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgX2luZm8uX2ZvbnRIU2NhbGUgPSBmb250SFNjYWxlOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldENoYXJTcGFjaW5nKGNvbnN0IEZYX0ZMT0FUIHNwYWNpbmcpDQotew0KLSAgICBGWF9GTE9BVCBmb250U3BhY2luZyA9IHNwYWNpbmcgPCAwID8gMCA6IHNwYWNpbmc7DQotICAgIHN3aXRjaCAoX3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgX2luZm8uX2ZvbnRTcGFjaW5nID0gZm9udFNwYWNpbmc7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRDaGFyU3BhY2luZyhjb25zdCBGWF9GTE9BVCBzcGFjaW5nKSB7DQorICBGWF9GTE9BVCBmb250U3BhY2luZyA9IHNwYWNpbmcgPCAwID8gMCA6IHNwYWNpbmc7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9mb250U3BhY2luZyA9IGZvbnRTcGFjaW5nOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldFRleHREcmF3aW5nTW9kZShjb25zdCBpbnQzMl90IG1vZGUpDQotew0KLSAgICBzd2l0Y2ggKF90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQotICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRUZXh0RHJhd2luZ01vZGUoY29uc3QgaW50MzJfdCBtb2RlKSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KICAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlNob3dUZXh0KGNvbnN0IENGWF9Qb2ludEYgJgkgcG9pbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB0ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkJCSBtYXRyaXggKQ0KLXsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gUmVuZGVyRGV2aWNlU2hvd1RleHQocG9pbnQsIHRleHQsIG1hdHJpeCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNob3dUZXh0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICByZXR1cm4gUmVuZGVyRGV2aWNlU2hvd1RleHQocG9pbnQsIHRleHQsIG1hdHJpeCk7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6Q2FsY1RleHRSZWN0KENGWF9SZWN0RiAmCQkJIHJlY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTAkJCQkgaXNNdWx0aWxpbmUgLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4ICoJCQkgbWF0cml4CQkgKQ0KLXsNCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aCA9IHRleHQuR2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIEZYX0RXT1JEICogY2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIGxlbmd0aCk7DQotICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TICogY2hhclBvcyA9IEZYX0FsbG9jKEZYVEVYVF9DSEFSUE9TLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggKiBzaXplb2YgKEZYVEVYVF9DSEFSUE9TKSk7DQotICAgICAgICAgICAgICAgIENhbGNUZXh0SW5mbyh0ZXh0LCBjaGFyQ29kZXMsIGNoYXJQb3MsIHJlY3QpOw0KLSAgICAgICAgICAgICAgICBGWF9GcmVlKGNoYXJQb3MpOw0KLSAgICAgICAgICAgICAgICBGWF9GcmVlKGNoYXJDb2Rlcyk7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpDYWxjVGV4dFJlY3QoQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgdGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc011bHRpbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIGludDMyX3QgbGVuZ3RoID0gdGV4dC5HZXRMZW5ndGgoKTsNCisgICAgICBGWF9EV09SRCogY2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIGxlbmd0aCk7DQorICAgICAgRlhURVhUX0NIQVJQT1MqIGNoYXJQb3MgPQ0KKyAgICAgICAgICBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgbGVuZ3RoICogc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSk7DQorICAgICAgQ2FsY1RleHRJbmZvKHRleHQsIGNoYXJDb2RlcywgY2hhclBvcywgcmVjdCk7DQorICAgICAgRlhfRnJlZShjaGFyUG9zKTsNCisgICAgICBGWF9GcmVlKGNoYXJDb2Rlcyk7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6VHJhbnNmZXIoQ0ZYX0dyYXBoaWNzICogZ3JhcGhpY3MsIENGWF9NYXRyaXggKiBtYXRyaXggKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGdyYXBoaWNzLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KLSAgICBDRlhfTWF0cml4IG07DQotICAgIG0uU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLCBfaW5mby5fQ1RNLmYpOw0KLSAgICBpZiAobWF0cml4KSB7DQotICAgICAgICBtLkNvbmNhdCgqbWF0cml4KTsNCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpUcmFuc2ZlcihDRlhfR3JhcGhpY3MqIGdyYXBoaWNzLCBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChncmFwaGljcywgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIENGWF9NYXRyaXggbTsNCisgIG0uU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLA0KKyAgICAgICAgX2luZm8uX0NUTS5mKTsNCisgIGlmIChtYXRyaXgpIHsNCisgICAgbS5Db25jYXQoKm1hdHJpeCk7DQorICB9DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIHsNCisgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChncmFwaGljcy0+X3JlbmRlckRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBncmFwaGljcy0+X3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICAgICAgICBGWF9CT09MIHJlc3VsdCA9IF9yZW5kZXJEZXZpY2UtPlNldERJQml0cyhiaXRtYXAsIDAsIDApOw0KKyAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX01ldGhvZF9Ob3RfU3VwcG9ydGVkKTsNCisgICAgICB9DQogICAgIH0NCi0gICAgc3dpdGNoIChfdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KLSAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZ3JhcGhpY3MtPl9yZW5kZXJEZXZpY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCAqIGJpdG1hcCA9IGdyYXBoaWNzLT5fcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgcmVzdWx0ID0gX3JlbmRlckRldmljZS0+U2V0RElCaXRzKGJpdG1hcCwgMCwgMCk7DQotICAgICAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlRyYW5zZmVyKENGWF9HcmFwaGljcyAqCWdyYXBoaWNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUCQkJc3JjTGVmdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVAkJCXNyY1RvcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYgJglkc3RSZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkJbWF0cml4ICApDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZ3JhcGhpY3MsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQotICAgIENGWF9NYXRyaXggbTsNCi0gICAgbS5TZXQoX2luZm8uX0NUTS5hLCBfaW5mby5fQ1RNLmIsIF9pbmZvLl9DVE0uYywgX2luZm8uX0NUTS5kLCBfaW5mby5fQ1RNLmUsIF9pbmZvLl9DVE0uZik7DQotICAgIGlmIChtYXRyaXgpIHsNCi0gICAgICAgIG0uQ29uY2F0KCptYXRyaXgpOw0KLSAgICB9DQotICAgIHN3aXRjaCAoX3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGdyYXBoaWNzLT5fcmVuZGVyRGV2aWNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQotICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAgKiBiaXRtYXAgPSBncmFwaGljcy0+X3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIHJlc3VsdCA9IEZYX0VSUl9JbmRlZmluaXRlOw0KLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwIGJtcDsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJtcC5DcmVhdGUoKGludDMyX3QpIGRzdFJlY3Qud2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSBkc3RSZWN0LmhlaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5HZXRGb3JtYXQoKSk7DQotICAgICAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfSW50ZXJtZWRpYXRlX1ZhbHVlX0ludmFsaWQpOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ3JhcGhpY3MtPl9yZW5kZXJEZXZpY2UtPkdldERJQml0cygmYm1wLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpIHNyY0xlZnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkgc3JjVG9wKTsNCi0gICAgICAgICAgICAgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZCk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfcmVuZGVyRGV2aWNlLT5TZXRESUJpdHMoJmJtcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkgZHN0UmVjdC5sZWZ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSBkc3RSZWN0LnRvcCk7DQotICAgICAgICAgICAgICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgICAgICAgICB9DQotICAgIH0NCi19DQotQ0ZYX1JlbmRlckRldmljZSAqIENGWF9HcmFwaGljczo6R2V0UmVuZGVyRGV2aWNlKCkNCi17DQotICAgIHJldHVybiBfcmVuZGVyRGV2aWNlOw0KLX0NCi1GWF9FUlIJQ0ZYX0dyYXBoaWNzOjpJbnZlcnNlUmVjdChjb25zdCBDRlhfUmVjdEYgJiByZWN0KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgQ0ZYX0RJQml0bWFwICogYml0bWFwID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChiaXRtYXAsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgQ0ZYX1JlY3RGIHRlbXAocmVjdCk7DQotICAgIF9pbmZvLl9DVE0uVHJhbnNmb3JtUmVjdCh0ZW1wKTsNCi0gICAgQ0ZYX1JlY3RGIHI7DQotICAgIHIuU2V0KDAsIDAsIChGWF9GTE9BVCliaXRtYXAtPkdldFdpZHRoKCksIChGWF9GTE9BVCliaXRtYXAtPkdldFdpZHRoKCkpOw0KLSAgICByLkludGVyc2VjdCh0ZW1wKTsNCi0gICAgaWYgKHIuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkOw0KLSAgICB9DQotICAgIEZYX0FSR0IqIHBCdWYgPSAoRlhfQVJHQiopKGJpdG1hcC0+R2V0QnVmZmVyKCkgKyBpbnQzMl90KHIudG9wKSAqIGJpdG1hcC0+R2V0UGl0Y2goKSk7DQotICAgIGludDMyX3QgYm90dG9tID0gKGludDMyX3Qpci5ib3R0b20oKTsNCi0gICAgaW50MzJfdCByaWdodCA9IChpbnQzMl90KXIucmlnaHQoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAoaW50MzJfdClyLnRvcDsgaSA8IGJvdHRvbTsgaSArKykgew0KLSAgICAgICAgRlhfQVJHQiogcExpbmUgPSBwQnVmICsgKGludDMyX3Qpci5sZWZ0Ow0KLSAgICAgICAgZm9yIChpbnQzMl90IGogPSAoaW50MzJfdClyLmxlZnQ7IGogPCByaWdodDsgaiArKykgew0KLSAgICAgICAgICAgIEZYX0FSR0IgYyA9ICpwTGluZTsNCi0gICAgICAgICAgICAqcExpbmUgKysgPSAoYyAmIDB4RkYwMDAwMDApIHwgKDB4RkZGRkZGIC0gKGMgJiAweDAwRkZGRkZGKSk7DQotICAgICAgICB9DQotICAgICAgICBwQnVmID0gKEZYX0FSR0IqKSgodWludDhfdCopcEJ1ZiArIGJpdG1hcC0+R2V0UGl0Y2goKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlhvckRJQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCAqIHNyY0JpdG1hcCwgY29uc3QgQ0ZYX1JlY3RGICYgcmVjdCkNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgIENGWF9ESUJpdG1hcCAqIGRzdCA9IF9yZW5kZXJEZXZpY2UtPkdldEJpdG1hcCgpOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZHN0LCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgIENGWF9SZWN0RiB0ZW1wKHJlY3QpOw0KLSAgICBfaW5mby5fQ1RNLlRyYW5zZm9ybVJlY3QodGVtcCk7DQotICAgIENGWF9SZWN0RiByOw0KLSAgICByLlNldCgwLCAwLCAoRlhfRkxPQVQpZHN0LT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpZHN0LT5HZXRXaWR0aCgpKTsNCi0gICAgci5JbnRlcnNlY3QodGVtcCk7DQotICAgIGlmIChyLklzRW1wdHkoKSkgew0KLSAgICAgICAgcmV0dXJuIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCi0gICAgfQ0KLSAgICBGWF9BUkdCKiBwU3JjQnVmID0gKEZYX0FSR0IqKShzcmNCaXRtYXAtPkdldEJ1ZmZlcigpICsgaW50MzJfdChyLnRvcCkgKiBzcmNCaXRtYXAtPkdldFBpdGNoKCkpOw0KLSAgICBGWF9BUkdCKiBwRHN0QnVmID0gKEZYX0FSR0IqKShkc3QtPkdldEJ1ZmZlcigpICsgaW50MzJfdChyLnRvcCkgKiBkc3QtPkdldFBpdGNoKCkpOw0KLSAgICBpbnQzMl90IGJvdHRvbSA9IChpbnQzMl90KXIuYm90dG9tKCk7DQotICAgIGludDMyX3QgcmlnaHQgPSAoaW50MzJfdClyLnJpZ2h0KCk7DQotICAgIGZvciAoaW50MzJfdCBpID0gKGludDMyX3Qpci50b3A7IGkgPCBib3R0b207IGkgKyspIHsNCi0gICAgICAgIEZYX0FSR0IqIHBTcmNMaW5lID0gcFNyY0J1ZiArIChpbnQzMl90KXIubGVmdDsNCi0gICAgICAgIEZYX0FSR0IqIHBEc3RMaW5lID0gcERzdEJ1ZiArIChpbnQzMl90KXIubGVmdDsNCi0gICAgICAgIGZvciAoaW50MzJfdCBqID0gKGludDMyX3Qpci5sZWZ0OyBqIDwgcmlnaHQ7IGogKyspIHsNCi0gICAgICAgICAgICBGWF9BUkdCIGMgPSAqcERzdExpbmU7DQotICAgICAgICAgICAgKnBEc3RMaW5lICsrID0gQXJnYkVuY29kZShGWEFSR0JfQShjKSwgKGMgJiAweEZGRkZGRikgXiAoKnBTcmNMaW5lICYgMHhGRkZGRkYpKTsNCi0gICAgICAgICAgICBwU3JjTGluZSArKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHBTcmNCdWYgPSAoRlhfQVJHQiopKCh1aW50OF90KilwU3JjQnVmICsgc3JjQml0bWFwLT5HZXRQaXRjaCgpKTsNCi0gICAgICAgIHBEc3RCdWYgPSAoRlhfQVJHQiopKCh1aW50OF90KilwRHN0QnVmICsgZHN0LT5HZXRQaXRjaCgpKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi19DQotRlhfRVJSIENGWF9HcmFwaGljczo6RXF2RElCaXRtYXAoY29uc3QgQ0ZYX0RJQml0bWFwICogc3JjQml0bWFwLCBjb25zdCBDRlhfUmVjdEYgJiByZWN0KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgQ0ZYX0RJQml0bWFwICogZHN0ID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChkc3QsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgQ0ZYX1JlY3RGIHRlbXAocmVjdCk7DQotICAgIF9pbmZvLl9DVE0uVHJhbnNmb3JtUmVjdCh0ZW1wKTsNCi0gICAgQ0ZYX1JlY3RGIHI7DQotICAgIHIuU2V0KDAsIDAsIChGWF9GTE9BVClkc3QtPkdldFdpZHRoKCksIChGWF9GTE9BVClkc3QtPkdldFdpZHRoKCkpOw0KLSAgICByLkludGVyc2VjdCh0ZW1wKTsNCi0gICAgaWYgKHIuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkOw0KLSAgICB9DQotICAgIEZYX0FSR0IqIHBTcmNCdWYgPSAoRlhfQVJHQiopKHNyY0JpdG1hcC0+R2V0QnVmZmVyKCkgKyBpbnQzMl90KHIudG9wKSAqIHNyY0JpdG1hcC0+R2V0UGl0Y2goKSk7DQotICAgIEZYX0FSR0IqIHBEc3RCdWYgPSAoRlhfQVJHQiopKGRzdC0+R2V0QnVmZmVyKCkgKyBpbnQzMl90KHIudG9wKSAqIGRzdC0+R2V0UGl0Y2goKSk7DQotICAgIGludDMyX3QgYm90dG9tID0gKGludDMyX3Qpci5ib3R0b20oKTsNCi0gICAgaW50MzJfdCByaWdodCA9IChpbnQzMl90KXIucmlnaHQoKTsNCi0gICAgZm9yIChpbnQzMl90IGkgPSAoaW50MzJfdClyLnRvcDsgaSA8IGJvdHRvbTsgaSArKykgew0KLSAgICAgICAgRlhfQVJHQiogcFNyY0xpbmUgPSBwU3JjQnVmICsgKGludDMyX3Qpci5sZWZ0Ow0KLSAgICAgICAgRlhfQVJHQiogcERzdExpbmUgPSBwRHN0QnVmICsgKGludDMyX3Qpci5sZWZ0Ow0KLSAgICAgICAgZm9yIChpbnQzMl90IGogPSAoaW50MzJfdClyLmxlZnQ7IGogPCByaWdodDsgaiArKykgew0KLSAgICAgICAgICAgIEZYX0FSR0IgYyA9ICpwRHN0TGluZTsNCi0gICAgICAgICAgICAqcERzdExpbmUgKysgPSBBcmdiRW5jb2RlKEZYQVJHQl9BKGMpLCB+KChjICYgMHhGRkZGRkYpIF4gKCpwU3JjTGluZSAmIDB4RkZGRkZGKSkpOw0KLSAgICAgICAgICAgIHBTcmNMaW5lICsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcFNyY0J1ZiA9IChGWF9BUkdCKikoKHVpbnQ4X3QqKXBTcmNCdWYgKyBzcmNCaXRtYXAtPkdldFBpdGNoKCkpOw0KLSAgICAgICAgcERzdEJ1ZiA9IChGWF9BUkdCKikoKHVpbnQ4X3QqKXBEc3RCdWYgKyBkc3QtPkdldFBpdGNoKCkpOw0KLSAgICB9DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpSZW5kZXJEZXZpY2VTZXRMaW5lRGFzaChGWF9EYXNoU3R5bGUgZGFzaFN0eWxlKQ0KLXsNCi0gICAgc3dpdGNoIChkYXNoU3R5bGUpIHsNCi0gICAgICAgIGNhc2UgRlhfREFTSFNUWUxFX1NvbGlkOiB7DQotICAgICAgICAgICAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLlNldERhc2hDb3VudCgwKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGWF9EQVNIU1RZTEVfRGFzaDogew0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBkYXNoQXJyYXlbXSA9IHszLCAxfTsNCi0gICAgICAgICAgICAgICAgU2V0TGluZURhc2goMCwgZGFzaEFycmF5LCAyKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGWF9EQVNIU1RZTEVfRG90OiB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezEsIDF9Ow0KLSAgICAgICAgICAgICAgICBTZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDIpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZYX0RBU0hTVFlMRV9EYXNoRG90OiB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezMsIDEsIDEsIDF9Ow0KLSAgICAgICAgICAgICAgICBTZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDQpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZYX0RBU0hTVFlMRV9EYXNoRG90RG90OiB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezQsIDEsIDIsIDEsIDIsIDF9Ow0KLSAgICAgICAgICAgICAgICBTZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDYpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlJlbmRlckRldmljZVN0cm9rZVBhdGgoQ0ZYX1BhdGggKiBwYXRoLCBDRlhfTWF0cml4ICogbWF0cml4KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9pbmZvLl9zdHJva2VDb2xvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICBDRlhfTWF0cml4IG07DQotICAgIG0uU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLCBfaW5mby5fQ1RNLmYpOw0KLSAgICBpZiAobWF0cml4KSB7DQotICAgICAgICBtLkNvbmNhdCgqbWF0cml4KTsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKF9pbmZvLl9zdHJva2VDb2xvci0+X3R5cGUpIHsNCi0gICAgICAgIGNhc2UgRlhfQ09MT1JfU29saWQ6IHsNCi0gICAgICAgICAgICAgICAgRlhfQk9PTCByZXN1bHQgPSBfcmVuZGVyRGV2aWNlLT5EcmF3UGF0aChwYXRoLT5HZXRQYXRoRGF0YSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopICZtLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfaW5mby5fZ3JhcGhTdGF0ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2luZm8uX3N0cm9rZUNvbG9yLT5fYXJnYiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0luZGVmaW5pdGUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZYX0NPTE9SX1BhdHRlcm46IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cm9rZVBhdGhXaXRoUGF0dGVybihwYXRoLCAmbSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGWF9DT0xPUl9TaGFkaW5nOiB7DQotICAgICAgICAgICAgICAgIHJldHVybiBTdHJva2VQYXRoV2l0aFNoYWRpbmcocGF0aCwgJm0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICAgICAgICAgIH0NCi0gICAgfQ0KLX0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpSZW5kZXJEZXZpY2VGaWxsUGF0aChDRlhfUGF0aCAqICAgcGF0aCwNCi0gICAgICAgIEZYX0ZpbGxNb2RlICBmaWxsTW9kZSwNCi0gICAgICAgIENGWF9NYXRyaXggKiBtYXRyaXgpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2luZm8uX2ZpbGxDb2xvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICBDRlhfTWF0cml4IG07DQotICAgIG0uU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLCBfaW5mby5fQ1RNLmYpOw0KLSAgICBpZiAobWF0cml4KSB7DQotICAgICAgICBtLkNvbmNhdCgqbWF0cml4KTsNCi0gICAgfQ0KLSAgICBzd2l0Y2ggKF9pbmZvLl9maWxsQ29sb3ItPl90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX0NPTE9SX1NvbGlkOiB7DQotICAgICAgICAgICAgICAgIEZYX0JPT0wgcmVzdWx0ID0gX3JlbmRlckRldmljZS0+RHJhd1BhdGgocGF0aC0+R2V0UGF0aERhdGEoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2luZm8uX2dyYXBoU3RhdGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2luZm8uX2ZpbGxDb2xvci0+X2FyZ2IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxNb2RlKTsNCi0gICAgICAgICAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0luZGVmaW5pdGUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICBjYXNlIEZYX0NPTE9SX1BhdHRlcm46IHsNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpbGxQYXRoV2l0aFBhdHRlcm4ocGF0aCwgZmlsbE1vZGUsICZtKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRlhfQ09MT1JfU2hhZGluZzogew0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmlsbFBhdGhXaXRoU2hhZGluZyhwYXRoLCBmaWxsTW9kZSwgJm0pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgZGVmYXVsdDogew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgICAgICAgICAgfQ0KLSAgICB9DQotfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlJlbmRlckRldmljZURyYXdJbWFnZShDRlhfRElCU291cmNlICoJICBzb3VyY2UsDQotICAgICAgICBjb25zdCBDRlhfUG9pbnRGICYgcG9pbnQsDQotICAgICAgICBDRlhfTWF0cml4ICoJCSAgbWF0cml4KQ0KLXsNCi0gICAgQ0ZYX01hdHJpeCBtMTsNCi0gICAgbTEuU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLCBfaW5mby5fQ1RNLmYpOw0KLSAgICBpZiAobWF0cml4KSB7DQotICAgICAgICBtMS5Db25jYXQoKm1hdHJpeCk7DQotICAgIH0NCi0gICAgQ0ZYX01hdHJpeCBtMjsNCi0gICAgbTIuU2V0KChGWF9GTE9BVCkgc291cmNlLT5HZXRXaWR0aCgpLA0KLSAgICAgICAgICAgMC4wLA0KLSAgICAgICAgICAgMC4wLA0KLSAgICAgICAgICAgKEZYX0ZMT0FUKSBzb3VyY2UtPkdldEhlaWdodCgpLA0KLSAgICAgICAgICAgcG9pbnQueCwNCi0gICAgICAgICAgIHBvaW50LnkpOw0KLSAgICBtMi5Db25jYXQobTEpOw0KLSAgICBpbnQzMl90IGxlZnQsIHRvcDsNCi0gICAgQ0ZYX0RJQml0bWFwICogYm1wMSA9IHNvdXJjZS0+RmxpcEltYWdlKEZBTFNFLCBUUlVFKTsNCi0gICAgQ0ZYX0RJQml0bWFwICogYm1wMiA9IGJtcDEtPlRyYW5zZm9ybVRvKChDRlhfQWZmaW5lTWF0cml4ICopICZtMiwgbGVmdCwgdG9wKTsNCi0gICAgQ0ZYX1JlY3RGIHI7DQotICAgIEdldENsaXBSZWN0KHIpOw0KLSAgICBGWF9FUlIgcmVzdWx0ID0gRlhfRVJSX0luZGVmaW5pdGU7DQotICAgIHsNCi0gICAgICAgIENGWF9ESUJpdG1hcCAqIGJpdG1hcCA9IF9yZW5kZXJEZXZpY2UtPkdldEJpdG1hcCgpOw0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlRyYW5zZmVyKENGWF9HcmFwaGljcyogZ3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3JjTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzcmNUb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGdyYXBoaWNzLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgQ0ZYX01hdHJpeCBtOw0KKyAgbS5TZXQoX2luZm8uX0NUTS5hLCBfaW5mby5fQ1RNLmIsIF9pbmZvLl9DVE0uYywgX2luZm8uX0NUTS5kLCBfaW5mby5fQ1RNLmUsDQorICAgICAgICBfaW5mby5fQ1RNLmYpOw0KKyAgaWYgKG1hdHJpeCkgew0KKyAgICBtLkNvbmNhdCgqbWF0cml4KTsNCisgIH0NCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgew0KKyAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGdyYXBoaWNzLT5fcmVuZGVyRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICAgICAgICBDRlhfRElCaXRtYXAqIGJpdG1hcCA9IGdyYXBoaWNzLT5fcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsNCisgICAgICAgIEZYX0JPT0wgcmVzdWx0ID0gRlhfRVJSX0luZGVmaW5pdGU7DQogICAgICAgICBDRlhfRElCaXRtYXAgYm1wOw0KLSAgICAgICAgYm1wLkNyZWF0ZShiaXRtYXAtPkdldFdpZHRoKCksIGJpdG1hcC0+R2V0SGVpZ2h0KCksIEZYRElCX0FyZ2IpOw0KLSAgICAgICAgX3JlbmRlckRldmljZS0+R2V0RElCaXRzKCZibXAsIDAsIDApOw0KLSAgICAgICAgYm1wLlRyYW5zZmVyQml0bWFwKEZYU1lTX3JvdW5kKHIubGVmdCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoci50b3ApLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHIuV2lkdGgoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoci5IZWlnaHQoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyLmxlZnQgLSBsZWZ0KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyLnRvcCAtIHRvcCkpOw0KLSAgICAgICAgX3JlbmRlckRldmljZS0+U2V0RElCaXRzKCZibXAsIDAsIDApOw0KLSAgICAgICAgcmVzdWx0ID0gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgIHJlc3VsdCA9IGJtcC5DcmVhdGUoKGludDMyX3QpZHN0UmVjdC53aWR0aCwgKGludDMyX3QpZHN0UmVjdC5oZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+R2V0Rm9ybWF0KCkpOw0KKyAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0ludGVybWVkaWF0ZV9WYWx1ZV9JbnZhbGlkKTsNCisgICAgICAgIHJlc3VsdCA9IGdyYXBoaWNzLT5fcmVuZGVyRGV2aWNlLT5HZXRESUJpdHMoJmJtcCwgKGludDMyX3Qpc3JjTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3Qpc3JjVG9wKTsNCisgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZCk7DQorICAgICAgICByZXN1bHQgPSBfcmVuZGVyRGV2aWNlLT5TZXRESUJpdHMoJmJtcCwgKGludDMyX3QpZHN0UmVjdC5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWRzdFJlY3QudG9wKTsNCisgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZCk7DQorICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICB9DQogICAgIH0NCi0gICAgaWYgKGJtcDIpIHsNCi0gICAgICAgIGRlbGV0ZSBibXAyOw0KLSAgICAgICAgYm1wMiA9IE5VTEw7DQotICAgIH0NCi0gICAgaWYgKGJtcDEpIHsNCi0gICAgICAgIGRlbGV0ZSBibXAxOw0KLSAgICAgICAgYm1wMSA9IE5VTEw7DQotICAgIH0NCi0gICAgcmV0dXJuIHJlc3VsdDsNCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6UmVuZGVyRGV2aWNlU3RyZXRjaEltYWdlKENGWF9ESUJTb3VyY2UgKglzb3VyY2UsDQotICAgICAgICBjb25zdCBDRlhfUmVjdEYgJglyZWN0LA0KLSAgICAgICAgQ0ZYX01hdHJpeCAqCQltYXRyaXgpDQotew0KLSAgICBDRlhfTWF0cml4IG0xOw0KLSAgICBtMS5TZXQoX2luZm8uX0NUTS5hLCBfaW5mby5fQ1RNLmIsIF9pbmZvLl9DVE0uYywgX2luZm8uX0NUTS5kLCBfaW5mby5fQ1RNLmUsIF9pbmZvLl9DVE0uZik7DQotICAgIGlmIChtYXRyaXgpIHsNCi0gICAgICAgIG0xLkNvbmNhdCgqbWF0cml4KTsNCi0gICAgfQ0KLSAgICBDRlhfRElCaXRtYXAgKiBibXAxID0gc291cmNlLT5TdHJldGNoVG8oKGludDMyX3QpIHJlY3QuV2lkdGgoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSByZWN0LkhlaWdodCgpKTsNCi0gICAgQ0ZYX01hdHJpeCBtMjsNCi0gICAgbTIuU2V0KHJlY3QuV2lkdGgoKSwgMC4wLCAwLjAsIHJlY3QuSGVpZ2h0KCksIHJlY3QubGVmdCwgcmVjdC50b3ApOw0KLSAgICBtMi5Db25jYXQobTEpOw0KLSAgICBpbnQzMl90IGxlZnQsIHRvcDsNCi0gICAgQ0ZYX0RJQml0bWFwICogYm1wMiA9IGJtcDEtPkZsaXBJbWFnZShGQUxTRSwgVFJVRSk7DQotICAgIENGWF9ESUJpdG1hcCAqIGJtcDMgPSBibXAyLT5UcmFuc2Zvcm1UbygoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmbTIsIGxlZnQsIHRvcCk7DQotICAgIENGWF9SZWN0RiByOw0KLSAgICBHZXRDbGlwUmVjdChyKTsNCi0gICAgRlhfRVJSIHJlc3VsdCA9IEZYX0VSUl9JbmRlZmluaXRlOw0KLSAgICB7DQotICAgICAgICBDRlhfRElCaXRtYXAgKiBiaXRtYXAgPSBfcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsNCi0gICAgICAgIGJpdG1hcC0+Q29tcG9zaXRlQml0bWFwKEZYU1lTX3JvdW5kKHIubGVmdCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyLnRvcCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyLldpZHRoKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoci5IZWlnaHQoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXAzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoci5sZWZ0IC0gbGVmdCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyLnRvcCAtIHRvcCkpOw0KLSAgICAgICAgcmVzdWx0ID0gRlhfRVJSX1N1Y2NlZWRlZDsNCi0gICAgfQ0KLSAgICBpZiAoYm1wMykgew0KLSAgICAgICAgZGVsZXRlIGJtcDM7DQotICAgICAgICBibXAzID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAoYm1wMikgew0KLSAgICAgICAgZGVsZXRlIGJtcDI7DQotICAgICAgICBibXAyID0gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAoYm1wMSkgew0KLSAgICAgICAgZGVsZXRlIGJtcDE7DQotICAgICAgICBibXAxID0gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gcmVzdWx0Ow0KK0NGWF9SZW5kZXJEZXZpY2UqIENGWF9HcmFwaGljczo6R2V0UmVuZGVyRGV2aWNlKCkgew0KKyAgcmV0dXJuIF9yZW5kZXJEZXZpY2U7DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OlJlbmRlckRldmljZVNob3dUZXh0KGNvbnN0IENGWF9Qb2ludEYgJgkgcG9pbnQsDQotICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyAmIHRleHQsDQotICAgICAgICBDRlhfTWF0cml4ICoJCQkgbWF0cml4KQ0KLXsNCi0gICAgaW50MzJfdCBsZW5ndGggPSB0ZXh0LkdldExlbmd0aCgpOw0KLSAgICBGWF9EV09SRCAqIGNoYXJDb2RlcyA9IEZYX0FsbG9jKEZYX0RXT1JELCBsZW5ndGgpOw0KLSAgICBGWFRFWFRfQ0hBUlBPUyAqIGNoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICogc2l6ZW9mIChGWFRFWFRfQ0hBUlBPUykpOw0KLSAgICBDRlhfUmVjdEYgcmVjdDsNCi0gICAgcmVjdC5TZXQocG9pbnQueCwgcG9pbnQueSwgMCwgMCk7DQotICAgIENhbGNUZXh0SW5mbyh0ZXh0LCBjaGFyQ29kZXMsIGNoYXJQb3MsIHJlY3QpOw0KLSAgICBDRlhfTWF0cml4IG07DQotICAgIG0uU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLCBfaW5mby5fQ1RNLmYpOw0KLSAgICBtLlRyYW5zbGF0ZSgwLCBfaW5mby5fZm9udFNpemUgKiBfaW5mby5fZm9udEhTY2FsZSk7DQotICAgIGlmIChtYXRyaXgpIHsNCi0gICAgICAgIG0uQ29uY2F0KCptYXRyaXgpOw0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkludmVyc2VSZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIENGWF9ESUJpdG1hcCogYml0bWFwID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoYml0bWFwLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBDRlhfUmVjdEYgdGVtcChyZWN0KTsNCisgIF9pbmZvLl9DVE0uVHJhbnNmb3JtUmVjdCh0ZW1wKTsNCisgIENGWF9SZWN0RiByOw0KKyAgci5TZXQoMCwgMCwgKEZYX0ZMT0FUKWJpdG1hcC0+R2V0V2lkdGgoKSwgKEZYX0ZMT0FUKWJpdG1hcC0+R2V0V2lkdGgoKSk7DQorICByLkludGVyc2VjdCh0ZW1wKTsNCisgIGlmIChyLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkOw0KKyAgfQ0KKyAgRlhfQVJHQiogcEJ1ZiA9DQorICAgICAgKEZYX0FSR0IqKShiaXRtYXAtPkdldEJ1ZmZlcigpICsgaW50MzJfdChyLnRvcCkgKiBiaXRtYXAtPkdldFBpdGNoKCkpOw0KKyAgaW50MzJfdCBib3R0b20gPSAoaW50MzJfdClyLmJvdHRvbSgpOw0KKyAgaW50MzJfdCByaWdodCA9IChpbnQzMl90KXIucmlnaHQoKTsNCisgIGZvciAoaW50MzJfdCBpID0gKGludDMyX3Qpci50b3A7IGkgPCBib3R0b207IGkrKykgew0KKyAgICBGWF9BUkdCKiBwTGluZSA9IHBCdWYgKyAoaW50MzJfdClyLmxlZnQ7DQorICAgIGZvciAoaW50MzJfdCBqID0gKGludDMyX3Qpci5sZWZ0OyBqIDwgcmlnaHQ7IGorKykgew0KKyAgICAgIEZYX0FSR0IgYyA9ICpwTGluZTsNCisgICAgICAqcExpbmUrKyA9IChjICYgMHhGRjAwMDAwMCkgfCAoMHhGRkZGRkYgLSAoYyAmIDB4MDBGRkZGRkYpKTsNCiAgICAgfQ0KLSAgICBGWF9CT09MIHJlc3VsdCA9IF9yZW5kZXJEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGxlbmd0aCwNCi0gICAgICAgICAgICAgICAgICAgICBjaGFyUG9zLA0KLSAgICAgICAgICAgICAgICAgICAgIF9pbmZvLl9mb250LA0KLSAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgIC1faW5mby5fZm9udFNpemUgKiBfaW5mby5fZm9udEhTY2FsZSwNCi0gICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCAqKSAmbSwNCi0gICAgICAgICAgICAgICAgICAgICBfaW5mby5fZmlsbENvbG9yLT5fYXJnYiwNCi0gICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0luZGVmaW5pdGUpOw0KLSAgICBGWF9GcmVlKGNoYXJQb3MpOw0KLSAgICBGWF9GcmVlKGNoYXJDb2Rlcyk7DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICBwQnVmID0gKEZYX0FSR0IqKSgodWludDhfdCopcEJ1ZiArIGJpdG1hcC0+R2V0UGl0Y2goKSk7DQorICB9DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRVJSIENGWF9HcmFwaGljczo6U3Ryb2tlUGF0aFdpdGhQYXR0ZXJuKENGWF9QYXRoICogcGF0aCwgQ0ZYX01hdHJpeCAqIG1hdHJpeCkNCi17DQotICAgIHJldHVybiBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQ7DQorRlhfRVJSIENGWF9HcmFwaGljczo6WG9yRElCaXRtYXAoY29uc3QgQ0ZYX0RJQml0bWFwKiBzcmNCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgQ0ZYX0RJQml0bWFwKiBkc3QgPSBfcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChkc3QsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIENGWF9SZWN0RiB0ZW1wKHJlY3QpOw0KKyAgX2luZm8uX0NUTS5UcmFuc2Zvcm1SZWN0KHRlbXApOw0KKyAgQ0ZYX1JlY3RGIHI7DQorICByLlNldCgwLCAwLCAoRlhfRkxPQVQpZHN0LT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpZHN0LT5HZXRXaWR0aCgpKTsNCisgIHIuSW50ZXJzZWN0KHRlbXApOw0KKyAgaWYgKHIuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQorICB9DQorICBGWF9BUkdCKiBwU3JjQnVmID0gKEZYX0FSR0IqKShzcmNCaXRtYXAtPkdldEJ1ZmZlcigpICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qoci50b3ApICogc3JjQml0bWFwLT5HZXRQaXRjaCgpKTsNCisgIEZYX0FSR0IqIHBEc3RCdWYgPQ0KKyAgICAgIChGWF9BUkdCKikoZHN0LT5HZXRCdWZmZXIoKSArIGludDMyX3Qoci50b3ApICogZHN0LT5HZXRQaXRjaCgpKTsNCisgIGludDMyX3QgYm90dG9tID0gKGludDMyX3Qpci5ib3R0b20oKTsNCisgIGludDMyX3QgcmlnaHQgPSAoaW50MzJfdClyLnJpZ2h0KCk7DQorICBmb3IgKGludDMyX3QgaSA9IChpbnQzMl90KXIudG9wOyBpIDwgYm90dG9tOyBpKyspIHsNCisgICAgRlhfQVJHQiogcFNyY0xpbmUgPSBwU3JjQnVmICsgKGludDMyX3Qpci5sZWZ0Ow0KKyAgICBGWF9BUkdCKiBwRHN0TGluZSA9IHBEc3RCdWYgKyAoaW50MzJfdClyLmxlZnQ7DQorICAgIGZvciAoaW50MzJfdCBqID0gKGludDMyX3Qpci5sZWZ0OyBqIDwgcmlnaHQ7IGorKykgew0KKyAgICAgIEZYX0FSR0IgYyA9ICpwRHN0TGluZTsNCisgICAgICAqcERzdExpbmUrKyA9DQorICAgICAgICAgIEFyZ2JFbmNvZGUoRlhBUkdCX0EoYyksIChjICYgMHhGRkZGRkYpIF4gKCpwU3JjTGluZSAmIDB4RkZGRkZGKSk7DQorICAgICAgcFNyY0xpbmUrKzsNCisgICAgfQ0KKyAgICBwU3JjQnVmID0gKEZYX0FSR0IqKSgodWludDhfdCopcFNyY0J1ZiArIHNyY0JpdG1hcC0+R2V0UGl0Y2goKSk7DQorICAgIHBEc3RCdWYgPSAoRlhfQVJHQiopKCh1aW50OF90KilwRHN0QnVmICsgZHN0LT5HZXRQaXRjaCgpKTsNCisgIH0NCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTdHJva2VQYXRoV2l0aFNoYWRpbmcoQ0ZYX1BhdGggKiBwYXRoLCBDRlhfTWF0cml4ICogbWF0cml4KQ0KLXsNCi0gICAgcmV0dXJuIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZDsNCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpFcXZESUJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAqIHNyY0JpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBDRlhfRElCaXRtYXAqIGRzdCA9IF9yZW5kZXJEZXZpY2UtPkdldEJpdG1hcCgpOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGRzdCwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgQ0ZYX1JlY3RGIHRlbXAocmVjdCk7DQorICBfaW5mby5fQ1RNLlRyYW5zZm9ybVJlY3QodGVtcCk7DQorICBDRlhfUmVjdEYgcjsNCisgIHIuU2V0KDAsIDAsIChGWF9GTE9BVClkc3QtPkdldFdpZHRoKCksIChGWF9GTE9BVClkc3QtPkdldFdpZHRoKCkpOw0KKyAgci5JbnRlcnNlY3QodGVtcCk7DQorICBpZiAoci5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCisgIH0NCisgIEZYX0FSR0IqIHBTcmNCdWYgPSAoRlhfQVJHQiopKHNyY0JpdG1hcC0+R2V0QnVmZmVyKCkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdChyLnRvcCkgKiBzcmNCaXRtYXAtPkdldFBpdGNoKCkpOw0KKyAgRlhfQVJHQiogcERzdEJ1ZiA9DQorICAgICAgKEZYX0FSR0IqKShkc3QtPkdldEJ1ZmZlcigpICsgaW50MzJfdChyLnRvcCkgKiBkc3QtPkdldFBpdGNoKCkpOw0KKyAgaW50MzJfdCBib3R0b20gPSAoaW50MzJfdClyLmJvdHRvbSgpOw0KKyAgaW50MzJfdCByaWdodCA9IChpbnQzMl90KXIucmlnaHQoKTsNCisgIGZvciAoaW50MzJfdCBpID0gKGludDMyX3Qpci50b3A7IGkgPCBib3R0b207IGkrKykgew0KKyAgICBGWF9BUkdCKiBwU3JjTGluZSA9IHBTcmNCdWYgKyAoaW50MzJfdClyLmxlZnQ7DQorICAgIEZYX0FSR0IqIHBEc3RMaW5lID0gcERzdEJ1ZiArIChpbnQzMl90KXIubGVmdDsNCisgICAgZm9yIChpbnQzMl90IGogPSAoaW50MzJfdClyLmxlZnQ7IGogPCByaWdodDsgaisrKSB7DQorICAgICAgRlhfQVJHQiBjID0gKnBEc3RMaW5lOw0KKyAgICAgICpwRHN0TGluZSsrID0NCisgICAgICAgICAgQXJnYkVuY29kZShGWEFSR0JfQShjKSwgfigoYyAmIDB4RkZGRkZGKSBeICgqcFNyY0xpbmUgJiAweEZGRkZGRikpKTsNCisgICAgICBwU3JjTGluZSsrOw0KKyAgICB9DQorICAgIHBTcmNCdWYgPSAoRlhfQVJHQiopKCh1aW50OF90KilwU3JjQnVmICsgc3JjQml0bWFwLT5HZXRQaXRjaCgpKTsNCisgICAgcERzdEJ1ZiA9IChGWF9BUkdCKikoKHVpbnQ4X3QqKXBEc3RCdWYgKyBkc3QtPkdldFBpdGNoKCkpOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0VSUiBDRlhfR3JhcGhpY3M6OkZpbGxQYXRoV2l0aFBhdHRlcm4oQ0ZYX1BhdGggKiAgIHBhdGgsDQotICAgICAgICBGWF9GaWxsTW9kZSAgZmlsbE1vZGUsDQotICAgICAgICBDRlhfTWF0cml4ICogbWF0cml4KQ0KLXsNCi0gICAgQ0ZYX1BhdHRlcm4gKiBwYXR0ZXJuID0gX2luZm8uX2ZpbGxDb2xvci0+X3BhdHRlcm47DQotICAgIENGWF9ESUJpdG1hcCAqIGJpdG1hcCA9IF9yZW5kZXJEZXZpY2UtPkdldEJpdG1hcCgpOw0KLSAgICBpbnQzMl90IHdpZHRoCT0gYml0bWFwLT5HZXRXaWR0aCgpOw0KLSAgICBpbnQzMl90IGhlaWdodAk9IGJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorRlhfRVJSIENGWF9HcmFwaGljczo6UmVuZGVyRGV2aWNlU2V0TGluZURhc2goRlhfRGFzaFN0eWxlIGRhc2hTdHlsZSkgew0KKyAgc3dpdGNoIChkYXNoU3R5bGUpIHsNCisgICAgY2FzZSBGWF9EQVNIU1RZTEVfU29saWQ6IHsNCisgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5TZXREYXNoQ291bnQoMCk7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgY2FzZSBGWF9EQVNIU1RZTEVfRGFzaDogew0KKyAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezMsIDF9Ow0KKyAgICAgIFNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgMik7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgY2FzZSBGWF9EQVNIU1RZTEVfRG90OiB7DQorICAgICAgRlhfRkxPQVQgZGFzaEFycmF5W10gPSB7MSwgMX07DQorICAgICAgU2V0TGluZURhc2goMCwgZGFzaEFycmF5LCAyKTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBjYXNlIEZYX0RBU0hTVFlMRV9EYXNoRG90OiB7DQorICAgICAgRlhfRkxPQVQgZGFzaEFycmF5W10gPSB7MywgMSwgMSwgMX07DQorICAgICAgU2V0TGluZURhc2goMCwgZGFzaEFycmF5LCA0KTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBjYXNlIEZYX0RBU0hTVFlMRV9EYXNoRG90RG90OiB7DQorICAgICAgRlhfRkxPQVQgZGFzaEFycmF5W10gPSB7NCwgMSwgMiwgMSwgMiwgMX07DQorICAgICAgU2V0TGluZURhc2goMCwgZGFzaEFycmF5LCA2KTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6UmVuZGVyRGV2aWNlU3Ryb2tlUGF0aChDRlhfUGF0aCogcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9pbmZvLl9zdHJva2VDb2xvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgQ0ZYX01hdHJpeCBtOw0KKyAgbS5TZXQoX2luZm8uX0NUTS5hLCBfaW5mby5fQ1RNLmIsIF9pbmZvLl9DVE0uYywgX2luZm8uX0NUTS5kLCBfaW5mby5fQ1RNLmUsDQorICAgICAgICBfaW5mby5fQ1RNLmYpOw0KKyAgaWYgKG1hdHJpeCkgew0KKyAgICBtLkNvbmNhdCgqbWF0cml4KTsNCisgIH0NCisgIHN3aXRjaCAoX2luZm8uX3N0cm9rZUNvbG9yLT5fdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTE9SX1NvbGlkOiB7DQorICAgICAgRlhfQk9PTCByZXN1bHQgPSBfcmVuZGVyRGV2aWNlLT5EcmF3UGF0aCgNCisgICAgICAgICAgcGF0aC0+R2V0UGF0aERhdGEoKSwgKENGWF9BZmZpbmVNYXRyaXgqKSZtLCAmX2luZm8uX2dyYXBoU3RhdGUsIDB4MCwNCisgICAgICAgICAgX2luZm8uX3N0cm9rZUNvbG9yLT5fYXJnYiwgMCk7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGNhc2UgRlhfQ09MT1JfUGF0dGVybjogew0KKyAgICAgIHJldHVybiBTdHJva2VQYXRoV2l0aFBhdHRlcm4ocGF0aCwgJm0pOw0KKyAgICB9DQorICAgIGNhc2UgRlhfQ09MT1JfU2hhZGluZzogew0KKyAgICAgIHJldHVybiBTdHJva2VQYXRoV2l0aFNoYWRpbmcocGF0aCwgJm0pOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlJlbmRlckRldmljZUZpbGxQYXRoKENGWF9QYXRoKiBwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9pbmZvLl9maWxsQ29sb3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIENGWF9NYXRyaXggbTsNCisgIG0uU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLA0KKyAgICAgICAgX2luZm8uX0NUTS5mKTsNCisgIGlmIChtYXRyaXgpIHsNCisgICAgbS5Db25jYXQoKm1hdHJpeCk7DQorICB9DQorICBzd2l0Y2ggKF9pbmZvLl9maWxsQ29sb3ItPl90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09MT1JfU29saWQ6IHsNCisgICAgICBGWF9CT09MIHJlc3VsdCA9IF9yZW5kZXJEZXZpY2UtPkRyYXdQYXRoKA0KKyAgICAgICAgICBwYXRoLT5HZXRQYXRoRGF0YSgpLCAoQ0ZYX0FmZmluZU1hdHJpeCopJm0sICZfaW5mby5fZ3JhcGhTdGF0ZSwNCisgICAgICAgICAgX2luZm8uX2ZpbGxDb2xvci0+X2FyZ2IsIDB4MCwgZmlsbE1vZGUpOw0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9JbmRlZmluaXRlKTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBjYXNlIEZYX0NPTE9SX1BhdHRlcm46IHsNCisgICAgICB7IHJldHVybiBGaWxsUGF0aFdpdGhQYXR0ZXJuKHBhdGgsIGZpbGxNb2RlLCAmbSk7IH0NCisgICAgfQ0KKyAgICBjYXNlIEZYX0NPTE9SX1NoYWRpbmc6IHsNCisgICAgICB7IHJldHVybiBGaWxsUGF0aFdpdGhTaGFkaW5nKHBhdGgsIGZpbGxNb2RlLCAmbSk7IH0NCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpSZW5kZXJEZXZpY2VEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBDRlhfTWF0cml4IG0xOw0KKyAgbTEuU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLA0KKyAgICAgICAgIF9pbmZvLl9DVE0uZik7DQorICBpZiAobWF0cml4KSB7DQorICAgIG0xLkNvbmNhdCgqbWF0cml4KTsNCisgIH0NCisgIENGWF9NYXRyaXggbTI7DQorICBtMi5TZXQoKEZYX0ZMT0FUKXNvdXJjZS0+R2V0V2lkdGgoKSwgMC4wLCAwLjAsIChGWF9GTE9BVClzb3VyY2UtPkdldEhlaWdodCgpLA0KKyAgICAgICAgIHBvaW50LngsIHBvaW50LnkpOw0KKyAgbTIuQ29uY2F0KG0xKTsNCisgIGludDMyX3QgbGVmdCwgdG9wOw0KKyAgQ0ZYX0RJQml0bWFwKiBibXAxID0gc291cmNlLT5GbGlwSW1hZ2UoRkFMU0UsIFRSVUUpOw0KKyAgQ0ZYX0RJQml0bWFwKiBibXAyID0gYm1wMS0+VHJhbnNmb3JtVG8oKENGWF9BZmZpbmVNYXRyaXgqKSZtMiwgbGVmdCwgdG9wKTsNCisgIENGWF9SZWN0RiByOw0KKyAgR2V0Q2xpcFJlY3Qocik7DQorICBGWF9FUlIgcmVzdWx0ID0gRlhfRVJSX0luZGVmaW5pdGU7DQorICB7DQorICAgIENGWF9ESUJpdG1hcCogYml0bWFwID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQogICAgIENGWF9ESUJpdG1hcCBibXA7DQotICAgIGJtcC5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfQXJnYik7DQorICAgIGJtcC5DcmVhdGUoYml0bWFwLT5HZXRXaWR0aCgpLCBiaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl9BcmdiKTsNCiAgICAgX3JlbmRlckRldmljZS0+R2V0RElCaXRzKCZibXAsIDAsIDApOw0KLSAgICBzd2l0Y2ggKHBhdHRlcm4tPl90eXBlKSB7DQotICAgICAgICBjYXNlIEZYX1BBVFRFUk5fQml0bWFwOiB7DQotICAgICAgICAgICAgICAgIGludDMyX3QgeFN0ZXAgPSBGWFNZU19yb3VuZChwYXR0ZXJuLT5feDFTdGVwKTsNCi0gICAgICAgICAgICAgICAgaW50MzJfdCB5U3RlcCA9IEZYU1lTX3JvdW5kKHBhdHRlcm4tPl95MVN0ZXApOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHhDb3VudAk9IHdpZHRoIC8geFN0ZXAgKyAxOw0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHlDb3VudAk9IGhlaWdodCAvIHlTdGVwICsgMTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IHlDb3VudDsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPD0geENvdW50OyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBibXAuVHJhbnNmZXJCaXRtYXAoaiAqIHhTdGVwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICogeVN0ZXAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhTdGVwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5U3RlcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+X2JpdG1hcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBGWF9QQVRURVJOX0hhdGNoOiB7DQotICAgICAgICAgICAgICAgIEZYX0hhdGNoU3R5bGUgaGF0Y2hTdHlsZSA9IF9pbmZvLl9maWxsQ29sb3ItPl9wYXR0ZXJuLT5faGF0Y2hTdHlsZTsNCi0gICAgICAgICAgICAgICAgaWYgKGhhdGNoU3R5bGUgPCBGWF9IQVRDSFNUWUxFX0hvcml6b250YWwgfHwgaGF0Y2hTdHlsZSA+IEZYX0hBVENIU1RZTEVfU29saWREaWFtb25kKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlhfRVJSX0ludGVybWVkaWF0ZV9WYWx1ZV9JbnZhbGlkOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvbnN0IEZYX0hBVENIREFUQSAmIGRhdGEgPSBoYXRjaEJpdG1hcERhdGFbaGF0Y2hTdHlsZV07DQotICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCBtYXNrOw0KLSAgICAgICAgICAgICAgICBtYXNrLkNyZWF0ZShkYXRhLndpZHRoLCBkYXRhLmhlaWdodCwgRlhESUJfMWJwcE1hc2spOw0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkobWFzay5HZXRCdWZmZXIoKSwgZGF0YS5tYXNrQml0cywgbWFzay5HZXRQaXRjaCgpICogZGF0YS5oZWlnaHQpOw0KLSAgICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3RmID0gcGF0aC0+R2V0UGF0aERhdGEoKS0+R2V0Qm91bmRpbmdCb3goKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVjdGYuVHJhbnNmb3JtKChjb25zdCBDRlhfQWZmaW5lTWF0cml4ICopIG1hdHJpeCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRlhfUkVDVCByZWN0KEZYU1lTX3JvdW5kKHJlY3RmLmxlZnQpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdGYudG9wKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHJlY3RmLnJpZ2h0KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHJlY3RmLmJvdHRvbSkpOw0KLSAgICAgICAgICAgICAgICBDRlhfRnhnZURldmljZSBkZXZpY2U7DQotICAgICAgICAgICAgICAgIGRldmljZS5BdHRhY2goJmJtcCk7DQotICAgICAgICAgICAgICAgIGRldmljZS5GaWxsUmVjdCgmcmVjdCwgX2luZm8uX2ZpbGxDb2xvci0+X3BhdHRlcm4tPl9iYWNrQXJnYik7DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gcmVjdC5ib3R0b207IGogPCByZWN0LnRvcDsgaiArPSBtYXNrLkdldEhlaWdodCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IHJlY3QubGVmdDsgaSA8IHJlY3QucmlnaHQ7IGkgKz0gbWFzay5HZXRXaWR0aCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLlNldEJpdE1hc2soJm1hc2ssIGksIGosIF9pbmZvLl9maWxsQ29sb3ItPl9wYXR0ZXJuLT5fZm9yZUFyZ2IpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCisgICAgYm1wLlRyYW5zZmVyQml0bWFwKEZYU1lTX3JvdW5kKHIubGVmdCksIEZYU1lTX3JvdW5kKHIudG9wKSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHIuV2lkdGgoKSksIEZYU1lTX3JvdW5kKHIuSGVpZ2h0KCkpLCBibXAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoci5sZWZ0IC0gbGVmdCksIEZYU1lTX3JvdW5kKHIudG9wIC0gdG9wKSk7DQorICAgIF9yZW5kZXJEZXZpY2UtPlNldERJQml0cygmYm1wLCAwLCAwKTsNCisgICAgcmVzdWx0ID0gRlhfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIGlmIChibXAyKSB7DQorICAgIGRlbGV0ZSBibXAyOw0KKyAgICBibXAyID0gTlVMTDsNCisgIH0NCisgIGlmIChibXAxKSB7DQorICAgIGRlbGV0ZSBibXAxOw0KKyAgICBibXAxID0gTlVMTDsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlJlbmRlckRldmljZVN0cmV0Y2hJbWFnZShDRlhfRElCU291cmNlKiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBDRlhfTWF0cml4IG0xOw0KKyAgbTEuU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLA0KKyAgICAgICAgIF9pbmZvLl9DVE0uZik7DQorICBpZiAobWF0cml4KSB7DQorICAgIG0xLkNvbmNhdCgqbWF0cml4KTsNCisgIH0NCisgIENGWF9ESUJpdG1hcCogYm1wMSA9DQorICAgICAgc291cmNlLT5TdHJldGNoVG8oKGludDMyX3QpcmVjdC5XaWR0aCgpLCAoaW50MzJfdClyZWN0LkhlaWdodCgpKTsNCisgIENGWF9NYXRyaXggbTI7DQorICBtMi5TZXQocmVjdC5XaWR0aCgpLCAwLjAsIDAuMCwgcmVjdC5IZWlnaHQoKSwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7DQorICBtMi5Db25jYXQobTEpOw0KKyAgaW50MzJfdCBsZWZ0LCB0b3A7DQorICBDRlhfRElCaXRtYXAqIGJtcDIgPSBibXAxLT5GbGlwSW1hZ2UoRkFMU0UsIFRSVUUpOw0KKyAgQ0ZYX0RJQml0bWFwKiBibXAzID0gYm1wMi0+VHJhbnNmb3JtVG8oKENGWF9BZmZpbmVNYXRyaXgqKSZtMiwgbGVmdCwgdG9wKTsNCisgIENGWF9SZWN0RiByOw0KKyAgR2V0Q2xpcFJlY3Qocik7DQorICBGWF9FUlIgcmVzdWx0ID0gRlhfRVJSX0luZGVmaW5pdGU7DQorICB7DQorICAgIENGWF9ESUJpdG1hcCogYml0bWFwID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICAgIGJpdG1hcC0+Q29tcG9zaXRlQml0bWFwKEZYU1lTX3JvdW5kKHIubGVmdCksIEZYU1lTX3JvdW5kKHIudG9wKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoci5XaWR0aCgpKSwgRlhTWVNfcm91bmQoci5IZWlnaHQoKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcDMsIEZYU1lTX3JvdW5kKHIubGVmdCAtIGxlZnQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyLnRvcCAtIHRvcCkpOw0KKyAgICByZXN1bHQgPSBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgaWYgKGJtcDMpIHsNCisgICAgZGVsZXRlIGJtcDM7DQorICAgIGJtcDMgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKGJtcDIpIHsNCisgICAgZGVsZXRlIGJtcDI7DQorICAgIGJtcDIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKGJtcDEpIHsNCisgICAgZGVsZXRlIGJtcDE7DQorICAgIGJtcDEgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6UmVuZGVyRGV2aWNlU2hvd1RleHQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBpbnQzMl90IGxlbmd0aCA9IHRleHQuR2V0TGVuZ3RoKCk7DQorICBGWF9EV09SRCogY2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIGxlbmd0aCk7DQorICBGWFRFWFRfQ0hBUlBPUyogY2hhclBvcyA9DQorICAgICAgRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGxlbmd0aCAqIHNpemVvZihGWFRFWFRfQ0hBUlBPUykpOw0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICByZWN0LlNldChwb2ludC54LCBwb2ludC55LCAwLCAwKTsNCisgIENhbGNUZXh0SW5mbyh0ZXh0LCBjaGFyQ29kZXMsIGNoYXJQb3MsIHJlY3QpOw0KKyAgQ0ZYX01hdHJpeCBtOw0KKyAgbS5TZXQoX2luZm8uX0NUTS5hLCBfaW5mby5fQ1RNLmIsIF9pbmZvLl9DVE0uYywgX2luZm8uX0NUTS5kLCBfaW5mby5fQ1RNLmUsDQorICAgICAgICBfaW5mby5fQ1RNLmYpOw0KKyAgbS5UcmFuc2xhdGUoMCwgX2luZm8uX2ZvbnRTaXplICogX2luZm8uX2ZvbnRIU2NhbGUpOw0KKyAgaWYgKG1hdHJpeCkgew0KKyAgICBtLkNvbmNhdCgqbWF0cml4KTsNCisgIH0NCisgIEZYX0JPT0wgcmVzdWx0ID0gX3JlbmRlckRldmljZS0+RHJhd05vcm1hbFRleHQoDQorICAgICAgbGVuZ3RoLCBjaGFyUG9zLCBfaW5mby5fZm9udCwgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgLV9pbmZvLl9mb250U2l6ZSAqIF9pbmZvLl9mb250SFNjYWxlLCAoQ0ZYX0FmZmluZU1hdHJpeCopJm0sDQorICAgICAgX2luZm8uX2ZpbGxDb2xvci0+X2FyZ2IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0luZGVmaW5pdGUpOw0KKyAgRlhfRnJlZShjaGFyUG9zKTsNCisgIEZYX0ZyZWUoY2hhckNvZGVzKTsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTdHJva2VQYXRoV2l0aFBhdHRlcm4oQ0ZYX1BhdGgqIHBhdGgsIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgcmV0dXJuIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U3Ryb2tlUGF0aFdpdGhTaGFkaW5nKENGWF9QYXRoKiBwYXRoLCBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIHJldHVybiBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkZpbGxQYXRoV2l0aFBhdHRlcm4oQ0ZYX1BhdGgqIHBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSBmaWxsTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgQ0ZYX1BhdHRlcm4qIHBhdHRlcm4gPSBfaW5mby5fZmlsbENvbG9yLT5fcGF0dGVybjsNCisgIENGWF9ESUJpdG1hcCogYml0bWFwID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICBpbnQzMl90IHdpZHRoID0gYml0bWFwLT5HZXRXaWR0aCgpOw0KKyAgaW50MzJfdCBoZWlnaHQgPSBiaXRtYXAtPkdldEhlaWdodCgpOw0KKyAgQ0ZYX0RJQml0bWFwIGJtcDsNCisgIGJtcC5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfQXJnYik7DQorICBfcmVuZGVyRGV2aWNlLT5HZXRESUJpdHMoJmJtcCwgMCwgMCk7DQorICBzd2l0Y2ggKHBhdHRlcm4tPl90eXBlKSB7DQorICAgIGNhc2UgRlhfUEFUVEVSTl9CaXRtYXA6IHsNCisgICAgICBpbnQzMl90IHhTdGVwID0gRlhTWVNfcm91bmQocGF0dGVybi0+X3gxU3RlcCk7DQorICAgICAgaW50MzJfdCB5U3RlcCA9IEZYU1lTX3JvdW5kKHBhdHRlcm4tPl95MVN0ZXApOw0KKyAgICAgIGludDMyX3QgeENvdW50ID0gd2lkdGggLyB4U3RlcCArIDE7DQorICAgICAgaW50MzJfdCB5Q291bnQgPSBoZWlnaHQgLyB5U3RlcCArIDE7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IHlDb3VudDsgaSsrKSB7DQorICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPD0geENvdW50OyBqKyspIHsNCisgICAgICAgICAgYm1wLlRyYW5zZmVyQml0bWFwKGogKiB4U3RlcCwgaSAqIHlTdGVwLCB4U3RlcCwgeVN0ZXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5fYml0bWFwLCAwLCAwKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgYnJlYWs7DQogICAgIH0NCisgICAgY2FzZSBGWF9QQVRURVJOX0hhdGNoOiB7DQorICAgICAgRlhfSGF0Y2hTdHlsZSBoYXRjaFN0eWxlID0gX2luZm8uX2ZpbGxDb2xvci0+X3BhdHRlcm4tPl9oYXRjaFN0eWxlOw0KKyAgICAgIGlmIChoYXRjaFN0eWxlIDwgRlhfSEFUQ0hTVFlMRV9Ib3Jpem9udGFsIHx8DQorICAgICAgICAgIGhhdGNoU3R5bGUgPiBGWF9IQVRDSFNUWUxFX1NvbGlkRGlhbW9uZCkgew0KKyAgICAgICAgcmV0dXJuIEZYX0VSUl9JbnRlcm1lZGlhdGVfVmFsdWVfSW52YWxpZDsNCisgICAgICB9DQorICAgICAgY29uc3QgRlhfSEFUQ0hEQVRBJiBkYXRhID0gaGF0Y2hCaXRtYXBEYXRhW2hhdGNoU3R5bGVdOw0KKyAgICAgIENGWF9ESUJpdG1hcCBtYXNrOw0KKyAgICAgIG1hc2suQ3JlYXRlKGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0LCBGWERJQl8xYnBwTWFzayk7DQorICAgICAgRlhTWVNfbWVtY3B5KG1hc2suR2V0QnVmZmVyKCksIGRhdGEubWFza0JpdHMsDQorICAgICAgICAgICAgICAgICAgIG1hc2suR2V0UGl0Y2goKSAqIGRhdGEuaGVpZ2h0KTsNCisgICAgICBDRlhfRmxvYXRSZWN0IHJlY3RmID0gcGF0aC0+R2V0UGF0aERhdGEoKS0+R2V0Qm91bmRpbmdCb3goKTsNCisgICAgICBpZiAobWF0cml4KSB7DQorICAgICAgICByZWN0Zi5UcmFuc2Zvcm0oKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqKW1hdHJpeCk7DQorICAgICAgfQ0KKyAgICAgIEZYX1JFQ1QgcmVjdChGWFNZU19yb3VuZChyZWN0Zi5sZWZ0KSwgRlhTWVNfcm91bmQocmVjdGYudG9wKSwNCisgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdGYucmlnaHQpLCBGWFNZU19yb3VuZChyZWN0Zi5ib3R0b20pKTsNCisgICAgICBDRlhfRnhnZURldmljZSBkZXZpY2U7DQorICAgICAgZGV2aWNlLkF0dGFjaCgmYm1wKTsNCisgICAgICBkZXZpY2UuRmlsbFJlY3QoJnJlY3QsIF9pbmZvLl9maWxsQ29sb3ItPl9wYXR0ZXJuLT5fYmFja0FyZ2IpOw0KKyAgICAgIGZvciAoaW50MzJfdCBqID0gcmVjdC5ib3R0b207IGogPCByZWN0LnRvcDsgaiArPSBtYXNrLkdldEhlaWdodCgpKSB7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IHJlY3QubGVmdDsgaSA8IHJlY3QucmlnaHQ7IGkgKz0gbWFzay5HZXRXaWR0aCgpKSB7DQorICAgICAgICAgIGRldmljZS5TZXRCaXRNYXNrKCZtYXNrLCBpLCBqLCBfaW5mby5fZmlsbENvbG9yLT5fcGF0dGVybi0+X2ZvcmVBcmdiKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIF9yZW5kZXJEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KKyAgX3JlbmRlckRldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwYXRoLT5HZXRQYXRoRGF0YSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX0FmZmluZU1hdHJpeCopbWF0cml4LCBmaWxsTW9kZSk7DQorICBTZXRESUJpdHNXaXRoTWF0cml4KCZibXAsICZwYXR0ZXJuLT5fbWF0cml4KTsNCisgIF9yZW5kZXJEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkZpbGxQYXRoV2l0aFNoYWRpbmcoQ0ZYX1BhdGgqIHBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSBmaWxsTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBfcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsNCisgIGludDMyX3Qgd2lkdGggPSBiaXRtYXAtPkdldFdpZHRoKCk7DQorICBpbnQzMl90IGhlaWdodCA9IGJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorICBGWF9GTE9BVCBzdGFydF94ID0gX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9iZWdpblBvaW50Lng7DQorICBGWF9GTE9BVCBzdGFydF95ID0gX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9iZWdpblBvaW50Lnk7DQorICBGWF9GTE9BVCBlbmRfeCA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fZW5kUG9pbnQueDsNCisgIEZYX0ZMT0FUIGVuZF95ID0gX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9lbmRQb2ludC55Ow0KKyAgQ0ZYX0RJQml0bWFwIGJtcDsNCisgIGJtcC5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfQXJnYik7DQorICBfcmVuZGVyRGV2aWNlLT5HZXRESUJpdHMoJmJtcCwgMCwgMCk7DQorICBpbnQzMl90IHBpdGNoID0gYm1wLkdldFBpdGNoKCk7DQorICBGWF9CT09MIHJlc3VsdCA9IEZBTFNFOw0KKyAgc3dpdGNoIChfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X3R5cGUpIHsNCisgICAgY2FzZSBGWF9TSEFESU5HX0F4aWFsOiB7DQorICAgICAgRlhfRkxPQVQgeF9zcGFuID0gZW5kX3ggLSBzdGFydF94Ow0KKyAgICAgIEZYX0ZMT0FUIHlfc3BhbiA9IGVuZF95IC0gc3RhcnRfeTsNCisgICAgICBGWF9GTE9BVCBheGlzX2xlbl9zcXVhcmUgPQ0KKyAgICAgICAgICBGWFNZU19NdWwoeF9zcGFuLCB4X3NwYW4pICsgRlhTWVNfTXVsKHlfc3BhbiwgeV9zcGFuKTsNCisgICAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgew0KKyAgICAgICAgRlhfRFdPUkQqIGRpYl9idWYgPSAoRlhfRFdPUkQqKShibXAuR2V0QnVmZmVyKCkgKyByb3cgKiBwaXRjaCk7DQorICAgICAgICBmb3IgKGludDMyX3QgY29sdW1uID0gMDsgY29sdW1uIDwgd2lkdGg7IGNvbHVtbisrKSB7DQorICAgICAgICAgIEZYX0ZMT0FUIHggPSAoRlhfRkxPQVQpKGNvbHVtbik7DQorICAgICAgICAgIEZYX0ZMT0FUIHkgPSAoRlhfRkxPQVQpKHJvdyk7DQorICAgICAgICAgIEZYX0ZMT0FUIHNjYWxlID0gRlhTWVNfRGl2KA0KKyAgICAgICAgICAgICAgRlhTWVNfTXVsKHggLSBzdGFydF94LCB4X3NwYW4pICsgRlhTWVNfTXVsKHkgLSBzdGFydF95LCB5X3NwYW4pLA0KKyAgICAgICAgICAgICAgYXhpc19sZW5fc3F1YXJlKTsNCisgICAgICAgICAgaWYgKHNjYWxlIDwgMCkgew0KKyAgICAgICAgICAgIGlmICghX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9pc0V4dGVuZGVkQmVnaW4pIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzY2FsZSA9IDA7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiAxLjBmKSB7DQorICAgICAgICAgICAgaWYgKCFfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2lzRXh0ZW5kZWRFbmQpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzY2FsZSA9IDEuMGY7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50MzJfdCBpbmRleCA9IChpbnQzMl90KShzY2FsZSAqIChGWF9TSEFESU5HX1N0ZXBzIC0gMSkpOw0KKyAgICAgICAgICBkaWJfYnVmW2NvbHVtbl0gPSBfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2FyZ2JBcnJheVtpbmRleF07DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJlc3VsdCA9IFRSVUU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGWF9TSEFESU5HX1JhZGlhbDogew0KKyAgICAgIEZYX0ZMT0FUIHN0YXJ0X3IgPSBfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2JlZ2luUmFkaXVzOw0KKyAgICAgIEZYX0ZMT0FUIGVuZF9yID0gX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9lbmRSYWRpdXM7DQorICAgICAgRlhfRkxPQVQgYSA9IEZYU1lTX011bChzdGFydF94IC0gZW5kX3gsIHN0YXJ0X3ggLSBlbmRfeCkgKw0KKyAgICAgICAgICAgICAgICAgICBGWFNZU19NdWwoc3RhcnRfeSAtIGVuZF95LCBzdGFydF95IC0gZW5kX3kpIC0NCisgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKHN0YXJ0X3IgLSBlbmRfciwgc3RhcnRfciAtIGVuZF9yKTsNCisgICAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgew0KKyAgICAgICAgRlhfRFdPUkQqIGRpYl9idWYgPSAoRlhfRFdPUkQqKShibXAuR2V0QnVmZmVyKCkgKyByb3cgKiBwaXRjaCk7DQorICAgICAgICBmb3IgKGludDMyX3QgY29sdW1uID0gMDsgY29sdW1uIDwgd2lkdGg7IGNvbHVtbisrKSB7DQorICAgICAgICAgIEZYX0ZMT0FUIHggPSAoRlhfRkxPQVQpKGNvbHVtbik7DQorICAgICAgICAgIEZYX0ZMT0FUIHkgPSAoRlhfRkxPQVQpKHJvdyk7DQorICAgICAgICAgIEZYX0ZMT0FUIGIgPSAtMiAqIChGWFNZU19NdWwoeCAtIHN0YXJ0X3gsIGVuZF94IC0gc3RhcnRfeCkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKHkgLSBzdGFydF95LCBlbmRfeSAtIHN0YXJ0X3kpICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX011bChzdGFydF9yLCBlbmRfciAtIHN0YXJ0X3IpKTsNCisgICAgICAgICAgRlhfRkxPQVQgYyA9IEZYU1lTX011bCh4IC0gc3RhcnRfeCwgeCAtIHN0YXJ0X3gpICsNCisgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX011bCh5IC0gc3RhcnRfeSwgeSAtIHN0YXJ0X3kpIC0NCisgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX011bChzdGFydF9yLCBzdGFydF9yKTsNCisgICAgICAgICAgRlhfRkxPQVQgczsNCisgICAgICAgICAgaWYgKGEgPT0gMCkgew0KKyAgICAgICAgICAgIHMgPSAoRlhTWVNfRGl2KC1jLCBiKSk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgYjJfNGFjID0gRlhTWVNfTXVsKGIsIGIpIC0gNCAqIEZYU1lTX011bChhLCBjKTsNCisgICAgICAgICAgICBpZiAoYjJfNGFjIDwgMCkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0ZMT0FUIHJvb3QgPSAoRlhTWVNfc3FydChiMl80YWMpKTsNCisgICAgICAgICAgICBGWF9GTE9BVCBzMSwgczI7DQorICAgICAgICAgICAgaWYgKGEgPiAwKSB7DQorICAgICAgICAgICAgICBzMSA9IEZYU1lTX0RpdigtYiAtIHJvb3QsIDIgKiBhKTsNCisgICAgICAgICAgICAgIHMyID0gRlhTWVNfRGl2KC1iICsgcm9vdCwgMiAqIGEpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBzMiA9IEZYU1lTX0RpdigtYiAtIHJvb3QsIDIgKiBhKTsNCisgICAgICAgICAgICAgIHMxID0gRlhTWVNfRGl2KC1iICsgcm9vdCwgMiAqIGEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoczIgPD0gMS4wZiB8fCBfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2lzRXh0ZW5kZWRFbmQpIHsNCisgICAgICAgICAgICAgIHMgPSAoczIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBzID0gKHMxKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKChzdGFydF9yKSArIHMgKiAoZW5kX3IgLSBzdGFydF9yKSA8IDApIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocyA8IDApIHsNCisgICAgICAgICAgICBpZiAoIV9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5faXNFeHRlbmRlZEJlZ2luKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcyA9IDA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKHMgPiAxLjBmKSB7DQorICAgICAgICAgICAgaWYgKCFfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2lzRXh0ZW5kZWRFbmQpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzID0gMS4wZjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnQgaW5kZXggPSAoaW50MzJfdCkocyAqIChGWF9TSEFESU5HX1N0ZXBzIC0gMSkpOw0KKyAgICAgICAgICBkaWJfYnVmW2NvbHVtbl0gPSBfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2FyZ2JBcnJheVtpbmRleF07DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJlc3VsdCA9IFRSVUU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXN1bHQgPSBGQUxTRTsgfQ0KKyAgfQ0KKyAgaWYgKHJlc3VsdCkgew0KICAgICBfcmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsNCiAgICAgX3JlbmRlckRldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwYXRoLT5HZXRQYXRoRGF0YSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopIG1hdHJpeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsTW9kZSk7DQotICAgIFNldERJQml0c1dpdGhNYXRyaXgoJmJtcCwgJnBhdHRlcm4tPl9tYXRyaXgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4KiltYXRyaXgsIGZpbGxNb2RlKTsNCisgICAgU2V0RElCaXRzV2l0aE1hdHJpeCgmYm1wLCBtYXRyaXgpOw0KICAgICBfcmVuZGVyRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsNCi0gICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpGaWxsUGF0aFdpdGhTaGFkaW5nKENGWF9QYXRoICogICBwYXRoLA0KLSAgICAgICAgRlhfRmlsbE1vZGUgIGZpbGxNb2RlLA0KLSAgICAgICAgQ0ZYX01hdHJpeCAqIG1hdHJpeCkNCi17DQotICAgIENGWF9ESUJpdG1hcCAqIGJpdG1hcCA9IF9yZW5kZXJEZXZpY2UtPkdldEJpdG1hcCgpOw0KLSAgICBpbnQzMl90IHdpZHRoCT0gYml0bWFwLT5HZXRXaWR0aCgpOw0KLSAgICBpbnQzMl90IGhlaWdodAk9IGJpdG1hcC0+R2V0SGVpZ2h0KCk7DQotICAgIEZYX0ZMT0FUIHN0YXJ0X3ggPSBfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2JlZ2luUG9pbnQueDsNCi0gICAgRlhfRkxPQVQgc3RhcnRfeSA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fYmVnaW5Qb2ludC55Ow0KLSAgICBGWF9GTE9BVCBlbmRfeCA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fZW5kUG9pbnQueDsNCi0gICAgRlhfRkxPQVQgZW5kX3kgPSBfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2VuZFBvaW50Lnk7DQotICAgIENGWF9ESUJpdG1hcCBibXA7DQotICAgIGJtcC5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfQXJnYik7DQotICAgIF9yZW5kZXJEZXZpY2UtPkdldERJQml0cygmYm1wLCAwLCAwKTsNCi0gICAgaW50MzJfdCBwaXRjaAk9IGJtcC5HZXRQaXRjaCgpOw0KLSAgICBGWF9CT09MIHJlc3VsdCA9IEZBTFNFOw0KLSAgICBzd2l0Y2ggKF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fdHlwZSkgew0KLSAgICAgICAgY2FzZSBGWF9TSEFESU5HX0F4aWFsOiB7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhfc3BhbiA9IGVuZF94IC0gc3RhcnRfeDsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgeV9zcGFuID0gZW5kX3kgLSBzdGFydF95Ow0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBheGlzX2xlbl9zcXVhcmUgPSBGWFNZU19NdWwoeF9zcGFuLCB4X3NwYW4pICsgRlhTWVNfTXVsKHlfc3BhbiwgeV9zcGFuKTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsNCi0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEICogZGliX2J1ZiA9IChGWF9EV09SRCAqKSAoYm1wLkdldEJ1ZmZlcigpICsgcm93ICogcGl0Y2gpOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHdpZHRoOyBjb2x1bW4rKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHggPSAoRlhfRkxPQVQpKGNvbHVtbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSA9IChGWF9GTE9BVCkocm93KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzY2FsZSA9IEZYU1lTX0RpdihGWFNZU19NdWwoeCAtIHN0YXJ0X3gsIHhfc3BhbikgKyBGWFNZU19NdWwoeSAtIHN0YXJ0X3ksIHlfc3BhbiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc19sZW5fc3F1YXJlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGUgPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9pc0V4dGVuZGVkQmVnaW4pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gMS4wZikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5faXNFeHRlbmRlZEVuZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAxLjBmOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gKGludDMyX3QpKHNjYWxlICogKEZYX1NIQURJTkdfU3RlcHMgLSAxKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGliX2J1Zltjb2x1bW5dID0gX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9hcmdiQXJyYXlbaW5kZXhdOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGNhc2UgRlhfU0hBRElOR19SYWRpYWw6IHsNCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfciA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fYmVnaW5SYWRpdXM7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZF9yID0gX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9lbmRSYWRpdXM7DQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGEgPSBGWFNZU19NdWwoc3RhcnRfeCAtIGVuZF94LCBzdGFydF94IC0gZW5kX3gpICsgRlhTWVNfTXVsKHN0YXJ0X3kgLSBlbmRfeSwgc3RhcnRfeSAtIGVuZF95KSAtIEZYU1lTX011bChzdGFydF9yIC0gZW5kX3IsIHN0YXJ0X3IgLSBlbmRfcik7DQotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7DQotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCAqIGRpYl9idWYgPSAoRlhfRFdPUkQgKikgKGJtcC5HZXRCdWZmZXIoKSArIHJvdyAqIHBpdGNoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0aDsgY29sdW1uKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4ID0gKEZYX0ZMT0FUKShjb2x1bW4pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkgPSAoRlhfRkxPQVQpKHJvdyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYiA9IC0yICogKEZYU1lTX011bCh4IC0gc3RhcnRfeCwgZW5kX3ggLSBzdGFydF94KSArIEZYU1lTX011bCh5IC0gc3RhcnRfeSwgZW5kX3kgLSBzdGFydF95KSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX011bChzdGFydF9yLCBlbmRfciAtIHN0YXJ0X3IpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjID0gRlhTWVNfTXVsKHggLSBzdGFydF94LCB4IC0gc3RhcnRfeCkgKyBGWFNZU19NdWwoeSAtIHN0YXJ0X3ksIHkgLSBzdGFydF95KSAtDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX011bChzdGFydF9yLCBzdGFydF9yKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IChGWFNZU19EaXYoLWMsIGIpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiMl80YWMgPSBGWFNZU19NdWwoYiwgYikgLSA0ICogRlhTWVNfTXVsKGEsIGMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYjJfNGFjIDwgMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcm9vdCA9IChGWFNZU19zcXJ0KGIyXzRhYykpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzMSwgczI7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEgPSBGWFNZU19EaXYoLWIgLSByb290LCAyICogYSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMiA9IEZYU1lTX0RpdigtYiArIHJvb3QsIDIgKiBhKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMyID0gRlhTWVNfRGl2KC1iIC0gcm9vdCwgMiAqIGEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEgPSBGWFNZU19EaXYoLWIgKyByb290LCAyICogYSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMyIDw9IDEuMGYgfHwgX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9pc0V4dGVuZGVkRW5kKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gKHMyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAoczEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhcnRfcikgKyBzICogKGVuZF9yIC0gc3RhcnRfcikgPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA8IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2lzRXh0ZW5kZWRCZWdpbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID4gMS4wZikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5faXNFeHRlbmRlZEVuZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDEuMGY7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IChpbnQzMl90KShzICogKEZYX1NIQURJTkdfU3RlcHMgLSAxKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGliX2J1Zltjb2x1bW5dID0gX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9hcmdiQXJyYXlbaW5kZXhdOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIGRlZmF1bHQ6IHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7DQotICAgICAgICAgICAgfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldERJQml0c1dpdGhNYXRyaXgoQ0ZYX0RJQlNvdXJjZSogc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBpZiAobWF0cml4LT5Jc0lkZW50aXR5KCkpIHsNCisgICAgX3JlbmRlckRldmljZS0+U2V0RElCaXRzKHNvdXJjZSwgMCwgMCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfTWF0cml4IG07DQorICAgIG0uU2V0KChGWF9GTE9BVClzb3VyY2UtPkdldFdpZHRoKCksIDAsIDAsIChGWF9GTE9BVClzb3VyY2UtPkdldEhlaWdodCgpLCAwLA0KKyAgICAgICAgICAwKTsNCisgICAgbS5Db25jYXQoKm1hdHJpeCk7DQorICAgIGludDMyX3QgbGVmdCwgdG9wOw0KKyAgICBDRlhfRElCaXRtYXAqIGJtcDEgPSBzb3VyY2UtPkZsaXBJbWFnZShGQUxTRSwgVFJVRSk7DQorICAgIENGWF9ESUJpdG1hcCogYm1wMiA9IGJtcDEtPlRyYW5zZm9ybVRvKChDRlhfQWZmaW5lTWF0cml4KikmbSwgbGVmdCwgdG9wKTsNCisgICAgX3JlbmRlckRldmljZS0+U2V0RElCaXRzKGJtcDIsIGxlZnQsIHRvcCk7DQorICAgIGlmIChibXAyKSB7DQorICAgICAgZGVsZXRlIGJtcDI7DQorICAgICAgYm1wMiA9IE5VTEw7DQogICAgIH0NCi0gICAgaWYgKHJlc3VsdCkgew0KLSAgICAgICAgX3JlbmRlckRldmljZS0+U2F2ZVN0YXRlKCk7DQotICAgICAgICBfcmVuZGVyRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKHBhdGgtPkdldFBhdGhEYXRhKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlhfQWZmaW5lTWF0cml4ICopIG1hdHJpeCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1vZGUpOw0KLSAgICAgICAgU2V0RElCaXRzV2l0aE1hdHJpeCgmYm1wLCBtYXRyaXgpOw0KLSAgICAgICAgX3JlbmRlckRldmljZS0+UmVzdG9yZVN0YXRlKCk7DQorICAgIGlmIChibXAxKSB7DQorICAgICAgZGVsZXRlIGJtcDE7DQorICAgICAgYm1wMSA9IE5VTEw7DQogICAgIH0NCi0gICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRESUJpdHNXaXRoTWF0cml4KENGWF9ESUJTb3VyY2UgKiBzb3VyY2UsIENGWF9NYXRyaXggKiBtYXRyaXgpDQotew0KLSAgICBpZiAobWF0cml4LT5Jc0lkZW50aXR5KCkpIHsNCi0gICAgICAgIF9yZW5kZXJEZXZpY2UtPlNldERJQml0cyhzb3VyY2UsIDAsIDApOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgQ0ZYX01hdHJpeCBtOw0KLSAgICAgICAgbS5TZXQoKEZYX0ZMT0FUKXNvdXJjZS0+R2V0V2lkdGgoKSwgMCwgMCwgKEZYX0ZMT0FUKXNvdXJjZS0+R2V0SGVpZ2h0KCksIDAsIDApOw0KLSAgICAgICAgbS5Db25jYXQoKm1hdHJpeCk7DQotICAgICAgICBpbnQzMl90IGxlZnQsIHRvcDsNCi0gICAgICAgIENGWF9ESUJpdG1hcCAqIGJtcDEgPSBzb3VyY2UtPkZsaXBJbWFnZShGQUxTRSwgVFJVRSk7DQotICAgICAgICBDRlhfRElCaXRtYXAgKiBibXAyID0gYm1wMS0+VHJhbnNmb3JtVG8oKENGWF9BZmZpbmVNYXRyaXggKikgJm0sIGxlZnQsIHRvcCk7DQotICAgICAgICBfcmVuZGVyRGV2aWNlLT5TZXRESUJpdHMoYm1wMiwgbGVmdCwgdG9wKTsNCi0gICAgICAgIGlmIChibXAyKSB7DQotICAgICAgICAgICAgZGVsZXRlIGJtcDI7DQotICAgICAgICAgICAgYm1wMiA9IE5VTEw7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYm1wMSkgew0KLSAgICAgICAgICAgIGRlbGV0ZSBibXAxOw0KLSAgICAgICAgICAgIGJtcDEgPSBOVUxMOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkNhbGNUZXh0SW5mbyhjb25zdCBDRlhfV2lkZVN0cmluZyYgdGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGNoYXJDb2RlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIGNoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCkgew0KKyAgSUZYX0ZvbnRFbmNvZGluZyogZW5jb2RpbmcgPSBGWEdFX0NyZWF0ZVVuaWNvZGVFbmNvZGluZyhfaW5mby5fZm9udCk7DQorICBpbnQzMl90IGxlbmd0aCA9IHRleHQuR2V0TGVuZ3RoKCk7DQorICBGWF9GTE9BVCBwZW5YID0gKEZYX0ZMT0FUKXJlY3QubGVmdDsNCisgIEZYX0ZMT0FUIHBlblkgPSAoRlhfRkxPQVQpcmVjdC50b3A7DQorICBGWF9GTE9BVCBsZWZ0ID0gKEZYX0ZMT0FUKSgwKTsNCisgIEZYX0ZMT0FUIHRvcCA9IChGWF9GTE9BVCkoMCk7DQorICBjaGFyQ29kZXNbMF0gPSB0ZXh0LkdldEF0KDApOw0KKyAgY2hhclBvc1swXS5tX09yaWdpblggPSBwZW5YICsgbGVmdDsNCisgIGNoYXJQb3NbMF0ubV9PcmlnaW5ZID0gcGVuWSArIHRvcDsNCisgIGNoYXJQb3NbMF0ubV9HbHlwaEluZGV4ID0gZW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKGNoYXJDb2Rlc1swXSk7DQorICBjaGFyUG9zWzBdLm1fRm9udENoYXJXaWR0aCA9IEZYU1lTX3JvdW5kKA0KKyAgICAgIF9pbmZvLl9mb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbMF0ubV9HbHlwaEluZGV4KSAqIF9pbmZvLl9mb250SFNjYWxlKTsNCisgIGNoYXJQb3NbMF0ubV9iR2x5cGhBZGp1c3QgPSBUUlVFOw0KKyAgY2hhclBvc1swXS5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KKyAgY2hhclBvc1swXS5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQorICBjaGFyUG9zWzBdLm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgIGNoYXJQb3NbMF0ubV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KKyAgcGVuWCArPSAoRlhfRkxPQVQpKGNoYXJQb3NbMF0ubV9Gb250Q2hhcldpZHRoKSAqIF9pbmZvLl9mb250U2l6ZSAvIDEwMDAgKw0KKyAgICAgICAgICBfaW5mby5fZm9udFNwYWNpbmc7DQorICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgew0KKyAgICBjaGFyQ29kZXNbaV0gPSB0ZXh0LkdldEF0KGkpOw0KKyAgICBjaGFyUG9zW2ldLm1fT3JpZ2luWCA9IHBlblggKyBsZWZ0Ow0KKyAgICBjaGFyUG9zW2ldLm1fT3JpZ2luWSA9IHBlblkgKyB0b3A7DQorICAgIGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4ID0gZW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKGNoYXJDb2Rlc1tpXSk7DQorICAgIGNoYXJQb3NbaV0ubV9Gb250Q2hhcldpZHRoID0NCisgICAgICAgIEZYU1lTX3JvdW5kKF9pbmZvLl9mb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4KSAqDQorICAgICAgICAgICAgICAgICAgICBfaW5mby5fZm9udEhTY2FsZSk7DQorICAgIGNoYXJQb3NbaV0ubV9iR2x5cGhBZGp1c3QgPSBUUlVFOw0KKyAgICBjaGFyUG9zW2ldLm1fQWRqdXN0TWF0cml4WzBdID0gLTE7DQorICAgIGNoYXJQb3NbaV0ubV9BZGp1c3RNYXRyaXhbMV0gPSAwOw0KKyAgICBjaGFyUG9zW2ldLm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgICAgY2hhclBvc1tpXS5tX0FkanVzdE1hdHJpeFszXSA9IDE7DQorICAgIHBlblggKz0gKEZYX0ZMT0FUKShjaGFyUG9zW2ldLm1fRm9udENoYXJXaWR0aCkgKiBfaW5mby5fZm9udFNpemUgLyAxMDAwICsNCisgICAgICAgICAgICBfaW5mby5fZm9udFNwYWNpbmc7DQorICB9DQorICByZWN0LndpZHRoID0gKEZYX0ZMT0FUKXBlblggLSByZWN0LmxlZnQ7DQorICByZWN0LmhlaWdodCA9IHJlY3QudG9wICsgX2luZm8uX2ZvbnRTaXplICogX2luZm8uX2ZvbnRIU2NhbGUgLSByZWN0LnRvcDsNCisgIGRlbGV0ZSBlbmNvZGluZzsNCisgIGVuY29kaW5nID0gTlVMTDsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GWF9FUlIgQ0ZYX0dyYXBoaWNzOjpDYWxjVGV4dEluZm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB0ZXh0LCBGWF9EV09SRCAqIGNoYXJDb2RlcywgRlhURVhUX0NIQVJQT1MgKiBjaGFyUG9zLCBDRlhfUmVjdEYgJiByZWN0KQ0KLXsNCi0gICAgSUZYX0ZvbnRFbmNvZGluZyAqIGVuY29kaW5nID0gRlhHRV9DcmVhdGVVbmljb2RlRW5jb2RpbmcoX2luZm8uX2ZvbnQpOw0KLSAgICBpbnQzMl90IGxlbmd0aCA9IHRleHQuR2V0TGVuZ3RoKCk7DQotICAgIEZYX0ZMT0FUIHBlblggPSAoRlhfRkxPQVQpIHJlY3QubGVmdDsNCi0gICAgRlhfRkxPQVQgcGVuWSA9IChGWF9GTE9BVCkgcmVjdC50b3A7DQotICAgIEZYX0ZMT0FUIGxlZnQgPSAoRlhfRkxPQVQpKDApOw0KLSAgICBGWF9GTE9BVCB0b3AJID0gKEZYX0ZMT0FUKSgwKTsNCi0gICAgY2hhckNvZGVzWzBdID0gdGV4dC5HZXRBdCgwKTsNCi0gICAgY2hhclBvc1swXS5tX09yaWdpblggPSBwZW5YICsgbGVmdDsNCi0gICAgY2hhclBvc1swXS5tX09yaWdpblkgPSBwZW5ZICsgdG9wOw0KLSAgICBjaGFyUG9zWzBdLm1fR2x5cGhJbmRleCA9IGVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShjaGFyQ29kZXNbMF0pOw0KLSAgICBjaGFyUG9zWzBdLm1fRm9udENoYXJXaWR0aCA9IEZYU1lTX3JvdW5kKF9pbmZvLl9mb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbMF0ubV9HbHlwaEluZGV4KSAqIF9pbmZvLl9mb250SFNjYWxlKTsNCi0gICAgY2hhclBvc1swXS5tX2JHbHlwaEFkanVzdCA9IFRSVUU7DQotICAgIGNoYXJQb3NbMF0ubV9BZGp1c3RNYXRyaXhbMF0gPSAtMTsNCi0gICAgY2hhclBvc1swXS5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQotICAgIGNoYXJQb3NbMF0ubV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KLSAgICBjaGFyUG9zWzBdLm1fQWRqdXN0TWF0cml4WzNdID0gMTsNCi0gICAgcGVuWCArPSAoRlhfRkxPQVQpKGNoYXJQb3NbMF0ubV9Gb250Q2hhcldpZHRoKSAqIF9pbmZvLl9mb250U2l6ZSAvIDEwMDAgKyBfaW5mby5fZm9udFNwYWNpbmc7DQotICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7DQotICAgICAgICBjaGFyQ29kZXNbaV0gPSB0ZXh0LkdldEF0KGkpOw0KLSAgICAgICAgY2hhclBvc1tpXS5tX09yaWdpblggPSBwZW5YICsgbGVmdDsNCi0gICAgICAgIGNoYXJQb3NbaV0ubV9PcmlnaW5ZID0gcGVuWSArIHRvcDsNCi0gICAgICAgIGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4ID0gZW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKGNoYXJDb2Rlc1tpXSk7DQotICAgICAgICBjaGFyUG9zW2ldLm1fRm9udENoYXJXaWR0aCA9IEZYU1lTX3JvdW5kKF9pbmZvLl9mb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4KSAqIF9pbmZvLl9mb250SFNjYWxlKTsNCi0gICAgICAgIGNoYXJQb3NbaV0ubV9iR2x5cGhBZGp1c3QgPSBUUlVFOw0KLSAgICAgICAgY2hhclBvc1tpXS5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KLSAgICAgICAgY2hhclBvc1tpXS5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQotICAgICAgICBjaGFyUG9zW2ldLm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCi0gICAgICAgIGNoYXJQb3NbaV0ubV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KLSAgICAgICAgcGVuWCArPSAoRlhfRkxPQVQpKGNoYXJQb3NbaV0ubV9Gb250Q2hhcldpZHRoKSAqIF9pbmZvLl9mb250U2l6ZSAvIDEwMDAgKyBfaW5mby5fZm9udFNwYWNpbmc7DQotICAgIH0NCi0gICAgcmVjdC53aWR0aAk9IChGWF9GTE9BVCkgcGVuWCAtIHJlY3QubGVmdDsNCi0gICAgcmVjdC5oZWlnaHQJPSByZWN0LnRvcCArIF9pbmZvLl9mb250U2l6ZSAqIF9pbmZvLl9mb250SFNjYWxlIC0gcmVjdC50b3A7DQotICAgIGRlbGV0ZSBlbmNvZGluZzsNCi0gICAgZW5jb2RpbmcgPSBOVUxMOw0KLSAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCitDQUdHX0dyYXBoaWNzOjpDQUdHX0dyYXBoaWNzKCkgew0KKyAgX293bmVyID0gTlVMTDsNCiB9DQotQ0FHR19HcmFwaGljczo6Q0FHR19HcmFwaGljcygpDQotew0KLSAgICBfb3duZXIgPSBOVUxMOw0KK0ZYX0VSUiBDQUdHX0dyYXBoaWNzOjpDcmVhdGUoQ0ZYX0dyYXBoaWNzKiBvd25lciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQpIHsNCisgIGlmIChvd25lci0+X3JlbmRlckRldmljZSkgew0KKyAgICByZXR1cm4gRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkOw0KKyAgfQ0KKyAgaWYgKF9vd25lcikgew0KKyAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICB9DQorICBDRlhfRnhnZURldmljZSogZGV2aWNlID0gRlhfTkVXIENGWF9GeGdlRGV2aWNlOw0KKyAgZGV2aWNlLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KTsNCisgIF9vd25lciA9IG93bmVyOw0KKyAgX293bmVyLT5fcmVuZGVyRGV2aWNlID0gZGV2aWNlOw0KKyAgX293bmVyLT5fcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKS0+Q2xlYXIoMHhGRkZGRkZGRik7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRVJSIENBR0dfR3JhcGhpY3M6OkNyZWF0ZShDRlhfR3JhcGhpY3MgKiBvd25lciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgd2lkdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgIGhlaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCAgIGZvcm1hdCkNCi17DQotICAgIGlmIChvd25lci0+X3JlbmRlckRldmljZSkgew0KLSAgICAgICAgcmV0dXJuIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCi0gICAgfQ0KLSAgICBpZiAoX293bmVyKSB7DQotICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgIH0NCi0gICAgQ0ZYX0Z4Z2VEZXZpY2UgKiBkZXZpY2UgPSBGWF9ORVcgQ0ZYX0Z4Z2VEZXZpY2U7DQotICAgIGRldmljZS0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7DQotICAgIF9vd25lciA9IG93bmVyOw0KLSAgICBfb3duZXItPl9yZW5kZXJEZXZpY2UgPSBkZXZpY2U7DQotICAgIF9vd25lci0+X3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCktPkNsZWFyKDB4RkZGRkZGRkYpOw0KLSAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCitDQUdHX0dyYXBoaWNzOjp+Q0FHR19HcmFwaGljcygpIHsNCisgIGlmIChfb3duZXItPl9yZW5kZXJEZXZpY2UpIHsNCisgICAgZGVsZXRlIChDRlhfRnhnZURldmljZSopX293bmVyLT5fcmVuZGVyRGV2aWNlOw0KKyAgfQ0KKyAgX293bmVyID0gTlVMTDsNCiB9DQotQ0FHR19HcmFwaGljczo6fkNBR0dfR3JhcGhpY3MoKQ0KLXsNCi0gICAgaWYgKF9vd25lci0+X3JlbmRlckRldmljZSkgew0KLSAgICAgICAgZGVsZXRlIChDRlhfRnhnZURldmljZSAqKSBfb3duZXItPl9yZW5kZXJEZXZpY2U7DQotICAgIH0NCi0gICAgX293bmVyID0gTlVMTDsNCitDRlhfUGF0aDo6Q0ZYX1BhdGgoKSB7DQorICBfZ2VuZXJhdG9yID0gTlVMTDsNCiB9DQotQ0ZYX1BhdGg6OkNGWF9QYXRoKCkNCi17DQorRlhfRVJSIENGWF9QYXRoOjpDcmVhdGUoKSB7DQorICBpZiAoX2dlbmVyYXRvcikgew0KKyAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICB9DQorICBfZ2VuZXJhdG9yID0gRlhfTkVXIENGWF9QYXRoR2VuZXJhdG9yOw0KKyAgX2dlbmVyYXRvci0+Q3JlYXRlKCk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZYX1BhdGg6On5DRlhfUGF0aCgpIHsNCisgIGlmIChfZ2VuZXJhdG9yKSB7DQorICAgIGRlbGV0ZSBfZ2VuZXJhdG9yOw0KICAgICBfZ2VuZXJhdG9yID0gTlVMTDsNCisgIH0NCiB9DQotRlhfRVJSIENGWF9QYXRoOjpDcmVhdGUoKQ0KLXsNCi0gICAgaWYgKF9nZW5lcmF0b3IpIHsNCi0gICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgfQ0KLSAgICBfZ2VuZXJhdG9yID0gRlhfTkVXIENGWF9QYXRoR2VuZXJhdG9yOw0KLSAgICBfZ2VuZXJhdG9yLT5DcmVhdGUoKTsNCi0gICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorRlhfRVJSIENGWF9QYXRoOjpNb3ZlVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIF9nZW5lcmF0b3ItPk1vdmVUbyh4LCB5KTsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRlhfUGF0aDo6fkNGWF9QYXRoKCkNCi17DQotICAgIGlmIChfZ2VuZXJhdG9yKSB7DQotICAgICAgICBkZWxldGUgX2dlbmVyYXRvcjsNCi0gICAgICAgIF9nZW5lcmF0b3IgPSBOVUxMOw0KLSAgICB9DQotfQ0KLUZYX0VSUiBDRlhfUGF0aDo6TW92ZVRvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICBfZ2VuZXJhdG9yLT5Nb3ZlVG8oeCwgeSk7DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KLX0NCi1GWF9FUlIgQ0ZYX1BhdGg6OkxpbmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgX2dlbmVyYXRvci0+TGluZVRvKHgsIHkpOw0KLSAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCitGWF9FUlIgQ0ZYX1BhdGg6OkxpbmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgX2dlbmVyYXRvci0+TGluZVRvKHgsIHkpOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogfQ0KIEZYX0VSUiBDRlhfUGF0aDo6QmV6aWVyVG8oRlhfRkxPQVQgY3RybFgxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFkxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFgyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFkyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9YLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9ZKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgX2dlbmVyYXRvci0+QmV6aWVyVG8oY3RybFgxLCBjdHJsWTEsIGN0cmxYMiwgY3RybFkyLCB0b1gsIHRvWSk7DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9ZKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgX2dlbmVyYXRvci0+QmV6aWVyVG8oY3RybFgxLCBjdHJsWTEsIGN0cmxYMiwgY3RybFkyLCB0b1gsIHRvWSk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiB9DQogRlhfRVJSIENGWF9QYXRoOjpBcmNUbyhGWF9GTE9BVCBsZWZ0LA0KICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wLA0KICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQogICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQogICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSkNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgIF9nZW5lcmF0b3ItPkFyY1RvKGxlZnQgKyB3aWR0aCAvIDIsDQotICAgICAgICAgICAgICAgICAgICAgIHRvcCArIGhlaWdodCAvIDIsDQotICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC8gMiwNCi0gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC8gMiwNCi0gICAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZSwNCi0gICAgICAgICAgICAgICAgICAgICAgc3dlZXBBbmdsZSk7DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIF9nZW5lcmF0b3ItPkFyY1RvKGxlZnQgKyB3aWR0aCAvIDIsIHRvcCArIGhlaWdodCAvIDIsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwNCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUpOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0VSUiBDRlhfUGF0aDo6Q2xvc2UoKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgX2dlbmVyYXRvci0+Q2xvc2UoKTsNCi0gICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorRlhfRVJSIENGWF9QYXRoOjpDbG9zZSgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBfZ2VuZXJhdG9yLT5DbG9zZSgpOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0VSUiBDRlhfUGF0aDo6QWRkTGluZShGWF9GTE9BVCB4MSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsDQotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MikNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgIF9nZW5lcmF0b3ItPkFkZExpbmUoeDEsIHkxLCB4MiwgeTIpOw0KLSAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCitGWF9FUlIgQ0ZYX1BhdGg6OkFkZExpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBfZ2VuZXJhdG9yLT5BZGRMaW5lKHgxLCB5MSwgeDIsIHkyKTsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KIH0NCiBGWF9FUlIgQ0ZYX1BhdGg6OkFkZEJlemllcihGWF9GTE9BVCBzdGFydFgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRZLA0KQEAgLTE0MDMsMjY4ICsxMjMwLDIzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFgyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxZMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRYLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZFkpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICBfZ2VuZXJhdG9yLT5BZGRCZXppZXIoc3RhcnRYLCBzdGFydFksIGN0cmxYMSwgY3RybFkxLCBjdHJsWDIsIGN0cmxZMiwgZW5kWCwgZW5kWSk7DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZFkpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBfZ2VuZXJhdG9yLT5BZGRCZXppZXIoc3RhcnRYLCBzdGFydFksIGN0cmxYMSwgY3RybFkxLCBjdHJsWDIsIGN0cmxZMiwgZW5kWCwNCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRZKTsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KIH0NCiBGWF9FUlIgQ0ZYX1BhdGg6OkFkZFJlY3RhbmdsZShGWF9GTE9BVCBsZWZ0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICBfZ2VuZXJhdG9yLT5BZGRSZWN0YW5nbGUobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCk7DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhlaWdodCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIF9nZW5lcmF0b3ItPkFkZFJlY3RhbmdsZShsZWZ0LCB0b3AsIGxlZnQgKyB3aWR0aCwgdG9wICsgaGVpZ2h0KTsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KIH0NCiBGWF9FUlIgQ0ZYX1BhdGg6OkFkZEVsbGlwc2UoRlhfRkxPQVQgbGVmdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgX2dlbmVyYXRvci0+QWRkRWxsaXBzZShsZWZ0ICsgd2lkdGggLyAyLCB0b3AgKyBoZWlnaHQgLyAyLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOw0KLSAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgX2dlbmVyYXRvci0+QWRkRWxsaXBzZShsZWZ0ICsgd2lkdGggLyAyLCB0b3AgKyBoZWlnaHQgLyAyLCB3aWR0aCAvIDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAvIDIpOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0VSUiBDRlhfUGF0aDo6QWRkRWxsaXBzZShjb25zdCBDRlhfUmVjdEYgJiByZWN0KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgX2dlbmVyYXRvci0+QWRkRWxsaXBzZShyZWN0LmxlZnQgKyByZWN0LldpZHRoKCkgLyAyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wICsgcmVjdC5IZWlnaHQoKSAvIDIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5XaWR0aCgpIC8gMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LkhlaWdodCgpIC8gMik7DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK0ZYX0VSUiBDRlhfUGF0aDo6QWRkRWxsaXBzZShjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBfZ2VuZXJhdG9yLT5BZGRFbGxpcHNlKHJlY3QubGVmdCArIHJlY3QuV2lkdGgoKSAvIDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wICsgcmVjdC5IZWlnaHQoKSAvIDIsIHJlY3QuV2lkdGgoKSAvIDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuSGVpZ2h0KCkgLyAyKTsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KIH0NCiBGWF9FUlIgQ0ZYX1BhdGg6OkFkZEFyYyhGWF9GTE9BVCBsZWZ0LA0KICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCi0gICAgX2dlbmVyYXRvci0+QWRkQXJjKGxlZnQgKyB3aWR0aCAvIDIsDQotICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBoZWlnaHQgLyAyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggLyAyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC8gMiwNCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGUsDQotICAgICAgICAgICAgICAgICAgICAgICBzd2VlcEFuZ2xlKTsNCi0gICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIF9nZW5lcmF0b3ItPkFkZEFyYyhsZWZ0ICsgd2lkdGggLyAyLCB0b3AgKyBoZWlnaHQgLyAyLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsDQorICAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiB9DQogRlhfRVJSIENGWF9QYXRoOjpBZGRQaWUoRlhfRkxPQVQgbGVmdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQogICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSkNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQotICAgIF9nZW5lcmF0b3ItPkFkZFBpZShsZWZ0ICsgd2lkdGggLyAyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgdG9wICsgaGVpZ2h0IC8gMiwNCi0gICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC8gMiwNCi0gICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAvIDIsDQotICAgICAgICAgICAgICAgICAgICAgICBzdGFydEFuZ2xlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgc3dlZXBBbmdsZSk7DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwQW5nbGUpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBfZ2VuZXJhdG9yLT5BZGRQaWUobGVmdCArIHdpZHRoIC8gMiwgdG9wICsgaGVpZ2h0IC8gMiwgd2lkdGggLyAyLCBoZWlnaHQgLyAyLA0KKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUpOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLUZYX0VSUiBDRlhfUGF0aDo6QWRkU3VicGF0aChDRlhfUGF0aCAqIHBhdGgpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICBfZ2VuZXJhdG9yLT5BZGRQYXRoRGF0YShwYXRoLT5HZXRQYXRoRGF0YSgpKTsNCi0gICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorRlhfRVJSIENGWF9QYXRoOjpBZGRTdWJwYXRoKENGWF9QYXRoKiBwYXRoKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgX2dlbmVyYXRvci0+QWRkUGF0aERhdGEocGF0aC0+R2V0UGF0aERhdGEoKSk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRVJSIENGWF9QYXRoOjpDbGVhcigpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICBfZ2VuZXJhdG9yLT5HZXRQYXRoRGF0YSgpLT5TZXRQb2ludENvdW50KDApOw0KLSAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCitGWF9FUlIgQ0ZYX1BhdGg6OkNsZWFyKCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIF9nZW5lcmF0b3ItPkdldFBhdGhEYXRhKCktPlNldFBvaW50Q291bnQoMCk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfQk9PTCBDRlhfUGF0aDo6SXNFbXB0eSgpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KLSAgICBpZiAoX2dlbmVyYXRvci0+R2V0UGF0aERhdGEoKS0+R2V0UG9pbnRDb3VudCgpID09IDApIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENGWF9QYXRoOjpJc0VtcHR5KCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIGlmIChfZ2VuZXJhdG9yLT5HZXRQYXRoRGF0YSgpLT5HZXRQb2ludENvdW50KCkgPT0gMCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotQ0ZYX1BhdGhEYXRhICogQ0ZYX1BhdGg6OkdldFBhdGhEYXRhKCkNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBOVUxMKTsNCi0gICAgcmV0dXJuIF9nZW5lcmF0b3ItPkdldFBhdGhEYXRhKCk7DQorQ0ZYX1BhdGhEYXRhKiBDRlhfUGF0aDo6R2V0UGF0aERhdGEoKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgTlVMTCk7DQorICByZXR1cm4gX2dlbmVyYXRvci0+R2V0UGF0aERhdGEoKTsNCiB9DQotQ0ZYX0NvbG9yOjpDRlhfQ29sb3IoKQ0KLXsNCi0gICAgX3R5cGUgPSBGWF9DT0xPUl9Ob25lOw0KK0NGWF9Db2xvcjo6Q0ZYX0NvbG9yKCkgew0KKyAgX3R5cGUgPSBGWF9DT0xPUl9Ob25lOw0KIH0NCi1DRlhfQ29sb3I6OkNGWF9Db2xvcihjb25zdCBGWF9BUkdCIGFyZ2IpDQotew0KLSAgICBfdHlwZSA9IEZYX0NPTE9SX05vbmU7DQotICAgIFNldChhcmdiKTsNCitDRlhfQ29sb3I6OkNGWF9Db2xvcihjb25zdCBGWF9BUkdCIGFyZ2IpIHsNCisgIF90eXBlID0gRlhfQ09MT1JfTm9uZTsNCisgIFNldChhcmdiKTsNCiB9DQotQ0ZYX0NvbG9yOjpDRlhfQ29sb3IoQ0ZYX1BhdHRlcm4gKiBwYXR0ZXJuLCBjb25zdCBGWF9BUkdCIGFyZ2IgKQ0KLXsNCi0gICAgX3R5cGUgPSBGWF9DT0xPUl9Ob25lOw0KLSAgICBTZXQocGF0dGVybiwgYXJnYik7DQorQ0ZYX0NvbG9yOjpDRlhfQ29sb3IoQ0ZYX1BhdHRlcm4qIHBhdHRlcm4sIGNvbnN0IEZYX0FSR0IgYXJnYikgew0KKyAgX3R5cGUgPSBGWF9DT0xPUl9Ob25lOw0KKyAgU2V0KHBhdHRlcm4sIGFyZ2IpOw0KIH0NCi1DRlhfQ29sb3I6OkNGWF9Db2xvcihDRlhfU2hhZGluZyAqIHNoYWRpbmcpDQotew0KLSAgICBfdHlwZSA9IEZYX0NPTE9SX05vbmU7DQotICAgIFNldChzaGFkaW5nKTsNCitDRlhfQ29sb3I6OkNGWF9Db2xvcihDRlhfU2hhZGluZyogc2hhZGluZykgew0KKyAgX3R5cGUgPSBGWF9DT0xPUl9Ob25lOw0KKyAgU2V0KHNoYWRpbmcpOw0KIH0NCi1DRlhfQ29sb3I6On5DRlhfQ29sb3IoKQ0KLXsNCi0gICAgX3R5cGUgPSBGWF9DT0xPUl9Ob25lOw0KK0NGWF9Db2xvcjo6fkNGWF9Db2xvcigpIHsNCisgIF90eXBlID0gRlhfQ09MT1JfTm9uZTsNCiB9DQotRlhfRVJSIENGWF9Db2xvcjo6U2V0KGNvbnN0IEZYX0FSR0IgYXJnYikNCi17DQotICAgIF90eXBlCQk9IEZYX0NPTE9SX1NvbGlkOw0KLSAgICBfYXJnYgkJPSBhcmdiOw0KLSAgICBfcGF0dGVybgk9IE5VTEw7DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK0ZYX0VSUiBDRlhfQ29sb3I6OlNldChjb25zdCBGWF9BUkdCIGFyZ2IpIHsNCisgIF90eXBlID0gRlhfQ09MT1JfU29saWQ7DQorICBfYXJnYiA9IGFyZ2I7DQorICBfcGF0dGVybiA9IE5VTEw7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiB9DQotRlhfRVJSIENGWF9Db2xvcjo6U2V0KENGWF9QYXR0ZXJuICogcGF0dGVybiwgY29uc3QgRlhfQVJHQiBhcmdiICkNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwYXR0ZXJuLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KLSAgICBfdHlwZQkJPSBGWF9DT0xPUl9QYXR0ZXJuOw0KLSAgICBfYXJnYgkJPSBhcmdiOw0KLSAgICBfcGF0dGVybgk9IHBhdHRlcm47DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK0ZYX0VSUiBDRlhfQ29sb3I6OlNldChDRlhfUGF0dGVybiogcGF0dGVybiwgY29uc3QgRlhfQVJHQiBhcmdiKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGF0dGVybiwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIF90eXBlID0gRlhfQ09MT1JfUGF0dGVybjsNCisgIF9hcmdiID0gYXJnYjsNCisgIF9wYXR0ZXJuID0gcGF0dGVybjsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1GWF9FUlIgQ0ZYX0NvbG9yOjpTZXQoQ0ZYX1NoYWRpbmcgKiBzaGFkaW5nKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNoYWRpbmcsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQotICAgIF90eXBlCQk9IEZYX0NPTE9SX1NoYWRpbmc7DQotICAgIF9zaGFkaW5nCT0gc2hhZGluZzsNCi0gICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorRlhfRVJSIENGWF9Db2xvcjo6U2V0KENGWF9TaGFkaW5nKiBzaGFkaW5nKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoc2hhZGluZywgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIF90eXBlID0gRlhfQ09MT1JfU2hhZGluZzsNCisgIF9zaGFkaW5nID0gc2hhZGluZzsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KIH0NCi1DRlhfUGF0dGVybjo6Q0ZYX1BhdHRlcm4oKQ0KLXsNCi0gICAgX3R5cGUgPSBGWF9QQVRURVJOX05vbmU7DQotICAgIF9tYXRyaXguUmVzZXQoKTsNCitDRlhfUGF0dGVybjo6Q0ZYX1BhdHRlcm4oKSB7DQorICBfdHlwZSA9IEZYX1BBVFRFUk5fTm9uZTsNCisgIF9tYXRyaXguUmVzZXQoKTsNCiB9DQotRlhfRVJSIENGWF9QYXR0ZXJuOjpDcmVhdGUoQ0ZYX0RJQml0bWFwICogYml0bWFwLA0KK0ZYX0VSUiBDRlhfUGF0dGVybjo6Q3JlYXRlKENGWF9ESUJpdG1hcCogYml0bWFwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUIHhTdGVwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUIHlTdGVwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXggKgkgIG1hdHJpeCApDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoYml0bWFwLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KLSAgICBpZiAoX3R5cGUgIT0gRlhfUEFUVEVSTl9Ob25lKSB7DQotICAgICAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQotICAgIH0NCi0gICAgX3R5cGUgPSBGWF9QQVRURVJOX0JpdG1hcDsNCi0gICAgX2JpdG1hcAk9IGJpdG1hcDsNCi0gICAgX3gxU3RlcAk9IHhTdGVwOw0KLSAgICBfeTFTdGVwCT0geVN0ZXA7DQotICAgIGlmIChtYXRyaXgpIHsNCi0gICAgICAgIF9tYXRyaXguU2V0KG1hdHJpeC0+YSwgbWF0cml4LT5iLCBtYXRyaXgtPmMsIG1hdHJpeC0+ZCwgbWF0cml4LT5lLCBtYXRyaXgtPmYpOw0KLSAgICB9DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGJpdG1hcCwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIGlmIChfdHlwZSAhPSBGWF9QQVRURVJOX05vbmUpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgfQ0KKyAgX3R5cGUgPSBGWF9QQVRURVJOX0JpdG1hcDsNCisgIF9iaXRtYXAgPSBiaXRtYXA7DQorICBfeDFTdGVwID0geFN0ZXA7DQorICBfeTFTdGVwID0geVN0ZXA7DQorICBpZiAobWF0cml4KSB7DQorICAgIF9tYXRyaXguU2V0KG1hdHJpeC0+YSwgbWF0cml4LT5iLCBtYXRyaXgtPmMsIG1hdHJpeC0+ZCwgbWF0cml4LT5lLA0KKyAgICAgICAgICAgICAgICBtYXRyaXgtPmYpOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogfQ0KIEZYX0VSUiBDRlhfUGF0dGVybjo6Q3JlYXRlKEZYX0hhdGNoU3R5bGUgaGF0Y2hTdHlsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGZvcmVBcmdiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmFja0FyZ2IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCAqCSBtYXRyaXggKQ0KLXsNCi0gICAgaWYgKGhhdGNoU3R5bGUgPCBGWF9IQVRDSFNUWUxFX0hvcml6b250YWwNCi0gICAgICAgICAgICB8fCBoYXRjaFN0eWxlID4gRlhfSEFUQ0hTVFlMRV9Tb2xpZERpYW1vbmQpIHsNCi0gICAgICAgIHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQotICAgIH0NCi0gICAgaWYgKF90eXBlICE9IEZYX1BBVFRFUk5fTm9uZSkgew0KLSAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICB9DQotICAgIF90eXBlID0gRlhfUEFUVEVSTl9IYXRjaDsNCi0gICAgX2hhdGNoU3R5bGUJPSBoYXRjaFN0eWxlOw0KLSAgICBfZm9yZUFyZ2IJPSBmb3JlQXJnYjsNCi0gICAgX2JhY2tBcmdiCT0gYmFja0FyZ2I7DQotICAgIGlmIChtYXRyaXgpIHsNCi0gICAgICAgIF9tYXRyaXguU2V0KG1hdHJpeC0+YSwgbWF0cml4LT5iLCBtYXRyaXgtPmMsIG1hdHJpeC0+ZCwgbWF0cml4LT5lLCBtYXRyaXgtPmYpOw0KLSAgICB9DQotICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgaWYgKGhhdGNoU3R5bGUgPCBGWF9IQVRDSFNUWUxFX0hvcml6b250YWwgfHwNCisgICAgICBoYXRjaFN0eWxlID4gRlhfSEFUQ0hTVFlMRV9Tb2xpZERpYW1vbmQpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCisgIH0NCisgIGlmIChfdHlwZSAhPSBGWF9QQVRURVJOX05vbmUpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgfQ0KKyAgX3R5cGUgPSBGWF9QQVRURVJOX0hhdGNoOw0KKyAgX2hhdGNoU3R5bGUgPSBoYXRjaFN0eWxlOw0KKyAgX2ZvcmVBcmdiID0gZm9yZUFyZ2I7DQorICBfYmFja0FyZ2IgPSBiYWNrQXJnYjsNCisgIGlmIChtYXRyaXgpIHsNCisgICAgX21hdHJpeC5TZXQobWF0cml4LT5hLCBtYXRyaXgtPmIsIG1hdHJpeC0+YywgbWF0cml4LT5kLCBtYXRyaXgtPmUsDQorICAgICAgICAgICAgICAgIG1hdHJpeC0+Zik7DQorICB9DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCiB9DQotQ0ZYX1BhdHRlcm46On5DRlhfUGF0dGVybigpDQotew0KLSAgICBfdHlwZSA9IEZYX1BBVFRFUk5fTm9uZTsNCitDRlhfUGF0dGVybjo6fkNGWF9QYXR0ZXJuKCkgew0KKyAgX3R5cGUgPSBGWF9QQVRURVJOX05vbmU7DQogfQ0KLUNGWF9TaGFkaW5nOjpDRlhfU2hhZGluZygpDQotew0KLSAgICBfdHlwZSA9IEZYX1NIQURJTkdfTm9uZTsNCitDRlhfU2hhZGluZzo6Q0ZYX1NoYWRpbmcoKSB7DQorICBfdHlwZSA9IEZYX1NIQURJTkdfTm9uZTsNCiB9DQotRlhfRVJSIENGWF9TaGFkaW5nOjpDcmVhdGVBeGlhbChjb25zdCBDRlhfUG9pbnRGICYgYmVnaW5Qb2ludCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYgJiBlbmRQb2ludCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wJCQkgICBpc0V4dGVuZGVkQmVnaW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MCQkJICAgaXNFeHRlbmRlZEVuZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IJICAgYmVnaW5BcmdiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQgkgICBlbmRBcmdiKQ0KLXsNCi0gICAgaWYgKF90eXBlICE9IEZYX1NIQURJTkdfTm9uZSkgew0KLSAgICAgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KLSAgICB9DQotICAgIF90eXBlID0gRlhfU0hBRElOR19BeGlhbDsNCi0gICAgX2JlZ2luUG9pbnQJCQk9IGJlZ2luUG9pbnQ7DQotICAgIF9lbmRQb2ludAkJCT0gZW5kUG9pbnQ7DQotICAgIF9pc0V4dGVuZGVkQmVnaW4JPSBpc0V4dGVuZGVkQmVnaW47DQotICAgIF9pc0V4dGVuZGVkRW5kCQk9IGlzRXh0ZW5kZWRFbmQ7DQotICAgIF9iZWdpbkFyZ2IJCQk9IGJlZ2luQXJnYjsNCi0gICAgX2VuZEFyZ2IJCQk9IGVuZEFyZ2I7DQotICAgIHJldHVybiBJbml0QXJnYkFycmF5KCk7DQorRlhfRVJSIENGWF9TaGFkaW5nOjpDcmVhdGVBeGlhbChjb25zdCBDRlhfUG9pbnRGJiBiZWdpblBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgZW5kUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRXh0ZW5kZWRCZWdpbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNFeHRlbmRlZEVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmVnaW5BcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBlbmRBcmdiKSB7DQorICBpZiAoX3R5cGUgIT0gRlhfU0hBRElOR19Ob25lKSB7DQorICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgIH0NCisgIF90eXBlID0gRlhfU0hBRElOR19BeGlhbDsNCisgIF9iZWdpblBvaW50ID0gYmVnaW5Qb2ludDsNCisgIF9lbmRQb2ludCA9IGVuZFBvaW50Ow0KKyAgX2lzRXh0ZW5kZWRCZWdpbiA9IGlzRXh0ZW5kZWRCZWdpbjsNCisgIF9pc0V4dGVuZGVkRW5kID0gaXNFeHRlbmRlZEVuZDsNCisgIF9iZWdpbkFyZ2IgPSBiZWdpbkFyZ2I7DQorICBfZW5kQXJnYiA9IGVuZEFyZ2I7DQorICByZXR1cm4gSW5pdEFyZ2JBcnJheSgpOw0KIH0NCi1GWF9FUlIgQ0ZYX1NoYWRpbmc6OkNyZWF0ZVJhZGlhbChjb25zdCBDRlhfUG9pbnRGICYJYmVnaW5Qb2ludCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGICYJZW5kUG9pbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQJCWJlZ2luUmFkaXVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUCQllbmRSYWRpdXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTAkJCWlzRXh0ZW5kZWRCZWdpbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MCQkJaXNFeHRlbmRlZEVuZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCCQliZWdpbkFyZ2IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQgkJZW5kQXJnYikNCi17DQotICAgIGlmIChfdHlwZSAhPSBGWF9TSEFESU5HX05vbmUpIHsNCi0gICAgICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCi0gICAgfQ0KLSAgICBfdHlwZSA9IEZYX1NIQURJTkdfUmFkaWFsOw0KLSAgICBfYmVnaW5Qb2ludAkJCT0gYmVnaW5Qb2ludDsNCi0gICAgX2VuZFBvaW50CQkJPSBlbmRQb2ludDsNCi0gICAgX2JlZ2luUmFkaXVzCQk9IGJlZ2luUmFkaXVzOw0KLSAgICBfZW5kUmFkaXVzCQkJPSBlbmRSYWRpdXM7DQotICAgIF9pc0V4dGVuZGVkQmVnaW4JPSBpc0V4dGVuZGVkQmVnaW47DQotICAgIF9pc0V4dGVuZGVkRW5kCQk9IGlzRXh0ZW5kZWRFbmQ7DQotICAgIF9iZWdpbkFyZ2IJCQk9IGJlZ2luQXJnYjsNCi0gICAgX2VuZEFyZ2IJCQk9IGVuZEFyZ2I7DQotICAgIHJldHVybiBJbml0QXJnYkFycmF5KCk7DQorRlhfRVJSIENGWF9TaGFkaW5nOjpDcmVhdGVSYWRpYWwoY29uc3QgQ0ZYX1BvaW50RiYgYmVnaW5Qb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBlbmRQb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCBiZWdpblJhZGl1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCBlbmRSYWRpdXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0V4dGVuZGVkQmVnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0V4dGVuZGVkRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmVnaW5BcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgZW5kQXJnYikgew0KKyAgaWYgKF90eXBlICE9IEZYX1NIQURJTkdfTm9uZSkgew0KKyAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICB9DQorICBfdHlwZSA9IEZYX1NIQURJTkdfUmFkaWFsOw0KKyAgX2JlZ2luUG9pbnQgPSBiZWdpblBvaW50Ow0KKyAgX2VuZFBvaW50ID0gZW5kUG9pbnQ7DQorICBfYmVnaW5SYWRpdXMgPSBiZWdpblJhZGl1czsNCisgIF9lbmRSYWRpdXMgPSBlbmRSYWRpdXM7DQorICBfaXNFeHRlbmRlZEJlZ2luID0gaXNFeHRlbmRlZEJlZ2luOw0KKyAgX2lzRXh0ZW5kZWRFbmQgPSBpc0V4dGVuZGVkRW5kOw0KKyAgX2JlZ2luQXJnYiA9IGJlZ2luQXJnYjsNCisgIF9lbmRBcmdiID0gZW5kQXJnYjsNCisgIHJldHVybiBJbml0QXJnYkFycmF5KCk7DQogfQ0KLUNGWF9TaGFkaW5nOjp+Q0ZYX1NoYWRpbmcoKQ0KLXsNCi0gICAgX3R5cGUgPSBGWF9TSEFESU5HX05vbmU7DQorQ0ZYX1NoYWRpbmc6On5DRlhfU2hhZGluZygpIHsNCisgIF90eXBlID0gRlhfU0hBRElOR19Ob25lOw0KIH0NCi1GWF9FUlIgQ0ZYX1NoYWRpbmc6OkluaXRBcmdiQXJyYXkoKQ0KLXsNCi0gICAgaW50MzJfdCBhMSwgcjEsIGcxLCBiMTsNCi0gICAgQXJnYkRlY29kZShfYmVnaW5BcmdiLCBhMSwgcjEsIGcxLCBiMSk7DQotICAgIGludDMyX3QgYTIsIHIyLCBnMiwgYjI7DQotICAgIEFyZ2JEZWNvZGUoX2VuZEFyZ2IsIGEyLCByMiwgZzIsIGIyKTsNCi0gICAgRlhfRkxPQVQgZiA9IChGWF9GTE9BVCkgKEZYX1NIQURJTkdfU3RlcHMgLSAxKTsNCi0gICAgRlhfRkxPQVQgYVNjYWxlID0gKEZYX0ZMT0FUKSAoMS4wICogKGEyIC0gYTEpIC8gZik7DQotICAgIEZYX0ZMT0FUIHJTY2FsZSA9IChGWF9GTE9BVCkgKDEuMCAqIChyMiAtIHIxKSAvIGYpOw0KLSAgICBGWF9GTE9BVCBnU2NhbGUgPSAoRlhfRkxPQVQpICgxLjAgKiAoZzIgLSBnMSkgLyBmKTsNCi0gICAgRlhfRkxPQVQgYlNjYWxlID0gKEZYX0ZMT0FUKSAoMS4wICogKGIyIC0gYjEpIC8gZik7DQotICAgIGludDMyX3QgYTMsIHIzLCBnMywgYjM7DQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IEZYX1NIQURJTkdfU3RlcHM7IGkrKykgew0KLSAgICAgICAgYTMgPSAoaW50MzJfdCkgKGkgKiBhU2NhbGUpOw0KLSAgICAgICAgcjMgPSAoaW50MzJfdCkgKGkgKiByU2NhbGUpOw0KLSAgICAgICAgZzMgPSAoaW50MzJfdCkgKGkgKiBnU2NhbGUpOw0KLSAgICAgICAgYjMgPSAoaW50MzJfdCkgKGkgKiBiU2NhbGUpOw0KLSAgICAgICAgX2FyZ2JBcnJheVtpXSA9IEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRSgoYTEgKyBhMyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyMSArIHIzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGcxICsgZzMpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYjEgKyBiMykpKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCitGWF9FUlIgQ0ZYX1NoYWRpbmc6OkluaXRBcmdiQXJyYXkoKSB7DQorICBpbnQzMl90IGExLCByMSwgZzEsIGIxOw0KKyAgQXJnYkRlY29kZShfYmVnaW5BcmdiLCBhMSwgcjEsIGcxLCBiMSk7DQorICBpbnQzMl90IGEyLCByMiwgZzIsIGIyOw0KKyAgQXJnYkRlY29kZShfZW5kQXJnYiwgYTIsIHIyLCBnMiwgYjIpOw0KKyAgRlhfRkxPQVQgZiA9IChGWF9GTE9BVCkoRlhfU0hBRElOR19TdGVwcyAtIDEpOw0KKyAgRlhfRkxPQVQgYVNjYWxlID0gKEZYX0ZMT0FUKSgxLjAgKiAoYTIgLSBhMSkgLyBmKTsNCisgIEZYX0ZMT0FUIHJTY2FsZSA9IChGWF9GTE9BVCkoMS4wICogKHIyIC0gcjEpIC8gZik7DQorICBGWF9GTE9BVCBnU2NhbGUgPSAoRlhfRkxPQVQpKDEuMCAqIChnMiAtIGcxKSAvIGYpOw0KKyAgRlhfRkxPQVQgYlNjYWxlID0gKEZYX0ZMT0FUKSgxLjAgKiAoYjIgLSBiMSkgLyBmKTsNCisgIGludDMyX3QgYTMsIHIzLCBnMywgYjM7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBGWF9TSEFESU5HX1N0ZXBzOyBpKyspIHsNCisgICAgYTMgPSAoaW50MzJfdCkoaSAqIGFTY2FsZSk7DQorICAgIHIzID0gKGludDMyX3QpKGkgKiByU2NhbGUpOw0KKyAgICBnMyA9IChpbnQzMl90KShpICogZ1NjYWxlKTsNCisgICAgYjMgPSAoaW50MzJfdCkoaSAqIGJTY2FsZSk7DQorICAgIF9hcmdiQXJyYXlbaV0gPQ0KKyAgICAgICAgRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKChhMSArIGEzKSwgKHIxICsgcjMpLCAoZzEgKyBnMyksIChiMSArIGIzKSkpOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQogfQ0KLWNsYXNzIENGWF9QYXVzZSA6IHB1YmxpYyBJRlhfUGF1c2UNCi17DQotcHVibGljOg0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJTmVlZFRvUGF1c2VOb3coKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KK2NsYXNzIENGWF9QYXVzZSA6IHB1YmxpYyBJRlhfUGF1c2Ugew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZYX0JPT0wgTmVlZFRvUGF1c2VOb3coKSB7IHJldHVybiBUUlVFOyB9DQogfTsNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X21ldGFmaWxlX2ludGVycHJldGVyLmNwcCBiL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfbWV0YWZpbGVfaW50ZXJwcmV0ZXIuY3BwCmluZGV4IDk5ZDM1MTkuLjQ1MWRmMDggMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfbWV0YWZpbGVfaW50ZXJwcmV0ZXIuY3BwCisrKyBiL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfbWV0YWZpbGVfaW50ZXJwcmV0ZXIuY3BwCkBAIC03LDI3NSArNywyNTEgQEAKICNpbmNsdWRlICJwcmUuaCINCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9meF9ncmFwaGljcy5oIg0KICNpbmNsdWRlICJmeF9tZXRhZmlsZV9pbnRlcnByZXRlci5oIg0KLUNGWF9NZXRhZmlsZUludGVycHJldGVyOjpDRlhfTWV0YWZpbGVJbnRlcnByZXRlcigpDQotew0KLSAgICBfZWxlbWVudCA9IE5VTEw7DQorQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OkNGWF9NZXRhZmlsZUludGVycHJldGVyKCkgew0KKyAgX2VsZW1lbnQgPSBOVUxMOw0KIH0NCi1DRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6fkNGWF9NZXRhZmlsZUludGVycHJldGVyKCkNCi17DQotICAgIF9lbGVtZW50ID0gTlVMTDsNCitDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6fkNGWF9NZXRhZmlsZUludGVycHJldGVyKCkgew0KKyAgX2VsZW1lbnQgPSBOVUxMOw0KIH0NCi1GWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpTZXRDdXJyZW50RWxlbWVudChDWE1MX0VsZW1lbnQgKiBlbGVtZW50KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGVsZW1lbnQsIEZBTFNFKTsNCi0gICAgX2VsZW1lbnQgPSBlbGVtZW50Ow0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpTZXRDdXJyZW50RWxlbWVudChDWE1MX0VsZW1lbnQqIGVsZW1lbnQpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChlbGVtZW50LCBGQUxTRSk7DQorICBfZWxlbWVudCA9IGVsZW1lbnQ7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRMaW5lQ2FwKGludDMyX3QgJiBsaW5lQ2FwKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIGxpbmVDYXBFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChsaW5lQ2FwRWxlbWVudCwgRkFMU0UpOw0KLSAgICBsaW5lQ2FwID0gbGluZUNhcEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAiKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRMaW5lQ2FwKGludDMyX3QmIGxpbmVDYXApIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgQ1hNTF9FbGVtZW50KiBsaW5lQ2FwRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGxpbmVDYXBFbGVtZW50LCBGQUxTRSk7DQorICBsaW5lQ2FwID0gbGluZUNhcEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAiKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldExpbmVEYXNoKEZYX0ZMT0FUICYJZGFzaFBoYXNlLA0KLSAgICAgICAgaW50MzJfdCAmCWRhc2hBcnJheSwNCi0gICAgICAgIGludDMyX3QgJglkYXNoQ291bnQpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogZGFzaFBoYXNlRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZGFzaFBoYXNlRWxlbWVudCwgRkFMU0UpOw0KLSAgICBkYXNoUGhhc2UgPSBkYXNoUGhhc2VFbGVtZW50LT5HZXRBdHRyRmxvYXQoIkZYX0ZMT0FUIik7DQotICAgIENYTUxfRWxlbWVudCAqIGRhc2hBcnJheUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgxKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGRhc2hBcnJheUVsZW1lbnQsIEZBTFNFKTsNCi0gICAgZGFzaEFycmF5ID0gZGFzaEFycmF5RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkZYX0ZMT0FUICoiKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogZGFzaENvdW50RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDIpOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZGFzaENvdW50RWxlbWVudCwgRkFMU0UpOw0KLSAgICBkYXNoQ291bnQgPSBkYXNoQ291bnRFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiaW50MzJfdCIpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldExpbmVEYXNoKEZYX0ZMT0FUJiBkYXNoUGhhc2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBkYXNoQXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBkYXNoQ291bnQpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgQ1hNTF9FbGVtZW50KiBkYXNoUGhhc2VFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZGFzaFBoYXNlRWxlbWVudCwgRkFMU0UpOw0KKyAgZGFzaFBoYXNlID0gZGFzaFBoYXNlRWxlbWVudC0+R2V0QXR0ckZsb2F0KCJGWF9GTE9BVCIpOw0KKyAgQ1hNTF9FbGVtZW50KiBkYXNoQXJyYXlFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMSk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZGFzaEFycmF5RWxlbWVudCwgRkFMU0UpOw0KKyAgZGFzaEFycmF5ID0gZGFzaEFycmF5RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkZYX0ZMT0FUICoiKTsNCisgIENYTUxfRWxlbWVudCogZGFzaENvdW50RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDIpOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGRhc2hDb3VudEVsZW1lbnQsIEZBTFNFKTsNCisgIGRhc2hDb3VudCA9IGRhc2hDb3VudEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJpbnQzMl90Iik7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRMaW5lRGFzaChpbnQzMl90ICYgZGFzaFN0eWxlKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIGRhc2hTdHlsZUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGRhc2hTdHlsZUVsZW1lbnQsIEZBTFNFKTsNCi0gICAgZGFzaFN0eWxlID0gZGFzaFN0eWxlRWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkZYX0Rhc2hTdHlsZSIpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldExpbmVEYXNoKGludDMyX3QmIGRhc2hTdHlsZSkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICBDWE1MX0VsZW1lbnQqIGRhc2hTdHlsZUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChkYXNoU3R5bGVFbGVtZW50LCBGQUxTRSk7DQorICBkYXNoU3R5bGUgPSBkYXNoU3R5bGVFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiRlhfRGFzaFN0eWxlIik7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRMaW5lSm9pbihpbnQzMl90ICYgbGluZUpvaW4pDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogbGluZUpvaW5FbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChsaW5lSm9pbkVsZW1lbnQsIEZBTFNFKTsNCi0gICAgbGluZUpvaW4gPSBsaW5lSm9pbkVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luIik7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0TGluZUpvaW4oaW50MzJfdCYgbGluZUpvaW4pIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgQ1hNTF9FbGVtZW50KiBsaW5lSm9pbkVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChsaW5lSm9pbkVsZW1lbnQsIEZBTFNFKTsNCisgIGxpbmVKb2luID0gbGluZUpvaW5FbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbiIpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0TWl0ZXJMaW1pdChGWF9GTE9BVCAmIG1pdGVyTGltaXQpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogbWl0ZXJMaW1pdEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1pdGVyTGltaXRFbGVtZW50LCBGQUxTRSk7DQotICAgIG1pdGVyTGltaXQgPSBtaXRlckxpbWl0RWxlbWVudC0+R2V0QXR0ckZsb2F0KCJGWF9GTE9BVCIpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldE1pdGVyTGltaXQoRlhfRkxPQVQmIG1pdGVyTGltaXQpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgQ1hNTF9FbGVtZW50KiBtaXRlckxpbWl0RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1pdGVyTGltaXRFbGVtZW50LCBGQUxTRSk7DQorICBtaXRlckxpbWl0ID0gbWl0ZXJMaW1pdEVsZW1lbnQtPkdldEF0dHJGbG9hdCgiRlhfRkxPQVQiKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldExpbmVXaWR0aChGWF9GTE9BVCAmIGxpbmVXaWR0aCwNCi0gICAgICAgIGludDMyX3QgJiBpc0FjdE9uRGFzaCkNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KLSAgICBDWE1MX0VsZW1lbnQgKiBsaW5lV2lkdGhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChsaW5lV2lkdGhFbGVtZW50LCBGQUxTRSk7DQotICAgIGxpbmVXaWR0aCA9IGxpbmVXaWR0aEVsZW1lbnQtPkdldEF0dHJGbG9hdCgiRlhfRkxPQVQiKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogaXNBY3RPbkRhc2hFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMSk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChpc0FjdE9uRGFzaEVsZW1lbnQsIEZBTFNFKTsNCi0gICAgaXNBY3RPbkRhc2ggPSBpc0FjdE9uRGFzaEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJGWF9CT09MIik7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0TGluZVdpZHRoKEZYX0ZMT0FUJiBsaW5lV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaXNBY3RPbkRhc2gpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgQ1hNTF9FbGVtZW50KiBsaW5lV2lkdGhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobGluZVdpZHRoRWxlbWVudCwgRkFMU0UpOw0KKyAgbGluZVdpZHRoID0gbGluZVdpZHRoRWxlbWVudC0+R2V0QXR0ckZsb2F0KCJGWF9GTE9BVCIpOw0KKyAgQ1hNTF9FbGVtZW50KiBpc0FjdE9uRGFzaEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgxKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChpc0FjdE9uRGFzaEVsZW1lbnQsIEZBTFNFKTsNCisgIGlzQWN0T25EYXNoID0gaXNBY3RPbkRhc2hFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiRlhfQk9PTCIpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0U3Ryb2tlQ29sb3IoaW50MzJfdCAmIGNvbG9yKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIGNvbG9yRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoY29sb3JFbGVtZW50LCBGQUxTRSk7DQotICAgIGNvbG9yID0gY29sb3JFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX0NvbG9yICoiKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRTdHJva2VDb2xvcihpbnQzMl90JiBjb2xvcikgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICBDWE1MX0VsZW1lbnQqIGNvbG9yRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGNvbG9yRWxlbWVudCwgRkFMU0UpOw0KKyAgY29sb3IgPSBjb2xvckVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfQ29sb3IgKiIpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0RmlsbENvbG9yKGludDMyX3QgJiBjb2xvcikNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KLSAgICBDWE1MX0VsZW1lbnQgKiBjb2xvckVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGNvbG9yRWxlbWVudCwgRkFMU0UpOw0KLSAgICBjb2xvciA9IGNvbG9yRWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9Db2xvciAqIik7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0RmlsbENvbG9yKGludDMyX3QmIGNvbG9yKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgIENYTUxfRWxlbWVudCogY29sb3JFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoY29sb3JFbGVtZW50LCBGQUxTRSk7DQorICBjb2xvciA9IGNvbG9yRWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9Db2xvciAqIik7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TdHJva2VQYXRoKGludDMyX3QgJiBwYXRoLCBpbnQzMl90ICYgbWF0cml4KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIHBhdGhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwYXRoRWxlbWVudCwgRkFMU0UpOw0KLSAgICBwYXRoID0gcGF0aEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfUGF0aCAqIik7DQotICAgIENYTUxfRWxlbWVudCAqIG1hdHJpeEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgxKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCi0gICAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1N0cm9rZVBhdGgoaW50MzJfdCYgcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbWF0cml4KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgIENYTUxfRWxlbWVudCogcGF0aEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwYXRoRWxlbWVudCwgRkFMU0UpOw0KKyAgcGF0aCA9IHBhdGhFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX1BhdGggKiIpOw0KKyAgQ1hNTF9FbGVtZW50KiBtYXRyaXhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMSk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobWF0cml4RWxlbWVudCwgRkFMU0UpOw0KKyAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfRmlsbFBhdGgoaW50MzJfdCAmIHBhdGgsDQotICAgICAgICBpbnQzMl90ICYgZmlsbE1vZGUsDQotICAgICAgICBpbnQzMl90ICYgbWF0cml4KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIHBhdGhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwYXRoRWxlbWVudCwgRkFMU0UpOw0KLSAgICBwYXRoID0gcGF0aEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfUGF0aCAqIik7DQotICAgIENYTUxfRWxlbWVudCAqIGZpbGxNb2RlRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDEpOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZmlsbE1vZGVFbGVtZW50LCBGQUxTRSk7DQotICAgIGZpbGxNb2RlID0gZmlsbE1vZGVFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiRlhfRmlsbE1vZGUiKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogbWF0cml4RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDIpOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobWF0cml4RWxlbWVudCwgRkFMU0UpOw0KLSAgICBtYXRyaXggPSBtYXRyaXhFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX01hdHJpeCAqIik7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfRmlsbFBhdGgoaW50MzJfdCYgcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGZpbGxNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbWF0cml4KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgIENYTUxfRWxlbWVudCogcGF0aEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwYXRoRWxlbWVudCwgRkFMU0UpOw0KKyAgcGF0aCA9IHBhdGhFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX1BhdGggKiIpOw0KKyAgQ1hNTF9FbGVtZW50KiBmaWxsTW9kZUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgxKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChmaWxsTW9kZUVsZW1lbnQsIEZBTFNFKTsNCisgIGZpbGxNb2RlID0gZmlsbE1vZGVFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiRlhfRmlsbE1vZGUiKTsNCisgIENYTUxfRWxlbWVudCogbWF0cml4RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDIpOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCisgIG1hdHJpeCA9IG1hdHJpeEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfTWF0cml4ICoiKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX0NsaXBQYXRoKGludDMyX3QgJiBwYXRoLA0KLSAgICAgICAgaW50MzJfdCAmIGZpbGxNb2RlLA0KLSAgICAgICAgaW50MzJfdCAmIG1hdHJpeCkNCi17DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KLSAgICBDWE1MX0VsZW1lbnQgKiBwYXRoRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGF0aEVsZW1lbnQsIEZBTFNFKTsNCi0gICAgcGF0aCA9IHBhdGhFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX1BhdGggKiIpOw0KLSAgICBDWE1MX0VsZW1lbnQgKiBmaWxsTW9kZUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgxKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGZpbGxNb2RlRWxlbWVudCwgRkFMU0UpOw0KLSAgICBmaWxsTW9kZSA9IGZpbGxNb2RlRWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkZYX0ZpbGxNb2RlIik7DQotICAgIENYTUxfRWxlbWVudCAqIG1hdHJpeEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgyKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCi0gICAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX0NsaXBQYXRoKGludDMyX3QmIHBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBmaWxsTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICBDWE1MX0VsZW1lbnQqIHBhdGhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGF0aEVsZW1lbnQsIEZBTFNFKTsNCisgIHBhdGggPSBwYXRoRWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9QYXRoICoiKTsNCisgIENYTUxfRWxlbWVudCogZmlsbE1vZGVFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMSk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZmlsbE1vZGVFbGVtZW50LCBGQUxTRSk7DQorICBmaWxsTW9kZSA9IGZpbGxNb2RlRWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkZYX0ZpbGxNb2RlIik7DQorICBDWE1MX0VsZW1lbnQqIG1hdHJpeEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgyKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtYXRyaXhFbGVtZW50LCBGQUxTRSk7DQorICBtYXRyaXggPSBtYXRyaXhFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX01hdHJpeCAqIik7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9EcmF3SW1hZ2UoaW50MzJfdCAmIHNvdXJjZSwNCi0gICAgICAgIGludDMyX3QgJiBwb2ludCwNCi0gICAgICAgIGludDMyX3QgJiBtYXRyaXgpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogc291cmNlRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoc291cmNlRWxlbWVudCwgRkFMU0UpOw0KLSAgICBzb3VyY2UgPSBzb3VyY2VFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX0RJQlNvdXJjZSAqIik7DQotICAgIENYTUxfRWxlbWVudCAqIHBvaW50RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDEpOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocG9pbnRFbGVtZW50LCBGQUxTRSk7DQotICAgIHBvaW50ID0gcG9pbnRFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX1BvaW50RiAqIik7DQotICAgIENYTUxfRWxlbWVudCAqIG1hdHJpeEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgyKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCi0gICAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX0RyYXdJbWFnZShpbnQzMl90JiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgcG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbWF0cml4KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgIENYTUxfRWxlbWVudCogc291cmNlRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNvdXJjZUVsZW1lbnQsIEZBTFNFKTsNCisgIHNvdXJjZSA9IHNvdXJjZUVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfRElCU291cmNlICoiKTsNCisgIENYTUxfRWxlbWVudCogcG9pbnRFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMSk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocG9pbnRFbGVtZW50LCBGQUxTRSk7DQorICBwb2ludCA9IHBvaW50RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9Qb2ludEYgKiIpOw0KKyAgQ1hNTF9FbGVtZW50KiBtYXRyaXhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMik7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobWF0cml4RWxlbWVudCwgRkFMU0UpOw0KKyAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU3RyZXRjaEltYWdlKGludDMyX3QgJiBzb3VyY2UsDQotICAgICAgICBpbnQzMl90ICYgcmVjdCwNCi0gICAgICAgIGludDMyX3QgJiBtYXRyaXgpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogc291cmNlRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoc291cmNlRWxlbWVudCwgRkFMU0UpOw0KLSAgICBzb3VyY2UgPSBzb3VyY2VFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX0RJQlNvdXJjZSAqIik7DQotICAgIENYTUxfRWxlbWVudCAqIHJlY3RFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMSk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZWN0RWxlbWVudCwgRkFMU0UpOw0KLSAgICByZWN0ID0gcmVjdEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfUmVjdEYgKiIpOw0KLSAgICBDWE1MX0VsZW1lbnQgKiBtYXRyaXhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMik7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChtYXRyaXhFbGVtZW50LCBGQUxTRSk7DQotICAgIG1hdHJpeCA9IG1hdHJpeEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfTWF0cml4ICoiKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TdHJldGNoSW1hZ2UoaW50MzJfdCYgc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbWF0cml4KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgIENYTUxfRWxlbWVudCogc291cmNlRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNvdXJjZUVsZW1lbnQsIEZBTFNFKTsNCisgIHNvdXJjZSA9IHNvdXJjZUVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfRElCU291cmNlICoiKTsNCisgIENYTUxfRWxlbWVudCogcmVjdEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgxKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZWN0RWxlbWVudCwgRkFMU0UpOw0KKyAgcmVjdCA9IHJlY3RFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX1JlY3RGICoiKTsNCisgIENYTUxfRWxlbWVudCogbWF0cml4RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDIpOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCisgIG1hdHJpeCA9IG1hdHJpeEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfTWF0cml4ICoiKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX0NvbmNhdE1hdHJpeChpbnQzMl90ICYgbWF0cml4KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIG1hdHJpeEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCi0gICAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX0NvbmNhdE1hdHJpeChpbnQzMl90JiBtYXRyaXgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgQ1hNTF9FbGVtZW50KiBtYXRyaXhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobWF0cml4RWxlbWVudCwgRkFMU0UpOw0KKyAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0Q2xpcFJlY3QoaW50MzJfdCAmIHJlY3QpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogcmVjdEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlY3RFbGVtZW50LCBGQUxTRSk7DQotICAgIHJlY3QgPSByZWN0RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9SZWN0RiAqIik7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0Q2xpcFJlY3QoaW50MzJfdCYgcmVjdCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICBDWE1MX0VsZW1lbnQqIHJlY3RFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVjdEVsZW1lbnQsIEZBTFNFKTsNCisgIHJlY3QgPSByZWN0RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9SZWN0RiAqIik7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRGb250KGludDMyX3QgJiBmb250KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIGZvbnRFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChmb250RWxlbWVudCwgRkFMU0UpOw0KLSAgICBmb250ID0gZm9udEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfRm9udCAqIik7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0Rm9udChpbnQzMl90JiBmb250KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgIENYTUxfRWxlbWVudCogZm9udEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChmb250RWxlbWVudCwgRkFMU0UpOw0KKyAgZm9udCA9IGZvbnRFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX0ZvbnQgKiIpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0Rm9udFNpemUoRlhfRkxPQVQgJiBzaXplKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIHNpemVFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChzaXplRWxlbWVudCwgRkFMU0UpOw0KLSAgICBzaXplID0gc2l6ZUVsZW1lbnQtPkdldEF0dHJGbG9hdCgiRlhfRkxPQVQiKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRGb250U2l6ZShGWF9GTE9BVCYgc2l6ZSkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICBDWE1MX0VsZW1lbnQqIHNpemVFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoc2l6ZUVsZW1lbnQsIEZBTFNFKTsNCisgIHNpemUgPSBzaXplRWxlbWVudC0+R2V0QXR0ckZsb2F0KCJGWF9GTE9BVCIpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0Rm9udEhTY2FsZShGWF9GTE9BVCAmIHNjYWxlKQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIHNjYWxlRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoc2NhbGVFbGVtZW50LCBGQUxTRSk7DQotICAgIHNjYWxlID0gc2NhbGVFbGVtZW50LT5HZXRBdHRyRmxvYXQoIkZYX0ZMT0FUIik7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfU2V0Rm9udEhTY2FsZShGWF9GTE9BVCYgc2NhbGUpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgQ1hNTF9FbGVtZW50KiBzY2FsZUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChzY2FsZUVsZW1lbnQsIEZBTFNFKTsNCisgIHNjYWxlID0gc2NhbGVFbGVtZW50LT5HZXRBdHRyRmxvYXQoIkZYX0ZMT0FUIik7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRDaGFyU3BhY2luZyhGWF9GTE9BVCAmIHNwYWNpbmcpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogc3BhY2luZ0VsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNwYWNpbmdFbGVtZW50LCBGQUxTRSk7DQotICAgIHNwYWNpbmcgPSBzcGFjaW5nRWxlbWVudC0+R2V0QXR0ckZsb2F0KCJGWF9GTE9BVCIpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldENoYXJTcGFjaW5nKEZYX0ZMT0FUJiBzcGFjaW5nKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCisgIENYTUxfRWxlbWVudCogc3BhY2luZ0VsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChzcGFjaW5nRWxlbWVudCwgRkFMU0UpOw0KKyAgc3BhY2luZyA9IHNwYWNpbmdFbGVtZW50LT5HZXRBdHRyRmxvYXQoIkZYX0ZMT0FUIik7DQorICByZXR1cm4gVFJVRTsNCiB9DQotRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRUZXh0RHJhd2luZ01vZGUoaW50MzJfdCAmIG1vZGUpDQotew0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2VsZW1lbnQsIEZBTFNFKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogbW9kZUVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1vZGVFbGVtZW50LCBGQUxTRSk7DQotICAgIG1vZGUgPSBtb2RlRWxlbWVudC0+R2V0QXR0ckludGVnZXIoImludDMyX3QiKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcjo6UGFyYW1PZl9TZXRUZXh0RHJhd2luZ01vZGUoaW50MzJfdCYgbW9kZSkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICBDWE1MX0VsZW1lbnQqIG1vZGVFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMCk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobW9kZUVsZW1lbnQsIEZBTFNFKTsNCisgIG1vZGUgPSBtb2RlRWxlbWVudC0+R2V0QXR0ckludGVnZXIoImludDMyX3QiKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldFRleHQoaW50MzJfdCAmCXBvaW50LA0KLSAgICAgICAgaW50MzJfdCAmCXRleHQsDQotICAgICAgICBpbnQzMl90ICYJbWF0cml4KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIHBvaW50RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocG9pbnRFbGVtZW50LCBGQUxTRSk7DQotICAgIHBvaW50ID0gcG9pbnRFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX1BvaW50RiAqIik7DQotICAgIENYTUxfRWxlbWVudCAqIHRleHRFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMSk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTCh0ZXh0RWxlbWVudCwgRkFMU0UpOw0KLSAgICB0ZXh0ID0gdGV4dEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfV2lkZVN0cmluZyAqIik7DQotICAgIENYTUxfRWxlbWVudCAqIG1hdHJpeEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgyKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCi0gICAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1NldFRleHQoaW50MzJfdCYgcG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICBDWE1MX0VsZW1lbnQqIHBvaW50RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHBvaW50RWxlbWVudCwgRkFMU0UpOw0KKyAgcG9pbnQgPSBwb2ludEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfUG9pbnRGICoiKTsNCisgIENYTUxfRWxlbWVudCogdGV4dEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgxKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTCh0ZXh0RWxlbWVudCwgRkFMU0UpOw0KKyAgdGV4dCA9IHRleHRFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX1dpZGVTdHJpbmcgKiIpOw0KKyAgQ1hNTF9FbGVtZW50KiBtYXRyaXhFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMik7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobWF0cml4RWxlbWVudCwgRkFMU0UpOw0KKyAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KKyAgcmV0dXJuIFRSVUU7DQogfQ0KLUZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfVHJhbnNmZXIoaW50MzJfdCAmIGdyYXBoaWNzLCBpbnQzMl90ICYgbWF0cml4KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIGdyYXBoaWNzRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZ3JhcGhpY3NFbGVtZW50LCBGQUxTRSk7DQotICAgIGdyYXBoaWNzID0gZ3JhcGhpY3NFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX0dyYXBoaWNzICoiKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogbWF0cml4RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDEpOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwobWF0cml4RWxlbWVudCwgRkFMU0UpOw0KLSAgICBtYXRyaXggPSBtYXRyaXhFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX01hdHJpeCAqIik7DQotICAgIHJldHVybiBUUlVFOw0KK0ZYX0JPT0wgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXI6OlBhcmFtT2ZfVHJhbnNmZXIoaW50MzJfdCYgZ3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBtYXRyaXgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZWxlbWVudCwgRkFMU0UpOw0KKyAgQ1hNTF9FbGVtZW50KiBncmFwaGljc0VsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgwKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChncmFwaGljc0VsZW1lbnQsIEZBTFNFKTsNCisgIGdyYXBoaWNzID0gZ3JhcGhpY3NFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX0dyYXBoaWNzICoiKTsNCisgIENYTUxfRWxlbWVudCogbWF0cml4RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDEpOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCisgIG1hdHJpeCA9IG1hdHJpeEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfTWF0cml4ICoiKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1RyYW5zZmVyKGludDMyX3QgJiBncmFwaGljcywNCi0gICAgICAgIEZYX0ZMT0FUICYgc3JjTGVmdCwNCi0gICAgICAgIEZYX0ZMT0FUICYgc3JjVG9wLA0KLSAgICAgICAgaW50MzJfdCAmIGRzdFJlY3QsDQotICAgICAgICBpbnQzMl90ICYgbWF0cml4KQ0KLXsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQotICAgIENYTUxfRWxlbWVudCAqIGdyYXBoaWNzRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KLSAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZ3JhcGhpY3NFbGVtZW50LCBGQUxTRSk7DQotICAgIGdyYXBoaWNzID0gZ3JhcGhpY3NFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX0dyYXBoaWNzICoiKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogc3JjTGVmdEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgyKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNyY0xlZnRFbGVtZW50LCBGQUxTRSk7DQotICAgIHNyY0xlZnQgPSBzcmNMZWZ0RWxlbWVudC0+R2V0QXR0ckZsb2F0KCJGWF9GTE9BVCIpOw0KLSAgICBDWE1MX0VsZW1lbnQgKiBzcmNUb3BFbGVtZW50ID0gX2VsZW1lbnQtPkdldEVsZW1lbnQoMyk7DQotICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChzcmNUb3BFbGVtZW50LCBGQUxTRSk7DQotICAgIHNyY1RvcCA9IHNyY1RvcEVsZW1lbnQtPkdldEF0dHJGbG9hdCgiRlhfRkxPQVQiKTsNCi0gICAgQ1hNTF9FbGVtZW50ICogZHN0UmVjdEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgxKTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGRzdFJlY3RFbGVtZW50LCBGQUxTRSk7DQotICAgIGRzdFJlY3QgPSBkc3RSZWN0RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9SZWN0RiAqIik7DQotICAgIENYTUxfRWxlbWVudCAqIG1hdHJpeEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCg0KTsNCi0gICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCi0gICAgbWF0cml4ID0gbWF0cml4RWxlbWVudC0+R2V0QXR0ckludGVnZXIoIkNGWF9NYXRyaXggKiIpOw0KLSAgICByZXR1cm4gVFJVRTsNCitGWF9CT09MIENGWF9NZXRhZmlsZUludGVycHJldGVyOjpQYXJhbU9mX1RyYW5zZmVyKGludDMyX3QmIGdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHNyY0xlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgc3JjVG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZHN0UmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9lbGVtZW50LCBGQUxTRSk7DQorICBDWE1MX0VsZW1lbnQqIGdyYXBoaWNzRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDApOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGdyYXBoaWNzRWxlbWVudCwgRkFMU0UpOw0KKyAgZ3JhcGhpY3MgPSBncmFwaGljc0VsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfR3JhcGhpY3MgKiIpOw0KKyAgQ1hNTF9FbGVtZW50KiBzcmNMZWZ0RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDIpOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNyY0xlZnRFbGVtZW50LCBGQUxTRSk7DQorICBzcmNMZWZ0ID0gc3JjTGVmdEVsZW1lbnQtPkdldEF0dHJGbG9hdCgiRlhfRkxPQVQiKTsNCisgIENYTUxfRWxlbWVudCogc3JjVG9wRWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDMpOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNyY1RvcEVsZW1lbnQsIEZBTFNFKTsNCisgIHNyY1RvcCA9IHNyY1RvcEVsZW1lbnQtPkdldEF0dHJGbG9hdCgiRlhfRkxPQVQiKTsNCisgIENYTUxfRWxlbWVudCogZHN0UmVjdEVsZW1lbnQgPSBfZWxlbWVudC0+R2V0RWxlbWVudCgxKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChkc3RSZWN0RWxlbWVudCwgRkFMU0UpOw0KKyAgZHN0UmVjdCA9IGRzdFJlY3RFbGVtZW50LT5HZXRBdHRySW50ZWdlcigiQ0ZYX1JlY3RGICoiKTsNCisgIENYTUxfRWxlbWVudCogbWF0cml4RWxlbWVudCA9IF9lbGVtZW50LT5HZXRFbGVtZW50KDQpOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeEVsZW1lbnQsIEZBTFNFKTsNCisgIG1hdHJpeCA9IG1hdHJpeEVsZW1lbnQtPkdldEF0dHJJbnRlZ2VyKCJDRlhfTWF0cml4ICoiKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X21ldGFmaWxlX2ludGVycHJldGVyLmggYi94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X21ldGFmaWxlX2ludGVycHJldGVyLmgKaW5kZXggZjI4YWE2Ni4uNzEzY2YwYyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9tZXRhZmlsZV9pbnRlcnByZXRlci5oCisrKyBiL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfbWV0YWZpbGVfaW50ZXJwcmV0ZXIuaApAQCAtNiw0OSArNiw0OCBAQAogDQogI2lmbmRlZiBfX0hfRlhfTUVUQUZJTEVfSU5URVJQUkVURVJfXw0KICNkZWZpbmUgX19IX0ZYX01FVEFGSUxFX0lOVEVSUFJFVEVSX18NCi1jbGFzcyBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcg0KLXsNCi1wdWJsaWM6DQotICAgIENGWF9NZXRhZmlsZUludGVycHJldGVyKCk7DQotICAgIHZpcnR1YWwgfkNGWF9NZXRhZmlsZUludGVycHJldGVyKCk7DQorY2xhc3MgQ0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXIgew0KKyBwdWJsaWM6DQorICBDRlhfTWV0YWZpbGVJbnRlcnByZXRlcigpOw0KKyAgdmlydHVhbCB+Q0ZYX01ldGFmaWxlSW50ZXJwcmV0ZXIoKTsNCiANCi0gICAgRlhfQk9PTCBTZXRDdXJyZW50RWxlbWVudChDWE1MX0VsZW1lbnQgKiBlbGVtZW50KTsNCisgIEZYX0JPT0wgU2V0Q3VycmVudEVsZW1lbnQoQ1hNTF9FbGVtZW50KiBlbGVtZW50KTsNCiANCi0gICAgRlhfQk9PTCBQYXJhbU9mX1NldExpbmVDYXAoaW50MzJfdCAmIGxpbmVDYXApOw0KLSAgICBGWF9CT09MIFBhcmFtT2ZfU2V0TGluZURhc2goRlhfRkxPQVQgJiBkYXNoUGhhc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICYgZGFzaEFycmF5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmIGRhc2hDb3VudCk7DQotICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRMaW5lRGFzaChpbnQzMl90ICYgZGFzaFN0eWxlKTsNCi0gICAgRlhfQk9PTCBQYXJhbU9mX1NldExpbmVKb2luKGludDMyX3QgJiBsaW5lSm9pbik7DQotICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRNaXRlckxpbWl0KEZYX0ZMT0FUICYgbWl0ZXJMaW1pdCk7DQotICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRMaW5lV2lkdGgoRlhfRkxPQVQgJiBsaW5lV2lkdGgsIGludDMyX3QgJiBpc0FjdE9uRGFzaCk7DQorICBGWF9CT09MIFBhcmFtT2ZfU2V0TGluZUNhcChpbnQzMl90JiBsaW5lQ2FwKTsNCisgIEZYX0JPT0wgUGFyYW1PZl9TZXRMaW5lRGFzaChGWF9GTE9BVCYgZGFzaFBoYXNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGRhc2hBcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBkYXNoQ291bnQpOw0KKyAgRlhfQk9PTCBQYXJhbU9mX1NldExpbmVEYXNoKGludDMyX3QmIGRhc2hTdHlsZSk7DQorICBGWF9CT09MIFBhcmFtT2ZfU2V0TGluZUpvaW4oaW50MzJfdCYgbGluZUpvaW4pOw0KKyAgRlhfQk9PTCBQYXJhbU9mX1NldE1pdGVyTGltaXQoRlhfRkxPQVQmIG1pdGVyTGltaXQpOw0KKyAgRlhfQk9PTCBQYXJhbU9mX1NldExpbmVXaWR0aChGWF9GTE9BVCYgbGluZVdpZHRoLCBpbnQzMl90JiBpc0FjdE9uRGFzaCk7DQogDQotICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRTdHJva2VDb2xvcihpbnQzMl90ICYgY29sb3IpOw0KLSAgICBGWF9CT09MIFBhcmFtT2ZfU2V0RmlsbENvbG9yKGludDMyX3QgJiBjb2xvcik7DQorICBGWF9CT09MIFBhcmFtT2ZfU2V0U3Ryb2tlQ29sb3IoaW50MzJfdCYgY29sb3IpOw0KKyAgRlhfQk9PTCBQYXJhbU9mX1NldEZpbGxDb2xvcihpbnQzMl90JiBjb2xvcik7DQogDQotICAgIEZYX0JPT0wgUGFyYW1PZl9TdHJva2VQYXRoKGludDMyX3QgJiBwYXRoLCBpbnQzMl90ICYgbWF0cml4KTsNCi0gICAgRlhfQk9PTCBQYXJhbU9mX0ZpbGxQYXRoKGludDMyX3QgJiBwYXRoLCBpbnQzMl90ICYgZmlsbE1vZGUsIGludDMyX3QgJiBtYXRyaXgpOw0KLSAgICBGWF9CT09MIFBhcmFtT2ZfQ2xpcFBhdGgoaW50MzJfdCAmIHBhdGgsIGludDMyX3QgJiBmaWxsTW9kZSwgaW50MzJfdCAmIG1hdHJpeCk7DQorICBGWF9CT09MIFBhcmFtT2ZfU3Ryb2tlUGF0aChpbnQzMl90JiBwYXRoLCBpbnQzMl90JiBtYXRyaXgpOw0KKyAgRlhfQk9PTCBQYXJhbU9mX0ZpbGxQYXRoKGludDMyX3QmIHBhdGgsIGludDMyX3QmIGZpbGxNb2RlLCBpbnQzMl90JiBtYXRyaXgpOw0KKyAgRlhfQk9PTCBQYXJhbU9mX0NsaXBQYXRoKGludDMyX3QmIHBhdGgsIGludDMyX3QmIGZpbGxNb2RlLCBpbnQzMl90JiBtYXRyaXgpOw0KIA0KLSAgICBGWF9CT09MIFBhcmFtT2ZfRHJhd0ltYWdlKGludDMyX3QgJiBzb3VyY2UsIGludDMyX3QgJiBwb2ludCwgaW50MzJfdCAmIG1hdHJpeCk7DQotICAgIEZYX0JPT0wgUGFyYW1PZl9TdHJldGNoSW1hZ2UoaW50MzJfdCAmIHNvdXJjZSwgaW50MzJfdCAmIHJlY3QsIGludDMyX3QgJiBtYXRyaXgpOw0KKyAgRlhfQk9PTCBQYXJhbU9mX0RyYXdJbWFnZShpbnQzMl90JiBzb3VyY2UsIGludDMyX3QmIHBvaW50LCBpbnQzMl90JiBtYXRyaXgpOw0KKyAgRlhfQk9PTCBQYXJhbU9mX1N0cmV0Y2hJbWFnZShpbnQzMl90JiBzb3VyY2UsIGludDMyX3QmIHJlY3QsIGludDMyX3QmIG1hdHJpeCk7DQogDQotICAgIEZYX0JPT0wgUGFyYW1PZl9Db25jYXRNYXRyaXgoaW50MzJfdCAmIG1hdHJpeCk7DQotICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRDbGlwUmVjdChpbnQzMl90ICYgcmVjdCk7DQotICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRGb250KGludDMyX3QgJiBmb250KTsNCi0gICAgRlhfQk9PTCBQYXJhbU9mX1NldEZvbnRTaXplKEZYX0ZMT0FUICYgc2l6ZSk7DQotICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRGb250SFNjYWxlKEZYX0ZMT0FUICYgc2NhbGUpOw0KLSAgICBGWF9CT09MIFBhcmFtT2ZfU2V0Q2hhclNwYWNpbmcoRlhfRkxPQVQgJiBzcGFjaW5nKTsNCi0gICAgRlhfQk9PTCBQYXJhbU9mX1NldFRleHREcmF3aW5nTW9kZShpbnQzMl90ICYgbW9kZSk7DQotICAgIEZYX0JPT0wgUGFyYW1PZl9TZXRUZXh0KGludDMyX3QgJiBwb2ludCwgaW50MzJfdCAmIHRleHQsIGludDMyX3QgJiBtYXRyaXgpOw0KLSAgICBGWF9CT09MIFBhcmFtT2ZfVHJhbnNmZXIoaW50MzJfdCAmIGdyYXBoaWNzLCBpbnQzMl90ICYgbWF0cml4KTsNCi0gICAgRlhfQk9PTCBQYXJhbU9mX1RyYW5zZmVyKGludDMyX3QgJglncmFwaGljcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUICYJc3JjTGVmdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUICYJc3JjVG9wLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmCWRzdFJlY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICYJbWF0cml4KTsNCisgIEZYX0JPT0wgUGFyYW1PZl9Db25jYXRNYXRyaXgoaW50MzJfdCYgbWF0cml4KTsNCisgIEZYX0JPT0wgUGFyYW1PZl9TZXRDbGlwUmVjdChpbnQzMl90JiByZWN0KTsNCisgIEZYX0JPT0wgUGFyYW1PZl9TZXRGb250KGludDMyX3QmIGZvbnQpOw0KKyAgRlhfQk9PTCBQYXJhbU9mX1NldEZvbnRTaXplKEZYX0ZMT0FUJiBzaXplKTsNCisgIEZYX0JPT0wgUGFyYW1PZl9TZXRGb250SFNjYWxlKEZYX0ZMT0FUJiBzY2FsZSk7DQorICBGWF9CT09MIFBhcmFtT2ZfU2V0Q2hhclNwYWNpbmcoRlhfRkxPQVQmIHNwYWNpbmcpOw0KKyAgRlhfQk9PTCBQYXJhbU9mX1NldFRleHREcmF3aW5nTW9kZShpbnQzMl90JiBtb2RlKTsNCisgIEZYX0JPT0wgUGFyYW1PZl9TZXRUZXh0KGludDMyX3QmIHBvaW50LCBpbnQzMl90JiB0ZXh0LCBpbnQzMl90JiBtYXRyaXgpOw0KKyAgRlhfQk9PTCBQYXJhbU9mX1RyYW5zZmVyKGludDMyX3QmIGdyYXBoaWNzLCBpbnQzMl90JiBtYXRyaXgpOw0KKyAgRlhfQk9PTCBQYXJhbU9mX1RyYW5zZmVyKGludDMyX3QmIGdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBzcmNMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBzcmNUb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZHN0UmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBtYXRyaXgpOw0KIA0KLXByaXZhdGU6DQotICAgIENYTUxfRWxlbWVudCAqCV9lbGVtZW50Ow0KKyBwcml2YXRlOg0KKyAgQ1hNTF9FbGVtZW50KiBfZWxlbWVudDsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfcGF0aF9nZW5lcmF0b3IuY3BwIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9wYXRoX2dlbmVyYXRvci5jcHAKaW5kZXggZGE5ZDNkZi4uMzEwN2ZlYiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9wYXRoX2dlbmVyYXRvci5jcHAKKysrIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9wYXRoX2dlbmVyYXRvci5jcHAKQEAgLTYsODkgKzYsOTUgQEAKIA0KICNpbmNsdWRlICJwcmUuaCINCiAjaW5jbHVkZSAiZnhfcGF0aF9nZW5lcmF0b3IuaCINCi1DRlhfUGF0aEdlbmVyYXRvcjo6Q0ZYX1BhdGhHZW5lcmF0b3IoKQ0KLXsNCitDRlhfUGF0aEdlbmVyYXRvcjo6Q0ZYX1BhdGhHZW5lcmF0b3IoKSB7DQorICBtX3BQYXRoRGF0YSA9IE5VTEw7DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkNyZWF0ZSgpIHsNCisgIG1fcFBhdGhEYXRhID0gRlhfTkVXIENGWF9QYXRoRGF0YTsNCit9DQorQ0ZYX1BhdGhHZW5lcmF0b3I6On5DRlhfUGF0aEdlbmVyYXRvcigpIHsNCisgIGlmIChtX3BQYXRoRGF0YSkgew0KKyAgICBkZWxldGUgbV9wUGF0aERhdGE7DQogICAgIG1fcFBhdGhEYXRhID0gTlVMTDsNCisgIH0NCiB9DQotdm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6Q3JlYXRlKCkNCi17DQotICAgIG1fcFBhdGhEYXRhID0gRlhfTkVXIENGWF9QYXRoRGF0YTsNCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpBZGRQYXRoRGF0YShDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSkgew0KKyAgaWYgKHBQYXRoRGF0YSAmJiBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA+IDApIHsNCisgICAgaW50IG5Db3VudCA9IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOw0KKyAgICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50cygpOw0KKyAgICBBZGRQYXRoRGF0YShwUG9pbnRzLCBuQ291bnQpOw0KKyAgfQ0KIH0NCi1DRlhfUGF0aEdlbmVyYXRvcjo6fkNGWF9QYXRoR2VuZXJhdG9yKCkNCi17DQotICAgIGlmICggbV9wUGF0aERhdGEpIHsNCi0gICAgICAgIGRlbGV0ZSBtX3BQYXRoRGF0YTsNCi0gICAgICAgIG1fcFBhdGhEYXRhID0gTlVMTDsNCi0gICAgfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZFBhdGhEYXRhKEZYX1BBVEhQT0lOVCogcFBvaW50cywgaW50IG5Db3VudCkgew0KKyAgaWYgKHBQb2ludHMgJiYgbkNvdW50ID4gMCkgew0KKyAgICBpbnQgbk9sZENvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCisgICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQobkNvdW50KTsNCisgICAgRlhfUEFUSFBPSU5UKiBwRHN0UG9pbnRzID0gbV9wUGF0aERhdGEtPkdldFBvaW50cygpOw0KKyAgICBGWFNZU19tZW1jcHkocERzdFBvaW50cyArIG5PbGRDb3VudCwgcFBvaW50cywNCisgICAgICAgICAgICAgICAgIHNpemVvZihGWF9QQVRIUE9JTlQpICogbkNvdW50KTsNCisgIH0NCiB9DQotdm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QWRkUGF0aERhdGEoQ0ZYX1BhdGhEYXRhICpwUGF0aERhdGEpDQotew0KLSAgICBpZiAocFBhdGhEYXRhICYmIHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID4gMCkgew0KLSAgICAgICAgaW50IG5Db3VudCA9IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOw0KLSAgICAgICAgRlhfUEFUSFBPSU5UICpwUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsNCi0gICAgICAgIEFkZFBhdGhEYXRhKHBQb2ludHMsIG5Db3VudCk7DQotICAgIH0NCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpNb3ZlVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgew0KKyAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoMSk7DQorICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQobV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSAtIDEsIHgsIHksIEZYUFRfTU9WRVRPKTsNCiB9DQotdm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QWRkUGF0aERhdGEoRlhfUEFUSFBPSU5UICpwUG9pbnRzLCBpbnQgbkNvdW50KQ0KLXsNCi0gICAgaWYgKHBQb2ludHMgJiYgbkNvdW50ID4gMCkgew0KLSAgICAgICAgaW50IG5PbGRDb3VudCA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7DQotICAgICAgICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudChuQ291bnQpOw0KLSAgICAgICAgRlhfUEFUSFBPSU5UICpwRHN0UG9pbnRzID0gbV9wUGF0aERhdGEtPkdldFBvaW50cygpOw0KLSAgICAgICAgRlhTWVNfbWVtY3B5KHBEc3RQb2ludHMgKyBuT2xkQ291bnQsIHBQb2ludHMsIHNpemVvZihGWF9QQVRIUE9JTlQpICogbkNvdW50KTsNCi0gICAgfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkxpbmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSB7DQorICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCgxKTsNCisgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpIC0gMSwgeCwgeSwgRlhQVF9MSU5FVE8pOw0KIH0NCi12b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpNb3ZlVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkNCi17DQotICAgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDEpOw0KLSAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQobV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSAtIDEsIHgsIHksIEZYUFRfTU9WRVRPKTsNCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpCZXppZXJUbyhGWF9GTE9BVCBjdHJsX3gxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxfeTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF94MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3kyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvX3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9feSkgew0KKyAgaW50IG9sZF9jb3VudCA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7DQorICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCgzKTsNCisgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQsIGN0cmxfeDEsIGN0cmxfeTEsIEZYUFRfQkVaSUVSVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsIGN0cmxfeDIsIGN0cmxfeTIsIEZYUFRfQkVaSUVSVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDIsIHRvX3gsIHRvX3ksIEZYUFRfQkVaSUVSVE8pOw0KIH0NCi12b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpMaW5lVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkNCi17DQotICAgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDEpOw0KLSAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQobV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSAtIDEsIHgsIHksIEZYUFRfTElORVRPKTsNCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpDbG9zZSgpIHsNCisgIGlmIChtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID4gMCkgew0KKyAgICBpbnQgaW5kZXggPSBtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpIC0gMTsNCisgICAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gbV9wUGF0aERhdGEtPkdldFBvaW50cygpOw0KKyAgICBwUG9pbnRzW2luZGV4XS5tX0ZsYWcgfD0gRlhQVF9DTE9TRUZJR1VSRTsNCisgIH0NCiB9DQotdm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QmV6aWVyVG8oRlhfRkxPQVQgY3RybF94MSwgRlhfRkxPQVQgY3RybF95MSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3gyLCBGWF9GTE9BVCBjdHJsX3kyLCBGWF9GTE9BVCB0b194LCBGWF9GTE9BVCB0b195KQ0KLXsNCi0gICAgaW50IG9sZF9jb3VudCA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7DQotICAgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDMpOw0KLSAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50LCBjdHJsX3gxLCBjdHJsX3kxLCBGWFBUX0JFWklFUlRPKTsNCi0gICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsIGN0cmxfeDIsIGN0cmxfeTIsIEZYUFRfQkVaSUVSVE8pOw0KLSAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgMiwgdG9feCwgdG9feSwgRlhQVF9CRVpJRVJUTyk7DQordm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QWRkTGluZShGWF9GTE9BVCB4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5Mikgew0KKyAgaW50IG9sZF9jb3VudCA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7DQorICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCgyKTsNCisgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQsIHgxLCB5MSwgRlhQVF9NT1ZFVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsIHgyLCB5MiwgRlhQVF9MSU5FVE8pOw0KIH0NCi12b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpDbG9zZSgpDQotew0KLSAgICBpZiAobV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA+IDApIHsNCi0gICAgICAgIGludCBpbmRleCA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgLSAxOw0KLSAgICAgICAgRlhfUEFUSFBPSU5UICpwUG9pbnRzID0gbV9wUGF0aERhdGEtPkdldFBvaW50cygpOw0KLSAgICAgICAgcFBvaW50c1tpbmRleF0ubV9GbGFnIHw9IEZYUFRfQ0xPU0VGSUdVUkU7DQotICAgIH0NCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpBZGRCZXppZXIoRlhfRkxPQVQgc3RhcnRfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF94MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF95MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF94MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF95MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kX3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZF95KSB7DQorICBpbnQgb2xkX2NvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCisgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDQpOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCwgc3RhcnRfeCwgc3RhcnRfeSwgRlhQVF9NT1ZFVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsIGN0cmxfeDEsIGN0cmxfeTEsIEZYUFRfQkVaSUVSVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDIsIGN0cmxfeDIsIGN0cmxfeTIsIEZYUFRfQkVaSUVSVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDMsIGVuZF94LCBlbmRfeSwgRlhQVF9CRVpJRVJUTyk7DQogfQ0KLXZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZExpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpDQotew0KLSAgICBpbnQgb2xkX2NvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCi0gICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoMik7DQotICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQsIHgxLCB5MSwgRlhQVF9NT1ZFVE8pOw0KLSAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgMSwgeDIsIHkyLCBGWFBUX0xJTkVUTyk7DQordm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QWRkUmVjdGFuZ2xlKEZYX0ZMT0FUIHgxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyKSB7DQorICBtX3BQYXRoRGF0YS0+QXBwZW5kUmVjdCh4MSwgeTEsIHgyLCB5Mik7DQogfQ0KLXZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZEJlemllcihGWF9GTE9BVCBzdGFydF94LCBGWF9GTE9BVCBzdGFydF95LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3gxLCBGWF9GTE9BVCBjdHJsX3kxLCBGWF9GTE9BVCBjdHJsX3gyLCBGWF9GTE9BVCBjdHJsX3kyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRfeCwgRlhfRkxPQVQgZW5kX3kpDQotew0KLSAgICBpbnQgb2xkX2NvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCi0gICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoNCk7DQotICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQsIHN0YXJ0X3gsIHN0YXJ0X3ksIEZYUFRfTU9WRVRPKTsNCi0gICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsIGN0cmxfeDEsIGN0cmxfeTEsIEZYUFRfQkVaSUVSVE8pOw0KLSAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgMiwgY3RybF94MiwgY3RybF95MiwgRlhQVF9CRVpJRVJUTyk7DQotICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyAzLCBlbmRfeCwgZW5kX3ksIEZYUFRfQkVaSUVSVE8pOw0KLX0NCi12b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpBZGRSZWN0YW5nbGUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpDQotew0KLSAgICBtX3BQYXRoRGF0YS0+QXBwZW5kUmVjdCh4MSwgeTEsIHgyLCB5Mik7DQotfQ0KLXZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZEVsbGlwc2UoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgd2lkdGgsIEZYX0ZMT0FUIGhlaWdodCkNCi17DQordm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QWRkRWxsaXBzZShGWF9GTE9BVCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0KSB7DQogI2lmIDANCiAgICAgRlhfRklYRkxPQVQxNiBrOw0KICAgICBrID0gZml4MTZfdG9fOChmaXhzcXJ0XzMyX3RvXzE2KGZpeG11bF84XzhfdG9fMzIod2lkdGgsIHdpZHRoKSArIGZpeG11bF84XzhfdG9fMzIoaGVpZ2h0LCBoZWlnaHQpKSAvIDIpOw0KQEAgLTEwMiwzOSArMTA4LDQ1IEBACiAgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDUsIHggLSBrLCB5IC0gaGVpZ2h0IC8gMiwgRlhQVF9CRVpJRVJUTyk7DQogICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyA2LCB4LCB5IC0gaGVpZ2h0IC8gMiwgRlhQVF9CRVpJRVJUTyk7DQogI2Vsc2UNCi0gICAgQWRkQXJjKHgsIHksIHdpZHRoLCBoZWlnaHQsIDAsIEZYX1BJICogMik7DQorICBBZGRBcmMoeCwgeSwgd2lkdGgsIGhlaWdodCwgMCwgRlhfUEkgKiAyKTsNCiAjZW5kaWYNCiB9DQotdm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QXJjVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgd2lkdGgsIEZYX0ZMT0FUIGhlaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydF9hbmdsZSwgRlhfRkxPQVQgc3dlZXBfYW5nbGUpDQotew0KLSAgICBGWF9GTE9BVCB4MCA9IEZYU1lTX2Nvcyhzd2VlcF9hbmdsZSAvIDIpOw0KLSAgICBGWF9GTE9BVCB5MCA9IEZYU1lTX3Npbihzd2VlcF9hbmdsZSAvIDIpOw0KLSAgICBGWF9GTE9BVCB0eCA9IEZYU1lTX0RpdigoMS4wZiAtIHgwKSAqIDQsIDMgKiAxLjBmKTsNCi0gICAgRlhfRkxPQVQgdHkgPSB5MCAtIEZYU1lTX0RpdihGWFNZU19NdWwodHgsIHgwKSwgeTApOw0KLSAgICBGWF9GTE9BVCBweFszXSwgcHlbM107DQotICAgIHB4WzBdID0geDAgKyB0eDsNCi0gICAgcHlbMF0gPSAtdHk7DQotICAgIHB4WzFdID0geDAgKyB0eDsNCi0gICAgcHlbMV0gPSB0eTsNCi0gICAgRlhfRkxPQVQgc24gPSBGWFNZU19zaW4oc3RhcnRfYW5nbGUgKyBzd2VlcF9hbmdsZSAvIDIpOw0KLSAgICBGWF9GTE9BVCBjcyA9IEZYU1lTX2NvcyhzdGFydF9hbmdsZSArIHN3ZWVwX2FuZ2xlIC8gMik7DQotICAgIGludCBvbGRfY291bnQgPSBtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOw0KLSAgICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCgzKTsNCi0gICAgRlhfRkxPQVQgYmV6aWVyX3gsIGJlemllcl95Ow0KLSAgICBiZXppZXJfeCA9IHggKyBGWFNZU19NdWwod2lkdGgsIEZYU1lTX011bChweFswXSwgY3MpIC0gRlhTWVNfTXVsKHB5WzBdLCBzbikpOw0KLSAgICBiZXppZXJfeSA9IHkgKyBGWFNZU19NdWwoaGVpZ2h0LCBGWFNZU19NdWwocHhbMF0sIHNuKSArIEZYU1lTX011bChweVswXSwgY3MpKTsNCi0gICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCwgYmV6aWVyX3gsIGJlemllcl95LCBGWFBUX0JFWklFUlRPKTsNCi0gICAgYmV6aWVyX3ggPSB4ICsgRlhTWVNfTXVsKHdpZHRoLCBGWFNZU19NdWwocHhbMV0sIGNzKSAtIEZYU1lTX011bChweVsxXSwgc24pKTsNCi0gICAgYmV6aWVyX3kgPSB5ICsgRlhTWVNfTXVsKGhlaWdodCwgRlhTWVNfTXVsKHB4WzFdLCBzbikgKyBGWFNZU19NdWwocHlbMV0sIGNzKSk7DQotICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyAxLCBiZXppZXJfeCwgYmV6aWVyX3ksIEZYUFRfQkVaSUVSVE8pOw0KLSAgICBiZXppZXJfeCA9IHggKyBGWFNZU19NdWwod2lkdGgsIEZYU1lTX2NvcyhzdGFydF9hbmdsZSArIHN3ZWVwX2FuZ2xlKSksDQotICAgIGJlemllcl95ID0geSArIEZYU1lTX011bChoZWlnaHQsIEZYU1lTX3NpbihzdGFydF9hbmdsZSArIHN3ZWVwX2FuZ2xlKSk7DQotICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyAyLCBiZXppZXJfeCwgYmV6aWVyX3ksIEZYUFRfQkVaSUVSVE8pOw0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFyY1RvKEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfYW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBfYW5nbGUpIHsNCisgIEZYX0ZMT0FUIHgwID0gRlhTWVNfY29zKHN3ZWVwX2FuZ2xlIC8gMik7DQorICBGWF9GTE9BVCB5MCA9IEZYU1lTX3Npbihzd2VlcF9hbmdsZSAvIDIpOw0KKyAgRlhfRkxPQVQgdHggPSBGWFNZU19EaXYoKDEuMGYgLSB4MCkgKiA0LCAzICogMS4wZik7DQorICBGWF9GTE9BVCB0eSA9IHkwIC0gRlhTWVNfRGl2KEZYU1lTX011bCh0eCwgeDApLCB5MCk7DQorICBGWF9GTE9BVCBweFszXSwgcHlbM107DQorICBweFswXSA9IHgwICsgdHg7DQorICBweVswXSA9IC10eTsNCisgIHB4WzFdID0geDAgKyB0eDsNCisgIHB5WzFdID0gdHk7DQorICBGWF9GTE9BVCBzbiA9IEZYU1lTX3NpbihzdGFydF9hbmdsZSArIHN3ZWVwX2FuZ2xlIC8gMik7DQorICBGWF9GTE9BVCBjcyA9IEZYU1lTX2NvcyhzdGFydF9hbmdsZSArIHN3ZWVwX2FuZ2xlIC8gMik7DQorICBpbnQgb2xkX2NvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCisgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDMpOw0KKyAgRlhfRkxPQVQgYmV6aWVyX3gsIGJlemllcl95Ow0KKyAgYmV6aWVyX3ggPSB4ICsgRlhTWVNfTXVsKHdpZHRoLCBGWFNZU19NdWwocHhbMF0sIGNzKSAtIEZYU1lTX011bChweVswXSwgc24pKTsNCisgIGJlemllcl95ID0geSArIEZYU1lTX011bChoZWlnaHQsIEZYU1lTX011bChweFswXSwgc24pICsgRlhTWVNfTXVsKHB5WzBdLCBjcykpOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCwgYmV6aWVyX3gsIGJlemllcl95LCBGWFBUX0JFWklFUlRPKTsNCisgIGJlemllcl94ID0geCArIEZYU1lTX011bCh3aWR0aCwgRlhTWVNfTXVsKHB4WzFdLCBjcykgLSBGWFNZU19NdWwocHlbMV0sIHNuKSk7DQorICBiZXppZXJfeSA9IHkgKyBGWFNZU19NdWwoaGVpZ2h0LCBGWFNZU19NdWwocHhbMV0sIHNuKSArIEZYU1lTX011bChweVsxXSwgY3MpKTsNCisgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyAxLCBiZXppZXJfeCwgYmV6aWVyX3ksIEZYUFRfQkVaSUVSVE8pOw0KKyAgYmV6aWVyX3ggPSB4ICsgRlhTWVNfTXVsKHdpZHRoLCBGWFNZU19jb3Moc3RhcnRfYW5nbGUgKyBzd2VlcF9hbmdsZSkpLA0KKyAgYmV6aWVyX3kgPSB5ICsgRlhTWVNfTXVsKGhlaWdodCwgRlhTWVNfc2luKHN0YXJ0X2FuZ2xlICsgc3dlZXBfYW5nbGUpKTsNCisgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyAyLCBiZXppZXJfeCwgYmV6aWVyX3ksIEZYUFRfQkVaSUVSVE8pOw0KIH0NCi12b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpBZGRBcmMoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgd2lkdGgsIEZYX0ZMT0FUIGhlaWdodCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfYW5nbGUsIEZYX0ZMT0FUIHN3ZWVwX2FuZ2xlKQ0KLXsNCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpBZGRBcmMoRlhfRkxPQVQgeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfYW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwX2FuZ2xlKSB7DQogI2lmIDANCiAgICAgRlhfRklYRkxPQVQzMiBzd2VlcCA9IHN3ZWVwX2FuZ2xlOw0KICAgICB3aGlsZSAoc3dlZXAgPiBGSVhGTE9BVDMyX1BJICogMikgew0KQEAgLTE1OSw2NCArMTcxLDY5IEBACiAgICAgICAgIGFuZ2xlMSA9IGFuZ2xlMjsNCiAgICAgfSB3aGlsZSAoIWJEb25lKTsNCiAjZWxzZQ0KLSAgICBpZiAoc3dlZXBfYW5nbGUgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuOw0KKyAgaWYgKHN3ZWVwX2FuZ2xlID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgc3RhdGljIGNvbnN0IEZYX0ZMT0FUIGJlemllcl9hcmNfYW5nbGVfZXBzaWxvbiA9IChGWF9GTE9BVCkoMC4wMWYpOw0KKyAgd2hpbGUgKHN0YXJ0X2FuZ2xlID4gRlhfUEkgKiAyKSB7DQorICAgIHN0YXJ0X2FuZ2xlIC09IEZYX1BJICogMjsNCisgIH0NCisgIHdoaWxlIChzdGFydF9hbmdsZSA8IDApIHsNCisgICAgc3RhcnRfYW5nbGUgKz0gRlhfUEkgKiAyOw0KKyAgfQ0KKyAgaWYgKHN3ZWVwX2FuZ2xlID49IEZYX1BJICogMikgew0KKyAgICBzd2VlcF9hbmdsZSA9IEZYX1BJICogMjsNCisgIH0NCisgIGlmIChzd2VlcF9hbmdsZSA8PSAtRlhfUEkgKiAyKSB7DQorICAgIHN3ZWVwX2FuZ2xlID0gLUZYX1BJICogMjsNCisgIH0NCisgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDEpOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgLSAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHggKyBGWFNZU19NdWwod2lkdGgsIEZYU1lTX2NvcyhzdGFydF9hbmdsZSkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHkgKyBGWFNZU19NdWwoaGVpZ2h0LCBGWFNZU19zaW4oc3RhcnRfYW5nbGUpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX01PVkVUTyk7DQorICBGWF9GTE9BVCB0b3RhbF9zd2VlcCA9IDAsIGxvY2FsX3N3ZWVwID0gMCwgcHJldl9zd2VlcCA9IDA7DQorICBGWF9CT09MIGRvbmUgPSBGQUxTRTsNCisgIGRvIHsNCisgICAgaWYgKHN3ZWVwX2FuZ2xlIDwgMCkgew0KKyAgICAgIHByZXZfc3dlZXAgPSB0b3RhbF9zd2VlcDsNCisgICAgICBsb2NhbF9zd2VlcCA9IC1GWF9QSSAvIDI7DQorICAgICAgdG90YWxfc3dlZXAgLT0gRlhfUEkgLyAyOw0KKyAgICAgIGlmICh0b3RhbF9zd2VlcCA8PSBzd2VlcF9hbmdsZSArIGJlemllcl9hcmNfYW5nbGVfZXBzaWxvbikgew0KKyAgICAgICAgbG9jYWxfc3dlZXAgPSBzd2VlcF9hbmdsZSAtIHByZXZfc3dlZXA7DQorICAgICAgICBkb25lID0gVFJVRTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgcHJldl9zd2VlcCA9IHRvdGFsX3N3ZWVwOw0KKyAgICAgIGxvY2FsX3N3ZWVwID0gRlhfUEkgLyAyOw0KKyAgICAgIHRvdGFsX3N3ZWVwICs9IEZYX1BJIC8gMjsNCisgICAgICBpZiAodG90YWxfc3dlZXAgPj0gc3dlZXBfYW5nbGUgLSBiZXppZXJfYXJjX2FuZ2xlX2Vwc2lsb24pIHsNCisgICAgICAgIGxvY2FsX3N3ZWVwID0gc3dlZXBfYW5nbGUgLSBwcmV2X3N3ZWVwOw0KKyAgICAgICAgZG9uZSA9IFRSVUU7DQorICAgICAgfQ0KICAgICB9DQotICAgIHN0YXRpYyBjb25zdCBGWF9GTE9BVCBiZXppZXJfYXJjX2FuZ2xlX2Vwc2lsb24gPSAoRlhfRkxPQVQpKDAuMDFmKTsNCi0gICAgd2hpbGUgKHN0YXJ0X2FuZ2xlID4gRlhfUEkgKiAyKSB7DQotICAgICAgICBzdGFydF9hbmdsZSAtPSBGWF9QSSAqIDI7DQotICAgIH0NCi0gICAgd2hpbGUgKHN0YXJ0X2FuZ2xlIDwgMCkgew0KLSAgICAgICAgc3RhcnRfYW5nbGUgKz0gRlhfUEkgKiAyOw0KLSAgICB9DQotICAgIGlmKHN3ZWVwX2FuZ2xlID49IEZYX1BJICogMikgew0KLSAgICAgICAgc3dlZXBfYW5nbGUgPSBGWF9QSSAqIDI7DQotICAgIH0NCi0gICAgaWYoc3dlZXBfYW5nbGUgPD0gLUZYX1BJICogMikgew0KLSAgICAgICAgc3dlZXBfYW5nbGUgPSAtRlhfUEkgKiAyOw0KLSAgICB9DQotICAgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDEpOw0KLSAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQobV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSAtIDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICB4ICsgRlhTWVNfTXVsKHdpZHRoLCBGWFNZU19jb3Moc3RhcnRfYW5nbGUpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHkgKyBGWFNZU19NdWwoaGVpZ2h0LCBGWFNZU19zaW4oc3RhcnRfYW5nbGUpKSwgRlhQVF9NT1ZFVE8pOw0KLSAgICBGWF9GTE9BVCB0b3RhbF9zd2VlcCA9IDAsIGxvY2FsX3N3ZWVwID0gMCwgcHJldl9zd2VlcCA9IDA7DQotICAgIEZYX0JPT0wgZG9uZSA9IEZBTFNFOw0KLSAgICBkbyB7DQotICAgICAgICBpZiAoc3dlZXBfYW5nbGUgPCAwKSB7DQotICAgICAgICAgICAgcHJldl9zd2VlcCAgPSB0b3RhbF9zd2VlcDsNCi0gICAgICAgICAgICBsb2NhbF9zd2VlcCA9IC1GWF9QSSAvIDI7DQotICAgICAgICAgICAgdG90YWxfc3dlZXAgLT0gRlhfUEkgLyAyOw0KLSAgICAgICAgICAgIGlmICh0b3RhbF9zd2VlcCA8PSBzd2VlcF9hbmdsZSArIGJlemllcl9hcmNfYW5nbGVfZXBzaWxvbikgew0KLSAgICAgICAgICAgICAgICBsb2NhbF9zd2VlcCA9IHN3ZWVwX2FuZ2xlIC0gcHJldl9zd2VlcDsNCi0gICAgICAgICAgICAgICAgZG9uZSA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwcmV2X3N3ZWVwICA9IHRvdGFsX3N3ZWVwOw0KLSAgICAgICAgICAgIGxvY2FsX3N3ZWVwID0gRlhfUEkgLyAyOw0KLSAgICAgICAgICAgIHRvdGFsX3N3ZWVwICs9IEZYX1BJIC8gMjsNCi0gICAgICAgICAgICBpZiAodG90YWxfc3dlZXAgPj0gc3dlZXBfYW5nbGUgLSBiZXppZXJfYXJjX2FuZ2xlX2Vwc2lsb24pIHsNCi0gICAgICAgICAgICAgICAgbG9jYWxfc3dlZXAgPSBzd2VlcF9hbmdsZSAtIHByZXZfc3dlZXA7DQotICAgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIEFyY1RvKHgsIHksIHdpZHRoLCBoZWlnaHQsIHN0YXJ0X2FuZ2xlLCBsb2NhbF9zd2VlcCk7DQotICAgICAgICBzdGFydF9hbmdsZSArPSBsb2NhbF9zd2VlcDsNCi0gICAgfSB3aGlsZSAoIWRvbmUpOw0KKyAgICBBcmNUbyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzdGFydF9hbmdsZSwgbG9jYWxfc3dlZXApOw0KKyAgICBzdGFydF9hbmdsZSArPSBsb2NhbF9zd2VlcDsNCisgIH0gd2hpbGUgKCFkb25lKTsNCiAjZW5kaWYNCiB9DQotdm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QWRkUGllKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHdpZHRoLCBGWF9GTE9BVCBoZWlnaHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLCBGWF9GTE9BVCBzd2VlcF9hbmdsZSkNCi17DQotICAgIGlmIChzd2VlcF9hbmdsZSA9PSAwKSB7DQotICAgICAgICBpbnQgb2xkX2NvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCi0gICAgICAgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDIpOw0KLSAgICAgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCwgeCwgeSwgRlhQVF9NT1ZFVE8pOw0KLSAgICAgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIEZYU1lTX011bCh3aWR0aCwgRlhTWVNfY29zKHN0YXJ0X2FuZ2xlKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSArIEZYU1lTX011bChoZWlnaHQsIEZYU1lTX3NpbihzdGFydF9hbmdsZSkpLCBGWFBUX0xJTkVUTyk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgQWRkQXJjKHgsIHksIHdpZHRoLCBoZWlnaHQsIHN0YXJ0X2FuZ2xlLCBzd2VlcF9hbmdsZSk7DQotICAgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDEpOw0KLSAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQobV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSAtIDEsIHgsIHksIEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRSk7DQordm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QWRkUGllKEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcF9hbmdsZSkgew0KKyAgaWYgKHN3ZWVwX2FuZ2xlID09IDApIHsNCisgICAgaW50IG9sZF9jb3VudCA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7DQorICAgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDIpOw0KKyAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50LCB4LCB5LCBGWFBUX01PVkVUTyk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludCgNCisgICAgICAgIG9sZF9jb3VudCArIDEsIHggKyBGWFNZU19NdWwod2lkdGgsIEZYU1lTX2NvcyhzdGFydF9hbmdsZSkpLA0KKyAgICAgICAgeSArIEZYU1lTX011bChoZWlnaHQsIEZYU1lTX3NpbihzdGFydF9hbmdsZSkpLCBGWFBUX0xJTkVUTyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEFkZEFyYyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzdGFydF9hbmdsZSwgc3dlZXBfYW5nbGUpOw0KKyAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoMSk7DQorICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQobV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSAtIDEsIHgsIHksDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9MSU5FVE8gfCBGWFBUX0NMT1NFRklHVVJFKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9wYXRoX2dlbmVyYXRvci5oIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9wYXRoX2dlbmVyYXRvci5oCmluZGV4IDRlY2M5MGEuLjdkMzRmZTIgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfcGF0aF9nZW5lcmF0b3IuaAorKysgYi94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X3BhdGhfZ2VuZXJhdG9yLmgKQEAgLTYsMzcgKzYsNTUgQEAKIA0KICNpZm5kZWYgX19IX0ZYX1BBVEhfR0VORVJBVE9SX18NCiAjZGVmaW5lIF9fSF9GWF9QQVRIX0dFTkVSQVRPUl9fDQotY2xhc3MgQ0ZYX1BhdGhHZW5lcmF0b3INCi17DQotcHVibGljOg0KLSAgICBDRlhfUGF0aEdlbmVyYXRvcigpOw0KLSAgICB2b2lkIENyZWF0ZSgpOw0KLSAgICB+Q0ZYX1BhdGhHZW5lcmF0b3IoKTsNCi0gICAgQ0ZYX1BhdGhEYXRhICpHZXRQYXRoRGF0YSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BQYXRoRGF0YTsNCi0gICAgfQ0KLSAgICB2b2lkIEFkZFBhdGhEYXRhKENGWF9QYXRoRGF0YSAqcGF0aF9kYXRhKTsNCi0gICAgdm9pZCBBZGRQYXRoRGF0YShGWF9QQVRIUE9JTlQgKnBvaW50cywgaW50IGNvdW50KTsNCi0gICAgdm9pZCBNb3ZlVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7DQotICAgIHZvaWQgTGluZVRvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOw0KLSAgICB2b2lkIEJlemllclRvKEZYX0ZMT0FUIGN0cmxfeDEsIEZYX0ZMT0FUIGN0cmxfeTEsDQotICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF94MiwgRlhfRkxPQVQgY3RybF95MiwgRlhfRkxPQVQgdG9feCwgRlhfRkxPQVQgdG9feSk7DQotICAgIHZvaWQgQ2xvc2UoKTsNCi0gICAgdm9pZCBBcmNUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB3aWR0aCwgRlhfRkxPQVQgaGVpZ2h0LA0KLSAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLCBGWF9GTE9BVCBzd2VlcF9hbmdsZSk7DQorY2xhc3MgQ0ZYX1BhdGhHZW5lcmF0b3Igew0KKyBwdWJsaWM6DQorICBDRlhfUGF0aEdlbmVyYXRvcigpOw0KKyAgdm9pZCBDcmVhdGUoKTsNCisgIH5DRlhfUGF0aEdlbmVyYXRvcigpOw0KKyAgQ0ZYX1BhdGhEYXRhKiBHZXRQYXRoRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhdGhEYXRhOyB9DQorICB2b2lkIEFkZFBhdGhEYXRhKENGWF9QYXRoRGF0YSogcGF0aF9kYXRhKTsNCisgIHZvaWQgQWRkUGF0aERhdGEoRlhfUEFUSFBPSU5UKiBwb2ludHMsIGludCBjb3VudCk7DQorICB2b2lkIE1vdmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KTsNCisgIHZvaWQgTGluZVRvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOw0KKyAgdm9pZCBCZXppZXJUbyhGWF9GTE9BVCBjdHJsX3gxLA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3kxLA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3gyLA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3kyLA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b194LA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b195KTsNCisgIHZvaWQgQ2xvc2UoKTsNCisgIHZvaWQgQXJjVG8oRlhfRkxPQVQgeCwNCisgICAgICAgICAgICAgRlhfRkxPQVQgeSwNCisgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgIEZYX0ZMT0FUIGhlaWdodCwNCisgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfYW5nbGUsDQorICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwX2FuZ2xlKTsNCiANCi0gICAgdm9pZCBBZGRMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyKTsNCi0gICAgdm9pZCBBZGRCZXppZXIoRlhfRkxPQVQgc3RhcnRfeCwgRlhfRkxPQVQgc3RhcnRfeSwNCi0gICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF94MSwgRlhfRkxPQVQgY3RybF95MSwgRlhfRkxPQVQgY3RybF94MiwgRlhfRkxPQVQgY3RybF95MiwNCi0gICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kX3gsIEZYX0ZMT0FUIGVuZF95KTsNCi0gICAgdm9pZCBBZGRSZWN0YW5nbGUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpOw0KLSAgICB2b2lkIEFkZEVsbGlwc2UoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgd2lkdGgsIEZYX0ZMT0FUIGhlaWdodCk7DQotICAgIHZvaWQgQWRkQXJjKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHdpZHRoLCBGWF9GTE9BVCBoZWlnaHQsDQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLCBGWF9GTE9BVCBzd2VlcF9hbmdsZSk7DQotICAgIHZvaWQgQWRkUGllKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHdpZHRoLCBGWF9GTE9BVCBoZWlnaHQsDQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLCBGWF9GTE9BVCBzd2VlcF9hbmdsZSk7DQotcHJvdGVjdGVkOg0KLSAgICBDRlhfUGF0aERhdGEgKm1fcFBhdGhEYXRhOw0KKyAgdm9pZCBBZGRMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyKTsNCisgIHZvaWQgQWRkQmV6aWVyKEZYX0ZMT0FUIHN0YXJ0X3gsDQorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydF95LA0KKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF94MSwNCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxfeTEsDQorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3gyLA0KKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF95MiwNCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZF94LA0KKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kX3kpOw0KKyAgdm9pZCBBZGRSZWN0YW5nbGUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpOw0KKyAgdm9pZCBBZGRFbGxpcHNlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHdpZHRoLCBGWF9GTE9BVCBoZWlnaHQpOw0KKyAgdm9pZCBBZGRBcmMoRlhfRkxPQVQgeCwNCisgICAgICAgICAgICAgIEZYX0ZMT0FUIHksDQorICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCisgICAgICAgICAgICAgIEZYX0ZMT0FUIGhlaWdodCwNCisgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLA0KKyAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBfYW5nbGUpOw0KKyAgdm9pZCBBZGRQaWUoRlhfRkxPQVQgeCwNCisgICAgICAgICAgICAgIEZYX0ZMT0FUIHksDQorICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCisgICAgICAgICAgICAgIEZYX0ZMT0FUIGhlaWdodCwNCisgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLA0KKyAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBfYW5nbGUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfUGF0aERhdGEqIG1fcFBhdGhEYXRhOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9wcmUuaCBiL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvcHJlLmgKaW5kZXggNzAxYTQ4ZC4uNjU1NmM4NyAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9wcmUuaAorKysgYi94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL3ByZS5oCkBAIC02LDExMSArNiw1ODAgQEAKIA0KICNpbmNsdWRlICIuLi8uLi9mb3hpdGxpYi5oIg0KICNpZm5kZWYgRlhTWVNfTXVsDQotI2RlZmluZQkJRlhTWVNfTXVsKGEsIGIpICgoYSkgKiAoYikpDQotI2RlZmluZQkJRlhTWVNfRGl2KGEsIGIpICgoYSkgLyAoYikpDQotI2RlZmluZQkJRlhTWVNfTXVsRGl2KGEsIGIsIGMpICgoYSkgKiAoYikgLyAoYykpDQotI2RlZmluZQkJRlhTWVNfc3FydDIoYSwgYikgKEZYX0ZMT0FUKUZYU1lTX3NxcnQoKGEpKihhKSArIChiKSooYikpDQorI2RlZmluZSBGWFNZU19NdWwoYSwgYikgKChhKSAqIChiKSkNCisjZGVmaW5lIEZYU1lTX0RpdihhLCBiKSAoKGEpIC8gKGIpKQ0KKyNkZWZpbmUgRlhTWVNfTXVsRGl2KGEsIGIsIGMpICgoYSkgKiAoYikgLyAoYykpDQorI2RlZmluZSBGWFNZU19zcXJ0MihhLCBiKSAoRlhfRkxPQVQpIEZYU1lTX3NxcnQoKGEpICogKGEpICsgKGIpICogKGIpKQ0KICNlbmRpZg0KIGVudW0gew0KLSAgICBGWF9DT05URVhUX05vbmUJCT0gMCwNCi0gICAgRlhfQ09OVEVYVF9EZXZpY2UsDQorICBGWF9DT05URVhUX05vbmUgPSAwLA0KKyAgRlhfQ09OVEVYVF9EZXZpY2UsDQogfTsNCi1lbnVtIHsNCi0gICAgRlhfQ09MT1JfTm9uZQkJPSAwLA0KLSAgICBGWF9DT0xPUl9Tb2xpZCwNCi0gICAgRlhfQ09MT1JfUGF0dGVybiwNCi0gICAgRlhfQ09MT1JfU2hhZGluZw0KLX07DQotZW51bSB7DQotICAgIEZYX1BBVFRFUk5fTm9uZQkJPSAwLA0KLSAgICBGWF9QQVRURVJOX0JpdG1hcCwNCi0gICAgRlhfUEFUVEVSTl9IYXRjaA0KLX07DQotZW51bSB7DQotICAgIEZYX1NIQURJTkdfTm9uZQkJPSAwLA0KLSAgICBGWF9TSEFESU5HX0F4aWFsLA0KLSAgICBGWF9TSEFESU5HX1JhZGlhbA0KLX07DQotI2RlZmluZQlGWF9IQVRDSFNUWUxFX1RvdGFsCTUzDQorZW51bSB7IEZYX0NPTE9SX05vbmUgPSAwLCBGWF9DT0xPUl9Tb2xpZCwgRlhfQ09MT1JfUGF0dGVybiwgRlhfQ09MT1JfU2hhZGluZyB9Ow0KK2VudW0geyBGWF9QQVRURVJOX05vbmUgPSAwLCBGWF9QQVRURVJOX0JpdG1hcCwgRlhfUEFUVEVSTl9IYXRjaCB9Ow0KK2VudW0geyBGWF9TSEFESU5HX05vbmUgPSAwLCBGWF9TSEFESU5HX0F4aWFsLCBGWF9TSEFESU5HX1JhZGlhbCB9Ow0KKyNkZWZpbmUgRlhfSEFUQ0hTVFlMRV9Ub3RhbCA1Mw0KIHN0cnVjdCBGWF9IQVRDSERBVEEgew0KLSAgICBpbnQzMl90CXdpZHRoOw0KLSAgICBpbnQzMl90CWhlaWdodDsNCi0gICAgdWludDhfdAkJbWFza0JpdHNbNjRdOw0KKyAgaW50MzJfdCB3aWR0aDsNCisgIGludDMyX3QgaGVpZ2h0Ow0KKyAgdWludDhfdCBtYXNrQml0c1s2NF07DQogfTsNCi10eXBlZGVmIEZYX0hBVENIREFUQSBjb25zdCAqIEZYX0xQQ0hBVENIREFUQTsNCit0eXBlZGVmIEZYX0hBVENIREFUQSBjb25zdCogRlhfTFBDSEFUQ0hEQVRBOw0KIHN0YXRpYyBjb25zdCBGWF9IQVRDSERBVEEgaGF0Y2hCaXRtYXBEYXRhW0ZYX0hBVENIU1RZTEVfVG90YWxdID0gew0KLSAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDUxLCAweDUxLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDE1LCAweDE1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDUxLCAweDUxLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDE1LCAweDE1LCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGY3LCAweGY3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDdmLCAweDdmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGY3LCAweGY3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDdmLCAweDdmLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsIDB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDgzLCAweDgzLCAweDAwLCAweDAwLCAweDA3LCAweDA3LCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwLCAweDAwLCAweDFjLCAweDFjLCAweDAwLCAweDAwLCAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweGMxLCAweGMxLCAweDAwLCAweDAwLCAweDgzLCAweDgzLCAweDAwLCAweDAwLCAweDA3LCAweDA3LCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwLCAweDAwLCAweDFjLCAweDFjLCAweDAwLCAweDAwLCAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweGMxLCAweGMxLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGIxLCAweGIxLCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDAwLCAweDAwLCAweDFiLCAweDFiLCAweDAwLCAweDAwLCAweGQ4LCAweGQ4LCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDhkLCAweDhkLCAweDAwLCAweDAwLCAweGIxLCAweGIxLCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDAwLCAweDAwLCAweDFiLCAweDFiLCAweDAwLCAweDAwLCAweGQ4LCAweGQ4LCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDhkLCAweDhkLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NTQsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDUsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NTQsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDUsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHgwMywgMHgwMywgMHgwMCwgMHgwMCwgMHg4NCwgMHg4NCwgMHgwMCwgMHgwMCwgMHg0OCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHgwMCwgMHgwMCwgMHg4NCwgMHg4NCwgMHgwMCwgMHgwMCwgMHg0OCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDg5LCAweDg5LCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDk4LCAweDk4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDg5LCAweDg5LCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDk4LCAweDk4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsfX0sDQotICAgIHsxNiwgMTYsIHsweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLH19LA0KLSAgICB7MTYsIDE2LCB7MHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCx9fSwNCi0gICAgezE2LCAxNiwgezB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgxLCAweDgxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDExLCAweDExLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1MSwgMHg1MSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDE1LCAweDE1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDE1LCAweDE1LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhlZSwgMHhlZSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGJiLCAweGJiLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGVlLCAweGVlLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhlZSwgMHhlZSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhiYiwgMHhiYiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGRkLCAweGRkLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhlZiwgMHhlZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZlLCAweGZlLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGVmLCAweGVmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhlZiwgMHhlZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmNywgMHhmNywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDdmLCAweDdmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZjcsIDB4ZjcsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDdmLCAweDdmLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDExLCAweDExLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHgxYywgMHgxYywgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA3LCAweDA3LCAweDAwLCAweDAwLCAweDgzLCAweDgzLCAweDAwLCAweDAwLCAweGMxLCAweGMxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxYywgMHgxYywgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwNywgMHgwNywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgzLCAweDgzLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxYywgMHgxYywgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweGMxLCAweGMxLCAweDAwLCAweDAwLCAweDgzLCAweDgzLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHhlMCwgMHhlMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGMxLCAweGMxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA0LCAweDA0LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YjEsIDB4YjEsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxYiwgMHgxYiwgMHgwMCwgMHgwMCwgMHhkOCwgMHhkOCwgMHgwMCwgMHgwMCwgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDhkLCAweDhkLCAweDAwLCAweDAwLCAweGIxLCAweGIxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MWIsIDB4MWIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhkOCwgMHhkOCwgMHgwMCwgMHgwMCwgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDhkLCAweDhkLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDE4LCAweDE4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDI1LCAweDI1LCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgyNSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGMwLCAweGMwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgxLCAweDgxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NTQsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0NSwgMHg0NSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgxNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDUxLCAweDUxLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTQsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDUxLCAweDUxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGYwLCAweGYwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ODQsIDB4ODQsIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODQsIDB4ODQsIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ODksIDB4ODksIDB4MDAsIDB4MDAsIDB4OGYsIDB4OGYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4ZiwgMHg4ZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHg5OCwgMHg5OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODksIDB4ODksIDB4MDAsIDB4MDAsIDB4OGYsIDB4OGYsIDB4MDAsIDB4MDAsIDB4OGYsIDB4OGYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHg5OCwgMHg5OCwgMHgwMCwgMHgwMCwgMHhmOCwgMHhmOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGY4LCAweGY4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDBmLCAweDBmLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4ODIsIDB4ODIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MjgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgyLCAweDgyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgyLCAweDgyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQorICAgIHsxNiwNCisgICAgIDE2LA0KKyAgICAgew0KKyAgICAgICAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwgMHg3YywgMHg3YywgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg3YywgMHg3YywgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgfX0sDQogfTsNCi0jaWYgZGVmaW5lZCAoX19XSU4zMl9fKSB8fCBkZWZpbmVkIChfV0lOMzIpDQotI2RlZmluZSBGWF9TVEFSVF9USU1FUglTWVNURU1USU1FIHN0YXJ0LCBzdG9wOyBcDQotICAgIDo6R2V0TG9jYWxUaW1lKCZzdGFydCk7DQotI2RlZmluZSBGWF9TVE9QX1RJTUVSCTo6R2V0TG9jYWxUaW1lKCZzdG9wKTsgXA0KLSAgICBXT1JEIHdTZWNvbmQgPSBzdG9wLndTZWNvbmQgLSBzdGFydC53U2Vjb25kOyBcDQotICAgIFdPUkQgd01pbGxpc2Vjb25kcyA9IHN0b3Aud01pbGxpc2Vjb25kcyAtIHN0YXJ0LndNaWxsaXNlY29uZHM7IFwNCi0gICAgY2hhciBidWZbMjU2XTsgXA0KLSAgICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7IFwNCi0gICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsICJkdXJhdGlvbiBpcyAlZCBtaWxsaXNlY29uZFxuIiwgd1NlY29uZCAqIDEwMDAgKyB3TWlsbGlzZWNvbmRzKTsgXA0KLSAgICA6Ok91dHB1dERlYnVnU3RyaW5nKGJ1Zik7DQotI2VsaWYgZGVmaW5lZCAoX19saW51eCkgfHwgZGVmaW5lZCAobGludXgpDQorI2lmIGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikNCisjZGVmaW5lIEZYX1NUQVJUX1RJTUVSICAgIFwNCisgIFNZU1RFTVRJTUUgc3RhcnQsIHN0b3A7IFwNCisgIDo6R2V0TG9jYWxUaW1lKCZzdGFydCk7DQorI2RlZmluZSBGWF9TVE9QX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICA6OkdldExvY2FsVGltZSgmc3RvcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICBXT1JEIHdTZWNvbmQgPSBzdG9wLndTZWNvbmQgLSBzdGFydC53U2Vjb25kOyAgICAgICAgICAgICAgICAgICBcDQorICBXT1JEIHdNaWxsaXNlY29uZHMgPSBzdG9wLndNaWxsaXNlY29uZHMgLSBzdGFydC53TWlsbGlzZWNvbmRzOyBcDQorICBjaGFyIGJ1ZlsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICBzbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gMSwgImR1cmF0aW9uIGlzICVkIG1pbGxpc2Vjb25kXG4iLCBcDQorICAgICAgICAgICB3U2Vjb25kICogMTAwMCArIHdNaWxsaXNlY29uZHMpOyAgICAgICAgICAgICAgICAgICAgICBcDQorICA6Ok91dHB1dERlYnVnU3RyaW5nKGJ1Zik7DQorI2VsaWYgZGVmaW5lZChfX2xpbnV4KSB8fCBkZWZpbmVkKGxpbnV4KQ0KICNkZWZpbmUgRlhfU1RBUlRfVElNRVINCiAjZGVmaW5lIEZYX1NUT1BfVElNRVINCi0jZWxpZiBkZWZpbmVkIChfX0FQUExFX18pIHx8IGRlZmluZWQgKF9fTUFDT1NYX18pDQotI2RlZmluZSBGWF9TVEFSVF9USU1FUglOU1RpbWVJbnRlcnZhbCBzdGFydCwgc3RvcDsgXA0KLSAgICBzdGFydCA9IFtOU0RhdGUgdGltZUludGVydmFsU2luY2VSZWZlcmVuY2VEYXRlXTsNCi0jZGVmaW5lIEZYX1NUT1BfVElNRVIJc3RvcCA9IFtOU0RhdGUgdGltZUludGVydmFsU2luY2VSZWZlcmVuY2VEYXRlXTsgXA0KLSAgICBOU1RpbWVJbnRlcnZhbCBkdXJhdGlvbiA9IHN0b3AgLSBzdGFydDsgXA0KLSAgICBwcmludGYoImR1cmF0aW9uIGlzICVmIG1pbGxpc2Vjb25kXG4iLCBkdXJhdGlvbiAqIDEwMDApOw0KKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fTUFDT1NYX18pDQorI2RlZmluZSBGWF9TVEFSVF9USU1FUiAgICAgICAgXA0KKyAgTlNUaW1lSW50ZXJ2YWwgc3RhcnQsIHN0b3A7IFwNCisgIHN0YXJ0ID0gW05TRGF0ZSB0aW1lSW50ZXJ2YWxTaW5jZVJlZmVyZW5jZURhdGVdOw0KKyNkZWZpbmUgRlhfU1RPUF9USU1FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgc3RvcCA9IFtOU0RhdGUgdGltZUludGVydmFsU2luY2VSZWZlcmVuY2VEYXRlXTsgXA0KKyAgTlNUaW1lSW50ZXJ2YWwgZHVyYXRpb24gPSBzdG9wIC0gc3RhcnQ7ICAgICAgICAgXA0KKyAgcHJpbnRmKCJkdXJhdGlvbiBpcyAlZiBtaWxsaXNlY29uZFxuIiwgZHVyYXRpb24gKiAxMDAwKTsNCiAjZWxzZQ0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL2NsYXNzLmNwcCBiL3hmYS9zcmMvZnhqc2Uvc3JjL2NsYXNzLmNwcAppbmRleCBiYzAyZThiLi5kMTg2MjM4IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4anNlL3NyYy9jbGFzcy5jcHAKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvY2xhc3MuY3BwCkBAIC0xMSwyNTggKzExLDMyNCBAQAogI2luY2x1ZGUgInZhbHVlLmgiDQogI2luY2x1ZGUgInNjb3BlX2lubGluZS5oIg0KICNpbmNsdWRlICJ1dGlsX2lubGluZS5oIg0KLXN0YXRpYyB2b2lkIEZYSlNFX1Y4Q29uc3RydWN0b3JDYWxsYmFja19XcmFwcGVyKGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsNCi1zdGF0aWMgdm9pZCBGWEpTRV9WOEZ1bmN0aW9uQ2FsbGJhY2tfV3JhcHBlcihjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7DQotc3RhdGljIHZvaWQgRlhKU0VfVjhHZXR0ZXJDYWxsYmFja19XcmFwcGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOw0KLXN0YXRpYyB2b2lkIEZYSlNFX1Y4U2V0dGVyQ2FsbGJhY2tfV3JhcHBlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88dm9pZD4mIGluZm8pOw0KLXZvaWQgRlhKU0VfRGVmaW5lRnVuY3Rpb25zKEZYSlNFX0hDT05URVhUIGhDb250ZXh0LCBjb25zdCBGWEpTRV9GVU5DVElPTiogbHBGdW5jdGlvbnMsIGludCBuTnVtKQ0KLXsNCi0gICAgQ0ZYSlNFX0NvbnRleHQqIGxwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NvbnRleHQqPihoQ29udGV4dCk7DQotICAgIEFTU0VSVChscENvbnRleHQpOw0KLSAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0IHNjb3BlKGxwQ29udGV4dCk7DQotICAgIHY4OjpJc29sYXRlICpwSXNvbGF0ZSA9IGxwQ29udGV4dC0+R2V0UnVudGltZSgpOw0KLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gIGhHbG9iYWxPYmplY3QgPSBGWEpTRV9HZXRHbG9iYWxPYmplY3RGcm9tQ29udGV4dChzY29wZS5HZXRMb2NhbENvbnRleHQoKSk7DQotICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgbk51bTsgaSsrKSB7DQotICAgICAgICBoR2xvYmFsT2JqZWN0LT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgbHBGdW5jdGlvbnNbaV0ubmFtZSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhGdW5jdGlvbkNhbGxiYWNrX1dyYXBwZXIsIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0ZVTkNUSU9OKj4obHBGdW5jdGlvbnMgKyBpKSkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6UmVhZE9ubHkgfCB2ODo6RG9udERlbGV0ZSkpOw0KLSAgICB9DQorc3RhdGljIHZvaWQgRlhKU0VfVjhDb25zdHJ1Y3RvckNhbGxiYWNrX1dyYXBwZXIoDQorICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsNCitzdGF0aWMgdm9pZCBGWEpTRV9WOEZ1bmN0aW9uQ2FsbGJhY2tfV3JhcHBlcigNCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4R2V0dGVyQ2FsbGJhY2tfV3JhcHBlcigNCisgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LA0KKyAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7DQorc3RhdGljIHZvaWQgRlhKU0VfVjhTZXR0ZXJDYWxsYmFja19XcmFwcGVyKA0KKyAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksDQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLA0KKyAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88dm9pZD4mIGluZm8pOw0KK3ZvaWQgRlhKU0VfRGVmaW5lRnVuY3Rpb25zKEZYSlNFX0hDT05URVhUIGhDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0ZVTkNUSU9OKiBscEZ1bmN0aW9ucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk51bSkgew0KKyAgQ0ZYSlNFX0NvbnRleHQqIGxwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NvbnRleHQqPihoQ29udGV4dCk7DQorICBBU1NFUlQobHBDb250ZXh0KTsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQgc2NvcGUobHBDb250ZXh0KTsNCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGxwQ29udGV4dC0+R2V0UnVudGltZSgpOw0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhHbG9iYWxPYmplY3QgPQ0KKyAgICAgIEZYSlNFX0dldEdsb2JhbE9iamVjdEZyb21Db250ZXh0KHNjb3BlLkdldExvY2FsQ29udGV4dCgpKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5OdW07IGkrKykgew0KKyAgICBoR2xvYmFsT2JqZWN0LT5Gb3JjZVNldCgNCisgICAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBscEZ1bmN0aW9uc1tpXS5uYW1lKSwNCisgICAgICAgIHY4OjpGdW5jdGlvbjo6TmV3KA0KKyAgICAgICAgICAgIHBJc29sYXRlLCBGWEpTRV9WOEZ1bmN0aW9uQ2FsbGJhY2tfV3JhcHBlciwNCisgICAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEZYSlNFX0ZVTkNUSU9OKj4obHBGdW5jdGlvbnMgKyBpKSkpLA0KKyAgICAgICAgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6UmVhZE9ubHkgfCB2ODo6RG9udERlbGV0ZSkpOw0KKyAgfQ0KIH0NCi1GWEpTRV9IQ0xBU1MgRlhKU0VfRGVmaW5lQ2xhc3MoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzKQ0KLXsNCi0gICAgQ0ZYSlNFX0NvbnRleHQqIGxwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NvbnRleHQqPihoQ29udGV4dCk7DQotICAgIEFTU0VSVChscENvbnRleHQpOw0KLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IQ0xBU1M+KENGWEpTRV9DbGFzczo6Q3JlYXRlKGxwQ29udGV4dCwgbHBDbGFzcywgRkFMU0UpKTsNCitGWEpTRV9IQ0xBU1MgRlhKU0VfRGVmaW5lQ2xhc3MoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzKSB7DQorICBDRlhKU0VfQ29udGV4dCogbHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCisgIEFTU0VSVChscENvbnRleHQpOw0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSENMQVNTPigNCisgICAgICBDRlhKU0VfQ2xhc3M6OkNyZWF0ZShscENvbnRleHQsIGxwQ2xhc3MsIEZBTFNFKSk7DQogfQ0KLUZYSlNFX0hDTEFTUyBGWEpTRV9HZXRDbGFzcyhGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzek5hbWUpDQotew0KLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IQ0xBU1M+KENGWEpTRV9DbGFzczo6R2V0Q2xhc3NGcm9tQ29udGV4dChyZWludGVycHJldF9jYXN0PENGWEpTRV9Db250ZXh0Kj4oaENvbnRleHQpLCBzek5hbWUpKTsNCitGWEpTRV9IQ0xBU1MgRlhKU0VfR2V0Q2xhc3MoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pOYW1lKSB7DQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IQ0xBU1M+KENGWEpTRV9DbGFzczo6R2V0Q2xhc3NGcm9tQ29udGV4dCgNCisgICAgICByZWludGVycHJldF9jYXN0PENGWEpTRV9Db250ZXh0Kj4oaENvbnRleHQpLCBzek5hbWUpKTsNCiB9DQotc3RhdGljIHZvaWQgRlhKU0VfVjhGdW5jdGlvbkNhbGxiYWNrX1dyYXBwZXIoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQotew0KLSAgICBjb25zdCBGWEpTRV9GVU5DVElPTiogbHBGdW5jdGlvbkluZm8gPSBzdGF0aWNfY2FzdDxGWEpTRV9GVU5DVElPTio+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQotICAgIGlmICghbHBGdW5jdGlvbkluZm8pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZ0Mgc3pGdW5jdGlvbk5hbWUobHBGdW5jdGlvbkluZm8tPm5hbWUpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KLSAgICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQotICAgIENGWEpTRV9WYWx1ZSogbHBSZXRWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCi0gICAgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwgaW1wbCA9IHsmaW5mbywgbHBSZXRWYWx1ZX07DQotICAgIGxwRnVuY3Rpb25JbmZvLT5jYWxsYmFja1Byb2MocmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksIHN6RnVuY3Rpb25OYW1lLCByZWludGVycHJldF9jYXN0PENGWEpTRV9Bcmd1bWVudHMmPihpbXBsKSk7DQotICAgIGlmKCFscFJldFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpLklzRW1wdHkoKSkgew0KLSAgICAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChscFJldFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLSAgICBkZWxldGUgbHBSZXRWYWx1ZTsNCi0gICAgbHBSZXRWYWx1ZSA9IE5VTEw7DQotICAgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCi0gICAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4RnVuY3Rpb25DYWxsYmFja19XcmFwcGVyKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgY29uc3QgRlhKU0VfRlVOQ1RJT04qIGxwRnVuY3Rpb25JbmZvID0NCisgICAgICBzdGF0aWNfY2FzdDxGWEpTRV9GVU5DVElPTio+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQorICBpZiAoIWxwRnVuY3Rpb25JbmZvKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nQyBzekZ1bmN0aW9uTmFtZShscEZ1bmN0aW9uSW5mby0+bmFtZSk7DQorICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFJldFZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwgaW1wbCA9IHsmaW5mbywgbHBSZXRWYWx1ZX07DQorICBscEZ1bmN0aW9uSW5mby0+Y2FsbGJhY2tQcm9jKHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZ1bmN0aW9uTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQXJndW1lbnRzJj4oaW1wbCkpOw0KKyAgaWYgKCFscFJldFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpLklzRW1wdHkoKSkgew0KKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KKyAgfQ0KKyAgZGVsZXRlIGxwUmV0VmFsdWU7DQorICBscFJldFZhbHVlID0gTlVMTDsNCisgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCiB9DQotc3RhdGljIHZvaWQgRlhKU0VfVjhDbGFzc0dsb2JhbENvbnN0cnVjdG9yQ2FsbGJhY2tfV3JhcHBlcihjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykNCi17DQotICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW5pdGlvbiA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCi0gICAgaWYgKCFscENsYXNzRGVmaW5pdGlvbikgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIENGWF9CeXRlU3RyaW5nQyBzekZ1bmN0aW9uTmFtZShscENsYXNzRGVmaW5pdGlvbi0+bmFtZSk7DQotICAgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQotICAgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGluZm8uVGhpcygpKTsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFJldFZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KLSAgICBDRlhKU0VfQXJndW1lbnRzSW1wbCBpbXBsID0geyZpbmZvLCBscFJldFZhbHVlfTsNCi0gICAgbHBDbGFzc0RlZmluaXRpb24tPmNvbnN0cnVjdG9yKHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ1bmN0aW9uTmFtZSwgcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQXJndW1lbnRzJj4oaW1wbCkpOw0KLSAgICBpZighbHBSZXRWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQobHBSZXRWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7DQotICAgIH0NCi0gICAgZGVsZXRlIGxwUmV0VmFsdWU7DQotICAgIGxwUmV0VmFsdWUgPSBOVUxMOw0KLSAgICBkZWxldGUgbHBUaGlzVmFsdWU7DQotICAgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCitzdGF0aWMgdm9pZCBGWEpTRV9WOENsYXNzR2xvYmFsQ29uc3RydWN0b3JDYWxsYmFja19XcmFwcGVyKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3NEZWZpbml0aW9uID0NCisgICAgICBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQorICBpZiAoIWxwQ2xhc3NEZWZpbml0aW9uKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nQyBzekZ1bmN0aW9uTmFtZShscENsYXNzRGVmaW5pdGlvbi0+bmFtZSk7DQorICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFJldFZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwgaW1wbCA9IHsmaW5mbywgbHBSZXRWYWx1ZX07DQorICBscENsYXNzRGVmaW5pdGlvbi0+Y29uc3RydWN0b3IocmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pGdW5jdGlvbk5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQXJndW1lbnRzJj4oaW1wbCkpOw0KKyAgaWYgKCFscFJldFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpLklzRW1wdHkoKSkgew0KKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KKyAgfQ0KKyAgZGVsZXRlIGxwUmV0VmFsdWU7DQorICBscFJldFZhbHVlID0gTlVMTDsNCisgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCiB9DQotc3RhdGljIHZvaWQgRlhKU0VfVjhHZXR0ZXJDYWxsYmFja19XcmFwcGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQotew0KLSAgICBjb25zdCBGWEpTRV9QUk9QRVJUWSogbHBQcm9wZXJ0eUluZm8gPSBzdGF0aWNfY2FzdDxGWEpTRV9QUk9QRVJUWSo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQotICAgIGlmICghbHBQcm9wZXJ0eUluZm8pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZ0Mgc3pQcm9wZXJ0eU5hbWUobHBQcm9wZXJ0eUluZm8tPm5hbWUpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KLSAgICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQotICAgIGxwUHJvcGVydHlJbmZvLT5nZXRQcm9jKHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzelByb3BlcnR5TmFtZSwgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwUHJvcFZhbHVlKSk7DQotICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQobHBQcm9wVmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KLSAgICBkZWxldGUgbHBUaGlzVmFsdWU7DQotICAgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCi0gICAgZGVsZXRlIGxwUHJvcFZhbHVlOw0KLSAgICBscFByb3BWYWx1ZSA9IE5VTEw7DQorc3RhdGljIHZvaWQgRlhKU0VfVjhHZXR0ZXJDYWxsYmFja19XcmFwcGVyKA0KKyAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksDQorICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7DQorICBjb25zdCBGWEpTRV9QUk9QRVJUWSogbHBQcm9wZXJ0eUluZm8gPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYSlNFX1BST1BFUlRZKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgIGlmICghbHBQcm9wZXJ0eUluZm8pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmdDIHN6UHJvcGVydHlOYW1lKGxwUHJvcGVydHlJbmZvLT5uYW1lKTsNCisgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KKyAgbHBQcm9wZXJ0eUluZm8tPmdldFByb2MocmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBzelByb3BlcnR5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFZBTFVFPihscFByb3BWYWx1ZSkpOw0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChscFByb3BWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICBkZWxldGUgbHBUaGlzVmFsdWU7DQorICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorICBkZWxldGUgbHBQcm9wVmFsdWU7DQorICBscFByb3BWYWx1ZSA9IE5VTEw7DQogfQ0KLXN0YXRpYyB2b2lkIEZYSlNFX1Y4U2V0dGVyQ2FsbGJhY2tfV3JhcHBlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88dm9pZD4mIGluZm8pDQotew0KLSAgICBjb25zdCBGWEpTRV9QUk9QRVJUWSogbHBQcm9wZXJ0eUluZm8gPSBzdGF0aWNfY2FzdDxGWEpTRV9QUk9QRVJUWSo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQotICAgIGlmICghbHBQcm9wZXJ0eUluZm8pIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBDRlhfQnl0ZVN0cmluZ0Mgc3pQcm9wZXJ0eU5hbWUobHBQcm9wZXJ0eUluZm8tPm5hbWUpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KLSAgICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQotICAgIGxwUHJvcFZhbHVlLT5Gb3JjZVNldFZhbHVlKHZhbHVlKTsNCi0gICAgbHBQcm9wZXJ0eUluZm8tPnNldFByb2MocmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksIHN6UHJvcGVydHlOYW1lLCByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBQcm9wVmFsdWUpKTsNCi0gICAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KLSAgICBscFRoaXNWYWx1ZSA9IE5VTEw7DQotICAgIGRlbGV0ZSBscFByb3BWYWx1ZTsNCi0gICAgbHBQcm9wVmFsdWUgPSBOVUxMOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4U2V0dGVyQ2FsbGJhY2tfV3JhcHBlcigNCisgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LA0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwNCisgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHZvaWQ+JiBpbmZvKSB7DQorICBjb25zdCBGWEpTRV9QUk9QRVJUWSogbHBQcm9wZXJ0eUluZm8gPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYSlNFX1BST1BFUlRZKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgIGlmICghbHBQcm9wZXJ0eUluZm8pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmdDIHN6UHJvcGVydHlOYW1lKGxwUHJvcGVydHlJbmZvLT5uYW1lKTsNCisgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KKyAgbHBQcm9wVmFsdWUtPkZvcmNlU2V0VmFsdWUodmFsdWUpOw0KKyAgbHBQcm9wZXJ0eUluZm8tPnNldFByb2MocmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBzelByb3BlcnR5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFZBTFVFPihscFByb3BWYWx1ZSkpOw0KKyAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KKyAgZGVsZXRlIGxwUHJvcFZhbHVlOw0KKyAgbHBQcm9wVmFsdWUgPSBOVUxMOw0KIH0NCi1zdGF0aWMgdm9pZCBGWEpTRV9WOENvbnN0cnVjdG9yQ2FsbGJhY2tfV3JhcHBlcihjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykNCi17DQotICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW5pdGlvbiA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCi0gICAgaWYgKCFscENsYXNzRGVmaW5pdGlvbikgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIEZYU1lTX2Fzc2VydChpbmZvLlRoaXMoKS0+SW50ZXJuYWxGaWVsZENvdW50KCkpOw0KLSAgICBpbmZvLlRoaXMoKS0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgTlVMTCk7DQotICAgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQotICAgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGluZm8uVGhpcygpKTsNCi0gICAgaWYobHBDbGFzc0RlZmluaXRpb24tPmR5bk1ldGhvZENhbGwgfHwgbHBDbGFzc0RlZmluaXRpb24tPmR5blByb3BHZXR0ZXIgfHwgbHBDbGFzc0RlZmluaXRpb24tPmR5blByb3BTZXR0ZXIgfHwgbHBDbGFzc0RlZmluaXRpb24tPmR5blByb3BUeXBlR2V0dGVyKSB7DQotICAgICAgICBDRlhKU0VfQ2xhc3M6OlNldFVwRHluUHJvcEhhbmRsZXIoTlVMTCwgbHBUaGlzVmFsdWUsIGxwQ2xhc3NEZWZpbml0aW9uKTsNCi0gICAgfQ0KLSAgICBkZWxldGUgbHBUaGlzVmFsdWU7DQotICAgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCitzdGF0aWMgdm9pZCBGWEpTRV9WOENvbnN0cnVjdG9yQ2FsbGJhY2tfV3JhcHBlcigNCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsNCisgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW5pdGlvbiA9DQorICAgICAgc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgaWYgKCFscENsYXNzRGVmaW5pdGlvbikgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWFNZU19hc3NlcnQoaW5mby5UaGlzKCktPkludGVybmFsRmllbGRDb3VudCgpKTsNCisgIGluZm8uVGhpcygpLT5TZXRBbGlnbmVkUG9pbnRlckluSW50ZXJuYWxGaWVsZCgwLCBOVUxMKTsNCisgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICBpZiAobHBDbGFzc0RlZmluaXRpb24tPmR5bk1ldGhvZENhbGwgfHwgbHBDbGFzc0RlZmluaXRpb24tPmR5blByb3BHZXR0ZXIgfHwNCisgICAgICBscENsYXNzRGVmaW5pdGlvbi0+ZHluUHJvcFNldHRlciB8fA0KKyAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5keW5Qcm9wVHlwZUdldHRlcikgew0KKyAgICBDRlhKU0VfQ2xhc3M6OlNldFVwRHluUHJvcEhhbmRsZXIoTlVMTCwgbHBUaGlzVmFsdWUsIGxwQ2xhc3NEZWZpbml0aW9uKTsNCisgIH0NCisgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCiB9DQotRlhKU0VfSFJVTlRJTUUgQ0ZYSlNFX0FyZ3VtZW50czo6R2V0UnVudGltZSgpIGNvbnN0DQotew0KLSAgICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBjb25zdD4odGhpcyk7DQotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hSVU5USU1FPihscEFyZ3VtZW50cy0+bV9wUmV0VmFsdWUtPkdldElzb2xhdGUoKSk7DQorRlhKU0VfSFJVTlRJTUUgQ0ZYSlNFX0FyZ3VtZW50czo6R2V0UnVudGltZSgpIGNvbnN0IHsNCisgIGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBscEFyZ3VtZW50cyA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFJVTlRJTUU+KA0KKyAgICAgIGxwQXJndW1lbnRzLT5tX3BSZXRWYWx1ZS0+R2V0SXNvbGF0ZSgpKTsNCiB9DQotaW50MzJfdAkJQ0ZYSlNFX0FyZ3VtZW50czo6R2V0TGVuZ3RoKCkgY29uc3QNCi17DQotICAgIGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBscEFyZ3VtZW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGNvbnN0Pih0aGlzKTsNCi0gICAgcmV0dXJuIGxwQXJndW1lbnRzLT5tX3BJbmZvLT5MZW5ndGgoKTsNCitpbnQzMl90IENGWEpTRV9Bcmd1bWVudHM6OkdldExlbmd0aCgpIGNvbnN0IHsNCisgIGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBscEFyZ3VtZW50cyA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgcmV0dXJuIGxwQXJndW1lbnRzLT5tX3BJbmZvLT5MZW5ndGgoKTsNCiB9DQotRlhKU0VfSFZBTFVFCUNGWEpTRV9Bcmd1bWVudHM6OkdldFZhbHVlKGludDMyX3QgaW5kZXgpIGNvbnN0DQotew0KLSAgICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBjb25zdD4odGhpcyk7DQotICAgIENGWEpTRV9WYWx1ZSogbHBBcmdWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKHY4OjpJc29sYXRlOjpHZXRDdXJyZW50KCkpOw0KLSAgICBBU1NFUlQobHBBcmdWYWx1ZSk7DQotICAgIGxwQXJnVmFsdWUtPkZvcmNlU2V0VmFsdWUoKCpscEFyZ3VtZW50cy0+bV9wSW5mbylbaW5kZXhdKTsNCi0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFZBTFVFPihscEFyZ1ZhbHVlKTsNCitGWEpTRV9IVkFMVUUgQ0ZYSlNFX0FyZ3VtZW50czo6R2V0VmFsdWUoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0NCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBjb25zdD4odGhpcyk7DQorICBDRlhKU0VfVmFsdWUqIGxwQXJnVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZSh2ODo6SXNvbGF0ZTo6R2V0Q3VycmVudCgpKTsNCisgIEFTU0VSVChscEFyZ1ZhbHVlKTsNCisgIGxwQXJnVmFsdWUtPkZvcmNlU2V0VmFsdWUoKCpscEFyZ3VtZW50cy0+bV9wSW5mbylbaW5kZXhdKTsNCisgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBBcmdWYWx1ZSk7DQogfQ0KLUZYX0JPT0wJCQlDRlhKU0VfQXJndW1lbnRzOjpHZXRCb29sZWFuKGludDMyX3QgaW5kZXgpIGNvbnN0DQotew0KLSAgICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBjb25zdD4odGhpcyk7DQotICAgIHJldHVybiAoKmxwQXJndW1lbnRzLT5tX3BJbmZvKVtpbmRleF0tPkJvb2xlYW5WYWx1ZSgpID8gVFJVRSA6IEZBTFNFOw0KK0ZYX0JPT0wgQ0ZYSlNFX0FyZ3VtZW50czo6R2V0Qm9vbGVhbihpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPQ0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGNvbnN0Pih0aGlzKTsNCisgIHJldHVybiAoKmxwQXJndW1lbnRzLT5tX3BJbmZvKVtpbmRleF0tPkJvb2xlYW5WYWx1ZSgpID8gVFJVRSA6IEZBTFNFOw0KIH0NCi1pbnQzMl90CQlDRlhKU0VfQXJndW1lbnRzOjpHZXRJbnQzMihpbnQzMl90IGluZGV4KSBjb25zdA0KLXsNCi0gICAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oKCpscEFyZ3VtZW50cy0+bV9wSW5mbylbaW5kZXhdLT5OdW1iZXJWYWx1ZSgpKTsNCitpbnQzMl90IENGWEpTRV9Bcmd1bWVudHM6OkdldEludDMyKGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgIGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBscEFyZ3VtZW50cyA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KCgqbHBBcmd1bWVudHMtPm1fcEluZm8pW2luZGV4XS0+TnVtYmVyVmFsdWUoKSk7DQogfQ0KLUZYX0ZMT0FUCQlDRlhKU0VfQXJndW1lbnRzOjpHZXRGbG9hdChpbnQzMl90IGluZGV4KSBjb25zdA0KLXsNCi0gICAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KCgqbHBBcmd1bWVudHMtPm1fcEluZm8pW2luZGV4XS0+TnVtYmVyVmFsdWUoKSk7DQorRlhfRkxPQVQgQ0ZYSlNFX0FyZ3VtZW50czo6R2V0RmxvYXQoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0NCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBjb25zdD4odGhpcyk7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KCgqbHBBcmd1bWVudHMtPm1fcEluZm8pW2luZGV4XS0+TnVtYmVyVmFsdWUoKSk7DQogfQ0KLUNGWF9CeXRlU3RyaW5nCUNGWEpTRV9Bcmd1bWVudHM6OkdldFVURjhTdHJpbmcoaW50MzJfdCBpbmRleCkgY29uc3QNCi17DQotICAgIGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBscEFyZ3VtZW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGNvbnN0Pih0aGlzKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhTdHJpbmcgPSAoKmxwQXJndW1lbnRzLT5tX3BJbmZvKVtpbmRleF0tPlRvU3RyaW5nKCk7DQotICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSAgc3pTdHJpbmdWYWwoaFN0cmluZyk7DQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygqc3pTdHJpbmdWYWwpOw0KK0NGWF9CeXRlU3RyaW5nIENGWEpTRV9Bcmd1bWVudHM6OkdldFVURjhTdHJpbmcoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0NCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBjb25zdD4odGhpcyk7DQorICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFN0cmluZyA9ICgqbHBBcmd1bWVudHMtPm1fcEluZm8pW2luZGV4XS0+VG9TdHJpbmcoKTsNCisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelN0cmluZ1ZhbChoU3RyaW5nKTsNCisgIHJldHVybiBDRlhfQnl0ZVN0cmluZygqc3pTdHJpbmdWYWwpOw0KIH0NCi12b2lkKgkJQ0ZYSlNFX0FyZ3VtZW50czo6R2V0T2JqZWN0KGludDMyX3QgaW5kZXgsIEZYSlNFX0hDTEFTUyBoQ2xhc3MgKSBjb25zdA0KLXsNCi0gICAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSAoKmxwQXJndW1lbnRzLT5tX3BJbmZvKVtpbmRleF07DQotICAgIEFTU0VSVCghaFZhbHVlLklzRW1wdHkoKSk7DQotICAgIGlmKCFoVmFsdWUtPklzT2JqZWN0KCkpIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIENGWEpTRV9DbGFzcyogbHBDbGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NsYXNzKj4oaENsYXNzKTsNCi0gICAgcmV0dXJuIEZYSlNFX1JldHJpZXZlT2JqZWN0QmluZGluZyhoVmFsdWUuQXM8djg6Ok9iamVjdD4oKSwgbHBDbGFzcyk7DQotfQ0KLUZYSlNFX0hWQUxVRQlDRlhKU0VfQXJndW1lbnRzOjpHZXRSZXR1cm5WYWx1ZSgpDQotew0KLSAgICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBjb25zdD4odGhpcyk7DQotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBBcmd1bWVudHMtPm1fcFJldFZhbHVlKTsNCi19DQotc3RhdGljIHZvaWQgRlhKU0VfQ29udGV4dF9HbG9iYWxPYmpUb1N0cmluZyhjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykNCi17DQotICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzID0gc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KLSAgICBpZiAoIWxwQ2xhc3MpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZihpbmZvLlRoaXMoKSA9PSBpbmZvLkhvbGRlcigpICYmIGxwQ2xhc3MtPm5hbWUpIHsNCi0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN6U3RyaW5nVmFsOw0KLSAgICAgICAgc3pTdHJpbmdWYWwuRm9ybWF0KCJbb2JqZWN0ICVzXSIsIGxwQ2xhc3MtPm5hbWUpOw0KLSAgICAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChpbmZvLkdldElzb2xhdGUoKSwgKGNvbnN0IEZYX0NIQVIqKXN6U3RyaW5nVmFsLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLCBzelN0cmluZ1ZhbC5HZXRMZW5ndGgoKSkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChpbmZvLlRoaXMoKS0+T2JqZWN0UHJvdG9Ub1N0cmluZygpKTsNCi0gICAgfQ0KLX0NCi1DRlhKU0VfQ2xhc3MqIENGWEpTRV9DbGFzczo6Q3JlYXRlKENGWEpTRV9Db250ZXh0KiBscENvbnRleHQsIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW5pdGlvbiwgRlhfQk9PTCBiSXNKU0dsb2JhbCApDQotew0KLSAgICBpZighbHBDb250ZXh0IHx8ICFscENsYXNzRGVmaW5pdGlvbikgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgQ0ZYSlNFX0NsYXNzKiBwQ2xhc3MgPSBHZXRDbGFzc0Zyb21Db250ZXh0KGxwQ29udGV4dCwgbHBDbGFzc0RlZmluaXRpb24tPm5hbWUpOw0KLSAgICBpZihwQ2xhc3MpIHsNCi0gICAgICAgIHJldHVybiBwQ2xhc3M7DQotICAgIH0NCi0gICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gbHBDb250ZXh0LT5tX3BJc29sYXRlOw0KLSAgICBwQ2xhc3MgPSBGWF9ORVcgQ0ZYSlNFX0NsYXNzKGxwQ29udGV4dCk7DQotICAgIEFTU0VSVChwQ2xhc3MpOw0KLSAgICBwQ2xhc3MtPm1fc3pDbGFzc05hbWUgPSBscENsYXNzRGVmaW5pdGlvbi0+bmFtZTsNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUocElzb2xhdGUpOw0KLSAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGhGdW5jdGlvblRlbXBsYXRlID0gdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhwSXNvbGF0ZSwgYklzSlNHbG9iYWwgPyAwIDogRlhKU0VfVjhDb25zdHJ1Y3RvckNhbGxiYWNrX1dyYXBwZXIsIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSk7DQotICAgIGhGdW5jdGlvblRlbXBsYXRlLT5TZXRDbGFzc05hbWUodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKSk7DQotICAgIGhGdW5jdGlvblRlbXBsYXRlLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldEludGVybmFsRmllbGRDb3VudCgxKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaE9iamVjdFRlbXBsYXRlID0gaEZ1bmN0aW9uVGVtcGxhdGUtPkluc3RhbmNlVGVtcGxhdGUoKTsNCi0gICAgaWYgKGxwQ2xhc3NEZWZpbml0aW9uLT5keW5Qcm9wRGVsZXRlciB8fCBscENsYXNzRGVmaW5pdGlvbi0+ZHluUHJvcFR5cGVHZXR0ZXIpIHsNCi0gICAgICAgIFNldFVwTmFtZWRQcm9wSGFuZGxlcihwSXNvbGF0ZSwgaE9iamVjdFRlbXBsYXRlLCBscENsYXNzRGVmaW5pdGlvbik7DQotICAgIH0NCi0gICAgaWYobHBDbGFzc0RlZmluaXRpb24tPnByb3BOdW0pIHsNCi0gICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgbHBDbGFzc0RlZmluaXRpb24tPnByb3BOdW07IGkrKykgew0KLSAgICAgICAgICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0TmF0aXZlRGF0YVByb3BlcnR5KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBscENsYXNzRGVmaW5pdGlvbi0+cHJvcGVydGllc1tpXS5uYW1lKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbi0+cHJvcGVydGllc1tpXS5nZXRQcm9jID8gRlhKU0VfVjhHZXR0ZXJDYWxsYmFja19XcmFwcGVyIDogTlVMTCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbi0+cHJvcGVydGllc1tpXS5zZXRQcm9jID8gRlhKU0VfVjhTZXR0ZXJDYWxsYmFja19XcmFwcGVyIDogTlVMTCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgIGNvbnN0X2Nhc3Q8RlhKU0VfUFJPUEVSVFkqPihscENsYXNzRGVmaW5pdGlvbi0+cHJvcGVydGllcyArIGkpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlBdHRyaWJ1dGU+KHY4OjpEb250RGVsZXRlKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYobHBDbGFzc0RlZmluaXRpb24tPm1ldGhOdW0pIHsNCi0gICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgbHBDbGFzc0RlZmluaXRpb24tPm1ldGhOdW07IGkrKykgew0KLSAgICAgICAgICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBscENsYXNzRGVmaW5pdGlvbi0+bWV0aG9kc1tpXS5uYW1lKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOEZ1bmN0aW9uQ2FsbGJhY2tfV3JhcHBlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0ZVTkNUSU9OKj4obHBDbGFzc0RlZmluaXRpb24tPm1ldGhvZHMgKyBpKSkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OlJlYWRPbmx5IHwgdjg6OkRvbnREZWxldGUpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZihscENsYXNzRGVmaW5pdGlvbi0+Y29uc3RydWN0b3IpIHsNCi0gICAgICAgIGlmKGJJc0pTR2xvYmFsKSB7DQotICAgICAgICAgICAgaE9iamVjdFRlbXBsYXRlLT5TZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOENsYXNzR2xvYmFsQ29uc3RydWN0b3JDYWxsYmFja19XcmFwcGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlBdHRyaWJ1dGU+KHY4OjpSZWFkT25seSB8IHY4OjpEb250RGVsZXRlKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaExvY2FsQ29udGV4dCA9IHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhwSXNvbGF0ZSwgbHBDb250ZXh0LT5tX2hDb250ZXh0KTsNCi0gICAgICAgICAgICBGWEpTRV9HZXRHbG9iYWxPYmplY3RGcm9tQ29udGV4dChoTG9jYWxDb250ZXh0KS0+U2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBscENsYXNzRGVmaW5pdGlvbi0+bmFtZSksDQotICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhDbGFzc0dsb2JhbENvbnN0cnVjdG9yQ2FsbGJhY2tfV3JhcHBlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmKGJJc0pTR2xvYmFsKSB7DQotICAgICAgICBoT2JqZWN0VGVtcGxhdGUtPlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgInRvU3RyaW5nIiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcocElzb2xhdGUsIEZYSlNFX0NvbnRleHRfR2xvYmFsT2JqVG9TdHJpbmcsIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KLSAgICB9DQotICAgIHBDbGFzcy0+bV9oVGVtcGxhdGUuUmVzZXQobHBDb250ZXh0LT5tX3BJc29sYXRlLCBoRnVuY3Rpb25UZW1wbGF0ZSk7DQotICAgIGxwQ29udGV4dC0+bV9yZ0NsYXNzZXMuQWRkKHBDbGFzcyk7DQotICAgIHJldHVybiBwQ2xhc3M7DQotfQ0KLUNGWEpTRV9DbGFzcyogQ0ZYSlNFX0NsYXNzOjpHZXRDbGFzc0Zyb21Db250ZXh0KENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzek5hbWUpDQotew0KLSAgICBmb3IoaW50IGNvdW50ID0gcENvbnRleHQtPm1fcmdDbGFzc2VzLkdldFNpemUoKSwgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQotICAgICAgICBDRlhKU0VfQ2xhc3MqIHBDbGFzcyA9IHBDb250ZXh0LT5tX3JnQ2xhc3Nlc1tpXTsNCi0gICAgICAgIGlmKHBDbGFzcy0+bV9zekNsYXNzTmFtZSA9PSBzek5hbWUpIHsNCi0gICAgICAgICAgICByZXR1cm4gcENsYXNzOw0KLSAgICAgICAgfQ0KLSAgICB9DQordm9pZCogQ0ZYSlNFX0FyZ3VtZW50czo6R2V0T2JqZWN0KGludDMyX3QgaW5kZXgsIEZYSlNFX0hDTEFTUyBoQ2xhc3MpIGNvbnN0IHsNCisgIGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBscEFyZ3VtZW50cyA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gKCpscEFyZ3VtZW50cy0+bV9wSW5mbylbaW5kZXhdOw0KKyAgQVNTRVJUKCFoVmFsdWUuSXNFbXB0eSgpKTsNCisgIGlmICghaFZhbHVlLT5Jc09iamVjdCgpKSB7DQogICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYSlNFX0NsYXNzKiBscENsYXNzID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ2xhc3MqPihoQ2xhc3MpOw0KKyAgcmV0dXJuIEZYSlNFX1JldHJpZXZlT2JqZWN0QmluZGluZyhoVmFsdWUuQXM8djg6Ok9iamVjdD4oKSwgbHBDbGFzcyk7DQorfQ0KK0ZYSlNFX0hWQUxVRSBDRlhKU0VfQXJndW1lbnRzOjpHZXRSZXR1cm5WYWx1ZSgpIHsNCisgIGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBscEFyZ3VtZW50cyA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFZBTFVFPihscEFyZ3VtZW50cy0+bV9wUmV0VmFsdWUpOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9Db250ZXh0X0dsb2JhbE9ialRvU3RyaW5nKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgIGlmICghbHBDbGFzcykgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoaW5mby5UaGlzKCkgPT0gaW5mby5Ib2xkZXIoKSAmJiBscENsYXNzLT5uYW1lKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIHN6U3RyaW5nVmFsOw0KKyAgICBzelN0cmluZ1ZhbC5Gb3JtYXQoIltvYmplY3QgJXNdIiwgbHBDbGFzcy0+bmFtZSk7DQorICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoDQorICAgICAgICBpbmZvLkdldElzb2xhdGUoKSwgKGNvbnN0IEZYX0NIQVIqKXN6U3RyaW5nVmFsLA0KKyAgICAgICAgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgc3pTdHJpbmdWYWwuR2V0TGVuZ3RoKCkpKTsNCisgIH0gZWxzZSB7DQorICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoaW5mby5UaGlzKCktPk9iamVjdFByb3RvVG9TdHJpbmcoKSk7DQorICB9DQorfQ0KK0NGWEpTRV9DbGFzcyogQ0ZYSlNFX0NsYXNzOjpDcmVhdGUoQ0ZYSlNFX0NvbnRleHQqIGxwQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW5pdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzSlNHbG9iYWwpIHsNCisgIGlmICghbHBDb250ZXh0IHx8ICFscENsYXNzRGVmaW5pdGlvbikgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWEpTRV9DbGFzcyogcENsYXNzID0NCisgICAgICBHZXRDbGFzc0Zyb21Db250ZXh0KGxwQ29udGV4dCwgbHBDbGFzc0RlZmluaXRpb24tPm5hbWUpOw0KKyAgaWYgKHBDbGFzcykgew0KKyAgICByZXR1cm4gcENsYXNzOw0KKyAgfQ0KKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gbHBDb250ZXh0LT5tX3BJc29sYXRlOw0KKyAgcENsYXNzID0gRlhfTkVXIENGWEpTRV9DbGFzcyhscENvbnRleHQpOw0KKyAgQVNTRVJUKHBDbGFzcyk7DQorICBwQ2xhc3MtPm1fc3pDbGFzc05hbWUgPSBscENsYXNzRGVmaW5pdGlvbi0+bmFtZTsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKHBJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gaEZ1bmN0aW9uVGVtcGxhdGUgPSB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KA0KKyAgICAgIHBJc29sYXRlLCBiSXNKU0dsb2JhbCA/IDAgOiBGWEpTRV9WOENvbnN0cnVjdG9yQ2FsbGJhY2tfV3JhcHBlciwNCisgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KGxwQ2xhc3NEZWZpbml0aW9uKSkpOw0KKyAgaEZ1bmN0aW9uVGVtcGxhdGUtPlNldENsYXNzTmFtZSgNCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgbHBDbGFzc0RlZmluaXRpb24tPm5hbWUpKTsNCisgIGhGdW5jdGlvblRlbXBsYXRlLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldEludGVybmFsRmllbGRDb3VudCgxKTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGhPYmplY3RUZW1wbGF0ZSA9DQorICAgICAgaEZ1bmN0aW9uVGVtcGxhdGUtPkluc3RhbmNlVGVtcGxhdGUoKTsNCisgIGlmIChscENsYXNzRGVmaW5pdGlvbi0+ZHluUHJvcERlbGV0ZXIgfHwNCisgICAgICBscENsYXNzRGVmaW5pdGlvbi0+ZHluUHJvcFR5cGVHZXR0ZXIpIHsNCisgICAgU2V0VXBOYW1lZFByb3BIYW5kbGVyKHBJc29sYXRlLCBoT2JqZWN0VGVtcGxhdGUsIGxwQ2xhc3NEZWZpbml0aW9uKTsNCisgIH0NCisgIGlmIChscENsYXNzRGVmaW5pdGlvbi0+cHJvcE51bSkgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBscENsYXNzRGVmaW5pdGlvbi0+cHJvcE51bTsgaSsrKSB7DQorICAgICAgaE9iamVjdFRlbXBsYXRlLT5TZXROYXRpdmVEYXRhUHJvcGVydHkoDQorICAgICAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbi0+cHJvcGVydGllc1tpXS5uYW1lKSwNCisgICAgICAgICAgbHBDbGFzc0RlZmluaXRpb24tPnByb3BlcnRpZXNbaV0uZ2V0UHJvYw0KKyAgICAgICAgICAgICAgPyBGWEpTRV9WOEdldHRlckNhbGxiYWNrX1dyYXBwZXINCisgICAgICAgICAgICAgIDogTlVMTCwNCisgICAgICAgICAgbHBDbGFzc0RlZmluaXRpb24tPnByb3BlcnRpZXNbaV0uc2V0UHJvYw0KKyAgICAgICAgICAgICAgPyBGWEpTRV9WOFNldHRlckNhbGxiYWNrX1dyYXBwZXINCisgICAgICAgICAgICAgIDogTlVMTCwNCisgICAgICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfUFJPUEVSVFkqPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbi0+cHJvcGVydGllcyArIGkpKSwNCisgICAgICAgICAgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6RG9udERlbGV0ZSkpOw0KKyAgICB9DQorICB9DQorICBpZiAobHBDbGFzc0RlZmluaXRpb24tPm1ldGhOdW0pIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbHBDbGFzc0RlZmluaXRpb24tPm1ldGhOdW07IGkrKykgew0KKyAgICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0KA0KKyAgICAgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgbHBDbGFzc0RlZmluaXRpb24tPm1ldGhvZHNbaV0ubmFtZSksDQorICAgICAgICAgIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoDQorICAgICAgICAgICAgICBwSXNvbGF0ZSwgRlhKU0VfVjhGdW5jdGlvbkNhbGxiYWNrX1dyYXBwZXIsDQorICAgICAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9GVU5DVElPTio+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbi0+bWV0aG9kcyArIGkpKSksDQorICAgICAgICAgIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OlJlYWRPbmx5IHwgdjg6OkRvbnREZWxldGUpKTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGxwQ2xhc3NEZWZpbml0aW9uLT5jb25zdHJ1Y3Rvcikgew0KKyAgICBpZiAoYklzSlNHbG9iYWwpIHsNCisgICAgICBoT2JqZWN0VGVtcGxhdGUtPlNldCgNCisgICAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKSwNCisgICAgICAgICAgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldygNCisgICAgICAgICAgICAgIHBJc29sYXRlLCBGWEpTRV9WOENsYXNzR2xvYmFsQ29uc3RydWN0b3JDYWxsYmFja19XcmFwcGVyLA0KKyAgICAgICAgICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSksDQorICAgICAgICAgIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OlJlYWRPbmx5IHwgdjg6OkRvbnREZWxldGUpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGhMb2NhbENvbnRleHQgPQ0KKyAgICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcocElzb2xhdGUsIGxwQ29udGV4dC0+bV9oQ29udGV4dCk7DQorICAgICAgRlhKU0VfR2V0R2xvYmFsT2JqZWN0RnJvbUNvbnRleHQoaExvY2FsQ29udGV4dCkNCisgICAgICAgICAgLT5TZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKSwNCisgICAgICAgICAgICAgICAgdjg6OkZ1bmN0aW9uOjpOZXcoDQorICAgICAgICAgICAgICAgICAgICBwSXNvbGF0ZSwgRlhKU0VfVjhDbGFzc0dsb2JhbENvbnN0cnVjdG9yQ2FsbGJhY2tfV3JhcHBlciwNCisgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uKSkpKTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJJc0pTR2xvYmFsKSB7DQorICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0KA0KKyAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJ0b1N0cmluZyIpLA0KKyAgICAgICAgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldygNCisgICAgICAgICAgICBwSXNvbGF0ZSwgRlhKU0VfQ29udGV4dF9HbG9iYWxPYmpUb1N0cmluZywNCisgICAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KKyAgfQ0KKyAgcENsYXNzLT5tX2hUZW1wbGF0ZS5SZXNldChscENvbnRleHQtPm1fcElzb2xhdGUsIGhGdW5jdGlvblRlbXBsYXRlKTsNCisgIGxwQ29udGV4dC0+bV9yZ0NsYXNzZXMuQWRkKHBDbGFzcyk7DQorICByZXR1cm4gcENsYXNzOw0KK30NCitDRlhKU0VfQ2xhc3MqIENGWEpTRV9DbGFzczo6R2V0Q2xhc3NGcm9tQ29udGV4dChDRlhKU0VfQ29udGV4dCogcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzek5hbWUpIHsNCisgIGZvciAoaW50IGNvdW50ID0gcENvbnRleHQtPm1fcmdDbGFzc2VzLkdldFNpemUoKSwgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgIENGWEpTRV9DbGFzcyogcENsYXNzID0gcENvbnRleHQtPm1fcmdDbGFzc2VzW2ldOw0KKyAgICBpZiAocENsYXNzLT5tX3N6Q2xhc3NOYW1lID09IHN6TmFtZSkgew0KKyAgICAgIHJldHVybiBwQ2xhc3M7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KIH0NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4anNlL3NyYy9jbGFzcy5oIGIveGZhL3NyYy9meGpzZS9zcmMvY2xhc3MuaAppbmRleCAzMDk5NzhlLi5iYjJkMWI0IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4anNlL3NyYy9jbGFzcy5oCisrKyBiL3hmYS9zcmMvZnhqc2Uvc3JjL2NsYXNzLmgKQEAgLTgsMzMgKzgsMzcgQEAKICNkZWZpbmUgRlhKU0VfQ0xBU1NfSF8NCiBjbGFzcyBDRlhKU0VfQ29udGV4dDsNCiBjbGFzcyBDRlhKU0VfVmFsdWU7DQotY2xhc3MgQ0ZYSlNFX0NsYXNzDQotew0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYSlNFX0NsYXNzKENGWEpTRV9Db250ZXh0KiBscENvbnRleHQpIDogbV9wQ29udGV4dChscENvbnRleHQpIHt9DQotcHVibGljOg0KLSAgICBpbmxpbmUgQ0ZYSlNFX0NvbnRleHQqIEdldENvbnRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wQ29udGV4dDsNCi0gICAgfQ0KLSAgICBpbmxpbmUgdjg6Okdsb2JhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4mIEdldFRlbXBsYXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1faFRlbXBsYXRlOw0KLSAgICB9DQotcHVibGljOg0KLSAgICBzdGF0aWMgQ0ZYSlNFX0NsYXNzKiBDcmVhdGUoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0LCBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzc0RlZmludGlvbiwgRlhfQk9PTCBiSXNKU0dsb2JhbCA9IEZBTFNFKTsNCi0gICAgc3RhdGljIENGWEpTRV9DbGFzcyogR2V0Q2xhc3NGcm9tQ29udGV4dChDRlhKU0VfQ29udGV4dCogcENvbnRleHQsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pOYW1lKTsNCi0gICAgc3RhdGljIHZvaWQgU2V0VXBEeW5Qcm9wSGFuZGxlcihDRlhKU0VfQ29udGV4dCogcENvbnRleHQsIENGWEpTRV9WYWx1ZSogcFZhbHVlLCBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzc0RlZmluaXRpb24pOw0KLSAgICBzdGF0aWMgdm9pZCBTZXRVcE5hbWVkUHJvcEhhbmRsZXIodjg6Oklzb2xhdGUqIHBJc29sYXRlLCB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiYgaE9iamVjdFRlbXBsYXRlLCBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzc0RlZmluaXRpb24pOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQkJCQkJbV9zekNsYXNzTmFtZTsNCi0gICAgQ0ZYSlNFX0NvbnRleHQqCQkJCQkJCW1fcENvbnRleHQ7DQotICAgIHY4OjpHbG9iYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+CW1faFRlbXBsYXRlOw0KLSAgICBmcmllbmQgY2xhc3MgQ0ZYSlNFX0NvbnRleHQ7DQotICAgIGZyaWVuZCBjbGFzcyBDRlhKU0VfVmFsdWU7DQorY2xhc3MgQ0ZYSlNFX0NsYXNzIHsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYSlNFX0NsYXNzKENGWEpTRV9Db250ZXh0KiBscENvbnRleHQpIDogbV9wQ29udGV4dChscENvbnRleHQpIHt9DQorDQorIHB1YmxpYzoNCisgIGlubGluZSBDRlhKU0VfQ29udGV4dCogR2V0Q29udGV4dCgpIHsgcmV0dXJuIG1fcENvbnRleHQ7IH0NCisgIGlubGluZSB2ODo6R2xvYmFsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiYgR2V0VGVtcGxhdGUoKSB7IHJldHVybiBtX2hUZW1wbGF0ZTsgfQ0KKw0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZYSlNFX0NsYXNzKiBDcmVhdGUoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW50aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzSlNHbG9iYWwgPSBGQUxTRSk7DQorICBzdGF0aWMgQ0ZYSlNFX0NsYXNzKiBHZXRDbGFzc0Zyb21Db250ZXh0KENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzek5hbWUpOw0KKyAgc3RhdGljIHZvaWQgU2V0VXBEeW5Qcm9wSGFuZGxlcihDRlhKU0VfQ29udGV4dCogcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzc0RlZmluaXRpb24pOw0KKyAgc3RhdGljIHZvaWQgU2V0VXBOYW1lZFByb3BIYW5kbGVyKA0KKyAgICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwNCisgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiYgaE9iamVjdFRlbXBsYXRlLA0KKyAgICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW5pdGlvbik7DQorDQorIHByb3RlY3RlZDoNCisgIENGWF9CeXRlU3RyaW5nIG1fc3pDbGFzc05hbWU7DQorICBDRlhKU0VfQ29udGV4dCogbV9wQ29udGV4dDsNCisgIHY4OjpHbG9iYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IG1faFRlbXBsYXRlOw0KKyAgZnJpZW5kIGNsYXNzIENGWEpTRV9Db250ZXh0Ow0KKyAgZnJpZW5kIGNsYXNzIENGWEpTRV9WYWx1ZTsNCiB9Ow0KIHN0cnVjdCBDRlhKU0VfQXJndW1lbnRzSW1wbCB7DQotICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+KgltX3BJbmZvOw0KLSAgICBDRlhKU0VfVmFsdWUqCQkJCQkJCQltX3BSZXRWYWx1ZTsNCisgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+KiBtX3BJbmZvOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBtX3BSZXRWYWx1ZTsNCiB9Ow0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL2NvbnRleHQuY3BwIGIveGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5jcHAKaW5kZXggM2FlZTczMi4uY2M4ZjZjZiAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5jcHAKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5jcHAKQEAgLTExLDMzICsxMSwzMyBAQAogI2luY2x1ZGUgInZhbHVlLmgiDQogI2luY2x1ZGUgInNjb3BlX2lubGluZS5oIg0KICNpbmNsdWRlICJ1dGlsX2lubGluZS5oIg0KLUZYSlNFX0hDT05URVhUCUZYSlNFX0NvbnRleHRfQ3JlYXRlKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lLCBjb25zdCBGWEpTRV9DTEFTUyogbHBHbG9iYWxDbGFzcyAsIHZvaWQqIGxwR2xvYmFsT2JqZWN0ICkNCi17DQotICAgIENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCA9IENGWEpTRV9Db250ZXh0OjpDcmVhdGUocmVpbnRlcnByZXRfY2FzdDx2ODo6SXNvbGF0ZSo+KGhSdW50aW1lKSwgbHBHbG9iYWxDbGFzcywgbHBHbG9iYWxPYmplY3QpOw0KLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IQ09OVEVYVD4ocENvbnRleHQpOw0KK0ZYSlNFX0hDT05URVhUIEZYSlNFX0NvbnRleHRfQ3JlYXRlKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscEdsb2JhbENsYXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxwR2xvYmFsT2JqZWN0KSB7DQorICBDRlhKU0VfQ29udGV4dCogcENvbnRleHQgPSBDRlhKU0VfQ29udGV4dDo6Q3JlYXRlKA0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8djg6Oklzb2xhdGUqPihoUnVudGltZSksIGxwR2xvYmFsQ2xhc3MsIGxwR2xvYmFsT2JqZWN0KTsNCisgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hDT05URVhUPihwQ29udGV4dCk7DQogfQ0KLXZvaWQgRlhKU0VfQ29udGV4dF9SZWxlYXNlKEZYSlNFX0hDT05URVhUIGhDb250ZXh0KQ0KLXsNCi0gICAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCi0gICAgaWYocENvbnRleHQpIHsNCi0gICAgICAgIGRlbGV0ZSBwQ29udGV4dDsNCi0gICAgfQ0KK3ZvaWQgRlhKU0VfQ29udGV4dF9SZWxlYXNlKEZYSlNFX0hDT05URVhUIGhDb250ZXh0KSB7DQorICBDRlhKU0VfQ29udGV4dCogcENvbnRleHQgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9Db250ZXh0Kj4oaENvbnRleHQpOw0KKyAgaWYgKHBDb250ZXh0KSB7DQorICAgIGRlbGV0ZSBwQ29udGV4dDsNCisgIH0NCiB9DQotRlhKU0VfSFZBTFVFIEZYSlNFX0NvbnRleHRfR2V0R2xvYmFsT2JqZWN0KEZYSlNFX0hDT05URVhUIGhDb250ZXh0KQ0KLXsNCi0gICAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCi0gICAgaWYoIXBDb250ZXh0KSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShwQ29udGV4dC0+R2V0UnVudGltZSgpKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUpOw0KLSAgICBwQ29udGV4dC0+R2V0R2xvYmFsT2JqZWN0KGxwVmFsdWUpOw0KLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwVmFsdWUpOw0KK0ZYSlNFX0hWQUxVRSBGWEpTRV9Db250ZXh0X0dldEdsb2JhbE9iamVjdChGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCkgew0KKyAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCisgIGlmICghcENvbnRleHQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShwQ29udGV4dC0+R2V0UnVudGltZSgpKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHBDb250ZXh0LT5HZXRHbG9iYWxPYmplY3QobHBWYWx1ZSk7DQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwVmFsdWUpOw0KIH0NCi1GWEpTRV9IUlVOVElNRSAgRlhKU0VfQ29udGV4dF9HZXRSdW50aW1lKEZYSlNFX0hDT05URVhUIGhDb250ZXh0KQ0KLXsNCi0gICAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCi0gICAgcmV0dXJuIHBDb250ZXh0ID8gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IUlVOVElNRT4ocENvbnRleHQtPkdldFJ1bnRpbWUoKSkgOiBOVUxMOw0KK0ZYSlNFX0hSVU5USU1FIEZYSlNFX0NvbnRleHRfR2V0UnVudGltZShGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCkgew0KKyAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCisgIHJldHVybiBwQ29udGV4dCA/IHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFJVTlRJTUU+KHBDb250ZXh0LT5HZXRSdW50aW1lKCkpDQorICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KIH0NCiBzdGF0aWMgY29uc3QgRlhfQ0hBUiogc3pDb21wYXRpYmxlTW9kZVNjcmlwdHNbXSA9IHsNCiAgICAgIihmdW5jdGlvbiAoZ2xvYmFsLCBsaXN0KSB7ICd1c2Ugc3RyaWN0JzsgdmFyIG9iam5hbWU7IGZvciAob2JqbmFtZSBpbiBsaXN0KSB7IHZhciBnbG9iYWxvYmogPSBnbG9iYWxbb2JqbmFtZV07XG5cDQpAQCAtNDksMTc2ICs0OSwyMDMgQEAKIAlyZXR1cm4gZ2xvYmFsb2JqLnByb3RvdHlwZVtuYW1lXS5hcHBseShvYmosIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xuXA0KIH0pfSk7fX0pO319fSh0aGlzLCB7U3RyaW5nOiBbJ3N1YnN0cicsICd0b1VwcGVyQ2FzZSddfSkpOyIsDQogfTsNCi12b2lkIEZYSlNFX0NvbnRleHRfRW5hYmxlQ29tcGF0aWJsZU1vZGUoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsIEZYX0RXT1JEIGR3Q29tcGF0aWJsZUZsYWdzKQ0KLXsNCi0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICh1aW50MzJfdClGWEpTRV9DT01QQVRJQkxFTU9ERUZMQUdDT1VOVDsgaSsrKSB7DQotICAgICAgICBpZiAoZHdDb21wYXRpYmxlRmxhZ3MgJiAoMSA8PCBpKSkgew0KLSAgICAgICAgICAgIEZYSlNFX0V4ZWN1dGVTY3JpcHQoaENvbnRleHQsIHN6Q29tcGF0aWJsZU1vZGVTY3JpcHRzW2ldLCBOVUxMLCBOVUxMKTsNCi0gICAgICAgIH0NCit2b2lkIEZYSlNFX0NvbnRleHRfRW5hYmxlQ29tcGF0aWJsZU1vZGUoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q29tcGF0aWJsZUZsYWdzKSB7DQorICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgKHVpbnQzMl90KUZYSlNFX0NPTVBBVElCTEVNT0RFRkxBR0NPVU5UOyBpKyspIHsNCisgICAgaWYgKGR3Q29tcGF0aWJsZUZsYWdzICYgKDEgPDwgaSkpIHsNCisgICAgICBGWEpTRV9FeGVjdXRlU2NyaXB0KGhDb250ZXh0LCBzekNvbXBhdGlibGVNb2RlU2NyaXB0c1tpXSwgTlVMTCwgTlVMTCk7DQogICAgIH0NCisgIH0NCiB9DQotRlhfQk9PTAlGWEpTRV9FeGVjdXRlU2NyaXB0KEZYSlNFX0hDT05URVhUIGhDb250ZXh0LCBjb25zdCBGWF9DSEFSKiBzelNjcmlwdCwgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwgRlhKU0VfSFZBTFVFIGhOZXdUaGlzT2JqZWN0ICkNCi17DQotICAgIENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NvbnRleHQqPihoQ29udGV4dCk7DQotICAgIEFTU0VSVChwQ29udGV4dCk7DQotICAgIHJldHVybiBwQ29udGV4dC0+RXhlY3V0ZVNjcmlwdChzelNjcmlwdCwgcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUmV0VmFsdWUpLCByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhOZXdUaGlzT2JqZWN0KSk7DQorRlhfQk9PTCBGWEpTRV9FeGVjdXRlU2NyaXB0KEZYSlNFX0hDT05URVhUIGhDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBzelNjcmlwdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhOZXdUaGlzT2JqZWN0KSB7DQorICBDRlhKU0VfQ29udGV4dCogcENvbnRleHQgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9Db250ZXh0Kj4oaENvbnRleHQpOw0KKyAgQVNTRVJUKHBDb250ZXh0KTsNCisgIHJldHVybiBwQ29udGV4dC0+RXhlY3V0ZVNjcmlwdCgNCisgICAgICBzelNjcmlwdCwgcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUmV0VmFsdWUpLA0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaE5ld1RoaXNPYmplY3QpKTsNCiB9DQotdjg6OkxvY2FsPHY4OjpPYmplY3Q+IEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgdjg6OlRyeUNhdGNoJiB0cnljYXRjaCkNCi17DQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoUmV0dXJuVmFsdWUgPSB2ODo6T2JqZWN0OjpOZXcocElzb2xhdGUpOw0KLSAgICBpZiAodHJ5Y2F0Y2guSGFzQ2F1Z2h0KCkpIHsNCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhFeGNlcHRpb24gPSB0cnljYXRjaC5FeGNlcHRpb24oKTsNCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6TWVzc2FnZT4gaE1lc3NhZ2UgPSB0cnljYXRjaC5NZXNzYWdlKCk7DQotICAgICAgICBpZiAoaEV4Y2VwdGlvbi0+SXNPYmplY3QoKSkgew0KLSAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZTsNCi0gICAgICAgICAgICBoVmFsdWUgPSBoRXhjZXB0aW9uLkFzPHY4OjpPYmplY3Q+KCktPkdldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgIm5hbWUiKSk7DQotICAgICAgICAgICAgaWYoaFZhbHVlLT5Jc1N0cmluZygpIHx8IGhWYWx1ZS0+SXNTdHJpbmdPYmplY3QoKSkgew0KLSAgICAgICAgICAgICAgICBoUmV0dXJuVmFsdWUtPlNldCgwLCBoVmFsdWUpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDAsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiRXJyb3IiKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGhWYWx1ZSA9IGhFeGNlcHRpb24uQXM8djg6Ok9iamVjdD4oKS0+R2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAibWVzc2FnZSIpKTsNCi0gICAgICAgICAgICBpZihoVmFsdWUtPklzU3RyaW5nKCkgfHwgaFZhbHVlLT5Jc1N0cmluZ09iamVjdCgpKSB7DQotICAgICAgICAgICAgICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDEsIGhWYWx1ZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaFJldHVyblZhbHVlLT5TZXQoMSwgaE1lc3NhZ2UtPkdldCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDAsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiRXJyb3IiKSk7DQotICAgICAgICAgICAgaFJldHVyblZhbHVlLT5TZXQoMSwgaE1lc3NhZ2UtPkdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDIsIGhFeGNlcHRpb24pOw0KLSAgICAgICAgaFJldHVyblZhbHVlLT5TZXQoMywgdjg6OkludGVnZXI6Ok5ldyhwSXNvbGF0ZSwgaE1lc3NhZ2UtPkdldExpbmVOdW1iZXIoKSkpOw0KLSAgICAgICAgaFJldHVyblZhbHVlLT5TZXQoNCwgaE1lc3NhZ2UtPkdldFNvdXJjZUxpbmUoKSk7DQotICAgICAgICBoUmV0dXJuVmFsdWUtPlNldCg1LCB2ODo6SW50ZWdlcjo6TmV3KHBJc29sYXRlLCBoTWVzc2FnZS0+R2V0U3RhcnRDb2x1bW4oKSkpOw0KLSAgICAgICAgaFJldHVyblZhbHVlLT5TZXQoNiwgdjg6OkludGVnZXI6Ok5ldyhwSXNvbGF0ZSwgaE1lc3NhZ2UtPkdldEVuZENvbHVtbigpKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIGhSZXR1cm5WYWx1ZTsNCi19DQotRlhfQk9PTAlGWEpTRV9SZXR1cm5WYWx1ZV9HZXRNZXNzYWdlKEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsIENGWF9CeXRlU3RyaW5nJiB1dGY4TmFtZSwgQ0ZYX0J5dGVTdHJpbmcmIHV0ZjhNZXNzYWdlKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUmV0VmFsdWUpOw0KLSAgICBpZighbHBWYWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGxwVmFsdWUtPkdldElzb2xhdGUoKTsNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUocElzb2xhdGUpOw0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KHBJc29sYXRlLCBscFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCi0gICAgaWYoIWhWYWx1ZS0+SXNPYmplY3QoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBoU3RyaW5nVmFsMChoVmFsdWUuQXM8djg6Ok9iamVjdD4oKS0+R2V0KDApLT5Ub1N0cmluZygpKTsNCi0gICAgdXRmOE5hbWUgPSAqaFN0cmluZ1ZhbDA7DQotICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBoU3RyaW5nVmFsMShoVmFsdWUuQXM8djg6Ok9iamVjdD4oKS0+R2V0KDEpLT5Ub1N0cmluZygpKTsNCi0gICAgdXRmOE1lc3NhZ2UgPSAqaFN0cmluZ1ZhbDE7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIEZYSlNFX1JldHVyblZhbHVlX0dldExpbmVJbmZvKEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsIGludDMyX3QmIG5MaW5lLCBpbnQzMl90JiBuQ29sKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUmV0VmFsdWUpOw0KLSAgICBpZighbHBWYWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGxwVmFsdWUtPkdldElzb2xhdGUoKTsNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUocElzb2xhdGUpOw0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KHBJc29sYXRlLCBscFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCi0gICAgaWYoIWhWYWx1ZS0+SXNPYmplY3QoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG5MaW5lID0gaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCktPkdldCgzKS0+VG9JbnQzMigpLT5WYWx1ZSgpOw0KLSAgICBuQ29sID0gaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCktPkdldCg1KS0+VG9JbnQzMigpLT5WYWx1ZSgpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotQ0ZYSlNFX0NvbnRleHQqIENGWEpTRV9Db250ZXh0OjpDcmVhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlLCBjb25zdCBGWEpTRV9DTEFTUyogbHBHbG9iYWxDbGFzcyAsIHZvaWQqIGxwR2xvYmFsT2JqZWN0ICkNCi17DQotICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShwSXNvbGF0ZSk7DQotICAgIENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCA9IEZYX05FVyBDRlhKU0VfQ29udGV4dChwSXNvbGF0ZSk7DQotICAgIENGWEpTRV9DbGFzcyogbHBHbG9iYWxDbGFzc09iaiA9IE5VTEw7DQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGhPYmplY3RUZW1wbGF0ZTsNCi0gICAgaWYobHBHbG9iYWxDbGFzcykgew0KLSAgICAgICAgbHBHbG9iYWxDbGFzc09iaiA9IENGWEpTRV9DbGFzczo6Q3JlYXRlKHBDb250ZXh0LCBscEdsb2JhbENsYXNzLCBUUlVFKTsNCi0gICAgICAgIEFTU0VSVChscEdsb2JhbENsYXNzT2JqKTsNCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gaEZ1bmN0aW9uVGVtcGxhdGUgPSB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+OjpOZXcocElzb2xhdGUsIGxwR2xvYmFsQ2xhc3NPYmotPm1faFRlbXBsYXRlKTsNCi0gICAgICAgIGhPYmplY3RUZW1wbGF0ZSA9IGhGdW5jdGlvblRlbXBsYXRlLT5JbnN0YW5jZVRlbXBsYXRlKCk7DQordjg6OkxvY2FsPHY4OjpPYmplY3Q+IEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlRyeUNhdGNoJiB0cnljYXRjaCkgew0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhSZXR1cm5WYWx1ZSA9IHY4OjpPYmplY3Q6Ok5ldyhwSXNvbGF0ZSk7DQorICBpZiAodHJ5Y2F0Y2guSGFzQ2F1Z2h0KCkpIHsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaEV4Y2VwdGlvbiA9IHRyeWNhdGNoLkV4Y2VwdGlvbigpOw0KKyAgICB2ODo6TG9jYWw8djg6Ok1lc3NhZ2U+IGhNZXNzYWdlID0gdHJ5Y2F0Y2guTWVzc2FnZSgpOw0KKyAgICBpZiAoaEV4Y2VwdGlvbi0+SXNPYmplY3QoKSkgew0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZTsNCisgICAgICBoVmFsdWUgPSBoRXhjZXB0aW9uLkFzPHY4OjpPYmplY3Q+KCktPkdldCgNCisgICAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJuYW1lIikpOw0KKyAgICAgIGlmIChoVmFsdWUtPklzU3RyaW5nKCkgfHwgaFZhbHVlLT5Jc1N0cmluZ09iamVjdCgpKSB7DQorICAgICAgICBoUmV0dXJuVmFsdWUtPlNldCgwLCBoVmFsdWUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBoUmV0dXJuVmFsdWUtPlNldCgwLCB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgIkVycm9yIikpOw0KKyAgICAgIH0NCisgICAgICBoVmFsdWUgPSBoRXhjZXB0aW9uLkFzPHY4OjpPYmplY3Q+KCktPkdldCgNCisgICAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJtZXNzYWdlIikpOw0KKyAgICAgIGlmIChoVmFsdWUtPklzU3RyaW5nKCkgfHwgaFZhbHVlLT5Jc1N0cmluZ09iamVjdCgpKSB7DQorICAgICAgICBoUmV0dXJuVmFsdWUtPlNldCgxLCBoVmFsdWUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBoUmV0dXJuVmFsdWUtPlNldCgxLCBoTWVzc2FnZS0+R2V0KCkpOw0KKyAgICAgIH0NCiAgICAgfSBlbHNlIHsNCi0gICAgICAgIGhPYmplY3RUZW1wbGF0ZSA9IHY4OjpPYmplY3RUZW1wbGF0ZTo6TmV3KCk7DQotICAgICAgICBoT2JqZWN0VGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3VudCgxKTsNCisgICAgICBoUmV0dXJuVmFsdWUtPlNldCgwLCB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgIkVycm9yIikpOw0KKyAgICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDEsIGhNZXNzYWdlLT5HZXQoKSk7DQogICAgIH0NCi0gICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBoTmV3Q29udGV4dCA9IHY4OjpDb250ZXh0OjpOZXcocElzb2xhdGUsIE5VTEwsIGhPYmplY3RUZW1wbGF0ZSk7DQotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaFJvb3RDb250ZXh0ID0gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KHBJc29sYXRlLCBDRlhKU0VfUnVudGltZURhdGE6OkdldChwSXNvbGF0ZSktPm1faFJvb3RDb250ZXh0KTsNCi0gICAgaE5ld0NvbnRleHQtPlNldFNlY3VyaXR5VG9rZW4oaFJvb3RDb250ZXh0LT5HZXRTZWN1cml0eVRva2VuKCkpOw0KLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaEdsb2JhbE9iamVjdCA9IEZYSlNFX0dldEdsb2JhbE9iamVjdEZyb21Db250ZXh0KGhOZXdDb250ZXh0KTsNCi0gICAgRlhKU0VfVXBkYXRlT2JqZWN0QmluZGluZyhoR2xvYmFsT2JqZWN0LCBscEdsb2JhbE9iamVjdCk7DQotICAgIHBDb250ZXh0LT5tX2hDb250ZXh0LlJlc2V0KHBJc29sYXRlLCBoTmV3Q29udGV4dCk7DQotICAgIGlmIChscEdsb2JhbENsYXNzKSB7DQotICAgICAgICBpZihscEdsb2JhbENsYXNzLT5keW5NZXRob2RDYWxsIHx8IGxwR2xvYmFsQ2xhc3MtPmR5blByb3BHZXR0ZXIgfHwgbHBHbG9iYWxDbGFzcy0+ZHluUHJvcFNldHRlciB8fCBscEdsb2JhbENsYXNzLT5keW5Qcm9wVHlwZUdldHRlcikgew0KLSAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShwSXNvbGF0ZSk7DQotICAgICAgICAgICAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaEdsb2JhbE9iamVjdCk7DQotICAgICAgICAgICAgQ0ZYSlNFX0NsYXNzOjpTZXRVcER5blByb3BIYW5kbGVyKHBDb250ZXh0LCBscFRoaXNWYWx1ZSwgbHBHbG9iYWxDbGFzcyk7DQotICAgICAgICAgICAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KLSAgICAgICAgICAgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcENvbnRleHQ7DQorICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDIsIGhFeGNlcHRpb24pOw0KKyAgICBoUmV0dXJuVmFsdWUtPlNldCgzLCB2ODo6SW50ZWdlcjo6TmV3KHBJc29sYXRlLCBoTWVzc2FnZS0+R2V0TGluZU51bWJlcigpKSk7DQorICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDQsIGhNZXNzYWdlLT5HZXRTb3VyY2VMaW5lKCkpOw0KKyAgICBoUmV0dXJuVmFsdWUtPlNldCg1LA0KKyAgICAgICAgICAgICAgICAgICAgICB2ODo6SW50ZWdlcjo6TmV3KHBJc29sYXRlLCBoTWVzc2FnZS0+R2V0U3RhcnRDb2x1bW4oKSkpOw0KKyAgICBoUmV0dXJuVmFsdWUtPlNldCg2LCB2ODo6SW50ZWdlcjo6TmV3KHBJc29sYXRlLCBoTWVzc2FnZS0+R2V0RW5kQ29sdW1uKCkpKTsNCisgIH0NCisgIHJldHVybiBoUmV0dXJuVmFsdWU7DQogfQ0KLUNGWEpTRV9Db250ZXh0Ojp+Q0ZYSlNFX0NvbnRleHQoKQ0KLXsNCi0gICAgZm9yKGludDMyX3QgaSA9IDAsIGNvdW50ID0gbV9yZ0NsYXNzZXMuR2V0U2l6ZSgpOyBpIDwgY291bnQ7IGkrKykgew0KLSAgICAgICAgQ0ZYSlNFX0NsYXNzKiBwQ2xhc3MgPSBtX3JnQ2xhc3Nlc1tpXTsNCi0gICAgICAgIGlmKHBDbGFzcykgew0KLSAgICAgICAgICAgIGRlbGV0ZSBwQ2xhc3M7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgbV9yZ0NsYXNzZXMuUmVtb3ZlQWxsKCk7DQorRlhfQk9PTCBGWEpTRV9SZXR1cm5WYWx1ZV9HZXRNZXNzYWdlKEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiB1dGY4TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHV0ZjhNZXNzYWdlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhSZXRWYWx1ZSk7DQorICBpZiAoIWxwVmFsdWUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gbHBWYWx1ZS0+R2V0SXNvbGF0ZSgpOw0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUocElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KHBJc29sYXRlLCBscFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgIGlmICghaFZhbHVlLT5Jc09iamVjdCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBoU3RyaW5nVmFsMCgNCisgICAgICBoVmFsdWUuQXM8djg6Ok9iamVjdD4oKS0+R2V0KDApLT5Ub1N0cmluZygpKTsNCisgIHV0ZjhOYW1lID0gKmhTdHJpbmdWYWwwOw0KKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIGhTdHJpbmdWYWwxKA0KKyAgICAgIGhWYWx1ZS5Bczx2ODo6T2JqZWN0PigpLT5HZXQoMSktPlRvU3RyaW5nKCkpOw0KKyAgdXRmOE1lc3NhZ2UgPSAqaFN0cmluZ1ZhbDE7DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDRlhKU0VfQ29udGV4dDo6R2V0R2xvYmFsT2JqZWN0KENGWEpTRV9WYWx1ZSogcFZhbHVlKQ0KLXsNCi0gICAgQVNTRVJUKHBWYWx1ZSk7DQotICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQgc2NvcGUodGhpcyk7DQotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaENvbnRleHQgPSB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcobV9wSXNvbGF0ZSwgbV9oQ29udGV4dCk7DQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoR2xvYmFsT2JqZWN0ID0gaENvbnRleHQtPkdsb2JhbCgpOw0KLSAgICBwVmFsdWUtPkZvcmNlU2V0VmFsdWUoaEdsb2JhbE9iamVjdCk7DQorRlhfQk9PTCBGWEpTRV9SZXR1cm5WYWx1ZV9HZXRMaW5lSW5mbyhGWEpTRV9IVkFMVUUgaFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ29sKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhSZXRWYWx1ZSk7DQorICBpZiAoIWxwVmFsdWUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gbHBWYWx1ZS0+R2V0SXNvbGF0ZSgpOw0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUocElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KHBJc29sYXRlLCBscFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgIGlmICghaFZhbHVlLT5Jc09iamVjdCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG5MaW5lID0gaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCktPkdldCgzKS0+VG9JbnQzMigpLT5WYWx1ZSgpOw0KKyAgbkNvbCA9IGhWYWx1ZS5Bczx2ODo6T2JqZWN0PigpLT5HZXQoNSktPlRvSW50MzIoKS0+VmFsdWUoKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi1GWF9CT09MCUNGWEpTRV9Db250ZXh0OjpFeGVjdXRlU2NyaXB0KGNvbnN0IEZYX0NIQVIqIHN6U2NyaXB0LCBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUsIENGWEpTRV9WYWx1ZSogbHBOZXdUaGlzT2JqZWN0ICkNCi17DQotICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQgc2NvcGUodGhpcyk7DQotICAgIHY4OjpUcnlDYXRjaAkJCXRyeWNhdGNoOw0KLSAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4JaFNjcmlwdFN0cmluZyA9IHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsIHN6U2NyaXB0KTsNCi0gICAgaWYobHBOZXdUaGlzT2JqZWN0ID09IE5VTEwpIHsNCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6U2NyaXB0PiBoU2NyaXB0ID0gdjg6OlNjcmlwdDo6Q29tcGlsZShoU2NyaXB0U3RyaW5nKTsNCi0gICAgICAgIGlmKCF0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KLSAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IGhTY3JpcHQtPlJ1bigpOw0KLSAgICAgICAgICAgIGlmKCF0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KLSAgICAgICAgICAgICAgICBpZihscFJldFZhbHVlKSB7DQotICAgICAgICAgICAgICAgICAgICBscFJldFZhbHVlLT5tX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGxwUmV0VmFsdWUpIHsNCi0gICAgICAgICAgICBscFJldFZhbHVlLT5tX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZShtX3BJc29sYXRlLCB0cnljYXRjaCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4JaE5ld1RoaXMgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwTmV3VGhpc09iamVjdC0+bV9oVmFsdWUpOw0KLSAgICAgICAgQVNTRVJUKCFoTmV3VGhpcy5Jc0VtcHR5KCkpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpTY3JpcHQ+CWhXcmFwcGVyID0gdjg6OlNjcmlwdDo6Q29tcGlsZSh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCAiKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2YWwoYXJndW1lbnRzWzBdKTsgfSkiKSk7DQotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPgloV3JhcHBlclZhbHVlID0gaFdyYXBwZXItPlJ1bigpOw0KLSAgICAgICAgQVNTRVJUKGhXcmFwcGVyVmFsdWUtPklzRnVuY3Rpb24oKSk7DQotICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPgloV3JhcHBlckZuICAgID0gaFdyYXBwZXJWYWx1ZS5Bczx2ODo6RnVuY3Rpb24+KCk7DQotICAgICAgICBpZighdHJ5Y2F0Y2guSGFzQ2F1Z2h0KCkpIHsNCi0gICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZ0FyZ3NbXSA9IHtoU2NyaXB0U3RyaW5nfTsNCi0gICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSBoV3JhcHBlckZuLT5DYWxsKGhOZXdUaGlzLkFzPHY4OjpPYmplY3Q+KCksIDEsIHJnQXJncyk7DQotICAgICAgICAgICAgaWYoIXRyeWNhdGNoLkhhc0NhdWdodCgpKSB7DQotICAgICAgICAgICAgICAgIGlmKGxwUmV0VmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxwUmV0VmFsdWUtPm1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhWYWx1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYobHBSZXRWYWx1ZSkgew0KLSAgICAgICAgICAgIGxwUmV0VmFsdWUtPm1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKG1fcElzb2xhdGUsIHRyeWNhdGNoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRkFMU0U7DQorQ0ZYSlNFX0NvbnRleHQqIENGWEpTRV9Db250ZXh0OjpDcmVhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscEdsb2JhbENsYXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxwR2xvYmFsT2JqZWN0KSB7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUocElzb2xhdGUpOw0KKyAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0ID0gRlhfTkVXIENGWEpTRV9Db250ZXh0KHBJc29sYXRlKTsNCisgIENGWEpTRV9DbGFzcyogbHBHbG9iYWxDbGFzc09iaiA9IE5VTEw7DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBoT2JqZWN0VGVtcGxhdGU7DQorICBpZiAobHBHbG9iYWxDbGFzcykgew0KKyAgICBscEdsb2JhbENsYXNzT2JqID0gQ0ZYSlNFX0NsYXNzOjpDcmVhdGUocENvbnRleHQsIGxwR2xvYmFsQ2xhc3MsIFRSVUUpOw0KKyAgICBBU1NFUlQobHBHbG9iYWxDbGFzc09iaik7DQorICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gaEZ1bmN0aW9uVGVtcGxhdGUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHBJc29sYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwR2xvYmFsQ2xhc3NPYmotPm1faFRlbXBsYXRlKTsNCisgICAgaE9iamVjdFRlbXBsYXRlID0gaEZ1bmN0aW9uVGVtcGxhdGUtPkluc3RhbmNlVGVtcGxhdGUoKTsNCisgIH0gZWxzZSB7DQorICAgIGhPYmplY3RUZW1wbGF0ZSA9IHY4OjpPYmplY3RUZW1wbGF0ZTo6TmV3KCk7DQorICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KDEpOw0KKyAgfQ0KKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBoTmV3Q29udGV4dCA9DQorICAgICAgdjg6OkNvbnRleHQ6Ok5ldyhwSXNvbGF0ZSwgTlVMTCwgaE9iamVjdFRlbXBsYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaFJvb3RDb250ZXh0ID0gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KA0KKyAgICAgIHBJc29sYXRlLCBDRlhKU0VfUnVudGltZURhdGE6OkdldChwSXNvbGF0ZSktPm1faFJvb3RDb250ZXh0KTsNCisgIGhOZXdDb250ZXh0LT5TZXRTZWN1cml0eVRva2VuKGhSb290Q29udGV4dC0+R2V0U2VjdXJpdHlUb2tlbigpKTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoR2xvYmFsT2JqZWN0ID0NCisgICAgICBGWEpTRV9HZXRHbG9iYWxPYmplY3RGcm9tQ29udGV4dChoTmV3Q29udGV4dCk7DQorICBGWEpTRV9VcGRhdGVPYmplY3RCaW5kaW5nKGhHbG9iYWxPYmplY3QsIGxwR2xvYmFsT2JqZWN0KTsNCisgIHBDb250ZXh0LT5tX2hDb250ZXh0LlJlc2V0KHBJc29sYXRlLCBoTmV3Q29udGV4dCk7DQorICBpZiAobHBHbG9iYWxDbGFzcykgew0KKyAgICBpZiAobHBHbG9iYWxDbGFzcy0+ZHluTWV0aG9kQ2FsbCB8fCBscEdsb2JhbENsYXNzLT5keW5Qcm9wR2V0dGVyIHx8DQorICAgICAgICBscEdsb2JhbENsYXNzLT5keW5Qcm9wU2V0dGVyIHx8IGxwR2xvYmFsQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyKSB7DQorICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKHBJc29sYXRlKTsNCisgICAgICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShoR2xvYmFsT2JqZWN0KTsNCisgICAgICBDRlhKU0VfQ2xhc3M6OlNldFVwRHluUHJvcEhhbmRsZXIocENvbnRleHQsIGxwVGhpc1ZhbHVlLCBscEdsb2JhbENsYXNzKTsNCisgICAgICBkZWxldGUgbHBUaGlzVmFsdWU7DQorICAgICAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KICAgICB9DQorICB9DQorICByZXR1cm4gcENvbnRleHQ7DQorfQ0KK0NGWEpTRV9Db250ZXh0Ojp+Q0ZYSlNFX0NvbnRleHQoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDAsIGNvdW50ID0gbV9yZ0NsYXNzZXMuR2V0U2l6ZSgpOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICBDRlhKU0VfQ2xhc3MqIHBDbGFzcyA9IG1fcmdDbGFzc2VzW2ldOw0KKyAgICBpZiAocENsYXNzKSB7DQorICAgICAgZGVsZXRlIHBDbGFzczsNCisgICAgfQ0KKyAgfQ0KKyAgbV9yZ0NsYXNzZXMuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0ZYSlNFX0NvbnRleHQ6OkdldEdsb2JhbE9iamVjdChDRlhKU0VfVmFsdWUqIHBWYWx1ZSkgew0KKyAgQVNTRVJUKHBWYWx1ZSk7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0IHNjb3BlKHRoaXMpOw0KKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBoQ29udGV4dCA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fcElzb2xhdGUsIG1faENvbnRleHQpOw0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhHbG9iYWxPYmplY3QgPSBoQ29udGV4dC0+R2xvYmFsKCk7DQorICBwVmFsdWUtPkZvcmNlU2V0VmFsdWUoaEdsb2JhbE9iamVjdCk7DQorfQ0KK0ZYX0JPT0wgQ0ZYSlNFX0NvbnRleHQ6OkV4ZWN1dGVTY3JpcHQoY29uc3QgRlhfQ0hBUiogc3pTY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwTmV3VGhpc09iamVjdCkgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlQ29udGV4dCBzY29wZSh0aGlzKTsNCisgIHY4OjpUcnlDYXRjaCB0cnljYXRjaDsNCisgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoU2NyaXB0U3RyaW5nID0NCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCBzelNjcmlwdCk7DQorICBpZiAobHBOZXdUaGlzT2JqZWN0ID09IE5VTEwpIHsNCisgICAgdjg6OkxvY2FsPHY4OjpTY3JpcHQ+IGhTY3JpcHQgPSB2ODo6U2NyaXB0OjpDb21waWxlKGhTY3JpcHRTdHJpbmcpOw0KKyAgICBpZiAoIXRyeWNhdGNoLkhhc0NhdWdodCgpKSB7DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gaFNjcmlwdC0+UnVuKCk7DQorICAgICAgaWYgKCF0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KKyAgICAgICAgaWYgKGxwUmV0VmFsdWUpIHsNCisgICAgICAgICAgbHBSZXRWYWx1ZS0+bV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobHBSZXRWYWx1ZSkgew0KKyAgICAgIGxwUmV0VmFsdWUtPm1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfQ3JlYXRlUmV0dXJuVmFsdWUobV9wSXNvbGF0ZSwgdHJ5Y2F0Y2gpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9IGVsc2Ugew0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoTmV3VGhpcyA9DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwTmV3VGhpc09iamVjdC0+bV9oVmFsdWUpOw0KKyAgICBBU1NFUlQoIWhOZXdUaGlzLklzRW1wdHkoKSk7DQorICAgIHY4OjpMb2NhbDx2ODo6U2NyaXB0PiBoV3JhcHBlciA9DQorICAgICAgICB2ODo6U2NyaXB0OjpDb21waWxlKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KA0KKyAgICAgICAgICAgIG1fcElzb2xhdGUsICIoZnVuY3Rpb24gKCkgeyByZXR1cm4gZXZhbChhcmd1bWVudHNbMF0pOyB9KSIpKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFdyYXBwZXJWYWx1ZSA9IGhXcmFwcGVyLT5SdW4oKTsNCisgICAgQVNTRVJUKGhXcmFwcGVyVmFsdWUtPklzRnVuY3Rpb24oKSk7DQorICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGhXcmFwcGVyRm4gPSBoV3JhcHBlclZhbHVlLkFzPHY4OjpGdW5jdGlvbj4oKTsNCisgICAgaWYgKCF0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJnQXJnc1tdID0ge2hTY3JpcHRTdHJpbmd9Ow0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgICAgIGhXcmFwcGVyRm4tPkNhbGwoaE5ld1RoaXMuQXM8djg6Ok9iamVjdD4oKSwgMSwgcmdBcmdzKTsNCisgICAgICBpZiAoIXRyeWNhdGNoLkhhc0NhdWdodCgpKSB7DQorICAgICAgICBpZiAobHBSZXRWYWx1ZSkgew0KKyAgICAgICAgICBscFJldFZhbHVlLT5tX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChscFJldFZhbHVlKSB7DQorICAgICAgbHBSZXRWYWx1ZS0+bV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZShtX3BJc29sYXRlLCB0cnljYXRjaCkpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5oIGIveGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5oCmluZGV4IDY5ZWU3YWMuLjMzMDY3ZmMgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhqc2Uvc3JjL2NvbnRleHQuaAorKysgYi94ZmEvc3JjL2Z4anNlL3NyYy9jb250ZXh0LmgKQEAgLTgsMzAgKzgsMzQgQEAKICNkZWZpbmUgRlhKU0VfQ09OVEVYVF9IXw0KIGNsYXNzIENGWEpTRV9DbGFzczsNCiBjbGFzcyBDRlhKU0VfVmFsdWU7DQotY2xhc3MgQ0ZYSlNFX0NvbnRleHQNCi17DQotcHJvdGVjdGVkOg0KLSAgICBDRlhKU0VfQ29udGV4dCh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIDogbV9wSXNvbGF0ZShwSXNvbGF0ZSkge30NCi1wdWJsaWM6DQotICAgIHN0YXRpYyBDRlhKU0VfQ29udGV4dCogQ3JlYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgY29uc3QgRlhKU0VfQ0xBU1MqIGxwR2xvYmFsQ2xhc3MgPSBOVUxMLCB2b2lkKiBscEdsb2JhbE9iamVjdCA9IE5VTEwpOw0KLSAgICB+Q0ZYSlNFX0NvbnRleHQoKTsNCi0gICAgVjhfSU5MSU5FIHY4OjpJc29sYXRlKiBHZXRSdW50aW1lKHZvaWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX3BJc29sYXRlOw0KLSAgICB9DQotICAgIHZvaWQgR2V0R2xvYmFsT2JqZWN0KENGWEpTRV9WYWx1ZSogcFZhbHVlKTsNCi0gICAgRlhfQk9PTAlFeGVjdXRlU2NyaXB0KGNvbnN0IEZYX0NIQVIqIHN6U2NyaXB0LCBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUsIENGWEpTRV9WYWx1ZSogbHBOZXdUaGlzT2JqZWN0ID0gTlVMTCk7DQotcHJvdGVjdGVkOg0KLSAgICBDRlhKU0VfQ29udGV4dCgpOw0KLSAgICBDRlhKU0VfQ29udGV4dChjb25zdCBDRlhKU0VfQ29udGV4dCYpOw0KLSAgICBDRlhKU0VfQ29udGV4dCYgb3BlcmF0b3IgPSAoY29uc3QgQ0ZYSlNFX0NvbnRleHQmKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHY4OjpHbG9iYWw8djg6OkNvbnRleHQ+CQkJbV9oQ29udGV4dDsNCi0gICAgdjg6Oklzb2xhdGUqCQkJCQkJbV9wSXNvbGF0ZTsNCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYSlNFX0NsYXNzKj4JbV9yZ0NsYXNzZXM7DQotICAgIGZyaWVuZCBjbGFzcyBDRlhKU0VfQ2xhc3M7DQotICAgIGZyaWVuZCBjbGFzcyBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0Ow0KLSAgICBmcmllbmQgY2xhc3MgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdE9yTm9ybWFsQ29udGV4dDsNCitjbGFzcyBDRlhKU0VfQ29udGV4dCB7DQorIHByb3RlY3RlZDoNCisgIENGWEpTRV9Db250ZXh0KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgOiBtX3BJc29sYXRlKHBJc29sYXRlKSB7fQ0KKw0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZYSlNFX0NvbnRleHQqIENyZWF0ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBHbG9iYWxDbGFzcyA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBscEdsb2JhbE9iamVjdCA9IE5VTEwpOw0KKyAgfkNGWEpTRV9Db250ZXh0KCk7DQorICBWOF9JTkxJTkUgdjg6Oklzb2xhdGUqIEdldFJ1bnRpbWUodm9pZCkgeyByZXR1cm4gbV9wSXNvbGF0ZTsgfQ0KKyAgdm9pZCBHZXRHbG9iYWxPYmplY3QoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpOw0KKyAgRlhfQk9PTCBFeGVjdXRlU2NyaXB0KGNvbnN0IEZYX0NIQVIqIHN6U2NyaXB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwTmV3VGhpc09iamVjdCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhKU0VfQ29udGV4dCgpOw0KKyAgQ0ZYSlNFX0NvbnRleHQoY29uc3QgQ0ZYSlNFX0NvbnRleHQmKTsNCisgIENGWEpTRV9Db250ZXh0JiBvcGVyYXRvcj0oY29uc3QgQ0ZYSlNFX0NvbnRleHQmKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdjg6Okdsb2JhbDx2ODo6Q29udGV4dD4gbV9oQ29udGV4dDsNCisgIHY4OjpJc29sYXRlKiBtX3BJc29sYXRlOw0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYSlNFX0NsYXNzKj4gbV9yZ0NsYXNzZXM7DQorICBmcmllbmQgY2xhc3MgQ0ZYSlNFX0NsYXNzOw0KKyAgZnJpZW5kIGNsYXNzIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQ7DQorICBmcmllbmQgY2xhc3MgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdE9yTm9ybWFsQ29udGV4dDsNCiB9Ow0KLXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUsIHY4OjpUcnlDYXRjaCYgdHJ5Y2F0Y2gpOw0KK3Y4OjpMb2NhbDx2ODo6T2JqZWN0PiBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpUcnlDYXRjaCYgdHJ5Y2F0Y2gpOw0KICNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL2R5bnByb3AuY3BwIGIveGZhL3NyYy9meGpzZS9zcmMvZHlucHJvcC5jcHAKaW5kZXggODQwYmQ1Zi4uYWYzMjgxZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGpzZS9zcmMvZHlucHJvcC5jcHAKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvZHlucHJvcC5jcHAKQEAgLTgsMjc3ICs4LDM5NiBAQAogI2luY2x1ZGUgImZ4djguaCINCiAjaW5jbHVkZSAiY2xhc3MuaCINCiAjaW5jbHVkZSAidmFsdWUuaCINCi1zdGF0aWMgdm9pZCBGWEpTRV9EeW5Qcm9wR2V0dGVyQWRhcHRlcl9NZXRob2RDYWxsYmFjawkoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQotew0KLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaENhbGxCYWNrSW5mbyA9IGluZm8uRGF0YSgpLkFzPHY4OjpPYmplY3Q+KCk7DQotICAgIEZYSlNFX0NMQVNTKiAgICAgICAgICBscENsYXNzCQk9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaENhbGxCYWNrSW5mby0+R2V0QWxpZ25lZFBvaW50ZXJGcm9tSW50ZXJuYWxGaWVsZCgwKSk7DQotICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoUHJvcE5hbWUJCT0gaENhbGxCYWNrSW5mby0+R2V0SW50ZXJuYWxGaWVsZCgxKS5Bczx2ODo6U3RyaW5nPigpOw0KLSAgICBBU1NFUlQobHBDbGFzcyAmJiAhaFByb3BOYW1lLklzRW1wdHkoKSk7DQotICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKGhQcm9wTmFtZSk7DQotICAgIENGWF9CeXRlU3RyaW5nQwkgICAgICBzekZ4UHJvcE5hbWUJPSAqc3pQcm9wTmFtZTsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCi0gICAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQotICAgIENGWEpTRV9Bcmd1bWVudHNJbXBsIGltcGwgPSB7JmluZm8sIGxwUmV0VmFsdWV9Ow0KLSAgICBscENsYXNzLT5keW5NZXRob2RDYWxsKHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0FyZ3VtZW50cyY+KGltcGwpKTsNCi0gICAgaWYoIWxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkuSXNFbXB0eSgpKSB7DQotICAgICAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KK3N0YXRpYyB2b2lkIEZYSlNFX0R5blByb3BHZXR0ZXJBZGFwdGVyX01ldGhvZENhbGxiYWNrKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhDYWxsQmFja0luZm8gPSBpbmZvLkRhdGEoKS5Bczx2ODo6T2JqZWN0PigpOw0KKyAgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPSBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KA0KKyAgICAgIGhDYWxsQmFja0luZm8tPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCkpOw0KKyAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhQcm9wTmFtZSA9DQorICAgICAgaENhbGxCYWNrSW5mby0+R2V0SW50ZXJuYWxGaWVsZCgxKS5Bczx2ODo6U3RyaW5nPigpOw0KKyAgQVNTRVJUKGxwQ2xhc3MgJiYgIWhQcm9wTmFtZS5Jc0VtcHR5KCkpOw0KKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUoaFByb3BOYW1lKTsNCisgIENGWF9CeXRlU3RyaW5nQyBzekZ4UHJvcE5hbWUgPSAqc3pQcm9wTmFtZTsNCisgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBDRlhKU0VfQXJndW1lbnRzSW1wbCBpbXBsID0geyZpbmZvLCBscFJldFZhbHVlfTsNCisgIGxwQ2xhc3MtPmR5bk1ldGhvZENhbGwocmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksDQorICAgICAgICAgICAgICAgICAgICAgICAgIHN6RnhQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQXJndW1lbnRzJj4oaW1wbCkpOw0KKyAgaWYgKCFscFJldFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpLklzRW1wdHkoKSkgew0KKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KKyAgfQ0KKyAgZGVsZXRlIGxwUmV0VmFsdWU7DQorICBscFJldFZhbHVlID0gTlVMTDsNCisgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCit9DQorc3RhdGljIHZvaWQgRlhKU0VfRHluUHJvcEdldHRlckFkYXB0ZXIoY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBBU1NFUlQobHBDbGFzcyk7DQorICBpbnQzMl90IG5Qcm9wVHlwZSA9DQorICAgICAgbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIgPT0gTlVMTA0KKyAgICAgICAgICA/IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkNCisgICAgICAgICAgOiBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlcihoT2JqZWN0LCBzelByb3BOYW1lLCBGQUxTRSk7DQorICBpZiAoblByb3BUeXBlID09IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkpIHsNCisgICAgaWYgKGxwQ2xhc3MtPmR5blByb3BHZXR0ZXIpIHsNCisgICAgICBscENsYXNzLT5keW5Qcm9wR2V0dGVyKGhPYmplY3QsIHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQogICAgIH0NCi0gICAgZGVsZXRlIGxwUmV0VmFsdWU7DQotICAgIGxwUmV0VmFsdWUgPSBOVUxMOw0KLSAgICBkZWxldGUgbHBUaGlzVmFsdWU7DQotICAgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCi19DQotc3RhdGljIHZvaWQgRlhKU0VfRHluUHJvcEdldHRlckFkYXB0ZXIJCQkJCShjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcywgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsIEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLSAgICBBU1NFUlQobHBDbGFzcyk7DQotICAgIGludDMyX3QgblByb3BUeXBlID0gbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIgPT0gTlVMTCA/IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkgOiBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlcihoT2JqZWN0LCBzelByb3BOYW1lLCBGQUxTRSk7DQotICAgIGlmKG5Qcm9wVHlwZSA9PSBGWEpTRV9DbGFzc1Byb3BUeXBlX1Byb3BlcnR5KSB7DQotICAgICAgICBpZihscENsYXNzLT5keW5Qcm9wR2V0dGVyKSB7DQotICAgICAgICAgICAgbHBDbGFzcy0+ZHluUHJvcEdldHRlcihoT2JqZWN0LCBzelByb3BOYW1lLCBoVmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2UgaWYoblByb3BUeXBlID09IEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kKSB7DQotICAgICAgICBpZihscENsYXNzLT5keW5NZXRob2RDYWxsICYmIGhWYWx1ZSkgew0KLSAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgICAgICAgICB2ODo6SXNvbGF0ZSoJcElzb2xhdGUgPSBscFZhbHVlLT5HZXRJc29sYXRlKCk7DQotICAgICAgICAgICAgdjg6OkhhbmRsZVNjb3BlIGhzY29wZShwSXNvbGF0ZSk7DQotICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaENhbGxCYWNrSW5mb1RlbXBsYXRlID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoKTsNCi0gICAgICAgICAgICBoQ2FsbEJhY2tJbmZvVGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3VudCgyKTsNCi0gICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaENhbGxCYWNrSW5mbyA9IGhDYWxsQmFja0luZm9UZW1wbGF0ZS0+TmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBoQ2FsbEJhY2tJbmZvLT5TZXRBbGlnbmVkUG9pbnRlckluSW50ZXJuYWxGaWVsZCgwLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzcykpOw0KLSAgICAgICAgICAgIGhDYWxsQmFja0luZm8tPlNldEludGVybmFsRmllbGQoMSwgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHN6UHJvcE5hbWUuR2V0UHRyKCkpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLCBzelByb3BOYW1lLkdldExlbmd0aCgpKSk7DQotICAgICAgICAgICAgbHBWYWx1ZS0+Rm9yY2VTZXRWYWx1ZSh2ODo6RnVuY3Rpb246Ok5ldyhscFZhbHVlLT5HZXRJc29sYXRlKCksIEZYSlNFX0R5blByb3BHZXR0ZXJBZGFwdGVyX01ldGhvZENhbGxiYWNrLCBoQ2FsbEJhY2tJbmZvKSk7DQotICAgICAgICB9DQorICB9IGVsc2UgaWYgKG5Qcm9wVHlwZSA9PSBGWEpTRV9DbGFzc1Byb3BUeXBlX01ldGhvZCkgew0KKyAgICBpZiAobHBDbGFzcy0+ZHluTWV0aG9kQ2FsbCAmJiBoVmFsdWUpIHsNCisgICAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICAgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gbHBWYWx1ZS0+R2V0SXNvbGF0ZSgpOw0KKyAgICAgIHY4OjpIYW5kbGVTY29wZSBoc2NvcGUocElzb2xhdGUpOw0KKyAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGhDYWxsQmFja0luZm9UZW1wbGF0ZSA9DQorICAgICAgICAgIHY4OjpPYmplY3RUZW1wbGF0ZTo6TmV3KCk7DQorICAgICAgaENhbGxCYWNrSW5mb1RlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoMik7DQorICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhDYWxsQmFja0luZm8gPQ0KKyAgICAgICAgICBoQ2FsbEJhY2tJbmZvVGVtcGxhdGUtPk5ld0luc3RhbmNlKCk7DQorICAgICAgaENhbGxCYWNrSW5mby0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoDQorICAgICAgICAgIDAsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzKSk7DQorICAgICAgaENhbGxCYWNrSW5mby0+U2V0SW50ZXJuYWxGaWVsZCgNCisgICAgICAgICAgMSwgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoDQorICAgICAgICAgICAgICAgICBwSXNvbGF0ZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oc3pQcm9wTmFtZS5HZXRQdHIoKSksDQorICAgICAgICAgICAgICAgICB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLCBzelByb3BOYW1lLkdldExlbmd0aCgpKSk7DQorICAgICAgbHBWYWx1ZS0+Rm9yY2VTZXRWYWx1ZSh2ODo6RnVuY3Rpb246Ok5ldygNCisgICAgICAgICAgbHBWYWx1ZS0+R2V0SXNvbGF0ZSgpLCBGWEpTRV9EeW5Qcm9wR2V0dGVyQWRhcHRlcl9NZXRob2RDYWxsYmFjaywNCisgICAgICAgICAgaENhbGxCYWNrSW5mbykpOw0KICAgICB9DQorICB9DQogfQ0KLXN0YXRpYyB2b2lkIEZYSlNFX0R5blByb3BTZXR0ZXJBZGFwdGVyCQkJCQkoY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MsIEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KLXsNCi0gICAgQVNTRVJUKGxwQ2xhc3MpOw0KLSAgICBpbnQzMl90IG5Qcm9wVHlwZSA9IGxwQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyID09IE5VTEwgPyBGWEpTRV9DbGFzc1Byb3BUeXBlX1Byb3BlcnR5IDogbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIoaE9iamVjdCwgc3pQcm9wTmFtZSwgRkFMU0UpOw0KLSAgICBpZihuUHJvcFR5cGUgIT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9NZXRob2QpIHsNCi0gICAgICAgIGlmKGxwQ2xhc3MtPmR5blByb3BTZXR0ZXIpIHsNCi0gICAgICAgICAgICBscENsYXNzLT5keW5Qcm9wU2V0dGVyKGhPYmplY3QsIHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQotICAgICAgICB9DQorc3RhdGljIHZvaWQgRlhKU0VfRHluUHJvcFNldHRlckFkYXB0ZXIoY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBBU1NFUlQobHBDbGFzcyk7DQorICBpbnQzMl90IG5Qcm9wVHlwZSA9DQorICAgICAgbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIgPT0gTlVMTA0KKyAgICAgICAgICA/IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkNCisgICAgICAgICAgOiBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlcihoT2JqZWN0LCBzelByb3BOYW1lLCBGQUxTRSk7DQorICBpZiAoblByb3BUeXBlICE9IEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kKSB7DQorICAgIGlmIChscENsYXNzLT5keW5Qcm9wU2V0dGVyKSB7DQorICAgICAgbHBDbGFzcy0+ZHluUHJvcFNldHRlcihoT2JqZWN0LCBzelByb3BOYW1lLCBoVmFsdWUpOw0KICAgICB9DQorICB9DQogfQ0KLXN0YXRpYyBGWF9CT09MIEZYSlNFX0R5blByb3BRdWVyeUFkYXB0ZXIJCQkJKGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzLCBGWEpTRV9IT0JKRUNUIGhPYmplY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSkNCi17DQotICAgIEFTU0VSVChscENsYXNzKTsNCi0gICAgaW50MzJfdCBuUHJvcFR5cGUgPSBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlciA9PSBOVUxMID8gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eSA6IGxwQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyKGhPYmplY3QsIHN6UHJvcE5hbWUsIFRSVUUpOw0KLSAgICByZXR1cm4gblByb3BUeXBlICE9IEZYSlNFX0NsYXNzUHJvcFR5cGVfTm9uZTsNCitzdGF0aWMgRlhfQk9PTCBGWEpTRV9EeW5Qcm9wUXVlcnlBZGFwdGVyKGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lKSB7DQorICBBU1NFUlQobHBDbGFzcyk7DQorICBpbnQzMl90IG5Qcm9wVHlwZSA9DQorICAgICAgbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIgPT0gTlVMTA0KKyAgICAgICAgICA/IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkNCisgICAgICAgICAgOiBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlcihoT2JqZWN0LCBzelByb3BOYW1lLCBUUlVFKTsNCisgIHJldHVybiBuUHJvcFR5cGUgIT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOw0KIH0NCi1zdGF0aWMgRlhfQk9PTCBGWEpTRV9EeW5Qcm9wRGVsZXRlckFkYXB0ZXIJCQkJCShjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcywgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUpDQotew0KLSAgICBBU1NFUlQobHBDbGFzcyk7DQotICAgIGludDMyX3QgblByb3BUeXBlID0gbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIgPT0gTlVMTCA/IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkgOiBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlcihoT2JqZWN0LCBzelByb3BOYW1lLCBGQUxTRSk7DQotICAgIGlmKG5Qcm9wVHlwZSAhPSBGWEpTRV9DbGFzc1Byb3BUeXBlX01ldGhvZCkgew0KLSAgICAgICAgaWYobHBDbGFzcy0+ZHluUHJvcERlbGV0ZXIpIHsNCi0gICAgICAgICAgICByZXR1cm4gbHBDbGFzcy0+ZHluUHJvcERlbGV0ZXIoaE9iamVjdCwgc3pQcm9wTmFtZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBuUHJvcFR5cGUgPT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eSA/IEZBTFNFIDogVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLXN0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JfZ2V0dGVyKGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKQ0KLXsNCi0gICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhDYWxsQmFja0luZm8gPSBpbmZvLkRhdGEoKS5Bczx2ODo6T2JqZWN0PigpOw0KLSAgICBGWEpTRV9DTEFTUyogICAgICAgICAgbHBDbGFzcwkJPSBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGhDYWxsQmFja0luZm8tPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCkpOw0KLSAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFByb3BOYW1lCQk9IGhDYWxsQmFja0luZm8tPkdldEludGVybmFsRmllbGQoMSkuQXM8djg6OlN0cmluZz4oKTsNCi0gICAgQVNTRVJUKGxwQ2xhc3MgJiYgIWhQcm9wTmFtZS5Jc0VtcHR5KCkpOw0KLSAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3pQcm9wTmFtZShoUHJvcE5hbWUpOw0KLSAgICBDRlhfQnl0ZVN0cmluZ0MJICAgICAgc3pGeFByb3BOYW1lCT0gKnN6UHJvcE5hbWU7DQotICAgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQotICAgIENGWEpTRV9WYWx1ZSogbHBOZXdWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCi0gICAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KLSAgICBGWEpTRV9EeW5Qcm9wR2V0dGVyQWRhcHRlcihscENsYXNzLCByZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwgc3pGeFByb3BOYW1lLCByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBOZXdWYWx1ZSkpOw0KLSAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwTmV3VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KLSAgICBkZWxldGUgbHBUaGlzVmFsdWU7DQotICAgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCi0gICAgZGVsZXRlIGxwTmV3VmFsdWU7DQotICAgIGxwTmV3VmFsdWUgPSBOVUxMOw0KLX0NCi1zdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yX3NldHRlcihjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykNCi17DQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoQ2FsbEJhY2tJbmZvID0gaW5mby5EYXRhKCkuQXM8djg6Ok9iamVjdD4oKTsNCi0gICAgRlhKU0VfQ0xBU1MqICAgICAgICAgIGxwQ2xhc3MJCT0gc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPihoQ2FsbEJhY2tJbmZvLT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhQcm9wTmFtZQkJPSBoQ2FsbEJhY2tJbmZvLT5HZXRJbnRlcm5hbEZpZWxkKDEpLkFzPHY4OjpTdHJpbmc+KCk7DQotICAgIEFTU0VSVChscENsYXNzICYmICFoUHJvcE5hbWUuSXNFbXB0eSgpKTsNCi0gICAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUoaFByb3BOYW1lKTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmdDCSAgICAgIHN6RnhQcm9wTmFtZQk9ICpzelByb3BOYW1lOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwTmV3VmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQotICAgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGluZm8uVGhpcygpKTsNCi0gICAgbHBOZXdWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvWzBdKTsNCi0gICAgRlhKU0VfRHluUHJvcFNldHRlckFkYXB0ZXIobHBDbGFzcywgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksIHN6RnhQcm9wTmFtZSwgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwTmV3VmFsdWUpKTsNCi0gICAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KLSAgICBscFRoaXNWYWx1ZSA9IE5VTEw7DQotICAgIGRlbGV0ZSBscE5ld1ZhbHVlOw0KLSAgICBscE5ld1ZhbHVlID0gTlVMTDsNCi19DQotc3RhdGljIHZvaWQgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldE93blByb3BlcnR5RGVzY3JpcHRvcgkoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQotew0KLSAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcyA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCi0gICAgaWYgKCFscENsYXNzKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgdjg6Oklzb2xhdGUqCXBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQotICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZShwSXNvbGF0ZSk7DQotICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoUHJvcE5hbWUgPSBpbmZvWzBdLT5Ub1N0cmluZygpOw0KLSAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3pQcm9wTmFtZShoUHJvcE5hbWUpOw0KLSAgICBDRlhfQnl0ZVN0cmluZ0MJCSAgc3pGeFByb3BOYW1lKCpzelByb3BOYW1lLCBzelByb3BOYW1lLmxlbmd0aCgpKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaENhbGxCYWNrSW5mb1RlbXBsYXRlID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoKTsNCi0gICAgaENhbGxCYWNrSW5mb1RlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoMik7DQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoQ2FsbEJhY2tJbmZvID0gaENhbGxCYWNrSW5mb1RlbXBsYXRlLT5OZXdJbnN0YW5jZSgpOw0KLSAgICBoQ2FsbEJhY2tJbmZvLT5TZXRBbGlnbmVkUG9pbnRlckluSW50ZXJuYWxGaWVsZCgwLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzcykpOw0KLSAgICBoQ2FsbEJhY2tJbmZvLT5TZXRJbnRlcm5hbEZpZWxkKDEsIGhQcm9wTmFtZSk7DQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoUHJvcERlc2NyaXB0b3IgPSB2ODo6T2JqZWN0OjpOZXcocElzb2xhdGUpOw0KLSAgICBoUHJvcERlc2NyaXB0b3ItPkZvcmNlU2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiZ2V0IiksIHY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yX2dldHRlciwgaENhbGxCYWNrSW5mbykpOw0KLSAgICBoUHJvcERlc2NyaXB0b3ItPkZvcmNlU2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAic2V0IiksIHY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yX3NldHRlciwgaENhbGxCYWNrSW5mbykpOw0KLSAgICBoUHJvcERlc2NyaXB0b3ItPkZvcmNlU2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiZW51bWVyYWJsZSIpLCB2ODo6Qm9vbGVhbjo6TmV3KHBJc29sYXRlLCBmYWxzZSkpOw0KLSAgICBoUHJvcERlc2NyaXB0b3ItPkZvcmNlU2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiY29uZmlndXJhYmxlIiksIHY4OjpCb29sZWFuOjpOZXcocElzb2xhdGUsIHRydWUpKTsNCi0gICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChoUHJvcERlc2NyaXB0b3IpOw0KLX0NCi1zdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0UHJvcGVydHlEZXNjcmlwdG9yCQkoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQotew0KLSAgICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhDaGFpbk9iaiA9IGluZm8uVGhpcygpLT5HZXRQcm90b3R5cGUoKS5Bczx2ODo6T2JqZWN0PigpOw0KLSAgICB2ODo6TG9jYWw8djg6OlNjcmlwdD4gZm5Tb3VyY2UgPSB2ODo6U2NyaXB0OjpDb21waWxlKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGZ1bmN0aW9uIChvLCBuYW1lKSB7IHZhciBmbiwgeCwgZDsgZm4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyB4ID0gbzsgd2hpbGUoeCAmJiAhKGQgPSBmbih4LCBuYW1lKSkpe3ggPSB4Ll9fcHJvdG9fXzt9IHJldHVybiBkOyB9KSIpKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gZm4gPSBmblNvdXJjZS0+UnVuKCkuQXM8djg6OkZ1bmN0aW9uPigpOw0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZ0FyZ3NbXSA9IHtoQ2hhaW5PYmosIGluZm9bMF19Ow0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoQ2hhaW5EZXNjcmlwdG9yID0gZm4tPkNhbGwoaW5mby5UaGlzKCksIDIsIHJnQXJncyk7DQotICAgIGlmKCFoQ2hhaW5EZXNjcmlwdG9yLklzRW1wdHkoKSAmJiBoQ2hhaW5EZXNjcmlwdG9yLT5Jc09iamVjdCgpKSB7DQotICAgICAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGhDaGFpbkRlc2NyaXB0b3IpOw0KK3N0YXRpYyBGWF9CT09MIEZYSlNFX0R5blByb3BEZWxldGVyQWRhcHRlcihjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUpIHsNCisgIEFTU0VSVChscENsYXNzKTsNCisgIGludDMyX3QgblByb3BUeXBlID0NCisgICAgICBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlciA9PSBOVUxMDQorICAgICAgICAgID8gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eQ0KKyAgICAgICAgICA6IGxwQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyKGhPYmplY3QsIHN6UHJvcE5hbWUsIEZBTFNFKTsNCisgIGlmIChuUHJvcFR5cGUgIT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9NZXRob2QpIHsNCisgICAgaWYgKGxwQ2xhc3MtPmR5blByb3BEZWxldGVyKSB7DQorICAgICAgcmV0dXJuIGxwQ2xhc3MtPmR5blByb3BEZWxldGVyKGhPYmplY3QsIHN6UHJvcE5hbWUpOw0KICAgICB9IGVsc2Ugew0KLSAgICAgICAgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldE93blByb3BlcnR5RGVzY3JpcHRvcihpbmZvKTsNCisgICAgICByZXR1cm4gblByb3BUeXBlID09IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkgPyBGQUxTRSA6IFRSVUU7DQogICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCiB9DQotc3RhdGljIHZvaWQgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldE93blByb3BlcnR5TmFtZXMJCShjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykNCi17DQotICAgIHY4OjpJc29sYXRlKglwSXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOw0KLSAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOw0KLSAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KHY4OjpBcnJheTo6TmV3KHBJc29sYXRlKSk7DQorc3RhdGljIHZvaWQgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldE93blByb3BlcnR5RGVzY3JpcHRvcl9nZXR0ZXIoDQorICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaENhbGxCYWNrSW5mbyA9IGluZm8uRGF0YSgpLkFzPHY4OjpPYmplY3Q+KCk7DQorICBGWEpTRV9DTEFTUyogbHBDbGFzcyA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oDQorICAgICAgaENhbGxCYWNrSW5mby0+R2V0QWxpZ25lZFBvaW50ZXJGcm9tSW50ZXJuYWxGaWVsZCgwKSk7DQorICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFByb3BOYW1lID0NCisgICAgICBoQ2FsbEJhY2tJbmZvLT5HZXRJbnRlcm5hbEZpZWxkKDEpLkFzPHY4OjpTdHJpbmc+KCk7DQorICBBU1NFUlQobHBDbGFzcyAmJiAhaFByb3BOYW1lLklzRW1wdHkoKSk7DQorICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3pQcm9wTmFtZShoUHJvcE5hbWUpOw0KKyAgQ0ZYX0J5dGVTdHJpbmdDIHN6RnhQcm9wTmFtZSA9ICpzelByb3BOYW1lOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgIENGWEpTRV9WYWx1ZSogbHBOZXdWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGluZm8uVGhpcygpKTsNCisgIEZYSlNFX0R5blByb3BHZXR0ZXJBZGFwdGVyKA0KKyAgICAgIGxwQ2xhc3MsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUsDQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwTmV3VmFsdWUpKTsNCisgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQobHBOZXdWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICBkZWxldGUgbHBUaGlzVmFsdWU7DQorICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorICBkZWxldGUgbHBOZXdWYWx1ZTsNCisgIGxwTmV3VmFsdWUgPSBOVUxMOw0KIH0NCi1zdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0UHJvcGVydHlOYW1lcwkJCShjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykNCi17DQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoQ2hhaW5PYmogPSBpbmZvLlRoaXMoKS0+R2V0UHJvdG90eXBlKCkuQXM8djg6Ok9iamVjdD4oKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaENoYWluUHJvcGVydHlOYW1lcyA9IGhDaGFpbk9iai0+R2V0UHJvcGVydHlOYW1lcygpOw0KLSAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGhDaGFpblByb3BlcnR5TmFtZXMpOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Jfc2V0dGVyKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhDYWxsQmFja0luZm8gPSBpbmZvLkRhdGEoKS5Bczx2ODo6T2JqZWN0PigpOw0KKyAgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPSBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KA0KKyAgICAgIGhDYWxsQmFja0luZm8tPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCkpOw0KKyAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhQcm9wTmFtZSA9DQorICAgICAgaENhbGxCYWNrSW5mby0+R2V0SW50ZXJuYWxGaWVsZCgxKS5Bczx2ODo6U3RyaW5nPigpOw0KKyAgQVNTRVJUKGxwQ2xhc3MgJiYgIWhQcm9wTmFtZS5Jc0VtcHR5KCkpOw0KKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUoaFByb3BOYW1lKTsNCisgIENGWF9CeXRlU3RyaW5nQyBzekZ4UHJvcE5hbWUgPSAqc3pQcm9wTmFtZTsNCisgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBDRlhKU0VfVmFsdWUqIGxwTmV3VmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICBscE5ld1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGluZm9bMF0pOw0KKyAgRlhKU0VfRHluUHJvcFNldHRlckFkYXB0ZXIoDQorICAgICAgbHBDbGFzcywgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksIHN6RnhQcm9wTmFtZSwNCisgICAgICByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBOZXdWYWx1ZSkpOw0KKyAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KKyAgZGVsZXRlIGxwTmV3VmFsdWU7DQorICBscE5ld1ZhbHVlID0gTlVMTDsNCiB9DQotc3RhdGljIHZvaWQgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2RlZmluZVByb3BlcnR5CQkJKGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKQ0KLXsNCi0gICAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPSBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQotICAgIGlmICghbHBDbGFzcykgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIHY4OjpJc29sYXRlKglwSXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOw0KLSAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOw0KLSAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFByb3BOYW1lID0gaW5mb1swXS0+VG9TdHJpbmcoKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhQcm9wRGVzY3JpcHRvciA9IGluZm9bMV0tPlRvT2JqZWN0KCk7DQotICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKGhQcm9wTmFtZSk7DQotICAgIGlmKCFoUHJvcERlc2NyaXB0b3ItPkhhcyh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgInZhbHVlIikpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFByb3BWYWx1ZSA9IGhQcm9wRGVzY3JpcHRvci0+R2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAidmFsdWUiKSk7DQotICAgIENGWF9CeXRlU3RyaW5nQwkJICBzekZ4UHJvcE5hbWUoKnN6UHJvcE5hbWUsIHN6UHJvcE5hbWUubGVuZ3RoKCkpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KLSAgICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQotICAgIGxwUHJvcFZhbHVlLT5Gb3JjZVNldFZhbHVlKGhQcm9wVmFsdWUpOw0KLSAgICBGWEpTRV9EeW5Qcm9wU2V0dGVyQWRhcHRlcihscENsYXNzLCByZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwgc3pGeFByb3BOYW1lLCByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBQcm9wVmFsdWUpKTsNCi0gICAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KLSAgICBscFRoaXNWYWx1ZSA9IE5VTEw7DQotICAgIGRlbGV0ZSBscFByb3BWYWx1ZTsNCi0gICAgbHBQcm9wVmFsdWUgPSBOVUxMOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoDQorICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7DQorICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcyA9DQorICAgICAgc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgaWYgKCFscENsYXNzKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOw0KKyAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlKHBJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoUHJvcE5hbWUgPSBpbmZvWzBdLT5Ub1N0cmluZygpOw0KKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUoaFByb3BOYW1lKTsNCisgIENGWF9CeXRlU3RyaW5nQyBzekZ4UHJvcE5hbWUoKnN6UHJvcE5hbWUsIHN6UHJvcE5hbWUubGVuZ3RoKCkpOw0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaENhbGxCYWNrSW5mb1RlbXBsYXRlID0NCisgICAgICB2ODo6T2JqZWN0VGVtcGxhdGU6Ok5ldygpOw0KKyAgaENhbGxCYWNrSW5mb1RlbXBsYXRlLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoMik7DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaENhbGxCYWNrSW5mbyA9IGhDYWxsQmFja0luZm9UZW1wbGF0ZS0+TmV3SW5zdGFuY2UoKTsNCisgIGhDYWxsQmFja0luZm8tPlNldEFsaWduZWRQb2ludGVySW5JbnRlcm5hbEZpZWxkKA0KKyAgICAgIDAsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzKSk7DQorICBoQ2FsbEJhY2tJbmZvLT5TZXRJbnRlcm5hbEZpZWxkKDEsIGhQcm9wTmFtZSk7DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaFByb3BEZXNjcmlwdG9yID0gdjg6Ok9iamVjdDo6TmV3KHBJc29sYXRlKTsNCisgIGhQcm9wRGVzY3JpcHRvci0+Rm9yY2VTZXQoDQorICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJnZXQiKSwNCisgICAgICB2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yX2dldHRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICBoQ2FsbEJhY2tJbmZvKSk7DQorICBoUHJvcERlc2NyaXB0b3ItPkZvcmNlU2V0KA0KKyAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAic2V0IiksDQorICAgICAgdjg6OkZ1bmN0aW9uOjpOZXcocElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldE93blByb3BlcnR5RGVzY3JpcHRvcl9zZXR0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaENhbGxCYWNrSW5mbykpOw0KKyAgaFByb3BEZXNjcmlwdG9yLT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImVudW1lcmFibGUiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkJvb2xlYW46Ok5ldyhwSXNvbGF0ZSwgZmFsc2UpKTsNCisgIGhQcm9wRGVzY3JpcHRvci0+Rm9yY2VTZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJjb25maWd1cmFibGUiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkJvb2xlYW46Ok5ldyhwSXNvbGF0ZSwgdHJ1ZSkpOw0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChoUHJvcERlc2NyaXB0b3IpOw0KIH0NCi1zdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZGVsZXRlCQkJCQkoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pDQotew0KLSAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KHRydWUpOw0KLSAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcyA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCi0gICAgaWYgKCFscENsYXNzKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgdjg6Oklzb2xhdGUqCXBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQotICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZShwSXNvbGF0ZSk7DQotICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoUHJvcE5hbWUgPSBpbmZvWzBdLT5Ub1N0cmluZygpOw0KLSAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3pQcm9wTmFtZShoUHJvcE5hbWUpOw0KLSAgICBDRlhfQnl0ZVN0cmluZ0MJCSAgc3pGeFByb3BOYW1lKCpzelByb3BOYW1lLCBzelByb3BOYW1lLmxlbmd0aCgpKTsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCi0gICAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KLSAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KEZYSlNFX0R5blByb3BEZWxldGVyQWRhcHRlcihscENsYXNzLCByZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwgc3pGeFByb3BOYW1lKSA/IHRydWUgOiBmYWxzZSk7DQotICAgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCi0gICAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRQcm9wZXJ0eURlc2NyaXB0b3IoDQorICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7DQorICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoQ2hhaW5PYmogPQ0KKyAgICAgIGluZm8uVGhpcygpLT5HZXRQcm90b3R5cGUoKS5Bczx2ODo6T2JqZWN0PigpOw0KKyAgdjg6OkxvY2FsPHY4OjpTY3JpcHQ+IGZuU291cmNlID0gdjg6OlNjcmlwdDo6Q29tcGlsZSh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOCgNCisgICAgICBwSXNvbGF0ZSwNCisgICAgICAiKGZ1bmN0aW9uIChvLCBuYW1lKSB7IHZhciBmbiwgeCwgZDsgZm4gPSAiDQorICAgICAgIk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IHggPSBvOyB3aGlsZSh4ICYmICEoZCA9IGZuKHgsICINCisgICAgICAibmFtZSkpKXt4ID0geC5fX3Byb3RvX187fSByZXR1cm4gZDsgfSkiKSk7DQorICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBmbiA9IGZuU291cmNlLT5SdW4oKS5Bczx2ODo6RnVuY3Rpb24+KCk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZ0FyZ3NbXSA9IHtoQ2hhaW5PYmosIGluZm9bMF19Ow0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaENoYWluRGVzY3JpcHRvciA9IGZuLT5DYWxsKGluZm8uVGhpcygpLCAyLCByZ0FyZ3MpOw0KKyAgaWYgKCFoQ2hhaW5EZXNjcmlwdG9yLklzRW1wdHkoKSAmJiBoQ2hhaW5EZXNjcmlwdG9yLT5Jc09iamVjdCgpKSB7DQorICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoaENoYWluRGVzY3JpcHRvcik7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluZm8pOw0KKyAgfQ0KIH0NCi1zdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZml4CQkJCQkJKGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKQ0KLXsNCi0gICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldFVuZGVmaW5lZCgpOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eU5hbWVzKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQorICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOw0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2ODo6QXJyYXk6Ok5ldyhwSXNvbGF0ZSkpOw0KIH0NCi1zdGF0aWMgdm9pZCBGWEpTRV9WOF9OYW1lZFByb3BlcnR5UXVlcnlDYWxsYmFjayh2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6SW50ZWdlcj4mIGluZm8pDQotew0KLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdGhpc09iamVjdCA9IGluZm8uVGhpcygpOw0KLSAgICBpZiAodGhpc09iamVjdC0+SGFzUmVhbE5hbWVkUHJvcGVydHkocHJvcGVydHkpKSB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPSBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQotICAgIHY4OjpJc29sYXRlKglwSXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOw0KLSAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOw0KLSAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3pQcm9wTmFtZShwcm9wZXJ0eSk7DQotICAgIENGWF9CeXRlU3RyaW5nQwkJICBzekZ4UHJvcE5hbWUoKnN6UHJvcE5hbWUsIHN6UHJvcE5hbWUubGVuZ3RoKCkpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KLSAgICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZSh0aGlzT2JqZWN0KTsNCi0gICAgaWYoRlhKU0VfRHluUHJvcFF1ZXJ5QWRhcHRlcihscENsYXNzLCByZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwgc3pGeFByb3BOYW1lKSkgew0KLSAgICAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2ODo6RG9udERlbGV0ZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBjb25zdCBpbnQzMl90IGlWOEFic2VudCA9IDY0Ow0KLSAgICAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChpVjhBYnNlbnQpOw0KLSAgICB9DQotICAgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCi0gICAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRQcm9wZXJ0eU5hbWVzKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhDaGFpbk9iaiA9DQorICAgICAgaW5mby5UaGlzKCktPkdldFByb3RvdHlwZSgpLkFzPHY4OjpPYmplY3Q+KCk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoQ2hhaW5Qcm9wZXJ0eU5hbWVzID0gaENoYWluT2JqLT5HZXRQcm9wZXJ0eU5hbWVzKCk7DQorICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGhDaGFpblByb3BlcnR5TmFtZXMpOw0KIH0NCi1zdGF0aWMgdm9pZCBGWEpTRV9WOF9OYW1lZFByb3BlcnR5RGVsZXRlckNhbGxiYWNrKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpCb29sZWFuPiYgaW5mbykNCi17DQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB0aGlzT2JqZWN0ID0gaW5mby5UaGlzKCk7DQotICAgIGlmICh0aGlzT2JqZWN0LT5IYXNSZWFsTmFtZWRQcm9wZXJ0eShwcm9wZXJ0eSkpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcyA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCi0gICAgdjg6Oklzb2xhdGUqCXBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQotICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZShwSXNvbGF0ZSk7DQotICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKHByb3BlcnR5KTsNCi0gICAgQ0ZYX0J5dGVTdHJpbmdDCQkgIHN6RnhQcm9wTmFtZSgqc3pQcm9wTmFtZSwgc3pQcm9wTmFtZS5sZW5ndGgoKSk7DQotICAgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQotICAgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKHRoaXNPYmplY3QpOw0KLSAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KEZYSlNFX0R5blByb3BEZWxldGVyQWRhcHRlcihscENsYXNzLCByZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwgc3pGeFByb3BOYW1lKSA/IHRydWUgOiBmYWxzZSk7DQotICAgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCi0gICAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19kZWZpbmVQcm9wZXJ0eSgNCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsNCisgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzID0NCisgICAgICBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQorICBpZiAoIWxwQ2xhc3MpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQorICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhQcm9wTmFtZSA9IGluZm9bMF0tPlRvU3RyaW5nKCk7DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaFByb3BEZXNjcmlwdG9yID0gaW5mb1sxXS0+VG9PYmplY3QoKTsNCisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKGhQcm9wTmFtZSk7DQorICBpZiAoIWhQcm9wRGVzY3JpcHRvci0+SGFzKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAidmFsdWUiKSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFByb3BWYWx1ZSA9DQorICAgICAgaFByb3BEZXNjcmlwdG9yLT5HZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJ2YWx1ZSIpKTsNCisgIENGWF9CeXRlU3RyaW5nQyBzekZ4UHJvcE5hbWUoKnN6UHJvcE5hbWUsIHN6UHJvcE5hbWUubGVuZ3RoKCkpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICBscFByb3BWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShoUHJvcFZhbHVlKTsNCisgIEZYSlNFX0R5blByb3BTZXR0ZXJBZGFwdGVyKA0KKyAgICAgIGxwQ2xhc3MsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUsDQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwUHJvcFZhbHVlKSk7DQorICBkZWxldGUgbHBUaGlzVmFsdWU7DQorICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorICBkZWxldGUgbHBQcm9wVmFsdWU7DQorICBscFByb3BWYWx1ZSA9IE5VTEw7DQogfQ0KLXZvaWQgQ0ZYSlNFX0NsYXNzOjpTZXRVcER5blByb3BIYW5kbGVyKENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCwgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW5pdGlvbikNCi17DQotICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHBWYWx1ZS0+R2V0SXNvbGF0ZSgpOw0KLSAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290T3JOb3JtYWxDb250ZXh0IHNjb3BlKHBJc29sYXRlLCBwQ29udGV4dCk7DQotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaENvbnRleHQgPSB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcocElzb2xhdGUsIHBDb250ZXh0ID8gcENvbnRleHQtPm1faENvbnRleHQgOiBDRlhKU0VfUnVudGltZURhdGE6OkdldChwSXNvbGF0ZSktPm1faFJvb3RDb250ZXh0KTsNCi0gICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhPYmplY3QgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KHBJc29sYXRlLCBwVmFsdWUtPm1faFZhbHVlKS5Bczx2ODo6T2JqZWN0PigpOw0KLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaEhhcm1vbnlQcm94eU9iaiA9ICBoQ29udGV4dC0+R2xvYmFsKCktPkdldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgIlByb3h5IikpLkFzPHY4OjpPYmplY3Q+KCk7DQotICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGhIYXJtb255UHJveHlDcmVhdGVGbiA9IGhIYXJtb255UHJveHlPYmotPkdldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImNyZWF0ZSIpKS5Bczx2ODo6RnVuY3Rpb24+KCk7DQotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPbGRQcm90b3R5cGUgPSBoT2JqZWN0LT5HZXRQcm90b3R5cGUoKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhUcmFwcGVyID0gdjg6Ok9iamVjdDo6TmV3KHBJc29sYXRlKTsNCi0gICAgaFRyYXBwZXItPkZvcmNlU2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiksCXY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLCB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KGxwQ2xhc3NEZWZpbml0aW9uKSkpKTsNCi0gICAgaFRyYXBwZXItPkZvcmNlU2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiZ2V0UHJvcGVydHlEZXNjcmlwdG9yIiksCQl2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldFByb3BlcnR5RGVzY3JpcHRvciwJdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpKSk7DQotICAgIGhUcmFwcGVyLT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImdldE93blByb3BlcnR5TmFtZXMiKSwJCXY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlOYW1lcywJCXY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KLSAgICBoVHJhcHBlci0+Rm9yY2VTZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJnZXRQcm9wZXJ0eU5hbWVzIiksCQkJdjg6OkZ1bmN0aW9uOjpOZXcocElzb2xhdGUsIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRQcm9wZXJ0eU5hbWVzLAkJCXY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KLSAgICBoVHJhcHBlci0+Rm9yY2VTZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJkZWxldGUiKSwJCQkJCQl2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2RlbGV0ZSwJCQkJCXY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KLSAgICBoVHJhcHBlci0+Rm9yY2VTZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJkZWZpbmVQcm9wZXJ0eSIpLAkJCQl2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2RlZmluZVByb3BlcnR5LAkJCXY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KLSAgICBoVHJhcHBlci0+Rm9yY2VTZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJmaXgiKSwJCQkJCQl2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2ZpeCwJCQkJCQl2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KGxwQ2xhc3NEZWZpbml0aW9uKSkpKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmdBcmdzW10gPSB7aFRyYXBwZXIsIGhPbGRQcm90b3R5cGV9Ow0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoTmV3UHJvdG90eXBlID0gaEhhcm1vbnlQcm94eUNyZWF0ZUZuLT5DYWxsKGhIYXJtb255UHJveHlPYmosIDIsIHJnQXJncyk7DQotICAgIGhPYmplY3QtPlNldFByb3RvdHlwZShoTmV3UHJvdG90eXBlKTsNCitzdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZGVsZXRlKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh0cnVlKTsNCisgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzID0NCisgICAgICBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQorICBpZiAoIWxwQ2xhc3MpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQorICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhQcm9wTmFtZSA9IGluZm9bMF0tPlRvU3RyaW5nKCk7DQorICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3pQcm9wTmFtZShoUHJvcE5hbWUpOw0KKyAgQ0ZYX0J5dGVTdHJpbmdDIHN6RnhQcm9wTmFtZSgqc3pQcm9wTmFtZSwgc3pQcm9wTmFtZS5sZW5ndGgoKSk7DQorICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCgNCisgICAgICBGWEpTRV9EeW5Qcm9wRGVsZXRlckFkYXB0ZXIoDQorICAgICAgICAgIGxwQ2xhc3MsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUpDQorICAgICAgICAgID8gdHJ1ZQ0KKyAgICAgICAgICA6IGZhbHNlKTsNCisgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCiB9DQotdm9pZCBDRlhKU0VfQ2xhc3M6OlNldFVwTmFtZWRQcm9wSGFuZGxlcih2ODo6SXNvbGF0ZSogcElzb2xhdGUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+JiBoT2JqZWN0VGVtcGxhdGUsIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW5pdGlvbikNCi17DQotICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0TmFtZWRQcm9wZXJ0eUhhbmRsZXIoMCwgMCwNCi0gICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbi0+ZHluUHJvcFR5cGVHZXR0ZXIgPyBGWEpTRV9WOF9OYW1lZFByb3BlcnR5UXVlcnlDYWxsYmFjayA6IDAsDQotICAgICAgICAgICAgbHBDbGFzc0RlZmluaXRpb24tPmR5blByb3BEZWxldGVyID8gRlhKU0VfVjhfTmFtZWRQcm9wZXJ0eURlbGV0ZXJDYWxsYmFjayA6IDAsDQotICAgICAgICAgICAgMCwNCi0gICAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KGxwQ2xhc3NEZWZpbml0aW9uKSkpOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19maXgoDQorICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7DQorICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0VW5kZWZpbmVkKCk7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4X05hbWVkUHJvcGVydHlRdWVyeUNhbGxiYWNrKA0KKyAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksDQorICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6SW50ZWdlcj4mIGluZm8pIHsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB0aGlzT2JqZWN0ID0gaW5mby5UaGlzKCk7DQorICBpZiAodGhpc09iamVjdC0+SGFzUmVhbE5hbWVkUHJvcGVydHkocHJvcGVydHkpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzID0NCisgICAgICBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQorICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsNCisgIHY4OjpIYW5kbGVTY29wZSBzY29wZShwSXNvbGF0ZSk7DQorICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3pQcm9wTmFtZShwcm9wZXJ0eSk7DQorICBDRlhfQnl0ZVN0cmluZ0Mgc3pGeFByb3BOYW1lKCpzelByb3BOYW1lLCBzelByb3BOYW1lLmxlbmd0aCgpKTsNCisgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZSh0aGlzT2JqZWN0KTsNCisgIGlmIChGWEpTRV9EeW5Qcm9wUXVlcnlBZGFwdGVyKGxwQ2xhc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6RnhQcm9wTmFtZSkpIHsNCisgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2ODo6RG9udERlbGV0ZSk7DQorICB9IGVsc2Ugew0KKyAgICBjb25zdCBpbnQzMl90IGlWOEFic2VudCA9IDY0Ow0KKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGlWOEFic2VudCk7DQorICB9DQorICBkZWxldGUgbHBUaGlzVmFsdWU7DQorICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4X05hbWVkUHJvcGVydHlEZWxldGVyQ2FsbGJhY2soDQorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwNCisgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpCb29sZWFuPiYgaW5mbykgew0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHRoaXNPYmplY3QgPSBpbmZvLlRoaXMoKTsNCisgIGlmICh0aGlzT2JqZWN0LT5IYXNSZWFsTmFtZWRQcm9wZXJ0eShwcm9wZXJ0eSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOw0KKyAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlKHBJc29sYXRlKTsNCisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKHByb3BlcnR5KTsNCisgIENGWF9CeXRlU3RyaW5nQyBzekZ4UHJvcE5hbWUoKnN6UHJvcE5hbWUsIHN6UHJvcE5hbWUubGVuZ3RoKCkpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKHRoaXNPYmplY3QpOw0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCgNCisgICAgICBGWEpTRV9EeW5Qcm9wRGVsZXRlckFkYXB0ZXIoDQorICAgICAgICAgIGxwQ2xhc3MsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUpDQorICAgICAgICAgID8gdHJ1ZQ0KKyAgICAgICAgICA6IGZhbHNlKTsNCisgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCit9DQordm9pZCBDRlhKU0VfQ2xhc3M6OlNldFVwRHluUHJvcEhhbmRsZXIoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW5pdGlvbikgew0KKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcFZhbHVlLT5HZXRJc29sYXRlKCk7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290T3JOb3JtYWxDb250ZXh0IHNjb3BlKHBJc29sYXRlLCBwQ29udGV4dCk7DQorICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGhDb250ZXh0ID0gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KA0KKyAgICAgIHBJc29sYXRlLCBwQ29udGV4dCA/IHBDb250ZXh0LT5tX2hDb250ZXh0DQorICAgICAgICAgICAgICAgICAgICAgICAgIDogQ0ZYSlNFX1J1bnRpbWVEYXRhOjpHZXQocElzb2xhdGUpLT5tX2hSb290Q29udGV4dCk7DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaE9iamVjdCA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhwSXNvbGF0ZSwgcFZhbHVlLT5tX2hWYWx1ZSkuQXM8djg6Ok9iamVjdD4oKTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoSGFybW9ueVByb3h5T2JqID0NCisgICAgICBoQ29udGV4dC0+R2xvYmFsKCkNCisgICAgICAgICAgLT5HZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJQcm94eSIpKQ0KKyAgICAgICAgICAuQXM8djg6Ok9iamVjdD4oKTsNCisgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGhIYXJtb255UHJveHlDcmVhdGVGbiA9DQorICAgICAgaEhhcm1vbnlQcm94eU9iai0+R2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiY3JlYXRlIikpDQorICAgICAgICAgIC5Bczx2ODo6RnVuY3Rpb24+KCk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoT2xkUHJvdG90eXBlID0gaE9iamVjdC0+R2V0UHJvdG90eXBlKCk7DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaFRyYXBwZXIgPSB2ODo6T2JqZWN0OjpOZXcocElzb2xhdGUpOw0KKyAgaFRyYXBwZXItPkZvcmNlU2V0KA0KKyAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiksDQorICAgICAgdjg6OkZ1bmN0aW9uOjpOZXcoDQorICAgICAgICAgIHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLA0KKyAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KGxwQ2xhc3NEZWZpbml0aW9uKSkpKTsNCisgIGhUcmFwcGVyLT5Gb3JjZVNldCgNCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImdldFByb3BlcnR5RGVzY3JpcHRvciIpLA0KKyAgICAgIHY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0UHJvcGVydHlEZXNjcmlwdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbikpKSk7DQorICBoVHJhcHBlci0+Rm9yY2VTZXQoDQorICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiksDQorICAgICAgdjg6OkZ1bmN0aW9uOjpOZXcocElzb2xhdGUsIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eU5hbWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbikpKSk7DQorICBoVHJhcHBlci0+Rm9yY2VTZXQoDQorICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJnZXRQcm9wZXJ0eU5hbWVzIiksDQorICAgICAgdjg6OkZ1bmN0aW9uOjpOZXcocElzb2xhdGUsIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRQcm9wZXJ0eU5hbWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbikpKSk7DQorICBoVHJhcHBlci0+Rm9yY2VTZXQoDQorICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJkZWxldGUiKSwNCisgICAgICB2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2RlbGV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDbGFzc0RlZmluaXRpb24pKSkpOw0KKyAgaFRyYXBwZXItPkZvcmNlU2V0KA0KKyAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiZGVmaW5lUHJvcGVydHkiKSwNCisgICAgICB2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2RlZmluZVByb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbikpKSk7DQorICBoVHJhcHBlci0+Rm9yY2VTZXQoDQorICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJmaXgiKSwNCisgICAgICB2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2ZpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDbGFzc0RlZmluaXRpb24pKSkpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmdBcmdzW10gPSB7aFRyYXBwZXIsIGhPbGRQcm90b3R5cGV9Ow0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE5ld1Byb3RvdHlwZSA9DQorICAgICAgaEhhcm1vbnlQcm94eUNyZWF0ZUZuLT5DYWxsKGhIYXJtb255UHJveHlPYmosIDIsIHJnQXJncyk7DQorICBoT2JqZWN0LT5TZXRQcm90b3R5cGUoaE5ld1Byb3RvdHlwZSk7DQorfQ0KK3ZvaWQgQ0ZYSlNFX0NsYXNzOjpTZXRVcE5hbWVkUHJvcEhhbmRsZXIoDQorICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwNCisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4mIGhPYmplY3RUZW1wbGF0ZSwNCisgICAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3NEZWZpbml0aW9uKSB7DQorICBoT2JqZWN0VGVtcGxhdGUtPlNldE5hbWVkUHJvcGVydHlIYW5kbGVyKA0KKyAgICAgIDAsIDAsDQorICAgICAgbHBDbGFzc0RlZmluaXRpb24tPmR5blByb3BUeXBlR2V0dGVyID8gRlhKU0VfVjhfTmFtZWRQcm9wZXJ0eVF1ZXJ5Q2FsbGJhY2sNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwLA0KKyAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5keW5Qcm9wRGVsZXRlciA/IEZYSlNFX1Y4X05hbWVkUHJvcGVydHlEZWxldGVyQ2FsbGJhY2sNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwLA0KKyAgICAgIDAsDQorICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvcnVudGltZS5jcHAgYi94ZmEvc3JjL2Z4anNlL3NyYy9ydW50aW1lLmNwcAppbmRleCBlNDdjNWIxLi5iZmRiMDg5IDEwMDY0NAotLS0gYS94ZmEvc3JjL2Z4anNlL3NyYy9ydW50aW1lLmNwcAorKysgYi94ZmEvc3JjL2Z4anNlL3NyYy9ydW50aW1lLmNwcApAQCAtMTIsMTIwICsxMiwxMTEgQEAKIC8vIER1cGxpY2F0ZXMgZnBkZnNkaydzIEpTX1J1bnRpbWUuaCwgYnV0IGtlZXBzIFhGQSBmcm9tIGRlcGVuZGluZyBvbiBpdC4NCiAvLyBUT0RPKHRzZXBleik6IG1ha2UgYSBzaW5nbGUgdmVyc2lvbiBvZiB0aGlzLg0KIGNsYXNzIEZYSlNFX0FycmF5QnVmZmVyQWxsb2NhdG9yIDogcHVibGljIHY4OjpBcnJheUJ1ZmZlcjo6QWxsb2NhdG9yIHsNCi0gICAgdm9pZCogQWxsb2NhdGUoc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUgew0KLSAgICAgICAgcmV0dXJuIGNhbGxvYygxLCBsZW5ndGgpOw0KLSAgICB9DQotICAgIHZvaWQqIEFsbG9jYXRlVW5pbml0aWFsaXplZChzaXplX3QgbGVuZ3RoKSBvdmVycmlkZSB7DQotICAgICAgICByZXR1cm4gbWFsbG9jKGxlbmd0aCk7DQotICAgIH0NCi0gICAgdm9pZCBGcmVlKHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlIHsNCi0gICAgICAgIGZyZWUoZGF0YSk7DQotICAgIH0NCisgIHZvaWQqIEFsbG9jYXRlKHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlIHsgcmV0dXJuIGNhbGxvYygxLCBsZW5ndGgpOyB9DQorICB2b2lkKiBBbGxvY2F0ZVVuaW5pdGlhbGl6ZWQoc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUgeyByZXR1cm4gbWFsbG9jKGxlbmd0aCk7IH0NCisgIHZvaWQgRnJlZSh2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSBvdmVycmlkZSB7IGZyZWUoZGF0YSk7IH0NCiB9Ow0KIA0KLXN0YXRpYyB2b2lkIEZYSlNFX0tpbGxWOCgpDQotew0KLSAgICB2ODo6Vjg6OkRpc3Bvc2UoKTsNCitzdGF0aWMgdm9pZCBGWEpTRV9LaWxsVjgoKSB7DQorICB2ODo6Vjg6OkRpc3Bvc2UoKTsNCiB9DQotdm9pZCBGWEpTRV9Jbml0aWFsaXplKCkNCi17DQotICAgIGlmKCFDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QpIHsNCi0gICAgICAgIENGWEpTRV9SdW50aW1lRGF0YTo6Z19SdW50aW1lTGlzdCA9IEZYX05FVyBDRlhKU0VfUnVudGltZUxpc3Q7DQordm9pZCBGWEpTRV9Jbml0aWFsaXplKCkgew0KKyAgaWYgKCFDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QpIHsNCisgICAgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0ID0gRlhfTkVXIENGWEpTRV9SdW50aW1lTGlzdDsNCisgIH0NCisgIHN0YXRpYyBGWF9CT09MIGJWOEluaXRpYWxpemVkID0gRkFMU0U7DQorICBpZiAoYlY4SW5pdGlhbGl6ZWQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgYlY4SW5pdGlhbGl6ZWQgPSBUUlVFOw0KKyAgYXRleGl0KEZYSlNFX0tpbGxWOCk7DQorICBjb25zdCBGWF9DSEFSKiBzekNtZEZsYWdzID0NCisgICAgICAiLS1oYXJtb255X3Byb3hpZXMgIg0KKyAgICAgICItLWJsb2NrX2NvbmN1cnJlbnRfcmVjb21waWxhdGlvbiAiOw0KKyAgdjg6OlY4OjpTZXRGbGFnc0Zyb21TdHJpbmcoc3pDbWRGbGFncywgRlhTWVNfc3RybGVuKHN6Q21kRmxhZ3MpKTsNCit9DQorc3RhdGljIHZvaWQgRlhKU0VfUnVudGltZV9EaXNwb3NlQ2FsbGJhY2sodjg6Oklzb2xhdGUqIHBJc29sYXRlKSB7DQorICB7DQorICAgIHY4OjpMb2NrZXIgbG9ja2VyKHBJc29sYXRlKTsNCisgICAgQ0ZYSlNFX1J1bnRpbWVEYXRhKiBwUnVudGltZURhdGEgPQ0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfUnVudGltZURhdGEqPihwSXNvbGF0ZS0+R2V0RGF0YSgwKSk7DQorICAgIGlmIChwUnVudGltZURhdGEpIHsNCisgICAgICBwSXNvbGF0ZS0+U2V0RGF0YSgwLCBOVUxMKTsNCisgICAgICBkZWxldGUgcFJ1bnRpbWVEYXRhOw0KICAgICB9DQotICAgIHN0YXRpYyBGWF9CT09MIGJWOEluaXRpYWxpemVkID0gRkFMU0U7DQotICAgIGlmIChiVjhJbml0aWFsaXplZCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGJWOEluaXRpYWxpemVkID0gVFJVRTsNCi0gICAgYXRleGl0KEZYSlNFX0tpbGxWOCk7DQotICAgIGNvbnN0IEZYX0NIQVIqIHN6Q21kRmxhZ3MgPQ0KLSAgICAgICAgIi0taGFybW9ueV9wcm94aWVzICINCi0gICAgICAgICItLWJsb2NrX2NvbmN1cnJlbnRfcmVjb21waWxhdGlvbiAiDQotICAgICAgICA7DQotICAgIHY4OjpWODo6U2V0RmxhZ3NGcm9tU3RyaW5nKHN6Q21kRmxhZ3MsIEZYU1lTX3N0cmxlbihzekNtZEZsYWdzKSk7DQorICB9DQorICBwSXNvbGF0ZS0+RGlzcG9zZSgpOw0KIH0NCi1zdGF0aWMgdm9pZCBGWEpTRV9SdW50aW1lX0Rpc3Bvc2VDYWxsYmFjayh2ODo6SXNvbGF0ZSogcElzb2xhdGUpDQotew0KLSAgICB7DQotICAgICAgICB2ODo6TG9ja2VyIGxvY2tlcihwSXNvbGF0ZSk7DQotICAgICAgICBDRlhKU0VfUnVudGltZURhdGEgKnBSdW50aW1lRGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1J1bnRpbWVEYXRhKj4ocElzb2xhdGUtPkdldERhdGEoMCkpOw0KLSAgICAgICAgaWYocFJ1bnRpbWVEYXRhKSB7DQotICAgICAgICAgICAgcElzb2xhdGUtPlNldERhdGEoMCwgTlVMTCk7DQotICAgICAgICAgICAgZGVsZXRlIHBSdW50aW1lRGF0YTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwSXNvbGF0ZS0+RGlzcG9zZSgpOw0KK3ZvaWQgRlhKU0VfRmluYWxpemUoKSB7DQorICBpZiAoQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0KSB7DQorICAgIENGWEpTRV9SdW50aW1lRGF0YTo6Z19SdW50aW1lTGlzdC0+UmVtb3ZlQWxsUnVudGltZXMoDQorICAgICAgICBGWEpTRV9SdW50aW1lX0Rpc3Bvc2VDYWxsYmFjayk7DQorICAgIGRlbGV0ZSBDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3Q7DQorICAgIENGWEpTRV9SdW50aW1lRGF0YTo6Z19SdW50aW1lTGlzdCA9IE5VTEw7DQorICB9DQogfQ0KLXZvaWQgRlhKU0VfRmluYWxpemUoKQ0KLXsNCi0gICAgaWYoQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0KSB7DQotICAgICAgICBDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QtPlJlbW92ZUFsbFJ1bnRpbWVzKEZYSlNFX1J1bnRpbWVfRGlzcG9zZUNhbGxiYWNrKTsNCi0gICAgICAgIGRlbGV0ZSBDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3Q7DQotICAgICAgICBDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QgPSBOVUxMOw0KLSAgICB9DQorRlhKU0VfSFJVTlRJTUUgRlhKU0VfUnVudGltZV9DcmVhdGUoKSB7DQorICB2ODo6SXNvbGF0ZTo6Q3JlYXRlUGFyYW1zIHBhcmFtczsNCisgIHBhcmFtcy5hcnJheV9idWZmZXJfYWxsb2NhdG9yID0gbmV3IEZYSlNFX0FycmF5QnVmZmVyQWxsb2NhdG9yKCk7DQorICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSB2ODo6SXNvbGF0ZTo6TmV3KHBhcmFtcyk7DQorICBBU1NFUlQocElzb2xhdGUgJiYgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0KTsNCisgIENGWEpTRV9SdW50aW1lRGF0YTo6Z19SdW50aW1lTGlzdC0+QXBwZW5kUnVudGltZShwSXNvbGF0ZSk7DQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IUlVOVElNRT4ocElzb2xhdGUpOw0KIH0NCi1GWEpTRV9IUlVOVElNRQlGWEpTRV9SdW50aW1lX0NyZWF0ZSgpDQotew0KLSAgICB2ODo6SXNvbGF0ZTo6Q3JlYXRlUGFyYW1zIHBhcmFtczsNCi0gICAgcGFyYW1zLmFycmF5X2J1ZmZlcl9hbGxvY2F0b3IgPSBuZXcgRlhKU0VfQXJyYXlCdWZmZXJBbGxvY2F0b3IoKTsNCi0gICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gdjg6Oklzb2xhdGU6Ok5ldyhwYXJhbXMpOw0KLSAgICBBU1NFUlQocElzb2xhdGUgJiYgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0KTsNCi0gICAgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0LT5BcHBlbmRSdW50aW1lKHBJc29sYXRlKTsNCi0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFJVTlRJTUU+KHBJc29sYXRlKTsNCit2b2lkIEZYSlNFX1J1bnRpbWVfUmVsZWFzZShGWEpTRV9IUlVOVElNRSBoUnVudGltZSkgew0KKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcmVpbnRlcnByZXRfY2FzdDx2ODo6SXNvbGF0ZSo+KGhSdW50aW1lKTsNCisgIGlmIChwSXNvbGF0ZSkgew0KKyAgICBBU1NFUlQoQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0KTsNCisgICAgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0LT5SZW1vdmVSdW50aW1lKA0KKyAgICAgICAgcElzb2xhdGUsIEZYSlNFX1J1bnRpbWVfRGlzcG9zZUNhbGxiYWNrKTsNCisgIH0NCiB9DQotdm9pZCBGWEpTRV9SdW50aW1lX1JlbGVhc2UoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpDQotew0KLSAgICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSByZWludGVycHJldF9jYXN0PHY4OjpJc29sYXRlKj4oaFJ1bnRpbWUpOw0KLSAgICBpZihwSXNvbGF0ZSkgew0KLSAgICAgICAgQVNTRVJUKENGWEpTRV9SdW50aW1lRGF0YTo6Z19SdW50aW1lTGlzdCk7DQotICAgICAgICBDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QtPlJlbW92ZVJ1bnRpbWUocElzb2xhdGUsIEZYSlNFX1J1bnRpbWVfRGlzcG9zZUNhbGxiYWNrKTsNCi0gICAgfQ0KK0NGWEpTRV9SdW50aW1lRGF0YSogQ0ZYSlNFX1J1bnRpbWVEYXRhOjpDcmVhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlKSB7DQorICBDRlhKU0VfUnVudGltZURhdGEqIHBSdW50aW1lRGF0YSA9IEZYX05FVyBDRlhKU0VfUnVudGltZURhdGEocElzb2xhdGUpOw0KKyAgQVNTRVJUKHBSdW50aW1lRGF0YSk7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUocElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBoRnVuY1RlbXBsYXRlID0NCisgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHBJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaENvbnRleHQgPQ0KKyAgICAgIHY4OjpDb250ZXh0OjpOZXcocElzb2xhdGUsIDAsIGhGdW5jVGVtcGxhdGUtPkluc3RhbmNlVGVtcGxhdGUoKSk7DQorICBoQ29udGV4dC0+U2V0U2VjdXJpdHlUb2tlbih2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgcElzb2xhdGUpKTsNCisgIHBSdW50aW1lRGF0YS0+bV9oUm9vdENvbnRleHRHbG9iYWxUZW1wbGF0ZS5SZXNldChwSXNvbGF0ZSwgaEZ1bmNUZW1wbGF0ZSk7DQorICBwUnVudGltZURhdGEtPm1faFJvb3RDb250ZXh0LlJlc2V0KHBJc29sYXRlLCBoQ29udGV4dCk7DQorICByZXR1cm4gcFJ1bnRpbWVEYXRhOw0KIH0NCi1DRlhKU0VfUnVudGltZURhdGEqIENGWEpTRV9SdW50aW1lRGF0YTo6Q3JlYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkNCi17DQotICAgIENGWEpTRV9SdW50aW1lRGF0YSogcFJ1bnRpbWVEYXRhID0gRlhfTkVXIENGWEpTRV9SdW50aW1lRGF0YShwSXNvbGF0ZSk7DQorQ0ZYSlNFX1J1bnRpbWVEYXRhKiBDRlhKU0VfUnVudGltZURhdGE6OkdldCh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsNCisgIEFTU0VSVChwSXNvbGF0ZSk7DQorICBDRlhKU0VfUnVudGltZURhdGEqIHBSdW50aW1lRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZYSlNFX1J1bnRpbWVEYXRhKj4ocElzb2xhdGUtPkdldERhdGEoMCkpOw0KKyAgaWYgKCFwUnVudGltZURhdGEpIHsNCisgICAgcFJ1bnRpbWVEYXRhID0gQ0ZYSlNFX1J1bnRpbWVEYXRhOjpDcmVhdGUocElzb2xhdGUpOw0KICAgICBBU1NFUlQocFJ1bnRpbWVEYXRhKTsNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKHBJc29sYXRlKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBoRnVuY1RlbXBsYXRlID0gdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhwSXNvbGF0ZSk7DQotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaENvbnRleHQgPSB2ODo6Q29udGV4dDo6TmV3KHBJc29sYXRlLCAwLCBoRnVuY1RlbXBsYXRlLT5JbnN0YW5jZVRlbXBsYXRlKCkpOw0KLSAgICBoQ29udGV4dC0+U2V0U2VjdXJpdHlUb2tlbih2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgcElzb2xhdGUpKTsNCi0gICAgcFJ1bnRpbWVEYXRhLT5tX2hSb290Q29udGV4dEdsb2JhbFRlbXBsYXRlLlJlc2V0KHBJc29sYXRlLCBoRnVuY1RlbXBsYXRlKTsNCi0gICAgcFJ1bnRpbWVEYXRhLT5tX2hSb290Q29udGV4dC5SZXNldChwSXNvbGF0ZSwgaENvbnRleHQpOw0KLSAgICByZXR1cm4gcFJ1bnRpbWVEYXRhOw0KKyAgICBwSXNvbGF0ZS0+U2V0RGF0YSgwLCBwUnVudGltZURhdGEpOw0KKyAgfQ0KKyAgcmV0dXJuIHBSdW50aW1lRGF0YTsNCiB9DQotQ0ZYSlNFX1J1bnRpbWVEYXRhKiBDRlhKU0VfUnVudGltZURhdGE6OkdldCh2ODo6SXNvbGF0ZSogcElzb2xhdGUpDQotew0KLSAgICBBU1NFUlQocElzb2xhdGUpOw0KLSAgICBDRlhKU0VfUnVudGltZURhdGEqIHBSdW50aW1lRGF0YSA9IHN0YXRpY19jYXN0PENGWEpTRV9SdW50aW1lRGF0YSo+KHBJc29sYXRlLT5HZXREYXRhKDApKTsNCi0gICAgaWYoIXBSdW50aW1lRGF0YSkgew0KLSAgICAgICAgcFJ1bnRpbWVEYXRhID0gQ0ZYSlNFX1J1bnRpbWVEYXRhOjpDcmVhdGUocElzb2xhdGUpOw0KLSAgICAgICAgQVNTRVJUKHBSdW50aW1lRGF0YSk7DQotICAgICAgICBwSXNvbGF0ZS0+U2V0RGF0YSgwLCBwUnVudGltZURhdGEpOw0KLSAgICB9DQotICAgIHJldHVybiBwUnVudGltZURhdGE7DQorQ0ZYSlNFX1J1bnRpbWVMaXN0KiBDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QgPSBOVUxMOw0KK3ZvaWQgQ0ZYSlNFX1J1bnRpbWVMaXN0OjpBcHBlbmRSdW50aW1lKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgew0KKyAgbV9SdW50aW1lTGlzdC5BZGQocElzb2xhdGUpOw0KIH0NCi1DRlhKU0VfUnVudGltZUxpc3QgKiBDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QgPSBOVUxMOw0KLXZvaWQgQ0ZYSlNFX1J1bnRpbWVMaXN0OjpBcHBlbmRSdW50aW1lKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkNCi17DQotICAgIG1fUnVudGltZUxpc3QuQWRkKHBJc29sYXRlKTsNCit2b2lkIENGWEpTRV9SdW50aW1lTGlzdDo6UmVtb3ZlUnVudGltZSgNCisgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlLA0KKyAgICBDRlhKU0VfUnVudGltZUxpc3Q6OlJ1bnRpbWVEaXNwb3NlQ2FsbGJhY2sgbHBmbkRpc3Bvc2VDYWxsYmFjaykgew0KKyAgaW50MzJfdCBpSWR4ID0gbV9SdW50aW1lTGlzdC5GaW5kKHBJc29sYXRlLCAwKTsNCisgIGlmIChpSWR4ID49IDApIHsNCisgICAgbV9SdW50aW1lTGlzdC5SZW1vdmVBdChpSWR4LCAxKTsNCisgIH0NCisgIGlmIChscGZuRGlzcG9zZUNhbGxiYWNrKSB7DQorICAgIGxwZm5EaXNwb3NlQ2FsbGJhY2socElzb2xhdGUpOw0KKyAgfQ0KIH0NCi12b2lkIENGWEpTRV9SdW50aW1lTGlzdDo6UmVtb3ZlUnVudGltZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUsIENGWEpTRV9SdW50aW1lTGlzdDo6UnVudGltZURpc3Bvc2VDYWxsYmFjayBscGZuRGlzcG9zZUNhbGxiYWNrKQ0KLXsNCi0gICAgaW50MzJfdCBpSWR4ID0gbV9SdW50aW1lTGlzdC5GaW5kKHBJc29sYXRlLCAwKTsNCi0gICAgaWYoaUlkeCA+PSAwKSB7DQotICAgICAgICBtX1J1bnRpbWVMaXN0LlJlbW92ZUF0KGlJZHgsIDEpOw0KK3ZvaWQgQ0ZYSlNFX1J1bnRpbWVMaXN0OjpSZW1vdmVBbGxSdW50aW1lcygNCisgICAgQ0ZYSlNFX1J1bnRpbWVMaXN0OjpSdW50aW1lRGlzcG9zZUNhbGxiYWNrIGxwZm5EaXNwb3NlQ2FsbGJhY2spIHsNCisgIGludDMyX3QgaVNpemUgPSBtX1J1bnRpbWVMaXN0LkdldFNpemUoKTsNCisgIGlmIChscGZuRGlzcG9zZUNhbGxiYWNrKSB7DQorICAgIGZvciAoaW50MzJfdCBpSWR4ID0gMDsgaUlkeCA8IGlTaXplOyBpSWR4KyspIHsNCisgICAgICBscGZuRGlzcG9zZUNhbGxiYWNrKG1fUnVudGltZUxpc3RbaUlkeF0pOw0KICAgICB9DQotICAgIGlmKGxwZm5EaXNwb3NlQ2FsbGJhY2spIHsNCi0gICAgICAgIGxwZm5EaXNwb3NlQ2FsbGJhY2socElzb2xhdGUpOw0KLSAgICB9DQotfQ0KLXZvaWQgQ0ZYSlNFX1J1bnRpbWVMaXN0OjpSZW1vdmVBbGxSdW50aW1lcyhDRlhKU0VfUnVudGltZUxpc3Q6OlJ1bnRpbWVEaXNwb3NlQ2FsbGJhY2sgbHBmbkRpc3Bvc2VDYWxsYmFjaykNCi17DQotICAgIGludDMyX3QgaVNpemUgPSBtX1J1bnRpbWVMaXN0LkdldFNpemUoKTsNCi0gICAgaWYobHBmbkRpc3Bvc2VDYWxsYmFjaykgew0KLSAgICAgICAgZm9yKGludDMyX3QgaUlkeCA9IDA7IGlJZHggPCBpU2l6ZTsgaUlkeCsrKSB7DQotICAgICAgICAgICAgbHBmbkRpc3Bvc2VDYWxsYmFjayhtX1J1bnRpbWVMaXN0W2lJZHhdKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX1J1bnRpbWVMaXN0LlJlbW92ZUFsbCgpOw0KKyAgfQ0KKyAgbV9SdW50aW1lTGlzdC5SZW1vdmVBbGwoKTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvcnVudGltZS5oIGIveGZhL3NyYy9meGpzZS9zcmMvcnVudGltZS5oCmluZGV4IGE1MWRjOGYuLmQ3YzM3YWUgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhqc2Uvc3JjL3J1bnRpbWUuaAorKysgYi94ZmEvc3JjL2Z4anNlL3NyYy9ydW50aW1lLmgKQEAgLTcsMzMgKzcsMzggQEAKICNpZm5kZWYgRlhKU0VfUlVOVElNRV9IXw0KICNkZWZpbmUgRlhKU0VfUlVOVElNRV9IXw0KIGNsYXNzIENGWEpTRV9SdW50aW1lTGlzdDsNCi1jbGFzcyBDRlhKU0VfUnVudGltZURhdGENCi17DQotcHJvdGVjdGVkOg0KLSAgICBDRlhKU0VfUnVudGltZURhdGEodjg6Oklzb2xhdGUqIHBJc29sYXRlKSA6IG1fcElzb2xhdGUocElzb2xhdGUpIHt9Ow0KLXB1YmxpYzoNCi0gICAgc3RhdGljIENGWEpTRV9SdW50aW1lRGF0YSogQ3JlYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7DQotICAgIHN0YXRpYyBDRlhKU0VfUnVudGltZURhdGEqIEdldCh2ODo6SXNvbGF0ZSogcElzb2xhdGUpOw0KLXB1YmxpYzoNCi0gICAgdjg6Oklzb2xhdGUqCQkJCQkJCW1fcElzb2xhdGU7DQotICAgIHY4OjpHbG9iYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+CW1faFJvb3RDb250ZXh0R2xvYmFsVGVtcGxhdGU7DQotICAgIHY4OjpHbG9iYWw8djg6OkNvbnRleHQ+CQkJCW1faFJvb3RDb250ZXh0Ow0KLXB1YmxpYzoNCi0gICAgc3RhdGljIENGWEpTRV9SdW50aW1lTGlzdCoJZ19SdW50aW1lTGlzdDsNCi1wcm90ZWN0ZWQ6DQotICAgIENGWEpTRV9SdW50aW1lRGF0YSgpOw0KLSAgICBDRlhKU0VfUnVudGltZURhdGEoY29uc3QgQ0ZYSlNFX1J1bnRpbWVEYXRhJik7DQotICAgIENGWEpTRV9SdW50aW1lRGF0YSYgb3BlcmF0b3IgPSAoY29uc3QgQ0ZYSlNFX1J1bnRpbWVEYXRhJik7DQorY2xhc3MgQ0ZYSlNFX1J1bnRpbWVEYXRhIHsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYSlNFX1J1bnRpbWVEYXRhKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgOiBtX3BJc29sYXRlKHBJc29sYXRlKXt9Ow0KKw0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZYSlNFX1J1bnRpbWVEYXRhKiBDcmVhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsNCisgIHN0YXRpYyBDRlhKU0VfUnVudGltZURhdGEqIEdldCh2ODo6SXNvbGF0ZSogcElzb2xhdGUpOw0KKw0KKyBwdWJsaWM6DQorICB2ODo6SXNvbGF0ZSogbV9wSXNvbGF0ZTsNCisgIHY4OjpHbG9iYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IG1faFJvb3RDb250ZXh0R2xvYmFsVGVtcGxhdGU7DQorICB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiBtX2hSb290Q29udGV4dDsNCisNCisgcHVibGljOg0KKyAgc3RhdGljIENGWEpTRV9SdW50aW1lTGlzdCogZ19SdW50aW1lTGlzdDsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYSlNFX1J1bnRpbWVEYXRhKCk7DQorICBDRlhKU0VfUnVudGltZURhdGEoY29uc3QgQ0ZYSlNFX1J1bnRpbWVEYXRhJik7DQorICBDRlhKU0VfUnVudGltZURhdGEmIG9wZXJhdG9yPShjb25zdCBDRlhKU0VfUnVudGltZURhdGEmKTsNCiB9Ow0KLWNsYXNzIENGWEpTRV9SdW50aW1lTGlzdA0KLXsNCi1wdWJsaWM6DQotICAgIHR5cGVkZWYgdm9pZCAoKlJ1bnRpbWVEaXNwb3NlQ2FsbGJhY2spKHY4OjpJc29sYXRlKik7DQotcHVibGljOg0KLSAgICB2b2lkIEFwcGVuZFJ1bnRpbWUodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsNCi0gICAgdm9pZCBSZW1vdmVSdW50aW1lKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgUnVudGltZURpc3Bvc2VDYWxsYmFjayBscGZuRGlzcG9zZUNhbGxiYWNrKTsNCi0gICAgdm9pZCBSZW1vdmVBbGxSdW50aW1lcyhSdW50aW1lRGlzcG9zZUNhbGxiYWNrIGxwZm5EaXNwb3NlQ2FsbGJhY2spOw0KLXByb3RlY3RlZDoNCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8djg6Oklzb2xhdGUqPiBtX1J1bnRpbWVMaXN0Ow0KK2NsYXNzIENGWEpTRV9SdW50aW1lTGlzdCB7DQorIHB1YmxpYzoNCisgIHR5cGVkZWYgdm9pZCAoKlJ1bnRpbWVEaXNwb3NlQ2FsbGJhY2spKHY4OjpJc29sYXRlKik7DQorDQorIHB1YmxpYzoNCisgIHZvaWQgQXBwZW5kUnVudGltZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpOw0KKyAgdm9pZCBSZW1vdmVSdW50aW1lKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICBSdW50aW1lRGlzcG9zZUNhbGxiYWNrIGxwZm5EaXNwb3NlQ2FsbGJhY2spOw0KKyAgdm9pZCBSZW1vdmVBbGxSdW50aW1lcyhSdW50aW1lRGlzcG9zZUNhbGxiYWNrIGxwZm5EaXNwb3NlQ2FsbGJhY2spOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfQXJyYXlUZW1wbGF0ZTx2ODo6SXNvbGF0ZSo+IG1fUnVudGltZUxpc3Q7DQogfTsNCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4anNlL3NyYy9zY29wZV9pbmxpbmUuaCBiL3hmYS9zcmMvZnhqc2Uvc3JjL3Njb3BlX2lubGluZS5oCmluZGV4IDhhNTkwZjMuLmIwMmM3M2EgMTAwNjQ0Ci0tLSBhL3hmYS9zcmMvZnhqc2Uvc3JjL3Njb3BlX2lubGluZS5oCisrKyBiL3hmYS9zcmMvZnhqc2Uvc3JjL3Njb3BlX2lubGluZS5oCkBAIC04LDc5ICs4LDk4IEBACiAjZGVmaW5lIEZYSlNFX1NDT1BFX0lOTElORV9IXw0KICNpbmNsdWRlICJydW50aW1lLmgiDQogI2luY2x1ZGUgImNvbnRleHQuaCINCi1jbGFzcyBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUNCi17DQotcHJvdGVjdGVkOg0KLSAgICB2ODo6SXNvbGF0ZSoJCW1faXNvbGF0ZTsNCi0gICAgdjg6OkxvY2tlcgkJCW1fbG9ja2VyOw0KLSAgICB2ODo6SXNvbGF0ZTo6U2NvcGUJbV9pc2NvcGU7DQotICAgIHY4OjpIYW5kbGVTY29wZQkJbV9oc2NvcGU7DQotcHVibGljOg0KLSAgICBleHBsaWNpdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUodjg6Oklzb2xhdGUqIHBJc29sYXRlKSA6IG1faXNvbGF0ZShwSXNvbGF0ZSksIG1fbG9ja2VyKHBJc29sYXRlKSwgbV9pc2NvcGUocElzb2xhdGUpLCBtX2hzY29wZShwSXNvbGF0ZSkge30NCi0gICAgdjg6Oklzb2xhdGUqCQkJR2V0SXNvbGF0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2lzb2xhdGU7DQotICAgIH0NCi1wcml2YXRlOg0KLSAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUoY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlJik7DQotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSYpOw0KLSAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpOw0KLSAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsNCitjbGFzcyBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgew0KKyBwcm90ZWN0ZWQ6DQorICB2ODo6SXNvbGF0ZSogbV9pc29sYXRlOw0KKyAgdjg6OkxvY2tlciBtX2xvY2tlcjsNCisgIHY4OjpJc29sYXRlOjpTY29wZSBtX2lzY29wZTsNCisgIHY4OjpIYW5kbGVTY29wZSBtX2hzY29wZTsNCisNCisgcHVibGljOg0KKyAgZXhwbGljaXQgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkNCisgICAgICA6IG1faXNvbGF0ZShwSXNvbGF0ZSksDQorICAgICAgICBtX2xvY2tlcihwSXNvbGF0ZSksDQorICAgICAgICBtX2lzY29wZShwSXNvbGF0ZSksDQorICAgICAgICBtX2hzY29wZShwSXNvbGF0ZSkge30NCisgIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkgeyByZXR1cm4gbV9pc29sYXRlOyB9DQorDQorIHByaXZhdGU6DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUoY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlJik7DQorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUmKTsNCisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSk7DQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsNCiB9Ow0KLWNsYXNzIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0DQotew0KLSAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgbV9wYXJlbnQ7DQotICAgIHY4OjpDb250ZXh0OjpTY29wZQltX2NzY29wZTsNCi1wdWJsaWM6DQotICAgIGV4cGxpY2l0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgOiBtX3BhcmVudChwSXNvbGF0ZSksIG1fY3Njb3BlKHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhwSXNvbGF0ZSwJQ0ZYSlNFX1J1bnRpbWVEYXRhOjpHZXQocElzb2xhdGUpLT5tX2hSb290Q29udGV4dCkpIHt9DQotcHJpdmF0ZToNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQoY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQmKTsNCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQmKTsNCi0gICAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplKTsNCi0gICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIHNpemVfdCk7DQorY2xhc3MgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIG1fcGFyZW50Ow0KKyAgdjg6OkNvbnRleHQ6OlNjb3BlIG1fY3Njb3BlOw0KKw0KKyBwdWJsaWM6DQorICBleHBsaWNpdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCh2ODo6SXNvbGF0ZSogcElzb2xhdGUpDQorICAgICAgOiBtX3BhcmVudChwSXNvbGF0ZSksDQorICAgICAgICBtX2NzY29wZSh2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcoDQorICAgICAgICAgICAgcElzb2xhdGUsDQorICAgICAgICAgICAgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpHZXQocElzb2xhdGUpLT5tX2hSb290Q29udGV4dCkpIHt9DQorDQorIHByaXZhdGU6DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCgNCisgICAgICBjb25zdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCYpOw0KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQmKTsNCisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSk7DQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsNCiB9Ow0KLWNsYXNzIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQNCi17DQotICAgIENGWEpTRV9Db250ZXh0KgkJCQkJbV9jb250ZXh0Ow0KLSAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUJbV9wYXJlbnQ7DQotICAgIHY4OjpDb250ZXh0OjpTY29wZQkJCQltX2NzY29wZTsNCi1wdWJsaWM6DQotICAgIGV4cGxpY2l0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0KSA6IG1fY29udGV4dChwQ29udGV4dCksIG1fcGFyZW50KHBDb250ZXh0LT5tX3BJc29sYXRlKSwgbV9jc2NvcGUodjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KHBDb250ZXh0LT5tX3BJc29sYXRlLCBwQ29udGV4dC0+bV9oQ29udGV4dCkpIHt9DQotICAgIHY4OjpJc29sYXRlKgkJCUdldElzb2xhdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9jb250ZXh0LT5tX3BJc29sYXRlOw0KLSAgICB9DQotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4JR2V0TG9jYWxDb250ZXh0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX2NvbnRleHQtPm1fcElzb2xhdGUsIG1fY29udGV4dC0+bV9oQ29udGV4dCk7DQotICAgIH0NCi1wcml2YXRlOg0KLSAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0KGNvbnN0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQmKTsNCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlQ29udGV4dCYpOw0KLSAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpOw0KLSAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsNCitjbGFzcyBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0IHsNCisgIENGWEpTRV9Db250ZXh0KiBtX2NvbnRleHQ7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgbV9wYXJlbnQ7DQorICB2ODo6Q29udGV4dDo6U2NvcGUgbV9jc2NvcGU7DQorDQorIHB1YmxpYzoNCisgIGV4cGxpY2l0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0KQ0KKyAgICAgIDogbV9jb250ZXh0KHBDb250ZXh0KSwNCisgICAgICAgIG1fcGFyZW50KHBDb250ZXh0LT5tX3BJc29sYXRlKSwNCisgICAgICAgIG1fY3Njb3BlKHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhwQ29udGV4dC0+bV9wSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bV9oQ29udGV4dCkpIHt9DQorICB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIHsgcmV0dXJuIG1fY29udGV4dC0+bV9wSXNvbGF0ZTsgfQ0KKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBHZXRMb2NhbENvbnRleHQoKSB7DQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcobV9jb250ZXh0LT5tX3BJc29sYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29udGV4dC0+bV9oQ29udGV4dCk7DQorICB9DQorDQorIHByaXZhdGU6DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0KA0KKyAgICAgIGNvbnN0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQmKTsNCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQmKTsNCisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSk7DQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsNCiB9Ow0KLWNsYXNzIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RPck5vcm1hbENvbnRleHQNCi17DQotICAgIENGWEpTRV9Db250ZXh0KgkJCQkJbV9jb250ZXh0Ow0KLSAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUJbV9wYXJlbnQ7DQotICAgIHY4OjpDb250ZXh0OjpTY29wZQkJCQltX2NzY29wZTsNCi1wdWJsaWM6DQotICAgIGV4cGxpY2l0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RPck5vcm1hbENvbnRleHQodjg6Oklzb2xhdGUqIHBJc29sYXRlLCBDRlhKU0VfQ29udGV4dCogcENvbnRleHQpDQotICAgICAgICA6IG1fY29udGV4dChwQ29udGV4dCksIG1fcGFyZW50KHBJc29sYXRlKSwgbV9jc2NvcGUodjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KHBJc29sYXRlLCBwQ29udGV4dCA/IHBDb250ZXh0LT5tX2hDb250ZXh0IDogQ0ZYSlNFX1J1bnRpbWVEYXRhOjpHZXQocElzb2xhdGUpLT5tX2hSb290Q29udGV4dCkpIHt9DQotICAgIHY4OjpJc29sYXRlKgkJCUdldElzb2xhdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wYXJlbnQuR2V0SXNvbGF0ZSgpOw0KLSAgICB9DQotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4JR2V0TG9jYWxDb250ZXh0KCkNCi0gICAgew0KLSAgICAgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gbV9wYXJlbnQuR2V0SXNvbGF0ZSgpOw0KLSAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhwSXNvbGF0ZSwgbV9jb250ZXh0ID8gbV9jb250ZXh0LT5tX2hDb250ZXh0IDogQ0ZYSlNFX1J1bnRpbWVEYXRhOjpHZXQocElzb2xhdGUpLT5tX2hSb290Q29udGV4dCk7DQotICAgIH0NCi1wcml2YXRlOg0KLSAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290T3JOb3JtYWxDb250ZXh0KGNvbnN0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RPck5vcm1hbENvbnRleHQmKTsNCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdE9yTm9ybWFsQ29udGV4dCYpOw0KLSAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpOw0KLSAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsNCitjbGFzcyBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290T3JOb3JtYWxDb250ZXh0IHsNCisgIENGWEpTRV9Db250ZXh0KiBtX2NvbnRleHQ7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgbV9wYXJlbnQ7DQorICB2ODo6Q29udGV4dDo6U2NvcGUgbV9jc2NvcGU7DQorDQorIHB1YmxpYzoNCisgIGV4cGxpY2l0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RPck5vcm1hbENvbnRleHQoDQorICAgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlLA0KKyAgICAgIENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCkNCisgICAgICA6IG1fY29udGV4dChwQ29udGV4dCksDQorICAgICAgICBtX3BhcmVudChwSXNvbGF0ZSksDQorICAgICAgICBtX2NzY29wZSh2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcoDQorICAgICAgICAgICAgcElzb2xhdGUsDQorICAgICAgICAgICAgcENvbnRleHQgPyBwQ29udGV4dC0+bV9oQ29udGV4dA0KKyAgICAgICAgICAgICAgICAgICAgIDogQ0ZYSlNFX1J1bnRpbWVEYXRhOjpHZXQocElzb2xhdGUpLT5tX2hSb290Q29udGV4dCkpIHt9DQorICB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIHsgcmV0dXJuIG1fcGFyZW50LkdldElzb2xhdGUoKTsgfQ0KKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBHZXRMb2NhbENvbnRleHQoKSB7DQorICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IG1fcGFyZW50LkdldElzb2xhdGUoKTsNCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldygNCisgICAgICAgIHBJc29sYXRlLCBtX2NvbnRleHQNCisgICAgICAgICAgICAgICAgICAgICAgPyBtX2NvbnRleHQtPm1faENvbnRleHQNCisgICAgICAgICAgICAgICAgICAgICAgOiBDRlhKU0VfUnVudGltZURhdGE6OkdldChwSXNvbGF0ZSktPm1faFJvb3RDb250ZXh0KTsNCisgIH0NCisNCisgcHJpdmF0ZToNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RPck5vcm1hbENvbnRleHQoDQorICAgICAgY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdE9yTm9ybWFsQ29udGV4dCYpOw0KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdE9yTm9ybWFsQ29udGV4dCYpOw0KKyAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplKTsNCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3QpOw0KIH07DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvdXRpbF9pbmxpbmUuaCBiL3hmYS9zcmMvZnhqc2Uvc3JjL3V0aWxfaW5saW5lLmgKaW5kZXggMzQyNTQ2NS4uODAwMzRhYSAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGpzZS9zcmMvdXRpbF9pbmxpbmUuaAorKysgYi94ZmEvc3JjL2Z4anNlL3NyYy91dGlsX2lubGluZS5oCkBAIC02LDM5ICs2LDQyIEBACiANCiAjaWZuZGVmIEZYSlNFX1VUSUxfSU5MSU5FX0hfDQogI2RlZmluZSBGWEpTRV9VVElMX0lOTElORV9IXw0KLXN0YXRpYyBWOF9JTkxJTkUgdjg6OkxvY2FsPHY4OjpPYmplY3Q+CUZYSlNFX0dldEdsb2JhbE9iamVjdEZyb21Db250ZXh0KGNvbnN0IHY4OjpMb2NhbDx2ODo6Q29udGV4dD4mIGhDb250ZXh0KQ0KLXsNCi0gICAgcmV0dXJuIGhDb250ZXh0LT5HbG9iYWwoKS0+R2V0UHJvdG90eXBlKCkuQXM8djg6Ok9iamVjdD4oKTsNCitzdGF0aWMgVjhfSU5MSU5FIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBGWEpTRV9HZXRHbG9iYWxPYmplY3RGcm9tQ29udGV4dCgNCisgICAgY29uc3Qgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiYgaENvbnRleHQpIHsNCisgIHJldHVybiBoQ29udGV4dC0+R2xvYmFsKCktPkdldFByb3RvdHlwZSgpLkFzPHY4OjpPYmplY3Q+KCk7DQogfQ0KLXN0YXRpYyBWOF9JTkxJTkUgdm9pZAkJCQkJRlhKU0VfVXBkYXRlT2JqZWN0QmluZGluZyh2ODo6TG9jYWw8djg6Ok9iamVjdD4mIGhPYmplY3QsIHZvaWQqIGxwTmV3QmluZGluZykNCi17DQotICAgIEFTU0VSVCghaE9iamVjdC5Jc0VtcHR5KCkpOw0KLSAgICBBU1NFUlQoaE9iamVjdC0+SW50ZXJuYWxGaWVsZENvdW50KCkgPiAwKTsNCi0gICAgaE9iamVjdC0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgbHBOZXdCaW5kaW5nKTsNCitzdGF0aWMgVjhfSU5MSU5FIHZvaWQgRlhKU0VfVXBkYXRlT2JqZWN0QmluZGluZyh2ODo6TG9jYWw8djg6Ok9iamVjdD4mIGhPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbHBOZXdCaW5kaW5nKSB7DQorICBBU1NFUlQoIWhPYmplY3QuSXNFbXB0eSgpKTsNCisgIEFTU0VSVChoT2JqZWN0LT5JbnRlcm5hbEZpZWxkQ291bnQoKSA+IDApOw0KKyAgaE9iamVjdC0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgbHBOZXdCaW5kaW5nKTsNCiB9DQotc3RhdGljIFY4X0lOTElORSB2b2lkKgkJCQlGWEpTRV9SZXRyaWV2ZU9iamVjdEJpbmRpbmcoY29uc3Qgdjg6OkxvY2FsPHY4OjpPYmplY3Q+JiBoSlNPYmplY3QsIENGWEpTRV9DbGFzcyogbHBDbGFzcyA9IE5VTEwpDQotew0KLSAgICBBU1NFUlQoIWhKU09iamVjdC5Jc0VtcHR5KCkpOw0KLSAgICBpZighaEpTT2JqZWN0LT5Jc09iamVjdCgpKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCitzdGF0aWMgVjhfSU5MSU5FIHZvaWQqIEZYSlNFX1JldHJpZXZlT2JqZWN0QmluZGluZygNCisgICAgY29uc3Qgdjg6OkxvY2FsPHY4OjpPYmplY3Q+JiBoSlNPYmplY3QsDQorICAgIENGWEpTRV9DbGFzcyogbHBDbGFzcyA9IE5VTEwpIHsNCisgIEFTU0VSVCghaEpTT2JqZWN0LklzRW1wdHkoKSk7DQorICBpZiAoIWhKU09iamVjdC0+SXNPYmplY3QoKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoT2JqZWN0ID0gaEpTT2JqZWN0Ow0KKyAgaWYgKGhPYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID09IDApIHsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFByb3RvT2JqZWN0ID0gaE9iamVjdC0+R2V0UHJvdG90eXBlKCk7DQorICAgIGlmIChoUHJvdG9PYmplY3QuSXNFbXB0eSgpIHx8ICFoUHJvdG9PYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaE9iamVjdCA9IGhKU09iamVjdDsNCi0gICAgaWYoaE9iamVjdC0+SW50ZXJuYWxGaWVsZENvdW50KCkgPT0gMCkgew0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFByb3RvT2JqZWN0ID0gaE9iamVjdC0+R2V0UHJvdG90eXBlKCk7DQotICAgICAgICBpZihoUHJvdG9PYmplY3QuSXNFbXB0eSgpIHx8ICFoUHJvdG9PYmplY3QtPklzT2JqZWN0KCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCi0gICAgICAgIGhPYmplY3QgPSBoUHJvdG9PYmplY3QuQXM8djg6Ok9iamVjdD4oKTsNCi0gICAgICAgIGlmKGhPYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID09IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgICAgIH0NCisgICAgaE9iamVjdCA9IGhQcm90b09iamVjdC5Bczx2ODo6T2JqZWN0PigpOw0KKyAgICBpZiAoaE9iamVjdC0+SW50ZXJuYWxGaWVsZENvdW50KCkgPT0gMCkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KICAgICB9DQotICAgIGlmKGxwQ2xhc3MpIHsNCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gaENsYXNzID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KGxwQ2xhc3MtPkdldENvbnRleHQoKS0+R2V0UnVudGltZSgpLCBscENsYXNzLT5HZXRUZW1wbGF0ZSgpKTsNCi0gICAgICAgIGlmKCFoQ2xhc3MtPkhhc0luc3RhbmNlKGhPYmplY3QpKSB7DQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgICAgICB9DQorICB9DQorICBpZiAobHBDbGFzcykgew0KKyAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGhDbGFzcyA9DQorICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+OjpOZXcoDQorICAgICAgICAgICAgbHBDbGFzcy0+R2V0Q29udGV4dCgpLT5HZXRSdW50aW1lKCksIGxwQ2xhc3MtPkdldFRlbXBsYXRlKCkpOw0KKyAgICBpZiAoIWhDbGFzcy0+SGFzSW5zdGFuY2UoaE9iamVjdCkpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCiAgICAgfQ0KLSAgICByZXR1cm4gaE9iamVjdC0+R2V0QWxpZ25lZFBvaW50ZXJGcm9tSW50ZXJuYWxGaWVsZCgwKTsNCisgIH0NCisgIHJldHVybiBoT2JqZWN0LT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApOw0KIH0NCiAjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5jcHAgYi94ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5jcHAKaW5kZXggMjc2NzRmZi4uODQwMmE3OCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGpzZS9zcmMvdmFsdWUuY3BwCisrKyBiL3hmYS9zcmMvZnhqc2Uvc3JjL3ZhbHVlLmNwcApAQCAtMTAsNTA1ICsxMCw1MzggQEAKICNpbmNsdWRlICJjbGFzcy5oIg0KICNpbmNsdWRlIDxtYXRoLmg+DQogI2luY2x1ZGUgInV0aWxfaW5saW5lLmgiDQotRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZAkoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNVbmRlZmluZWQoKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzVW5kZWZpbmVkKCk7DQogfQ0KLUZYX0JPT0wgRlhKU0VfVmFsdWVfSXNOdWxsCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNOdWxsKCk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc051bGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNOdWxsKCk7DQogfQ0KLUZYX0JPT0wgRlhKU0VfVmFsdWVfSXNCb29sZWFuCShGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc0Jvb2xlYW4oKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc0Jvb2xlYW4oKTsNCiB9DQotRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNTdHJpbmcoKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc1N0cmluZygpOw0KIH0NCi1GWF9CT09MIEZYSlNFX1ZhbHVlX0lzTnVtYmVyCShGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc051bWJlcigpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNOdW1iZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNOdW1iZXIoKTsNCiB9DQotRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc0ludGVnZXIJKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzSW50ZWdlcigpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNJbnRlZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzSW50ZWdlcigpOw0KIH0NCi1GWF9CT09MCUZYSlNFX1ZhbHVlX0lzT2JqZWN0CShGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc09iamVjdCgpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNPYmplY3QoRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNPYmplY3QoKTsNCiB9DQotRlhfQk9PTAlGWEpTRV9WYWx1ZV9Jc0FycmF5CShGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc0FycmF5KCk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc0FycmF5KEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzQXJyYXkoKTsNCiB9DQotRlhfQk9PTAlGWEpTRV9WYWx1ZV9Jc0Z1bmN0aW9uKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzRnVuY3Rpb24oKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzRnVuY3Rpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNGdW5jdGlvbigpOw0KIH0NCi1GWF9CT09MIEZYSlNFX1ZhbHVlX0lzRGF0ZShGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc0RhdGUoKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzRGF0ZShGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc0RhdGUoKTsNCiB9DQotRlhfQk9PTAkJRlhKU0VfVmFsdWVfVG9Cb29sZWFuCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZS0+VG9Cb29sZWFuKCk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4oRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlRvQm9vbGVhbigpOw0KIH0NCi1GWF9GTE9BVAlGWEpTRV9WYWx1ZV9Ub0Zsb2F0CQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIEFTU0VSVChscFZhbHVlKTsNCi0gICAgcmV0dXJuIGxwVmFsdWUtPlRvRmxvYXQoKTsNCitGWF9GTE9BVCBGWEpTRV9WYWx1ZV9Ub0Zsb2F0KEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5Ub0Zsb2F0KCk7DQogfQ0KLUZYSlNFX0RPVUJMRSBGWEpTRV9WYWx1ZV9Ub0RvdWJsZQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIEFTU0VSVChscFZhbHVlKTsNCi0gICAgcmV0dXJuIGxwVmFsdWUtPlRvRG91YmxlKCk7DQorRlhKU0VfRE9VQkxFIEZYSlNFX1ZhbHVlX1RvRG91YmxlKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5Ub0RvdWJsZSgpOw0KIH0NCi12b2lkCQlGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIENGWF9CeXRlU3RyaW5nJiBzelN0ck91dHB1dCkNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZS0+VG9TdHJpbmcoc3pTdHJPdXRwdXQpOw0KK3ZvaWQgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN6U3RyT3V0cHV0KSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+VG9TdHJpbmcoc3pTdHJPdXRwdXQpOw0KIH0NCi1pbnQzMl90CUZYSlNFX1ZhbHVlX1RvSW50ZWdlcgkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIEFTU0VSVChscFZhbHVlKTsNCi0gICAgcmV0dXJuIGxwVmFsdWUtPlRvSW50ZWdlcigpOw0KK2ludDMyX3QgRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5Ub0ludGVnZXIoKTsNCiB9DQotdm9pZCoJRlhKU0VfVmFsdWVfVG9PYmplY3QJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWEpTRV9IQ0xBU1MgaENsYXNzKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICBDRlhKU0VfQ2xhc3MqIGxwQ2xhc3MgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9DbGFzcyo+KGhDbGFzcyk7DQotICAgIEFTU0VSVChscFZhbHVlKTsNCi0gICAgcmV0dXJuIGxwVmFsdWUtPlRvT2JqZWN0KGxwQ2xhc3MpOw0KK3ZvaWQqIEZYSlNFX1ZhbHVlX1RvT2JqZWN0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0hDTEFTUyBoQ2xhc3MpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIENGWEpTRV9DbGFzcyogbHBDbGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NsYXNzKj4oaENsYXNzKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5Ub09iamVjdChscENsYXNzKTsNCiB9DQotdm9pZAkJRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkCShGWEpTRV9IVkFMVUUgaFZhbHVlKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICBBU1NFUlQobHBWYWx1ZSk7DQotICAgIHJldHVybiBscFZhbHVlLT5TZXRVbmRlZmluZWQoKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+U2V0VW5kZWZpbmVkKCk7DQogfQ0KLXZvaWQJCUZYSlNFX1ZhbHVlX1NldE51bGwJCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSkNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZS0+U2V0TnVsbCgpOw0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0TnVsbChGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+U2V0TnVsbCgpOw0KIH0NCi12b2lkCQlGWEpTRV9WYWx1ZV9TZXRCb29sZWFuCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTAliQm9vbGVhbikNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZS0+U2V0Qm9vbGVhbihiQm9vbGVhbik7DQordm9pZCBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0JPT0wgYkJvb2xlYW4pIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5TZXRCb29sZWFuKGJCb29sZWFuKTsNCiB9DQotdm9pZAkJRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZwkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJglzelN0cmluZykNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZS0+U2V0U3RyaW5nKHN6U3RyaW5nKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelN0cmluZykgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlNldFN0cmluZyhzelN0cmluZyk7DQogfQ0KLXZvaWQJCUZYSlNFX1ZhbHVlX1NldEludGVnZXIJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBpbnQzMl90ICBuSW50ZWdlcikNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZS0+U2V0SW50ZWdlcihuSW50ZWdlcik7DQordm9pZCBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIGludDMyX3QgbkludGVnZXIpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5TZXRJbnRlZ2VyKG5JbnRlZ2VyKTsNCiB9DQotdm9pZAkJRlhKU0VfVmFsdWVfU2V0RmxvYXQJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9GTE9BVCAgZkZsb2F0KQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICBBU1NFUlQobHBWYWx1ZSk7DQotICAgIHJldHVybiBscFZhbHVlLT5TZXRGbG9hdChmRmxvYXQpOw0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0RmxvYXQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfRkxPQVQgZkZsb2F0KSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+U2V0RmxvYXQoZkZsb2F0KTsNCiB9DQotdm9pZAkJRlhKU0VfVmFsdWVfU2V0RG91YmxlCQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhKU0VfRE9VQkxFIGREb3VibGUpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIEFTU0VSVChscFZhbHVlKTsNCi0gICAgcmV0dXJuIGxwVmFsdWUtPlNldERvdWJsZShkRG91YmxlKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldERvdWJsZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWEpTRV9ET1VCTEUgZERvdWJsZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlNldERvdWJsZShkRG91YmxlKTsNCiB9DQotdm9pZAkJRlhKU0VfVmFsdWVfU2V0T2JqZWN0CQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgdm9pZCogbHBPYmplY3QsIEZYSlNFX0hDTEFTUyBoQ2xhc3MpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIENGWEpTRV9DbGFzcyogbHBDbGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NsYXNzKj4oaENsYXNzKTsNCi0gICAgaWYobHBDbGFzcyA9PSBOVUxMKSB7DQotICAgICAgICBBU1NFUlQobHBPYmplY3QgPT0gTlVMTCk7DQotICAgICAgICBscFZhbHVlLT5TZXRKU09iamVjdCgpOw0KLSAgICB9IGVsc2UgaWYobHBDbGFzcyAhPSBOVUxMKSB7DQotICAgICAgICBscFZhbHVlLT5TZXRIb3N0T2JqZWN0KGxwT2JqZWN0LCBscENsYXNzKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldE9iamVjdChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxwT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hDTEFTUyBoQ2xhc3MpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIENGWEpTRV9DbGFzcyogbHBDbGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NsYXNzKj4oaENsYXNzKTsNCisgIGlmIChscENsYXNzID09IE5VTEwpIHsNCisgICAgQVNTRVJUKGxwT2JqZWN0ID09IE5VTEwpOw0KKyAgICBscFZhbHVlLT5TZXRKU09iamVjdCgpOw0KKyAgfSBlbHNlIGlmIChscENsYXNzICE9IE5VTEwpIHsNCisgICAgbHBWYWx1ZS0+U2V0SG9zdE9iamVjdChscE9iamVjdCwgbHBDbGFzcyk7DQorICB9DQorfQ0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0QXJyYXkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVWYWx1ZUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFKiByZ1ZhbHVlcykgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlNldEFycmF5KHVWYWx1ZUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKio+KHJnVmFsdWVzKSk7DQorfQ0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0RGF0ZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWEpTRV9ET1VCTEUgZERvdWJsZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlNldERhdGUoZERvdWJsZSk7DQorfQ0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0hWQUxVRSBoT3JpZ2luYWxWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscE9yaWdpbmFsVmFsdWUgPQ0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaE9yaWdpbmFsVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUgJiYgbHBPcmlnaW5hbFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5Bc3NpZ24obHBPcmlnaW5hbFZhbHVlKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhQcm9wVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUgJiYgbHBQcm9wVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHN6UHJvcE5hbWUsIGxwUHJvcFZhbHVlKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9TZXRPYmplY3RQcm9wKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhQcm9wVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUgJiYgbHBQcm9wVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlNldE9iamVjdFByb3BlcnR5KHN6UHJvcE5hbWUsIGxwUHJvcFZhbHVlKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1UHJvcElkeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFByb3BWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSAmJiBscFByb3BWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkodVByb3BJZHgsIGxwUHJvcFZhbHVlKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9TZXRPYmplY3RQcm9wQnlJZHgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1UHJvcElkeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFByb3BWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSAmJiBscFByb3BWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+U2V0T2JqZWN0UHJvcGVydHkodVByb3BJZHgsIGxwUHJvcFZhbHVlKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9EZWxldGVPYmplY3RQcm9wKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPkRlbGV0ZU9iamVjdFByb3BlcnR5KHN6UHJvcE5hbWUpOw0KK30NCitGWF9CT09MIEZYSlNFX1ZhbHVlX09iamVjdEhhc093blByb3AoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VUeXBlR2V0dGVyKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+SGFzT2JqZWN0T3duUHJvcGVydHkoc3pQcm9wTmFtZSwgYlVzZVR5cGVHZXR0ZXIpOw0KK30NCitGWF9CT09MIEZYSlNFX1ZhbHVlX1NldE9iamVjdE93blByb3AoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFByb3BWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSAmJiBscFByb3BWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+U2V0T2JqZWN0T3duUHJvcGVydHkoc3pQcm9wTmFtZSwgbHBQcm9wVmFsdWUpOw0KK30NCitGWF9CT09MIEZYSlNFX1ZhbHVlX1NldEZ1bmN0aW9uQmluZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoT2xkRnVuY3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhOZXdUaGlzKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBDRlhKU0VfVmFsdWUqIGxwT2xkRnVuY3Rpb24gPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhPbGRGdW5jdGlvbik7DQorICBDRlhKU0VfVmFsdWUqIGxwTmV3VGhpcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaE5ld1RoaXMpOw0KKyAgQVNTRVJUKGxwVmFsdWUgJiYgbHBPbGRGdW5jdGlvbiAmJiBscE5ld1RoaXMpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlNldEZ1bmN0aW9uQmluZChscE9sZEZ1bmN0aW9uLCBscE5ld1RoaXMpOw0KK30NCitGWF9CT09MIEZYSlNFX1ZhbHVlX0NhbGxGdW5jdGlvbihGWEpTRV9IVkFMVUUgaEZ1bmN0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5BcmdDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUqIGxwQXJncykgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscEZ1bmN0aW9uID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoRnVuY3Rpb24pOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXMgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhUaGlzKTsNCisgIENGWEpTRV9WYWx1ZSogbHBSZXRWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFJldFZhbHVlKTsNCisgIEFTU0VSVChscEZ1bmN0aW9uKTsNCisgIHJldHVybiBscEZ1bmN0aW9uLT5DYWxsKGxwVGhpcywgbHBSZXRWYWx1ZSwgbkFyZ0NvdW50LCBscEFyZ3MpOw0KK30NCitGWEpTRV9IVkFMVUUgRlhKU0VfVmFsdWVfQ3JlYXRlKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPQ0KKyAgICAgIENGWEpTRV9WYWx1ZTo6Q3JlYXRlKHJlaW50ZXJwcmV0X2Nhc3Q8djg6Oklzb2xhdGUqPihoUnVudGltZSkpOw0KKyAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFZBTFVFPihscFZhbHVlKTsNCit9DQordm9pZCBGWEpTRV9WYWx1ZV9SZWxlYXNlKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIGlmIChscFZhbHVlKSB7DQorICAgIGRlbGV0ZSBscFZhbHVlOw0KKyAgfQ0KK30NCitGWEpTRV9IUlVOVElNRSBGWEpTRV9WYWx1ZV9HZXRSdW50aW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hSVU5USU1FPihscFZhbHVlLT5HZXRJc29sYXRlKCkpOw0KK30NCit2b2lkIEZYSlNFX1Rocm93TWVzc2FnZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE1lc3NhZ2UpIHsNCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHY4OjpJc29sYXRlOjpHZXRDdXJyZW50KCk7DQorICBBU1NFUlQocElzb2xhdGUpOw0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUocElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhNZXNzYWdlID0gdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoDQorICAgICAgcElzb2xhdGUsIHV0ZjhNZXNzYWdlLkdldENTdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywNCisgICAgICB1dGY4TWVzc2FnZS5HZXRMZW5ndGgoKSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoRXJyb3I7DQorICBpZiAodXRmOE5hbWUgPT0gIlJhbmdlRXJyb3IiKSB7DQorICAgIGhFcnJvciA9IHY4OjpFeGNlcHRpb246OlJhbmdlRXJyb3IoaE1lc3NhZ2UpOw0KKyAgfSBlbHNlIGlmICh1dGY4TmFtZSA9PSAiUmVmZXJlbmNlRXJyb3IiKSB7DQorICAgIGhFcnJvciA9IHY4OjpFeGNlcHRpb246OlJlZmVyZW5jZUVycm9yKGhNZXNzYWdlKTsNCisgIH0gZWxzZSBpZiAodXRmOE5hbWUgPT0gIlN5bnRheEVycm9yIikgew0KKyAgICBoRXJyb3IgPSB2ODo6RXhjZXB0aW9uOjpTeW50YXhFcnJvcihoTWVzc2FnZSk7DQorICB9IGVsc2UgaWYgKHV0ZjhOYW1lID09ICJUeXBlRXJyb3IiKSB7DQorICAgIGhFcnJvciA9IHY4OjpFeGNlcHRpb246OlR5cGVFcnJvcihoTWVzc2FnZSk7DQorICB9IGVsc2Ugew0KKyAgICBoRXJyb3IgPSB2ODo6RXhjZXB0aW9uOjpFcnJvcihoTWVzc2FnZSk7DQorICAgIGlmICh1dGY4TmFtZSAhPSAiRXJyb3IiICYmICF1dGY4TmFtZS5Jc0VtcHR5KCkpIHsNCisgICAgICBoRXJyb3IuQXM8djg6Ok9iamVjdD4oKS0+U2V0KA0KKyAgICAgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgIm5hbWUiKSwNCisgICAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIHV0ZjhOYW1lLkdldENTdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmOE5hbWUuR2V0TGVuZ3RoKCkpKTsNCiAgICAgfQ0KKyAgfQ0KKyAgcElzb2xhdGUtPlRocm93RXhjZXB0aW9uKGhFcnJvcik7DQogfQ0KLXZvaWQJCUZYSlNFX1ZhbHVlX1NldEFycmF5CQkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgdWludDMyX3QgdVZhbHVlQ291bnQsIEZYSlNFX0hWQUxVRSogcmdWYWx1ZXMpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIHJldHVybiBscFZhbHVlLT5TZXRBcnJheSh1VmFsdWVDb3VudCwgcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqKj4ocmdWYWx1ZXMpKTsNCitDRlhKU0VfVmFsdWUqIENGWEpTRV9WYWx1ZTo6Q3JlYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgew0KKyAgcmV0dXJuIEZYX05FVyBDRlhKU0VfVmFsdWUocElzb2xhdGUpOw0KIH0NCi12b2lkCQlGWEpTRV9WYWx1ZV9TZXREYXRlCQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0RPVUJMRSBkRG91YmxlKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZS0+U2V0RGF0ZShkRG91YmxlKTsNCit2b2lkKiBDRlhKU0VfVmFsdWU6OlRvT2JqZWN0KENGWEpTRV9DbGFzcyogbHBDbGFzcykgY29uc3Qgew0KKyAgQVNTRVJUKCFtX2hWYWx1ZS5Jc0VtcHR5KCkpOw0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgIEFTU0VSVCghaFZhbHVlLklzRW1wdHkoKSk7DQorICBpZiAoIWhWYWx1ZS0+SXNPYmplY3QoKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBGWEpTRV9SZXRyaWV2ZU9iamVjdEJpbmRpbmcoaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCksIGxwQ2xhc3MpOw0KIH0NCi12b2lkCQlGWEpTRV9WYWx1ZV9TZXQJCQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0hWQUxVRSBoT3JpZ2luYWxWYWx1ZSkNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscE9yaWdpbmFsVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhPcmlnaW5hbFZhbHVlKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUgJiYgbHBPcmlnaW5hbFZhbHVlKTsNCi0gICAgcmV0dXJuIGxwVmFsdWUtPkFzc2lnbihscE9yaWdpbmFsVmFsdWUpOw0KK1Y4X0lOTElORSBzdGF0aWMgZG91YmxlIEZYSlNFX2Z0b2QoRlhfRkxPQVQgZk51bWJlcikgew0KKyAgaWYgKHNpemVvZihGWF9GTE9BVCkgIT0gNCkgew0KKyAgICBBU1NFUlQoRkFMU0UpOw0KKyAgICByZXR1cm4gZk51bWJlcjsNCisgIH0NCisgIHVpbnQzMl90IG5GbG9hdEJpdHMgPSAodWludDMyX3QmKWZOdW1iZXI7DQorICB1aW50OF90IG5FeHBvbmVudCA9ICh1aW50OF90KShuRmxvYXRCaXRzID4+IDE2ID4+IDcpOw0KKyAgaWYgKG5FeHBvbmVudCA9PSAwIHx8IG5FeHBvbmVudCA9PSAyNTUpIHsNCisgICAgcmV0dXJuIGZOdW1iZXI7DQorICB9DQorICBpbnQ4X3QgbkVyckV4cCA9IG5FeHBvbmVudCAtIDEyNyAtIDIzOw0KKyAgaWYgKG5FcnJFeHAgPj0gMCkgew0KKyAgICByZXR1cm4gZk51bWJlcjsNCisgIH0NCisgIGRvdWJsZSBkd0Vycm9yID0gcG93KDIuMCwgbkVyckV4cCksIGR3RXJyb3JIYWxmID0gZHdFcnJvciAvIDI7DQorICBkb3VibGUgZE51bWJlciA9IGZOdW1iZXIsIGROdW1iZXJBYnMgPSBmYWJzKGZOdW1iZXIpOw0KKyAgZG91YmxlIGROdW1iZXJBYnNNaW4gPSBkTnVtYmVyQWJzIC0gZHdFcnJvckhhbGYsDQorICAgICAgICAgZE51bWJlckFic01heCA9IGROdW1iZXJBYnMgKyBkd0Vycm9ySGFsZjsNCisgIGludDMyX3QgaUVyclBvcyA9IDA7DQorICBpZiAoZmxvb3IoZE51bWJlckFic01pbikgPT0gZmxvb3IoZE51bWJlckFic01heCkpIHsNCisgICAgZE51bWJlckFic01pbiA9IGZtb2QoZE51bWJlckFic01pbiwgMS4wKTsNCisgICAgZE51bWJlckFic01heCA9IGZtb2QoZE51bWJlckFic01heCwgMS4wKTsNCisgICAgaW50MzJfdCBpRXJyUG9zTWluID0gMSwgaUVyclBvc01heCA9IDM4Ow0KKyAgICBkbyB7DQorICAgICAgaW50MzJfdCBpTWlkID0gKGlFcnJQb3NNaW4gKyBpRXJyUG9zTWF4KSAvIDI7DQorICAgICAgZG91YmxlIGRQb3cgPSBwb3coMTAuMCwgaU1pZCk7DQorICAgICAgaWYgKGZsb29yKGROdW1iZXJBYnNNaW4gKiBkUG93KSA9PSBmbG9vcihkTnVtYmVyQWJzTWF4ICogZFBvdykpIHsNCisgICAgICAgIGlFcnJQb3NNaW4gPSBpTWlkICsgMTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaUVyclBvc01heCA9IGlNaWQ7DQorICAgICAgfQ0KKyAgICB9IHdoaWxlIChpRXJyUG9zTWluIDwgaUVyclBvc01heCk7DQorICAgIGlFcnJQb3MgPSBpRXJyUG9zTWF4Ow0KKyAgfQ0KKyAgZG91YmxlIGRQb3cgPSBwb3coMTAuMCwgaUVyclBvcyk7DQorICByZXR1cm4gZk51bWJlciA8IDAgPyBjZWlsKGROdW1iZXIgKiBkUG93IC0gMC41KSAvIGRQb3cNCisgICAgICAgICAgICAgICAgICAgICA6IGZsb29yKGROdW1iZXIgKiBkUG93ICsgMC41KSAvIGRQb3c7DQogfQ0KLUZYX0JPT0wJCUZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AJCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmCXN6UHJvcE5hbWUsCUZYSlNFX0hWQUxVRSBoUHJvcFZhbHVlKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUHJvcFZhbHVlKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUgJiYgbHBQcm9wVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkoc3pQcm9wTmFtZSwgbHBQcm9wVmFsdWUpOw0KK3ZvaWQgQ0ZYSlNFX1ZhbHVlOjpTZXRGbG9hdChGWF9GTE9BVCBmRmxvYXQpIHsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpOdW1iZXI6Ok5ldyhtX3BJc29sYXRlLCBGWEpTRV9mdG9kKGZGbG9hdCkpOw0KKyAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCiB9DQotRlhfQk9PTAkJRlhKU0VfVmFsdWVfU2V0T2JqZWN0UHJvcAkJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYJc3pQcm9wTmFtZSwJRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhQcm9wVmFsdWUpOw0KLSAgICBBU1NFUlQobHBWYWx1ZSAmJiBscFByb3BWYWx1ZSk7DQotICAgIHJldHVybiBscFZhbHVlLT5TZXRPYmplY3RQcm9wZXJ0eShzelByb3BOYW1lLCBscFByb3BWYWx1ZSk7DQordm9pZCBDRlhKU0VfVmFsdWU6OlNldEhvc3RPYmplY3Qodm9pZCogbHBPYmplY3QsIENGWEpTRV9DbGFzcyogbHBDbGFzcykgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICBBU1NFUlQobHBDbGFzcyk7DQorICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGhDbGFzcyA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KG1fcElzb2xhdGUsIGxwQ2xhc3MtPm1faFRlbXBsYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoT2JqZWN0ID0gaENsYXNzLT5JbnN0YW5jZVRlbXBsYXRlKCktPk5ld0luc3RhbmNlKCk7DQorICBGWEpTRV9VcGRhdGVPYmplY3RCaW5kaW5nKGhPYmplY3QsIGxwT2JqZWN0KTsNCisgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhPYmplY3QpOw0KIH0NCi1GWF9CT09MCQlGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIHVpbnQzMl90CXVQcm9wSWR4LAlGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSkNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFByb3BWYWx1ZSk7DQotICAgIEFTU0VSVChscFZhbHVlICYmIGxwUHJvcFZhbHVlKTsNCi0gICAgcmV0dXJuIGxwVmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHVQcm9wSWR4LCBscFByb3BWYWx1ZSk7DQotfQ0KLUZYX0JPT0wJCUZYSlNFX1ZhbHVlX1NldE9iamVjdFByb3BCeUlkeAkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgdWludDMyX3QJdVByb3BJZHgsCUZYSlNFX0hWQUxVRSBoUHJvcFZhbHVlKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUHJvcFZhbHVlKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUgJiYgbHBQcm9wVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZS0+U2V0T2JqZWN0UHJvcGVydHkodVByb3BJZHgsIGxwUHJvcFZhbHVlKTsNCi19DQotRlhfQk9PTAkJRlhKU0VfVmFsdWVfRGVsZXRlT2JqZWN0UHJvcAkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lKQ0KLXsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KLSAgICBBU1NFUlQobHBWYWx1ZSk7DQotICAgIHJldHVybiBscFZhbHVlLT5EZWxldGVPYmplY3RQcm9wZXJ0eShzelByb3BOYW1lKTsNCi19DQotRlhfQk9PTAkJCUZYSlNFX1ZhbHVlX09iamVjdEhhc093blByb3AJKEZYSlNFX0hWQUxVRSBoVmFsdWUsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYJc3pQcm9wTmFtZSwgRlhfQk9PTAliVXNlVHlwZUdldHRlcikNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUpOw0KLSAgICByZXR1cm4gbHBWYWx1ZS0+SGFzT2JqZWN0T3duUHJvcGVydHkoc3pQcm9wTmFtZSwgYlVzZVR5cGVHZXR0ZXIpOw0KLX0NCi1GWF9CT09MCQkJRlhKU0VfVmFsdWVfU2V0T2JqZWN0T3duUHJvcAkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJglzelByb3BOYW1lLCBGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSkNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFByb3BWYWx1ZSk7DQotICAgIEFTU0VSVChscFZhbHVlICYmIGxwUHJvcFZhbHVlKTsNCi0gICAgcmV0dXJuIGxwVmFsdWUtPlNldE9iamVjdE93blByb3BlcnR5KHN6UHJvcE5hbWUsIGxwUHJvcFZhbHVlKTsNCi19DQotRlhfQk9PTAkJRlhKU0VfVmFsdWVfU2V0RnVuY3Rpb25CaW5kCShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWEpTRV9IVkFMVUUgaE9sZEZ1bmN0aW9uLCBGWEpTRV9IVkFMVUUgaE5ld1RoaXMpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIENGWEpTRV9WYWx1ZSogbHBPbGRGdW5jdGlvbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaE9sZEZ1bmN0aW9uKTsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscE5ld1RoaXMgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhOZXdUaGlzKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUgJiYgbHBPbGRGdW5jdGlvbiAmJiBscE5ld1RoaXMpOw0KLSAgICByZXR1cm4gbHBWYWx1ZS0+U2V0RnVuY3Rpb25CaW5kKGxwT2xkRnVuY3Rpb24sIGxwTmV3VGhpcyk7DQotfQ0KLUZYX0JPT0wJRlhKU0VfVmFsdWVfQ2FsbEZ1bmN0aW9uKEZYSlNFX0hWQUxVRSBoRnVuY3Rpb24sIEZYSlNFX0hWQUxVRSBoVGhpcywgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwgdWludDMyX3QgbkFyZ0NvdW50LCBGWEpTRV9IVkFMVUUqIGxwQXJncykNCi17DQotICAgIENGWEpTRV9WYWx1ZSogbHBGdW5jdGlvbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaEZ1bmN0aW9uKTsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXMgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhUaGlzKTsNCi0gICAgQ0ZYSlNFX1ZhbHVlKiBscFJldFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUmV0VmFsdWUpOw0KLSAgICBBU1NFUlQobHBGdW5jdGlvbik7DQotICAgIHJldHVybiBscEZ1bmN0aW9uLT5DYWxsKGxwVGhpcywgbHBSZXRWYWx1ZSwgbkFyZ0NvdW50LCBscEFyZ3MpOw0KLX0NCi1GWEpTRV9IVkFMVUUJRlhKU0VfVmFsdWVfQ3JlYXRlCQkoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShyZWludGVycHJldF9jYXN0PHY4OjpJc29sYXRlKj4oaFJ1bnRpbWUpKTsNCi0gICAgQVNTRVJUKGxwVmFsdWUpOw0KLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwVmFsdWUpOw0KLX0NCi12b2lkCQlGWEpTRV9WYWx1ZV9SZWxlYXNlCQkJKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIGlmKGxwVmFsdWUpIHsNCi0gICAgICAgIGRlbGV0ZSBscFZhbHVlOw0KK3ZvaWQgQ0ZYSlNFX1ZhbHVlOjpTZXRBcnJheSh1aW50MzJfdCB1VmFsdWVDb3VudCwgQ0ZYSlNFX1ZhbHVlKiogcmdWYWx1ZXMpIHsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpBcnJheT4gaEFycmF5T2JqZWN0ID0gdjg6OkFycmF5OjpOZXcobV9wSXNvbGF0ZSwgdVZhbHVlQ291bnQpOw0KKyAgaWYgKHJnVmFsdWVzKSB7DQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB1VmFsdWVDb3VudDsgaSsrKSB7DQorICAgICAgaWYgKHJnVmFsdWVzW2ldKSB7DQorICAgICAgICBoQXJyYXlPYmplY3QtPlNldChpLCB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcElzb2xhdGUsIHJnVmFsdWVzW2ldLT5EaXJlY3RHZXRWYWx1ZSgpKSk7DQorICAgICAgfQ0KICAgICB9DQorICB9DQorICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoQXJyYXlPYmplY3QpOw0KIH0NCi1GWEpTRV9IUlVOVElNRQlGWEpTRV9WYWx1ZV9HZXRSdW50aW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUpDQotew0KLSAgICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQotICAgIEFTU0VSVChscFZhbHVlKTsNCi0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFJVTlRJTUU+KGxwVmFsdWUtPkdldElzb2xhdGUoKSk7DQordm9pZCBDRlhKU0VfVmFsdWU6OlNldERhdGUoRlhKU0VfRE9VQkxFIGREb3VibGUpIHsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaERhdGUgPSB2ODo6RGF0ZTo6TmV3KG1fcElzb2xhdGUsIGREb3VibGUpOw0KKyAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaERhdGUpOw0KIH0NCi12b2lkIEZYSlNFX1Rocm93TWVzc2FnZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhNZXNzYWdlKQ0KLXsNCi0gICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gdjg6Oklzb2xhdGU6OkdldEN1cnJlbnQoKTsNCi0gICAgQVNTRVJUKHBJc29sYXRlKTsNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUocElzb2xhdGUpOw0KLSAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaE1lc3NhZ2UgPSB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgdXRmOE1lc3NhZ2UuR2V0Q1N0cigpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLCB1dGY4TWVzc2FnZS5HZXRMZW5ndGgoKSk7DQotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhFcnJvcjsNCi0gICAgaWYodXRmOE5hbWUgPT0gIlJhbmdlRXJyb3IiKSB7DQotICAgICAgICBoRXJyb3IgPSB2ODo6RXhjZXB0aW9uOjpSYW5nZUVycm9yKGhNZXNzYWdlKTsNCi0gICAgfSBlbHNlIGlmKHV0ZjhOYW1lID09ICJSZWZlcmVuY2VFcnJvciIpIHsNCi0gICAgICAgIGhFcnJvciA9IHY4OjpFeGNlcHRpb246OlJlZmVyZW5jZUVycm9yKGhNZXNzYWdlKTsNCi0gICAgfSBlbHNlIGlmKHV0ZjhOYW1lID09ICJTeW50YXhFcnJvciIpIHsNCi0gICAgICAgIGhFcnJvciA9IHY4OjpFeGNlcHRpb246OlN5bnRheEVycm9yKGhNZXNzYWdlKTsNCi0gICAgfSBlbHNlIGlmKHV0ZjhOYW1lID09ICJUeXBlRXJyb3IiKSB7DQotICAgICAgICBoRXJyb3IgPSB2ODo6RXhjZXB0aW9uOjpUeXBlRXJyb3IoaE1lc3NhZ2UpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgaEVycm9yID0gdjg6OkV4Y2VwdGlvbjo6RXJyb3IoaE1lc3NhZ2UpOw0KLSAgICAgICAgaWYodXRmOE5hbWUgIT0gIkVycm9yIiAmJiAhdXRmOE5hbWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgaEVycm9yLkFzPHY4OjpPYmplY3Q+KCktPlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgIm5hbWUiKSwgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIHV0ZjhOYW1lLkdldENTdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgdXRmOE5hbWUuR2V0TGVuZ3RoKCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwSXNvbGF0ZS0+VGhyb3dFeGNlcHRpb24oaEVycm9yKTsNCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6U2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKSB7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgaWYgKCFoT2JqZWN0LT5Jc09iamVjdCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhQcm9wVmFsdWUgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBQcm9wVmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KKyAgcmV0dXJuIChGWF9CT09MKWhPYmplY3QuQXM8djg6Ok9iamVjdD4oKS0+U2V0KA0KKyAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsIHN6UHJvcE5hbWUuR2V0Q1N0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSksDQorICAgICAgaFByb3BWYWx1ZSk7DQogfQ0KLUNGWEpTRV9WYWx1ZSogQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlKQ0KLXsNCi0gICAgcmV0dXJuIEZYX05FVyBDRlhKU0VfVmFsdWUocElzb2xhdGUpOw0KK0ZYX0JPT0wgQ0ZYSlNFX1ZhbHVlOjpHZXRPYmplY3RQcm9wZXJ0eShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpIHsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE9iamVjdCA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICBpZiAoIWhPYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFByb3BWYWx1ZSA9DQorICAgICAgaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5HZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoDQorICAgICAgICAgIG1fcElzb2xhdGUsIHN6UHJvcE5hbWUuR2V0Q1N0cigpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLA0KKyAgICAgICAgICBzelByb3BOYW1lLkdldExlbmd0aCgpKSk7DQorICBscFByb3BWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShoUHJvcFZhbHVlKTsNCisgIHJldHVybiBUUlVFOw0KIH0NCi12b2lkKglDRlhKU0VfVmFsdWU6OlRvT2JqZWN0KENGWEpTRV9DbGFzcyogbHBDbGFzcykgY29uc3QNCi17DQotICAgIEFTU0VSVCghbV9oVmFsdWUuSXNFbXB0eSgpKTsNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KLSAgICBBU1NFUlQoIWhWYWx1ZS5Jc0VtcHR5KCkpOw0KLSAgICBpZighaFZhbHVlLT5Jc09iamVjdCgpKSB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICByZXR1cm4gRlhKU0VfUmV0cmlldmVPYmplY3RCaW5kaW5nKGhWYWx1ZS5Bczx2ODo6T2JqZWN0PigpLCBscENsYXNzKTsNCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6U2V0T2JqZWN0UHJvcGVydHkodWludDMyX3QgdVByb3BJZHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpIHsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE9iamVjdCA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICBpZiAoIWhPYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFByb3BWYWx1ZSA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBscFByb3BWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICByZXR1cm4gKEZYX0JPT0wpaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5TZXQodVByb3BJZHgsIGhQcm9wVmFsdWUpOw0KIH0NCi1WOF9JTkxJTkUgc3RhdGljIGRvdWJsZSBGWEpTRV9mdG9kKEZYX0ZMT0FUIGZOdW1iZXIpDQotew0KLSAgICBpZihzaXplb2YoRlhfRkxPQVQpICE9IDQpIHsNCi0gICAgICAgIEFTU0VSVChGQUxTRSk7DQotICAgICAgICByZXR1cm4gZk51bWJlcjsNCi0gICAgfQ0KLSAgICB1aW50MzJfdCBuRmxvYXRCaXRzID0gKHVpbnQzMl90JilmTnVtYmVyOw0KLSAgICB1aW50OF90ICBuRXhwb25lbnQgID0gKHVpbnQ4X3QpKG5GbG9hdEJpdHMgPj4gMTYgPj4gNyApOw0KLSAgICBpZihuRXhwb25lbnQgPT0gMCB8fCBuRXhwb25lbnQgPT0gMjU1KSB7DQotICAgICAgICByZXR1cm4gZk51bWJlcjsNCi0gICAgfQ0KLSAgICBpbnQ4X3QgbkVyckV4cCA9IG5FeHBvbmVudCAtIDEyNyAtIDIzOw0KLSAgICBpZihuRXJyRXhwID49IDApIHsNCi0gICAgICAgIHJldHVybiBmTnVtYmVyOw0KLSAgICB9DQotICAgIGRvdWJsZSBkd0Vycm9yID0gcG93KDIuMCwgbkVyckV4cCksIGR3RXJyb3JIYWxmID0gZHdFcnJvciAvIDI7DQotICAgIGRvdWJsZSBkTnVtYmVyID0gZk51bWJlciwgIGROdW1iZXJBYnMgPSBmYWJzKGZOdW1iZXIpOw0KLSAgICBkb3VibGUgZE51bWJlckFic01pbiA9IGROdW1iZXJBYnMgLSBkd0Vycm9ySGFsZiwgZE51bWJlckFic01heCA9IGROdW1iZXJBYnMgKyBkd0Vycm9ySGFsZjsNCi0gICAgaW50MzJfdCBpRXJyUG9zID0gMDsNCi0gICAgaWYoZmxvb3IoZE51bWJlckFic01pbikgPT0gZmxvb3IoZE51bWJlckFic01heCkpIHsNCi0gICAgICAgIGROdW1iZXJBYnNNaW4gPSBmbW9kKGROdW1iZXJBYnNNaW4sIDEuMCk7DQotICAgICAgICBkTnVtYmVyQWJzTWF4ID0gZm1vZChkTnVtYmVyQWJzTWF4LCAxLjApOw0KLSAgICAgICAgaW50MzJfdCBpRXJyUG9zTWluID0gMSwgaUVyclBvc01heCA9IDM4Ow0KLSAgICAgICAgZG8gew0KLSAgICAgICAgICAgIGludDMyX3QgaU1pZCA9IChpRXJyUG9zTWluICsgaUVyclBvc01heCkgLyAyOw0KLSAgICAgICAgICAgIGRvdWJsZSBkUG93ID0gcG93KDEwLjAsIGlNaWQpOw0KLSAgICAgICAgICAgIGlmKGZsb29yKGROdW1iZXJBYnNNaW4gKiBkUG93KSA9PSBmbG9vcihkTnVtYmVyQWJzTWF4ICogZFBvdykpIHsNCi0gICAgICAgICAgICAgICAgaUVyclBvc01pbiA9IGlNaWQgKyAxOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlFcnJQb3NNYXggPSBpTWlkOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gd2hpbGUgKGlFcnJQb3NNaW4gPCBpRXJyUG9zTWF4KTsNCi0gICAgICAgIGlFcnJQb3MgPSBpRXJyUG9zTWF4Ow0KLSAgICB9DQotICAgIGRvdWJsZSBkUG93ID0gcG93KDEwLjAsIGlFcnJQb3MpOw0KLSAgICByZXR1cm4gZk51bWJlciA8IDAgPyBjZWlsKGROdW1iZXIgKiBkUG93IC0gMC41KSAvIGRQb3cgOiBmbG9vcihkTnVtYmVyICogZFBvdyArIDAuNSkgLyBkUG93Ow0KK0ZYX0JPT0wgQ0ZYSlNFX1ZhbHVlOjpHZXRPYmplY3RQcm9wZXJ0eSh1aW50MzJfdCB1UHJvcElkeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSkgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoT2JqZWN0ID0NCisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgIGlmICghaE9iamVjdC0+SXNPYmplY3QoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUHJvcFZhbHVlID0gaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5HZXQodVByb3BJZHgpOw0KKyAgbHBQcm9wVmFsdWUtPkZvcmNlU2V0VmFsdWUoaFByb3BWYWx1ZSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDRlhKU0VfVmFsdWU6OlNldEZsb2F0KEZYX0ZMT0FUIGZGbG9hdCkNCi17DQotICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6Ok51bWJlcjo6TmV3KG1fcElzb2xhdGUsIEZYSlNFX2Z0b2QoZkZsb2F0KSk7DQotICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhWYWx1ZSk7DQorRlhfQk9PTCBDRlhKU0VfVmFsdWU6OkRlbGV0ZU9iamVjdFByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSkgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoT2JqZWN0ID0NCisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgIGlmICghaE9iamVjdC0+SXNPYmplY3QoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBoT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPkRlbGV0ZSh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOCgNCisgICAgICBtX3BJc29sYXRlLCBzelByb3BOYW1lLkdldENTdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywNCisgICAgICBzelByb3BOYW1lLkdldExlbmd0aCgpKSk7DQorICByZXR1cm4gVFJVRTsNCiB9DQotdm9pZCBDRlhKU0VfVmFsdWU6OlNldEhvc3RPYmplY3Qodm9pZCogbHBPYmplY3QsIENGWEpTRV9DbGFzcyogbHBDbGFzcykNCi17DQotICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICBBU1NFUlQobHBDbGFzcyk7DQotICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gaENsYXNzID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KG1fcElzb2xhdGUsIGxwQ2xhc3MtPm1faFRlbXBsYXRlKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhPYmplY3QgPSBoQ2xhc3MtPkluc3RhbmNlVGVtcGxhdGUoKS0+TmV3SW5zdGFuY2UoKTsNCi0gICAgRlhKU0VfVXBkYXRlT2JqZWN0QmluZGluZyhoT2JqZWN0LCBscE9iamVjdCk7DQotICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhPYmplY3QpOw0KK0ZYX0JPT0wgQ0ZYSlNFX1ZhbHVlOjpIYXNPYmplY3RPd25Qcm9wZXJ0eShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZVR5cGVHZXR0ZXIpIHsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE9iamVjdCA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICBpZiAoIWhPYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhLZXkgPSB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOCgNCisgICAgICBtX3BJc29sYXRlLCBzelByb3BOYW1lLkdldENTdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywNCisgICAgICBzelByb3BOYW1lLkdldExlbmd0aCgpKTsNCisgIHJldHVybiBoT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPkhhc1JlYWxOYW1lZFByb3BlcnR5KGhLZXkpIHx8DQorICAgICAgICAgKGJVc2VUeXBlR2V0dGVyICYmIGhPYmplY3QuQXM8djg6Ok9iamVjdD4oKS0+SGFzT3duUHJvcGVydHkoaEtleSkpOw0KIH0NCi12b2lkIENGWEpTRV9WYWx1ZTo6U2V0QXJyYXkodWludDMyX3QgdVZhbHVlQ291bnQsIENGWEpTRV9WYWx1ZSoqIHJnVmFsdWVzKQ0KLXsNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGhBcnJheU9iamVjdCA9IHY4OjpBcnJheTo6TmV3KG1fcElzb2xhdGUsIHVWYWx1ZUNvdW50KTsNCi0gICAgaWYgKHJnVmFsdWVzKSB7DQotICAgICAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCB1VmFsdWVDb3VudDsgaSsrKSB7DQotICAgICAgICAgICAgaWYocmdWYWx1ZXNbaV0pIHsNCi0gICAgICAgICAgICAgICAgaEFycmF5T2JqZWN0LT5TZXQoaSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCByZ1ZhbHVlc1tpXS0+RGlyZWN0R2V0VmFsdWUoKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoQXJyYXlPYmplY3QpOw0KK0ZYX0JPT0wgQ0ZYSlNFX1ZhbHVlOjpTZXRPYmplY3RPd25Qcm9wZXJ0eShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpIHsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE9iamVjdCA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICBpZiAoIWhPYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwUHJvcFZhbHVlLT5tX2hWYWx1ZSk7DQorICByZXR1cm4gaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5Gb3JjZVNldCgNCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCBzelByb3BOYW1lLkdldENTdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpLA0KKyAgICAgIGhWYWx1ZSk7DQogfQ0KLXZvaWQgQ0ZYSlNFX1ZhbHVlOjpTZXREYXRlKEZYSlNFX0RPVUJMRSBkRG91YmxlKQ0KLXsNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhEYXRlID0gdjg6OkRhdGU6Ok5ldyhtX3BJc29sYXRlLCBkRG91YmxlKTsNCi0gICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaERhdGUpOw0KLX0NCi1GWF9CT09MIENGWEpTRV9WYWx1ZTo6U2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKQ0KLXsNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCi0gICAgaWYoIWhPYmplY3QtPklzT2JqZWN0KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUHJvcFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBscFByb3BWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7DQotICAgIHJldHVybiAoRlhfQk9PTCloT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCBzelByb3BOYW1lLkdldENTdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSksIGhQcm9wVmFsdWUpOw0KLX0NCi1GWF9CT09MIENGWEpTRV9WYWx1ZTo6R2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLCBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKQ0KLXsNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCi0gICAgaWYoIWhPYmplY3QtPklzT2JqZWN0KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUHJvcFZhbHVlID0gaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5HZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgobV9wSXNvbGF0ZSwgc3pQcm9wTmFtZS5HZXRDU3RyKCksIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpKTsNCi0gICAgbHBQcm9wVmFsdWUtPkZvcmNlU2V0VmFsdWUoaFByb3BWYWx1ZSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGWEpTRV9WYWx1ZTo6U2V0T2JqZWN0UHJvcGVydHkodWludDMyX3QgdVByb3BJZHgsIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpDQotew0KLSAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE9iamVjdCA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KLSAgICBpZighaE9iamVjdC0+SXNPYmplY3QoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhQcm9wVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwUHJvcFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCi0gICAgcmV0dXJuIChGWF9CT09MKWhPYmplY3QuQXM8djg6Ok9iamVjdD4oKS0+U2V0KHVQcm9wSWR4LCBoUHJvcFZhbHVlKTsNCi19DQotRlhfQk9PTCBDRlhKU0VfVmFsdWU6OkdldE9iamVjdFByb3BlcnR5KHVpbnQzMl90IHVQcm9wSWR4LCBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKQ0KLXsNCi0gICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCi0gICAgaWYoIWhPYmplY3QtPklzT2JqZWN0KCkpIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUHJvcFZhbHVlID0gaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5HZXQodVByb3BJZHgpOw0KLSAgICBscFByb3BWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShoUHJvcFZhbHVlKTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLUZYX0JPT0wgQ0ZYSlNFX1ZhbHVlOjpEZWxldGVPYmplY3RQcm9wZXJ0eShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUpDQotew0KLSAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE9iamVjdCA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KLSAgICBpZighaE9iamVjdC0+SXNPYmplY3QoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIGhPYmplY3QuQXM8djg6Ok9iamVjdD4oKS0+RGVsZXRlKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsIHN6UHJvcE5hbWUuR2V0Q1N0cigpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLCBzelByb3BOYW1lLkdldExlbmd0aCgpKSk7DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1GWF9CT09MIENGWEpTRV9WYWx1ZTo6SGFzT2JqZWN0T3duUHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiAgIHN6UHJvcE5hbWUsIEZYX0JPT0wJYlVzZVR5cGVHZXR0ZXIpDQotew0KLSAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCi0gICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE9iamVjdCA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KLSAgICBpZighaE9iamVjdC0+SXNPYmplY3QoKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoS2V5ICAgPSB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCBzelByb3BOYW1lLkdldENTdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQotICAgIHJldHVybiBoT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPkhhc1JlYWxOYW1lZFByb3BlcnR5KGhLZXkpIHx8IChiVXNlVHlwZUdldHRlciAmJiBoT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPkhhc093blByb3BlcnR5KGhLZXkpKTsNCi19DQotRlhfQk9PTCBDRlhKU0VfVmFsdWU6OlNldE9iamVjdE93blByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSkNCi17DQotICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoT2JqZWN0ID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQotICAgIGlmKCFoT2JqZWN0LT5Jc09iamVjdCgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBscFByb3BWYWx1ZS0+bV9oVmFsdWUpOw0KLSAgICByZXR1cm4gaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5Gb3JjZVNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCBzelByb3BOYW1lLkdldENTdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSksIGhWYWx1ZSk7DQotfQ0KLUZYX0JPT0wgQ0ZYSlNFX1ZhbHVlOjpTZXRGdW5jdGlvbkJpbmQoQ0ZYSlNFX1ZhbHVlKiBscE9sZEZ1bmN0aW9uLCBDRlhKU0VfVmFsdWUqIGxwTmV3VGhpcykNCi17DQotICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZ0FyZ3NbMl07DQotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPbGRGdW5jdGlvbiA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBPbGRGdW5jdGlvbi0+RGlyZWN0R2V0VmFsdWUoKSk7DQotICAgIGlmKGhPbGRGdW5jdGlvbi5Jc0VtcHR5KCkgfHwgIWhPbGRGdW5jdGlvbi0+SXNGdW5jdGlvbigpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmdBcmdzWzBdID0gaE9sZEZ1bmN0aW9uOw0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoTmV3VGhpcyA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBOZXdUaGlzLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCi0gICAgaWYoaE5ld1RoaXMuSXNFbXB0eSgpKSB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgcmdBcmdzWzFdID0gaE5ld1RoaXM7DQotICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoQmluZGVyRnVuY1NvdXJjZSA9IHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsICIoZnVuY3Rpb24gKG9sZGZ1bmN0aW9uLCBuZXd0aGlzKSB7IHJldHVybiBvbGRmdW5jdGlvbi5iaW5kKG5ld3RoaXMpOyB9KSIpOw0KLSAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBoQmluZGVyRnVuYyA9IHY4OjpTY3JpcHQ6OkNvbXBpbGUoaEJpbmRlckZ1bmNTb3VyY2UpLT5SdW4oKS5Bczx2ODo6RnVuY3Rpb24+KCk7DQotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhCb3VuZEZ1bmN0aW9uID0gaEJpbmRlckZ1bmMtPkNhbGwobV9wSXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKS0+R2xvYmFsKCksIDIsIHJnQXJncyk7DQotICAgIGlmKGhCb3VuZEZ1bmN0aW9uLklzRW1wdHkoKSB8fCAhaEJvdW5kRnVuY3Rpb24tPklzRnVuY3Rpb24oKSkgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhCb3VuZEZ1bmN0aW9uKTsNCi0gICAgcmV0dXJuIFRSVUU7DQorRlhfQk9PTCBDRlhKU0VfVmFsdWU6OlNldEZ1bmN0aW9uQmluZChDRlhKU0VfVmFsdWUqIGxwT2xkRnVuY3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwTmV3VGhpcykgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZ0FyZ3NbMl07DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoT2xkRnVuY3Rpb24gPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBPbGRGdW5jdGlvbi0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICBpZiAoaE9sZEZ1bmN0aW9uLklzRW1wdHkoKSB8fCAhaE9sZEZ1bmN0aW9uLT5Jc0Z1bmN0aW9uKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmdBcmdzWzBdID0gaE9sZEZ1bmN0aW9uOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE5ld1RoaXMgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBOZXdUaGlzLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgIGlmIChoTmV3VGhpcy5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmdBcmdzWzFdID0gaE5ld1RoaXM7DQorICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaEJpbmRlckZ1bmNTb3VyY2UgPQ0KKyAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihmdW5jdGlvbiAob2xkZnVuY3Rpb24sIG5ld3RoaXMpIHsgcmV0dXJuICINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2xkZnVuY3Rpb24uYmluZChuZXd0aGlzKTsgfSkiKTsNCisgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGhCaW5kZXJGdW5jID0NCisgICAgICB2ODo6U2NyaXB0OjpDb21waWxlKGhCaW5kZXJGdW5jU291cmNlKS0+UnVuKCkuQXM8djg6OkZ1bmN0aW9uPigpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaEJvdW5kRnVuY3Rpb24gPQ0KKyAgICAgIGhCaW5kZXJGdW5jLT5DYWxsKG1fcElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCktPkdsb2JhbCgpLCAyLCByZ0FyZ3MpOw0KKyAgaWYgKGhCb3VuZEZ1bmN0aW9uLklzRW1wdHkoKSB8fCAhaEJvdW5kRnVuY3Rpb24tPklzRnVuY3Rpb24oKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoQm91bmRGdW5jdGlvbik7DQorICByZXR1cm4gVFJVRTsNCiB9DQogI2RlZmluZSBGWEpTRV9JTlZBTElEX1BUUiAoKHZvaWQqKShpbnRwdHJfdCktMSkNCi1GWF9CT09MIENGWEpTRV9WYWx1ZTo6Q2FsbChDRlhKU0VfVmFsdWUqIGxwUmVjZWl2ZXIsIENGWEpTRV9WYWx1ZSogbHBSZXRWYWx1ZSwgdWludDMyX3QgbkFyZ0NvdW50LCBGWEpTRV9IVkFMVUUqIGxwQXJncykNCi17DQotICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoRnVuY3Rpb25WYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgRGlyZWN0R2V0VmFsdWUoKSk7DQotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoRnVuY3Rpb25PYmplY3QgPSAhaEZ1bmN0aW9uVmFsdWUuSXNFbXB0eSgpICYmIGhGdW5jdGlvblZhbHVlLT5Jc09iamVjdCgpID8gaEZ1bmN0aW9uVmFsdWUuQXM8djg6Ok9iamVjdD4oKSA6IHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOw0KLSAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Y2F0Y2g7DQotICAgIGlmIChoRnVuY3Rpb25PYmplY3QuSXNFbXB0eSgpIHx8ICFoRnVuY3Rpb25PYmplY3QtPklzQ2FsbGFibGUoKSkgew0KLSAgICAgICAgaWYobHBSZXRWYWx1ZSkgew0KLSAgICAgICAgICAgIGxwUmV0VmFsdWUtPkZvcmNlU2V0VmFsdWUoRlhKU0VfQ3JlYXRlUmV0dXJuVmFsdWUobV9wSXNvbGF0ZSwgdHJ5Y2F0Y2gpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBGQUxTRTsNCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6Q2FsbChDRlhKU0VfVmFsdWUqIGxwUmVjZWl2ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5BcmdDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUqIGxwQXJncykgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoRnVuY3Rpb25WYWx1ZSA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBEaXJlY3RHZXRWYWx1ZSgpKTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoRnVuY3Rpb25PYmplY3QgPQ0KKyAgICAgICFoRnVuY3Rpb25WYWx1ZS5Jc0VtcHR5KCkgJiYgaEZ1bmN0aW9uVmFsdWUtPklzT2JqZWN0KCkNCisgICAgICAgICAgPyBoRnVuY3Rpb25WYWx1ZS5Bczx2ODo6T2JqZWN0PigpDQorICAgICAgICAgIDogdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCk7DQorICB2ODo6VHJ5Q2F0Y2ggdHJ5Y2F0Y2g7DQorICBpZiAoaEZ1bmN0aW9uT2JqZWN0LklzRW1wdHkoKSB8fCAhaEZ1bmN0aW9uT2JqZWN0LT5Jc0NhbGxhYmxlKCkpIHsNCisgICAgaWYgKGxwUmV0VmFsdWUpIHsNCisgICAgICBscFJldFZhbHVlLT5Gb3JjZVNldFZhbHVlKEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKG1fcElzb2xhdGUsIHRyeWNhdGNoKSk7DQogICAgIH0NCi0gICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFJldHVyblZhbHVlOw0KLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiogbHBMb2NhbEFyZ3MgPSBOVUxMOw0KLSAgICBpZihuQXJnQ291bnQpIHsNCi0gICAgICAgIGxwTG9jYWxBcmdzID0gRlhfQWxsb2Modjg6OkxvY2FsPHY4OjpWYWx1ZT4sIG5BcmdDb3VudCk7DQotICAgICAgICBpZiAoIWxwTG9jYWxBcmdzKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5BcmdDb3VudDsgaSsrKSB7DQotICAgICAgICAgICAgbmV3IChscExvY2FsQXJncyArIGkpIHY4OjpMb2NhbDx2ODo6VmFsdWU+Ow0KLSAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBBcmcgPSAoQ0ZYSlNFX1ZhbHVlKilscEFyZ3NbaV07DQotICAgICAgICAgICAgaWYobHBBcmcpIHsNCi0gICAgICAgICAgICAgICAgbHBMb2NhbEFyZ3NbaV0gPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwQXJnLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGxwTG9jYWxBcmdzW2ldLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBscExvY2FsQXJnc1tpXSA9IHY4OjpVbmRlZmluZWQobV9wSXNvbGF0ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUmV0dXJuVmFsdWU7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiogbHBMb2NhbEFyZ3MgPSBOVUxMOw0KKyAgaWYgKG5BcmdDb3VudCkgew0KKyAgICBscExvY2FsQXJncyA9IEZYX0FsbG9jKHY4OjpMb2NhbDx2ODo6VmFsdWU+LCBuQXJnQ291bnQpOw0KKyAgICBpZiAoIWxwTG9jYWxBcmdzKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIEZYX0JPT0wgYlJldFZhbHVlID0gVFJVRTsNCi0gICAgaWYobHBSZWNlaXZlciA9PSBGWEpTRV9JTlZBTElEX1BUUikgew0KLSAgICAgICAgaFJldHVyblZhbHVlID0gaEZ1bmN0aW9uT2JqZWN0LT5DYWxsQXNDb25zdHJ1Y3RvcihuQXJnQ291bnQsIGxwTG9jYWxBcmdzKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhSZWNlaXZlcjsNCi0gICAgICAgIGlmKGxwUmVjZWl2ZXIpIHsNCi0gICAgICAgICAgICBoUmVjZWl2ZXIgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwUmVjZWl2ZXItPkRpcmVjdEdldFZhbHVlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoaFJlY2VpdmVyLklzRW1wdHkoKSB8fCAhaFJlY2VpdmVyLT5Jc09iamVjdCgpKSB7DQotICAgICAgICAgICAgaFJlY2VpdmVyID0gdjg6Ok9iamVjdDo6TmV3KG1fcElzb2xhdGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaFJldHVyblZhbHVlID0gaEZ1bmN0aW9uT2JqZWN0LT5DYWxsQXNGdW5jdGlvbihoUmVjZWl2ZXIsIG5BcmdDb3VudCwgbHBMb2NhbEFyZ3MpOw0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbkFyZ0NvdW50OyBpKyspIHsNCisgICAgICBuZXcgKGxwTG9jYWxBcmdzICsgaSkgdjg6OkxvY2FsPHY4OjpWYWx1ZT47DQorICAgICAgQ0ZYSlNFX1ZhbHVlKiBscEFyZyA9IChDRlhKU0VfVmFsdWUqKWxwQXJnc1tpXTsNCisgICAgICBpZiAobHBBcmcpIHsNCisgICAgICAgIGxwTG9jYWxBcmdzW2ldID0NCisgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwQXJnLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgICAgICB9DQorICAgICAgaWYgKGxwTG9jYWxBcmdzW2ldLklzRW1wdHkoKSkgew0KKyAgICAgICAgbHBMb2NhbEFyZ3NbaV0gPSB2ODo6VW5kZWZpbmVkKG1fcElzb2xhdGUpOw0KKyAgICAgIH0NCiAgICAgfQ0KLSAgICBpZih0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KLSAgICAgICAgaFJldHVyblZhbHVlID0gIEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKG1fcElzb2xhdGUsIHRyeWNhdGNoKTsNCi0gICAgICAgIGJSZXRWYWx1ZSA9IEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmV0VmFsdWUgPSBUUlVFOw0KKyAgaWYgKGxwUmVjZWl2ZXIgPT0gRlhKU0VfSU5WQUxJRF9QVFIpIHsNCisgICAgaFJldHVyblZhbHVlID0gaEZ1bmN0aW9uT2JqZWN0LT5DYWxsQXNDb25zdHJ1Y3RvcihuQXJnQ291bnQsIGxwTG9jYWxBcmdzKTsNCisgIH0gZWxzZSB7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhSZWNlaXZlcjsNCisgICAgaWYgKGxwUmVjZWl2ZXIpIHsNCisgICAgICBoUmVjZWl2ZXIgPQ0KKyAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwUmVjZWl2ZXItPkRpcmVjdEdldFZhbHVlKCkpOw0KICAgICB9DQotICAgIGlmKGxwUmV0VmFsdWUpIHsNCi0gICAgICAgIGxwUmV0VmFsdWUtPkZvcmNlU2V0VmFsdWUoaFJldHVyblZhbHVlKTsNCisgICAgaWYgKGhSZWNlaXZlci5Jc0VtcHR5KCkgfHwgIWhSZWNlaXZlci0+SXNPYmplY3QoKSkgew0KKyAgICAgIGhSZWNlaXZlciA9IHY4OjpPYmplY3Q6Ok5ldyhtX3BJc29sYXRlKTsNCiAgICAgfQ0KLSAgICBpZihscExvY2FsQXJncykgew0KLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5BcmdDb3VudDsgaSsrKSB7DQotICAgICAgICAgICAgbHBMb2NhbEFyZ3NbaV0ufkxvY2FsKCk7DQotICAgICAgICB9DQotICAgICAgICBGWF9GcmVlKGxwTG9jYWxBcmdzKTsNCisgICAgaFJldHVyblZhbHVlID0NCisgICAgICAgIGhGdW5jdGlvbk9iamVjdC0+Q2FsbEFzRnVuY3Rpb24oaFJlY2VpdmVyLCBuQXJnQ291bnQsIGxwTG9jYWxBcmdzKTsNCisgIH0NCisgIGlmICh0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KKyAgICBoUmV0dXJuVmFsdWUgPSBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZShtX3BJc29sYXRlLCB0cnljYXRjaCk7DQorICAgIGJSZXRWYWx1ZSA9IEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGxwUmV0VmFsdWUpIHsNCisgICAgbHBSZXRWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShoUmV0dXJuVmFsdWUpOw0KKyAgfQ0KKyAgaWYgKGxwTG9jYWxBcmdzKSB7DQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuQXJnQ291bnQ7IGkrKykgew0KKyAgICAgIGxwTG9jYWxBcmdzW2ldLn5Mb2NhbCgpOw0KICAgICB9DQotICAgIHJldHVybiBiUmV0VmFsdWU7DQorICAgIEZYX0ZyZWUobHBMb2NhbEFyZ3MpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXRWYWx1ZTsNCiB9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvdmFsdWUuaCBiL3hmYS9zcmMvZnhqc2Uvc3JjL3ZhbHVlLmgKaW5kZXggMGNlYmJkZi4uZWUxMDJiZCAxMDA2NDQKLS0tIGEveGZhL3NyYy9meGpzZS9zcmMvdmFsdWUuaAorKysgYi94ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5oCkBAIC03LDIzMCArNywyMzIgQEAKICNpZm5kZWYgRlhKU0VfVkFMVUVfSF8NCiAjZGVmaW5lIEZYSlNFX1ZBTFVFX0hfDQogI2luY2x1ZGUgInNjb3BlX2lubGluZS5oIg0KLWNsYXNzIENGWEpTRV9WYWx1ZQ0KLXsNCi1wdWJsaWM6DQotICAgIENGWEpTRV9WYWx1ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIDogbV9wSXNvbGF0ZShwSXNvbGF0ZSkge30NCi1wcm90ZWN0ZWQ6DQotICAgIENGWEpTRV9WYWx1ZSgpOw0KLSAgICBDRlhKU0VfVmFsdWUoY29uc3QgQ0ZYSlNFX1ZhbHVlJik7DQotICAgIENGWEpTRV9WYWx1ZSYgb3BlcmF0b3IgPSAoY29uc3QgQ0ZYSlNFX1ZhbHVlJik7DQotcHVibGljOg0KLSAgICBWOF9JTkxJTkUgRlhfQk9PTCBJc1VuZGVmaW5lZCgpCWNvbnN0DQotICAgIHsNCi0gICAgICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCi0gICAgICAgIHJldHVybiBoVmFsdWUtPklzVW5kZWZpbmVkKCk7DQorY2xhc3MgQ0ZYSlNFX1ZhbHVlIHsNCisgcHVibGljOg0KKyAgQ0ZYSlNFX1ZhbHVlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgOiBtX3BJc29sYXRlKHBJc29sYXRlKSB7fQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhKU0VfVmFsdWUoKTsNCisgIENGWEpTRV9WYWx1ZShjb25zdCBDRlhKU0VfVmFsdWUmKTsNCisgIENGWEpTRV9WYWx1ZSYgb3BlcmF0b3I9KGNvbnN0IENGWEpTRV9WYWx1ZSYpOw0KKw0KKyBwdWJsaWM6DQorICBWOF9JTkxJTkUgRlhfQk9PTCBJc1VuZGVmaW5lZCgpIGNvbnN0IHsNCisgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBWOF9JTkxJTkUgRlhfQk9PTCBJc051bGwoKQkJY29uc3QNCi0gICAgew0KLSAgICAgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIGhWYWx1ZS0+SXNOdWxsKCk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICByZXR1cm4gaFZhbHVlLT5Jc1VuZGVmaW5lZCgpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIEZYX0JPT0wgSXNOdWxsKCkgY29uc3Qgew0KKyAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIFY4X0lOTElORSBGWF9CT09MIElzQm9vbGVhbigpCWNvbnN0DQotICAgIHsNCi0gICAgICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCi0gICAgICAgIHJldHVybiBoVmFsdWUtPklzQm9vbGVhbigpOw0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgcmV0dXJuIGhWYWx1ZS0+SXNOdWxsKCk7DQorICB9DQorICBWOF9JTkxJTkUgRlhfQk9PTCBJc0Jvb2xlYW4oKSBjb25zdCB7DQorICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgVjhfSU5MSU5FIEZYX0JPT0wgSXNTdHJpbmcoKQljb25zdA0KLSAgICB7DQotICAgICAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQotICAgICAgICByZXR1cm4gaFZhbHVlLT5Jc1N0cmluZygpOw0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgcmV0dXJuIGhWYWx1ZS0+SXNCb29sZWFuKCk7DQorICB9DQorICBWOF9JTkxJTkUgRlhfQk9PTCBJc1N0cmluZygpIGNvbnN0IHsNCisgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBWOF9JTkxJTkUgRlhfQk9PTCBJc051bWJlcigpCWNvbnN0DQotICAgIHsNCi0gICAgICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCi0gICAgICAgIHJldHVybiBoVmFsdWUtPklzTnVtYmVyKCk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICByZXR1cm4gaFZhbHVlLT5Jc1N0cmluZygpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIEZYX0JPT0wgSXNOdW1iZXIoKSBjb25zdCB7DQorICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQogICAgIH0NCi0gICAgVjhfSU5MSU5FIEZYX0JPT0wgSXNJbnRlZ2VyKCkJY29uc3QNCi0gICAgew0KLSAgICAgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi0gICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIGhWYWx1ZS0+SXNJbnQzMigpOw0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgcmV0dXJuIGhWYWx1ZS0+SXNOdW1iZXIoKTsNCisgIH0NCisgIFY4X0lOTElORSBGWF9CT09MIElzSW50ZWdlcigpIGNvbnN0IHsNCisgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBWOF9JTkxJTkUgRlhfQk9PTCBJc09iamVjdCgpCWNvbnN0DQotICAgIHsNCi0gICAgICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCi0gICAgICAgIHJldHVybiBoVmFsdWUtPklzT2JqZWN0KCk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICByZXR1cm4gaFZhbHVlLT5Jc0ludDMyKCk7DQorICB9DQorICBWOF9JTkxJTkUgRlhfQk9PTCBJc09iamVjdCgpIGNvbnN0IHsNCisgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLSAgICBWOF9JTkxJTkUgRlhfQk9PTCBJc0FycmF5KCkJCWNvbnN0DQotICAgIHsNCi0gICAgICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCi0gICAgICAgIHJldHVybiBoVmFsdWUtPklzQXJyYXkoKTsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHJldHVybiBoVmFsdWUtPklzT2JqZWN0KCk7DQorICB9DQorICBWOF9JTkxJTkUgRlhfQk9PTCBJc0FycmF5KCkgY29uc3Qgew0KKyAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIFY4X0lOTElORSBGWF9CT09MIElzRnVuY3Rpb24oKQljb25zdA0KLSAgICB7DQotICAgICAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQotICAgICAgICByZXR1cm4gaFZhbHVlLT5Jc0Z1bmN0aW9uKCk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICByZXR1cm4gaFZhbHVlLT5Jc0FycmF5KCk7DQorICB9DQorICBWOF9JTkxJTkUgRlhfQk9PTCBJc0Z1bmN0aW9uKCkgY29uc3Qgew0KKyAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KICAgICB9DQotICAgIFY4X0lOTElORSBGWF9CT09MIElzRGF0ZSgpCQljb25zdA0KLSAgICB7DQotICAgICAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQotICAgICAgICByZXR1cm4gaFZhbHVlLT5Jc0RhdGUoKTsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHJldHVybiBoVmFsdWUtPklzRnVuY3Rpb24oKTsNCisgIH0NCisgIFY4X0lOTElORSBGWF9CT09MIElzRGF0ZSgpIGNvbnN0IHsNCisgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCiAgICAgfQ0KLXB1YmxpYzoNCi0gICAgVjhfSU5MSU5FIEZYX0JPT0wJCVRvQm9vbGVhbigpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIEFTU0VSVCghbV9oVmFsdWUuSXNFbXB0eSgpKTsNCi0gICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfQk9PTD4oaFZhbHVlLT5Cb29sZWFuVmFsdWUoKSk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICByZXR1cm4gaFZhbHVlLT5Jc0RhdGUoKTsNCisgIH0NCisNCisgcHVibGljOg0KKyAgVjhfSU5MSU5FIEZYX0JPT0wgVG9Cb29sZWFuKCkgY29uc3Qgew0KKyAgICBBU1NFUlQoIW1faFZhbHVlLklzRW1wdHkoKSk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxGWF9CT09MPihoVmFsdWUtPkJvb2xlYW5WYWx1ZSgpKTsNCisgIH0NCisgIFY4X0lOTElORSBGWF9GTE9BVCBUb0Zsb2F0KCkgY29uc3Qgew0KKyAgICBBU1NFUlQoIW1faFZhbHVlLklzRW1wdHkoKSk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oaFZhbHVlLT5OdW1iZXJWYWx1ZSgpKTsNCisgIH0NCisgIFY4X0lOTElORSBGWEpTRV9ET1VCTEUgVG9Eb3VibGUoKSBjb25zdCB7DQorICAgIEFTU0VSVCghbV9oVmFsdWUuSXNFbXB0eSgpKTsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZYSlNFX0RPVUJMRT4oaFZhbHVlLT5OdW1iZXJWYWx1ZSgpKTsNCisgIH0NCisgIFY4X0lOTElORSBpbnQzMl90IFRvSW50ZWdlcigpIGNvbnN0IHsNCisgICAgQVNTRVJUKCFtX2hWYWx1ZS5Jc0VtcHR5KCkpOw0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaFZhbHVlLT5OdW1iZXJWYWx1ZSgpKTsNCisgIH0NCisgIFY4X0lOTElORSB2b2lkIFRvU3RyaW5nKENGWF9CeXRlU3RyaW5nJiBzelN0ck91dHB1dCkgY29uc3Qgew0KKyAgICBBU1NFUlQoIW1faFZhbHVlLklzRW1wdHkoKSk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoU3RyaW5nID0gaFZhbHVlLT5Ub1N0cmluZygpOw0KKyAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgaFN0cmluZ1ZhbChoU3RyaW5nKTsNCisgICAgc3pTdHJPdXRwdXQgPSAqaFN0cmluZ1ZhbDsNCisgIH0NCisgIHZvaWQqIFRvT2JqZWN0KENGWEpTRV9DbGFzcyogbHBDbGFzcykgY29uc3Q7DQorDQorIHB1YmxpYzoNCisgIFY4X0lOTElORSB2b2lkIFNldFVuZGVmaW5lZCgpIHsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6VW5kZWZpbmVkKG1fcElzb2xhdGUpOw0KKyAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIHZvaWQgU2V0TnVsbCgpIHsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TnVsbChtX3BJc29sYXRlKTsNCisgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgIH0NCisgIFY4X0lOTElORSB2b2lkIFNldEJvb2xlYW4oRlhfQk9PTCBiQm9vbGVhbikgew0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgICB2ODo6Qm9vbGVhbjo6TmV3KG1fcElzb2xhdGUsIGJCb29sZWFuICE9IEZBTFNFKTsNCisgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgIH0NCisgIFY4X0lOTElORSB2b2lkIFNldEludGVnZXIoaW50MzJfdCBuSW50ZWdlcikgew0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpJbnRlZ2VyOjpOZXcobV9wSXNvbGF0ZSwgbkludGVnZXIpOw0KKyAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIHZvaWQgU2V0RG91YmxlKEZYSlNFX0RPVUJMRSBkRG91YmxlKSB7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6Ok51bWJlcjo6TmV3KG1fcElzb2xhdGUsIGREb3VibGUpOw0KKyAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIHZvaWQgU2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pTdHJpbmcpIHsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOCgNCisgICAgICAgIG1fcElzb2xhdGUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHN6U3RyaW5nLkdldFB0cigpKSwNCisgICAgICAgIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsIHN6U3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgIH0NCisgIFY4X0lOTElORSB2b2lkIFNldEZsb2F0KEZYX0ZMT0FUIGZGbG9hdCk7DQorICBWOF9JTkxJTkUgdm9pZCBTZXRKU09iamVjdCgpIHsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpPYmplY3Q6Ok5ldyhtX3BJc29sYXRlKTsNCisgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgIH0NCisgIHZvaWQgU2V0SG9zdE9iamVjdCh2b2lkKiBscE9iamVjdCwgQ0ZYSlNFX0NsYXNzKiBscENsYXNzKTsNCisgIHZvaWQgU2V0QXJyYXkodWludDMyX3QgdVZhbHVlQ291bnQsIENGWEpTRV9WYWx1ZSoqIHJnVmFsdWVzKTsNCisgIHZvaWQgU2V0RGF0ZShGWEpTRV9ET1VCTEUgZERvdWJsZSk7DQorDQorIHB1YmxpYzoNCisgIEZYX0JPT0wgR2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKTsNCisgIEZYX0JPT0wgU2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKTsNCisgIEZYX0JPT0wgR2V0T2JqZWN0UHJvcGVydHkodWludDMyX3QgdVByb3BJZHgsIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpOw0KKyAgRlhfQk9PTCBTZXRPYmplY3RQcm9wZXJ0eSh1aW50MzJfdCB1UHJvcElkeCwgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSk7DQorICBGWF9CT09MIERlbGV0ZU9iamVjdFByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSk7DQorICBGWF9CT09MIEhhc09iamVjdE93blByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlVHlwZUdldHRlcik7DQorICBGWF9CT09MIFNldE9iamVjdE93blByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSk7DQorICBGWF9CT09MIFNldEZ1bmN0aW9uQmluZChDRlhKU0VfVmFsdWUqIGxwT2xkRnVuY3Rpb24sIENGWEpTRV9WYWx1ZSogbHBOZXdUaGlzKTsNCisgIEZYX0JPT0wgQ2FsbChDRlhKU0VfVmFsdWUqIGxwUmVjZWl2ZXIsDQorICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgIHVpbnQzMl90IG5BcmdDb3VudCwNCisgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUqIGxwQXJncyk7DQorDQorIHB1YmxpYzoNCisgIFY4X0lOTElORSB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcElzb2xhdGU7IH0NCisgIFY4X0lOTElORSBjb25zdCB2ODo6R2xvYmFsPHY4OjpWYWx1ZT4mIERpcmVjdEdldFZhbHVlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9oVmFsdWU7DQorICB9DQorICBWOF9JTkxJTkUgdm9pZCBGb3JjZVNldFZhbHVlKHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSkgew0KKyAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIHZvaWQgQXNzaWduKGNvbnN0IENGWEpTRV9WYWx1ZSogbHBWYWx1ZSkgew0KKyAgICBpZiAobHBWYWx1ZSkgew0KKyAgICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGxwVmFsdWUtPm1faFZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX2hWYWx1ZS5SZXNldCgpOw0KICAgICB9DQotICAgIFY4X0lOTElORSBGWF9GTE9BVAkJVG9GbG9hdCgpCWNvbnN0DQotICAgIHsNCi0gICAgICAgIEFTU0VSVCghbV9oVmFsdWUuSXNFbXB0eSgpKTsNCi0gICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGhWYWx1ZS0+TnVtYmVyVmFsdWUoKSk7DQotICAgIH0NCi0gICAgVjhfSU5MSU5FIEZYSlNFX0RPVUJMRQlUb0RvdWJsZSgpCWNvbnN0DQotICAgIHsNCi0gICAgICAgIEFTU0VSVCghbV9oVmFsdWUuSXNFbXB0eSgpKTsNCi0gICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhKU0VfRE9VQkxFPihoVmFsdWUtPk51bWJlclZhbHVlKCkpOw0KLSAgICB9DQotICAgIFY4X0lOTElORSBpbnQzMl90CQlUb0ludGVnZXIoKQljb25zdA0KLSAgICB7DQotICAgICAgICBBU1NFUlQoIW1faFZhbHVlLklzRW1wdHkoKSk7DQotICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KGhWYWx1ZS0+TnVtYmVyVmFsdWUoKSk7DQotICAgIH0NCi0gICAgVjhfSU5MSU5FIHZvaWQJCQlUb1N0cmluZyhDRlhfQnl0ZVN0cmluZyYgc3pTdHJPdXRwdXQpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIEFTU0VSVCghbV9oVmFsdWUuSXNFbXB0eSgpKTsNCi0gICAgICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQotICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFN0cmluZyA9IGhWYWx1ZS0+VG9TdHJpbmcoKTsNCi0gICAgICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBoU3RyaW5nVmFsKGhTdHJpbmcpOw0KLSAgICAgICAgc3pTdHJPdXRwdXQgPSAqaFN0cmluZ1ZhbDsNCi0gICAgfQ0KLSAgICB2b2lkKgkJCQlUb09iamVjdChDRlhKU0VfQ2xhc3MqICAgbHBDbGFzcykgY29uc3Q7DQotcHVibGljOg0KLSAgICBWOF9JTkxJTkUgdm9pZCBTZXRVbmRlZmluZWQoKQ0KLSAgICB7DQotICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6VW5kZWZpbmVkKG1fcElzb2xhdGUpOw0KLSAgICAgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCi0gICAgfQ0KLSAgICBWOF9JTkxJTkUgdm9pZCBTZXROdWxsKCkNCi0gICAgew0KLSAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6Ok51bGwobV9wSXNvbGF0ZSk7DQotICAgICAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KLSAgICB9DQotICAgIFY4X0lOTElORSB2b2lkIFNldEJvb2xlYW4oRlhfQk9PTCBiQm9vbGVhbikNCi0gICAgew0KLSAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkJvb2xlYW46Ok5ldyhtX3BJc29sYXRlLCBiQm9vbGVhbiAhPSBGQUxTRSk7DQotICAgICAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KLSAgICB9DQotICAgIFY4X0lOTElORSB2b2lkIFNldEludGVnZXIoaW50MzJfdCBuSW50ZWdlcikNCi0gICAgew0KLSAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OkludGVnZXI6Ok5ldyhtX3BJc29sYXRlLCBuSW50ZWdlcik7DQotICAgICAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KLSAgICB9DQotICAgIFY4X0lOTElORSB2b2lkIFNldERvdWJsZShGWEpTRV9ET1VCTEUgZERvdWJsZSkNCi0gICAgew0KLSAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6Ok51bWJlcjo6TmV3KG1fcElzb2xhdGUsIGREb3VibGUpOw0KLSAgICAgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCi0gICAgfQ0KLSAgICBWOF9JTkxJTkUgdm9pZCBTZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelN0cmluZykNCi0gICAgew0KLSAgICAgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgobV9wSXNvbGF0ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHN6U3RyaW5nLkdldFB0cigpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsIHN6U3RyaW5nLkdldExlbmd0aCgpKTsNCi0gICAgICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhWYWx1ZSk7DQotICAgIH0NCi0gICAgVjhfSU5MSU5FIHZvaWQgU2V0RmxvYXQoRlhfRkxPQVQgZkZsb2F0KTsNCi0gICAgVjhfSU5MSU5FIHZvaWQgU2V0SlNPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpPYmplY3Q6Ok5ldyhtX3BJc29sYXRlKTsNCi0gICAgICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhWYWx1ZSk7DQotICAgIH0NCi0gICAgdm9pZCBTZXRIb3N0T2JqZWN0KHZvaWQqIGxwT2JqZWN0LCBDRlhKU0VfQ2xhc3MqIGxwQ2xhc3MpOw0KLSAgICB2b2lkIFNldEFycmF5KHVpbnQzMl90IHVWYWx1ZUNvdW50LCBDRlhKU0VfVmFsdWUqKiByZ1ZhbHVlcyk7DQotICAgIHZvaWQgU2V0RGF0ZShGWEpTRV9ET1VCTEUgZERvdWJsZSk7DQotcHVibGljOg0KLSAgICBGWF9CT09MIEdldE9iamVjdFByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYJc3pQcm9wTmFtZSwJQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSk7DQotICAgIEZYX0JPT0wgU2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJglzelByb3BOYW1lLAlDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKTsNCi0gICAgRlhfQk9PTCBHZXRPYmplY3RQcm9wZXJ0eSh1aW50MzJfdAl1UHJvcElkeCwJQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSk7DQotICAgIEZYX0JPT0wgU2V0T2JqZWN0UHJvcGVydHkodWludDMyX3QJdVByb3BJZHgsCUNGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpOw0KLSAgICBGWF9CT09MIERlbGV0ZU9iamVjdFByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSk7DQotICAgIEZYX0JPT0wgSGFzT2JqZWN0T3duUHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiAgIHN6UHJvcE5hbWUsIEZYX0JPT0wJYlVzZVR5cGVHZXR0ZXIpOw0KLSAgICBGWF9CT09MIFNldE9iamVjdE93blByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgICBzelByb3BOYW1lLCBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKTsNCi0gICAgRlhfQk9PTAlTZXRGdW5jdGlvbkJpbmQoQ0ZYSlNFX1ZhbHVlKiBscE9sZEZ1bmN0aW9uLCBDRlhKU0VfVmFsdWUqIGxwTmV3VGhpcyk7DQotICAgIEZYX0JPT0wgQ2FsbChDRlhKU0VfVmFsdWUqIGxwUmVjZWl2ZXIsIENGWEpTRV9WYWx1ZSogbHBSZXRWYWx1ZSwgdWludDMyX3QgbkFyZ0NvdW50LCBGWEpTRV9IVkFMVUUqIGxwQXJncyk7DQotcHVibGljOg0KLSAgICBWOF9JTkxJTkUgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoKQljb25zdA0KLSAgICB7DQotICAgICAgICByZXR1cm4gbV9wSXNvbGF0ZTsNCi0gICAgfQ0KLSAgICBWOF9JTkxJTkUgY29uc3Qgdjg6Okdsb2JhbDx2ODo6VmFsdWU+JiBEaXJlY3RHZXRWYWx1ZSgpIGNvbnN0DQotICAgIHsNCi0gICAgICAgIHJldHVybiBtX2hWYWx1ZTsNCi0gICAgfQ0KLSAgICBWOF9JTkxJTkUgdm9pZCBGb3JjZVNldFZhbHVlKHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSkNCi0gICAgew0KLSAgICAgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCi0gICAgfQ0KLSAgICBWOF9JTkxJTkUgdm9pZCBBc3NpZ24oY29uc3QgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpZihscFZhbHVlKSB7DQotICAgICAgICAgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgbHBWYWx1ZS0+bV9oVmFsdWUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBtX2hWYWx1ZS5SZXNldCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotcHVibGljOg0KLSAgICBzdGF0aWMgQ0ZYSlNFX1ZhbHVlKiBDcmVhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsNCi1wcm90ZWN0ZWQ6DQotICAgIHY4OjpJc29sYXRlKgkJCQltX3BJc29sYXRlOw0KLSAgICB2ODo6R2xvYmFsPHY4OjpWYWx1ZT4JbV9oVmFsdWU7DQotICAgIGZyaWVuZCBjbGFzcyBDRlhKU0VfQ29udGV4dDsNCi0gICAgZnJpZW5kIGNsYXNzIENGWEpTRV9DbGFzczsNCisgIH0NCisNCisgcHVibGljOg0KKyAgc3RhdGljIENGWEpTRV9WYWx1ZSogQ3JlYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7DQorDQorIHByb3RlY3RlZDoNCisgIHY4OjpJc29sYXRlKiBtX3BJc29sYXRlOw0KKyAgdjg6Okdsb2JhbDx2ODo6VmFsdWU+IG1faFZhbHVlOw0KKyAgZnJpZW5kIGNsYXNzIENGWEpTRV9Db250ZXh0Ow0KKyAgZnJpZW5kIGNsYXNzIENGWEpTRV9DbGFzczsNCiB9Ow0KICNlbmRpZg0K